ZGlmZiAtLWdpdCBhL2NhbWVyYS9DYW1lcmFNZXRhZGF0YS5jcHAgYi9jYW1lcmEvQ2FtZXJhTWV0YWRhdGEuY3BwCmluZGV4IGUxNDNlMDUuLjkyZmU4NGIgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9DYW1lcmFNZXRhZGF0YS5jcHAKKysrIGIvY2FtZXJhL0NhbWVyYU1ldGFkYXRhLmNwcApAQCAtMjIsNyArMjIsNiBAQAogCiAjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgogI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmFNZXRhZGF0YS5oPgotI2luY2x1ZGUgPGNhbWVyYS9WZW5kb3JUYWdEZXNjcmlwdG9yLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtNDA5LDYgKzQwOCw3OSBAQAogICAgIHJldHVybiByZXM7CiB9CiAKK3N0YXR1c190IENhbWVyYU1ldGFkYXRhOjpyZW1vdmVQZXJtaXNzaW9uRW50cmllcyhtZXRhZGF0YV92ZW5kb3JfaWRfdCB2ZW5kb3JJZCwKKyAgICAgICAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gKnRhZ3NSZW1vdmVkKSB7CisgICAgdWludDMyX3QgdGFnQ291bnQgPSAwOworICAgIHN0ZDo6dmVjdG9yPHVpbnQzMl90PiB0YWdzVG9SZW1vdmU7CisKKyAgICBpZiAodGFnc1JlbW92ZWQgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHNwPFZlbmRvclRhZ0Rlc2NyaXB0b3I+IHZUYWdzID0gVmVuZG9yVGFnRGVzY3JpcHRvcjo6Z2V0R2xvYmFsVmVuZG9yVGFnRGVzY3JpcHRvcigpOworICAgIGlmICgobnVsbHB0ciA9PSB2VGFncy5nZXQoKSkgfHwgKDAgPj0gdlRhZ3MtPmdldFRhZ0NvdW50KCkpKSB7CisgICAgICAgIHNwPFZlbmRvclRhZ0Rlc2NyaXB0b3JDYWNoZT4gY2FjaGUgPQorICAgICAgICAgICAgVmVuZG9yVGFnRGVzY3JpcHRvckNhY2hlOjpnZXRHbG9iYWxWZW5kb3JUYWdDYWNoZSgpOworICAgICAgICBpZiAoY2FjaGUuZ2V0KCkpIHsKKyAgICAgICAgICAgIGNhY2hlLT5nZXRWZW5kb3JUYWdEZXNjcmlwdG9yKHZlbmRvcklkLCAmdlRhZ3MpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChudWxscHRyICE9IHZUYWdzLmdldCgpKSAmJiAodlRhZ3MtPmdldFRhZ0NvdW50KCkgPiAwKSkgeworICAgICAgICB0YWdDb3VudCA9IHZUYWdzLT5nZXRUYWdDb3VudCgpOworICAgICAgICB1aW50MzJfdCAqdmVuZG9yVGFncyA9IG5ldyB1aW50MzJfdFt0YWdDb3VudF07CisgICAgICAgIGlmIChudWxscHRyID09IHZlbmRvclRhZ3MpIHsKKyAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgICAgIH0KKyAgICAgICAgdlRhZ3MtPmdldFRhZ0FycmF5KHZlbmRvclRhZ3MpOworCisgICAgICAgIHRhZ3NUb1JlbW92ZS5yZXNlcnZlKHRhZ0NvdW50KTsKKyAgICAgICAgdGFnc1RvUmVtb3ZlLmluc2VydCh0YWdzVG9SZW1vdmUuYmVnaW4oKSwgdmVuZG9yVGFncywgdmVuZG9yVGFncyArIHRhZ0NvdW50KTsKKworICAgICAgICBkZWxldGUgW10gdmVuZG9yVGFnczsKKyAgICAgICAgdGFnQ291bnQgPSAwOworICAgIH0KKworICAgIGF1dG8gdGFnc05lZWRpbmdQZXJtaXNzaW9uID0gZ2V0X2NhbWVyYV9tZXRhZGF0YV9wZXJtaXNzaW9uX25lZWRlZCgmdGFnQ291bnQpOworICAgIGlmICh0YWdDb3VudCA+IDApIHsKKyAgICAgICAgdGFnc1RvUmVtb3ZlLnJlc2VydmUodGFnc1RvUmVtb3ZlLmNhcGFjaXR5KCkgKyB0YWdDb3VudCk7CisgICAgICAgIHRhZ3NUb1JlbW92ZS5pbnNlcnQodGFnc1RvUmVtb3ZlLmVuZCgpLCB0YWdzTmVlZGluZ1Blcm1pc3Npb24sCisgICAgICAgICAgICAgICAgdGFnc05lZWRpbmdQZXJtaXNzaW9uICsgdGFnQ291bnQpOworICAgIH0KKworICAgIHRhZ3NSZW1vdmVkLT5yZXNlcnZlKHRhZ3NUb1JlbW92ZS5zaXplKCkpOworICAgIGZvciAoY29uc3QgYXV0byAmaXQgOiB0YWdzVG9SZW1vdmUpIHsKKyAgICAgICAgaWYgKGV4aXN0cyhpdCkpIHsKKyAgICAgICAgICAgIGF1dG8gcmMgPSBlcmFzZShpdCk7CisgICAgICAgICAgICBpZiAoTk9fRVJST1IgIT0gcmMpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBlcmFzZSB0YWc6ICV4IiwgX19mdW5jX18sIGl0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0YWdzUmVtb3ZlZC0+cHVzaF9iYWNrKGl0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFVwZGF0ZSB0aGUgYXZhaWxhYmxlIGNoYXJhY3RlcnN0aWNzIGFjY29yZGluZ2x5CisgICAgaWYgKGV4aXN0cyhBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NIQVJBQ1RFUklTVElDU19LRVlTKSkgeworICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4gY3VycmVudEtleXM7CisKKyAgICAgICAgc3RkOjpzb3J0KHRhZ3NSZW1vdmVkLT5iZWdpbigpLCB0YWdzUmVtb3ZlZC0+ZW5kKCkpOworICAgICAgICBhdXRvIGtleXMgPSBmaW5kKEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0hBUkFDVEVSSVNUSUNTX0tFWVMpOworICAgICAgICBjdXJyZW50S2V5cy5yZXNlcnZlKGtleXMuY291bnQpOworICAgICAgICBjdXJyZW50S2V5cy5pbnNlcnQoY3VycmVudEtleXMuZW5kKCksIGtleXMuZGF0YS5pMzIsIGtleXMuZGF0YS5pMzIgKyBrZXlzLmNvdW50KTsKKyAgICAgICAgc3RkOjpzb3J0KGN1cnJlbnRLZXlzLmJlZ2luKCksIGN1cnJlbnRLZXlzLmVuZCgpKTsKKworICAgICAgICBzdGQ6OnZlY3RvcjxpbnQzMl90PiBuZXdLZXlzKGtleXMuY291bnQpOworICAgICAgICBhdXRvIGVuZCA9IHN0ZDo6c2V0X2RpZmZlcmVuY2UoY3VycmVudEtleXMuYmVnaW4oKSwgY3VycmVudEtleXMuZW5kKCksIHRhZ3NSZW1vdmVkLT5iZWdpbigpLAorICAgICAgICAgICAgICAgIHRhZ3NSZW1vdmVkLT5lbmQoKSwgbmV3S2V5cy5iZWdpbigpKTsKKyAgICAgICAgbmV3S2V5cy5yZXNpemUoZW5kIC0gbmV3S2V5cy5iZWdpbigpKTsKKworICAgICAgICB1cGRhdGUoQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DSEFSQUNURVJJU1RJQ1NfS0VZUywgbmV3S2V5cy5kYXRhKCksIG5ld0tleXMuc2l6ZSgpKTsKKyAgICB9CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKIHZvaWQgQ2FtZXJhTWV0YWRhdGE6OmR1bXAoaW50IGZkLCBpbnQgdmVyYm9zaXR5LCBpbnQgaW5kZW50YXRpb24pIGNvbnN0IHsKICAgICBkdW1wX2luZGVudGVkX2NhbWVyYV9tZXRhZGF0YShtQnVmZmVyLCBmZCwgdmVyYm9zaXR5LCBpbmRlbnRhdGlvbik7CiB9CmRpZmYgLS1naXQgYS9jYW1lcmEvVmVuZG9yVGFnRGVzY3JpcHRvci5jcHAgYi9jYW1lcmEvVmVuZG9yVGFnRGVzY3JpcHRvci5jcHAKaW5kZXggYTg2Y2M4Ny4uMzhmZjM3ZiAxMDA2NDQKLS0tIGEvY2FtZXJhL1ZlbmRvclRhZ0Rlc2NyaXB0b3IuY3BwCisrKyBiL2NhbWVyYS9WZW5kb3JUYWdEZXNjcmlwdG9yLmNwcApAQCAtMzE1LDYgKzMxNSwxMCBAQAogICAgIHJldHVybiBPSzsKIH0KIAorc3NpemVfdCBWZW5kb3JUYWdEZXNjcmlwdG9yOjpnZXRTZWN0aW9uSW5kZXgodWludDMyX3QgdGFnKSBjb25zdCB7CisgICAgcmV0dXJuIG1UYWdUb1NlY3Rpb25NYXAudmFsdWVGb3IodGFnKTsKK30KKwogdm9pZCBWZW5kb3JUYWdEZXNjcmlwdG9yOjpkdW1wKGludCBmZCwgaW50IHZlcmJvc2l0eSwgaW50IGluZGVudGF0aW9uKSBjb25zdCB7CiAKICAgICBzaXplX3Qgc2l6ZSA9IG1UYWdUb05hbWVNYXAuc2l6ZSgpOwpkaWZmIC0tZ2l0IGEvY2FtZXJhL2FpZGwvYW5kcm9pZC9oYXJkd2FyZS9JQ2FtZXJhU2VydmljZS5haWRsIGIvY2FtZXJhL2FpZGwvYW5kcm9pZC9oYXJkd2FyZS9JQ2FtZXJhU2VydmljZS5haWRsCmluZGV4IDljMGYyOGIuLmMwMzgzMTQgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9haWRsL2FuZHJvaWQvaGFyZHdhcmUvSUNhbWVyYVNlcnZpY2UuYWlkbAorKysgYi9jYW1lcmEvYWlkbC9hbmRyb2lkL2hhcmR3YXJlL0lDYW1lcmFTZXJ2aWNlLmFpZGwKQEAgLTE0OSw4ICsxNDksMTAgQEAKICAgICBjb25zdCBpbnQgQVBJX1ZFUlNJT05fMSA9IDE7CiAgICAgY29uc3QgaW50IEFQSV9WRVJTSU9OXzIgPSAyOwogCi0gICAgLy8gRGV0ZXJtaW5lcyBpZiBhIHBhcnRpY3VsYXIgQVBJIHZlcnNpb24gaXMgc3VwcG9ydGVkIGRpcmVjdGx5CisgICAgLy8gRGV0ZXJtaW5lcyBpZiBhIHBhcnRpY3VsYXIgQVBJIHZlcnNpb24gaXMgc3VwcG9ydGVkIGRpcmVjdGx5IGZvciBhIGNhbWVyYUlkLgogICAgIGJvb2xlYW4gc3VwcG9ydHNDYW1lcmFBcGkoU3RyaW5nIGNhbWVyYUlkLCBpbnQgYXBpVmVyc2lvbik7CisgICAgLy8gRGV0ZXJtaW5lcyBpZiBhIGNhbWVyYUlkIGlzIGEgaGlkZGVuIHBoeXNpY2FsIGNhbWVyYSBvZiBhIGxvZ2ljYWwgbXVsdGktY2FtZXJhLgorICAgIGJvb2xlYW4gaXNIaWRkZW5QaHlzaWNhbENhbWVyYShTdHJpbmcgY2FtZXJhSWQpOwogCiAgICAgdm9pZCBzZXRUb3JjaE1vZGUoU3RyaW5nIGNhbWVyYUlkLCBib29sZWFuIGVuYWJsZWQsIElCaW5kZXIgY2xpZW50QmluZGVyKTsKIApkaWZmIC0tZ2l0IGEvY2FtZXJhL2NhbWVyYTIvT3V0cHV0Q29uZmlndXJhdGlvbi5jcHAgYi9jYW1lcmEvY2FtZXJhMi9PdXRwdXRDb25maWd1cmF0aW9uLmNwcAppbmRleCBmZWIwNGMyLi4zMjFlYjA4IDEwMDY0NAotLS0gYS9jYW1lcmEvY2FtZXJhMi9PdXRwdXRDb25maWd1cmF0aW9uLmNwcAorKysgYi9jYW1lcmEvY2FtZXJhMi9PdXRwdXRDb25maWd1cmF0aW9uLmNwcApAQCAtMTc1LDYgKzE3NSwxMiBAQAogICAgIG1Jc1NoYXJlZCA9IGlzU2hhcmVkOwogfQogCitPdXRwdXRDb25maWd1cmF0aW9uOjpPdXRwdXRDb25maWd1cmF0aW9uKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPj4mIGdicHMsCisgICAgaW50IHJvdGF0aW9uLCBpbnQgc3VyZmFjZVNldElELCAgaW50IHN1cmZhY2VUeXBlLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGJvb2wgaXNTaGFyZWQpCisgIDogbUdicHMoZ2JwcyksIG1Sb3RhdGlvbihyb3RhdGlvbiksIG1TdXJmYWNlU2V0SUQoc3VyZmFjZVNldElEKSwgbVN1cmZhY2VUeXBlKHN1cmZhY2VUeXBlKSwKKyAgICBtV2lkdGgod2lkdGgpLCBtSGVpZ2h0KGhlaWdodCksIG1Jc0RlZmVycmVkKGZhbHNlKSwgbUlzU2hhcmVkKGlzU2hhcmVkKSB7IH0KKwogc3RhdHVzX3QgT3V0cHV0Q29uZmlndXJhdGlvbjo6d3JpdGVUb1BhcmNlbChhbmRyb2lkOjpQYXJjZWwqIHBhcmNlbCkgY29uc3QgewogCiAgICAgaWYgKHBhcmNlbCA9PSBudWxscHRyKSByZXR1cm4gQkFEX1ZBTFVFOwpkaWZmIC0tZ2l0IGEvY2FtZXJhL2NhbWVyYXNlcnZlci9BbmRyb2lkLmJwIGIvY2FtZXJhL2NhbWVyYXNlcnZlci9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmNjkzMGMKLS0tIC9kZXYvbnVsbAorKysgYi9jYW1lcmEvY2FtZXJhc2VydmVyL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw0NiBAQAorLy8gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworY2NfYmluYXJ5IHsKKyAgICBuYW1lOiAiY2FtZXJhc2VydmVyIiwKKworICAgIHNyY3M6IFsibWFpbl9jYW1lcmFzZXJ2ZXIuY3BwIl0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliY2FtZXJhc2VydmljZSIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAibGlidWkiLAorICAgICAgICAibGliZ3VpIiwKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJoaWRsdHJhbnNwb3J0IiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmNvbW1vbkAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEucHJvdmlkZXJAMi40IiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmRldmljZUAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZGV2aWNlQDMuMiIsCisgICAgXSwKKyAgICBjb21waWxlX211bHRpbGliOiAiMzIiLAorICAgIGNmbGFnczogWworICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdleHRyYSIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1Xbm8tdW51c2VkLXBhcmFtZXRlciIsCisgICAgXSwKKworICAgIGluaXRfcmM6IFsiY2FtZXJhc2VydmVyLnJjIl0sCisKKyAgICB2aW50Zl9mcmFnbWVudHM6IFsKKyAgICAgICAgIm1hbmlmZXN0X2FuZHJvaWQuZnJhbWV3b3Jrcy5jYW1lcmFzZXJ2aWNlLnNlcnZpY2VAMi4wLnhtbCIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL2NhbWVyYS9jYW1lcmFzZXJ2ZXIvQW5kcm9pZC5tayBiL2NhbWVyYS9jYW1lcmFzZXJ2ZXIvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjhjOTRlNi4uMDAwMDAwMAotLS0gYS9jYW1lcmEvY2FtZXJhc2VydmVyL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0jIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfU1JDX0ZJTEVTOj0gXAotCW1haW5fY2FtZXJhc2VydmVyLmNwcAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLQlsaWJjYW1lcmFzZXJ2aWNlIFwKLQlsaWJsb2cgXAotCWxpYnV0aWxzIFwKLQlsaWJ1aSBcCi0JbGliZ3VpIFwKLQlsaWJiaW5kZXIgXAotCWxpYmhpZGx0cmFuc3BvcnQgXAotCWFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmNvbW1vbkAxLjAgXAotCWFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLnByb3ZpZGVyQDIuNCBcCi0JYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZGV2aWNlQDEuMCBcCi0JYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZGV2aWNlQDMuMgotCi1MT0NBTF9NT0RVTEU6PSBjYW1lcmFzZXJ2ZXIKLUxPQ0FMXzMyX0JJVF9PTkxZIDo9IHRydWUKLQotTE9DQUxfQ0ZMQUdTICs9IC1XYWxsIC1XZXh0cmEgLVdlcnJvciAtV25vLXVudXNlZC1wYXJhbWV0ZXIKLQotTE9DQUxfSU5JVF9SQyA6PSBjYW1lcmFzZXJ2ZXIucmMKLQotaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCmRpZmYgLS1naXQgYS9jYW1lcmEvY2FtZXJhc2VydmVyL21haW5fY2FtZXJhc2VydmVyLmNwcCBiL2NhbWVyYS9jYW1lcmFzZXJ2ZXIvbWFpbl9jYW1lcmFzZXJ2ZXIuY3BwCmluZGV4IDM5NzI0MzYuLjUzYjNkODQgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9jYW1lcmFzZXJ2ZXIvbWFpbl9jYW1lcmFzZXJ2ZXIuY3BwCisrKyBiL2NhbWVyYS9jYW1lcmFzZXJ2ZXIvbWFpbl9jYW1lcmFzZXJ2ZXIuY3BwCkBAIC0yNiw4ICsyNiw5IEBACiB7CiAgICAgc2lnbmFsKFNJR1BJUEUsIFNJR19JR04pOwogCi0gICAgLy8gU2V0IDMgdGhyZWFkcyBmb3IgSElETCBjYWxscwotICAgIGhhcmR3YXJlOjpjb25maWd1cmVScGNUaHJlYWRwb29sKDMsIC8qd2lsbGpvaW4qLyBmYWxzZSk7CisgICAgLy8gU2V0IDUgdGhyZWFkcyBmb3IgSElETCBjYWxscy4gTm93IGNhbWVyYXNlcnZlciB3aWxsIHNlcnZlIEhJREwgY2FsbHMgaW4KKyAgICAvLyBhZGRpdGlvbiB0byBjb25zdW1pbmcgdGhlbSBmcm9tIHRoZSBDYW1lcmEgSEFMIGFzIHdlbGwuCisgICAgaGFyZHdhcmU6OmNvbmZpZ3VyZVJwY1RocmVhZHBvb2woNSwgLyp3aWxsam9pbiovIGZhbHNlKTsKIAogICAgIHNwPFByb2Nlc3NTdGF0ZT4gcHJvYyhQcm9jZXNzU3RhdGU6OnNlbGYoKSk7CiAgICAgc3A8SVNlcnZpY2VNYW5hZ2VyPiBzbSA9IGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpOwpkaWZmIC0tZ2l0IGEvY2FtZXJhL2NhbWVyYXNlcnZlci9tYW5pZmVzdF9hbmRyb2lkLmZyYW1ld29ya3MuY2FtZXJhc2VydmljZS5zZXJ2aWNlQDIuMC54bWwgYi9jYW1lcmEvY2FtZXJhc2VydmVyL21hbmlmZXN0X2FuZHJvaWQuZnJhbWV3b3Jrcy5jYW1lcmFzZXJ2aWNlLnNlcnZpY2VAMi4wLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDFjNzE3Ci0tLSAvZGV2L251bGwKKysrIGIvY2FtZXJhL2NhbWVyYXNlcnZlci9tYW5pZmVzdF9hbmRyb2lkLmZyYW1ld29ya3MuY2FtZXJhc2VydmljZS5zZXJ2aWNlQDIuMC54bWwKQEAgLTAsMCArMSwxMSBAQAorPG1hbmlmZXN0IHZlcnNpb249IjEuMCIgdHlwZT0iZnJhbWV3b3JrIj4KKyAgICA8aGFsPgorICAgICAgICA8bmFtZT5hbmRyb2lkLmZyYW1ld29ya3MuY2FtZXJhc2VydmljZS5zZXJ2aWNlPC9uYW1lPgorICAgICAgICA8dHJhbnNwb3J0Pmh3YmluZGVyPC90cmFuc3BvcnQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMDwvdmVyc2lvbj4KKyAgICAgICAgPGludGVyZmFjZT4KKyAgICAgICAgICAgIDxuYW1lPklDYW1lcmFTZXJ2aWNlPC9uYW1lPgorICAgICAgICAgICAgPGluc3RhbmNlPmRlZmF1bHQ8L2luc3RhbmNlPgorICAgICAgICA8L2ludGVyZmFjZT4KKyAgICA8L2hhbD4KKzwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9jYW1lcmEvaW5jbHVkZS9jYW1lcmEvQ2FtZXJhTWV0YWRhdGEuaCBiL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9DYW1lcmFNZXRhZGF0YS5oCmluZGV4IGQyODQ0NzcuLjg0NGJiODAgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9DYW1lcmFNZXRhZGF0YS5oCisrKyBiL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9DYW1lcmFNZXRhZGF0YS5oCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgogI2luY2x1ZGUgPGJpbmRlci9QYXJjZWxhYmxlLmg+CisjaW5jbHVkZSA8Y2FtZXJhL1ZlbmRvclRhZ0Rlc2NyaXB0b3IuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC0xNzAsNiArMTcxLDEyIEBACiAgICAgc3RhdHVzX3QgZXJhc2UodWludDMyX3QgdGFnKTsKIAogICAgIC8qKgorICAgICAqIFJlbW92ZSBtZXRhZGF0YSBlbnRyaWVzIHRoYXQgbmVlZCBhZGRpdGlvbmFsIHBlcm1pc3Npb25zLgorICAgICAqLworICAgIHN0YXR1c190IHJlbW92ZVBlcm1pc3Npb25FbnRyaWVzKG1ldGFkYXRhX3ZlbmRvcl9pZF90IHZlbmRvcklkLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gKnRhZ3NSZW1vdmVkIC8qb3V0Ki8pOworCisgICAgLyoqCiAgICAgICogU3dhcCB0aGUgdW5kZXJseWluZyBjYW1lcmEgbWV0YWRhdGEgYmV0d2VlbiB0aGlzIGFuZCB0aGUgb3RoZXIKICAgICAgKiBtZXRhZGF0YSBvYmplY3QuCiAgICAgICovCmRpZmYgLS1naXQgYS9jYW1lcmEvaW5jbHVkZS9jYW1lcmEvVmVuZG9yVGFnRGVzY3JpcHRvci5oIGIvY2FtZXJhL2luY2x1ZGUvY2FtZXJhL1ZlbmRvclRhZ0Rlc2NyaXB0b3IuaAppbmRleCA5MDRmYmEyLi5jNzE4YzkzIDEwMDY0NAotLS0gYS9jYW1lcmEvaW5jbHVkZS9jYW1lcmEvVmVuZG9yVGFnRGVzY3JpcHRvci5oCisrKyBiL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9WZW5kb3JUYWdEZXNjcmlwdG9yLmgKQEAgLTk5LDYgKzk5LDExIEBACiAgICAgICAgIHZvaWQgZHVtcChpbnQgZmQsIGludCB2ZXJib3NpdHksIGludCBpbmRlbnRhdGlvbikgY29uc3Q7CiAKICAgICAgICAgLyoqCisgICAgICAgICAqIEdldCBTZWN0aW9uIGZvciBjb3JyZXNwb25kaW5nIHRhZy4KKyAgICAgICAgICovCisgICAgICAgIHNzaXplX3QgZ2V0U2VjdGlvbkluZGV4KHVpbnQzMl90IHRhZykgY29uc3Q7CisKKyAgICAgICAgLyoqCiAgICAgICAgICAqIFJlYWQgdmFsdWVzIFZlbmRvclRhZ0Rlc2NyaXB0b3Igb2JqZWN0IGZyb20gdGhlIGdpdmVuIHBhcmNlbC4KICAgICAgICAgICoKICAgICAgICAgICogUmV0dXJucyBPSyBvbiBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCmRpZmYgLS1naXQgYS9jYW1lcmEvaW5jbHVkZS9jYW1lcmEvY2FtZXJhMi9PdXRwdXRDb25maWd1cmF0aW9uLmggYi9jYW1lcmEvaW5jbHVkZS9jYW1lcmEvY2FtZXJhMi9PdXRwdXRDb25maWd1cmF0aW9uLmgKaW5kZXggYTgwZjQ0Yi4uNWIxMTdmYiAxMDA2NDQKLS0tIGEvY2FtZXJhL2luY2x1ZGUvY2FtZXJhL2NhbWVyYTIvT3V0cHV0Q29uZmlndXJhdGlvbi5oCisrKyBiL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9jYW1lcmEyL091dHB1dENvbmZpZ3VyYXRpb24uaApAQCAtNjcsNiArNjcsMTEgQEAKICAgICBPdXRwdXRDb25maWd1cmF0aW9uKHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBnYnAsIGludCByb3RhdGlvbiwKICAgICAgICAgICAgIGludCBzdXJmYWNlU2V0SUQgPSBJTlZBTElEX1NFVF9JRCwgYm9vbCBpc1NoYXJlZCA9IGZhbHNlKTsKIAorICAgIE91dHB1dENvbmZpZ3VyYXRpb24oY29uc3Qgc3RkOjp2ZWN0b3I8c3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4+JiBnYnBzLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJvdGF0aW9uLCBpbnQgc3VyZmFjZVNldElEID0gSU5WQUxJRF9TRVRfSUQsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3VyZmFjZVR5cGUgPSBPdXRwdXRDb25maWd1cmF0aW9uOjpTVVJGQUNFX1RZUEVfVU5LTk9XTiwgaW50IHdpZHRoID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQgPSAwLCBib29sIGlzU2hhcmVkID0gZmFsc2UpOworCiAgICAgYm9vbCBvcGVyYXRvciA9PSAoY29uc3QgT3V0cHV0Q29uZmlndXJhdGlvbiYgb3RoZXIpIGNvbnN0IHsKICAgICAgICAgcmV0dXJuICggbVJvdGF0aW9uID09IG90aGVyLm1Sb3RhdGlvbiAmJgogICAgICAgICAgICAgICAgIG1TdXJmYWNlU2V0SUQgPT0gb3RoZXIubVN1cmZhY2VTZXRJRCAmJgpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9BbmRyb2lkLmJwIGIvY2FtZXJhL25kay9BbmRyb2lkLmJwCmluZGV4IDk3Y2Y2YmYuLjYwYzlmODUgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvQW5kcm9pZC5icAorKysgYi9jYW1lcmEvbmRrL0FuZHJvaWQuYnAKQEAgLTMwLDMgKzMwLDEyMSBAQAogICAgIHNyY3M6IFsiaW5jbHVkZS9jYW1lcmEvKiovKi5oIl0sCiAgICAgbGljZW5zZTogIk5PVElDRSIsCiB9CisKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY2FtZXJhMm5kayIsCisgICAgc3JjczogWworICAgICAgICAiTmRrQ2FtZXJhTWFuYWdlci5jcHAiLAorICAgICAgICAiTmRrQ2FtZXJhTWV0YWRhdGEuY3BwIiwKKyAgICAgICAgIk5ka0NhbWVyYURldmljZS5jcHAiLAorICAgICAgICAiTmRrQ2FwdHVyZVJlcXVlc3QuY3BwIiwKKyAgICAgICAgIk5ka0NhbWVyYUNhcHR1cmVTZXNzaW9uLmNwcCIsCisgICAgICAgICJpbXBsL0FDYW1lcmFNYW5hZ2VyLmNwcCIsCisgICAgICAgICJpbXBsL0FDYW1lcmFNZXRhZGF0YS5jcHAiLAorICAgICAgICAiaW1wbC9BQ2FtZXJhRGV2aWNlLmNwcCIsCisgICAgICAgICJpbXBsL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbi5jcHAiLAorICAgIF0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGliZ3VpIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYmFuZHJvaWRfcnVudGltZSIsCisgICAgICAgICJsaWJjYW1lcmFfY2xpZW50IiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmNhbWVyYV9tZXRhZGF0YSIsCisgICAgICAgICJsaWJtZWRpYW5kayIsCisgICAgICAgICJsaWJuYXRpdmV3aW5kb3ciLAorICAgIF0sCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItZnZpc2liaWxpdHk9aGlkZGVuIiwKKyAgICAgICAgIi1ERVhQT1JUPV9fYXR0cmlidXRlX18gKCh2aXNpYmlsaXR5IChcImRlZmF1bHRcIikpKSIsCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2V4dHJhIiwKKyAgICAgICAgIi1XZXJyb3IiLAorICAgIF0sCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCisgICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWworICAgICAgICAibGlibmF0aXZld2luZG93IiwKKyAgICBdLAorICAgIHZlcnNpb25fc2NyaXB0OiAibGliY2FtZXJhMm5kay5tYXAudHh0IiwKK30KKworY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjYW1lcmEybmRrX3ZlbmRvciIsCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKyAgICBzcmNzOiBbCisgICAgICAgICJuZGtfdmVuZG9yL2ltcGwvQUNhbWVyYURldmljZS5jcHAiLAorICAgICAgICAibmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFNYW5hZ2VyLmNwcCIsCisgICAgICAgICJuZGtfdmVuZG9yL2ltcGwvdXRpbHMuY3BwIiwKKyAgICAgICAgImltcGwvQUNhbWVyYU1ldGFkYXRhLmNwcCIsCisgICAgICAgICJpbXBsL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbi5jcHAiLAorICAgICAgICAiTmRrQ2FtZXJhTWV0YWRhdGEuY3BwIiwKKyAgICAgICAgIk5ka0NhbWVyYUNhcHR1cmVTZXNzaW9uLmNwcCIsCisgICAgICAgICJOZGtDYW1lcmFNYW5hZ2VyLmNwcCIsCisgICAgICAgICJOZGtDYW1lcmFEZXZpY2UuY3BwIiwKKyAgICAgICAgIk5ka0NhcHR1cmVSZXF1ZXN0LmNwcCIsCisgICAgXSwKKworICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAorICAgIGV4cG9ydF9zaGFyZWRfbGliX2hlYWRlcnM6IFsKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgXSwKKyAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgIi4iLAorICAgICAgICAiaW5jbHVkZSIsCisgICAgICAgICJpbXBsIiwKKyAgICBdLAorICAgIGNmbGFnczogWworICAgICAgICAiLWZ2aXNpYmlsaXR5PWhpZGRlbiIsCisgICAgICAgICItREVYUE9SVD1fX2F0dHJpYnV0ZV9fKCh2aXNpYmlsaXR5KFwiZGVmYXVsdFwiKSkpIiwKKyAgICAgICAgIi1EX19BTkRST0lEX1ZOREtfXyIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJod2JpbmRlciIsCisgICAgICAgICJsaWJmbXEiLAorICAgICAgICAibGliaGlkbGJhc2UiLAorICAgICAgICAibGliaGFyZHdhcmUiLAorICAgICAgICAibGlibmF0aXZld2luZG93IiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJjYW1lcmFfbWV0YWRhdGEiLAorICAgICAgICAibGlibWVkaWFuZGsiLAorICAgICAgICAiYW5kcm9pZC5mcmFtZXdvcmtzLmNhbWVyYXNlcnZpY2UuZGV2aWNlQDIuMCIsCisgICAgICAgICJhbmRyb2lkLmZyYW1ld29ya3MuY2FtZXJhc2VydmljZS5jb21tb25AMi4wIiwKKyAgICAgICAgImFuZHJvaWQuZnJhbWV3b3Jrcy5jYW1lcmFzZXJ2aWNlLnNlcnZpY2VAMi4wIiwKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmNvbW1vbkAxLjAtaGVscGVyIiwKKyAgICAgICAgImxpYmFyZWN0IiwKKyAgICBdLAorICAgIHByb2R1Y3RfdmFyaWFibGVzOiB7CisgICAgICAgIHBkazogeworICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCisgICAgICAgIH0sCisgICAgfSwKK30KKworY2NfdGVzdCB7CisgICAgbmFtZTogIkFJbWFnZVJlYWRlclZlbmRvclRlc3QiLAorICAgIHZlbmRvcjogdHJ1ZSwKKyAgICBzcmNzOiBbIm5ka192ZW5kb3IvdGVzdHMvQUltYWdlUmVhZGVyVmVuZG9yVGVzdC5jcHAiXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliaHdiaW5kZXIiLAorICAgICAgICAibGliY2FtZXJhMm5ka192ZW5kb3IiLAorICAgICAgICAibGlibWVkaWFuZGsiLAorICAgICAgICAibGlibmF0aXZld2luZG93IiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYnVpIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJsb2ciLAorICAgIF0sCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItRF9fQU5EUk9JRF9WTkRLX18iLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL0FuZHJvaWQubWsgYi9jYW1lcmEvbmRrL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzYWRkZjEuLjAwMDAwMDAKLS0tIGEvY2FtZXJhL25kay9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotIwotIyBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi0KLWlmbmVxICgkKFRBUkdFVF9CVUlMRF9QREspLCB0cnVlKQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfU1JDX0ZJTEVTOj0gICAgICAgICAgICAgICAgICBcCi0gICAgTmRrQ2FtZXJhTWFuYWdlci5jcHAgICAgICAgICAgIFwKLSAgICBOZGtDYW1lcmFNZXRhZGF0YS5jcHAgICAgICAgICAgXAotICAgIE5ka0NhbWVyYURldmljZS5jcHAgICAgICAgICAgICBcCi0gICAgTmRrQ2FwdHVyZVJlcXVlc3QuY3BwICAgICAgICAgIFwKLSAgICBOZGtDYW1lcmFDYXB0dXJlU2Vzc2lvbi5jcHAgICAgXAotICAgIGltcGwvQUNhbWVyYU1hbmFnZXIuY3BwICAgICAgICBcCi0gICAgaW1wbC9BQ2FtZXJhTWV0YWRhdGEuY3BwICAgICAgIFwKLSAgICBpbXBsL0FDYW1lcmFEZXZpY2UuY3BwICAgICAgICAgXAotICAgIGltcGwvQUNhbWVyYUNhcHR1cmVTZXNzaW9uLmNwcAotCi1MT0NBTF9NT0RVTEU6PSBsaWJjYW1lcmEybmRrCi0KLUxPQ0FMX0NfSU5DTFVERVMgOj0gJChMT0NBTF9QQVRIKS9pbmNsdWRlCi1MT0NBTF9FWFBPUlRfQ19JTkNMVURFX0RJUlMgOj0gJChMT0NBTF9QQVRIKS9pbmNsdWRlCi0KLUxPQ0FMX0NGTEFHUyArPSAtZnZpc2liaWxpdHk9aGlkZGVuIC1EIEVYUE9SVD0nX19hdHRyaWJ1dGVfXyAoKHZpc2liaWxpdHkgKCJkZWZhdWx0IikpKScKLUxPQ0FMX0NGTEFHUyArPSAtV2FsbCAtV2V4dHJhIC1XZXJyb3IKLQotTE9DQUxfTERGTEFHUyArPSAtV2wsLS12ZXJzaW9uLXNjcmlwdD0kKExPQ0FMX1BBVEgpL2xpYmNhbWVyYTJuZGsubWFwLnR4dAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLSAgICBsaWJiaW5kZXIgXAotICAgIGxpYmxvZyBcCi0gICAgbGliZ3VpIFwKLSAgICBsaWJ1dGlscyBcCi0gICAgbGliYW5kcm9pZF9ydW50aW1lIFwKLSAgICBsaWJjYW1lcmFfY2xpZW50IFwKLSAgICBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIFwKLSAgICBsaWJjdXRpbHMgXAotICAgIGxpYmNhbWVyYV9tZXRhZGF0YSBcCi0gICAgbGlibWVkaWFuZGsKLQotaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQotCi1lbmRpZgpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9OZGtDYW1lcmFEZXZpY2UuY3BwIGIvY2FtZXJhL25kay9OZGtDYW1lcmFEZXZpY2UuY3BwCmluZGV4IDgxMmEzMTIuLmVmMDVlMGIgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvTmRrQ2FtZXJhRGV2aWNlLmNwcAorKysgYi9jYW1lcmEvbmRrL05ka0NhbWVyYURldmljZS5jcHAKQEAgLTI0LDcgKzI0LDE1IEBACiAjaW5jbHVkZSA8Y2FtZXJhL05ka0NhbWVyYURldmljZS5oPgogI2luY2x1ZGUgImltcGwvQUNhbWVyYUNhcHR1cmVTZXNzaW9uLmgiCiAKLXVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmFjYW07CisKK2Jvb2wgYXJlV2luZG93VHlwZXNFcXVhbChBQ2FtZXJhV2luZG93VHlwZSAqYSwgQUNhbWVyYVdpbmRvd1R5cGUgKmIpIHsKKyNpZmRlZiBfX0FORFJPSURfVk5ES19fCisgICAgcmV0dXJuIHV0aWxzOjppc1dpbmRvd05hdGl2ZUhhbmRsZUVxdWFsKGEsIGIpOworI2Vsc2UKKyAgICByZXR1cm4gYSA9PSBiOworI2VuZGlmCit9CiAKIEVYUE9SVAogY2FtZXJhX3N0YXR1c190IEFDYW1lcmFEZXZpY2VfY2xvc2UoQUNhbWVyYURldmljZSogZGV2aWNlKSB7CkBAIC05Niw3ICsxMDQsNyBAQAogCiBFWFBPUlQKIGNhbWVyYV9zdGF0dXNfdCBBQ2FwdHVyZVNlc3Npb25PdXRwdXRfY3JlYXRlKAotICAgICAgICBBTmF0aXZlV2luZG93KiB3aW5kb3csIC8qb3V0Ki9BQ2FwdHVyZVNlc3Npb25PdXRwdXQqKiBvdXQpIHsKKyAgICAgICAgQUNhbWVyYVdpbmRvd1R5cGUqIHdpbmRvdywgLypvdXQqL0FDYXB0dXJlU2Vzc2lvbk91dHB1dCoqIG91dCkgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgaWYgKHdpbmRvdyA9PSBudWxscHRyIHx8IG91dCA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dFKCIlczogRXJyb3I6IGJhZCBhcmd1bWVudC4gd2luZG93ICVwLCBvdXQgJXAiLApAQCAtMTA5LDcgKzExNyw3IEBACiAKIEVYUE9SVAogY2FtZXJhX3N0YXR1c190IEFDYXB0dXJlU2Vzc2lvblNoYXJlZE91dHB1dF9jcmVhdGUoCi0gICAgICAgIEFOYXRpdmVXaW5kb3cqIHdpbmRvdywgLypvdXQqL0FDYXB0dXJlU2Vzc2lvbk91dHB1dCoqIG91dCkgeworICAgICAgICBBQ2FtZXJhV2luZG93VHlwZSogd2luZG93LCAvKm91dCovQUNhcHR1cmVTZXNzaW9uT3V0cHV0Kiogb3V0KSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBpZiAod2luZG93ID09IG51bGxwdHIgfHwgb3V0ID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0UoIiVzOiBFcnJvcjogYmFkIGFyZ3VtZW50LiB3aW5kb3cgJXAsIG91dCAlcCIsCkBAIC0xMjIsNyArMTMwLDcgQEAKIAogRVhQT1JUCiBjYW1lcmFfc3RhdHVzX3QgQUNhcHR1cmVTZXNzaW9uU2hhcmVkT3V0cHV0X2FkZChBQ2FwdHVyZVNlc3Npb25PdXRwdXQgKm91dCwKLSAgICAgICAgQU5hdGl2ZVdpbmRvdyogd2luZG93KSB7CisgICAgICAgIEFDYW1lcmFXaW5kb3dUeXBlKiB3aW5kb3cpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIGlmICgod2luZG93ID09IG51bGxwdHIpIHx8IChvdXQgPT0gbnVsbHB0cikpIHsKICAgICAgICAgQUxPR0UoIiVzOiBFcnJvcjogYmFkIGFyZ3VtZW50LiB3aW5kb3cgJXAsIG91dCAlcCIsCkBAIC0xMzQsNyArMTQyLDcgQEAKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOwogICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX09QRVJBVElPTjsKICAgICB9Ci0gICAgaWYgKG91dC0+bVdpbmRvdyA9PSB3aW5kb3cpIHsKKyAgICBpZiAoYXJlV2luZG93VHlwZXNFcXVhbChvdXQtPm1XaW5kb3csIHdpbmRvdykpIHsKICAgICAgICAgQUxPR0UoIiVzOiBFcnJvciB0cnlpbmcgdG8gYWRkIHRoZSBzYW1lIHdpbmRvdyBhc3NvY2lhdGVkIHdpdGggdGhlIG91dHB1dCBjb25maWd1cmF0aW9uIiwKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOwogICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKQEAgLTE0Nyw3ICsxNTUsNyBAQAogCiBFWFBPUlQKIGNhbWVyYV9zdGF0dXNfdCBBQ2FwdHVyZVNlc3Npb25TaGFyZWRPdXRwdXRfcmVtb3ZlKEFDYXB0dXJlU2Vzc2lvbk91dHB1dCAqb3V0LAotICAgICAgICBBTmF0aXZlV2luZG93KiB3aW5kb3cpIHsKKyAgICAgICAgQUNhbWVyYVdpbmRvd1R5cGUqIHdpbmRvdykgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgaWYgKCh3aW5kb3cgPT0gbnVsbHB0cikgfHwgKG91dCA9PSBudWxscHRyKSkgewogICAgICAgICBBTE9HRSgiJXM6IEVycm9yOiBiYWQgYXJndW1lbnQuIHdpbmRvdyAlcCwgb3V0ICVwIiwKQEAgLTE1OSw3ICsxNjcsNyBAQAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CiAgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KLSAgICBpZiAob3V0LT5tV2luZG93ID09IHdpbmRvdykgeworICAgIGlmIChhcmVXaW5kb3dUeXBlc0VxdWFsKG91dC0+bVdpbmRvdywgd2luZG93KSkgewogICAgICAgICBBTE9HRSgiJXM6IEVycm9yIHRyeWluZyB0byByZW1vdmUgdGhlIHNhbWUgd2luZG93IGFzc29jaWF0ZWQgd2l0aCB0aGUgb3V0cHV0IGNvbmZpZ3VyYXRpb24iLAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CiAgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOwpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9OZGtDYW1lcmFNYW5hZ2VyLmNwcCBiL2NhbWVyYS9uZGsvTmRrQ2FtZXJhTWFuYWdlci5jcHAKaW5kZXggNjBiNDc2My4uODc0MmQ5YyAxMDA2NDQKLS0tIGEvY2FtZXJhL25kay9OZGtDYW1lcmFNYW5hZ2VyLmNwcAorKysgYi9jYW1lcmEvbmRrL05ka0NhbWVyYU1hbmFnZXIuY3BwCkBAIC0yMiw5ICsyMiwxNSBAQAogI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CiAKICNpbmNsdWRlIDxjYW1lcmEvTmRrQ2FtZXJhTWFuYWdlci5oPgotI2luY2x1ZGUgImltcGwvQUNhbWVyYU1hbmFnZXIuaCIKIAotdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisjaWZkZWYgX19BTkRST0lEX1ZOREtfXworI2luY2x1ZGUgIm5ka192ZW5kb3IvaW1wbC9BQ2FtZXJhTWFuYWdlci5oIgorI2Vsc2UKKyNpbmNsdWRlICJpbXBsL0FDYW1lcmFNYW5hZ2VyLmgiCisjZW5kaWYKKyNpbmNsdWRlICJpbXBsL0FDYW1lcmFNZXRhZGF0YS5oIgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6YWNhbTsKIAogRVhQT1JUCiBBQ2FtZXJhTWFuYWdlciogQUNhbWVyYU1hbmFnZXJfY3JlYXRlKCkgewpAQCAtMTA3LDcgKzExMywxNCBAQAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbWdyLCBjYW1lcmFJZCwgY2hhcnMpOwogICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKICAgICB9Ci0gICAgcmV0dXJuIG1nci0+Z2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKGNhbWVyYUlkLCBjaGFycyk7CisgICAgc3A8QUNhbWVyYU1ldGFkYXRhPiBzcENoYXJzOworICAgIGNhbWVyYV9zdGF0dXNfdCBzdGF0dXMgPSBtZ3ItPmdldENhbWVyYUNoYXJhY3RlcmlzdGljcyhjYW1lcmFJZCwgJnNwQ2hhcnMpOworICAgIGlmIChzdGF0dXMgIT0gQUNBTUVSQV9PSykgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICBzcENoYXJzLT5pbmNTdHJvbmcoKHZvaWQqKSBBQ2FtZXJhTWFuYWdlcl9nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MpOworICAgICpjaGFycyA9IHNwQ2hhcnMuZ2V0KCk7CisgICAgcmV0dXJuIEFDQU1FUkFfT0s7CiB9CiAKIEVYUE9SVApkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9OZGtDYW1lcmFNZXRhZGF0YS5jcHAgYi9jYW1lcmEvbmRrL05ka0NhbWVyYU1ldGFkYXRhLmNwcAppbmRleCA2NWRlODFmLi4zNGVjMmRhIDEwMDY0NAotLS0gYS9jYW1lcmEvbmRrL05ka0NhbWVyYU1ldGFkYXRhLmNwcAorKysgYi9jYW1lcmEvbmRrL05ka0NhbWVyYU1ldGFkYXRhLmNwcApAQCAtNTcsMTMgKzU3LDE1IEBACiAgICAgICAgIEFMT0dFKCIlczogc3JjIGlzIG51bGwhIiwgX19GVU5DVElPTl9fKTsKICAgICAgICAgcmV0dXJuIG51bGxwdHI7CiAgICAgfQotICAgIHJldHVybiBuZXcgQUNhbWVyYU1ldGFkYXRhKCpzcmMpOworICAgIEFDYW1lcmFNZXRhZGF0YSogY29weSA9IG5ldyBBQ2FtZXJhTWV0YWRhdGEoKnNyYyk7CisgICAgY29weS0+aW5jU3Ryb25nKCh2b2lkKikgQUNhbWVyYU1ldGFkYXRhX2NvcHkpOworICAgIHJldHVybiBjb3B5OwogfQogCiBFWFBPUlQKIHZvaWQgQUNhbWVyYU1ldGFkYXRhX2ZyZWUoQUNhbWVyYU1ldGFkYXRhKiBtZXRhZGF0YSkgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgaWYgKG1ldGFkYXRhICE9IG51bGxwdHIpIHsKLSAgICAgICAgZGVsZXRlIG1ldGFkYXRhOworICAgICAgICBtZXRhZGF0YS0+ZGVjU3Ryb25nKCh2b2lkKikgQUNhbWVyYU1ldGFkYXRhX2ZyZWUpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvTmRrQ2FwdHVyZVJlcXVlc3QuY3BwIGIvY2FtZXJhL25kay9OZGtDYXB0dXJlUmVxdWVzdC5jcHAKaW5kZXggYWMxODU2Yi4uYzY0ZGUzZSAxMDA2NDQKLS0tIGEvY2FtZXJhL25kay9OZGtDYXB0dXJlUmVxdWVzdC5jcHAKKysrIGIvY2FtZXJhL25kay9OZGtDYXB0dXJlUmVxdWVzdC5jcHAKQEAgLTI3LDcgKzI3LDcgQEAKIAogRVhQT1JUCiBjYW1lcmFfc3RhdHVzX3QgQUNhbWVyYU91dHB1dFRhcmdldF9jcmVhdGUoCi0gICAgICAgIEFOYXRpdmVXaW5kb3cqIHdpbmRvdywgQUNhbWVyYU91dHB1dFRhcmdldCoqIG91dCkgeworICAgICAgICBBQ2FtZXJhV2luZG93VHlwZSogd2luZG93LCBBQ2FtZXJhT3V0cHV0VGFyZ2V0Kiogb3V0KSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBpZiAod2luZG93ID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0UoIiVzOiBFcnJvcjogaW5wdXQgd2luZG93IGlzIG51bGwiLCBfX0ZVTkNUSU9OX18pOwpAQCAtMTM3LDcgKzEzNyw3IEBACiAgICAgaWYgKHJlcXVlc3QgPT0gbnVsbHB0cikgewogICAgICAgICByZXR1cm47CiAgICAgfQotICAgIGRlbGV0ZSByZXF1ZXN0LT5zZXR0aW5nczsKKyAgICByZXF1ZXN0LT5zZXR0aW5ncy5jbGVhcigpOwogICAgIGRlbGV0ZSByZXF1ZXN0LT50YXJnZXRzOwogICAgIGRlbGV0ZSByZXF1ZXN0OwogICAgIHJldHVybjsKZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhQ2FwdHVyZVNlc3Npb24uY3BwIGIvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbi5jcHAKaW5kZXggZjYwZTVmZC4uZmI3MmJkYiAxMDA2NDQKLS0tIGEvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbi5jcHAKKysrIGIvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbi5jcHAKQEAgLTIzLDcgKzIzLDcgQEAKIAogQUNhbWVyYUNhcHR1cmVTZXNzaW9uOjp+QUNhbWVyYUNhcHR1cmVTZXNzaW9uKCkgewogICAgIEFMT0dWKCJ+QUNhbWVyYUNhcHR1cmVTZXNzaW9uOiAlcCBub3RpZnkgZGV2aWNlIGVuZCBvZiBsaWZlIiwgdGhpcyk7Ci0gICAgc3A8Q2FtZXJhRGV2aWNlPiBkZXYgPSBnZXREZXZpY2VTcCgpOworICAgIHNwPGFjYW06OkNhbWVyYURldmljZT4gZGV2ID0gZ2V0RGV2aWNlU3AoKTsKICAgICBpZiAoZGV2ICE9IG51bGxwdHIgJiYgIWRldi0+aXNDbG9zZWQoKSkgewogICAgICAgICBkZXYtPmxvY2tEZXZpY2VGb3JTZXNzaW9uT3BzKCk7CiAgICAgICAgIHsKQEAgLTQ4LDcgKzQ4LDcgQEAKICAgICAgICAgbUNsb3NlZEJ5QXBwID0gdHJ1ZTsKICAgICB9CiAKLSAgICBzcDxDYW1lcmFEZXZpY2U+IGRldiA9IGdldERldmljZVNwKCk7CisgICAgc3A8YWNhbTo6Q2FtZXJhRGV2aWNlPiBkZXYgPSBnZXREZXZpY2VTcCgpOwogICAgIGlmIChkZXYgIT0gbnVsbHB0cikgewogICAgICAgICBkZXYtPmxvY2tEZXZpY2VGb3JTZXNzaW9uT3BzKCk7CiAgICAgfQpAQCAtNzMsNyArNzMsNyBAQAogCiBjYW1lcmFfc3RhdHVzX3QKIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbjo6c3RvcFJlcGVhdGluZygpIHsKLSAgICBzcDxDYW1lcmFEZXZpY2U+IGRldiA9IGdldERldmljZVNwKCk7CisgICAgc3A8YWNhbTo6Q2FtZXJhRGV2aWNlPiBkZXYgPSBnZXREZXZpY2VTcCgpOwogICAgIGlmIChkZXYgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRSgiRXJyb3I6IERldmljZSBhc3NvY2lhdGVkIHdpdGggc2Vzc2lvbiAlcCBoYXMgYmVlbiBjbG9zZWQhIiwgdGhpcyk7CiAgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX1NFU1NJT05fQ0xPU0VEOwpAQCAtOTEsNyArOTEsNyBAQAogCiBjYW1lcmFfc3RhdHVzX3QKIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbjo6YWJvcnRDYXB0dXJlcygpIHsKLSAgICBzcDxDYW1lcmFEZXZpY2U+IGRldiA9IGdldERldmljZVNwKCk7CisgICAgc3A8YWNhbTo6Q2FtZXJhRGV2aWNlPiBkZXYgPSBnZXREZXZpY2VTcCgpOwogICAgIGlmIChkZXYgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRSgiRXJyb3I6IERldmljZSBhc3NvY2lhdGVkIHdpdGggc2Vzc2lvbiAlcCBoYXMgYmVlbiBjbG9zZWQhIiwgdGhpcyk7CiAgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX1NFU1NJT05fQ0xPU0VEOwpAQCAtMTEyLDcgKzExMiw3IEBACiAgICAgICAgIC8qb3B0aW9uYWwqL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tzKiBjYnMsCiAgICAgICAgIGludCBudW1SZXF1ZXN0cywgQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdHMsCiAgICAgICAgIC8qb3B0aW9uYWwqL2ludCogY2FwdHVyZVNlcXVlbmNlSWQpIHsKLSAgICBzcDxDYW1lcmFEZXZpY2U+IGRldiA9IGdldERldmljZVNwKCk7CisgICAgc3A8YWNhbTo6Q2FtZXJhRGV2aWNlPiBkZXYgPSBnZXREZXZpY2VTcCgpOwogICAgIGlmIChkZXYgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRSgiRXJyb3I6IERldmljZSBhc3NvY2lhdGVkIHdpdGggc2Vzc2lvbiAlcCBoYXMgYmVlbiBjbG9zZWQhIiwgdGhpcyk7CiAgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX1NFU1NJT05fQ0xPU0VEOwpAQCAtMTMzLDcgKzEzMyw3IEBACiAgICAgICAgIC8qb3B0aW9uYWwqL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tzKiBjYnMsCiAgICAgICAgIGludCBudW1SZXF1ZXN0cywgQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdHMsCiAgICAgICAgIC8qb3B0aW9uYWwqL2ludCogY2FwdHVyZVNlcXVlbmNlSWQpIHsKLSAgICBzcDxDYW1lcmFEZXZpY2U+IGRldiA9IGdldERldmljZVNwKCk7CisgICAgc3A8YWNhbTo6Q2FtZXJhRGV2aWNlPiBkZXYgPSBnZXREZXZpY2VTcCgpOwogICAgIGlmIChkZXYgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRSgiRXJyb3I6IERldmljZSBhc3NvY2lhdGVkIHdpdGggc2Vzc2lvbiAlcCBoYXMgYmVlbiBjbG9zZWQhIiwgdGhpcyk7CiAgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX1NFU1NJT05fQ0xPU0VEOwpAQCAtMTQ5LDcgKzE0OSw3IEBACiB9CiAKIGNhbWVyYV9zdGF0dXNfdCBBQ2FtZXJhQ2FwdHVyZVNlc3Npb246OnVwZGF0ZU91dHB1dENvbmZpZ3VyYXRpb24oQUNhcHR1cmVTZXNzaW9uT3V0cHV0ICpvdXRwdXQpIHsKLSAgICBzcDxDYW1lcmFEZXZpY2U+IGRldiA9IGdldERldmljZVNwKCk7CisgICAgc3A8YWNhbTo6Q2FtZXJhRGV2aWNlPiBkZXYgPSBnZXREZXZpY2VTcCgpOwogICAgIGlmIChkZXYgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRSgiRXJyb3I6IERldmljZSBhc3NvY2lhdGVkIHdpdGggc2Vzc2lvbiAlcCBoYXMgYmVlbiBjbG9zZWQhIiwgdGhpcyk7CiAgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX1NFU1NJT05fQ0xPU0VEOwpAQCAtMTY4LDcgKzE2OCw3IEBACiBBQ2FtZXJhRGV2aWNlKgogQUNhbWVyYUNhcHR1cmVTZXNzaW9uOjpnZXREZXZpY2UoKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1TZXNzaW9uTG9jayk7Ci0gICAgc3A8Q2FtZXJhRGV2aWNlPiBkZXYgPSBnZXREZXZpY2VTcCgpOworICAgIHNwPGFjYW06OkNhbWVyYURldmljZT4gZGV2ID0gZ2V0RGV2aWNlU3AoKTsKICAgICBpZiAoZGV2ID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0UoIkVycm9yOiBEZXZpY2UgYXNzb2NpYXRlZCB3aXRoIHNlc3Npb24gJXAgaGFzIGJlZW4gY2xvc2VkISIsIHRoaXMpOwogICAgICAgICByZXR1cm4gbnVsbHB0cjsKQEAgLTE4Miw5ICsxODIsOSBAQAogICAgIG1Jc0Nsb3NlZCA9IHRydWU7CiB9CiAKLXNwPENhbWVyYURldmljZT4KK3NwPGFjYW06OkNhbWVyYURldmljZT4KIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbjo6Z2V0RGV2aWNlU3AoKSB7Ci0gICAgc3A8Q2FtZXJhRGV2aWNlPiBkZXZpY2UgPSBtRGV2aWNlLnByb21vdGUoKTsKKyAgICBzcDxhY2FtOjpDYW1lcmFEZXZpY2U+IGRldmljZSA9IG1EZXZpY2UucHJvbW90ZSgpOwogICAgIGlmIChkZXZpY2UgPT0gbnVsbHB0ciB8fCBkZXZpY2UtPmlzQ2xvc2VkKCkpIHsKICAgICAgICAgQUxPR1coIkRldmljZSBpcyBjbG9zZWQgYnV0IHNlc3Npb24gJWQgaXMgbm90IG5vdGlmaWVkIiwgbUlkKTsKICAgICAgICAgcmV0dXJuIG51bGxwdHI7CmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYUNhcHR1cmVTZXNzaW9uLmggYi9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYUNhcHR1cmVTZXNzaW9uLmgKaW5kZXggYTIwNjhlNy4uMTMzYzJjOCAxMDA2NDQKLS0tIGEvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbi5oCisrKyBiL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhQ2FwdHVyZVNlc3Npb24uaApAQCAtMTksMTIgKzE5LDE3IEBACiAjaW5jbHVkZSA8c2V0PgogI2luY2x1ZGUgPGhhcmR3YXJlL2NhbWVyYTMuaD4KICNpbmNsdWRlIDxjYW1lcmEvTmRrQ2FtZXJhRGV2aWNlLmg+CisKKyNpZmRlZiBfX0FORFJPSURfVk5ES19fCisjaW5jbHVkZSAibmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFEZXZpY2UuaCIKKyNpbmNsdWRlICJuZGtfdmVuZG9yL2ltcGwvQUNhbWVyYUNhcHR1cmVTZXNzaW9uVmVuZG9yLmgiCisjZWxzZQogI2luY2x1ZGUgIkFDYW1lcmFEZXZpY2UuaCIKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiAKIHN0cnVjdCBBQ2FwdHVyZVNlc3Npb25PdXRwdXQgewotICAgIGV4cGxpY2l0IEFDYXB0dXJlU2Vzc2lvbk91dHB1dChBTmF0aXZlV2luZG93KiB3aW5kb3csIGJvb2wgaXNTaGFyZWQgPSBmYWxzZSkgOgorICAgIGV4cGxpY2l0IEFDYXB0dXJlU2Vzc2lvbk91dHB1dChBQ2FtZXJhV2luZG93VHlwZSogd2luZG93LCBib29sIGlzU2hhcmVkID0gZmFsc2UpIDoKICAgICAgICAgICAgIG1XaW5kb3cod2luZG93KSwgbUlzU2hhcmVkKGlzU2hhcmVkKSB7fTsKIAogICAgIGJvb2wgb3BlcmF0b3IgPT0gKGNvbnN0IEFDYXB0dXJlU2Vzc2lvbk91dHB1dCYgb3RoZXIpIGNvbnN0IHsKQEAgLTQwLDExICs0NSwxMiBAQAogICAgICAgICByZXR1cm4gbVdpbmRvdyA+IG90aGVyLm1XaW5kb3c7CiAgICAgfQogCi0gICAgQU5hdGl2ZVdpbmRvdyogbVdpbmRvdzsKLSAgICBzdGQ6OnNldDxBTmF0aXZlV2luZG93ICo+IG1TaGFyZWRXaW5kb3dzOworICAgIEFDYW1lcmFXaW5kb3dUeXBlKiBtV2luZG93OworICAgIHN0ZDo6c2V0PEFDYW1lcmFXaW5kb3dUeXBlICo+IG1TaGFyZWRXaW5kb3dzOwogICAgIGJvb2wgICAgICAgICAgIG1Jc1NoYXJlZDsKICAgICBpbnQgICAgICAgICAgICBtUm90YXRpb24gPSBDQU1FUkEzX1NUUkVBTV9ST1RBVElPTl8wOwogfTsKKyNlbmRpZgogCiBzdHJ1Y3QgQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyIHsKICAgICBzdGQ6OnNldDxBQ2FwdHVyZVNlc3Npb25PdXRwdXQ+IG1PdXRwdXRzOwpAQCAtNjAsNyArNjYsNyBAQAogICAgICAgICAgICAgaW50IGlkLAogICAgICAgICAgICAgY29uc3QgQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyKiBvdXRwdXRzLAogICAgICAgICAgICAgY29uc3QgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX3N0YXRlQ2FsbGJhY2tzKiBjYiwKLSAgICAgICAgICAgIENhbWVyYURldmljZSogZGV2aWNlKSA6CisgICAgICAgICAgICBhbmRyb2lkOjphY2FtOjpDYW1lcmFEZXZpY2UqIGRldmljZSkgOgogICAgICAgICAgICAgbUlkKGlkKSwgbU91dHB1dCgqb3V0cHV0cyksIG1Vc2VyU2Vzc2lvbkNhbGxiYWNrKCpjYiksCiAgICAgICAgICAgICBtRGV2aWNlKGRldmljZSkge30KIApAQCAtOTcsMTggKzEwMywxOCBAQAogICAgIEFDYW1lcmFEZXZpY2UqIGdldERldmljZSgpOwogCiAgIHByaXZhdGU6Ci0gICAgZnJpZW5kIGNsYXNzIENhbWVyYURldmljZTsKKyAgICBmcmllbmQgY2xhc3MgYW5kcm9pZDo6YWNhbTo6Q2FtZXJhRGV2aWNlOwogCiAgICAgLy8gQ2xvc2Ugc2Vzc2lvbiBiZWNhdXNlIGFwcCBjbG9zZSBjYW1lcmEgZGV2aWNlLCBjYW1lcmEgZGV2aWNlIGdvdCBFUlJPUl9ESVNDT05ORUNURUQsCiAgICAgLy8gb3IgYSBuZXcgc2Vzc2lvbiBpcyByZXBsYWNpbmcgdGhpcyBzZXNzaW9uLgogICAgIHZvaWQgY2xvc2VCeURldmljZSgpOwogCi0gICAgc3A8Q2FtZXJhRGV2aWNlPiBnZXREZXZpY2VTcCgpOworICAgIHNwPGFuZHJvaWQ6OmFjYW06OkNhbWVyYURldmljZT4gZ2V0RGV2aWNlU3AoKTsKIAogICAgIGNvbnN0IGludCBtSWQ7CiAgICAgY29uc3QgQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyIG1PdXRwdXQ7CiAgICAgY29uc3QgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX3N0YXRlQ2FsbGJhY2tzIG1Vc2VyU2Vzc2lvbkNhbGxiYWNrOwotICAgIGNvbnN0IHdwPENhbWVyYURldmljZT4gbURldmljZTsKKyAgICBjb25zdCB3cDxhbmRyb2lkOjphY2FtOjpDYW1lcmFEZXZpY2U+IG1EZXZpY2U7CiAgICAgYm9vbCAgbUlzQ2xvc2VkID0gZmFsc2U7CiAgICAgYm9vbCAgbUNsb3NlZEJ5QXBwID0gZmFsc2U7CiAgICAgTXV0ZXggbVNlc3Npb25Mb2NrOwpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFEZXZpY2UuY3BwIGIvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFEZXZpY2UuY3BwCmluZGV4IDc5M2JiYzQuLjAwZGE1NGUgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhRGV2aWNlLmNwcAorKysgYi9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYURldmljZS5jcHAKQEAgLTI3LDkgKzI3LDkgQEAKICNpbmNsdWRlICJBQ2FwdHVyZVJlcXVlc3QuaCIKICNpbmNsdWRlICJBQ2FtZXJhQ2FwdHVyZVNlc3Npb24uaCIKIAotdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7Ci0KIG5hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhY2FtIHsKKwogLy8gU3RhdGljIG1lbWJlciBkZWZpbml0aW9ucwogY29uc3QgY2hhciogQ2FtZXJhRGV2aWNlOjprQ29udGV4dEtleSAgICAgICAgPSAiQ29udGV4dCI7CiBjb25zdCBjaGFyKiBDYW1lcmFEZXZpY2U6OmtEZXZpY2VLZXkgICAgICAgICA9ICJEZXZpY2UiOwpAQCAtNTAsMTEgKzUwLDExIEBACiBDYW1lcmFEZXZpY2U6OkNhbWVyYURldmljZSgKICAgICAgICAgY29uc3QgY2hhciogaWQsCiAgICAgICAgIEFDYW1lcmFEZXZpY2VfU3RhdGVDYWxsYmFja3MqIGNiLAotICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QUNhbWVyYU1ldGFkYXRhPiBjaGFycywKKyAgICAgICAgc3A8QUNhbWVyYU1ldGFkYXRhPiBjaGFycywKICAgICAgICAgQUNhbWVyYURldmljZSogd3JhcHBlcikgOgogICAgICAgICBtQ2FtZXJhSWQoaWQpLAogICAgICAgICBtQXBwQ2FsbGJhY2tzKCpjYiksCi0gICAgICAgIG1DaGFycyhzdGQ6Om1vdmUoY2hhcnMpKSwKKyAgICAgICAgbUNoYXJzKGNoYXJzKSwKICAgICAgICAgbVNlcnZpY2VDYWxsYmFjayhuZXcgU2VydmljZUNhbGxiYWNrKHRoaXMpKSwKICAgICAgICAgbVdyYXBwZXIod3JhcHBlciksCiAgICAgICAgIG1JbkVycm9yKGZhbHNlKSwKQEAgLTQzNiw3ICs0MzYsNyBAQAogICAgIGlmIChyZXEgPT0gbnVsbHB0cikgewogICAgICAgICByZXR1cm47CiAgICAgfQotICAgIGRlbGV0ZSByZXEtPnNldHRpbmdzOworICAgIHJlcS0+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+IG90aGVyLm1XaW5kb3c7CisgICAgfQorCisgICAgYW5kcm9pZDo6YWNhbTo6dXRpbHM6Om5hdGl2ZV9oYW5kbGVfcHRyX3dyYXBwZXIgbVdpbmRvdzsKKyAgICBzdGQ6OnNldDxhbmRyb2lkOjphY2FtOjp1dGlsczo6bmF0aXZlX2hhbmRsZV9wdHJfd3JhcHBlcj4gbVNoYXJlZFdpbmRvd3M7CisgICAgYm9vbCAgICAgICAgICAgbUlzU2hhcmVkOworICAgIGludCAgICAgICAgICAgIG1Sb3RhdGlvbiA9IENBTUVSQTNfU1RSRUFNX1JPVEFUSU9OXzA7Cit9OworCisKZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFEZXZpY2UuY3BwIGIvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvQUNhbWVyYURldmljZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg2Zjg1NAotLS0gL2Rldi9udWxsCisrKyBiL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFEZXZpY2UuY3BwCkBAIC0wLDAgKzEsMTU5NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQUNhbWVyYURldmljZVZlbmRvciIKKworI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL3NlcnZpY2UvMi4wL0lDYW1lcmFTZXJ2aWNlLmg+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+Z2V0SW50ZXJuYWxEYXRhKCkpOworICAgICAgICBjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCAqcGFyYW1zX21ldGFkYXRhID0gcGFyYW1zLmdldEFuZExvY2soKTsKKyAgICAgICAgdXRpbHM6OmNvbnZlcnRUb0hpZGwocGFyYW1zX21ldGFkYXRhLCAmaGlkbFBhcmFtcyk7CisgICAgICAgIHBhcmFtcy51bmxvY2socGFyYW1zX21ldGFkYXRhKTsKKyAgICAgICAgcmVtb3RlUmV0ID0gbVJlbW90ZS0+ZW5kQ29uZmlndXJlKFN0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlOjpOT1JNQUxfTU9ERSwgaGlkbFBhcmFtcyk7CisgICAgfQorICAgIGlmICghcmVtb3RlUmV0LmlzT2soKSkgeworICAgICAgICBBTE9HRSgiVHJhbnNhY3Rpb24gZXJyb3I6IGVuZENvbmZpZ3VyZSBmYWlsZWQgJXMiLCByZW1vdGVSZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICB9CisKKyAgICByZXR1cm4gdXRpbHM6OmNvbnZlcnRGcm9tSGlkbChyZW1vdGVSZXQpOworfQorCit2b2lkCitDYW1lcmFEZXZpY2U6OnNldFJlbW90ZURldmljZShzcDxJQ2FtZXJhRGV2aWNlVXNlcj4gcmVtb3RlKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1EZXZpY2VMb2NrKTsKKyAgICBtUmVtb3RlID0gcmVtb3RlOworfQorCitib29sCitDYW1lcmFEZXZpY2U6OnNldERldmljZU1ldGFkYXRhUXVldWVzKCkgeworICAgICAgICBpZiAobVJlbW90ZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgQUxPR0UoIm1SZW1vdGUgbXVzdCBub3QgYmUgbnVsbCB3aGlsZSB0cnlpbmcgdG8gZmV0Y2ggbWV0YWRhdGEgcXVldWVzIik7CisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxSZXF1ZXN0TWV0YWRhdGFRdWV1ZT4gJnJlcVF1ZXVlID0gbUNhcHR1cmVSZXF1ZXN0TWV0YWRhdGFRdWV1ZTsKKyAgICAgICAgYXV0byByZXQgPQorICAgICAgICAgICAgbVJlbW90ZS0+Z2V0Q2FwdHVyZVJlcXVlc3RNZXRhZGF0YVF1ZXVlKAorICAgICAgICAgICAgICAgIFsmcmVxUXVldWVdKGNvbnN0IGF1dG8gJm1xRGVzY3JpcHRvcikgeworICAgICAgICAgICAgICAgICAgICByZXFRdWV1ZSA9IHN0ZDo6bWFrZV9zaGFyZWQ8UmVxdWVzdE1ldGFkYXRhUXVldWU+KG1xRGVzY3JpcHRvcik7CisgICAgICAgICAgICAgICAgICAgIGlmICghcmVxUXVldWUtPmlzVmFsaWQoKSB8fCByZXFRdWV1ZS0+YXZhaWxhYmxlVG9Xcml0ZSgpIDw9MCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkVtcHR5IGZtcSBmcm9tIGNhbWVyYXNlcnZlciIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVxUXVldWUgPSBudWxscHRyOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIGlmICghcmV0LmlzT2soKSkgeworICAgICAgICAgICAgQUxPR0UoIlRyYW5zYWN0aW9uIGVycm9yIHRyeWluZyB0byBnZXQgY2FwdHVyZSByZXF1ZXN0IG1ldGFkYXRhIHF1ZXVlIik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFJlc3VsdE1ldGFkYXRhUXVldWU+ICZyZXNRdWV1ZSA9IG1DYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZTsKKyAgICAgICAgcmV0ID0KKyAgICAgICAgICAgICAgICBtUmVtb3RlLT5nZXRDYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIFsmcmVzUXVldWVdKGNvbnN0IGF1dG8gJm1xRGVzY3JpcHRvcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc1F1ZXVlID0gc3RkOjptYWtlX3NoYXJlZDxSZXN1bHRNZXRhZGF0YVF1ZXVlPihtcURlc2NyaXB0b3IpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVzUXVldWUtPmlzVmFsaWQoKSB8fCByZXNRdWV1ZS0+YXZhaWxhYmxlVG9Xcml0ZSgpIDw9MCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiRW1wdHkgZm1xIGZyb20gY2FtZXJhc2VydmVyIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIGlmICghcmV0LmlzT2soKSkgeworICAgICAgICAgICAgQUxPR0UoIlRyYW5zYWN0aW9uIGVycm9yIHRyeWluZyB0byBnZXQgY2FwdHVyZSByZXN1bHQgbWV0YWRhdGEgcXVldWUiKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKK30KKworY2FtZXJhX3N0YXR1c190CitDYW1lcmFEZXZpY2U6OmNoZWNrQ2FtZXJhQ2xvc2VkT3JFcnJvckxvY2tlZCgpIGNvbnN0IHsKKyAgICBpZiAobVJlbW90ZSA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogY2FtZXJhIGRldmljZSBhbHJlYWR5IGNsb3NlZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0NBTUVSQV9ESVNDT05ORUNURUQ7CisgICAgfQorICAgIGlmIChtSW5FcnJvcikgey8vIHRyaWdnZXJlZCBieSBvbkRldmljZUVycm9yCisgICAgICAgIEFMT0dFKCIlczogY2FtZXJhIGRldmljZSBoYXMgZW5jb3VudGVyZWQgYSBzZXJpb3VzIGVycm9yIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIG1FcnJvcjsKKyAgICB9CisgICAgcmV0dXJuIEFDQU1FUkFfT0s7Cit9CisKK3ZvaWQKK0NhbWVyYURldmljZTo6c2V0Q2FtZXJhRGV2aWNlRXJyb3JMb2NrZWQoY2FtZXJhX3N0YXR1c190IGVycm9yKSB7CisgICAgbUluRXJyb3IgPSB0cnVlOworICAgIG1FcnJvciA9IGVycm9yOworICAgIHJldHVybjsKK30KKwordm9pZAorQ2FtZXJhRGV2aWNlOjpGcmFtZU51bWJlclRyYWNrZXI6OnVwZGF0ZVRyYWNrZXIoaW50NjRfdCBmcmFtZU51bWJlciwgYm9vbCBpc0Vycm9yKSB7CisgICAgQUxPR1YoInVwZGF0ZVRyYWNrZXIgZnJhbWUgJSIgUFJJZDY0ICIgaXNFcnJvciAlZCIsIGZyYW1lTnVtYmVyLCBpc0Vycm9yKTsKKyAgICBpZiAoaXNFcnJvcikgeworICAgICAgICBtRnV0dXJlRXJyb3JTZXQuaW5zZXJ0KGZyYW1lTnVtYmVyKTsKKyAgICB9IGVsc2UgaWYgKGZyYW1lTnVtYmVyIDw9IG1Db21wbGV0ZWRGcmFtZU51bWJlcikgeworICAgICAgICBBTE9HRSgiRnJhbWUgbnVtYmVyICUiIFBSSWQ2NCAiIGRlY3JlYXNlZCEgY3VycmVudCBmbiAlIiBQUklkNjQsCisgICAgICAgICAgICAgICAgZnJhbWVOdW1iZXIsIG1Db21wbGV0ZWRGcmFtZU51bWJlcik7CisgICAgICAgIHJldHVybjsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoZnJhbWVOdW1iZXIgIT0gbUNvbXBsZXRlZEZyYW1lTnVtYmVyICsgMSkgeworICAgICAgICAgICAgQUxPR0UoIkZyYW1lIG51bWJlciBvdXQgb2Ygb3JkZXIuIEV4cGVjdCAlIiBQUklkNjQgIiBidXQgZ2V0ICUiIFBSSWQ2NCwKKyAgICAgICAgICAgICAgICAgICAgbUNvbXBsZXRlZEZyYW1lTnVtYmVyICsgMSwgZnJhbWVOdW1iZXIpOworICAgICAgICAgICAgLy8gRG8gbm90IGFzc2VydCBhcyBpbiBqYXZhIGltcGxlbWVudGF0aW9uCisgICAgICAgIH0KKyAgICAgICAgbUNvbXBsZXRlZEZyYW1lTnVtYmVyID0gZnJhbWVOdW1iZXI7CisgICAgfQorICAgIHVwZGF0ZSgpOworfQorCit2b2lkCitDYW1lcmFEZXZpY2U6OkZyYW1lTnVtYmVyVHJhY2tlcjo6dXBkYXRlKCkgeworICAgIGZvciAoYXV0byBpdCA9IG1GdXR1cmVFcnJvclNldC5iZWdpbigpOyBpdCAhPSBtRnV0dXJlRXJyb3JTZXQuZW5kKCk7KSB7CisgICAgICAgIGludDY0X3QgZXJyb3JGcmFtZU51bWJlciA9ICppdDsKKyAgICAgICAgaWYgKGVycm9yRnJhbWVOdW1iZXIgPT0gbUNvbXBsZXRlZEZyYW1lTnVtYmVyICsgMSkgeworICAgICAgICAgICAgbUNvbXBsZXRlZEZyYW1lTnVtYmVyKys7CisgICAgICAgICAgICBpdCA9IG1GdXR1cmVFcnJvclNldC5lcmFzZShpdCk7CisgICAgICAgIH0gZWxzZSBpZiAoZXJyb3JGcmFtZU51bWJlciA8PSBtQ29tcGxldGVkRnJhbWVOdW1iZXIpIHsKKyAgICAgICAgICAgIC8vIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4sIGJ1dCBkZWFsIHdpdGggaXQgYW55d2F5CisgICAgICAgICAgICBBTE9HRSgiQ29tcGxldGQgZnJhbWUgbnVtYmVyIHBhc3NlZCB0aHJvdWdoIGN1cnJlbnQgZnJhbWUgbnVtYmVyISIpOworICAgICAgICAgICAgLy8gZXJhc2UgdGhlIG9sZCBlcnJvciBzaW5jZSBpdCdzIG5vIGxvbmdlciB1c2VmdWwKKyAgICAgICAgICAgIGl0ID0gbUZ1dHVyZUVycm9yU2V0LmVyYXNlKGl0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIE5vcm1hbCByZXF1ZXN0cyBoYXNuJ3QgY2F0Y2hlZCB1cCBlcnJvciBmcmFtZXMsIGp1c3QgYnJlYWsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIEFMT0dWKCJVcGRhdGUgY29tcGxldGUgZnJhbWUgJSIgUFJJZDY0LCBtQ29tcGxldGVkRnJhbWVOdW1iZXIpOworfQorCit2b2lkCitDYW1lcmFEZXZpY2U6Om9uQ2FwdHVyZUVycm9yTG9ja2VkKAorICAgICAgICBFcnJvckNvZGUgZXJyb3JDb2RlLAorICAgICAgICBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMpIHsKKyAgICBpbnQgc2VxdWVuY2VJZCA9IHJlc3VsdEV4dHJhcy5yZXF1ZXN0SWQ7CisgICAgaW50NjRfdCBmcmFtZU51bWJlciA9IHJlc3VsdEV4dHJhcy5mcmFtZU51bWJlcjsKKyAgICBpbnQzMl90IGJ1cnN0SWQgPSByZXN1bHRFeHRyYXMuYnVyc3RJZDsKKyAgICBhdXRvIGl0ID0gbVNlcXVlbmNlQ2FsbGJhY2tNYXAuZmluZChzZXF1ZW5jZUlkKTsKKyAgICBpZiAoaXQgPT0gbVNlcXVlbmNlQ2FsbGJhY2tNYXAuZW5kKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBFcnJvcjogY2FwdHVyZSBzZXF1ZW5jZSBpbmRleCAlZCBub3QgZm91bmQhIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHNlcXVlbmNlSWQpOworICAgICAgICBzZXRDYW1lcmFEZXZpY2VFcnJvckxvY2tlZChBQ0FNRVJBX0VSUk9SX0NBTUVSQV9TRVJWSUNFKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIENhbGxiYWNrSG9sZGVyIGNiaCA9ICgqaXQpLnNlY29uZDsKKyAgICBzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+IHNlc3Npb24gPSBjYmgubVNlc3Npb247CisgICAgaWYgKChzaXplX3QpIGJ1cnN0SWQgPj0gY2JoLm1SZXF1ZXN0cy5zaXplKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBFcnJvcjogcmVxdWVzdCBpbmRleCAlZCBvdXQgb2YgYm91bmQgKHNpemUgJXp1KSIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBidXJzdElkLCBjYmgubVJlcXVlc3RzLnNpemUoKSk7CisgICAgICAgIHNldENhbWVyYURldmljZUVycm9yTG9ja2VkKEFDQU1FUkFfRVJST1JfQ0FNRVJBX1NFUlZJQ0UpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHNwPENhcHR1cmVSZXF1ZXN0PiByZXF1ZXN0ID0gY2JoLm1SZXF1ZXN0c1tidXJzdElkXTsKKworICAgIC8vIEhhbmRsZSBidWZmZXIgZXJyb3IKKyAgICBpZiAoZXJyb3JDb2RlID09IEVycm9yQ29kZTo6Q0FNRVJBX0JVRkZFUikgeworICAgICAgICBpbnQzMl90IHN0cmVhbUlkID0gcmVzdWx0RXh0cmFzLmVycm9yU3RyZWFtSWQ7CisgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfYnVmZmVyTG9zdCBvbkJ1ZmZlckxvc3QgPQorICAgICAgICAgICAgICAgIGNiaC5tQ2FsbGJhY2tzLm9uQ2FwdHVyZUJ1ZmZlckxvc3Q7CisgICAgICAgIGF1dG8gb3V0cHV0UGFpckl0ID0gbUNvbmZpZ3VyZWRPdXRwdXRzLmZpbmQoc3RyZWFtSWQpOworICAgICAgICBpZiAob3V0cHV0UGFpckl0ID09IG1Db25maWd1cmVkT3V0cHV0cy5lbmQoKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBFcnJvcjogc3RyZWFtIGlkICVkIGRvZXMgbm90IGV4aXN0IiwgX19GVU5DVElPTl9fLCBzdHJlYW1JZCk7CisgICAgICAgICAgICBzZXRDYW1lcmFEZXZpY2VFcnJvckxvY2tlZChBQ0FNRVJBX0VSUk9SX0NBTUVSQV9TRVJWSUNFKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IGF1dG8mIHdpbmRvd0hhbmRsZXMgPSBvdXRwdXRQYWlySXQtPnNlY29uZC5zZWNvbmQubU91dHB1dENvbmZpZ3VyYXRpb24ud2luZG93SGFuZGxlczsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBvdXRIYW5kbGUgOiB3aW5kb3dIYW5kbGVzKSB7CisgICAgICAgICAgICBmb3IgKGF1dG8gc3RyZWFtQW5kV2luZG93SWQgOiByZXF1ZXN0LT5tQ2FwdHVyZVJlcXVlc3Quc3RyZWFtQW5kV2luZG93SWRzKSB7CisgICAgICAgICAgICAgICAgaW50MzJfdCB3aW5kb3dJZCA9IHN0cmVhbUFuZFdpbmRvd0lkLndpbmRvd0lkOworICAgICAgICAgICAgICAgIGlmICh1dGlsczo6aXNXaW5kb3dOYXRpdmVIYW5kbGVFcXVhbCh3aW5kb3dIYW5kbGVzW3dpbmRvd0lkXSxvdXRIYW5kbGUpKSB7CisgICAgICAgICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCogYW53ID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8bmF0aXZlX2hhbmRsZV90ICo+KHdpbmRvd0hhbmRsZXNbd2luZG93SWRdLmdldE5hdGl2ZUhhbmRsZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkNhbWVyYSAlcyBMb3N0IG91dHB1dCBidWZmZXIgZm9yIEFOVyAlcCBmcmFtZSAlIiBQUklkNjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0SWQoKSwgYW53LCBmcmFtZU51bWJlcik7CisKKyAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdENhcHR1cmVCdWZmZXJMb3N0LCBtSGFuZGxlcik7CisgICAgICAgICAgICAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ29udGV4dEtleSwgY2JoLm1DYWxsYmFja3MuY29udGV4dCk7CisgICAgICAgICAgICAgICAgICAgIG1zZy0+c2V0T2JqZWN0KGtTZXNzaW9uU3BLZXksIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKikgb25CdWZmZXJMb3N0KTsKKyAgICAgICAgICAgICAgICAgICAgbXNnLT5zZXRPYmplY3Qoa0NhcHR1cmVSZXF1ZXN0S2V5LCByZXF1ZXN0KTsKKyAgICAgICAgICAgICAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtBbndLZXksICh2b2lkKikgYW53KTsKKyAgICAgICAgICAgICAgICAgICAgbXNnLT5zZXRJbnQ2NChrRnJhbWVOdW1iZXJLZXksIGZyYW1lTnVtYmVyKTsKKyAgICAgICAgICAgICAgICAgICAgcG9zdFNlc3Npb25Nc2dBbmRDbGVhbnVwKG1zZyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsgLy8gSGFuZGxlIG90aGVyIGNhcHR1cmUgZmFpbHVyZXMKKyAgICAgICAgLy8gRmlyZSBjYXB0dXJlIGZhaWx1cmUgY2FsbGJhY2sgaWYgdGhlcmUgaXMgb25lIHJlZ2lzdGVyZWQKKyAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19mYWlsZWQgb25FcnJvciA9IGNiaC5tQ2FsbGJhY2tzLm9uQ2FwdHVyZUZhaWxlZDsKKyAgICAgICAgc3A8Q2FtZXJhQ2FwdHVyZUZhaWx1cmU+IGZhaWx1cmUobmV3IENhbWVyYUNhcHR1cmVGYWlsdXJlKCkpOworICAgICAgICBmYWlsdXJlLT5mcmFtZU51bWJlciA9IGZyYW1lTnVtYmVyOworICAgICAgICAvLyBUT0RPOiByZWZpbmUgdGhpcyB3aGVuIGltcGxlbWVudGluZyBmbHVzaAorICAgICAgICBmYWlsdXJlLT5yZWFzb24gICAgICA9IENBUFRVUkVfRkFJTFVSRV9SRUFTT05fRVJST1I7CisgICAgICAgIGZhaWx1cmUtPnNlcXVlbmNlSWQgID0gc2VxdWVuY2VJZDsKKyAgICAgICAgZmFpbHVyZS0+d2FzSW1hZ2VDYXB0dXJlZCA9IChlcnJvckNvZGUgPT0gRXJyb3JDb2RlOjpDQU1FUkFfUkVTVUxUKTsKKworICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0Q2FwdHVyZUZhaWwsIG1IYW5kbGVyKTsKKyAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDb250ZXh0S2V5LCBjYmgubUNhbGxiYWNrcy5jb250ZXh0KTsKKyAgICAgICAgbXNnLT5zZXRPYmplY3Qoa1Nlc3Npb25TcEtleSwgc2Vzc2lvbik7CisgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKSBvbkVycm9yKTsKKyAgICAgICAgbXNnLT5zZXRPYmplY3Qoa0NhcHR1cmVSZXF1ZXN0S2V5LCByZXF1ZXN0KTsKKyAgICAgICAgbXNnLT5zZXRPYmplY3Qoa0NhcHR1cmVGYWlsdXJlS2V5LCBmYWlsdXJlKTsKKyAgICAgICAgcG9zdFNlc3Npb25Nc2dBbmRDbGVhbnVwKG1zZyk7CisKKyAgICAgICAgLy8gVXBkYXRlIHRyYWNrZXIKKyAgICAgICAgbUZyYW1lTnVtYmVyVHJhY2tlci51cGRhdGVUcmFja2VyKGZyYW1lTnVtYmVyLCAvKmlzRXJyb3IqL3RydWUpOworICAgICAgICBjaGVja0FuZEZpcmVTZXF1ZW5jZUNvbXBsZXRlTG9ja2VkKCk7CisgICAgfQorICAgIHJldHVybjsKK30KKwordm9pZCBDYW1lcmFEZXZpY2U6OkNhbGxiYWNrSGFuZGxlcjo6b25NZXNzYWdlUmVjZWl2ZWQoCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgc3dpdGNoIChtc2ctPndoYXQoKSkgeworICAgICAgICBjYXNlIGtXaGF0T25EaXNjb25uZWN0ZWQ6CisgICAgICAgIGNhc2Uga1doYXRPbkVycm9yOgorICAgICAgICBjYXNlIGtXaGF0U2Vzc2lvblN0YXRlQ2I6CisgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlU3RhcnQ6CisgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlUmVzdWx0OgorICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZUZhaWw6CisgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlU2VxRW5kOgorICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZVNlcUFib3J0OgorICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZUJ1ZmZlckxvc3Q6CisgICAgICAgICAgICBBTE9HVigiJXM6IFJlY2VpdmVkIG1zZyAlZCIsIF9fRlVOQ1RJT05fXywgbXNnLT53aGF0KCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2Uga1doYXRDbGVhblVwU2Vzc2lvbnM6CisgICAgICAgICAgICBtQ2FjaGVkU2Vzc2lvbnMuY2xlYXIoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dFKCIlczpFcnJvcjogdW5rbm93biBkZXZpY2UgY2FsbGJhY2sgJWQiLCBfX0ZVTkNUSU9OX18sIG1zZy0+d2hhdCgpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgLy8gQ2hlY2sgdGhlIGNvbW1vbiBwYXJ0IG9mIGFsbCBtZXNzYWdlCisgICAgdm9pZCogY29udGV4dDsKKyAgICBib29sIGZvdW5kID0gbXNnLT5maW5kUG9pbnRlcihrQ29udGV4dEtleSwgJmNvbnRleHQpOworICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBjYWxsYmFjayBjb250ZXh0ISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc3dpdGNoIChtc2ctPndoYXQoKSkgeworICAgICAgICBjYXNlIGtXaGF0T25EaXNjb25uZWN0ZWQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIEFDYW1lcmFEZXZpY2UqIGRldjsKKyAgICAgICAgICAgIGZvdW5kID0gbXNnLT5maW5kUG9pbnRlcihrRGV2aWNlS2V5LCAodm9pZCoqKSAmZGV2KTsKKyAgICAgICAgICAgIGlmICghZm91bmQgfHwgZGV2ID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCBmaW5kIGRldmljZSBwb2ludGVyISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQUNhbWVyYURldmljZV9TdGF0ZUNhbGxiYWNrIG9uRGlzY29ubmVjdGVkOworICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCoqKSAmb25EaXNjb25uZWN0ZWQpOworICAgICAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgb25EaXNjb25uZWN0ZWQhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAob25EaXNjb25uZWN0ZWQgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICgqb25EaXNjb25uZWN0ZWQpKGNvbnRleHQsIGRldik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIGtXaGF0T25FcnJvcjoKKyAgICAgICAgeworICAgICAgICAgICAgQUNhbWVyYURldmljZSogZGV2OworICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRQb2ludGVyKGtEZXZpY2VLZXksICh2b2lkKiopICZkZXYpOworICAgICAgICAgICAgaWYgKCFmb3VuZCB8fCBkZXYgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgZGV2aWNlIHBvaW50ZXIhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBQ2FtZXJhRGV2aWNlX0Vycm9yU3RhdGVDYWxsYmFjayBvbkVycm9yOworICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCoqKSAmb25FcnJvcik7CisgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBvbkVycm9yISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IGVycm9yQ29kZTsKKyAgICAgICAgICAgIGZvdW5kID0gbXNnLT5maW5kSW50MzIoa0Vycm9yQ29kZUtleSwgJmVycm9yQ29kZSk7CisgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBlcnJvciBjb2RlISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG9uRXJyb3IgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICgqb25FcnJvcikoY29udGV4dCwgZGV2LCBlcnJvckNvZGUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBrV2hhdFNlc3Npb25TdGF0ZUNiOgorICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZVN0YXJ0OgorICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZVJlc3VsdDoKKyAgICAgICAgY2FzZSBrV2hhdENhcHR1cmVGYWlsOgorICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZVNlcUVuZDoKKyAgICAgICAgY2FzZSBrV2hhdENhcHR1cmVTZXFBYm9ydDoKKyAgICAgICAgY2FzZSBrV2hhdENhcHR1cmVCdWZmZXJMb3N0OgorICAgICAgICB7CisgICAgICAgICAgICBzcDxSZWZCYXNlPiBvYmo7CisgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZE9iamVjdChrU2Vzc2lvblNwS2V5LCAmb2JqKTsKKyAgICAgICAgICAgIGlmICghZm91bmQgfHwgb2JqID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCBmaW5kIHNlc3Npb24gcG9pbnRlciEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gc2Vzc2lvbihzdGF0aWNfY2FzdDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24qPihvYmouZ2V0KCkpKTsKKyAgICAgICAgICAgIG1DYWNoZWRTZXNzaW9ucy5wdXNoKHNlc3Npb24pOworICAgICAgICAgICAgc3A8Q2FwdHVyZVJlcXVlc3Q+IHJlcXVlc3RTcCA9IG51bGxwdHI7CisgICAgICAgICAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7CisgICAgICAgICAgICAgICAgY2FzZSBrV2hhdENhcHR1cmVTdGFydDoKKyAgICAgICAgICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZVJlc3VsdDoKKyAgICAgICAgICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZUZhaWw6CisgICAgICAgICAgICAgICAgY2FzZSBrV2hhdENhcHR1cmVCdWZmZXJMb3N0OgorICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZE9iamVjdChrQ2FwdHVyZVJlcXVlc3RLZXksICZvYmopOworICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCBmaW5kIGNhcHR1cmUgcmVxdWVzdCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RTcCA9IHN0YXRpY19jYXN0PENhcHR1cmVSZXF1ZXN0Kj4ob2JqLmdldCgpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAobXNnLT53aGF0KCkpIHsKKyAgICAgICAgICAgICAgICBjYXNlIGtXaGF0U2Vzc2lvblN0YXRlQ2I6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fc3RhdGVDYWxsYmFjayBvblN0YXRlOworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKiopICZvblN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBzdGF0ZSBjYWxsYmFjayEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChvblN0YXRlID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAoKm9uU3RhdGUpKGNvbnRleHQsIHNlc3Npb24uZ2V0KCkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FzZSBrV2hhdENhcHR1cmVTdGFydDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfc3RhcnQgb25TdGFydDsKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCoqKSAmb25TdGFydCk7CisgICAgICAgICAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgY2FwdHVyZSBzdGFydCBjYWxsYmFjayEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChvblN0YXJ0ID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcDsKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRJbnQ2NChrVGltZVN0YW1wS2V5LCAmdGltZXN0YW1wKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCB0aW1lc3RhbXAhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBBQ2FwdHVyZVJlcXVlc3QqIHJlcXVlc3QgPSBhbGxvY2F0ZUFDYXB0dXJlUmVxdWVzdChyZXF1ZXN0U3ApOworICAgICAgICAgICAgICAgICAgICAoKm9uU3RhcnQpKGNvbnRleHQsIHNlc3Npb24uZ2V0KCksIHJlcXVlc3QsIHRpbWVzdGFtcCk7CisgICAgICAgICAgICAgICAgICAgIGZyZWVBQ2FwdHVyZVJlcXVlc3QocmVxdWVzdCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZVJlc3VsdDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfcmVzdWx0IG9uUmVzdWx0OworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKiopICZvblJlc3VsdCk7CisgICAgICAgICAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgY2FwdHVyZSByZXN1bHQgY2FsbGJhY2shIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAob25SZXN1bHQgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRPYmplY3Qoa0NhcHR1cmVSZXN1bHRLZXksICZvYmopOworICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCBmaW5kIGNhcHR1cmUgcmVzdWx0ISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc3A8QUNhbWVyYU1ldGFkYXRhPiByZXN1bHQoc3RhdGljX2Nhc3Q8QUNhbWVyYU1ldGFkYXRhKj4ob2JqLmdldCgpKSk7CisgICAgICAgICAgICAgICAgICAgIEFDYXB0dXJlUmVxdWVzdCogcmVxdWVzdCA9IGFsbG9jYXRlQUNhcHR1cmVSZXF1ZXN0KHJlcXVlc3RTcCk7CisgICAgICAgICAgICAgICAgICAgICgqb25SZXN1bHQpKGNvbnRleHQsIHNlc3Npb24uZ2V0KCksIHJlcXVlc3QsIHJlc3VsdC5nZXQoKSk7CisgICAgICAgICAgICAgICAgICAgIGZyZWVBQ2FwdHVyZVJlcXVlc3QocmVxdWVzdCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZUZhaWw6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX2ZhaWxlZCBvbkZhaWw7CisgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gbXNnLT5maW5kUG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKikgJm9uRmFpbCk7CisgICAgICAgICAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgY2FwdHVyZSBmYWlsIGNhbGxiYWNrISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG9uRmFpbCA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZE9iamVjdChrQ2FwdHVyZUZhaWx1cmVLZXksICZvYmopOworICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCBmaW5kIGNhcHR1cmUgZmFpbHVyZSEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHNwPENhbWVyYUNhcHR1cmVGYWlsdXJlPiBmYWlsdXJlU3AoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Q2FtZXJhQ2FwdHVyZUZhaWx1cmUqPihvYmouZ2V0KCkpKTsKKyAgICAgICAgICAgICAgICAgICAgQUNhbWVyYUNhcHR1cmVGYWlsdXJlKiBmYWlsdXJlID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxBQ2FtZXJhQ2FwdHVyZUZhaWx1cmUqPihmYWlsdXJlU3AuZ2V0KCkpOworICAgICAgICAgICAgICAgICAgICBBQ2FwdHVyZVJlcXVlc3QqIHJlcXVlc3QgPSBhbGxvY2F0ZUFDYXB0dXJlUmVxdWVzdChyZXF1ZXN0U3ApOworICAgICAgICAgICAgICAgICAgICAoKm9uRmFpbCkoY29udGV4dCwgc2Vzc2lvbi5nZXQoKSwgcmVxdWVzdCwgZmFpbHVyZSk7CisgICAgICAgICAgICAgICAgICAgIGZyZWVBQ2FwdHVyZVJlcXVlc3QocmVxdWVzdCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZVNlcUVuZDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfc2VxdWVuY2VFbmQgb25TZXFFbmQ7CisgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gbXNnLT5maW5kUG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKikgJm9uU2VxRW5kKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBzZXF1ZW5jZSBlbmQgY2FsbGJhY2shIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAob25TZXFFbmQgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGludCBzZXFJZDsKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRJbnQzMihrU2VxdWVuY2VJZEtleSwgJnNlcUlkKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBmcmFtZSBudW1iZXIhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGZyYW1lTnVtYmVyOworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZEludDY0KGtGcmFtZU51bWJlcktleSwgJmZyYW1lTnVtYmVyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBmcmFtZSBudW1iZXIhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAoKm9uU2VxRW5kKShjb250ZXh0LCBzZXNzaW9uLmdldCgpLCBzZXFJZCwgZnJhbWVOdW1iZXIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FzZSBrV2hhdENhcHR1cmVTZXFBYm9ydDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfc2VxdWVuY2VBYm9ydCBvblNlcUFib3J0OworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKiopICZvblNlcUFib3J0KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBzZXF1ZW5jZSBlbmQgY2FsbGJhY2shIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAob25TZXFBYm9ydCA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaW50IHNlcUlkOworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZEludDMyKGtTZXF1ZW5jZUlkS2V5LCAmc2VxSWQpOworICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCBmaW5kIGZyYW1lIG51bWJlciEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICgqb25TZXFBYm9ydCkoY29udGV4dCwgc2Vzc2lvbi5nZXQoKSwgc2VxSWQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FzZSBrV2hhdENhcHR1cmVCdWZmZXJMb3N0OgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19idWZmZXJMb3N0IG9uQnVmZmVyTG9zdDsKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCoqKSAmb25CdWZmZXJMb3N0KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBidWZmZXIgbG9zdCBjYWxsYmFjayEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChvbkJ1ZmZlckxvc3QgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90KiBhbnc7CisgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gbXNnLT5maW5kUG9pbnRlcihrQW53S2V5LCAodm9pZCoqKSAmYW53KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBuYXRpdmVfaGFuZGxlX3QhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGludDY0X3QgZnJhbWVOdW1iZXI7CisgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gbXNnLT5maW5kSW50NjQoa0ZyYW1lTnVtYmVyS2V5LCAmZnJhbWVOdW1iZXIpOworICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCBmaW5kIGZyYW1lIG51bWJlciEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgQUNhcHR1cmVSZXF1ZXN0KiByZXF1ZXN0ID0gYWxsb2NhdGVBQ2FwdHVyZVJlcXVlc3QocmVxdWVzdFNwKTsKKyAgICAgICAgICAgICAgICAgICAgKCpvbkJ1ZmZlckxvc3QpKGNvbnRleHQsIHNlc3Npb24uZ2V0KCksIHJlcXVlc3QsIGFudywgZnJhbWVOdW1iZXIpOworICAgICAgICAgICAgICAgICAgICBmcmVlQUNhcHR1cmVSZXF1ZXN0KHJlcXVlc3QpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKworQ2FtZXJhRGV2aWNlOjpDYWxsYmFja0hvbGRlcjo6Q2FsbGJhY2tIb2xkZXIoCisgICAgc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiAgICAgICAgICBzZXNzaW9uLAorICAgIGNvbnN0IFZlY3RvcjxzcDxDYXB0dXJlUmVxdWVzdD4gPiYgcmVxdWVzdHMsCisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1JlcGVhdGluZywKKyAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrcyogY2JzKSA6CisgICAgbVNlc3Npb24oc2Vzc2lvbiksIG1SZXF1ZXN0cyhyZXF1ZXN0cyksCisgICAgbUlzUmVwZWF0aW5nKGlzUmVwZWF0aW5nKSwgbUNhbGxiYWNrcyhmaWxsQ2IoY2JzKSkge30KKwordm9pZAorQ2FtZXJhRGV2aWNlOjpjaGVja1JlcGVhdGluZ1NlcXVlbmNlQ29tcGxldGVMb2NrZWQoCisgICAgY29uc3QgaW50IHNlcXVlbmNlSWQsIGNvbnN0IGludDY0X3QgbGFzdEZyYW1lTnVtYmVyKSB7CisgICAgQUxPR1YoIlJlcGVhdGluZyBzZXFJZCAlZCBsYXN0RnJhbWVOdW1lciAlIiBQUklkNjQsIHNlcXVlbmNlSWQsIGxhc3RGcmFtZU51bWJlcik7CisgICAgaWYgKGxhc3RGcmFtZU51bWJlciA9PSBOT19GUkFNRVNfQ0FQVFVSRUQpIHsKKyAgICAgICAgaWYgKG1TZXF1ZW5jZUNhbGxiYWNrTWFwLmNvdW50KHNlcXVlbmNlSWQpID09IDApIHsKKyAgICAgICAgICAgIEFMT0dXKCJObyBjYWxsYmFjayBmb3VuZCBmb3Igc2VxdWVuY2VJZCAlZCIsIHNlcXVlbmNlSWQpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIC8vIHJlbW92ZSBjYWxsYmFjayBob2xkZXIgZnJvbSBjYWxsYmFjayBtYXAKKyAgICAgICAgYXV0byBjYkl0ID0gbVNlcXVlbmNlQ2FsbGJhY2tNYXAuZmluZChzZXF1ZW5jZUlkKTsKKyAgICAgICAgQ2FsbGJhY2tIb2xkZXIgY2JoID0gY2JJdC0+c2Vjb25kOworICAgICAgICBtU2VxdWVuY2VDYWxsYmFja01hcC5lcmFzZShjYkl0KTsKKyAgICAgICAgLy8gc2VuZCBzZXEgYWJvcnRlZCBjYWxsYmFjaworICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0Q2FwdHVyZVNlcUFib3J0LCBtSGFuZGxlcik7CisgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ29udGV4dEtleSwgY2JoLm1DYWxsYmFja3MuY29udGV4dCk7CisgICAgICAgIG1zZy0+c2V0T2JqZWN0KGtTZXNzaW9uU3BLZXksIGNiaC5tU2Vzc2lvbik7CisgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKSBjYmgubUNhbGxiYWNrcy5vbkNhcHR1cmVTZXF1ZW5jZUFib3J0ZWQpOworICAgICAgICBtc2ctPnNldEludDMyKGtTZXF1ZW5jZUlkS2V5LCBzZXF1ZW5jZUlkKTsKKyAgICAgICAgcG9zdFNlc3Npb25Nc2dBbmRDbGVhbnVwKG1zZyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gVXNlIG1TZXF1ZW5jZUxhc3RGcmFtZU51bWJlck1hcCB0byB0cmFjaworICAgICAgICBtU2VxdWVuY2VMYXN0RnJhbWVOdW1iZXJNYXAuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKHNlcXVlbmNlSWQsIGxhc3RGcmFtZU51bWJlcikpOworCisgICAgICAgIC8vIExhc3QgZnJhbWUgbWlnaHQgaGF2ZSBhcnJpdmVkLiBDaGVjayBub3cKKyAgICAgICAgY2hlY2tBbmRGaXJlU2VxdWVuY2VDb21wbGV0ZUxvY2tlZCgpOworICAgIH0KK30KKwordm9pZAorQ2FtZXJhRGV2aWNlOjpjaGVja0FuZEZpcmVTZXF1ZW5jZUNvbXBsZXRlTG9ja2VkKCkgeworICAgIGludDY0X3QgY29tcGxldGVkRnJhbWVOdW1iZXIgPSBtRnJhbWVOdW1iZXJUcmFja2VyLmdldENvbXBsZXRlZEZyYW1lTnVtYmVyKCk7CisgICAgYXV0byBpdCA9IG1TZXF1ZW5jZUxhc3RGcmFtZU51bWJlck1hcC5iZWdpbigpOworICAgIHdoaWxlIChpdCAhPSBtU2VxdWVuY2VMYXN0RnJhbWVOdW1iZXJNYXAuZW5kKCkpIHsKKyAgICAgICAgaW50IHNlcXVlbmNlSWQgPSBpdC0+Zmlyc3Q7CisgICAgICAgIGludDY0X3QgbGFzdEZyYW1lTnVtYmVyID0gaXQtPnNlY29uZDsKKyAgICAgICAgYm9vbCBzZXFDb21wbGV0ZWQgPSBmYWxzZTsKKyAgICAgICAgYm9vbCBoYXNDYWxsYmFjayAgPSB0cnVlOworCisgICAgICAgIGlmIChtUmVtb3RlID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dXKCJDYW1lcmEgJXMgY2xvc2VkIHdoaWxlIGNoZWNraW5nIHNlcXVlbmNlIGNvbXBsZXRlIiwgZ2V0SWQoKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBDaGVjayBpZiB0aGVyZSBpcyBjYWxsYmFjayBmb3IgdGhpcyBzZXF1ZW5jZQorICAgICAgICAvLyBUaGlzIHNob3VsZCBub3QgaGFwcGVuIGJlY2F1c2Ugd2UgYWx3YXlzIHJlZ2lzdGVyIGNhbGxiYWNrICh3aXRoIG51bGxwdHIgaW5zaWRlKQorICAgICAgICBpZiAobVNlcXVlbmNlQ2FsbGJhY2tNYXAuY291bnQoc2VxdWVuY2VJZCkgPT0gMCkgeworICAgICAgICAgICAgQUxPR1coIk5vIGNhbGxiYWNrIGZvdW5kIGZvciBzZXF1ZW5jZUlkICVkIiwgc2VxdWVuY2VJZCk7CisgICAgICAgICAgICBoYXNDYWxsYmFjayA9IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGxhc3RGcmFtZU51bWJlciA8PSBjb21wbGV0ZWRGcmFtZU51bWJlcikgeworICAgICAgICAgICAgQUxPR1YoInNlcSAlZCByZWFjaGVkIGxhc3QgZnJhbWUgJSIgUFJJZDY0ICIsIGNvbXBsZXRlZCAlIiBQUklkNjQsCisgICAgICAgICAgICAgICAgICBzZXF1ZW5jZUlkLCBsYXN0RnJhbWVOdW1iZXIsIGNvbXBsZXRlZEZyYW1lTnVtYmVyKTsKKyAgICAgICAgICAgIHNlcUNvbXBsZXRlZCA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc2VxQ29tcGxldGVkICYmIGhhc0NhbGxiYWNrKSB7CisgICAgICAgICAgICAvLyByZW1vdmUgY2FsbGJhY2sgaG9sZGVyIGZyb20gY2FsbGJhY2sgbWFwCisgICAgICAgICAgICBhdXRvIGNiSXQgPSBtU2VxdWVuY2VDYWxsYmFja01hcC5maW5kKHNlcXVlbmNlSWQpOworICAgICAgICAgICAgQ2FsbGJhY2tIb2xkZXIgY2JoID0gY2JJdC0+c2Vjb25kOworICAgICAgICAgICAgbVNlcXVlbmNlQ2FsbGJhY2tNYXAuZXJhc2UoY2JJdCk7CisgICAgICAgICAgICAvLyBzZW5kIHNlcSBjb21wbGV0ZSBjYWxsYmFjaworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdENhcHR1cmVTZXFFbmQsIG1IYW5kbGVyKTsKKyAgICAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ29udGV4dEtleSwgY2JoLm1DYWxsYmFja3MuY29udGV4dCk7CisgICAgICAgICAgICBtc2ctPnNldE9iamVjdChrU2Vzc2lvblNwS2V5LCBjYmgubVNlc3Npb24pOworICAgICAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCopIGNiaC5tQ2FsbGJhY2tzLm9uQ2FwdHVyZVNlcXVlbmNlQ29tcGxldGVkKTsKKyAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoa1NlcXVlbmNlSWRLZXksIHNlcXVlbmNlSWQpOworICAgICAgICAgICAgbXNnLT5zZXRJbnQ2NChrRnJhbWVOdW1iZXJLZXksIGxhc3RGcmFtZU51bWJlcik7CisKKyAgICAgICAgICAgIC8vIENsZWFyIHRoZSBzZXNzaW9uIHNwIGJlZm9yZSB3ZSBzZW5kIG91dCB0aGUgbWVzc2FnZQorICAgICAgICAgICAgLy8gVGhpcyB3aWxsIGd1YXJhbnRlZSB0aGUgcmFyZSBjYXNlIHdoZXJlIHRoZSBtZXNzYWdlIGlzIHByb2Nlc3NlZAorICAgICAgICAgICAgLy8gYmVmb3JlIGNiaCBnb2VzIG91dCBvZiBzY29wZSBhbmQgY2F1c2luZyB3ZSBjYWxsIHRoZSBzZXNzaW9uCisgICAgICAgICAgICAvLyBkZXN0cnVjdG9yIHdoaWxlIGhvbGRpbmcgZGV2aWNlIGxvY2sKKyAgICAgICAgICAgIGNiaC5tU2Vzc2lvbi5jbGVhcigpOworICAgICAgICAgICAgcG9zdFNlc3Npb25Nc2dBbmRDbGVhbnVwKG1zZyk7CisgICAgICAgIH0KKworICAgICAgICAvLyBObyBuZWVkIHRvIHRyYWNrIHNlcXVlbmNlIGNvbXBsZXRlIGlmIHRoZXJlIGlzIG5vIGNhbGxiYWNrIHJlZ2lzdGVyZWQKKyAgICAgICAgaWYgKHNlcUNvbXBsZXRlZCB8fCAhaGFzQ2FsbGJhY2spIHsKKyAgICAgICAgICAgIGl0ID0gbVNlcXVlbmNlTGFzdEZyYW1lTnVtYmVyTWFwLmVyYXNlKGl0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICsraXQ7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qKgorICAqIENhbWVyYSBzZXJ2aWNlIGNhbGxiYWNrIGltcGxlbWVudGF0aW9uCisgICovCithbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+CitDYW1lcmFEZXZpY2U6OlNlcnZpY2VDYWxsYmFjazo6b25EZXZpY2VFcnJvcigKKyAgICAgICAgRXJyb3JDb2RlIGVycm9yQ29kZSwKKyAgICAgICAgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzKSB7CisgICAgQUxPR0QoIkRldmljZSBlcnJvciByZWNlaXZlZCwgY29kZSAlZCwgZnJhbWUgbnVtYmVyICUiIFBSSWQ2NCAiLCByZXF1ZXN0IElEICVkLCBzdWJzZXEgSUQgJWQiLAorICAgICAgICAgICAgZXJyb3JDb2RlLCByZXN1bHRFeHRyYXMuZnJhbWVOdW1iZXIsIHJlc3VsdEV4dHJhcy5yZXF1ZXN0SWQsIHJlc3VsdEV4dHJhcy5idXJzdElkKTsKKyAgICBhdXRvIHJldCA9IFZvaWQoKTsKKyAgICBzcDxDYW1lcmFEZXZpY2U+IGRldiA9IG1EZXZpY2UucHJvbW90ZSgpOworICAgIGlmIChkZXYgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gcmV0OyAvLyBkZXZpY2UgaGFzIGJlZW4gY2xvc2VkCisgICAgfQorCisgICAgc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiBzZXNzaW9uID0gZGV2LT5tQ3VycmVudFNlc3Npb24ucHJvbW90ZSgpOworICAgIE11dGV4OjpBdXRvbG9jayBfbChkZXYtPm1EZXZpY2VMb2NrKTsKKyAgICBpZiAoZGV2LT5tUmVtb3RlID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIHJldDsgLy8gZGV2aWNlIGhhcyBiZWVuIGNsb3NlZAorICAgIH0KKyAgICBzd2l0Y2ggKGVycm9yQ29kZSkgeworICAgICAgICBjYXNlIEVycm9yQ29kZTo6Q0FNRVJBX0RJU0NPTk5FQ1RFRDoKKyAgICAgICAgeworICAgICAgICAgICAgLy8gQ2FtZXJhIGlzIGRpc2Nvbm5lY3RlZCwgY2xvc2UgdGhlIHNlc3Npb24gYW5kIGV4cGVjdCBubyBtb3JlIGNhbGxiYWNrcworICAgICAgICAgICAgaWYgKHNlc3Npb24gIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIHNlc3Npb24tPmNsb3NlQnlEZXZpY2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRldi0+bUN1cnJlbnRTZXNzaW9uID0gbnVsbHB0cjsKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRPbkRpc2Nvbm5lY3RlZCwgZGV2LT5tSGFuZGxlcik7CisgICAgICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NvbnRleHRLZXksIGRldi0+bUFwcENhbGxiYWNrcy5jb250ZXh0KTsKKyAgICAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrRGV2aWNlS2V5LCAodm9pZCopIGRldi0+Z2V0V3JhcHBlcigpKTsKKyAgICAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKSBkZXYtPm1BcHBDYWxsYmFja3Mub25EaXNjb25uZWN0ZWQpOworICAgICAgICAgICAgbXNnLT5wb3N0KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR0UoIlVua25vd24gZXJyb3IgZnJvbSBjYW1lcmEgZGV2aWNlOiAlZCIsIGVycm9yQ29kZSk7CisgICAgICAgICAgICBbW2ZhbGx0aHJvdWdoXV07CisgICAgICAgIGNhc2UgRXJyb3JDb2RlOjpDQU1FUkFfREVWSUNFOgorICAgICAgICBjYXNlIEVycm9yQ29kZTo6Q0FNRVJBX1NFUlZJQ0U6CisgICAgICAgIHsKKyAgICAgICAgICAgIGludDMyX3QgZXJyb3JWYWwgPSA6OkVSUk9SX0NBTUVSQV9ERVZJQ0U7CisgICAgICAgICAgICAvLyBXZSBrZWVwIHRoaXMgc3dpdGNoIHNpbmNlIHRoaXMgYmxvY2sgbWlnaHQgYmUgZW5jb3VudGVyZWQgd2l0aAorICAgICAgICAgICAgLy8gbW9yZSB0aGFuIGp1c3QgMiBzdGF0ZXMuIFRoZSBkZWZhdWx0IGZhbGx0aHJvdWdoIGNvdWxkIGhhdmUgdXMKKyAgICAgICAgICAgIC8vIGhhbmRsaW5nIG1vcmUgdW5tYXRjaGVkIGVycm9yIGNhc2VzLgorICAgICAgICAgICAgc3dpdGNoIChlcnJvckNvZGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIEVycm9yQ29kZTo6Q0FNRVJBX0RFVklDRToKKyAgICAgICAgICAgICAgICAgICAgZGV2LT5zZXRDYW1lcmFEZXZpY2VFcnJvckxvY2tlZChBQ0FNRVJBX0VSUk9SX0NBTUVSQV9ERVZJQ0UpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEVycm9yQ29kZTo6Q0FNRVJBX1NFUlZJQ0U6CisgICAgICAgICAgICAgICAgICAgIGRldi0+c2V0Q2FtZXJhRGV2aWNlRXJyb3JMb2NrZWQoQUNBTUVSQV9FUlJPUl9DQU1FUkFfU0VSVklDRSk7CisgICAgICAgICAgICAgICAgICAgIGVycm9yVmFsID0gOjpFUlJPUl9DQU1FUkFfU0VSVklDRTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgZGV2LT5zZXRDYW1lcmFEZXZpY2VFcnJvckxvY2tlZChBQ0FNRVJBX0VSUk9SX1VOS05PV04pOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRPbkVycm9yLCBkZXYtPm1IYW5kbGVyKTsKKyAgICAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ29udGV4dEtleSwgZGV2LT5tQXBwQ2FsbGJhY2tzLmNvbnRleHQpOworICAgICAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtEZXZpY2VLZXksICh2b2lkKikgZGV2LT5nZXRXcmFwcGVyKCkpOworICAgICAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCopIGRldi0+bUFwcENhbGxiYWNrcy5vbkVycm9yKTsKKyAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoa0Vycm9yQ29kZUtleSwgZXJyb3JWYWwpOworICAgICAgICAgICAgbXNnLT5wb3N0KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEVycm9yQ29kZTo6Q0FNRVJBX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgRXJyb3JDb2RlOjpDQU1FUkFfUkVTVUxUOgorICAgICAgICBjYXNlIEVycm9yQ29kZTo6Q0FNRVJBX0JVRkZFUjoKKyAgICAgICAgICAgIGRldi0+b25DYXB0dXJlRXJyb3JMb2NrZWQoZXJyb3JDb2RlLCByZXN1bHRFeHRyYXMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK2FuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm48dm9pZD4KK0NhbWVyYURldmljZTo6U2VydmljZUNhbGxiYWNrOjpvbkRldmljZUlkbGUoKSB7CisgICAgQUxPR1YoIkNhbWVyYSBpcyBub3cgaWRsZSIpOworICAgIGF1dG8gcmV0ID0gVm9pZCgpOworICAgIHNwPENhbWVyYURldmljZT4gZGV2ID0gbURldmljZS5wcm9tb3RlKCk7CisgICAgaWYgKGRldiA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiByZXQ7IC8vIGRldmljZSBoYXMgYmVlbiBjbG9zZWQKKyAgICB9CisKKyAgICBNdXRleDo6QXV0b2xvY2sgX2woZGV2LT5tRGV2aWNlTG9jayk7CisgICAgaWYgKGRldi0+aXNDbG9zZWQoKSB8fCBkZXYtPm1SZW1vdGUgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGlmIChkZXYtPm1JZGxlKSB7CisgICAgICAgIC8vIEFscmVhZHkgaW4gaWRsZSBzdGF0ZS4gUG9zc2libHkgb3RoZXIgdGhyZWFkIGRpZCB3YWl0VW50aWxJZGxlCisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgaWYgKGRldi0+bUN1cnJlbnRTZXNzaW9uICE9IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIm9uRGV2aWNlSWRsZSBzZW5kaW5nIHN0YXRlIGNiIik7CisgICAgICAgIGlmIChkZXYtPm1CdXN5U2Vzc2lvbiAhPSBkZXYtPm1DdXJyZW50U2Vzc2lvbikgeworICAgICAgICAgICAgQUxPR0UoIkN1cnJlbnQgc2Vzc2lvbiAhPSBidXN5IHNlc3Npb24iKTsKKyAgICAgICAgICAgIGRldi0+c2V0Q2FtZXJhRGV2aWNlRXJyb3JMb2NrZWQoQUNBTUVSQV9FUlJPUl9DQU1FUkFfREVWSUNFKTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKworICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2Vzc2lvblN0YXRlQ2IsIGRldi0+bUhhbmRsZXIpOworICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NvbnRleHRLZXksIGRldi0+bUJ1c3lTZXNzaW9uLT5tVXNlclNlc3Npb25DYWxsYmFjay5jb250ZXh0KTsKKyAgICAgICAgbXNnLT5zZXRPYmplY3Qoa1Nlc3Npb25TcEtleSwgZGV2LT5tQnVzeVNlc3Npb24pOworICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKikgZGV2LT5tQnVzeVNlc3Npb24tPm1Vc2VyU2Vzc2lvbkNhbGxiYWNrLm9uUmVhZHkpOworICAgICAgICAvLyBNYWtlIHN1cmUgd2UgY2xlYXIgdGhlIHNwIGZpcnN0IHNvIHRoZSBzZXNzaW9uIGRlc3RydWN0b3IgY2FuCisgICAgICAgIC8vIG9ubHkgaGFwcGVuIG9uIGhhbmRsZXIgdGhyZWFkICh3aGVyZSB3ZSBkb24ndCBob2xkIGRldmljZS9zZXNzaW9uIGxvY2spCisgICAgICAgIGRldi0+bUJ1c3lTZXNzaW9uLmNsZWFyKCk7CisgICAgICAgIGRldi0+cG9zdFNlc3Npb25Nc2dBbmRDbGVhbnVwKG1zZyk7CisgICAgfQorICAgIGRldi0+bUlkbGUgPSB0cnVlOworICAgIGRldi0+bUZsdXNoaW5nID0gZmFsc2U7CisgICAgcmV0dXJuIHJldDsKK30KKworYW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjx2b2lkPgorQ2FtZXJhRGV2aWNlOjpTZXJ2aWNlQ2FsbGJhY2s6Om9uQ2FwdHVyZVN0YXJ0ZWQoCisgICAgICAgIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcywKKyAgICAgICAgdWludDY0X3QgdGltZXN0YW1wKSB7CisgICAgYXV0byByZXQgPSBWb2lkKCk7CisKKyAgICBzcDxDYW1lcmFEZXZpY2U+IGRldiA9IG1EZXZpY2UucHJvbW90ZSgpOworICAgIGlmIChkZXYgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gcmV0OyAvLyBkZXZpY2UgaGFzIGJlZW4gY2xvc2VkCisgICAgfQorICAgIE11dGV4OjpBdXRvbG9jayBfbChkZXYtPm1EZXZpY2VMb2NrKTsKKyAgICBpZiAoZGV2LT5pc0Nsb3NlZCgpIHx8IGRldi0+bVJlbW90ZSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgaW50MzJfdCBzZXF1ZW5jZUlkID0gcmVzdWx0RXh0cmFzLnJlcXVlc3RJZDsKKyAgICBpbnQzMl90IGJ1cnN0SWQgPSByZXN1bHRFeHRyYXMuYnVyc3RJZDsKKworICAgIGF1dG8gaXQgPSBkZXYtPm1TZXF1ZW5jZUNhbGxiYWNrTWFwLmZpbmQoc2VxdWVuY2VJZCk7CisgICAgaWYgKGl0ICE9IGRldi0+bVNlcXVlbmNlQ2FsbGJhY2tNYXAuZW5kKCkpIHsKKyAgICAgICAgQ2FsbGJhY2tIb2xkZXIgY2JoID0gKCppdCkuc2Vjb25kOworICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX3N0YXJ0IG9uU3RhcnQgPSBjYmgubUNhbGxiYWNrcy5vbkNhcHR1cmVTdGFydGVkOworICAgICAgICBzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+IHNlc3Npb24gPSBjYmgubVNlc3Npb247CisgICAgICAgIGlmICgoc2l6ZV90KSBidXJzdElkID49IGNiaC5tUmVxdWVzdHMuc2l6ZSgpKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEVycm9yOiByZXF1ZXN0IGluZGV4ICVkIG91dCBvZiBib3VuZCAoc2l6ZSAlenUpIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBidXJzdElkLCBjYmgubVJlcXVlc3RzLnNpemUoKSk7CisgICAgICAgICAgICBkZXYtPnNldENhbWVyYURldmljZUVycm9yTG9ja2VkKEFDQU1FUkFfRVJST1JfQ0FNRVJBX1NFUlZJQ0UpOworICAgICAgICB9CisgICAgICAgIHNwPENhcHR1cmVSZXF1ZXN0PiByZXF1ZXN0ID0gY2JoLm1SZXF1ZXN0c1tidXJzdElkXTsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdENhcHR1cmVTdGFydCwgZGV2LT5tSGFuZGxlcik7CisgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ29udGV4dEtleSwgY2JoLm1DYWxsYmFja3MuY29udGV4dCk7CisgICAgICAgIG1zZy0+c2V0T2JqZWN0KGtTZXNzaW9uU3BLZXksIHNlc3Npb24pOworICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKikgb25TdGFydCk7CisgICAgICAgIG1zZy0+c2V0T2JqZWN0KGtDYXB0dXJlUmVxdWVzdEtleSwgcmVxdWVzdCk7CisgICAgICAgIG1zZy0+c2V0SW50NjQoa1RpbWVTdGFtcEtleSwgdGltZXN0YW1wKTsKKyAgICAgICAgZGV2LT5wb3N0U2Vzc2lvbk1zZ0FuZENsZWFudXAobXNnKTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworYW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjx2b2lkPgorQ2FtZXJhRGV2aWNlOjpTZXJ2aWNlQ2FsbGJhY2s6Om9uUmVzdWx0UmVjZWl2ZWQoCisgICAgICAgIGNvbnN0IEZtcVNpemVPck1ldGFkYXRhJiByZXN1bHRNZXRhZGF0YSwKKyAgICAgICAgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzLAorICAgICAgICBjb25zdCBoaWRsX3ZlYzxQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvPiYgcGh5c2ljYWxSZXN1bHRJbmZvcykgeworICAgICh2b2lkKSBwaHlzaWNhbFJlc3VsdEluZm9zOworICAgIGF1dG8gcmV0ID0gVm9pZCgpOworCisgICAgc3A8Q2FtZXJhRGV2aWNlPiBkZXYgPSBtRGV2aWNlLnByb21vdGUoKTsKKyAgICBpZiAoZGV2ID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIHJldDsgLy8gZGV2aWNlIGhhcyBiZWVuIGNsb3NlZAorICAgIH0KKyAgICBpbnQzMl90IHNlcXVlbmNlSWQgPSByZXN1bHRFeHRyYXMucmVxdWVzdElkOworICAgIGludDY0X3QgZnJhbWVOdW1iZXIgPSByZXN1bHRFeHRyYXMuZnJhbWVOdW1iZXI7CisgICAgaW50MzJfdCBidXJzdElkID0gcmVzdWx0RXh0cmFzLmJ1cnN0SWQ7CisgICAgYm9vbCAgICBpc1BhcnRpYWxSZXN1bHQgPSAocmVzdWx0RXh0cmFzLnBhcnRpYWxSZXN1bHRDb3VudCA8IGRldi0+bVBhcnRpYWxSZXN1bHRDb3VudCk7CisKKyAgICBpZiAoIWlzUGFydGlhbFJlc3VsdCkgeworICAgICAgICBBTE9HVigiU2VxSWQgJWQgZnJhbWUgJSIgUFJJZDY0ICIgcmVzdWx0IGFycml2ZS4iLCBzZXF1ZW5jZUlkLCBmcmFtZU51bWJlcik7CisgICAgfQorCisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKGRldi0+bURldmljZUxvY2spOworICAgIGlmIChkZXYtPm1SZW1vdGUgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gcmV0OyAvLyBkZXZpY2UgaGFzIGJlZW4gZGlzY29ubmVjdGVkCisgICAgfQorCisgICAgaWYgKGRldi0+aXNDbG9zZWQoKSkgeworICAgICAgICBpZiAoIWlzUGFydGlhbFJlc3VsdCkgeworICAgICAgICAgICAgZGV2LT5tRnJhbWVOdW1iZXJUcmFja2VyLnVwZGF0ZVRyYWNrZXIoZnJhbWVOdW1iZXIsIC8qaXNFcnJvciovZmFsc2UpOworICAgICAgICB9CisgICAgICAgIC8vIGVhcmx5IHJldHVybiB0byBhdm9pZCBjYWxsYmFjayBzZW50IHRvIGNsb3NlZCBkZXZpY2VzCisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgQ2FtZXJhTWV0YWRhdGEgbWV0YWRhdGFDb3B5OworICAgIEhDYW1lcmFNZXRhZGF0YSBoQ2FtZXJhTWV0YWRhdGE7CisgICAgYm9vbCBjb252ZXJ0ZWQgPSBmYWxzZTsKKyAgICBpZiAocmVzdWx0TWV0YWRhdGEuZ2V0RGlzY3JpbWluYXRvcigpID09CisgICAgICAgIEZtcVNpemVPck1ldGFkYXRhOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmZtcU1ldGFkYXRhU2l6ZSkgeworICAgICAgICBoQ2FtZXJhTWV0YWRhdGEucmVzaXplKHJlc3VsdE1ldGFkYXRhLmZtcU1ldGFkYXRhU2l6ZSgpKTsKKyAgICAgICAgYm9vbCByZWFkID0gZGV2LT5tQ2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWUtPnJlYWQoaENhbWVyYU1ldGFkYXRhLmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0TWV0YWRhdGEuZm1xTWV0YWRhdGFTaXplKCkpOworICAgICAgICAgICAgaWYgKCFyZWFkKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzIGNhcHR1cmUgcmVxdWVzdCBzZXR0aW5ncyBjb3VsZCd0IGJlIHJlYWQgZnJvbSBmbXEiLAorICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFRPRE86IERvIHdlIGFjdHVhbGx5IG5lZWQgdG8gY2xvbmUgaGVyZSA/CisgICAgICAgICAgICBjb252ZXJ0ZWQgPSB1dGlsczo6Y29udmVydEZyb21IaWRsQ2xvbmVkKGhDYW1lcmFNZXRhZGF0YSwgJm1ldGFkYXRhQ29weSk7CisKKyAgICB9IGVsc2UgeworICAgICAgICAgIGNvbnZlcnRlZCA9IHV0aWxzOjpjb252ZXJ0RnJvbUhpZGxDbG9uZWQocmVzdWx0TWV0YWRhdGEubWV0YWRhdGEoKSwgJm1ldGFkYXRhQ29weSk7CisgICAgfQorCisgICAgaWYgKCFjb252ZXJ0ZWQpIHsKKyAgICAgICAgQUxPR0UoIiVzIHJlc3VsdCBtZXRhZGF0YSBjb3VsZG4ndCBiZSBjb252ZXJ0ZWQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIG1ldGFkYXRhQ29weS51cGRhdGUoQU5EUk9JRF9MRU5TX0lORk9fU0hBRElOR19NQVBfU0laRSwgZGV2LT5tU2hhZGluZ01hcFNpemUsIC8qZGF0YV9jb3VudCovMik7CisgICAgbWV0YWRhdGFDb3B5LnVwZGF0ZShBTkRST0lEX1NZTkNfRlJBTUVfTlVNQkVSLCAmZnJhbWVOdW1iZXIsIC8qZGF0YV9jb3VudCovMSk7CisKKyAgICBhdXRvIGl0ID0gZGV2LT5tU2VxdWVuY2VDYWxsYmFja01hcC5maW5kKHNlcXVlbmNlSWQpOworICAgIGlmIChpdCAhPSBkZXYtPm1TZXF1ZW5jZUNhbGxiYWNrTWFwLmVuZCgpKSB7CisgICAgICAgIENhbGxiYWNrSG9sZGVyIGNiaCA9ICgqaXQpLnNlY29uZDsKKyAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19yZXN1bHQgb25SZXN1bHQgPSBpc1BhcnRpYWxSZXN1bHQgPworICAgICAgICAgICAgICAgIGNiaC5tQ2FsbGJhY2tzLm9uQ2FwdHVyZVByb2dyZXNzZWQgOgorICAgICAgICAgICAgICAgIGNiaC5tQ2FsbGJhY2tzLm9uQ2FwdHVyZUNvbXBsZXRlZDsKKyAgICAgICAgc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiBzZXNzaW9uID0gY2JoLm1TZXNzaW9uOworICAgICAgICBpZiAoKHNpemVfdCkgYnVyc3RJZCA+PSBjYmgubVJlcXVlc3RzLnNpemUoKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBFcnJvcjogcmVxdWVzdCBpbmRleCAlZCBvdXQgb2YgYm91bmQgKHNpemUgJXp1KSIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYnVyc3RJZCwgY2JoLm1SZXF1ZXN0cy5zaXplKCkpOworICAgICAgICAgICAgZGV2LT5zZXRDYW1lcmFEZXZpY2VFcnJvckxvY2tlZChBQ0FNRVJBX0VSUk9SX0NBTUVSQV9TRVJWSUNFKTsKKyAgICAgICAgfQorICAgICAgICBzcDxDYXB0dXJlUmVxdWVzdD4gcmVxdWVzdCA9IGNiaC5tUmVxdWVzdHNbYnVyc3RJZF07CisgICAgICAgIHNwPEFDYW1lcmFNZXRhZGF0YT4gcmVzdWx0KG5ldyBBQ2FtZXJhTWV0YWRhdGEoCisgICAgICAgICAgICAgICAgbWV0YWRhdGFDb3B5LnJlbGVhc2UoKSwgQUNhbWVyYU1ldGFkYXRhOjpBQ01fUkVTVUxUKSk7CisKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdENhcHR1cmVSZXN1bHQsIGRldi0+bUhhbmRsZXIpOworICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NvbnRleHRLZXksIGNiaC5tQ2FsbGJhY2tzLmNvbnRleHQpOworICAgICAgICBtc2ctPnNldE9iamVjdChrU2Vzc2lvblNwS2V5LCBzZXNzaW9uKTsKKyAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCopIG9uUmVzdWx0KTsKKyAgICAgICAgbXNnLT5zZXRPYmplY3Qoa0NhcHR1cmVSZXF1ZXN0S2V5LCByZXF1ZXN0KTsKKyAgICAgICAgbXNnLT5zZXRPYmplY3Qoa0NhcHR1cmVSZXN1bHRLZXksIHJlc3VsdCk7CisgICAgICAgIGRldi0+cG9zdFNlc3Npb25Nc2dBbmRDbGVhbnVwKG1zZyk7CisgICAgfQorCisgICAgaWYgKCFpc1BhcnRpYWxSZXN1bHQpIHsKKyAgICAgICAgZGV2LT5tRnJhbWVOdW1iZXJUcmFja2VyLnVwZGF0ZVRyYWNrZXIoZnJhbWVOdW1iZXIsIC8qaXNFcnJvciovZmFsc2UpOworICAgICAgICBkZXYtPmNoZWNrQW5kRmlyZVNlcXVlbmNlQ29tcGxldGVMb2NrZWQoKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCithbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+CitDYW1lcmFEZXZpY2U6OlNlcnZpY2VDYWxsYmFjazo6b25SZXBlYXRpbmdSZXF1ZXN0RXJyb3IoCisgICAgICAgIHVpbnQ2NF90IGxhc3RGcmFtZU51bWJlciwgaW50MzJfdCBzdG9wcGVkU2VxdWVuY2VJZCkgeworICAgIGF1dG8gcmV0ID0gVm9pZCgpOworCisgICAgc3A8Q2FtZXJhRGV2aWNlPiBkZXYgPSBtRGV2aWNlLnByb21vdGUoKTsKKyAgICBpZiAoZGV2ID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIHJldDsgLy8gZGV2aWNlIGhhcyBiZWVuIGNsb3NlZAorICAgIH0KKworICAgIE11dGV4OjpBdXRvbG9jayBfbChkZXYtPm1EZXZpY2VMb2NrKTsKKworICAgIGludCByZXBlYXRpbmdTZXF1ZW5jZUlkID0gZGV2LT5tUmVwZWF0aW5nU2VxdWVuY2VJZDsKKyAgICBpZiAoc3RvcHBlZFNlcXVlbmNlSWQgPT0gcmVwZWF0aW5nU2VxdWVuY2VJZCkgeworICAgICAgICBkZXYtPm1SZXBlYXRpbmdTZXF1ZW5jZUlkID0gUkVRVUVTVF9JRF9OT05FOworICAgIH0KKworICAgIGRldi0+Y2hlY2tSZXBlYXRpbmdTZXF1ZW5jZUNvbXBsZXRlTG9ja2VkKHJlcGVhdGluZ1NlcXVlbmNlSWQsIGxhc3RGcmFtZU51bWJlcik7CisKKyAgICByZXR1cm4gcmV0OworfQorCit9IC8vIG5hbWVzcGFjZSBhY2FtCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC9BQ2FtZXJhRGV2aWNlLmggYi9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC9BQ2FtZXJhRGV2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFhMjE5ZgotLS0gL2Rldi9udWxsCisrKyBiL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFEZXZpY2UuaApAQCAtMCwwICsxLDM1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaWZuZGVmIF9BQ0FNRVJBX0RFVklDRV9ICisjZGVmaW5lIF9BQ0FNRVJBX0RFVklDRV9ICisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDxhdG9taWM+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+CisjaW5jbHVkZSA8dXRpbHMvTXV0ZXguaD4KKyNpbmNsdWRlIDx1dGlscy9MaXN0Lmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9mcmFtZXdvcmtzL2NhbWVyYXNlcnZpY2UvZGV2aWNlLzIuMC9JQ2FtZXJhRGV2aWNlVXNlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL2RldmljZS8yLjAvSUNhbWVyYURldmljZUNhbGxiYWNrLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9mcmFtZXdvcmtzL2NhbWVyYXNlcnZpY2UvZGV2aWNlLzIuMC90eXBlcy5oPgorI2luY2x1ZGUgPGZtcS9NZXNzYWdlUXVldWUuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIYW5kbGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorCisjaW5jbHVkZSA8Y2FtZXJhL05ka0NhbWVyYU1hbmFnZXIuaD4KKyNpbmNsdWRlIDxjYW1lcmEvTmRrQ2FtZXJhQ2FwdHVyZVNlc3Npb24uaD4KKyNpbmNsdWRlICJBQ2FtZXJhTWV0YWRhdGEuaCIKKyNpbmNsdWRlICJ1dGlscy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWNhbSB7CisKK3VzaW5nIElDYW1lcmFEZXZpY2VDYWxsYmFjayA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6SUNhbWVyYURldmljZUNhbGxiYWNrOwordXNpbmcgSUNhbWVyYURldmljZVVzZXIgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OklDYW1lcmFEZXZpY2VVc2VyOwordXNpbmcgQ2FwdHVyZVJlc3VsdEV4dHJhcyA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6Q2FwdHVyZVJlc3VsdEV4dHJhczsKK3VzaW5nIFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8gPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OlBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm87Cit1c2luZyBQaHlzaWNhbENhbWVyYVNldHRpbmdzID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpQaHlzaWNhbENhbWVyYVNldHRpbmdzOwordXNpbmcgU3VibWl0SW5mbyA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6U3VibWl0SW5mbzsKK3VzaW5nIENhcHR1cmVSZXN1bHRFeHRyYXMgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OkNhcHR1cmVSZXN1bHRFeHRyYXM7Cit1c2luZyBFcnJvckNvZGUgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OkVycm9yQ29kZTsKK3VzaW5nIEZtcVNpemVPck1ldGFkYXRhID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpGbXFTaXplT3JNZXRhZGF0YTsKK3VzaW5nIFN0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpTdHJlYW1Db25maWd1cmF0aW9uTW9kZTsKK3VzaW5nIFN0YXR1cyA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmNvbW1vbjo6VjJfMDo6U3RhdHVzOwordXNpbmcgUmVzdWx0TWV0YWRhdGFRdWV1ZSA9IGhhcmR3YXJlOjpNZXNzYWdlUXVldWU8dWludDhfdCwgaGFyZHdhcmU6OmtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+OwordXNpbmcgUmVxdWVzdE1ldGFkYXRhUXVldWUgPSBoYXJkd2FyZTo6TWVzc2FnZVF1ZXVlPHVpbnQ4X3QsIGhhcmR3YXJlOjprU3luY2hyb25pemVkUmVhZFdyaXRlPjsKK3VzaW5nIENhbWVyYVN0YXR1c0FuZElkID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6c2VydmljZTo6VjJfMDo6Q2FtZXJhU3RhdHVzQW5kSWQ7CisKK3VzaW5nIGhhcmR3YXJlOjpoaWRsX3ZlYzsKK3VzaW5nIGhhcmR3YXJlOjpoaWRsX3N0cmluZzsKK3VzaW5nIHV0aWxzOjpuYXRpdmVfaGFuZGxlX3B0cl93cmFwcGVyOwordXNpbmcgdXRpbHM6OkNhcHR1cmVSZXF1ZXN0OwordXNpbmcgdXRpbHM6Ok91dHB1dENvbmZpZ3VyYXRpb25XcmFwcGVyOworCisvLyBXcmFwIEFDYW1lcmFDYXB0dXJlRmFpbHVyZSBzbyBpdCBjYW4gYmUgcmVmLWNvdW50ZWQKK3N0cnVjdCBDYW1lcmFDYXB0dXJlRmFpbHVyZSA6IHB1YmxpYyBSZWZCYXNlLCBwdWJsaWMgQUNhbWVyYUNhcHR1cmVGYWlsdXJlIHsgfTsKKworY2xhc3MgQ2FtZXJhRGV2aWNlIGZpbmFsIDogcHVibGljIFJlZkJhc2UgeworICBwdWJsaWM6CisgICAgQ2FtZXJhRGV2aWNlKGNvbnN0IGNoYXIqIGlkLCBBQ2FtZXJhRGV2aWNlX1N0YXRlQ2FsbGJhY2tzKiBjYiwKKyAgICAgICAgICAgICAgICAgIHNwPEFDYW1lcmFNZXRhZGF0YT4gY2hhcnMsCisgICAgICAgICAgICAgICAgICBBQ2FtZXJhRGV2aWNlKiB3cmFwcGVyKTsKKyAgICB+Q2FtZXJhRGV2aWNlKCk7CisKKyAgICBpbmxpbmUgY29uc3QgY2hhciogZ2V0SWQoKSBjb25zdCB7IHJldHVybiBtQ2FtZXJhSWQuY19zdHIoKTsgfQorCisgICAgY2FtZXJhX3N0YXR1c190IGNyZWF0ZUNhcHR1cmVSZXF1ZXN0KAorICAgICAgICAgICAgQUNhbWVyYURldmljZV9yZXF1ZXN0X3RlbXBsYXRlIHRlbXBsYXRlSWQsCisgICAgICAgICAgICBBQ2FwdHVyZVJlcXVlc3QqKiByZXF1ZXN0KSBjb25zdDsKKworICAgIGNhbWVyYV9zdGF0dXNfdCBjcmVhdGVDYXB0dXJlU2Vzc2lvbigKKyAgICAgICAgICAgIGNvbnN0IEFDYXB0dXJlU2Vzc2lvbk91dHB1dENvbnRhaW5lciogICAgICAgb3V0cHV0cywKKyAgICAgICAgICAgIGNvbnN0IEFDYXB0dXJlUmVxdWVzdCogc2Vzc2lvblBhcmFtZXRlcnMsCisgICAgICAgICAgICBjb25zdCBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fc3RhdGVDYWxsYmFja3MqIGNhbGxiYWNrcywKKyAgICAgICAgICAgIC8qb3V0Ki9BQ2FtZXJhQ2FwdHVyZVNlc3Npb24qKiBzZXNzaW9uKTsKKworICAgIC8vIENhbGxiYWNrcyBmcm9tIGNhbWVyYSBzZXJ2aWNlCisgICAgY2xhc3MgU2VydmljZUNhbGxiYWNrIDogcHVibGljIElDYW1lcmFEZXZpY2VDYWxsYmFjayB7CisgICAgICBwdWJsaWM6CisgICAgICAgIGV4cGxpY2l0IFNlcnZpY2VDYWxsYmFjayhDYW1lcmFEZXZpY2UqIGRldmljZSkgOiBtRGV2aWNlKGRldmljZSkge30KKyAgICAgICAgYW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjx2b2lkPiBvbkRldmljZUVycm9yKEVycm9yQ29kZSBlcnJvckNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMpIG92ZXJyaWRlOworICAgICAgICBhbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IG9uRGV2aWNlSWRsZSgpIG92ZXJyaWRlOworICAgICAgICBhbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IG9uQ2FwdHVyZVN0YXJ0ZWQoY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgdGltZXN0YW1wKSBvdmVycmlkZTsKKyAgICAgICAgYW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjx2b2lkPiBvblJlc3VsdFJlY2VpdmVkKGNvbnN0IEZtcVNpemVPck1ldGFkYXRhJiByZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzxQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvPiYgcGh5c2ljYWxSZXN1bHRJbmZvcykgb3ZlcnJpZGU7CisgICAgICAgIGFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm48dm9pZD4gb25SZXBlYXRpbmdSZXF1ZXN0RXJyb3IodWludDY0X3QgbGFzdEZyYW1lTnVtYmVyLAorICAgICAgICAgICAgICAgIGludDMyX3Qgc3RvcHBlZFNlcXVlbmNlSWQpIG92ZXJyaWRlOworICAgICAgcHJpdmF0ZToKKyAgICAgICAgY29uc3Qgd3A8Q2FtZXJhRGV2aWNlPiBtRGV2aWNlOworICAgIH07CisgICAgaW5saW5lIHNwPElDYW1lcmFEZXZpY2VDYWxsYmFjaz4gZ2V0U2VydmljZUNhbGxiYWNrKCkgeworICAgICAgICByZXR1cm4gbVNlcnZpY2VDYWxsYmFjazsKKyAgICB9OworCisgICAgLy8gQ2FtZXJhIGRldmljZSBpcyBvbmx5IGZ1bmN0aW9uYWwgYWZ0ZXIgcmVtb3RlIGJlaW5nIHNldAorICAgIHZvaWQgc2V0UmVtb3RlRGV2aWNlKHNwPElDYW1lcmFEZXZpY2VVc2VyPiByZW1vdGUpOworCisgICAgYm9vbCBzZXREZXZpY2VNZXRhZGF0YVF1ZXVlcygpOworICAgIGlubGluZSBBQ2FtZXJhRGV2aWNlKiBnZXRXcmFwcGVyKCkgY29uc3QgeyByZXR1cm4gbVdyYXBwZXI7IH07CisKKyAgcHJpdmF0ZToKKyAgICBmcmllbmQgQUNhbWVyYUNhcHR1cmVTZXNzaW9uOworCisgICAgY2FtZXJhX3N0YXR1c190IGNoZWNrQ2FtZXJhQ2xvc2VkT3JFcnJvckxvY2tlZCgpIGNvbnN0OworCisgICAgLy8gZGV2aWNlIGdvZXMgaW50byBmYXRhbCBlcnJvciBzdGF0ZSBhZnRlciB0aGlzCisgICAgdm9pZCBzZXRDYW1lcmFEZXZpY2VFcnJvckxvY2tlZChjYW1lcmFfc3RhdHVzX3QgZXJyb3IpOworCisgICAgdm9pZCBkaXNjb25uZWN0TG9ja2VkKHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4mIHNlc3Npb24pOyAvLyBkaXNjb25uZWN0IGZyb20gY2FtZXJhIHNlcnZpY2UKKworICAgIGNhbWVyYV9zdGF0dXNfdCBzdG9wUmVwZWF0aW5nTG9ja2VkKCk7CisKKyAgICBjYW1lcmFfc3RhdHVzX3QgZmx1c2hMb2NrZWQoQUNhbWVyYUNhcHR1cmVTZXNzaW9uKik7CisKKyAgICBjYW1lcmFfc3RhdHVzX3Qgd2FpdFVudGlsSWRsZUxvY2tlZCgpOworCisKKyAgICBjYW1lcmFfc3RhdHVzX3QgY2FwdHVyZUxvY2tlZChzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+IHNlc3Npb24sCisgICAgICAgICAgICAvKm9wdGlvbmFsKi9BQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrcyogY2JzLAorICAgICAgICAgICAgaW50IG51bVJlcXVlc3RzLCBBQ2FwdHVyZVJlcXVlc3QqKiByZXF1ZXN0cywKKyAgICAgICAgICAgIC8qb3B0aW9uYWwqL2ludCogY2FwdHVyZVNlcXVlbmNlSWQpOworCisgICAgY2FtZXJhX3N0YXR1c190IHNldFJlcGVhdGluZ1JlcXVlc3RzTG9ja2VkKHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gc2Vzc2lvbiwKKyAgICAgICAgICAgIC8qb3B0aW9uYWwqL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tzKiBjYnMsCisgICAgICAgICAgICBpbnQgbnVtUmVxdWVzdHMsIEFDYXB0dXJlUmVxdWVzdCoqIHJlcXVlc3RzLAorICAgICAgICAgICAgLypvcHRpb25hbCovaW50KiBjYXB0dXJlU2VxdWVuY2VJZCk7CisKKyAgICBjYW1lcmFfc3RhdHVzX3Qgc3VibWl0UmVxdWVzdHNMb2NrZWQoCisgICAgICAgICAgICBzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+IHNlc3Npb24sCisgICAgICAgICAgICAvKm9wdGlvbmFsKi9BQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrcyogY2JzLAorICAgICAgICAgICAgaW50IG51bVJlcXVlc3RzLCBBQ2FwdHVyZVJlcXVlc3QqKiByZXF1ZXN0cywKKyAgICAgICAgICAgIC8qb3V0Ki9pbnQqIGNhcHR1cmVTZXF1ZW5jZUlkLAorICAgICAgICAgICAgYm9vbCBpc1JlcGVhdGluZyk7CisKKyAgICBjYW1lcmFfc3RhdHVzX3QgdXBkYXRlT3V0cHV0Q29uZmlndXJhdGlvbkxvY2tlZChBQ2FwdHVyZVNlc3Npb25PdXRwdXQgKm91dHB1dCk7CisKKyAgICBjYW1lcmFfc3RhdHVzX3QgYWxsb2NhdGVDYXB0dXJlUmVxdWVzdCgKKyAgICAgICAgICAgIGNvbnN0IEFDYXB0dXJlUmVxdWVzdCogcmVxdWVzdCwgc3A8Q2FwdHVyZVJlcXVlc3Q+JiBvdXRSZXEpOworCisgICAgc3RhdGljIEFDYXB0dXJlUmVxdWVzdCogYWxsb2NhdGVBQ2FwdHVyZVJlcXVlc3Qoc3A8Q2FwdHVyZVJlcXVlc3Q+JiByZXEpOworICAgIHN0YXRpYyB2b2lkIGZyZWVBQ2FwdHVyZVJlcXVlc3QoQUNhcHR1cmVSZXF1ZXN0Kik7CisKKyAgICAvLyBvbmx5IEZvciBzZXNzaW9uIHRvIGhvbGQgZGV2aWNlIGxvY2sKKyAgICAvLyBBbHdheXMgZ3JhYiBkZXZpY2UgbG9jayBiZWZvcmUgZ3JhYmJpbmcgc2Vzc2lvbiBsb2NrCisgICAgdm9pZCBsb2NrRGV2aWNlRm9yU2Vzc2lvbk9wcygpIGNvbnN0IHsgbURldmljZUxvY2subG9jaygpOyB9OworICAgIHZvaWQgdW5sb2NrRGV2aWNlKCkgY29uc3QgeyBtRGV2aWNlTG9jay51bmxvY2soKTsgfTsKKworICAgIC8vIEZvciBjYXB0dXJlIHNlc3Npb24gdG8gbm90aWZ5IGl0cyBlbmQgb2YgbGlmZQorICAgIHZvaWQgbm90aWZ5U2Vzc2lvbkVuZE9mTGlmZUxvY2tlZChBQ2FtZXJhQ2FwdHVyZVNlc3Npb24qIHNlc3Npb24pOworCisgICAgY2FtZXJhX3N0YXR1c190IGNvbmZpZ3VyZVN0cmVhbXNMb2NrZWQoY29uc3QgQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyKiBvdXRwdXRzLAorICAgICAgICAgICBjb25zdCBBQ2FwdHVyZVJlcXVlc3QqIHNlc3Npb25QYXJhbWV0ZXJzKTsKKworICAgIC8vIElucHV0IG1lc3NhZ2Ugd2lsbCBiZSBwb3N0ZWQgYW5kIGNsZWFyZWQgYWZ0ZXIgdGhpcyByZXR1cm5zCisgICAgdm9pZCBwb3N0U2Vzc2lvbk1zZ0FuZENsZWFudXAoc3A8QU1lc3NhZ2U+JiBtc2cpOworCisgICAgbXV0YWJsZSBNdXRleCBtRGV2aWNlTG9jazsKKyAgICBjb25zdCBoaWRsX3N0cmluZyBtQ2FtZXJhSWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDYW1lcmEgSUQKKyAgICBjb25zdCBBQ2FtZXJhRGV2aWNlX1N0YXRlQ2FsbGJhY2tzIG1BcHBDYWxsYmFja3M7IC8vIENhbGxiYWNrIHRvIGFwcAorICAgIGNvbnN0IHNwPEFDYW1lcmFNZXRhZGF0YT4gbUNoYXJzOyAgICAvLyBDYW1lcmEgY2hhcmFjdGVyaXN0aWNzCisgICAgY29uc3Qgc3A8U2VydmljZUNhbGxiYWNrPiBtU2VydmljZUNhbGxiYWNrOworICAgIEFDYW1lcmFEZXZpY2UqIG1XcmFwcGVyOworCisgICAgLy8gc3RyZWFtIGlkIC0+IHBhaXIgb2YgKEFDYW1lcmFXaW5kb3dUeXBlKiBmcm9tIGFwcGxpY2F0aW9uLCBPdXRwdXRDb25maWd1cmF0aW9uIHVzZWQgZm9yCisgICAgLy8gY2FtZXJhIHNlcnZpY2UpCisgICAgc3RkOjptYXA8aW50LCBzdGQ6OnBhaXI8bmF0aXZlX2hhbmRsZV9wdHJfd3JhcHBlciwgT3V0cHV0Q29uZmlndXJhdGlvbldyYXBwZXI+PiBtQ29uZmlndXJlZE91dHB1dHM7CisKKyAgICAvLyBUT0RPOiBtYXliZSBhIGJvb2wgd2lsbCBzdWZmaWNlIGZvciBzeW5jaHJvbm91cyBpbXBsZW1lbnRhdGlvbj8KKyAgICBzdGQ6OmF0b21pY19ib29sIG1DbG9zaW5nOworICAgIGlubGluZSBib29sIGlzQ2xvc2VkKCkgeyByZXR1cm4gbUNsb3Npbmc7IH0KKworICAgIGJvb2wgbUluRXJyb3IgPSBmYWxzZTsKKyAgICBjYW1lcmFfc3RhdHVzX3QgbUVycm9yID0gQUNBTUVSQV9PSzsKKyAgICB2b2lkIG9uQ2FwdHVyZUVycm9yTG9ja2VkKAorICAgICAgICAgICAgRXJyb3JDb2RlIGVycm9yQ29kZSwKKyAgICAgICAgICAgIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcyk7CisKKyAgICBib29sIG1JZGxlID0gdHJ1ZTsKKyAgICAvLyBUaGlzIHdpbGwgYXZvaWQgYSBidXN5IHNlc3Npb24gYmVpbmcgZGVsZXRlZCBiZWZvcmUgaXQncyBiYWNrIHRvIGlkbGUgc3RhdGUKKyAgICBzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+IG1CdXN5U2Vzc2lvbjsKKworICAgIHNwPElDYW1lcmFEZXZpY2VVc2VyPiBtUmVtb3RlOworCisgICAgLy8gTG9vcGVyIHRocmVhZCB0byBoYW5kbGUgY2FsbGJhY2sgdG8gYXBwCisgICAgc3A8QUxvb3Blcj4gbUNiTG9vcGVyOworICAgIC8vIGRlZmluaXRpb24gb2YgaGFuZGxlciBhbmQgbWVzc2FnZQorICAgIGVudW0geworICAgICAgICAvLyBEZXZpY2Ugc3RhdGUgY2FsbGJhY2tzCisgICAgICAgIGtXaGF0T25EaXNjb25uZWN0ZWQsICAgLy8gb25EaXNjb25uZWN0ZWQKKyAgICAgICAga1doYXRPbkVycm9yLCAgICAgICAgICAvLyBvbkVycm9yCisgICAgICAgIC8vIFNlc3Npb24gc3RhdGUgY2FsbGJhY2tzCisgICAgICAgIGtXaGF0U2Vzc2lvblN0YXRlQ2IsICAgLy8gb25SZWFkeSwgb25BY3RpdmUKKyAgICAgICAgLy8gQ2FwdHVyZSBjYWxsYmFja3MKKyAgICAgICAga1doYXRDYXB0dXJlU3RhcnQsICAgICAvLyBvbkNhcHR1cmVTdGFydGVkCisgICAgICAgIGtXaGF0Q2FwdHVyZVJlc3VsdCwgICAgLy8gb25DYXB0dXJlUHJvZ3Jlc3NlZCwgb25DYXB0dXJlQ29tcGxldGVkCisgICAgICAgIGtXaGF0Q2FwdHVyZUZhaWwsICAgICAgLy8gb25DYXB0dXJlRmFpbGVkCisgICAgICAgIGtXaGF0Q2FwdHVyZVNlcUVuZCwgICAgLy8gb25DYXB0dXJlU2VxdWVuY2VDb21wbGV0ZWQKKyAgICAgICAga1doYXRDYXB0dXJlU2VxQWJvcnQsICAvLyBvbkNhcHR1cmVTZXF1ZW5jZUFib3J0ZWQKKyAgICAgICAga1doYXRDYXB0dXJlQnVmZmVyTG9zdCwvLyBvbkNhcHR1cmVCdWZmZXJMb3N0CisgICAgICAgIC8vIEludGVybmFsIGNsZWFudXAKKyAgICAgICAga1doYXRDbGVhblVwU2Vzc2lvbnMgICAvLyBDbGVhbnVwIGNhY2hlZCBzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+CisgICAgfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhcioga0NvbnRleHRLZXk7CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGtEZXZpY2VLZXk7CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGtFcnJvckNvZGVLZXk7CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGtDYWxsYmFja0ZwS2V5OworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBrU2Vzc2lvblNwS2V5OworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBrQ2FwdHVyZVJlcXVlc3RLZXk7CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGtUaW1lU3RhbXBLZXk7CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGtDYXB0dXJlUmVzdWx0S2V5OworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBrQ2FwdHVyZUZhaWx1cmVLZXk7CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGtTZXF1ZW5jZUlkS2V5OworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBrRnJhbWVOdW1iZXJLZXk7CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGtBbndLZXk7CisKKyAgICBjbGFzcyBDYWxsYmFja0hhbmRsZXIgOiBwdWJsaWMgQUhhbmRsZXIgeworICAgICAgcHVibGljOgorICAgICAgICB2b2lkIG9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSBvdmVycmlkZTsKKworICAgICAgcHJpdmF0ZToKKyAgICAgICAgLy8gVGhpcyBoYW5kbGVyIHdpbGwgY2FjaGUgYWxsIGNhcHR1cmUgc2Vzc2lvbiBzcCB1bnRpbCBrV2hhdENsZWFuVXBTZXNzaW9ucworICAgICAgICAvLyBpcyBwcm9jZXNzZWQuIFRoaXMgaXMgdXNlZCB0byBndWFyYW50ZWUgdGhlIGxhc3Qgc2Vzc2lvbiByZWZlcmVuY2UgaXMgYWx3YXlzCisgICAgICAgIC8vIGJlaW5nIHJlbW92ZWQgaW4gY2FsbGJhY2sgdGhyZWFkIHdpdGhvdXQgaG9sZGluZyBjYW1lcmEgZGV2aWNlIGxvY2sKKyAgICAgICAgVmVjdG9yPHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4+IG1DYWNoZWRTZXNzaW9uczsKKyAgICB9OworICAgIHNwPENhbGxiYWNrSGFuZGxlcj4gbUhhbmRsZXI7CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgKiBDYXB0dXJlIHNlc3Npb24gcmVsYXRlZCBtZW1iZXJzICoKKyAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLy8gVGhlIGN1cnJlbnQgYWN0aXZlIHNlc3Npb24KKyAgICB3cDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+IG1DdXJyZW50U2Vzc2lvbjsKKyAgICBib29sIG1GbHVzaGluZyA9IGZhbHNlOworCisgICAgaW50IG1OZXh0U2Vzc2lvbklkID0gMDsKKyAgICAvLyBUT0RPOiBtaWdodCBuZWVkIGFub3RoZXIgbG9vcGVyL2hhbmRsZXIgdG8gaGFuZGxlIGNhbGxiYWNrcyBmcm9tIHNlcnZpY2UKKworICAgIHN0YXRpYyBjb25zdCBpbnQgUkVRVUVTVF9JRF9OT05FID0gLTE7CisgICAgaW50IG1SZXBlYXRpbmdTZXF1ZW5jZUlkID0gUkVRVUVTVF9JRF9OT05FOworCisgICAgLy8gc2VxdWVuY2UgaWQgLT4gbGFzdCBmcmFtZSBudW1iZXIgbWFwCisgICAgc3RkOjptYXA8aW50MzJfdCwgaW50NjRfdD4gbVNlcXVlbmNlTGFzdEZyYW1lTnVtYmVyTWFwOworCisgICAgc3RydWN0IENhbGxiYWNrSG9sZGVyIHsKKyAgICAgICAgQ2FsbGJhY2tIb2xkZXIoc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiAgICAgICAgICBzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWZWN0b3I8c3A8Q2FwdHVyZVJlcXVlc3Q+PiYgIHJlcXVlc3RzLAorICAgICAgICAgICAgICAgICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUmVwZWF0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrcyogY2JzKTsKKworICAgICAgICBzdGF0aWMgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3MgZmlsbENiKAorICAgICAgICAgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tzKiBjYnMpIHsKKyAgICAgICAgICAgIGlmIChjYnMgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIHJldHVybiAqY2JzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHsgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0ciB9OworICAgICAgICB9CisKKyAgICAgICAgc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiAgIG1TZXNzaW9uOworICAgICAgICBWZWN0b3I8c3A8Q2FwdHVyZVJlcXVlc3Q+PiBtUmVxdWVzdHM7CisgICAgICAgIGNvbnN0IGJvb2wgICAgICAgICAgICAgICAgICBtSXNSZXBlYXRpbmc7CisgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tzIG1DYWxsYmFja3M7CisgICAgfTsKKyAgICAvLyBzZXF1ZW5jZSBpZCAtPiBjYWxsYmFja3MgbWFwCisgICAgc3RkOjptYXA8aW50LCBDYWxsYmFja0hvbGRlcj4gbVNlcXVlbmNlQ2FsbGJhY2tNYXA7CisKKyAgICBzdGF0aWMgY29uc3QgaW50NjRfdCBOT19GUkFNRVNfQ0FQVFVSRUQgPSAtMTsKKyAgICBjbGFzcyBGcmFtZU51bWJlclRyYWNrZXIgeworICAgICAgcHVibGljOgorICAgICAgICAvLyBUT0RPOiBDYWxsZWQgaW4gb25SZXN1bHRSZWNlaXZlZCBhbmQgb25DYXB0dXJlRXJyb3JMb2NrZWQKKyAgICAgICAgdm9pZCB1cGRhdGVUcmFja2VyKGludDY0X3QgZnJhbWVOdW1iZXIsIGJvb2wgaXNFcnJvcik7CisgICAgICAgIGlubGluZSBpbnQ2NF90IGdldENvbXBsZXRlZEZyYW1lTnVtYmVyKCkgeyByZXR1cm4gbUNvbXBsZXRlZEZyYW1lTnVtYmVyOyB9CisgICAgICBwcml2YXRlOgorICAgICAgICB2b2lkIHVwZGF0ZSgpOworICAgICAgICB2b2lkIHVwZGF0ZUNvbXBsZXRlZEZyYW1lTnVtYmVyKGludDY0X3QgZnJhbWVOdW1iZXIpOworCisgICAgICAgIGludDY0X3QgbUNvbXBsZXRlZEZyYW1lTnVtYmVyID0gTk9fRlJBTUVTX0NBUFRVUkVEOworICAgICAgICBMaXN0PGludDY0X3Q+IG1Ta2lwcGVkRnJhbWVOdW1iZXJzOworICAgICAgICBzdGQ6OnNldDxpbnQ2NF90PiBtRnV0dXJlRXJyb3JTZXQ7CisgICAgfTsKKyAgICBGcmFtZU51bWJlclRyYWNrZXIgbUZyYW1lTnVtYmVyVHJhY2tlcjsKKworICAgIHZvaWQgY2hlY2tSZXBlYXRpbmdTZXF1ZW5jZUNvbXBsZXRlTG9ja2VkKGNvbnN0IGludCBzZXF1ZW5jZUlkLCBjb25zdCBpbnQ2NF90IGxhc3RGcmFtZU51bWJlcik7CisgICAgdm9pZCBjaGVja0FuZEZpcmVTZXF1ZW5jZUNvbXBsZXRlTG9ja2VkKCk7CisKKyAgICAvLyBNaXNjIHZhcmlhYmxlcworICAgIGludDMyX3QgbVNoYWRpbmdNYXBTaXplWzJdOyAgIC8vIGNvbnN0IGFmdGVyIGNvbnN0cnVjdG9yCisgICAgaW50MzJfdCBtUGFydGlhbFJlc3VsdENvdW50OyAgLy8gY29uc3QgYWZ0ZXIgY29uc3RydWN0b3IKKyAgICBzdGQ6OnNoYXJlZF9wdHI8UmVzdWx0TWV0YWRhdGFRdWV1ZT4gbUNhcHR1cmVSZXF1ZXN0TWV0YWRhdGFRdWV1ZSA9IG51bGxwdHI7CisgICAgc3RkOjpzaGFyZWRfcHRyPFJlc3VsdE1ldGFkYXRhUXVldWU+IG1DYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZSA9IG51bGxwdHI7Cit9OworCit9IC8vIG5hbWVzcGFjZSBhY2FtOworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZDsKKworLyoqCisgKiBBQ2FtZXJhRGV2aWNlIG9wYXF1ZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICogTGVhdmUgb3V0c2lkZSBvZiBhbmRyb2lkIG5hbWVzcGFjZSBiZWNhdXNlIGl0J3MgTkRLIHN0cnVjdAorICovCitzdHJ1Y3QgQUNhbWVyYURldmljZSB7CisgICAgQUNhbWVyYURldmljZShjb25zdCBjaGFyKiBpZCwgQUNhbWVyYURldmljZV9TdGF0ZUNhbGxiYWNrcyogY2IsCisgICAgICAgICAgICAgICAgICBzcDxBQ2FtZXJhTWV0YWRhdGE+IGNoYXJzKSA6CisgICAgICAgICAgICBtRGV2aWNlKG5ldyBhbmRyb2lkOjphY2FtOjpDYW1lcmFEZXZpY2UoaWQsIGNiLCBzdGQ6Om1vdmUoY2hhcnMpLCB0aGlzKSkge30KKworICAgIH5BQ2FtZXJhRGV2aWNlKCkge307CisKKyAgICAvKioqKioqKioqKioqKioqKioqKgorICAgICAqIE5ESyBwdWJsaWMgQVBJcyAqCisgICAgICoqKioqKioqKioqKioqKioqKiovCisgICAgaW5saW5lIGNvbnN0IGNoYXIqIGdldElkKCkgY29uc3QgeyByZXR1cm4gbURldmljZS0+Z2V0SWQoKTsgfQorCisgICAgY2FtZXJhX3N0YXR1c190IGNyZWF0ZUNhcHR1cmVSZXF1ZXN0KAorICAgICAgICAgICAgQUNhbWVyYURldmljZV9yZXF1ZXN0X3RlbXBsYXRlIHRlbXBsYXRlSWQsCisgICAgICAgICAgICBBQ2FwdHVyZVJlcXVlc3QqKiByZXF1ZXN0KSBjb25zdCB7CisgICAgICAgIHJldHVybiBtRGV2aWNlLT5jcmVhdGVDYXB0dXJlUmVxdWVzdCh0ZW1wbGF0ZUlkLCByZXF1ZXN0KTsKKyAgICB9CisKKyAgICBjYW1lcmFfc3RhdHVzX3QgY3JlYXRlQ2FwdHVyZVNlc3Npb24oCisgICAgICAgICAgICBjb25zdCBBQ2FwdHVyZVNlc3Npb25PdXRwdXRDb250YWluZXIqICAgICAgIG91dHB1dHMsCisgICAgICAgICAgICBjb25zdCBBQ2FwdHVyZVJlcXVlc3QqIHNlc3Npb25QYXJhbWV0ZXJzLAorICAgICAgICAgICAgY29uc3QgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX3N0YXRlQ2FsbGJhY2tzKiBjYWxsYmFja3MsCisgICAgICAgICAgICAvKm91dCovQUNhbWVyYUNhcHR1cmVTZXNzaW9uKiogc2Vzc2lvbikgeworICAgICAgICByZXR1cm4gbURldmljZS0+Y3JlYXRlQ2FwdHVyZVNlc3Npb24ob3V0cHV0cywgc2Vzc2lvblBhcmFtZXRlcnMsIGNhbGxiYWNrcywgc2Vzc2lvbik7CisgICAgfQorCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqCisgICAgICogRGV2aWNlIGludGVyYWwgQVBJcyAqCisgICAgICoqKioqKioqKioqKioqKioqKioqKioqLworICAgIGlubGluZSBhbmRyb2lkOjpzcDxhbmRyb2lkOjphY2FtOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2s+IGdldFNlcnZpY2VDYWxsYmFjaygpIHsKKyAgICAgICAgcmV0dXJuIG1EZXZpY2UtPmdldFNlcnZpY2VDYWxsYmFjaygpOworICAgIH07CisKKyAgICAvLyBDYW1lcmEgZGV2aWNlIGlzIG9ubHkgZnVuY3Rpb25hbCBhZnRlciByZW1vdGUgYmVpbmcgc2V0CisgICAgaW5saW5lIHZvaWQgc2V0UmVtb3RlRGV2aWNlKGFuZHJvaWQ6OnNwPGFuZHJvaWQ6OmFjYW06OklDYW1lcmFEZXZpY2VVc2VyPiByZW1vdGUpIHsKKyAgICAgICAgbURldmljZS0+c2V0UmVtb3RlRGV2aWNlKHJlbW90ZSk7CisgICAgfQorICAgIGlubGluZSBib29sIHNldERldmljZU1ldGFkYXRhUXVldWVzKCkgeworICAgICAgICByZXR1cm4gbURldmljZS0+c2V0RGV2aWNlTWV0YWRhdGFRdWV1ZXMoKTsKKyAgICB9CisgIHByaXZhdGU6CisgICAgYW5kcm9pZDo6c3A8YW5kcm9pZDo6YWNhbTo6Q2FtZXJhRGV2aWNlPiBtRGV2aWNlOworfTsKKworI2VuZGlmIC8vIF9BQ0FNRVJBX0RFVklDRV9ICmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC9BQ2FtZXJhTWFuYWdlci5jcHAgYi9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC9BQ2FtZXJhTWFuYWdlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM5NWI0NAotLS0gL2Rldi9udWxsCisrKyBiL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFNYW5hZ2VyLmNwcApAQCAtMCwwICsxLDQ1OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQUNhbWVyYU1hbmFnZXJWZW5kb3IiCisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSAibmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFNYW5hZ2VyLmgiCisjaW5jbHVkZSAiQUNhbWVyYU1ldGFkYXRhLmgiCisjaW5jbHVkZSAibmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFEZXZpY2UuaCIKKyNpbmNsdWRlICJ1dGlscy5oIgorCisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgPFZlbmRvclRhZ0Rlc2NyaXB0b3IuaD4KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmFjYW07CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhY2FtIHsKKwordXNpbmcgQ2FtZXJhU3RhdHVzQW5kSWQgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpzZXJ2aWNlOjpWMl8wOjpDYW1lcmFTdGF0dXNBbmRJZDsKKworLy8gU3RhdGljIG1lbWJlciBkZWZpbml0aW9ucworY29uc3QgY2hhciogQ2FtZXJhTWFuYWdlckdsb2JhbDo6a0NhbWVyYUlkS2V5ICAgPSAiQ2FtZXJhSWQiOworY29uc3QgY2hhciogQ2FtZXJhTWFuYWdlckdsb2JhbDo6a0NhbGxiYWNrRnBLZXkgPSAiQ2FsbGJhY2tGcCI7Citjb25zdCBjaGFyKiBDYW1lcmFNYW5hZ2VyR2xvYmFsOjprQ29udGV4dEtleSAgICA9ICJDYWxsYmFja0NvbnRleHQiOworTXV0ZXggICAgICAgICAgICAgICAgQ2FtZXJhTWFuYWdlckdsb2JhbDo6c0xvY2s7CitDYW1lcmFNYW5hZ2VyR2xvYmFsKiBDYW1lcmFNYW5hZ2VyR2xvYmFsOjpzSW5zdGFuY2UgPSBudWxscHRyOworCitDYW1lcmFNYW5hZ2VyR2xvYmFsJgorQ2FtZXJhTWFuYWdlckdsb2JhbDo6Z2V0SW5zdGFuY2UoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKHNMb2NrKTsKKyAgICBDYW1lcmFNYW5hZ2VyR2xvYmFsKiBpbnN0YW5jZSA9IHNJbnN0YW5jZTsKKyAgICBpZiAoaW5zdGFuY2UgPT0gbnVsbHB0cikgeworICAgICAgICBpbnN0YW5jZSA9IG5ldyBDYW1lcmFNYW5hZ2VyR2xvYmFsKCk7CisgICAgICAgIHNJbnN0YW5jZSA9IGluc3RhbmNlOworICAgIH0KKyAgICByZXR1cm4gKmluc3RhbmNlOworfQorCitDYW1lcmFNYW5hZ2VyR2xvYmFsOjp+Q2FtZXJhTWFuYWdlckdsb2JhbCgpIHsKKyAgICAvLyBjbGVhciBzSW5zdGFuY2Ugc28gbmV4dCBnZXRJbnN0YW5jZSBjYWxsIGtub3dzIHRvIGNyZWF0ZSBhIG5ldyBvbmUKKyAgICBNdXRleDo6QXV0b2xvY2sgX3NsKHNMb2NrKTsKKyAgICBzSW5zdGFuY2UgPSBudWxscHRyOworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1DYW1lcmFTZXJ2aWNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgbUNhbWVyYVNlcnZpY2UtPnVubGlua1RvRGVhdGgobURlYXRoTm90aWZpZXIpOworICAgICAgICBtQ2FtZXJhU2VydmljZS0+cmVtb3ZlTGlzdGVuZXIobUNhbWVyYVNlcnZpY2VMaXN0ZW5lcik7CisgICAgfQorICAgIG1EZWF0aE5vdGlmaWVyLmNsZWFyKCk7CisgICAgaWYgKG1DYkxvb3BlciAhPSBudWxscHRyKSB7CisgICAgICAgIG1DYkxvb3Blci0+dW5yZWdpc3RlckhhbmRsZXIobUhhbmRsZXItPmlkKCkpOworICAgICAgICBtQ2JMb29wZXItPnN0b3AoKTsKKyAgICB9CisgICAgbUNiTG9vcGVyLmNsZWFyKCk7CisgICAgbUhhbmRsZXIuY2xlYXIoKTsKKyAgICBtQ2FtZXJhU2VydmljZUxpc3RlbmVyLmNsZWFyKCk7CisgICAgbUNhbWVyYVNlcnZpY2UuY2xlYXIoKTsKK30KKworc3RhdGljIGJvb2wgaXNDYW1lcmFTZXJ2aWNlRGlzYWJsZWQoKSB7CisgICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgIHByb3BlcnR5X2dldCgiY29uZmlnLmRpc2FibGVfY2FtZXJhc2VydmljZSIsIHZhbHVlLCAiMCIpOworICAgIHJldHVybiAoc3RybmNtcCh2YWx1ZSwgIjAiLCAyKSAhPSAwICYmIHN0cm5jYXNlY21wKHZhbHVlLCAiZmFsc2UiLCA2KSAhPSAwKTsKK30KKworLy8gVE9ETzogQWRkIGJhY2sgd2hlbiB2ZW5kb3IgdGFncyBhcmUgc3VwcG9ydGVkIGZvciBsaWJjYW1lcmEybmRrX3ZlbmRvciB3aGVuCisvLyAgICAgICB0aGUgSElETCBpbnRlcmZhY2Ugc3VwcG9ydHMgcXVlcnlpbmcgYnkgdmVuZG9yIGlkLgorCitzcDxJQ2FtZXJhU2VydmljZT4gQ2FtZXJhTWFuYWdlckdsb2JhbDo6Z2V0Q2FtZXJhU2VydmljZSgpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtQ2FtZXJhU2VydmljZS5nZXQoKSA9PSBudWxscHRyKSB7CisgICAgICAgIGlmIChpc0NhbWVyYVNlcnZpY2VEaXNhYmxlZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gbUNhbWVyYVNlcnZpY2U7CisgICAgICAgIH0KKworICAgICAgICBzcDxJQ2FtZXJhU2VydmljZT4gY2FtZXJhU2VydmljZUJpbmRlcjsKKyAgICAgICAgZG8geworICAgICAgICAgICAgY2FtZXJhU2VydmljZUJpbmRlciA9IElDYW1lcmFTZXJ2aWNlOjpnZXRTZXJ2aWNlKCk7CisgICAgICAgICAgICBpZiAoY2FtZXJhU2VydmljZUJpbmRlciAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBTE9HVygiQ2FtZXJhU2VydmljZSBub3QgcHVibGlzaGVkLCB3YWl0aW5nLi4uIik7CisgICAgICAgICAgICB1c2xlZXAoa0NhbWVyYVNlcnZpY2VQb2xsRGVsYXkpOworICAgICAgICB9IHdoaWxlKHRydWUpOworICAgICAgICBpZiAobURlYXRoTm90aWZpZXIgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgbURlYXRoTm90aWZpZXIgPSBuZXcgRGVhdGhOb3RpZmllcih0aGlzKTsKKyAgICAgICAgfQorICAgICAgICBjYW1lcmFTZXJ2aWNlQmluZGVyLT5saW5rVG9EZWF0aChtRGVhdGhOb3RpZmllciwgMCk7CisgICAgICAgIG1DYW1lcmFTZXJ2aWNlID0gY2FtZXJhU2VydmljZUJpbmRlcjsKKworICAgICAgICAvLyBTZXR1cCBsb29wZXIgdGhyZWFkIHRvIHBlcmZyb20gYXZhaWxpYWJpbGl0eSBjYWxsYmFja3MKKyAgICAgICAgaWYgKG1DYkxvb3BlciA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBtQ2JMb29wZXIgPSBuZXcgQUxvb3BlcjsKKyAgICAgICAgICAgIG1DYkxvb3Blci0+c2V0TmFtZSgiQzJOLW1nci1sb29wZXIiKTsKKyAgICAgICAgICAgIHN0YXR1c190IGVyciA9IG1DYkxvb3Blci0+c3RhcnQoCisgICAgICAgICAgICAgICAgICAgIC8qcnVuT25DYWxsaW5nVGhyZWFkKi9mYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgLypjYW5DYWxsSmF2YSovICAgICAgIHRydWUsCisgICAgICAgICAgICAgICAgICAgIFBSSU9SSVRZX0RFRkFVTFQpOworICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIHN0YXJ0IGNhbWVyYSBzZXJ2aWNlIGxpc3RlbmVyIGxvb3BlcjogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1lcnIpLCBlcnIpOworICAgICAgICAgICAgICAgIG1DYkxvb3Blci5jbGVhcigpOworICAgICAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1IYW5kbGVyID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBtSGFuZGxlciA9IG5ldyBDYWxsYmFja0hhbmRsZXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1DYkxvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKG1IYW5kbGVyKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHJlZ2lzdGVyIElDYW1lcmFTZXJ2aWNlTGlzdGVuZXIKKyAgICAgICAgaWYgKG1DYW1lcmFTZXJ2aWNlTGlzdGVuZXIgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgbUNhbWVyYVNlcnZpY2VMaXN0ZW5lciA9IG5ldyBDYW1lcmFTZXJ2aWNlTGlzdGVuZXIodGhpcyk7CisgICAgICAgIH0KKyAgICAgICAgaGlkbF92ZWM8Q2FtZXJhU3RhdHVzQW5kSWQ+IGNhbWVyYVN0YXR1c2Vze307CisgICAgICAgIFN0YXR1cyBzdGF0dXMgPSBTdGF0dXM6Ok5PX0VSUk9SOworICAgICAgICBhdXRvIHJlbW90ZVJldCA9IG1DYW1lcmFTZXJ2aWNlLT5hZGRMaXN0ZW5lcihtQ2FtZXJhU2VydmljZUxpc3RlbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJnN0YXR1cywgJmNhbWVyYVN0YXR1c2VzXShTdGF0dXMgcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0byAmcmV0U3RhdHVzZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmFTdGF0dXNlcyA9IHJldFN0YXR1c2VzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgaWYgKCFyZW1vdGVSZXQuaXNPaygpIHx8IHN0YXR1cyAhPSBTdGF0dXM6Ok5PX0VSUk9SKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGFkZCBsaXN0ZW5lciB0byBjYW1lcmEgc2VydmljZSAlcyIsIHJlbW90ZVJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgICAgICB9CisgICAgICAgIGZvciAoYXV0byYgYyA6IGNhbWVyYVN0YXR1c2VzKSB7CisgICAgICAgICAgICBvblN0YXR1c0NoYW5nZWRMb2NrZWQoYyk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG1DYW1lcmFTZXJ2aWNlOworfQorCit2b2lkIENhbWVyYU1hbmFnZXJHbG9iYWw6OkRlYXRoTm90aWZpZXI6OnNlcnZpY2VEaWVkKHVpbnQ2NF90IGNvb2tpZSwgY29uc3Qgd3A8SUJhc2U+ICZ3aG8pIHsKKyAgICAodm9pZCkgY29va2llOworICAgICh2b2lkKSB3aG87CisgICAgQUxPR0UoIkNhbWVyYSBzZXJ2aWNlIGJpbmRlckRpZWQhIik7CisgICAgc3A8Q2FtZXJhTWFuYWdlckdsb2JhbD4gY20gPSBtQ2FtZXJhTWFuYWdlci5wcm9tb3RlKCk7CisgICAgaWYgKGNtICE9IG51bGxwdHIpIHsKKyAgICAgICAgQXV0b011dGV4IGxvY2soY20tPm1Mb2NrKTsKKyAgICAgICAgZm9yIChhdXRvJiBwYWlyIDogY20tPm1EZXZpY2VTdGF0dXNNYXApIHsKKyAgICAgICAgICAgIENhbWVyYVN0YXR1c0FuZElkIGNhbWVyYVN0YXR1c0FuZElkOworICAgICAgICAgICAgY2FtZXJhU3RhdHVzQW5kSWQuY2FtZXJhSWQgPSBwYWlyLmZpcnN0OworICAgICAgICAgICAgY2FtZXJhU3RhdHVzQW5kSWQuZGV2aWNlU3RhdHVzID0gcGFpci5zZWNvbmQ7CisgICAgICAgICAgICBjbS0+b25TdGF0dXNDaGFuZ2VkTG9ja2VkKGNhbWVyYVN0YXR1c0FuZElkKTsKKyAgICAgICAgfQorICAgICAgICBjbS0+bUNhbWVyYVNlcnZpY2UuY2xlYXIoKTsKKyAgICAgICAgLy8gVE9ETzogY29uc2lkZXIgYWRkaW5nIHJlLWNvbm5lY3QgY2FsbCBoZXJlPworICAgIH0KK30KKwordm9pZCBDYW1lcmFNYW5hZ2VyR2xvYmFsOjpyZWdpc3RlckF2YWlsYWJpbGl0eUNhbGxiYWNrKAorICAgICAgICBjb25zdCBBQ2FtZXJhTWFuYWdlcl9BdmFpbGFiaWxpdHlDYWxsYmFja3MgKmNhbGxiYWNrKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBDYWxsYmFjayBjYihjYWxsYmFjayk7CisgICAgYXV0byBwYWlyID0gbUNhbGxiYWNrcy5pbnNlcnQoY2IpOworICAgIC8vIFNlbmQgaW5pdGlhbCBjYWxsYmFja3MgaWYgY2FsbGJhY2sgaXMgbmV3bHkgcmVnaXN0ZXJlZAorICAgIGlmIChwYWlyLnNlY29uZCkgeworICAgICAgICBmb3IgKGF1dG8mIHBhaXIgOiBtRGV2aWNlU3RhdHVzTWFwKSB7CisgICAgICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgY2FtZXJhSWQgPSBwYWlyLmZpcnN0OworICAgICAgICAgICAgQ2FtZXJhRGV2aWNlU3RhdHVzIHN0YXR1cyA9IHBhaXIuc2Vjb25kOworCisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2VuZFNpbmdsZUNhbGxiYWNrLCBtSGFuZGxlcik7CisgICAgICAgICAgICBBQ2FtZXJhTWFuYWdlcl9BdmFpbGFiaWxpdHlDYWxsYmFjayBjYiA9IGlzU3RhdHVzQXZhaWxhYmxlKHN0YXR1cykgPworICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay0+b25DYW1lcmFBdmFpbGFibGUgOiBjYWxsYmFjay0+b25DYW1lcmFVbmF2YWlsYWJsZTsKKyAgICAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQgKikgY2IpOworICAgICAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDb250ZXh0S2V5LCBjYWxsYmFjay0+Y29udGV4dCk7CisgICAgICAgICAgICBtc2ctPnNldFN0cmluZyhrQ2FtZXJhSWRLZXksIEFTdHJpbmcoY2FtZXJhSWQuY19zdHIoKSkpOworICAgICAgICAgICAgbXNnLT5wb3N0KCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgQ2FtZXJhTWFuYWdlckdsb2JhbDo6dW5yZWdpc3RlckF2YWlsYWJpbGl0eUNhbGxiYWNrKAorICAgICAgICBjb25zdCBBQ2FtZXJhTWFuYWdlcl9BdmFpbGFiaWxpdHlDYWxsYmFja3MgKmNhbGxiYWNrKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBDYWxsYmFjayBjYihjYWxsYmFjayk7CisgICAgbUNhbGxiYWNrcy5lcmFzZShjYik7Cit9CisKK3ZvaWQgQ2FtZXJhTWFuYWdlckdsb2JhbDo6Z2V0Q2FtZXJhSWRMaXN0KHN0ZDo6dmVjdG9yPGhpZGxfc3RyaW5nPiogY2FtZXJhSWRzKSB7CisgICAgLy8gRW5zdXJlIHRoYXQgd2UgaGF2ZSBpbml0aWFsaXplZC9yZWZyZXNoZWQgdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIGRldmljZXMKKyAgICBhdXRvIGNzID0gZ2V0Q2FtZXJhU2VydmljZSgpOworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisKKyAgICBmb3IoYXV0byYgZGV2aWNlU3RhdHVzIDogbURldmljZVN0YXR1c01hcCkgeworICAgICAgICBpZiAoZGV2aWNlU3RhdHVzLnNlY29uZCA9PSBDYW1lcmFEZXZpY2VTdGF0dXM6OlNUQVRVU19OT1RfUFJFU0VOVCB8fAorICAgICAgICAgICAgICAgIGRldmljZVN0YXR1cy5zZWNvbmQgPT0gQ2FtZXJhRGV2aWNlU3RhdHVzOjpTVEFUVVNfRU5VTUVSQVRJTkcpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGNhbWVyYUlkcy0+cHVzaF9iYWNrKGRldmljZVN0YXR1cy5maXJzdCk7CisgICAgfQorfQorCitib29sIENhbWVyYU1hbmFnZXJHbG9iYWw6OnZhbGlkU3RhdHVzKENhbWVyYURldmljZVN0YXR1cyBzdGF0dXMpIHsKKyAgICBzd2l0Y2ggKHN0YXR1cykgeworICAgICAgICBjYXNlIENhbWVyYURldmljZVN0YXR1czo6U1RBVFVTX05PVF9QUkVTRU5UOgorICAgICAgICBjYXNlIENhbWVyYURldmljZVN0YXR1czo6U1RBVFVTX1BSRVNFTlQ6CisgICAgICAgIGNhc2UgQ2FtZXJhRGV2aWNlU3RhdHVzOjpTVEFUVVNfRU5VTUVSQVRJTkc6CisgICAgICAgIGNhc2UgQ2FtZXJhRGV2aWNlU3RhdHVzOjpTVEFUVVNfTk9UX0FWQUlMQUJMRToKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK30KKworYm9vbCBDYW1lcmFNYW5hZ2VyR2xvYmFsOjppc1N0YXR1c0F2YWlsYWJsZShDYW1lcmFEZXZpY2VTdGF0dXMgc3RhdHVzKSB7CisgICAgc3dpdGNoIChzdGF0dXMpIHsKKyAgICAgICAgY2FzZSBDYW1lcmFEZXZpY2VTdGF0dXM6OlNUQVRVU19QUkVTRU5UOgorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfQorCit2b2lkIENhbWVyYU1hbmFnZXJHbG9iYWw6OkNhbGxiYWNrSGFuZGxlcjo6b25NZXNzYWdlUmVjZWl2ZWQoCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgc3dpdGNoIChtc2ctPndoYXQoKSkgeworICAgICAgICBjYXNlIGtXaGF0U2VuZFNpbmdsZUNhbGxiYWNrOgorICAgICAgICB7CisgICAgICAgICAgICBBQ2FtZXJhTWFuYWdlcl9BdmFpbGFiaWxpdHlDYWxsYmFjayBjYjsKKyAgICAgICAgICAgIHZvaWQqIGNvbnRleHQ7CisgICAgICAgICAgICBBU3RyaW5nIGNhbWVyYUlkOworICAgICAgICAgICAgYm9vbCBmb3VuZCA9IG1zZy0+ZmluZFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKiopICZjYik7CisgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBjYW1lcmEgY2FsbGJhY2sgZnAhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZFBvaW50ZXIoa0NvbnRleHRLZXksICZjb250ZXh0KTsKKyAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCBmaW5kIGNhbGxiYWNrIGNvbnRleHQhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZFN0cmluZyhrQ2FtZXJhSWRLZXksICZjYW1lcmFJZCk7CisgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBjYW1lcmEgSUQhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICAoKmNiKShjb250ZXh0LCBjYW1lcmFJZC5jX3N0cigpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HRSgiJXM6IHVua25vd24gbWVzc2FnZSB0eXBlICVkIiwgX19GVU5DVElPTl9fLCBtc2ctPndoYXQoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK2hhcmR3YXJlOjpSZXR1cm48dm9pZD4gQ2FtZXJhTWFuYWdlckdsb2JhbDo6Q2FtZXJhU2VydmljZUxpc3RlbmVyOjpvblN0YXR1c0NoYW5nZWQoCisgICAgICAgIGNvbnN0IENhbWVyYVN0YXR1c0FuZElkICZzdGF0dXNBbmRJZCkgeworICAgIHNwPENhbWVyYU1hbmFnZXJHbG9iYWw+IGNtID0gbUNhbWVyYU1hbmFnZXIucHJvbW90ZSgpOworICAgIGlmIChjbSAhPSBudWxscHRyKSB7CisgICAgICAgIGNtLT5vblN0YXR1c0NoYW5nZWQoc3RhdHVzQW5kSWQpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCJDYW5ub3QgZGVsaXZlciBzdGF0dXMgY2hhbmdlLiBHbG9iYWwgY2FtZXJhIG1hbmFnZXIgZGllZCIpOworICAgIH0KKyAgICByZXR1cm4gVm9pZCgpOworfQorCit2b2lkIENhbWVyYU1hbmFnZXJHbG9iYWw6Om9uU3RhdHVzQ2hhbmdlZCgKKyAgICAgICAgY29uc3QgQ2FtZXJhU3RhdHVzQW5kSWQgJnN0YXR1c0FuZElkKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBvblN0YXR1c0NoYW5nZWRMb2NrZWQoc3RhdHVzQW5kSWQpOworfQorCit2b2lkIENhbWVyYU1hbmFnZXJHbG9iYWw6Om9uU3RhdHVzQ2hhbmdlZExvY2tlZCgKKyAgICAgICAgY29uc3QgQ2FtZXJhU3RhdHVzQW5kSWQgJnN0YXR1c0FuZElkKSB7CisgICAgaGlkbF9zdHJpbmcgY2FtZXJhSWQgPSBzdGF0dXNBbmRJZC5jYW1lcmFJZDsKKyAgICBDYW1lcmFEZXZpY2VTdGF0dXMgc3RhdHVzID0gc3RhdHVzQW5kSWQuZGV2aWNlU3RhdHVzOworICAgIGlmICghdmFsaWRTdGF0dXMoc3RhdHVzKSkgeworICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgc3RhdHVzICVkIiwgX19GVU5DVElPTl9fLCBzdGF0dXMpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYm9vbCBmaXJzdFN0YXR1cyA9IChtRGV2aWNlU3RhdHVzTWFwLmNvdW50KGNhbWVyYUlkKSA9PSAwKTsKKyAgICBDYW1lcmFEZXZpY2VTdGF0dXMgb2xkU3RhdHVzID0gZmlyc3RTdGF0dXMgPworICAgICAgICAgICAgc3RhdHVzIDogLy8gZmlyc3Qgc3RhdHVzCisgICAgICAgICAgICBtRGV2aWNlU3RhdHVzTWFwW2NhbWVyYUlkXTsKKworICAgIGlmICghZmlyc3RTdGF0dXMgJiYKKyAgICAgICAgICAgIGlzU3RhdHVzQXZhaWxhYmxlKHN0YXR1cykgPT0gaXNTdGF0dXNBdmFpbGFibGUob2xkU3RhdHVzKSkgeworICAgICAgICAvLyBObyBzdGF0dXMgdXBkYXRlLiBObyBuZWVkIHRvIHNlbmQgY2FsbGJhY2sKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCBhbGwgcmVnaXN0ZXJlZCBjYWxsYmFja3MKKyAgICBtRGV2aWNlU3RhdHVzTWFwW2NhbWVyYUlkXSA9IHN0YXR1czsKKyAgICBmb3IgKGF1dG8gY2IgOiBtQ2FsbGJhY2tzKSB7CisgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZW5kU2luZ2xlQ2FsbGJhY2ssIG1IYW5kbGVyKTsKKyAgICAgICAgQUNhbWVyYU1hbmFnZXJfQXZhaWxhYmlsaXR5Q2FsbGJhY2sgY2JGcCA9IGlzU3RhdHVzQXZhaWxhYmxlKHN0YXR1cykgPworICAgICAgICAgICAgICAgIGNiLm1BdmFpbGFibGUgOiBjYi5tVW5hdmFpbGFibGU7CisgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQgKikgY2JGcCk7CisgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ29udGV4dEtleSwgY2IubUNvbnRleHQpOworICAgICAgICBtc2ctPnNldFN0cmluZyhrQ2FtZXJhSWRLZXksIEFTdHJpbmcoY2FtZXJhSWQuY19zdHIoKSkpOworICAgICAgICBtc2ctPnBvc3QoKTsKKyAgICB9CisgICAgaWYgKHN0YXR1cyA9PSBDYW1lcmFEZXZpY2VTdGF0dXM6OlNUQVRVU19OT1RfUFJFU0VOVCkgeworICAgICAgICBtRGV2aWNlU3RhdHVzTWFwLmVyYXNlKGNhbWVyYUlkKTsKKyAgICB9Cit9CisKK30gLy8gbmFtZXNwYWNlIGFjYW0KK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworLyoqCisgKiBBQ2FtZXJhTWFuZ2VyIEltcGxlbWVudGF0aW9uCisgKi8KK2NhbWVyYV9zdGF0dXNfdAorQUNhbWVyYU1hbmFnZXI6OmdldENhbWVyYUlkTGlzdChBQ2FtZXJhSWRMaXN0KiogY2FtZXJhSWRMaXN0KSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKworICAgIHN0ZDo6dmVjdG9yPGhpZGxfc3RyaW5nPiBpZExpc3Q7CisgICAgQ2FtZXJhTWFuYWdlckdsb2JhbDo6Z2V0SW5zdGFuY2UoKS5nZXRDYW1lcmFJZExpc3QoJmlkTGlzdCk7CisKKyAgICBpbnQgbnVtQ2FtZXJhcyA9IGlkTGlzdC5zaXplKCk7CisgICAgQUNhbWVyYUlkTGlzdCAqb3V0ID0gbmV3IEFDYW1lcmFJZExpc3Q7CisgICAgaWYgKCFvdXQpIHsKKyAgICAgICAgQUxPR0UoIkFsbG9jYXRlIG1lbW9yeSBmb3IgQUNhbWVyYUlkTGlzdCBmYWlsZWQhIik7CisgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX05PVF9FTk9VR0hfTUVNT1JZOworICAgIH0KKyAgICBvdXQtPm51bUNhbWVyYXMgPSBudW1DYW1lcmFzOworICAgIG91dC0+Y2FtZXJhSWRzID0gbmV3IGNvbnN0IGNoYXIqW251bUNhbWVyYXNdOworICAgIGlmICghb3V0LT5jYW1lcmFJZHMpIHsKKyAgICAgICAgQUxPR0UoIkFsbG9jYXRlIG1lbW9yeSBmb3IgQUNhbWVyYUlkTGlzdCBmYWlsZWQhIik7CisgICAgICAgIGRlbGV0ZUNhbWVyYUlkTGlzdChvdXQpOworICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9OT1RfRU5PVUdIX01FTU9SWTsKKyAgICB9CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1DYW1lcmFzOyBpKyspIHsKKyAgICAgICAgY29uc3QgY2hhciogc3JjID0gaWRMaXN0W2ldLmNfc3RyKCk7CisgICAgICAgIHNpemVfdCBkc3RTaXplID0gc3RybGVuKHNyYykgKyAxOworICAgICAgICBjaGFyKiBkc3QgPSBuZXcgY2hhcltkc3RTaXplXTsKKyAgICAgICAgaWYgKCFkc3QpIHsKKyAgICAgICAgICAgIEFMT0dFKCJBbGxvY2F0ZSBtZW1vcnkgZm9yIEFDYW1lcmFJZExpc3QgZmFpbGVkISIpOworICAgICAgICAgICAgZGVsZXRlQ2FtZXJhSWRMaXN0KG91dCk7CisgICAgICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9OT1RfRU5PVUdIX01FTU9SWTsKKyAgICAgICAgfQorICAgICAgICBzdHJsY3B5KGRzdCwgc3JjLCBkc3RTaXplKTsKKyAgICAgICAgb3V0LT5jYW1lcmFJZHNbaV0gPSBkc3Q7CisgICAgfQorICAgICpjYW1lcmFJZExpc3QgPSBvdXQ7CisgICAgcmV0dXJuIEFDQU1FUkFfT0s7Cit9CisKK3ZvaWQKK0FDYW1lcmFNYW5hZ2VyOjpkZWxldGVDYW1lcmFJZExpc3QoQUNhbWVyYUlkTGlzdCogY2FtZXJhSWRMaXN0KSB7CisgICAgaWYgKGNhbWVyYUlkTGlzdCAhPSBudWxscHRyKSB7CisgICAgICAgIGlmIChjYW1lcmFJZExpc3QtPmNhbWVyYUlkcyAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNhbWVyYUlkTGlzdC0+bnVtQ2FtZXJhczsgaSArKykgeworICAgICAgICAgICAgICAgIGlmIChjYW1lcmFJZExpc3QtPmNhbWVyYUlkc1tpXSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgIGRlbGV0ZVtdIGNhbWVyYUlkTGlzdC0+Y2FtZXJhSWRzW2ldOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlbGV0ZVtdIGNhbWVyYUlkTGlzdC0+Y2FtZXJhSWRzOworICAgICAgICB9CisgICAgICAgIGRlbGV0ZSBjYW1lcmFJZExpc3Q7CisgICAgfQorfQorCitjYW1lcmFfc3RhdHVzX3QgQUNhbWVyYU1hbmFnZXI6OmdldENhbWVyYUNoYXJhY3RlcmlzdGljcygKKyAgICAgICAgY29uc3QgY2hhciAqY2FtZXJhSWRTdHIsIHNwPEFDYW1lcmFNZXRhZGF0YT4gKmNoYXJhY3RlcmlzdGljcykgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisKKyAgICBzcDxJQ2FtZXJhU2VydmljZT4gY3MgPSBDYW1lcmFNYW5hZ2VyR2xvYmFsOjpnZXRJbnN0YW5jZSgpLmdldENhbWVyYVNlcnZpY2UoKTsKKyAgICBpZiAoY3MgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCByZWFjaCBjYW1lcmEgc2VydmljZSEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9DQU1FUkFfRElTQ09OTkVDVEVEOworICAgIH0KKyAgICBDYW1lcmFNZXRhZGF0YSByYXdNZXRhZGF0YTsKKyAgICBTdGF0dXMgc3RhdHVzID0gU3RhdHVzOjpOT19FUlJPUjsKKyAgICBhdXRvIHNlcnZpY2VSZXQgPQorICAgICAgICBjcy0+Z2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKGNhbWVyYUlkU3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsmc3RhdHVzLCAmcmF3TWV0YWRhdGFdIChhdXRvIHMgLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiAmbWV0YWRhdGEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6Tk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1dGlsczo6Y29udmVydEZyb21IaWRsQ2xvbmVkKG1ldGFkYXRhLCAmcmF3TWV0YWRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgIGlmICghc2VydmljZVJldC5pc09rKCkgfHwgc3RhdHVzICE9IFN0YXR1czo6Tk9fRVJST1IpIHsKKyAgICAgICAgQUxPR0UoIkdldCBjYW1lcmEgY2hhcmFjdGVyaXN0aWNzIGZyb20gY2FtZXJhIHNlcnZpY2UgZmFpbGVkIik7CisgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX1VOS05PV047IC8vIHNob3VsZCBub3QgcmVhY2ggaGVyZQorICAgIH0KKworICAgICpjaGFyYWN0ZXJpc3RpY3MgPSBuZXcgQUNhbWVyYU1ldGFkYXRhKAorICAgICAgICAgICAgcmF3TWV0YWRhdGEucmVsZWFzZSgpLCBBQ2FtZXJhTWV0YWRhdGE6OkFDTV9DSEFSQUNURVJJU1RJQ1MpOworICAgIHJldHVybiBBQ0FNRVJBX09LOworfQorCitjYW1lcmFfc3RhdHVzX3QKK0FDYW1lcmFNYW5hZ2VyOjpvcGVuQ2FtZXJhKAorICAgICAgICBjb25zdCBjaGFyKiBjYW1lcmFJZCwKKyAgICAgICAgQUNhbWVyYURldmljZV9TdGF0ZUNhbGxiYWNrcyogY2FsbGJhY2ssCisgICAgICAgIC8qb3V0Ki9BQ2FtZXJhRGV2aWNlKiogb3V0RGV2aWNlKSB7CisgICAgc3A8QUNhbWVyYU1ldGFkYXRhPiByYXdDaGFyczsKKyAgICBjYW1lcmFfc3RhdHVzX3QgcmV0ID0gZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKGNhbWVyYUlkLCAmcmF3Q2hhcnMpOworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKHJldCAhPSBBQ0FNRVJBX09LKSB7CisgICAgICAgIEFMT0dFKCIlczogY2Fubm90IGdldCBjYW1lcmEgY2hhcmFjdGVyaXN0aWNzIGZvciBjYW1lcmEgJXMuIGVyciAlZCIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBjYW1lcmFJZCwgcmV0KTsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgfQorCisgICAgQUNhbWVyYURldmljZSogZGV2aWNlID0gbmV3IEFDYW1lcmFEZXZpY2UoY2FtZXJhSWQsIGNhbGxiYWNrLCBzdGQ6Om1vdmUocmF3Q2hhcnMpKTsKKworICAgIHNwPElDYW1lcmFTZXJ2aWNlPiBjcyA9IENhbWVyYU1hbmFnZXJHbG9iYWw6OmdldEluc3RhbmNlKCkuZ2V0Q2FtZXJhU2VydmljZSgpOworICAgIGlmIChjcyA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IHJlYWNoIGNhbWVyYSBzZXJ2aWNlISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIGRlbGV0ZSBkZXZpY2U7CisgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0NBTUVSQV9ESVNDT05ORUNURUQ7CisgICAgfQorCisgICAgc3A8SUNhbWVyYURldmljZUNhbGxiYWNrPiBjYWxsYmFja3MgPSBkZXZpY2UtPmdldFNlcnZpY2VDYWxsYmFjaygpOworICAgIHNwPElDYW1lcmFEZXZpY2VVc2VyPiBkZXZpY2VSZW1vdGU7CisKKyAgICAvLyBObyB3YXkgdG8gZ2V0IHBhY2thZ2UgbmFtZSBmcm9tIG5hdGl2ZS4KKyAgICAvLyBTZW5kIGEgemVybyBsZW5ndGggcGFja2FnZSBuYW1lIGFuZCBsZXQgY2FtZXJhIHNlcnZpY2UgZmlndXJlIGl0IG91dCBmcm9tIFVJRAorICAgIFN0YXR1cyBzdGF0dXMgPSBTdGF0dXM6Ok5PX0VSUk9SOworICAgIGF1dG8gc2VydmljZVJldCA9IGNzLT5jb25uZWN0RGV2aWNlKAorICAgICAgICAgICAgY2FsbGJhY2tzLCBjYW1lcmFJZCwgWyZzdGF0dXMsICZkZXZpY2VSZW1vdGVdKGF1dG8gcywgYXV0byAmZGV2aWNlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VSZW1vdGUgPSBkZXZpY2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKworICAgIGlmICghc2VydmljZVJldC5pc09rKCkgfHwgc3RhdHVzICE9IFN0YXR1czo6Tk9fRVJST1IpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBjb25uZWN0IGNhbWVyYSBkZXZpY2UgZmFpbGVkIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgLy8gVE9ETzogQ29udmVydCBzZXJ2aWNlUmV0IHRvIGNhbWVyYV9zdGF0dXNfdAorICAgICAgICBkZWxldGUgZGV2aWNlOworICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9VTktOT1dOOworICAgIH0KKyAgICBpZiAoZGV2aWNlUmVtb3RlID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBjb25uZWN0IGNhbWVyYSBkZXZpY2UgZmFpbGVkISByZW1vdGUgZGV2aWNlIGlzIG51bGwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICBkZWxldGUgZGV2aWNlOworICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9DQU1FUkFfRElTQ09OTkVDVEVEOworICAgIH0KKyAgICBkZXZpY2UtPnNldFJlbW90ZURldmljZShkZXZpY2VSZW1vdGUpOworICAgIGRldmljZS0+c2V0RGV2aWNlTWV0YWRhdGFRdWV1ZXMoKTsKKyAgICAqb3V0RGV2aWNlID0gZGV2aWNlOworICAgIHJldHVybiBBQ0FNRVJBX09LOworfQorCitBQ2FtZXJhTWFuYWdlcjo6fkFDYW1lcmFNYW5hZ2VyKCkgeworCit9CmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC9BQ2FtZXJhTWFuYWdlci5oIGIvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvQUNhbWVyYU1hbmFnZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGQ2NDBmCi0tLSAvZGV2L251bGwKKysrIGIvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvQUNhbWVyYU1hbmFnZXIuaApAQCAtMCwwICsxLDIwOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX0FDQU1FUkFfTUFOQUdFUl9ICisjZGVmaW5lIF9BQ0FNRVJBX01BTkFHRVJfSAorCisjaW5jbHVkZSA8Y2FtZXJhL05ka0NhbWVyYU1hbmFnZXIuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9wYXJzZWludC5oPgorI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL3NlcnZpY2UvMi4wL0lDYW1lcmFTZXJ2aWNlLmg+CisKKyNpbmNsdWRlIDxDYW1lcmFNZXRhZGF0YS5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KKyNpbmNsdWRlIDx1dGlscy9NdXRleC5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGFuZGxlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKworI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDxtYXA+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhY2FtIHsKKwordXNpbmcgSUNhbWVyYVNlcnZpY2UgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpzZXJ2aWNlOjpWMl8wOjpJQ2FtZXJhU2VydmljZTsKK3VzaW5nIENhbWVyYURldmljZVN0YXR1cyA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OnNlcnZpY2U6OlYyXzA6OkNhbWVyYURldmljZVN0YXR1czsKK3VzaW5nIElDYW1lcmFTZXJ2aWNlTGlzdGVuZXIgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpzZXJ2aWNlOjpWMl8wOjpJQ2FtZXJhU2VydmljZUxpc3RlbmVyOwordXNpbmcgQ2FtZXJhU3RhdHVzQW5kSWQgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpzZXJ2aWNlOjpWMl8wOjpDYW1lcmFTdGF0dXNBbmRJZDsKK3VzaW5nIFN0YXR1cyA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmNvbW1vbjo6VjJfMDo6U3RhdHVzOwordXNpbmcgVmVuZG9yVGFnU2VjdGlvbiA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmNvbW1vbjo6VjJfMDo6VmVuZG9yVGFnU2VjdGlvbjsKK3VzaW5nIFZlbmRvclRhZyA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmNvbW1vbjo6VjJfMDo6VmVuZG9yVGFnOwordXNpbmcgSUJhc2UgPSBhbmRyb2lkOjpoaWRsOjpiYXNlOjpWMV8wOjpJQmFzZTsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKK3VzaW5nIGhhcmR3YXJlOjpWb2lkOworCisvKioKKyAqIFBlci1wcm9jZXNzIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiBDYW1lcmFNYW5nZXIuIFNoYXJlZCBieSBhbGwgQUNhbWVyYU1hbmFnZXIKKyAqIGluc3RhbmNlcy4gQ3JlYXRlZCB3aGVuIGZpcnN0IEFDYW1lcmFNYW5hZ2VyIGlzIGNyZWF0ZWQgYW5kIGRlc3Ryb3llZCB3aGVuCisgKiBhbGwgQUNhbWVyYU1hbmFnZXIgaW5zdGFuY2VzIGFyZSBkZWxldGVkLgorICoKKyAqIFRPRE86IG1heWJlIENhbWVyYU1hbmFnZXJHbG9iYWwgaXMgYmV0dGVyIHN1aXRlZCBpbiBsaWJjYW1lcmFjbGllbnQ/CisgKi8KK2NsYXNzIENhbWVyYU1hbmFnZXJHbG9iYWwgZmluYWwgOiBwdWJsaWMgUmVmQmFzZSB7CisgIHB1YmxpYzoKKyAgICBzdGF0aWMgQ2FtZXJhTWFuYWdlckdsb2JhbCYgZ2V0SW5zdGFuY2UoKTsKKyAgICBzcDxJQ2FtZXJhU2VydmljZT4gZ2V0Q2FtZXJhU2VydmljZSgpOworCisgICAgdm9pZCByZWdpc3RlckF2YWlsYWJpbGl0eUNhbGxiYWNrKAorICAgICAgICAgICAgY29uc3QgQUNhbWVyYU1hbmFnZXJfQXZhaWxhYmlsaXR5Q2FsbGJhY2tzICpjYWxsYmFjayk7CisgICAgdm9pZCB1bnJlZ2lzdGVyQXZhaWxhYmlsaXR5Q2FsbGJhY2soCisgICAgICAgICAgICBjb25zdCBBQ2FtZXJhTWFuYWdlcl9BdmFpbGFiaWxpdHlDYWxsYmFja3MgKmNhbGxiYWNrKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiBjYW1lcmEgSURzIHRoYXQgc3VwcG9ydCBjYW1lcmEyCisgICAgICovCisgICAgdm9pZCBnZXRDYW1lcmFJZExpc3Qoc3RkOjp2ZWN0b3I8aGlkbF9zdHJpbmc+ICpjYW1lcmFJZHMpOworCisgIHByaXZhdGU6CisgICAgc3A8SUNhbWVyYVNlcnZpY2U+IG1DYW1lcmFTZXJ2aWNlOworICAgIGNvbnN0IGludCAgICAgICAgICBrQ2FtZXJhU2VydmljZVBvbGxEZWxheSA9IDUwMDAwMDsgLy8gMC41cworICAgIE11dGV4ICAgICAgICAgICAgICBtTG9jazsKKyAgICBjbGFzcyBEZWF0aE5vdGlmaWVyIDogcHVibGljIGFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2RlYXRoX3JlY2lwaWVudCB7CisgICAgICBwdWJsaWM6CisgICAgICAgIGV4cGxpY2l0IERlYXRoTm90aWZpZXIoQ2FtZXJhTWFuYWdlckdsb2JhbCogY20pIDogbUNhbWVyYU1hbmFnZXIoY20pIHt9CisgICAgICBwcm90ZWN0ZWQ6CisgICAgICAgIC8vIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50IGltcGxlbWVudGF0aW9uCisgICAgICAgIHZpcnR1YWwgdm9pZCBzZXJ2aWNlRGllZCh1aW50NjRfdCBjb29raWUsIGNvbnN0IHdwPElCYXNlPiAmd2hvKTsKKyAgICAgIHByaXZhdGU6CisgICAgICAgIGNvbnN0IHdwPENhbWVyYU1hbmFnZXJHbG9iYWw+IG1DYW1lcmFNYW5hZ2VyOworICAgIH07CisgICAgc3A8RGVhdGhOb3RpZmllcj4gbURlYXRoTm90aWZpZXI7CisKKyAgICBjbGFzcyBDYW1lcmFTZXJ2aWNlTGlzdGVuZXIgZmluYWwgOiBwdWJsaWMgSUNhbWVyYVNlcnZpY2VMaXN0ZW5lciB7CisgICAgICBwdWJsaWM6CisgICAgICAgIGV4cGxpY2l0IENhbWVyYVNlcnZpY2VMaXN0ZW5lcihDYW1lcmFNYW5hZ2VyR2xvYmFsKiBjbSkgOiBtQ2FtZXJhTWFuYWdlcihjbSkge30KKyAgICAgICAgYW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjx2b2lkPiBvblN0YXR1c0NoYW5nZWQoCisgICAgICAgICAgICBjb25zdCBDYW1lcmFTdGF0dXNBbmRJZCAmc3RhdHVzQW5kSWQpIG92ZXJyaWRlOworCisgICAgICBwcml2YXRlOgorICAgICAgICBjb25zdCB3cDxDYW1lcmFNYW5hZ2VyR2xvYmFsPiBtQ2FtZXJhTWFuYWdlcjsKKyAgICB9OworICAgIHNwPENhbWVyYVNlcnZpY2VMaXN0ZW5lcj4gbUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjsKKworICAgIC8vIFdyYXBwZXIgb2YgQUNhbWVyYU1hbmFnZXJfQXZhaWxhYmlsaXR5Q2FsbGJhY2tzIHNvIHdlIGNhbiBzdG9yZSBpdCBpbiBzdGQ6OnNldAorICAgIHN0cnVjdCBDYWxsYmFjayB7CisgICAgICAgIGV4cGxpY2l0IENhbGxiYWNrKGNvbnN0IEFDYW1lcmFNYW5hZ2VyX0F2YWlsYWJpbGl0eUNhbGxiYWNrcyAqY2FsbGJhY2spIDoKKyAgICAgICAgICAgIG1BdmFpbGFibGUoY2FsbGJhY2stPm9uQ2FtZXJhQXZhaWxhYmxlKSwKKyAgICAgICAgICAgIG1VbmF2YWlsYWJsZShjYWxsYmFjay0+b25DYW1lcmFVbmF2YWlsYWJsZSksCisgICAgICAgICAgICBtQ29udGV4dChjYWxsYmFjay0+Y29udGV4dCkge30KKworICAgICAgICBib29sIG9wZXJhdG9yID09IChjb25zdCBDYWxsYmFjayYgb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiAobUF2YWlsYWJsZSA9PSBvdGhlci5tQXZhaWxhYmxlICYmCisgICAgICAgICAgICAgICAgICAgIG1VbmF2YWlsYWJsZSA9PSBvdGhlci5tVW5hdmFpbGFibGUgJiYKKyAgICAgICAgICAgICAgICAgICAgbUNvbnRleHQgPT0gb3RoZXIubUNvbnRleHQpOworICAgICAgICB9CisgICAgICAgIGJvb2wgb3BlcmF0b3IgIT0gKGNvbnN0IENhbGxiYWNrJiBvdGhlcikgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIpOworICAgICAgICB9CisgICAgICAgIGJvb2wgb3BlcmF0b3IgPCAoY29uc3QgQ2FsbGJhY2smIG90aGVyKSBjb25zdCB7CisgICAgICAgICAgICBpZiAoKnRoaXMgPT0gb3RoZXIpIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIGlmIChtQ29udGV4dCAhPSBvdGhlci5tQ29udGV4dCkgcmV0dXJuIG1Db250ZXh0IDwgb3RoZXIubUNvbnRleHQ7CisgICAgICAgICAgICBpZiAobUF2YWlsYWJsZSAhPSBvdGhlci5tQXZhaWxhYmxlKSByZXR1cm4gbUF2YWlsYWJsZSA8IG90aGVyLm1BdmFpbGFibGU7CisgICAgICAgICAgICByZXR1cm4gbVVuYXZhaWxhYmxlIDwgb3RoZXIubVVuYXZhaWxhYmxlOworICAgICAgICB9CisgICAgICAgIGJvb2wgb3BlcmF0b3IgPiAoY29uc3QgQ2FsbGJhY2smIG90aGVyKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gKCp0aGlzICE9IG90aGVyICYmICEoKnRoaXMgPCBvdGhlcikpOworICAgICAgICB9CisgICAgICAgIEFDYW1lcmFNYW5hZ2VyX0F2YWlsYWJpbGl0eUNhbGxiYWNrIG1BdmFpbGFibGU7CisgICAgICAgIEFDYW1lcmFNYW5hZ2VyX0F2YWlsYWJpbGl0eUNhbGxiYWNrIG1VbmF2YWlsYWJsZTsKKyAgICAgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRleHQ7CisgICAgfTsKKyAgICBzdGQ6OnNldDxDYWxsYmFjaz4gbUNhbGxiYWNrczsKKworICAgIC8vIGRlZmluaXRpb24gb2YgaGFuZGxlciBhbmQgbWVzc2FnZQorICAgIGVudW0geworICAgICAgICBrV2hhdFNlbmRTaW5nbGVDYWxsYmFjaworICAgIH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGtDYW1lcmFJZEtleTsKKyAgICBzdGF0aWMgY29uc3QgY2hhcioga0NhbGxiYWNrRnBLZXk7CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGtDb250ZXh0S2V5OworICAgIGNsYXNzIENhbGxiYWNrSGFuZGxlciA6IHB1YmxpYyBBSGFuZGxlciB7CisgICAgICBwdWJsaWM6CisgICAgICAgIENhbGxiYWNrSGFuZGxlcigpIHt9CisgICAgICAgIHZvaWQgb25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIG92ZXJyaWRlOworICAgIH07CisgICAgc3A8Q2FsbGJhY2tIYW5kbGVyPiBtSGFuZGxlcjsKKyAgICBzcDxBTG9vcGVyPiAgICAgICAgIG1DYkxvb3BlcjsgLy8gTG9vcGVyIHRocmVhZCB3aGVyZSBjYWxsYmFja3MgYWN0dWFsbHkgaGFwcGVuIG9uCisKKyAgICB2b2lkIG9uU3RhdHVzQ2hhbmdlZChjb25zdCBDYW1lcmFTdGF0dXNBbmRJZCAmc3RhdHVzQW5kSWQpOworICAgIHZvaWQgb25TdGF0dXNDaGFuZ2VkTG9ja2VkKGNvbnN0IENhbWVyYVN0YXR1c0FuZElkICZzdGF0dXNBbmRJZCk7CisgICAgLy8gVXRpbHMgZm9yIHN0YXR1cworICAgIHN0YXRpYyBib29sIHZhbGlkU3RhdHVzKENhbWVyYURldmljZVN0YXR1cyBzdGF0dXMpOworICAgIHN0YXRpYyBib29sIGlzU3RhdHVzQXZhaWxhYmxlKENhbWVyYURldmljZVN0YXR1cyBzdGF0dXMpOworCisgICAgLy8gVGhlIHNvcnQgbG9naWMgbXVzdCBtYXRjaCB0aGUgbG9naWMgaW4KKyAgICAvLyBsaWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmFQcm92aWRlck1hbmFnZXIuY3BwOjpnZXRBUEkxQ29tcGF0aWJsZUNhbWVyYURldmljZUlkcworICAgIHN0cnVjdCBDYW1lcmFJZENvbXBhcmF0b3IgeworICAgICAgICBib29sIG9wZXJhdG9yKCkoY29uc3QgaGlkbF9zdHJpbmcmIGEsIGNvbnN0IGhpZGxfc3RyaW5nJiBiKSBjb25zdCB7CisgICAgICAgICAgICB1aW50MzJfdCBhVWludCA9IDAsIGJVaW50ID0gMDsKKyAgICAgICAgICAgIGJvb2wgYUlzVWludCA9IGJhc2U6OlBhcnNlVWludChhLmNfc3RyKCksICZhVWludCk7CisgICAgICAgICAgICBib29sIGJJc1VpbnQgPSBiYXNlOjpQYXJzZVVpbnQoYi5jX3N0cigpLCAmYlVpbnQpOworCisgICAgICAgICAgICAvLyBVaW50IGRldmljZSBJRHMgZmlyc3QKKyAgICAgICAgICAgIGlmIChhSXNVaW50ICYmIGJJc1VpbnQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYVVpbnQgPCBiVWludDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYUlzVWludCkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfSBlbHNlIGlmIChiSXNVaW50KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gU2ltcGxlIHN0cmluZyBjb21wYXJlIGlmIGJvdGggaWQgYXJlIG5vdCB1aW50CisgICAgICAgICAgICByZXR1cm4gYSA8IGI7CisgICAgICAgIH0KKyAgICB9OworCisgICAgLy8gTWFwIGNhbWVyYV9pZCAtPiBzdGF0dXMKKyAgICBzdGQ6Om1hcDxoaWRsX3N0cmluZywgQ2FtZXJhRGV2aWNlU3RhdHVzLCBDYW1lcmFJZENvbXBhcmF0b3I+IG1EZXZpY2VTdGF0dXNNYXA7CisKKyAgICAvLyBGb3IgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZQorICAgIHN0YXRpYyBNdXRleCBzTG9jazsKKyAgICBzdGF0aWMgQ2FtZXJhTWFuYWdlckdsb2JhbCogc0luc3RhbmNlOworICAgIENhbWVyYU1hbmFnZXJHbG9iYWwoKSB7fTsKKyAgICB+Q2FtZXJhTWFuYWdlckdsb2JhbCgpOworfTsKKworfSAvLyBuYW1lc3BhY2UgYWNhbTsKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQ7CisKKy8qKgorICogQUNhbWVyYU1hbmFnZXIgb3BhcXVlIHN0cnVjdCBkZWZpbml0aW9uCisgKiBMZWF2ZSBvdXRzaWRlIG9mIGFuZHJvaWQgbmFtZXNwYWNlIGJlY2F1c2UgaXQncyBOREsgc3RydWN0CisgKi8KK3N0cnVjdCBBQ2FtZXJhTWFuYWdlciB7CisgICAgQUNhbWVyYU1hbmFnZXIoKSA6CisgICAgICAgICAgICBtR2xvYmFsTWFuYWdlcigmKGFuZHJvaWQ6OmFjYW06OkNhbWVyYU1hbmFnZXJHbG9iYWw6OmdldEluc3RhbmNlKCkpKSB7fQorICAgIH5BQ2FtZXJhTWFuYWdlcigpOworICAgIGNhbWVyYV9zdGF0dXNfdCBnZXRDYW1lcmFJZExpc3QoQUNhbWVyYUlkTGlzdCoqIGNhbWVyYUlkTGlzdCk7CisgICAgc3RhdGljIHZvaWQgICAgIGRlbGV0ZUNhbWVyYUlkTGlzdChBQ2FtZXJhSWRMaXN0KiBjYW1lcmFJZExpc3QpOworCisgICAgY2FtZXJhX3N0YXR1c190IGdldENhbWVyYUNoYXJhY3RlcmlzdGljcygKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIGNhbWVyYUlkLCBhbmRyb2lkOjpzcDxBQ2FtZXJhTWV0YWRhdGE+KiBjaGFyYWN0ZXJpc3RpY3MpOworCisgICAgY2FtZXJhX3N0YXR1c190IG9wZW5DYW1lcmEoY29uc3QgY2hhciogY2FtZXJhSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUNhbWVyYURldmljZV9TdGF0ZUNhbGxiYWNrcyogY2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypvdXQqL0FDYW1lcmFEZXZpY2UqKiBkZXZpY2UpOworCisgIHByaXZhdGU6CisgICAgZW51bSB7CisgICAgICAgIGtDYW1lcmFJZExpc3ROb3RJbml0ID0gLTEKKyAgICB9OworICAgIGFuZHJvaWQ6Ok11dGV4ICAgICAgICAgbUxvY2s7CisgICAgYW5kcm9pZDo6c3A8YW5kcm9pZDo6YWNhbTo6Q2FtZXJhTWFuYWdlckdsb2JhbD4gbUdsb2JhbE1hbmFnZXI7Cit9OworCisjZW5kaWYgLy9fQUNBTUVSQV9NQU5BR0VSX0gKZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYXB0dXJlUmVxdWVzdFZlbmRvci5oIGIvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvQUNhcHR1cmVSZXF1ZXN0VmVuZG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ2NzYxNQotLS0gL2Rldi9udWxsCisrKyBiL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYXB0dXJlUmVxdWVzdFZlbmRvci5oCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAidXRpbHMuaCIKKworc3RydWN0IEFDYW1lcmFPdXRwdXRUYXJnZXQgeworICAgIGV4cGxpY2l0IEFDYW1lcmFPdXRwdXRUYXJnZXQobmF0aXZlX2hhbmRsZV90KiB3aW5kb3cpIDogbVdpbmRvdyh3aW5kb3cpIHt9OworCisgICAgYm9vbCBvcGVyYXRvciA9PSAoY29uc3QgQUNhbWVyYU91dHB1dFRhcmdldCYgb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1XaW5kb3cgPT0gb3RoZXIubVdpbmRvdzsKKyAgICB9CisgICAgYm9vbCBvcGVyYXRvciAhPSAoY29uc3QgQUNhbWVyYU91dHB1dFRhcmdldCYgb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1XaW5kb3cgIT0gb3RoZXIubVdpbmRvdzsKKyAgICB9CisgICAgYm9vbCBvcGVyYXRvciA8IChjb25zdCBBQ2FtZXJhT3V0cHV0VGFyZ2V0JiBvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gbVdpbmRvdyA8IG90aGVyLm1XaW5kb3c7CisgICAgfQorICAgIGJvb2wgb3BlcmF0b3IgPiAoY29uc3QgQUNhbWVyYU91dHB1dFRhcmdldCYgb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1XaW5kb3cgPiBvdGhlci5tV2luZG93OworICAgIH0KKworICAgIGFuZHJvaWQ6OmFjYW06OnV0aWxzOjpuYXRpdmVfaGFuZGxlX3B0cl93cmFwcGVyIG1XaW5kb3c7Cit9OwpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvdXRpbHMuY3BwIGIvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvdXRpbHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxOTMwMDYKLS0tIC9kZXYvbnVsbAorKysgYi9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC91dGlscy5jcHAKQEAgLTAsMCArMSwxOTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkFDYW1lcmFWZW5kb3JVdGlscyIKKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAidXRpbHMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFjYW0geworbmFtZXNwYWNlIHV0aWxzIHsKKworLy8gQ29udmVydCBDYXB0dXJlUmVxdWVzdCB3cmFwcGFibGUgYnkgc3A8PiB0byBoaWRsIENhcHR1cmVSZXF1ZXN0LgorZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpDYXB0dXJlUmVxdWVzdAorY29udmVydFRvSGlkbChjb25zdCBDYXB0dXJlUmVxdWVzdCAqY2FwdHVyZVJlcXVlc3QpIHsKKyAgICBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OkNhcHR1cmVSZXF1ZXN0IGhDYXB0dXJlUmVxdWVzdDsKKyAgICBoQ2FwdHVyZVJlcXVlc3QucGh5c2ljYWxDYW1lcmFTZXR0aW5ncyA9IGNhcHR1cmVSZXF1ZXN0LT5tQ2FwdHVyZVJlcXVlc3QucGh5c2ljYWxDYW1lcmFTZXR0aW5nczsKKyAgICBoQ2FwdHVyZVJlcXVlc3Quc3RyZWFtQW5kV2luZG93SWRzID0gY2FwdHVyZVJlcXVlc3QtPm1DYXB0dXJlUmVxdWVzdC5zdHJlYW1BbmRXaW5kb3dJZHM7CisgICAgcmV0dXJuIGhDYXB0dXJlUmVxdWVzdDsKK30KKworSFJvdGF0aW9uIGNvbnZlcnRUb0hpZGwoaW50IHJvdGF0aW9uKSB7CisgICAgSFJvdGF0aW9uIGhSb3RhdGlvbiA9IEhSb3RhdGlvbjo6UjA7CisgICAgc3dpdGNoKHJvdGF0aW9uKSB7CisgICAgICAgIGNhc2UgQ0FNRVJBM19TVFJFQU1fUk9UQVRJT05fOTA6CisgICAgICAgICAgICBoUm90YXRpb24gPSBIUm90YXRpb246OlI5MDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENBTUVSQTNfU1RSRUFNX1JPVEFUSU9OXzE4MDoKKyAgICAgICAgICAgIGhSb3RhdGlvbiA9IEhSb3RhdGlvbjo6UjE4MDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENBTUVSQTNfU1RSRUFNX1JPVEFUSU9OXzI3MDoKKyAgICAgICAgICAgIGhSb3RhdGlvbiA9IEhSb3RhdGlvbjo6UjI3MDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBoUm90YXRpb247Cit9CisKK2Jvb2wgY29udmVydEZyb21IaWRsQ2xvbmVkKGNvbnN0IEhDYW1lcmFNZXRhZGF0YSAmbWV0YWRhdGEsIENhbWVyYU1ldGFkYXRhICpyYXdNZXRhZGF0YSkgeworICAgIGNvbnN0IGNhbWVyYV9tZXRhZGF0YSAqYnVmZmVyID0gKGNhbWVyYV9tZXRhZGF0YV90KikobWV0YWRhdGEuZGF0YSgpKTsKKyAgICBzaXplX3QgZXhwZWN0ZWRTaXplID0gbWV0YWRhdGEuc2l6ZSgpOworICAgIGludCByZXQgPSB2YWxpZGF0ZV9jYW1lcmFfbWV0YWRhdGFfc3RydWN0dXJlKGJ1ZmZlciwgJmV4cGVjdGVkU2l6ZSk7CisgICAgaWYgKHJldCA9PSBPSyB8fCByZXQgPT0gQ0FNRVJBX01FVEFEQVRBX1ZBTElEQVRJT05fU0hJRlRFRCkgeworICAgICAgICAqcmF3TWV0YWRhdGEgPSBidWZmZXI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoIiVzOiBNYWxmb3JtZWQgY2FtZXJhIG1ldGFkYXRhIHJlY2VpdmVkIGZyb20gY2FsbGVyIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gTm90ZTogZXhpc3RpbmcgZGF0YSBpbiBkc3Qgd2lsbCBiZSBnb25lLiBDYWxsZXIgc3RpbGwgb3ducyB0aGUgbWVtb3J5IG9mIHNyYwordm9pZCBjb252ZXJ0VG9IaWRsKGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90ICpzcmMsIEhDYW1lcmFNZXRhZGF0YSogZHN0KSB7CisgICAgaWYgKHNyYyA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc2l6ZV90IHNpemUgPSBnZXRfY2FtZXJhX21ldGFkYXRhX3NpemUoc3JjKTsKKyAgICBBTE9HRSgiQ29udmVydGluZyBtZXRhZGF0YSBzaXplOiAlZCIsIChpbnQpc2l6ZSk7CisgICAgZHN0LT5zZXRUb0V4dGVybmFsKCh1aW50OF90ICopIHNyYywgc2l6ZSk7CisgICAgcmV0dXJuOworfQorCitUZW1wbGF0ZUlkIGNvbnZlcnRUb0hpZGwoQUNhbWVyYURldmljZV9yZXF1ZXN0X3RlbXBsYXRlIHRlbXBsYXRlSWQpIHsKKyAgICBzd2l0Y2godGVtcGxhdGVJZCkgeworICAgICAgICBjYXNlIFRFTVBMQVRFX1NUSUxMX0NBUFRVUkU6CisgICAgICAgICAgICByZXR1cm4gVGVtcGxhdGVJZDo6U1RJTExfQ0FQVFVSRTsKKyAgICAgICAgY2FzZSBURU1QTEFURV9SRUNPUkQ6CisgICAgICAgICAgICByZXR1cm4gVGVtcGxhdGVJZDo6UkVDT1JEOworICAgICAgICBjYXNlIFRFTVBMQVRFX1ZJREVPX1NOQVBTSE9UOgorICAgICAgICAgICAgcmV0dXJuIFRlbXBsYXRlSWQ6OlZJREVPX1NOQVBTSE9UOworICAgICAgICBjYXNlIFRFTVBMQVRFX1pFUk9fU0hVVFRFUl9MQUc6CisgICAgICAgICAgICByZXR1cm4gVGVtcGxhdGVJZDo6WkVST19TSFVUVEVSX0xBRzsKKyAgICAgICAgY2FzZSBURU1QTEFURV9NQU5VQUw6CisgICAgICAgICAgICByZXR1cm4gVGVtcGxhdGVJZDo6TUFOVUFMOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIFRlbXBsYXRlSWQ6OlBSRVZJRVc7CisgICAgfQorfQorCitjYW1lcmFfc3RhdHVzX3QgY29udmVydEZyb21IaWRsKFN0YXR1cyBzdGF0dXMpIHsKKyAgICBjYW1lcmFfc3RhdHVzX3QgcmV0ID0gQUNBTUVSQV9PSzsKKyAgICBzd2l0Y2goc3RhdHVzKSB7CisgICAgICAgIGNhc2UgU3RhdHVzOjpOT19FUlJPUjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFN0YXR1czo6RElTQ09OTkVDVEVEOgorICAgICAgICAgICAgcmV0ID0gQUNBTUVSQV9FUlJPUl9DQU1FUkFfRElTQ09OTkVDVEVEOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU3RhdHVzOjpDQU1FUkFfSU5fVVNFOgorICAgICAgICAgICAgcmV0ID0gQUNBTUVSQV9FUlJPUl9DQU1FUkFfSU5fVVNFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU3RhdHVzOjpNQVhfQ0FNRVJBU19JTl9VU0U6CisgICAgICAgICAgICByZXQgPSBBQ0FNRVJBX0VSUk9SX01BWF9DQU1FUkFfSU5fVVNFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU3RhdHVzOjpJTExFR0FMX0FSR1VNRU5UOgorICAgICAgICAgICAgcmV0ID0gQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFN0YXR1czo6REVQUkVDQVRFRF9IQUw6CisgICAgICAgICAgICAvLyBTaG91bGQgbm90IHJlYWNoIGhlcmUgc2luY2Ugd2UgZmlsdGVyZWQgbGVnYWN5IEhBTHMgZWFybGllcgorICAgICAgICAgICAgcmV0ID0gQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFN0YXR1czo6RElTQUJMRUQ6CisgICAgICAgICAgICByZXQgPSBBQ0FNRVJBX0VSUk9SX0NBTUVSQV9ESVNBQkxFRDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFN0YXR1czo6UEVSTUlTU0lPTl9ERU5JRUQ6CisgICAgICAgICAgICByZXQgPSBBQ0FNRVJBX0VSUk9SX1BFUk1JU1NJT05fREVOSUVEOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU3RhdHVzOjpJTlZBTElEX09QRVJBVElPTjoKKyAgICAgICAgICAgIHJldCA9IEFDQU1FUkFfRVJST1JfSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldCA9IEFDQU1FUkFfRVJST1JfVU5LTk9XTjsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitib29sIGlzV2luZG93TmF0aXZlSGFuZGxlRXF1YWwoY29uc3QgbmF0aXZlX2hhbmRsZV90ICpuaDEsIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqbmgyKSB7CisgICAgaWYgKG5oMS0+bnVtRmRzICE9MCB8fCBuaDItPm51bUZkcyAhPTApIHsKKyAgICAgICAgQUxPR0UoIkludmFsaWQgd2luZG93IG5hdGl2ZSBoYW5kbGVzIGJlaW5nIGNvbXBhcmVkIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKG5oMS0+dmVyc2lvbiAhPSBuaDItPnZlcnNpb24gfHwgbmgxLT5udW1GZHMgIT0gbmgyLT5udW1GZHMgfHwKKyAgICAgICAgbmgxLT5udW1JbnRzICE9IG5oMi0+bnVtSW50cykgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmgxLT5udW1JbnRzOyBpKyspIHsKKyAgICAgICAgaWYobmgxLT5kYXRhW2ldICE9IG5oMi0+ZGF0YVtpXSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIGlzV2luZG93TmF0aXZlSGFuZGxlTGVzc1RoYW4oY29uc3QgbmF0aXZlX2hhbmRsZV90ICpuaDEsIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqbmgyKSB7CisgICAgaWYgKGlzV2luZG93TmF0aXZlSGFuZGxlRXF1YWwobmgxLCBuaDIpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKG5oMS0+bnVtSW50cyAhPSBuaDItPm51bUludHMpIHsKKyAgICAgICAgcmV0dXJuIG5oMS0+bnVtSW50cyA8IG5oMi0+bnVtSW50czsKKyAgICB9CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG5oMS0+bnVtSW50czsgaSsrKSB7CisgICAgICAgIGlmIChuaDEtPmRhdGFbaV0gIT0gbmgyLT5kYXRhW2ldKSB7CisgICAgICAgICAgICByZXR1cm4gbmgxLT5kYXRhW2ldIDwgbmgyLT5kYXRhW2ldOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBpc1dpbmRvd05hdGl2ZUhhbmRsZUdyZWF0ZXJUaGFuKGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqbmgxLCBjb25zdCBuYXRpdmVfaGFuZGxlX3QgKm5oMikgeworICAgIHJldHVybiAhaXNXaW5kb3dOYXRpdmVIYW5kbGVMZXNzVGhhbihuaDEsIG5oMikgJiYgIWlzV2luZG93TmF0aXZlSGFuZGxlRXF1YWwobmgxLCBuaDIpOworfQorCitib29sIGFyZVdpbmRvd05hdGl2ZUhhbmRsZXNFcXVhbChoaWRsX3ZlYzxoaWRsX2hhbmRsZT4gaGFuZGxlczEsIGhpZGxfdmVjPGhpZGxfaGFuZGxlPiBoYW5kbGVzMikgeworICAgIGlmIChoYW5kbGVzMS5zaXplKCkgIT0gaGFuZGxlczIuc2l6ZSgpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBoYW5kbGVzMS5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAoIWlzV2luZG93TmF0aXZlSGFuZGxlRXF1YWwoaGFuZGxlczFbaV0sIGhhbmRsZXMyW2ldKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIGFyZVdpbmRvd05hdGl2ZUhhbmRsZXNMZXNzVGhhbihoaWRsX3ZlYzxoaWRsX2hhbmRsZT4gaGFuZGxlczEsIGhpZGxfdmVjPGhpZGxfaGFuZGxlPmhhbmRsZXMyKSB7CisgICAgaWYgKGhhbmRsZXMxLnNpemUoKSAhPSBoYW5kbGVzMi5zaXplKCkpIHsKKyAgICAgICAgcmV0dXJuIGhhbmRsZXMxLnNpemUoKSA8IGhhbmRsZXMyLnNpemUoKTsKKyAgICB9CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBoYW5kbGVzMS5zaXplKCk7IGkrKykgeworICAgICAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QgKmhhbmRsZTEgPSBoYW5kbGVzMVtpXS5nZXROYXRpdmVIYW5kbGUoKTsKKyAgICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90ICpoYW5kbGUyID0gaGFuZGxlczJbaV0uZ2V0TmF0aXZlSGFuZGxlKCk7CisgICAgICAgIGlmICghaXNXaW5kb3dOYXRpdmVIYW5kbGVFcXVhbChoYW5kbGUxLCBoYW5kbGUyKSkgeworICAgICAgICAgICAgcmV0dXJuIGlzV2luZG93TmF0aXZlSGFuZGxlTGVzc1RoYW4oaGFuZGxlMSwgaGFuZGxlMik7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCit9IC8vIG5hbWVzcGFjZSB1dGlscworfSAvLyBuYW1lc3BhY2UgYWNhbQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvdXRpbHMuaCBiL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL3V0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmYxMDA2ZAotLS0gL2Rldi9udWxsCisrKyBiL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL3V0aWxzLmgKQEAgLTAsMCArMSwxNzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8YW5kcm9pZC9mcmFtZXdvcmtzL2NhbWVyYXNlcnZpY2Uvc2VydmljZS8yLjAvSUNhbWVyYVNlcnZpY2UuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2ZyYW1ld29ya3MvY2FtZXJhc2VydmljZS9kZXZpY2UvMi4wL0lDYW1lcmFEZXZpY2VVc2VyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9mcmFtZXdvcmtzL2NhbWVyYXNlcnZpY2UvZGV2aWNlLzIuMC90eXBlcy5oPgorI2luY2x1ZGUgPGNhbWVyYS9OZGtDYW1lcmFEZXZpY2UuaD4KKyNpbmNsdWRlIDxDYW1lcmFNZXRhZGF0YS5oPgorI2luY2x1ZGUgPGhhcmR3YXJlL2NhbWVyYTMuaD4KKworI2lmbmRlZiBDQU1FUkFfTkRLX1ZFTkRPUl9ICisjZGVmaW5lIENBTUVSQV9OREtfVkVORE9SX0gKKwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfaGFuZGxlOworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWNhbSB7CituYW1lc3BhY2UgdXRpbHMgeworCit1c2luZyBDYW1lcmFNZXRhZGF0YSA9IGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6aGVscGVyOjpDYW1lcmFNZXRhZGF0YTsKK3VzaW5nIEhDYW1lcmFNZXRhZGF0YSAgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpzZXJ2aWNlOjpWMl8wOjpDYW1lcmFNZXRhZGF0YTsKK3VzaW5nIFN0YXR1cyA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmNvbW1vbjo6VjJfMDo6U3RhdHVzOwordXNpbmcgVGVtcGxhdGVJZCA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6VGVtcGxhdGVJZDsKK3VzaW5nIFBoeXNpY2FsQ2FtZXJhU2V0dGluZ3MgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OlBoeXNpY2FsQ2FtZXJhU2V0dGluZ3M7Cit1c2luZyBIUm90YXRpb24gPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6Ok91dHB1dENvbmZpZ3VyYXRpb246OlJvdGF0aW9uOwordXNpbmcgT3V0cHV0Q29uZmlndXJhdGlvbiA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6T3V0cHV0Q29uZmlndXJhdGlvbjsKKworLy8gVXRpbGl0eSBjbGFzcyBzbyB0aGF0IENhcHR1cmVSZXF1ZXN0IGNhbiBiZSBzdG9yZWQgYnkgc3A8Pgorc3RydWN0IENhcHR1cmVSZXF1ZXN0IDogcHVibGljIFJlZkJhc2UgeworICBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OkNhcHR1cmVSZXF1ZXN0IG1DYXB0dXJlUmVxdWVzdDsKKyAgc3RkOjp2ZWN0b3I8bmF0aXZlX2hhbmRsZV90ICo+IG1TdXJmYWNlTGlzdDsKKyAgLy9QaHlzaWNhbCBjYW1lcmEgc2V0dGluZ3MgbWV0YWRhdGEgaXMgc3RvcmVkIGhlcmUsIHNpbmNlIHRoZSBjYXB0dXJlIHJlcXVlc3QKKyAgLy9taWdodCBub3QgY29udGFpbiBpdC4gVGhhdCdzIHNpbmNlLCBmbXEgbWlnaHQgaGF2ZSBjb25zdW1lZCBpdC4KKyAgaGlkbF92ZWM8UGh5c2ljYWxDYW1lcmFTZXR0aW5ncz4gbVBoeXNpY2FsQ2FtZXJhU2V0dGluZ3M7Cit9OworCitib29sIGFyZVdpbmRvd05hdGl2ZUhhbmRsZXNFcXVhbChoaWRsX3ZlYzxoaWRsX2hhbmRsZT4gaGFuZGxlczEsIGhpZGxfdmVjPGhpZGxfaGFuZGxlPmhhbmRsZXMyKTsKKworYm9vbCBhcmVXaW5kb3dOYXRpdmVIYW5kbGVzTGVzc1RoYW4oaGlkbF92ZWM8aGlkbF9oYW5kbGU+IGhhbmRsZXMxLCBoaWRsX3ZlYzxoaWRsX2hhbmRsZT5oYW5kbGVzMik7CisKK2Jvb2wgaXNXaW5kb3dOYXRpdmVIYW5kbGVFcXVhbChjb25zdCBuYXRpdmVfaGFuZGxlX3QgKm5oMSwgY29uc3QgbmF0aXZlX2hhbmRsZV90ICpuaDIpOworCitib29sIGlzV2luZG93TmF0aXZlSGFuZGxlTGVzc1RoYW4oY29uc3QgbmF0aXZlX2hhbmRsZV90ICpuaDEsIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqbmgyKTsKKworLy8gQ29udmVuaWVuY2Ugd3JhcHBlciBvdmVyIGlzV2luZG93TmF0aXZlSGFuZGxlTGVzc1RoYW4gYW5kIGlzV2luZG93TmF0aXZlSGFuZGxlRXF1YWwKK2Jvb2wgaXNXaW5kb3dOYXRpdmVIYW5kbGVHcmVhdGVyVGhhbihjb25zdCBuYXRpdmVfaGFuZGxlX3QgKm5oMSwgY29uc3QgbmF0aXZlX2hhbmRsZV90ICpuaDIpOworCisvLyBVdGlsaXR5IGNsYXNzIHNvIHRoZSBuYXRpdmVfaGFuZGxlX3QgY2FuIGJlIGNvbXBhcmVkIHdpdGggIGl0cyBjb250ZW50cyBpbnN0ZWFkCisvLyBvZiBqdXN0IHJhdyBwb2ludGVyIGNvbXBhcmlzb25zLgorc3RydWN0IG5hdGl2ZV9oYW5kbGVfcHRyX3dyYXBwZXIgeworICAgIG5hdGl2ZV9oYW5kbGVfdCAqbVdpbmRvdyA9IG51bGxwdHI7CisKKyAgICBuYXRpdmVfaGFuZGxlX3B0cl93cmFwcGVyKG5hdGl2ZV9oYW5kbGVfdCAqbmgpIDogbVdpbmRvdyhuaCkgeyB9CisKKyAgICBuYXRpdmVfaGFuZGxlX3B0cl93cmFwcGVyKCkgPSBkZWZhdWx0OworCisgICAgb3BlcmF0b3IgbmF0aXZlX2hhbmRsZV90ICooKSBjb25zdCB7IHJldHVybiBtV2luZG93OyB9CisKKyAgICBib29sIG9wZXJhdG9yID09KGNvbnN0IG5hdGl2ZV9oYW5kbGVfcHRyX3dyYXBwZXIgb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGlzV2luZG93TmF0aXZlSGFuZGxlRXF1YWwobVdpbmRvdywgb3RoZXIubVdpbmRvdyk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciAhPSAoY29uc3QgbmF0aXZlX2hhbmRsZV9wdHJfd3JhcHBlciYgb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuICFpc1dpbmRvd05hdGl2ZUhhbmRsZUVxdWFsKG1XaW5kb3csIG90aGVyLm1XaW5kb3cpOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IgPCAoY29uc3QgbmF0aXZlX2hhbmRsZV9wdHJfd3JhcHBlciYgb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGlzV2luZG93TmF0aXZlSGFuZGxlTGVzc1RoYW4obVdpbmRvdywgb3RoZXIubVdpbmRvdyk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciA+IChjb25zdCBuYXRpdmVfaGFuZGxlX3B0cl93cmFwcGVyJiBvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gIWlzV2luZG93TmF0aXZlSGFuZGxlR3JlYXRlclRoYW4obVdpbmRvdywgb3RoZXIubVdpbmRvdyk7CisgICAgfQorCit9OworCisvLyBXcmFwcGVyIGFyb3VuZCBPdXRwdXRDb25maWd1cmF0aW9uLiBUaGlzIGlzIG5lZWRlZCBzaW5jZSBISURMCisvLyBPdXRwdXRDb25maWd1cmF0aW9uIGlzIGF1dG8tZ2VuZXJhdGVkIGFuZCBtYXJrZWQgZmluYWwuIFRoZXJlZm9yZSwgb3BlcmF0b3IKKy8vIG92ZXJsb2FkcyBvdXRzaWRlIHRoZSBjbGFzcywgd2lsbCBub3QgZ2V0IHBpY2tlZCBieSBjbGFuZyB3aGlsZSB0cnlpbmcgdG8KKy8vIHN0b3JlIE91dHB1dENvbmZpZ3VyYXRpb24gaW4gbWFwcy9zZXRzLgorc3RydWN0IE91dHB1dENvbmZpZ3VyYXRpb25XcmFwcGVyIHsKKyAgICBPdXRwdXRDb25maWd1cmF0aW9uIG1PdXRwdXRDb25maWd1cmF0aW9uOworCisgICAgb3BlcmF0b3IgY29uc3QgT3V0cHV0Q29uZmlndXJhdGlvbiAmKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbU91dHB1dENvbmZpZ3VyYXRpb247CisgICAgfQorCisgICAgT3V0cHV0Q29uZmlndXJhdGlvbldyYXBwZXIoKSA9IGRlZmF1bHQ7CisKKyAgICBPdXRwdXRDb25maWd1cmF0aW9uV3JhcHBlcihPdXRwdXRDb25maWd1cmF0aW9uICZvdXRwdXRDb25maWd1cmF0aW9uKQorICAgICAgICAgICAgOiBtT3V0cHV0Q29uZmlndXJhdGlvbigob3V0cHV0Q29uZmlndXJhdGlvbikpIHsgfQorCisgICAgYm9vbCBvcGVyYXRvciA9PShjb25zdCBPdXRwdXRDb25maWd1cmF0aW9uICZvdGhlcikgY29uc3QgeworICAgICAgICBjb25zdCBPdXRwdXRDb25maWd1cmF0aW9uICZzZWxmID0gbU91dHB1dENvbmZpZ3VyYXRpb247CisgICAgICAgIHJldHVybiBzZWxmLnJvdGF0aW9uID09IG90aGVyLnJvdGF0aW9uICYmIHNlbGYud2luZG93R3JvdXBJZCA9PSBvdGhlci53aW5kb3dHcm91cElkICYmCisgICAgICAgICAgICAgICAgc2VsZi5waHlzaWNhbENhbWVyYUlkID09IG90aGVyLnBoeXNpY2FsQ2FtZXJhSWQgJiYgc2VsZi53aWR0aCA9PSBvdGhlci53aWR0aCAmJgorICAgICAgICAgICAgICAgIHNlbGYuaGVpZ2h0ID09IG90aGVyLmhlaWdodCAmJiBzZWxmLmlzRGVmZXJyZWQgPT0gb3RoZXIuaXNEZWZlcnJlZCAmJgorICAgICAgICAgICAgICAgIGFyZVdpbmRvd05hdGl2ZUhhbmRsZXNFcXVhbChzZWxmLndpbmRvd0hhbmRsZXMsIG90aGVyLndpbmRvd0hhbmRsZXMpOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IgPCAoY29uc3QgT3V0cHV0Q29uZmlndXJhdGlvbiAmb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgaWYgKCp0aGlzID09IG90aGVyKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgY29uc3QgT3V0cHV0Q29uZmlndXJhdGlvbiAmc2VsZiA9IG1PdXRwdXRDb25maWd1cmF0aW9uOworICAgICAgICBpZiAoc2VsZi53aW5kb3dHcm91cElkICE9IG90aGVyLndpbmRvd0dyb3VwSWQpIHsKKyAgICAgICAgICAgIHJldHVybiBzZWxmLndpbmRvd0dyb3VwSWQgPCBvdGhlci53aW5kb3dHcm91cElkOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHNlbGYud2lkdGggIT0gb3RoZXIud2lkdGgpIHsKKyAgICAgICAgICAgIHJldHVybiBzZWxmLndpZHRoIDwgb3RoZXIud2lkdGg7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc2VsZi5oZWlnaHQgIT0gb3RoZXIuaGVpZ2h0KSB7CisgICAgICAgICAgICByZXR1cm4gc2VsZi5oZWlnaHQgPCBvdGhlci5oZWlnaHQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc2VsZi5yb3RhdGlvbiAhPSBvdGhlci5yb3RhdGlvbikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PHVpbnQzMl90PihzZWxmLnJvdGF0aW9uKSA8IHN0YXRpY19jYXN0PHVpbnQzMl90PihvdGhlci5yb3RhdGlvbik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc2VsZi5pc0RlZmVycmVkICE9IG90aGVyLmlzRGVmZXJyZWQpIHsKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmlzRGVmZXJyZWQgPCBvdGhlci5pc0RlZmVycmVkOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHNlbGYucGh5c2ljYWxDYW1lcmFJZCAhPSBvdGhlci5waHlzaWNhbENhbWVyYUlkKSB7CisgICAgICAgICAgICByZXR1cm4gc2VsZi5waHlzaWNhbENhbWVyYUlkIDwgb3RoZXIucGh5c2ljYWxDYW1lcmFJZDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYXJlV2luZG93TmF0aXZlSGFuZGxlc0xlc3NUaGFuKHNlbGYud2luZG93SGFuZGxlcywgb3RoZXIud2luZG93SGFuZGxlcyk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciAhPSAoY29uc3QgT3V0cHV0Q29uZmlndXJhdGlvbiAmb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIpOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IgPiAoY29uc3QgT3V0cHV0Q29uZmlndXJhdGlvbiAmb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuICgqdGhpcyAhPSBvdGhlcikgJiYgISgqdGhpcyA8IG90aGVyKTsKKyAgICB9Cit9OworCisvLyBDb252ZXJ0IENhcHR1cmVSZXF1ZXN0IHdyYXBwYWJsZSBieSBzcDw+IHRvIGhpZGwgQ2FwdHVyZVJlcXVlc3QuCitmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OkNhcHR1cmVSZXF1ZXN0IGNvbnZlcnRUb0hpZGwoCisgICAgY29uc3QgQ2FwdHVyZVJlcXVlc3QgKmNhcHR1cmVSZXF1ZXN0KTsKKworSFJvdGF0aW9uIGNvbnZlcnRUb0hpZGwoaW50IHJvdGF0aW9uKTsKKworYm9vbCBjb252ZXJ0RnJvbUhpZGxDbG9uZWQoY29uc3QgSENhbWVyYU1ldGFkYXRhICZtZXRhZGF0YSwgQ2FtZXJhTWV0YWRhdGEgKnJhd01ldGFkYXRhKTsKKworLy8gTm90ZTogZXhpc3RpbmcgZGF0YSBpbiBkc3Qgd2lsbCBiZSBnb25lLiBDYWxsZXIgc3RpbGwgb3ducyB0aGUgbWVtb3J5IG9mIHNyYwordm9pZCBjb252ZXJ0VG9IaWRsKGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90ICpzcmMsIEhDYW1lcmFNZXRhZGF0YSogZHN0KTsKKworVGVtcGxhdGVJZCBjb252ZXJ0VG9IaWRsKEFDYW1lcmFEZXZpY2VfcmVxdWVzdF90ZW1wbGF0ZSB0ZW1wbGF0ZUlkKTsKKworY2FtZXJhX3N0YXR1c190IGNvbnZlcnRGcm9tSGlkbChTdGF0dXMgc3RhdHVzKTsKKworfSAvLyBuYW1lc3BhY2UgdXRpbHMKK30gLy8gbmFtZXNwYWNlIGFjYW0KK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIENBTUVSQV9OREtfVkVORE9SX0gKZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci90ZXN0cy9BSW1hZ2VSZWFkZXJWZW5kb3JUZXN0LmNwcCBiL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci90ZXN0cy9BSW1hZ2VSZWFkZXJWZW5kb3JUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Nzk0MTJlCi0tLSAvZGV2L251bGwKKysrIGIvY2FtZXJhL25kay9uZGtfdmVuZG9yL3Rlc3RzL0FJbWFnZVJlYWRlclZlbmRvclRlc3QuY3BwCkBAIC0wLDAgKzEsNTU5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJBSW1hZ2VSZWFkZXJWZW5kb3JUZXN0IgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxtdXRleD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC9sb2cuaD4KKyNpbmNsdWRlIDxjYW1lcmEvTmRrQ2FtZXJhRXJyb3IuaD4KKyNpbmNsdWRlIDxjYW1lcmEvTmRrQ2FtZXJhTWFuYWdlci5oPgorI2luY2x1ZGUgPGNhbWVyYS9OZGtDYW1lcmFEZXZpY2UuaD4KKyNpbmNsdWRlIDxjYW1lcmEvTmRrQ2FtZXJhQ2FwdHVyZVNlc3Npb24uaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtJbWFnZS5oPgorI2luY2x1ZGUgPG1lZGlhL05ka0ltYWdlUmVhZGVyLmg+CisjaW5jbHVkZSA8Y3V0aWxzL25hdGl2ZV9oYW5kbGUuaD4KKworLy8jZGVmaW5lIEFMT0dWKC4uLikgX19hbmRyb2lkX2xvZ19wcmludChBTkRST0lEX0xPR19WRVJCT1NFLCBMT0dfVEFHLCBfX1ZBX0FSR1NfXykKKy8vI2RlZmluZSBBTE9HRCguLi4pIF9fYW5kcm9pZF9sb2dfcHJpbnQoQU5EUk9JRF9MT0dfREVCVUcsIExPR19UQUcsIF9fVkFfQVJHU19fKQorI2RlZmluZSBBTE9HSSguLi4pIF9fYW5kcm9pZF9sb2dfcHJpbnQoQU5EUk9JRF9MT0dfSU5GTywgTE9HX1RBRywgX19WQV9BUkdTX18pCisjZGVmaW5lIEFMT0dXKC4uLikgX19hbmRyb2lkX2xvZ19wcmludChBTkRST0lEX0xPR19XQVJOLCBMT0dfVEFHLCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgQUxPR0UoLi4uKSBfX2FuZHJvaWRfbG9nX3ByaW50KEFORFJPSURfTE9HX0VSUk9SLCBMT0dfVEFHLCBfX1ZBX0FSR1NfXykKKworbmFtZXNwYWNlIHsKKworc3RhdGljIGNvbnN0ZXhwciBpbnQga0R1bW15RmVuY2VGZCA9IC0xOworc3RhdGljIGNvbnN0ZXhwciBpbnQga0NhcHR1cmVXYWl0VXMgPSAxMDAgKiAxMDAwOworc3RhdGljIGNvbnN0ZXhwciBpbnQga0NhcHR1cmVXYWl0UmV0cnkgPSAxMDsKK3N0YXRpYyBjb25zdGV4cHIgaW50IGtUZXN0SW1hZ2VXaWR0aCA9IDY0MDsKK3N0YXRpYyBjb25zdGV4cHIgaW50IGtUZXN0SW1hZ2VIZWlnaHQgPSA0ODA7CitzdGF0aWMgY29uc3RleHByIGludCBrVGVzdEltYWdlRm9ybWF0ID0gQUlNQUdFX0ZPUk1BVF9ZVVZfNDIwXzg4ODsKKworY2xhc3MgQ2FtZXJhSGVscGVyIHsKKyAgIHB1YmxpYzoKKyAgICBDYW1lcmFIZWxwZXIobmF0aXZlX2hhbmRsZV90KiBpbWdSZWFkZXJBbncpIDogbUltZ1JlYWRlckFudyhpbWdSZWFkZXJBbncpIHt9CisgICAgfkNhbWVyYUhlbHBlcigpIHsgY2xvc2VDYW1lcmEoKTsgfQorCisgICAgaW50IGluaXRDYW1lcmEoKSB7CisgICAgICAgIGlmIChtSW1nUmVhZGVyQW53ID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dFKCJDYW5ub3QgaW5pdGlhbGl6ZSBjYW1lcmEgYmVmb3JlIGltYWdlIHJlYWRlciBnZXQgaW5pdGlhbGl6ZWQuIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgaW50IHJldDsKKworICAgICAgICBtQ2FtZXJhTWFuYWdlciA9IEFDYW1lcmFNYW5hZ2VyX2NyZWF0ZSgpOworICAgICAgICBpZiAobUNhbWVyYU1hbmFnZXIgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBjcmVhdGUgQUNhbWVyYU1hbmFnZXIuIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICByZXQgPSBBQ2FtZXJhTWFuYWdlcl9nZXRDYW1lcmFJZExpc3QobUNhbWVyYU1hbmFnZXIsICZtQ2FtZXJhSWRMaXN0KTsKKyAgICAgICAgaWYgKHJldCAhPSBBTUVESUFfT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZ2V0IGNhbWVyYUlkTGlzdDogcmV0PSVkIiwgcmV0KTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1DYW1lcmFJZExpc3QtPm51bUNhbWVyYXMgPCAxKSB7CisgICAgICAgICAgICBBTE9HVygiRGV2aWNlIGhhcyBubyBjYW1lcmEgb24gYm9hcmQuIik7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFdlIGFsd2F5cyB1c2UgdGhlIGZpcnN0IGNhbWVyYS4KKyAgICAgICAgbUNhbWVyYUlkID0gbUNhbWVyYUlkTGlzdC0+Y2FtZXJhSWRzWzBdOworICAgICAgICBpZiAobUNhbWVyYUlkID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZ2V0IGNhbWVyYUlkLiIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgcmV0ID0gQUNhbWVyYU1hbmFnZXJfb3BlbkNhbWVyYShtQ2FtZXJhTWFuYWdlciwgbUNhbWVyYUlkLCAmbURldmljZUNiLCAmbURldmljZSk7CisgICAgICAgIGlmIChyZXQgIT0gQU1FRElBX09LIHx8IG1EZXZpY2UgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBvcGVuIGNhbWVyYSwgcmV0PSVkLCBtRGV2aWNlPSVwLiIsIHJldCwgbURldmljZSk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICByZXQgPSBBQ2FtZXJhTWFuYWdlcl9nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MobUNhbWVyYU1hbmFnZXIsIG1DYW1lcmFJZCwgJm1DYW1lcmFNZXRhZGF0YSk7CisgICAgICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSyB8fCBtQ2FtZXJhTWV0YWRhdGEgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0UoIkdldCBjYW1lcmEgJXMgY2hhcmFjdGVyaXN0aWNzIGZhaWx1cmUuIHJldCAlZCwgbWV0YWRhdGEgJXAiLCBtQ2FtZXJhSWQsIHJldCwKKyAgICAgICAgICAgICAgICAgIG1DYW1lcmFNZXRhZGF0YSk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWlzQ2FwYWJpbGl0eVN1cHBvcnRlZChBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19CQUNLV0FSRF9DT01QQVRJQkxFKSkgeworICAgICAgICAgICAgQUxPR1coIkNhbWVyYSBkb2VzIG5vdCBzdXBwb3J0IEJBQ0tXQVJEX0NPTVBBVElCTEUuIik7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENyZWF0ZSBjYXB0dXJlIHNlc3Npb24KKyAgICAgICAgcmV0ID0gQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyX2NyZWF0ZSgmbU91dHB1dHMpOworICAgICAgICBpZiAocmV0ICE9IEFNRURJQV9PSykgeworICAgICAgICAgICAgQUxPR0UoIkFDYXB0dXJlU2Vzc2lvbk91dHB1dENvbnRhaW5lcl9jcmVhdGUgZmFpbGVkLCByZXQ9JWQiLCByZXQpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgICAgICByZXQgPSBBQ2FwdHVyZVNlc3Npb25PdXRwdXRfY3JlYXRlKG1JbWdSZWFkZXJBbncsICZtSW1nUmVhZGVyT3V0cHV0KTsKKyAgICAgICAgaWYgKHJldCAhPSBBTUVESUFfT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJBQ2FwdHVyZVNlc3Npb25PdXRwdXRfY3JlYXRlIGZhaWxlZCwgcmV0PSVkIiwgcmV0KTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0ID0gQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyX2FkZChtT3V0cHV0cywgbUltZ1JlYWRlck91dHB1dCk7CisgICAgICAgIGlmIChyZXQgIT0gQU1FRElBX09LKSB7CisgICAgICAgICAgICBBTE9HRSgiQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyX2FkZCBmYWlsZWQsIHJldD0lZCIsIHJldCk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgICAgIHJldCA9IEFDYW1lcmFEZXZpY2VfY3JlYXRlQ2FwdHVyZVNlc3Npb24obURldmljZSwgbU91dHB1dHMsICZtU2Vzc2lvbkNiLCAmbVNlc3Npb24pOworICAgICAgICBpZiAocmV0ICE9IEFNRURJQV9PSykgeworICAgICAgICAgICAgQUxPR0UoIkFDYW1lcmFEZXZpY2VfY3JlYXRlQ2FwdHVyZVNlc3Npb24gZmFpbGVkLCByZXQ9JWQiLCByZXQpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENyZWF0ZSBjYXB0dXJlIHJlcXVlc3QKKyAgICAgICAgcmV0ID0gQUNhbWVyYURldmljZV9jcmVhdGVDYXB0dXJlUmVxdWVzdChtRGV2aWNlLCBURU1QTEFURV9TVElMTF9DQVBUVVJFLCAmbVN0aWxsUmVxdWVzdCk7CisgICAgICAgIGlmIChyZXQgIT0gQU1FRElBX09LKSB7CisgICAgICAgICAgICBBTE9HRSgiQUNhbWVyYURldmljZV9jcmVhdGVDYXB0dXJlUmVxdWVzdCBmYWlsZWQsIHJldD0lZCIsIHJldCk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgICAgIHJldCA9IEFDYW1lcmFPdXRwdXRUYXJnZXRfY3JlYXRlKG1JbWdSZWFkZXJBbncsICZtUmVxSW1nUmVhZGVyT3V0cHV0KTsKKyAgICAgICAgaWYgKHJldCAhPSBBTUVESUFfT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJBQ2FtZXJhT3V0cHV0VGFyZ2V0X2NyZWF0ZSBmYWlsZWQsIHJldD0lZCIsIHJldCk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgICAgIHJldCA9IEFDYXB0dXJlUmVxdWVzdF9hZGRUYXJnZXQobVN0aWxsUmVxdWVzdCwgbVJlcUltZ1JlYWRlck91dHB1dCk7CisgICAgICAgIGlmIChyZXQgIT0gQU1FRElBX09LKSB7CisgICAgICAgICAgICBBTE9HRSgiQUNhcHR1cmVSZXF1ZXN0X2FkZFRhcmdldCBmYWlsZWQsIHJldD0lZCIsIHJldCk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisKKyAgICAgICAgbUlzQ2FtZXJhUmVhZHkgPSB0cnVlOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBib29sIGlzQ2FwYWJpbGl0eVN1cHBvcnRlZChhY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9yZXF1ZXN0X2F2YWlsYWJsZV9jYXBhYmlsaXRpZXNfdCBjYXApIHsKKyAgICAgICAgQUNhbWVyYU1ldGFkYXRhX2NvbnN0X2VudHJ5IGVudHJ5OworICAgICAgICBBQ2FtZXJhTWV0YWRhdGFfZ2V0Q29uc3RFbnRyeSgKKyAgICAgICAgICAgICAgICBtQ2FtZXJhTWV0YWRhdGEsIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTLCAmZW50cnkpOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgZW50cnkuY291bnQ7IGkrKykgeworICAgICAgICAgICAgaWYgKGVudHJ5LmRhdGEudThbaV0gPT0gY2FwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGJvb2wgaXNDYW1lcmFSZWFkeSgpIHsgcmV0dXJuIG1Jc0NhbWVyYVJlYWR5OyB9CisKKyAgICB2b2lkIGNsb3NlQ2FtZXJhKCkgeworICAgICAgICAvLyBEZXN0cm95IGNhcHR1cmUgcmVxdWVzdAorICAgICAgICBpZiAobVJlcUltZ1JlYWRlck91dHB1dCkgeworICAgICAgICAgICAgQUNhbWVyYU91dHB1dFRhcmdldF9mcmVlKG1SZXFJbWdSZWFkZXJPdXRwdXQpOworICAgICAgICAgICAgbVJlcUltZ1JlYWRlck91dHB1dCA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1TdGlsbFJlcXVlc3QpIHsKKyAgICAgICAgICAgIEFDYXB0dXJlUmVxdWVzdF9mcmVlKG1TdGlsbFJlcXVlc3QpOworICAgICAgICAgICAgbVN0aWxsUmVxdWVzdCA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgLy8gRGVzdHJveSBjYXB0dXJlIHNlc3Npb24KKyAgICAgICAgaWYgKG1TZXNzaW9uICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jbG9zZShtU2Vzc2lvbik7CisgICAgICAgICAgICBtU2Vzc2lvbiA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1JbWdSZWFkZXJPdXRwdXQpIHsKKyAgICAgICAgICAgIEFDYXB0dXJlU2Vzc2lvbk91dHB1dF9mcmVlKG1JbWdSZWFkZXJPdXRwdXQpOworICAgICAgICAgICAgbUltZ1JlYWRlck91dHB1dCA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1PdXRwdXRzKSB7CisgICAgICAgICAgICBBQ2FwdHVyZVNlc3Npb25PdXRwdXRDb250YWluZXJfZnJlZShtT3V0cHV0cyk7CisgICAgICAgICAgICBtT3V0cHV0cyA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgLy8gRGVzdHJveSBjYW1lcmEgZGV2aWNlCisgICAgICAgIGlmIChtRGV2aWNlKSB7CisgICAgICAgICAgICBBQ2FtZXJhRGV2aWNlX2Nsb3NlKG1EZXZpY2UpOworICAgICAgICAgICAgbURldmljZSA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1DYW1lcmFNZXRhZGF0YSkgeworICAgICAgICAgIEFDYW1lcmFNZXRhZGF0YV9mcmVlKG1DYW1lcmFNZXRhZGF0YSk7CisgICAgICAgICAgbUNhbWVyYU1ldGFkYXRhID0gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICAvLyBEZXN0cm95IGNhbWVyYSBtYW5hZ2VyCisgICAgICAgIGlmIChtQ2FtZXJhSWRMaXN0KSB7CisgICAgICAgICAgICBBQ2FtZXJhTWFuYWdlcl9kZWxldGVDYW1lcmFJZExpc3QobUNhbWVyYUlkTGlzdCk7CisgICAgICAgICAgICBtQ2FtZXJhSWRMaXN0ID0gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICBpZiAobUNhbWVyYU1hbmFnZXIpIHsKKyAgICAgICAgICAgIEFDYW1lcmFNYW5hZ2VyX2RlbGV0ZShtQ2FtZXJhTWFuYWdlcik7CisgICAgICAgICAgICBtQ2FtZXJhTWFuYWdlciA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgbUlzQ2FtZXJhUmVhZHkgPSBmYWxzZTsKKyAgICB9CisKKyAgICBpbnQgdGFrZVBpY3R1cmUoKSB7CisgICAgICAgIGludCBzZXFJZDsKKyAgICAgICAgcmV0dXJuIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlKG1TZXNzaW9uLCAmbUNhcHR1cmVDYWxsYmFja3MsIDEsICZtU3RpbGxSZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlcUlkKTsKKyAgICB9CisKKyAgICBib29sIGNoZWNrQ2FsbGJhY2tzKGludCBwaWN0dXJlQ291bnQpIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICAgICAgaWYgKG1Db21wbGV0ZWRDYXB0dXJlQ2FsbGJhY2tDb3VudCAhPSBwaWN0dXJlQ291bnQpIHsKKyAgICAgICAgICAgIEFMT0dFKCJDb21wbGV0ZWQgY2FwdHVyZSBjYWxsYWJhY2sgY291bnQgbm90IGFzIGV4cGVjdGVkLiBleHBlY3RlZCAlZCBhY3R1YWwgJWQiLAorICAgICAgICAgICAgICAgICAgcGljdHVyZUNvdW50LCBtQ29tcGxldGVkQ2FwdHVyZUNhbGxiYWNrQ291bnQpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHN0YXRpYyB2b2lkIG9uRGV2aWNlRGlzY29ubmVjdGVkKHZvaWQqIC8qb2JqKi8sIEFDYW1lcmFEZXZpY2UqIC8qZGV2aWNlKi8pIHt9CisKKyAgICBzdGF0aWMgdm9pZCBvbkRldmljZUVycm9yKHZvaWQqIC8qb2JqKi8sIEFDYW1lcmFEZXZpY2UqIC8qZGV2aWNlKi8sIGludCAvKmVycm9yQ29kZSovKSB7fQorCisgICAgc3RhdGljIHZvaWQgb25TZXNzaW9uQ2xvc2VkKHZvaWQqIC8qb2JqKi8sIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbiogLypzZXNzaW9uKi8pIHt9CisKKyAgICBzdGF0aWMgdm9pZCBvblNlc3Npb25SZWFkeSh2b2lkKiAvKm9iaiovLCBBQ2FtZXJhQ2FwdHVyZVNlc3Npb24qIC8qc2Vzc2lvbiovKSB7fQorCisgICAgc3RhdGljIHZvaWQgb25TZXNzaW9uQWN0aXZlKHZvaWQqIC8qb2JqKi8sIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbiogLypzZXNzaW9uKi8pIHt9CisKKyAgIHByaXZhdGU6CisgICAgQUNhbWVyYURldmljZV9TdGF0ZUNhbGxiYWNrcyBtRGV2aWNlQ2J7dGhpcywgb25EZXZpY2VEaXNjb25uZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25EZXZpY2VFcnJvcn07CisgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX3N0YXRlQ2FsbGJhY2tzIG1TZXNzaW9uQ2J7CisgICAgICAgIHRoaXMsIG9uU2Vzc2lvbkNsb3NlZCwgb25TZXNzaW9uUmVhZHksIG9uU2Vzc2lvbkFjdGl2ZX07CisKKyAgICBuYXRpdmVfaGFuZGxlX3QqIG1JbWdSZWFkZXJBbncgPSBudWxscHRyOyAgLy8gbm90IG93bmVkIGJ5IHVzLgorCisgICAgLy8gQ2FtZXJhIG1hbmFnZXIKKyAgICBBQ2FtZXJhTWFuYWdlciogbUNhbWVyYU1hbmFnZXIgPSBudWxscHRyOworICAgIEFDYW1lcmFJZExpc3QqIG1DYW1lcmFJZExpc3QgPSBudWxscHRyOworICAgIC8vIENhbWVyYSBkZXZpY2UKKyAgICBBQ2FtZXJhTWV0YWRhdGEqIG1DYW1lcmFNZXRhZGF0YSA9IG51bGxwdHI7CisgICAgQUNhbWVyYURldmljZSogbURldmljZSA9IG51bGxwdHI7CisgICAgLy8gQ2FwdHVyZSBzZXNzaW9uCisgICAgQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyKiBtT3V0cHV0cyA9IG51bGxwdHI7CisgICAgQUNhcHR1cmVTZXNzaW9uT3V0cHV0KiBtSW1nUmVhZGVyT3V0cHV0ID0gbnVsbHB0cjsKKyAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb24qIG1TZXNzaW9uID0gbnVsbHB0cjsKKyAgICAvLyBDYXB0dXJlIHJlcXVlc3QKKyAgICBBQ2FwdHVyZVJlcXVlc3QqIG1TdGlsbFJlcXVlc3QgPSBudWxscHRyOworICAgIEFDYW1lcmFPdXRwdXRUYXJnZXQqIG1SZXFJbWdSZWFkZXJPdXRwdXQgPSBudWxscHRyOworCisgICAgYm9vbCBtSXNDYW1lcmFSZWFkeSA9IGZhbHNlOworICAgIGNvbnN0IGNoYXIqIG1DYW1lcmFJZDsKKyAgICBpbnQgbUNvbXBsZXRlZENhcHR1cmVDYWxsYmFja0NvdW50ID0gMDsKKyAgICBzdGQ6Om11dGV4IG1NdXRleDsKKyAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrcyBtQ2FwdHVyZUNhbGxiYWNrcyA9IHsKKyAgICAgICAgLy8gVE9ETzogQWRkIHRlc3RzIGZvciBvdGhlciBjYWxsYmFja3MKKyAgICAgICAgdGhpcywgLy8gY29udGV4dAorICAgICAgICBudWxscHRyLCAvLyBvbkNhcHR1cmVTdGFydGVkCisgICAgICAgIG51bGxwdHIsIC8vIG9uQ2FwdHVyZVByb2dyZXNzZWQKKyAgICAgICAgLy8gb25DYXB0dXJlQ29tcGxldGVkLCBjYWxsZWQgc2VyaWFsbHksIHNvIG5vIGxvY2sgbmVlZGVkLgorICAgICAgICBbXSh2b2lkKiBjdHggLCBBQ2FtZXJhQ2FwdHVyZVNlc3Npb24gKiwgQUNhcHR1cmVSZXF1ZXN0ICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBQ2FtZXJhTWV0YWRhdGEgKikgeworICAgICAgICAgICAgQ2FtZXJhSGVscGVyICpjaCA9IHN0YXRpY19jYXN0PENhbWVyYUhlbHBlciAqPihjdHgpOworICAgICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soY2gtPm1NdXRleCk7CisgICAgICAgICAgICBjaC0+bUNvbXBsZXRlZENhcHR1cmVDYWxsYmFja0NvdW50Kys7CisgICAgICAgIH0sCisgICAgICAgIG51bGxwdHIsIC8vIG9uQ2FwdHVyZUZhaWxlZAorICAgICAgICBudWxscHRyLCAvLyBvbkNhcHR1cmVTZXF1ZW5jZUNvbXBsZXRlZAorICAgICAgICBudWxscHRyLCAvLyBvbkNhcHR1cmVTZXF1ZW5jZUFib3J0ZWQKKyAgICAgICAgbnVsbHB0ciwgLy8gb25DYXB0dXJlQnVmZmVyTG9zdAorICB9OworCit9OworCitjbGFzcyBJbWFnZVJlYWRlclRlc3RDYXNlIHsKKyAgIHB1YmxpYzoKKyAgICBJbWFnZVJlYWRlclRlc3RDYXNlKGludDMyX3Qgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgdXNhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG1heEltYWdlcywKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYXN5bmMpCisgICAgICAgIDogbVdpZHRoKHdpZHRoKSwKKyAgICAgICAgICBtSGVpZ2h0KGhlaWdodCksCisgICAgICAgICAgbUZvcm1hdChmb3JtYXQpLAorICAgICAgICAgIG1Vc2FnZSh1c2FnZSksCisgICAgICAgICAgbU1heEltYWdlcyhtYXhJbWFnZXMpLAorICAgICAgICAgIG1Bc3luYyhhc3luYykge30KKworICAgIH5JbWFnZVJlYWRlclRlc3RDYXNlKCkgeworICAgICAgICBpZiAobUltZ1JlYWRlckFudykgeworICAgICAgICAgICAgQUltYWdlUmVhZGVyX2RlbGV0ZShtSW1nUmVhZGVyKTsKKyAgICAgICAgICAgIC8vIE5vIG5lZWQgdG8gY2FsbCBuYXRpdmVfaGFuZGxlX3RfcmVsZWFzZSBvbiBpbWFnZVJlYWRlckFudworICAgICAgICB9CisgICAgfQorCisgICAgaW50IGluaXRJbWFnZVJlYWRlcigpIHsKKyAgICAgICAgaWYgKG1JbWdSZWFkZXIgIT0gbnVsbHB0ciB8fCBtSW1nUmVhZGVyQW53ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dFKCJDYW5ub3QgcmUtaW5pdGFsaXplIGltYWdlIHJlYWRlciwgbUltZ1JlYWRlcj0lcCwgbUltZ1JlYWRlckFudz0lcCIsIG1JbWdSZWFkZXIsCisgICAgICAgICAgICAgICAgICBtSW1nUmVhZGVyQW53KTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIG1lZGlhX3N0YXR1c190IHJldCA9IEFJbWFnZVJlYWRlcl9uZXdXaXRoVXNhZ2UoCisgICAgICAgICAgICAgICAgbVdpZHRoLCBtSGVpZ2h0LCBtRm9ybWF0LCBtVXNhZ2UsIG1NYXhJbWFnZXMsICZtSW1nUmVhZGVyKTsKKyAgICAgICAgaWYgKHJldCAhPSBBTUVESUFfT0sgfHwgbUltZ1JlYWRlciA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGNyZWF0ZSBuZXcgQUltYWdlUmVhZGVyLCByZXQ9JWQsIG1JbWdSZWFkZXI9JXAiLCByZXQsIG1JbWdSZWFkZXIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgcmV0ID0gQUltYWdlUmVhZGVyX3NldEltYWdlTGlzdGVuZXIobUltZ1JlYWRlciwgJm1SZWFkZXJBdmFpbGFibGVDYik7CisgICAgICAgIGlmIChyZXQgIT0gQU1FRElBX09LKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHNldCBpbWFnZSBhdmFpbGFibGUgbGlzdGVuZXIsIHJldD0lZC4iLCByZXQpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorCisgICAgICAgIHJldCA9IEFJbWFnZVJlYWRlcl9zZXRCdWZmZXJSZW1vdmVkTGlzdGVuZXIobUltZ1JlYWRlciwgJm1SZWFkZXJEZXRhY2hlZENiKTsKKyAgICAgICAgaWYgKHJldCAhPSBBTUVESUFfT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc2V0IGJ1ZmZlciBkZXRhY2hpbmcgbGlzdGVuZXIsIHJldD0lZC4iLCByZXQpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorCisgICAgICAgIHJldCA9IEFJbWFnZVJlYWRlcl9nZXRXaW5kb3dOYXRpdmVIYW5kbGUobUltZ1JlYWRlciwgJm1JbWdSZWFkZXJBbncpOworICAgICAgICBpZiAocmV0ICE9IEFNRURJQV9PSyB8fCBtSW1nUmVhZGVyQW53ID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZ2V0IG5hdGl2ZV9oYW5kbGVfdCBmcm9tIEFJbWFnZVJlYWRlciwgcmV0PSVkLCBtSW1nUmVhZGVyQW53PSVwLiIsIHJldCwKKyAgICAgICAgICAgICAgICAgIG1JbWdSZWFkZXJBbncpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgbmF0aXZlX2hhbmRsZV90KiBnZXROYXRpdmVXaW5kb3coKSB7IHJldHVybiBtSW1nUmVhZGVyQW53OyB9CisKKyAgICBpbnQgZ2V0QWNxdWlyZWRJbWFnZUNvdW50KCkgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworICAgICAgICByZXR1cm4gbUFjcXVpcmVkSW1hZ2VDb3VudDsKKyAgICB9CisKKyAgICB2b2lkIEhhbmRsZUltYWdlQXZhaWxhYmxlKEFJbWFnZVJlYWRlciogcmVhZGVyKSB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisKKyAgICAgICAgQUltYWdlKiBvdXRJbWFnZSA9IG51bGxwdHI7CisgICAgICAgIG1lZGlhX3N0YXR1c190IHJldDsKKworICAgICAgICAvLyBNYWtlIHN1cmUgQUltYWdlIHdpbGwgYmUgZGVsZXRlZCBhdXRvbWF0aWNhbGx5IHdoZW4gaXQgZ29lcyBvdXQgb2YKKyAgICAgICAgLy8gc2NvcGUuCisgICAgICAgIGF1dG8gaW1hZ2VEZWxldGVyID0gW3RoaXNdKEFJbWFnZSogaW1nKSB7CisgICAgICAgICAgICBpZiAobUFzeW5jKSB7CisgICAgICAgICAgICAgICAgQUltYWdlX2RlbGV0ZUFzeW5jKGltZywga0R1bW15RmVuY2VGZCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFJbWFnZV9kZWxldGUoaW1nKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEFJbWFnZSwgZGVjbHR5cGUoaW1hZ2VEZWxldGVyKT4gaW1nKG51bGxwdHIsIGltYWdlRGVsZXRlcik7CisKKyAgICAgICAgaWYgKG1Bc3luYykgeworICAgICAgICAgICAgaW50IG91dEZlbmNlRmQgPSAwOworICAgICAgICAgICAgLy8gVmVyaXR5IHRoYXQgb3V0RmVuY2VGZCdzIHZhbHVlIHdpbGwgYmUgY2hhbmdlZCBieQorICAgICAgICAgICAgLy8gQUltYWdlUmVhZGVyX2FjcXVpcmVOZXh0SW1hZ2VBc3luYy4KKyAgICAgICAgICAgIHJldCA9IEFJbWFnZVJlYWRlcl9hY3F1aXJlTmV4dEltYWdlQXN5bmMocmVhZGVyLCAmb3V0SW1hZ2UsICZvdXRGZW5jZUZkKTsKKyAgICAgICAgICAgIGlmIChyZXQgIT0gQU1FRElBX09LIHx8IG91dEltYWdlID09IG51bGxwdHIgfHwgb3V0RmVuY2VGZCA9PSAwKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBhY3F1aXJlIGltYWdlLCByZXQ9JWQsIG91dElhbWdlPSVwLCBvdXRGZW5jZUZkPSVkLiIsIHJldCwgb3V0SW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgb3V0RmVuY2VGZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW1nLnJlc2V0KG91dEltYWdlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldCA9IEFJbWFnZVJlYWRlcl9hY3F1aXJlTmV4dEltYWdlKHJlYWRlciwgJm91dEltYWdlKTsKKyAgICAgICAgICAgIGlmIChyZXQgIT0gQU1FRElBX09LIHx8IG91dEltYWdlID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGFjcXVpcmUgaW1hZ2UsIHJldD0lZCwgb3V0SWFtZ2U9JXAuIiwgcmV0LCBvdXRJbWFnZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW1nLnJlc2V0KG91dEltYWdlKTsKKyAgICAgICAgfQorCisgICAgICAgIEFIYXJkd2FyZUJ1ZmZlciogb3V0QnVmZmVyID0gbnVsbHB0cjsKKyAgICAgICAgcmV0ID0gQUltYWdlX2dldEhhcmR3YXJlQnVmZmVyKGltZy5nZXQoKSwgJm91dEJ1ZmZlcik7CisgICAgICAgIGlmIChyZXQgIT0gQU1FRElBX09LIHx8IG91dEJ1ZmZlciA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGQgdG8gZ2V0IGhhcmR3YXJlIGJ1ZmZlciwgcmV0PSVkLCBvdXRCdWZmZXI9JXAuIiwgcmV0LCBvdXRCdWZmZXIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gTm8gbmVlZCB0byByZWxlYXNlIEFIYXJkd2FyZUJ1ZmZlciwgc2luY2Ugd2UgZG9uJ3QgYWNxdWlyZSBhZGRpdGlvbmFsCisgICAgICAgIC8vIHJlZmVyZW5jZSB0byBpdC4KKyAgICAgICAgQUhhcmR3YXJlQnVmZmVyX0Rlc2Mgb3V0RGVzYzsKKyAgICAgICAgQUhhcmR3YXJlQnVmZmVyX2Rlc2NyaWJlKG91dEJ1ZmZlciwgJm91dERlc2MpOworICAgICAgICBpbnQzMl90IGltYWdlV2lkdGggPSAwOworICAgICAgICBpbnQzMl90IGltYWdlSGVpZ2h0ID0gMDsKKyAgICAgICAgaW50MzJfdCBidWZmZXJXaWR0aCA9IHN0YXRpY19jYXN0PGludDMyX3Q+KG91dERlc2Mud2lkdGgpOworICAgICAgICBpbnQzMl90IGJ1ZmZlckhlaWdodCA9IHN0YXRpY19jYXN0PGludDMyX3Q+KG91dERlc2MuaGVpZ2h0KTsKKworICAgICAgICBBSW1hZ2VfZ2V0V2lkdGgob3V0SW1hZ2UsICZpbWFnZVdpZHRoKTsKKyAgICAgICAgQUltYWdlX2dldEhlaWdodChvdXRJbWFnZSwgJmltYWdlSGVpZ2h0KTsKKyAgICAgICAgaWYgKGltYWdlV2lkdGggIT0gbVdpZHRoIHx8IGltYWdlSGVpZ2h0ICE9IG1IZWlnaHQpIHsKKyAgICAgICAgICAgIEFMT0dFKCJNaXNtYXRjaGVkIG91dHB1dCBpbWFnZSBkaW1lbnNpb246IGV4cGVjdGVkPSVkeCVkLCBhY3R1YWw9JWR4JWQiLCBtV2lkdGgsCisgICAgICAgICAgICAgICAgICBtSGVpZ2h0LCBpbWFnZVdpZHRoLCBpbWFnZUhlaWdodCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAobUZvcm1hdCA9PSBBSU1BR0VfRk9STUFUX1JHQkFfODg4OCB8fAorICAgICAgICAgICAgbUZvcm1hdCA9PSBBSU1BR0VfRk9STUFUX1JHQlhfODg4OCB8fAorICAgICAgICAgICAgbUZvcm1hdCA9PSBBSU1BR0VfRk9STUFUX1JHQl84ODggfHwKKyAgICAgICAgICAgIG1Gb3JtYXQgPT0gQUlNQUdFX0ZPUk1BVF9SR0JfNTY1IHx8CisgICAgICAgICAgICBtRm9ybWF0ID09IEFJTUFHRV9GT1JNQVRfUkdCQV9GUDE2IHx8CisgICAgICAgICAgICBtRm9ybWF0ID09IEFJTUFHRV9GT1JNQVRfWVVWXzQyMF84ODggfHwKKyAgICAgICAgICAgIG1Gb3JtYXQgPT0gQUlNQUdFX0ZPUk1BVF9ZOCkgeworICAgICAgICAgICAgLy8gQ2hlY2sgb3V0cHV0IGJ1ZmZlciBkaW1lbnNpb24gZm9yIGNlcnRhaW4gZm9ybWF0cy4gRG9uJ3QgZG8gdGhpcyBmb3IgYmxvYiBiYXNlZAorICAgICAgICAgICAgLy8gZm9ybWF0cy4KKyAgICAgICAgICAgIGlmIChidWZmZXJXaWR0aCAhPSBtV2lkdGggfHwgYnVmZmVySGVpZ2h0ICE9IG1IZWlnaHQpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiTWlzbWF0Y2hlZCBvdXRwdXQgYnVmZmVyIGRpbWVuc2lvbjogZXhwZWN0ZWQ9JWR4JWQsIGFjdHVhbD0lZHglZCIsIG1XaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICBtSGVpZ2h0LCBidWZmZXJXaWR0aCwgYnVmZmVySGVpZ2h0KTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoKG91dERlc2MudXNhZ2UgJiBtVXNhZ2UpICE9IG1Vc2FnZSkgeworICAgICAgICAgICAgQUxPR0UoIk1pc21hdGNoZWQgb3V0cHV0IGJ1ZmZlciB1c2FnZTogYWN0dWFsICglIiBQUkl1NjQgIiksIGV4cGVjdGVkICglIiBQUkl1NjQgIikiLAorICAgICAgICAgICAgICAgICAgb3V0RGVzYy51c2FnZSwgbVVzYWdlKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHVpbnQ4X3QqIGRhdGEgPSBudWxscHRyOworICAgICAgICBpbnQgZGF0YUxlbmd0aCA9IDA7CisgICAgICAgIHJldCA9IEFJbWFnZV9nZXRQbGFuZURhdGEoaW1nLmdldCgpLCAwLCAmZGF0YSwgJmRhdGFMZW5ndGgpOworICAgICAgICBpZiAobVVzYWdlICYgQUhBUkRXQVJFQlVGRkVSX1VTQUdFX0NQVV9SRUFEX09GVEVOKSB7CisgICAgICAgICAgICAvLyBXaGVuIHdlIGhhdmUgQ1BVX1JFQURfT0ZURU4gdXNhZ2UgYml0cywgd2UgY2FuIGxvY2sgdGhlIGltYWdlLgorICAgICAgICAgICAgaWYgKHJldCAhPSBBTUVESUFfT0sgfHwgZGF0YSA9PSBudWxscHRyIHx8IGRhdGFMZW5ndGggPCAwKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBhY2Nlc3MgQ1BVIGRhdGEsIHJldD0lZCwgZGF0YT0lcCwgZGF0YUxlbmd0aD0lZCIsIHJldCwgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICBkYXRhTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAocmV0ICE9IEFNRURJQV9JTUdSRUFERVJfQ0FOTk9UX0xPQ0tfSU1BR0UgfHwgZGF0YSAhPSBudWxscHRyIHx8IGRhdGFMZW5ndGggIT0gMCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJTaG91bGRuJ3QgYmUgYWJsZSB0byBhY2Nlc3MgQ1BVIGRhdGEsIHJldD0lZCwgZGF0YT0lcCwgZGF0YUxlbmd0aD0lZCIsIHJldCwKKyAgICAgICAgICAgICAgICAgICAgICBkYXRhLCBkYXRhTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gT25seSBpbmNyZWFzZSBtQWNxdWlyZWRJbWFnZUNvdW50IGlmIGFsbCBjaGVja3MgcGFzcy4KKyAgICAgICAgbUFjcXVpcmVkSW1hZ2VDb3VudCsrOworICAgIH0KKworICAgIHN0YXRpYyB2b2lkIG9uSW1hZ2VBdmFpbGFibGUodm9pZCogb2JqLCBBSW1hZ2VSZWFkZXIqIHJlYWRlcikgeworICAgICAgICBJbWFnZVJlYWRlclRlc3RDYXNlKiB0aGl6ID0gcmVpbnRlcnByZXRfY2FzdDxJbWFnZVJlYWRlclRlc3RDYXNlKj4ob2JqKTsKKyAgICAgICAgdGhpei0+SGFuZGxlSW1hZ2VBdmFpbGFibGUocmVhZGVyKTsKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZAorICAgIG9uQnVmZmVyUmVtb3ZlZCh2b2lkKiAvKm9iaiovLCBBSW1hZ2VSZWFkZXIqIC8qcmVhZGVyKi8sIEFIYXJkd2FyZUJ1ZmZlciogLypidWZmZXIqLykgeworICAgICAgICAvLyBOby1vcCwganVzdCB0byBjaGVjayB0aGUgbGlzdGVuZXIgY2FuIGJlIHNldCBwcm9wZXJseS4KKyAgICB9CisKKyAgIHByaXZhdGU6CisgICAgaW50MzJfdCBtV2lkdGg7CisgICAgaW50MzJfdCBtSGVpZ2h0OworICAgIGludDMyX3QgbUZvcm1hdDsKKyAgICB1aW50NjRfdCBtVXNhZ2U7CisgICAgaW50MzJfdCBtTWF4SW1hZ2VzOworICAgIGJvb2wgbUFzeW5jOworCisgICAgc3RkOjptdXRleCBtTXV0ZXg7CisgICAgaW50IG1BY3F1aXJlZEltYWdlQ291bnR7MH07CisKKyAgICBBSW1hZ2VSZWFkZXIqIG1JbWdSZWFkZXIgPSBudWxscHRyOworICAgIG5hdGl2ZV9oYW5kbGVfdCogbUltZ1JlYWRlckFudyA9IG51bGxwdHI7CisKKyAgICBBSW1hZ2VSZWFkZXJfSW1hZ2VMaXN0ZW5lciBtUmVhZGVyQXZhaWxhYmxlQ2J7dGhpcywgb25JbWFnZUF2YWlsYWJsZX07CisgICAgQUltYWdlUmVhZGVyX0J1ZmZlclJlbW92ZWRMaXN0ZW5lciBtUmVhZGVyRGV0YWNoZWRDYnt0aGlzLCBvbkJ1ZmZlclJlbW92ZWR9OworfTsKKworYm9vbCB0YWtlUGljdHVyZXModWludDY0X3QgcmVhZGVyVXNhZ2UsIGludCByZWFkZXJNYXhJbWFnZXMsIGJvb2wgcmVhZGVyQXN5bmMsIGludCBwaWN0dXJlQ291bnQpIHsKKyAgICBpbnQgcmV0ID0gMDsKKyAgICBJbWFnZVJlYWRlclRlc3RDYXNlIHRlc3RDYXNlKAorICAgICAgICAgICAga1Rlc3RJbWFnZVdpZHRoLCBrVGVzdEltYWdlSGVpZ2h0LCBrVGVzdEltYWdlRm9ybWF0LCByZWFkZXJVc2FnZSwgcmVhZGVyTWF4SW1hZ2VzLAorICAgICAgICAgICAgcmVhZGVyQXN5bmMpOworICAgIHJldCA9IHRlc3RDYXNlLmluaXRJbWFnZVJlYWRlcigpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gaW5pdGlhbGl6ZSBJbWFnZVJlYWRlciIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQ2FtZXJhSGVscGVyIGNhbWVyYUhlbHBlcih0ZXN0Q2FzZS5nZXROYXRpdmVXaW5kb3coKSk7CisgICAgcmV0ID0gY2FtZXJhSGVscGVyLmluaXRDYW1lcmEoKTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIGluaXRpYWxpemUgY2FtZXJhIGhlbHBlciIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKCFjYW1lcmFIZWxwZXIuaXNDYW1lcmFSZWFkeSgpKSB7CisgICAgICAgIEFMT0dXKCJDYW1lcmEgaXMgbm90IHJlYWR5IGFmdGVyIHN1Y2Nlc3NmdWwgaW5pdGlhbGl6YXRpb24uIEl0J3MgZWl0aGVyIGR1ZSB0byBjYW1lcmEgb24gIgorICAgICAgICAgICAgICAiYm9hcmQgbGFja3MgQkFDS1dBUkRTX0NPTVBBVElCTEUgY2FwYWJpbGl0eSBvciB0aGUgZGV2aWNlIGRvZXMgbm90IGhhdmUgY2FtZXJhIG9uICIKKyAgICAgICAgICAgICAgImJvYXJkLiIpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHBpY3R1cmVDb3VudDsgaSsrKSB7CisgICAgICAgIHJldCA9IGNhbWVyYUhlbHBlci50YWtlUGljdHVyZSgpOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgQUxPR0UoIlVuYWJsZSB0byB0YWtlIHBpY3R1cmUiKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFNsZWVwIHVudGlsIGFsbCBjYXB0dXJlIGZpbmlzaGVkCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrQ2FwdHVyZVdhaXRSZXRyeSAqIHBpY3R1cmVDb3VudDsgaSsrKSB7CisgICAgICAgIHVzbGVlcChrQ2FwdHVyZVdhaXRVcyk7CisgICAgICAgIGlmICh0ZXN0Q2FzZS5nZXRBY3F1aXJlZEltYWdlQ291bnQoKSA9PSBwaWN0dXJlQ291bnQpIHsKKyAgICAgICAgICAgIEFMT0dJKCJTZXNzaW9uIHRha2UgfiVkIG1zIHRvIGNhcHR1cmUgJWQgaW1hZ2VzIiwgaSAqIGtDYXB0dXJlV2FpdFVzIC8gMTAwMCwKKyAgICAgICAgICAgICAgICAgIHBpY3R1cmVDb3VudCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdGVzdENhc2UuZ2V0QWNxdWlyZWRJbWFnZUNvdW50KCkgPT0gcGljdHVyZUNvdW50ICYmCisgICAgICAgICAgICBjYW1lcmFIZWxwZXIuY2hlY2tDYWxsYmFja3MocGljdHVyZUNvdW50KTsKK30KKworY2xhc3MgQUltYWdlUmVhZGVyV2luZG93SGFuZGxlVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworICAgcHVibGljOgorICAgIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7CisgICAgfQorICAgIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7CisKKyAgICB9CisKK307CisKK2Jvb2wgdGVzdFRha2VQaWN0dXJlc05hdGl2ZSgpIHsKKyAgICBmb3IgKGF1dG8mIHJlYWRlclVzYWdlIDoKKyAgICAgICAgIHtBSEFSRFdBUkVCVUZGRVJfVVNBR0VfQ1BVX1JFQURfT0ZURU59KSB7CisgICAgICAgIGZvciAoYXV0byYgcmVhZGVyTWF4SW1hZ2VzIDogezEsIDQsIDh9KSB7CisgICAgICAgICAgICBmb3IgKGF1dG8mIHJlYWRlckFzeW5jIDoge3RydWUsIGZhbHNlfSkgeworICAgICAgICAgICAgICAgIGZvciAoYXV0byYgcGljdHVyZUNvdW50IDogezEsIDQsIDh9KSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghdGFrZVBpY3R1cmVzKHJlYWRlclVzYWdlLCByZWFkZXJNYXhJbWFnZXMsIHJlYWRlckFzeW5jLCBwaWN0dXJlQ291bnQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiVGVzdCB0YWtlUGljdHVyZXMgZmFpbGVkIGZvciB0ZXN0IGNhc2UgdXNhZ2U9JSIgUFJJdTY0ICIsIG1heEltYWdlcz0lZCwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFzeW5jPSVkLCBwaWN0dXJlQ291bnQ9JWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyVXNhZ2UsIHJlYWRlck1heEltYWdlcywgcmVhZGVyQXN5bmMsIHBpY3R1cmVDb3VudCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKKworVEVTVF9GKEFJbWFnZVJlYWRlcldpbmRvd0hhbmRsZVRlc3QsIENyZWF0ZVdpbmRvd05hdGl2ZUhhbmRsZSkgeworICAgIEVYUEVDVF9UUlVFKHRlc3RUYWtlUGljdHVyZXNOYXRpdmUoKSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZQpkaWZmIC0tZ2l0IGEvY2FtZXJhL3Rlc3RzL0FuZHJvaWQubWsgYi9jYW1lcmEvdGVzdHMvQW5kcm9pZC5tawppbmRleCA2NTk0ODRmLi5lNWMxNjMxIDEwMDY0NAotLS0gYS9jYW1lcmEvdGVzdHMvQW5kcm9pZC5taworKysgYi9jYW1lcmEvdGVzdHMvQW5kcm9pZC5tawpAQCAtMTksNyArMTksOCBAQAogTE9DQUxfU1JDX0ZJTEVTOj0gXAogCVZlbmRvclRhZ0Rlc2NyaXB0b3JUZXN0cy5jcHAgXAogCUNhbWVyYUJpbmRlclRlc3RzLmNwcCBcCi0JQ2FtZXJhWlNMVGVzdHMuY3BwCisJQ2FtZXJhWlNMVGVzdHMuY3BwIFwKKwlDYW1lcmFDaGFyYWN0ZXJpc3RpY3NQZXJtaXNzaW9uLmNwcAogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKIAlsaWJsb2cgXApkaWZmIC0tZ2l0IGEvY2FtZXJhL3Rlc3RzL0NhbWVyYUNoYXJhY3RlcmlzdGljc1Blcm1pc3Npb24uY3BwIGIvY2FtZXJhL3Rlc3RzL0NhbWVyYUNoYXJhY3RlcmlzdGljc1Blcm1pc3Npb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzNWQyYTMKLS0tIC9kZXYvbnVsbAorKysgYi9jYW1lcmEvdGVzdHMvQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzUGVybWlzc2lvbi5jcHAKQEAgLTAsMCArMSw5NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNhbWVyYUNoYXJhY3RlcmlzdGljc1Blcm1pc3Npb24iCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSA8YmluZGVyL1Byb2Nlc3NTdGF0ZS5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmFNZXRhZGF0YS5oPgorI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmEuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL0lDYW1lcmFTZXJ2aWNlLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmhhcmR3YXJlOworCitjbGFzcyBDYW1lcmFDaGFyYWN0ZXJpc3RpY3NQZXJtaXNzaW9uIDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7Citwcm90ZWN0ZWQ6CisKKyAgICBDYW1lcmFDaGFyYWN0ZXJpc3RpY3NQZXJtaXNzaW9uKCkgOiBudW1DYW1lcmFzKDApe30KKyAgICAvL0d0ZXN0IGludGVyZmFjZQorICAgIHZvaWQgU2V0VXAoKSBvdmVycmlkZTsKKyAgICB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGU7CisKKyAgICBpbnQzMl90IG51bUNhbWVyYXM7CisgICAgc3A8SUNhbWVyYVNlcnZpY2U+IG1DYW1lcmFTZXJ2aWNlOworfTsKKwordm9pZCBDYW1lcmFDaGFyYWN0ZXJpc3RpY3NQZXJtaXNzaW9uOjpTZXRVcCgpIHsKKyAgICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIHJjOworICAgIFByb2Nlc3NTdGF0ZTo6c2VsZigpLT5zdGFydFRocmVhZFBvb2woKTsKKyAgICBzcDxJU2VydmljZU1hbmFnZXI+IHNtID0gZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCk7CisgICAgc3A8SUJpbmRlcj4gYmluZGVyID0gc20tPmdldFNlcnZpY2UoU3RyaW5nMTYoIm1lZGlhLmNhbWVyYSIpKTsKKyAgICBtQ2FtZXJhU2VydmljZSA9IGludGVyZmFjZV9jYXN0PElDYW1lcmFTZXJ2aWNlPihiaW5kZXIpOworICAgIHJjID0gbUNhbWVyYVNlcnZpY2UtPmdldE51bWJlck9mQ2FtZXJhcygKKyAgICAgICAgICAgIGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZTo6Q0FNRVJBX1RZUEVfQUxMLCAmbnVtQ2FtZXJhcyk7CisgICAgRVhQRUNUX1RSVUUocmMuaXNPaygpKTsKK30KKwordm9pZCBDYW1lcmFDaGFyYWN0ZXJpc3RpY3NQZXJtaXNzaW9uOjpUZWFyRG93bigpIHsKKyAgICBtQ2FtZXJhU2VydmljZS5jbGVhcigpOworfQorCisvLyBSZXZva2luZyBhbmQgYWNxdWlyaW5nIHBlcm1pc3Npb25zIGF1dG9tYXRpY2FsbHkgbWlnaHQgbm90IGJlIHBvc3NpYmxlLgorLy8gVGVzdCB0aGUgZnVuY3Rpb25hbGl0eSBmb3IgcmVtb3ZhbCBvZiBjYW1lcmEgY2hhcmFjdGVyaXN0aWNzIG5lZWRpbmcKKy8vIGEgY2FtZXJhIHBlcm1pc3Npb24uCitURVNUX0YoQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzUGVybWlzc2lvbiwgVGVzdENhbWVyYVBlcm1pc3Npb24pIHsKKyAgICBmb3IgKGludDMyX3QgY2FtZXJhSWQgPSAwOyBjYW1lcmFJZCA8IG51bUNhbWVyYXM7IGNhbWVyYUlkKyspIHsKKworICAgICAgICBTdHJpbmcxNiBjYW1lcmFJZFN0ciA9IFN0cmluZzE2KFN0cmluZzg6OmZvcm1hdCgiJWQiLCBjYW1lcmFJZCkpOworICAgICAgICBib29sIGlzU3VwcG9ydGVkID0gZmFsc2U7CisgICAgICAgIGF1dG8gcmMgPSBtQ2FtZXJhU2VydmljZS0+c3VwcG9ydHNDYW1lcmFBcGkoY2FtZXJhSWRTdHIsCisgICAgICAgICAgICAgICAgaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlOjpBUElfVkVSU0lPTl8yLCAmaXNTdXBwb3J0ZWQpOworICAgICAgICBFWFBFQ1RfVFJVRShyYy5pc09rKCkpOworICAgICAgICBpZiAoIWlzU3VwcG9ydGVkKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIENhbWVyYU1ldGFkYXRhIG1ldGFkYXRhOworICAgICAgICBzdGQ6OnZlY3RvcjxpbnQzMl90PiB0YWdzTmVlZGluZ1Blcm1pc3Npb247CisgICAgICAgIHJjID0gbUNhbWVyYVNlcnZpY2UtPmdldENhbWVyYUNoYXJhY3RlcmlzdGljcyhjYW1lcmFJZFN0ciwgJm1ldGFkYXRhKTsKKyAgICAgICAgQVNTRVJUX1RSVUUocmMuaXNPaygpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKG1ldGFkYXRhLmlzRW1wdHkoKSk7CisgICAgICAgIEVYUEVDVF9FUShtZXRhZGF0YS5yZW1vdmVQZXJtaXNzaW9uRW50cmllcyhDQU1FUkFfTUVUQURBVEFfSU5WQUxJRF9WRU5ET1JfSUQsCisgICAgICAgICAgICAgICAgICAgICZ0YWdzTmVlZGluZ1Blcm1pc3Npb24pLCBOT19FUlJPUik7CisgICAgICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeV90IGF2YWlsYWJsZUNoYXJhY3RlcmlzdGljcyA9CisgICAgICAgICAgICAgICAgbWV0YWRhdGEuZmluZChBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NIQVJBQ1RFUklTVElDU19LRVlTKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoMCA8IGF2YWlsYWJsZUNoYXJhY3RlcmlzdGljcy5jb3VudCk7CisKKyAgICAgICAgc3RkOjp2ZWN0b3I8dWludDMyX3Q+IGF2YWlsYWJsZUtleXM7CisgICAgICAgIGF2YWlsYWJsZUtleXMucmVzZXJ2ZShhdmFpbGFibGVDaGFyYWN0ZXJpc3RpY3MuY291bnQpOworICAgICAgICBhdmFpbGFibGVLZXlzLmluc2VydChhdmFpbGFibGVLZXlzLmJlZ2luKCksIGF2YWlsYWJsZUNoYXJhY3RlcmlzdGljcy5kYXRhLmkzMiwKKyAgICAgICAgICAgICAgICBhdmFpbGFibGVDaGFyYWN0ZXJpc3RpY3MuZGF0YS5pMzIgKyBhdmFpbGFibGVDaGFyYWN0ZXJpc3RpY3MuY291bnQpOworCisgICAgICAgIGZvciAoY29uc3QgYXV0byAma2V5IDogdGFnc05lZWRpbmdQZXJtaXNzaW9uKSB7CisgICAgICAgICAgICBBU1NFUlRfRkFMU0UobWV0YWRhdGEuZXhpc3RzKGtleSkpOworICAgICAgICAgICAgYXV0byBpdCA9IHN0ZDo6ZmluZChhdmFpbGFibGVLZXlzLmJlZ2luKCksIGF2YWlsYWJsZUtleXMuZW5kKCksIGtleSk7CisgICAgICAgICAgICBBU1NFUlRfVFJVRShpdCA9PSBhdmFpbGFibGVLZXlzLmVuZCgpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NtZHMvc2NyZWVucmVjb3JkL3NjcmVlbnJlY29yZC5jcHAgYi9jbWRzL3NjcmVlbnJlY29yZC9zY3JlZW5yZWNvcmQuY3BwCmluZGV4IGI3Mzk1MWYuLjc4MDNjY2MgMTAwNjQ0Ci0tLSBhL2NtZHMvc2NyZWVucmVjb3JkL3NjcmVlbnJlY29yZC5jcHAKKysrIGIvY21kcy9zY3JlZW5yZWNvcmQvc2NyZWVucmVjb3JkLmNwcApAQCAtMTAyLDcgKzEwMiw3IEBACiBzdGF0aWMgYm9vbCBnTW9ub3RvbmljVGltZSA9IGZhbHNlOyAgICAgLy8gdXNlIHN5c3RlbSBtb25vdG9uaWMgdGltZSBmb3IgdGltZXN0YW1wcwogc3RhdGljIGJvb2wgZ1BlcnNpc3RlbnRTdXJmYWNlID0gZmFsc2U7IC8vIHVzZSBwZXJzaXN0ZW50IHN1cmZhY2UKIHN0YXRpYyBlbnVtIHsKLSAgICBGT1JNQVRfTVA0LCBGT1JNQVRfSDI2NCwgRk9STUFUX0ZSQU1FUywgRk9STUFUX1JBV19GUkFNRVMKKyAgICBGT1JNQVRfTVA0LCBGT1JNQVRfSDI2NCwgRk9STUFUX1dFQk0sIEZPUk1BVF8zR1BQLCBGT1JNQVRfRlJBTUVTLCBGT1JNQVRfUkFXX0ZSQU1FUwogfSBnT3V0cHV0Rm9ybWF0ID0gRk9STUFUX01QNDsgICAgICAgICAgIC8vIGRhdGEgZm9ybWF0IGZvciBvdXRwdXQKIHN0YXRpYyBBU3RyaW5nIGdDb2RlY05hbWUgPSAiIjsgICAgICAgICAvLyBjb2RlYyBuYW1lIG92ZXJyaWRlCiBzdGF0aWMgYm9vbCBnU2l6ZVNwZWNpZmllZCA9IGZhbHNlOyAgICAgLy8gd2FzIHNpemUgZXhwbGljaXRseSByZXF1ZXN0ZWQ/CkBAIC0xOTEsNyArMTkxLDcgQEAKICAgICBmb3JtYXQtPnNldEZsb2F0KCJmcmFtZS1yYXRlIiwgZGlzcGxheUZwcyk7CiAgICAgZm9ybWF0LT5zZXRJbnQzMigiaS1mcmFtZS1pbnRlcnZhbCIsIDEwKTsKIAotICAgIHNwPEFMb29wZXI+IGxvb3BlciA9IG5ldyBBTG9vcGVyOworICAgIHNwPGFuZHJvaWQ6OkFMb29wZXI+IGxvb3BlciA9IG5ldyBhbmRyb2lkOjpBTG9vcGVyOwogICAgIGxvb3Blci0+c2V0TmFtZSgic2NyZWVucmVjb3JkX2xvb3BlciIpOwogICAgIGxvb3Blci0+c3RhcnQoKTsKICAgICBBTE9HVigiQ3JlYXRpbmcgY29kZWMiKTsKQEAgLTI2NCwxMCArMjY0LDEwIEBACiAKICAgICAvLyBTZXQgdGhlIHJlZ2lvbiBvZiB0aGUgbGF5ZXIgc3RhY2sgd2UncmUgaW50ZXJlc3RlZCBpbiwgd2hpY2ggaW4gb3VyCiAgICAgLy8gY2FzZSBpcyAiYWxsIG9mIGl0Ii4KLSAgICBSZWN0IGxheWVyU3RhY2tSZWN0KG1haW5EcHlJbmZvLncsIG1haW5EcHlJbmZvLmgpOworICAgIFJlY3QgbGF5ZXJTdGFja1JlY3QobWFpbkRweUluZm8udmlld3BvcnRXLCBtYWluRHB5SW5mby52aWV3cG9ydEgpOwogCiAgICAgLy8gV2UgbmVlZCB0byBwcmVzZXJ2ZSB0aGUgYXNwZWN0IHJhdGlvIG9mIHRoZSBkaXNwbGF5LgotICAgIGZsb2F0IGRpc3BsYXlBc3BlY3QgPSAoZmxvYXQpIG1haW5EcHlJbmZvLmggLyAoZmxvYXQpIG1haW5EcHlJbmZvLnc7CisgICAgZmxvYXQgZGlzcGxheUFzcGVjdCA9IChmbG9hdCkgbWFpbkRweUluZm8udmlld3BvcnRIIC8gKGZsb2F0KSBtYWluRHB5SW5mby52aWV3cG9ydFc7CiAKIAogICAgIC8vIFNldCB0aGUgd2F5IHdlIG1hcCB0aGUgb3V0cHV0IG9udG8gdGhlIGRpc3BsYXkgc3VyZmFjZSAod2hpY2ggd2lsbApAQCAtMzQ0LDIyICszNDQsNiBAQAogfQogCiAvKgotICogU2V0IHRoZSBtYWluIGRpc3BsYXkgd2lkdGggYW5kIGhlaWdodCB0byB0aGUgYWN0dWFsIHdpZHRoIGFuZCBoZWlnaHQKLSAqLwotc3RhdGljIHN0YXR1c190IGdldEFjdHVhbERpc3BsYXlTaXplKGNvbnN0IHNwPElCaW5kZXI+JiBtYWluRHB5LCBEaXNwbGF5SW5mbyogbWFpbkRweUluZm8pIHsKLSAgICBSZWN0IHZpZXdwb3J0OwotICAgIHN0YXR1c190IGVyciA9IFN1cmZhY2VDb21wb3NlckNsaWVudDo6Z2V0RGlzcGxheVZpZXdwb3J0KG1haW5EcHksICZ2aWV3cG9ydCk7Ci0gICAgaWYgKGVyciAhPSBOT19FUlJPUikgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SOiB1bmFibGUgdG8gZ2V0IGRpc3BsYXkgdmlld3BvcnRcbiIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICBtYWluRHB5SW5mby0+dyA9IHZpZXdwb3J0LndpZHRoKCk7Ci0gICAgbWFpbkRweUluZm8tPmggPSB2aWV3cG9ydC5oZWlnaHQoKTsKLQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotLyoKICAqIFJ1bnMgdGhlIE1lZGlhQ29kZWMgZW5jb2Rlciwgc2VuZGluZyB0aGUgb3V0cHV0IHRvIHRoZSBNZWRpYU11eGVyLiAgVGhlCiAgKiBpbnB1dCBmcmFtZXMgYXJlIGNvbWluZyBmcm9tIHRoZSB2aXJ0dWFsIGRpc3BsYXkgYXMgZmFzdCBhcyBTdXJmYWNlRmxpbmdlcgogICogd2FudHMgdG8gc2VuZCB0aGVtLgpAQCAtNDI5LDIyICs0MTMsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgLy8gdXNlZnVsIHN0dWZmIGlzIGhhcmQgdG8gZ2V0IGF0IHdpdGhvdXQgYSBEYWx2aWsgVk0uCiAgICAgICAgICAgICAgICAgICAgIGVyciA9IFN1cmZhY2VDb21wb3NlckNsaWVudDo6Z2V0RGlzcGxheUluZm8obWFpbkRweSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWFpbkRweUluZm8pOwotICAgICAgICAgICAgICAgICAgICBpZiAoZXJyID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBnZXRBY3R1YWxEaXNwbGF5U2l6ZShtYWluRHB5LCAmbWFpbkRweUluZm8pOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRVJST1I6IHVuYWJsZSB0byBzZXQgYWN0dWFsIGRpc3BsYXkgc2l6ZVxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9yaWVudGF0aW9uICE9IG1haW5EcHlJbmZvLm9yaWVudGF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0QoIm9yaWVudGF0aW9uIGNoYW5nZWQsIG5vdyAlZCIsIG1haW5EcHlJbmZvLm9yaWVudGF0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OlRyYW5zYWN0aW9uIHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0RGlzcGxheVByb2plY3Rpb24odCwgdmlydHVhbERweSwgbWFpbkRweUluZm8pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuYXBwbHkoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmllbnRhdGlvbiA9IG1haW5EcHlJbmZvLm9yaWVudGF0aW9uOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygiZ2V0RGlzcGxheUluZm8obWFpbikgZmFpbGVkOiAlZCIsIGVycik7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAob3JpZW50YXRpb24gIT0gbWFpbkRweUluZm8ub3JpZW50YXRpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJvcmllbnRhdGlvbiBjaGFuZ2VkLCBub3cgJWQiLCBtYWluRHB5SW5mby5vcmllbnRhdGlvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OlRyYW5zYWN0aW9uIHQ7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXREaXNwbGF5UHJvamVjdGlvbih0LCB2aXJ0dWFsRHB5LCBtYWluRHB5SW5mbyk7CisgICAgICAgICAgICAgICAgICAgICAgICB0LmFwcGx5KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBvcmllbnRhdGlvbiA9IG1haW5EcHlJbmZvLm9yaWVudGF0aW9uOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogCkBAIC02MTgsMjUgKzU5NCwxOSBAQAogICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KIAotICAgIGVyciA9IGdldEFjdHVhbERpc3BsYXlTaXplKG1haW5EcHksICZtYWluRHB5SW5mbyk7Ci0gICAgaWYgKGVyciAhPSBOT19FUlJPUikgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SOiB1bmFibGUgdG8gc2V0IGFjdHVhbCBkaXNwbGF5IHNpemVcbiIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQogICAgIGlmIChnVmVyYm9zZSkgewogICAgICAgICBwcmludGYoIk1haW4gZGlzcGxheSBpcyAlZHglZCBAJS4yZmZwcyAob3JpZW50YXRpb249JXUpXG4iLAotICAgICAgICAgICAgICAgIG1haW5EcHlJbmZvLncsIG1haW5EcHlJbmZvLmgsIG1haW5EcHlJbmZvLmZwcywKKyAgICAgICAgICAgICAgICBtYWluRHB5SW5mby52aWV3cG9ydFcsIG1haW5EcHlJbmZvLnZpZXdwb3J0SCwgbWFpbkRweUluZm8uZnBzLAogICAgICAgICAgICAgICAgIG1haW5EcHlJbmZvLm9yaWVudGF0aW9uKTsKICAgICAgICAgZmZsdXNoKHN0ZG91dCk7CiAgICAgfQogCiAgICAgLy8gRW5jb2RlciBjYW4ndCB0YWtlIG9kZCBudW1iZXIgYXMgY29uZmlnCiAgICAgaWYgKGdWaWRlb1dpZHRoID09IDApIHsKLSAgICAgICAgZ1ZpZGVvV2lkdGggPSBmbG9vclRvRXZlbihtYWluRHB5SW5mby53KTsKKyAgICAgICAgZ1ZpZGVvV2lkdGggPSBmbG9vclRvRXZlbihtYWluRHB5SW5mby52aWV3cG9ydFcpOwogICAgIH0KICAgICBpZiAoZ1ZpZGVvSGVpZ2h0ID09IDApIHsKLSAgICAgICAgZ1ZpZGVvSGVpZ2h0ID0gZmxvb3JUb0V2ZW4obWFpbkRweUluZm8uaCk7CisgICAgICAgIGdWaWRlb0hlaWdodCA9IGZsb29yVG9FdmVuKG1haW5EcHlJbmZvLnZpZXdwb3J0SCk7CiAgICAgfQogCiAgICAgLy8gQ29uZmlndXJlIGFuZCBzdGFydCB0aGUgZW5jb2Rlci4KQEAgLTcxNCw3ICs2ODQsOSBAQAogICAgIHNwPE1lZGlhTXV4ZXI+IG11eGVyID0gTlVMTDsKICAgICBGSUxFKiByYXdGcCA9IE5VTEw7CiAgICAgc3dpdGNoIChnT3V0cHV0Rm9ybWF0KSB7Ci0gICAgICAgIGNhc2UgRk9STUFUX01QNDogeworICAgICAgICBjYXNlIEZPUk1BVF9NUDQ6CisgICAgICAgIGNhc2UgRk9STUFUX1dFQk06CisgICAgICAgIGNhc2UgRk9STUFUXzNHUFA6IHsKICAgICAgICAgICAgIC8vIENvbmZpZ3VyZSBtdXhlci4gIFdlIGhhdmUgdG8gd2FpdCBmb3IgdGhlIENTRCBibG9iIGZyb20gdGhlIGVuY29kZXIKICAgICAgICAgICAgIC8vIGJlZm9yZSB3ZSBjYW4gc3RhcnQgaXQuCiAgICAgICAgICAgICBlcnIgPSB1bmxpbmsoZmlsZU5hbWUpOwpAQCAtNzI3LDcgKzY5OSwxMyBAQAogICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRVJST1I6IGNvdWxkbid0IG9wZW4gZmlsZVxuIik7CiAgICAgICAgICAgICAgICAgYWJvcnQoKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG11eGVyID0gbmV3IE1lZGlhTXV4ZXIoZmQsIE1lZGlhTXV4ZXI6Ok9VVFBVVF9GT1JNQVRfTVBFR180KTsKKyAgICAgICAgICAgIGlmIChnT3V0cHV0Rm9ybWF0ID09IEZPUk1BVF9NUDQpIHsKKyAgICAgICAgICAgICAgICBtdXhlciA9IG5ldyBNZWRpYU11eGVyKGZkLCBNZWRpYU11eGVyOjpPVVRQVVRfRk9STUFUX01QRUdfNCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGdPdXRwdXRGb3JtYXQgPT0gRk9STUFUX1dFQk0pIHsKKyAgICAgICAgICAgICAgICBtdXhlciA9IG5ldyBNZWRpYU11eGVyKGZkLCBNZWRpYU11eGVyOjpPVVRQVVRfRk9STUFUX1dFQk0pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtdXhlciA9IG5ldyBNZWRpYU11eGVyKGZkLCBNZWRpYU11eGVyOjpPVVRQVVRfRk9STUFUX1RIUkVFX0dQUCk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBjbG9zZShmZCk7CiAgICAgICAgICAgICBpZiAoZ1JvdGF0ZSkgewogICAgICAgICAgICAgICAgIG11eGVyLT5zZXRPcmllbnRhdGlvbkhpbnQoOTApOyAgLy8gVE9ETzogZG9lcyB0aGlzIGRvIGFueXRoaW5nPwpAQCAtMTA0Nyw2ICsxMDI1LDEwIEBACiAgICAgICAgICAgICAgICAgZ091dHB1dEZvcm1hdCA9IEZPUk1BVF9NUDQ7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChvcHRhcmcsICJoMjY0IikgPT0gMCkgewogICAgICAgICAgICAgICAgIGdPdXRwdXRGb3JtYXQgPSBGT1JNQVRfSDI2NDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG9wdGFyZywgIndlYm0iKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgZ091dHB1dEZvcm1hdCA9IEZPUk1BVF9XRUJNOworICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAob3B0YXJnLCAiM2dwcCIpID09IDApIHsKKyAgICAgICAgICAgICAgICBnT3V0cHV0Rm9ybWF0ID0gRk9STUFUXzNHUFA7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChvcHRhcmcsICJmcmFtZXMiKSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgZ091dHB1dEZvcm1hdCA9IEZPUk1BVF9GUkFNRVM7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChvcHRhcmcsICJyYXctZnJhbWVzIikgPT0gMCkgewpkaWZmIC0tZ2l0IGEvY21kcy9zdGFnZWZyaWdodC9jb2RlYy5jcHAgYi9jbWRzL3N0YWdlZnJpZ2h0L2NvZGVjLmNwcAppbmRleCA5ODBkMWQyLi5hNDYzZWM1IDEwMDY0NAotLS0gYS9jbWRzL3N0YWdlZnJpZ2h0L2NvZGVjLmNwcAorKysgYi9jbWRzL3N0YWdlZnJpZ2h0L2NvZGVjLmNwcApAQCAtMTM4LDcgKzEzOCw3IEBACiAKICAgICBDSEVDSyghc3RhdGVCeVRyYWNrLmlzRW1wdHkoKSk7CiAKLSAgICBpbnQ2NF90IHN0YXJ0VGltZVVzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKKyAgICBpbnQ2NF90IHN0YXJ0VGltZVVzID0gYW5kcm9pZDo6QUxvb3Blcjo6R2V0Tm93VXMoKTsKICAgICBpbnQ2NF90IHN0YXJ0VGltZVJlbmRlciA9IC0xOwogCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzdGF0ZUJ5VHJhY2suc2l6ZSgpOyArK2kpIHsKQEAgLTMwNyw3ICszMDcsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgaW50NjRfdCBlbGFwc2VkVGltZVVzID0gQUxvb3Blcjo6R2V0Tm93VXMoKSAtIHN0YXJ0VGltZVVzOworICAgIGludDY0X3QgZWxhcHNlZFRpbWVVcyA9IGFuZHJvaWQ6OkFMb29wZXI6OkdldE5vd1VzKCkgLSBzdGFydFRpbWVVczsKIAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc3RhdGVCeVRyYWNrLnNpemUoKTsgKytpKSB7CiAgICAgICAgIENvZGVjU3RhdGUgKnN0YXRlID0gJnN0YXRlQnlUcmFjay5lZGl0VmFsdWVBdChpKTsKQEAgLTQwMCw3ICs0MDAsNyBAQAogCiAgICAgUHJvY2Vzc1N0YXRlOjpzZWxmKCktPnN0YXJ0VGhyZWFkUG9vbCgpOwogCi0gICAgc3A8QUxvb3Blcj4gbG9vcGVyID0gbmV3IEFMb29wZXI7CisgICAgc3A8YW5kcm9pZDo6QUxvb3Blcj4gbG9vcGVyID0gbmV3IGFuZHJvaWQ6OkFMb29wZXI7CiAgICAgbG9vcGVyLT5zdGFydCgpOwogCiAgICAgc3A8U3VyZmFjZUNvbXBvc2VyQ2xpZW50PiBjb21wb3NlckNsaWVudDsKZGlmZiAtLWdpdCBhL2NtZHMvc3RhZ2VmcmlnaHQvbWVkaWFmaWx0ZXIuY3BwIGIvY21kcy9zdGFnZWZyaWdodC9tZWRpYWZpbHRlci5jcHAKaW5kZXggNjMwZGUyNS4uZjBlZTBlMSAxMDA2NDQKLS0tIGEvY21kcy9zdGFnZWZyaWdodC9tZWRpYWZpbHRlci5jcHAKKysrIGIvY21kcy9zdGFnZWZyaWdodC9tZWRpYWZpbHRlci5jcHAKQEAgLTMxMCw3ICszMTAsNyBAQAogfQogCiBzdGF0aWMgaW50IGRlY29kZSgKLSAgICAgICAgY29uc3Qgc3A8QUxvb3Blcj4gJmxvb3BlciwKKyAgICAgICAgY29uc3Qgc3A8YW5kcm9pZDo6QUxvb3Blcj4gJmxvb3BlciwKICAgICAgICAgY29uc3QgY2hhciAqcGF0aCwKICAgICAgICAgY29uc3Qgc3A8U3VyZmFjZT4gJnN1cmZhY2UsCiAgICAgICAgIGJvb2wgcmVuZGVyU3VyZmFjZSwKQEAgLTQ2NSw3ICs0NjUsNyBAQAogICAgIGZpbHRlclN0YXRlLT5tU2lnbmFsbGVkSW5wdXRFT1MgPSBmYWxzZTsKICAgICBmaWx0ZXJTdGF0ZS0+bVNhd091dHB1dEVPUyA9IGZhbHNlOwogCi0gICAgaW50NjRfdCBzdGFydFRpbWVVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7CisgICAgaW50NjRfdCBzdGFydFRpbWVVcyA9IGFuZHJvaWQ6OkFMb29wZXI6OkdldE5vd1VzKCk7CiAgICAgaW50NjRfdCBzdGFydFRpbWVSZW5kZXIgPSAtMTsKIAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc3RhdGVCeVRyYWNrLnNpemUoKTsgKytpKSB7CkBAIC02NDMsNyArNjQzLDcgQEAKICAgICAgICAgICAgICAgICB1c2VUaW1lc3RhbXAsICZzdGFydFRpbWVSZW5kZXIpOwogICAgIH0KIAotICAgIGludDY0X3QgZWxhcHNlZFRpbWVVcyA9IEFMb29wZXI6OkdldE5vd1VzKCkgLSBzdGFydFRpbWVVczsKKyAgICBpbnQ2NF90IGVsYXBzZWRUaW1lVXMgPSBhbmRyb2lkOjpBTG9vcGVyOjpHZXROb3dVcygpIC0gc3RhcnRUaW1lVXM7CiAKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHN0YXRlQnlUcmFjay5zaXplKCk7ICsraSkgewogICAgICAgICBDb2RlY1N0YXRlICpzdGF0ZSA9ICZzdGF0ZUJ5VHJhY2suZWRpdFZhbHVlQXQoaSk7CkBAIC03MzcsNyArNzM3LDcgQEAKIAogICAgIFByb2Nlc3NTdGF0ZTo6c2VsZigpLT5zdGFydFRocmVhZFBvb2woKTsKIAotICAgIGFuZHJvaWQ6OnNwPEFMb29wZXI+IGxvb3BlciA9IG5ldyBBTG9vcGVyOworICAgIGFuZHJvaWQ6OnNwPGFuZHJvaWQ6OkFMb29wZXI+IGxvb3BlciA9IG5ldyBhbmRyb2lkOjpBTG9vcGVyOwogICAgIGxvb3Blci0+c3RhcnQoKTsKIAogICAgIGFuZHJvaWQ6OnNwPFN1cmZhY2VDb21wb3NlckNsaWVudD4gY29tcG9zZXJDbGllbnQ7CmRpZmYgLS1naXQgYS9jbWRzL3N0YWdlZnJpZ2h0L3JlY29yZC5jcHAgYi9jbWRzL3N0YWdlZnJpZ2h0L3JlY29yZC5jcHAKaW5kZXggNDRiMDAxNS4uOTVhMTZmMyAxMDA2NDQKLS0tIGEvY21kcy9zdGFnZWZyaWdodC9yZWNvcmQuY3BwCisrKyBiL2NtZHMvc3RhZ2VmcmlnaHQvcmVjb3JkLmNwcApAQCAtMTcsNyArMTcsNiBAQAogI2luY2x1ZGUgIlNpbmVTb3VyY2UuaCIKIAogI2luY2x1ZGUgPGJpbmRlci9Qcm9jZXNzU3RhdGUuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3Rvci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgpAQCAtMjgsNiArMjcsNyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3JGYWN0b3J5Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTVBFRzRXcml0ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9TaW1wbGVEZWNvZGluZ1NvdXJjZS5oPgpkaWZmIC0tZ2l0IGEvY21kcy9zdGFnZWZyaWdodC9zdGFnZWZyaWdodC5jcHAgYi9jbWRzL3N0YWdlZnJpZ2h0L3N0YWdlZnJpZ2h0LmNwcAppbmRleCA2MWZjODk3Li4yOGEyMThjIDEwMDY0NAotLS0gYS9jbWRzL3N0YWdlZnJpZ2h0L3N0YWdlZnJpZ2h0LmNwcAorKysgYi9jbWRzL3N0YWdlZnJpZ2h0L3N0YWdlZnJpZ2h0LmNwcApAQCAtMzIsNyArMzIsNiBAQAogI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KICNpbmNsdWRlIDxiaW5kZXIvUHJvY2Vzc1N0YXRlLmg+CiAjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9JQ3J5cHRvLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KQEAgLTUwLDYgKzQ5LDcgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3RvckZhY3RvcnkuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1NpbXBsZURlY29kaW5nU291cmNlLmg+CkBAIC03OCw2ICs3OCw3IEBACiBzdGF0aWMgYm9vbCBnUGxheWJhY2tBdWRpbzsKIHN0YXRpYyBib29sIGdXcml0ZU1QNDsKIHN0YXRpYyBib29sIGdEaXNwbGF5SGlzdG9ncmFtOworc3RhdGljIGJvb2wgZ1ZlcmJvc2UgPSBmYWxzZTsKIHN0YXRpYyBib29sIHNob3dQcm9ncmVzcyA9IHRydWU7CiBzdGF0aWMgU3RyaW5nOCBnV3JpdGVNUDRGaWxlbmFtZTsKIHN0YXRpYyBTdHJpbmc4IGdDb21wb25lbnROYW1lT3ZlcnJpZGU7CkBAIC0xNTksNiArMTYwLDExIEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCisgICAgICAgIGlmIChnVmVyYm9zZSkgeworICAgICAgICAgICAgTWV0YURhdGFCYXNlICZtZXRhID0gbWJ1Zi0+bWV0YV9kYXRhKCk7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZG91dCwgInNhbXBsZSBmb3JtYXQ6ICVzXG4iLCBtZXRhLnRvU3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgIH0KKwogICAgICAgICBDSEVDS19FUSgKICAgICAgICAgICAgICAgICBmd3JpdGUoKGNvbnN0IHVpbnQ4X3QgKiltYnVmLT5kYXRhKCkgKyBtYnVmLT5yYW5nZV9vZmZzZXQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgMSwKQEAgLTM0OCw3ICszNTQsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgZGVjb2RlVGltZXNVcy5wdXNoKGRlbGF5RGVjb2RlVXMpOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGlmIChzaG93UHJvZ3Jlc3MgJiYgKG4rKyAlIDE2KSA9PSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKGdWZXJib3NlKSB7CisgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSA9IGJ1ZmZlci0+bWV0YV9kYXRhKCk7CisgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3Rkb3V0LCAiJWxkIHNhbXBsZSBmb3JtYXQ6ICVzXG4iLCBudW1GcmFtZXMsIG1ldGEudG9TdHJpbmcoKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNob3dQcm9ncmVzcyAmJiAobisrICUgMTYpID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIuIik7CiAgICAgICAgICAgICAgICAgICAgIGZmbHVzaChzdGRvdXQpOwogICAgICAgICAgICAgICAgIH0KQEAgLTU3OSwxMiArNTg4LDEyIEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIENIRUNLKGJ1ZmZlciAhPSBOVUxMKTsKKwogICAgICAgICAgICAgaWYgKGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgPiAwKSB7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIENIRUNLKGJ1ZmZlciAhPSBOVUxMKTsKLQogICAgICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CiAgICAgICAgICAgICBidWZmZXIgPSBOVUxMOwogICAgICAgICB9CkBAIC02MzAsNiArNjM5LDcgQEAKICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAtVCBhbGxvY2F0ZSBidWZmZXJzIGZyb20gYSBzdXJmYWNlIHRleHR1cmVcbiIpOwogICAgIGZwcmludGYoc3RkZXJyLCAiICAgICAgIC1kKHVtcCkgb3V0cHV0X2ZpbGVuYW1lIChyYXcgc3RyZWFtIGRhdGEgdG8gYSBmaWxlKVxuIik7CiAgICAgZnByaW50ZihzdGRlcnIsICIgICAgICAgLUQodW1wKSBvdXRwdXRfZmlsZW5hbWUgKGRlY29kZWQgUENNIGRhdGEgdG8gYSBmaWxlKVxuIik7CisgICAgZnByaW50ZihzdGRlcnIsICIgICAgICAgLXYgYmUgbW9yZSB2ZXJib3NlXG4iKTsKIH0KIAogc3RhdGljIHZvaWQgZHVtcENvZGVjUHJvZmlsZXMoYm9vbCBxdWVyeURlY29kZXJzKSB7CkBAIC02NDAsNyArNjUwLDggQEAKICAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFRywgTUVESUFfTUlNRVRZUEVfQVVESU9fRzcxMV9NTEFXLAogICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19HNzExX0FMQVcsIE1FRElBX01JTUVUWVBFX0FVRElPX1ZPUkJJUywKICAgICAgICAgTUVESUFfTUlNRVRZUEVfVklERU9fVlA4LCBNRURJQV9NSU1FVFlQRV9WSURFT19WUDksCi0gICAgICAgIE1FRElBX01JTUVUWVBFX1ZJREVPX0RPTEJZX1ZJU0lPTgorICAgICAgICBNRURJQV9NSU1FVFlQRV9WSURFT19ET0xCWV9WSVNJT04sCisgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX0VBQzMsIE1FRElBX01JTUVUWVBFX0FVRElPX0FDNAogICAgIH07CiAKICAgICBjb25zdCBjaGFyICpjb2RlY1R5cGUgPSBxdWVyeURlY29kZXJzPyAiZGVjb2RlciIgOiAiZW5jb2RlciI7CkBAIC03MDUsMTAgKzcxNiwxMCBAQAogICAgIGdXcml0ZU1QNCA9IGZhbHNlOwogICAgIGdEaXNwbGF5SGlzdG9ncmFtID0gZmFsc2U7CiAKLSAgICBzcDxBTG9vcGVyPiBsb29wZXI7CisgICAgc3A8YW5kcm9pZDo6QUxvb3Blcj4gbG9vcGVyOwogCiAgICAgaW50IHJlczsKLSAgICB3aGlsZSAoKHJlcyA9IGdldG9wdChhcmdjLCBhcmd2LCAiaGFxbjpsbTpiOnB0c3JvdzprTjp4U1RkOkQ6IikpID49IDApIHsKKyAgICB3aGlsZSAoKHJlcyA9IGdldG9wdChhcmdjLCBhcmd2LCAidmhhcW46bG06YjpwdHNyb3c6a046eFNUZDpEOiIpKSA+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+JiAvKmRlY3J5cHRIYW5kbGUqLywKICAgICAgICAgICAgIHZvaWQqIC8qYnVmZmVyKi8sIHNzaXplX3QgLypudW1CeXRlcyovLCBvZmY2NF90IC8qb2Zmc2V0Ki8pIHsKICAgICBBTE9HVigiRHJtUGFzc3RocnVQbHVnSW46Om9uUHJlYWQoKSA6ICVkIiwgdW5pcXVlSWQpOwogICAgIHJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJtL2xpYm1lZGlhZHJtL0FuZHJvaWQuYnAgYi9kcm0vbGlibWVkaWFkcm0vQW5kcm9pZC5icAppbmRleCA0OTkxZTUwLi45NGY5ZTAyIDEwMDY0NAotLS0gYS9kcm0vbGlibWVkaWFkcm0vQW5kcm9pZC5icAorKysgYi9kcm0vbGlibWVkaWFkcm0vQW5kcm9pZC5icApAQCAtMzIsNiArMzIsNyBAQAogICAgICAgICAibGlidXRpbHMiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4wIiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMSIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjIiLAogICAgICAgICAibGliaGlkbGFsbG9jYXRvcnV0aWxzIiwKICAgICAgICAgImxpYmhpZGxiYXNlIiwKICAgICAgICAgImxpYmhpZGx0cmFuc3BvcnQiLApkaWZmIC0tZ2l0IGEvZHJtL2xpYm1lZGlhZHJtL0RybUhhbC5jcHAgYi9kcm0vbGlibWVkaWFkcm0vRHJtSGFsLmNwcAppbmRleCBjZjA4NjEwLi4xNGZmNDkzIDEwMDY0NAotLS0gYS9kcm0vbGlibWVkaWFkcm0vRHJtSGFsLmNwcAorKysgYi9kcm0vbGlibWVkaWFkcm0vRHJtSGFsLmNwcApAQCAtMjMsNyArMjMsNyBAQAogI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgogI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KIAotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMC90eXBlcy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMi90eXBlcy5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGlkbC9tYW5hZ2VyLzEuMC9JU2VydmljZU1hbmFnZXIuaD4KICNpbmNsdWRlIDxoaWRsL1NlcnZpY2VNYW5hZ2VtZW50Lmg+CiAKQEAgLTQzLDEyICs0MywxMyBAQAogdXNpbmcgZHJtOjpWMV8wOjpLZXlTdGF0dXNUeXBlOwogdXNpbmcgZHJtOjpWMV8wOjpLZXlUeXBlOwogdXNpbmcgZHJtOjpWMV8wOjpLZXlWYWx1ZTsKLXVzaW5nIGRybTo6VjFfMTo6SGRjcExldmVsOzsKIHVzaW5nIGRybTo6VjFfMDo6U2VjdXJlU3RvcDsKLXVzaW5nIGRybTo6VjFfMTo6U2VjdXJlU3RvcFJlbGVhc2U7CiB1c2luZyBkcm06OlYxXzA6OlNlY3VyZVN0b3BJZDsKLXVzaW5nIGRybTo6VjFfMTo6U2VjdXJpdHlMZXZlbDsKIHVzaW5nIGRybTo6VjFfMDo6U3RhdHVzOwordXNpbmcgZHJtOjpWMV8xOjpIZGNwTGV2ZWw7Cit1c2luZyBkcm06OlYxXzE6OlNlY3VyZVN0b3BSZWxlYXNlOwordXNpbmcgZHJtOjpWMV8xOjpTZWN1cml0eUxldmVsOwordXNpbmcgZHJtOjpWMV8yOjpLZXlTZXRJZDsKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMTo6RHJtTWV0cmljR3JvdXA7CiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2FycmF5OwogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7CkBAIC0xMzksNiArMTQwLDE4IEBACiAgICAgfQogfQogCitzdGF0aWMgRHJtUGx1Z2luOjpPZmZsaW5lTGljZW5zZVN0YXRlIHRvT2ZmbGluZUxpY2Vuc2VTdGF0ZSgKKyAgICAgICAgT2ZmbGluZUxpY2Vuc2VTdGF0ZSBsaWNlbnNlU3RhdGUpIHsKKyAgICBzd2l0Y2gobGljZW5zZVN0YXRlKSB7CisgICAgY2FzZSBPZmZsaW5lTGljZW5zZVN0YXRlOjpVU0FCTEU6CisgICAgICAgIHJldHVybiBEcm1QbHVnaW46OmtPZmZsaW5lTGljZW5zZVN0YXRlVXNhYmxlOworICAgIGNhc2UgT2ZmbGluZUxpY2Vuc2VTdGF0ZTo6SU5BQ1RJVkU6CisgICAgICAgIHJldHVybiBEcm1QbHVnaW46OmtPZmZsaW5lTGljZW5zZVN0YXRlSW5hY3RpdmU7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a09mZmxpbmVMaWNlbnNlU3RhdGVVbmtub3duOworICAgIH0KK30KKwogc3RhdGljIERybVBsdWdpbjo6SGRjcExldmVsIHRvSGRjcExldmVsKEhkY3BMZXZlbCBsZXZlbCkgewogICAgIHN3aXRjaChsZXZlbCkgewogICAgIGNhc2UgSGRjcExldmVsOjpIRENQX05PTkU6CkBAIC0xOTksNiArMjEyLDE1IEBACiAgICAgcmV0dXJuIHNlY3VyZVN0b3BJZHM7CiB9CiAKK3N0YXRpYyBMaXN0PFZlY3Rvcjx1aW50OF90Pj4gdG9LZXlTZXRJZHMoY29uc3QgaGlkbF92ZWM8S2V5U2V0SWQ+JgorICAgICAgICBoS2V5U2V0SWRzKSB7CisgICAgTGlzdDxWZWN0b3I8dWludDhfdD4+IGtleVNldElkczsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhLZXlTZXRJZHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAga2V5U2V0SWRzLnB1c2hfYmFjayh0b1ZlY3RvcihoS2V5U2V0SWRzW2ldKSk7CisgICAgfQorICAgIHJldHVybiBrZXlTZXRJZHM7Cit9CisKIHN0YXRpYyBzdGF0dXNfdCB0b1N0YXR1c1QoU3RhdHVzIHN0YXR1cykgewogICAgIHN3aXRjaCAoc3RhdHVzKSB7CiAgICAgY2FzZSBTdGF0dXM6Ok9LOgpAQCAtMzA1LDYgKzMyNyw3IEBACiAgICAgfQogICAgIG1QbHVnaW4uY2xlYXIoKTsKICAgICBtUGx1Z2luVjFfMS5jbGVhcigpOworICAgIG1QbHVnaW5WMV8yLmNsZWFyKCk7CiB9CiAKIFZlY3RvcjxzcDxJRHJtRmFjdG9yeT4+IERybUhhbDo6bWFrZURybUZhY3RvcmllcygpIHsKQEAgLTMxOCw3ICszNDEsNiBAQAogICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJmluc3RhbmNlIDogcmVnaXN0ZXJlZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgYXV0byBmYWN0b3J5ID0gZHJtOjpWMV8wOjpJRHJtRmFjdG9yeTo6Z2V0U2VydmljZShpbnN0YW5jZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmFjdG9yeSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0QoImZvdW5kIGRybUAxLjAgSURybUZhY3RvcnkgJXMiLCBpbnN0YW5jZS5jX3N0cigpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3JpZXMucHVzaF9iYWNrKGZhY3RvcnkpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CkBAIC0zMjksNyArMzUxLDE2IEBACiAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byAmaW5zdGFuY2UgOiByZWdpc3RlcmVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvIGZhY3RvcnkgPSBkcm06OlYxXzE6OklEcm1GYWN0b3J5OjpnZXRTZXJ2aWNlKGluc3RhbmNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmYWN0b3J5ICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRCgiZm91bmQgZHJtQDEuMSBJRHJtRmFjdG9yeSAlcyIsIGluc3RhbmNlLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY3Rvcmllcy5wdXNoX2JhY2soZmFjdG9yeSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICApOworICAgICAgICBtYW5hZ2VyLT5saXN0QnlJbnRlcmZhY2UoZHJtOjpWMV8yOjpJRHJtRmFjdG9yeTo6ZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICBbJmZhY3Rvcmllc10oY29uc3QgaGlkbF92ZWM8aGlkbF9zdHJpbmc+ICZyZWdpc3RlcmVkKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byAmaW5zdGFuY2UgOiByZWdpc3RlcmVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhdXRvIGZhY3RvcnkgPSBkcm06OlYxXzI6OklEcm1GYWN0b3J5OjpnZXRTZXJ2aWNlKGluc3RhbmNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmYWN0b3J5ICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3JpZXMucHVzaF9iYWNrKGZhY3RvcnkpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CkBAIC01MjcsNiArNTU4LDcgQEAKICAgICAgICAgICAgIG1QbHVnaW4gPSBtYWtlRHJtUGx1Z2luKG1GYWN0b3JpZXNbaV0sIHV1aWQsIGFwcFBhY2thZ2VOYW1lKTsKICAgICAgICAgICAgIGlmIChtUGx1Z2luICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICBtUGx1Z2luVjFfMSA9IGRybTo6VjFfMTo6SURybVBsdWdpbjo6Y2FzdEZyb20obVBsdWdpbik7CisgICAgICAgICAgICAgICAgbVBsdWdpblYxXzIgPSBkcm06OlYxXzI6OklEcm1QbHVnaW46OmNhc3RGcm9tKG1QbHVnaW4pOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtMTA2NSw2ICsxMDk3LDczIEBACiAgICAgcmV0dXJuIGhSZXN1bHQuaXNPaygpID8gZXJyIDogREVBRF9PQkpFQ1Q7CiB9CiAKK3N0YXR1c190IERybUhhbDo6Z2V0T2ZmbGluZUxpY2Vuc2VLZXlTZXRJZHMoTGlzdDxWZWN0b3I8dWludDhfdD4+ICZrZXlTZXRJZHMpIGNvbnN0IHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7CisgICAgfQorCisgICAgaWYgKG1QbHVnaW5WMV8yID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIH0KKworICAgIHN0YXR1c190IGVyciA9IFVOS05PV05fRVJST1I7CisKKyAgICBSZXR1cm48dm9pZD4gaFJlc3VsdCA9IG1QbHVnaW5WMV8yLT5nZXRPZmZsaW5lTGljZW5zZUtleVNldElkcygKKyAgICAgICAgICAgIFsmXShTdGF0dXMgc3RhdHVzLCBjb25zdCBoaWRsX3ZlYzxLZXlTZXRJZD4mIGhLZXlTZXRJZHMpIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAga2V5U2V0SWRzID0gdG9LZXlTZXRJZHMoaEtleVNldElkcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVyciA9IHRvU3RhdHVzVChzdGF0dXMpOworICAgICAgICAgICAgfQorICAgICk7CisKKyAgICByZXR1cm4gaFJlc3VsdC5pc09rKCkgPyBlcnIgOiBERUFEX09CSkVDVDsKK30KKworc3RhdHVzX3QgRHJtSGFsOjpyZW1vdmVPZmZsaW5lTGljZW5zZShWZWN0b3I8dWludDhfdD4gY29uc3QgJmtleVNldElkKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CisgICAgICAgIHJldHVybiBtSW5pdENoZWNrOworICAgIH0KKworICAgIGlmIChtUGx1Z2luVjFfMiA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICB9CisKKyAgICBSZXR1cm48U3RhdHVzPiBzdGF0dXMgPSBtUGx1Z2luVjFfMi0+cmVtb3ZlT2ZmbGluZUxpY2Vuc2UodG9IaWRsVmVjKGtleVNldElkKSk7CisgICAgcmV0dXJuIHN0YXR1cy5pc09rKCkgPyB0b1N0YXR1c1Qoc3RhdHVzKSA6IERFQURfT0JKRUNUOworfQorCitzdGF0dXNfdCBEcm1IYWw6OmdldE9mZmxpbmVMaWNlbnNlU3RhdGUoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZrZXlTZXRJZCwKKyAgICAgICAgRHJtUGx1Z2luOjpPZmZsaW5lTGljZW5zZVN0YXRlICpsaWNlbnNlU3RhdGUpIGNvbnN0IHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7CisgICAgfQorCisgICAgaWYgKG1QbHVnaW5WMV8yID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIH0KKyAgICAqbGljZW5zZVN0YXRlID0gRHJtUGx1Z2luOjprT2ZmbGluZUxpY2Vuc2VTdGF0ZVVua25vd247CisKKyAgICBzdGF0dXNfdCBlcnIgPSBVTktOT1dOX0VSUk9SOworCisgICAgUmV0dXJuPHZvaWQ+IGhSZXN1bHQgPSBtUGx1Z2luVjFfMi0+Z2V0T2ZmbGluZUxpY2Vuc2VTdGF0ZSh0b0hpZGxWZWMoa2V5U2V0SWQpLAorICAgICAgICAgICAgWyZdKFN0YXR1cyBzdGF0dXMsIE9mZmxpbmVMaWNlbnNlU3RhdGUgaExpY2Vuc2VTdGF0ZSkgeworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgICAgICAqbGljZW5zZVN0YXRlID0gdG9PZmZsaW5lTGljZW5zZVN0YXRlKGhMaWNlbnNlU3RhdGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKKyAgICAgICAgICAgIH0KKyAgICApOworCisgICAgcmV0dXJuIGhSZXN1bHQuaXNPaygpID8gZXJyIDogREVBRF9PQkpFQ1Q7Cit9CisKIHN0YXR1c190IERybUhhbDo6Z2V0UHJvcGVydHlTdHJpbmcoU3RyaW5nOCBjb25zdCAmbmFtZSwgU3RyaW5nOCAmdmFsdWUgKSBjb25zdCB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKICAgICByZXR1cm4gZ2V0UHJvcGVydHlTdHJpbmdJbnRlcm5hbChuYW1lLCB2YWx1ZSk7CmRpZmYgLS1naXQgYS9kcm0vbGlibWVkaWFkcm0vSURybS5jcHAgYi9kcm0vbGlibWVkaWFkcm0vSURybS5jcHAKaW5kZXggNTA5OTYxZi4uOGMyNjMxNyAxMDA2NDQKLS0tIGEvZHJtL2xpYm1lZGlhZHJtL0lEcm0uY3BwCisrKyBiL2RybS9saWJtZWRpYWRybS9JRHJtLmNwcApAQCAtNjEsNyArNjEsMTAgQEAKICAgICBHRVRfTlVNQkVSX09GX1NFU1NJT05TLAogICAgIEdFVF9TRUNVUklUWV9MRVZFTCwKICAgICBSRU1PVkVfU0VDVVJFX1NUT1AsCi0gICAgR0VUX1NFQ1VSRV9TVE9QX0lEUworICAgIEdFVF9TRUNVUkVfU1RPUF9JRFMsCisgICAgR0VUX09GRkxJTkVfTElDRU5TRV9LRVlTRVRfSURTLAorICAgIFJFTU9WRV9PRkZMSU5FX0xJQ0VOU0UsCisgICAgR0VUX09GRkxJTkVfTElDRU5TRV9TVEFURQogfTsKIAogc3RydWN0IEJwRHJtIDogcHVibGljIEJwSW50ZXJmYWNlPElEcm0+IHsKQEAgLTM3Niw2ICszNzksNTIgQEAKICAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwogICAgIH0KIAorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0T2ZmbGluZUxpY2Vuc2VLZXlTZXRJZHMoTGlzdDxWZWN0b3I8dWludDhfdD4gPiAma2V5U2V0SWRzKSBjb25zdCB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElEcm06OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9PRkZMSU5FX0xJQ0VOU0VfS0VZU0VUX0lEUywgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorCisgICAgICAgIGtleVNldElkcy5jbGVhcigpOworICAgICAgICB1aW50MzJfdCBjb3VudCA9IHJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBrZXlTZXRJZDsKKyAgICAgICAgICAgIHJlYWRWZWN0b3IocmVwbHksIGtleVNldElkKTsKKyAgICAgICAgICAgIGtleVNldElkcy5wdXNoX2JhY2soa2V5U2V0SWQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZU9mZmxpbmVMaWNlbnNlKFZlY3Rvcjx1aW50OF90PiBjb25zdCAma2V5U2V0SWQpIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSURybTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKworICAgICAgICB3cml0ZVZlY3RvcihkYXRhLCBrZXlTZXRJZCk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChSRU1PVkVfT0ZGTElORV9MSUNFTlNFLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE9mZmxpbmVMaWNlbnNlU3RhdGUoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZrZXlTZXRJZCwKKyAgICAgICAgICAgIERybVBsdWdpbjo6T2ZmbGluZUxpY2Vuc2VTdGF0ZSAqbGljZW5zZVN0YXRlKSBjb25zdCB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElEcm06OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisKKyAgICAgICAgd3JpdGVWZWN0b3IoZGF0YSwga2V5U2V0SWQpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX09GRkxJTkVfTElDRU5TRV9TVEFURSwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICAgICAgKmxpY2Vuc2VTdGF0ZSA9IERybVBsdWdpbjo6T2ZmbGluZUxpY2Vuc2VTdGF0ZTo6a09mZmxpbmVMaWNlbnNlU3RhdGVVbmtub3duOworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICAqbGljZW5zZVN0YXRlID0gc3RhdGljX2Nhc3Q8RHJtUGx1Z2luOjpPZmZsaW5lTGljZW5zZVN0YXRlPihyZXBseS5yZWFkSW50MzIoKSk7CisgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKKyAgICB9CisKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFByb3BlcnR5U3RyaW5nKFN0cmluZzggY29uc3QgJm5hbWUsIFN0cmluZzggJnZhbHVlKSBjb25zdCB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElEcm06OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CkBAIC05ODAsNiArMTAyOSw0NSBAQAogICAgICAgICAgICAgcmV0dXJuIE9LOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBHRVRfT0ZGTElORV9MSUNFTlNFX0tFWVNFVF9JRFM6CisgICAgICAgIHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJRHJtLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBMaXN0PFZlY3Rvcjx1aW50OF90PiA+IGtleVNldElkczsKKyAgICAgICAgICAgIHN0YXR1c190IHJlc3VsdCA9IGdldE9mZmxpbmVMaWNlbnNlS2V5U2V0SWRzKGtleVNldElkcyk7CisgICAgICAgICAgICBzaXplX3QgY291bnQgPSBrZXlTZXRJZHMuc2l6ZSgpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoY291bnQpOworICAgICAgICAgICAgTGlzdDxWZWN0b3I8dWludDhfdD4gPjo6aXRlcmF0b3IgaXRlciA9IGtleVNldElkcy5iZWdpbigpOworICAgICAgICAgICAgd2hpbGUoaXRlciAhPSBrZXlTZXRJZHMuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSA9IGl0ZXItPnNpemUoKTsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzaXplKTsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGUoaXRlci0+YXJyYXkoKSwgaXRlci0+c2l6ZSgpKTsKKyAgICAgICAgICAgICAgICBpdGVyKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihyZXN1bHQpOworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBSRU1PVkVfT0ZGTElORV9MSUNFTlNFOgorICAgICAgICB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSURybSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGtleVNldElkOworICAgICAgICAgICAgcmVhZFZlY3RvcihkYXRhLCBrZXlTZXRJZCk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihyZW1vdmVPZmZsaW5lTGljZW5zZShrZXlTZXRJZCkpOworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBHRVRfT0ZGTElORV9MSUNFTlNFX1NUQVRFOgorICAgICAgICB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSURybSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGtleVNldElkOworICAgICAgICAgICAgcmVhZFZlY3RvcihkYXRhLCBrZXlTZXRJZCk7CisgICAgICAgICAgICBEcm1QbHVnaW46Ok9mZmxpbmVMaWNlbnNlU3RhdGUgc3RhdGU7CisgICAgICAgICAgICBzdGF0dXNfdCByZXN1bHQgPSBnZXRPZmZsaW5lTGljZW5zZVN0YXRlKGtleVNldElkLCAmc3RhdGUpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3Q8RHJtUGx1Z2luOjpPZmZsaW5lTGljZW5zZVN0YXRlPihzdGF0ZSkpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIocmVzdWx0KTsKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfQorCiAgICAgICAgIGNhc2UgR0VUX1BST1BFUlRZX1NUUklORzoKICAgICAgICAgewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElEcm0sIGRhdGEsIHJlcGx5KTsKZGlmZiAtLWdpdCBhL2RybS9saWJtZWRpYWRybS90ZXN0cy9BbmRyb2lkLmJwIGIvZHJtL2xpYm1lZGlhZHJtL3Rlc3RzL0FuZHJvaWQuYnAKaW5kZXggNjZjOTA2Zi4uZGNkNTliNyAxMDA2NDQKLS0tIGEvZHJtL2xpYm1lZGlhZHJtL3Rlc3RzL0FuZHJvaWQuYnAKKysrIGIvZHJtL2xpYm1lZGlhZHJtL3Rlc3RzL0FuZHJvaWQuYnAKQEAgLTE3LDYgKzE3LDcgQEAKICAgICBzaGFyZWRfbGliczogWwogICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMCIsCiAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4xIiwKKyAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjIiLAogICAgICAgImxpYmJpbmRlciIsCiAgICAgICAibGliaGlkbGJhc2UiLAogICAgICAgImxpYmxvZyIsCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9jb21tb24vVXRpbHMuY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL1V0aWxzLmNwcAppbmRleCA5M2M2NDNiLi5kNDhiMGE4IDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9jb21tb24vVXRpbHMuY3BwCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9VdGlscy5jcHAKQEAgLTI3LDQgKzI3LDE4IEBACiAgICAgcmV0dXJuIG1lbWNtcCgodm9pZCAqKWxocy5hcnJheSgpLCAodm9pZCAqKXJocy5hcnJheSgpLCByaHMuc2l6ZSgpKSA8IDA7CiB9CiAKK3N0ZDo6c3RyaW5nIEJ5dGVBcnJheVRvSGV4U3RyaW5nKGNvbnN0IHVpbnQ4X3QqIGluX2J1ZmZlciwgc2l6ZV90IGxlbmd0aCkgeworICAgIHN0YXRpYyBjb25zdCBjaGFyIGtIZXhDaGFyc1tdID0gIjAxMjM0NTY3ODlBQkNERUYiOworCisgICAgLy8gRWFjaCBpbnB1dCBieXRlIGNyZWF0ZXMgdHdvIG91dHB1dCBoZXggY2hhcmFjdGVycy4KKyAgICBzdGQ6OnN0cmluZyBvdXRfYnVmZmVyKGxlbmd0aCAqIDIsICdcMCcpOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgeworICAgICAgICBjaGFyIGJ5dGUgPSBpbl9idWZmZXJbaV07CisgICAgICAgIG91dF9idWZmZXJbKGkgKiAyKV0gPSBrSGV4Q2hhcnNbKGJ5dGUgPj4gNCkgJiAweGZdOworICAgICAgICBvdXRfYnVmZmVyWyhpICogMikgKyAxXSA9IGtIZXhDaGFyc1tieXRlICYgMHhmXTsKKyAgICB9CisgICAgcmV0dXJuIG91dF9idWZmZXI7Cit9CisKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9pbmNsdWRlL1V0aWxzLmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9jb21tb24vaW5jbHVkZS9VdGlscy5oCmluZGV4IDI1NDMxMjQuLmFhNTcxYzAgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9pbmNsdWRlL1V0aWxzLmgKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL2luY2x1ZGUvVXRpbHMuaApAQCAtMTcsMTQgKzE3LDE2IEBACiAjaWZuZGVmIENMRUFSS0VZX1VUSUxTX0hfCiAjZGVmaW5lIENMRUFSS0VZX1VUSUxTX0hfCiAKKyNpbmNsdWRlIDxzdHJpbmc+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+CiAjaW5jbHVkZSA8RHJtRmFjdG9yeS5oPgpAQCAtMjYsMTQgKzI2LDE0IEBACiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpqb2luUnBjVGhyZWFkcG9vbDsKIHVzaW5nIDo6YW5kcm9pZDo6c3A7CiAKLXVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzE6OklDcnlwdG9GYWN0b3J5OwotdXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMTo6SURybUZhY3Rvcnk7Ci11c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8xOjpjbGVhcmtleTo6Q3J5cHRvRmFjdG9yeTsKLXVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzE6OmNsZWFya2V5OjpEcm1GYWN0b3J5OwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMjo6SUNyeXB0b0ZhY3Rvcnk7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8yOjpJRHJtRmFjdG9yeTsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzI6OmNsZWFya2V5OjpDcnlwdG9GYWN0b3J5OwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMjo6Y2xlYXJrZXk6OkRybUZhY3Rvcnk7CiAKIAogaW50IG1haW4oaW50IC8qIGFyZ2MgKi8sIGNoYXIqKiAvKiBhcmd2ICovKSB7Ci0gICAgQUxPR0QoImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMS1zZXJ2aWNlLmNsZWFya2V5IHN0YXJ0aW5nLi4uIik7CisgICAgQUxPR0QoImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMi1zZXJ2aWNlLmNsZWFya2V5IHN0YXJ0aW5nLi4uIik7CiAKICAgICAvLyBUaGUgRFJNIEhBTCBtYXkgY29tbXVuaWNhdGUgdG8gb3RoZXIgdmVuZG9yIGNvbXBvbmVudHMgdmlhCiAgICAgLy8gL2Rldi92bmRiaW5kZXIKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvRXZlbnRMb2cuaCBiL2luY2x1ZGUvbWVkaWEvRXZlbnRMb2cuaApuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi45YjJjNGJmCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9FdmVudExvZy5oCkBAIC0wLDAgKzEgQEAKKy4uLy4uL21lZGlhL3V0aWxzL2luY2x1ZGUvbWVkaWF1dGlscy9FdmVudExvZy5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9NZWRpYUV4dHJhY3Rvci5oIGIvaW5jbHVkZS9tZWRpYS9NZWRpYUV4dHJhY3Rvci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEyMDAwMAppbmRleCA0YjM1ZmUxLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWEvTWVkaWFFeHRyYWN0b3IuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLS4uLy4uL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvTWVkaWFFeHRyYWN0b3IuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5BcGkuaCBiL2luY2x1ZGUvbWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5BcGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODk2MmU1Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkFwaS5oCkBAIC0wLDAgKzEsMTY2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBNRURJQV9FWFRSQUNUT1JfUExVR0lOX0FQSV9IXworI2RlZmluZSBNRURJQV9FWFRSQUNUT1JfUExVR0lOX0FQSV9IXworCisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+IC8vIGZvciBzdGF0dXNfdAorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRXJyb3IuaD4KK3N0cnVjdCBBTWVkaWFGb3JtYXQ7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IE1lZGlhVHJhY2s7CitjbGFzcyBNZXRhRGF0YUJhc2U7CitjbGFzcyBNZWRpYUJ1ZmZlckJhc2U7CisKK2V4dGVybiAiQyIgeworCitzdHJ1Y3QgQ0RhdGFTb3VyY2UgeworICAgIHNzaXplX3QgKCpyZWFkQXQpKHZvaWQgKmhhbmRsZSwgb2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKKyAgICBzdGF0dXNfdCAoKmdldFNpemUpKHZvaWQgKmhhbmRsZSwgb2ZmNjRfdCAqc2l6ZSk7CisgICAgdWludDMyX3QgKCpmbGFncykodm9pZCAqaGFuZGxlICk7CisgICAgYm9vbCAoKmdldFVyaSkodm9pZCAqaGFuZGxlLCBjaGFyICp1cmlTdHJpbmcsIHNpemVfdCBidWZmZXJTaXplKTsKKyAgICB2b2lkICpoYW5kbGU7Cit9OworCitlbnVtIENNZWRpYVRyYWNrUmVhZE9wdGlvbnMgOiB1aW50MzJfdCB7CisgICAgU0VFS19QUkVWSU9VU19TWU5DID0gMCwKKyAgICBTRUVLX05FWFRfU1lOQyA9IDEsCisgICAgU0VFS19DTE9TRVNUX1NZTkMgPSAyLAorICAgIFNFRUtfQ0xPU0VTVCA9IDMsCisgICAgU0VFS19GUkFNRV9JTkRFWCA9IDQsCisgICAgU0VFSyA9IDgsCisgICAgTk9OQkxPQ0tJTkcgPSAxNgorfTsKKworc3RydWN0IENNZWRpYVRyYWNrIHsKKyAgICB2b2lkICpkYXRhOworICAgIHZvaWQgKCpmcmVlKSh2b2lkICpkYXRhKTsKKworICAgIHN0YXR1c190ICgqc3RhcnQpKHZvaWQgKmRhdGEpOworICAgIHN0YXR1c190ICgqc3RvcCkodm9pZCAqZGF0YSk7CisgICAgc3RhdHVzX3QgKCpnZXRGb3JtYXQpKHZvaWQgKmRhdGEsIE1ldGFEYXRhQmFzZSAmZm9ybWF0KTsKKyAgICBzdGF0dXNfdCAoKnJlYWQpKHZvaWQgKmRhdGEsIE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlciwgdWludDMyX3Qgb3B0aW9ucywgaW50NjRfdCBzZWVrUG9zVXMpOworICAgIGJvb2wgICAgICgqc3VwcG9ydHNOb25CbG9ja2luZ1JlYWQpKHZvaWQgKmRhdGEpOworfTsKKworc3RydWN0IENNZWRpYVRyYWNrVjIgeworICAgIHZvaWQgKmRhdGE7CisgICAgdm9pZCAoKmZyZWUpKHZvaWQgKmRhdGEpOworCisgICAgbWVkaWFfc3RhdHVzX3QgKCpzdGFydCkodm9pZCAqZGF0YSk7CisgICAgbWVkaWFfc3RhdHVzX3QgKCpzdG9wKSh2b2lkICpkYXRhKTsKKyAgICBtZWRpYV9zdGF0dXNfdCAoKmdldEZvcm1hdCkodm9pZCAqZGF0YSwgQU1lZGlhRm9ybWF0ICpmb3JtYXQpOworICAgIG1lZGlhX3N0YXR1c190ICgqcmVhZCkodm9pZCAqZGF0YSwgTWVkaWFCdWZmZXJCYXNlICoqYnVmZmVyLCB1aW50MzJfdCBvcHRpb25zLCBpbnQ2NF90IHNlZWtQb3NVcyk7CisgICAgYm9vbCAgICAgKCpzdXBwb3J0c05vbkJsb2NraW5nUmVhZCkodm9pZCAqZGF0YSk7Cit9OworCisKK3N0cnVjdCBDTWVkaWFFeHRyYWN0b3JWMSB7CisgICAgdm9pZCAqZGF0YTsKKworICAgIHZvaWQgKCpmcmVlKSh2b2lkICpkYXRhKTsKKyAgICBzaXplX3QgKCpjb3VudFRyYWNrcykodm9pZCAqZGF0YSk7CisgICAgQ01lZGlhVHJhY2sqICgqZ2V0VHJhY2spKHZvaWQgKmRhdGEsIHNpemVfdCBpbmRleCk7CisgICAgc3RhdHVzX3QgKCpnZXRUcmFja01ldGFEYXRhKSgKKyAgICAgICAgICAgIHZvaWQgKmRhdGEsCisgICAgICAgICAgICBNZXRhRGF0YUJhc2UmIG1ldGEsCisgICAgICAgICAgICBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKTsKKworICAgIHN0YXR1c190ICgqZ2V0TWV0YURhdGEpKHZvaWQgKmRhdGEsIE1ldGFEYXRhQmFzZSYgbWV0YSk7CisgICAgdWludDMyX3QgKCpmbGFncykodm9pZCAqZGF0YSk7CisgICAgc3RhdHVzX3QgKCpzZXRNZWRpYUNhcykodm9pZCAqZGF0YSwgY29uc3QgdWludDhfdCogY2FzVG9rZW4sIHNpemVfdCBzaXplKTsKKyAgICBjb25zdCBjaGFyICogKCpuYW1lKSh2b2lkICpkYXRhKTsKK307CisKK3N0cnVjdCBDTWVkaWFFeHRyYWN0b3JWMiB7CisgICAgdm9pZCAqZGF0YTsKKworICAgIHZvaWQgKCpmcmVlKSh2b2lkICpkYXRhKTsKKyAgICBzaXplX3QgKCpjb3VudFRyYWNrcykodm9pZCAqZGF0YSk7CisgICAgQ01lZGlhVHJhY2tWMiogKCpnZXRUcmFjaykodm9pZCAqZGF0YSwgc2l6ZV90IGluZGV4KTsKKyAgICBtZWRpYV9zdGF0dXNfdCAoKmdldFRyYWNrTWV0YURhdGEpKAorICAgICAgICAgICAgdm9pZCAqZGF0YSwKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YSwKKyAgICAgICAgICAgIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpOworCisgICAgbWVkaWFfc3RhdHVzX3QgKCpnZXRNZXRhRGF0YSkodm9pZCAqZGF0YSwgQU1lZGlhRm9ybWF0ICptZXRhKTsKKyAgICB1aW50MzJfdCAoKmZsYWdzKSh2b2lkICpkYXRhKTsKKyAgICBtZWRpYV9zdGF0dXNfdCAoKnNldE1lZGlhQ2FzKSh2b2lkICpkYXRhLCBjb25zdCB1aW50OF90KiBjYXNUb2tlbiwgc2l6ZV90IHNpemUpOworICAgIGNvbnN0IGNoYXIgKiAoKm5hbWUpKHZvaWQgKmRhdGEpOworfTsKKwordHlwZWRlZiBDTWVkaWFFeHRyYWN0b3JWMSogKCpDcmVhdG9yRnVuY1YxKShDRGF0YVNvdXJjZSAqc291cmNlLCB2b2lkICptZXRhKTsKK3R5cGVkZWYgdm9pZCAoKkZyZWVNZXRhRnVuYykodm9pZCAqbWV0YSk7CisKKy8vIFRoZSBzbmlmZmVyIGNhbiBvcHRpb25hbGx5IGZpbGwgaW4gYW4gb3BhcXVlIG9iamVjdCwgIm1ldGEiLCB0aGF0IGhlbHBzCisvLyB0aGUgY29ycmVzcG9uZGluZyBleHRyYWN0b3IgaW5pdGlhbGl6ZSBpdHMgc3RhdGUgd2l0aG91dCBkdXBsaWNhdGluZworLy8gZWZmb3J0IGFscmVhZHkgZXhlcnRlZCBieSB0aGUgc25pZmZlci4gSWYgImZyZWVNZXRhIiBpcyBnaXZlbiwgaXQgd2lsbCBiZQorLy8gY2FsbGVkIGFnYWluc3QgdGhlIG9wYXF1ZSBvYmplY3Qgd2hlbiBpdCBpcyBubyBsb25nZXIgdXNlZC4KK3R5cGVkZWYgQ3JlYXRvckZ1bmNWMSAoKlNuaWZmZXJGdW5jVjEpKAorICAgICAgICBDRGF0YVNvdXJjZSAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSwKKyAgICAgICAgdm9pZCAqKm1ldGEsIEZyZWVNZXRhRnVuYyAqZnJlZU1ldGEpOworCit0eXBlZGVmIENNZWRpYUV4dHJhY3RvclYyKiAoKkNyZWF0b3JGdW5jVjIpKENEYXRhU291cmNlICpzb3VyY2UsIHZvaWQgKm1ldGEpOworCit0eXBlZGVmIENyZWF0b3JGdW5jVjIgKCpTbmlmZmVyRnVuY1YyKSgKKyAgICAgICAgQ0RhdGFTb3VyY2UgKnNvdXJjZSwgZmxvYXQgKmNvbmZpZGVuY2UsCisgICAgICAgIHZvaWQgKiptZXRhLCBGcmVlTWV0YUZ1bmMgKmZyZWVNZXRhKTsKKwordHlwZWRlZiBDTWVkaWFFeHRyYWN0b3JWMSBDTWVkaWFFeHRyYWN0b3I7Cit0eXBlZGVmIENyZWF0b3JGdW5jVjEgQ3JlYXRvckZ1bmM7CisKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNvbnN0IHVpbnQ4X3QgYlsxNl07Cit9IG1lZGlhX3V1aWRfdDsKKworc3RydWN0IEV4dHJhY3RvckRlZiB7CisgICAgLy8gdmVyc2lvbiBudW1iZXIgb2YgdGhpcyBzdHJ1Y3R1cmUKKyAgICBjb25zdCB1aW50MzJfdCBkZWZfdmVyc2lvbjsKKworICAgIC8vIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgZXh0cmFjdG9yLgorICAgIC8vIFNlZSBiZWxvdyBmb3IgYSBjb252ZW5pZW5jZSBtYWNybyB0byBjcmVhdGUgdGhpcyBmcm9tIGEgc3RyaW5nLgorICAgIG1lZGlhX3V1aWRfdCBleHRyYWN0b3JfdXVpZDsKKworICAgIC8vIFZlcnNpb24gbnVtYmVyIG9mIHRoaXMgZXh0cmFjdG9yLiBXaGVuIHR3byBleHRyYWN0b3JzIHdpdGggdGhlIHNhbWUKKyAgICAvLyB1dWlkIGFyZSBlbmNvdW50ZXJlZCwgdGhlIG9uZSB3aXRoIHRoZSBsYXJnZXN0IHZlcnNpb24gbnVtYmVyIHdpbGwKKyAgICAvLyBiZSB1c2VkLgorICAgIGNvbnN0IHVpbnQzMl90IGV4dHJhY3Rvcl92ZXJzaW9uOworCisgICAgLy8gYSBodW1hbiByZWFkYWJsZSBuYW1lCisgICAgY29uc3QgY2hhciAqZXh0cmFjdG9yX25hbWU7CisKKyAgICB1bmlvbiB7CisgICAgICAgIFNuaWZmZXJGdW5jVjEgdjE7CisgICAgICAgIFNuaWZmZXJGdW5jVjIgdjI7CisgICAgfSBzbmlmZjsKK307CisKK2NvbnN0IHVpbnQzMl90IEVYVFJBQ1RPUkRFRl9WRVJTSU9OX0xFR0FDWSA9IDE7Citjb25zdCB1aW50MzJfdCBFWFRSQUNUT1JERUZfVkVSU0lPTl9DVVJSRU5UID0gMjsKKworY29uc3QgdWludDMyX3QgRVhUUkFDVE9SREVGX1ZFUlNJT04gPSBFWFRSQUNUT1JERUZfVkVSU0lPTl9MRUdBQ1k7CisKKy8vIGVhY2ggcGx1Z2luIGxpYnJhcnkgZXhwb3J0cyBvbmUgZnVuY3Rpb24gb2YgdGhpcyB0eXBlCit0eXBlZGVmIEV4dHJhY3RvckRlZiAoKkdldEV4dHJhY3RvckRlZikoKTsKKworfSAvLyBleHRlcm4gIkMiCisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gTUVESUFfRVhUUkFDVE9SX1BMVUdJTl9BUElfSF8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIuaCBiL2luY2x1ZGUvbWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NThjNTc1Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlci5oCkBAIC0wLDAgKzEsNTQwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBNRURJQV9FWFRSQUNUT1JfUExVR0lOX0hFTFBFUl9IXworCisjZGVmaW5lIE1FRElBX0VYVFJBQ1RPUl9QTFVHSU5fSEVMUEVSX0hfCisKKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkFwaS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIERhdGFTb3VyY2VCYXNlOworY2xhc3MgTWV0YURhdGFCYXNlOworc3RydWN0IE1lZGlhVHJhY2s7CisKKworY2xhc3MgTWVkaWFUcmFja0hlbHBlciB7CitwdWJsaWM6CisgICAgdmlydHVhbCB+TWVkaWFUcmFja0hlbHBlcigpIHt9OworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Rm9ybWF0KE1ldGFEYXRhQmFzZSYgZm9ybWF0KSA9IDA7CisKKyAgICBjbGFzcyBSZWFkT3B0aW9ucyB7CisgICAgcHVibGljOgorICAgICAgICBlbnVtIFNlZWtNb2RlIDogaW50MzJfdCB7CisgICAgICAgICAgICBTRUVLX1BSRVZJT1VTX1NZTkMsCisgICAgICAgICAgICBTRUVLX05FWFRfU1lOQywKKyAgICAgICAgICAgIFNFRUtfQ0xPU0VTVF9TWU5DLAorICAgICAgICAgICAgU0VFS19DTE9TRVNULAorICAgICAgICAgICAgU0VFS19GUkFNRV9JTkRFWCwKKyAgICAgICAgfTsKKworICAgICAgICBSZWFkT3B0aW9ucyh1aW50MzJfdCBvcHRpb25zLCBpbnQ2NF90IHNlZWtQb3NVcykgeworICAgICAgICAgICAgbU9wdGlvbnMgPSBvcHRpb25zOworICAgICAgICAgICAgbVNlZWtQb3NVcyA9IHNlZWtQb3NVczsKKyAgICAgICAgfQorICAgICAgICBib29sIGdldFNlZWtUbyhpbnQ2NF90ICp0aW1lX3VzLCBTZWVrTW9kZSAqbW9kZSkgY29uc3QgeworICAgICAgICAgICAgaWYgKChtT3B0aW9ucyAmIENNZWRpYVRyYWNrUmVhZE9wdGlvbnM6OlNFRUspID09IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqdGltZV91cyA9IG1TZWVrUG9zVXM7CisgICAgICAgICAgICAqbW9kZSA9IChTZWVrTW9kZSkgKG1PcHRpb25zICYgNyk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBib29sIGdldE5vbkJsb2NraW5nKCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIG1PcHRpb25zICYgQ01lZGlhVHJhY2tSZWFkT3B0aW9uczo6Tk9OQkxPQ0tJTkc7CisgICAgICAgIH0KKyAgICBwcml2YXRlOgorICAgICAgICB1aW50MzJfdCBtT3B0aW9uczsKKyAgICAgICAgaW50NjRfdCBtU2Vla1Bvc1VzOworICAgIH07CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoCisgICAgICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCkgPSAwOworICAgIHZpcnR1YWwgYm9vbCBzdXBwb3J0c05vbkJsb2NraW5nUmVhZCgpIHsgcmV0dXJuIGZhbHNlOyB9Cit9OworCitpbmxpbmUgQ01lZGlhVHJhY2sgKndyYXAoTWVkaWFUcmFja0hlbHBlciAqdHJhY2spIHsKKyAgICBDTWVkaWFUcmFjayAqd3JhcHBlciA9IChDTWVkaWFUcmFjayopIG1hbGxvYyhzaXplb2YoQ01lZGlhVHJhY2spKTsKKyAgICB3cmFwcGVyLT5kYXRhID0gdHJhY2s7CisgICAgd3JhcHBlci0+ZnJlZSA9IFtdKHZvaWQgKmRhdGEpIC0+IHZvaWQgeworICAgICAgICBkZWxldGUgKE1lZGlhVHJhY2tIZWxwZXIqKShkYXRhKTsKKyAgICB9OworICAgIHdyYXBwZXItPnN0YXJ0ID0gW10odm9pZCAqZGF0YSkgLT4gc3RhdHVzX3QgeworICAgICAgICByZXR1cm4gKChNZWRpYVRyYWNrSGVscGVyKilkYXRhKS0+c3RhcnQoKTsKKyAgICB9OworICAgIHdyYXBwZXItPnN0b3AgPSBbXSh2b2lkICpkYXRhKSAtPiBzdGF0dXNfdCB7CisgICAgICAgIHJldHVybiAoKE1lZGlhVHJhY2tIZWxwZXIqKWRhdGEpLT5zdG9wKCk7CisgICAgfTsKKyAgICB3cmFwcGVyLT5nZXRGb3JtYXQgPSBbXSh2b2lkICpkYXRhLCBNZXRhRGF0YUJhc2UgJm1ldGEpIC0+IHN0YXR1c190IHsKKyAgICAgICAgcmV0dXJuICgoTWVkaWFUcmFja0hlbHBlciopZGF0YSktPmdldEZvcm1hdChtZXRhKTsKKyAgICB9OworICAgIHdyYXBwZXItPnJlYWQgPSBbXSh2b2lkICpkYXRhLCBNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsICB1aW50MzJfdCBvcHRpb25zLCBpbnQ2NF90IHNlZWtQb3NVcykKKyAgICAgICAgICAgIC0+IHN0YXR1c190IHsKKyAgICAgICAgTWVkaWFUcmFja0hlbHBlcjo6UmVhZE9wdGlvbnMgb3B0cyhvcHRpb25zLCBzZWVrUG9zVXMpOworICAgICAgICByZXR1cm4gKChNZWRpYVRyYWNrSGVscGVyKilkYXRhKS0+cmVhZChidWZmZXIsICZvcHRzKTsKKyAgICB9OworICAgIHdyYXBwZXItPnN1cHBvcnRzTm9uQmxvY2tpbmdSZWFkID0gW10odm9pZCAqZGF0YSkgLT4gYm9vbCB7CisgICAgICAgICAgICAgICAgcmV0dXJuICgoTWVkaWFUcmFja0hlbHBlciopZGF0YSktPnN1cHBvcnRzTm9uQmxvY2tpbmdSZWFkKCk7CisgICAgfTsKKyAgICByZXR1cm4gd3JhcHBlcjsKK30KKworCitjbGFzcyBNZWRpYVRyYWNrSGVscGVyVjIgeworcHVibGljOgorICAgIHZpcnR1YWwgfk1lZGlhVHJhY2tIZWxwZXJWMigpIHt9OworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3Qgc3RhcnQoKSA9IDA7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBzdG9wKCkgPSAwOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0Rm9ybWF0KEFNZWRpYUZvcm1hdCAqZm9ybWF0KSA9IDA7CisKKyAgICBjbGFzcyBSZWFkT3B0aW9ucyB7CisgICAgcHVibGljOgorICAgICAgICBlbnVtIFNlZWtNb2RlIDogaW50MzJfdCB7CisgICAgICAgICAgICBTRUVLX1BSRVZJT1VTX1NZTkMsCisgICAgICAgICAgICBTRUVLX05FWFRfU1lOQywKKyAgICAgICAgICAgIFNFRUtfQ0xPU0VTVF9TWU5DLAorICAgICAgICAgICAgU0VFS19DTE9TRVNULAorICAgICAgICAgICAgU0VFS19GUkFNRV9JTkRFWCwKKyAgICAgICAgfTsKKworICAgICAgICBSZWFkT3B0aW9ucyh1aW50MzJfdCBvcHRpb25zLCBpbnQ2NF90IHNlZWtQb3NVcykgeworICAgICAgICAgICAgbU9wdGlvbnMgPSBvcHRpb25zOworICAgICAgICAgICAgbVNlZWtQb3NVcyA9IHNlZWtQb3NVczsKKyAgICAgICAgfQorICAgICAgICBib29sIGdldFNlZWtUbyhpbnQ2NF90ICp0aW1lX3VzLCBTZWVrTW9kZSAqbW9kZSkgY29uc3QgeworICAgICAgICAgICAgaWYgKChtT3B0aW9ucyAmIENNZWRpYVRyYWNrUmVhZE9wdGlvbnM6OlNFRUspID09IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqdGltZV91cyA9IG1TZWVrUG9zVXM7CisgICAgICAgICAgICAqbW9kZSA9IChTZWVrTW9kZSkgKG1PcHRpb25zICYgNyk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBib29sIGdldE5vbkJsb2NraW5nKCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIG1PcHRpb25zICYgQ01lZGlhVHJhY2tSZWFkT3B0aW9uczo6Tk9OQkxPQ0tJTkc7CisgICAgICAgIH0KKyAgICBwcml2YXRlOgorICAgICAgICB1aW50MzJfdCBtT3B0aW9uczsKKyAgICAgICAgaW50NjRfdCBtU2Vla1Bvc1VzOworICAgIH07CisKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHJlYWQoCisgICAgICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCkgPSAwOworICAgIHZpcnR1YWwgYm9vbCBzdXBwb3J0c05vbkJsb2NraW5nUmVhZCgpIHsgcmV0dXJuIGZhbHNlOyB9Cit9OworCitpbmxpbmUgQ01lZGlhVHJhY2tWMiAqd3JhcFYyKE1lZGlhVHJhY2tIZWxwZXJWMiAqdHJhY2spIHsKKyAgICBDTWVkaWFUcmFja1YyICp3cmFwcGVyID0gKENNZWRpYVRyYWNrVjIqKSBtYWxsb2Moc2l6ZW9mKENNZWRpYVRyYWNrVjIpKTsKKyAgICB3cmFwcGVyLT5kYXRhID0gdHJhY2s7CisgICAgd3JhcHBlci0+ZnJlZSA9IFtdKHZvaWQgKmRhdGEpIC0+IHZvaWQgeworICAgICAgICBkZWxldGUgKE1lZGlhVHJhY2tIZWxwZXJWMiopKGRhdGEpOworICAgIH07CisgICAgd3JhcHBlci0+c3RhcnQgPSBbXSh2b2lkICpkYXRhKSAtPiBtZWRpYV9zdGF0dXNfdCB7CisgICAgICAgIHJldHVybiAoKE1lZGlhVHJhY2tIZWxwZXJWMiopZGF0YSktPnN0YXJ0KCk7CisgICAgfTsKKyAgICB3cmFwcGVyLT5zdG9wID0gW10odm9pZCAqZGF0YSkgLT4gbWVkaWFfc3RhdHVzX3QgeworICAgICAgICByZXR1cm4gKChNZWRpYVRyYWNrSGVscGVyVjIqKWRhdGEpLT5zdG9wKCk7CisgICAgfTsKKyAgICB3cmFwcGVyLT5nZXRGb3JtYXQgPSBbXSh2b2lkICpkYXRhLCBBTWVkaWFGb3JtYXQgKm1ldGEpIC0+IG1lZGlhX3N0YXR1c190IHsKKyAgICAgICAgcmV0dXJuICgoTWVkaWFUcmFja0hlbHBlclYyKilkYXRhKS0+Z2V0Rm9ybWF0KG1ldGEpOworICAgIH07CisgICAgd3JhcHBlci0+cmVhZCA9IFtdKHZvaWQgKmRhdGEsIE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlciwgIHVpbnQzMl90IG9wdGlvbnMsIGludDY0X3Qgc2Vla1Bvc1VzKQorICAgICAgICAgICAgLT4gbWVkaWFfc3RhdHVzX3QgeworICAgICAgICBNZWRpYVRyYWNrSGVscGVyVjI6OlJlYWRPcHRpb25zIG9wdHMob3B0aW9ucywgc2Vla1Bvc1VzKTsKKyAgICAgICAgcmV0dXJuICgoTWVkaWFUcmFja0hlbHBlclYyKilkYXRhKS0+cmVhZChidWZmZXIsICZvcHRzKTsKKyAgICB9OworICAgIHdyYXBwZXItPnN1cHBvcnRzTm9uQmxvY2tpbmdSZWFkID0gW10odm9pZCAqZGF0YSkgLT4gYm9vbCB7CisgICAgICAgICAgICAgICAgcmV0dXJuICgoTWVkaWFUcmFja0hlbHBlclYyKilkYXRhKS0+c3VwcG9ydHNOb25CbG9ja2luZ1JlYWQoKTsKKyAgICB9OworICAgIHJldHVybiB3cmFwcGVyOworfQorCisKKworLy8gZXh0cmFjdG9yIHBsdWdpbnMgY2FuIGRlcml2ZSBmcm9tIHRoaXMgY2xhc3Mgd2hpY2ggbG9va3MgcmVtYXJrYWJseQorLy8gbGlrZSBNZWRpYUV4dHJhY3RvciBhbmQgY2FuIGJlIGVhc2lseSB3cmFwcGVkIGluIHRoZSByZXF1aXJlZCBDIEFQSQorY2xhc3MgTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIKK3sKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIH5NZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlcigpIHt9CisgICAgdmlydHVhbCBzaXplX3QgY291bnRUcmFja3MoKSA9IDA7CisgICAgdmlydHVhbCBNZWRpYVRyYWNrSGVscGVyICpnZXRUcmFjayhzaXplX3QgaW5kZXgpID0gMDsKKworICAgIGVudW0gR2V0VHJhY2tNZXRhRGF0YUZsYWdzIHsKKyAgICAgICAga0luY2x1ZGVFeHRlbnNpdmVNZXRhRGF0YSA9IDEKKyAgICB9OworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0VHJhY2tNZXRhRGF0YSgKKyAgICAgICAgICAgIE1ldGFEYXRhQmFzZSYgbWV0YSwKKyAgICAgICAgICAgIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MgPSAwKSA9IDA7CisKKyAgICAvLyBSZXR1cm4gY29udGFpbmVyIHNwZWNpZmljIG1ldGEtZGF0YS4gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24KKyAgICAvLyByZXR1cm5zIGFuIGVtcHR5IG1ldGFkYXRhIG9iamVjdC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1ldGFEYXRhKE1ldGFEYXRhQmFzZSYgbWV0YSkgPSAwOworCisgICAgZW51bSBGbGFncyB7CisgICAgICAgIENBTl9TRUVLX0JBQ0tXQVJEICA9IDEsICAvLyB0aGUgInNlZWsgMTBzZWNzIGJhY2sgYnV0dG9uIgorICAgICAgICBDQU5fU0VFS19GT1JXQVJEICAgPSAyLCAgLy8gdGhlICJzZWVrIDEwc2VjcyBmb3J3YXJkIGJ1dHRvbiIKKyAgICAgICAgQ0FOX1BBVVNFICAgICAgICAgID0gNCwKKyAgICAgICAgQ0FOX1NFRUsgICAgICAgICAgID0gOCwgIC8vIHRoZSAic2VlayBiYXIiCisgICAgfTsKKworICAgIC8vIElmIHN1YmNsYXNzZXMgZG8gX25vdF8gb3ZlcnJpZGUgdGhpcywgdGhlIGRlZmF1bHQgaXMKKyAgICAvLyBDQU5fU0VFS19CQUNLV0FSRCB8IENBTl9TRUVLX0ZPUldBUkQgfCBDQU5fU0VFSyB8IENBTl9QQVVTRQorICAgIHZpcnR1YWwgdWludDMyX3QgZmxhZ3MoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBDQU5fU0VFS19CQUNLV0FSRCB8IENBTl9TRUVLX0ZPUldBUkQgfCBDQU5fU0VFSyB8IENBTl9QQVVTRTsKKyAgICB9OworCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNZWRpYUNhcyhjb25zdCB1aW50OF90KiAvKmNhc1Rva2VuKi8sIHNpemVfdCAvKnNpemUqLykgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgdmlydHVhbCBjb25zdCBjaGFyICogbmFtZSgpIHsgcmV0dXJuICI8dW5zcGVjaWZpZWQ+IjsgfQorCitwcm90ZWN0ZWQ6CisgICAgTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIoKSB7fQorCitwcml2YXRlOgorICAgIE1lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyKGNvbnN0IE1lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyICYpOworICAgIE1lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyICZvcGVyYXRvcj0oY29uc3QgTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIgJik7Cit9OworCitpbmxpbmUgQ01lZGlhRXh0cmFjdG9yICp3cmFwKE1lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyICpleHRyYWN0b3IpIHsKKyAgICBDTWVkaWFFeHRyYWN0b3IgKndyYXBwZXIgPSAoQ01lZGlhRXh0cmFjdG9yKikgbWFsbG9jKHNpemVvZihDTWVkaWFFeHRyYWN0b3IpKTsKKyAgICB3cmFwcGVyLT5kYXRhID0gZXh0cmFjdG9yOworICAgIHdyYXBwZXItPmZyZWUgPSBbXSh2b2lkICpkYXRhKSAtPiB2b2lkIHsKKyAgICAgICAgZGVsZXRlIChNZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlciopKGRhdGEpOworICAgIH07CisgICAgd3JhcHBlci0+Y291bnRUcmFja3MgPSBbXSh2b2lkICpkYXRhKSAtPiBzaXplX3QgeworICAgICAgICByZXR1cm4gKChNZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlciopZGF0YSktPmNvdW50VHJhY2tzKCk7CisgICAgfTsKKyAgICB3cmFwcGVyLT5nZXRUcmFjayA9IFtdKHZvaWQgKmRhdGEsIHNpemVfdCBpbmRleCkgLT4gQ01lZGlhVHJhY2sqIHsKKyAgICAgICAgcmV0dXJuIHdyYXAoKChNZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlciopZGF0YSktPmdldFRyYWNrKGluZGV4KSk7CisgICAgfTsKKyAgICB3cmFwcGVyLT5nZXRUcmFja01ldGFEYXRhID0gW10oCisgICAgICAgICAgICB2b2lkICpkYXRhLAorICAgICAgICAgICAgTWV0YURhdGFCYXNlJiBtZXRhLAorICAgICAgICAgICAgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncykgLT4gc3RhdHVzX3QgeworICAgICAgICByZXR1cm4gKChNZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlciopZGF0YSktPmdldFRyYWNrTWV0YURhdGEobWV0YSwgaW5kZXgsIGZsYWdzKTsKKyAgICB9OworICAgIHdyYXBwZXItPmdldE1ldGFEYXRhID0gW10oCisgICAgICAgICAgICB2b2lkICpkYXRhLAorICAgICAgICAgICAgTWV0YURhdGFCYXNlJiBtZXRhKSAtPiBzdGF0dXNfdCB7CisgICAgICAgIHJldHVybiAoKE1lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyKilkYXRhKS0+Z2V0TWV0YURhdGEobWV0YSk7CisgICAgfTsKKyAgICB3cmFwcGVyLT5mbGFncyA9IFtdKAorICAgICAgICAgICAgdm9pZCAqZGF0YSkgLT4gdWludDMyX3QgeworICAgICAgICByZXR1cm4gKChNZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlciopZGF0YSktPmZsYWdzKCk7CisgICAgfTsKKyAgICB3cmFwcGVyLT5zZXRNZWRpYUNhcyA9IFtdKAorICAgICAgICAgICAgdm9pZCAqZGF0YSwgY29uc3QgdWludDhfdCAqY2FzVG9rZW4sIHNpemVfdCBzaXplKSAtPiBzdGF0dXNfdCB7CisgICAgICAgIHJldHVybiAoKE1lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyKilkYXRhKS0+c2V0TWVkaWFDYXMoY2FzVG9rZW4sIHNpemUpOworICAgIH07CisgICAgd3JhcHBlci0+bmFtZSA9IFtdKAorICAgICAgICAgICAgdm9pZCAqZGF0YSkgLT4gY29uc3QgY2hhciAqIHsKKyAgICAgICAgcmV0dXJuICgoTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIqKWRhdGEpLT5uYW1lKCk7CisgICAgfTsKKyAgICByZXR1cm4gd3JhcHBlcjsKK30KKworY2xhc3MgTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXJWMgoreworcHVibGljOgorICAgIHZpcnR1YWwgfk1lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyVjIoKSB7fQorICAgIHZpcnR1YWwgc2l6ZV90IGNvdW50VHJhY2tzKCkgPSAwOworICAgIHZpcnR1YWwgTWVkaWFUcmFja0hlbHBlclYyICpnZXRUcmFjayhzaXplX3QgaW5kZXgpID0gMDsKKworICAgIGVudW0gR2V0VHJhY2tNZXRhRGF0YUZsYWdzIHsKKyAgICAgICAga0luY2x1ZGVFeHRlbnNpdmVNZXRhRGF0YSA9IDEKKyAgICB9OworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0VHJhY2tNZXRhRGF0YSgKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YSwKKyAgICAgICAgICAgIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MgPSAwKSA9IDA7CisKKyAgICAvLyBSZXR1cm4gY29udGFpbmVyIHNwZWNpZmljIG1ldGEtZGF0YS4gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24KKyAgICAvLyByZXR1cm5zIGFuIGVtcHR5IG1ldGFkYXRhIG9iamVjdC4KKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IGdldE1ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSkgPSAwOworCisgICAgZW51bSBGbGFncyB7CisgICAgICAgIENBTl9TRUVLX0JBQ0tXQVJEICA9IDEsICAvLyB0aGUgInNlZWsgMTBzZWNzIGJhY2sgYnV0dG9uIgorICAgICAgICBDQU5fU0VFS19GT1JXQVJEICAgPSAyLCAgLy8gdGhlICJzZWVrIDEwc2VjcyBmb3J3YXJkIGJ1dHRvbiIKKyAgICAgICAgQ0FOX1BBVVNFICAgICAgICAgID0gNCwKKyAgICAgICAgQ0FOX1NFRUsgICAgICAgICAgID0gOCwgIC8vIHRoZSAic2VlayBiYXIiCisgICAgfTsKKworICAgIC8vIElmIHN1YmNsYXNzZXMgZG8gX25vdF8gb3ZlcnJpZGUgdGhpcywgdGhlIGRlZmF1bHQgaXMKKyAgICAvLyBDQU5fU0VFS19CQUNLV0FSRCB8IENBTl9TRUVLX0ZPUldBUkQgfCBDQU5fU0VFSyB8IENBTl9QQVVTRQorICAgIHZpcnR1YWwgdWludDMyX3QgZmxhZ3MoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBDQU5fU0VFS19CQUNLV0FSRCB8IENBTl9TRUVLX0ZPUldBUkQgfCBDQU5fU0VFSyB8IENBTl9QQVVTRTsKKyAgICB9OworCisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBzZXRNZWRpYUNhcyhjb25zdCB1aW50OF90KiAvKmNhc1Rva2VuKi8sIHNpemVfdCAvKnNpemUqLykgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIHZpcnR1YWwgY29uc3QgY2hhciAqIG5hbWUoKSB7IHJldHVybiAiPHVuc3BlY2lmaWVkPiI7IH0KKworcHJvdGVjdGVkOgorICAgIE1lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyVjIoKSB7fQorCitwcml2YXRlOgorICAgIE1lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyVjIoY29uc3QgTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXJWMiAmKTsKKyAgICBNZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlclYyICZvcGVyYXRvcj0oY29uc3QgTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXJWMiAmKTsKK307CisKK2lubGluZSBDTWVkaWFFeHRyYWN0b3JWMiAqd3JhcFYyKE1lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyVjIgKmV4dHJhY3RvcikgeworICAgIENNZWRpYUV4dHJhY3RvclYyICp3cmFwcGVyID0gKENNZWRpYUV4dHJhY3RvclYyKikgbWFsbG9jKHNpemVvZihDTWVkaWFFeHRyYWN0b3JWMikpOworICAgIHdyYXBwZXItPmRhdGEgPSBleHRyYWN0b3I7CisgICAgd3JhcHBlci0+ZnJlZSA9IFtdKHZvaWQgKmRhdGEpIC0+IHZvaWQgeworICAgICAgICBkZWxldGUgKE1lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyVjIqKShkYXRhKTsKKyAgICB9OworICAgIHdyYXBwZXItPmNvdW50VHJhY2tzID0gW10odm9pZCAqZGF0YSkgLT4gc2l6ZV90IHsKKyAgICAgICAgcmV0dXJuICgoTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXJWMiopZGF0YSktPmNvdW50VHJhY2tzKCk7CisgICAgfTsKKyAgICB3cmFwcGVyLT5nZXRUcmFjayA9IFtdKHZvaWQgKmRhdGEsIHNpemVfdCBpbmRleCkgLT4gQ01lZGlhVHJhY2tWMiogeworICAgICAgICByZXR1cm4gd3JhcFYyKCgoTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXJWMiopZGF0YSktPmdldFRyYWNrKGluZGV4KSk7CisgICAgfTsKKyAgICB3cmFwcGVyLT5nZXRUcmFja01ldGFEYXRhID0gW10oCisgICAgICAgICAgICB2b2lkICpkYXRhLAorICAgICAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhLAorICAgICAgICAgICAgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncykgLT4gbWVkaWFfc3RhdHVzX3QgeworICAgICAgICByZXR1cm4gKChNZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlclYyKilkYXRhKS0+Z2V0VHJhY2tNZXRhRGF0YShtZXRhLCBpbmRleCwgZmxhZ3MpOworICAgIH07CisgICAgd3JhcHBlci0+Z2V0TWV0YURhdGEgPSBbXSgKKyAgICAgICAgICAgIHZvaWQgKmRhdGEsCisgICAgICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGEpIC0+IG1lZGlhX3N0YXR1c190IHsKKyAgICAgICAgcmV0dXJuICgoTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXJWMiopZGF0YSktPmdldE1ldGFEYXRhKG1ldGEpOworICAgIH07CisgICAgd3JhcHBlci0+ZmxhZ3MgPSBbXSgKKyAgICAgICAgICAgIHZvaWQgKmRhdGEpIC0+IHVpbnQzMl90IHsKKyAgICAgICAgcmV0dXJuICgoTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXJWMiopZGF0YSktPmZsYWdzKCk7CisgICAgfTsKKyAgICB3cmFwcGVyLT5zZXRNZWRpYUNhcyA9IFtdKAorICAgICAgICAgICAgdm9pZCAqZGF0YSwgY29uc3QgdWludDhfdCAqY2FzVG9rZW4sIHNpemVfdCBzaXplKSAtPiBtZWRpYV9zdGF0dXNfdCB7CisgICAgICAgIHJldHVybiAoKE1lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyVjIqKWRhdGEpLT5zZXRNZWRpYUNhcyhjYXNUb2tlbiwgc2l6ZSk7CisgICAgfTsKKyAgICB3cmFwcGVyLT5uYW1lID0gW10oCisgICAgICAgICAgICB2b2lkICpkYXRhKSAtPiBjb25zdCBjaGFyICogeworICAgICAgICByZXR1cm4gKChNZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlclYyKilkYXRhKS0+bmFtZSgpOworICAgIH07CisgICAgcmV0dXJuIHdyYXBwZXI7Cit9CisKKy8qIGFkZHMgc29tZSBjb252aWVuY2UgbWV0aG9kcyAqLworY2xhc3MgRGF0YVNvdXJjZUhlbHBlciB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgRGF0YVNvdXJjZUhlbHBlcihDRGF0YVNvdXJjZSAqY3NvdXJjZSkgeworICAgICAgICBtU291cmNlID0gY3NvdXJjZTsKKyAgICB9CisKKyAgICBleHBsaWNpdCBEYXRhU291cmNlSGVscGVyKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSkgeworICAgICAgICBtU291cmNlID0gc291cmNlLT5tU291cmNlOworICAgIH0KKworICAgIHZpcnR1YWwgfkRhdGFTb3VyY2VIZWxwZXIoKSB7fQorCisgICAgdmlydHVhbCBzc2l6ZV90IHJlYWRBdChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICAgICAgcmV0dXJuIG1Tb3VyY2UtPnJlYWRBdChtU291cmNlLT5oYW5kbGUsIG9mZnNldCwgZGF0YSwgc2l6ZSk7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTaXplKG9mZjY0X3QgKnNpemUpIHsKKyAgICAgICAgcmV0dXJuIG1Tb3VyY2UtPmdldFNpemUobVNvdXJjZS0+aGFuZGxlLCBzaXplKTsKKyAgICB9CisKKyAgICBib29sIGdldFVyaShjaGFyICp1cmlTdHJpbmcsIHNpemVfdCBidWZmZXJTaXplKSB7CisgICAgICAgIHJldHVybiBtU291cmNlLT5nZXRVcmkobVNvdXJjZS0+aGFuZGxlLCB1cmlTdHJpbmcsIGJ1ZmZlclNpemUpOworICAgIH0KKworICAgIHZpcnR1YWwgdWludDMyX3QgZmxhZ3MoKSB7CisgICAgICAgIHJldHVybiBtU291cmNlLT5mbGFncyhtU291cmNlLT5oYW5kbGUpOworICAgIH0KKworICAgIC8vIENvbnZlbmllbmNlIG1ldGhvZHM6CisgICAgYm9vbCBnZXRVSW50MTYob2ZmNjRfdCBvZmZzZXQsIHVpbnQxNl90ICp4KSB7CisgICAgICAgICp4ID0gMDsKKworICAgICAgICB1aW50OF90IGJ5dGVbMl07CisgICAgICAgIGlmIChyZWFkQXQob2Zmc2V0LCBieXRlLCAyKSAhPSAyKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAqeCA9IChieXRlWzBdIDw8IDgpIHwgYnl0ZVsxXTsKKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyAzIGJ5dGUgaW50LCByZXR1cm5lZCBhcyBhIDMyLWJpdCBpbnQKKyAgICBib29sIGdldFVJbnQyNChvZmY2NF90IG9mZnNldCwgdWludDMyX3QgKngpIHsKKyAgICAgICAgKnggPSAwOworCisgICAgICAgIHVpbnQ4X3QgYnl0ZVszXTsKKyAgICAgICAgaWYgKHJlYWRBdChvZmZzZXQsIGJ5dGUsIDMpICE9IDMpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgICp4ID0gKGJ5dGVbMF0gPDwgMTYpIHwgKGJ5dGVbMV0gPDwgOCkgfCBieXRlWzJdOworCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGJvb2wgZ2V0VUludDMyKG9mZjY0X3Qgb2Zmc2V0LCB1aW50MzJfdCAqeCkgeworICAgICAgICAqeCA9IDA7CisKKyAgICAgICAgdWludDMyX3QgdG1wOworICAgICAgICBpZiAocmVhZEF0KG9mZnNldCwgJnRtcCwgNCkgIT0gNCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgKnggPSBudG9obCh0bXApOworCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGJvb2wgZ2V0VUludDY0KG9mZjY0X3Qgb2Zmc2V0LCB1aW50NjRfdCAqeCkgeworICAgICAgICAqeCA9IDA7CisKKyAgICAgICAgdWludDY0X3QgdG1wOworICAgICAgICBpZiAocmVhZEF0KG9mZnNldCwgJnRtcCwgOCkgIT0gOCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgKnggPSAoKHVpbnQ2NF90KW50b2hsKHRtcCAmIDB4ZmZmZmZmZmYpIDw8IDMyKSB8IG50b2hsKHRtcCA+PiAzMik7CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8gcmVhZCBlaXRoZXIgaW50PE4+IG9yIGludDwyTj4gaW50byBhIHVpbnQ8Mk4+X3QsIHNpemUgaXMgdGhlIGludCBzaXplIGluIGJ5dGVzLgorICAgIGJvb2wgZ2V0VUludDE2VmFyKG9mZjY0X3Qgb2Zmc2V0LCB1aW50MTZfdCAqeCwgc2l6ZV90IHNpemUpIHsKKyAgICAgICAgaWYgKHNpemUgPT0gMikgeworICAgICAgICAgICAgcmV0dXJuIGdldFVJbnQxNihvZmZzZXQsIHgpOworICAgICAgICB9CisgICAgICAgIGlmIChzaXplID09IDEpIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgdG1wOworICAgICAgICAgICAgaWYgKHJlYWRBdChvZmZzZXQsICZ0bXAsIDEpID09IDEpIHsKKyAgICAgICAgICAgICAgICAqeCA9IHRtcDsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgYm9vbCBnZXRVSW50MzJWYXIob2ZmNjRfdCBvZmZzZXQsIHVpbnQzMl90ICp4LCBzaXplX3Qgc2l6ZSkgeworICAgICAgICBpZiAoc2l6ZSA9PSA0KSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0VUludDMyKG9mZnNldCwgeCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNpemUgPT0gMikgeworICAgICAgICAgICAgdWludDE2X3QgdG1wOworICAgICAgICAgICAgaWYgKGdldFVJbnQxNihvZmZzZXQsICZ0bXApKSB7CisgICAgICAgICAgICAgICAgKnggPSB0bXA7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGJvb2wgZ2V0VUludDY0VmFyKG9mZjY0X3Qgb2Zmc2V0LCB1aW50NjRfdCAqeCwgc2l6ZV90IHNpemUpIHsKKyAgICAgICAgaWYgKHNpemUgPT0gOCkgeworICAgICAgICAgICAgcmV0dXJuIGdldFVJbnQ2NChvZmZzZXQsIHgpOworICAgICAgICB9CisgICAgICAgIGlmIChzaXplID09IDQpIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHRtcDsKKyAgICAgICAgICAgIGlmIChnZXRVSW50MzIob2Zmc2V0LCAmdG1wKSkgeworICAgICAgICAgICAgICAgICp4ID0gdG1wOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICBDRGF0YVNvdXJjZSAqbVNvdXJjZTsKK307CisKKworCisvLyBoZWxwZXJzIHRvIGNyZWF0ZSBhIG1lZGlhX3V1aWRfdCBmcm9tIGEgc3RyaW5nIGxpdGVyYWwKKworLy8gcHVycG9zZWx5IG5vdCBkZWZpbmVkIGFueXdoZXJlIHNvIHRoYXQgdGhpcyB3aWxsIGZhaWwgdG8gbGluayBpZgorLy8gZXhwcmVzc2lvbnMgYmVsb3cgYXJlIG5vdCBldmFsdWF0ZWQgYXQgY29tcGlsZSB0aW1lCitpbnQgaW52YWxpZF91dWlkX3N0cmluZyhjb25zdCBjaGFyICopOworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgc2l6ZV90IE4+Citjb25zdGV4cHIgdWludDhfdCBfZGlnaXRBdF8oY29uc3QgVCAoJnMpW05dLCBjb25zdCBzaXplX3QgbikgeworICAgIHJldHVybiBzW25dID49ICcwJyAmJiBzW25dIDw9ICc5JyA/IHNbbl0gLSAnMCcKKyAgICAgICAgICAgIDogc1tuXSA+PSAnYScgJiYgc1tuXSA8PSAnZicgPyBzW25dIC0gJ2EnICsgMTAKKyAgICAgICAgICAgICAgICAgICAgOiBzW25dID49ICdBJyAmJiBzW25dIDw9ICdGJyA/IHNbbl0gLSAnQScgKyAxMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogaW52YWxpZF91dWlkX3N0cmluZygidXVpZDogYmFkIGRpZ2l0cyIpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgc2l6ZV90IE4+Citjb25zdGV4cHIgdWludDhfdCBfaGV4Qnl0ZUF0Xyhjb25zdCBUICgmcylbTl0sIHNpemVfdCBuKSB7CisgICAgcmV0dXJuIChfZGlnaXRBdF8ocywgbikgPDwgNCkgKyBfZGlnaXRBdF8ocywgbiArIDEpOworfQorCitjb25zdGV4cHIgYm9vbCBfYXNzZXJ0SXNEYXNoXyhjaGFyIGMpIHsKKyAgICByZXR1cm4gYyA9PSAnLScgPyB0cnVlIDogaW52YWxpZF91dWlkX3N0cmluZygiV3JvbmcgZm9ybWF0Iik7Cit9CisKK3RlbXBsYXRlIDxzaXplX3QgTj4KK2NvbnN0ZXhwciBtZWRpYV91dWlkX3QgY29uc3RVVUlEKGNvbnN0IGNoYXIgKCZzKSBbTl0pIHsKKyAgICBzdGF0aWNfYXNzZXJ0KE4gPT0gMzcsICJ1dWlkOiB3cm9uZyBsZW5ndGgiKTsKKyAgICByZXR1cm4KKyAgICAgICAgICAgIF9hc3NlcnRJc0Rhc2hfKHNbOF0pLAorICAgICAgICAgICAgX2Fzc2VydElzRGFzaF8oc1sxM10pLAorICAgICAgICAgICAgX2Fzc2VydElzRGFzaF8oc1sxOF0pLAorICAgICAgICAgICAgX2Fzc2VydElzRGFzaF8oc1syM10pLAorICAgICAgICAgICAgbWVkaWFfdXVpZF90IHt7CisgICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgMCksCisgICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgMiksCisgICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgNCksCisgICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgNiksCisgICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgOSksCisgICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgMTEpLAorICAgICAgICAgICAgICAgIF9oZXhCeXRlQXRfKHMsIDE0KSwKKyAgICAgICAgICAgICAgICBfaGV4Qnl0ZUF0XyhzLCAxNiksCisgICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgMTkpLAorICAgICAgICAgICAgICAgIF9oZXhCeXRlQXRfKHMsIDIxKSwKKyAgICAgICAgICAgICAgICBfaGV4Qnl0ZUF0XyhzLCAyNCksCisgICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgMjYpLAorICAgICAgICAgICAgICAgIF9oZXhCeXRlQXRfKHMsIDI4KSwKKyAgICAgICAgICAgICAgICBfaGV4Qnl0ZUF0XyhzLCAzMCksCisgICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgMzIpLAorICAgICAgICAgICAgICAgIF9oZXhCeXRlQXRfKHMsIDM0KSwKKyAgICAgICAgICAgIH19OworfQorLy8gQ29udmVuaWVuY2UgbWFjcm8gdG8gY3JlYXRlIGEgbWVkaWFfdXVpZF90IGZyb20gYSBzdHJpbmcgbGl0ZXJhbCwgd2hpY2ggc2hvdWxkCisvLyBiZSBmb3JtYXR0ZWQgYXMgIjEyMzQ1Njc4LTEyMzQtMTIzNC0xMjM0LTEyMzQ1Njc4OWFiYyIsIGFzIGdlbmVyYXRlZCBieQorLy8gZS5nLiBodHRwczovL3d3dy51dWlkZ2VuZXJhdG9yLm5ldC8gb3IgdGhlICd1dWlkZ2VuJyBsaW51eCBjb21tYW5kLgorLy8gSGV4IGRpZ2l0cyBtYXkgYmUgdXBwZXIgb3IgbG93ZXIgY2FzZS4KKy8vCisvLyBUaGUgbWFjcm8gY2FsbCBpcyBvdGhlcndpc2UgZXF1aXZhbGVudCB0byBzcGVjaWZ5aW5nIHRoZSBzdHJ1Y3R1cmUgZGlyZWN0bHkKKy8vIChlLmcuIFVVSUQoIjdkNjEzODU4LTU4MzctNGEzOC04NGM1LTMzMmQxY2RkZWUyNyIpIGlzIHRoZSBzYW1lIGFzCisvLyAgICAgICB7ezB4N2QsIDB4NjEsIDB4MzgsIDB4NTgsIDB4NTgsIDB4MzcsIDB4NGEsIDB4MzgsCisvLyAgICAgICAgIDB4ODQsIDB4YzUsIDB4MzMsIDB4MmQsIDB4MWMsIDB4ZGQsIDB4ZWUsIDB4Mjd9fSkKKworI2RlZmluZSBVVUlEKHN0cikgW117IGNvbnN0ZXhwciBtZWRpYV91dWlkX3QgdXVpZCA9IGNvbnN0VVVJRChzdHIpOyByZXR1cm4gdXVpZDsgfSgpCisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gTUVESUFfRVhUUkFDVE9SX1BMVUdJTl9IRUxQRVJfSF8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvTWVkaWFUcmFjay5oIGIvaW5jbHVkZS9tZWRpYS9NZWRpYVRyYWNrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDVhNjMyODdhLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWEvTWVkaWFUcmFjay5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotLi4vLi4vbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9NZWRpYVRyYWNrLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL01lZGlhVHJhY2suaCBiL2luY2x1ZGUvbWVkaWEvTWVkaWFUcmFjay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlMzU5MWUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL01lZGlhVHJhY2suaApAQCAtMCwwICsxLDE4MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgTUVESUFfU09VUkNFX0JBU0VfSF8KKworI2RlZmluZSBNRURJQV9TT1VSQ0VfQkFTRV9IXworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgorI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlEZWFsZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkFwaS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkFwaS5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBNZWRpYUJ1ZmZlckJhc2U7CitzdHJ1Y3QgQ01lZGlhVHJhY2s7CisKK2NsYXNzIFNvdXJjZUJhc2VBbGxvY1RyYWNrZXIgeworcHVibGljOgorICAgIFNvdXJjZUJhc2VBbGxvY1RyYWNrZXIoKSB7CisgICAgICAgIEFMT0dEKCJzb3VyY2ViYXNlIGFsbG9jYXRlZDogJXAiLCB0aGlzKTsKKyAgICB9CisgICAgdmlydHVhbCB+U291cmNlQmFzZUFsbG9jVHJhY2tlcigpIHsKKyAgICAgICAgQUxPR0QoInNvdXJjZWJhc2UgZnJlZWQ6ICVwIiwgdGhpcyk7CisgICAgfQorfTsKKworc3RydWN0IE1lZGlhVHJhY2sKKy8vICAgIDogcHVibGljIFNvdXJjZUJhc2VBbGxvY1RyYWNrZXIKK3sKKyAgICBNZWRpYVRyYWNrKCk7CisKKyAgICAvLyBUbyBiZSBjYWxsZWQgYmVmb3JlIGFueSBvdGhlciBtZXRob2RzIG9uIHRoaXMgb2JqZWN0LCBleGNlcHQKKyAgICAvLyBnZXRGb3JtYXQoKS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KCkgPSAwOworCisgICAgLy8gQW55IGJsb2NraW5nIHJlYWQgY2FsbCByZXR1cm5zIGltbWVkaWF0ZWx5IHdpdGggYSByZXN1bHQgb2YgTk9fSU5JVC4KKyAgICAvLyBJdCBpcyBhbiBlcnJvciB0byBjYWxsIGFueSBtZXRob2RzIG90aGVyIHRoYW4gc3RhcnQgYWZ0ZXIgdGhpcyBjYWxsCisgICAgLy8gcmV0dXJucy4gQW55IGJ1ZmZlcnMgdGhlIG9iamVjdCBtYXkgYmUgaG9sZGluZyBvbnRvIGF0IHRoZSB0aW1lIG9mCisgICAgLy8gdGhlIHN0b3AoKSBjYWxsIGFyZSByZWxlYXNlZC4KKyAgICAvLyBBbHNvLCBpdCBpcyBpbXBlcmF0aXZlIHRoYXQgYW55IGJ1ZmZlcnMgb3V0cHV0IGJ5IHRoaXMgb2JqZWN0IGFuZAorICAgIC8vIGhlbGQgb250byBieSBjYWxsZXJzIGJlIHJlbGVhc2VkIGJlZm9yZSBhIGNhbGwgdG8gc3RvcCgpICEhIQorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpID0gMDsKKworICAgIC8vIFJldHVybnMgdGhlIGZvcm1hdCBvZiB0aGUgZGF0YSBvdXRwdXQgYnkgdGhpcyBtZWRpYSB0cmFjay4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZvcm1hdChNZXRhRGF0YUJhc2UmIGZvcm1hdCkgPSAwOworCisgICAgLy8gT3B0aW9ucyB0aGF0IG1vZGlmeSByZWFkKCkgYmVoYXZpb3VyLiBUaGUgZGVmYXVsdCBpcyB0bworICAgIC8vIGEpIG5vdCByZXF1ZXN0IGEgc2VlaworICAgIC8vIGIpIG5vdCBiZSBsYXRlLCBpLmUuIGxhdGVuZXNzX3VzID0gMAorICAgIHN0cnVjdCBSZWFkT3B0aW9ucyB7CisgICAgICAgIGVudW0gU2Vla01vZGUgOiBpbnQzMl90IHsKKyAgICAgICAgICAgIFNFRUtfUFJFVklPVVNfU1lOQyA9IENNZWRpYVRyYWNrUmVhZE9wdGlvbnM6OlNFRUtfUFJFVklPVVNfU1lOQywKKyAgICAgICAgICAgIFNFRUtfTkVYVF9TWU5DID0gQ01lZGlhVHJhY2tSZWFkT3B0aW9uczo6U0VFS19ORVhUX1NZTkMsCisgICAgICAgICAgICBTRUVLX0NMT1NFU1RfU1lOQyA9IENNZWRpYVRyYWNrUmVhZE9wdGlvbnM6OlNFRUtfQ0xPU0VTVF9TWU5DLAorICAgICAgICAgICAgU0VFS19DTE9TRVNUID0gQ01lZGlhVHJhY2tSZWFkT3B0aW9uczo6U0VFS19DTE9TRVNULAorICAgICAgICAgICAgU0VFS19GUkFNRV9JTkRFWCA9IENNZWRpYVRyYWNrUmVhZE9wdGlvbnM6OlNFRUtfRlJBTUVfSU5ERVgsCisgICAgICAgIH07CisKKyAgICAgICAgUmVhZE9wdGlvbnMoKSB7CisgICAgICAgICAgICByZXNldCgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gUmVzZXQgZXZlcnl0aGluZyBiYWNrIHRvIGRlZmF1bHRzLgorICAgICAgICB2b2lkIHJlc2V0KCkgeworICAgICAgICAgICAgbU9wdGlvbnMgPSAwOworICAgICAgICAgICAgbVNlZWtUaW1lVXMgPSAwOworICAgICAgICAgICAgbU5vbkJsb2NraW5nID0gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHNldFNlZWtUbyhpbnQ2NF90IHRpbWVfdXMsIFNlZWtNb2RlIG1vZGUgPSBTRUVLX0NMT1NFU1RfU1lOQyk7CisgICAgICAgIHZvaWQgY2xlYXJTZWVrVG8oKSB7CisgICAgICAgICAgICBtT3B0aW9ucyAmPSB+a1NlZWtUb19PcHRpb247CisgICAgICAgICAgICBtU2Vla1RpbWVVcyA9IDA7CisgICAgICAgICAgICBtU2Vla01vZGUgPSBTRUVLX0NMT1NFU1RfU1lOQzsKKyAgICAgICAgfQorICAgICAgICBib29sIGdldFNlZWtUbyhpbnQ2NF90ICp0aW1lX3VzLCBTZWVrTW9kZSAqbW9kZSkgY29uc3Q7CisKKyAgICAgICAgdm9pZCBzZXROb25CbG9ja2luZygpOworICAgICAgICB2b2lkIGNsZWFyTm9uQmxvY2tpbmcoKTsKKyAgICAgICAgYm9vbCBnZXROb25CbG9ja2luZygpIGNvbnN0OworCisgICAgICAgIC8vIFVzZWQgdG8gY2xlYXIgYWxsIG5vbi1wZXJzaXN0ZW50IG9wdGlvbnMgZm9yIG11bHRpcGxlIGJ1ZmZlciByZWFkcy4KKyAgICAgICAgdm9pZCBjbGVhck5vblBlcnNpc3RlbnQoKSB7CisgICAgICAgICAgICBjbGVhclNlZWtUbygpOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBlbnVtIE9wdGlvbnMgeworICAgICAgICAgICAga1NlZWtUb19PcHRpb24gICAgICA9IDEsCisgICAgICAgIH07CisKKyAgICAgICAgdWludDMyX3QgbU9wdGlvbnM7CisgICAgICAgIGludDY0X3QgbVNlZWtUaW1lVXM7CisgICAgICAgIFNlZWtNb2RlIG1TZWVrTW9kZTsKKyAgICAgICAgYm9vbCBtTm9uQmxvY2tpbmc7CisgICAgfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsgLy8gc2VudCB0aHJvdWdoIEJpbmRlcgorCisgICAgLy8gUmV0dXJucyBhIG5ldyBidWZmZXIgb2YgZGF0YS4gQ2FsbCBibG9ja3MgdW50aWwgYQorICAgIC8vIGJ1ZmZlciBpcyBhdmFpbGFibGUsIGFuIGVycm9yIGlzIGVuY291bnRlcmVkIG9mIHRoZSBlbmQgb2YgdGhlIHN0cmVhbQorICAgIC8vIGlzIHJlYWNoZWQuCisgICAgLy8gRW5kIG9mIHN0cmVhbSBpcyBzaWduYWxsZWQgYnkgYSByZXN1bHQgb2YgRVJST1JfRU5EX09GX1NUUkVBTS4KKyAgICAvLyBBIHJlc3VsdCBvZiBJTkZPX0ZPUk1BVF9DSEFOR0VEIGluZGljYXRlcyB0aGF0IHRoZSBmb3JtYXQgb2YgdGhpcworICAgIC8vIE1lZGlhU291cmNlIGhhcyBjaGFuZ2VkIG1pZC1zdHJlYW0sIHRoZSBjbGllbnQgY2FuIGNvbnRpbnVlIHJlYWRpbmcKKyAgICAvLyBidXQgc2hvdWxkIGJlIHByZXBhcmVkIGZvciBidWZmZXJzIG9mIHRoZSBuZXcgY29uZmlndXJhdGlvbi4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoCisgICAgICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCkgPSAwOworCisgICAgLy8gUmV0dXJucyB0cnVlIGlmIHxyZWFkfCBzdXBwb3J0cyBub25ibG9ja2luZyBvcHRpb24sIG90aGVyd2lzZSBmYWxzZS4KKyAgICAvLyB8cmVhZE11bHRpcGxlfCBpZiBzdXBwb3J0ZWQsIGFsd2F5cyBhbGxvd3MgdGhlIG5vbmJsb2NraW5nIG9wdGlvbi4KKyAgICB2aXJ0dWFsIGJvb2wgc3VwcG9ydE5vbmJsb2NraW5nUmVhZCgpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHZpcnR1YWwgfk1lZGlhVHJhY2soKTsKKworcHJpdmF0ZToKKyAgICBNZWRpYVRyYWNrKGNvbnN0IE1lZGlhVHJhY2sgJik7CisgICAgTWVkaWFUcmFjayAmb3BlcmF0b3I9KGNvbnN0IE1lZGlhVHJhY2sgJik7Cit9OworCitjbGFzcyBNZWRpYVRyYWNrQ1Vud3JhcHBlciA6IHB1YmxpYyBNZWRpYVRyYWNrIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBNZWRpYVRyYWNrQ1Vud3JhcHBlcihDTWVkaWFUcmFjayAqd3JhcHBlcik7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGb3JtYXQoTWV0YURhdGFCYXNlJiBmb3JtYXQpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZChNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CisKKyAgICB2aXJ0dWFsIGJvb2wgc3VwcG9ydE5vbmJsb2NraW5nUmVhZCgpOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+TWVkaWFUcmFja0NVbndyYXBwZXIoKTsKKworcHJpdmF0ZToKKyAgICBDTWVkaWFUcmFjayAqd3JhcHBlcjsKK307CisKK2NsYXNzIE1lZGlhVHJhY2tDVW53cmFwcGVyVjIgOiBwdWJsaWMgTWVkaWFUcmFjayB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgTWVkaWFUcmFja0NVbndyYXBwZXJWMihDTWVkaWFUcmFja1YyICp3cmFwcGVyKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZvcm1hdChNZXRhRGF0YUJhc2UmIGZvcm1hdCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKKworICAgIHZpcnR1YWwgYm9vbCBzdXBwb3J0Tm9uYmxvY2tpbmdSZWFkKCk7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5NZWRpYVRyYWNrQ1Vud3JhcHBlclYyKCk7CisKK3ByaXZhdGU6CisgICAgQ01lZGlhVHJhY2tWMiAqd3JhcHBlcjsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gTUVESUFfU09VUkNFX0JBU0VfSF8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFFcnJvclByaXYuaCBiL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFFcnJvclByaXYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNWUyZjAyCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUVycm9yUHJpdi5oCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9OREtfTUVESUFfRVJST1JfUFJJVl9ICisjZGVmaW5lIF9OREtfTUVESUFfRVJST1JfUFJJVl9ICisKKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUVycm9yLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCittZWRpYV9zdGF0dXNfdCB0cmFuc2xhdGVfZXJyb3Ioc3RhdHVzX3QpOworCitzdGF0dXNfdCByZXZlcnNlX3RyYW5zbGF0ZV9lcnJvcihtZWRpYV9zdGF0dXNfdCk7CisKKyNlbmRpZiAvLyBfTkRLX01FRElBX0VSUk9SX1BSSVZfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUZvcm1hdFByaXYuaCBiL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFGb3JtYXRQcml2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM0NTJjMwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFGb3JtYXRQcml2LmgKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgZGVmaW5lcyBhbiBOREsgQVBJLgorICogRG8gbm90IHJlbW92ZSBtZXRob2RzLgorICogRG8gbm90IGNoYW5nZSBtZXRob2Qgc2lnbmF0dXJlcy4KKyAqIERvIG5vdCBjaGFuZ2UgdGhlIHZhbHVlIG9mIGNvbnN0YW50cy4KKyAqIERvIG5vdCBjaGFuZ2UgdGhlIHNpemUgb2YgYW55IG9mIHRoZSBjbGFzc2VzIGRlZmluZWQgaW4gaGVyZS4KKyAqIERvIG5vdCByZWZlcmVuY2UgdHlwZXMgdGhhdCBhcmUgbm90IHBhcnQgb2YgdGhlIE5ESy4KKyAqIERvIG5vdCAjaW5jbHVkZSBmaWxlcyB0aGF0IGFyZW4ndCBwYXJ0IG9mIHRoZSBOREsuCisgKi8KKworI2lmbmRlZiBfTkRLX01FRElBX0ZPUk1BVF9QUklWX0gKKyNkZWZpbmUgX05ES19NRURJQV9GT1JNQVRfUFJJVl9ICisKKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisjaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworc3RydWN0IEFNZWRpYUZvcm1hdCB7CisgICAgc3A8QU1lc3NhZ2U+IG1Gb3JtYXQ7CisgICAgU3RyaW5nOCBtRGVidWc7CisgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gbVN0cmluZ0NhY2hlOworfTsKKworQU1lZGlhRm9ybWF0KiBBTWVkaWFGb3JtYXRfZnJvbU1zZyhjb25zdCB2b2lkKik7Cit2b2lkIEFNZWRpYUZvcm1hdF9nZXRGb3JtYXQoY29uc3QgQU1lZGlhRm9ybWF0KiBtRGF0YSwgdm9pZCogZGVzdCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAvLyBleHRlcm4gIkMiCisjZW5kaWYKKworI2VuZGlmIC8vIF9OREtfTUVESUFfRk9STUFUX1BSSVZfSAorCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL1RpbWVDaGVjay5oIGIvaW5jbHVkZS9tZWRpYS9UaW1lQ2hlY2suaAppbmRleCBlM2VmMTM0Li44NWUxN2Y5IDEyMDAwMAotLS0gYS9pbmNsdWRlL21lZGlhL1RpbWVDaGVjay5oCisrKyBiL2luY2x1ZGUvbWVkaWEvVGltZUNoZWNrLmgKQEAgLTEgKzEgQEAKLS4uLy4uL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvVGltZUNoZWNrLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisuLi8uLi9tZWRpYS91dGlscy9pbmNsdWRlL21lZGlhdXRpbHMvVGltZUNoZWNrLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL1ZvcmJpc0NvbW1lbnQuaCBiL2luY2x1ZGUvbWVkaWEvVm9yYmlzQ29tbWVudC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEyMDAwMAppbmRleCBhZGFhNDg5Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWEvVm9yYmlzQ29tbWVudC5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotLi4vLi4vbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9Wb3JiaXNDb21tZW50LmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL3ByaXZhdGUvbWVkaWEvQXVkaW9UcmFja1NoYXJlZC5oIGIvaW5jbHVkZS9wcml2YXRlL21lZGlhL0F1ZGlvVHJhY2tTaGFyZWQuaAppbmRleCBjYTExOWQ1Li41ZjE5Zjc0IDEwMDY0NAotLS0gYS9pbmNsdWRlL3ByaXZhdGUvbWVkaWEvQXVkaW9UcmFja1NoYXJlZC5oCisrKyBiL2luY2x1ZGUvcHJpdmF0ZS9tZWRpYS9BdWRpb1RyYWNrU2hhcmVkLmgKQEAgLTUzOCw2ICs1MzgsMTAgQEAKICAgICAgICAgbVRpbWVzdGFtcE11dGF0b3IucHVzaCh0aW1lc3RhbXApOwogICAgIH0KIAorICAgIHZpcnR1YWwgRXh0ZW5kZWRUaW1lc3RhbXAgZ2V0VGltZXN0YW1wKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVRpbWVzdGFtcE11dGF0b3IubGFzdCgpOworICAgIH0KKwogICAgIC8vIEZsdXNoZXMgdGhlIHNoYXJlZCByaW5nIGJ1ZmZlciBpZiB0aGUgY2xpZW50IGhhZCByZXF1ZXN0ZWQgaXQgdXNpbmcgbVN0cmVhbWluZy5tRmx1c2guCiAgICAgLy8gSWYgZmx1c2ggb2NjdXJzIHRoZW46CiAgICAgLy8gICBjYmxrLT51Lm1TdHJlYW1pbmcubUZyb250LCBTZXJ2ZXJQcm94eTo6bUZsdXNoIGFuZCBTZXJ2ZXJQcm94eTo6bUZsdXNoZWQgd2lsbCBiZSBtb2RpZmllZApAQCAtNTUxLDYgKzU1NSw5IEBACiAgICAgLy8gVG90YWwgY291bnQgb2YgdGhlIG51bWJlciBvZiBmbHVzaGVkIGZyYW1lcyBzaW5jZSBjcmVhdGlvbiAobmV2ZXIgcmVzZXQpLgogICAgIHZpcnR1YWwgaW50NjRfdCAgICAgZnJhbWVzRmx1c2hlZCgpIGNvbnN0IHsgcmV0dXJuIG1GbHVzaGVkOyB9CiAKKyAgICAvLyBTYWZlIGZyYW1lcyByZWFkeSBxdWVyeSB3aXRoIG5vIHNpZGUgZWZmZWN0cy4KKyAgICB2aXJ0dWFsIHNpemVfdCAgICAgIGZyYW1lc1JlYWR5U2FmZSgpIGNvbnN0ID0gMDsKKwogICAgIC8vIEdldCBkeW5hbWljIGJ1ZmZlciBzaXplIGZyb20gdGhlIHNoYXJlZCBjb250cm9sIGJsb2NrLgogICAgIHVpbnQzMl90ICAgICAgICAgICAgZ2V0QnVmZmVyU2l6ZUluRnJhbWVzKCkgY29uc3QgewogICAgICAgICByZXR1cm4gYW5kcm9pZF9hdG9taWNfYWNxdWlyZV9sb2FkKChpbnQzMl90ICopJm1DYmxrLT5tQnVmZmVyU2l6ZUluRnJhbWVzKTsKQEAgLTU4OCw4ICs1OTUsNyBAQAogICAgIC8vIHdoaWNoIG1heSBpbmNsdWRlIG5vbi1jb250aWd1b3VzIGZyYW1lcwogICAgIHZpcnR1YWwgc2l6ZV90ICAgICAgZnJhbWVzUmVhZHkoKTsKIAotICAgIC8vIFNhZmUgZnJhbWVzIHJlYWR5IHF1ZXJ5IHVzZWQgYnkgZHVtcCgpIC0gdGhpcyBoYXMgbm8gc2lkZSBlZmZlY3RzLgotICAgIHZpcnR1YWwgc2l6ZV90ICAgICAgZnJhbWVzUmVhZHlTYWZlKCkgY29uc3Q7CisgICAgc2l6ZV90ICAgICAgICAgICAgICBmcmFtZXNSZWFkeVNhZmUoKSBjb25zdCBvdmVycmlkZTsgLy8gZnJhbWVzIGF2YWlsYWJsZSB0byByZWFkIGJ5IHNlcnZlci4KIAogICAgIC8vIEN1cnJlbnRseSBBdWRpb0ZsaW5nZXIgd2lsbCBjYWxsIGZyYW1lc1JlYWR5KCkgZm9yIGEgZmFzdCB0cmFjayBmcm9tIHR3byB0aHJlYWRzOgogICAgIC8vIEZhc3RNaXhlciB0aHJlYWQsIGFuZCBub3JtYWwgbWl4ZXIgdGhyZWFkLiAgVGhpcyBpcyBkYW5nZXJvdXMsIGFzIHRoZSBwcm94eSBpcyBpbnRlbmRlZApAQCAtNjkzLDYgKzY5OSw4IEBACiAgICAgICAgIHJldHVybiBtQ2Jsay0+dS5tU3RyZWFtaW5nLm1SZWFyOyAvLyBGb3IgY29tcGxldGVuZXNzIG9ubHk7IG1SZWFyIHdyaXR0ZW4gYnkgc2VydmVyLgogICAgIH0KIAorICAgIHNpemVfdCBmcmFtZXNSZWFkeVNhZmUoKSBjb25zdCBvdmVycmlkZTsgLy8gZnJhbWVzIGF2YWlsYWJsZSB0byByZWFkIGJ5IGNsaWVudC4KKwogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfkF1ZGlvUmVjb3JkU2VydmVyUHJveHkoKSB7IH0KIH07CmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvdW5kdHJpZ2dlci9JU291bmRUcmlnZ2VyLmggYi9pbmNsdWRlL3NvdW5kdHJpZ2dlci9JU291bmRUcmlnZ2VyLmgKaW5kZXggNWZkOGViMi4uYzM1N2NhYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zb3VuZHRyaWdnZXIvSVNvdW5kVHJpZ2dlci5oCisrKyBiL2luY2x1ZGUvc291bmR0cmlnZ2VyL0lTb3VuZFRyaWdnZXIuaApAQCAtNDAsNiArNDAsNyBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRSZWNvZ25pdGlvbihzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBkYXRhTWVtb3J5KSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wUmVjb2duaXRpb24oc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNb2RlbFN0YXRlKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSkgPSAwOwogCiB9OwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXIuaCBiL2luY2x1ZGUvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlci5oCmluZGV4IDdhMjllMzEuLjJlMmZmN2EgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlci5oCisrKyBiL2luY2x1ZGUvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlci5oCkBAIC01Miw2ICs1Miw3IEBACiAKICAgICAgICAgICAgIHN0YXR1c190IHN0YXJ0UmVjb2duaXRpb24oc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlLCBjb25zdCBzcDxJTWVtb3J5PiYgZGF0YU1lbW9yeSk7CiAgICAgICAgICAgICBzdGF0dXNfdCBzdG9wUmVjb2duaXRpb24oc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlKTsKKyAgICAgICAgICAgIHN0YXR1c190IGdldE1vZGVsU3RhdGUoc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlKTsKIAogICAgICAgICAgICAgLy8gQnBTb3VuZFRyaWdnZXJDbGllbnQKICAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBvblJlY29nbml0aW9uRXZlbnQoY29uc3Qgc3A8SU1lbW9yeT4mIGV2ZW50TWVtb3J5KTsKZGlmZiAtLWdpdCBhL21lZGlhL09XTkVSUyBiL21lZGlhL09XTkVSUwppbmRleCAxZjY4N2EyLi4xZTJkMTIzIDEwMDY0NAotLS0gYS9tZWRpYS9PV05FUlMKKysrIGIvbWVkaWEvT1dORVJTCkBAIC0yLDggKzIsMTAgQEAKIGR3a2FuZ0Bnb29nbGUuY29tCiBlbGF1cmVudEBnb29nbGUuY29tCiBlc3NpY2tAZ29vZ2xlLmNvbQorZ2thc3RlbkBnb29nbGUuY29tCiBoa3VhbmdAZ29vZ2xlLmNvbQogaHVuZ2FAZ29vZ2xlLmNvbQoramlhYmluQGdvb2dsZS5jb20KIGptdHJpdmlAZ29vZ2xlLmNvbQoga3JvY2FyZEBnb29nbGUuY29tCiBsYWpvc0Bnb29nbGUuY29tCmRpZmYgLS1naXQgYS9tZWRpYS9hdWRpb3NlcnZlci9BbmRyb2lkLm1rIGIvbWVkaWEvYXVkaW9zZXJ2ZXIvQW5kcm9pZC5tawppbmRleCA3MGMyODFhLi5mMDVjODRiIDEwMDY0NAotLS0gYS9tZWRpYS9hdWRpb3NlcnZlci9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2F1ZGlvc2VydmVyL0FuZHJvaWQubWsKQEAgLTQsNyArNCw2IEBACiAKIExPQ0FMX1NSQ19GSUxFUyA6PSBcCiAJbWFpbl9hdWRpb3NlcnZlci5jcHAgXAotCS4uL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9JQXVkaW9SZWNvcmQuYWlkbAogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKIAlsaWJhYXVkaW9zZXJ2aWNlIFwKQEAgLTE4LDYgKzE3LDcgQEAKIAlsaWJtZWRpYSBcCiAJbGlibWVkaWFsb2dzZXJ2aWNlIFwKIAlsaWJuYmFpbyBcCisJbGlibmJsb2cgXAogCWxpYnNvdW5kdHJpZ2dlcnNlcnZpY2UgXAogCWxpYnV0aWxzCiAKQEAgLTQwLDkgKzQwLDYgQEAKIAkkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tdXRpbHMpIFwKIAlleHRlcm5hbC9zb25pYyBcCiAKLUxPQ0FMX0FJRExfSU5DTFVERVMgOj0gXAotICAgICAgICBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwKLQogIyBJZiBBVURJT1NFUlZFUl9NVUxUSUxJQiBpbiBkZXZpY2UubWsgaXMgbm9uLWVtcHR5IHRoZW4gaXQgaXMgdXNlZCB0byBjb250cm9sCiAjIHRoZSBMT0NBTF9NVUxUSUxJQiBmb3IgYWxsIGF1ZGlvc2VydmVyIGV4Y2x1c2l2ZSBsaWJyYXJpZXMuCiAjIFRoaXMgaXMgcmVsZXZhbnQgZm9yIDY0IGJpdCBhcmNoaXRlY3R1cmVzIHdoZXJlIGVpdGhlciBvciBib3RoCkBAIC01NCwxMyArNTEsOSBAQAogIyAgIGJvdGggICAgdG8gYnVpbGQgYm90aCAzMiBiaXQgYW5kIDY0IGJpdCBsaWJyYXJpZXMsCiAjICAgICAgICAgICBhbmQgdXNlIHByaW1hcnkgdGFyZ2V0IGFyY2hpdGVjdHVyZSAoMzIgb3IgNjQpIGZvciBhdWRpb3NlcnZlci4KICMgICBmaXJzdCAgIHRvIGJ1aWxkIGxpYnJhcmllcyBhbmQgYXVkaW9zZXJ2ZXIgZm9yIHRoZSBwcmltYXJ5IHRhcmdldCBhcmNoaXRlY3R1cmUgb25seS4KLSMgICA8ZW1wdHk+IHRvIGJ1aWxkIGJvdGggMzIgYW5kIDY0IGJpdCBsaWJyYXJpZXMgYW5kIDMyIGJpdCBhdWRpb3NlcnZlci4KKyMgICA8ZW1wdHk+IHRvIGJ1aWxkIGJvdGggMzIgYW5kIDY0IGJpdCBsaWJyYXJpZXMgYW5kIHByaW1hcnkgdGFyZ2V0IGF1ZGlvc2VydmVyLgogCi1pZmVxICgkKHN0cmlwICQoQVVESU9TRVJWRVJfTVVMVElMSUIpKSwpCi1MT0NBTF9NVUxUSUxJQiA6PSAzMgotZWxzZQogTE9DQUxfTVVMVElMSUIgOj0gJChBVURJT1NFUlZFUl9NVUxUSUxJQikKLWVuZGlmCiAKIExPQ0FMX01PRFVMRSA6PSBhdWRpb3NlcnZlcgogCmRpZmYgLS1naXQgYS9tZWRpYS9hdWRpb3NlcnZlci9hdWRpb3NlcnZlci5yYyBiL21lZGlhL2F1ZGlvc2VydmVyL2F1ZGlvc2VydmVyLnJjCmluZGV4IDFmMmU4MmYuLmYxZTgxNWIgMTAwNjQ0Ci0tLSBhL21lZGlhL2F1ZGlvc2VydmVyL2F1ZGlvc2VydmVyLnJjCisrKyBiL21lZGlhL2F1ZGlvc2VydmVyL2F1ZGlvc2VydmVyLnJjCkBAIC03LDYgKzcsNyBAQAogICAgIGlvcHJpbyBydCA0CiAgICAgd3JpdGVwaWQgL2Rldi9jcHVzZXQvZm9yZWdyb3VuZC90YXNrcyAvZGV2L3N0dW5lL2ZvcmVncm91bmQvdGFza3MKICAgICBvbnJlc3RhcnQgcmVzdGFydCB2ZW5kb3IuYXVkaW8taGFsLTItMAorICAgIG9ucmVzdGFydCByZXN0YXJ0IHZlbmRvci5hdWRpby1oYWwtNC0wLW1zZAogICAgICMgS2VlcCB0aGUgb3JpZ2luYWwgc2VydmljZSBuYW1lIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdoZW4gdXBncmFkaW5nCiAgICAgIyBPLU1SMSBkZXZpY2VzIHdpdGggZnJhbWV3b3JrLW9ubHkuCiAgICAgb25yZXN0YXJ0IHJlc3RhcnQgYXVkaW8taGFsLTItMApkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8xLjAvQWNjZXNzb3IuY3BwIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvQWNjZXNzb3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxZGZjMDgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzEuMC9BY2Nlc3Nvci5jcHAKQEAgLTAsMCArMSwyMDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2RlZmluZSBMT0dfVEFHICJCdWZmZXJQb29sQ29ubmVjdGlvbiIKKworI2luY2x1ZGUgIkFjY2Vzc29yLmgiCisjaW5jbHVkZSAiQWNjZXNzb3JJbXBsLmgiCisjaW5jbHVkZSAiQ29ubmVjdGlvbi5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBidWZmZXJwb29sIHsKK25hbWVzcGFjZSBWMV8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKK3ZvaWQgQ29ubmVjdGlvbkRlYXRoUmVjaXBpZW50OjphZGQoCisgICAgICAgIGludDY0X3QgY29ubmVjdGlvbklkLAorICAgICAgICBjb25zdCBzcDxBY2Nlc3Nvcj4gJmFjY2Vzc29yKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgIGlmIChtQWNjZXNzb3JzLmZpbmQoY29ubmVjdGlvbklkKSA9PSBtQWNjZXNzb3JzLmVuZCgpKSB7CisgICAgICAgIG1BY2Nlc3NvcnMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKGNvbm5lY3Rpb25JZCwgYWNjZXNzb3IpKTsKKyAgICB9Cit9CisKK3ZvaWQgQ29ubmVjdGlvbkRlYXRoUmVjaXBpZW50OjpyZW1vdmUoaW50NjRfdCBjb25uZWN0aW9uSWQpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CisgICAgbUFjY2Vzc29ycy5lcmFzZShjb25uZWN0aW9uSWQpOworICAgIGF1dG8gaXQgPSBtQ29ubmVjdGlvblRvQ29va2llLmZpbmQoY29ubmVjdGlvbklkKTsKKyAgICBpZiAoaXQgIT0gbUNvbm5lY3Rpb25Ub0Nvb2tpZS5lbmQoKSkgeworICAgICAgICB1aW50NjRfdCBjb29raWUgPSBpdC0+c2Vjb25kOworICAgICAgICBtQ29ubmVjdGlvblRvQ29va2llLmVyYXNlKGl0KTsKKyAgICAgICAgYXV0byBjaXQgPSBtQ29va2llVG9Db25uZWN0aW9ucy5maW5kKGNvb2tpZSk7CisgICAgICAgIGlmIChjaXQgIT0gbUNvb2tpZVRvQ29ubmVjdGlvbnMuZW5kKCkpIHsKKyAgICAgICAgICAgIGNpdC0+c2Vjb25kLmVyYXNlKGNvbm5lY3Rpb25JZCk7CisgICAgICAgICAgICBpZiAoY2l0LT5zZWNvbmQuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgICAgICBtQ29va2llVG9Db25uZWN0aW9ucy5lcmFzZShjaXQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCit2b2lkIENvbm5lY3Rpb25EZWF0aFJlY2lwaWVudDo6YWRkQ29va2llVG9Db25uZWN0aW9uKAorICAgICAgICB1aW50NjRfdCBjb29raWUsCisgICAgICAgIGludDY0X3QgY29ubmVjdGlvbklkKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgIGlmIChtQWNjZXNzb3JzLmZpbmQoY29ubmVjdGlvbklkKSA9PSBtQWNjZXNzb3JzLmVuZCgpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbUNvbm5lY3Rpb25Ub0Nvb2tpZS5pbnNlcnQoc3RkOjptYWtlX3BhaXIoY29ubmVjdGlvbklkLCBjb29raWUpKTsKKyAgICBhdXRvIGl0ID0gbUNvb2tpZVRvQ29ubmVjdGlvbnMuZmluZChjb29raWUpOworICAgIGlmIChpdCAhPSBtQ29va2llVG9Db25uZWN0aW9ucy5lbmQoKSkgeworICAgICAgICBpdC0+c2Vjb25kLmluc2VydChjb25uZWN0aW9uSWQpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1Db29raWVUb0Nvbm5lY3Rpb25zLmluc2VydChzdGQ6Om1ha2VfcGFpcigKKyAgICAgICAgICAgICAgICBjb29raWUsIHN0ZDo6c2V0PGludDY0X3Q+e2Nvbm5lY3Rpb25JZH0pKTsKKyAgICB9Cit9CisKK3ZvaWQgQ29ubmVjdGlvbkRlYXRoUmVjaXBpZW50OjpzZXJ2aWNlRGllZCgKKyAgICAgICAgdWludDY0X3QgY29va2llLAorICAgICAgICBjb25zdCB3cDw6OmFuZHJvaWQ6OmhpZGw6OmJhc2U6OlYxXzA6OklCYXNlPiYgLyogd2hvICovCisgICAgICAgICkgeworICAgIHN0ZDo6bWFwPGludDY0X3QsIGNvbnN0IHdwPEFjY2Vzc29yPj4gY29ubmVjdGlvbnNUb0Nsb3NlOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworCisgICAgICAgIGF1dG8gaXQgPSBtQ29va2llVG9Db25uZWN0aW9ucy5maW5kKGNvb2tpZSk7CisgICAgICAgIGlmIChpdCAhPSBtQ29va2llVG9Db25uZWN0aW9ucy5lbmQoKSkgeworICAgICAgICAgICAgZm9yIChhdXRvIGNvbkl0ID0gaXQtPnNlY29uZC5iZWdpbigpOyBjb25JdCAhPSBpdC0+c2Vjb25kLmVuZCgpOyArK2Nvbkl0KSB7CisgICAgICAgICAgICAgICAgYXV0byBhY2Nlc3Nvckl0ID0gbUFjY2Vzc29ycy5maW5kKCpjb25JdCk7CisgICAgICAgICAgICAgICAgaWYgKGFjY2Vzc29ySXQgIT0gbUFjY2Vzc29ycy5lbmQoKSkgeworICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uc1RvQ2xvc2UuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKCpjb25JdCwgYWNjZXNzb3JJdC0+c2Vjb25kKSk7CisgICAgICAgICAgICAgICAgICAgIG1BY2Nlc3NvcnMuZXJhc2UoYWNjZXNzb3JJdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1Db25uZWN0aW9uVG9Db29raWUuZXJhc2UoKmNvbkl0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1Db29raWVUb0Nvbm5lY3Rpb25zLmVyYXNlKGl0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChjb25uZWN0aW9uc1RvQ2xvc2Uuc2l6ZSgpID4gMCkgeworICAgICAgICBzcDxBY2Nlc3Nvcj4gYWNjZXNzb3I7CisgICAgICAgIGZvciAoYXV0byBpdCA9IGNvbm5lY3Rpb25zVG9DbG9zZS5iZWdpbigpOyBpdCAhPSBjb25uZWN0aW9uc1RvQ2xvc2UuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgICAgIGFjY2Vzc29yID0gaXQtPnNlY29uZC5wcm9tb3RlKCk7CisKKyAgICAgICAgICAgIGlmIChhY2Nlc3NvcikgeworICAgICAgICAgICAgICAgIGFjY2Vzc29yLT5jbG9zZShpdC0+Zmlyc3QpOworICAgICAgICAgICAgICAgIEFMT0dEKCJjb25uZWN0aW9uICVsbGQgY2xvc2VkIG9uIGRlYXRoIiwgKGxvbmcgbG9uZylpdC0+Zmlyc3QpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCituYW1lc3BhY2Ugeworc3RhdGljIHNwPENvbm5lY3Rpb25EZWF0aFJlY2lwaWVudD4gc0Nvbm5lY3Rpb25EZWF0aFJlY2lwaWVudCA9CisgICAgICAgIG5ldyBDb25uZWN0aW9uRGVhdGhSZWNpcGllbnQoKTsKK30KKworc3A8Q29ubmVjdGlvbkRlYXRoUmVjaXBpZW50PiBBY2Nlc3Nvcjo6Z2V0Q29ubmVjdGlvbkRlYXRoUmVjaXBpZW50KCkgeworICAgIHJldHVybiBzQ29ubmVjdGlvbkRlYXRoUmVjaXBpZW50OworfQorCisvLyBNZXRob2RzIGZyb20gOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYxXzA6OklBY2Nlc3NvciBmb2xsb3cuCitSZXR1cm48dm9pZD4gQWNjZXNzb3I6OmNvbm5lY3QoY29ubmVjdF9jYiBfaGlkbF9jYikgeworICAgIHNwPENvbm5lY3Rpb24+IGNvbm5lY3Rpb247CisgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZDsKKyAgICBjb25zdCBRdWV1ZURlc2NyaXB0b3IqIGZtcURlc2M7CisKKyAgICBSZXN1bHRTdGF0dXMgc3RhdHVzID0gY29ubmVjdCgmY29ubmVjdGlvbiwgJmNvbm5lY3Rpb25JZCwgJmZtcURlc2MsIGZhbHNlKTsKKyAgICBpZiAoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spIHsKKyAgICAgICAgX2hpZGxfY2Ioc3RhdHVzLCBjb25uZWN0aW9uLCBjb25uZWN0aW9uSWQsICpmbXFEZXNjKTsKKyAgICB9IGVsc2UgeworICAgICAgICBfaGlkbF9jYihzdGF0dXMsIG51bGxwdHIsIC0xTEwsCisgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OmhhcmR3YXJlOjpNUURlc2NyaXB0b3JTeW5jPEJ1ZmZlclN0YXR1c01lc3NhZ2U+KAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGFuZHJvaWQ6OmhhcmR3YXJlOjpHcmFudG9yRGVzY3JpcHRvcj4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyIC8qIG5oYW5kbGUgKi8sIDAgLyogc2l6ZSAqLykpOworICAgIH0KKyAgICByZXR1cm4gVm9pZCgpOworfQorCitBY2Nlc3Nvcjo6QWNjZXNzb3IoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0b3I+ICZhbGxvY2F0b3IpCisgICAgOiBtSW1wbChuZXcgSW1wbChhbGxvY2F0b3IpKSB7fQorCitBY2Nlc3Nvcjo6fkFjY2Vzc29yKCkgeworfQorCitib29sIEFjY2Vzc29yOjppc1ZhbGlkKCkgeworICAgIHJldHVybiAoYm9vbCltSW1wbDsKK30KKworUmVzdWx0U3RhdHVzIEFjY2Vzc29yOjphbGxvY2F0ZSgKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywKKyAgICAgICAgQnVmZmVySWQgKmJ1ZmZlcklkLCBjb25zdCBuYXRpdmVfaGFuZGxlX3QqKiBoYW5kbGUpIHsKKyAgICBpZiAobUltcGwpIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLT5hbGxvY2F0ZShjb25uZWN0aW9uSWQsIHBhcmFtcywgYnVmZmVySWQsIGhhbmRsZSk7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCitSZXN1bHRTdGF0dXMgQWNjZXNzb3I6OmZldGNoKAorICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLCBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsCisgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkLCBjb25zdCBuYXRpdmVfaGFuZGxlX3QqKiBoYW5kbGUpIHsKKyAgICBpZiAobUltcGwpIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLT5mZXRjaChjb25uZWN0aW9uSWQsIHRyYW5zYWN0aW9uSWQsIGJ1ZmZlcklkLCBoYW5kbGUpOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworUmVzdWx0U3RhdHVzIEFjY2Vzc29yOjpjb25uZWN0KAorICAgICAgICBzcDxDb25uZWN0aW9uPiAqY29ubmVjdGlvbiwgQ29ubmVjdGlvbklkICpwQ29ubmVjdGlvbklkLAorICAgICAgICBjb25zdCBRdWV1ZURlc2NyaXB0b3IqKiBmbXFEZXNjUHRyLCBib29sIGxvY2FsKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIFJlc3VsdFN0YXR1cyBzdGF0dXMgPSBtSW1wbC0+Y29ubmVjdCh0aGlzLCBjb25uZWN0aW9uLCBwQ29ubmVjdGlvbklkLCBmbXFEZXNjUHRyKTsKKyAgICAgICAgaWYgKCFsb2NhbCAmJiBzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICAgICAgc3A8QWNjZXNzb3I+IGFjY2Vzc29yKHRoaXMpOworICAgICAgICAgICAgc0Nvbm5lY3Rpb25EZWF0aFJlY2lwaWVudC0+YWRkKCpwQ29ubmVjdGlvbklkLCBhY2Nlc3Nvcik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK1Jlc3VsdFN0YXR1cyBBY2Nlc3Nvcjo6Y2xvc2UoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCkgeworICAgIGlmIChtSW1wbCkgeworICAgICAgICBSZXN1bHRTdGF0dXMgc3RhdHVzID0gbUltcGwtPmNsb3NlKGNvbm5lY3Rpb25JZCk7CisgICAgICAgIHNDb25uZWN0aW9uRGVhdGhSZWNpcGllbnQtPnJlbW92ZShjb25uZWN0aW9uSWQpOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKwordm9pZCBBY2Nlc3Nvcjo6Y2xlYW5VcChib29sIGNsZWFyQ2FjaGUpIHsKKyAgICBpZiAobUltcGwpIHsKKyAgICAgICAgbUltcGwtPmNsZWFuVXAoY2xlYXJDYWNoZSk7CisgICAgfQorfQorCisvL0lBY2Nlc3NvciogSElETF9GRVRDSF9JQWNjZXNzb3IoY29uc3QgY2hhciogLyogbmFtZSAqLykgeworLy8gICAgcmV0dXJuIG5ldyBBY2Nlc3NvcigpOworLy99CisKK30gIC8vIG5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbgorfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBidWZmZXJwb29sCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0FjY2Vzc29yLmggYi9tZWRpYS9idWZmZXJwb29sLzEuMC9BY2Nlc3Nvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmODZmN2IKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzEuMC9BY2Nlc3Nvci5oCkBAIC0wLDAgKzEsMTg4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjFfMF9BQ0NFU1NPUl9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMV8wX0FDQ0VTU09SX0gKKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYnVmZmVycG9vbC8xLjAvSUFjY2Vzc29yLmg+CisjaW5jbHVkZSA8YnVmZmVycG9vbC9CdWZmZXJQb29sVHlwZXMuaD4KKyNpbmNsdWRlIDxoaWRsL01RRGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGhpZGwvU3RhdHVzLmg+CisjaW5jbHVkZSAiQnVmZmVyU3RhdHVzLmgiCisKKyNpbmNsdWRlIDxzZXQ+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGJ1ZmZlcnBvb2wgeworbmFtZXNwYWNlIFYxXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9hcnJheTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfbWVtb3J5OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7Cit1c2luZyA6OmFuZHJvaWQ6OnNwOworCitzdHJ1Y3QgQWNjZXNzb3I7CitzdHJ1Y3QgQ29ubmVjdGlvbjsKKworLyoqCisgKiBSZWNlaXZlcyBkZWF0aCBub3RpZmljYXRpb25zIGZyb20gcmVtb3RlIGNvbm5lY3Rpb25zLgorICogT24gZGVhdGggbm90aWZpY2F0aW9ucywgdGhlIGNvbm5lY3Rpb25zIGFyZSBjbG9zZWQgYW5kIHVzZWQgcmVzb3VyY2VzCisgKiBhcmUgcmVsZWFzZWQuCisgKi8KK3N0cnVjdCBDb25uZWN0aW9uRGVhdGhSZWNpcGllbnQgOiBwdWJsaWMgaGFyZHdhcmU6OmhpZGxfZGVhdGhfcmVjaXBpZW50IHsKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlcnMgYSBuZXdseSBjb25uZWN0ZWQgY29ubmVjdGlvbiBmcm9tIHJlbW90ZSBwcm9jZXNzZXMuCisgICAgICovCisgICAgdm9pZCBhZGQoaW50NjRfdCBjb25uZWN0aW9uSWQsIGNvbnN0IHNwPEFjY2Vzc29yPiAmYWNjZXNzb3IpOworCisgICAgLyoqCisgICAgICogUmVtb3ZlcyBhIGNvbm5lY3Rpb24uCisgICAgICovCisgICAgdm9pZCByZW1vdmUoaW50NjRfdCBjb25uZWN0aW9uSWQpOworCisgICAgdm9pZCBhZGRDb29raWVUb0Nvbm5lY3Rpb24odWludDY0X3QgY29va2llLCBpbnQ2NF90IGNvbm5lY3Rpb25JZCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgc2VydmljZURpZWQoCisgICAgICAgICAgICB1aW50NjRfdCAvKiBjb29raWUgKi8sCisgICAgICAgICAgICBjb25zdCB3cDw6OmFuZHJvaWQ6OmhpZGw6OmJhc2U6OlYxXzA6OklCYXNlPiYgLyogd2hvICovCisgICAgICAgICAgICApIG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIHN0ZDo6bXV0ZXggbUxvY2s7CisgICAgc3RkOjptYXA8dWludDY0X3QsIHN0ZDo6c2V0PGludDY0X3Q+PiAgbUNvb2tpZVRvQ29ubmVjdGlvbnM7CisgICAgc3RkOjptYXA8aW50NjRfdCwgdWludDY0X3Q+IG1Db25uZWN0aW9uVG9Db29raWU7CisgICAgc3RkOjptYXA8aW50NjRfdCwgY29uc3Qgd3A8QWNjZXNzb3I+PiBtQWNjZXNzb3JzOworfTsKKworLyoqCisgKiBBIGJ1ZmZlciBwb29sIGFjY2Vzc29yIHdoaWNoIGVuYWJsZXMgYSBidWZmZXIgcG9vbCB0byBjb21tdW5pY2F0ZSB3aXRoIGJ1ZmZlcgorICogcG9vbCBjbGllbnRzLiAxOjEgY29ycmVzcG9uZGVuc2UgaG9sZHMgYmV0d2VlbiBhIGJ1ZmZlciBwb29sIGFuZCBhbiBhY2Nlc3Nvci4KKyAqLworc3RydWN0IEFjY2Vzc29yIDogcHVibGljIElBY2Nlc3NvciB7CisgICAgLy8gTWV0aG9kcyBmcm9tIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMV8wOjpJQWNjZXNzb3IgZm9sbG93LgorICAgIFJldHVybjx2b2lkPiBjb25uZWN0KGNvbm5lY3RfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGJ1ZmZlciBwb29sIGFjY2Vzc29yIHdoaWNoIHVzZXMgdGhlIHNwZWNpZmllZCBhbGxvY2F0b3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWxsb2NhdG9yIGJ1ZmZlciBhbGxvY2F0b3IuCisgICAgICovCisgICAgZXhwbGljaXQgQWNjZXNzb3IoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0b3I+ICZhbGxvY2F0b3IpOworCisgICAgLyoqIERlc3RydWN0cyBhIGJ1ZmZlciBwb29sIGFjY2Vzc29yLiAqLworICAgIH5BY2Nlc3NvcigpOworCisgICAgLyoqIFJldHVybnMgd2hldGhlciB0aGUgYWNjZXNzb3IgaXMgdmFsaWQuICovCisgICAgYm9vbCBpc1ZhbGlkKCk7CisKKyAgICAvKiogQWxsb2NhdGVzIGEgYnVmZmVyIGZyb20gYSBidWZmZXIgcG9vbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uSWQgIHRoZSBjb25uZWN0aW9uIGlkIG9mIHRoZSBjbGllbnQuCisgICAgICogQHBhcmFtIHBhcmFtcyAgICAgICAgdGhlIGFsbG9jYXRpb24gcGFyYW1ldGVycy4KKyAgICAgKiBAcGFyYW0gYnVmZmVySWQgICAgICB0aGUgaWQgb2YgdGhlIGFsbG9jYXRlZCBidWZmZXIuCisgICAgICogQHBhcmFtIGhhbmRsZSAgICAgICAgdGhlIG5hdGl2ZSBoYW5kbGUgb2YgdGhlIGFsbG9jYXRlZCBidWZmZXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE9LIHdoZW4gYSBidWZmZXIgaXMgc3VjY2Vzc2Z1bGx5IGFsbG9jYXRlZC4KKyAgICAgKiAgICAgICAgIE5PX01FTU9SWSB3aGVuIHRoZXJlIGlzIG5vIG1lbW9yeS4KKyAgICAgKiAgICAgICAgIENSSVRJQ0FMX0VSUk9SIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBSZXN1bHRTdGF0dXMgYWxsb2NhdGUoCisgICAgICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHBhcmFtcywKKyAgICAgICAgICAgIEJ1ZmZlcklkICpidWZmZXJJZCwKKyAgICAgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCoqIGhhbmRsZSk7CisKKyAgICAvKioKKyAgICAgKiBGZXRjaGVzIGEgYnVmZmVyIGZvciB0aGUgc3BlY2lmaWVkIHRyYW5zYWN0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbm5lY3Rpb25JZCAgdGhlIGlkIG9mIHJlY2VpdmluZyBjb25uZWN0aW9uKGNsaWVudCkuCisgICAgICogQHBhcmFtIHRyYW5zYWN0aW9uSWQgdGhlIGlkIG9mIHRoZSB0cmFuc2ZlciB0cmFuc2FjdGlvbi4KKyAgICAgKiBAcGFyYW0gYnVmZmVySWQgICAgICB0aGUgaWQgb2YgdGhlIGJ1ZmZlciB0byBiZSBmZXRjaGVkLgorICAgICAqIEBwYXJhbSBoYW5kbGUgICAgICAgIHRoZSBuYXRpdmUgaGFuZGxlIG9mIHRoZSBmZXRjaGVkIGJ1ZmZlci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gT0sgd2hlbiBhIGJ1ZmZlciBpcyBzdWNjZXNzZnVsbHkgZmV0Y2hlZC4KKyAgICAgKiAgICAgICAgIE5PX01FTU9SWSB3aGVuIHRoZXJlIGlzIG5vIG1lbW9yeS4KKyAgICAgKiAgICAgICAgIENSSVRJQ0FMX0VSUk9SIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBSZXN1bHRTdGF0dXMgZmV0Y2goCisgICAgICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLAorICAgICAgICAgICAgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLAorICAgICAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsCisgICAgICAgICAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QqKiBoYW5kbGUpOworCisgICAgLyoqCisgICAgICogTWFrZXMgYSBjb25uZWN0aW9uIHRvIHRoZSBidWZmZXIgcG9vbC4gVGhlIGJ1ZmZlciBwb29sIGNsaWVudCB1c2VzIHRoZQorICAgICAqIGNyZWF0ZWQgY29ubmVjdGlvbiBpbiBvcmRlciB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSBidWZmZXIgcG9vbC4gQW4KKyAgICAgKiBGTVEgZm9yIGJ1ZmZlciBzdGF0dXMgbWVzc2FnZSBpcyBhbHNvIGNyZWF0ZWQgZm9yIHRoZSBjbGllbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvbiAgICBjcmVhdGVkIGNvbm5lY3Rpb24KKyAgICAgKiBAcGFyYW0gcENvbm5lY3Rpb25JZCB0aGUgaWQgb2YgdGhlIGNyZWF0ZWQgY29ubmVjdGlvbgorICAgICAqIEBwYXJhbSBmbXFEZXNjUHRyICAgIEZNUSBkZXNjcmlwdG9yIGZvciBzaGFyZWQgYnVmZmVyIHN0YXR1cyBtZXNzYWdlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgcXVldWUgYmV0d2VlbiBhIGJ1ZmZlciBwb29sIGFuZCB0aGUgY2xpZW50LgorICAgICAqIEBwYXJhbSBsb2NhbCAgICAgICAgIHRydWUgd2hlbiBhIGNvbm5lY3Rpb24gcmVxdWVzdCBjb21lcyBmcm9tIGxvY2FsIHByb2Nlc3MsCisgICAgICogICAgICAgICAgICAgICAgICAgICAgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqCisgICAgICogQHJldHVybiBPSyB3aGVuIGEgY29ubmVjdGlvbiBpcyBzdWNjZXNzZnVsbHkgbWFkZS4KKyAgICAgKiAgICAgICAgIE5PX01FTU9SWSB3aGVuIHRoZXJlIGlzIG5vIG1lbW9yeS4KKyAgICAgKiAgICAgICAgIENSSVRJQ0FMX0VSUk9SIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBSZXN1bHRTdGF0dXMgY29ubmVjdCgKKyAgICAgICAgICAgIHNwPENvbm5lY3Rpb24+ICpjb25uZWN0aW9uLCBDb25uZWN0aW9uSWQgKnBDb25uZWN0aW9uSWQsCisgICAgICAgICAgICBjb25zdCBRdWV1ZURlc2NyaXB0b3IqKiBmbXFEZXNjUHRyLCBib29sIGxvY2FsKTsKKworICAgIC8qKgorICAgICAqIENsb3NlcyB0aGUgc3BlY2lmaWVkIGNvbm5lY3Rpb24gdG8gdGhlIGNsaWVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uSWQgIHRoZSBpZCBvZiB0aGUgY29ubmVjdGlvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gT0sgd2hlbiB0aGUgY29ubmVjdGlvbiBpcyBjbG9zZWQuCisgICAgICogICAgICAgICBDUklUSUNBTF9FUlJPUiBvdGhlcndpc2UuCisgICAgICovCisgICAgUmVzdWx0U3RhdHVzIGNsb3NlKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQpOworCisgICAgLyoqCisgICAgICogUHJvY2Vzc2VzIHBlbmRpbmcgYnVmZmVyIHN0YXR1cyBtZXNzYWdlcyBhbmQgcGVyZm9tcyBwZXJpb2RpYyBjYWNoZQorICAgICAqIGNsZWFuaW5nLgorICAgICAqCisgICAgICogQHBhcmFtIGNsZWFyQ2FjaGUgICAgaWYgY2xlYXJDYWNoZSBpcyB0cnVlLCBpdCBmcmVlcyBhbGwgYnVmZmVycyB3YWl0aW5nCisgICAgICogICAgICAgICAgICAgICAgICAgICAgdG8gYmUgcmVjeWNsZWQuCisgICAgICovCisgICAgdm9pZCBjbGVhblVwKGJvb2wgY2xlYXJDYWNoZSk7CisKKyAgICAvKioKKyAgICAgKiBHZXRzIGEgaGlkbF9kZWF0aF9yZWNpcGllbnQgZm9yIHJlbW90ZSBjb25uZWN0aW9uIGRlYXRoLgorICAgICAqLworICAgIHN0YXRpYyBzcDxDb25uZWN0aW9uRGVhdGhSZWNpcGllbnQ+IGdldENvbm5lY3Rpb25EZWF0aFJlY2lwaWVudCgpOworCitwcml2YXRlOgorICAgIGNsYXNzIEltcGw7CisgICAgc3RkOjp1bmlxdWVfcHRyPEltcGw+IG1JbXBsOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uCit9ICAvLyBuYW1lc3BhY2UgVjFfMAorfSAgLy8gbmFtZXNwYWNlIGJ1ZmZlcnBvb2wKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMV8wX0FDQ0VTU09SX0gKZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0FjY2Vzc29ySW1wbC5jcHAgYi9tZWRpYS9idWZmZXJwb29sLzEuMC9BY2Nlc3NvckltcGwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhMTdmMTUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzEuMC9BY2Nlc3NvckltcGwuY3BwCkBAIC0wLDAgKzEsNTQzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJCdWZmZXJQb29sQWNjZXNzb3IiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSAiQWNjZXNzb3JJbXBsLmgiCisjaW5jbHVkZSAiQ29ubmVjdGlvbi5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBidWZmZXJwb29sIHsKK25hbWVzcGFjZSBWMV8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKK25hbWVzcGFjZSB7CisgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQ2NF90IGtDbGVhblVwRHVyYXRpb25VcyA9IDUwMDAwMDsgLy8gVE9ETyB0dW5lIDAuNSBzZWMKKyAgICBzdGF0aWMgY29uc3RleHByIGludDY0X3Qga0xvZ0R1cmF0aW9uVXMgPSA1MDAwMDAwOyAvLyA1IHNlY3MKKworICAgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IGtNaW5BbGxvY0J5dGVzRm9yRXZpY3Rpb24gPSAxMDI0KjEwMjQqMTU7CisgICAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3Qga01pbkJ1ZmZlckNvdW50Rm9yRXZpY3Rpb24gPSA0MDsKK30KKworLy8gQnVmZmVyIHN0cnVjdHVyZSBpbiBidWZmZXJwb29sIHByb2Nlc3MKK3N0cnVjdCBJbnRlcm5hbEJ1ZmZlciB7CisgICAgQnVmZmVySWQgbUlkOworICAgIHNpemVfdCBtT3duZXJDb3VudDsKKyAgICBzaXplX3QgbVRyYW5zYWN0aW9uQ291bnQ7CisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0aW9uPiBtQWxsb2NhdGlvbjsKKyAgICBjb25zdCBzaXplX3QgbUFsbG9jU2l6ZTsKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiBtQ29uZmlnOworCisgICAgSW50ZXJuYWxCdWZmZXIoCisgICAgICAgICAgICBCdWZmZXJJZCBpZCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdGlvbj4gJmFsbG9jLAorICAgICAgICAgICAgY29uc3Qgc2l6ZV90IGFsbG9jU2l6ZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZhbGxvY0NvbmZpZykKKyAgICAgICAgICAgIDogbUlkKGlkKSwgbU93bmVyQ291bnQoMCksIG1UcmFuc2FjdGlvbkNvdW50KDApLAorICAgICAgICAgICAgbUFsbG9jYXRpb24oYWxsb2MpLCBtQWxsb2NTaXplKGFsbG9jU2l6ZSksIG1Db25maWcoYWxsb2NDb25maWcpIHt9CisKKyAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QgKmhhbmRsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1BbGxvY2F0aW9uLT5oYW5kbGUoKTsKKyAgICB9Cit9OworCitzdHJ1Y3QgVHJhbnNhY3Rpb25TdGF0dXMgeworICAgIFRyYW5zYWN0aW9uSWQgbUlkOworICAgIEJ1ZmZlcklkIG1CdWZmZXJJZDsKKyAgICBDb25uZWN0aW9uSWQgbVNlbmRlcjsKKyAgICBDb25uZWN0aW9uSWQgbVJlY2VpdmVyOworICAgIEJ1ZmZlclN0YXR1cyBtU3RhdHVzOworICAgIGludDY0X3QgbVRpbWVzdGFtcFVzOworICAgIGJvb2wgbVNlbmRlclZhbGlkYXRlZDsKKworICAgIFRyYW5zYWN0aW9uU3RhdHVzKGNvbnN0IEJ1ZmZlclN0YXR1c01lc3NhZ2UgJm1lc3NhZ2UsIGludDY0X3QgdGltZXN0YW1wVXMpIHsKKyAgICAgICAgbUlkID0gbWVzc2FnZS50cmFuc2FjdGlvbklkOworICAgICAgICBtQnVmZmVySWQgPSBtZXNzYWdlLmJ1ZmZlcklkOworICAgICAgICBtU3RhdHVzID0gbWVzc2FnZS5uZXdTdGF0dXM7CisgICAgICAgIG1UaW1lc3RhbXBVcyA9IHRpbWVzdGFtcFVzOworICAgICAgICBpZiAobVN0YXR1cyA9PSBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX1RPKSB7CisgICAgICAgICAgICBtU2VuZGVyID0gbWVzc2FnZS5jb25uZWN0aW9uSWQ7CisgICAgICAgICAgICBtUmVjZWl2ZXIgPSBtZXNzYWdlLnRhcmdldENvbm5lY3Rpb25JZDsKKyAgICAgICAgICAgIG1TZW5kZXJWYWxpZGF0ZWQgPSB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVNlbmRlciA9IC0xTEw7CisgICAgICAgICAgICBtUmVjZWl2ZXIgPSBtZXNzYWdlLmNvbm5lY3Rpb25JZDsKKyAgICAgICAgICAgIG1TZW5kZXJWYWxpZGF0ZWQgPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KK307CisKKy8vIEhlbHBlciB0ZW1wbGF0ZSBtZXRob2RzIGZvciBoYW5kbGluZyBtYXAgb2Ygc2V0LgordGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgVT4KK2Jvb2wgaW5zZXJ0KHN0ZDo6bWFwPFQsIHN0ZDo6c2V0PFU+PiAqbWFwT2ZTZXQsIFQga2V5LCBVIHZhbHVlKSB7CisgICAgYXV0byBpdGVyID0gbWFwT2ZTZXQtPmZpbmQoa2V5KTsKKyAgICBpZiAoaXRlciA9PSBtYXBPZlNldC0+ZW5kKCkpIHsKKyAgICAgICAgc3RkOjpzZXQ8VT4gdmFsdWVTZXR7dmFsdWV9OworICAgICAgICBtYXBPZlNldC0+aW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKGtleSwgdmFsdWVTZXQpKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBlbHNlIGlmIChpdGVyLT5zZWNvbmQuZmluZCh2YWx1ZSkgID09IGl0ZXItPnNlY29uZC5lbmQoKSkgeworICAgICAgICBpdGVyLT5zZWNvbmQuaW5zZXJ0KHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKwordGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgVT4KK2Jvb2wgZXJhc2Uoc3RkOjptYXA8VCwgc3RkOjpzZXQ8VT4+ICptYXBPZlNldCwgVCBrZXksIFUgdmFsdWUpIHsKKyAgICBib29sIHJldCA9IGZhbHNlOworICAgIGF1dG8gaXRlciA9IG1hcE9mU2V0LT5maW5kKGtleSk7CisgICAgaWYgKGl0ZXIgIT0gbWFwT2ZTZXQtPmVuZCgpKSB7CisgICAgICAgIGlmIChpdGVyLT5zZWNvbmQuZXJhc2UodmFsdWUpID4gMCkgeworICAgICAgICAgICAgcmV0ID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaXRlci0+c2Vjb25kLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICBtYXBPZlNldC0+ZXJhc2UoaXRlcik7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKwordGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgVT4KK2Jvb2wgY29udGFpbnMoc3RkOjptYXA8VCwgc3RkOjpzZXQ8VT4+ICptYXBPZlNldCwgVCBrZXksIFUgdmFsdWUpIHsKKyAgICBhdXRvIGl0ZXIgPSBtYXBPZlNldC0+ZmluZChrZXkpOworICAgIGlmIChpdGVyICE9IG1hcE9mU2V0LT5lbmQoKSkgeworICAgICAgICBhdXRvIHNldEl0ZXIgPSBpdGVyLT5zZWNvbmQuZmluZCh2YWx1ZSk7CisgICAgICAgIHJldHVybiBzZXRJdGVyICE9IGl0ZXItPnNlY29uZC5lbmQoKTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitpbnQzMl90IEFjY2Vzc29yOjpJbXBsOjpzUGlkID0gZ2V0cGlkKCk7Cit1aW50MzJfdCBBY2Nlc3Nvcjo6SW1wbDo6c1NlcUlkID0gdGltZShudWxscHRyKTsKKworQWNjZXNzb3I6OkltcGw6OkltcGwoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdG9yPiAmYWxsb2NhdG9yKQorICAgICAgICA6IG1BbGxvY2F0b3IoYWxsb2NhdG9yKSB7fQorCitBY2Nlc3Nvcjo6SW1wbDo6fkltcGwoKSB7Cit9CisKK1Jlc3VsdFN0YXR1cyBBY2Nlc3Nvcjo6SW1wbDo6Y29ubmVjdCgKKyAgICAgICAgY29uc3Qgc3A8QWNjZXNzb3I+ICZhY2Nlc3Nvciwgc3A8Q29ubmVjdGlvbj4gKmNvbm5lY3Rpb24sCisgICAgICAgIENvbm5lY3Rpb25JZCAqcENvbm5lY3Rpb25JZCwgY29uc3QgUXVldWVEZXNjcmlwdG9yKiogZm1xRGVzY1B0cikgeworICAgIHNwPENvbm5lY3Rpb24+IG5ld0Nvbm5lY3Rpb24gPSBuZXcgQ29ubmVjdGlvbigpOworICAgIFJlc3VsdFN0YXR1cyBzdGF0dXMgPSBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUJ1ZmZlclBvb2wubU11dGV4KTsKKyAgICAgICAgaWYgKG5ld0Nvbm5lY3Rpb24pIHsKKyAgICAgICAgICAgIENvbm5lY3Rpb25JZCBpZCA9IChpbnQ2NF90KXNQaWQgPDwgMzIgfCBzU2VxSWQ7CisgICAgICAgICAgICBzdGF0dXMgPSBtQnVmZmVyUG9vbC5tT2JzZXJ2ZXIub3BlbihpZCwgZm1xRGVzY1B0cik7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICBuZXdDb25uZWN0aW9uLT5pbml0aWFsaXplKGFjY2Vzc29yLCBpZCk7CisgICAgICAgICAgICAgICAgKmNvbm5lY3Rpb24gPSBuZXdDb25uZWN0aW9uOworICAgICAgICAgICAgICAgICpwQ29ubmVjdGlvbklkID0gaWQ7CisgICAgICAgICAgICAgICAgKytzU2VxSWQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbUJ1ZmZlclBvb2wucHJvY2Vzc1N0YXR1c01lc3NhZ2VzKCk7CisgICAgICAgIG1CdWZmZXJQb29sLmNsZWFuVXAoKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworUmVzdWx0U3RhdHVzIEFjY2Vzc29yOjpJbXBsOjpjbG9zZShDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUJ1ZmZlclBvb2wubU11dGV4KTsKKyAgICBtQnVmZmVyUG9vbC5wcm9jZXNzU3RhdHVzTWVzc2FnZXMoKTsKKyAgICBtQnVmZmVyUG9vbC5oYW5kbGVDbG9zZShjb25uZWN0aW9uSWQpOworICAgIG1CdWZmZXJQb29sLm1PYnNlcnZlci5jbG9zZShjb25uZWN0aW9uSWQpOworICAgIC8vIFNpbmNlIGNsb3NlIyB3aWxsIGJlIGNhbGxlZCBhZnRlciBhbGwgd29ya3MgYXJlIGZpbmlzaGVkLCBpdCBpcyBPSyB0bworICAgIC8vIGV2aWN0IHVudXNlZCBidWZmZXJzLgorICAgIG1CdWZmZXJQb29sLmNsZWFuVXAodHJ1ZSk7CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6T0s7Cit9CisKK1Jlc3VsdFN0YXR1cyBBY2Nlc3Nvcjo6SW1wbDo6YWxsb2NhdGUoCisgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBwYXJhbXMsCisgICAgICAgIEJ1ZmZlcklkICpidWZmZXJJZCwgY29uc3QgbmF0aXZlX2hhbmRsZV90KiogaGFuZGxlKSB7CisgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG1CdWZmZXJQb29sLm1NdXRleCk7CisgICAgbUJ1ZmZlclBvb2wucHJvY2Vzc1N0YXR1c01lc3NhZ2VzKCk7CisgICAgUmVzdWx0U3RhdHVzIHN0YXR1cyA9IFJlc3VsdFN0YXR1czo6T0s7CisgICAgaWYgKCFtQnVmZmVyUG9vbC5nZXRGcmVlQnVmZmVyKG1BbGxvY2F0b3IsIHBhcmFtcywgYnVmZmVySWQsIGhhbmRsZSkpIHsKKyAgICAgICAgbG9jay51bmxvY2soKTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0aW9uPiBhbGxvYzsKKyAgICAgICAgc2l6ZV90IGFsbG9jU2l6ZTsKKyAgICAgICAgc3RhdHVzID0gbUFsbG9jYXRvci0+YWxsb2NhdGUocGFyYW1zLCAmYWxsb2MsICZhbGxvY1NpemUpOworICAgICAgICBsb2NrLmxvY2soKTsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBtQnVmZmVyUG9vbC5hZGROZXdCdWZmZXIoYWxsb2MsIGFsbG9jU2l6ZSwgcGFyYW1zLCBidWZmZXJJZCwgaGFuZGxlKTsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigiY3JlYXRlIGEgYnVmZmVyICVkIDogJXUgJXAiLAorICAgICAgICAgICAgICBzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSywgKmJ1ZmZlcklkLCAqaGFuZGxlKTsKKyAgICB9CisgICAgaWYgKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgIC8vIFRPRE86IGhhbmRsZSBvd25CdWZmZXIgZmFpbHVyZQorICAgICAgICBtQnVmZmVyUG9vbC5oYW5kbGVPd25CdWZmZXIoY29ubmVjdGlvbklkLCAqYnVmZmVySWQpOworICAgIH0KKyAgICBtQnVmZmVyUG9vbC5jbGVhblVwKCk7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworUmVzdWx0U3RhdHVzIEFjY2Vzc29yOjpJbXBsOjpmZXRjaCgKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLAorICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCwgY29uc3QgbmF0aXZlX2hhbmRsZV90KiogaGFuZGxlKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUJ1ZmZlclBvb2wubU11dGV4KTsKKyAgICBtQnVmZmVyUG9vbC5wcm9jZXNzU3RhdHVzTWVzc2FnZXMoKTsKKyAgICBhdXRvIGZvdW5kID0gbUJ1ZmZlclBvb2wubVRyYW5zYWN0aW9ucy5maW5kKHRyYW5zYWN0aW9uSWQpOworICAgIGlmIChmb3VuZCAhPSBtQnVmZmVyUG9vbC5tVHJhbnNhY3Rpb25zLmVuZCgpICYmCisgICAgICAgICAgICBjb250YWlucygmbUJ1ZmZlclBvb2wubVBlbmRpbmdUcmFuc2FjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uSWQsIHRyYW5zYWN0aW9uSWQpKSB7CisgICAgICAgIGlmIChmb3VuZC0+c2Vjb25kLT5tU2VuZGVyVmFsaWRhdGVkICYmCisgICAgICAgICAgICAgICAgZm91bmQtPnNlY29uZC0+bVN0YXR1cyA9PSBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX0ZST00gJiYKKyAgICAgICAgICAgICAgICBmb3VuZC0+c2Vjb25kLT5tQnVmZmVySWQgPT0gYnVmZmVySWQpIHsKKyAgICAgICAgICAgIGZvdW5kLT5zZWNvbmQtPm1TdGF0dXMgPSBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX0ZFVENIOworICAgICAgICAgICAgYXV0byBidWZmZXJJdCA9IG1CdWZmZXJQb29sLm1CdWZmZXJzLmZpbmQoYnVmZmVySWQpOworICAgICAgICAgICAgaWYgKGJ1ZmZlckl0ICE9IG1CdWZmZXJQb29sLm1CdWZmZXJzLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgbUJ1ZmZlclBvb2wubVN0YXRzLm9uQnVmZmVyRmV0Y2hlZCgpOworICAgICAgICAgICAgICAgICpoYW5kbGUgPSBidWZmZXJJdC0+c2Vjb25kLT5oYW5kbGUoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpPSzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBtQnVmZmVyUG9vbC5jbGVhblVwKCk7CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK3ZvaWQgQWNjZXNzb3I6OkltcGw6OmNsZWFuVXAoYm9vbCBjbGVhckNhY2hlKSB7CisgICAgLy8gdHJhbnNhY3Rpb24gdGltZW91dCwgYnVmZmVyIGNhY2hlaW5nIFRUTCBoYW5kbGluZworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1CdWZmZXJQb29sLm1NdXRleCk7CisgICAgbUJ1ZmZlclBvb2wucHJvY2Vzc1N0YXR1c01lc3NhZ2VzKCk7CisgICAgbUJ1ZmZlclBvb2wuY2xlYW5VcChjbGVhckNhY2hlKTsKK30KKworQWNjZXNzb3I6OkltcGw6OkltcGw6OkJ1ZmZlclBvb2w6OkJ1ZmZlclBvb2woKQorICAgIDogbVRpbWVzdGFtcFVzKGdldFRpbWVzdGFtcE5vdygpKSwKKyAgICAgIG1MYXN0Q2xlYW5VcFVzKG1UaW1lc3RhbXBVcyksCisgICAgICBtTGFzdExvZ1VzKG1UaW1lc3RhbXBVcyksCisgICAgICBtU2VxKDApIHt9CisKKworLy8gU3RhdGlzdGljcyBoZWxwZXIKK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFM+CitpbnQgcGVyY2VudGFnZShUIGJhc2UsIFMgdG90YWwpIHsKKyAgICByZXR1cm4gaW50KHRvdGFsID8gMC41ICsgMTAwLiAqIHN0YXRpY19jYXN0PFM+KGJhc2UpIC8gdG90YWwgOiAwKTsKK30KKworQWNjZXNzb3I6OkltcGw6OkltcGw6OkJ1ZmZlclBvb2w6On5CdWZmZXJQb29sKCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisgICAgQUxPR0QoIkRlc3RydWN0aW9uIC0gYnVmZmVycG9vbCAlcCAiCisgICAgICAgICAgImNhY2hlZDogJXp1LyV6dU0sICV6dS8lZCUlIGluIHVzZTsgIgorICAgICAgICAgICJhbGxvY3M6ICV6dSwgJWQlJSByZWN5Y2xlZDsgIgorICAgICAgICAgICJ0cmFuc2ZlcnM6ICV6dSwgJWQlJSB1bmZldGNlZCIsCisgICAgICAgICAgdGhpcywgbVN0YXRzLm1CdWZmZXJzQ2FjaGVkLCBtU3RhdHMubVNpemVDYWNoZWQgPj4gMjAsCisgICAgICAgICAgbVN0YXRzLm1CdWZmZXJzSW5Vc2UsIHBlcmNlbnRhZ2UobVN0YXRzLm1CdWZmZXJzSW5Vc2UsIG1TdGF0cy5tQnVmZmVyc0NhY2hlZCksCisgICAgICAgICAgbVN0YXRzLm1Ub3RhbEFsbG9jYXRpb25zLCBwZXJjZW50YWdlKG1TdGF0cy5tVG90YWxSZWN5Y2xlcywgbVN0YXRzLm1Ub3RhbEFsbG9jYXRpb25zKSwKKyAgICAgICAgICBtU3RhdHMubVRvdGFsVHJhbnNmZXJzLAorICAgICAgICAgIHBlcmNlbnRhZ2UobVN0YXRzLm1Ub3RhbFRyYW5zZmVycyAtIG1TdGF0cy5tVG90YWxGZXRjaGVzLCBtU3RhdHMubVRvdGFsVHJhbnNmZXJzKSk7Cit9CisKK2Jvb2wgQWNjZXNzb3I6OkltcGw6OkJ1ZmZlclBvb2w6OmhhbmRsZU93bkJ1ZmZlcigKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwgQnVmZmVySWQgYnVmZmVySWQpIHsKKworICAgIGJvb2wgYWRkZWQgPSBpbnNlcnQoJm1Vc2luZ0J1ZmZlcnMsIGNvbm5lY3Rpb25JZCwgYnVmZmVySWQpOworICAgIGlmIChhZGRlZCkgeworICAgICAgICBhdXRvIGl0ZXIgPSBtQnVmZmVycy5maW5kKGJ1ZmZlcklkKTsKKyAgICAgICAgaXRlci0+c2Vjb25kLT5tT3duZXJDb3VudCsrOworICAgIH0KKyAgICBpbnNlcnQoJm1Vc2luZ0Nvbm5lY3Rpb25zLCBidWZmZXJJZCwgY29ubmVjdGlvbklkKTsKKyAgICByZXR1cm4gYWRkZWQ7Cit9CisKK2Jvb2wgQWNjZXNzb3I6OkltcGw6OkJ1ZmZlclBvb2w6OmhhbmRsZVJlbGVhc2VCdWZmZXIoCisgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsIEJ1ZmZlcklkIGJ1ZmZlcklkKSB7CisgICAgYm9vbCBkZWxldGVkID0gZXJhc2UoJm1Vc2luZ0J1ZmZlcnMsIGNvbm5lY3Rpb25JZCwgYnVmZmVySWQpOworICAgIGlmIChkZWxldGVkKSB7CisgICAgICAgIGF1dG8gaXRlciA9IG1CdWZmZXJzLmZpbmQoYnVmZmVySWQpOworICAgICAgICBpdGVyLT5zZWNvbmQtPm1Pd25lckNvdW50LS07CisgICAgICAgIGlmIChpdGVyLT5zZWNvbmQtPm1Pd25lckNvdW50ID09IDAgJiYKKyAgICAgICAgICAgICAgICBpdGVyLT5zZWNvbmQtPm1UcmFuc2FjdGlvbkNvdW50ID09IDApIHsKKyAgICAgICAgICAgIG1TdGF0cy5vbkJ1ZmZlclVudXNlZChpdGVyLT5zZWNvbmQtPm1BbGxvY1NpemUpOworICAgICAgICAgICAgbUZyZWVCdWZmZXJzLmluc2VydChidWZmZXJJZCk7CisgICAgICAgIH0KKyAgICB9CisgICAgZXJhc2UoJm1Vc2luZ0Nvbm5lY3Rpb25zLCBidWZmZXJJZCwgY29ubmVjdGlvbklkKTsKKyAgICBBTE9HVigicmVsZWFzZSBidWZmZXIgJXUgOiAlZCIsIGJ1ZmZlcklkLCBkZWxldGVkKTsKKyAgICByZXR1cm4gZGVsZXRlZDsKK30KKworYm9vbCBBY2Nlc3Nvcjo6SW1wbDo6QnVmZmVyUG9vbDo6aGFuZGxlVHJhbnNmZXJUbyhjb25zdCBCdWZmZXJTdGF0dXNNZXNzYWdlICZtZXNzYWdlKSB7CisgICAgYXV0byBjb21wbGV0ZWQgPSBtQ29tcGxldGVkVHJhbnNhY3Rpb25zLmZpbmQoCisgICAgICAgICAgICBtZXNzYWdlLnRyYW5zYWN0aW9uSWQpOworICAgIGlmIChjb21wbGV0ZWQgIT0gbUNvbXBsZXRlZFRyYW5zYWN0aW9ucy5lbmQoKSkgeworICAgICAgICAvLyBhbHJlYWR5IGNvbXBsZXRlZAorICAgICAgICBtQ29tcGxldGVkVHJhbnNhY3Rpb25zLmVyYXNlKGNvbXBsZXRlZCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICAvLyB0aGUgYnVmZmVyIHNob3VsZCBleGlzdCBhbmQgYmUgb3duZWQuCisgICAgYXV0byBidWZmZXJJdGVyID0gbUJ1ZmZlcnMuZmluZChtZXNzYWdlLmJ1ZmZlcklkKTsKKyAgICBpZiAoYnVmZmVySXRlciA9PSBtQnVmZmVycy5lbmQoKSB8fAorICAgICAgICAgICAgIWNvbnRhaW5zKCZtVXNpbmdCdWZmZXJzLCBtZXNzYWdlLmNvbm5lY3Rpb25JZCwgbWVzc2FnZS5idWZmZXJJZCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBhdXRvIGZvdW5kID0gbVRyYW5zYWN0aW9ucy5maW5kKG1lc3NhZ2UudHJhbnNhY3Rpb25JZCk7CisgICAgaWYgKGZvdW5kICE9IG1UcmFuc2FjdGlvbnMuZW5kKCkpIHsKKyAgICAgICAgLy8gdHJhbnNmZXJfZnJvbSB3YXMgcmVjZWl2ZWQgZWFybGllci4KKyAgICAgICAgZm91bmQtPnNlY29uZC0+bVNlbmRlciA9IG1lc3NhZ2UuY29ubmVjdGlvbklkOworICAgICAgICBmb3VuZC0+c2Vjb25kLT5tU2VuZGVyVmFsaWRhdGVkID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIC8vIFRPRE86IHZlcmlmeSB0aGVyZSBpcyB0YXJnZXQgY29ubmVjdGlvbiBJZAorICAgIG1TdGF0cy5vbkJ1ZmZlclNlbnQoKTsKKyAgICBtVHJhbnNhY3Rpb25zLmluc2VydChzdGQ6Om1ha2VfcGFpcigKKyAgICAgICAgICAgIG1lc3NhZ2UudHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8VHJhbnNhY3Rpb25TdGF0dXM+KG1lc3NhZ2UsIG1UaW1lc3RhbXBVcykpKTsKKyAgICBpbnNlcnQoJm1QZW5kaW5nVHJhbnNhY3Rpb25zLCBtZXNzYWdlLnRhcmdldENvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgbWVzc2FnZS50cmFuc2FjdGlvbklkKTsKKyAgICBidWZmZXJJdGVyLT5zZWNvbmQtPm1UcmFuc2FjdGlvbkNvdW50Kys7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQWNjZXNzb3I6OkltcGw6OkJ1ZmZlclBvb2w6OmhhbmRsZVRyYW5zZmVyRnJvbShjb25zdCBCdWZmZXJTdGF0dXNNZXNzYWdlICZtZXNzYWdlKSB7CisgICAgYXV0byBmb3VuZCA9IG1UcmFuc2FjdGlvbnMuZmluZChtZXNzYWdlLnRyYW5zYWN0aW9uSWQpOworICAgIGlmIChmb3VuZCA9PSBtVHJhbnNhY3Rpb25zLmVuZCgpKSB7CisgICAgICAgIC8vIFRPRE86IGlzIGl0IGZlYXNpYmxlIHRvIGNoZWNrIG93bmVyc2hpcCBoZXJlPworICAgICAgICBtU3RhdHMub25CdWZmZXJTZW50KCk7CisgICAgICAgIG1UcmFuc2FjdGlvbnMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKAorICAgICAgICAgICAgICAgIG1lc3NhZ2UudHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPFRyYW5zYWN0aW9uU3RhdHVzPihtZXNzYWdlLCBtVGltZXN0YW1wVXMpKSk7CisgICAgICAgIGluc2VydCgmbVBlbmRpbmdUcmFuc2FjdGlvbnMsIG1lc3NhZ2UuY29ubmVjdGlvbklkLAorICAgICAgICAgICAgICAgbWVzc2FnZS50cmFuc2FjdGlvbklkKTsKKyAgICAgICAgYXV0byBidWZmZXJJdGVyID0gbUJ1ZmZlcnMuZmluZChtZXNzYWdlLmJ1ZmZlcklkKTsKKyAgICAgICAgYnVmZmVySXRlci0+c2Vjb25kLT5tVHJhbnNhY3Rpb25Db3VudCsrOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChtZXNzYWdlLmNvbm5lY3Rpb25JZCA9PSBmb3VuZC0+c2Vjb25kLT5tUmVjZWl2ZXIpIHsKKyAgICAgICAgICAgIGZvdW5kLT5zZWNvbmQtPm1TdGF0dXMgPSBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX0ZST007CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQWNjZXNzb3I6OkltcGw6OkJ1ZmZlclBvb2w6OmhhbmRsZVRyYW5zZmVyUmVzdWx0KGNvbnN0IEJ1ZmZlclN0YXR1c01lc3NhZ2UgJm1lc3NhZ2UpIHsKKyAgICBhdXRvIGZvdW5kID0gbVRyYW5zYWN0aW9ucy5maW5kKG1lc3NhZ2UudHJhbnNhY3Rpb25JZCk7CisgICAgaWYgKGZvdW5kICE9IG1UcmFuc2FjdGlvbnMuZW5kKCkpIHsKKyAgICAgICAgYm9vbCBkZWxldGVkID0gZXJhc2UoJm1QZW5kaW5nVHJhbnNhY3Rpb25zLCBtZXNzYWdlLmNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS50cmFuc2FjdGlvbklkKTsKKyAgICAgICAgaWYgKGRlbGV0ZWQpIHsKKyAgICAgICAgICAgIGlmICghZm91bmQtPnNlY29uZC0+bVNlbmRlclZhbGlkYXRlZCkgeworICAgICAgICAgICAgICAgIG1Db21wbGV0ZWRUcmFuc2FjdGlvbnMuaW5zZXJ0KG1lc3NhZ2UudHJhbnNhY3Rpb25JZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdXRvIGJ1ZmZlckl0ZXIgPSBtQnVmZmVycy5maW5kKG1lc3NhZ2UuYnVmZmVySWQpOworICAgICAgICAgICAgaWYgKG1lc3NhZ2UubmV3U3RhdHVzID09IEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfT0spIHsKKyAgICAgICAgICAgICAgICBoYW5kbGVPd25CdWZmZXIobWVzc2FnZS5jb25uZWN0aW9uSWQsIG1lc3NhZ2UuYnVmZmVySWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnVmZmVySXRlci0+c2Vjb25kLT5tVHJhbnNhY3Rpb25Db3VudC0tOworICAgICAgICAgICAgaWYgKGJ1ZmZlckl0ZXItPnNlY29uZC0+bU93bmVyQ291bnQgPT0gMAorICAgICAgICAgICAgICAgICYmIGJ1ZmZlckl0ZXItPnNlY29uZC0+bVRyYW5zYWN0aW9uQ291bnQgPT0gMCkgeworICAgICAgICAgICAgICAgIG1TdGF0cy5vbkJ1ZmZlclVudXNlZChidWZmZXJJdGVyLT5zZWNvbmQtPm1BbGxvY1NpemUpOworICAgICAgICAgICAgICAgIG1GcmVlQnVmZmVycy5pbnNlcnQobWVzc2FnZS5idWZmZXJJZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtVHJhbnNhY3Rpb25zLmVyYXNlKGZvdW5kKTsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigidHJhbnNmZXIgZmluaXNoZWQgJWxsdSAldSAtICVkIiwgKHVuc2lnbmVkIGxvbmcgbG9uZyltZXNzYWdlLnRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgICAgIG1lc3NhZ2UuYnVmZmVySWQsIGRlbGV0ZWQpOworICAgICAgICByZXR1cm4gZGVsZXRlZDsKKyAgICB9CisgICAgQUxPR1YoInRyYW5zZmVyIG5vdCBmb3VuZCAlbGx1ICV1IiwgKHVuc2lnbmVkIGxvbmcgbG9uZyltZXNzYWdlLnRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgbWVzc2FnZS5idWZmZXJJZCk7CisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIEFjY2Vzc29yOjpJbXBsOjpCdWZmZXJQb29sOjpwcm9jZXNzU3RhdHVzTWVzc2FnZXMoKSB7CisgICAgc3RkOjp2ZWN0b3I8QnVmZmVyU3RhdHVzTWVzc2FnZT4gbWVzc2FnZXM7CisgICAgbU9ic2VydmVyLmdldEJ1ZmZlclN0YXR1c0NoYW5nZXMobWVzc2FnZXMpOworICAgIG1UaW1lc3RhbXBVcyA9IGdldFRpbWVzdGFtcE5vdygpOworICAgIGZvciAoQnVmZmVyU3RhdHVzTWVzc2FnZSYgbWVzc2FnZTogbWVzc2FnZXMpIHsKKyAgICAgICAgYm9vbCByZXQgPSBmYWxzZTsKKyAgICAgICAgc3dpdGNoIChtZXNzYWdlLm5ld1N0YXR1cykgeworICAgICAgICAgICAgY2FzZSBCdWZmZXJTdGF0dXM6Ok5PVF9VU0VEOgorICAgICAgICAgICAgICAgIHJldCA9IGhhbmRsZVJlbGVhc2VCdWZmZXIoCisgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmNvbm5lY3Rpb25JZCwgbWVzc2FnZS5idWZmZXJJZCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJ1ZmZlclN0YXR1czo6VVNFRDoKKyAgICAgICAgICAgICAgICAvLyBub3QgaGFwcGVuaW5nCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfVE86CisgICAgICAgICAgICAgICAgcmV0ID0gaGFuZGxlVHJhbnNmZXJUbyhtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9GUk9NOgorICAgICAgICAgICAgICAgIHJldCA9IGhhbmRsZVRyYW5zZmVyRnJvbShtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9USU1FT1VUOgorICAgICAgICAgICAgICAgIC8vIFRPRE8KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9MT1NUOgorICAgICAgICAgICAgICAgIC8vIFRPRE8KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9GRVRDSDoKKyAgICAgICAgICAgICAgICAvLyBub3QgaGFwcGVuaW5nCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfT0s6CisgICAgICAgICAgICBjYXNlIEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfRVJST1I6CisgICAgICAgICAgICAgICAgcmV0ID0gaGFuZGxlVHJhbnNmZXJSZXN1bHQobWVzc2FnZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJldCA9PSBmYWxzZSkgeworICAgICAgICAgICAgQUxPR1coImJ1ZmZlciBzdGF0dXMgbWVzc2FnZSBwcm9jZXNzaW5nIGZhaWx1cmUgLSBtZXNzYWdlIDogJWQgY29ubmVjdGlvbiA6ICVsbGQiLAorICAgICAgICAgICAgICAgICAgbWVzc2FnZS5uZXdTdGF0dXMsIChsb25nIGxvbmcpbWVzc2FnZS5jb25uZWN0aW9uSWQpOworICAgICAgICB9CisgICAgfQorICAgIG1lc3NhZ2VzLmNsZWFyKCk7Cit9CisKK2Jvb2wgQWNjZXNzb3I6OkltcGw6OkJ1ZmZlclBvb2w6OmhhbmRsZUNsb3NlKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQpIHsKKyAgICAvLyBDbGVhbmluZyBidWZmZXJzCisgICAgYXV0byBidWZmZXJzID0gbVVzaW5nQnVmZmVycy5maW5kKGNvbm5lY3Rpb25JZCk7CisgICAgaWYgKGJ1ZmZlcnMgIT0gbVVzaW5nQnVmZmVycy5lbmQoKSkgeworICAgICAgICBmb3IgKGNvbnN0IEJ1ZmZlcklkJiBidWZmZXJJZCA6IGJ1ZmZlcnMtPnNlY29uZCkgeworICAgICAgICAgICAgYm9vbCBkZWxldGVkID0gZXJhc2UoJm1Vc2luZ0Nvbm5lY3Rpb25zLCBidWZmZXJJZCwgY29ubmVjdGlvbklkKTsKKyAgICAgICAgICAgIGlmIChkZWxldGVkKSB7CisgICAgICAgICAgICAgICAgYXV0byBidWZmZXJJdGVyID0gbUJ1ZmZlcnMuZmluZChidWZmZXJJZCk7CisgICAgICAgICAgICAgICAgYnVmZmVySXRlci0+c2Vjb25kLT5tT3duZXJDb3VudC0tOworICAgICAgICAgICAgICAgIGlmIChidWZmZXJJdGVyLT5zZWNvbmQtPm1Pd25lckNvdW50ID09IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlckl0ZXItPnNlY29uZC0+bVRyYW5zYWN0aW9uQ291bnQgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBoYW5kbGUgZnJlZWJ1ZmZlciBpbnNlcnQgZmFpbAorICAgICAgICAgICAgICAgICAgICBtU3RhdHMub25CdWZmZXJVbnVzZWQoYnVmZmVySXRlci0+c2Vjb25kLT5tQWxsb2NTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgbUZyZWVCdWZmZXJzLmluc2VydChidWZmZXJJZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1Vc2luZ0J1ZmZlcnMuZXJhc2UoYnVmZmVycyk7CisgICAgfQorCisgICAgLy8gQ2xlYW5pbmcgdHJhbnNhY3Rpb25zCisgICAgYXV0byBwZW5kaW5nID0gbVBlbmRpbmdUcmFuc2FjdGlvbnMuZmluZChjb25uZWN0aW9uSWQpOworICAgIGlmIChwZW5kaW5nICE9IG1QZW5kaW5nVHJhbnNhY3Rpb25zLmVuZCgpKSB7CisgICAgICAgIGZvciAoY29uc3QgVHJhbnNhY3Rpb25JZCYgdHJhbnNhY3Rpb25JZCA6IHBlbmRpbmctPnNlY29uZCkgeworICAgICAgICAgICAgYXV0byBpdGVyID0gbVRyYW5zYWN0aW9ucy5maW5kKHRyYW5zYWN0aW9uSWQpOworICAgICAgICAgICAgaWYgKGl0ZXIgIT0gbVRyYW5zYWN0aW9ucy5lbmQoKSkgeworICAgICAgICAgICAgICAgIGlmICghaXRlci0+c2Vjb25kLT5tU2VuZGVyVmFsaWRhdGVkKSB7CisgICAgICAgICAgICAgICAgICAgIG1Db21wbGV0ZWRUcmFuc2FjdGlvbnMuaW5zZXJ0KHRyYW5zYWN0aW9uSWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCA9IGl0ZXItPnNlY29uZC0+bUJ1ZmZlcklkOworICAgICAgICAgICAgICAgIGF1dG8gYnVmZmVySXRlciA9IG1CdWZmZXJzLmZpbmQoYnVmZmVySWQpOworICAgICAgICAgICAgICAgIGJ1ZmZlckl0ZXItPnNlY29uZC0+bVRyYW5zYWN0aW9uQ291bnQtLTsKKyAgICAgICAgICAgICAgICBpZiAoYnVmZmVySXRlci0+c2Vjb25kLT5tT3duZXJDb3VudCA9PSAwICYmCisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlckl0ZXItPnNlY29uZC0+bVRyYW5zYWN0aW9uQ291bnQgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBoYW5kbGUgZnJlZWJ1ZmZlciBpbnNlcnQgZmFpbAorICAgICAgICAgICAgICAgICAgICBtU3RhdHMub25CdWZmZXJVbnVzZWQoYnVmZmVySXRlci0+c2Vjb25kLT5tQWxsb2NTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgbUZyZWVCdWZmZXJzLmluc2VydChidWZmZXJJZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1UcmFuc2FjdGlvbnMuZXJhc2UoaXRlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQWNjZXNzb3I6OkltcGw6OkJ1ZmZlclBvb2w6OmdldEZyZWVCdWZmZXIoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdG9yPiAmYWxsb2NhdG9yLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLCBCdWZmZXJJZCAqcElkLAorICAgICAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QqKiBoYW5kbGUpIHsKKyAgICBhdXRvIGJ1ZmZlckl0ID0gbUZyZWVCdWZmZXJzLmJlZ2luKCk7CisgICAgZm9yICg7YnVmZmVySXQgIT0gbUZyZWVCdWZmZXJzLmVuZCgpOyArK2J1ZmZlckl0KSB7CisgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkID0gKmJ1ZmZlckl0OworICAgICAgICBpZiAoYWxsb2NhdG9yLT5jb21wYXRpYmxlKHBhcmFtcywgbUJ1ZmZlcnNbYnVmZmVySWRdLT5tQ29uZmlnKSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGJ1ZmZlckl0ICE9IG1GcmVlQnVmZmVycy5lbmQoKSkgeworICAgICAgICBCdWZmZXJJZCBpZCA9ICpidWZmZXJJdDsKKyAgICAgICAgbUZyZWVCdWZmZXJzLmVyYXNlKGJ1ZmZlckl0KTsKKyAgICAgICAgbVN0YXRzLm9uQnVmZmVyUmVjeWNsZWQobUJ1ZmZlcnNbaWRdLT5tQWxsb2NTaXplKTsKKyAgICAgICAgKmhhbmRsZSA9IG1CdWZmZXJzW2lkXS0+aGFuZGxlKCk7CisgICAgICAgICpwSWQgPSBpZDsKKyAgICAgICAgQUxPR1YoInJlY3ljbGUgYSBidWZmZXIgJXUgJXAiLCBpZCwgKmhhbmRsZSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK1Jlc3VsdFN0YXR1cyBBY2Nlc3Nvcjo6SW1wbDo6QnVmZmVyUG9vbDo6YWRkTmV3QnVmZmVyKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRpb24+ICZhbGxvYywKKyAgICAgICAgY29uc3Qgc2l6ZV90IGFsbG9jU2l6ZSwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywKKyAgICAgICAgQnVmZmVySWQgKnBJZCwKKyAgICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90KiogaGFuZGxlKSB7CisKKyAgICBCdWZmZXJJZCBidWZmZXJJZCA9IG1TZXErKzsKKyAgICBpZiAobVNlcSA9PSBDb25uZWN0aW9uOjpTWU5DX0JVRkZFUklEKSB7CisgICAgICAgIG1TZXEgPSAwOworICAgIH0KKyAgICBzdGQ6OnVuaXF1ZV9wdHI8SW50ZXJuYWxCdWZmZXI+IGJ1ZmZlciA9CisgICAgICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPEludGVybmFsQnVmZmVyPigKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVySWQsIGFsbG9jLCBhbGxvY1NpemUsIHBhcmFtcyk7CisgICAgaWYgKGJ1ZmZlcikgeworICAgICAgICBhdXRvIHJlcyA9IG1CdWZmZXJzLmluc2VydChzdGQ6Om1ha2VfcGFpcigKKyAgICAgICAgICAgICAgICBidWZmZXJJZCwgc3RkOjptb3ZlKGJ1ZmZlcikpKTsKKyAgICAgICAgaWYgKHJlcy5zZWNvbmQpIHsKKyAgICAgICAgICAgIG1TdGF0cy5vbkJ1ZmZlckFsbG9jYXRlZChhbGxvY1NpemUpOworICAgICAgICAgICAgKmhhbmRsZSA9IGFsbG9jLT5oYW5kbGUoKTsKKyAgICAgICAgICAgICpwSWQgPSBidWZmZXJJZDsKKyAgICAgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok9LOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok5PX01FTU9SWTsKK30KKwordm9pZCBBY2Nlc3Nvcjo6SW1wbDo6QnVmZmVyUG9vbDo6Y2xlYW5VcChib29sIGNsZWFyQ2FjaGUpIHsKKyAgICBpZiAoY2xlYXJDYWNoZSB8fCBtVGltZXN0YW1wVXMgPiBtTGFzdENsZWFuVXBVcyArIGtDbGVhblVwRHVyYXRpb25VcykgeworICAgICAgICBtTGFzdENsZWFuVXBVcyA9IG1UaW1lc3RhbXBVczsKKyAgICAgICAgaWYgKG1UaW1lc3RhbXBVcyA+IG1MYXN0TG9nVXMgKyBrTG9nRHVyYXRpb25VcykgeworICAgICAgICAgICAgbUxhc3RMb2dVcyA9IG1UaW1lc3RhbXBVczsKKyAgICAgICAgICAgIEFMT0dEKCJidWZmZXJwb29sICVwIDogJXp1KCV6dSBzaXplKSB0b3RhbCBidWZmZXJzIC0gIgorICAgICAgICAgICAgICAgICAgIiV6dSglenUgc2l6ZSkgdXNlZCBidWZmZXJzIC0gJXp1LyV6dSAocmVjeWNsZS9hbGxvYykgLSAiCisgICAgICAgICAgICAgICAgICAiJXp1LyV6dSAoZmV0Y2gvdHJhbnNmZXIpIiwKKyAgICAgICAgICAgICAgICAgIHRoaXMsIG1TdGF0cy5tQnVmZmVyc0NhY2hlZCwgbVN0YXRzLm1TaXplQ2FjaGVkLAorICAgICAgICAgICAgICAgICAgbVN0YXRzLm1CdWZmZXJzSW5Vc2UsIG1TdGF0cy5tU2l6ZUluVXNlLAorICAgICAgICAgICAgICAgICAgbVN0YXRzLm1Ub3RhbFJlY3ljbGVzLCBtU3RhdHMubVRvdGFsQWxsb2NhdGlvbnMsCisgICAgICAgICAgICAgICAgICBtU3RhdHMubVRvdGFsRmV0Y2hlcywgbVN0YXRzLm1Ub3RhbFRyYW5zZmVycyk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChhdXRvIGZyZWVJdCA9IG1GcmVlQnVmZmVycy5iZWdpbigpOyBmcmVlSXQgIT0gbUZyZWVCdWZmZXJzLmVuZCgpOykgeworICAgICAgICAgICAgaWYgKCFjbGVhckNhY2hlICYmIG1TdGF0cy5tU2l6ZUNhY2hlZCA8IGtNaW5BbGxvY0J5dGVzRm9yRXZpY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgJiYgbUJ1ZmZlcnMuc2l6ZSgpIDwga01pbkJ1ZmZlckNvdW50Rm9yRXZpY3Rpb24pIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF1dG8gaXQgPSBtQnVmZmVycy5maW5kKCpmcmVlSXQpOworICAgICAgICAgICAgaWYgKGl0ICE9IG1CdWZmZXJzLmVuZCgpICYmCisgICAgICAgICAgICAgICAgICAgIGl0LT5zZWNvbmQtPm1Pd25lckNvdW50ID09IDAgJiYgaXQtPnNlY29uZC0+bVRyYW5zYWN0aW9uQ291bnQgPT0gMCkgeworICAgICAgICAgICAgICAgIG1TdGF0cy5vbkJ1ZmZlckV2aWN0ZWQoaXQtPnNlY29uZC0+bUFsbG9jU2l6ZSk7CisgICAgICAgICAgICAgICAgbUJ1ZmZlcnMuZXJhc2UoaXQpOworICAgICAgICAgICAgICAgIGZyZWVJdCA9IG1GcmVlQnVmZmVycy5lcmFzZShmcmVlSXQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICArK2ZyZWVJdDsKKyAgICAgICAgICAgICAgICBBTE9HVygiYnVmZmVycG9vbCBpbmNvbnNpc3RlbnQhIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbgorfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBidWZmZXJwb29sCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0FjY2Vzc29ySW1wbC5oIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvQWNjZXNzb3JJbXBsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA0ZGJmMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0FjY2Vzc29ySW1wbC5oCkBAIC0wLDAgKzEsMzAwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjFfMF9BQ0NFU1NPUklNUExfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjFfMF9BQ0NFU1NPUklNUExfSAorCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlICJBY2Nlc3Nvci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBidWZmZXJwb29sIHsKK25hbWVzcGFjZSBWMV8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKK3N0cnVjdCBJbnRlcm5hbEJ1ZmZlcjsKK3N0cnVjdCBUcmFuc2FjdGlvblN0YXR1czsKKworLyoqCisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiBhIGJ1ZmZlciBwb29sIGFjY2Vzc29yKG9yIGEgYnVmZmVyIHBvb2wgaW1wbGVtZW50YXRpb24uKSAqLworY2xhc3MgQWNjZXNzb3I6OkltcGwgeworcHVibGljOgorICAgIEltcGwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0b3I+ICZhbGxvY2F0b3IpOworCisgICAgfkltcGwoKTsKKworICAgIFJlc3VsdFN0YXR1cyBjb25uZWN0KAorICAgICAgICAgICAgY29uc3Qgc3A8QWNjZXNzb3I+ICZhY2Nlc3Nvciwgc3A8Q29ubmVjdGlvbj4gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICBDb25uZWN0aW9uSWQgKnBDb25uZWN0aW9uSWQsIGNvbnN0IFF1ZXVlRGVzY3JpcHRvcioqIGZtcURlc2NQdHIpOworCisgICAgUmVzdWx0U3RhdHVzIGNsb3NlKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQpOworCisgICAgUmVzdWx0U3RhdHVzIGFsbG9jYXRlKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlcklkICpidWZmZXJJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90KiogaGFuZGxlKTsKKworICAgIFJlc3VsdFN0YXR1cyBmZXRjaChDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QqKiBoYW5kbGUpOworCisgICAgdm9pZCBjbGVhblVwKGJvb2wgY2xlYXJDYWNoZSk7CisKK3ByaXZhdGU6CisgICAgLy8gQ29ubmVjdGlvbklkID0gcGlkIDogKHRpbWVzdGFtcF9jcmVhdGVkICsgc2VxSWQpCisgICAgLy8gaW4gb3JkZXIgdG8gZ3VhcmFudGVlIHVuaXF1ZW5lc3MgZm9yIGVhY2ggY29ubmVjdGlvbgorICAgIHN0YXRpYyB1aW50MzJfdCBzU2VxSWQ7CisgICAgc3RhdGljIGludDMyX3Qgc1BpZDsKKworICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdG9yPiBtQWxsb2NhdG9yOworCisgICAgLyoqCisgICAgICogQnVmZmVyIHBvb2wgaW1wbGVtZW50YXRpb24uCisgICAgICoKKyAgICAgKiBIYW5kbGVzIGJ1ZmZlciBzdGF0dXMgbWVzc2FnZXMuIEhhbmRsZXMgYnVmZmVyIGFsbG9jYXRpb24vcmVjeWNsaW5nLgorICAgICAqIEhhbmRsZXMgYnVmZmVyIHRyYW5zZmVyIGJldHdlZW4gYnVmZmVyIHBvb2wgY2xpZW50cy4KKyAgICAgKi8KKyAgICBzdHJ1Y3QgQnVmZmVyUG9vbCB7CisgICAgcHJpdmF0ZToKKyAgICAgICAgc3RkOjptdXRleCBtTXV0ZXg7CisgICAgICAgIGludDY0X3QgbVRpbWVzdGFtcFVzOworICAgICAgICBpbnQ2NF90IG1MYXN0Q2xlYW5VcFVzOworICAgICAgICBpbnQ2NF90IG1MYXN0TG9nVXM7CisgICAgICAgIEJ1ZmZlcklkIG1TZXE7CisgICAgICAgIEJ1ZmZlclN0YXR1c09ic2VydmVyIG1PYnNlcnZlcjsKKworICAgICAgICBzdGQ6Om1hcDxDb25uZWN0aW9uSWQsIHN0ZDo6c2V0PEJ1ZmZlcklkPj4gbVVzaW5nQnVmZmVyczsKKyAgICAgICAgc3RkOjptYXA8QnVmZmVySWQsIHN0ZDo6c2V0PENvbm5lY3Rpb25JZD4+IG1Vc2luZ0Nvbm5lY3Rpb25zOworCisgICAgICAgIHN0ZDo6bWFwPENvbm5lY3Rpb25JZCwgc3RkOjpzZXQ8VHJhbnNhY3Rpb25JZD4+IG1QZW5kaW5nVHJhbnNhY3Rpb25zOworICAgICAgICAvLyBUcmFuc2FjdGlvbnMgY29tcGxldGVkIGJlZm9yZSBUUkFOU0ZFUl9UTyBtZXNzYWdlIGFycml2YWwuCisgICAgICAgIC8vIEZldGNoIGRvZXMgbm90IG9jY3VyIGZvciB0aGUgdHJhbnNhY3Rpb25zLgorICAgICAgICAvLyBPbmx5IHRyYW5zYWN0aW9uIGlkIGlzIGtlcHQgZm9yIHRoZSB0cmFuc2FjdGlvbnMgaW4gc2hvcnQgZHVyYXRpb24uCisgICAgICAgIHN0ZDo6c2V0PFRyYW5zYWN0aW9uSWQ+IG1Db21wbGV0ZWRUcmFuc2FjdGlvbnM7CisgICAgICAgIC8vIEN1cnJlbnRseSBhY3RpdmUocGVuZGluZykgdHJhbnNhdGlvbnMnIHN0YXR1cyAmIGluZm9ybWF0aW9uLgorICAgICAgICBzdGQ6Om1hcDxUcmFuc2FjdGlvbklkLCBzdGQ6OnVuaXF1ZV9wdHI8VHJhbnNhY3Rpb25TdGF0dXM+PgorICAgICAgICAgICAgICAgIG1UcmFuc2FjdGlvbnM7CisKKyAgICAgICAgc3RkOjptYXA8QnVmZmVySWQsIHN0ZDo6dW5pcXVlX3B0cjxJbnRlcm5hbEJ1ZmZlcj4+IG1CdWZmZXJzOworICAgICAgICBzdGQ6OnNldDxCdWZmZXJJZD4gbUZyZWVCdWZmZXJzOworCisgICAgICAgIC8vLyBCdWZmZXIgcG9vbCBzdGF0aXN0aWNzIHdoaWNoIHRyYWNrcyBhbGxvY2F0aW9uIGFuZCB0cmFuc2ZlciBzdGF0aXN0aWNzLgorICAgICAgICBzdHJ1Y3QgU3RhdHMgeworICAgICAgICAgICAgLy8vIFRvdGFsIHNpemUgb2YgYWxsb2NhdGlvbnMgd2hpY2ggYXJlIHVzZWQgb3IgYXZhaWxhYmxlIHRvIHVzZS4KKyAgICAgICAgICAgIC8vLyAoYnl0ZXMgb3IgcGl4ZWxzKQorICAgICAgICAgICAgc2l6ZV90IG1TaXplQ2FjaGVkOworICAgICAgICAgICAgLy8vICMgb2YgY2FjaGVkIGJ1ZmZlcnMgd2hpY2ggYXJlIHVzZWQgb3IgYXZhaWxhYmxlIHRvIHVzZS4KKyAgICAgICAgICAgIHNpemVfdCBtQnVmZmVyc0NhY2hlZDsKKyAgICAgICAgICAgIC8vLyBUb3RhbCBzaXplIG9mIGFsbG9jYXRpb25zIHdoaWNoIGFyZSBjdXJyZW50bHkgdXNlZC4gKGJ5dGVzIG9yIHBpeGVscykKKyAgICAgICAgICAgIHNpemVfdCBtU2l6ZUluVXNlOworICAgICAgICAgICAgLy8vICMgb2YgY3VycmVudGx5IHVzZWQgYnVmZmVycworICAgICAgICAgICAgc2l6ZV90IG1CdWZmZXJzSW5Vc2U7CisKKyAgICAgICAgICAgIC8vLyAjIG9mIGFsbG9jYXRpb25zIGNhbGxlZCBvbiBidWZmZXJwb29sLiAoIyBvZiBmZXRjaGVkIGZyb20gQmxvY2tQb29sKQorICAgICAgICAgICAgc2l6ZV90IG1Ub3RhbEFsbG9jYXRpb25zOworICAgICAgICAgICAgLy8vICMgb2YgYWxsb2NhdGlvbnMgdGhhdCB3ZXJlIHNlcnZlZCBmcm9tIHRoZSBjYWNoZS4KKyAgICAgICAgICAgIC8vLyAoIyBvZiBhbGxvY2F0b3IgYWxsb2MgcHJldmVudGVkKQorICAgICAgICAgICAgc2l6ZV90IG1Ub3RhbFJlY3ljbGVzOworICAgICAgICAgICAgLy8vICMgb2YgYnVmZmVyIHRyYW5zZmVycyBpbml0aWF0ZWQuCisgICAgICAgICAgICBzaXplX3QgbVRvdGFsVHJhbnNmZXJzOworICAgICAgICAgICAgLy8vICMgb2YgdHJhbnNmZXJzIHRoYXQgaGFkIHRvIGJlIGZldGNoZWQuCisgICAgICAgICAgICBzaXplX3QgbVRvdGFsRmV0Y2hlczsKKworICAgICAgICAgICAgU3RhdHMoKQorICAgICAgICAgICAgICAgIDogbVNpemVDYWNoZWQoMCksIG1CdWZmZXJzQ2FjaGVkKDApLCBtU2l6ZUluVXNlKDApLCBtQnVmZmVyc0luVXNlKDApLAorICAgICAgICAgICAgICAgICAgbVRvdGFsQWxsb2NhdGlvbnMoMCksIG1Ub3RhbFJlY3ljbGVzKDApLCBtVG90YWxUcmFuc2ZlcnMoMCksIG1Ub3RhbEZldGNoZXMoMCkge30KKworICAgICAgICAgICAgLy8vIEEgbmV3IGJ1ZmZlciBpcyBhbGxvY2F0ZWQgb24gYW4gYWxsb2NhdGlvbiByZXF1ZXN0LgorICAgICAgICAgICAgdm9pZCBvbkJ1ZmZlckFsbG9jYXRlZChzaXplX3QgYWxsb2NTaXplKSB7CisgICAgICAgICAgICAgICAgbVNpemVDYWNoZWQgKz0gYWxsb2NTaXplOworICAgICAgICAgICAgICAgIG1CdWZmZXJzQ2FjaGVkKys7CisKKyAgICAgICAgICAgICAgICBtU2l6ZUluVXNlICs9IGFsbG9jU2l6ZTsKKyAgICAgICAgICAgICAgICBtQnVmZmVyc0luVXNlKys7CisKKyAgICAgICAgICAgICAgICBtVG90YWxBbGxvY2F0aW9ucysrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLy8gQSBidWZmZXIgaXMgZXZpY3RlZCBhbmQgZGVzdHJveWVkLgorICAgICAgICAgICAgdm9pZCBvbkJ1ZmZlckV2aWN0ZWQoc2l6ZV90IGFsbG9jU2l6ZSkgeworICAgICAgICAgICAgICAgIG1TaXplQ2FjaGVkIC09IGFsbG9jU2l6ZTsKKyAgICAgICAgICAgICAgICBtQnVmZmVyc0NhY2hlZC0tOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLy8gQSBidWZmZXIgaXMgcmVjeWNsZWQgb24gYW4gYWxsb2NhdGlvbiByZXF1ZXN0LgorICAgICAgICAgICAgdm9pZCBvbkJ1ZmZlclJlY3ljbGVkKHNpemVfdCBhbGxvY1NpemUpIHsKKyAgICAgICAgICAgICAgICBtU2l6ZUluVXNlICs9IGFsbG9jU2l6ZTsKKyAgICAgICAgICAgICAgICBtQnVmZmVyc0luVXNlKys7CisKKyAgICAgICAgICAgICAgICBtVG90YWxBbGxvY2F0aW9ucysrOworICAgICAgICAgICAgICAgIG1Ub3RhbFJlY3ljbGVzKys7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vLyBBIGJ1ZmZlciBpcyBhdmFpbGFibGUgdG8gYmUgcmVjeWNsZWQuCisgICAgICAgICAgICB2b2lkIG9uQnVmZmVyVW51c2VkKHNpemVfdCBhbGxvY1NpemUpIHsKKyAgICAgICAgICAgICAgICBtU2l6ZUluVXNlIC09IGFsbG9jU2l6ZTsKKyAgICAgICAgICAgICAgICBtQnVmZmVyc0luVXNlLS07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vLyBBIGJ1ZmZlciB0cmFuc2ZlciBpcyBpbml0aWF0ZWQuCisgICAgICAgICAgICB2b2lkIG9uQnVmZmVyU2VudCgpIHsKKyAgICAgICAgICAgICAgICBtVG90YWxUcmFuc2ZlcnMrKzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8vIEEgYnVmZmVyIGZldGNoIGlzIGludm9rZWQgYnkgYSBidWZmZXIgdHJhbnNmZXIuCisgICAgICAgICAgICB2b2lkIG9uQnVmZmVyRmV0Y2hlZCgpIHsKKyAgICAgICAgICAgICAgICBtVG90YWxGZXRjaGVzKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0gbVN0YXRzOworCisgICAgcHVibGljOgorICAgICAgICAvKiogQ3JlYXRlcyBhIGJ1ZmZlciBwb29sLiAqLworICAgICAgICBCdWZmZXJQb29sKCk7CisKKyAgICAgICAgLyoqIERlc3Ryb3lzIGEgYnVmZmVyIHBvb2wuICovCisgICAgICAgIH5CdWZmZXJQb29sKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFByb2Nlc3NlcyBhbGwgcGVuZGluZyBidWZmZXIgc3RhdHVzIG1lc3NhZ2VzLCBhbmQgcmV0dXJucyB0aGUgcmVzdWx0LgorICAgICAgICAgKiBFYWNoIHN0YXR1cyBtZXNzYWdlIGlzIGhhbmRsZWQgYnkgbWV0aG9kcyB3aXRoICdoYW5kbGUnIHByZWZpeC4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgcHJvY2Vzc1N0YXR1c01lc3NhZ2VzKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEhhbmRsZXMgYSBidWZmZXIgYmVpbmcgb3duZWQgYnkgYSBjb25uZWN0aW9uLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gY29ubmVjdGlvbklkICB0aGUgaWQgb2YgdGhlIGJ1ZmZlciBvd25pbmcgY29ubmVjdGlvbi4KKyAgICAgICAgICogQHBhcmFtIGJ1ZmZlcklkICAgICAgdGhlIGlkIG9mIHRoZSBidWZmZXIuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IHdoZW4gdGhlIGJ1ZmZlciBpcyBvd25lZCwKKyAgICAgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgICAgICovCisgICAgICAgIGJvb2wgaGFuZGxlT3duQnVmZmVyKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsIEJ1ZmZlcklkIGJ1ZmZlcklkKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogSGFuZGxlcyBhIGJ1ZmZlciBiZWluZyByZWxlYXNlZCBieSBhIGNvbm5lY3Rpb24uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBjb25uZWN0aW9uSWQgIHRoZSBpZCBvZiB0aGUgYnVmZmVyIG93bmluZyBjb25uZWN0aW9uLgorICAgICAgICAgKiBAcGFyYW0gYnVmZmVySWQgICAgICB0aGUgaWQgb2YgdGhlIGJ1ZmZlci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gd2hlbiB0aGUgYnVmZmVyIG93bmVyc2hpcCBpcyByZWxlYXNlZCwKKyAgICAgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgICAgICovCisgICAgICAgIGJvb2wgaGFuZGxlUmVsZWFzZUJ1ZmZlcihDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLCBCdWZmZXJJZCBidWZmZXJJZCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEhhbmRsZXMgYSB0cmFuc2ZlciB0cmFuc2FjdGlvbiBzdGFydCBtZXNzYWdlIGZyb20gdGhlIHNlbmRlci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG1lc3NhZ2UgICBhIGJ1ZmZlciBzdGF0dXMgbWVzc2FnZSBmb3IgdGhlIHRyYW5zYWN0aW9uLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmVzdWx0IHtAY29kZSB0cnVlfSB3aGVuIHRyYW5zZmVyX3RvIG1lc3NhZ2UgaXMgYWNrbm93bGVkZ2VkLAorICAgICAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAgICAgKi8KKyAgICAgICAgYm9vbCBoYW5kbGVUcmFuc2ZlclRvKGNvbnN0IEJ1ZmZlclN0YXR1c01lc3NhZ2UgJm1lc3NhZ2UpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBIYW5kbGVzIGEgdHJhbnNmZXIgdHJhbnNhY3Rpb24gYmVpbmcgYWNrZWQgYnkgdGhlIHJlY2VpdmVyLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbWVzc2FnZSAgIGEgYnVmZmVyIHN0YXR1cyBtZXNzYWdlIGZvciB0aGUgdHJhbnNhY3Rpb24uCisgICAgICAgICAqCisgICAgICAgICAqIEByZXN1bHQge0Bjb2RlIHRydWV9IHdoZW4gdHJhbnNmZXJfZnJvbSBtZXNzYWdlIGlzIGFja25vd2xlZGdlZCwKKyAgICAgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgICAgICovCisgICAgICAgIGJvb2wgaGFuZGxlVHJhbnNmZXJGcm9tKGNvbnN0IEJ1ZmZlclN0YXR1c01lc3NhZ2UgJm1lc3NhZ2UpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBIYW5kbGVzIGEgdHJhbnNmZXIgdHJhbnNhY3Rpb24gcmVzdWx0IG1lc3NhZ2UgZnJvbSB0aGUgcmVjZWl2ZXIuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBtZXNzYWdlICAgYSBidWZmZXIgc3RhdHVzIG1lc3NhZ2UgZm9yIHRoZSB0cmFuc2FjdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJlc3VsdCB7QGNvZGUgdHJ1ZX0gd2hlbiB0aGUgZXhpc2l0bmcgdHJhbnNhY3Rpb24gaXMgZmluaXNoZWQsCisgICAgICAgICAqICAgICAgICAge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICAgICAqLworICAgICAgICBib29sIGhhbmRsZVRyYW5zZmVyUmVzdWx0KGNvbnN0IEJ1ZmZlclN0YXR1c01lc3NhZ2UgJm1lc3NhZ2UpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBIYW5kbGVzIGEgY29ubmVjdGlvbiBiZWluZyBjbG9zZWQsIGFuZCByZXR1cm5zIHRoZSByZXN1bHQuIEFsbCB0aGUKKyAgICAgICAgICogYnVmZmVycyBhbmQgdHJhbnNhY3Rpb25zIG93bmVkIGJ5IHRoZSBjb25uZWN0aW9uIHdpbGwgYmUgY2xlYW5lZCB1cC4KKyAgICAgICAgICogVGhlIHJlbGF0ZWQgRk1RIHdpbGwgYmUgY2xlYW5lZCB1cCB0b28uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBjb25uZWN0aW9uSWQgIHRoZSBpZCBvZiB0aGUgY29ubmVjdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJlc3VsdCB7QGNvZGUgdHJ1ZX0gd2hlbiB0aGUgY29ubmVjdGlvbiBleGlzdGVkLAorICAgICAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAgICAgKi8KKyAgICAgICAgYm9vbCBoYW5kbGVDbG9zZShDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmVjeWNsZXMgYSBleGlzdGluZyBmcmVlIGJ1ZmZlciBpZiBpdCBpcyBwb3NzaWJsZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGFsbG9jYXRvciB0aGUgYnVmZmVyIGFsbG9jYXRvcgorICAgICAgICAgKiBAcGFyYW0gcGFyYW1zICAgIHRoZSBhbGxvY2F0aW9uIHBhcmFtZXRlcnMuCisgICAgICAgICAqIEBwYXJhbSBwSWQgICAgICAgdGhlIGlkIG9mIHRoZSByZWN5Y2xlZCBidWZmZXIuCisgICAgICAgICAqIEBwYXJhbSBoYW5kbGUgICAgdGhlIG5hdGl2ZSBoYW5kbGUgb2YgdGhlIHJlY3ljbGVkIGJ1ZmZlci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gd2hlbiBhIGJ1ZmZlciBpcyByZWN5Y2xlZCwge0Bjb2RlIGZhbHNlfQorICAgICAgICAgKiAgICAgICAgIG90aGVyd2lzZS4KKyAgICAgICAgICovCisgICAgICAgIGJvb2wgZ2V0RnJlZUJ1ZmZlcigKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRvcj4gJmFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgICAgICAgICAgICAgIEJ1ZmZlcklkICpwSWQsIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFkZHMgYSBuZXdseSBhbGxvY2F0ZWQgYnVmZmVyIHRvIGJ1ZmZlcnBvb2wuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBhbGxvYyAgICAgdGhlIG5ld2x5IGFsbG9jYXRlZCBidWZmZXIuCisgICAgICAgICAqIEBwYXJhbSBhbGxvY1NpemUgdGhlIHNpemUgb2YgdGhlIG5ld2x5IGFsbG9jYXRlZCBidWZmZXIuCisgICAgICAgICAqIEBwYXJhbSBwYXJhbXMgICAgdGhlIGFsbG9jYXRpb24gcGFyYW1ldGVycy4KKyAgICAgICAgICogQHBhcmFtIHBJZCAgICAgICB0aGUgYnVmZmVyIGlkIGZvciB0aGUgbmV3bHkgYWxsb2NhdGVkIGJ1ZmZlci4KKyAgICAgICAgICogQHBhcmFtIGhhbmRsZSAgICB0aGUgbmF0aXZlIGhhbmRsZSBmb3IgdGhlIG5ld2x5IGFsbG9jYXRlZCBidWZmZXIuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gT0sgd2hlbiBhbiBhbGxvY2F0aW9uIGlzIHN1Y2Nlc3NmdWxseSBhbGxvY2F0ZWQuCisgICAgICAgICAqICAgICAgICAgTk9fTUVNT1JZIHdoZW4gdGhlcmUgaXMgbm8gbWVtb3J5LgorICAgICAgICAgKiAgICAgICAgIENSSVRJQ0FMX0VSUk9SIG90aGVyd2lzZS4KKyAgICAgICAgICovCisgICAgICAgIFJlc3VsdFN0YXR1cyBhZGROZXdCdWZmZXIoCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0aW9uPiAmYWxsb2MsCisgICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90IGFsbG9jU2l6ZSwKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgICAgICAgICAgICAgIEJ1ZmZlcklkICpwSWQsCisgICAgICAgICAgICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogUHJvY2Vzc2VzIHBlbmRpbmcgYnVmZmVyIHN0YXR1cyBtZXNzYWdlcyBhbmQgcGVyZm9ybXMgcGVyaW9kaWMgY2FjaGUKKyAgICAgICAgICogY2xlYW5pbmcuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBjbGVhckNhY2hlICAgIGlmIGNsZWFyQ2FjaGUgaXMgdHJ1ZSwgaXQgZnJlZXMgYWxsIGJ1ZmZlcnMKKyAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgd2FpdGluZyB0byBiZSByZWN5Y2xlZC4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgY2xlYW5VcChib29sIGNsZWFyQ2FjaGUgPSBmYWxzZSk7CisKKyAgICAgICAgZnJpZW5kIGNsYXNzIEFjY2Vzc29yOjpJbXBsOworICAgIH0gbUJ1ZmZlclBvb2w7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24KK30gIC8vIG5hbWVzcGFjZSBWMV8wCit9ICAvLyBuYW1lc3BhY2UgdWZmZXJwb29sCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjFfMF9BQ0NFU1NPUklNUExfSApkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8xLjAvQW5kcm9pZC5icCBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdlYTcwZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwyOSBAQAorY2NfbGlicmFyeSB7CisgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X2J1ZmZlcnBvb2xAMS4wIiwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorICAgIHNyY3M6IFsKKyAgICAgICAgIkFjY2Vzc29yLmNwcCIsCisgICAgICAgICJBY2Nlc3NvckltcGwuY3BwIiwKKyAgICAgICAgIkJ1ZmZlclBvb2xDbGllbnQuY3BwIiwKKyAgICAgICAgIkJ1ZmZlclN0YXR1cy5jcHAiLAorICAgICAgICAiQ2xpZW50TWFuYWdlci5jcHAiLAorICAgICAgICAiQ29ubmVjdGlvbi5jcHAiLAorICAgIF0sCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW5jbHVkZSIsCisgICAgXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmZtcSIsCisgICAgICAgICJsaWJoaWRsYmFzZSIsCisgICAgICAgICJsaWJod2JpbmRlciIsCisgICAgICAgICJsaWJoaWRsdHJhbnNwb3J0IiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmJ1ZmZlcnBvb2xAMS4wIiwKKyAgICBdLAorICAgIGV4cG9ydF9zaGFyZWRfbGliX2hlYWRlcnM6IFsKKyAgICAgICAgImxpYmZtcSIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmJ1ZmZlcnBvb2xAMS4wIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8xLjAvQnVmZmVyUG9vbENsaWVudC5jcHAgYi9tZWRpYS9idWZmZXJwb29sLzEuMC9CdWZmZXJQb29sQ2xpZW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTUyMGNhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvQnVmZmVyUG9vbENsaWVudC5jcHAKQEAgLTAsMCArMSw3MDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkJ1ZmZlclBvb2xDbGllbnQiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDx0aHJlYWQ+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSAiQnVmZmVyUG9vbENsaWVudC5oIgorI2luY2x1ZGUgIkNvbm5lY3Rpb24uaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYnVmZmVycG9vbCB7CituYW1lc3BhY2UgVjFfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCitzdGF0aWMgY29uc3RleHByIGludDY0X3Qga1JlY2VpdmVUaW1lb3V0VXMgPSAxMDAwMDAwOyAvLyAxMDBtcworc3RhdGljIGNvbnN0ZXhwciBpbnQga1Bvc3RNYXhSZXRyeSA9IDM7CitzdGF0aWMgY29uc3RleHByIGludCBrQ2FjaGVUdGxVcyA9IDEwMDAwMDA7IC8vIFRPRE86IHR1bmUKKworY2xhc3MgQnVmZmVyUG9vbENsaWVudDo6SW1wbAorICAgICAgICA6IHB1YmxpYyBzdGQ6OmVuYWJsZV9zaGFyZWRfZnJvbV90aGlzPEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw+IHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBJbXBsKGNvbnN0IHNwPEFjY2Vzc29yPiAmYWNjZXNzb3IpOworCisgICAgZXhwbGljaXQgSW1wbChjb25zdCBzcDxJQWNjZXNzb3I+ICZhY2Nlc3Nvcik7CisKKyAgICBib29sIGlzVmFsaWQoKSB7CisgICAgICAgIHJldHVybiBtVmFsaWQ7CisgICAgfQorCisgICAgYm9vbCBpc0xvY2FsKCkgeworICAgICAgICByZXR1cm4gbVZhbGlkICYmIG1Mb2NhbDsKKyAgICB9CisKKyAgICBDb25uZWN0aW9uSWQgZ2V0Q29ubmVjdGlvbklkKCkgeworICAgICAgICByZXR1cm4gbUNvbm5lY3Rpb25JZDsKKyAgICB9CisKKyAgICBzcDxJQWNjZXNzb3I+ICZnZXRBY2Nlc3NvcigpIHsKKyAgICAgICAgcmV0dXJuIG1BY2Nlc3NvcjsKKyAgICB9CisKKyAgICBib29sIGlzQWN0aXZlKGludDY0X3QgKmxhc3RUcmFuc2FjdGlvblVzLCBib29sIGNsZWFyQ2FjaGUpOworCisgICAgUmVzdWx0U3RhdHVzIGFsbG9jYXRlKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAqYnVmZmVyKTsKKworICAgIFJlc3VsdFN0YXR1cyByZWNlaXZlKAorICAgICAgICAgICAgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLCBCdWZmZXJJZCBidWZmZXJJZCwKKyAgICAgICAgICAgIGludDY0X3QgdGltZXN0YW1wVXMsCisgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUsIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlcik7CisKKyAgICB2b2lkIHBvc3RCdWZmZXJSZWxlYXNlKEJ1ZmZlcklkIGJ1ZmZlcklkKTsKKworICAgIGJvb2wgcG9zdFNlbmQoCisgICAgICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCwgQ29ubmVjdGlvbklkIHJlY2VpdmVyLAorICAgICAgICAgICAgVHJhbnNhY3Rpb25JZCAqdHJhbnNhY3Rpb25JZCwgaW50NjRfdCAqdGltZXN0YW1wVXMpOworcHJpdmF0ZToKKworICAgIGJvb2wgcG9zdFJlY2VpdmUoCisgICAgICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCwgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLAorICAgICAgICAgICAgaW50NjRfdCB0aW1lc3RhbXBVcyk7CisKKyAgICBib29sIHBvc3RSZWNlaXZlUmVzdWx0KAorICAgICAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwgYm9vbCByZXN1bHQsIGJvb2wgKm5lZWRzU3luYyk7CisKKyAgICB2b2lkIHRyeVN5bmNGcm9tUmVtb3RlKCk7CisKKyAgICBib29sIHN5bmNSZWxlYXNlZCgpOworCisgICAgdm9pZCBldmljdENhY2hlcyhib29sIGNsZWFyQ2FjaGUgPSBmYWxzZSk7CisKKyAgICBSZXN1bHRTdGF0dXMgYWxsb2NhdGVCdWZmZXJIYW5kbGUoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgcGFyYW1zLCBCdWZmZXJJZCAqYnVmZmVySWQsCisgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUpOworCisgICAgUmVzdWx0U3RhdHVzIGZldGNoQnVmZmVySGFuZGxlKAorICAgICAgICAgICAgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLCBCdWZmZXJJZCBidWZmZXJJZCwKKyAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSk7CisKKyAgICBzdHJ1Y3QgQmxvY2tQb29sRGF0YUR0b3I7CisgICAgc3RydWN0IENsaWVudEJ1ZmZlcjsKKworICAgIGJvb2wgbUxvY2FsOworICAgIGJvb2wgbVZhbGlkOworICAgIHNwPElBY2Nlc3Nvcj4gbUFjY2Vzc29yOworICAgIHNwPENvbm5lY3Rpb24+IG1Mb2NhbENvbm5lY3Rpb247CisgICAgc3A8SUNvbm5lY3Rpb24+IG1SZW1vdGVDb25uZWN0aW9uOworICAgIHVpbnQzMl90IG1TZXFJZDsKKyAgICBDb25uZWN0aW9uSWQgbUNvbm5lY3Rpb25JZDsKKyAgICBpbnQ2NF90IG1MYXN0RXZpY3RDYWNoZVVzOworCisgICAgLy8gQ2FjaGVkQnVmZmVycworICAgIHN0cnVjdCBCdWZmZXJDYWNoZSB7CisgICAgICAgIHN0ZDo6bXV0ZXggbUxvY2s7CisgICAgICAgIGJvb2wgbUNyZWF0aW5nOworICAgICAgICBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSBtQ3JlYXRlQ3Y7CisgICAgICAgIHN0ZDo6bWFwPEJ1ZmZlcklkLCBzdGQ6OnVuaXF1ZV9wdHI8Q2xpZW50QnVmZmVyPj4gbUJ1ZmZlcnM7CisgICAgICAgIGludCBtQWN0aXZlOworICAgICAgICBpbnQ2NF90IG1MYXN0Q2hhbmdlVXM7CisKKyAgICAgICAgQnVmZmVyQ2FjaGUoKSA6IG1DcmVhdGluZyhmYWxzZSksIG1BY3RpdmUoMCksIG1MYXN0Q2hhbmdlVXMoZ2V0VGltZXN0YW1wTm93KCkpIHt9CisKKyAgICAgICAgdm9pZCBpbmNBY3RpdmVfbCgpIHsKKyAgICAgICAgICAgICsrbUFjdGl2ZTsKKyAgICAgICAgICAgIG1MYXN0Q2hhbmdlVXMgPSBnZXRUaW1lc3RhbXBOb3coKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgZGVjQWN0aXZlX2woKSB7CisgICAgICAgICAgICAtLW1BY3RpdmU7CisgICAgICAgICAgICBtTGFzdENoYW5nZVVzID0gZ2V0VGltZXN0YW1wTm93KCk7CisgICAgICAgIH0KKyAgICB9IG1DYWNoZTsKKworICAgIC8vIEZNUSAtIHJlbGVhc2Ugbm90aWZpZXIKKyAgICBzdHJ1Y3QgeworICAgICAgICBzdGQ6Om11dGV4IG1Mb2NrOworICAgICAgICAvLyBUT0RPOiB1c2Ugb25seSBvbmUgbGlzdD8odXNpbmcgb25lIGxpc3QgbWF5IGRlYWx5IHNlbmRpbmcgbWVzc2FnZXM/KQorICAgICAgICBzdGQ6Omxpc3Q8QnVmZmVySWQ+IG1SZWxlYXNpbmdJZHM7CisgICAgICAgIHN0ZDo6bGlzdDxCdWZmZXJJZD4gbVJlbGVhc2VkSWRzOworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QnVmZmVyU3RhdHVzQ2hhbm5lbD4gbVN0YXR1c0NoYW5uZWw7CisgICAgfSBtUmVsZWFzaW5nOworCisgICAgLy8gVGhpcyBsb2NrIGlzIGhlbGQgZHVyaW5nIHN5bmNocm9uaXphdGlvbiBmcm9tIHJlbW90ZSBzaWRlLgorICAgIC8vIEluIG9yZGVyIHRvIG1pbmltaXplIHJlbW90ZSBjYWxscyBhbmQgbG9ja2luZyBkdXJ0YWlvbiwgdGhpcyBsb2NrIGlzIGhlbGQKKyAgICAvLyBieSBiZXN0IGVmZm9ydCBhcHByb2FjaCB1c2luZyB0cnlfbG9jaygpLgorICAgIHN0ZDo6bXV0ZXggbVJlbW90ZVN5bmNMb2NrOworfTsKKworc3RydWN0IEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw6OkJsb2NrUG9vbERhdGFEdG9yIHsKKyAgICBCbG9ja1Bvb2xEYXRhRHRvcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbENsaWVudDo6SW1wbD4gJmltcGwpCisgICAgICAgICAgICA6IG1JbXBsKGltcGwpIHt9CisKKyAgICB2b2lkIG9wZXJhdG9yKCkoQnVmZmVyUG9vbERhdGEgKmJ1ZmZlcikgeworICAgICAgICBCdWZmZXJJZCBpZCA9IGJ1ZmZlci0+bUlkOworICAgICAgICBkZWxldGUgYnVmZmVyOworCisgICAgICAgIGF1dG8gaW1wbCA9IG1JbXBsLmxvY2soKTsKKyAgICAgICAgaWYgKGltcGwgJiYgaW1wbC0+aXNWYWxpZCgpKSB7CisgICAgICAgICAgICBpbXBsLT5wb3N0QnVmZmVyUmVsZWFzZShpZCk7CisgICAgICAgIH0KKyAgICB9CisgICAgY29uc3Qgc3RkOjp3ZWFrX3B0cjxCdWZmZXJQb29sQ2xpZW50OjpJbXBsPiBtSW1wbDsKK307CisKK3N0cnVjdCBCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjpDbGllbnRCdWZmZXIgeworcHJpdmF0ZToKKyAgICBib29sIG1JbnZhbGlkYXRlZDsgLy8gVE9ETzogaW1wbGVtZW50CisgICAgaW50NjRfdCBtRXhwaXJlVXM7CisgICAgYm9vbCBtSGFzQ2FjaGU7CisgICAgQ29ubmVjdGlvbklkIG1Db25uZWN0aW9uSWQ7CisgICAgQnVmZmVySWQgbUlkOworICAgIG5hdGl2ZV9oYW5kbGVfdCAqbUhhbmRsZTsKKyAgICBzdGQ6OndlYWtfcHRyPEJ1ZmZlclBvb2xEYXRhPiBtQ2FjaGU7CisKKyAgICB2b2lkIHVwZGF0ZUV4cGlyZSgpIHsKKyAgICAgICAgbUV4cGlyZVVzID0gZ2V0VGltZXN0YW1wTm93KCkgKyBrQ2FjaGVUdGxVczsKKyAgICB9CisKK3B1YmxpYzoKKyAgICBDbGllbnRCdWZmZXIoCisgICAgICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLCBCdWZmZXJJZCBpZCwgbmF0aXZlX2hhbmRsZV90ICpoYW5kbGUpCisgICAgICAgICAgICA6IG1JbnZhbGlkYXRlZChmYWxzZSksIG1IYXNDYWNoZShmYWxzZSksCisgICAgICAgICAgICAgIG1Db25uZWN0aW9uSWQoY29ubmVjdGlvbklkKSwgbUlkKGlkKSwgbUhhbmRsZShoYW5kbGUpIHsKKyAgICAgICAgKHZvaWQpbUludmFsaWRhdGVkOworICAgICAgICBtRXhwaXJlVXMgPSBnZXRUaW1lc3RhbXBOb3coKSArIGtDYWNoZVR0bFVzOworICAgIH0KKworICAgIH5DbGllbnRCdWZmZXIoKSB7CisgICAgICAgIGlmIChtSGFuZGxlKSB7CisgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX2Nsb3NlKG1IYW5kbGUpOworICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUobUhhbmRsZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBib29sIGV4cGlyZSgpIGNvbnN0IHsKKyAgICAgICAgaW50NjRfdCBub3cgPSBnZXRUaW1lc3RhbXBOb3coKTsKKyAgICAgICAgcmV0dXJuIG5vdyA+PSBtRXhwaXJlVXM7CisgICAgfQorCisgICAgYm9vbCBoYXNDYWNoZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1IYXNDYWNoZTsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+IGZldGNoQ2FjaGUobmF0aXZlX2hhbmRsZV90ICoqcEhhbmRsZSkgeworICAgICAgICBpZiAobUhhc0NhY2hlKSB7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+IGNhY2hlID0gbUNhY2hlLmxvY2soKTsKKyAgICAgICAgICAgIGlmIChjYWNoZSkgeworICAgICAgICAgICAgICAgICpwSGFuZGxlID0gbUhhbmRsZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBjYWNoZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+IGNyZWF0ZUNhY2hlKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw+ICZpbXBsLAorICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqcEhhbmRsZSkgeworICAgICAgICBpZiAoIW1IYXNDYWNoZSkgeworICAgICAgICAgICAgLy8gQWxsb2NhdGVzIGEgcmF3IHB0ciBpbiBvcmRlciB0byBhdm9pZCBzZW5kaW5nICNwb3N0QnVmZmVyUmVsZWFzZQorICAgICAgICAgICAgLy8gZnJvbSBkZWxldGVyLCBpbiBjYXNlIG9mIG5hdGl2ZV9oYW5kbGVfY2xvbmUgZmFpbHVyZS4KKyAgICAgICAgICAgIEJ1ZmZlclBvb2xEYXRhICpwdHIgPSBuZXcgQnVmZmVyUG9vbERhdGEobUNvbm5lY3Rpb25JZCwgbUlkKTsKKyAgICAgICAgICAgIGlmIChwdHIpIHsKKyAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+IGNhY2hlKHB0ciwgQmxvY2tQb29sRGF0YUR0b3IoaW1wbCkpOworICAgICAgICAgICAgICAgIGlmIChjYWNoZSkgeworICAgICAgICAgICAgICAgICAgICBtQ2FjaGUgPSBjYWNoZTsKKyAgICAgICAgICAgICAgICAgICAgbUhhc0NhY2hlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgKnBIYW5kbGUgPSBtSGFuZGxlOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FjaGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHB0cikgeworICAgICAgICAgICAgICAgIGRlbGV0ZSBwdHI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgICAgYm9vbCBvbkNhY2hlUmVsZWFzZSgpIHsKKyAgICAgICAgaWYgKG1IYXNDYWNoZSkgeworICAgICAgICAgICAgLy8gVE9ETzogdmVyaWZ5IG1DYWNoZSBpcyBub3QgdmFsaWQ7CisgICAgICAgICAgICB1cGRhdGVFeHBpcmUoKTsKKyAgICAgICAgICAgIG1IYXNDYWNoZSA9IGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK307CisKK0J1ZmZlclBvb2xDbGllbnQ6OkltcGw6OkltcGwoY29uc3Qgc3A8QWNjZXNzb3I+ICZhY2Nlc3NvcikKKyAgICA6IG1Mb2NhbCh0cnVlKSwgbVZhbGlkKGZhbHNlKSwgbUFjY2Vzc29yKGFjY2Vzc29yKSwgbVNlcUlkKDApLAorICAgICAgbUxhc3RFdmljdENhY2hlVXMoZ2V0VGltZXN0YW1wTm93KCkpIHsKKyAgICBjb25zdCBRdWV1ZURlc2NyaXB0b3IgKmZtcURlc2M7CisgICAgUmVzdWx0U3RhdHVzIHN0YXR1cyA9IGFjY2Vzc29yLT5jb25uZWN0KAorICAgICAgICAgICAgJm1Mb2NhbENvbm5lY3Rpb24sICZtQ29ubmVjdGlvbklkLCAmZm1xRGVzYywgdHJ1ZSk7CisgICAgaWYgKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgIG1SZWxlYXNpbmcubVN0YXR1c0NoYW5uZWwgPQorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8QnVmZmVyU3RhdHVzQ2hhbm5lbD4oKmZtcURlc2MpOworICAgICAgICBtVmFsaWQgPSBtUmVsZWFzaW5nLm1TdGF0dXNDaGFubmVsICYmCisgICAgICAgICAgICAgICAgbVJlbGVhc2luZy5tU3RhdHVzQ2hhbm5lbC0+aXNWYWxpZCgpOworICAgIH0KK30KKworQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6SW1wbChjb25zdCBzcDxJQWNjZXNzb3I+ICZhY2Nlc3NvcikKKyAgICA6IG1Mb2NhbChmYWxzZSksIG1WYWxpZChmYWxzZSksIG1BY2Nlc3NvcihhY2Nlc3NvciksIG1TZXFJZCgwKSwKKyAgICAgIG1MYXN0RXZpY3RDYWNoZVVzKGdldFRpbWVzdGFtcE5vdygpKSB7CisgICAgYm9vbCB2YWxpZCA9IGZhbHNlOworICAgIHNwPElDb25uZWN0aW9uPiYgb3V0Q29ubmVjdGlvbiA9IG1SZW1vdGVDb25uZWN0aW9uOworICAgIENvbm5lY3Rpb25JZCYgaWQgPSBtQ29ubmVjdGlvbklkOworICAgIHN0ZDo6dW5pcXVlX3B0cjxCdWZmZXJTdGF0dXNDaGFubmVsPiYgb3V0Q2hhbm5lbCA9CisgICAgICAgICAgICBtUmVsZWFzaW5nLm1TdGF0dXNDaGFubmVsOworICAgIFJldHVybjx2b2lkPiB0cmFuc1Jlc3VsdCA9IGFjY2Vzc29yLT5jb25uZWN0KAorICAgICAgICAgICAgWyZ2YWxpZCwgJm91dENvbm5lY3Rpb24sICZpZCwgJm91dENoYW5uZWxdCisgICAgICAgICAgICAoUmVzdWx0U3RhdHVzIHN0YXR1cywgc3A8SUNvbm5lY3Rpb24+IGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwgY29uc3QgUXVldWVEZXNjcmlwdG9yJiBkZXNjKSB7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgIG91dENvbm5lY3Rpb24gPSBjb25uZWN0aW9uOworICAgICAgICAgICAgICAgICAgICBpZCA9IGNvbm5lY3Rpb25JZDsKKyAgICAgICAgICAgICAgICAgICAgb3V0Q2hhbm5lbCA9IHN0ZDo6bWFrZV91bmlxdWU8QnVmZmVyU3RhdHVzQ2hhbm5lbD4oZGVzYyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChvdXRDaGFubmVsICYmIG91dENoYW5uZWwtPmlzVmFsaWQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgbVZhbGlkID0gdHJhbnNSZXN1bHQuaXNPaygpICYmIHZhbGlkOworfQorCitib29sIEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw6OmlzQWN0aXZlKGludDY0X3QgKmxhc3RUcmFuc2FjdGlvblVzLCBib29sIGNsZWFyQ2FjaGUpIHsKKyAgICBib29sIGFjdGl2ZSA9IGZhbHNlOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUNhY2hlLm1Mb2NrKTsKKyAgICAgICAgc3luY1JlbGVhc2VkKCk7CisgICAgICAgIGV2aWN0Q2FjaGVzKGNsZWFyQ2FjaGUpOworICAgICAgICAqbGFzdFRyYW5zYWN0aW9uVXMgPSBtQ2FjaGUubUxhc3RDaGFuZ2VVczsKKyAgICAgICAgYWN0aXZlID0gbUNhY2hlLm1BY3RpdmUgPiAwOworICAgIH0KKyAgICBpZiAobVZhbGlkICYmIG1Mb2NhbCAmJiBtTG9jYWxDb25uZWN0aW9uKSB7CisgICAgICAgIG1Mb2NhbENvbm5lY3Rpb24tPmNsZWFuVXAoY2xlYXJDYWNoZSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gYWN0aXZlOworfQorCitSZXN1bHRTdGF0dXMgQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6YWxsb2NhdGUoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZwYXJhbXMsCisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKnBIYW5kbGUsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlcikgeworICAgIGlmICghbUxvY2FsIHx8ICFtTG9jYWxDb25uZWN0aW9uIHx8ICFtVmFsaWQpIHsKKyAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7CisgICAgfQorICAgIEJ1ZmZlcklkIGJ1ZmZlcklkOworICAgIG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlID0gbnVsbHB0cjsKKyAgICBidWZmZXItPnJlc2V0KCk7CisgICAgUmVzdWx0U3RhdHVzIHN0YXR1cyA9IGFsbG9jYXRlQnVmZmVySGFuZGxlKHBhcmFtcywgJmJ1ZmZlcklkLCAmaGFuZGxlKTsKKyAgICBpZiAoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spIHsKKyAgICAgICAgaWYgKGhhbmRsZSkgeworICAgICAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG1DYWNoZS5tTG9jayk7CisgICAgICAgICAgICBzeW5jUmVsZWFzZWQoKTsKKyAgICAgICAgICAgIGV2aWN0Q2FjaGVzKCk7CisgICAgICAgICAgICBhdXRvIGNhY2hlSXQgPSBtQ2FjaGUubUJ1ZmZlcnMuZmluZChidWZmZXJJZCk7CisgICAgICAgICAgICBpZiAoY2FjaGVJdCAhPSBtQ2FjaGUubUJ1ZmZlcnMuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiB2ZXJpZnkgaXQgaXMgcmVjeWNsZWQuIChub3QgaGF2aW5nIGFjdGl2ZSByZWYpCisgICAgICAgICAgICAgICAgbUNhY2hlLm1CdWZmZXJzLmVyYXNlKGNhY2hlSXQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXV0byBjbGllbnRCdWZmZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPENsaWVudEJ1ZmZlcj4oCisgICAgICAgICAgICAgICAgICAgIG1Db25uZWN0aW9uSWQsIGJ1ZmZlcklkLCBoYW5kbGUpOworICAgICAgICAgICAgaWYgKGNsaWVudEJ1ZmZlcikgeworICAgICAgICAgICAgICAgIGF1dG8gcmVzdWx0ID0gbUNhY2hlLm1CdWZmZXJzLmluc2VydChzdGQ6Om1ha2VfcGFpcigKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcklkLCBzdGQ6Om1vdmUoY2xpZW50QnVmZmVyKSkpOworICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuc2Vjb25kKSB7CisgICAgICAgICAgICAgICAgICAgICpidWZmZXIgPSByZXN1bHQuZmlyc3QtPnNlY29uZC0+Y3JlYXRlQ2FjaGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX2Zyb21fdGhpcygpLCBwSGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCpidWZmZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1DYWNoZS5pbmNBY3RpdmVfbCgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghKmJ1ZmZlcikgeworICAgICAgICAgICAgQUxPR1YoImNsaWVudCBjYWNoZSBjcmVhdGlvbiBmYWlsdXJlICVkOiAlbGxkIiwKKyAgICAgICAgICAgICAgICAgIGhhbmRsZSAhPSBudWxscHRyLCAobG9uZyBsb25nKW1Db25uZWN0aW9uSWQpOworICAgICAgICAgICAgc3RhdHVzID0gUmVzdWx0U3RhdHVzOjpOT19NRU1PUlk7CisgICAgICAgICAgICBwb3N0QnVmZmVyUmVsZWFzZShidWZmZXJJZCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworUmVzdWx0U3RhdHVzIEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw6OnJlY2VpdmUoCisgICAgICAgIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwgQnVmZmVySWQgYnVmZmVySWQsIGludDY0X3QgdGltZXN0YW1wVXMsCisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKnBIYW5kbGUsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlcikgeworICAgIGlmICghbVZhbGlkKSB7CisgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworICAgIH0KKyAgICBpZiAodGltZXN0YW1wVXMgIT0gMCkgeworICAgICAgICB0aW1lc3RhbXBVcyArPSBrUmVjZWl2ZVRpbWVvdXRVczsKKyAgICB9CisgICAgaWYgKCFwb3N0UmVjZWl2ZShidWZmZXJJZCwgdHJhbnNhY3Rpb25JZCwgdGltZXN0YW1wVXMpKSB7CisgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworICAgIH0KKyAgICBSZXN1bHRTdGF0dXMgc3RhdHVzID0gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKKyAgICBidWZmZXItPnJlc2V0KCk7CisgICAgd2hpbGUoMSkgeworICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sobUNhY2hlLm1Mb2NrKTsKKyAgICAgICAgc3luY1JlbGVhc2VkKCk7CisgICAgICAgIGV2aWN0Q2FjaGVzKCk7CisgICAgICAgIGF1dG8gY2FjaGVJdCA9IG1DYWNoZS5tQnVmZmVycy5maW5kKGJ1ZmZlcklkKTsKKyAgICAgICAgaWYgKGNhY2hlSXQgIT0gbUNhY2hlLm1CdWZmZXJzLmVuZCgpKSB7CisgICAgICAgICAgICBpZiAoY2FjaGVJdC0+c2Vjb25kLT5oYXNDYWNoZSgpKSB7CisgICAgICAgICAgICAgICAgKmJ1ZmZlciA9IGNhY2hlSXQtPnNlY29uZC0+ZmV0Y2hDYWNoZShwSGFuZGxlKTsKKyAgICAgICAgICAgICAgICBpZiAoISpidWZmZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgdHJhbnNmZXIgdGltZV9vdXQKKyAgICAgICAgICAgICAgICAgICAgbG9jay51bmxvY2soKTsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjp0aGlzX3RocmVhZDo6eWllbGQoKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEFMT0dWKCJjbGllbnQgcmVjZWl2ZSBmcm9tIHJlZmVyZW5jZSAlbGxkIiwgKGxvbmcgbG9uZyltQ29ubmVjdGlvbklkKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgKmJ1ZmZlciA9IGNhY2hlSXQtPnNlY29uZC0+Y3JlYXRlQ2FjaGUoc2hhcmVkX2Zyb21fdGhpcygpLCBwSGFuZGxlKTsKKyAgICAgICAgICAgICAgICBpZiAoKmJ1ZmZlcikgeworICAgICAgICAgICAgICAgICAgICBtQ2FjaGUuaW5jQWN0aXZlX2woKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQUxPR1YoImNsaWVudCByZWNlaXZlIGZyb20gY2FjaGUgJWxsZCIsIChsb25nIGxvbmcpbUNvbm5lY3Rpb25JZCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoIW1DYWNoZS5tQ3JlYXRpbmcpIHsKKyAgICAgICAgICAgICAgICBtQ2FjaGUubUNyZWF0aW5nID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBsb2NrLnVubG9jaygpOworICAgICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCogaGFuZGxlID0gbnVsbHB0cjsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBmZXRjaEJ1ZmZlckhhbmRsZSh0cmFuc2FjdGlvbklkLCBidWZmZXJJZCwgJmhhbmRsZSk7CisgICAgICAgICAgICAgICAgbG9jay5sb2NrKCk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChoYW5kbGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1dG8gY2xpZW50QnVmZmVyID0gc3RkOjptYWtlX3VuaXF1ZTxDbGllbnRCdWZmZXI+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29ubmVjdGlvbklkLCBidWZmZXJJZCwgaGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGllbnRCdWZmZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvIHJlc3VsdCA9IG1DYWNoZS5tQnVmZmVycy5pbnNlcnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihidWZmZXJJZCwgc3RkOjptb3ZlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRCdWZmZXIpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5zZWNvbmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ1ZmZlciA9IHJlc3VsdC5maXJzdC0+c2Vjb25kLT5jcmVhdGVDYWNoZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfZnJvbV90aGlzKCksIHBIYW5kbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKmJ1ZmZlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNhY2hlLmluY0FjdGl2ZV9sKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKCEqYnVmZmVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBSZXN1bHRTdGF0dXM6Ok5PX01FTU9SWTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtQ2FjaGUubUNyZWF0aW5nID0gZmFsc2U7CisgICAgICAgICAgICAgICAgbG9jay51bmxvY2soKTsKKyAgICAgICAgICAgICAgICBtQ2FjaGUubUNyZWF0ZUN2Lm5vdGlmeV9hbGwoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1DYWNoZS5tQ3JlYXRlQ3Yud2FpdChsb2NrKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBib29sIG5lZWRzU3luYyA9IGZhbHNlOworICAgIGJvb2wgcG9zdGVkID0gcG9zdFJlY2VpdmVSZXN1bHQoYnVmZmVySWQsIHRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpidWZmZXIgPyB0cnVlIDogZmFsc2UsICZuZWVkc1N5bmMpOworICAgIEFMT0dWKCJjbGllbnQgcmVjZWl2ZSAlbGxkIC0gJXUgOiAlcyAoJWQpIiwgKGxvbmcgbG9uZyltQ29ubmVjdGlvbklkLCBidWZmZXJJZCwKKyAgICAgICAgICAqYnVmZmVyID8gIm9rIiA6ICJmYWlsIiwgcG9zdGVkKTsKKyAgICBpZiAobVZhbGlkICYmIG1Mb2NhbCAmJiBtTG9jYWxDb25uZWN0aW9uKSB7CisgICAgICAgIG1Mb2NhbENvbm5lY3Rpb24tPmNsZWFuVXAoZmFsc2UpOworICAgIH0KKyAgICBpZiAobmVlZHNTeW5jICYmIG1SZW1vdGVDb25uZWN0aW9uKSB7CisgICAgICAgIHRyeVN5bmNGcm9tUmVtb3RlKCk7CisgICAgfQorICAgIGlmICgqYnVmZmVyKSB7CisgICAgICAgIGlmICghcG9zdGVkKSB7CisgICAgICAgICAgICBidWZmZXItPnJlc2V0KCk7CisgICAgICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpPSzsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworCit2b2lkIEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw6OnBvc3RCdWZmZXJSZWxlYXNlKEJ1ZmZlcklkIGJ1ZmZlcklkKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVJlbGVhc2luZy5tTG9jayk7CisgICAgbVJlbGVhc2luZy5tUmVsZWFzaW5nSWRzLnB1c2hfYmFjayhidWZmZXJJZCk7CisgICAgbVJlbGVhc2luZy5tU3RhdHVzQ2hhbm5lbC0+cG9zdEJ1ZmZlclJlbGVhc2UoCisgICAgICAgICAgICBtQ29ubmVjdGlvbklkLCBtUmVsZWFzaW5nLm1SZWxlYXNpbmdJZHMsIG1SZWxlYXNpbmcubVJlbGVhc2VkSWRzKTsKK30KKworLy8gVE9ETzogcmV2aXNlIGFkLWhvYyBwb3N0aW5nIGRhdGEgc3RydWN0dXJlCitib29sIEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw6OnBvc3RTZW5kKAorICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCwgQ29ubmVjdGlvbklkIHJlY2VpdmVyLAorICAgICAgICBUcmFuc2FjdGlvbklkICp0cmFuc2FjdGlvbklkLCBpbnQ2NF90ICp0aW1lc3RhbXBVcykgeworICAgIGJvb2wgcmV0ID0gZmFsc2U7CisgICAgYm9vbCBuZWVkc1N5bmMgPSBmYWxzZTsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1SZWxlYXNpbmcubUxvY2spOworICAgICAgICAqdGltZXN0YW1wVXMgPSBnZXRUaW1lc3RhbXBOb3coKTsKKyAgICAgICAgKnRyYW5zYWN0aW9uSWQgPSAobUNvbm5lY3Rpb25JZCA8PCAzMikgfCBtU2VxSWQrKzsKKyAgICAgICAgLy8gVE9ETzogcmV0cnksIGFkZCB0aW1lb3V0LCB0YXJnZXQ/CisgICAgICAgIHJldCA9ICBtUmVsZWFzaW5nLm1TdGF0dXNDaGFubmVsLT5wb3N0QnVmZmVyU3RhdHVzTWVzc2FnZSgKKyAgICAgICAgICAgICAgICAqdHJhbnNhY3Rpb25JZCwgYnVmZmVySWQsIEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfVE8sIG1Db25uZWN0aW9uSWQsCisgICAgICAgICAgICAgICAgcmVjZWl2ZXIsIG1SZWxlYXNpbmcubVJlbGVhc2luZ0lkcywgbVJlbGVhc2luZy5tUmVsZWFzZWRJZHMpOworICAgICAgICBuZWVkc1N5bmMgPSAhbUxvY2FsICYmIG1SZWxlYXNpbmcubVN0YXR1c0NoYW5uZWwtPm5lZWRzU3luYygpOworICAgIH0KKyAgICBpZiAobVZhbGlkICYmIG1Mb2NhbCAmJiBtTG9jYWxDb25uZWN0aW9uKSB7CisgICAgICAgIG1Mb2NhbENvbm5lY3Rpb24tPmNsZWFuVXAoZmFsc2UpOworICAgIH0KKyAgICBpZiAobmVlZHNTeW5jICYmIG1SZW1vdGVDb25uZWN0aW9uKSB7CisgICAgICAgIHRyeVN5bmNGcm9tUmVtb3RlKCk7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK2Jvb2wgQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6cG9zdFJlY2VpdmUoCisgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkLCBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsIGludDY0X3QgdGltZXN0YW1wVXMpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGtQb3N0TWF4UmV0cnk7ICsraSkgeworICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sobVJlbGVhc2luZy5tTG9jayk7CisgICAgICAgIGludDY0X3Qgbm93ID0gZ2V0VGltZXN0YW1wTm93KCk7CisgICAgICAgIGlmICh0aW1lc3RhbXBVcyA9PSAwIHx8IG5vdyA8IHRpbWVzdGFtcFVzKSB7CisgICAgICAgICAgICBib29sIHJlc3VsdCA9IG1SZWxlYXNpbmcubVN0YXR1c0NoYW5uZWwtPnBvc3RCdWZmZXJTdGF0dXNNZXNzYWdlKAorICAgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbklkLCBidWZmZXJJZCwgQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9GUk9NLAorICAgICAgICAgICAgICAgICAgICBtQ29ubmVjdGlvbklkLCAtMSwgbVJlbGVhc2luZy5tUmVsZWFzaW5nSWRzLAorICAgICAgICAgICAgICAgICAgICBtUmVsZWFzaW5nLm1SZWxlYXNlZElkcyk7CisgICAgICAgICAgICBpZiAocmVzdWx0KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsb2NrLnVubG9jaygpOworICAgICAgICAgICAgc3RkOjp0aGlzX3RocmVhZDo6eWllbGQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1SZWxlYXNpbmcubVN0YXR1c0NoYW5uZWwtPnBvc3RCdWZmZXJTdGF0dXNNZXNzYWdlKAorICAgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbklkLCBidWZmZXJJZCwgQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9USU1FT1VULAorICAgICAgICAgICAgICAgICAgICBtQ29ubmVjdGlvbklkLCAtMSwgbVJlbGVhc2luZy5tUmVsZWFzaW5nSWRzLAorICAgICAgICAgICAgICAgICAgICBtUmVsZWFzaW5nLm1SZWxlYXNlZElkcyk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw6OnBvc3RSZWNlaXZlUmVzdWx0KAorICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCwgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLCBib29sIHJlc3VsdCwgYm9vbCAqbmVlZHNTeW5jKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVJlbGVhc2luZy5tTG9jayk7CisgICAgLy8gVE9ETzogcmV0cnksIGFkZCB0aW1lb3V0CisgICAgYm9vbCByZXQgPSBtUmVsZWFzaW5nLm1TdGF0dXNDaGFubmVsLT5wb3N0QnVmZmVyU3RhdHVzTWVzc2FnZSgKKyAgICAgICAgICAgIHRyYW5zYWN0aW9uSWQsIGJ1ZmZlcklkLAorICAgICAgICAgICAgcmVzdWx0ID8gQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9PSyA6IEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfRVJST1IsCisgICAgICAgICAgICBtQ29ubmVjdGlvbklkLCAtMSwgbVJlbGVhc2luZy5tUmVsZWFzaW5nSWRzLAorICAgICAgICAgICAgbVJlbGVhc2luZy5tUmVsZWFzZWRJZHMpOworICAgICpuZWVkc1N5bmMgPSAhbUxvY2FsICYmIG1SZWxlYXNpbmcubVN0YXR1c0NoYW5uZWwtPm5lZWRzU3luYygpOworICAgIHJldHVybiByZXQ7Cit9CisKK3ZvaWQgQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6dHJ5U3luY0Zyb21SZW1vdGUoKSB7CisgICAgaWYgKG1SZW1vdGVTeW5jTG9jay50cnlfbG9jaygpKSB7CisgICAgICAgIGJvb2wgbmVlZHNTeW5jID0gZmFsc2U7CisgICAgICAgIHsKKyAgICAgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1SZWxlYXNpbmcubUxvY2spOworICAgICAgICAgICAgbmVlZHNTeW5jID0gbVJlbGVhc2luZy5tU3RhdHVzQ2hhbm5lbC0+bmVlZHNTeW5jKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5lZWRzU3luYykgeworICAgICAgICAgICAgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkID0gKG1Db25uZWN0aW9uSWQgPDwgMzIpOworICAgICAgICAgICAgQnVmZmVySWQgYnVmZmVySWQgPSBDb25uZWN0aW9uOjpTWU5DX0JVRkZFUklEOworICAgICAgICAgICAgUmV0dXJuPHZvaWQ+IHRyYW5zUmVzdWx0ID0gbVJlbW90ZUNvbm5lY3Rpb24tPmZldGNoKAorICAgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbklkLCBidWZmZXJJZCwKKyAgICAgICAgICAgICAgICAgICAgW10KKyAgICAgICAgICAgICAgICAgICAgKFJlc3VsdFN0YXR1cyBvdXRTdGF0dXMsIEJ1ZmZlciBvdXRCdWZmZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKSBvdXRTdGF0dXM7CisgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCkgb3V0QnVmZmVyOworICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorICAgICAgICBtUmVtb3RlU3luY0xvY2sudW5sb2NrKCk7CisgICAgfQorfQorCisvLyBzaG91bGQgaGF2ZSBtQ2FjaGUubUxvY2sKK2Jvb2wgQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6c3luY1JlbGVhc2VkKCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1SZWxlYXNpbmcubUxvY2spOworICAgIGlmIChtUmVsZWFzaW5nLm1SZWxlYXNpbmdJZHMuc2l6ZSgpID4gMCkgeworICAgICAgICBtUmVsZWFzaW5nLm1TdGF0dXNDaGFubmVsLT5wb3N0QnVmZmVyUmVsZWFzZSgKKyAgICAgICAgICAgICAgICBtQ29ubmVjdGlvbklkLCBtUmVsZWFzaW5nLm1SZWxlYXNpbmdJZHMsCisgICAgICAgICAgICAgICAgbVJlbGVhc2luZy5tUmVsZWFzZWRJZHMpOworICAgIH0KKyAgICBpZiAobVJlbGVhc2luZy5tUmVsZWFzZWRJZHMuc2l6ZSgpID4gMCkgeworICAgICAgICBmb3IgKEJ1ZmZlcklkJiBpZDogbVJlbGVhc2luZy5tUmVsZWFzZWRJZHMpIHsKKyAgICAgICAgICAgIEFMT0dWKCJjbGllbnQgcmVsZWFzZSBidWZmZXIgJWxsZCAtICV1IiwgKGxvbmcgbG9uZyltQ29ubmVjdGlvbklkLCBpZCk7CisgICAgICAgICAgICBhdXRvIGZvdW5kID0gbUNhY2hlLm1CdWZmZXJzLmZpbmQoaWQpOworICAgICAgICAgICAgaWYgKGZvdW5kICE9IG1DYWNoZS5tQnVmZmVycy5lbmQoKSkgeworICAgICAgICAgICAgICAgIGlmIChmb3VuZC0+c2Vjb25kLT5vbkNhY2hlUmVsZWFzZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIG1DYWNoZS5kZWNBY3RpdmVfbCgpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHNob3VsZCBub3QgaGFwcGVuIQorICAgICAgICAgICAgICAgICAgICBBTE9HVygiY2xpZW50ICVsbGQgY2FjaGUgcmVsZWFzZSBzdGF0dXMgaW5jb25zaXRlbnQhIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyltQ29ubmVjdGlvbklkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIHNob3VsZCBub3QgaGFwcGVuIQorICAgICAgICAgICAgICAgIEFMT0dXKCJjbGllbnQgJWxsZCBjYWNoZSBzdGF0dXMgaW5jb25zaXRlbnQhIiwgKGxvbmcgbG9uZyltQ29ubmVjdGlvbklkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtUmVsZWFzaW5nLm1SZWxlYXNlZElkcy5jbGVhcigpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCisvLyBzaG91bGQgaGF2ZSBtQ2FjaGUubUxvY2sKK3ZvaWQgQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6ZXZpY3RDYWNoZXMoYm9vbCBjbGVhckNhY2hlKSB7CisgICAgaW50NjRfdCBub3cgPSBnZXRUaW1lc3RhbXBOb3coKTsKKyAgICBpZiAobm93ID49IG1MYXN0RXZpY3RDYWNoZVVzICsga0NhY2hlVHRsVXMgfHwgY2xlYXJDYWNoZSkgeworICAgICAgICBzaXplX3QgZXZpY3RlZCA9IDA7CisgICAgICAgIGZvciAoYXV0byBpdCA9IG1DYWNoZS5tQnVmZmVycy5iZWdpbigpOyBpdCAhPSBtQ2FjaGUubUJ1ZmZlcnMuZW5kKCk7KSB7CisgICAgICAgICAgICBpZiAoIWl0LT5zZWNvbmQtPmhhc0NhY2hlKCkgJiYgKGl0LT5zZWNvbmQtPmV4cGlyZSgpIHx8IGNsZWFyQ2FjaGUpKSB7CisgICAgICAgICAgICAgICAgaXQgPSBtQ2FjaGUubUJ1ZmZlcnMuZXJhc2UoaXQpOworICAgICAgICAgICAgICAgICsrZXZpY3RlZDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgKytpdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBBTE9HVigiY2FjaGUgY291bnQgJWxsZCA6IHRvdGFsICV6dSwgYWN0aXZlICVkLCBldmljdGVkICV6dSIsCisgICAgICAgICAgICAgIChsb25nIGxvbmcpbUNvbm5lY3Rpb25JZCwgbUNhY2hlLm1CdWZmZXJzLnNpemUoKSwgbUNhY2hlLm1BY3RpdmUsIGV2aWN0ZWQpOworICAgICAgICBtTGFzdEV2aWN0Q2FjaGVVcyA9IG5vdzsKKyAgICB9Cit9CisKK1Jlc3VsdFN0YXR1cyBCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjphbGxvY2F0ZUJ1ZmZlckhhbmRsZSgKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHBhcmFtcywgQnVmZmVySWQgKmJ1ZmZlcklkLAorICAgICAgICBuYXRpdmVfaGFuZGxlX3QqKiBoYW5kbGUpIHsKKyAgICBpZiAobUxvY2FsQ29ubmVjdGlvbikgeworICAgICAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QqIGFsbG9jSGFuZGxlID0gbnVsbHB0cjsKKyAgICAgICAgUmVzdWx0U3RhdHVzIHN0YXR1cyA9IG1Mb2NhbENvbm5lY3Rpb24tPmFsbG9jYXRlKAorICAgICAgICAgICAgICAgIHBhcmFtcywgYnVmZmVySWQsICZhbGxvY0hhbmRsZSk7CisgICAgICAgIGlmIChzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICAgICAgKmhhbmRsZSA9IG5hdGl2ZV9oYW5kbGVfY2xvbmUoYWxsb2NIYW5kbGUpOworICAgICAgICB9CisgICAgICAgIEFMT0dWKCJjbGllbnQgYWxsb2NhdGUgcmVzdWx0ICVsbGQgJWQgOiAldSBjbG9uZSAlcCIsCisgICAgICAgICAgICAgIChsb25nIGxvbmcpbUNvbm5lY3Rpb25JZCwgc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0ssCisgICAgICAgICAgICAgICpoYW5kbGUgPyAqYnVmZmVySWQgOiAwICwgKmhhbmRsZSk7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCitSZXN1bHRTdGF0dXMgQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6ZmV0Y2hCdWZmZXJIYW5kbGUoCisgICAgICAgIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwgQnVmZmVySWQgYnVmZmVySWQsCisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSkgeworICAgIHNwPElDb25uZWN0aW9uPiBjb25uZWN0aW9uOworICAgIGlmIChtTG9jYWwpIHsKKyAgICAgICAgY29ubmVjdGlvbiA9IG1Mb2NhbENvbm5lY3Rpb247CisgICAgfSBlbHNlIHsKKyAgICAgICAgY29ubmVjdGlvbiA9IG1SZW1vdGVDb25uZWN0aW9uOworICAgIH0KKyAgICBSZXN1bHRTdGF0dXMgc3RhdHVzOworICAgIFJldHVybjx2b2lkPiB0cmFuc1Jlc3VsdCA9IGNvbm5lY3Rpb24tPmZldGNoKAorICAgICAgICAgICAgdHJhbnNhY3Rpb25JZCwgYnVmZmVySWQsCisgICAgICAgICAgICBbJnN0YXR1cywgJmhhbmRsZV0KKyAgICAgICAgICAgIChSZXN1bHRTdGF0dXMgb3V0U3RhdHVzLCBCdWZmZXIgb3V0QnVmZmVyKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gb3V0U3RhdHVzOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgICAgICAqaGFuZGxlID0gbmF0aXZlX2hhbmRsZV9jbG9uZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRCdWZmZXIuYnVmZmVyLmdldE5hdGl2ZUhhbmRsZSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICByZXR1cm4gdHJhbnNSZXN1bHQuaXNPaygpID8gc3RhdHVzIDogUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworCitCdWZmZXJQb29sQ2xpZW50OjpCdWZmZXJQb29sQ2xpZW50KGNvbnN0IHNwPEFjY2Vzc29yPiAmYWNjZXNzb3IpIHsKKyAgICBtSW1wbCA9IHN0ZDo6bWFrZV9zaGFyZWQ8SW1wbD4oYWNjZXNzb3IpOworfQorCitCdWZmZXJQb29sQ2xpZW50OjpCdWZmZXJQb29sQ2xpZW50KGNvbnN0IHNwPElBY2Nlc3Nvcj4gJmFjY2Vzc29yKSB7CisgICAgbUltcGwgPSBzdGQ6Om1ha2Vfc2hhcmVkPEltcGw+KGFjY2Vzc29yKTsKK30KKworQnVmZmVyUG9vbENsaWVudDo6fkJ1ZmZlclBvb2xDbGllbnQoKSB7CisgICAgLy8gVE9ETzogaG93IHRvIGhhbmRsZSBvcnBoYW5lZCBidWZmZXJzPworfQorCitib29sIEJ1ZmZlclBvb2xDbGllbnQ6OmlzVmFsaWQoKSB7CisgICAgcmV0dXJuIG1JbXBsICYmIG1JbXBsLT5pc1ZhbGlkKCk7Cit9CisKK2Jvb2wgQnVmZmVyUG9vbENsaWVudDo6aXNMb2NhbCgpIHsKKyAgICByZXR1cm4gbUltcGwgJiYgbUltcGwtPmlzTG9jYWwoKTsKK30KKworYm9vbCBCdWZmZXJQb29sQ2xpZW50Ojppc0FjdGl2ZShpbnQ2NF90ICpsYXN0VHJhbnNhY3Rpb25VcywgYm9vbCBjbGVhckNhY2hlKSB7CisgICAgaWYgKCFpc1ZhbGlkKCkpIHsKKyAgICAgICAgKmxhc3RUcmFuc2FjdGlvblVzID0gMDsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gbUltcGwtPmlzQWN0aXZlKGxhc3RUcmFuc2FjdGlvblVzLCBjbGVhckNhY2hlKTsKK30KKworQ29ubmVjdGlvbklkIEJ1ZmZlclBvb2xDbGllbnQ6OmdldENvbm5lY3Rpb25JZCgpIHsKKyAgICBpZiAoaXNWYWxpZCgpKSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+Z2V0Q29ubmVjdGlvbklkKCk7CisgICAgfQorICAgIHJldHVybiAtMTsKK30KKworUmVzdWx0U3RhdHVzIEJ1ZmZlclBvb2xDbGllbnQ6OmdldEFjY2Vzc29yKHNwPElBY2Nlc3Nvcj4gKmFjY2Vzc29yKSB7CisgICAgaWYgKGlzVmFsaWQoKSkgeworICAgICAgICAqYWNjZXNzb3IgPSBtSW1wbC0+Z2V0QWNjZXNzb3IoKTsKKyAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6T0s7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCitSZXN1bHRTdGF0dXMgQnVmZmVyUG9vbENsaWVudDo6YWxsb2NhdGUoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZwYXJhbXMsCisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAqYnVmZmVyKSB7CisgICAgaWYgKGlzVmFsaWQoKSkgeworICAgICAgICByZXR1cm4gbUltcGwtPmFsbG9jYXRlKHBhcmFtcywgaGFuZGxlLCBidWZmZXIpOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworUmVzdWx0U3RhdHVzIEJ1ZmZlclBvb2xDbGllbnQ6OnJlY2VpdmUoCisgICAgICAgIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwgQnVmZmVySWQgYnVmZmVySWQsIGludDY0X3QgdGltZXN0YW1wVXMsCisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSwgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAqYnVmZmVyKSB7CisgICAgaWYgKGlzVmFsaWQoKSkgeworICAgICAgICByZXR1cm4gbUltcGwtPnJlY2VpdmUodHJhbnNhY3Rpb25JZCwgYnVmZmVySWQsIHRpbWVzdGFtcFVzLCBoYW5kbGUsIGJ1ZmZlcik7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCitSZXN1bHRTdGF0dXMgQnVmZmVyUG9vbENsaWVudDo6cG9zdFNlbmQoCisgICAgICAgIENvbm5lY3Rpb25JZCByZWNlaXZlcklkLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICZidWZmZXIsCisgICAgICAgIFRyYW5zYWN0aW9uSWQgKnRyYW5zYWN0aW9uSWQsCisgICAgICAgIGludDY0X3QgKnRpbWVzdGFtcFVzKSB7CisgICAgaWYgKGlzVmFsaWQoKSkgeworICAgICAgICBib29sIHJlc3VsdCA9IG1JbXBsLT5wb3N0U2VuZCgKKyAgICAgICAgICAgICAgICBidWZmZXItPm1JZCwgcmVjZWl2ZXJJZCwgdHJhbnNhY3Rpb25JZCwgdGltZXN0YW1wVXMpOworICAgICAgICByZXR1cm4gcmVzdWx0ID8gUmVzdWx0U3RhdHVzOjpPSyA6IFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCit9ICAvLyBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24KK30gIC8vIG5hbWVzcGFjZSBWMV8wCit9ICAvLyBuYW1lc3BhY2UgYnVmZmVycG9vbAorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzEuMC9CdWZmZXJQb29sQ2xpZW50LmggYi9tZWRpYS9idWZmZXJwb29sLzEuMC9CdWZmZXJQb29sQ2xpZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc3ZWZlZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0J1ZmZlclBvb2xDbGllbnQuaApAQCAtMCwwICsxLDEwMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YxXzBfQlVGRkVSUE9PTENMSUVOVF9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMV8wX0JVRkZFUlBPT0xDTElFTlRfSAorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYnVmZmVycG9vbC8xLjAvSUFjY2Vzc29yLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9idWZmZXJwb29sLzEuMC9JQ29ubmVjdGlvbi5oPgorI2luY2x1ZGUgPGJ1ZmZlcnBvb2wvQnVmZmVyUG9vbFR5cGVzLmg+CisjaW5jbHVkZSA8Y3V0aWxzL25hdGl2ZV9oYW5kbGUuaD4KKyNpbmNsdWRlICJBY2Nlc3Nvci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBidWZmZXJwb29sIHsKK25hbWVzcGFjZSBWMV8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMV8wOjpJQWNjZXNzb3I7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjFfMDo6SUNvbm5lY3Rpb247Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjFfMDo6UmVzdWx0U3RhdHVzOwordXNpbmcgOjphbmRyb2lkOjpzcDsKKworLyoqCisgKiBBIGJ1ZmZlciBwb29sIGNsaWVudCBmb3IgYSBidWZmZXIgcG9vbC4gRm9yIGEgc3BlY2lmaWMgYnVmZmVyIHBvb2wsIGF0IG1vc3QKKyAqIG9uZSBidWZmZXIgcG9vbCBjbGllbnQgZXhpc3RzIHBlciBwcm9jZXNzLiBUaGlzIGNsYXNzIHdpbGwgbm90IGJlIGV4cG9zZWQKKyAqIG91dHNpZGUuIEEgYnVmZmVyIHBvb2wgY2xpZW50IHdpbGwgYmUgdXNlZCB2aWEgQ2xpZW50TWFuYWdlci4KKyAqLworY2xhc3MgQnVmZmVyUG9vbENsaWVudCB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGJ1ZmZlciBwb29sIGNsaWVudCBmcm9tIGEgbG9jYWwgYnVmZmVyIHBvb2wKKyAgICAgKiAodmlhIENsaWVudE1hbmFnZXIjY3JlYXRlKS4KKyAgICAgKi8KKyAgICBleHBsaWNpdCBCdWZmZXJQb29sQ2xpZW50KGNvbnN0IHNwPEFjY2Vzc29yPiAmYWNjZXNzb3IpOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGJ1ZmZlciBwb29sIGNsaWVudCBmcm9tIGEgcmVtb3RlIGJ1ZmZlciBwb29sCisgICAgICogKHZpYSBDbGllbnRNYW5hZ2VyI3JlZ2lzdGVyU2VuZGVyKS4KKyAgICAgKiBOb3RlOiBBIGJ1ZmZlciBwb29sIGNsaWVudCBjcmVhdGVkIHdpdGggcmVtb3RlIGJ1ZmZlciBwb29sIGNhbm5vdAorICAgICAqIGFsbG9jYXRlIGEgYnVmZmVyLgorICAgICAqLworICAgIGV4cGxpY2l0IEJ1ZmZlclBvb2xDbGllbnQoY29uc3Qgc3A8SUFjY2Vzc29yPiAmYWNjZXNzb3IpOworCisgICAgLyoqIERlc3RydWN0cyBhIGJ1ZmZlciBwb29sIGNsaWVudC4gKi8KKyAgICB+QnVmZmVyUG9vbENsaWVudCgpOworCitwcml2YXRlOgorICAgIGJvb2wgaXNWYWxpZCgpOworCisgICAgYm9vbCBpc0xvY2FsKCk7CisKKyAgICBib29sIGlzQWN0aXZlKGludDY0X3QgKmxhc3RUcmFuc2FjdGlvblVzLCBib29sIGNsZWFyQ2FjaGUpOworCisgICAgQ29ubmVjdGlvbklkIGdldENvbm5lY3Rpb25JZCgpOworCisgICAgUmVzdWx0U3RhdHVzIGdldEFjY2Vzc29yKHNwPElBY2Nlc3Nvcj4gKmFjY2Vzc29yKTsKKworICAgIFJlc3VsdFN0YXR1cyBhbGxvY2F0ZShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlcik7CisKKyAgICBSZXN1bHRTdGF0dXMgcmVjZWl2ZShUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lc3RhbXBVcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAqYnVmZmVyKTsKKworICAgIFJlc3VsdFN0YXR1cyBwb3N0U2VuZChDb25uZWN0aW9uSWQgcmVjZWl2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gJmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNhY3Rpb25JZCAqdHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqdGltZXN0YW1wVXMpOworCisgICAgY2xhc3MgSW1wbDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gbUltcGw7CisKKyAgICBmcmllbmQgc3RydWN0IENsaWVudE1hbmFnZXI7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24KK30gIC8vIG5hbWVzcGFjZSBWMV8wCit9ICAvLyBuYW1lc3BhY2UgYnVmZmVycG9vbAorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YxXzBfQlVGRkVSUE9PTENMSUVOVF9ICmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzEuMC9CdWZmZXJTdGF0dXMuY3BwIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvQnVmZmVyU3RhdHVzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjlhYmNlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvQnVmZmVyU3RhdHVzLmNwcApAQCAtMCwwICsxLDE5MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQnVmZmVyUG9vbFN0YXR1cyIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlICJCdWZmZXJTdGF0dXMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYnVmZmVycG9vbCB7CituYW1lc3BhY2UgVjFfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCitpbnQ2NF90IGdldFRpbWVzdGFtcE5vdygpIHsKKyAgICBpbnQ2NF90IHN0YW1wOworICAgIHN0cnVjdCB0aW1lc3BlYyB0czsKKyAgICAvLyBUT0RPOiBDTE9DS19NT05PVE9OSUNfQ09BUlNFPworICAgIGNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCAmdHMpOworICAgIHN0YW1wID0gdHMudHZfbnNlYyAvIDEwMDA7CisgICAgc3RhbXAgKz0gKHRzLnR2X3NlYyAqIDEwMDAwMDBMTCk7CisgICAgcmV0dXJuIHN0YW1wOworfQorCitzdGF0aWMgY29uc3RleHByIGludCBrTnVtRWxlbWVudHNJblF1ZXVlID0gMTAyNCoxNjsKK3N0YXRpYyBjb25zdGV4cHIgaW50IGtNaW5FbGVtZW50c1RvU3luY0luUXVldWUgPSAxMjg7CisKK1Jlc3VsdFN0YXR1cyBCdWZmZXJTdGF0dXNPYnNlcnZlcjo6b3BlbigKKyAgICAgICAgQ29ubmVjdGlvbklkIGlkLCBjb25zdCBRdWV1ZURlc2NyaXB0b3IqKiBmbXFEZXNjUHRyKSB7CisgICAgaWYgKG1CdWZmZXJTdGF0dXNRdWV1ZXMuZmluZChpZCkgIT0gbUJ1ZmZlclN0YXR1c1F1ZXVlcy5lbmQoKSkgeworICAgICAgICAvLyBUT0RPOiBpZCBjb2xsaXNpb24gbG9nPworICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKKyAgICB9CisgICAgc3RkOjp1bmlxdWVfcHRyPEJ1ZmZlclN0YXR1c1F1ZXVlPiBxdWV1ZSA9CisgICAgICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPEJ1ZmZlclN0YXR1c1F1ZXVlPihrTnVtRWxlbWVudHNJblF1ZXVlKTsKKyAgICBpZiAoIXF1ZXVlIHx8IHF1ZXVlLT5pc1ZhbGlkKCkgPT0gZmFsc2UpIHsKKyAgICAgICAgKmZtcURlc2NQdHIgPSBudWxscHRyOworICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpOT19NRU1PUlk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgKmZtcURlc2NQdHIgPSBxdWV1ZS0+Z2V0RGVzYygpOworICAgIH0KKyAgICBhdXRvIHJlc3VsdCA9IG1CdWZmZXJTdGF0dXNRdWV1ZXMuaW5zZXJ0KAorICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoaWQsIHN0ZDo6bW92ZShxdWV1ZSkpKTsKKyAgICBpZiAoIXJlc3VsdC5zZWNvbmQpIHsKKyAgICAgICAgKmZtcURlc2NQdHIgPSBudWxscHRyOworICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpOT19NRU1PUlk7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok9LOworfQorCitSZXN1bHRTdGF0dXMgQnVmZmVyU3RhdHVzT2JzZXJ2ZXI6OmNsb3NlKENvbm5lY3Rpb25JZCBpZCkgeworICAgIGlmIChtQnVmZmVyU3RhdHVzUXVldWVzLmZpbmQoaWQpID09IG1CdWZmZXJTdGF0dXNRdWV1ZXMuZW5kKCkpIHsKKyAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7CisgICAgfQorICAgIG1CdWZmZXJTdGF0dXNRdWV1ZXMuZXJhc2UoaWQpOworICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok9LOworfQorCit2b2lkIEJ1ZmZlclN0YXR1c09ic2VydmVyOjpnZXRCdWZmZXJTdGF0dXNDaGFuZ2VzKHN0ZDo6dmVjdG9yPEJ1ZmZlclN0YXR1c01lc3NhZ2U+ICZtZXNzYWdlcykgeworICAgIGZvciAoYXV0byBpdCA9IG1CdWZmZXJTdGF0dXNRdWV1ZXMuYmVnaW4oKTsgaXQgIT0gbUJ1ZmZlclN0YXR1c1F1ZXVlcy5lbmQoKTsgKytpdCkgeworICAgICAgICBCdWZmZXJTdGF0dXNNZXNzYWdlIG1lc3NhZ2U7CisgICAgICAgIHNpemVfdCBhdmFpbCA9IGl0LT5zZWNvbmQtPmF2YWlsYWJsZVRvUmVhZCgpOworICAgICAgICB3aGlsZSAoYXZhaWwgPiAwKSB7CisgICAgICAgICAgICBpZiAoIWl0LT5zZWNvbmQtPnJlYWQoJm1lc3NhZ2UsIDEpKSB7CisgICAgICAgICAgICAgICAgLy8gU2luY2UgYXZhbGlhYmxlICMgb2YgcmVhZHMgYXJlIGFscmVhZHkgY29uZmlybWVkLAorICAgICAgICAgICAgICAgIC8vIHRoaXMgc2hvdWxkIG5vdCBoYXBwZW4uCisgICAgICAgICAgICAgICAgLy8gVE9ETzogZXJyb3IgaGFuZGxpbmcgKHNwdXJpb3VzIGNsaWVudD8pCisgICAgICAgICAgICAgICAgQUxPR1coIkZNUSBtZXNzYWdlIGNhbm5vdCBiZSByZWFkIGZyb20gJWxsZCIsIChsb25nIGxvbmcpaXQtPmZpcnN0KTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtZXNzYWdlLmNvbm5lY3Rpb25JZCA9IGl0LT5maXJzdDsKKyAgICAgICAgICAgIG1lc3NhZ2VzLnB1c2hfYmFjayhtZXNzYWdlKTsKKyAgICAgICAgICAgIC0tYXZhaWw7CisgICAgICAgIH0KKyAgICB9Cit9CisKK0J1ZmZlclN0YXR1c0NoYW5uZWw6OkJ1ZmZlclN0YXR1c0NoYW5uZWwoCisgICAgICAgIGNvbnN0IFF1ZXVlRGVzY3JpcHRvciAmZm1xRGVzYykgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxCdWZmZXJTdGF0dXNRdWV1ZT4gcXVldWUgPQorICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxCdWZmZXJTdGF0dXNRdWV1ZT4oZm1xRGVzYyk7CisgICAgaWYgKCFxdWV1ZSB8fCBxdWV1ZS0+aXNWYWxpZCgpID09IGZhbHNlKSB7CisgICAgICAgIG1WYWxpZCA9IGZhbHNlOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1WYWxpZCAgPSB0cnVlOworICAgIG1CdWZmZXJTdGF0dXNRdWV1ZSA9IHN0ZDo6bW92ZShxdWV1ZSk7Cit9CisKK2Jvb2wgQnVmZmVyU3RhdHVzQ2hhbm5lbDo6aXNWYWxpZCgpIHsKKyAgICByZXR1cm4gbVZhbGlkOworfQorCitib29sIEJ1ZmZlclN0YXR1c0NoYW5uZWw6Om5lZWRzU3luYygpIHsKKyAgICBpZiAobVZhbGlkKSB7CisgICAgICAgIHNpemVfdCBhdmFpbCA9IG1CdWZmZXJTdGF0dXNRdWV1ZS0+YXZhaWxhYmxlVG9Xcml0ZSgpOworICAgICAgICByZXR1cm4gYXZhaWwgKyBrTWluRWxlbWVudHNUb1N5bmNJblF1ZXVlIDwga051bUVsZW1lbnRzSW5RdWV1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIEJ1ZmZlclN0YXR1c0NoYW5uZWw6OnBvc3RCdWZmZXJSZWxlYXNlKAorICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLAorICAgICAgICBzdGQ6Omxpc3Q8QnVmZmVySWQ+ICZwZW5kaW5nLCBzdGQ6Omxpc3Q8QnVmZmVySWQ+ICZwb3N0ZWQpIHsKKyAgICBpZiAobVZhbGlkICYmIHBlbmRpbmcuc2l6ZSgpID4gMCkgeworICAgICAgICBzaXplX3QgYXZhaWwgPSBtQnVmZmVyU3RhdHVzUXVldWUtPmF2YWlsYWJsZVRvV3JpdGUoKTsKKyAgICAgICAgYXZhaWwgPSBzdGQ6Om1pbihhdmFpbCwgcGVuZGluZy5zaXplKCkpOworICAgICAgICBCdWZmZXJTdGF0dXNNZXNzYWdlIG1lc3NhZ2U7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwIDsgaSA8IGF2YWlsOyArK2kpIHsKKyAgICAgICAgICAgIEJ1ZmZlcklkIGlkID0gcGVuZGluZy5mcm9udCgpOworICAgICAgICAgICAgbWVzc2FnZS5uZXdTdGF0dXMgPSBCdWZmZXJTdGF0dXM6Ok5PVF9VU0VEOworICAgICAgICAgICAgbWVzc2FnZS5idWZmZXJJZCA9IGlkOworICAgICAgICAgICAgbWVzc2FnZS5jb25uZWN0aW9uSWQgPSBjb25uZWN0aW9uSWQ7CisgICAgICAgICAgICBpZiAoIW1CdWZmZXJTdGF0dXNRdWV1ZS0+d3JpdGUoJm1lc3NhZ2UsIDEpKSB7CisgICAgICAgICAgICAgICAgLy8gU2luY2UgYXZhbGlhYmxlICMgb2Ygd3JpdGVzIGFyZSBhbHJlYWR5IGNvbmZpcm1lZCwKKyAgICAgICAgICAgICAgICAvLyB0aGlzIHNob3VsZCBub3QgaGFwcGVuLgorICAgICAgICAgICAgICAgIC8vIFRPRE86IGVycm9yIGhhbmRpbmc/CisgICAgICAgICAgICAgICAgQUxPR1coIkZNUSBtZXNzYWdlIGNhbm5vdCBiZSBzZW50IGZyb20gJWxsZCIsIChsb25nIGxvbmcpY29ubmVjdGlvbklkKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwZW5kaW5nLnBvcF9mcm9udCgpOworICAgICAgICAgICAgcG9zdGVkLnB1c2hfYmFjayhpZCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2Jvb2wgQnVmZmVyU3RhdHVzQ2hhbm5lbDo6cG9zdEJ1ZmZlclN0YXR1c01lc3NhZ2UoCisgICAgICAgIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwgQnVmZmVySWQgYnVmZmVySWQsCisgICAgICAgIEJ1ZmZlclN0YXR1cyBzdGF0dXMsIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsIENvbm5lY3Rpb25JZCB0YXJnZXRJZCwKKyAgICAgICAgc3RkOjpsaXN0PEJ1ZmZlcklkPiAmcGVuZGluZywgc3RkOjpsaXN0PEJ1ZmZlcklkPiAmcG9zdGVkKSB7CisgICAgaWYgKG1WYWxpZCkgeworICAgICAgICBzaXplX3QgYXZhaWwgPSBtQnVmZmVyU3RhdHVzUXVldWUtPmF2YWlsYWJsZVRvV3JpdGUoKTsKKyAgICAgICAgc2l6ZV90IG51bVBlbmRpbmcgPSBwZW5kaW5nLnNpemUoKTsKKyAgICAgICAgaWYgKGF2YWlsID49IG51bVBlbmRpbmcgKyAxKSB7CisgICAgICAgICAgICBCdWZmZXJTdGF0dXNNZXNzYWdlIHJlbGVhc2UsIG1lc3NhZ2U7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bVBlbmRpbmc7ICsraSkgeworICAgICAgICAgICAgICAgIEJ1ZmZlcklkIGlkID0gcGVuZGluZy5mcm9udCgpOworICAgICAgICAgICAgICAgIHJlbGVhc2UubmV3U3RhdHVzID0gQnVmZmVyU3RhdHVzOjpOT1RfVVNFRDsKKyAgICAgICAgICAgICAgICByZWxlYXNlLmJ1ZmZlcklkID0gaWQ7CisgICAgICAgICAgICAgICAgcmVsZWFzZS5jb25uZWN0aW9uSWQgPSBjb25uZWN0aW9uSWQ7CisgICAgICAgICAgICAgICAgaWYgKCFtQnVmZmVyU3RhdHVzUXVldWUtPndyaXRlKCZyZWxlYXNlLCAxKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBTaW5jZSBhdmFsaWFibGUgIyBvZiB3cml0ZXMgYXJlIGFscmVhZHkgY29uZmlybWVkLAorICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIHNob3VsZCBub3QgaGFwcGVuLgorICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBlcnJvciBoYW5kbGluZz8KKyAgICAgICAgICAgICAgICAgICAgQUxPR1coIkZNUSBtZXNzYWdlIGNhbm5vdCBiZSBzZW50IGZyb20gJWxsZCIsIChsb25nIGxvbmcpY29ubmVjdGlvbklkKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwZW5kaW5nLnBvcF9mcm9udCgpOworICAgICAgICAgICAgICAgIHBvc3RlZC5wdXNoX2JhY2soaWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWVzc2FnZS50cmFuc2FjdGlvbklkID0gdHJhbnNhY3Rpb25JZDsKKyAgICAgICAgICAgIG1lc3NhZ2UuYnVmZmVySWQgPSBidWZmZXJJZDsKKyAgICAgICAgICAgIG1lc3NhZ2UubmV3U3RhdHVzID0gc3RhdHVzOworICAgICAgICAgICAgbWVzc2FnZS5jb25uZWN0aW9uSWQgPSBjb25uZWN0aW9uSWQ7CisgICAgICAgICAgICBtZXNzYWdlLnRhcmdldENvbm5lY3Rpb25JZCA9IHRhcmdldElkOworICAgICAgICAgICAgLy8gVE9ETyA6IHRpbWVzYXRhbXAKKyAgICAgICAgICAgIG1lc3NhZ2UudGltZXN0YW1wVXMgPSAwOworICAgICAgICAgICAgaWYgKCFtQnVmZmVyU3RhdHVzUXVldWUtPndyaXRlKCZtZXNzYWdlLCAxKSkgeworICAgICAgICAgICAgICAgIC8vIFNpbmNlIGF2YWxpYWJsZSAjIG9mIHdyaXRlcyBhcmUgYWxyZWFkeSBjb25maXJtZWQsCisgICAgICAgICAgICAgICAgLy8gdGhpcyBzaG91bGQgbm90IGhhcHBlbi4KKyAgICAgICAgICAgICAgICBBTE9HVygiRk1RIG1lc3NhZ2UgY2Fubm90IGJlIHNlbnQgZnJvbSAlbGxkIiwgKGxvbmcgbG9uZyljb25uZWN0aW9uSWQpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uCit9ICAvLyBuYW1lc3BhY2UgVjFfMAorfSAgLy8gbmFtZXNwYWNlIGJ1ZmZlcnBvb2wKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzEuMC9CdWZmZXJTdGF0dXMuaCBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0J1ZmZlclN0YXR1cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExOGE5MjEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzEuMC9CdWZmZXJTdGF0dXMuaApAQCAtMCwwICsxLDE0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YxXzBfQlVGRkVSU1RBVFVTX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YxXzBfQlVGRkVSU1RBVFVTX0gKKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYnVmZmVycG9vbC8xLjAvdHlwZXMuaD4KKyNpbmNsdWRlIDxidWZmZXJwb29sL0J1ZmZlclBvb2xUeXBlcy5oPgorI2luY2x1ZGUgPGZtcS9NZXNzYWdlUXVldWUuaD4KKyNpbmNsdWRlIDxoaWRsL01RRGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGhpZGwvU3RhdHVzLmg+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPG11dGV4PgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxsaXN0PgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBidWZmZXJwb29sIHsKK25hbWVzcGFjZSBWMV8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKKy8qKiBSZXR1cm5zIG1vbm90b25pYyB0aW1lc3RhbXAgaW4gVXMgc2luY2UgZml4ZWQgcG9pbnQgaW4gdGltZS4gKi8KK2ludDY0X3QgZ2V0VGltZXN0YW1wTm93KCk7CisKKy8qKgorICogQSBjb2xsZWN0aW9uIG9mIEZNUSBmb3IgYSBidWZmZXIgcG9vbC4gYnVmZmVyIG93bmVyc2hpcC9zdGF0dXMgY2hhbmdlCisgKiBtZXNzYWdlcyBhcmUgc2VudCB2aWEgdGhlIEZNUXMgZnJvbSB0aGUgY2xpZW50cy4KKyAqLworY2xhc3MgQnVmZmVyU3RhdHVzT2JzZXJ2ZXIgeworcHJpdmF0ZToKKyAgICBzdGQ6Om1hcDxDb25uZWN0aW9uSWQsIHN0ZDo6dW5pcXVlX3B0cjxCdWZmZXJTdGF0dXNRdWV1ZT4+CisgICAgICAgICAgICBtQnVmZmVyU3RhdHVzUXVldWVzOworCitwdWJsaWM6CisgICAgLyoqIENyZWF0ZXMgYW4gRk1RIGZvciB0aGUgc3BlY2lmaWVkIGNvbm5lY3Rpb24oY2xpZW50KS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uSWQgIGNvbm5lY3Rpb24gSWQgb2YgdGhlIHNwZWNpZmllZCBjbGllbnQuCisgICAgICogQHBhcmFtIGZtcURlc2NQdHIgICAgZG91YmxlIHB0ciBvZiBjcmVhdGVkIEZNUSdzIGRlc2NyaXB0b3IuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE9LIGlmIEZNUSBpcyBjcmVhdGVkIHN1Y2Nlc3NmdWxseS4KKyAgICAgKiAgICAgICAgIE5PX01FTU9SWSB3aGVuIHRoZXJlIGlzIG5vIG1lbW9yeS4KKyAgICAgKiAgICAgICAgIENSSVRJQ0FMX0VSUk9SIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBSZXN1bHRTdGF0dXMgb3BlbihDb25uZWN0aW9uSWQgaWQsIGNvbnN0IFF1ZXVlRGVzY3JpcHRvcioqIGZtcURlc2NQdHIpOworCisgICAgLyoqIENsb3NlcyBhbiBGTVEgZm9yIHRoZSBzcGVjaWZpZWQgY29ubmVjdGlvbihjbGllbnQpLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbm5lY3Rpb25JZCAgY29ubmVjdGlvbiBJZCBvZiB0aGUgc3BlY2lmaWVkIGNsaWVudC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gT0sgaWYgdGhlIHNwZWNpZmllZCBjb25uZWN0aW9uIGlzIGNsb3NlZCBzdWNjZXNzZnVsbHkuCisgICAgICogICAgICAgICBDUklUSUNBTF9FUlJPUiBvdGhlcndpc2UuCisgICAgICovCisgICAgUmVzdWx0U3RhdHVzIGNsb3NlKENvbm5lY3Rpb25JZCBpZCk7CisKKyAgICAvKiogUmV0cmlldmVzIGFsbCBwZW5kaW5nIEZNUSBidWZmZXIgc3RhdHVzIG1lc3NhZ2VzIGZyb20gY2xpZW50cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtZXNzYWdlcyAgcmV0cmlldmVkIHBlbmRpbmcgbWVzc2FnZXMuCisgICAgICovCisgICAgdm9pZCBnZXRCdWZmZXJTdGF0dXNDaGFuZ2VzKHN0ZDo6dmVjdG9yPEJ1ZmZlclN0YXR1c01lc3NhZ2U+ICZtZXNzYWdlcyk7Cit9OworCisvKioKKyAqIEFuIEZNUSBmb3IgYSBidWZmZXIgcG9vbCBjbGllbnQuIEJ1ZmZlciBvd25lcnNoaXAvc3RhdHVzIGNoYW5nZSBtZXNzYWdlcworICogYXJlIHNlbnQgdmlhIHRoZSBmbXEgdG8gdGhlIGJ1ZmZlciBwb29sLgorICovCitjbGFzcyBCdWZmZXJTdGF0dXNDaGFubmVsIHsKK3ByaXZhdGU6CisgICAgYm9vbCBtVmFsaWQ7CisgICAgc3RkOjp1bmlxdWVfcHRyPEJ1ZmZlclN0YXR1c1F1ZXVlPiBtQnVmZmVyU3RhdHVzUXVldWU7CisKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBDb25uZWN0cyB0byBhbiBGTVEgZnJvbSBhIGRlc2NyaXB0b3Igb2YgdGhlIGNyZWF0ZWQgRk1RLgorICAgICAqCisgICAgICogQHBhcmFtIGZtcURlc2MgICBEZXNjcmlwdG9yIG9mIHRoZSBjcmVhdGVkIEZNUS4KKyAgICAgKi8KKyAgICBCdWZmZXJTdGF0dXNDaGFubmVsKGNvbnN0IFF1ZXVlRGVzY3JpcHRvciAmZm1xRGVzYyk7CisKKyAgICAvKiogUmV0dXJucyB3aGV0aGVyIHRoZSBGTVEgaXMgY29ubmVjdGVkIHN1Y2Nlc3NmdWxseS4gKi8KKyAgICBib29sIGlzVmFsaWQoKTsKKworICAgIC8qKiBSZXR1cm5zIHdoZXRoZXIgdGhlIEZNUSBuZWVkcyB0byBiZSBzeW5jZWQgZnJvbSB0aGUgYnVmZmVyIHBvb2wgKi8KKyAgICBib29sIG5lZWRzU3luYygpOworCisgICAgLyoqCisgICAgICogUG9zdHMgYSBidWZmZXIgcmVsZWFzZSBtZXNzYWdlIHRvIHRoZSBidWZmZXIgcG9vbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uSWQgIGNvbm5lY3Rpb24gSWQgb2YgdGhlIGNsaWVudC4KKyAgICAgKiBAcGFyYW0gcGVuZGluZyAgICAgICBjdXJyZW50bHkgcGVuZGluZyBidWZmZXIgcmVsZWFzZSBtZXNzYWdlcy4KKyAgICAgKiBAcGFyYW0gcG9zdGVkICAgICAgICBwb3N0ZWQgYnVmZmVyIHJlbGVhc2UgbWVzc2FnZXMuCisgICAgICovCisgICAgdm9pZCBwb3N0QnVmZmVyUmVsZWFzZSgKKyAgICAgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsCisgICAgICAgICAgICBzdGQ6Omxpc3Q8QnVmZmVySWQ+ICZwZW5kaW5nLCBzdGQ6Omxpc3Q8QnVmZmVySWQ+ICZwb3N0ZWQpOworCisgICAgLyoqCisgICAgICogUG9zdHMgYSBidWZmZXIgc3RhdHVzIG1lc3NhZ2UgcmVnYXJkaW5nIHRoZSBzcGVjaWZpZWQgYnVmZmVyCisgICAgICogdHJhbnNmZXIgdHJhbnNhY3Rpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHJhbnNhY3Rpb25JZCBJZCBvZiB0aGUgc3BlY2lmaWVkIHRyYW5zYWN0aW9uLgorICAgICAqIEBwYXJhbSBidWZmZXJJZCAgICAgIGJ1ZmZlciBJZCBvZiB0aGUgc3BlY2lmaWVkIHRyYW5zYWN0aW9uLgorICAgICAqIEBwYXJhbSBzdGF0dXMgICAgICAgIG5ldyBzdGF0dXMgb2YgdGhlIGJ1ZmZlci4KKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvbklkICBjb25uZWN0aW9uIElkIG9mIHRoZSBjbGllbnQuCisgICAgICogQHBhcmFtIHRhcmdldElkICAgICAgY29ubmVjdGlvbiBJZCBvZiB0aGUgcmVjZWl2ZXIob25seSB3aGVuIHRoZSBzZW5kZXIKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBwb3N0cyBhIHN0YXR1cyBtZXNzYWdlKS4KKyAgICAgKiBAcGFyYW0gcGVuZGluZyAgICAgICBjdXJyZW50bHkgcGVuZGluZyBidWZmZXIgcmVsZWFzZSBtZXNzYWdlcy4KKyAgICAgKiBAcGFyYW0gcG9zdGVkICAgICAgICBwb3N0ZWQgYnVmZmVyIHJlbGVhc2UgbWVzc2FnZXMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSB3aGVuIHRoZSBzcGVjaWZpZWQgbWVzc2FnZSBpcyBwb3N0ZWQsCisgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBib29sIHBvc3RCdWZmZXJTdGF0dXNNZXNzYWdlKAorICAgICAgICAgICAgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLAorICAgICAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsCisgICAgICAgICAgICBCdWZmZXJTdGF0dXMgc3RhdHVzLAorICAgICAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgIENvbm5lY3Rpb25JZCB0YXJnZXRJZCwKKyAgICAgICAgICAgIHN0ZDo6bGlzdDxCdWZmZXJJZD4gJnBlbmRpbmcsIHN0ZDo6bGlzdDxCdWZmZXJJZD4gJnBvc3RlZCk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24KK30gIC8vIG5hbWVzcGFjZSBWMV8wCit9ICAvLyBuYW1lc3BhY2UgYnVmZmVycG9vbAorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YxXzBfQlVGRkVSU1RBVFVTX0gKZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0NsaWVudE1hbmFnZXIuY3BwIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvQ2xpZW50TWFuYWdlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNlYTBhNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0NsaWVudE1hbmFnZXIuY3BwCkBAIC0wLDAgKzEsNTA0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNkZWZpbmUgTE9HX1RBRyAiQnVmZmVyUG9vbE1hbmFnZXIiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDxidWZmZXJwb29sL0NsaWVudE1hbmFnZXIuaD4KKyNpbmNsdWRlIDxoaWRsL0hpZGxUcmFuc3BvcnRTdXBwb3J0Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgIkJ1ZmZlclBvb2xDbGllbnQuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYnVmZmVycG9vbCB7CituYW1lc3BhY2UgVjFfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCitzdGF0aWMgY29uc3RleHByIGludDY0X3Qga1JlZ2lzdGVyVGltZW91dFVzID0gNTAwMDAwOyAvLyAwLjUgc2VjCitzdGF0aWMgY29uc3RleHByIGludDY0X3Qga0NsZWFuVXBEdXJhdGlvblVzID0gMTAwMDAwMDsgLy8gVE9ETzogMSBzZWMgdHVuZQorc3RhdGljIGNvbnN0ZXhwciBpbnQ2NF90IGtDbGllbnRUaW1lb3V0VXMgPSA1MDAwMDAwOyAvLyBUT0RPOiA1IHNlY3MgdHVuZQorCisvKioKKyAqIFRoZSBob2xkZXIgb2YgdGhlIGNvb2tpZSBvZiByZW1vdGUgSUNsaWVudE1hbmFnZXIuCisgKiBUaGUgY29va2llIGlzIHByb2Nlc3MgbG9jYWxseSB1bmlxdWUgZm9yIGVhY2ggSUNsaWVudE1hbmFnZXIuCisgKiAoVGhlIGNvb2tpZSBpcyB1c2VkIHRvIG5vdGlmeSBkZWF0aCBvZiBjbGllbnRzIHRvIGJ1ZmZlcnBvb2wgcHJvY2Vzcy4pCisgKi8KK2NsYXNzIENsaWVudE1hbmFnZXJDb29raWVIb2xkZXIgeworcHVibGljOgorICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBjb29raWUgaG9sZGVyIGZvciByZW1vdGUgSUNsaWVudE1hbmFnZXIocykuCisgICAgICovCisgICAgQ2xpZW50TWFuYWdlckNvb2tpZUhvbGRlcigpOworCisgICAgLyoqCisgICAgICogR2V0cyBhIGNvb2tpZSBmb3IgYSByZW1vdGUgSUNsaWVudE1hbmFnZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFuYWdlciAgIHRoZSBzcGVjaWZpZWQgcmVtb3RlIElDbGllbnRNYW5hZ2VyLgorICAgICAqIEBwYXJhbSBhZGRlZCAgICAgdHJ1ZSB3aGVuIHRoZSBzcGVjaWZpZWQgcmVtb3RlIElDbGllbnRNYW5hZ2VyIGlzIGFkZGVkCisgICAgICogICAgICAgICAgICAgICAgICBuZXdseSwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgcHJvY2VzcyBsb2NhbGx5IHVuaXF1ZSBjb29raWUgZm9yIHRoZSBzcGVjaWZpZWQgSUNsaWVudE1hbmFnZXIuCisgICAgICovCisgICAgdWludDY0X3QgZ2V0Q29va2llKGNvbnN0IHNwPElDbGllbnRNYW5hZ2VyPiAmbWFuYWdlciwgYm9vbCAqYWRkZWQpOworCitwcml2YXRlOgorICAgIHVpbnQ2NF90IG1TZXFJZDsKKyAgICBzdGQ6Om11dGV4IG1Mb2NrOworICAgIHN0ZDo6bGlzdDxzdGQ6OnBhaXI8Y29uc3Qgd3A8SUNsaWVudE1hbmFnZXI+LCB1aW50NjRfdD4+IG1NYW5hZ2VyczsKK307CisKK0NsaWVudE1hbmFnZXJDb29raWVIb2xkZXI6OkNsaWVudE1hbmFnZXJDb29raWVIb2xkZXIoKSA6IG1TZXFJZCgwKXt9CisKK3VpbnQ2NF90IENsaWVudE1hbmFnZXJDb29raWVIb2xkZXI6OmdldENvb2tpZSgKKyAgICAgICAgY29uc3Qgc3A8SUNsaWVudE1hbmFnZXI+ICZtYW5hZ2VyLAorICAgICAgICBib29sICphZGRlZCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKKyAgICBmb3IgKGF1dG8gaXQgPSBtTWFuYWdlcnMuYmVnaW4oKTsgaXQgIT0gbU1hbmFnZXJzLmVuZCgpOykgeworICAgICAgICBjb25zdCBzcDxJQ2xpZW50TWFuYWdlcj4ga2V5ID0gaXQtPmZpcnN0LnByb21vdGUoKTsKKyAgICAgICAgaWYgKGtleSkgeworICAgICAgICAgICAgaWYgKGludGVyZmFjZXNFcXVhbChrZXksIG1hbmFnZXIpKSB7CisgICAgICAgICAgICAgICAgKmFkZGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgcmV0dXJuIGl0LT5zZWNvbmQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICArK2l0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaXQgPSBtTWFuYWdlcnMuZXJhc2UoaXQpOworICAgICAgICB9CisgICAgfQorICAgIHVpbnQ2NF90IGlkID0gbVNlcUlkKys7CisgICAgKmFkZGVkID0gdHJ1ZTsKKyAgICBtTWFuYWdlcnMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKG1hbmFnZXIsIGlkKSk7CisgICAgcmV0dXJuIGlkOworfQorCitjbGFzcyBDbGllbnRNYW5hZ2VyOjpJbXBsIHsKK3B1YmxpYzoKKyAgICBJbXBsKCk7CisKKyAgICAvLyBCblJlZ2lzdGVyU2VuZGVyCisgICAgUmVzdWx0U3RhdHVzIHJlZ2lzdGVyU2VuZGVyKGNvbnN0IHNwPElBY2Nlc3Nvcj4gJmFjY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25uZWN0aW9uSWQgKnBDb25uZWN0aW9uSWQpOworCisgICAgLy8gQnBSZWdpc3RlclNlbmRlcgorICAgIFJlc3VsdFN0YXR1cyByZWdpc3RlclNlbmRlcihjb25zdCBzcDxJQ2xpZW50TWFuYWdlcj4gJnJlY2VpdmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25uZWN0aW9uSWQgc2VuZGVySWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpb25JZCAqcmVjZWl2ZXJJZCk7CisKKyAgICBSZXN1bHRTdGF0dXMgY3JlYXRlKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdG9yPiAmYWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGlvbklkICpwQ29ubmVjdGlvbklkKTsKKworICAgIFJlc3VsdFN0YXR1cyBjbG9zZShDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkKTsKKworICAgIFJlc3VsdFN0YXR1cyBhbGxvY2F0ZShDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlcik7CisKKyAgICBSZXN1bHRTdGF0dXMgcmVjZWl2ZShDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcFVzLAorICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICpidWZmZXIpOworCisgICAgUmVzdWx0U3RhdHVzIHBvc3RTZW5kKENvbm5lY3Rpb25JZCByZWNlaXZlcklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICZidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zYWN0aW9uSWQgKnRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKnRpbWVzdGFtcFVzKTsKKworICAgIFJlc3VsdFN0YXR1cyBnZXRBY2Nlc3NvcihDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxJQWNjZXNzb3I+ICphY2Nlc3Nvcik7CisKKyAgICB2b2lkIGNsZWFuVXAoYm9vbCBjbGVhckNhY2hlID0gZmFsc2UpOworCitwcml2YXRlOgorICAgIC8vIEluIG9yZGVyIHRvIHByZXZlbnQgZGVhZGxvY2sgYmV0d2VlbiBtdWx0aXBsZSBsb2NrcywKKyAgICAvLyBhbHdheXMgbG9jayBDbGllbnRDYWNoZS5sb2NrIGJlZm9yZSBsb2NraW5nIEFjdGl2ZUNsaWVudHMubG9jay4KKyAgICBzdHJ1Y3QgQ2xpZW50Q2FjaGUgeworICAgICAgICAvLyBUaGlzIGxvY2sgaXMgaGVsZCBmb3IgYnJpZWYgZHVyYXRpb24uCisgICAgICAgIC8vIEJsb2NraW5nIG9wZXJhdGlvbiBpcyBub3QgcGVyZm9ybWVkIHdoaWxlIGhvbGRpbmcgdGhlIGxvY2suCisgICAgICAgIHN0ZDo6bXV0ZXggbU11dGV4OworICAgICAgICBzdGQ6Omxpc3Q8c3RkOjpwYWlyPGNvbnN0IHdwPElBY2Nlc3Nvcj4sIGNvbnN0IHN0ZDo6d2Vha19wdHI8QnVmZmVyUG9vbENsaWVudD4+PgorICAgICAgICAgICAgICAgIG1DbGllbnRzOworICAgICAgICBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSBtQ29ubmVjdEN2OworICAgICAgICBib29sIG1Db25uZWN0aW5nOworICAgICAgICBpbnQ2NF90IG1MYXN0Q2xlYW5VcFVzOworCisgICAgICAgIENsaWVudENhY2hlKCkgOiBtQ29ubmVjdGluZyhmYWxzZSksIG1MYXN0Q2xlYW5VcFVzKGdldFRpbWVzdGFtcE5vdygpKSB7fQorICAgIH0gbUNhY2hlOworCisgICAgLy8gQWN0aXZlIGNsaWVudHMgd2hpY2ggY2FuIGJlIHJldHJpZXZlZCB2aWEgQ29ubmVjdGlvbklkCisgICAgc3RydWN0IEFjdGl2ZUNsaWVudHMgeworICAgICAgICAvLyBUaGlzIGxvY2sgaXMgaGVsZCBmb3IgYnJpZWYgZHVyYXRpb24uCisgICAgICAgIC8vIEJsb2NraW5nIG9wZXJhdGlvbiBpcyBub3QgcGVyZm9ybWVkIGhvbGRpbmcgdGhlIGxvY2suCisgICAgICAgIHN0ZDo6bXV0ZXggbU11dGV4OworICAgICAgICBzdGQ6Om1hcDxDb25uZWN0aW9uSWQsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQ2xpZW50Pj4KKyAgICAgICAgICAgICAgICBtQ2xpZW50czsKKyAgICB9IG1BY3RpdmU7CisKKyAgICBDbGllbnRNYW5hZ2VyQ29va2llSG9sZGVyIG1SZW1vdGVDbGllbnRDb29raWVzOworfTsKKworQ2xpZW50TWFuYWdlcjo6SW1wbDo6SW1wbCgpIHt9CisKK1Jlc3VsdFN0YXR1cyBDbGllbnRNYW5hZ2VyOjpJbXBsOjpyZWdpc3RlclNlbmRlcigKKyAgICAgICAgY29uc3Qgc3A8SUFjY2Vzc29yPiAmYWNjZXNzb3IsIENvbm5lY3Rpb25JZCAqcENvbm5lY3Rpb25JZCkgeworICAgIGNsZWFuVXAoKTsKKyAgICBpbnQ2NF90IHRpbWVvdXRVcyA9IGdldFRpbWVzdGFtcE5vdygpICsga1JlZ2lzdGVyVGltZW91dFVzOworICAgIGRvIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG1DYWNoZS5tTXV0ZXgpOworICAgICAgICBmb3IgKGF1dG8gaXQgPSBtQ2FjaGUubUNsaWVudHMuYmVnaW4oKTsgaXQgIT0gbUNhY2hlLm1DbGllbnRzLmVuZCgpOyArK2l0KSB7CisgICAgICAgICAgICBzcDxJQWNjZXNzb3I+IHNBY2Nlc3NvciA9IGl0LT5maXJzdC5wcm9tb3RlKCk7CisgICAgICAgICAgICBpZiAoc0FjY2Vzc29yICYmIGludGVyZmFjZXNFcXVhbChzQWNjZXNzb3IsIGFjY2Vzc29yKSkgeworICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQ2xpZW50PiBjbGllbnQgPSBpdC0+c2Vjb25kLmxvY2soKTsKKyAgICAgICAgICAgICAgICBpZiAoY2xpZW50KSB7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1BY3RpdmUubU11dGV4KTsKKyAgICAgICAgICAgICAgICAgICAgKnBDb25uZWN0aW9uSWQgPSBjbGllbnQtPmdldENvbm5lY3Rpb25JZCgpOworICAgICAgICAgICAgICAgICAgICBpZiAobUFjdGl2ZS5tQ2xpZW50cy5maW5kKCpwQ29ubmVjdGlvbklkKSAhPSBtQWN0aXZlLm1DbGllbnRzLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigicmVnaXN0ZXIgZXhpc3RpbmcgY29ubmVjdGlvbiAlbGxkIiwgKGxvbmcgbG9uZykqcENvbm5lY3Rpb25JZCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpBTFJFQURZX0VYSVNUUzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtQ2FjaGUubUNsaWVudHMuZXJhc2UoaXQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghbUNhY2hlLm1Db25uZWN0aW5nKSB7CisgICAgICAgICAgICBtQ2FjaGUubUNvbm5lY3RpbmcgPSB0cnVlOworICAgICAgICAgICAgbG9jay51bmxvY2soKTsKKyAgICAgICAgICAgIFJlc3VsdFN0YXR1cyByZXN1bHQgPSBSZXN1bHRTdGF0dXM6Ok9LOworICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xDbGllbnQ+IGNsaWVudCA9CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QnVmZmVyUG9vbENsaWVudD4oYWNjZXNzb3IpOworICAgICAgICAgICAgbG9jay5sb2NrKCk7CisgICAgICAgICAgICBpZiAoIWNsaWVudCkgeworICAgICAgICAgICAgICAgIHJlc3VsdCA9IFJlc3VsdFN0YXR1czo6Tk9fTUVNT1JZOworICAgICAgICAgICAgfSBlbHNlIGlmICghY2xpZW50LT5pc1ZhbGlkKCkpIHsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgLy8gVE9ETzogaGFuZGxlIGluc2VydCBmYWlsLiAobWFsbG9jIGZhaWwpCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp3ZWFrX3B0cjxCdWZmZXJQb29sQ2xpZW50PiB3Y2xpZW50ID0gY2xpZW50OworICAgICAgICAgICAgICAgIG1DYWNoZS5tQ2xpZW50cy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoYWNjZXNzb3IsIHdjbGllbnQpKTsKKyAgICAgICAgICAgICAgICBDb25uZWN0aW9uSWQgY29uSWQgPSBjbGllbnQtPmdldENvbm5lY3Rpb25JZCgpOworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUFjdGl2ZS5tTXV0ZXgpOworICAgICAgICAgICAgICAgICAgICBtQWN0aXZlLm1DbGllbnRzLmluc2VydChzdGQ6Om1ha2VfcGFpcihjb25JZCwgY2xpZW50KSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICpwQ29ubmVjdGlvbklkID0gY29uSWQ7CisgICAgICAgICAgICAgICAgQUxPR1YoInJlZ2lzdGVyIG5ldyBjb25uZWN0aW9uICVsbGQiLCAobG9uZyBsb25nKSpwQ29ubmVjdGlvbklkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1DYWNoZS5tQ29ubmVjdGluZyA9IGZhbHNlOworICAgICAgICAgICAgbG9jay51bmxvY2soKTsKKyAgICAgICAgICAgIG1DYWNoZS5tQ29ubmVjdEN2Lm5vdGlmeV9hbGwoKTsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgbUNhY2hlLm1Db25uZWN0Q3Yud2FpdF9mb3IoCisgICAgICAgICAgICAgICAgbG9jaywgc3RkOjpjaHJvbm86Om1pY3Jvc2Vjb25kcyhrUmVnaXN0ZXJUaW1lb3V0VXMpKTsKKyAgICB9IHdoaWxlIChnZXRUaW1lc3RhbXBOb3coKSA8IHRpbWVvdXRVcyk7CisgICAgLy8gVE9ETzogcmV0dXJuIHRpbWVvdXQgZXJyb3IKKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworUmVzdWx0U3RhdHVzIENsaWVudE1hbmFnZXI6OkltcGw6OnJlZ2lzdGVyU2VuZGVyKAorICAgICAgICBjb25zdCBzcDxJQ2xpZW50TWFuYWdlcj4gJnJlY2VpdmVyLAorICAgICAgICBDb25uZWN0aW9uSWQgc2VuZGVySWQsCisgICAgICAgIENvbm5lY3Rpb25JZCAqcmVjZWl2ZXJJZCkgeworICAgIHNwPElBY2Nlc3Nvcj4gYWNjZXNzb3I7CisgICAgYm9vbCBsb2NhbCA9IGZhbHNlOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUFjdGl2ZS5tTXV0ZXgpOworICAgICAgICBhdXRvIGl0ID0gbUFjdGl2ZS5tQ2xpZW50cy5maW5kKHNlbmRlcklkKTsKKyAgICAgICAgaWYgKGl0ID09IG1BY3RpdmUubUNsaWVudHMuZW5kKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok5PVF9GT1VORDsKKyAgICAgICAgfQorICAgICAgICBpdC0+c2Vjb25kLT5nZXRBY2Nlc3NvcigmYWNjZXNzb3IpOworICAgICAgICBsb2NhbCA9IGl0LT5zZWNvbmQtPmlzTG9jYWwoKTsKKyAgICB9CisgICAgUmVzdWx0U3RhdHVzIHJzID0gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKKyAgICBpZiAoYWNjZXNzb3IpIHsKKyAgICAgICBSZXR1cm48dm9pZD4gdHJhbnNSZXN1bHQgPSByZWNlaXZlci0+cmVnaXN0ZXJTZW5kZXIoCisgICAgICAgICAgICAgICAgYWNjZXNzb3IsCisgICAgICAgICAgICAgICAgWyZycywgcmVjZWl2ZXJJZF0oCisgICAgICAgICAgICAgICAgICAgICAgICBSZXN1bHRTdGF0dXMgc3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBjb25uZWN0aW9uSWQpIHsKKyAgICAgICAgICAgICAgICAgICAgcnMgPSBzdGF0dXM7CisgICAgICAgICAgICAgICAgICAgICpyZWNlaXZlcklkID0gY29ubmVjdGlvbklkOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICBpZiAoIXRyYW5zUmVzdWx0LmlzT2soKSkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7CisgICAgICAgIH0gZWxzZSBpZiAobG9jYWwgJiYgcnMgPT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICAgICAgc3A8Q29ubmVjdGlvbkRlYXRoUmVjaXBpZW50PiByZWNpcGllbnQgPSBBY2Nlc3Nvcjo6Z2V0Q29ubmVjdGlvbkRlYXRoUmVjaXBpZW50KCk7CisgICAgICAgICAgICBpZiAocmVjaXBpZW50KSAgeworICAgICAgICAgICAgICAgIEFMT0dWKCJjbGllbnQgZGVhdGggcmVjaXBpZW50IHJlZ2lzdGVyZWQgJWxsZCIsIChsb25nIGxvbmcpKnJlY2VpdmVySWQpOworICAgICAgICAgICAgICAgIGJvb2wgYWRkZWQ7CisgICAgICAgICAgICAgICAgdWludDY0X3QgY29va2llID0gbVJlbW90ZUNsaWVudENvb2tpZXMuZ2V0Q29va2llKHJlY2VpdmVyLCAmYWRkZWQpOworICAgICAgICAgICAgICAgIHJlY2lwaWVudC0+YWRkQ29va2llVG9Db25uZWN0aW9uKGNvb2tpZSwgKnJlY2VpdmVySWQpOworICAgICAgICAgICAgICAgIGlmIChhZGRlZCkgeworICAgICAgICAgICAgICAgICAgICBSZXR1cm48Ym9vbD4gdHJhbnNSZXN1bHQgPSByZWNlaXZlci0+bGlua1RvRGVhdGgocmVjaXBpZW50LCBjb29raWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcnM7Cit9CisKK1Jlc3VsdFN0YXR1cyBDbGllbnRNYW5hZ2VyOjpJbXBsOjpjcmVhdGUoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdG9yPiAmYWxsb2NhdG9yLAorICAgICAgICBDb25uZWN0aW9uSWQgKnBDb25uZWN0aW9uSWQpIHsKKyAgICBjb25zdCBzcDxBY2Nlc3Nvcj4gYWNjZXNzb3IgPSBuZXcgQWNjZXNzb3IoYWxsb2NhdG9yKTsKKyAgICBpZiAoIWFjY2Vzc29yIHx8ICFhY2Nlc3Nvci0+aXNWYWxpZCgpKSB7CisgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworICAgIH0KKyAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbENsaWVudD4gY2xpZW50ID0KKyAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QnVmZmVyUG9vbENsaWVudD4oYWNjZXNzb3IpOworICAgIGlmICghY2xpZW50IHx8ICFjbGllbnQtPmlzVmFsaWQoKSkgeworICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKKyAgICB9CisgICAgLy8gU2luY2UgYSBuZXcgYnVmZmVycG9vbCBpcyBjcmVhdGVkLCBldmljdCBtZW1vcmllcyB3aGljaCBhcmUgdXNlZCBieQorICAgIC8vIGV4aXN0aW5nIGJ1ZmZlcnBvb2xzIGFuZCBjbGllbnRzLgorICAgIGNsZWFuVXAodHJ1ZSk7CisgICAgeworICAgICAgICAvLyBUT0RPOiBoYW5kbGUgaW5zZXJ0IGZhaWwuIChtYWxsb2MgZmFpbCkKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUNhY2hlLm1NdXRleCk7CisgICAgICAgIGNvbnN0IHN0ZDo6d2Vha19wdHI8QnVmZmVyUG9vbENsaWVudD4gd2NsaWVudCA9IGNsaWVudDsKKyAgICAgICAgbUNhY2hlLm1DbGllbnRzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihhY2Nlc3Nvciwgd2NsaWVudCkpOworICAgICAgICBDb25uZWN0aW9uSWQgY29uSWQgPSBjbGllbnQtPmdldENvbm5lY3Rpb25JZCgpOworICAgICAgICB7CisgICAgICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQWN0aXZlLm1NdXRleCk7CisgICAgICAgICAgICBtQWN0aXZlLm1DbGllbnRzLmluc2VydChzdGQ6Om1ha2VfcGFpcihjb25JZCwgY2xpZW50KSk7CisgICAgICAgIH0KKyAgICAgICAgKnBDb25uZWN0aW9uSWQgPSBjb25JZDsKKyAgICAgICAgQUxPR1YoImNyZWF0ZSBuZXcgY29ubmVjdGlvbiAlbGxkIiwgKGxvbmcgbG9uZykqcENvbm5lY3Rpb25JZCk7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok9LOworfQorCitSZXN1bHRTdGF0dXMgQ2xpZW50TWFuYWdlcjo6SW1wbDo6Y2xvc2UoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrMShtQ2FjaGUubU11dGV4KTsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jazIobUFjdGl2ZS5tTXV0ZXgpOworICAgIGF1dG8gaXQgPSBtQWN0aXZlLm1DbGllbnRzLmZpbmQoY29ubmVjdGlvbklkKTsKKyAgICBpZiAoaXQgIT0gbUFjdGl2ZS5tQ2xpZW50cy5lbmQoKSkgeworICAgICAgICBzcDxJQWNjZXNzb3I+IGFjY2Vzc29yOworICAgICAgICBpdC0+c2Vjb25kLT5nZXRBY2Nlc3NvcigmYWNjZXNzb3IpOworICAgICAgICBtQWN0aXZlLm1DbGllbnRzLmVyYXNlKGNvbm5lY3Rpb25JZCk7CisgICAgICAgIGZvciAoYXV0byBjaXQgPSBtQ2FjaGUubUNsaWVudHMuYmVnaW4oKTsgY2l0ICE9IG1DYWNoZS5tQ2xpZW50cy5lbmQoKTspIHsKKyAgICAgICAgICAgIC8vIGNsZWFuIHVwIGRlYWQgY2xpZW50IGNhY2hlcworICAgICAgICAgICAgc3A8SUFjY2Vzc29yPiBjQWNjZXNzb3IgPSBjaXQtPmZpcnN0LnByb21vdGUoKTsKKyAgICAgICAgICAgIGlmICghY0FjY2Vzc29yIHx8IChhY2Nlc3NvciAmJiBpbnRlcmZhY2VzRXF1YWwoY0FjY2Vzc29yLCBhY2Nlc3NvcikpKSB7CisgICAgICAgICAgICAgICAgY2l0ID0gbUNhY2hlLm1DbGllbnRzLmVyYXNlKGNpdCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNpdCsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok9LOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpOT1RfRk9VTkQ7Cit9CisKK1Jlc3VsdFN0YXR1cyBDbGllbnRNYW5hZ2VyOjpJbXBsOjphbGxvY2F0ZSgKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlLCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICpidWZmZXIpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbENsaWVudD4gY2xpZW50OworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUFjdGl2ZS5tTXV0ZXgpOworICAgICAgICBhdXRvIGl0ID0gbUFjdGl2ZS5tQ2xpZW50cy5maW5kKGNvbm5lY3Rpb25JZCk7CisgICAgICAgIGlmIChpdCA9PSBtQWN0aXZlLm1DbGllbnRzLmVuZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpOT1RfRk9VTkQ7CisgICAgICAgIH0KKyAgICAgICAgY2xpZW50ID0gaXQtPnNlY29uZDsKKyAgICB9CisgICAgcmV0dXJuIGNsaWVudC0+YWxsb2NhdGUocGFyYW1zLCBoYW5kbGUsIGJ1ZmZlcik7Cit9CisKK1Jlc3VsdFN0YXR1cyBDbGllbnRNYW5hZ2VyOjpJbXBsOjpyZWNlaXZlKAorICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLCBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsCisgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkLCBpbnQ2NF90IHRpbWVzdGFtcFVzLAorICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUsIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlcikgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQ2xpZW50PiBjbGllbnQ7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQWN0aXZlLm1NdXRleCk7CisgICAgICAgIGF1dG8gaXQgPSBtQWN0aXZlLm1DbGllbnRzLmZpbmQoY29ubmVjdGlvbklkKTsKKyAgICAgICAgaWYgKGl0ID09IG1BY3RpdmUubUNsaWVudHMuZW5kKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok5PVF9GT1VORDsKKyAgICAgICAgfQorICAgICAgICBjbGllbnQgPSBpdC0+c2Vjb25kOworICAgIH0KKyAgICByZXR1cm4gY2xpZW50LT5yZWNlaXZlKHRyYW5zYWN0aW9uSWQsIGJ1ZmZlcklkLCB0aW1lc3RhbXBVcywgaGFuZGxlLCBidWZmZXIpOworfQorCitSZXN1bHRTdGF0dXMgQ2xpZW50TWFuYWdlcjo6SW1wbDo6cG9zdFNlbmQoCisgICAgICAgIENvbm5lY3Rpb25JZCByZWNlaXZlcklkLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICZidWZmZXIsCisgICAgICAgIFRyYW5zYWN0aW9uSWQgKnRyYW5zYWN0aW9uSWQsIGludDY0X3QgKnRpbWVzdGFtcFVzKSB7CisgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCA9IGJ1ZmZlci0+bUNvbm5lY3Rpb25JZDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbENsaWVudD4gY2xpZW50OworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUFjdGl2ZS5tTXV0ZXgpOworICAgICAgICBhdXRvIGl0ID0gbUFjdGl2ZS5tQ2xpZW50cy5maW5kKGNvbm5lY3Rpb25JZCk7CisgICAgICAgIGlmIChpdCA9PSBtQWN0aXZlLm1DbGllbnRzLmVuZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpOT1RfRk9VTkQ7CisgICAgICAgIH0KKyAgICAgICAgY2xpZW50ID0gaXQtPnNlY29uZDsKKyAgICB9CisgICAgcmV0dXJuIGNsaWVudC0+cG9zdFNlbmQocmVjZWl2ZXJJZCwgYnVmZmVyLCB0cmFuc2FjdGlvbklkLCB0aW1lc3RhbXBVcyk7Cit9CisKK1Jlc3VsdFN0YXR1cyBDbGllbnRNYW5hZ2VyOjpJbXBsOjpnZXRBY2Nlc3NvcigKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwgc3A8SUFjY2Vzc29yPiAqYWNjZXNzb3IpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbENsaWVudD4gY2xpZW50OworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUFjdGl2ZS5tTXV0ZXgpOworICAgICAgICBhdXRvIGl0ID0gbUFjdGl2ZS5tQ2xpZW50cy5maW5kKGNvbm5lY3Rpb25JZCk7CisgICAgICAgIGlmIChpdCA9PSBtQWN0aXZlLm1DbGllbnRzLmVuZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpOT1RfRk9VTkQ7CisgICAgICAgIH0KKyAgICAgICAgY2xpZW50ID0gaXQtPnNlY29uZDsKKyAgICB9CisgICAgcmV0dXJuIGNsaWVudC0+Z2V0QWNjZXNzb3IoYWNjZXNzb3IpOworfQorCit2b2lkIENsaWVudE1hbmFnZXI6OkltcGw6OmNsZWFuVXAoYm9vbCBjbGVhckNhY2hlKSB7CisgICAgaW50NjRfdCBub3cgPSBnZXRUaW1lc3RhbXBOb3coKTsKKyAgICBpbnQ2NF90IGxhc3RUcmFuc2FjdGlvblVzOworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrMShtQ2FjaGUubU11dGV4KTsKKyAgICBpZiAoY2xlYXJDYWNoZSB8fCBtQ2FjaGUubUxhc3RDbGVhblVwVXMgKyBrQ2xlYW5VcER1cmF0aW9uVXMgPCBub3cpIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2syKG1BY3RpdmUubU11dGV4KTsKKyAgICAgICAgaW50IGNsZWFuZWQgPSAwOworICAgICAgICBmb3IgKGF1dG8gaXQgPSBtQWN0aXZlLm1DbGllbnRzLmJlZ2luKCk7IGl0ICE9IG1BY3RpdmUubUNsaWVudHMuZW5kKCk7KSB7CisgICAgICAgICAgICBpZiAoIWl0LT5zZWNvbmQtPmlzQWN0aXZlKCZsYXN0VHJhbnNhY3Rpb25VcywgY2xlYXJDYWNoZSkpIHsKKyAgICAgICAgICAgICAgICBpZiAobGFzdFRyYW5zYWN0aW9uVXMgKyBrQ2xpZW50VGltZW91dFVzIDwgbm93KSB7CisgICAgICAgICAgICAgICAgICAgIHNwPElBY2Nlc3Nvcj4gYWNjZXNzb3I7CisgICAgICAgICAgICAgICAgICAgIGl0LT5zZWNvbmQtPmdldEFjY2Vzc29yKCZhY2Nlc3Nvcik7CisgICAgICAgICAgICAgICAgICAgIGl0ID0gbUFjdGl2ZS5tQ2xpZW50cy5lcmFzZShpdCk7CisgICAgICAgICAgICAgICAgICAgICsrY2xlYW5lZDsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgKytpdDsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGF1dG8gY2l0ID0gbUNhY2hlLm1DbGllbnRzLmJlZ2luKCk7IGNpdCAhPSBtQ2FjaGUubUNsaWVudHMuZW5kKCk7KSB7CisgICAgICAgICAgICAvLyBjbGVhbiB1cCBkZWFkIGNsaWVudCBjYWNoZXMKKyAgICAgICAgICAgIHNwPElBY2Nlc3Nvcj4gY0FjY2Vzc29yID0gY2l0LT5maXJzdC5wcm9tb3RlKCk7CisgICAgICAgICAgICBpZiAoIWNBY2Nlc3NvcikgeworICAgICAgICAgICAgICAgIGNpdCA9IG1DYWNoZS5tQ2xpZW50cy5lcmFzZShjaXQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICArK2NpdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBBTE9HVigiIyBvZiBjbGVhbmVkIGNvbm5lY3Rpb25zOiAlZCIsIGNsZWFuZWQpOworICAgICAgICBtQ2FjaGUubUxhc3RDbGVhblVwVXMgPSBub3c7CisgICAgfQorfQorCisvLyBNZXRob2RzIGZyb20gOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYxXzA6OklDbGllbnRNYW5hZ2VyIGZvbGxvdy4KK1JldHVybjx2b2lkPiBDbGllbnRNYW5hZ2VyOjpyZWdpc3RlclNlbmRlcihjb25zdCBzcDw6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjFfMDo6SUFjY2Vzc29yPiYgYnVmZmVyUG9vbCwgcmVnaXN0ZXJTZW5kZXJfY2IgX2hpZGxfY2IpIHsKKyAgICBpZiAobUltcGwpIHsKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCA9IC0xOworICAgICAgICBSZXN1bHRTdGF0dXMgc3RhdHVzID0gbUltcGwtPnJlZ2lzdGVyU2VuZGVyKGJ1ZmZlclBvb2wsICZjb25uZWN0aW9uSWQpOworICAgICAgICBfaGlkbF9jYihzdGF0dXMsIGNvbm5lY3Rpb25JZCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX2hpZGxfY2IoUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUiwgLTEpOworICAgIH0KKyAgICByZXR1cm4gVm9pZCgpOworfQorCisvLyBNZXRob2RzIGZvciBsb2NhbCB1c2UuCitzcDxDbGllbnRNYW5hZ2VyPiBDbGllbnRNYW5hZ2VyOjpzSW5zdGFuY2U7CitzdGQ6Om11dGV4IENsaWVudE1hbmFnZXI6OnNJbnN0YW5jZUxvY2s7CisKK3NwPENsaWVudE1hbmFnZXI+IENsaWVudE1hbmFnZXI6OmdldEluc3RhbmNlKCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKHNJbnN0YW5jZUxvY2spOworICAgIGlmICghc0luc3RhbmNlKSB7CisgICAgICAgIHNJbnN0YW5jZSA9IG5ldyBDbGllbnRNYW5hZ2VyKCk7CisgICAgfQorICAgIHJldHVybiBzSW5zdGFuY2U7Cit9CisKK0NsaWVudE1hbmFnZXI6OkNsaWVudE1hbmFnZXIoKSA6IG1JbXBsKG5ldyBJbXBsKCkpIHt9CisKK0NsaWVudE1hbmFnZXI6On5DbGllbnRNYW5hZ2VyKCkgeworfQorCitSZXN1bHRTdGF0dXMgQ2xpZW50TWFuYWdlcjo6Y3JlYXRlKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRvcj4gJmFsbG9jYXRvciwKKyAgICAgICAgQ29ubmVjdGlvbklkICpwQ29ubmVjdGlvbklkKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+Y3JlYXRlKGFsbG9jYXRvciwgcENvbm5lY3Rpb25JZCk7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCitSZXN1bHRTdGF0dXMgQ2xpZW50TWFuYWdlcjo6cmVnaXN0ZXJTZW5kZXIoCisgICAgICAgIGNvbnN0IHNwPElDbGllbnRNYW5hZ2VyPiAmcmVjZWl2ZXIsCisgICAgICAgIENvbm5lY3Rpb25JZCBzZW5kZXJJZCwKKyAgICAgICAgQ29ubmVjdGlvbklkICpyZWNlaXZlcklkKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+cmVnaXN0ZXJTZW5kZXIocmVjZWl2ZXIsIHNlbmRlcklkLCByZWNlaXZlcklkKTsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK1Jlc3VsdFN0YXR1cyBDbGllbnRNYW5hZ2VyOjpjbG9zZShDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+Y2xvc2UoY29ubmVjdGlvbklkKTsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK1Jlc3VsdFN0YXR1cyBDbGllbnRNYW5hZ2VyOjphbGxvY2F0ZSgKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlLCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICpidWZmZXIpIHsKKyAgICBpZiAobUltcGwpIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLT5hbGxvY2F0ZShjb25uZWN0aW9uSWQsIHBhcmFtcywgaGFuZGxlLCBidWZmZXIpOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworUmVzdWx0U3RhdHVzIENsaWVudE1hbmFnZXI6OnJlY2VpdmUoCisgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwKKyAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsIGludDY0X3QgdGltZXN0YW1wVXMsCisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSwgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAqYnVmZmVyKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+cmVjZWl2ZShjb25uZWN0aW9uSWQsIHRyYW5zYWN0aW9uSWQsIGJ1ZmZlcklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wVXMsIGhhbmRsZSwgYnVmZmVyKTsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK1Jlc3VsdFN0YXR1cyBDbGllbnRNYW5hZ2VyOjpwb3N0U2VuZCgKKyAgICAgICAgQ29ubmVjdGlvbklkIHJlY2VpdmVySWQsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gJmJ1ZmZlciwKKyAgICAgICAgVHJhbnNhY3Rpb25JZCAqdHJhbnNhY3Rpb25JZCwgaW50NjRfdCogdGltZXN0YW1wVXMpIHsKKyAgICBpZiAobUltcGwgJiYgYnVmZmVyKSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+cG9zdFNlbmQocmVjZWl2ZXJJZCwgYnVmZmVyLCB0cmFuc2FjdGlvbklkLCB0aW1lc3RhbXBVcyk7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCit2b2lkIENsaWVudE1hbmFnZXI6OmNsZWFuVXAoKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIG1JbXBsLT5jbGVhblVwKHRydWUpOworICAgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uCit9ICAvLyBuYW1lc3BhY2UgVjFfMAorfSAgLy8gbmFtZXNwYWNlIGJ1ZmZlcnBvb2wKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8xLjAvQ29ubmVjdGlvbi5jcHAgYi9tZWRpYS9idWZmZXJwb29sLzEuMC9Db25uZWN0aW9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNThmNTk1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvQ29ubmVjdGlvbi5jcHAKQEAgLTAsMCArMSw4OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJDb25uZWN0aW9uLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGJ1ZmZlcnBvb2wgeworbmFtZXNwYWNlIFYxXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKworLy8gTWV0aG9kcyBmcm9tIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMV8wOjpJQ29ubmVjdGlvbiBmb2xsb3cuCitSZXR1cm48dm9pZD4gQ29ubmVjdGlvbjo6ZmV0Y2godWludDY0X3QgdHJhbnNhY3Rpb25JZCwgdWludDMyX3QgYnVmZmVySWQsIGZldGNoX2NiIF9oaWRsX2NiKSB7CisgICAgUmVzdWx0U3RhdHVzIHN0YXR1cyA9IFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7CisgICAgaWYgKG1Jbml0aWFsaXplZCAmJiBtQWNjZXNzb3IpIHsKKyAgICAgICAgaWYgKGJ1ZmZlcklkICE9IFNZTkNfQlVGRkVSSUQpIHsKKyAgICAgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlID0gbnVsbHB0cjsKKyAgICAgICAgICAgIHN0YXR1cyA9IG1BY2Nlc3Nvci0+ZmV0Y2goCisgICAgICAgICAgICAgICAgICAgIG1Db25uZWN0aW9uSWQsIHRyYW5zYWN0aW9uSWQsIGJ1ZmZlcklkLCAmaGFuZGxlKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgIF9oaWRsX2NiKHN0YXR1cywgQnVmZmVye2J1ZmZlcklkLCBoYW5kbGV9KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVm9pZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUFjY2Vzc29yLT5jbGVhblVwKGZhbHNlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBfaGlkbF9jYihzdGF0dXMsIEJ1ZmZlcnswLCBudWxscHRyfSk7CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworQ29ubmVjdGlvbjo6Q29ubmVjdGlvbigpIDogbUluaXRpYWxpemVkKGZhbHNlKSwgbUNvbm5lY3Rpb25JZCgtMUxMKSB7fQorCitDb25uZWN0aW9uOjp+Q29ubmVjdGlvbigpIHsKKyAgICBpZiAobUluaXRpYWxpemVkICYmIG1BY2Nlc3NvcikgeworICAgICAgICBtQWNjZXNzb3ItPmNsb3NlKG1Db25uZWN0aW9uSWQpOworICAgIH0KK30KKwordm9pZCBDb25uZWN0aW9uOjppbml0aWFsaXplKAorICAgICAgICBjb25zdCBzcDxBY2Nlc3Nvcj4mIGFjY2Vzc29yLCBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkKSB7CisgICAgaWYgKCFtSW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgbUFjY2Vzc29yID0gYWNjZXNzb3I7CisgICAgICAgIG1Db25uZWN0aW9uSWQgPSBjb25uZWN0aW9uSWQ7CisgICAgICAgIG1Jbml0aWFsaXplZCA9IHRydWU7CisgICAgfQorfQorCitSZXN1bHRTdGF0dXMgQ29ubmVjdGlvbjo6YWxsb2NhdGUoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZwYXJhbXMsIEJ1ZmZlcklkICpidWZmZXJJZCwKKyAgICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlKSB7CisgICAgaWYgKG1Jbml0aWFsaXplZCAmJiBtQWNjZXNzb3IpIHsKKyAgICAgICAgcmV0dXJuIG1BY2Nlc3Nvci0+YWxsb2NhdGUobUNvbm5lY3Rpb25JZCwgcGFyYW1zLCBidWZmZXJJZCwgaGFuZGxlKTsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK3ZvaWQgQ29ubmVjdGlvbjo6Y2xlYW5VcChib29sIGNsZWFyQ2FjaGUpIHsKKyAgICBpZiAobUluaXRpYWxpemVkICYmIG1BY2Nlc3NvcikgeworICAgICAgICBtQWNjZXNzb3ItPmNsZWFuVXAoY2xlYXJDYWNoZSk7CisgICAgfQorfQorCisvLyBNZXRob2RzIGZyb20gOjphbmRyb2lkOjpoaWRsOjpiYXNlOjpWMV8wOjpJQmFzZSBmb2xsb3cuCisKKy8vSUNvbm5lY3Rpb24qIEhJRExfRkVUQ0hfSUNvbm5lY3Rpb24oY29uc3QgY2hhciogLyogbmFtZSAqLykgeworLy8gICAgcmV0dXJuIG5ldyBDb25uZWN0aW9uKCk7CisvL30KKworfSAgLy8gbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uCit9ICAvLyBuYW1lc3BhY2UgVjFfMAorfSAgLy8gbmFtZXNwYWNlIGJ1ZmZlcnBvb2wKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8xLjAvQ29ubmVjdGlvbi5oIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvQ29ubmVjdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxOWNiNjcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzEuMC9Db25uZWN0aW9uLmgKQEAgLTAsMCArMSwxMDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMV8wX0NPTk5FQ1RJT05fSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjFfMF9DT05ORUNUSU9OX0gKKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYnVmZmVycG9vbC8xLjAvSUNvbm5lY3Rpb24uaD4KKyNpbmNsdWRlIDxidWZmZXJwb29sL0J1ZmZlclBvb2xUeXBlcy5oPgorI2luY2x1ZGUgPGhpZGwvTVFEZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8aGlkbC9TdGF0dXMuaD4KKyNpbmNsdWRlICJBY2Nlc3Nvci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBidWZmZXJwb29sIHsKK25hbWVzcGFjZSBWMV8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfYXJyYXk7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX21lbW9yeTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjFfMDo6aW1wbGVtZW50YXRpb246OkFjY2Vzc29yOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Vm9pZDsKK3VzaW5nIDo6YW5kcm9pZDo6c3A7CisKK3N0cnVjdCBDb25uZWN0aW9uIDogcHVibGljIElDb25uZWN0aW9uIHsKKyAgICAvLyBNZXRob2RzIGZyb20gOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYxXzA6OklDb25uZWN0aW9uIGZvbGxvdy4KKyAgICBSZXR1cm48dm9pZD4gZmV0Y2godWludDY0X3QgdHJhbnNhY3Rpb25JZCwgdWludDMyX3QgYnVmZmVySWQsIGZldGNoX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKworICAgIC8qKgorICAgICAqIEFsbG9jYXRlcyBhIGJ1ZmZlciB1c2luZyB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMuIFJlY3ljbGVzIGEgYnVmZmVyIGlmCisgICAgICogaXQgaXMgcG9zc2libGUuIFRoZSByZXR1cm5lZCBidWZmZXIgY2FuIGJlIHRyYW5zZmVycmVkIHRvIG90aGVyIHJlbW90ZQorICAgICAqIGNsaWVudHMoQ29ubmVjdGlvbikuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFyYW1zICAgIGFsbG9jYXRpb24gcGFyYW1ldGVycy4KKyAgICAgKiBAcGFyYW0gYnVmZmVySWQgIElkIG9mIHRoZSBhbGxvY2F0ZWQgYnVmZmVyLgorICAgICAqIEBwYXJhbSBoYW5kbGUgICAgbmF0aXZlIGhhbmRsZSBvZiB0aGUgYWxsb2NhdGVkIGJ1ZmZlci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gT0sgaWYgYSBidWZmZXIgaXMgc3VjY2Vzc2Z1bGx5IGFsbG9jYXRlZC4KKyAgICAgKiAgICAgICAgIE5PX01FTU9SWSB3aGVuIHRoZXJlIGlzIG5vIG1lbW9yeS4KKyAgICAgKiAgICAgICAgIENSSVRJQ0FMX0VSUk9SIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBSZXN1bHRTdGF0dXMgYWxsb2NhdGUoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQnVmZmVySWQgKmJ1ZmZlcklkLCBjb25zdCBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUpOworCisgICAgLyoqCisgICAgICogUHJvY2Vzc2VzIHBlbmRpbmcgYnVmZmVyIHN0YXR1cyBtZXNzYWdlcyBhbmQgcGVyZm9ybXMgcGVyaW9kaWMgY2FjaGUgY2xlYW5pbmcKKyAgICAgKiBmcm9tIGJ1ZmZlcnBvb2wuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2xlYXJDYWNoZSAgICBpZiBjbGVhckNhY2hlIGlzIHRydWUsIGJ1ZmZlcnBvb2wgZnJlZXMgYWxsIGJ1ZmZlcnMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICB3YWl0aW5nIHRvIGJlIHJlY3ljbGVkLgorICAgICAqLworICAgIHZvaWQgY2xlYW5VcChib29sIGNsZWFyQ2FjaGUpOworCisgICAgLyoqIERlc3RydWN0cyBhIGNvbm5lY3Rpb24uICovCisgICAgfkNvbm5lY3Rpb24oKTsKKworICAgIC8qKiBDcmVhdGVzIGEgY29ubmVjdGlvbi4gKi8KKyAgICBDb25uZWN0aW9uKCk7CisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplcyB3aXRoIHRoZSBzcGVjaWZpZWQgYnVmZmVyIHBvb2wgYW5kIHRoZSBjb25uZWN0aW9uIGlkLgorICAgICAqIFRoZSBjb25uZWN0aW9uIGlkIHNob3VsZCBiZSB1bmlxdWUgaW4gdGhlIHdob2xlIHN5c3RlbS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhY2Nlc3NvciAgICAgIHRoZSBzcGVjaWZpZWQgYnVmZmVyIHBvb2wuCisgICAgICogQHBhcmFtIGNvbm5lY3Rpb25JZCAgSWQuCisgICAgICovCisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNwPEFjY2Vzc29yPiAmYWNjZXNzb3IsIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQpOworCisgICAgZW51bSA6IHVpbnQzMl90IHsKKyAgICAgICAgU1lOQ19CVUZGRVJJRCA9IFVJTlQzMl9NQVgsCisgICAgfTsKKworcHJpdmF0ZToKKyAgICBib29sIG1Jbml0aWFsaXplZDsKKyAgICBzcDxBY2Nlc3Nvcj4gbUFjY2Vzc29yOworICAgIENvbm5lY3Rpb25JZCBtQ29ubmVjdGlvbklkOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uCit9ICAvLyBuYW1lc3BhY2UgVjFfMAorfSAgLy8gbmFtZXNwYWNlIGJ1ZmZlcnBvb2wKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMV8wX0NPTk5FQ1RJT05fSApkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8xLjAvaW5jbHVkZS9idWZmZXJwb29sL0J1ZmZlclBvb2xUeXBlcy5oIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvaW5jbHVkZS9idWZmZXJwb29sL0J1ZmZlclBvb2xUeXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxMGYwMTUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzEuMC9pbmNsdWRlL2J1ZmZlcnBvb2wvQnVmZmVyUG9vbFR5cGVzLmgKQEAgLTAsMCArMSwxMTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMV8wX0JVRkZFUlBPT0xUWVBFU19ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMV8wX0JVRkZFUlBPT0xUWVBFU19ICisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2J1ZmZlcnBvb2wvMS4wL3R5cGVzLmg+CisjaW5jbHVkZSA8Y3V0aWxzL25hdGl2ZV9oYW5kbGUuaD4KKyNpbmNsdWRlIDxmbXEvTWVzc2FnZVF1ZXVlLmg+CisjaW5jbHVkZSA8aGlkbC9NUURlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxoaWRsL1N0YXR1cy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBidWZmZXJwb29sIHsKKworc3RydWN0IEJ1ZmZlclBvb2xEYXRhIHsKKyAgICAvLyBGb3IgbG9jYWwgdXNlLCB0byBzcGVjaWZ5IGEgYnVmZmVycG9vbCAoY2xpZW50IGNvbm5lY3Rpb24pIGZvciBidWZmZXJzLgorICAgIC8vIFJldHVybiB2YWx1ZSBmcm9tIGNvbm5lY3QjSUFjY2Vzc29yKGFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYnVmZmVycG9vbEAxLjApLgorICAgIGludDY0X3QgbUNvbm5lY3Rpb25JZDsKKyAgICAvLyBCdWZmZXJJZAorICAgIHVpbnQzMl90IG1JZDsKKworICAgIEJ1ZmZlclBvb2xEYXRhKCkgOiBtQ29ubmVjdGlvbklkKDApLCBtSWQoMCkge30KKworICAgIEJ1ZmZlclBvb2xEYXRhKAorICAgICAgICAgICAgaW50NjRfdCBjb25uZWN0aW9uSWQsIHVpbnQzMl90IGlkKQorICAgICAgICAgICAgOiBtQ29ubmVjdGlvbklkKGNvbm5lY3Rpb25JZCksIG1JZChpZCkge30KKworICAgIH5CdWZmZXJQb29sRGF0YSgpIHt9Cit9OworCituYW1lc3BhY2UgVjFfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjprU3luY2hyb25pemVkUmVhZFdyaXRlOworCit0eXBlZGVmIHVpbnQzMl90IEJ1ZmZlcklkOwordHlwZWRlZiB1aW50NjRfdCBUcmFuc2FjdGlvbklkOwordHlwZWRlZiBpbnQ2NF90IENvbm5lY3Rpb25JZDsKKworZW51bSA6IENvbm5lY3Rpb25JZCB7CisgICAgSU5WQUxJRF9DT05ORUNUSU9OSUQgPSAwLAorfTsKKwordHlwZWRlZiBhbmRyb2lkOjpoYXJkd2FyZTo6TWVzc2FnZVF1ZXVlPEJ1ZmZlclN0YXR1c01lc3NhZ2UsIGtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+IEJ1ZmZlclN0YXR1c1F1ZXVlOwordHlwZWRlZiBCdWZmZXJTdGF0dXNRdWV1ZTo6RGVzY3JpcHRvciBRdWV1ZURlc2NyaXB0b3I7CisKKy8qKgorICogQWxsb2NhdGlvbiB3cmFwcGVyIGNsYXNzIGZvciBidWZmZXIgcG9vbC4KKyAqLworc3RydWN0IEJ1ZmZlclBvb2xBbGxvY2F0aW9uIHsKKyAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QgKm1IYW5kbGU7CisKKyAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QgKmhhbmRsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1IYW5kbGU7CisgICAgfQorCisgICAgQnVmZmVyUG9vbEFsbG9jYXRpb24oY29uc3QgbmF0aXZlX2hhbmRsZV90ICpoYW5kbGUpIDogbUhhbmRsZShoYW5kbGUpIHt9CisKKyAgICB+QnVmZmVyUG9vbEFsbG9jYXRpb24oKSB7fTsKK307CisKKy8qKgorICogQWxsb2NhdG9yIHdyYXBwZXIgY2xhc3MgZm9yIGJ1ZmZlciBwb29sLgorICovCitjbGFzcyBCdWZmZXJQb29sQWxsb2NhdG9yIHsKK3B1YmxpYzoKKworICAgIC8qKgorICAgICAqIEFsbG9jYXRlIGFuIGFsbG9jYXRpb24oYnVmZmVyKSBmb3IgYnVmZmVyIHBvb2wuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFyYW1zICAgIGFsbG9jYXRpb24gcGFyYW1ldGVycworICAgICAqIEBwYXJhbSBhbGxvYyAgICAgY3JlYXRlZCBhbGxvY2F0aW9uCisgICAgICogQHBhcmFtIGFsbG9jU2l6ZSBzaXplIG9mIGNyZWF0ZWQgYWxsb2NhdGlvbgorICAgICAqCisgICAgICogQHJldHVybiBPSyB3aGVuIGFuIGFsbG9jYXRpb24gaXMgY3JlYXRlZCBzdWNjZXNzZnVsbHkuCisgICAgICovCisgICAgdmlydHVhbCBSZXN1bHRTdGF0dXMgYWxsb2NhdGUoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0aW9uPiAqYWxsb2MsCisgICAgICAgICAgICBzaXplX3QgKmFsbG9jU2l6ZSkgPSAwOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB3aGV0aGVyIGFsbG9jYXRpb24gcGFyYW1ldGVycyBvZiBhbiBvbGQgYWxsb2NhdGlvbiBhcmUKKyAgICAgKiBjb21wYXRpYmxlIHdpdGggbmV3IGFsbG9jYXRpb24gcGFyYW1ldGVycy4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIGJvb2wgY29tcGF0aWJsZShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmbmV3UGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZvbGRQYXJhbXMpID0gMDsKKworcHJvdGVjdGVkOgorICAgIEJ1ZmZlclBvb2xBbGxvY2F0b3IoKSA9IGRlZmF1bHQ7CisKKyAgICB2aXJ0dWFsIH5CdWZmZXJQb29sQWxsb2NhdG9yKCkgPSBkZWZhdWx0OworfTsKKworfSAgLy8gbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uCit9ICAvLyBuYW1lc3BhY2UgVjFfMAorfSAgLy8gbmFtZXNwYWNlIGJ1ZmZlcnBvb2wKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMV8wX0JVRkZFUlBPT0xUWVBFU19ICmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzEuMC9pbmNsdWRlL2J1ZmZlcnBvb2wvQ2xpZW50TWFuYWdlci5oIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvaW5jbHVkZS9idWZmZXJwb29sL0NsaWVudE1hbmFnZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTU3NzlmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvaW5jbHVkZS9idWZmZXJwb29sL0NsaWVudE1hbmFnZXIuaApAQCAtMCwwICsxLDE3OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YxXzBfQ0xJRU5UTUFOQUdFUl9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMV8wX0NMSUVOVE1BTkFHRVJfSAorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9idWZmZXJwb29sLzEuMC9JQ2xpZW50TWFuYWdlci5oPgorI2luY2x1ZGUgPGhpZGwvTVFEZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8aGlkbC9TdGF0dXMuaD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSAiQnVmZmVyUG9vbFR5cGVzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGJ1ZmZlcnBvb2wgeworbmFtZXNwYWNlIFYxXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9hcnJheTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfbWVtb3J5OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMV8wOjpJQWNjZXNzb3I7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjFfMDo6UmVzdWx0U3RhdHVzOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Vm9pZDsKK3VzaW5nIDo6YW5kcm9pZDo6c3A7CisKK3N0cnVjdCBDbGllbnRNYW5hZ2VyIDogcHVibGljIElDbGllbnRNYW5hZ2VyIHsKKyAgICAvLyBNZXRob2RzIGZyb20gOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYxXzA6OklDbGllbnRNYW5hZ2VyIGZvbGxvdy4KKyAgICBSZXR1cm48dm9pZD4gcmVnaXN0ZXJTZW5kZXIoY29uc3Qgc3A8OjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYxXzA6OklBY2Nlc3Nvcj4mIGJ1ZmZlclBvb2wsIHJlZ2lzdGVyU2VuZGVyX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKworICAgIC8qKiBHZXRzIGFuIGluc3RhbmNlLiAqLworICAgIHN0YXRpYyBzcDxDbGllbnRNYW5hZ2VyPiBnZXRJbnN0YW5jZSgpOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGxvY2FsIGNvbm5lY3Rpb24gd2l0aCBhIG5ld2x5IGNyZWF0ZWQgYnVmZmVyIHBvb2wuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWxsb2NhdG9yICAgICBmb3IgbmV3IGJ1ZmZlciBhbGxvY2F0aW9uLgorICAgICAqIEBwYXJhbSBwQ29ubmVjdGlvbklkIElkIG9mIHRoZSBjcmVhdGVkIGNvbm5lY3Rpb24uIFRoaXMgaXMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBzeXN0ZW0td2lkZSB1bmlxdWUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE9LIHdoZW4gYSBidWZmZXIgcG9vbCBhbmQgYSBsb2NhbCBjb25uZWN0aW9uIGlzIHN1Y2Nlc3NmdWxseQorICAgICAqICAgICAgICAgY3JlYXRlZC4KKyAgICAgKiAgICAgICAgIE5PX01FTU9SWSB3aGVuIHRoZXJlIGlzIG5vIG1lbW9yeS4KKyAgICAgKiAgICAgICAgIENSSVRJQ0FMX0VSUk9SIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBSZXN1bHRTdGF0dXMgY3JlYXRlKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdG9yPiAmYWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGlvbklkICpwQ29ubmVjdGlvbklkKTsKKworICAgIC8qKgorICAgICAqIFJlZ2lzdGVyIGEgY3JlYXRlZCBjb25uZWN0aW9uIGFzIHNlbmRlciBmb3IgcmVtb3RlIHByb2Nlc3MuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVjZWl2ZXIgICAgICBUaGUgcmVtb3RlIHJlY2VpdmluZyBwcm9jZXNzLgorICAgICAqIEBwYXJhbSBzZW5kZXJJZCAgICAgIEEgbG9jYWwgY29ubmVjdGlvbiB3aGljaCB3aWxsIHNlbmQgYnVmZmVycyB0by4KKyAgICAgKiBAcGFyYW0gcmVjZWl2ZXJJZCAgICBJZCBvZiB0aGUgY3JlYXRlZCByZWNlaXZpbmcgY29ubmVjdGlvbiBvbiB0aGUgcmVjZWl2ZXIKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzLgorICAgICAqCisgICAgICogQHJldHVybiBPSyB3aGVuIHRoZSByZWNlaXZpbmcgY29ubmVjdGlvbiBpcyBzdWNjZXNzZnVsbHkgY3JlYXRlZCBvbiB0aGUKKyAgICAgKiAgICAgICAgIHJlY2VpdmVyIHByb2Nlc3MuCisgICAgICogICAgICAgICBOT1RfRk9VTkQgd2hlbiB0aGUgc2VuZGVyIGNvbm5lY3Rpb24gd2FzIG5vdCBmb3VuZC4KKyAgICAgKiAgICAgICAgIEFMUkVBRFlfRVhJU1RTIHRoZSByZWNlaXZpbmcgY29ubmVjdGlvbiBpcyBhbHJlYWR5IG1hZGUuCisgICAgICogICAgICAgICBDUklUSUNBTF9FUlJPUiBvdGhlcndpc2UuCisgICAgICovCisgICAgUmVzdWx0U3RhdHVzIHJlZ2lzdGVyU2VuZGVyKGNvbnN0IHNwPElDbGllbnRNYW5hZ2VyPiAmcmVjZWl2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpb25JZCBzZW5kZXJJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGlvbklkICpyZWNlaXZlcklkKTsKKworICAgIC8qKgorICAgICAqIENsb3NlcyB0aGUgc3BlY2lmaWVkIGNvbm5lY3Rpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvbklkICBUaGUgaWQgb2YgdGhlIGNvbm5lY3Rpb24uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE9LIHdoZW4gdGhlIGNvbm5lY3Rpb24gaXMgY2xvc2VkLgorICAgICAqICAgICAgICAgTk9UX0ZPVU5EIHdoZW4gdGhlIHNwZWNpZmllZCBjb25uZWN0aW9uIHdhcyBub3QgZm91bmQuCisgICAgICogICAgICAgICBDUklUSUNBTF9FUlJPUiBvdGhlcndpc2UuCisgICAgICovCisgICAgUmVzdWx0U3RhdHVzIGNsb3NlKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQpOworCisgICAgLyoqCisgICAgICogQWxsb2NhdGVzIGEgYnVmZmVyIGZyb20gdGhlIHNwZWNpZmllZCBjb25uZWN0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbm5lY3Rpb25JZCAgVGhlIGlkIG9mIHRoZSBjb25uZWN0aW9uLgorICAgICAqIEBwYXJhbSBwYXJhbXMgICAgICAgIFRoZSBhbGxvY2F0aW9uIHBhcmFtZXRlcnMuCisgICAgICogQHBhcmFtIGhhbmRsZSAgICAgICAgVGhlIG5hdGl2ZSBoYW5kbGUgdG8gdGhlIGFsbG9jYXRlZCBidWZmZXIuIGhhbmRsZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHNob3VsZCBiZSBjbG9uZWQgYmVmb3JlIHVzZS4KKyAgICAgKiBAcGFyYW0gYnVmZmVyICAgICAgICBUaGUgYWxsb2NhdGVkIGJ1ZmZlci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gT0sgd2hlbiBhIGJ1ZmZlciB3YXMgYWxsb2NhdGVkIHN1Y2Nlc3NmdWxseS4KKyAgICAgKiAgICAgICAgIE5PVF9GT1VORCB3aGVuIHRoZSBzcGVjaWZpZWQgY29ubmVjdGlvbiB3YXMgbm90IGZvdW5kLgorICAgICAqICAgICAgICAgTk9fTUVNT1JZIHdoZW4gdGhlcmUgaXMgbm8gbWVtb3J5LgorICAgICAqICAgICAgICAgQ1JJVElDQUxfRVJST1Igb3RoZXJ3aXNlLgorICAgICAqLworICAgIFJlc3VsdFN0YXR1cyBhbGxvY2F0ZShDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlcik7CisKKyAgICAvKioKKyAgICAgKiBSZWNlaXZlcyBhIGJ1ZmZlciBmb3IgdGhlIHRyYW5zYWN0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbm5lY3Rpb25JZCAgVGhlIGlkIG9mIHRoZSByZWNlaXZpbmcgY29ubmVjdGlvbi4KKyAgICAgKiBAcGFyYW0gdHJhbnNhY3Rpb25JZCBUaGUgaWQgZm9yIHRoZSB0cmFuc2FjdGlvbi4KKyAgICAgKiBAcGFyYW0gYnVmZmVySWQgICAgICBUaGUgaWQgZm9yIHRoZSBidWZmZXIuCisgICAgICogQHBhcmFtIHRpbWVzdGFtcFVzICAgVGhlIHRpbWVzdGFtcCBvZiB0aGUgYnVmZmVyIGlzIGJlaW5nIHNlbnQuCisgICAgICogQHBhcmFtIGhhbmRsZSAgICAgICAgVGhlIG5hdGl2ZSBoYW5kbGUgdG8gdGhlIGFsbG9jYXRlZCBidWZmZXIuIGhhbmRsZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHNob3VsZCBiZSBjbG9uZWQgYmVmb3JlIHVzZS4KKyAgICAgKiBAcGFyYW0gYnVmZmVyICAgICAgICBUaGUgcmVjZWl2ZWQgYnVmZmVyLgorICAgICAqCisgICAgICogQHJldHVybiBPSyB3aGVuIGEgYnVmZmVyIHdhcyByZWNlaXZlZCBzdWNjZXNzZnVsbHkuCisgICAgICogICAgICAgICBOT1RfRk9VTkQgd2hlbiB0aGUgc3BlY2lmaWVkIGNvbm5lY3Rpb24gd2FzIG5vdCBmb3VuZC4KKyAgICAgKiAgICAgICAgIE5PX01FTU9SWSB3aGVuIHRoZXJlIGlzIG5vIG1lbW9yeS4KKyAgICAgKiAgICAgICAgIENSSVRJQ0FMX0VSUk9SIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBSZXN1bHRTdGF0dXMgcmVjZWl2ZShDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcFVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAqYnVmZmVyKTsKKworICAgIC8qKgorICAgICAqIFBvc3RzIGEgYnVmZmVyIHRyYW5zZmVyIHRyYW5zYWN0aW9uIHRvIHRoZSBidWZmZXIgcG9vbC4gU2VuZHMgYSBidWZmZXIKKyAgICAgKiB0byBvdGhlciByZW1vdGUgY2xpZW50cyhjb25uZWN0aW9uKSBhZnRlciB0aGlzIGNhbGwgaGFzIGJlZW4gc3VjY2VlZGVkLgorICAgICAqCisgICAgICogQHBhcmFtIHJlY2VpdmVySWQgICAgVGhlIGlkIG9mIHRoZSByZWNlaXZpbmcgY29ubmVjdGlvbi4KKyAgICAgKiBAcGFyYW0gYnVmZmVyICAgICAgICB0byB0cmFuc2ZlcgorICAgICAqIEBwYXJhbSB0cmFuc2FjdGlvbklkIElkIG9mIHRoZSB0cmFuc2ZlciB0cmFuc2FjdGlvbi4KKyAgICAgKiBAcGFyYW0gdGltZXN0YW1wVXMgICBUaGUgdGltZXN0YW1wIG9mIHRoZSBidWZmZXIgdHJhbnNhY3Rpb24gaXMgYmVpbmcKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBwb3N0ZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE9LIHdoZW4gYSBidWZmZXIgdHJhbnNhY3Rpb24gd2FzIHBvc3RlZCBzdWNjZXNzZnVsbHkuCisgICAgICogICAgICAgICBOT1RfRk9VTkQgd2hlbiB0aGUgc2VuZGluZyBjb25uZWN0aW9uIHdhcyBub3QgZm91bmQuCisgICAgICogICAgICAgICBDUklUSUNBTF9FUlJPUiBvdGhlcndpc2UuCisgICAgICovCisgICAgUmVzdWx0U3RhdHVzIHBvc3RTZW5kKENvbm5lY3Rpb25JZCByZWNlaXZlcklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICZidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zYWN0aW9uSWQgKnRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKnRpbWVzdGFtcFVzKTsKKworICAgIC8qKgorICAgICAqICBUaW1lIG91dCBpbmFjdGl2ZSBsaW5nZXJpbmcgY29ubmVjdGlvbnMgYW5kIGNsb3NlLgorICAgICAqLworICAgIHZvaWQgY2xlYW5VcCgpOworCisgICAgLyoqIERlc3RydWN0cyB0aGUgbWFuYWdlciBvZiBidWZmZXIgcG9vbCBjbGllbnRzLiAgKi8KKyAgICB+Q2xpZW50TWFuYWdlcigpOworcHJpdmF0ZToKKyAgICBzdGF0aWMgc3A8Q2xpZW50TWFuYWdlcj4gc0luc3RhbmNlOworICAgIHN0YXRpYyBzdGQ6Om11dGV4IHNJbnN0YW5jZUxvY2s7CisKKyAgICBjbGFzcyBJbXBsOworICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxJbXBsPiBtSW1wbDsKKworICAgIENsaWVudE1hbmFnZXIoKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbgorfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBidWZmZXJwb29sCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjFfMF9DTElFTlRNQU5BR0VSX0gKZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMS4wL3Z0cy9BbmRyb2lkLmJwIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvdnRzL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU1YTc1NwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL3Z0cy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitjY190ZXN0IHsKKyAgICBuYW1lOiAiVnRzVm5ka0hpZGxCdWZmZXJwb29sVjFfMFRhcmdldFNpbmdsZVRlc3QiLAorICAgIGRlZmF1bHRzOiBbIlZ0c0hhbFRhcmdldFRlc3REZWZhdWx0cyJdLAorICAgIHNyY3M6IFsKKyAgICAgICAgImFsbG9jYXRvci5jcHAiLAorICAgICAgICAic2luZ2xlLmNwcCIsCisgICAgXSwKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5idWZmZXJwb29sQDEuMCIsCisgICAgICAgICJsaWJpb24iLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfYnVmZmVycG9vbEAxLjAiLAorICAgIF0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmZtcSIsCisgICAgXSwKKyAgICBjb21waWxlX211bHRpbGliOiAiYm90aCIsCit9CisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJWdHNWbmRrSGlkbEJ1ZmZlcnBvb2xWMV8wVGFyZ2V0TXVsdGlUZXN0IiwKKyAgICBkZWZhdWx0czogWyJWdHNIYWxUYXJnZXRUZXN0RGVmYXVsdHMiXSwKKyAgICBzcmNzOiBbCisgICAgICAgICJhbGxvY2F0b3IuY3BwIiwKKyAgICAgICAgIm11bHRpLmNwcCIsCisgICAgXSwKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5idWZmZXJwb29sQDEuMCIsCisgICAgICAgICJsaWJpb24iLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfYnVmZmVycG9vbEAxLjAiLAorICAgIF0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmZtcSIsCisgICAgXSwKKyAgICBjb21waWxlX211bHRpbGliOiAiYm90aCIsCit9CmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzEuMC92dHMvT1dORVJTIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvdnRzL09XTkVSUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzMzZTBjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvdnRzL09XTkVSUwpAQCAtMCwwICsxLDkgQEAKKyMgTWVkaWEgdGVhbQorbGFqb3NAZ29vZ2xlLmNvbQorcGF3aW5AZ29vZ2xlLmNvbQordGFrbGVlQGdvb2dsZS5jb20KK3dvbnNpa0Bnb29nbGUuY29tCisKKyMgVlRTIHRlYW0KK3lpbUBnb29nbGUuY29tCit6aHVveWFvQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMS4wL3Z0cy9hbGxvY2F0b3IuY3BwIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvdnRzL2FsbG9jYXRvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQzZjdlYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL3Z0cy9hbGxvY2F0b3IuY3BwCkBAIC0wLDAgKzEsMjA5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGN1dGlscy9hc2htZW0uaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorI2luY2x1ZGUgImFsbG9jYXRvci5oIgorCit1bmlvbiBQYXJhbXMgeworICBzdHJ1Y3QgeworICAgIHVpbnQzMl90IGNhcGFjaXR5OworICB9IGRhdGE7CisgIHVpbnQ4X3QgYXJyYXlbMF07CisgIFBhcmFtcygpIDogZGF0YXswfSB7fQorICBQYXJhbXModWludDMyX3Qgc2l6ZSkKKyAgICAgIDogZGF0YXtzaXplfSB7fQorfTsKKworCituYW1lc3BhY2UgeworCitzdHJ1Y3QgSGFuZGxlQXNobWVtIDogcHVibGljIG5hdGl2ZV9oYW5kbGVfdCB7CisgIEhhbmRsZUFzaG1lbShpbnQgYXNobWVtRmQsIHNpemVfdCBzaXplKQorICAgIDogbmF0aXZlX2hhbmRsZV90KGNIZWFkZXIpLAorICAgIG1GZHN7IGFzaG1lbUZkIH0sCisgICAgbUludHN7IGludCAoc2l6ZSAmIDB4RkZGRkZGRkYpLCBpbnQoKHVpbnQ2NF90KHNpemUpID4+IDMyKSAmIDB4RkZGRkZGRkYpLCBrTWFnaWMgfSB7fQorCisgIGludCBhc2htZW1GZCgpIGNvbnN0IHsgcmV0dXJuIG1GZHMubUFzaG1lbTsgfQorICBzaXplX3Qgc2l6ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gc2l6ZV90KHVuc2lnbmVkKG1JbnRzLm1TaXplTG8pKQorICAgICAgICB8IHNpemVfdCh1aW50NjRfdCh1bnNpZ25lZChtSW50cy5tU2l6ZUhpKSkgPDwgMzIpOworICB9CisKKyAgc3RhdGljIGJvb2wgaXNWYWxpZChjb25zdCBuYXRpdmVfaGFuZGxlX3QgKiBjb25zdCBvKTsKKworcHJvdGVjdGVkOgorICBzdHJ1Y3QgeworICAgIGludCBtQXNobWVtOworICB9IG1GZHM7CisgIHN0cnVjdCB7CisgICAgaW50IG1TaXplTG87CisgICAgaW50IG1TaXplSGk7CisgICAgaW50IG1NYWdpYzsKKyAgfSBtSW50czsKKworcHJpdmF0ZToKKyAgZW51bSB7CisgICAga01hZ2ljID0gJ2FobVx4MDAnLAorICAgIG51bUZkcyA9IHNpemVvZihtRmRzKSAvIHNpemVvZihpbnQpLAorICAgIG51bUludHMgPSBzaXplb2YobUludHMpIC8gc2l6ZW9mKGludCksCisgICAgdmVyc2lvbiA9IHNpemVvZihuYXRpdmVfaGFuZGxlX3QpCisgIH07CisgIGNvbnN0IHN0YXRpYyBuYXRpdmVfaGFuZGxlX3QgY0hlYWRlcjsKK307CisKK2NvbnN0IG5hdGl2ZV9oYW5kbGVfdCBIYW5kbGVBc2htZW06OmNIZWFkZXIgPSB7CisgIEhhbmRsZUFzaG1lbTo6dmVyc2lvbiwKKyAgSGFuZGxlQXNobWVtOjpudW1GZHMsCisgIEhhbmRsZUFzaG1lbTo6bnVtSW50cywKKyAge30KK307CisKK2Jvb2wgSGFuZGxlQXNobWVtOjppc1ZhbGlkKGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqIGNvbnN0IG8pIHsKKyAgaWYgKCFvIHx8IG1lbWNtcChvLCAmY0hlYWRlciwgc2l6ZW9mKGNIZWFkZXIpKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBjb25zdCBIYW5kbGVBc2htZW0gKm90aGVyID0gc3RhdGljX2Nhc3Q8Y29uc3QgSGFuZGxlQXNobWVtKj4obyk7CisgIHJldHVybiBvdGhlci0+bUludHMubU1hZ2ljID09IGtNYWdpYzsKK30KKworY2xhc3MgQWxsb2NhdGlvbkFzaG1lbSB7Citwcml2YXRlOgorICBBbGxvY2F0aW9uQXNobWVtKGludCBhc2htZW1GZCwgc2l6ZV90IGNhcGFjaXR5LCBib29sIHJlcykKKyAgICA6IG1IYW5kbGUoYXNobWVtRmQsIGNhcGFjaXR5KSwKKyAgICAgIG1Jbml0KHJlcykge30KKworcHVibGljOgorICBzdGF0aWMgQWxsb2NhdGlvbkFzaG1lbSAqQWxsb2Moc2l6ZV90IHNpemUpIHsKKyAgICBjb25zdGV4cHIgc3RhdGljIGNvbnN0IGNoYXIgKmtBbGxvY2F0aW9uVGFnID0gImJ1ZmZlcnBvb2xfdGVzdCI7CisgICAgaW50IGFzaG1lbUZkID0gYXNobWVtX2NyZWF0ZV9yZWdpb24oa0FsbG9jYXRpb25UYWcsIHNpemUpOworICAgIHJldHVybiBuZXcgQWxsb2NhdGlvbkFzaG1lbShhc2htZW1GZCwgc2l6ZSwgYXNobWVtRmQgPj0gMCk7CisgIH0KKworICB+QWxsb2NhdGlvbkFzaG1lbSgpIHsKKyAgICBpZiAobUluaXQpIHsKKyAgICAgIG5hdGl2ZV9oYW5kbGVfY2xvc2UoJm1IYW5kbGUpOworICAgIH0KKyAgfQorCisgIGNvbnN0IEhhbmRsZUFzaG1lbSAqaGFuZGxlKCkgeworICAgIHJldHVybiAmbUhhbmRsZTsKKyAgfQorCitwcml2YXRlOgorICBIYW5kbGVBc2htZW0gbUhhbmRsZTsKKyAgYm9vbCBtSW5pdDsKKyAgLy8gVE9ETzogbWFwcGluZyBhbmQgbWFwIGZkCit9OworCitzdHJ1Y3QgQWxsb2NhdGlvbkR0b3IgeworICBBbGxvY2F0aW9uRHRvcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QWxsb2NhdGlvbkFzaG1lbT4gJmFsbG9jKQorICAgICAgOiBtQWxsb2MoYWxsb2MpIHt9CisKKyAgdm9pZCBvcGVyYXRvcigpKEJ1ZmZlclBvb2xBbGxvY2F0aW9uICpwb29sQWxsb2MpIHsgZGVsZXRlIHBvb2xBbGxvYzsgfQorCisgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxBbGxvY2F0aW9uQXNobWVtPiBtQWxsb2M7Cit9OworCit9CisKKworUmVzdWx0U3RhdHVzIFRlc3RCdWZmZXJQb29sQWxsb2NhdG9yOjphbGxvY2F0ZSgKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdGlvbj4gKmFsbG9jLAorICAgIHNpemVfdCAqYWxsb2NTaXplKSB7CisgIFBhcmFtcyBhc2htZW1QYXJhbXM7CisgIG1lbWNweSgmYXNobWVtUGFyYW1zLCBwYXJhbXMuZGF0YSgpLCBzdGQ6Om1pbihzaXplb2YoUGFyYW1zKSwgcGFyYW1zLnNpemUoKSkpOworCisgIHN0ZDo6c2hhcmVkX3B0cjxBbGxvY2F0aW9uQXNobWVtPiBhc2htZW1BbGxvYyA9CisgICAgICBzdGQ6OnNoYXJlZF9wdHI8QWxsb2NhdGlvbkFzaG1lbT4oCisgICAgICAgICAgQWxsb2NhdGlvbkFzaG1lbTo6QWxsb2MoYXNobWVtUGFyYW1zLmRhdGEuY2FwYWNpdHkpKTsKKyAgaWYgKGFzaG1lbUFsbG9jKSB7CisgICAgQnVmZmVyUG9vbEFsbG9jYXRpb24gKnB0ciA9IG5ldyBCdWZmZXJQb29sQWxsb2NhdGlvbihhc2htZW1BbGxvYy0+aGFuZGxlKCkpOworICAgIGlmIChwdHIpIHsKKyAgICAgICphbGxvYyA9IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdGlvbj4ocHRyLCBBbGxvY2F0aW9uRHRvcihhc2htZW1BbGxvYykpOworICAgICAgaWYgKCphbGxvYykgeworICAgICAgICAgICphbGxvY1NpemUgPSBhc2htZW1QYXJhbXMuZGF0YS5jYXBhY2l0eTsKKyAgICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpPSzsKKyAgICAgIH0KKyAgICAgIGRlbGV0ZSBwdHI7CisgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpOT19NRU1PUlk7CisgICAgfQorICB9CisgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCitib29sIFRlc3RCdWZmZXJQb29sQWxsb2NhdG9yOjpjb21wYXRpYmxlKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZuZXdQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJm9sZFBhcmFtcykgeworICBzaXplX3QgbmV3U2l6ZSA9IG5ld1BhcmFtcy5zaXplKCk7CisgIHNpemVfdCBvbGRTaXplID0gb2xkUGFyYW1zLnNpemUoKTsKKyAgaWYgKG5ld1NpemUgPT0gb2xkU2l6ZSkgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbmV3U2l6ZTsgKytpKSB7CisgICAgICBpZiAobmV3UGFyYW1zW2ldICE9IG9sZFBhcmFtc1tpXSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBUZXN0QnVmZmVyUG9vbEFsbG9jYXRvcjo6RmlsbChjb25zdCBuYXRpdmVfaGFuZGxlX3QgKmhhbmRsZSwgY29uc3QgdW5zaWduZWQgY2hhciB2YWwpIHsKKyAgaWYgKCFIYW5kbGVBc2htZW06OmlzVmFsaWQoaGFuZGxlKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBjb25zdCBIYW5kbGVBc2htZW0gKm8gPSBzdGF0aWNfY2FzdDxjb25zdCBIYW5kbGVBc2htZW0qPihoYW5kbGUpOworICB1bnNpZ25lZCBjaGFyICpwdHIgPSAodW5zaWduZWQgY2hhciAqKW1tYXAoCisgICAgICBOVUxMLCBvLT5zaXplKCksIFBST1RfUkVBRHxQUk9UX1dSSVRFLCBNQVBfU0hBUkVELCBvLT5hc2htZW1GZCgpLCAwKTsKKworICBpZiAocHRyICE9IE1BUF9GQUlMRUQpIHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG8tPnNpemUoKTsgKytpKSB7CisgICAgICBwdHJbaV0gPSB2YWw7CisgICAgfQorICAgIG11bm1hcChwdHIsIG8tPnNpemUoKSk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCitib29sIFRlc3RCdWZmZXJQb29sQWxsb2NhdG9yOjpWZXJpZnkoY29uc3QgbmF0aXZlX2hhbmRsZV90ICpoYW5kbGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgdmFsKSB7CisgIGlmICghSGFuZGxlQXNobWVtOjppc1ZhbGlkKGhhbmRsZSkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgY29uc3QgSGFuZGxlQXNobWVtICpvID0gc3RhdGljX2Nhc3Q8Y29uc3QgSGFuZGxlQXNobWVtKj4oaGFuZGxlKTsKKyAgdW5zaWduZWQgY2hhciAqcHRyID0gKHVuc2lnbmVkIGNoYXIgKiltbWFwKAorICAgICAgTlVMTCwgby0+c2l6ZSgpLCBQUk9UX1JFQUQsIE1BUF9TSEFSRUQsIG8tPmFzaG1lbUZkKCksIDApOworCisgIGlmIChwdHIgIT0gTUFQX0ZBSUxFRCkgeworICAgIGJvb2wgcmVzID0gdHJ1ZTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG8tPnNpemUoKTsgKytpKSB7CisgICAgICBpZiAocHRyW2ldICE9IHZhbCkgeworICAgICAgICByZXMgPSBmYWxzZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIG11bm1hcChwdHIsIG8tPnNpemUoKSk7CisgICAgcmV0dXJuIHJlczsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgZ2V0VGVzdEFsbG9jYXRvclBhcmFtcyhzdGQ6OnZlY3Rvcjx1aW50OF90PiAqcGFyYW1zKSB7CisgIGNvbnN0ZXhwciBzdGF0aWMgaW50IGtBbGxvY2F0aW9uU2l6ZSA9IDEwMjQgKiAxMDsKKyAgUGFyYW1zIGFzaG1lbVBhcmFtcyhrQWxsb2NhdGlvblNpemUpOworCisgIHBhcmFtcy0+YXNzaWduKGFzaG1lbVBhcmFtcy5hcnJheSwgYXNobWVtUGFyYW1zLmFycmF5ICsgc2l6ZW9mKGFzaG1lbVBhcmFtcykpOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8xLjAvdnRzL2FsbG9jYXRvci5oIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvdnRzL2FsbG9jYXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4NmU1ZjIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzEuMC92dHMvYWxsb2NhdG9yLmgKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVk5ES19ISURMX0JVRkZFUlBPT0xfVjFfMF9BTExPQ0FUT1JfSAorI2RlZmluZSBWTkRLX0hJRExfQlVGRkVSUE9PTF9WMV8wX0FMTE9DQVRPUl9ICisKKyNpbmNsdWRlIDxidWZmZXJwb29sL0J1ZmZlclBvb2xUeXBlcy5oPgorCit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYxXzA6OlJlc3VsdFN0YXR1czsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjFfMDo6aW1wbGVtZW50YXRpb246OgorICAgIEJ1ZmZlclBvb2xBbGxvY2F0aW9uOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMV8wOjppbXBsZW1lbnRhdGlvbjo6CisgICAgQnVmZmVyUG9vbEFsbG9jYXRvcjsKKworLy8gYnVmZmVyIGFsbG9jYXRvciBmb3IgdGhlIHRlc3RzCitjbGFzcyBUZXN0QnVmZmVyUG9vbEFsbG9jYXRvciA6IHB1YmxpYyBCdWZmZXJQb29sQWxsb2NhdG9yIHsKKyBwdWJsaWM6CisgIFRlc3RCdWZmZXJQb29sQWxsb2NhdG9yKCkge30KKworICB+VGVzdEJ1ZmZlclBvb2xBbGxvY2F0b3IoKSBvdmVycmlkZSB7fQorCisgIFJlc3VsdFN0YXR1cyBhbGxvY2F0ZShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0aW9uPiAqYWxsb2MsCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKmFsbG9jU2l6ZSkgb3ZlcnJpZGU7CisKKyAgYm9vbCBjb21wYXRpYmxlKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZuZXdQYXJhbXMsCisgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmb2xkUGFyYW1zKSBvdmVycmlkZTsKKworICBzdGF0aWMgYm9vbCBGaWxsKGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlLCBjb25zdCB1bnNpZ25lZCBjaGFyIHZhbCk7CisKKyAgc3RhdGljIGJvb2wgVmVyaWZ5KGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlLCBjb25zdCB1bnNpZ25lZCBjaGFyIHZhbCk7CisKK307CisKKy8vIHJldHJpZXZlIGJ1ZmZlciBhbGxvY2F0b3IgcGFyYW10ZXJzCit2b2lkIGdldFRlc3RBbGxvY2F0b3JQYXJhbXMoc3RkOjp2ZWN0b3I8dWludDhfdD4gKnBhcmFtcyk7CisKKyNlbmRpZiAgLy8gVk5ES19ISURMX0JVRkZFUlBPT0xfVjFfMF9BTExPQ0FUT1JfSApkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8xLjAvdnRzL211bHRpLmNwcCBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL3Z0cy9tdWx0aS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc5NjgxOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL3Z0cy9tdWx0aS5jcHAKQEAgLTAsMCArMSwyMjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgImJ1ZmZmZXJwb29sX3VuaXRfdGVzdCIKKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGJpbmRlci9Qcm9jZXNzU3RhdGUuaD4KKyNpbmNsdWRlIDxidWZmZXJwb29sL0NsaWVudE1hbmFnZXIuaD4KKyNpbmNsdWRlIDxoaWRsL0hpZGxTdXBwb3J0Lmg+CisjaW5jbHVkZSA8aGlkbC9IaWRsVHJhbnNwb3J0U3VwcG9ydC5oPgorI2luY2x1ZGUgPGhpZGwvTGVnYWN5U3VwcG9ydC5oPgorI2luY2x1ZGUgPGhpZGwvU3RhdHVzLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgImFsbG9jYXRvci5oIgorCit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6Y29uZmlndXJlUnBjVGhyZWFkcG9vbDsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2hhbmRsZTsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjFfMDo6SUNsaWVudE1hbmFnZXI7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYxXzA6OlJlc3VsdFN0YXR1czsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjFfMDo6aW1wbGVtZW50YXRpb246OkJ1ZmZlcklkOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMV8wOjppbXBsZW1lbnRhdGlvbjo6Q2xpZW50TWFuYWdlcjsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjFfMDo6aW1wbGVtZW50YXRpb246OkNvbm5lY3Rpb25JZDsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjFfMDo6aW1wbGVtZW50YXRpb246OlRyYW5zYWN0aW9uSWQ7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OkJ1ZmZlclBvb2xEYXRhOworCituYW1lc3BhY2UgeworCisvLyBjb21tdW5pY2F0aW9uIG1lc3NhZ2UgdHlwZXMgYmV0d2VlbiBwcm9jZXNzZXMuCitlbnVtIFBpcGVDb21tYW5kIDogaW50MzJfdCB7CisgICAgSU5JVF9PSyA9IDAsCisgICAgSU5JVF9FUlJPUiwKKyAgICBTRU5ELAorICAgIFJFQ0VJVkVfT0ssCisgICAgUkVDRUlWRV9FUlJPUiwKK307CisKKy8vIGNvbW11bmljYXRpb24gbWVzc2FnZSBiZXR3ZWVuIHByb2Nlc3Nlcy4KK3VuaW9uIFBpcGVNZXNzYWdlIHsKKyAgICBzdHJ1Y3QgIHsKKyAgICAgICAgaW50MzJfdCBjb21tYW5kOworICAgICAgICBCdWZmZXJJZCBidWZmZXJJZDsKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZDsKKyAgICAgICAgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkOworICAgICAgICBpbnQ2NF90ICB0aW1lc3RhbXBVczsKKyAgICB9IGRhdGE7CisgICAgY2hhciBhcnJheVswXTsKK307CisKKy8vIG1lZGlhLmJ1ZmZlcnBvb2wgdGVzdCBzZXR1cAorY2xhc3MgQnVmZmVycG9vbE11bHRpVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworIHB1YmxpYzoKKyAgdmlydHVhbCB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeworICAgIFJlc3VsdFN0YXR1cyBzdGF0dXM7CisgICAgbVJlY2VpdmVyUGlkID0gLTE7CisgICAgbUNvbm5lY3Rpb25WYWxpZCA9IGZhbHNlOworCisgICAgQVNTRVJUX1RSVUUocGlwZShtQ29tbWFuZFBpcGVGZHMpID09IDApOworICAgIEFTU0VSVF9UUlVFKHBpcGUobVJlc3VsdFBpcGVGZHMpID09IDApOworCisgICAgbVJlY2VpdmVyUGlkID0gZm9yaygpOworICAgIEFTU0VSVF9UUlVFKG1SZWNlaXZlclBpZCA+PSAwKTsKKworICAgIGlmIChtUmVjZWl2ZXJQaWQgPT0gMCkgeworICAgICAgZG9SZWNlaXZlcigpOworICAgICAgLy8gSW4gb3JkZXIgdG8gaWdub3JlIGd0ZXN0IGJlaGF2aW91ciwgd2FpdCBmb3IgYmVpbmcga2lsbGVkIGZyb20KKyAgICAgIC8vIHRlYXJEb3duCisgICAgICBwYXVzZSgpOworICAgIH0KKworICAgIG1NYW5hZ2VyID0gQ2xpZW50TWFuYWdlcjo6Z2V0SW5zdGFuY2UoKTsKKyAgICBBU1NFUlRfTkUobU1hbmFnZXIsIG51bGxwdHIpOworCisgICAgbUFsbG9jYXRvciA9IHN0ZDo6bWFrZV9zaGFyZWQ8VGVzdEJ1ZmZlclBvb2xBbGxvY2F0b3I+KCk7CisgICAgQVNTRVJUX1RSVUUoKGJvb2wpbUFsbG9jYXRvcik7CisKKyAgICBzdGF0dXMgPSBtTWFuYWdlci0+Y3JlYXRlKG1BbGxvY2F0b3IsICZtQ29ubmVjdGlvbklkKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSyk7CisgICAgbUNvbm5lY3Rpb25WYWxpZCA9IHRydWU7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7CisgICAgaWYgKG1SZWNlaXZlclBpZCA+IDApIHsKKyAgICAgIGtpbGwobVJlY2VpdmVyUGlkLCBTSUdLSUxMKTsKKyAgICAgIGludCB3c3RhdHVzOworICAgICAgd2FpdCgmd3N0YXR1cyk7CisgICAgfQorCisgICAgaWYgKG1Db25uZWN0aW9uVmFsaWQpIHsKKyAgICAgIG1NYW5hZ2VyLT5jbG9zZShtQ29ubmVjdGlvbklkKTsKKyAgICB9CisgIH0KKworIHByb3RlY3RlZDoKKyAgc3RhdGljIHZvaWQgZGVzY3JpcHRpb24oY29uc3Qgc3RkOjpzdHJpbmcmIGRlc2NyaXB0aW9uKSB7CisgICAgUmVjb3JkUHJvcGVydHkoImRlc2NyaXB0aW9uIiwgZGVzY3JpcHRpb24pOworICB9CisKKyAgYW5kcm9pZDo6c3A8Q2xpZW50TWFuYWdlcj4gbU1hbmFnZXI7CisgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdG9yPiBtQWxsb2NhdG9yOworICBib29sIG1Db25uZWN0aW9uVmFsaWQ7CisgIENvbm5lY3Rpb25JZCBtQ29ubmVjdGlvbklkOworICBwaWRfdCBtUmVjZWl2ZXJQaWQ7CisgIGludCBtQ29tbWFuZFBpcGVGZHNbMl07CisgIGludCBtUmVzdWx0UGlwZUZkc1syXTsKKworICBib29sIHNlbmRNZXNzYWdlKGludCAqcGlwZXMsIGNvbnN0IFBpcGVNZXNzYWdlICZtZXNzYWdlKSB7CisgICAgaW50IHJldCA9IHdyaXRlKHBpcGVzWzFdLCBtZXNzYWdlLmFycmF5LCBzaXplb2YoUGlwZU1lc3NhZ2UpKTsKKyAgICByZXR1cm4gcmV0ID09IHNpemVvZihQaXBlTWVzc2FnZSk7CisgIH0KKworICBib29sIHJlY2VpdmVNZXNzYWdlKGludCAqcGlwZXMsIFBpcGVNZXNzYWdlICptZXNzYWdlKSB7CisgICAgaW50IHJldCA9IHJlYWQocGlwZXNbMF0sIG1lc3NhZ2UtPmFycmF5LCBzaXplb2YoUGlwZU1lc3NhZ2UpKTsKKyAgICByZXR1cm4gcmV0ID09IHNpemVvZihQaXBlTWVzc2FnZSk7CisgIH0KKworICB2b2lkIGRvUmVjZWl2ZXIoKSB7CisgICAgY29uZmlndXJlUnBjVGhyZWFkcG9vbCgxLCBmYWxzZSk7CisgICAgUGlwZU1lc3NhZ2UgbWVzc2FnZTsKKyAgICBtTWFuYWdlciA9IENsaWVudE1hbmFnZXI6OmdldEluc3RhbmNlKCk7CisgICAgaWYgKCFtTWFuYWdlcikgeworICAgICAgbWVzc2FnZS5kYXRhLmNvbW1hbmQgPSBQaXBlQ29tbWFuZDo6SU5JVF9FUlJPUjsKKyAgICAgIHNlbmRNZXNzYWdlKG1SZXN1bHRQaXBlRmRzLCBtZXNzYWdlKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgYW5kcm9pZDo6c3RhdHVzX3Qgc3RhdHVzID0gbU1hbmFnZXItPnJlZ2lzdGVyQXNTZXJ2aWNlKCk7CisgICAgaWYgKHN0YXR1cyAhPSBhbmRyb2lkOjpPSykgeworICAgICAgbWVzc2FnZS5kYXRhLmNvbW1hbmQgPSBQaXBlQ29tbWFuZDo6SU5JVF9FUlJPUjsKKyAgICAgIHNlbmRNZXNzYWdlKG1SZXN1bHRQaXBlRmRzLCBtZXNzYWdlKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgbWVzc2FnZS5kYXRhLmNvbW1hbmQgPSBQaXBlQ29tbWFuZDo6SU5JVF9PSzsKKyAgICBzZW5kTWVzc2FnZShtUmVzdWx0UGlwZUZkcywgbWVzc2FnZSk7CisKKyAgICByZWNlaXZlTWVzc2FnZShtQ29tbWFuZFBpcGVGZHMsICZtZXNzYWdlKTsKKyAgICB7CisgICAgICBuYXRpdmVfaGFuZGxlX3QgKnJoYW5kbGUgPSBudWxscHRyOworICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiByYnVmZmVyOworICAgICAgUmVzdWx0U3RhdHVzIHN0YXR1cyA9IG1NYW5hZ2VyLT5yZWNlaXZlKAorICAgICAgICAgIG1lc3NhZ2UuZGF0YS5jb25uZWN0aW9uSWQsIG1lc3NhZ2UuZGF0YS50cmFuc2FjdGlvbklkLAorICAgICAgICAgIG1lc3NhZ2UuZGF0YS5idWZmZXJJZCwgbWVzc2FnZS5kYXRhLnRpbWVzdGFtcFVzLCAmcmhhbmRsZSwgJnJidWZmZXIpOworICAgICAgbU1hbmFnZXItPmNsb3NlKG1lc3NhZ2UuZGF0YS5jb25uZWN0aW9uSWQpOworICAgICAgaWYgKHN0YXR1cyAhPSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgIGlmICghVGVzdEJ1ZmZlclBvb2xBbGxvY2F0b3I6OlZlcmlmeShyaGFuZGxlLCAweDc3KSkgeworICAgICAgICAgIG1lc3NhZ2UuZGF0YS5jb21tYW5kID0gUGlwZUNvbW1hbmQ6OlJFQ0VJVkVfRVJST1I7CisgICAgICAgICAgc2VuZE1lc3NhZ2UobVJlc3VsdFBpcGVGZHMsIG1lc3NhZ2UpOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBtZXNzYWdlLmRhdGEuY29tbWFuZCA9IFBpcGVDb21tYW5kOjpSRUNFSVZFX09LOworICAgIHNlbmRNZXNzYWdlKG1SZXN1bHRQaXBlRmRzLCBtZXNzYWdlKTsKKyAgfQorfTsKKworLy8gQnVmZmVyIHRyYW5zZmVyIHRlc3QgYmV0d2VlbiBwcm9jZXNzZXMuCitURVNUX0YoQnVmZmVycG9vbE11bHRpVGVzdCwgVHJhbnNmZXJCdWZmZXIpIHsKKyAgUmVzdWx0U3RhdHVzIHN0YXR1czsKKyAgUGlwZU1lc3NhZ2UgbWVzc2FnZTsKKworICBBU1NFUlRfVFJVRShyZWNlaXZlTWVzc2FnZShtUmVzdWx0UGlwZUZkcywgJm1lc3NhZ2UpKTsKKworICBhbmRyb2lkOjpzcDxJQ2xpZW50TWFuYWdlcj4gcmVjZWl2ZXIgPSBJQ2xpZW50TWFuYWdlcjo6Z2V0U2VydmljZSgpOworICBDb25uZWN0aW9uSWQgcmVjZWl2ZXJJZDsKKyAgQVNTRVJUX1RSVUUoKGJvb2wpcmVjZWl2ZXIpOworCisgIHN0YXR1cyA9IG1NYW5hZ2VyLT5yZWdpc3RlclNlbmRlcihyZWNlaXZlciwgbUNvbm5lY3Rpb25JZCwgJnJlY2VpdmVySWQpOworICBBU1NFUlRfVFJVRShzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSyk7CisgIHsKKyAgICBuYXRpdmVfaGFuZGxlX3QgKnNoYW5kbGUgPSBudWxscHRyOworICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gc2J1ZmZlcjsKKyAgICBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQ7CisgICAgaW50NjRfdCBwb3N0VXM7CisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmVjUGFyYW1zOworCisgICAgZ2V0VGVzdEFsbG9jYXRvclBhcmFtcygmdmVjUGFyYW1zKTsKKyAgICBzdGF0dXMgPSBtTWFuYWdlci0+YWxsb2NhdGUobUNvbm5lY3Rpb25JZCwgdmVjUGFyYW1zLCAmc2hhbmRsZSwgJnNidWZmZXIpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKTsKKworICAgIEFTU0VSVF9UUlVFKFRlc3RCdWZmZXJQb29sQWxsb2NhdG9yOjpGaWxsKHNoYW5kbGUsIDB4NzcpKTsKKworICAgIHN0YXR1cyA9IG1NYW5hZ2VyLT5wb3N0U2VuZChyZWNlaXZlcklkLCBzYnVmZmVyLCAmdHJhbnNhY3Rpb25JZCwgJnBvc3RVcyk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spOworCisgICAgbWVzc2FnZS5kYXRhLmNvbW1hbmQgPSBQaXBlQ29tbWFuZDo6U0VORDsKKyAgICBtZXNzYWdlLmRhdGEuYnVmZmVySWQgPSBzYnVmZmVyLT5tSWQ7CisgICAgbWVzc2FnZS5kYXRhLmNvbm5lY3Rpb25JZCA9IHJlY2VpdmVySWQ7CisgICAgbWVzc2FnZS5kYXRhLnRyYW5zYWN0aW9uSWQgPSB0cmFuc2FjdGlvbklkOworICAgIG1lc3NhZ2UuZGF0YS50aW1lc3RhbXBVcyA9IHBvc3RVczsKKyAgICBzZW5kTWVzc2FnZShtQ29tbWFuZFBpcGVGZHMsIG1lc3NhZ2UpOworICB9CisgIEVYUEVDVF9UUlVFKHJlY2VpdmVNZXNzYWdlKG1SZXN1bHRQaXBlRmRzLCAmbWVzc2FnZSkpOworfQorCit9ICAvLyBhbm9ueW1vdXMgbmFtZXNwYWNlCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgeworICBzZXRlbnYoIlRSRUJMRV9URVNUSU5HX09WRVJSSURFIiwgInRydWUiLCB0cnVlKTsKKyAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CisgIGludCBzdGF0dXMgPSBSVU5fQUxMX1RFU1RTKCk7CisgIExPRyhJTkZPKSA8PCAiVGVzdCByZXN1bHQgPSAiIDw8IHN0YXR1czsKKyAgcmV0dXJuIHN0YXR1czsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMS4wL3Z0cy9zaW5nbGUuY3BwIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvdnRzL3NpbmdsZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjczZWI2MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL3Z0cy9zaW5nbGUuY3BwCkBAIC0wLDAgKzEsMTY2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJidWZmZmVycG9vbF91bml0X3Rlc3QiCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUHJvY2Vzc1N0YXRlLmg+CisjaW5jbHVkZSA8YnVmZmVycG9vbC9DbGllbnRNYW5hZ2VyLmg+CisjaW5jbHVkZSA8aGlkbC9IaWRsU3VwcG9ydC5oPgorI2luY2x1ZGUgPGhpZGwvSGlkbFRyYW5zcG9ydFN1cHBvcnQuaD4KKyNpbmNsdWRlIDxoaWRsL0xlZ2FjeVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxoaWRsL1N0YXR1cy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSAiYWxsb2NhdG9yLmgiCisKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2hhbmRsZTsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjFfMDo6UmVzdWx0U3RhdHVzOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMV8wOjppbXBsZW1lbnRhdGlvbjo6QnVmZmVySWQ7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYxXzA6OmltcGxlbWVudGF0aW9uOjpDbGllbnRNYW5hZ2VyOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMV8wOjppbXBsZW1lbnRhdGlvbjo6Q29ubmVjdGlvbklkOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMV8wOjppbXBsZW1lbnRhdGlvbjo6VHJhbnNhY3Rpb25JZDsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6QnVmZmVyUG9vbERhdGE7CisKK25hbWVzcGFjZSB7CisKKy8vIE51bWJlciBvZiBpdGVyYXRpb24gZm9yIGJ1ZmZlciBhbGxvY2F0aW9uIHRlc3QuCitjb25zdGV4cHIgc3RhdGljIGludCBrTnVtQWxsb2NhdGlvblRlc3QgPSAzOworCisvLyBOdW1iZXIgb2YgaXRlcmF0aW9uIGZvciBidWZmZXIgcmVjeWNsaW5nIHRlc3QuCitjb25zdGV4cHIgc3RhdGljIGludCBrTnVtUmVjeWNsZVRlc3QgPSAzOworCisvLyBtZWRpYS5idWZmZXJwb29sIHRlc3Qgc2V0dXAKK2NsYXNzIEJ1ZmZlcnBvb2xTaW5nbGVUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CisgcHVibGljOgorICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7CisgICAgUmVzdWx0U3RhdHVzIHN0YXR1czsKKyAgICBtQ29ubmVjdGlvblZhbGlkID0gZmFsc2U7CisKKyAgICBtTWFuYWdlciA9IENsaWVudE1hbmFnZXI6OmdldEluc3RhbmNlKCk7CisgICAgQVNTRVJUX05FKG1NYW5hZ2VyLCBudWxscHRyKTsKKworICAgIG1BbGxvY2F0b3IgPSBzdGQ6Om1ha2Vfc2hhcmVkPFRlc3RCdWZmZXJQb29sQWxsb2NhdG9yPigpOworICAgIEFTU0VSVF9UUlVFKChib29sKW1BbGxvY2F0b3IpOworCisgICAgc3RhdHVzID0gbU1hbmFnZXItPmNyZWF0ZShtQWxsb2NhdG9yLCAmbUNvbm5lY3Rpb25JZCk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spOworCisgICAgbUNvbm5lY3Rpb25WYWxpZCA9IHRydWU7CisKKyAgICBzdGF0dXMgPSBtTWFuYWdlci0+cmVnaXN0ZXJTZW5kZXIobU1hbmFnZXIsIG1Db25uZWN0aW9uSWQsICZtUmVjZWl2ZXJJZCk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6QUxSRUFEWV9FWElTVFMgJiYKKyAgICAgICAgICAgICAgICBtUmVjZWl2ZXJJZCA9PSBtQ29ubmVjdGlvbklkKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlIHsKKyAgICBpZiAobUNvbm5lY3Rpb25WYWxpZCkgeworICAgICAgbU1hbmFnZXItPmNsb3NlKG1Db25uZWN0aW9uSWQpOworICAgIH0KKyAgfQorCisgcHJvdGVjdGVkOgorICBzdGF0aWMgdm9pZCBkZXNjcmlwdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgZGVzY3JpcHRpb24pIHsKKyAgICBSZWNvcmRQcm9wZXJ0eSgiZGVzY3JpcHRpb24iLCBkZXNjcmlwdGlvbik7CisgIH0KKworICBhbmRyb2lkOjpzcDxDbGllbnRNYW5hZ2VyPiBtTWFuYWdlcjsKKyAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0b3I+IG1BbGxvY2F0b3I7CisgIGJvb2wgbUNvbm5lY3Rpb25WYWxpZDsKKyAgQ29ubmVjdGlvbklkIG1Db25uZWN0aW9uSWQ7CisgIENvbm5lY3Rpb25JZCBtUmVjZWl2ZXJJZDsKKworfTsKKworLy8gQnVmZmVyIGFsbG9jYXRpb24gdGVzdC4KKy8vIENoZWNrIHdoZXRoZXIgZWFjaCBidWZmZXIgYWxsb2NhdGlvbiBpcyBkb25lIHN1Y2Nlc3NmdWxseSB3aXRoCisvLyB1bmlxdWUgYnVmZmVyIGlkLgorVEVTVF9GKEJ1ZmZlcnBvb2xTaW5nbGVUZXN0LCBBbGxvY2F0ZUJ1ZmZlcikgeworICBSZXN1bHRTdGF0dXMgc3RhdHVzOworICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2ZWNQYXJhbXM7CisgIGdldFRlc3RBbGxvY2F0b3JQYXJhbXMoJnZlY1BhcmFtcyk7CisKKyAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiBidWZmZXJba051bUFsbG9jYXRpb25UZXN0XTsKKyAgbmF0aXZlX2hhbmRsZV90ICphbGxvY0hhbmRsZSA9IG51bGxwdHI7CisgIGZvciAoaW50IGkgPSAwOyBpIDwga051bUFsbG9jYXRpb25UZXN0OyArK2kpIHsKKyAgICBzdGF0dXMgPSBtTWFuYWdlci0+YWxsb2NhdGUobUNvbm5lY3Rpb25JZCwgdmVjUGFyYW1zLCAmYWxsb2NIYW5kbGUsICZidWZmZXJbaV0pOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKTsKKyAgfQorICBmb3IgKGludCBpID0gMDsgaSA8IGtOdW1BbGxvY2F0aW9uVGVzdDsgKytpKSB7CisgICAgZm9yIChpbnQgaiA9IGkgKyAxOyBqIDwga051bUFsbG9jYXRpb25UZXN0OyArK2opIHsKKyAgICAgIEFTU0VSVF9UUlVFKGJ1ZmZlcltpXS0+bUlkICE9IGJ1ZmZlcltqXS0+bUlkKTsKKyAgICB9CisgIH0KKyAgRVhQRUNUX1RSVUUoa051bUFsbG9jYXRpb25UZXN0ID4gMSk7Cit9CisKKy8vIEJ1ZmZlciByZWN5Y2xlIHRlc3QuCisvLyBDaGVjayB3aGV0aGVyIGRlLWFsbG9jYXRlZCBidWZmZXJzIGFyZSByZWN5Y2xlZC4KK1RFU1RfRihCdWZmZXJwb29sU2luZ2xlVGVzdCwgUmVjeWNsZUJ1ZmZlcikgeworICBSZXN1bHRTdGF0dXMgc3RhdHVzOworICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2ZWNQYXJhbXM7CisgIGdldFRlc3RBbGxvY2F0b3JQYXJhbXMoJnZlY1BhcmFtcyk7CisKKyAgQnVmZmVySWQgYmlkW2tOdW1SZWN5Y2xlVGVzdF07CisgIGZvciAoaW50IGkgPSAwOyBpIDwga051bVJlY3ljbGVUZXN0OyArK2kpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+IGJ1ZmZlcjsKKyAgICBuYXRpdmVfaGFuZGxlX3QgKmFsbG9jSGFuZGxlID0gbnVsbHB0cjsKKyAgICBzdGF0dXMgPSBtTWFuYWdlci0+YWxsb2NhdGUobUNvbm5lY3Rpb25JZCwgdmVjUGFyYW1zLCAmYWxsb2NIYW5kbGUsICZidWZmZXIpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKTsKKyAgICBiaWRbaV0gPSBidWZmZXItPm1JZDsKKyAgfQorICBmb3IgKGludCBpID0gMTsgaSA8IGtOdW1SZWN5Y2xlVGVzdDsgKytpKSB7CisgICAgQVNTRVJUX1RSVUUoYmlkW2kgLSAxXSA9PSBiaWRbaV0pOworICB9CisgIEVYUEVDVF9UUlVFKGtOdW1SZWN5Y2xlVGVzdCA+IDEpOworfQorCisvLyBCdWZmZXIgdHJhbnNmZXIgdGVzdC4KKy8vIENoZWNrIHdoZXRoZXIgYnVmZmVyIGlzIHRyYW5zZmVycmVkIHRvIGFub3RoZXIgY2xpZW50IHN1Y2Nlc3NmdWxseS4KK1RFU1RfRihCdWZmZXJwb29sU2luZ2xlVGVzdCwgVHJhbnNmZXJCdWZmZXIpIHsKKyAgUmVzdWx0U3RhdHVzIHN0YXR1czsKKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmVjUGFyYW1zOworICBnZXRUZXN0QWxsb2NhdG9yUGFyYW1zKCZ2ZWNQYXJhbXMpOworICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+IHNidWZmZXIsIHJidWZmZXI7CisgIG5hdGl2ZV9oYW5kbGVfdCAqYWxsb2NIYW5kbGUgPSBudWxscHRyOworICBuYXRpdmVfaGFuZGxlX3QgKnJlY3ZIYW5kbGUgPSBudWxscHRyOworCisgIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZDsKKyAgaW50NjRfdCBwb3N0VXM7CisKKyAgc3RhdHVzID0gbU1hbmFnZXItPmFsbG9jYXRlKG1Db25uZWN0aW9uSWQsIHZlY1BhcmFtcywgJmFsbG9jSGFuZGxlLCAmc2J1ZmZlcik7CisgIEFTU0VSVF9UUlVFKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKTsKKyAgQVNTRVJUX1RSVUUoVGVzdEJ1ZmZlclBvb2xBbGxvY2F0b3I6OkZpbGwoYWxsb2NIYW5kbGUsIDB4NzcpKTsKKyAgc3RhdHVzID0gbU1hbmFnZXItPnBvc3RTZW5kKG1SZWNlaXZlcklkLCBzYnVmZmVyLCAmdHJhbnNhY3Rpb25JZCwgJnBvc3RVcyk7CisgIEFTU0VSVF9UUlVFKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKTsKKyAgc3RhdHVzID0gbU1hbmFnZXItPnJlY2VpdmUobVJlY2VpdmVySWQsIHRyYW5zYWN0aW9uSWQsIHNidWZmZXItPm1JZCwgcG9zdFVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVjdkhhbmRsZSwgJnJidWZmZXIpOworICBFWFBFQ1RfVFJVRShzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSyk7CisgIEFTU0VSVF9UUlVFKFRlc3RCdWZmZXJQb29sQWxsb2NhdG9yOjpWZXJpZnkocmVjdkhhbmRsZSwgMHg3NykpOworfQorCit9ICAvLyBhbm9ueW1vdXMgbmFtZXNwYWNlCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgeworICA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKyAgaW50IHN0YXR1cyA9IFJVTl9BTExfVEVTVFMoKTsKKyAgTE9HKElORk8pIDw8ICJUZXN0IHJlc3VsdCA9ICIgPDwgc3RhdHVzOworICByZXR1cm4gc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8yLjAvQWNjZXNzb3IuY3BwIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvQWNjZXNzb3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3YjQ2MDkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzIuMC9BY2Nlc3Nvci5jcHAKQEAgLTAsMCArMSwyMjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2RlZmluZSBMT0dfVEFHICJCdWZmZXJQb29sQ29ubmVjdGlvbiIKKworI2luY2x1ZGUgIkFjY2Vzc29yLmgiCisjaW5jbHVkZSAiQWNjZXNzb3JJbXBsLmgiCisjaW5jbHVkZSAiQ29ubmVjdGlvbi5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBidWZmZXJwb29sIHsKK25hbWVzcGFjZSBWMl8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKK3ZvaWQgQ29ubmVjdGlvbkRlYXRoUmVjaXBpZW50OjphZGQoCisgICAgICAgIGludDY0X3QgY29ubmVjdGlvbklkLAorICAgICAgICBjb25zdCBzcDxBY2Nlc3Nvcj4gJmFjY2Vzc29yKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgIGlmIChtQWNjZXNzb3JzLmZpbmQoY29ubmVjdGlvbklkKSA9PSBtQWNjZXNzb3JzLmVuZCgpKSB7CisgICAgICAgIG1BY2Nlc3NvcnMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKGNvbm5lY3Rpb25JZCwgYWNjZXNzb3IpKTsKKyAgICB9Cit9CisKK3ZvaWQgQ29ubmVjdGlvbkRlYXRoUmVjaXBpZW50OjpyZW1vdmUoaW50NjRfdCBjb25uZWN0aW9uSWQpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CisgICAgbUFjY2Vzc29ycy5lcmFzZShjb25uZWN0aW9uSWQpOworICAgIGF1dG8gaXQgPSBtQ29ubmVjdGlvblRvQ29va2llLmZpbmQoY29ubmVjdGlvbklkKTsKKyAgICBpZiAoaXQgIT0gbUNvbm5lY3Rpb25Ub0Nvb2tpZS5lbmQoKSkgeworICAgICAgICB1aW50NjRfdCBjb29raWUgPSBpdC0+c2Vjb25kOworICAgICAgICBtQ29ubmVjdGlvblRvQ29va2llLmVyYXNlKGl0KTsKKyAgICAgICAgYXV0byBjaXQgPSBtQ29va2llVG9Db25uZWN0aW9ucy5maW5kKGNvb2tpZSk7CisgICAgICAgIGlmIChjaXQgIT0gbUNvb2tpZVRvQ29ubmVjdGlvbnMuZW5kKCkpIHsKKyAgICAgICAgICAgIGNpdC0+c2Vjb25kLmVyYXNlKGNvbm5lY3Rpb25JZCk7CisgICAgICAgICAgICBpZiAoY2l0LT5zZWNvbmQuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgICAgICBtQ29va2llVG9Db25uZWN0aW9ucy5lcmFzZShjaXQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCit2b2lkIENvbm5lY3Rpb25EZWF0aFJlY2lwaWVudDo6YWRkQ29va2llVG9Db25uZWN0aW9uKAorICAgICAgICB1aW50NjRfdCBjb29raWUsCisgICAgICAgIGludDY0X3QgY29ubmVjdGlvbklkKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgIGlmIChtQWNjZXNzb3JzLmZpbmQoY29ubmVjdGlvbklkKSA9PSBtQWNjZXNzb3JzLmVuZCgpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbUNvbm5lY3Rpb25Ub0Nvb2tpZS5pbnNlcnQoc3RkOjptYWtlX3BhaXIoY29ubmVjdGlvbklkLCBjb29raWUpKTsKKyAgICBhdXRvIGl0ID0gbUNvb2tpZVRvQ29ubmVjdGlvbnMuZmluZChjb29raWUpOworICAgIGlmIChpdCAhPSBtQ29va2llVG9Db25uZWN0aW9ucy5lbmQoKSkgeworICAgICAgICBpdC0+c2Vjb25kLmluc2VydChjb25uZWN0aW9uSWQpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1Db29raWVUb0Nvbm5lY3Rpb25zLmluc2VydChzdGQ6Om1ha2VfcGFpcigKKyAgICAgICAgICAgICAgICBjb29raWUsIHN0ZDo6c2V0PGludDY0X3Q+e2Nvbm5lY3Rpb25JZH0pKTsKKyAgICB9Cit9CisKK3ZvaWQgQ29ubmVjdGlvbkRlYXRoUmVjaXBpZW50OjpzZXJ2aWNlRGllZCgKKyAgICAgICAgdWludDY0X3QgY29va2llLAorICAgICAgICBjb25zdCB3cDw6OmFuZHJvaWQ6OmhpZGw6OmJhc2U6OlYxXzA6OklCYXNlPiYgLyogd2hvICovCisgICAgICAgICkgeworICAgIHN0ZDo6bWFwPGludDY0X3QsIGNvbnN0IHdwPEFjY2Vzc29yPj4gY29ubmVjdGlvbnNUb0Nsb3NlOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworCisgICAgICAgIGF1dG8gaXQgPSBtQ29va2llVG9Db25uZWN0aW9ucy5maW5kKGNvb2tpZSk7CisgICAgICAgIGlmIChpdCAhPSBtQ29va2llVG9Db25uZWN0aW9ucy5lbmQoKSkgeworICAgICAgICAgICAgZm9yIChhdXRvIGNvbkl0ID0gaXQtPnNlY29uZC5iZWdpbigpOyBjb25JdCAhPSBpdC0+c2Vjb25kLmVuZCgpOyArK2Nvbkl0KSB7CisgICAgICAgICAgICAgICAgYXV0byBhY2Nlc3Nvckl0ID0gbUFjY2Vzc29ycy5maW5kKCpjb25JdCk7CisgICAgICAgICAgICAgICAgaWYgKGFjY2Vzc29ySXQgIT0gbUFjY2Vzc29ycy5lbmQoKSkgeworICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uc1RvQ2xvc2UuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKCpjb25JdCwgYWNjZXNzb3JJdC0+c2Vjb25kKSk7CisgICAgICAgICAgICAgICAgICAgIG1BY2Nlc3NvcnMuZXJhc2UoYWNjZXNzb3JJdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1Db25uZWN0aW9uVG9Db29raWUuZXJhc2UoKmNvbkl0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1Db29raWVUb0Nvbm5lY3Rpb25zLmVyYXNlKGl0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChjb25uZWN0aW9uc1RvQ2xvc2Uuc2l6ZSgpID4gMCkgeworICAgICAgICBzcDxBY2Nlc3Nvcj4gYWNjZXNzb3I7CisgICAgICAgIGZvciAoYXV0byBpdCA9IGNvbm5lY3Rpb25zVG9DbG9zZS5iZWdpbigpOyBpdCAhPSBjb25uZWN0aW9uc1RvQ2xvc2UuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgICAgIGFjY2Vzc29yID0gaXQtPnNlY29uZC5wcm9tb3RlKCk7CisKKyAgICAgICAgICAgIGlmIChhY2Nlc3NvcikgeworICAgICAgICAgICAgICAgIGFjY2Vzc29yLT5jbG9zZShpdC0+Zmlyc3QpOworICAgICAgICAgICAgICAgIEFMT0dEKCJjb25uZWN0aW9uICVsbGQgY2xvc2VkIG9uIGRlYXRoIiwgKGxvbmcgbG9uZylpdC0+Zmlyc3QpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCituYW1lc3BhY2Ugeworc3RhdGljIHNwPENvbm5lY3Rpb25EZWF0aFJlY2lwaWVudD4gc0Nvbm5lY3Rpb25EZWF0aFJlY2lwaWVudCA9CisgICAgICAgIG5ldyBDb25uZWN0aW9uRGVhdGhSZWNpcGllbnQoKTsKK30KKworc3A8Q29ubmVjdGlvbkRlYXRoUmVjaXBpZW50PiBBY2Nlc3Nvcjo6Z2V0Q29ubmVjdGlvbkRlYXRoUmVjaXBpZW50KCkgeworICAgIHJldHVybiBzQ29ubmVjdGlvbkRlYXRoUmVjaXBpZW50OworfQorCit2b2lkIEFjY2Vzc29yOjpjcmVhdGVJbnZhbGlkYXRvcigpIHsKKyAgICBBY2Nlc3Nvcjo6SW1wbDo6Y3JlYXRlSW52YWxpZGF0b3IoKTsKK30KKworLy8gTWV0aG9kcyBmcm9tIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjpJQWNjZXNzb3IgZm9sbG93LgorUmV0dXJuPHZvaWQ+IEFjY2Vzc29yOjpjb25uZWN0KAorICAgICAgICBjb25zdCBzcDw6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6SU9ic2VydmVyPiYgb2JzZXJ2ZXIsCisgICAgICAgIGNvbm5lY3RfY2IgX2hpZGxfY2IpIHsKKyAgICBzcDxDb25uZWN0aW9uPiBjb25uZWN0aW9uOworICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQ7CisgICAgdWludDMyX3QgbXNnSWQ7CisgICAgY29uc3QgU3RhdHVzRGVzY3JpcHRvciogZm1xRGVzYzsKKyAgICBjb25zdCBJbnZhbGlkYXRpb25EZXNjcmlwdG9yKiBpbnZEZXNjOworCisgICAgUmVzdWx0U3RhdHVzIHN0YXR1cyA9IGNvbm5lY3QoCisgICAgICAgICAgICBvYnNlcnZlciwgZmFsc2UsICZjb25uZWN0aW9uLCAmY29ubmVjdGlvbklkLCAmbXNnSWQsICZmbXFEZXNjLCAmaW52RGVzYyk7CisgICAgaWYgKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgIF9oaWRsX2NiKHN0YXR1cywgY29ubmVjdGlvbiwgY29ubmVjdGlvbklkLCBtc2dJZCwgKmZtcURlc2MsICppbnZEZXNjKTsKKyAgICB9IGVsc2UgeworICAgICAgICBfaGlkbF9jYihzdGF0dXMsIG51bGxwdHIsIC0xTEwsIDAsCisgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OmhhcmR3YXJlOjpNUURlc2NyaXB0b3JTeW5jPEJ1ZmZlclN0YXR1c01lc3NhZ2U+KAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGFuZHJvaWQ6OmhhcmR3YXJlOjpHcmFudG9yRGVzY3JpcHRvcj4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyIC8qIG5oYW5kbGUgKi8sIDAgLyogc2l6ZSAqLyksCisgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OmhhcmR3YXJlOjpNUURlc2NyaXB0b3JVbnN5bmM8QnVmZmVySW52YWxpZGF0aW9uTWVzc2FnZT4oCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8YW5kcm9pZDo6aGFyZHdhcmU6OkdyYW50b3JEZXNjcmlwdG9yPigpLAorICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIgLyogbmhhbmRsZSAqLywgMCAvKiBzaXplICovKSk7CisgICAgfQorICAgIHJldHVybiBWb2lkKCk7Cit9CisKK0FjY2Vzc29yOjpBY2Nlc3Nvcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRvcj4gJmFsbG9jYXRvcikKKyAgICA6IG1JbXBsKG5ldyBJbXBsKGFsbG9jYXRvcikpIHt9CisKK0FjY2Vzc29yOjp+QWNjZXNzb3IoKSB7Cit9CisKK2Jvb2wgQWNjZXNzb3I6OmlzVmFsaWQoKSB7CisgICAgcmV0dXJuIChib29sKW1JbXBsICYmIG1JbXBsLT5pc1ZhbGlkKCk7Cit9CisKK1Jlc3VsdFN0YXR1cyBBY2Nlc3Nvcjo6Zmx1c2goKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIG1JbXBsLT5mbHVzaCgpOworICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpPSzsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK1Jlc3VsdFN0YXR1cyBBY2Nlc3Nvcjo6YWxsb2NhdGUoCisgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZwYXJhbXMsCisgICAgICAgIEJ1ZmZlcklkICpidWZmZXJJZCwgY29uc3QgbmF0aXZlX2hhbmRsZV90KiogaGFuZGxlKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+YWxsb2NhdGUoY29ubmVjdGlvbklkLCBwYXJhbXMsIGJ1ZmZlcklkLCBoYW5kbGUpOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworUmVzdWx0U3RhdHVzIEFjY2Vzc29yOjpmZXRjaCgKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLAorICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCwgY29uc3QgbmF0aXZlX2hhbmRsZV90KiogaGFuZGxlKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+ZmV0Y2goY29ubmVjdGlvbklkLCB0cmFuc2FjdGlvbklkLCBidWZmZXJJZCwgaGFuZGxlKTsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK1Jlc3VsdFN0YXR1cyBBY2Nlc3Nvcjo6Y29ubmVjdCgKKyAgICAgICAgY29uc3Qgc3A8SU9ic2VydmVyPiAmb2JzZXJ2ZXIsIGJvb2wgbG9jYWwsCisgICAgICAgIHNwPENvbm5lY3Rpb24+ICpjb25uZWN0aW9uLCBDb25uZWN0aW9uSWQgKnBDb25uZWN0aW9uSWQsCisgICAgICAgIHVpbnQzMl90ICpwTXNnSWQsCisgICAgICAgIGNvbnN0IFN0YXR1c0Rlc2NyaXB0b3IqKiBzdGF0dXNEZXNjUHRyLAorICAgICAgICBjb25zdCBJbnZhbGlkYXRpb25EZXNjcmlwdG9yKiogaW52RGVzY1B0cikgeworICAgIGlmIChtSW1wbCkgeworICAgICAgICBSZXN1bHRTdGF0dXMgc3RhdHVzID0gbUltcGwtPmNvbm5lY3QoCisgICAgICAgICAgICAgICAgdGhpcywgb2JzZXJ2ZXIsIGNvbm5lY3Rpb24sIHBDb25uZWN0aW9uSWQsIHBNc2dJZCwKKyAgICAgICAgICAgICAgICBzdGF0dXNEZXNjUHRyLCBpbnZEZXNjUHRyKTsKKyAgICAgICAgaWYgKCFsb2NhbCAmJiBzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICAgICAgc3A8QWNjZXNzb3I+IGFjY2Vzc29yKHRoaXMpOworICAgICAgICAgICAgc0Nvbm5lY3Rpb25EZWF0aFJlY2lwaWVudC0+YWRkKCpwQ29ubmVjdGlvbklkLCBhY2Nlc3Nvcik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK1Jlc3VsdFN0YXR1cyBBY2Nlc3Nvcjo6Y2xvc2UoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCkgeworICAgIGlmIChtSW1wbCkgeworICAgICAgICBSZXN1bHRTdGF0dXMgc3RhdHVzID0gbUltcGwtPmNsb3NlKGNvbm5lY3Rpb25JZCk7CisgICAgICAgIHNDb25uZWN0aW9uRGVhdGhSZWNpcGllbnQtPnJlbW92ZShjb25uZWN0aW9uSWQpOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKwordm9pZCBBY2Nlc3Nvcjo6Y2xlYW5VcChib29sIGNsZWFyQ2FjaGUpIHsKKyAgICBpZiAobUltcGwpIHsKKyAgICAgICAgbUltcGwtPmNsZWFuVXAoY2xlYXJDYWNoZSk7CisgICAgfQorfQorCisvL0lBY2Nlc3NvciogSElETF9GRVRDSF9JQWNjZXNzb3IoY29uc3QgY2hhciogLyogbmFtZSAqLykgeworLy8gICAgcmV0dXJuIG5ldyBBY2Nlc3NvcigpOworLy99CisKK30gIC8vIG5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbgorfSAgLy8gbmFtZXNwYWNlIFYyXzAKK30gIC8vIG5hbWVzcGFjZSBidWZmZXJwb29sCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0FjY2Vzc29yLmggYi9tZWRpYS9idWZmZXJwb29sLzIuMC9BY2Nlc3Nvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkMDI1MTkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzIuMC9BY2Nlc3Nvci5oCkBAIC0wLDAgKzEsMjAyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjJfMF9BQ0NFU1NPUl9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMl8wX0FDQ0VTU09SX0gKKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYnVmZmVycG9vbC8yLjAvSUFjY2Vzc29yLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9idWZmZXJwb29sLzIuMC9JT2JzZXJ2ZXIuaD4KKyNpbmNsdWRlIDxidWZmZXJwb29sL0J1ZmZlclBvb2xUeXBlcy5oPgorI2luY2x1ZGUgPGhpZGwvTVFEZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8aGlkbC9TdGF0dXMuaD4KKyNpbmNsdWRlICJCdWZmZXJTdGF0dXMuaCIKKworI2luY2x1ZGUgPHNldD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYnVmZmVycG9vbCB7CituYW1lc3BhY2UgVjJfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2FycmF5OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9tZW1vcnk7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Vm9pZDsKK3VzaW5nIDo6YW5kcm9pZDo6c3A7CisKK3N0cnVjdCBBY2Nlc3NvcjsKK3N0cnVjdCBDb25uZWN0aW9uOworCisvKioKKyAqIFJlY2VpdmVzIGRlYXRoIG5vdGlmaWNhdGlvbnMgZnJvbSByZW1vdGUgY29ubmVjdGlvbnMuCisgKiBPbiBkZWF0aCBub3RpZmljYXRpb25zLCB0aGUgY29ubmVjdGlvbnMgYXJlIGNsb3NlZCBhbmQgdXNlZCByZXNvdXJjZXMKKyAqIGFyZSByZWxlYXNlZC4KKyAqLworc3RydWN0IENvbm5lY3Rpb25EZWF0aFJlY2lwaWVudCA6IHB1YmxpYyBoYXJkd2FyZTo6aGlkbF9kZWF0aF9yZWNpcGllbnQgeworICAgIC8qKgorICAgICAqIFJlZ2lzdGVycyBhIG5ld2x5IGNvbm5lY3RlZCBjb25uZWN0aW9uIGZyb20gcmVtb3RlIHByb2Nlc3Nlcy4KKyAgICAgKi8KKyAgICB2b2lkIGFkZChpbnQ2NF90IGNvbm5lY3Rpb25JZCwgY29uc3Qgc3A8QWNjZXNzb3I+ICZhY2Nlc3Nvcik7CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmVzIGEgY29ubmVjdGlvbi4KKyAgICAgKi8KKyAgICB2b2lkIHJlbW92ZShpbnQ2NF90IGNvbm5lY3Rpb25JZCk7CisKKyAgICB2b2lkIGFkZENvb2tpZVRvQ29ubmVjdGlvbih1aW50NjRfdCBjb29raWUsIGludDY0X3QgY29ubmVjdGlvbklkKTsKKworICAgIHZpcnR1YWwgdm9pZCBzZXJ2aWNlRGllZCgKKyAgICAgICAgICAgIHVpbnQ2NF90IC8qIGNvb2tpZSAqLywKKyAgICAgICAgICAgIGNvbnN0IHdwPDo6YW5kcm9pZDo6aGlkbDo6YmFzZTo6VjFfMDo6SUJhc2U+JiAvKiB3aG8gKi8KKyAgICAgICAgICAgICkgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgc3RkOjptdXRleCBtTG9jazsKKyAgICBzdGQ6Om1hcDx1aW50NjRfdCwgc3RkOjpzZXQ8aW50NjRfdD4+ICBtQ29va2llVG9Db25uZWN0aW9uczsKKyAgICBzdGQ6Om1hcDxpbnQ2NF90LCB1aW50NjRfdD4gbUNvbm5lY3Rpb25Ub0Nvb2tpZTsKKyAgICBzdGQ6Om1hcDxpbnQ2NF90LCBjb25zdCB3cDxBY2Nlc3Nvcj4+IG1BY2Nlc3NvcnM7Cit9OworCisvKioKKyAqIEEgYnVmZmVyIHBvb2wgYWNjZXNzb3Igd2hpY2ggZW5hYmxlcyBhIGJ1ZmZlciBwb29sIHRvIGNvbW11bmljYXRlIHdpdGggYnVmZmVyCisgKiBwb29sIGNsaWVudHMuIDE6MSBjb3JyZXNwb25kZW5zZSBob2xkcyBiZXR3ZWVuIGEgYnVmZmVyIHBvb2wgYW5kIGFuIGFjY2Vzc29yLgorICovCitzdHJ1Y3QgQWNjZXNzb3IgOiBwdWJsaWMgSUFjY2Vzc29yIHsKKyAgICAvLyBNZXRob2RzIGZyb20gOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OklBY2Nlc3NvciBmb2xsb3cuCisgICAgUmV0dXJuPHZvaWQ+IGNvbm5lY3QoY29uc3Qgc3A8OjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OklPYnNlcnZlcj4mIG9ic2VydmVyLCBjb25uZWN0X2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBidWZmZXIgcG9vbCBhY2Nlc3NvciB3aGljaCB1c2VzIHRoZSBzcGVjaWZpZWQgYWxsb2NhdG9yLgorICAgICAqCisgICAgICogQHBhcmFtIGFsbG9jYXRvciBidWZmZXIgYWxsb2NhdG9yLgorICAgICAqLworICAgIGV4cGxpY2l0IEFjY2Vzc29yKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdG9yPiAmYWxsb2NhdG9yKTsKKworICAgIC8qKiBEZXN0cnVjdHMgYSBidWZmZXIgcG9vbCBhY2Nlc3Nvci4gKi8KKyAgICB+QWNjZXNzb3IoKTsKKworICAgIC8qKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGFjY2Vzc29yIGlzIHZhbGlkLiAqLworICAgIGJvb2wgaXNWYWxpZCgpOworCisgICAgLyoqIEludmFsaWRhdGVzIGFsbCBidWZmZXJzIHdoaWNoIGFyZSBvd25lZCBieSBidWZmZXJwb29sICovCisgICAgUmVzdWx0U3RhdHVzIGZsdXNoKCk7CisKKyAgICAvKiogQWxsb2NhdGVzIGEgYnVmZmVyIGZyb20gYSBidWZmZXIgcG9vbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uSWQgIHRoZSBjb25uZWN0aW9uIGlkIG9mIHRoZSBjbGllbnQuCisgICAgICogQHBhcmFtIHBhcmFtcyAgICAgICAgdGhlIGFsbG9jYXRpb24gcGFyYW1ldGVycy4KKyAgICAgKiBAcGFyYW0gYnVmZmVySWQgICAgICB0aGUgaWQgb2YgdGhlIGFsbG9jYXRlZCBidWZmZXIuCisgICAgICogQHBhcmFtIGhhbmRsZSAgICAgICAgdGhlIG5hdGl2ZSBoYW5kbGUgb2YgdGhlIGFsbG9jYXRlZCBidWZmZXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE9LIHdoZW4gYSBidWZmZXIgaXMgc3VjY2Vzc2Z1bGx5IGFsbG9jYXRlZC4KKyAgICAgKiAgICAgICAgIE5PX01FTU9SWSB3aGVuIHRoZXJlIGlzIG5vIG1lbW9yeS4KKyAgICAgKiAgICAgICAgIENSSVRJQ0FMX0VSUk9SIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBSZXN1bHRTdGF0dXMgYWxsb2NhdGUoCisgICAgICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHBhcmFtcywKKyAgICAgICAgICAgIEJ1ZmZlcklkICpidWZmZXJJZCwKKyAgICAgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCoqIGhhbmRsZSk7CisKKyAgICAvKioKKyAgICAgKiBGZXRjaGVzIGEgYnVmZmVyIGZvciB0aGUgc3BlY2lmaWVkIHRyYW5zYWN0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbm5lY3Rpb25JZCAgdGhlIGlkIG9mIHJlY2VpdmluZyBjb25uZWN0aW9uKGNsaWVudCkuCisgICAgICogQHBhcmFtIHRyYW5zYWN0aW9uSWQgdGhlIGlkIG9mIHRoZSB0cmFuc2ZlciB0cmFuc2FjdGlvbi4KKyAgICAgKiBAcGFyYW0gYnVmZmVySWQgICAgICB0aGUgaWQgb2YgdGhlIGJ1ZmZlciB0byBiZSBmZXRjaGVkLgorICAgICAqIEBwYXJhbSBoYW5kbGUgICAgICAgIHRoZSBuYXRpdmUgaGFuZGxlIG9mIHRoZSBmZXRjaGVkIGJ1ZmZlci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gT0sgd2hlbiBhIGJ1ZmZlciBpcyBzdWNjZXNzZnVsbHkgZmV0Y2hlZC4KKyAgICAgKiAgICAgICAgIE5PX01FTU9SWSB3aGVuIHRoZXJlIGlzIG5vIG1lbW9yeS4KKyAgICAgKiAgICAgICAgIENSSVRJQ0FMX0VSUk9SIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBSZXN1bHRTdGF0dXMgZmV0Y2goCisgICAgICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLAorICAgICAgICAgICAgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLAorICAgICAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsCisgICAgICAgICAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QqKiBoYW5kbGUpOworCisgICAgLyoqCisgICAgICogTWFrZXMgYSBjb25uZWN0aW9uIHRvIHRoZSBidWZmZXIgcG9vbC4gVGhlIGJ1ZmZlciBwb29sIGNsaWVudCB1c2VzIHRoZQorICAgICAqIGNyZWF0ZWQgY29ubmVjdGlvbiBpbiBvcmRlciB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSBidWZmZXIgcG9vbC4gQW4KKyAgICAgKiBGTVEgZm9yIGJ1ZmZlciBzdGF0dXMgbWVzc2FnZSBpcyBhbHNvIGNyZWF0ZWQgZm9yIHRoZSBjbGllbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gb2JzZXJ2ZXIgICAgICBjbGllbnQgb2JzZXJ2ZXIgZm9yIGJ1ZmZlciBpbnZhbGlkYXRpb24KKyAgICAgKiBAcGFyYW0gbG9jYWwgICAgICAgICB0cnVlIHdoZW4gYSBjb25uZWN0aW9uIHJlcXVlc3QgY29tZXMgZnJvbSBsb2NhbCBwcm9jZXNzLAorICAgICAqICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvbiAgICBjcmVhdGVkIGNvbm5lY3Rpb24KKyAgICAgKiBAcGFyYW0gcENvbm5lY3Rpb25JZCB0aGUgaWQgb2YgdGhlIGNyZWF0ZWQgY29ubmVjdGlvbgorICAgICAqIEBwYXJhbSBwTXNnSWQgICAgICAgIHRoZSBpZCBvZiB0aGUgcmVjZW50IGJ1ZmZlciBwb29sIG1lc3NhZ2UKKyAgICAgKiBAcGFyYW0gc3RhdHVzRGVzY1B0ciBGTVEgZGVzY3JpcHRvciBmb3Igc2hhcmVkIGJ1ZmZlciBzdGF0dXMgbWVzc2FnZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlIGJldHdlZW4gYSBidWZmZXIgcG9vbCBhbmQgdGhlIGNsaWVudC4KKyAgICAgKiBAcGFyYW0gaW52RGVzY1B0ciAgICBGTVEgZGVzY3JpcHRvciBmb3IgYnVmZmVyIGludmFsaWRhdGlvbiBtZXNzYWdlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgcXVldWUgZnJvbSBhIGJ1ZmZlciBwb29sIHRvIHRoZSBjbGllbnQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE9LIHdoZW4gYSBjb25uZWN0aW9uIGlzIHN1Y2Nlc3NmdWxseSBtYWRlLgorICAgICAqICAgICAgICAgTk9fTUVNT1JZIHdoZW4gdGhlcmUgaXMgbm8gbWVtb3J5LgorICAgICAqICAgICAgICAgQ1JJVElDQUxfRVJST1Igb3RoZXJ3aXNlLgorICAgICAqLworICAgIFJlc3VsdFN0YXR1cyBjb25uZWN0KAorICAgICAgICAgICAgY29uc3Qgc3A8SU9ic2VydmVyPiYgb2JzZXJ2ZXIsCisgICAgICAgICAgICBib29sIGxvY2FsLAorICAgICAgICAgICAgc3A8Q29ubmVjdGlvbj4gKmNvbm5lY3Rpb24sIENvbm5lY3Rpb25JZCAqcENvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgIHVpbnQzMl90ICpwTXNnSWQsCisgICAgICAgICAgICBjb25zdCBTdGF0dXNEZXNjcmlwdG9yKiogc3RhdHVzRGVzY1B0ciwKKyAgICAgICAgICAgIGNvbnN0IEludmFsaWRhdGlvbkRlc2NyaXB0b3IqKiBpbnZEZXNjUHRyKTsKKworICAgIC8qKgorICAgICAqIENsb3NlcyB0aGUgc3BlY2lmaWVkIGNvbm5lY3Rpb24gdG8gdGhlIGNsaWVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uSWQgIHRoZSBpZCBvZiB0aGUgY29ubmVjdGlvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gT0sgd2hlbiB0aGUgY29ubmVjdGlvbiBpcyBjbG9zZWQuCisgICAgICogICAgICAgICBDUklUSUNBTF9FUlJPUiBvdGhlcndpc2UuCisgICAgICovCisgICAgUmVzdWx0U3RhdHVzIGNsb3NlKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQpOworCisgICAgLyoqCisgICAgICogUHJvY2Vzc2VzIHBlbmRpbmcgYnVmZmVyIHN0YXR1cyBtZXNzYWdlcyBhbmQgcGVyZm9tcyBwZXJpb2RpYyBjYWNoZQorICAgICAqIGNsZWFuaW5nLgorICAgICAqCisgICAgICogQHBhcmFtIGNsZWFyQ2FjaGUgICAgaWYgY2xlYXJDYWNoZSBpcyB0cnVlLCBpdCBmcmVlcyBhbGwgYnVmZmVycyB3YWl0aW5nCisgICAgICogICAgICAgICAgICAgICAgICAgICAgdG8gYmUgcmVjeWNsZWQuCisgICAgICovCisgICAgdm9pZCBjbGVhblVwKGJvb2wgY2xlYXJDYWNoZSk7CisKKyAgICAvKioKKyAgICAgKiBHZXRzIGEgaGlkbF9kZWF0aF9yZWNpcGllbnQgZm9yIHJlbW90ZSBjb25uZWN0aW9uIGRlYXRoLgorICAgICAqLworICAgIHN0YXRpYyBzcDxDb25uZWN0aW9uRGVhdGhSZWNpcGllbnQ+IGdldENvbm5lY3Rpb25EZWF0aFJlY2lwaWVudCgpOworCisgICAgc3RhdGljIHZvaWQgY3JlYXRlSW52YWxpZGF0b3IoKTsKKworcHJpdmF0ZToKKyAgICBjbGFzcyBJbXBsOworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBtSW1wbDsKK307CisKK30gIC8vIG5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbgorfSAgLy8gbmFtZXNwYWNlIFYyXzAKK30gIC8vIG5hbWVzcGFjZSBidWZmZXJwb29sCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjJfMF9BQ0NFU1NPUl9ICmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzIuMC9BY2Nlc3NvckltcGwuY3BwIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvQWNjZXNzb3JJbXBsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTY1MzE0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvQWNjZXNzb3JJbXBsLmNwcApAQCAtMCwwICsxLDg0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQnVmZmVyUG9vbEFjY2Vzc29yIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHRocmVhZD4KKyNpbmNsdWRlICJBY2Nlc3NvckltcGwuaCIKKyNpbmNsdWRlICJDb25uZWN0aW9uLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGJ1ZmZlcnBvb2wgeworbmFtZXNwYWNlIFYyXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKworbmFtZXNwYWNlIHsKKyAgICBzdGF0aWMgY29uc3RleHByIGludDY0X3Qga0NsZWFuVXBEdXJhdGlvblVzID0gNTAwMDAwOyAvLyBUT0RPIHR1bmUgMC41IHNlYworICAgIHN0YXRpYyBjb25zdGV4cHIgaW50NjRfdCBrTG9nRHVyYXRpb25VcyA9IDUwMDAwMDA7IC8vIDUgc2VjcworCisgICAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3Qga01pbkFsbG9jQnl0ZXNGb3JFdmljdGlvbiA9IDEwMjQqMTAyNCoxNTsKKyAgICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBrTWluQnVmZmVyQ291bnRGb3JFdmljdGlvbiA9IDQwOworfQorCisvLyBCdWZmZXIgc3RydWN0dXJlIGluIGJ1ZmZlcnBvb2wgcHJvY2Vzcworc3RydWN0IEludGVybmFsQnVmZmVyIHsKKyAgICBCdWZmZXJJZCBtSWQ7CisgICAgc2l6ZV90IG1Pd25lckNvdW50OworICAgIHNpemVfdCBtVHJhbnNhY3Rpb25Db3VudDsKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRpb24+IG1BbGxvY2F0aW9uOworICAgIGNvbnN0IHNpemVfdCBtQWxsb2NTaXplOworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IG1Db25maWc7CisgICAgYm9vbCBtSW52YWxpZGF0ZWQ7CisKKyAgICBJbnRlcm5hbEJ1ZmZlcigKKyAgICAgICAgICAgIEJ1ZmZlcklkIGlkLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0aW9uPiAmYWxsb2MsCisgICAgICAgICAgICBjb25zdCBzaXplX3QgYWxsb2NTaXplLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJmFsbG9jQ29uZmlnKQorICAgICAgICAgICAgOiBtSWQoaWQpLCBtT3duZXJDb3VudCgwKSwgbVRyYW5zYWN0aW9uQ291bnQoMCksCisgICAgICAgICAgICBtQWxsb2NhdGlvbihhbGxvYyksIG1BbGxvY1NpemUoYWxsb2NTaXplKSwgbUNvbmZpZyhhbGxvY0NvbmZpZyksCisgICAgICAgICAgICBtSW52YWxpZGF0ZWQoZmFsc2UpIHt9CisKKyAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QgKmhhbmRsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1BbGxvY2F0aW9uLT5oYW5kbGUoKTsKKyAgICB9CisKKyAgICB2b2lkIGludmFsaWRhdGUoKSB7CisgICAgICAgIG1JbnZhbGlkYXRlZCA9IHRydWU7CisgICAgfQorfTsKKworc3RydWN0IFRyYW5zYWN0aW9uU3RhdHVzIHsKKyAgICBUcmFuc2FjdGlvbklkIG1JZDsKKyAgICBCdWZmZXJJZCBtQnVmZmVySWQ7CisgICAgQ29ubmVjdGlvbklkIG1TZW5kZXI7CisgICAgQ29ubmVjdGlvbklkIG1SZWNlaXZlcjsKKyAgICBCdWZmZXJTdGF0dXMgbVN0YXR1czsKKyAgICBpbnQ2NF90IG1UaW1lc3RhbXBVczsKKyAgICBib29sIG1TZW5kZXJWYWxpZGF0ZWQ7CisKKyAgICBUcmFuc2FjdGlvblN0YXR1cyhjb25zdCBCdWZmZXJTdGF0dXNNZXNzYWdlICZtZXNzYWdlLCBpbnQ2NF90IHRpbWVzdGFtcFVzKSB7CisgICAgICAgIG1JZCA9IG1lc3NhZ2UudHJhbnNhY3Rpb25JZDsKKyAgICAgICAgbUJ1ZmZlcklkID0gbWVzc2FnZS5idWZmZXJJZDsKKyAgICAgICAgbVN0YXR1cyA9IG1lc3NhZ2UubmV3U3RhdHVzOworICAgICAgICBtVGltZXN0YW1wVXMgPSB0aW1lc3RhbXBVczsKKyAgICAgICAgaWYgKG1TdGF0dXMgPT0gQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9UTykgeworICAgICAgICAgICAgbVNlbmRlciA9IG1lc3NhZ2UuY29ubmVjdGlvbklkOworICAgICAgICAgICAgbVJlY2VpdmVyID0gbWVzc2FnZS50YXJnZXRDb25uZWN0aW9uSWQ7CisgICAgICAgICAgICBtU2VuZGVyVmFsaWRhdGVkID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1TZW5kZXIgPSAtMUxMOworICAgICAgICAgICAgbVJlY2VpdmVyID0gbWVzc2FnZS5jb25uZWN0aW9uSWQ7CisgICAgICAgICAgICBtU2VuZGVyVmFsaWRhdGVkID0gZmFsc2U7CisgICAgICAgIH0KKyAgICB9Cit9OworCisvLyBIZWxwZXIgdGVtcGxhdGUgbWV0aG9kcyBmb3IgaGFuZGxpbmcgbWFwIG9mIHNldC4KK3RlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFU+Citib29sIGluc2VydChzdGQ6Om1hcDxULCBzdGQ6OnNldDxVPj4gKm1hcE9mU2V0LCBUIGtleSwgVSB2YWx1ZSkgeworICAgIGF1dG8gaXRlciA9IG1hcE9mU2V0LT5maW5kKGtleSk7CisgICAgaWYgKGl0ZXIgPT0gbWFwT2ZTZXQtPmVuZCgpKSB7CisgICAgICAgIHN0ZDo6c2V0PFU+IHZhbHVlU2V0e3ZhbHVlfTsKKyAgICAgICAgbWFwT2ZTZXQtPmluc2VydChzdGQ6Om1ha2VfcGFpcihrZXksIHZhbHVlU2V0KSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSBpZiAoaXRlci0+c2Vjb25kLmZpbmQodmFsdWUpICA9PSBpdGVyLT5zZWNvbmQuZW5kKCkpIHsKKyAgICAgICAgaXRlci0+c2Vjb25kLmluc2VydCh2YWx1ZSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3RlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFU+Citib29sIGVyYXNlKHN0ZDo6bWFwPFQsIHN0ZDo6c2V0PFU+PiAqbWFwT2ZTZXQsIFQga2V5LCBVIHZhbHVlKSB7CisgICAgYm9vbCByZXQgPSBmYWxzZTsKKyAgICBhdXRvIGl0ZXIgPSBtYXBPZlNldC0+ZmluZChrZXkpOworICAgIGlmIChpdGVyICE9IG1hcE9mU2V0LT5lbmQoKSkgeworICAgICAgICBpZiAoaXRlci0+c2Vjb25kLmVyYXNlKHZhbHVlKSA+IDApIHsKKyAgICAgICAgICAgIHJldCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGl0ZXItPnNlY29uZC5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgbWFwT2ZTZXQtPmVyYXNlKGl0ZXIpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK3RlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFU+Citib29sIGNvbnRhaW5zKHN0ZDo6bWFwPFQsIHN0ZDo6c2V0PFU+PiAqbWFwT2ZTZXQsIFQga2V5LCBVIHZhbHVlKSB7CisgICAgYXV0byBpdGVyID0gbWFwT2ZTZXQtPmZpbmQoa2V5KTsKKyAgICBpZiAoaXRlciAhPSBtYXBPZlNldC0+ZW5kKCkpIHsKKyAgICAgICAgYXV0byBzZXRJdGVyID0gaXRlci0+c2Vjb25kLmZpbmQodmFsdWUpOworICAgICAgICByZXR1cm4gc2V0SXRlciAhPSBpdGVyLT5zZWNvbmQuZW5kKCk7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworaW50MzJfdCBBY2Nlc3Nvcjo6SW1wbDo6c1BpZCA9IGdldHBpZCgpOwordWludDMyX3QgQWNjZXNzb3I6OkltcGw6OnNTZXFJZCA9IHRpbWUobnVsbHB0cik7CisKK0FjY2Vzc29yOjpJbXBsOjpJbXBsKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRvcj4gJmFsbG9jYXRvcikKKyAgICAgICAgOiBtQWxsb2NhdG9yKGFsbG9jYXRvcikge30KKworQWNjZXNzb3I6OkltcGw6On5JbXBsKCkgeworfQorCitSZXN1bHRTdGF0dXMgQWNjZXNzb3I6OkltcGw6OmNvbm5lY3QoCisgICAgICAgIGNvbnN0IHNwPEFjY2Vzc29yPiAmYWNjZXNzb3IsIGNvbnN0IHNwPElPYnNlcnZlcj4gJm9ic2VydmVyLAorICAgICAgICBzcDxDb25uZWN0aW9uPiAqY29ubmVjdGlvbiwKKyAgICAgICAgQ29ubmVjdGlvbklkICpwQ29ubmVjdGlvbklkLAorICAgICAgICB1aW50MzJfdCAqcE1zZ0lkLAorICAgICAgICBjb25zdCBTdGF0dXNEZXNjcmlwdG9yKiogc3RhdHVzRGVzY1B0ciwKKyAgICAgICAgY29uc3QgSW52YWxpZGF0aW9uRGVzY3JpcHRvcioqIGludkRlc2NQdHIpIHsKKyAgICBzcDxDb25uZWN0aW9uPiBuZXdDb25uZWN0aW9uID0gbmV3IENvbm5lY3Rpb24oKTsKKyAgICBSZXN1bHRTdGF0dXMgc3RhdHVzID0gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1CdWZmZXJQb29sLm1NdXRleCk7CisgICAgICAgIGlmIChuZXdDb25uZWN0aW9uKSB7CisgICAgICAgICAgICBDb25uZWN0aW9uSWQgaWQgPSAoaW50NjRfdClzUGlkIDw8IDMyIHwgc1NlcUlkOworICAgICAgICAgICAgc3RhdHVzID0gbUJ1ZmZlclBvb2wubU9ic2VydmVyLm9wZW4oaWQsIHN0YXR1c0Rlc2NQdHIpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgbmV3Q29ubmVjdGlvbi0+aW5pdGlhbGl6ZShhY2Nlc3NvciwgaWQpOworICAgICAgICAgICAgICAgICpjb25uZWN0aW9uID0gbmV3Q29ubmVjdGlvbjsKKyAgICAgICAgICAgICAgICAqcENvbm5lY3Rpb25JZCA9IGlkOworICAgICAgICAgICAgICAgICpwTXNnSWQgPSBtQnVmZmVyUG9vbC5tSW52YWxpZGF0aW9uLm1JbnZhbGlkYXRpb25JZDsKKyAgICAgICAgICAgICAgICBtQnVmZmVyUG9vbC5tSW52YWxpZGF0aW9uQ2hhbm5lbC5nZXREZXNjKGludkRlc2NQdHIpOworICAgICAgICAgICAgICAgIG1CdWZmZXJQb29sLm1JbnZhbGlkYXRpb24ub25Db25uZWN0KGlkLCBvYnNlcnZlcik7CisgICAgICAgICAgICAgICAgKytzU2VxSWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBtQnVmZmVyUG9vbC5wcm9jZXNzU3RhdHVzTWVzc2FnZXMoKTsKKyAgICAgICAgbUJ1ZmZlclBvb2wuY2xlYW5VcCgpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitSZXN1bHRTdGF0dXMgQWNjZXNzb3I6OkltcGw6OmNsb3NlKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQnVmZmVyUG9vbC5tTXV0ZXgpOworICAgIEFMT0dWKCJjb25uZWN0aW9uIGNsb3NlICVsbGQ6ICV1IiwgKGxvbmcgbG9uZyljb25uZWN0aW9uSWQsIG1CdWZmZXJQb29sLm1JbnZhbGlkYXRpb24ubUlkKTsKKyAgICBtQnVmZmVyUG9vbC5wcm9jZXNzU3RhdHVzTWVzc2FnZXMoKTsKKyAgICBtQnVmZmVyUG9vbC5oYW5kbGVDbG9zZShjb25uZWN0aW9uSWQpOworICAgIG1CdWZmZXJQb29sLm1PYnNlcnZlci5jbG9zZShjb25uZWN0aW9uSWQpOworICAgIG1CdWZmZXJQb29sLm1JbnZhbGlkYXRpb24ub25DbG9zZShjb25uZWN0aW9uSWQpOworICAgIC8vIFNpbmNlIGNsb3NlIyB3aWxsIGJlIGNhbGxlZCBhZnRlciBhbGwgd29ya3MgYXJlIGZpbmlzaGVkLCBpdCBpcyBPSyB0bworICAgIC8vIGV2aWN0IHVudXNlZCBidWZmZXJzLgorICAgIG1CdWZmZXJQb29sLmNsZWFuVXAodHJ1ZSk7CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6T0s7Cit9CisKK1Jlc3VsdFN0YXR1cyBBY2Nlc3Nvcjo6SW1wbDo6YWxsb2NhdGUoCisgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBwYXJhbXMsCisgICAgICAgIEJ1ZmZlcklkICpidWZmZXJJZCwgY29uc3QgbmF0aXZlX2hhbmRsZV90KiogaGFuZGxlKSB7CisgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG1CdWZmZXJQb29sLm1NdXRleCk7CisgICAgbUJ1ZmZlclBvb2wucHJvY2Vzc1N0YXR1c01lc3NhZ2VzKCk7CisgICAgUmVzdWx0U3RhdHVzIHN0YXR1cyA9IFJlc3VsdFN0YXR1czo6T0s7CisgICAgaWYgKCFtQnVmZmVyUG9vbC5nZXRGcmVlQnVmZmVyKG1BbGxvY2F0b3IsIHBhcmFtcywgYnVmZmVySWQsIGhhbmRsZSkpIHsKKyAgICAgICAgbG9jay51bmxvY2soKTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0aW9uPiBhbGxvYzsKKyAgICAgICAgc2l6ZV90IGFsbG9jU2l6ZTsKKyAgICAgICAgc3RhdHVzID0gbUFsbG9jYXRvci0+YWxsb2NhdGUocGFyYW1zLCAmYWxsb2MsICZhbGxvY1NpemUpOworICAgICAgICBsb2NrLmxvY2soKTsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBtQnVmZmVyUG9vbC5hZGROZXdCdWZmZXIoYWxsb2MsIGFsbG9jU2l6ZSwgcGFyYW1zLCBidWZmZXJJZCwgaGFuZGxlKTsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigiY3JlYXRlIGEgYnVmZmVyICVkIDogJXUgJXAiLAorICAgICAgICAgICAgICBzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSywgKmJ1ZmZlcklkLCAqaGFuZGxlKTsKKyAgICB9CisgICAgaWYgKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgIC8vIFRPRE86IGhhbmRsZSBvd25CdWZmZXIgZmFpbHVyZQorICAgICAgICBtQnVmZmVyUG9vbC5oYW5kbGVPd25CdWZmZXIoY29ubmVjdGlvbklkLCAqYnVmZmVySWQpOworICAgIH0KKyAgICBtQnVmZmVyUG9vbC5jbGVhblVwKCk7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworUmVzdWx0U3RhdHVzIEFjY2Vzc29yOjpJbXBsOjpmZXRjaCgKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLAorICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCwgY29uc3QgbmF0aXZlX2hhbmRsZV90KiogaGFuZGxlKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUJ1ZmZlclBvb2wubU11dGV4KTsKKyAgICBtQnVmZmVyUG9vbC5wcm9jZXNzU3RhdHVzTWVzc2FnZXMoKTsKKyAgICBhdXRvIGZvdW5kID0gbUJ1ZmZlclBvb2wubVRyYW5zYWN0aW9ucy5maW5kKHRyYW5zYWN0aW9uSWQpOworICAgIGlmIChmb3VuZCAhPSBtQnVmZmVyUG9vbC5tVHJhbnNhY3Rpb25zLmVuZCgpICYmCisgICAgICAgICAgICBjb250YWlucygmbUJ1ZmZlclBvb2wubVBlbmRpbmdUcmFuc2FjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uSWQsIHRyYW5zYWN0aW9uSWQpKSB7CisgICAgICAgIGlmIChmb3VuZC0+c2Vjb25kLT5tU2VuZGVyVmFsaWRhdGVkICYmCisgICAgICAgICAgICAgICAgZm91bmQtPnNlY29uZC0+bVN0YXR1cyA9PSBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX0ZST00gJiYKKyAgICAgICAgICAgICAgICBmb3VuZC0+c2Vjb25kLT5tQnVmZmVySWQgPT0gYnVmZmVySWQpIHsKKyAgICAgICAgICAgIGZvdW5kLT5zZWNvbmQtPm1TdGF0dXMgPSBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX0ZFVENIOworICAgICAgICAgICAgYXV0byBidWZmZXJJdCA9IG1CdWZmZXJQb29sLm1CdWZmZXJzLmZpbmQoYnVmZmVySWQpOworICAgICAgICAgICAgaWYgKGJ1ZmZlckl0ICE9IG1CdWZmZXJQb29sLm1CdWZmZXJzLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgbUJ1ZmZlclBvb2wubVN0YXRzLm9uQnVmZmVyRmV0Y2hlZCgpOworICAgICAgICAgICAgICAgICpoYW5kbGUgPSBidWZmZXJJdC0+c2Vjb25kLT5oYW5kbGUoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpPSzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBtQnVmZmVyUG9vbC5jbGVhblVwKCk7CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK3ZvaWQgQWNjZXNzb3I6OkltcGw6OmNsZWFuVXAoYm9vbCBjbGVhckNhY2hlKSB7CisgICAgLy8gdHJhbnNhY3Rpb24gdGltZW91dCwgYnVmZmVyIGNhY2hlaW5nIFRUTCBoYW5kbGluZworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1CdWZmZXJQb29sLm1NdXRleCk7CisgICAgbUJ1ZmZlclBvb2wucHJvY2Vzc1N0YXR1c01lc3NhZ2VzKCk7CisgICAgbUJ1ZmZlclBvb2wuY2xlYW5VcChjbGVhckNhY2hlKTsKK30KKwordm9pZCBBY2Nlc3Nvcjo6SW1wbDo6Zmx1c2goKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUJ1ZmZlclBvb2wubU11dGV4KTsKKyAgICBtQnVmZmVyUG9vbC5wcm9jZXNzU3RhdHVzTWVzc2FnZXMoKTsKKyAgICBtQnVmZmVyUG9vbC5mbHVzaChzaGFyZWRfZnJvbV90aGlzKCkpOworfQorCit2b2lkIEFjY2Vzc29yOjpJbXBsOjpoYW5kbGVJbnZhbGlkYXRlQWNrKCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1CdWZmZXJQb29sLm1NdXRleCk7CisgICAgbUJ1ZmZlclBvb2wucHJvY2Vzc1N0YXR1c01lc3NhZ2VzKCk7CisgICAgbUJ1ZmZlclBvb2wubUludmFsaWRhdGlvbi5vbkhhbmRsZUFjaygpOworfQorCitib29sIEFjY2Vzc29yOjpJbXBsOjppc1ZhbGlkKCkgeworICAgIHJldHVybiBtQnVmZmVyUG9vbC5pc1ZhbGlkKCk7Cit9CisKK0FjY2Vzc29yOjpJbXBsOjpJbXBsOjpCdWZmZXJQb29sOjpCdWZmZXJQb29sKCkKKyAgICA6IG1UaW1lc3RhbXBVcyhnZXRUaW1lc3RhbXBOb3coKSksCisgICAgICBtTGFzdENsZWFuVXBVcyhtVGltZXN0YW1wVXMpLAorICAgICAgbUxhc3RMb2dVcyhtVGltZXN0YW1wVXMpLAorICAgICAgbVNlcSgwKSwKKyAgICAgIG1TdGFydFNlcSgwKSB7CisgICAgbVZhbGlkID0gbUludmFsaWRhdGlvbkNoYW5uZWwuaXNWYWxpZCgpOworfQorCisKKy8vIFN0YXRpc3RpY3MgaGVscGVyCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBTPgoraW50IHBlcmNlbnRhZ2UoVCBiYXNlLCBTIHRvdGFsKSB7CisgICAgcmV0dXJuIGludCh0b3RhbCA/IDAuNSArIDEwMC4gKiBzdGF0aWNfY2FzdDxTPihiYXNlKSAvIHRvdGFsIDogMCk7Cit9CisKK3N0ZDo6YXRvbWljPHN0ZDo6dWludDMyX3Q+IEFjY2Vzc29yOjpJbXBsOjpCdWZmZXJQb29sOjpJbnZhbGlkYXRpb246OnNJbnZTZXFJZCgwKTsKKworQWNjZXNzb3I6OkltcGw6OkltcGw6OkJ1ZmZlclBvb2w6On5CdWZmZXJQb29sKCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisgICAgQUxPR0QoIkRlc3RydWN0aW9uIC0gYnVmZmVycG9vbCAlcCAiCisgICAgICAgICAgImNhY2hlZDogJXp1LyV6dU0sICV6dS8lZCUlIGluIHVzZTsgIgorICAgICAgICAgICJhbGxvY3M6ICV6dSwgJWQlJSByZWN5Y2xlZDsgIgorICAgICAgICAgICJ0cmFuc2ZlcnM6ICV6dSwgJWQlJSB1bmZldGNlZCIsCisgICAgICAgICAgdGhpcywgbVN0YXRzLm1CdWZmZXJzQ2FjaGVkLCBtU3RhdHMubVNpemVDYWNoZWQgPj4gMjAsCisgICAgICAgICAgbVN0YXRzLm1CdWZmZXJzSW5Vc2UsIHBlcmNlbnRhZ2UobVN0YXRzLm1CdWZmZXJzSW5Vc2UsIG1TdGF0cy5tQnVmZmVyc0NhY2hlZCksCisgICAgICAgICAgbVN0YXRzLm1Ub3RhbEFsbG9jYXRpb25zLCBwZXJjZW50YWdlKG1TdGF0cy5tVG90YWxSZWN5Y2xlcywgbVN0YXRzLm1Ub3RhbEFsbG9jYXRpb25zKSwKKyAgICAgICAgICBtU3RhdHMubVRvdGFsVHJhbnNmZXJzLAorICAgICAgICAgIHBlcmNlbnRhZ2UobVN0YXRzLm1Ub3RhbFRyYW5zZmVycyAtIG1TdGF0cy5tVG90YWxGZXRjaGVzLCBtU3RhdHMubVRvdGFsVHJhbnNmZXJzKSk7Cit9CisKK3ZvaWQgQWNjZXNzb3I6OkltcGw6OkJ1ZmZlclBvb2w6OkludmFsaWRhdGlvbjo6b25Db25uZWN0KAorICAgICAgICBDb25uZWN0aW9uSWQgY29uSWQsIGNvbnN0IHNwPElPYnNlcnZlcj4mIG9ic2VydmVyKSB7CisgICAgbUFja3NbY29uSWRdID0gbUludmFsaWRhdGlvbklkOyAvLyBzdGFydHMgZnJvbSBjdXJyZW50IGludmFsaWRhdGlvbklkCisgICAgbU9ic2VydmVycy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoY29uSWQsIG9ic2VydmVyKSk7Cit9CisKK3ZvaWQgQWNjZXNzb3I6OkltcGw6OkJ1ZmZlclBvb2w6OkludmFsaWRhdGlvbjo6b25DbG9zZShDb25uZWN0aW9uSWQgY29uSWQpIHsKKyAgICBtQWNrcy5lcmFzZShjb25JZCk7CisgICAgbU9ic2VydmVycy5lcmFzZShjb25JZCk7Cit9CisKK3ZvaWQgQWNjZXNzb3I6OkltcGw6OkJ1ZmZlclBvb2w6OkludmFsaWRhdGlvbjo6b25BY2soCisgICAgICAgIENvbm5lY3Rpb25JZCBjb25JZCwKKyAgICAgICAgdWludDMyX3QgbXNnSWQpIHsKKyAgICBhdXRvIGl0ID0gbUFja3MuZmluZChjb25JZCk7CisgICAgaWYgKGl0ID09IG1BY2tzLmVuZCgpKSB7CisgICAgICAgIEFMT0dXKCJBQ0sgZnJvbSBpbmNvbnNpc3RlbnQgY29ubmVjdGlvbiEgJWxsZCIsIChsb25nIGxvbmcpY29uSWQpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChpc01lc3NhZ2VMYXRlcihtc2dJZCwgaXQtPnNlY29uZCkpIHsKKyAgICAgICAgbUFja3NbY29uSWRdID0gbXNnSWQ7CisgICAgfQorfQorCit2b2lkIEFjY2Vzc29yOjpJbXBsOjpCdWZmZXJQb29sOjpJbnZhbGlkYXRpb246Om9uQnVmZmVySW52YWxpZGF0ZWQoCisgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkLAorICAgICAgICBCdWZmZXJJbnZhbGlkYXRpb25DaGFubmVsICZjaGFubmVsKSB7CisgICAgZm9yIChhdXRvIGl0ID0gbVBlbmRpbmdzLmJlZ2luKCk7IGl0ICE9IG1QZW5kaW5ncy5lbmQoKTspIHsKKyAgICAgICAgaWYgKGl0LT5pc0ludmFsaWRhdGVkKGJ1ZmZlcklkKSkgeworICAgICAgICAgICAgdWludDMyX3QgbXNnSWQgPSAwOworICAgICAgICAgICAgaWYgKGl0LT5tTmVlZHNBY2spIHsKKyAgICAgICAgICAgICAgICBtc2dJZCA9ICsrbUludmFsaWRhdGlvbklkOworICAgICAgICAgICAgICAgIGlmIChtc2dJZCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHdyYXAgaGFwcGVucworICAgICAgICAgICAgICAgICAgICBtc2dJZCA9ICsrbUludmFsaWRhdGlvbklkOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNoYW5uZWwucG9zdEludmFsaWRhdGlvbihtc2dJZCwgaXQtPm1Gcm9tLCBpdC0+bVRvKTsKKyAgICAgICAgICAgIGl0ID0gbVBlbmRpbmdzLmVyYXNlKGl0KTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgICsraXQ7CisgICAgfQorfQorCit2b2lkIEFjY2Vzc29yOjpJbXBsOjpCdWZmZXJQb29sOjpJbnZhbGlkYXRpb246Om9uSW52YWxpZGF0aW9uUmVxdWVzdCgKKyAgICAgICAgYm9vbCBuZWVkc0FjaywKKyAgICAgICAgdWludDMyX3QgZnJvbSwKKyAgICAgICAgdWludDMyX3QgdG8sCisgICAgICAgIHNpemVfdCBsZWZ0LAorICAgICAgICBCdWZmZXJJbnZhbGlkYXRpb25DaGFubmVsICZjaGFubmVsLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QWNjZXNzb3I6OkltcGw+ICZpbXBsKSB7CisgICAgICAgIHVpbnQzMl90IG1zZ0lkID0gMDsKKyAgICBpZiAobmVlZHNBY2spIHsKKyAgICAgICAgbXNnSWQgPSArK21JbnZhbGlkYXRpb25JZDsKKyAgICAgICAgaWYgKG1zZ0lkID09IDApIHsKKyAgICAgICAgICAgIC8vIHdyYXAgaGFwcGVucworICAgICAgICAgICAgbXNnSWQgPSArK21JbnZhbGlkYXRpb25JZDsKKyAgICAgICAgfQorICAgIH0KKyAgICBBTE9HVigiYnVmZmVycG9vbCBpbnZhbGlkYXRpb24gcmVxdWVzdGVkIGFuZCBxdWV1ZWQiKTsKKyAgICBpZiAobGVmdCA9PSAwKSB7CisgICAgICAgIGNoYW5uZWwucG9zdEludmFsaWRhdGlvbihtc2dJZCwgZnJvbSwgdG8pOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFRPRE86IHNlbmRpbmcgaGludCBtZXNzYWdlPworICAgICAgICBBTE9HVigiYnVmZmVycG9vbCBpbnZhbGlkYXRpb24gcmVxdWVzdGVkIGFuZCBwZW5kaW5nIik7CisgICAgICAgIFBlbmRpbmcgcGVuZGluZyhuZWVkc0FjaywgZnJvbSwgdG8sIGxlZnQsIGltcGwpOworICAgICAgICBtUGVuZGluZ3MucHVzaF9iYWNrKHBlbmRpbmcpOworICAgIH0KKyAgICBzSW52YWxpZGF0b3ItPmFkZEFjY2Vzc29yKG1JZCwgaW1wbCk7Cit9CisKK3ZvaWQgQWNjZXNzb3I6OkltcGw6OkJ1ZmZlclBvb2w6OkludmFsaWRhdGlvbjo6b25IYW5kbGVBY2soKSB7CisgICAgaWYgKG1JbnZhbGlkYXRpb25JZCAhPSAwKSB7CisgICAgICAgIHN0ZDo6c2V0PGludD4gZGVhZHM7CisgICAgICAgIGZvciAoYXV0byBpdCA9IG1BY2tzLmJlZ2luKCk7IGl0ICE9IG1BY2tzLmVuZCgpOyArK2l0KSB7CisgICAgICAgICAgICBpZiAoaXQtPnNlY29uZCAhPSBtSW52YWxpZGF0aW9uSWQpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBzcDxJT2JzZXJ2ZXI+IG9ic2VydmVyID0gbU9ic2VydmVyc1tpdC0+Zmlyc3RdOworICAgICAgICAgICAgICAgIGlmIChvYnNlcnZlcikgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiY29ubmVjdGlvbiAlbGxkIGNhbGwgb2JzZXJ2ZXIgKCV1OiAldSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKWl0LT5maXJzdCwgaXQtPnNlY29uZCwgbUludmFsaWRhdGlvbklkKTsKKyAgICAgICAgICAgICAgICAgICAgUmV0dXJuPHZvaWQ+IHRyYW5zUmVzdWx0ID0gb2JzZXJ2ZXItPm9uTWVzc2FnZShpdC0+Zmlyc3QsIG1JbnZhbGlkYXRpb25JZCk7CisgICAgICAgICAgICAgICAgICAgICh2b2lkKSB0cmFuc1Jlc3VsdDsKKyAgICAgICAgICAgICAgICAgICAgLy8gTi5COiBpZ25vcmUgcG9zc2liaWxpdHkgb2Ygb25NZXNzYWdlIG9uZXdheSBjYWxsIGJlaW5nCisgICAgICAgICAgICAgICAgICAgIC8vIGxvc3QuCisgICAgICAgICAgICAgICAgICAgIGl0LT5zZWNvbmQgPSBtSW52YWxpZGF0aW9uSWQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoImJ1ZmZlcnBvb2wgb2JzZXJ2ZXIgZGllZCAlbGxkIiwgKGxvbmcgbG9uZylpdC0+Zmlyc3QpOworICAgICAgICAgICAgICAgICAgICBkZWFkcy5pbnNlcnQoaXQtPmZpcnN0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRlYWRzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgIGZvciAoYXV0byBpdCA9IGRlYWRzLmJlZ2luKCk7IGl0ICE9IGRlYWRzLmVuZCgpOyArK2l0KSB7CisgICAgICAgICAgICAgICAgb25DbG9zZSgqaXQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmIChtUGVuZGluZ3Muc2l6ZSgpID09IDApIHsKKyAgICAgICAgLy8gQWxsIGludmFsaWRhdGlvbiBJZHMgYXJlIHN5bmNlZCBhbmQgbm8gbW9yZSBwZW5kaW5nIGludmFsaWRhdGlvbnMuCisgICAgICAgIHNJbnZhbGlkYXRvci0+ZGVsQWNjZXNzb3IobUlkKTsKKyAgICB9Cit9CisKK2Jvb2wgQWNjZXNzb3I6OkltcGw6OkJ1ZmZlclBvb2w6OmhhbmRsZU93bkJ1ZmZlcigKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwgQnVmZmVySWQgYnVmZmVySWQpIHsKKworICAgIGJvb2wgYWRkZWQgPSBpbnNlcnQoJm1Vc2luZ0J1ZmZlcnMsIGNvbm5lY3Rpb25JZCwgYnVmZmVySWQpOworICAgIGlmIChhZGRlZCkgeworICAgICAgICBhdXRvIGl0ZXIgPSBtQnVmZmVycy5maW5kKGJ1ZmZlcklkKTsKKyAgICAgICAgaXRlci0+c2Vjb25kLT5tT3duZXJDb3VudCsrOworICAgIH0KKyAgICBpbnNlcnQoJm1Vc2luZ0Nvbm5lY3Rpb25zLCBidWZmZXJJZCwgY29ubmVjdGlvbklkKTsKKyAgICByZXR1cm4gYWRkZWQ7Cit9CisKK2Jvb2wgQWNjZXNzb3I6OkltcGw6OkJ1ZmZlclBvb2w6OmhhbmRsZVJlbGVhc2VCdWZmZXIoCisgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsIEJ1ZmZlcklkIGJ1ZmZlcklkKSB7CisgICAgYm9vbCBkZWxldGVkID0gZXJhc2UoJm1Vc2luZ0J1ZmZlcnMsIGNvbm5lY3Rpb25JZCwgYnVmZmVySWQpOworICAgIGlmIChkZWxldGVkKSB7CisgICAgICAgIGF1dG8gaXRlciA9IG1CdWZmZXJzLmZpbmQoYnVmZmVySWQpOworICAgICAgICBpdGVyLT5zZWNvbmQtPm1Pd25lckNvdW50LS07CisgICAgICAgIGlmIChpdGVyLT5zZWNvbmQtPm1Pd25lckNvdW50ID09IDAgJiYKKyAgICAgICAgICAgICAgICBpdGVyLT5zZWNvbmQtPm1UcmFuc2FjdGlvbkNvdW50ID09IDApIHsKKyAgICAgICAgICAgIGlmICghaXRlci0+c2Vjb25kLT5tSW52YWxpZGF0ZWQpIHsKKyAgICAgICAgICAgICAgICBtU3RhdHMub25CdWZmZXJVbnVzZWQoaXRlci0+c2Vjb25kLT5tQWxsb2NTaXplKTsKKyAgICAgICAgICAgICAgICBtRnJlZUJ1ZmZlcnMuaW5zZXJ0KGJ1ZmZlcklkKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbVN0YXRzLm9uQnVmZmVyVW51c2VkKGl0ZXItPnNlY29uZC0+bUFsbG9jU2l6ZSk7CisgICAgICAgICAgICAgICAgbVN0YXRzLm9uQnVmZmVyRXZpY3RlZChpdGVyLT5zZWNvbmQtPm1BbGxvY1NpemUpOworICAgICAgICAgICAgICAgIG1CdWZmZXJzLmVyYXNlKGl0ZXIpOworICAgICAgICAgICAgICAgIG1JbnZhbGlkYXRpb24ub25CdWZmZXJJbnZhbGlkYXRlZChidWZmZXJJZCwgbUludmFsaWRhdGlvbkNoYW5uZWwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVyYXNlKCZtVXNpbmdDb25uZWN0aW9ucywgYnVmZmVySWQsIGNvbm5lY3Rpb25JZCk7CisgICAgQUxPR1YoInJlbGVhc2UgYnVmZmVyICV1IDogJWQiLCBidWZmZXJJZCwgZGVsZXRlZCk7CisgICAgcmV0dXJuIGRlbGV0ZWQ7Cit9CisKK2Jvb2wgQWNjZXNzb3I6OkltcGw6OkJ1ZmZlclBvb2w6OmhhbmRsZVRyYW5zZmVyVG8oY29uc3QgQnVmZmVyU3RhdHVzTWVzc2FnZSAmbWVzc2FnZSkgeworICAgIGF1dG8gY29tcGxldGVkID0gbUNvbXBsZXRlZFRyYW5zYWN0aW9ucy5maW5kKAorICAgICAgICAgICAgbWVzc2FnZS50cmFuc2FjdGlvbklkKTsKKyAgICBpZiAoY29tcGxldGVkICE9IG1Db21wbGV0ZWRUcmFuc2FjdGlvbnMuZW5kKCkpIHsKKyAgICAgICAgLy8gYWxyZWFkeSBjb21wbGV0ZWQKKyAgICAgICAgbUNvbXBsZXRlZFRyYW5zYWN0aW9ucy5lcmFzZShjb21wbGV0ZWQpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgLy8gdGhlIGJ1ZmZlciBzaG91bGQgZXhpc3QgYW5kIGJlIG93bmVkLgorICAgIGF1dG8gYnVmZmVySXRlciA9IG1CdWZmZXJzLmZpbmQobWVzc2FnZS5idWZmZXJJZCk7CisgICAgaWYgKGJ1ZmZlckl0ZXIgPT0gbUJ1ZmZlcnMuZW5kKCkgfHwKKyAgICAgICAgICAgICFjb250YWlucygmbVVzaW5nQnVmZmVycywgbWVzc2FnZS5jb25uZWN0aW9uSWQsIG1lc3NhZ2UuYnVmZmVySWQpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgYXV0byBmb3VuZCA9IG1UcmFuc2FjdGlvbnMuZmluZChtZXNzYWdlLnRyYW5zYWN0aW9uSWQpOworICAgIGlmIChmb3VuZCAhPSBtVHJhbnNhY3Rpb25zLmVuZCgpKSB7CisgICAgICAgIC8vIHRyYW5zZmVyX2Zyb20gd2FzIHJlY2VpdmVkIGVhcmxpZXIuCisgICAgICAgIGZvdW5kLT5zZWNvbmQtPm1TZW5kZXIgPSBtZXNzYWdlLmNvbm5lY3Rpb25JZDsKKyAgICAgICAgZm91bmQtPnNlY29uZC0+bVNlbmRlclZhbGlkYXRlZCA9IHRydWU7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICAvLyBUT0RPOiB2ZXJpZnkgdGhlcmUgaXMgdGFyZ2V0IGNvbm5lY3Rpb24gSWQKKyAgICBtU3RhdHMub25CdWZmZXJTZW50KCk7CisgICAgbVRyYW5zYWN0aW9ucy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoCisgICAgICAgICAgICBtZXNzYWdlLnRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPFRyYW5zYWN0aW9uU3RhdHVzPihtZXNzYWdlLCBtVGltZXN0YW1wVXMpKSk7CisgICAgaW5zZXJ0KCZtUGVuZGluZ1RyYW5zYWN0aW9ucywgbWVzc2FnZS50YXJnZXRDb25uZWN0aW9uSWQsCisgICAgICAgICAgIG1lc3NhZ2UudHJhbnNhY3Rpb25JZCk7CisgICAgYnVmZmVySXRlci0+c2Vjb25kLT5tVHJhbnNhY3Rpb25Db3VudCsrOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEFjY2Vzc29yOjpJbXBsOjpCdWZmZXJQb29sOjpoYW5kbGVUcmFuc2ZlckZyb20oY29uc3QgQnVmZmVyU3RhdHVzTWVzc2FnZSAmbWVzc2FnZSkgeworICAgIGF1dG8gZm91bmQgPSBtVHJhbnNhY3Rpb25zLmZpbmQobWVzc2FnZS50cmFuc2FjdGlvbklkKTsKKyAgICBpZiAoZm91bmQgPT0gbVRyYW5zYWN0aW9ucy5lbmQoKSkgeworICAgICAgICAvLyBUT0RPOiBpcyBpdCBmZWFzaWJsZSB0byBjaGVjayBvd25lcnNoaXAgaGVyZT8KKyAgICAgICAgbVN0YXRzLm9uQnVmZmVyU2VudCgpOworICAgICAgICBtVHJhbnNhY3Rpb25zLmluc2VydChzdGQ6Om1ha2VfcGFpcigKKyAgICAgICAgICAgICAgICBtZXNzYWdlLnRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxUcmFuc2FjdGlvblN0YXR1cz4obWVzc2FnZSwgbVRpbWVzdGFtcFVzKSkpOworICAgICAgICBpbnNlcnQoJm1QZW5kaW5nVHJhbnNhY3Rpb25zLCBtZXNzYWdlLmNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgICAgIG1lc3NhZ2UudHJhbnNhY3Rpb25JZCk7CisgICAgICAgIGF1dG8gYnVmZmVySXRlciA9IG1CdWZmZXJzLmZpbmQobWVzc2FnZS5idWZmZXJJZCk7CisgICAgICAgIGJ1ZmZlckl0ZXItPnNlY29uZC0+bVRyYW5zYWN0aW9uQ291bnQrKzsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAobWVzc2FnZS5jb25uZWN0aW9uSWQgPT0gZm91bmQtPnNlY29uZC0+bVJlY2VpdmVyKSB7CisgICAgICAgICAgICBmb3VuZC0+c2Vjb25kLT5tU3RhdHVzID0gQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9GUk9NOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIEFjY2Vzc29yOjpJbXBsOjpCdWZmZXJQb29sOjpoYW5kbGVUcmFuc2ZlclJlc3VsdChjb25zdCBCdWZmZXJTdGF0dXNNZXNzYWdlICZtZXNzYWdlKSB7CisgICAgYXV0byBmb3VuZCA9IG1UcmFuc2FjdGlvbnMuZmluZChtZXNzYWdlLnRyYW5zYWN0aW9uSWQpOworICAgIGlmIChmb3VuZCAhPSBtVHJhbnNhY3Rpb25zLmVuZCgpKSB7CisgICAgICAgIGJvb2wgZGVsZXRlZCA9IGVyYXNlKCZtUGVuZGluZ1RyYW5zYWN0aW9ucywgbWVzc2FnZS5jb25uZWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudHJhbnNhY3Rpb25JZCk7CisgICAgICAgIGlmIChkZWxldGVkKSB7CisgICAgICAgICAgICBpZiAoIWZvdW5kLT5zZWNvbmQtPm1TZW5kZXJWYWxpZGF0ZWQpIHsKKyAgICAgICAgICAgICAgICBtQ29tcGxldGVkVHJhbnNhY3Rpb25zLmluc2VydChtZXNzYWdlLnRyYW5zYWN0aW9uSWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXV0byBidWZmZXJJdGVyID0gbUJ1ZmZlcnMuZmluZChtZXNzYWdlLmJ1ZmZlcklkKTsKKyAgICAgICAgICAgIGlmIChtZXNzYWdlLm5ld1N0YXR1cyA9PSBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX09LKSB7CisgICAgICAgICAgICAgICAgaGFuZGxlT3duQnVmZmVyKG1lc3NhZ2UuY29ubmVjdGlvbklkLCBtZXNzYWdlLmJ1ZmZlcklkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJ1ZmZlckl0ZXItPnNlY29uZC0+bVRyYW5zYWN0aW9uQ291bnQtLTsKKyAgICAgICAgICAgIGlmIChidWZmZXJJdGVyLT5zZWNvbmQtPm1Pd25lckNvdW50ID09IDAKKyAgICAgICAgICAgICAgICAmJiBidWZmZXJJdGVyLT5zZWNvbmQtPm1UcmFuc2FjdGlvbkNvdW50ID09IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJ1ZmZlckl0ZXItPnNlY29uZC0+bUludmFsaWRhdGVkKSB7CisgICAgICAgICAgICAgICAgICAgIG1TdGF0cy5vbkJ1ZmZlclVudXNlZChidWZmZXJJdGVyLT5zZWNvbmQtPm1BbGxvY1NpemUpOworICAgICAgICAgICAgICAgICAgICBtRnJlZUJ1ZmZlcnMuaW5zZXJ0KG1lc3NhZ2UuYnVmZmVySWQpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1TdGF0cy5vbkJ1ZmZlclVudXNlZChidWZmZXJJdGVyLT5zZWNvbmQtPm1BbGxvY1NpemUpOworICAgICAgICAgICAgICAgICAgICBtU3RhdHMub25CdWZmZXJFdmljdGVkKGJ1ZmZlckl0ZXItPnNlY29uZC0+bUFsbG9jU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIG1CdWZmZXJzLmVyYXNlKGJ1ZmZlckl0ZXIpOworICAgICAgICAgICAgICAgICAgICBtSW52YWxpZGF0aW9uLm9uQnVmZmVySW52YWxpZGF0ZWQobWVzc2FnZS5idWZmZXJJZCwgbUludmFsaWRhdGlvbkNoYW5uZWwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1UcmFuc2FjdGlvbnMuZXJhc2UoZm91bmQpOworICAgICAgICB9CisgICAgICAgIEFMT0dWKCJ0cmFuc2ZlciBmaW5pc2hlZCAlbGx1ICV1IC0gJWQiLCAodW5zaWduZWQgbG9uZyBsb25nKW1lc3NhZ2UudHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICAgICAgbWVzc2FnZS5idWZmZXJJZCwgZGVsZXRlZCk7CisgICAgICAgIHJldHVybiBkZWxldGVkOworICAgIH0KKyAgICBBTE9HVigidHJhbnNmZXIgbm90IGZvdW5kICVsbHUgJXUiLCAodW5zaWduZWQgbG9uZyBsb25nKW1lc3NhZ2UudHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICBtZXNzYWdlLmJ1ZmZlcklkKTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgQWNjZXNzb3I6OkltcGw6OkJ1ZmZlclBvb2w6OnByb2Nlc3NTdGF0dXNNZXNzYWdlcygpIHsKKyAgICBzdGQ6OnZlY3RvcjxCdWZmZXJTdGF0dXNNZXNzYWdlPiBtZXNzYWdlczsKKyAgICBtT2JzZXJ2ZXIuZ2V0QnVmZmVyU3RhdHVzQ2hhbmdlcyhtZXNzYWdlcyk7CisgICAgbVRpbWVzdGFtcFVzID0gZ2V0VGltZXN0YW1wTm93KCk7CisgICAgZm9yIChCdWZmZXJTdGF0dXNNZXNzYWdlJiBtZXNzYWdlOiBtZXNzYWdlcykgeworICAgICAgICBib29sIHJldCA9IGZhbHNlOworICAgICAgICBzd2l0Y2ggKG1lc3NhZ2UubmV3U3RhdHVzKSB7CisgICAgICAgICAgICBjYXNlIEJ1ZmZlclN0YXR1czo6Tk9UX1VTRUQ6CisgICAgICAgICAgICAgICAgcmV0ID0gaGFuZGxlUmVsZWFzZUJ1ZmZlcigKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuY29ubmVjdGlvbklkLCBtZXNzYWdlLmJ1ZmZlcklkKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQnVmZmVyU3RhdHVzOjpVU0VEOgorICAgICAgICAgICAgICAgIC8vIG5vdCBoYXBwZW5pbmcKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9UTzoKKyAgICAgICAgICAgICAgICByZXQgPSBoYW5kbGVUcmFuc2ZlclRvKG1lc3NhZ2UpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX0ZST006CisgICAgICAgICAgICAgICAgcmV0ID0gaGFuZGxlVHJhbnNmZXJGcm9tKG1lc3NhZ2UpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX1RJTUVPVVQ6CisgICAgICAgICAgICAgICAgLy8gVE9ETworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX0xPU1Q6CisgICAgICAgICAgICAgICAgLy8gVE9ETworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX0ZFVENIOgorICAgICAgICAgICAgICAgIC8vIG5vdCBoYXBwZW5pbmcKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9PSzoKKyAgICAgICAgICAgIGNhc2UgQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9FUlJPUjoKKyAgICAgICAgICAgICAgICByZXQgPSBoYW5kbGVUcmFuc2ZlclJlc3VsdChtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQnVmZmVyU3RhdHVzOjpJTlZBTElEQVRJT05fQUNLOgorICAgICAgICAgICAgICAgIG1JbnZhbGlkYXRpb24ub25BY2sobWVzc2FnZS5jb25uZWN0aW9uSWQsIG1lc3NhZ2UuYnVmZmVySWQpOworICAgICAgICAgICAgICAgIHJldCA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJldCA9PSBmYWxzZSkgeworICAgICAgICAgICAgQUxPR1coImJ1ZmZlciBzdGF0dXMgbWVzc2FnZSBwcm9jZXNzaW5nIGZhaWx1cmUgLSBtZXNzYWdlIDogJWQgY29ubmVjdGlvbiA6ICVsbGQiLAorICAgICAgICAgICAgICAgICAgbWVzc2FnZS5uZXdTdGF0dXMsIChsb25nIGxvbmcpbWVzc2FnZS5jb25uZWN0aW9uSWQpOworICAgICAgICB9CisgICAgfQorICAgIG1lc3NhZ2VzLmNsZWFyKCk7Cit9CisKK2Jvb2wgQWNjZXNzb3I6OkltcGw6OkJ1ZmZlclBvb2w6OmhhbmRsZUNsb3NlKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQpIHsKKyAgICAvLyBDbGVhbmluZyBidWZmZXJzCisgICAgYXV0byBidWZmZXJzID0gbVVzaW5nQnVmZmVycy5maW5kKGNvbm5lY3Rpb25JZCk7CisgICAgaWYgKGJ1ZmZlcnMgIT0gbVVzaW5nQnVmZmVycy5lbmQoKSkgeworICAgICAgICBmb3IgKGNvbnN0IEJ1ZmZlcklkJiBidWZmZXJJZCA6IGJ1ZmZlcnMtPnNlY29uZCkgeworICAgICAgICAgICAgYm9vbCBkZWxldGVkID0gZXJhc2UoJm1Vc2luZ0Nvbm5lY3Rpb25zLCBidWZmZXJJZCwgY29ubmVjdGlvbklkKTsKKyAgICAgICAgICAgIGlmIChkZWxldGVkKSB7CisgICAgICAgICAgICAgICAgYXV0byBidWZmZXJJdGVyID0gbUJ1ZmZlcnMuZmluZChidWZmZXJJZCk7CisgICAgICAgICAgICAgICAgYnVmZmVySXRlci0+c2Vjb25kLT5tT3duZXJDb3VudC0tOworICAgICAgICAgICAgICAgIGlmIChidWZmZXJJdGVyLT5zZWNvbmQtPm1Pd25lckNvdW50ID09IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlckl0ZXItPnNlY29uZC0+bVRyYW5zYWN0aW9uQ291bnQgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBoYW5kbGUgZnJlZWJ1ZmZlciBpbnNlcnQgZmFpbAorICAgICAgICAgICAgICAgICAgICBpZiAoIWJ1ZmZlckl0ZXItPnNlY29uZC0+bUludmFsaWRhdGVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtU3RhdHMub25CdWZmZXJVbnVzZWQoYnVmZmVySXRlci0+c2Vjb25kLT5tQWxsb2NTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1GcmVlQnVmZmVycy5pbnNlcnQoYnVmZmVySWQpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXRzLm9uQnVmZmVyVW51c2VkKGJ1ZmZlckl0ZXItPnNlY29uZC0+bUFsbG9jU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtU3RhdHMub25CdWZmZXJFdmljdGVkKGJ1ZmZlckl0ZXItPnNlY29uZC0+bUFsbG9jU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtQnVmZmVycy5lcmFzZShidWZmZXJJdGVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1JbnZhbGlkYXRpb24ub25CdWZmZXJJbnZhbGlkYXRlZChidWZmZXJJZCwgbUludmFsaWRhdGlvbkNoYW5uZWwpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1Vc2luZ0J1ZmZlcnMuZXJhc2UoYnVmZmVycyk7CisgICAgfQorCisgICAgLy8gQ2xlYW5pbmcgdHJhbnNhY3Rpb25zCisgICAgYXV0byBwZW5kaW5nID0gbVBlbmRpbmdUcmFuc2FjdGlvbnMuZmluZChjb25uZWN0aW9uSWQpOworICAgIGlmIChwZW5kaW5nICE9IG1QZW5kaW5nVHJhbnNhY3Rpb25zLmVuZCgpKSB7CisgICAgICAgIGZvciAoY29uc3QgVHJhbnNhY3Rpb25JZCYgdHJhbnNhY3Rpb25JZCA6IHBlbmRpbmctPnNlY29uZCkgeworICAgICAgICAgICAgYXV0byBpdGVyID0gbVRyYW5zYWN0aW9ucy5maW5kKHRyYW5zYWN0aW9uSWQpOworICAgICAgICAgICAgaWYgKGl0ZXIgIT0gbVRyYW5zYWN0aW9ucy5lbmQoKSkgeworICAgICAgICAgICAgICAgIGlmICghaXRlci0+c2Vjb25kLT5tU2VuZGVyVmFsaWRhdGVkKSB7CisgICAgICAgICAgICAgICAgICAgIG1Db21wbGV0ZWRUcmFuc2FjdGlvbnMuaW5zZXJ0KHRyYW5zYWN0aW9uSWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCA9IGl0ZXItPnNlY29uZC0+bUJ1ZmZlcklkOworICAgICAgICAgICAgICAgIGF1dG8gYnVmZmVySXRlciA9IG1CdWZmZXJzLmZpbmQoYnVmZmVySWQpOworICAgICAgICAgICAgICAgIGJ1ZmZlckl0ZXItPnNlY29uZC0+bVRyYW5zYWN0aW9uQ291bnQtLTsKKyAgICAgICAgICAgICAgICBpZiAoYnVmZmVySXRlci0+c2Vjb25kLT5tT3duZXJDb3VudCA9PSAwICYmCisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlckl0ZXItPnNlY29uZC0+bVRyYW5zYWN0aW9uQ291bnQgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBoYW5kbGUgZnJlZWJ1ZmZlciBpbnNlcnQgZmFpbAorICAgICAgICAgICAgICAgICAgICBpZiAoIWJ1ZmZlckl0ZXItPnNlY29uZC0+bUludmFsaWRhdGVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtU3RhdHMub25CdWZmZXJVbnVzZWQoYnVmZmVySXRlci0+c2Vjb25kLT5tQWxsb2NTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1GcmVlQnVmZmVycy5pbnNlcnQoYnVmZmVySWQpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXRzLm9uQnVmZmVyVW51c2VkKGJ1ZmZlckl0ZXItPnNlY29uZC0+bUFsbG9jU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtU3RhdHMub25CdWZmZXJFdmljdGVkKGJ1ZmZlckl0ZXItPnNlY29uZC0+bUFsbG9jU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtQnVmZmVycy5lcmFzZShidWZmZXJJdGVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1JbnZhbGlkYXRpb24ub25CdWZmZXJJbnZhbGlkYXRlZChidWZmZXJJZCwgbUludmFsaWRhdGlvbkNoYW5uZWwpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1UcmFuc2FjdGlvbnMuZXJhc2UoaXRlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQWNjZXNzb3I6OkltcGw6OkJ1ZmZlclBvb2w6OmdldEZyZWVCdWZmZXIoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdG9yPiAmYWxsb2NhdG9yLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLCBCdWZmZXJJZCAqcElkLAorICAgICAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QqKiBoYW5kbGUpIHsKKyAgICBhdXRvIGJ1ZmZlckl0ID0gbUZyZWVCdWZmZXJzLmJlZ2luKCk7CisgICAgZm9yICg7YnVmZmVySXQgIT0gbUZyZWVCdWZmZXJzLmVuZCgpOyArK2J1ZmZlckl0KSB7CisgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkID0gKmJ1ZmZlckl0OworICAgICAgICBpZiAoYWxsb2NhdG9yLT5jb21wYXRpYmxlKHBhcmFtcywgbUJ1ZmZlcnNbYnVmZmVySWRdLT5tQ29uZmlnKSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGJ1ZmZlckl0ICE9IG1GcmVlQnVmZmVycy5lbmQoKSkgeworICAgICAgICBCdWZmZXJJZCBpZCA9ICpidWZmZXJJdDsKKyAgICAgICAgbUZyZWVCdWZmZXJzLmVyYXNlKGJ1ZmZlckl0KTsKKyAgICAgICAgbVN0YXRzLm9uQnVmZmVyUmVjeWNsZWQobUJ1ZmZlcnNbaWRdLT5tQWxsb2NTaXplKTsKKyAgICAgICAgKmhhbmRsZSA9IG1CdWZmZXJzW2lkXS0+aGFuZGxlKCk7CisgICAgICAgICpwSWQgPSBpZDsKKyAgICAgICAgQUxPR1YoInJlY3ljbGUgYSBidWZmZXIgJXUgJXAiLCBpZCwgKmhhbmRsZSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK1Jlc3VsdFN0YXR1cyBBY2Nlc3Nvcjo6SW1wbDo6QnVmZmVyUG9vbDo6YWRkTmV3QnVmZmVyKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRpb24+ICZhbGxvYywKKyAgICAgICAgY29uc3Qgc2l6ZV90IGFsbG9jU2l6ZSwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywKKyAgICAgICAgQnVmZmVySWQgKnBJZCwKKyAgICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90KiogaGFuZGxlKSB7CisKKyAgICBCdWZmZXJJZCBidWZmZXJJZCA9IG1TZXErKzsKKyAgICBpZiAobVNlcSA9PSBDb25uZWN0aW9uOjpTWU5DX0JVRkZFUklEKSB7CisgICAgICAgIG1TZXEgPSAwOworICAgIH0KKyAgICBzdGQ6OnVuaXF1ZV9wdHI8SW50ZXJuYWxCdWZmZXI+IGJ1ZmZlciA9CisgICAgICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPEludGVybmFsQnVmZmVyPigKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVySWQsIGFsbG9jLCBhbGxvY1NpemUsIHBhcmFtcyk7CisgICAgaWYgKGJ1ZmZlcikgeworICAgICAgICBhdXRvIHJlcyA9IG1CdWZmZXJzLmluc2VydChzdGQ6Om1ha2VfcGFpcigKKyAgICAgICAgICAgICAgICBidWZmZXJJZCwgc3RkOjptb3ZlKGJ1ZmZlcikpKTsKKyAgICAgICAgaWYgKHJlcy5zZWNvbmQpIHsKKyAgICAgICAgICAgIG1TdGF0cy5vbkJ1ZmZlckFsbG9jYXRlZChhbGxvY1NpemUpOworICAgICAgICAgICAgKmhhbmRsZSA9IGFsbG9jLT5oYW5kbGUoKTsKKyAgICAgICAgICAgICpwSWQgPSBidWZmZXJJZDsKKyAgICAgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok9LOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok5PX01FTU9SWTsKK30KKwordm9pZCBBY2Nlc3Nvcjo6SW1wbDo6QnVmZmVyUG9vbDo6Y2xlYW5VcChib29sIGNsZWFyQ2FjaGUpIHsKKyAgICBpZiAoY2xlYXJDYWNoZSB8fCBtVGltZXN0YW1wVXMgPiBtTGFzdENsZWFuVXBVcyArIGtDbGVhblVwRHVyYXRpb25VcykgeworICAgICAgICBtTGFzdENsZWFuVXBVcyA9IG1UaW1lc3RhbXBVczsKKyAgICAgICAgaWYgKG1UaW1lc3RhbXBVcyA+IG1MYXN0TG9nVXMgKyBrTG9nRHVyYXRpb25VcykgeworICAgICAgICAgICAgbUxhc3RMb2dVcyA9IG1UaW1lc3RhbXBVczsKKyAgICAgICAgICAgIEFMT0dEKCJidWZmZXJwb29sICVwIDogJXp1KCV6dSBzaXplKSB0b3RhbCBidWZmZXJzIC0gIgorICAgICAgICAgICAgICAgICAgIiV6dSglenUgc2l6ZSkgdXNlZCBidWZmZXJzIC0gJXp1LyV6dSAocmVjeWNsZS9hbGxvYykgLSAiCisgICAgICAgICAgICAgICAgICAiJXp1LyV6dSAoZmV0Y2gvdHJhbnNmZXIpIiwKKyAgICAgICAgICAgICAgICAgIHRoaXMsIG1TdGF0cy5tQnVmZmVyc0NhY2hlZCwgbVN0YXRzLm1TaXplQ2FjaGVkLAorICAgICAgICAgICAgICAgICAgbVN0YXRzLm1CdWZmZXJzSW5Vc2UsIG1TdGF0cy5tU2l6ZUluVXNlLAorICAgICAgICAgICAgICAgICAgbVN0YXRzLm1Ub3RhbFJlY3ljbGVzLCBtU3RhdHMubVRvdGFsQWxsb2NhdGlvbnMsCisgICAgICAgICAgICAgICAgICBtU3RhdHMubVRvdGFsRmV0Y2hlcywgbVN0YXRzLm1Ub3RhbFRyYW5zZmVycyk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChhdXRvIGZyZWVJdCA9IG1GcmVlQnVmZmVycy5iZWdpbigpOyBmcmVlSXQgIT0gbUZyZWVCdWZmZXJzLmVuZCgpOykgeworICAgICAgICAgICAgaWYgKCFjbGVhckNhY2hlICYmIG1TdGF0cy5tU2l6ZUNhY2hlZCA8IGtNaW5BbGxvY0J5dGVzRm9yRXZpY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgJiYgbUJ1ZmZlcnMuc2l6ZSgpIDwga01pbkJ1ZmZlckNvdW50Rm9yRXZpY3Rpb24pIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF1dG8gaXQgPSBtQnVmZmVycy5maW5kKCpmcmVlSXQpOworICAgICAgICAgICAgaWYgKGl0ICE9IG1CdWZmZXJzLmVuZCgpICYmCisgICAgICAgICAgICAgICAgICAgIGl0LT5zZWNvbmQtPm1Pd25lckNvdW50ID09IDAgJiYgaXQtPnNlY29uZC0+bVRyYW5zYWN0aW9uQ291bnQgPT0gMCkgeworICAgICAgICAgICAgICAgIG1TdGF0cy5vbkJ1ZmZlckV2aWN0ZWQoaXQtPnNlY29uZC0+bUFsbG9jU2l6ZSk7CisgICAgICAgICAgICAgICAgbUJ1ZmZlcnMuZXJhc2UoaXQpOworICAgICAgICAgICAgICAgIGZyZWVJdCA9IG1GcmVlQnVmZmVycy5lcmFzZShmcmVlSXQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICArK2ZyZWVJdDsKKyAgICAgICAgICAgICAgICBBTE9HVygiYnVmZmVycG9vbCBpbmNvbnNpc3RlbnQhIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgQWNjZXNzb3I6OkltcGw6OkJ1ZmZlclBvb2w6OmludmFsaWRhdGUoCisgICAgICAgIGJvb2wgbmVlZHNBY2ssIEJ1ZmZlcklkIGZyb20sIEJ1ZmZlcklkIHRvLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QWNjZXNzb3I6OkltcGw+ICZpbXBsKSB7CisgICAgZm9yIChhdXRvIGZyZWVJdCA9IG1GcmVlQnVmZmVycy5iZWdpbigpOyBmcmVlSXQgIT0gbUZyZWVCdWZmZXJzLmVuZCgpOykgeworICAgICAgICBpZiAoaXNCdWZmZXJJblJhbmdlKGZyb20sIHRvLCAqZnJlZUl0KSkgeworICAgICAgICAgICAgYXV0byBpdCA9IG1CdWZmZXJzLmZpbmQoKmZyZWVJdCk7CisgICAgICAgICAgICBpZiAoaXQgIT0gbUJ1ZmZlcnMuZW5kKCkgJiYKKyAgICAgICAgICAgICAgICBpdC0+c2Vjb25kLT5tT3duZXJDb3VudCA9PSAwICYmIGl0LT5zZWNvbmQtPm1UcmFuc2FjdGlvbkNvdW50ID09IDApIHsKKyAgICAgICAgICAgICAgICBtU3RhdHMub25CdWZmZXJFdmljdGVkKGl0LT5zZWNvbmQtPm1BbGxvY1NpemUpOworICAgICAgICAgICAgICAgIG1CdWZmZXJzLmVyYXNlKGl0KTsKKyAgICAgICAgICAgICAgICBmcmVlSXQgPSBtRnJlZUJ1ZmZlcnMuZXJhc2UoZnJlZUl0KTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR1coImJ1ZmZlcnBvb2wgaW5jb25zaXN0ZW50ISIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICsrZnJlZUl0OworICAgIH0KKworICAgIHNpemVfdCBsZWZ0ID0gMDsKKyAgICBmb3IgKGF1dG8gaXQgPSBtQnVmZmVycy5iZWdpbigpOyBpdCAhPSBtQnVmZmVycy5lbmQoKTsgKytpdCkgeworICAgICAgICBpZiAoaXNCdWZmZXJJblJhbmdlKGZyb20sIHRvLCBpdC0+Zmlyc3QpKSB7CisgICAgICAgICAgICBpdC0+c2Vjb25kLT5pbnZhbGlkYXRlKCk7CisgICAgICAgICAgICArK2xlZnQ7CisgICAgICAgIH0KKyAgICB9CisgICAgbUludmFsaWRhdGlvbi5vbkludmFsaWRhdGlvblJlcXVlc3QobmVlZHNBY2ssIGZyb20sIHRvLCBsZWZ0LCBtSW52YWxpZGF0aW9uQ2hhbm5lbCwgaW1wbCk7Cit9CisKK3ZvaWQgQWNjZXNzb3I6OkltcGw6OkJ1ZmZlclBvb2w6OmZsdXNoKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxBY2Nlc3Nvcjo6SW1wbD4gJmltcGwpIHsKKyAgICBCdWZmZXJJZCBmcm9tID0gbVN0YXJ0U2VxOworICAgIEJ1ZmZlcklkIHRvID0gbVNlcTsKKyAgICBtU3RhcnRTZXEgPSBtU2VxOworICAgIC8vIFRPRE86IG5lZWRzQWNrIHBhcmFtcyAKKyAgICBBTE9HVigiYnVmZmVyIGludmFsaWRhdGlvbiByZXF1ZXN0IGJwOiV1ICV1ICV1IiwgbUludmFsaWRhdGlvbi5tSWQsIGZyb20sIHRvKTsKKyAgICBpZiAoZnJvbSAhPSB0bykgeworICAgICAgICBpbnZhbGlkYXRlKHRydWUsIGZyb20sIHRvLCBpbXBsKTsKKyAgICB9Cit9CisKK3ZvaWQgQWNjZXNzb3I6OkltcGw6OmludmFsaWRhdG9yVGhyZWFkKAorICAgICAgICAgICAgc3RkOjptYXA8dWludDMyX3QsIGNvbnN0IHN0ZDo6d2Vha19wdHI8QWNjZXNzb3I6OkltcGw+PiAmYWNjZXNzb3JzLAorICAgICAgICAgICAgc3RkOjptdXRleCAmbXV0ZXgsCisgICAgICAgICAgICBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSAmY3YsCisgICAgICAgICAgICBib29sICZyZWFkeSkgeworICAgIHdoaWxlKHRydWUpIHsKKyAgICAgICAgc3RkOjptYXA8dWludDMyX3QsIGNvbnN0IHN0ZDo6d2Vha19wdHI8QWNjZXNzb3I6OkltcGw+PiBjb3BpZWQ7CisgICAgICAgIHsKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhtdXRleCk7CisgICAgICAgICAgICBpZiAoIXJlYWR5KSB7CisgICAgICAgICAgICAgICAgY3Yud2FpdChsb2NrKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvcGllZC5pbnNlcnQoYWNjZXNzb3JzLmJlZ2luKCksIGFjY2Vzc29ycy5lbmQoKSk7CisgICAgICAgIH0KKyAgICAgICAgc3RkOjpsaXN0PENvbm5lY3Rpb25JZD4gZXJhc2VkOworICAgICAgICBmb3IgKGF1dG8gaXQgPSBjb3BpZWQuYmVnaW4oKTsgaXQgIT0gY29waWVkLmVuZCgpOyArK2l0KSB7CisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QWNjZXNzb3I6OkltcGw+IGltcGwgPSBpdC0+c2Vjb25kLmxvY2soKTsKKyAgICAgICAgICAgIGlmICghaW1wbCkgeworICAgICAgICAgICAgICAgIGVyYXNlZC5wdXNoX2JhY2soaXQtPmZpcnN0KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW1wbC0+aGFuZGxlSW52YWxpZGF0ZUFjaygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhtdXRleCk7CisgICAgICAgICAgICBmb3IgKGF1dG8gaXQgPSBlcmFzZWQuYmVnaW4oKTsgaXQgIT0gZXJhc2VkLmVuZCgpOyArK2l0KSB7CisgICAgICAgICAgICAgICAgYWNjZXNzb3JzLmVyYXNlKCppdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYWNjZXNzb3JzLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgcmVhZHkgPSBmYWxzZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gcHJldmVudCBkcmFpbmluZyBjcHUuCisgICAgICAgICAgICAgICAgbG9jay51bmxvY2soKTsKKyAgICAgICAgICAgICAgICBzdGQ6OnRoaXNfdGhyZWFkOjp5aWVsZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitBY2Nlc3Nvcjo6SW1wbDo6QWNjZXNzb3JJbnZhbGlkYXRvcjo6QWNjZXNzb3JJbnZhbGlkYXRvcigpIDogbVJlYWR5KGZhbHNlKSB7CisgICAgc3RkOjp0aHJlYWQgaW52YWxpZGF0b3IoCisgICAgICAgICAgICBpbnZhbGlkYXRvclRocmVhZCwKKyAgICAgICAgICAgIHN0ZDo6cmVmKG1BY2Nlc3NvcnMpLAorICAgICAgICAgICAgc3RkOjpyZWYobU11dGV4KSwKKyAgICAgICAgICAgIHN0ZDo6cmVmKG1DdiksCisgICAgICAgICAgICBzdGQ6OnJlZihtUmVhZHkpKTsKKyAgICBpbnZhbGlkYXRvci5kZXRhY2goKTsKK30KKwordm9pZCBBY2Nlc3Nvcjo6SW1wbDo6QWNjZXNzb3JJbnZhbGlkYXRvcjo6YWRkQWNjZXNzb3IoCisgICAgICAgIHVpbnQzMl90IGFjY2Vzc29ySWQsIGNvbnN0IHN0ZDo6d2Vha19wdHI8QWNjZXNzb3I6OkltcGw+ICZpbXBsKSB7CisgICAgYm9vbCBub3RpZnkgPSBmYWxzZTsKKyAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICBpZiAobUFjY2Vzc29ycy5maW5kKGFjY2Vzc29ySWQpID09IG1BY2Nlc3NvcnMuZW5kKCkpIHsKKyAgICAgICAgaWYgKCFtUmVhZHkpIHsKKyAgICAgICAgICAgIG1SZWFkeSA9IHRydWU7CisgICAgICAgICAgICBub3RpZnkgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIG1BY2Nlc3NvcnMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKGFjY2Vzc29ySWQsIGltcGwpKTsKKyAgICAgICAgQUxPR1YoImJ1ZmZlciBpbnZhbGlkYXRpb24gYWRkZWQgYnA6JXUgJWQiLCBhY2Nlc3NvcklkLCBub3RpZnkpOworICAgIH0KKyAgICBsb2NrLnVubG9jaygpOworICAgIGlmIChub3RpZnkpIHsKKyAgICAgICAgbUN2Lm5vdGlmeV9vbmUoKTsKKyAgICB9Cit9CisKK3ZvaWQgQWNjZXNzb3I6OkltcGw6OkFjY2Vzc29ySW52YWxpZGF0b3I6OmRlbEFjY2Vzc29yKHVpbnQzMl90IGFjY2Vzc29ySWQpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworICAgIG1BY2Nlc3NvcnMuZXJhc2UoYWNjZXNzb3JJZCk7CisgICAgQUxPR1YoImJ1ZmZlciBpbnZhbGlkYXRpb24gZGVsZXRlZCBicDoldSIsIGFjY2Vzc29ySWQpOworICAgIGlmIChtQWNjZXNzb3JzLnNpemUoKSA9PSAwKSB7CisgICAgICAgIG1SZWFkeSA9IGZhbHNlOworICAgIH0KK30KKworc3RkOjp1bmlxdWVfcHRyPEFjY2Vzc29yOjpJbXBsOjpBY2Nlc3NvckludmFsaWRhdG9yPiBBY2Nlc3Nvcjo6SW1wbDo6c0ludmFsaWRhdG9yOworCit2b2lkIEFjY2Vzc29yOjpJbXBsOjpjcmVhdGVJbnZhbGlkYXRvcigpIHsKKyAgICBpZiAoIXNJbnZhbGlkYXRvcikgeworICAgICAgICBzSW52YWxpZGF0b3IgPSBzdGQ6Om1ha2VfdW5pcXVlPEFjY2Vzc29yOjpJbXBsOjpBY2Nlc3NvckludmFsaWRhdG9yPigpOworICAgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uCit9ICAvLyBuYW1lc3BhY2UgVjJfMAorfSAgLy8gbmFtZXNwYWNlIGJ1ZmZlcnBvb2wKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8yLjAvQWNjZXNzb3JJbXBsLmggYi9tZWRpYS9idWZmZXJwb29sLzIuMC9BY2Nlc3NvckltcGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2ZhYTk2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvQWNjZXNzb3JJbXBsLmgKQEAgLTAsMCArMSwzOTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMl8wX0FDQ0VTU09SSU1QTF9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMl8wX0FDQ0VTU09SSU1QTF9ICisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPGNvbmRpdGlvbl92YXJpYWJsZT4KKyNpbmNsdWRlICJBY2Nlc3Nvci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBidWZmZXJwb29sIHsKK25hbWVzcGFjZSBWMl8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKK3N0cnVjdCBJbnRlcm5hbEJ1ZmZlcjsKK3N0cnVjdCBUcmFuc2FjdGlvblN0YXR1czsKKworLyoqCisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiBhIGJ1ZmZlciBwb29sIGFjY2Vzc29yKG9yIGEgYnVmZmVyIHBvb2wgaW1wbGVtZW50YXRpb24uKSAqLworY2xhc3MgQWNjZXNzb3I6OkltcGwKKyAgICA6IHB1YmxpYyBzdGQ6OmVuYWJsZV9zaGFyZWRfZnJvbV90aGlzPEFjY2Vzc29yOjpJbXBsPiB7CitwdWJsaWM6CisgICAgSW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRvcj4gJmFsbG9jYXRvcik7CisKKyAgICB+SW1wbCgpOworCisgICAgUmVzdWx0U3RhdHVzIGNvbm5lY3QoCisgICAgICAgICAgICBjb25zdCBzcDxBY2Nlc3Nvcj4gJmFjY2Vzc29yLCBjb25zdCBzcDxJT2JzZXJ2ZXI+ICZvYnNlcnZlciwKKyAgICAgICAgICAgIHNwPENvbm5lY3Rpb24+ICpjb25uZWN0aW9uLAorICAgICAgICAgICAgQ29ubmVjdGlvbklkICpwQ29ubmVjdGlvbklkLAorICAgICAgICAgICAgdWludDMyX3QgKnBNc2dJZCwKKyAgICAgICAgICAgIGNvbnN0IFN0YXR1c0Rlc2NyaXB0b3IqKiBzdGF0dXNEZXNjUHRyLAorICAgICAgICAgICAgY29uc3QgSW52YWxpZGF0aW9uRGVzY3JpcHRvcioqIGludkRlc2NQdHIpOworCisgICAgUmVzdWx0U3RhdHVzIGNsb3NlKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQpOworCisgICAgUmVzdWx0U3RhdHVzIGFsbG9jYXRlKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlcklkICpidWZmZXJJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90KiogaGFuZGxlKTsKKworICAgIFJlc3VsdFN0YXR1cyBmZXRjaChDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QqKiBoYW5kbGUpOworCisgICAgdm9pZCBmbHVzaCgpOworCisgICAgdm9pZCBjbGVhblVwKGJvb2wgY2xlYXJDYWNoZSk7CisKKyAgICBib29sIGlzVmFsaWQoKTsKKworICAgIHZvaWQgaGFuZGxlSW52YWxpZGF0ZUFjaygpOworCisgICAgc3RhdGljIHZvaWQgY3JlYXRlSW52YWxpZGF0b3IoKTsKKworcHJpdmF0ZToKKyAgICAvLyBDb25uZWN0aW9uSWQgPSBwaWQgOiAodGltZXN0YW1wX2NyZWF0ZWQgKyBzZXFJZCkKKyAgICAvLyBpbiBvcmRlciB0byBndWFyYW50ZWUgdW5pcXVlbmVzcyBmb3IgZWFjaCBjb25uZWN0aW9uCisgICAgc3RhdGljIHVpbnQzMl90IHNTZXFJZDsKKyAgICBzdGF0aWMgaW50MzJfdCBzUGlkOworCisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0b3I+IG1BbGxvY2F0b3I7CisKKyAgICAvKioKKyAgICAgKiBCdWZmZXIgcG9vbCBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKgorICAgICAqIEhhbmRsZXMgYnVmZmVyIHN0YXR1cyBtZXNzYWdlcy4gSGFuZGxlcyBidWZmZXIgYWxsb2NhdGlvbi9yZWN5Y2xpbmcuCisgICAgICogSGFuZGxlcyBidWZmZXIgdHJhbnNmZXIgYmV0d2VlbiBidWZmZXIgcG9vbCBjbGllbnRzLgorICAgICAqLworICAgIHN0cnVjdCBCdWZmZXJQb29sIHsKKyAgICBwcml2YXRlOgorICAgICAgICBzdGQ6Om11dGV4IG1NdXRleDsKKyAgICAgICAgaW50NjRfdCBtVGltZXN0YW1wVXM7CisgICAgICAgIGludDY0X3QgbUxhc3RDbGVhblVwVXM7CisgICAgICAgIGludDY0X3QgbUxhc3RMb2dVczsKKyAgICAgICAgQnVmZmVySWQgbVNlcTsKKyAgICAgICAgQnVmZmVySWQgbVN0YXJ0U2VxOworICAgICAgICBib29sIG1WYWxpZDsKKyAgICAgICAgQnVmZmVyU3RhdHVzT2JzZXJ2ZXIgbU9ic2VydmVyOworICAgICAgICBCdWZmZXJJbnZhbGlkYXRpb25DaGFubmVsIG1JbnZhbGlkYXRpb25DaGFubmVsOworCisgICAgICAgIHN0ZDo6bWFwPENvbm5lY3Rpb25JZCwgc3RkOjpzZXQ8QnVmZmVySWQ+PiBtVXNpbmdCdWZmZXJzOworICAgICAgICBzdGQ6Om1hcDxCdWZmZXJJZCwgc3RkOjpzZXQ8Q29ubmVjdGlvbklkPj4gbVVzaW5nQ29ubmVjdGlvbnM7CisKKyAgICAgICAgc3RkOjptYXA8Q29ubmVjdGlvbklkLCBzdGQ6OnNldDxUcmFuc2FjdGlvbklkPj4gbVBlbmRpbmdUcmFuc2FjdGlvbnM7CisgICAgICAgIC8vIFRyYW5zYWN0aW9ucyBjb21wbGV0ZWQgYmVmb3JlIFRSQU5TRkVSX1RPIG1lc3NhZ2UgYXJyaXZhbC4KKyAgICAgICAgLy8gRmV0Y2ggZG9lcyBub3Qgb2NjdXIgZm9yIHRoZSB0cmFuc2FjdGlvbnMuCisgICAgICAgIC8vIE9ubHkgdHJhbnNhY3Rpb24gaWQgaXMga2VwdCBmb3IgdGhlIHRyYW5zYWN0aW9ucyBpbiBzaG9ydCBkdXJhdGlvbi4KKyAgICAgICAgc3RkOjpzZXQ8VHJhbnNhY3Rpb25JZD4gbUNvbXBsZXRlZFRyYW5zYWN0aW9uczsKKyAgICAgICAgLy8gQ3VycmVudGx5IGFjdGl2ZShwZW5kaW5nKSB0cmFuc2F0aW9ucycgc3RhdHVzICYgaW5mb3JtYXRpb24uCisgICAgICAgIHN0ZDo6bWFwPFRyYW5zYWN0aW9uSWQsIHN0ZDo6dW5pcXVlX3B0cjxUcmFuc2FjdGlvblN0YXR1cz4+CisgICAgICAgICAgICAgICAgbVRyYW5zYWN0aW9uczsKKworICAgICAgICBzdGQ6Om1hcDxCdWZmZXJJZCwgc3RkOjp1bmlxdWVfcHRyPEludGVybmFsQnVmZmVyPj4gbUJ1ZmZlcnM7CisgICAgICAgIHN0ZDo6c2V0PEJ1ZmZlcklkPiBtRnJlZUJ1ZmZlcnM7CisKKyAgICAgICAgc3RydWN0IEludmFsaWRhdGlvbiB7CisgICAgICAgICAgICBzdGF0aWMgc3RkOjphdG9taWM8c3RkOjp1aW50MzJfdD4gc0ludlNlcUlkOworCisgICAgICAgICAgICBzdHJ1Y3QgUGVuZGluZyB7CisgICAgICAgICAgICAgICAgYm9vbCBtTmVlZHNBY2s7CisgICAgICAgICAgICAgICAgdWludDMyX3QgbUZyb207CisgICAgICAgICAgICAgICAgdWludDMyX3QgbVRvOworICAgICAgICAgICAgICAgIHNpemVfdCBtTGVmdDsKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OndlYWtfcHRyPEFjY2Vzc29yOjpJbXBsPiBtSW1wbDsKKyAgICAgICAgICAgICAgICBQZW5kaW5nKGJvb2wgbmVlZHNBY2ssIHVpbnQzMl90IGZyb20sIHVpbnQzMl90IHRvLCBzaXplX3QgbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxBY2Nlc3Nvcjo6SW1wbD4gJmltcGwpCisgICAgICAgICAgICAgICAgICAgICAgICA6IG1OZWVkc0FjayhuZWVkc0FjayksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1Gcm9tKGZyb20pLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtVG8odG8pLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtTGVmdChsZWZ0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbUltcGwoaW1wbCkKKyAgICAgICAgICAgICAgICB7fQorCisgICAgICAgICAgICAgICAgYm9vbCBpc0ludmFsaWRhdGVkKHVpbnQzMl90IGJ1ZmZlcklkKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBpc0J1ZmZlckluUmFuZ2UobUZyb20sIG1UbywgYnVmZmVySWQpICYmIC0tbUxlZnQgPT0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICBzdGQ6Omxpc3Q8UGVuZGluZz4gbVBlbmRpbmdzOworICAgICAgICAgICAgc3RkOjptYXA8Q29ubmVjdGlvbklkLCB1aW50MzJfdD4gbUFja3M7CisgICAgICAgICAgICBzdGQ6Om1hcDxDb25uZWN0aW9uSWQsIGNvbnN0IHNwPElPYnNlcnZlcj4+IG1PYnNlcnZlcnM7CisgICAgICAgICAgICB1aW50MzJfdCBtSW52YWxpZGF0aW9uSWQ7CisgICAgICAgICAgICB1aW50MzJfdCBtSWQ7CisKKyAgICAgICAgICAgIEludmFsaWRhdGlvbigpIDogbUludmFsaWRhdGlvbklkKDApLCBtSWQoc0ludlNlcUlkLmZldGNoX2FkZCgxKSkge30KKworICAgICAgICAgICAgdm9pZCBvbkNvbm5lY3QoQ29ubmVjdGlvbklkIGNvbklkLCBjb25zdCBzcDxJT2JzZXJ2ZXI+ICZvYnNlcnZlcik7CisKKyAgICAgICAgICAgIHZvaWQgb25DbG9zZShDb25uZWN0aW9uSWQgY29uSWQpOworCisgICAgICAgICAgICB2b2lkIG9uQWNrKENvbm5lY3Rpb25JZCBjb25JZCwgdWludDMyX3QgbXNnSWQpOworCisgICAgICAgICAgICB2b2lkIG9uQnVmZmVySW52YWxpZGF0ZWQoCisgICAgICAgICAgICAgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkLAorICAgICAgICAgICAgICAgICAgICBCdWZmZXJJbnZhbGlkYXRpb25DaGFubmVsICZjaGFubmVsKTsKKworICAgICAgICAgICAgdm9pZCBvbkludmFsaWRhdGlvblJlcXVlc3QoCisgICAgICAgICAgICAgICAgICAgIGJvb2wgbmVlZHNBY2ssIHVpbnQzMl90IGZyb20sIHVpbnQzMl90IHRvLCBzaXplX3QgbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgQnVmZmVySW52YWxpZGF0aW9uQ2hhbm5lbCAmY2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEFjY2Vzc29yOjpJbXBsPiAmaW1wbCk7CisKKyAgICAgICAgICAgIHZvaWQgb25IYW5kbGVBY2soKTsKKyAgICAgICAgfSBtSW52YWxpZGF0aW9uOworICAgICAgICAvLy8gQnVmZmVyIHBvb2wgc3RhdGlzdGljcyB3aGljaCB0cmFja3MgYWxsb2NhdGlvbiBhbmQgdHJhbnNmZXIgc3RhdGlzdGljcy4KKyAgICAgICAgc3RydWN0IFN0YXRzIHsKKyAgICAgICAgICAgIC8vLyBUb3RhbCBzaXplIG9mIGFsbG9jYXRpb25zIHdoaWNoIGFyZSB1c2VkIG9yIGF2YWlsYWJsZSB0byB1c2UuCisgICAgICAgICAgICAvLy8gKGJ5dGVzIG9yIHBpeGVscykKKyAgICAgICAgICAgIHNpemVfdCBtU2l6ZUNhY2hlZDsKKyAgICAgICAgICAgIC8vLyAjIG9mIGNhY2hlZCBidWZmZXJzIHdoaWNoIGFyZSB1c2VkIG9yIGF2YWlsYWJsZSB0byB1c2UuCisgICAgICAgICAgICBzaXplX3QgbUJ1ZmZlcnNDYWNoZWQ7CisgICAgICAgICAgICAvLy8gVG90YWwgc2l6ZSBvZiBhbGxvY2F0aW9ucyB3aGljaCBhcmUgY3VycmVudGx5IHVzZWQuIChieXRlcyBvciBwaXhlbHMpCisgICAgICAgICAgICBzaXplX3QgbVNpemVJblVzZTsKKyAgICAgICAgICAgIC8vLyAjIG9mIGN1cnJlbnRseSB1c2VkIGJ1ZmZlcnMKKyAgICAgICAgICAgIHNpemVfdCBtQnVmZmVyc0luVXNlOworCisgICAgICAgICAgICAvLy8gIyBvZiBhbGxvY2F0aW9ucyBjYWxsZWQgb24gYnVmZmVycG9vbC4gKCMgb2YgZmV0Y2hlZCBmcm9tIEJsb2NrUG9vbCkKKyAgICAgICAgICAgIHNpemVfdCBtVG90YWxBbGxvY2F0aW9uczsKKyAgICAgICAgICAgIC8vLyAjIG9mIGFsbG9jYXRpb25zIHRoYXQgd2VyZSBzZXJ2ZWQgZnJvbSB0aGUgY2FjaGUuCisgICAgICAgICAgICAvLy8gKCMgb2YgYWxsb2NhdG9yIGFsbG9jIHByZXZlbnRlZCkKKyAgICAgICAgICAgIHNpemVfdCBtVG90YWxSZWN5Y2xlczsKKyAgICAgICAgICAgIC8vLyAjIG9mIGJ1ZmZlciB0cmFuc2ZlcnMgaW5pdGlhdGVkLgorICAgICAgICAgICAgc2l6ZV90IG1Ub3RhbFRyYW5zZmVyczsKKyAgICAgICAgICAgIC8vLyAjIG9mIHRyYW5zZmVycyB0aGF0IGhhZCB0byBiZSBmZXRjaGVkLgorICAgICAgICAgICAgc2l6ZV90IG1Ub3RhbEZldGNoZXM7CisKKyAgICAgICAgICAgIFN0YXRzKCkKKyAgICAgICAgICAgICAgICA6IG1TaXplQ2FjaGVkKDApLCBtQnVmZmVyc0NhY2hlZCgwKSwgbVNpemVJblVzZSgwKSwgbUJ1ZmZlcnNJblVzZSgwKSwKKyAgICAgICAgICAgICAgICAgIG1Ub3RhbEFsbG9jYXRpb25zKDApLCBtVG90YWxSZWN5Y2xlcygwKSwgbVRvdGFsVHJhbnNmZXJzKDApLCBtVG90YWxGZXRjaGVzKDApIHt9CisKKyAgICAgICAgICAgIC8vLyBBIG5ldyBidWZmZXIgaXMgYWxsb2NhdGVkIG9uIGFuIGFsbG9jYXRpb24gcmVxdWVzdC4KKyAgICAgICAgICAgIHZvaWQgb25CdWZmZXJBbGxvY2F0ZWQoc2l6ZV90IGFsbG9jU2l6ZSkgeworICAgICAgICAgICAgICAgIG1TaXplQ2FjaGVkICs9IGFsbG9jU2l6ZTsKKyAgICAgICAgICAgICAgICBtQnVmZmVyc0NhY2hlZCsrOworCisgICAgICAgICAgICAgICAgbVNpemVJblVzZSArPSBhbGxvY1NpemU7CisgICAgICAgICAgICAgICAgbUJ1ZmZlcnNJblVzZSsrOworCisgICAgICAgICAgICAgICAgbVRvdGFsQWxsb2NhdGlvbnMrKzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8vIEEgYnVmZmVyIGlzIGV2aWN0ZWQgYW5kIGRlc3Ryb3llZC4KKyAgICAgICAgICAgIHZvaWQgb25CdWZmZXJFdmljdGVkKHNpemVfdCBhbGxvY1NpemUpIHsKKyAgICAgICAgICAgICAgICBtU2l6ZUNhY2hlZCAtPSBhbGxvY1NpemU7CisgICAgICAgICAgICAgICAgbUJ1ZmZlcnNDYWNoZWQtLTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8vIEEgYnVmZmVyIGlzIHJlY3ljbGVkIG9uIGFuIGFsbG9jYXRpb24gcmVxdWVzdC4KKyAgICAgICAgICAgIHZvaWQgb25CdWZmZXJSZWN5Y2xlZChzaXplX3QgYWxsb2NTaXplKSB7CisgICAgICAgICAgICAgICAgbVNpemVJblVzZSArPSBhbGxvY1NpemU7CisgICAgICAgICAgICAgICAgbUJ1ZmZlcnNJblVzZSsrOworCisgICAgICAgICAgICAgICAgbVRvdGFsQWxsb2NhdGlvbnMrKzsKKyAgICAgICAgICAgICAgICBtVG90YWxSZWN5Y2xlcysrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLy8gQSBidWZmZXIgaXMgYXZhaWxhYmxlIHRvIGJlIHJlY3ljbGVkLgorICAgICAgICAgICAgdm9pZCBvbkJ1ZmZlclVudXNlZChzaXplX3QgYWxsb2NTaXplKSB7CisgICAgICAgICAgICAgICAgbVNpemVJblVzZSAtPSBhbGxvY1NpemU7CisgICAgICAgICAgICAgICAgbUJ1ZmZlcnNJblVzZS0tOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLy8gQSBidWZmZXIgdHJhbnNmZXIgaXMgaW5pdGlhdGVkLgorICAgICAgICAgICAgdm9pZCBvbkJ1ZmZlclNlbnQoKSB7CisgICAgICAgICAgICAgICAgbVRvdGFsVHJhbnNmZXJzKys7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vLyBBIGJ1ZmZlciBmZXRjaCBpcyBpbnZva2VkIGJ5IGEgYnVmZmVyIHRyYW5zZmVyLgorICAgICAgICAgICAgdm9pZCBvbkJ1ZmZlckZldGNoZWQoKSB7CisgICAgICAgICAgICAgICAgbVRvdGFsRmV0Y2hlcysrOworICAgICAgICAgICAgfQorICAgICAgICB9IG1TdGF0czsKKworICAgICAgICBib29sIGlzVmFsaWQoKSB7CisgICAgICAgICAgICByZXR1cm4gbVZhbGlkOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBpbnZhbGlkYXRlKGJvb2wgbmVlZHNBY2ssIEJ1ZmZlcklkIGZyb20sIEJ1ZmZlcklkIHRvLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEFjY2Vzc29yOjpJbXBsPiAmaW1wbCk7CisKKyAgICAgICAgc3RhdGljIHZvaWQgY3JlYXRlSW52YWxpZGF0b3IoKTsKKworICAgIHB1YmxpYzoKKyAgICAgICAgLyoqIENyZWF0ZXMgYSBidWZmZXIgcG9vbC4gKi8KKyAgICAgICAgQnVmZmVyUG9vbCgpOworCisgICAgICAgIC8qKiBEZXN0cm95cyBhIGJ1ZmZlciBwb29sLiAqLworICAgICAgICB+QnVmZmVyUG9vbCgpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBQcm9jZXNzZXMgYWxsIHBlbmRpbmcgYnVmZmVyIHN0YXR1cyBtZXNzYWdlcywgYW5kIHJldHVybnMgdGhlIHJlc3VsdC4KKyAgICAgICAgICogRWFjaCBzdGF0dXMgbWVzc2FnZSBpcyBoYW5kbGVkIGJ5IG1ldGhvZHMgd2l0aCAnaGFuZGxlJyBwcmVmaXguCisgICAgICAgICAqLworICAgICAgICB2b2lkIHByb2Nlc3NTdGF0dXNNZXNzYWdlcygpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBIYW5kbGVzIGEgYnVmZmVyIGJlaW5nIG93bmVkIGJ5IGEgY29ubmVjdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGNvbm5lY3Rpb25JZCAgdGhlIGlkIG9mIHRoZSBidWZmZXIgb3duaW5nIGNvbm5lY3Rpb24uCisgICAgICAgICAqIEBwYXJhbSBidWZmZXJJZCAgICAgIHRoZSBpZCBvZiB0aGUgYnVmZmVyLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSB3aGVuIHRoZSBidWZmZXIgaXMgb3duZWQsCisgICAgICAgICAqICAgICAgICAge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICAgICAqLworICAgICAgICBib29sIGhhbmRsZU93bkJ1ZmZlcihDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLCBCdWZmZXJJZCBidWZmZXJJZCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEhhbmRsZXMgYSBidWZmZXIgYmVpbmcgcmVsZWFzZWQgYnkgYSBjb25uZWN0aW9uLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gY29ubmVjdGlvbklkICB0aGUgaWQgb2YgdGhlIGJ1ZmZlciBvd25pbmcgY29ubmVjdGlvbi4KKyAgICAgICAgICogQHBhcmFtIGJ1ZmZlcklkICAgICAgdGhlIGlkIG9mIHRoZSBidWZmZXIuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IHdoZW4gdGhlIGJ1ZmZlciBvd25lcnNoaXAgaXMgcmVsZWFzZWQsCisgICAgICAgICAqICAgICAgICAge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICAgICAqLworICAgICAgICBib29sIGhhbmRsZVJlbGVhc2VCdWZmZXIoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwgQnVmZmVySWQgYnVmZmVySWQpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBIYW5kbGVzIGEgdHJhbnNmZXIgdHJhbnNhY3Rpb24gc3RhcnQgbWVzc2FnZSBmcm9tIHRoZSBzZW5kZXIuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBtZXNzYWdlICAgYSBidWZmZXIgc3RhdHVzIG1lc3NhZ2UgZm9yIHRoZSB0cmFuc2FjdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJlc3VsdCB7QGNvZGUgdHJ1ZX0gd2hlbiB0cmFuc2Zlcl90byBtZXNzYWdlIGlzIGFja25vd2xlZGdlZCwKKyAgICAgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgICAgICovCisgICAgICAgIGJvb2wgaGFuZGxlVHJhbnNmZXJUbyhjb25zdCBCdWZmZXJTdGF0dXNNZXNzYWdlICZtZXNzYWdlKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogSGFuZGxlcyBhIHRyYW5zZmVyIHRyYW5zYWN0aW9uIGJlaW5nIGFja2VkIGJ5IHRoZSByZWNlaXZlci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG1lc3NhZ2UgICBhIGJ1ZmZlciBzdGF0dXMgbWVzc2FnZSBmb3IgdGhlIHRyYW5zYWN0aW9uLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmVzdWx0IHtAY29kZSB0cnVlfSB3aGVuIHRyYW5zZmVyX2Zyb20gbWVzc2FnZSBpcyBhY2tub3dsZWRnZWQsCisgICAgICAgICAqICAgICAgICAge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICAgICAqLworICAgICAgICBib29sIGhhbmRsZVRyYW5zZmVyRnJvbShjb25zdCBCdWZmZXJTdGF0dXNNZXNzYWdlICZtZXNzYWdlKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogSGFuZGxlcyBhIHRyYW5zZmVyIHRyYW5zYWN0aW9uIHJlc3VsdCBtZXNzYWdlIGZyb20gdGhlIHJlY2VpdmVyLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbWVzc2FnZSAgIGEgYnVmZmVyIHN0YXR1cyBtZXNzYWdlIGZvciB0aGUgdHJhbnNhY3Rpb24uCisgICAgICAgICAqCisgICAgICAgICAqIEByZXN1bHQge0Bjb2RlIHRydWV9IHdoZW4gdGhlIGV4aXNpdG5nIHRyYW5zYWN0aW9uIGlzIGZpbmlzaGVkLAorICAgICAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAgICAgKi8KKyAgICAgICAgYm9vbCBoYW5kbGVUcmFuc2ZlclJlc3VsdChjb25zdCBCdWZmZXJTdGF0dXNNZXNzYWdlICZtZXNzYWdlKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogSGFuZGxlcyBhIGNvbm5lY3Rpb24gYmVpbmcgY2xvc2VkLCBhbmQgcmV0dXJucyB0aGUgcmVzdWx0LiBBbGwgdGhlCisgICAgICAgICAqIGJ1ZmZlcnMgYW5kIHRyYW5zYWN0aW9ucyBvd25lZCBieSB0aGUgY29ubmVjdGlvbiB3aWxsIGJlIGNsZWFuZWQgdXAuCisgICAgICAgICAqIFRoZSByZWxhdGVkIEZNUSB3aWxsIGJlIGNsZWFuZWQgdXAgdG9vLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gY29ubmVjdGlvbklkICB0aGUgaWQgb2YgdGhlIGNvbm5lY3Rpb24uCisgICAgICAgICAqCisgICAgICAgICAqIEByZXN1bHQge0Bjb2RlIHRydWV9IHdoZW4gdGhlIGNvbm5lY3Rpb24gZXhpc3RlZCwKKyAgICAgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgICAgICovCisgICAgICAgIGJvb2wgaGFuZGxlQ2xvc2UoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlY3ljbGVzIGEgZXhpc3RpbmcgZnJlZSBidWZmZXIgaWYgaXQgaXMgcG9zc2libGUuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBhbGxvY2F0b3IgdGhlIGJ1ZmZlciBhbGxvY2F0b3IKKyAgICAgICAgICogQHBhcmFtIHBhcmFtcyAgICB0aGUgYWxsb2NhdGlvbiBwYXJhbWV0ZXJzLgorICAgICAgICAgKiBAcGFyYW0gcElkICAgICAgIHRoZSBpZCBvZiB0aGUgcmVjeWNsZWQgYnVmZmVyLgorICAgICAgICAgKiBAcGFyYW0gaGFuZGxlICAgIHRoZSBuYXRpdmUgaGFuZGxlIG9mIHRoZSByZWN5Y2xlZCBidWZmZXIuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IHdoZW4gYSBidWZmZXIgaXMgcmVjeWNsZWQsIHtAY29kZSBmYWxzZX0KKyAgICAgICAgICogICAgICAgICBvdGhlcndpc2UuCisgICAgICAgICAqLworICAgICAgICBib29sIGdldEZyZWVCdWZmZXIoCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0b3I+ICZhbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywKKyAgICAgICAgICAgICAgICBCdWZmZXJJZCAqcElkLCBjb25zdCBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBBZGRzIGEgbmV3bHkgYWxsb2NhdGVkIGJ1ZmZlciB0byBidWZmZXJwb29sLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gYWxsb2MgICAgIHRoZSBuZXdseSBhbGxvY2F0ZWQgYnVmZmVyLgorICAgICAgICAgKiBAcGFyYW0gYWxsb2NTaXplIHRoZSBzaXplIG9mIHRoZSBuZXdseSBhbGxvY2F0ZWQgYnVmZmVyLgorICAgICAgICAgKiBAcGFyYW0gcGFyYW1zICAgIHRoZSBhbGxvY2F0aW9uIHBhcmFtZXRlcnMuCisgICAgICAgICAqIEBwYXJhbSBwSWQgICAgICAgdGhlIGJ1ZmZlciBpZCBmb3IgdGhlIG5ld2x5IGFsbG9jYXRlZCBidWZmZXIuCisgICAgICAgICAqIEBwYXJhbSBoYW5kbGUgICAgdGhlIG5hdGl2ZSBoYW5kbGUgZm9yIHRoZSBuZXdseSBhbGxvY2F0ZWQgYnVmZmVyLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIE9LIHdoZW4gYW4gYWxsb2NhdGlvbiBpcyBzdWNjZXNzZnVsbHkgYWxsb2NhdGVkLgorICAgICAgICAgKiAgICAgICAgIE5PX01FTU9SWSB3aGVuIHRoZXJlIGlzIG5vIG1lbW9yeS4KKyAgICAgICAgICogICAgICAgICBDUklUSUNBTF9FUlJPUiBvdGhlcndpc2UuCisgICAgICAgICAqLworICAgICAgICBSZXN1bHRTdGF0dXMgYWRkTmV3QnVmZmVyKAorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdGlvbj4gJmFsbG9jLAorICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBhbGxvY1NpemUsCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywKKyAgICAgICAgICAgICAgICBCdWZmZXJJZCAqcElkLAorICAgICAgICAgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFByb2Nlc3NlcyBwZW5kaW5nIGJ1ZmZlciBzdGF0dXMgbWVzc2FnZXMgYW5kIHBlcmZvcm1zIHBlcmlvZGljIGNhY2hlCisgICAgICAgICAqIGNsZWFuaW5nLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gY2xlYXJDYWNoZSAgICBpZiBjbGVhckNhY2hlIGlzIHRydWUsIGl0IGZyZWVzIGFsbCBidWZmZXJzCisgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgIHdhaXRpbmcgdG8gYmUgcmVjeWNsZWQuCisgICAgICAgICAqLworICAgICAgICB2b2lkIGNsZWFuVXAoYm9vbCBjbGVhckNhY2hlID0gZmFsc2UpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBQcm9jZXNzZXMgcGVuZGluZyBidWZmZXIgc3RhdHVzIG1lc3NhZ2VzIGFuZCBpbnZhbGlkYXRlIGFsbCBjdXJyZW50CisgICAgICAgICAqIGZyZWUgYnVmZmVycy4gQWN0aXZlIGJ1ZmZlcnMgYXJlIGludmFsaWRhdGVkIGFmdGVyIGJlaW5nIGluYWN0aXZlLgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBmbHVzaChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QWNjZXNzb3I6OkltcGw+ICZpbXBsKTsKKworICAgICAgICBmcmllbmQgY2xhc3MgQWNjZXNzb3I6OkltcGw7CisgICAgfSBtQnVmZmVyUG9vbDsKKworICAgIHN0cnVjdCAgQWNjZXNzb3JJbnZhbGlkYXRvciB7CisgICAgICAgIHN0ZDo6bWFwPHVpbnQzMl90LCBjb25zdCBzdGQ6OndlYWtfcHRyPEFjY2Vzc29yOjpJbXBsPj4gbUFjY2Vzc29yczsKKyAgICAgICAgc3RkOjptdXRleCBtTXV0ZXg7CisgICAgICAgIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlIG1DdjsKKyAgICAgICAgYm9vbCBtUmVhZHk7CisKKyAgICAgICAgQWNjZXNzb3JJbnZhbGlkYXRvcigpOworICAgICAgICB2b2lkIGFkZEFjY2Vzc29yKHVpbnQzMl90IGFjY2Vzc29ySWQsIGNvbnN0IHN0ZDo6d2Vha19wdHI8QWNjZXNzb3I6OkltcGw+ICZpbXBsKTsKKyAgICAgICAgdm9pZCBkZWxBY2Nlc3Nvcih1aW50MzJfdCBhY2Nlc3NvcklkKTsKKyAgICB9OworCisgICAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxBY2Nlc3NvckludmFsaWRhdG9yPiBzSW52YWxpZGF0b3I7CisKKyAgICBzdGF0aWMgdm9pZCBpbnZhbGlkYXRvclRocmVhZCgKKyAgICAgICAgc3RkOjptYXA8dWludDMyX3QsIGNvbnN0IHN0ZDo6d2Vha19wdHI8QWNjZXNzb3I6OkltcGw+PiAmYWNjZXNzb3JzLAorICAgICAgICBzdGQ6Om11dGV4ICZtdXRleCwKKyAgICAgICAgc3RkOjpjb25kaXRpb25fdmFyaWFibGUgJmN2LAorICAgICAgICBib29sICZyZWFkeSk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24KK30gIC8vIG5hbWVzcGFjZSBWMl8wCit9ICAvLyBuYW1lc3BhY2UgdWZmZXJwb29sCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjJfMF9BQ0NFU1NPUklNUExfSApkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8yLjAvQW5kcm9pZC5icCBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q0ZTA2ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwzMCBAQAorY2NfbGlicmFyeSB7CisgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X2J1ZmZlcnBvb2xAMi4wIiwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorICAgIHNyY3M6IFsKKyAgICAgICAgIkFjY2Vzc29yLmNwcCIsCisgICAgICAgICJBY2Nlc3NvckltcGwuY3BwIiwKKyAgICAgICAgIkJ1ZmZlclBvb2xDbGllbnQuY3BwIiwKKyAgICAgICAgIkJ1ZmZlclN0YXR1cy5jcHAiLAorICAgICAgICAiQ2xpZW50TWFuYWdlci5jcHAiLAorICAgICAgICAiQ29ubmVjdGlvbi5jcHAiLAorICAgICAgICAiT2JzZXJ2ZXIuY3BwIiwKKyAgICBdLAorICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImluY2x1ZGUiLAorICAgIF0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJmbXEiLAorICAgICAgICAibGliaGlkbGJhc2UiLAorICAgICAgICAibGliaHdiaW5kZXIiLAorICAgICAgICAibGliaGlkbHRyYW5zcG9ydCIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5idWZmZXJwb29sQDIuMCIsCisgICAgXSwKKyAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbCisgICAgICAgICJsaWJmbXEiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5idWZmZXJwb29sQDIuMCIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0J1ZmZlclBvb2xDbGllbnQuY3BwIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvQnVmZmVyUG9vbENsaWVudC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU2NGExMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0J1ZmZlclBvb2xDbGllbnQuY3BwCkBAIC0wLDAgKzEsODY0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJCdWZmZXJQb29sQ2xpZW50IgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8dGhyZWFkPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgIkJ1ZmZlclBvb2xDbGllbnQuaCIKKyNpbmNsdWRlICJDb25uZWN0aW9uLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGJ1ZmZlcnBvb2wgeworbmFtZXNwYWNlIFYyXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKworc3RhdGljIGNvbnN0ZXhwciBpbnQ2NF90IGtSZWNlaXZlVGltZW91dFVzID0gMTAwMDAwMDsgLy8gMTAwbXMKK3N0YXRpYyBjb25zdGV4cHIgaW50IGtQb3N0TWF4UmV0cnkgPSAzOworc3RhdGljIGNvbnN0ZXhwciBpbnQga0NhY2hlVHRsVXMgPSAxMDAwMDAwOyAvLyBUT0RPOiB0dW5lCisKK2NsYXNzIEJ1ZmZlclBvb2xDbGllbnQ6OkltcGwKKyAgICAgICAgOiBwdWJsaWMgc3RkOjplbmFibGVfc2hhcmVkX2Zyb21fdGhpczxCdWZmZXJQb29sQ2xpZW50OjpJbXBsPiB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgSW1wbChjb25zdCBzcDxBY2Nlc3Nvcj4gJmFjY2Vzc29yLCBjb25zdCBzcDxJT2JzZXJ2ZXI+ICZvYnNlcnZlcik7CisKKyAgICBleHBsaWNpdCBJbXBsKGNvbnN0IHNwPElBY2Nlc3Nvcj4gJmFjY2Vzc29yLCBjb25zdCBzcDxJT2JzZXJ2ZXI+ICZvYnNlcnZlcik7CisKKyAgICBib29sIGlzVmFsaWQoKSB7CisgICAgICAgIHJldHVybiBtVmFsaWQ7CisgICAgfQorCisgICAgYm9vbCBpc0xvY2FsKCkgeworICAgICAgICByZXR1cm4gbVZhbGlkICYmIG1Mb2NhbDsKKyAgICB9CisKKyAgICBDb25uZWN0aW9uSWQgZ2V0Q29ubmVjdGlvbklkKCkgeworICAgICAgICByZXR1cm4gbUNvbm5lY3Rpb25JZDsKKyAgICB9CisKKyAgICBzcDxJQWNjZXNzb3I+ICZnZXRBY2Nlc3NvcigpIHsKKyAgICAgICAgcmV0dXJuIG1BY2Nlc3NvcjsKKyAgICB9CisKKyAgICBib29sIGlzQWN0aXZlKGludDY0X3QgKmxhc3RUcmFuc2FjdGlvblVzLCBib29sIGNsZWFyQ2FjaGUpOworCisgICAgdm9pZCByZWNlaXZlSW52YWxpZGF0aW9uKHVpbnQzMl90IG1zZ0lEKTsKKworICAgIFJlc3VsdFN0YXR1cyBmbHVzaCgpOworCisgICAgUmVzdWx0U3RhdHVzIGFsbG9jYXRlKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAqYnVmZmVyKTsKKworICAgIFJlc3VsdFN0YXR1cyByZWNlaXZlKAorICAgICAgICAgICAgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLCBCdWZmZXJJZCBidWZmZXJJZCwKKyAgICAgICAgICAgIGludDY0X3QgdGltZXN0YW1wVXMsCisgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUsIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlcik7CisKKyAgICB2b2lkIHBvc3RCdWZmZXJSZWxlYXNlKEJ1ZmZlcklkIGJ1ZmZlcklkKTsKKworICAgIGJvb2wgcG9zdFNlbmQoCisgICAgICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCwgQ29ubmVjdGlvbklkIHJlY2VpdmVyLAorICAgICAgICAgICAgVHJhbnNhY3Rpb25JZCAqdHJhbnNhY3Rpb25JZCwgaW50NjRfdCAqdGltZXN0YW1wVXMpOworcHJpdmF0ZToKKworICAgIGJvb2wgcG9zdFJlY2VpdmUoCisgICAgICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCwgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLAorICAgICAgICAgICAgaW50NjRfdCB0aW1lc3RhbXBVcyk7CisKKyAgICBib29sIHBvc3RSZWNlaXZlUmVzdWx0KAorICAgICAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwgYm9vbCByZXN1bHQsIGJvb2wgKm5lZWRzU3luYyk7CisKKyAgICB2b2lkIHRyeVN5bmNGcm9tUmVtb3RlKCk7CisKKyAgICBib29sIHN5bmNSZWxlYXNlZCh1aW50MzJfdCBtc2dJZCA9IDApOworCisgICAgdm9pZCBldmljdENhY2hlcyhib29sIGNsZWFyQ2FjaGUgPSBmYWxzZSk7CisKKyAgICB2b2lkIGludmFsaWRhdGVCdWZmZXIoQnVmZmVySWQgaWQpOworCisgICAgdm9pZCBpbnZhbGlkYXRlUmFuZ2UoQnVmZmVySWQgZnJvbSwgQnVmZmVySWQgdG8pOworCisgICAgUmVzdWx0U3RhdHVzIGFsbG9jYXRlQnVmZmVySGFuZGxlKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHBhcmFtcywgQnVmZmVySWQgKmJ1ZmZlcklkLAorICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlKTsKKworICAgIFJlc3VsdFN0YXR1cyBmZXRjaEJ1ZmZlckhhbmRsZSgKKyAgICAgICAgICAgIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwgQnVmZmVySWQgYnVmZmVySWQsCisgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUpOworCisgICAgc3RydWN0IEJsb2NrUG9vbERhdGFEdG9yOworICAgIHN0cnVjdCBDbGllbnRCdWZmZXI7CisKKyAgICBib29sIG1Mb2NhbDsKKyAgICBib29sIG1WYWxpZDsKKyAgICBzcDxJQWNjZXNzb3I+IG1BY2Nlc3NvcjsKKyAgICBzcDxDb25uZWN0aW9uPiBtTG9jYWxDb25uZWN0aW9uOworICAgIHNwPElDb25uZWN0aW9uPiBtUmVtb3RlQ29ubmVjdGlvbjsKKyAgICB1aW50MzJfdCBtU2VxSWQ7CisgICAgQ29ubmVjdGlvbklkIG1Db25uZWN0aW9uSWQ7CisgICAgaW50NjRfdCBtTGFzdEV2aWN0Q2FjaGVVczsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QnVmZmVySW52YWxpZGF0aW9uTGlzdGVuZXI+IG1JbnZhbGlkYXRpb25MaXN0ZW5lcjsKKworICAgIC8vIENhY2hlZEJ1ZmZlcnMKKyAgICBzdHJ1Y3QgQnVmZmVyQ2FjaGUgeworICAgICAgICBzdGQ6Om11dGV4IG1Mb2NrOworICAgICAgICBib29sIG1DcmVhdGluZzsKKyAgICAgICAgc3RkOjpjb25kaXRpb25fdmFyaWFibGUgbUNyZWF0ZUN2OworICAgICAgICBzdGQ6Om1hcDxCdWZmZXJJZCwgc3RkOjp1bmlxdWVfcHRyPENsaWVudEJ1ZmZlcj4+IG1CdWZmZXJzOworICAgICAgICBpbnQgbUFjdGl2ZTsKKyAgICAgICAgaW50NjRfdCBtTGFzdENoYW5nZVVzOworCisgICAgICAgIEJ1ZmZlckNhY2hlKCkgOiBtQ3JlYXRpbmcoZmFsc2UpLCBtQWN0aXZlKDApLCBtTGFzdENoYW5nZVVzKGdldFRpbWVzdGFtcE5vdygpKSB7fQorCisgICAgICAgIHZvaWQgaW5jQWN0aXZlX2woKSB7CisgICAgICAgICAgICArK21BY3RpdmU7CisgICAgICAgICAgICBtTGFzdENoYW5nZVVzID0gZ2V0VGltZXN0YW1wTm93KCk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIGRlY0FjdGl2ZV9sKCkgeworICAgICAgICAgICAgLS1tQWN0aXZlOworICAgICAgICAgICAgbUxhc3RDaGFuZ2VVcyA9IGdldFRpbWVzdGFtcE5vdygpOworICAgICAgICB9CisgICAgfSBtQ2FjaGU7CisKKyAgICAvLyBGTVEgLSByZWxlYXNlIG5vdGlmaWVyCisgICAgc3RydWN0IFJlbGVhc2VDYWNoZSB7CisgICAgICAgIHN0ZDo6bXV0ZXggbUxvY2s7CisgICAgICAgIC8vIFRPRE86IHVzZSBvbmx5IG9uZSBsaXN0Pyh1c2luZyBvbmUgbGlzdCBtYXkgZGVhbHkgc2VuZGluZyBtZXNzYWdlcz8pCisgICAgICAgIHN0ZDo6bGlzdDxCdWZmZXJJZD4gbVJlbGVhc2luZ0lkczsKKyAgICAgICAgc3RkOjpsaXN0PEJ1ZmZlcklkPiBtUmVsZWFzZWRJZHM7CisgICAgICAgIHVpbnQzMl90IG1JbnZhbGlkYXRlSWQ7IC8vIFRPRE86IGludmFsaWRhdGlvbiBBQ0sgdG8gYnVmZmVycG9vbAorICAgICAgICBib29sIG1JbnZhbGlkYXRlQWNrOworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QnVmZmVyU3RhdHVzQ2hhbm5lbD4gbVN0YXR1c0NoYW5uZWw7CisKKyAgICAgICAgUmVsZWFzZUNhY2hlKCkgOiBtSW52YWxpZGF0ZUlkKDApLCBtSW52YWxpZGF0ZUFjayh0cnVlKSB7fQorICAgIH0gbVJlbGVhc2luZzsKKworICAgIC8vIFRoaXMgbG9jayBpcyBoZWxkIGR1cmluZyBzeW5jaHJvbml6YXRpb24gZnJvbSByZW1vdGUgc2lkZS4KKyAgICAvLyBJbiBvcmRlciB0byBtaW5pbWl6ZSByZW1vdGUgY2FsbHMgYW5kIGxvY2tpbmcgZHVydGFpb24sIHRoaXMgbG9jayBpcyBoZWxkCisgICAgLy8gYnkgYmVzdCBlZmZvcnQgYXBwcm9hY2ggdXNpbmcgdHJ5X2xvY2soKS4KKyAgICBzdGQ6Om11dGV4IG1SZW1vdGVTeW5jTG9jazsKK307CisKK3N0cnVjdCBCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjpCbG9ja1Bvb2xEYXRhRHRvciB7CisgICAgQmxvY2tQb29sRGF0YUR0b3IoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw+ICZpbXBsKQorICAgICAgICAgICAgOiBtSW1wbChpbXBsKSB7fQorCisgICAgdm9pZCBvcGVyYXRvcigpKEJ1ZmZlclBvb2xEYXRhICpidWZmZXIpIHsKKyAgICAgICAgQnVmZmVySWQgaWQgPSBidWZmZXItPm1JZDsKKyAgICAgICAgZGVsZXRlIGJ1ZmZlcjsKKworICAgICAgICBhdXRvIGltcGwgPSBtSW1wbC5sb2NrKCk7CisgICAgICAgIGlmIChpbXBsICYmIGltcGwtPmlzVmFsaWQoKSkgeworICAgICAgICAgICAgaW1wbC0+cG9zdEJ1ZmZlclJlbGVhc2UoaWQpOworICAgICAgICB9CisgICAgfQorICAgIGNvbnN0IHN0ZDo6d2Vha19wdHI8QnVmZmVyUG9vbENsaWVudDo6SW1wbD4gbUltcGw7Cit9OworCitzdHJ1Y3QgQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6Q2xpZW50QnVmZmVyIHsKK3ByaXZhdGU6CisgICAgaW50NjRfdCBtRXhwaXJlVXM7CisgICAgYm9vbCBtSGFzQ2FjaGU7CisgICAgQ29ubmVjdGlvbklkIG1Db25uZWN0aW9uSWQ7CisgICAgQnVmZmVySWQgbUlkOworICAgIG5hdGl2ZV9oYW5kbGVfdCAqbUhhbmRsZTsKKyAgICBzdGQ6OndlYWtfcHRyPEJ1ZmZlclBvb2xEYXRhPiBtQ2FjaGU7CisKKyAgICB2b2lkIHVwZGF0ZUV4cGlyZSgpIHsKKyAgICAgICAgbUV4cGlyZVVzID0gZ2V0VGltZXN0YW1wTm93KCkgKyBrQ2FjaGVUdGxVczsKKyAgICB9CisKK3B1YmxpYzoKKyAgICBDbGllbnRCdWZmZXIoCisgICAgICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLCBCdWZmZXJJZCBpZCwgbmF0aXZlX2hhbmRsZV90ICpoYW5kbGUpCisgICAgICAgICAgICA6IG1IYXNDYWNoZShmYWxzZSksIG1Db25uZWN0aW9uSWQoY29ubmVjdGlvbklkKSwKKyAgICAgICAgICAgICAgbUlkKGlkKSwgbUhhbmRsZShoYW5kbGUpIHsKKyAgICAgICAgbUV4cGlyZVVzID0gZ2V0VGltZXN0YW1wTm93KCkgKyBrQ2FjaGVUdGxVczsKKyAgICB9CisKKyAgICB+Q2xpZW50QnVmZmVyKCkgeworICAgICAgICBpZiAobUhhbmRsZSkgeworICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV9jbG9zZShtSGFuZGxlKTsKKyAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKG1IYW5kbGUpOworICAgICAgICB9CisgICAgfQorCisgICAgQnVmZmVySWQgaWQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtSWQ7CisgICAgfQorCisgICAgYm9vbCBleHBpcmUoKSBjb25zdCB7CisgICAgICAgIGludDY0X3Qgbm93ID0gZ2V0VGltZXN0YW1wTm93KCk7CisgICAgICAgIHJldHVybiBub3cgPj0gbUV4cGlyZVVzOworICAgIH0KKworICAgIGJvb2wgaGFzQ2FjaGUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtSGFzQ2FjaGU7CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiBmZXRjaENhY2hlKG5hdGl2ZV9oYW5kbGVfdCAqKnBIYW5kbGUpIHsKKyAgICAgICAgaWYgKG1IYXNDYWNoZSkgeworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiBjYWNoZSA9IG1DYWNoZS5sb2NrKCk7CisgICAgICAgICAgICBpZiAoY2FjaGUpIHsKKyAgICAgICAgICAgICAgICAqcEhhbmRsZSA9IG1IYW5kbGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gY2FjaGU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiBjcmVhdGVDYWNoZSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQ2xpZW50OjpJbXBsPiAmaW1wbCwKKyAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKnBIYW5kbGUpIHsKKyAgICAgICAgaWYgKCFtSGFzQ2FjaGUpIHsKKyAgICAgICAgICAgIC8vIEFsbG9jYXRlcyBhIHJhdyBwdHIgaW4gb3JkZXIgdG8gYXZvaWQgc2VuZGluZyAjcG9zdEJ1ZmZlclJlbGVhc2UKKyAgICAgICAgICAgIC8vIGZyb20gZGVsZXRlciwgaW4gY2FzZSBvZiBuYXRpdmVfaGFuZGxlX2Nsb25lIGZhaWx1cmUuCisgICAgICAgICAgICBCdWZmZXJQb29sRGF0YSAqcHRyID0gbmV3IEJ1ZmZlclBvb2xEYXRhKG1Db25uZWN0aW9uSWQsIG1JZCk7CisgICAgICAgICAgICBpZiAocHRyKSB7CisgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiBjYWNoZShwdHIsIEJsb2NrUG9vbERhdGFEdG9yKGltcGwpKTsKKyAgICAgICAgICAgICAgICBpZiAoY2FjaGUpIHsKKyAgICAgICAgICAgICAgICAgICAgbUNhY2hlID0gY2FjaGU7CisgICAgICAgICAgICAgICAgICAgIG1IYXNDYWNoZSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICpwSGFuZGxlID0gbUhhbmRsZTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwdHIpIHsKKyAgICAgICAgICAgICAgICBkZWxldGUgcHRyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIGJvb2wgb25DYWNoZVJlbGVhc2UoKSB7CisgICAgICAgIGlmIChtSGFzQ2FjaGUpIHsKKyAgICAgICAgICAgIC8vIFRPRE86IHZlcmlmeSBtQ2FjaGUgaXMgbm90IHZhbGlkOworICAgICAgICAgICAgdXBkYXRlRXhwaXJlKCk7CisgICAgICAgICAgICBtSGFzQ2FjaGUgPSBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9OworCitCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjpJbXBsKGNvbnN0IHNwPEFjY2Vzc29yPiAmYWNjZXNzb3IsIGNvbnN0IHNwPElPYnNlcnZlcj4gJm9ic2VydmVyKQorICAgIDogbUxvY2FsKHRydWUpLCBtVmFsaWQoZmFsc2UpLCBtQWNjZXNzb3IoYWNjZXNzb3IpLCBtU2VxSWQoMCksCisgICAgICBtTGFzdEV2aWN0Q2FjaGVVcyhnZXRUaW1lc3RhbXBOb3coKSkgeworICAgIGNvbnN0IFN0YXR1c0Rlc2NyaXB0b3IgKnN0YXR1c0Rlc2M7CisgICAgY29uc3QgSW52YWxpZGF0aW9uRGVzY3JpcHRvciAqaW52RGVzYzsKKyAgICBSZXN1bHRTdGF0dXMgc3RhdHVzID0gYWNjZXNzb3ItPmNvbm5lY3QoCisgICAgICAgICAgICBvYnNlcnZlciwgdHJ1ZSwKKyAgICAgICAgICAgICZtTG9jYWxDb25uZWN0aW9uLCAmbUNvbm5lY3Rpb25JZCwgJm1SZWxlYXNpbmcubUludmFsaWRhdGVJZCwKKyAgICAgICAgICAgICZzdGF0dXNEZXNjLCAmaW52RGVzYyk7CisgICAgaWYgKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgIG1SZWxlYXNpbmcubVN0YXR1c0NoYW5uZWwgPQorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8QnVmZmVyU3RhdHVzQ2hhbm5lbD4oKnN0YXR1c0Rlc2MpOworICAgICAgICBtSW52YWxpZGF0aW9uTGlzdGVuZXIgPQorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8QnVmZmVySW52YWxpZGF0aW9uTGlzdGVuZXI+KCppbnZEZXNjKTsKKyAgICAgICAgbVZhbGlkID0gbVJlbGVhc2luZy5tU3RhdHVzQ2hhbm5lbCAmJgorICAgICAgICAgICAgICAgIG1SZWxlYXNpbmcubVN0YXR1c0NoYW5uZWwtPmlzVmFsaWQoKSAmJgorICAgICAgICAgICAgICAgIG1JbnZhbGlkYXRpb25MaXN0ZW5lciAmJgorICAgICAgICAgICAgICAgIG1JbnZhbGlkYXRpb25MaXN0ZW5lci0+aXNWYWxpZCgpOworICAgIH0KK30KKworQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6SW1wbChjb25zdCBzcDxJQWNjZXNzb3I+ICZhY2Nlc3NvciwgY29uc3Qgc3A8SU9ic2VydmVyPiAmb2JzZXJ2ZXIpCisgICAgOiBtTG9jYWwoZmFsc2UpLCBtVmFsaWQoZmFsc2UpLCBtQWNjZXNzb3IoYWNjZXNzb3IpLCBtU2VxSWQoMCksCisgICAgICBtTGFzdEV2aWN0Q2FjaGVVcyhnZXRUaW1lc3RhbXBOb3coKSkgeworICAgIGJvb2wgdmFsaWQgPSBmYWxzZTsKKyAgICBzcDxJQ29ubmVjdGlvbj4mIG91dENvbm5lY3Rpb24gPSBtUmVtb3RlQ29ubmVjdGlvbjsKKyAgICBDb25uZWN0aW9uSWQmIGlkID0gbUNvbm5lY3Rpb25JZDsKKyAgICB1aW50MzJfdCYgb3V0TXNnSWQgPSBtUmVsZWFzaW5nLm1JbnZhbGlkYXRlSWQ7CisgICAgc3RkOjp1bmlxdWVfcHRyPEJ1ZmZlclN0YXR1c0NoYW5uZWw+JiBvdXRDaGFubmVsID0KKyAgICAgICAgICAgIG1SZWxlYXNpbmcubVN0YXR1c0NoYW5uZWw7CisgICAgc3RkOjp1bmlxdWVfcHRyPEJ1ZmZlckludmFsaWRhdGlvbkxpc3RlbmVyPiYgb3V0T2JzZXJ2ZXIgPQorICAgICAgICAgICAgbUludmFsaWRhdGlvbkxpc3RlbmVyOworICAgIFJldHVybjx2b2lkPiB0cmFuc1Jlc3VsdCA9IGFjY2Vzc29yLT5jb25uZWN0KAorICAgICAgICAgICAgb2JzZXJ2ZXIsCisgICAgICAgICAgICBbJnZhbGlkLCAmb3V0Q29ubmVjdGlvbiwgJmlkLCAmb3V0TXNnSWQsICZvdXRDaGFubmVsLCAmb3V0T2JzZXJ2ZXJdCisgICAgICAgICAgICAoUmVzdWx0U3RhdHVzIHN0YXR1cywgc3A8SUNvbm5lY3Rpb24+IGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwgdWludDMyX3QgbXNnSWQsCisgICAgICAgICAgICAgY29uc3QgU3RhdHVzRGVzY3JpcHRvciYgc3RhdHVzRGVzYywKKyAgICAgICAgICAgICBjb25zdCBJbnZhbGlkYXRpb25EZXNjcmlwdG9yJiBpbnZEZXNjKSB7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgIG91dENvbm5lY3Rpb24gPSBjb25uZWN0aW9uOworICAgICAgICAgICAgICAgICAgICBpZCA9IGNvbm5lY3Rpb25JZDsKKyAgICAgICAgICAgICAgICAgICAgb3V0TXNnSWQgPSBtc2dJZDsKKyAgICAgICAgICAgICAgICAgICAgb3V0Q2hhbm5lbCA9IHN0ZDo6bWFrZV91bmlxdWU8QnVmZmVyU3RhdHVzQ2hhbm5lbD4oc3RhdHVzRGVzYyk7CisgICAgICAgICAgICAgICAgICAgIG91dE9ic2VydmVyID0gc3RkOjptYWtlX3VuaXF1ZTxCdWZmZXJJbnZhbGlkYXRpb25MaXN0ZW5lcj4oaW52RGVzYyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChvdXRDaGFubmVsICYmIG91dENoYW5uZWwtPmlzVmFsaWQoKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgb3V0T2JzZXJ2ZXIgJiYgb3V0T2JzZXJ2ZXItPmlzVmFsaWQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgbVZhbGlkID0gdHJhbnNSZXN1bHQuaXNPaygpICYmIHZhbGlkOworfQorCitib29sIEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw6OmlzQWN0aXZlKGludDY0X3QgKmxhc3RUcmFuc2FjdGlvblVzLCBib29sIGNsZWFyQ2FjaGUpIHsKKyAgICBib29sIGFjdGl2ZSA9IGZhbHNlOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUNhY2hlLm1Mb2NrKTsKKyAgICAgICAgc3luY1JlbGVhc2VkKCk7CisgICAgICAgIGV2aWN0Q2FjaGVzKGNsZWFyQ2FjaGUpOworICAgICAgICAqbGFzdFRyYW5zYWN0aW9uVXMgPSBtQ2FjaGUubUxhc3RDaGFuZ2VVczsKKyAgICAgICAgYWN0aXZlID0gbUNhY2hlLm1BY3RpdmUgPiAwOworICAgIH0KKyAgICBpZiAobVZhbGlkICYmIG1Mb2NhbCAmJiBtTG9jYWxDb25uZWN0aW9uKSB7CisgICAgICAgIG1Mb2NhbENvbm5lY3Rpb24tPmNsZWFuVXAoY2xlYXJDYWNoZSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gYWN0aXZlOworfQorCit2b2lkIEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw6OnJlY2VpdmVJbnZhbGlkYXRpb24odWludDMyX3QgbWVzc2FnZUlkKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUNhY2hlLm1Mb2NrKTsKKyAgICBzeW5jUmVsZWFzZWQobWVzc2FnZUlkKTsKKyAgICAvLyBUT0RPOiBldmljdCBjYWNoZSByZXF1aXJlZD8KK30KKworUmVzdWx0U3RhdHVzIEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw6OmZsdXNoKCkgeworICAgIGlmICghbUxvY2FsIHx8ICFtTG9jYWxDb25uZWN0aW9uIHx8ICFtVmFsaWQpIHsKKyAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7CisgICAgfQorICAgIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG1DYWNoZS5tTG9jayk7CisgICAgICAgIHN5bmNSZWxlYXNlZCgpOworICAgICAgICBldmljdENhY2hlcygpOworICAgICAgICByZXR1cm4gbUxvY2FsQ29ubmVjdGlvbi0+Zmx1c2goKTsKKyAgICB9Cit9CisKK1Jlc3VsdFN0YXR1cyBCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjphbGxvY2F0ZSgKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqcEhhbmRsZSwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAqYnVmZmVyKSB7CisgICAgaWYgKCFtTG9jYWwgfHwgIW1Mb2NhbENvbm5lY3Rpb24gfHwgIW1WYWxpZCkgeworICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKKyAgICB9CisgICAgQnVmZmVySWQgYnVmZmVySWQ7CisgICAgbmF0aXZlX2hhbmRsZV90ICpoYW5kbGUgPSBudWxscHRyOworICAgIGJ1ZmZlci0+cmVzZXQoKTsKKyAgICBSZXN1bHRTdGF0dXMgc3RhdHVzID0gYWxsb2NhdGVCdWZmZXJIYW5kbGUocGFyYW1zLCAmYnVmZmVySWQsICZoYW5kbGUpOworICAgIGlmIChzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICBpZiAoaGFuZGxlKSB7CisgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sobUNhY2hlLm1Mb2NrKTsKKyAgICAgICAgICAgIHN5bmNSZWxlYXNlZCgpOworICAgICAgICAgICAgZXZpY3RDYWNoZXMoKTsKKyAgICAgICAgICAgIGF1dG8gY2FjaGVJdCA9IG1DYWNoZS5tQnVmZmVycy5maW5kKGJ1ZmZlcklkKTsKKyAgICAgICAgICAgIGlmIChjYWNoZUl0ICE9IG1DYWNoZS5tQnVmZmVycy5lbmQoKSkgeworICAgICAgICAgICAgICAgIC8vIFRPRE86IHZlcmlmeSBpdCBpcyByZWN5Y2xlZC4gKG5vdCBoYXZpbmcgYWN0aXZlIHJlZikKKyAgICAgICAgICAgICAgICBtQ2FjaGUubUJ1ZmZlcnMuZXJhc2UoY2FjaGVJdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdXRvIGNsaWVudEJ1ZmZlciA9IHN0ZDo6bWFrZV91bmlxdWU8Q2xpZW50QnVmZmVyPigKKyAgICAgICAgICAgICAgICAgICAgbUNvbm5lY3Rpb25JZCwgYnVmZmVySWQsIGhhbmRsZSk7CisgICAgICAgICAgICBpZiAoY2xpZW50QnVmZmVyKSB7CisgICAgICAgICAgICAgICAgYXV0byByZXN1bHQgPSBtQ2FjaGUubUJ1ZmZlcnMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKAorICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVySWQsIHN0ZDo6bW92ZShjbGllbnRCdWZmZXIpKSk7CisgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5zZWNvbmQpIHsKKyAgICAgICAgICAgICAgICAgICAgKmJ1ZmZlciA9IHJlc3VsdC5maXJzdC0+c2Vjb25kLT5jcmVhdGVDYWNoZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfZnJvbV90aGlzKCksIHBIYW5kbGUpOworICAgICAgICAgICAgICAgICAgICBpZiAoKmJ1ZmZlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgbUNhY2hlLmluY0FjdGl2ZV9sKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCEqYnVmZmVyKSB7CisgICAgICAgICAgICBBTE9HVigiY2xpZW50IGNhY2hlIGNyZWF0aW9uIGZhaWx1cmUgJWQ6ICVsbGQiLAorICAgICAgICAgICAgICAgICAgaGFuZGxlICE9IG51bGxwdHIsIChsb25nIGxvbmcpbUNvbm5lY3Rpb25JZCk7CisgICAgICAgICAgICBzdGF0dXMgPSBSZXN1bHRTdGF0dXM6Ok5PX01FTU9SWTsKKyAgICAgICAgICAgIHBvc3RCdWZmZXJSZWxlYXNlKGJ1ZmZlcklkKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitSZXN1bHRTdGF0dXMgQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6cmVjZWl2ZSgKKyAgICAgICAgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLCBCdWZmZXJJZCBidWZmZXJJZCwgaW50NjRfdCB0aW1lc3RhbXBVcywKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqcEhhbmRsZSwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAqYnVmZmVyKSB7CisgICAgaWYgKCFtVmFsaWQpIHsKKyAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7CisgICAgfQorICAgIGlmICh0aW1lc3RhbXBVcyAhPSAwKSB7CisgICAgICAgIHRpbWVzdGFtcFVzICs9IGtSZWNlaXZlVGltZW91dFVzOworICAgIH0KKyAgICBpZiAoIXBvc3RSZWNlaXZlKGJ1ZmZlcklkLCB0cmFuc2FjdGlvbklkLCB0aW1lc3RhbXBVcykpIHsKKyAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7CisgICAgfQorICAgIFJlc3VsdFN0YXR1cyBzdGF0dXMgPSBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworICAgIGJ1ZmZlci0+cmVzZXQoKTsKKyAgICB3aGlsZSgxKSB7CisgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhtQ2FjaGUubUxvY2spOworICAgICAgICBzeW5jUmVsZWFzZWQoKTsKKyAgICAgICAgZXZpY3RDYWNoZXMoKTsKKyAgICAgICAgYXV0byBjYWNoZUl0ID0gbUNhY2hlLm1CdWZmZXJzLmZpbmQoYnVmZmVySWQpOworICAgICAgICBpZiAoY2FjaGVJdCAhPSBtQ2FjaGUubUJ1ZmZlcnMuZW5kKCkpIHsKKyAgICAgICAgICAgIGlmIChjYWNoZUl0LT5zZWNvbmQtPmhhc0NhY2hlKCkpIHsKKyAgICAgICAgICAgICAgICAqYnVmZmVyID0gY2FjaGVJdC0+c2Vjb25kLT5mZXRjaENhY2hlKHBIYW5kbGUpOworICAgICAgICAgICAgICAgIGlmICghKmJ1ZmZlcikgeworICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayB0cmFuc2ZlciB0aW1lX291dAorICAgICAgICAgICAgICAgICAgICBsb2NrLnVubG9jaygpOworICAgICAgICAgICAgICAgICAgICBzdGQ6OnRoaXNfdGhyZWFkOjp5aWVsZCgpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQUxPR1YoImNsaWVudCByZWNlaXZlIGZyb20gcmVmZXJlbmNlICVsbGQiLCAobG9uZyBsb25nKW1Db25uZWN0aW9uSWQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAqYnVmZmVyID0gY2FjaGVJdC0+c2Vjb25kLT5jcmVhdGVDYWNoZShzaGFyZWRfZnJvbV90aGlzKCksIHBIYW5kbGUpOworICAgICAgICAgICAgICAgIGlmICgqYnVmZmVyKSB7CisgICAgICAgICAgICAgICAgICAgIG1DYWNoZS5pbmNBY3RpdmVfbCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBBTE9HVigiY2xpZW50IHJlY2VpdmUgZnJvbSBjYWNoZSAlbGxkIiwgKGxvbmcgbG9uZyltQ29ubmVjdGlvbklkKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICghbUNhY2hlLm1DcmVhdGluZykgeworICAgICAgICAgICAgICAgIG1DYWNoZS5tQ3JlYXRpbmcgPSB0cnVlOworICAgICAgICAgICAgICAgIGxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90KiBoYW5kbGUgPSBudWxscHRyOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IGZldGNoQnVmZmVySGFuZGxlKHRyYW5zYWN0aW9uSWQsIGJ1ZmZlcklkLCAmaGFuZGxlKTsKKyAgICAgICAgICAgICAgICBsb2NrLmxvY2soKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGhhbmRsZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYXV0byBjbGllbnRCdWZmZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPENsaWVudEJ1ZmZlcj4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db25uZWN0aW9uSWQsIGJ1ZmZlcklkLCBoYW5kbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsaWVudEJ1ZmZlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG8gcmVzdWx0ID0gbUNhY2hlLm1CdWZmZXJzLmluc2VydCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKGJ1ZmZlcklkLCBzdGQ6Om1vdmUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudEJ1ZmZlcikpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnNlY29uZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnVmZmVyID0gcmVzdWx0LmZpcnN0LT5zZWNvbmQtPmNyZWF0ZUNhY2hlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9mcm9tX3RoaXMoKSwgcEhhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgqYnVmZmVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2FjaGUuaW5jQWN0aXZlX2woKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoISpidWZmZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IFJlc3VsdFN0YXR1czo6Tk9fTUVNT1JZOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1DYWNoZS5tQ3JlYXRpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBsb2NrLnVubG9jaygpOworICAgICAgICAgICAgICAgIG1DYWNoZS5tQ3JlYXRlQ3Yubm90aWZ5X2FsbCgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUNhY2hlLm1DcmVhdGVDdi53YWl0KGxvY2spOworICAgICAgICB9CisgICAgfQorICAgIGJvb2wgbmVlZHNTeW5jID0gZmFsc2U7CisgICAgYm9vbCBwb3N0ZWQgPSBwb3N0UmVjZWl2ZVJlc3VsdChidWZmZXJJZCwgdHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ1ZmZlciA/IHRydWUgOiBmYWxzZSwgJm5lZWRzU3luYyk7CisgICAgQUxPR1YoImNsaWVudCByZWNlaXZlICVsbGQgLSAldSA6ICVzICglZCkiLCAobG9uZyBsb25nKW1Db25uZWN0aW9uSWQsIGJ1ZmZlcklkLAorICAgICAgICAgICpidWZmZXIgPyAib2siIDogImZhaWwiLCBwb3N0ZWQpOworICAgIGlmIChtVmFsaWQgJiYgbUxvY2FsICYmIG1Mb2NhbENvbm5lY3Rpb24pIHsKKyAgICAgICAgbUxvY2FsQ29ubmVjdGlvbi0+Y2xlYW5VcChmYWxzZSk7CisgICAgfQorICAgIGlmIChuZWVkc1N5bmMgJiYgbVJlbW90ZUNvbm5lY3Rpb24pIHsKKyAgICAgICAgdHJ5U3luY0Zyb21SZW1vdGUoKTsKKyAgICB9CisgICAgaWYgKCpidWZmZXIpIHsKKyAgICAgICAgaWYgKCFwb3N0ZWQpIHsKKyAgICAgICAgICAgIGJ1ZmZlci0+cmVzZXQoKTsKKyAgICAgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworICAgICAgICB9CisgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok9LOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCisKK3ZvaWQgQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6cG9zdEJ1ZmZlclJlbGVhc2UoQnVmZmVySWQgYnVmZmVySWQpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtUmVsZWFzaW5nLm1Mb2NrKTsKKyAgICBtUmVsZWFzaW5nLm1SZWxlYXNpbmdJZHMucHVzaF9iYWNrKGJ1ZmZlcklkKTsKKyAgICBtUmVsZWFzaW5nLm1TdGF0dXNDaGFubmVsLT5wb3N0QnVmZmVyUmVsZWFzZSgKKyAgICAgICAgICAgIG1Db25uZWN0aW9uSWQsIG1SZWxlYXNpbmcubVJlbGVhc2luZ0lkcywgbVJlbGVhc2luZy5tUmVsZWFzZWRJZHMpOworfQorCisvLyBUT0RPOiByZXZpc2UgYWQtaG9jIHBvc3RpbmcgZGF0YSBzdHJ1Y3R1cmUKK2Jvb2wgQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6cG9zdFNlbmQoCisgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkLCBDb25uZWN0aW9uSWQgcmVjZWl2ZXIsCisgICAgICAgIFRyYW5zYWN0aW9uSWQgKnRyYW5zYWN0aW9uSWQsIGludDY0X3QgKnRpbWVzdGFtcFVzKSB7CisgICAgeworICAgICAgICAvLyBUT0RPOiBkb24ndCBuZWVkIHRvIGNhbGwgc3luY1JlbGVhc2VkIGV2ZXJ5IHRpbWUKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUNhY2hlLm1Mb2NrKTsKKyAgICAgICAgc3luY1JlbGVhc2VkKCk7CisgICAgfQorICAgIGJvb2wgcmV0ID0gZmFsc2U7CisgICAgYm9vbCBuZWVkc1N5bmMgPSBmYWxzZTsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1SZWxlYXNpbmcubUxvY2spOworICAgICAgICAqdGltZXN0YW1wVXMgPSBnZXRUaW1lc3RhbXBOb3coKTsKKyAgICAgICAgKnRyYW5zYWN0aW9uSWQgPSAobUNvbm5lY3Rpb25JZCA8PCAzMikgfCBtU2VxSWQrKzsKKyAgICAgICAgLy8gVE9ETzogcmV0cnksIGFkZCB0aW1lb3V0LCB0YXJnZXQ/CisgICAgICAgIHJldCA9ICBtUmVsZWFzaW5nLm1TdGF0dXNDaGFubmVsLT5wb3N0QnVmZmVyU3RhdHVzTWVzc2FnZSgKKyAgICAgICAgICAgICAgICAqdHJhbnNhY3Rpb25JZCwgYnVmZmVySWQsIEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfVE8sIG1Db25uZWN0aW9uSWQsCisgICAgICAgICAgICAgICAgcmVjZWl2ZXIsIG1SZWxlYXNpbmcubVJlbGVhc2luZ0lkcywgbVJlbGVhc2luZy5tUmVsZWFzZWRJZHMpOworICAgICAgICBuZWVkc1N5bmMgPSAhbUxvY2FsICYmIG1SZWxlYXNpbmcubVN0YXR1c0NoYW5uZWwtPm5lZWRzU3luYygpOworICAgIH0KKyAgICBpZiAobVZhbGlkICYmIG1Mb2NhbCAmJiBtTG9jYWxDb25uZWN0aW9uKSB7CisgICAgICAgIG1Mb2NhbENvbm5lY3Rpb24tPmNsZWFuVXAoZmFsc2UpOworICAgIH0KKyAgICBpZiAobmVlZHNTeW5jICYmIG1SZW1vdGVDb25uZWN0aW9uKSB7CisgICAgICAgIHRyeVN5bmNGcm9tUmVtb3RlKCk7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK2Jvb2wgQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6cG9zdFJlY2VpdmUoCisgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkLCBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsIGludDY0X3QgdGltZXN0YW1wVXMpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGtQb3N0TWF4UmV0cnk7ICsraSkgeworICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sobVJlbGVhc2luZy5tTG9jayk7CisgICAgICAgIGludDY0X3Qgbm93ID0gZ2V0VGltZXN0YW1wTm93KCk7CisgICAgICAgIGlmICh0aW1lc3RhbXBVcyA9PSAwIHx8IG5vdyA8IHRpbWVzdGFtcFVzKSB7CisgICAgICAgICAgICBib29sIHJlc3VsdCA9IG1SZWxlYXNpbmcubVN0YXR1c0NoYW5uZWwtPnBvc3RCdWZmZXJTdGF0dXNNZXNzYWdlKAorICAgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbklkLCBidWZmZXJJZCwgQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9GUk9NLAorICAgICAgICAgICAgICAgICAgICBtQ29ubmVjdGlvbklkLCAtMSwgbVJlbGVhc2luZy5tUmVsZWFzaW5nSWRzLAorICAgICAgICAgICAgICAgICAgICBtUmVsZWFzaW5nLm1SZWxlYXNlZElkcyk7CisgICAgICAgICAgICBpZiAocmVzdWx0KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsb2NrLnVubG9jaygpOworICAgICAgICAgICAgc3RkOjp0aGlzX3RocmVhZDo6eWllbGQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1SZWxlYXNpbmcubVN0YXR1c0NoYW5uZWwtPnBvc3RCdWZmZXJTdGF0dXNNZXNzYWdlKAorICAgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbklkLCBidWZmZXJJZCwgQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9USU1FT1VULAorICAgICAgICAgICAgICAgICAgICBtQ29ubmVjdGlvbklkLCAtMSwgbVJlbGVhc2luZy5tUmVsZWFzaW5nSWRzLAorICAgICAgICAgICAgICAgICAgICBtUmVsZWFzaW5nLm1SZWxlYXNlZElkcyk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw6OnBvc3RSZWNlaXZlUmVzdWx0KAorICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCwgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLCBib29sIHJlc3VsdCwgYm9vbCAqbmVlZHNTeW5jKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVJlbGVhc2luZy5tTG9jayk7CisgICAgLy8gVE9ETzogcmV0cnksIGFkZCB0aW1lb3V0CisgICAgYm9vbCByZXQgPSBtUmVsZWFzaW5nLm1TdGF0dXNDaGFubmVsLT5wb3N0QnVmZmVyU3RhdHVzTWVzc2FnZSgKKyAgICAgICAgICAgIHRyYW5zYWN0aW9uSWQsIGJ1ZmZlcklkLAorICAgICAgICAgICAgcmVzdWx0ID8gQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9PSyA6IEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfRVJST1IsCisgICAgICAgICAgICBtQ29ubmVjdGlvbklkLCAtMSwgbVJlbGVhc2luZy5tUmVsZWFzaW5nSWRzLAorICAgICAgICAgICAgbVJlbGVhc2luZy5tUmVsZWFzZWRJZHMpOworICAgICpuZWVkc1N5bmMgPSAhbUxvY2FsICYmIG1SZWxlYXNpbmcubVN0YXR1c0NoYW5uZWwtPm5lZWRzU3luYygpOworICAgIHJldHVybiByZXQ7Cit9CisKK3ZvaWQgQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6dHJ5U3luY0Zyb21SZW1vdGUoKSB7CisgICAgaWYgKG1SZW1vdGVTeW5jTG9jay50cnlfbG9jaygpKSB7CisgICAgICAgIGJvb2wgbmVlZHNTeW5jID0gZmFsc2U7CisgICAgICAgIHsKKyAgICAgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1SZWxlYXNpbmcubUxvY2spOworICAgICAgICAgICAgbmVlZHNTeW5jID0gbVJlbGVhc2luZy5tU3RhdHVzQ2hhbm5lbC0+bmVlZHNTeW5jKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5lZWRzU3luYykgeworICAgICAgICAgICAgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkID0gKG1Db25uZWN0aW9uSWQgPDwgMzIpOworICAgICAgICAgICAgQnVmZmVySWQgYnVmZmVySWQgPSBDb25uZWN0aW9uOjpTWU5DX0JVRkZFUklEOworICAgICAgICAgICAgUmV0dXJuPHZvaWQ+IHRyYW5zUmVzdWx0ID0gbVJlbW90ZUNvbm5lY3Rpb24tPmZldGNoKAorICAgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbklkLCBidWZmZXJJZCwKKyAgICAgICAgICAgICAgICAgICAgW10KKyAgICAgICAgICAgICAgICAgICAgKFJlc3VsdFN0YXR1cyBvdXRTdGF0dXMsIEJ1ZmZlciBvdXRCdWZmZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKSBvdXRTdGF0dXM7CisgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCkgb3V0QnVmZmVyOworICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorICAgICAgICBtUmVtb3RlU3luY0xvY2sudW5sb2NrKCk7CisgICAgfQorfQorCisvLyBzaG91bGQgaGF2ZSBtQ2FjaGUubUxvY2sKK2Jvb2wgQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6c3luY1JlbGVhc2VkKHVpbnQzMl90IG1lc3NhZ2VJZCkgeworICAgIGJvb2wgY2xlYXJlZCA9IGZhbHNlOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVJlbGVhc2luZy5tTG9jayk7CisgICAgICAgIGlmIChtUmVsZWFzaW5nLm1SZWxlYXNpbmdJZHMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgbVJlbGVhc2luZy5tU3RhdHVzQ2hhbm5lbC0+cG9zdEJ1ZmZlclJlbGVhc2UoCisgICAgICAgICAgICAgICAgICAgIG1Db25uZWN0aW9uSWQsIG1SZWxlYXNpbmcubVJlbGVhc2luZ0lkcywKKyAgICAgICAgICAgICAgICAgICAgbVJlbGVhc2luZy5tUmVsZWFzZWRJZHMpOworICAgICAgICB9CisgICAgICAgIGlmIChtUmVsZWFzaW5nLm1SZWxlYXNlZElkcy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICBmb3IgKEJ1ZmZlcklkJiBpZDogbVJlbGVhc2luZy5tUmVsZWFzZWRJZHMpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiY2xpZW50IHJlbGVhc2UgYnVmZmVyICVsbGQgLSAldSIsIChsb25nIGxvbmcpbUNvbm5lY3Rpb25JZCwgaWQpOworICAgICAgICAgICAgICAgIGF1dG8gZm91bmQgPSBtQ2FjaGUubUJ1ZmZlcnMuZmluZChpZCk7CisgICAgICAgICAgICAgICAgaWYgKGZvdW5kICE9IG1DYWNoZS5tQnVmZmVycy5lbmQoKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoZm91bmQtPnNlY29uZC0+b25DYWNoZVJlbGVhc2UoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbUNhY2hlLmRlY0FjdGl2ZV9sKCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzaG91bGQgbm90IGhhcHBlbiEKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJjbGllbnQgJWxsZCBjYWNoZSByZWxlYXNlIHN0YXR1cyBpbmNvbnNpdGVudCEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpbUNvbm5lY3Rpb25JZCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBzaG91bGQgbm90IGhhcHBlbiEKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coImNsaWVudCAlbGxkIGNhY2hlIHN0YXR1cyBpbmNvbnNpdGVudCEiLCAobG9uZyBsb25nKW1Db25uZWN0aW9uSWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1SZWxlYXNpbmcubVJlbGVhc2VkSWRzLmNsZWFyKCk7CisgICAgICAgICAgICBjbGVhcmVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBzdGQ6OnZlY3RvcjxCdWZmZXJJbnZhbGlkYXRpb25NZXNzYWdlPiBpbnZhbGlkYXRpb25zOworICAgIG1JbnZhbGlkYXRpb25MaXN0ZW5lci0+Z2V0SW52YWxpZGF0aW9ucyhpbnZhbGlkYXRpb25zKTsKKyAgICB1aW50MzJfdCBsYXN0TXNnSWQgPSAwOworICAgIGlmIChpbnZhbGlkYXRpb25zLnNpemUoKSA+IDApIHsKKyAgICAgICAgZm9yIChhdXRvIGl0ID0gaW52YWxpZGF0aW9ucy5iZWdpbigpOyBpdCAhPSBpbnZhbGlkYXRpb25zLmVuZCgpOyArK2l0KSB7CisgICAgICAgICAgICBpZiAoaXQtPm1lc3NhZ2VJZCAhPSAwKSB7CisgICAgICAgICAgICAgICAgbGFzdE1zZ0lkID0gaXQtPm1lc3NhZ2VJZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpdC0+ZnJvbUJ1ZmZlcklkID09IGl0LT50b0J1ZmZlcklkKSB7CisgICAgICAgICAgICAgICAgLy8gVE9ETzogaGFuZGxlIGZyb21CdWZmZXJJZCA9IFVJTlQzMl9NQVgKKyAgICAgICAgICAgICAgICBpbnZhbGlkYXRlQnVmZmVyKGl0LT5mcm9tQnVmZmVySWQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbnZhbGlkYXRlUmFuZ2UoaXQtPmZyb21CdWZmZXJJZCwgaXQtPnRvQnVmZmVySWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVJlbGVhc2luZy5tTG9jayk7CisgICAgICAgIGlmIChsYXN0TXNnSWQgIT0gMCkgeworICAgICAgICAgICAgaWYgKGlzTWVzc2FnZUxhdGVyKGxhc3RNc2dJZCwgbVJlbGVhc2luZy5tSW52YWxpZGF0ZUlkKSkgeworICAgICAgICAgICAgICAgIG1SZWxlYXNpbmcubUludmFsaWRhdGVJZCA9IGxhc3RNc2dJZDsKKyAgICAgICAgICAgICAgICBtUmVsZWFzaW5nLm1JbnZhbGlkYXRlQWNrID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAobWVzc2FnZUlkICE9IDApIHsKKyAgICAgICAgICAgIC8vIG1lc3NhZ2VzIGFyZSBkcmFpbmVkLgorICAgICAgICAgICAgaWYgKGlzTWVzc2FnZUxhdGVyKG1lc3NhZ2VJZCwgbVJlbGVhc2luZy5tSW52YWxpZGF0ZUlkKSkgeworICAgICAgICAgICAgICAgIG1SZWxlYXNpbmcubUludmFsaWRhdGVJZCA9IG1lc3NhZ2VJZDsKKyAgICAgICAgICAgICAgICBtUmVsZWFzaW5nLm1JbnZhbGlkYXRlQWNrID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIW1SZWxlYXNpbmcubUludmFsaWRhdGVBY2spIHsKKyAgICAgICAgICAgIC8vIHBvc3QgQUNLCisgICAgICAgICAgICBtUmVsZWFzaW5nLm1TdGF0dXNDaGFubmVsLT5wb3N0QnVmZmVySW52YWxpZGF0ZUFjaygKKyAgICAgICAgICAgICAgICAgICAgbUNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgbVJlbGVhc2luZy5tSW52YWxpZGF0ZUlkLCAmbVJlbGVhc2luZy5tSW52YWxpZGF0ZUFjayk7CisgICAgICAgICAgICBBTE9HVigiY2xpZW50ICVsbGQgaW52YWxpZGF0ZWlvbiBhY2sgKCVkKSAldSIsCisgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyltQ29ubmVjdGlvbklkLAorICAgICAgICAgICAgICAgIG1SZWxlYXNpbmcubUludmFsaWRhdGVBY2ssIG1SZWxlYXNpbmcubUludmFsaWRhdGVJZCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGNsZWFyZWQ7Cit9CisKKy8vIHNob3VsZCBoYXZlIG1DYWNoZS5tTG9jawordm9pZCBCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjpldmljdENhY2hlcyhib29sIGNsZWFyQ2FjaGUpIHsKKyAgICBpbnQ2NF90IG5vdyA9IGdldFRpbWVzdGFtcE5vdygpOworICAgIGlmIChub3cgPj0gbUxhc3RFdmljdENhY2hlVXMgKyBrQ2FjaGVUdGxVcyB8fCBjbGVhckNhY2hlKSB7CisgICAgICAgIHNpemVfdCBldmljdGVkID0gMDsKKyAgICAgICAgZm9yIChhdXRvIGl0ID0gbUNhY2hlLm1CdWZmZXJzLmJlZ2luKCk7IGl0ICE9IG1DYWNoZS5tQnVmZmVycy5lbmQoKTspIHsKKyAgICAgICAgICAgIGlmICghaXQtPnNlY29uZC0+aGFzQ2FjaGUoKSAmJiAoaXQtPnNlY29uZC0+ZXhwaXJlKCkgfHwgY2xlYXJDYWNoZSkpIHsKKyAgICAgICAgICAgICAgICBpdCA9IG1DYWNoZS5tQnVmZmVycy5lcmFzZShpdCk7CisgICAgICAgICAgICAgICAgKytldmljdGVkOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICArK2l0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEFMT0dWKCJjYWNoZSBjb3VudCAlbGxkIDogdG90YWwgJXp1LCBhY3RpdmUgJWQsIGV2aWN0ZWQgJXp1IiwKKyAgICAgICAgICAgICAgKGxvbmcgbG9uZyltQ29ubmVjdGlvbklkLCBtQ2FjaGUubUJ1ZmZlcnMuc2l6ZSgpLCBtQ2FjaGUubUFjdGl2ZSwgZXZpY3RlZCk7CisgICAgICAgIG1MYXN0RXZpY3RDYWNoZVVzID0gbm93OworICAgIH0KK30KKworLy8gc2hvdWxkIGhhdmUgbUNhY2hlLm1Mb2NrCit2b2lkIEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw6OmludmFsaWRhdGVCdWZmZXIoQnVmZmVySWQgaWQpIHsKKyAgICBmb3IgKGF1dG8gaXQgPSBtQ2FjaGUubUJ1ZmZlcnMuYmVnaW4oKTsgaXQgIT0gbUNhY2hlLm1CdWZmZXJzLmVuZCgpOyArK2l0KSB7CisgICAgICAgIGlmIChpZCA9PSBpdC0+c2Vjb25kLT5pZCgpKSB7CisgICAgICAgICAgICBpZiAoIWl0LT5zZWNvbmQtPmhhc0NhY2hlKCkpIHsKKyAgICAgICAgICAgICAgICBtQ2FjaGUubUJ1ZmZlcnMuZXJhc2UoaXQpOworICAgICAgICAgICAgICAgIEFMT0dWKCJjYWNoZSBpbnZhbGlkYXRlZCAlbGxkIDogYnVmZmVyICV1IiwKKyAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKW1Db25uZWN0aW9uSWQsIGlkKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR1coIkluY29uc2l0ZW50IGludmFsaWRhdGlvbiAlbGxkIDogYWN0aXZlciBidWZmZXIhISAldSIsCisgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyltQ29ubmVjdGlvbklkLCAodW5zaWduZWQgaW50KWlkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorCisvLyBzaG91bGQgaGF2ZSBtQ2FjaGUubUxvY2sKK3ZvaWQgQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6aW52YWxpZGF0ZVJhbmdlKEJ1ZmZlcklkIGZyb20sIEJ1ZmZlcklkIHRvKSB7CisgICAgc2l6ZV90IGludmFsaWRhdGVkID0gMDsKKyAgICBmb3IgKGF1dG8gaXQgPSBtQ2FjaGUubUJ1ZmZlcnMuYmVnaW4oKTsgaXQgIT0gbUNhY2hlLm1CdWZmZXJzLmVuZCgpOykgeworICAgICAgICBpZiAoIWl0LT5zZWNvbmQtPmhhc0NhY2hlKCkpIHsKKyAgICAgICAgICAgIEJ1ZmZlcklkIGJpZCA9IGl0LT5zZWNvbmQtPmlkKCk7CisgICAgICAgICAgICBpZiAoZnJvbSA8IHRvKSB7CisgICAgICAgICAgICAgICAgaWYgKGZyb20gPD0gYmlkICYmIGJpZCA8IHRvKSB7CisgICAgICAgICAgICAgICAgICAgICsraW52YWxpZGF0ZWQ7CisgICAgICAgICAgICAgICAgICAgIGl0ID0gbUNhY2hlLm1CdWZmZXJzLmVyYXNlKGl0KTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoZnJvbSA8PSBiaWQgfHwgYmlkIDwgdG8pIHsKKyAgICAgICAgICAgICAgICAgICAgKytpbnZhbGlkYXRlZDsKKyAgICAgICAgICAgICAgICAgICAgaXQgPSBtQ2FjaGUubUJ1ZmZlcnMuZXJhc2UoaXQpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgKytpdDsKKyAgICB9CisgICAgQUxPR1YoImNhY2hlIGludmFsaWRhdGVkICVsbGQgOiAjIG9mIGludmFsaWRhdGVkICV6dSIsCisgICAgICAgICAgKGxvbmcgbG9uZyltQ29ubmVjdGlvbklkLCBpbnZhbGlkYXRlZCk7Cit9CisKK1Jlc3VsdFN0YXR1cyBCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjphbGxvY2F0ZUJ1ZmZlckhhbmRsZSgKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHBhcmFtcywgQnVmZmVySWQgKmJ1ZmZlcklkLAorICAgICAgICBuYXRpdmVfaGFuZGxlX3QqKiBoYW5kbGUpIHsKKyAgICBpZiAobUxvY2FsQ29ubmVjdGlvbikgeworICAgICAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QqIGFsbG9jSGFuZGxlID0gbnVsbHB0cjsKKyAgICAgICAgUmVzdWx0U3RhdHVzIHN0YXR1cyA9IG1Mb2NhbENvbm5lY3Rpb24tPmFsbG9jYXRlKAorICAgICAgICAgICAgICAgIHBhcmFtcywgYnVmZmVySWQsICZhbGxvY0hhbmRsZSk7CisgICAgICAgIGlmIChzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICAgICAgKmhhbmRsZSA9IG5hdGl2ZV9oYW5kbGVfY2xvbmUoYWxsb2NIYW5kbGUpOworICAgICAgICB9CisgICAgICAgIEFMT0dWKCJjbGllbnQgYWxsb2NhdGUgcmVzdWx0ICVsbGQgJWQgOiAldSBjbG9uZSAlcCIsCisgICAgICAgICAgICAgIChsb25nIGxvbmcpbUNvbm5lY3Rpb25JZCwgc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0ssCisgICAgICAgICAgICAgICpoYW5kbGUgPyAqYnVmZmVySWQgOiAwICwgKmhhbmRsZSk7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCitSZXN1bHRTdGF0dXMgQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6ZmV0Y2hCdWZmZXJIYW5kbGUoCisgICAgICAgIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwgQnVmZmVySWQgYnVmZmVySWQsCisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSkgeworICAgIHNwPElDb25uZWN0aW9uPiBjb25uZWN0aW9uOworICAgIGlmIChtTG9jYWwpIHsKKyAgICAgICAgY29ubmVjdGlvbiA9IG1Mb2NhbENvbm5lY3Rpb247CisgICAgfSBlbHNlIHsKKyAgICAgICAgY29ubmVjdGlvbiA9IG1SZW1vdGVDb25uZWN0aW9uOworICAgIH0KKyAgICBSZXN1bHRTdGF0dXMgc3RhdHVzOworICAgIFJldHVybjx2b2lkPiB0cmFuc1Jlc3VsdCA9IGNvbm5lY3Rpb24tPmZldGNoKAorICAgICAgICAgICAgdHJhbnNhY3Rpb25JZCwgYnVmZmVySWQsCisgICAgICAgICAgICBbJnN0YXR1cywgJmhhbmRsZV0KKyAgICAgICAgICAgIChSZXN1bHRTdGF0dXMgb3V0U3RhdHVzLCBCdWZmZXIgb3V0QnVmZmVyKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gb3V0U3RhdHVzOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgICAgICAqaGFuZGxlID0gbmF0aXZlX2hhbmRsZV9jbG9uZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRCdWZmZXIuYnVmZmVyLmdldE5hdGl2ZUhhbmRsZSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICByZXR1cm4gdHJhbnNSZXN1bHQuaXNPaygpID8gc3RhdHVzIDogUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworCitCdWZmZXJQb29sQ2xpZW50OjpCdWZmZXJQb29sQ2xpZW50KGNvbnN0IHNwPEFjY2Vzc29yPiAmYWNjZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElPYnNlcnZlcj4gJm9ic2VydmVyKSB7CisgICAgbUltcGwgPSBzdGQ6Om1ha2Vfc2hhcmVkPEltcGw+KGFjY2Vzc29yLCBvYnNlcnZlcik7Cit9CisKK0J1ZmZlclBvb2xDbGllbnQ6OkJ1ZmZlclBvb2xDbGllbnQoY29uc3Qgc3A8SUFjY2Vzc29yPiAmYWNjZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElPYnNlcnZlcj4gJm9ic2VydmVyKSB7CisgICAgbUltcGwgPSBzdGQ6Om1ha2Vfc2hhcmVkPEltcGw+KGFjY2Vzc29yLCBvYnNlcnZlcik7Cit9CisKK0J1ZmZlclBvb2xDbGllbnQ6On5CdWZmZXJQb29sQ2xpZW50KCkgeworICAgIC8vIFRPRE86IGhvdyB0byBoYW5kbGUgb3JwaGFuZWQgYnVmZmVycz8KK30KKworYm9vbCBCdWZmZXJQb29sQ2xpZW50Ojppc1ZhbGlkKCkgeworICAgIHJldHVybiBtSW1wbCAmJiBtSW1wbC0+aXNWYWxpZCgpOworfQorCitib29sIEJ1ZmZlclBvb2xDbGllbnQ6OmlzTG9jYWwoKSB7CisgICAgcmV0dXJuIG1JbXBsICYmIG1JbXBsLT5pc0xvY2FsKCk7Cit9CisKK2Jvb2wgQnVmZmVyUG9vbENsaWVudDo6aXNBY3RpdmUoaW50NjRfdCAqbGFzdFRyYW5zYWN0aW9uVXMsIGJvb2wgY2xlYXJDYWNoZSkgeworICAgIGlmICghaXNWYWxpZCgpKSB7CisgICAgICAgICpsYXN0VHJhbnNhY3Rpb25VcyA9IDA7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIG1JbXBsLT5pc0FjdGl2ZShsYXN0VHJhbnNhY3Rpb25VcywgY2xlYXJDYWNoZSk7Cit9CisKK0Nvbm5lY3Rpb25JZCBCdWZmZXJQb29sQ2xpZW50OjpnZXRDb25uZWN0aW9uSWQoKSB7CisgICAgaWYgKGlzVmFsaWQoKSkgeworICAgICAgICByZXR1cm4gbUltcGwtPmdldENvbm5lY3Rpb25JZCgpOworICAgIH0KKyAgICByZXR1cm4gLTE7Cit9CisKK1Jlc3VsdFN0YXR1cyBCdWZmZXJQb29sQ2xpZW50OjpnZXRBY2Nlc3NvcihzcDxJQWNjZXNzb3I+ICphY2Nlc3NvcikgeworICAgIGlmIChpc1ZhbGlkKCkpIHsKKyAgICAgICAgKmFjY2Vzc29yID0gbUltcGwtPmdldEFjY2Vzc29yKCk7CisgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok9LOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKwordm9pZCBCdWZmZXJQb29sQ2xpZW50OjpyZWNlaXZlSW52YWxpZGF0aW9uKHVpbnQzMl90IG1zZ0lkKSB7CisgICAgQUxPR1YoImJ1ZmZlcnBvb2wgY2xpZW50IHJlY3YgaW52ICV1IiwgbXNnSWQpOworICAgIGlmIChpc1ZhbGlkKCkpIHsKKyAgICAgICAgbUltcGwtPnJlY2VpdmVJbnZhbGlkYXRpb24obXNnSWQpOworICAgIH0KK30KKworUmVzdWx0U3RhdHVzIEJ1ZmZlclBvb2xDbGllbnQ6OmZsdXNoKCkgeworICAgIGlmIChpc1ZhbGlkKCkpIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLT5mbHVzaCgpOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworUmVzdWx0U3RhdHVzIEJ1ZmZlclBvb2xDbGllbnQ6OmFsbG9jYXRlKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlcikgeworICAgIGlmIChpc1ZhbGlkKCkpIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLT5hbGxvY2F0ZShwYXJhbXMsIGhhbmRsZSwgYnVmZmVyKTsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK1Jlc3VsdFN0YXR1cyBCdWZmZXJQb29sQ2xpZW50OjpyZWNlaXZlKAorICAgICAgICBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsIEJ1ZmZlcklkIGJ1ZmZlcklkLCBpbnQ2NF90IHRpbWVzdGFtcFVzLAorICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUsIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlcikgeworICAgIGlmIChpc1ZhbGlkKCkpIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLT5yZWNlaXZlKHRyYW5zYWN0aW9uSWQsIGJ1ZmZlcklkLCB0aW1lc3RhbXBVcywgaGFuZGxlLCBidWZmZXIpOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworUmVzdWx0U3RhdHVzIEJ1ZmZlclBvb2xDbGllbnQ6OnBvc3RTZW5kKAorICAgICAgICBDb25uZWN0aW9uSWQgcmVjZWl2ZXJJZCwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAmYnVmZmVyLAorICAgICAgICBUcmFuc2FjdGlvbklkICp0cmFuc2FjdGlvbklkLAorICAgICAgICBpbnQ2NF90ICp0aW1lc3RhbXBVcykgeworICAgIGlmIChpc1ZhbGlkKCkpIHsKKyAgICAgICAgYm9vbCByZXN1bHQgPSBtSW1wbC0+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+IHNidWZmZXIsIHJidWZmZXI7CisgIG5hdGl2ZV9oYW5kbGVfdCAqYWxsb2NIYW5kbGUgPSBudWxscHRyOworICBuYXRpdmVfaGFuZGxlX3QgKnJlY3ZIYW5kbGUgPSBudWxscHRyOworCisgIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZDsKKyAgaW50NjRfdCBwb3N0VXM7CisKKyAgc3RhdHVzID0gbU1hbmFnZXItPmFsbG9jYXRlKG1Db25uZWN0aW9uSWQsIHZlY1BhcmFtcywgJmFsbG9jSGFuZGxlLCAmc2J1ZmZlcik7CisgIEFTU0VSVF9UUlVFKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKTsKKyAgQVNTRVJUX1RSVUUoVGVzdEJ1ZmZlclBvb2xBbGxvY2F0b3I6OkZpbGwoYWxsb2NIYW5kbGUsIDB4NzcpKTsKKyAgc3RhdHVzID0gbU1hbmFnZXItPnBvc3RTZW5kKG1SZWNlaXZlcklkLCBzYnVmZmVyLCAmdHJhbnNhY3Rpb25JZCwgJnBvc3RVcyk7CisgIEFTU0VSVF9UUlVFKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKTsKKyAgc3RhdHVzID0gbU1hbmFnZXItPnJlY2VpdmUobVJlY2VpdmVySWQsIHRyYW5zYWN0aW9uSWQsIHNidWZmZXItPm1JZCwgcG9zdFVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVjdkhhbmRsZSwgJnJidWZmZXIpOworICBFWFBFQ1RfVFJVRShzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSyk7CisgIEFTU0VSVF9UUlVFKFRlc3RCdWZmZXJQb29sQWxsb2NhdG9yOjpWZXJpZnkocmVjdkhhbmRsZSwgMHg3NykpOworfQorCit9ICAvLyBhbm9ueW1vdXMgbmFtZXNwYWNlCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgeworICA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKyAgaW50IHN0YXR1cyA9IFJVTl9BTExfVEVTVFMoKTsKKyAgTE9HKElORk8pIDw8ICJUZXN0IHJlc3VsdCA9ICIgPDwgc3RhdHVzOworICByZXR1cm4gc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzY2NzdhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw0MiBAQAorY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzIiLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisKKyAgICBzcmNzOiBbIkMyLmNwcCJdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICBdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL2hhcmR3YXJlIiwKKyAgICBdLAorCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW5jbHVkZSIsCisgICAgXSwKKworICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJoYXJkd2FyZV9oZWFkZXJzIiwKKyAgICAgICAgImxpYnV0aWxzX2hlYWRlcnMiLAorICAgIF0sCisKKyAgICBleHBvcnRfaGVhZGVyX2xpYl9oZWFkZXJzOiBbCisgICAgICAgICJsaWJoYXJkd2FyZV9oZWFkZXJzIiwKKyAgICAgICAgImxpYnV0aWxzX2hlYWRlcnMiLAorICAgIF0sCisKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBtaXNjX3VuZGVmaW5lZDogWworICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgXSwKKyAgICAgICAgY2ZpOiBmYWxzZSwgLy8gdHJ1ZSwKKyAgICAgICAgZGlhZzogeworICAgICAgICAgICAgY2ZpOiBmYWxzZSwgLy8gdHJ1ZSwKKyAgICAgICAgfSwKKyAgICB9LAorCisgICAgbGRmbGFnczogWyItV2wsLUJzeW1ib2xpYyJdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL0FuZHJvaWQubWsgYi9tZWRpYS9jb2RlYzIvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmQ3MzlmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL0FuZHJvaWQubWsKQEAgLTAsMCArMSw0OCBAQAorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBET0NVTUVOVEFUSU9OIEdFTkVSQVRJT04KKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0MyX1JPT1QgOj0gJChjYWxsIG15LWRpcikKKworQzJfRE9DU19ST09UIDo9ICQoT1VUX0RJUikvdGFyZ2V0L2NvbW1vbi9kb2NzL2NvZGVjMgorCitDMl9PVVRfVEVNUCA6PSAkKFBST0RVQ1RfT1VUKS9nZW4vRVRDL0NvZGVjMi1kb2NzX2ludGVybWVkaWF0ZXMKKworQzJfRE9YWSA6PSAkKG9yICQoc2hlbGwgY29tbWFuZCAtdiBkb3h5Z2VuKSxcCisJCSQoc2hlbGwgY29tbWFuZCAtdiAvQXBwbGljYXRpb25zL0RveHlnZW4uYXBwL0NvbnRlbnRzL1Jlc291cmNlcy9kb3h5Z2VuKSkKKworLlBIT05ZOiBjaGVjay1kb3h5Z2VuCitjaGVjay1kb3h5Z2VuOgoraWZuZGVmIEMyX0RPWFkKKwkkKGVycm9yICdkb3h5Z2VuIGlzIG5vdCBhdmFpbGFibGUnKQorZW5kaWYKKworJChDMl9PVVRfVEVNUCkvZG94eS1hcGkuY29uZmlnOiAkKEMyX1JPT1QpL2RvY3MvZG94eWdlbi5jb25maWcKKwkjIG9ubHkgZG9jdW1lbnQgaW5jbHVkZSBkaXJlY3RvcnksIG5vIGludGVybmFsIHNlY3Rpb25zCisJc2VkICdzL1woXklOUFVUICo9LipcKS9cMWluY2x1ZGVcLy87IFwKKwlzL1woXklOVEVSTkFMX0RPQ1MgKj0gKlwpLiovXDFOTy87IFwKKwlzL1woXkVOQUJMRURfU0VDVElPTlMgKj0uKlwpSU5URVJOQUxcKC4qXCkuKi9cMVwyLzsgXAorCXM6XCheT1VUUFVUX0RJUkVDVE9SWSAqPSBcKW91dDpcMSckKE9VVF9ESVIpJzo7JyBcCisJCSQoQzJfUk9PVCkvZG9jcy9kb3h5Z2VuLmNvbmZpZyA+ICRACisKKyQoQzJfT1VUX1RFTVApL2RveHktaW50ZXJuYWwuY29uZmlnOiAkKEMyX1JPT1QpL2RvY3MvZG94eWdlbi5jb25maWcKKwlzZWQgJ3M6XCheT1VUUFVUX0RJUkVDVE9SWSAqPSBcKW91dFwoLipcKWFwaTpcMSckKE9VVF9ESVIpJ1wyaW50ZXJuYWw6OycgXAorCQkkKEMyX1JPT1QpL2RvY3MvZG94eWdlbi5jb25maWcgPiAkQAorCisuUEhPTlk6IGRvY3MtYXBpCitkb2NzLWFwaTogJChDMl9PVVRfVEVNUCkvZG94eS1hcGkuY29uZmlnIGNoZWNrLWRveHlnZW4KKwllY2hvIEFQSSBkb2NzIGFyZSBidWlsZGluZyBpbiAkKEMyX0RPQ1NfUk9PVCkvYXBpCisJcm0gLXJmICQoQzJfRE9DU19ST09UKS9hcGkKKwlta2RpciAtcCAkKEMyX0RPQ1NfUk9PVCkvYXBpCisJJChDMl9ET1hZKSAkKEMyX09VVF9URU1QKS9kb3h5LWFwaS5jb25maWcKKworLlBIT05ZOiBkb2NzLWludGVybmFsCitkb2NzLWludGVybmFsOiAkKEMyX09VVF9URU1QKS9kb3h5LWludGVybmFsLmNvbmZpZyBjaGVjay1kb3h5Z2VuCisJZWNobyBJbnRlcm5hbCBkb2NzIGFyZSBidWlsZGluZyBpbiAkKEMyX0RPQ1NfUk9PVCkvaW50ZXJuYWwKKwlybSAtcmYgJChDMl9ET0NTX1JPT1QpL2ludGVybmFsCisJbWtkaXIgLXAgJChDMl9ET0NTX1JPT1QpL2ludGVybmFsCisJJChDMl9ET1hZKSAkKEMyX09VVF9URU1QKS9kb3h5LWludGVybmFsLmNvbmZpZworCisuUEhPTlk6IGRvY3MtYWxsCitkb2NzLWFsbDogZG9jcy1hcGkgZG9jcy1pbnRlcm5hbAorCitpbmNsdWRlICQoY2FsbCBhbGwtbWFrZWZpbGVzLXVuZGVyLCQoY2FsbCBteS1kaXIpKQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL0MyLmNwcCBiL21lZGlhL2NvZGVjMi9DMi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU5ZDRlNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9DMi5jcHAKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxDMi5oPgorI2luY2x1ZGUgPEMyQnVmZmVyLmg+CisjaW5jbHVkZSA8QzJDb21wb25lbnQuaD4KKyNpbmNsdWRlIDxDMkNvbmZpZy5oPgorI2luY2x1ZGUgPEMyUGFyYW0uaD4KKyNpbmNsdWRlIDxDMlBhcmFtRGVmLmg+CisjaW5jbHVkZSA8QzJXb3JrLmg+CisKKy8qKgorICogVGhlcmUgaXMgbm90aGluZyBoZXJlIHlldC4gVGhpcyBsaWJyYXJ5IGlzIGJ1aWx0IHRvIHNlZSB3aGF0IHN5bWJvbHMgYW5kIG1ldGhvZHMgZ2V0CisgKiBkZWZpbmVkIGFzIHBhcnQgb2YgdGhlIEFQSSBpbmNsdWRlIGZpbGVzLgorICoKKyAqIEdvaW5nIGZvcndhcmQsIHRoZSBDb2RlYzIgbGlicmFyeSB3aWxsIGNvbnRhaW4gdXRpbGl0eSBtZXRob2RzIHRoYXQgYXJlIHVzZWZ1bCBmb3IKKyAqIENvZGVjMiBjbGllbnRzLgorICovCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hYWMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWNhNTg1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwzMCBAQAorY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9hYWNkZWMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9hbGwtZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbCisgICAgICAgICJDMlNvZnRBYWNEZWMuY3BwIiwKKyAgICAgICAgIkRyY1ByZXNNb2RlV3JhcC5jcHAiLAorICAgIF0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGliRnJhdW5ob2ZlckFBQyIsCisgICAgXSwKK30KKworY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9hYWNlbmMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9hbGwtZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbIkMyU29mdEFhY0VuYy5jcHAiXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJGcmF1bmhvZmVyQUFDIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL0MyU29mdEFhY0RlYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hYWMvQzJTb2Z0QWFjRGVjLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2M4NDQyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL0MyU29mdEFhY0RlYy5jcHAKQEAgLTAsMCArMSw5NDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyU29mdEFhY0RlYyIKKyNpbmNsdWRlIDxsb2cvbG9nLmg+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+IG1PdXRCbG9jazsKKyAgICB1aW50OF90ICptT3V0QnVmZmVyRmx1c2g7CisKKyAgICBzaXplX3QgbU51bUNvcmVzOworICAgIElWX0NPTE9SX0ZPUk1BVF9UIG1JdkNvbG9yRm9ybWF0OworCisgICAgdWludDMyX3QgbVdpZHRoOworICAgIHVpbnQzMl90IG1IZWlnaHQ7CisgICAgdWludDMyX3QgbVN0cmlkZTsKKyAgICBib29sIG1TaWduYWxsZWRPdXRwdXRFb3M7CisgICAgYm9vbCBtU2lnbmFsbGVkRXJyb3I7CisgICAgYm9vbCBtSGVhZGVyRGVjb2RlZDsKKyAgICAvLyBDb2xvciBhc3BlY3RzLiBUaGVzZSBhcmUgSVNPIHZhbHVlcyBhbmQgYXJlIG1lYW50IHRvIGRldGVjdCBjaGFuZ2VzIGluIGFzcGVjdHMgdG8gYXZvaWQKKyAgICAvLyBjb252ZXJ0aW5nIHRoZW0gdG8gQzIgdmFsdWVzIGZvciBlYWNoIGZyYW1lCisgICAgc3RydWN0IFZ1aUNvbG9yQXNwZWN0cyB7CisgICAgICAgIHVpbnQ4X3QgcHJpbWFyaWVzOworICAgICAgICB1aW50OF90IHRyYW5zZmVyOworICAgICAgICB1aW50OF90IGNvZWZmczsKKyAgICAgICAgdWludDhfdCBmdWxsUmFuZ2U7CisKKyAgICAgICAgLy8gZGVmYXVsdCBjb2xvciBhc3BlY3RzCisgICAgICAgIFZ1aUNvbG9yQXNwZWN0cygpCisgICAgICAgICAgICA6IHByaW1hcmllcygyKSwgdHJhbnNmZXIoMiksIGNvZWZmcygyKSwgZnVsbFJhbmdlKDApIHsgfQorCisgICAgICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBWdWlDb2xvckFzcGVjdHMgJm8pIHsKKyAgICAgICAgICAgIHJldHVybiBwcmltYXJpZXMgPT0gby5wcmltYXJpZXMgJiYgdHJhbnNmZXIgPT0gby50cmFuc2ZlciAmJiBjb2VmZnMgPT0gby5jb2VmZnMKKyAgICAgICAgICAgICAgICAgICAgJiYgZnVsbFJhbmdlID09IG8uZnVsbFJhbmdlOworICAgICAgICB9CisgICAgfSBtQml0c3RyZWFtQ29sb3JBc3BlY3RzOworCisgICAgLy8gcHJvZmlsZQorICAgIHN0cnVjdCB0aW1ldmFsIG1UaW1lU3RhcnQ7CisgICAgc3RydWN0IHRpbWV2YWwgbVRpbWVFbmQ7CisjaWZkZWYgRklMRV9EVU1QX0VOQUJMRQorICAgIGNoYXIgbUluRmlsZVsyMDBdOworI2VuZGlmIC8qIEZJTEVfRFVNUF9FTkFCTEUgKi8KKworICAgIEMyX0RPX05PVF9DT1BZKEMyU29mdEF2Y0RlYyk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfQzJfU09GVF9BVkNfREVDX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hdmMvQzJTb2Z0QXZjRW5jLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2F2Yy9DMlNvZnRBdmNFbmMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlNWNmMjcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hdmMvQzJTb2Z0QXZjRW5jLmNwcApAQCAtMCwwICsxLDE1NTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJTb2Z0QXZjRW5jIgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9taXNjLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9WaWRlb0FQSS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FVdGlscy5oPgorCisjaW5jbHVkZSA8QzJEZWJ1Zy5oPgorI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8Q29kZWMyQnVmZmVyVXRpbHMuaD4KKyNpbmNsdWRlIDxTaW1wbGVDMkludGVyZmFjZS5oPgorI2luY2x1ZGUgPHV0aWwvQzJJbnRlcmZhY2VIZWxwZXIuaD4KKworI2luY2x1ZGUgIkMyU29mdEF2Y0VuYy5oIgorI2luY2x1ZGUgImloMjY0ZS5oIgorI2luY2x1ZGUgImloMjY0ZV9lcnJvci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIEMyU29mdEF2Y0VuYzo6SW50ZkltcGwgOiBwdWJsaWMgQzJJbnRlcmZhY2VIZWxwZXIgeworcHVibGljOgorICAgIGV4cGxpY2l0IEludGZJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gJmhlbHBlcikKKyAgICAgICAgOiBDMkludGVyZmFjZUhlbHBlcihoZWxwZXIpIHsKKworICAgICAgICBzZXREZXJpdmVkSW5zdGFuY2UodGhpcyk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dEZvcm1hdCwgQzJfTkFNRV9JTlBVVF9TVFJFQU1fRk9STUFUX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbUZvcm1hdENvbmZpZzo6aW5wdXQoMHUsIEMyRm9ybWF0VmlkZW8pKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obU91dHB1dEZvcm1hdCwgQzJfTkFNRV9PVVRQVVRfU1RSRUFNX0ZPUk1BVF9TRVRUSU5HKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1Gb3JtYXRDb25maWc6Om91dHB1dCgwdSwgQzJGb3JtYXRDb21wcmVzc2VkKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dE1lZGlhVHlwZSwgQzJfTkFNRV9JTlBVVF9QT1JUX01JTUVfU0VUVElORykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoQWxsb2NTaGFyZWRTdHJpbmc8QzJQb3J0TWltZUNvbmZpZzo6aW5wdXQ+KAorICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfVklERU9fUkFXKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1PdXRwdXRNZWRpYVR5cGUsIEMyX05BTUVfT1VUUFVUX1BPUlRfTUlNRV9TRVRUSU5HKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShBbGxvY1NoYXJlZFN0cmluZzxDMlBvcnRNaW1lQ29uZmlnOjpvdXRwdXQ+KAorICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1Vc2FnZSwgQzJfTkFNRV9JTlBVVF9TVFJFQU1fVVNBR0VfU0VUVElORykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtVXNhZ2VUdW5pbmc6OmlucHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgMHUsICh1aW50NjRfdClDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtU2l6ZSwgQzJfTkFNRV9TVFJFQU1fVklERU9fU0laRV9TRVRUSU5HKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJWaWRlb1NpemVTdHJlYW1UdW5pbmc6OmlucHV0KDB1LCAzMjAsIDI0MCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIHdpZHRoKS5pblJhbmdlKDIsIDI1NjAsIDIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIGhlaWdodCkuaW5SYW5nZSgyLCAyNTYwLCAyKSwKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNpemVTZXR0ZXIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtRnJhbWVSYXRlLCBDMl9OQU1FX1NUUkVBTV9GUkFNRV9SQVRFX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUZyYW1lUmF0ZUluZm86Om91dHB1dCgwdSwgMzAuKSkKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBNb3JlIHJlc3RyaWN0aW9uPworICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUZyYW1lUmF0ZSwgdmFsdWUpLmdyZWF0ZXJUaGFuKDAuKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptRnJhbWVSYXRlKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1CaXRyYXRlLCBDMl9OQU1FX1NUUkVBTV9CSVRSQVRFX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMkJpdHJhdGVUdW5pbmc6Om91dHB1dCgwdSwgNjQwMDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUJpdHJhdGUsIHZhbHVlKS5pblJhbmdlKDQwOTYsIDEyMDAwMDAwKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoQml0cmF0ZVNldHRlcikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnRyYVJlZnJlc2gsIEMyX1BBUkFNS0VZX0lOVFJBX1JFRlJFU0gpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUludHJhUmVmcmVzaFR1bmluZzo6b3V0cHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgMHUsIEMyQ29uZmlnOjpJTlRSQV9SRUZSRVNIX0RJU0FCTEVELCAwLikpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobUludHJhUmVmcmVzaCwgbW9kZSkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OklOVFJBX1JFRlJFU0hfRElTQUJMRUQsIEMyQ29uZmlnOjpJTlRSQV9SRUZSRVNIX0FSQklUUkFSWSB9KSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1JbnRyYVJlZnJlc2gsIHBlcmlvZCkuYW55KCkKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKEludHJhUmVmcmVzaFNldHRlcikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1Qcm9maWxlTGV2ZWwsIEMyX1BBUkFNS0VZX1BST0ZJTEVfTEVWRUwpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86Om91dHB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgIDB1LCBQUk9GSUxFX0FWQ19DT05TVFJBSU5FRF9CQVNFTElORSwgTEVWRUxfQVZDXzRfMSkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgcHJvZmlsZSkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgICAgUFJPRklMRV9BVkNfQkFTRUxJTkUsCisgICAgICAgICAgICAgICAgICAgICAgICBQUk9GSUxFX0FWQ19DT05TVFJBSU5FRF9CQVNFTElORSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFBST0ZJTEVfQVZDX01BSU4sCisgICAgICAgICAgICAgICAgICAgIH0pLAorICAgICAgICAgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgbGV2ZWwpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExFVkVMX0FWQ18xLAorICAgICAgICAgICAgICAgICAgICAgICAgTEVWRUxfQVZDXzFCLAorICAgICAgICAgICAgICAgICAgICAgICAgTEVWRUxfQVZDXzFfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIExFVkVMX0FWQ18xXzIsCisgICAgICAgICAgICAgICAgICAgICAgICBMRVZFTF9BVkNfMV8zLAorICAgICAgICAgICAgICAgICAgICAgICAgTEVWRUxfQVZDXzIsCisgICAgICAgICAgICAgICAgICAgICAgICBMRVZFTF9BVkNfMl8xLAorICAgICAgICAgICAgICAgICAgICAgICAgTEVWRUxfQVZDXzJfMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIExFVkVMX0FWQ18zLAorICAgICAgICAgICAgICAgICAgICAgICAgTEVWRUxfQVZDXzNfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIExFVkVMX0FWQ18zXzIsCisgICAgICAgICAgICAgICAgICAgICAgICBMRVZFTF9BVkNfNCwKKyAgICAgICAgICAgICAgICAgICAgICAgIExFVkVMX0FWQ180XzEsCisgICAgICAgICAgICAgICAgICAgICAgICBMRVZFTF9BVkNfNF8yLAorICAgICAgICAgICAgICAgICAgICAgICAgTEVWRUxfQVZDXzUsCisgICAgICAgICAgICAgICAgICAgIH0pLAorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoUHJvZmlsZUxldmVsU2V0dGVyLCBtU2l6ZSwgbUZyYW1lUmF0ZSwgbUJpdHJhdGUpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtUmVxdWVzdFN5bmMsIEMyX1BBUkFNS0VZX1JFUVVFU1RfU1lOQ19GUkFNRSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUmVxdWVzdFN5bmNGcmFtZVR1bmluZzo6b3V0cHV0KDB1LCBDMl9GQUxTRSkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtUmVxdWVzdFN5bmMsIHZhbHVlKS5vbmVPZih7IEMyX0ZBTFNFLCBDMl9UUlVFIH0pIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptUmVxdWVzdFN5bmMpPjo6Tm9uU3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVN5bmNGcmFtZVBlcmlvZCwgQzJfUEFSQU1LRVlfU1lOQ19GUkFNRV9JTlRFUlZBTCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtU3luY0ZyYW1lSW50ZXJ2YWxUdW5pbmc6Om91dHB1dCgwdSwgMTAwMDAwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtU3luY0ZyYW1lUGVyaW9kLCB2YWx1ZSkuYW55KCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbVN5bmNGcmFtZVBlcmlvZCk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgQml0cmF0ZVNldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1CaXRyYXRlSW5mbzo6b3V0cHV0PiAmbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIEMyUiByZXMgPSBDMlI6Ok9rKCk7CisgICAgICAgIGlmIChtZS52LnZhbHVlIDw9IDQwOTYpIHsKKyAgICAgICAgICAgIG1lLnNldCgpLnZhbHVlID0gNDA5NjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgU2l6ZVNldHRlcihib29sIG1heUJsb2NrLCBjb25zdCBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86OmlucHV0PiAmb2xkTWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEMyUDxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6aW5wdXQ+ICZtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgQzJSIHJlcyA9IEMyUjo6T2soKTsKKyAgICAgICAgaWYgKCFtZS5GKG1lLnYud2lkdGgpLnN1cHBvcnRzQXRBbGwobWUudi53aWR0aCkpIHsKKyAgICAgICAgICAgIHJlcyA9IHJlcy5wbHVzKEMyU2V0dGluZ1Jlc3VsdEJ1aWxkZXI6OkJhZFZhbHVlKG1lLkYobWUudi53aWR0aCkpKTsKKyAgICAgICAgICAgIG1lLnNldCgpLndpZHRoID0gb2xkTWUudi53aWR0aDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIW1lLkYobWUudi5oZWlnaHQpLnN1cHBvcnRzQXRBbGwobWUudi5oZWlnaHQpKSB7CisgICAgICAgICAgICByZXMgPSByZXMucGx1cyhDMlNldHRpbmdSZXN1bHRCdWlsZGVyOjpCYWRWYWx1ZShtZS5GKG1lLnYuaGVpZ2h0KSkpOworICAgICAgICAgICAgbWUuc2V0KCkuaGVpZ2h0ID0gb2xkTWUudi5oZWlnaHQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIFByb2ZpbGVMZXZlbFNldHRlcigKKyAgICAgICAgICAgIGJvb2wgbWF5QmxvY2ssCisgICAgICAgICAgICBDMlA8QzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjpvdXRwdXQ+ICZtZSwKKyAgICAgICAgICAgIGNvbnN0IEMyUDxDMlZpZGVvU2l6ZVN0cmVhbVR1bmluZzo6aW5wdXQ+ICZzaXplLAorICAgICAgICAgICAgY29uc3QgQzJQPEMyU3RyZWFtRnJhbWVSYXRlSW5mbzo6b3V0cHV0PiAmZnJhbWVSYXRlLAorICAgICAgICAgICAgY29uc3QgQzJQPEMyQml0cmF0ZVR1bmluZzo6b3V0cHV0PiAmYml0cmF0ZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgaWYgKCFtZS5GKG1lLnYucHJvZmlsZSkuc3VwcG9ydHNBdEFsbChtZS52LnByb2ZpbGUpKSB7CisgICAgICAgICAgICBtZS5zZXQoKS5wcm9maWxlID0gUFJPRklMRV9BVkNfQ09OU1RSQUlORURfQkFTRUxJTkU7CisgICAgICAgIH0KKworICAgICAgICBzdHJ1Y3QgTGV2ZWxMaW1pdHMgeworICAgICAgICAgICAgQzJDb25maWc6OmxldmVsX3QgbGV2ZWw7CisgICAgICAgICAgICBmbG9hdCBtYnNQZXJTZWM7CisgICAgICAgICAgICB1aW50NjRfdCBtYnM7CisgICAgICAgICAgICB1aW50MzJfdCBiaXRyYXRlOworICAgICAgICB9OworICAgICAgICBjb25zdGV4cHIgTGV2ZWxMaW1pdHMga0xpbWl0c1tdID0geworICAgICAgICAgICAgeyBMRVZFTF9BVkNfMSwgICAgIDE0ODUsICAgIDk5LCAgICAgNjQwMDAgfSwKKyAgICAgICAgICAgIC8vIERlY29kZXIgZG9lcyBub3QgcHJvcGVybHkgaGFuZGxlIGxldmVsIDFiLgorICAgICAgICAgICAgLy8geyBMRVZFTF9BVkNfMUIsICAgIDE0ODUsICAgOTksICAgMTI4MDAwIH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ18xXzEsICAgMzAwMCwgICAzOTYsICAgIDE5MjAwMCB9LAorICAgICAgICAgICAgeyBMRVZFTF9BVkNfMV8yLCAgIDYwMDAsICAgMzk2LCAgICAzODQwMDAgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfQVZDXzFfMywgIDExODgwLCAgIDM5NiwgICAgNzY4MDAwIH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ18yLCAgICAxMTg4MCwgICAzOTYsICAgMjAwMDAwMCB9LAorICAgICAgICAgICAgeyBMRVZFTF9BVkNfMl8xLCAgMTk4MDAsICAgNzkyLCAgIDQwMDAwMDAgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfQVZDXzJfMiwgIDIwMjUwLCAgMTYyMCwgICA0MDAwMDAwIH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ18zLCAgICA0MDUwMCwgIDE2MjAsICAxMDAwMDAwMCB9LAorICAgICAgICAgICAgeyBMRVZFTF9BVkNfM18xLCAxMDgwMDAsICAzNjAwLCAgMTQwMDAwMDAgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfQVZDXzNfMiwgMjE2MDAwLCAgNTEyMCwgIDIwMDAwMDAwIH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ180LCAgIDI0NTc2MCwgIDgxOTIsICAyMDAwMDAwMCB9LAorICAgICAgICAgICAgeyBMRVZFTF9BVkNfNF8xLCAyNDU3NjAsICA4MTkyLCAgNTAwMDAwMDAgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfQVZDXzRfMiwgNTIyMjQwLCAgODcwNCwgIDUwMDAwMDAwIH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ181LCAgIDU4OTgyNCwgMjIwODAsIDEzNTAwMDAwMCB9LAorICAgICAgICB9OworCisgICAgICAgIHVpbnQ2NF90IG1icyA9IHVpbnQ2NF90KChzaXplLnYud2lkdGggKyAxNSkgLyAxNikgKiAoKHNpemUudi5oZWlnaHQgKyAxNSkgLyAxNik7CisgICAgICAgIGZsb2F0IG1ic1BlclNlYyA9IGZsb2F0KG1icykgLyBmcmFtZVJhdGUudi52YWx1ZTsKKworICAgICAgICAvLyBDaGVjayBpZiB0aGUgc3VwcGxpZWQgbGV2ZWwgbWVldHMgdGhlIE1CIC8gYml0cmF0ZSByZXF1aXJlbWVudHMuIElmCisgICAgICAgIC8vIG5vdCwgdXBkYXRlIHRoZSBsZXZlbCB3aXRoIHRoZSBsb3dlc3QgbGV2ZWwgbWVldGluZyB0aGUgcmVxdWlyZW1lbnRzLgorCisgICAgICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKKyAgICAgICAgLy8gQnkgZGVmYXVsdCBuZWVkc1VwZGF0ZSA9IGZhbHNlIGluIGNhc2UgdGhlIHN1cHBsaWVkIGxldmVsIGRvZXMgbWVldAorICAgICAgICAvLyB0aGUgcmVxdWlyZW1lbnRzLiBGb3IgTGV2ZWwgMWIsIHdlIHdhbnQgdG8gdXBkYXRlIHRoZSBsZXZlbCBhbnl3YXksCisgICAgICAgIC8vIHNvIHdlIHNldCBpdCB0byB0cnVlIGluIHRoYXQgY2FzZS4KKyAgICAgICAgYm9vbCBuZWVkc1VwZGF0ZSA9IChtZS52LmxldmVsID09IExFVkVMX0FWQ18xQik7CisgICAgICAgIGZvciAoY29uc3QgTGV2ZWxMaW1pdHMgJmxpbWl0IDoga0xpbWl0cykgeworICAgICAgICAgICAgaWYgKG1icyA8PSBsaW1pdC5tYnMgJiYgbWJzUGVyU2VjIDw9IGxpbWl0Lm1ic1BlclNlYyAmJgorICAgICAgICAgICAgICAgICAgICBiaXRyYXRlLnYudmFsdWUgPD0gbGltaXQuYml0cmF0ZSkgeworICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIGxvd2VzdCBsZXZlbCB0aGF0IG1lZXRzIHRoZSByZXF1aXJlbWVudHMsIGFuZCBpZgorICAgICAgICAgICAgICAgIC8vIHdlIGhhdmVuJ3Qgc2VlbiB0aGUgc3VwcGxpZWQgbGV2ZWwgeWV0LCB0aGF0IG1lYW5zIHdlIGRvbid0CisgICAgICAgICAgICAgICAgLy8gbmVlZCB0aGUgdXBkYXRlLgorICAgICAgICAgICAgICAgIGlmIChuZWVkc1VwZGF0ZSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRCgiR2l2ZW4gbGV2ZWwgJXggZG9lcyBub3QgY292ZXIgY3VycmVudCBjb25maWd1cmF0aW9uOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJhZGp1c3RpbmcgdG8gJXgiLCBtZS52LmxldmVsLCBsaW1pdC5sZXZlbCk7CisgICAgICAgICAgICAgICAgICAgIG1lLnNldCgpLmxldmVsID0gbGltaXQubGV2ZWw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtZS52LmxldmVsID09IGxpbWl0LmxldmVsKSB7CisgICAgICAgICAgICAgICAgLy8gV2UgYnJlYWsgb3V0IG9mIHRoZSBsb29wIHdoZW4gdGhlIGxvd2VzdCBmZWFzaWJsZSBsZXZlbCBpcworICAgICAgICAgICAgICAgIC8vIGZvdW5kLiBUaGUgZmFjdCB0aGF0IHdlJ3JlIGhlcmUgbWVhbnMgdGhhdCBvdXIgbGV2ZWwgZG9lc24ndAorICAgICAgICAgICAgICAgIC8vIG1lZXQgdGhlIHJlcXVpcmVtZW50IGFuZCBuZWVkcyB0byBiZSB1cGRhdGVkLgorICAgICAgICAgICAgICAgIG5lZWRzVXBkYXRlID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAvLyBXZSBzZXQgdG8gdGhlIGhpZ2hlc3Qgc3VwcG9ydGVkIGxldmVsLgorICAgICAgICAgICAgbWUuc2V0KCkubGV2ZWwgPSBMRVZFTF9BVkNfNTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBJbnRyYVJlZnJlc2hTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtSW50cmFSZWZyZXNoVHVuaW5nOjpvdXRwdXQ+ICZtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgQzJSIHJlcyA9IEMyUjo6T2soKTsKKyAgICAgICAgaWYgKG1lLnYucGVyaW9kIDwgMSkgeworICAgICAgICAgICAgbWUuc2V0KCkubW9kZSA9IEMyQ29uZmlnOjpJTlRSQV9SRUZSRVNIX0RJU0FCTEVEOworICAgICAgICAgICAgbWUuc2V0KCkucGVyaW9kID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIG9ubHkgc3VwcG9ydCBhcmJpdHJhcnkgbW9kZSAoY3ljbGljIGluIG91ciBjYXNlKQorICAgICAgICAgICAgbWUuc2V0KCkubW9kZSA9IEMyQ29uZmlnOjpJTlRSQV9SRUZSRVNIX0FSQklUUkFSWTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIElWX1BST0ZJTEVfVCBnZXRQcm9maWxlX2woKSBjb25zdCB7CisgICAgICAgIHN3aXRjaCAobVByb2ZpbGVMZXZlbC0+cHJvZmlsZSkgeworICAgICAgICBjYXNlIFBST0ZJTEVfQVZDX0NPTlNUUkFJTkVEX0JBU0VMSU5FOiAgW1tmYWxsdGhyb3VnaF1dOworICAgICAgICBjYXNlIFBST0ZJTEVfQVZDX0JBU0VMSU5FOiByZXR1cm4gSVZfUFJPRklMRV9CQVNFOworICAgICAgICBjYXNlIFBST0ZJTEVfQVZDX01BSU46ICAgICByZXR1cm4gSVZfUFJPRklMRV9NQUlOOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR0QoIlVucmVjb2duaXplZCBwcm9maWxlOiAleCIsIG1Qcm9maWxlTGV2ZWwtPnByb2ZpbGUpOworICAgICAgICAgICAgcmV0dXJuIElWX1BST0ZJTEVfREVGQVVMVDsKKyAgICAgICAgfQorICAgIH0KKworICAgIFVXT1JEMzIgZ2V0TGV2ZWxfbCgpIGNvbnN0IHsKKyAgICAgICAgc3RydWN0IExldmVsIHsKKyAgICAgICAgICAgIEMyQ29uZmlnOjpsZXZlbF90IGMyTGV2ZWw7CisgICAgICAgICAgICBVV09SRDMyIGF2Y0xldmVsOworICAgICAgICB9OworICAgICAgICBjb25zdGV4cHIgTGV2ZWwgbGV2ZWxzW10gPSB7CisgICAgICAgICAgICB7IExFVkVMX0FWQ18xLCAgIDEwIH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ18xQiwgICA5IH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ18xXzEsIDExIH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ18xXzIsIDEyIH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ18xXzMsIDEzIH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ18yLCAgIDIwIH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ18yXzEsIDIxIH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ18yXzIsIDIyIH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ18zLCAgIDMwIH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ18zXzEsIDMxIH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ18zXzIsIDMyIH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ180LCAgIDQwIH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ180XzEsIDQxIH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ180XzIsIDQyIH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ181LCAgIDUwIH0sCisgICAgICAgIH07CisgICAgICAgIGZvciAoY29uc3QgTGV2ZWwgJmxldmVsIDogbGV2ZWxzKSB7CisgICAgICAgICAgICBpZiAobVByb2ZpbGVMZXZlbC0+bGV2ZWwgPT0gbGV2ZWwuYzJMZXZlbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBsZXZlbC5hdmNMZXZlbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBBTE9HRCgiVW5yZWNvZ25pemVkIGxldmVsOiAleCIsIG1Qcm9maWxlTGV2ZWwtPmxldmVsKTsKKyAgICAgICAgcmV0dXJuIDQxOworICAgIH0KKyAgICB1aW50MzJfdCBnZXRTeW5jRnJhbWVQZXJpb2RfbCgpIGNvbnN0IHsKKyAgICAgICAgaWYgKG1TeW5jRnJhbWVQZXJpb2QtPnZhbHVlIDwgMCB8fCBtU3luY0ZyYW1lUGVyaW9kLT52YWx1ZSA9PSBJTlQ2NF9NQVgpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGRvdWJsZSBwZXJpb2QgPSBtU3luY0ZyYW1lUGVyaW9kLT52YWx1ZSAvIDFlNiAqIG1GcmFtZVJhdGUtPnZhbHVlOworICAgICAgICByZXR1cm4gKHVpbnQzMl90KWMyX21heChjMl9taW4ocGVyaW9kICsgMC41LCBkb3VibGUoVUlOVDMyX01BWCkpLCAxLik7CisgICAgfQorCisgICAgLy8gdW5zYWZlIGdldHRlcnMKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86OmlucHV0PiBnZXRTaXplX2woKSBjb25zdCB7IHJldHVybiBtU2l6ZTsgfQorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUludHJhUmVmcmVzaFR1bmluZzo6b3V0cHV0PiBnZXRJbnRyYVJlZnJlc2hfbCgpIGNvbnN0IHsgcmV0dXJuIG1JbnRyYVJlZnJlc2g7IH0KKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1GcmFtZVJhdGVJbmZvOjpvdXRwdXQ+IGdldEZyYW1lUmF0ZV9sKCkgY29uc3QgeyByZXR1cm4gbUZyYW1lUmF0ZTsgfQorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJpdHJhdGVJbmZvOjpvdXRwdXQ+IGdldEJpdHJhdGVfbCgpIGNvbnN0IHsgcmV0dXJuIG1CaXRyYXRlOyB9CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUmVxdWVzdFN5bmNGcmFtZVR1bmluZzo6b3V0cHV0PiBnZXRSZXF1ZXN0U3luY19sKCkgY29uc3QgeyByZXR1cm4gbVJlcXVlc3RTeW5jOyB9CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRm9ybWF0Q29uZmlnOjppbnB1dD4gbUlucHV0Rm9ybWF0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUZvcm1hdENvbmZpZzo6b3V0cHV0PiBtT3V0cHV0Rm9ybWF0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRNaW1lQ29uZmlnOjppbnB1dD4gbUlucHV0TWVkaWFUeXBlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRNaW1lQ29uZmlnOjpvdXRwdXQ+IG1PdXRwdXRNZWRpYVR5cGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtVXNhZ2VUdW5pbmc6OmlucHV0PiBtVXNhZ2U7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyVmlkZW9TaXplU3RyZWFtVHVuaW5nOjppbnB1dD4gbVNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRnJhbWVSYXRlSW5mbzo6b3V0cHV0PiBtRnJhbWVSYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVJlcXVlc3RTeW5jRnJhbWVUdW5pbmc6Om91dHB1dD4gbVJlcXVlc3RTeW5jOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUludHJhUmVmcmVzaFR1bmluZzo6b3V0cHV0PiBtSW50cmFSZWZyZXNoOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJpdHJhdGVUdW5pbmc6Om91dHB1dD4gbUJpdHJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6b3V0cHV0PiBtUHJvZmlsZUxldmVsOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVN5bmNGcmFtZUludGVydmFsVHVuaW5nOjpvdXRwdXQ+IG1TeW5jRnJhbWVQZXJpb2Q7Cit9OworCisjZGVmaW5lIGl2ZV9hcGlfZnVuY3Rpb24gIGloMjY0ZV9hcGlfZnVuY3Rpb24KKworY29uc3RleHByIGNoYXIgQ09NUE9ORU5UX05BTUVbXSA9ICJjMi5hbmRyb2lkLmF2Yy5lbmNvZGVyIjsKKworbmFtZXNwYWNlIHsKKworLy8gRnJvbSBleHRlcm5hbC9saWJhdmMvZW5jb2Rlci9paDI2NGVfYml0c3RyZWFtLmgKK2NvbnN0ZXhwciB1aW50MzJfdCBNSU5fU1RSRUFNX1NJWkUgPSAweDgwMDsKKworc3RhdGljIHNpemVfdCBHZXRDUFVDb3JlQ291bnQoKSB7CisgICAgbG9uZyBjcHVDb3JlQ291bnQgPSAxOworI2lmIGRlZmluZWQoX1NDX05QUk9DRVNTT1JTX09OTE4pCisgICAgY3B1Q29yZUNvdW50ID0gc3lzY29uZihfU0NfTlBST0NFU1NPUlNfT05MTik7CisjZWxzZQorICAgIC8vIF9TQ19OUFJPQ19PTkxOIG11c3QgYmUgZGVmaW5lZC4uLgorICAgIGNwdUNvcmVDb3VudCA9IHN5c2NvbmYoX1NDX05QUk9DX09OTE4pOworI2VuZGlmCisgICAgQ0hFQ0soY3B1Q29yZUNvdW50ID49IDEpOworICAgIEFMT0dWKCJOdW1iZXIgb2YgQ1BVIGNvcmVzOiAlbGQiLCBjcHVDb3JlQ291bnQpOworICAgIHJldHVybiAoc2l6ZV90KWNwdUNvcmVDb3VudDsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK0MyU29mdEF2Y0VuYzo6QzJTb2Z0QXZjRW5jKAorICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBjMl9ub2RlX2lkX3QgaWQsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gJmludGZJbXBsKQorICAgIDogU2ltcGxlQzJDb21wb25lbnQoc3RkOjptYWtlX3NoYXJlZDxTaW1wbGVJbnRlcmZhY2U8SW50ZkltcGw+PihuYW1lLCBpZCwgaW50ZkltcGwpKSwKKyAgICAgIG1JbnRmKGludGZJbXBsKSwKKyAgICAgIG1JdlZpZGVvQ29sb3JGb3JtYXQoSVZfWVVWXzQyMFApLAorICAgICAgbUFWQ0VuY1Byb2ZpbGUoSVZfUFJPRklMRV9CQVNFKSwKKyAgICAgIG1BVkNFbmNMZXZlbCg0MSksCisgICAgICBtU3RhcnRlZChmYWxzZSksCisgICAgICBtU2F3SW5wdXRFT1MoZmFsc2UpLAorICAgICAgbVNhd091dHB1dEVPUyhmYWxzZSksCisgICAgICBtU2lnbmFsbGVkRXJyb3IoZmFsc2UpLAorICAgICAgbUNvZGVjQ3R4KG51bGxwdHIpLAorICAgICAgLy8gVE9ETzogb3V0cHV0IGJ1ZmZlciBzaXplCisgICAgICBtT3V0QnVmZmVyU2l6ZSg1MjQyODgpIHsKKworICAgIC8vIElmIGR1bXAgaXMgZW5hYmxlZCwgdGhlbiBvcGVuIGNyZWF0ZSBhbiBlbXB0eSBmaWxlCisgICAgR0VORVJBVEVfRklMRV9OQU1FUygpOworICAgIENSRUFURV9EVU1QX0ZJTEUobUluRmlsZSk7CisgICAgQ1JFQVRFX0RVTVBfRklMRShtT3V0RmlsZSk7CisKKyAgICBpbml0RW5jUGFyYW1zKCk7Cit9CisKK0MyU29mdEF2Y0VuYzo6fkMyU29mdEF2Y0VuYygpIHsKKyAgICByZWxlYXNlRW5jb2RlcigpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBdmNFbmM6Om9uSW5pdCgpIHsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEF2Y0VuYzo6b25TdG9wKCkgeworICAgIHJldHVybiBDMl9PSzsKK30KKwordm9pZCBDMlNvZnRBdmNFbmM6Om9uUmVzZXQoKSB7CisgICAgLy8gVE9ETzogdXNlIElWRV9DTURfQ1RMX1JFU0VUPworICAgIHJlbGVhc2VFbmNvZGVyKCk7CisgICAgaW5pdEVuY1BhcmFtcygpOworfQorCit2b2lkIEMyU29mdEF2Y0VuYzo6b25SZWxlYXNlKCkgeworICAgIHJlbGVhc2VFbmNvZGVyKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEF2Y0VuYzo6b25GbHVzaF9zbSgpIHsKKyAgICAvLyBUT0RPOiB1c2UgSVZFX0NNRF9DVExfRkxVU0g/CisgICAgcmV0dXJuIEMyX09LOworfQorCit2b2lkICBDMlNvZnRBdmNFbmM6OmluaXRFbmNQYXJhbXMoKSB7CisgICAgbUNvZGVjQ3R4ID0gbnVsbHB0cjsKKyAgICBtTWVtUmVjb3JkcyA9IG51bGxwdHI7CisgICAgbU51bU1lbVJlY29yZHMgPSBERUZBVUxUX01FTV9SRUNfQ05UOworICAgIG1IZWFkZXJHZW5lcmF0ZWQgPSAwOworICAgIG1OdW1Db3JlcyA9IEdldENQVUNvcmVDb3VudCgpOworICAgIG1BcmNoID0gREVGQVVMVF9BUkNIOworICAgIG1TbGljZU1vZGUgPSBERUZBVUxUX1NMSUNFX01PREU7CisgICAgbVNsaWNlUGFyYW0gPSBERUZBVUxUX1NMSUNFX1BBUkFNOworICAgIG1IYWxmUGVsRW5hYmxlID0gREVGQVVMVF9IUEVMOworICAgIG1JSW50ZXJ2YWwgPSBERUZBVUxUX0lfSU5URVJWQUw7CisgICAgbUlEUkludGVydmFsID0gREVGQVVMVF9JRFJfSU5URVJWQUw7CisgICAgbURpc2FibGVEZWJsa0xldmVsID0gREVGQVVMVF9ESVNBQkxFX0RFQkxLX0xFVkVMOworICAgIG1FbmFibGVGYXN0U2FkID0gREVGQVVMVF9FTkFCTEVfRkFTVF9TQUQ7CisgICAgbUVuYWJsZUFsdFJlZiA9IERFRkFVTFRfRU5BQkxFX0FMVF9SRUY7CisgICAgbUVuY1NwZWVkID0gREVGQVVMVF9FTkNfU1BFRUQ7CisgICAgbUludHJhNHg0ID0gREVGQVVMVF9JTlRSQTR4NDsKKyAgICBtQ29uc3RyYWluZWRJbnRyYUZsYWcgPSBERUZBVUxUX0NPTlNUUkFJTkVEX0lOVFJBOworICAgIG1QU05SRW5hYmxlID0gREVGQVVMVF9QU05SX0VOQUJMRTsKKyAgICBtUmVjb25FbmFibGUgPSBERUZBVUxUX1JFQ09OX0VOQUJMRTsKKyAgICBtRW50cm9weU1vZGUgPSBERUZBVUxUX0VOVFJPUFlfTU9ERTsKKyAgICBtQmZyYW1lcyA9IERFRkFVTFRfQl9GUkFNRVM7CisKKyAgICBnZXR0aW1lb2ZkYXkoJm1UaW1lU3RhcnQsIG51bGxwdHIpOworICAgIGdldHRpbWVvZmRheSgmbVRpbWVFbmQsIG51bGxwdHIpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBdmNFbmM6OnNldERpbWVuc2lvbnMoKSB7CisgICAgaXZlX2N0bF9zZXRfZGltZW5zaW9uc19pcF90IHNfZGltZW5zaW9uc19pcDsKKyAgICBpdmVfY3RsX3NldF9kaW1lbnNpb25zX29wX3Qgc19kaW1lbnNpb25zX29wOworICAgIElWX1NUQVRVU19UIHN0YXR1czsKKworICAgIHNfZGltZW5zaW9uc19pcC5lX2NtZCA9IElWRV9DTURfVklERU9fQ1RMOworICAgIHNfZGltZW5zaW9uc19pcC5lX3N1Yl9jbWQgPSBJVkVfQ01EX0NUTF9TRVRfRElNRU5TSU9OUzsKKyAgICBzX2RpbWVuc2lvbnNfaXAudTRfaHQgPSBtU2l6ZS0+aGVpZ2h0OworICAgIHNfZGltZW5zaW9uc19pcC51NF93ZCA9IG1TaXplLT53aWR0aDsKKworICAgIHNfZGltZW5zaW9uc19pcC51NF90aW1lc3RhbXBfaGlnaCA9IC0xOworICAgIHNfZGltZW5zaW9uc19pcC51NF90aW1lc3RhbXBfbG93ID0gLTE7CisKKyAgICBzX2RpbWVuc2lvbnNfaXAudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX3NldF9kaW1lbnNpb25zX2lwX3QpOworICAgIHNfZGltZW5zaW9uc19vcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X2RpbWVuc2lvbnNfb3BfdCk7CisKKyAgICBzdGF0dXMgPSBpdmVfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgJnNfZGltZW5zaW9uc19pcCwgJnNfZGltZW5zaW9uc19vcCk7CisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gc2V0IGZyYW1lIGRpbWVuc2lvbnMgPSAweCV4XG4iLAorICAgICAgICAgICAgICAgIHNfZGltZW5zaW9uc19vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBdmNFbmM6OnNldE51bUNvcmVzKCkgeworICAgIElWX1NUQVRVU19UIHN0YXR1czsKKyAgICBpdmVfY3RsX3NldF9udW1fY29yZXNfaXBfdCBzX251bV9jb3Jlc19pcDsKKyAgICBpdmVfY3RsX3NldF9udW1fY29yZXNfb3BfdCBzX251bV9jb3Jlc19vcDsKKyAgICBzX251bV9jb3Jlc19pcC5lX2NtZCA9IElWRV9DTURfVklERU9fQ1RMOworICAgIHNfbnVtX2NvcmVzX2lwLmVfc3ViX2NtZCA9IElWRV9DTURfQ1RMX1NFVF9OVU1fQ09SRVM7CisgICAgc19udW1fY29yZXNfaXAudTRfbnVtX2NvcmVzID0gTUlOKG1OdW1Db3JlcywgQ09ERUNfTUFYX0NPUkVTKTsKKyAgICBzX251bV9jb3Jlc19pcC51NF90aW1lc3RhbXBfaGlnaCA9IC0xOworICAgIHNfbnVtX2NvcmVzX2lwLnU0X3RpbWVzdGFtcF9sb3cgPSAtMTsKKyAgICBzX251bV9jb3Jlc19pcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X251bV9jb3Jlc19pcF90KTsKKworICAgIHNfbnVtX2NvcmVzX29wLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfbnVtX2NvcmVzX29wX3QpOworCisgICAgc3RhdHVzID0gaXZlX2FwaV9mdW5jdGlvbigKKyAgICAgICAgICAgIG1Db2RlY0N0eCwgKHZvaWQgKikgJnNfbnVtX2NvcmVzX2lwLCAodm9pZCAqKSAmc19udW1fY29yZXNfb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIHNldCBwcm9jZXNzb3IgcGFyYW1zID0gMHgleFxuIiwKKyAgICAgICAgICAgICAgICBzX251bV9jb3Jlc19vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBdmNFbmM6OnNldEZyYW1lUmF0ZSgpIHsKKyAgICBpdmVfY3RsX3NldF9mcmFtZV9yYXRlX2lwX3Qgc19mcmFtZV9yYXRlX2lwOworICAgIGl2ZV9jdGxfc2V0X2ZyYW1lX3JhdGVfb3BfdCBzX2ZyYW1lX3JhdGVfb3A7CisgICAgSVZfU1RBVFVTX1Qgc3RhdHVzOworCisgICAgc19mcmFtZV9yYXRlX2lwLmVfY21kID0gSVZFX0NNRF9WSURFT19DVEw7CisgICAgc19mcmFtZV9yYXRlX2lwLmVfc3ViX2NtZCA9IElWRV9DTURfQ1RMX1NFVF9GUkFNRVJBVEU7CisKKyAgICBzX2ZyYW1lX3JhdGVfaXAudTRfc3JjX2ZyYW1lX3JhdGUgPSBtRnJhbWVSYXRlLT52YWx1ZSArIDAuNTsKKyAgICBzX2ZyYW1lX3JhdGVfaXAudTRfdGd0X2ZyYW1lX3JhdGUgPSBtRnJhbWVSYXRlLT52YWx1ZSArIDAuNTsKKworICAgIHNfZnJhbWVfcmF0ZV9pcC51NF90aW1lc3RhbXBfaGlnaCA9IC0xOworICAgIHNfZnJhbWVfcmF0ZV9pcC51NF90aW1lc3RhbXBfbG93ID0gLTE7CisKKyAgICBzX2ZyYW1lX3JhdGVfaXAudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX3NldF9mcmFtZV9yYXRlX2lwX3QpOworICAgIHNfZnJhbWVfcmF0ZV9vcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X2ZyYW1lX3JhdGVfb3BfdCk7CisKKyAgICBzdGF0dXMgPSBpdmVfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgJnNfZnJhbWVfcmF0ZV9pcCwgJnNfZnJhbWVfcmF0ZV9vcCk7CisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gc2V0IGZyYW1lIHJhdGUgPSAweCV4XG4iLAorICAgICAgICAgICAgICAgIHNfZnJhbWVfcmF0ZV9vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBdmNFbmM6OnNldElwZVBhcmFtcygpIHsKKyAgICBpdmVfY3RsX3NldF9pcGVfcGFyYW1zX2lwX3Qgc19pcGVfcGFyYW1zX2lwOworICAgIGl2ZV9jdGxfc2V0X2lwZV9wYXJhbXNfb3BfdCBzX2lwZV9wYXJhbXNfb3A7CisgICAgSVZfU1RBVFVTX1Qgc3RhdHVzOworCisgICAgc19pcGVfcGFyYW1zX2lwLmVfY21kID0gSVZFX0NNRF9WSURFT19DVEw7CisgICAgc19pcGVfcGFyYW1zX2lwLmVfc3ViX2NtZCA9IElWRV9DTURfQ1RMX1NFVF9JUEVfUEFSQU1TOworCisgICAgc19pcGVfcGFyYW1zX2lwLnU0X2VuYWJsZV9pbnRyYV80eDQgPSBtSW50cmE0eDQ7CisgICAgc19pcGVfcGFyYW1zX2lwLnU0X2VuY19zcGVlZF9wcmVzZXQgPSBtRW5jU3BlZWQ7CisgICAgc19pcGVfcGFyYW1zX2lwLnU0X2NvbnN0cmFpbmVkX2ludHJhX3ByZWQgPSBtQ29uc3RyYWluZWRJbnRyYUZsYWc7CisKKyAgICBzX2lwZV9wYXJhbXNfaXAudTRfdGltZXN0YW1wX2hpZ2ggPSAtMTsKKyAgICBzX2lwZV9wYXJhbXNfaXAudTRfdGltZXN0YW1wX2xvdyA9IC0xOworCisgICAgc19pcGVfcGFyYW1zX2lwLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfaXBlX3BhcmFtc19pcF90KTsKKyAgICBzX2lwZV9wYXJhbXNfb3AudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX3NldF9pcGVfcGFyYW1zX29wX3QpOworCisgICAgc3RhdHVzID0gaXZlX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICZzX2lwZV9wYXJhbXNfaXAsICZzX2lwZV9wYXJhbXNfb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIHNldCBpcGUgcGFyYW1zID0gMHgleFxuIiwKKyAgICAgICAgICAgICAgICBzX2lwZV9wYXJhbXNfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QXZjRW5jOjpzZXRCaXRSYXRlKCkgeworICAgIGl2ZV9jdGxfc2V0X2JpdHJhdGVfaXBfdCBzX2JpdHJhdGVfaXA7CisgICAgaXZlX2N0bF9zZXRfYml0cmF0ZV9vcF90IHNfYml0cmF0ZV9vcDsKKyAgICBJVl9TVEFUVVNfVCBzdGF0dXM7CisKKyAgICBzX2JpdHJhdGVfaXAuZV9jbWQgPSBJVkVfQ01EX1ZJREVPX0NUTDsKKyAgICBzX2JpdHJhdGVfaXAuZV9zdWJfY21kID0gSVZFX0NNRF9DVExfU0VUX0JJVFJBVEU7CisKKyAgICBzX2JpdHJhdGVfaXAudTRfdGFyZ2V0X2JpdHJhdGUgPSBtQml0cmF0ZS0+dmFsdWU7CisKKyAgICBzX2JpdHJhdGVfaXAudTRfdGltZXN0YW1wX2hpZ2ggPSAtMTsKKyAgICBzX2JpdHJhdGVfaXAudTRfdGltZXN0YW1wX2xvdyA9IC0xOworCisgICAgc19iaXRyYXRlX2lwLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfYml0cmF0ZV9pcF90KTsKKyAgICBzX2JpdHJhdGVfb3AudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX3NldF9iaXRyYXRlX29wX3QpOworCisgICAgc3RhdHVzID0gaXZlX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICZzX2JpdHJhdGVfaXAsICZzX2JpdHJhdGVfb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIHNldCBiaXQgcmF0ZSA9IDB4JXhcbiIsIHNfYml0cmF0ZV9vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBdmNFbmM6OnNldEZyYW1lVHlwZShJVl9QSUNUVVJFX0NPRElOR19UWVBFX1QgZV9mcmFtZV90eXBlKSB7CisgICAgaXZlX2N0bF9zZXRfZnJhbWVfdHlwZV9pcF90IHNfZnJhbWVfdHlwZV9pcDsKKyAgICBpdmVfY3RsX3NldF9mcmFtZV90eXBlX29wX3Qgc19mcmFtZV90eXBlX29wOworICAgIElWX1NUQVRVU19UIHN0YXR1czsKKyAgICBzX2ZyYW1lX3R5cGVfaXAuZV9jbWQgPSBJVkVfQ01EX1ZJREVPX0NUTDsKKyAgICBzX2ZyYW1lX3R5cGVfaXAuZV9zdWJfY21kID0gSVZFX0NNRF9DVExfU0VUX0ZSQU1FVFlQRTsKKworICAgIHNfZnJhbWVfdHlwZV9pcC5lX2ZyYW1lX3R5cGUgPSBlX2ZyYW1lX3R5cGU7CisKKyAgICBzX2ZyYW1lX3R5cGVfaXAudTRfdGltZXN0YW1wX2hpZ2ggPSAtMTsKKyAgICBzX2ZyYW1lX3R5cGVfaXAudTRfdGltZXN0YW1wX2xvdyA9IC0xOworCisgICAgc19mcmFtZV90eXBlX2lwLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfZnJhbWVfdHlwZV9pcF90KTsKKyAgICBzX2ZyYW1lX3R5cGVfb3AudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX3NldF9mcmFtZV90eXBlX29wX3QpOworCisgICAgc3RhdHVzID0gaXZlX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICZzX2ZyYW1lX3R5cGVfaXAsICZzX2ZyYW1lX3R5cGVfb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIHNldCBmcmFtZSB0eXBlID0gMHgleFxuIiwKKyAgICAgICAgICAgICAgICBzX2ZyYW1lX3R5cGVfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QXZjRW5jOjpzZXRRcCgpIHsKKyAgICBpdmVfY3RsX3NldF9xcF9pcF90IHNfcXBfaXA7CisgICAgaXZlX2N0bF9zZXRfcXBfb3BfdCBzX3FwX29wOworICAgIElWX1NUQVRVU19UIHN0YXR1czsKKworICAgIHNfcXBfaXAuZV9jbWQgPSBJVkVfQ01EX1ZJREVPX0NUTDsKKyAgICBzX3FwX2lwLmVfc3ViX2NtZCA9IElWRV9DTURfQ1RMX1NFVF9RUDsKKworICAgIHNfcXBfaXAudTRfaV9xcCA9IERFRkFVTFRfSV9RUDsKKyAgICBzX3FwX2lwLnU0X2lfcXBfbWF4ID0gREVGQVVMVF9RUF9NQVg7CisgICAgc19xcF9pcC51NF9pX3FwX21pbiA9IERFRkFVTFRfUVBfTUlOOworCisgICAgc19xcF9pcC51NF9wX3FwID0gREVGQVVMVF9QX1FQOworICAgIHNfcXBfaXAudTRfcF9xcF9tYXggPSBERUZBVUxUX1FQX01BWDsKKyAgICBzX3FwX2lwLnU0X3BfcXBfbWluID0gREVGQVVMVF9RUF9NSU47CisKKyAgICBzX3FwX2lwLnU0X2JfcXAgPSBERUZBVUxUX1BfUVA7CisgICAgc19xcF9pcC51NF9iX3FwX21heCA9IERFRkFVTFRfUVBfTUFYOworICAgIHNfcXBfaXAudTRfYl9xcF9taW4gPSBERUZBVUxUX1FQX01JTjsKKworICAgIHNfcXBfaXAudTRfdGltZXN0YW1wX2hpZ2ggPSAtMTsKKyAgICBzX3FwX2lwLnU0X3RpbWVzdGFtcF9sb3cgPSAtMTsKKworICAgIHNfcXBfaXAudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX3NldF9xcF9pcF90KTsKKyAgICBzX3FwX29wLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfcXBfb3BfdCk7CisKKyAgICBzdGF0dXMgPSBpdmVfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgJnNfcXBfaXAsICZzX3FwX29wKTsKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBzZXQgcXAgMHgleFxuIiwgc19xcF9vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBdmNFbmM6OnNldEVuY01vZGUoSVZFX0VOQ19NT0RFX1QgZV9lbmNfbW9kZSkgeworICAgIElWX1NUQVRVU19UIHN0YXR1czsKKyAgICBpdmVfY3RsX3NldF9lbmNfbW9kZV9pcF90IHNfZW5jX21vZGVfaXA7CisgICAgaXZlX2N0bF9zZXRfZW5jX21vZGVfb3BfdCBzX2VuY19tb2RlX29wOworCisgICAgc19lbmNfbW9kZV9pcC5lX2NtZCA9IElWRV9DTURfVklERU9fQ1RMOworICAgIHNfZW5jX21vZGVfaXAuZV9zdWJfY21kID0gSVZFX0NNRF9DVExfU0VUX0VOQ19NT0RFOworCisgICAgc19lbmNfbW9kZV9pcC5lX2VuY19tb2RlID0gZV9lbmNfbW9kZTsKKworICAgIHNfZW5jX21vZGVfaXAudTRfdGltZXN0YW1wX2hpZ2ggPSAtMTsKKyAgICBzX2VuY19tb2RlX2lwLnU0X3RpbWVzdGFtcF9sb3cgPSAtMTsKKworICAgIHNfZW5jX21vZGVfaXAudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX3NldF9lbmNfbW9kZV9pcF90KTsKKyAgICBzX2VuY19tb2RlX29wLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfZW5jX21vZGVfb3BfdCk7CisKKyAgICBzdGF0dXMgPSBpdmVfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgJnNfZW5jX21vZGVfaXAsICZzX2VuY19tb2RlX29wKTsKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBzZXQgaW4gaGVhZGVyIGVuY29kZSBtb2RlID0gMHgleFxuIiwKKyAgICAgICAgICAgICAgICBzX2VuY19tb2RlX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEF2Y0VuYzo6c2V0VmJ2UGFyYW1zKCkgeworICAgIGl2ZV9jdGxfc2V0X3Zidl9wYXJhbXNfaXBfdCBzX3Zidl9pcDsKKyAgICBpdmVfY3RsX3NldF92YnZfcGFyYW1zX29wX3Qgc192YnZfb3A7CisgICAgSVZfU1RBVFVTX1Qgc3RhdHVzOworCisgICAgc192YnZfaXAuZV9jbWQgPSBJVkVfQ01EX1ZJREVPX0NUTDsKKyAgICBzX3Zidl9pcC5lX3N1Yl9jbWQgPSBJVkVfQ01EX0NUTF9TRVRfVkJWX1BBUkFNUzsKKworICAgIHNfdmJ2X2lwLnU0X3Zidl9idWZfc2l6ZSA9IDA7CisgICAgc192YnZfaXAudTRfdmJ2X2J1ZmZlcl9kZWxheSA9IDEwMDA7CisKKyAgICBzX3Zidl9pcC51NF90aW1lc3RhbXBfaGlnaCA9IC0xOworICAgIHNfdmJ2X2lwLnU0X3RpbWVzdGFtcF9sb3cgPSAtMTsKKworICAgIHNfdmJ2X2lwLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfdmJ2X3BhcmFtc19pcF90KTsKKyAgICBzX3Zidl9vcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X3Zidl9wYXJhbXNfb3BfdCk7CisKKyAgICBzdGF0dXMgPSBpdmVfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgJnNfdmJ2X2lwLCAmc192YnZfb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIHNldCBWQlYgcGFyYW1zID0gMHgleFxuIiwgc192YnZfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QXZjRW5jOjpzZXRBaXJQYXJhbXMoKSB7CisgICAgaXZlX2N0bF9zZXRfYWlyX3BhcmFtc19pcF90IHNfYWlyX2lwOworICAgIGl2ZV9jdGxfc2V0X2Fpcl9wYXJhbXNfb3BfdCBzX2Fpcl9vcDsKKyAgICBJVl9TVEFUVVNfVCBzdGF0dXM7CisKKyAgICBzX2Fpcl9pcC5lX2NtZCA9IElWRV9DTURfVklERU9fQ1RMOworICAgIHNfYWlyX2lwLmVfc3ViX2NtZCA9IElWRV9DTURfQ1RMX1NFVF9BSVJfUEFSQU1TOworCisgICAgc19haXJfaXAuZV9haXJfbW9kZSA9CisgICAgICAgIChtSW50cmFSZWZyZXNoLT5tb2RlID09IEMyQ29uZmlnOjpJTlRSQV9SRUZSRVNIX0RJU0FCTEVEIHx8IG1JbnRyYVJlZnJlc2gtPnBlcmlvZCA8IDEpCisgICAgICAgICAgICA/IElWRV9BSVJfTU9ERV9OT05FIDogSVZFX0FJUl9NT0RFX0NZQ0xJQzsKKyAgICBzX2Fpcl9pcC51NF9haXJfcmVmcmVzaF9wZXJpb2QgPSBtSW50cmFSZWZyZXNoLT5wZXJpb2Q7CisKKyAgICBzX2Fpcl9pcC51NF90aW1lc3RhbXBfaGlnaCA9IC0xOworICAgIHNfYWlyX2lwLnU0X3RpbWVzdGFtcF9sb3cgPSAtMTsKKworICAgIHNfYWlyX2lwLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfYWlyX3BhcmFtc19pcF90KTsKKyAgICBzX2Fpcl9vcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X2Fpcl9wYXJhbXNfb3BfdCk7CisKKyAgICBzdGF0dXMgPSBpdmVfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgJnNfYWlyX2lwLCAmc19haXJfb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIHNldCBhaXIgcGFyYW1zID0gMHgleFxuIiwgc19haXJfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QXZjRW5jOjpzZXRNZVBhcmFtcygpIHsKKyAgICBJVl9TVEFUVVNfVCBzdGF0dXM7CisgICAgaXZlX2N0bF9zZXRfbWVfcGFyYW1zX2lwX3Qgc19tZV9wYXJhbXNfaXA7CisgICAgaXZlX2N0bF9zZXRfbWVfcGFyYW1zX29wX3Qgc19tZV9wYXJhbXNfb3A7CisKKyAgICBzX21lX3BhcmFtc19pcC5lX2NtZCA9IElWRV9DTURfVklERU9fQ1RMOworICAgIHNfbWVfcGFyYW1zX2lwLmVfc3ViX2NtZCA9IElWRV9DTURfQ1RMX1NFVF9NRV9QQVJBTVM7CisKKyAgICBzX21lX3BhcmFtc19pcC51NF9lbmFibGVfZmFzdF9zYWQgPSBtRW5hYmxlRmFzdFNhZDsKKyAgICBzX21lX3BhcmFtc19pcC51NF9lbmFibGVfYWx0X3JlZiA9IG1FbmFibGVBbHRSZWY7CisKKyAgICBzX21lX3BhcmFtc19pcC51NF9lbmFibGVfaHBlbCA9IG1IYWxmUGVsRW5hYmxlOworICAgIHNfbWVfcGFyYW1zX2lwLnU0X2VuYWJsZV9xcGVsID0gREVGQVVMVF9RUEVMOworICAgIHNfbWVfcGFyYW1zX2lwLnU0X21lX3NwZWVkX3ByZXNldCA9IERFRkFVTFRfTUVfU1BFRUQ7CisgICAgc19tZV9wYXJhbXNfaXAudTRfc3JjaF9ybmdfeCA9IERFRkFVTFRfU1JDSF9STkdfWDsKKyAgICBzX21lX3BhcmFtc19pcC51NF9zcmNoX3JuZ195ID0gREVGQVVMVF9TUkNIX1JOR19ZOworCisgICAgc19tZV9wYXJhbXNfaXAudTRfdGltZXN0YW1wX2hpZ2ggPSAtMTsKKyAgICBzX21lX3BhcmFtc19pcC51NF90aW1lc3RhbXBfbG93ID0gLTE7CisKKyAgICBzX21lX3BhcmFtc19pcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X21lX3BhcmFtc19pcF90KTsKKyAgICBzX21lX3BhcmFtc19vcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X21lX3BhcmFtc19vcF90KTsKKworICAgIHN0YXR1cyA9IGl2ZV9hcGlfZnVuY3Rpb24obUNvZGVjQ3R4LCAmc19tZV9wYXJhbXNfaXAsICZzX21lX3BhcmFtc19vcCk7CisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gc2V0IG1lIHBhcmFtcyA9IDB4JXhcbiIsIHNfbWVfcGFyYW1zX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEF2Y0VuYzo6c2V0R29wUGFyYW1zKCkgeworICAgIElWX1NUQVRVU19UIHN0YXR1czsKKyAgICBpdmVfY3RsX3NldF9nb3BfcGFyYW1zX2lwX3Qgc19nb3BfcGFyYW1zX2lwOworICAgIGl2ZV9jdGxfc2V0X2dvcF9wYXJhbXNfb3BfdCBzX2dvcF9wYXJhbXNfb3A7CisKKyAgICBzX2dvcF9wYXJhbXNfaXAuZV9jbWQgPSBJVkVfQ01EX1ZJREVPX0NUTDsKKyAgICBzX2dvcF9wYXJhbXNfaXAuZV9zdWJfY21kID0gSVZFX0NNRF9DVExfU0VUX0dPUF9QQVJBTVM7CisKKyAgICBzX2dvcF9wYXJhbXNfaXAudTRfaV9mcm1faW50ZXJ2YWwgPSBtSUludGVydmFsOworICAgIHNfZ29wX3BhcmFtc19pcC51NF9pZHJfZnJtX2ludGVydmFsID0gbUlEUkludGVydmFsOworCisgICAgc19nb3BfcGFyYW1zX2lwLnU0X3RpbWVzdGFtcF9oaWdoID0gLTE7CisgICAgc19nb3BfcGFyYW1zX2lwLnU0X3RpbWVzdGFtcF9sb3cgPSAtMTsKKworICAgIHNfZ29wX3BhcmFtc19pcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X2dvcF9wYXJhbXNfaXBfdCk7CisgICAgc19nb3BfcGFyYW1zX29wLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfZ29wX3BhcmFtc19vcF90KTsKKworICAgIHN0YXR1cyA9IGl2ZV9hcGlfZnVuY3Rpb24obUNvZGVjQ3R4LCAmc19nb3BfcGFyYW1zX2lwLCAmc19nb3BfcGFyYW1zX29wKTsKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBzZXQgR09QIHBhcmFtcyA9IDB4JXhcbiIsCisgICAgICAgICAgICAgICAgc19nb3BfcGFyYW1zX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEF2Y0VuYzo6c2V0UHJvZmlsZVBhcmFtcygpIHsKKyAgICBJbnRmSW1wbDo6TG9jayBsb2NrID0gbUludGYtPmxvY2soKTsKKworICAgIElWX1NUQVRVU19UIHN0YXR1czsKKyAgICBpdmVfY3RsX3NldF9wcm9maWxlX3BhcmFtc19pcF90IHNfcHJvZmlsZV9wYXJhbXNfaXA7CisgICAgaXZlX2N0bF9zZXRfcHJvZmlsZV9wYXJhbXNfb3BfdCBzX3Byb2ZpbGVfcGFyYW1zX29wOworCisgICAgc19wcm9maWxlX3BhcmFtc19pcC5lX2NtZCA9IElWRV9DTURfVklERU9fQ1RMOworICAgIHNfcHJvZmlsZV9wYXJhbXNfaXAuZV9zdWJfY21kID0gSVZFX0NNRF9DVExfU0VUX1BST0ZJTEVfUEFSQU1TOworCisgICAgc19wcm9maWxlX3BhcmFtc19pcC5lX3Byb2ZpbGUgPSBtSW50Zi0+Z2V0UHJvZmlsZV9sKCk7CisgICAgc19wcm9maWxlX3BhcmFtc19pcC51NF9lbnRyb3B5X2NvZGluZ19tb2RlID0gbUVudHJvcHlNb2RlOworICAgIHNfcHJvZmlsZV9wYXJhbXNfaXAudTRfdGltZXN0YW1wX2hpZ2ggPSAtMTsKKyAgICBzX3Byb2ZpbGVfcGFyYW1zX2lwLnU0X3RpbWVzdGFtcF9sb3cgPSAtMTsKKworICAgIHNfcHJvZmlsZV9wYXJhbXNfaXAudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX3NldF9wcm9maWxlX3BhcmFtc19pcF90KTsKKyAgICBzX3Byb2ZpbGVfcGFyYW1zX29wLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfcHJvZmlsZV9wYXJhbXNfb3BfdCk7CisgICAgbG9jay51bmxvY2soKTsKKworICAgIHN0YXR1cyA9IGl2ZV9hcGlfZnVuY3Rpb24obUNvZGVjQ3R4LCAmc19wcm9maWxlX3BhcmFtc19pcCwgJnNfcHJvZmlsZV9wYXJhbXNfb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIHNldCBwcm9maWxlIHBhcmFtcyA9IDB4JXhcbiIsCisgICAgICAgICAgICAgICAgc19wcm9maWxlX3BhcmFtc19vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBdmNFbmM6OnNldERlYmxvY2tQYXJhbXMoKSB7CisgICAgSVZfU1RBVFVTX1Qgc3RhdHVzOworICAgIGl2ZV9jdGxfc2V0X2RlYmxvY2tfcGFyYW1zX2lwX3Qgc19kZWJsb2NrX3BhcmFtc19pcDsKKyAgICBpdmVfY3RsX3NldF9kZWJsb2NrX3BhcmFtc19vcF90IHNfZGVibG9ja19wYXJhbXNfb3A7CisKKyAgICBzX2RlYmxvY2tfcGFyYW1zX2lwLmVfY21kID0gSVZFX0NNRF9WSURFT19DVEw7CisgICAgc19kZWJsb2NrX3BhcmFtc19pcC5lX3N1Yl9jbWQgPSBJVkVfQ01EX0NUTF9TRVRfREVCTE9DS19QQVJBTVM7CisKKyAgICBzX2RlYmxvY2tfcGFyYW1zX2lwLnU0X2Rpc2FibGVfZGVibG9ja19sZXZlbCA9IG1EaXNhYmxlRGVibGtMZXZlbDsKKworICAgIHNfZGVibG9ja19wYXJhbXNfaXAudTRfdGltZXN0YW1wX2hpZ2ggPSAtMTsKKyAgICBzX2RlYmxvY2tfcGFyYW1zX2lwLnU0X3RpbWVzdGFtcF9sb3cgPSAtMTsKKworICAgIHNfZGVibG9ja19wYXJhbXNfaXAudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX3NldF9kZWJsb2NrX3BhcmFtc19pcF90KTsKKyAgICBzX2RlYmxvY2tfcGFyYW1zX29wLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfZGVibG9ja19wYXJhbXNfb3BfdCk7CisKKyAgICBzdGF0dXMgPSBpdmVfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgJnNfZGVibG9ja19wYXJhbXNfaXAsICZzX2RlYmxvY2tfcGFyYW1zX29wKTsKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBlbmFibGUvZGlzYWJsZSBkZWJsb2NrIHBhcmFtcyA9IDB4JXhcbiIsCisgICAgICAgICAgICAgICAgc19kZWJsb2NrX3BhcmFtc19vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisgICAgcmV0dXJuIEMyX09LOworfQorCit2b2lkIEMyU29mdEF2Y0VuYzo6bG9nVmVyc2lvbigpIHsKKyAgICBpdmVfY3RsX2dldHZlcnNpb25pbmZvX2lwX3Qgc19jdGxfaXA7CisgICAgaXZlX2N0bF9nZXR2ZXJzaW9uaW5mb19vcF90IHNfY3RsX29wOworICAgIFVXT1JEOCBhdTFfYnVmWzUxMl07CisgICAgSVZfU1RBVFVTX1Qgc3RhdHVzOworCisgICAgc19jdGxfaXAuZV9jbWQgPSBJVkVfQ01EX1ZJREVPX0NUTDsKKyAgICBzX2N0bF9pcC5lX3N1Yl9jbWQgPSBJVkVfQ01EX0NUTF9HRVRWRVJTSU9OOworICAgIHNfY3RsX2lwLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9nZXR2ZXJzaW9uaW5mb19pcF90KTsKKyAgICBzX2N0bF9vcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfZ2V0dmVyc2lvbmluZm9fb3BfdCk7CisgICAgc19jdGxfaXAucHUxX3ZlcnNpb24gPSBhdTFfYnVmOworICAgIHNfY3RsX2lwLnU0X3ZlcnNpb25fYnVmc2l6ZSA9IHNpemVvZihhdTFfYnVmKTsKKworICAgIHN0YXR1cyA9IGl2ZV9hcGlfZnVuY3Rpb24obUNvZGVjQ3R4LCAodm9pZCAqKSAmc19jdGxfaXAsICh2b2lkICopICZzX2N0bF9vcCk7CisKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0UoIkVycm9yIGluIGdldHRpbmcgdmVyc2lvbjogMHgleCIsIHNfY3RsX29wLnU0X2Vycm9yX2NvZGUpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dWKCJJdHRpYW0gZW5jb2RlciB2ZXJzaW9uOiAlcyIsIChjaGFyICopc19jdGxfaXAucHUxX3ZlcnNpb24pOworICAgIH0KKyAgICByZXR1cm47Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEF2Y0VuYzo6aW5pdEVuY29kZXIoKSB7CisgICAgSVZfU1RBVFVTX1Qgc3RhdHVzOworICAgIFdPUkQzMiBsZXZlbDsKKworICAgIENIRUNLKCFtU3RhcnRlZCk7CisKKyAgICBjMl9zdGF0dXNfdCBlcnJUeXBlID0gQzJfT0s7CisKKyAgICB7CisgICAgICAgIEludGZJbXBsOjpMb2NrIGxvY2sgPSBtSW50Zi0+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+IG1CaXRyYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVJlcXVlc3RTeW5jRnJhbWVUdW5pbmc6Om91dHB1dD4gbVJlcXVlc3RTeW5jOworCisgICAgdWludDMyX3QgbU91dEJ1ZmZlclNpemU7CisgICAgVVdPUkQzMiBtSGVhZGVyR2VuZXJhdGVkOworICAgIFVXT1JEMzIgbUJmcmFtZXM7CisgICAgSVZfQVJDSF9UIG1BcmNoOworICAgIElWRV9TTElDRV9NT0RFX1QgbVNsaWNlTW9kZTsKKyAgICBVV09SRDMyIG1TbGljZVBhcmFtOworICAgIGJvb2wgbUhhbGZQZWxFbmFibGU7CisgICAgVVdPUkQzMiBtSUludGVydmFsOworICAgIFVXT1JEMzIgbUlEUkludGVydmFsOworICAgIFVXT1JEMzIgbURpc2FibGVEZWJsa0xldmVsOworICAgIHN0ZDo6bWFwPGNvbnN0IHZvaWQgKiwgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPj4gbUJ1ZmZlcnM7CisgICAgTWVtb3J5QmxvY2tQb29sIG1Db252ZXJzaW9uQnVmZmVyczsKKyAgICBzdGQ6Om1hcDxjb25zdCB2b2lkICosIE1lbW9yeUJsb2NrPiBtQ29udmVyc2lvbkJ1ZmZlcnNJblVzZTsKKworICAgIHZvaWQgaW5pdEVuY1BhcmFtcygpOworICAgIGMyX3N0YXR1c190IGluaXRFbmNvZGVyKCk7CisgICAgYzJfc3RhdHVzX3QgcmVsZWFzZUVuY29kZXIoKTsKKworICAgIGMyX3N0YXR1c190IHNldEZyYW1lVHlwZShJVl9QSUNUVVJFX0NPRElOR19UWVBFX1QgIGVfZnJhbWVfdHlwZSk7CisgICAgYzJfc3RhdHVzX3Qgc2V0UXAoKTsKKyAgICBjMl9zdGF0dXNfdCBzZXRFbmNNb2RlKElWRV9FTkNfTU9ERV9UIGVfZW5jX21vZGUpOworICAgIGMyX3N0YXR1c190IHNldERpbWVuc2lvbnMoKTsKKyAgICBjMl9zdGF0dXNfdCBzZXROdW1Db3JlcygpOworICAgIGMyX3N0YXR1c190IHNldEZyYW1lUmF0ZSgpOworICAgIGMyX3N0YXR1c190IHNldElwZVBhcmFtcygpOworICAgIGMyX3N0YXR1c190IHNldEJpdFJhdGUoKTsKKyAgICBjMl9zdGF0dXNfdCBzZXRBaXJQYXJhbXMoKTsKKyAgICBjMl9zdGF0dXNfdCBzZXRNZVBhcmFtcygpOworICAgIGMyX3N0YXR1c190IHNldEdvcFBhcmFtcygpOworICAgIGMyX3N0YXR1c190IHNldFByb2ZpbGVQYXJhbXMoKTsKKyAgICBjMl9zdGF0dXNfdCBzZXREZWJsb2NrUGFyYW1zKCk7CisgICAgYzJfc3RhdHVzX3Qgc2V0VmJ2UGFyYW1zKCk7CisgICAgdm9pZCBsb2dWZXJzaW9uKCk7CisgICAgYzJfc3RhdHVzX3Qgc2V0RW5jb2RlQXJncygKKyAgICAgICAgICAgIGl2ZV92aWRlb19lbmNvZGVfaXBfdCAqcHNfZW5jb2RlX2lwLAorICAgICAgICAgICAgaXZlX3ZpZGVvX2VuY29kZV9vcF90ICpwc19lbmNvZGVfb3AsCisgICAgICAgICAgICBjb25zdCBDMkdyYXBoaWNWaWV3ICpjb25zdCBpbnB1dCwKKyAgICAgICAgICAgIHVpbnQ4X3QgKmJhc2UsCisgICAgICAgICAgICB1aW50MzJfdCBjYXBhY2l0eSwKKyAgICAgICAgICAgIHVpbnQ2NF90IHRpbWVzdGFtcCk7CisKKyAgICBDMl9ET19OT1RfQ09QWShDMlNvZnRBdmNFbmMpOworfTsKKworI2lmZGVmIEZJTEVfRFVNUF9FTkFCTEUKKworI2RlZmluZSBJTlBVVF9EVU1QX1BBVEggICAgICIvc2RjYXJkL21lZGlhL2F2Y2VfaW5wdXQiCisjZGVmaW5lIElOUFVUX0RVTVBfRVhUICAgICAgInl1diIKKyNkZWZpbmUgT1VUUFVUX0RVTVBfUEFUSCAgICAiL3NkY2FyZC9tZWRpYS9hdmNlX291dHB1dCIKKyNkZWZpbmUgT1VUUFVUX0RVTVBfRVhUICAgICAiaDI2NCIKKworI2RlZmluZSBHRU5FUkFURV9GSUxFX05BTUVTKCkgeyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgR0VUVElNRSgmbVRpbWVTdGFydCwgTlVMTCk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdHJjcHkobUluRmlsZSwgIiIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHNwcmludGYobUluRmlsZSwgIiVzXyVsZC4lbGQuJXMiLCBJTlBVVF9EVU1QX1BBVEgsICBcCisgICAgICAgICAgICBtVGltZVN0YXJ0LnR2X3NlYywgbVRpbWVTdGFydC50dl91c2VjLCAgICAgIFwKKyAgICAgICAgICAgIElOUFVUX0RVTVBfRVhUKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0cmNweShtT3V0RmlsZSwgIiIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3ByaW50ZihtT3V0RmlsZSwgIiVzXyVsZC4lbGQuJXMiLCBPVVRQVVRfRFVNUF9QQVRILFwKKyAgICAgICAgICAgIG1UaW1lU3RhcnQudHZfc2VjLCBtVGltZVN0YXJ0LnR2X3VzZWMsICAgICAgXAorICAgICAgICAgICAgT1VUUFVUX0RVTVBfRVhUKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgQ1JFQVRFX0RVTVBfRklMRShtX2ZpbGVuYW1lKSB7ICAgICAgICAgICAgICAgICAgXAorICAgIEZJTEUgKmZwID0gZm9wZW4obV9maWxlbmFtZSwgIndiIik7ICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGZwICE9IE5VTEwpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQUxPR0QoIk9wZW5lZCBmaWxlICVzIiwgbV9maWxlbmFtZSk7ICAgICAgICAgICAgXAorICAgICAgICBmY2xvc2UoZnApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQUxPR0QoIkNvdWxkIG5vdCBvcGVuIGZpbGUgJXMiLCBtX2ZpbGVuYW1lKTsgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisjZGVmaW5lIERVTVBfVE9fRklMRShtX2ZpbGVuYW1lLCBtX2J1ZiwgbV9zaXplKSAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEZJTEUgKmZwID0gZm9wZW4obV9maWxlbmFtZSwgImFiIik7ICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGZwICE9IE5VTEwgJiYgbV9idWYgIT0gTlVMTCkgeyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpID0gZndyaXRlKG1fYnVmLCAxLCBtX3NpemUsIGZwKTsgICAgICAgICAgICAgICBcCisgICAgICAgIEFMT0dEKCJmd3JpdGUgcmV0ICVkIHRvIHdyaXRlICVkIiwgaSwgbV9zaXplKTsgIFwKKyAgICAgICAgaWYgKGkgIT0gKGludCltX3NpemUpIHsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgQUxPR0QoIkVycm9yIGluIGZ3cml0ZSwgcmV0dXJuZWQgJWQiLCBpKTsgICBcCisgICAgICAgICAgICBwZXJyb3IoIkVycm9yIGluIHdyaXRlIHRvIGZpbGUiKTsgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmY2xvc2UoZnApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQUxPR0QoIkNvdWxkIG5vdCB3cml0ZSB0byBmaWxlICVzIiwgbV9maWxlbmFtZSk7XAorICAgICAgICBpZiAoZnAgIT0gTlVMTCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmY2xvc2UoZnApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorI2Vsc2UgLyogRklMRV9EVU1QX0VOQUJMRSAqLworI2RlZmluZSBJTlBVVF9EVU1QX1BBVEgKKyNkZWZpbmUgSU5QVVRfRFVNUF9FWFQKKyNkZWZpbmUgT1VUUFVUX0RVTVBfUEFUSAorI2RlZmluZSBPVVRQVVRfRFVNUF9FWFQKKyNkZWZpbmUgR0VORVJBVEVfRklMRV9OQU1FUygpCisjZGVmaW5lIENSRUFURV9EVU1QX0ZJTEUobV9maWxlbmFtZSkKKyNkZWZpbmUgRFVNUF9UT19GSUxFKG1fZmlsZW5hbWUsIG1fYnVmLCBtX3NpemUpCisjZW5kaWYgLyogRklMRV9EVU1QX0VOQUJMRSAqLworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfQzJfU09GVF9BVkNfRU5DX0hfXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYmFzZS9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYmFzZS9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2YmI4MWEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9iYXNlL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwxNDEgQEAKKy8vIERPIE5PVCBERVBFTkQgT04gVEhJUyBESVJFQ1RMWQorLy8gdXNlIGxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIGluc3RlYWQKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfY29tbW9uIiwKKyAgICBkZWZhdWx0czogWyJsaWJjb2RlYzItaW1wbC1kZWZhdWx0cyJdLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJTaW1wbGVDMkNvbXBvbmVudC5jcHAiLAorICAgICAgICAiU2ltcGxlQzJJbnRlcmZhY2UuY3BwIiwKKyAgICBdLAorCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW5jbHVkZSIsCisgICAgXSwKKworICAgIGV4cG9ydF9zaGFyZWRfbGliX2hlYWRlcnM6IFsKKyAgICAgICAgImxpYnNmcGx1Z2luX2Njb2RlY191dGlscyIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJjdXRpbHMiLCAvLyBmb3IgcHJvcGVydGllcworICAgICAgICAibGlibG9nIiwgICAgLy8gZm9yIEFMT0cKKyAgICAgICAgImxpYnNmcGx1Z2luX2Njb2RlY191dGlscyIsIC8vIGZvciBJbWFnZUNvcHkKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLCAvLyBmb3IgTXV0ZXhlZAorICAgIF0sCisKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBtaXNjX3VuZGVmaW5lZDogWworICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgXSwKKyAgICAgICAgY2ZpOiB0cnVlLAorICAgICAgICBkaWFnOiB7CisgICAgICAgICAgICBjZmk6IHRydWUsCisgICAgICAgIH0sCisgICAgfSwKKworICAgIGxkZmxhZ3M6IFsiLVdsLC1Cc3ltYm9saWMiXSwKK30KKworLy8gcHVibGljIGRlcGVuZGVuY3kgZm9yIHNvZnR3YXJlIGNvZGVjIGltcGxlbWVudGF0aW9uCisvLyB0byBiZSB1c2VkIGJ5IGNvZGUgdW5kZXIgbWVkaWEvY29kZWNzLyogb25seSBhcyBpdHMgc3RhYmlsaXR5IGlzIG5vdCBndWFyYW50ZWVkCitjY19kZWZhdWx0cyB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKKyAgICBkZWZhdWx0czogWyJsaWJjb2RlYzItaW1wbC1kZWZhdWx0cyJdLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisKKyAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbCisgICAgICAgICJsaWJzZnBsdWdpbl9jY29kZWNfdXRpbHMiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliY29kZWMyX3NvZnRfY29tbW9uIiwKKyAgICAgICAgImxpYmN1dGlscyIsIC8vIGZvciBwcm9wZXJ0aWVzCisgICAgICAgICJsaWJsb2ciLCAvLyBmb3IgQUxPRworICAgICAgICAibGlic2ZwbHVnaW5fY2NvZGVjX3V0aWxzIiwgLy8gZm9yIEltYWdlQ29weQorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsIC8vIGZvciBDb2xvclV0aWxzIGFuZCBNSU1FCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgXSwKKworICAgIGxkZmxhZ3M6IFsiLVdsLC1Cc3ltYm9saWMiXSwKK30KKworLy8gcHVibGljIGRlcGVuZGVuY3kgZm9yIHNvZnR3YXJlIGNvZGVjIGltcGxlbWVudGF0aW9uCisvLyB0byBiZSB1c2VkIGJ5IGNvZGUgdW5kZXIgbWVkaWEvY29kZWNzLyogb25seQorY2NfZGVmYXVsdHMgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9hbGwtZGVmYXVsdHMiLAorCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKKyAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgIF0sCisgICAgICAgIGNmaTogdHJ1ZSwKKyAgICAgICAgZGlhZzogeworICAgICAgICAgICAgY2ZpOiB0cnVlLAorICAgICAgICB9LAorICAgIH0sCit9CisKKy8vIHB1YmxpYyBkZXBlbmRlbmN5IGZvciBzb2Z0d2FyZSBjb2RlYyBpbXBsZW1lbnRhdGlvbgorLy8gdG8gYmUgdXNlZCBieSBjb2RlIHVuZGVyIG1lZGlhL2NvZGVjcy8qIG9ubHkKK2NjX2RlZmF1bHRzIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfc2FuaXRpemVfc2lnbmVkLWRlZmF1bHRzIiwKKworICAgIHNhbml0aXplOiB7CisgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCisgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICBdLAorICAgICAgICBjZmk6IHRydWUsCisgICAgICAgIGRpYWc6IHsKKyAgICAgICAgICAgIGNmaTogdHJ1ZSwKKyAgICAgICAgfSwKKyAgICB9LAorfQorCisvLyBURU1QOiB1c2VkIGJ5IGNoZWV0czIgcHJvamVjdCAtIHJlbW92ZSB3aGVuIG5vIGxvbmdlciB1c2VkCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zaW1wbGVfY29tcG9uZW50IiwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorCisgICAgc3JjczogWworICAgICAgICAiU2ltcGxlQzJJbnRlcmZhY2UuY3BwIiwKKyAgICBdLAorCisgICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJpbmNsdWRlIiwKKyAgICBdLAorCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW5jbHVkZSIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJjb2RlYzIiLAorICAgICAgICAibGliY29kZWMyX3ZuZGsiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKKyAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgIF0sCisgICAgICAgIGNmaTogdHJ1ZSwKKyAgICAgICAgZGlhZzogeworICAgICAgICAgICAgY2ZpOiB0cnVlLAorICAgICAgICB9LAorICAgIH0sCisKKyAgICBsZGZsYWdzOiBbIi1XbCwtQnN5bWJvbGljIl0sCit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Jhc2UvU2ltcGxlQzJDb21wb25lbnQuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYmFzZS9TaW1wbGVDMkNvbXBvbmVudC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk5MGVlNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Jhc2UvU2ltcGxlQzJDb21wb25lbnQuY3BwCkBAIC0wLDAgKzEsNTYyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJTaW1wbGVDMkNvbXBvbmVudCIKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisKKyNpbmNsdWRlIDxDMkNvbmZpZy5oPgorI2luY2x1ZGUgPEMyRGVidWcuaD4KKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPFNpbXBsZUMyQ29tcG9uZW50Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gU2ltcGxlQzJDb21wb25lbnQ6OldvcmtRdWV1ZTo6cG9wX2Zyb250KCkgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+IHdvcmsgPSBzdGQ6Om1vdmUobVF1ZXVlLmZyb250KCkud29yayk7CisgICAgbVF1ZXVlLnBvcF9mcm9udCgpOworICAgIHJldHVybiB3b3JrOworfQorCit2b2lkIFNpbXBsZUMyQ29tcG9uZW50OjpXb3JrUXVldWU6OnB1c2hfYmFjayhzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB3b3JrKSB7CisgICAgbVF1ZXVlLnB1c2hfYmFjayh7IHN0ZDo6bW92ZSh3b3JrKSwgTk9fRFJBSU4gfSk7Cit9CisKK2Jvb2wgU2ltcGxlQzJDb21wb25lbnQ6OldvcmtRdWV1ZTo6ZW1wdHkoKSBjb25zdCB7CisgICAgcmV0dXJuIG1RdWV1ZS5lbXB0eSgpOworfQorCit2b2lkIFNpbXBsZUMyQ29tcG9uZW50OjpXb3JrUXVldWU6OmNsZWFyKCkgeworICAgIG1RdWV1ZS5jbGVhcigpOworfQorCit1aW50MzJfdCBTaW1wbGVDMkNvbXBvbmVudDo6V29ya1F1ZXVlOjpkcmFpbk1vZGUoKSBjb25zdCB7CisgICAgcmV0dXJuIG1RdWV1ZS5mcm9udCgpLmRyYWluTW9kZTsKK30KKwordm9pZCBTaW1wbGVDMkNvbXBvbmVudDo6V29ya1F1ZXVlOjptYXJrRHJhaW4odWludDMyX3QgZHJhaW5Nb2RlKSB7CisgICAgbVF1ZXVlLnB1c2hfYmFjayh7IG51bGxwdHIsIGRyYWluTW9kZSB9KTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworU2ltcGxlQzJDb21wb25lbnQ6OldvcmtIYW5kbGVyOjpXb3JrSGFuZGxlcigpIDogbVJ1bm5pbmcoZmFsc2UpIHt9CisKK3ZvaWQgU2ltcGxlQzJDb21wb25lbnQ6OldvcmtIYW5kbGVyOjpzZXRDb21wb25lbnQoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxTaW1wbGVDMkNvbXBvbmVudD4gJnRoaXopIHsKKyAgICBtVGhpeiA9IHRoaXo7Cit9CisKK3N0YXRpYyB2b2lkIFJlcGx5KGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnLCBpbnQzMl90ICplcnIgPSBudWxscHRyKSB7CisgICAgc3A8QVJlcGx5VG9rZW4+IHJlcGx5SWQ7CisgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJZCkpOworICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG5ldyBBTWVzc2FnZTsKKyAgICBpZiAoZXJyKSB7CisgICAgICAgIHJlcGx5LT5zZXRJbnQzMigiZXJyIiwgKmVycik7CisgICAgfQorICAgIHJlcGx5LT5wb3N0UmVwbHkocmVwbHlJZCk7Cit9CisKK3ZvaWQgU2ltcGxlQzJDb21wb25lbnQ6OldvcmtIYW5kbGVyOjpvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxTaW1wbGVDMkNvbXBvbmVudD4gdGhpeiA9IG1UaGl6LmxvY2soKTsKKyAgICBpZiAoIXRoaXopIHsKKyAgICAgICAgQUxPR0QoImNvbXBvbmVudCBub3QgeWV0IHNldDsgbXNnID0gJXMiLCBtc2ctPmRlYnVnU3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgIHNwPEFSZXBseVRva2VuPiByZXBseUlkOworICAgICAgICBpZiAobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJZCkpIHsKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG5ldyBBTWVzc2FnZTsKKyAgICAgICAgICAgIHJlcGx5LT5zZXRJbnQzMigiZXJyIiwgQzJfQ09SUlVQVEVEKTsKKyAgICAgICAgICAgIHJlcGx5LT5wb3N0UmVwbHkocmVwbHlJZCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHN3aXRjaCAobXNnLT53aGF0KCkpIHsKKyAgICAgICAgY2FzZSBrV2hhdFByb2Nlc3M6IHsKKyAgICAgICAgICAgIGlmIChtUnVubmluZykgeworICAgICAgICAgICAgICAgIGlmICh0aGl6LT5wcm9jZXNzUXVldWUoKSkgeworICAgICAgICAgICAgICAgICAgICAobmV3IEFNZXNzYWdlKGtXaGF0UHJvY2VzcywgdGhpcykpLT5wb3N0KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiSWdub3JlIHByb2Nlc3MgbWVzc2FnZSBhcyB3ZSdyZSBub3QgcnVubmluZyIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBrV2hhdEluaXQ6IHsKKyAgICAgICAgICAgIGludDMyX3QgZXJyID0gdGhpei0+b25Jbml0KCk7CisgICAgICAgICAgICBSZXBseShtc2csICZlcnIpOworICAgICAgICAgICAgW1tmYWxsdGhyb3VnaF1dOworICAgICAgICB9CisgICAgICAgIGNhc2Uga1doYXRTdGFydDogeworICAgICAgICAgICAgbVJ1bm5pbmcgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBrV2hhdFN0b3A6IHsKKyAgICAgICAgICAgIGludDMyX3QgZXJyID0gdGhpei0+b25TdG9wKCk7CisgICAgICAgICAgICBSZXBseShtc2csICZlcnIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBrV2hhdFJlc2V0OiB7CisgICAgICAgICAgICB0aGl6LT5vblJlc2V0KCk7CisgICAgICAgICAgICBtUnVubmluZyA9IGZhbHNlOworICAgICAgICAgICAgUmVwbHkobXNnKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2Uga1doYXRSZWxlYXNlOiB7CisgICAgICAgICAgICB0aGl6LT5vblJlbGVhc2UoKTsKKyAgICAgICAgICAgIG1SdW5uaW5nID0gZmFsc2U7CisgICAgICAgICAgICBSZXBseShtc2cpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDogeworICAgICAgICAgICAgQUxPR0QoIlVucmVjb2duaXplZCBtc2c6ICVkIiwgbXNnLT53aGF0KCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK25hbWVzcGFjZSB7CisKK3N0cnVjdCBEdW1teVJlYWRWaWV3IDogcHVibGljIEMyUmVhZFZpZXcgeworICAgIER1bW15UmVhZFZpZXcoKSA6IEMyUmVhZFZpZXcoQzJfTk9fSU5JVCkge30KK307CisKK30gIC8vIG5hbWVzcGFjZQorCitTaW1wbGVDMkNvbXBvbmVudDo6U2ltcGxlQzJDb21wb25lbnQoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gJmludGYpCisgICAgOiBtRHVtbXlSZWFkVmlldyhEdW1teVJlYWRWaWV3KCkpLAorICAgICAgbUludGYoaW50ZiksCisgICAgICBtTG9vcGVyKG5ldyBBTG9vcGVyKSwKKyAgICAgIG1IYW5kbGVyKG5ldyBXb3JrSGFuZGxlcikgeworICAgIG1Mb29wZXItPnNldE5hbWUoaW50Zi0+Z2V0TmFtZSgpLmNfc3RyKCkpOworICAgICh2b2lkKW1Mb29wZXItPnJlZ2lzdGVySGFuZGxlcihtSGFuZGxlcik7CisgICAgbUxvb3Blci0+c3RhcnQoZmFsc2UsIGZhbHNlLCBBTkRST0lEX1BSSU9SSVRZX1ZJREVPKTsKK30KKworU2ltcGxlQzJDb21wb25lbnQ6On5TaW1wbGVDMkNvbXBvbmVudCgpIHsKKyAgICBtTG9vcGVyLT51bnJlZ2lzdGVySGFuZGxlcihtSGFuZGxlci0+aWQoKSk7CisgICAgKHZvaWQpbUxvb3Blci0+c3RvcCgpOworfQorCitjMl9zdGF0dXNfdCBTaW1wbGVDMkNvbXBvbmVudDo6c2V0TGlzdGVuZXJfdmIoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudDo6TGlzdGVuZXI+ICZsaXN0ZW5lciwgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaykgeworICAgIG1IYW5kbGVyLT5zZXRDb21wb25lbnQoc2hhcmVkX2Zyb21fdGhpcygpKTsKKworICAgIE11dGV4ZWQ8RXhlY1N0YXRlPjo6TG9ja2VkIHN0YXRlKG1FeGVjU3RhdGUpOworICAgIGlmIChzdGF0ZS0+bVN0YXRlID09IFJVTk5JTkcpIHsKKyAgICAgICAgaWYgKGxpc3RlbmVyKSB7CisgICAgICAgICAgICByZXR1cm4gQzJfQkFEX1NUQVRFOworICAgICAgICB9IGVsc2UgaWYgKCFtYXlCbG9jaykgeworICAgICAgICAgICAgcmV0dXJuIEMyX0JMT0NLSU5HOworICAgICAgICB9CisgICAgfQorICAgIHN0YXRlLT5tTGlzdGVuZXIgPSBsaXN0ZW5lcjsKKyAgICAvLyBUT0RPOiB3YWl0IGZvciBsaXN0ZW5lciBjaGFuZ2UgdG8gaGF2ZSB0YWtlbiBwbGFjZSBiZWZvcmUgcmV0dXJuaW5nCisgICAgLy8gKGUuZy4gaWYgdGhlcmUgaXMgYW4gb25nb2luZyBsaXN0ZW5lciBjYWxsYmFjaykKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IFNpbXBsZUMyQ29tcG9uZW50OjpxdWV1ZV9uYihzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+ICogY29uc3QgaXRlbXMpIHsKKyAgICB7CisgICAgICAgIE11dGV4ZWQ8RXhlY1N0YXRlPjo6TG9ja2VkIHN0YXRlKG1FeGVjU3RhdGUpOworICAgICAgICBpZiAoc3RhdGUtPm1TdGF0ZSAhPSBSVU5OSU5HKSB7CisgICAgICAgICAgICByZXR1cm4gQzJfQkFEX1NUQVRFOworICAgICAgICB9CisgICAgfQorICAgIGJvb2wgcXVldWVXYXNFbXB0eSA9IGZhbHNlOworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxXb3JrUXVldWU+OjpMb2NrZWQgcXVldWUobVdvcmtRdWV1ZSk7CisgICAgICAgIHF1ZXVlV2FzRW1wdHkgPSBxdWV1ZS0+ZW1wdHkoKTsKKyAgICAgICAgd2hpbGUgKCFpdGVtcy0+ZW1wdHkoKSkgeworICAgICAgICAgICAgcXVldWUtPnB1c2hfYmFjayhzdGQ6Om1vdmUoaXRlbXMtPmZyb250KCkpKTsKKyAgICAgICAgICAgIGl0ZW1zLT5wb3BfZnJvbnQoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAocXVldWVXYXNFbXB0eSkgeworICAgICAgICAobmV3IEFNZXNzYWdlKFdvcmtIYW5kbGVyOjprV2hhdFByb2Nlc3MsIG1IYW5kbGVyKSktPnBvc3QoKTsKKyAgICB9CisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBTaW1wbGVDMkNvbXBvbmVudDo6YW5ub3VuY2VfbmIoY29uc3Qgc3RkOjp2ZWN0b3I8QzJXb3JrT3V0bGluZT4gJml0ZW1zKSB7CisgICAgKHZvaWQpaXRlbXM7CisgICAgcmV0dXJuIEMyX09NSVRURUQ7Cit9CisKK2MyX3N0YXR1c190IFNpbXBsZUMyQ29tcG9uZW50OjpmbHVzaF9zbSgKKyAgICAgICAgZmx1c2hfbW9kZV90IGZsdXNoTW9kZSwgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiogY29uc3QgZmx1c2hlZFdvcmspIHsKKyAgICAodm9pZClmbHVzaE1vZGU7CisgICAgeworICAgICAgICBNdXRleGVkPEV4ZWNTdGF0ZT46OkxvY2tlZCBzdGF0ZShtRXhlY1N0YXRlKTsKKyAgICAgICAgaWYgKHN0YXRlLT5tU3RhdGUgIT0gUlVOTklORykgeworICAgICAgICAgICAgcmV0dXJuIEMyX0JBRF9TVEFURTsKKyAgICAgICAgfQorICAgIH0KKyAgICB7CisgICAgICAgIE11dGV4ZWQ8V29ya1F1ZXVlPjo6TG9ja2VkIHF1ZXVlKG1Xb3JrUXVldWUpOworICAgICAgICBxdWV1ZS0+aW5jR2VuZXJhdGlvbigpOworICAgICAgICAvLyBUT0RPOiBxdWV1ZS0+c3BsaWNlZEJ5KGZsdXNoZWRXb3JrLCBmbHVzaGVkV29yay0+ZW5kKCkpOworICAgICAgICB3aGlsZSAoIXF1ZXVlLT5lbXB0eSgpKSB7CisgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB3b3JrID0gcXVldWUtPnBvcF9mcm9udCgpOworICAgICAgICAgICAgaWYgKHdvcmspIHsKKyAgICAgICAgICAgICAgICBmbHVzaGVkV29yay0+cHVzaF9iYWNrKHN0ZDo6bW92ZSh3b3JrKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgeworICAgICAgICBNdXRleGVkPFBlbmRpbmdXb3JrPjo6TG9ja2VkIHBlbmRpbmcobVBlbmRpbmdXb3JrKTsKKyAgICAgICAgd2hpbGUgKCFwZW5kaW5nLT5lbXB0eSgpKSB7CisgICAgICAgICAgICBmbHVzaGVkV29yay0+cHVzaF9iYWNrKHN0ZDo6bW92ZShwZW5kaW5nLT5iZWdpbigpLT5zZWNvbmQpKTsKKyAgICAgICAgICAgIHBlbmRpbmctPmVyYXNlKHBlbmRpbmctPmJlZ2luKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBTaW1wbGVDMkNvbXBvbmVudDo6ZHJhaW5fbmIoZHJhaW5fbW9kZV90IGRyYWluTW9kZSkgeworICAgIGlmIChkcmFpbk1vZGUgPT0gRFJBSU5fQ0hBSU4pIHsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorICAgIHsKKyAgICAgICAgTXV0ZXhlZDxFeGVjU3RhdGU+OjpMb2NrZWQgc3RhdGUobUV4ZWNTdGF0ZSk7CisgICAgICAgIGlmIChzdGF0ZS0+bVN0YXRlICE9IFJVTk5JTkcpIHsKKyAgICAgICAgICAgIHJldHVybiBDMl9CQURfU1RBVEU7CisgICAgICAgIH0KKyAgICB9CisgICAgYm9vbCBxdWV1ZVdhc0VtcHR5ID0gZmFsc2U7CisgICAgeworICAgICAgICBNdXRleGVkPFdvcmtRdWV1ZT46OkxvY2tlZCBxdWV1ZShtV29ya1F1ZXVlKTsKKyAgICAgICAgcXVldWVXYXNFbXB0eSA9IHF1ZXVlLT5lbXB0eSgpOworICAgICAgICBxdWV1ZS0+bWFya0RyYWluKGRyYWluTW9kZSk7CisgICAgfQorICAgIGlmIChxdWV1ZVdhc0VtcHR5KSB7CisgICAgICAgIChuZXcgQU1lc3NhZ2UoV29ya0hhbmRsZXI6OmtXaGF0UHJvY2VzcywgbUhhbmRsZXIpKS0+cG9zdCgpOworICAgIH0KKworICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgU2ltcGxlQzJDb21wb25lbnQ6OnN0YXJ0KCkgeworICAgIE11dGV4ZWQ8RXhlY1N0YXRlPjo6TG9ja2VkIHN0YXRlKG1FeGVjU3RhdGUpOworICAgIGlmIChzdGF0ZS0+bVN0YXRlID09IFJVTk5JTkcpIHsKKyAgICAgICAgcmV0dXJuIEMyX0JBRF9TVEFURTsKKyAgICB9CisgICAgYm9vbCBuZWVkc0luaXQgPSAoc3RhdGUtPm1TdGF0ZSA9PSBVTklOSVRJQUxJWkVEKTsKKyAgICBzdGF0ZS51bmxvY2soKTsKKyAgICBpZiAobmVlZHNJbml0KSB7CisgICAgICAgIHNwPEFNZXNzYWdlPiByZXBseTsKKyAgICAgICAgKG5ldyBBTWVzc2FnZShXb3JrSGFuZGxlcjo6a1doYXRJbml0LCBtSGFuZGxlcikpLT5wb3N0QW5kQXdhaXRSZXNwb25zZSgmcmVwbHkpOworICAgICAgICBpbnQzMl90IGVycjsKKyAgICAgICAgQ0hFQ0socmVwbHktPmZpbmRJbnQzMigiZXJyIiwgJmVycikpOworICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICByZXR1cm4gKGMyX3N0YXR1c190KWVycjsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIChuZXcgQU1lc3NhZ2UoV29ya0hhbmRsZXI6OmtXaGF0U3RhcnQsIG1IYW5kbGVyKSktPnBvc3QoKTsKKyAgICB9CisgICAgc3RhdGUubG9jaygpOworICAgIHN0YXRlLT5tU3RhdGUgPSBSVU5OSU5HOworICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgU2ltcGxlQzJDb21wb25lbnQ6OnN0b3AoKSB7CisgICAgQUxPR1YoInN0b3AiKTsKKyAgICB7CisgICAgICAgIE11dGV4ZWQ8RXhlY1N0YXRlPjo6TG9ja2VkIHN0YXRlKG1FeGVjU3RhdGUpOworICAgICAgICBpZiAoc3RhdGUtPm1TdGF0ZSAhPSBSVU5OSU5HKSB7CisgICAgICAgICAgICByZXR1cm4gQzJfQkFEX1NUQVRFOworICAgICAgICB9CisgICAgICAgIHN0YXRlLT5tU3RhdGUgPSBTVE9QUEVEOworICAgIH0KKyAgICB7CisgICAgICAgIE11dGV4ZWQ8V29ya1F1ZXVlPjo6TG9ja2VkIHF1ZXVlKG1Xb3JrUXVldWUpOworICAgICAgICBxdWV1ZS0+Y2xlYXIoKTsKKyAgICB9CisgICAgeworICAgICAgICBNdXRleGVkPFBlbmRpbmdXb3JrPjo6TG9ja2VkIHBlbmRpbmcobVBlbmRpbmdXb3JrKTsKKyAgICAgICAgcGVuZGluZy0+Y2xlYXIoKTsKKyAgICB9CisgICAgc3A8QU1lc3NhZ2U+IHJlcGx5OworICAgIChuZXcgQU1lc3NhZ2UoV29ya0hhbmRsZXI6OmtXaGF0U3RvcCwgbUhhbmRsZXIpKS0+cG9zdEFuZEF3YWl0UmVzcG9uc2UoJnJlcGx5KTsKKyAgICBpbnQzMl90IGVycjsKKyAgICBDSEVDSyhyZXBseS0+ZmluZEludDMyKCJlcnIiLCAmZXJyKSk7CisgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICByZXR1cm4gKGMyX3N0YXR1c190KWVycjsKKyAgICB9CisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBTaW1wbGVDMkNvbXBvbmVudDo6cmVzZXQoKSB7CisgICAgQUxPR1YoInJlc2V0Iik7CisgICAgeworICAgICAgICBNdXRleGVkPEV4ZWNTdGF0ZT46OkxvY2tlZCBzdGF0ZShtRXhlY1N0YXRlKTsKKyAgICAgICAgc3RhdGUtPm1TdGF0ZSA9IFVOSU5JVElBTElaRUQ7CisgICAgfQorICAgIHsKKyAgICAgICAgTXV0ZXhlZDxXb3JrUXVldWU+OjpMb2NrZWQgcXVldWUobVdvcmtRdWV1ZSk7CisgICAgICAgIHF1ZXVlLT5jbGVhcigpOworICAgIH0KKyAgICB7CisgICAgICAgIE11dGV4ZWQ8UGVuZGluZ1dvcms+OjpMb2NrZWQgcGVuZGluZyhtUGVuZGluZ1dvcmspOworICAgICAgICBwZW5kaW5nLT5jbGVhcigpOworICAgIH0KKyAgICBzcDxBTWVzc2FnZT4gcmVwbHk7CisgICAgKG5ldyBBTWVzc2FnZShXb3JrSGFuZGxlcjo6a1doYXRSZXNldCwgbUhhbmRsZXIpKS0+cG9zdEFuZEF3YWl0UmVzcG9uc2UoJnJlcGx5KTsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IFNpbXBsZUMyQ29tcG9uZW50OjpyZWxlYXNlKCkgeworICAgIEFMT0dWKCJyZWxlYXNlIik7CisgICAgc3A8QU1lc3NhZ2U+IHJlcGx5OworICAgIChuZXcgQU1lc3NhZ2UoV29ya0hhbmRsZXI6OmtXaGF0UmVsZWFzZSwgbUhhbmRsZXIpKS0+cG9zdEFuZEF3YWl0UmVzcG9uc2UoJnJlcGx5KTsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gU2ltcGxlQzJDb21wb25lbnQ6OmludGYoKSB7CisgICAgcmV0dXJuIG1JbnRmOworfQorCituYW1lc3BhY2UgeworCitzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IHZlYyhzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykgeworICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gcmV0OworICAgIHJldC5wdXNoX2JhY2soc3RkOjptb3ZlKHdvcmspKTsKKyAgICByZXR1cm4gcmV0OworfQorCit9ICAvLyBuYW1lc3BhY2UKKwordm9pZCBTaW1wbGVDMkNvbXBvbmVudDo6ZmluaXNoKAorICAgICAgICB1aW50NjRfdCBmcmFtZUluZGV4LCBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJik+IGZpbGxXb3JrKSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gd29yazsKKyAgICB7CisgICAgICAgIE11dGV4ZWQ8UGVuZGluZ1dvcms+OjpMb2NrZWQgcGVuZGluZyhtUGVuZGluZ1dvcmspOworICAgICAgICBpZiAocGVuZGluZy0+Y291bnQoZnJhbWVJbmRleCkgPT0gMCkgeworICAgICAgICAgICAgQUxPR1coInVua25vd24gZnJhbWUgaW5kZXg6ICUiIFBSSXU2NCwgZnJhbWVJbmRleCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgd29yayA9IHN0ZDo6bW92ZShwZW5kaW5nLT5hdChmcmFtZUluZGV4KSk7CisgICAgICAgIHBlbmRpbmctPmVyYXNlKGZyYW1lSW5kZXgpOworICAgIH0KKyAgICBpZiAod29yaykgeworICAgICAgICBmaWxsV29yayh3b3JrKTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50OjpMaXN0ZW5lcj4gbGlzdGVuZXIgPSBtRXhlY1N0YXRlLmxvY2soKS0+bUxpc3RlbmVyOworICAgICAgICBsaXN0ZW5lci0+b25Xb3JrRG9uZV9uYihzaGFyZWRfZnJvbV90aGlzKCksIHZlYyh3b3JrKSk7CisgICAgICAgIEFMT0dWKCJyZXR1cm5pbmcgcGVuZGluZyB3b3JrIik7CisgICAgfQorfQorCit2b2lkIFNpbXBsZUMyQ29tcG9uZW50OjpjbG9uZUFuZFNlbmQoCisgICAgICAgIHVpbnQ2NF90IGZyYW1lSW5kZXgsCisgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZjdXJyZW50V29yaywKKyAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICYpPiBmaWxsV29yaykgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+IHdvcmsobmV3IEMyV29yayk7CisgICAgaWYgKGN1cnJlbnRXb3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXggPT0gZnJhbWVJbmRleCkgeworICAgICAgICB3b3JrLT5pbnB1dC5mbGFncyA9IGN1cnJlbnRXb3JrLT5pbnB1dC5mbGFnczsKKyAgICAgICAgd29yay0+aW5wdXQub3JkaW5hbCA9IGN1cnJlbnRXb3JrLT5pbnB1dC5vcmRpbmFsOworICAgIH0gZWxzZSB7CisgICAgICAgIE11dGV4ZWQ8UGVuZGluZ1dvcms+OjpMb2NrZWQgcGVuZGluZyhtUGVuZGluZ1dvcmspOworICAgICAgICBpZiAocGVuZGluZy0+Y291bnQoZnJhbWVJbmRleCkgPT0gMCkgeworICAgICAgICAgICAgQUxPR1coInVua25vd24gZnJhbWUgaW5kZXg6ICUiIFBSSXU2NCwgZnJhbWVJbmRleCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgd29yay0+aW5wdXQuZmxhZ3MgPSBwZW5kaW5nLT5hdChmcmFtZUluZGV4KS0+aW5wdXQuZmxhZ3M7CisgICAgICAgIHdvcmstPmlucHV0Lm9yZGluYWwgPSBwZW5kaW5nLT5hdChmcmFtZUluZGV4KS0+aW5wdXQub3JkaW5hbDsKKyAgICB9CisgICAgd29yay0+d29ya2xldHMuZW1wbGFjZV9iYWNrKG5ldyBDMldvcmtsZXQpOworICAgIGlmICh3b3JrKSB7CisgICAgICAgIGZpbGxXb3JrKHdvcmspOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ6Okxpc3RlbmVyPiBsaXN0ZW5lciA9IG1FeGVjU3RhdGUubG9jaygpLT5tTGlzdGVuZXI7CisgICAgICAgIGxpc3RlbmVyLT5vbldvcmtEb25lX25iKHNoYXJlZF9mcm9tX3RoaXMoKSwgdmVjKHdvcmspKTsKKyAgICAgICAgQUxPR1YoImNsb25lZCBhbmQgc2VuZGluZyB3b3JrIik7CisgICAgfQorfQorCitib29sIFNpbXBsZUMyQ29tcG9uZW50Ojpwcm9jZXNzUXVldWUoKSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gd29yazsKKyAgICB1aW50NjRfdCBnZW5lcmF0aW9uOworICAgIGludDMyX3QgZHJhaW5Nb2RlOworICAgIGJvb2wgaXNGbHVzaFBlbmRpbmcgPSBmYWxzZTsKKyAgICBib29sIGhhc1F1ZXVlZFdvcmsgPSBmYWxzZTsKKyAgICB7CisgICAgICAgIE11dGV4ZWQ8V29ya1F1ZXVlPjo6TG9ja2VkIHF1ZXVlKG1Xb3JrUXVldWUpOworICAgICAgICBpZiAocXVldWUtPmVtcHR5KCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGdlbmVyYXRpb24gPSBxdWV1ZS0+Z2VuZXJhdGlvbigpOworICAgICAgICBkcmFpbk1vZGUgPSBxdWV1ZS0+ZHJhaW5Nb2RlKCk7CisgICAgICAgIGlzRmx1c2hQZW5kaW5nID0gcXVldWUtPnBvcFBlbmRpbmdGbHVzaCgpOworICAgICAgICB3b3JrID0gcXVldWUtPnBvcF9mcm9udCgpOworICAgICAgICBoYXNRdWV1ZWRXb3JrID0gIXF1ZXVlLT5lbXB0eSgpOworICAgIH0KKyAgICBpZiAoaXNGbHVzaFBlbmRpbmcpIHsKKyAgICAgICAgQUxPR1YoInByb2Nlc3NpbmcgcGVuZGluZyBmbHVzaCIpOworICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBvbkZsdXNoX3NtKCk7CisgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIEFMT0dEKCJmbHVzaCBlcnI6ICVkIiwgZXJyKTsKKyAgICAgICAgICAgIC8vIFRPRE86IGVycm9yCisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIW1PdXRwdXRCbG9ja1Bvb2wpIHsKKyAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gW3RoaXNdIHsKKyAgICAgICAgICAgIC8vIFRPRE86IGRvbid0IHVzZSBxdWVyeV92YgorICAgICAgICAgICAgQzJTdHJlYW1Gb3JtYXRDb25maWc6Om91dHB1dCBvdXRwdXRGb3JtYXQoMHUpOworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiBwYXJhbXM7CisgICAgICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBpbnRmKCktPnF1ZXJ5X3ZiKAorICAgICAgICAgICAgICAgICAgICB7ICZvdXRwdXRGb3JtYXQgfSwKKyAgICAgICAgICAgICAgICAgICAgeyBDMlBvcnRCbG9ja1Bvb2xzVHVuaW5nOjpvdXRwdXQ6OlBBUkFNX1RZUEUgfSwKKyAgICAgICAgICAgICAgICAgICAgQzJfRE9OVF9CTE9DSywKKyAgICAgICAgICAgICAgICAgICAgJnBhcmFtcyk7CisgICAgICAgICAgICBpZiAoZXJyICE9IEMyX09LICYmIGVyciAhPSBDMl9CQURfSU5ERVgpIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgicXVlcnkgZXJyID0gJWQiLCBlcnIpOworICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCBwb29sSWQgPQorICAgICAgICAgICAgICAgIG91dHB1dEZvcm1hdC52YWx1ZSA9PSBDMkZvcm1hdFZpZGVvCisgICAgICAgICAgICAgICAgICAgICAgICA/IEMyQmxvY2tQb29sOjpCQVNJQ19HUkFQSElDCisgICAgICAgICAgICAgICAgICAgICAgICA6IEMyQmxvY2tQb29sOjpCQVNJQ19MSU5FQVI7CisgICAgICAgICAgICBpZiAocGFyYW1zLnNpemUoKSkgeworICAgICAgICAgICAgICAgIEMyUG9ydEJsb2NrUG9vbHNUdW5pbmc6Om91dHB1dCAqb3V0cHV0UG9vbHMgPQorICAgICAgICAgICAgICAgICAgICBDMlBvcnRCbG9ja1Bvb2xzVHVuaW5nOjpvdXRwdXQ6OkZyb20ocGFyYW1zWzBdLmdldCgpKTsKKyAgICAgICAgICAgICAgICBpZiAob3V0cHV0UG9vbHMgJiYgb3V0cHV0UG9vbHMtPmZsZXhDb3VudCgpID49IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgcG9vbElkID0gb3V0cHV0UG9vbHMtPm0udmFsdWVzWzBdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZXJyID0gR2V0Q29kZWMyQmxvY2tQb29sKHBvb2xJZCwgc2hhcmVkX2Zyb21fdGhpcygpLCAmbU91dHB1dEJsb2NrUG9vbCk7CisgICAgICAgICAgICBBTE9HRCgiVXNpbmcgb3V0cHV0IGJsb2NrIHBvb2wgd2l0aCBwb29sSUQgJWxsdSA9PiBnb3QgJWxsdSAtICVkIiwKKyAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylwb29sSWQsCisgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1PdXRwdXRCbG9ja1Bvb2wgPyBtT3V0cHV0QmxvY2tQb29sLT5nZXRMb2NhbElkKCkgOiAxMTEwMDAxMTEpLAorICAgICAgICAgICAgICAgICAgICBlcnIpOworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfSgpOworICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICBNdXRleGVkPEV4ZWNTdGF0ZT46OkxvY2tlZCBzdGF0ZShtRXhlY1N0YXRlKTsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudDo6TGlzdGVuZXI+IGxpc3RlbmVyID0gc3RhdGUtPm1MaXN0ZW5lcjsKKyAgICAgICAgICAgIHN0YXRlLnVubG9jaygpOworICAgICAgICAgICAgbGlzdGVuZXItPm9uRXJyb3JfbmIoc2hhcmVkX2Zyb21fdGhpcygpLCBlcnIpOworICAgICAgICAgICAgcmV0dXJuIGhhc1F1ZXVlZFdvcms7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIXdvcmspIHsKKyAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gZHJhaW4oZHJhaW5Nb2RlLCBtT3V0cHV0QmxvY2tQb29sKTsKKyAgICAgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAgICAgTXV0ZXhlZDxFeGVjU3RhdGU+OjpMb2NrZWQgc3RhdGUobUV4ZWNTdGF0ZSk7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ6Okxpc3RlbmVyPiBsaXN0ZW5lciA9IHN0YXRlLT5tTGlzdGVuZXI7CisgICAgICAgICAgICBzdGF0ZS51bmxvY2soKTsKKyAgICAgICAgICAgIGxpc3RlbmVyLT5vbkVycm9yX25iKHNoYXJlZF9mcm9tX3RoaXMoKSwgZXJyKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaGFzUXVldWVkV29yazsKKyAgICB9CisKKyAgICB7CisgICAgICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW0gKj4gdXBkYXRlczsKKyAgICAgICAgZm9yIChjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4gJnBhcmFtOiB3b3JrLT5pbnB1dC5jb25maWdVcGRhdGUpIHsKKyAgICAgICAgICAgIGlmIChwYXJhbSkgeworICAgICAgICAgICAgICAgIHVwZGF0ZXMuZW1wbGFjZV9iYWNrKHBhcmFtLmdldCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIXVwZGF0ZXMuZW1wdHkoKSkgeworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gaW50ZigpLT5jb25maWdfdmIodXBkYXRlcywgQzJfTUFZX0JMT0NLLCAmZmFpbHVyZXMpOworICAgICAgICAgICAgQUxPR0QoImFwcGxpZWQgJXp1IGNvbmZpZ1VwZGF0ZXMgPT4gJXMgKCVkKSIsIHVwZGF0ZXMuc2l6ZSgpLCBhc1N0cmluZyhlcnIpLCBlcnIpOworICAgICAgICB9CisgICAgfQorCisgICAgQUxPR1YoInN0YXJ0IHByb2Nlc3NpbmcgZnJhbWUgIyUiIFBSSXU2NCwgd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCkpOworICAgIHByb2Nlc3Mod29yaywgbU91dHB1dEJsb2NrUG9vbCk7CisgICAgQUxPR1YoInByb2Nlc3NlZCBmcmFtZSAjJSIgUFJJdTY0LCB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKSk7CisgICAgeworICAgICAgICBNdXRleGVkPFdvcmtRdWV1ZT46OkxvY2tlZCBxdWV1ZShtV29ya1F1ZXVlKTsKKyAgICAgICAgaWYgKHF1ZXVlLT5nZW5lcmF0aW9uKCkgIT0gZ2VuZXJhdGlvbikgeworICAgICAgICAgICAgQUxPR0QoIndvcmsgZm9ybSBvbGQgZ2VuZXJhdGlvbjogd2FzICUiIFBSSXU2NCAiIG5vdyAlIiBQUkl1NjQsCisgICAgICAgICAgICAgICAgICAgIHF1ZXVlLT5nZW5lcmF0aW9uKCksIGdlbmVyYXRpb24pOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfTk9UX0ZPVU5EOworICAgICAgICAgICAgcXVldWUudW5sb2NrKCk7CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTXV0ZXhlZDxFeGVjU3RhdGU+OjpMb2NrZWQgc3RhdGUobUV4ZWNTdGF0ZSk7CisgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50OjpMaXN0ZW5lcj4gbGlzdGVuZXIgPSBzdGF0ZS0+bUxpc3RlbmVyOworICAgICAgICAgICAgICAgIHN0YXRlLnVubG9jaygpOworICAgICAgICAgICAgICAgIGxpc3RlbmVyLT5vbldvcmtEb25lX25iKHNoYXJlZF9mcm9tX3RoaXMoKSwgdmVjKHdvcmspKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHF1ZXVlLmxvY2soKTsKKyAgICAgICAgICAgIHJldHVybiBoYXNRdWV1ZWRXb3JrOworICAgICAgICB9CisgICAgfQorICAgIGlmICh3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCAhPSAwdSkgeworICAgICAgICBNdXRleGVkPEV4ZWNTdGF0ZT46OkxvY2tlZCBzdGF0ZShtRXhlY1N0YXRlKTsKKyAgICAgICAgQUxPR1YoInJldHVybmluZyB0aGlzIHdvcmsiKTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50OjpMaXN0ZW5lcj4gbGlzdGVuZXIgPSBzdGF0ZS0+bUxpc3RlbmVyOworICAgICAgICBzdGF0ZS51bmxvY2soKTsKKyAgICAgICAgbGlzdGVuZXItPm9uV29ya0RvbmVfbmIoc2hhcmVkX2Zyb21fdGhpcygpLCB2ZWMod29yaykpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dWKCJxdWV1ZSBwZW5kaW5nIHdvcmsiKTsKKyAgICAgICAgd29yay0+aW5wdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB1bmV4cGVjdGVkOworICAgICAgICB7CisgICAgICAgICAgICBNdXRleGVkPFBlbmRpbmdXb3JrPjo6TG9ja2VkIHBlbmRpbmcobVBlbmRpbmdXb3JrKTsKKyAgICAgICAgICAgIHVpbnQ2NF90IGZyYW1lSW5kZXggPSB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKTsKKyAgICAgICAgICAgIGlmIChwZW5kaW5nLT5jb3VudChmcmFtZUluZGV4KSAhPSAwKSB7CisgICAgICAgICAgICAgICAgdW5leHBlY3RlZCA9IHN0ZDo6bW92ZShwZW5kaW5nLT5hdChmcmFtZUluZGV4KSk7CisgICAgICAgICAgICAgICAgcGVuZGluZy0+ZXJhc2UoZnJhbWVJbmRleCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAodm9pZClwZW5kaW5nLT5pbnNlcnQoeyBmcmFtZUluZGV4LCBzdGQ6Om1vdmUod29yaykgfSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHVuZXhwZWN0ZWQpIHsKKyAgICAgICAgICAgIEFMT0dEKCJ1bmV4cGVjdGVkIHBlbmRpbmcgd29yayIpOworICAgICAgICAgICAgdW5leHBlY3RlZC0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgTXV0ZXhlZDxFeGVjU3RhdGU+OjpMb2NrZWQgc3RhdGUobUV4ZWNTdGF0ZSk7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ6Okxpc3RlbmVyPiBsaXN0ZW5lciA9IHN0YXRlLT5tTGlzdGVuZXI7CisgICAgICAgICAgICBzdGF0ZS51bmxvY2soKTsKKyAgICAgICAgICAgIGxpc3RlbmVyLT5vbldvcmtEb25lX25iKHNoYXJlZF9mcm9tX3RoaXMoKSwgdmVjKHVuZXhwZWN0ZWQpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gaGFzUXVldWVkV29yazsKK30KKworc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBTaW1wbGVDMkNvbXBvbmVudDo6Y3JlYXRlTGluZWFyQnVmZmVyKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gJmJsb2NrKSB7CisgICAgcmV0dXJuIGNyZWF0ZUxpbmVhckJ1ZmZlcihibG9jaywgYmxvY2stPm9mZnNldCgpLCBibG9jay0+c2l6ZSgpKTsKK30KKworc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBTaW1wbGVDMkNvbXBvbmVudDo6Y3JlYXRlTGluZWFyQnVmZmVyKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gJmJsb2NrLCBzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgeworICAgIHJldHVybiBDMkJ1ZmZlcjo6Q3JlYXRlTGluZWFyQnVmZmVyKGJsb2NrLT5zaGFyZShvZmZzZXQsIHNpemUsIDo6QzJGZW5jZSgpKSk7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gU2ltcGxlQzJDb21wb25lbnQ6OmNyZWF0ZUdyYXBoaWNCdWZmZXIoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gJmJsb2NrKSB7CisgICAgcmV0dXJuIGNyZWF0ZUdyYXBoaWNCdWZmZXIoYmxvY2ssIEMyUmVjdChibG9jay0+d2lkdGgoKSwgYmxvY2stPmhlaWdodCgpKSk7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gU2ltcGxlQzJDb21wb25lbnQ6OmNyZWF0ZUdyYXBoaWNCdWZmZXIoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gJmJsb2NrLCBjb25zdCBDMlJlY3QgJmNyb3ApIHsKKyAgICByZXR1cm4gQzJCdWZmZXI6OkNyZWF0ZUdyYXBoaWNCdWZmZXIoYmxvY2stPnNoYXJlKGNyb3AsIDo6QzJGZW5jZSgpKSk7Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Jhc2UvU2ltcGxlQzJJbnRlcmZhY2UuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYmFzZS9TaW1wbGVDMkludGVyZmFjZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg0OWE0ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Jhc2UvU2ltcGxlQzJJbnRlcmZhY2UuY3BwCkBAIC0wLDAgKzEsMzE1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJTaW1wbGVDMkludGVyZmFjZSIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworLy8gdXNlIE1lZGlhRGVmcyBoZXJlIHZzLiBNZWRpYUNvZGVjQ29uc3RhbnRzIGFzIHRoaXMgaXMgbm90IE1lZGlhQ29kZWMgc3BlY2lmaWMvZGVwZW5kZW50CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaD4KKworI2luY2x1ZGUgPFNpbXBsZUMySW50ZXJmYWNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyogU2ltcGxlSW50ZXJmYWNlICovCisKK1NpbXBsZUludGVyZmFjZTx2b2lkPjo6QmFzZVBhcmFtczo6QmFzZVBhcmFtcygKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiAmcmVmbGVjdG9yLAorICAgICAgICBDMlN0cmluZyBuYW1lLAorICAgICAgICBDMkNvbXBvbmVudDo6a2luZF90IGtpbmQsCisgICAgICAgIEMyQ29tcG9uZW50Ojpkb21haW5fdCBkb21haW4sCisgICAgICAgIEMyU3RyaW5nIG1lZGlhVHlwZSwKKyAgICAgICAgc3RkOjp2ZWN0b3I8QzJTdHJpbmc+IGFsaWFzZXMpCisgICAgOiBDMkludGVyZmFjZUhlbHBlcihyZWZsZWN0b3IpIHsKKyAgICBzZXREZXJpdmVkSW5zdGFuY2UodGhpcyk7CisKKyAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtTmFtZSwgQzJfUEFSQU1LRVlfQ09NUE9ORU5UX05BTUUpCisgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoQWxsb2NTaGFyZWRTdHJpbmc8QzJDb21wb25lbnROYW1lU2V0dGluZz4obmFtZS5jX3N0cigpKSkKKyAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgIGlmIChhbGlhc2VzLnNpemUoKSkgeworICAgICAgICBDMlN0cmluZyBqb2luZWQ7CisgICAgICAgIGZvciAoY29uc3QgQzJTdHJpbmcgJmFsaWFzIDogYWxpYXNlcykgeworICAgICAgICAgICAgaWYgKGpvaW5lZC5sZW5ndGgoKSkgeworICAgICAgICAgICAgICAgIGpvaW5lZCArPSAiLCI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBqb2luZWQgKz0gYWxpYXM7CisgICAgICAgIH0KKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1BbGlhc2VzLCBDMl9QQVJBTUtFWV9DT01QT05FTlRfQUxJQVNFUykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoQWxsb2NTaGFyZWRTdHJpbmc8QzJDb21wb25lbnRBbGlhc2VzU2V0dGluZz4oam9pbmVkLmNfc3RyKCkpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICB9CisKKyAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtS2luZCwgQzJfUEFSQU1LRVlfQ09NUE9ORU5UX0tJTkQpCisgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyQ29tcG9uZW50S2luZFNldHRpbmcoa2luZCkpCisgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtRG9tYWluLCBDMl9QQVJBTUtFWV9DT01QT05FTlRfRE9NQUlOKQorICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMkNvbXBvbmVudERvbWFpblNldHRpbmcoZG9tYWluKSkKKyAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgIC8vIHNpbXBsZSBpbnRlcmZhY2VzIGhhdmUgc2luZ2xlIHN0cmVhbXMKKyAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRTdHJlYW1Db3VudCwgQzJfUEFSQU1LRVlfSU5QVVRfU1RSRUFNX0NPVU5UKQorICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlBvcnRTdHJlYW1Db3VudFR1bmluZzo6aW5wdXQoMSkpCisgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtT3V0cHV0U3RyZWFtQ291bnQsIEMyX1BBUkFNS0VZX09VVFBVVF9TVFJFQU1fQ09VTlQpCisgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyUG9ydFN0cmVhbUNvdW50VHVuaW5nOjpvdXRwdXQoMSkpCisgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAvLyBzZXQgdXAgYnVmZmVyIGZvcm1hdHMgYW5kIGFsbG9jYXRvcnMKKworICAgIC8vIGRlZmF1bHQgdG8gbGluZWFyIGJ1ZmZlcnMgYW5kIG5vIG1lZGlhIHR5cGUKKyAgICBDMkJ1ZmZlckRhdGE6OnR5cGVfdCByYXdCdWZmZXJUeXBlID0gQzJCdWZmZXJEYXRhOjpMSU5FQVI7CisgICAgQzJTdHJpbmcgcmF3TWVkaWFUeXBlOworICAgIEMyQWxsb2NhdG9yOjppZF90IHJhd0FsbG9jYXRvciA9IEMyQWxsb2NhdG9yU3RvcmU6OkRFRkFVTFRfTElORUFSOworICAgIEMyQmxvY2tQb29sOjpsb2NhbF9pZF90IHJhd1Bvb2xJZCA9IEMyQmxvY2tQb29sOjpCQVNJQ19MSU5FQVI7CisgICAgQzJCdWZmZXJEYXRhOjp0eXBlX3QgY29kZWRCdWZmZXJUeXBlID0gQzJCdWZmZXJEYXRhOjpMSU5FQVI7CisgICAgQzJBbGxvY2F0b3I6OmlkX3QgY29kZWRBbGxvY2F0b3IgPSBDMkFsbG9jYXRvclN0b3JlOjpERUZBVUxUX0xJTkVBUjsKKyAgICBDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCBjb2RlZFBvb2xJZCA9IEMyQmxvY2tQb29sOjpCQVNJQ19MSU5FQVI7CisKKyAgICBzd2l0Y2ggKGRvbWFpbikgeworICAgICAgICBjYXNlIEMyQ29tcG9uZW50OjpET01BSU5fSU1BR0U6CisgICAgICAgIGNhc2UgQzJDb21wb25lbnQ6OkRPTUFJTl9WSURFTzoKKyAgICAgICAgICAgIC8vIFRPRE86IHNob3VsZCB3ZSBkZWZpbmUgcmF3IGltYWdlPyBUaGUgb25seSBkaWZmZXJlbmNlIGlzIHRpbWVzdGFtcCBoYW5kbGluZworICAgICAgICAgICAgcmF3QnVmZmVyVHlwZSA9IEMyQnVmZmVyRGF0YTo6R1JBUEhJQzsKKyAgICAgICAgICAgIHJhd01lZGlhVHlwZSA9IE1FRElBX01JTUVUWVBFX1ZJREVPX1JBVzsKKyAgICAgICAgICAgIHJhd0FsbG9jYXRvciA9IEMyQWxsb2NhdG9yU3RvcmU6OkRFRkFVTFRfR1JBUEhJQzsKKyAgICAgICAgICAgIHJhd1Bvb2xJZCA9IEMyQmxvY2tQb29sOjpCQVNJQ19HUkFQSElDOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQzJDb21wb25lbnQ6OkRPTUFJTl9BVURJTzoKKyAgICAgICAgICAgIHJhd0J1ZmZlclR5cGUgPSBDMkJ1ZmZlckRhdGE6OkxJTkVBUjsKKyAgICAgICAgICAgIHJhd01lZGlhVHlwZSA9IE1FRElBX01JTUVUWVBFX0FVRElPX1JBVzsKKyAgICAgICAgICAgIHJhd0FsbG9jYXRvciA9IEMyQWxsb2NhdG9yU3RvcmU6OkRFRkFVTFRfTElORUFSOworICAgICAgICAgICAgcmF3UG9vbElkID0gQzJCbG9ja1Bvb2w6OkJBU0lDX0xJTkVBUjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGJvb2wgaXNFbmNvZGVyID0ga2luZCA9PSBDMkNvbXBvbmVudDo6S0lORF9FTkNPREVSOworCisgICAgLy8gaGFuZGxlIHJhdyBkZWNvZGVycworICAgIGlmIChtZWRpYVR5cGUgPT0gcmF3TWVkaWFUeXBlKSB7CisgICAgICAgIGNvZGVkQnVmZmVyVHlwZSA9IHJhd0J1ZmZlclR5cGU7CisgICAgICAgIGNvZGVkQWxsb2NhdG9yID0gcmF3QWxsb2NhdG9yOworICAgICAgICBjb2RlZFBvb2xJZCA9IHJhd1Bvb2xJZDsKKyAgICB9CisKKyAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRGb3JtYXQsIEMyX1BBUkFNS0VZX0lOUFVUX1NUUkVBTV9CVUZGRVJfVFlQRSkKKyAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6aW5wdXQoCisgICAgICAgICAgICAgICAgICAgIDB1LCBpc0VuY29kZXIgPyByYXdCdWZmZXJUeXBlIDogY29kZWRCdWZmZXJUeXBlKSkKKyAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dE1lZGlhVHlwZSwgQzJfUEFSQU1LRVlfSU5QVVRfTUVESUFfVFlQRSkKKyAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShBbGxvY1NoYXJlZFN0cmluZzxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjppbnB1dD4oCisgICAgICAgICAgICAgICAgICAgIGlzRW5jb2RlciA/IHJhd01lZGlhVHlwZSA6IG1lZGlhVHlwZSkpCisgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtT3V0cHV0Rm9ybWF0LCBDMl9QQVJBTUtFWV9PVVRQVVRfU1RSRUFNX0JVRkZFUl9UWVBFKQorICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjpvdXRwdXQoCisgICAgICAgICAgICAgICAgICAgIDB1LCBpc0VuY29kZXIgPyBjb2RlZEJ1ZmZlclR5cGUgOiByYXdCdWZmZXJUeXBlKSkKKyAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1PdXRwdXRNZWRpYVR5cGUsIEMyX1BBUkFNS0VZX09VVFBVVF9NRURJQV9UWVBFKQorICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKEFsbG9jU2hhcmVkU3RyaW5nPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6Om91dHB1dD4oCisgICAgICAgICAgICAgICAgICAgIGlzRW5jb2RlciA/IG1lZGlhVHlwZSA6IHJhd01lZGlhVHlwZSkpCisgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICBDMkFsbG9jYXRvcjo6aWRfdCBpbnB1dEFsbG9jYXRvcnNbMV0gPSB7IGlzRW5jb2RlciA/IHJhd0FsbG9jYXRvciA6IGNvZGVkQWxsb2NhdG9yIH07CisgICAgQzJBbGxvY2F0b3I6OmlkX3Qgb3V0cHV0QWxsb2NhdG9yc1sxXSA9IHsgaXNFbmNvZGVyID8gY29kZWRBbGxvY2F0b3IgOiByYXdBbGxvY2F0b3IgfTsKKyAgICBDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCBvdXRwdXRQb29sSWRzWzFdID0geyBpc0VuY29kZXIgPyBjb2RlZFBvb2xJZCA6IHJhd1Bvb2xJZCB9OworCisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0QWxsb2NhdG9ycywgQzJfUEFSQU1LRVlfSU5QVVRfQUxMT0NBVE9SUykKKyAgICAgICAgICAgIC53aXRoRGVmYXVsdChDMlBvcnRBbGxvY2F0b3JzVHVuaW5nOjppbnB1dDo6QWxsb2NTaGFyZWQoaW5wdXRBbGxvY2F0b3JzKSkKKyAgICAgICAgICAgIC53aXRoRmllbGRzKHsgQzJGKG1JbnB1dEFsbG9jYXRvcnMsIG0udmFsdWVzWzBdKS5hbnkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQzJGKG1JbnB1dEFsbG9jYXRvcnMsIG0udmFsdWVzKS5pblJhbmdlKDAsIDEpIH0pCisgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8QzJQb3J0QWxsb2NhdG9yc1R1bmluZzo6aW5wdXQ+OjpOb25TdHJpY3RWYWx1ZXNXaXRoTm9EZXBzKQorICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obU91dHB1dEFsbG9jYXRvcnMsIEMyX1BBUkFNS0VZX09VVFBVVF9BTExPQ0FUT1JTKQorICAgICAgICAgICAgLndpdGhEZWZhdWx0KEMyUG9ydEFsbG9jYXRvcnNUdW5pbmc6Om91dHB1dDo6QWxsb2NTaGFyZWQob3V0cHV0QWxsb2NhdG9ycykpCisgICAgICAgICAgICAud2l0aEZpZWxkcyh7IEMyRihtT3V0cHV0QWxsb2NhdG9ycywgbS52YWx1ZXNbMF0pLmFueSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDMkYobU91dHB1dEFsbG9jYXRvcnMsIG0udmFsdWVzKS5pblJhbmdlKDAsIDEpIH0pCisgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8QzJQb3J0QWxsb2NhdG9yc1R1bmluZzo6b3V0cHV0Pjo6Tm9uU3RyaWN0VmFsdWVzV2l0aE5vRGVwcykKKyAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1PdXRwdXRQb29sSWRzLCBDMl9QQVJBTUtFWV9PVVRQVVRfQkxPQ0tfUE9PTFMpCisgICAgICAgICAgICAud2l0aERlZmF1bHQoQzJQb3J0QmxvY2tQb29sc1R1bmluZzo6b3V0cHV0OjpBbGxvY1NoYXJlZChvdXRwdXRQb29sSWRzKSkKKyAgICAgICAgICAgIC53aXRoRmllbGRzKHsgQzJGKG1PdXRwdXRQb29sSWRzLCBtLnZhbHVlc1swXSkuYW55KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEMyRihtT3V0cHV0UG9vbElkcywgbS52YWx1ZXMpLmluUmFuZ2UoMCwgMSkgfSkKKyAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxDMlBvcnRCbG9ja1Bvb2xzVHVuaW5nOjpvdXRwdXQ+OjpOb25TdHJpY3RWYWx1ZXNXaXRoTm9EZXBzKQorICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgLy8gYWRkIHN0YXRlbGVzcyBwYXJhbXMKKyAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtU3Vic2NyaWJlZFBhcmFtSW5kaWNlcywgQzJfUEFSQU1LRVlfU1VCU0NSSUJFRF9QQVJBTV9JTkRJQ0VTKQorICAgICAgICAgICAgLndpdGhEZWZhdWx0KEMyU3Vic2NyaWJlZFBhcmFtSW5kaWNlc1R1bmluZzo6QWxsb2NTaGFyZWQoMHUpKQorICAgICAgICAgICAgLndpdGhGaWVsZHMoeyBDMkYobVN1YnNjcmliZWRQYXJhbUluZGljZXMsIG0udmFsdWVzWzBdKS5hbnkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQzJGKG1TdWJzY3JpYmVkUGFyYW1JbmRpY2VzLCBtLnZhbHVlcykuYW55KCkgfSkKKyAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxDMlN1YnNjcmliZWRQYXJhbUluZGljZXNUdW5pbmc+OjpOb25TdHJpY3RWYWx1ZXNXaXRoTm9EZXBzKQorICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgLyogVE9ETworCisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obUN1cnJlbnRXb3JrT3JkaW5hbCwgQzJfUEFSQU1LRVlfQ1VSUkVOVF9XT1JLKQorICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMkN1cnJlbnRXb3JrVHVuaW5nKCkpCisgICAgICAgICAgICAud2l0aEZpZWxkcyh7IEMyRihtQ3VycmVudFdvcmtPcmRpbmFsLCBtLnRpbWVTdGFtcCkuYW55KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEMyRihtQ3VycmVudFdvcmtPcmRpbmFsLCBtLmZyYW1lSW5kZXgpLmFueSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDMkYobUN1cnJlbnRXb3JrT3JkaW5hbCwgbS5jdXN0b21PcmRpbmFsKS5hbnkoKSB9KQorICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPEMyQ3VycmVudFdvcmtUdW5pbmc+OjpOb25TdHJpY3RWYWx1ZXNXaXRoTm9EZXBzKQorICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obUxhc3RJbnB1dFF1ZXVlZFdvcmtPcmRpbmFsLCBDMl9QQVJBTUtFWV9MQVNUX0lOUFVUX1FVRVVFRCkKKyAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJMYXN0V29ya1F1ZXVlZFR1bmluZzo6aW5wdXQoKSkKKyAgICAgICAgICAgIC53aXRoRmllbGRzKHsgQzJGKG1MYXN0SW5wdXRRdWV1ZWRXb3JrT3JkaW5hbCwgbS50aW1lU3RhbXApLmFueSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDMkYobUxhc3RJbnB1dFF1ZXVlZFdvcmtPcmRpbmFsLCBtLmZyYW1lSW5kZXgpLmFueSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDMkYobUxhc3RJbnB1dFF1ZXVlZFdvcmtPcmRpbmFsLCBtLmN1c3RvbU9yZGluYWwpLmFueSgpIH0pCisgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8QzJMYXN0V29ya1F1ZXVlZFR1bmluZzo6aW5wdXQ+OjpOb25TdHJpY3RWYWx1ZXNXaXRoTm9EZXBzKQorICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obUxhc3RPdXRwdXRRdWV1ZWRXb3JrT3JkaW5hbCwgQzJfUEFSQU1LRVlfTEFTVF9PVVRQVVRfUVVFVUVEKQorICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMkxhc3RXb3JrUXVldWVkVHVuaW5nOjpvdXRwdXQoKSkKKyAgICAgICAgICAgIC53aXRoRmllbGRzKHsgQzJGKG1MYXN0T3V0cHV0UXVldWVkV29ya09yZGluYWwsIG0udGltZVN0YW1wKS5hbnkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQzJGKG1MYXN0T3V0cHV0UXVldWVkV29ya09yZGluYWwsIG0uZnJhbWVJbmRleCkuYW55KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEMyRihtTGFzdE91dHB1dFF1ZXVlZFdvcmtPcmRpbmFsLCBtLmN1c3RvbU9yZGluYWwpLmFueSgpIH0pCisgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8QzJMYXN0V29ya1F1ZXVlZFR1bmluZzo6b3V0cHV0Pjo6Tm9uU3RyaWN0VmFsdWVzV2l0aE5vRGVwcykKKyAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMk91dE9mTWVtb3J5VHVuaW5nPiBtT3V0T2ZNZW1vcnk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0Q29uZmlnQ291bnRlclR1bmluZzo6aW5wdXQ+IG1JbnB1dENvbmZpZ0NvdW50ZXI7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydENvbmZpZ0NvdW50ZXJUdW5pbmc6Om91dHB1dD4gbU91dHB1dENvbmZpZ0NvdW50ZXI7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29uZmlnQ291bnRlclR1bmluZz4gbURpcmVjdENvbmZpZ0NvdW50ZXI7CisKKyAgICAqLworfQorCit2b2lkIFNpbXBsZUludGVyZmFjZTx2b2lkPjo6QmFzZVBhcmFtczo6bm9JbnB1dExhdGVuY3koKSB7CisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obVJlcXVlc3RlZElucHV0RGVsYXksIEMyX1BBUkFNS0VZX0lOUFVUX0RFTEFZX1JFUVVFU1QpCisgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyUG9ydFJlcXVlc3RlZERlbGF5VHVuaW5nOjppbnB1dCgwdSkpCisgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtQWN0dWFsSW5wdXREZWxheSwgQzJfUEFSQU1LRVlfSU5QVVRfREVMQVkpCisgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyUG9ydEFjdHVhbERlbGF5VHVuaW5nOjppbnB1dCgwdSkpCisgICAgICAgICAgICAuYnVpbGQoKSk7Cit9CisKK3ZvaWQgU2ltcGxlSW50ZXJmYWNlPHZvaWQ+OjpCYXNlUGFyYW1zOjpub091dHB1dExhdGVuY3koKSB7CisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obVJlcXVlc3RlZE91dHB1dERlbGF5LCBDMl9QQVJBTUtFWV9PVVRQVVRfREVMQVlfUkVRVUVTVCkKKyAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJQb3J0UmVxdWVzdGVkRGVsYXlUdW5pbmc6Om91dHB1dCgwdSkpCisgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtQWN0dWFsT3V0cHV0RGVsYXksIEMyX1BBUkFNS0VZX09VVFBVVF9ERUxBWSkKKyAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJQb3J0QWN0dWFsRGVsYXlUdW5pbmc6Om91dHB1dCgwdSkpCisgICAgICAgICAgICAuYnVpbGQoKSk7Cit9CisKK3ZvaWQgU2ltcGxlSW50ZXJmYWNlPHZvaWQ+OjpCYXNlUGFyYW1zOjpub1BpcGVsaW5lTGF0ZW5jeSgpIHsKKyAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtUmVxdWVzdGVkUGlwZWxpbmVEZWxheSwgQzJfUEFSQU1LRVlfUElQRUxJTkVfREVMQVlfUkVRVUVTVCkKKyAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJSZXF1ZXN0ZWRQaXBlbGluZURlbGF5VHVuaW5nKDB1KSkKKyAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1BY3R1YWxQaXBlbGluZURlbGF5LCBDMl9QQVJBTUtFWV9QSVBFTElORV9ERUxBWSkKKyAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJBY3R1YWxQaXBlbGluZURlbGF5VHVuaW5nKDB1KSkKKyAgICAgICAgICAgIC5idWlsZCgpKTsKK30KKwordm9pZCBTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXM6Om5vUHJpdmF0ZUJ1ZmZlcnMoKSB7CisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obVByaXZhdGVBbGxvY2F0b3JzLCBDMl9QQVJBTUtFWV9QUklWQVRFX0FMTE9DQVRPUlMpCisgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoQzJQcml2YXRlQWxsb2NhdG9yc1R1bmluZzo6QWxsb2NTaGFyZWQoMHUpKQorICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obU1heFByaXZhdGVCdWZmZXJDb3VudCwgQzJfUEFSQU1LRVlfTUFYX1BSSVZBVEVfQlVGRkVSX0NPVU5UKQorICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKEMyTWF4UHJpdmF0ZUJ1ZmZlckNvdW50VHVuaW5nOjpBbGxvY1NoYXJlZCgwdSkpCisgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtUHJpdmF0ZVBvb2xJZHMsIEMyX1BBUkFNS0VZX1BSSVZBVEVfQkxPQ0tfUE9PTFMpCisgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoQzJQcml2YXRlQmxvY2tQb29sc1R1bmluZzo6QWxsb2NTaGFyZWQoMHUpKQorICAgICAgICAgICAgLmJ1aWxkKCkpOworfQorCit2b2lkIFNpbXBsZUludGVyZmFjZTx2b2lkPjo6QmFzZVBhcmFtczo6bm9JbnB1dFJlZmVyZW5jZXMoKSB7CisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obU1heElucHV0UmVmZXJlbmNlQWdlLCBDMl9QQVJBTUtFWV9JTlBVVF9NQVhfUkVGRVJFTkNFX0FHRSkKKyAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1NYXhSZWZlcmVuY2VBZ2VUdW5pbmc6OmlucHV0KDB1KSkKKyAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1NYXhJbnB1dFJlZmVyZW5jZUNvdW50LCBDMl9QQVJBTUtFWV9JTlBVVF9NQVhfUkVGRVJFTkNFX0NPVU5UKQorICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbU1heFJlZmVyZW5jZUNvdW50VHVuaW5nOjppbnB1dCgwdSkpCisgICAgICAgICAgICAuYnVpbGQoKSk7Cit9CisKK3ZvaWQgU2ltcGxlSW50ZXJmYWNlPHZvaWQ+OjpCYXNlUGFyYW1zOjpub091dHB1dFJlZmVyZW5jZXMoKSB7CisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obU1heE91dHB1dFJlZmVyZW5jZUFnZSwgQzJfUEFSQU1LRVlfT1VUUFVUX01BWF9SRUZFUkVOQ0VfQUdFKQorICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbU1heFJlZmVyZW5jZUFnZVR1bmluZzo6b3V0cHV0KDB1KSkKKyAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1NYXhPdXRwdXRSZWZlcmVuY2VDb3VudCwgQzJfUEFSQU1LRVlfT1VUUFVUX01BWF9SRUZFUkVOQ0VfQ09VTlQpCisgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtTWF4UmVmZXJlbmNlQ291bnRUdW5pbmc6Om91dHB1dCgwdSkpCisgICAgICAgICAgICAuYnVpbGQoKSk7Cit9CisKK3ZvaWQgU2ltcGxlSW50ZXJmYWNlPHZvaWQ+OjpCYXNlUGFyYW1zOjpub1RpbWVTdHJldGNoKCkgeworICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1UaW1lU3RyZXRjaCwgQzJfUEFSQU1LRVlfVElNRV9TVFJFVENIKQorICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMkNvbXBvbmVudFRpbWVTdHJldGNoVHVuaW5nKDEuZikpCisgICAgICAgICAgICAuYnVpbGQoKSk7Cit9CisKKy8qCisgICAgQ2xpZW50cyBuZWVkIHRvIGhhbmRsZSB0aGUgZm9sbG93aW5nIGJhc2UgcGFyYW1zIGR1ZSB0byBjdXN0b20gZGVwZW5kZW5jeS4KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFwaUxldmVsU2V0dGluZz4gbUFwaUxldmVsOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFwaUZlYXR1cmVzU2V0dGluZz4gbUFwaUZlYXR1cmVzOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEF0dHJpYnV0ZXNTZXR0aW5nPiBtQXR0cmliOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydFN1Z2dlc3RlZEJ1ZmZlckNvdW50VHVuaW5nOjppbnB1dD4gbVN1Z2dlc3RlZElucHV0QnVmZmVyQ291bnQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydFN1Z2dlc3RlZEJ1ZmZlckNvdW50VHVuaW5nOjpvdXRwdXQ+IG1TdWdnZXN0ZWRPdXRwdXRCdWZmZXJDb3VudDsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlRyaXBwZWRUdW5pbmc+IG1UcmlwcGVkOworCisqLworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9iYXNlL2luY2x1ZGUvU2ltcGxlQzJDb21wb25lbnQuaCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Jhc2UvaW5jbHVkZS9TaW1wbGVDMkNvbXBvbmVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzYTk4ZjQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9iYXNlL2luY2x1ZGUvU2ltcGxlQzJDb21wb25lbnQuaApAQCAtMCwwICsxLDI0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgU0lNUExFX0MyX0NPTVBPTkVOVF9IXworI2RlZmluZSBTSU1QTEVfQzJfQ09NUE9ORU5UX0hfCisKKyNpbmNsdWRlIDxsaXN0PgorI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CisKKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGFuZGxlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTXV0ZXhlZC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIFNpbXBsZUMyQ29tcG9uZW50CisgICAgICAgIDogcHVibGljIEMyQ29tcG9uZW50LCBwdWJsaWMgc3RkOjplbmFibGVfc2hhcmVkX2Zyb21fdGhpczxTaW1wbGVDMkNvbXBvbmVudD4geworcHVibGljOgorICAgIGV4cGxpY2l0IFNpbXBsZUMyQ29tcG9uZW50KAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiAmaW50Zik7CisgICAgdmlydHVhbCB+U2ltcGxlQzJDb21wb25lbnQoKTsKKworICAgIC8vIEMyQ29tcG9uZW50CisgICAgLy8gRnJvbSBDMkNvbXBvbmVudAorICAgIHZpcnR1YWwgYzJfc3RhdHVzX3Qgc2V0TGlzdGVuZXJfdmIoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8TGlzdGVuZXI+ICZsaXN0ZW5lciwgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaykgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWV1ZV9uYihzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+KiBjb25zdCBpdGVtcykgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBhbm5vdW5jZV9uYihjb25zdCBzdGQ6OnZlY3RvcjxDMldvcmtPdXRsaW5lPiAmaXRlbXMpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgZmx1c2hfc20oCisgICAgICAgICAgICBmbHVzaF9tb2RlX3QgbW9kZSwgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiogY29uc3QgZmx1c2hlZFdvcmspIG92ZXJyaWRlOworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgZHJhaW5fbmIoZHJhaW5fbW9kZV90IG1vZGUpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3Qgc3RhcnQoKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHN0b3AoKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHJlc2V0KCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCByZWxlYXNlKCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+IGludGYoKSBvdmVycmlkZTsKKworICAgIC8vIGZvciBoYW5kbGVyCisgICAgYm9vbCBwcm9jZXNzUXVldWUoKTsKKworcHJvdGVjdGVkOgorICAgIC8qKgorICAgICAqIEluaXRpYWxpemUgaW50ZXJuYWwgc3RhdGVzIG9mIHRoZSBjb21wb25lbnQgYWNjb3JkaW5nIHRvIHRoZSBjb25maWcgc2V0CisgICAgICogaW4gdGhlIGludGVyZmFjZS4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBkdXJpbmcgc3RhcnQoKSwgYnV0IG9ubHkgYXQgdGhlIGZpcnN0IGludm9jYXRpb24gb3IKKyAgICAgKiBhZnRlciByZXNldCgpLgorICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3Qgb25Jbml0KCkgPSAwOworCisgICAgLyoqCisgICAgICogU3RvcCB0aGUgY29tcG9uZW50LgorICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3Qgb25TdG9wKCkgPSAwOworCisgICAgLyoqCisgICAgICogUmVzZXQgdGhlIGNvbXBvbmVudC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHZvaWQgb25SZXNldCgpID0gMDsKKworICAgIC8qKgorICAgICAqIFJlbGVhc2UgdGhlIGNvbXBvbmVudC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHZvaWQgb25SZWxlYXNlKCkgPSAwOworCisgICAgLyoqCisgICAgICogRmx1c2ggdGhlIGNvbXBvbmVudC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IG9uRmx1c2hfc20oKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIHRoZSBnaXZlbiB3b3JrIGFuZCBmaW5pc2ggcGVuZGluZyB3b3JrIHVzaW5nIGZpbmlzaCgpLgorICAgICAqCisgICAgICogXHBhcmFtW2luLG91dF0gICB3b3JrICAgIHRoZSB3b3JrIHRvIHByb2Nlc3MKKyAgICAgKiBccGFyYW1baW5dICAgICAgIHBvb2wgICAgdGhlIHBvb2wgdG8gdXNlIGZvciBhbGxvY2F0aW5nIG91dHB1dCBibG9ja3MuCisgICAgICovCisgICAgdmlydHVhbCB2b2lkIHByb2Nlc3MoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpID0gMDsKKworICAgIC8qKgorICAgICAqIERyYWluIHRoZSBjb21wb25lbnQgYW5kIGZpbmlzaCBwZW5kaW5nIHdvcmsgdXNpbmcgZmluaXNoKCkuCisgICAgICoKKyAgICAgKiBccGFyYW1baW5dICAgZHJhaW5Nb2RlICAgbW9kZSBvZiBkcmFpbi4KKyAgICAgKiBccGFyYW1baW5dICAgcG9vbCAgICAgICAgdGhlIHBvb2wgdG8gdXNlIGZvciBhbGxvY2F0aW5nIG91dHB1dCBibG9ja3MuCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICAgICAgVGhlIGNvbXBvbmVudCBoYXMgZHJhaW5lZCBhbGwgcGVuZGluZyBvdXRwdXQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgd29yay4KKyAgICAgKiBccmV0dmFsIEMyX09NSVRURUQgICAgICAgVW5zdXBwb3J0ZWQgbW9kZSAoZS5nLiBEUkFJTl9DSEFJTikKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGRyYWluKAorICAgICAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgPSAwOworCisgICAgLy8gZm9yIGRlcml2ZWQgY2xhc3NlcworICAgIC8qKgorICAgICAqIEZpbmlzaCBwZW5kaW5nIHdvcmsuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIHJldHJpZXZlIHRoZSBwZW5kaW5nIHdvcmsgYWNjb3JkaW5nIHRvIHxmcmFtZUluZGV4fCBhbmQKKyAgICAgKiBmZWVkIHRoZSB3b3JrIGludG8gfGZpbGxXb3JrfCBmdW5jdGlvbi4gfGZpbGxXb3JrfCBtdXN0IGJlCisgICAgICogIm5vbi1ibG9ja2luZyIuIE9uY2UgfGZpbGxXb3JrfCByZXR1cm5zIHRoZSBmaWxsZWQgd29yayB3aWxsIGJlIHJldHVybmVkCisgICAgICogdG8gdGhlIGNsaWVudC4KKyAgICAgKgorICAgICAqIFxwYXJhbVtpbl0gICBmcmFtZUluZGV4ICAgIHRoZSBpbmRleCBvZiB0aGUgcGVuZGluZyB3b3JrCisgICAgICogXHBhcmFtW2luXSAgIGZpbGxXb3JrICAgICAgdGhlIGZ1bmN0aW9uIHRvIGZpbGwgdGhlIHJldHJpZXZlZCB3b3JrLgorICAgICAqLworICAgIHZvaWQgZmluaXNoKHVpbnQ2NF90IGZyYW1lSW5kZXgsIHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmKT4gZmlsbFdvcmspOworCisgICAgLyoqCisgICAgICogQ2xvbmUgcGVuZGluZyBvciBjdXJyZW50IHdvcmsgYW5kIHNlbmQgdGhlIHdvcmsgYmFjayB0byBjbGllbnQuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIHJldHJpZXZlIGFuZCBjbG9uZSB0aGUgcGVuZGluZyBvciBjdXJyZW50IHdvcmsgYWNjb3JkaW5nCisgICAgICogdG8gfGZyYW1lSW5kZXh8IGFuZCBmZWVkIHRoZSB3b3JrIGludG8gfGZpbGxXb3JrfCBmdW5jdGlvbi4gfGZpbGxXb3JrfAorICAgICAqIG11c3QgYmUgIm5vbi1ibG9ja2luZyIuIE9uY2UgfGZpbGxXb3JrfCByZXR1cm5zIHRoZSBmaWxsZWQgd29yayB3aWxsIGJlCisgICAgICogcmV0dXJuZWQgdG8gdGhlIGNsaWVudC4KKyAgICAgKgorICAgICAqIFxwYXJhbVtpbl0gICBmcmFtZUluZGV4ICAgIHRoZSBpbmRleCBvZiB0aGUgd29yaworICAgICAqIFxwYXJhbVtpbl0gICBjdXJyZW50V29yayAgIHRoZSBjdXJyZW50IHdvcmsgdW5kZXIgcHJvY2Vzc2luZworICAgICAqIFxwYXJhbVtpbl0gICBmaWxsV29yayAgICAgIHRoZSBmdW5jdGlvbiB0byBmaWxsIHRoZSByZXRyaWV2ZWQgd29yay4KKyAgICAgKi8KKyAgICB2b2lkIGNsb25lQW5kU2VuZCgKKyAgICAgICAgICAgIHVpbnQ2NF90IGZyYW1lSW5kZXgsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmY3VycmVudFdvcmssCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJik+IGZpbGxXb3JrKTsKKworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBjcmVhdGVMaW5lYXJCdWZmZXIoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gJmJsb2NrKTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gY3JlYXRlTGluZWFyQnVmZmVyKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+ICZibG9jaywgc2l6ZV90IG9mZnNldCwgc2l6ZV90IHNpemUpOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBjcmVhdGVHcmFwaGljQnVmZmVyKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiAmYmxvY2spOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBjcmVhdGVHcmFwaGljQnVmZmVyKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiAmYmxvY2ssCisgICAgICAgICAgICBjb25zdCBDMlJlY3QgJmNyb3ApOworCisgICAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBOT19EUkFJTiA9IH4wdTsKKworICAgIEMyUmVhZFZpZXcgbUR1bW15UmVhZFZpZXc7CisKK3ByaXZhdGU6CisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiBtSW50ZjsKKworICAgIGNsYXNzIFdvcmtIYW5kbGVyIDogcHVibGljIEFIYW5kbGVyIHsKKyAgICBwdWJsaWM6CisgICAgICAgIGVudW0geworICAgICAgICAgICAga1doYXRQcm9jZXNzLAorICAgICAgICAgICAga1doYXRJbml0LAorICAgICAgICAgICAga1doYXRTdGFydCwKKyAgICAgICAgICAgIGtXaGF0U3RvcCwKKyAgICAgICAgICAgIGtXaGF0UmVzZXQsCisgICAgICAgICAgICBrV2hhdFJlbGVhc2UsCisgICAgICAgIH07CisKKyAgICAgICAgV29ya0hhbmRsZXIoKTsKKyAgICAgICAgfldvcmtIYW5kbGVyKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICAgICAgIHZvaWQgc2V0Q29tcG9uZW50KGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxTaW1wbGVDMkNvbXBvbmVudD4gJnRoaXopOworCisgICAgcHJvdGVjdGVkOgorICAgICAgICB2b2lkIG9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSBvdmVycmlkZTsKKworICAgIHByaXZhdGU6CisgICAgICAgIHN0ZDo6d2Vha19wdHI8U2ltcGxlQzJDb21wb25lbnQ+IG1UaGl6OworICAgICAgICBib29sIG1SdW5uaW5nOworICAgIH07CisKKyAgICBlbnVtIHsKKyAgICAgICAgVU5JTklUSUFMSVpFRCwKKyAgICAgICAgU1RPUFBFRCwKKyAgICAgICAgUlVOTklORywKKyAgICB9OworCisgICAgc3RydWN0IEV4ZWNTdGF0ZSB7CisgICAgICAgIEV4ZWNTdGF0ZSgpIDogbVN0YXRlKFVOSU5JVElBTElaRUQpIHt9CisKKyAgICAgICAgaW50IG1TdGF0ZTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50OjpMaXN0ZW5lcj4gbUxpc3RlbmVyOworICAgIH07CisgICAgTXV0ZXhlZDxFeGVjU3RhdGU+IG1FeGVjU3RhdGU7CisKKyAgICBzcDxBTG9vcGVyPiBtTG9vcGVyOworICAgIHNwPFdvcmtIYW5kbGVyPiBtSGFuZGxlcjsKKworICAgIGNsYXNzIFdvcmtRdWV1ZSB7CisgICAgcHVibGljOgorICAgICAgICBpbmxpbmUgV29ya1F1ZXVlKCkgOiBtRmx1c2goZmFsc2UpLCBtR2VuZXJhdGlvbigwdWwpIHt9CisKKyAgICAgICAgaW5saW5lIHVpbnQ2NF90IGdlbmVyYXRpb24oKSBjb25zdCB7IHJldHVybiBtR2VuZXJhdGlvbjsgfQorICAgICAgICBpbmxpbmUgdm9pZCBpbmNHZW5lcmF0aW9uKCkgeyArK21HZW5lcmF0aW9uOyBtRmx1c2ggPSB0cnVlOyB9CisKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gcG9wX2Zyb250KCk7CisgICAgICAgIHZvaWQgcHVzaF9iYWNrKHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+IHdvcmspOworICAgICAgICBib29sIGVtcHR5KCkgY29uc3Q7CisgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSgpIGNvbnN0OworICAgICAgICB2b2lkIG1hcmtEcmFpbih1aW50MzJfdCBkcmFpbk1vZGUpOworICAgICAgICBpbmxpbmUgYm9vbCBwb3BQZW5kaW5nRmx1c2goKSB7CisgICAgICAgICAgICBib29sIGZsdXNoID0gbUZsdXNoOworICAgICAgICAgICAgbUZsdXNoID0gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gZmx1c2g7CisgICAgICAgIH0KKyAgICAgICAgdm9pZCBjbGVhcigpOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgc3RydWN0IEVudHJ5IHsKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+IHdvcms7CisgICAgICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGU7CisgICAgICAgIH07CisKKyAgICAgICAgYm9vbCBtRmx1c2g7CisgICAgICAgIHVpbnQ2NF90IG1HZW5lcmF0aW9uOworICAgICAgICBzdGQ6Omxpc3Q8RW50cnk+IG1RdWV1ZTsKKyAgICB9OworICAgIE11dGV4ZWQ8V29ya1F1ZXVlPiBtV29ya1F1ZXVlOworCisgICAgdHlwZWRlZiBzdGQ6OnVub3JkZXJlZF9tYXA8dWludDY0X3QsIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBQZW5kaW5nV29yazsKKyAgICBNdXRleGVkPFBlbmRpbmdXb3JrPiBtUGVuZGluZ1dvcms7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+IG1PdXRwdXRCbG9ja1Bvb2w7CisKKyAgICBTaW1wbGVDMkNvbXBvbmVudCgpID0gZGVsZXRlOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBTSU1QTEVfQzJfQ09NUE9ORU5UX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9iYXNlL2luY2x1ZGUvU2ltcGxlQzJJbnRlcmZhY2UuaCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Jhc2UvaW5jbHVkZS9TaW1wbGVDMkludGVyZmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwNTFkM2QKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9iYXNlL2luY2x1ZGUvU2ltcGxlQzJJbnRlcmZhY2UuaApAQCAtMCwwICsxLDIzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9TSU1QTEVfQzJfSU5URVJGQUNFX0hfCisjZGVmaW5lIEFORFJPSURfU0lNUExFX0MyX0lOVEVSRkFDRV9IXworCisjaW5jbHVkZSA8QzJDb21wb25lbnQuaD4KKyNpbmNsdWRlIDxDMkNvbmZpZy5oPgorI2luY2x1ZGUgPHV0aWwvQzJJbnRlcmZhY2VIZWxwZXIuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKioKKyAqIFdyYXAgYSBjb21tb24gaW50ZXJmYWNlIG9iamVjdCAoc3VjaCBhcyBDb2RlYzJDbGllbnQ6OkludGVyZmFjZSwgb3IgQzJJbnRlcmZhY2VIZWxwZXIgaW50bworICogYSBDMkNvbXBvbmVudEludGVyZmFjZS4KKyAqCisgKiBccGFyYW0gVCBjb21tb24gaW50ZXJmYWNlIHR5cGUKKyAqLwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBTaW1wbGVDMkludGVyZmFjZSA6IHB1YmxpYyBDMkNvbXBvbmVudEludGVyZmFjZSB7CitwdWJsaWM6CisgICAgU2ltcGxlQzJJbnRlcmZhY2UoY29uc3QgY2hhciAqbmFtZSwgYzJfbm9kZV9pZF90IGlkLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VD4gJmltcGwpCisgICAgICAgIDogbU5hbWUobmFtZSksCisgICAgICAgICAgbUlkKGlkKSwKKyAgICAgICAgICBtSW1wbChpbXBsKSB7CisgICAgfQorCisgICAgflNpbXBsZUMySW50ZXJmYWNlKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICAgLy8gRnJvbSBDMkNvbXBvbmVudEludGVyZmFjZQorICAgIEMyU3RyaW5nIGdldE5hbWUoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBtTmFtZTsgfQorICAgIGMyX25vZGVfaWRfdCBnZXRJZCgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIG1JZDsgfQorICAgIGMyX3N0YXR1c190IHF1ZXJ5X3ZiKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+ICZzdGFja1BhcmFtcywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiAmaGVhcFBhcmFtSW5kaWNlcywKKyAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2ssCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+KiBjb25zdCBoZWFwUGFyYW1zKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+cXVlcnkoc3RhY2tQYXJhbXMsIGhlYXBQYXJhbUluZGljZXMsIG1heUJsb2NrLCBoZWFwUGFyYW1zKTsKKyAgICB9CisgICAgYzJfc3RhdHVzX3QgY29uZmlnX3ZiKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+ICZwYXJhbXMsCisgICAgICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+KiBjb25zdCBmYWlsdXJlcykgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbUltcGwtPmNvbmZpZyhwYXJhbXMsIG1heUJsb2NrLCBmYWlsdXJlcyk7CisgICAgfQorICAgIGMyX3N0YXR1c190IGNyZWF0ZVR1bm5lbF9zbShjMl9ub2RlX2lkX3QpIG92ZXJyaWRlIHsgcmV0dXJuIEMyX09NSVRURUQ7IH0KKyAgICBjMl9zdGF0dXNfdCByZWxlYXNlVHVubmVsX3NtKGMyX25vZGVfaWRfdCkgb3ZlcnJpZGUgeyByZXR1cm4gQzJfT01JVFRFRDsgfQorICAgIGMyX3N0YXR1c190IHF1ZXJ5U3VwcG9ydGVkUGFyYW1zX25iKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4gKiBjb25zdCBwYXJhbXMpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLT5xdWVyeVN1cHBvcnRlZFBhcmFtcyhwYXJhbXMpOworICAgIH0KKyAgICBjMl9zdGF0dXNfdCBxdWVyeVN1cHBvcnRlZFZhbHVlc192YigKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeT4gJmZpZWxkcywKKyAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2spIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLT5xdWVyeVN1cHBvcnRlZFZhbHVlcyhmaWVsZHMsIG1heUJsb2NrKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgQzJTdHJpbmcgbU5hbWU7CisgICAgY29uc3QgYzJfbm9kZV9pZF90IG1JZDsKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VD4gbUltcGw7Cit9OworCisvKioKKyAqIFV0aWxpdHkgY2xhc3NlcyBmb3IgY29tbW9uIGludGVyZmFjZXMuCisgKi8KK3RlbXBsYXRlPD4KK2NsYXNzIFNpbXBsZUMySW50ZXJmYWNlPHZvaWQ+IHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBCYXNlIENvZGVjIDIuMCBwYXJhbWV0ZXJzIHJlcXVpcmVkIGZvciBhbGwgY29tcG9uZW50cy4KKyAgICAgKi8KKyAgICBzdHJ1Y3QgQmFzZVBhcmFtcyA6IEMySW50ZXJmYWNlSGVscGVyIHsKKyAgICAgICAgZXhwbGljaXQgQmFzZVBhcmFtcygKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+ICZoZWxwZXIsCisgICAgICAgICAgICAgICAgQzJTdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICBDMkNvbXBvbmVudDo6a2luZF90IGtpbmQsCisgICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OmRvbWFpbl90IGRvbWFpbiwKKyAgICAgICAgICAgICAgICBDMlN0cmluZyBtZWRpYVR5cGUsCisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QzJTdHJpbmc+IGFsaWFzZXMgPSBzdGQ6OnZlY3RvcjxDMlN0cmluZz4oKSk7CisKKyAgICAgICAgLy8vIE1hcmtzIHRoYXQgdGhpcyBjb21wb25lbnQgaGFzIG5vIGlucHV0IGxhdGVuY3kuIE90aGVyd2lzZSwgY29tcG9uZW50IG11c3QKKyAgICAgICAgLy8vIGFkZCBzdXBwb3J0IGZvciBDMlBvcnRSZXF1ZXN0ZWREZWxheVR1bmluZzo6aW5wdXQgYW5kIEMyUG9ydEFjdHVhbERlbGF5VHVuaW5nOjppbnB1dC4KKyAgICAgICAgdm9pZCBub0lucHV0TGF0ZW5jeSgpOworCisgICAgICAgIC8vLyBNYXJrcyB0aGF0IHRoaXMgY29tcG9uZW50IGhhcyBubyBvdXRwdXQgbGF0ZW5jeS4gT3RoZXJ3aXNlLCBjb21wb25lbnQgbXVzdAorICAgICAgICAvLy8gYWRkIHN1cHBvcnQgZm9yIEMyUG9ydFJlcXVlc3RlZERlbGF5VHVuaW5nOjpvdXRwdXQgYW5kIEMyUG9ydEFjdHVhbERlbGF5VHVuaW5nOjpvdXRwdXQuCisgICAgICAgIHZvaWQgbm9PdXRwdXRMYXRlbmN5KCk7CisKKyAgICAgICAgLy8vIE1hcmtzIHRoYXQgdGhpcyBjb21wb25lbnQgaGFzIG5vIHBpcGVsaW5lIGxhdGVuY3kuIE90aGVyd2lzZSwgY29tcG9uZW50IG11c3QKKyAgICAgICAgLy8vIGFkZCBzdXBwb3J0IGZvciBDMlJlcXVlc3RlZFBpcGVsaW5lRGVsYXlUdW5pbmcgYW5kIEMyQWN0dWFsUGlwZWxpbmVEZWxheVR1bmluZy4KKyAgICAgICAgdm9pZCBub1BpcGVsaW5lTGF0ZW5jeSgpOworCisgICAgICAgIC8vLyBNYXJrcyB0aGF0IHRoaXMgY29tcG9uZW50IGhhcyBubyBuZWVkIGZvciBwcml2YXRlIGJ1ZmZlcnMuIE90aGVyd2lzZSwgY29tcG9uZW50IG11c3QKKyAgICAgICAgLy8vIGFkZCBzdXBwb3J0IGZvciBDMk1heFByaXZhdGVCdWZmZXJDb3VudFR1bmluZywgQzJQcml2YXRlQWxsb2NhdG9yc1R1bmluZyBhbmQKKyAgICAgICAgLy8vIEMyUHJpdmF0ZUJsb2NrUG9vbHNUdW5pbmcuCisgICAgICAgIHZvaWQgbm9Qcml2YXRlQnVmZmVycygpOworCisgICAgICAgIC8vLyBNYXJrcyB0aGF0IHRoaXMgY29tcG9uZW50IGhvbGRzIG5vIHJlZmVyZW5jZXMgdG8gaW5wdXQgYnVmZmVycy4gT3RoZXJ3aXNlLCBjb21wb25lbnQKKyAgICAgICAgLy8vIG11c3QgYWRkIHN1cHBvcnQgZm9yIEMyU3RyZWFtTWF4UmVmZXJlbmNlQWdlVHVuaW5nOjppbnB1dCBhbmQKKyAgICAgICAgLy8vIEMyU3RyZWFtTWF4UmVmZXJlbmNlQ291bnRUdW5pbmc6OmlucHV0LgorICAgICAgICB2b2lkIG5vSW5wdXRSZWZlcmVuY2VzKCk7CisKKyAgICAgICAgLy8vIE1hcmtzIHRoYXQgdGhpcyBjb21wb25lbnQgaG9sZHMgbm8gcmVmZXJlbmNlcyB0byBvdXRwdXQgYnVmZmVycy4gT3RoZXJ3aXNlLCBjb21wb25lbnQKKyAgICAgICAgLy8vIG11c3QgYWRkIHN1cHBvcnQgZm9yIEMyU3RyZWFtTWF4UmVmZXJlbmNlQWdlVHVuaW5nOjpvdXRwdXQgYW5kCisgICAgICAgIC8vLyBDMlN0cmVhbU1heFJlZmVyZW5jZUNvdW50VHVuaW5nOjpvdXRwdXQuCisgICAgICAgIHZvaWQgbm9PdXRwdXRSZWZlcmVuY2VzKCk7CisKKyAgICAgICAgLy8vIE1hcmtzIHRoYXQgdGhpcyBjb21wb25lbnQgZG9lcyBub3Qgc3RyZXRjaCB0aW1lLiBPdGhlcndpc2UsIGNvbXBvbmVudAorICAgICAgICAvLy8gbXVzdCBhZGQgc3VwcG9ydCBmb3IgQzJDb21wb25lbnRUaW1lU3RyZXRjaFR1bmluZy4KKyAgICAgICAgdm9pZCBub1RpbWVTdHJldGNoKCk7CisKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQXBpTGV2ZWxTZXR0aW5nPiBtQXBpTGV2ZWw7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFwaUZlYXR1cmVzU2V0dGluZz4gbUFwaUZlYXR1cmVzOworCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBsYXRmb3JtTGV2ZWxTZXR0aW5nPiBtUGxhdGZvcm1MZXZlbDsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGxhdGZvcm1GZWF0dXJlc1NldHRpbmc+IG1QbGF0Zm9ybUZlYXR1cmVzOworCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudE5hbWVTZXR0aW5nPiBtTmFtZTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50QWxpYXNlc1NldHRpbmc+IG1BbGlhc2VzOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRLaW5kU2V0dGluZz4gbUtpbmQ7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudERvbWFpblNldHRpbmc+IG1Eb21haW47CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEF0dHJpYnV0ZXNTZXR0aW5nPiBtQXR0cmliOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRUaW1lU3RyZXRjaFR1bmluZz4gbVRpbWVTdHJldGNoOworCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjppbnB1dD4gbUlucHV0TWVkaWFUeXBlOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6b3V0cHV0PiBtT3V0cHV0TWVkaWFUeXBlOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6aW5wdXQ+IG1JbnB1dEZvcm1hdDsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6Om91dHB1dD4gbU91dHB1dEZvcm1hdDsKKworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0UmVxdWVzdGVkRGVsYXlUdW5pbmc6OmlucHV0PiBtUmVxdWVzdGVkSW5wdXREZWxheTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydFJlcXVlc3RlZERlbGF5VHVuaW5nOjpvdXRwdXQ+IG1SZXF1ZXN0ZWRPdXRwdXREZWxheTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUmVxdWVzdGVkUGlwZWxpbmVEZWxheVR1bmluZz4gbVJlcXVlc3RlZFBpcGVsaW5lRGVsYXk7CisKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydEFjdHVhbERlbGF5VHVuaW5nOjppbnB1dD4gbUFjdHVhbElucHV0RGVsYXk7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRBY3R1YWxEZWxheVR1bmluZzo6b3V0cHV0PiBtQWN0dWFsT3V0cHV0RGVsYXk7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFjdHVhbFBpcGVsaW5lRGVsYXlUdW5pbmc+IG1BY3R1YWxQaXBlbGluZURlbGF5OworCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbU1heFJlZmVyZW5jZUFnZVR1bmluZzo6aW5wdXQ+IG1NYXhJbnB1dFJlZmVyZW5jZUFnZTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtTWF4UmVmZXJlbmNlQ291bnRUdW5pbmc6OmlucHV0PiBtTWF4SW5wdXRSZWZlcmVuY2VDb3VudDsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtTWF4UmVmZXJlbmNlQWdlVHVuaW5nOjpvdXRwdXQ+IG1NYXhPdXRwdXRSZWZlcmVuY2VBZ2U7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbU1heFJlZmVyZW5jZUNvdW50VHVuaW5nOjpvdXRwdXQ+IG1NYXhPdXRwdXRSZWZlcmVuY2VDb3VudDsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyTWF4UHJpdmF0ZUJ1ZmZlckNvdW50VHVuaW5nPiBtTWF4UHJpdmF0ZUJ1ZmZlckNvdW50OworCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRTdHJlYW1Db3VudFR1bmluZzo6aW5wdXQ+IG1JbnB1dFN0cmVhbUNvdW50OworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0U3RyZWFtQ291bnRUdW5pbmc6Om91dHB1dD4gbU91dHB1dFN0cmVhbUNvdW50OworCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN1YnNjcmliZWRQYXJhbUluZGljZXNUdW5pbmc+IG1TdWJzY3JpYmVkUGFyYW1JbmRpY2VzOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0U3VnZ2VzdGVkQnVmZmVyQ291bnRUdW5pbmc6OmlucHV0PiBtU3VnZ2VzdGVkSW5wdXRCdWZmZXJDb3VudDsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydFN1Z2dlc3RlZEJ1ZmZlckNvdW50VHVuaW5nOjpvdXRwdXQ+IG1TdWdnZXN0ZWRPdXRwdXRCdWZmZXJDb3VudDsKKworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDdXJyZW50V29ya1R1bmluZz4gbUN1cnJlbnRXb3JrT3JkaW5hbDsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGFzdFdvcmtRdWV1ZWRUdW5pbmc6OmlucHV0PiBtTGFzdElucHV0UXVldWVkV29ya09yZGluYWw7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxhc3RXb3JrUXVldWVkVHVuaW5nOjpvdXRwdXQ+IG1MYXN0T3V0cHV0UXVldWVkV29ya09yZGluYWw7CisKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydEFsbG9jYXRvcnNUdW5pbmc6OmlucHV0PiBtSW5wdXRBbGxvY2F0b3JzOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0QWxsb2NhdG9yc1R1bmluZzo6b3V0cHV0PiBtT3V0cHV0QWxsb2NhdG9yczsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUHJpdmF0ZUFsbG9jYXRvcnNUdW5pbmc+IG1Qcml2YXRlQWxsb2NhdG9yczsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydEJsb2NrUG9vbHNUdW5pbmc6Om91dHB1dD4gbU91dHB1dFBvb2xJZHM7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlByaXZhdGVCbG9ja1Bvb2xzVHVuaW5nPiBtUHJpdmF0ZVBvb2xJZHM7CisKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyVHJpcHBlZFR1bmluZz4gbVRyaXBwZWQ7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMk91dE9mTWVtb3J5VHVuaW5nPiBtT3V0T2ZNZW1vcnk7CisKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydENvbmZpZ0NvdW50ZXJUdW5pbmc6OmlucHV0PiBtSW5wdXRDb25maWdDb3VudGVyOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0Q29uZmlnQ291bnRlclR1bmluZzo6b3V0cHV0PiBtT3V0cHV0Q29uZmlnQ291bnRlcjsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29uZmlnQ291bnRlclR1bmluZz4gbURpcmVjdENvbmZpZ0NvdW50ZXI7CisgICAgfTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+Cit1c2luZyBTaW1wbGVJbnRlcmZhY2UgPSBTaW1wbGVDMkludGVyZmFjZTxUPjsKKwordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgLi4uQXJncz4KK3N0ZDo6c2hhcmVkX3B0cjxUPiBBbGxvY1NoYXJlZFN0cmluZyhjb25zdCBBcmdzKCYuLi4gYXJncyksIGNvbnN0IGNoYXIgKnN0cikgeworICAgIHNpemVfdCBsZW4gPSBzdHJsZW4oc3RyKSArIDE7CisgICAgc3RkOjpzaGFyZWRfcHRyPFQ+IHJldCA9IFQ6OkFsbG9jU2hhcmVkKGxlbiwgYXJncy4uLik7CisgICAgc3RyY3B5KHJldC0+bS52YWx1ZSwgc3RyKTsKKyAgICByZXR1cm4gcmV0OworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSAuLi5BcmdzPgorc3RkOjpzaGFyZWRfcHRyPFQ+IEFsbG9jU2hhcmVkU3RyaW5nKGNvbnN0IEFyZ3MoJi4uLiBhcmdzKSwgY29uc3Qgc3RkOjpzdHJpbmcgJnN0cikgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxUPiByZXQgPSBUOjpBbGxvY1NoYXJlZChzdHIubGVuZ3RoKCkgKyAxLCBhcmdzLi4uKTsKKyAgICBzdHJjcHkocmV0LT5tLnZhbHVlLCBzdHIuY19zdHIoKSk7CisgICAgcmV0dXJuIHJldDsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgU2V0dGVyIHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6cmVtb3ZlX3JlZmVyZW5jZTxUPjo6dHlwZSB0eXBlOworCisgICAgc3RhdGljIEMyUiBOb25TdHJpY3RWYWx1ZVdpdGhOb0RlcHMoCisgICAgICAgICAgICBib29sIG1heUJsb2NrLCBDMkludGVyZmFjZUhlbHBlcjo6QzJQPHR5cGU+ICZtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgcmV0dXJuIG1lLkYobWUudi52YWx1ZSkudmFsaWRhdGVQb3NzaWJsZShtZS52LnZhbHVlKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIE5vblN0cmljdFZhbHVlc1dpdGhOb0RlcHMoCisgICAgICAgICAgICBib29sIG1heUJsb2NrLCBDMkludGVyZmFjZUhlbHBlcjo6QzJQPHR5cGU+ICZtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgQzJSIHJlcyA9IEMyUjo6T2soKTsKKyAgICAgICAgZm9yIChzaXplX3QgaXggPSAwOyBpeCA8IG1lLnYuZmxleENvdW50KCk7ICsraXgpIHsKKyAgICAgICAgICAgIHJlcy5wbHVzKG1lLkYobWUudi5tLnZhbHVlc1tpeF0pLnZhbGlkYXRlUG9zc2libGUobWUudi5tLnZhbHVlc1tpeF0pKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgU3RyaWN0VmFsdWVXaXRoTm9EZXBzKAorICAgICAgICAgICAgYm9vbCBtYXlCbG9jaywKKyAgICAgICAgICAgIGNvbnN0IEMySW50ZXJmYWNlSGVscGVyOjpDMlA8dHlwZT4gJm9sZCwKKyAgICAgICAgICAgIEMySW50ZXJmYWNlSGVscGVyOjpDMlA8dHlwZT4gJm1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICBpZiAoIW1lLkYobWUudi52YWx1ZSkuc3VwcG9ydHNOb3cobWUudi52YWx1ZSkpIHsKKyAgICAgICAgICAgIG1lLnNldCgpLnZhbHVlID0gb2xkLnYudmFsdWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1lLkYobWUudi52YWx1ZSkudmFsaWRhdGVQb3NzaWJsZShtZS52LnZhbHVlKTsKKyAgICB9Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfU0lNUExFX0MyX0lOVEVSRkFDRV9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvY21kcy9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvY21kcy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5NGRmZWUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9jbWRzL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw0MCBAQAorY2NfYmluYXJ5IHsKKyAgICBuYW1lOiAiY29kZWMycGxheSIsCisgICAgZGVmYXVsdHM6IFsibGliY29kZWMyLWltcGwtZGVmYXVsdHMiXSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgImNvZGVjMi5jcHAiLAorICAgIF0sCisKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmJhc2UiLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJndWkiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYm1lZGlhZXh0cmFjdG9yIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0IiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgICAgICAibGlidWkiLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdhbGwiLAorICAgIF0sCisKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBjZmk6IHRydWUsCisgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCisgICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICBdLAorICAgICAgICBkaWFnOiB7CisgICAgICAgICAgICBjZmk6IHRydWUsCisgICAgICAgIH0sCisgICAgfSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2NtZHMvY29kZWMyLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2NtZHMvY29kZWMyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMmNmNTQ1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvY21kcy9jb2RlYzIuY3BwCkBAIC0wLDAgKzEsNDgzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisKKyNpbmNsdWRlIDx0aHJlYWQ+CisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiY29kZWMyIgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUHJvY2Vzc1N0YXRlLmg+CisjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL0lDcnlwdG8uaD4KKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZUZhY3RvcnkuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yRmFjdG9yeS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KKworI2luY2x1ZGUgPGd1aS9HTENvbnN1bWVyLmg+CisjaW5jbHVkZSA8Z3VpL0lQcm9kdWNlckxpc3RlbmVyLmg+CisjaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KKyNpbmNsdWRlIDxndWkvU3VyZmFjZUNvbXBvc2VyQ2xpZW50Lmg+CisKKyNpbmNsdWRlIDxDMkFsbG9jYXRvckdyYWxsb2MuaD4KKyNpbmNsdWRlIDxDMkJ1ZmZlci5oPgorI2luY2x1ZGUgPEMyQnVmZmVyUHJpdi5oPgorI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8QzJDb25maWcuaD4KKyNpbmNsdWRlIDxDMkRlYnVnLmg+CisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxDMldvcmsuaD4KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7Cit1c2luZyBuYW1lc3BhY2Ugc3RkOjpjaHJvbm9fbGl0ZXJhbHM7CisKK25hbWVzcGFjZSB7CisKK2NsYXNzIExpbmVhckJ1ZmZlciA6IHB1YmxpYyBDMkJ1ZmZlciB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgTGluZWFyQnVmZmVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiAmYmxvY2spCisgICAgICAgIDogQzJCdWZmZXIoeyBibG9jay0+c2hhcmUoYmxvY2stPm9mZnNldCgpLCBibG9jay0+c2l6ZSgpLCA6OkMyRmVuY2UoKSkgfSkge30KK307CisKK2NsYXNzIExpc3RlbmVyOworCitjbGFzcyBTaW1wbGVQbGF5ZXIgeworcHVibGljOgorICAgIFNpbXBsZVBsYXllcigpOworICAgIH5TaW1wbGVQbGF5ZXIoKTsKKworICAgIHZvaWQgb25Xb3JrRG9uZShzdGQ6OndlYWtfcHRyPEMyQ29tcG9uZW50PiBjb21wb25lbnQsCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gd29ya0l0ZW1zKTsKKyAgICB2b2lkIG9uVHJpcHBlZChzdGQ6OndlYWtfcHRyPEMyQ29tcG9uZW50PiBjb21wb25lbnQsCisgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IHNldHRpbmdSZXN1bHQpOworICAgIHZvaWQgb25FcnJvcihzdGQ6OndlYWtfcHRyPEMyQ29tcG9uZW50PiBjb21wb25lbnQsIHVpbnQzMl90IGVycm9yQ29kZSk7CisKKyAgICB2b2lkIHBsYXkoY29uc3Qgc3A8SU1lZGlhU291cmNlPiAmc291cmNlKTsKKworcHJpdmF0ZToKKyAgICB0eXBlZGVmIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gVUxvY2s7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8TGlzdGVuZXI+IG1MaXN0ZW5lcjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+IG1Db21wb25lbnQ7CisKKyAgICBzcDxJUHJvZHVjZXJMaXN0ZW5lcj4gbVByb2R1Y2VyTGlzdGVuZXI7CisKKyAgICBzdGQ6OmF0b21pY19pbnQgbUxpbmVhclBvb2xJZDsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gbUFsbG9jSW9uOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gbUxpbmVhclBvb2w7CisKKyAgICBzdGQ6Om11dGV4IG1RdWV1ZUxvY2s7CisgICAgc3RkOjpjb25kaXRpb25fdmFyaWFibGUgbVF1ZXVlQ29uZGl0aW9uOworICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gbVdvcmtRdWV1ZTsKKworICAgIHN0ZDo6bXV0ZXggbVByb2Nlc3NlZExvY2s7CisgICAgc3RkOjpjb25kaXRpb25fdmFyaWFibGUgbVByb2Nlc3NlZENvbmRpdGlvbjsKKyAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IG1Qcm9jZXNzZWRXb3JrOworCisgICAgc3A8U3VyZmFjZT4gbVN1cmZhY2U7CisgICAgc3A8U3VyZmFjZUNvbXBvc2VyQ2xpZW50PiBtQ29tcG9zZXJDbGllbnQ7CisgICAgc3A8U3VyZmFjZUNvbnRyb2w+IG1Db250cm9sOworfTsKKworY2xhc3MgTGlzdGVuZXIgOiBwdWJsaWMgQzJDb21wb25lbnQ6Okxpc3RlbmVyIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBMaXN0ZW5lcihTaW1wbGVQbGF5ZXIgKnRoaXopIDogbVRoaXModGhpeikge30KKyAgICB2aXJ0dWFsIH5MaXN0ZW5lcigpID0gZGVmYXVsdDsKKworICAgIHZpcnR1YWwgdm9pZCBvbldvcmtEb25lX25iKHN0ZDo6d2Vha19wdHI8QzJDb21wb25lbnQ+IGNvbXBvbmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IHdvcmtJdGVtcykgb3ZlcnJpZGUgeworICAgICAgICBtVGhpcy0+b25Xb3JrRG9uZShjb21wb25lbnQsIHN0ZDo6bW92ZSh3b3JrSXRlbXMpKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgb25UcmlwcGVkX25iKHN0ZDo6d2Vha19wdHI8QzJDb21wb25lbnQ+IGNvbXBvbmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBzZXR0aW5nUmVzdWx0KSBvdmVycmlkZSB7CisgICAgICAgIG1UaGlzLT5vblRyaXBwZWQoY29tcG9uZW50LCBzZXR0aW5nUmVzdWx0KTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgb25FcnJvcl9uYihzdGQ6OndlYWtfcHRyPEMyQ29tcG9uZW50PiBjb21wb25lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZXJyb3JDb2RlKSBvdmVycmlkZSB7CisgICAgICAgIG1UaGlzLT5vbkVycm9yKGNvbXBvbmVudCwgZXJyb3JDb2RlKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgU2ltcGxlUGxheWVyICogY29uc3QgbVRoaXM7Cit9OworCisKK1NpbXBsZVBsYXllcjo6U2ltcGxlUGxheWVyKCkKKyAgICA6IG1MaXN0ZW5lcihuZXcgTGlzdGVuZXIodGhpcykpLAorICAgICAgbVByb2R1Y2VyTGlzdGVuZXIobmV3IER1bW15UHJvZHVjZXJMaXN0ZW5lciksCisgICAgICBtTGluZWFyUG9vbElkKEMyQmxvY2tQb29sOjpQTEFURk9STV9TVEFSVCksCisgICAgICBtQ29tcG9zZXJDbGllbnQobmV3IFN1cmZhY2VDb21wb3NlckNsaWVudCkgeworICAgIENIRUNLX0VRKG1Db21wb3NlckNsaWVudC0+aW5pdENoZWNrKCksIChzdGF0dXNfdClPSyk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3JTdG9yZT4gc3RvcmUgPSBHZXRDb2RlYzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlKCk7CisgICAgQ0hFQ0tfRVEoc3RvcmUtPmZldGNoQWxsb2NhdG9yKEMyQWxsb2NhdG9yU3RvcmU6OkRFRkFVTFRfTElORUFSLCAmbUFsbG9jSW9uKSwgQzJfT0spOworICAgIG1MaW5lYXJQb29sID0gc3RkOjptYWtlX3NoYXJlZDxDMlBvb2xlZEJsb2NrUG9vbD4obUFsbG9jSW9uLCBtTGluZWFyUG9vbElkKyspOworCisgICAgbUNvbnRyb2wgPSBtQ29tcG9zZXJDbGllbnQtPmNyZWF0ZVN1cmZhY2UoCisgICAgICAgICAgICBTdHJpbmc4KCJBIFN1cmZhY2UiKSwKKyAgICAgICAgICAgIDEyODAsCisgICAgICAgICAgICA4MDAsCisgICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUX1lWMTIpOworICAgICAgICAgICAgLy9QSVhFTF9GT1JNQVRfUkdCXzU2NSk7CisKKyAgICBDSEVDSyhtQ29udHJvbCAhPSBudWxscHRyKTsKKyAgICBDSEVDSyhtQ29udHJvbC0+aXNWYWxpZCgpKTsKKworICAgIFN1cmZhY2VDb21wb3NlckNsaWVudDo6VHJhbnNhY3Rpb257fQorICAgICAgICAgICAgLnNldExheWVyKG1Db250cm9sLCBJTlRfTUFYKQorICAgICAgICAgICAgLnNob3cobUNvbnRyb2wpCisgICAgICAgICAgICAuYXBwbHkoKTsKKworICAgIG1TdXJmYWNlID0gbUNvbnRyb2wtPmdldFN1cmZhY2UoKTsKKyAgICBDSEVDSyhtU3VyZmFjZSAhPSBudWxscHRyKTsKKyAgICBtU3VyZmFjZS0+Y29ubmVjdChOQVRJVkVfV0lORE9XX0FQSV9DUFUsIG1Qcm9kdWNlckxpc3RlbmVyKTsKK30KKworU2ltcGxlUGxheWVyOjp+U2ltcGxlUGxheWVyKCkgeworICAgIG1Db21wb3NlckNsaWVudC0+ZGlzcG9zZSgpOworfQorCit2b2lkIFNpbXBsZVBsYXllcjo6b25Xb3JrRG9uZSgKKyAgICAgICAgc3RkOjp3ZWFrX3B0cjxDMkNvbXBvbmVudD4gY29tcG9uZW50LCBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IHdvcmtJdGVtcykgeworICAgIEFMT0dWKCJTaW1wbGVQbGF5ZXI6Om9uV29ya0RvbmUiKTsKKyAgICAodm9pZCkgY29tcG9uZW50OworICAgIFVMb2NrIGwobVByb2Nlc3NlZExvY2spOworICAgIGZvciAoYXV0byAmIGl0ZW0gOiB3b3JrSXRlbXMpIHsKKyAgICAgICAgbVByb2Nlc3NlZFdvcmsucHVzaF9iYWNrKHN0ZDo6bW92ZShpdGVtKSk7CisgICAgfQorICAgIG1Qcm9jZXNzZWRDb25kaXRpb24ubm90aWZ5X2FsbCgpOworfQorCit2b2lkIFNpbXBsZVBsYXllcjo6b25UcmlwcGVkKAorICAgICAgICBzdGQ6OndlYWtfcHRyPEMyQ29tcG9uZW50PiBjb21wb25lbnQsCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBzZXR0aW5nUmVzdWx0KSB7CisgICAgKHZvaWQpIGNvbXBvbmVudDsKKyAgICAodm9pZCkgc2V0dGluZ1Jlc3VsdDsKKyAgICAvLyBUT0RPCit9CisKK3ZvaWQgU2ltcGxlUGxheWVyOjpvbkVycm9yKHN0ZDo6d2Vha19wdHI8QzJDb21wb25lbnQ+IGNvbXBvbmVudCwgdWludDMyX3QgZXJyb3JDb2RlKSB7CisgICAgKHZvaWQpIGNvbXBvbmVudDsKKyAgICAodm9pZCkgZXJyb3JDb2RlOworICAgIC8vIFRPRE8KK30KKwordm9pZCBTaW1wbGVQbGF5ZXI6OnBsYXkoY29uc3Qgc3A8SU1lZGlhU291cmNlPiAmc291cmNlKSB7CisgICAgQUxPR1YoIlNpbXBsZVBsYXllcjo6cGxheSIpOworICAgIHNwPEFNZXNzYWdlPiBmb3JtYXQ7CisgICAgKHZvaWQpIGNvbnZlcnRNZXRhRGF0YVRvTWVzc2FnZShzb3VyY2UtPmdldEZvcm1hdCgpLCAmZm9ybWF0KTsKKworICAgIHNwPEFCdWZmZXI+IGNzZDAsIGNzZDE7CisgICAgZm9ybWF0LT5maW5kQnVmZmVyKCJjc2QtMCIsICZjc2QwKTsKKyAgICBmb3JtYXQtPmZpbmRCdWZmZXIoImNzZC0xIiwgJmNzZDEpOworCisgICAgc3RhdHVzX3QgZXJyID0gc291cmNlLT5zdGFydCgpOworCisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInNvdXJjZSByZXR1cm5lZCBlcnJvciAlZCAoMHglMDh4KVxuIiwgZXJyLCBlcnIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50U3RvcmU+IHN0b3JlID0gR2V0Q29kZWMyUGxhdGZvcm1Db21wb25lbnRTdG9yZSgpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4gY29tcG9uZW50OworICAgICh2b2lkKXN0b3JlLT5jcmVhdGVDb21wb25lbnQoImMyLmFuZHJvaWQuYXZjLmRlY29kZXIiLCAmY29tcG9uZW50KTsKKworICAgICh2b2lkKWNvbXBvbmVudC0+c2V0TGlzdGVuZXJfdmIobUxpc3RlbmVyLCBDMl9ET05UX0JMT0NLKTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJQb3J0QmxvY2tQb29sc1R1bmluZzo6b3V0cHV0PiBwb29scyA9CisgICAgICAgIEMyUG9ydEJsb2NrUG9vbHNUdW5pbmc6Om91dHB1dDo6QWxsb2NVbmlxdWUoeyAodWludDY0X3QpQzJCbG9ja1Bvb2w6OkJBU0lDX0dSQVBISUMgfSk7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IHJlc3VsdDsKKyAgICAodm9pZCljb21wb25lbnQtPmludGYoKS0+Y29uZmlnX3ZiKHtwb29scy5nZXQoKX0sIEMyX0RPTlRfQkxPQ0ssICZyZXN1bHQpOworICAgIGNvbXBvbmVudC0+c3RhcnQoKTsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgODsgKytpKSB7CisgICAgICAgIG1Xb3JrUXVldWUuZW1wbGFjZV9iYWNrKG5ldyBDMldvcmspOworICAgIH0KKworICAgIHN0ZDo6YXRvbWljX2Jvb2wgcnVubmluZyh0cnVlKTsKKyAgICBzdGQ6OnRocmVhZCBzdXJmYWNlVGhyZWFkKFt0aGlzLCAmcnVubmluZ10oKSB7CisgICAgICAgIGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+ICZpZ2JwID0gbVN1cmZhY2UtPmdldElHcmFwaGljQnVmZmVyUHJvZHVjZXIoKTsKKyAgICAgICAgd2hpbGUgKHJ1bm5pbmcpIHsKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+IHdvcms7CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVUxvY2sgbChtUHJvY2Vzc2VkTG9jayk7CisgICAgICAgICAgICAgICAgaWYgKG1Qcm9jZXNzZWRXb3JrLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbVByb2Nlc3NlZENvbmRpdGlvbi53YWl0X2ZvcihsLCAxMDBtcyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChtUHJvY2Vzc2VkV29yay5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3b3JrLnN3YXAobVByb2Nlc3NlZFdvcmsuZnJvbnQoKSk7CisgICAgICAgICAgICAgICAgbVByb2Nlc3NlZFdvcmsucG9wX2Zyb250KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgc2xvdDsKKyAgICAgICAgICAgIHNwPEZlbmNlPiBmZW5jZTsKKyAgICAgICAgICAgIEFMT0dWKCJSZW5kZXI6IEZyYW1lICMlbGxkIiwgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrbGwoKSk7CisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZvdXRwdXQgPSB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVyc1swXTsKKyAgICAgICAgICAgIGlmIChvdXRwdXQpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBDMkNvbnN0R3JhcGhpY0Jsb2NrIGJsb2NrID0gb3V0cHV0LT5kYXRhKCkuZ3JhcGhpY0Jsb2NrcygpLmZyb250KCk7CisgICAgICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICpncmFsbG9jSGFuZGxlID0gVW53cmFwTmF0aXZlQ29kZWMyR3JhbGxvY0hhbmRsZShibG9jay5oYW5kbGUoKSk7CisgICAgICAgICAgICAgICAgc3A8R3JhcGhpY0J1ZmZlcj4gYnVmZmVyKG5ldyBHcmFwaGljQnVmZmVyKAorICAgICAgICAgICAgICAgICAgICAgICAgZ3JhbGxvY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEdyYXBoaWNCdWZmZXI6OkNMT05FX0hBTkRMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrLndpZHRoKCksCisgICAgICAgICAgICAgICAgICAgICAgICBibG9jay5oZWlnaHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9QSVhFTF9GT1JNQVRfWVYxMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAodWludDY0X3QpR1JBTExPQ19VU0FHRV9TV19SRUFEX09GVEVOIHwgR1JBTExPQ19VU0FHRV9TV19XUklURV9PRlRFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrLndpZHRoKCkpKTsKKyAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShncmFsbG9jSGFuZGxlKTsKKworICAgICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IGlnYnAtPmF0dGFjaEJ1ZmZlcigmc2xvdCwgYnVmZmVyKTsKKworICAgICAgICAgICAgICAgIElHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXQgcWJpKAorICAgICAgICAgICAgICAgICAgICAgICAgKHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsLnRpbWVzdGFtcCAqIDEwMDBsbCkucGVla2xsKCksCisgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9EQVRBU1BBQ0VfVU5LTk9XTiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFJlY3QoYmxvY2sud2lkdGgoKSwgYmxvY2suaGVpZ2h0KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgTkFUSVZFX1dJTkRPV19TQ0FMSU5HX01PREVfU0NBTEVfVE9fV0lORE9XLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZlbmNlOjpOT19GRU5DRSwKKyAgICAgICAgICAgICAgICAgICAgICAgIDApOworICAgICAgICAgICAgICAgIElHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVyT3V0cHV0IHFibzsKKyAgICAgICAgICAgICAgICBlcnIgPSBpZ2JwLT5xdWV1ZUJ1ZmZlcihzbG90LCBxYmksICZxYm8pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5jbGVhcigpOworCisgICAgICAgICAgICBVTG9jayBsKG1RdWV1ZUxvY2spOworICAgICAgICAgICAgbVdvcmtRdWV1ZS5wdXNoX2JhY2soc3RkOjptb3ZlKHdvcmspKTsKKyAgICAgICAgICAgIG1RdWV1ZUNvbmRpdGlvbi5ub3RpZnlfYWxsKCk7CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoInJlbmRlciBsb29wIGZpbmlzaGVkIik7CisgICAgfSk7CisKKyAgICBsb25nIG51bUZyYW1lcyA9IDA7CisgICAgbUxpbmVhclBvb2wucmVzZXQobmV3IEMyUG9vbGVkQmxvY2tQb29sKG1BbGxvY0lvbiwgbUxpbmVhclBvb2xJZCsrKSk7CisKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIHNpemVfdCBzaXplID0gMHU7CisgICAgICAgIHZvaWQgKmRhdGEgPSBudWxscHRyOworICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcCA9IDB1OworICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlciA9IG51bGxwdHI7CisgICAgICAgIHNwPEFCdWZmZXI+IGNzZDsKKyAgICAgICAgaWYgKGNzZDAgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgY3NkID0gY3NkMDsKKyAgICAgICAgICAgIGNzZDAgPSBudWxscHRyOworICAgICAgICB9IGVsc2UgaWYgKGNzZDEgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgY3NkID0gY3NkMTsKKyAgICAgICAgICAgIGNzZDEgPSBudWxscHRyOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gc291cmNlLT5yZWFkKCZidWZmZXIpOworICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgIENIRUNLKGJ1ZmZlciA9PSBudWxscHRyKTsKKworICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gSU5GT19GT1JNQVRfQ0hBTkdFRCkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSA9IGJ1ZmZlci0+bWV0YV9kYXRhKCk7CisgICAgICAgICAgICBDSEVDSyhtZXRhLmZpbmRJbnQ2NChrS2V5VGltZSwgJnRpbWVzdGFtcCkpOworCisgICAgICAgICAgICBzaXplID0gYnVmZmVyLT5zaXplKCk7CisgICAgICAgICAgICBkYXRhID0gYnVmZmVyLT5kYXRhKCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY3NkICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHNpemUgPSBjc2QtPnNpemUoKTsKKyAgICAgICAgICAgIGRhdGEgPSBjc2QtPmRhdGEoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFByZXBhcmUgQzJXb3JrCisKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gd29yazsKKyAgICAgICAgd2hpbGUgKCF3b3JrKSB7CisgICAgICAgICAgICBVTG9jayBsKG1RdWV1ZUxvY2spOworICAgICAgICAgICAgaWYgKCFtV29ya1F1ZXVlLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICB3b3JrLnN3YXAobVdvcmtRdWV1ZS5mcm9udCgpKTsKKyAgICAgICAgICAgICAgICBtV29ya1F1ZXVlLnBvcF9mcm9udCgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtUXVldWVDb25kaXRpb24ud2FpdF9mb3IobCwgMTAwbXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHdvcmstPmlucHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KTA7CisgICAgICAgIHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wID0gdGltZXN0YW1wOworICAgICAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXggPSBudW1GcmFtZXM7CisKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IGJsb2NrOworICAgICAgICBtTGluZWFyUG9vbC0+ZmV0Y2hMaW5lYXJCbG9jaygKKyAgICAgICAgICAgICAgICBzaXplLAorICAgICAgICAgICAgICAgIHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9LAorICAgICAgICAgICAgICAgICZibG9jayk7CisgICAgICAgIEMyV3JpdGVWaWV3IHZpZXcgPSBibG9jay0+bWFwKCkuZ2V0KCk7CisgICAgICAgIGlmICh2aWV3LmVycm9yKCkgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQzJMaW5lYXJCbG9jazo6bWFwKCkgZmFpbGVkIDogJWQiLCB2aWV3LmVycm9yKCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgbWVtY3B5KHZpZXcuYmFzZSgpLCBkYXRhLCBzaXplKTsKKworICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuZW1wbGFjZV9iYWNrKG5ldyBMaW5lYXJCdWZmZXIoYmxvY2spKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuY2xlYXIoKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZW1wbGFjZV9iYWNrKG5ldyBDMldvcmtsZXQpOworCisgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gaXRlbXM7CisgICAgICAgIGl0ZW1zLnB1c2hfYmFjayhzdGQ6Om1vdmUod29yaykpOworCisgICAgICAgIEFMT0dWKCJGcmFtZSAjJWxkIHNpemUgPSAlenUiLCBudW1GcmFtZXMsIHNpemUpOworICAgICAgICAvLyBETyBUSEUgREVDT0RJTkcKKyAgICAgICAgY29tcG9uZW50LT5xdWV1ZV9uYigmaXRlbXMpOworCisgICAgICAgIGlmIChidWZmZXIpIHsKKyAgICAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgYnVmZmVyID0gbnVsbHB0cjsKKyAgICAgICAgfQorCisgICAgICAgICsrbnVtRnJhbWVzOworICAgIH0KKyAgICBBTE9HVigibWFpbiBsb29wIGZpbmlzaGVkIik7CisgICAgc291cmNlLT5zdG9wKCk7CisgICAgcnVubmluZy5zdG9yZShmYWxzZSk7CisgICAgc3VyZmFjZVRocmVhZC5qb2luKCk7CisKKyAgICBjb21wb25lbnQtPnJlbGVhc2UoKTsKKyAgICBwcmludGYoIlxuIik7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCitzdGF0aWMgdm9pZCB1c2FnZShjb25zdCBjaGFyICptZSkgeworICAgIGZwcmludGYoc3RkZXJyLCAidXNhZ2U6ICVzIFtvcHRpb25zXSBbaW5wdXRfZmlsZW5hbWVdXG4iLCBtZSk7CisgICAgZnByaW50ZihzdGRlcnIsICIgICAgICAgLWgoZWxwKVxuIik7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgeworICAgIGFuZHJvaWQ6OlByb2Nlc3NTdGF0ZTo6c2VsZigpLT5zdGFydFRocmVhZFBvb2woKTsKKworICAgIGludCByZXM7CisgICAgd2hpbGUgKChyZXMgPSBnZXRvcHQoYXJnYywgYXJndiwgImgiKSkgPj0gMCkgeworICAgICAgICBzd2l0Y2ggKHJlcykgeworICAgICAgICAgICAgY2FzZSAnaCc6CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVzYWdlKGFyZ3ZbMF0pOworICAgICAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBhcmdjIC09IG9wdGluZDsKKyAgICBhcmd2ICs9IG9wdGluZDsKKworICAgIGlmIChhcmdjIDwgMSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIk5vIGlucHV0IGZpbGUgc3BlY2lmaWVkXG4iKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgc3RhdHVzX3QgZXJyID0gT0s7CisgICAgU2ltcGxlUGxheWVyIHBsYXllcjsKKworICAgIGZvciAoaW50IGsgPSAwOyBrIDwgYXJnYyAmJiBlcnIgPT0gT0s7ICsraykgeworICAgICAgICBjb25zdCBjaGFyICpmaWxlbmFtZSA9IGFyZ3Zba107CisKKyAgICAgICAgc3A8RGF0YVNvdXJjZT4gZGF0YVNvdXJjZSA9CisgICAgICAgICAgICBEYXRhU291cmNlRmFjdG9yeTo6Q3JlYXRlRnJvbVVSSShudWxscHRyIC8qIGh0dHBTZXJ2aWNlICovLCBmaWxlbmFtZSk7CisKKyAgICAgICAgaWYgKHN0cm5jYXNlY21wKGZpbGVuYW1lLCAic2luZToiLCA1KSAmJiBkYXRhU291cmNlID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiVW5hYmxlIHRvIGNyZWF0ZSBkYXRhIHNvdXJjZS5cbiIpOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKworICAgICAgICBWZWN0b3I8c3A8SU1lZGlhU291cmNlPiA+IG1lZGlhU291cmNlczsKKyAgICAgICAgc3A8SU1lZGlhU291cmNlPiBtZWRpYVNvdXJjZTsKKworICAgICAgICBzcDxJTWVkaWFFeHRyYWN0b3I+IGV4dHJhY3RvciA9IE1lZGlhRXh0cmFjdG9yRmFjdG9yeTo6Q3JlYXRlKGRhdGFTb3VyY2UpOworCisgICAgICAgIGlmIChleHRyYWN0b3IgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJjb3VsZCBub3QgY3JlYXRlIGV4dHJhY3Rvci5cbiIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBleHRyYWN0b3ItPmdldE1ldGFEYXRhKCk7CisKKyAgICAgICAgaWYgKG1ldGEgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgY29uc3QgY2hhciAqbWltZTsKKyAgICAgICAgICAgIGlmICghbWV0YS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImV4dHJhY3RvciBkaWQgbm90IHByb3ZpZGUgTUlNRSB0eXBlLlxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc2l6ZV90IG51bVRyYWNrcyA9IGV4dHJhY3Rvci0+Y291bnRUcmFja3MoKTsKKworICAgICAgICBzaXplX3QgaTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bVRyYWNrczsgKytpKSB7CisgICAgICAgICAgICBtZXRhID0gZXh0cmFjdG9yLT5nZXRUcmFja01ldGFEYXRhKGksIDApOworCisgICAgICAgICAgICBpZiAobWV0YSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb25zdCBjaGFyICptaW1lOworICAgICAgICAgICAgbWV0YS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSk7CisKKyAgICAgICAgICAgIC8vIFRPRE86IGFsbG93aW5nIEFWQyBvbmx5IGZvciB0aGUgdGltZSBiZWluZworICAgICAgICAgICAgaWYgKCFzdHJuY2FzZWNtcChtaW1lLCAidmlkZW8vYXZjIiwgOSkpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbWV0YSA9IG51bGxwdHI7CisgICAgICAgIH0KKworICAgICAgICBpZiAobWV0YSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIk5vIEFWQyB0cmFjayBmb3VuZC5cbiIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgbWVkaWFTb3VyY2UgPSBleHRyYWN0b3ItPmdldFRyYWNrKGkpOworICAgICAgICBpZiAobWVkaWFTb3VyY2UgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJza2lwIE5VTEwgdHJhY2sgJXp1LCB0b3RhbCB0cmFja3MgJXp1LlxuIiwgaSwgbnVtVHJhY2tzKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIHBsYXllci5wbGF5KG1lZGlhU291cmNlKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2ZsYWMvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2ZsYWMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDg1OTY0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZmxhYy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMjcgQEAKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfZmxhY2RlYyIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3Nhbml0aXplX2FsbC1kZWZhdWx0cyIsCisgICAgXSwKKworICAgIGhlYWRlcl9saWJzOiBbImxpYkZMQUMtaGVhZGVycyJdLAorCisgICAgc3JjczogWyJDMlNvZnRGbGFjRGVjLmNwcCJdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZsYWNkZWMiLAorICAgIF0sCit9CisKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfZmxhY2VuYyIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3Nhbml0aXplX2FsbC1kZWZhdWx0cyIsCisgICAgXSwKKworICAgIHNyY3M6IFsiQzJTb2Z0RmxhY0VuYy5jcHAiXSwKKworICAgIHN0YXRpY19saWJzOiBbImxpYkZMQUMiXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2ZsYWMvQzJTb2Z0RmxhY0RlYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9mbGFjL0MyU29mdEZsYWNEZWMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxZTJmNTEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9mbGFjL0MyU29mdEZsYWNEZWMuY3BwCkBAIC0wLDAgKzEsMzcyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDMlNvZnRGbGFjRGVjIgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmg+CisKKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPFNpbXBsZUMySW50ZXJmYWNlLmg+CisKKyNpbmNsdWRlICJDMlNvZnRGbGFjRGVjLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY29uc3RleHByIGNoYXIgQ09NUE9ORU5UX05BTUVbXSA9ICJjMi5hbmRyb2lkLmZsYWMuZGVjb2RlciI7CisKK2NsYXNzIEMyU29mdEZsYWNEZWM6OkludGZJbXBsIDogcHVibGljIEMySW50ZXJmYWNlSGVscGVyIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBJbnRmSW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+ICZoZWxwZXIpCisgICAgICAgIDogQzJJbnRlcmZhY2VIZWxwZXIoaGVscGVyKSB7CisKKyAgICAgICAgc2V0RGVyaXZlZEluc3RhbmNlKHRoaXMpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRGb3JtYXQsIEMyX05BTUVfSU5QVVRfU1RSRUFNX0ZPUk1BVF9TRVRUSU5HKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1Gb3JtYXRDb25maWc6OmlucHV0KDB1LCBDMkZvcm1hdENvbXByZXNzZWQpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obU91dHB1dEZvcm1hdCwgQzJfTkFNRV9PVVRQVVRfU1RSRUFNX0ZPUk1BVF9TRVRUSU5HKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1Gb3JtYXRDb25maWc6Om91dHB1dCgwdSwgQzJGb3JtYXRBdWRpbykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRNZWRpYVR5cGUsIEMyX05BTUVfSU5QVVRfUE9SVF9NSU1FX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKEFsbG9jU2hhcmVkU3RyaW5nPEMyUG9ydE1pbWVDb25maWc6OmlucHV0PigKKyAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX0ZMQUMpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obU91dHB1dE1lZGlhVHlwZSwgQzJfTkFNRV9PVVRQVVRfUE9SVF9NSU1FX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKEFsbG9jU2hhcmVkU3RyaW5nPEMyUG9ydE1pbWVDb25maWc6Om91dHB1dD4oCisgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19SQVcpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVNhbXBsZVJhdGUsIEMyX05BTUVfU1RSRUFNX1NBTVBMRV9SQVRFX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjpvdXRwdXQoMHUsIDQ0MTAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1TYW1wbGVSYXRlLCB2YWx1ZSkuaW5SYW5nZSgxLCA2NTUzNTApfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcigoU2V0dGVyPGRlY2x0eXBlKCptU2FtcGxlUmF0ZSk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUNoYW5uZWxDb3VudCwgQzJfTkFNRV9TVFJFQU1fQ0hBTk5FTF9DT1VOVF9TRVRUSU5HKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjpvdXRwdXQoMHUsIDEpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUNoYW5uZWxDb3VudCwgdmFsdWUpLmluUmFuZ2UoMSwgOCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbUNoYW5uZWxDb3VudCk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQml0cmF0ZSwgQzJfTkFNRV9TVFJFQU1fQklUUkFURV9TRVRUSU5HKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJCaXRyYXRlVHVuaW5nOjppbnB1dCgwdSwgNzY4MDAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1CaXRyYXRlLCB2YWx1ZSkuaW5SYW5nZSgxLCAyMTAwMDAwMCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbUJpdHJhdGUpPjo6Tm9uU3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0TWF4QnVmU2l6ZSwgQzJfUEFSQU1LRVlfSU5QVVRfTUFYX0JVRkZFUl9TSVpFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQoMHUsIDMyNzY4KSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgfQorCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUZvcm1hdENvbmZpZzo6aW5wdXQ+IG1JbnB1dEZvcm1hdDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Gb3JtYXRDb25maWc6Om91dHB1dD4gbU91dHB1dEZvcm1hdDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0TWltZUNvbmZpZzo6aW5wdXQ+IG1JbnB1dE1lZGlhVHlwZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0TWltZUNvbmZpZzo6b3V0cHV0PiBtT3V0cHV0TWVkaWFUeXBlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjpvdXRwdXQ+IG1TYW1wbGVSYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86Om91dHB1dD4gbUNoYW5uZWxDb3VudDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCaXRyYXRlVHVuaW5nOjppbnB1dD4gbUJpdHJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0PiBtSW5wdXRNYXhCdWZTaXplOworfTsKKworQzJTb2Z0RmxhY0RlYzo6QzJTb2Z0RmxhY0RlYygKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+ICZpbnRmSW1wbCkKKyAgICA6IFNpbXBsZUMyQ29tcG9uZW50KHN0ZDo6bWFrZV9zaGFyZWQ8U2ltcGxlSW50ZXJmYWNlPEludGZJbXBsPj4obmFtZSwgaWQsIGludGZJbXBsKSksCisgICAgICBtSW50ZihpbnRmSW1wbCksCisgICAgICBtRkxBQ0RlY29kZXIobnVsbHB0cikgeworfQorCitDMlNvZnRGbGFjRGVjOjp+QzJTb2Z0RmxhY0RlYygpIHsKKyAgICBvblJlbGVhc2UoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0RmxhY0RlYzo6b25Jbml0KCkgeworICAgIHN0YXR1c190IGVyciA9IGluaXREZWNvZGVyKCk7CisgICAgcmV0dXJuIGVyciA9PSBPSyA/IEMyX09LIDogQzJfTk9fTUVNT1JZOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRGbGFjRGVjOjpvblN0b3AoKSB7CisgICAgaWYgKG1GTEFDRGVjb2RlcikgbUZMQUNEZWNvZGVyLT5mbHVzaCgpOworICAgIG1lbXNldCgmbVN0cmVhbUluZm8sIDAsIHNpemVvZihtU3RyZWFtSW5mbykpOworICAgIG1IYXNTdHJlYW1JbmZvID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworICAgIHJldHVybiBDMl9PSzsKK30KKwordm9pZCBDMlNvZnRGbGFjRGVjOjpvblJlc2V0KCkgeworICAgIG1JbnB1dEJ1ZmZlckNvdW50ID0gMDsKKyAgICAodm9pZClvblN0b3AoKTsKK30KKwordm9pZCBDMlNvZnRGbGFjRGVjOjpvblJlbGVhc2UoKSB7CisgICAgbUlucHV0QnVmZmVyQ291bnQgPSAwOworICAgIGlmIChtRkxBQ0RlY29kZXIpIGRlbGV0ZSBtRkxBQ0RlY29kZXI7CisgICAgbUZMQUNEZWNvZGVyID0gbnVsbHB0cjsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0RmxhY0RlYzo6b25GbHVzaF9zbSgpIHsKKyAgICByZXR1cm4gb25TdG9wKCk7Cit9CisKK3N0YXR1c190IEMyU29mdEZsYWNEZWM6OmluaXREZWNvZGVyKCkgeworICAgIGlmIChtRkxBQ0RlY29kZXIpIHsKKyAgICAgICAgZGVsZXRlIG1GTEFDRGVjb2RlcjsKKyAgICB9CisgICAgbUZMQUNEZWNvZGVyID0gRkxBQ0RlY29kZXI6OkNyZWF0ZSgpOworICAgIGlmICghbUZMQUNEZWNvZGVyKSB7CisgICAgICAgIEFMT0dFKCJpbml0RGVjb2RlcjogZmFpbGVkIHRvIGNyZWF0ZSBGTEFDRGVjb2RlciIpOworICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgIH0KKworICAgIG1lbXNldCgmbVN0cmVhbUluZm8sIDAsIHNpemVvZihtU3RyZWFtSW5mbykpOworICAgIG1IYXNTdHJlYW1JbmZvID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworICAgIG1JbnB1dEJ1ZmZlckNvdW50ID0gMDsKKworICAgIHJldHVybiBPSzsKK30KKworc3RhdGljIHZvaWQgZmlsbEVtcHR5V29yayhjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykgeworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7Cit9CisKKy8vIChUT0RPKSBhZGQgbXVsdGlmcmFtZSBzdXBwb3J0LCBpbiBwbHVnaW4gYW5kIEZMQUNEZWNvZGVyLmNwcAordm9pZCBDMlNvZnRGbGFjRGVjOjpwcm9jZXNzKAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgIC8vIEluaXRpYWxpemUgb3V0cHV0IHdvcmsKKyAgICB3b3JrLT5yZXN1bHQgPSBDMl9PSzsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKworICAgIGlmIChtU2lnbmFsbGVkRXJyb3IgfHwgbVNpZ25hbGxlZE91dHB1dEVvcykgeworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9CQURfVkFMVUU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBDMlJlYWRWaWV3IHJWaWV3ID0gbUR1bW15UmVhZFZpZXc7CisgICAgc2l6ZV90IGluT2Zmc2V0ID0gMHU7CisgICAgc2l6ZV90IGluU2l6ZSA9IDB1OworICAgIGlmICghd29yay0+aW5wdXQuYnVmZmVycy5lbXB0eSgpKSB7CisgICAgICAgIHJWaWV3ID0gd29yay0+aW5wdXQuYnVmZmVyc1swXS0+ZGF0YSgpLmxpbmVhckJsb2NrcygpLmZyb250KCkubWFwKCkuZ2V0KCk7CisgICAgICAgIGluU2l6ZSA9IHJWaWV3LmNhcGFjaXR5KCk7CisgICAgICAgIGlmIChpblNpemUgJiYgclZpZXcuZXJyb3IoKSkgeworICAgICAgICAgICAgQUxPR0UoInJlYWQgdmlldyBtYXAgZmFpbGVkICVkIiwgclZpZXcuZXJyb3IoKSk7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgICAgYm9vbCBlb3MgPSAod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSAhPSAwOworICAgIGJvb2wgY29kZWNDb25maWcgPSAod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19DT0RFQ19DT05GSUcpICE9IDA7CisKKyAgICBBTE9HVigiaW4gYnVmZmVyIGF0dHIuIHNpemUgJXp1IHRpbWVzdGFtcCAlZCBmcmFtZWluZGV4ICVkIiwgaW5TaXplLAorICAgICAgICAgIChpbnQpd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAucGVla3UoKSwgKGludCl3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKSk7CisKKyAgICBpZiAoaW5TaXplID09IDApIHsKKyAgICAgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICAgICAgaWYgKGVvcykgeworICAgICAgICAgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IHRydWU7CisgICAgICAgICAgICBBTE9HVigic2lnbmFsbGVkIEVPUyIpOworICAgICAgICB9CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAobUlucHV0QnVmZmVyQ291bnQgPT0gMCAmJiAhY29kZWNDb25maWcpIHsKKyAgICAgICAgQUxPR1YoIkZpcnN0IGZyYW1lIGhhcyB0byBpbmNsdWRlIGNvbmZpZ3VyYXRpb24sIGZvcmNpbmcgY29uZmlnIik7CisgICAgICAgIGNvZGVjQ29uZmlnID0gdHJ1ZTsKKyAgICB9CisKKyAgICB1aW50OF90ICppbnB1dCA9IGNvbnN0X2Nhc3Q8dWludDhfdCAqPihyVmlldy5kYXRhKCkgKyBpbk9mZnNldCk7CisgICAgaWYgKGNvZGVjQ29uZmlnKSB7CisgICAgICAgIHN0YXR1c190IGRlY29kZXJFcnIgPSBtRkxBQ0RlY29kZXItPnBhcnNlTWV0YWRhdGEoaW5wdXQsIGluU2l6ZSk7CisgICAgICAgIGlmIChkZWNvZGVyRXJyICE9IE9LICYmIGRlY29kZXJFcnIgIT0gV09VTERfQkxPQ0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJwcm9jZXNzOiBGTEFDRGVjb2RlciBwYXJzZU1ldGFEYXRhIHJldHVybnMgZXJyb3IgJWQiLCBkZWNvZGVyRXJyKTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBtSW5wdXRCdWZmZXJDb3VudCsrOworICAgICAgICBmaWxsRW1wdHlXb3JrKHdvcmspOworICAgICAgICBpZiAoZW9zKSB7CisgICAgICAgICAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gdHJ1ZTsKKyAgICAgICAgICAgIEFMT0dWKCJzaWduYWxsZWQgRU9TIik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZGVjb2RlckVyciA9PSBXT1VMRF9CTE9DSykgeworICAgICAgICAgICAgQUxPR1YoInByb2Nlc3M6IHBhcnNlTWV0YWRhdGEgaXMgQmxvY2tpbmcsIENvbnRpbnVlICVkIiwgZGVjb2RlckVycik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtU3RyZWFtSW5mbyA9IG1GTEFDRGVjb2Rlci0+Z2V0U3RyZWFtSW5mbygpOworICAgICAgICAgICAgaWYgKG1TdHJlYW1JbmZvLnNhbXBsZV9yYXRlICYmIG1TdHJlYW1JbmZvLm1heF9ibG9ja3NpemUgJiYKKyAgICAgICAgICAgICAgICBtU3RyZWFtSW5mby5jaGFubmVscykgeworICAgICAgICAgICAgICAgIG1IYXNTdHJlYW1JbmZvID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjpvdXRwdXQgc2FtcGxlUmF0ZUluZm8oCisgICAgICAgICAgICAgICAgICAgIDB1LCBtU3RyZWFtSW5mby5zYW1wbGVfcmF0ZSk7CisgICAgICAgICAgICAgICAgQzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjpvdXRwdXQgY2hhbm5lbENvdW50SW5mbygKKyAgICAgICAgICAgICAgICAgICAgMHUsIG1TdHJlYW1JbmZvLmNoYW5uZWxzKTsKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0KKyAgICAgICAgICAgICAgICAgICAgbUludGYtPmNvbmZpZyh7JnNhbXBsZVJhdGVJbmZvLCAmY2hhbm5lbENvdW50SW5mb30sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJfTUFZX0JMT0NLLCAmZmFpbHVyZXMpOworICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgICAgICAgICBDMlBhcmFtOjpDb3B5KHNhbXBsZVJhdGVJbmZvKSk7CisgICAgICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgICAgICAgICAgQzJQYXJhbTo6Q29weShjaGFubmVsQ291bnRJbmZvKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkNvbmZpZyBVcGRhdGUgZmFpbGVkIik7CisgICAgICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFMT0dEKCJwcm9jZXNzOiBkZWNvZGVyIGNvbmZpZ3VyYXRpb24gOiAlZCBIeiwgJWQgY2hhbm5lbHMsICVkIHNhbXBsZXMsIgorICAgICAgICAgICAgICAgICAgIiAlZCBibG9jayBzaXplIiwgbVN0cmVhbUluZm8uc2FtcGxlX3JhdGUsIG1TdHJlYW1JbmZvLmNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgKGludCltU3RyZWFtSW5mby50b3RhbF9zYW1wbGVzLCBtU3RyZWFtSW5mby5tYXhfYmxvY2tzaXplKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc2l6ZV90IG91dFNpemU7CisgICAgaWYgKG1IYXNTdHJlYW1JbmZvKQorICAgICAgICBvdXRTaXplID0gbVN0cmVhbUluZm8ubWF4X2Jsb2Nrc2l6ZSAqIG1TdHJlYW1JbmZvLmNoYW5uZWxzICogc2l6ZW9mKHNob3J0KTsKKyAgICBlbHNlCisgICAgICAgIG91dFNpemUgPSBrTWF4QmxvY2tTaXplICogRkxBQ0RlY29kZXI6OmtNYXhDaGFubmVscyAqIHNpemVvZihzaG9ydCk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gYmxvY2s7CisgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSA9IHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9OworICAgIGMyX3N0YXR1c190IGVyciA9IHBvb2wtPmZldGNoTGluZWFyQmxvY2sob3V0U2l6ZSwgdXNhZ2UsICZibG9jayk7CisgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICBBTE9HRSgiZmV0Y2hMaW5lYXJCbG9jayBmb3IgT3V0cHV0IGZhaWxlZCB3aXRoIHN0YXR1cyAlZCIsIGVycik7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX05PX01FTU9SWTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBDMldyaXRlVmlldyB3VmlldyA9IGJsb2NrLT5tYXAoKS5nZXQoKTsKKyAgICBpZiAod1ZpZXcuZXJyb3IoKSkgeworICAgICAgICBBTE9HRSgid3JpdGUgdmlldyBtYXAgZmFpbGVkICVkIiwgd1ZpZXcuZXJyb3IoKSk7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHNob3J0ICpvdXRwdXQgPSByZWludGVycHJldF9jYXN0PHNob3J0ICo+KHdWaWV3LmRhdGEoKSk7CisgICAgc3RhdHVzX3QgZGVjb2RlckVyciA9IG1GTEFDRGVjb2Rlci0+ZGVjb2RlT25lRnJhbWUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQsIGluU2l6ZSwgb3V0cHV0LCAmb3V0U2l6ZSk7CisgICAgaWYgKGRlY29kZXJFcnIgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoInByb2Nlc3M6IEZMQUNEZWNvZGVyIGRlY29kZU9uZUZyYW1lIHJldHVybnMgZXJyb3IgJWQiLCBkZWNvZGVyRXJyKTsKKyAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbUlucHV0QnVmZmVyQ291bnQrKzsKKyAgICBBTE9HVigib3V0IGJ1ZmZlciBhdHRyLiBzaXplICV6dSIsIG91dFNpemUpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMucHVzaF9iYWNrKGNyZWF0ZUxpbmVhckJ1ZmZlcihibG9jaywgMCwgb3V0U2l6ZSkpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICBpZiAoZW9zKSB7CisgICAgICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSB0cnVlOworICAgICAgICBBTE9HVigic2lnbmFsbGVkIEVPUyIpOworICAgIH0KK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0RmxhY0RlYzo6ZHJhaW4oCisgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgICh2b2lkKSBwb29sOworICAgIGlmIChkcmFpbk1vZGUgPT0gTk9fRFJBSU4pIHsKKyAgICAgICAgQUxPR1coImRyYWluIHdpdGggTk9fRFJBSU46IG5vLW9wIik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisgICAgaWYgKGRyYWluTW9kZSA9PSBEUkFJTl9DSEFJTikgeworICAgICAgICBBTE9HVygiRFJBSU5fQ0hBSU4gbm90IHN1cHBvcnRlZCIpOworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICBpZiAobUZMQUNEZWNvZGVyKSBtRkxBQ0RlY29kZXItPmZsdXNoKCk7CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2NsYXNzIEMyU29mdEZsYWNEZWNGYWN0b3J5IDogcHVibGljIEMyQ29tcG9uZW50RmFjdG9yeSB7CitwdWJsaWM6CisgICAgQzJTb2Z0RmxhY0RlY0ZhY3RvcnkoKSA6IG1IZWxwZXIoc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyUmVmbGVjdG9ySGVscGVyPigKKyAgICAgICAgICAgIEdldENvZGVjMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKS0+Z2V0UGFyYW1SZWZsZWN0b3IoKSkpIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4qIGNvbnN0IGNvbXBvbmVudCwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudCopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICpjb21wb25lbnQgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KAorICAgICAgICAgICAgICAgIG5ldyBDMlNvZnRGbGFjRGVjKENPTVBPTkVOVF9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRGbGFjRGVjOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KiBjb25zdCBpbnRlcmZhY2UsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnRJbnRlcmZhY2UqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqaW50ZXJmYWNlID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPigKKyAgICAgICAgICAgICAgICBuZXcgU2ltcGxlSW50ZXJmYWNlPEMyU29mdEZsYWNEZWM6OkludGZJbXBsPigKKyAgICAgICAgICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLCBpZCwgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRGbGFjRGVjOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCB+QzJTb2Z0RmxhY0RlY0ZhY3RvcnkoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiBtSGVscGVyOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworZXh0ZXJuICJDIiA6OkMyQ29tcG9uZW50RmFjdG9yeSogQ3JlYXRlQ29kZWMyRmFjdG9yeSgpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuIG5ldyA6OmFuZHJvaWQ6OkMyU29mdEZsYWNEZWNGYWN0b3J5KCk7Cit9CisKK2V4dGVybiAiQyIgdm9pZCBEZXN0cm95Q29kZWMyRmFjdG9yeSg6OkMyQ29tcG9uZW50RmFjdG9yeSogZmFjdG9yeSkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICBkZWxldGUgZmFjdG9yeTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2ZsYWMvQzJTb2Z0RmxhY0RlYy5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZmxhYy9DMlNvZnRGbGFjRGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQ5MWJmZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2ZsYWMvQzJTb2Z0RmxhY0RlYy5oCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQzJfU09GVF9GTEFDX0RFQ19IXworI2RlZmluZSBBTkRST0lEX0MyX1NPRlRfRkxBQ19ERUNfSF8KKworI2luY2x1ZGUgPFNpbXBsZUMyQ29tcG9uZW50Lmg+CisKKyNpbmNsdWRlICJGTEFDRGVjb2Rlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBDMlNvZnRGbGFjRGVjIDogcHVibGljIFNpbXBsZUMyQ29tcG9uZW50IHsKKyAgICBjbGFzcyBJbnRmSW1wbDsKKworICAgIEMyU29mdEZsYWNEZWMoY29uc3QgY2hhciAqbmFtZSwgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gJmludGZJbXBsKTsKKyAgICB2aXJ0dWFsIH5DMlNvZnRGbGFjRGVjKCk7CisKKyAgICAvLyBGcm9tIFNpbXBsZUMyQ29tcG9uZW50CisgICAgYzJfc3RhdHVzX3Qgb25Jbml0KCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25TdG9wKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlc2V0KCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlbGVhc2UoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvbkZsdXNoX3NtKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBwcm9jZXNzKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBkcmFpbigKKyAgICAgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIGVudW0geworICAgICAgICBrTWF4QmxvY2tTaXplICAgPSA0MDk2CisgICAgfTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gbUludGY7CisgICAgRkxBQ0RlY29kZXIgKm1GTEFDRGVjb2RlcjsKKyAgICBGTEFDX19TdHJlYW1NZXRhZGF0YV9TdHJlYW1JbmZvIG1TdHJlYW1JbmZvOworICAgIGJvb2wgbVNpZ25hbGxlZEVycm9yOworICAgIGJvb2wgbVNpZ25hbGxlZE91dHB1dEVvczsKKyAgICBib29sIG1IYXNTdHJlYW1JbmZvOworICAgIHNpemVfdCBtSW5wdXRCdWZmZXJDb3VudDsKKworICAgIHN0YXR1c190IGluaXREZWNvZGVyKCk7CisKKyAgICBDMl9ET19OT1RfQ09QWShDMlNvZnRGbGFjRGVjKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9DMl9TT0ZUX0ZMQUNfREVDX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9mbGFjL0MyU29mdEZsYWNFbmMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZmxhYy9DMlNvZnRGbGFjRW5jLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDE5MmM3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZmxhYy9DMlNvZnRGbGFjRW5jLmNwcApAQCAtMCwwICsxLDQ2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJTb2Z0RmxhY0VuYyIKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oPgorCisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxTaW1wbGVDMkludGVyZmFjZS5oPgorCisjaW5jbHVkZSAiQzJTb2Z0RmxhY0VuYy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIEMyU29mdEZsYWNFbmM6OkludGZJbXBsIDogcHVibGljIEMySW50ZXJmYWNlSGVscGVyIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBJbnRmSW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+ICZoZWxwZXIpCisgICAgICAgIDogQzJJbnRlcmZhY2VIZWxwZXIoaGVscGVyKSB7CisgICAgICAgIHNldERlcml2ZWRJbnN0YW5jZSh0aGlzKTsKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dEZvcm1hdCwgQzJfTkFNRV9JTlBVVF9TVFJFQU1fRk9STUFUX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbUZvcm1hdENvbmZpZzo6aW5wdXQoMHUsIEMyRm9ybWF0QXVkaW8pKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1PdXRwdXRGb3JtYXQsIEMyX05BTUVfT1VUUFVUX1NUUkVBTV9GT1JNQVRfU0VUVElORykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtRm9ybWF0Q29uZmlnOjpvdXRwdXQoMHUsIEMyRm9ybWF0Q29tcHJlc3NlZCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0TWVkaWFUeXBlLCBDMl9OQU1FX0lOUFVUX1BPUlRfTUlNRV9TRVRUSU5HKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShBbGxvY1NoYXJlZFN0cmluZzxDMlBvcnRNaW1lQ29uZmlnOjppbnB1dD4oCisgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19SQVcpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1PdXRwdXRNZWRpYVR5cGUsIEMyX05BTUVfT1VUUFVUX1BPUlRfTUlNRV9TRVRUSU5HKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShBbGxvY1NoYXJlZFN0cmluZzxDMlBvcnRNaW1lQ29uZmlnOjpvdXRwdXQ+KAorICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fRkxBQykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVNhbXBsZVJhdGUsIEMyX05BTUVfU1RSRUFNX1NBTVBMRV9SQVRFX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjppbnB1dCgwdSwgNDQxMDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobVNhbXBsZVJhdGUsIHZhbHVlKS5pblJhbmdlKDEsIDY1NTM1MCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKChTZXR0ZXI8ZGVjbHR5cGUoKm1TYW1wbGVSYXRlKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUNoYW5uZWxDb3VudCwgQzJfTkFNRV9TVFJFQU1fQ0hBTk5FTF9DT1VOVF9TRVRUSU5HKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjppbnB1dCgwdSwgMSkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQ2hhbm5lbENvdW50LCB2YWx1ZSkuaW5SYW5nZSgxLCAyKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptQ2hhbm5lbENvdW50KT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQml0cmF0ZSwgQzJfTkFNRV9TVFJFQU1fQklUUkFURV9TRVRUSU5HKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJCaXRyYXRlVHVuaW5nOjpvdXRwdXQoMHUsIDc2ODAwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQml0cmF0ZSwgdmFsdWUpLmluUmFuZ2UoMSwgMjEwMDAwMDApfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1CaXRyYXRlKT46Ok5vblN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRNYXhCdWZTaXplLCBDMl9QQVJBTUtFWV9JTlBVVF9NQVhfQlVGRkVSX1NJWkUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dCgwdSwgNDYwOCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgIH0KKworICAgIHVpbnQzMl90IGdldFNhbXBsZVJhdGUoKSBjb25zdCB7IHJldHVybiBtU2FtcGxlUmF0ZS0+dmFsdWU7IH0KKyAgICB1aW50MzJfdCBnZXRDaGFubmVsQ291bnQoKSBjb25zdCB7IHJldHVybiBtQ2hhbm5lbENvdW50LT52YWx1ZTsgfQorICAgIHVpbnQzMl90IGdldEJpdHJhdGUoKSBjb25zdCB7IHJldHVybiBtQml0cmF0ZS0+dmFsdWU7IH0KKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Gb3JtYXRDb25maWc6OmlucHV0PiBtSW5wdXRGb3JtYXQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRm9ybWF0Q29uZmlnOjpvdXRwdXQ+IG1PdXRwdXRGb3JtYXQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydE1pbWVDb25maWc6OmlucHV0PiBtSW5wdXRNZWRpYVR5cGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydE1pbWVDb25maWc6Om91dHB1dD4gbU91dHB1dE1lZGlhVHlwZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6aW5wdXQ+IG1TYW1wbGVSYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86OmlucHV0PiBtQ2hhbm5lbENvdW50OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJpdHJhdGVUdW5pbmc6Om91dHB1dD4gbUJpdHJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0PiBtSW5wdXRNYXhCdWZTaXplOworfTsKK2NvbnN0ZXhwciBjaGFyIENPTVBPTkVOVF9OQU1FW10gPSAiYzIuYW5kcm9pZC5mbGFjLmVuY29kZXIiOworCitDMlNvZnRGbGFjRW5jOjpDMlNvZnRGbGFjRW5jKAorICAgICAgICBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gJmludGZJbXBsKQorICAgIDogU2ltcGxlQzJDb21wb25lbnQoc3RkOjptYWtlX3NoYXJlZDxTaW1wbGVJbnRlcmZhY2U8SW50ZkltcGw+PihuYW1lLCBpZCwgaW50ZkltcGwpKSwKKyAgICAgIG1JbnRmKGludGZJbXBsKSwKKyAgICAgIG1GbGFjU3RyZWFtRW5jb2RlcihudWxscHRyKSwKKyAgICAgIG1JbnB1dEJ1ZmZlclBjbTMyKG51bGxwdHIpIHsKK30KKworQzJTb2Z0RmxhY0VuYzo6fkMyU29mdEZsYWNFbmMoKSB7CisgICAgb25SZWxlYXNlKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEZsYWNFbmM6Om9uSW5pdCgpIHsKKyAgICBtRmxhY1N0cmVhbUVuY29kZXIgPSBGTEFDX19zdHJlYW1fZW5jb2Rlcl9uZXcoKTsKKyAgICBpZiAoIW1GbGFjU3RyZWFtRW5jb2RlcikgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKworICAgIG1JbnB1dEJ1ZmZlclBjbTMyID0gKEZMQUNfX2ludDMyKikgbWFsbG9jKAorICAgICAgICAgICAga0luQmxvY2tTaXplICoga01heE51bUNoYW5uZWxzICogc2l6ZW9mKEZMQUNfX2ludDMyKSk7CisgICAgaWYgKCFtSW5wdXRCdWZmZXJQY20zMikgcmV0dXJuIEMyX05PX01FTU9SWTsKKworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKyAgICBtQ29tcHJlc3Npb25MZXZlbCA9IEZMQUNfQ09NUFJFU1NJT05fTEVWRUxfREVGQVVMVDsKKyAgICBtSXNGaXJzdEZyYW1lID0gdHJ1ZTsKKyAgICBtQW5jaG9yVGltZVN0YW1wID0gMHVsbDsKKyAgICBtUHJvY2Vzc2VkU2FtcGxlcyA9IDB1OworICAgIG1FbmNvZGVyV3JpdGVEYXRhID0gZmFsc2U7CisgICAgbUVuY29kZXJSZXR1cm5lZE5iQnl0ZXMgPSAwOworICAgIG1IZWFkZXJPZmZzZXQgPSAwOworICAgIG1Xcm90ZUhlYWRlciA9IGZhbHNlOworCisgICAgc3RhdHVzX3QgZXJyID0gY29uZmlndXJlRW5jb2RlcigpOworICAgIHJldHVybiBlcnIgPT0gT0sgPyBDMl9PSyA6IEMyX0NPUlJVUFRFRDsKK30KKwordm9pZCBDMlNvZnRGbGFjRW5jOjpvblJlbGVhc2UoKSB7CisgICAgaWYgKG1GbGFjU3RyZWFtRW5jb2RlcikgeworICAgICAgICBGTEFDX19zdHJlYW1fZW5jb2Rlcl9kZWxldGUobUZsYWNTdHJlYW1FbmNvZGVyKTsKKyAgICAgICAgbUZsYWNTdHJlYW1FbmNvZGVyID0gbnVsbHB0cjsKKyAgICB9CisKKyAgICBpZiAobUlucHV0QnVmZmVyUGNtMzIpIHsKKyAgICAgICAgZnJlZShtSW5wdXRCdWZmZXJQY20zMik7CisgICAgICAgIG1JbnB1dEJ1ZmZlclBjbTMyID0gbnVsbHB0cjsKKyAgICB9Cit9CisKK3ZvaWQgQzJTb2Z0RmxhY0VuYzo6b25SZXNldCgpIHsKKyAgICBtQ29tcHJlc3Npb25MZXZlbCA9IEZMQUNfQ09NUFJFU1NJT05fTEVWRUxfREVGQVVMVDsKKyAgICAodm9pZCkgb25TdG9wKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEZsYWNFbmM6Om9uU3RvcCgpIHsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisgICAgbUlzRmlyc3RGcmFtZSA9IHRydWU7CisgICAgbUFuY2hvclRpbWVTdGFtcCA9IDB1bGw7CisgICAgbVByb2Nlc3NlZFNhbXBsZXMgPSAwdTsKKyAgICBtRW5jb2RlcldyaXRlRGF0YSA9IGZhbHNlOworICAgIG1FbmNvZGVyUmV0dXJuZWROYkJ5dGVzID0gMDsKKyAgICBtSGVhZGVyT2Zmc2V0ID0gMDsKKyAgICBtV3JvdGVIZWFkZXIgPSBmYWxzZTsKKworICAgIGMyX3N0YXR1c190IHN0YXR1cyA9IGRyYWluKERSQUlOX0NPTVBPTkVOVF9OT19FT1MsIG51bGxwdHIpOworICAgIGlmIChDMl9PSyAhPSBzdGF0dXMpIHJldHVybiBzdGF0dXM7CisKKyAgICBzdGF0dXNfdCBlcnIgPSBjb25maWd1cmVFbmNvZGVyKCk7CisgICAgaWYgKGVyciAhPSBPSykgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEZsYWNFbmM6Om9uRmx1c2hfc20oKSB7CisgICAgcmV0dXJuIG9uU3RvcCgpOworfQorCitzdGF0aWMgdm9pZCBmaWxsRW1wdHlXb3JrKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKSB7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7Cit9CisKK3ZvaWQgQzJTb2Z0RmxhY0VuYzo6cHJvY2VzcygKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAvLyBJbml0aWFsaXplIG91dHB1dCB3b3JrCisgICAgd29yay0+cmVzdWx0ID0gQzJfT0s7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKworICAgIGlmIChtU2lnbmFsbGVkRXJyb3IgfHwgbVNpZ25hbGxlZE91dHB1dEVvcykgeworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9CQURfVkFMVUU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBib29sIGVvcyA9ICgod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSAhPSAwKTsKKyAgICBDMlJlYWRWaWV3IHJWaWV3ID0gbUR1bW15UmVhZFZpZXc7CisgICAgc2l6ZV90IGluT2Zmc2V0ID0gMHU7CisgICAgc2l6ZV90IGluU2l6ZSA9IDB1OworICAgIGlmICghd29yay0+aW5wdXQuYnVmZmVycy5lbXB0eSgpKSB7CisgICAgICAgIHJWaWV3ID0gd29yay0+aW5wdXQuYnVmZmVyc1swXS0+ZGF0YSgpLmxpbmVhckJsb2NrcygpLmZyb250KCkubWFwKCkuZ2V0KCk7CisgICAgICAgIGluU2l6ZSA9IHJWaWV3LmNhcGFjaXR5KCk7CisgICAgICAgIGlmIChpblNpemUgJiYgclZpZXcuZXJyb3IoKSkgeworICAgICAgICAgICAgQUxPR0UoInJlYWQgdmlldyBtYXAgZmFpbGVkICVkIiwgclZpZXcuZXJyb3IoKSk7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBBTE9HVigiaW4gYnVmZmVyIGF0dHIuIHNpemUgJXp1IHRpbWVzdGFtcCAlZCBmcmFtZWluZGV4ICVkLCBmbGFncyAleCIsCisgICAgICAgICAgICAgIGluU2l6ZSwgKGludCl3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrdSgpLAorICAgICAgICAgICAgICAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpLCB3b3JrLT5pbnB1dC5mbGFncyk7CisgICAgaWYgKG1Jc0ZpcnN0RnJhbWUgJiYgaW5TaXplKSB7CisgICAgICAgIG1BbmNob3JUaW1lU3RhbXAgPSB3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrdWxsKCk7CisgICAgICAgIG1Jc0ZpcnN0RnJhbWUgPSBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoIW1Xcm90ZUhlYWRlcikgeworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJTdHJlYW1Dc2RJbmZvOjpvdXRwdXQ+IGNzZCA9CisgICAgICAgICAgICBDMlN0cmVhbUNzZEluZm86Om91dHB1dDo6QWxsb2NVbmlxdWUobUhlYWRlck9mZnNldCwgMHUpOworICAgICAgICBpZiAoIWNzZCkgeworICAgICAgICAgICAgQUxPR0UoIkNTRCBhbGxvY2F0aW9uIGZhaWxlZCIpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX05PX01FTU9SWTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBtZW1jcHkoY3NkLT5tLnZhbHVlLCBtSGVhZGVyLCBtSGVhZGVyT2Zmc2V0KTsKKyAgICAgICAgQUxPR1YoInB1dCBjc2QsICVkIGJ5dGVzIiwgbUhlYWRlck9mZnNldCk7CisKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5wdXNoX2JhY2soc3RkOjptb3ZlKGNzZCkpOworICAgICAgICBtV3JvdGVIZWFkZXIgPSB0cnVlOworICAgIH0KKworICAgIHVpbnQzMl90IHNhbXBsZVJhdGUgPSBtSW50Zi0+Z2V0U2FtcGxlUmF0ZSgpOworICAgIHVpbnQzMl90IGNoYW5uZWxDb3VudCA9IG1JbnRmLT5nZXRDaGFubmVsQ291bnQoKTsKKyAgICB1aW50NjRfdCBvdXRUaW1lU3RhbXAgPSBtUHJvY2Vzc2VkU2FtcGxlcyAqIDEwMDAwMDBsbCAvIHNhbXBsZVJhdGU7CisKKyAgICBzaXplX3Qgb3V0Q2FwYWNpdHkgPSBpblNpemU7CisgICAgb3V0Q2FwYWNpdHkgKz0gbUJsb2NrU2l6ZSAqIGNoYW5uZWxDb3VudCAqIHNpemVvZihpbnQxNl90KTsKKworICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgPSB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfTsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBwb29sLT5mZXRjaExpbmVhckJsb2NrKG91dENhcGFjaXR5LCB1c2FnZSwgJm1PdXRwdXRCbG9jayk7CisgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICBBTE9HRSgiZmV0Y2hMaW5lYXJCbG9jayBmb3IgT3V0cHV0IGZhaWxlZCB3aXRoIHN0YXR1cyAlZCIsIGVycik7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX05PX01FTU9SWTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBDMldyaXRlVmlldyB3VmlldyA9IG1PdXRwdXRCbG9jay0+bWFwKCkuZ2V0KCk7CisgICAgaWYgKHdWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgQUxPR0UoIndyaXRlIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHdWaWV3LmVycm9yKCkpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtRW5jb2RlcldyaXRlRGF0YSA9IHRydWU7CisgICAgbUVuY29kZXJSZXR1cm5lZE5iQnl0ZXMgPSAwOworICAgIHNpemVfdCBpblBvcyA9IDA7CisgICAgd2hpbGUgKGluUG9zIDwgaW5TaXplKSB7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmluUHRyID0gclZpZXcuZGF0YSgpICsgaW5PZmZzZXQ7CisgICAgICAgIHNpemVfdCBwcm9jZXNzU2l6ZSA9IE1JTihrSW5CbG9ja1NpemUgKiBjaGFubmVsQ291bnQgKiBzaXplb2YoaW50MTZfdCksIChpblNpemUgLSBpblBvcykpOworICAgICAgICBjb25zdCB1bnNpZ25lZCBuYklucHV0RnJhbWVzID0gcHJvY2Vzc1NpemUgLyAoY2hhbm5lbENvdW50ICogc2l6ZW9mKGludDE2X3QpKTsKKyAgICAgICAgY29uc3QgdW5zaWduZWQgbmJJbnB1dFNhbXBsZXMgPSBwcm9jZXNzU2l6ZSAvIHNpemVvZihpbnQxNl90KTsKKyAgICAgICAgY29uc3QgaW50MTZfdCAqcGNtMTYgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGludDE2X3QgKj4oaW5QdHIgKyBpblBvcyk7CisgICAgICAgIEFMT0dWKCJhYm91dCB0byBlbmNvZGUgJXp1IGJ5dGVzIiwgcHJvY2Vzc1NpemUpOworCisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBuYklucHV0U2FtcGxlczsgaSsrKSB7CisgICAgICAgICAgICBtSW5wdXRCdWZmZXJQY20zMltpXSA9IChGTEFDX19pbnQzMikgcGNtMTZbaV07CisgICAgICAgIH0KKworICAgICAgICBGTEFDX19ib29sIG9rID0gRkxBQ19fc3RyZWFtX2VuY29kZXJfcHJvY2Vzc19pbnRlcmxlYXZlZCgKKyAgICAgICAgICAgICAgICBtRmxhY1N0cmVhbUVuY29kZXIsIG1JbnB1dEJ1ZmZlclBjbTMyLCBuYklucHV0RnJhbWVzKTsKKyAgICAgICAgaWYgKCFvaykgeworICAgICAgICAgICAgQUxPR0UoImVycm9yIGVuY291bnRlcmVkIGR1cmluZyBlbmNvZGluZyIpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIG1PdXRwdXRCbG9jay5yZXNldCgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGluUG9zICs9IHByb2Nlc3NTaXplOworICAgIH0KKyAgICBpZiAoZW9zICYmIChDMl9PSyAhPSBkcmFpbihEUkFJTl9DT01QT05FTlRfV0lUSF9FT1MsIHBvb2wpKSkgeworICAgICAgICBBTE9HRSgiZXJyb3IgZW5jb3VudGVyZWQgZHVyaW5nIGVuY29kaW5nIik7CisgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgbU91dHB1dEJsb2NrLnJlc2V0KCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICBpZiAobUVuY29kZXJSZXR1cm5lZE5iQnl0ZXMgIT0gMCkgeworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGJ1ZmZlciA9IGNyZWF0ZUxpbmVhckJ1ZmZlcihzdGQ6Om1vdmUobU91dHB1dEJsb2NrKSwgMCwgbUVuY29kZXJSZXR1cm5lZE5iQnl0ZXMpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5wdXNoX2JhY2soYnVmZmVyKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwudGltZXN0YW1wID0gbUFuY2hvclRpbWVTdGFtcCArIG91dFRpbWVTdGFtcDsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVigiZW5jb2RlciBwcm9jZXNzX2ludGVybGVhdmVkIHJldHVybmVkIHdpdGhvdXQgZGF0YSB0byB3cml0ZSIpOworICAgIH0KKyAgICBtT3V0cHV0QmxvY2sgPSBudWxscHRyOworICAgIGlmIChlb3MpIHsKKyAgICAgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IHRydWU7CisgICAgICAgIEFMT0dWKCJzaWduYWxsZWQgRU9TIik7CisgICAgfQorICAgIG1FbmNvZGVyV3JpdGVEYXRhID0gZmFsc2U7CisgICAgbUVuY29kZXJSZXR1cm5lZE5iQnl0ZXMgPSAwOworfQorCitGTEFDX19TdHJlYW1FbmNvZGVyV3JpdGVTdGF0dXMgQzJTb2Z0RmxhY0VuYzo6b25FbmNvZGVkRmxhY0F2YWlsYWJsZSgKKyAgICAgICAgY29uc3QgRkxBQ19fYnl0ZSBidWZmZXJbXSwgc2l6ZV90IGJ5dGVzLCB1bnNpZ25lZCBzYW1wbGVzLAorICAgICAgICB1bnNpZ25lZCBjdXJyZW50X2ZyYW1lKSB7CisgICAgKHZvaWQpIGN1cnJlbnRfZnJhbWU7CisgICAgQUxPR1YoIiVzIChieXRlcz0lenUsIHNhbXBsZXM9JXUsIGN1cnJfZnJhbWU9JXUpIiwgX19mdW5jX18sIGJ5dGVzLCBzYW1wbGVzLAorICAgICAgICAgIGN1cnJlbnRfZnJhbWUpOworCisgICAgaWYgKHNhbXBsZXMgPT0gMCkgeworICAgICAgICBBTE9HSSgic2F2aW5nICV6dSBieXRlcyBvZiBoZWFkZXIiLCBieXRlcyk7CisgICAgICAgIG1lbWNweShtSGVhZGVyICsgbUhlYWRlck9mZnNldCwgYnVmZmVyLCBieXRlcyk7CisgICAgICAgIG1IZWFkZXJPZmZzZXQgKz0gYnl0ZXM7Ly8gd2lsbCBjb250YWluIGhlYWRlciBzaXplIHdoZW4gZmluaXNoZWQgcmVjZWl2aW5nIGhlYWRlcgorICAgICAgICByZXR1cm4gRkxBQ19fU1RSRUFNX0VOQ09ERVJfV1JJVEVfU1RBVFVTX09LOworICAgIH0KKworICAgIGlmICgoc2FtcGxlcyA9PSAwKSB8fCAhbUVuY29kZXJXcml0ZURhdGEpIHsKKyAgICAgICAgLy8gY2FsbGVkIGJ5IHRoZSBlbmNvZGVyIGJlY2F1c2UgdGhlcmUncyBoZWFkZXIgZGF0YSB0byBzYXZlLCBidXQgaXQncyBub3QgdGhlIHJvbGUKKyAgICAgICAgLy8gb2YgdGhpcyBjb21wb25lbnQgKHVubGVzcyBXUklURV9GTEFDX0hFQURFUl9JTl9GSVJTVF9CVUZGRVIgaXMgZGVmaW5lZCkKKyAgICAgICAgQUxPR1YoImlnbm9yaW5nICV6dSBieXRlcyBvZiBoZWFkZXIgZGF0YSAoc2FtcGxlcz0lZCkiLCBieXRlcywgc2FtcGxlcyk7CisgICAgICAgIHJldHVybiBGTEFDX19TVFJFQU1fRU5DT0RFUl9XUklURV9TVEFUVVNfT0s7CisgICAgfQorCisgICAgLy8gd3JpdGUgZW5jb2RlZCBkYXRhCisgICAgQzJXcml0ZVZpZXcgd1ZpZXcgPSBtT3V0cHV0QmxvY2stPm1hcCgpLmdldCgpOworICAgIHVpbnQ4X3QqIG91dERhdGEgPSB3Vmlldy5kYXRhKCk7CisgICAgQUxPR1YoIndyaXRpbmcgJXp1IGJ5dGVzIG9mIGVuY29kZWQgZGF0YSBvbiBvdXRwdXQiLCBieXRlcyk7CisgICAgLy8gaW5jcmVtZW50IG1Qcm9jZXNzZWRTYW1wbGVzIHRvIG1haW50YWluIGF1ZGlvIHN5bmNocm9uaXphdGlvbiBkdXJpbmcKKyAgICAvLyBwbGF5IGJhY2sKKyAgICBtUHJvY2Vzc2VkU2FtcGxlcyArPSBzYW1wbGVzOworICAgIGlmIChieXRlcyArIG1FbmNvZGVyUmV0dXJuZWROYkJ5dGVzID4gbU91dHB1dEJsb2NrLT5jYXBhY2l0eSgpKSB7CisgICAgICAgIEFMT0dFKCJub3QgZW5vdWdoIHNwYWNlIGxlZnQgdG8gd3JpdGUgZW5jb2RlZCBkYXRhLCBkcm9wcGluZyAlenUgYnl0ZXMiLCBieXRlcyk7CisgICAgICAgIC8vIGEgZmF0YWwgZXJyb3Igd291bGQgc3RvcCB0aGUgZW5jb2RpbmcKKyAgICAgICAgcmV0dXJuIEZMQUNfX1NUUkVBTV9FTkNPREVSX1dSSVRFX1NUQVRVU19PSzsKKyAgICB9CisgICAgbWVtY3B5KG91dERhdGEgKyBtRW5jb2RlclJldHVybmVkTmJCeXRlcywgYnVmZmVyLCBieXRlcyk7CisgICAgbUVuY29kZXJSZXR1cm5lZE5iQnl0ZXMgKz0gYnl0ZXM7CisgICAgcmV0dXJuIEZMQUNfX1NUUkVBTV9FTkNPREVSX1dSSVRFX1NUQVRVU19PSzsKK30KKworCitzdGF0dXNfdCBDMlNvZnRGbGFjRW5jOjpjb25maWd1cmVFbmNvZGVyKCkgeworICAgIEFMT0dWKCIlcyBudW1DaGFubmVsPSVkLCBzYW1wbGVSYXRlPSVkIiwgX19mdW5jX18sIG1JbnRmLT5nZXRDaGFubmVsQ291bnQoKSwgbUludGYtPmdldFNhbXBsZVJhdGUoKSk7CisKKyAgICBpZiAobVNpZ25hbGxlZEVycm9yIHx8ICFtRmxhY1N0cmVhbUVuY29kZXIpIHsKKyAgICAgICAgQUxPR0UoImNhbid0IGNvbmZpZ3VyZSBlbmNvZGVyOiBubyBlbmNvZGVyIG9yIGludmFsaWQgc3RhdGUiKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgRkxBQ19fYm9vbCBvayA9IHRydWU7CisgICAgb2sgPSBvayAmJiBGTEFDX19zdHJlYW1fZW5jb2Rlcl9zZXRfY2hhbm5lbHMobUZsYWNTdHJlYW1FbmNvZGVyLCBtSW50Zi0+Z2V0Q2hhbm5lbENvdW50KCkpOworICAgIG9rID0gb2sgJiYgRkxBQ19fc3RyZWFtX2VuY29kZXJfc2V0X3NhbXBsZV9yYXRlKG1GbGFjU3RyZWFtRW5jb2RlciwgbUludGYtPmdldFNhbXBsZVJhdGUoKSk7CisgICAgb2sgPSBvayAmJiBGTEFDX19zdHJlYW1fZW5jb2Rlcl9zZXRfYml0c19wZXJfc2FtcGxlKG1GbGFjU3RyZWFtRW5jb2RlciwgMTYpOworICAgIG9rID0gb2sgJiYgRkxBQ19fc3RyZWFtX2VuY29kZXJfc2V0X2NvbXByZXNzaW9uX2xldmVsKG1GbGFjU3RyZWFtRW5jb2RlciwgbUNvbXByZXNzaW9uTGV2ZWwpOworICAgIG9rID0gb2sgJiYgRkxBQ19fc3RyZWFtX2VuY29kZXJfc2V0X3ZlcmlmeShtRmxhY1N0cmVhbUVuY29kZXIsIGZhbHNlKTsKKyAgICBpZiAoIW9rKSB7CisgICAgICAgIEFMT0dFKCJ1bmtub3duIGVycm9yIHdoZW4gY29uZmlndXJpbmcgZW5jb2RlciIpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICBvayAmPSBGTEFDX19TVFJFQU1fRU5DT0RFUl9JTklUX1NUQVRVU19PSyA9PQorICAgICAgICAgICAgRkxBQ19fc3RyZWFtX2VuY29kZXJfaW5pdF9zdHJlYW0obUZsYWNTdHJlYW1FbmNvZGVyLAorICAgICAgICAgICAgICAgICAgICBmbGFjRW5jb2RlcldyaXRlQ2FsbGJhY2sgICAgLyp3cml0ZV9jYWxsYmFjayovLAorICAgICAgICAgICAgICAgICAgICBudWxscHRyIC8qc2Vla19jYWxsYmFjayovLAorICAgICAgICAgICAgICAgICAgICBudWxscHRyIC8qdGVsbF9jYWxsYmFjayovLAorICAgICAgICAgICAgICAgICAgICBudWxscHRyIC8qbWV0YWRhdGFfY2FsbGJhY2sqLywKKyAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikgdGhpcyAvKmNsaWVudF9kYXRhKi8pOworCisgICAgaWYgKCFvaykgeworICAgICAgICBBTE9HRSgidW5rbm93biBlcnJvciB3aGVuIGNvbmZpZ3VyaW5nIGVuY29kZXIiKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgbUJsb2NrU2l6ZSA9IEZMQUNfX3N0cmVhbV9lbmNvZGVyX2dldF9ibG9ja3NpemUobUZsYWNTdHJlYW1FbmNvZGVyKTsKKworICAgIEFMT0dWKCJlbmNvZGVyIHN1Y2Nlc3NmdWxseSBjb25maWd1cmVkIik7CisgICAgcmV0dXJuIE9LOworfQorCitGTEFDX19TdHJlYW1FbmNvZGVyV3JpdGVTdGF0dXMgQzJTb2Z0RmxhY0VuYzo6ZmxhY0VuY29kZXJXcml0ZUNhbGxiYWNrKAorICAgICAgICAgICAgY29uc3QgRkxBQ19fU3RyZWFtRW5jb2RlciAqLAorICAgICAgICAgICAgY29uc3QgRkxBQ19fYnl0ZSBidWZmZXJbXSwKKyAgICAgICAgICAgIHNpemVfdCBieXRlcywKKyAgICAgICAgICAgIHVuc2lnbmVkIHNhbXBsZXMsCisgICAgICAgICAgICB1bnNpZ25lZCBjdXJyZW50X2ZyYW1lLAorICAgICAgICAgICAgdm9pZCAqY2xpZW50X2RhdGEpIHsKKyAgICByZXR1cm4gKChDMlNvZnRGbGFjRW5jKikgY2xpZW50X2RhdGEpLT5vbkVuY29kZWRGbGFjQXZhaWxhYmxlKAorICAgICAgICAgICAgYnVmZmVyLCBieXRlcywgc2FtcGxlcywgY3VycmVudF9mcmFtZSk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEZsYWNFbmM6OmRyYWluKAorICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAodm9pZCkgcG9vbDsKKyAgICBzd2l0Y2ggKGRyYWluTW9kZSkgeworICAgICAgICBjYXNlIE5PX0RSQUlOOgorICAgICAgICAgICAgQUxPR1coImRyYWluIHdpdGggTk9fRFJBSU46IG5vLW9wIik7CisgICAgICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgICAgIGNhc2UgRFJBSU5fQ0hBSU46CisgICAgICAgICAgICBBTE9HVygiRFJBSU5fQ0hBSU4gbm90IHN1cHBvcnRlZCIpOworICAgICAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgICAgIGNhc2UgRFJBSU5fQ09NUE9ORU5UX1dJVEhfRU9TOgorICAgICAgICAgICAgLy8gVE9ETzogVGhpcyBmbGFnIGlzIG5vdCBiZWluZyBzZW50IGJhY2sgdG8gdGhlIGNsaWVudAorICAgICAgICAgICAgLy8gYmVjYXVzZSB0aGVyZSBhcmUgbm8gaXRlbXMgaW4gUGVuZGluZ1dvcmsgcXVldWUgYXMgYWxsIHRoZQorICAgICAgICAgICAgLy8gaW5wdXRzIGFyZSBiZWluZyBzZW50IGJhY2sgd2l0aCBlbXB0eXdvcmsgb3IgdmFsaWQgZW5jb2RlZCBkYXRhCisgICAgICAgICAgICAvLyBtU2lnbmFsbGVkT3V0cHV0RW9zID0gdHJ1ZTsKKyAgICAgICAgY2FzZSBEUkFJTl9DT01QT05FTlRfTk9fRU9TOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgIH0KKyAgICBGTEFDX19ib29sIG9rID0gRkxBQ19fc3RyZWFtX2VuY29kZXJfZmluaXNoKG1GbGFjU3RyZWFtRW5jb2Rlcik7CisgICAgaWYgKCFvaykgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICBtSXNGaXJzdEZyYW1lID0gdHJ1ZTsKKyAgICBtQW5jaG9yVGltZVN0YW1wID0gMHVsbDsKKyAgICBtUHJvY2Vzc2VkU2FtcGxlcyA9IDB1OworCisgICAgcmV0dXJuIEMyX09LOworfQorCitjbGFzcyBDMlNvZnRGbGFjRW5jRmFjdG9yeSA6IHB1YmxpYyBDMkNvbXBvbmVudEZhY3RvcnkgeworcHVibGljOgorICAgIEMyU29mdEZsYWNFbmNGYWN0b3J5KCkgOiBtSGVscGVyKHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxDMlJlZmxlY3RvckhlbHBlcj4oCisgICAgICAgICAgICBHZXRDb2RlYzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCktPmdldFBhcmFtUmVmbGVjdG9yKCkpKSB7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVDb21wb25lbnQoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KiBjb25zdCBjb21wb25lbnQsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnQqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqY29tcG9uZW50ID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PigKKyAgICAgICAgICAgICAgICBuZXcgQzJTb2Z0RmxhY0VuYyhDT01QT05FTlRfTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdEZsYWNFbmM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4qIGNvbnN0IGludGVyZmFjZSwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudEludGVyZmFjZSopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICppbnRlcmZhY2UgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KAorICAgICAgICAgICAgICAgIG5ldyBTaW1wbGVJbnRlcmZhY2U8QzJTb2Z0RmxhY0VuYzo6SW50ZkltcGw+KAorICAgICAgICAgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsIGlkLCBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdEZsYWNFbmM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5DMlNvZnRGbGFjRW5jRmFjdG9yeSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiBtSGVscGVyOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworZXh0ZXJuICJDIiA6OkMyQ29tcG9uZW50RmFjdG9yeSogQ3JlYXRlQ29kZWMyRmFjdG9yeSgpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuIG5ldyA6OmFuZHJvaWQ6OkMyU29mdEZsYWNFbmNGYWN0b3J5KCk7Cit9CisKK2V4dGVybiAiQyIgdm9pZCBEZXN0cm95Q29kZWMyRmFjdG9yeSg6OkMyQ29tcG9uZW50RmFjdG9yeSogZmFjdG9yeSkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICBkZWxldGUgZmFjdG9yeTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2ZsYWMvQzJTb2Z0RmxhY0VuYy5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZmxhYy9DMlNvZnRGbGFjRW5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RmMzA1ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2ZsYWMvQzJTb2Z0RmxhY0VuYy5oCkBAIC0wLDAgKzEsODkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQzJfU09GVF9GTEFDX0VOQ19IXworI2RlZmluZSBBTkRST0lEX0MyX1NPRlRfRkxBQ19FTkNfSF8KKworI2luY2x1ZGUgPFNpbXBsZUMyQ29tcG9uZW50Lmg+CisKKyNpbmNsdWRlICJGTEFDL3N0cmVhbV9lbmNvZGVyLmgiCisKKyNkZWZpbmUgRkxBQ19DT01QUkVTU0lPTl9MRVZFTF9NSU4gICAgIDAKKyNkZWZpbmUgRkxBQ19DT01QUkVTU0lPTl9MRVZFTF9ERUZBVUxUIDUKKyNkZWZpbmUgRkxBQ19DT01QUkVTU0lPTl9MRVZFTF9NQVggICAgIDgKKworI2RlZmluZSBGTEFDX0hFQURFUl9TSVpFICAgICAgICAgICAgICAgMTI4CisKKyNkZWZpbmUgTUlOKGEsIGIpICAgICAgICAgICAgICAgICAgICAgICgoKGEpIDwgKGIpKSA/IChhKSA6IChiKSkKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBDMlNvZnRGbGFjRW5jIDogcHVibGljIFNpbXBsZUMyQ29tcG9uZW50IHsKK3B1YmxpYzoKKyAgICBjbGFzcyBJbnRmSW1wbDsKKworICAgIEMyU29mdEZsYWNFbmMoY29uc3QgY2hhciAqbmFtZSwgYzJfbm9kZV9pZF90IGlkLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+ICZpbnRmSW1wbCk7CisgICAgdmlydHVhbCB+QzJTb2Z0RmxhY0VuYygpOworCisgICAgLy8gRnJvbSBTaW1wbGVDMkNvbXBvbmVudAorICAgIGMyX3N0YXR1c190IG9uSW5pdCgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uU3RvcCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZXNldCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZWxlYXNlKCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25GbHVzaF9zbSgpIG92ZXJyaWRlOworICAgIHZvaWQgcHJvY2VzcygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3QgZHJhaW4oCisgICAgICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBzdGF0dXNfdCBjb25maWd1cmVFbmNvZGVyKCk7CisgICAgc3RhdGljIEZMQUNfX1N0cmVhbUVuY29kZXJXcml0ZVN0YXR1cyBmbGFjRW5jb2RlcldyaXRlQ2FsbGJhY2soCisgICAgICAgICAgICBjb25zdCBGTEFDX19TdHJlYW1FbmNvZGVyICplbmNvZGVyLCBjb25zdCBGTEFDX19ieXRlIGJ1ZmZlcltdLAorICAgICAgICAgICAgc2l6ZV90IGJ5dGVzLCB1bnNpZ25lZCBzYW1wbGVzLCB1bnNpZ25lZCBjdXJyZW50X2ZyYW1lLAorICAgICAgICAgICAgdm9pZCAqY2xpZW50X2RhdGEpOworICAgIEZMQUNfX1N0cmVhbUVuY29kZXJXcml0ZVN0YXR1cyBvbkVuY29kZWRGbGFjQXZhaWxhYmxlKAorICAgICAgICAgICAgY29uc3QgRkxBQ19fYnl0ZSBidWZmZXJbXSwgc2l6ZV90IGJ5dGVzLCB1bnNpZ25lZCBzYW1wbGVzLAorICAgICAgICAgICAgdW5zaWduZWQgY3VycmVudF9mcmFtZSk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+IG1JbnRmOworICAgIGNvbnN0IHVuc2lnbmVkIGludCBrSW5CbG9ja1NpemUgPSAxMTUyOworICAgIGNvbnN0IHVuc2lnbmVkIGludCBrTWF4TnVtQ2hhbm5lbHMgPSAyOworICAgIEZMQUNfX1N0cmVhbUVuY29kZXIqIG1GbGFjU3RyZWFtRW5jb2RlcjsKKyAgICBGTEFDX19pbnQzMiogbUlucHV0QnVmZmVyUGNtMzI7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IG1PdXRwdXRCbG9jazsKKyAgICBib29sIG1TaWduYWxsZWRFcnJvcjsKKyAgICBib29sIG1TaWduYWxsZWRPdXRwdXRFb3M7CisgICAgdWludDMyX3QgbUNvbXByZXNzaW9uTGV2ZWw7CisgICAgdWludDMyX3QgbUJsb2NrU2l6ZTsKKyAgICBib29sIG1Jc0ZpcnN0RnJhbWU7CisgICAgdWludDY0X3QgbUFuY2hvclRpbWVTdGFtcDsKKyAgICB1aW50NjRfdCBtUHJvY2Vzc2VkU2FtcGxlczsKKyAgICAvLyBzaG91bGQgdGhlIGRhdGEgcmVjZWl2ZWQgYnkgdGhlIGNhbGxiYWNrIGJlIHdyaXR0ZW4gdG8gdGhlIG91dHB1dCBwb3J0CisgICAgYm9vbCBtRW5jb2RlcldyaXRlRGF0YTsKKyAgICBzaXplX3QgbUVuY29kZXJSZXR1cm5lZE5iQnl0ZXM7CisgICAgdW5zaWduZWQgbUhlYWRlck9mZnNldDsKKyAgICBib29sIG1Xcm90ZUhlYWRlcjsKKyAgICBjaGFyIG1IZWFkZXJbRkxBQ19IRUFERVJfU0laRV07CisKKyAgICBDMl9ET19OT1RfQ09QWShDMlNvZnRGbGFjRW5jKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9DMl9TT0ZUX0ZMQUNfRU5DX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9mbGFjL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9mbGFjL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2ZsYWMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZmxhYy9OT1RJQ0UgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9mbGFjL05PVElDRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWIxZWZhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZmxhYy9OT1RJQ0UKQEAgLTAsMCArMSwxOTAgQEAKKworICAgQ29weXJpZ2h0IChjKSAyMDA1LTIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0CisgICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCisKKyAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgorCisgICAxLiBEZWZpbml0aW9ucy4KKworICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKKyAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgorCisgICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQorICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgorCisgICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCisgICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCisgICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAorICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCisgICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgorICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCisgICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgorCisgICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgorCisgICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKKyAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KKyAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCisKKyAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCisgICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0CisgICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCisgICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCisKKyAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCisgICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCisgICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKKyAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCisKKyAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKKyAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKKyAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKKyAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCisgICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KKyAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKKyAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCisKKyAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCisgICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCisgICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKKyAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKKyAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgorICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCisgICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50CisgICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bworICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKKyAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCisgICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKKyAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCisgICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKKworICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAorICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCisKKyAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKyAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAorICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCisgICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgorCisgICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKKyAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAorICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKKyAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCisgICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCisgICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQorICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKKyAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKKyAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0CisgICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCisgICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKKyAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KKworICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKKyAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAorICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKKyAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCisgICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgorICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCisKKyAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKKyAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKKworICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCisgICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAorICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCisgICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgorICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKKworICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCisgICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAorICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAorICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAorICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQorICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCisgICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgorICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAorICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKKyAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKKyAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCisgICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KKyAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQorICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAorICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAorICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KKworICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCisgICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCisgICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKKyAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAorICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KKworICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAorICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCisgICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCisgICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5CisgICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAorICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgorCisgICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCisgICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCisgICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKKyAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgorCisgICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKKyAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKKyAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisgICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucworICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQorICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCisgICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKKyAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KKworICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCisgICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKKyAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5CisgICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQorICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAorICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCisgICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCisgICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCisgICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAorICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgorICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgorCisgICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCisgICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAorICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKKyAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCisgICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQorICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKKyAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKKyAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQorICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgorICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCisKKyAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUworCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nNzExL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nNzExL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2VkZTY4YwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2c3MTEvQW5kcm9pZC5icApAQCAtMCwwICsxLDIzIEBACitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X2c3MTFhbGF3ZGVjIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfc2FuaXRpemVfYWxsLWRlZmF1bHRzIiwKKyAgICBdLAorCisgICAgc3JjczogWyJDMlNvZnRHNzExRGVjLmNwcCJdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItREFMQVciLAorICAgIF0sCit9CisKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfZzcxMW1sYXdkZWMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9hbGwtZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbIkMyU29mdEc3MTFEZWMuY3BwIl0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nNzExL0MyU29mdEc3MTFEZWMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZzcxMS9DMlNvZnRHNzExRGVjLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzcxZDQ1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZzcxMS9DMlNvZnRHNzExRGVjLmNwcApAQCAtMCwwICsxLDMyMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJTb2Z0RzcxMURlYyIKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oPgorCisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxTaW1wbGVDMkludGVyZmFjZS5oPgorCisjaW5jbHVkZSAiQzJTb2Z0RzcxMURlYy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKyNpZmRlZiBBTEFXCitjb25zdGV4cHIgY2hhciBDT01QT05FTlRfTkFNRVtdID0gImMyLmFuZHJvaWQuZzcxMS5hbGF3LmRlY29kZXIiOworI2Vsc2UKK2NvbnN0ZXhwciBjaGFyIENPTVBPTkVOVF9OQU1FW10gPSAiYzIuYW5kcm9pZC5nNzExLm1sYXcuZGVjb2RlciI7CisjZW5kaWYKKworY2xhc3MgQzJTb2Z0RzcxMURlYzo6SW50ZkltcGwgOiBwdWJsaWMgQzJJbnRlcmZhY2VIZWxwZXIgeworcHVibGljOgorICAgIGV4cGxpY2l0IEludGZJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gJmhlbHBlcikKKyAgICAgICAgOiBDMkludGVyZmFjZUhlbHBlcihoZWxwZXIpIHsKKworICAgICAgICBzZXREZXJpdmVkSW5zdGFuY2UodGhpcyk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dEZvcm1hdCwgQzJfTkFNRV9JTlBVVF9TVFJFQU1fRk9STUFUX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbUZvcm1hdENvbmZpZzo6aW5wdXQoMHUsIEMyRm9ybWF0Q29tcHJlc3NlZCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtT3V0cHV0Rm9ybWF0LCBDMl9OQU1FX09VVFBVVF9TVFJFQU1fRk9STUFUX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbUZvcm1hdENvbmZpZzo6b3V0cHV0KDB1LCBDMkZvcm1hdEF1ZGlvKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dE1lZGlhVHlwZSwgQzJfTkFNRV9JTlBVVF9QT1JUX01JTUVfU0VUVElORykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoQWxsb2NTaGFyZWRTdHJpbmc8QzJQb3J0TWltZUNvbmZpZzo6aW5wdXQ+KAorI2lmZGVmIEFMQVcKKyAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX0c3MTFfQUxBVworI2Vsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX0c3MTFfTUxBVworI2VuZGlmCisgICAgICAgICAgICAgICAgKSkuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1PdXRwdXRNZWRpYVR5cGUsIEMyX05BTUVfT1VUUFVUX1BPUlRfTUlNRV9TRVRUSU5HKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShBbGxvY1NoYXJlZFN0cmluZzxDMlBvcnRNaW1lQ29uZmlnOjpvdXRwdXQ+KAorICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1TYW1wbGVSYXRlLCBDMl9OQU1FX1NUUkVBTV9TQU1QTEVfUkFURV9TRVRUSU5HKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0KDB1LCA4MDAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1TYW1wbGVSYXRlLCB2YWx1ZSkuaW5SYW5nZSg4MDAwLCA0ODAwMCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKChTZXR0ZXI8ZGVjbHR5cGUoKm1TYW1wbGVSYXRlKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQ2hhbm5lbENvdW50LCBDMl9OQU1FX1NUUkVBTV9DSEFOTkVMX0NPVU5UX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86Om91dHB1dCgwdSwgMSkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQ2hhbm5lbENvdW50LCB2YWx1ZSkuZXF1YWxUbygxKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptQ2hhbm5lbENvdW50KT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1CaXRyYXRlLCBDMl9OQU1FX1NUUkVBTV9CSVRSQVRFX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMkJpdHJhdGVUdW5pbmc6OmlucHV0KDB1LCA2NDAwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQml0cmF0ZSwgdmFsdWUpLmVxdWFsVG8oNjQwMDApfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1CaXRyYXRlKT46Ok5vblN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dE1heEJ1ZlNpemUsIEMyX1BBUkFNS0VZX0lOUFVUX01BWF9CVUZGRVJfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0KDB1LCA4MTkyKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgfQorCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUZvcm1hdENvbmZpZzo6aW5wdXQ+IG1JbnB1dEZvcm1hdDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Gb3JtYXRDb25maWc6Om91dHB1dD4gbU91dHB1dEZvcm1hdDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0TWltZUNvbmZpZzo6aW5wdXQ+IG1JbnB1dE1lZGlhVHlwZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0TWltZUNvbmZpZzo6b3V0cHV0PiBtT3V0cHV0TWVkaWFUeXBlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjpvdXRwdXQ+IG1TYW1wbGVSYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86Om91dHB1dD4gbUNoYW5uZWxDb3VudDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCaXRyYXRlVHVuaW5nOjppbnB1dD4gbUJpdHJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0PiBtSW5wdXRNYXhCdWZTaXplOworfTsKKworQzJTb2Z0RzcxMURlYzo6QzJTb2Z0RzcxMURlYygKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+ICZpbnRmSW1wbCkKKyAgICA6IFNpbXBsZUMyQ29tcG9uZW50KHN0ZDo6bWFrZV9zaGFyZWQ8U2ltcGxlSW50ZXJmYWNlPEludGZJbXBsPj4obmFtZSwgaWQsIGludGZJbXBsKSksCisgICAgICBtSW50ZihpbnRmSW1wbCkgeworfQorCitDMlNvZnRHNzExRGVjOjp+QzJTb2Z0RzcxMURlYygpIHsKKyAgICBvblJlbGVhc2UoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0RzcxMURlYzo6b25Jbml0KCkgeworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEc3MTFEZWM6Om9uU3RvcCgpIHsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisgICAgcmV0dXJuIEMyX09LOworfQorCit2b2lkIEMyU29mdEc3MTFEZWM6Om9uUmVzZXQoKSB7CisgICAgKHZvaWQpb25TdG9wKCk7Cit9CisKK3ZvaWQgQzJTb2Z0RzcxMURlYzo6b25SZWxlYXNlKCkgeworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRHNzExRGVjOjpvbkZsdXNoX3NtKCkgeworICAgIHJldHVybiBvblN0b3AoKTsKK30KKwordm9pZCBDMlNvZnRHNzExRGVjOjpwcm9jZXNzKAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgIC8vIEluaXRpYWxpemUgb3V0cHV0IHdvcmsKKyAgICB3b3JrLT5yZXN1bHQgPSBDMl9PSzsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworCisgICAgaWYgKG1TaWduYWxsZWRPdXRwdXRFb3MpIHsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQkFEX1ZBTFVFOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQzJSZWFkVmlldyByVmlldyA9IG1EdW1teVJlYWRWaWV3OworICAgIHNpemVfdCBpbk9mZnNldCA9IDB1OworICAgIHNpemVfdCBpblNpemUgPSAwdTsKKyAgICBpZiAoIXdvcmstPmlucHV0LmJ1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICByVmlldyA9IHdvcmstPmlucHV0LmJ1ZmZlcnNbMF0tPmRhdGEoKS5saW5lYXJCbG9ja3MoKS5mcm9udCgpLm1hcCgpLmdldCgpOworICAgICAgICBpblNpemUgPSByVmlldy5jYXBhY2l0eSgpOworICAgICAgICBpZiAoaW5TaXplICYmIHJWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJyZWFkIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHJWaWV3LmVycm9yKCkpOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorICAgIGJvb2wgZW9zID0gKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgIT0gMDsKKyAgICBpbnQgb3V0U2l6ZSA9IGluU2l6ZSAqIHNpemVvZihpbnQxNl90KTsKKworICAgIEFMT0dWKCJpbiBidWZmZXIgYXR0ci4gc2l6ZSAlenUgdGltZXN0YW1wICVkIGZyYW1laW5kZXggJWQiLCBpblNpemUsCisgICAgICAgICAgKGludCl3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrdSgpLCAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpKTsKKworICAgIGlmIChpblNpemUgPT0gMCkgeworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgICAgICBpZiAoZW9zKSB7CisgICAgICAgICAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gdHJ1ZTsKKyAgICAgICAgICAgIEFMT0dWKCJzaWduYWxsZWQgRU9TIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHVpbnQ4X3QgKmlucHV0cHRyID0gY29uc3RfY2FzdDx1aW50OF90ICo+KHJWaWV3LmRhdGEoKSArIGluT2Zmc2V0KTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBibG9jazsKKyAgICBDMk1lbW9yeVVzYWdlIHVzYWdlID0geyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH07CisgICAgYzJfc3RhdHVzX3QgZXJyID0gcG9vbC0+ZmV0Y2hMaW5lYXJCbG9jayhvdXRTaXplLCB1c2FnZSwgJmJsb2NrKTsKKyAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dFKCJmZXRjaExpbmVhckJsb2NrIGZvciBPdXRwdXQgZmFpbGVkIHdpdGggc3RhdHVzICVkIiwgZXJyKTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfTk9fTUVNT1JZOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEMyV3JpdGVWaWV3IHdWaWV3ID0gYmxvY2stPm1hcCgpLmdldCgpOworICAgIGlmICh3Vmlldy5lcnJvcigpKSB7CisgICAgICAgIEFMT0dFKCJ3cml0ZSB2aWV3IG1hcCBmYWlsZWQgJWQiLCB3Vmlldy5lcnJvcigpKTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGludDE2X3QgKm91dHB1dHB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50MTZfdCAqPih3Vmlldy5kYXRhKCkpOworCisjaWZkZWYgQUxBVworICAgIERlY29kZUFMYXcob3V0cHV0cHRyLCBpbnB1dHB0ciwgaW5TaXplKTsKKyNlbHNlCisgICAgRGVjb2RlTUxhdyhvdXRwdXRwdHIsIGlucHV0cHRyLCBpblNpemUpOworI2VuZGlmCisKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLnB1c2hfYmFjayhjcmVhdGVMaW5lYXJCdWZmZXIoYmxvY2spKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisKKyAgICBpZiAoZW9zKSB7CisgICAgICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSB0cnVlOworICAgICAgICBBTE9HVigic2lnbmFsbGVkIEVPUyIpOworICAgIH0KK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0RzcxMURlYzo6ZHJhaW4oCisgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgICh2b2lkKSBwb29sOworICAgIGlmIChkcmFpbk1vZGUgPT0gTk9fRFJBSU4pIHsKKyAgICAgICAgQUxPR1coImRyYWluIHdpdGggTk9fRFJBSU46IG5vLW9wIik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisgICAgaWYgKGRyYWluTW9kZSA9PSBEUkFJTl9DSEFJTikgeworICAgICAgICBBTE9HVygiRFJBSU5fQ0hBSU4gbm90IHN1cHBvcnRlZCIpOworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKKyNpZmRlZiBBTEFXCit2b2lkIEMyU29mdEc3MTFEZWM6OkRlY29kZUFMYXcoCisgICAgICAgIGludDE2X3QgKm91dCwgY29uc3QgdWludDhfdCAqaW4sIHNpemVfdCBpblNpemUpIHsKKyAgICB3aGlsZSAoaW5TaXplID4gMCkgeworICAgICAgICBpblNpemUtLTsKKyAgICAgICAgaW50MzJfdCB4ID0gKmluKys7CisKKyAgICAgICAgaW50MzJfdCBpeCA9IHggXiAweDU1OworICAgICAgICBpeCAmPSAweDdmOworCisgICAgICAgIGludDMyX3QgaWV4cCA9IGl4ID4+IDQ7CisgICAgICAgIGludDMyX3QgbWFudCA9IGl4ICYgMHgwZjsKKworICAgICAgICBpZiAoaWV4cCA+IDApIHsKKyAgICAgICAgICAgIG1hbnQgKz0gMTY7CisgICAgICAgIH0KKworICAgICAgICBtYW50ID0gKG1hbnQgPDwgNCkgKyA4OworCisgICAgICAgIGlmIChpZXhwID4gMSkgeworICAgICAgICAgICAgbWFudCA9IG1hbnQgPDwgKGlleHAgLSAxKTsKKyAgICAgICAgfQorCisgICAgICAgICpvdXQrKyA9ICh4ID4gMTI3KSA/IG1hbnQgOiAtbWFudDsKKyAgICB9Cit9CisjZWxzZQordm9pZCBDMlNvZnRHNzExRGVjOjpEZWNvZGVNTGF3KAorICAgICAgICBpbnQxNl90ICpvdXQsIGNvbnN0IHVpbnQ4X3QgKmluLCBzaXplX3QgaW5TaXplKSB7CisgICAgd2hpbGUgKGluU2l6ZSA+IDApIHsKKyAgICAgICAgaW5TaXplLS07CisgICAgICAgIGludDMyX3QgeCA9ICppbisrOworCisgICAgICAgIGludDMyX3QgbWFudGlzc2EgPSB+eDsKKyAgICAgICAgaW50MzJfdCBleHBvbmVudCA9IChtYW50aXNzYSA+PiA0KSAmIDc7CisgICAgICAgIGludDMyX3Qgc2VnbWVudCA9IGV4cG9uZW50ICsgMTsKKyAgICAgICAgbWFudGlzc2EgJj0gMHgwZjsKKworICAgICAgICBpbnQzMl90IHN0ZXAgPSA0IDw8IHNlZ21lbnQ7CisKKyAgICAgICAgaW50MzJfdCBhYnMgPSAoMHg4MGwgPDwgZXhwb25lbnQpICsgc3RlcCAqIG1hbnRpc3NhICsgc3RlcCAvIDIgLSA0ICogMzM7CisKKyAgICAgICAgKm91dCsrID0gKHggPCAweDgwKSA/IC1hYnMgOiBhYnM7CisgICAgfQorfQorI2VuZGlmCisKK2NsYXNzIEMyU29mdEc3MTFEZWNGYWN0b3J5IDogcHVibGljIEMyQ29tcG9uZW50RmFjdG9yeSB7CitwdWJsaWM6CisgICAgQzJTb2Z0RzcxMURlY0ZhY3RvcnkoKSA6IG1IZWxwZXIoc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyUmVmbGVjdG9ySGVscGVyPigKKyAgICAgICAgICAgIEdldENvZGVjMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKS0+Z2V0UGFyYW1SZWZsZWN0b3IoKSkpIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4qIGNvbnN0IGNvbXBvbmVudCwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudCopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICpjb21wb25lbnQgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KAorICAgICAgICAgICAgICAgIG5ldyBDMlNvZnRHNzExRGVjKENPTVBPTkVOVF9OQU1FLCBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdEc3MTFEZWM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiogY29uc3QgaW50ZXJmYWNlLAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50SW50ZXJmYWNlKik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmludGVyZmFjZSA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4oCisgICAgICAgICAgICAgICAgbmV3IFNpbXBsZUludGVyZmFjZTxDMlNvZnRHNzExRGVjOjpJbnRmSW1wbD4oCisgICAgICAgICAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwgaWQsIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0RzcxMURlYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgfkMyU29mdEc3MTFEZWNGYWN0b3J5KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gbUhlbHBlcjsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2V4dGVybiAiQyIgOjpDMkNvbXBvbmVudEZhY3RvcnkqIENyZWF0ZUNvZGVjMkZhY3RvcnkoKSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIHJldHVybiBuZXcgOjphbmRyb2lkOjpDMlNvZnRHNzExRGVjRmFjdG9yeSgpOworfQorCitleHRlcm4gIkMiIHZvaWQgRGVzdHJveUNvZGVjMkZhY3RvcnkoOjpDMkNvbXBvbmVudEZhY3RvcnkqIGZhY3RvcnkpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgZGVsZXRlIGZhY3Rvcnk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nNzExL0MyU29mdEc3MTFEZWMuaCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2c3MTEvQzJTb2Z0RzcxMURlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzZThmZmMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nNzExL0MyU29mdEc3MTFEZWMuaApAQCAtMCwwICsxLDU5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0MyX1NPRlRfRzcxMV9ERUNfSF8KKyNkZWZpbmUgQU5EUk9JRF9DMl9TT0ZUX0c3MTFfREVDX0hfCisKKyNpbmNsdWRlIDxTaW1wbGVDMkNvbXBvbmVudC5oPgorCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEMyU29mdEc3MTFEZWMgOiBwdWJsaWMgU2ltcGxlQzJDb21wb25lbnQgeworICAgIGNsYXNzIEludGZJbXBsOworCisgICAgQzJTb2Z0RzcxMURlYyhjb25zdCBjaGFyICpuYW1lLCBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+ICZpbnRmSW1wbCk7CisgICAgdmlydHVhbCB+QzJTb2Z0RzcxMURlYygpOworCisgICAgLy8gRnJvbSBTaW1wbGVDMkNvbXBvbmVudAorICAgIGMyX3N0YXR1c190IG9uSW5pdCgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uU3RvcCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZXNldCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZWxlYXNlKCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25GbHVzaF9zbSgpIG92ZXJyaWRlOworICAgIHZvaWQgcHJvY2VzcygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3QgZHJhaW4oCisgICAgICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiBtSW50ZjsKKyAgICBib29sIG1TaWduYWxsZWRPdXRwdXRFb3M7CisKKyNpZmRlZiBBTEFXCisgICAgdm9pZCBEZWNvZGVBTGF3KGludDE2X3QgKm91dCwgY29uc3QgdWludDhfdCAqaW4sIHNpemVfdCBpblNpemUpOworI2Vsc2UKKyAgICB2b2lkIERlY29kZU1MYXcoaW50MTZfdCAqb3V0LCBjb25zdCB1aW50OF90ICppbiwgc2l6ZV90IGluU2l6ZSk7CisjZW5kaWYKKworICAgIEMyX0RPX05PVF9DT1BZKEMyU29mdEc3MTFEZWMpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0MyX1NPRlRfRzcxMV9ERUNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2c3MTEvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMiBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2c3MTEvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZzcxMS9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nNzExL05PVElDRSBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2c3MTEvTk9USUNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1YjFlZmEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nNzExL05PVElDRQpAQCAtMCwwICsxLDE5MCBAQAorCisgICBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKKyAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KKworICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCisKKyAgIDEuIERlZmluaXRpb25zLgorCisgICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAorICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCisKKyAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5CisgICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCisKKyAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKKyAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KKyAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCisgICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKKyAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCisgICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKKyAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCisKKyAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCisKKyAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAorICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgorICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KKworICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKKyAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKKyAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKKyAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KKworICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKKyAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKKyAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaworICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KKworICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAorICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQorICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucworICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKKyAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgorICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAorICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KKworICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKKyAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKKyAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQorICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgorICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCisgICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKKyAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKKyAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCisgICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAorICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKKyAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAorICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKKyAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgorCisgICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCisgICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KKworICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCisgICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKKyAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCisKKyAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKyAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAorICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCisgICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQorICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKKyAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKKyAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91CisgICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQorICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaworICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKKyAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKKyAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQorICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgorCisgICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQorICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0CisgICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQorICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCisgICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKKworICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcworICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAorCisgICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKKyAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCisgICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKKyAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCisgICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAorCisgICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKKyAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0CisgICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCisgICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90CisgICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCisgICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKKyAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCisgICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCisgICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAorICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cworICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKKyAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgorICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCisgICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCisgICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCisgICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgorCisgICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKKyAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKKyAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAorICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCisgICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgorCisgICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCisgICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKKyAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KKyAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKKyAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCisgICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCisKKyAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKKyAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKKyAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQorICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCisKKyAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgorICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAorICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCisgICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCisgICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKKyAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQorICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgorCisgICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKKyAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAorICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKKyAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCisgICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCisgICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKKyAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKKyAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKKyAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCisgICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCisgICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCisKKyAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKKyAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCisgICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAorICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKKyAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5CisgICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgorICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAorICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5CisgICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCisgICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KKworICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2dzbS9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZ3NtL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTMzMGMwMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2dzbS9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMTEgQEAKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfZ3NtZGVjIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfc2FuaXRpemVfYWxsLWRlZmF1bHRzIiwKKyAgICBdLAorCisgICAgc3JjczogWyJDMlNvZnRHc21EZWMuY3BwIl0sCisKKyAgICBzdGF0aWNfbGliczogWyJsaWJnc20iXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2dzbS9DMlNvZnRHc21EZWMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZ3NtL0MyU29mdEdzbURlYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzEwMWM3OQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2dzbS9DMlNvZnRHc21EZWMuY3BwCkBAIC0wLDAgKzEsMzExIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDMlNvZnRHc21EZWMiCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaD4KKworI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8U2ltcGxlQzJJbnRlcmZhY2UuaD4KKworI2luY2x1ZGUgIkMyU29mdEdzbURlYy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NvbnN0ZXhwciBjaGFyIENPTVBPTkVOVF9OQU1FW10gPSAiYzIuYW5kcm9pZC5nc20uZGVjb2RlciI7CisKK2NsYXNzIEMyU29mdEdzbURlYzo6SW50ZkltcGwgOiBwdWJsaWMgQzJJbnRlcmZhY2VIZWxwZXIgeworICAgcHVibGljOgorICAgIGV4cGxpY2l0IEludGZJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4mIGhlbHBlcikKKyAgICAgICAgOiBDMkludGVyZmFjZUhlbHBlcihoZWxwZXIpIHsKKyAgICAgICAgc2V0RGVyaXZlZEluc3RhbmNlKHRoaXMpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRGb3JtYXQsIEMyX05BTUVfSU5QVVRfU1RSRUFNX0ZPUk1BVF9TRVRUSU5HKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1Gb3JtYXRDb25maWc6OmlucHV0KDB1LCBDMkZvcm1hdENvbXByZXNzZWQpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obU91dHB1dEZvcm1hdCwgQzJfTkFNRV9PVVRQVVRfU1RSRUFNX0ZPUk1BVF9TRVRUSU5HKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1Gb3JtYXRDb25maWc6Om91dHB1dCgwdSwgQzJGb3JtYXRBdWRpbykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRNZWRpYVR5cGUsIEMyX05BTUVfSU5QVVRfUE9SVF9NSU1FX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKEFsbG9jU2hhcmVkU3RyaW5nPEMyUG9ydE1pbWVDb25maWc6OmlucHV0PigKKyAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX01TR1NNKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1PdXRwdXRNZWRpYVR5cGUsIEMyX05BTUVfT1VUUFVUX1BPUlRfTUlNRV9TRVRUSU5HKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShBbGxvY1NoYXJlZFN0cmluZzxDMlBvcnRNaW1lQ29uZmlnOjpvdXRwdXQ+KAorICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1TYW1wbGVSYXRlLCBDMl9OQU1FX1NUUkVBTV9TQU1QTEVfUkFURV9TRVRUSU5HKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0KDB1LCA4MDAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1TYW1wbGVSYXRlLCB2YWx1ZSkuZXF1YWxUbyg4MDAwKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoKFNldHRlcjxkZWNsdHlwZSgqbVNhbXBsZVJhdGUpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1DaGFubmVsQ291bnQsIEMyX05BTUVfU1RSRUFNX0NIQU5ORUxfQ09VTlRfU0VUVElORykKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6b3V0cHV0KDB1LCAxKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1DaGFubmVsQ291bnQsIHZhbHVlKS5lcXVhbFRvKDEpfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1DaGFubmVsQ291bnQpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUJpdHJhdGUsIEMyX05BTUVfU1RSRUFNX0JJVFJBVEVfU0VUVElORykKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyQml0cmF0ZVR1bmluZzo6aW5wdXQoMHUsIDEzMjAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1CaXRyYXRlLCB2YWx1ZSkuZXF1YWxUbygxMzIwMCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbUJpdHJhdGUpPjo6Tm9uU3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0TWF4QnVmU2l6ZSwgQzJfUEFSQU1LRVlfSU5QVVRfTUFYX0JVRkZFUl9TSVpFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQoMHUsIDEwMjQgLyBNU0dTTV9JTl9GUk1fU1ogKiBNU0dTTV9JTl9GUk1fU1opKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICB9CisKKyAgIHByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRm9ybWF0Q29uZmlnOjppbnB1dD4gbUlucHV0Rm9ybWF0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUZvcm1hdENvbmZpZzo6b3V0cHV0PiBtT3V0cHV0Rm9ybWF0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRNaW1lQ29uZmlnOjppbnB1dD4gbUlucHV0TWVkaWFUeXBlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRNaW1lQ29uZmlnOjpvdXRwdXQ+IG1PdXRwdXRNZWRpYVR5cGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86Om91dHB1dD4gbVNhbXBsZVJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6b3V0cHV0PiBtQ2hhbm5lbENvdW50OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJpdHJhdGVUdW5pbmc6OmlucHV0PiBtQml0cmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQ+IG1JbnB1dE1heEJ1ZlNpemU7Cit9OworCitDMlNvZnRHc21EZWM6OkMyU29mdEdzbURlYyhjb25zdCBjaGFyICpuYW1lLCBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+JiBpbnRmSW1wbCkKKyAgICA6IFNpbXBsZUMyQ29tcG9uZW50KAorICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPFNpbXBsZUludGVyZmFjZTxJbnRmSW1wbD4+KG5hbWUsIGlkLCBpbnRmSW1wbCkpLAorICAgICAgbUludGYoaW50ZkltcGwpLAorICAgICAgbUdzbShudWxscHRyKSB7Cit9CisKK0MyU29mdEdzbURlYzo6fkMyU29mdEdzbURlYygpIHsKKyAgICBvblJlbGVhc2UoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0R3NtRGVjOjpvbkluaXQoKSB7CisgICAgaWYgKCFtR3NtKSBtR3NtID0gZ3NtX2NyZWF0ZSgpOworICAgIGlmICghbUdzbSkgcmV0dXJuIEMyX05PX01FTU9SWTsKKyAgICBpbnQgbXNvcHQgPSAxOworICAgICh2b2lkKWdzbV9vcHRpb24obUdzbSwgR1NNX09QVF9XQVY0OSwgJm1zb3B0KTsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkRW9zID0gZmFsc2U7CisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRHc21EZWM6Om9uU3RvcCgpIHsKKyAgICBpZiAobUdzbSkgeworICAgICAgICBnc21fZGVzdHJveShtR3NtKTsKKyAgICAgICAgbUdzbSA9IG51bGxwdHI7CisgICAgfQorICAgIGlmICghbUdzbSkgbUdzbSA9IGdzbV9jcmVhdGUoKTsKKyAgICBpZiAoIW1Hc20pIHJldHVybiBDMl9OT19NRU1PUlk7CisgICAgaW50IG1zb3B0ID0gMTsKKyAgICAodm9pZClnc21fb3B0aW9uKG1Hc20sIEdTTV9PUFRfV0FWNDksICZtc29wdCk7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZEVvcyA9IGZhbHNlOworICAgIHJldHVybiBDMl9PSzsKK30KKwordm9pZCBDMlNvZnRHc21EZWM6Om9uUmVzZXQoKSB7CisgICAgKHZvaWQpb25TdG9wKCk7Cit9CisKK3ZvaWQgQzJTb2Z0R3NtRGVjOjpvblJlbGVhc2UoKSB7CisgICAgaWYgKG1Hc20pIHsKKyAgICAgICAgZ3NtX2Rlc3Ryb3kobUdzbSk7CisgICAgICAgIG1Hc20gPSBudWxscHRyOworICAgIH0KK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0R3NtRGVjOjpvbkZsdXNoX3NtKCkgeworICAgIHJldHVybiBvblN0b3AoKTsKK30KKworc3RhdGljIHNpemVfdCBkZWNvZGVHU00oZ3NtIGhhbmRsZSwgaW50MTZfdCAqb3V0LCBzaXplX3Qgb3V0Q2FwYWNpdHksCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICppbiwgc2l6ZV90IGluU2l6ZSkgeworICAgIHNpemVfdCBvdXRTaXplID0gMDsKKworICAgIGlmIChpblNpemUgJSBNU0dTTV9JTl9GUk1fU1ogPT0gMAorICAgICAgICAgICAgJiYgKGluU2l6ZSAvIE1TR1NNX0lOX0ZSTV9TWiAqIE1TR1NNX09VVF9GUk1fU1ogKiBzaXplb2YoKm91dCkKKyAgICAgICAgICAgICAgICAgICAgPD0gb3V0Q2FwYWNpdHkpKSB7CisgICAgICAgIHdoaWxlIChpblNpemUgPiAwKSB7CisgICAgICAgICAgICBnc21fZGVjb2RlKGhhbmRsZSwgaW4sIG91dCk7CisgICAgICAgICAgICBpbiArPSBGUkdTTV9JTl9GUk1fU1o7CisgICAgICAgICAgICBpblNpemUgLT0gRlJHU01fSU5fRlJNX1NaOworICAgICAgICAgICAgb3V0ICs9IEZSR1NNX09VVF9GUk1fU1o7CisgICAgICAgICAgICBvdXRTaXplICs9IEZSR1NNX09VVF9GUk1fU1o7CisKKyAgICAgICAgICAgIGdzbV9kZWNvZGUoaGFuZGxlLCBpbiwgb3V0KTsKKyAgICAgICAgICAgIGluICs9IEZSR1NNX0lOX0ZSTV9TWl9NSU5VU18xOworICAgICAgICAgICAgaW5TaXplIC09IEZSR1NNX0lOX0ZSTV9TWl9NSU5VU18xOworICAgICAgICAgICAgb3V0ICs9IEZSR1NNX09VVF9GUk1fU1o7CisgICAgICAgICAgICBvdXRTaXplICs9IEZSR1NNX09VVF9GUk1fU1o7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gb3V0U2l6ZSAqIHNpemVvZihpbnQxNl90KTsKK30KKwordm9pZCBDMlNvZnRHc21EZWM6OnByb2Nlc3MoCisgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgLy8gSW5pdGlhbGl6ZSBvdXRwdXQgd29yaworICAgIHdvcmstPnJlc3VsdCA9IEMyX09LOworICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisKKyAgICBpZiAobVNpZ25hbGxlZEVycm9yIHx8IG1TaWduYWxsZWRFb3MpIHsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQkFEX1ZBTFVFOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYm9vbCBlb3MgPSAoKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgIT0gMCk7CisgICAgQzJSZWFkVmlldyByVmlldyA9IG1EdW1teVJlYWRWaWV3OworICAgIHNpemVfdCBpbk9mZnNldCA9IDB1OworICAgIHNpemVfdCBpblNpemUgPSAwdTsKKyAgICBpZiAoIXdvcmstPmlucHV0LmJ1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICByVmlldyA9IHdvcmstPmlucHV0LmJ1ZmZlcnNbMF0tPmRhdGEoKS5saW5lYXJCbG9ja3MoKS5mcm9udCgpLm1hcCgpLmdldCgpOworICAgICAgICBpblNpemUgPSByVmlldy5jYXBhY2l0eSgpOworICAgICAgICBpZiAoaW5TaXplICYmIHJWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJyZWFkIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHJWaWV3LmVycm9yKCkpOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gclZpZXcuZXJyb3IoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChpblNpemUgPT0gMCkgeworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgICAgICBpZiAoZW9zKSB7CisgICAgICAgICAgICBtU2lnbmFsbGVkRW9zID0gdHJ1ZTsKKyAgICAgICAgICAgIEFMT0dWKCJzaWduYWxsZWQgRU9TIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBTE9HVigiaW4gYnVmZmVyIGF0dHIuIHNpemUgJXp1IHRpbWVzdGFtcCAlZCBmcmFtZWluZGV4ICVkIiwgaW5TaXplLAorICAgICAgICAgIChpbnQpd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAucGVla3UoKSwgKGludCl3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKSk7CisKKyAgICBzaXplX3Qgb3V0Q2FwYWNpdHkgPSAoaW5TaXplIC8gTVNHU01fSU5fRlJNX1NaICkgKiBNU0dTTV9PVVRfRlJNX1NaICogc2l6ZW9mKGludDE2X3QpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBibG9jazsKKyAgICBDMk1lbW9yeVVzYWdlIHVzYWdlID0geyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH07CisgICAgYzJfc3RhdHVzX3QgZXJyID0gcG9vbC0+ZmV0Y2hMaW5lYXJCbG9jayhvdXRDYXBhY2l0eSwgdXNhZ2UsICZibG9jayk7CisgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICBBTE9HRSgiZmV0Y2hMaW5lYXJCbG9jayBmb3IgT3V0cHV0IGZhaWxlZCB3aXRoIHN0YXR1cyAlZCIsIGVycik7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX05PX01FTU9SWTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBDMldyaXRlVmlldyB3VmlldyA9IGJsb2NrLT5tYXAoKS5nZXQoKTsKKyAgICBpZiAod1ZpZXcuZXJyb3IoKSkgeworICAgICAgICBBTE9HRSgid3JpdGUgdmlldyBtYXAgZmFpbGVkICVkIiwgd1ZpZXcuZXJyb3IoKSk7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IHdWaWV3LmVycm9yKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpbnQxNl90ICpvdXRwdXQgPSByZWludGVycHJldF9jYXN0PGludDE2X3QgKj4od1ZpZXcuZGF0YSgpKTsKKyAgICB1aW50OF90ICppbnB1dCA9IGNvbnN0X2Nhc3Q8dWludDhfdCAqPihyVmlldy5kYXRhKCkgKyBpbk9mZnNldCk7CisgICAgc2l6ZV90IG91dFNpemUgPSBkZWNvZGVHU00obUdzbSwgb3V0cHV0LCBvdXRDYXBhY2l0eSwgaW5wdXQsIGluU2l6ZSk7CisgICAgaWYgKCFvdXRTaXplKSB7CisgICAgICAgIEFMT0dFKCJlbmNvdW50ZXJlZCBpbXByb3BlciBpbnNpemUgb3Igb3V0c2l6ZSIpOworICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQUxPR1YoIm91dCBidWZmZXIgYXR0ci4gc2l6ZSAlenUiLCBvdXRTaXplKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLnB1c2hfYmFjayhjcmVhdGVMaW5lYXJCdWZmZXIoYmxvY2ssIDAsIG91dFNpemUpKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgaWYgKGVvcykgeworICAgICAgICBtU2lnbmFsbGVkRW9zID0gdHJ1ZTsKKyAgICAgICAgQUxPR1YoInNpZ25hbGxlZCBFT1MiKTsKKyAgICB9Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEdzbURlYzo6ZHJhaW4oCisgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgICh2b2lkKSBwb29sOworICAgIGlmIChkcmFpbk1vZGUgPT0gTk9fRFJBSU4pIHsKKyAgICAgICAgQUxPR1coImRyYWluIHdpdGggTk9fRFJBSU46IG5vLW9wIik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisgICAgaWYgKGRyYWluTW9kZSA9PSBEUkFJTl9DSEFJTikgeworICAgICAgICBBTE9HVygiRFJBSU5fQ0hBSU4gbm90IHN1cHBvcnRlZCIpOworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2NsYXNzIEMyU29mdEdTTURlY0ZhY3RvcnkgOiBwdWJsaWMgQzJDb21wb25lbnRGYWN0b3J5IHsKK3B1YmxpYzoKKyAgICBDMlNvZnRHU01EZWNGYWN0b3J5KCkgOiBtSGVscGVyKHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxDMlJlZmxlY3RvckhlbHBlcj4oCisgICAgICAgICAgICBHZXRDb2RlYzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCktPmdldFBhcmFtUmVmbGVjdG9yKCkpKSB7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVDb21wb25lbnQoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KiBjb25zdCBjb21wb25lbnQsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnQqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqY29tcG9uZW50ID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PigKKyAgICAgICAgICAgICAgICBuZXcgQzJTb2Z0R3NtRGVjKENPTVBPTkVOVF9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdEdzbURlYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiogY29uc3QgaW50ZXJmYWNlLAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50SW50ZXJmYWNlKik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmludGVyZmFjZSA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4oCisgICAgICAgICAgICAgICAgbmV3IFNpbXBsZUludGVyZmFjZTxDMlNvZnRHc21EZWM6OkludGZJbXBsPigKKyAgICAgICAgICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLCBpZCwgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRHc21EZWM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5DMlNvZnRHU01EZWNGYWN0b3J5KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gbUhlbHBlcjsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2V4dGVybiAiQyIgOjpDMkNvbXBvbmVudEZhY3RvcnkqIENyZWF0ZUNvZGVjMkZhY3RvcnkoKSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIHJldHVybiBuZXcgOjphbmRyb2lkOjpDMlNvZnRHU01EZWNGYWN0b3J5KCk7Cit9CisKK2V4dGVybiAiQyIgdm9pZCBEZXN0cm95Q29kZWMyRmFjdG9yeSg6OkMyQ29tcG9uZW50RmFjdG9yeSogZmFjdG9yeSkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICBkZWxldGUgZmFjdG9yeTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2dzbS9DMlNvZnRHc21EZWMuaCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2dzbS9DMlNvZnRHc21EZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjIwOWZlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZ3NtL0MyU29mdEdzbURlYy5oCkBAIC0wLDAgKzEsNjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQzJfU09GVF9HU01fREVDX0hfCisjZGVmaW5lIEFORFJPSURfQzJfU09GVF9HU01fREVDX0hfCisKKyNpbmNsdWRlIDxTaW1wbGVDMkNvbXBvbmVudC5oPgorCisKK2V4dGVybiAiQyIgeworICAgICNpbmNsdWRlICJnc20uaCIKK30KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisjZGVmaW5lIEZSR1NNX0lOX0ZSTV9TWiAgICAgICAgICAgICAzMworI2RlZmluZSBGUkdTTV9JTl9GUk1fU1pfTUlOVVNfMSAgICAgMzIKKyNkZWZpbmUgRlJHU01fT1VUX0ZSTV9TWiAgICAgICAgICAgIDE2MAorI2RlZmluZSBNU0dTTV9JTl9GUk1fU1ogICAgICAgICAgICAgKEZSR1NNX0lOX0ZSTV9TWiArIEZSR1NNX0lOX0ZSTV9TWl9NSU5VU18xKQorI2RlZmluZSBNU0dTTV9PVVRfRlJNX1NaICAgICAgICAgICAgKEZSR1NNX09VVF9GUk1fU1ogKiAyKQorCitzdHJ1Y3QgQzJTb2Z0R3NtRGVjIDogcHVibGljIFNpbXBsZUMyQ29tcG9uZW50IHsKKyAgICBjbGFzcyBJbnRmSW1wbDsKKworICAgIEMyU29mdEdzbURlYyhjb25zdCBjaGFyICpuYW1lLCBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gJmludGZJbXBsKTsKKyAgICB2aXJ0dWFsIH5DMlNvZnRHc21EZWMoKTsKKworICAgIC8vIEZyb20gU2ltcGxlQzJDb21wb25lbnQKKyAgICBjMl9zdGF0dXNfdCBvbkluaXQoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvblN0b3AoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVzZXQoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVsZWFzZSgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uRmx1c2hfc20oKSBvdmVycmlkZTsKKyAgICB2b2lkIHByb2Nlc3MoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IGRyYWluKAorICAgICAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisgcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+IG1JbnRmOworICAgIGdzbSBtR3NtOworICAgIGJvb2wgbVNpZ25hbGxlZEVycm9yOworICAgIGJvb2wgbVNpZ25hbGxlZEVvczsKKworICAgIEMyX0RPX05PVF9DT1BZKEMyU29mdEdzbURlYyk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfQzJfU09GVF9HU01fREVDX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nc20vTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMiBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2dzbS9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nc20vTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZ3NtL05PVElDRSBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2dzbS9OT1RJQ0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzViMWVmYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2dzbS9OT1RJQ0UKQEAgLTAsMCArMSwxOTAgQEAKKworICAgQ29weXJpZ2h0IChjKSAyMDA1LTIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0CisgICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCisKKyAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgorCisgICAxLiBEZWZpbml0aW9ucy4KKworICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKKyAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgorCisgICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQorICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgorCisgICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCisgICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCisgICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAorICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCisgICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgorICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCisgICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgorCisgICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgorCisgICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKKyAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KKyAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCisKKyAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCisgICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0CisgICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCisgICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCisKKyAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCisgICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCisgICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKKyAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCisKKyAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKKyAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKKyAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKKyAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCisgICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KKyAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKKyAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCisKKyAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCisgICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCisgICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKKyAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKKyAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgorICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCisgICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50CisgICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bworICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKKyAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCisgICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKKyAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCisgICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKKworICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAorICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCisKKyAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKyAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAorICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCisgICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgorCisgICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKKyAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAorICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKKyAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCisgICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCisgICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQorICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKKyAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKKyAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0CisgICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCisgICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKKyAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KKworICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKKyAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAorICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKKyAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCisgICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgorICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCisKKyAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKKyAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKKworICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCisgICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAorICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCisgICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgorICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKKworICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCisgICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAorICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAorICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAorICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQorICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCisgICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgorICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAorICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKKyAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKKyAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCisgICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KKyAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQorICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAorICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAorICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KKworICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCisgICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCisgICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKKyAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAorICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KKworICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAorICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCisgICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCisgICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5CisgICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAorICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgorCisgICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCisgICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCisgICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKKyAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgorCisgICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKKyAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKKyAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisgICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucworICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQorICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCisgICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKKyAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KKworICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCisgICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKKyAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5CisgICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQorICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAorICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCisgICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCisgICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCisgICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAorICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgorICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgorCisgICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCisgICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAorICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKKyAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCisgICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQorICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKKyAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKKyAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQorICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgorICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCisKKyAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUworCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9oZXZjL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9oZXZjL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmEwNDVlMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2hldmMvQW5kcm9pZC5icApAQCAtMCwwICsxLDE2IEBACitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X2hldmNkZWMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9zaWduZWQtZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbIkMyU29mdEhldmNEZWMuY3BwIl0sCisKKyAgICBzdGF0aWNfbGliczogWyJsaWJoZXZjZGVjIl0sCisKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImV4dGVybmFsL2xpYmhldmMvZGVjb2RlciIsCisgICAgICAgICJleHRlcm5hbC9saWJoZXZjL2NvbW1vbiIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2hldmMvQzJTb2Z0SGV2Y0RlYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9oZXZjL0MyU29mdEhldmNEZWMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5ODkyY2UKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9oZXZjL0MyU29mdEhldmNEZWMuY3BwCkBAIC0wLDAgKzEsOTc2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDMlNvZnRIZXZjRGVjIgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmg+CisKKyNpbmNsdWRlIDxDMkRlYnVnLmg+CisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxDb2RlYzJNYXBwZXIuaD4KKyNpbmNsdWRlIDxTaW1wbGVDMkludGVyZmFjZS5oPgorCisjaW5jbHVkZSAiQzJTb2Z0SGV2Y0RlYy5oIgorI2luY2x1ZGUgImloZXZjZF9jeGEuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCituYW1lc3BhY2UgeworCitjb25zdGV4cHIgY2hhciBDT01QT05FTlRfTkFNRVtdID0gImMyLmFuZHJvaWQuaGV2Yy5kZWNvZGVyIjsKKworfSAgLy8gbmFtZXNwYWNlCisKK2NsYXNzIEMyU29mdEhldmNEZWM6OkludGZJbXBsIDogcHVibGljIFNpbXBsZUludGVyZmFjZTx2b2lkPjo6QmFzZVBhcmFtcyB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgSW50ZkltcGwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiAmaGVscGVyKQorICAgICAgICA6IFNpbXBsZUludGVyZmFjZTx2b2lkPjo6QmFzZVBhcmFtcygKKyAgICAgICAgICAgICAgICBoZWxwZXIsCisgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsCisgICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OktJTkRfREVDT0RFUiwKKyAgICAgICAgICAgICAgICBDMkNvbXBvbmVudDo6RE9NQUlOX1ZJREVPLAorICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMpIHsKKyAgICAgICAgbm9Qcml2YXRlQnVmZmVycygpOyAvLyBUT0RPOiBhY2NvdW50IGZvciBvdXIgYnVmZmVycyBoZXJlCisgICAgICAgIG5vSW5wdXRSZWZlcmVuY2VzKCk7CisgICAgICAgIG5vT3V0cHV0UmVmZXJlbmNlcygpOworICAgICAgICBub0lucHV0TGF0ZW5jeSgpOworICAgICAgICBub1RpbWVTdHJldGNoKCk7CisKKyAgICAgICAgLy8gVE9ETzogb3V0cHV0IGxhdGVuY3kgYW5kIHJlb3JkZXJpbmcKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUF0dHJpYiwgQzJfUEFSQU1LRVlfQ09NUE9ORU5UX0FUVFJJQlVURVMpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMkNvbXBvbmVudEF0dHJpYnV0ZXNTZXR0aW5nKEMyQ29tcG9uZW50OjpBVFRSSUJfSVNfVEVNUE9SQUwpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVNpemUsIEMyX1BBUkFNS0VZX1BJQ1RVUkVfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQoMHUsIDMyMCwgMjQwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgd2lkdGgpLmluUmFuZ2UoMiwgNDA5NiwgMiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgaGVpZ2h0KS5pblJhbmdlKDIsIDQwOTYsIDIpLAorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2l6ZVNldHRlcikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1Qcm9maWxlTGV2ZWwsIEMyX1BBUkFNS0VZX1BST0ZJTEVfTEVWRUwpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86OmlucHV0KDB1LAorICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19NQUlOLCBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzVfMSkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgcHJvZmlsZSkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfTUFJTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU5fU1RJTEx9KSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Qcm9maWxlTGV2ZWwsIGxldmVsKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl8xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fMiwgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl8yXzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl8zLCBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzNfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzQsIEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fNF8xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fNSwgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl81XzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl81XzIsIEMyQ29uZmlnOjpMRVZFTF9IRVZDX0hJR0hfNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfSEVWQ19ISUdIXzRfMSwgQzJDb25maWc6OkxFVkVMX0hFVkNfSElHSF81LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9IRVZDX0hJR0hfNV8xLCBDMkNvbmZpZzo6TEVWRUxfSEVWQ19ISUdIXzVfMgorICAgICAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoUHJvZmlsZUxldmVsU2V0dGVyLCBtU2l6ZSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1NYXhTaXplLCBDMl9QQVJBTUtFWV9NQVhfUElDVFVSRV9TSVpFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1NYXhQaWN0dXJlU2l6ZVR1bmluZzo6b3V0cHV0KDB1LCAzMjAsIDI0MCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIHdpZHRoKS5pblJhbmdlKDIsIDQwOTYsIDIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIGhlaWdodCkuaW5SYW5nZSgyLCA0MDk2LCAyKSwKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKE1heFBpY3R1cmVTaXplU2V0dGVyLCBtU2l6ZSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1NYXhJbnB1dFNpemUsIEMyX1BBUkFNS0VZX0lOUFVUX01BWF9CVUZGRVJfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0KDB1LCAzMjAgKiAyNDAgKiAzIC8gNCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobU1heElucHV0U2l6ZSwgdmFsdWUpLmFueSgpLAorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLmNhbGN1bGF0ZWRBcyhNYXhJbnB1dFNpemVTZXR0ZXIsIG1NYXhTaXplKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBDMkNocm9tYU9mZnNldFN0cnVjdCBsb2NhdGlvbnNbMV0gPSB7IEMyQ2hyb21hT2Zmc2V0U3RydWN0OjpJVFVfWVVWXzQyMF8wKCkgfTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JJbmZvOjpvdXRwdXQ+IGRlZmF1bHRDb2xvckluZm8gPQorICAgICAgICAgICAgQzJTdHJlYW1Db2xvckluZm86Om91dHB1dDo6QWxsb2NTaGFyZWQoCisgICAgICAgICAgICAgICAgICAgIDF1LCAwdSwgOHUgLyogYml0RGVwdGggKi8sIEMyQ29sb3I6OllVVl80MjApOworICAgICAgICBtZW1jcHkoZGVmYXVsdENvbG9ySW5mby0+bS5sb2NhdGlvbnMsIGxvY2F0aW9ucywgc2l6ZW9mKGxvY2F0aW9ucykpOworCisgICAgICAgIGRlZmF1bHRDb2xvckluZm8gPSBDMlN0cmVhbUNvbG9ySW5mbzo6b3V0cHV0OjpBbGxvY1NoYXJlZCgKKyAgICAgICAgICAgIHtDMkNocm9tYU9mZnNldFN0cnVjdDo6SVRVX1lVVl80MjBfMCgpfSwgMHUsIDh1IC8qIGJpdERlcHRoICovLAorICAgICAgICAgICAgQzJDb2xvcjo6WVVWXzQyMCk7CisgICAgICAgIGhlbHBlci0+YWRkU3RydWN0RGVzY3JpcHRvcnM8QzJDaHJvbWFPZmZzZXRTdHJ1Y3Q+KCk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1Db2xvckluZm8sIEMyX1BBUkFNS0VZX0NPREVEX0NPTE9SX0lORk8pCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKGRlZmF1bHRDb2xvckluZm8pCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtRGVmYXVsdENvbG9yQXNwZWN0cywgQzJfUEFSQU1LRVlfREVGQVVMVF9DT0xPUl9BU1BFQ1RTKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1Db2xvckFzcGVjdHNUdW5pbmc6Om91dHB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgIDB1LCBDMkNvbG9yOjpSQU5HRV9VTlNQRUNJRklFRCwgQzJDb2xvcjo6UFJJTUFSSUVTX1VOU1BFQ0lGSUVELAorICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6VFJBTlNGRVJfVU5TUEVDSUZJRUQsIEMyQ29sb3I6Ok1BVFJJWF9VTlNQRUNJRklFRCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobURlZmF1bHRDb2xvckFzcGVjdHMsIHJhbmdlKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpSQU5HRV9VTlNQRUNJRklFRCwgICAgIEMyQ29sb3I6OlJBTkdFX09USEVSKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1EZWZhdWx0Q29sb3JBc3BlY3RzLCBwcmltYXJpZXMpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlBSSU1BUklFU19VTlNQRUNJRklFRCwgQzJDb2xvcjo6UFJJTUFSSUVTX09USEVSKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1EZWZhdWx0Q29sb3JBc3BlY3RzLCB0cmFuc2ZlcikuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6VFJBTlNGRVJfVU5TUEVDSUZJRUQsICBDMkNvbG9yOjpUUkFOU0ZFUl9PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtRGVmYXVsdENvbG9yQXNwZWN0cywgbWF0cml4KS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQsICAgIEMyQ29sb3I6Ok1BVFJJWF9PVEhFUikKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKERlZmF1bHRDb2xvckFzcGVjdHNTZXR0ZXIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQ29kZWRDb2xvckFzcGVjdHMsIEMyX1BBUkFNS0VZX1ZVSV9DT0xPUl9BU1BFQ1RTKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjppbnB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgIDB1LCBDMkNvbG9yOjpSQU5HRV9MSU1JVEVELCBDMkNvbG9yOjpQUklNQVJJRVNfVU5TUEVDSUZJRUQsCisgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpUUkFOU0ZFUl9VTlNQRUNJRklFRCwgQzJDb2xvcjo6TUFUUklYX1VOU1BFQ0lGSUVEKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtQ29kZWRDb2xvckFzcGVjdHMsIHJhbmdlKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpSQU5HRV9VTlNQRUNJRklFRCwgICAgIEMyQ29sb3I6OlJBTkdFX09USEVSKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Db2RlZENvbG9yQXNwZWN0cywgcHJpbWFyaWVzKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpQUklNQVJJRVNfVU5TUEVDSUZJRUQsIEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtQ29kZWRDb2xvckFzcGVjdHMsIHRyYW5zZmVyKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpUUkFOU0ZFUl9VTlNQRUNJRklFRCwgIEMyQ29sb3I6OlRSQU5TRkVSX09USEVSKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Db2RlZENvbG9yQXNwZWN0cywgbWF0cml4KS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQsICAgIEMyQ29sb3I6Ok1BVFJJWF9PVEhFUikKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKENvZGVkQ29sb3JBc3BlY3RzU2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUNvbG9yQXNwZWN0cywgQzJfUEFSQU1LRVlfQ09MT1JfQVNQRUNUUykKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6b3V0cHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgMHUsIEMyQ29sb3I6OlJBTkdFX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpQUklNQVJJRVNfVU5TUEVDSUZJRUQsCisgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpUUkFOU0ZFUl9VTlNQRUNJRklFRCwgQzJDb2xvcjo6TUFUUklYX1VOU1BFQ0lGSUVEKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtQ29sb3JBc3BlY3RzLCByYW5nZSkuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6UkFOR0VfVU5TUEVDSUZJRUQsICAgICBDMkNvbG9yOjpSQU5HRV9PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtQ29sb3JBc3BlY3RzLCBwcmltYXJpZXMpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlBSSU1BUklFU19VTlNQRUNJRklFRCwgQzJDb2xvcjo6UFJJTUFSSUVTX09USEVSKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Db2xvckFzcGVjdHMsIHRyYW5zZmVyKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpUUkFOU0ZFUl9VTlNQRUNJRklFRCwgIEMyQ29sb3I6OlRSQU5TRkVSX09USEVSKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Db2xvckFzcGVjdHMsIG1hdHJpeCkuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6TUFUUklYX1VOU1BFQ0lGSUVELCAgICBDMkNvbG9yOjpNQVRSSVhfT1RIRVIpCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihDb2xvckFzcGVjdHNTZXR0ZXIsIG1EZWZhdWx0Q29sb3JBc3BlY3RzLCBtQ29kZWRDb2xvckFzcGVjdHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIC8vIFRPRE86IHN1cHBvcnQgbW9yZSBmb3JtYXRzPworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVBpeGVsRm9ybWF0LCBDMl9QQVJBTUtFWV9QSVhFTF9GT1JNQVQpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbVBpeGVsRm9ybWF0SW5mbzo6b3V0cHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB1LCBIQUxfUElYRUxfRk9STUFUX1lDQkNSXzQyMF84ODgpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIFNpemVTZXR0ZXIoYm9vbCBtYXlCbG9jaywgY29uc3QgQzJQPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQ+ICZvbGRNZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQzJQPEMyVmlkZW9TaXplU3RyZWFtSW5mbzo6b3V0cHV0PiAmbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIEMyUiByZXMgPSBDMlI6Ok9rKCk7CisgICAgICAgIGlmICghbWUuRihtZS52LndpZHRoKS5zdXBwb3J0c0F0QWxsKG1lLnYud2lkdGgpKSB7CisgICAgICAgICAgICByZXMgPSByZXMucGx1cyhDMlNldHRpbmdSZXN1bHRCdWlsZGVyOjpCYWRWYWx1ZShtZS5GKG1lLnYud2lkdGgpKSk7CisgICAgICAgICAgICBtZS5zZXQoKS53aWR0aCA9IG9sZE1lLnYud2lkdGg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFtZS5GKG1lLnYuaGVpZ2h0KS5zdXBwb3J0c0F0QWxsKG1lLnYuaGVpZ2h0KSkgeworICAgICAgICAgICAgcmVzID0gcmVzLnBsdXMoQzJTZXR0aW5nUmVzdWx0QnVpbGRlcjo6QmFkVmFsdWUobWUuRihtZS52LmhlaWdodCkpKTsKKyAgICAgICAgICAgIG1lLnNldCgpLmhlaWdodCA9IG9sZE1lLnYuaGVpZ2h0OworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBNYXhQaWN0dXJlU2l6ZVNldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1NYXhQaWN0dXJlU2l6ZVR1bmluZzo6b3V0cHV0PiAmbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dD4gJnNpemUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIC8vIFRPRE86IGdldCBtYXggd2lkdGgvaGVpZ2h0IGZyb20gdGhlIHNpemUncyBmaWVsZCBoZWxwZXJzIHZzLiBoYXJkY29kaW5nCisgICAgICAgIG1lLnNldCgpLndpZHRoID0gYzJfbWluKGMyX21heChtZS52LndpZHRoLCBzaXplLnYud2lkdGgpLCA0MDk2dSk7CisgICAgICAgIG1lLnNldCgpLmhlaWdodCA9IGMyX21pbihjMl9tYXgobWUudi5oZWlnaHQsIHNpemUudi5oZWlnaHQpLCA0MDk2dSk7CisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBNYXhJbnB1dFNpemVTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0PiAmbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJQPEMyU3RyZWFtTWF4UGljdHVyZVNpemVUdW5pbmc6Om91dHB1dD4gJm1heFNpemUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIC8vIGFzc3VtZSBjb21wcmVzc2lvbiByYXRpbyBvZiAyCisgICAgICAgIG1lLnNldCgpLnZhbHVlID0gKCgobWF4U2l6ZS52LndpZHRoICsgNjMpIC8gNjQpICogKChtYXhTaXplLnYuaGVpZ2h0ICsgNjMpIC8gNjQpICogMzA3Mik7CisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBQcm9maWxlTGV2ZWxTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6aW5wdXQ+ICZtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dD4gJnNpemUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgICh2b2lkKXNpemU7CisgICAgICAgICh2b2lkKW1lOyAgLy8gVE9ETzogdmFsaWRhdGUKKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIERlZmF1bHRDb2xvckFzcGVjdHNTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtQ29sb3JBc3BlY3RzVHVuaW5nOjpvdXRwdXQ+ICZtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgaWYgKG1lLnYucmFuZ2UgPiBDMkNvbG9yOjpSQU5HRV9PVEhFUikgeworICAgICAgICAgICAgICAgIG1lLnNldCgpLnJhbmdlID0gQzJDb2xvcjo6UkFOR0VfT1RIRVI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1lLnYucHJpbWFyaWVzID4gQzJDb2xvcjo6UFJJTUFSSUVTX09USEVSKSB7CisgICAgICAgICAgICAgICAgbWUuc2V0KCkucHJpbWFyaWVzID0gQzJDb2xvcjo6UFJJTUFSSUVTX09USEVSOworICAgICAgICB9CisgICAgICAgIGlmIChtZS52LnRyYW5zZmVyID4gQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVIpIHsKKyAgICAgICAgICAgICAgICBtZS5zZXQoKS50cmFuc2ZlciA9IEMyQ29sb3I6OlRSQU5TRkVSX09USEVSOworICAgICAgICB9CisgICAgICAgIGlmIChtZS52Lm1hdHJpeCA+IEMyQ29sb3I6Ok1BVFJJWF9PVEhFUikgeworICAgICAgICAgICAgICAgIG1lLnNldCgpLm1hdHJpeCA9IEMyQ29sb3I6Ok1BVFJJWF9PVEhFUjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgQ29kZWRDb2xvckFzcGVjdHNTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6aW5wdXQ+ICZtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgaWYgKG1lLnYucmFuZ2UgPiBDMkNvbG9yOjpSQU5HRV9PVEhFUikgeworICAgICAgICAgICAgICAgIG1lLnNldCgpLnJhbmdlID0gQzJDb2xvcjo6UkFOR0VfT1RIRVI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1lLnYucHJpbWFyaWVzID4gQzJDb2xvcjo6UFJJTUFSSUVTX09USEVSKSB7CisgICAgICAgICAgICAgICAgbWUuc2V0KCkucHJpbWFyaWVzID0gQzJDb2xvcjo6UFJJTUFSSUVTX09USEVSOworICAgICAgICB9CisgICAgICAgIGlmIChtZS52LnRyYW5zZmVyID4gQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVIpIHsKKyAgICAgICAgICAgICAgICBtZS5zZXQoKS50cmFuc2ZlciA9IEMyQ29sb3I6OlRSQU5TRkVSX09USEVSOworICAgICAgICB9CisgICAgICAgIGlmIChtZS52Lm1hdHJpeCA+IEMyQ29sb3I6Ok1BVFJJWF9PVEhFUikgeworICAgICAgICAgICAgICAgIG1lLnNldCgpLm1hdHJpeCA9IEMyQ29sb3I6Ok1BVFJJWF9PVEhFUjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgQ29sb3JBc3BlY3RzU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86Om91dHB1dD4gJm1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyUDxDMlN0cmVhbUNvbG9yQXNwZWN0c1R1bmluZzo6b3V0cHV0PiAmZGVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyUDxDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86OmlucHV0PiAmY29kZWQpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIC8vIHRha2UgZGVmYXVsdCB2YWx1ZXMgZm9yIGFsbCB1bnNwZWNpZmllZCBmaWVsZHMsIGFuZCBjb2RlZCB2YWx1ZXMgZm9yIHNwZWNpZmllZCBvbmVzCisgICAgICAgIG1lLnNldCgpLnJhbmdlID0gY29kZWQudi5yYW5nZSA9PSBSQU5HRV9VTlNQRUNJRklFRCA/IGRlZi52LnJhbmdlIDogY29kZWQudi5yYW5nZTsKKyAgICAgICAgbWUuc2V0KCkucHJpbWFyaWVzID0gY29kZWQudi5wcmltYXJpZXMgPT0gUFJJTUFSSUVTX1VOU1BFQ0lGSUVECisgICAgICAgICAgICAgICAgPyBkZWYudi5wcmltYXJpZXMgOiBjb2RlZC52LnByaW1hcmllczsKKyAgICAgICAgbWUuc2V0KCkudHJhbnNmZXIgPSBjb2RlZC52LnRyYW5zZmVyID09IFRSQU5TRkVSX1VOU1BFQ0lGSUVECisgICAgICAgICAgICAgICAgPyBkZWYudi50cmFuc2ZlciA6IGNvZGVkLnYudHJhbnNmZXI7CisgICAgICAgIG1lLnNldCgpLm1hdHJpeCA9IGNvZGVkLnYubWF0cml4ID09IE1BVFJJWF9VTlNQRUNJRklFRCA/IGRlZi52Lm1hdHJpeCA6IGNvZGVkLnYubWF0cml4OworICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86Om91dHB1dD4gZ2V0Q29sb3JBc3BlY3RzX2woKSB7CisgICAgICAgIHJldHVybiBtQ29sb3JBc3BlY3RzOworICAgIH0KKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjppbnB1dD4gbVByb2ZpbGVMZXZlbDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dD4gbVNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtTWF4UGljdHVyZVNpemVUdW5pbmc6Om91dHB1dD4gbU1heFNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0PiBtTWF4SW5wdXRTaXplOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9ySW5mbzo6b3V0cHV0PiBtQ29sb3JJbmZvOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86OmlucHV0PiBtQ29kZWRDb2xvckFzcGVjdHM7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JBc3BlY3RzVHVuaW5nOjpvdXRwdXQ+IG1EZWZhdWx0Q29sb3JBc3BlY3RzOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86Om91dHB1dD4gbUNvbG9yQXNwZWN0czsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1QaXhlbEZvcm1hdEluZm86Om91dHB1dD4gbVBpeGVsRm9ybWF0OworfTsKKworc3RhdGljIHNpemVfdCBnZXRDcHVDb3JlQ291bnQoKSB7CisgICAgbG9uZyBjcHVDb3JlQ291bnQgPSAxOworI2lmIGRlZmluZWQoX1NDX05QUk9DRVNTT1JTX09OTE4pCisgICAgY3B1Q29yZUNvdW50ID0gc3lzY29uZihfU0NfTlBST0NFU1NPUlNfT05MTik7CisjZWxzZQorICAgIC8vIF9TQ19OUFJPQ19PTkxOIG11c3QgYmUgZGVmaW5lZC4uLgorICAgIGNwdUNvcmVDb3VudCA9IHN5c2NvbmYoX1NDX05QUk9DX09OTE4pOworI2VuZGlmCisgICAgQ0hFQ0soY3B1Q29yZUNvdW50ID49IDEpOworICAgIEFMT0dWKCJOdW1iZXIgb2YgQ1BVIGNvcmVzOiAlbGQiLCBjcHVDb3JlQ291bnQpOworICAgIHJldHVybiAoc2l6ZV90KWNwdUNvcmVDb3VudDsKK30KKworc3RhdGljIHZvaWQgKml2ZF9hbGlnbmVkX21hbGxvYyh2b2lkICpjdHh0LCBXT1JEMzIgYWxpZ25tZW50LCBXT1JEMzIgc2l6ZSkgeworICAgICh2b2lkKSBjdHh0OworICAgIHJldHVybiBtZW1hbGlnbihhbGlnbm1lbnQsIHNpemUpOworfQorCitzdGF0aWMgdm9pZCBpdmRfYWxpZ25lZF9mcmVlKHZvaWQgKmN0eHQsIHZvaWQgKm1lbSkgeworICAgICh2b2lkKSBjdHh0OworICAgIGZyZWUobWVtKTsKK30KKworQzJTb2Z0SGV2Y0RlYzo6QzJTb2Z0SGV2Y0RlYygKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+ICZpbnRmSW1wbCkKKyAgICA6IFNpbXBsZUMyQ29tcG9uZW50KHN0ZDo6bWFrZV9zaGFyZWQ8U2ltcGxlSW50ZXJmYWNlPEludGZJbXBsPj4obmFtZSwgaWQsIGludGZJbXBsKSksCisgICAgICAgIG1JbnRmKGludGZJbXBsKSwKKyAgICAgICAgbURlY0hhbmRsZShudWxscHRyKSwKKyAgICAgICAgbU91dEJ1ZmZlckZsdXNoKG51bGxwdHIpLAorICAgICAgICBtSXZDb2xvcmZvcm1hdChJVl9ZVVZfNDIwUCksCisgICAgICAgIG1XaWR0aCgzMjApLAorICAgICAgICBtSGVpZ2h0KDI0MCksCisgICAgICAgIG1IZWFkZXJEZWNvZGVkKGZhbHNlKSB7Cit9CisKK0MyU29mdEhldmNEZWM6On5DMlNvZnRIZXZjRGVjKCkgeworICAgIG9uUmVsZWFzZSgpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRIZXZjRGVjOjpvbkluaXQoKSB7CisgICAgc3RhdHVzX3QgZXJyID0gaW5pdERlY29kZXIoKTsKKyAgICByZXR1cm4gZXJyID09IE9LID8gQzJfT0sgOiBDMl9DT1JSVVBURUQ7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEhldmNEZWM6Om9uU3RvcCgpIHsKKyAgICBpZiAoT0sgIT0gcmVzZXREZWNvZGVyKCkpIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgcmVzZXRQbHVnaW4oKTsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3ZvaWQgQzJTb2Z0SGV2Y0RlYzo6b25SZXNldCgpIHsKKyAgICAodm9pZCkgb25TdG9wKCk7Cit9CisKK3ZvaWQgQzJTb2Z0SGV2Y0RlYzo6b25SZWxlYXNlKCkgeworICAgICh2b2lkKSBkZWxldGVEZWNvZGVyKCk7CisgICAgaWYgKG1PdXRCdWZmZXJGbHVzaCkgeworICAgICAgICBpdmRfYWxpZ25lZF9mcmVlKG51bGxwdHIsIG1PdXRCdWZmZXJGbHVzaCk7CisgICAgICAgIG1PdXRCdWZmZXJGbHVzaCA9IG51bGxwdHI7CisgICAgfQorICAgIGlmIChtT3V0QmxvY2spIHsKKyAgICAgICAgbU91dEJsb2NrLnJlc2V0KCk7CisgICAgfQorfQorCitjMl9zdGF0dXNfdCBDMlNvZnRIZXZjRGVjOjpvbkZsdXNoX3NtKCkgeworICAgIGlmIChPSyAhPSBzZXRGbHVzaE1vZGUoKSkgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKworICAgIHVpbnQzMl90IGRpc3BsYXlTdHJpZGUgPSBtU3RyaWRlOworICAgIHVpbnQzMl90IGRpc3BsYXlIZWlnaHQgPSBtSGVpZ2h0OworICAgIHVpbnQzMl90IGJ1ZmZlclNpemUgPSBkaXNwbGF5U3RyaWRlICogZGlzcGxheUhlaWdodCAqIDMgLyAyOworICAgIG1PdXRCdWZmZXJGbHVzaCA9ICh1aW50OF90ICopaXZkX2FsaWduZWRfbWFsbG9jKG51bGxwdHIsIDEyOCwgYnVmZmVyU2l6ZSk7CisgICAgaWYgKCFtT3V0QnVmZmVyRmx1c2gpIHsKKyAgICAgICAgQUxPR0UoImNvdWxkIG5vdCBhbGxvY2F0ZSB0bXAgb3V0cHV0IGJ1ZmZlciAoZm9yIGZsdXNoKSBvZiBzaXplICV1ICIsIGJ1ZmZlclNpemUpOworICAgICAgICByZXR1cm4gQzJfTk9fTUVNT1JZOworICAgIH0KKworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfaXBfdCBzX2RlY29kZV9pcDsKKyAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9vcF90IHNfZGVjb2RlX29wOworCisgICAgICAgIHNldERlY29kZUFyZ3MoJnNfZGVjb2RlX2lwLCAmc19kZWNvZGVfb3AsIG51bGxwdHIsIG51bGxwdHIsIDAsIDAsIDApOworICAgICAgICAodm9pZCkgaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsICZzX2RlY29kZV9pcCwgJnNfZGVjb2RlX29wKTsKKyAgICAgICAgaWYgKDAgPT0gc19kZWNvZGVfb3AudTRfb3V0cHV0X3ByZXNlbnQpIHsKKyAgICAgICAgICAgIHJlc2V0UGx1Z2luKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtT3V0QnVmZmVyRmx1c2gpIHsKKyAgICAgICAgaXZkX2FsaWduZWRfZnJlZShudWxscHRyLCBtT3V0QnVmZmVyRmx1c2gpOworICAgICAgICBtT3V0QnVmZmVyRmx1c2ggPSBudWxscHRyOworICAgIH0KKworICAgIHJldHVybiBDMl9PSzsKK30KKworc3RhdHVzX3QgQzJTb2Z0SGV2Y0RlYzo6Y3JlYXRlRGVjb2RlcigpIHsKKyAgICBpdmRleHRfY3JlYXRlX2lwX3Qgc19jcmVhdGVfaXA7CisgICAgaXZkZXh0X2NyZWF0ZV9vcF90IHNfY3JlYXRlX29wOworCisgICAgc19jcmVhdGVfaXAuc19pdmRfY3JlYXRlX2lwX3QudTRfc2l6ZSA9IHNpemVvZihpdmRleHRfY3JlYXRlX2lwX3QpOworICAgIHNfY3JlYXRlX2lwLnNfaXZkX2NyZWF0ZV9pcF90LmVfY21kID0gSVZEX0NNRF9DUkVBVEU7CisgICAgc19jcmVhdGVfaXAuc19pdmRfY3JlYXRlX2lwX3QudTRfc2hhcmVfZGlzcF9idWYgPSAwOworICAgIHNfY3JlYXRlX2lwLnNfaXZkX2NyZWF0ZV9pcF90LmVfb3V0cHV0X2Zvcm1hdCA9IG1JdkNvbG9yZm9ybWF0OworICAgIHNfY3JlYXRlX2lwLnNfaXZkX2NyZWF0ZV9pcF90LnBmX2FsaWduZWRfYWxsb2MgPSBpdmRfYWxpZ25lZF9tYWxsb2M7CisgICAgc19jcmVhdGVfaXAuc19pdmRfY3JlYXRlX2lwX3QucGZfYWxpZ25lZF9mcmVlID0gaXZkX2FsaWduZWRfZnJlZTsKKyAgICBzX2NyZWF0ZV9pcC5zX2l2ZF9jcmVhdGVfaXBfdC5wdl9tZW1fY3R4dCA9IG51bGxwdHI7CisgICAgc19jcmVhdGVfb3Auc19pdmRfY3JlYXRlX29wX3QudTRfc2l6ZSA9IHNpemVvZihpdmRleHRfY3JlYXRlX29wX3QpOworICAgIElWX0FQSV9DQUxMX1NUQVRVU19UIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19jcmVhdGVfaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX2NyZWF0ZV9vcCk7CisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dFKCJlcnJvciBpbiAlczogMHgleCIsIF9fZnVuY19fLAorICAgICAgICAgICAgICBzX2NyZWF0ZV9vcC5zX2l2ZF9jcmVhdGVfb3BfdC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorICAgIG1EZWNIYW5kbGUgPSAoaXZfb2JqX3QqKXNfY3JlYXRlX29wLnNfaXZkX2NyZWF0ZV9vcF90LnB2X2hhbmRsZTsKKyAgICBtRGVjSGFuZGxlLT5wdl9meG5zID0gKHZvaWQgKilpdmRlY19hcGlfZnVuY3Rpb247CisgICAgbURlY0hhbmRsZS0+dTRfc2l6ZSA9IHNpemVvZihpdl9vYmpfdCk7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEMyU29mdEhldmNEZWM6OnNldE51bUNvcmVzKCkgeworICAgIGl2ZGV4dF9jdGxfc2V0X251bV9jb3Jlc19pcF90IHNfc2V0X251bV9jb3Jlc19pcDsKKyAgICBpdmRleHRfY3RsX3NldF9udW1fY29yZXNfb3BfdCBzX3NldF9udW1fY29yZXNfb3A7CisKKyAgICBzX3NldF9udW1fY29yZXNfaXAudTRfc2l6ZSA9IHNpemVvZihpdmRleHRfY3RsX3NldF9udW1fY29yZXNfaXBfdCk7CisgICAgc19zZXRfbnVtX2NvcmVzX2lwLmVfY21kID0gSVZEX0NNRF9WSURFT19DVEw7CisgICAgc19zZXRfbnVtX2NvcmVzX2lwLmVfc3ViX2NtZCA9IElWREVYVF9DTURfQ1RMX1NFVF9OVU1fQ09SRVM7CisgICAgc19zZXRfbnVtX2NvcmVzX2lwLnU0X251bV9jb3JlcyA9IG1OdW1Db3JlczsKKyAgICBzX3NldF9udW1fY29yZXNfb3AudTRfc2l6ZSA9IHNpemVvZihpdmRleHRfY3RsX3NldF9udW1fY29yZXNfb3BfdCk7CisgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX3NldF9udW1fY29yZXNfaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX3NldF9udW1fY29yZXNfb3ApOworICAgIGlmIChJVl9TVUNDRVNTICE9IHN0YXR1cykgeworICAgICAgICBBTE9HRCgiZXJyb3IgaW4gJXM6IDB4JXgiLCBfX2Z1bmNfXywgc19zZXRfbnVtX2NvcmVzX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEMyU29mdEhldmNEZWM6OnNldFBhcmFtcyhzaXplX3Qgc3RyaWRlLCBJVkRfVklERU9fREVDT0RFX01PREVfVCBkZWNfbW9kZSkgeworICAgIGl2ZF9jdGxfc2V0X2NvbmZpZ19pcF90IHNfc2V0X2R5bl9wYXJhbXNfaXA7CisgICAgaXZkX2N0bF9zZXRfY29uZmlnX29wX3Qgc19zZXRfZHluX3BhcmFtc19vcDsKKworICAgIHNfc2V0X2R5bl9wYXJhbXNfaXAudTRfc2l6ZSA9IHNpemVvZihpdmRfY3RsX3NldF9jb25maWdfaXBfdCk7CisgICAgc19zZXRfZHluX3BhcmFtc19pcC5lX2NtZCA9IElWRF9DTURfVklERU9fQ1RMOworICAgIHNfc2V0X2R5bl9wYXJhbXNfaXAuZV9zdWJfY21kID0gSVZEX0NNRF9DVExfU0VUUEFSQU1TOworICAgIHNfc2V0X2R5bl9wYXJhbXNfaXAudTRfZGlzcF93ZCA9IChVV09SRDMyKSBzdHJpZGU7CisgICAgc19zZXRfZHluX3BhcmFtc19pcC5lX2ZybV9za2lwX21vZGUgPSBJVkRfU0tJUF9OT05FOworICAgIHNfc2V0X2R5bl9wYXJhbXNfaXAuZV9mcm1fb3V0X21vZGUgPSBJVkRfRElTUExBWV9GUkFNRV9PVVQ7CisgICAgc19zZXRfZHluX3BhcmFtc19pcC5lX3ZpZF9kZWNfbW9kZSA9IGRlY19tb2RlOworICAgIHNfc2V0X2R5bl9wYXJhbXNfb3AudTRfc2l6ZSA9IHNpemVvZihpdmRfY3RsX3NldF9jb25maWdfb3BfdCk7CisgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX3NldF9keW5fcGFyYW1zX2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19zZXRfZHluX3BhcmFtc19vcCk7CisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dFKCJlcnJvciBpbiAlczogMHgleCIsIF9fZnVuY19fLCBzX3NldF9keW5fcGFyYW1zX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEMyU29mdEhldmNEZWM6OmdldFZlcnNpb24oKSB7CisgICAgaXZkX2N0bF9nZXR2ZXJzaW9uaW5mb19pcF90IHNfZ2V0X3ZlcnNpb25pbmZvX2lwOworICAgIGl2ZF9jdGxfZ2V0dmVyc2lvbmluZm9fb3BfdCBzX2dldF92ZXJzaW9uaW5mb19vcDsKKyAgICBVV09SRDggYXUxX2J1Zls1MTJdOworCisgICAgc19nZXRfdmVyc2lvbmluZm9faXAudTRfc2l6ZSA9IHNpemVvZihpdmRfY3RsX2dldHZlcnNpb25pbmZvX2lwX3QpOworICAgIHNfZ2V0X3ZlcnNpb25pbmZvX2lwLmVfY21kID0gSVZEX0NNRF9WSURFT19DVEw7CisgICAgc19nZXRfdmVyc2lvbmluZm9faXAuZV9zdWJfY21kID0gSVZEX0NNRF9DVExfR0VUVkVSU0lPTjsKKyAgICBzX2dldF92ZXJzaW9uaW5mb19pcC5wdl92ZXJzaW9uX2J1ZmZlciA9IGF1MV9idWY7CisgICAgc19nZXRfdmVyc2lvbmluZm9faXAudTRfdmVyc2lvbl9idWZmZXJfc2l6ZSA9IHNpemVvZihhdTFfYnVmKTsKKyAgICBzX2dldF92ZXJzaW9uaW5mb19vcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfZ2V0dmVyc2lvbmluZm9fb3BfdCk7CisgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX2dldF92ZXJzaW9uaW5mb19pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfZ2V0X3ZlcnNpb25pbmZvX29wKTsKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0QoImVycm9yIGluICVzOiAweCV4IiwgX19mdW5jX18sCisgICAgICAgICAgICAgIHNfZ2V0X3ZlcnNpb25pbmZvX29wLnU0X2Vycm9yX2NvZGUpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dWKCJpdHRpYW0gZGVjb2RlciB2ZXJzaW9uIG51bWJlcjogJXMiLAorICAgICAgICAgICAgICAoY2hhciAqKSBzX2dldF92ZXJzaW9uaW5mb19pcC5wdl92ZXJzaW9uX2J1ZmZlcik7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDMlNvZnRIZXZjRGVjOjppbml0RGVjb2RlcigpIHsKKyAgICBpZiAoT0sgIT0gY3JlYXRlRGVjb2RlcigpKSByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICBtTnVtQ29yZXMgPSBNSU4oZ2V0Q3B1Q29yZUNvdW50KCksIE1BWF9OVU1fQ09SRVMpOworICAgIG1TdHJpZGUgPSBBTElHTjY0KG1XaWR0aCk7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisgICAgcmVzZXRQbHVnaW4oKTsKKyAgICAodm9pZCkgc2V0TnVtQ29yZXMoKTsKKyAgICBpZiAoT0sgIT0gc2V0UGFyYW1zKG1TdHJpZGUsIElWRF9ERUNPREVfRlJBTUUpKSByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAodm9pZCkgZ2V0VmVyc2lvbigpOworCisgICAgcmV0dXJuIE9LOworfQorCitib29sIEMyU29mdEhldmNEZWM6OnNldERlY29kZUFyZ3MoaXZkX3ZpZGVvX2RlY29kZV9pcF90ICpwc19kZWNvZGVfaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9vcF90ICpwc19kZWNvZGVfb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJSZWFkVmlldyAqaW5CdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJHcmFwaGljVmlldyAqb3V0QnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBpbk9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgaW5TaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHRzTWFya2VyKSB7CisgICAgdWludDMyX3QgZGlzcGxheVN0cmlkZSA9IG1TdHJpZGU7CisgICAgdWludDMyX3QgZGlzcGxheUhlaWdodCA9IG1IZWlnaHQ7CisgICAgc2l6ZV90IGx1bWFTaXplID0gZGlzcGxheVN0cmlkZSAqIGRpc3BsYXlIZWlnaHQ7CisgICAgc2l6ZV90IGNocm9tYVNpemUgPSBsdW1hU2l6ZSA+PiAyOworCisgICAgcHNfZGVjb2RlX2lwLT51NF9zaXplID0gc2l6ZW9mKGl2ZF92aWRlb19kZWNvZGVfaXBfdCk7CisgICAgcHNfZGVjb2RlX2lwLT5lX2NtZCA9IElWRF9DTURfVklERU9fREVDT0RFOworICAgIGlmIChpbkJ1ZmZlcikgeworICAgICAgICBwc19kZWNvZGVfaXAtPnU0X3RzID0gdHNNYXJrZXI7CisgICAgICAgIHBzX2RlY29kZV9pcC0+cHZfc3RyZWFtX2J1ZmZlciA9IGNvbnN0X2Nhc3Q8dWludDhfdCAqPihpbkJ1ZmZlci0+ZGF0YSgpICsgaW5PZmZzZXQpOworICAgICAgICBwc19kZWNvZGVfaXAtPnU0X251bV9CeXRlcyA9IGluU2l6ZTsKKyAgICB9IGVsc2UgeworICAgICAgICBwc19kZWNvZGVfaXAtPnU0X3RzID0gMDsKKyAgICAgICAgcHNfZGVjb2RlX2lwLT5wdl9zdHJlYW1fYnVmZmVyID0gbnVsbHB0cjsKKyAgICAgICAgcHNfZGVjb2RlX2lwLT51NF9udW1fQnl0ZXMgPSAwOworICAgIH0KKyAgICBwc19kZWNvZGVfaXAtPnNfb3V0X2J1ZmZlci51NF9taW5fb3V0X2J1Zl9zaXplWzBdID0gbHVtYVNpemU7CisgICAgcHNfZGVjb2RlX2lwLT5zX291dF9idWZmZXIudTRfbWluX291dF9idWZfc2l6ZVsxXSA9IGNocm9tYVNpemU7CisgICAgcHNfZGVjb2RlX2lwLT5zX291dF9idWZmZXIudTRfbWluX291dF9idWZfc2l6ZVsyXSA9IGNocm9tYVNpemU7CisgICAgaWYgKG91dEJ1ZmZlcikgeworICAgICAgICBpZiAob3V0QnVmZmVyLT53aWR0aCgpIDwgZGlzcGxheVN0cmlkZSB8fCBvdXRCdWZmZXItPmhlaWdodCgpIDwgZGlzcGxheUhlaWdodCkgeworICAgICAgICAgICAgQUxPR0UoIk91dHB1dCBidWZmZXIgdG9vIHNtYWxsOiBwcm92aWRlZCAoJWR4JWQpIHJlcXVpcmVkICgldXgldSkiLAorICAgICAgICAgICAgICAgICAgb3V0QnVmZmVyLT53aWR0aCgpLCBvdXRCdWZmZXItPmhlaWdodCgpLCBkaXNwbGF5U3RyaWRlLCBkaXNwbGF5SGVpZ2h0KTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBwc19kZWNvZGVfaXAtPnNfb3V0X2J1ZmZlci5wdTFfYnVmc1swXSA9IG91dEJ1ZmZlci0+ZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXTsKKyAgICAgICAgcHNfZGVjb2RlX2lwLT5zX291dF9idWZmZXIucHUxX2J1ZnNbMV0gPSBvdXRCdWZmZXItPmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfVV07CisgICAgICAgIHBzX2RlY29kZV9pcC0+c19vdXRfYnVmZmVyLnB1MV9idWZzWzJdID0gb3V0QnVmZmVyLT5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdOworICAgIH0gZWxzZSB7CisgICAgICAgIHBzX2RlY29kZV9pcC0+c19vdXRfYnVmZmVyLnB1MV9idWZzWzBdID0gbU91dEJ1ZmZlckZsdXNoOworICAgICAgICBwc19kZWNvZGVfaXAtPnNfb3V0X2J1ZmZlci5wdTFfYnVmc1sxXSA9IG1PdXRCdWZmZXJGbHVzaCArIGx1bWFTaXplOworICAgICAgICBwc19kZWNvZGVfaXAtPnNfb3V0X2J1ZmZlci5wdTFfYnVmc1syXSA9IG1PdXRCdWZmZXJGbHVzaCArIGx1bWFTaXplICsgY2hyb21hU2l6ZTsKKyAgICB9CisgICAgcHNfZGVjb2RlX2lwLT5zX291dF9idWZmZXIudTRfbnVtX2J1ZnMgPSAzOworICAgIHBzX2RlY29kZV9vcC0+dTRfc2l6ZSA9IHNpemVvZihpdmRfdmlkZW9fZGVjb2RlX29wX3QpOworICAgIHBzX2RlY29kZV9vcC0+dTRfb3V0cHV0X3ByZXNlbnQgPSAwOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQzJTb2Z0SGV2Y0RlYzo6Z2V0VnVpUGFyYW1zKCkgeworICAgIGl2ZGV4dF9jdGxfZ2V0X3Z1aV9wYXJhbXNfaXBfdCBzX2dldF92dWlfcGFyYW1zX2lwOworICAgIGl2ZGV4dF9jdGxfZ2V0X3Z1aV9wYXJhbXNfb3BfdCBzX2dldF92dWlfcGFyYW1zX29wOworCisgICAgc19nZXRfdnVpX3BhcmFtc19pcC51NF9zaXplID0gc2l6ZW9mKGl2ZGV4dF9jdGxfZ2V0X3Z1aV9wYXJhbXNfaXBfdCk7CisgICAgc19nZXRfdnVpX3BhcmFtc19pcC5lX2NtZCA9IElWRF9DTURfVklERU9fQ1RMOworICAgIHNfZ2V0X3Z1aV9wYXJhbXNfaXAuZV9zdWJfY21kID0KKyAgICAgICAgICAgIChJVkRfQ09OVFJPTF9BUElfQ09NTUFORF9UWVBFX1QpIElIRVZDRF9DWEFfQ01EX0NUTF9HRVRfVlVJX1BBUkFNUzsKKyAgICBzX2dldF92dWlfcGFyYW1zX29wLnU0X3NpemUgPSBzaXplb2YoaXZkZXh0X2N0bF9nZXRfdnVpX3BhcmFtc19vcF90KTsKKyAgICBJVl9BUElfQ0FMTF9TVEFUVVNfVCBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfZ2V0X3Z1aV9wYXJhbXNfaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX2dldF92dWlfcGFyYW1zX29wKTsKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0QoImVycm9yIGluICVzOiAweCV4IiwgX19mdW5jX18sIHNfZ2V0X3Z1aV9wYXJhbXNfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBWdWlDb2xvckFzcGVjdHMgdnVpQ29sb3JBc3BlY3RzOworICAgIHZ1aUNvbG9yQXNwZWN0cy5wcmltYXJpZXMgPSBzX2dldF92dWlfcGFyYW1zX29wLnUxX2NvbG91cl9wcmltYXJpZXM7CisgICAgdnVpQ29sb3JBc3BlY3RzLnRyYW5zZmVyID0gc19nZXRfdnVpX3BhcmFtc19vcC51MV90cmFuc2Zlcl9jaGFyYWN0ZXJpc3RpY3M7CisgICAgdnVpQ29sb3JBc3BlY3RzLmNvZWZmcyA9IHNfZ2V0X3Z1aV9wYXJhbXNfb3AudTFfbWF0cml4X2NvZWZmaWNpZW50czsKKyAgICB2dWlDb2xvckFzcGVjdHMuZnVsbFJhbmdlID0gc19nZXRfdnVpX3BhcmFtc19vcC51MV92aWRlb19mdWxsX3JhbmdlX2ZsYWc7CisKKyAgICAvLyBjb252ZXJ0IHZ1aSBhc3BlY3RzIHRvIEMyIHZhbHVlcyBpZiBjaGFuZ2VkCisgICAgaWYgKCEodnVpQ29sb3JBc3BlY3RzID09IG1CaXRzdHJlYW1Db2xvckFzcGVjdHMpKSB7CisgICAgICAgIG1CaXRzdHJlYW1Db2xvckFzcGVjdHMgPSB2dWlDb2xvckFzcGVjdHM7CisgICAgICAgIENvbG9yQXNwZWN0cyBzZkFzcGVjdHM7CisgICAgICAgIEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6aW5wdXQgY29kZWRBc3BlY3RzID0geyAwdSB9OworICAgICAgICBDb2xvclV0aWxzOjpjb252ZXJ0SXNvQ29sb3JBc3BlY3RzVG9Db2RlY0FzcGVjdHMoCisgICAgICAgICAgICAgICAgdnVpQ29sb3JBc3BlY3RzLnByaW1hcmllcywgdnVpQ29sb3JBc3BlY3RzLnRyYW5zZmVyLCB2dWlDb2xvckFzcGVjdHMuY29lZmZzLAorICAgICAgICAgICAgICAgIHZ1aUNvbG9yQXNwZWN0cy5mdWxsUmFuZ2UsIHNmQXNwZWN0cyk7CisgICAgICAgIGlmICghQzJNYXBwZXI6Om1hcChzZkFzcGVjdHMubVByaW1hcmllcywgJmNvZGVkQXNwZWN0cy5wcmltYXJpZXMpKSB7CisgICAgICAgICAgICBjb2RlZEFzcGVjdHMucHJpbWFyaWVzID0gQzJDb2xvcjo6UFJJTUFSSUVTX1VOU1BFQ0lGSUVEOworICAgICAgICB9CisgICAgICAgIGlmICghQzJNYXBwZXI6Om1hcChzZkFzcGVjdHMubVJhbmdlLCAmY29kZWRBc3BlY3RzLnJhbmdlKSkgeworICAgICAgICAgICAgY29kZWRBc3BlY3RzLnJhbmdlID0gQzJDb2xvcjo6UkFOR0VfVU5TUEVDSUZJRUQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFDMk1hcHBlcjo6bWFwKHNmQXNwZWN0cy5tTWF0cml4Q29lZmZzLCAmY29kZWRBc3BlY3RzLm1hdHJpeCkpIHsKKyAgICAgICAgICAgIGNvZGVkQXNwZWN0cy5tYXRyaXggPSBDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFDMk1hcHBlcjo6bWFwKHNmQXNwZWN0cy5tVHJhbnNmZXIsICZjb2RlZEFzcGVjdHMudHJhbnNmZXIpKSB7CisgICAgICAgICAgICBjb2RlZEFzcGVjdHMudHJhbnNmZXIgPSBDMkNvbG9yOjpUUkFOU0ZFUl9VTlNQRUNJRklFRDsKKyAgICAgICAgfQorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgICAgICh2b2lkKW1JbnRmLT5jb25maWcoeyZjb2RlZEFzcGVjdHN9LCBDMl9NQVlfQkxPQ0ssICZmYWlsdXJlcyk7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitzdGF0dXNfdCBDMlNvZnRIZXZjRGVjOjpzZXRGbHVzaE1vZGUoKSB7CisgICAgaXZkX2N0bF9mbHVzaF9pcF90IHNfc2V0X2ZsdXNoX2lwOworICAgIGl2ZF9jdGxfZmx1c2hfb3BfdCBzX3NldF9mbHVzaF9vcDsKKworICAgIHNfc2V0X2ZsdXNoX2lwLnU0X3NpemUgPSBzaXplb2YoaXZkX2N0bF9mbHVzaF9pcF90KTsKKyAgICBzX3NldF9mbHVzaF9pcC5lX2NtZCA9IElWRF9DTURfVklERU9fQ1RMOworICAgIHNfc2V0X2ZsdXNoX2lwLmVfc3ViX2NtZCA9IElWRF9DTURfQ1RMX0ZMVVNIOworICAgIHNfc2V0X2ZsdXNoX29wLnU0X3NpemUgPSBzaXplb2YoaXZkX2N0bF9mbHVzaF9vcF90KTsKKyAgICBJVl9BUElfQ0FMTF9TVEFUVVNfVCBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfc2V0X2ZsdXNoX2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19zZXRfZmx1c2hfb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiZXJyb3IgaW4gJXM6IDB4JXgiLCBfX2Z1bmNfXywgc19zZXRfZmx1c2hfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQzJTb2Z0SGV2Y0RlYzo6cmVzZXREZWNvZGVyKCkgeworICAgIGl2ZF9jdGxfcmVzZXRfaXBfdCBzX3Jlc2V0X2lwOworICAgIGl2ZF9jdGxfcmVzZXRfb3BfdCBzX3Jlc2V0X29wOworCisgICAgc19yZXNldF9pcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfcmVzZXRfaXBfdCk7CisgICAgc19yZXNldF9pcC5lX2NtZCA9IElWRF9DTURfVklERU9fQ1RMOworICAgIHNfcmVzZXRfaXAuZV9zdWJfY21kID0gSVZEX0NNRF9DVExfUkVTRVQ7CisgICAgc19yZXNldF9vcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfcmVzZXRfb3BfdCk7CisgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX3Jlc2V0X2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19yZXNldF9vcCk7CisgICAgaWYgKElWX1NVQ0NFU1MgIT0gc3RhdHVzKSB7CisgICAgICAgIEFMT0dFKCJlcnJvciBpbiAlczogMHgleCIsIF9fZnVuY19fLCBzX3Jlc2V0X29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisgICAgbVN0cmlkZSA9IDA7CisgICAgKHZvaWQpIHNldE51bUNvcmVzKCk7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisgICAgbUhlYWRlckRlY29kZWQgPSBmYWxzZTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgQzJTb2Z0SGV2Y0RlYzo6cmVzZXRQbHVnaW4oKSB7CisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworICAgIGdldHRpbWVvZmRheSgmbVRpbWVTdGFydCwgbnVsbHB0cik7CisgICAgZ2V0dGltZW9mZGF5KCZtVGltZUVuZCwgbnVsbHB0cik7Cit9CisKK3N0YXR1c190IEMyU29mdEhldmNEZWM6OmRlbGV0ZURlY29kZXIoKSB7CisgICAgaWYgKG1EZWNIYW5kbGUpIHsKKyAgICAgICAgaXZkZXh0X2RlbGV0ZV9pcF90IHNfZGVsZXRlX2lwOworICAgICAgICBpdmRleHRfZGVsZXRlX29wX3Qgc19kZWxldGVfb3A7CisKKyAgICAgICAgc19kZWxldGVfaXAuc19pdmRfZGVsZXRlX2lwX3QudTRfc2l6ZSA9IHNpemVvZihpdmRleHRfZGVsZXRlX2lwX3QpOworICAgICAgICBzX2RlbGV0ZV9pcC5zX2l2ZF9kZWxldGVfaXBfdC5lX2NtZCA9IElWRF9DTURfREVMRVRFOworICAgICAgICBzX2RlbGV0ZV9vcC5zX2l2ZF9kZWxldGVfb3BfdC51NF9zaXplID0gc2l6ZW9mKGl2ZGV4dF9kZWxldGVfb3BfdCk7CisgICAgICAgIElWX0FQSV9DQUxMX1NUQVRVU19UIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfZGVsZXRlX2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfZGVsZXRlX29wKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgICAgICBBTE9HRSgiZXJyb3IgaW4gJXM6IDB4JXgiLCBfX2Z1bmNfXywKKyAgICAgICAgICAgICAgICAgIHNfZGVsZXRlX29wLnNfaXZkX2RlbGV0ZV9vcF90LnU0X2Vycm9yX2NvZGUpOworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgbURlY0hhbmRsZSA9IG51bGxwdHI7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIGZpbGxFbXB0eVdvcmsoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKyAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgaWYgKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgeworICAgICAgICBmbGFncyB8PSBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNOworICAgICAgICBBTE9HVigic2lnbmFsbGluZyBlb3MiKTsKKyAgICB9CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KWZsYWdzOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7Cit9CisKK3ZvaWQgQzJTb2Z0SGV2Y0RlYzo6ZmluaXNoV29yayh1aW50NjRfdCBpbmRleCwgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGJ1ZmZlciA9IGNyZWF0ZUdyYXBoaWNCdWZmZXIoc3RkOjptb3ZlKG1PdXRCbG9jayksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyUmVjdChtV2lkdGgsIG1IZWlnaHQpKTsKKyAgICBtT3V0QmxvY2sgPSBudWxscHRyOworICAgIHsKKyAgICAgICAgSW50ZkltcGw6OkxvY2sgbG9jayA9IG1JbnRmLT5sb2NrKCk7CisgICAgICAgIGJ1ZmZlci0+c2V0SW5mbyhtSW50Zi0+Z2V0Q29sb3JBc3BlY3RzX2woKSk7CisgICAgfQorCisgICAgYXV0byBmaWxsV29yayA9IFtidWZmZXJdKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKSB7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdCkwOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5wdXNoX2JhY2soYnVmZmVyKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgIH07CisgICAgaWYgKHdvcmsgJiYgYzJfY250cjY0X3QoaW5kZXgpID09IHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleCkgeworICAgICAgICBmaWxsV29yayh3b3JrKTsKKyAgICB9IGVsc2UgeworICAgICAgICBmaW5pc2goaW5kZXgsIGZpbGxXb3JrKTsKKyAgICB9Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEhldmNEZWM6OmVuc3VyZURlY29kZXJTdGF0ZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgaWYgKCFtRGVjSGFuZGxlKSB7CisgICAgICAgIEFMT0dFKCJub3Qgc3VwcG9zZWQgdG8gYmUgaGVyZSwgaW52YWxpZCBkZWNvZGVyIGNvbnRleHQiKTsKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisgICAgaWYgKG1TdHJpZGUgIT0gQUxJR042NChtV2lkdGgpKSB7CisgICAgICAgIG1TdHJpZGUgPSBBTElHTjY0KG1XaWR0aCk7CisgICAgICAgIGlmIChPSyAhPSBzZXRQYXJhbXMobVN0cmlkZSwgSVZEX0RFQ09ERV9GUkFNRSkpIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorICAgIGlmIChtT3V0QmxvY2sgJiYKKyAgICAgICAgICAgIChtT3V0QmxvY2stPndpZHRoKCkgIT0gbVN0cmlkZSB8fCBtT3V0QmxvY2stPmhlaWdodCgpICE9IG1IZWlnaHQpKSB7CisgICAgICAgIG1PdXRCbG9jay5yZXNldCgpOworICAgIH0KKyAgICBpZiAoIW1PdXRCbG9jaykgeworICAgICAgICB1aW50MzJfdCBmb3JtYXQgPSBIQUxfUElYRUxfRk9STUFUX1lWMTI7CisgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgPSB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfTsKKyAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gcG9vbC0+ZmV0Y2hHcmFwaGljQmxvY2sobVN0cmlkZSwgbUhlaWdodCwgZm9ybWF0LCB1c2FnZSwgJm1PdXRCbG9jayk7CisgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJmZXRjaEdyYXBoaWNCbG9jayBmb3IgT3V0cHV0IGZhaWxlZCB3aXRoIHN0YXR1cyAlZCIsIGVycik7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisgICAgICAgIEFMT0dWKCJwcm92aWRlZCAoJWR4JWQpIHJlcXVpcmVkICglZHglZCkiLAorICAgICAgICAgICAgICBtT3V0QmxvY2stPndpZHRoKCksIG1PdXRCbG9jay0+aGVpZ2h0KCksIG1TdHJpZGUsIG1IZWlnaHQpOworICAgIH0KKworICAgIHJldHVybiBDMl9PSzsKK30KKworLy8gVE9ETzogY2FuIG92ZXJhbGwgZXJyb3IgY2hlY2tpbmcgYmUgaW1wcm92ZWQ/CisvLyBUT0RPOiBhbGxvdyBjb25maWd1cmF0aW9uIG9mIGNvbG9yIGZvcm1hdCBhbmQgdXNhZ2UgZm9yIGdyYXBoaWMgYnVmZmVycyBpbnN0ZWFkCisvLyAgICAgICBvZiBoYXJkIGNvZGluZyB0aGVtIHRvIEhBTF9QSVhFTF9GT1JNQVRfWVYxMgorLy8gVE9ETzogcGFzcyBjb2xvcmFzcGVjdHMgaW5mb3JtYXRpb24gdG8gc3VyZmFjZQorLy8gVE9ETzogdGVzdCBzdXBwb3J0IGZvciBkeW5hbWljIGNoYW5nZSBpbiByZXNvbHV0aW9uCisvLyBUT0RPOiB2ZXJpZnkgaWYgdGhlIGRlY29kZXIgc2VudCBiYWNrIGFsbCBmcmFtZXMKK3ZvaWQgQzJTb2Z0SGV2Y0RlYzo6cHJvY2VzcygKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAvLyBJbml0aWFsaXplIG91dHB1dCB3b3JrCisgICAgd29yay0+cmVzdWx0ID0gQzJfT0s7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAwdTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisKKyAgICBpZiAobVNpZ25hbGxlZEVycm9yIHx8IG1TaWduYWxsZWRPdXRwdXRFb3MpIHsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQkFEX1ZBTFVFOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc2l6ZV90IGluT2Zmc2V0ID0gMHU7CisgICAgc2l6ZV90IGluU2l6ZSA9IDB1OworICAgIHVpbnQzMl90IHdvcmtJbmRleCA9IHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpICYgMHhGRkZGRkZGRjsKKyAgICBDMlJlYWRWaWV3IHJWaWV3ID0gbUR1bW15UmVhZFZpZXc7CisgICAgaWYgKCF3b3JrLT5pbnB1dC5idWZmZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgclZpZXcgPSB3b3JrLT5pbnB1dC5idWZmZXJzWzBdLT5kYXRhKCkubGluZWFyQmxvY2tzKCkuZnJvbnQoKS5tYXAoKS5nZXQoKTsKKyAgICAgICAgaW5TaXplID0gclZpZXcuY2FwYWNpdHkoKTsKKyAgICAgICAgaWYgKGluU2l6ZSAmJiByVmlldy5lcnJvcigpKSB7CisgICAgICAgICAgICBBTE9HRSgicmVhZCB2aWV3IG1hcCBmYWlsZWQgJWQiLCByVmlldy5lcnJvcigpKTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IHJWaWV3LmVycm9yKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgICAgYm9vbCBlb3MgPSAoKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgIT0gMCk7CisgICAgYm9vbCBoYXNQaWN0dXJlID0gZmFsc2U7CisKKyAgICBBTE9HVigiaW4gYnVmZmVyIGF0dHIuIHNpemUgJXp1IHRpbWVzdGFtcCAlZCBmcmFtZWluZGV4ICVkLCBmbGFncyAleCIsCisgICAgICAgICAgaW5TaXplLCAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1KCksCisgICAgICAgICAgKGludCl3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKSwgd29yay0+aW5wdXQuZmxhZ3MpOworICAgIHNpemVfdCBpblBvcyA9IDA7CisgICAgd2hpbGUgKGluUG9zIDwgaW5TaXplKSB7CisgICAgICAgIGlmIChDMl9PSyAhPSBlbnN1cmVEZWNvZGVyU3RhdGUocG9vbCkpIHsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIEMyR3JhcGhpY1ZpZXcgd1ZpZXcgPSBtT3V0QmxvY2stPm1hcCgpLmdldCgpOworICAgICAgICBpZiAod1ZpZXcuZXJyb3IoKSkgeworICAgICAgICAgICAgQUxPR0UoImdyYXBoaWMgdmlldyBtYXAgZmFpbGVkICVkIiwgd1ZpZXcuZXJyb3IoKSk7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSB3Vmlldy5lcnJvcigpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfaXBfdCBzX2RlY29kZV9pcDsKKyAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9vcF90IHNfZGVjb2RlX29wOworICAgICAgICBpZiAoIXNldERlY29kZUFyZ3MoJnNfZGVjb2RlX2lwLCAmc19kZWNvZGVfb3AsICZyVmlldywgJndWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5PZmZzZXQgKyBpblBvcywgaW5TaXplIC0gaW5Qb3MsIHdvcmtJbmRleCkpIHsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGZhbHNlID09IG1IZWFkZXJEZWNvZGVkKSB7CisgICAgICAgICAgICAvKiBEZWNvZGUgaGVhZGVyIGFuZCBnZXQgZGltZW5zaW9ucyAqLworICAgICAgICAgICAgc2V0UGFyYW1zKG1TdHJpZGUsIElWRF9ERUNPREVfSEVBREVSKTsKKyAgICAgICAgfQorICAgICAgICBXT1JEMzIgZGVsYXk7CisgICAgICAgIEdFVFRJTUUoJm1UaW1lU3RhcnQsIG51bGxwdHIpOworICAgICAgICBUSU1FX0RJRkYobVRpbWVFbmQsIG1UaW1lU3RhcnQsIGRlbGF5KTsKKyAgICAgICAgKHZvaWQpIGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLCAmc19kZWNvZGVfaXAsICZzX2RlY29kZV9vcCk7CisgICAgICAgIFdPUkQzMiBkZWNvZGVUaW1lOworICAgICAgICBHRVRUSU1FKCZtVGltZUVuZCwgbnVsbHB0cik7CisgICAgICAgIFRJTUVfRElGRihtVGltZVN0YXJ0LCBtVGltZUVuZCwgZGVjb2RlVGltZSk7CisgICAgICAgIEFMT0dWKCJkZWNvZGVUaW1lPSU2ZCBkZWxheT0lNmQgbnVtQnl0ZXM9JTZkIiwgZGVjb2RlVGltZSwgZGVsYXksCisgICAgICAgICAgICAgIHNfZGVjb2RlX29wLnU0X251bV9ieXRlc19jb25zdW1lZCk7CisgICAgICAgIGlmIChJVkRfTUVNX0FMTE9DX0ZBSUxFRCA9PSAoc19kZWNvZGVfb3AudTRfZXJyb3JfY29kZSAmIDB4RkYpKSB7CisgICAgICAgICAgICBBTE9HRSgiYWxsb2NhdGlvbiBmYWlsdXJlIGluIGRlY29kZXIiKTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGVsc2UgaWYgKElWRF9TVFJFQU1fV0lEVEhfSEVJR0hUX05PVF9TVVBQT1JURUQgPT0gKHNfZGVjb2RlX29wLnU0X2Vycm9yX2NvZGUgJiAweEZGKSkgeworICAgICAgICAgICAgQUxPR0UoInVuc3VwcG9ydGVkIHJlc29sdXRpb24gOiAlZHglZCIsIG1XaWR0aCwgbUhlaWdodCk7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIGlmIChJVkRfUkVTX0NIQU5HRUQgPT0gKHNfZGVjb2RlX29wLnU0X2Vycm9yX2NvZGUgJiAweEZGKSkgeworICAgICAgICAgICAgQUxPR1YoInJlc29sdXRpb24gY2hhbmdlZCIpOworICAgICAgICAgICAgZHJhaW5JbnRlcm5hbChEUkFJTl9DT01QT05FTlRfTk9fRU9TLCBwb29sLCB3b3JrKTsKKyAgICAgICAgICAgIHJlc2V0RGVjb2RlcigpOworICAgICAgICAgICAgcmVzZXRQbHVnaW4oKTsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMHU7CisKKyAgICAgICAgICAgIC8qIERlY29kZSBoZWFkZXIgYW5kIGdldCBuZXcgZGltZW5zaW9ucyAqLworICAgICAgICAgICAgc2V0UGFyYW1zKG1TdHJpZGUsIElWRF9ERUNPREVfSEVBREVSKTsKKyAgICAgICAgICAgICh2b2lkKSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwgJnNfZGVjb2RlX2lwLCAmc19kZWNvZGVfb3ApOworICAgICAgICB9CisgICAgICAgIGlmICgwIDwgc19kZWNvZGVfb3AudTRfcGljX3dkICYmIDAgPCBzX2RlY29kZV9vcC51NF9waWNfaHQpIHsKKyAgICAgICAgICAgIGlmIChtSGVhZGVyRGVjb2RlZCA9PSBmYWxzZSkgeworICAgICAgICAgICAgICAgIG1IZWFkZXJEZWNvZGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBzZXRQYXJhbXMoQUxJR042NChzX2RlY29kZV9vcC51NF9waWNfd2QpLCBJVkRfREVDT0RFX0ZSQU1FKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzX2RlY29kZV9vcC51NF9waWNfd2QgIT0gbVdpZHRoIHx8ICBzX2RlY29kZV9vcC51NF9waWNfaHQgIT0gbUhlaWdodCkgeworICAgICAgICAgICAgICAgIG1XaWR0aCA9IHNfZGVjb2RlX29wLnU0X3BpY193ZDsKKyAgICAgICAgICAgICAgICBtSGVpZ2h0ID0gc19kZWNvZGVfb3AudTRfcGljX2h0OworICAgICAgICAgICAgICAgIENIRUNLX0VRKDB1LCBzX2RlY29kZV9vcC51NF9vdXRwdXRfcHJlc2VudCk7CisKKyAgICAgICAgICAgICAgICBDMlZpZGVvU2l6ZVN0cmVhbUluZm86Om91dHB1dCBzaXplKDB1LCBtV2lkdGgsIG1IZWlnaHQpOworICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICAgICAgICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPQorICAgICAgICAgICAgICAgICAgICBtSW50Zi0+Y29uZmlnKHsmc2l6ZX0sIEMyX01BWV9CTE9DSywgJmZhaWx1cmVzKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgICAgICAgICAgQzJQYXJhbTo6Q29weShzaXplKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkNhbm5vdCBzZXQgd2lkdGggYW5kIGhlaWdodCIpOworICAgICAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgKHZvaWQpIGdldFZ1aVBhcmFtcygpOworICAgICAgICBoYXNQaWN0dXJlIHw9ICgxID09IHNfZGVjb2RlX29wLnU0X2ZyYW1lX2RlY29kZWRfZmxhZyk7CisgICAgICAgIGlmIChzX2RlY29kZV9vcC51NF9vdXRwdXRfcHJlc2VudCkgeworICAgICAgICAgICAgZmluaXNoV29yayhzX2RlY29kZV9vcC51NF90cywgd29yayk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKDAgPT0gc19kZWNvZGVfb3AudTRfbnVtX2J5dGVzX2NvbnN1bWVkKSB7CisgICAgICAgICAgICBBTE9HRCgiQnl0ZXMgY29uc3VtZWQgaXMgemVyby4gSWdub3JpbmcgcmVtYWluaW5nIGJ5dGVzIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpblBvcyArPSBzX2RlY29kZV9vcC51NF9udW1fYnl0ZXNfY29uc3VtZWQ7CisgICAgICAgIGlmIChoYXNQaWN0dXJlICYmIChpblNpemUgLSBpblBvcykpIHsKKyAgICAgICAgICAgIEFMT0dEKCJkZWNvZGVkIGZyYW1lIGluIGN1cnJlbnQgYWNjZXNzIG5hbCwgaWdub3JpbmcgZnVydGhlciB0cmFpbGluZyBieXRlcyAlZCIsCisgICAgICAgICAgICAgICAgICAoaW50KWluU2l6ZSAtIChpbnQpaW5Qb3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZW9zKSB7CisgICAgICAgIGRyYWluSW50ZXJuYWwoRFJBSU5fQ09NUE9ORU5UX1dJVEhfRU9TLCBwb29sLCB3b3JrKTsKKyAgICAgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IHRydWU7CisgICAgfSBlbHNlIGlmICghaGFzUGljdHVyZSkgeworICAgICAgICBmaWxsRW1wdHlXb3JrKHdvcmspOworICAgIH0KK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0SGV2Y0RlYzo6ZHJhaW5JbnRlcm5hbCgKKyAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sLAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykgeworICAgIGlmIChkcmFpbk1vZGUgPT0gTk9fRFJBSU4pIHsKKyAgICAgICAgQUxPR1coImRyYWluIHdpdGggTk9fRFJBSU46IG5vLW9wIik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisgICAgaWYgKGRyYWluTW9kZSA9PSBEUkFJTl9DSEFJTikgeworICAgICAgICBBTE9HVygiRFJBSU5fQ0hBSU4gbm90IHN1cHBvcnRlZCIpOworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICBpZiAoT0sgIT0gc2V0Rmx1c2hNb2RlKCkpIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgaWYgKEMyX09LICE9IGVuc3VyZURlY29kZXJTdGF0ZShwb29sKSkgeworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgICAgICB9CisgICAgICAgIEMyR3JhcGhpY1ZpZXcgd1ZpZXcgPSBtT3V0QmxvY2stPm1hcCgpLmdldCgpOworICAgICAgICBpZiAod1ZpZXcuZXJyb3IoKSkgeworICAgICAgICAgICAgQUxPR0UoImdyYXBoaWMgdmlldyBtYXAgZmFpbGVkICVkIiwgd1ZpZXcuZXJyb3IoKSk7CisgICAgICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgICAgICB9CisgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfaXBfdCBzX2RlY29kZV9pcDsKKyAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9vcF90IHNfZGVjb2RlX29wOworICAgICAgICBpZiAoIXNldERlY29kZUFyZ3MoJnNfZGVjb2RlX2lwLCAmc19kZWNvZGVfb3AsIG51bGxwdHIsICZ3VmlldywgMCwgMCwgMCkpIHsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICAgICAgfQorICAgICAgICAodm9pZCkgaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsICZzX2RlY29kZV9pcCwgJnNfZGVjb2RlX29wKTsKKyAgICAgICAgaWYgKHNfZGVjb2RlX29wLnU0X291dHB1dF9wcmVzZW50KSB7CisgICAgICAgICAgICBmaW5pc2hXb3JrKHNfZGVjb2RlX29wLnU0X3RzLCB3b3JrKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZpbGxFbXB0eVdvcmsod29yayk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0SGV2Y0RlYzo6ZHJhaW4oCisgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgIHJldHVybiBkcmFpbkludGVybmFsKGRyYWluTW9kZSwgcG9vbCwgbnVsbHB0cik7Cit9CisKK2NsYXNzIEMyU29mdEhldmNEZWNGYWN0b3J5IDogcHVibGljIEMyQ29tcG9uZW50RmFjdG9yeSB7CitwdWJsaWM6CisgICAgQzJTb2Z0SGV2Y0RlY0ZhY3RvcnkoKSA6IG1IZWxwZXIoc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyUmVmbGVjdG9ySGVscGVyPigKKyAgICAgICAgR2V0Q29kZWMyUGxhdGZvcm1Db21wb25lbnRTdG9yZSgpLT5nZXRQYXJhbVJlZmxlY3RvcigpKSkgeworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlQ29tcG9uZW50KAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiogY29uc3QgY29tcG9uZW50LAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50Kik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmNvbXBvbmVudCA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4oCisgICAgICAgICAgICAgICAgbmV3IEMyU29mdEhldmNEZWMoQ09NUE9ORU5UX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0SGV2Y0RlYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiogY29uc3QgaW50ZXJmYWNlLAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50SW50ZXJmYWNlKik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmludGVyZmFjZSA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4oCisgICAgICAgICAgICAgICAgbmV3IFNpbXBsZUludGVyZmFjZTxDMlNvZnRIZXZjRGVjOjpJbnRmSW1wbD4oCisgICAgICAgICAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwgaWQsIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0SGV2Y0RlYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgfkMyU29mdEhldmNEZWNGYWN0b3J5KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gbUhlbHBlcjsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2V4dGVybiAiQyIgOjpDMkNvbXBvbmVudEZhY3RvcnkqIENyZWF0ZUNvZGVjMkZhY3RvcnkoKSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIHJldHVybiBuZXcgOjphbmRyb2lkOjpDMlNvZnRIZXZjRGVjRmFjdG9yeSgpOworfQorCitleHRlcm4gIkMiIHZvaWQgRGVzdHJveUNvZGVjMkZhY3RvcnkoOjpDMkNvbXBvbmVudEZhY3RvcnkqIGZhY3RvcnkpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgZGVsZXRlIGZhY3Rvcnk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9oZXZjL0MyU29mdEhldmNEZWMuaCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2hldmMvQzJTb2Z0SGV2Y0RlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1MTExZmMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9oZXZjL0MyU29mdEhldmNEZWMuaApAQCAtMCwwICsxLDE1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9DMl9TT0ZUX0hFVkNfREVDX0hfCisjZGVmaW5lIEFORFJPSURfQzJfU09GVF9IRVZDX0RFQ19IXworCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9Db2xvclV0aWxzLmg+CisKKyNpbmNsdWRlIDxTaW1wbGVDMkNvbXBvbmVudC5oPgorCisjaW5jbHVkZSAiaWhldmNfdHlwZWRlZnMuaCIKKyNpbmNsdWRlICJpdi5oIgorI2luY2x1ZGUgIml2ZC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKyNkZWZpbmUgaXZkZWNfYXBpX2Z1bmN0aW9uICAgICAgICAgICAgICBpaGV2Y2RfY3hhX2FwaV9mdW5jdGlvbgorI2RlZmluZSBpdmRleHRfY3JlYXRlX2lwX3QgICAgICAgICAgICAgIGloZXZjZF9jeGFfY3JlYXRlX2lwX3QKKyNkZWZpbmUgaXZkZXh0X2NyZWF0ZV9vcF90ICAgICAgICAgICAgICBpaGV2Y2RfY3hhX2NyZWF0ZV9vcF90CisjZGVmaW5lIGl2ZGV4dF9kZWxldGVfaXBfdCAgICAgICAgICAgICAgaWhldmNkX2N4YV9kZWxldGVfaXBfdAorI2RlZmluZSBpdmRleHRfZGVsZXRlX29wX3QgICAgICAgICAgICAgIGloZXZjZF9jeGFfZGVsZXRlX29wX3QKKyNkZWZpbmUgaXZkZXh0X2N0bF9zZXRfbnVtX2NvcmVzX2lwX3QgICBpaGV2Y2RfY3hhX2N0bF9zZXRfbnVtX2NvcmVzX2lwX3QKKyNkZWZpbmUgaXZkZXh0X2N0bF9zZXRfbnVtX2NvcmVzX29wX3QgICBpaGV2Y2RfY3hhX2N0bF9zZXRfbnVtX2NvcmVzX29wX3QKKyNkZWZpbmUgaXZkZXh0X2N0bF9nZXRfdnVpX3BhcmFtc19pcF90ICBpaGV2Y2RfY3hhX2N0bF9nZXRfdnVpX3BhcmFtc19pcF90CisjZGVmaW5lIGl2ZGV4dF9jdGxfZ2V0X3Z1aV9wYXJhbXNfb3BfdCAgaWhldmNkX2N4YV9jdGxfZ2V0X3Z1aV9wYXJhbXNfb3BfdAorI2RlZmluZSBBTElHTjY0KHgpICAgICAgICAgICAgICAgICAgICAgICgoKCh4KSArIDYzKSA+PiA2KSA8PCA2KQorI2RlZmluZSBNQVhfTlVNX0NPUkVTICAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgSVZERVhUX0NNRF9DVExfU0VUX05VTV9DT1JFUyAgICBcCisgICAgICAgIChJVkRfQ09OVFJPTF9BUElfQ09NTUFORF9UWVBFX1QpSUhFVkNEX0NYQV9DTURfQ1RMX1NFVF9OVU1fQ09SRVMKKyNkZWZpbmUgTUlOKGEsIGIpICAgICAgICAgICAgICAgICAgICAgICAoKChhKSA8IChiKSkgPyAoYSkgOiAoYikpCisjZGVmaW5lIEdFVFRJTUUoYSwgYikgICAgICAgICAgICAgICAgICAgZ2V0dGltZW9mZGF5KGEsIGIpOworI2RlZmluZSBUSU1FX0RJRkYoc3RhcnQsIGVuZCwgZGlmZikgICAgIFwKKyAgICBkaWZmID0gKCgoZW5kKS50dl9zZWMgLSAoc3RhcnQpLnR2X3NlYykgKiAxMDAwMDAwKSArIFwKKyAgICAgICAgICAgICgoZW5kKS50dl91c2VjIC0gKHN0YXJ0KS50dl91c2VjKTsKKworCitzdHJ1Y3QgQzJTb2Z0SGV2Y0RlYyA6IHB1YmxpYyBTaW1wbGVDMkNvbXBvbmVudCB7CisgICAgY2xhc3MgSW50ZkltcGw7CisKKyAgICBDMlNvZnRIZXZjRGVjKGNvbnN0IGNoYXIqIG5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4mIGludGZJbXBsKTsKKyAgICB2aXJ0dWFsIH5DMlNvZnRIZXZjRGVjKCk7CisKKyAgICAvLyBGcm9tIFNpbXBsZUMyQ29tcG9uZW50CisgICAgYzJfc3RhdHVzX3Qgb25Jbml0KCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25TdG9wKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlc2V0KCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlbGVhc2UoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvbkZsdXNoX3NtKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBwcm9jZXNzKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBkcmFpbigKKyAgICAgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworIHByaXZhdGU6CisgICAgc3RhdHVzX3QgY3JlYXRlRGVjb2RlcigpOworICAgIHN0YXR1c190IHNldE51bUNvcmVzKCk7CisgICAgc3RhdHVzX3Qgc2V0UGFyYW1zKHNpemVfdCBzdHJpZGUsIElWRF9WSURFT19ERUNPREVfTU9ERV9UIGRlY19tb2RlKTsKKyAgICBzdGF0dXNfdCBnZXRWZXJzaW9uKCk7CisgICAgc3RhdHVzX3QgaW5pdERlY29kZXIoKTsKKyAgICBib29sIHNldERlY29kZUFyZ3MoaXZkX3ZpZGVvX2RlY29kZV9pcF90ICpwc19kZWNvZGVfaXAsCisgICAgICAgICAgICAgICAgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfb3BfdCAqcHNfZGVjb2RlX29wLAorICAgICAgICAgICAgICAgICAgICAgICBDMlJlYWRWaWV3ICppbkJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgQzJHcmFwaGljVmlldyAqb3V0QnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgaW5PZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBpblNpemUsCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHRzTWFya2VyKTsKKyAgICBib29sIGdldFZ1aVBhcmFtcygpOworICAgIC8vIFRPRE86VGhpcyBpcyBub3QgdGhlIHJpZ2h0IHBsYWNlIGZvciBjb2xvckFzcGVjdHMgZnVuY3Rpb25zLiBUaGVzZSBzaG91bGQKKyAgICAvLyBiZSBwYXJ0IG9mIGMyLXZuZGsgc28gdGhhdCB0aGV5IGNhbiBiZSBhY2Nlc3NlZCBieSBhbGwgdmlkZW8gcGx1Z2lucworICAgIC8vIHVudGlsIHRoZW4sIG1ha2UgdGhlbSBmZWVsIGF0IGhvbWUKKyAgICBib29sIGNvbG9yQXNwZWN0c0RpZmZlcihjb25zdCBDb2xvckFzcGVjdHMgJmEsIGNvbnN0IENvbG9yQXNwZWN0cyAmYik7CisgICAgdm9pZCB1cGRhdGVGaW5hbENvbG9yQXNwZWN0cygKKyAgICAgICAgICAgIGNvbnN0IENvbG9yQXNwZWN0cyAmb3RoZXJBc3BlY3RzLCBjb25zdCBDb2xvckFzcGVjdHMgJnByZWZlcnJlZEFzcGVjdHMpOworICAgIHN0YXR1c190IGhhbmRsZUNvbG9yQXNwZWN0c0NoYW5nZSgpOworICAgIGMyX3N0YXR1c190IGVuc3VyZURlY29kZXJTdGF0ZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKTsKKyAgICB2b2lkIGZpbmlzaFdvcmsodWludDY0X3QgaW5kZXgsIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKTsKKyAgICBzdGF0dXNfdCBzZXRGbHVzaE1vZGUoKTsKKyAgICBjMl9zdGF0dXNfdCBkcmFpbkludGVybmFsKAorICAgICAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKTsKKyAgICBzdGF0dXNfdCByZXNldERlY29kZXIoKTsKKyAgICB2b2lkIHJlc2V0UGx1Z2luKCk7CisgICAgc3RhdHVzX3QgZGVsZXRlRGVjb2RlcigpOworCisgICAgLy8gVE9ETzpUaGlzIGlzIG5vdCB0aGUgcmlnaHQgcGxhY2UgZm9yIHRoaXMgZW51bS4gVGhlc2Ugc2hvdWxkCisgICAgLy8gYmUgcGFydCBvZiBjMi12bmRrIHNvIHRoYXQgdGhleSBjYW4gYmUgYWNjZXNzZWQgYnkgYWxsIHZpZGVvIHBsdWdpbnMKKyAgICAvLyB1bnRpbCB0aGVuLCBtYWtlIHRoZW0gZmVlbCBhdCBob21lCisgICAgZW51bSB7CisgICAgICAgIGtOb3RTdXBwb3J0ZWQsCisgICAgICAgIGtQcmVmZXJCaXRzdHJlYW0sCisgICAgICAgIGtQcmVmZXJDb250YWluZXIsCisgICAgfTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gbUludGY7CisgICAgaXZfb2JqX3QgKm1EZWNIYW5kbGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiBtT3V0QmxvY2s7CisgICAgdWludDhfdCAqbU91dEJ1ZmZlckZsdXNoOworCisgICAgc2l6ZV90IG1OdW1Db3JlczsKKyAgICBJVl9DT0xPUl9GT1JNQVRfVCBtSXZDb2xvcmZvcm1hdDsKKworICAgIHVpbnQzMl90IG1XaWR0aDsKKyAgICB1aW50MzJfdCBtSGVpZ2h0OworICAgIHVpbnQzMl90IG1TdHJpZGU7CisgICAgYm9vbCBtU2lnbmFsbGVkT3V0cHV0RW9zOworICAgIGJvb2wgbVNpZ25hbGxlZEVycm9yOworICAgIGJvb2wgbUhlYWRlckRlY29kZWQ7CisKKyAgICAvLyBDb2xvciBhc3BlY3RzLiBUaGVzZSBhcmUgSVNPIHZhbHVlcyBhbmQgYXJlIG1lYW50IHRvIGRldGVjdCBjaGFuZ2VzIGluIGFzcGVjdHMgdG8gYXZvaWQKKyAgICAvLyBjb252ZXJ0aW5nIHRoZW0gdG8gQzIgdmFsdWVzIGZvciBlYWNoIGZyYW1lCisgICAgc3RydWN0IFZ1aUNvbG9yQXNwZWN0cyB7CisgICAgICAgIHVpbnQ4X3QgcHJpbWFyaWVzOworICAgICAgICB1aW50OF90IHRyYW5zZmVyOworICAgICAgICB1aW50OF90IGNvZWZmczsKKyAgICAgICAgdWludDhfdCBmdWxsUmFuZ2U7CisKKyAgICAgICAgLy8gZGVmYXVsdCBjb2xvciBhc3BlY3RzCisgICAgICAgIFZ1aUNvbG9yQXNwZWN0cygpCisgICAgICAgICAgICA6IHByaW1hcmllcygyKSwgdHJhbnNmZXIoMiksIGNvZWZmcygyKSwgZnVsbFJhbmdlKDApIHsgfQorCisgICAgICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBWdWlDb2xvckFzcGVjdHMgJm8pIHsKKyAgICAgICAgICAgIHJldHVybiBwcmltYXJpZXMgPT0gby5wcmltYXJpZXMgJiYgdHJhbnNmZXIgPT0gby50cmFuc2ZlciAmJiBjb2VmZnMgPT0gby5jb2VmZnMKKyAgICAgICAgICAgICAgICAgICAgJiYgZnVsbFJhbmdlID09IG8uZnVsbFJhbmdlOworICAgICAgICB9CisgICAgfSBtQml0c3RyZWFtQ29sb3JBc3BlY3RzOworCisgICAgLy8gcHJvZmlsZQorICAgIHN0cnVjdCB0aW1ldmFsIG1UaW1lU3RhcnQ7CisgICAgc3RydWN0IHRpbWV2YWwgbVRpbWVFbmQ7CisKKyAgICBDMl9ET19OT1RfQ09QWShDMlNvZnRIZXZjRGVjKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9DMl9TT0ZUX0hFVkNfREVDX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcDMvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wMy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2NjY1ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcDMvQW5kcm9pZC5icApAQCAtMCwwICsxLDExIEBACitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X21wM2RlYyIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3Nhbml0aXplX2FsbC1kZWZhdWx0cyIsCisgICAgXSwKKworICAgIHNyY3M6IFsiQzJTb2Z0TXAzRGVjLmNwcCJdLAorCisgICAgc3RhdGljX2xpYnM6IFsibGlic3RhZ2VmcmlnaHRfbXAzZGVjIl0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcDMvQzJTb2Z0TXAzRGVjLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wMy9DMlNvZnRNcDNEZWMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4YjgzOTcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcDMvQzJTb2Z0TXAzRGVjLmNwcApAQCAtMCwwICsxLDU1OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJTb2Z0TXAzRGVjIgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworI2luY2x1ZGUgPG51bWVyaWM+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oPgorCisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxTaW1wbGVDMkludGVyZmFjZS5oPgorCisjaW5jbHVkZSAiQzJTb2Z0TXAzRGVjLmgiCisjaW5jbHVkZSAicHZtcDNkZWNvZGVyX2FwaS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NvbnN0ZXhwciBjaGFyIENPTVBPTkVOVF9OQU1FW10gPSAiYzIuYW5kcm9pZC5tcDMuZGVjb2RlciI7CisKK2NsYXNzIEMyU29mdE1QMzo6SW50ZkltcGwgOiBwdWJsaWMgQzJJbnRlcmZhY2VIZWxwZXIgeworcHVibGljOgorICAgIGV4cGxpY2l0IEludGZJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gJmhlbHBlcikKKyAgICAgICAgOiBDMkludGVyZmFjZUhlbHBlcihoZWxwZXIpIHsKKworICAgICAgICBzZXREZXJpdmVkSW5zdGFuY2UodGhpcyk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dEZvcm1hdCwgQzJfTkFNRV9JTlBVVF9TVFJFQU1fRk9STUFUX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbUZvcm1hdENvbmZpZzo6aW5wdXQoMHUsIEMyRm9ybWF0Q29tcHJlc3NlZCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtT3V0cHV0Rm9ybWF0LCBDMl9OQU1FX09VVFBVVF9TVFJFQU1fRk9STUFUX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbUZvcm1hdENvbmZpZzo6b3V0cHV0KDB1LCBDMkZvcm1hdEF1ZGlvKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dE1lZGlhVHlwZSwgQzJfTkFNRV9JTlBVVF9QT1JUX01JTUVfU0VUVElORykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoQWxsb2NTaGFyZWRTdHJpbmc8QzJQb3J0TWltZUNvbmZpZzo6aW5wdXQ+KAorICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFRykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtT3V0cHV0TWVkaWFUeXBlLCBDMl9OQU1FX09VVFBVVF9QT1JUX01JTUVfU0VUVElORykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoQWxsb2NTaGFyZWRTdHJpbmc8QzJQb3J0TWltZUNvbmZpZzo6b3V0cHV0PigKKyAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX1JBVykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtU2FtcGxlUmF0ZSwgQzJfTkFNRV9TVFJFQU1fU0FNUExFX1JBVEVfU0VUVElORykKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86Om91dHB1dCgwdSwgNDQxMDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobVNhbXBsZVJhdGUsIHZhbHVlKS5vbmVPZih7ODAwMCwgMTEwMjUsIDEyMDAwLCAxNjAwMCwKKyAgICAgICAgICAgICAgICAgICAgMjIwNTAsIDI0MDAwLCAzMjAwMCwgNDQxMDAsIDQ4MDAwfSl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKChTZXR0ZXI8ZGVjbHR5cGUoKm1TYW1wbGVSYXRlKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQ2hhbm5lbENvdW50LCBDMl9OQU1FX1NUUkVBTV9DSEFOTkVMX0NPVU5UX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86Om91dHB1dCgwdSwgMikpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQ2hhbm5lbENvdW50LCB2YWx1ZSkuaW5SYW5nZSgxLCAyKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptQ2hhbm5lbENvdW50KT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1CaXRyYXRlLCBDMl9OQU1FX1NUUkVBTV9CSVRSQVRFX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMkJpdHJhdGVUdW5pbmc6OmlucHV0KDB1LCA2NDAwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQml0cmF0ZSwgdmFsdWUpLmluUmFuZ2UoODAwMCwgMzIwMDAwKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptQml0cmF0ZSk+OjpOb25TdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRNYXhCdWZTaXplLCBDMl9QQVJBTUtFWV9JTlBVVF9NQVhfQlVGRkVSX1NJWkUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dCgwdSwgODE5MikpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Gb3JtYXRDb25maWc6OmlucHV0PiBtSW5wdXRGb3JtYXQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRm9ybWF0Q29uZmlnOjpvdXRwdXQ+IG1PdXRwdXRGb3JtYXQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydE1pbWVDb25maWc6OmlucHV0PiBtSW5wdXRNZWRpYVR5cGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydE1pbWVDb25maWc6Om91dHB1dD4gbU91dHB1dE1lZGlhVHlwZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0PiBtU2FtcGxlUmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjpvdXRwdXQ+IG1DaGFubmVsQ291bnQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQml0cmF0ZVR1bmluZzo6aW5wdXQ+IG1CaXRyYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dD4gbUlucHV0TWF4QnVmU2l6ZTsKK307CisKK0MyU29mdE1QMzo6QzJTb2Z0TVAzKGNvbnN0IGNoYXIgKm5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gJmludGZJbXBsKQorICAgIDogU2ltcGxlQzJDb21wb25lbnQoc3RkOjptYWtlX3NoYXJlZDxTaW1wbGVJbnRlcmZhY2U8SW50ZkltcGw+PihuYW1lLCBpZCwgaW50ZkltcGwpKSwKKyAgICAgIG1JbnRmKGludGZJbXBsKSwKKyAgICAgIG1Db25maWcobnVsbHB0ciksCisgICAgICBtRGVjb2RlckJ1ZihudWxscHRyKSB7Cit9CisKK0MyU29mdE1QMzo6fkMyU29mdE1QMygpIHsKKyAgICBvblJlbGVhc2UoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0TVAzOjpvbkluaXQoKSB7CisgICAgc3RhdHVzX3QgZXJyID0gaW5pdERlY29kZXIoKTsKKyAgICByZXR1cm4gZXJyID09IE9LID8gQzJfT0sgOiBDMl9OT19NRU1PUlk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdE1QMzo6b25TdG9wKCkgeworICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBuZXh0IGJ1ZmZlciBvdXRwdXQgZG9lcyBub3Qgc3RpbGwKKyAgICAvLyBkZXBlbmQgb24gZnJhZ21lbnRzIGZyb20gdGhlIGxhc3Qgb25lIGRlY29kZWQuCisgICAgcHZtcDNfSW5pdERlY29kZXIobUNvbmZpZywgbURlY29kZXJCdWYpOworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIG1Jc0ZpcnN0ID0gdHJ1ZTsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisgICAgbUFuY2hvclRpbWVTdGFtcCA9IDA7CisgICAgbVByb2Nlc3NlZFNhbXBsZXMgPSAwOworCisgICAgcmV0dXJuIEMyX09LOworfQorCit2b2lkIEMyU29mdE1QMzo6b25SZXNldCgpIHsKKyAgICAodm9pZClvblN0b3AoKTsKK30KKwordm9pZCBDMlNvZnRNUDM6Om9uUmVsZWFzZSgpIHsKKyAgICBtR2FwbGVzc0J5dGVzID0gZmFsc2U7CisgICAgaWYgKG1EZWNvZGVyQnVmKSB7CisgICAgICAgIGZyZWUobURlY29kZXJCdWYpOworICAgICAgICBtRGVjb2RlckJ1ZiA9IG51bGxwdHI7CisgICAgfQorCisgICAgaWYgKG1Db25maWcpIHsKKyAgICAgICAgZGVsZXRlIG1Db25maWc7CisgICAgICAgIG1Db25maWcgPSBudWxscHRyOworICAgIH0KK30KKworc3RhdHVzX3QgQzJTb2Z0TVAzOjppbml0RGVjb2RlcigpIHsKKyAgICBtQ29uZmlnID0gbmV3IHRQVk1QM0RlY29kZXJFeHRlcm5hbHt9OworICAgIGlmICghbUNvbmZpZykgcmV0dXJuIE5PX01FTU9SWTsKKyAgICBtQ29uZmlnLT5lcXVhbGl6ZXJUeXBlID0gZmxhdDsKKyAgICBtQ29uZmlnLT5jcmNFbmFibGVkID0gZmFsc2U7CisKKyAgICBzaXplX3QgbWVtUmVxdWlyZW1lbnRzID0gcHZtcDNfZGVjb2Rlck1lbVJlcXVpcmVtZW50cygpOworICAgIG1EZWNvZGVyQnVmID0gbWFsbG9jKG1lbVJlcXVpcmVtZW50cyk7CisgICAgaWYgKCFtRGVjb2RlckJ1ZikgcmV0dXJuIE5PX01FTU9SWTsKKworICAgIHB2bXAzX0luaXREZWNvZGVyKG1Db25maWcsIG1EZWNvZGVyQnVmKTsKKworICAgIG1Jc0ZpcnN0ID0gdHJ1ZTsKKyAgICBtR2FwbGVzc0J5dGVzID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworICAgIG1BbmNob3JUaW1lU3RhbXAgPSAwOworICAgIG1Qcm9jZXNzZWRTYW1wbGVzID0gMDsKKworICAgIHJldHVybiBPSzsKK30KKworLyogVGhlIGJlbG93IGNvZGUgaXMgYm9ycm93ZWQgZnJvbSAuL3Rlc3QvbXAzcmVhZGVyLmNwcCAqLworc3RhdGljIGJvb2wgcGFyc2VNcDNIZWFkZXIodWludDMyX3QgaGVhZGVyLCBzaXplX3QgKmZyYW1lX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqb3V0X3NhbXBsaW5nX3JhdGUgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKm91dF9jaGFubmVscyA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqb3V0X2JpdHJhdGUgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKm91dF9udW1fc2FtcGxlcyA9IG51bGxwdHIpIHsKKyAgICAqZnJhbWVfc2l6ZSA9IDA7CisgICAgaWYgKG91dF9zYW1wbGluZ19yYXRlKSAqb3V0X3NhbXBsaW5nX3JhdGUgPSAwOworICAgIGlmIChvdXRfY2hhbm5lbHMpICpvdXRfY2hhbm5lbHMgPSAwOworICAgIGlmIChvdXRfYml0cmF0ZSkgKm91dF9iaXRyYXRlID0gMDsKKyAgICBpZiAob3V0X251bV9zYW1wbGVzKSAqb3V0X251bV9zYW1wbGVzID0gMTE1MjsKKworICAgIGlmICgoaGVhZGVyICYgMHhmZmUwMDAwMCkgIT0gMHhmZmUwMDAwMCkgcmV0dXJuIGZhbHNlOworCisgICAgdW5zaWduZWQgdmVyc2lvbiA9IChoZWFkZXIgPj4gMTkpICYgMzsKKyAgICBpZiAodmVyc2lvbiA9PSAweDAxKSByZXR1cm4gZmFsc2U7CisKKyAgICB1bnNpZ25lZCBsYXllciA9IChoZWFkZXIgPj4gMTcpICYgMzsKKyAgICBpZiAobGF5ZXIgPT0gMHgwMCkgcmV0dXJuIGZhbHNlOworCisgICAgdW5zaWduZWQgYml0cmF0ZV9pbmRleCA9IChoZWFkZXIgPj4gMTIpICYgMHgwZjsKKyAgICBpZiAoYml0cmF0ZV9pbmRleCA9PSAwIHx8IGJpdHJhdGVfaW5kZXggPT0gMHgwZikgcmV0dXJuIGZhbHNlOworCisgICAgdW5zaWduZWQgc2FtcGxpbmdfcmF0ZV9pbmRleCA9IChoZWFkZXIgPj4gMTApICYgMzsKKyAgICBpZiAoc2FtcGxpbmdfcmF0ZV9pbmRleCA9PSAzKSByZXR1cm4gZmFsc2U7CisKKyAgICBzdGF0aWMgY29uc3QgaW50IGtTYW1wbGluZ1JhdGVWMVtdID0geyA0NDEwMCwgNDgwMDAsIDMyMDAwIH07CisgICAgaW50IHNhbXBsaW5nX3JhdGUgPSBrU2FtcGxpbmdSYXRlVjFbc2FtcGxpbmdfcmF0ZV9pbmRleF07CisgICAgaWYgKHZlcnNpb24gPT0gMiAvKiBWMiAqLykgeworICAgICAgICBzYW1wbGluZ19yYXRlIC89IDI7CisgICAgfSBlbHNlIGlmICh2ZXJzaW9uID09IDAgLyogVjIuNSAqLykgeworICAgICAgICBzYW1wbGluZ19yYXRlIC89IDQ7CisgICAgfQorCisgICAgdW5zaWduZWQgcGFkZGluZyA9IChoZWFkZXIgPj4gOSkgJiAxOworCisgICAgaWYgKGxheWVyID09IDMpIHsgLy8gbGF5ZXIgSQorICAgICAgICBzdGF0aWMgY29uc3QgaW50IGtCaXRyYXRlVjFbXSA9CisgICAgICAgIHsKKyAgICAgICAgICAgIDMyLCA2NCwgOTYsIDEyOCwgMTYwLCAxOTIsIDIyNCwgMjU2LCAyODgsIDMyMCwgMzUyLCAzODQsIDQxNiwgNDQ4CisgICAgICAgIH07CisgICAgICAgIHN0YXRpYyBjb25zdCBpbnQga0JpdHJhdGVWMltdID0KKyAgICAgICAgeworICAgICAgICAgICAgMzIsIDQ4LCA1NiwgNjQsIDgwLCA5NiwgMTEyLCAxMjgsIDE0NCwgMTYwLCAxNzYsIDE5MiwgMjI0LCAyNTYKKyAgICAgICAgfTsKKworICAgICAgICBpbnQgYml0cmF0ZSA9ICh2ZXJzaW9uID09IDMgLyogVjEgKi8pID8ga0JpdHJhdGVWMVtiaXRyYXRlX2luZGV4IC0gMV0gOgorICAgICAgICAgICAgICAgIGtCaXRyYXRlVjJbYml0cmF0ZV9pbmRleCAtIDFdOworCisgICAgICAgIGlmIChvdXRfYml0cmF0ZSkgeworICAgICAgICAgICAgKm91dF9iaXRyYXRlID0gYml0cmF0ZTsKKyAgICAgICAgfQorICAgICAgICAqZnJhbWVfc2l6ZSA9ICgxMjAwMCAqIGJpdHJhdGUgLyBzYW1wbGluZ19yYXRlICsgcGFkZGluZykgKiA0OworICAgICAgICBpZiAob3V0X251bV9zYW1wbGVzKSB7CisgICAgICAgICAgICAqb3V0X251bV9zYW1wbGVzID0gMzg0OworICAgICAgICB9CisgICAgfSBlbHNlIHsgLy8gbGF5ZXIgSUkgb3IgSUlJCisgICAgICAgIHN0YXRpYyBjb25zdCBpbnQga0JpdHJhdGVWMUwyW10gPQorICAgICAgICB7CisgICAgICAgICAgICAzMiwgNDgsIDU2LCA2NCwgODAsIDk2LCAxMTIsIDEyOCwgMTYwLCAxOTIsIDIyNCwgMjU2LCAzMjAsIDM4NAorICAgICAgICB9OworCisgICAgICAgIHN0YXRpYyBjb25zdCBpbnQga0JpdHJhdGVWMUwzW10gPQorICAgICAgICB7CisgICAgICAgICAgICAzMiwgNDAsIDQ4LCA1NiwgNjQsIDgwLCA5NiwgMTEyLCAxMjgsIDE2MCwgMTkyLCAyMjQsIDI1NiwgMzIwCisgICAgICAgIH07CisKKyAgICAgICAgc3RhdGljIGNvbnN0IGludCBrQml0cmF0ZVYyW10gPQorICAgICAgICB7CisgICAgICAgICAgICA4LCAxNiwgMjQsIDMyLCA0MCwgNDgsIDU2LCA2NCwgODAsIDk2LCAxMTIsIDEyOCwgMTQ0LCAxNjAKKyAgICAgICAgfTsKKworICAgICAgICBpbnQgYml0cmF0ZTsKKyAgICAgICAgaWYgKHZlcnNpb24gPT0gMyAvKiBWMSAqLykgeworICAgICAgICAgICAgYml0cmF0ZSA9IChsYXllciA9PSAyIC8qIEwyICovKSA/IGtCaXRyYXRlVjFMMltiaXRyYXRlX2luZGV4IC0gMV0gOgorICAgICAgICAgICAgICAgICAgICBrQml0cmF0ZVYxTDNbYml0cmF0ZV9pbmRleCAtIDFdOworCisgICAgICAgICAgICBpZiAob3V0X251bV9zYW1wbGVzKSB7CisgICAgICAgICAgICAgICAgKm91dF9udW1fc2FtcGxlcyA9IDExNTI7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7IC8vIFYyIChvciAyLjUpCisgICAgICAgICAgICBiaXRyYXRlID0ga0JpdHJhdGVWMltiaXRyYXRlX2luZGV4IC0gMV07CisgICAgICAgICAgICBpZiAob3V0X251bV9zYW1wbGVzKSB7CisgICAgICAgICAgICAgICAgKm91dF9udW1fc2FtcGxlcyA9IChsYXllciA9PSAxIC8qIEwzICovKSA/IDU3NiA6IDExNTI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAob3V0X2JpdHJhdGUpIHsKKyAgICAgICAgICAgICpvdXRfYml0cmF0ZSA9IGJpdHJhdGU7CisgICAgICAgIH0KKworICAgICAgICBpZiAodmVyc2lvbiA9PSAzIC8qIFYxICovKSB7CisgICAgICAgICAgICAqZnJhbWVfc2l6ZSA9IDE0NDAwMCAqIGJpdHJhdGUgLyBzYW1wbGluZ19yYXRlICsgcGFkZGluZzsKKyAgICAgICAgfSBlbHNlIHsgLy8gVjIgb3IgVjIuNQorICAgICAgICAgICAgc2l6ZV90IHRtcCA9IChsYXllciA9PSAxIC8qIEwzICovKSA/IDcyMDAwIDogMTQ0MDAwOworICAgICAgICAgICAgKmZyYW1lX3NpemUgPSB0bXAgKiBiaXRyYXRlIC8gc2FtcGxpbmdfcmF0ZSArIHBhZGRpbmc7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAob3V0X3NhbXBsaW5nX3JhdGUpIHsKKyAgICAgICAgKm91dF9zYW1wbGluZ19yYXRlID0gc2FtcGxpbmdfcmF0ZTsKKyAgICB9CisKKyAgICBpZiAob3V0X2NoYW5uZWxzKSB7CisgICAgICAgIGludCBjaGFubmVsX21vZGUgPSAoaGVhZGVyID4+IDYpICYgMzsKKworICAgICAgICAqb3V0X2NoYW5uZWxzID0gKGNoYW5uZWxfbW9kZSA9PSAzKSA/IDEgOiAyOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgdWludDMyX3QgVTMyX0FUKGNvbnN0IHVpbnQ4X3QgKnB0cikgeworICAgIHJldHVybiBwdHJbMF0gPDwgMjQgfCBwdHJbMV0gPDwgMTYgfCBwdHJbMl0gPDwgOCB8IHB0clszXTsKK30KKworc3RhdGljIHN0YXR1c190IGNhbGN1bGF0ZU91dFNpemUodWludDggKmhlYWRlciwgc2l6ZV90IGluU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHNpemVfdD4gKmRlY29kZWRTaXplcykgeworICAgIHVpbnQzMl90IGNoYW5uZWxzOworICAgIHVpbnQzMl90IG51bVNhbXBsZXM7CisgICAgc2l6ZV90IGZyYW1lU2l6ZTsKKyAgICBzaXplX3QgdG90YWxJblNpemUgPSAwOworCisgICAgd2hpbGUgKHRvdGFsSW5TaXplICsgNCA8IGluU2l6ZSkgeworICAgICAgICBpZiAoIXBhcnNlTXAzSGVhZGVyKFUzMl9BVChoZWFkZXIgKyB0b3RhbEluU2l6ZSksICZmcmFtZVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwgJmNoYW5uZWxzLCBudWxscHRyLCAmbnVtU2FtcGxlcykpIHsKKyAgICAgICAgICAgIEFMT0dFKCJFcnJvciBpbiBwYXJzZSBtcDMgaGVhZGVyIGR1cmluZyBvdXRTaXplIGVzdGltYXRpb24iKTsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgICAgIHRvdGFsSW5TaXplICs9IGZyYW1lU2l6ZTsKKyAgICAgICAgZGVjb2RlZFNpemVzLT5wdXNoX2JhY2sobnVtU2FtcGxlcyAqIGNoYW5uZWxzICogc2l6ZW9mKGludDE2X3QpKTsKKyAgICB9CisKKyAgICBpZiAoZGVjb2RlZFNpemVzLT5lbXB0eSgpKSByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKworICAgIHJldHVybiBPSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0TVAzOjpvbkZsdXNoX3NtKCkgeworICAgIHJldHVybiBvblN0b3AoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0TVAzOjpkcmFpbigKKyAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgKHZvaWQpIHBvb2w7CisgICAgaWYgKGRyYWluTW9kZSA9PSBOT19EUkFJTikgeworICAgICAgICBBTE9HVygiZHJhaW4gd2l0aCBOT19EUkFJTjogbm8tb3AiKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKyAgICBpZiAoZHJhaW5Nb2RlID09IERSQUlOX0NIQUlOKSB7CisgICAgICAgIEFMT0dXKCJEUkFJTl9DSEFJTiBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKworICAgIHJldHVybiBDMl9PSzsKK30KKworLy8gVE9ETzogQ2FuIG92ZXJhbGwgZXJyb3IgY2hlY2tpbmcgYmUgaW1wcm92ZWQ/IEFzIGluIHRoZSBjaGVjayBmb3IgdmFsaWRpdHkgb2YKKy8vICAgICAgIHdvcmssIHBvb2wgcHRyLCB3b3JrLT5pbnB1dC5idWZmZXJzLnNpemUoKSA9PSAxLCAuLi4KKy8vIFRPRE86IEJsaW5kIHJlbW92YWwgb2YgNTI5IHNhbXBsZXMgZnJvbSB0aGUgb3V0cHV0IG1heSBub3Qgd29yay4gQmVjYXVzZQorLy8gICAgICAgbXBlZyBsYXllciAxIGZyYW1lIHNpemUgaXMgMzg0IHNhbXBsZXMgcGVyIGZyYW1lLiBUaGlzIHNob3VsZCBpbnRyb2R1Y2UKKy8vICAgICAgIG5lZ2F0aXZlIHZhbHVlcyBhbmQgY2FuIGNhdXNlIFNFRyBmYXVsdHMuIFNvZnQgb214IG1wMyBwbHVnaW4gY2FuIGhhdmUKKy8vICAgICAgIHRoaXMgcHJvYmxlbSAoQ0hFQ0shKQordm9pZCBDMlNvZnRNUDM6OnByb2Nlc3MoCisgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgLy8gSW5pdGlhbGl6ZSBvdXRwdXQgd29yaworICAgIHdvcmstPnJlc3VsdCA9IEMyX09LOworICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworCisgICAgaWYgKG1TaWduYWxsZWRFcnJvciB8fCBtU2lnbmFsbGVkT3V0cHV0RW9zKSB7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGJvb2wgZW9zID0gKCh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pICE9IDApOworICAgIHNpemVfdCBpblNpemUgPSAwdTsKKyAgICBDMlJlYWRWaWV3IHJWaWV3ID0gbUR1bW15UmVhZFZpZXc7CisgICAgaWYgKCF3b3JrLT5pbnB1dC5idWZmZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgclZpZXcgPSB3b3JrLT5pbnB1dC5idWZmZXJzWzBdLT5kYXRhKCkubGluZWFyQmxvY2tzKCkuZnJvbnQoKS5tYXAoKS5nZXQoKTsKKyAgICAgICAgaW5TaXplID0gclZpZXcuY2FwYWNpdHkoKTsKKyAgICAgICAgaWYgKGluU2l6ZSAmJiByVmlldy5lcnJvcigpKSB7CisgICAgICAgICAgICBBTE9HRSgicmVhZCB2aWV3IG1hcCBmYWlsZWQgJWQiLCByVmlldy5lcnJvcigpKTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IHJWaWV3LmVycm9yKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoaW5TaXplID09IDAgJiYgKCFtR2FwbGVzc0J5dGVzIHx8ICFlb3MpKSB7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQUxPR1YoImluIGJ1ZmZlciBhdHRyLiBzaXplICV6dSB0aW1lc3RhbXAgJWQgZnJhbWVpbmRleCAlZCIsIGluU2l6ZSwKKyAgICAgICAgICAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1KCksIChpbnQpd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCkpOworCisgICAgaW50MzJfdCBudW1DaGFubmVscyA9IG1Db25maWctPm51bV9jaGFubmVsczsKKyAgICBzaXplX3QgY2FsT3V0U2l6ZTsKKyAgICBzdGQ6OnZlY3RvcjxzaXplX3Q+IGRlY29kZWRTaXplczsKKyAgICBpZiAoaW5TaXplICYmIE9LICE9IGNhbGN1bGF0ZU91dFNpemUoY29uc3RfY2FzdDx1aW50OCAqPihyVmlldy5kYXRhKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblNpemUsICZkZWNvZGVkU2l6ZXMpKSB7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjYWxPdXRTaXplID0gc3RkOjphY2N1bXVsYXRlKGRlY29kZWRTaXplcy5iZWdpbigpLCBkZWNvZGVkU2l6ZXMuZW5kKCksIDApOworICAgIGlmIChlb3MpIHsKKyAgICAgICAgY2FsT3V0U2l6ZSArPSBrUFZNUDNEZWNvZGVyRGVsYXkgKiBudW1DaGFubmVscyAqIHNpemVvZihpbnQxNl90KTsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gYmxvY2s7CisgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSA9IHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9OworICAgIGMyX3N0YXR1c190IGVyciA9IHBvb2wtPmZldGNoTGluZWFyQmxvY2soY2FsT3V0U2l6ZSwgdXNhZ2UsICZibG9jayk7CisgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICBBTE9HRSgiZmV0Y2hMaW5lYXJCbG9jayBmb3IgT3V0cHV0IGZhaWxlZCB3aXRoIHN0YXR1cyAlZCIsIGVycik7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX05PX01FTU9SWTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBDMldyaXRlVmlldyB3VmlldyA9IGJsb2NrLT5tYXAoKS5nZXQoKTsKKyAgICBpZiAod1ZpZXcuZXJyb3IoKSkgeworICAgICAgICBBTE9HRSgid3JpdGUgdmlldyBtYXAgZmFpbGVkICVkIiwgd1ZpZXcuZXJyb3IoKSk7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IHdWaWV3LmVycm9yKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpbnQgb3V0U2l6ZSA9IDA7CisgICAgaW50IG91dE9mZnNldCA9IDA7CisgICAgYXV0byBpdCA9IGRlY29kZWRTaXplcy5iZWdpbigpOworICAgIHNpemVfdCBpblBvcyA9IDA7CisgICAgaW50MzJfdCBzYW1wbGluZ1JhdGUgPSBtQ29uZmlnLT5zYW1wbGluZ1JhdGU7CisgICAgd2hpbGUgKGluUG9zIDwgaW5TaXplKSB7CisgICAgICAgIGlmIChpdCA9PSBkZWNvZGVkU2l6ZXMuZW5kKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJ1bmV4cGVjdGVkIHRyYWlsaW5nIGJ5dGVzLCBpZ25vcmluZyB0aGVtIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIG1Db25maWctPnBJbnB1dEJ1ZmZlciA9IGNvbnN0X2Nhc3Q8dWludDggKj4oclZpZXcuZGF0YSgpICsgaW5Qb3MpOworICAgICAgICBtQ29uZmlnLT5pbnB1dEJ1ZmZlckN1cnJlbnRMZW5ndGggPSAoaW5TaXplIC0gaW5Qb3MpOworICAgICAgICBtQ29uZmlnLT5pbnB1dEJ1ZmZlck1heExlbmd0aCA9IDA7CisgICAgICAgIG1Db25maWctPmlucHV0QnVmZmVyVXNlZExlbmd0aCA9IDA7CisgICAgICAgIG1Db25maWctPm91dHB1dEZyYW1lU2l6ZSA9IChjYWxPdXRTaXplIC0gb3V0U2l6ZSk7CisgICAgICAgIG1Db25maWctPnBPdXRwdXRCdWZmZXIgPSByZWludGVycHJldF9jYXN0PGludDE2X3QgKj4gKHdWaWV3LmRhdGEoKSArIG91dFNpemUpOworCisgICAgICAgIEVSUk9SX0NPREUgZGVjb2RlckVycjsKKyAgICAgICAgaWYgKChkZWNvZGVyRXJyID0gcHZtcDNfZnJhbWVkZWNvZGVyKG1Db25maWcsIG1EZWNvZGVyQnVmKSkKKyAgICAgICAgICAgICAgICAhPSBOT19ERUNPRElOR19FUlJPUikgeworICAgICAgICAgICAgQUxPR0UoIm1wMyBkZWNvZGVyIHJldHVybmVkIGVycm9yICVkIiwgZGVjb2RlckVycik7CisgICAgICAgICAgICBpZiAoZGVjb2RlckVyciAhPSBOT19FTk9VR0hfTUFJTl9EQVRBX0VSUk9SCisgICAgICAgICAgICAgICAgICAgICYmIGRlY29kZXJFcnIgIT0gU0lERV9JTkZPX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBUaGlzIGlzIHJlY292ZXJhYmxlLCBqdXN0IGlnbm9yZSB0aGUgY3VycmVudCBmcmFtZSBhbmQKKyAgICAgICAgICAgIC8vIHBsYXkgc2lsZW5jZSBpbnN0ZWFkLgorICAgICAgICAgICAgQUxPR1YoImlnbm9yaW5nIGVycm9yIGFuZCBzZW5kaW5nIHNpbGVuY2UiKTsKKyAgICAgICAgICAgIGlmIChtQ29uZmlnLT5vdXRwdXRGcmFtZVNpemUgPT0gMCkgeworICAgICAgICAgICAgICAgIG1Db25maWctPm91dHB1dEZyYW1lU2l6ZSA9ICppdCAvIHNpemVvZihpbnQxNl90KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1lbXNldChtQ29uZmlnLT5wT3V0cHV0QnVmZmVyLCAwLCBtQ29uZmlnLT5vdXRwdXRGcmFtZVNpemUgKiBzaXplb2YoaW50MTZfdCkpOworICAgICAgICB9IGVsc2UgaWYgKG1Db25maWctPnNhbXBsaW5nUmF0ZSAhPSBzYW1wbGluZ1JhdGUKKyAgICAgICAgICAgICAgICB8fCBtQ29uZmlnLT5udW1fY2hhbm5lbHMgIT0gbnVtQ2hhbm5lbHMpIHsKKyAgICAgICAgICAgIEFMT0dJKCJSZWNvbmZpZ3VyaW5nIGRlY29kZXI6ICVkLT4lZCBIeiwgJWQtPiVkIGNoYW5uZWxzIiwKKyAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGUsIG1Db25maWctPnNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICBudW1DaGFubmVscywgbUNvbmZpZy0+bnVtX2NoYW5uZWxzKTsKKyAgICAgICAgICAgIHNhbXBsaW5nUmF0ZSA9IG1Db25maWctPnNhbXBsaW5nUmF0ZTsKKyAgICAgICAgICAgIG51bUNoYW5uZWxzID0gbUNvbmZpZy0+bnVtX2NoYW5uZWxzOworCisgICAgICAgICAgICBDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjpvdXRwdXQgc2FtcGxlUmF0ZUluZm8oMHUsIHNhbXBsaW5nUmF0ZSk7CisgICAgICAgICAgICBDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86Om91dHB1dCBjaGFubmVsQ291bnRJbmZvKDB1LCBudW1DaGFubmVscyk7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBtSW50Zi0+Y29uZmlnKAorICAgICAgICAgICAgICAgICAgICB7ICZzYW1wbGVSYXRlSW5mbywgJmNoYW5uZWxDb3VudEluZm8gfSwKKyAgICAgICAgICAgICAgICAgICAgQzJfTUFZX0JMT0NLLAorICAgICAgICAgICAgICAgICAgICAmZmFpbHVyZXMpOworICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUucHVzaF9iYWNrKEMyUGFyYW06OkNvcHkoc2FtcGxlUmF0ZUluZm8pKTsKKyAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLnB1c2hfYmFjayhDMlBhcmFtOjpDb3B5KGNoYW5uZWxDb3VudEluZm8pKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkNvbmZpZyBVcGRhdGUgZmFpbGVkIik7CisgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICgqaXQgIT0gbUNvbmZpZy0+b3V0cHV0RnJhbWVTaXplICogc2l6ZW9mKGludDE2X3QpKSB7CisgICAgICAgICAgICBBTE9HRSgicGFuaWMsIHBhcnNlZCBzaXplIGRvZXMgbm90IG1hdGNoIGRlY29kZWQgc2l6ZSIpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBvdXRTaXplICs9IG1Db25maWctPm91dHB1dEZyYW1lU2l6ZSAqIHNpemVvZihpbnQxNl90KTsKKyAgICAgICAgaW5Qb3MgKz0gbUNvbmZpZy0+aW5wdXRCdWZmZXJVc2VkTGVuZ3RoOworICAgICAgICBpdCsrOworICAgIH0KKyAgICBpZiAobUlzRmlyc3QpIHsKKyAgICAgICAgbUlzRmlyc3QgPSBmYWxzZTsKKyAgICAgICAgbUdhcGxlc3NCeXRlcyA9IHRydWU7CisgICAgICAgIC8vIFRoZSBkZWNvZGVyIGRlbGF5IGlzIDUyOSBzYW1wbGVzLCBzbyB0cmltIHRoYXQgbWFueSBzYW1wbGVzIG9mZgorICAgICAgICAvLyB0aGUgc3RhcnQgb2YgdGhlIGZpcnN0IG91dHB1dCBidWZmZXIuIFRoaXMgZXNzZW50aWFsbHkgbWFrZXMgdGhpcworICAgICAgICAvLyBkZWNvZGVyIGhhdmUgemVybyBkZWxheSwgd2hpY2ggdGhlIHJlc3Qgb2YgdGhlIHBpcGVsaW5lIGFzc3VtZXMuCisgICAgICAgIG91dE9mZnNldCA9IGtQVk1QM0RlY29kZXJEZWxheSAqIG51bUNoYW5uZWxzICogc2l6ZW9mKGludDE2X3QpOworICAgICAgICBtQW5jaG9yVGltZVN0YW1wID0gd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAucGVla3VsbCgpOworICAgIH0KKyAgICBpZiAoZW9zKSB7CisgICAgICAgIGlmIChjYWxPdXRTaXplID49CisgICAgICAgICAgICBvdXRTaXplICsga1BWTVAzRGVjb2RlckRlbGF5ICogbnVtQ2hhbm5lbHMgKiBzaXplb2YoaW50MTZfdCkpIHsKKyAgICAgICAgICAgIGlmICghbWVtc2V0KHJlaW50ZXJwcmV0X2Nhc3Q8aW50MTZfdCo+KHdWaWV3LmRhdGEoKSArIG91dFNpemUpLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAga1BWTVAzRGVjb2RlckRlbGF5ICogbnVtQ2hhbm5lbHMgKiBzaXplb2YoaW50MTZfdCkpKSB7CisgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFMT0dWKCJBZGRpbmcgNTI5IHNhbXBsZXMgYXQgZW5kIik7CisgICAgICAgICAgICBtR2FwbGVzc0J5dGVzID0gZmFsc2U7CisgICAgICAgICAgICBvdXRTaXplICs9IGtQVk1QM0RlY29kZXJEZWxheSAqIG51bUNoYW5uZWxzICogc2l6ZW9mKGludDE2X3QpOworICAgICAgICB9CisgICAgfQorCisgICAgdWludDY0X3Qgb3V0VGltZVN0YW1wID0gbVByb2Nlc3NlZFNhbXBsZXMgKiAxMDAwMDAwbGwgLyBzYW1wbGluZ1JhdGU7CisgICAgbVByb2Nlc3NlZFNhbXBsZXMgKz0gKChvdXRTaXplIC0gb3V0T2Zmc2V0KSAvIChudW1DaGFubmVscyAqIHNpemVvZihpbnQxNl90KSkpOworICAgIEFMT0dWKCJvdXQgYnVmZmVyIGF0dHIuIG9mZnNldCAlZCBzaXplICVkIHRpbWVzdGFtcCAldSIsIG91dE9mZnNldCwgb3V0U2l6ZSAtIG91dE9mZnNldCwKKyAgICAgICAgICAodWludDMyX3QpKG1BbmNob3JUaW1lU3RhbXAgKyBvdXRUaW1lU3RhbXApKTsKKyAgICBkZWNvZGVkU2l6ZXMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLnB1c2hfYmFjaygKKyAgICAgICAgICAgIGNyZWF0ZUxpbmVhckJ1ZmZlcihibG9jaywgb3V0T2Zmc2V0LCBvdXRTaXplIC0gb3V0T2Zmc2V0KSk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsLnRpbWVzdGFtcCA9IG1BbmNob3JUaW1lU3RhbXAgKyBvdXRUaW1lU3RhbXA7CisgICAgaWYgKGVvcykgeworICAgICAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gdHJ1ZTsKKyAgICAgICAgQUxPR1YoInNpZ25hbGxlZCBFT1MiKTsKKyAgICB9Cit9CisKK2NsYXNzIEMyU29mdE1wM0RlY0ZhY3RvcnkgOiBwdWJsaWMgQzJDb21wb25lbnRGYWN0b3J5IHsKK3B1YmxpYzoKKyAgICBDMlNvZnRNcDNEZWNGYWN0b3J5KCkgOiBtSGVscGVyKHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxDMlJlZmxlY3RvckhlbHBlcj4oCisgICAgICAgICAgICBHZXRDb2RlYzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCktPmdldFBhcmFtUmVmbGVjdG9yKCkpKSB7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVDb21wb25lbnQoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KiBjb25zdCBjb21wb25lbnQsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnQqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqY29tcG9uZW50ID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PigKKyAgICAgICAgICAgICAgbmV3IEMyU29mdE1QMyhDT01QT05FTlRfTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdE1QMzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4qIGNvbnN0IGludGVyZmFjZSwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudEludGVyZmFjZSopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICppbnRlcmZhY2UgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KAorICAgICAgICAgICAgICBuZXcgU2ltcGxlSW50ZXJmYWNlPEMyU29mdE1QMzo6SW50ZkltcGw+KAorICAgICAgICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLCBpZCwgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRNUDM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCB+QzJTb2Z0TXAzRGVjRmFjdG9yeSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+IG1IZWxwZXI7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCitleHRlcm4gIkMiIDo6QzJDb21wb25lbnRGYWN0b3J5KiBDcmVhdGVDb2RlYzJGYWN0b3J5KCkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gbmV3IDo6YW5kcm9pZDo6QzJTb2Z0TXAzRGVjRmFjdG9yeSgpOworfQorCitleHRlcm4gIkMiIHZvaWQgRGVzdHJveUNvZGVjMkZhY3RvcnkoOjpDMkNvbXBvbmVudEZhY3RvcnkqIGZhY3RvcnkpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgZGVsZXRlIGZhY3Rvcnk7Cit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wMy9DMlNvZnRNcDNEZWMuaCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wMy9DMlNvZnRNcDNEZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDJiZGM0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXAzL0MyU29mdE1wM0RlYy5oCkBAIC0wLDAgKzEsNzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQzJfU09GVF9NUDNfREVDX0hfCisjZGVmaW5lIEFORFJPSURfQzJfU09GVF9NUDNfREVDX0hfCisKKyNpbmNsdWRlIDxTaW1wbGVDMkNvbXBvbmVudC5oPgorCisKK3N0cnVjdCB0UFZNUDNEZWNvZGVyRXh0ZXJuYWw7CisKK2Jvb2wgcGFyc2VNcDNIZWFkZXIodWludDMyX3QgaGVhZGVyLCBzaXplX3QgKmZyYW1lX3NpemUsCisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpvdXRfc2FtcGxpbmdfcmF0ZSA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpvdXRfY2hhbm5lbHMgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqb3V0X2JpdHJhdGUgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqb3V0X251bV9zYW1wbGVzID0gbnVsbHB0cik7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEMyU29mdE1QMyA6IHB1YmxpYyBTaW1wbGVDMkNvbXBvbmVudCB7CisgICAgY2xhc3MgSW50ZkltcGw7CisKKyAgICBDMlNvZnRNUDMoY29uc3QgY2hhciAqbmFtZSwgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+ICZpbnRmSW1wbCk7CisgICAgdmlydHVhbCB+QzJTb2Z0TVAzKCk7CisKKyAgICAvLyBGcm9tIFNpbXBsZUMyQ29tcG9uZW50CisgICAgYzJfc3RhdHVzX3Qgb25Jbml0KCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25TdG9wKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlc2V0KCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlbGVhc2UoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvbkZsdXNoX3NtKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBwcm9jZXNzKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBkcmFpbigKKyAgICAgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIGVudW0geworICAgICAgICBrUFZNUDNEZWNvZGVyRGVsYXkgPSA1MjkgLy8gc2FtcGxlcworICAgIH07CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+IG1JbnRmOworICAgIHRQVk1QM0RlY29kZXJFeHRlcm5hbCAqbUNvbmZpZzsKKyAgICB2b2lkICptRGVjb2RlckJ1ZjsKKworICAgIGJvb2wgbUlzRmlyc3Q7CisgICAgYm9vbCBtU2lnbmFsbGVkRXJyb3I7CisgICAgYm9vbCBtU2lnbmFsbGVkT3V0cHV0RW9zOworICAgIGJvb2wgbUdhcGxlc3NCeXRlczsKKyAgICB1aW50NjRfdCBtQW5jaG9yVGltZVN0YW1wOworICAgIHVpbnQ2NF90IG1Qcm9jZXNzZWRTYW1wbGVzOworCisgICAgc3RhdHVzX3QgaW5pdERlY29kZXIoKTsKKworICAgIEMyX0RPX05PVF9DT1BZKEMyU29mdE1QMyk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfQzJfU09GVF9NUDNfREVDX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcDMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMiBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wMy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcDMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXAzL05PVElDRSBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wMy9OT1RJQ0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzViMWVmYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wMy9OT1RJQ0UKQEAgLTAsMCArMSwxOTAgQEAKKworICAgQ29weXJpZ2h0IChjKSAyMDA1LTIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0CisgICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCisKKyAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgorCisgICAxLiBEZWZpbml0aW9ucy4KKworICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKKyAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgorCisgICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQorICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgorCisgICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCisgICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCisgICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAorICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCisgICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgorICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCisgICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgorCisgICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgorCisgICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKKyAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KKyAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCisKKyAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCisgICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0CisgICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCisgICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCisKKyAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCisgICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCisgICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKKyAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCisKKyAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKKyAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKKyAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKKyAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCisgICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KKyAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKKyAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCisKKyAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCisgICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCisgICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKKyAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKKyAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgorICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCisgICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50CisgICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bworICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKKyAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCisgICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKKyAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCisgICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKKworICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAorICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCisKKyAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKyAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAorICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCisgICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgorCisgICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKKyAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAorICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKKyAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCisgICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCisgICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQorICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKKyAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKKyAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0CisgICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCisgICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKKyAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KKworICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKKyAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAorICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKKyAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCisgICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgorICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCisKKyAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKKyAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKKworICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCisgICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAorICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCisgICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgorICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKKworICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCisgICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAorICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAorICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAorICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQorICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCisgICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgorICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAorICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKKyAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKKyAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCisgICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KKyAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQorICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAorICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAorICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KKworICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCisgICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCisgICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKKyAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAorICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KKworICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAorICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCisgICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCisgICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5CisgICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAorICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgorCisgICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCisgICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCisgICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKKyAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgorCisgICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKKyAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKKyAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisgICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucworICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQorICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCisgICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKKyAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KKworICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCisgICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKKyAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5CisgICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQorICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAorICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCisgICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCisgICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCisgICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAorICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgorICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgorCisgICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCisgICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAorICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKKyAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCisgICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQorICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKKyAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKKyAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQorICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgorICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCisKKyAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUworCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcDMvcGF0ZW50X2Rpc2NsYWltZXIudHh0IGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXAzL3BhdGVudF9kaXNjbGFpbWVyLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGJmMTFkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXAzL3BhdGVudF9kaXNjbGFpbWVyLnR4dApAQCAtMCwwICsxLDkgQEAKKworVEhJUyBJUyBOT1QgQSBHUkFOVCBPRiBQQVRFTlQgUklHSFRTLgorCitHb29nbGUgbWFrZXMgbm8gcmVwcmVzZW50YXRpb24gb3Igd2FycmFudHkgdGhhdCB0aGUgY29kZWNzIGZvciB3aGljaAorc291cmNlIGNvZGUgaXMgbWFkZSBhdmFpbGFibGUgaGVyZXVuZGVyIGFyZSB1bmVuY3VtYmVyZWQgYnkKK3RoaXJkLXBhcnR5IHBhdGVudHMuICBUaG9zZSBpbnRlbmRpbmcgdG8gdXNlIHRoaXMgc291cmNlIGNvZGUgaW4KK2hhcmR3YXJlIG9yIHNvZnR3YXJlIHByb2R1Y3RzIGFyZSBhZHZpc2VkIHRoYXQgaW1wbGVtZW50YXRpb25zIG9mCit0aGVzZSBjb2RlY3MsIGluY2x1ZGluZyBpbiBvcGVuIHNvdXJjZSBzb2Z0d2FyZSBvciBzaGFyZXdhcmUsIG1heQorcmVxdWlyZSBwYXRlbnQgbGljZW5zZXMgZnJvbSB0aGUgcmVsZXZhbnQgcGF0ZW50IGhvbGRlcnMuCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnMi9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzIvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDFmMGE5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzIvQW5kcm9pZC5icApAQCAtMCwwICsxLDE2IEBACitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X21wZWcyZGVjIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfc2FuaXRpemVfc2lnbmVkLWRlZmF1bHRzIiwKKyAgICBdLAorCisgICAgc3JjczogWyJDMlNvZnRNcGVnMkRlYy5jcHAiXSwKKworICAgIHN0YXRpY19saWJzOiBbImxpYm1wZWcyZGVjIl0sCisKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImV4dGVybmFsL2xpYm1wZWcyL2RlY29kZXIiLAorICAgICAgICAiZXh0ZXJuYWwvbGlibXBlZzIvY29tbW9uIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzIvQzJTb2Z0TXBlZzJEZWMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzIvQzJTb2Z0TXBlZzJEZWMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhMzJlYzAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnMi9DMlNvZnRNcGVnMkRlYy5jcHAKQEAgLTAsMCArMSwxMDY5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDMlNvZnRNcGVnMkRlYyIKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oPgorCisjaW5jbHVkZSA8QzJEZWJ1Zy5oPgorI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8Q29kZWMyTWFwcGVyLmg+CisjaW5jbHVkZSA8U2ltcGxlQzJJbnRlcmZhY2UuaD4KKworI2luY2x1ZGUgIkMyU29mdE1wZWcyRGVjLmgiCisjaW5jbHVkZSAiaW1wZWcyZC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NvbnN0ZXhwciBjaGFyIENPTVBPTkVOVF9OQU1FW10gPSAiYzIuYW5kcm9pZC5tcGVnMi5kZWNvZGVyIjsKKworY2xhc3MgQzJTb2Z0TXBlZzJEZWM6OkludGZJbXBsIDogcHVibGljIFNpbXBsZUludGVyZmFjZTx2b2lkPjo6QmFzZVBhcmFtcyB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgSW50ZkltcGwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiAmaGVscGVyKQorICAgICAgICA6IFNpbXBsZUludGVyZmFjZTx2b2lkPjo6QmFzZVBhcmFtcygKKyAgICAgICAgICAgICAgICBoZWxwZXIsCisgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsCisgICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OktJTkRfREVDT0RFUiwKKyAgICAgICAgICAgICAgICBDMkNvbXBvbmVudDo6RE9NQUlOX1ZJREVPLAorICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUcyKSB7CisgICAgICAgIG5vUHJpdmF0ZUJ1ZmZlcnMoKTsgLy8gVE9ETzogYWNjb3VudCBmb3Igb3VyIGJ1ZmZlcnMgaGVyZQorICAgICAgICBub0lucHV0UmVmZXJlbmNlcygpOworICAgICAgICBub091dHB1dFJlZmVyZW5jZXMoKTsKKyAgICAgICAgbm9JbnB1dExhdGVuY3koKTsKKyAgICAgICAgbm9UaW1lU3RyZXRjaCgpOworCisgICAgICAgIC8vIFRPRE86IG91dHB1dCBsYXRlbmN5IGFuZCByZW9yZGVyaW5nCisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1BdHRyaWIsIEMyX1BBUkFNS0VZX0NPTVBPTkVOVF9BVFRSSUJVVEVTKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJDb21wb25lbnRBdHRyaWJ1dGVzU2V0dGluZyhDMkNvbXBvbmVudDo6QVRUUklCX0lTX1RFTVBPUkFMKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1TaXplLCBDMl9QQVJBTUtFWV9QSUNUVVJFX1NJWkUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0KDB1LCAzMjAsIDI0MCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIHdpZHRoKS5pblJhbmdlKDE2LCAxOTIwLCA0KSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCBoZWlnaHQpLmluUmFuZ2UoMTYsIDEwODgsIDQpLAorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2l6ZVNldHRlcikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1Qcm9maWxlTGV2ZWwsIEMyX1BBUkFNS0VZX1BST0ZJTEVfTEVWRUwpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86OmlucHV0KDB1LAorICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfTVAyVl9TSU1QTEUsIEMyQ29uZmlnOjpMRVZFTF9NUDJWX0hJR0gpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Qcm9maWxlTGV2ZWwsIHByb2ZpbGUpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9NUDJWX1NJTVBMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9NUDJWX01BSU59KSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Qcm9maWxlTGV2ZWwsIGxldmVsKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX01QMlZfTE9XLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9NUDJWX01BSU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX01QMlZfSElHSF8xNDQwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9NUDJWX0hJR0h9KQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoUHJvZmlsZUxldmVsU2V0dGVyLCBtU2l6ZSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1NYXhTaXplLCBDMl9QQVJBTUtFWV9NQVhfUElDVFVSRV9TSVpFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1NYXhQaWN0dXJlU2l6ZVR1bmluZzo6b3V0cHV0KDB1LCAzMjAsIDI0MCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIHdpZHRoKS5pblJhbmdlKDIsIDE5MjAsIDIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIGhlaWdodCkuaW5SYW5nZSgyLCAxMDg4LCAyKSwKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKE1heFBpY3R1cmVTaXplU2V0dGVyLCBtU2l6ZSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1NYXhJbnB1dFNpemUsIEMyX1BBUkFNS0VZX0lOUFVUX01BWF9CVUZGRVJfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0KDB1LCAzMjAgKiAyNDAgKiAzIC8gMikpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobU1heElucHV0U2l6ZSwgdmFsdWUpLmFueSgpLAorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLmNhbGN1bGF0ZWRBcyhNYXhJbnB1dFNpemVTZXR0ZXIsIG1NYXhTaXplKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBDMkNocm9tYU9mZnNldFN0cnVjdCBsb2NhdGlvbnNbMV0gPSB7IEMyQ2hyb21hT2Zmc2V0U3RydWN0OjpJVFVfWVVWXzQyMF8wKCkgfTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JJbmZvOjpvdXRwdXQ+IGRlZmF1bHRDb2xvckluZm8gPQorICAgICAgICAgICAgQzJTdHJlYW1Db2xvckluZm86Om91dHB1dDo6QWxsb2NTaGFyZWQoCisgICAgICAgICAgICAgICAgICAgIDF1LCAwdSwgOHUgLyogYml0RGVwdGggKi8sIEMyQ29sb3I6OllVVl80MjApOworICAgICAgICBtZW1jcHkoZGVmYXVsdENvbG9ySW5mby0+bS5sb2NhdGlvbnMsIGxvY2F0aW9ucywgc2l6ZW9mKGxvY2F0aW9ucykpOworCisgICAgICAgIGRlZmF1bHRDb2xvckluZm8gPQorICAgICAgICAgICAgQzJTdHJlYW1Db2xvckluZm86Om91dHB1dDo6QWxsb2NTaGFyZWQoCisgICAgICAgICAgICAgICAgICAgIHsgQzJDaHJvbWFPZmZzZXRTdHJ1Y3Q6OklUVV9ZVVZfNDIwXzAoKSB9LAorICAgICAgICAgICAgICAgICAgICAwdSwgOHUgLyogYml0RGVwdGggKi8sIEMyQ29sb3I6OllVVl80MjApOworICAgICAgICBoZWxwZXItPmFkZFN0cnVjdERlc2NyaXB0b3JzPEMyQ2hyb21hT2Zmc2V0U3RydWN0PigpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQ29sb3JJbmZvLCBDMl9QQVJBTUtFWV9DT0RFRF9DT0xPUl9JTkZPKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShkZWZhdWx0Q29sb3JJbmZvKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obURlZmF1bHRDb2xvckFzcGVjdHMsIEMyX1BBUkFNS0VZX0RFRkFVTFRfQ09MT1JfQVNQRUNUUykKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQ29sb3JBc3BlY3RzVHVuaW5nOjpvdXRwdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAwdSwgQzJDb2xvcjo6UkFOR0VfVU5TUEVDSUZJRUQsIEMyQ29sb3I6OlBSSU1BUklFU19VTlNQRUNJRklFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1EZWZhdWx0Q29sb3JBc3BlY3RzLCByYW5nZSkuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6UkFOR0VfVU5TUEVDSUZJRUQsIEMyQ29sb3I6OlJBTkdFX09USEVSKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1EZWZhdWx0Q29sb3JBc3BlY3RzLCBwcmltYXJpZXMpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlBSSU1BUklFU19VTlNQRUNJRklFRCwgQzJDb2xvcjo6UFJJTUFSSUVTX09USEVSKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1EZWZhdWx0Q29sb3JBc3BlY3RzLCB0cmFuc2ZlcikuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6VFJBTlNGRVJfVU5TUEVDSUZJRUQsIEMyQ29sb3I6OlRSQU5TRkVSX09USEVSKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1EZWZhdWx0Q29sb3JBc3BlY3RzLCBtYXRyaXgpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6Ok1BVFJJWF9VTlNQRUNJRklFRCwgQzJDb2xvcjo6TUFUUklYX09USEVSKQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoRGVmYXVsdENvbG9yQXNwZWN0c1NldHRlcikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1Db2RlZENvbG9yQXNwZWN0cywgQzJfUEFSQU1LRVlfVlVJX0NPTE9SX0FTUEVDVFMpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86OmlucHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgMHUsIEMyQ29sb3I6OlJBTkdFX0xJTUlURUQsIEMyQ29sb3I6OlBSSU1BUklFU19VTlNQRUNJRklFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Db2RlZENvbG9yQXNwZWN0cywgcmFuZ2UpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlJBTkdFX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpSQU5HRV9PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtQ29kZWRDb2xvckFzcGVjdHMsIHByaW1hcmllcykuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6UFJJTUFSSUVTX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpQUklNQVJJRVNfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobUNvZGVkQ29sb3JBc3BlY3RzLCB0cmFuc2ZlcikuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6VFJBTlNGRVJfVU5TUEVDSUZJRUQsIEMyQ29sb3I6OlRSQU5TRkVSX09USEVSKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Db2RlZENvbG9yQXNwZWN0cywgbWF0cml4KS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQsIEMyQ29sb3I6Ok1BVFJJWF9PVEhFUikKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKENvZGVkQ29sb3JBc3BlY3RzU2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUNvbG9yQXNwZWN0cywgQzJfUEFSQU1LRVlfQ09MT1JfQVNQRUNUUykKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6b3V0cHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgMHUsIEMyQ29sb3I6OlJBTkdFX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpQUklNQVJJRVNfVU5TUEVDSUZJRUQsCisgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpUUkFOU0ZFUl9VTlNQRUNJRklFRCwgQzJDb2xvcjo6TUFUUklYX1VOU1BFQ0lGSUVEKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtQ29sb3JBc3BlY3RzLCByYW5nZSkuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6UkFOR0VfVU5TUEVDSUZJRUQsIEMyQ29sb3I6OlJBTkdFX09USEVSKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Db2xvckFzcGVjdHMsIHByaW1hcmllcykuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6UFJJTUFSSUVTX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpQUklNQVJJRVNfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobUNvbG9yQXNwZWN0cywgdHJhbnNmZXIpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpUUkFOU0ZFUl9PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtQ29sb3JBc3BlY3RzLCBtYXRyaXgpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6Ok1BVFJJWF9VTlNQRUNJRklFRCwgQzJDb2xvcjo6TUFUUklYX09USEVSKQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoQ29sb3JBc3BlY3RzU2V0dGVyLCBtRGVmYXVsdENvbG9yQXNwZWN0cywgbUNvZGVkQ29sb3JBc3BlY3RzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICAvLyBUT0RPOiBzdXBwb3J0IG1vcmUgZm9ybWF0cz8KKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1QaXhlbEZvcm1hdCwgQzJfUEFSQU1LRVlfUElYRUxfRk9STUFUKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1QaXhlbEZvcm1hdEluZm86Om91dHB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwdSwgSEFMX1BJWEVMX0ZPUk1BVF9ZQ0JDUl80MjBfODg4KSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBTaXplU2V0dGVyKGJvb2wgbWF5QmxvY2ssIGNvbnN0IEMyUDxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0PiAmb2xkTWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEMyUDxDMlZpZGVvU2l6ZVN0cmVhbUluZm86Om91dHB1dD4gJm1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICBDMlIgcmVzID0gQzJSOjpPaygpOworICAgICAgICBpZiAoIW1lLkYobWUudi53aWR0aCkuc3VwcG9ydHNBdEFsbChtZS52LndpZHRoKSkgeworICAgICAgICAgICAgcmVzID0gcmVzLnBsdXMoQzJTZXR0aW5nUmVzdWx0QnVpbGRlcjo6QmFkVmFsdWUobWUuRihtZS52LndpZHRoKSkpOworICAgICAgICAgICAgbWUuc2V0KCkud2lkdGggPSBvbGRNZS52LndpZHRoOworICAgICAgICB9CisgICAgICAgIGlmICghbWUuRihtZS52LmhlaWdodCkuc3VwcG9ydHNBdEFsbChtZS52LmhlaWdodCkpIHsKKyAgICAgICAgICAgIHJlcyA9IHJlcy5wbHVzKEMyU2V0dGluZ1Jlc3VsdEJ1aWxkZXI6OkJhZFZhbHVlKG1lLkYobWUudi5oZWlnaHQpKSk7CisgICAgICAgICAgICBtZS5zZXQoKS5oZWlnaHQgPSBvbGRNZS52LmhlaWdodDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgTWF4UGljdHVyZVNpemVTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtTWF4UGljdHVyZVNpemVUdW5pbmc6Om91dHB1dD4gJm1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJQPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQ+ICZzaXplKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAvLyBUT0RPOiBnZXQgbWF4IHdpZHRoL2hlaWdodCBmcm9tIHRoZSBzaXplJ3MgZmllbGQgaGVscGVycyB2cy4gaGFyZGNvZGluZworICAgICAgICBtZS5zZXQoKS53aWR0aCA9IGMyX21pbihjMl9tYXgobWUudi53aWR0aCwgc2l6ZS52LndpZHRoKSwgMTkyMHUpOworICAgICAgICBtZS5zZXQoKS5oZWlnaHQgPSBjMl9taW4oYzJfbWF4KG1lLnYuaGVpZ2h0LCBzaXplLnYuaGVpZ2h0KSwgMTA4OHUpOworICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgTWF4SW5wdXRTaXplU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dD4gJm1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyUDxDMlN0cmVhbU1heFBpY3R1cmVTaXplVHVuaW5nOjpvdXRwdXQ+ICZtYXhTaXplKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAvLyBhc3N1bWUgY29tcHJlc3Npb24gcmF0aW8gb2YgMQorICAgICAgICBtZS5zZXQoKS52YWx1ZSA9ICgoKG1heFNpemUudi53aWR0aCArIDE1KSAvIDE2KSAqICgobWF4U2l6ZS52LmhlaWdodCArIDE1KSAvIDE2KSAqIDM4NCk7CisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBQcm9maWxlTGV2ZWxTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6aW5wdXQ+ICZtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dD4gJnNpemUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgICh2b2lkKXNpemU7CisgICAgICAgICh2b2lkKW1lOyAgLy8gVE9ETzogdmFsaWRhdGUKKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIERlZmF1bHRDb2xvckFzcGVjdHNTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtQ29sb3JBc3BlY3RzVHVuaW5nOjpvdXRwdXQ+ICZtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgaWYgKG1lLnYucmFuZ2UgPiBDMkNvbG9yOjpSQU5HRV9PVEhFUikgeworICAgICAgICAgICAgICAgIG1lLnNldCgpLnJhbmdlID0gQzJDb2xvcjo6UkFOR0VfT1RIRVI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1lLnYucHJpbWFyaWVzID4gQzJDb2xvcjo6UFJJTUFSSUVTX09USEVSKSB7CisgICAgICAgICAgICAgICAgbWUuc2V0KCkucHJpbWFyaWVzID0gQzJDb2xvcjo6UFJJTUFSSUVTX09USEVSOworICAgICAgICB9CisgICAgICAgIGlmIChtZS52LnRyYW5zZmVyID4gQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVIpIHsKKyAgICAgICAgICAgICAgICBtZS5zZXQoKS50cmFuc2ZlciA9IEMyQ29sb3I6OlRSQU5TRkVSX09USEVSOworICAgICAgICB9CisgICAgICAgIGlmIChtZS52Lm1hdHJpeCA+IEMyQ29sb3I6Ok1BVFJJWF9PVEhFUikgeworICAgICAgICAgICAgICAgIG1lLnNldCgpLm1hdHJpeCA9IEMyQ29sb3I6Ok1BVFJJWF9PVEhFUjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgQ29kZWRDb2xvckFzcGVjdHNTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6aW5wdXQ+ICZtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgaWYgKG1lLnYucmFuZ2UgPiBDMkNvbG9yOjpSQU5HRV9PVEhFUikgeworICAgICAgICAgICAgICAgIG1lLnNldCgpLnJhbmdlID0gQzJDb2xvcjo6UkFOR0VfT1RIRVI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1lLnYucHJpbWFyaWVzID4gQzJDb2xvcjo6UFJJTUFSSUVTX09USEVSKSB7CisgICAgICAgICAgICAgICAgbWUuc2V0KCkucHJpbWFyaWVzID0gQzJDb2xvcjo6UFJJTUFSSUVTX09USEVSOworICAgICAgICB9CisgICAgICAgIGlmIChtZS52LnRyYW5zZmVyID4gQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVIpIHsKKyAgICAgICAgICAgICAgICBtZS5zZXQoKS50cmFuc2ZlciA9IEMyQ29sb3I6OlRSQU5TRkVSX09USEVSOworICAgICAgICB9CisgICAgICAgIGlmIChtZS52Lm1hdHJpeCA+IEMyQ29sb3I6Ok1BVFJJWF9PVEhFUikgeworICAgICAgICAgICAgICAgIG1lLnNldCgpLm1hdHJpeCA9IEMyQ29sb3I6Ok1BVFJJWF9PVEhFUjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgQ29sb3JBc3BlY3RzU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86Om91dHB1dD4gJm1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyUDxDMlN0cmVhbUNvbG9yQXNwZWN0c1R1bmluZzo6b3V0cHV0PiAmZGVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyUDxDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86OmlucHV0PiAmY29kZWQpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIC8vIHRha2UgZGVmYXVsdCB2YWx1ZXMgZm9yIGFsbCB1bnNwZWNpZmllZCBmaWVsZHMsIGFuZCBjb2RlZCB2YWx1ZXMgZm9yIHNwZWNpZmllZCBvbmVzCisgICAgICAgIG1lLnNldCgpLnJhbmdlID0gY29kZWQudi5yYW5nZSA9PSBSQU5HRV9VTlNQRUNJRklFRCA/IGRlZi52LnJhbmdlIDogY29kZWQudi5yYW5nZTsKKyAgICAgICAgbWUuc2V0KCkucHJpbWFyaWVzID0gY29kZWQudi5wcmltYXJpZXMgPT0gUFJJTUFSSUVTX1VOU1BFQ0lGSUVECisgICAgICAgICAgICAgICAgPyBkZWYudi5wcmltYXJpZXMgOiBjb2RlZC52LnByaW1hcmllczsKKyAgICAgICAgbWUuc2V0KCkudHJhbnNmZXIgPSBjb2RlZC52LnRyYW5zZmVyID09IFRSQU5TRkVSX1VOU1BFQ0lGSUVECisgICAgICAgICAgICAgICAgPyBkZWYudi50cmFuc2ZlciA6IGNvZGVkLnYudHJhbnNmZXI7CisgICAgICAgIG1lLnNldCgpLm1hdHJpeCA9IGNvZGVkLnYubWF0cml4ID09IE1BVFJJWF9VTlNQRUNJRklFRCA/IGRlZi52Lm1hdHJpeCA6IGNvZGVkLnYubWF0cml4OworICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86Om91dHB1dD4gZ2V0Q29sb3JBc3BlY3RzX2woKSB7CisgICAgICAgIHJldHVybiBtQ29sb3JBc3BlY3RzOworICAgIH0KKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjppbnB1dD4gbVByb2ZpbGVMZXZlbDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dD4gbVNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtTWF4UGljdHVyZVNpemVUdW5pbmc6Om91dHB1dD4gbU1heFNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0PiBtTWF4SW5wdXRTaXplOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9ySW5mbzo6b3V0cHV0PiBtQ29sb3JJbmZvOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86OmlucHV0PiBtQ29kZWRDb2xvckFzcGVjdHM7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JBc3BlY3RzVHVuaW5nOjpvdXRwdXQ+IG1EZWZhdWx0Q29sb3JBc3BlY3RzOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86Om91dHB1dD4gbUNvbG9yQXNwZWN0czsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1QaXhlbEZvcm1hdEluZm86Om91dHB1dD4gbVBpeGVsRm9ybWF0OworfTsKKworc3RhdGljIHNpemVfdCBnZXRDcHVDb3JlQ291bnQoKSB7CisgICAgbG9uZyBjcHVDb3JlQ291bnQgPSAxOworI2lmIGRlZmluZWQoX1NDX05QUk9DRVNTT1JTX09OTE4pCisgICAgY3B1Q29yZUNvdW50ID0gc3lzY29uZihfU0NfTlBST0NFU1NPUlNfT05MTik7CisjZWxzZQorICAgIC8vIF9TQ19OUFJPQ19PTkxOIG11c3QgYmUgZGVmaW5lZC4uLgorICAgIGNwdUNvcmVDb3VudCA9IHN5c2NvbmYoX1NDX05QUk9DX09OTE4pOworI2VuZGlmCisgICAgQ0hFQ0soY3B1Q29yZUNvdW50ID49IDEpOworICAgIEFMT0dWKCJOdW1iZXIgb2YgQ1BVIGNvcmVzOiAlbGQiLCBjcHVDb3JlQ291bnQpOworICAgIHJldHVybiAoc2l6ZV90KWNwdUNvcmVDb3VudDsKK30KKworc3RhdGljIHZvaWQgKml2ZF9hbGlnbmVkX21hbGxvYyhXT1JEMzIgYWxpZ25tZW50LCBXT1JEMzIgc2l6ZSkgeworICAgIHJldHVybiBtZW1hbGlnbihhbGlnbm1lbnQsIHNpemUpOworfQorCitzdGF0aWMgdm9pZCBpdmRfYWxpZ25lZF9mcmVlKHZvaWQgKm1lbSkgeworICAgIGZyZWUobWVtKTsKK30KKworQzJTb2Z0TXBlZzJEZWM6OkMyU29mdE1wZWcyRGVjKAorICAgICAgICBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gJmludGZJbXBsKQorICAgIDogU2ltcGxlQzJDb21wb25lbnQoc3RkOjptYWtlX3NoYXJlZDxTaW1wbGVJbnRlcmZhY2U8SW50ZkltcGw+PihuYW1lLCBpZCwgaW50ZkltcGwpKSwKKyAgICAgICAgbUludGYoaW50ZkltcGwpLAorICAgICAgICBtRGVjSGFuZGxlKG51bGxwdHIpLAorICAgICAgICBtTWVtUmVjb3JkcyhudWxscHRyKSwKKyAgICAgICAgbU91dEJ1ZmZlckRyYWluKG51bGxwdHIpLAorICAgICAgICBtSXZDb2xvcmZvcm1hdChJVl9ZVVZfNDIwUCksCisgICAgICAgIG1XaWR0aCgzMjApLAorICAgICAgICBtSGVpZ2h0KDI0MCkgeworICAgIC8vIElmIGlucHV0IGR1bXAgaXMgZW5hYmxlZCwgdGhlbiBvcGVuIGNyZWF0ZSBhbiBlbXB0eSBmaWxlCisgICAgR0VORVJBVEVfRklMRV9OQU1FUygpOworICAgIENSRUFURV9EVU1QX0ZJTEUobUluRmlsZSk7Cit9CisKK0MyU29mdE1wZWcyRGVjOjp+QzJTb2Z0TXBlZzJEZWMoKSB7CisgICAgb25SZWxlYXNlKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdE1wZWcyRGVjOjpvbkluaXQoKSB7CisgICAgc3RhdHVzX3QgZXJyID0gaW5pdERlY29kZXIoKTsKKyAgICByZXR1cm4gZXJyID09IE9LID8gQzJfT0sgOiBDMl9DT1JSVVBURUQ7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdE1wZWcyRGVjOjpvblN0b3AoKSB7CisgICAgaWYgKE9LICE9IHJlc2V0RGVjb2RlcigpKSByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIHJlc2V0UGx1Z2luKCk7CisgICAgcmV0dXJuIEMyX09LOworfQorCit2b2lkIEMyU29mdE1wZWcyRGVjOjpvblJlc2V0KCkgeworICAgICh2b2lkKSBvblN0b3AoKTsKK30KKwordm9pZCBDMlNvZnRNcGVnMkRlYzo6b25SZWxlYXNlKCkgeworICAgICh2b2lkKSBkZWxldGVEZWNvZGVyKCk7CisgICAgaWYgKG1PdXRCdWZmZXJEcmFpbikgeworICAgICAgICBpdmRfYWxpZ25lZF9mcmVlKG1PdXRCdWZmZXJEcmFpbik7CisgICAgICAgIG1PdXRCdWZmZXJEcmFpbiA9IG51bGxwdHI7CisgICAgfQorICAgIGlmIChtT3V0QmxvY2spIHsKKyAgICAgICAgbU91dEJsb2NrLnJlc2V0KCk7CisgICAgfQorICAgIGlmIChtTWVtUmVjb3JkcykgeworICAgICAgICBpdmRfYWxpZ25lZF9mcmVlKG1NZW1SZWNvcmRzKTsKKyAgICAgICAgbU1lbVJlY29yZHMgPSBudWxscHRyOworICAgIH0KK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0TXBlZzJEZWM6Om9uRmx1c2hfc20oKSB7CisgICAgaWYgKE9LICE9IHNldEZsdXNoTW9kZSgpKSByZXR1cm4gQzJfQ09SUlVQVEVEOworCisgICAgdWludDMyX3QgZGlzcGxheVN0cmlkZSA9IG1TdHJpZGU7CisgICAgdWludDMyX3QgZGlzcGxheUhlaWdodCA9IG1IZWlnaHQ7CisgICAgdWludDMyX3QgYnVmZmVyU2l6ZSA9IGRpc3BsYXlTdHJpZGUgKiBkaXNwbGF5SGVpZ2h0ICogMyAvIDI7CisgICAgbU91dEJ1ZmZlckRyYWluID0gKHVpbnQ4X3QgKilpdmRfYWxpZ25lZF9tYWxsb2MoMTI4LCBidWZmZXJTaXplKTsKKyAgICBpZiAoIW1PdXRCdWZmZXJEcmFpbikgeworICAgICAgICBBTE9HRSgiY291bGQgbm90IGFsbG9jYXRlIHRtcCBvdXRwdXQgYnVmZmVyIChmb3IgZmx1c2gpIG9mIHNpemUgJXUgIiwgYnVmZmVyU2l6ZSk7CisgICAgICAgIHJldHVybiBDMl9OT19NRU1PUlk7CisgICAgfQorCisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9pcF90IHNfZGVjb2RlX2lwOworICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX29wX3Qgc19kZWNvZGVfb3A7CisKKyAgICAgICAgc2V0RGVjb2RlQXJncygmc19kZWNvZGVfaXAsICZzX2RlY29kZV9vcCwgbnVsbHB0ciwgbnVsbHB0ciwgMCwgMCwgMCk7CisgICAgICAgICh2b2lkKSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwgJnNfZGVjb2RlX2lwLCAmc19kZWNvZGVfb3ApOworICAgICAgICBpZiAoMCA9PSBzX2RlY29kZV9vcC51NF9vdXRwdXRfcHJlc2VudCkgeworICAgICAgICAgICAgcmVzZXRQbHVnaW4oKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1PdXRCdWZmZXJEcmFpbikgeworICAgICAgICBpdmRfYWxpZ25lZF9mcmVlKG1PdXRCdWZmZXJEcmFpbik7CisgICAgICAgIG1PdXRCdWZmZXJEcmFpbiA9IG51bGxwdHI7CisgICAgfQorCisgICAgcmV0dXJuIEMyX09LOworfQorCitzdGF0dXNfdCBDMlNvZnRNcGVnMkRlYzo6Z2V0TnVtTWVtUmVjb3JkcygpIHsKKyAgICBpdl9udW1fbWVtX3JlY19pcF90IHNfbnVtX21lbV9yZWNfaXA7CisgICAgaXZfbnVtX21lbV9yZWNfb3BfdCBzX251bV9tZW1fcmVjX29wOworCisgICAgc19udW1fbWVtX3JlY19pcC51NF9zaXplID0gc2l6ZW9mKHNfbnVtX21lbV9yZWNfaXApOworICAgIHNfbnVtX21lbV9yZWNfaXAuZV9jbWQgPSBJVl9DTURfR0VUX05VTV9NRU1fUkVDOworICAgIHNfbnVtX21lbV9yZWNfb3AudTRfc2l6ZSA9IHNpemVvZihzX251bV9tZW1fcmVjX29wKTsKKworICAgIElWX0FQSV9DQUxMX1NUQVRVU19UIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19udW1fbWVtX3JlY19pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfbnVtX21lbV9yZWNfb3ApOworICAgIGlmIChJVl9TVUNDRVNTICE9IHN0YXR1cykgeworICAgICAgICBBTE9HRSgiRXJyb3IgaW4gZ2V0dGluZyBtZW0gcmVjb3JkczogMHgleCIsIHNfbnVtX21lbV9yZWNfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKyAgICBtTnVtTWVtUmVjb3JkcyA9IHNfbnVtX21lbV9yZWNfb3AudTRfbnVtX21lbV9yZWM7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEMyU29mdE1wZWcyRGVjOjpmaWxsTWVtUmVjb3JkcygpIHsKKyAgICBpdl9tZW1fcmVjX3QgKnBzX21lbV9yZWMgPSAoaXZfbWVtX3JlY190ICopIGl2ZF9hbGlnbmVkX21hbGxvYygKKyAgICAgICAgICAgIDEyOCwgbU51bU1lbVJlY29yZHMgKiBzaXplb2YoaXZfbWVtX3JlY190KSk7CisgICAgaWYgKCFwc19tZW1fcmVjKSB7CisgICAgICAgIEFMT0dFKCJBbGxvY2F0aW9uIGZhaWx1cmUiKTsKKyAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICB9CisgICAgbWVtc2V0KHBzX21lbV9yZWMsIDAsIG1OdW1NZW1SZWNvcmRzICogc2l6ZW9mKGl2X21lbV9yZWNfdCkpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU51bU1lbVJlY29yZHM7IGkrKykKKyAgICAgICAgcHNfbWVtX3JlY1tpXS51NF9zaXplID0gc2l6ZW9mKGl2X21lbV9yZWNfdCk7CisgICAgbU1lbVJlY29yZHMgPSBwc19tZW1fcmVjOworCisgICAgaXZkZXh0X2ZpbGxfbWVtX3JlY19pcF90IHNfZmlsbF9tZW1faXA7CisgICAgaXZkZXh0X2ZpbGxfbWVtX3JlY19vcF90IHNfZmlsbF9tZW1fb3A7CisKKyAgICBzX2ZpbGxfbWVtX2lwLnNfaXZkX2ZpbGxfbWVtX3JlY19pcF90LnU0X3NpemUgPSBzaXplb2YoaXZkZXh0X2ZpbGxfbWVtX3JlY19pcF90KTsKKyAgICBzX2ZpbGxfbWVtX2lwLnU0X3NoYXJlX2Rpc3BfYnVmID0gMDsKKyAgICBzX2ZpbGxfbWVtX2lwLmVfb3V0cHV0X2Zvcm1hdCA9IG1JdkNvbG9yZm9ybWF0OworICAgIHNfZmlsbF9tZW1faXAudTRfZGVpbnRlcmxhY2UgPSAxOworICAgIHNfZmlsbF9tZW1faXAuc19pdmRfZmlsbF9tZW1fcmVjX2lwX3QuZV9jbWQgPSBJVl9DTURfRklMTF9OVU1fTUVNX1JFQzsKKyAgICBzX2ZpbGxfbWVtX2lwLnNfaXZkX2ZpbGxfbWVtX3JlY19pcF90LnB2X21lbV9yZWNfbG9jYXRpb24gPSBtTWVtUmVjb3JkczsKKyAgICBzX2ZpbGxfbWVtX2lwLnNfaXZkX2ZpbGxfbWVtX3JlY19pcF90LnU0X21heF9mcm1fd2QgPSBtV2lkdGg7CisgICAgc19maWxsX21lbV9pcC5zX2l2ZF9maWxsX21lbV9yZWNfaXBfdC51NF9tYXhfZnJtX2h0ID0gbUhlaWdodDsKKyAgICBzX2ZpbGxfbWVtX29wLnNfaXZkX2ZpbGxfbWVtX3JlY19vcF90LnU0X3NpemUgPSBzaXplb2YoaXZkZXh0X2ZpbGxfbWVtX3JlY19vcF90KTsKKyAgICBJVl9BUElfQ0FMTF9TVEFUVVNfVCBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfZmlsbF9tZW1faXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX2ZpbGxfbWVtX29wKTsKKyAgICBpZiAoSVZfU1VDQ0VTUyAhPSBzdGF0dXMpIHsKKyAgICAgICAgQUxPR0UoIkVycm9yIGluIGZpbGxpbmcgbWVtIHJlY29yZHM6IDB4JXgiLAorICAgICAgICAgICAgICBzX2ZpbGxfbWVtX29wLnNfaXZkX2ZpbGxfbWVtX3JlY19vcF90LnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICBDSEVDS19FUShtTnVtTWVtUmVjb3Jkcywgc19maWxsX21lbV9vcC5zX2l2ZF9maWxsX21lbV9yZWNfb3BfdC51NF9udW1fbWVtX3JlY19maWxsZWQpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU51bU1lbVJlY29yZHM7IGkrKywgcHNfbWVtX3JlYysrKSB7CisgICAgICAgIHBzX21lbV9yZWMtPnB2X2Jhc2UgPSBpdmRfYWxpZ25lZF9tYWxsb2MoCisgICAgICAgICAgICAgICAgcHNfbWVtX3JlYy0+dTRfbWVtX2FsaWdubWVudCwgcHNfbWVtX3JlYy0+dTRfbWVtX3NpemUpOworICAgICAgICBpZiAoIXBzX21lbV9yZWMtPnB2X2Jhc2UpIHsKKyAgICAgICAgICAgIEFMT0dFKCJBbGxvY2F0aW9uIGZhaWx1cmUgZm9yIG1lbW9yeSByZWNvcmQgIyV6dSBvZiBzaXplICV1IiwKKyAgICAgICAgICAgICAgICAgIGksIHBzX21lbV9yZWMtPnU0X21lbV9zaXplKTsKKyAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEMyU29mdE1wZWcyRGVjOjpjcmVhdGVEZWNvZGVyKCkgeworICAgIGl2ZGV4dF9pbml0X2lwX3Qgc19pbml0X2lwOworICAgIGl2ZGV4dF9pbml0X29wX3Qgc19pbml0X29wOworCisgICAgc19pbml0X2lwLnNfaXZkX2luaXRfaXBfdC51NF9zaXplID0gc2l6ZW9mKGl2ZGV4dF9pbml0X2lwX3QpOworICAgIHNfaW5pdF9pcC5zX2l2ZF9pbml0X2lwX3QuZV9jbWQgPSAoSVZEX0FQSV9DT01NQU5EX1RZUEVfVClJVl9DTURfSU5JVDsKKyAgICBzX2luaXRfaXAuc19pdmRfaW5pdF9pcF90LnB2X21lbV9yZWNfbG9jYXRpb24gPSBtTWVtUmVjb3JkczsKKyAgICBzX2luaXRfaXAuc19pdmRfaW5pdF9pcF90LnU0X2ZybV9tYXhfd2QgPSBtV2lkdGg7CisgICAgc19pbml0X2lwLnNfaXZkX2luaXRfaXBfdC51NF9mcm1fbWF4X2h0ID0gbUhlaWdodDsKKyAgICBzX2luaXRfaXAudTRfc2hhcmVfZGlzcF9idWYgPSAwOworICAgIHNfaW5pdF9pcC51NF9kZWludGVybGFjZSA9IDE7CisgICAgc19pbml0X2lwLnNfaXZkX2luaXRfaXBfdC51NF9udW1fbWVtX3JlYyA9IG1OdW1NZW1SZWNvcmRzOworICAgIHNfaW5pdF9pcC5zX2l2ZF9pbml0X2lwX3QuZV9vdXRwdXRfZm9ybWF0ID0gbUl2Q29sb3Jmb3JtYXQ7CisgICAgc19pbml0X29wLnNfaXZkX2luaXRfb3BfdC51NF9zaXplID0gc2l6ZW9mKGl2ZGV4dF9pbml0X29wX3QpOworCisgICAgbURlY0hhbmRsZSA9IChpdl9vYmpfdCAqKW1NZW1SZWNvcmRzWzBdLnB2X2Jhc2U7CisgICAgbURlY0hhbmRsZS0+cHZfZnhucyA9ICh2b2lkICopaXZkZWNfYXBpX2Z1bmN0aW9uOworICAgIG1EZWNIYW5kbGUtPnU0X3NpemUgPSBzaXplb2YoaXZfb2JqX3QpOworCisgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX2luaXRfaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX2luaXRfb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiZXJyb3IgaW4gJXM6IDB4JXgiLCBfX2Z1bmNfXywKKyAgICAgICAgICAgICAgc19pbml0X29wLnNfaXZkX2luaXRfb3BfdC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDMlNvZnRNcGVnMkRlYzo6c2V0TnVtQ29yZXMoKSB7CisgICAgaXZkZXh0X2N0bF9zZXRfbnVtX2NvcmVzX2lwX3Qgc19zZXRfbnVtX2NvcmVzX2lwOworICAgIGl2ZGV4dF9jdGxfc2V0X251bV9jb3Jlc19vcF90IHNfc2V0X251bV9jb3Jlc19vcDsKKworICAgIHNfc2V0X251bV9jb3Jlc19pcC51NF9zaXplID0gc2l6ZW9mKGl2ZGV4dF9jdGxfc2V0X251bV9jb3Jlc19pcF90KTsKKyAgICBzX3NldF9udW1fY29yZXNfaXAuZV9jbWQgPSBJVkRfQ01EX1ZJREVPX0NUTDsKKyAgICBzX3NldF9udW1fY29yZXNfaXAuZV9zdWJfY21kID0gSVZERVhUX0NNRF9DVExfU0VUX05VTV9DT1JFUzsKKyAgICBzX3NldF9udW1fY29yZXNfaXAudTRfbnVtX2NvcmVzID0gbU51bUNvcmVzOworICAgIHNfc2V0X251bV9jb3Jlc19vcC51NF9zaXplID0gc2l6ZW9mKGl2ZGV4dF9jdGxfc2V0X251bV9jb3Jlc19vcF90KTsKKyAgICBJVl9BUElfQ0FMTF9TVEFUVVNfVCBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfc2V0X251bV9jb3Jlc19pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfc2V0X251bV9jb3Jlc19vcCk7CisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dEKCJlcnJvciBpbiAlczogMHgleCIsIF9fZnVuY19fLCBzX3NldF9udW1fY29yZXNfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQzJTb2Z0TXBlZzJEZWM6OnNldFBhcmFtcyhzaXplX3Qgc3RyaWRlKSB7CisgICAgaXZkX2N0bF9zZXRfY29uZmlnX2lwX3Qgc19zZXRfZHluX3BhcmFtc19pcDsKKyAgICBpdmRfY3RsX3NldF9jb25maWdfb3BfdCBzX3NldF9keW5fcGFyYW1zX29wOworCisgICAgc19zZXRfZHluX3BhcmFtc19pcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfc2V0X2NvbmZpZ19pcF90KTsKKyAgICBzX3NldF9keW5fcGFyYW1zX2lwLmVfY21kID0gSVZEX0NNRF9WSURFT19DVEw7CisgICAgc19zZXRfZHluX3BhcmFtc19pcC5lX3N1Yl9jbWQgPSBJVkRfQ01EX0NUTF9TRVRQQVJBTVM7CisgICAgc19zZXRfZHluX3BhcmFtc19pcC51NF9kaXNwX3dkID0gKFVXT1JEMzIpIHN0cmlkZTsKKyAgICBzX3NldF9keW5fcGFyYW1zX2lwLmVfZnJtX3NraXBfbW9kZSA9IElWRF9TS0lQX05PTkU7CisgICAgc19zZXRfZHluX3BhcmFtc19pcC5lX2ZybV9vdXRfbW9kZSA9IElWRF9ESVNQTEFZX0ZSQU1FX09VVDsKKyAgICBzX3NldF9keW5fcGFyYW1zX2lwLmVfdmlkX2RlY19tb2RlID0gSVZEX0RFQ09ERV9GUkFNRTsKKyAgICBzX3NldF9keW5fcGFyYW1zX29wLnU0X3NpemUgPSBzaXplb2YoaXZkX2N0bF9zZXRfY29uZmlnX29wX3QpOworICAgIElWX0FQSV9DQUxMX1NUQVRVU19UIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19zZXRfZHluX3BhcmFtc19pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfc2V0X2R5bl9wYXJhbXNfb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiZXJyb3IgaW4gJXM6IDB4JXgiLCBfX2Z1bmNfXywgc19zZXRfZHluX3BhcmFtc19vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDMlNvZnRNcGVnMkRlYzo6Z2V0VmVyc2lvbigpIHsKKyAgICBpdmRfY3RsX2dldHZlcnNpb25pbmZvX2lwX3Qgc19nZXRfdmVyc2lvbmluZm9faXA7CisgICAgaXZkX2N0bF9nZXR2ZXJzaW9uaW5mb19vcF90IHNfZ2V0X3ZlcnNpb25pbmZvX29wOworICAgIFVXT1JEOCBhdTFfYnVmWzUxMl07CisKKyAgICBzX2dldF92ZXJzaW9uaW5mb19pcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfZ2V0dmVyc2lvbmluZm9faXBfdCk7CisgICAgc19nZXRfdmVyc2lvbmluZm9faXAuZV9jbWQgPSBJVkRfQ01EX1ZJREVPX0NUTDsKKyAgICBzX2dldF92ZXJzaW9uaW5mb19pcC5lX3N1Yl9jbWQgPSBJVkRfQ01EX0NUTF9HRVRWRVJTSU9OOworICAgIHNfZ2V0X3ZlcnNpb25pbmZvX2lwLnB2X3ZlcnNpb25fYnVmZmVyID0gYXUxX2J1ZjsKKyAgICBzX2dldF92ZXJzaW9uaW5mb19pcC51NF92ZXJzaW9uX2J1ZmZlcl9zaXplID0gc2l6ZW9mKGF1MV9idWYpOworICAgIHNfZ2V0X3ZlcnNpb25pbmZvX29wLnU0X3NpemUgPSBzaXplb2YoaXZkX2N0bF9nZXR2ZXJzaW9uaW5mb19vcF90KTsKKyAgICBJVl9BUElfQ0FMTF9TVEFUVVNfVCBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfZ2V0X3ZlcnNpb25pbmZvX2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19nZXRfdmVyc2lvbmluZm9fb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRCgiZXJyb3IgaW4gJXM6IDB4JXgiLCBfX2Z1bmNfXywKKyAgICAgICAgICAgICAgc19nZXRfdmVyc2lvbmluZm9fb3AudTRfZXJyb3JfY29kZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1YoIml0dGlhbSBkZWNvZGVyIHZlcnNpb24gbnVtYmVyOiAlcyIsCisgICAgICAgICAgICAgIChjaGFyICopIHNfZ2V0X3ZlcnNpb25pbmZvX2lwLnB2X3ZlcnNpb25fYnVmZmVyKTsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEMyU29mdE1wZWcyRGVjOjppbml0RGVjb2RlcigpIHsKKyAgICBzdGF0dXNfdCByZXQgPSBnZXROdW1NZW1SZWNvcmRzKCk7CisgICAgaWYgKE9LICE9IHJldCkgcmV0dXJuIHJldDsKKworICAgIHJldCA9IGZpbGxNZW1SZWNvcmRzKCk7CisgICAgaWYgKE9LICE9IHJldCkgcmV0dXJuIHJldDsKKworICAgIGlmIChPSyAhPSBjcmVhdGVEZWNvZGVyKCkpIHJldHVybiBVTktOT1dOX0VSUk9SOworCisgICAgbU51bUNvcmVzID0gTUlOKGdldENwdUNvcmVDb3VudCgpLCBNQVhfTlVNX0NPUkVTKTsKKyAgICBtU3RyaWRlID0gQUxJR042NChtV2lkdGgpOworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIHJlc2V0UGx1Z2luKCk7CisgICAgKHZvaWQpIHNldE51bUNvcmVzKCk7CisgICAgaWYgKE9LICE9IHNldFBhcmFtcyhtU3RyaWRlKSkgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgKHZvaWQpIGdldFZlcnNpb24oKTsKKworICAgIHJldHVybiBPSzsKK30KKworYm9vbCBDMlNvZnRNcGVnMkRlYzo6c2V0RGVjb2RlQXJncyhpdmRfdmlkZW9fZGVjb2RlX2lwX3QgKnBzX2RlY29kZV9pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9vcF90ICpwc19kZWNvZGVfb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyUmVhZFZpZXcgKmluQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkdyYXBoaWNWaWV3ICpvdXRCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBpbk9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGluU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdHNNYXJrZXIpIHsKKyAgICB1aW50MzJfdCBkaXNwbGF5U3RyaWRlID0gbVN0cmlkZTsKKyAgICB1aW50MzJfdCBkaXNwbGF5SGVpZ2h0ID0gbUhlaWdodDsKKyAgICBzaXplX3QgbHVtYVNpemUgPSBkaXNwbGF5U3RyaWRlICogZGlzcGxheUhlaWdodDsKKyAgICBzaXplX3QgY2hyb21hU2l6ZSA9IGx1bWFTaXplID4+IDI7CisKKyAgICBwc19kZWNvZGVfaXAtPnU0X3NpemUgPSBzaXplb2YoaXZkX3ZpZGVvX2RlY29kZV9pcF90KTsKKyAgICBwc19kZWNvZGVfaXAtPmVfY21kID0gSVZEX0NNRF9WSURFT19ERUNPREU7CisgICAgaWYgKGluQnVmZmVyKSB7CisgICAgICAgIHBzX2RlY29kZV9pcC0+dTRfdHMgPSB0c01hcmtlcjsKKyAgICAgICAgcHNfZGVjb2RlX2lwLT5wdl9zdHJlYW1fYnVmZmVyID0gY29uc3RfY2FzdDx1aW50OF90ICo+KGluQnVmZmVyLT5kYXRhKCkgKyBpbk9mZnNldCk7CisgICAgICAgIHBzX2RlY29kZV9pcC0+dTRfbnVtX0J5dGVzID0gaW5TaXplOworICAgIH0gZWxzZSB7CisgICAgICAgIHBzX2RlY29kZV9pcC0+dTRfdHMgPSAwOworICAgICAgICBwc19kZWNvZGVfaXAtPnB2X3N0cmVhbV9idWZmZXIgPSBudWxscHRyOworICAgICAgICBwc19kZWNvZGVfaXAtPnU0X251bV9CeXRlcyA9IDA7CisgICAgfQorICAgIHBzX2RlY29kZV9pcC0+c19vdXRfYnVmZmVyLnU0X21pbl9vdXRfYnVmX3NpemVbMF0gPSBsdW1hU2l6ZTsKKyAgICBwc19kZWNvZGVfaXAtPnNfb3V0X2J1ZmZlci51NF9taW5fb3V0X2J1Zl9zaXplWzFdID0gY2hyb21hU2l6ZTsKKyAgICBwc19kZWNvZGVfaXAtPnNfb3V0X2J1ZmZlci51NF9taW5fb3V0X2J1Zl9zaXplWzJdID0gY2hyb21hU2l6ZTsKKyAgICBpZiAob3V0QnVmZmVyKSB7CisgICAgICAgIGlmIChvdXRCdWZmZXItPndpZHRoKCkgPCBkaXNwbGF5U3RyaWRlIHx8IG91dEJ1ZmZlci0+aGVpZ2h0KCkgPCBkaXNwbGF5SGVpZ2h0KSB7CisgICAgICAgICAgICBBTE9HRSgiT3V0cHV0IGJ1ZmZlciB0b28gc21hbGw6IHByb3ZpZGVkICglZHglZCkgcmVxdWlyZWQgKCV1eCV1KSIsCisgICAgICAgICAgICAgICAgICBvdXRCdWZmZXItPndpZHRoKCksIG91dEJ1ZmZlci0+aGVpZ2h0KCksIGRpc3BsYXlTdHJpZGUsIGRpc3BsYXlIZWlnaHQpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHBzX2RlY29kZV9pcC0+c19vdXRfYnVmZmVyLnB1MV9idWZzWzBdID0gb3V0QnVmZmVyLT5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldOworICAgICAgICBwc19kZWNvZGVfaXAtPnNfb3V0X2J1ZmZlci5wdTFfYnVmc1sxXSA9IG91dEJ1ZmZlci0+ZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXTsKKyAgICAgICAgcHNfZGVjb2RlX2lwLT5zX291dF9idWZmZXIucHUxX2J1ZnNbMl0gPSBvdXRCdWZmZXItPmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfVl07CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHNfZGVjb2RlX2lwLT5zX291dF9idWZmZXIucHUxX2J1ZnNbMF0gPSBtT3V0QnVmZmVyRHJhaW47CisgICAgICAgIHBzX2RlY29kZV9pcC0+c19vdXRfYnVmZmVyLnB1MV9idWZzWzFdID0gbU91dEJ1ZmZlckRyYWluICsgbHVtYVNpemU7CisgICAgICAgIHBzX2RlY29kZV9pcC0+c19vdXRfYnVmZmVyLnB1MV9idWZzWzJdID0gbU91dEJ1ZmZlckRyYWluICsgbHVtYVNpemUgKyBjaHJvbWFTaXplOworICAgIH0KKyAgICBwc19kZWNvZGVfaXAtPnNfb3V0X2J1ZmZlci51NF9udW1fYnVmcyA9IDM7CisgICAgcHNfZGVjb2RlX29wLT51NF9zaXplID0gc2l6ZW9mKGl2ZF92aWRlb19kZWNvZGVfb3BfdCk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworCitib29sIEMyU29mdE1wZWcyRGVjOjpnZXRTZXFJbmZvKCkgeworICAgIGl2ZGV4dF9jdGxfZ2V0X3NlcV9pbmZvX2lwX3Qgc19jdGxfZ2V0X3NlcV9pbmZvX2lwOworICAgIGl2ZGV4dF9jdGxfZ2V0X3NlcV9pbmZvX29wX3Qgc19jdGxfZ2V0X3NlcV9pbmZvX29wOworCisgICAgc19jdGxfZ2V0X3NlcV9pbmZvX2lwLnU0X3NpemUgPSBzaXplb2YoaXZkZXh0X2N0bF9nZXRfc2VxX2luZm9faXBfdCk7CisgICAgc19jdGxfZ2V0X3NlcV9pbmZvX2lwLmVfY21kID0gSVZEX0NNRF9WSURFT19DVEw7CisgICAgc19jdGxfZ2V0X3NlcV9pbmZvX2lwLmVfc3ViX2NtZCA9CisgICAgICAgIChJVkRfQ09OVFJPTF9BUElfQ09NTUFORF9UWVBFX1QpSU1QRUcyRF9DTURfQ1RMX0dFVF9TRVFfSU5GTzsKKyAgICBzX2N0bF9nZXRfc2VxX2luZm9fb3AudTRfc2l6ZSA9IHNpemVvZihpdmRleHRfY3RsX2dldF9zZXFfaW5mb19vcF90KTsKKyAgICBJVl9BUElfQ0FMTF9TVEFUVVNfVCBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfY3RsX2dldF9zZXFfaW5mb19pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfY3RsX2dldF9zZXFfaW5mb19vcCk7CisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dXKCJFcnJvciBpbiBnZXR0aW5nIFNlcXVlbmNlIGluZm86IDB4JXgiLCBzX2N0bF9nZXRfc2VxX2luZm9fb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBWdWlDb2xvckFzcGVjdHMgdnVpQ29sb3JBc3BlY3RzOworICAgIHZ1aUNvbG9yQXNwZWN0cy5wcmltYXJpZXMgPSBzX2N0bF9nZXRfc2VxX2luZm9fb3AudTFfY29sb3VyX3ByaW1hcmllczsKKyAgICB2dWlDb2xvckFzcGVjdHMudHJhbnNmZXIgPSBzX2N0bF9nZXRfc2VxX2luZm9fb3AudTFfdHJhbnNmZXJfY2hhcmFjdGVyaXN0aWNzOworICAgIHZ1aUNvbG9yQXNwZWN0cy5jb2VmZnMgPSBzX2N0bF9nZXRfc2VxX2luZm9fb3AudTFfbWF0cml4X2NvZWZmaWNpZW50czsKKyAgICB2dWlDb2xvckFzcGVjdHMuZnVsbFJhbmdlID0gIGZhbHNlOyAgLy8gbXBlZzIgdmlkZW8gaGFzIGxpbWl0ZWQgcmFuZ2UuCisKKyAgICAvLyBjb252ZXJ0IHZ1aSBhc3BlY3RzIHRvIEMyIHZhbHVlcyBpZiBjaGFuZ2VkCisgICAgaWYgKCEodnVpQ29sb3JBc3BlY3RzID09IG1CaXRzdHJlYW1Db2xvckFzcGVjdHMpKSB7CisgICAgICAgIG1CaXRzdHJlYW1Db2xvckFzcGVjdHMgPSB2dWlDb2xvckFzcGVjdHM7CisgICAgICAgIENvbG9yQXNwZWN0cyBzZkFzcGVjdHM7CisgICAgICAgIEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6aW5wdXQgY29kZWRBc3BlY3RzID0geyAwdSB9OworICAgICAgICBDb2xvclV0aWxzOjpjb252ZXJ0SXNvQ29sb3JBc3BlY3RzVG9Db2RlY0FzcGVjdHMoCisgICAgICAgICAgICAgICAgdnVpQ29sb3JBc3BlY3RzLnByaW1hcmllcywgdnVpQ29sb3JBc3BlY3RzLnRyYW5zZmVyLCB2dWlDb2xvckFzcGVjdHMuY29lZmZzLAorICAgICAgICAgICAgICAgIHZ1aUNvbG9yQXNwZWN0cy5mdWxsUmFuZ2UsIHNmQXNwZWN0cyk7CisgICAgICAgIGlmICghQzJNYXBwZXI6Om1hcChzZkFzcGVjdHMubVByaW1hcmllcywgJmNvZGVkQXNwZWN0cy5wcmltYXJpZXMpKSB7CisgICAgICAgICAgICBjb2RlZEFzcGVjdHMucHJpbWFyaWVzID0gQzJDb2xvcjo6UFJJTUFSSUVTX1VOU1BFQ0lGSUVEOworICAgICAgICB9CisgICAgICAgIGlmICghQzJNYXBwZXI6Om1hcChzZkFzcGVjdHMubVJhbmdlLCAmY29kZWRBc3BlY3RzLnJhbmdlKSkgeworICAgICAgICAgICAgY29kZWRBc3BlY3RzLnJhbmdlID0gQzJDb2xvcjo6UkFOR0VfVU5TUEVDSUZJRUQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFDMk1hcHBlcjo6bWFwKHNmQXNwZWN0cy5tTWF0cml4Q29lZmZzLCAmY29kZWRBc3BlY3RzLm1hdHJpeCkpIHsKKyAgICAgICAgICAgIGNvZGVkQXNwZWN0cy5tYXRyaXggPSBDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFDMk1hcHBlcjo6bWFwKHNmQXNwZWN0cy5tVHJhbnNmZXIsICZjb2RlZEFzcGVjdHMudHJhbnNmZXIpKSB7CisgICAgICAgICAgICBjb2RlZEFzcGVjdHMudHJhbnNmZXIgPSBDMkNvbG9yOjpUUkFOU0ZFUl9VTlNQRUNJRklFRDsKKyAgICAgICAgfQorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgICAgICh2b2lkKW1JbnRmLT5jb25maWcoeyZjb2RlZEFzcGVjdHN9LCBDMl9NQVlfQkxPQ0ssICZmYWlsdXJlcyk7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitzdGF0dXNfdCBDMlNvZnRNcGVnMkRlYzo6c2V0Rmx1c2hNb2RlKCkgeworICAgIGl2ZF9jdGxfZmx1c2hfaXBfdCBzX3NldF9mbHVzaF9pcDsKKyAgICBpdmRfY3RsX2ZsdXNoX29wX3Qgc19zZXRfZmx1c2hfb3A7CisKKyAgICBzX3NldF9mbHVzaF9pcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfZmx1c2hfaXBfdCk7CisgICAgc19zZXRfZmx1c2hfaXAuZV9jbWQgPSBJVkRfQ01EX1ZJREVPX0NUTDsKKyAgICBzX3NldF9mbHVzaF9pcC5lX3N1Yl9jbWQgPSBJVkRfQ01EX0NUTF9GTFVTSDsKKyAgICBzX3NldF9mbHVzaF9vcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfZmx1c2hfb3BfdCk7CisgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX3NldF9mbHVzaF9pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfc2V0X2ZsdXNoX29wKTsKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0UoImVycm9yIGluICVzOiAweCV4IiwgX19mdW5jX18sIHNfc2V0X2ZsdXNoX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEMyU29mdE1wZWcyRGVjOjpyZXNldERlY29kZXIoKSB7CisgICAgaXZkX2N0bF9yZXNldF9pcF90IHNfcmVzZXRfaXA7CisgICAgaXZkX2N0bF9yZXNldF9vcF90IHNfcmVzZXRfb3A7CisKKyAgICBzX3Jlc2V0X2lwLnU0X3NpemUgPSBzaXplb2YoaXZkX2N0bF9yZXNldF9pcF90KTsKKyAgICBzX3Jlc2V0X2lwLmVfY21kID0gSVZEX0NNRF9WSURFT19DVEw7CisgICAgc19yZXNldF9pcC5lX3N1Yl9jbWQgPSBJVkRfQ01EX0NUTF9SRVNFVDsKKyAgICBzX3Jlc2V0X29wLnU0X3NpemUgPSBzaXplb2YoaXZkX2N0bF9yZXNldF9vcF90KTsKKyAgICBJVl9BUElfQ0FMTF9TVEFUVVNfVCBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfcmVzZXRfaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX3Jlc2V0X29wKTsKKyAgICBpZiAoSVZfU1VDQ0VTUyAhPSBzdGF0dXMpIHsKKyAgICAgICAgQUxPR0UoImVycm9yIGluICVzOiAweCV4IiwgX19mdW5jX18sIHNfcmVzZXRfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKyAgICAodm9pZCkgc2V0TnVtQ29yZXMoKTsKKyAgICBtU3RyaWRlID0gMDsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKworICAgIHJldHVybiBPSzsKK30KKwordm9pZCBDMlNvZnRNcGVnMkRlYzo6cmVzZXRQbHVnaW4oKSB7CisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworICAgIGdldHRpbWVvZmRheSgmbVRpbWVTdGFydCwgbnVsbHB0cik7CisgICAgZ2V0dGltZW9mZGF5KCZtVGltZUVuZCwgbnVsbHB0cik7Cit9CisKK3N0YXR1c190IEMyU29mdE1wZWcyRGVjOjpkZWxldGVEZWNvZGVyKCkgeworICAgIGlmIChtTWVtUmVjb3JkcykgeworICAgICAgICBpdl9tZW1fcmVjX3QgKnBzX21lbV9yZWMgPSBtTWVtUmVjb3JkczsKKworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1OdW1NZW1SZWNvcmRzOyBpKyssIHBzX21lbV9yZWMrKykgeworICAgICAgICAgICAgaWYgKHBzX21lbV9yZWMtPnB2X2Jhc2UpIHsKKyAgICAgICAgICAgICAgICBpdmRfYWxpZ25lZF9mcmVlKHBzX21lbV9yZWMtPnB2X2Jhc2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGl2ZF9hbGlnbmVkX2ZyZWUobU1lbVJlY29yZHMpOworICAgICAgICBtTWVtUmVjb3JkcyA9IG51bGxwdHI7CisgICAgfQorICAgIG1EZWNIYW5kbGUgPSBudWxscHRyOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDMlNvZnRNcGVnMkRlYzo6cmVJbml0RGVjb2RlcigpIHsKKyAgICBkZWxldGVEZWNvZGVyKCk7CisKKyAgICBzdGF0dXNfdCByZXQgPSBpbml0RGVjb2RlcigpOworICAgIGlmIChPSyAhPSByZXQpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBpbml0aWFsaXplIGRlY29kZXIiKTsKKyAgICAgICAgZGVsZXRlRGVjb2RlcigpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgZmlsbEVtcHR5V29yayhjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykgeworICAgIHVpbnQzMl90IGZsYWdzID0gMDsKKyAgICBpZiAod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgIGZsYWdzIHw9IEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU07CisgICAgICAgIEFMT0dWKCJzaWduYWxsaW5nIGVvcyIpOworICAgIH0KKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpZmxhZ3M7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKK30KKwordm9pZCBDMlNvZnRNcGVnMkRlYzo6ZmluaXNoV29yayh1aW50NjRfdCBpbmRleCwgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGJ1ZmZlciA9IGNyZWF0ZUdyYXBoaWNCdWZmZXIoc3RkOjptb3ZlKG1PdXRCbG9jayksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyUmVjdChtV2lkdGgsIG1IZWlnaHQpKTsKKyAgICBtT3V0QmxvY2sgPSBudWxscHRyOworICAgIHsKKyAgICAgICAgSW50ZkltcGw6OkxvY2sgbG9jayA9IG1JbnRmLT5sb2NrKCk7CisgICAgICAgIGJ1ZmZlci0+c2V0SW5mbyhtSW50Zi0+Z2V0Q29sb3JBc3BlY3RzX2woKSk7CisgICAgfQorCisgICAgYXV0byBmaWxsV29yayA9IFtidWZmZXJdKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKSB7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdCkwOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5wdXNoX2JhY2soYnVmZmVyKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgIH07CisgICAgaWYgKHdvcmsgJiYgYzJfY250cjY0X3QoaW5kZXgpID09IHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleCkgeworICAgICAgICBmaWxsV29yayh3b3JrKTsKKyAgICB9IGVsc2UgeworICAgICAgICBmaW5pc2goaW5kZXgsIGZpbGxXb3JrKTsKKyAgICB9Cit9CisKK2MyX3N0YXR1c190IEMyU29mdE1wZWcyRGVjOjplbnN1cmVEZWNvZGVyU3RhdGUoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgIGlmICghbURlY0hhbmRsZSkgeworICAgICAgICBBTE9HRSgibm90IHN1cHBvc2VkIHRvIGJlIGhlcmUsIGludmFsaWQgZGVjb2RlciBjb250ZXh0Iik7CisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorICAgIGlmIChtU3RyaWRlICE9IEFMSUdONjQobVdpZHRoKSkgeworICAgICAgICBtU3RyaWRlID0gQUxJR042NChtV2lkdGgpOworICAgICAgICBpZiAoT0sgIT0gc2V0UGFyYW1zKG1TdHJpZGUpKSByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KKyAgICBpZiAobU91dEJsb2NrICYmCisgICAgICAgICAgICAobU91dEJsb2NrLT53aWR0aCgpICE9IG1TdHJpZGUgfHwgbU91dEJsb2NrLT5oZWlnaHQoKSAhPSBtSGVpZ2h0KSkgeworICAgICAgICBtT3V0QmxvY2sucmVzZXQoKTsKKyAgICB9CisgICAgaWYgKCFtT3V0QmxvY2spIHsKKyAgICAgICAgdWludDMyX3QgZm9ybWF0ID0gSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyOworICAgICAgICBDMk1lbW9yeVVzYWdlIHVzYWdlID0geyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH07CisgICAgICAgIGMyX3N0YXR1c190IGVyciA9IHBvb2wtPmZldGNoR3JhcGhpY0Jsb2NrKG1TdHJpZGUsIG1IZWlnaHQsIGZvcm1hdCwgdXNhZ2UsICZtT3V0QmxvY2spOworICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICBBTE9HRSgiZmV0Y2hHcmFwaGljQmxvY2sgZm9yIE91dHB1dCBmYWlsZWQgd2l0aCBzdGF0dXMgJWQiLCBlcnIpOworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigicHJvdmlkZWQgKCVkeCVkKSByZXF1aXJlZCAoJWR4JWQpIiwKKyAgICAgICAgICAgICAgbU91dEJsb2NrLT53aWR0aCgpLCBtT3V0QmxvY2stPmhlaWdodCgpLCBtU3RyaWRlLCBtSGVpZ2h0KTsKKyAgICB9CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKKy8vIFRPRE86IGNhbiBvdmVyYWxsIGVycm9yIGNoZWNraW5nIGJlIGltcHJvdmVkPworLy8gVE9ETzogYWxsb3cgY29uZmlndXJhdGlvbiBvZiBjb2xvciBmb3JtYXQgYW5kIHVzYWdlIGZvciBncmFwaGljIGJ1ZmZlcnMgaW5zdGVhZAorLy8gICAgICAgb2YgaGFyZCBjb2RpbmcgdGhlbSB0byBIQUxfUElYRUxfRk9STUFUX1lWMTIKKy8vIFRPRE86IHBhc3MgY29sb3Jhc3BlY3RzIGluZm9ybWF0aW9uIHRvIHN1cmZhY2UKKy8vIFRPRE86IHRlc3Qgc3VwcG9ydCBmb3IgZHluYW1pYyBjaGFuZ2UgaW4gcmVzb2x1dGlvbgorLy8gVE9ETzogdmVyaWZ5IGlmIHRoZSBkZWNvZGVyIHNlbnQgYmFjayBhbGwgZnJhbWVzCit2b2lkIEMyU29mdE1wZWcyRGVjOjpwcm9jZXNzKAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgIC8vIEluaXRpYWxpemUgb3V0cHV0IHdvcmsKKyAgICB3b3JrLT5yZXN1bHQgPSBDMl9PSzsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDB1OworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKworICAgIGlmIChtU2lnbmFsbGVkRXJyb3IgfHwgbVNpZ25hbGxlZE91dHB1dEVvcykgeworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9CQURfVkFMVUU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzaXplX3QgaW5PZmZzZXQgPSAwdTsKKyAgICBzaXplX3QgaW5TaXplID0gMHU7CisgICAgdWludDMyX3Qgd29ya0luZGV4ID0gd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCkgJiAweEZGRkZGRkZGOworICAgIEMyUmVhZFZpZXcgclZpZXcgPSBtRHVtbXlSZWFkVmlldzsKKyAgICBpZiAoIXdvcmstPmlucHV0LmJ1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICByVmlldyA9IHdvcmstPmlucHV0LmJ1ZmZlcnNbMF0tPmRhdGEoKS5saW5lYXJCbG9ja3MoKS5mcm9udCgpLm1hcCgpLmdldCgpOworICAgICAgICBpblNpemUgPSByVmlldy5jYXBhY2l0eSgpOworICAgICAgICBpZiAoaW5TaXplICYmIHJWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJyZWFkIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHJWaWV3LmVycm9yKCkpOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorICAgIGJvb2wgZW9zID0gKCh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pICE9IDApOworICAgIGJvb2wgaGFzUGljdHVyZSA9IGZhbHNlOworCisgICAgQUxPR1YoImluIGJ1ZmZlciBhdHRyLiBzaXplICV6dSB0aW1lc3RhbXAgJWQgZnJhbWVpbmRleCAlZCwgZmxhZ3MgJXgiLAorICAgICAgICAgIGluU2l6ZSwgKGludCl3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrdSgpLAorICAgICAgICAgIChpbnQpd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCksIHdvcmstPmlucHV0LmZsYWdzKTsKKyAgICBzaXplX3QgaW5Qb3MgPSAwOworICAgIHdoaWxlIChpblBvcyA8IGluU2l6ZSkgeworICAgICAgICBpZiAoQzJfT0sgIT0gZW5zdXJlRGVjb2RlclN0YXRlKHBvb2wpKSB7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBDMkdyYXBoaWNWaWV3IHdWaWV3ID0gbU91dEJsb2NrLT5tYXAoKS5nZXQoKTsKKyAgICAgICAgaWYgKHdWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJncmFwaGljIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHdWaWV3LmVycm9yKCkpOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9pcF90IHNfZGVjb2RlX2lwOworICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX29wX3Qgc19kZWNvZGVfb3A7CisgICAgICAgIGlmICghc2V0RGVjb2RlQXJncygmc19kZWNvZGVfaXAsICZzX2RlY29kZV9vcCwgJnJWaWV3LCAmd1ZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbk9mZnNldCArIGluUG9zLCBpblNpemUgLSBpblBvcywgd29ya0luZGV4KSkgeworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgLy8gSWYgaW5wdXQgZHVtcCBpcyBlbmFibGVkLCB0aGVuIHdyaXRlIHRvIGZpbGUKKyAgICAgICAgRFVNUF9UT19GSUxFKG1JbkZpbGUsIHNfZGVjb2RlX2lwLnB2X3N0cmVhbV9idWZmZXIsIHNfZGVjb2RlX2lwLnU0X251bV9CeXRlcyk7CisgICAgICAgIFdPUkQzMiBkZWxheTsKKyAgICAgICAgR0VUVElNRSgmbVRpbWVTdGFydCwgbnVsbHB0cik7CisgICAgICAgIFRJTUVfRElGRihtVGltZUVuZCwgbVRpbWVTdGFydCwgZGVsYXkpOworICAgICAgICAodm9pZCkgaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsICZzX2RlY29kZV9pcCwgJnNfZGVjb2RlX29wKTsKKyAgICAgICAgV09SRDMyIGRlY29kZVRpbWU7CisgICAgICAgIEdFVFRJTUUoJm1UaW1lRW5kLCBudWxscHRyKTsKKyAgICAgICAgVElNRV9ESUZGKG1UaW1lU3RhcnQsIG1UaW1lRW5kLCBkZWNvZGVUaW1lKTsKKyAgICAgICAgQUxPR1YoImRlY29kZVRpbWU9JTZkIGRlbGF5PSU2ZCBudW1CeXRlcz0lNmQgIiwgZGVjb2RlVGltZSwgZGVsYXksCisgICAgICAgICAgICAgIHNfZGVjb2RlX29wLnU0X251bV9ieXRlc19jb25zdW1lZCk7CisgICAgICAgIGlmIChJTVBFRzJEX1VOU1VQUE9SVEVEX0RJTUVOU0lPTlMgPT0gc19kZWNvZGVfb3AudTRfZXJyb3JfY29kZSkgeworICAgICAgICAgICAgQUxPR1YoInVuc3VwcG9ydGVkIHJlc29sdXRpb24gOiAlZHglZCIsIHNfZGVjb2RlX29wLnU0X3BpY193ZCwgc19kZWNvZGVfb3AudTRfcGljX2h0KTsKKyAgICAgICAgICAgIGRyYWluSW50ZXJuYWwoRFJBSU5fQ09NUE9ORU5UX05PX0VPUywgcG9vbCwgd29yayk7CisgICAgICAgICAgICByZXNldFBsdWdpbigpOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAwdTsKKyAgICAgICAgICAgIG1XaWR0aCA9IHNfZGVjb2RlX29wLnU0X3BpY193ZDsKKyAgICAgICAgICAgIG1IZWlnaHQgPSBzX2RlY29kZV9vcC51NF9waWNfaHQ7CisKKyAgICAgICAgICAgIEFMT0dJKCJDb25maWd1cmluZyBkZWNvZGVyOiBtV2lkdGggJWQgLCBtSGVpZ2h0ICVkICIsCisgICAgICAgICAgICAgICAgICAgbVdpZHRoLCBtSGVpZ2h0KTsKKyAgICAgICAgICAgIEMyVmlkZW9TaXplU3RyZWFtSW5mbzo6b3V0cHV0IHNpemUoMHUsIG1XaWR0aCwgbUhlaWdodCk7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPQorICAgICAgICAgICAgICAgIG1JbnRmLT5jb25maWcoeyZzaXplfSwgQzJfTUFZX0JMT0NLLCAmZmFpbHVyZXMpOworICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgICAgICBDMlBhcmFtOjpDb3B5KHNpemUpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkNhbm5vdCBzZXQgd2lkdGggYW5kIGhlaWdodCIpOworICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoT0sgIT0gcmVJbml0RGVjb2RlcigpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byByZWluaXRpYWxpemUgZGVjb2RlciIpOworICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0gZWxzZSBpZiAoSVZEX1JFU19DSEFOR0VEID09IChzX2RlY29kZV9vcC51NF9lcnJvcl9jb2RlICYgMHhGRikpIHsKKyAgICAgICAgICAgIEFMT0dWKCJyZXNvbHV0aW9uIGNoYW5nZWQiKTsKKyAgICAgICAgICAgIGRyYWluSW50ZXJuYWwoRFJBSU5fQ09NUE9ORU5UX05PX0VPUywgcG9vbCwgd29yayk7CisgICAgICAgICAgICByZXNldERlY29kZXIoKTsKKyAgICAgICAgICAgIHJlc2V0UGx1Z2luKCk7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDB1OworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKDAgPCBzX2RlY29kZV9vcC51NF9waWNfd2QgJiYgMCA8IHNfZGVjb2RlX29wLnU0X3BpY19odCkgeworICAgICAgICAgICAgaWYgKHNfZGVjb2RlX29wLnU0X3BpY193ZCAhPSBtV2lkdGggfHwgIHNfZGVjb2RlX29wLnU0X3BpY19odCAhPSBtSGVpZ2h0KSB7CisgICAgICAgICAgICAgICAgbVdpZHRoID0gc19kZWNvZGVfb3AudTRfcGljX3dkOworICAgICAgICAgICAgICAgIG1IZWlnaHQgPSBzX2RlY29kZV9vcC51NF9waWNfaHQ7CisgICAgICAgICAgICAgICAgQ0hFQ0tfRVEoMHUsIHNfZGVjb2RlX29wLnU0X291dHB1dF9wcmVzZW50KTsKKworICAgICAgICAgICAgICAgIEFMT0dJKCJDb25maWd1cmluZyBkZWNvZGVyIG91dDogbVdpZHRoICVkICwgbUhlaWdodCAlZCAiLAorICAgICAgICAgICAgICAgICAgICAgICBtV2lkdGgsIG1IZWlnaHQpOworICAgICAgICAgICAgICAgIEMyVmlkZW9TaXplU3RyZWFtSW5mbzo6b3V0cHV0IHNpemUoMHUsIG1XaWR0aCwgbUhlaWdodCk7CisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgICAgICAgICAgICAgIGMyX3N0YXR1c190IGVyciA9CisgICAgICAgICAgICAgICAgICAgIG1JbnRmLT5jb25maWcoeyZzaXplfSwgQzJfTUFZX0JMT0NLLCAmZmFpbHVyZXMpOworICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgICAgICAgICBDMlBhcmFtOjpDb3B5KHNpemUpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiQ2Fubm90IHNldCB3aWR0aCBhbmQgaGVpZ2h0Iik7CisgICAgICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgICh2b2lkKSBnZXRTZXFJbmZvKCk7CisgICAgICAgIGhhc1BpY3R1cmUgfD0gKDEgPT0gc19kZWNvZGVfb3AudTRfZnJhbWVfZGVjb2RlZF9mbGFnKTsKKyAgICAgICAgaWYgKHNfZGVjb2RlX29wLnU0X291dHB1dF9wcmVzZW50KSB7CisgICAgICAgICAgICBmaW5pc2hXb3JrKHNfZGVjb2RlX29wLnU0X3RzLCB3b3JrKTsKKyAgICAgICAgfQorCisgICAgICAgIGluUG9zICs9IHNfZGVjb2RlX29wLnU0X251bV9ieXRlc19jb25zdW1lZDsKKyAgICAgICAgaWYgKGhhc1BpY3R1cmUgJiYgKGluU2l6ZSAtIGluUG9zKSAhPSAwKSB7CisgICAgICAgICAgICBBTE9HRCgiZGVjb2RlZCBmcmFtZSBpbiBjdXJyZW50IGFjY2VzcyBuYWwsIGlnbm9yaW5nIGZ1cnRoZXIgdHJhaWxpbmcgYnl0ZXMgJWQiLAorICAgICAgICAgICAgICAgICAgKGludClpblNpemUgLSAoaW50KWluUG9zKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGVvcykgeworICAgICAgICBkcmFpbkludGVybmFsKERSQUlOX0NPTVBPTkVOVF9XSVRIX0VPUywgcG9vbCwgd29yayk7CisgICAgICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSB0cnVlOworICAgIH0gZWxzZSBpZiAoIWhhc1BpY3R1cmUpIHsKKyAgICAgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICB9Cit9CisKK2MyX3N0YXR1c190IEMyU29mdE1wZWcyRGVjOjpkcmFpbkludGVybmFsKAorICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wsCisgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKSB7CisgICAgaWYgKGRyYWluTW9kZSA9PSBOT19EUkFJTikgeworICAgICAgICBBTE9HVygiZHJhaW4gd2l0aCBOT19EUkFJTjogbm8tb3AiKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKyAgICBpZiAoZHJhaW5Nb2RlID09IERSQUlOX0NIQUlOKSB7CisgICAgICAgIEFMT0dXKCJEUkFJTl9DSEFJTiBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKworICAgIGlmIChPSyAhPSBzZXRGbHVzaE1vZGUoKSkgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBpZiAoQzJfT0sgIT0gZW5zdXJlRGVjb2RlclN0YXRlKHBvb2wpKSB7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgICAgIH0KKyAgICAgICAgQzJHcmFwaGljVmlldyB3VmlldyA9IG1PdXRCbG9jay0+bWFwKCkuZ2V0KCk7CisgICAgICAgIGlmICh3Vmlldy5lcnJvcigpKSB7CisgICAgICAgICAgICBBTE9HRSgiZ3JhcGhpYyB2aWV3IG1hcCBmYWlsZWQgJWQiLCB3Vmlldy5lcnJvcigpKTsKKyAgICAgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgICAgIH0KKyAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9pcF90IHNfZGVjb2RlX2lwOworICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX29wX3Qgc19kZWNvZGVfb3A7CisgICAgICAgIGlmICghc2V0RGVjb2RlQXJncygmc19kZWNvZGVfaXAsICZzX2RlY29kZV9vcCwgbnVsbHB0ciwgJndWaWV3LCAwLCAwLCAwKSkgeworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgICAgICB9CisgICAgICAgICh2b2lkKSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwgJnNfZGVjb2RlX2lwLCAmc19kZWNvZGVfb3ApOworICAgICAgICBpZiAoc19kZWNvZGVfb3AudTRfb3V0cHV0X3ByZXNlbnQpIHsKKyAgICAgICAgICAgIGZpbmlzaFdvcmsoc19kZWNvZGVfb3AudTRfdHMsIHdvcmspOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRNcGVnMkRlYzo6ZHJhaW4oCisgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgIHJldHVybiBkcmFpbkludGVybmFsKGRyYWluTW9kZSwgcG9vbCwgbnVsbHB0cik7Cit9CisKK2NsYXNzIEMyU29mdE1wZWcyRGVjRmFjdG9yeSA6IHB1YmxpYyBDMkNvbXBvbmVudEZhY3RvcnkgeworcHVibGljOgorICAgIEMyU29mdE1wZWcyRGVjRmFjdG9yeSgpIDogbUhlbHBlcihzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJSZWZsZWN0b3JIZWxwZXI+KAorICAgICAgICAgICAgR2V0Q29kZWMyUGxhdGZvcm1Db21wb25lbnRTdG9yZSgpLT5nZXRQYXJhbVJlZmxlY3RvcigpKSkgeworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlQ29tcG9uZW50KAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiogY29uc3QgY29tcG9uZW50LAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50Kik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmNvbXBvbmVudCA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4oCisgICAgICAgICAgICAgICAgbmV3IEMyU29mdE1wZWcyRGVjKENPTVBPTkVOVF9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRNcGVnMkRlYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiogY29uc3QgaW50ZXJmYWNlLAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50SW50ZXJmYWNlKik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmludGVyZmFjZSA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4oCisgICAgICAgICAgICAgICAgbmV3IFNpbXBsZUludGVyZmFjZTxDMlNvZnRNcGVnMkRlYzo6SW50ZkltcGw+KAorICAgICAgICAgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsIGlkLCBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdE1wZWcyRGVjOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCB+QzJTb2Z0TXBlZzJEZWNGYWN0b3J5KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gbUhlbHBlcjsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2V4dGVybiAiQyIgOjpDMkNvbXBvbmVudEZhY3RvcnkqIENyZWF0ZUNvZGVjMkZhY3RvcnkoKSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIHJldHVybiBuZXcgOjphbmRyb2lkOjpDMlNvZnRNcGVnMkRlY0ZhY3RvcnkoKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5KiBmYWN0b3J5KSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIGRlbGV0ZSBmYWN0b3J5OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzIvQzJTb2Z0TXBlZzJEZWMuaCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWcyL0MyU29mdE1wZWcyRGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk5OTg3MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWcyL0MyU29mdE1wZWcyRGVjLmgKQEAgLTAsMCArMSwxOTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQzJfU09GVF9NUEVHMl9ERUNfSF8KKyNkZWZpbmUgQU5EUk9JRF9DMl9TT0ZUX01QRUcyX0RFQ19IXworCisjaW5jbHVkZSA8U2ltcGxlQzJDb21wb25lbnQuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQ29sb3JVdGlscy5oPgorCisjaW5jbHVkZSAiaXZfZGF0YXR5cGVkZWYuaCIKKyNpbmNsdWRlICJpdi5oIgorI2luY2x1ZGUgIml2ZC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKyNkZWZpbmUgaXZkZWNfYXBpX2Z1bmN0aW9uICAgICAgICAgICAgICBpbXBlZzJkX2FwaV9mdW5jdGlvbgorI2RlZmluZSBpdmRleHRfaW5pdF9pcF90ICAgICAgICAgICAgICAgIGltcGVnMmRfaW5pdF9pcF90CisjZGVmaW5lIGl2ZGV4dF9pbml0X29wX3QgICAgICAgICAgICAgICAgaW1wZWcyZF9pbml0X29wX3QKKyNkZWZpbmUgaXZkZXh0X2ZpbGxfbWVtX3JlY19pcF90ICAgICAgICBpbXBlZzJkX2ZpbGxfbWVtX3JlY19pcF90CisjZGVmaW5lIGl2ZGV4dF9maWxsX21lbV9yZWNfb3BfdCAgICAgICAgaW1wZWcyZF9maWxsX21lbV9yZWNfb3BfdAorI2RlZmluZSBpdmRleHRfY3RsX3NldF9udW1fY29yZXNfaXBfdCAgIGltcGVnMmRfY3RsX3NldF9udW1fY29yZXNfaXBfdAorI2RlZmluZSBpdmRleHRfY3RsX3NldF9udW1fY29yZXNfb3BfdCAgIGltcGVnMmRfY3RsX3NldF9udW1fY29yZXNfb3BfdAorI2RlZmluZSBpdmRleHRfY3RsX2dldF9zZXFfaW5mb19pcF90ICAgIGltcGVnMmRfY3RsX2dldF9zZXFfaW5mb19pcF90CisjZGVmaW5lIGl2ZGV4dF9jdGxfZ2V0X3NlcV9pbmZvX29wX3QgICAgaW1wZWcyZF9jdGxfZ2V0X3NlcV9pbmZvX29wX3QKKyNkZWZpbmUgQUxJR042NCh4KSAgICAgICAgICAgICAgICAgICAgICAoKCgoeCkgKyA2MykgPj4gNikgPDwgNikKKyNkZWZpbmUgTUFYX05VTV9DT1JFUyAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIElWREVYVF9DTURfQ1RMX1NFVF9OVU1fQ09SRVMgICAgXAorICAgICAgICAoSVZEX0NPTlRST0xfQVBJX0NPTU1BTkRfVFlQRV9UKUlNUEVHMkRfQ01EX0NUTF9TRVRfTlVNX0NPUkVTCisjZGVmaW5lIE1JTihhLCBiKSAgICAgICAgICAgICAgICAgICAgICAgKCgoYSkgPCAoYikpID8gKGEpIDogKGIpKQorI2RlZmluZSBHRVRUSU1FKGEsIGIpICAgICAgICAgICAgICAgICAgIGdldHRpbWVvZmRheShhLCBiKTsKKyNkZWZpbmUgVElNRV9ESUZGKHN0YXJ0LCBlbmQsIGRpZmYpICAgICBcCisgICAgZGlmZiA9ICgoKGVuZCkudHZfc2VjIC0gKHN0YXJ0KS50dl9zZWMpICogMTAwMDAwMCkgKyBcCisgICAgICAgICAgICAoKGVuZCkudHZfdXNlYyAtIChzdGFydCkudHZfdXNlYyk7CisKKyNpZmRlZiBGSUxFX0RVTVBfRU5BQkxFCisgICAgI2RlZmluZSBJTlBVVF9EVU1QX1BBVEggICAgICIvc2RjYXJkL2NsaXBzL21wZWcyZF9pbnB1dCIKKyAgICAjZGVmaW5lIElOUFVUX0RVTVBfRVhUICAgICAgIm0ydiIKKyAgICAjZGVmaW5lIEdFTkVSQVRFX0ZJTEVfTkFNRVMoKSB7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgR0VUVElNRSgmbVRpbWVTdGFydCwgTlVMTCk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc3RyY3B5KG1JbkZpbGUsICIiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc3ByaW50ZihtSW5GaWxlLCAiJXNfJWxkLiVsZC4lcyIsIElOUFVUX0RVTVBfUEFUSCwgIFwKKyAgICAgICAgICAgICAgICBtVGltZVN0YXJ0LnR2X3NlYywgbVRpbWVTdGFydC50dl91c2VjLCAgICAgIFwKKyAgICAgICAgICAgICAgICBJTlBVVF9EVU1QX0VYVCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisgICAgI2RlZmluZSBDUkVBVEVfRFVNUF9GSUxFKG1fZmlsZW5hbWUpIHsgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEZJTEUgKmZwID0gZm9wZW4obV9maWxlbmFtZSwgIndiIik7ICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChmcCAhPSBOVUxMKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmY2xvc2UoZnApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBBTE9HRCgiQ291bGQgbm90IG9wZW4gZmlsZSAlcyIsIG1fZmlsZW5hbWUpOyAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorICAgICNkZWZpbmUgRFVNUF9UT19GSUxFKG1fZmlsZW5hbWUsIG1fYnVmLCBtX3NpemUpICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBGSUxFICpmcCA9IGZvcGVuKG1fZmlsZW5hbWUsICJhYiIpOyAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoZnAgIT0gTlVMTCAmJiBtX2J1ZiAhPSBOVUxMKSB7ICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdWludDMyX3QgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaSA9IGZ3cml0ZShtX2J1ZiwgMSwgbV9zaXplLCBmcCk7ICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgQUxPR0QoImZ3cml0ZSByZXQgJWQgdG8gd3JpdGUgJWQiLCBpLCBtX3NpemUpOyAgXAorICAgICAgICAgICAgaWYgKGkgIT0gKHVpbnQzMl90KW1fc2l6ZSkgeyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIEFMT0dEKCJFcnJvciBpbiBmd3JpdGUsIHJldHVybmVkICVkIiwgaSk7ICAgXAorICAgICAgICAgICAgICAgIHBlcnJvcigiRXJyb3IgaW4gd3JpdGUgdG8gZmlsZSIpOyAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZmNsb3NlKGZwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgQUxPR0QoIkNvdWxkIG5vdCB3cml0ZSB0byBmaWxlICVzIiwgbV9maWxlbmFtZSk7XAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKyNlbHNlIC8qIEZJTEVfRFVNUF9FTkFCTEUgKi8KKyAgICAjZGVmaW5lIElOUFVUX0RVTVBfUEFUSAorICAgICNkZWZpbmUgSU5QVVRfRFVNUF9FWFQKKyAgICAjZGVmaW5lIE9VVFBVVF9EVU1QX1BBVEgKKyAgICAjZGVmaW5lIE9VVFBVVF9EVU1QX0VYVAorICAgICNkZWZpbmUgR0VORVJBVEVfRklMRV9OQU1FUygpCisgICAgI2RlZmluZSBDUkVBVEVfRFVNUF9GSUxFKG1fZmlsZW5hbWUpCisgICAgI2RlZmluZSBEVU1QX1RPX0ZJTEUobV9maWxlbmFtZSwgbV9idWYsIG1fc2l6ZSkKKyNlbmRpZiAvKiBGSUxFX0RVTVBfRU5BQkxFICovCisKK3N0cnVjdCBDMlNvZnRNcGVnMkRlYyA6IHB1YmxpYyBTaW1wbGVDMkNvbXBvbmVudCB7CisgICAgY2xhc3MgSW50ZkltcGw7CisKKyAgICBDMlNvZnRNcGVnMkRlYyhjb25zdCBjaGFyKiBuYW1lLCBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiYgaW50ZkltcGwpOworICAgIHZpcnR1YWwgfkMyU29mdE1wZWcyRGVjKCk7CisKKyAgICAvLyBGcm9tIFNpbXBsZUMyQ29tcG9uZW50CisgICAgYzJfc3RhdHVzX3Qgb25Jbml0KCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25TdG9wKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlc2V0KCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlbGVhc2UoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvbkZsdXNoX3NtKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBwcm9jZXNzKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBkcmFpbigKKyAgICAgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworIHByaXZhdGU6CisgICAgc3RhdHVzX3QgZ2V0TnVtTWVtUmVjb3JkcygpOworICAgIHN0YXR1c190IGZpbGxNZW1SZWNvcmRzKCk7CisgICAgc3RhdHVzX3QgY3JlYXRlRGVjb2RlcigpOworICAgIHN0YXR1c190IHNldE51bUNvcmVzKCk7CisgICAgc3RhdHVzX3Qgc2V0UGFyYW1zKHNpemVfdCBzdHJpZGUpOworICAgIHN0YXR1c190IGdldFZlcnNpb24oKTsKKyAgICBzdGF0dXNfdCBpbml0RGVjb2RlcigpOworICAgIGJvb2wgc2V0RGVjb2RlQXJncyhpdmRfdmlkZW9fZGVjb2RlX2lwX3QgKnBzX2RlY29kZV9pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9vcF90ICpwc19kZWNvZGVfb3AsCisgICAgICAgICAgICAgICAgICAgICAgIEMyUmVhZFZpZXcgKmluQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICBDMkdyYXBoaWNWaWV3ICpvdXRCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBpbk9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGluU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdHNNYXJrZXIpOworICAgIGJvb2wgZ2V0U2VxSW5mbygpOworICAgIGMyX3N0YXR1c190IGVuc3VyZURlY29kZXJTdGF0ZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKTsKKyAgICB2b2lkIGZpbmlzaFdvcmsodWludDY0X3QgaW5kZXgsIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKTsKKyAgICBzdGF0dXNfdCBzZXRGbHVzaE1vZGUoKTsKKyAgICBjMl9zdGF0dXNfdCBkcmFpbkludGVybmFsKAorICAgICAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKTsKKyAgICBzdGF0dXNfdCByZXNldERlY29kZXIoKTsKKyAgICB2b2lkIHJlc2V0UGx1Z2luKCk7CisgICAgc3RhdHVzX3QgZGVsZXRlRGVjb2RlcigpOworICAgIHN0YXR1c190IHJlSW5pdERlY29kZXIoKTsKKworICAgIC8vIFRPRE86VGhpcyBpcyBub3QgdGhlIHJpZ2h0IHBsYWNlIGZvciB0aGlzIGVudW0uIFRoZXNlIHNob3VsZAorICAgIC8vIGJlIHBhcnQgb2YgYzItdm5kayBzbyB0aGF0IHRoZXkgY2FuIGJlIGFjY2Vzc2VkIGJ5IGFsbCB2aWRlbyBwbHVnaW5zCisgICAgLy8gdW50aWwgdGhlbiwgbWFrZSB0aGVtIGZlZWwgYXQgaG9tZQorICAgIGVudW0geworICAgICAgICBrTm90U3VwcG9ydGVkLAorICAgICAgICBrUHJlZmVyQml0c3RyZWFtLAorICAgICAgICBrUHJlZmVyQ29udGFpbmVyLAorICAgIH07CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+IG1JbnRmOworICAgIGl2X29ial90ICptRGVjSGFuZGxlOworICAgIGl2X21lbV9yZWNfdCAqbU1lbVJlY29yZHM7CisgICAgc2l6ZV90IG1OdW1NZW1SZWNvcmRzOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gbU91dEJsb2NrOworICAgIHVpbnQ4X3QgKm1PdXRCdWZmZXJEcmFpbjsKKworICAgIHNpemVfdCBtTnVtQ29yZXM7CisgICAgSVZfQ09MT1JfRk9STUFUX1QgbUl2Q29sb3Jmb3JtYXQ7CisKKyAgICB1aW50MzJfdCBtV2lkdGg7CisgICAgdWludDMyX3QgbUhlaWdodDsKKyAgICB1aW50MzJfdCBtU3RyaWRlOworICAgIGJvb2wgbVNpZ25hbGxlZE91dHB1dEVvczsKKyAgICBib29sIG1TaWduYWxsZWRFcnJvcjsKKworICAgIC8vIENvbG9yIGFzcGVjdHMuIFRoZXNlIGFyZSBJU08gdmFsdWVzIGFuZCBhcmUgbWVhbnQgdG8gZGV0ZWN0IGNoYW5nZXMgaW4gYXNwZWN0cyB0byBhdm9pZAorICAgIC8vIGNvbnZlcnRpbmcgdGhlbSB0byBDMiB2YWx1ZXMgZm9yIGVhY2ggZnJhbWUKKyAgICBzdHJ1Y3QgVnVpQ29sb3JBc3BlY3RzIHsKKyAgICAgICAgdWludDhfdCBwcmltYXJpZXM7CisgICAgICAgIHVpbnQ4X3QgdHJhbnNmZXI7CisgICAgICAgIHVpbnQ4X3QgY29lZmZzOworICAgICAgICB1aW50OF90IGZ1bGxSYW5nZTsKKworICAgICAgICAvLyBkZWZhdWx0IGNvbG9yIGFzcGVjdHMKKyAgICAgICAgVnVpQ29sb3JBc3BlY3RzKCkKKyAgICAgICAgICAgIDogcHJpbWFyaWVzKDIpLCB0cmFuc2ZlcigyKSwgY29lZmZzKDIpLCBmdWxsUmFuZ2UoMCkgeyB9CisKKyAgICAgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFZ1aUNvbG9yQXNwZWN0cyAmbykgeworICAgICAgICAgICAgcmV0dXJuIHByaW1hcmllcyA9PSBvLnByaW1hcmllcyAmJiB0cmFuc2ZlciA9PSBvLnRyYW5zZmVyICYmIGNvZWZmcyA9PSBvLmNvZWZmcworICAgICAgICAgICAgICAgICAgICAmJiBmdWxsUmFuZ2UgPT0gby5mdWxsUmFuZ2U7CisgICAgICAgIH0KKyAgICB9IG1CaXRzdHJlYW1Db2xvckFzcGVjdHM7CisKKyAgICAvLyBwcm9maWxlCisgICAgc3RydWN0IHRpbWV2YWwgbVRpbWVTdGFydDsKKyAgICBzdHJ1Y3QgdGltZXZhbCBtVGltZUVuZDsKKyNpZmRlZiBGSUxFX0RVTVBfRU5BQkxFCisgICAgY2hhciBtSW5GaWxlWzIwMF07CisjZW5kaWYgLyogRklMRV9EVU1QX0VOQUJMRSAqLworCisgICAgQzJfRE9fTk9UX0NPUFkoQzJTb2Z0TXBlZzJEZWMpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0MyX1NPRlRfTVBFRzJfREVDX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDFlNGY0NAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvQW5kcm9pZC5icApAQCAtMCwwICsxLDY2IEBACitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X21wZWc0ZGVjIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfc2FuaXRpemVfc2lnbmVkLWRlZmF1bHRzIiwKKyAgICBdLAorCisgICAgc3JjczogWyJDMlNvZnRNcGVnNERlYy5jcHAiXSwKKworICAgIHN0YXRpY19saWJzOiBbImxpYnN0YWdlZnJpZ2h0X200dmgyNjNkZWMiXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLURPU0NMX0lNUE9SVF9SRUY9IiwKKyAgICAgICAgIi1ETVBFRzQiLAorICAgIF0sCit9CisKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfaDI2M2RlYyIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3Nhbml0aXplX3NpZ25lZC1kZWZhdWx0cyIsCisgICAgXSwKKworICAgIHNyY3M6IFsiQzJTb2Z0TXBlZzREZWMuY3BwIl0sCisKKyAgICBzdGF0aWNfbGliczogWyJsaWJzdGFnZWZyaWdodF9tNHZoMjYzZGVjIl0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1ET1NDTF9JTVBPUlRfUkVGPSIsCisgICAgXSwKK30KKworY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9tcGVnNGVuYyIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3Nhbml0aXplX3NpZ25lZC1kZWZhdWx0cyIsCisgICAgXSwKKworCisgICAgc3JjczogWyJDMlNvZnRNcGVnNEVuYy5jcHAiXSwKKworICAgIHN0YXRpY19saWJzOiBbImxpYnN0YWdlZnJpZ2h0X200dmgyNjNlbmMiXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLURNUEVHNCIsCisgICAgICAgICItRE9TQ0xfSU1QT1JUX1JFRj0iLAorICAgIF0sCit9CisKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfaDI2M2VuYyIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3Nhbml0aXplX3NpZ25lZC1kZWZhdWx0cyIsCisgICAgXSwKKworICAgIHNyY3M6IFsiQzJTb2Z0TXBlZzRFbmMuY3BwIl0sCisKKyAgICBzdGF0aWNfbGliczogWyAibGlic3RhZ2VmcmlnaHRfbTR2aDI2M2VuYyIgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLURPU0NMX0lNUE9SVF9SRUY9IiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzRfaDI2My9DMlNvZnRNcGVnNERlYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL0MyU29mdE1wZWc0RGVjLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDFmNWVkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzRfaDI2My9DMlNvZnRNcGVnNERlYy5jcHAKQEAgLTAsMCArMSw3NDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjaWZkZWYgTVBFRzQKKyAgI2RlZmluZSBMT0dfVEFHICJDMlNvZnRNcGVnNERlYyIKKyNlbHNlCisgICNkZWZpbmUgTE9HX1RBRyAiQzJTb2Z0SDI2M0RlYyIKKyNlbmRpZgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaD4KKworI2luY2x1ZGUgPEMyRGVidWcuaD4KKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPFNpbXBsZUMySW50ZXJmYWNlLmg+CisKKyNpbmNsdWRlICJDMlNvZnRNcGVnNERlYy5oIgorI2luY2x1ZGUgIm1wNGRlY19hcGkuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisjaWZkZWYgTVBFRzQKK2NvbnN0ZXhwciBjaGFyIENPTVBPTkVOVF9OQU1FW10gPSAiYzIuYW5kcm9pZC5tcGVnNC5kZWNvZGVyIjsKKyNlbHNlCitjb25zdGV4cHIgY2hhciBDT01QT05FTlRfTkFNRVtdID0gImMyLmFuZHJvaWQuaDI2My5kZWNvZGVyIjsKKyNlbmRpZgorCitjbGFzcyBDMlNvZnRNcGVnNERlYzo6SW50ZkltcGwgOiBwdWJsaWMgU2ltcGxlSW50ZXJmYWNlPHZvaWQ+OjpCYXNlUGFyYW1zIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBJbnRmSW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+ICZoZWxwZXIpCisgICAgICAgIDogU2ltcGxlSW50ZXJmYWNlPHZvaWQ+OjpCYXNlUGFyYW1zKAorICAgICAgICAgICAgICAgIGhlbHBlciwKKyAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwKKyAgICAgICAgICAgICAgICBDMkNvbXBvbmVudDo6S0lORF9ERUNPREVSLAorICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50OjpET01BSU5fVklERU8sCisjaWZkZWYgTVBFRzQKKyAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNAorI2Vsc2UKKyAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzCisjZW5kaWYKKyAgICAgICAgICAgICAgICApIHsKKyAgICAgICAgbm9Qcml2YXRlQnVmZmVycygpOyAvLyBUT0RPOiBhY2NvdW50IGZvciBvdXIgYnVmZmVycyBoZXJlCisgICAgICAgIG5vSW5wdXRSZWZlcmVuY2VzKCk7CisgICAgICAgIG5vT3V0cHV0UmVmZXJlbmNlcygpOworICAgICAgICBub0lucHV0TGF0ZW5jeSgpOworICAgICAgICBub1RpbWVTdHJldGNoKCk7CisKKyAgICAgICAgLy8gVE9ETzogb3V0cHV0IGxhdGVuY3kgYW5kIHJlb3JkZXJpbmcKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUF0dHJpYiwgQzJfUEFSQU1LRVlfQ09NUE9ORU5UX0FUVFJJQlVURVMpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMkNvbXBvbmVudEF0dHJpYnV0ZXNTZXR0aW5nKEMyQ29tcG9uZW50OjpBVFRSSUJfSVNfVEVNUE9SQUwpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVNpemUsIEMyX1BBUkFNS0VZX1BJQ1RVUkVfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQoMHUsIDE3NiwgMTQ0KSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisjaWZkZWYgTVBFRzQKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCB3aWR0aCkuaW5SYW5nZSgyLCAxOTIwLCAyKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCBoZWlnaHQpLmluUmFuZ2UoMiwgMTA4OCwgMiksCisjZWxzZQorICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIHdpZHRoKS5pblJhbmdlKDIsIDM1MiwgMiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgaGVpZ2h0KS5pblJhbmdlKDIsIDI4OCwgMiksCisjZW5kaWYKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNpemVTZXR0ZXIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisjaWZkZWYgTVBFRzQKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1Qcm9maWxlTGV2ZWwsIEMyX1BBUkFNS0VZX1BST0ZJTEVfTEVWRUwpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86OmlucHV0KDB1LAorICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfTVA0Vl9TSU1QTEUsIEMyQ29uZmlnOjpMRVZFTF9NUDRWXzMpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Qcm9maWxlTGV2ZWwsIHByb2ZpbGUpLmVxdWFsVG8oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfTVA0Vl9TSU1QTEUpLAorICAgICAgICAgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgbGV2ZWwpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfTVA0Vl8wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9NUDRWXzBCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9NUDRWXzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX01QNFZfMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfTVA0Vl8zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9NUDRWXzNCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9NUDRWXzQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX01QNFZfNEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX01QNFZfNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfTVA0Vl82fSkKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFByb2ZpbGVMZXZlbFNldHRlciwgbVNpemUpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworI2Vsc2UKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1Qcm9maWxlTGV2ZWwsIEMyX1BBUkFNS0VZX1BST0ZJTEVfTEVWRUwpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86OmlucHV0KDB1LAorICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfSDI2M19CQVNFTElORSwgQzJDb25maWc6OkxFVkVMX0gyNjNfMzApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Qcm9maWxlTGV2ZWwsIHByb2ZpbGUpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9IMjYzX0JBU0VMSU5FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX0gyNjNfSVNXVjJ9KSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Qcm9maWxlTGV2ZWwsIGxldmVsKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX0gyNjNfMTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX0gyNjNfMjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX0gyNjNfMzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX0gyNjNfNDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX0gyNjNfNDV9KQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoUHJvZmlsZUxldmVsU2V0dGVyLCBtU2l6ZSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisjZW5kaWYKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obU1heFNpemUsIEMyX1BBUkFNS0VZX01BWF9QSUNUVVJFX1NJWkUpCisjaWZkZWYgTVBFRzQKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtTWF4UGljdHVyZVNpemVUdW5pbmc6Om91dHB1dCgwdSwgMTkyMCwgMTA4OCkpCisjZWxzZQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1NYXhQaWN0dXJlU2l6ZVR1bmluZzo6b3V0cHV0KDB1LCAzNTIsIDI4OCkpCisjZW5kaWYKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisjaWZkZWYgTVBFRzQKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCB3aWR0aCkuaW5SYW5nZSgyLCAxOTIwLCAyKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCBoZWlnaHQpLmluUmFuZ2UoMiwgMTA4OCwgMiksCisjZWxzZQorICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIHdpZHRoKS5pblJhbmdlKDIsIDM1MiwgMiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgaGVpZ2h0KS5pblJhbmdlKDIsIDI4OCwgMiksCisjZW5kaWYKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKE1heFBpY3R1cmVTaXplU2V0dGVyLCBtU2l6ZSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1NYXhJbnB1dFNpemUsIEMyX1BBUkFNS0VZX0lOUFVUX01BWF9CVUZGRVJfU0laRSkKKyNpZmRlZiBNUEVHNAorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQoMHUsIDE5MjAgKiAxMDg4ICogMyAvIDIpKQorI2Vsc2UKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0KDB1LCAzNTIgKiAyODggKiAzIC8gMikpCisjZW5kaWYKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtTWF4SW5wdXRTaXplLCB2YWx1ZSkuYW55KCksCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAuY2FsY3VsYXRlZEFzKE1heElucHV0U2l6ZVNldHRlciwgbU1heFNpemUpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIEMyQ2hyb21hT2Zmc2V0U3RydWN0IGxvY2F0aW9uc1sxXSA9IHsgQzJDaHJvbWFPZmZzZXRTdHJ1Y3Q6OklUVV9ZVVZfNDIwXzAoKSB9OworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckluZm86Om91dHB1dD4gZGVmYXVsdENvbG9ySW5mbyA9CisgICAgICAgICAgICBDMlN0cmVhbUNvbG9ySW5mbzo6b3V0cHV0OjpBbGxvY1NoYXJlZCgKKyAgICAgICAgICAgICAgICAgICAgMXUsIDB1LCA4dSAvKiBiaXREZXB0aCAqLywgQzJDb2xvcjo6WVVWXzQyMCk7CisgICAgICAgIG1lbWNweShkZWZhdWx0Q29sb3JJbmZvLT5tLmxvY2F0aW9ucywgbG9jYXRpb25zLCBzaXplb2YobG9jYXRpb25zKSk7CisKKyAgICAgICAgZGVmYXVsdENvbG9ySW5mbyA9CisgICAgICAgICAgICBDMlN0cmVhbUNvbG9ySW5mbzo6b3V0cHV0OjpBbGxvY1NoYXJlZCgKKyAgICAgICAgICAgICAgICAgICAgeyBDMkNocm9tYU9mZnNldFN0cnVjdDo6SVRVX1lVVl80MjBfMCgpIH0sCisgICAgICAgICAgICAgICAgICAgIDB1LCA4dSAvKiBiaXREZXB0aCAqLywgQzJDb2xvcjo6WVVWXzQyMCk7CisgICAgICAgIGhlbHBlci0+YWRkU3RydWN0RGVzY3JpcHRvcnM8QzJDaHJvbWFPZmZzZXRTdHJ1Y3Q+KCk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1Db2xvckluZm8sIEMyX1BBUkFNS0VZX0NPREVEX0NPTE9SX0lORk8pCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKGRlZmF1bHRDb2xvckluZm8pCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIC8vIFRPRE86IHN1cHBvcnQgbW9yZSBmb3JtYXRzPworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVBpeGVsRm9ybWF0LCBDMl9QQVJBTUtFWV9QSVhFTF9GT1JNQVQpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbVBpeGVsRm9ybWF0SW5mbzo6b3V0cHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB1LCBIQUxfUElYRUxfRk9STUFUX1lDQkNSXzQyMF84ODgpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIFNpemVTZXR0ZXIoYm9vbCBtYXlCbG9jaywgY29uc3QgQzJQPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQ+ICZvbGRNZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQzJQPEMyVmlkZW9TaXplU3RyZWFtSW5mbzo6b3V0cHV0PiAmbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIEMyUiByZXMgPSBDMlI6Ok9rKCk7CisgICAgICAgIGlmICghbWUuRihtZS52LndpZHRoKS5zdXBwb3J0c0F0QWxsKG1lLnYud2lkdGgpKSB7CisgICAgICAgICAgICByZXMgPSByZXMucGx1cyhDMlNldHRpbmdSZXN1bHRCdWlsZGVyOjpCYWRWYWx1ZShtZS5GKG1lLnYud2lkdGgpKSk7CisgICAgICAgICAgICBtZS5zZXQoKS53aWR0aCA9IG9sZE1lLnYud2lkdGg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFtZS5GKG1lLnYuaGVpZ2h0KS5zdXBwb3J0c0F0QWxsKG1lLnYuaGVpZ2h0KSkgeworICAgICAgICAgICAgcmVzID0gcmVzLnBsdXMoQzJTZXR0aW5nUmVzdWx0QnVpbGRlcjo6QmFkVmFsdWUobWUuRihtZS52LmhlaWdodCkpKTsKKyAgICAgICAgICAgIG1lLnNldCgpLmhlaWdodCA9IG9sZE1lLnYuaGVpZ2h0OworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBNYXhQaWN0dXJlU2l6ZVNldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1NYXhQaWN0dXJlU2l6ZVR1bmluZzo6b3V0cHV0PiAmbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dD4gJnNpemUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIC8vIFRPRE86IGdldCBtYXggd2lkdGgvaGVpZ2h0IGZyb20gdGhlIHNpemUncyBmaWVsZCBoZWxwZXJzIHZzLiBoYXJkY29kaW5nCisjaWZkZWYgTVBFRzQKKyAgICAgICAgbWUuc2V0KCkud2lkdGggPSBjMl9taW4oYzJfbWF4KG1lLnYud2lkdGgsIHNpemUudi53aWR0aCksIDE5MjB1KTsKKyAgICAgICAgbWUuc2V0KCkuaGVpZ2h0ID0gYzJfbWluKGMyX21heChtZS52LmhlaWdodCwgc2l6ZS52LmhlaWdodCksIDEwODh1KTsKKyNlbHNlCisgICAgICAgIG1lLnNldCgpLndpZHRoID0gYzJfbWluKGMyX21heChtZS52LndpZHRoLCBzaXplLnYud2lkdGgpLCAzNTJ1KTsKKyAgICAgICAgbWUuc2V0KCkuaGVpZ2h0ID0gYzJfbWluKGMyX21heChtZS52LmhlaWdodCwgc2l6ZS52LmhlaWdodCksIDI4OHUpOworI2VuZGlmCisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBNYXhJbnB1dFNpemVTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0PiAmbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJQPEMyU3RyZWFtTWF4UGljdHVyZVNpemVUdW5pbmc6Om91dHB1dD4gJm1heFNpemUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIC8vIGFzc3VtZSBjb21wcmVzc2lvbiByYXRpbyBvZiAxCisgICAgICAgIG1lLnNldCgpLnZhbHVlID0gKCgobWF4U2l6ZS52LndpZHRoICsgMTUpIC8gMTYpICogKChtYXhTaXplLnYuaGVpZ2h0ICsgMTUpIC8gMTYpICogMzg0KTsKKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIFByb2ZpbGVMZXZlbFNldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjppbnB1dD4gJm1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyUDxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0PiAmc2l6ZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgKHZvaWQpc2l6ZTsKKyAgICAgICAgKHZvaWQpbWU7ICAvLyBUT0RPOiB2YWxpZGF0ZQorICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworICAgIHVpbnQzMl90IGdldE1heFdpZHRoKCkgY29uc3QgeyByZXR1cm4gbU1heFNpemUtPndpZHRoOyB9CisgICAgdWludDMyX3QgZ2V0TWF4SGVpZ2h0KCkgY29uc3QgeyByZXR1cm4gbU1heFNpemUtPmhlaWdodDsgfQorCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86OmlucHV0PiBtUHJvZmlsZUxldmVsOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0PiBtU2l6ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1NYXhQaWN0dXJlU2l6ZVR1bmluZzo6b3V0cHV0PiBtTWF4U2l6ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQ+IG1NYXhJbnB1dFNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JJbmZvOjpvdXRwdXQ+IG1Db2xvckluZm87CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUGl4ZWxGb3JtYXRJbmZvOjpvdXRwdXQ+IG1QaXhlbEZvcm1hdDsKK307CisKK0MyU29mdE1wZWc0RGVjOjpDMlNvZnRNcGVnNERlYygKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+ICZpbnRmSW1wbCkKKyAgICA6IFNpbXBsZUMyQ29tcG9uZW50KHN0ZDo6bWFrZV9zaGFyZWQ8U2ltcGxlSW50ZXJmYWNlPEludGZJbXBsPj4obmFtZSwgaWQsIGludGZJbXBsKSksCisgICAgICBtSW50ZihpbnRmSW1wbCksCisgICAgICBtRGVjSGFuZGxlKG51bGxwdHIpLAorICAgICAgbU91dHB1dEJ1ZmZlcnt9LAorICAgICAgbUluaXRpYWxpemVkKGZhbHNlKSB7Cit9CisKK0MyU29mdE1wZWc0RGVjOjp+QzJTb2Z0TXBlZzREZWMoKSB7CisgICAgb25SZWxlYXNlKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdE1wZWc0RGVjOjpvbkluaXQoKSB7CisgICAgc3RhdHVzX3QgZXJyID0gaW5pdERlY29kZXIoKTsKKyAgICByZXR1cm4gZXJyID09IE9LID8gQzJfT0sgOiBDMl9DT1JSVVBURUQ7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdE1wZWc0RGVjOjpvblN0b3AoKSB7CisgICAgaWYgKG1Jbml0aWFsaXplZCkgeworICAgICAgICBpZiAobURlY0hhbmRsZSkgeworICAgICAgICAgICAgUFZDbGVhblVwVmlkZW9EZWNvZGVyKG1EZWNIYW5kbGUpOworICAgICAgICB9CisgICAgICAgIG1Jbml0aWFsaXplZCA9IGZhbHNlOworICAgIH0KKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBrTnVtT3V0cHV0QnVmZmVyczsgKytpKSB7CisgICAgICAgIGlmIChtT3V0cHV0QnVmZmVyW2ldKSB7CisgICAgICAgICAgICBmcmVlKG1PdXRwdXRCdWZmZXJbaV0pOworICAgICAgICAgICAgbU91dHB1dEJ1ZmZlcltpXSA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICB9CisgICAgbU51bVNhbXBsZXNPdXRwdXQgPSAwOworICAgIG1GcmFtZXNDb25maWd1cmVkID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworCisgICAgcmV0dXJuIEMyX09LOworfQorCit2b2lkIEMyU29mdE1wZWc0RGVjOjpvblJlc2V0KCkgeworICAgICh2b2lkKW9uU3RvcCgpOworICAgICh2b2lkKW9uSW5pdCgpOworfQorCit2b2lkIEMyU29mdE1wZWc0RGVjOjpvblJlbGVhc2UoKSB7CisgICAgaWYgKG1Jbml0aWFsaXplZCkgeworICAgICAgICBpZiAobURlY0hhbmRsZSkgeworICAgICAgICAgICAgUFZDbGVhblVwVmlkZW9EZWNvZGVyKG1EZWNIYW5kbGUpOworICAgICAgICAgICAgZGVsZXRlIG1EZWNIYW5kbGU7CisgICAgICAgICAgICBtRGVjSGFuZGxlID0gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICBtSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKyAgICB9CisgICAgaWYgKG1PdXRCbG9jaykgeworICAgICAgICBtT3V0QmxvY2sucmVzZXQoKTsKKyAgICB9CisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwga051bU91dHB1dEJ1ZmZlcnM7ICsraSkgeworICAgICAgICBpZiAobU91dHB1dEJ1ZmZlcltpXSkgeworICAgICAgICAgICAgZnJlZShtT3V0cHV0QnVmZmVyW2ldKTsKKyAgICAgICAgICAgIG1PdXRwdXRCdWZmZXJbaV0gPSBudWxscHRyOworICAgICAgICB9CisgICAgfQorfQorCitjMl9zdGF0dXNfdCBDMlNvZnRNcGVnNERlYzo6b25GbHVzaF9zbSgpIHsKKyAgICBpZiAobUluaXRpYWxpemVkKSB7CisgICAgICAgIGlmIChQVl9UUlVFICE9IFBWUmVzZXRWaWRlb0RlY29kZXIobURlY0hhbmRsZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgICAgIH0KKyAgICB9CisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIHJldHVybiBDMl9PSzsKK30KKworc3RhdHVzX3QgQzJTb2Z0TXBlZzREZWM6OmluaXREZWNvZGVyKCkgeworI2lmZGVmIE1QRUc0CisgICAgbUlzTXBlZzQgPSB0cnVlOworI2Vsc2UKKyAgICBtSXNNcGVnNCA9IGZhbHNlOworI2VuZGlmCisgICAgaWYgKCFtRGVjSGFuZGxlKSB7CisgICAgICAgIG1EZWNIYW5kbGUgPSBuZXcgdGFndmlkZW9EZWNDb250cm9sczsKKyAgICB9CisgICAgaWYgKCFtRGVjSGFuZGxlKSB7CisgICAgICAgIEFMT0dFKCJtRGVjSGFuZGxlIGlzIG51bGwiKTsKKyAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICB9CisgICAgbWVtc2V0KG1EZWNIYW5kbGUsIDAsIHNpemVvZih0YWd2aWRlb0RlY0NvbnRyb2xzKSk7CisKKyAgICAvKiBUT0RPOiBicmluZyB0aGVzZSB2YWx1ZXMgdG8gMzUyIGFuZCAyODguIEl0IGNhbm5vdCBiZSBkb25lIGFzIG9mIG5vdworICAgICAqIGJlY2F1c2UsIGgyNjMgZG9lc24ndCBzZWVtIHRvIGFsbG93IHBvcnQgcmVjb25maWd1cmF0aW9uLiBJbiBPTVgsIHRoZQorICAgICAqIHByb2JsZW0gb2YgbGFyZ2VyIHdpZHRoIGFuZCBoZWlnaHQgdGhhbiBkZWZhdWx0IHdpZHRoIGFuZCBoZWlnaHQgaXMKKyAgICAgKiBvdmVyY29tZSBieSBhZGFwdGl2ZVBsYXlCYWNrKCkgYXBpIGNhbGwuIFRoaXMgY2FsbCBnZXRzIHdpZHRoIGFuZCBoZWlnaHQKKyAgICAgKiBpbmZvcm1hdGlvbiBmcm9tIGV4dHJhY3Rvci4gU3VjaCBhIHRoaW5nIGlzIG5vdCBwb3NzaWJsZSBoZXJlLgorICAgICAqIFNvIHdlIGFyZSBjb25maWd1cmluZyB0byBsYXJnZXIgdmFsdWVzLiovCisgICAgbVdpZHRoID0gMTQwODsKKyAgICBtSGVpZ2h0ID0gMTE1MjsKKyAgICBtTnVtU2FtcGxlc091dHB1dCA9IDA7CisgICAgbUluaXRpYWxpemVkID0gZmFsc2U7CisgICAgbUZyYW1lc0NvbmZpZ3VyZWQgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgZmlsbEVtcHR5V29yayhjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykgeworICAgIHVpbnQzMl90IGZsYWdzID0gMDsKKyAgICBpZiAod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgIGZsYWdzIHw9IEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU07CisgICAgICAgIEFMT0dWKCJzaWduYWxsaW5nIGVvcyIpOworICAgIH0KKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpZmxhZ3M7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKK30KKwordm9pZCBDMlNvZnRNcGVnNERlYzo6ZmluaXNoV29yayh1aW50NjRfdCBpbmRleCwgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGJ1ZmZlciA9IGNyZWF0ZUdyYXBoaWNCdWZmZXIoc3RkOjptb3ZlKG1PdXRCbG9jayksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyUmVjdChtV2lkdGgsIG1IZWlnaHQpKTsKKyAgICBtT3V0QmxvY2sgPSBudWxscHRyOworICAgIGF1dG8gZmlsbFdvcmsgPSBbYnVmZmVyLCBpbmRleF0oY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKyAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwOworICAgICAgICBpZiAoKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgJiYKKyAgICAgICAgICAgICAgICAoYzJfY250cjY0X3QoaW5kZXgpID09IHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleCkpIHsKKyAgICAgICAgICAgIGZsYWdzIHw9IEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU07CisgICAgICAgICAgICBBTE9HVigic2lnbmFsbGluZyBlb3MiKTsKKyAgICAgICAgfQorICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpZmxhZ3M7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLnB1c2hfYmFjayhidWZmZXIpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgfTsKKyAgICBpZiAod29yayAmJiBjMl9jbnRyNjRfdChpbmRleCkgPT0gd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4KSB7CisgICAgICAgIGZpbGxXb3JrKHdvcmspOworICAgIH0gZWxzZSB7CisgICAgICAgIGZpbmlzaChpbmRleCwgZmlsbFdvcmspOworICAgIH0KK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0TXBlZzREZWM6OmVuc3VyZURlY29kZXJTdGF0ZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgaWYgKCFtRGVjSGFuZGxlKSB7CisgICAgICAgIEFMT0dFKCJub3Qgc3VwcG9zZWQgdG8gYmUgaGVyZSwgaW52YWxpZCBkZWNvZGVyIGNvbnRleHQiKTsKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisKKyAgICBtT3V0cHV0QnVmZmVyU2l6ZSA9IGFsaWduKG1JbnRmLT5nZXRNYXhXaWR0aCgpLCAxNikgKiBhbGlnbihtSW50Zi0+Z2V0TWF4SGVpZ2h0KCksIDE2KSAqIDMgLyAyOworICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGtOdW1PdXRwdXRCdWZmZXJzOyArK2kpIHsKKyAgICAgICAgaWYgKCFtT3V0cHV0QnVmZmVyW2ldKSB7CisgICAgICAgICAgICBtT3V0cHV0QnVmZmVyW2ldID0gKHVpbnQ4X3QgKiltYWxsb2MobU91dHB1dEJ1ZmZlclNpemUpOworICAgICAgICAgICAgaWYgKCFtT3V0cHV0QnVmZmVyW2ldKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEMyX05PX01FTU9SWTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAobU91dEJsb2NrICYmCisgICAgICAgICAgICAobU91dEJsb2NrLT53aWR0aCgpICE9IGFsaWduKG1XaWR0aCwgMTYpIHx8IG1PdXRCbG9jay0+aGVpZ2h0KCkgIT0gbUhlaWdodCkpIHsKKyAgICAgICAgbU91dEJsb2NrLnJlc2V0KCk7CisgICAgfQorICAgIGlmICghbU91dEJsb2NrKSB7CisgICAgICAgIHVpbnQzMl90IGZvcm1hdCA9IEhBTF9QSVhFTF9GT1JNQVRfWVYxMjsKKyAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSA9IHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9OworICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBwb29sLT5mZXRjaEdyYXBoaWNCbG9jayhhbGlnbihtV2lkdGgsIDE2KSwgbUhlaWdodCwgZm9ybWF0LCB1c2FnZSwgJm1PdXRCbG9jayk7CisgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJmZXRjaEdyYXBoaWNCbG9jayBmb3IgT3V0cHV0IGZhaWxlZCB3aXRoIHN0YXR1cyAlZCIsIGVycik7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisgICAgICAgIEFMT0dWKCJwcm92aWRlZCAoJWR4JWQpIHJlcXVpcmVkICglZHglZCkiLAorICAgICAgICAgICAgICBtT3V0QmxvY2stPndpZHRoKCksIG1PdXRCbG9jay0+aGVpZ2h0KCksIG1XaWR0aCwgbUhlaWdodCk7CisgICAgfQorICAgIHJldHVybiBDMl9PSzsKK30KKworYm9vbCBDMlNvZnRNcGVnNERlYzo6aGFuZGxlUmVzQ2hhbmdlKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKSB7CisgICAgdWludDMyX3QgZGlzcF93aWR0aCwgZGlzcF9oZWlnaHQ7CisgICAgUFZHZXRWaWRlb0RpbWVuc2lvbnMobURlY0hhbmRsZSwgKGludDMyICopJmRpc3Bfd2lkdGgsIChpbnQzMiAqKSZkaXNwX2hlaWdodCk7CisKKyAgICB1aW50MzJfdCBidWZfd2lkdGgsIGJ1Zl9oZWlnaHQ7CisgICAgUFZHZXRCdWZmZXJEaW1lbnNpb25zKG1EZWNIYW5kbGUsIChpbnQzMiAqKSZidWZfd2lkdGgsIChpbnQzMiAqKSZidWZfaGVpZ2h0KTsKKworICAgIENIRUNLX0xFKGRpc3Bfd2lkdGgsIGJ1Zl93aWR0aCk7CisgICAgQ0hFQ0tfTEUoZGlzcF9oZWlnaHQsIGJ1Zl9oZWlnaHQpOworCisgICAgQUxPR1YoImRpc3BsYXkgc2l6ZSAoJWR4JWQpLCBidWZmZXIgc2l6ZSAoJWR4JWQpIiwKKyAgICAgICAgICAgZGlzcF93aWR0aCwgZGlzcF9oZWlnaHQsIGJ1Zl93aWR0aCwgYnVmX2hlaWdodCk7CisKKyAgICBib29sIHJlc0NoYW5nZWQgPSBmYWxzZTsKKyAgICBpZiAoZGlzcF93aWR0aCAhPSBtV2lkdGggfHwgZGlzcF9oZWlnaHQgIT0gbUhlaWdodCkgeworICAgICAgICBtV2lkdGggPSBkaXNwX3dpZHRoOworICAgICAgICBtSGVpZ2h0ID0gZGlzcF9oZWlnaHQ7CisgICAgICAgIHJlc0NoYW5nZWQgPSB0cnVlOworICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBrTnVtT3V0cHV0QnVmZmVyczsgKytpKSB7CisgICAgICAgICAgICBpZiAobU91dHB1dEJ1ZmZlcltpXSkgeworICAgICAgICAgICAgICAgIGZyZWUobU91dHB1dEJ1ZmZlcltpXSk7CisgICAgICAgICAgICAgICAgbU91dHB1dEJ1ZmZlcltpXSA9IG51bGxwdHI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoIW1Jc01wZWc0KSB7CisgICAgICAgICAgICBQVkNsZWFuVXBWaWRlb0RlY29kZXIobURlY0hhbmRsZSk7CisKKyAgICAgICAgICAgIHVpbnQ4X3QgKnZvbF9kYXRhWzFde307CisgICAgICAgICAgICBpbnQzMl90IHZvbF9zaXplID0gMDsKKworICAgICAgICAgICAgaWYgKCFQVkluaXRWaWRlb0RlY29kZXIoCisgICAgICAgICAgICAgICAgICAgIG1EZWNIYW5kbGUsIHZvbF9kYXRhLCAmdm9sX3NpemUsIDEsIG1JbnRmLT5nZXRNYXhXaWR0aCgpLCBtSW50Zi0+Z2V0TWF4SGVpZ2h0KCksIEgyNjNfTU9ERSkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiRXJyb3IgaW4gUFZJbml0VmlkZW9EZWNvZGVyIEgyNjNfTU9ERSB3aGlsZSByZXNDaGFuZ2VkIHdhcyBzZXQgdG8gdHJ1ZSIpOworICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1GcmFtZXNDb25maWd1cmVkID0gZmFsc2U7CisgICAgfQorICAgIHJldHVybiByZXNDaGFuZ2VkOworfQorCisvKiBUT0RPOiBjYW4gcmVtb3ZlIHRlbXBvcmFyeSBjb3B5IGFmdGVyIGxpYnJhcnkgc3VwcG9ydHMgd3JpdGluZyB0byBkaXNwbGF5CisgKiBidWZmZXIgWSwgVSBhbmQgViBwbGFuZSBwb2ludGVycyB1c2luZyBzdHJpZGUgaW5mby4gKi8KK3N0YXRpYyB2b2lkIGNvcHlPdXRwdXRCdWZmZXJUb1lWMTJGcmFtZSh1aW50OF90ICpkc3QsIHVpbnQ4X3QgKnNyYywgc2l6ZV90IGRzdFlTdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNyY1lTdHJpZGUsIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQpIHsKKyAgICBzaXplX3QgZHN0VVZTdHJpZGUgPSBhbGlnbihkc3RZU3RyaWRlIC8gMiwgMTYpOworICAgIHNpemVfdCBzcmNVVlN0cmlkZSA9IHNyY1lTdHJpZGUgLyAyOworICAgIHVpbnQ4X3QgKnNyY1N0YXJ0ID0gc3JjOworICAgIHVpbnQ4X3QgKmRzdFN0YXJ0ID0gZHN0OworICAgIHNpemVfdCB2U3RyaWRlID0gYWxpZ24oaGVpZ2h0LCAxNik7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoZWlnaHQ7ICsraSkgeworICAgICAgICAgbWVtY3B5KGRzdCwgc3JjLCB3aWR0aCk7CisgICAgICAgICBzcmMgKz0gc3JjWVN0cmlkZTsKKyAgICAgICAgIGRzdCArPSBkc3RZU3RyaWRlOworICAgIH0KKyAgICAvKiBVIGJ1ZmZlciAqLworICAgIHNyYyA9IHNyY1N0YXJ0ICsgdlN0cmlkZSAqIHNyY1lTdHJpZGU7CisgICAgZHN0ID0gZHN0U3RhcnQgKyAoZHN0WVN0cmlkZSAqIGhlaWdodCkgKyAoZHN0VVZTdHJpZGUgKiBoZWlnaHQgLyAyKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhlaWdodCAvIDI7ICsraSkgeworICAgICAgICAgbWVtY3B5KGRzdCwgc3JjLCB3aWR0aCAvIDIpOworICAgICAgICAgc3JjICs9IHNyY1VWU3RyaWRlOworICAgICAgICAgZHN0ICs9IGRzdFVWU3RyaWRlOworICAgIH0KKyAgICAvKiBWIGJ1ZmZlciAqLworICAgIHNyYyA9IHNyY1N0YXJ0ICsgdlN0cmlkZSAqIHNyY1lTdHJpZGUgKiA1IC8gNDsKKyAgICBkc3QgPSBkc3RTdGFydCArIChkc3RZU3RyaWRlICogaGVpZ2h0KTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhlaWdodCAvIDI7ICsraSkgeworICAgICAgICAgbWVtY3B5KGRzdCwgc3JjLCB3aWR0aCAvIDIpOworICAgICAgICAgc3JjICs9IHNyY1VWU3RyaWRlOworICAgICAgICAgZHN0ICs9IGRzdFVWU3RyaWRlOworICAgIH0KK30KKwordm9pZCBDMlNvZnRNcGVnNERlYzo6cHJvY2VzcygKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAvLyBJbml0aWFsaXplIG91dHB1dCB3b3JrCisgICAgd29yay0+cmVzdWx0ID0gQzJfT0s7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisKKyAgICBpZiAobVNpZ25hbGxlZEVycm9yIHx8IG1TaWduYWxsZWRPdXRwdXRFb3MpIHsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQkFEX1ZBTFVFOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc2l6ZV90IGluT2Zmc2V0ID0gMHU7CisgICAgc2l6ZV90IGluU2l6ZSA9IDB1OworICAgIHVpbnQzMl90IHdvcmtJbmRleCA9IHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpICYgMHhGRkZGRkZGRjsKKyAgICBDMlJlYWRWaWV3IHJWaWV3ID0gbUR1bW15UmVhZFZpZXc7CisgICAgaWYgKCF3b3JrLT5pbnB1dC5idWZmZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgclZpZXcgPSB3b3JrLT5pbnB1dC5idWZmZXJzWzBdLT5kYXRhKCkubGluZWFyQmxvY2tzKCkuZnJvbnQoKS5tYXAoKS5nZXQoKTsKKyAgICAgICAgaW5TaXplID0gclZpZXcuY2FwYWNpdHkoKTsKKyAgICAgICAgaWYgKGluU2l6ZSAmJiByVmlldy5lcnJvcigpKSB7CisgICAgICAgICAgICBBTE9HRSgicmVhZCB2aWV3IG1hcCBmYWlsZWQgJWQiLCByVmlldy5lcnJvcigpKTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKyAgICBBTE9HVigiaW4gYnVmZmVyIGF0dHIuIHNpemUgJXp1IHRpbWVzdGFtcCAlZCBmcmFtZWluZGV4ICVkLCBmbGFncyAleCIsCisgICAgICAgICAgaW5TaXplLCAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1KCksCisgICAgICAgICAgKGludCl3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKSwgd29yay0+aW5wdXQuZmxhZ3MpOworCisgICAgYm9vbCBlb3MgPSAoKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgIT0gMCk7CisgICAgaWYgKGluU2l6ZSA9PSAwKSB7CisgICAgICAgIGZpbGxFbXB0eVdvcmsod29yayk7CisgICAgICAgIGlmIChlb3MpIHsKKyAgICAgICAgICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB1aW50OF90ICpiaXRzdHJlYW0gPSBjb25zdF9jYXN0PHVpbnQ4X3QgKj4oclZpZXcuZGF0YSgpICsgaW5PZmZzZXQpOworICAgIHVpbnQzMl90ICpzdGFydF9jb2RlID0gKHVpbnQzMl90ICopYml0c3RyZWFtOworICAgIGJvb2wgdm9sSGVhZGVyID0gKnN0YXJ0X2NvZGUgPT0gMHhCMDAxMDAwMDsKKyAgICBpZiAodm9sSGVhZGVyKSB7CisgICAgICAgIFBWQ2xlYW5VcFZpZGVvRGVjb2RlcihtRGVjSGFuZGxlKTsKKyAgICAgICAgbUluaXRpYWxpemVkID0gZmFsc2U7CisgICAgfQorCisgICAgaWYgKCFtSW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgdWludDhfdCAqdm9sX2RhdGFbMV17fTsKKyAgICAgICAgaW50MzJfdCB2b2xfc2l6ZSA9IDA7CisKKyAgICAgICAgYm9vbCBjb2RlY0NvbmZpZyA9ICh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0NPREVDX0NPTkZJRykgIT0gMDsKKyAgICAgICAgaWYgKGNvZGVjQ29uZmlnIHx8IHZvbEhlYWRlcikgeworICAgICAgICAgICAgdm9sX2RhdGFbMF0gPSBiaXRzdHJlYW07CisgICAgICAgICAgICB2b2xfc2l6ZSA9IGluU2l6ZTsKKyAgICAgICAgfQorICAgICAgICBNUDREZWNvZGluZ01vZGUgbW9kZSA9IChtSXNNcGVnNCkgPyBNUEVHNF9NT0RFIDogSDI2M19NT0RFOworICAgICAgICBpZiAoIVBWSW5pdFZpZGVvRGVjb2RlcigKKyAgICAgICAgICAgICAgICBtRGVjSGFuZGxlLCB2b2xfZGF0YSwgJnZvbF9zaXplLCAxLAorICAgICAgICAgICAgICAgIG1JbnRmLT5nZXRNYXhXaWR0aCgpLCBtSW50Zi0+Z2V0TWF4SGVpZ2h0KCksIG1vZGUpKSB7CisgICAgICAgICAgICBBTE9HRSgiUFZJbml0VmlkZW9EZWNvZGVyIGZhaWxlZC4gVW5zdXBwb3J0ZWQgY29udGVudD8iKTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbUluaXRpYWxpemVkID0gdHJ1ZTsKKyAgICAgICAgTVA0RGVjb2RpbmdNb2RlIGFjdHVhbE1vZGUgPSBQVkdldERlY0JpdHN0cmVhbU1vZGUobURlY0hhbmRsZSk7CisgICAgICAgIGlmIChtb2RlICE9IGFjdHVhbE1vZGUpIHsKKyAgICAgICAgICAgIEFMT0dFKCJEZWNvZGVkIG1vZGUgbm90IHNhbWUgYXMgYWN0dWFsIG1vZGUgb2YgdGhlIGRlY29kZXIiKTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBQVlNldFBvc3RQcm9jVHlwZShtRGVjSGFuZGxlLCAwKTsKKyAgICAgICAgaWYgKGhhbmRsZVJlc0NoYW5nZSh3b3JrKSkgeworICAgICAgICAgICAgQUxPR0koIlNldHRpbmcgd2lkdGggYW5kIGhlaWdodCIpOworICAgICAgICAgICAgQzJWaWRlb1NpemVTdHJlYW1JbmZvOjpvdXRwdXQgc2l6ZSgwdSwgbVdpZHRoLCBtSGVpZ2h0KTsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICAgICAgICAgIGMyX3N0YXR1c190IGVyciA9IG1JbnRmLT5jb25maWcoeyZzaXplfSwgQzJfTUFZX0JMT0NLLCAmZmFpbHVyZXMpOworICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgICAgICBDMlBhcmFtOjpDb3B5KHNpemUpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkNvbmZpZyB1cGRhdGUgc2l6ZSBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNvZGVjQ29uZmlnKSB7CisgICAgICAgICAgICBmaWxsRW1wdHlXb3JrKHdvcmspOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgc2l6ZV90IGluUG9zID0gMDsKKyAgICB3aGlsZSAoaW5Qb3MgPCBpblNpemUpIHsKKyAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gZW5zdXJlRGVjb2RlclN0YXRlKHBvb2wpOworICAgICAgICBpZiAoQzJfT0sgIT0gZXJyKSB7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gZXJyOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIEMyR3JhcGhpY1ZpZXcgd1ZpZXcgPSBtT3V0QmxvY2stPm1hcCgpLmdldCgpOworICAgICAgICBpZiAod1ZpZXcuZXJyb3IoKSkgeworICAgICAgICAgICAgQUxPR0UoImdyYXBoaWMgdmlldyBtYXAgZmFpbGVkICVkIiwgd1ZpZXcuZXJyb3IoKSk7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICB1aW50MzJfdCB5RnJhbWVTaXplID0gc2l6ZW9mKHVpbnQ4KSAqIG1EZWNIYW5kbGUtPnNpemU7CisgICAgICAgIGlmIChtT3V0cHV0QnVmZmVyU2l6ZSA8IHlGcmFtZVNpemUgKiAzIC8gMil7CisgICAgICAgICAgICBBTE9HRSgiVG9vIHNtYWxsIG91dHB1dCBidWZmZXI6ICV6dSBieXRlcyIsIG1PdXRwdXRCdWZmZXJTaXplKTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9OT19NRU1PUlk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAoIW1GcmFtZXNDb25maWd1cmVkKSB7CisgICAgICAgICAgICBQVlNldFJlZmVyZW5jZVlVVihtRGVjSGFuZGxlLG1PdXRwdXRCdWZmZXJbMV0pOworICAgICAgICAgICAgbUZyYW1lc0NvbmZpZ3VyZWQgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgLy8gTmVlZCB0byBjaGVjayBpZiBoZWFkZXIgY29udGFpbnMgbmV3IGluZm8sIGUuZy4sIHdpZHRoL2hlaWdodCwgZXRjLgorICAgICAgICBWb3BIZWFkZXJJbmZvIGhlYWRlcl9pbmZvOworICAgICAgICB1aW50MzJfdCB1c2VFeHRUaW1lc3RhbXAgPSAoaW5Qb3MgPT0gMCk7CisgICAgICAgIGludDMyX3QgdG1wSW5TaXplID0gKGludDMyX3QpaW5TaXplOworICAgICAgICB1aW50OF90ICpiaXRzdHJlYW1UbXAgPSBiaXRzdHJlYW07CisgICAgICAgIHVpbnQzMl90IHRpbWVzdGFtcCA9IHdvcmtJbmRleDsKKyAgICAgICAgaWYgKFBWRGVjb2RlVm9wSGVhZGVyKAorICAgICAgICAgICAgICAgICAgICBtRGVjSGFuZGxlLCAmYml0c3RyZWFtVG1wLCAmdGltZXN0YW1wLCAmdG1wSW5TaXplLAorICAgICAgICAgICAgICAgICAgICAmaGVhZGVyX2luZm8sICZ1c2VFeHRUaW1lc3RhbXAsCisgICAgICAgICAgICAgICAgICAgIG1PdXRwdXRCdWZmZXJbbU51bVNhbXBsZXNPdXRwdXQgJiAxXSkgIT0gUFZfVFJVRSkgeworICAgICAgICAgICAgQUxPR0UoImZhaWxlZCB0byBkZWNvZGUgdm9wIGhlYWRlci4iKTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBIMjYzIGRvZXNuJ3QgaGF2ZSBWT0wgaGVhZGVyLCB0aGUgZnJhbWUgc2l6ZSBpbmZvcm1hdGlvbiBpcyBpbiBzaG9ydCBoZWFkZXIsIGkuZS4gdGhlCisgICAgICAgIC8vIGRlY29kZXIgbWF5IGRldGVjdCBzaXplIGNoYW5nZSBhZnRlciBQVkRlY29kZVZvcEhlYWRlci4KKyAgICAgICAgYm9vbCByZXNDaGFuZ2UgPSBoYW5kbGVSZXNDaGFuZ2Uod29yayk7CisgICAgICAgIGlmIChtSXNNcGVnNCAmJiByZXNDaGFuZ2UpIHsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gZWxzZSBpZiAocmVzQ2hhbmdlKSB7CisgICAgICAgICAgICBBTE9HSSgiU2V0dGluZyB3aWR0aCBhbmQgaGVpZ2h0Iik7CisgICAgICAgICAgICBDMlZpZGVvU2l6ZVN0cmVhbUluZm86Om91dHB1dCBzaXplKDB1LCBtV2lkdGgsIG1IZWlnaHQpOworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gbUludGYtPmNvbmZpZyh7JnNpemV9LCBDMl9NQVlfQkxPQ0ssICZmYWlsdXJlcyk7CisgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5wdXNoX2JhY2soQzJQYXJhbTo6Q29weShzaXplKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dFKCJDb25maWcgdXBkYXRlIHNpemUgZmFpbGVkIik7CisgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoUFZEZWNvZGVWb3BCb2R5KG1EZWNIYW5kbGUsICZ0bXBJblNpemUpICE9IFBWX1RSVUUpIHsKKyAgICAgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gZGVjb2RlIHZpZGVvIGZyYW1lLiIpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoaGFuZGxlUmVzQ2hhbmdlKHdvcmspKSB7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgdWludDhfdCAqb3V0cHV0QnVmZmVyWSA9IHdWaWV3LmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfWV07CisgICAgICAgICh2b2lkKWNvcHlPdXRwdXRCdWZmZXJUb1lWMTJGcmFtZShvdXRwdXRCdWZmZXJZLCBtT3V0cHV0QnVmZmVyW21OdW1TYW1wbGVzT3V0cHV0ICYgMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3Vmlldy53aWR0aCgpLCBhbGlnbihtV2lkdGgsIDE2KSwgbVdpZHRoLCBtSGVpZ2h0KTsKKworICAgICAgICBpblBvcyArPSBpblNpemUgLSAoc2l6ZV90KXRtcEluU2l6ZTsKKyAgICAgICAgZmluaXNoV29yayh3b3JrSW5kZXgsIHdvcmspOworICAgICAgICArK21OdW1TYW1wbGVzT3V0cHV0OworICAgICAgICBpZiAoaW5TaXplIC0gaW5Qb3MgIT0gMCkgeworICAgICAgICAgICAgQUxPR0QoImRlY29kZWQgZnJhbWUsIGlnbm9yaW5nIGZ1cnRoZXIgdHJhaWxpbmcgYnl0ZXMgJWQiLAorICAgICAgICAgICAgICAgICAgKGludClpblNpemUgLSAoaW50KWluUG9zKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorCitjMl9zdGF0dXNfdCBDMlNvZnRNcGVnNERlYzo6ZHJhaW4oCisgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgICh2b2lkKXBvb2w7CisgICAgaWYgKGRyYWluTW9kZSA9PSBOT19EUkFJTikgeworICAgICAgICBBTE9HVygiZHJhaW4gd2l0aCBOT19EUkFJTjogbm8tb3AiKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKyAgICBpZiAoZHJhaW5Nb2RlID09IERSQUlOX0NIQUlOKSB7CisgICAgICAgIEFMT0dXKCJEUkFJTl9DSEFJTiBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2NsYXNzIEMyU29mdE1wZWc0RGVjRmFjdG9yeSA6IHB1YmxpYyBDMkNvbXBvbmVudEZhY3RvcnkgeworcHVibGljOgorICAgIEMyU29mdE1wZWc0RGVjRmFjdG9yeSgpIDogbUhlbHBlcihzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJSZWZsZWN0b3JIZWxwZXI+KAorICAgICAgICBHZXRDb2RlYzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCktPmdldFBhcmFtUmVmbGVjdG9yKCkpKSB7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVDb21wb25lbnQoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KiBjb25zdCBjb21wb25lbnQsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnQqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqY29tcG9uZW50ID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PigKKyAgICAgICAgICAgICAgICBuZXcgQzJTb2Z0TXBlZzREZWMoQ09NUE9ORU5UX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdE1wZWc0RGVjOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KiBjb25zdCBpbnRlcmZhY2UsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnRJbnRlcmZhY2UqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqaW50ZXJmYWNlID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPigKKyAgICAgICAgICAgICAgICBuZXcgU2ltcGxlSW50ZXJmYWNlPEMyU29mdE1wZWc0RGVjOjpJbnRmSW1wbD4oCisgICAgICAgICAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwgaWQsIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0TXBlZzREZWM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5DMlNvZnRNcGVnNERlY0ZhY3RvcnkoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiBtSGVscGVyOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworZXh0ZXJuICJDIiA6OkMyQ29tcG9uZW50RmFjdG9yeSogQ3JlYXRlQ29kZWMyRmFjdG9yeSgpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuIG5ldyA6OmFuZHJvaWQ6OkMyU29mdE1wZWc0RGVjRmFjdG9yeSgpOworfQorCitleHRlcm4gIkMiIHZvaWQgRGVzdHJveUNvZGVjMkZhY3RvcnkoOjpDMkNvbXBvbmVudEZhY3RvcnkqIGZhY3RvcnkpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgZGVsZXRlIGZhY3Rvcnk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL0MyU29mdE1wZWc0RGVjLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL0MyU29mdE1wZWc0RGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE2YTA5NQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvQzJTb2Z0TXBlZzREZWMuaApAQCAtMCwwICsxLDc3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDMl9TT0ZUX01QRUc0X0RFQ19IXworI2RlZmluZSBDMl9TT0ZUX01QRUc0X0RFQ19IXworCisjaW5jbHVkZSA8U2ltcGxlQzJDb21wb25lbnQuaD4KKworCitzdHJ1Y3QgdGFndmlkZW9EZWNDb250cm9sczsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgQzJTb2Z0TXBlZzREZWMgOiBwdWJsaWMgU2ltcGxlQzJDb21wb25lbnQgeworICAgIGNsYXNzIEludGZJbXBsOworCisgICAgQzJTb2Z0TXBlZzREZWMoY29uc3QgY2hhciogbmFtZSwgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4mIGludGZJbXBsKTsKKyAgICB2aXJ0dWFsIH5DMlNvZnRNcGVnNERlYygpOworCisgICAgLy8gRnJvbSBTaW1wbGVDMkNvbXBvbmVudAorICAgIGMyX3N0YXR1c190IG9uSW5pdCgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uU3RvcCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZXNldCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZWxlYXNlKCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25GbHVzaF9zbSgpIG92ZXJyaWRlOworICAgIHZvaWQgcHJvY2VzcygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3QgZHJhaW4oCisgICAgICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKyBwcml2YXRlOgorICAgIGVudW0geworICAgICAgICBrTnVtT3V0cHV0QnVmZmVycyA9IDIsCisgICAgfTsKKworICAgIHN0YXR1c190IGluaXREZWNvZGVyKCk7CisgICAgYzJfc3RhdHVzX3QgZW5zdXJlRGVjb2RlclN0YXRlKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpOworICAgIHZvaWQgZmluaXNoV29yayh1aW50NjRfdCBpbmRleCwgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspOworICAgIGJvb2wgaGFuZGxlUmVzQ2hhbmdlKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gbUludGY7CisgICAgdGFndmlkZW9EZWNDb250cm9scyAqbURlY0hhbmRsZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+IG1PdXRCbG9jazsKKyAgICB1aW50OF90ICptT3V0cHV0QnVmZmVyW2tOdW1PdXRwdXRCdWZmZXJzXTsKKyAgICBzaXplX3QgIG1PdXRwdXRCdWZmZXJTaXplOworCisgICAgdWludDMyX3QgbVdpZHRoOworICAgIHVpbnQzMl90IG1IZWlnaHQ7CisgICAgdWludDMyX3QgbU51bVNhbXBsZXNPdXRwdXQ7CisKKyAgICBib29sIG1Jc01wZWc0OworICAgIGJvb2wgbUluaXRpYWxpemVkOworICAgIGJvb2wgbUZyYW1lc0NvbmZpZ3VyZWQ7CisgICAgYm9vbCBtU2lnbmFsbGVkT3V0cHV0RW9zOworICAgIGJvb2wgbVNpZ25hbGxlZEVycm9yOworCisgICAgQzJfRE9fTk9UX0NPUFkoQzJTb2Z0TXBlZzREZWMpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBDMl9TT0ZUX01QRUc0X0RFQ19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzRfaDI2My9DMlNvZnRNcGVnNEVuYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL0MyU29mdE1wZWc0RW5jLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODc5NmYzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzRfaDI2My9DMlNvZnRNcGVnNEVuYy5jcHAKQEAgLTAsMCArMSw2NzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNpZmRlZiBNUEVHNAorICAjZGVmaW5lIExPR19UQUcgIkMyU29mdE1wZWc0RW5jIgorI2Vsc2UKKyAgI2RlZmluZSBMT0dfVEFHICJDMlNvZnRIMjYzRW5jIgorI2VuZGlmCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL1ZpZGVvQVBJLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDx1dGlscy9taXNjLmg+CisKKyNpbmNsdWRlIDxDMkRlYnVnLmg+CisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxTaW1wbGVDMkludGVyZmFjZS5oPgorI2luY2x1ZGUgPHV0aWwvQzJJbnRlcmZhY2VIZWxwZXIuaD4KKworI2luY2x1ZGUgIkMyU29mdE1wZWc0RW5jLmgiCisjaW5jbHVkZSAibXA0ZW5jX2FwaS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKyNpZmRlZiBNUEVHNAorY29uc3RleHByIGNoYXIgQ09NUE9ORU5UX05BTUVbXSA9ICJjMi5hbmRyb2lkLm1wZWc0LmVuY29kZXIiOworI2Vsc2UKK2NvbnN0ZXhwciBjaGFyIENPTVBPTkVOVF9OQU1FW10gPSAiYzIuYW5kcm9pZC5oMjYzLmVuY29kZXIiOworI2VuZGlmCisKK2NsYXNzIEMyU29mdE1wZWc0RW5jOjpJbnRmSW1wbCA6IHB1YmxpYyBDMkludGVyZmFjZUhlbHBlciB7CisgICBwdWJsaWM6CisgICAgZXhwbGljaXQgSW50ZkltcGwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiYgaGVscGVyKQorICAgICAgICA6IEMySW50ZXJmYWNlSGVscGVyKGhlbHBlcikgeworICAgICAgICBzZXREZXJpdmVkSW5zdGFuY2UodGhpcyk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0Rm9ybWF0LCBDMl9OQU1FX0lOUFVUX1NUUkVBTV9GT1JNQVRfU0VUVElORykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoCisgICAgICAgICAgICAgICAgICAgIG5ldyBDMlN0cmVhbUZvcm1hdENvbmZpZzo6aW5wdXQoMHUsIEMyRm9ybWF0VmlkZW8pKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtT3V0cHV0Rm9ybWF0LCBDMl9OQU1FX09VVFBVVF9TVFJFQU1fRk9STUFUX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKAorICAgICAgICAgICAgICAgICAgICBuZXcgQzJTdHJlYW1Gb3JtYXRDb25maWc6Om91dHB1dCgwdSwgQzJGb3JtYXRDb21wcmVzc2VkKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0TWVkaWFUeXBlLCBDMl9OQU1FX0lOUFVUX1BPUlRfTUlNRV9TRVRUSU5HKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShBbGxvY1NoYXJlZFN0cmluZzxDMlBvcnRNaW1lQ29uZmlnOjppbnB1dD4oCisgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX1ZJREVPX1JBVykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1PdXRwdXRNZWRpYVR5cGUsIEMyX05BTUVfT1VUUFVUX1BPUlRfTUlNRV9TRVRUSU5HKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShBbGxvY1NoYXJlZFN0cmluZzxDMlBvcnRNaW1lQ29uZmlnOjpvdXRwdXQ+KAorI2lmZGVmIE1QRUc0CisgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0CisjZWxzZQorICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKERlZmluZVBhcmFtKG1Vc2FnZSwgQzJfTkFNRV9JTlBVVF9TVFJFQU1fVVNBR0VfU0VUVElORykKKyAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtVXNhZ2VUdW5pbmc6OmlucHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwdSwgKHVpbnQ2NF90KUMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFEKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obVNpemUsIEMyX05BTUVfU1RSRUFNX1ZJREVPX1NJWkVfU0VUVElORykKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyVmlkZW9TaXplU3RyZWFtVHVuaW5nOjppbnB1dCgwdSwgMTc2LCAxNDQpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyNpZmRlZiBNUEVHNAorICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIHdpZHRoKS5pblJhbmdlKDE2LCAxNzYsIDE2KSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCBoZWlnaHQpLmluUmFuZ2UoMTYsIDE0NCwgMTYpLAorI2Vsc2UKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCB3aWR0aCkub25lT2YoezE3NiwgMzUyfSksCisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgaGVpZ2h0KS5vbmVPZih7MTQ0LCAyODh9KSwKKyNlbmRpZgorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2l6ZVNldHRlcikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obUZyYW1lUmF0ZSwgQzJfTkFNRV9TVFJFQU1fRlJBTUVfUkFURV9TRVRUSU5HKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1GcmFtZVJhdGVJbmZvOjpvdXRwdXQoMHUsIDE3LikpCisgICAgICAgICAgICAgICAgLy8gVE9ETzogTW9yZSByZXN0cmljdGlvbj8KKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1GcmFtZVJhdGUsIHZhbHVlKS5ncmVhdGVyVGhhbigwLil9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKAorICAgICAgICAgICAgICAgICAgICBTZXR0ZXI8ZGVjbHR5cGUoKm1GcmFtZVJhdGUpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtQml0cmF0ZSwgQzJfTkFNRV9TVFJFQU1fQklUUkFURV9TRVRUSU5HKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJCaXRyYXRlVHVuaW5nOjpvdXRwdXQoMHUsIDY0MDAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1CaXRyYXRlLCB2YWx1ZSkuaW5SYW5nZSg0MDk2LCAxMjAwMDAwMCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKEJpdHJhdGVTZXR0ZXIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtU3luY0ZyYW1lUGVyaW9kLCBDMl9QQVJBTUtFWV9TWU5DX0ZSQU1FX0lOVEVSVkFMKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1TeW5jRnJhbWVJbnRlcnZhbFR1bmluZzo6b3V0cHV0KDB1LCAxMDAwMDAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1TeW5jRnJhbWVQZXJpb2QsIHZhbHVlKS5hbnkoKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptU3luY0ZyYW1lUGVyaW9kKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyNpZmRlZiBNUEVHNAorICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVByb2ZpbGVMZXZlbCwgQzJfUEFSQU1LRVlfUFJPRklMRV9MRVZFTCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6b3V0cHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgMHUsIFBST0ZJTEVfTVA0Vl9TSU1QTEUsIExFVkVMX01QNFZfMikpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgcHJvZmlsZSkuZXF1YWxUbygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9GSUxFX01QNFZfU0lNUExFKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Qcm9maWxlTGV2ZWwsIGxldmVsKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX01QNFZfMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfTVA0Vl8wQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfTVA0Vl8xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9NUDRWXzJ9KQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoUHJvZmlsZUxldmVsU2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyNlbHNlCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtUHJvZmlsZUxldmVsLCBDMl9QQVJBTUtFWV9QUk9GSUxFX0xFVkVMKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjpvdXRwdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAwdSwgUFJPRklMRV9IMjYzX0JBU0VMSU5FLCBMRVZFTF9IMjYzXzQ1KSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtUHJvZmlsZUxldmVsLCBwcm9maWxlKS5lcXVhbFRvKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0ZJTEVfSDI2M19CQVNFTElORSksCisgICAgICAgICAgICAgICAgICAgIEMyRihtUHJvZmlsZUxldmVsLCBsZXZlbCkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9IMjYzXzEwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9IMjYzXzIwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9IMjYzXzMwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9IMjYzXzQwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9IMjYzXzQ1fSkKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFByb2ZpbGVMZXZlbFNldHRlcikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisjZW5kaWYKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIEJpdHJhdGVTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtQml0cmF0ZUluZm86Om91dHB1dD4gJm1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICBDMlIgcmVzID0gQzJSOjpPaygpOworICAgICAgICBpZiAobWUudi52YWx1ZSA8PSA0MDk2KSB7CisgICAgICAgICAgICBtZS5zZXQoKS52YWx1ZSA9IDQwOTY7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIFNpemVTZXR0ZXIoYm9vbCBtYXlCbG9jaywgY29uc3QgQzJQPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjppbnB1dD4gJm9sZE1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86OmlucHV0PiAmbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIEMyUiByZXMgPSBDMlI6Ok9rKCk7CisgICAgICAgIGlmICghbWUuRihtZS52LndpZHRoKS5zdXBwb3J0c0F0QWxsKG1lLnYud2lkdGgpKSB7CisgICAgICAgICAgICByZXMgPSByZXMucGx1cyhDMlNldHRpbmdSZXN1bHRCdWlsZGVyOjpCYWRWYWx1ZShtZS5GKG1lLnYud2lkdGgpKSk7CisgICAgICAgICAgICBtZS5zZXQoKS53aWR0aCA9IG9sZE1lLnYud2lkdGg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFtZS5GKG1lLnYuaGVpZ2h0KS5zdXBwb3J0c0F0QWxsKG1lLnYuaGVpZ2h0KSkgeworICAgICAgICAgICAgcmVzID0gcmVzLnBsdXMoQzJTZXR0aW5nUmVzdWx0QnVpbGRlcjo6QmFkVmFsdWUobWUuRihtZS52LmhlaWdodCkpKTsKKyAgICAgICAgICAgIG1lLnNldCgpLmhlaWdodCA9IG9sZE1lLnYuaGVpZ2h0OworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBQcm9maWxlTGV2ZWxTZXR0ZXIoCisgICAgICAgICAgICBib29sIG1heUJsb2NrLAorICAgICAgICAgICAgQzJQPEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6b3V0cHV0PiAmbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIGlmICghbWUuRihtZS52LnByb2ZpbGUpLnN1cHBvcnRzQXRBbGwobWUudi5wcm9maWxlKSkgeworI2lmZGVmIE1QRUc0CisgICAgICAgICAgICBtZS5zZXQoKS5wcm9maWxlID0gUFJPRklMRV9NUDRWX1NJTVBMRTsKKyNlbHNlCisgICAgICAgICAgICBtZS5zZXQoKS5wcm9maWxlID0gUFJPRklMRV9IMjYzX0JBU0VMSU5FOworI2VuZGlmCisgICAgICAgIH0KKyAgICAgICAgaWYgKCFtZS5GKG1lLnYubGV2ZWwpLnN1cHBvcnRzQXRBbGwobWUudi5sZXZlbCkpIHsKKyNpZmRlZiBNUEVHNAorICAgICAgICAgICAgbWUuc2V0KCkubGV2ZWwgPSBMRVZFTF9NUDRWXzI7CisjZWxzZQorICAgICAgICAgICAgbWUuc2V0KCkubGV2ZWwgPSBMRVZFTF9IMjYzXzQ1OworI2VuZGlmCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKKyAgICAvLyB1bnNhZmUgZ2V0dGVycworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6aW5wdXQ+IGdldFNpemVfbCgpIGNvbnN0IHsgcmV0dXJuIG1TaXplOyB9CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRnJhbWVSYXRlSW5mbzo6b3V0cHV0PiBnZXRGcmFtZVJhdGVfbCgpIGNvbnN0IHsgcmV0dXJuIG1GcmFtZVJhdGU7IH0KKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CaXRyYXRlSW5mbzo6b3V0cHV0PiBnZXRCaXRyYXRlX2woKSBjb25zdCB7IHJldHVybiBtQml0cmF0ZTsgfQorICAgIHVpbnQzMl90IGdldFN5bmNGcmFtZVBlcmlvZCgpIGNvbnN0IHsKKyAgICAgICAgaWYgKG1TeW5jRnJhbWVQZXJpb2QtPnZhbHVlIDwgMCB8fCBtU3luY0ZyYW1lUGVyaW9kLT52YWx1ZSA9PSBJTlQ2NF9NQVgpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGRvdWJsZSBwZXJpb2QgPSBtU3luY0ZyYW1lUGVyaW9kLT52YWx1ZSAvIDFlNiAqIG1GcmFtZVJhdGUtPnZhbHVlOworICAgICAgICByZXR1cm4gKHVpbnQzMl90KWMyX21heChjMl9taW4ocGVyaW9kICsgMC41LCBkb3VibGUoVUlOVDMyX01BWCkpLCAxLik7CisgICAgfQorCisgICBwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUZvcm1hdENvbmZpZzo6aW5wdXQ+IG1JbnB1dEZvcm1hdDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Gb3JtYXRDb25maWc6Om91dHB1dD4gbU91dHB1dEZvcm1hdDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0TWltZUNvbmZpZzo6aW5wdXQ+IG1JbnB1dE1lZGlhVHlwZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0TWltZUNvbmZpZzo6b3V0cHV0PiBtT3V0cHV0TWVkaWFUeXBlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVVzYWdlVHVuaW5nOjppbnB1dD4gbVVzYWdlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlZpZGVvU2l6ZVN0cmVhbVR1bmluZzo6aW5wdXQ+IG1TaXplOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUZyYW1lUmF0ZUluZm86Om91dHB1dD4gbUZyYW1lUmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCaXRyYXRlVHVuaW5nOjpvdXRwdXQ+IG1CaXRyYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86Om91dHB1dD4gbVByb2ZpbGVMZXZlbDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1TeW5jRnJhbWVJbnRlcnZhbFR1bmluZzo6b3V0cHV0PiBtU3luY0ZyYW1lUGVyaW9kOworfTsKKworQzJTb2Z0TXBlZzRFbmM6OkMyU29mdE1wZWc0RW5jKGNvbnN0IGNoYXIqIG5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+JiBpbnRmSW1wbCkKKyAgICA6IFNpbXBsZUMyQ29tcG9uZW50KAorICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8U2ltcGxlSW50ZXJmYWNlPEludGZJbXBsPj4obmFtZSwgaWQsIGludGZJbXBsKSksCisgICAgICBtSW50ZihpbnRmSW1wbCksCisgICAgICBtSGFuZGxlKG51bGxwdHIpLAorICAgICAgbUVuY1BhcmFtcyhudWxscHRyKSwKKyAgICAgIG1TdGFydGVkKGZhbHNlKSwKKyAgICAgIG1PdXRCdWZmZXJTaXplKDUyNDI4OCkgeworfQorCitDMlNvZnRNcGVnNEVuYzo6fkMyU29mdE1wZWc0RW5jKCkgeworICAgIG9uUmVsZWFzZSgpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRNcGVnNEVuYzo6b25Jbml0KCkgeworI2lmZGVmIE1QRUc0CisgICAgbUVuY29kZU1vZGUgPSBDT01CSU5FX01PREVfV0lUSF9FUlJfUkVTOworI2Vsc2UKKyAgICBtRW5jb2RlTW9kZSA9IEgyNjNfTU9ERTsKKyNlbmRpZgorICAgIGlmICghbUhhbmRsZSkgeworICAgICAgICBtSGFuZGxlID0gbmV3IHRhZ3ZpZGVvRW5jQ29udHJvbHM7CisgICAgfQorCisgICAgaWYgKCFtRW5jUGFyYW1zKSB7CisgICAgICAgIG1FbmNQYXJhbXMgPSBuZXcgdGFndmlkZW9FbmNPcHRpb25zOworICAgIH0KKworICAgIGlmICghKG1FbmNQYXJhbXMgJiYgbUhhbmRsZSkpIHJldHVybiBDMl9OT19NRU1PUlk7CisKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisKKyAgICByZXR1cm4gaW5pdEVuY29kZXIoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0TXBlZzRFbmM6Om9uU3RvcCgpIHsKKyAgICBpZiAoIW1TdGFydGVkKSB7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisgICAgaWYgKG1IYW5kbGUpIHsKKyAgICAgICAgKHZvaWQpUFZDbGVhblVwVmlkZW9FbmNvZGVyKG1IYW5kbGUpOworICAgIH0KKyAgICBtU3RhcnRlZCA9IGZhbHNlOworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3ZvaWQgQzJTb2Z0TXBlZzRFbmM6Om9uUmVzZXQoKSB7CisgICAgb25TdG9wKCk7CisgICAgaW5pdEVuY29kZXIoKTsKK30KKwordm9pZCBDMlNvZnRNcGVnNEVuYzo6b25SZWxlYXNlKCkgeworICAgIG9uU3RvcCgpOworICAgIGlmIChtRW5jUGFyYW1zKSB7CisgICAgICAgIGRlbGV0ZSBtRW5jUGFyYW1zOworICAgICAgICBtRW5jUGFyYW1zID0gbnVsbHB0cjsKKyAgICB9CisgICAgaWYgKG1IYW5kbGUpIHsKKyAgICAgICAgZGVsZXRlIG1IYW5kbGU7CisgICAgICAgIG1IYW5kbGUgPSBudWxscHRyOworICAgIH0KK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0TXBlZzRFbmM6Om9uRmx1c2hfc20oKSB7CisgICAgcmV0dXJuIEMyX09LOworfQorCitzdGF0aWMgdm9pZCBmaWxsRW1wdHlXb3JrKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKSB7CisgICAgdWludDMyX3QgZmxhZ3MgPSAwOworICAgIGlmICh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgZmxhZ3MgfD0gQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgQUxPR1YoInNpZ25hbGxpbmcgZW9zIik7CisgICAgfQorICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdClmbGFnczsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRNcGVnNEVuYzo6aW5pdEVuY1BhcmFtcygpIHsKKyAgICBpZiAobUhhbmRsZSkgeworICAgICAgICBtZW1zZXQobUhhbmRsZSwgMCwgc2l6ZW9mKHRhZ3ZpZGVvRW5jQ29udHJvbHMpKTsKKyAgICB9IGVsc2UgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICBpZiAobUVuY1BhcmFtcykgeworICAgICAgICBtZW1zZXQobUVuY1BhcmFtcywgMCwgc2l6ZW9mKHRhZ3ZpZGVvRW5jT3B0aW9ucykpOworICAgIH0gZWxzZSByZXR1cm4gQzJfQ09SUlVQVEVEOworCisgICAgaWYgKCFQVkdldERlZmF1bHRFbmNPcHRpb24obUVuY1BhcmFtcywgMCkpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBnZXQgZGVmYXVsdCBlbmNvZGluZyBwYXJhbWV0ZXJzIik7CisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorCisgICAgaWYgKG1GcmFtZVJhdGUtPnZhbHVlID09IDApIHsKKyAgICAgICAgQUxPR0UoIkZyYW1lcmF0ZSBzaG91bGQgbm90IGJlIDAiKTsKKyAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICB9CisKKyAgICBtRW5jUGFyYW1zLT5lbmNNb2RlID0gbUVuY29kZU1vZGU7CisgICAgbUVuY1BhcmFtcy0+ZW5jV2lkdGhbMF0gPSBtU2l6ZS0+d2lkdGg7CisgICAgbUVuY1BhcmFtcy0+ZW5jSGVpZ2h0WzBdID0gbVNpemUtPmhlaWdodDsKKyAgICBtRW5jUGFyYW1zLT5lbmNGcmFtZVJhdGVbMF0gPSBtRnJhbWVSYXRlLT52YWx1ZSArIDAuNTsKKyAgICBtRW5jUGFyYW1zLT5yY1R5cGUgPSBWQlJfMTsKKyAgICBtRW5jUGFyYW1zLT52YnZEZWxheSA9IDUuMGY7CisgICAgbUVuY1BhcmFtcy0+cHJvZmlsZV9sZXZlbCA9IENPUkVfUFJPRklMRV9MRVZFTDI7CisgICAgbUVuY1BhcmFtcy0+cGFja2V0U2l6ZSA9IDMyOworICAgIG1FbmNQYXJhbXMtPnJ2bGNFbmFibGUgPSBQVl9PRkY7CisgICAgbUVuY1BhcmFtcy0+bnVtTGF5ZXJzID0gMTsKKyAgICBtRW5jUGFyYW1zLT50aW1lSW5jUmVzID0gMTAwMDsKKyAgICBtRW5jUGFyYW1zLT50aWNrUGVyU3JjID0gbUVuY1BhcmFtcy0+dGltZUluY1JlcyAvIChtRnJhbWVSYXRlLT52YWx1ZSArIDAuNSk7CisgICAgbUVuY1BhcmFtcy0+Yml0UmF0ZVswXSA9IG1CaXRyYXRlLT52YWx1ZTsKKyAgICBtRW5jUGFyYW1zLT5pUXVhbnRbMF0gPSAxNTsKKyAgICBtRW5jUGFyYW1zLT5wUXVhbnRbMF0gPSAxMjsKKyAgICBtRW5jUGFyYW1zLT5xdWFudFR5cGVbMF0gPSAwOworICAgIG1FbmNQYXJhbXMtPm5vRnJhbWVTa2lwcGVkID0gUFZfT0ZGOworCisgICAgLy8gUFYncyBNUEVHNCBlbmNvZGVyIHJlcXVpcmVzIHRoZSB2aWRlbyBkaW1lbnNpb24gb2YgbXVsdGlwbGUKKyAgICBpZiAobVNpemUtPndpZHRoICUgMTYgIT0gMCB8fCBtU2l6ZS0+aGVpZ2h0ICUgMTYgIT0gMCkgeworICAgICAgICBBTE9HRSgiVmlkZW8gZnJhbWUgc2l6ZSAlZHglZCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYiLAorICAgICAgICAgICAgICBtU2l6ZS0+d2lkdGgsIG1TaXplLT5oZWlnaHQpOworICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgIH0KKworICAgIC8vIFNldCBJRFIgZnJhbWUgcmVmcmVzaCBpbnRlcnZhbAorICAgIG1FbmNQYXJhbXMtPmludHJhUGVyaW9kID0gbUludGYtPmdldFN5bmNGcmFtZVBlcmlvZCgpOworICAgIG1FbmNQYXJhbXMtPm51bUludHJhTUIgPSAwOworICAgIG1FbmNQYXJhbXMtPnNjZW5lRGV0ZWN0ID0gUFZfT047CisgICAgbUVuY1BhcmFtcy0+c2VhcmNoUmFuZ2UgPSAxNjsKKyAgICBtRW5jUGFyYW1zLT5tdjh4OEVuYWJsZSA9IFBWX09GRjsKKyAgICBtRW5jUGFyYW1zLT5nb2JIZWFkZXJJbnRlcnZhbCA9IDA7CisgICAgbUVuY1BhcmFtcy0+dXNlQUNQcmVkID0gUFZfT047CisgICAgbUVuY1BhcmFtcy0+aW50cmFEQ1ZsY1RoID0gMDsKKworICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0TXBlZzRFbmM6OmluaXRFbmNvZGVyKCkgeworICAgIGlmIChtU3RhcnRlZCkgeworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorICAgIHsKKyAgICAgICAgSW50ZkltcGw6OkxvY2sgbG9jayA9IG1JbnRmLT5sb2NrKCk7CisgICAgICAgIG1TaXplID0gbUludGYtPmdldFNpemVfbCgpOworICAgICAgICBtQml0cmF0ZSA9IG1JbnRmLT5nZXRCaXRyYXRlX2woKTsKKyAgICAgICAgbUZyYW1lUmF0ZSA9IG1JbnRmLT5nZXRGcmFtZVJhdGVfbCgpOworICAgIH0KKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBpbml0RW5jUGFyYW1zKCk7CisgICAgaWYgKEMyX09LICE9IGVycikgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGluaXRpYWxpemVkIGVuY29kZXIgcGFyYW1zIik7CisgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorICAgIGlmICghUFZJbml0VmlkZW9FbmNvZGVyKG1IYW5kbGUsIG1FbmNQYXJhbXMpKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSB0aGUgZW5jb2RlciIpOworICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KKworICAgIC8vIDFzdCBidWZmZXIgZm9yIGNvZGVjIHNwZWNpZmljIGRhdGEKKyAgICBtTnVtSW5wdXRGcmFtZXMgPSAtMTsKKyAgICBtU3RhcnRlZCA9IHRydWU7CisgICAgcmV0dXJuIEMyX09LOworfQorCit2b2lkIEMyU29mdE1wZWc0RW5jOjpwcm9jZXNzKAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgIC8vIEluaXRpYWxpemUgb3V0cHV0IHdvcmsKKyAgICB3b3JrLT5yZXN1bHQgPSBDMl9PSzsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworICAgIGlmIChtU2lnbmFsbGVkRXJyb3IgfHwgbVNpZ25hbGxlZE91dHB1dEVvcykgeworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9CQURfVkFMVUU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBJbml0aWFsaXplIGVuY29kZXIgaWYgbm90IGFscmVhZHkgaW5pdGlhbGl6ZWQKKyAgICBpZiAoIW1TdGFydGVkICYmIEMyX09LICE9IGluaXRFbmNvZGVyKCkpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBpbml0aWFsaXplIGVuY29kZXIiKTsKKyAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IGJsb2NrOworICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgPSB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfTsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBwb29sLT5mZXRjaExpbmVhckJsb2NrKG1PdXRCdWZmZXJTaXplLCB1c2FnZSwgJmJsb2NrKTsKKyAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dFKCJmZXRjaExpbmVhckJsb2NrIGZvciBPdXRwdXQgZmFpbGVkIHdpdGggc3RhdHVzICVkIiwgZXJyKTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfTk9fTUVNT1JZOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQzJXcml0ZVZpZXcgd1ZpZXcgPSBibG9jay0+bWFwKCkuZ2V0KCk7CisgICAgaWYgKHdWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgQUxPR0UoIndyaXRlIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHdWaWV3LmVycm9yKCkpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSB3Vmlldy5lcnJvcigpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgdWludDhfdCAqb3V0UHRyID0gKHVpbnQ4X3QgKil3Vmlldy5kYXRhKCk7CisgICAgaWYgKG1OdW1JbnB1dEZyYW1lcyA8IDApIHsKKyAgICAgICAgLy8gVGhlIHZlcnkgZmlyc3QgdGhpbmcgd2Ugd2FudCB0byBvdXRwdXQgaXMgdGhlIGNvZGVjIHNwZWNpZmljIGRhdGEuCisgICAgICAgIGludDMyX3Qgb3V0cHV0U2l6ZSA9IG1PdXRCdWZmZXJTaXplOworICAgICAgICBpZiAoIVBWR2V0Vm9sSGVhZGVyKG1IYW5kbGUsIG91dFB0ciwgJm91dHB1dFNpemUsIDApKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGdldCBWT0wgaGVhZGVyIik7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR1YoIkJ5dGVzIEdlbmVyYXRlZCBpbiBoZWFkZXIgJWRcbiIsIG91dHB1dFNpemUpOworICAgICAgICB9CisKKyAgICAgICAgKyttTnVtSW5wdXRGcmFtZXM7CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlN0cmVhbUNzZEluZm86Om91dHB1dD4gY3NkID0KKyAgICAgICAgICAgIEMyU3RyZWFtQ3NkSW5mbzo6b3V0cHV0OjpBbGxvY1VuaXF1ZShvdXRwdXRTaXplLCAwdSk7CisgICAgICAgIGlmICghY3NkKSB7CisgICAgICAgICAgICBBTE9HRSgiQ1NEIGFsbG9jYXRpb24gZmFpbGVkIik7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfTk9fTUVNT1JZOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIG1lbWNweShjc2QtPm0udmFsdWUsIG91dFB0ciwgb3V0cHV0U2l6ZSk7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUucHVzaF9iYWNrKHN0ZDo6bW92ZShjc2QpKTsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJHcmFwaGljVmlldz4gclZpZXc7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBpbnB1dEJ1ZmZlcjsKKyAgICBib29sIGVvcyA9ICgod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSAhPSAwKTsKKyAgICBpZiAoIXdvcmstPmlucHV0LmJ1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICBpbnB1dEJ1ZmZlciA9IHdvcmstPmlucHV0LmJ1ZmZlcnNbMF07CisgICAgICAgIHJWaWV3ID0gc3RkOjptYWtlX3NoYXJlZDxjb25zdCBDMkdyYXBoaWNWaWV3PigKKyAgICAgICAgICAgICAgICBpbnB1dEJ1ZmZlci0+ZGF0YSgpLmdyYXBoaWNCbG9ja3MoKS5mcm9udCgpLm1hcCgpLmdldCgpKTsKKyAgICAgICAgaWYgKHJWaWV3LT5lcnJvcigpICE9IEMyX09LKSB7CisgICAgICAgICAgICBBTE9HRSgiZ3JhcGhpYyB2aWV3IG1hcCBlcnIgPSAlZCIsIHJWaWV3LT5lcnJvcigpKTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IHJWaWV3LT5lcnJvcigpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICAgICAgaWYgKGVvcykgeworICAgICAgICAgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IHRydWU7CisgICAgICAgICAgICBBTE9HVigic2lnbmFsbGVkIEVPUyIpOworICAgICAgICB9CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB1aW50NjRfdCBpbnB1dFRpbWVTdGFtcCA9IHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1bGwoKTsKKyAgICBjb25zdCBDMkNvbnN0R3JhcGhpY0Jsb2NrIGluQnVmZmVyID0gaW5wdXRCdWZmZXItPmRhdGEoKS5ncmFwaGljQmxvY2tzKCkuZnJvbnQoKTsKKyAgICBpZiAoaW5CdWZmZXIud2lkdGgoKSA8IG1TaXplLT53aWR0aCB8fAorICAgICAgICBpbkJ1ZmZlci5oZWlnaHQoKSA8IG1TaXplLT5oZWlnaHQpIHsKKyAgICAgICAgLyogRXhwZWN0IHdpZHRoIGhlaWdodCB0byBiZSBjb25maWd1cmVkICovCisgICAgICAgIEFMT0dXKCJ1bmV4cGVjdGVkIENhcGFjaXR5IEFzcGVjdCAlZCglZCkgeCAlZCglZCkiLCBpbkJ1ZmZlci53aWR0aCgpLAorICAgICAgICAgICAgICBtU2l6ZS0+d2lkdGgsIGluQnVmZmVyLmhlaWdodCgpLCBtU2l6ZS0+aGVpZ2h0KTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQkFEX1ZBTFVFOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgY29uc3QgQzJQbGFuYXJMYXlvdXQgJmxheW91dCA9IHJWaWV3LT5sYXlvdXQoKTsKKyAgICB1aW50OF90ICp5UGxhbmUgPSBjb25zdF9jYXN0PHVpbnQ4X3QgKj4oclZpZXctPmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfWV0pOworICAgIHVpbnQ4X3QgKnVQbGFuZSA9IGNvbnN0X2Nhc3Q8dWludDhfdCAqPihyVmlldy0+ZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXSk7CisgICAgdWludDhfdCAqdlBsYW5lID0gY29uc3RfY2FzdDx1aW50OF90ICo+KHJWaWV3LT5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdKTsKKyAgICBpbnQzMl90IHlTdHJpZGUgPSBsYXlvdXQucGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXS5yb3dJbmM7CisgICAgaW50MzJfdCB1U3RyaWRlID0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVV0ucm93SW5jOworICAgIGludDMyX3QgdlN0cmlkZSA9IGxheW91dC5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdLnJvd0luYzsKKyAgICB1aW50MzJfdCB3aWR0aCA9IG1TaXplLT53aWR0aDsKKyAgICB1aW50MzJfdCBoZWlnaHQgPSBtU2l6ZS0+aGVpZ2h0OworICAgIC8vIHdpZHRoIGFuZCBoZWlnaHQgYXJlIGFsd2F5cyBldmVuIChhcyBibG9jayBzaXplIGlzIDE2eDE2KQorICAgIENIRUNLX0VRKCh3aWR0aCAmIDF1KSwgMHUpOworICAgIENIRUNLX0VRKChoZWlnaHQgJiAxdSksIDB1KTsKKyAgICBzaXplX3QgeVBsYW5lU2l6ZSA9IHdpZHRoICogaGVpZ2h0OworICAgIHN3aXRjaCAobGF5b3V0LnR5cGUpIHsKKyAgICAgICAgY2FzZSBDMlBsYW5hckxheW91dDo6VFlQRV9SR0I6CisgICAgICAgICAgICBbW2ZhbGx0aHJvdWdoXV07CisgICAgICAgIGNhc2UgQzJQbGFuYXJMYXlvdXQ6OlRZUEVfUkdCQTogeworICAgICAgICAgICAgTWVtb3J5QmxvY2sgY29udmVyc2lvbkJ1ZmZlciA9IG1Db252ZXJzaW9uQnVmZmVycy5mZXRjaCh5UGxhbmVTaXplICogMyAvIDIpOworICAgICAgICAgICAgbUNvbnZlcnNpb25CdWZmZXJzSW5Vc2UuZW1wbGFjZShjb252ZXJzaW9uQnVmZmVyLmRhdGEoKSwgY29udmVyc2lvbkJ1ZmZlcik7CisgICAgICAgICAgICB5UGxhbmUgPSBjb252ZXJzaW9uQnVmZmVyLmRhdGEoKTsKKyAgICAgICAgICAgIHVQbGFuZSA9IHlQbGFuZSArIHlQbGFuZVNpemU7CisgICAgICAgICAgICB2UGxhbmUgPSB1UGxhbmUgKyB5UGxhbmVTaXplIC8gNDsKKyAgICAgICAgICAgIHlTdHJpZGUgPSB3aWR0aDsKKyAgICAgICAgICAgIHVTdHJpZGUgPSB2U3RyaWRlID0gd2lkdGggLyAyOworICAgICAgICAgICAgQ29udmVydFJHQlRvUGxhbmFyWVVWKHlQbGFuZSwgeVN0cmlkZSwgaGVpZ2h0LCBjb252ZXJzaW9uQnVmZmVyLnNpemUoKSwgKnJWaWV3LmdldCgpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgQzJQbGFuYXJMYXlvdXQ6OlRZUEVfWVVWOiB7CisgICAgICAgICAgICBpZiAoIUlzWVVWNDIwKCpyVmlldykpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiaW5wdXQgaXMgbm90IFlVVjQyMCIpOworICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1ldLmNvbEluYyA9PSAxCisgICAgICAgICAgICAgICAgICAgICYmIGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1VdLmNvbEluYyA9PSAxCisgICAgICAgICAgICAgICAgICAgICYmIGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1ZdLmNvbEluYyA9PSAxCisgICAgICAgICAgICAgICAgICAgICYmIHVTdHJpZGUgPT0gdlN0cmlkZQorICAgICAgICAgICAgICAgICAgICAmJiB5U3RyaWRlID09IDIgKiB2U3RyaWRlKSB7CisgICAgICAgICAgICAgICAgLy8gSTQyMCBjb21wYXRpYmxlIC0gcGxhbmVzIGFyZSBhbHJlYWR5IHNldCB1cCBhYm92ZQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBjb3B5IHRvIEk0MjAKKyAgICAgICAgICAgIE1lbW9yeUJsb2NrIGNvbnZlcnNpb25CdWZmZXIgPSBtQ29udmVyc2lvbkJ1ZmZlcnMuZmV0Y2goeVBsYW5lU2l6ZSAqIDMgLyAyKTsKKyAgICAgICAgICAgIG1Db252ZXJzaW9uQnVmZmVyc0luVXNlLmVtcGxhY2UoY29udmVyc2lvbkJ1ZmZlci5kYXRhKCksIGNvbnZlcnNpb25CdWZmZXIpOworICAgICAgICAgICAgTWVkaWFJbWFnZTIgaW1nID0gQ3JlYXRlWVVWNDIwUGxhbmFyTWVkaWFJbWFnZTIod2lkdGgsIGhlaWdodCwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBJbWFnZUNvcHkoY29udmVyc2lvbkJ1ZmZlci5kYXRhKCksICZpbWcsICpyVmlldyk7CisgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkJ1ZmZlciBjb252ZXJzaW9uIGZhaWxlZDogJWQiLCBlcnIpOworICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICB5UGxhbmUgPSBjb252ZXJzaW9uQnVmZmVyLmRhdGEoKTsKKyAgICAgICAgICAgIHVQbGFuZSA9IHlQbGFuZSArIHlQbGFuZVNpemU7CisgICAgICAgICAgICB2UGxhbmUgPSB1UGxhbmUgKyB5UGxhbmVTaXplIC8gNDsKKyAgICAgICAgICAgIHlTdHJpZGUgPSB3aWR0aDsKKyAgICAgICAgICAgIHVTdHJpZGUgPSB2U3RyaWRlID0gd2lkdGggLyAyOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIEMyUGxhbmFyTGF5b3V0OjpUWVBFX1lVVkE6CisgICAgICAgICAgICBBTE9HRSgiWVVWQSBwbGFuZSB0eXBlIGlzIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR0UoIlVucmVjb2duaXplZCBwbGFuZSB0eXBlOiAlZCIsIGxheW91dC50eXBlKTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBDSEVDSyhOVUxMICE9IHlQbGFuZSk7CisgICAgLyogRW5jb2RlIGZyYW1lcyAqLworICAgIFZpZGVvRW5jRnJhbWVJTyB2aW4sIHZvdXQ7CisgICAgbWVtc2V0KCZ2aW4sIDAsIHNpemVvZih2aW4pKTsKKyAgICBtZW1zZXQoJnZvdXQsIDAsIHNpemVvZih2b3V0KSk7CisgICAgdmluLnlDaGFuID0geVBsYW5lOworICAgIHZpbi51Q2hhbiA9IHVQbGFuZTsKKyAgICB2aW4udkNoYW4gPSB2UGxhbmU7CisgICAgdmluLnRpbWVzdGFtcCA9IChpbnB1dFRpbWVTdGFtcCArIDUwMCkgLyAxMDAwOyAgLy8gaW4gbXMKKyAgICB2aW4uaGVpZ2h0ID0gYWxpZ24oaGVpZ2h0LCAxNik7CisgICAgdmluLnBpdGNoID0gYWxpZ24od2lkdGgsIDE2KTsKKworICAgIHVpbnQzMl90IG1vZFRpbWVNcyA9IDA7CisgICAgaW50MzJfdCBuTGF5ZXIgPSAwOworICAgIE1QNEhpbnRUcmFjayBoaW50VHJhY2s7CisgICAgaW50MzJfdCBvdXRwdXRTaXplID0gbU91dEJ1ZmZlclNpemU7CisgICAgaWYgKCFQVkVuY29kZVZpZGVvRnJhbWUobUhhbmRsZSwgJnZpbiwgJnZvdXQsICZtb2RUaW1lTXMsIG91dFB0ciwgJm91dHB1dFNpemUsICZuTGF5ZXIpIHx8CisgICAgICAgICFQVkdldEhpbnRUcmFjayhtSGFuZGxlLCAmaGludFRyYWNrKSkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGVuY29kZSBmcmFtZSBvciBnZXQgaGludCB0cmFjayBhdCBmcmFtZSAlIiBQUklkNjQsIG1OdW1JbnB1dEZyYW1lcyk7CisgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBTE9HVigib3V0cHV0U2l6ZSBmaWxsZWQgOiAlZCIsIG91dHB1dFNpemUpOworICAgICsrbU51bUlucHV0RnJhbWVzOworICAgIENIRUNLKE5VTEwgPT0gUFZHZXRPdmVycnVuQnVmZmVyKG1IYW5kbGUpKTsKKworICAgIGZpbGxFbXB0eVdvcmsod29yayk7CisgICAgaWYgKG91dHB1dFNpemUpIHsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBidWZmZXIgPSBjcmVhdGVMaW5lYXJCdWZmZXIoYmxvY2ssIDAsIG91dHB1dFNpemUpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbC50aW1lc3RhbXAgPSBpbnB1dFRpbWVTdGFtcDsKKyAgICAgICAgaWYgKGhpbnRUcmFjay5Db2RlVHlwZSA9PSAwKSB7CisgICAgICAgICAgICBidWZmZXItPnNldEluZm8oc3RkOjptYWtlX3NoYXJlZDxDMlN0cmVhbVBpY3R1cmVUeXBlTWFza0luZm86Om91dHB1dD4oCisgICAgICAgICAgICAgICAgICAgIDB1IC8qIHN0cmVhbSBpZCAqLywgQzJQaWN0dXJlVHlwZUtleUZyYW1lKSk7CisgICAgICAgIH0KKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMucHVzaF9iYWNrKGJ1ZmZlcik7CisgICAgfQorICAgIGlmIChlb3MpIHsKKyAgICAgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IHRydWU7CisgICAgfQorCisgICAgbUNvbnZlcnNpb25CdWZmZXJzSW5Vc2UuZXJhc2UoeVBsYW5lKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0TXBlZzRFbmM6OmRyYWluKAorICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAodm9pZClwb29sOworICAgIGlmIChkcmFpbk1vZGUgPT0gTk9fRFJBSU4pIHsKKyAgICAgICAgQUxPR1coImRyYWluIHdpdGggTk9fRFJBSU46IG5vLW9wIik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisgICAgaWYgKGRyYWluTW9kZSA9PSBEUkFJTl9DSEFJTikgeworICAgICAgICBBTE9HVygiRFJBSU5fQ0hBSU4gbm90IHN1cHBvcnRlZCIpOworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2NsYXNzIEMyU29mdE1wZWc0RW5jRmFjdG9yeSA6IHB1YmxpYyBDMkNvbXBvbmVudEZhY3RvcnkgeworcHVibGljOgorICAgIEMyU29mdE1wZWc0RW5jRmFjdG9yeSgpCisgICAgICAgIDogbUhlbHBlcihzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJSZWZsZWN0b3JIZWxwZXI+KAorICAgICAgICAgICAgICBHZXRDb2RlYzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCktPmdldFBhcmFtUmVmbGVjdG9yKCkpKSB7fQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVDb21wb25lbnQoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KiBjb25zdCBjb21wb25lbnQsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnQqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqY29tcG9uZW50ID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PigKKyAgICAgICAgICAgIG5ldyBDMlNvZnRNcGVnNEVuYygKKyAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwgaWQsCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRNcGVnNEVuYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KiBjb25zdCBpbnRlcmZhY2UsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnRJbnRlcmZhY2UqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqaW50ZXJmYWNlID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPigKKyAgICAgICAgICAgIG5ldyBTaW1wbGVJbnRlcmZhY2U8QzJTb2Z0TXBlZzRFbmM6OkludGZJbXBsPigKKyAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwgaWQsCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRNcGVnNEVuYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCB+QzJTb2Z0TXBlZzRFbmNGYWN0b3J5KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gbUhlbHBlcjsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2V4dGVybiAiQyIgOjpDMkNvbXBvbmVudEZhY3RvcnkqIENyZWF0ZUNvZGVjMkZhY3RvcnkoKSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIHJldHVybiBuZXcgOjphbmRyb2lkOjpDMlNvZnRNcGVnNEVuY0ZhY3RvcnkoKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5KiBmYWN0b3J5KSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIGRlbGV0ZSBmYWN0b3J5OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzRfaDI2My9DMlNvZnRNcGVnNEVuYy5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzRfaDI2My9DMlNvZnRNcGVnNEVuYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzNDYxZmMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL0MyU29mdE1wZWc0RW5jLmgKQEAgLTAsMCArMSw4MyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDMl9TT0ZUX01QRUc0X0VOQ19IX18KKyNkZWZpbmUgQzJfU09GVF9NUEVHNF9FTkNfSF9fCisKKyNpbmNsdWRlIDxtYXA+CisKKyNpbmNsdWRlIDxDb2RlYzJCdWZmZXJVdGlscy5oPgorI2luY2x1ZGUgPFNpbXBsZUMyQ29tcG9uZW50Lmg+CisKKyNpbmNsdWRlICJtcDRlbmNfYXBpLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEMyU29mdE1wZWc0RW5jIDogcHVibGljIFNpbXBsZUMyQ29tcG9uZW50IHsKKyAgICBjbGFzcyBJbnRmSW1wbDsKKworICAgIEMyU29mdE1wZWc0RW5jKGNvbnN0IGNoYXIqIG5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+JiBpbnRmSW1wbCk7CisKKyAgICAvLyBGcm9tIFNpbXBsZUMyQ29tcG9uZW50CisgICAgYzJfc3RhdHVzX3Qgb25Jbml0KCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25TdG9wKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlc2V0KCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlbGVhc2UoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvbkZsdXNoX3NtKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBwcm9jZXNzKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBkcmFpbigKKyAgICAgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworCitwcm90ZWN0ZWQ6CisKKyAgICB2aXJ0dWFsIH5DMlNvZnRNcGVnNEVuYygpOworCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gbUludGY7CisKKyAgICB0YWd2aWRlb0VuY0NvbnRyb2xzICptSGFuZGxlOworICAgIHRhZ3ZpZGVvRW5jT3B0aW9ucyAgKm1FbmNQYXJhbXM7CisKKyAgICBib29sICAgICBtU3RhcnRlZDsKKyAgICBib29sICAgICBtU2lnbmFsbGVkT3V0cHV0RW9zOworICAgIGJvb2wgICAgIG1TaWduYWxsZWRFcnJvcjsKKworICAgIHVpbnQzMl90IG1PdXRCdWZmZXJTaXplOworICAgIC8vIGNvbmZpZ3VyYXRpb25zIHVzZWQgYnkgY29tcG9uZW50IGluIHByb2Nlc3MKKyAgICAvLyAoVE9ETzoga2VlcCB0aGlzIGluIGludGYgYnV0IG1ha2UgdGhlbSBpbnRlcm5hbCBvbmx5KQorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6aW5wdXQ+IG1TaXplOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUZyYW1lUmF0ZUluZm86Om91dHB1dD4gbUZyYW1lUmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CaXRyYXRlSW5mbzo6b3V0cHV0PiBtQml0cmF0ZTsKKworICAgIGludDY0X3QgIG1OdW1JbnB1dEZyYW1lczsKKyAgICBNUDRFbmNvZGluZ01vZGUgbUVuY29kZU1vZGU7CisKKyAgICBNZW1vcnlCbG9ja1Bvb2wgbUNvbnZlcnNpb25CdWZmZXJzOworICAgIHN0ZDo6bWFwPHZvaWQgKiwgTWVtb3J5QmxvY2s+IG1Db252ZXJzaW9uQnVmZmVyc0luVXNlOworCisgICAgYzJfc3RhdHVzX3QgaW5pdEVuY1BhcmFtcygpOworICAgIGMyX3N0YXR1c190IGluaXRFbmNvZGVyKCk7CisKKyAgICBDMl9ET19OT1RfQ09QWShDMlNvZnRNcGVnNEVuYyk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEMyX1NPRlRfTVBFRzRfRU5DX0hfXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzRfaDI2My9NT0RVTEVfTElDRU5TRV9BUEFDSEUyIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzRfaDI2My9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvTk9USUNFIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzRfaDI2My9OT1RJQ0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzViMWVmYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvTk9USUNFCkBAIC0wLDAgKzEsMTkwIEBACisKKyAgIENvcHlyaWdodCAoYykgMjAwNS0yMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAorICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLworCisgICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KKworICAgMS4gRGVmaW5pdGlvbnMuCisKKyAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCisgICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KKworICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKKyAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KKworICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAorICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgorICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKKyAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQorICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKKyAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQorICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KKworICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KKworICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCisgICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCisgICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgorCisgICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAorICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAorICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAorICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgorCisgICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgorICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQorICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCisgICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgorCisgICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0CisgICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCisgICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCisgICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcworICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCisgICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCisgICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgorCisgICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZworICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucworICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5CisgICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCisgICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKKyAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgorICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAorICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KKyAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCisgICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQorICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0CisgICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQorICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCisKKyAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKKyAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgorCisgICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKKyAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQorICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KKworICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCisgICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKKyAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCisgICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgorICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQorICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKKyAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCisgICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCisgICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAorICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcworICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCisgICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCisKKyAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCisgICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKKyAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91CisgICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKKyAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAorCisgICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCisgICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCisKKyAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcworICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKKyAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAorICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKKyAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCisKKyAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cworICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKKyAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKKyAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKKyAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKKyAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAorICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKKyAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKKyAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCisgICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCisgICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAorICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCisgICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKKyAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKKyAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKKyAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCisKKyAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAorICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgorICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCisgICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKKyAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCisKKyAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKKyAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaworICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgorICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQorICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKKyAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KKworICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQorICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAorICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCisgICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KKworICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCisgICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCisgICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKKyAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKKyAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQorICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55CisgICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCisKKyAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAorICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCisgICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQorICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKKyAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKKyAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQorICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQorICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAorICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKKyAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKKyAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KKworICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZworICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKKyAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCisgICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcworICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKKyAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCisgICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCisgICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKKyAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KKyAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgorCisgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzRfaDI2My9wYXRlbnRfZGlzY2xhaW1lci50eHQgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL3BhdGVudF9kaXNjbGFpbWVyLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGJmMTFkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzRfaDI2My9wYXRlbnRfZGlzY2xhaW1lci50eHQKQEAgLTAsMCArMSw5IEBACisKK1RISVMgSVMgTk9UIEEgR1JBTlQgT0YgUEFURU5UIFJJR0hUUy4KKworR29vZ2xlIG1ha2VzIG5vIHJlcHJlc2VudGF0aW9uIG9yIHdhcnJhbnR5IHRoYXQgdGhlIGNvZGVjcyBmb3Igd2hpY2gKK3NvdXJjZSBjb2RlIGlzIG1hZGUgYXZhaWxhYmxlIGhlcmV1bmRlciBhcmUgdW5lbmN1bWJlcmVkIGJ5Cit0aGlyZC1wYXJ0eSBwYXRlbnRzLiAgVGhvc2UgaW50ZW5kaW5nIHRvIHVzZSB0aGlzIHNvdXJjZSBjb2RlIGluCitoYXJkd2FyZSBvciBzb2Z0d2FyZSBwcm9kdWN0cyBhcmUgYWR2aXNlZCB0aGF0IGltcGxlbWVudGF0aW9ucyBvZgordGhlc2UgY29kZWNzLCBpbmNsdWRpbmcgaW4gb3BlbiBzb3VyY2Ugc29mdHdhcmUgb3Igc2hhcmV3YXJlLCBtYXkKK3JlcXVpcmUgcGF0ZW50IGxpY2Vuc2VzIGZyb20gdGhlIHJlbGV2YW50IHBhdGVudCBob2xkZXJzLgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvb3B1cy9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvb3B1cy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0MGNkYjkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9vcHVzL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwxMSBAQAorY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9vcHVzZGVjIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfc2FuaXRpemVfYWxsLWRlZmF1bHRzIiwKKyAgICBdLAorCisgICAgc3JjczogWyJDMlNvZnRPcHVzRGVjLmNwcCJdLAorCisgICAgc2hhcmVkX2xpYnM6IFsibGlib3B1cyJdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvb3B1cy9DMlNvZnRPcHVzRGVjLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL29wdXMvQzJTb2Z0T3B1c0RlYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQzOWMzYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL29wdXMvQzJTb2Z0T3B1c0RlYy5jcHAKQEAgLTAsMCArMSw1NDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyU29mdE9wdXNEZWMiCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaD4KKworI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8U2ltcGxlQzJJbnRlcmZhY2UuaD4KKworI2luY2x1ZGUgIkMyU29mdE9wdXNEZWMuaCIKKworZXh0ZXJuICJDIiB7CisgICAgI2luY2x1ZGUgPG9wdXMuaD4KKyAgICAjaW5jbHVkZSA8b3B1c19tdWx0aXN0cmVhbS5oPgorfQorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NvbnN0ZXhwciBjaGFyIENPTVBPTkVOVF9OQU1FW10gPSAiYzIuYW5kcm9pZC5vcHVzLmRlY29kZXIiOworCitjbGFzcyBDMlNvZnRPcHVzRGVjOjpJbnRmSW1wbCA6IHB1YmxpYyBDMkludGVyZmFjZUhlbHBlciB7CisgICBwdWJsaWM6CisgICAgZXhwbGljaXQgSW50ZkltcGwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiYgaGVscGVyKQorICAgICAgICA6IEMySW50ZXJmYWNlSGVscGVyKGhlbHBlcikgeworICAgICAgICBzZXREZXJpdmVkSW5zdGFuY2UodGhpcyk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dEZvcm1hdCwgQzJfTkFNRV9JTlBVVF9TVFJFQU1fRk9STUFUX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbUZvcm1hdENvbmZpZzo6aW5wdXQoMHUsIEMyRm9ybWF0Q29tcHJlc3NlZCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtT3V0cHV0Rm9ybWF0LCBDMl9OQU1FX09VVFBVVF9TVFJFQU1fRk9STUFUX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbUZvcm1hdENvbmZpZzo6b3V0cHV0KDB1LCBDMkZvcm1hdEF1ZGlvKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dE1lZGlhVHlwZSwgQzJfTkFNRV9JTlBVVF9QT1JUX01JTUVfU0VUVElORykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoQWxsb2NTaGFyZWRTdHJpbmc8QzJQb3J0TWltZUNvbmZpZzo6aW5wdXQ+KAorICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fT1BVUykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtT3V0cHV0TWVkaWFUeXBlLCBDMl9OQU1FX09VVFBVVF9QT1JUX01JTUVfU0VUVElORykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoQWxsb2NTaGFyZWRTdHJpbmc8QzJQb3J0TWltZUNvbmZpZzo6b3V0cHV0PigKKyAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX1JBVykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtU2FtcGxlUmF0ZSwgQzJfTkFNRV9TVFJFQU1fU0FNUExFX1JBVEVfU0VUVElORykKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86Om91dHB1dCgwdSwgNDgwMDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobVNhbXBsZVJhdGUsIHZhbHVlKS5lcXVhbFRvKDQ4MDAwKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoKFNldHRlcjxkZWNsdHlwZSgqbVNhbXBsZVJhdGUpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1DaGFubmVsQ291bnQsIEMyX05BTUVfU1RSRUFNX0NIQU5ORUxfQ09VTlRfU0VUVElORykKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6b3V0cHV0KDB1LCAxKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1DaGFubmVsQ291bnQsIHZhbHVlKS5pblJhbmdlKDEsIDgpfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1DaGFubmVsQ291bnQpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUJpdHJhdGUsIEMyX05BTUVfU1RSRUFNX0JJVFJBVEVfU0VUVElORykKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyQml0cmF0ZVR1bmluZzo6aW5wdXQoMHUsIDYwMDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUJpdHJhdGUsIHZhbHVlKS5pblJhbmdlKDYwMDAsIDUxMDAwMCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbUJpdHJhdGUpPjo6Tm9uU3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0TWF4QnVmU2l6ZSwgQzJfUEFSQU1LRVlfSU5QVVRfTUFYX0JVRkZFUl9TSVpFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQoMHUsIDk2MCAqIDYpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICB9CisKKyAgIHByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRm9ybWF0Q29uZmlnOjppbnB1dD4gbUlucHV0Rm9ybWF0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUZvcm1hdENvbmZpZzo6b3V0cHV0PiBtT3V0cHV0Rm9ybWF0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRNaW1lQ29uZmlnOjppbnB1dD4gbUlucHV0TWVkaWFUeXBlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRNaW1lQ29uZmlnOjpvdXRwdXQ+IG1PdXRwdXRNZWRpYVR5cGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86Om91dHB1dD4gbVNhbXBsZVJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6b3V0cHV0PiBtQ2hhbm5lbENvdW50OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJpdHJhdGVUdW5pbmc6OmlucHV0PiBtQml0cmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQ+IG1JbnB1dE1heEJ1ZlNpemU7Cit9OworCitDMlNvZnRPcHVzRGVjOjpDMlNvZnRPcHVzRGVjKGNvbnN0IGNoYXIgKm5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiYgaW50ZkltcGwpCisgICAgOiBTaW1wbGVDMkNvbXBvbmVudCgKKyAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxTaW1wbGVJbnRlcmZhY2U8SW50ZkltcGw+PihuYW1lLCBpZCwgaW50ZkltcGwpKSwKKyAgICAgIG1JbnRmKGludGZJbXBsKSwKKyAgICAgIG1EZWNvZGVyKG51bGxwdHIpIHsKK30KKworQzJTb2Z0T3B1c0RlYzo6fkMyU29mdE9wdXNEZWMoKSB7CisgICAgb25SZWxlYXNlKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdE9wdXNEZWM6Om9uSW5pdCgpIHsKKyAgICBzdGF0dXNfdCBlcnIgPSBpbml0RGVjb2RlcigpOworICAgIHJldHVybiBlcnIgPT0gT0sgPyBDMl9PSyA6IEMyX05PX01FTU9SWTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0T3B1c0RlYzo6b25TdG9wKCkgeworICAgIGlmIChtRGVjb2RlcikgeworICAgICAgICBvcHVzX211bHRpc3RyZWFtX2RlY29kZXJfZGVzdHJveShtRGVjb2Rlcik7CisgICAgICAgIG1EZWNvZGVyID0gbnVsbHB0cjsKKyAgICB9CisgICAgbWVtc2V0KCZtSGVhZGVyLCAwLCBzaXplb2YobUhlYWRlcikpOworICAgIG1Db2RlY0RlbGF5ID0gMDsKKyAgICBtU2Vla1ByZVJvbGwgPSAwOworICAgIG1TYW1wbGVzVG9EaXNjYXJkID0gMDsKKyAgICBtSW5wdXRCdWZmZXJDb3VudCA9IDA7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworCisgICAgcmV0dXJuIEMyX09LOworfQorCit2b2lkIEMyU29mdE9wdXNEZWM6Om9uUmVzZXQoKSB7CisgICAgKHZvaWQpb25TdG9wKCk7Cit9CisKK3ZvaWQgQzJTb2Z0T3B1c0RlYzo6b25SZWxlYXNlKCkgeworICAgIGlmIChtRGVjb2RlcikgeworICAgICAgICBvcHVzX211bHRpc3RyZWFtX2RlY29kZXJfZGVzdHJveShtRGVjb2Rlcik7CisgICAgICAgIG1EZWNvZGVyID0gbnVsbHB0cjsKKyAgICB9Cit9CisKK3N0YXR1c190IEMyU29mdE9wdXNEZWM6OmluaXREZWNvZGVyKCkgeworICAgIG1lbXNldCgmbUhlYWRlciwgMCwgc2l6ZW9mKG1IZWFkZXIpKTsKKyAgICBtQ29kZWNEZWxheSA9IDA7CisgICAgbVNlZWtQcmVSb2xsID0gMDsKKyAgICBtU2FtcGxlc1RvRGlzY2FyZCA9IDA7CisgICAgbUlucHV0QnVmZmVyQ291bnQgPSAwOworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKworICAgIHJldHVybiBPSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0T3B1c0RlYzo6b25GbHVzaF9zbSgpIHsKKyAgICBpZiAobURlY29kZXIpIHsKKyAgICAgICAgb3B1c19tdWx0aXN0cmVhbV9kZWNvZGVyX2N0bChtRGVjb2RlciwgT1BVU19SRVNFVF9TVEFURSk7CisgICAgICAgIG1TYW1wbGVzVG9EaXNjYXJkID0gbVNlZWtQcmVSb2xsOworICAgICAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisgICAgfQorICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0T3B1c0RlYzo6ZHJhaW4oCisgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgICh2b2lkKSBwb29sOworICAgIGlmIChkcmFpbk1vZGUgPT0gTk9fRFJBSU4pIHsKKyAgICAgICAgQUxPR1coImRyYWluIHdpdGggTk9fRFJBSU46IG5vLW9wIik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisgICAgaWYgKGRyYWluTW9kZSA9PSBEUkFJTl9DSEFJTikgeworICAgICAgICBBTE9HVygiRFJBSU5fQ0hBSU4gbm90IHN1cHBvcnRlZCIpOworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3N0YXRpYyB2b2lkIGZpbGxFbXB0eVdvcmsoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworfQorCitzdGF0aWMgdWludDE2X3QgUmVhZExFMTYoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCByZWFkX29mZnNldCkgeworICAgIGlmIChyZWFkX29mZnNldCArIDEgPiBkYXRhX3NpemUpCisgICAgICAgIHJldHVybiAwOworICAgIHVpbnQxNl90IHZhbDsKKyAgICB2YWwgPSBkYXRhW3JlYWRfb2Zmc2V0XTsKKyAgICB2YWwgfD0gZGF0YVtyZWFkX29mZnNldCArIDFdIDw8IDg7CisgICAgcmV0dXJuIHZhbDsKK30KKworc3RhdGljIGNvbnN0IGludCBrUmF0ZSA9IDQ4MDAwOworCisvLyBPcHVzIHVzZXMgVm9yYmlzIGNoYW5uZWwgbWFwcGluZywgYW5kIFZvcmJpcyBjaGFubmVsIG1hcHBpbmcgc3BlY2lmaWVzCisvLyBtYXBwaW5ncyBmb3IgdXAgdG8gOCBjaGFubmVscy4gVGhpcyBpbmZvcm1hdGlvbiBpcyBwYXJ0IG9mIHRoZSBWb3JiaXMgSQorLy8gU3BlY2lmaWNhdGlvbjoKKy8vIGh0dHA6Ly93d3cueGlwaC5vcmcvdm9yYmlzL2RvYy9Wb3JiaXNfSV9zcGVjLmh0bWwKK3N0YXRpYyBjb25zdCBpbnQga01heENoYW5uZWxzID0gODsKKworLy8gTWF4aW11bSBwYWNrZXQgc2l6ZSB1c2VkIGluIFhpcGgncyBvcHVzZGVjLgorc3RhdGljIGNvbnN0IGludCBrTWF4T3B1c091dHB1dFBhY2tldFNpemVTYW1wbGVzID0gOTYwICogNjsKKworLy8gRGVmYXVsdCBhdWRpbyBvdXRwdXQgY2hhbm5lbCBsYXlvdXQuIFVzZWQgdG8gaW5pdGlhbGl6ZSB8c3RyZWFtX21hcHwgaW4KKy8vIE9wdXNIZWFkZXIsIGFuZCBwYXNzZWQgdG8gb3B1c19tdWx0aXN0cmVhbV9kZWNvZGVyX2NyZWF0ZSgpIHdoZW4gdGhlIGhlYWRlcgorLy8gZG9lcyBub3QgY29udGFpbiBtYXBwaW5nIGluZm9ybWF0aW9uLiBUaGUgdmFsdWVzIGFyZSB2YWxpZCBvbmx5IGZvciBtb25vIGFuZAorLy8gc3RlcmVvIG91dHB1dDogT3B1cyBzdHJlYW1zIHdpdGggbW9yZSB0aGFuIDIgY2hhbm5lbHMgcmVxdWlyZSBhIHN0cmVhbSBtYXAuCitzdGF0aWMgY29uc3QgaW50IGtNYXhDaGFubmVsc1dpdGhEZWZhdWx0TGF5b3V0ID0gMjsKK3N0YXRpYyBjb25zdCB1aW50OF90IGtEZWZhdWx0T3B1c0NoYW5uZWxMYXlvdXRba01heENoYW5uZWxzV2l0aERlZmF1bHRMYXlvdXRdID0geyAwLCAxIH07CisKKy8vIFBhcnNlcyBPcHVzIEhlYWRlci4gSGVhZGVyIHNwZWM6IGh0dHA6Ly93aWtpLnhpcGgub3JnL09nZ09wdXMjSURfSGVhZGVyCitzdGF0aWMgYm9vbCBQYXJzZU9wdXNIZWFkZXIoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHVzSGVhZGVyKiBoZWFkZXIpIHsKKyAgICAvLyBTaXplIG9mIHRoZSBPcHVzIGhlYWRlciBleGNsdWRpbmcgb3B0aW9uYWwgbWFwcGluZyBpbmZvcm1hdGlvbi4KKyAgICBjb25zdCBzaXplX3Qga09wdXNIZWFkZXJTaXplID0gMTk7CisKKyAgICAvLyBPZmZzZXQgdG8gdGhlIGNoYW5uZWwgY291bnQgYnl0ZSBpbiB0aGUgT3B1cyBoZWFkZXIuCisgICAgY29uc3Qgc2l6ZV90IGtPcHVzSGVhZGVyQ2hhbm5lbHNPZmZzZXQgPSA5OworCisgICAgLy8gT2Zmc2V0IHRvIHRoZSBwcmUtc2tpcCB2YWx1ZSBpbiB0aGUgT3B1cyBoZWFkZXIuCisgICAgY29uc3Qgc2l6ZV90IGtPcHVzSGVhZGVyU2tpcFNhbXBsZXNPZmZzZXQgPSAxMDsKKworICAgIC8vIE9mZnNldCB0byB0aGUgZ2FpbiB2YWx1ZSBpbiB0aGUgT3B1cyBoZWFkZXIuCisgICAgY29uc3Qgc2l6ZV90IGtPcHVzSGVhZGVyR2Fpbk9mZnNldCA9IDE2OworCisgICAgLy8gT2Zmc2V0IHRvIHRoZSBjaGFubmVsIG1hcHBpbmcgYnl0ZSBpbiB0aGUgT3B1cyBoZWFkZXIuCisgICAgY29uc3Qgc2l6ZV90IGtPcHVzSGVhZGVyQ2hhbm5lbE1hcHBpbmdPZmZzZXQgPSAxODsKKworICAgIC8vIE9wdXMgSGVhZGVyIGNvbnRhaW5zIGEgc3RyZWFtIG1hcC4gVGhlIG1hcHBpbmcgdmFsdWVzIGFyZSBpbiB0aGUgaGVhZGVyCisgICAgLy8gYmV5b25kIHRoZSBhbHdheXMgcHJlc2VudCB8a09wdXNIZWFkZXJTaXplfCBieXRlcyBvZiBkYXRhLiBUaGUgbWFwcGluZworICAgIC8vIGRhdGEgY29udGFpbnMgc3RyZWFtIGNvdW50LCBjb3VwbGluZyBpbmZvcm1hdGlvbiwgYW5kIHBlciBjaGFubmVsIG1hcHBpbmcKKyAgICAvLyB2YWx1ZXM6CisgICAgLy8gICAtIEJ5dGUgMDogTnVtYmVyIG9mIHN0cmVhbXMuCisgICAgLy8gICAtIEJ5dGUgMTogTnVtYmVyIGNvdXBsZWQuCisgICAgLy8gICAtIEJ5dGUgMjogU3RhcnRpbmcgYXQgYnl0ZSAyIGFyZSB8aGVhZGVyLT5jaGFubmVsc3wgdWludDggbWFwcGluZworICAgIC8vICAgICAgICAgICAgIHZhbHVlcy4KKyAgICBjb25zdCBzaXplX3Qga09wdXNIZWFkZXJOdW1TdHJlYW1zT2Zmc2V0ID0ga09wdXNIZWFkZXJTaXplOworICAgIGNvbnN0IHNpemVfdCBrT3B1c0hlYWRlck51bUNvdXBsZWRPZmZzZXQgPSBrT3B1c0hlYWRlck51bVN0cmVhbXNPZmZzZXQgKyAxOworICAgIGNvbnN0IHNpemVfdCBrT3B1c0hlYWRlclN0cmVhbU1hcE9mZnNldCA9IGtPcHVzSGVhZGVyTnVtU3RyZWFtc09mZnNldCArIDI7CisKKyAgICBpZiAoZGF0YV9zaXplIDwga09wdXNIZWFkZXJTaXplKSB7CisgICAgICAgIEFMT0dFKCJIZWFkZXIgc2l6ZSBpcyB0b28gc21hbGwuIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaGVhZGVyLT5jaGFubmVscyA9ICooZGF0YSArIGtPcHVzSGVhZGVyQ2hhbm5lbHNPZmZzZXQpOworICAgIGlmIChoZWFkZXItPmNoYW5uZWxzIDw9IDAgfHwgaGVhZGVyLT5jaGFubmVscyA+IGtNYXhDaGFubmVscykgeworICAgICAgICBBTE9HRSgiSW52YWxpZCBIZWFkZXIsIHdyb25nIGNoYW5uZWwgY291bnQ6ICVkIiwgaGVhZGVyLT5jaGFubmVscyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBoZWFkZXItPnNraXBfc2FtcGxlcyA9IFJlYWRMRTE2KGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrT3B1c0hlYWRlclNraXBTYW1wbGVzT2Zmc2V0KTsKKworICAgIGhlYWRlci0+Z2Fpbl9kYiA9IHN0YXRpY19jYXN0PGludDE2X3Q+KFJlYWRMRTE2KGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtPcHVzSGVhZGVyR2Fpbk9mZnNldCkpOworCisgICAgaGVhZGVyLT5jaGFubmVsX21hcHBpbmcgPSAqKGRhdGEgKyBrT3B1c0hlYWRlckNoYW5uZWxNYXBwaW5nT2Zmc2V0KTsKKyAgICBpZiAoIWhlYWRlci0+Y2hhbm5lbF9tYXBwaW5nKSB7CisgICAgICAgIGlmIChoZWFkZXItPmNoYW5uZWxzID4ga01heENoYW5uZWxzV2l0aERlZmF1bHRMYXlvdXQpIHsKKyAgICAgICAgICAgIEFMT0dFKCJJbnZhbGlkIEhlYWRlciwgbWlzc2luZyBzdHJlYW0gbWFwLiIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGhlYWRlci0+bnVtX3N0cmVhbXMgPSAxOworICAgICAgICBoZWFkZXItPm51bV9jb3VwbGVkID0gaGVhZGVyLT5jaGFubmVscyA+IDE7CisgICAgICAgIGhlYWRlci0+c3RyZWFtX21hcFswXSA9IDA7CisgICAgICAgIGhlYWRlci0+c3RyZWFtX21hcFsxXSA9IDE7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAoZGF0YV9zaXplIDwga09wdXNIZWFkZXJTdHJlYW1NYXBPZmZzZXQgKyBoZWFkZXItPmNoYW5uZWxzKSB7CisgICAgICAgIEFMT0dFKCJJbnZhbGlkIHN0cmVhbSBtYXA7IGluc3VmZmljaWVudCBkYXRhIGZvciBjdXJyZW50IGNoYW5uZWwgIgorICAgICAgICAgICAgICAiY291bnQ6ICVkIiwgaGVhZGVyLT5jaGFubmVscyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaGVhZGVyLT5udW1fc3RyZWFtcyA9ICooZGF0YSArIGtPcHVzSGVhZGVyTnVtU3RyZWFtc09mZnNldCk7CisgICAgaGVhZGVyLT5udW1fY291cGxlZCA9ICooZGF0YSArIGtPcHVzSGVhZGVyTnVtQ291cGxlZE9mZnNldCk7CisgICAgaWYgKGhlYWRlci0+bnVtX3N0cmVhbXMgKyBoZWFkZXItPm51bV9jb3VwbGVkICE9IGhlYWRlci0+Y2hhbm5lbHMpIHsKKyAgICAgICAgQUxPR0UoIkluY29uc2lzdGVudCBjaGFubmVsIG1hcHBpbmcuIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBoZWFkZXItPmNoYW5uZWxzOyArK2kpCisgICAgICAgIGhlYWRlci0+c3RyZWFtX21hcFtpXSA9ICooZGF0YSArIGtPcHVzSGVhZGVyU3RyZWFtTWFwT2Zmc2V0ICsgaSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vIENvbnZlcnQgbmFub3NlY29uZHMgdG8gbnVtYmVyIG9mIHNhbXBsZXMuCitzdGF0aWMgdWludDY0X3QgbnNfdG9fc2FtcGxlcyh1aW50NjRfdCBucywgaW50IHJhdGUpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8ZG91YmxlPihucykgKiByYXRlIC8gMTAwMDAwMDAwMDsKK30KKwordm9pZCBDMlNvZnRPcHVzRGVjOjpwcm9jZXNzKAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgIC8vIEluaXRpYWxpemUgb3V0cHV0IHdvcmsKKyAgICB3b3JrLT5yZXN1bHQgPSBDMl9PSzsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKworICAgIGlmIChtU2lnbmFsbGVkRXJyb3IgfHwgbVNpZ25hbGxlZE91dHB1dEVvcykgeworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9CQURfVkFMVUU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBib29sIGVvcyA9ICgod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSAhPSAwKTsKKyAgICBzaXplX3QgaW5PZmZzZXQgPSAwdTsKKyAgICBzaXplX3QgaW5TaXplID0gMHU7CisgICAgQzJSZWFkVmlldyByVmlldyA9IG1EdW1teVJlYWRWaWV3OworICAgIGlmICghd29yay0+aW5wdXQuYnVmZmVycy5lbXB0eSgpKSB7CisgICAgICAgIHJWaWV3ID0gd29yay0+aW5wdXQuYnVmZmVyc1swXS0+ZGF0YSgpLmxpbmVhckJsb2NrcygpLmZyb250KCkubWFwKCkuZ2V0KCk7CisgICAgICAgIGluU2l6ZSA9IHJWaWV3LmNhcGFjaXR5KCk7CisgICAgICAgIGlmIChpblNpemUgJiYgclZpZXcuZXJyb3IoKSkgeworICAgICAgICAgICAgQUxPR0UoInJlYWQgdmlldyBtYXAgZmFpbGVkICVkIiwgclZpZXcuZXJyb3IoKSk7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGluU2l6ZSA9PSAwKSB7CisgICAgICAgIGZpbGxFbXB0eVdvcmsod29yayk7CisgICAgICAgIGlmIChlb3MpIHsKKyAgICAgICAgICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSB0cnVlOworICAgICAgICAgICAgQUxPR1YoInNpZ25hbGxlZCBFT1MiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQUxPR1YoImluIGJ1ZmZlciBhdHRyLiBzaXplICV6dSB0aW1lc3RhbXAgJWQgZnJhbWVpbmRleCAlZCIsIGluU2l6ZSwKKyAgICAgICAgICAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1KCksIChpbnQpd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCkpOworICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPSByVmlldy5kYXRhKCkgKyBpbk9mZnNldDsKKyAgICBpZiAobUlucHV0QnVmZmVyQ291bnQgPCAzKSB7CisgICAgICAgIGlmIChtSW5wdXRCdWZmZXJDb3VudCA9PSAwKSB7CisgICAgICAgICAgICBpZiAoIVBhcnNlT3B1c0hlYWRlcihkYXRhLCBpblNpemUsICZtSGVhZGVyKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJFbmNvdW50ZXJlZCBlcnJvciB3aGlsZSBQYXJzaW5nIE9wdXMgSGVhZGVyLiIpOworICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHVpbnQ4X3QgY2hhbm5lbF9tYXBwaW5nW2tNYXhDaGFubmVsc10gPSB7MH07CisgICAgICAgICAgICBpZiAobUhlYWRlci5jaGFubmVscyA8PSBrTWF4Q2hhbm5lbHNXaXRoRGVmYXVsdExheW91dCkgeworICAgICAgICAgICAgICAgIG1lbWNweSgmY2hhbm5lbF9tYXBwaW5nLAorICAgICAgICAgICAgICAgICAgICAgICBrRGVmYXVsdE9wdXNDaGFubmVsTGF5b3V0LAorICAgICAgICAgICAgICAgICAgICAgICBrTWF4Q2hhbm5lbHNXaXRoRGVmYXVsdExheW91dCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1lbWNweSgmY2hhbm5lbF9tYXBwaW5nLAorICAgICAgICAgICAgICAgICAgICAgICBtSGVhZGVyLnN0cmVhbV9tYXAsCisgICAgICAgICAgICAgICAgICAgICAgIG1IZWFkZXIuY2hhbm5lbHMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IHN0YXR1cyA9IE9QVVNfSU5WQUxJRF9TVEFURTsKKyAgICAgICAgICAgIG1EZWNvZGVyID0gb3B1c19tdWx0aXN0cmVhbV9kZWNvZGVyX2NyZWF0ZShrUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSGVhZGVyLmNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1IZWFkZXIubnVtX3N0cmVhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUhlYWRlci5udW1fY291cGxlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsX21hcHBpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXR1cyk7CisgICAgICAgICAgICBpZiAoIW1EZWNvZGVyIHx8IHN0YXR1cyAhPSBPUFVTX09LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIm9wdXNfbXVsdGlzdHJlYW1fZGVjb2Rlcl9jcmVhdGUgZmFpbGVkIHN0YXR1cyA9ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICBvcHVzX3N0cmVycm9yKHN0YXR1cykpOworICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0YXR1cyA9IG9wdXNfbXVsdGlzdHJlYW1fZGVjb2Rlcl9jdGwobURlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QVVNfU0VUX0dBSU4obUhlYWRlci5nYWluX2RiKSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE9QVVNfT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHNldCBPUFVTIGhlYWRlciBnYWluOyBzdGF0dXMgPSAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgb3B1c19zdHJlcnJvcihzdGF0dXMpKTsKKyAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoaW5TaXplIDwgOCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJJbnB1dCBzYW1wbGUgc2l6ZSBpcyB0b28gc21hbGwuIik7CisgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50NjRfdCBzYW1wbGVzID0gbnNfdG9fc2FtcGxlcyggKihyZWludGVycHJldF9jYXN0PGludDY0X3QqPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0X2Nhc3Q8dWludDhfdCAqPiAoZGF0YSkpKSwga1JhdGUpOworICAgICAgICAgICAgaWYgKG1JbnB1dEJ1ZmZlckNvdW50ID09IDEpIHsKKyAgICAgICAgICAgICAgICBtQ29kZWNEZWxheSA9IHNhbXBsZXM7CisgICAgICAgICAgICAgICAgbVNhbXBsZXNUb0Rpc2NhcmQgPSBtQ29kZWNEZWxheTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIG1TZWVrUHJlUm9sbCA9IHNhbXBsZXM7CisKKyAgICAgICAgICAgICAgICBBTE9HSSgiQ29uZmlndXJpbmcgZGVjb2RlcjogJWQgSHosICVkIGNoYW5uZWxzIiwKKyAgICAgICAgICAgICAgICAgICAgICAga1JhdGUsIG1IZWFkZXIuY2hhbm5lbHMpOworICAgICAgICAgICAgICAgIEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86Om91dHB1dCBzYW1wbGVSYXRlSW5mbygwdSwga1JhdGUpOworICAgICAgICAgICAgICAgIEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6b3V0cHV0IGNoYW5uZWxDb3VudEluZm8oMHUsIG1IZWFkZXIuY2hhbm5lbHMpOworICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICAgICAgICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBtSW50Zi0+Y29uZmlnKAorICAgICAgICAgICAgICAgICAgICAgICAgeyAmc2FtcGxlUmF0ZUluZm8sICZjaGFubmVsQ291bnRJbmZvIH0sCisgICAgICAgICAgICAgICAgICAgICAgICBDMl9NQVlfQkxPQ0ssCisgICAgICAgICAgICAgICAgICAgICAgICAmZmFpbHVyZXMpOworICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5wdXNoX2JhY2soQzJQYXJhbTo6Q29weShzYW1wbGVSYXRlSW5mbykpOworICAgICAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLnB1c2hfYmFjayhDMlBhcmFtOjpDb3B5KGNoYW5uZWxDb3VudEluZm8pKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiQ29uZmlnIFVwZGF0ZSBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgKyttSW5wdXRCdWZmZXJDb3VudDsKKyAgICAgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICAgICAgaWYgKGVvcykgeworICAgICAgICAgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IHRydWU7CisgICAgICAgICAgICBBTE9HVigic2lnbmFsbGVkIEVPUyIpOworICAgICAgICB9CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBJZ25vcmUgQ1NEIHJlLXN1Ym1pc3Npb25zLgorICAgIGlmICgod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19DT0RFQ19DT05GSUcpKSB7CisgICAgICAgIGZpbGxFbXB0eVdvcmsod29yayk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBXaGVuIHNlZWtpbmcgdG8gemVybywgfG1Db2RlY0RlbGF5fCBzYW1wbGVzIGhhcyB0byBiZSBkaXNjYXJkZWQKKyAgICAvLyBpbnN0ZWFkIG9mIHxtU2Vla1ByZVJvbGx8IHNhbXBsZXMgKGFzIHdlIHdvdWxkIHdoZW4gc2Vla2luZyB0byBhbnkKKyAgICAvLyBvdGhlciB0aW1lc3RhbXApLgorICAgIGlmICh3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrdSgpID09IDApIG1TYW1wbGVzVG9EaXNjYXJkID0gbUNvZGVjRGVsYXk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gYmxvY2s7CisgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSA9IHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9OworICAgIGMyX3N0YXR1c190IGVyciA9IHBvb2wtPmZldGNoTGluZWFyQmxvY2soCisgICAgICAgICAgICAgICAgICAgICAgICAgIGtNYXhOdW1TYW1wbGVzUGVyQnVmZmVyICoga01heENoYW5uZWxzICogc2l6ZW9mKGludDE2X3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1c2FnZSwgJmJsb2NrKTsKKyAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dFKCJmZXRjaExpbmVhckJsb2NrIGZvciBPdXRwdXQgZmFpbGVkIHdpdGggc3RhdHVzICVkIiwgZXJyKTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfTk9fTUVNT1JZOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEMyV3JpdGVWaWV3IHdWaWV3ID0gYmxvY2stPm1hcCgpLmdldCgpOworICAgIGlmICh3Vmlldy5lcnJvcigpKSB7CisgICAgICAgIEFMT0dFKCJ3cml0ZSB2aWV3IG1hcCBmYWlsZWQgJWQiLCB3Vmlldy5lcnJvcigpKTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW50IG51bVNhbXBsZXMgPSBvcHVzX211bHRpc3RyZWFtX2RlY29kZShtRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGludDE2X3QgKj4gKHdWaWV3LmRhdGEoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrTWF4T3B1c091dHB1dFBhY2tldFNpemVTYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisgICAgaWYgKG51bVNhbXBsZXMgPCAwKSB7CisgICAgICAgIEFMT0dFKCJvcHVzX211bHRpc3RyZWFtX2RlY29kZSByZXR1cm5lZCBudW1TYW1wbGVzICVkIiwgbnVtU2FtcGxlcyk7CisgICAgICAgIG51bVNhbXBsZXMgPSAwOworICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpbnQgb3V0T2Zmc2V0ID0gMDsKKyAgICBpZiAobVNhbXBsZXNUb0Rpc2NhcmQgPiAwKSB7CisgICAgICAgIGlmIChtU2FtcGxlc1RvRGlzY2FyZCA+IG51bVNhbXBsZXMpIHsKKyAgICAgICAgICAgIG1TYW1wbGVzVG9EaXNjYXJkIC09IG51bVNhbXBsZXM7CisgICAgICAgICAgICBudW1TYW1wbGVzID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG51bVNhbXBsZXMgLT0gbVNhbXBsZXNUb0Rpc2NhcmQ7CisgICAgICAgICAgICBvdXRPZmZzZXQgPSBtU2FtcGxlc1RvRGlzY2FyZCAqIHNpemVvZihpbnQxNl90KSAqIG1IZWFkZXIuY2hhbm5lbHM7CisgICAgICAgICAgICBtU2FtcGxlc1RvRGlzY2FyZCA9IDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobnVtU2FtcGxlcykgeworICAgICAgICBpbnQgb3V0U2l6ZSA9IG51bVNhbXBsZXMgKiBzaXplb2YoaW50MTZfdCkgKiBtSGVhZGVyLmNoYW5uZWxzOworICAgICAgICBBTE9HVigib3V0IGJ1ZmZlciBhdHRyLiBvZmZzZXQgJWQgc2l6ZSAlZCAiLCBvdXRPZmZzZXQsIG91dFNpemUpOworCisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5wdXNoX2JhY2soY3JlYXRlTGluZWFyQnVmZmVyKGJsb2NrLCBvdXRPZmZzZXQsIG91dFNpemUpKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgIH0gZWxzZSB7CisgICAgICAgIGZpbGxFbXB0eVdvcmsod29yayk7CisgICAgICAgIGJsb2NrLnJlc2V0KCk7CisgICAgfQorICAgIGlmIChlb3MpIHsKKyAgICAgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IHRydWU7CisgICAgICAgIEFMT0dWKCJzaWduYWxsZWQgRU9TIik7CisgICAgfQorfQorCitjbGFzcyBDMlNvZnRPcHVzRGVjRmFjdG9yeSA6IHB1YmxpYyBDMkNvbXBvbmVudEZhY3RvcnkgeworcHVibGljOgorICAgIEMyU29mdE9wdXNEZWNGYWN0b3J5KCkgOiBtSGVscGVyKHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxDMlJlZmxlY3RvckhlbHBlcj4oCisgICAgICAgICAgICBHZXRDb2RlYzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCktPmdldFBhcmFtUmVmbGVjdG9yKCkpKSB7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVDb21wb25lbnQoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KiBjb25zdCBjb21wb25lbnQsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnQqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqY29tcG9uZW50ID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PigKKyAgICAgICAgICAgICAgICBuZXcgQzJTb2Z0T3B1c0RlYyhDT01QT05FTlRfTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdE9wdXNEZWM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4qIGNvbnN0IGludGVyZmFjZSwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudEludGVyZmFjZSopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICppbnRlcmZhY2UgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KAorICAgICAgICAgICAgICAgIG5ldyBTaW1wbGVJbnRlcmZhY2U8QzJTb2Z0T3B1c0RlYzo6SW50ZkltcGw+KAorICAgICAgICAgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsIGlkLCBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdE9wdXNEZWM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5DMlNvZnRPcHVzRGVjRmFjdG9yeSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+IG1IZWxwZXI7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCitleHRlcm4gIkMiIDo6QzJDb21wb25lbnRGYWN0b3J5KiBDcmVhdGVDb2RlYzJGYWN0b3J5KCkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gbmV3IDo6YW5kcm9pZDo6QzJTb2Z0T3B1c0RlY0ZhY3RvcnkoKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5KiBmYWN0b3J5KSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIGRlbGV0ZSBmYWN0b3J5OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvb3B1cy9DMlNvZnRPcHVzRGVjLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9vcHVzL0MyU29mdE9wdXNEZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmI3NDI2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvb3B1cy9DMlNvZnRPcHVzRGVjLmgKQEAgLTAsMCArMSw3OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9DMl9TT0ZUX09QVVNfREVDX0hfCisjZGVmaW5lIEFORFJPSURfQzJfU09GVF9PUFVTX0RFQ19IXworCisjaW5jbHVkZSA8U2ltcGxlQzJDb21wb25lbnQuaD4KKworCitzdHJ1Y3QgT3B1c01TRGVjb2RlcjsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgT3B1c0hlYWRlciB7CisgIGludCBjaGFubmVsczsKKyAgaW50IHNraXBfc2FtcGxlczsKKyAgaW50IGNoYW5uZWxfbWFwcGluZzsKKyAgaW50IG51bV9zdHJlYW1zOworICBpbnQgbnVtX2NvdXBsZWQ7CisgIGludDE2X3QgZ2Fpbl9kYjsKKyAgdWludDhfdCBzdHJlYW1fbWFwWzhdOworfTsKKworc3RydWN0IEMyU29mdE9wdXNEZWMgOiBwdWJsaWMgU2ltcGxlQzJDb21wb25lbnQgeworICAgIGNsYXNzIEludGZJbXBsOworCisgICAgQzJTb2Z0T3B1c0RlYyhjb25zdCBjaGFyICpuYW1lLCBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+ICZpbnRmSW1wbCk7CisgICAgdmlydHVhbCB+QzJTb2Z0T3B1c0RlYygpOworCisgICAgLy8gRnJvbSBTaW1wbGVDMkNvbXBvbmVudAorICAgIGMyX3N0YXR1c190IG9uSW5pdCgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uU3RvcCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZXNldCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZWxlYXNlKCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25GbHVzaF9zbSgpIG92ZXJyaWRlOworICAgIHZvaWQgcHJvY2VzcygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3QgZHJhaW4oCisgICAgICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKK3ByaXZhdGU6CisgICAgZW51bSB7CisgICAgICAgIGtNYXhOdW1TYW1wbGVzUGVyQnVmZmVyID0gOTYwICogNgorICAgIH07CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+IG1JbnRmOworICAgIE9wdXNNU0RlY29kZXIgKm1EZWNvZGVyOworICAgIE9wdXNIZWFkZXIgbUhlYWRlcjsKKworICAgIGludDY0X3QgbUNvZGVjRGVsYXk7CisgICAgaW50NjRfdCBtU2Vla1ByZVJvbGw7CisgICAgaW50NjRfdCBtU2FtcGxlc1RvRGlzY2FyZDsKKyAgICBzaXplX3QgbUlucHV0QnVmZmVyQ291bnQ7CisgICAgYm9vbCBtU2lnbmFsbGVkRXJyb3I7CisgICAgYm9vbCBtU2lnbmFsbGVkT3V0cHV0RW9zOworCisgICAgc3RhdHVzX3QgaW5pdERlY29kZXIoKTsKKworICAgIEMyX0RPX05PVF9DT1BZKEMyU29mdE9wdXNEZWMpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0MyX1NPRlRfT1BVU19ERUNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3Jhdy9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvcmF3L0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM5NDRkYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3Jhdy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsOSBAQAorY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9yYXdkZWMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9hbGwtZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbIkMyU29mdFJhd0RlYy5jcHAiXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3Jhdy9DMlNvZnRSYXdEZWMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvcmF3L0MyU29mdFJhd0RlYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQyYTY1MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3Jhdy9DMlNvZnRSYXdEZWMuY3BwCkBAIC0wLDAgKzEsMjIwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDMlNvZnRSYXdEZWMiCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaD4KKworI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8U2ltcGxlQzJJbnRlcmZhY2UuaD4KKworI2luY2x1ZGUgIkMyU29mdFJhd0RlYy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NvbnN0ZXhwciBjaGFyIENPTVBPTkVOVF9OQU1FW10gPSAiYzIuYW5kcm9pZC5yYXcuZGVjb2RlciI7CisKK2NsYXNzIEMyU29mdFJhd0RlYzo6SW50ZkltcGwgOiBwdWJsaWMgQzJJbnRlcmZhY2VIZWxwZXIgeworcHVibGljOgorICAgIGV4cGxpY2l0IEludGZJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gJmhlbHBlcikKKyAgICAgICAgOiBDMkludGVyZmFjZUhlbHBlcihoZWxwZXIpIHsKKworICAgICAgICBzZXREZXJpdmVkSW5zdGFuY2UodGhpcyk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dEZvcm1hdCwgQzJfTkFNRV9JTlBVVF9TVFJFQU1fRk9STUFUX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbUZvcm1hdENvbmZpZzo6aW5wdXQoMHUsIEMyRm9ybWF0Q29tcHJlc3NlZCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtT3V0cHV0Rm9ybWF0LCBDMl9OQU1FX09VVFBVVF9TVFJFQU1fRk9STUFUX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbUZvcm1hdENvbmZpZzo6b3V0cHV0KDB1LCBDMkZvcm1hdEF1ZGlvKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dE1lZGlhVHlwZSwgQzJfTkFNRV9JTlBVVF9QT1JUX01JTUVfU0VUVElORykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoQWxsb2NTaGFyZWRTdHJpbmc8QzJQb3J0TWltZUNvbmZpZzo6aW5wdXQ+KAorICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1PdXRwdXRNZWRpYVR5cGUsIEMyX05BTUVfT1VUUFVUX1BPUlRfTUlNRV9TRVRUSU5HKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShBbGxvY1NoYXJlZFN0cmluZzxDMlBvcnRNaW1lQ29uZmlnOjpvdXRwdXQ+KAorICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1TYW1wbGVSYXRlLCBDMl9OQU1FX1NUUkVBTV9TQU1QTEVfUkFURV9TRVRUSU5HKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0KDB1LCA0NDEwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtU2FtcGxlUmF0ZSwgdmFsdWUpLmluUmFuZ2UoODAwMCwgMTkyMDAwKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoKFNldHRlcjxkZWNsdHlwZSgqbVNhbXBsZVJhdGUpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1DaGFubmVsQ291bnQsIEMyX05BTUVfU1RSRUFNX0NIQU5ORUxfQ09VTlRfU0VUVElORykKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6b3V0cHV0KDB1LCAyKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1DaGFubmVsQ291bnQsIHZhbHVlKS5pblJhbmdlKDEsIDgpfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1DaGFubmVsQ291bnQpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUJpdHJhdGUsIEMyX05BTUVfU1RSRUFNX0JJVFJBVEVfU0VUVElORykKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyQml0cmF0ZVR1bmluZzo6aW5wdXQoMHUsIDY0MDAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1CaXRyYXRlLCB2YWx1ZSkuaW5SYW5nZSgxLCAxMDAwMDAwMCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbUJpdHJhdGUpPjo6Tm9uU3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0TWF4QnVmU2l6ZSwgQzJfUEFSQU1LRVlfSU5QVVRfTUFYX0JVRkZFUl9TSVpFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQoMHUsIDY0ICogMTAyNCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Gb3JtYXRDb25maWc6OmlucHV0PiBtSW5wdXRGb3JtYXQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRm9ybWF0Q29uZmlnOjpvdXRwdXQ+IG1PdXRwdXRGb3JtYXQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydE1pbWVDb25maWc6OmlucHV0PiBtSW5wdXRNZWRpYVR5cGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydE1pbWVDb25maWc6Om91dHB1dD4gbU91dHB1dE1lZGlhVHlwZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0PiBtU2FtcGxlUmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjpvdXRwdXQ+IG1DaGFubmVsQ291bnQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQml0cmF0ZVR1bmluZzo6aW5wdXQ+IG1CaXRyYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dD4gbUlucHV0TWF4QnVmU2l6ZTsKK307CisKK0MyU29mdFJhd0RlYzo6QzJTb2Z0UmF3RGVjKAorICAgICAgICBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gJmludGZJbXBsKQorICAgIDogU2ltcGxlQzJDb21wb25lbnQoc3RkOjptYWtlX3NoYXJlZDxTaW1wbGVJbnRlcmZhY2U8SW50ZkltcGw+PihuYW1lLCBpZCwgaW50ZkltcGwpKSwKKyAgICAgIG1JbnRmKGludGZJbXBsKSB7Cit9CisKK0MyU29mdFJhd0RlYzo6fkMyU29mdFJhd0RlYygpIHsKKyAgICBvblJlbGVhc2UoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0UmF3RGVjOjpvbkluaXQoKSB7CisgICAgbVNpZ25hbGxlZEVvcyA9IGZhbHNlOworICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0UmF3RGVjOjpvblN0b3AoKSB7CisgICAgbVNpZ25hbGxlZEVvcyA9IGZhbHNlOworICAgIHJldHVybiBDMl9PSzsKK30KKwordm9pZCBDMlNvZnRSYXdEZWM6Om9uUmVzZXQoKSB7CisgICAgKHZvaWQpb25TdG9wKCk7Cit9CisKK3ZvaWQgQzJTb2Z0UmF3RGVjOjpvblJlbGVhc2UoKSB7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdFJhd0RlYzo6b25GbHVzaF9zbSgpIHsKKyAgICByZXR1cm4gb25TdG9wKCk7Cit9CisKK3ZvaWQgQzJTb2Z0UmF3RGVjOjpwcm9jZXNzKAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgICh2b2lkKXBvb2w7CisgICAgd29yay0+cmVzdWx0ID0gQzJfT0s7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKworICAgIGlmIChtU2lnbmFsbGVkRW9zKSB7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEFMT0dWKCJpbiBidWZmZXIgYXR0ci4gdGltZXN0YW1wICVkIGZyYW1laW5kZXggJWQiLAorICAgICAgICAgIChpbnQpd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAucGVla3UoKSwgKGludCl3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKSk7CisKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICBpZiAoIXdvcmstPmlucHV0LmJ1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5wdXNoX2JhY2sod29yay0+aW5wdXQuYnVmZmVyc1swXSk7CisgICAgfQorICAgIGlmICh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgbVNpZ25hbGxlZEVvcyA9IHRydWU7CisgICAgICAgIEFMT0dWKCJzaWduYWxsZWQgRU9TIik7CisgICAgfQorfQorCitjMl9zdGF0dXNfdCBDMlNvZnRSYXdEZWM6OmRyYWluKAorICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAodm9pZCkgcG9vbDsKKyAgICBpZiAoZHJhaW5Nb2RlID09IE5PX0RSQUlOKSB7CisgICAgICAgIEFMT0dXKCJkcmFpbiB3aXRoIE5PX0RSQUlOOiBuby1vcCIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorICAgIGlmIChkcmFpbk1vZGUgPT0gRFJBSU5fQ0hBSU4pIHsKKyAgICAgICAgQUxPR1coIkRSQUlOX0NIQUlOIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorCisgICAgcmV0dXJuIEMyX09LOworfQorCitjbGFzcyBDMlNvZnRSYXdEZWNGYWN0b3J5IDogcHVibGljIEMyQ29tcG9uZW50RmFjdG9yeSB7CitwdWJsaWM6CisgICAgQzJTb2Z0UmF3RGVjRmFjdG9yeSgpIDogbUhlbHBlcihzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJSZWZsZWN0b3JIZWxwZXI+KAorICAgICAgICAgICAgR2V0Q29kZWMyUGxhdGZvcm1Db21wb25lbnRTdG9yZSgpLT5nZXRQYXJhbVJlZmxlY3RvcigpKSkgeworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlQ29tcG9uZW50KAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiogY29uc3QgY29tcG9uZW50LAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50Kik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmNvbXBvbmVudCA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4oCisgICAgICAgICAgICAgICAgbmV3IEMyU29mdFJhd0RlYyhDT01QT05FTlRfTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRSYXdEZWM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4qIGNvbnN0IGludGVyZmFjZSwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudEludGVyZmFjZSopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICppbnRlcmZhY2UgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KAorICAgICAgICAgICAgICAgIG5ldyBTaW1wbGVJbnRlcmZhY2U8QzJTb2Z0UmF3RGVjOjpJbnRmSW1wbD4oCisgICAgICAgICAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwgaWQsIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0UmF3RGVjOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCB+QzJTb2Z0UmF3RGVjRmFjdG9yeSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+IG1IZWxwZXI7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCitleHRlcm4gIkMiIDo6QzJDb21wb25lbnRGYWN0b3J5KiBDcmVhdGVDb2RlYzJGYWN0b3J5KCkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gbmV3IDo6YW5kcm9pZDo6QzJTb2Z0UmF3RGVjRmFjdG9yeSgpOworfQorCitleHRlcm4gIkMiIHZvaWQgRGVzdHJveUNvZGVjMkZhY3RvcnkoOjpDMkNvbXBvbmVudEZhY3RvcnkqIGZhY3RvcnkpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgZGVsZXRlIGZhY3Rvcnk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9yYXcvQzJTb2Z0UmF3RGVjLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9yYXcvQzJTb2Z0UmF3RGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RmZGVjNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3Jhdy9DMlNvZnRSYXdEZWMuaApAQCAtMCwwICsxLDUzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0MyX1NPRlRfUkFXX0RFQ19IXworI2RlZmluZSBBTkRST0lEX0MyX1NPRlRfUkFXX0RFQ19IXworCisjaW5jbHVkZSA8U2ltcGxlQzJDb21wb25lbnQuaD4KKworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBDMlNvZnRSYXdEZWMgOiBwdWJsaWMgU2ltcGxlQzJDb21wb25lbnQgeworICAgIGNsYXNzIEludGZJbXBsOworCisgICAgQzJTb2Z0UmF3RGVjKGNvbnN0IGNoYXIqIG5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiYgaW50ZkltcGwpOworICAgIHZpcnR1YWwgfkMyU29mdFJhd0RlYygpOworCisgICAgLy8gRnJvbSBTaW1wbGVDMkNvbXBvbmVudAorICAgIGMyX3N0YXR1c190IG9uSW5pdCgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uU3RvcCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZXNldCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZWxlYXNlKCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25GbHVzaF9zbSgpIG92ZXJyaWRlOworICAgIHZvaWQgcHJvY2VzcygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3QgZHJhaW4oCisgICAgICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiBtSW50ZjsKKyAgICBib29sIG1TaWduYWxsZWRFb3M7CisKKyAgICBDMl9ET19OT1RfQ09QWShDMlNvZnRSYXdEZWMpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0MyX1NPRlRfUkFXX0RFQ19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvcmF3L01PRFVMRV9MSUNFTlNFX0FQQUNIRTIgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9yYXcvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvcmF3L01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3Jhdy9OT1RJQ0UgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9yYXcvTk9USUNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1YjFlZmEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9yYXcvTk9USUNFCkBAIC0wLDAgKzEsMTkwIEBACisKKyAgIENvcHlyaWdodCAoYykgMjAwNS0yMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAorICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLworCisgICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KKworICAgMS4gRGVmaW5pdGlvbnMuCisKKyAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCisgICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KKworICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKKyAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KKworICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAorICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgorICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKKyAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQorICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKKyAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQorICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KKworICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KKworICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCisgICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCisgICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgorCisgICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAorICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAorICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAorICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgorCisgICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgorICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQorICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCisgICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgorCisgICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0CisgICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCisgICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCisgICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcworICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCisgICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCisgICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgorCisgICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZworICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucworICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5CisgICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCisgICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKKyAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgorICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAorICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KKyAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCisgICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQorICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0CisgICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQorICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCisKKyAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKKyAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgorCisgICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKKyAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQorICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KKworICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCisgICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKKyAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCisgICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgorICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQorICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKKyAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCisgICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCisgICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAorICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcworICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCisgICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCisKKyAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCisgICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKKyAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91CisgICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKKyAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAorCisgICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCisgICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCisKKyAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcworICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKKyAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAorICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKKyAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCisKKyAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cworICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKKyAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKKyAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKKyAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKKyAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAorICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKKyAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKKyAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCisgICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCisgICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAorICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCisgICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKKyAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKKyAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKKyAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCisKKyAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAorICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgorICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCisgICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKKyAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCisKKyAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKKyAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaworICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgorICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQorICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKKyAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KKworICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQorICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAorICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCisgICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KKworICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCisgICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCisgICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKKyAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKKyAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQorICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55CisgICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCisKKyAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAorICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCisgICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQorICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKKyAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKKyAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQorICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQorICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAorICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKKyAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKKyAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KKworICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZworICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKKyAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCisgICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcworICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKKyAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCisgICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCisgICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKKyAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KKyAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgorCisgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdm9yYmlzL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92b3JiaXMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWY0ODVkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdm9yYmlzL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwxMSBAQAorY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF92b3JiaXNkZWMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9hbGwtZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbIkMyU29mdFZvcmJpc0RlYy5jcHAiXSwKKworICAgIHNoYXJlZF9saWJzOiBbImxpYnZvcmJpc2lkZWMiXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZvcmJpcy9DMlNvZnRWb3JiaXNEZWMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdm9yYmlzL0MyU29mdFZvcmJpc0RlYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjgwYWUzNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZvcmJpcy9DMlNvZnRWb3JiaXNEZWMuY3BwCkBAIC0wLDAgKzEsNDkzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDMlNvZnRWb3JiaXNEZWMiCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaD4KKworI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8U2ltcGxlQzJJbnRlcmZhY2UuaD4KKworI2luY2x1ZGUgIkMyU29mdFZvcmJpc0RlYy5oIgorCitleHRlcm4gIkMiIHsKKyAgICAjaW5jbHVkZSA8VHJlbW9sby9jb2RlY19pbnRlcm5hbC5oPgorCisgICAgaW50IF92b3JiaXNfdW5wYWNrX2Jvb2tzKHZvcmJpc19pbmZvICp2aSxvZ2dwYWNrX2J1ZmZlciAqb3BiKTsKKyAgICBpbnQgX3ZvcmJpc191bnBhY2tfaW5mbyh2b3JiaXNfaW5mbyAqdmksb2dncGFja19idWZmZXIgKm9wYik7CisgICAgaW50IF92b3JiaXNfdW5wYWNrX2NvbW1lbnQodm9yYmlzX2NvbW1lbnQgKnZjLG9nZ3BhY2tfYnVmZmVyICpvcGIpOworfQorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NvbnN0ZXhwciBjaGFyIENPTVBPTkVOVF9OQU1FW10gPSAiYzIuYW5kcm9pZC52b3JiaXMuZGVjb2RlciI7CisKK2NsYXNzIEMyU29mdFZvcmJpc0RlYzo6SW50ZkltcGwgOiBwdWJsaWMgQzJJbnRlcmZhY2VIZWxwZXIgeworcHVibGljOgorICAgIGV4cGxpY2l0IEludGZJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gJmhlbHBlcikKKyAgICAgICAgOiBDMkludGVyZmFjZUhlbHBlcihoZWxwZXIpIHsKKworICAgICAgICBzZXREZXJpdmVkSW5zdGFuY2UodGhpcyk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dEZvcm1hdCwgQzJfTkFNRV9JTlBVVF9TVFJFQU1fRk9STUFUX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbUZvcm1hdENvbmZpZzo6aW5wdXQoMHUsIEMyRm9ybWF0Q29tcHJlc3NlZCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtT3V0cHV0Rm9ybWF0LCBDMl9OQU1FX09VVFBVVF9TVFJFQU1fRk9STUFUX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbUZvcm1hdENvbmZpZzo6b3V0cHV0KDB1LCBDMkZvcm1hdEF1ZGlvKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dE1lZGlhVHlwZSwgQzJfTkFNRV9JTlBVVF9QT1JUX01JTUVfU0VUVElORykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoQWxsb2NTaGFyZWRTdHJpbmc8QzJQb3J0TWltZUNvbmZpZzo6aW5wdXQ+KAorICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fVk9SQklTKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1PdXRwdXRNZWRpYVR5cGUsIEMyX05BTUVfT1VUUFVUX1BPUlRfTUlNRV9TRVRUSU5HKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShBbGxvY1NoYXJlZFN0cmluZzxDMlBvcnRNaW1lQ29uZmlnOjpvdXRwdXQ+KAorICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1TYW1wbGVSYXRlLCBDMl9OQU1FX1NUUkVBTV9TQU1QTEVfUkFURV9TRVRUSU5HKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0KDB1LCA0ODAwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtU2FtcGxlUmF0ZSwgdmFsdWUpLmluUmFuZ2UoODAwMCwgOTYwMDApfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcigoU2V0dGVyPGRlY2x0eXBlKCptU2FtcGxlUmF0ZSk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUNoYW5uZWxDb3VudCwgQzJfTkFNRV9TVFJFQU1fQ0hBTk5FTF9DT1VOVF9TRVRUSU5HKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjpvdXRwdXQoMHUsIDEpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUNoYW5uZWxDb3VudCwgdmFsdWUpLmluUmFuZ2UoMSwgOCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbUNoYW5uZWxDb3VudCk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQml0cmF0ZSwgQzJfTkFNRV9TVFJFQU1fQklUUkFURV9TRVRUSU5HKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJCaXRyYXRlVHVuaW5nOjppbnB1dCgwdSwgNjQwMDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUJpdHJhdGUsIHZhbHVlKS5pblJhbmdlKDMyMDAwLCA1MDAwMDApfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1CaXRyYXRlKT46Ok5vblN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dE1heEJ1ZlNpemUsIEMyX1BBUkFNS0VZX0lOUFVUX01BWF9CVUZGRVJfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0KDB1LCA4MTkyICogMiAqIHNpemVvZihpbnQxNl90KSkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Gb3JtYXRDb25maWc6OmlucHV0PiBtSW5wdXRGb3JtYXQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRm9ybWF0Q29uZmlnOjpvdXRwdXQ+IG1PdXRwdXRGb3JtYXQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydE1pbWVDb25maWc6OmlucHV0PiBtSW5wdXRNZWRpYVR5cGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydE1pbWVDb25maWc6Om91dHB1dD4gbU91dHB1dE1lZGlhVHlwZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0PiBtU2FtcGxlUmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjpvdXRwdXQ+IG1DaGFubmVsQ291bnQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQml0cmF0ZVR1bmluZzo6aW5wdXQ+IG1CaXRyYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dD4gbUlucHV0TWF4QnVmU2l6ZTsKK307CisKK0MyU29mdFZvcmJpc0RlYzo6QzJTb2Z0Vm9yYmlzRGVjKAorICAgICAgICBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gJmludGZJbXBsKQorICAgIDogU2ltcGxlQzJDb21wb25lbnQoc3RkOjptYWtlX3NoYXJlZDxTaW1wbGVJbnRlcmZhY2U8SW50ZkltcGw+PihuYW1lLCBpZCwgaW50ZkltcGwpKSwKKyAgICAgIG1JbnRmKGludGZJbXBsKSwKKyAgICAgIG1TdGF0ZShudWxscHRyKSwKKyAgICAgIG1WaShudWxscHRyKSB7Cit9CisKK0MyU29mdFZvcmJpc0RlYzo6fkMyU29mdFZvcmJpc0RlYygpIHsKKyAgICBvblJlbGVhc2UoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0Vm9yYmlzRGVjOjpvbkluaXQoKSB7CisgICAgc3RhdHVzX3QgZXJyID0gaW5pdERlY29kZXIoKTsKKyAgICByZXR1cm4gZXJyID09IE9LID8gQzJfT0sgOiBDMl9OT19NRU1PUlk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdFZvcmJpc0RlYzo6b25TdG9wKCkgeworICAgIGlmIChtU3RhdGUpIHsKKyAgICAgICAgdm9yYmlzX2RzcF9jbGVhcihtU3RhdGUpOworICAgICAgICBkZWxldGUgbVN0YXRlOworICAgICAgICBtU3RhdGUgPSBudWxscHRyOworICAgIH0KKworICAgIGlmIChtVmkpIHsKKyAgICAgICAgdm9yYmlzX2luZm9fY2xlYXIobVZpKTsKKyAgICAgICAgZGVsZXRlIG1WaTsKKyAgICAgICAgbVZpID0gbnVsbHB0cjsKKyAgICB9CisgICAgbU51bUZyYW1lc0xlZnRPblBhZ2UgPSAtMTsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisKKyAgICByZXR1cm4gKGluaXREZWNvZGVyKCkgPT0gT0sgPyBDMl9PSyA6IEMyX0NPUlJVUFRFRCk7Cit9CisKK3ZvaWQgQzJTb2Z0Vm9yYmlzRGVjOjpvblJlc2V0KCkgeworICAgICh2b2lkKW9uU3RvcCgpOworfQorCit2b2lkIEMyU29mdFZvcmJpc0RlYzo6b25SZWxlYXNlKCkgeworICAgIGlmIChtU3RhdGUpIHsKKyAgICAgICAgdm9yYmlzX2RzcF9jbGVhcihtU3RhdGUpOworICAgICAgICBkZWxldGUgbVN0YXRlOworICAgICAgICBtU3RhdGUgPSBudWxscHRyOworICAgIH0KKworICAgIGlmIChtVmkpIHsKKyAgICAgICAgdm9yYmlzX2luZm9fY2xlYXIobVZpKTsKKyAgICAgICAgZGVsZXRlIG1WaTsKKyAgICAgICAgbVZpID0gbnVsbHB0cjsKKyAgICB9Cit9CisKK3N0YXR1c190IEMyU29mdFZvcmJpc0RlYzo6aW5pdERlY29kZXIoKSB7CisgICAgbVZpID0gbmV3IHZvcmJpc19pbmZve307CisgICAgaWYgKCFtVmkpIHJldHVybiBOT19NRU1PUlk7CisgICAgdm9yYmlzX2luZm9fY2xlYXIobVZpKTsKKworICAgIG1TdGF0ZSA9IG5ldyB2b3JiaXNfZHNwX3N0YXRle307CisgICAgaWYgKCFtU3RhdGUpIHJldHVybiBOT19NRU1PUlk7CisgICAgdm9yYmlzX2RzcF9jbGVhcihtU3RhdGUpOworCisgICAgbU51bUZyYW1lc0xlZnRPblBhZ2UgPSAtMTsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisgICAgbUluZm9VbnBhY2tlZCA9IGZhbHNlOworICAgIG1Cb29rc1VucGFja2VkID0gZmFsc2U7CisgICAgcmV0dXJuIE9LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRWb3JiaXNEZWM6Om9uRmx1c2hfc20oKSB7CisgICAgbU51bUZyYW1lc0xlZnRPblBhZ2UgPSAtMTsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisgICAgaWYgKG1TdGF0ZSkgdm9yYmlzX2RzcF9yZXN0YXJ0KG1TdGF0ZSk7CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdFZvcmJpc0RlYzo6ZHJhaW4oCisgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgICh2b2lkKSBwb29sOworICAgIGlmIChkcmFpbk1vZGUgPT0gTk9fRFJBSU4pIHsKKyAgICAgICAgQUxPR1coImRyYWluIHdpdGggTk9fRFJBSU46IG5vLW9wIik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisgICAgaWYgKGRyYWluTW9kZSA9PSBEUkFJTl9DSEFJTikgeworICAgICAgICBBTE9HVygiRFJBSU5fQ0hBSU4gbm90IHN1cHBvcnRlZCIpOworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3N0YXRpYyB2b2lkIGZpbGxFbXB0eVdvcmsoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworfQorCitzdGF0aWMgdm9pZCBtYWtlQml0UmVhZGVyKAorICAgICAgICBjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSwKKyAgICAgICAgb2dnX2J1ZmZlciAqYnVmLCBvZ2dfcmVmZXJlbmNlICpyZWYsIG9nZ3BhY2tfYnVmZmVyICpiaXRzKSB7CisgICAgYnVmLT5kYXRhID0gKHVpbnQ4X3QgKilkYXRhOworICAgIGJ1Zi0+c2l6ZSA9IHNpemU7CisgICAgYnVmLT5yZWZjb3VudCA9IDE7CisgICAgYnVmLT5wdHIub3duZXIgPSBudWxscHRyOworCisgICAgcmVmLT5idWZmZXIgPSBidWY7CisgICAgcmVmLT5iZWdpbiA9IDA7CisgICAgcmVmLT5sZW5ndGggPSBzaXplOworICAgIHJlZi0+bmV4dCA9IG51bGxwdHI7CisKKyAgICBvZ2dwYWNrX3JlYWRpbml0KGJpdHMsIHJlZik7Cit9CisKKy8vIChDSEVDSyEpIG11bHRpZnJhbWUgaXMgdHJpY2t5LiBkZWNvZGUgY2FsbCBkb2VzbnQgcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMKKy8vIGNvbnN1bWVkIGJ5IHRoZSBjb21wb25lbnQuIEFsc28gaXQgaXMgdW5jbGVhciB3aHkgbnVtUGFnZUZyYW1lcyBpcyBiZWluZworLy8gdGFnZ2VkIGF0IHRoZSBlbmQgb2YgaW5wdXQgYnVmZmVycyBmb3IgbmV3IHBhZ2VzLiBSZWZlciBsaW5lcyAyOTctMzAwIGluCisvLyBTaW1wbGVEZWNvZGluZ1NvdXJjZS5jcHAKK3ZvaWQgQzJTb2Z0Vm9yYmlzRGVjOjpwcm9jZXNzKAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgIC8vIEluaXRpYWxpemUgb3V0cHV0IHdvcmsKKyAgICB3b3JrLT5yZXN1bHQgPSBDMl9PSzsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKworICAgIGlmIChtU2lnbmFsbGVkRXJyb3IgfHwgbVNpZ25hbGxlZE91dHB1dEVvcykgeworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9CQURfVkFMVUU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBib29sIGVvcyA9ICgod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSAhPSAwKTsKKyAgICBzaXplX3QgaW5PZmZzZXQgPSAwdTsKKyAgICBzaXplX3QgaW5TaXplID0gMHU7CisgICAgQzJSZWFkVmlldyByVmlldyA9IG1EdW1teVJlYWRWaWV3OworICAgIGlmICghd29yay0+aW5wdXQuYnVmZmVycy5lbXB0eSgpKSB7CisgICAgICAgIHJWaWV3ID0gd29yay0+aW5wdXQuYnVmZmVyc1swXS0+ZGF0YSgpLmxpbmVhckJsb2NrcygpLmZyb250KCkubWFwKCkuZ2V0KCk7CisgICAgICAgIGluU2l6ZSA9IHJWaWV3LmNhcGFjaXR5KCk7CisgICAgICAgIGlmIChpblNpemUgJiYgclZpZXcuZXJyb3IoKSkgeworICAgICAgICAgICAgQUxPR0UoInJlYWQgdmlldyBtYXAgZmFpbGVkICVkIiwgclZpZXcuZXJyb3IoKSk7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSByVmlldy5lcnJvcigpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGluU2l6ZSA9PSAwKSB7CisgICAgICAgIGZpbGxFbXB0eVdvcmsod29yayk7CisgICAgICAgIGlmIChlb3MpIHsKKyAgICAgICAgICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSB0cnVlOworICAgICAgICAgICAgQUxPR1YoInNpZ25hbGxlZCBFT1MiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQUxPR1YoImluIGJ1ZmZlciBhdHRyLiBzaXplICV6dSB0aW1lc3RhbXAgJWQgZnJhbWVpbmRleCAlZCIsIGluU2l6ZSwKKyAgICAgICAgICAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1KCksIChpbnQpd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCkpOworICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPSByVmlldy5kYXRhKCkgKyBpbk9mZnNldDsKKyAgICBpbnQzMl90IG51bUNoYW5uZWxzICA9IG1WaS0+Y2hhbm5lbHM7CisgICAgaW50MzJfdCBzYW1wbGluZ1JhdGUgPSBtVmktPnJhdGU7CisgICAgaWYgKGluU2l6ZSA+IDcgJiYgIW1lbWNtcCgmZGF0YVsxXSwgInZvcmJpcyIsIDYpKSB7CisgICAgICAgIGlmICgoZGF0YVswXSAhPSAxKSAmJiAoZGF0YVswXSAhPSA1KSkgeworICAgICAgICAgICAgQUxPR0UoInVuZXhwZWN0ZWQgdHlwZSByZWNlaXZlZCAlZCIsIGRhdGFbMF0pOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIG9nZ19idWZmZXIgYnVmOworICAgICAgICBvZ2dfcmVmZXJlbmNlIHJlZjsKKyAgICAgICAgb2dncGFja19idWZmZXIgYml0czsKKworICAgICAgICAvLyBza2lwIDcgPHR5cGUgKyAidm9yYmlzIj4gYnl0ZXMKKyAgICAgICAgbWFrZUJpdFJlYWRlcigoY29uc3QgdWludDhfdCAqKWRhdGEgKyA3LCBpblNpemUgLSA3LCAmYnVmLCAmcmVmLCAmYml0cyk7CisgICAgICAgIGlmIChkYXRhWzBdID09IDEpIHsKKyAgICAgICAgICAgIHZvcmJpc19pbmZvX2luaXQobVZpKTsKKyAgICAgICAgICAgIGlmICgwICE9IF92b3JiaXNfdW5wYWNrX2luZm8obVZpLCAmYml0cykpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiRW5jb3VudGVyZWQgZXJyb3Igd2hpbGUgdW5wYWNraW5nIGluZm8iKTsKKyAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobVZpLT5yYXRlICE9IHNhbXBsaW5nUmF0ZSB8fAorICAgICAgICAgICAgICAgICAgICBtVmktPmNoYW5uZWxzICE9IG51bUNoYW5uZWxzKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoInZvcmJpczogcmF0ZS9jaGFubmVscyBjaGFuZ2VkOiAlbGQvJWQiLCBtVmktPnJhdGUsIG1WaS0+Y2hhbm5lbHMpOworICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZSA9IG1WaS0+cmF0ZTsKKyAgICAgICAgICAgICAgICBudW1DaGFubmVscyA9IG1WaS0+Y2hhbm5lbHM7CisKKyAgICAgICAgICAgICAgICBDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjpvdXRwdXQgc2FtcGxlUmF0ZUluZm8oMHUsIHNhbXBsaW5nUmF0ZSk7CisgICAgICAgICAgICAgICAgQzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjpvdXRwdXQgY2hhbm5lbENvdW50SW5mbygwdSwgbnVtQ2hhbm5lbHMpOworICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICAgICAgICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBtSW50Zi0+Y29uZmlnKAorICAgICAgICAgICAgICAgICAgICAgICAgeyAmc2FtcGxlUmF0ZUluZm8sICZjaGFubmVsQ291bnRJbmZvIH0sCisgICAgICAgICAgICAgICAgICAgICAgICBDMl9NQVlfQkxPQ0ssCisgICAgICAgICAgICAgICAgICAgICAgICAmZmFpbHVyZXMpOworICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5wdXNoX2JhY2soQzJQYXJhbTo6Q29weShzYW1wbGVSYXRlSW5mbykpOworICAgICAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLnB1c2hfYmFjayhDMlBhcmFtOjpDb3B5KGNoYW5uZWxDb3VudEluZm8pKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiQ29uZmlnIFVwZGF0ZSBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbUluZm9VbnBhY2tlZCA9IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoIW1JbmZvVW5wYWNrZWQpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiRGF0YSB3aXRoIHR5cGU6NSBzZW50IGJlZm9yZSBzZW5kaW5nIHR5cGU6MSIpOworICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgwICE9IF92b3JiaXNfdW5wYWNrX2Jvb2tzKG1WaSwgJmJpdHMpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkVuY291bnRlcmVkIGVycm9yIHdoaWxlIHVucGFja2luZyBib29rcyIpOworICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgwICE9IHZvcmJpc19kc3BfaW5pdChtU3RhdGUsIG1WaSkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiRW5jb3VudGVyZWQgZXJyb3Igd2hpbGUgZHNwIGluaXQiKTsKKyAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQm9va3NVbnBhY2tlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICAgICAgaWYgKGVvcykgeworICAgICAgICAgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IHRydWU7CisgICAgICAgICAgICBBTE9HVigic2lnbmFsbGVkIEVPUyIpOworICAgICAgICB9CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoIW1JbmZvVW5wYWNrZWQgfHwgIW1Cb29rc1VucGFja2VkKSB7CisgICAgICAgIEFMT0dFKCJNaXNzaW5nIENPREVDX0NPTkZJRyBkYXRhIG1JbmZvVW5wYWNrZWQ6ICVkIG1Cb29rc1VucGFjayAlZCIsIG1JbmZvVW5wYWNrZWQsIG1Cb29rc1VucGFja2VkKTsKKyAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW50MzJfdCBudW1QYWdlRnJhbWVzID0gMDsKKyAgICBpZiAoaW5TaXplIDwgc2l6ZW9mKG51bVBhZ2VGcmFtZXMpKSB7CisgICAgICAgIEFMT0dFKCJpbnB1dCBoZWFkZXIgaGFzIHNpemUgJXp1LCBleHBlY3RlZCAlenUiLCBpblNpemUsIHNpemVvZihudW1QYWdlRnJhbWVzKSk7CisgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtZW1jcHkoJm51bVBhZ2VGcmFtZXMsIGRhdGEgKyBpblNpemUgLSBzaXplb2YobnVtUGFnZUZyYW1lcyksIHNpemVvZihudW1QYWdlRnJhbWVzKSk7CisgICAgaW5TaXplIC09IHNpemVvZihudW1QYWdlRnJhbWVzKTsKKyAgICBpZiAobnVtUGFnZUZyYW1lcyA+PSAwKSB7CisgICAgICAgIG1OdW1GcmFtZXNMZWZ0T25QYWdlID0gbnVtUGFnZUZyYW1lczsKKyAgICB9CisKKyAgICBvZ2dfYnVmZmVyIGJ1ZjsKKyAgICBidWYuZGF0YSA9IGNvbnN0X2Nhc3Q8dW5zaWduZWQgY2hhcio+KGRhdGEpOworICAgIGJ1Zi5zaXplID0gaW5TaXplOworICAgIGJ1Zi5yZWZjb3VudCA9IDE7CisgICAgYnVmLnB0ci5vd25lciA9IG51bGxwdHI7CisKKyAgICBvZ2dfcmVmZXJlbmNlIHJlZjsKKyAgICByZWYuYnVmZmVyID0gJmJ1ZjsKKyAgICByZWYuYmVnaW4gPSAwOworICAgIHJlZi5sZW5ndGggPSBidWYuc2l6ZTsKKyAgICByZWYubmV4dCA9IG51bGxwdHI7CisKKyAgICBvZ2dfcGFja2V0IHBhY2s7CisgICAgcGFjay5wYWNrZXQgPSAmcmVmOworICAgIHBhY2suYnl0ZXMgPSByZWYubGVuZ3RoOworICAgIHBhY2suYl9vX3MgPSAwOworICAgIHBhY2suZV9vX3MgPSAwOworICAgIHBhY2suZ3JhbnVsZXBvcyA9IDA7CisgICAgcGFjay5wYWNrZXRubyA9IDA7CisKKyAgICBzaXplX3QgbWF4U2FtcGxlc0luQnVmZmVyID0ga01heE51bVNhbXBsZXNQZXJDaGFubmVsICogbVZpLT5jaGFubmVsczsKKyAgICBzaXplX3Qgb3V0Q2FwYWNpdHkgPSAgbWF4U2FtcGxlc0luQnVmZmVyICogc2l6ZW9mKGludDE2X3QpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBibG9jazsKKyAgICBDMk1lbW9yeVVzYWdlIHVzYWdlID0geyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH07CisgICAgYzJfc3RhdHVzX3QgZXJyID0gcG9vbC0+ZmV0Y2hMaW5lYXJCbG9jayhvdXRDYXBhY2l0eSwgdXNhZ2UsICZibG9jayk7CisgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICBBTE9HRSgiZmV0Y2hMaW5lYXJCbG9jayBmb3IgT3V0cHV0IGZhaWxlZCB3aXRoIHN0YXR1cyAlZCIsIGVycik7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX05PX01FTU9SWTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBDMldyaXRlVmlldyB3VmlldyA9IGJsb2NrLT5tYXAoKS5nZXQoKTsKKyAgICBpZiAod1ZpZXcuZXJyb3IoKSkgeworICAgICAgICBBTE9HRSgid3JpdGUgdmlldyBtYXAgZmFpbGVkICVkIiwgd1ZpZXcuZXJyb3IoKSk7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IHdWaWV3LmVycm9yKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpbnQgbnVtRnJhbWVzID0gMDsKKyAgICBpbnQgcmV0ID0gdm9yYmlzX2RzcF9zeW50aGVzaXMobVN0YXRlLCAmcGFjaywgMSk7CisgICAgaWYgKDAgIT0gcmV0KSB7CisgICAgICAgIEFMT0dFKCJ2b3JiaXNfZHNwX3N5bnRoZXNpcyByZXR1cm5lZCAlZCIsIHJldCk7CisgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgcmV0dXJuOworICAgIH0gZWxzZSB7CisgICAgICAgIG51bUZyYW1lcyA9IHZvcmJpc19kc3BfcGNtb3V0KAorICAgICAgICAgICAgICAgIG1TdGF0ZSwgIHJlaW50ZXJwcmV0X2Nhc3Q8aW50MTZfdCAqPiAod1ZpZXcuZGF0YSgpKSwKKyAgICAgICAgICAgICAgICBrTWF4TnVtU2FtcGxlc1BlckNoYW5uZWwpOworICAgICAgICBpZiAobnVtRnJhbWVzIDwgMCkgeworICAgICAgICAgICAgQUxPR0QoInZvcmJpc19kc3BfcGNtb3V0IHJldHVybmVkICVkIiwgbnVtRnJhbWVzKTsKKyAgICAgICAgICAgIG51bUZyYW1lcyA9IDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobU51bUZyYW1lc0xlZnRPblBhZ2UgPj0gMCkgeworICAgICAgICBpZiAobnVtRnJhbWVzID4gbU51bUZyYW1lc0xlZnRPblBhZ2UpIHsKKyAgICAgICAgICAgIEFMT0dWKCJkaXNjYXJkaW5nICVkIGZyYW1lcyBhdCBlbmQgb2YgcGFnZSIsIG51bUZyYW1lcyAtIG1OdW1GcmFtZXNMZWZ0T25QYWdlKTsKKyAgICAgICAgICAgIG51bUZyYW1lcyA9IG1OdW1GcmFtZXNMZWZ0T25QYWdlOworICAgICAgICB9CisgICAgICAgIG1OdW1GcmFtZXNMZWZ0T25QYWdlIC09IG51bUZyYW1lczsKKyAgICB9CisKKyAgICBpZiAobnVtRnJhbWVzKSB7CisgICAgICAgIGludCBvdXRTaXplID0gbnVtRnJhbWVzICogc2l6ZW9mKGludDE2X3QpICogbVZpLT5jaGFubmVsczsKKworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMucHVzaF9iYWNrKGNyZWF0ZUxpbmVhckJ1ZmZlcihibG9jaywgMCwgb3V0U2l6ZSkpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICAgICAgYmxvY2sucmVzZXQoKTsKKyAgICB9CisgICAgaWYgKGVvcykgeworICAgICAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gdHJ1ZTsKKyAgICAgICAgQUxPR1YoInNpZ25hbGxlZCBFT1MiKTsKKyAgICB9Cit9CisKK2NsYXNzIEMyU29mdFZvcmJpc0RlY0ZhY3RvcnkgOiBwdWJsaWMgQzJDb21wb25lbnRGYWN0b3J5IHsKK3B1YmxpYzoKKyAgICBDMlNvZnRWb3JiaXNEZWNGYWN0b3J5KCkgOiBtSGVscGVyKHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxDMlJlZmxlY3RvckhlbHBlcj4oCisgICAgICAgICAgICBHZXRDb2RlYzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCktPmdldFBhcmFtUmVmbGVjdG9yKCkpKSB7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVDb21wb25lbnQoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KiBjb25zdCBjb21wb25lbnQsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnQqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqY29tcG9uZW50ID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PigKKyAgICAgICAgICAgICAgICBuZXcgQzJTb2Z0Vm9yYmlzRGVjKENPTVBPTkVOVF9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdFZvcmJpc0RlYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiogY29uc3QgaW50ZXJmYWNlLAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50SW50ZXJmYWNlKik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmludGVyZmFjZSA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4oCisgICAgICAgICAgICAgICAgbmV3IFNpbXBsZUludGVyZmFjZTxDMlNvZnRWb3JiaXNEZWM6OkludGZJbXBsPigKKyAgICAgICAgICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLCBpZCwgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRWb3JiaXNEZWM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5DMlNvZnRWb3JiaXNEZWNGYWN0b3J5KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gbUhlbHBlcjsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2V4dGVybiAiQyIgOjpDMkNvbXBvbmVudEZhY3RvcnkqIENyZWF0ZUNvZGVjMkZhY3RvcnkoKSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIHJldHVybiBuZXcgOjphbmRyb2lkOjpDMlNvZnRWb3JiaXNEZWNGYWN0b3J5KCk7Cit9CisKK2V4dGVybiAiQyIgdm9pZCBEZXN0cm95Q29kZWMyRmFjdG9yeSg6OkMyQ29tcG9uZW50RmFjdG9yeSogZmFjdG9yeSkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICBkZWxldGUgZmFjdG9yeTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZvcmJpcy9DMlNvZnRWb3JiaXNEZWMuaCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZvcmJpcy9DMlNvZnRWb3JiaXNEZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmY3MzI2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdm9yYmlzL0MyU29mdFZvcmJpc0RlYy5oCkBAIC0wLDAgKzEsNzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQzJfU09GVF9WT1JCSVNfREVDX0hfCisjZGVmaW5lIEFORFJPSURfQzJfU09GVF9WT1JCSVNfREVDX0hfCisKKyNpbmNsdWRlIDxTaW1wbGVDMkNvbXBvbmVudC5oPgorCisKK3N0cnVjdCB2b3JiaXNfZHNwX3N0YXRlOworc3RydWN0IHZvcmJpc19pbmZvOworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBDMlNvZnRWb3JiaXNEZWMgOiBwdWJsaWMgU2ltcGxlQzJDb21wb25lbnQgeworICAgIGNsYXNzIEludGZJbXBsOworCisgICAgQzJTb2Z0Vm9yYmlzRGVjKGNvbnN0IGNoYXIgKm5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiAmaW50ZkltcGwpOworICAgIHZpcnR1YWwgfkMyU29mdFZvcmJpc0RlYygpOworCisgICAgLy8gRnJvbSBTaW1wbGVDMkNvbXBvbmVudAorICAgIGMyX3N0YXR1c190IG9uSW5pdCgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uU3RvcCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZXNldCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZWxlYXNlKCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25GbHVzaF9zbSgpIG92ZXJyaWRlOworICAgIHZvaWQgcHJvY2VzcygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3QgZHJhaW4oCisgICAgICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKworIHByaXZhdGU6CisgICAgZW51bSB7CisgICAgICAgIGtNYXhOdW1TYW1wbGVzUGVyQ2hhbm5lbCA9IDgxOTIsCisgICAgfTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gbUludGY7CisgICAgdm9yYmlzX2RzcF9zdGF0ZSAqbVN0YXRlOworICAgIHZvcmJpc19pbmZvICptVmk7CisKKyAgICBpbnQzMl90IG1OdW1GcmFtZXNMZWZ0T25QYWdlOworICAgIGJvb2wgbVNpZ25hbGxlZEVycm9yOworICAgIGJvb2wgbVNpZ25hbGxlZE91dHB1dEVvczsKKyAgICBib29sIG1JbmZvVW5wYWNrZWQ7CisgICAgYm9vbCBtQm9va3NVbnBhY2tlZDsKKyAgICBzdGF0dXNfdCBpbml0RGVjb2RlcigpOworCisgICAgQzJfRE9fTk9UX0NPUFkoQzJTb2Z0Vm9yYmlzRGVjKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9DMl9TT0ZUX1ZPUkJJU19ERUNfSF8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdm9yYmlzL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92b3JiaXMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdm9yYmlzL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZvcmJpcy9OT1RJQ0UgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92b3JiaXMvTk9USUNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1YjFlZmEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92b3JiaXMvTk9USUNFCkBAIC0wLDAgKzEsMTkwIEBACisKKyAgIENvcHlyaWdodCAoYykgMjAwNS0yMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAorICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLworCisgICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KKworICAgMS4gRGVmaW5pdGlvbnMuCisKKyAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCisgICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KKworICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKKyAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KKworICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAorICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgorICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKKyAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQorICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKKyAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQorICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KKworICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KKworICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCisgICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCisgICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgorCisgICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAorICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAorICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAorICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgorCisgICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgorICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQorICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCisgICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgorCisgICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0CisgICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCisgICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCisgICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcworICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCisgICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCisgICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgorCisgICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZworICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucworICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5CisgICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCisgICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKKyAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgorICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAorICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KKyAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCisgICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQorICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0CisgICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQorICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCisKKyAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKKyAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgorCisgICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKKyAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQorICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KKworICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCisgICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKKyAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCisgICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgorICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQorICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKKyAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCisgICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCisgICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAorICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcworICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCisgICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCisKKyAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCisgICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKKyAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91CisgICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKKyAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAorCisgICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCisgICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCisKKyAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcworICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKKyAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAorICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKKyAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCisKKyAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cworICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKKyAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKKyAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKKyAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKKyAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAorICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKKyAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKKyAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCisgICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCisgICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAorICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCisgICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKKyAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKKyAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKKyAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCisKKyAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAorICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgorICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCisgICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKKyAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCisKKyAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKKyAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaworICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgorICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQorICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKKyAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KKworICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQorICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAorICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCisgICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KKworICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCisgICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCisgICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKKyAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKKyAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQorICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55CisgICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCisKKyAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAorICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCisgICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQorICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKKyAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKKyAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQorICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQorICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAorICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKKyAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKKyAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KKworICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZworICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKKyAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCisgICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcworICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKKyAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCisgICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCisgICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKKyAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KKyAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgorCisgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmZkMzc5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0FuZHJvaWQuYnAKQEAgLTAsMCArMSw2MCBAQAorY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF92cDlkZWMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9hbGwtZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbIkMyU29mdFZweERlYy5jcHAiXSwKKworICAgIHN0YXRpY19saWJzOiBbImxpYnZweCJdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItRFZQOSIsCisgICAgXSwKK30KKworY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF92cDhkZWMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9hbGwtZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbIkMyU29mdFZweERlYy5jcHAiXSwKKworICAgIHN0YXRpY19saWJzOiBbImxpYnZweCJdLAorfQorCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X3ZwOWVuYyIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3Nhbml0aXplX2FsbC1kZWZhdWx0cyIsCisgICAgXSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIkMyU29mdFZwOUVuYy5jcHAiLAorICAgICAgICAiQzJTb2Z0VnB4RW5jLmNwcCIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbImxpYnZweCJdLAorCisgICAgY2ZsYWdzOiBbIi1EVlA5Il0sCit9CisKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfdnA4ZW5jIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfc2FuaXRpemVfYWxsLWRlZmF1bHRzIiwKKyAgICBdLAorCisgICAgc3JjczogWworICAgICAgICAiQzJTb2Z0VnA4RW5jLmNwcCIsCisgICAgICAgICJDMlNvZnRWcHhFbmMuY3BwIiwKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsibGlidnB4Il0sCit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9DMlNvZnRWcDhFbmMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZwOEVuYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFlNzE3YQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9DMlNvZnRWcDhFbmMuY3BwCkBAIC0wLDAgKzEsMTE0IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyU29mdFZwOEVuYyIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9taXNjLmg+CisKKyNpbmNsdWRlICJDMlNvZnRWcDhFbmMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjb25zdGV4cHIgY2hhciBDT01QT05FTlRfTkFNRVtdID0gImMyLmFuZHJvaWQudnA4LmVuY29kZXIiOworCitDMlNvZnRWcDhFbmM6OkMyU29mdFZwOEVuYyhjb25zdCBjaGFyKiBuYW1lLCBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+JiBpbnRmSW1wbCkKKyAgICA6IEMyU29mdFZweEVuYyhuYW1lLCBpZCwgaW50ZkltcGwpLCBtRENUUGFydGl0aW9ucygwKSwgbVByb2ZpbGUoMSkge30KKwordm9pZCBDMlNvZnRWcDhFbmM6OnNldENvZGVjU3BlY2lmaWNJbnRlcmZhY2UoKSB7CisgICAgbUNvZGVjSW50ZXJmYWNlID0gdnB4X2NvZGVjX3ZwOF9jeCgpOworfQorCit2b2lkIEMyU29mdFZwOEVuYzo6c2V0Q29kZWNTcGVjaWZpY0NvbmZpZ3VyYXRpb24oKSB7CisgICAgc3dpdGNoIChtUHJvZmlsZSkgeworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5nX3Byb2ZpbGUgPSAwOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+Z19wcm9maWxlID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPmdfcHJvZmlsZSA9IDI7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5nX3Byb2ZpbGUgPSAzOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPmdfcHJvZmlsZSA9IDA7CisgICAgfQorfQorCit2cHhfY29kZWNfZXJyX3QgQzJTb2Z0VnA4RW5jOjpzZXRDb2RlY1NwZWNpZmljQ29udHJvbHMoKSB7CisgICAgdnB4X2NvZGVjX2Vycl90IGNvZGVjX3JldHVybiA9IHZweF9jb2RlY19jb250cm9sKG1Db2RlY0NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOEVfU0VUX1RPS0VOX1BBUlRJVElPTlMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1EQ1RQYXJ0aXRpb25zKTsKKyAgICBpZiAoY29kZWNfcmV0dXJuICE9IFZQWF9DT0RFQ19PSykgeworICAgICAgICBBTE9HRSgiRXJyb3Igc2V0dGluZyBkY3QgcGFydGl0aW9ucyBmb3IgdnB4IGVuY29kZXIuIik7CisgICAgfQorICAgIHJldHVybiBjb2RlY19yZXR1cm47Cit9CisKK2NsYXNzIEMyU29mdFZwOEVuY0ZhY3RvcnkgOiBwdWJsaWMgQzJDb21wb25lbnRGYWN0b3J5IHsKK3B1YmxpYzoKKyAgICBDMlNvZnRWcDhFbmNGYWN0b3J5KCkKKyAgICAgICAgOiBtSGVscGVyKHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxDMlJlZmxlY3RvckhlbHBlcj4oCisgICAgICAgICAgICAgIEdldENvZGVjMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKS0+Z2V0UGFyYW1SZWZsZWN0b3IoKSkpIHt9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4qIGNvbnN0IGNvbXBvbmVudCwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudCopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICpjb21wb25lbnQgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KAorICAgICAgICAgICAgbmV3IEMyU29mdFZwOEVuYyhDT01QT05FTlRfTkFNRSwgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0VnB4RW5jOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4qIGNvbnN0IGludGVyZmFjZSwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudEludGVyZmFjZSopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICppbnRlcmZhY2UgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KAorICAgICAgICAgICAgbmV3IFNpbXBsZUludGVyZmFjZTxDMlNvZnRWcHhFbmM6OkludGZJbXBsPigKKyAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwgaWQsCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRWcHhFbmM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgfkMyU29mdFZwOEVuY0ZhY3RvcnkoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiBtSGVscGVyOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworZXh0ZXJuICJDIiA6OkMyQ29tcG9uZW50RmFjdG9yeSogQ3JlYXRlQ29kZWMyRmFjdG9yeSgpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuIG5ldyA6OmFuZHJvaWQ6OkMyU29mdFZwOEVuY0ZhY3RvcnkoKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5KiBmYWN0b3J5KSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIGRlbGV0ZSBmYWN0b3J5OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZwOEVuYy5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZwOEVuYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkNmYzNTYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnA4RW5jLmgKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0MyX1NPRlRfVlA4X0VOQ19IX18KKyNkZWZpbmUgQU5EUk9JRF9DMl9TT0ZUX1ZQOF9FTkNfSF9fCisKKyNpbmNsdWRlICJDMlNvZnRWcHhFbmMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBFeHBvc2VzIHZwOCBlbmNvZGVyIGFzIGEgYzIgQ29tcG9uZW50CisvLworLy8gSW4gYWRkaXRpb24gdG8gdGhlIGJhc2UgY2xhc3Mgc2V0dGluZ3MsIE9ubHkgZm9sbG93aW5nIGVuY29kZXIgc2V0dGluZ3MgYXJlCisvLyBhdmFpbGFibGU6CisvLyAgICAtIHRva2VuIHBhcnRpdGlvbmluZworc3RydWN0IEMyU29mdFZwOEVuYyA6IHB1YmxpYyBDMlNvZnRWcHhFbmMgeworICAgIEMyU29mdFZwOEVuYyhjb25zdCBjaGFyKiBuYW1lLCBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4mIGludGZJbXBsKTsKKworIHByb3RlY3RlZDoKKyAgICAvLyBQb3B1bGF0ZXMgfG1Db2RlY0ludGVyZmFjZXwgd2l0aCBjb2RlYyBzcGVjaWZpYyBzZXR0aW5ncy4KKyAgICB2aXJ0dWFsIHZvaWQgc2V0Q29kZWNTcGVjaWZpY0ludGVyZmFjZSgpOworCisgICAgLy8gU2V0cyBjb2RlYyBzcGVjaWZpYyBjb25maWd1cmF0aW9uLgorICAgIHZpcnR1YWwgdm9pZCBzZXRDb2RlY1NwZWNpZmljQ29uZmlndXJhdGlvbigpOworCisgICAgLy8gSW5pdGlhbGl6ZXMgY29kZWMgc3BlY2lmaWMgZW5jb2RlciBzZXR0aW5ncy4KKyAgICB2aXJ0dWFsIHZweF9jb2RlY19lcnJfdCBzZXRDb2RlY1NwZWNpZmljQ29udHJvbHMoKTsKKworIHByaXZhdGU6CisgICAgLy8gTWF4IHZhbHVlIHN1cHBvcnRlZCBmb3IgRENUIHBhcnRpdGlvbnMKKyAgICBzdGF0aWMgY29uc3QgdWludDMyX3Qga01heERDVFBhcnRpdGlvbnMgPSAzOworCisgICAgLy8gdnA4IHNwZWNpZmljIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyCisgICAgLy8gdGhhdCBlbmFibGVzIHRva2VuIHBhcnRpdGlvbmluZyBvZgorICAgIC8vIHRoZSBzdHJlYW0gaW50byBzdWJzdHJlYW1zCisgICAgaW50MzJfdCBtRENUUGFydGl0aW9uczsKKworICAgIC8vIEMyIFByb2ZpbGUgcGFyYW1ldGVyCisgICAgaW50MzJfdCBtUHJvZmlsZTsKKworICAgIEMyX0RPX05PVF9DT1BZKEMyU29mdFZwOEVuYyk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfQzJfU09GVF9WUDhfRU5DX0hfXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZwOUVuYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnA5RW5jLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjYxNzBmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZwOUVuYy5jcHAKQEAgLTAsMCArMSwxNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJTb2Z0VnA5RW5jIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL21pc2MuaD4KKworI2luY2x1ZGUgIkMyU29mdFZwOUVuYy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NvbnN0ZXhwciBjaGFyIENPTVBPTkVOVF9OQU1FW10gPSAiYzIuYW5kcm9pZC52cDkuZW5jb2RlciI7CisKK0MyU29mdFZwOUVuYzo6QzJTb2Z0VnA5RW5jKGNvbnN0IGNoYXIqIG5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4mIGludGZJbXBsKQorICAgIDogQzJTb2Z0VnB4RW5jKG5hbWUsIGlkLCBpbnRmSW1wbCksCisgICAgICBtUHJvZmlsZSgxKSwKKyAgICAgIG1MZXZlbCgwKSwKKyAgICAgIG1UaWxlQ29sdW1ucygwKSwKKyAgICAgIG1GcmFtZVBhcmFsbGVsRGVjb2RpbmcoZmFsc2UpIHsKK30KKwordm9pZCBDMlNvZnRWcDlFbmM6OnNldENvZGVjU3BlY2lmaWNJbnRlcmZhY2UoKSB7CisgICAgbUNvZGVjSW50ZXJmYWNlID0gdnB4X2NvZGVjX3ZwOV9jeCgpOworfQorCit2b2lkIEMyU29mdFZwOUVuYzo6c2V0Q29kZWNTcGVjaWZpY0NvbmZpZ3VyYXRpb24oKSB7CisgICAgc3dpdGNoIChtUHJvZmlsZSkgeworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5nX3Byb2ZpbGUgPSAwOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+Z19wcm9maWxlID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPmdfcHJvZmlsZSA9IDI7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5nX3Byb2ZpbGUgPSAzOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPmdfcHJvZmlsZSA9IDA7CisgICAgfQorfQorCit2cHhfY29kZWNfZXJyX3QgQzJTb2Z0VnA5RW5jOjpzZXRDb2RlY1NwZWNpZmljQ29udHJvbHMoKSB7CisgICAgdnB4X2NvZGVjX2Vycl90IGNvZGVjUmV0dXJuID0gdnB4X2NvZGVjX2NvbnRyb2woCisgICAgICAgICAgICBtQ29kZWNDb250ZXh0LCBWUDlFX1NFVF9USUxFX0NPTFVNTlMsIG1UaWxlQ29sdW1ucyk7CisgICAgaWYgKGNvZGVjUmV0dXJuICE9IFZQWF9DT0RFQ19PSykgeworICAgICAgICBBTE9HRSgiRXJyb3Igc2V0dGluZyBWUDlFX1NFVF9USUxFX0NPTFVNTlMgdG8gJWQuIHZweF9jb2RlY19jb250cm9sKCkgIgorICAgICAgICAgICAgICAicmV0dXJuZWQgJWQiLCBtVGlsZUNvbHVtbnMsIGNvZGVjUmV0dXJuKTsKKyAgICAgICAgcmV0dXJuIGNvZGVjUmV0dXJuOworICAgIH0KKyAgICBjb2RlY1JldHVybiA9IHZweF9jb2RlY19jb250cm9sKAorICAgICAgICAgICAgbUNvZGVjQ29udGV4dCwgVlA5RV9TRVRfRlJBTUVfUEFSQUxMRUxfREVDT0RJTkcsCisgICAgICAgICAgICBtRnJhbWVQYXJhbGxlbERlY29kaW5nKTsKKyAgICBpZiAoY29kZWNSZXR1cm4gIT0gVlBYX0NPREVDX09LKSB7CisgICAgICAgIEFMT0dFKCJFcnJvciBzZXR0aW5nIFZQOUVfU0VUX0ZSQU1FX1BBUkFMTEVMX0RFQ09ESU5HIHRvICVkLiIKKyAgICAgICAgICAgICAgInZweF9jb2RlY19jb250cm9sKCkgcmV0dXJuZWQgJWQiLCBtRnJhbWVQYXJhbGxlbERlY29kaW5nLAorICAgICAgICAgICAgICBjb2RlY1JldHVybik7CisgICAgICAgIHJldHVybiBjb2RlY1JldHVybjsKKyAgICB9CisgICAgY29kZWNSZXR1cm4gPSB2cHhfY29kZWNfY29udHJvbChtQ29kZWNDb250ZXh0LCBWUDlFX1NFVF9ST1dfTVQsIDEpOworICAgIGlmIChjb2RlY1JldHVybiAhPSBWUFhfQ09ERUNfT0spIHsKKyAgICAgICAgQUxPR0UoIkVycm9yIHNldHRpbmcgVlA5RV9TRVRfUk9XX01UIHRvIDEuIHZweF9jb2RlY19jb250cm9sKCkgIgorICAgICAgICAgICAgICAicmV0dXJuZWQgJWQiLCBjb2RlY1JldHVybik7CisgICAgICAgIHJldHVybiBjb2RlY1JldHVybjsKKyAgICB9CisKKyAgICAvLyBGb3IgVlA5LCB3ZSBhbHdheXMgc2V0IENQVV9VU0VEIHRvIDggKGJlY2F1c2UgdGhlIHJlYWx0aW1lIGRlZmF1bHQgaXMgMAorICAgIC8vIHdoaWNoIGlzIHRvbyBzbG93KS4KKyAgICBjb2RlY1JldHVybiA9IHZweF9jb2RlY19jb250cm9sKG1Db2RlY0NvbnRleHQsIFZQOEVfU0VUX0NQVVVTRUQsIDgpOworICAgIGlmIChjb2RlY1JldHVybiAhPSBWUFhfQ09ERUNfT0spIHsKKyAgICAgICAgQUxPR0UoIkVycm9yIHNldHRpbmcgVlA4RV9TRVRfQ1BVVVNFRCB0byA4LiB2cHhfY29kZWNfY29udHJvbCgpICIKKyAgICAgICAgICAgICAgInJldHVybmVkICVkIiwgY29kZWNSZXR1cm4pOworICAgICAgICByZXR1cm4gY29kZWNSZXR1cm47CisgICAgfQorICAgIHJldHVybiBjb2RlY1JldHVybjsKK30KKworY2xhc3MgQzJTb2Z0VnA5RW5jRmFjdG9yeSA6IHB1YmxpYyBDMkNvbXBvbmVudEZhY3RvcnkgeworcHVibGljOgorICAgIEMyU29mdFZwOUVuY0ZhY3RvcnkoKQorICAgICAgICA6IG1IZWxwZXIoc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyUmVmbGVjdG9ySGVscGVyPigKKyAgICAgICAgICAgICAgR2V0Q29kZWMyUGxhdGZvcm1Db21wb25lbnRTdG9yZSgpLT5nZXRQYXJhbVJlZmxlY3RvcigpKSkge30KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlQ29tcG9uZW50KAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiogY29uc3QgY29tcG9uZW50LAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50Kik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmNvbXBvbmVudCA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4oCisgICAgICAgICAgICBuZXcgQzJTb2Z0VnA5RW5jKENPTVBPTkVOVF9OQU1FLCBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRWcHhFbmM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiogY29uc3QgaW50ZXJmYWNlLAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50SW50ZXJmYWNlKik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmludGVyZmFjZSA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4oCisgICAgICAgICAgICBuZXcgU2ltcGxlSW50ZXJmYWNlPEMyU29mdFZweEVuYzo6SW50ZkltcGw+KAorICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLCBpZCwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdFZweEVuYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCB+QzJTb2Z0VnA5RW5jRmFjdG9yeSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+IG1IZWxwZXI7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCitleHRlcm4gIkMiIDo6QzJDb21wb25lbnRGYWN0b3J5KiBDcmVhdGVDb2RlYzJGYWN0b3J5KCkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gbmV3IDo6YW5kcm9pZDo6QzJTb2Z0VnA5RW5jRmFjdG9yeSgpOworfQorCitleHRlcm4gIkMiIHZvaWQgRGVzdHJveUNvZGVjMkZhY3RvcnkoOjpDMkNvbXBvbmVudEZhY3RvcnkqIGZhY3RvcnkpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgZGVsZXRlIGZhY3Rvcnk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnA5RW5jLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnA5RW5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdlZjhmZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9DMlNvZnRWcDlFbmMuaApAQCAtMCwwICsxLDU5IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQzJfU09GVF9WUDlfRU5DX0hfXworI2RlZmluZSBBTkRST0lEX0MyX1NPRlRfVlA5X0VOQ19IX18KKworI2luY2x1ZGUgIkMyU29mdFZweEVuYy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIEV4cG9zZXMgdnA5IGVuY29kZXIgYXMgYSBjMiBDb21wb25lbnQKKy8vCisvLyBJbiBhZGRpdGlvbiB0byB0aGUgYmFzZSBjbGFzcyBzZXR0aW5ncywgT25seSBmb2xsb3dpbmcgZW5jb2RlciBzZXR0aW5ncyBhcmUKKy8vIGF2YWlsYWJsZToKKy8vICAgIC0gdGlsZSByb3dzCisvLyAgICAtIHRpbGUgY29sdW1ucworLy8gICAgLSBmcmFtZSBwYXJhbGxlbCBtb2RlCitzdHJ1Y3QgQzJTb2Z0VnA5RW5jIDogcHVibGljIEMyU29mdFZweEVuYyB7CisgICAgQzJTb2Z0VnA5RW5jKGNvbnN0IGNoYXIqIG5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiYgaW50ZkltcGwpOworCisgcHJvdGVjdGVkOgorICAgIC8vIFBvcHVsYXRlcyB8bUNvZGVjSW50ZXJmYWNlfCB3aXRoIGNvZGVjIHNwZWNpZmljIHNldHRpbmdzLgorICAgIHZpcnR1YWwgdm9pZCBzZXRDb2RlY1NwZWNpZmljSW50ZXJmYWNlKCk7CisKKyAgICAvLyBTZXRzIGNvZGVjIHNwZWNpZmljIGNvbmZpZ3VyYXRpb24uCisgICAgdmlydHVhbCB2b2lkIHNldENvZGVjU3BlY2lmaWNDb25maWd1cmF0aW9uKCk7CisKKyAgICAvLyBJbml0aWFsaXplcyBjb2RlYyBzcGVjaWZpYyBlbmNvZGVyIHNldHRpbmdzLgorICAgIHZpcnR1YWwgdnB4X2NvZGVjX2Vycl90IHNldENvZGVjU3BlY2lmaWNDb250cm9scygpOworCisgcHJpdmF0ZToKKyAgICAvLyBDMiBQcm9maWxlICYgTGV2ZWwgcGFyYW1ldGVyCisgICAgaW50MzJfdCBtUHJvZmlsZTsKKyAgICBpbnQzMl90IG1MZXZlbCBfX3VudXNlZDsKKworICAgIGludDMyX3QgbVRpbGVDb2x1bW5zOworCisgICAgYm9vbCBtRnJhbWVQYXJhbGxlbERlY29kaW5nOworCisgICAgQzJfRE9fTk9UX0NPUFkoQzJTb2Z0VnA5RW5jKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9DMl9TT0ZUX1ZQOV9FTkNfSF9fCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnB4RGVjLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9DMlNvZnRWcHhEZWMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxZGU2ODEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnB4RGVjLmNwcApAQCAtMCwwICsxLDY0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJTb2Z0VnB4RGVjIgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaD4KKworI2luY2x1ZGUgPEMyRGVidWcuaD4KKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPFNpbXBsZUMySW50ZXJmYWNlLmg+CisKKyNpbmNsdWRlICJDMlNvZnRWcHhEZWMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisjaWZkZWYgVlA5Citjb25zdGV4cHIgY2hhciBDT01QT05FTlRfTkFNRVtdID0gImMyLmFuZHJvaWQudnA5LmRlY29kZXIiOworI2Vsc2UKK2NvbnN0ZXhwciBjaGFyIENPTVBPTkVOVF9OQU1FW10gPSAiYzIuYW5kcm9pZC52cDguZGVjb2RlciI7CisjZW5kaWYKKworY2xhc3MgQzJTb2Z0VnB4RGVjOjpJbnRmSW1wbCA6IHB1YmxpYyBTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXMgeworcHVibGljOgorICAgIGV4cGxpY2l0IEludGZJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gJmhlbHBlcikKKyAgICAgICAgOiBTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXMoCisgICAgICAgICAgICAgICAgaGVscGVyLAorICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLAorICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50OjpLSU5EX0RFQ09ERVIsCisgICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OkRPTUFJTl9WSURFTywKKyNpZmRlZiBWUDkKKyAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9WSURFT19WUDkKKyNlbHNlCisgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfVklERU9fVlA4CisjZW5kaWYKKyAgICAgICAgICAgICAgICApIHsKKyAgICAgICAgbm9Qcml2YXRlQnVmZmVycygpOyAvLyBUT0RPOiBhY2NvdW50IGZvciBvdXIgYnVmZmVycyBoZXJlCisgICAgICAgIG5vSW5wdXRSZWZlcmVuY2VzKCk7CisgICAgICAgIG5vT3V0cHV0UmVmZXJlbmNlcygpOworICAgICAgICBub0lucHV0TGF0ZW5jeSgpOworICAgICAgICBub1RpbWVTdHJldGNoKCk7CisKKyAgICAgICAgLy8gVE9ETzogb3V0cHV0IGxhdGVuY3kgYW5kIHJlb3JkZXJpbmcKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUF0dHJpYiwgQzJfUEFSQU1LRVlfQ09NUE9ORU5UX0FUVFJJQlVURVMpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMkNvbXBvbmVudEF0dHJpYnV0ZXNTZXR0aW5nKEMyQ29tcG9uZW50OjpBVFRSSUJfSVNfVEVNUE9SQUwpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVNpemUsIEMyX1BBUkFNS0VZX1BJQ1RVUkVfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQoMHUsIDMyMCwgMjQwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgd2lkdGgpLmluUmFuZ2UoMiwgMjA0OCwgMiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgaGVpZ2h0KS5pblJhbmdlKDIsIDIwNDgsIDIpLAorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2l6ZVNldHRlcikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyNpZmRlZiBWUDkKKyAgICAgICAgLy8gVE9ETzogQWRkIEMyQ29uZmlnOjpQUk9GSUxFX1ZQOV8ySERSID8/CisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtUHJvZmlsZUxldmVsLCBDMl9QQVJBTUtFWV9QUk9GSUxFX0xFVkVMKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjppbnB1dCgwdSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX1ZQOV8wLCBDMkNvbmZpZzo6TEVWRUxfVlA5XzUpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Qcm9maWxlTGV2ZWwsIHByb2ZpbGUpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9WUDlfMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9WUDlfMn0pLAorICAgICAgICAgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgbGV2ZWwpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfVlA5XzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX1ZQOV8xXzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX1ZQOV8yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9WUDlfMl8xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9WUDlfMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfVlA5XzNfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfVlA5XzQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX1ZQOV80XzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX1ZQOV81LAorICAgICAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoUHJvZmlsZUxldmVsU2V0dGVyLCBtU2l6ZSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyNpZiAwCisgICAgICAgIC8vIHNhbXBsZSBCVC4yMDIwIHN0YXRpYyBpbmZvCisgICAgICAgIG1IZHJTdGF0aWNJbmZvID0gc3RkOjptYWtlX3NoYXJlZDxDMlN0cmVhbUhkclN0YXRpY0luZm86Om91dHB1dD4oKTsKKyAgICAgICAgbUhkclN0YXRpY0luZm8tPm1hc3RlcmluZyA9IHsKKyAgICAgICAgICAgIC5yZWQgICA9IHsgLnggPSAwLjcwOCwgIC55ID0gMC4yOTIgfSwKKyAgICAgICAgICAgIC5ncmVlbiA9IHsgLnggPSAwLjE3MCwgIC55ID0gMC43OTcgfSwKKyAgICAgICAgICAgIC5ibHVlICA9IHsgLnggPSAwLjEzMSwgIC55ID0gMC4wNDYgfSwKKyAgICAgICAgICAgIC53aGl0ZSA9IHsgLnggPSAwLjMxMjcsIC55ID0gMC4zMjkwIH0sCisgICAgICAgICAgICAubWF4THVtaW5hbmNlID0gMTAwMCwKKyAgICAgICAgICAgIC5taW5MdW1pbmFuY2UgPSAwLjEsCisgICAgICAgIH07CisgICAgICAgIG1IZHJTdGF0aWNJbmZvLT5tYXhDbGwgPSAxMDAwOworICAgICAgICBtSGRyU3RhdGljSW5mby0+bWF4RmFsbCA9IDEyMDsKKworICAgICAgICBtSGRyU3RhdGljSW5mby0+bWF4THVtaW5hbmNlID0gMDsgLy8gZGlzYWJsZSBzdGF0aWMgaW5mbworCisgICAgICAgIGhlbHBlci0+YWRkU3RydWN0RGVzY3JpcHRvcnM8QzJNYXN0ZXJpbmdEaXNwbGF5Q29sb3JWb2x1bWVTdHJ1Y3QsIEMyQ29sb3JYeVN0cnVjdD4oKTsKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1IZHJTdGF0aWNJbmZvLCBDMl9QQVJBTUtFWV9IRFJfU1RBVElDX0lORk8pCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG1IZHJTdGF0aWNJbmZvKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1IZHJTdGF0aWNJbmZvLCBtYXN0ZXJpbmcucmVkLngpLmluUmFuZ2UoMCwgMSksCisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE8KKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKEhkclN0YXRpY0luZm9TZXR0ZXIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworI2VuZGlmCisjZWxzZQorICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVByb2ZpbGVMZXZlbCwgQzJfUEFSQU1LRVlfUFJPRklMRV9MRVZFTCkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6aW5wdXQoMHUsCisgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9VTlVTRUQsIEMyQ29uZmlnOjpMRVZFTF9VTlVTRUQpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyNlbmRpZgorCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtTWF4U2l6ZSwgQzJfUEFSQU1LRVlfTUFYX1BJQ1RVUkVfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtTWF4UGljdHVyZVNpemVUdW5pbmc6Om91dHB1dCgwdSwgMzIwLCAyNDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCB3aWR0aCkuaW5SYW5nZSgyLCAyMDQ4LCAyKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCBoZWlnaHQpLmluUmFuZ2UoMiwgMjA0OCwgMiksCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihNYXhQaWN0dXJlU2l6ZVNldHRlciwgbVNpemUpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtTWF4SW5wdXRTaXplLCBDMl9QQVJBTUtFWV9JTlBVVF9NQVhfQlVGRkVSX1NJWkUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dCgwdSwgMzIwICogMjQwICogMyAvIDQpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1NYXhJbnB1dFNpemUsIHZhbHVlKS5hbnkoKSwKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC5jYWxjdWxhdGVkQXMoTWF4SW5wdXRTaXplU2V0dGVyLCBtTWF4U2l6ZSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgQzJDaHJvbWFPZmZzZXRTdHJ1Y3QgbG9jYXRpb25zWzFdID0geyBDMkNocm9tYU9mZnNldFN0cnVjdDo6SVRVX1lVVl80MjBfMCgpIH07CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9ySW5mbzo6b3V0cHV0PiBkZWZhdWx0Q29sb3JJbmZvID0KKyAgICAgICAgICAgIEMyU3RyZWFtQ29sb3JJbmZvOjpvdXRwdXQ6OkFsbG9jU2hhcmVkKAorICAgICAgICAgICAgICAgICAgICAxdSwgMHUsIDh1IC8qIGJpdERlcHRoICovLCBDMkNvbG9yOjpZVVZfNDIwKTsKKyAgICAgICAgbWVtY3B5KGRlZmF1bHRDb2xvckluZm8tPm0ubG9jYXRpb25zLCBsb2NhdGlvbnMsIHNpemVvZihsb2NhdGlvbnMpKTsKKworICAgICAgICBkZWZhdWx0Q29sb3JJbmZvID0KKyAgICAgICAgICAgIEMyU3RyZWFtQ29sb3JJbmZvOjpvdXRwdXQ6OkFsbG9jU2hhcmVkKAorICAgICAgICAgICAgICAgICAgICB7IEMyQ2hyb21hT2Zmc2V0U3RydWN0OjpJVFVfWVVWXzQyMF8wKCkgfSwKKyAgICAgICAgICAgICAgICAgICAgMHUsIDh1IC8qIGJpdERlcHRoICovLCBDMkNvbG9yOjpZVVZfNDIwKTsKKyAgICAgICAgaGVscGVyLT5hZGRTdHJ1Y3REZXNjcmlwdG9yczxDMkNocm9tYU9mZnNldFN0cnVjdD4oKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUNvbG9ySW5mbywgQzJfUEFSQU1LRVlfQ09ERURfQ09MT1JfSU5GTykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoZGVmYXVsdENvbG9ySW5mbykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgLy8gVE9ETzogc3VwcG9ydCBtb3JlIGZvcm1hdHM/CisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtUGl4ZWxGb3JtYXQsIEMyX1BBUkFNS0VZX1BJWEVMX0ZPUk1BVCkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtUGl4ZWxGb3JtYXRJbmZvOjpvdXRwdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHUsIEhBTF9QSVhFTF9GT1JNQVRfWUNCQ1JfNDIwXzg4OCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgU2l6ZVNldHRlcihib29sIG1heUJsb2NrLCBjb25zdCBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dD4gJm9sZE1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDMlA8QzJWaWRlb1NpemVTdHJlYW1JbmZvOjpvdXRwdXQ+ICZtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgQzJSIHJlcyA9IEMyUjo6T2soKTsKKyAgICAgICAgaWYgKCFtZS5GKG1lLnYud2lkdGgpLnN1cHBvcnRzQXRBbGwobWUudi53aWR0aCkpIHsKKyAgICAgICAgICAgIHJlcyA9IHJlcy5wbHVzKEMyU2V0dGluZ1Jlc3VsdEJ1aWxkZXI6OkJhZFZhbHVlKG1lLkYobWUudi53aWR0aCkpKTsKKyAgICAgICAgICAgIG1lLnNldCgpLndpZHRoID0gb2xkTWUudi53aWR0aDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIW1lLkYobWUudi5oZWlnaHQpLnN1cHBvcnRzQXRBbGwobWUudi5oZWlnaHQpKSB7CisgICAgICAgICAgICByZXMgPSByZXMucGx1cyhDMlNldHRpbmdSZXN1bHRCdWlsZGVyOjpCYWRWYWx1ZShtZS5GKG1lLnYuaGVpZ2h0KSkpOworICAgICAgICAgICAgbWUuc2V0KCkuaGVpZ2h0ID0gb2xkTWUudi5oZWlnaHQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIE1heFBpY3R1cmVTaXplU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbU1heFBpY3R1cmVTaXplVHVuaW5nOjpvdXRwdXQ+ICZtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyUDxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0PiAmc2l6ZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgLy8gVE9ETzogZ2V0IG1heCB3aWR0aC9oZWlnaHQgZnJvbSB0aGUgc2l6ZSdzIGZpZWxkIGhlbHBlcnMgdnMuIGhhcmRjb2RpbmcKKyAgICAgICAgbWUuc2V0KCkud2lkdGggPSBjMl9taW4oYzJfbWF4KG1lLnYud2lkdGgsIHNpemUudi53aWR0aCksIDIwNDh1KTsKKyAgICAgICAgbWUuc2V0KCkuaGVpZ2h0ID0gYzJfbWluKGMyX21heChtZS52LmhlaWdodCwgc2l6ZS52LmhlaWdodCksIDIwNDh1KTsKKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIE1heElucHV0U2l6ZVNldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQ+ICZtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDMlA8QzJTdHJlYW1NYXhQaWN0dXJlU2l6ZVR1bmluZzo6b3V0cHV0PiAmbWF4U2l6ZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgLy8gYXNzdW1lIGNvbXByZXNzaW9uIHJhdGlvIG9mIDIKKyAgICAgICAgbWUuc2V0KCkudmFsdWUgPSAoKChtYXhTaXplLnYud2lkdGggKyA2MykgLyA2NCkgKiAoKG1heFNpemUudi5oZWlnaHQgKyA2MykgLyA2NCkgKiAzMDcyKTsKKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKKworICAgIHN0YXRpYyBDMlIgUHJvZmlsZUxldmVsU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86OmlucHV0PiAmbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJQPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQ+ICZzaXplKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAodm9pZClzaXplOworICAgICAgICAodm9pZCltZTsgIC8vIFRPRE86IHZhbGlkYXRlCisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86OmlucHV0PiBtUHJvZmlsZUxldmVsOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0PiBtU2l6ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1NYXhQaWN0dXJlU2l6ZVR1bmluZzo6b3V0cHV0PiBtTWF4U2l6ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQ+IG1NYXhJbnB1dFNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JJbmZvOjpvdXRwdXQ+IG1Db2xvckluZm87CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUGl4ZWxGb3JtYXRJbmZvOjpvdXRwdXQ+IG1QaXhlbEZvcm1hdDsKKyNpZmRlZiBWUDkKKyNpZiAwCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtSGRyU3RhdGljSW5mbzo6b3V0cHV0PiBtSGRyU3RhdGljSW5mbzsKKyNlbmRpZgorI2VuZGlmCit9OworCitDMlNvZnRWcHhEZWM6OkMyU29mdFZweERlYygKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+ICZpbnRmSW1wbCkKKyAgICA6IFNpbXBsZUMyQ29tcG9uZW50KHN0ZDo6bWFrZV9zaGFyZWQ8U2ltcGxlSW50ZXJmYWNlPEludGZJbXBsPj4obmFtZSwgaWQsIGludGZJbXBsKSksCisgICAgICBtSW50ZihpbnRmSW1wbCksCisgICAgICBtQ29kZWNDdHgobnVsbHB0cikgeworfQorCitDMlNvZnRWcHhEZWM6On5DMlNvZnRWcHhEZWMoKSB7CisgICAgb25SZWxlYXNlKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdFZweERlYzo6b25Jbml0KCkgeworICAgIHN0YXR1c190IGVyciA9IGluaXREZWNvZGVyKCk7CisgICAgcmV0dXJuIGVyciA9PSBPSyA/IEMyX09LIDogQzJfQ09SUlVQVEVEOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRWcHhEZWM6Om9uU3RvcCgpIHsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3ZvaWQgQzJTb2Z0VnB4RGVjOjpvblJlc2V0KCkgeworICAgICh2b2lkKW9uU3RvcCgpOworICAgIGMyX3N0YXR1c190IGVyciA9IG9uRmx1c2hfc20oKTsKKyAgICBpZiAoZXJyICE9IEMyX09LKQorICAgIHsKKyAgICAgICAgQUxPR1coIkZhaWxlZCB0byBmbHVzaCBkZWNvZGVyLiBUcnkgdG8gaGFyZCByZXNldCBkZWNvZGVyIik7CisgICAgICAgIGRlc3Ryb3lEZWNvZGVyKCk7CisgICAgICAgICh2b2lkKWluaXREZWNvZGVyKCk7CisgICAgfQorfQorCit2b2lkIEMyU29mdFZweERlYzo6b25SZWxlYXNlKCkgeworICAgIGRlc3Ryb3lEZWNvZGVyKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdFZweERlYzo6b25GbHVzaF9zbSgpIHsKKyAgICBpZiAobUZyYW1lUGFyYWxsZWxNb2RlKSB7CisgICAgICAgIC8vIEZsdXNoIGRlY29kZXIgYnkgcGFzc2luZyBudWxscHRyIGRhdGEgcHRyIGFuZCAwIHNpemUuCisgICAgICAgIC8vIElkZWFsbHksIHRoaXMgc2hvdWxkIG5ldmVyIGZhaWwuCisgICAgICAgIGlmICh2cHhfY29kZWNfZGVjb2RlKG1Db2RlY0N0eCwgbnVsbHB0ciwgMCwgbnVsbHB0ciwgMCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZmx1c2ggb24yIGRlY29kZXIuIik7CisgICAgICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gRHJvcCBhbGwgdGhlIGRlY29kZWQgZnJhbWVzIGluIGRlY29kZXIuCisgICAgdnB4X2NvZGVjX2l0ZXJfdCBpdGVyID0gbnVsbHB0cjsKKyAgICB3aGlsZSAodnB4X2NvZGVjX2dldF9mcmFtZShtQ29kZWNDdHgsICZpdGVyKSkgeworICAgIH0KKworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3N0YXRpYyBpbnQgR2V0Q1BVQ29yZUNvdW50KCkgeworICAgIGludCBjcHVDb3JlQ291bnQgPSAxOworI2lmIGRlZmluZWQoX1NDX05QUk9DRVNTT1JTX09OTE4pCisgICAgY3B1Q29yZUNvdW50ID0gc3lzY29uZihfU0NfTlBST0NFU1NPUlNfT05MTik7CisjZWxzZQorICAgIC8vIF9TQ19OUFJPQ19PTkxOIG11c3QgYmUgZGVmaW5lZC4uLgorICAgIGNwdUNvcmVDb3VudCA9IHN5c2NvbmYoX1NDX05QUk9DX09OTE4pOworI2VuZGlmCisgICAgQ0hFQ0soY3B1Q29yZUNvdW50ID49IDEpOworICAgIEFMT0dWKCJOdW1iZXIgb2YgQ1BVIGNvcmVzOiAlZCIsIGNwdUNvcmVDb3VudCk7CisgICAgcmV0dXJuIGNwdUNvcmVDb3VudDsKK30KKworc3RhdHVzX3QgQzJTb2Z0VnB4RGVjOjppbml0RGVjb2RlcigpIHsKKyNpZmRlZiBWUDkKKyAgICBtTW9kZSA9IE1PREVfVlA5OworI2Vsc2UKKyAgICBtTW9kZSA9IE1PREVfVlA4OworI2VuZGlmCisKKyAgICBtV2lkdGggPSAzMjA7CisgICAgbUhlaWdodCA9IDI0MDsKKyAgICBtRnJhbWVQYXJhbGxlbE1vZGUgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisKKyAgICBpZiAoIW1Db2RlY0N0eCkgeworICAgICAgICBtQ29kZWNDdHggPSBuZXcgdnB4X2NvZGVjX2N0eF90OworICAgIH0KKyAgICBpZiAoIW1Db2RlY0N0eCkgeworICAgICAgICBBTE9HRSgibUNvZGVjQ3R4IGlzIG51bGwiKTsKKyAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICB9CisKKyAgICB2cHhfY29kZWNfZGVjX2NmZ190IGNmZzsKKyAgICBtZW1zZXQoJmNmZywgMCwgc2l6ZW9mKHZweF9jb2RlY19kZWNfY2ZnX3QpKTsKKyAgICBjZmcudGhyZWFkcyA9IEdldENQVUNvcmVDb3VudCgpOworCisgICAgdnB4X2NvZGVjX2ZsYWdzX3QgZmxhZ3M7CisgICAgbWVtc2V0KCZmbGFncywgMCwgc2l6ZW9mKHZweF9jb2RlY19mbGFnc190KSk7CisgICAgaWYgKG1GcmFtZVBhcmFsbGVsTW9kZSkgZmxhZ3MgfD0gVlBYX0NPREVDX1VTRV9GUkFNRV9USFJFQURJTkc7CisKKyAgICB2cHhfY29kZWNfZXJyX3QgdnB4X2VycjsKKyAgICBpZiAoKHZweF9lcnIgPSB2cHhfY29kZWNfZGVjX2luaXQoCisgICAgICAgICAgICAgICAgIG1Db2RlY0N0eCwgbU1vZGUgPT0gTU9ERV9WUDggPyAmdnB4X2NvZGVjX3ZwOF9keF9hbGdvIDogJnZweF9jb2RlY192cDlfZHhfYWxnbywKKyAgICAgICAgICAgICAgICAgJmNmZywgZmxhZ3MpKSkgeworICAgICAgICBBTE9HRSgib24yIGRlY29kZXIgZmFpbGVkIHRvIGluaXRpYWxpemUuICglZCkiLCB2cHhfZXJyKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDMlNvZnRWcHhEZWM6OmRlc3Ryb3lEZWNvZGVyKCkgeworICAgIGlmICAobUNvZGVjQ3R4KSB7CisgICAgICAgIHZweF9jb2RlY19kZXN0cm95KG1Db2RlY0N0eCk7CisgICAgICAgIGRlbGV0ZSBtQ29kZWNDdHg7CisgICAgICAgIG1Db2RlY0N0eCA9IG51bGxwdHI7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIGZpbGxFbXB0eVdvcmsoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKyAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgaWYgKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgeworICAgICAgICBmbGFncyB8PSBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNOworICAgICAgICBBTE9HVigic2lnbmFsbGluZyBlb3MiKTsKKyAgICB9CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KWZsYWdzOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7Cit9CisKK3ZvaWQgQzJTb2Z0VnB4RGVjOjpmaW5pc2hXb3JrKHVpbnQ2NF90IGluZGV4LCBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gJmJsb2NrKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBidWZmZXIgPSBjcmVhdGVHcmFwaGljQnVmZmVyKGJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMlJlY3QobVdpZHRoLCBtSGVpZ2h0KSk7CisgICAgYXV0byBmaWxsV29yayA9IFtidWZmZXIsIGluZGV4XShjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykgeworICAgICAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgICAgIGlmICgod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSAmJgorICAgICAgICAgICAgICAgIChjMl9jbnRyNjRfdChpbmRleCkgPT0gd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4KSkgeworICAgICAgICAgICAgZmxhZ3MgfD0gQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgICAgIEFMT0dWKCJzaWduYWxsaW5nIGVvcyIpOworICAgICAgICB9CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdClmbGFnczsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMucHVzaF9iYWNrKGJ1ZmZlcik7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICB9OworICAgIGlmICh3b3JrICYmIGMyX2NudHI2NF90KGluZGV4KSA9PSB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgpIHsKKyAgICAgICAgZmlsbFdvcmsod29yayk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZmluaXNoKGluZGV4LCBmaWxsV29yayk7CisgICAgfQorfQorCit2b2lkIEMyU29mdFZweERlYzo6cHJvY2VzcygKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAvLyBJbml0aWFsaXplIG91dHB1dCB3b3JrCisgICAgd29yay0+cmVzdWx0ID0gQzJfT0s7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAwdTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisKKyAgICBpZiAobVNpZ25hbGxlZEVycm9yIHx8IG1TaWduYWxsZWRPdXRwdXRFb3MpIHsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQkFEX1ZBTFVFOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc2l6ZV90IGluT2Zmc2V0ID0gMHU7CisgICAgc2l6ZV90IGluU2l6ZSA9IDB1OworICAgIEMyUmVhZFZpZXcgclZpZXcgPSBtRHVtbXlSZWFkVmlldzsKKyAgICBpZiAoIXdvcmstPmlucHV0LmJ1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICByVmlldyA9IHdvcmstPmlucHV0LmJ1ZmZlcnNbMF0tPmRhdGEoKS5saW5lYXJCbG9ja3MoKS5mcm9udCgpLm1hcCgpLmdldCgpOworICAgICAgICBpblNpemUgPSByVmlldy5jYXBhY2l0eSgpOworICAgICAgICBpZiAoaW5TaXplICYmIHJWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJyZWFkIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHJWaWV3LmVycm9yKCkpOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgYm9vbCBjb2RlY0NvbmZpZyA9ICgod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19DT0RFQ19DT05GSUcpICE9MCk7CisgICAgYm9vbCBlb3MgPSAoKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgIT0gMCk7CisKKyAgICBBTE9HVigiaW4gYnVmZmVyIGF0dHIuIHNpemUgJXp1IHRpbWVzdGFtcCAlZCBmcmFtZWluZGV4ICVkLCBmbGFncyAleCIsCisgICAgICAgICAgaW5TaXplLCAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1KCksCisgICAgICAgICAgKGludCl3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKSwgd29yay0+aW5wdXQuZmxhZ3MpOworCisgICAgLy8gU29mdHdhcmUgVlA5IERlY29kZXIgZG9lcyBub3QgbmVlZCB0aGUgQ29kZWMgU3BlY2lmaWMgRGF0YSAoQ1NEKQorICAgIC8vIChzcGVjaWZpZWQgaW4gaHR0cDovL3d3dy53ZWJtcHJvamVjdC5vcmcvdnA5L3Byb2ZpbGVzLykuIElnbm9yZSBpdCBpZgorICAgIC8vIGl0IHdhcyBwYXNzZWQuCisgICAgaWYgKGNvZGVjQ29uZmlnKSB7CisgICAgICAgIC8vIElnbm9yZSBDU0QgYnVmZmVyIGZvciBWUDkuCisgICAgICAgIGlmIChtTW9kZSA9PSBNT0RFX1ZQOSkgeworICAgICAgICAgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFRvbGVyYXRlIHRoZSBDU0QgYnVmZmVyIGZvciBWUDguIFRoaXMgaXMgYSB3b3JrYXJvdW5kCisgICAgICAgICAgICAvLyBmb3IgYi8yODY4OTUzNi4gY29udGludWUKKyAgICAgICAgICAgIEFMT0dXKCJXQVJOSU5HOiBHb3QgQ1NEIGJ1ZmZlciBmb3IgVlA4LiBDb250aW51ZSIpOworICAgICAgICB9CisgICAgfQorCisgICAgaW50NjRfdCBmcmFtZUluZGV4ID0gd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWtsbCgpOworCisgICAgaWYgKGluU2l6ZSkgeworICAgICAgICB1aW50OF90ICpiaXRzdHJlYW0gPSBjb25zdF9jYXN0PHVpbnQ4X3QgKj4oclZpZXcuZGF0YSgpICsgaW5PZmZzZXQpOworICAgICAgICB2cHhfY29kZWNfZXJyX3QgZXJyID0gdnB4X2NvZGVjX2RlY29kZSgKKyAgICAgICAgICAgICAgICBtQ29kZWNDdHgsIGJpdHN0cmVhbSwgaW5TaXplLCAmZnJhbWVJbmRleCwgMCk7CisgICAgICAgIGlmIChlcnIgIT0gVlBYX0NPREVDX09LKSB7CisgICAgICAgICAgICBBTE9HRSgib24yIGRlY29kZXIgZmFpbGVkIHRvIGRlY29kZSBmcmFtZS4gZXJyOiAlZCIsIGVycik7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgICh2b2lkKW91dHB1dEJ1ZmZlcihwb29sLCB3b3JrKTsKKworICAgIGlmIChlb3MpIHsKKyAgICAgICAgZHJhaW5JbnRlcm5hbChEUkFJTl9DT01QT05FTlRfV0lUSF9FT1MsIHBvb2wsIHdvcmspOworICAgICAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKCFpblNpemUpIHsKKyAgICAgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGNvcHlPdXRwdXRCdWZmZXJUb1lWMTJGcmFtZSh1aW50OF90ICpkc3QsCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1ksIGNvbnN0IHVpbnQ4X3QgKnNyY1UsIGNvbnN0IHVpbnQ4X3QgKnNyY1YsCisgICAgICAgIHNpemVfdCBzcmNZU3RyaWRlLCBzaXplX3Qgc3JjVVN0cmlkZSwgc2l6ZV90IHNyY1ZTdHJpZGUsCisgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIGludDMyX3QgYnBwKSB7CisgICAgc2l6ZV90IGRzdFlTdHJpZGUgPSBhbGlnbih3aWR0aCwgMTYpICogYnBwIDsKKyAgICBzaXplX3QgZHN0VVZTdHJpZGUgPSBhbGlnbihkc3RZU3RyaWRlIC8gMiwgMTYpOworICAgIHVpbnQ4X3QgKmRzdFN0YXJ0ID0gZHN0OworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoZWlnaHQ7ICsraSkgeworICAgICAgICAgbWVtY3B5KGRzdCwgc3JjWSwgd2lkdGggKiBicHApOworICAgICAgICAgc3JjWSArPSBzcmNZU3RyaWRlOworICAgICAgICAgZHN0ICs9IGRzdFlTdHJpZGU7CisgICAgfQorCisgICAgZHN0ID0gZHN0U3RhcnQgKyBkc3RZU3RyaWRlICogaGVpZ2h0OworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGVpZ2h0IC8gMjsgKytpKSB7CisgICAgICAgICBtZW1jcHkoZHN0LCBzcmNWLCB3aWR0aCAvIDIgKiBicHApOworICAgICAgICAgc3JjViArPSBzcmNWU3RyaWRlOworICAgICAgICAgZHN0ICs9IGRzdFVWU3RyaWRlOworICAgIH0KKworICAgIGRzdCA9IGRzdFN0YXJ0ICsgKGRzdFlTdHJpZGUgKiBoZWlnaHQpICsgKGRzdFVWU3RyaWRlICogaGVpZ2h0IC8gMik7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoZWlnaHQgLyAyOyArK2kpIHsKKyAgICAgICAgIG1lbWNweShkc3QsIHNyY1UsIHdpZHRoIC8gMiAqIGJwcCk7CisgICAgICAgICBzcmNVICs9IHNyY1VTdHJpZGU7CisgICAgICAgICBkc3QgKz0gZHN0VVZTdHJpZGU7CisgICAgfQorfQorCitib29sIEMyU29mdFZweERlYzo6b3V0cHV0QnVmZmVyKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sLAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykKK3sKKyAgICBpZiAoISh3b3JrICYmIHBvb2wpKSByZXR1cm4gZmFsc2U7CisKKyAgICB2cHhfY29kZWNfaXRlcl90IGl0ZXIgPSBudWxscHRyOworICAgIHZweF9pbWFnZV90ICppbWcgPSB2cHhfY29kZWNfZ2V0X2ZyYW1lKG1Db2RlY0N0eCwgJml0ZXIpOworCisgICAgaWYgKCFpbWcpIHJldHVybiBmYWxzZTsKKworICAgIGlmIChpbWctPmRfdyAhPSBtV2lkdGggfHwgaW1nLT5kX2ggIT0gbUhlaWdodCkgeworICAgICAgICBtV2lkdGggPSBpbWctPmRfdzsKKyAgICAgICAgbUhlaWdodCA9IGltZy0+ZF9oOworCisgICAgICAgIEMyVmlkZW9TaXplU3RyZWFtSW5mbzo6b3V0cHV0IHNpemUoMHUsIG1XaWR0aCwgbUhlaWdodCk7CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gbUludGYtPmNvbmZpZyh7JnNpemV9LCBDMl9NQVlfQkxPQ0ssICZmYWlsdXJlcyk7CisgICAgICAgIGlmIChlcnIgPT0gQzJfT0spIHsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgIEMyUGFyYW06OkNvcHkoc2l6ZSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0UoIkNvbmZpZyB1cGRhdGUgc2l6ZSBmYWlsZWQiKTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICB9CisgICAgQ0hFQ0soaW1nLT5mbXQgPT0gVlBYX0lNR19GTVRfSTQyMCB8fCBpbWctPmZtdCA9PSBWUFhfSU1HX0ZNVF9JNDIwMTYpOworICAgIGludDMyX3QgYnBwID0gMTsKKyAgICBpZiAoaW1nLT5mbXQgPT0gVlBYX0lNR19GTVRfSTQyMDE2KSB7CisgICAgICAgIGJwcCA9IDI7CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiBibG9jazsKKyAgICB1aW50MzJfdCBmb3JtYXQgPSBIQUxfUElYRUxfRk9STUFUX1lWMTI7CisgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSA9IHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9OworICAgIGMyX3N0YXR1c190IGVyciA9IHBvb2wtPmZldGNoR3JhcGhpY0Jsb2NrKGFsaWduKG1XaWR0aCwgMTYpICogYnBwLCBtSGVpZ2h0LCBmb3JtYXQsIHVzYWdlLCAmYmxvY2spOworICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0UoImZldGNoR3JhcGhpY0Jsb2NrIGZvciBPdXRwdXQgZmFpbGVkIHdpdGggc3RhdHVzICVkIiwgZXJyKTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gZXJyOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQzJHcmFwaGljVmlldyB3VmlldyA9IGJsb2NrLT5tYXAoKS5nZXQoKTsKKyAgICBpZiAod1ZpZXcuZXJyb3IoKSkgeworICAgICAgICBBTE9HRSgiZ3JhcGhpYyB2aWV3IG1hcCBmYWlsZWQgJWQiLCB3Vmlldy5lcnJvcigpKTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQUxPR1YoInByb3ZpZGVkICglZHglZCkgcmVxdWlyZWQgKCVkeCVkKSwgb3V0IGZyYW1laW5kZXggJWQiLAorICAgICAgICAgICBibG9jay0+d2lkdGgoKSwgYmxvY2stPmhlaWdodCgpLCBtV2lkdGgsIG1IZWlnaHQsIChpbnQpKihpbnQ2NF90ICopaW1nLT51c2VyX3ByaXYpOworCisgICAgdWludDhfdCAqZHN0ID0gY29uc3RfY2FzdDx1aW50OF90ICo+KHdWaWV3LmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfWV0pOworICAgIHNpemVfdCBzcmNZU3RyaWRlID0gaW1nLT5zdHJpZGVbVlBYX1BMQU5FX1ldOworICAgIHNpemVfdCBzcmNVU3RyaWRlID0gaW1nLT5zdHJpZGVbVlBYX1BMQU5FX1VdOworICAgIHNpemVfdCBzcmNWU3RyaWRlID0gaW1nLT5zdHJpZGVbVlBYX1BMQU5FX1ZdOworICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1kgPSAoY29uc3QgdWludDhfdCAqKWltZy0+cGxhbmVzW1ZQWF9QTEFORV9ZXTsKKyAgICBjb25zdCB1aW50OF90ICpzcmNVID0gKGNvbnN0IHVpbnQ4X3QgKilpbWctPnBsYW5lc1tWUFhfUExBTkVfVV07CisgICAgY29uc3QgdWludDhfdCAqc3JjViA9IChjb25zdCB1aW50OF90ICopaW1nLT5wbGFuZXNbVlBYX1BMQU5FX1ZdOworICAgIGNvcHlPdXRwdXRCdWZmZXJUb1lWMTJGcmFtZShkc3QsIHNyY1ksIHNyY1UsIHNyY1YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1lTdHJpZGUsIHNyY1VTdHJpZGUsIHNyY1ZTdHJpZGUsIG1XaWR0aCwgbUhlaWdodCwgYnBwKTsKKworICAgIGZpbmlzaFdvcmsoKihpbnQ2NF90ICopaW1nLT51c2VyX3ByaXYsIHdvcmssIHN0ZDo6bW92ZShibG9jaykpOworICAgIHJldHVybiB0cnVlOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRWcHhEZWM6OmRyYWluSW50ZXJuYWwoCisgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCwKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKyAgICBpZiAoZHJhaW5Nb2RlID09IE5PX0RSQUlOKSB7CisgICAgICAgIEFMT0dXKCJkcmFpbiB3aXRoIE5PX0RSQUlOOiBuby1vcCIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorICAgIGlmIChkcmFpbk1vZGUgPT0gRFJBSU5fQ0hBSU4pIHsKKyAgICAgICAgQUxPR1coIkRSQUlOX0NIQUlOIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorCisgICAgd2hpbGUgKChvdXRwdXRCdWZmZXIocG9vbCwgd29yaykpKSB7CisgICAgfQorCisgICAgaWYgKGRyYWluTW9kZSA9PSBEUkFJTl9DT01QT05FTlRfV0lUSF9FT1MgJiYKKyAgICAgICAgICAgIHdvcmsgJiYgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPT0gMHUpIHsKKyAgICAgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICB9CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CitjMl9zdGF0dXNfdCBDMlNvZnRWcHhEZWM6OmRyYWluKAorICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICByZXR1cm4gZHJhaW5JbnRlcm5hbChkcmFpbk1vZGUsIHBvb2wsIG51bGxwdHIpOworfQorCitjbGFzcyBDMlNvZnRWcHhGYWN0b3J5IDogcHVibGljIEMyQ29tcG9uZW50RmFjdG9yeSB7CitwdWJsaWM6CisgICAgQzJTb2Z0VnB4RmFjdG9yeSgpIDogbUhlbHBlcihzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJSZWZsZWN0b3JIZWxwZXI+KAorICAgICAgICBHZXRDb2RlYzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCktPmdldFBhcmFtUmVmbGVjdG9yKCkpKSB7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVDb21wb25lbnQoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KiBjb25zdCBjb21wb25lbnQsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnQqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqY29tcG9uZW50ID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PigKKyAgICAgICAgICAgIG5ldyBDMlNvZnRWcHhEZWMoQ09NUE9ORU5UX05BTUUsIGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdFZweERlYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KiBjb25zdCBpbnRlcmZhY2UsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnRJbnRlcmZhY2UqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqaW50ZXJmYWNlID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPigKKyAgICAgICAgICAgIG5ldyBTaW1wbGVJbnRlcmZhY2U8QzJTb2Z0VnB4RGVjOjpJbnRmSW1wbD4oCisgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsIGlkLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0VnB4RGVjOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5DMlNvZnRWcHhGYWN0b3J5KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gbUhlbHBlcjsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2V4dGVybiAiQyIgOjpDMkNvbXBvbmVudEZhY3RvcnkqIENyZWF0ZUNvZGVjMkZhY3RvcnkoKSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIHJldHVybiBuZXcgOjphbmRyb2lkOjpDMlNvZnRWcHhGYWN0b3J5KCk7Cit9CisKK2V4dGVybiAiQyIgdm9pZCBEZXN0cm95Q29kZWMyRmFjdG9yeSg6OkMyQ29tcG9uZW50RmFjdG9yeSogZmFjdG9yeSkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICBkZWxldGUgZmFjdG9yeTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9DMlNvZnRWcHhEZWMuaCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9DMlNvZnRWcHhEZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGM4NDg0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZweERlYy5oCkBAIC0wLDAgKzEsNzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQzJfU09GVF9WUFhfREVDX0hfCisjZGVmaW5lIEFORFJPSURfQzJfU09GVF9WUFhfREVDX0hfCisKKyNpbmNsdWRlIDxTaW1wbGVDMkNvbXBvbmVudC5oPgorCisKKyNpbmNsdWRlICJ2cHgvdnB4X2RlY29kZXIuaCIKKyNpbmNsdWRlICJ2cHgvdnA4ZHguaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgQzJTb2Z0VnB4RGVjIDogcHVibGljIFNpbXBsZUMyQ29tcG9uZW50IHsKKyAgICBjbGFzcyBJbnRmSW1wbDsKKworICAgIEMyU29mdFZweERlYyhjb25zdCBjaGFyKiBuYW1lLCBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4mIGludGZJbXBsKTsKKyAgICB2aXJ0dWFsIH5DMlNvZnRWcHhEZWMoKTsKKworICAgIC8vIEZyb20gU2ltcGxlQzJDb21wb25lbnQKKyAgICBjMl9zdGF0dXNfdCBvbkluaXQoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvblN0b3AoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVzZXQoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVsZWFzZSgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uRmx1c2hfc20oKSBvdmVycmlkZTsKKyAgICB2b2lkIHByb2Nlc3MoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IGRyYWluKAorICAgICAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisgcHJpdmF0ZToKKyAgICBlbnVtIHsKKyAgICAgICAgTU9ERV9WUDgsCisgICAgICAgIE1PREVfVlA5LAorICAgIH0gbU1vZGU7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+IG1JbnRmOworICAgIHZweF9jb2RlY19jdHhfdCAqbUNvZGVjQ3R4OworICAgIGJvb2wgbUZyYW1lUGFyYWxsZWxNb2RlOyAgLy8gRnJhbWUgcGFyYWxsZWwgaXMgb25seSBzdXBwb3J0ZWQgYnkgVlA5IGRlY29kZXIuCisKKyAgICB1aW50MzJfdCBtV2lkdGg7CisgICAgdWludDMyX3QgbUhlaWdodDsKKyAgICBib29sIG1TaWduYWxsZWRPdXRwdXRFb3M7CisgICAgYm9vbCBtU2lnbmFsbGVkRXJyb3I7CisKKyAgICBzdGF0dXNfdCBpbml0RGVjb2RlcigpOworICAgIHN0YXR1c190IGRlc3Ryb3lEZWNvZGVyKCk7CisgICAgdm9pZCBmaW5pc2hXb3JrKHVpbnQ2NF90IGluZGV4LCBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiAmYmxvY2spOworICAgIGJvb2wgb3V0cHV0QnVmZmVyKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKTsKKyAgICBjMl9zdGF0dXNfdCBkcmFpbkludGVybmFsKAorICAgICAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKTsKKworICAgIEMyX0RPX05PVF9DT1BZKEMyU29mdFZweERlYyk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfQzJfU09GVF9WUFhfREVDX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnB4RW5jLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9DMlNvZnRWcHhFbmMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1NWE4NGYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnB4RW5jLmNwcApAQCAtMCwwICsxLDY3MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDMlNvZnRWcHhFbmMiCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL21pc2MuaD4KKworI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL1ZpZGVvQVBJLmg+CisKKyNpbmNsdWRlIDxDb2RlYzJCdWZmZXJVdGlscy5oPgorI2luY2x1ZGUgPEMyRGVidWcuaD4KKyNpbmNsdWRlICJDMlNvZnRWcHhFbmMuaCIKKworI2lmbmRlZiBJTlQzMl9NQVgKKyNkZWZpbmUgSU5UMzJfTUFYICAgMjE0NzQ4MzY0NworI2VuZGlmCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworI2lmIDAKK3N0YXRpYyBzaXplX3QgZ2V0Q3B1Q29yZUNvdW50KCkgeworICAgIGxvbmcgY3B1Q29yZUNvdW50ID0gMTsKKyNpZiBkZWZpbmVkKF9TQ19OUFJPQ0VTU09SU19PTkxOKQorICAgIGNwdUNvcmVDb3VudCA9IHN5c2NvbmYoX1NDX05QUk9DRVNTT1JTX09OTE4pOworI2Vsc2UKKyAgICAvLyBfU0NfTlBST0NfT05MTiBtdXN0IGJlIGRlZmluZWQuLi4KKyAgICBjcHVDb3JlQ291bnQgPSBzeXNjb25mKF9TQ19OUFJPQ19PTkxOKTsKKyNlbmRpZgorICAgIENIRUNLKGNwdUNvcmVDb3VudCA+PSAxKTsKKyAgICBBTE9HVigiTnVtYmVyIG9mIENQVSBjb3JlczogJWxkIiwgY3B1Q29yZUNvdW50KTsKKyAgICByZXR1cm4gKHNpemVfdCljcHVDb3JlQ291bnQ7Cit9CisjZW5kaWYKKworQzJTb2Z0VnB4RW5jOjpDMlNvZnRWcHhFbmMoY29uc3QgY2hhciogbmFtZSwgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiYgaW50ZkltcGwpCisgICAgOiBTaW1wbGVDMkNvbXBvbmVudCgKKyAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPFNpbXBsZUludGVyZmFjZTxJbnRmSW1wbD4+KG5hbWUsIGlkLCBpbnRmSW1wbCkpLAorICAgICAgbUludGYoaW50ZkltcGwpLAorICAgICAgbUNvZGVjQ29udGV4dChudWxscHRyKSwKKyAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24obnVsbHB0ciksCisgICAgICBtQ29kZWNJbnRlcmZhY2UobnVsbHB0ciksCisgICAgICBtU3RyaWRlQWxpZ24oMiksCisgICAgICBtQ29sb3JGb3JtYXQoVlBYX0lNR19GTVRfSTQyMCksCisgICAgICBtQml0cmF0ZUNvbnRyb2xNb2RlKFZQWF9WQlIpLAorICAgICAgbUVycm9yUmVzaWxpZW5jZShmYWxzZSksCisgICAgICBtTWluUXVhbnRpemVyKDApLAorICAgICAgbU1heFF1YW50aXplcigwKSwKKyAgICAgIG1UZW1wb3JhbExheWVycygwKSwKKyAgICAgIG1UZW1wb3JhbFBhdHRlcm5UeXBlKFZQWFRlbXBvcmFsTGF5ZXJQYXR0ZXJuTm9uZSksCisgICAgICBtVGVtcG9yYWxQYXR0ZXJuTGVuZ3RoKDApLAorICAgICAgbVRlbXBvcmFsUGF0dGVybklkeCgwKSwKKyAgICAgIG1MYXN0VGltZXN0YW1wKDB4N0ZGRkZGRkZGRkZGRkZGRnVsbCksCisgICAgICBtU2lnbmFsbGVkT3V0cHV0RW9zKGZhbHNlKSwKKyAgICAgIG1TaWduYWxsZWRFcnJvcihmYWxzZSkgeworICAgIG1lbXNldChtVGVtcG9yYWxMYXllckJpdHJhdGVSYXRpbywgMCwgc2l6ZW9mKG1UZW1wb3JhbExheWVyQml0cmF0ZVJhdGlvKSk7CisgICAgbVRlbXBvcmFsTGF5ZXJCaXRyYXRlUmF0aW9bMF0gPSAxMDA7Cit9CisKK0MyU29mdFZweEVuYzo6fkMyU29mdFZweEVuYygpIHsKKyAgICBvblJlbGVhc2UoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0VnB4RW5jOjpvbkluaXQoKSB7CisgICAgc3RhdHVzX3QgZXJyID0gaW5pdEVuY29kZXIoKTsKKyAgICByZXR1cm4gZXJyID09IE9LID8gQzJfT0sgOiBDMl9DT1JSVVBURUQ7Cit9CisKK3ZvaWQgQzJTb2Z0VnB4RW5jOjpvblJlbGVhc2UoKSB7CisgICAgaWYgKG1Db2RlY0NvbnRleHQpIHsKKyAgICAgICAgdnB4X2NvZGVjX2Rlc3Ryb3kobUNvZGVjQ29udGV4dCk7CisgICAgICAgIGRlbGV0ZSBtQ29kZWNDb250ZXh0OworICAgICAgICBtQ29kZWNDb250ZXh0ID0gbnVsbHB0cjsKKyAgICB9CisKKyAgICBpZiAobUNvZGVjQ29uZmlndXJhdGlvbikgeworICAgICAgICBkZWxldGUgbUNvZGVjQ29uZmlndXJhdGlvbjsKKyAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbiA9IG51bGxwdHI7CisgICAgfQorCisgICAgLy8gdGhpcyBvbmUgaXMgbm90IGFsbG9jYXRlZCBieSB1cworICAgIG1Db2RlY0ludGVyZmFjZSA9IG51bGxwdHI7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdFZweEVuYzo6b25TdG9wKCkgeworICAgIG9uUmVsZWFzZSgpOworICAgIG1MYXN0VGltZXN0YW1wID0gMHg3RkZGRkZGRkZGRkZGRkZGTEw7CisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIHJldHVybiBDMl9PSzsKK30KKwordm9pZCBDMlNvZnRWcHhFbmM6Om9uUmVzZXQoKSB7CisgICAgKHZvaWQpb25TdG9wKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdFZweEVuYzo6b25GbHVzaF9zbSgpIHsKKyAgICByZXR1cm4gb25TdG9wKCk7Cit9CisKK3N0YXR1c190IEMyU29mdFZweEVuYzo6aW5pdEVuY29kZXIoKSB7CisgICAgdnB4X2NvZGVjX2Vycl90IGNvZGVjX3JldHVybjsKKyAgICBzdGF0dXNfdCByZXN1bHQgPSBVTktOT1dOX0VSUk9SOworICAgIHsKKyAgICAgICAgSW50ZkltcGw6OkxvY2sgbG9jayA9IG1JbnRmLT5sb2NrKCk7CisgICAgICAgIG1TaXplID0gbUludGYtPmdldFNpemVfbCgpOworICAgICAgICBtQml0cmF0ZSA9IG1JbnRmLT5nZXRCaXRyYXRlX2woKTsKKyAgICAgICAgbUJpdHJhdGVNb2RlID0gbUludGYtPmdldEJpdHJhdGVNb2RlX2woKTsKKyAgICAgICAgbUZyYW1lUmF0ZSA9IG1JbnRmLT5nZXRGcmFtZVJhdGVfbCgpOworICAgICAgICBtSW50cmFSZWZyZXNoID0gbUludGYtPmdldEludHJhUmVmcmVzaF9sKCk7CisgICAgICAgIG1SZXF1ZXN0U3luYyA9IG1JbnRmLT5nZXRSZXF1ZXN0U3luY19sKCk7CisgICAgICAgIG1UZW1wb3JhbExheWVycyA9IG1JbnRmLT5nZXRUZW1wb3JhbExheWVyc19sKCktPm0ubGF5ZXJDb3VudDsKKyAgICB9CisKKyAgICBzd2l0Y2ggKG1CaXRyYXRlTW9kZS0+dmFsdWUpIHsKKyAgICAgICAgY2FzZSBDMkNvbmZpZzo6QklUUkFURV9WQVJJQUJMRToKKyAgICAgICAgICAgIG1CaXRyYXRlQ29udHJvbE1vZGUgPSBWUFhfVkJSOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQzJDb25maWc6OkJJVFJBVEVfQ09OU1Q6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBtQml0cmF0ZUNvbnRyb2xNb2RlID0gVlBYX0NCUjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBzZXRDb2RlY1NwZWNpZmljSW50ZXJmYWNlKCk7CisgICAgaWYgKCFtQ29kZWNJbnRlcmZhY2UpIGdvdG8gQ2xlYW5VcDsKKworICAgIEFMT0dEKCJWUHg6IGluaXRFbmNvZGVyLiBCUk1vZGU6ICV1LiBUU0xheWVyczogJXp1LiBLRjogJXUuIFFQOiAldSAtICV1IiwKKyAgICAgICAgICAodWludDMyX3QpbUJpdHJhdGVDb250cm9sTW9kZSwgbVRlbXBvcmFsTGF5ZXJzLCBtSW50Zi0+Z2V0U3luY0ZyYW1lUGVyaW9kKCksCisgICAgICAgICAgbU1pblF1YW50aXplciwgbU1heFF1YW50aXplcik7CisKKyAgICBtQ29kZWNDb25maWd1cmF0aW9uID0gbmV3IHZweF9jb2RlY19lbmNfY2ZnX3Q7CisgICAgaWYgKCFtQ29kZWNDb25maWd1cmF0aW9uKSBnb3RvIENsZWFuVXA7CisgICAgY29kZWNfcmV0dXJuID0gdnB4X2NvZGVjX2VuY19jb25maWdfZGVmYXVsdChtQ29kZWNJbnRlcmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisgICAgaWYgKGNvZGVjX3JldHVybiAhPSBWUFhfQ09ERUNfT0spIHsKKyAgICAgICAgQUxPR0UoIkVycm9yIHBvcHVsYXRpbmcgZGVmYXVsdCBjb25maWd1cmF0aW9uIGZvciB2cHggZW5jb2Rlci4iKTsKKyAgICAgICAgZ290byBDbGVhblVwOworICAgIH0KKworICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPmdfdyA9IG1TaXplLT53aWR0aDsKKyAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5nX2ggPSBtU2l6ZS0+aGVpZ2h0OworICAgIC8vbUNvZGVjQ29uZmlndXJhdGlvbi0+Z190aHJlYWRzID0gZ2V0Q3B1Q29yZUNvdW50KCk7CisgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+Z190aHJlYWRzID0gMDsKKyAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5nX2Vycm9yX3Jlc2lsaWVudCA9IG1FcnJvclJlc2lsaWVuY2U7CisKKyAgICAvLyB0aW1lYmFzZSB1bml0IGlzIG1pY3Jvc2Vjb25kCisgICAgLy8gZ190aW1lYmFzZSBpcyBpbiBzZWNvbmRzIChpLmUuIDEvMTAwMDAwMCBzZWNvbmRzKQorICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPmdfdGltZWJhc2UubnVtID0gMTsKKyAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5nX3RpbWViYXNlLmRlbiA9IDEwMDAwMDA7CisgICAgLy8gcmNfdGFyZ2V0X2JpdHJhdGUgaXMgaW4ga2JwcywgbUJpdHJhdGUgaW4gYnBzCisgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+cmNfdGFyZ2V0X2JpdHJhdGUgPSAobUJpdHJhdGUtPnZhbHVlICsgNTAwKSAvIDEwMDA7CisgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+cmNfZW5kX3VzYWdlID0gbUJpdHJhdGVDb250cm9sTW9kZTsKKyAgICAvLyBEaXNhYmxlIGZyYW1lIGRyb3AgLSBub3QgYWxsb3dlZCBpbiBNZWRpYUNvZGVjIG5vdy4KKyAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5yY19kcm9wZnJhbWVfdGhyZXNoID0gMDsKKyAgICAvLyBEaXNhYmxlIGxhZ2dlZCBlbmNvZGluZy4KKyAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5nX2xhZ19pbl9mcmFtZXMgPSAwOworICAgIGlmIChtQml0cmF0ZUNvbnRyb2xNb2RlID09IFZQWF9DQlIpIHsKKyAgICAgICAgLy8gRGlzYWJsZSBzcGF0aWFsIHJlc2l6aW5nLgorICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5yY19yZXNpemVfYWxsb3dlZCA9IDA7CisgICAgICAgIC8vIFNpbmdsZS1wYXNzIG1vZGUuCisgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPmdfcGFzcyA9IFZQWF9SQ19PTkVfUEFTUzsKKyAgICAgICAgLy8gTWF4aW11bSBhbW91bnQgb2YgYml0cyB0aGF0IGNhbiBiZSBzdWJ0cmFjdGVkIGZyb20gdGhlIHRhcmdldAorICAgICAgICAvLyBiaXRyYXRlIC0gZXhwcmVzc2VkIGFzIHBlcmNlbnRhZ2Ugb2YgdGhlIHRhcmdldCBiaXRyYXRlLgorICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5yY191bmRlcnNob290X3BjdCA9IDEwMDsKKyAgICAgICAgLy8gTWF4aW11bSBhbW91bnQgb2YgYml0cyB0aGF0IGNhbiBiZSBhZGRlZCB0byB0aGUgdGFyZ2V0CisgICAgICAgIC8vIGJpdHJhdGUgLSBleHByZXNzZWQgYXMgcGVyY2VudGFnZSBvZiB0aGUgdGFyZ2V0IGJpdHJhdGUuCisgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnJjX292ZXJzaG9vdF9wY3QgPSAxNTsKKyAgICAgICAgLy8gSW5pdGlhbCB2YWx1ZSBvZiB0aGUgYnVmZmVyIGxldmVsIGluIG1zLgorICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5yY19idWZfaW5pdGlhbF9zeiA9IDUwMDsKKyAgICAgICAgLy8gQW1vdW50IG9mIGRhdGEgdGhhdCB0aGUgZW5jb2RlciBzaG91bGQgdHJ5IHRvIG1haW50YWluIGluIG1zLgorICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5yY19idWZfb3B0aW1hbF9zeiA9IDYwMDsKKyAgICAgICAgLy8gVGhlIGFtb3VudCBvZiBkYXRhIHRoYXQgbWF5IGJlIGJ1ZmZlcmVkIGJ5IHRoZSBkZWNvZGluZworICAgICAgICAvLyBhcHBsaWNhdGlvbiBpbiBtcy4KKyAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+cmNfYnVmX3N6ID0gMTAwMDsKKyAgICAgICAgLy8gRW5hYmxlIGVycm9yIHJlc2lsaWVuY2UgLSBuZWVkZWQgZm9yIHBhY2tldCBsb3NzLgorICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5nX2Vycm9yX3Jlc2lsaWVudCA9IDE7CisgICAgICAgIC8vIE1heGltdW0ga2V5IGZyYW1lIGludGVydmFsIC0gZm9yIENCUiBib29zdCB0byAzMDAwCisgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPmtmX21heF9kaXN0ID0gMzAwMDsKKyAgICAgICAgLy8gRW5jb2RlciBkZXRlcm1pbmVzIG9wdGltYWwga2V5IGZyYW1lIHBsYWNlbWVudCBhdXRvbWF0aWNhbGx5LgorICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5rZl9tb2RlID0gVlBYX0tGX0FVVE87CisgICAgfQorCisgICAgLy8gRnJhbWVzIHRlbXBvcmFsIHBhdHRlcm4gLSBmb3Igbm93IFdlYlJUQyBsaWtlIHBhdHRlcm4gaXMgb25seSBzdXBwb3J0ZWQuCisgICAgc3dpdGNoIChtVGVtcG9yYWxMYXllcnMpIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgbVRlbXBvcmFsUGF0dGVybkxlbmd0aCA9IDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+dHNfbnVtYmVyX2xheWVycyA9IDE7CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT50c19yYXRlX2RlY2ltYXRvclswXSA9IDE7CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT50c19wZXJpb2RpY2l0eSA9IDE7CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT50c19sYXllcl9pZFswXSA9IDA7CisgICAgICAgICAgICBtVGVtcG9yYWxQYXR0ZXJuWzBdID0ga1RlbXBvcmFsVXBkYXRlTGFzdFJlZkFsbDsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5MZW5ndGggPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX251bWJlcl9sYXllcnMgPSAyOworICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+dHNfcmF0ZV9kZWNpbWF0b3JbMF0gPSAyOworICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+dHNfcmF0ZV9kZWNpbWF0b3JbMV0gPSAxOworICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+dHNfcGVyaW9kaWNpdHkgPSAyOworICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+dHNfbGF5ZXJfaWRbMF0gPSAwOworICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+dHNfbGF5ZXJfaWRbMV0gPSAxOworICAgICAgICAgICAgbVRlbXBvcmFsUGF0dGVyblswXSA9IGtUZW1wb3JhbFVwZGF0ZUxhc3RBbmRHb2xkZW5SZWZBbHRSZWY7CisgICAgICAgICAgICBtVGVtcG9yYWxQYXR0ZXJuWzFdID0ga1RlbXBvcmFsVXBkYXRlR29sZGVuV2l0aG91dERlcGVuZGVuY3lSZWZBbHRSZWY7CisgICAgICAgICAgICBtVGVtcG9yYWxQYXR0ZXJuWzJdID0ga1RlbXBvcmFsVXBkYXRlTGFzdFJlZkFsdFJlZjsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5bM10gPSBrVGVtcG9yYWxVcGRhdGVHb2xkZW5SZWZBbHRSZWY7CisgICAgICAgICAgICBtVGVtcG9yYWxQYXR0ZXJuWzRdID0ga1RlbXBvcmFsVXBkYXRlTGFzdFJlZkFsdFJlZjsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5bNV0gPSBrVGVtcG9yYWxVcGRhdGVHb2xkZW5SZWZBbHRSZWY7CisgICAgICAgICAgICBtVGVtcG9yYWxQYXR0ZXJuWzZdID0ga1RlbXBvcmFsVXBkYXRlTGFzdFJlZkFsdFJlZjsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5bN10gPSBrVGVtcG9yYWxVcGRhdGVOb25lOworICAgICAgICAgICAgbVRlbXBvcmFsUGF0dGVybkxlbmd0aCA9IDg7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+dHNfbnVtYmVyX2xheWVycyA9IDM7CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT50c19yYXRlX2RlY2ltYXRvclswXSA9IDQ7CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT50c19yYXRlX2RlY2ltYXRvclsxXSA9IDI7CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT50c19yYXRlX2RlY2ltYXRvclsyXSA9IDE7CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT50c19wZXJpb2RpY2l0eSA9IDQ7CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT50c19sYXllcl9pZFswXSA9IDA7CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT50c19sYXllcl9pZFsxXSA9IDI7CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT50c19sYXllcl9pZFsyXSA9IDE7CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT50c19sYXllcl9pZFszXSA9IDI7CisgICAgICAgICAgICBtVGVtcG9yYWxQYXR0ZXJuWzBdID0ga1RlbXBvcmFsVXBkYXRlTGFzdEFuZEdvbGRlblJlZkFsdFJlZjsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5bMV0gPSBrVGVtcG9yYWxVcGRhdGVOb25lTm9SZWZHb2xkZW5SZWZBbHRSZWY7CisgICAgICAgICAgICBtVGVtcG9yYWxQYXR0ZXJuWzJdID0ga1RlbXBvcmFsVXBkYXRlR29sZGVuV2l0aG91dERlcGVuZGVuY3lSZWZBbHRSZWY7CisgICAgICAgICAgICBtVGVtcG9yYWxQYXR0ZXJuWzNdID0ga1RlbXBvcmFsVXBkYXRlTm9uZTsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5bNF0gPSBrVGVtcG9yYWxVcGRhdGVMYXN0UmVmQWx0UmVmOworICAgICAgICAgICAgbVRlbXBvcmFsUGF0dGVybls1XSA9IGtUZW1wb3JhbFVwZGF0ZU5vbmU7CisgICAgICAgICAgICBtVGVtcG9yYWxQYXR0ZXJuWzZdID0ga1RlbXBvcmFsVXBkYXRlR29sZGVuUmVmQWx0UmVmOworICAgICAgICAgICAgbVRlbXBvcmFsUGF0dGVybls3XSA9IGtUZW1wb3JhbFVwZGF0ZU5vbmU7CisgICAgICAgICAgICBtVGVtcG9yYWxQYXR0ZXJuTGVuZ3RoID0gODsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR0UoIldyb25nIG51bWJlciBvZiB0ZW1wb3JhbCBsYXllcnMgJXp1IiwgbVRlbXBvcmFsTGF5ZXJzKTsKKyAgICAgICAgICAgIGdvdG8gQ2xlYW5VcDsKKyAgICB9CisgICAgLy8gU2V0IGJpdHJhdGUgdmFsdWVzIGZvciBlYWNoIGxheWVyCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQ29kZWNDb25maWd1cmF0aW9uLT50c19udW1iZXJfbGF5ZXJzOyBpKyspIHsKKyAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+dHNfdGFyZ2V0X2JpdHJhdGVbaV0gPQorICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+cmNfdGFyZ2V0X2JpdHJhdGUgKgorICAgICAgICAgICAgbVRlbXBvcmFsTGF5ZXJCaXRyYXRlUmF0aW9baV0gLyAxMDA7CisgICAgfQorICAgIGlmIChtSW50Zi0+Z2V0U3luY0ZyYW1lUGVyaW9kKCkgPj0gMCkgeworICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5rZl9tYXhfZGlzdCA9IG1JbnRmLT5nZXRTeW5jRnJhbWVQZXJpb2QoKTsKKyAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+a2ZfbWluX2Rpc3QgPSBtSW50Zi0+Z2V0U3luY0ZyYW1lUGVyaW9kKCk7CisgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPmtmX21vZGUgPSBWUFhfS0ZfQVVUTzsKKyAgICB9CisgICAgaWYgKG1NaW5RdWFudGl6ZXIgPiAwKSB7CisgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnJjX21pbl9xdWFudGl6ZXIgPSBtTWluUXVhbnRpemVyOworICAgIH0KKyAgICBpZiAobU1heFF1YW50aXplciA+IDApIHsKKyAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+cmNfbWF4X3F1YW50aXplciA9IG1NYXhRdWFudGl6ZXI7CisgICAgfQorICAgIHNldENvZGVjU3BlY2lmaWNDb25maWd1cmF0aW9uKCk7CisgICAgbUNvZGVjQ29udGV4dCA9IG5ldyB2cHhfY29kZWNfY3R4X3Q7CisgICAgaWYgKCFtQ29kZWNDb250ZXh0KSBnb3RvIENsZWFuVXA7CisgICAgY29kZWNfcmV0dXJuID0gdnB4X2NvZGVjX2VuY19pbml0KG1Db2RlY0NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db2RlY0ludGVyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7ICAvLyBmbGFncworICAgIGlmIChjb2RlY19yZXR1cm4gIT0gVlBYX0NPREVDX09LKSB7CisgICAgICAgIEFMT0dFKCJFcnJvciBpbml0aWFsaXppbmcgdnB4IGVuY29kZXIiKTsKKyAgICAgICAgZ290byBDbGVhblVwOworICAgIH0KKworICAgIC8vIEV4dHJhIENCUiBzZXR0aW5ncworICAgIGlmIChtQml0cmF0ZUNvbnRyb2xNb2RlID09IFZQWF9DQlIpIHsKKyAgICAgICAgY29kZWNfcmV0dXJuID0gdnB4X2NvZGVjX2NvbnRyb2wobUNvZGVjQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4RV9TRVRfU1RBVElDX1RIUkVTSE9MRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7CisgICAgICAgIGlmIChjb2RlY19yZXR1cm4gPT0gVlBYX0NPREVDX09LKSB7CisgICAgICAgICAgICB1aW50MzJfdCByY19tYXhfaW50cmFfdGFyZ2V0ID0KKyAgICAgICAgICAgICAgICAodWludDMyX3QpKG1Db2RlY0NvbmZpZ3VyYXRpb24tPnJjX2J1Zl9vcHRpbWFsX3N6ICogbUZyYW1lUmF0ZS0+dmFsdWUgLyAyMCArIDAuNSk7CisgICAgICAgICAgICAvLyBEb24ndCBnbyBiZWxvdyAzIHRpbWVzIHBlciBmcmFtZSBiYW5kd2lkdGguCisgICAgICAgICAgICBpZiAocmNfbWF4X2ludHJhX3RhcmdldCA8IDMwMCkgeworICAgICAgICAgICAgICAgIHJjX21heF9pbnRyYV90YXJnZXQgPSAzMDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb2RlY19yZXR1cm4gPSB2cHhfY29kZWNfY29udHJvbChtQ29kZWNDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4RV9TRVRfTUFYX0lOVFJBX0JJVFJBVEVfUENULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmNfbWF4X2ludHJhX3RhcmdldCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNvZGVjX3JldHVybiA9PSBWUFhfQ09ERUNfT0spIHsKKyAgICAgICAgICAgIGNvZGVjX3JldHVybiA9IHZweF9jb2RlY19jb250cm9sKG1Db2RlY0NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhFX1NFVF9DUFVVU0VELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTgpOworICAgICAgICB9CisgICAgICAgIGlmIChjb2RlY19yZXR1cm4gIT0gVlBYX0NPREVDX09LKSB7CisgICAgICAgICAgICBBTE9HRSgiRXJyb3Igc2V0dGluZyBjYnIgcGFyYW1ldGVycyBmb3IgdnB4IGVuY29kZXIuIik7CisgICAgICAgICAgICBnb3RvIENsZWFuVXA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjb2RlY19yZXR1cm4gPSBzZXRDb2RlY1NwZWNpZmljQ29udHJvbHMoKTsKKyAgICBpZiAoY29kZWNfcmV0dXJuICE9IFZQWF9DT0RFQ19PSykgZ290byBDbGVhblVwOworCisgICAgeworICAgICAgICB1aW50MzJfdCB3aWR0aCA9IG1TaXplLT53aWR0aDsKKyAgICAgICAgdWludDMyX3QgaGVpZ2h0ID0gbVNpemUtPmhlaWdodDsKKyAgICAgICAgaWYgKCgodWludDY0X3Qpd2lkdGggKiBoZWlnaHQpID4KKyAgICAgICAgICAgICgodWludDY0X3QpSU5UMzJfTUFYIC8gMykpIHsKKyAgICAgICAgICAgIEFMT0dFKCJiLzI1ODEyNzk0LCBCdWZmZXIgc2l6ZSBpcyB0b28gYmlnLCB3aWR0aD0ldSwgaGVpZ2h0PSV1LiIsIHdpZHRoLCBoZWlnaHQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdWludDMyX3Qgc3RyaWRlID0gKHdpZHRoICsgbVN0cmlkZUFsaWduIC0gMSkgJiB+KG1TdHJpZGVBbGlnbiAtIDEpOworICAgICAgICAgICAgdWludDMyX3QgdnN0cmlkZSA9IChoZWlnaHQgKyBtU3RyaWRlQWxpZ24gLSAxKSAmIH4obVN0cmlkZUFsaWduIC0gMSk7CisgICAgICAgICAgICBtQ29udmVyc2lvbkJ1ZmZlciA9IE1lbW9yeUJsb2NrOjpBbGxvY2F0ZShzdHJpZGUgKiB2c3RyaWRlICogMyAvIDIpOworICAgICAgICAgICAgaWYgKCFtQ29udmVyc2lvbkJ1ZmZlci5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiQWxsb2NhdGluZyBjb252ZXJzaW9uIGJ1ZmZlciBmYWlsZWQuIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1OdW1JbnB1dEZyYW1lcyA9IC0xOworICAgICAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworQ2xlYW5VcDoKKyAgICBvblJlbGVhc2UoKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCit2cHhfZW5jX2ZyYW1lX2ZsYWdzX3QgQzJTb2Z0VnB4RW5jOjpnZXRFbmNvZGVGbGFncygpIHsKKyAgICB2cHhfZW5jX2ZyYW1lX2ZsYWdzX3QgZmxhZ3MgPSAwOworICAgIGlmIChtVGVtcG9yYWxQYXR0ZXJuTGVuZ3RoID4gMCkgeworICAgICAgaW50IHBhdHRlcm5JZHggPSBtVGVtcG9yYWxQYXR0ZXJuSWR4ICUgbVRlbXBvcmFsUGF0dGVybkxlbmd0aDsKKyAgICAgIG1UZW1wb3JhbFBhdHRlcm5JZHgrKzsKKyAgICAgIHN3aXRjaCAobVRlbXBvcmFsUGF0dGVybltwYXR0ZXJuSWR4XSkgeworICAgICAgICAgIGNhc2Uga1RlbXBvcmFsVXBkYXRlTGFzdDoKKyAgICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9HRjsKKyAgICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9BUkY7CisgICAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19SRUZfR0Y7CisgICAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19SRUZfQVJGOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIGtUZW1wb3JhbFVwZGF0ZUdvbGRlbldpdGhvdXREZXBlbmRlbmN5OgorICAgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fUkVGX0dGOworICAgICAgICAgICAgICBbW2ZhbGx0aHJvdWdoXV07CisgICAgICAgICAgY2FzZSBrVGVtcG9yYWxVcGRhdGVHb2xkZW46CisgICAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19SRUZfQVJGOworICAgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0FSRjsKKyAgICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9MQVNUOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIGtUZW1wb3JhbFVwZGF0ZUFsdHJlZldpdGhvdXREZXBlbmRlbmN5OgorICAgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fUkVGX0FSRjsKKyAgICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1JFRl9HRjsKKyAgICAgICAgICAgICAgW1tmYWxsdGhyb3VnaF1dOworICAgICAgICAgIGNhc2Uga1RlbXBvcmFsVXBkYXRlQWx0cmVmOgorICAgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0dGOworICAgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0xBU1Q7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2Uga1RlbXBvcmFsVXBkYXRlTm9uZU5vUmVmQWx0cmVmOgorICAgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fUkVGX0FSRjsKKyAgICAgICAgICAgICAgW1tmYWxsdGhyb3VnaF1dOworICAgICAgICAgIGNhc2Uga1RlbXBvcmFsVXBkYXRlTm9uZToKKyAgICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9HRjsKKyAgICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9BUkY7CisgICAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfTEFTVDsKKyAgICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9FTlRST1BZOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIGtUZW1wb3JhbFVwZGF0ZU5vbmVOb1JlZkdvbGRlblJlZkFsdFJlZjoKKyAgICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1JFRl9HRjsKKyAgICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9HRjsKKyAgICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9BUkY7CisgICAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfTEFTVDsKKyAgICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9FTlRST1BZOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIGtUZW1wb3JhbFVwZGF0ZUdvbGRlbldpdGhvdXREZXBlbmRlbmN5UmVmQWx0UmVmOgorICAgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fUkVGX0dGOworICAgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0FSRjsKKyAgICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9MQVNUOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIGtUZW1wb3JhbFVwZGF0ZUxhc3RSZWZBbHRSZWY6CisgICAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfR0Y7CisgICAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfQVJGOworICAgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fUkVGX0dGOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIGtUZW1wb3JhbFVwZGF0ZUdvbGRlblJlZkFsdFJlZjoKKyAgICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9BUkY7CisgICAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfTEFTVDsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBrVGVtcG9yYWxVcGRhdGVMYXN0QW5kR29sZGVuUmVmQWx0UmVmOgorICAgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0FSRjsKKyAgICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1JFRl9HRjsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBrVGVtcG9yYWxVcGRhdGVMYXN0UmVmQWxsOgorICAgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0FSRjsKKyAgICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9HRjsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBmbGFnczsKK30KKworLy8gVE9ETzogYWRkIHN1cHBvcnQgZm9yIFlVViBpbnB1dCBjb2xvciBmb3JtYXRzCisvLyBUT0RPOiBhZGQgc3VwcG9ydCBmb3IgU1ZDLCBBUkYuIFNWQyBhbmQgQVJGIHJldHVybnMgbXVsdGlwbGUgZnJhbWVzCisvLyAoaGllcmFyY2hpY2FsIC8gbm9zaG93KSBpbiBvbmUgY2FsbC4gVGhlc2UgZnJhbWVzIHNob3VsZCBiZSBjb21iaW5lZCBpbiB0bworLy8gYSBzaW5nbGUgYnVmZmVyIGFuZCBzZW50IGJhY2sgdG8gdGhlIGNsaWVudAordm9pZCBDMlNvZnRWcHhFbmM6OnByb2Nlc3MoCisgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgLy8gSW5pdGlhbGl6ZSBvdXRwdXQgd29yaworICAgIHdvcmstPnJlc3VsdCA9IEMyX09LOworICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisKKyAgICBpZiAobVNpZ25hbGxlZEVycm9yIHx8IG1TaWduYWxsZWRPdXRwdXRFb3MpIHsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQkFEX1ZBTFVFOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIC8vIEluaXRpYWxpemUgZW5jb2RlciBpZiBub3QgYWxyZWFkeQorICAgIGlmICghbUNvZGVjQ29udGV4dCAmJiBPSyAhPSBpbml0RW5jb2RlcigpKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBlbmNvZGVyIik7CisgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkdyYXBoaWNWaWV3PiByVmlldzsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGlucHV0QnVmZmVyOworICAgIGlmICghd29yay0+aW5wdXQuYnVmZmVycy5lbXB0eSgpKSB7CisgICAgICAgIGlucHV0QnVmZmVyID0gd29yay0+aW5wdXQuYnVmZmVyc1swXTsKKyAgICAgICAgclZpZXcgPSBzdGQ6Om1ha2Vfc2hhcmVkPGNvbnN0IEMyR3JhcGhpY1ZpZXc+KAorICAgICAgICAgICAgICAgICAgICBpbnB1dEJ1ZmZlci0+ZGF0YSgpLmdyYXBoaWNCbG9ja3MoKS5mcm9udCgpLm1hcCgpLmdldCgpKTsKKyAgICAgICAgaWYgKHJWaWV3LT5lcnJvcigpICE9IEMyX09LKSB7CisgICAgICAgICAgICBBTE9HRSgiZ3JhcGhpYyB2aWV3IG1hcCBlcnIgPSAlZCIsIHJWaWV3LT5lcnJvcigpKTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dWKCJFbXB0eSBpbnB1dCBCdWZmZXIiKTsKKyAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwOworICAgICAgICBpZiAod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgICAgICBmbGFncyB8PSBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNOworICAgICAgICB9CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdClmbGFnczsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgY29uc3QgQzJDb25zdEdyYXBoaWNCbG9jayBpbkJ1ZmZlciA9CisgICAgICAgIGlucHV0QnVmZmVyLT5kYXRhKCkuZ3JhcGhpY0Jsb2NrcygpLmZyb250KCk7CisgICAgaWYgKGluQnVmZmVyLndpZHRoKCkgIT0gbVNpemUtPndpZHRoIHx8CisgICAgICAgIGluQnVmZmVyLmhlaWdodCgpICE9IG1TaXplLT5oZWlnaHQpIHsKKyAgICAgICAgQUxPR0UoInVuZXhwZWN0ZWQgSW5wdXQgYnVmZmVyIGF0dHJpYnV0ZXMgJWQoJWQpIHggJWQoJWQpIiwKKyAgICAgICAgICAgICAgaW5CdWZmZXIud2lkdGgoKSwgbVNpemUtPndpZHRoLCBpbkJ1ZmZlci5oZWlnaHQoKSwKKyAgICAgICAgICAgICAgbVNpemUtPmhlaWdodCk7CisgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBib29sIGVvcyA9ICgod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSAhPSAwKTsKKyAgICB2cHhfaW1hZ2VfdCByYXdfZnJhbWU7CisgICAgY29uc3QgQzJQbGFuYXJMYXlvdXQgJmxheW91dCA9IHJWaWV3LT5sYXlvdXQoKTsKKyAgICB1aW50MzJfdCB3aWR0aCA9IHJWaWV3LT53aWR0aCgpOworICAgIHVpbnQzMl90IGhlaWdodCA9IHJWaWV3LT5oZWlnaHQoKTsKKyAgICBpZiAod2lkdGggPiAweDgwMDAgfHwgaGVpZ2h0ID4gMHg4MDAwKSB7CisgICAgICAgIEFMT0dFKCJJbWFnZSB0b28gYmlnOiAldSB4ICV1Iiwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICB1aW50MzJfdCBzdHJpZGUgPSAod2lkdGggKyBtU3RyaWRlQWxpZ24gLSAxKSAmIH4obVN0cmlkZUFsaWduIC0gMSk7CisgICAgdWludDMyX3QgdnN0cmlkZSA9IChoZWlnaHQgKyBtU3RyaWRlQWxpZ24gLSAxKSAmIH4obVN0cmlkZUFsaWduIC0gMSk7CisgICAgc3dpdGNoIChsYXlvdXQudHlwZSkgeworICAgICAgICBjYXNlIEMyUGxhbmFyTGF5b3V0OjpUWVBFX1JHQjoKKyAgICAgICAgY2FzZSBDMlBsYW5hckxheW91dDo6VFlQRV9SR0JBOiB7CisgICAgICAgICAgICBDb252ZXJ0UkdCVG9QbGFuYXJZVVYobUNvbnZlcnNpb25CdWZmZXIuZGF0YSgpLCBzdHJpZGUsIHZzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnZlcnNpb25CdWZmZXIuc2l6ZSgpLCAqclZpZXcuZ2V0KCkpOworICAgICAgICAgICAgdnB4X2ltZ193cmFwKCZyYXdfZnJhbWUsIFZQWF9JTUdfRk1UX0k0MjAsIHdpZHRoLCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgbVN0cmlkZUFsaWduLCBtQ29udmVyc2lvbkJ1ZmZlci5kYXRhKCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBDMlBsYW5hckxheW91dDo6VFlQRV9ZVVY6IHsKKyAgICAgICAgICAgIGlmICghSXNZVVY0MjAoKnJWaWV3KSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJpbnB1dCBpcyBub3QgWVVWNDIwIik7CisgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1ldLmNvbEluYyA9PSAxCisgICAgICAgICAgICAgICAgICAgICYmIGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1VdLmNvbEluYyA9PSAxCisgICAgICAgICAgICAgICAgICAgICYmIGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1ZdLmNvbEluYyA9PSAxKSB7CisgICAgICAgICAgICAgICAgLy8gSTQyMCBjb21wYXRpYmxlIC0gdGhvdWdoIHdpdGggY3VzdG9tIG9mZnNldCBhbmQgc3RyaWRlCisgICAgICAgICAgICAgICAgdnB4X2ltZ193cmFwKCZyYXdfZnJhbWUsIFZQWF9JTUdfRk1UX0k0MjAsIHdpZHRoLCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdHJpZGVBbGlnbiwgKHVpbnQ4X3QqKXJWaWV3LT5kYXRhKClbMF0pOworICAgICAgICAgICAgICAgIHJhd19mcmFtZS5wbGFuZXNbMV0gPSAodWludDhfdCopclZpZXctPmRhdGEoKVsxXTsKKyAgICAgICAgICAgICAgICByYXdfZnJhbWUucGxhbmVzWzJdID0gKHVpbnQ4X3QqKXJWaWV3LT5kYXRhKClbMl07CisgICAgICAgICAgICAgICAgcmF3X2ZyYW1lLnN0cmlkZVswXSA9IGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1ldLnJvd0luYzsKKyAgICAgICAgICAgICAgICByYXdfZnJhbWUuc3RyaWRlWzFdID0gbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfVV0ucm93SW5jOworICAgICAgICAgICAgICAgIHJhd19mcmFtZS5zdHJpZGVbMl0gPSBsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9WXS5yb3dJbmM7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIGNvcHkgdG8gSTQyMAorICAgICAgICAgICAgICAgIE1lZGlhSW1hZ2UyIGltZyA9IENyZWF0ZVlVVjQyMFBsYW5hck1lZGlhSW1hZ2UyKHdpZHRoLCBoZWlnaHQsIHN0cmlkZSwgdnN0cmlkZSk7CisgICAgICAgICAgICAgICAgaWYgKG1Db252ZXJzaW9uQnVmZmVyLnNpemUoKSA+PSBzdHJpZGUgKiB2c3RyaWRlICogMyAvIDIpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gSW1hZ2VDb3B5KG1Db252ZXJzaW9uQnVmZmVyLmRhdGEoKSwgJmltZywgKnJWaWV3KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkJ1ZmZlciBjb252ZXJzaW9uIGZhaWxlZDogJWQiLCBlcnIpOworICAgICAgICAgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHZweF9pbWdfd3JhcCgmcmF3X2ZyYW1lLCBWUFhfSU1HX0ZNVF9JNDIwLCBzdHJpZGUsIHZzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3RyaWRlQWxpZ24sICh1aW50OF90KilyVmlldy0+ZGF0YSgpWzBdKTsKKyAgICAgICAgICAgICAgICAgICAgdnB4X2ltZ19zZXRfcmVjdCgmcmF3X2ZyYW1lLCAwLCAwLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiQ29udmVyc2lvbiBidWZmZXIgaXMgdG9vIHNtYWxsOiAldSB4ICV1IGZvciAlenUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSwgdnN0cmlkZSwgbUNvbnZlcnNpb25CdWZmZXIuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dFKCJVbnJlY29nbml6ZWQgcGxhbmUgdHlwZTogJWQiLCBsYXlvdXQudHlwZSk7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9CQURfVkFMVUU7CisgICAgICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgdnB4X2VuY19mcmFtZV9mbGFnc190IGZsYWdzID0gZ2V0RW5jb2RlRmxhZ3MoKTsKKyAgICAvLyBoYW5kbGUgZHluYW1pYyBjb25maWcgcGFyYW1ldGVycworICAgIHsKKyAgICAgICAgSW50ZkltcGw6OkxvY2sgbG9jayA9IG1JbnRmLT5sb2NrKCk7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUludHJhUmVmcmVzaFR1bmluZzo6b3V0cHV0PiBpbnRyYVJlZnJlc2ggPSBtSW50Zi0+Z2V0SW50cmFSZWZyZXNoX2woKTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQml0cmF0ZUluZm86Om91dHB1dD4gYml0cmF0ZSA9IG1JbnRmLT5nZXRCaXRyYXRlX2woKTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUmVxdWVzdFN5bmNGcmFtZVR1bmluZzo6b3V0cHV0PiByZXF1ZXN0U3luYyA9IG1JbnRmLT5nZXRSZXF1ZXN0U3luY19sKCk7CisgICAgICAgIGxvY2sudW5sb2NrKCk7CisKKyAgICAgICAgaWYgKGludHJhUmVmcmVzaCAhPSBtSW50cmFSZWZyZXNoKSB7CisgICAgICAgICAgICBtSW50cmFSZWZyZXNoID0gaW50cmFSZWZyZXNoOworICAgICAgICAgICAgQUxPR1YoIkdvdCBtSW50cmFSZWZyZXNoIHJlcXVlc3QiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChyZXF1ZXN0U3luYyAhPSBtUmVxdWVzdFN5bmMpIHsKKyAgICAgICAgICAgIC8vIHdlIGNhbiBoYW5kbGUgSURSIGltbWVkaWF0ZWx5CisgICAgICAgICAgICBpZiAocmVxdWVzdFN5bmMtPnZhbHVlKSB7CisgICAgICAgICAgICAgICAgLy8gdW5zZXQgcmVxdWVzdAorICAgICAgICAgICAgICAgIEMyU3RyZWFtUmVxdWVzdFN5bmNGcmFtZVR1bmluZzo6b3V0cHV0IGNsZWFyU3luYygwdSwgQzJfRkFMU0UpOworICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICAgICAgICAgICAgICBtSW50Zi0+Y29uZmlnKHsgJmNsZWFyU3luYyB9LCBDMl9NQVlfQkxPQ0ssICZmYWlsdXJlcyk7CisgICAgICAgICAgICAgICAgQUxPR1YoIkdvdCBzeW5jIHJlcXVlc3QiKTsKKyAgICAgICAgICAgICAgICBmbGFncyB8PSBWUFhfRUZMQUdfRk9SQ0VfS0Y7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtUmVxdWVzdFN5bmMgPSByZXF1ZXN0U3luYzsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChiaXRyYXRlICE9IG1CaXRyYXRlKSB7CisgICAgICAgICAgICBtQml0cmF0ZSA9IGJpdHJhdGU7CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5yY190YXJnZXRfYml0cmF0ZSA9CisgICAgICAgICAgICAgICAgKG1CaXRyYXRlLT52YWx1ZSArIDUwMCkgLyAxMDAwOworICAgICAgICAgICAgdnB4X2NvZGVjX2Vycl90IHJlcyA9IHZweF9jb2RlY19lbmNfY29uZmlnX3NldChtQ29kZWNDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uKTsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gVlBYX0NPREVDX09LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoInZweCBlbmNvZGVyIGZhaWxlZCB0byB1cGRhdGUgYml0cmF0ZTogJXMiLAorICAgICAgICAgICAgICAgICAgICAgIHZweF9jb2RlY19lcnJfdG9fc3RyaW5nKHJlcykpOworICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHVpbnQ2NF90IGlucHV0VGltZVN0YW1wID0gd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAucGVla3VsbCgpOworICAgIHVpbnQzMl90IGZyYW1lRHVyYXRpb247CisgICAgaWYgKGlucHV0VGltZVN0YW1wID4gbUxhc3RUaW1lc3RhbXApIHsKKyAgICAgICAgZnJhbWVEdXJhdGlvbiA9ICh1aW50MzJfdCkoaW5wdXRUaW1lU3RhbXAgLSBtTGFzdFRpbWVzdGFtcCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gVXNlIGRlZmF1bHQgb2YgMzAgZnBzIGluIGNhc2Ugb2YgMCBmcmFtZSByYXRlLgorICAgICAgICBmbG9hdCBmcmFtZVJhdGUgPSBtRnJhbWVSYXRlLT52YWx1ZTsKKyAgICAgICAgaWYgKGZyYW1lUmF0ZSA8IDAuMDAxKSB7CisgICAgICAgICAgICBmcmFtZVJhdGUgPSAzMDsKKyAgICAgICAgfQorICAgICAgICBmcmFtZUR1cmF0aW9uID0gKHVpbnQzMl90KSgxMDAwMDAwIC8gZnJhbWVSYXRlICsgMC41KTsKKyAgICB9CisgICAgbUxhc3RUaW1lc3RhbXAgPSBpbnB1dFRpbWVTdGFtcDsKKworICAgIHZweF9jb2RlY19lcnJfdCBjb2RlY19yZXR1cm4gPSB2cHhfY29kZWNfZW5jb2RlKG1Db2RlY0NvbnRleHQsICZyYXdfZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRUaW1lU3RhbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVEdXJhdGlvbiwgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlBYX0RMX1JFQUxUSU1FKTsKKyAgICBpZiAoY29kZWNfcmV0dXJuICE9IFZQWF9DT0RFQ19PSykgeworICAgICAgICBBTE9HRSgidnB4IGVuY29kZXIgZmFpbGVkIHRvIGVuY29kZSBmcmFtZSIpOworICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBib29sIHBvcHVsYXRlZCA9IGZhbHNlOworICAgIHZweF9jb2RlY19pdGVyX3QgZW5jb2RlZF9wYWNrZXRfaXRlcmF0b3IgPSBudWxscHRyOworICAgIGNvbnN0IHZweF9jb2RlY19jeF9wa3RfdCogZW5jb2RlZF9wYWNrZXQ7CisgICAgd2hpbGUgKChlbmNvZGVkX3BhY2tldCA9IHZweF9jb2RlY19nZXRfY3hfZGF0YSgKKyAgICAgICAgICAgICAgICAgICAgbUNvZGVjQ29udGV4dCwgJmVuY29kZWRfcGFja2V0X2l0ZXJhdG9yKSkpIHsKKyAgICAgICAgaWYgKGVuY29kZWRfcGFja2V0LT5raW5kID09IFZQWF9DT0RFQ19DWF9GUkFNRV9QS1QpIHsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBibG9jazsKKyAgICAgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgPSB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfTsKKyAgICAgICAgICAgIGMyX3N0YXR1c190IGVyciA9IHBvb2wtPmZldGNoTGluZWFyQmxvY2soZW5jb2RlZF9wYWNrZXQtPmRhdGEuZnJhbWUuc3osIHVzYWdlLCAmYmxvY2spOworICAgICAgICAgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCJmZXRjaExpbmVhckJsb2NrIGZvciBPdXRwdXQgZmFpbGVkIHdpdGggc3RhdHVzICVkIiwgZXJyKTsKKyAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9OT19NRU1PUlk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQzJXcml0ZVZpZXcgd1ZpZXcgPSBibG9jay0+bWFwKCkuZ2V0KCk7CisgICAgICAgICAgICBpZiAod1ZpZXcuZXJyb3IoKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJ3cml0ZSB2aWV3IG1hcCBmYWlsZWQgJWQiLCB3Vmlldy5lcnJvcigpKTsKKyAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtZW1jcHkod1ZpZXcuZGF0YSgpLCBlbmNvZGVkX3BhY2tldC0+ZGF0YS5mcmFtZS5idWYsIGVuY29kZWRfcGFja2V0LT5kYXRhLmZyYW1lLnN6KTsKKyAgICAgICAgICAgICsrbU51bUlucHV0RnJhbWVzOworCisgICAgICAgICAgICBBTE9HRCgiYnl0ZXMgZ2VuZXJhdGVkICV6dSIsIGVuY29kZWRfcGFja2V0LT5kYXRhLmZyYW1lLnN6KTsKKyAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzID0gMDsKKyAgICAgICAgICAgIGlmIChlb3MpIHsKKyAgICAgICAgICAgICAgICBmbGFncyB8PSBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KWZsYWdzOworICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYnVmZmVyID0gY3JlYXRlTGluZWFyQnVmZmVyKGJsb2NrKTsKKyAgICAgICAgICAgIGlmIChlbmNvZGVkX3BhY2tldC0+ZGF0YS5mcmFtZS5mbGFncyAmIFZQWF9GUkFNRV9JU19LRVkpIHsKKyAgICAgICAgICAgICAgICBidWZmZXItPnNldEluZm8oc3RkOjptYWtlX3NoYXJlZDxDMlN0cmVhbVBpY3R1cmVUeXBlTWFza0luZm86Om91dHB1dD4oCisgICAgICAgICAgICAgICAgICAgICAgICAwdSAvKiBzdHJlYW0gaWQgKi8sIEMyUGljdHVyZVR5cGVLZXlGcmFtZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMucHVzaF9iYWNrKGJ1ZmZlcik7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbC50aW1lc3RhbXAgPSBlbmNvZGVkX3BhY2tldC0+ZGF0YS5mcmFtZS5wdHM7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgcG9wdWxhdGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIGlmIChlb3MpIHsKKyAgICAgICAgICAgICAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBBTE9HVigic2lnbmFsbGVkIEVPUyIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmICghcG9wdWxhdGVkKSB7CisgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMHU7CisgICAgfQorfQorCitjMl9zdGF0dXNfdCBDMlNvZnRWcHhFbmM6OmRyYWluKAorICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAodm9pZClwb29sOworICAgIGlmIChkcmFpbk1vZGUgPT0gTk9fRFJBSU4pIHsKKyAgICAgICAgQUxPR1coImRyYWluIHdpdGggTk9fRFJBSU46IG5vLW9wIik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisgICAgaWYgKGRyYWluTW9kZSA9PSBEUkFJTl9DSEFJTikgeworICAgICAgICBBTE9HVygiRFJBSU5fQ0hBSU4gbm90IHN1cHBvcnRlZCIpOworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnB4RW5jLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnB4RW5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODdlZDFhOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9DMlNvZnRWcHhFbmMuaApAQCAtMCwwICsxLDQzNyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0MyX1NPRlRfVlBYX0VOQ19IX18KKyNkZWZpbmUgQU5EUk9JRF9DMl9TT0ZUX1ZQWF9FTkNfSF9fCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oPgorCisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxDb2RlYzJCdWZmZXJVdGlscy5oPgorI2luY2x1ZGUgPFNpbXBsZUMyQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8U2ltcGxlQzJJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDx1dGlsL0MySW50ZXJmYWNlSGVscGVyLmg+CisKKyNpbmNsdWRlICJ2cHgvdnB4X2VuY29kZXIuaCIKKyNpbmNsdWRlICJ2cHgvdnB4X2NvZGVjLmgiCisjaW5jbHVkZSAidnB4L3ZweF9pbWFnZS5oIgorI2luY2x1ZGUgInZweC92cDhjeC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIFRPRE86IFRoZXNlIGRlZnMgdGFrZW4gZnJvbSBkZXByZWNhdGVkIE9NWF9WaWRlb0V4dC5oLiBNb3ZlIHRoZXNlIGRlZmluaXRpb25zCisvLyB0byBhIG5ldyBoZWFkZXIgZmlsZSBhbmQgaW5jbHVkZSBpdC4KKworLyoqIE1heGltdW0gbnVtYmVyIG9mIHRlbXBvcmFsIGxheWVycyAqLworI2RlZmluZSBNQVhURU1QT1JBTExBWUVSUyAzCisKKy8qKiB0ZW1wb3JhbCBsYXllciBwYXR0ZXJucyAqLwordHlwZWRlZiBlbnVtIFRlbXBvcmFsUGF0dGVyblR5cGUgeworICAgIFZQWFRlbXBvcmFsTGF5ZXJQYXR0ZXJuTm9uZSA9IDAsCisgICAgVlBYVGVtcG9yYWxMYXllclBhdHRlcm5XZWJSVEMgPSAxLAorICAgIFZQWFRlbXBvcmFsTGF5ZXJQYXR0ZXJuTWF4ID0gMHg3RkZGRkZGRgorfSBUZW1wb3JhbFBhdHRlcm5UeXBlOworCisvLyBCYXNlIGNsYXNzIGZvciBhIFZQWCBFbmNvZGVyIENvbXBvbmVudAorLy8KKy8vIE9ubHkgZm9sbG93aW5nIGVuY29kZXIgc2V0dGluZ3MgYXJlIGF2YWlsYWJsZSAoY29kZWMgc3BlY2lmaWMgc2V0dGluZ3MgbWlnaHQKKy8vIGJlIGF2YWlsYWJsZSBpbiB0aGUgc3ViLWNsYXNzZXMpOgorLy8gICAgLSB2aWRlbyByZXNvbHV0aW9uCisvLyAgICAtIHRhcmdldCBiaXRyYXRlCisvLyAgICAtIHJhdGUgY29udHJvbCAoY29uc3RhbnQgLyB2YXJpYWJsZSkKKy8vICAgIC0gZnJhbWUgcmF0ZQorLy8gICAgLSBlcnJvciByZXNpbGllbmNlCisvLyAgICAtIHJlY29uc3RydWN0aW9uICYgbG9vcCBmaWx0ZXJzIChnX3Byb2ZpbGUpCisvLworLy8gT25seSBmb2xsb3dpbmcgY29sb3IgZm9ybWF0cyBhcmUgcmVjb2duaXplZAorLy8gICAgLSBDMlBsYW5hckxheW91dDo6VFlQRV9SR0IKKy8vICAgIC0gQzJQbGFuYXJMYXlvdXQ6OlRZUEVfUkdCQQorLy8KKy8vIEZvbGxvd2luZyBzZXR0aW5ncyBhcmUgbm90IGNvbmZpZ3VyYWJsZSBieSB0aGUgY2xpZW50CisvLyAgICAtIGVuY29kaW5nIGRlYWRsaW5lIGlzIHJlYWx0aW1lCisvLyAgICAtIG11bHRpdGhyZWFkZWQgZW5jb2RpbmcgdXRpbGl6ZXMgYSBudW1iZXIgb2YgdGhyZWFkcyBlcXVhbAorLy8gdG8gb25saW5lIGNwdSdzIGF2YWlsYWJsZQorLy8gICAgLSB0aGUgYWxnb3JpdGhtIGludGVyZmFjZSBmb3IgZW5jb2RlciBpcyBkZWNpZGVkIGJ5IHRoZSBzdWItY2xhc3MgaW4gdXNlCisvLyAgICAtIGZyYWN0aW9uYWwgYml0cyBvZiBmcmFtZSByYXRlIGlzIGRpc2NhcmRlZAorLy8gICAgLSB0aW1lc3RhbXBzIGFyZSBpbiBtaWNyb3NlY29uZHMsIHRoZXJlZm9yZSBlbmNvZGVyIHRpbWViYXNlIGlzIGZpeGVkCisvLyB0byAxLzEwMDAwMDAKKworc3RydWN0IEMyU29mdFZweEVuYyA6IHB1YmxpYyBTaW1wbGVDMkNvbXBvbmVudCB7CisgICAgY2xhc3MgSW50ZkltcGw7CisKKyAgICBDMlNvZnRWcHhFbmMoY29uc3QgY2hhciogbmFtZSwgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+JiBpbnRmSW1wbCk7CisKKyAgICAvLyBGcm9tIFNpbXBsZUMyQ29tcG9uZW50CisgICAgYzJfc3RhdHVzX3Qgb25Jbml0KCkgb3ZlcnJpZGUgZmluYWw7CisgICAgYzJfc3RhdHVzX3Qgb25TdG9wKCkgb3ZlcnJpZGUgZmluYWw7CisgICAgdm9pZCBvblJlc2V0KCkgb3ZlcnJpZGUgZmluYWw7CisgICAgdm9pZCBvblJlbGVhc2UoKSBvdmVycmlkZSBmaW5hbDsKKyAgICBjMl9zdGF0dXNfdCBvbkZsdXNoX3NtKCkgb3ZlcnJpZGUgZmluYWw7CisKKyAgICB2b2lkIHByb2Nlc3MoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlIGZpbmFsOworICAgIGMyX3N0YXR1c190IGRyYWluKAorICAgICAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGUgZmluYWw7CisKKyBwcm90ZWN0ZWQ6CisgICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gbUludGY7CisgICAgIHZpcnR1YWwgfkMyU29mdFZweEVuYygpOworCisgICAgIC8vIEluaXRpYWxpemVzIHZweCBlbmNvZGVyIHdpdGggYXZhaWxhYmxlIHNldHRpbmdzLgorICAgICBzdGF0dXNfdCBpbml0RW5jb2RlcigpOworCisgICAgIC8vIFBvcHVsYXRlcyBtQ29kZWNJbnRlcmZhY2Ugd2l0aCBjb2RlYyBzcGVjaWZpYyBzZXR0aW5ncy4KKyAgICAgdmlydHVhbCB2b2lkIHNldENvZGVjU3BlY2lmaWNJbnRlcmZhY2UoKSA9IDA7CisKKyAgICAgLy8gU2V0cyBjb2RlYyBzcGVjaWZpYyBjb25maWd1cmF0aW9uLgorICAgICB2aXJ0dWFsIHZvaWQgc2V0Q29kZWNTcGVjaWZpY0NvbmZpZ3VyYXRpb24oKSA9IDA7CisKKyAgICAgLy8gU2V0cyBjb2RlYyBzcGVjaWZpYyBlbmNvZGVyIGNvbnRyb2xzLgorICAgICB2aXJ0dWFsIHZweF9jb2RlY19lcnJfdCBzZXRDb2RlY1NwZWNpZmljQ29udHJvbHMoKSA9IDA7CisKKyAgICAgLy8gR2V0IGN1cnJlbnQgZW5jb2RlIGZsYWdzLgorICAgICB2aXJ0dWFsIHZweF9lbmNfZnJhbWVfZmxhZ3NfdCBnZXRFbmNvZGVGbGFncygpOworCisgICAgIGVudW0gVGVtcG9yYWxSZWZlcmVuY2VzIHsKKyAgICAgICAgIC8vIEZvciAxIGxheWVyIGNhc2U6IHJlZmVyZW5jZSBhbGwgKGxhc3QsIGdvbGRlbiwgYW5kIGFsdCByZWYpLCBidXQgb25seQorICAgICAgICAgLy8gdXBkYXRlIGxhc3QuCisgICAgICAgICBrVGVtcG9yYWxVcGRhdGVMYXN0UmVmQWxsID0gMTIsCisgICAgICAgICAvLyBGaXJzdCBiYXNlIGxheWVyIGZyYW1lIGZvciAzIHRlbXBvcmFsIGxheWVycywgd2hpY2ggdXBkYXRlcyBsYXN0IGFuZAorICAgICAgICAgLy8gZ29sZGVuIHdpdGggYWx0IHJlZiBkZXBlbmRlbmN5LgorICAgICAgICAga1RlbXBvcmFsVXBkYXRlTGFzdEFuZEdvbGRlblJlZkFsdFJlZiA9IDExLAorICAgICAgICAgLy8gRmlyc3QgZW5oYW5jZW1lbnQgbGF5ZXIgd2l0aCBhbHQgcmVmIGRlcGVuZGVuY3kuCisgICAgICAgICBrVGVtcG9yYWxVcGRhdGVHb2xkZW5SZWZBbHRSZWYgPSAxMCwKKyAgICAgICAgIC8vIEZpcnN0IGVuaGFuY2VtZW50IGxheWVyIHdpdGggYWx0IHJlZiBkZXBlbmRlbmN5LgorICAgICAgICAga1RlbXBvcmFsVXBkYXRlR29sZGVuV2l0aG91dERlcGVuZGVuY3lSZWZBbHRSZWYgPSA5LAorICAgICAgICAgLy8gQmFzZSBsYXllciB3aXRoIGFsdCByZWYgZGVwZW5kZW5jeS4KKyAgICAgICAgIGtUZW1wb3JhbFVwZGF0ZUxhc3RSZWZBbHRSZWYgPSA4LAorICAgICAgICAgLy8gSGlnaGVzdCBlbmhhY2VtZW50IGxheWVyIHdpdGhvdXQgZGVwZW5kZW5jeSBvbiBnb2xkZW4gd2l0aCBhbHQgcmVmCisgICAgICAgICAvLyBkZXBlbmRlbmN5LgorICAgICAgICAga1RlbXBvcmFsVXBkYXRlTm9uZU5vUmVmR29sZGVuUmVmQWx0UmVmID0gNywKKyAgICAgICAgIC8vIFNlY29uZCBsYXllciBhbmQgbGFzdCBmcmFtZSBpbiBjeWNsZSwgZm9yIDIgbGF5ZXJzLgorICAgICAgICAga1RlbXBvcmFsVXBkYXRlTm9uZU5vUmVmQWx0cmVmID0gNiwKKyAgICAgICAgIC8vIEhpZ2hlc3QgZW5oYW5jZW1lbnQgbGF5ZXIuCisgICAgICAgICBrVGVtcG9yYWxVcGRhdGVOb25lID0gNSwKKyAgICAgICAgIC8vIFNlY29uZCBlbmhhbmNlbWVudCBsYXllci4KKyAgICAgICAgIGtUZW1wb3JhbFVwZGF0ZUFsdHJlZiA9IDQsCisgICAgICAgICAvLyBTZWNvbmQgZW5oYW5jZW1lbnQgbGF5ZXIgd2l0aG91dCBkZXBlbmRlbmN5IG9uIHByZXZpb3VzIGZyYW1lcyBpbgorICAgICAgICAgLy8gdGhlIHNlY29uZCBlbmhhbmNlbWVudCBsYXllci4KKyAgICAgICAgIGtUZW1wb3JhbFVwZGF0ZUFsdHJlZldpdGhvdXREZXBlbmRlbmN5ID0gMywKKyAgICAgICAgIC8vIEZpcnN0IGVuaGFuY2VtZW50IGxheWVyLgorICAgICAgICAga1RlbXBvcmFsVXBkYXRlR29sZGVuID0gMiwKKyAgICAgICAgIC8vIEZpcnN0IGVuaGFuY2VtZW50IGxheWVyIHdpdGhvdXQgZGVwZW5kZW5jeSBvbiBwcmV2aW91cyBmcmFtZXMgaW4KKyAgICAgICAgIC8vIHRoZSBmaXJzdCBlbmhhbmNlbWVudCBsYXllci4KKyAgICAgICAgIGtUZW1wb3JhbFVwZGF0ZUdvbGRlbldpdGhvdXREZXBlbmRlbmN5ID0gMSwKKyAgICAgICAgIC8vIEJhc2UgbGF5ZXIuCisgICAgICAgICBrVGVtcG9yYWxVcGRhdGVMYXN0ID0gMCwKKyAgICAgfTsKKyAgICAgZW51bSB7CisgICAgICAgICBrTWF4VGVtcG9yYWxQYXR0ZXJuID0gOAorICAgICB9OworCisgICAgIC8vIHZweCBzcGVjaWZpYyBvcGFxdWUgZGF0YSBzdHJ1Y3R1cmUgdGhhdAorICAgICAvLyBzdG9yZXMgZW5jb2RlciBzdGF0ZQorICAgICB2cHhfY29kZWNfY3R4X3QqIG1Db2RlY0NvbnRleHQ7CisKKyAgICAgLy8gdnB4IHNwZWNpZmljIGRhdGEgc3RydWN0dXJlIHRoYXQKKyAgICAgLy8gc3RvcmVzIGVuY29kZXIgY29uZmlndXJhdGlvbgorICAgICB2cHhfY29kZWNfZW5jX2NmZ190KiBtQ29kZWNDb25maWd1cmF0aW9uOworCisgICAgIC8vIHZweCBzcGVjaWZpYyByZWFkLW9ubHkgZGF0YSBzdHJ1Y3R1cmUKKyAgICAgLy8gdGhhdCBzcGVjaWZpZXMgYWxnb3JpdGhtIGludGVyZmFjZSAoZS5nLiB2cDgpCisgICAgIHZweF9jb2RlY19pZmFjZV90KiBtQ29kZWNJbnRlcmZhY2U7CisKKyAgICAgLy8gYWxpZ24gc3RyaWRlIHRvIHRoZSBwb3dlciBvZiAyCisgICAgIGludDMyX3QgbVN0cmlkZUFsaWduOworCisgICAgIC8vIENvbG9yIGZvcm1hdCBmb3IgdGhlIGlucHV0IHBvcnQKKyAgICAgdnB4X2ltZ19mbXRfdCBtQ29sb3JGb3JtYXQ7CisKKyAgICAgLy8gQml0cmF0ZSBjb250cm9sIG1vZGUsIGVpdGhlciBjb25zdGFudCBvciB2YXJpYWJsZQorICAgICB2cHhfcmNfbW9kZSBtQml0cmF0ZUNvbnRyb2xNb2RlOworCisgICAgIC8vIFBhcmFtZXRlciB0aGF0IGRlbm90ZXMgd2hldGhlciBlcnJvciByZXNpbGllbmNlCisgICAgIC8vIGlzIGVuYWJsZWQgaW4gZW5jb2RlcgorICAgICBib29sIG1FcnJvclJlc2lsaWVuY2U7CisKKyAgICAgLy8gTWluaW11bSAoYmVzdCBxdWFsaXR5KSBxdWFudGl6ZXIKKyAgICAgdWludDMyX3QgbU1pblF1YW50aXplcjsKKworICAgICAvLyBNYXhpbXVtICh3b3JzdCBxdWFsaXR5KSBxdWFudGl6ZXIKKyAgICAgdWludDMyX3QgbU1heFF1YW50aXplcjsKKworICAgICAvLyBOdW1iZXIgb2YgY29kaW5nIHRlbXBvcmFsIGxheWVycyB0byBiZSB1c2VkLgorICAgICBzaXplX3QgbVRlbXBvcmFsTGF5ZXJzOworCisgICAgIC8vIFRlbXBvcmFsIGxheWVyIGJpdHJhcmUgcmF0aW8gaW4gcGVyY2VudGFnZQorICAgICB1aW50MzJfdCBtVGVtcG9yYWxMYXllckJpdHJhdGVSYXRpb1tNQVhURU1QT1JBTExBWUVSU107CisKKyAgICAgLy8gVGVtcG9yYWwgcGF0dGVybiB0eXBlCisgICAgIFRlbXBvcmFsUGF0dGVyblR5cGUgbVRlbXBvcmFsUGF0dGVyblR5cGU7CisKKyAgICAgLy8gVGVtcG9yYWwgcGF0dGVybiBsZW5ndGgKKyAgICAgc2l6ZV90IG1UZW1wb3JhbFBhdHRlcm5MZW5ndGg7CisKKyAgICAgLy8gVGVtcG9yYWwgcGF0dGVybiBjdXJyZW50IGluZGV4CisgICAgIHNpemVfdCBtVGVtcG9yYWxQYXR0ZXJuSWR4OworCisgICAgIC8vIEZyYW1lIHR5cGUgdGVtcG9yYWwgcGF0dGVybgorICAgICBUZW1wb3JhbFJlZmVyZW5jZXMgbVRlbXBvcmFsUGF0dGVybltrTWF4VGVtcG9yYWxQYXR0ZXJuXTsKKworICAgICAvLyBMYXN0IGlucHV0IGJ1ZmZlciB0aW1lc3RhbXAKKyAgICAgdWludDY0X3QgbUxhc3RUaW1lc3RhbXA7CisKKyAgICAgLy8gTnVtYmVyIG9mIGlucHV0IGZyYW1lcworICAgICBpbnQ2NF90IG1OdW1JbnB1dEZyYW1lczsKKworICAgICAvLyBDb252ZXJzaW9uIGJ1ZmZlciBpcyBuZWVkZWQgdG8gaW5wdXQgdG8KKyAgICAgLy8geXV2NDIwIHBsYW5hciBmb3JtYXQuCisgICAgIE1lbW9yeUJsb2NrIG1Db252ZXJzaW9uQnVmZmVyOworCisgICAgIC8vIFNpZ25hbGxlZCBFT1MKKyAgICAgYm9vbCBtU2lnbmFsbGVkT3V0cHV0RW9zOworCisgICAgIC8vIFNpZ25hbGxlZCBFcnJvcgorICAgICBib29sIG1TaWduYWxsZWRFcnJvcjsKKworICAgIC8vIGNvbmZpZ3VyYXRpb25zIHVzZWQgYnkgY29tcG9uZW50IGluIHByb2Nlc3MKKyAgICAvLyAoVE9ETzoga2VlcCB0aGlzIGluIGludGYgYnV0IG1ha2UgdGhlbSBpbnRlcm5hbCBvbmx5KQorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6aW5wdXQ+IG1TaXplOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUludHJhUmVmcmVzaFR1bmluZzo6b3V0cHV0PiBtSW50cmFSZWZyZXNoOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUZyYW1lUmF0ZUluZm86Om91dHB1dD4gbUZyYW1lUmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CaXRyYXRlSW5mbzo6b3V0cHV0PiBtQml0cmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CaXRyYXRlTW9kZVR1bmluZzo6b3V0cHV0PiBtQml0cmF0ZU1vZGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUmVxdWVzdFN5bmNGcmFtZVR1bmluZzo6b3V0cHV0PiBtUmVxdWVzdFN5bmM7CisKKyAgICAgQzJfRE9fTk9UX0NPUFkoQzJTb2Z0VnB4RW5jKTsKK307CisKK2NsYXNzIEMyU29mdFZweEVuYzo6SW50ZkltcGwgOiBwdWJsaWMgQzJJbnRlcmZhY2VIZWxwZXIgeworICAgcHVibGljOgorICAgIGV4cGxpY2l0IEludGZJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4mIGhlbHBlcikKKyAgICAgICAgOiBDMkludGVyZmFjZUhlbHBlcihoZWxwZXIpIHsKKyAgICAgICAgc2V0RGVyaXZlZEluc3RhbmNlKHRoaXMpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dEZvcm1hdCwgQzJfTkFNRV9JTlBVVF9TVFJFQU1fRk9STUFUX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKAorICAgICAgICAgICAgICAgICAgICBuZXcgQzJTdHJlYW1Gb3JtYXRDb25maWc6OmlucHV0KDB1LCBDMkZvcm1hdFZpZGVvKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obU91dHB1dEZvcm1hdCwgQzJfTkFNRV9PVVRQVVRfU1RSRUFNX0ZPUk1BVF9TRVRUSU5HKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZSgKKyAgICAgICAgICAgICAgICAgICAgbmV3IEMyU3RyZWFtRm9ybWF0Q29uZmlnOjpvdXRwdXQoMHUsIEMyRm9ybWF0Q29tcHJlc3NlZCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dE1lZGlhVHlwZSwgQzJfTkFNRV9JTlBVVF9QT1JUX01JTUVfU0VUVElORykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoQWxsb2NTaGFyZWRTdHJpbmc8QzJQb3J0TWltZUNvbmZpZzo6aW5wdXQ+KAorICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9WSURFT19SQVcpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtT3V0cHV0TWVkaWFUeXBlLCBDMl9OQU1FX09VVFBVVF9QT1JUX01JTUVfU0VUVElORykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoQWxsb2NTaGFyZWRTdHJpbmc8QzJQb3J0TWltZUNvbmZpZzo6b3V0cHV0PigKKyNpZmRlZiBWUDkKKyAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfVklERU9fVlA5CisjZWxzZQorICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9WSURFT19WUDgKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICApKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoRGVmaW5lUGFyYW0obVVzYWdlLCBDMl9OQU1FX0lOUFVUX1NUUkVBTV9VU0FHRV9TRVRUSU5HKQorICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1Vc2FnZVR1bmluZzo6aW5wdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB1LCAodWludDY0X3QpQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQpKQorICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtU2l6ZSwgQzJfTkFNRV9TVFJFQU1fVklERU9fU0laRV9TRVRUSU5HKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJWaWRlb1NpemVTdHJlYW1UdW5pbmc6OmlucHV0KDB1LCAzMjAsIDI0MCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIHdpZHRoKS5pblJhbmdlKDIsIDIwNDgsIDIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIGhlaWdodCkuaW5SYW5nZSgyLCAyMDQ4LCAyKSwKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNpemVTZXR0ZXIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1CaXRyYXRlTW9kZSwgQzJfUEFSQU1LRVlfQklUUkFURV9NT0RFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1CaXRyYXRlTW9kZVR1bmluZzo6b3V0cHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgMHUsIEMyQ29uZmlnOjpCSVRSQVRFX0NPTlNUKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtQml0cmF0ZU1vZGUsIHZhbHVlKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6QklUUkFURV9DT05TVCwgQzJDb25maWc6OkJJVFJBVEVfVkFSSUFCTEUgfSkKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKAorICAgICAgICAgICAgICAgICAgICBTZXR0ZXI8ZGVjbHR5cGUoKm1CaXRyYXRlTW9kZSk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1GcmFtZVJhdGUsIEMyX05BTUVfU1RSRUFNX0ZSQU1FX1JBVEVfU0VUVElORykKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtRnJhbWVSYXRlSW5mbzo6b3V0cHV0KDB1LCAzMC4pKQorICAgICAgICAgICAgICAgIC8vIFRPRE86IE1vcmUgcmVzdHJpY3Rpb24/CisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtRnJhbWVSYXRlLCB2YWx1ZSkuZ3JlYXRlclRoYW4oMC4pfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcigKKyAgICAgICAgICAgICAgICAgICAgU2V0dGVyPGRlY2x0eXBlKCptRnJhbWVSYXRlKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obUxheWVyaW5nLCBDMl9QQVJBTUtFWV9URU1QT1JBTF9MQVlFUklORykKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQoQzJTdHJlYW1UZW1wb3JhbExheWVyaW5nVHVuaW5nOjpvdXRwdXQ6OkFsbG9jU2hhcmVkKDB1LCAwLCAwLCAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtTGF5ZXJpbmcsIG0ubGF5ZXJDb3VudCkuaW5SYW5nZSgwLCA0KSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1MYXllcmluZywgbS5iTGF5ZXJDb3VudCkuaW5SYW5nZSgwLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1MYXllcmluZywgbS5iaXRyYXRlUmF0aW9zKS5pblJhbmdlKDAuLCAxLikKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKExheWVyaW5nU2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVN5bmNGcmFtZVBlcmlvZCwgQzJfUEFSQU1LRVlfU1lOQ19GUkFNRV9JTlRFUlZBTCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtU3luY0ZyYW1lSW50ZXJ2YWxUdW5pbmc6Om91dHB1dCgwdSwgMTAwMDAwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtU3luY0ZyYW1lUGVyaW9kLCB2YWx1ZSkuYW55KCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbVN5bmNGcmFtZVBlcmlvZCk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1CaXRyYXRlLCBDMl9OQU1FX1NUUkVBTV9CSVRSQVRFX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMkJpdHJhdGVUdW5pbmc6Om91dHB1dCgwdSwgNjQwMDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUJpdHJhdGUsIHZhbHVlKS5pblJhbmdlKDQwOTYsIDQwMDAwMDAwKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoQml0cmF0ZVNldHRlcikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnRyYVJlZnJlc2gsIEMyX1BBUkFNS0VZX0lOVFJBX1JFRlJFU0gpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbUludHJhUmVmcmVzaFR1bmluZzo6b3V0cHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwdSwgQzJDb25maWc6OklOVFJBX1JFRlJFU0hfRElTQUJMRUQsIDAuKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICBEZWZpbmVQYXJhbShtUHJvZmlsZUxldmVsLCBDMl9QQVJBTUtFWV9QUk9GSUxFX0xFVkVMKQorICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6b3V0cHV0KAorICAgICAgICAgICAgICAgIDB1LCBQUk9GSUxFX1ZQOV8wLCBMRVZFTF9WUDlfNF8xKSkKKyAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgQzJGKG1Qcm9maWxlTGV2ZWwsIHByb2ZpbGUpLmVxdWFsVG8oCisgICAgICAgICAgICAgICAgUFJPRklMRV9WUDlfMAorICAgICAgICAgICAgKSwKKyAgICAgICAgICAgIEMyRihtUHJvZmlsZUxldmVsLCBsZXZlbCkuZXF1YWxUbygKKyAgICAgICAgICAgICAgICBMRVZFTF9WUDlfNF8xKSwKKyAgICAgICAgfSkKKyAgICAgICAgLndpdGhTZXR0ZXIoUHJvZmlsZUxldmVsU2V0dGVyKQorICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1SZXF1ZXN0U3luYywgQzJfUEFSQU1LRVlfUkVRVUVTVF9TWU5DX0ZSQU1FKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1SZXF1ZXN0U3luY0ZyYW1lVHVuaW5nOjpvdXRwdXQoMHUsIEMyX0ZBTFNFKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1SZXF1ZXN0U3luYywgdmFsdWUpLm9uZU9mKHsgQzJfRkFMU0UsIEMyX1RSVUUgfSkgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1SZXF1ZXN0U3luYyk+OjpOb25TdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgQml0cmF0ZVNldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1CaXRyYXRlSW5mbzo6b3V0cHV0PiAmbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIEMyUiByZXMgPSBDMlI6Ok9rKCk7CisgICAgICAgIGlmIChtZS52LnZhbHVlIDw9IDQwOTYpIHsKKyAgICAgICAgICAgIG1lLnNldCgpLnZhbHVlID0gNDA5NjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgU2l6ZVNldHRlcihib29sIG1heUJsb2NrLCBjb25zdCBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86OmlucHV0PiAmb2xkTWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEMyUDxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6aW5wdXQ+ICZtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgQzJSIHJlcyA9IEMyUjo6T2soKTsKKyAgICAgICAgaWYgKCFtZS5GKG1lLnYud2lkdGgpLnN1cHBvcnRzQXRBbGwobWUudi53aWR0aCkpIHsKKyAgICAgICAgICAgIHJlcyA9IHJlcy5wbHVzKEMyU2V0dGluZ1Jlc3VsdEJ1aWxkZXI6OkJhZFZhbHVlKG1lLkYobWUudi53aWR0aCkpKTsKKyAgICAgICAgICAgIG1lLnNldCgpLndpZHRoID0gb2xkTWUudi53aWR0aDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIW1lLkYobWUudi5oZWlnaHQpLnN1cHBvcnRzQXRBbGwobWUudi5oZWlnaHQpKSB7CisgICAgICAgICAgICByZXMgPSByZXMucGx1cyhDMlNldHRpbmdSZXN1bHRCdWlsZGVyOjpCYWRWYWx1ZShtZS5GKG1lLnYuaGVpZ2h0KSkpOworICAgICAgICAgICAgbWUuc2V0KCkuaGVpZ2h0ID0gb2xkTWUudi5oZWlnaHQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIFByb2ZpbGVMZXZlbFNldHRlcigKKyAgICAgICAgICAgIGJvb2wgbWF5QmxvY2ssCisgICAgICAgICAgICBDMlA8QzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjpvdXRwdXQ+ICZtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgaWYgKCFtZS5GKG1lLnYucHJvZmlsZSkuc3VwcG9ydHNBdEFsbChtZS52LnByb2ZpbGUpKSB7CisgICAgICAgICAgICBtZS5zZXQoKS5wcm9maWxlID0gUFJPRklMRV9WUDlfMDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIW1lLkYobWUudi5sZXZlbCkuc3VwcG9ydHNBdEFsbChtZS52LmxldmVsKSkgeworICAgICAgICAgICAgbWUuc2V0KCkubGV2ZWwgPSBMRVZFTF9WUDlfNF8xOworICAgICAgICB9CisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBMYXllcmluZ1NldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1UZW1wb3JhbExheWVyaW5nVHVuaW5nOjpvdXRwdXQ+JiBtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgQzJSIHJlcyA9IEMyUjo6T2soKTsKKyAgICAgICAgaWYgKG1lLnYubS5sYXllckNvdW50ID4gNCkgeworICAgICAgICAgICAgbWUuc2V0KCkubS5sYXllckNvdW50ID0gNDsKKyAgICAgICAgfQorICAgICAgICBtZS5zZXQoKS5tLmJMYXllckNvdW50ID0gMDsKKyAgICAgICAgLy8gZW5zdXJlIHJhdGlvcyBhcmUgbW9ub3RvbmljIGFuZCBjbGFtcGVkIGJldHdlZW4gMCBhbmQgMQorICAgICAgICBmb3IgKHNpemVfdCBpeCA9IDA7IGl4IDwgbWUudi5mbGV4Q291bnQoKTsgKytpeCkgeworICAgICAgICAgICAgbWUuc2V0KCkubS5iaXRyYXRlUmF0aW9zW2l4XSA9IGMyX2NsYW1wKAorICAgICAgICAgICAgICAgIGl4ID4gMCA/IG1lLnYubS5iaXRyYXRlUmF0aW9zW2l4IC0gMV0gOiAwLCBtZS52Lm0uYml0cmF0ZVJhdGlvc1tpeF0sIDEuKTsKKyAgICAgICAgfQorICAgICAgICBBTE9HSSgic2V0dGluZyB0ZW1wb3JhbCBsYXllcmluZyAldSArICV1IiwgbWUudi5tLmxheWVyQ291bnQsIG1lLnYubS5iTGF5ZXJDb3VudCk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgLy8gdW5zYWZlIGdldHRlcnMKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86OmlucHV0PiBnZXRTaXplX2woKSBjb25zdCB7IHJldHVybiBtU2l6ZTsgfQorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUludHJhUmVmcmVzaFR1bmluZzo6b3V0cHV0PiBnZXRJbnRyYVJlZnJlc2hfbCgpIGNvbnN0IHsgcmV0dXJuIG1JbnRyYVJlZnJlc2g7IH0KKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1GcmFtZVJhdGVJbmZvOjpvdXRwdXQ+IGdldEZyYW1lUmF0ZV9sKCkgY29uc3QgeyByZXR1cm4gbUZyYW1lUmF0ZTsgfQorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJpdHJhdGVJbmZvOjpvdXRwdXQ+IGdldEJpdHJhdGVfbCgpIGNvbnN0IHsgcmV0dXJuIG1CaXRyYXRlOyB9CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQml0cmF0ZU1vZGVUdW5pbmc6Om91dHB1dD4gZ2V0Qml0cmF0ZU1vZGVfbCgpIGNvbnN0IHsgcmV0dXJuIG1CaXRyYXRlTW9kZTsgfQorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVJlcXVlc3RTeW5jRnJhbWVUdW5pbmc6Om91dHB1dD4gZ2V0UmVxdWVzdFN5bmNfbCgpIGNvbnN0IHsgcmV0dXJuIG1SZXF1ZXN0U3luYzsgfQorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVRlbXBvcmFsTGF5ZXJpbmdUdW5pbmc6Om91dHB1dD4gZ2V0VGVtcG9yYWxMYXllcnNfbCgpIGNvbnN0IHsgcmV0dXJuIG1MYXllcmluZzsgfQorICAgIHVpbnQzMl90IGdldFN5bmNGcmFtZVBlcmlvZCgpIGNvbnN0IHsKKyAgICAgICAgaWYgKG1TeW5jRnJhbWVQZXJpb2QtPnZhbHVlIDwgMCB8fCBtU3luY0ZyYW1lUGVyaW9kLT52YWx1ZSA9PSBJTlQ2NF9NQVgpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGRvdWJsZSBwZXJpb2QgPSBtU3luY0ZyYW1lUGVyaW9kLT52YWx1ZSAvIDFlNiAqIG1GcmFtZVJhdGUtPnZhbHVlOworICAgICAgICByZXR1cm4gKHVpbnQzMl90KWMyX21heChjMl9taW4ocGVyaW9kICsgMC41LCBkb3VibGUoVUlOVDMyX01BWCkpLCAxLik7CisgICAgfQorCisgICBwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUZvcm1hdENvbmZpZzo6aW5wdXQ+IG1JbnB1dEZvcm1hdDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Gb3JtYXRDb25maWc6Om91dHB1dD4gbU91dHB1dEZvcm1hdDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0TWltZUNvbmZpZzo6aW5wdXQ+IG1JbnB1dE1lZGlhVHlwZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0TWltZUNvbmZpZzo6b3V0cHV0PiBtT3V0cHV0TWVkaWFUeXBlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVVzYWdlVHVuaW5nOjppbnB1dD4gbVVzYWdlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlZpZGVvU2l6ZVN0cmVhbVR1bmluZzo6aW5wdXQ+IG1TaXplOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUZyYW1lUmF0ZUluZm86Om91dHB1dD4gbUZyYW1lUmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1UZW1wb3JhbExheWVyaW5nVHVuaW5nOjpvdXRwdXQ+IG1MYXllcmluZzsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1JbnRyYVJlZnJlc2hUdW5pbmc6Om91dHB1dD4gbUludHJhUmVmcmVzaDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1SZXF1ZXN0U3luY0ZyYW1lVHVuaW5nOjpvdXRwdXQ+IG1SZXF1ZXN0U3luYzsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1TeW5jRnJhbWVJbnRlcnZhbFR1bmluZzo6b3V0cHV0PiBtU3luY0ZyYW1lUGVyaW9kOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJpdHJhdGVUdW5pbmc6Om91dHB1dD4gbUJpdHJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQml0cmF0ZU1vZGVUdW5pbmc6Om91dHB1dD4gbUJpdHJhdGVNb2RlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86Om91dHB1dD4gbVByb2ZpbGVMZXZlbDsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9DMl9TT0ZUX1ZQWF9FTkNfSF9fCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMiBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L05PVElDRSBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9OT1RJQ0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFlZDU4YQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9OT1RJQ0UKQEAgLTAsMCArMSwxOTAgQEAKKworICAgQ29weXJpZ2h0IChjKSAyMDA1LTIwMTMsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0CisgICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCisKKyAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgorCisgICAxLiBEZWZpbml0aW9ucy4KKworICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKKyAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgorCisgICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQorICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgorCisgICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCisgICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCisgICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAorICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCisgICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgorICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCisgICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgorCisgICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgorCisgICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKKyAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KKyAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCisKKyAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCisgICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0CisgICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCisgICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCisKKyAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCisgICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCisgICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKKyAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCisKKyAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKKyAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKKyAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKKyAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCisgICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KKyAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKKyAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCisKKyAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCisgICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCisgICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKKyAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKKyAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgorICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCisgICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50CisgICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bworICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKKyAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCisgICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKKyAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCisgICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKKworICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAorICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCisKKyAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKyAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAorICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCisgICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgorCisgICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKKyAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAorICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKKyAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCisgICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCisgICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQorICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKKyAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKKyAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0CisgICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCisgICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKKyAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KKworICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKKyAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAorICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKKyAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCisgICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgorICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCisKKyAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKKyAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKKworICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCisgICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAorICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCisgICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgorICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKKworICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCisgICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAorICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAorICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAorICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQorICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCisgICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgorICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAorICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKKyAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKKyAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCisgICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KKyAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQorICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAorICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAorICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KKworICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCisgICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCisgICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKKyAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAorICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KKworICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAorICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCisgICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCisgICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5CisgICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAorICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgorCisgICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCisgICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCisgICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKKyAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgorCisgICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKKyAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKKyAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisgICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucworICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQorICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCisgICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKKyAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KKworICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCisgICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKKyAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5CisgICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQorICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAorICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCisgICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCisgICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCisgICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAorICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgorICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgorCisgICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCisgICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAorICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKKyAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCisgICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQorICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKKyAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKKyAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQorICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgorICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCisKKyAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUworCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy94YWFjL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy94YWFjL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc5NWNjMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3hhYWMvQW5kcm9pZC5icApAQCAtMCwwICsxLDExIEBACitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X3hhYWNkZWMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9hbGwtZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbIkMyU29mdFhhYWNEZWMuY3BwIl0sCisKKyAgICBzdGF0aWNfbGliczogWyJsaWJ4YWFjZGVjIl0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy94YWFjL0MyU29mdFhhYWNEZWMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMveGFhYy9DMlNvZnRYYWFjRGVjLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzBlNzBiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMveGFhYy9DMlNvZnRYYWFjRGVjLmNwcApAQCAtMCwwICsxLDE1ODMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyU29mdFhhYWNEZWMiCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaGV4ZHVtcC5oPgorCisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxTaW1wbGVDMkludGVyZmFjZS5oPgorCisjaW5jbHVkZSAiQzJTb2Z0WGFhY0RlYy5oIgorCisjZGVmaW5lIERSQ19ERUZBVUxUX01PQklMRV9SRUZfTEVWRUwgLTE2LjAgICAvKiA2NCotMC4yNWRCID0gLTE2IGRCIGJlbG93IGZ1bGwgc2NhbGUgZm9yIG1vYmlsZSBjb25mICovCisjZGVmaW5lIERSQ19ERUZBVUxUX01PQklMRV9EUkNfQ1VUICAgMS4wICAvKiBtYXhpbXVtIGNvbXByZXNzaW9uIG9mIGR5bmFtaWMgcmFuZ2UgZm9yIG1vYmlsZSBjb25mICovCisjZGVmaW5lIERSQ19ERUZBVUxUX01PQklMRV9EUkNfQk9PU1QgMS4wIC8qIG1heGltdW0gY29tcHJlc3Npb24gb2YgZHluYW1pYyByYW5nZSBmb3IgbW9iaWxlIGNvbmYgKi8KKyNkZWZpbmUgRFJDX0RFRkFVTFRfTU9CSUxFX0RSQ19IRUFWWSBDMkNvbmZpZzo6RFJDX0NPTVBSRVNTSU9OX0hFQVZZICAgLyogc3dpdGNoIGZvciBoZWF2eSBjb21wcmVzc2lvbiBmb3IgbW9iaWxlIGNvbmYgKi8KKyNkZWZpbmUgRFJDX0RFRkFVTFRfTU9CSUxFX0RSQ19FRkZFQ1QgMyAgLyogTVBFRy1EIERSQyBlZmZlY3QgdHlwZTsgMyA9PiBMaW1pdGVkIHBsYXliYWNrIHJhbmdlICovCisjZGVmaW5lIERSQ19ERUZBVUxUX01PQklMRV9FTkNfTEVWRUwgKDAuMjUpIC8qIGVuY29kZXIgdGFyZ2V0IGxldmVsOyAtMSA9PiB0aGUgdmFsdWUgaXMgdW5rbm93biwgb3RoZXJ3aXNlIGRCIHN0ZXAgdmFsdWUgKGUuZy4gNjQgZm9yIC0xNiBkQikgKi8KKyNkZWZpbmUgTUFYX0NIQU5ORUxfQ09VTlQgICAgICAgICAgICA4ICAvKiBtYXhpbXVtIG51bWJlciBvZiBhdWRpbyBjaGFubmVscyB0aGF0IGNhbiBiZSBkZWNvZGVkICovCisvLyBuYW1lcyBvZiBwcm9wZXJ0aWVzIHRoYXQgY2FuIGJlIHVzZWQgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgRFJDIHNldHRpbmdzCisjZGVmaW5lIFBST1BfRFJDX09WRVJSSURFX1JFRl9MRVZFTCAgImFhY19kcmNfcmVmZXJlbmNlX2xldmVsIgorI2RlZmluZSBQUk9QX0RSQ19PVkVSUklERV9DVVQgICAgICAgICJhYWNfZHJjX2N1dCIKKyNkZWZpbmUgUFJPUF9EUkNfT1ZFUlJJREVfQk9PU1QgICAgICAiYWFjX2RyY19ib29zdCIKKyNkZWZpbmUgUFJPUF9EUkNfT1ZFUlJJREVfSEVBVlkgICAgICAiYWFjX2RyY19oZWF2eSIKKyNkZWZpbmUgUFJPUF9EUkNfT1ZFUlJJREVfRU5DX0xFVkVMICAiYWFjX2RyY19lbmNfdGFyZ2V0X2xldmVsIgorI2RlZmluZSBQUk9QX0RSQ19PVkVSUklERV9FRkZFQ1RfVFlQRSAicm8uYWFjX2RyY19lZmZlY3RfdHlwZSIKKworI2RlZmluZSBSRVRVUk5fSUZfRkFUQUwocmV0dmFsLCBzdHIpICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKHJldHZhbCAmIElBX0ZBVEFMX0VSUk9SKSB7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQUxPR0UoIkVycm9yIGluICVzOiBSZXR1cm5lZDogJWQiLCBzdHIsIHJldHZhbCk7ICAgXAorICAgICAgICByZXR1cm4gcmV0dmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSBlbHNlIGlmIChyZXR2YWwgIT0gSUFfTk9fRVJST1IpIHsgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQUxPR1coIldhcm5pbmcgaW4gJXM6IFJldHVybmVkOiAlZCIsIHN0ciwgcmV0dmFsKTsgXAorICAgIH0KKworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NvbnN0ZXhwciBjaGFyIENPTVBPTkVOVF9OQU1FW10gPSAiYzIuYW5kcm9pZC54YWFjLmRlY29kZXIiOworCitjbGFzcyBDMlNvZnRYYWFjRGVjOjpJbnRmSW1wbCA6IHB1YmxpYyBDMkludGVyZmFjZUhlbHBlciB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgSW50ZkltcGwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiAmaGVscGVyKQorICAgICAgICA6IEMySW50ZXJmYWNlSGVscGVyKGhlbHBlcikgeworCisgICAgICAgIHNldERlcml2ZWRJbnN0YW5jZSh0aGlzKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0Rm9ybWF0LCBDMl9OQU1FX0lOUFVUX1NUUkVBTV9GT1JNQVRfU0VUVElORykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtRm9ybWF0Q29uZmlnOjppbnB1dCgwdSwgQzJGb3JtYXRDb21wcmVzc2VkKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1PdXRwdXRGb3JtYXQsIEMyX05BTUVfT1VUUFVUX1NUUkVBTV9GT1JNQVRfU0VUVElORykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtRm9ybWF0Q29uZmlnOjpvdXRwdXQoMHUsIEMyRm9ybWF0QXVkaW8pKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0TWVkaWFUeXBlLCBDMl9OQU1FX0lOUFVUX1BPUlRfTUlNRV9TRVRUSU5HKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShBbGxvY1NoYXJlZFN0cmluZzxDMlBvcnRNaW1lQ29uZmlnOjppbnB1dD4oCisgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obU91dHB1dE1lZGlhVHlwZSwgQzJfTkFNRV9PVVRQVVRfUE9SVF9NSU1FX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKEFsbG9jU2hhcmVkU3RyaW5nPEMyUG9ydE1pbWVDb25maWc6Om91dHB1dD4oCisgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19SQVcpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVNhbXBsZVJhdGUsIEMyX05BTUVfU1RSRUFNX1NBTVBMRV9SQVRFX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjpvdXRwdXQoMHUsIDQ0MTAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1TYW1wbGVSYXRlLCB2YWx1ZSkub25lT2YoeworICAgICAgICAgICAgICAgICAgICA3MzUwLCA4MDAwLCAxMTAyNSwgMTIwMDAsIDE2MDAwLCAyMjA1MCwgMjQwMDAsIDMyMDAwLCA0NDEwMCwgNDgwMDAKKyAgICAgICAgICAgICAgICB9KX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoKFNldHRlcjxkZWNsdHlwZSgqbVNhbXBsZVJhdGUpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1DaGFubmVsQ291bnQsIEMyX05BTUVfU1RSRUFNX0NIQU5ORUxfQ09VTlRfU0VUVElORykKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6b3V0cHV0KDB1LCAxKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1DaGFubmVsQ291bnQsIHZhbHVlKS5pblJhbmdlKDEsIDgpfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1DaGFubmVsQ291bnQpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUJpdHJhdGUsIEMyX05BTUVfU1RSRUFNX0JJVFJBVEVfU0VUVElORykKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyQml0cmF0ZVR1bmluZzo6aW5wdXQoMHUsIDY0MDAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1CaXRyYXRlLCB2YWx1ZSkuaW5SYW5nZSg4MDAwLCA5NjAwMDApfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1CaXRyYXRlKT46Ok5vblN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dE1heEJ1ZlNpemUsIEMyX1BBUkFNS0VZX0lOUFVUX01BWF9CVUZGRVJfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0KDB1LCA4MTkyKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1BYWNGb3JtYXQsIEMyX05BTUVfU1RSRUFNX0FBQ19GT1JNQVRfU0VUVElORykKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQWFjRm9ybWF0SW5mbzo6aW5wdXQoMHUsIEMyQWFjU3RyZWFtRm9ybWF0UmF3KSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1BYWNGb3JtYXQsIHZhbHVlKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgIEMyQWFjU3RyZWFtRm9ybWF0UmF3LCBDMkFhY1N0cmVhbUZvcm1hdEFkdHMKKyAgICAgICAgICAgICAgICB9KX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptQWFjRm9ybWF0KT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1Qcm9maWxlTGV2ZWwsIEMyX1BBUkFNS0VZX1BST0ZJTEVfTEVWRUwpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86OmlucHV0KDB1LAorICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfQUFDX0xDLCBDMkNvbmZpZzo6TEVWRUxfVU5VU0VEKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtUHJvZmlsZUxldmVsLCBwcm9maWxlKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfQUFDX0xDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19IRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9BQUNfSEVfUFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfQUFDX0xELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19FTEQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfQUFDX1hIRX0pLAorICAgICAgICAgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgbGV2ZWwpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfVU5VU0VECisgICAgICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihQcm9maWxlTGV2ZWxTZXR0ZXIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtRHJjQ29tcHJlc3NNb2RlLCBDMl9QQVJBTUtFWV9EUkNfQ09NUFJFU1NJT05fTU9ERSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtRHJjQ29tcHJlc3Npb25Nb2RlVHVuaW5nOjppbnB1dCgwdSwgQzJDb25maWc6OkRSQ19DT01QUkVTU0lPTl9IRUFWWSkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobURyY0NvbXByZXNzTW9kZSwgdmFsdWUpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6RFJDX0NPTVBSRVNTSU9OX09ETV9ERUZBVUxULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpEUkNfQ09NUFJFU1NJT05fTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6RFJDX0NPTVBSRVNTSU9OX0xJR0hULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpEUkNfQ09NUFJFU1NJT05fSEVBVll9KQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptRHJjQ29tcHJlc3NNb2RlKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1EcmNUYXJnZXRSZWZMZXZlbCwgQzJfUEFSQU1LRVlfRFJDX1RBUkdFVF9SRUZFUkVOQ0VfTEVWRUwpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbURyY1RhcmdldFJlZmVyZW5jZUxldmVsVHVuaW5nOjppbnB1dCgwdSwgRFJDX0RFRkFVTFRfTU9CSUxFX1JFRl9MRVZFTCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtRHJjVGFyZ2V0UmVmTGV2ZWwsIHZhbHVlKS5pblJhbmdlKC0zMS43NSwgMC4yNSl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbURyY1RhcmdldFJlZkxldmVsKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1EcmNFbmNUYXJnZXRMZXZlbCwgQzJfUEFSQU1LRVlfRFJDX0VOQ09ERURfVEFSR0VUX0xFVkVMKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1EcmNFbmNvZGVkVGFyZ2V0TGV2ZWxUdW5pbmc6OmlucHV0KDB1LCBEUkNfREVGQVVMVF9NT0JJTEVfRU5DX0xFVkVMKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1EcmNFbmNUYXJnZXRMZXZlbCwgdmFsdWUpLmluUmFuZ2UoLTMxLjc1LCAwLjI1KX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptRHJjRW5jVGFyZ2V0TGV2ZWwpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obURyY0Jvb3N0RmFjdG9yLCBDMl9QQVJBTUtFWV9EUkNfQk9PU1RfRkFDVE9SKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1EcmNCb29zdEZhY3RvclR1bmluZzo6aW5wdXQoMHUsIERSQ19ERUZBVUxUX01PQklMRV9EUkNfQk9PU1QpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobURyY0Jvb3N0RmFjdG9yLCB2YWx1ZSkuaW5SYW5nZSgwLCAxLil9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbURyY0Jvb3N0RmFjdG9yKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1EcmNBdHRlbnVhdGlvbkZhY3RvciwgQzJfUEFSQU1LRVlfRFJDX0FUVEVOVUFUSU9OX0ZBQ1RPUikKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtRHJjQXR0ZW51YXRpb25GYWN0b3JUdW5pbmc6OmlucHV0KDB1LCBEUkNfREVGQVVMVF9NT0JJTEVfRFJDX0NVVCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtRHJjQXR0ZW51YXRpb25GYWN0b3IsIHZhbHVlKS5pblJhbmdlKDAsIDEuKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptRHJjQXR0ZW51YXRpb25GYWN0b3IpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obURyY0VmZmVjdFR5cGUsIEMyX1BBUkFNS0VZX0RSQ19FRkZFQ1RfVFlQRSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtRHJjRWZmZWN0VHlwZVR1bmluZzo6aW5wdXQoMHUsIEMyQ29uZmlnOjpEUkNfRUZGRUNUX0xJTUlURURfUExBWUJBQ0tfUkFOR0UpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1EcmNFZmZlY3RUeXBlLCB2YWx1ZSkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpEUkNfRUZGRUNUX09ETV9ERUZBVUxULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpEUkNfRUZGRUNUX09GRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6RFJDX0VGRkVDVF9OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpEUkNfRUZGRUNUX0xBVEVfTklHSFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkRSQ19FRkZFQ1RfTk9JU1lfRU5WSVJPTk1FTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkRSQ19FRkZFQ1RfTElNSVRFRF9QTEFZQkFDS19SQU5HRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6RFJDX0VGRkVDVF9MT1dfUExBWUJBQ0tfTEVWRUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkRSQ19FRkZFQ1RfRElBTE9HX0VOSEFOQ0VNRU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpEUkNfRUZGRUNUX0dFTkVSQUxfQ09NUFJFU1NJT059KQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptRHJjRWZmZWN0VHlwZSk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgIH0KKworICAgIGJvb2wgaXNBZHRzKCkgY29uc3QgeyByZXR1cm4gbUFhY0Zvcm1hdC0+dmFsdWUgPT0gQzJBYWNTdHJlYW1Gb3JtYXRBZHRzOyB9CisgICAgdWludDMyX3QgZ2V0Qml0cmF0ZSgpIGNvbnN0IHsgcmV0dXJuIG1CaXRyYXRlLT52YWx1ZTsgfQorICAgIHN0YXRpYyBDMlIgUHJvZmlsZUxldmVsU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86OmlucHV0PiAmbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgICh2b2lkKW1lOyAgLy8gVE9ETzogdmFsaWRhdGUKKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisgICAgaW50MzJfdCBnZXREcmNDb21wcmVzc01vZGUoKSBjb25zdCB7IHJldHVybiBtRHJjQ29tcHJlc3NNb2RlLT52YWx1ZSA9PSBDMkNvbmZpZzo6RFJDX0NPTVBSRVNTSU9OX0hFQVZZID8gMSA6IDA7IH0KKyAgICBpbnQzMl90IGdldERyY1RhcmdldFJlZkxldmVsKCkgY29uc3QgeyByZXR1cm4gKG1EcmNUYXJnZXRSZWZMZXZlbC0+dmFsdWUgPD0gMCA/IC1tRHJjVGFyZ2V0UmVmTGV2ZWwtPnZhbHVlICogNC4gKyAwLjUgOiAtMSk7IH0KKyAgICBpbnQzMl90IGdldERyY0VuY1RhcmdldExldmVsKCkgY29uc3QgeyByZXR1cm4gKG1EcmNFbmNUYXJnZXRMZXZlbC0+dmFsdWUgPD0gMCA/IC1tRHJjRW5jVGFyZ2V0TGV2ZWwtPnZhbHVlICogNC4gKyAwLjUgOiAtMSk7IH0KKyAgICBpbnQzMl90IGdldERyY0Jvb3N0RmFjdG9yKCkgY29uc3QgeyByZXR1cm4gbURyY0Jvb3N0RmFjdG9yLT52YWx1ZSAqIDEyNy4gKyAwLjU7IH0KKyAgICBpbnQzMl90IGdldERyY0F0dGVudWF0aW9uRmFjdG9yKCkgY29uc3QgeyByZXR1cm4gbURyY0F0dGVudWF0aW9uRmFjdG9yLT52YWx1ZSAqIDEyNy4gKyAwLjU7IH0KKyAgICBpbnQzMl90IGdldERyY0VmZmVjdFR5cGUoKSBjb25zdCB7IHJldHVybiBtRHJjRWZmZWN0VHlwZS0+dmFsdWU7IH0KKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Gb3JtYXRDb25maWc6OmlucHV0PiBtSW5wdXRGb3JtYXQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRm9ybWF0Q29uZmlnOjpvdXRwdXQ+IG1PdXRwdXRGb3JtYXQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydE1pbWVDb25maWc6OmlucHV0PiBtSW5wdXRNZWRpYVR5cGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydE1pbWVDb25maWc6Om91dHB1dD4gbU91dHB1dE1lZGlhVHlwZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0PiBtU2FtcGxlUmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjpvdXRwdXQ+IG1DaGFubmVsQ291bnQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQml0cmF0ZVR1bmluZzo6aW5wdXQ+IG1CaXRyYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dD4gbUlucHV0TWF4QnVmU2l6ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1BYWNGb3JtYXRJbmZvOjppbnB1dD4gbUFhY0Zvcm1hdDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjppbnB1dD4gbVByb2ZpbGVMZXZlbDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1EcmNDb21wcmVzc2lvbk1vZGVUdW5pbmc6OmlucHV0PiBtRHJjQ29tcHJlc3NNb2RlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbURyY1RhcmdldFJlZmVyZW5jZUxldmVsVHVuaW5nOjppbnB1dD4gbURyY1RhcmdldFJlZkxldmVsOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbURyY0VuY29kZWRUYXJnZXRMZXZlbFR1bmluZzo6aW5wdXQ+IG1EcmNFbmNUYXJnZXRMZXZlbDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1EcmNCb29zdEZhY3RvclR1bmluZzo6aW5wdXQ+IG1EcmNCb29zdEZhY3RvcjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1EcmNBdHRlbnVhdGlvbkZhY3RvclR1bmluZzo6aW5wdXQ+IG1EcmNBdHRlbnVhdGlvbkZhY3RvcjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1EcmNFZmZlY3RUeXBlVHVuaW5nOjppbnB1dD4gbURyY0VmZmVjdFR5cGU7CisgICAgLy8gVE9ETyBBZGQgOiBDMlN0cmVhbUFhY1Nick1vZGVUdW5pbmcKK307CisKK0MyU29mdFhhYWNEZWM6OkMyU29mdFhhYWNEZWMoCisgICAgICAgIGNvbnN0IGNoYXIqIG5hbWUsCisgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiAmaW50ZkltcGwpCisgICAgOiBTaW1wbGVDMkNvbXBvbmVudChzdGQ6Om1ha2Vfc2hhcmVkPFNpbXBsZUludGVyZmFjZTxJbnRmSW1wbD4+KG5hbWUsIGlkLCBpbnRmSW1wbCkpLAorICAgICAgICBtSW50ZihpbnRmSW1wbCksCisgICAgICAgIG1YaGVhYWNDb2RlY0hhbmRsZShudWxscHRyKSwKKyAgICAgICAgbU1wZWdERHJjSGFuZGxlKG51bGxwdHIpLAorICAgICAgICBtT3V0cHV0RHJhaW5CdWZmZXIobnVsbHB0cikgeworfQorCitDMlNvZnRYYWFjRGVjOjp+QzJTb2Z0WGFhY0RlYygpIHsKKyAgICBvblJlbGVhc2UoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0WGFhY0RlYzo6b25Jbml0KCkgeworICAgIG1PdXRwdXRGcmFtZUxlbmd0aCA9IDEwMjQ7CisgICAgbUlucHV0QnVmZmVyID0gbnVsbHB0cjsKKyAgICBtT3V0cHV0QnVmZmVyID0gbnVsbHB0cjsKKyAgICBtU2FtcEZyZXEgPSAwOworICAgIG1OdW1DaGFubmVscyA9IDA7CisgICAgbVBjbVdkU3ogPSAwOworICAgIG1DaGFubmVsTWFzayA9IDA7CisgICAgbU51bU91dEJ5dGVzID0gMDsKKyAgICBtQ3VyRnJhbWVJbmRleCA9IDA7CisgICAgbUN1clRpbWVzdGFtcCA9IDA7CisgICAgbUlzQ29kZWNJbml0aWFsaXplZCA9IGZhbHNlOworICAgIG1Jc0NvZGVjQ29uZmlnRmx1c2hSZXF1aXJlZCA9IGZhbHNlOworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICBtT3V0cHV0RHJhaW5CdWZmZXJXcml0ZVBvcyA9IDA7CisgICAgbURSQ0ZsYWcgPSAwOworICAgIG1NcGVnRERSQ1ByZXNlbnQgPSAwOworICAgIG1NZW1vcnlWZWMuY2xlYXIoKTsKKyAgICBtRHJjTWVtb3J5VmVjLmNsZWFyKCk7CisKKyAgICBJQV9FUlJPUkNPREUgZXJyID0gaW5pdERlY29kZXIoKTsKKyAgICByZXR1cm4gZXJyID09IElBX05PX0VSUk9SID8gQzJfT0sgOiBDMl9DT1JSVVBURUQ7CisKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0WGFhY0RlYzo6b25TdG9wKCkgeworICAgIG1PdXRwdXRGcmFtZUxlbmd0aCA9IDEwMjQ7CisgICAgZHJhaW5EZWNvZGVyKCk7CisgICAgLy8gcmVzZXQgdGhlICJjb25maWd1cmVkIiBzdGF0ZQorICAgIG1TYW1wRnJlcSA9IDA7CisgICAgbU51bUNoYW5uZWxzID0gMDsKKyAgICBtUGNtV2RTeiA9IDA7CisgICAgbUNoYW5uZWxNYXNrID0gMDsKKyAgICBtTnVtT3V0Qnl0ZXMgPSAwOworICAgIG1DdXJGcmFtZUluZGV4ID0gMDsKKyAgICBtQ3VyVGltZXN0YW1wID0gMDsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisgICAgbU91dHB1dERyYWluQnVmZmVyV3JpdGVQb3MgPSAwOworICAgIG1EUkNGbGFnID0gMDsKKyAgICBtTXBlZ0REUkNQcmVzZW50ID0gMDsKKworICAgIHJldHVybiBDMl9PSzsKK30KKwordm9pZCBDMlNvZnRYYWFjRGVjOjpvblJlc2V0KCkgeworICAgICh2b2lkKW9uU3RvcCgpOworfQorCit2b2lkIEMyU29mdFhhYWNEZWM6Om9uUmVsZWFzZSgpIHsKKyAgICBJQV9FUlJPUkNPREUgZXJyQ29kZSA9IGRlSW5pdFhBQUNEZWNvZGVyKCk7CisgICAgaWYgKElBX05PX0VSUk9SICE9IGVyckNvZGUpIEFMT0dFKCJkZUluaXRYQUFDRGVjb2RlcigpIGZhaWxlZCAlZCIsIGVyckNvZGUpOworCisgICAgZXJyQ29kZSA9IGRlSW5pdE1QRUdERERyYygpOworICAgIGlmIChJQV9OT19FUlJPUiAhPSBlcnJDb2RlKSBBTE9HRSgiZGVJbml0TVBFR0RERHJjKCkgZmFpbGVkICVkIiwgZXJyQ29kZSk7CisKKyAgICBpZiAobU91dHB1dERyYWluQnVmZmVyKSB7CisgICAgICAgIGRlbGV0ZVtdIG1PdXRwdXREcmFpbkJ1ZmZlcjsKKyAgICAgICAgbU91dHB1dERyYWluQnVmZmVyID0gbnVsbHB0cjsKKyAgICB9Cit9CisKK0lBX0VSUk9SQ09ERSBDMlNvZnRYYWFjRGVjOjppbml0RGVjb2RlcigpIHsKKyAgICBBTE9HVigiaW5pdERlY29kZXIoKSIpOworICAgIElBX0VSUk9SQ09ERSBlcnJfY29kZSA9IElBX05PX0VSUk9SOworCisgICAgZXJyX2NvZGUgPSBpbml0WEFBQ0RlY29kZXIoKTsKKyAgICBpZiAoZXJyX2NvZGUgIT0gSUFfTk9fRVJST1IpIHsKKyAgICAgICAgQUxPR0UoImluaXRYQUFDRGVjb2RlciBGYWlsZWQiKTsKKyAgICAgICAgLyogQ2FsbCBkZUluaXQgdG8gZnJlZSBhbnkgYWxsb2NhdGVkIG1lbW9yeSAqLworICAgICAgICBkZUluaXRYQUFDRGVjb2RlcigpOworICAgICAgICByZXR1cm4gSUFfRkFUQUxfRVJST1I7CisgICAgfQorCisgICAgaWYgKCFtT3V0cHV0RHJhaW5CdWZmZXIpIHsKKyAgICAgICAgbU91dHB1dERyYWluQnVmZmVyID0gbmV3IChzdGQ6Om5vdGhyb3cpIGNoYXJba091dHB1dERyYWluQnVmZmVyU2l6ZV07CisgICAgICAgIGlmICghbU91dHB1dERyYWluQnVmZmVyKSByZXR1cm4gSUFfRkFUQUxfRVJST1I7CisgICAgfQorCisgICAgZXJyX2NvZGUgPSBpbml0WEFBQ0RyYygpOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgICJpbml0WEFBQ0RyYyIpOworCisKKyAgICByZXR1cm4gSUFfTk9fRVJST1I7Cit9CisKK3N0YXRpYyB2b2lkIGZpbGxFbXB0eVdvcmsoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmspIHsKKyAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgaWYgKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgeworICAgICAgICBmbGFncyB8PSBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNOworICAgICAgICBBTE9HVigic2lnbmFsbGluZyBlb3MiKTsKKyAgICB9CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KWZsYWdzOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7Cit9CisKK3ZvaWQgQzJTb2Z0WGFhY0RlYzo6ZmluaXNoV29yayhjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+JiBwb29sKSB7CisgICAgQUxPR1YoIm1DdXJGcmFtZUluZGV4ID0gJSIgUFJJdTY0LCBtQ3VyRnJhbWVJbmRleCk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gYmxvY2s7CisgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSA9IHtDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFfTsKKyAgICAvLyBUT0RPOiBlcnJvciBoYW5kbGluZywgcHJvcGVyIHVzYWdlLCBldGMuCisgICAgYzJfc3RhdHVzX3QgZXJyID0KKyAgICAgICAgcG9vbC0+ZmV0Y2hMaW5lYXJCbG9jayhtT3V0cHV0RHJhaW5CdWZmZXJXcml0ZVBvcywgdXNhZ2UsICZibG9jayk7CisgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICBBTE9HRSgiZmV0Y2hMaW5lYXJCbG9jayBmYWlsZWQgOiBlcnIgPSAlZCIsIGVycik7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX05PX01FTU9SWTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBDMldyaXRlVmlldyB3VmlldyA9IGJsb2NrLT5tYXAoKS5nZXQoKTsKKyAgICBpbnQxNl90KiBvdXRCdWZmZXIgPSByZWludGVycHJldF9jYXN0PGludDE2X3QqPih3Vmlldy5kYXRhKCkpOworICAgIG1lbWNweShvdXRCdWZmZXIsIG1PdXRwdXREcmFpbkJ1ZmZlciwgbU91dHB1dERyYWluQnVmZmVyV3JpdGVQb3MpOworICAgIG1PdXRwdXREcmFpbkJ1ZmZlcldyaXRlUG9zID0gMDsKKworICAgIGF1dG8gZmlsbFdvcmsgPSBbYnVmZmVyID0gY3JlYXRlTGluZWFyQnVmZmVyKGJsb2NrKV0oCisgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrKSB7CisgICAgICAgIHVpbnQzMl90IGZsYWdzID0gMDsKKyAgICAgICAgaWYgKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgeworICAgICAgICAgICAgZmxhZ3MgfD0gQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgICAgIEFMT0dWKCJzaWduYWxsaW5nIGVvcyIpOworICAgICAgICB9CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdClmbGFnczsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMucHVzaF9iYWNrKGJ1ZmZlcik7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICB9OworICAgIGlmICh3b3JrICYmIHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleCA9PSBjMl9jbnRyNjRfdChtQ3VyRnJhbWVJbmRleCkpIHsKKyAgICAgICAgZmlsbFdvcmsod29yayk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZmluaXNoKG1DdXJGcmFtZUluZGV4LCBmaWxsV29yayk7CisgICAgfQorCisgICAgQUxPR1YoIm91dCB0aW1lc3RhbXAgJSIgUFJJdTY0ICIgLyAldSIsIG1DdXJUaW1lc3RhbXAsIGJsb2NrLT5jYXBhY2l0eSgpKTsKK30KKwordm9pZCBDMlNvZnRYYWFjRGVjOjpwcm9jZXNzKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4mIHBvb2wpIHsKKyAgICAvLyBJbml0aWFsaXplIG91dHB1dCB3b3JrCisgICAgd29yay0+cmVzdWx0ID0gQzJfT0s7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisKKyAgICBpZiAobVNpZ25hbGxlZEVycm9yIHx8IG1TaWduYWxsZWRPdXRwdXRFb3MpIHsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQkFEX1ZBTFVFOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHVpbnQ4X3QqIGluQnVmZmVyID0gbnVsbHB0cjsKKyAgICB1aW50MzJfdCBpbkJ1ZmZlckxlbmd0aCA9IDA7CisgICAgQzJSZWFkVmlldyB2aWV3ID0gbUR1bW15UmVhZFZpZXc7CisgICAgc2l6ZV90IG9mZnNldCA9IDB1OworICAgIHNpemVfdCBzaXplID0gMHU7CisgICAgaWYgKCF3b3JrLT5pbnB1dC5idWZmZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgdmlldyA9IHdvcmstPmlucHV0LmJ1ZmZlcnNbMF0tPmRhdGEoKS5saW5lYXJCbG9ja3MoKS5mcm9udCgpLm1hcCgpLmdldCgpOworICAgICAgICBzaXplID0gdmlldy5jYXBhY2l0eSgpOworICAgIH0KKyAgICBpZiAoc2l6ZSAmJiB2aWV3LmVycm9yKCkpIHsKKyAgICAgICAgQUxPR0UoInJlYWQgdmlldyBtYXAgZmFpbGVkICVkIiwgdmlldy5lcnJvcigpKTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gdmlldy5lcnJvcigpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYm9vbCBlb3MgPSAod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSAhPSAwOworICAgIGJvb2wgY29kZWNDb25maWcgPQorICAgICAgICAod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19DT0RFQ19DT05GSUcpICE9IDA7CisgICAgaWYgKGNvZGVjQ29uZmlnKSB7CisgICAgICAgIGlmIChzaXplID09IDB1KSB7CisgICAgICAgICAgICBBTE9HRSgiZW1wdHkgY29kZWMgY29uZmlnIik7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIC8vIGNvbnN0X2Nhc3QgYmVjYXVzZSBvZiBsaWJBQUNkZWMgbWV0aG9kIHNpZ25hdHVyZS4KKyAgICAgICAgaW5CdWZmZXIgPSBjb25zdF9jYXN0PHVpbnQ4X3QqPih2aWV3LmRhdGEoKSArIG9mZnNldCk7CisgICAgICAgIGluQnVmZmVyTGVuZ3RoID0gc2l6ZTsKKworICAgICAgICAvKiBHQSBoZWFkZXIgY29uZmlndXJhdGlvbiBzZW50IHRvIERlY29kZXIhICovCisgICAgICAgIElBX0VSUk9SQ09ERSBlcnJfY29kZSA9IGNvbmZpZ1hBQUNEZWNvZGVyKGluQnVmZmVyLCBpbkJ1ZmZlckxlbmd0aCk7CisgICAgICAgIGlmIChJQV9OT19FUlJPUiAhPSBlcnJfY29kZSkgeworICAgICAgICAgICAgQUxPR0UoImNvbmZpZ1hBQUNEZWNvZGVyIGVycl9jb2RlID0gJWQiLCBlcnJfY29kZSk7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtQ3VyRnJhbWVJbmRleCA9IHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpOworICAgIG1DdXJUaW1lc3RhbXAgPSB3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrdSgpOworICAgIG1PdXRwdXREcmFpbkJ1ZmZlcldyaXRlUG9zID0gMDsKKyAgICBjaGFyKiB0ZW1wT3V0cHV0RHJhaW5CdWZmZXIgPSBtT3V0cHV0RHJhaW5CdWZmZXI7CisgICAgd2hpbGUgKHNpemUgPiAwdSkgeworICAgICAgICBpZiAoKGtPdXRwdXREcmFpbkJ1ZmZlclNpemUgKiBzaXplb2YoaW50MTZfdCkgLQorICAgICAgICAgICAgIG1PdXRwdXREcmFpbkJ1ZmZlcldyaXRlUG9zKSA8CisgICAgICAgICAgICAobU91dHB1dEZyYW1lTGVuZ3RoICogc2l6ZW9mKGludDE2X3QpICogbU51bUNoYW5uZWxzKSkgeworICAgICAgICAgICAgQUxPR1YoInNraXBwaW5nIGRlY29kZTogbm90IGVub3VnaCBzcGFjZSBsZWZ0IGluIERyYWluQnVmZmVyIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIEFMT0dWKCJpbkF0dHJpYnV0ZSBzaXplID0gJXp1Iiwgc2l6ZSk7CisgICAgICAgIGlmIChtSW50Zi0+aXNBZHRzKCkpIHsKKyAgICAgICAgICAgIEFMT0dWKCJBRFRTIik7CisgICAgICAgICAgICBzaXplX3QgYWR0c0hlYWRlclNpemUgPSAwOworICAgICAgICAgICAgLy8gc2tpcCAzMCBiaXRzLCBhYWNfZnJhbWVfbGVuZ3RoIGZvbGxvd3MuCisgICAgICAgICAgICAvLyBzc3Nzc3NzcyBzc3NzaWlpcCBwcGZmZmZQYyBjY29oQ0NsbCBsbGxsbGxsbCBsbGw/Pz8/PworCisgICAgICAgICAgICBjb25zdCB1aW50OF90KiBhZHRzSGVhZGVyID0gdmlldy5kYXRhKCkgKyBvZmZzZXQ7CisgICAgICAgICAgICBib29sIHNpZ25hbEVycm9yID0gZmFsc2U7CisgICAgICAgICAgICBpZiAoc2l6ZSA8IDcpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiQXVkaW8gZGF0YSB0b28gc2hvcnQgdG8gY29udGFpbiBldmVuIHRoZSBBRFRTIGhlYWRlci4gIgorICAgICAgICAgICAgICAgICAgICAgICJHb3QgJXp1IGJ5dGVzLiIsIHNpemUpOworICAgICAgICAgICAgICAgIGhleGR1bXAoYWR0c0hlYWRlciwgc2l6ZSk7CisgICAgICAgICAgICAgICAgc2lnbmFsRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBib29sIHByb3RlY3Rpb25BYnNlbnQgPSAoYWR0c0hlYWRlclsxXSAmIDEpOworICAgICAgICAgICAgICAgIHVuc2lnbmVkIGFhY19mcmFtZV9sZW5ndGggPSAoKGFkdHNIZWFkZXJbM10gJiAzKSA8PCAxMSkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWR0c0hlYWRlcls0XSA8PCAzKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhZHRzSGVhZGVyWzVdID4+IDUpOworCisgICAgICAgICAgICAgICAgaWYgKHNpemUgPCBhYWNfZnJhbWVfbGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJOb3QgZW5vdWdoIGF1ZGlvIGRhdGEgZm9yIHRoZSBjb21wbGV0ZSBmcmFtZS4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiR290ICV6dSBieXRlcywgZnJhbWUgc2l6ZSBhY2NvcmRpbmcgdG8gdGhlIEFEVFMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiaGVhZGVyIGlzICV1IGJ5dGVzLiIsIHNpemUsIGFhY19mcmFtZV9sZW5ndGgpOworICAgICAgICAgICAgICAgICAgICBoZXhkdW1wKGFkdHNIZWFkZXIsIHNpemUpOworICAgICAgICAgICAgICAgICAgICBzaWduYWxFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYWR0c0hlYWRlclNpemUgPSAocHJvdGVjdGlvbkFic2VudCA/IDcgOiA5KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFhY19mcmFtZV9sZW5ndGggPCBhZHRzSGVhZGVyU2l6ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmFsRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc3RfY2FzdCBiZWNhdXNlIG9mIGxpYkFBQ2RlYyBtZXRob2Qgc2lnbmF0dXJlLgorICAgICAgICAgICAgICAgICAgICAgICAgaW5CdWZmZXIgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8dWludDhfdCo+KGFkdHNIZWFkZXIgKyBhZHRzSGVhZGVyU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbkJ1ZmZlckxlbmd0aCA9IGFhY19mcmFtZV9sZW5ndGggLSBhZHRzSGVhZGVyU2l6ZTsKKworICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IGFkdHNIZWFkZXJTaXplOworICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSAtPSBhZHRzSGVhZGVyU2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHNpZ25hbEVycm9yKSB7CisgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR1YoIk5vbiBBRFRTIik7CisgICAgICAgICAgICAvLyBjb25zdF9jYXN0IGJlY2F1c2Ugb2YgbGliQUFDZGVjIG1ldGhvZCBzaWduYXR1cmUuCisgICAgICAgICAgICBpbkJ1ZmZlciA9IGNvbnN0X2Nhc3Q8dWludDhfdCo+KHZpZXcuZGF0YSgpICsgb2Zmc2V0KTsKKyAgICAgICAgICAgIGluQnVmZmVyTGVuZ3RoID0gc2l6ZTsKKyAgICAgICAgfQorCisgICAgICAgIHNpZ25lZCBpbnQgcHJldlNhbXBsZVJhdGUgPSBtU2FtcEZyZXE7CisgICAgICAgIHNpZ25lZCBpbnQgcHJldk51bUNoYW5uZWxzID0gbU51bUNoYW5uZWxzOworCisgICAgICAgIC8qIFhBQUMgZGVjb2RlciBleHBlY3RzIGZpcnN0IGZyYW1lIHRvIGJlIGZlZCB2aWEgY29uZmlnWEFBQ0RlY29kZXIgQVBJCisgICAgICAgICAqIHdoaWNoIHNob3VsZCBpbml0aWFsaXplIHRoZSBjb2RlYy4gT25jZSB0aGlzIHN0YXRlIGlzIHJlYWNoZWQsIGNhbGwgdGhlCisgICAgICAgICAqIGRlY29kZVhBQUNTdHJlYW0gQVBJIHdpdGggc2FtZSBmcmFtZSB0byBkZWNvZGUhICovCisgICAgICAgIGlmICghbUlzQ29kZWNJbml0aWFsaXplZCkgeworICAgICAgICAgICAgSUFfRVJST1JDT0RFIGVycl9jb2RlID0gY29uZmlnWEFBQ0RlY29kZXIoaW5CdWZmZXIsIGluQnVmZmVyTGVuZ3RoKTsKKyAgICAgICAgICAgIGlmIChJQV9OT19FUlJPUiAhPSBlcnJfY29kZSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJjb25maWdYQUFDRGVjb2RlciBGYWlsZWQgMiBlcnJfY29kZSA9ICVkIiwgZXJyX2NvZGUpOworICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKChtU2FtcEZyZXEgIT0gcHJldlNhbXBsZVJhdGUpIHx8CisgICAgICAgICAgICAgICAgKG1OdW1DaGFubmVscyAhPSBwcmV2TnVtQ2hhbm5lbHMpKSB7CisgICAgICAgICAgICAgICAgQUxPR0koIlJlY29uZmlndXJpbmcgZGVjb2RlcjogJWQtPiVkIEh6LCAlZC0+JWQgY2hhbm5lbHMiLAorICAgICAgICAgICAgICAgICAgICAgIHByZXZTYW1wbGVSYXRlLCBtU2FtcEZyZXEsIHByZXZOdW1DaGFubmVscywgbU51bUNoYW5uZWxzKTsKKworICAgICAgICAgICAgICAgIEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86Om91dHB1dCBzYW1wbGVSYXRlSW5mbygwdSwgbVNhbXBGcmVxKTsKKyAgICAgICAgICAgICAgICBDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86Om91dHB1dCBjaGFubmVsQ291bnRJbmZvKDB1LCBtTnVtQ2hhbm5lbHMpOworICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICAgICAgICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBtSW50Zi0+Y29uZmlnKAorICAgICAgICAgICAgICAgICAgICAgICAgeyAmc2FtcGxlUmF0ZUluZm8sICZjaGFubmVsQ291bnRJbmZvIH0sCisgICAgICAgICAgICAgICAgICAgICAgICBDMl9NQVlfQkxPQ0ssCisgICAgICAgICAgICAgICAgICAgICAgICAmZmFpbHVyZXMpOworICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgICAgICAgICBDMlBhcmFtOjpDb3B5KHNhbXBsZVJhdGVJbmZvKSk7CisgICAgICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgICAgICAgICAgQzJQYXJhbTo6Q29weShjaGFubmVsQ291bnRJbmZvKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkNvbmZpZyBVcGRhdGUgZmFpbGVkIik7CisgICAgICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHNpZ25lZCBpbnQgYnl0ZXNDb25zdW1lZCA9IDA7CisgICAgICAgIElBX0VSUk9SQ09ERSBlcnJvckNvZGUgPSBJQV9OT19FUlJPUjsKKyAgICAgICAgaWYgKG1Jc0NvZGVjSW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgICAgIG1Jc0NvZGVjQ29uZmlnRmx1c2hSZXF1aXJlZCA9IHRydWU7CisgICAgICAgICAgICBlcnJvckNvZGUgPSBkZWNvZGVYQUFDU3RyZWFtKGluQnVmZmVyLCBpbkJ1ZmZlckxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ5dGVzQ29uc3VtZWQsICZtTnVtT3V0Qnl0ZXMpOworICAgICAgICB9IGVsc2UgaWYgKCFtSXNDb2RlY0NvbmZpZ0ZsdXNoUmVxdWlyZWQpIHsKKyAgICAgICAgICAgIEFMT0dXKCJBc3N1bXB0aW9uIHRoYXQgZmlyc3QgZnJhbWUgYWZ0ZXIgaGVhZGVyIGluaXRpYWxpemVzIGRlY29kZXIgRmFpbGVkISIpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBzaXplIC09IGJ5dGVzQ29uc3VtZWQ7CisgICAgICAgIG9mZnNldCArPSBieXRlc0NvbnN1bWVkOworCisgICAgICAgIGlmIChpbkJ1ZmZlckxlbmd0aCAhPSAodWludDMyX3QpYnl0ZXNDb25zdW1lZCkKKyAgICAgICAgICAgIEFMT0dXKCJBbGwgZGF0YSBub3QgY29uc3VtZWQiKTsKKworICAgICAgICAvKiBJbiBjYXNlIG9mIGVycm9yLCBkZWNvZGVyIHdvdWxkIGhhdmUgZ2l2ZW4gb3V0IGVtcHR5IGJ1ZmZlciAqLworICAgICAgICBpZiAoKElBX05PX0VSUk9SICE9IGVycm9yQ29kZSkgJiYgKDAgPT0gbU51bU91dEJ5dGVzKSAmJiBtSXNDb2RlY0luaXRpYWxpemVkKQorICAgICAgICAgICAgbU51bU91dEJ5dGVzID0gbU91dHB1dEZyYW1lTGVuZ3RoICogKG1QY21XZFN6IC8gOCkgKiBtTnVtQ2hhbm5lbHM7CisKKyAgICAgICAgaWYgKCFieXRlc0NvbnN1bWVkKSB7CisgICAgICAgICAgICBBTE9HVygiYnl0ZXNDb25zdW1lZCA9IDAgc2hvdWxkIG5ldmVyIGhhcHBlbiIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCh1aW50MzJfdCltTnVtT3V0Qnl0ZXMgPgorICAgICAgICAgICAgbU91dHB1dEZyYW1lTGVuZ3RoICogc2l6ZW9mKGludDE2X3QpICogbU51bUNoYW5uZWxzKSB7CisgICAgICAgICAgICBBTE9HRSgibU51bU91dEJ5dGVzID4gbU91dHB1dEZyYW1lTGVuZ3RoICogc2l6ZW9mKGludDE2X3QpICogbU51bUNoYW5uZWxzLCBzaG91bGQgbmV2ZXIgaGFwcGVuIik7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKElBX05PX0VSUk9SICE9IGVycm9yQ29kZSkgeworICAgICAgICAgICAgLy8gVE9ETzogY2hlY2sgZm9yIG92ZXJmbG93LCBBU0FOCisgICAgICAgICAgICBtZW1zZXQobU91dHB1dEJ1ZmZlciwgMCwgbU51bU91dEJ5dGVzKTsKKworICAgICAgICAgICAgLy8gRGlzY2FyZCBpbnB1dCBidWZmZXIuCisgICAgICAgICAgICBzaXplID0gMDsKKworICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoCisgICAgICAgIH0KKyAgICAgICAgbWVtY3B5KHRlbXBPdXRwdXREcmFpbkJ1ZmZlciwgbU91dHB1dEJ1ZmZlciwgbU51bU91dEJ5dGVzKTsKKyAgICAgICAgdGVtcE91dHB1dERyYWluQnVmZmVyICs9IG1OdW1PdXRCeXRlczsKKyAgICAgICAgbU91dHB1dERyYWluQnVmZmVyV3JpdGVQb3MgKz0gbU51bU91dEJ5dGVzOworICAgIH0KKworICAgIGlmIChtT3V0cHV0RHJhaW5CdWZmZXJXcml0ZVBvcykgeworICAgICAgICBmaW5pc2hXb3JrKHdvcmssIHBvb2wpOworICAgIH0gZWxzZSB7CisgICAgICAgIGZpbGxFbXB0eVdvcmsod29yayk7CisgICAgfQorICAgIGlmIChlb3MpIG1TaWduYWxsZWRPdXRwdXRFb3MgPSB0cnVlOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRYYWFjRGVjOjpkcmFpbih1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+JiBwb29sKSB7CisgICAgKHZvaWQpcG9vbDsKKyAgICBpZiAoZHJhaW5Nb2RlID09IE5PX0RSQUlOKSB7CisgICAgICAgIEFMT0dXKCJkcmFpbiB3aXRoIE5PX0RSQUlOOiBuby1vcCIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorICAgIGlmIChkcmFpbk1vZGUgPT0gRFJBSU5fQ0hBSU4pIHsKKyAgICAgICAgQUxPR1coIkRSQUlOX0NIQUlOIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorCisgICAgcmV0dXJuIEMyX09LOworfQorCitJQV9FUlJPUkNPREUgQzJTb2Z0WGFhY0RlYzo6Y29uZmlnZmx1c2hEZWNvZGUoKSB7CisgICAgSUFfRVJST1JDT0RFIGVycl9jb2RlOworICAgIHVpbnQzMl90IHVpX2luaXRfZG9uZTsKKyAgICB1aW50MzJfdCBpbkJ1ZmZlckxlbmd0aCA9IDgyMDM7CisKKyAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX0lOSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0NNRF9UWVBFX0ZMVVNIX01FTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0cik7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAgIklBX0NNRF9UWVBFX0ZMVVNIX01FTSIpOworCisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9TRVRfSU5QVVRfQllURVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkJ1ZmZlckxlbmd0aCk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAgIklBX0FQSV9DTURfU0VUX0lOUFVUX0JZVEVTIik7CisKKyAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX0lOSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0NNRF9UWVBFX0ZMVVNIX01FTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0cik7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAgIklBX0NNRF9UWVBFX0ZMVVNIX01FTSIpOworCisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9JTklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9DTURfVFlQRV9JTklUX0RPTkVfUVVFUlksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1aV9pbml0X2RvbmUpOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgICJJQV9DTURfVFlQRV9JTklUX0RPTkVfUVVFUlkiKTsKKworICAgIGlmICh1aV9pbml0X2RvbmUpIHsKKyAgICAgICAgZXJyX2NvZGUgPSBnZXRYQUFDU3RyZWFtSW5mbygpOworICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJnZXRYQUFDU3RyZWFtSW5mbyIpOworICAgICAgICBBTE9HVigiRm91bmQgQ29kZWMgd2l0aCBiZWxvdyBjb25maWctLS1cbnNhbXBGcmVxICVkXG5udW1DaGFubmVscyAlZFxucGNtV2RTeiAlZFxuY2hhbm5lbE1hc2sgJWRcbm91dHB1dEZyYW1lTGVuZ3RoICVkIiwKKyAgICAgICAgICAgICAgIG1TYW1wRnJlcSwgbU51bUNoYW5uZWxzLCBtUGNtV2RTeiwgbUNoYW5uZWxNYXNrLCBtT3V0cHV0RnJhbWVMZW5ndGgpOworICAgICAgICBtSXNDb2RlY0luaXRpYWxpemVkID0gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIElBX05PX0VSUk9SOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRYYWFjRGVjOjpvbkZsdXNoX3NtKCkgeworICAgIGlmIChtSXNDb2RlY0luaXRpYWxpemVkKSB7CisgICAgICAgIElBX0VSUk9SQ09ERSBlcnJfY29kZSA9IGNvbmZpZ2ZsdXNoRGVjb2RlKCk7CisgICAgICAgIGlmIChlcnJfY29kZSAhPSBJQV9OT19FUlJPUikgeworICAgICAgICAgICAgQUxPR0UoIkVycm9yIGluIGNvbmZpZ2ZsdXNoRGVjb2RlOiBFcnJvciAlZCIsIGVycl9jb2RlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBkcmFpbkRlY29kZXIoKTsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK0lBX0VSUk9SQ09ERSBDMlNvZnRYYWFjRGVjOjpkcmFpbkRlY29kZXIoKSB7CisgICAgLyogT3V0cHV0IGRlbGF5IGNvbXBlbnNhdGlvbiBsb2dpYyBzaG91bGQgc2l0IGhlcmUuICovCisgICAgLyogTm90aGluZyB0byBiZSBkb25lIGFzIFhBQUMgZGVjb2RlciBkb2VzIG5vdCBpbnRyb2R1Y2Ugb3V0cHV0IGJ1ZmZlciBkZWxheSAqLworCisgICAgcmV0dXJuIDA7Cit9CisKK0lBX0VSUk9SQ09ERSBDMlNvZnRYYWFjRGVjOjppbml0WEFBQ0RlY29kZXIoKSB7CisgICAgLyogRmlyc3QgcGFydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qIEVycm9yIEhhbmRsZXIgSW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiBHZXQgTGlicmFyeSBOYW1lLCBMaWJyYXJ5IFZlcnNpb24gYW5kIEFQSSBWZXJzaW9uICovCisgICAgLyogSW5pdGlhbGl6ZSBBUEkgc3RydWN0dXJlICsgRGVmYXVsdCBjb25maWcgc2V0ICAgICAqLworICAgIC8qIFNldCBjb25maWcgcGFyYW1zIGZyb20gdXNlciAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiBJbml0aWFsaXplIG1lbW9yeSB0YWJsZXMgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogR2V0IG1lbW9yeSBpbmZvcm1hdGlvbiBhbmQgYWxsb2NhdGUgbWVtb3J5ICAgICAgICAqLworCisgICAgbUlucHV0QnVmZmVyU2l6ZSA9IDA7CisgICAgbUlucHV0QnVmZmVyID0gbnVsbHB0cjsKKyAgICBtT3V0cHV0QnVmZmVyID0gbnVsbHB0cjsKKyAgICAvKiBQcm9jZXNzIHN0cnVjdCBpbml0aW5nIGVuZCAqLworCisgICAgLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qIEluaXRpYWxpemUgQVBJIHN0cnVjdHVyZSBhbmQgc2V0IGNvbmZpZyBwYXJhbXMgdG8gZGVmYXVsdCAgICAgICAgKi8KKyAgICAvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogQVBJIHNpemUgKi8KKyAgICB1aW50MzJfdCBwdWlfYXBpX3NpemU7CisgICAgLyogR2V0IHRoZSBBUEkgc2l6ZSAqLworICAgIElBX0VSUk9SQ09ERSBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0FQSV9DTURfR0VUX0FQSV9TSVpFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwdWlfYXBpX3NpemUpOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgICJJQV9BUElfQ01EX0dFVF9BUElfU0laRSIpOworCisgICAgLyogQWxsb2NhdGUgbWVtb3J5IGZvciBBUEkgKi8KKyAgICBtWGhlYWFjQ29kZWNIYW5kbGUgPSBtZW1hbGlnbig0LCBwdWlfYXBpX3NpemUpOworICAgIGlmICghbVhoZWFhY0NvZGVjSGFuZGxlKSB7CisgICAgICAgIEFMT0dFKCJtYWxsb2MgZm9yIHB1aV9hcGlfc2l6ZSArIDQgPj4gJWQgRmFpbGVkIiwgcHVpX2FwaV9zaXplICsgNCk7CisgICAgICAgIHJldHVybiBJQV9GQVRBTF9FUlJPUjsKKyAgICB9CisgICAgbU1lbW9yeVZlYy5wdXNoKG1YaGVhYWNDb2RlY0hhbmRsZSk7CisKKyAgICAvKiBTZXQgdGhlIGNvbmZpZyBwYXJhbXMgdG8gZGVmYXVsdCB2YWx1ZXMgKi8KKyAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX0lOSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0NNRF9UWVBFX0lOSVRfQVBJX1BSRV9DT05GSUdfUEFSQU1TLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICAiSUFfQ01EX1RZUEVfSU5JVF9BUElfUFJFX0NPTkZJR19QQVJBTVMiKTsKKworICAgIC8qIEdldCB0aGUgQVBJIHNpemUgKi8KKyAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG51bGxwdHIsIElBX0FQSV9DTURfR0VUX0FQSV9TSVpFLCAwLCAmcHVpX2FwaV9zaXplKTsKKworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0FQSV9DTURfR0VUX0FQSV9TSVpFIik7CisKKyAgICAvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIEFQSSAqLworICAgIG1NcGVnRERyY0hhbmRsZSA9IG1lbWFsaWduKDQsIHB1aV9hcGlfc2l6ZSk7CisgICAgaWYgKCFtTXBlZ0REcmNIYW5kbGUpIHsKKyAgICAgICAgQUxPR0UoIm1hbGxvYyBmb3IgcHVpX2FwaV9zaXplICsgNCA+PiAlZCBGYWlsZWQiLCBwdWlfYXBpX3NpemUgKyA0KTsKKyAgICAgICAgcmV0dXJuIElBX0ZBVEFMX0VSUk9SOworICAgIH0KKyAgICBtTWVtb3J5VmVjLnB1c2gobU1wZWdERHJjSGFuZGxlKTsKKworICAgIC8qIFNldCB0aGUgY29uZmlnIHBhcmFtcyB0byBkZWZhdWx0IHZhbHVlcyAqLworICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX0lOSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9DTURfVFlQRV9JTklUX0FQSV9QUkVfQ09ORklHX1BBUkFNUywgbnVsbHB0cik7CisKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9DTURfVFlQRV9JTklUX0FQSV9QUkVfQ09ORklHX1BBUkFNUyIpOworCisgICAgLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qIFNldCBjb25maWcgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgdWludDMyX3QgdWlfbXA0X2ZsYWcgPSAxOworICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0FQSV9DTURfU0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX0lTTVA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdWlfbXA0X2ZsYWcpOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgICJJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fSVNNUDQiKTsKKworICAgIC8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiBJbml0aWFsaXplIE1lbW9yeSBpbmZvIHRhYmxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIHVpbnQzMl90IHVpX3Byb2NfbWVtX3RhYnNfc2l6ZTsKKyAgICBwVk9JRCBwdl9hbGxvY19wdHI7CisgICAgLyogR2V0IG1lbW9yeSBpbmZvIHRhYmxlcyBzaXplICovCisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9HRVRfTUVNVEFCU19TSVpFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdWlfcHJvY19tZW1fdGFic19zaXplKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICAiSUFfQVBJX0NNRF9HRVRfTUVNVEFCU19TSVpFIik7CisKKyAgICBwdl9hbGxvY19wdHIgPSBtZW1hbGlnbig0LCB1aV9wcm9jX21lbV90YWJzX3NpemUpOworICAgIGlmICghcHZfYWxsb2NfcHRyKSB7CisgICAgICAgIEFMT0dFKCJNYWxsb2MgZm9yIHNpemUgKHVpX3Byb2NfbWVtX3RhYnNfc2l6ZSArIDQpID0gJWQgZmFpbGVkISIsIHVpX3Byb2NfbWVtX3RhYnNfc2l6ZSArIDQpOworICAgICAgICByZXR1cm4gSUFfRkFUQUxfRVJST1I7CisgICAgfQorICAgIG1NZW1vcnlWZWMucHVzaChwdl9hbGxvY19wdHIpOworCisgICAgLyogU2V0IHBvaW50ZXIgZm9yIHByb2Nlc3MgbWVtb3J5IHRhYmxlcyAgICAqLworICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0FQSV9DTURfU0VUX01FTVRBQlNfUFRSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdl9hbGxvY19wdHIpOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgICJJQV9BUElfQ01EX1NFVF9NRU1UQUJTX1BUUiIpOworCisgICAgLyogaW5pdGlhbGl6ZSB0aGUgQVBJLCBwb3N0IGNvbmZpZywgZmlsbCBtZW1vcnkgdGFibGVzICAqLworICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0FQSV9DTURfSU5JVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQ01EX1RZUEVfSU5JVF9BUElfUE9TVF9DT05GSUdfUEFSQU1TLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICAiSUFfQ01EX1RZUEVfSU5JVF9BUElfUE9TVF9DT05GSUdfUEFSQU1TIik7CisKKyAgICAvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogQWxsb2NhdGUgTWVtb3J5IHdpdGggaW5mbyBmcm9tIGxpYnJhcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiBUaGVyZSBhcmUgZm91ciBkaWZmZXJlbnQgdHlwZXMgb2YgbWVtb3JpZXMsIHRoYXQgbmVlZHMgdG8gYmUgYWxsb2NhdGVkICovCisgICAgLyogcGVyc2lzdGVudCxzY3JhdGNoLGlucHV0IGFuZCBvdXRwdXQgKi8KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICBpbnQgdWlfc2l6ZSA9IDAsIHVpX2FsaWdubWVudCA9IDAsIHVpX3R5cGUgPSAwOworCisgICAgICAgIC8qIEdldCBtZW1vcnkgc2l6ZSAqLworICAgICAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9HRVRfTUVNX0lORk9fU0laRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdWlfc2l6ZSk7CisgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgICJJQV9BUElfQ01EX0dFVF9NRU1fSU5GT19TSVpFIik7CisKKyAgICAgICAgLyogR2V0IG1lbW9yeSBhbGlnbm1lbnQgKi8KKyAgICAgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0FQSV9DTURfR0VUX01FTV9JTkZPX0FMSUdOTUVOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdWlfYWxpZ25tZW50KTsKKyAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAgIklBX0FQSV9DTURfR0VUX01FTV9JTkZPX0FMSUdOTUVOVCIpOworCisgICAgICAgIC8qIEdldCBtZW1vcnkgdHlwZSAqLworICAgICAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9HRVRfTUVNX0lORk9fVFlQRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdWlfdHlwZSk7CisgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgICJJQV9BUElfQ01EX0dFVF9NRU1fSU5GT19UWVBFIik7CisKKyAgICAgICAgcHZfYWxsb2NfcHRyID0gbWVtYWxpZ24odWlfYWxpZ25tZW50LCB1aV9zaXplKTsKKyAgICAgICAgaWYgKCFwdl9hbGxvY19wdHIpIHsKKyAgICAgICAgICAgIEFMT0dFKCJNYWxsb2MgZm9yIHNpemUgKHVpX3NpemUgKyB1aV9hbGlnbm1lbnQpID0gJWQgZmFpbGVkISIsCisgICAgICAgICAgICAgICAgICAgdWlfc2l6ZSArIHVpX2FsaWdubWVudCk7CisgICAgICAgICAgICByZXR1cm4gSUFfRkFUQUxfRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgbU1lbW9yeVZlYy5wdXNoKHB2X2FsbG9jX3B0cik7CisKKyAgICAgICAgLyogU2V0IHRoZSBidWZmZXIgcG9pbnRlciAqLworICAgICAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9TRVRfTUVNX1BUUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdl9hbGxvY19wdHIpOworICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICAiSUFfQVBJX0NNRF9TRVRfTUVNX1BUUiIpOworICAgICAgICBpZiAodWlfdHlwZSA9PSBJQV9NRU1UWVBFX0lOUFVUKSB7CisgICAgICAgICAgICBtSW5wdXRCdWZmZXIgPSAocFdPUkQ4KXB2X2FsbG9jX3B0cjsKKyAgICAgICAgICAgIG1JbnB1dEJ1ZmZlclNpemUgPSB1aV9zaXplOworICAgICAgICB9CisgICAgICAgIGlmICh1aV90eXBlID09IElBX01FTVRZUEVfT1VUUFVUKQorICAgICAgICAgICAgbU91dHB1dEJ1ZmZlciA9IChwV09SRDgpcHZfYWxsb2NfcHRyOworICAgIH0KKyAgICAvKiBFbmQgZmlyc3QgcGFydCAqLworCisgICAgcmV0dXJuIElBX05PX0VSUk9SOworfQorCitzdGF0dXNfdCBDMlNvZnRYYWFjRGVjOjppbml0WEFBQ0RyYygpIHsKKyAgICBJQV9FUlJPUkNPREUgZXJyX2NvZGUgPSBJQV9OT19FUlJPUjsKKyAgICB1bnNpZ25lZCBpbnQgdWlfZHJjX3ZhbDsKKyAgICAvLyAgRFJDX1BSRVNfTU9ERV9XUkFQX0RFU0lSRURfVEFSR0VUCisgICAgaW50MzJfdCB0YXJnZXRSZWZMZXZlbCA9IG1JbnRmLT5nZXREcmNUYXJnZXRSZWZMZXZlbCgpOworICAgIEFMT0dWKCJBQUMgZGVjb2RlciB1c2luZyBkZXNpcmVkIERSQyB0YXJnZXQgcmVmZXJlbmNlIGxldmVsIG9mICVkIiwgdGFyZ2V0UmVmTGV2ZWwpOworICAgIHVpX2RyY192YWwgPSAodW5zaWduZWQgaW50KXRhcmdldFJlZkxldmVsOworICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0FQSV9DTURfU0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX0RSQ19UQVJHRVRfTEVWRUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1aV9kcmNfdmFsKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICAiSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX0RSQ19UQVJHRVRfTEVWRUwiKTsKKworICAgIC8qIFVzZSB1aV9kcmNfdmFsIGZyb20gUFJPUF9EUkNfT1ZFUlJJREVfUkVGX0xFVkVMIG9yIERSQ19ERUZBVUxUX01PQklMRV9SRUZfTEVWRUwKKyAgICAgKiBmb3IgSUFfRU5IQUFDUExVU19ERUNfRFJDX1RBUkdFVF9MT1VETkVTUyB0b28gKi8KKyAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLCBJQV9BUElfQ01EX1NFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0VOSEFBQ1BMVVNfREVDX0RSQ19UQVJHRVRfTE9VRE5FU1MsICZ1aV9kcmNfdmFsKTsKKworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0VOSEFBQ1BMVVNfREVDX0RSQ19UQVJHRVRfTE9VRE5FU1MiKTsKKworICAgIGludDMyX3QgYXR0ZW51YXRpb25GYWN0b3IgPSBtSW50Zi0+Z2V0RHJjQXR0ZW51YXRpb25GYWN0b3IoKTsKKyAgICBBTE9HVigiQUFDIGRlY29kZXIgdXNpbmcgZGVzaXJlZCBEUkMgYXR0ZW51YXRpb24gZmFjdG9yIG9mICVkIiwgYXR0ZW51YXRpb25GYWN0b3IpOworICAgIHVpX2RyY192YWwgPSAodW5zaWduZWQgaW50KWF0dGVudWF0aW9uRmFjdG9yOworICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0FQSV9DTURfU0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX0RSQ19DVVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1aV9kcmNfdmFsKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICAiSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX0RSQ19DVVQiKTsKKworICAgIC8vICBEUkNfUFJFU19NT0RFX1dSQVBfREVTSVJFRF9CT09TVF9GQUNUT1IKKyAgICBpbnQzMl90IGJvb3N0RmFjdG9yID0gbUludGYtPmdldERyY0Jvb3N0RmFjdG9yKCk7CisgICAgQUxPR1YoIkFBQyBkZWNvZGVyIHVzaW5nIGRlc2lyZWQgRFJDIGJvb3N0IGZhY3RvciBvZiAlZCIsIGJvb3N0RmFjdG9yKTsKKyAgICB1aV9kcmNfdmFsID0gKHVuc2lnbmVkIGludClib29zdEZhY3RvcjsKKyAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX1NFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9EUkNfQk9PU1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1aV9kcmNfdmFsKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICAiSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX0RSQ19CT09TVCIpOworCisgICAgLy8gIERSQ19QUkVTX01PREVfV1JBUF9ERVNJUkVEX0hFQVZZCisgICAgaW50MzJfdCBjb21wcmVzc01vZGUgPSBtSW50Zi0+Z2V0RHJjQ29tcHJlc3NNb2RlKCk7CisgICAgQUxPR1YoIkFBQyBkZWNvZGVyIHVzaW5nIGRlc3JpZWQgRFJDIGhlYXZ5IGNvbXByZXNzaW9uIHN3aXRjaCBvZiAlZCIsIGNvbXByZXNzTW9kZSk7CisgICAgdWlfZHJjX3ZhbCA9ICh1bnNpZ25lZCBpbnQpY29tcHJlc3NNb2RlOworCisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9TRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fRFJDX0hFQVZZX0NPTVAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1aV9kcmNfdmFsKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICAiSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX0RSQ19IRUFWWV9DT01QIik7CisKKyAgICAvLyBBQUNfVU5JRFJDX1NFVF9FRkZFQ1QKKyAgICBpbnQzMl90IGVmZmVjdFR5cGUgPSBtSW50Zi0+Z2V0RHJjRWZmZWN0VHlwZSgpOworICAgIEFMT0dWKCJBQUMgZGVjb2RlciB1c2luZyBNUEVHLUQgRFJDIGVmZmVjdCB0eXBlICVkIiwgZWZmZWN0VHlwZSk7CisgICAgdWlfZHJjX3ZhbCA9ICh1bnNpZ25lZCBpbnQpZWZmZWN0VHlwZTsKKyAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLCBJQV9BUElfQ01EX1NFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0VOSEFBQ1BMVVNfREVDX0RSQ19FRkZFQ1RfVFlQRSwgJnVpX2RyY192YWwpOworCisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRU5IQUFDUExVU19ERUNfRFJDX0VGRkVDVF9UWVBFIik7CisKKyAgICByZXR1cm4gSUFfTk9fRVJST1I7Cit9CisKK0lBX0VSUk9SQ09ERSBDMlNvZnRYYWFjRGVjOjpkZUluaXRYQUFDRGVjb2RlcigpIHsKKyAgICBBTE9HVigiZGVJbml0WEFBQ0RlY29kZXIiKTsKKworICAgIC8qIEVycm9yIGNvZGUgKi8KKyAgICBJQV9FUlJPUkNPREUgZXJyX2NvZGUgPSBJQV9OT19FUlJPUjsKKworICAgIGlmIChtWGhlYWFjQ29kZWNIYW5kbGUpIHsKKyAgICAgICAgLyogVGVsbCB0aGF0IHRoZSBpbnB1dCBpcyBvdmVyIGluIHRoaXMgYnVmZmVyICovCisgICAgICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX0lOUFVUX09WRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0cik7CisgICAgfQorCisgICAgLyogSXJyZXNwZWN0aXZlIG9mIGVycm9yIHJldHVybmVkIGluIElBX0FQSV9DTURfSU5QVVRfT1ZFUiwgZnJlZSBhbGxvY2F0ZWQgbWVtb3J5ICovCisgICAgZm9yICh2b2lkKiBidWYgOiBtTWVtb3J5VmVjKSB7CisgICAgICAgIGlmIChidWYpIGZyZWUoYnVmKTsKKyAgICB9CisgICAgbU1lbW9yeVZlYy5jbGVhcigpOworICAgIG1YaGVhYWNDb2RlY0hhbmRsZSA9IG51bGxwdHI7CisKKyAgICByZXR1cm4gZXJyX2NvZGU7Cit9CisKK0lBX0VSUk9SQ09ERSBDMlNvZnRYYWFjRGVjOjpkZUluaXRNUEVHREREcmMoKSB7CisgICAgQUxPR1YoImRlSW5pdE1QRUdERERyYyIpOworCisgICAgZm9yICh2b2lkKiBidWYgOiBtRHJjTWVtb3J5VmVjKSB7CisgICAgICAgIGlmIChidWYpIGZyZWUoYnVmKTsKKyAgICB9CisgICAgbURyY01lbW9yeVZlYy5jbGVhcigpOworICAgIHJldHVybiBJQV9OT19FUlJPUjsKK30KKworSUFfRVJST1JDT0RFIEMyU29mdFhhYWNEZWM6OmNvbmZpZ1hBQUNEZWNvZGVyKHVpbnQ4X3QqIGluQnVmZmVyLCB1aW50MzJfdCBpbkJ1ZmZlckxlbmd0aCkgeworICAgIGlmIChtSW5wdXRCdWZmZXJTaXplIDwgaW5CdWZmZXJMZW5ndGgpIHsKKyAgICAgICAgQUxPR0UoIkNhbm5vdCBjb25maWcgQUFDLCBpbnB1dCBidWZmZXIgc2l6ZSAlZCA8IGluQnVmZmVyTGVuZ3RoICVkIiwgbUlucHV0QnVmZmVyU2l6ZSwgaW5CdWZmZXJMZW5ndGgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIC8qIENvcHkgdGhlIGJ1ZmZlciBwYXNzZWQgYnkgQW5kcm9pZCBwbHVnaW4gdG8gY29kZWMgaW5wdXQgYnVmZmVyICovCisgICAgbWVtY3B5KG1JbnB1dEJ1ZmZlciwgaW5CdWZmZXIsIGluQnVmZmVyTGVuZ3RoKTsKKworICAgIC8qIFNldCBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgcHJvY2Vzc2VkICovCisgICAgSUFfRVJST1JDT0RFIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX1NFVF9JTlBVVF9CWVRFUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5CdWZmZXJMZW5ndGgpOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgICJJQV9BUElfQ01EX1NFVF9JTlBVVF9CWVRFUyIpOworCisgICAgaWYgKG1Jc0NvZGVjQ29uZmlnRmx1c2hSZXF1aXJlZCkgeworICAgICAgICAvKiBJZiBjb2RlYyBpcyBhbHJlYWR5IGluaXRpYWxpemVkLCB0aGVuIEdBIGhlYWRlciBpcyBwYXNzZWQgYWdhaW4gKi8KKyAgICAgICAgLyogTmVlZCB0byBjYWxsIHRoZSBGbHVzaCBBUEkgaW5zdGVhZCBvZiBJTklUX1BST0NFU1MgKi8KKyAgICAgICAgbUlzQ29kZWNJbml0aWFsaXplZCA9IGZhbHNlOyAvKiBDb2RlYyBuZWVkcyB0byBiZSBSZWluaXRpYWxpemVkIGFmdGVyIGZsdXNoICovCisgICAgICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX0lOSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9DTURfVFlQRV9HQV9IRFIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyKTsKKyAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAgIklBX0NNRF9UWVBFX0dBX0hEUiIpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIEluaXRpYWxpemUgdGhlIHByb2Nlc3MgKi8KKyAgICAgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0FQSV9DTURfSU5JVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0NNRF9UWVBFX0lOSVRfUFJPQ0VTUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIpOworICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICAiSUFfQ01EX1RZUEVfSU5JVF9QUk9DRVNTIik7CisgICAgfQorCisgICAgdWludDMyX3QgdWlfaW5pdF9kb25lOworICAgIC8qIENoZWNraW5nIGZvciBlbmQgb2YgaW5pdGlhbGl6YXRpb24gKi8KKyAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX0lOSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0NNRF9UWVBFX0lOSVRfRE9ORV9RVUVSWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVpX2luaXRfZG9uZSk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAgIklBX0NNRF9UWVBFX0lOSVRfRE9ORV9RVUVSWSIpOworCisgICAgLyogSG93IG11Y2ggYnVmZmVyIGlzIHVzZWQgaW4gaW5wdXQgYnVmZmVycyAqLworICAgIGludDMyX3QgaV9ieXRlc19jb25zdW1lZDsKKyAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX0dFVF9DVVJJRFhfSU5QVVRfQlVGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaV9ieXRlc19jb25zdW1lZCk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAgIklBX0FQSV9DTURfR0VUX0NVUklEWF9JTlBVVF9CVUYiKTsKKworICAgIGlmICh1aV9pbml0X2RvbmUpIHsKKyAgICAgICAgZXJyX2NvZGUgPSBnZXRYQUFDU3RyZWFtSW5mbygpOworICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJnZXRYQUFDU3RyZWFtSW5mbyIpOworICAgICAgICBBTE9HSSgiRm91bmQgQ29kZWMgd2l0aCBiZWxvdyBjb25maWctLS1cbnNhbXBGcmVxICVkXG5udW1DaGFubmVscyAlZFxucGNtV2RTeiAlZFxuY2hhbm5lbE1hc2sgJWRcbm91dHB1dEZyYW1lTGVuZ3RoICVkIiwKKyAgICAgICAgICAgICAgIG1TYW1wRnJlcSwgbU51bUNoYW5uZWxzLCBtUGNtV2RTeiwgbUNoYW5uZWxNYXNrLCBtT3V0cHV0RnJhbWVMZW5ndGgpOworICAgICAgICBtSXNDb2RlY0luaXRpYWxpemVkID0gdHJ1ZTsKKworICAgICAgICBlcnJfY29kZSA9IGNvbmZpZ01QRUdERHJjKCk7CisgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgImNvbmZpZ01QRUdERHJjIik7CisgICAgfQorCisgICAgcmV0dXJuIElBX05PX0VSUk9SOworfQorSUFfRVJST1JDT0RFIEMyU29mdFhhYWNEZWM6OmluaXRNUEVHREREcmMoKSB7CisgICAgSUFfRVJST1JDT0RFIGVycl9jb2RlID0gSUFfTk9fRVJST1I7CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IChXT1JEMzIpMjsgaSsrKSB7CisgICAgICAgIFdPUkQzMiB1aV9zaXplLCB1aV9hbGlnbm1lbnQsIHVpX3R5cGU7CisgICAgICAgIHBWT0lEIHB2X2FsbG9jX3B0cjsKKworICAgICAgICAvKiBHZXQgbWVtb3J5IHNpemUgKi8KKyAgICAgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfR0VUX01FTV9JTkZPX1NJWkUsIGksICZ1aV9zaXplKTsKKworICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9BUElfQ01EX0dFVF9NRU1fSU5GT19TSVpFIik7CisKKyAgICAgICAgLyogR2V0IG1lbW9yeSBhbGlnbm1lbnQgKi8KKyAgICAgICAgZXJyX2NvZGUgPQorICAgICAgICAgICAgaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX0dFVF9NRU1fSU5GT19BTElHTk1FTlQsIGksICZ1aV9hbGlnbm1lbnQpOworCisgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0FQSV9DTURfR0VUX01FTV9JTkZPX0FMSUdOTUVOVCIpOworCisgICAgICAgIC8qIEdldCBtZW1vcnkgdHlwZSAqLworICAgICAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9HRVRfTUVNX0lORk9fVFlQRSwgaSwgJnVpX3R5cGUpOworICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9BUElfQ01EX0dFVF9NRU1fSU5GT19UWVBFIik7CisKKyAgICAgICAgcHZfYWxsb2NfcHRyID0gbWVtYWxpZ24oNCwgdWlfc2l6ZSk7CisgICAgICAgIGlmIChwdl9hbGxvY19wdHIgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0UoIiBDYW5ub3QgY3JlYXRlIHJlcXVlc3RlZCBtZW1vcnkgICVkIiwgdWlfc2l6ZSk7CisgICAgICAgICAgICByZXR1cm4gSUFfRkFUQUxfRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgbURyY01lbW9yeVZlYy5wdXNoKHB2X2FsbG9jX3B0cik7CisKKyAgICAgICAgLyogU2V0IHRoZSBidWZmZXIgcG9pbnRlciAqLworICAgICAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfTUVNX1BUUiwgaSwgcHZfYWxsb2NfcHRyKTsKKworICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9BUElfQ01EX1NFVF9NRU1fUFRSIik7CisgICAgfQorCisgICAgV09SRDMyIHVpX3NpemU7CisgICAgdWlfc2l6ZSA9IDgxOTIgKiAyOworCisgICAgbURyY0luQnVmID0gKGludDhfdCopbWVtYWxpZ24oNCwgdWlfc2l6ZSk7CisgICAgaWYgKG1EcmNJbkJ1ZiA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIgQ2Fubm90IGNyZWF0ZSByZXF1ZXN0ZWQgbWVtb3J5ICAlZCIsIHVpX3NpemUpOworICAgICAgICByZXR1cm4gSUFfRkFUQUxfRVJST1I7CisgICAgfQorICAgIG1EcmNNZW1vcnlWZWMucHVzaChtRHJjSW5CdWYpOworCisgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfU0VUX01FTV9QVFIsIDIsIG1EcmNJbkJ1Zik7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQVBJX0NNRF9TRVRfTUVNX1BUUiIpOworCisgICAgbURyY091dEJ1ZiA9IChpbnQ4X3QqKW1lbWFsaWduKDQsIHVpX3NpemUpOworICAgIGlmIChtRHJjT3V0QnVmID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiBDYW5ub3QgY3JlYXRlIHJlcXVlc3RlZCBtZW1vcnkgICVkIiwgdWlfc2l6ZSk7CisgICAgICAgIHJldHVybiBJQV9GQVRBTF9FUlJPUjsKKyAgICB9CisgICAgbURyY01lbW9yeVZlYy5wdXNoKG1EcmNPdXRCdWYpOworCisgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfU0VUX01FTV9QVFIsIDMsIG1EcmNPdXRCdWYpOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0FQSV9DTURfU0VUX01FTV9QVFIiKTsKKworICAgIHJldHVybiBJQV9OT19FUlJPUjsKK30KK2ludCBDMlNvZnRYYWFjRGVjOjpjb25maWdNUEVHRERyYygpIHsKKyAgICBJQV9FUlJPUkNPREUgZXJyX2NvZGUgPSBJQV9OT19FUlJPUjsKKyAgICBpbnQgaV9lZmZlY3RfdHlwZTsKKyAgICBpbnQgaV9sb3VkX25vcm07CisgICAgaW50IGlfdGFyZ2V0X2xvdWRuZXNzOworICAgIHVuc2lnbmVkIGludCBpX3Nicl9tb2RlOworCisgICAgLyogU2FtcGxpbmcgRnJlcXVlbmN5ICovCisgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfU0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0RSQ19ERUNfQ09ORklHX1BBUkFNX1NBTVBfRlJFUSwgJm1TYW1wRnJlcSk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRFJDX0RFQ19DT05GSUdfUEFSQU1fU0FNUF9GUkVRIik7CisgICAgLyogVG90YWwgTnVtYmVyIG9mIENoYW5uZWxzICovCisgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfU0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0RSQ19ERUNfQ09ORklHX1BBUkFNX05VTV9DSEFOTkVMUywgJm1OdW1DaGFubmVscyk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRFJDX0RFQ19DT05GSUdfUEFSQU1fTlVNX0NIQU5ORUxTIik7CisKKyAgICAvKiBQQ00gd29yZCBzaXplICAqLworICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX1NFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9EUkNfREVDX0NPTkZJR19QQVJBTV9QQ01fV0RTWiwgJm1QY21XZFN6KTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9EUkNfREVDX0NPTkZJR19QQVJBTV9QQ01fV0RTWiIpOworCisgICAgLypTZXQgRWZmZWN0IFR5cGUqLworCisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwgSUFfQVBJX0NNRF9HRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fRFJDX0VGRkVDVF9UWVBFLCAmaV9lZmZlY3RfdHlwZSk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX0RSQ19FRkZFQ1RfVFlQRSIpOworCisgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfU0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0RSQ19ERUNfQ09ORklHX0RSQ19FRkZFQ1RfVFlQRSwgJmlfZWZmZWN0X3R5cGUpOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0RSQ19ERUNfQ09ORklHX0RSQ19FRkZFQ1RfVFlQRSIpOworCisgICAgLypTZXQgdGFyZ2V0IGxvdWRuZXNzICovCisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwgSUFfQVBJX0NNRF9HRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fRFJDX1RBUkdFVF9MT1VETkVTUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlfdGFyZ2V0X2xvdWRuZXNzKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fRFJDX1RBUkdFVF9MT1VETkVTUyIpOworCisgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfU0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0RSQ19ERUNfQ09ORklHX0RSQ19UQVJHRVRfTE9VRE5FU1MsICZpX3RhcmdldF9sb3VkbmVzcyk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRFJDX0RFQ19DT05GSUdfRFJDX1RBUkdFVF9MT1VETkVTUyIpOworCisgICAgLypTZXQgbG91ZF9ub3JtX2ZsYWcqLworICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsIElBX0FQSV9DTURfR0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX0RSQ19MT1VEX05PUk0sICZpX2xvdWRfbm9ybSk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX0RSQ19MT1VEX05PUk0iKTsKKworICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX1NFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9EUkNfREVDX0NPTkZJR19EUkNfTE9VRF9OT1JNLCAmaV9sb3VkX25vcm0pOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0RSQ19ERUNfQ09ORklHX0RSQ19MT1VEX05PUk0iKTsKKworICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsIElBX0FQSV9DTURfR0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX1NCUl9NT0RFLCAmaV9zYnJfbW9kZSk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX1NCUl9NT0RFIik7CisKKyAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9JTklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQ01EX1RZUEVfSU5JVF9BUElfUE9TVF9DT05GSUdfUEFSQU1TLCBudWxscHRyKTsKKworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0NNRF9UWVBFX0lOSVRfQVBJX1BPU1RfQ09ORklHX1BBUkFNUyIpOworCisgICAgLyogRnJlZSBhbnkgbWVtb3J5IHRoYXQgaXMgYWxsb2NhdGVkIGZvciBNUEVHIEQgRHJjIHNvIGZhciAqLworICAgIGRlSW5pdE1QRUdERERyYygpOworCisgICAgZXJyX2NvZGUgPSBpbml0TVBFR0RERHJjKCk7CisgICAgaWYgKGVycl9jb2RlICE9IElBX05PX0VSUk9SKSB7CisgICAgICAgIEFMT0dFKCJpbml0TVBFR0RERHJjIGZhaWxlZCB3aXRoIGVycm9yICVkIiwgZXJyX2NvZGUpOworICAgICAgICBkZUluaXRNUEVHREREcmMoKTsKKyAgICAgICAgcmV0dXJuIGVycl9jb2RlOworICAgIH0KKworICAgIC8qIERSQyBidWZmZXJzCisgICAgICAgIGJ1ZlswXSAtIGNvbnRhaW5zIGV4dGVuc2lvbiBlbGVtZW50IHBheSBsb2FkIGxvdWRuZXNzIHJlbGF0ZWQKKyAgICAgICAgYnVmWzFdIC0gY29udGFpbnMgZXh0ZW5zaW9uIGVsZW1lbnQgcGF5IGxvYWQqLworICAgIHsKKyAgICAgICAgVk9JRCogcF9hcnJheVsyXVsxNl07CisgICAgICAgIFdPUkQzMiBpaTsKKyAgICAgICAgV09SRDMyIGJ1Zl9zaXplc1syXVsxNl07CisgICAgICAgIFdPUkQzMiBudW1fZWxlbWVudHM7CisgICAgICAgIFdPUkQzMiBudW1fY29uZmlnX2V4dDsKKyAgICAgICAgV09SRDMyIGJpdF9zdHJfZm10ID0gMTsKKworICAgICAgICBXT1JEMzIgdW9fbnVtX2NoYW47CisKKyAgICAgICAgbWVtc2V0KGJ1Zl9zaXplcywgMCwgMzIgKiBzaXplb2YoV09SRDMyKSk7CisKKyAgICAgICAgZXJyX2NvZGUgPQorICAgICAgICAgICAgaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsIElBX0FQSV9DTURfR0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX0VYVF9FTEVfQlVGX1NJWkVTLCAmYnVmX3NpemVzWzBdWzBdKTsKKyAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX0VYVF9FTEVfQlVGX1NJWkVTIik7CisKKyAgICAgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwgSUFfQVBJX0NNRF9HRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX0VYVF9FTEVfUFRSLCAmcF9hcnJheSk7CisgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19FWFRfRUxFX1BUUiIpOworCisgICAgICAgIGVycl9jb2RlID0KKyAgICAgICAgICAgIGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9JTklULCBJQV9DTURfVFlQRV9JTklUX1NFVF9CVUZGX1BUUiwgbnVsbHB0cik7CisgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0NNRF9UWVBFX0lOSVRfU0VUX0JVRkZfUFRSIik7CisKKyAgICAgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwgSUFfQVBJX0NNRF9HRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX05VTV9FTEUsICZudW1fZWxlbWVudHMpOworICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfTlVNX0VMRSIpOworCisgICAgICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsIElBX0FQSV9DTURfR0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19OVU1fQ09ORklHX0VYVCwgJm51bV9jb25maWdfZXh0KTsKKyAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX05VTV9DT05GSUdfRVhUIik7CisKKyAgICAgICAgZm9yIChpaSA9IDA7IGlpIDwgbnVtX2NvbmZpZ19leHQ7IGlpKyspIHsKKyAgICAgICAgICAgIC8qY29weSBsb3VkbmVzcyBiaXRzdHJlYW0qLworICAgICAgICAgICAgaWYgKGJ1Zl9zaXplc1swXVtpaV0gPiAwKSB7CisgICAgICAgICAgICAgICAgbWVtY3B5KG1EcmNJbkJ1ZiwgcF9hcnJheVswXVtpaV0sIGJ1Zl9zaXplc1swXVtpaV0pOworCisgICAgICAgICAgICAgICAgLypTZXQgYml0c3RyZWFtX3NwbGl0X2Zvcm1hdCAqLworICAgICAgICAgICAgICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX1NFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9EUkNfREVDX0NPTkZJR19QQVJBTV9CSVRTX0ZPUk1BVCwgJmJpdF9zdHJfZm10KTsKKyAgICAgICAgICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9EUkNfREVDX0NPTkZJR19QQVJBTV9CSVRTX0ZPUk1BVCIpOworCisgICAgICAgICAgICAgICAgLyogU2V0IG51bWJlciBvZiBieXRlcyB0byBiZSBwcm9jZXNzZWQgKi8KKyAgICAgICAgICAgICAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfSU5QVVRfQllURVNfSUxfQlMsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYnVmX3NpemVzWzBdW2lpXSk7CisgICAgICAgICAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQVBJX0NNRF9TRVRfSU5QVVRfQllURVNfSUxfQlMiKTsKKworICAgICAgICAgICAgICAgIC8qIEV4ZWN1dGUgcHJvY2VzcyAqLworICAgICAgICAgICAgICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX0lOSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9DTURfVFlQRV9JTklUX0NQWV9JTF9CU0ZfQlVGRiwgbnVsbHB0cik7CisgICAgICAgICAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQ01EX1RZUEVfSU5JVF9DUFlfSUxfQlNGX0JVRkYiKTsKKworICAgICAgICAgICAgICAgIG1EUkNGbGFnID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaWkgPSAwOyBpaSA8IG51bV9lbGVtZW50czsgaWkrKykgeworICAgICAgICAgICAgLypjb3B5IGNvbmZpZyBiaXRzdHJlYW0qLworICAgICAgICAgICAgaWYgKGJ1Zl9zaXplc1sxXVtpaV0gPiAwKSB7CisgICAgICAgICAgICAgICAgbWVtY3B5KG1EcmNJbkJ1ZiwgcF9hcnJheVsxXVtpaV0sIGJ1Zl9zaXplc1sxXVtpaV0pOworICAgICAgICAgICAgICAgIC8qIFNldCBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgcHJvY2Vzc2VkICovCisKKyAgICAgICAgICAgICAgICAvKlNldCBiaXRzdHJlYW1fc3BsaXRfZm9ybWF0ICovCisgICAgICAgICAgICAgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfU0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0RSQ19ERUNfQ09ORklHX1BBUkFNX0JJVFNfRk9STUFULCAmYml0X3N0cl9mbXQpOworICAgICAgICAgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0RSQ19ERUNfQ09ORklHX1BBUkFNX0JJVFNfRk9STUFUIik7CisKKyAgICAgICAgICAgICAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfSU5QVVRfQllURVNfSUNfQlMsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYnVmX3NpemVzWzFdW2lpXSk7CisgICAgICAgICAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQVBJX0NNRF9TRVRfSU5QVVRfQllURVNfSUNfQlMiKTsKKworICAgICAgICAgICAgICAgIC8qIEV4ZWN1dGUgcHJvY2VzcyAqLworICAgICAgICAgICAgICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX0lOSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9DTURfVFlQRV9JTklUX0NQWV9JQ19CU0ZfQlVGRiwgbnVsbHB0cik7CisKKyAgICAgICAgICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9DTURfVFlQRV9JTklUX0NQWV9JQ19CU0ZfQlVGRiIpOworCisgICAgICAgICAgICAgICAgbURSQ0ZsYWcgPSAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKG1EUkNGbGFnID09IDEpIHsKKyAgICAgICAgICAgIG1NcGVnRERSQ1ByZXNlbnQgPSAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbU1wZWdERFJDUHJlc2VudCA9IDA7CisgICAgICAgIH0KKworICAgICAgICAvKlJlYWQgaW50ZXJmYWNlIGJ1ZmZlciBjb25maWcgZmlsZSBiaXRzdHJlYW0qLworICAgICAgICBpZiAobU1wZWdERFJDUHJlc2VudCA9PSAxKSB7CisgICAgICAgICAgICBXT1JEMzIgaW50ZXJmYWNlX2lzX3ByZXNlbnQgPSAxOworCisgICAgICAgICAgICBpZiAoaV9zYnJfbW9kZSAhPSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKGlfc2JyX21vZGUgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICBtT3V0cHV0RnJhbWVMZW5ndGggPSAyMDQ4OworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaV9zYnJfbW9kZSA9PSAzKSB7CisgICAgICAgICAgICAgICAgICAgIG1PdXRwdXRGcmFtZUxlbmd0aCA9IDQwOTY7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbU91dHB1dEZyYW1lTGVuZ3RoID0gMTAyNDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1PdXRwdXRGcmFtZUxlbmd0aCA9IDQwOTY7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX1NFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0RSQ19ERUNfQ09ORklHX1BBUkFNX0ZSQU1FX1NJWkUsIChXT1JEMzIgKikmbU91dHB1dEZyYW1lTGVuZ3RoKTsKKyAgICAgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0RSQ19ERUNfQ09ORklHX1BBUkFNX0ZSQU1FX1NJWkUiKTsKKworICAgICAgICAgICAgZXJyX2NvZGUgPQorICAgICAgICAgICAgICAgIGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0RSQ19ERUNfQ09ORklHX1BBUkFNX0lOVF9QUkVTRU5ULCAmaW50ZXJmYWNlX2lzX3ByZXNlbnQpOworICAgICAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRFJDX0RFQ19DT05GSUdfUEFSQU1fSU5UX1BSRVNFTlQiKTsKKworICAgICAgICAgICAgLyogRXhlY3V0ZSBwcm9jZXNzICovCisgICAgICAgICAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9JTklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9DTURfVFlQRV9JTklUX0NQWV9JTl9CU0ZfQlVGRiwgbnVsbHB0cik7CisgICAgICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9DTURfVFlQRV9JTklUX0NQWV9JTl9CU0ZfQlVGRiIpOworCisgICAgICAgICAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9JTklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9DTURfVFlQRV9JTklUX1BST0NFU1MsIG51bGxwdHIpOworICAgICAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQ01EX1RZUEVfSU5JVF9QUk9DRVNTIik7CisKKyAgICAgICAgICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX0dFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0RSQ19ERUNfQ09ORklHX1BBUkFNX05VTV9DSEFOTkVMUywgJnVvX251bV9jaGFuKTsKKyAgICAgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0RSQ19ERUNfQ09ORklHX1BBUkFNX05VTV9DSEFOTkVMUyIpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGVycl9jb2RlOworfQorCitJQV9FUlJPUkNPREUgQzJTb2Z0WGFhY0RlYzo6ZGVjb2RlWEFBQ1N0cmVhbSh1aW50OF90KiBpbkJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGluQnVmZmVyTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogYnl0ZXNDb25zdW1lZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIG91dEJ5dGVzKSB7CisgICAgaWYgKG1JbnB1dEJ1ZmZlclNpemUgPCBpbkJ1ZmZlckxlbmd0aCkgeworICAgICAgICBBTE9HRSgiQ2Fubm90IGNvbmZpZyBBQUMsIGlucHV0IGJ1ZmZlciBzaXplICVkIDwgaW5CdWZmZXJMZW5ndGggJWQiLCBtSW5wdXRCdWZmZXJTaXplLCBpbkJ1ZmZlckxlbmd0aCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgLyogQ29weSB0aGUgYnVmZmVyIHBhc3NlZCBieSBBbmRyb2lkIHBsdWdpbiB0byBjb2RlYyBpbnB1dCBidWZmZXIgKi8KKyAgICBtZW1jcHkobUlucHV0QnVmZmVyLCBpbkJ1ZmZlciwgaW5CdWZmZXJMZW5ndGgpOworCisgICAgLyogU2V0IG51bWJlciBvZiBieXRlcyB0byBiZSBwcm9jZXNzZWQgKi8KKyAgICBJQV9FUlJPUkNPREUgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0FQSV9DTURfU0VUX0lOUFVUX0JZVEVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkJ1ZmZlckxlbmd0aCk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAgIklBX0FQSV9DTURfU0VUX0lOUFVUX0JZVEVTIik7CisKKyAgICAvKiBFeGVjdXRlIHByb2Nlc3MgKi8KKyAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX0VYRUNVVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0NNRF9UWVBFX0RPX0VYRUNVVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIpOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgICJJQV9DTURfVFlQRV9ET19FWEVDVVRFIik7CisKKyAgICAvKiBDaGVja2luZyBmb3IgZW5kIG9mIHByb2Nlc3NpbmcgKi8KKyAgICB1aW50MzJfdCB1aV9leGVjX2RvbmU7CisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9FWEVDVVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9DTURfVFlQRV9ET05FX1FVRVJZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdWlfZXhlY19kb25lKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICAiSUFfQ01EX1RZUEVfRE9ORV9RVUVSWSIpOworCisgICAgaWYgKHVpX2V4ZWNfZG9uZSAhPSAxKSB7CisgICAgICAgIFZPSUQqIHBfYXJyYXk7ICAgICAgICAvLyBJVFRJQU06YnVmZmVyIHRvIGhhbmRsZSBnYWluIHBheWxvYWQKKyAgICAgICAgV09SRDMyIGJ1Zl9zaXplID0gMDsgIC8vIElUVElBTTpnYWluIHBheWxvYWQgbGVuZ3RoCisgICAgICAgIFdPUkQzMiBiaXRfc3RyX2ZtdCA9IDE7CisgICAgICAgIFdPUkQzMiBnYWluX3N0cmVhbV9mbGFnID0gMTsKKworICAgICAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLCBJQV9BUElfQ01EX0dFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfR0FJTl9QQVlMT0FEX0xFTiwgJmJ1Zl9zaXplKTsKKyAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX0dBSU5fUEFZTE9BRF9MRU4iKTsKKworICAgICAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLCBJQV9BUElfQ01EX0dFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfR0FJTl9QQVlMT0FEX0JVRiwgJnBfYXJyYXkpOworICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfR0FJTl9QQVlMT0FEX0JVRiIpOworCisgICAgICAgIGlmIChidWZfc2l6ZSA+IDApIHsKKyAgICAgICAgICAgIC8qU2V0IGJpdHN0cmVhbV9zcGxpdF9mb3JtYXQgKi8KKyAgICAgICAgICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX1NFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0RSQ19ERUNfQ09ORklHX1BBUkFNX0JJVFNfRk9STUFULCAmYml0X3N0cl9mbXQpOworICAgICAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRFJDX0RFQ19DT05GSUdfUEFSQU1fQklUU19GT1JNQVQiKTsKKworICAgICAgICAgICAgbWVtY3B5KG1EcmNJbkJ1ZiwgcF9hcnJheSwgYnVmX3NpemUpOworICAgICAgICAgICAgLyogU2V0IG51bWJlciBvZiBieXRlcyB0byBiZSBwcm9jZXNzZWQgKi8KKyAgICAgICAgICAgIGVycl9jb2RlID0KKyAgICAgICAgICAgICAgICBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfU0VUX0lOUFVUX0JZVEVTX0JTLCAwLCAmYnVmX3NpemUpOworICAgICAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRFJDX0RFQ19DT05GSUdfUEFSQU1fQklUU19GT1JNQVQiKTsKKworICAgICAgICAgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfU0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRFJDX0RFQ19DT05GSUdfR0FJTl9TVFJFQU1fRkxBRywgJmdhaW5fc3RyZWFtX2ZsYWcpOworICAgICAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRFJDX0RFQ19DT05GSUdfUEFSQU1fQklUU19GT1JNQVQiKTsKKworICAgICAgICAgICAgLyogRXhlY3V0ZSBwcm9jZXNzICovCisgICAgICAgICAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9JTklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9DTURfVFlQRV9JTklUX0NQWV9CU0ZfQlVGRiwgbnVsbHB0cik7CisgICAgICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9EUkNfREVDX0NPTkZJR19QQVJBTV9CSVRTX0ZPUk1BVCIpOworCisgICAgICAgICAgICBtTXBlZ0REUkNQcmVzZW50ID0gMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIEhvdyBtdWNoIGJ1ZmZlciBpcyB1c2VkIGluIGlucHV0IGJ1ZmZlcnMgKi8KKyAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX0dFVF9DVVJJRFhfSU5QVVRfQlVGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlc0NvbnN1bWVkKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICAiSUFfQVBJX0NNRF9HRVRfQ1VSSURYX0lOUFVUX0JVRiIpOworCisgICAgLyogR2V0IHRoZSBvdXRwdXQgYnl0ZXMgKi8KKyAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX0dFVF9PVVRQVVRfQllURVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dEJ5dGVzKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICAiSUFfQVBJX0NNRF9HRVRfT1VUUFVUX0JZVEVTIik7CisKKyAgICBpZiAobU1wZWdERFJDUHJlc2VudCA9PSAxKSB7CisgICAgICAgIG1lbWNweShtRHJjSW5CdWYsIG1PdXRwdXRCdWZmZXIsICpvdXRCeXRlcyk7CisgICAgICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX1NFVF9JTlBVVF9CWVRFUywgMCwgb3V0Qnl0ZXMpOworICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9BUElfQ01EX1NFVF9JTlBVVF9CWVRFUyIpOworCisgICAgICAgIGVycl9jb2RlID0KKyAgICAgICAgICAgIGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9FWEVDVVRFLCBJQV9DTURfVFlQRV9ET19FWEVDVVRFLCBudWxscHRyKTsKKyAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQ01EX1RZUEVfRE9fRVhFQ1VURSIpOworCisgICAgICAgIG1lbWNweShtT3V0cHV0QnVmZmVyLCBtRHJjT3V0QnVmLCAqb3V0Qnl0ZXMpOworICAgIH0KKyAgICByZXR1cm4gSUFfTk9fRVJST1I7Cit9CisKK0lBX0VSUk9SQ09ERSBDMlNvZnRYYWFjRGVjOjpnZXRYQUFDU3RyZWFtSW5mbygpIHsKKyAgICBJQV9FUlJPUkNPREUgZXJyX2NvZGUgPSBJQV9OT19FUlJPUjsKKworICAgIC8qIFNhbXBsaW5nIGZyZXF1ZW5jeSAqLworICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0FQSV9DTURfR0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX1NBTVBfRlJFUSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1TYW1wRnJlcSk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAgIklBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9TQU1QX0ZSRVEiKTsKKworICAgIC8qIFRvdGFsIE51bWJlciBvZiBDaGFubmVscyAqLworICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0FQSV9DTURfR0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX05VTV9DSEFOTkVMUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1OdW1DaGFubmVscyk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAgIklBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9OVU1fQ0hBTk5FTFMiKTsKKyAgICBpZiAobU51bUNoYW5uZWxzID4gTUFYX0NIQU5ORUxfQ09VTlQpIHsKKyAgICAgICAgQUxPR0UoIiBObyBvZiBjaGFubmVscyBhcmUgbW9yZSB0aGFuIG1heCBjaGFubmVsc1xuIik7CisgICAgICAgIHJldHVybiBJQV9GQVRBTF9FUlJPUjsKKyAgICB9CisKKyAgICAvKiBQQ00gd29yZCBzaXplICovCisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9HRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fUENNX1dEU1osCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtUGNtV2RTeik7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAgIklBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9QQ01fV0RTWiIpOworICAgIGlmICgobVBjbVdkU3ogLyA4KSAhPSAyKSB7CisgICAgICAgIEFMT0dFKCIgTm8gb2YgY2hhbm5lbHMgYXJlIG1vcmUgdGhhbiBtYXggY2hhbm5lbHNcbiIpOworICAgICAgICByZXR1cm4gSUFfRkFUQUxfRVJST1I7CisgICAgfQorCisgICAgLyogY2hhbm5lbCBtYXNrIHRvIHRlbGwgdGhlIGFycmFuZ2VtZW50IG9mIGNoYW5uZWxzIGluIGJpdCBzdHJlYW0gKi8KKyAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX0dFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9DSEFOTkVMX01BU0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtQ2hhbm5lbE1hc2spOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgICJJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fQ0hBTk5FTF9NQVNLIik7CisKKyAgICAvKiBDaGFubmVsIG1vZGUgdG8gdGVsbCBNT05PL1NURVJFTy9EVUFMLU1PTk8vTk9ORV9PRl9USEVTRSAqLworICAgIHVpbnQzMl90IHVpX2NoYW5uZWxfbW9kZTsKKyAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX0dFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9DSEFOTkVMX01PREUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1aV9jaGFubmVsX21vZGUpOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgICJJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fQ0hBTk5FTF9NT0RFIik7CisgICAgaWYgKHVpX2NoYW5uZWxfbW9kZSA9PSAwKQorICAgICAgICBBTE9HVigiQ2hhbm5lbCBNb2RlOiBNT05PX09SX1BTXG4iKTsKKyAgICBlbHNlIGlmICh1aV9jaGFubmVsX21vZGUgPT0gMSkKKyAgICAgICAgQUxPR1YoIkNoYW5uZWwgTW9kZTogU1RFUkVPXG4iKTsKKyAgICBlbHNlIGlmICh1aV9jaGFubmVsX21vZGUgPT0gMikKKyAgICAgICAgQUxPR1YoIkNoYW5uZWwgTW9kZTogRFVBTC1NT05PXG4iKTsKKyAgICBlbHNlCisgICAgICAgIEFMT0dWKCJDaGFubmVsIE1vZGU6IE5PTkVfT0ZfVEhFU0Ugb3IgTVVMVElDSEFOTkVMXG4iKTsKKworICAgIC8qIENoYW5uZWwgbW9kZSB0byB0ZWxsIFNCUiBQUkVTRU5UL05PVF9QUkVTRU5UICovCisgICAgdWludDMyX3QgdWlfc2JyX21vZGU7CisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9HRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fU0JSX01PREUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1aV9zYnJfbW9kZSk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAgIklBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9TQlJfTU9ERSIpOworICAgIGlmICh1aV9zYnJfbW9kZSA9PSAwKQorICAgICAgICBBTE9HVigiU0JSIE1vZGU6IE5PVF9QUkVTRU5UXG4iKTsKKyAgICBlbHNlIGlmICh1aV9zYnJfbW9kZSA9PSAxKQorICAgICAgICBBTE9HVigiU0JSIE1vZGU6IFBSRVNFTlRcbiIpOworICAgIGVsc2UKKyAgICAgICAgQUxPR1YoIlNCUiBNb2RlOiBJTExFR0FMXG4iKTsKKworICAgIC8qIG1PdXRwdXRGcmFtZUxlbmd0aCA9IDEwMjQgKiAoMSArIFNCUl9NT0RFKSBmb3IgQUFDICovCisgICAgLyogRm9yIFVTQUMgaXQgY291bGQgYmUgMTAyNCAqIDMgLCBzdXBwb3J0IHRvIHF1ZXJ5ICAqLworICAgIC8qIG5vdCB5ZXQgYWRkZWQgaW4gY29kZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBtT3V0cHV0RnJhbWVMZW5ndGggPSAxMDI0ICogKDEgKyB1aV9zYnJfbW9kZSk7CisgICAgQUxPR0koIm1PdXRwdXRGcmFtZUxlbmd0aCAlZCB1aV9zYnJfbW9kZSAlZCIsIG1PdXRwdXRGcmFtZUxlbmd0aCwgdWlfc2JyX21vZGUpOworCisgICAgcmV0dXJuIElBX05PX0VSUk9SOworfQorCitJQV9FUlJPUkNPREUgQzJTb2Z0WGFhY0RlYzo6c2V0WEFBQ0RSQ0luZm8oaW50MzJfdCBkcmNDdXQsIGludDMyX3QgZHJjQm9vc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkcmNSZWZMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRyY0hlYXZ5Q29tcHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkckVmZmVjdFR5cGUpIHsKKyAgICBJQV9FUlJPUkNPREUgZXJyX2NvZGUgPSBJQV9OT19FUlJPUjsKKworICAgIGludDMyX3QgdWlfZHJjX2VuYWJsZSA9IDE7CisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fRFJDX0VOQUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVpX2RyY19lbmFibGUpOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9EUkNfRU5BQkxFIik7CisgICAgaWYgKGRyY0N1dCAhPSAtMSkgeworICAgICAgICBlcnJfY29kZSA9CisgICAgICAgICAgICBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fRFJDX0NVVCwgJmRyY0N1dCk7CisgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9EUkNfQ1VUIik7CisgICAgfQorCisgICAgaWYgKGRyY0Jvb3N0ICE9IC0xKSB7CisgICAgICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaSgKKyAgICAgICAgICAgIG1YaGVhYWNDb2RlY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX0RSQ19CT09TVCwgJmRyY0Jvb3N0KTsKKyAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX0RSQ19CT09TVCIpOworICAgIH0KKworICAgIGlmIChkcmNSZWZMZXZlbCAhPSAtMSkgeworICAgICAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkoCisgICAgICAgICAgICBtWGhlYWFjQ29kZWNIYW5kbGUsIElBX0FQSV9DTURfU0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgIElBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9EUkNfVEFSR0VUX0xFVkVMLCAmZHJjUmVmTGV2ZWwpOworICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAiSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX0RSQ19UQVJHRVRfTEVWRUwiKTsKKyAgICB9CisKKyAgICBpZiAoZHJjUmVmTGV2ZWwgIT0gLTEpIHsKKyAgICAgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKAorICAgICAgICAgICAgbVhoZWFhY0NvZGVjSGFuZGxlLCBJQV9BUElfQ01EX1NFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICBJQV9FTkhBQUNQTFVTX0RFQ19EUkNfVEFSR0VUX0xPVURORVNTLCAmZHJjUmVmTGV2ZWwpOworICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9FTkhBQUNQTFVTX0RFQ19EUkNfVEFSR0VUX0xPVURORVNTIik7CisgICAgfQorCisgICAgaWYgKGRyY0hlYXZ5Q29tcHJlc3Npb24gIT0gLTEpIHsKKyAgICAgICAgZXJyX2NvZGUgPQorICAgICAgICAgICAgaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsIElBX0FQSV9DTURfU0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX0RSQ19IRUFWWV9DT01QLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZHJjSGVhdnlDb21wcmVzc2lvbik7CisgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fRFJDX0hFQVZZX0NPTVAiKTsKKyAgICB9CisKKyAgICBlcnJfY29kZSA9CisgICAgICAgIGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLCBJQV9BUElfQ01EX1NFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfRFJDX0VGRkVDVF9UWVBFLCAmZHJFZmZlY3RUeXBlKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9FTkhBQUNQTFVTX0RFQ19EUkNfRUZGRUNUX1RZUEUiKTsKKworICAgIGludDMyX3QgaV9lZmZlY3RfdHlwZSwgaV90YXJnZXRfbG91ZG5lc3MsIGlfbG91ZF9ub3JtOworICAgIC8qU2V0IEVmZmVjdCBUeXBlKi8KKyAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLCBJQV9BUElfQ01EX0dFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9EUkNfRUZGRUNUX1RZUEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpX2VmZmVjdF90eXBlKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fRFJDX0VGRkVDVF9UWVBFIik7CisKKyAgICBlcnJfY29kZSA9CisgICAgICAgIGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICBJQV9EUkNfREVDX0NPTkZJR19EUkNfRUZGRUNUX1RZUEUsICZpX2VmZmVjdF90eXBlKTsKKworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0RSQ19ERUNfQ09ORklHX0RSQ19FRkZFQ1RfVFlQRSIpOworCisgICAgLypTZXQgdGFyZ2V0IGxvdWRuZXNzICovCisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKAorICAgICAgICBtWGhlYWFjQ29kZWNIYW5kbGUsIElBX0FQSV9DTURfR0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX0RSQ19UQVJHRVRfTE9VRE5FU1MsICZpX3RhcmdldF9sb3VkbmVzcyk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLAorICAgICAgICAgICAgICAgICAgICAiSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX0RSQ19UQVJHRVRfTE9VRE5FU1MiKTsKKworICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX1NFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9EUkNfREVDX0NPTkZJR19EUkNfVEFSR0VUX0xPVURORVNTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlfdGFyZ2V0X2xvdWRuZXNzKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9EUkNfREVDX0NPTkZJR19EUkNfVEFSR0VUX0xPVURORVNTIik7CisKKyAgICAvKlNldCBsb3VkX25vcm1fZmxhZyovCisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwgSUFfQVBJX0NNRF9HRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fRFJDX0xPVURfTk9STSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlfbG91ZF9ub3JtKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fRFJDX0xPVURfTk9STSIpOworCisgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfU0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0RSQ19ERUNfQ09ORklHX0RSQ19MT1VEX05PUk0sICZpX2xvdWRfbm9ybSk7CisKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9EUkNfREVDX0NPTkZJR19EUkNfTE9VRF9OT1JNIik7CisKKyAgICByZXR1cm4gSUFfTk9fRVJST1I7Cit9CisKK2NsYXNzIEMyU29mdFhhYWNEZWNGYWN0b3J5IDogcHVibGljIEMyQ29tcG9uZW50RmFjdG9yeSB7CitwdWJsaWM6CisgICAgQzJTb2Z0WGFhY0RlY0ZhY3RvcnkoKSA6IG1IZWxwZXIoc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyUmVmbGVjdG9ySGVscGVyPigKKyAgICAgICAgICAgIEdldENvZGVjMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKS0+Z2V0UGFyYW1SZWZsZWN0b3IoKSkpIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4qIGNvbnN0IGNvbXBvbmVudCwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudCopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICpjb21wb25lbnQgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KAorICAgICAgICAgICAgICAgIG5ldyBDMlNvZnRYYWFjRGVjKENPTVBPTkVOVF9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0WGFhY0RlYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiogY29uc3QgaW50ZXJmYWNlLAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50SW50ZXJmYWNlKik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmludGVyZmFjZSA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4oCisgICAgICAgICAgICAgICAgbmV3IFNpbXBsZUludGVyZmFjZTxDMlNvZnRYYWFjRGVjOjpJbnRmSW1wbD4oCisgICAgICAgICAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwgaWQsIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0WGFhY0RlYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgfkMyU29mdFhhYWNEZWNGYWN0b3J5KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gbUhlbHBlcjsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2V4dGVybiAiQyIgOjpDMkNvbXBvbmVudEZhY3RvcnkqIENyZWF0ZUNvZGVjMkZhY3RvcnkoKSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIHJldHVybiBuZXcgOjphbmRyb2lkOjpDMlNvZnRYYWFjRGVjRmFjdG9yeSgpOworfQorCitleHRlcm4gIkMiIHZvaWQgRGVzdHJveUNvZGVjMkZhY3RvcnkoOjpDMkNvbXBvbmVudEZhY3RvcnkqIGZhY3RvcnkpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgZGVsZXRlIGZhY3Rvcnk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy94YWFjL0MyU29mdFhhYWNEZWMuaCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3hhYWMvQzJTb2Z0WGFhY0RlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjODU2N2YKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy94YWFjL0MyU29mdFhhYWNEZWMuaApAQCAtMCwwICsxLDEzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9DMl9TT0ZUX1hBQUNfREVDX0hfCisjZGVmaW5lIEFORFJPSURfQzJfU09GVF9YQUFDX0RFQ19IXworI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorI2luY2x1ZGUgPFNpbXBsZUMyQ29tcG9uZW50Lmg+CisKKyNpbmNsdWRlICJpeGhlYWFjZF90eXBlX2RlZi5oIgorI2luY2x1ZGUgIml4aGVhYWNkX2Vycm9yX3N0YW5kYXJkcy5oIgorI2luY2x1ZGUgIml4aGVhYWNkX2Vycm9yX2hhbmRsZXIuaCIKKyNpbmNsdWRlICJpeGhlYWFjZF9hcGljbWRfc3RhbmRhcmRzLmgiCisjaW5jbHVkZSAiaXhoZWFhY2RfbWVtb3J5X3N0YW5kYXJkcy5oIgorI2luY2x1ZGUgIml4aGVhYWNkX2FhY19jb25maWcuaCIKKworI2luY2x1ZGUgImltcGRfYXBpY21kX3N0YW5kYXJkcy5oIgorI2luY2x1ZGUgImltcGRfZHJjX2NvbmZpZ19wYXJhbXMuaCIKKworI2RlZmluZSBNQVhfQ0hBTk5FTF9DT1VOVCAgICAgICAgICAgOCAgLyogbWF4aW11bSBudW1iZXIgb2YgYXVkaW8gY2hhbm5lbHMgdGhhdCBjYW4gYmUgZGVjb2RlZCAqLworI2RlZmluZSBNQVhfTlVNX0JMT0NLUyAgICAgICAgICAgICAgOCAgLyogbWF4aW11bSBudW1iZXIgb2YgYXVkaW8gYmxvY2tzIHRoYXQgY2FuIGJlIGRlY29kZWQgKi8KKworZXh0ZXJuICJDIiBJQV9FUlJPUkNPREUgaXhoZWFhY2RfZGVjX2FwaShwVk9JRCBwX2lhX21vZHVsZV9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICBXT1JEMzIgaV9jbWQsIFdPUkQzMiBpX2lkeCwgcFZPSUQgcHZfdmFsdWUpOworZXh0ZXJuICJDIiBJQV9FUlJPUkNPREUgaWFfZHJjX2RlY19hcGkocFZPSUQgcF9pYV9tb2R1bGVfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgV09SRDMyIGlfY21kLCBXT1JEMzIgaV9pZHgsIHBWT0lEIHB2X3ZhbHVlKTsKK2V4dGVybiAiQyIgIElBX0VSUk9SQ09ERSBpeGhlYWFjZF9nZXRfY29uZmlnX3BhcmFtKHBWT0lEIHBfaWFfcHJvY2Vzc19hcGlfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFdPUkQzMiBwaV9zYW1wX2ZyZXEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwV09SRDMyIHBpX251bV9jaGFuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFdPUkQzMiBwaV9wY21fd2Rfc3osCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwV09SRDMyIHBpX2NoYW5uZWxfbWFzayk7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEMyU29mdFhhYWNEZWMgOiBwdWJsaWMgU2ltcGxlQzJDb21wb25lbnQgeworICAgIGNsYXNzIEludGZJbXBsOworCisgICAgQzJTb2Z0WGFhY0RlYyhjb25zdCBjaGFyKiBuYW1lLCBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+JiBpbnRmSW1wbCk7CisgICAgdmlydHVhbCB+QzJTb2Z0WGFhY0RlYygpOworCisgICAgLy8gRnJvbSBTaW1wbGVDMkNvbXBvbmVudAorICAgIGMyX3N0YXR1c190IG9uSW5pdCgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uU3RvcCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZXNldCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZWxlYXNlKCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25GbHVzaF9zbSgpIG92ZXJyaWRlOworICAgIHZvaWQgcHJvY2VzcygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3QgZHJhaW4oCisgICAgICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBlbnVtIHsKKyAgICAgICAga091dHB1dERyYWluQnVmZmVyU2l6ZSAgICAgID0gMjA0OCAqIE1BWF9DSEFOTkVMX0NPVU5UICogTUFYX05VTV9CTE9DS1MsCisgICAgfTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gbUludGY7CisgICAgdm9pZCogbVhoZWFhY0NvZGVjSGFuZGxlOworICAgIHZvaWQqIG1NcGVnRERyY0hhbmRsZTsKKyAgICB1aW50MzJfdCBtSW5wdXRCdWZmZXJTaXplOworICAgIHVpbnQzMl90IG1PdXRwdXRGcmFtZUxlbmd0aDsKKyAgICBpbnQ4X3QqIG1JbnB1dEJ1ZmZlcjsKKyAgICBpbnQ4X3QqIG1PdXRwdXRCdWZmZXI7CisgICAgaW50MzJfdCBtU2FtcEZyZXE7CisgICAgaW50MzJfdCBtTnVtQ2hhbm5lbHM7CisgICAgaW50MzJfdCBtUGNtV2RTejsKKyAgICBpbnQzMl90IG1DaGFubmVsTWFzazsKKyAgICBpbnQzMl90IG1OdW1PdXRCeXRlczsKKyAgICB1aW50NjRfdCBtQ3VyRnJhbWVJbmRleDsKKyAgICB1aW50NjRfdCBtQ3VyVGltZXN0YW1wOworICAgIGJvb2wgbUlzQ29kZWNJbml0aWFsaXplZDsKKyAgICBib29sIG1Jc0NvZGVjQ29uZmlnRmx1c2hSZXF1aXJlZDsKKyAgICBpbnQ4X3QqIG1EcmNJbkJ1ZjsKKyAgICBpbnQ4X3QqIG1EcmNPdXRCdWY7CisgICAgaW50MzJfdCBtTXBlZ0REUkNQcmVzZW50OworICAgIGludDMyX3QgbURSQ0ZsYWc7CisKKyAgICBWZWN0b3I8dm9pZCo+IG1NZW1vcnlWZWM7CisgICAgVmVjdG9yPHZvaWQqPiBtRHJjTWVtb3J5VmVjOworCisgICAgc2l6ZV90IG1JbnB1dEJ1ZmZlckNvdW50IF9fdW51c2VkOworICAgIHNpemVfdCBtT3V0cHV0QnVmZmVyQ291bnQgX191bnVzZWQ7CisgICAgYm9vbCBtU2lnbmFsbGVkT3V0cHV0RW9zOworICAgIGJvb2wgbVNpZ25hbGxlZEVycm9yOworICAgIGNoYXIqIG1PdXRwdXREcmFpbkJ1ZmZlcjsKKyAgICB1aW50MzJfdCBtT3V0cHV0RHJhaW5CdWZmZXJXcml0ZVBvczsKKworICAgIElBX0VSUk9SQ09ERSBpbml0RGVjb2RlcigpOworICAgIElBX0VSUk9SQ09ERSBzZXREcmNQYXJhbWV0ZXIoKTsKKyAgICBJQV9FUlJPUkNPREUgY29uZmlnZmx1c2hEZWNvZGUoKTsKKyAgICBJQV9FUlJPUkNPREUgZHJhaW5EZWNvZGVyKCk7CisgICAgdm9pZCBmaW5pc2hXb3JrKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+JiBwb29sKTsKKworICAgIElBX0VSUk9SQ09ERSBpbml0WEFBQ0RyYygpOworICAgIElBX0VSUk9SQ09ERSBpbml0WEFBQ0RlY29kZXIoKTsKKyAgICBJQV9FUlJPUkNPREUgZGVJbml0WEFBQ0RlY29kZXIoKTsKKyAgICBJQV9FUlJPUkNPREUgaW5pdE1QRUdERERyYygpOworICAgIElBX0VSUk9SQ09ERSBkZUluaXRNUEVHREREcmMoKTsKKyAgICBJQV9FUlJPUkNPREUgY29uZmlnWEFBQ0RlY29kZXIodWludDhfdCogaW5CdWZmZXIsIHVpbnQzMl90IGluQnVmZmVyTGVuZ3RoKTsKKyAgICBpbnQgY29uZmlnTVBFR0REcmMoKTsKKyAgICBJQV9FUlJPUkNPREUgZGVjb2RlWEFBQ1N0cmVhbSh1aW50OF90KiBpbkJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpbkJ1ZmZlckxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBieXRlc0NvbnN1bWVkLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIG91dEJ5dGVzKTsKKyAgICBJQV9FUlJPUkNPREUgZ2V0WEFBQ1N0cmVhbUluZm8oKTsKKyAgICBJQV9FUlJPUkNPREUgc2V0WEFBQ0RSQ0luZm8oaW50MzJfdCBkcmNDdXQsIGludDMyX3QgZHJjQm9vc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZHJjUmVmTGV2ZWwsIGludDMyX3QgZHJjSGVhdnlDb21wcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkckVmZmVjdFR5cGUpOworCisgICAgQzJfRE9fTk9UX0NPUFkoQzJTb2Z0WGFhY0RlYyk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEMyX1NPRlRfWEFBQ19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2RvY3MvZG94eWZpbHRlci5zaCBiL21lZGlhL2NvZGVjMi9kb2NzL2RveHlmaWx0ZXIuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDgxMzE1MwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9kb2NzL2RveHlmaWx0ZXIuc2gKQEAgLTAsMCArMSwxMDAgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbjMKK2ltcG9ydCByZSwgc3lzCisKK2dsb2JhbCBpbl9jb21tZW50LCBjdXJyZW50LCBpbmRlbnQsIGhvbGQKK2luX2NvbW1lbnQsIGN1cnJlbnQsIGluZGVudCwgaG9sZCA9IEZhbHNlLCBOb25lLCAnJywgW10KKworY2xhc3MgQ2hhbmdlQ1N0eWxlQ29tbWVudHNUb0RveHk6CisgICAgZGVmIGR1bXBfaG9sZCgpOgorICAgICAgICBnbG9iYWwgaG9sZAorICAgICAgICBmb3IgaCBpbiBob2xkOgorICAgICAgICAgICAgcHJpbnQoaCwgZW5kPScnKQorICAgICAgICBob2xkWzpdID0gW10KKworICAgIGRlZiBkb3h5X2hvbGQoKToKKyAgICAgICAgZ2xvYmFsIGN1cnJlbnQsIGhvbGQKKyAgICAgICAgaWYgY3VycmVudCA9PSAnLy8nOgorICAgICAgICAgICAgZm9yIGggaW4gaG9sZDoKKyAgICAgICAgICAgICAgICBwcmludChyZS5zdWIocideKCAqLy8oPyEvKSknLCByJ1wxLycsIGgpLCBlbmQ9JycpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmaXJzdCA9IFRydWUKKyAgICAgICAgICAgIGZvciBoIGluIGhvbGQ6CisgICAgICAgICAgICAgICAgaWYgZmlyc3Q6CisgICAgICAgICAgICAgICAgICAgIGggPSByZS5zdWIocideKCAqL1sqXSg/IVsqXSkpJywgcidcMSonLCBoKQorICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IEZhbHNlCisgICAgICAgICAgICAgICAgcHJpbnQoaCwgZW5kPScnKQorICAgICAgICBob2xkWzpdID0gW10KKworICAgIGRlZiBwcm9jZXNzX2NvbW1lbnQodCwgaW5kLCBsaW5lKToKKyAgICAgICAgZ2xvYmFsIGN1cnJlbnQsIGluZGVudCwgaG9sZAorICAgICAgICBpZiB0ICE9IGN1cnJlbnQgb3IgaW5kIG5vdCBpbiAoaW5kZW50LCBpbmRlbnQgKyAnICcpOgorICAgICAgICAgICAgZHVtcF9ob2xkKCkKKyAgICAgICAgICAgIGN1cnJlbnQsIGluZGVudCA9IHQsIGluZAorICAgICAgICBob2xkLmFwcGVuZChsaW5lKQorCisgICAgZGVmIHByb2Nlc3NfbGluZShpbmQsIGxpbmUpOgorICAgICAgICBnbG9iYWwgY3VycmVudCwgaW5kZW50CisgICAgICAgIGlmIGluZCBpbiAoaW5kZW50LCAnJyk6CisgICAgICAgICAgICBkb3h5X2hvbGQoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZHVtcF9ob2xkKCkKKyAgICAgICAgY3VycmVudCwgaW5kZW50ID0gTm9uZSwgTm9uZQorICAgICAgICBwcmludChsaW5lLCBlbmQ9JycpCisKKyAgICBkZWYgcHJvY2VzcyhzZWxmLCBpbnB1dCwgcGF0aCk6CisgICAgICAgIGZvciBsaW5lIGluIGlucHV0OgorICAgICAgICAgICAgaW5kID0gcmUubWF0Y2gocideKCAqKScsIGxpbmUpLmdyb3VwKDEpCisgICAgICAgICAgICBpZiBpbl9jb21tZW50OgorICAgICAgICAgICAgICAgICMgVE9ETzogdGhpcyBpcyBub3QgcXVpdGUgcmlnaHQsIGJ1dCBnb29kIGVub3VnaAorICAgICAgICAgICAgICAgIG0gPSByZS5tYXRjaChyJ14gKlsqXS8nLCBsaW5lKQorICAgICAgICAgICAgICAgIGlmIG06CisgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NfY29tbWVudCgnLyonLCBpbmQsIGxpbmUpCisgICAgICAgICAgICAgICAgICAgIGluX2NvbW1lbnQgPSBGYWxzZQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NfY29tbWVudCgnLyonLCBpbmQsIGxpbmUpCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIG0gPSByZS5tYXRjaChyJ14gKi8vJywgbGluZSkKKyAgICAgICAgICAgIGlmIG06CisgICAgICAgICAgICAgICAgIyBvbmUtbGluZSBjb21tZW50CisgICAgICAgICAgICAgICAgcHJvY2Vzc19jb21tZW50KCcvLycsIGluZCwgbGluZSkKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgbSA9IHJlLm1hdGNoKHInXiAqL1sqXScsIGxpbmUpCisgICAgICAgICAgICBpZiBtOgorICAgICAgICAgICAgICAgICMgbXVsdGktbGluZSBjb21tZW50CisgICAgICAgICAgICAgICAgcHJvY2Vzc19jb21tZW50KCcvKicsIGluZCwgbGluZSkKKyAgICAgICAgICAgICAgICAjIFRPRE86IHRoaXMgaXMgbm90IHF1aXRlIHJpZ2h0LCBidXQgZ29vZCBlbm91Z2gKKyAgICAgICAgICAgICAgICBpbl9jb21tZW50ID0gbm90IHJlLm1hdGNoKHInXiAqWypdLycsIGxpbmUpCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIHByb2Nlc3NfbGluZShpbmQsIGxpbmUpCisKK2NsYXNzIEF1dG9Hcm91cDoKKyAgICBkZWYgcHJvY2VzcyhzZWxmLCBpbnB1dCwgcGF0aCk6CisgICAgICAgIGlmICcvY29kZWMyL2luY2x1ZGUvJyBpbiBwYXRoOgorICAgICAgICAgICAgZ3JvdXAgPSAnQVBJIENvZGVjMiBBUEknCisgICAgICAgIGVsaWYgRmFsc2U6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgZWxpZiAnL2NvZGVjMi92bmRrLycgaW4gcGF0aDoKKyAgICAgICAgICAgIGdyb3VwID0gJ1ZOREsgUGxhdGZvcm0gcHJvdmlkZWQgZ2x1ZScKKyAgICAgICAgZWxpZiAnL2NvZGVjMi90ZXN0cy8nIGluIHBhdGg6CisgICAgICAgICAgICBncm91cCA9ICdUZXN0cyBVbml0IHRlc3RzJworICAgICAgICBlbHNlOgorICAgICAgICAgICAgZ3JvdXAgPSAnUmFuZG9tIE1pc2MuIHNhbmRib3gnCisKKyAgICAgICAgcHJpbnQoJyN1bmRlZiBfX0FQUExFX18nKQorCisgICAgICAgIGZvciBsaW5lIGluIGlucHV0OgorICAgICAgICAgICAgaWYgcmUubWF0Y2gocidebmFtZXNwYWNlIGFuZHJvaWQgeycsIGxpbmUpOgorICAgICAgICAgICAgICAgIHByaW50KGxpbmUsIGVuZD0nJykKKyAgICAgICAgICAgICAgICBwcmludCgpCisgICAgICAgICAgICAgICAgcHJpbnQocicvLy8gXGFkZHRvZ3JvdXAge30nLmZvcm1hdChncm91cCkpCisgICAgICAgICAgICAgICAgcHJpbnQocicvLy8gQHsnKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBlbGlmIHJlLm1hdGNoKHInXn0gKy8vICtuYW1lc3BhY2UnLCBsaW5lKToKKyAgICAgICAgICAgICAgICBwcmludChyJy8vLyBAfScpCisgICAgICAgICAgICAgICAgcHJpbnQoKQorICAgICAgICAgICAgcHJpbnQobGluZSwgZW5kPScnKQorCitQID0gQXV0b0dyb3VwKCkKK2ZvciBwYXRoIGluIHN5cy5hcmd2WzE6XToKKyAgICB3aXRoIG9wZW4ocGF0aCwgJ3J0JykgYXMgaW5wdXQ6CisgICAgICAgIFAucHJvY2VzcyhpbnB1dCwgcGF0aCkKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9kb2NzL2RveHlnZW4uY29uZmlnIGIvbWVkaWEvY29kZWMyL2RvY3MvZG94eWdlbi5jb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWMzYmVhMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9kb2NzL2RveHlnZW4uY29uZmlnCkBAIC0wLDAgKzEsMjQ0NiBAQAorIyBEb3h5ZmlsZSAxLjguMTEKKworIyBUaGlzIGZpbGUgZGVzY3JpYmVzIHRoZSBzZXR0aW5ncyB0byBiZSB1c2VkIGJ5IHRoZSBkb2N1bWVudGF0aW9uIHN5c3RlbQorIyBkb3h5Z2VuICh3d3cuZG94eWdlbi5vcmcpIGZvciBhIHByb2plY3QuCisjCisjIEFsbCB0ZXh0IGFmdGVyIGEgZG91YmxlIGhhc2ggKCMjKSBpcyBjb25zaWRlcmVkIGEgY29tbWVudCBhbmQgaXMgcGxhY2VkIGluCisjIGZyb250IG9mIHRoZSBUQUcgaXQgaXMgcHJlY2VkaW5nLgorIworIyBBbGwgdGV4dCBhZnRlciBhIHNpbmdsZSBoYXNoICgjKSBpcyBjb25zaWRlcmVkIGEgY29tbWVudCBhbmQgd2lsbCBiZSBpZ25vcmVkLgorIyBUaGUgZm9ybWF0IGlzOgorIyBUQUcgPSB2YWx1ZSBbdmFsdWUsIC4uLl0KKyMgRm9yIGxpc3RzLCBpdGVtcyBjYW4gYWxzbyBiZSBhcHBlbmRlZCB1c2luZzoKKyMgVEFHICs9IHZhbHVlIFt2YWx1ZSwgLi4uXQorIyBWYWx1ZXMgdGhhdCBjb250YWluIHNwYWNlcyBzaG91bGQgYmUgcGxhY2VkIGJldHdlZW4gcXVvdGVzIChcIiBcIikuCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgUHJvamVjdCByZWxhdGVkIGNvbmZpZ3VyYXRpb24gb3B0aW9ucworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIFRoaXMgdGFnIHNwZWNpZmllcyB0aGUgZW5jb2RpbmcgdXNlZCBmb3IgYWxsIGNoYXJhY3RlcnMgaW4gdGhlIGNvbmZpZyBmaWxlCisjIHRoYXQgZm9sbG93LiBUaGUgZGVmYXVsdCBpcyBVVEYtOCB3aGljaCBpcyBhbHNvIHRoZSBlbmNvZGluZyB1c2VkIGZvciBhbGwgdGV4dAorIyBiZWZvcmUgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgdGhpcyB0YWcuIERveHlnZW4gdXNlcyBsaWJpY29udiAob3IgdGhlIGljb252CisjIGJ1aWx0IGludG8gbGliYykgZm9yIHRoZSB0cmFuc2NvZGluZy4gU2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9saWJpY29udgorIyBmb3IgdGhlIGxpc3Qgb2YgcG9zc2libGUgZW5jb2RpbmdzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogVVRGLTguCisKK0RPWFlGSUxFX0VOQ09ESU5HICAgICAgPSBVVEYtOAorCisjIFRoZSBQUk9KRUNUX05BTUUgdGFnIGlzIGEgc2luZ2xlIHdvcmQgKG9yIGEgc2VxdWVuY2Ugb2Ygd29yZHMgc3Vycm91bmRlZCBieQorIyBkb3VibGUtcXVvdGVzLCB1bmxlc3MgeW91IGFyZSB1c2luZyBEb3h5d2l6YXJkKSB0aGF0IHNob3VsZCBpZGVudGlmeSB0aGUKKyMgcHJvamVjdCBmb3Igd2hpY2ggdGhlIGRvY3VtZW50YXRpb24gaXMgZ2VuZXJhdGVkLiBUaGlzIG5hbWUgaXMgdXNlZCBpbiB0aGUKKyMgdGl0bGUgb2YgbW9zdCBnZW5lcmF0ZWQgcGFnZXMgYW5kIGluIGEgZmV3IG90aGVyIHBsYWNlcy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE15IFByb2plY3QuCisKK1BST0pFQ1RfTkFNRSAgICAgICAgICAgPSBDb2RlYzIKKworIyBUaGUgUFJPSkVDVF9OVU1CRVIgdGFnIGNhbiBiZSB1c2VkIHRvIGVudGVyIGEgcHJvamVjdCBvciByZXZpc2lvbiBudW1iZXIuIFRoaXMKKyMgY291bGQgYmUgaGFuZHkgZm9yIGFyY2hpdmluZyB0aGUgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24gb3IgaWYgc29tZSB2ZXJzaW9uCisjIGNvbnRyb2wgc3lzdGVtIGlzIHVzZWQuCisKK1BST0pFQ1RfTlVNQkVSICAgICAgICAgPSAKKworIyBVc2luZyB0aGUgUFJPSkVDVF9CUklFRiB0YWcgb25lIGNhbiBwcm92aWRlIGFuIG9wdGlvbmFsIG9uZSBsaW5lIGRlc2NyaXB0aW9uCisjIGZvciBhIHByb2plY3QgdGhhdCBhcHBlYXJzIGF0IHRoZSB0b3Agb2YgZWFjaCBwYWdlIGFuZCBzaG91bGQgZ2l2ZSB2aWV3ZXIgYQorIyBxdWljayBpZGVhIGFib3V0IHRoZSBwdXJwb3NlIG9mIHRoZSBwcm9qZWN0LiBLZWVwIHRoZSBkZXNjcmlwdGlvbiBzaG9ydC4KKworUFJPSkVDVF9CUklFRiAgICAgICAgICA9IAorCisjIFdpdGggdGhlIFBST0pFQ1RfTE9HTyB0YWcgb25lIGNhbiBzcGVjaWZ5IGEgbG9nbyBvciBhbiBpY29uIHRoYXQgaXMgaW5jbHVkZWQKKyMgaW4gdGhlIGRvY3VtZW50YXRpb24uIFRoZSBtYXhpbXVtIGhlaWdodCBvZiB0aGUgbG9nbyBzaG91bGQgbm90IGV4Y2VlZCA1NQorIyBwaXhlbHMgYW5kIHRoZSBtYXhpbXVtIHdpZHRoIHNob3VsZCBub3QgZXhjZWVkIDIwMCBwaXhlbHMuIERveHlnZW4gd2lsbCBjb3B5CisjIHRoZSBsb2dvIHRvIHRoZSBvdXRwdXQgZGlyZWN0b3J5LgorCitQUk9KRUNUX0xPR08gICAgICAgICAgID0gCisKKyMgVGhlIE9VVFBVVF9ESVJFQ1RPUlkgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgKHJlbGF0aXZlIG9yIGFic29sdXRlKSBwYXRoCisjIGludG8gd2hpY2ggdGhlIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uIHdpbGwgYmUgd3JpdHRlbi4gSWYgYSByZWxhdGl2ZSBwYXRoIGlzCisjIGVudGVyZWQsIGl0IHdpbGwgYmUgcmVsYXRpdmUgdG8gdGhlIGxvY2F0aW9uIHdoZXJlIGRveHlnZW4gd2FzIHN0YXJ0ZWQuIElmCisjIGxlZnQgYmxhbmsgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHdpbGwgYmUgdXNlZC4KKworT1VUUFVUX0RJUkVDVE9SWSAgICAgICA9IG91dC90YXJnZXQvY29tbW9uL2RvY3MvY29kZWMyL2FwaQorCisjIElmIHRoZSBDUkVBVEVfU1VCRElSUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBjcmVhdGUgNDA5NiBzdWItCisjIGRpcmVjdG9yaWVzIChpbiAyIGxldmVscykgdW5kZXIgdGhlIG91dHB1dCBkaXJlY3Rvcnkgb2YgZWFjaCBvdXRwdXQgZm9ybWF0IGFuZAorIyB3aWxsIGRpc3RyaWJ1dGUgdGhlIGdlbmVyYXRlZCBmaWxlcyBvdmVyIHRoZXNlIGRpcmVjdG9yaWVzLiBFbmFibGluZyB0aGlzCisjIG9wdGlvbiBjYW4gYmUgdXNlZnVsIHdoZW4gZmVlZGluZyBkb3h5Z2VuIGEgaHVnZSBhbW91bnQgb2Ygc291cmNlIGZpbGVzLCB3aGVyZQorIyBwdXR0aW5nIGFsbCBnZW5lcmF0ZWQgZmlsZXMgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IHdvdWxkIG90aGVyd2lzZSBjYXVzZXMKKyMgcGVyZm9ybWFuY2UgcHJvYmxlbXMgZm9yIHRoZSBmaWxlIHN5c3RlbS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitDUkVBVEVfU1VCRElSUyAgICAgICAgID0gTk8KKworIyBJZiB0aGUgQUxMT1dfVU5JQ09ERV9OQU1FUyB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGFsbG93IG5vbi1BU0NJSQorIyBjaGFyYWN0ZXJzIHRvIGFwcGVhciBpbiB0aGUgbmFtZXMgb2YgZ2VuZXJhdGVkIGZpbGVzLiBJZiBzZXQgdG8gTk8sIG5vbi1BU0NJSQorIyBjaGFyYWN0ZXJzIHdpbGwgYmUgZXNjYXBlZCwgZm9yIGV4YW1wbGUgX3hFM194ODFfeDg0IHdpbGwgYmUgdXNlZCBmb3IgVW5pY29kZQorIyBVKzMwNDQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworQUxMT1dfVU5JQ09ERV9OQU1FUyAgICA9IE5PCisKKyMgVGhlIE9VVFBVVF9MQU5HVUFHRSB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBsYW5ndWFnZSBpbiB3aGljaCBhbGwKKyMgZG9jdW1lbnRhdGlvbiBnZW5lcmF0ZWQgYnkgZG94eWdlbiBpcyB3cml0dGVuLiBEb3h5Z2VuIHdpbGwgdXNlIHRoaXMKKyMgaW5mb3JtYXRpb24gdG8gZ2VuZXJhdGUgYWxsIGNvbnN0YW50IG91dHB1dCBpbiB0aGUgcHJvcGVyIGxhbmd1YWdlLgorIyBQb3NzaWJsZSB2YWx1ZXMgYXJlOiBBZnJpa2FhbnMsIEFyYWJpYywgQXJtZW5pYW4sIEJyYXppbGlhbiwgQ2F0YWxhbiwgQ2hpbmVzZSwKKyMgQ2hpbmVzZS1UcmFkaXRpb25hbCwgQ3JvYXRpYW4sIEN6ZWNoLCBEYW5pc2gsIER1dGNoLCBFbmdsaXNoIChVbml0ZWQgU3RhdGVzKSwKKyMgRXNwZXJhbnRvLCBGYXJzaSAoUGVyc2lhbiksIEZpbm5pc2gsIEZyZW5jaCwgR2VybWFuLCBHcmVlaywgSHVuZ2FyaWFuLAorIyBJbmRvbmVzaWFuLCBJdGFsaWFuLCBKYXBhbmVzZSwgSmFwYW5lc2UtZW4gKEphcGFuZXNlIHdpdGggRW5nbGlzaCBtZXNzYWdlcyksCisjIEtvcmVhbiwgS29yZWFuLWVuIChLb3JlYW4gd2l0aCBFbmdsaXNoIG1lc3NhZ2VzKSwgTGF0dmlhbiwgTGl0aHVhbmlhbiwKKyMgTWFjZWRvbmlhbiwgTm9yd2VnaWFuLCBQZXJzaWFuIChGYXJzaSksIFBvbGlzaCwgUG9ydHVndWVzZSwgUm9tYW5pYW4sIFJ1c3NpYW4sCisjIFNlcmJpYW4sIFNlcmJpYW4tQ3lyaWxsaWMsIFNsb3ZhaywgU2xvdmVuZSwgU3BhbmlzaCwgU3dlZGlzaCwgVHVya2lzaCwKKyMgVWtyYWluaWFuIGFuZCBWaWV0bmFtZXNlLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogRW5nbGlzaC4KKworT1VUUFVUX0xBTkdVQUdFICAgICAgICA9IEVuZ2xpc2gKKworIyBJZiB0aGUgQlJJRUZfTUVNQkVSX0RFU0MgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBpbmNsdWRlIGJyaWVmIG1lbWJlcgorIyBkZXNjcmlwdGlvbnMgYWZ0ZXIgdGhlIG1lbWJlcnMgdGhhdCBhcmUgbGlzdGVkIGluIHRoZSBmaWxlIGFuZCBjbGFzcworIyBkb2N1bWVudGF0aW9uIChzaW1pbGFyIHRvIEphdmFkb2MpLiBTZXQgdG8gTk8gdG8gZGlzYWJsZSB0aGlzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitCUklFRl9NRU1CRVJfREVTQyAgICAgID0gWUVTCisKKyMgSWYgdGhlIFJFUEVBVF9CUklFRiB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIHByZXBlbmQgdGhlIGJyaWVmCisjIGRlc2NyaXB0aW9uIG9mIGEgbWVtYmVyIG9yIGZ1bmN0aW9uIGJlZm9yZSB0aGUgZGV0YWlsZWQgZGVzY3JpcHRpb24KKyMKKyMgTm90ZTogSWYgYm90aCBISURFX1VORE9DX01FTUJFUlMgYW5kIEJSSUVGX01FTUJFUl9ERVNDIGFyZSBzZXQgdG8gTk8sIHRoZQorIyBicmllZiBkZXNjcmlwdGlvbnMgd2lsbCBiZSBjb21wbGV0ZWx5IHN1cHByZXNzZWQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK1JFUEVBVF9CUklFRiAgICAgICAgICAgPSBZRVMKKworIyBUaGlzIHRhZyBpbXBsZW1lbnRzIGEgcXVhc2ktaW50ZWxsaWdlbnQgYnJpZWYgZGVzY3JpcHRpb24gYWJicmV2aWF0b3IgdGhhdCBpcworIyB1c2VkIHRvIGZvcm0gdGhlIHRleHQgaW4gdmFyaW91cyBsaXN0aW5ncy4gRWFjaCBzdHJpbmcgaW4gdGhpcyBsaXN0LCBpZiBmb3VuZAorIyBhcyB0aGUgbGVhZGluZyB0ZXh0IG9mIHRoZSBicmllZiBkZXNjcmlwdGlvbiwgd2lsbCBiZSBzdHJpcHBlZCBmcm9tIHRoZSB0ZXh0CisjIGFuZCB0aGUgcmVzdWx0LCBhZnRlciBwcm9jZXNzaW5nIHRoZSB3aG9sZSBsaXN0LCBpcyB1c2VkIGFzIHRoZSBhbm5vdGF0ZWQKKyMgdGV4dC4gT3RoZXJ3aXNlLCB0aGUgYnJpZWYgZGVzY3JpcHRpb24gaXMgdXNlZCBhcy1pcy4gSWYgbGVmdCBibGFuaywgdGhlCisjIGZvbGxvd2luZyB2YWx1ZXMgYXJlIHVzZWQgKCRuYW1lIGlzIGF1dG9tYXRpY2FsbHkgcmVwbGFjZWQgd2l0aCB0aGUgbmFtZSBvZgorIyB0aGUgZW50aXR5KTpUaGUgJG5hbWUgY2xhc3MsIFRoZSAkbmFtZSB3aWRnZXQsIFRoZSAkbmFtZSBmaWxlLCBpcywgcHJvdmlkZXMsCisjIHNwZWNpZmllcywgY29udGFpbnMsIHJlcHJlc2VudHMsIGEsIGFuIGFuZCB0aGUuCisKK0FCQlJFVklBVEVfQlJJRUYgICAgICAgPSAiVGhlICRuYW1lIGNsYXNzIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSAkbmFtZSB3aWRnZXQiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiVGhlICRuYW1lIGZpbGUiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpcyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXMgXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmllcyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbnMgXAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlcHJlc2VudHMgXAorICAgICAgICAgICAgICAgICAgICAgICAgIGEgXAorICAgICAgICAgICAgICAgICAgICAgICAgIGFuIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0aGUKKworIyBJZiB0aGUgQUxXQVlTX0RFVEFJTEVEX1NFQyBhbmQgUkVQRUFUX0JSSUVGIHRhZ3MgYXJlIGJvdGggc2V0IHRvIFlFUyB0aGVuCisjIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIGRldGFpbGVkIHNlY3Rpb24gZXZlbiBpZiB0aGVyZSBpcyBvbmx5IGEgYnJpZWYKKyMgZGVzY3JpcHRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworQUxXQVlTX0RFVEFJTEVEX1NFQyAgICA9IE5PCisKKyMgSWYgdGhlIElOTElORV9JTkhFUklURURfTUVNQiB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIHNob3cgYWxsCisjIGluaGVyaXRlZCBtZW1iZXJzIG9mIGEgY2xhc3MgaW4gdGhlIGRvY3VtZW50YXRpb24gb2YgdGhhdCBjbGFzcyBhcyBpZiB0aG9zZQorIyBtZW1iZXJzIHdlcmUgb3JkaW5hcnkgY2xhc3MgbWVtYmVycy4gQ29uc3RydWN0b3JzLCBkZXN0cnVjdG9ycyBhbmQgYXNzaWdubWVudAorIyBvcGVyYXRvcnMgb2YgdGhlIGJhc2UgY2xhc3NlcyB3aWxsIG5vdCBiZSBzaG93bi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitJTkxJTkVfSU5IRVJJVEVEX01FTUIgID0gWUVTCisKKyMgSWYgdGhlIEZVTExfUEFUSF9OQU1FUyB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIHByZXBlbmQgdGhlIGZ1bGwgcGF0aAorIyBiZWZvcmUgZmlsZXMgbmFtZSBpbiB0aGUgZmlsZSBsaXN0IGFuZCBpbiB0aGUgaGVhZGVyIGZpbGVzLiBJZiBzZXQgdG8gTk8gdGhlCisjIHNob3J0ZXN0IHBhdGggdGhhdCBtYWtlcyB0aGUgZmlsZSBuYW1lIHVuaXF1ZSB3aWxsIGJlIHVzZWQKKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworRlVMTF9QQVRIX05BTUVTICAgICAgICA9IFlFUworCisjIFRoZSBTVFJJUF9GUk9NX1BBVEggdGFnIGNhbiBiZSB1c2VkIHRvIHN0cmlwIGEgdXNlci1kZWZpbmVkIHBhcnQgb2YgdGhlIHBhdGguCisjIFN0cmlwcGluZyBpcyBvbmx5IGRvbmUgaWYgb25lIG9mIHRoZSBzcGVjaWZpZWQgc3RyaW5ncyBtYXRjaGVzIHRoZSBsZWZ0LWhhbmQKKyMgcGFydCBvZiB0aGUgcGF0aC4gVGhlIHRhZyBjYW4gYmUgdXNlZCB0byBzaG93IHJlbGF0aXZlIHBhdGhzIGluIHRoZSBmaWxlIGxpc3QuCisjIElmIGxlZnQgYmxhbmsgdGhlIGRpcmVjdG9yeSBmcm9tIHdoaWNoIGRveHlnZW4gaXMgcnVuIGlzIHVzZWQgYXMgdGhlIHBhdGggdG8KKyMgc3RyaXAuCisjCisjIE5vdGUgdGhhdCB5b3UgY2FuIHNwZWNpZnkgYWJzb2x1dGUgcGF0aHMgaGVyZSwgYnV0IGFsc28gcmVsYXRpdmUgcGF0aHMsIHdoaWNoCisjIHdpbGwgYmUgcmVsYXRpdmUgZnJvbSB0aGUgZGlyZWN0b3J5IHdoZXJlIGRveHlnZW4gaXMgc3RhcnRlZC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEZVTExfUEFUSF9OQU1FUyBpcyBzZXQgdG8gWUVTLgorCitTVFJJUF9GUk9NX1BBVEggICAgICAgID0gZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlYzIKKworIyBUaGUgU1RSSVBfRlJPTV9JTkNfUEFUSCB0YWcgY2FuIGJlIHVzZWQgdG8gc3RyaXAgYSB1c2VyLWRlZmluZWQgcGFydCBvZiB0aGUKKyMgcGF0aCBtZW50aW9uZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gb2YgYSBjbGFzcywgd2hpY2ggdGVsbHMgdGhlIHJlYWRlciB3aGljaAorIyBoZWFkZXIgZmlsZSB0byBpbmNsdWRlIGluIG9yZGVyIHRvIHVzZSBhIGNsYXNzLiBJZiBsZWZ0IGJsYW5rIG9ubHkgdGhlIG5hbWUgb2YKKyMgdGhlIGhlYWRlciBmaWxlIGNvbnRhaW5pbmcgdGhlIGNsYXNzIGRlZmluaXRpb24gaXMgdXNlZC4gT3RoZXJ3aXNlIG9uZSBzaG91bGQKKyMgc3BlY2lmeSB0aGUgbGlzdCBvZiBpbmNsdWRlIHBhdGhzIHRoYXQgYXJlIG5vcm1hbGx5IHBhc3NlZCB0byB0aGUgY29tcGlsZXIKKyMgdXNpbmcgdGhlIC1JIGZsYWcuCisKK1NUUklQX0ZST01fSU5DX1BBVEggICAgPSAKKworIyBJZiB0aGUgU0hPUlRfTkFNRVMgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBtdWNoIHNob3J0ZXIgKGJ1dAorIyBsZXNzIHJlYWRhYmxlKSBmaWxlIG5hbWVzLiBUaGlzIGNhbiBiZSB1c2VmdWwgaXMgeW91ciBmaWxlIHN5c3RlbXMgZG9lc24ndAorIyBzdXBwb3J0IGxvbmcgbmFtZXMgbGlrZSBvbiBET1MsIE1hYywgb3IgQ0QtUk9NLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK1NIT1JUX05BTUVTICAgICAgICAgICAgPSBOTworCisjIElmIHRoZSBKQVZBRE9DX0FVVE9CUklFRiB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBpbnRlcnByZXQgdGhlCisjIGZpcnN0IGxpbmUgKHVudGlsIHRoZSBmaXJzdCBkb3QpIG9mIGEgSmF2YWRvYy1zdHlsZSBjb21tZW50IGFzIHRoZSBicmllZgorIyBkZXNjcmlwdGlvbi4gSWYgc2V0IHRvIE5PLCB0aGUgSmF2YWRvYy1zdHlsZSB3aWxsIGJlaGF2ZSBqdXN0IGxpa2UgcmVndWxhciBRdC0KKyMgc3R5bGUgY29tbWVudHMgKHRodXMgcmVxdWlyaW5nIGFuIGV4cGxpY2l0IEBicmllZiBjb21tYW5kIGZvciBhIGJyaWVmCisjIGRlc2NyaXB0aW9uLikKKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitKQVZBRE9DX0FVVE9CUklFRiAgICAgID0gWUVTCisKKyMgSWYgdGhlIFFUX0FVVE9CUklFRiB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBpbnRlcnByZXQgdGhlIGZpcnN0CisjIGxpbmUgKHVudGlsIHRoZSBmaXJzdCBkb3QpIG9mIGEgUXQtc3R5bGUgY29tbWVudCBhcyB0aGUgYnJpZWYgZGVzY3JpcHRpb24uIElmCisjIHNldCB0byBOTywgdGhlIFF0LXN0eWxlIHdpbGwgYmVoYXZlIGp1c3QgbGlrZSByZWd1bGFyIFF0LXN0eWxlIGNvbW1lbnRzICh0aHVzCisjIHJlcXVpcmluZyBhbiBleHBsaWNpdCBcYnJpZWYgY29tbWFuZCBmb3IgYSBicmllZiBkZXNjcmlwdGlvbi4pCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworUVRfQVVUT0JSSUVGICAgICAgICAgICA9IFlFUworCisjIFRoZSBNVUxUSUxJTkVfQ1BQX0lTX0JSSUVGIHRhZyBjYW4gYmUgc2V0IHRvIFlFUyB0byBtYWtlIGRveHlnZW4gdHJlYXQgYQorIyBtdWx0aS1saW5lIEMrKyBzcGVjaWFsIGNvbW1lbnQgYmxvY2sgKGkuZS4gYSBibG9jayBvZiAvLyEgb3IgLy8vIGNvbW1lbnRzKSBhcworIyBhIGJyaWVmIGRlc2NyaXB0aW9uLiBUaGlzIHVzZWQgdG8gYmUgdGhlIGRlZmF1bHQgYmVoYXZpb3IuIFRoZSBuZXcgZGVmYXVsdCBpcworIyB0byB0cmVhdCBhIG11bHRpLWxpbmUgQysrIGNvbW1lbnQgYmxvY2sgYXMgYSBkZXRhaWxlZCBkZXNjcmlwdGlvbi4gU2V0IHRoaXMKKyMgdGFnIHRvIFlFUyBpZiB5b3UgcHJlZmVyIHRoZSBvbGQgYmVoYXZpb3IgaW5zdGVhZC4KKyMKKyMgTm90ZSB0aGF0IHNldHRpbmcgdGhpcyB0YWcgdG8gWUVTIGFsc28gbWVhbnMgdGhhdCByYXRpb25hbCByb3NlIGNvbW1lbnRzIGFyZQorIyBub3QgcmVjb2duaXplZCBhbnkgbW9yZS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitNVUxUSUxJTkVfQ1BQX0lTX0JSSUVGID0gTk8KKworIyBJZiB0aGUgSU5IRVJJVF9ET0NTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gYW4gdW5kb2N1bWVudGVkIG1lbWJlciBpbmhlcml0cyB0aGUKKyMgZG9jdW1lbnRhdGlvbiBmcm9tIGFueSBkb2N1bWVudGVkIG1lbWJlciB0aGF0IGl0IHJlLWltcGxlbWVudHMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK0lOSEVSSVRfRE9DUyAgICAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgU0VQQVJBVEVfTUVNQkVSX1BBR0VTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIHByb2R1Y2UgYSBuZXcKKyMgcGFnZSBmb3IgZWFjaCBtZW1iZXIuIElmIHNldCB0byBOTywgdGhlIGRvY3VtZW50YXRpb24gb2YgYSBtZW1iZXIgd2lsbCBiZSBwYXJ0CisjIG9mIHRoZSBmaWxlL2NsYXNzL25hbWVzcGFjZSB0aGF0IGNvbnRhaW5zIGl0LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK1NFUEFSQVRFX01FTUJFUl9QQUdFUyAgPSBOTworCisjIFRoZSBUQUJfU0laRSB0YWcgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBudW1iZXIgb2Ygc3BhY2VzIGluIGEgdGFiLiBEb3h5Z2VuCisjIHVzZXMgdGhpcyB2YWx1ZSB0byByZXBsYWNlIHRhYnMgYnkgc3BhY2VzIGluIGNvZGUgZnJhZ21lbnRzLgorIyBNaW5pbXVtIHZhbHVlOiAxLCBtYXhpbXVtIHZhbHVlOiAxNiwgZGVmYXVsdCB2YWx1ZTogNC4KKworVEFCX1NJWkUgICAgICAgICAgICAgICA9IDQKKworIyBUaGlzIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgbnVtYmVyIG9mIGFsaWFzZXMgdGhhdCBhY3QgYXMgY29tbWFuZHMgaW4KKyMgdGhlIGRvY3VtZW50YXRpb24uIEFuIGFsaWFzIGhhcyB0aGUgZm9ybToKKyMgbmFtZT12YWx1ZQorIyBGb3IgZXhhbXBsZSBhZGRpbmcKKyMgInNpZGVlZmZlY3Q9QHBhciBTaWRlIEVmZmVjdHM6XG4iCisjIHdpbGwgYWxsb3cgeW91IHRvIHB1dCB0aGUgY29tbWFuZCBcc2lkZWVmZmVjdCAob3IgQHNpZGVlZmZlY3QpIGluIHRoZQorIyBkb2N1bWVudGF0aW9uLCB3aGljaCB3aWxsIHJlc3VsdCBpbiBhIHVzZXItZGVmaW5lZCBwYXJhZ3JhcGggd2l0aCBoZWFkaW5nCisjICJTaWRlIEVmZmVjdHM6Ii4gWW91IGNhbiBwdXQgXG4ncyBpbiB0aGUgdmFsdWUgcGFydCBvZiBhbiBhbGlhcyB0byBpbnNlcnQKKyMgbmV3bGluZXMuCisKK0FMSUFTRVMgICAgICAgICAgICAgICAgPSAKKworIyBUaGlzIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgbnVtYmVyIG9mIHdvcmQta2V5d29yZCBtYXBwaW5ncyAoVENMIG9ubHkpLgorIyBBIG1hcHBpbmcgaGFzIHRoZSBmb3JtICJuYW1lPXZhbHVlIi4gRm9yIGV4YW1wbGUgYWRkaW5nICJjbGFzcz1pdGNsOjpjbGFzcyIKKyMgd2lsbCBhbGxvdyB5b3UgdG8gdXNlIHRoZSBjb21tYW5kIGNsYXNzIGluIHRoZSBpdGNsOjpjbGFzcyBtZWFuaW5nLgorCitUQ0xfU1VCU1QgICAgICAgICAgICAgID0gCisKKyMgU2V0IHRoZSBPUFRJTUlaRV9PVVRQVVRfRk9SX0MgdGFnIHRvIFlFUyBpZiB5b3VyIHByb2plY3QgY29uc2lzdHMgb2YgQyBzb3VyY2VzCisjIG9ubHkuIERveHlnZW4gd2lsbCB0aGVuIGdlbmVyYXRlIG91dHB1dCB0aGF0IGlzIG1vcmUgdGFpbG9yZWQgZm9yIEMuIEZvcgorIyBpbnN0YW5jZSwgc29tZSBvZiB0aGUgbmFtZXMgdGhhdCBhcmUgdXNlZCB3aWxsIGJlIGRpZmZlcmVudC4gVGhlIGxpc3Qgb2YgYWxsCisjIG1lbWJlcnMgd2lsbCBiZSBvbWl0dGVkLCBldGMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworT1BUSU1JWkVfT1VUUFVUX0ZPUl9DICA9IE5PCisKKyMgU2V0IHRoZSBPUFRJTUlaRV9PVVRQVVRfSkFWQSB0YWcgdG8gWUVTIGlmIHlvdXIgcHJvamVjdCBjb25zaXN0cyBvZiBKYXZhIG9yCisjIFB5dGhvbiBzb3VyY2VzIG9ubHkuIERveHlnZW4gd2lsbCB0aGVuIGdlbmVyYXRlIG91dHB1dCB0aGF0IGlzIG1vcmUgdGFpbG9yZWQKKyMgZm9yIHRoYXQgbGFuZ3VhZ2UuIEZvciBpbnN0YW5jZSwgbmFtZXNwYWNlcyB3aWxsIGJlIHByZXNlbnRlZCBhcyBwYWNrYWdlcywKKyMgcXVhbGlmaWVkIHNjb3BlcyB3aWxsIGxvb2sgZGlmZmVyZW50LCBldGMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworT1BUSU1JWkVfT1VUUFVUX0pBVkEgICA9IE5PCisKKyMgU2V0IHRoZSBPUFRJTUlaRV9GT1JfRk9SVFJBTiB0YWcgdG8gWUVTIGlmIHlvdXIgcHJvamVjdCBjb25zaXN0cyBvZiBGb3J0cmFuCisjIHNvdXJjZXMuIERveHlnZW4gd2lsbCB0aGVuIGdlbmVyYXRlIG91dHB1dCB0aGF0IGlzIHRhaWxvcmVkIGZvciBGb3J0cmFuLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK09QVElNSVpFX0ZPUl9GT1JUUkFOICAgPSBOTworCisjIFNldCB0aGUgT1BUSU1JWkVfT1VUUFVUX1ZIREwgdGFnIHRvIFlFUyBpZiB5b3VyIHByb2plY3QgY29uc2lzdHMgb2YgVkhETAorIyBzb3VyY2VzLiBEb3h5Z2VuIHdpbGwgdGhlbiBnZW5lcmF0ZSBvdXRwdXQgdGhhdCBpcyB0YWlsb3JlZCBmb3IgVkhETC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitPUFRJTUlaRV9PVVRQVVRfVkhETCAgID0gTk8KKworIyBEb3h5Z2VuIHNlbGVjdHMgdGhlIHBhcnNlciB0byB1c2UgZGVwZW5kaW5nIG9uIHRoZSBleHRlbnNpb24gb2YgdGhlIGZpbGVzIGl0CisjIHBhcnNlcy4gV2l0aCB0aGlzIHRhZyB5b3UgY2FuIGFzc2lnbiB3aGljaCBwYXJzZXIgdG8gdXNlIGZvciBhIGdpdmVuCisjIGV4dGVuc2lvbi4gRG94eWdlbiBoYXMgYSBidWlsdC1pbiBtYXBwaW5nLCBidXQgeW91IGNhbiBvdmVycmlkZSBvciBleHRlbmQgaXQKKyMgdXNpbmcgdGhpcyB0YWcuIFRoZSBmb3JtYXQgaXMgZXh0PWxhbmd1YWdlLCB3aGVyZSBleHQgaXMgYSBmaWxlIGV4dGVuc2lvbiwgYW5kCisjIGxhbmd1YWdlIGlzIG9uZSBvZiB0aGUgcGFyc2VycyBzdXBwb3J0ZWQgYnkgZG94eWdlbjogSURMLCBKYXZhLCBKYXZhc2NyaXB0LAorIyBDIywgQywgQysrLCBELCBQSFAsIE9iamVjdGl2ZS1DLCBQeXRob24sIEZvcnRyYW4gKGZpeGVkIGZvcm1hdCBGb3J0cmFuOgorIyBGb3J0cmFuRml4ZWQsIGZyZWUgZm9ybWF0dGVkIEZvcnRyYW46IEZvcnRyYW5GcmVlLCB1bmtub3duIGZvcm1hdHRlZCBGb3J0cmFuOgorIyBGb3J0cmFuLiBJbiB0aGUgbGF0ZXIgY2FzZSB0aGUgcGFyc2VyIHRyaWVzIHRvIGd1ZXNzIHdoZXRoZXIgdGhlIGNvZGUgaXMgZml4ZWQKKyMgb3IgZnJlZSBmb3JtYXR0ZWQgY29kZSwgdGhpcyBpcyB0aGUgZGVmYXVsdCBmb3IgRm9ydHJhbiB0eXBlIGZpbGVzKSwgVkhETC4gRm9yCisjIGluc3RhbmNlIHRvIG1ha2UgZG94eWdlbiB0cmVhdCAuaW5jIGZpbGVzIGFzIEZvcnRyYW4gZmlsZXMgKGRlZmF1bHQgaXMgUEhQKSwKKyMgYW5kIC5mIGZpbGVzIGFzIEMgKGRlZmF1bHQgaXMgRm9ydHJhbiksIHVzZTogaW5jPUZvcnRyYW4gZj1DLgorIworIyBOb3RlOiBGb3IgZmlsZXMgd2l0aG91dCBleHRlbnNpb24geW91IGNhbiB1c2Ugbm9fZXh0ZW5zaW9uIGFzIGEgcGxhY2Vob2xkZXIuCisjCisjIE5vdGUgdGhhdCBmb3IgY3VzdG9tIGV4dGVuc2lvbnMgeW91IGFsc28gbmVlZCB0byBzZXQgRklMRV9QQVRURVJOUyBvdGhlcndpc2UKKyMgdGhlIGZpbGVzIGFyZSBub3QgcmVhZCBieSBkb3h5Z2VuLgorCitFWFRFTlNJT05fTUFQUElORyAgICAgID0gCisKKyMgSWYgdGhlIE1BUktET1dOX1NVUFBPUlQgdGFnIGlzIGVuYWJsZWQgdGhlbiBkb3h5Z2VuIHByZS1wcm9jZXNzZXMgYWxsIGNvbW1lbnRzCisjIGFjY29yZGluZyB0byB0aGUgTWFya2Rvd24gZm9ybWF0LCB3aGljaCBhbGxvd3MgZm9yIG1vcmUgcmVhZGFibGUKKyMgZG9jdW1lbnRhdGlvbi4gU2VlIGh0dHA6Ly9kYXJpbmdmaXJlYmFsbC5uZXQvcHJvamVjdHMvbWFya2Rvd24vIGZvciBkZXRhaWxzLgorIyBUaGUgb3V0cHV0IG9mIG1hcmtkb3duIHByb2Nlc3NpbmcgaXMgZnVydGhlciBwcm9jZXNzZWQgYnkgZG94eWdlbiwgc28geW91IGNhbgorIyBtaXggZG94eWdlbiwgSFRNTCwgYW5kIFhNTCBjb21tYW5kcyB3aXRoIE1hcmtkb3duIGZvcm1hdHRpbmcuIERpc2FibGUgb25seSBpbgorIyBjYXNlIG9mIGJhY2t3YXJkIGNvbXBhdGliaWxpdGllcyBpc3N1ZXMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK01BUktET1dOX1NVUFBPUlQgICAgICAgPSBZRVMKKworIyBXaGVuIGVuYWJsZWQgZG94eWdlbiB0cmllcyB0byBsaW5rIHdvcmRzIHRoYXQgY29ycmVzcG9uZCB0byBkb2N1bWVudGVkCisjIGNsYXNzZXMsIG9yIG5hbWVzcGFjZXMgdG8gdGhlaXIgY29ycmVzcG9uZGluZyBkb2N1bWVudGF0aW9uLiBTdWNoIGEgbGluayBjYW4KKyMgYmUgcHJldmVudGVkIGluIGluZGl2aWR1YWwgY2FzZXMgYnkgcHV0dGluZyBhICUgc2lnbiBpbiBmcm9udCBvZiB0aGUgd29yZCBvcgorIyBnbG9iYWxseSBieSBzZXR0aW5nIEFVVE9MSU5LX1NVUFBPUlQgdG8gTk8uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK0FVVE9MSU5LX1NVUFBPUlQgICAgICAgPSBZRVMKKworIyBJZiB5b3UgdXNlIFNUTCBjbGFzc2VzIChpLmUuIHN0ZDo6c3RyaW5nLCBzdGQ6OnZlY3RvciwgZXRjLikgYnV0IGRvIG5vdCB3YW50CisjIHRvIGluY2x1ZGUgKGEgdGFnIGZpbGUgZm9yKSB0aGUgU1RMIHNvdXJjZXMgYXMgaW5wdXQsIHRoZW4geW91IHNob3VsZCBzZXQgdGhpcworIyB0YWcgdG8gWUVTIGluIG9yZGVyIHRvIGxldCBkb3h5Z2VuIG1hdGNoIGZ1bmN0aW9ucyBkZWNsYXJhdGlvbnMgYW5kCisjIGRlZmluaXRpb25zIHdob3NlIGFyZ3VtZW50cyBjb250YWluIFNUTCBjbGFzc2VzIChlLmcuIGZ1bmMoc3RkOjpzdHJpbmcpOworIyB2ZXJzdXMgZnVuYyhzdGQ6OnN0cmluZykge30pLiBUaGlzIGFsc28gbWFrZSB0aGUgaW5oZXJpdGFuY2UgYW5kIGNvbGxhYm9yYXRpb24KKyMgZGlhZ3JhbXMgdGhhdCBpbnZvbHZlIFNUTCBjbGFzc2VzIG1vcmUgY29tcGxldGUgYW5kIGFjY3VyYXRlLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0JVSUxUSU5fU1RMX1NVUFBPUlQgICAgPSBZRVMKKworIyBJZiB5b3UgdXNlIE1pY3Jvc29mdCdzIEMrKy9DTEkgbGFuZ3VhZ2UsIHlvdSBzaG91bGQgc2V0IHRoaXMgb3B0aW9uIHRvIFlFUyB0bworIyBlbmFibGUgcGFyc2luZyBzdXBwb3J0LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0NQUF9DTElfU1VQUE9SVCAgICAgICAgPSBOTworCisjIFNldCB0aGUgU0lQX1NVUFBPUlQgdGFnIHRvIFlFUyBpZiB5b3VyIHByb2plY3QgY29uc2lzdHMgb2Ygc2lwIChzZWU6CisjIGh0dHA6Ly93d3cucml2ZXJiYW5rY29tcHV0aW5nLmNvLnVrL3NvZnR3YXJlL3NpcC9pbnRybykgc291cmNlcyBvbmx5LiBEb3h5Z2VuCisjIHdpbGwgcGFyc2UgdGhlbSBsaWtlIG5vcm1hbCBDKysgYnV0IHdpbGwgYXNzdW1lIGFsbCBjbGFzc2VzIHVzZSBwdWJsaWMgaW5zdGVhZAorIyBvZiBwcml2YXRlIGluaGVyaXRhbmNlIHdoZW4gbm8gZXhwbGljaXQgcHJvdGVjdGlvbiBrZXl3b3JkIGlzIHByZXNlbnQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworU0lQX1NVUFBPUlQgICAgICAgICAgICA9IE5PCisKKyMgRm9yIE1pY3Jvc29mdCdzIElETCB0aGVyZSBhcmUgcHJvcGdldCBhbmQgcHJvcHB1dCBhdHRyaWJ1dGVzIHRvIGluZGljYXRlCisjIGdldHRlciBhbmQgc2V0dGVyIG1ldGhvZHMgZm9yIGEgcHJvcGVydHkuIFNldHRpbmcgdGhpcyBvcHRpb24gdG8gWUVTIHdpbGwgbWFrZQorIyBkb3h5Z2VuIHRvIHJlcGxhY2UgdGhlIGdldCBhbmQgc2V0IG1ldGhvZHMgYnkgYSBwcm9wZXJ0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgVGhpcyB3aWxsIG9ubHkgd29yayBpZiB0aGUgbWV0aG9kcyBhcmUgaW5kZWVkIGdldHRpbmcgb3Igc2V0dGluZyBhIHNpbXBsZQorIyB0eXBlLiBJZiB0aGlzIGlzIG5vdCB0aGUgY2FzZSwgb3IgeW91IHdhbnQgdG8gc2hvdyB0aGUgbWV0aG9kcyBhbnl3YXksIHlvdQorIyBzaG91bGQgc2V0IHRoaXMgb3B0aW9uIHRvIE5PLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitJRExfUFJPUEVSVFlfU1VQUE9SVCAgID0gWUVTCisKKyMgSWYgbWVtYmVyIGdyb3VwaW5nIGlzIHVzZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kIHRoZSBESVNUUklCVVRFX0dST1VQX0RPQworIyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCByZXVzZSB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGUgZmlyc3QKKyMgbWVtYmVyIGluIHRoZSBncm91cCAoaWYgYW55KSBmb3IgdGhlIG90aGVyIG1lbWJlcnMgb2YgdGhlIGdyb3VwLiBCeSBkZWZhdWx0CisjIGFsbCBtZW1iZXJzIG9mIGEgZ3JvdXAgbXVzdCBiZSBkb2N1bWVudGVkIGV4cGxpY2l0bHkuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworRElTVFJJQlVURV9HUk9VUF9ET0MgICA9IE5PCisKKyMgSWYgb25lIGFkZHMgYSBzdHJ1Y3Qgb3IgY2xhc3MgdG8gYSBncm91cCBhbmQgdGhpcyBvcHRpb24gaXMgZW5hYmxlZCwgdGhlbiBhbHNvCisjIGFueSBuZXN0ZWQgY2xhc3Mgb3Igc3RydWN0IGlzIGFkZGVkIHRvIHRoZSBzYW1lIGdyb3VwLiBCeSBkZWZhdWx0IHRoaXMgb3B0aW9uCisjIGlzIGRpc2FibGVkIGFuZCBvbmUgaGFzIHRvIGFkZCBuZXN0ZWQgY29tcG91bmRzIGV4cGxpY2l0bHkgdmlhIFxpbmdyb3VwLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0dST1VQX05FU1RFRF9DT01QT1VORFMgPSBOTworCisjIFNldCB0aGUgU1VCR1JPVVBJTkcgdGFnIHRvIFlFUyB0byBhbGxvdyBjbGFzcyBtZW1iZXIgZ3JvdXBzIG9mIHRoZSBzYW1lIHR5cGUKKyMgKGZvciBpbnN0YW5jZSBhIGdyb3VwIG9mIHB1YmxpYyBmdW5jdGlvbnMpIHRvIGJlIHB1dCBhcyBhIHN1Ymdyb3VwIG9mIHRoYXQKKyMgdHlwZSAoZS5nLiB1bmRlciB0aGUgUHVibGljIEZ1bmN0aW9ucyBzZWN0aW9uKS4gU2V0IGl0IHRvIE5PIHRvIHByZXZlbnQKKyMgc3ViZ3JvdXBpbmcuIEFsdGVybmF0aXZlbHksIHRoaXMgY2FuIGJlIGRvbmUgcGVyIGNsYXNzIHVzaW5nIHRoZQorIyBcbm9zdWJncm91cGluZyBjb21tYW5kLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitTVUJHUk9VUElORyAgICAgICAgICAgID0gWUVTCisKKyMgV2hlbiB0aGUgSU5MSU5FX0dST1VQRURfQ0xBU1NFUyB0YWcgaXMgc2V0IHRvIFlFUywgY2xhc3Nlcywgc3RydWN0cyBhbmQgdW5pb25zCisjIGFyZSBzaG93biBpbnNpZGUgdGhlIGdyb3VwIGluIHdoaWNoIHRoZXkgYXJlIGluY2x1ZGVkIChlLmcuIHVzaW5nIFxpbmdyb3VwKQorIyBpbnN0ZWFkIG9mIG9uIGEgc2VwYXJhdGUgcGFnZSAoZm9yIEhUTUwgYW5kIE1hbiBwYWdlcykgb3Igc2VjdGlvbiAoZm9yIExhVGVYCisjIGFuZCBSVEYpLgorIworIyBOb3RlIHRoYXQgdGhpcyBmZWF0dXJlIGRvZXMgbm90IHdvcmsgaW4gY29tYmluYXRpb24gd2l0aAorIyBTRVBBUkFURV9NRU1CRVJfUEFHRVMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworSU5MSU5FX0dST1VQRURfQ0xBU1NFUyA9IE5PCisKKyMgV2hlbiB0aGUgSU5MSU5FX1NJTVBMRV9TVFJVQ1RTIHRhZyBpcyBzZXQgdG8gWUVTLCBzdHJ1Y3RzLCBjbGFzc2VzLCBhbmQgdW5pb25zCisjIHdpdGggb25seSBwdWJsaWMgZGF0YSBmaWVsZHMgb3Igc2ltcGxlIHR5cGVkZWYgZmllbGRzIHdpbGwgYmUgc2hvd24gaW5saW5lIGluCisjIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoZSBzY29wZSBpbiB3aGljaCB0aGV5IGFyZSBkZWZpbmVkIChpLmUuIGZpbGUsCisjIG5hbWVzcGFjZSwgb3IgZ3JvdXAgZG9jdW1lbnRhdGlvbiksIHByb3ZpZGVkIHRoaXMgc2NvcGUgaXMgZG9jdW1lbnRlZC4gSWYgc2V0CisjIHRvIE5PLCBzdHJ1Y3RzLCBjbGFzc2VzLCBhbmQgdW5pb25zIGFyZSBzaG93biBvbiBhIHNlcGFyYXRlIHBhZ2UgKGZvciBIVE1MIGFuZAorIyBNYW4gcGFnZXMpIG9yIHNlY3Rpb24gKGZvciBMYVRlWCBhbmQgUlRGKS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitJTkxJTkVfU0lNUExFX1NUUlVDVFMgID0gTk8KKworIyBXaGVuIFRZUEVERUZfSElERVNfU1RSVUNUIHRhZyBpcyBlbmFibGVkLCBhIHR5cGVkZWYgb2YgYSBzdHJ1Y3QsIHVuaW9uLCBvcgorIyBlbnVtIGlzIGRvY3VtZW50ZWQgYXMgc3RydWN0LCB1bmlvbiwgb3IgZW51bSB3aXRoIHRoZSBuYW1lIG9mIHRoZSB0eXBlZGVmLiBTbworIyB0eXBlZGVmIHN0cnVjdCBUeXBlUyB7fSBUeXBlVCwgd2lsbCBhcHBlYXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYXMgYSBzdHJ1Y3QKKyMgd2l0aCBuYW1lIFR5cGVULiBXaGVuIGRpc2FibGVkIHRoZSB0eXBlZGVmIHdpbGwgYXBwZWFyIGFzIGEgbWVtYmVyIG9mIGEgZmlsZSwKKyMgbmFtZXNwYWNlLCBvciBjbGFzcy4gQW5kIHRoZSBzdHJ1Y3Qgd2lsbCBiZSBuYW1lZCBUeXBlUy4gVGhpcyBjYW4gdHlwaWNhbGx5IGJlCisjIHVzZWZ1bCBmb3IgQyBjb2RlIGluIGNhc2UgdGhlIGNvZGluZyBjb252ZW50aW9uIGRpY3RhdGVzIHRoYXQgYWxsIGNvbXBvdW5kCisjIHR5cGVzIGFyZSB0eXBlZGVmJ2VkIGFuZCBvbmx5IHRoZSB0eXBlZGVmIGlzIHJlZmVyZW5jZWQsIG5ldmVyIHRoZSB0YWcgbmFtZS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitUWVBFREVGX0hJREVTX1NUUlVDVCAgID0gWUVTCisKKyMgVGhlIHNpemUgb2YgdGhlIHN5bWJvbCBsb29rdXAgY2FjaGUgY2FuIGJlIHNldCB1c2luZyBMT09LVVBfQ0FDSEVfU0laRS4gVGhpcworIyBjYWNoZSBpcyB1c2VkIHRvIHJlc29sdmUgc3ltYm9scyBnaXZlbiB0aGVpciBuYW1lIGFuZCBzY29wZS4gU2luY2UgdGhpcyBjYW4gYmUKKyMgYW4gZXhwZW5zaXZlIHByb2Nlc3MgYW5kIG9mdGVuIHRoZSBzYW1lIHN5bWJvbCBhcHBlYXJzIG11bHRpcGxlIHRpbWVzIGluIHRoZQorIyBjb2RlLCBkb3h5Z2VuIGtlZXBzIGEgY2FjaGUgb2YgcHJlLXJlc29sdmVkIHN5bWJvbHMuIElmIHRoZSBjYWNoZSBpcyB0b28gc21hbGwKKyMgZG94eWdlbiB3aWxsIGJlY29tZSBzbG93ZXIuIElmIHRoZSBjYWNoZSBpcyB0b28gbGFyZ2UsIG1lbW9yeSBpcyB3YXN0ZWQuIFRoZQorIyBjYWNoZSBzaXplIGlzIGdpdmVuIGJ5IHRoaXMgZm9ybXVsYTogMl4oMTYrTE9PS1VQX0NBQ0hFX1NJWkUpLiBUaGUgdmFsaWQgcmFuZ2UKKyMgaXMgMC4uOSwgdGhlIGRlZmF1bHQgaXMgMCwgY29ycmVzcG9uZGluZyB0byBhIGNhY2hlIHNpemUgb2YgMl4xNj02NTUzNgorIyBzeW1ib2xzLiBBdCB0aGUgZW5kIG9mIGEgcnVuIGRveHlnZW4gd2lsbCByZXBvcnQgdGhlIGNhY2hlIHVzYWdlIGFuZCBzdWdnZXN0CisjIHRoZSBvcHRpbWFsIGNhY2hlIHNpemUgZnJvbSBhIHNwZWVkIHBvaW50IG9mIHZpZXcuCisjIE1pbmltdW0gdmFsdWU6IDAsIG1heGltdW0gdmFsdWU6IDksIGRlZmF1bHQgdmFsdWU6IDAuCisKK0xPT0tVUF9DQUNIRV9TSVpFICAgICAgPSAwCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQnVpbGQgcmVsYXRlZCBjb25maWd1cmF0aW9uIG9wdGlvbnMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgRVhUUkFDVF9BTEwgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBhc3N1bWUgYWxsIGVudGl0aWVzIGluCisjIGRvY3VtZW50YXRpb24gYXJlIGRvY3VtZW50ZWQsIGV2ZW4gaWYgbm8gZG9jdW1lbnRhdGlvbiB3YXMgYXZhaWxhYmxlLiBQcml2YXRlCisjIGNsYXNzIG1lbWJlcnMgYW5kIHN0YXRpYyBmaWxlIG1lbWJlcnMgd2lsbCBiZSBoaWRkZW4gdW5sZXNzIHRoZQorIyBFWFRSQUNUX1BSSVZBVEUgcmVzcGVjdGl2ZWx5IEVYVFJBQ1RfU1RBVElDIHRhZ3MgYXJlIHNldCB0byBZRVMuCisjIE5vdGU6IFRoaXMgd2lsbCBhbHNvIGRpc2FibGUgdGhlIHdhcm5pbmdzIGFib3V0IHVuZG9jdW1lbnRlZCBtZW1iZXJzIHRoYXQgYXJlCisjIG5vcm1hbGx5IHByb2R1Y2VkIHdoZW4gV0FSTklOR1MgaXMgc2V0IHRvIFlFUy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitFWFRSQUNUX0FMTCAgICAgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIEVYVFJBQ1RfUFJJVkFURSB0YWcgaXMgc2V0IHRvIFlFUywgYWxsIHByaXZhdGUgbWVtYmVycyBvZiBhIGNsYXNzIHdpbGwKKyMgYmUgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworRVhUUkFDVF9QUklWQVRFICAgICAgICA9IE5PCisKKyMgSWYgdGhlIEVYVFJBQ1RfUEFDS0FHRSB0YWcgaXMgc2V0IHRvIFlFUywgYWxsIG1lbWJlcnMgd2l0aCBwYWNrYWdlIG9yIGludGVybmFsCisjIHNjb3BlIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworRVhUUkFDVF9QQUNLQUdFICAgICAgICA9IE5PCisKKyMgSWYgdGhlIEVYVFJBQ1RfU1RBVElDIHRhZyBpcyBzZXQgdG8gWUVTLCBhbGwgc3RhdGljIG1lbWJlcnMgb2YgYSBmaWxlIHdpbGwgYmUKKyMgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworRVhUUkFDVF9TVEFUSUMgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIEVYVFJBQ1RfTE9DQUxfQ0xBU1NFUyB0YWcgaXMgc2V0IHRvIFlFUywgY2xhc3NlcyAoYW5kIHN0cnVjdHMpIGRlZmluZWQKKyMgbG9jYWxseSBpbiBzb3VyY2UgZmlsZXMgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4gSWYgc2V0IHRvIE5PLAorIyBvbmx5IGNsYXNzZXMgZGVmaW5lZCBpbiBoZWFkZXIgZmlsZXMgYXJlIGluY2x1ZGVkLiBEb2VzIG5vdCBoYXZlIGFueSBlZmZlY3QKKyMgZm9yIEphdmEgc291cmNlcy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworRVhUUkFDVF9MT0NBTF9DTEFTU0VTICA9IFlFUworCisjIFRoaXMgZmxhZyBpcyBvbmx5IHVzZWZ1bCBmb3IgT2JqZWN0aXZlLUMgY29kZS4gSWYgc2V0IHRvIFlFUywgbG9jYWwgbWV0aG9kcywKKyMgd2hpY2ggYXJlIGRlZmluZWQgaW4gdGhlIGltcGxlbWVudGF0aW9uIHNlY3Rpb24gYnV0IG5vdCBpbiB0aGUgaW50ZXJmYWNlIGFyZQorIyBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4gSWYgc2V0IHRvIE5PLCBvbmx5IG1ldGhvZHMgaW4gdGhlIGludGVyZmFjZSBhcmUKKyMgaW5jbHVkZWQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworRVhUUkFDVF9MT0NBTF9NRVRIT0RTICA9IE5PCisKKyMgSWYgdGhpcyBmbGFnIGlzIHNldCB0byBZRVMsIHRoZSBtZW1iZXJzIG9mIGFub255bW91cyBuYW1lc3BhY2VzIHdpbGwgYmUKKyMgZXh0cmFjdGVkIGFuZCBhcHBlYXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYXMgYSBuYW1lc3BhY2UgY2FsbGVkCisjICdhbm9ueW1vdXNfbmFtZXNwYWNle2ZpbGV9Jywgd2hlcmUgZmlsZSB3aWxsIGJlIHJlcGxhY2VkIHdpdGggdGhlIGJhc2UgbmFtZSBvZgorIyB0aGUgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBhbm9ueW1vdXMgbmFtZXNwYWNlLiBCeSBkZWZhdWx0IGFub255bW91cyBuYW1lc3BhY2UKKyMgYXJlIGhpZGRlbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitFWFRSQUNUX0FOT05fTlNQQUNFUyAgID0gTk8KKworIyBJZiB0aGUgSElERV9VTkRPQ19NRU1CRVJTIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgaGlkZSBhbGwKKyMgdW5kb2N1bWVudGVkIG1lbWJlcnMgaW5zaWRlIGRvY3VtZW50ZWQgY2xhc3NlcyBvciBmaWxlcy4gSWYgc2V0IHRvIE5PIHRoZXNlCisjIG1lbWJlcnMgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgdmFyaW91cyBvdmVydmlld3MsIGJ1dCBubyBkb2N1bWVudGF0aW9uCisjIHNlY3Rpb24gaXMgZ2VuZXJhdGVkLiBUaGlzIG9wdGlvbiBoYXMgbm8gZWZmZWN0IGlmIEVYVFJBQ1RfQUxMIGlzIGVuYWJsZWQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworSElERV9VTkRPQ19NRU1CRVJTICAgICA9IE5PCisKKyMgSWYgdGhlIEhJREVfVU5ET0NfQ0xBU1NFUyB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGhpZGUgYWxsCisjIHVuZG9jdW1lbnRlZCBjbGFzc2VzIHRoYXQgYXJlIG5vcm1hbGx5IHZpc2libGUgaW4gdGhlIGNsYXNzIGhpZXJhcmNoeS4gSWYgc2V0CisjIHRvIE5PLCB0aGVzZSBjbGFzc2VzIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIHZhcmlvdXMgb3ZlcnZpZXdzLiBUaGlzIG9wdGlvbgorIyBoYXMgbm8gZWZmZWN0IGlmIEVYVFJBQ1RfQUxMIGlzIGVuYWJsZWQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworSElERV9VTkRPQ19DTEFTU0VTICAgICA9IE5PCisKKyMgSWYgdGhlIEhJREVfRlJJRU5EX0NPTVBPVU5EUyB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGhpZGUgYWxsIGZyaWVuZAorIyAoY2xhc3N8c3RydWN0fHVuaW9uKSBkZWNsYXJhdGlvbnMuIElmIHNldCB0byBOTywgdGhlc2UgZGVjbGFyYXRpb25zIHdpbGwgYmUKKyMgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworSElERV9GUklFTkRfQ09NUE9VTkRTICA9IE5PCisKKyMgSWYgdGhlIEhJREVfSU5fQk9EWV9ET0NTIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgaGlkZSBhbnkKKyMgZG9jdW1lbnRhdGlvbiBibG9ja3MgZm91bmQgaW5zaWRlIHRoZSBib2R5IG9mIGEgZnVuY3Rpb24uIElmIHNldCB0byBOTywgdGhlc2UKKyMgYmxvY2tzIHdpbGwgYmUgYXBwZW5kZWQgdG8gdGhlIGZ1bmN0aW9uJ3MgZGV0YWlsZWQgZG9jdW1lbnRhdGlvbiBibG9jay4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitISURFX0lOX0JPRFlfRE9DUyAgICAgID0gTk8KKworIyBUaGUgSU5URVJOQUxfRE9DUyB0YWcgZGV0ZXJtaW5lcyBpZiBkb2N1bWVudGF0aW9uIHRoYXQgaXMgdHlwZWQgYWZ0ZXIgYQorIyBcaW50ZXJuYWwgY29tbWFuZCBpcyBpbmNsdWRlZC4gSWYgdGhlIHRhZyBpcyBzZXQgdG8gTk8gdGhlbiB0aGUgZG9jdW1lbnRhdGlvbgorIyB3aWxsIGJlIGV4Y2x1ZGVkLiBTZXQgaXQgdG8gWUVTIHRvIGluY2x1ZGUgdGhlIGludGVybmFsIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworSU5URVJOQUxfRE9DUyAgICAgICAgICA9IFlFUworCisjIElmIHRoZSBDQVNFX1NFTlNFX05BTUVTIHRhZyBpcyBzZXQgdG8gTk8gdGhlbiBkb3h5Z2VuIHdpbGwgb25seSBnZW5lcmF0ZSBmaWxlCisjIG5hbWVzIGluIGxvd2VyLWNhc2UgbGV0dGVycy4gSWYgc2V0IHRvIFlFUywgdXBwZXItY2FzZSBsZXR0ZXJzIGFyZSBhbHNvCisjIGFsbG93ZWQuIFRoaXMgaXMgdXNlZnVsIGlmIHlvdSBoYXZlIGNsYXNzZXMgb3IgZmlsZXMgd2hvc2UgbmFtZXMgb25seSBkaWZmZXIKKyMgaW4gY2FzZSBhbmQgaWYgeW91ciBmaWxlIHN5c3RlbSBzdXBwb3J0cyBjYXNlIHNlbnNpdGl2ZSBmaWxlIG5hbWVzLiBXaW5kb3dzCisjIGFuZCBNYWMgdXNlcnMgYXJlIGFkdmlzZWQgdG8gc2V0IHRoaXMgb3B0aW9uIHRvIE5PLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogc3lzdGVtIGRlcGVuZGVudC4KKworQ0FTRV9TRU5TRV9OQU1FUyAgICAgICA9IE5PCisKKyMgSWYgdGhlIEhJREVfU0NPUEVfTkFNRVMgdGFnIGlzIHNldCB0byBOTyB0aGVuIGRveHlnZW4gd2lsbCBzaG93IG1lbWJlcnMgd2l0aAorIyB0aGVpciBmdWxsIGNsYXNzIGFuZCBuYW1lc3BhY2Ugc2NvcGVzIGluIHRoZSBkb2N1bWVudGF0aW9uLiBJZiBzZXQgdG8gWUVTLCB0aGUKKyMgc2NvcGUgd2lsbCBiZSBoaWRkZW4uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworSElERV9TQ09QRV9OQU1FUyAgICAgICA9IFlFUworCisjIElmIHRoZSBISURFX0NPTVBPVU5EX1JFRkVSRU5DRSB0YWcgaXMgc2V0IHRvIE5PIChkZWZhdWx0KSB0aGVuIGRveHlnZW4gd2lsbAorIyBhcHBlbmQgYWRkaXRpb25hbCB0ZXh0IHRvIGEgcGFnZSdzIHRpdGxlLCBzdWNoIGFzIENsYXNzIFJlZmVyZW5jZS4gSWYgc2V0IHRvCisjIFlFUyB0aGUgY29tcG91bmQgcmVmZXJlbmNlIHdpbGwgYmUgaGlkZGVuLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0hJREVfQ09NUE9VTkRfUkVGRVJFTkNFPSBOTworCisjIElmIHRoZSBTSE9XX0lOQ0xVREVfRklMRVMgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgcHV0IGEgbGlzdCBvZgorIyB0aGUgZmlsZXMgdGhhdCBhcmUgaW5jbHVkZWQgYnkgYSBmaWxlIGluIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoYXQgZmlsZS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworU0hPV19JTkNMVURFX0ZJTEVTICAgICA9IFlFUworCisjIElmIHRoZSBTSE9XX0dST1VQRURfTUVNQl9JTkMgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBEb3h5Z2VuIHdpbGwgYWRkIGZvciBlYWNoCisjIGdyb3VwZWQgbWVtYmVyIGFuIGluY2x1ZGUgc3RhdGVtZW50IHRvIHRoZSBkb2N1bWVudGF0aW9uLCB0ZWxsaW5nIHRoZSByZWFkZXIKKyMgd2hpY2ggZmlsZSB0byBpbmNsdWRlIGluIG9yZGVyIHRvIHVzZSB0aGUgbWVtYmVyLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK1NIT1dfR1JPVVBFRF9NRU1CX0lOQyAgPSBOTworCisjIElmIHRoZSBGT1JDRV9MT0NBTF9JTkNMVURFUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBsaXN0IGluY2x1ZGUKKyMgZmlsZXMgd2l0aCBkb3VibGUgcXVvdGVzIGluIHRoZSBkb2N1bWVudGF0aW9uIHJhdGhlciB0aGFuIHdpdGggc2hhcnAgYnJhY2tldHMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworRk9SQ0VfTE9DQUxfSU5DTFVERVMgICA9IE5PCisKKyMgSWYgdGhlIElOTElORV9JTkZPIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gYSB0YWcgW2lubGluZV0gaXMgaW5zZXJ0ZWQgaW4gdGhlCisjIGRvY3VtZW50YXRpb24gZm9yIGlubGluZSBtZW1iZXJzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitJTkxJTkVfSU5GTyAgICAgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIFNPUlRfTUVNQkVSX0RPQ1MgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgc29ydCB0aGUKKyMgKGRldGFpbGVkKSBkb2N1bWVudGF0aW9uIG9mIGZpbGUgYW5kIGNsYXNzIG1lbWJlcnMgYWxwaGFiZXRpY2FsbHkgYnkgbWVtYmVyCisjIG5hbWUuIElmIHNldCB0byBOTywgdGhlIG1lbWJlcnMgd2lsbCBhcHBlYXIgaW4gZGVjbGFyYXRpb24gb3JkZXIuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK1NPUlRfTUVNQkVSX0RPQ1MgICAgICAgPSBZRVMKKworIyBJZiB0aGUgU09SVF9CUklFRl9ET0NTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIHNvcnQgdGhlIGJyaWVmCisjIGRlc2NyaXB0aW9ucyBvZiBmaWxlLCBuYW1lc3BhY2UgYW5kIGNsYXNzIG1lbWJlcnMgYWxwaGFiZXRpY2FsbHkgYnkgbWVtYmVyCisjIG5hbWUuIElmIHNldCB0byBOTywgdGhlIG1lbWJlcnMgd2lsbCBhcHBlYXIgaW4gZGVjbGFyYXRpb24gb3JkZXIuIE5vdGUgdGhhdAorIyB0aGlzIHdpbGwgYWxzbyBpbmZsdWVuY2UgdGhlIG9yZGVyIG9mIHRoZSBjbGFzc2VzIGluIHRoZSBjbGFzcyBsaXN0LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK1NPUlRfQlJJRUZfRE9DUyAgICAgICAgPSBOTworCisjIElmIHRoZSBTT1JUX01FTUJFUlNfQ1RPUlNfMVNUIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIHNvcnQgdGhlCisjIChicmllZiBhbmQgZGV0YWlsZWQpIGRvY3VtZW50YXRpb24gb2YgY2xhc3MgbWVtYmVycyBzbyB0aGF0IGNvbnN0cnVjdG9ycyBhbmQKKyMgZGVzdHJ1Y3RvcnMgYXJlIGxpc3RlZCBmaXJzdC4gSWYgc2V0IHRvIE5PIHRoZSBjb25zdHJ1Y3RvcnMgd2lsbCBhcHBlYXIgaW4gdGhlCisjIHJlc3BlY3RpdmUgb3JkZXJzIGRlZmluZWQgYnkgU09SVF9CUklFRl9ET0NTIGFuZCBTT1JUX01FTUJFUl9ET0NTLgorIyBOb3RlOiBJZiBTT1JUX0JSSUVGX0RPQ1MgaXMgc2V0IHRvIE5PIHRoaXMgb3B0aW9uIGlzIGlnbm9yZWQgZm9yIHNvcnRpbmcgYnJpZWYKKyMgbWVtYmVyIGRvY3VtZW50YXRpb24uCisjIE5vdGU6IElmIFNPUlRfTUVNQkVSX0RPQ1MgaXMgc2V0IHRvIE5PIHRoaXMgb3B0aW9uIGlzIGlnbm9yZWQgZm9yIHNvcnRpbmcKKyMgZGV0YWlsZWQgbWVtYmVyIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworU09SVF9NRU1CRVJTX0NUT1JTXzFTVCA9IE5PCisKKyMgSWYgdGhlIFNPUlRfR1JPVVBfTkFNRVMgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgc29ydCB0aGUgaGllcmFyY2h5CisjIG9mIGdyb3VwIG5hbWVzIGludG8gYWxwaGFiZXRpY2FsIG9yZGVyLiBJZiBzZXQgdG8gTk8gdGhlIGdyb3VwIG5hbWVzIHdpbGwKKyMgYXBwZWFyIGluIHRoZWlyIGRlZmluZWQgb3JkZXIuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworU09SVF9HUk9VUF9OQU1FUyAgICAgICA9IE5PCisKKyMgSWYgdGhlIFNPUlRfQllfU0NPUEVfTkFNRSB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIGNsYXNzIGxpc3Qgd2lsbCBiZSBzb3J0ZWQgYnkKKyMgZnVsbHktcXVhbGlmaWVkIG5hbWVzLCBpbmNsdWRpbmcgbmFtZXNwYWNlcy4gSWYgc2V0IHRvIE5PLCB0aGUgY2xhc3MgbGlzdCB3aWxsCisjIGJlIHNvcnRlZCBvbmx5IGJ5IGNsYXNzIG5hbWUsIG5vdCBpbmNsdWRpbmcgdGhlIG5hbWVzcGFjZSBwYXJ0LgorIyBOb3RlOiBUaGlzIG9wdGlvbiBpcyBub3QgdmVyeSB1c2VmdWwgaWYgSElERV9TQ09QRV9OQU1FUyBpcyBzZXQgdG8gWUVTLgorIyBOb3RlOiBUaGlzIG9wdGlvbiBhcHBsaWVzIG9ubHkgdG8gdGhlIGNsYXNzIGxpc3QsIG5vdCB0byB0aGUgYWxwaGFiZXRpY2FsCisjIGxpc3QuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworU09SVF9CWV9TQ09QRV9OQU1FICAgICA9IE5PCisKKyMgSWYgdGhlIFNUUklDVF9QUk9UT19NQVRDSElORyBvcHRpb24gaXMgZW5hYmxlZCBhbmQgZG94eWdlbiBmYWlscyB0byBkbyBwcm9wZXIKKyMgdHlwZSByZXNvbHV0aW9uIG9mIGFsbCBwYXJhbWV0ZXJzIG9mIGEgZnVuY3Rpb24gaXQgd2lsbCByZWplY3QgYSBtYXRjaCBiZXR3ZWVuCisjIHRoZSBwcm90b3R5cGUgYW5kIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBhIG1lbWJlciBmdW5jdGlvbiBldmVuIGlmIHRoZXJlIGlzCisjIG9ubHkgb25lIGNhbmRpZGF0ZSBvciBpdCBpcyBvYnZpb3VzIHdoaWNoIGNhbmRpZGF0ZSB0byBjaG9vc2UgYnkgZG9pbmcgYQorIyBzaW1wbGUgc3RyaW5nIG1hdGNoLiBCeSBkaXNhYmxpbmcgU1RSSUNUX1BST1RPX01BVENISU5HIGRveHlnZW4gd2lsbCBzdGlsbAorIyBhY2NlcHQgYSBtYXRjaCBiZXR3ZWVuIHByb3RvdHlwZSBhbmQgaW1wbGVtZW50YXRpb24gaW4gc3VjaCBjYXNlcy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitTVFJJQ1RfUFJPVE9fTUFUQ0hJTkcgID0gTk8KKworIyBUaGUgR0VORVJBVEVfVE9ET0xJU1QgdGFnIGNhbiBiZSB1c2VkIHRvIGVuYWJsZSAoWUVTKSBvciBkaXNhYmxlIChOTykgdGhlIHRvZG8KKyMgbGlzdC4gVGhpcyBsaXN0IGlzIGNyZWF0ZWQgYnkgcHV0dGluZyBcdG9kbyBjb21tYW5kcyBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworR0VORVJBVEVfVE9ET0xJU1QgICAgICA9IFlFUworCisjIFRoZSBHRU5FUkFURV9URVNUTElTVCB0YWcgY2FuIGJlIHVzZWQgdG8gZW5hYmxlIChZRVMpIG9yIGRpc2FibGUgKE5PKSB0aGUgdGVzdAorIyBsaXN0LiBUaGlzIGxpc3QgaXMgY3JlYXRlZCBieSBwdXR0aW5nIFx0ZXN0IGNvbW1hbmRzIGluIHRoZSBkb2N1bWVudGF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitHRU5FUkFURV9URVNUTElTVCAgICAgID0gWUVTCisKKyMgVGhlIEdFTkVSQVRFX0JVR0xJU1QgdGFnIGNhbiBiZSB1c2VkIHRvIGVuYWJsZSAoWUVTKSBvciBkaXNhYmxlIChOTykgdGhlIGJ1ZworIyBsaXN0LiBUaGlzIGxpc3QgaXMgY3JlYXRlZCBieSBwdXR0aW5nIFxidWcgY29tbWFuZHMgaW4gdGhlIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK0dFTkVSQVRFX0JVR0xJU1QgICAgICAgPSBZRVMKKworIyBUaGUgR0VORVJBVEVfREVQUkVDQVRFRExJU1QgdGFnIGNhbiBiZSB1c2VkIHRvIGVuYWJsZSAoWUVTKSBvciBkaXNhYmxlIChOTykKKyMgdGhlIGRlcHJlY2F0ZWQgbGlzdC4gVGhpcyBsaXN0IGlzIGNyZWF0ZWQgYnkgcHV0dGluZyBcZGVwcmVjYXRlZCBjb21tYW5kcyBpbgorIyB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworR0VORVJBVEVfREVQUkVDQVRFRExJU1Q9IFlFUworCisjIFRoZSBFTkFCTEVEX1NFQ1RJT05TIHRhZyBjYW4gYmUgdXNlZCB0byBlbmFibGUgY29uZGl0aW9uYWwgZG9jdW1lbnRhdGlvbgorIyBzZWN0aW9ucywgbWFya2VkIGJ5IFxpZiA8c2VjdGlvbl9sYWJlbD4gLi4uIFxlbmRpZiBhbmQgXGNvbmQgPHNlY3Rpb25fbGFiZWw+CisjIC4uLiBcZW5kY29uZCBibG9ja3MuCisKK0VOQUJMRURfU0VDVElPTlMgICAgICAgPSBJTlRFUk5BTAorCisjIFRoZSBNQVhfSU5JVElBTElaRVJfTElORVMgdGFnIGRldGVybWluZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRoYXQgdGhlCisjIGluaXRpYWwgdmFsdWUgb2YgYSB2YXJpYWJsZSBvciBtYWNybyAvIGRlZmluZSBjYW4gaGF2ZSBmb3IgaXQgdG8gYXBwZWFyIGluIHRoZQorIyBkb2N1bWVudGF0aW9uLiBJZiB0aGUgaW5pdGlhbGl6ZXIgY29uc2lzdHMgb2YgbW9yZSBsaW5lcyB0aGFuIHNwZWNpZmllZCBoZXJlCisjIGl0IHdpbGwgYmUgaGlkZGVuLiBVc2UgYSB2YWx1ZSBvZiAwIHRvIGhpZGUgaW5pdGlhbGl6ZXJzIGNvbXBsZXRlbHkuIFRoZQorIyBhcHBlYXJhbmNlIG9mIHRoZSB2YWx1ZSBvZiBpbmRpdmlkdWFsIHZhcmlhYmxlcyBhbmQgbWFjcm9zIC8gZGVmaW5lcyBjYW4gYmUKKyMgY29udHJvbGxlZCB1c2luZyBcc2hvd2luaXRpYWxpemVyIG9yIFxoaWRlaW5pdGlhbGl6ZXIgY29tbWFuZCBpbiB0aGUKKyMgZG9jdW1lbnRhdGlvbiByZWdhcmRsZXNzIG9mIHRoaXMgc2V0dGluZy4KKyMgTWluaW11bSB2YWx1ZTogMCwgbWF4aW11bSB2YWx1ZTogMTAwMDAsIGRlZmF1bHQgdmFsdWU6IDMwLgorCitNQVhfSU5JVElBTElaRVJfTElORVMgID0gMzAKKworIyBTZXQgdGhlIFNIT1dfVVNFRF9GSUxFUyB0YWcgdG8gTk8gdG8gZGlzYWJsZSB0aGUgbGlzdCBvZiBmaWxlcyBnZW5lcmF0ZWQgYXQKKyMgdGhlIGJvdHRvbSBvZiB0aGUgZG9jdW1lbnRhdGlvbiBvZiBjbGFzc2VzIGFuZCBzdHJ1Y3RzLiBJZiBzZXQgdG8gWUVTLCB0aGUKKyMgbGlzdCB3aWxsIG1lbnRpb24gdGhlIGZpbGVzIHRoYXQgd2VyZSB1c2VkIHRvIGdlbmVyYXRlIHRoZSBkb2N1bWVudGF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitTSE9XX1VTRURfRklMRVMgICAgICAgID0gWUVTCisKKyMgU2V0IHRoZSBTSE9XX0ZJTEVTIHRhZyB0byBOTyB0byBkaXNhYmxlIHRoZSBnZW5lcmF0aW9uIG9mIHRoZSBGaWxlcyBwYWdlLiBUaGlzCisjIHdpbGwgcmVtb3ZlIHRoZSBGaWxlcyBlbnRyeSBmcm9tIHRoZSBRdWljayBJbmRleCBhbmQgZnJvbSB0aGUgRm9sZGVyIFRyZWUgVmlldworIyAoaWYgc3BlY2lmaWVkKS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworU0hPV19GSUxFUyAgICAgICAgICAgICA9IFlFUworCisjIFNldCB0aGUgU0hPV19OQU1FU1BBQ0VTIHRhZyB0byBOTyB0byBkaXNhYmxlIHRoZSBnZW5lcmF0aW9uIG9mIHRoZSBOYW1lc3BhY2VzCisjIHBhZ2UuIFRoaXMgd2lsbCByZW1vdmUgdGhlIE5hbWVzcGFjZXMgZW50cnkgZnJvbSB0aGUgUXVpY2sgSW5kZXggYW5kIGZyb20gdGhlCisjIEZvbGRlciBUcmVlIFZpZXcgKGlmIHNwZWNpZmllZCkuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK1NIT1dfTkFNRVNQQUNFUyAgICAgICAgPSBZRVMKKworIyBUaGUgRklMRV9WRVJTSU9OX0ZJTFRFUiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIHByb2dyYW0gb3Igc2NyaXB0IHRoYXQKKyMgZG94eWdlbiBzaG91bGQgaW52b2tlIHRvIGdldCB0aGUgY3VycmVudCB2ZXJzaW9uIGZvciBlYWNoIGZpbGUgKHR5cGljYWxseSBmcm9tCisjIHRoZSB2ZXJzaW9uIGNvbnRyb2wgc3lzdGVtKS4gRG94eWdlbiB3aWxsIGludm9rZSB0aGUgcHJvZ3JhbSBieSBleGVjdXRpbmcgKHZpYQorIyBwb3BlbigpKSB0aGUgY29tbWFuZCBjb21tYW5kIGlucHV0LWZpbGUsIHdoZXJlIGNvbW1hbmQgaXMgdGhlIHZhbHVlIG9mIHRoZQorIyBGSUxFX1ZFUlNJT05fRklMVEVSIHRhZywgYW5kIGlucHV0LWZpbGUgaXMgdGhlIG5hbWUgb2YgYW4gaW5wdXQgZmlsZSBwcm92aWRlZAorIyBieSBkb3h5Z2VuLiBXaGF0ZXZlciB0aGUgcHJvZ3JhbSB3cml0ZXMgdG8gc3RhbmRhcmQgb3V0cHV0IGlzIHVzZWQgYXMgdGhlIGZpbGUKKyMgdmVyc2lvbi4gRm9yIGFuIGV4YW1wbGUgc2VlIHRoZSBkb2N1bWVudGF0aW9uLgorCitGSUxFX1ZFUlNJT05fRklMVEVSICAgID0gCisKKyMgVGhlIExBWU9VVF9GSUxFIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgbGF5b3V0IGZpbGUgd2hpY2ggd2lsbCBiZSBwYXJzZWQKKyMgYnkgZG94eWdlbi4gVGhlIGxheW91dCBmaWxlIGNvbnRyb2xzIHRoZSBnbG9iYWwgc3RydWN0dXJlIG9mIHRoZSBnZW5lcmF0ZWQKKyMgb3V0cHV0IGZpbGVzIGluIGFuIG91dHB1dCBmb3JtYXQgaW5kZXBlbmRlbnQgd2F5LiBUbyBjcmVhdGUgdGhlIGxheW91dCBmaWxlCisjIHRoYXQgcmVwcmVzZW50cyBkb3h5Z2VuJ3MgZGVmYXVsdHMsIHJ1biBkb3h5Z2VuIHdpdGggdGhlIC1sIG9wdGlvbi4gWW91IGNhbgorIyBvcHRpb25hbGx5IHNwZWNpZnkgYSBmaWxlIG5hbWUgYWZ0ZXIgdGhlIG9wdGlvbiwgaWYgb21pdHRlZCBEb3h5Z2VuTGF5b3V0LnhtbAorIyB3aWxsIGJlIHVzZWQgYXMgdGhlIG5hbWUgb2YgdGhlIGxheW91dCBmaWxlLgorIworIyBOb3RlIHRoYXQgaWYgeW91IHJ1biBkb3h5Z2VuIGZyb20gYSBkaXJlY3RvcnkgY29udGFpbmluZyBhIGZpbGUgY2FsbGVkCisjIERveHlnZW5MYXlvdXQueG1sLCBkb3h5Z2VuIHdpbGwgcGFyc2UgaXQgYXV0b21hdGljYWxseSBldmVuIGlmIHRoZSBMQVlPVVRfRklMRQorIyB0YWcgaXMgbGVmdCBlbXB0eS4KKworTEFZT1VUX0ZJTEUgICAgICAgICAgICA9IAorCisjIFRoZSBDSVRFX0JJQl9GSUxFUyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBiaWIgZmlsZXMgY29udGFpbmluZworIyB0aGUgcmVmZXJlbmNlIGRlZmluaXRpb25zLiBUaGlzIG11c3QgYmUgYSBsaXN0IG9mIC5iaWIgZmlsZXMuIFRoZSAuYmliCisjIGV4dGVuc2lvbiBpcyBhdXRvbWF0aWNhbGx5IGFwcGVuZGVkIGlmIG9taXR0ZWQuIFRoaXMgcmVxdWlyZXMgdGhlIGJpYnRleCB0b29sCisjIHRvIGJlIGluc3RhbGxlZC4gU2VlIGFsc28gaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9CaWJUZVggZm9yIG1vcmUgaW5mby4KKyMgRm9yIExhVGVYIHRoZSBzdHlsZSBvZiB0aGUgYmlibGlvZ3JhcGh5IGNhbiBiZSBjb250cm9sbGVkIHVzaW5nCisjIExBVEVYX0JJQl9TVFlMRS4gVG8gdXNlIHRoaXMgZmVhdHVyZSB5b3UgbmVlZCBiaWJ0ZXggYW5kIHBlcmwgYXZhaWxhYmxlIGluIHRoZQorIyBzZWFyY2ggcGF0aC4gU2VlIGFsc28gXGNpdGUgZm9yIGluZm8gaG93IHRvIGNyZWF0ZSByZWZlcmVuY2VzLgorCitDSVRFX0JJQl9GSUxFUyAgICAgICAgID0gCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gd2FybmluZyBhbmQgcHJvZ3Jlc3MgbWVzc2FnZXMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBUaGUgUVVJRVQgdGFnIGNhbiBiZSB1c2VkIHRvIHR1cm4gb24vb2ZmIHRoZSBtZXNzYWdlcyB0aGF0IGFyZSBnZW5lcmF0ZWQgdG8KKyMgc3RhbmRhcmQgb3V0cHV0IGJ5IGRveHlnZW4uIElmIFFVSUVUIGlzIHNldCB0byBZRVMgdGhpcyBpbXBsaWVzIHRoYXQgdGhlCisjIG1lc3NhZ2VzIGFyZSBvZmYuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworUVVJRVQgICAgICAgICAgICAgICAgICA9IE5PCisKKyMgVGhlIFdBUk5JTkdTIHRhZyBjYW4gYmUgdXNlZCB0byB0dXJuIG9uL29mZiB0aGUgd2FybmluZyBtZXNzYWdlcyB0aGF0IGFyZQorIyBnZW5lcmF0ZWQgdG8gc3RhbmRhcmQgZXJyb3IgKHN0ZGVycikgYnkgZG94eWdlbi4gSWYgV0FSTklOR1MgaXMgc2V0IHRvIFlFUworIyB0aGlzIGltcGxpZXMgdGhhdCB0aGUgd2FybmluZ3MgYXJlIG9uLgorIworIyBUaXA6IFR1cm4gd2FybmluZ3Mgb24gd2hpbGUgd3JpdGluZyB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworV0FSTklOR1MgICAgICAgICAgICAgICA9IFlFUworCisjIElmIHRoZSBXQVJOX0lGX1VORE9DVU1FTlRFRCB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBnZW5lcmF0ZQorIyB3YXJuaW5ncyBmb3IgdW5kb2N1bWVudGVkIG1lbWJlcnMuIElmIEVYVFJBQ1RfQUxMIGlzIHNldCB0byBZRVMgdGhlbiB0aGlzIGZsYWcKKyMgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIGRpc2FibGVkLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitXQVJOX0lGX1VORE9DVU1FTlRFRCAgID0gWUVTCisKKyMgSWYgdGhlIFdBUk5fSUZfRE9DX0VSUk9SIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgd2FybmluZ3MgZm9yCisjIHBvdGVudGlhbCBlcnJvcnMgaW4gdGhlIGRvY3VtZW50YXRpb24sIHN1Y2ggYXMgbm90IGRvY3VtZW50aW5nIHNvbWUgcGFyYW1ldGVycworIyBpbiBhIGRvY3VtZW50ZWQgZnVuY3Rpb24sIG9yIGRvY3VtZW50aW5nIHBhcmFtZXRlcnMgdGhhdCBkb24ndCBleGlzdCBvciB1c2luZworIyBtYXJrdXAgY29tbWFuZHMgd3JvbmdseS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworV0FSTl9JRl9ET0NfRVJST1IgICAgICA9IFlFUworCisjIFRoaXMgV0FSTl9OT19QQVJBTURPQyBvcHRpb24gY2FuIGJlIGVuYWJsZWQgdG8gZ2V0IHdhcm5pbmdzIGZvciBmdW5jdGlvbnMgdGhhdAorIyBhcmUgZG9jdW1lbnRlZCwgYnV0IGhhdmUgbm8gZG9jdW1lbnRhdGlvbiBmb3IgdGhlaXIgcGFyYW1ldGVycyBvciByZXR1cm4KKyMgdmFsdWUuIElmIHNldCB0byBOTywgZG94eWdlbiB3aWxsIG9ubHkgd2FybiBhYm91dCB3cm9uZyBvciBpbmNvbXBsZXRlCisjIHBhcmFtZXRlciBkb2N1bWVudGF0aW9uLCBidXQgbm90IGFib3V0IHRoZSBhYnNlbmNlIG9mIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworV0FSTl9OT19QQVJBTURPQyAgICAgICA9IE5PCisKKyMgSWYgdGhlIFdBUk5fQVNfRVJST1IgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgaW1tZWRpYXRlbHkgc3RvcCB3aGVuCisjIGEgd2FybmluZyBpcyBlbmNvdW50ZXJlZC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitXQVJOX0FTX0VSUk9SICAgICAgICAgID0gTk8KKworIyBUaGUgV0FSTl9GT1JNQVQgdGFnIGRldGVybWluZXMgdGhlIGZvcm1hdCBvZiB0aGUgd2FybmluZyBtZXNzYWdlcyB0aGF0IGRveHlnZW4KKyMgY2FuIHByb2R1Y2UuIFRoZSBzdHJpbmcgc2hvdWxkIGNvbnRhaW4gdGhlICRmaWxlLCAkbGluZSwgYW5kICR0ZXh0IHRhZ3MsIHdoaWNoCisjIHdpbGwgYmUgcmVwbGFjZWQgYnkgdGhlIGZpbGUgYW5kIGxpbmUgbnVtYmVyIGZyb20gd2hpY2ggdGhlIHdhcm5pbmcgb3JpZ2luYXRlZAorIyBhbmQgdGhlIHdhcm5pbmcgdGV4dC4gT3B0aW9uYWxseSB0aGUgZm9ybWF0IG1heSBjb250YWluICR2ZXJzaW9uLCB3aGljaCB3aWxsCisjIGJlIHJlcGxhY2VkIGJ5IHRoZSB2ZXJzaW9uIG9mIHRoZSBmaWxlIChpZiBpdCBjb3VsZCBiZSBvYnRhaW5lZCB2aWEKKyMgRklMRV9WRVJTSU9OX0ZJTFRFUikKKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6ICRmaWxlOiRsaW5lOiAkdGV4dC4KKworV0FSTl9GT1JNQVQgICAgICAgICAgICA9ICIkZmlsZTokbGluZTogJHRleHQiCisKKyMgVGhlIFdBUk5fTE9HRklMRSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIGZpbGUgdG8gd2hpY2ggd2FybmluZyBhbmQgZXJyb3IKKyMgbWVzc2FnZXMgc2hvdWxkIGJlIHdyaXR0ZW4uIElmIGxlZnQgYmxhbmsgdGhlIG91dHB1dCBpcyB3cml0dGVuIHRvIHN0YW5kYXJkCisjIGVycm9yIChzdGRlcnIpLgorCitXQVJOX0xPR0ZJTEUgICAgICAgICAgID0gCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIGlucHV0IGZpbGVzCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgVGhlIElOUFVUIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIGZpbGVzIGFuZC9vciBkaXJlY3RvcmllcyB0aGF0IGNvbnRhaW4KKyMgZG9jdW1lbnRlZCBzb3VyY2UgZmlsZXMuIFlvdSBtYXkgZW50ZXIgZmlsZSBuYW1lcyBsaWtlIG15ZmlsZS5jcHAgb3IKKyMgZGlyZWN0b3JpZXMgbGlrZSAvdXNyL3NyYy9teXByb2plY3QuIFNlcGFyYXRlIHRoZSBmaWxlcyBvciBkaXJlY3RvcmllcyB3aXRoCisjIHNwYWNlcy4gU2VlIGFsc28gRklMRV9QQVRURVJOUyBhbmQgRVhURU5TSU9OX01BUFBJTkcKKyMgTm90ZTogSWYgdGhpcyB0YWcgaXMgZW1wdHkgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGlzIHNlYXJjaGVkLgorCitJTlBVVCAgICAgICAgICAgICAgICAgID0gZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlYzIvCisKKyMgVGhpcyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgY2hhcmFjdGVyIGVuY29kaW5nIG9mIHRoZSBzb3VyY2UgZmlsZXMKKyMgdGhhdCBkb3h5Z2VuIHBhcnNlcy4gSW50ZXJuYWxseSBkb3h5Z2VuIHVzZXMgdGhlIFVURi04IGVuY29kaW5nLiBEb3h5Z2VuIHVzZXMKKyMgbGliaWNvbnYgKG9yIHRoZSBpY29udiBidWlsdCBpbnRvIGxpYmMpIGZvciB0aGUgdHJhbnNjb2RpbmcuIFNlZSB0aGUgbGliaWNvbnYKKyMgZG9jdW1lbnRhdGlvbiAoc2VlOiBodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvbGliaWNvbnYpIGZvciB0aGUgbGlzdCBvZgorIyBwb3NzaWJsZSBlbmNvZGluZ3MuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBVVEYtOC4KKworSU5QVVRfRU5DT0RJTkcgICAgICAgICA9IFVURi04CisKKyMgSWYgdGhlIHZhbHVlIG9mIHRoZSBJTlBVVCB0YWcgY29udGFpbnMgZGlyZWN0b3JpZXMsIHlvdSBjYW4gdXNlIHRoZQorIyBGSUxFX1BBVFRFUk5TIHRhZyB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIHdpbGRjYXJkIHBhdHRlcm5zIChsaWtlICouY3BwIGFuZAorIyAqLmgpIHRvIGZpbHRlciBvdXQgdGhlIHNvdXJjZS1maWxlcyBpbiB0aGUgZGlyZWN0b3JpZXMuCisjCisjIE5vdGUgdGhhdCBmb3IgY3VzdG9tIGV4dGVuc2lvbnMgb3Igbm90IGRpcmVjdGx5IHN1cHBvcnRlZCBleHRlbnNpb25zIHlvdSBhbHNvCisjIG5lZWQgdG8gc2V0IEVYVEVOU0lPTl9NQVBQSU5HIGZvciB0aGUgZXh0ZW5zaW9uIG90aGVyd2lzZSB0aGUgZmlsZXMgYXJlIG5vdAorIyByZWFkIGJ5IGRveHlnZW4uCisjCisjIElmIGxlZnQgYmxhbmsgdGhlIGZvbGxvd2luZyBwYXR0ZXJucyBhcmUgdGVzdGVkOiouYywgKi5jYywgKi5jeHgsICouY3BwLAorIyAqLmMrKywgKi5qYXZhLCAqLmlpLCAqLml4eCwgKi5pcHAsICouaSsrLCAqLmlubCwgKi5pZGwsICouZGRsLCAqLm9kbCwgKi5oLAorIyAqLmhoLCAqLmh4eCwgKi5ocHAsICouaCsrLCAqLmNzLCAqLmQsICoucGhwLCAqLnBocDQsICoucGhwNSwgKi5waHRtbCwgKi5pbmMsCisjICoubSwgKi5tYXJrZG93biwgKi5tZCwgKi5tbSwgKi5kb3gsICoucHksICoucHl3LCAqLmY5MCwgKi5mLCAqLmZvciwgKi50Y2wsCisjICoudmhkLCAqLnZoZGwsICoudWNmLCAqLnFzZiwgKi5hcyBhbmQgKi5qcy4KKworRklMRV9QQVRURVJOUyAgICAgICAgICA9IEMyKi5jIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDMiouY3BwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDMiouaAorCisjIFRoZSBSRUNVUlNJVkUgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgd2hldGhlciBvciBub3Qgc3ViZGlyZWN0b3JpZXMgc2hvdWxkCisjIGJlIHNlYXJjaGVkIGZvciBpbnB1dCBmaWxlcyBhcyB3ZWxsLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK1JFQ1VSU0lWRSAgICAgICAgICAgICAgPSBZRVMKKworIyBUaGUgRVhDTFVERSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBmaWxlcyBhbmQvb3IgZGlyZWN0b3JpZXMgdGhhdCBzaG91bGQgYmUKKyMgZXhjbHVkZWQgZnJvbSB0aGUgSU5QVVQgc291cmNlIGZpbGVzLiBUaGlzIHdheSB5b3UgY2FuIGVhc2lseSBleGNsdWRlIGEKKyMgc3ViZGlyZWN0b3J5IGZyb20gYSBkaXJlY3RvcnkgdHJlZSB3aG9zZSByb290IGlzIHNwZWNpZmllZCB3aXRoIHRoZSBJTlBVVCB0YWcuCisjCisjIE5vdGUgdGhhdCByZWxhdGl2ZSBwYXRocyBhcmUgcmVsYXRpdmUgdG8gdGhlIGRpcmVjdG9yeSBmcm9tIHdoaWNoIGRveHlnZW4gaXMKKyMgcnVuLgorCitFWENMVURFICAgICAgICAgICAgICAgID0gCisKKyMgVGhlIEVYQ0xVREVfU1lNTElOS1MgdGFnIGNhbiBiZSB1c2VkIHRvIHNlbGVjdCB3aGV0aGVyIG9yIG5vdCBmaWxlcyBvcgorIyBkaXJlY3RvcmllcyB0aGF0IGFyZSBzeW1ib2xpYyBsaW5rcyAoYSBVbml4IGZpbGUgc3lzdGVtIGZlYXR1cmUpIGFyZSBleGNsdWRlZAorIyBmcm9tIHRoZSBpbnB1dC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitFWENMVURFX1NZTUxJTktTICAgICAgID0gTk8KKworIyBJZiB0aGUgdmFsdWUgb2YgdGhlIElOUFVUIHRhZyBjb250YWlucyBkaXJlY3RvcmllcywgeW91IGNhbiB1c2UgdGhlCisjIEVYQ0xVREVfUEFUVEVSTlMgdGFnIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgd2lsZGNhcmQgcGF0dGVybnMgdG8gZXhjbHVkZQorIyBjZXJ0YWluIGZpbGVzIGZyb20gdGhvc2UgZGlyZWN0b3JpZXMuCisjCisjIE5vdGUgdGhhdCB0aGUgd2lsZGNhcmRzIGFyZSBtYXRjaGVkIGFnYWluc3QgdGhlIGZpbGUgd2l0aCBhYnNvbHV0ZSBwYXRoLCBzbyB0bworIyBleGNsdWRlIGFsbCB0ZXN0IGRpcmVjdG9yaWVzIGZvciBleGFtcGxlIHVzZSB0aGUgcGF0dGVybiAqL3Rlc3QvKgorCitFWENMVURFX1BBVFRFUk5TICAgICAgID0gLl8qCisKKyMgVGhlIEVYQ0xVREVfU1lNQk9MUyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBzeW1ib2wgbmFtZXMKKyMgKG5hbWVzcGFjZXMsIGNsYXNzZXMsIGZ1bmN0aW9ucywgZXRjLikgdGhhdCBzaG91bGQgYmUgZXhjbHVkZWQgZnJvbSB0aGUKKyMgb3V0cHV0LiBUaGUgc3ltYm9sIG5hbWUgY2FuIGJlIGEgZnVsbHkgcXVhbGlmaWVkIG5hbWUsIGEgd29yZCwgb3IgaWYgdGhlCisjIHdpbGRjYXJkICogaXMgdXNlZCwgYSBzdWJzdHJpbmcuIEV4YW1wbGVzOiBBTmFtZXNwYWNlLCBBQ2xhc3MsCisjIEFDbGFzczo6QU5hbWVzcGFjZSwgQU5hbWVzcGFjZTo6KlRlc3QKKyMKKyMgTm90ZSB0aGF0IHRoZSB3aWxkY2FyZHMgYXJlIG1hdGNoZWQgYWdhaW5zdCB0aGUgZmlsZSB3aXRoIGFic29sdXRlIHBhdGgsIHNvIHRvCisjIGV4Y2x1ZGUgYWxsIHRlc3QgZGlyZWN0b3JpZXMgdXNlIHRoZSBwYXR0ZXJuICovdGVzdC8qCisKK0VYQ0xVREVfU1lNQk9MUyAgICAgICAgPSAKKworIyBUaGUgRVhBTVBMRV9QQVRIIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGZpbGVzIG9yIGRpcmVjdG9yaWVzCisjIHRoYXQgY29udGFpbiBleGFtcGxlIGNvZGUgZnJhZ21lbnRzIHRoYXQgYXJlIGluY2x1ZGVkIChzZWUgdGhlIFxpbmNsdWRlCisjIGNvbW1hbmQpLgorCitFWEFNUExFX1BBVEggICAgICAgICAgID0gCisKKyMgSWYgdGhlIHZhbHVlIG9mIHRoZSBFWEFNUExFX1BBVEggdGFnIGNvbnRhaW5zIGRpcmVjdG9yaWVzLCB5b3UgY2FuIHVzZSB0aGUKKyMgRVhBTVBMRV9QQVRURVJOUyB0YWcgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSB3aWxkY2FyZCBwYXR0ZXJuIChsaWtlICouY3BwIGFuZAorIyAqLmgpIHRvIGZpbHRlciBvdXQgdGhlIHNvdXJjZS1maWxlcyBpbiB0aGUgZGlyZWN0b3JpZXMuIElmIGxlZnQgYmxhbmsgYWxsCisjIGZpbGVzIGFyZSBpbmNsdWRlZC4KKworRVhBTVBMRV9QQVRURVJOUyAgICAgICA9ICoKKworIyBJZiB0aGUgRVhBTVBMRV9SRUNVUlNJVkUgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBzdWJkaXJlY3RvcmllcyB3aWxsIGJlCisjIHNlYXJjaGVkIGZvciBpbnB1dCBmaWxlcyB0byBiZSB1c2VkIHdpdGggdGhlIFxpbmNsdWRlIG9yIFxkb250aW5jbHVkZSBjb21tYW5kcworIyBpcnJlc3BlY3RpdmUgb2YgdGhlIHZhbHVlIG9mIHRoZSBSRUNVUlNJVkUgdGFnLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0VYQU1QTEVfUkVDVVJTSVZFICAgICAgPSBOTworCisjIFRoZSBJTUFHRV9QQVRIIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGZpbGVzIG9yIGRpcmVjdG9yaWVzCisjIHRoYXQgY29udGFpbiBpbWFnZXMgdGhhdCBhcmUgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gKHNlZSB0aGUKKyMgXGltYWdlIGNvbW1hbmQpLgorCitJTUFHRV9QQVRIICAgICAgICAgICAgID0gCisKKyMgVGhlIElOUFVUX0ZJTFRFUiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIHByb2dyYW0gdGhhdCBkb3h5Z2VuIHNob3VsZAorIyBpbnZva2UgdG8gZmlsdGVyIGZvciBlYWNoIGlucHV0IGZpbGUuIERveHlnZW4gd2lsbCBpbnZva2UgdGhlIGZpbHRlciBwcm9ncmFtCisjIGJ5IGV4ZWN1dGluZyAodmlhIHBvcGVuKCkpIHRoZSBjb21tYW5kOgorIworIyA8ZmlsdGVyPiA8aW5wdXQtZmlsZT4KKyMKKyMgd2hlcmUgPGZpbHRlcj4gaXMgdGhlIHZhbHVlIG9mIHRoZSBJTlBVVF9GSUxURVIgdGFnLCBhbmQgPGlucHV0LWZpbGU+IGlzIHRoZQorIyBuYW1lIG9mIGFuIGlucHV0IGZpbGUuIERveHlnZW4gd2lsbCB0aGVuIHVzZSB0aGUgb3V0cHV0IHRoYXQgdGhlIGZpbHRlcgorIyBwcm9ncmFtIHdyaXRlcyB0byBzdGFuZGFyZCBvdXRwdXQuIElmIEZJTFRFUl9QQVRURVJOUyBpcyBzcGVjaWZpZWQsIHRoaXMgdGFnCisjIHdpbGwgYmUgaWdub3JlZC4KKyMKKyMgTm90ZSB0aGF0IHRoZSBmaWx0ZXIgbXVzdCBub3QgYWRkIG9yIHJlbW92ZSBsaW5lczsgaXQgaXMgYXBwbGllZCBiZWZvcmUgdGhlCisjIGNvZGUgaXMgc2Nhbm5lZCwgYnV0IG5vdCB3aGVuIHRoZSBvdXRwdXQgY29kZSBpcyBnZW5lcmF0ZWQuIElmIGxpbmVzIGFyZSBhZGRlZAorIyBvciByZW1vdmVkLCB0aGUgYW5jaG9ycyB3aWxsIG5vdCBiZSBwbGFjZWQgY29ycmVjdGx5LgorIworIyBOb3RlIHRoYXQgZm9yIGN1c3RvbSBleHRlbnNpb25zIG9yIG5vdCBkaXJlY3RseSBzdXBwb3J0ZWQgZXh0ZW5zaW9ucyB5b3UgYWxzbworIyBuZWVkIHRvIHNldCBFWFRFTlNJT05fTUFQUElORyBmb3IgdGhlIGV4dGVuc2lvbiBvdGhlcndpc2UgdGhlIGZpbGVzIGFyZSBub3QKKyMgcHJvcGVybHkgcHJvY2Vzc2VkIGJ5IGRveHlnZW4uCisKK0lOUFVUX0ZJTFRFUiAgICAgICAgICAgPSBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjMi9kb2NzL2RveHlmaWx0ZXIuc2gKKworIyBUaGUgRklMVEVSX1BBVFRFUk5TIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGZpbHRlcnMgb24gYSBwZXIgZmlsZSBwYXR0ZXJuCisjIGJhc2lzLiBEb3h5Z2VuIHdpbGwgY29tcGFyZSB0aGUgZmlsZSBuYW1lIHdpdGggZWFjaCBwYXR0ZXJuIGFuZCBhcHBseSB0aGUKKyMgZmlsdGVyIGlmIHRoZXJlIGlzIGEgbWF0Y2guIFRoZSBmaWx0ZXJzIGFyZSBhIGxpc3Qgb2YgdGhlIGZvcm06IHBhdHRlcm49ZmlsdGVyCisjIChsaWtlICouY3BwPW15X2NwcF9maWx0ZXIpLiBTZWUgSU5QVVRfRklMVEVSIGZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIG9uIGhvdworIyBmaWx0ZXJzIGFyZSB1c2VkLiBJZiB0aGUgRklMVEVSX1BBVFRFUk5TIHRhZyBpcyBlbXB0eSBvciBpZiBub25lIG9mIHRoZQorIyBwYXR0ZXJucyBtYXRjaCB0aGUgZmlsZSBuYW1lLCBJTlBVVF9GSUxURVIgaXMgYXBwbGllZC4KKyMKKyMgTm90ZSB0aGF0IGZvciBjdXN0b20gZXh0ZW5zaW9ucyBvciBub3QgZGlyZWN0bHkgc3VwcG9ydGVkIGV4dGVuc2lvbnMgeW91IGFsc28KKyMgbmVlZCB0byBzZXQgRVhURU5TSU9OX01BUFBJTkcgZm9yIHRoZSBleHRlbnNpb24gb3RoZXJ3aXNlIHRoZSBmaWxlcyBhcmUgbm90CisjIHByb3Blcmx5IHByb2Nlc3NlZCBieSBkb3h5Z2VuLgorCitGSUxURVJfUEFUVEVSTlMgICAgICAgID0gCisKKyMgSWYgdGhlIEZJTFRFUl9TT1VSQ0VfRklMRVMgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBpbnB1dCBmaWx0ZXIgKGlmIHNldCB1c2luZworIyBJTlBVVF9GSUxURVIpIHdpbGwgYWxzbyBiZSB1c2VkIHRvIGZpbHRlciB0aGUgaW5wdXQgZmlsZXMgdGhhdCBhcmUgdXNlZCBmb3IKKyMgcHJvZHVjaW5nIHRoZSBzb3VyY2UgZmlsZXMgdG8gYnJvd3NlIChpLmUuIHdoZW4gU09VUkNFX0JST1dTRVIgaXMgc2V0IHRvIFlFUykuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworRklMVEVSX1NPVVJDRV9GSUxFUyAgICA9IFlFUworCisjIFRoZSBGSUxURVJfU09VUkNFX1BBVFRFUk5TIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHNvdXJjZSBmaWx0ZXJzIHBlciBmaWxlCisjIHBhdHRlcm4uIEEgcGF0dGVybiB3aWxsIG92ZXJyaWRlIHRoZSBzZXR0aW5nIGZvciBGSUxURVJfUEFUVEVSTiAoaWYgYW55KSBhbmQKKyMgaXQgaXMgYWxzbyBwb3NzaWJsZSB0byBkaXNhYmxlIHNvdXJjZSBmaWx0ZXJpbmcgZm9yIGEgc3BlY2lmaWMgcGF0dGVybiB1c2luZworIyAqLmV4dD0gKHNvIHdpdGhvdXQgbmFtaW5nIGEgZmlsdGVyKS4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEZJTFRFUl9TT1VSQ0VfRklMRVMgaXMgc2V0IHRvIFlFUy4KKworRklMVEVSX1NPVVJDRV9QQVRURVJOUyA9IAorCisjIElmIHRoZSBVU0VfTURGSUxFX0FTX01BSU5QQUdFIHRhZyByZWZlcnMgdG8gdGhlIG5hbWUgb2YgYSBtYXJrZG93biBmaWxlIHRoYXQKKyMgaXMgcGFydCBvZiB0aGUgaW5wdXQsIGl0cyBjb250ZW50cyB3aWxsIGJlIHBsYWNlZCBvbiB0aGUgbWFpbiBwYWdlCisjIChpbmRleC5odG1sKS4gVGhpcyBjYW4gYmUgdXNlZnVsIGlmIHlvdSBoYXZlIGEgcHJvamVjdCBvbiBmb3IgaW5zdGFuY2UgR2l0SHViCisjIGFuZCB3YW50IHRvIHJldXNlIHRoZSBpbnRyb2R1Y3Rpb24gcGFnZSBhbHNvIGZvciB0aGUgZG94eWdlbiBvdXRwdXQuCisKK1VTRV9NREZJTEVfQVNfTUFJTlBBR0UgPSAKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byBzb3VyY2UgYnJvd3NpbmcKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgU09VUkNFX0JST1dTRVIgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBhIGxpc3Qgb2Ygc291cmNlIGZpbGVzIHdpbGwgYmUKKyMgZ2VuZXJhdGVkLiBEb2N1bWVudGVkIGVudGl0aWVzIHdpbGwgYmUgY3Jvc3MtcmVmZXJlbmNlZCB3aXRoIHRoZXNlIHNvdXJjZXMuCisjCisjIE5vdGU6IFRvIGdldCByaWQgb2YgYWxsIHNvdXJjZSBjb2RlIGluIHRoZSBnZW5lcmF0ZWQgb3V0cHV0LCBtYWtlIHN1cmUgdGhhdAorIyBhbHNvIFZFUkJBVElNX0hFQURFUlMgaXMgc2V0IHRvIE5PLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK1NPVVJDRV9CUk9XU0VSICAgICAgICAgPSBZRVMKKworIyBTZXR0aW5nIHRoZSBJTkxJTkVfU09VUkNFUyB0YWcgdG8gWUVTIHdpbGwgaW5jbHVkZSB0aGUgYm9keSBvZiBmdW5jdGlvbnMsCisjIGNsYXNzZXMgYW5kIGVudW1zIGRpcmVjdGx5IGludG8gdGhlIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworSU5MSU5FX1NPVVJDRVMgICAgICAgICA9IE5PCisKKyMgU2V0dGluZyB0aGUgU1RSSVBfQ09ERV9DT01NRU5UUyB0YWcgdG8gWUVTIHdpbGwgaW5zdHJ1Y3QgZG94eWdlbiB0byBoaWRlIGFueQorIyBzcGVjaWFsIGNvbW1lbnQgYmxvY2tzIGZyb20gZ2VuZXJhdGVkIHNvdXJjZSBjb2RlIGZyYWdtZW50cy4gTm9ybWFsIEMsIEMrKyBhbmQKKyMgRm9ydHJhbiBjb21tZW50cyB3aWxsIGFsd2F5cyByZW1haW4gdmlzaWJsZS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworU1RSSVBfQ09ERV9DT01NRU5UUyAgICA9IFlFUworCisjIElmIHRoZSBSRUZFUkVOQ0VEX0JZX1JFTEFUSU9OIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZm9yIGVhY2ggZG9jdW1lbnRlZAorIyBmdW5jdGlvbiBhbGwgZG9jdW1lbnRlZCBmdW5jdGlvbnMgcmVmZXJlbmNpbmcgaXQgd2lsbCBiZSBsaXN0ZWQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworUkVGRVJFTkNFRF9CWV9SRUxBVElPTiA9IFlFUworCisjIElmIHRoZSBSRUZFUkVOQ0VTX1JFTEFUSU9OIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZm9yIGVhY2ggZG9jdW1lbnRlZCBmdW5jdGlvbgorIyBhbGwgZG9jdW1lbnRlZCBlbnRpdGllcyBjYWxsZWQvdXNlZCBieSB0aGF0IGZ1bmN0aW9uIHdpbGwgYmUgbGlzdGVkLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK1JFRkVSRU5DRVNfUkVMQVRJT04gICAgPSBZRVMKKworIyBJZiB0aGUgUkVGRVJFTkNFU19MSU5LX1NPVVJDRSB0YWcgaXMgc2V0IHRvIFlFUyBhbmQgU09VUkNFX0JST1dTRVIgdGFnIGlzIHNldAorIyB0byBZRVMgdGhlbiB0aGUgaHlwZXJsaW5rcyBmcm9tIGZ1bmN0aW9ucyBpbiBSRUZFUkVOQ0VTX1JFTEFUSU9OIGFuZAorIyBSRUZFUkVOQ0VEX0JZX1JFTEFUSU9OIGxpc3RzIHdpbGwgbGluayB0byB0aGUgc291cmNlIGNvZGUuIE90aGVyd2lzZSB0aGV5IHdpbGwKKyMgbGluayB0byB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworUkVGRVJFTkNFU19MSU5LX1NPVVJDRSA9IFlFUworCisjIElmIFNPVVJDRV9UT09MVElQUyBpcyBlbmFibGVkICh0aGUgZGVmYXVsdCkgdGhlbiBob3ZlcmluZyBhIGh5cGVybGluayBpbiB0aGUKKyMgc291cmNlIGNvZGUgd2lsbCBzaG93IGEgdG9vbHRpcCB3aXRoIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gc3VjaCBhcyBwcm90b3R5cGUsCisjIGJyaWVmIGRlc2NyaXB0aW9uIGFuZCBsaW5rcyB0byB0aGUgZGVmaW5pdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4gU2luY2UgdGhpcworIyB3aWxsIG1ha2UgdGhlIEhUTUwgZmlsZSBsYXJnZXIgYW5kIGxvYWRpbmcgb2YgbGFyZ2UgZmlsZXMgYSBiaXQgc2xvd2VyLCB5b3UKKyMgY2FuIG9wdCB0byBkaXNhYmxlIHRoaXMgZmVhdHVyZS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIFNPVVJDRV9CUk9XU0VSIGlzIHNldCB0byBZRVMuCisKK1NPVVJDRV9UT09MVElQUyAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgVVNFX0hUQUdTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gdGhlIHJlZmVyZW5jZXMgdG8gc291cmNlIGNvZGUgd2lsbAorIyBwb2ludCB0byB0aGUgSFRNTCBnZW5lcmF0ZWQgYnkgdGhlIGh0YWdzKDEpIHRvb2wgaW5zdGVhZCBvZiBkb3h5Z2VuIGJ1aWx0LWluCisjIHNvdXJjZSBicm93c2VyLiBUaGUgaHRhZ3MgdG9vbCBpcyBwYXJ0IG9mIEdOVSdzIGdsb2JhbCBzb3VyY2UgdGFnZ2luZyBzeXN0ZW0KKyMgKHNlZSBodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvZ2xvYmFsL2dsb2JhbC5odG1sKS4gWW91IHdpbGwgbmVlZCB2ZXJzaW9uCisjIDQuOC42IG9yIGhpZ2hlci4KKyMKKyMgVG8gdXNlIGl0IGRvIHRoZSBmb2xsb3dpbmc6CisjIC0gSW5zdGFsbCB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgZ2xvYmFsCisjIC0gRW5hYmxlIFNPVVJDRV9CUk9XU0VSIGFuZCBVU0VfSFRBR1MgaW4gdGhlIGNvbmZpZyBmaWxlCisjIC0gTWFrZSBzdXJlIHRoZSBJTlBVVCBwb2ludHMgdG8gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlCisjIC0gUnVuIGRveHlnZW4gYXMgbm9ybWFsCisjCisjIERveHlnZW4gd2lsbCBpbnZva2UgaHRhZ3MgKGFuZCB0aGF0IHdpbGwgaW4gdHVybiBpbnZva2UgZ3RhZ3MpLCBzbyB0aGVzZQorIyB0b29scyBtdXN0IGJlIGF2YWlsYWJsZSBmcm9tIHRoZSBjb21tYW5kIGxpbmUgKGkuZS4gaW4gdGhlIHNlYXJjaCBwYXRoKS4KKyMKKyMgVGhlIHJlc3VsdDogaW5zdGVhZCBvZiB0aGUgc291cmNlIGJyb3dzZXIgZ2VuZXJhdGVkIGJ5IGRveHlnZW4sIHRoZSBsaW5rcyB0bworIyBzb3VyY2UgY29kZSB3aWxsIG5vdyBwb2ludCB0byB0aGUgb3V0cHV0IG9mIGh0YWdzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBTT1VSQ0VfQlJPV1NFUiBpcyBzZXQgdG8gWUVTLgorCitVU0VfSFRBR1MgICAgICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgVkVSQkFUSU1fSEVBREVSUyB0YWcgaXMgc2V0IHRoZSBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYQorIyB2ZXJiYXRpbSBjb3B5IG9mIHRoZSBoZWFkZXIgZmlsZSBmb3IgZWFjaCBjbGFzcyBmb3Igd2hpY2ggYW4gaW5jbHVkZSBpcworIyBzcGVjaWZpZWQuIFNldCB0byBOTyB0byBkaXNhYmxlIHRoaXMuCisjIFNlZSBhbHNvOiBTZWN0aW9uIFxjbGFzcy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworVkVSQkFUSU1fSEVBREVSUyAgICAgICA9IFlFUworCisjIElmIHRoZSBDTEFOR19BU1NJU1RFRF9QQVJTSU5HIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIHVzZSB0aGUKKyMgY2xhbmcgcGFyc2VyIChzZWU6IGh0dHA6Ly9jbGFuZy5sbHZtLm9yZy8pIGZvciBtb3JlIGFjY3VyYXRlIHBhcnNpbmcgYXQgdGhlCisjIGNvc3Qgb2YgcmVkdWNlZCBwZXJmb3JtYW5jZS4gVGhpcyBjYW4gYmUgcGFydGljdWxhcmx5IGhlbHBmdWwgd2l0aCB0ZW1wbGF0ZQorIyByaWNoIEMrKyBjb2RlIGZvciB3aGljaCBkb3h5Z2VuJ3MgYnVpbHQtaW4gcGFyc2VyIGxhY2tzIHRoZSBuZWNlc3NhcnkgdHlwZQorIyBpbmZvcm1hdGlvbi4KKyMgTm90ZTogVGhlIGF2YWlsYWJpbGl0eSBvZiB0aGlzIG9wdGlvbiBkZXBlbmRzIG9uIHdoZXRoZXIgb3Igbm90IGRveHlnZW4gd2FzCisjIGdlbmVyYXRlZCB3aXRoIHRoZSAtRHVzZS1saWJjbGFuZz1PTiBvcHRpb24gZm9yIENNYWtlLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0NMQU5HX0FTU0lTVEVEX1BBUlNJTkcgPSBZRVMKKworIyBJZiBjbGFuZyBhc3Npc3RlZCBwYXJzaW5nIGlzIGVuYWJsZWQgeW91IGNhbiBwcm92aWRlIHRoZSBjb21waWxlciB3aXRoIGNvbW1hbmQKKyMgbGluZSBvcHRpb25zIHRoYXQgeW91IHdvdWxkIG5vcm1hbGx5IHVzZSB3aGVuIGludm9raW5nIHRoZSBjb21waWxlci4gTm90ZSB0aGF0CisjIHRoZSBpbmNsdWRlIHBhdGhzIHdpbGwgYWxyZWFkeSBiZSBzZXQgYnkgZG94eWdlbiBmb3IgdGhlIGZpbGVzIGFuZCBkaXJlY3RvcmllcworIyBzcGVjaWZpZWQgd2l0aCBJTlBVVCBhbmQgSU5DTFVERV9QQVRILgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgQ0xBTkdfQVNTSVNURURfUEFSU0lORyBpcyBzZXQgdG8gWUVTLgorCitDTEFOR19PUFRJT05TICAgICAgICAgID0gLXN0ZD1jKysxNAorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBhbHBoYWJldGljYWwgY2xhc3MgaW5kZXgKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgQUxQSEFCRVRJQ0FMX0lOREVYIHRhZyBpcyBzZXQgdG8gWUVTLCBhbiBhbHBoYWJldGljYWwgaW5kZXggb2YgYWxsCisjIGNvbXBvdW5kcyB3aWxsIGJlIGdlbmVyYXRlZC4gRW5hYmxlIHRoaXMgaWYgdGhlIHByb2plY3QgY29udGFpbnMgYSBsb3Qgb2YKKyMgY2xhc3Nlcywgc3RydWN0cywgdW5pb25zIG9yIGludGVyZmFjZXMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK0FMUEhBQkVUSUNBTF9JTkRFWCAgICAgPSBZRVMKKworIyBUaGUgQ09MU19JTl9BTFBIQV9JTkRFWCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgaW4KKyMgd2hpY2ggdGhlIGFscGhhYmV0aWNhbCBpbmRleCBsaXN0IHdpbGwgYmUgc3BsaXQuCisjIE1pbmltdW0gdmFsdWU6IDEsIG1heGltdW0gdmFsdWU6IDIwLCBkZWZhdWx0IHZhbHVlOiA1LgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgQUxQSEFCRVRJQ0FMX0lOREVYIGlzIHNldCB0byBZRVMuCisKK0NPTFNfSU5fQUxQSEFfSU5ERVggICAgPSA1CisKKyMgSW4gY2FzZSBhbGwgY2xhc3NlcyBpbiBhIHByb2plY3Qgc3RhcnQgd2l0aCBhIGNvbW1vbiBwcmVmaXgsIGFsbCBjbGFzc2VzIHdpbGwKKyMgYmUgcHV0IHVuZGVyIHRoZSBzYW1lIGhlYWRlciBpbiB0aGUgYWxwaGFiZXRpY2FsIGluZGV4LiBUaGUgSUdOT1JFX1BSRUZJWCB0YWcKKyMgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIHByZWZpeCAob3IgYSBsaXN0IG9mIHByZWZpeGVzKSB0aGF0IHNob3VsZCBiZSBpZ25vcmVkCisjIHdoaWxlIGdlbmVyYXRpbmcgdGhlIGluZGV4IGhlYWRlcnMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBBTFBIQUJFVElDQUxfSU5ERVggaXMgc2V0IHRvIFlFUy4KKworSUdOT1JFX1BSRUZJWCAgICAgICAgICA9IAorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBIVE1MIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBHRU5FUkFURV9IVE1MIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgSFRNTCBvdXRwdXQKKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworR0VORVJBVEVfSFRNTCAgICAgICAgICA9IFlFUworCisjIFRoZSBIVE1MX09VVFBVVCB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHdoZXJlIHRoZSBIVE1MIGRvY3Mgd2lsbCBiZSBwdXQuIElmIGEKKyMgcmVsYXRpdmUgcGF0aCBpcyBlbnRlcmVkIHRoZSB2YWx1ZSBvZiBPVVRQVVRfRElSRUNUT1JZIHdpbGwgYmUgcHV0IGluIGZyb250IG9mCisjIGl0LgorIyBUaGUgZGVmYXVsdCBkaXJlY3RvcnkgaXM6IGh0bWwuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0hUTUxfT1VUUFVUICAgICAgICAgICAgPSBodG1sCisKKyMgVGhlIEhUTUxfRklMRV9FWFRFTlNJT04gdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGZpbGUgZXh0ZW5zaW9uIGZvciBlYWNoCisjIGdlbmVyYXRlZCBIVE1MIHBhZ2UgKGZvciBleGFtcGxlOiAuaHRtLCAucGhwLCAuYXNwKS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IC5odG1sLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitIVE1MX0ZJTEVfRVhURU5TSU9OICAgID0gLmh0bWwKKworIyBUaGUgSFRNTF9IRUFERVIgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSB1c2VyLWRlZmluZWQgSFRNTCBoZWFkZXIgZmlsZSBmb3IKKyMgZWFjaCBnZW5lcmF0ZWQgSFRNTCBwYWdlLiBJZiB0aGUgdGFnIGlzIGxlZnQgYmxhbmsgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEKKyMgc3RhbmRhcmQgaGVhZGVyLgorIworIyBUbyBnZXQgdmFsaWQgSFRNTCB0aGUgaGVhZGVyIGZpbGUgdGhhdCBpbmNsdWRlcyBhbnkgc2NyaXB0cyBhbmQgc3R5bGUgc2hlZXRzCisjIHRoYXQgZG94eWdlbiBuZWVkcywgd2hpY2ggaXMgZGVwZW5kZW50IG9uIHRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgdXNlZCAoZS5nLgorIyB0aGUgc2V0dGluZyBHRU5FUkFURV9UUkVFVklFVykuIEl0IGlzIGhpZ2hseSByZWNvbW1lbmRlZCB0byBzdGFydCB3aXRoIGEKKyMgZGVmYXVsdCBoZWFkZXIgdXNpbmcKKyMgZG94eWdlbiAtdyBodG1sIG5ld19oZWFkZXIuaHRtbCBuZXdfZm9vdGVyLmh0bWwgbmV3X3N0eWxlc2hlZXQuY3NzCisjIFlvdXJDb25maWdGaWxlCisjIGFuZCB0aGVuIG1vZGlmeSB0aGUgZmlsZSBuZXdfaGVhZGVyLmh0bWwuIFNlZSBhbHNvIHNlY3Rpb24gIkRveHlnZW4gdXNhZ2UiCisjIGZvciBpbmZvcm1hdGlvbiBvbiBob3cgdG8gZ2VuZXJhdGUgdGhlIGRlZmF1bHQgaGVhZGVyIHRoYXQgZG94eWdlbiBub3JtYWxseQorIyB1c2VzLgorIyBOb3RlOiBUaGUgaGVhZGVyIGlzIHN1YmplY3QgdG8gY2hhbmdlIHNvIHlvdSB0eXBpY2FsbHkgaGF2ZSB0byByZWdlbmVyYXRlIHRoZQorIyBkZWZhdWx0IGhlYWRlciB3aGVuIHVwZ3JhZGluZyB0byBhIG5ld2VyIHZlcnNpb24gb2YgZG94eWdlbi4gRm9yIGEgZGVzY3JpcHRpb24KKyMgb2YgdGhlIHBvc3NpYmxlIG1hcmtlcnMgYW5kIGJsb2NrIG5hbWVzIHNlZSB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworSFRNTF9IRUFERVIgICAgICAgICAgICA9IAorCisjIFRoZSBIVE1MX0ZPT1RFUiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIHVzZXItZGVmaW5lZCBIVE1MIGZvb3RlciBmb3IgZWFjaAorIyBnZW5lcmF0ZWQgSFRNTCBwYWdlLiBJZiB0aGUgdGFnIGlzIGxlZnQgYmxhbmsgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgc3RhbmRhcmQKKyMgZm9vdGVyLiBTZWUgSFRNTF9IRUFERVIgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gaG93IHRvIGdlbmVyYXRlIGEgZGVmYXVsdAorIyBmb290ZXIgYW5kIHdoYXQgc3BlY2lhbCBjb21tYW5kcyBjYW4gYmUgdXNlZCBpbnNpZGUgdGhlIGZvb3Rlci4gU2VlIGFsc28KKyMgc2VjdGlvbiAiRG94eWdlbiB1c2FnZSIgZm9yIGluZm9ybWF0aW9uIG9uIGhvdyB0byBnZW5lcmF0ZSB0aGUgZGVmYXVsdCBmb290ZXIKKyMgdGhhdCBkb3h5Z2VuIG5vcm1hbGx5IHVzZXMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0hUTUxfRk9PVEVSICAgICAgICAgICAgPSAKKworIyBUaGUgSFRNTF9TVFlMRVNIRUVUIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgdXNlci1kZWZpbmVkIGNhc2NhZGluZyBzdHlsZQorIyBzaGVldCB0aGF0IGlzIHVzZWQgYnkgZWFjaCBIVE1MIHBhZ2UuIEl0IGNhbiBiZSB1c2VkIHRvIGZpbmUtdHVuZSB0aGUgbG9vayBvZgorIyB0aGUgSFRNTCBvdXRwdXQuIElmIGxlZnQgYmxhbmsgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgZGVmYXVsdCBzdHlsZSBzaGVldC4KKyMgU2VlIGFsc28gc2VjdGlvbiAiRG94eWdlbiB1c2FnZSIgZm9yIGluZm9ybWF0aW9uIG9uIGhvdyB0byBnZW5lcmF0ZSB0aGUgc3R5bGUKKyMgc2hlZXQgdGhhdCBkb3h5Z2VuIG5vcm1hbGx5IHVzZXMuCisjIE5vdGU6IEl0IGlzIHJlY29tbWVuZGVkIHRvIHVzZSBIVE1MX0VYVFJBX1NUWUxFU0hFRVQgaW5zdGVhZCBvZiB0aGlzIHRhZywgYXMKKyMgaXQgaXMgbW9yZSByb2J1c3QgYW5kIHRoaXMgdGFnIChIVE1MX1NUWUxFU0hFRVQpIHdpbGwgaW4gdGhlIGZ1dHVyZSBiZWNvbWUKKyMgb2Jzb2xldGUuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0hUTUxfU1RZTEVTSEVFVCAgICAgICAgPSAKKworIyBUaGUgSFRNTF9FWFRSQV9TVFlMRVNIRUVUIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGFkZGl0aW9uYWwgdXNlci1kZWZpbmVkCisjIGNhc2NhZGluZyBzdHlsZSBzaGVldHMgdGhhdCBhcmUgaW5jbHVkZWQgYWZ0ZXIgdGhlIHN0YW5kYXJkIHN0eWxlIHNoZWV0cworIyBjcmVhdGVkIGJ5IGRveHlnZW4uIFVzaW5nIHRoaXMgb3B0aW9uIG9uZSBjYW4gb3ZlcnJ1bGUgY2VydGFpbiBzdHlsZSBhc3BlY3RzLgorIyBUaGlzIGlzIHByZWZlcnJlZCBvdmVyIHVzaW5nIEhUTUxfU1RZTEVTSEVFVCBzaW5jZSBpdCBkb2VzIG5vdCByZXBsYWNlIHRoZQorIyBzdGFuZGFyZCBzdHlsZSBzaGVldCBhbmQgaXMgdGhlcmVmb3JlIG1vcmUgcm9idXN0IGFnYWluc3QgZnV0dXJlIHVwZGF0ZXMuCisjIERveHlnZW4gd2lsbCBjb3B5IHRoZSBzdHlsZSBzaGVldCBmaWxlcyB0byB0aGUgb3V0cHV0IGRpcmVjdG9yeS4KKyMgTm90ZTogVGhlIG9yZGVyIG9mIHRoZSBleHRyYSBzdHlsZSBzaGVldCBmaWxlcyBpcyBvZiBpbXBvcnRhbmNlIChlLmcuIHRoZSBsYXN0CisjIHN0eWxlIHNoZWV0IGluIHRoZSBsaXN0IG92ZXJydWxlcyB0aGUgc2V0dGluZyBvZiB0aGUgcHJldmlvdXMgb25lcyBpbiB0aGUKKyMgbGlzdCkuIEZvciBhbiBleGFtcGxlIHNlZSB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworSFRNTF9FWFRSQV9TVFlMRVNIRUVUICA9IAorCisjIFRoZSBIVE1MX0VYVFJBX0ZJTEVTIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGV4dHJhIGltYWdlcyBvcgorIyBvdGhlciBzb3VyY2UgZmlsZXMgd2hpY2ggc2hvdWxkIGJlIGNvcGllZCB0byB0aGUgSFRNTCBvdXRwdXQgZGlyZWN0b3J5LiBOb3RlCisjIHRoYXQgdGhlc2UgZmlsZXMgd2lsbCBiZSBjb3BpZWQgdG8gdGhlIGJhc2UgSFRNTCBvdXRwdXQgZGlyZWN0b3J5LiBVc2UgdGhlCisjICRyZWxwYXRoXiBtYXJrZXIgaW4gdGhlIEhUTUxfSEVBREVSIGFuZC9vciBIVE1MX0ZPT1RFUiBmaWxlcyB0byBsb2FkIHRoZXNlCisjIGZpbGVzLiBJbiB0aGUgSFRNTF9TVFlMRVNIRUVUIGZpbGUsIHVzZSB0aGUgZmlsZSBuYW1lIG9ubHkuIEFsc28gbm90ZSB0aGF0IHRoZQorIyBmaWxlcyB3aWxsIGJlIGNvcGllZCBhcy1pczsgdGhlcmUgYXJlIG5vIGNvbW1hbmRzIG9yIG1hcmtlcnMgYXZhaWxhYmxlLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitIVE1MX0VYVFJBX0ZJTEVTICAgICAgID0gCisKKyMgVGhlIEhUTUxfQ09MT1JTVFlMRV9IVUUgdGFnIGNvbnRyb2xzIHRoZSBjb2xvciBvZiB0aGUgSFRNTCBvdXRwdXQuIERveHlnZW4KKyMgd2lsbCBhZGp1c3QgdGhlIGNvbG9ycyBpbiB0aGUgc3R5bGUgc2hlZXQgYW5kIGJhY2tncm91bmQgaW1hZ2VzIGFjY29yZGluZyB0bworIyB0aGlzIGNvbG9yLiBIdWUgaXMgc3BlY2lmaWVkIGFzIGFuIGFuZ2xlIG9uIGEgY29sb3J3aGVlbCwgc2VlCisjIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSHVlIGZvciBtb3JlIGluZm9ybWF0aW9uLiBGb3IgaW5zdGFuY2UgdGhlIHZhbHVlCisjIDAgcmVwcmVzZW50cyByZWQsIDYwIGlzIHllbGxvdywgMTIwIGlzIGdyZWVuLCAxODAgaXMgY3lhbiwgMjQwIGlzIGJsdWUsIDMwMAorIyBwdXJwbGUsIGFuZCAzNjAgaXMgcmVkIGFnYWluLgorIyBNaW5pbXVtIHZhbHVlOiAwLCBtYXhpbXVtIHZhbHVlOiAzNTksIGRlZmF1bHQgdmFsdWU6IDIyMC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworSFRNTF9DT0xPUlNUWUxFX0hVRSAgICA9IDIyMAorCisjIFRoZSBIVE1MX0NPTE9SU1RZTEVfU0FUIHRhZyBjb250cm9scyB0aGUgcHVyaXR5IChvciBzYXR1cmF0aW9uKSBvZiB0aGUgY29sb3JzCisjIGluIHRoZSBIVE1MIG91dHB1dC4gRm9yIGEgdmFsdWUgb2YgMCB0aGUgb3V0cHV0IHdpbGwgdXNlIGdyYXlzY2FsZXMgb25seS4gQQorIyB2YWx1ZSBvZiAyNTUgd2lsbCBwcm9kdWNlIHRoZSBtb3N0IHZpdmlkIGNvbG9ycy4KKyMgTWluaW11bSB2YWx1ZTogMCwgbWF4aW11bSB2YWx1ZTogMjU1LCBkZWZhdWx0IHZhbHVlOiAxMDAuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0hUTUxfQ09MT1JTVFlMRV9TQVQgICAgPSAxMDAKKworIyBUaGUgSFRNTF9DT0xPUlNUWUxFX0dBTU1BIHRhZyBjb250cm9scyB0aGUgZ2FtbWEgY29ycmVjdGlvbiBhcHBsaWVkIHRvIHRoZQorIyBsdW1pbmFuY2UgY29tcG9uZW50IG9mIHRoZSBjb2xvcnMgaW4gdGhlIEhUTUwgb3V0cHV0LiBWYWx1ZXMgYmVsb3cgMTAwCisjIGdyYWR1YWxseSBtYWtlIHRoZSBvdXRwdXQgbGlnaHRlciwgd2hlcmVhcyB2YWx1ZXMgYWJvdmUgMTAwIG1ha2UgdGhlIG91dHB1dAorIyBkYXJrZXIuIFRoZSB2YWx1ZSBkaXZpZGVkIGJ5IDEwMCBpcyB0aGUgYWN0dWFsIGdhbW1hIGFwcGxpZWQsIHNvIDgwIHJlcHJlc2VudHMKKyMgYSBnYW1tYSBvZiAwLjgsIFRoZSB2YWx1ZSAyMjAgcmVwcmVzZW50cyBhIGdhbW1hIG9mIDIuMiwgYW5kIDEwMCBkb2VzIG5vdAorIyBjaGFuZ2UgdGhlIGdhbW1hLgorIyBNaW5pbXVtIHZhbHVlOiA0MCwgbWF4aW11bSB2YWx1ZTogMjQwLCBkZWZhdWx0IHZhbHVlOiA4MC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworSFRNTF9DT0xPUlNUWUxFX0dBTU1BICA9IDgwCisKKyMgSWYgdGhlIEhUTUxfVElNRVNUQU1QIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gdGhlIGZvb3RlciBvZiBlYWNoIGdlbmVyYXRlZCBIVE1MCisjIHBhZ2Ugd2lsbCBjb250YWluIHRoZSBkYXRlIGFuZCB0aW1lIHdoZW4gdGhlIHBhZ2Ugd2FzIGdlbmVyYXRlZC4gU2V0dGluZyB0aGlzCisjIHRvIFlFUyBjYW4gaGVscCB0byBzaG93IHdoZW4gZG94eWdlbiB3YXMgbGFzdCBydW4gYW5kIHRodXMgaWYgdGhlCisjIGRvY3VtZW50YXRpb24gaXMgdXAgdG8gZGF0ZS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitIVE1MX1RJTUVTVEFNUCAgICAgICAgID0gTk8KKworIyBJZiB0aGUgSFRNTF9EWU5BTUlDX1NFQ1RJT05TIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gdGhlIGdlbmVyYXRlZCBIVE1MCisjIGRvY3VtZW50YXRpb24gd2lsbCBjb250YWluIHNlY3Rpb25zIHRoYXQgY2FuIGJlIGhpZGRlbiBhbmQgc2hvd24gYWZ0ZXIgdGhlCisjIHBhZ2UgaGFzIGxvYWRlZC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitIVE1MX0RZTkFNSUNfU0VDVElPTlMgID0gWUVTCisKKyMgV2l0aCBIVE1MX0lOREVYX05VTV9FTlRSSUVTIG9uZSBjYW4gY29udHJvbCB0aGUgcHJlZmVycmVkIG51bWJlciBvZiBlbnRyaWVzCisjIHNob3duIGluIHRoZSB2YXJpb3VzIHRyZWUgc3RydWN0dXJlZCBpbmRpY2VzIGluaXRpYWxseTsgdGhlIHVzZXIgY2FuIGV4cGFuZAorIyBhbmQgY29sbGFwc2UgZW50cmllcyBkeW5hbWljYWxseSBsYXRlciBvbi4gRG94eWdlbiB3aWxsIGV4cGFuZCB0aGUgdHJlZSB0bworIyBzdWNoIGEgbGV2ZWwgdGhhdCBhdCBtb3N0IHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGVudHJpZXMgYXJlIHZpc2libGUgKHVubGVzcworIyBhIGZ1bGx5IGNvbGxhcHNlZCB0cmVlIGFscmVhZHkgZXhjZWVkcyB0aGlzIGFtb3VudCkuIFNvIHNldHRpbmcgdGhlIG51bWJlciBvZgorIyBlbnRyaWVzIDEgd2lsbCBwcm9kdWNlIGEgZnVsbCBjb2xsYXBzZWQgdHJlZSBieSBkZWZhdWx0LiAwIGlzIGEgc3BlY2lhbCB2YWx1ZQorIyByZXByZXNlbnRpbmcgYW4gaW5maW5pdGUgbnVtYmVyIG9mIGVudHJpZXMgYW5kIHdpbGwgcmVzdWx0IGluIGEgZnVsbCBleHBhbmRlZAorIyB0cmVlIGJ5IGRlZmF1bHQuCisjIE1pbmltdW0gdmFsdWU6IDAsIG1heGltdW0gdmFsdWU6IDk5OTksIGRlZmF1bHQgdmFsdWU6IDEwMC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworSFRNTF9JTkRFWF9OVU1fRU5UUklFUyA9IDEwMAorCisjIElmIHRoZSBHRU5FUkFURV9ET0NTRVQgdGFnIGlzIHNldCB0byBZRVMsIGFkZGl0aW9uYWwgaW5kZXggZmlsZXMgd2lsbCBiZQorIyBnZW5lcmF0ZWQgdGhhdCBjYW4gYmUgdXNlZCBhcyBpbnB1dCBmb3IgQXBwbGUncyBYY29kZSAzIGludGVncmF0ZWQgZGV2ZWxvcG1lbnQKKyMgZW52aXJvbm1lbnQgKHNlZTogaHR0cDovL2RldmVsb3Blci5hcHBsZS5jb20vdG9vbHMveGNvZGUvKSwgaW50cm9kdWNlZCB3aXRoCisjIE9TWCAxMC41IChMZW9wYXJkKS4gVG8gY3JlYXRlIGEgZG9jdW1lbnRhdGlvbiBzZXQsIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhCisjIE1ha2VmaWxlIGluIHRoZSBIVE1MIG91dHB1dCBkaXJlY3RvcnkuIFJ1bm5pbmcgbWFrZSB3aWxsIHByb2R1Y2UgdGhlIGRvY3NldCBpbgorIyB0aGF0IGRpcmVjdG9yeSBhbmQgcnVubmluZyBtYWtlIGluc3RhbGwgd2lsbCBpbnN0YWxsIHRoZSBkb2NzZXQgaW4KKyMgfi9MaWJyYXJ5L0RldmVsb3Blci9TaGFyZWQvRG9jdW1lbnRhdGlvbi9Eb2NTZXRzIHNvIHRoYXQgWGNvZGUgd2lsbCBmaW5kIGl0IGF0CisjIHN0YXJ0dXAuIFNlZSBodHRwOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS90b29scy9jcmVhdGluZ2RvY3NldHN3aXRoZG94eWdlbi5odG1sCisjIGZvciBtb3JlIGluZm9ybWF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0dFTkVSQVRFX0RPQ1NFVCAgICAgICAgPSBOTworCisjIFRoaXMgdGFnIGRldGVybWluZXMgdGhlIG5hbWUgb2YgdGhlIGRvY3NldCBmZWVkLiBBIGRvY3VtZW50YXRpb24gZmVlZCBwcm92aWRlcworIyBhbiB1bWJyZWxsYSB1bmRlciB3aGljaCBtdWx0aXBsZSBkb2N1bWVudGF0aW9uIHNldHMgZnJvbSBhIHNpbmdsZSBwcm92aWRlcgorIyAoc3VjaCBhcyBhIGNvbXBhbnkgb3IgcHJvZHVjdCBzdWl0ZSkgY2FuIGJlIGdyb3VwZWQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBEb3h5Z2VuIGdlbmVyYXRlZCBkb2NzLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfRE9DU0VUIGlzIHNldCB0byBZRVMuCisKK0RPQ1NFVF9GRUVETkFNRSAgICAgICAgPSAiRG94eWdlbiBnZW5lcmF0ZWQgZG9jcyIKKworIyBUaGlzIHRhZyBzcGVjaWZpZXMgYSBzdHJpbmcgdGhhdCBzaG91bGQgdW5pcXVlbHkgaWRlbnRpZnkgdGhlIGRvY3VtZW50YXRpb24KKyMgc2V0IGJ1bmRsZS4gVGhpcyBzaG91bGQgYmUgYSByZXZlcnNlIGRvbWFpbi1uYW1lIHN0eWxlIHN0cmluZywgZS5nLgorIyBjb20ubXljb21wYW55Lk15RG9jU2V0LiBEb3h5Z2VuIHdpbGwgYXBwZW5kIC5kb2NzZXQgdG8gdGhlIG5hbWUuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBvcmcuZG94eWdlbi5Qcm9qZWN0LgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfRE9DU0VUIGlzIHNldCB0byBZRVMuCisKK0RPQ1NFVF9CVU5ETEVfSUQgICAgICAgPSBvcmcuZG94eWdlbi5Qcm9qZWN0CisKKyMgVGhlIERPQ1NFVF9QVUJMSVNIRVJfSUQgdGFnIHNwZWNpZmllcyBhIHN0cmluZyB0aGF0IHNob3VsZCB1bmlxdWVseSBpZGVudGlmeQorIyB0aGUgZG9jdW1lbnRhdGlvbiBwdWJsaXNoZXIuIFRoaXMgc2hvdWxkIGJlIGEgcmV2ZXJzZSBkb21haW4tbmFtZSBzdHlsZQorIyBzdHJpbmcsIGUuZy4gY29tLm15Y29tcGFueS5NeURvY1NldC5kb2N1bWVudGF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogb3JnLmRveHlnZW4uUHVibGlzaGVyLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfRE9DU0VUIGlzIHNldCB0byBZRVMuCisKK0RPQ1NFVF9QVUJMSVNIRVJfSUQgICAgPSBvcmcuZG94eWdlbi5QdWJsaXNoZXIKKworIyBUaGUgRE9DU0VUX1BVQkxJU0hFUl9OQU1FIHRhZyBpZGVudGlmaWVzIHRoZSBkb2N1bWVudGF0aW9uIHB1Ymxpc2hlci4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFB1Ymxpc2hlci4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0RPQ1NFVCBpcyBzZXQgdG8gWUVTLgorCitET0NTRVRfUFVCTElTSEVSX05BTUUgID0gUHVibGlzaGVyCisKKyMgSWYgdGhlIEdFTkVSQVRFX0hUTUxIRUxQIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiBnZW5lcmF0ZXMgdGhyZWUKKyMgYWRkaXRpb25hbCBIVE1MIGluZGV4IGZpbGVzOiBpbmRleC5oaHAsIGluZGV4LmhoYywgYW5kIGluZGV4Lmhoay4gVGhlCisjIGluZGV4LmhocCBpcyBhIHByb2plY3QgZmlsZSB0aGF0IGNhbiBiZSByZWFkIGJ5IE1pY3Jvc29mdCdzIEhUTUwgSGVscCBXb3Jrc2hvcAorIyAoc2VlOiBodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vZW4tdXMvZG93bmxvYWQvZGV0YWlscy5hc3B4P2lkPTIxMTM4KSBvbgorIyBXaW5kb3dzLgorIworIyBUaGUgSFRNTCBIZWxwIFdvcmtzaG9wIGNvbnRhaW5zIGEgY29tcGlsZXIgdGhhdCBjYW4gY29udmVydCBhbGwgSFRNTCBvdXRwdXQKKyMgZ2VuZXJhdGVkIGJ5IGRveHlnZW4gaW50byBhIHNpbmdsZSBjb21waWxlZCBIVE1MIGZpbGUgKC5jaG0pLiBDb21waWxlZCBIVE1MCisjIGZpbGVzIGFyZSBub3cgdXNlZCBhcyB0aGUgV2luZG93cyA5OCBoZWxwIGZvcm1hdCwgYW5kIHdpbGwgcmVwbGFjZSB0aGUgb2xkCisjIFdpbmRvd3MgaGVscCBmb3JtYXQgKC5obHApIG9uIGFsbCBXaW5kb3dzIHBsYXRmb3JtcyBpbiB0aGUgZnV0dXJlLiBDb21wcmVzc2VkCisjIEhUTUwgZmlsZXMgYWxzbyBjb250YWluIGFuIGluZGV4LCBhIHRhYmxlIG9mIGNvbnRlbnRzLCBhbmQgeW91IGNhbiBzZWFyY2ggZm9yCisjIHdvcmRzIGluIHRoZSBkb2N1bWVudGF0aW9uLiBUaGUgSFRNTCB3b3Jrc2hvcCBhbHNvIGNvbnRhaW5zIGEgdmlld2VyIGZvcgorIyBjb21wcmVzc2VkIEhUTUwgZmlsZXMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworR0VORVJBVEVfSFRNTEhFTFAgICAgICA9IE5PCisKKyMgVGhlIENITV9GSUxFIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBmaWxlIG5hbWUgb2YgdGhlIHJlc3VsdGluZyAuY2htCisjIGZpbGUuIFlvdSBjYW4gYWRkIGEgcGF0aCBpbiBmcm9udCBvZiB0aGUgZmlsZSBpZiB0aGUgcmVzdWx0IHNob3VsZCBub3QgYmUKKyMgd3JpdHRlbiB0byB0aGUgaHRtbCBvdXRwdXQgZGlyZWN0b3J5LgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTEhFTFAgaXMgc2V0IHRvIFlFUy4KKworQ0hNX0ZJTEUgICAgICAgICAgICAgICA9IAorCisjIFRoZSBISENfTE9DQVRJT04gdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGxvY2F0aW9uIChhYnNvbHV0ZSBwYXRoCisjIGluY2x1ZGluZyBmaWxlIG5hbWUpIG9mIHRoZSBIVE1MIGhlbHAgY29tcGlsZXIgKGhoYy5leGUpLiBJZiBub24tZW1wdHksCisjIGRveHlnZW4gd2lsbCB0cnkgdG8gcnVuIHRoZSBIVE1MIGhlbHAgY29tcGlsZXIgb24gdGhlIGdlbmVyYXRlZCBpbmRleC5oaHAuCisjIFRoZSBmaWxlIGhhcyB0byBiZSBzcGVjaWZpZWQgd2l0aCBmdWxsIHBhdGguCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MSEVMUCBpcyBzZXQgdG8gWUVTLgorCitISENfTE9DQVRJT04gICAgICAgICAgID0gCisKKyMgVGhlIEdFTkVSQVRFX0NISSBmbGFnIGNvbnRyb2xzIGlmIGEgc2VwYXJhdGUgLmNoaSBpbmRleCBmaWxlIGlzIGdlbmVyYXRlZAorIyAoWUVTKSBvciB0aGF0IGl0IHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgbWFzdGVyIC5jaG0gZmlsZSAoTk8pLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MSEVMUCBpcyBzZXQgdG8gWUVTLgorCitHRU5FUkFURV9DSEkgICAgICAgICAgID0gTk8KKworIyBUaGUgQ0hNX0lOREVYX0VOQ09ESU5HIGlzIHVzZWQgdG8gZW5jb2RlIEh0bWxIZWxwIGluZGV4IChoaGspLCBjb250ZW50IChoaGMpCisjIGFuZCBwcm9qZWN0IGZpbGUgY29udGVudC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUxIRUxQIGlzIHNldCB0byBZRVMuCisKK0NITV9JTkRFWF9FTkNPRElORyAgICAgPSAKKworIyBUaGUgQklOQVJZX1RPQyBmbGFnIGNvbnRyb2xzIHdoZXRoZXIgYSBiaW5hcnkgdGFibGUgb2YgY29udGVudHMgaXMgZ2VuZXJhdGVkCisjIChZRVMpIG9yIGEgbm9ybWFsIHRhYmxlIG9mIGNvbnRlbnRzIChOTykgaW4gdGhlIC5jaG0gZmlsZS4gRnVydGhlcm1vcmUgaXQKKyMgZW5hYmxlcyB0aGUgUHJldmlvdXMgYW5kIE5leHQgYnV0dG9ucy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTEhFTFAgaXMgc2V0IHRvIFlFUy4KKworQklOQVJZX1RPQyAgICAgICAgICAgICA9IE5PCisKKyMgVGhlIFRPQ19FWFBBTkQgZmxhZyBjYW4gYmUgc2V0IHRvIFlFUyB0byBhZGQgZXh0cmEgaXRlbXMgZm9yIGdyb3VwIG1lbWJlcnMgdG8KKyMgdGhlIHRhYmxlIG9mIGNvbnRlbnRzIG9mIHRoZSBIVE1MIGhlbHAgZG9jdW1lbnRhdGlvbiBhbmQgdG8gdGhlIHRyZWUgdmlldy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTEhFTFAgaXMgc2V0IHRvIFlFUy4KKworVE9DX0VYUEFORCAgICAgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIEdFTkVSQVRFX1FIUCB0YWcgaXMgc2V0IHRvIFlFUyBhbmQgYm90aCBRSFBfTkFNRVNQQUNFIGFuZAorIyBRSFBfVklSVFVBTF9GT0xERVIgYXJlIHNldCwgYW4gYWRkaXRpb25hbCBpbmRleCBmaWxlIHdpbGwgYmUgZ2VuZXJhdGVkIHRoYXQKKyMgY2FuIGJlIHVzZWQgYXMgaW5wdXQgZm9yIFF0J3MgcWhlbHBnZW5lcmF0b3IgdG8gZ2VuZXJhdGUgYSBRdCBDb21wcmVzc2VkIEhlbHAKKyMgKC5xY2gpIG9mIHRoZSBnZW5lcmF0ZWQgSFRNTCBkb2N1bWVudGF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0dFTkVSQVRFX1FIUCAgICAgICAgICAgPSBOTworCisjIElmIHRoZSBRSEdfTE9DQVRJT04gdGFnIGlzIHNwZWNpZmllZCwgdGhlIFFDSF9GSUxFIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5CisjIHRoZSBmaWxlIG5hbWUgb2YgdGhlIHJlc3VsdGluZyAucWNoIGZpbGUuIFRoZSBwYXRoIHNwZWNpZmllZCBpcyByZWxhdGl2ZSB0bworIyB0aGUgSFRNTCBvdXRwdXQgZm9sZGVyLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUUhQIGlzIHNldCB0byBZRVMuCisKK1FDSF9GSUxFICAgICAgICAgICAgICAgPSAKKworIyBUaGUgUUhQX05BTUVTUEFDRSB0YWcgc3BlY2lmaWVzIHRoZSBuYW1lc3BhY2UgdG8gdXNlIHdoZW4gZ2VuZXJhdGluZyBRdCBIZWxwCisjIFByb2plY3Qgb3V0cHV0LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBwbGVhc2Ugc2VlIFF0IEhlbHAgUHJvamVjdCAvIE5hbWVzcGFjZQorIyAoc2VlOiBodHRwOi8vcXQtcHJvamVjdC5vcmcvZG9jL3F0LTQuOC9xdGhlbHBwcm9qZWN0Lmh0bWwjbmFtZXNwYWNlKS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IG9yZy5kb3h5Z2VuLlByb2plY3QuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9RSFAgaXMgc2V0IHRvIFlFUy4KKworUUhQX05BTUVTUEFDRSAgICAgICAgICA9IG9yZy5kb3h5Z2VuLlByb2plY3QKKworIyBUaGUgUUhQX1ZJUlRVQUxfRk9MREVSIHRhZyBzcGVjaWZpZXMgdGhlIG5hbWVzcGFjZSB0byB1c2Ugd2hlbiBnZW5lcmF0aW5nIFF0CisjIEhlbHAgUHJvamVjdCBvdXRwdXQuIEZvciBtb3JlIGluZm9ybWF0aW9uIHBsZWFzZSBzZWUgUXQgSGVscCBQcm9qZWN0IC8gVmlydHVhbAorIyBGb2xkZXJzIChzZWU6IGh0dHA6Ly9xdC1wcm9qZWN0Lm9yZy9kb2MvcXQtNC44L3F0aGVscHByb2plY3QuaHRtbCN2aXJ0dWFsLQorIyBmb2xkZXJzKS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IGRvYy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1FIUCBpcyBzZXQgdG8gWUVTLgorCitRSFBfVklSVFVBTF9GT0xERVIgICAgID0gZG9jCisKKyMgSWYgdGhlIFFIUF9DVVNUX0ZJTFRFUl9OQU1FIHRhZyBpcyBzZXQsIGl0IHNwZWNpZmllcyB0aGUgbmFtZSBvZiBhIGN1c3RvbQorIyBmaWx0ZXIgdG8gYWRkLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBwbGVhc2Ugc2VlIFF0IEhlbHAgUHJvamVjdCAvIEN1c3RvbQorIyBGaWx0ZXJzIChzZWU6IGh0dHA6Ly9xdC1wcm9qZWN0Lm9yZy9kb2MvcXQtNC44L3F0aGVscHByb2plY3QuaHRtbCNjdXN0b20tCisjIGZpbHRlcnMpLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUUhQIGlzIHNldCB0byBZRVMuCisKK1FIUF9DVVNUX0ZJTFRFUl9OQU1FICAgPSAKKworIyBUaGUgUUhQX0NVU1RfRklMVEVSX0FUVFJTIHRhZyBzcGVjaWZpZXMgdGhlIGxpc3Qgb2YgdGhlIGF0dHJpYnV0ZXMgb2YgdGhlCisjIGN1c3RvbSBmaWx0ZXIgdG8gYWRkLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBwbGVhc2Ugc2VlIFF0IEhlbHAgUHJvamVjdCAvIEN1c3RvbQorIyBGaWx0ZXJzIChzZWU6IGh0dHA6Ly9xdC1wcm9qZWN0Lm9yZy9kb2MvcXQtNC44L3F0aGVscHByb2plY3QuaHRtbCNjdXN0b20tCisjIGZpbHRlcnMpLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUUhQIGlzIHNldCB0byBZRVMuCisKK1FIUF9DVVNUX0ZJTFRFUl9BVFRSUyAgPSAKKworIyBUaGUgUUhQX1NFQ1RfRklMVEVSX0FUVFJTIHRhZyBzcGVjaWZpZXMgdGhlIGxpc3Qgb2YgdGhlIGF0dHJpYnV0ZXMgdGhpcworIyBwcm9qZWN0J3MgZmlsdGVyIHNlY3Rpb24gbWF0Y2hlcy4gUXQgSGVscCBQcm9qZWN0IC8gRmlsdGVyIEF0dHJpYnV0ZXMgKHNlZToKKyMgaHR0cDovL3F0LXByb2plY3Qub3JnL2RvYy9xdC00LjgvcXRoZWxwcHJvamVjdC5odG1sI2ZpbHRlci1hdHRyaWJ1dGVzKS4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1FIUCBpcyBzZXQgdG8gWUVTLgorCitRSFBfU0VDVF9GSUxURVJfQVRUUlMgID0gCisKKyMgVGhlIFFIR19MT0NBVElPTiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgbG9jYXRpb24gb2YgUXQncworIyBxaGVscGdlbmVyYXRvci4gSWYgbm9uLWVtcHR5IGRveHlnZW4gd2lsbCB0cnkgdG8gcnVuIHFoZWxwZ2VuZXJhdG9yIG9uIHRoZQorIyBnZW5lcmF0ZWQgLnFocCBmaWxlLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUUhQIGlzIHNldCB0byBZRVMuCisKK1FIR19MT0NBVElPTiAgICAgICAgICAgPSAKKworIyBJZiB0aGUgR0VORVJBVEVfRUNMSVBTRUhFTFAgdGFnIGlzIHNldCB0byBZRVMsIGFkZGl0aW9uYWwgaW5kZXggZmlsZXMgd2lsbCBiZQorIyBnZW5lcmF0ZWQsIHRvZ2V0aGVyIHdpdGggdGhlIEhUTUwgZmlsZXMsIHRoZXkgZm9ybSBhbiBFY2xpcHNlIGhlbHAgcGx1Z2luLiBUbworIyBpbnN0YWxsIHRoaXMgcGx1Z2luIGFuZCBtYWtlIGl0IGF2YWlsYWJsZSB1bmRlciB0aGUgaGVscCBjb250ZW50cyBtZW51IGluCisjIEVjbGlwc2UsIHRoZSBjb250ZW50cyBvZiB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIEhUTUwgYW5kIFhNTCBmaWxlcyBuZWVkcworIyB0byBiZSBjb3BpZWQgaW50byB0aGUgcGx1Z2lucyBkaXJlY3Rvcnkgb2YgZWNsaXBzZS4gVGhlIG5hbWUgb2YgdGhlIGRpcmVjdG9yeQorIyB3aXRoaW4gdGhlIHBsdWdpbnMgZGlyZWN0b3J5IHNob3VsZCBiZSB0aGUgc2FtZSBhcyB0aGUgRUNMSVBTRV9ET0NfSUQgdmFsdWUuCisjIEFmdGVyIGNvcHlpbmcgRWNsaXBzZSBuZWVkcyB0byBiZSByZXN0YXJ0ZWQgYmVmb3JlIHRoZSBoZWxwIGFwcGVhcnMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworR0VORVJBVEVfRUNMSVBTRUhFTFAgICA9IE5PCisKKyMgQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIEVjbGlwc2UgaGVscCBwbHVnaW4uIFdoZW4gaW5zdGFsbGluZyB0aGUgcGx1Z2luCisjIHRoZSBkaXJlY3RvcnkgbmFtZSBjb250YWluaW5nIHRoZSBIVE1MIGFuZCBYTUwgZmlsZXMgc2hvdWxkIGFsc28gaGF2ZSB0aGlzCisjIG5hbWUuIEVhY2ggZG9jdW1lbnRhdGlvbiBzZXQgc2hvdWxkIGhhdmUgaXRzIG93biBpZGVudGlmaWVyLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogb3JnLmRveHlnZW4uUHJvamVjdC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0VDTElQU0VIRUxQIGlzIHNldCB0byBZRVMuCisKK0VDTElQU0VfRE9DX0lEICAgICAgICAgPSBvcmcuZG94eWdlbi5Qcm9qZWN0CisKKyMgSWYgeW91IHdhbnQgZnVsbCBjb250cm9sIG92ZXIgdGhlIGxheW91dCBvZiB0aGUgZ2VuZXJhdGVkIEhUTUwgcGFnZXMgaXQgbWlnaHQKKyMgYmUgbmVjZXNzYXJ5IHRvIGRpc2FibGUgdGhlIGluZGV4IGFuZCByZXBsYWNlIGl0IHdpdGggeW91ciBvd24uIFRoZQorIyBESVNBQkxFX0lOREVYIHRhZyBjYW4gYmUgdXNlZCB0byB0dXJuIG9uL29mZiB0aGUgY29uZGVuc2VkIGluZGV4ICh0YWJzKSBhdCB0b3AKKyMgb2YgZWFjaCBIVE1MIHBhZ2UuIEEgdmFsdWUgb2YgTk8gZW5hYmxlcyB0aGUgaW5kZXggYW5kIHRoZSB2YWx1ZSBZRVMgZGlzYWJsZXMKKyMgaXQuIFNpbmNlIHRoZSB0YWJzIGluIHRoZSBpbmRleCBjb250YWluIHRoZSBzYW1lIGluZm9ybWF0aW9uIGFzIHRoZSBuYXZpZ2F0aW9uCisjIHRyZWUsIHlvdSBjYW4gc2V0IHRoaXMgb3B0aW9uIHRvIFlFUyBpZiB5b3UgYWxzbyBzZXQgR0VORVJBVEVfVFJFRVZJRVcgdG8gWUVTLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0RJU0FCTEVfSU5ERVggICAgICAgICAgPSBOTworCisjIFRoZSBHRU5FUkFURV9UUkVFVklFVyB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHdoZXRoZXIgYSB0cmVlLWxpa2UgaW5kZXgKKyMgc3RydWN0dXJlIHNob3VsZCBiZSBnZW5lcmF0ZWQgdG8gZGlzcGxheSBoaWVyYXJjaGljYWwgaW5mb3JtYXRpb24uIElmIHRoZSB0YWcKKyMgdmFsdWUgaXMgc2V0IHRvIFlFUywgYSBzaWRlIHBhbmVsIHdpbGwgYmUgZ2VuZXJhdGVkIGNvbnRhaW5pbmcgYSB0cmVlLWxpa2UKKyMgaW5kZXggc3RydWN0dXJlIChqdXN0IGxpa2UgdGhlIG9uZSB0aGF0IGlzIGdlbmVyYXRlZCBmb3IgSFRNTCBIZWxwKS4gRm9yIHRoaXMKKyMgdG8gd29yayBhIGJyb3dzZXIgdGhhdCBzdXBwb3J0cyBKYXZhU2NyaXB0LCBESFRNTCwgQ1NTIGFuZCBmcmFtZXMgaXMgcmVxdWlyZWQKKyMgKGkuZS4gYW55IG1vZGVybiBicm93c2VyKS4gV2luZG93cyB1c2VycyBhcmUgcHJvYmFibHkgYmV0dGVyIG9mZiB1c2luZyB0aGUKKyMgSFRNTCBoZWxwIGZlYXR1cmUuIFZpYSBjdXN0b20gc3R5bGUgc2hlZXRzIChzZWUgSFRNTF9FWFRSQV9TVFlMRVNIRUVUKSBvbmUgY2FuCisjIGZ1cnRoZXIgZmluZS10dW5lIHRoZSBsb29rIG9mIHRoZSBpbmRleC4gQXMgYW4gZXhhbXBsZSwgdGhlIGRlZmF1bHQgc3R5bGUKKyMgc2hlZXQgZ2VuZXJhdGVkIGJ5IGRveHlnZW4gaGFzIGFuIGV4YW1wbGUgdGhhdCBzaG93cyBob3cgdG8gcHV0IGFuIGltYWdlIGF0CisjIHRoZSByb290IG9mIHRoZSB0cmVlIGluc3RlYWQgb2YgdGhlIFBST0pFQ1RfTkFNRS4gU2luY2UgdGhlIHRyZWUgYmFzaWNhbGx5IGhhcworIyB0aGUgc2FtZSBpbmZvcm1hdGlvbiBhcyB0aGUgdGFiIGluZGV4LCB5b3UgY291bGQgY29uc2lkZXIgc2V0dGluZworIyBESVNBQkxFX0lOREVYIHRvIFlFUyB3aGVuIGVuYWJsaW5nIHRoaXMgb3B0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0dFTkVSQVRFX1RSRUVWSUVXICAgICAgPSBZRVMKKworIyBUaGUgRU5VTV9WQUxVRVNfUEVSX0xJTkUgdGFnIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgbnVtYmVyIG9mIGVudW0gdmFsdWVzIHRoYXQKKyMgZG94eWdlbiB3aWxsIGdyb3VwIG9uIG9uZSBsaW5lIGluIHRoZSBnZW5lcmF0ZWQgSFRNTCBkb2N1bWVudGF0aW9uLgorIworIyBOb3RlIHRoYXQgYSB2YWx1ZSBvZiAwIHdpbGwgY29tcGxldGVseSBzdXBwcmVzcyB0aGUgZW51bSB2YWx1ZXMgZnJvbSBhcHBlYXJpbmcKKyMgaW4gdGhlIG92ZXJ2aWV3IHNlY3Rpb24uCisjIE1pbmltdW0gdmFsdWU6IDAsIG1heGltdW0gdmFsdWU6IDIwLCBkZWZhdWx0IHZhbHVlOiA0LgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitFTlVNX1ZBTFVFU19QRVJfTElORSAgID0gNAorCisjIElmIHRoZSB0cmVldmlldyBpcyBlbmFibGVkIChzZWUgR0VORVJBVEVfVFJFRVZJRVcpIHRoZW4gdGhpcyB0YWcgY2FuIGJlIHVzZWQKKyMgdG8gc2V0IHRoZSBpbml0aWFsIHdpZHRoIChpbiBwaXhlbHMpIG9mIHRoZSBmcmFtZSBpbiB3aGljaCB0aGUgdHJlZSBpcyBzaG93bi4KKyMgTWluaW11bSB2YWx1ZTogMCwgbWF4aW11bSB2YWx1ZTogMTUwMCwgZGVmYXVsdCB2YWx1ZTogMjUwLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitUUkVFVklFV19XSURUSCAgICAgICAgID0gMjUwCisKKyMgSWYgdGhlIEVYVF9MSU5LU19JTl9XSU5ET1cgb3B0aW9uIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBvcGVuIGxpbmtzIHRvCisjIGV4dGVybmFsIHN5bWJvbHMgaW1wb3J0ZWQgdmlhIHRhZyBmaWxlcyBpbiBhIHNlcGFyYXRlIHdpbmRvdy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitFWFRfTElOS1NfSU5fV0lORE9XICAgID0gTk8KKworIyBVc2UgdGhpcyB0YWcgdG8gY2hhbmdlIHRoZSBmb250IHNpemUgb2YgTGFUZVggZm9ybXVsYXMgaW5jbHVkZWQgYXMgaW1hZ2VzIGluCisjIHRoZSBIVE1MIGRvY3VtZW50YXRpb24uIFdoZW4geW91IGNoYW5nZSB0aGUgZm9udCBzaXplIGFmdGVyIGEgc3VjY2Vzc2Z1bAorIyBkb3h5Z2VuIHJ1biB5b3UgbmVlZCB0byBtYW51YWxseSByZW1vdmUgYW55IGZvcm1fKi5wbmcgaW1hZ2VzIGZyb20gdGhlIEhUTUwKKyMgb3V0cHV0IGRpcmVjdG9yeSB0byBmb3JjZSB0aGVtIHRvIGJlIHJlZ2VuZXJhdGVkLgorIyBNaW5pbXVtIHZhbHVlOiA4LCBtYXhpbXVtIHZhbHVlOiA1MCwgZGVmYXVsdCB2YWx1ZTogMTAuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0ZPUk1VTEFfRk9OVFNJWkUgICAgICAgPSAxMAorCisjIFVzZSB0aGUgRk9STVVMQV9UUkFOUEFSRU5UIHRhZyB0byBkZXRlcm1pbmUgd2hldGhlciBvciBub3QgdGhlIGltYWdlcworIyBnZW5lcmF0ZWQgZm9yIGZvcm11bGFzIGFyZSB0cmFuc3BhcmVudCBQTkdzLiBUcmFuc3BhcmVudCBQTkdzIGFyZSBub3QKKyMgc3VwcG9ydGVkIHByb3Blcmx5IGZvciBJRSA2LjAsIGJ1dCBhcmUgc3VwcG9ydGVkIG9uIGFsbCBtb2Rlcm4gYnJvd3NlcnMuCisjCisjIE5vdGUgdGhhdCB3aGVuIGNoYW5naW5nIHRoaXMgb3B0aW9uIHlvdSBuZWVkIHRvIGRlbGV0ZSBhbnkgZm9ybV8qLnBuZyBmaWxlcyBpbgorIyB0aGUgSFRNTCBvdXRwdXQgZGlyZWN0b3J5IGJlZm9yZSB0aGUgY2hhbmdlcyBoYXZlIGVmZmVjdC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworRk9STVVMQV9UUkFOU1BBUkVOVCAgICA9IFlFUworCisjIEVuYWJsZSB0aGUgVVNFX01BVEhKQVggb3B0aW9uIHRvIHJlbmRlciBMYVRlWCBmb3JtdWxhcyB1c2luZyBNYXRoSmF4IChzZWUKKyMgaHR0cDovL3d3dy5tYXRoamF4Lm9yZykgd2hpY2ggdXNlcyBjbGllbnQgc2lkZSBKYXZhc2NyaXB0IGZvciB0aGUgcmVuZGVyaW5nCisjIGluc3RlYWQgb2YgdXNpbmcgcHJlLXJlbmRlcmVkIGJpdG1hcHMuIFVzZSB0aGlzIGlmIHlvdSBkbyBub3QgaGF2ZSBMYVRlWAorIyBpbnN0YWxsZWQgb3IgaWYgeW91IHdhbnQgdG8gZm9ybXVsYXMgbG9vayBwcmV0dGllciBpbiB0aGUgSFRNTCBvdXRwdXQuIFdoZW4KKyMgZW5hYmxlZCB5b3UgbWF5IGFsc28gbmVlZCB0byBpbnN0YWxsIE1hdGhKYXggc2VwYXJhdGVseSBhbmQgY29uZmlndXJlIHRoZSBwYXRoCisjIHRvIGl0IHVzaW5nIHRoZSBNQVRISkFYX1JFTFBBVEggb3B0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK1VTRV9NQVRISkFYICAgICAgICAgICAgPSBOTworCisjIFdoZW4gTWF0aEpheCBpcyBlbmFibGVkIHlvdSBjYW4gc2V0IHRoZSBkZWZhdWx0IG91dHB1dCBmb3JtYXQgdG8gYmUgdXNlZCBmb3IKKyMgdGhlIE1hdGhKYXggb3V0cHV0LiBTZWUgdGhlIE1hdGhKYXggc2l0ZSAoc2VlOgorIyBodHRwOi8vZG9jcy5tYXRoamF4Lm9yZy9lbi9sYXRlc3Qvb3V0cHV0Lmh0bWwpIGZvciBtb3JlIGRldGFpbHMuCisjIFBvc3NpYmxlIHZhbHVlcyBhcmU6IEhUTUwtQ1NTICh3aGljaCBpcyBzbG93ZXIsIGJ1dCBoYXMgdGhlIGJlc3QKKyMgY29tcGF0aWJpbGl0eSksIE5hdGl2ZU1NTCAoaS5lLiBNYXRoTUwpIGFuZCBTVkcuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBIVE1MLUNTUy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIFVTRV9NQVRISkFYIGlzIHNldCB0byBZRVMuCisKK01BVEhKQVhfRk9STUFUICAgICAgICAgPSBIVE1MLUNTUworCisjIFdoZW4gTWF0aEpheCBpcyBlbmFibGVkIHlvdSBuZWVkIHRvIHNwZWNpZnkgdGhlIGxvY2F0aW9uIHJlbGF0aXZlIHRvIHRoZSBIVE1MCisjIG91dHB1dCBkaXJlY3RvcnkgdXNpbmcgdGhlIE1BVEhKQVhfUkVMUEFUSCBvcHRpb24uIFRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkKKyMgc2hvdWxkIGNvbnRhaW4gdGhlIE1hdGhKYXguanMgc2NyaXB0LiBGb3IgaW5zdGFuY2UsIGlmIHRoZSBtYXRoamF4IGRpcmVjdG9yeQorIyBpcyBsb2NhdGVkIGF0IHRoZSBzYW1lIGxldmVsIGFzIHRoZSBIVE1MIG91dHB1dCBkaXJlY3RvcnksIHRoZW4KKyMgTUFUSEpBWF9SRUxQQVRIIHNob3VsZCBiZSAuLi9tYXRoamF4LiBUaGUgZGVmYXVsdCB2YWx1ZSBwb2ludHMgdG8gdGhlIE1hdGhKYXgKKyMgQ29udGVudCBEZWxpdmVyeSBOZXR3b3JrIHNvIHlvdSBjYW4gcXVpY2tseSBzZWUgdGhlIHJlc3VsdCB3aXRob3V0IGluc3RhbGxpbmcKKyMgTWF0aEpheC4gSG93ZXZlciwgaXQgaXMgc3Ryb25nbHkgcmVjb21tZW5kZWQgdG8gaW5zdGFsbCBhIGxvY2FsIGNvcHkgb2YKKyMgTWF0aEpheCBmcm9tIGh0dHA6Ly93d3cubWF0aGpheC5vcmcgYmVmb3JlIGRlcGxveW1lbnQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBodHRwOi8vY2RuLm1hdGhqYXgub3JnL21hdGhqYXgvbGF0ZXN0LgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgVVNFX01BVEhKQVggaXMgc2V0IHRvIFlFUy4KKworTUFUSEpBWF9SRUxQQVRIICAgICAgICA9IGh0dHA6Ly9jZG4ubWF0aGpheC5vcmcvbWF0aGpheC9sYXRlc3QKKworIyBUaGUgTUFUSEpBWF9FWFRFTlNJT05TIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIE1hdGhKYXgKKyMgZXh0ZW5zaW9uIG5hbWVzIHRoYXQgc2hvdWxkIGJlIGVuYWJsZWQgZHVyaW5nIE1hdGhKYXggcmVuZGVyaW5nLiBGb3IgZXhhbXBsZQorIyBNQVRISkFYX0VYVEVOU0lPTlMgPSBUZVgvQU1TbWF0aCBUZVgvQU1Tc3ltYm9scworIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgVVNFX01BVEhKQVggaXMgc2V0IHRvIFlFUy4KKworTUFUSEpBWF9FWFRFTlNJT05TICAgICA9IAorCisjIFRoZSBNQVRISkFYX0NPREVGSUxFIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgZmlsZSB3aXRoIGphdmFzY3JpcHQgcGllY2VzCisjIG9mIGNvZGUgdGhhdCB3aWxsIGJlIHVzZWQgb24gc3RhcnR1cCBvZiB0aGUgTWF0aEpheCBjb2RlLiBTZWUgdGhlIE1hdGhKYXggc2l0ZQorIyAoc2VlOiBodHRwOi8vZG9jcy5tYXRoamF4Lm9yZy9lbi9sYXRlc3Qvb3V0cHV0Lmh0bWwpIGZvciBtb3JlIGRldGFpbHMuIEZvciBhbgorIyBleGFtcGxlIHNlZSB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIFVTRV9NQVRISkFYIGlzIHNldCB0byBZRVMuCisKK01BVEhKQVhfQ09ERUZJTEUgICAgICAgPSAKKworIyBXaGVuIHRoZSBTRUFSQ0hFTkdJTkUgdGFnIGlzIGVuYWJsZWQgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgc2VhcmNoIGJveCBmb3IKKyMgdGhlIEhUTUwgb3V0cHV0LiBUaGUgdW5kZXJseWluZyBzZWFyY2ggZW5naW5lIHVzZXMgamF2YXNjcmlwdCBhbmQgREhUTUwgYW5kCisjIHNob3VsZCB3b3JrIG9uIGFueSBtb2Rlcm4gYnJvd3Nlci4gTm90ZSB0aGF0IHdoZW4gdXNpbmcgSFRNTCBoZWxwCisjIChHRU5FUkFURV9IVE1MSEVMUCksIFF0IGhlbHAgKEdFTkVSQVRFX1FIUCksIG9yIGRvY3NldHMgKEdFTkVSQVRFX0RPQ1NFVCkKKyMgdGhlcmUgaXMgYWxyZWFkeSBhIHNlYXJjaCBmdW5jdGlvbiBzbyB0aGlzIG9uZSBzaG91bGQgdHlwaWNhbGx5IGJlIGRpc2FibGVkLgorIyBGb3IgbGFyZ2UgcHJvamVjdHMgdGhlIGphdmFzY3JpcHQgYmFzZWQgc2VhcmNoIGVuZ2luZSBjYW4gYmUgc2xvdywgdGhlbgorIyBlbmFibGluZyBTRVJWRVJfQkFTRURfU0VBUkNIIG1heSBwcm92aWRlIGEgYmV0dGVyIHNvbHV0aW9uLiBJdCBpcyBwb3NzaWJsZSB0bworIyBzZWFyY2ggdXNpbmcgdGhlIGtleWJvYXJkOyB0byBqdW1wIHRvIHRoZSBzZWFyY2ggYm94IHVzZSA8YWNjZXNzIGtleT4gKyBTCisjICh3aGF0IHRoZSA8YWNjZXNzIGtleT4gaXMgZGVwZW5kcyBvbiB0aGUgT1MgYW5kIGJyb3dzZXIsIGJ1dCBpdCBpcyB0eXBpY2FsbHkKKyMgPENUUkw+LCA8QUxUPi88b3B0aW9uPiwgb3IgYm90aCkuIEluc2lkZSB0aGUgc2VhcmNoIGJveCB1c2UgdGhlIDxjdXJzb3IgZG93bgorIyBrZXk+IHRvIGp1bXAgaW50byB0aGUgc2VhcmNoIHJlc3VsdHMgd2luZG93LCB0aGUgcmVzdWx0cyBjYW4gYmUgbmF2aWdhdGVkCisjIHVzaW5nIHRoZSA8Y3Vyc29yIGtleXM+LiBQcmVzcyA8RW50ZXI+IHRvIHNlbGVjdCBhbiBpdGVtIG9yIDxlc2NhcGU+IHRvIGNhbmNlbAorIyB0aGUgc2VhcmNoLiBUaGUgZmlsdGVyIG9wdGlvbnMgY2FuIGJlIHNlbGVjdGVkIHdoZW4gdGhlIGN1cnNvciBpcyBpbnNpZGUgdGhlCisjIHNlYXJjaCBib3ggYnkgcHJlc3NpbmcgPFNoaWZ0Pis8Y3Vyc29yIGRvd24+LiBBbHNvIGhlcmUgdXNlIHRoZSA8Y3Vyc29yIGtleXM+CisjIHRvIHNlbGVjdCBhIGZpbHRlciBhbmQgPEVudGVyPiBvciA8ZXNjYXBlPiB0byBhY3RpdmF0ZSBvciBjYW5jZWwgdGhlIGZpbHRlcgorIyBvcHRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK1NFQVJDSEVOR0lORSAgICAgICAgICAgPSBZRVMKKworIyBXaGVuIHRoZSBTRVJWRVJfQkFTRURfU0VBUkNIIHRhZyBpcyBlbmFibGVkIHRoZSBzZWFyY2ggZW5naW5lIHdpbGwgYmUKKyMgaW1wbGVtZW50ZWQgdXNpbmcgYSB3ZWIgc2VydmVyIGluc3RlYWQgb2YgYSB3ZWIgY2xpZW50IHVzaW5nIEphdmFzY3JpcHQuIFRoZXJlCisjIGFyZSB0d28gZmxhdm9ycyBvZiB3ZWIgc2VydmVyIGJhc2VkIHNlYXJjaGluZyBkZXBlbmRpbmcgb24gdGhlIEVYVEVSTkFMX1NFQVJDSAorIyBzZXR0aW5nLiBXaGVuIGRpc2FibGVkLCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBQSFAgc2NyaXB0IGZvciBzZWFyY2hpbmcgYW5kCisjIGFuIGluZGV4IGZpbGUgdXNlZCBieSB0aGUgc2NyaXB0LiBXaGVuIEVYVEVSTkFMX1NFQVJDSCBpcyBlbmFibGVkIHRoZSBpbmRleGluZworIyBhbmQgc2VhcmNoaW5nIG5lZWRzIHRvIGJlIHByb3ZpZGVkIGJ5IGV4dGVybmFsIHRvb2xzLiBTZWUgdGhlIHNlY3Rpb24KKyMgIkV4dGVybmFsIEluZGV4aW5nIGFuZCBTZWFyY2hpbmciIGZvciBkZXRhaWxzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBTRUFSQ0hFTkdJTkUgaXMgc2V0IHRvIFlFUy4KKworU0VSVkVSX0JBU0VEX1NFQVJDSCAgICA9IE5PCisKKyMgV2hlbiBFWFRFUk5BTF9TRUFSQ0ggdGFnIGlzIGVuYWJsZWQgZG94eWdlbiB3aWxsIG5vIGxvbmdlciBnZW5lcmF0ZSB0aGUgUEhQCisjIHNjcmlwdCBmb3Igc2VhcmNoaW5nLiBJbnN0ZWFkIHRoZSBzZWFyY2ggcmVzdWx0cyBhcmUgd3JpdHRlbiB0byBhbiBYTUwgZmlsZQorIyB3aGljaCBuZWVkcyB0byBiZSBwcm9jZXNzZWQgYnkgYW4gZXh0ZXJuYWwgaW5kZXhlci4gRG94eWdlbiB3aWxsIGludm9rZSBhbgorIyBleHRlcm5hbCBzZWFyY2ggZW5naW5lIHBvaW50ZWQgdG8gYnkgdGhlIFNFQVJDSEVOR0lORV9VUkwgb3B0aW9uIHRvIG9idGFpbiB0aGUKKyMgc2VhcmNoIHJlc3VsdHMuCisjCisjIERveHlnZW4gc2hpcHMgd2l0aCBhbiBleGFtcGxlIGluZGV4ZXIgKGRveHlpbmRleGVyKSBhbmQgc2VhcmNoIGVuZ2luZQorIyAoZG94eXNlYXJjaC5jZ2kpIHdoaWNoIGFyZSBiYXNlZCBvbiB0aGUgb3BlbiBzb3VyY2Ugc2VhcmNoIGVuZ2luZSBsaWJyYXJ5CisjIFhhcGlhbiAoc2VlOiBodHRwOi8veGFwaWFuLm9yZy8pLgorIworIyBTZWUgdGhlIHNlY3Rpb24gIkV4dGVybmFsIEluZGV4aW5nIGFuZCBTZWFyY2hpbmciIGZvciBkZXRhaWxzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBTRUFSQ0hFTkdJTkUgaXMgc2V0IHRvIFlFUy4KKworRVhURVJOQUxfU0VBUkNIICAgICAgICA9IE5PCisKKyMgVGhlIFNFQVJDSEVOR0lORV9VUkwgc2hvdWxkIHBvaW50IHRvIGEgc2VhcmNoIGVuZ2luZSBob3N0ZWQgYnkgYSB3ZWIgc2VydmVyCisjIHdoaWNoIHdpbGwgcmV0dXJuIHRoZSBzZWFyY2ggcmVzdWx0cyB3aGVuIEVYVEVSTkFMX1NFQVJDSCBpcyBlbmFibGVkLgorIworIyBEb3h5Z2VuIHNoaXBzIHdpdGggYW4gZXhhbXBsZSBpbmRleGVyIChkb3h5aW5kZXhlcikgYW5kIHNlYXJjaCBlbmdpbmUKKyMgKGRveHlzZWFyY2guY2dpKSB3aGljaCBhcmUgYmFzZWQgb24gdGhlIG9wZW4gc291cmNlIHNlYXJjaCBlbmdpbmUgbGlicmFyeQorIyBYYXBpYW4gKHNlZTogaHR0cDovL3hhcGlhbi5vcmcvKS4gU2VlIHRoZSBzZWN0aW9uICJFeHRlcm5hbCBJbmRleGluZyBhbmQKKyMgU2VhcmNoaW5nIiBmb3IgZGV0YWlscy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIFNFQVJDSEVOR0lORSBpcyBzZXQgdG8gWUVTLgorCitTRUFSQ0hFTkdJTkVfVVJMICAgICAgID0gCisKKyMgV2hlbiBTRVJWRVJfQkFTRURfU0VBUkNIIGFuZCBFWFRFUk5BTF9TRUFSQ0ggYXJlIGJvdGggZW5hYmxlZCB0aGUgdW5pbmRleGVkCisjIHNlYXJjaCBkYXRhIGlzIHdyaXR0ZW4gdG8gYSBmaWxlIGZvciBpbmRleGluZyBieSBhbiBleHRlcm5hbCB0b29sLiBXaXRoIHRoZQorIyBTRUFSQ0hEQVRBX0ZJTEUgdGFnIHRoZSBuYW1lIG9mIHRoaXMgZmlsZSBjYW4gYmUgc3BlY2lmaWVkLgorIyBUaGUgZGVmYXVsdCBmaWxlIGlzOiBzZWFyY2hkYXRhLnhtbC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIFNFQVJDSEVOR0lORSBpcyBzZXQgdG8gWUVTLgorCitTRUFSQ0hEQVRBX0ZJTEUgICAgICAgID0gc2VhcmNoZGF0YS54bWwKKworIyBXaGVuIFNFUlZFUl9CQVNFRF9TRUFSQ0ggYW5kIEVYVEVSTkFMX1NFQVJDSCBhcmUgYm90aCBlbmFibGVkIHRoZQorIyBFWFRFUk5BTF9TRUFSQ0hfSUQgdGFnIGNhbiBiZSB1c2VkIGFzIGFuIGlkZW50aWZpZXIgZm9yIHRoZSBwcm9qZWN0LiBUaGlzIGlzCisjIHVzZWZ1bCBpbiBjb21iaW5hdGlvbiB3aXRoIEVYVFJBX1NFQVJDSF9NQVBQSU5HUyB0byBzZWFyY2ggdGhyb3VnaCBtdWx0aXBsZQorIyBwcm9qZWN0cyBhbmQgcmVkaXJlY3QgdGhlIHJlc3VsdHMgYmFjayB0byB0aGUgcmlnaHQgcHJvamVjdC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIFNFQVJDSEVOR0lORSBpcyBzZXQgdG8gWUVTLgorCitFWFRFUk5BTF9TRUFSQ0hfSUQgICAgID0gCisKKyMgVGhlIEVYVFJBX1NFQVJDSF9NQVBQSU5HUyB0YWcgY2FuIGJlIHVzZWQgdG8gZW5hYmxlIHNlYXJjaGluZyB0aHJvdWdoIGRveHlnZW4KKyMgcHJvamVjdHMgb3RoZXIgdGhhbiB0aGUgb25lIGRlZmluZWQgYnkgdGhpcyBjb25maWd1cmF0aW9uIGZpbGUsIGJ1dCB0aGF0IGFyZQorIyBhbGwgYWRkZWQgdG8gdGhlIHNhbWUgZXh0ZXJuYWwgc2VhcmNoIGluZGV4LiBFYWNoIHByb2plY3QgbmVlZHMgdG8gaGF2ZSBhCisjIHVuaXF1ZSBpZCBzZXQgdmlhIEVYVEVSTkFMX1NFQVJDSF9JRC4gVGhlIHNlYXJjaCBtYXBwaW5nIHRoZW4gbWFwcyB0aGUgaWQgb2YKKyMgdG8gYSByZWxhdGl2ZSBsb2NhdGlvbiB3aGVyZSB0aGUgZG9jdW1lbnRhdGlvbiBjYW4gYmUgZm91bmQuIFRoZSBmb3JtYXQgaXM6CisjIEVYVFJBX1NFQVJDSF9NQVBQSU5HUyA9IHRhZ25hbWUxPWxvYzEgdGFnbmFtZTI9bG9jMiAuLi4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIFNFQVJDSEVOR0lORSBpcyBzZXQgdG8gWUVTLgorCitFWFRSQV9TRUFSQ0hfTUFQUElOR1MgID0gCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIExhVGVYIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBHRU5FUkFURV9MQVRFWCB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGdlbmVyYXRlIExhVGVYIG91dHB1dC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworR0VORVJBVEVfTEFURVggICAgICAgICA9IE5PCisKKyMgVGhlIExBVEVYX09VVFBVVCB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHdoZXJlIHRoZSBMYVRlWCBkb2NzIHdpbGwgYmUgcHV0LiBJZiBhCisjIHJlbGF0aXZlIHBhdGggaXMgZW50ZXJlZCB0aGUgdmFsdWUgb2YgT1VUUFVUX0RJUkVDVE9SWSB3aWxsIGJlIHB1dCBpbiBmcm9udCBvZgorIyBpdC4KKyMgVGhlIGRlZmF1bHQgZGlyZWN0b3J5IGlzOiBsYXRleC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0xBVEVYIGlzIHNldCB0byBZRVMuCisKK0xBVEVYX09VVFBVVCAgICAgICAgICAgPSBsYXRleAorCisjIFRoZSBMQVRFWF9DTURfTkFNRSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgTGFUZVggY29tbWFuZCBuYW1lIHRvIGJlCisjIGludm9rZWQuCisjCisjIE5vdGUgdGhhdCB3aGVuIGVuYWJsaW5nIFVTRV9QREZMQVRFWCB0aGlzIG9wdGlvbiBpcyBvbmx5IHVzZWQgZm9yIGdlbmVyYXRpbmcKKyMgYml0bWFwcyBmb3IgZm9ybXVsYXMgaW4gdGhlIEhUTUwgb3V0cHV0LCBidXQgbm90IGluIHRoZSBNYWtlZmlsZSB0aGF0IGlzCisjIHdyaXR0ZW4gdG8gdGhlIG91dHB1dCBkaXJlY3RvcnkuCisjIFRoZSBkZWZhdWx0IGZpbGUgaXM6IGxhdGV4LgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KKworTEFURVhfQ01EX05BTUUgICAgICAgICA9IGxhdGV4CisKKyMgVGhlIE1BS0VJTkRFWF9DTURfTkFNRSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgY29tbWFuZCBuYW1lIHRvIGdlbmVyYXRlCisjIGluZGV4IGZvciBMYVRlWC4KKyMgVGhlIGRlZmF1bHQgZmlsZSBpczogbWFrZWluZGV4LgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KKworTUFLRUlOREVYX0NNRF9OQU1FICAgICA9IG1ha2VpbmRleAorCisjIElmIHRoZSBDT01QQUNUX0xBVEVYIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIGdlbmVyYXRlcyBtb3JlIGNvbXBhY3QgTGFUZVgKKyMgZG9jdW1lbnRzLiBUaGlzIG1heSBiZSB1c2VmdWwgZm9yIHNtYWxsIHByb2plY3RzIGFuZCBtYXkgaGVscCB0byBzYXZlIHNvbWUKKyMgdHJlZXMgaW4gZ2VuZXJhbC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KKworQ09NUEFDVF9MQVRFWCAgICAgICAgICA9IE5PCisKKyMgVGhlIFBBUEVSX1RZUEUgdGFnIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgcGFwZXIgdHlwZSB0aGF0IGlzIHVzZWQgYnkgdGhlCisjIHByaW50ZXIuCisjIFBvc3NpYmxlIHZhbHVlcyBhcmU6IGE0ICgyMTAgeCAyOTcgbW0pLCBsZXR0ZXIgKDguNSB4IDExIGluY2hlcyksIGxlZ2FsICg4LjUgeAorIyAxNCBpbmNoZXMpIGFuZCBleGVjdXRpdmUgKDcuMjUgeCAxMC41IGluY2hlcykuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBhNC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0xBVEVYIGlzIHNldCB0byBZRVMuCisKK1BBUEVSX1RZUEUgICAgICAgICAgICAgPSBhNAorCisjIFRoZSBFWFRSQV9QQUNLQUdFUyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBMYVRlWCBwYWNrYWdlIG5hbWVzCisjIHRoYXQgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSBMYVRlWCBvdXRwdXQuIFRoZSBwYWNrYWdlIGNhbiBiZSBzcGVjaWZpZWQganVzdAorIyBieSBpdHMgbmFtZSBvciB3aXRoIHRoZSBjb3JyZWN0IHN5bnRheCBhcyB0byBiZSB1c2VkIHdpdGggdGhlIExhVGVYCisjIFx1c2VwYWNrYWdlIGNvbW1hbmQuIFRvIGdldCB0aGUgdGltZXMgZm9udCBmb3IgaW5zdGFuY2UgeW91IGNhbiBzcGVjaWZ5IDoKKyMgRVhUUkFfUEFDS0FHRVM9dGltZXMgb3IgRVhUUkFfUEFDS0FHRVM9e3RpbWVzfQorIyBUbyB1c2UgdGhlIG9wdGlvbiBpbnRsaW1pdHMgd2l0aCB0aGUgYW1zbWF0aCBwYWNrYWdlIHlvdSBjYW4gc3BlY2lmeToKKyMgRVhUUkFfUEFDS0FHRVM9W2ludGxpbWl0c117YW1zbWF0aH0KKyMgSWYgbGVmdCBibGFuayBubyBleHRyYSBwYWNrYWdlcyB3aWxsIGJlIGluY2x1ZGVkLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KKworRVhUUkFfUEFDS0FHRVMgICAgICAgICA9IAorCisjIFRoZSBMQVRFWF9IRUFERVIgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBwZXJzb25hbCBMYVRlWCBoZWFkZXIgZm9yIHRoZQorIyBnZW5lcmF0ZWQgTGFUZVggZG9jdW1lbnQuIFRoZSBoZWFkZXIgc2hvdWxkIGNvbnRhaW4gZXZlcnl0aGluZyB1bnRpbCB0aGUgZmlyc3QKKyMgY2hhcHRlci4gSWYgaXQgaXMgbGVmdCBibGFuayBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBzdGFuZGFyZCBoZWFkZXIuIFNlZQorIyBzZWN0aW9uICJEb3h5Z2VuIHVzYWdlIiBmb3IgaW5mb3JtYXRpb24gb24gaG93IHRvIGxldCBkb3h5Z2VuIHdyaXRlIHRoZQorIyBkZWZhdWx0IGhlYWRlciB0byBhIHNlcGFyYXRlIGZpbGUuCisjCisjIE5vdGU6IE9ubHkgdXNlIGEgdXNlci1kZWZpbmVkIGhlYWRlciBpZiB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmchIFRoZQorIyBmb2xsb3dpbmcgY29tbWFuZHMgaGF2ZSBhIHNwZWNpYWwgbWVhbmluZyBpbnNpZGUgdGhlIGhlYWRlcjogJHRpdGxlLAorIyAkZGF0ZXRpbWUsICRkYXRlLCAkZG94eWdlbnZlcnNpb24sICRwcm9qZWN0bmFtZSwgJHByb2plY3RudW1iZXIsCisjICRwcm9qZWN0YnJpZWYsICRwcm9qZWN0bG9nby4gRG94eWdlbiB3aWxsIHJlcGxhY2UgJHRpdGxlIHdpdGggdGhlIGVtcHR5CisjIHN0cmluZywgZm9yIHRoZSByZXBsYWNlbWVudCB2YWx1ZXMgb2YgdGhlIG90aGVyIGNvbW1hbmRzIHRoZSB1c2VyIGlzIHJlZmVycmVkCisjIHRvIEhUTUxfSEVBREVSLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KKworTEFURVhfSEVBREVSICAgICAgICAgICA9IAorCisjIFRoZSBMQVRFWF9GT09URVIgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBwZXJzb25hbCBMYVRlWCBmb290ZXIgZm9yIHRoZQorIyBnZW5lcmF0ZWQgTGFUZVggZG9jdW1lbnQuIFRoZSBmb290ZXIgc2hvdWxkIGNvbnRhaW4gZXZlcnl0aGluZyBhZnRlciB0aGUgbGFzdAorIyBjaGFwdGVyLiBJZiBpdCBpcyBsZWZ0IGJsYW5rIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIHN0YW5kYXJkIGZvb3Rlci4gU2VlCisjIExBVEVYX0hFQURFUiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBob3cgdG8gZ2VuZXJhdGUgYSBkZWZhdWx0IGZvb3RlciBhbmQgd2hhdAorIyBzcGVjaWFsIGNvbW1hbmRzIGNhbiBiZSB1c2VkIGluc2lkZSB0aGUgZm9vdGVyLgorIworIyBOb3RlOiBPbmx5IHVzZSBhIHVzZXItZGVmaW5lZCBmb290ZXIgaWYgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nIQorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KKworTEFURVhfRk9PVEVSICAgICAgICAgICA9IAorCisjIFRoZSBMQVRFWF9FWFRSQV9TVFlMRVNIRUVUIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGFkZGl0aW9uYWwgdXNlci1kZWZpbmVkCisjIExhVGVYIHN0eWxlIHNoZWV0cyB0aGF0IGFyZSBpbmNsdWRlZCBhZnRlciB0aGUgc3RhbmRhcmQgc3R5bGUgc2hlZXRzIGNyZWF0ZWQKKyMgYnkgZG94eWdlbi4gVXNpbmcgdGhpcyBvcHRpb24gb25lIGNhbiBvdmVycnVsZSBjZXJ0YWluIHN0eWxlIGFzcGVjdHMuIERveHlnZW4KKyMgd2lsbCBjb3B5IHRoZSBzdHlsZSBzaGVldCBmaWxlcyB0byB0aGUgb3V0cHV0IGRpcmVjdG9yeS4KKyMgTm90ZTogVGhlIG9yZGVyIG9mIHRoZSBleHRyYSBzdHlsZSBzaGVldCBmaWxlcyBpcyBvZiBpbXBvcnRhbmNlIChlLmcuIHRoZSBsYXN0CisjIHN0eWxlIHNoZWV0IGluIHRoZSBsaXN0IG92ZXJydWxlcyB0aGUgc2V0dGluZyBvZiB0aGUgcHJldmlvdXMgb25lcyBpbiB0aGUKKyMgbGlzdCkuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgorCitMQVRFWF9FWFRSQV9TVFlMRVNIRUVUID0gCisKKyMgVGhlIExBVEVYX0VYVFJBX0ZJTEVTIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGV4dHJhIGltYWdlcyBvcgorIyBvdGhlciBzb3VyY2UgZmlsZXMgd2hpY2ggc2hvdWxkIGJlIGNvcGllZCB0byB0aGUgTEFURVhfT1VUUFVUIG91dHB1dAorIyBkaXJlY3RvcnkuIE5vdGUgdGhhdCB0aGUgZmlsZXMgd2lsbCBiZSBjb3BpZWQgYXMtaXM7IHRoZXJlIGFyZSBubyBjb21tYW5kcyBvcgorIyBtYXJrZXJzIGF2YWlsYWJsZS4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0xBVEVYIGlzIHNldCB0byBZRVMuCisKK0xBVEVYX0VYVFJBX0ZJTEVTICAgICAgPSAKKworIyBJZiB0aGUgUERGX0hZUEVSTElOS1MgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBMYVRlWCB0aGF0IGlzIGdlbmVyYXRlZCBpcworIyBwcmVwYXJlZCBmb3IgY29udmVyc2lvbiB0byBQREYgKHVzaW5nIHBzMnBkZiBvciBwZGZsYXRleCkuIFRoZSBQREYgZmlsZSB3aWxsCisjIGNvbnRhaW4gbGlua3MgKGp1c3QgbGlrZSB0aGUgSFRNTCBvdXRwdXQpIGluc3RlYWQgb2YgcGFnZSByZWZlcmVuY2VzLiBUaGlzCisjIG1ha2VzIHRoZSBvdXRwdXQgc3VpdGFibGUgZm9yIG9ubGluZSBicm93c2luZyB1c2luZyBhIFBERiB2aWV3ZXIuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgorCitQREZfSFlQRVJMSU5LUyAgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIFVTRV9QREZMQVRFWCB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIHVzZSBwZGZsYXRleCB0byBnZW5lcmF0ZQorIyB0aGUgUERGIGZpbGUgZGlyZWN0bHkgZnJvbSB0aGUgTGFUZVggZmlsZXMuIFNldCB0aGlzIG9wdGlvbiB0byBZRVMsIHRvIGdldCBhCisjIGhpZ2hlciBxdWFsaXR5IFBERiBkb2N1bWVudGF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KKworVVNFX1BERkxBVEVYICAgICAgICAgICA9IFlFUworCisjIElmIHRoZSBMQVRFWF9CQVRDSE1PREUgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBhZGQgdGhlIFxiYXRjaG1vZGUKKyMgY29tbWFuZCB0byB0aGUgZ2VuZXJhdGVkIExhVGVYIGZpbGVzLiBUaGlzIHdpbGwgaW5zdHJ1Y3QgTGFUZVggdG8ga2VlcCBydW5uaW5nCisjIGlmIGVycm9ycyBvY2N1ciwgaW5zdGVhZCBvZiBhc2tpbmcgdGhlIHVzZXIgZm9yIGhlbHAuIFRoaXMgb3B0aW9uIGlzIGFsc28gdXNlZAorIyB3aGVuIGdlbmVyYXRpbmcgZm9ybXVsYXMgaW4gSFRNTC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KKworTEFURVhfQkFUQ0hNT0RFICAgICAgICA9IE5PCisKKyMgSWYgdGhlIExBVEVYX0hJREVfSU5ESUNFUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBub3QgaW5jbHVkZSB0aGUKKyMgaW5kZXggY2hhcHRlcnMgKHN1Y2ggYXMgRmlsZSBJbmRleCwgQ29tcG91bmQgSW5kZXgsIGV0Yy4pIGluIHRoZSBvdXRwdXQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0xBVEVYIGlzIHNldCB0byBZRVMuCisKK0xBVEVYX0hJREVfSU5ESUNFUyAgICAgPSBOTworCisjIElmIHRoZSBMQVRFWF9TT1VSQ0VfQ09ERSB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBpbmNsdWRlIHNvdXJjZQorIyBjb2RlIHdpdGggc3ludGF4IGhpZ2hsaWdodGluZyBpbiB0aGUgTGFUZVggb3V0cHV0LgorIworIyBOb3RlIHRoYXQgd2hpY2ggc291cmNlcyBhcmUgc2hvd24gYWxzbyBkZXBlbmRzIG9uIG90aGVyIHNldHRpbmdzIHN1Y2ggYXMKKyMgU09VUkNFX0JST1dTRVIuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0xBVEVYIGlzIHNldCB0byBZRVMuCisKK0xBVEVYX1NPVVJDRV9DT0RFICAgICAgPSBOTworCisjIFRoZSBMQVRFWF9CSUJfU1RZTEUgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIHN0eWxlIHRvIHVzZSBmb3IgdGhlCisjIGJpYmxpb2dyYXBoeSwgZS5nLiBwbGFpbm5hdCwgb3IgaWVlZXRyLiBTZWUKKyMgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9CaWJUZVggYW5kIFxjaXRlIGZvciBtb3JlIGluZm8uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBwbGFpbi4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0xBVEVYIGlzIHNldCB0byBZRVMuCisKK0xBVEVYX0JJQl9TVFlMRSAgICAgICAgPSBwbGFpbgorCisjIElmIHRoZSBMQVRFWF9USU1FU1RBTVAgdGFnIGlzIHNldCB0byBZRVMgdGhlbiB0aGUgZm9vdGVyIG9mIGVhY2ggZ2VuZXJhdGVkCisjIHBhZ2Ugd2lsbCBjb250YWluIHRoZSBkYXRlIGFuZCB0aW1lIHdoZW4gdGhlIHBhZ2Ugd2FzIGdlbmVyYXRlZC4gU2V0dGluZyB0aGlzCisjIHRvIE5PIGNhbiBoZWxwIHdoZW4gY29tcGFyaW5nIHRoZSBvdXRwdXQgb2YgbXVsdGlwbGUgcnVucy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KKworTEFURVhfVElNRVNUQU1QICAgICAgICA9IE5PCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIFJURiBvdXRwdXQKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgR0VORVJBVEVfUlRGIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgUlRGIG91dHB1dC4gVGhlCisjIFJURiBvdXRwdXQgaXMgb3B0aW1pemVkIGZvciBXb3JkIDk3IGFuZCBtYXkgbm90IGxvb2sgdG9vIHByZXR0eSB3aXRoIG90aGVyIFJURgorIyByZWFkZXJzL2VkaXRvcnMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworR0VORVJBVEVfUlRGICAgICAgICAgICA9IE5PCisKKyMgVGhlIFJURl9PVVRQVVQgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB3aGVyZSB0aGUgUlRGIGRvY3Mgd2lsbCBiZSBwdXQuIElmIGEKKyMgcmVsYXRpdmUgcGF0aCBpcyBlbnRlcmVkIHRoZSB2YWx1ZSBvZiBPVVRQVVRfRElSRUNUT1JZIHdpbGwgYmUgcHV0IGluIGZyb250IG9mCisjIGl0LgorIyBUaGUgZGVmYXVsdCBkaXJlY3RvcnkgaXM6IHJ0Zi4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1JURiBpcyBzZXQgdG8gWUVTLgorCitSVEZfT1VUUFVUICAgICAgICAgICAgID0gcnRmCisKKyMgSWYgdGhlIENPTVBBQ1RfUlRGIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIGdlbmVyYXRlcyBtb3JlIGNvbXBhY3QgUlRGCisjIGRvY3VtZW50cy4gVGhpcyBtYXkgYmUgdXNlZnVsIGZvciBzbWFsbCBwcm9qZWN0cyBhbmQgbWF5IGhlbHAgdG8gc2F2ZSBzb21lCisjIHRyZWVzIGluIGdlbmVyYWwuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1JURiBpcyBzZXQgdG8gWUVTLgorCitDT01QQUNUX1JURiAgICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgUlRGX0hZUEVSTElOS1MgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBSVEYgdGhhdCBpcyBnZW5lcmF0ZWQgd2lsbAorIyBjb250YWluIGh5cGVybGluayBmaWVsZHMuIFRoZSBSVEYgZmlsZSB3aWxsIGNvbnRhaW4gbGlua3MgKGp1c3QgbGlrZSB0aGUgSFRNTAorIyBvdXRwdXQpIGluc3RlYWQgb2YgcGFnZSByZWZlcmVuY2VzLiBUaGlzIG1ha2VzIHRoZSBvdXRwdXQgc3VpdGFibGUgZm9yIG9ubGluZQorIyBicm93c2luZyB1c2luZyBXb3JkIG9yIHNvbWUgb3RoZXIgV29yZCBjb21wYXRpYmxlIHJlYWRlcnMgdGhhdCBzdXBwb3J0IHRob3NlCisjIGZpZWxkcy4KKyMKKyMgTm90ZTogV29yZFBhZCAod3JpdGUpIGFuZCBvdGhlcnMgZG8gbm90IHN1cHBvcnQgbGlua3MuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1JURiBpcyBzZXQgdG8gWUVTLgorCitSVEZfSFlQRVJMSU5LUyAgICAgICAgID0gTk8KKworIyBMb2FkIHN0eWxlc2hlZXQgZGVmaW5pdGlvbnMgZnJvbSBmaWxlLiBTeW50YXggaXMgc2ltaWxhciB0byBkb3h5Z2VuJ3MgY29uZmlnCisjIGZpbGUsIGkuZS4gYSBzZXJpZXMgb2YgYXNzaWdubWVudHMuIFlvdSBvbmx5IGhhdmUgdG8gcHJvdmlkZSByZXBsYWNlbWVudHMsCisjIG1pc3NpbmcgZGVmaW5pdGlvbnMgYXJlIHNldCB0byB0aGVpciBkZWZhdWx0IHZhbHVlLgorIworIyBTZWUgYWxzbyBzZWN0aW9uICJEb3h5Z2VuIHVzYWdlIiBmb3IgaW5mb3JtYXRpb24gb24gaG93IHRvIGdlbmVyYXRlIHRoZQorIyBkZWZhdWx0IHN0eWxlIHNoZWV0IHRoYXQgZG94eWdlbiBub3JtYWxseSB1c2VzLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUlRGIGlzIHNldCB0byBZRVMuCisKK1JURl9TVFlMRVNIRUVUX0ZJTEUgICAgPSAKKworIyBTZXQgb3B0aW9uYWwgdmFyaWFibGVzIHVzZWQgaW4gdGhlIGdlbmVyYXRpb24gb2YgYW4gUlRGIGRvY3VtZW50LiBTeW50YXggaXMKKyMgc2ltaWxhciB0byBkb3h5Z2VuJ3MgY29uZmlnIGZpbGUuIEEgdGVtcGxhdGUgZXh0ZW5zaW9ucyBmaWxlIGNhbiBiZSBnZW5lcmF0ZWQKKyMgdXNpbmcgZG94eWdlbiAtZSBydGYgZXh0ZW5zaW9uRmlsZS4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1JURiBpcyBzZXQgdG8gWUVTLgorCitSVEZfRVhURU5TSU9OU19GSUxFICAgID0gCisKKyMgSWYgdGhlIFJURl9TT1VSQ0VfQ09ERSB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBpbmNsdWRlIHNvdXJjZSBjb2RlCisjIHdpdGggc3ludGF4IGhpZ2hsaWdodGluZyBpbiB0aGUgUlRGIG91dHB1dC4KKyMKKyMgTm90ZSB0aGF0IHdoaWNoIHNvdXJjZXMgYXJlIHNob3duIGFsc28gZGVwZW5kcyBvbiBvdGhlciBzZXR0aW5ncyBzdWNoIGFzCisjIFNPVVJDRV9CUk9XU0VSLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9SVEYgaXMgc2V0IHRvIFlFUy4KKworUlRGX1NPVVJDRV9DT0RFICAgICAgICA9IE5PCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIG1hbiBwYWdlIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBHRU5FUkFURV9NQU4gdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBtYW4gcGFnZXMgZm9yCisjIGNsYXNzZXMgYW5kIGZpbGVzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0dFTkVSQVRFX01BTiAgICAgICAgICAgPSBOTworCisjIFRoZSBNQU5fT1VUUFVUIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgd2hlcmUgdGhlIG1hbiBwYWdlcyB3aWxsIGJlIHB1dC4gSWYgYQorIyByZWxhdGl2ZSBwYXRoIGlzIGVudGVyZWQgdGhlIHZhbHVlIG9mIE9VVFBVVF9ESVJFQ1RPUlkgd2lsbCBiZSBwdXQgaW4gZnJvbnQgb2YKKyMgaXQuIEEgZGlyZWN0b3J5IG1hbjMgd2lsbCBiZSBjcmVhdGVkIGluc2lkZSB0aGUgZGlyZWN0b3J5IHNwZWNpZmllZCBieQorIyBNQU5fT1VUUFVULgorIyBUaGUgZGVmYXVsdCBkaXJlY3RvcnkgaXM6IG1hbi4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX01BTiBpcyBzZXQgdG8gWUVTLgorCitNQU5fT1VUUFVUICAgICAgICAgICAgID0gbWFuCisKKyMgVGhlIE1BTl9FWFRFTlNJT04gdGFnIGRldGVybWluZXMgdGhlIGV4dGVuc2lvbiB0aGF0IGlzIGFkZGVkIHRvIHRoZSBnZW5lcmF0ZWQKKyMgbWFuIHBhZ2VzLiBJbiBjYXNlIHRoZSBtYW51YWwgc2VjdGlvbiBkb2VzIG5vdCBzdGFydCB3aXRoIGEgbnVtYmVyLCB0aGUgbnVtYmVyCisjIDMgaXMgcHJlcGVuZGVkLiBUaGUgZG90ICguKSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBNQU5fRVhURU5TSU9OIHRhZyBpcworIyBvcHRpb25hbC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IC4zLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTUFOIGlzIHNldCB0byBZRVMuCisKK01BTl9FWFRFTlNJT04gICAgICAgICAgPSAuMworCisjIFRoZSBNQU5fU1VCRElSIHRhZyBkZXRlcm1pbmVzIHRoZSBuYW1lIG9mIHRoZSBkaXJlY3RvcnkgY3JlYXRlZCB3aXRoaW4KKyMgTUFOX09VVFBVVCBpbiB3aGljaCB0aGUgbWFuIHBhZ2VzIGFyZSBwbGFjZWQuIElmIGRlZmF1bHRzIHRvIG1hbiBmb2xsb3dlZCBieQorIyBNQU5fRVhURU5TSU9OIHdpdGggdGhlIGluaXRpYWwgLiByZW1vdmVkLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTUFOIGlzIHNldCB0byBZRVMuCisKK01BTl9TVUJESVIgICAgICAgICAgICAgPSAKKworIyBJZiB0aGUgTUFOX0xJTktTIHRhZyBpcyBzZXQgdG8gWUVTIGFuZCBkb3h5Z2VuIGdlbmVyYXRlcyBtYW4gb3V0cHV0LCB0aGVuIGl0CisjIHdpbGwgZ2VuZXJhdGUgb25lIGFkZGl0aW9uYWwgbWFuIGZpbGUgZm9yIGVhY2ggZW50aXR5IGRvY3VtZW50ZWQgaW4gdGhlIHJlYWwKKyMgbWFuIHBhZ2UocykuIFRoZXNlIGFkZGl0aW9uYWwgZmlsZXMgb25seSBzb3VyY2UgdGhlIHJlYWwgbWFuIHBhZ2UsIGJ1dCB3aXRob3V0CisjIHRoZW0gdGhlIG1hbiBjb21tYW5kIHdvdWxkIGJlIHVuYWJsZSB0byBmaW5kIHRoZSBjb3JyZWN0IHBhZ2UuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX01BTiBpcyBzZXQgdG8gWUVTLgorCitNQU5fTElOS1MgICAgICAgICAgICAgID0gTk8KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgWE1MIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBHRU5FUkFURV9YTUwgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhbiBYTUwgZmlsZSB0aGF0CisjIGNhcHR1cmVzIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIGNvZGUgaW5jbHVkaW5nIGFsbCBkb2N1bWVudGF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0dFTkVSQVRFX1hNTCAgICAgICAgICAgPSBOTworCisjIFRoZSBYTUxfT1VUUFVUIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgd2hlcmUgdGhlIFhNTCBwYWdlcyB3aWxsIGJlIHB1dC4gSWYgYQorIyByZWxhdGl2ZSBwYXRoIGlzIGVudGVyZWQgdGhlIHZhbHVlIG9mIE9VVFBVVF9ESVJFQ1RPUlkgd2lsbCBiZSBwdXQgaW4gZnJvbnQgb2YKKyMgaXQuCisjIFRoZSBkZWZhdWx0IGRpcmVjdG9yeSBpczogeG1sLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfWE1MIGlzIHNldCB0byBZRVMuCisKK1hNTF9PVVRQVVQgICAgICAgICAgICAgPSB4bWwKKworIyBJZiB0aGUgWE1MX1BST0dSQU1MSVNUSU5HIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgZHVtcCB0aGUgcHJvZ3JhbQorIyBsaXN0aW5ncyAoaW5jbHVkaW5nIHN5bnRheCBoaWdobGlnaHRpbmcgYW5kIGNyb3NzLXJlZmVyZW5jaW5nIGluZm9ybWF0aW9uKSB0bworIyB0aGUgWE1MIG91dHB1dC4gTm90ZSB0aGF0IGVuYWJsaW5nIHRoaXMgd2lsbCBzaWduaWZpY2FudGx5IGluY3JlYXNlIHRoZSBzaXplCisjIG9mIHRoZSBYTUwgb3V0cHV0LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfWE1MIGlzIHNldCB0byBZRVMuCisKK1hNTF9QUk9HUkFNTElTVElORyAgICAgPSBZRVMKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgRE9DQk9PSyBvdXRwdXQKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgR0VORVJBVEVfRE9DQk9PSyB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGdlbmVyYXRlIERvY2Jvb2sgZmlsZXMKKyMgdGhhdCBjYW4gYmUgdXNlZCB0byBnZW5lcmF0ZSBQREYuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworR0VORVJBVEVfRE9DQk9PSyAgICAgICA9IE5PCisKKyMgVGhlIERPQ0JPT0tfT1VUUFVUIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgd2hlcmUgdGhlIERvY2Jvb2sgcGFnZXMgd2lsbCBiZSBwdXQuCisjIElmIGEgcmVsYXRpdmUgcGF0aCBpcyBlbnRlcmVkIHRoZSB2YWx1ZSBvZiBPVVRQVVRfRElSRUNUT1JZIHdpbGwgYmUgcHV0IGluCisjIGZyb250IG9mIGl0LgorIyBUaGUgZGVmYXVsdCBkaXJlY3RvcnkgaXM6IGRvY2Jvb2suCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9ET0NCT09LIGlzIHNldCB0byBZRVMuCisKK0RPQ0JPT0tfT1VUUFVUICAgICAgICAgPSBkb2Nib29rCisKKyMgSWYgdGhlIERPQ0JPT0tfUFJPR1JBTUxJU1RJTkcgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBpbmNsdWRlIHRoZQorIyBwcm9ncmFtIGxpc3RpbmdzIChpbmNsdWRpbmcgc3ludGF4IGhpZ2hsaWdodGluZyBhbmQgY3Jvc3MtcmVmZXJlbmNpbmcKKyMgaW5mb3JtYXRpb24pIHRvIHRoZSBET0NCT09LIG91dHB1dC4gTm90ZSB0aGF0IGVuYWJsaW5nIHRoaXMgd2lsbCBzaWduaWZpY2FudGx5CisjIGluY3JlYXNlIHRoZSBzaXplIG9mIHRoZSBET0NCT09LIG91dHB1dC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfRE9DQk9PSyBpcyBzZXQgdG8gWUVTLgorCitET0NCT09LX1BST0dSQU1MSVNUSU5HID0gTk8KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBBdXRvR2VuIERlZmluaXRpb25zIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBHRU5FUkFURV9BVVRPR0VOX0RFRiB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGFuCisjIEF1dG9HZW4gRGVmaW5pdGlvbnMgKHNlZSBodHRwOi8vYXV0b2dlbi5zZi5uZXQpIGZpbGUgdGhhdCBjYXB0dXJlcyB0aGUKKyMgc3RydWN0dXJlIG9mIHRoZSBjb2RlIGluY2x1ZGluZyBhbGwgZG9jdW1lbnRhdGlvbi4gTm90ZSB0aGF0IHRoaXMgZmVhdHVyZSBpcworIyBzdGlsbCBleHBlcmltZW50YWwgYW5kIGluY29tcGxldGUgYXQgdGhlIG1vbWVudC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitHRU5FUkFURV9BVVRPR0VOX0RFRiAgID0gTk8KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgUGVybCBtb2R1bGUgb3V0cHV0CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIEdFTkVSQVRFX1BFUkxNT0QgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIFBlcmwgbW9kdWxlCisjIGZpbGUgdGhhdCBjYXB0dXJlcyB0aGUgc3RydWN0dXJlIG9mIHRoZSBjb2RlIGluY2x1ZGluZyBhbGwgZG9jdW1lbnRhdGlvbi4KKyMKKyMgTm90ZSB0aGF0IHRoaXMgZmVhdHVyZSBpcyBzdGlsbCBleHBlcmltZW50YWwgYW5kIGluY29tcGxldGUgYXQgdGhlIG1vbWVudC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitHRU5FUkFURV9QRVJMTU9EICAgICAgID0gTk8KKworIyBJZiB0aGUgUEVSTE1PRF9MQVRFWCB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGdlbmVyYXRlIHRoZSBuZWNlc3NhcnkKKyMgTWFrZWZpbGUgcnVsZXMsIFBlcmwgc2NyaXB0cyBhbmQgTGFUZVggY29kZSB0byBiZSBhYmxlIHRvIGdlbmVyYXRlIFBERiBhbmQgRFZJCisjIG91dHB1dCBmcm9tIHRoZSBQZXJsIG1vZHVsZSBvdXRwdXQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1BFUkxNT0QgaXMgc2V0IHRvIFlFUy4KKworUEVSTE1PRF9MQVRFWCAgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIFBFUkxNT0RfUFJFVFRZIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGUgUGVybCBtb2R1bGUgb3V0cHV0IHdpbGwgYmUgbmljZWx5CisjIGZvcm1hdHRlZCBzbyBpdCBjYW4gYmUgcGFyc2VkIGJ5IGEgaHVtYW4gcmVhZGVyLiBUaGlzIGlzIHVzZWZ1bCBpZiB5b3Ugd2FudCB0bworIyB1bmRlcnN0YW5kIHdoYXQgaXMgZ29pbmcgb24uIE9uIHRoZSBvdGhlciBoYW5kLCBpZiB0aGlzIHRhZyBpcyBzZXQgdG8gTk8sIHRoZQorIyBzaXplIG9mIHRoZSBQZXJsIG1vZHVsZSBvdXRwdXQgd2lsbCBiZSBtdWNoIHNtYWxsZXIgYW5kIFBlcmwgd2lsbCBwYXJzZSBpdAorIyBqdXN0IHRoZSBzYW1lLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUEVSTE1PRCBpcyBzZXQgdG8gWUVTLgorCitQRVJMTU9EX1BSRVRUWSAgICAgICAgID0gWUVTCisKKyMgVGhlIG5hbWVzIG9mIHRoZSBtYWtlIHZhcmlhYmxlcyBpbiB0aGUgZ2VuZXJhdGVkIGRveHlydWxlcy5tYWtlIGZpbGUgYXJlCisjIHByZWZpeGVkIHdpdGggdGhlIHN0cmluZyBjb250YWluZWQgaW4gUEVSTE1PRF9NQUtFVkFSX1BSRUZJWC4gVGhpcyBpcyB1c2VmdWwKKyMgc28gZGlmZmVyZW50IGRveHlydWxlcy5tYWtlIGZpbGVzIGluY2x1ZGVkIGJ5IHRoZSBzYW1lIE1ha2VmaWxlIGRvbid0CisjIG92ZXJ3cml0ZSBlYWNoIG90aGVyJ3MgdmFyaWFibGVzLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUEVSTE1PRCBpcyBzZXQgdG8gWUVTLgorCitQRVJMTU9EX01BS0VWQVJfUFJFRklYID0gCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIHByZXByb2Nlc3NvcgorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBFTkFCTEVfUFJFUFJPQ0VTU0lORyB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGV2YWx1YXRlIGFsbAorIyBDLXByZXByb2Nlc3NvciBkaXJlY3RpdmVzIGZvdW5kIGluIHRoZSBzb3VyY2VzIGFuZCBpbmNsdWRlIGZpbGVzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitFTkFCTEVfUFJFUFJPQ0VTU0lORyAgID0gWUVTCisKKyMgSWYgdGhlIE1BQ1JPX0VYUEFOU0lPTiB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGV4cGFuZCBhbGwgbWFjcm8gbmFtZXMKKyMgaW4gdGhlIHNvdXJjZSBjb2RlLiBJZiBzZXQgdG8gTk8sIG9ubHkgY29uZGl0aW9uYWwgY29tcGlsYXRpb24gd2lsbCBiZQorIyBwZXJmb3JtZWQuIE1hY3JvIGV4cGFuc2lvbiBjYW4gYmUgZG9uZSBpbiBhIGNvbnRyb2xsZWQgd2F5IGJ5IHNldHRpbmcKKyMgRVhQQU5EX09OTFlfUFJFREVGIHRvIFlFUy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgRU5BQkxFX1BSRVBST0NFU1NJTkcgaXMgc2V0IHRvIFlFUy4KKworTUFDUk9fRVhQQU5TSU9OICAgICAgICA9IFlFUworCisjIElmIHRoZSBFWFBBTkRfT05MWV9QUkVERUYgYW5kIE1BQ1JPX0VYUEFOU0lPTiB0YWdzIGFyZSBib3RoIHNldCB0byBZRVMgdGhlbgorIyB0aGUgbWFjcm8gZXhwYW5zaW9uIGlzIGxpbWl0ZWQgdG8gdGhlIG1hY3JvcyBzcGVjaWZpZWQgd2l0aCB0aGUgUFJFREVGSU5FRCBhbmQKKyMgRVhQQU5EX0FTX0RFRklORUQgdGFncy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgRU5BQkxFX1BSRVBST0NFU1NJTkcgaXMgc2V0IHRvIFlFUy4KKworRVhQQU5EX09OTFlfUFJFREVGICAgICA9IFlFUworCisjIElmIHRoZSBTRUFSQ0hfSU5DTFVERVMgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBpbmNsdWRlIGZpbGVzIGluIHRoZQorIyBJTkNMVURFX1BBVEggd2lsbCBiZSBzZWFyY2hlZCBpZiBhICNpbmNsdWRlIGlzIGZvdW5kLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgRU5BQkxFX1BSRVBST0NFU1NJTkcgaXMgc2V0IHRvIFlFUy4KKworU0VBUkNIX0lOQ0xVREVTICAgICAgICA9IFlFUworCisjIFRoZSBJTkNMVURFX1BBVEggdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgZGlyZWN0b3JpZXMgdGhhdAorIyBjb250YWluIGluY2x1ZGUgZmlsZXMgdGhhdCBhcmUgbm90IGlucHV0IGZpbGVzIGJ1dCBzaG91bGQgYmUgcHJvY2Vzc2VkIGJ5IHRoZQorIyBwcmVwcm9jZXNzb3IuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBTRUFSQ0hfSU5DTFVERVMgaXMgc2V0IHRvIFlFUy4KKworSU5DTFVERV9QQVRIICAgICAgICAgICA9IC9Wb2x1bWVzL0EvYW9zcC9wcmVidWlsdHMvY2xhbmcvZGFyd2luLXg4Ni9ob3N0LzMuNi9saWIvY2xhbmcvMy42L2luY2x1ZGUgXAorICAgICAgICAgICAgICAgICAgICAgICAgIC9Wb2x1bWVzL0EvYW9zcC9leHRlcm5hbC9saWJjeHgvaW5jbHVkZSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgL1ZvbHVtZXMvQS9hb3NwL2Jpb25pYy9saWJjL2luY2x1ZGUgXAorICAgICAgICAgICAgICAgICAgICAgICAgIC9Wb2x1bWVzL0EvYW9zcC9iaW9uaWMvbGliYy9rZXJuZWwvdWFwaSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgL1ZvbHVtZXMvQS9hb3NwL2Jpb25pYy9saWJjL2tlcm5lbC91YXBpL2FzbS1hcm02NCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgL1ZvbHVtZXMvQS9hb3NwL2V4dGVybmFsL2d0ZXN0CisKKyMgWW91IGNhbiB1c2UgdGhlIElOQ0xVREVfRklMRV9QQVRURVJOUyB0YWcgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSB3aWxkY2FyZAorIyBwYXR0ZXJucyAobGlrZSAqLmggYW5kICouaHBwKSB0byBmaWx0ZXIgb3V0IHRoZSBoZWFkZXItZmlsZXMgaW4gdGhlCisjIGRpcmVjdG9yaWVzLiBJZiBsZWZ0IGJsYW5rLCB0aGUgcGF0dGVybnMgc3BlY2lmaWVkIHdpdGggRklMRV9QQVRURVJOUyB3aWxsIGJlCisjIHVzZWQuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBFTkFCTEVfUFJFUFJPQ0VTU0lORyBpcyBzZXQgdG8gWUVTLgorCitJTkNMVURFX0ZJTEVfUEFUVEVSTlMgID0gCisKKyMgVGhlIFBSRURFRklORUQgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgbWFjcm8gbmFtZXMgdGhhdCBhcmUKKyMgZGVmaW5lZCBiZWZvcmUgdGhlIHByZXByb2Nlc3NvciBpcyBzdGFydGVkIChzaW1pbGFyIHRvIHRoZSAtRCBvcHRpb24gb2YgZS5nLgorIyBnY2MpLiBUaGUgYXJndW1lbnQgb2YgdGhlIHRhZyBpcyBhIGxpc3Qgb2YgbWFjcm9zIG9mIHRoZSBmb3JtOiBuYW1lIG9yCisjIG5hbWU9ZGVmaW5pdGlvbiAobm8gc3BhY2VzKS4gSWYgdGhlIGRlZmluaXRpb24gYW5kIHRoZSAiPSIgYXJlIG9taXR0ZWQsICI9MSIKKyMgaXMgYXNzdW1lZC4gVG8gcHJldmVudCBhIG1hY3JvIGRlZmluaXRpb24gZnJvbSBiZWluZyB1bmRlZmluZWQgdmlhICN1bmRlZiBvcgorIyByZWN1cnNpdmVseSBleHBhbmRlZCB1c2UgdGhlIDo9IG9wZXJhdG9yIGluc3RlYWQgb2YgdGhlID0gb3BlcmF0b3IuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBFTkFCTEVfUFJFUFJPQ0VTU0lORyBpcyBzZXQgdG8gWUVTLgorCitQUkVERUZJTkVEICAgICAgICAgICAgID0gX19BUFBMRV9fPSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgX19BTkRST0lEX189MSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgQU5EUk9JRDo9MSBcCisJCQkgX191bnVzZWQ9CisKKyMgSWYgdGhlIE1BQ1JPX0VYUEFOU0lPTiBhbmQgRVhQQU5EX09OTFlfUFJFREVGIHRhZ3MgYXJlIHNldCB0byBZRVMgdGhlbiB0aGlzCisjIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgbGlzdCBvZiBtYWNybyBuYW1lcyB0aGF0IHNob3VsZCBiZSBleHBhbmRlZC4gVGhlCisjIG1hY3JvIGRlZmluaXRpb24gdGhhdCBpcyBmb3VuZCBpbiB0aGUgc291cmNlcyB3aWxsIGJlIHVzZWQuIFVzZSB0aGUgUFJFREVGSU5FRAorIyB0YWcgaWYgeW91IHdhbnQgdG8gdXNlIGEgZGlmZmVyZW50IG1hY3JvIGRlZmluaXRpb24gdGhhdCBvdmVycnVsZXMgdGhlCisjIGRlZmluaXRpb24gZm91bmQgaW4gdGhlIHNvdXJjZSBjb2RlLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgRU5BQkxFX1BSRVBST0NFU1NJTkcgaXMgc2V0IHRvIFlFUy4KKworRVhQQU5EX0FTX0RFRklORUQgICAgICA9IERFRklORV9GTEVYSUJMRV9NRVRIT0RTIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBERUZJTkVfQ0FTVF9PUEVSQVRPUlMKKworIyBJZiB0aGUgU0tJUF9GVU5DVElPTl9NQUNST1MgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuJ3MgcHJlcHJvY2Vzc29yIHdpbGwKKyMgcmVtb3ZlIGFsbCByZWZlcmVuY2VzIHRvIGZ1bmN0aW9uLWxpa2UgbWFjcm9zIHRoYXQgYXJlIGFsb25lIG9uIGEgbGluZSwgaGF2ZQorIyBhbiBhbGwgdXBwZXJjYXNlIG5hbWUsIGFuZCBkbyBub3QgZW5kIHdpdGggYSBzZW1pY29sb24uIFN1Y2ggZnVuY3Rpb24gbWFjcm9zCisjIGFyZSB0eXBpY2FsbHkgdXNlZCBmb3IgYm9pbGVyLXBsYXRlIGNvZGUsIGFuZCB3aWxsIGNvbmZ1c2UgdGhlIHBhcnNlciBpZiBub3QKKyMgcmVtb3ZlZC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEVOQUJMRV9QUkVQUk9DRVNTSU5HIGlzIHNldCB0byBZRVMuCisKK1NLSVBfRlVOQ1RJT05fTUFDUk9TICAgPSBZRVMKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byBleHRlcm5hbCByZWZlcmVuY2VzCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgVGhlIFRBR0ZJTEVTIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIHRhZyBmaWxlcy4gRm9yIGVhY2ggdGFnCisjIGZpbGUgdGhlIGxvY2F0aW9uIG9mIHRoZSBleHRlcm5hbCBkb2N1bWVudGF0aW9uIHNob3VsZCBiZSBhZGRlZC4gVGhlIGZvcm1hdCBvZgorIyBhIHRhZyBmaWxlIHdpdGhvdXQgdGhpcyBsb2NhdGlvbiBpcyBhcyBmb2xsb3dzOgorIyBUQUdGSUxFUyA9IGZpbGUxIGZpbGUyIC4uLgorIyBBZGRpbmcgbG9jYXRpb24gZm9yIHRoZSB0YWcgZmlsZXMgaXMgZG9uZSBhcyBmb2xsb3dzOgorIyBUQUdGSUxFUyA9IGZpbGUxPWxvYzEgImZpbGUyID0gbG9jMiIgLi4uCisjIHdoZXJlIGxvYzEgYW5kIGxvYzIgY2FuIGJlIHJlbGF0aXZlIG9yIGFic29sdXRlIHBhdGhzIG9yIFVSTHMuIFNlZSB0aGUKKyMgc2VjdGlvbiAiTGlua2luZyB0byBleHRlcm5hbCBkb2N1bWVudGF0aW9uIiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdXNlCisjIG9mIHRhZyBmaWxlcy4KKyMgTm90ZTogRWFjaCB0YWcgZmlsZSBtdXN0IGhhdmUgYSB1bmlxdWUgbmFtZSAod2hlcmUgdGhlIG5hbWUgZG9lcyBOT1QgaW5jbHVkZQorIyB0aGUgcGF0aCkuIElmIGEgdGFnIGZpbGUgaXMgbm90IGxvY2F0ZWQgaW4gdGhlIGRpcmVjdG9yeSBpbiB3aGljaCBkb3h5Z2VuIGlzCisjIHJ1biwgeW91IG11c3QgYWxzbyBzcGVjaWZ5IHRoZSBwYXRoIHRvIHRoZSB0YWdmaWxlIGhlcmUuCisKK1RBR0ZJTEVTICAgICAgICAgICAgICAgPSAKKworIyBXaGVuIGEgZmlsZSBuYW1lIGlzIHNwZWNpZmllZCBhZnRlciBHRU5FUkFURV9UQUdGSUxFLCBkb3h5Z2VuIHdpbGwgY3JlYXRlIGEKKyMgdGFnIGZpbGUgdGhhdCBpcyBiYXNlZCBvbiB0aGUgaW5wdXQgZmlsZXMgaXQgcmVhZHMuIFNlZSBzZWN0aW9uICJMaW5raW5nIHRvCisjIGV4dGVybmFsIGRvY3VtZW50YXRpb24iIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSB1c2FnZSBvZiB0YWcgZmlsZXMuCisKK0dFTkVSQVRFX1RBR0ZJTEUgICAgICAgPSAKKworIyBJZiB0aGUgQUxMRVhURVJOQUxTIHRhZyBpcyBzZXQgdG8gWUVTLCBhbGwgZXh0ZXJuYWwgY2xhc3Mgd2lsbCBiZSBsaXN0ZWQgaW4KKyMgdGhlIGNsYXNzIGluZGV4LiBJZiBzZXQgdG8gTk8sIG9ubHkgdGhlIGluaGVyaXRlZCBleHRlcm5hbCBjbGFzc2VzIHdpbGwgYmUKKyMgbGlzdGVkLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0FMTEVYVEVSTkFMUyAgICAgICAgICAgPSBOTworCisjIElmIHRoZSBFWFRFUk5BTF9HUk9VUFMgdGFnIGlzIHNldCB0byBZRVMsIGFsbCBleHRlcm5hbCBncm91cHMgd2lsbCBiZSBsaXN0ZWQKKyMgaW4gdGhlIG1vZHVsZXMgaW5kZXguIElmIHNldCB0byBOTywgb25seSB0aGUgY3VycmVudCBwcm9qZWN0J3MgZ3JvdXBzIHdpbGwgYmUKKyMgbGlzdGVkLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitFWFRFUk5BTF9HUk9VUFMgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIEVYVEVSTkFMX1BBR0VTIHRhZyBpcyBzZXQgdG8gWUVTLCBhbGwgZXh0ZXJuYWwgcGFnZXMgd2lsbCBiZSBsaXN0ZWQgaW4KKyMgdGhlIHJlbGF0ZWQgcGFnZXMgaW5kZXguIElmIHNldCB0byBOTywgb25seSB0aGUgY3VycmVudCBwcm9qZWN0J3MgcGFnZXMgd2lsbAorIyBiZSBsaXN0ZWQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK0VYVEVSTkFMX1BBR0VTICAgICAgICAgPSBZRVMKKworIyBUaGUgUEVSTF9QQVRIIHNob3VsZCBiZSB0aGUgYWJzb2x1dGUgcGF0aCBhbmQgbmFtZSBvZiB0aGUgcGVybCBzY3JpcHQKKyMgaW50ZXJwcmV0ZXIgKGkuZS4gdGhlIHJlc3VsdCBvZiAnd2hpY2ggcGVybCcpLgorIyBUaGUgZGVmYXVsdCBmaWxlICh3aXRoIGFic29sdXRlIHBhdGgpIGlzOiAvdXNyL2Jpbi9wZXJsLgorCitQRVJMX1BBVEggICAgICAgICAgICAgID0gL3Vzci9iaW4vcGVybAorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBkb3QgdG9vbAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBDTEFTU19ESUFHUkFNUyB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgY2xhc3MgZGlhZ3JhbQorIyAoaW4gSFRNTCBhbmQgTGFUZVgpIGZvciBjbGFzc2VzIHdpdGggYmFzZSBvciBzdXBlciBjbGFzc2VzLiBTZXR0aW5nIHRoZSB0YWcgdG8KKyMgTk8gdHVybnMgdGhlIGRpYWdyYW1zIG9mZi4gTm90ZSB0aGF0IHRoaXMgb3B0aW9uIGFsc28gd29ya3Mgd2l0aCBIQVZFX0RPVAorIyBkaXNhYmxlZCwgYnV0IGl0IGlzIHJlY29tbWVuZGVkIHRvIGluc3RhbGwgYW5kIHVzZSBkb3QsIHNpbmNlIGl0IHlpZWxkcyBtb3JlCisjIHBvd2VyZnVsIGdyYXBocy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworQ0xBU1NfRElBR1JBTVMgICAgICAgICA9IFlFUworCisjIFlvdSBjYW4gZGVmaW5lIG1lc3NhZ2Ugc2VxdWVuY2UgY2hhcnRzIHdpdGhpbiBkb3h5Z2VuIGNvbW1lbnRzIHVzaW5nIHRoZSBcbXNjCisjIGNvbW1hbmQuIERveHlnZW4gd2lsbCB0aGVuIHJ1biB0aGUgbXNjZ2VuIHRvb2wgKHNlZToKKyMgaHR0cDovL3d3dy5tY3Rlcm5hbi5tZS51ay9tc2NnZW4vKSkgdG8gcHJvZHVjZSB0aGUgY2hhcnQgYW5kIGluc2VydCBpdCBpbiB0aGUKKyMgZG9jdW1lbnRhdGlvbi4gVGhlIE1TQ0dFTl9QQVRIIHRhZyBhbGxvd3MgeW91IHRvIHNwZWNpZnkgdGhlIGRpcmVjdG9yeSB3aGVyZQorIyB0aGUgbXNjZ2VuIHRvb2wgcmVzaWRlcy4gSWYgbGVmdCBlbXB0eSB0aGUgdG9vbCBpcyBhc3N1bWVkIHRvIGJlIGZvdW5kIGluIHRoZQorIyBkZWZhdWx0IHNlYXJjaCBwYXRoLgorCitNU0NHRU5fUEFUSCAgICAgICAgICAgID0gCisKKyMgWW91IGNhbiBpbmNsdWRlIGRpYWdyYW1zIG1hZGUgd2l0aCBkaWEgaW4gZG94eWdlbiBkb2N1bWVudGF0aW9uLiBEb3h5Z2VuIHdpbGwKKyMgdGhlbiBydW4gZGlhIHRvIHByb2R1Y2UgdGhlIGRpYWdyYW0gYW5kIGluc2VydCBpdCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4gVGhlCisjIERJQV9QQVRIIHRhZyBhbGxvd3MgeW91IHRvIHNwZWNpZnkgdGhlIGRpcmVjdG9yeSB3aGVyZSB0aGUgZGlhIGJpbmFyeSByZXNpZGVzLgorIyBJZiBsZWZ0IGVtcHR5IGRpYSBpcyBhc3N1bWVkIHRvIGJlIGZvdW5kIGluIHRoZSBkZWZhdWx0IHNlYXJjaCBwYXRoLgorCitESUFfUEFUSCAgICAgICAgICAgICAgID0gCisKKyMgSWYgc2V0IHRvIFlFUyB0aGUgaW5oZXJpdGFuY2UgYW5kIGNvbGxhYm9yYXRpb24gZ3JhcGhzIHdpbGwgaGlkZSBpbmhlcml0YW5jZQorIyBhbmQgdXNhZ2UgcmVsYXRpb25zIGlmIHRoZSB0YXJnZXQgaXMgdW5kb2N1bWVudGVkIG9yIGlzIG5vdCBhIGNsYXNzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitISURFX1VORE9DX1JFTEFUSU9OUyAgID0gWUVTCisKKyMgSWYgeW91IHNldCB0aGUgSEFWRV9ET1QgdGFnIHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBhc3N1bWUgdGhlIGRvdCB0b29sIGlzCisjIGF2YWlsYWJsZSBmcm9tIHRoZSBwYXRoLiBUaGlzIHRvb2wgaXMgcGFydCBvZiBHcmFwaHZpeiAoc2VlOgorIyBodHRwOi8vd3d3LmdyYXBodml6Lm9yZy8pLCBhIGdyYXBoIHZpc3VhbGl6YXRpb24gdG9vbGtpdCBmcm9tIEFUJlQgYW5kIEx1Y2VudAorIyBCZWxsIExhYnMuIFRoZSBvdGhlciBvcHRpb25zIGluIHRoaXMgc2VjdGlvbiBoYXZlIG5vIGVmZmVjdCBpZiB0aGlzIG9wdGlvbiBpcworIyBzZXQgdG8gTk8KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitIQVZFX0RPVCAgICAgICAgICAgICAgID0gTk8KKworIyBUaGUgRE9UX05VTV9USFJFQURTIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGRvdCBpbnZvY2F0aW9ucyBkb3h5Z2VuIGlzIGFsbG93ZWQKKyMgdG8gcnVuIGluIHBhcmFsbGVsLiBXaGVuIHNldCB0byAwIGRveHlnZW4gd2lsbCBiYXNlIHRoaXMgb24gdGhlIG51bWJlciBvZgorIyBwcm9jZXNzb3JzIGF2YWlsYWJsZSBpbiB0aGUgc3lzdGVtLiBZb3UgY2FuIHNldCBpdCBleHBsaWNpdGx5IHRvIGEgdmFsdWUKKyMgbGFyZ2VyIHRoYW4gMCB0byBnZXQgY29udHJvbCBvdmVyIHRoZSBiYWxhbmNlIGJldHdlZW4gQ1BVIGxvYWQgYW5kIHByb2Nlc3NpbmcKKyMgc3BlZWQuCisjIE1pbmltdW0gdmFsdWU6IDAsIG1heGltdW0gdmFsdWU6IDMyLCBkZWZhdWx0IHZhbHVlOiAwLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworRE9UX05VTV9USFJFQURTICAgICAgICA9IDAKKworIyBXaGVuIHlvdSB3YW50IGEgZGlmZmVyZW50bHkgbG9va2luZyBmb250IGluIHRoZSBkb3QgZmlsZXMgdGhhdCBkb3h5Z2VuCisjIGdlbmVyYXRlcyB5b3UgY2FuIHNwZWNpZnkgdGhlIGZvbnQgbmFtZSB1c2luZyBET1RfRk9OVE5BTUUuIFlvdSBuZWVkIHRvIG1ha2UKKyMgc3VyZSBkb3QgaXMgYWJsZSB0byBmaW5kIHRoZSBmb250LCB3aGljaCBjYW4gYmUgZG9uZSBieSBwdXR0aW5nIGl0IGluIGEKKyMgc3RhbmRhcmQgbG9jYXRpb24gb3IgYnkgc2V0dGluZyB0aGUgRE9URk9OVFBBVEggZW52aXJvbm1lbnQgdmFyaWFibGUgb3IgYnkKKyMgc2V0dGluZyBET1RfRk9OVFBBVEggdG8gdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBmb250LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogSGVsdmV0aWNhLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworRE9UX0ZPTlROQU1FICAgICAgICAgICA9IEhlbHZldGljYQorCisjIFRoZSBET1RfRk9OVFNJWkUgdGFnIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgc2l6ZSAoaW4gcG9pbnRzKSBvZiB0aGUgZm9udCBvZgorIyBkb3QgZ3JhcGhzLgorIyBNaW5pbXVtIHZhbHVlOiA0LCBtYXhpbXVtIHZhbHVlOiAyNCwgZGVmYXVsdCB2YWx1ZTogMTAuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitET1RfRk9OVFNJWkUgICAgICAgICAgID0gMTAKKworIyBCeSBkZWZhdWx0IGRveHlnZW4gd2lsbCB0ZWxsIGRvdCB0byB1c2UgdGhlIGRlZmF1bHQgZm9udCBhcyBzcGVjaWZpZWQgd2l0aAorIyBET1RfRk9OVE5BTUUuIElmIHlvdSBzcGVjaWZ5IGEgZGlmZmVyZW50IGZvbnQgdXNpbmcgRE9UX0ZPTlROQU1FIHlvdSBjYW4gc2V0CisjIHRoZSBwYXRoIHdoZXJlIGRvdCBjYW4gZmluZCBpdCB1c2luZyB0aGlzIHRhZy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK0RPVF9GT05UUEFUSCAgICAgICAgICAgPSAKKworIyBJZiB0aGUgQ0xBU1NfR1JBUEggdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBncmFwaCBmb3IKKyMgZWFjaCBkb2N1bWVudGVkIGNsYXNzIHNob3dpbmcgdGhlIGRpcmVjdCBhbmQgaW5kaXJlY3QgaW5oZXJpdGFuY2UgcmVsYXRpb25zLgorIyBTZXR0aW5nIHRoaXMgdGFnIHRvIFlFUyB3aWxsIGZvcmNlIHRoZSBDTEFTU19ESUFHUkFNUyB0YWcgdG8gTk8uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitDTEFTU19HUkFQSCAgICAgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIENPTExBQk9SQVRJT05fR1JBUEggdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYQorIyBncmFwaCBmb3IgZWFjaCBkb2N1bWVudGVkIGNsYXNzIHNob3dpbmcgdGhlIGRpcmVjdCBhbmQgaW5kaXJlY3QgaW1wbGVtZW50YXRpb24KKyMgZGVwZW5kZW5jaWVzIChpbmhlcml0YW5jZSwgY29udGFpbm1lbnQsIGFuZCBjbGFzcyByZWZlcmVuY2VzIHZhcmlhYmxlcykgb2YgdGhlCisjIGNsYXNzIHdpdGggb3RoZXIgZG9jdW1lbnRlZCBjbGFzc2VzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworQ09MTEFCT1JBVElPTl9HUkFQSCAgICA9IFlFUworCisjIElmIHRoZSBHUk9VUF9HUkFQSFMgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBncmFwaCBmb3IKKyMgZ3JvdXBzLCBzaG93aW5nIHRoZSBkaXJlY3QgZ3JvdXBzIGRlcGVuZGVuY2llcy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK0dST1VQX0dSQVBIUyAgICAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgVU1MX0xPT0sgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBpbmhlcml0YW5jZSBhbmQKKyMgY29sbGFib3JhdGlvbiBkaWFncmFtcyBpbiBhIHN0eWxlIHNpbWlsYXIgdG8gdGhlIE9NRydzIFVuaWZpZWQgTW9kZWxpbmcKKyMgTGFuZ3VhZ2UuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK1VNTF9MT09LICAgICAgICAgICAgICAgPSBOTworCisjIElmIHRoZSBVTUxfTE9PSyB0YWcgaXMgZW5hYmxlZCwgdGhlIGZpZWxkcyBhbmQgbWV0aG9kcyBhcmUgc2hvd24gaW5zaWRlIHRoZQorIyBjbGFzcyBub2RlLiBJZiB0aGVyZSBhcmUgbWFueSBmaWVsZHMgb3IgbWV0aG9kcyBhbmQgbWFueSBub2RlcyB0aGUgZ3JhcGggbWF5CisjIGJlY29tZSB0b28gYmlnIHRvIGJlIHVzZWZ1bC4gVGhlIFVNTF9MSU1JVF9OVU1fRklFTERTIHRocmVzaG9sZCBsaW1pdHMgdGhlCisjIG51bWJlciBvZiBpdGVtcyBmb3IgZWFjaCB0eXBlIHRvIG1ha2UgdGhlIHNpemUgbW9yZSBtYW5hZ2VhYmxlLiBTZXQgdGhpcyB0byAwCisjIGZvciBubyBsaW1pdC4gTm90ZSB0aGF0IHRoZSB0aHJlc2hvbGQgbWF5IGJlIGV4Y2VlZGVkIGJ5IDUwJSBiZWZvcmUgdGhlIGxpbWl0CisjIGlzIGVuZm9yY2VkLiBTbyB3aGVuIHlvdSBzZXQgdGhlIHRocmVzaG9sZCB0byAxMCwgdXAgdG8gMTUgZmllbGRzIG1heSBhcHBlYXIsCisjIGJ1dCBpZiB0aGUgbnVtYmVyIGV4Y2VlZHMgMTUsIHRoZSB0b3RhbCBhbW91bnQgb2YgZmllbGRzIHNob3duIGlzIGxpbWl0ZWQgdG8KKyMgMTAuCisjIE1pbmltdW0gdmFsdWU6IDAsIG1heGltdW0gdmFsdWU6IDEwMCwgZGVmYXVsdCB2YWx1ZTogMTAuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitVTUxfTElNSVRfTlVNX0ZJRUxEUyAgID0gMTAKKworIyBJZiB0aGUgVEVNUExBVEVfUkVMQVRJT05TIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gdGhlIGluaGVyaXRhbmNlIGFuZAorIyBjb2xsYWJvcmF0aW9uIGdyYXBocyB3aWxsIHNob3cgdGhlIHJlbGF0aW9ucyBiZXR3ZWVuIHRlbXBsYXRlcyBhbmQgdGhlaXIKKyMgaW5zdGFuY2VzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitURU1QTEFURV9SRUxBVElPTlMgICAgID0gTk8KKworIyBJZiB0aGUgSU5DTFVERV9HUkFQSCwgRU5BQkxFX1BSRVBST0NFU1NJTkcgYW5kIFNFQVJDSF9JTkNMVURFUyB0YWdzIGFyZSBzZXQgdG8KKyMgWUVTIHRoZW4gZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgZ3JhcGggZm9yIGVhY2ggZG9jdW1lbnRlZCBmaWxlIHNob3dpbmcgdGhlCisjIGRpcmVjdCBhbmQgaW5kaXJlY3QgaW5jbHVkZSBkZXBlbmRlbmNpZXMgb2YgdGhlIGZpbGUgd2l0aCBvdGhlciBkb2N1bWVudGVkCisjIGZpbGVzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworSU5DTFVERV9HUkFQSCAgICAgICAgICA9IFlFUworCisjIElmIHRoZSBJTkNMVURFRF9CWV9HUkFQSCwgRU5BQkxFX1BSRVBST0NFU1NJTkcgYW5kIFNFQVJDSF9JTkNMVURFUyB0YWdzIGFyZQorIyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgZ3JhcGggZm9yIGVhY2ggZG9jdW1lbnRlZCBmaWxlIHNob3dpbmcKKyMgdGhlIGRpcmVjdCBhbmQgaW5kaXJlY3QgaW5jbHVkZSBkZXBlbmRlbmNpZXMgb2YgdGhlIGZpbGUgd2l0aCBvdGhlciBkb2N1bWVudGVkCisjIGZpbGVzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworSU5DTFVERURfQllfR1JBUEggICAgICA9IFlFUworCisjIElmIHRoZSBDQUxMX0dSQVBIIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgY2FsbAorIyBkZXBlbmRlbmN5IGdyYXBoIGZvciBldmVyeSBnbG9iYWwgZnVuY3Rpb24gb3IgY2xhc3MgbWV0aG9kLgorIworIyBOb3RlIHRoYXQgZW5hYmxpbmcgdGhpcyBvcHRpb24gd2lsbCBzaWduaWZpY2FudGx5IGluY3JlYXNlIHRoZSB0aW1lIG9mIGEgcnVuLgorIyBTbyBpbiBtb3N0IGNhc2VzIGl0IHdpbGwgYmUgYmV0dGVyIHRvIGVuYWJsZSBjYWxsIGdyYXBocyBmb3Igc2VsZWN0ZWQKKyMgZnVuY3Rpb25zIG9ubHkgdXNpbmcgdGhlIFxjYWxsZ3JhcGggY29tbWFuZC4gRGlzYWJsaW5nIGEgY2FsbCBncmFwaCBjYW4gYmUKKyMgYWNjb21wbGlzaGVkIGJ5IG1lYW5zIG9mIHRoZSBjb21tYW5kIFxoaWRlY2FsbGdyYXBoLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitDQUxMX0dSQVBIICAgICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgQ0FMTEVSX0dSQVBIIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgY2FsbGVyCisjIGRlcGVuZGVuY3kgZ3JhcGggZm9yIGV2ZXJ5IGdsb2JhbCBmdW5jdGlvbiBvciBjbGFzcyBtZXRob2QuCisjCisjIE5vdGUgdGhhdCBlbmFibGluZyB0aGlzIG9wdGlvbiB3aWxsIHNpZ25pZmljYW50bHkgaW5jcmVhc2UgdGhlIHRpbWUgb2YgYSBydW4uCisjIFNvIGluIG1vc3QgY2FzZXMgaXQgd2lsbCBiZSBiZXR0ZXIgdG8gZW5hYmxlIGNhbGxlciBncmFwaHMgZm9yIHNlbGVjdGVkCisjIGZ1bmN0aW9ucyBvbmx5IHVzaW5nIHRoZSBcY2FsbGVyZ3JhcGggY29tbWFuZC4gRGlzYWJsaW5nIGEgY2FsbGVyIGdyYXBoIGNhbiBiZQorIyBhY2NvbXBsaXNoZWQgYnkgbWVhbnMgb2YgdGhlIGNvbW1hbmQgXGhpZGVjYWxsZXJncmFwaC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworQ0FMTEVSX0dSQVBIICAgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIEdSQVBISUNBTF9ISUVSQVJDSFkgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgZ3JhcGhpY2FsCisjIGhpZXJhcmNoeSBvZiBhbGwgY2xhc3NlcyBpbnN0ZWFkIG9mIGEgdGV4dHVhbCBvbmUuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitHUkFQSElDQUxfSElFUkFSQ0hZICAgID0gWUVTCisKKyMgSWYgdGhlIERJUkVDVE9SWV9HUkFQSCB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBzaG93IHRoZQorIyBkZXBlbmRlbmNpZXMgYSBkaXJlY3RvcnkgaGFzIG9uIG90aGVyIGRpcmVjdG9yaWVzIGluIGEgZ3JhcGhpY2FsIHdheS4gVGhlCisjIGRlcGVuZGVuY3kgcmVsYXRpb25zIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSAjaW5jbHVkZSByZWxhdGlvbnMgYmV0d2VlbiB0aGUKKyMgZmlsZXMgaW4gdGhlIGRpcmVjdG9yaWVzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworRElSRUNUT1JZX0dSQVBIICAgICAgICA9IFlFUworCisjIFRoZSBET1RfSU1BR0VfRk9STUFUIHRhZyBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIGltYWdlIGZvcm1hdCBvZiB0aGUgaW1hZ2VzCisjIGdlbmVyYXRlZCBieSBkb3QuIEZvciBhbiBleHBsYW5hdGlvbiBvZiB0aGUgaW1hZ2UgZm9ybWF0cyBzZWUgdGhlIHNlY3Rpb24KKyMgb3V0cHV0IGZvcm1hdHMgaW4gdGhlIGRvY3VtZW50YXRpb24gb2YgdGhlIGRvdCB0b29sIChHcmFwaHZpeiAoc2VlOgorIyBodHRwOi8vd3d3LmdyYXBodml6Lm9yZy8pKS4KKyMgTm90ZTogSWYgeW91IGNob29zZSBzdmcgeW91IG5lZWQgdG8gc2V0IEhUTUxfRklMRV9FWFRFTlNJT04gdG8geGh0bWwgaW4gb3JkZXIKKyMgdG8gbWFrZSB0aGUgU1ZHIGZpbGVzIHZpc2libGUgaW4gSUUgOSsgKG90aGVyIGJyb3dzZXJzIGRvIG5vdCBoYXZlIHRoaXMKKyMgcmVxdWlyZW1lbnQpLgorIyBQb3NzaWJsZSB2YWx1ZXMgYXJlOiBwbmcsIGpwZywgZ2lmLCBzdmcsIHBuZzpnZCwgcG5nOmdkOmdkLCBwbmc6Y2Fpcm8sCisjIHBuZzpjYWlybzpnZCwgcG5nOmNhaXJvOmNhaXJvLCBwbmc6Y2Fpcm86Z2RpcGx1cywgcG5nOmdkaXBsdXMgYW5kCisjIHBuZzpnZGlwbHVzOmdkaXBsdXMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBwbmcuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitET1RfSU1BR0VfRk9STUFUICAgICAgID0gcG5nCisKKyMgSWYgRE9UX0lNQUdFX0ZPUk1BVCBpcyBzZXQgdG8gc3ZnLCB0aGVuIHRoaXMgb3B0aW9uIGNhbiBiZSBzZXQgdG8gWUVTIHRvCisjIGVuYWJsZSBnZW5lcmF0aW9uIG9mIGludGVyYWN0aXZlIFNWRyBpbWFnZXMgdGhhdCBhbGxvdyB6b29taW5nIGFuZCBwYW5uaW5nLgorIworIyBOb3RlIHRoYXQgdGhpcyByZXF1aXJlcyBhIG1vZGVybiBicm93c2VyIG90aGVyIHRoYW4gSW50ZXJuZXQgRXhwbG9yZXIuIFRlc3RlZAorIyBhbmQgd29ya2luZyBhcmUgRmlyZWZveCwgQ2hyb21lLCBTYWZhcmksIGFuZCBPcGVyYS4KKyMgTm90ZTogRm9yIElFIDkrIHlvdSBuZWVkIHRvIHNldCBIVE1MX0ZJTEVfRVhURU5TSU9OIHRvIHhodG1sIGluIG9yZGVyIHRvIG1ha2UKKyMgdGhlIFNWRyBmaWxlcyB2aXNpYmxlLiBPbGRlciB2ZXJzaW9ucyBvZiBJRSBkbyBub3QgaGF2ZSBTVkcgc3VwcG9ydC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworSU5URVJBQ1RJVkVfU1ZHICAgICAgICA9IE5PCisKKyMgVGhlIERPVF9QQVRIIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBwYXRoIHdoZXJlIHRoZSBkb3QgdG9vbCBjYW4gYmUKKyMgZm91bmQuIElmIGxlZnQgYmxhbmssIGl0IGlzIGFzc3VtZWQgdGhlIGRvdCB0b29sIGNhbiBiZSBmb3VuZCBpbiB0aGUgcGF0aC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK0RPVF9QQVRIICAgICAgICAgICAgICAgPSAKKworIyBUaGUgRE9URklMRV9ESVJTIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGRpcmVjdG9yaWVzIHRoYXQKKyMgY29udGFpbiBkb3QgZmlsZXMgdGhhdCBhcmUgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gKHNlZSB0aGUgXGRvdGZpbGUKKyMgY29tbWFuZCkuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitET1RGSUxFX0RJUlMgICAgICAgICAgID0gCisKKyMgVGhlIE1TQ0ZJTEVfRElSUyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBkaXJlY3RvcmllcyB0aGF0CisjIGNvbnRhaW4gbXNjIGZpbGVzIHRoYXQgYXJlIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uIChzZWUgdGhlIFxtc2NmaWxlCisjIGNvbW1hbmQpLgorCitNU0NGSUxFX0RJUlMgICAgICAgICAgID0gCisKKyMgVGhlIERJQUZJTEVfRElSUyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBkaXJlY3RvcmllcyB0aGF0CisjIGNvbnRhaW4gZGlhIGZpbGVzIHRoYXQgYXJlIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uIChzZWUgdGhlIFxkaWFmaWxlCisjIGNvbW1hbmQpLgorCitESUFGSUxFX0RJUlMgICAgICAgICAgID0gCisKKyMgV2hlbiB1c2luZyBwbGFudHVtbCwgdGhlIFBMQU5UVU1MX0pBUl9QQVRIIHRhZyBzaG91bGQgYmUgdXNlZCB0byBzcGVjaWZ5IHRoZQorIyBwYXRoIHdoZXJlIGphdmEgY2FuIGZpbmQgdGhlIHBsYW50dW1sLmphciBmaWxlLiBJZiBsZWZ0IGJsYW5rLCBpdCBpcyBhc3N1bWVkCisjIFBsYW50VU1MIGlzIG5vdCB1c2VkIG9yIGNhbGxlZCBkdXJpbmcgYSBwcmVwcm9jZXNzaW5nIHN0ZXAuIERveHlnZW4gd2lsbAorIyBnZW5lcmF0ZSBhIHdhcm5pbmcgd2hlbiBpdCBlbmNvdW50ZXJzIGEgXHN0YXJ0dW1sIGNvbW1hbmQgaW4gdGhpcyBjYXNlIGFuZAorIyB3aWxsIG5vdCBnZW5lcmF0ZSBvdXRwdXQgZm9yIHRoZSBkaWFncmFtLgorCitQTEFOVFVNTF9KQVJfUEFUSCAgICAgID0gCisKKyMgV2hlbiB1c2luZyBwbGFudHVtbCwgdGhlIHNwZWNpZmllZCBwYXRocyBhcmUgc2VhcmNoZWQgZm9yIGZpbGVzIHNwZWNpZmllZCBieQorIyB0aGUgIWluY2x1ZGUgc3RhdGVtZW50IGluIGEgcGxhbnR1bWwgYmxvY2suCisKK1BMQU5UVU1MX0lOQ0xVREVfUEFUSCAgPSAKKworIyBUaGUgRE9UX0dSQVBIX01BWF9OT0RFUyB0YWcgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBtYXhpbXVtIG51bWJlciBvZiBub2RlcworIyB0aGF0IHdpbGwgYmUgc2hvd24gaW4gdGhlIGdyYXBoLiBJZiB0aGUgbnVtYmVyIG9mIG5vZGVzIGluIGEgZ3JhcGggYmVjb21lcworIyBsYXJnZXIgdGhhbiB0aGlzIHZhbHVlLCBkb3h5Z2VuIHdpbGwgdHJ1bmNhdGUgdGhlIGdyYXBoLCB3aGljaCBpcyB2aXN1YWxpemVkCisjIGJ5IHJlcHJlc2VudGluZyBhIG5vZGUgYXMgYSByZWQgYm94LiBOb3RlIHRoYXQgZG94eWdlbiBpZiB0aGUgbnVtYmVyIG9mIGRpcmVjdAorIyBjaGlsZHJlbiBvZiB0aGUgcm9vdCBub2RlIGluIGEgZ3JhcGggaXMgYWxyZWFkeSBsYXJnZXIgdGhhbgorIyBET1RfR1JBUEhfTUFYX05PREVTIHRoZW4gdGhlIGdyYXBoIHdpbGwgbm90IGJlIHNob3duIGF0IGFsbC4gQWxzbyBub3RlIHRoYXQKKyMgdGhlIHNpemUgb2YgYSBncmFwaCBjYW4gYmUgZnVydGhlciByZXN0cmljdGVkIGJ5IE1BWF9ET1RfR1JBUEhfREVQVEguCisjIE1pbmltdW0gdmFsdWU6IDAsIG1heGltdW0gdmFsdWU6IDEwMDAwLCBkZWZhdWx0IHZhbHVlOiA1MC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK0RPVF9HUkFQSF9NQVhfTk9ERVMgICAgPSA1MAorCisjIFRoZSBNQVhfRE9UX0dSQVBIX0RFUFRIIHRhZyBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIG1heGltdW0gZGVwdGggb2YgdGhlIGdyYXBocworIyBnZW5lcmF0ZWQgYnkgZG90LiBBIGRlcHRoIHZhbHVlIG9mIDMgbWVhbnMgdGhhdCBvbmx5IG5vZGVzIHJlYWNoYWJsZSBmcm9tIHRoZQorIyByb290IGJ5IGZvbGxvd2luZyBhIHBhdGggdmlhIGF0IG1vc3QgMyBlZGdlcyB3aWxsIGJlIHNob3duLiBOb2RlcyB0aGF0IGxheQorIyBmdXJ0aGVyIGZyb20gdGhlIHJvb3Qgbm9kZSB3aWxsIGJlIG9taXR0ZWQuIE5vdGUgdGhhdCBzZXR0aW5nIHRoaXMgb3B0aW9uIHRvIDEKKyMgb3IgMiBtYXkgZ3JlYXRseSByZWR1Y2UgdGhlIGNvbXB1dGF0aW9uIHRpbWUgbmVlZGVkIGZvciBsYXJnZSBjb2RlIGJhc2VzLiBBbHNvCisjIG5vdGUgdGhhdCB0aGUgc2l6ZSBvZiBhIGdyYXBoIGNhbiBiZSBmdXJ0aGVyIHJlc3RyaWN0ZWQgYnkKKyMgRE9UX0dSQVBIX01BWF9OT0RFUy4gVXNpbmcgYSBkZXB0aCBvZiAwIG1lYW5zIG5vIGRlcHRoIHJlc3RyaWN0aW9uLgorIyBNaW5pbXVtIHZhbHVlOiAwLCBtYXhpbXVtIHZhbHVlOiAxMDAwLCBkZWZhdWx0IHZhbHVlOiAwLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworTUFYX0RPVF9HUkFQSF9ERVBUSCAgICA9IDAKKworIyBTZXQgdGhlIERPVF9UUkFOU1BBUkVOVCB0YWcgdG8gWUVTIHRvIGdlbmVyYXRlIGltYWdlcyB3aXRoIGEgdHJhbnNwYXJlbnQKKyMgYmFja2dyb3VuZC4gVGhpcyBpcyBkaXNhYmxlZCBieSBkZWZhdWx0LCBiZWNhdXNlIGRvdCBvbiBXaW5kb3dzIGRvZXMgbm90IHNlZW0KKyMgdG8gc3VwcG9ydCB0aGlzIG91dCBvZiB0aGUgYm94LgorIworIyBXYXJuaW5nOiBEZXBlbmRpbmcgb24gdGhlIHBsYXRmb3JtIHVzZWQsIGVuYWJsaW5nIHRoaXMgb3B0aW9uIG1heSBsZWFkIHRvCisjIGJhZGx5IGFudGktYWxpYXNlZCBsYWJlbHMgb24gdGhlIGVkZ2VzIG9mIGEgZ3JhcGggKGkuZS4gdGhleSBiZWNvbWUgaGFyZCB0bworIyByZWFkKS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworRE9UX1RSQU5TUEFSRU5UICAgICAgICA9IE5PCisKKyMgU2V0IHRoZSBET1RfTVVMVElfVEFSR0VUUyB0YWcgdG8gWUVTIHRvIGFsbG93IGRvdCB0byBnZW5lcmF0ZSBtdWx0aXBsZSBvdXRwdXQKKyMgZmlsZXMgaW4gb25lIHJ1biAoaS5lLiBtdWx0aXBsZSAtbyBhbmQgLVQgb3B0aW9ucyBvbiB0aGUgY29tbWFuZCBsaW5lKS4gVGhpcworIyBtYWtlcyBkb3QgcnVuIGZhc3RlciwgYnV0IHNpbmNlIG9ubHkgbmV3ZXIgdmVyc2lvbnMgb2YgZG90ICg+MS44LjEwKSBzdXBwb3J0CisjIHRoaXMsIHRoaXMgZmVhdHVyZSBpcyBkaXNhYmxlZCBieSBkZWZhdWx0LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitET1RfTVVMVElfVEFSR0VUUyAgICAgID0gTk8KKworIyBJZiB0aGUgR0VORVJBVEVfTEVHRU5EIHRhZyBpcyBzZXQgdG8gWUVTIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIGxlZ2VuZCBwYWdlCisjIGV4cGxhaW5pbmcgdGhlIG1lYW5pbmcgb2YgdGhlIHZhcmlvdXMgYm94ZXMgYW5kIGFycm93cyBpbiB0aGUgZG90IGdlbmVyYXRlZAorIyBncmFwaHMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitHRU5FUkFURV9MRUdFTkQgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIERPVF9DTEVBTlVQIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgcmVtb3ZlIHRoZSBpbnRlcm1lZGlhdGUgZG90CisjIGZpbGVzIHRoYXQgYXJlIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIHZhcmlvdXMgZ3JhcGhzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworRE9UX0NMRUFOVVAgICAgICAgICAgICA9IFlFUwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2ZhdWx0aW5qZWN0aW9uL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvZmF1bHRpbmplY3Rpb24vQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZGU2MzhmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2ZhdWx0aW5qZWN0aW9uL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwzMiBAQAorY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfY29tcG9uZW50X3dyYXBwZXIiLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJDMkNvbXBvbmVudFdyYXBwZXIuY3BwIiwKKyAgICAgICAgIlNpbXBsZU1ldGhvZFN0YXRlLmNwcCIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJjb2RlYzIiLAorICAgICAgICAibGliY29kZWMyX3ZuZGsiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKKyAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgIF0sCisgICAgICAgIGNmaTogdHJ1ZSwKKyAgICAgICAgZGlhZzogeworICAgICAgICAgICAgY2ZpOiB0cnVlLAorICAgICAgICB9LAorICAgIH0sCisKKyAgICBsZGZsYWdzOiBbIi1XbCwtQnN5bWJvbGljIl0sCit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9mYXVsdGluamVjdGlvbi9DMkNvbXBvbmVudFdyYXBwZXIuY3BwIGIvbWVkaWEvY29kZWMyL2ZhdWx0aW5qZWN0aW9uL0MyQ29tcG9uZW50V3JhcHBlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ1ZjhiZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9mYXVsdGluamVjdGlvbi9DMkNvbXBvbmVudFdyYXBwZXIuY3BwCkBAIC0wLDAgKzEsMTI5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJDb21wb25lbnRXcmFwcGVyIgorCisjaW5jbHVkZSA8Y2hyb25vPgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8dGhyZWFkPgorCisjaW5jbHVkZSA8QzJDb21wb25lbnRXcmFwcGVyLmg+CisjaW5jbHVkZSA8QzJDb25maWcuaD4KKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK25hbWVzcGFjZSB7CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ6OmNocm9ub19saXRlcmFsczsKKworYzJfc3RhdHVzX3QgV3JhcFNpbXBsZU1ldGhvZCgKKyAgICAgICAgc3RkOjpmdW5jdGlvbjxjMl9zdGF0dXNfdCh2b2lkKT4gb3AsIGNvbnN0IFNpbXBsZU1ldGhvZFN0YXRlICZzdGF0ZSkgeworICAgIGMyX3N0YXR1c190IHJlc3VsdCA9IEMyX09LOworICAgIHN3aXRjaCAoc3RhdGUuZ2V0TW9kZSgpKSB7CisgICAgICAgIGNhc2UgU2ltcGxlTWV0aG9kU3RhdGU6OkVYRUNVVEU6CisgICAgICAgICAgICByZXN1bHQgPSBvcCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU2ltcGxlTWV0aG9kU3RhdGU6Ok5PX09QOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU2ltcGxlTWV0aG9kU3RhdGU6OkhBTkc6CisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgICAgIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX2Zvcigxcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgKHZvaWQpc3RhdGUub3ZlcnJpZGVSZXN1bHQoJnJlc3VsdCk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK0MyQ29tcG9uZW50V3JhcHBlcjo6SW5qZWN0ZXI6OkluamVjdGVyKEMyQ29tcG9uZW50V3JhcHBlciAqdGhpeikgOiBtVGhpeih0aGl6KSB7fQorCitTaW1wbGVNZXRob2RTdGF0ZTo6SW5qZWN0ZXIgQzJDb21wb25lbnRXcmFwcGVyOjpJbmplY3Rlcjo6c3RhcnQoKSB7CisgICAgcmV0dXJuIFNpbXBsZU1ldGhvZFN0YXRlOjpJbmplY3RlcigmbVRoaXotPm1TdGFydFN0YXRlKTsKK30KKworQzJDb21wb25lbnRXcmFwcGVyOjpMaXN0ZW5lcjo6TGlzdGVuZXIoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudDo6TGlzdGVuZXI+ICZsaXN0ZW5lcikgOiBtTGlzdGVuZXIobGlzdGVuZXIpIHt9CisKK3ZvaWQgQzJDb21wb25lbnRXcmFwcGVyOjpMaXN0ZW5lcjo6b25Xb3JrRG9uZV9uYihzdGQ6OndlYWtfcHRyPEMyQ29tcG9uZW50PiBjb21wb25lbnQsCisgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gd29ya0l0ZW1zKSB7CisgICAgbUxpc3RlbmVyLT5vbldvcmtEb25lX25iKGNvbXBvbmVudCwgc3RkOjptb3ZlKHdvcmtJdGVtcykpOworfQorCit2b2lkIEMyQ29tcG9uZW50V3JhcHBlcjo6TGlzdGVuZXI6Om9uVHJpcHBlZF9uYihzdGQ6OndlYWtfcHRyPEMyQ29tcG9uZW50PiBjb21wb25lbnQsCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBzZXR0aW5nUmVzdWx0KSB7CisgICAgbUxpc3RlbmVyLT5vblRyaXBwZWRfbmIoY29tcG9uZW50LHNldHRpbmdSZXN1bHQpOworfQorCit2b2lkIEMyQ29tcG9uZW50V3JhcHBlcjo6TGlzdGVuZXI6Om9uRXJyb3JfbmIoCisgICAgICAgIHN0ZDo6d2Vha19wdHI8QzJDb21wb25lbnQ+IGNvbXBvbmVudCwgdWludDMyX3QgZXJyb3JDb2RlKSB7CisgICAgbUxpc3RlbmVyLT5vbkVycm9yX25iKGNvbXBvbmVudCwgZXJyb3JDb2RlKTsKK30KKworQzJDb21wb25lbnRXcmFwcGVyOjpDMkNvbXBvbmVudFdyYXBwZXIoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4gJmNvbXApIDogbUNvbXAoY29tcCkge30KKworYzJfc3RhdHVzX3QgQzJDb21wb25lbnRXcmFwcGVyOjpzZXRMaXN0ZW5lcl92YigKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50OjpMaXN0ZW5lcj4gJmxpc3RlbmVyLCBjMl9ibG9ja2luZ190IG1heUJsb2NrKSB7CisgICAgbUxpc3RlbmVyID0gc3RkOjptYWtlX3NoYXJlZDxMaXN0ZW5lcj4obGlzdGVuZXIpOworICAgIHJldHVybiBtQ29tcC0+c2V0TGlzdGVuZXJfdmIobUxpc3RlbmVyLCBtYXlCbG9jayk7Cit9CisKK2MyX3N0YXR1c190IEMyQ29tcG9uZW50V3JhcHBlcjo6cXVldWVfbmIoc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiogY29uc3QgaXRlbXMpIHsKKyAgICByZXR1cm4gbUNvbXAtPnF1ZXVlX25iKGl0ZW1zKTsKK30KKworYzJfc3RhdHVzX3QgQzJDb21wb25lbnRXcmFwcGVyOjphbm5vdW5jZV9uYihjb25zdCBzdGQ6OnZlY3RvcjxDMldvcmtPdXRsaW5lPiAmaXRlbXMpIHsKKyAgICByZXR1cm4gbUNvbXAtPmFubm91bmNlX25iKGl0ZW1zKTsKK30KKworYzJfc3RhdHVzX3QgQzJDb21wb25lbnRXcmFwcGVyOjpmbHVzaF9zbSgKKyAgICAgICAgQzJDb21wb25lbnQ6OmZsdXNoX21vZGVfdCBtb2RlLCBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+KiBjb25zdCBmbHVzaGVkV29yaykgeworICAgIHJldHVybiBtQ29tcC0+Zmx1c2hfc20obW9kZSwgZmx1c2hlZFdvcmspOworfQorCitjMl9zdGF0dXNfdCBDMkNvbXBvbmVudFdyYXBwZXI6OmRyYWluX25iKEMyQ29tcG9uZW50OjpkcmFpbl9tb2RlX3QgbW9kZSkgeworICAgIHJldHVybiBtQ29tcC0+ZHJhaW5fbmIobW9kZSk7Cit9CisKK2MyX3N0YXR1c190IEMyQ29tcG9uZW50V3JhcHBlcjo6c3RhcnQoKSB7CisgICAgcmV0dXJuIFdyYXBTaW1wbGVNZXRob2QoW3RoaXNdIHsgcmV0dXJuIG1Db21wLT5zdGFydCgpOyB9LCBtU3RhcnRTdGF0ZSk7Cit9CisKK2MyX3N0YXR1c190IEMyQ29tcG9uZW50V3JhcHBlcjo6c3RvcCgpIHsKKyAgICByZXR1cm4gbUNvbXAtPnN0b3AoKTsKK30KKworYzJfc3RhdHVzX3QgQzJDb21wb25lbnRXcmFwcGVyOjpyZXNldCgpIHsKKyAgICByZXR1cm4gbUNvbXAtPnJlc2V0KCk7Cit9CisKK2MyX3N0YXR1c190IEMyQ29tcG9uZW50V3JhcHBlcjo6cmVsZWFzZSgpIHsKKyAgICByZXR1cm4gbUNvbXAtPnJlbGVhc2UoKTsKK30KKworc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiBDMkNvbXBvbmVudFdyYXBwZXI6OmludGYoKXsKKyAgICByZXR1cm4gbUNvbXAtPmludGYoKTsKK30KKworQzJDb21wb25lbnRXcmFwcGVyOjpJbmplY3RlciBDMkNvbXBvbmVudFdyYXBwZXI6OmluamVjdCgpIHsKKyAgICByZXR1cm4gSW5qZWN0ZXIodGhpcyk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvZmF1bHRpbmplY3Rpb24vQzJDb21wb25lbnRXcmFwcGVyLmggYi9tZWRpYS9jb2RlYzIvZmF1bHRpbmplY3Rpb24vQzJDb21wb25lbnRXcmFwcGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzM3MzUwZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9mYXVsdGluamVjdGlvbi9DMkNvbXBvbmVudFdyYXBwZXIuaApAQCAtMCwwICsxLDg5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDMl9DT01QT05FTlRfV1JBUFBFUl9IXworI2RlZmluZSBDMl9DT01QT05FTlRfV1JBUFBFUl9IXworCisjaW5jbHVkZSA8QzJDb21wb25lbnQuaD4KKworI2luY2x1ZGUgIlNpbXBsZU1ldGhvZFN0YXRlLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyoqCisgKiBDcmVhdGVzIGEgV3JhcHBlciBhcm91bmQgdGhlIGNsYXNzIEMyQ29tcG9uZW50IGFuZCBpdHMgbWV0aG9kcy4gVGhlIHdyYXBwZXIgaXMgdXNlZCB0bworICogc2ltdWxhdGUgZXJyb3JzIGluIHRoZSBhbmRyb2lkIG1lZGlhIGNvbXBvbmVudHMgYnkgZmF1bHQgaW5qZWN0aW9uIHRlY2huaXF1ZS4KKyAqIFRoaXMgaXMgZG9uZSB0byBjaGVjayBob3cgdGhlIGZyYW1ld29yayBoYW5kbGVzIHRoZSBlcnJvciBzaXR1YXRpb24uCisgKi8KK2NsYXNzIEMyQ29tcG9uZW50V3JhcHBlcgorICAgICAgICA6IHB1YmxpYyBDMkNvbXBvbmVudCwgcHVibGljIHN0ZDo6ZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXM8QzJDb21wb25lbnRXcmFwcGVyPiB7CitwdWJsaWM6CisgICAgY2xhc3MgSW5qZWN0ZXIgeworICAgIHB1YmxpYzoKKyAgICAgICAgZXhwbGljaXQgSW5qZWN0ZXIoQzJDb21wb25lbnRXcmFwcGVyICp0aGl6KTsKKworICAgICAgICBTaW1wbGVNZXRob2RTdGF0ZTo6SW5qZWN0ZXIgc3RhcnQoKTsKKyAgICBwcml2YXRlOgorICAgICAgICBDMkNvbXBvbmVudFdyYXBwZXIgKmNvbnN0IG1UaGl6OworICAgIH07CisKKyAgICAvKioKKyAgICAgKiBBIHdyYXBwZXIgYXJvdW5kIHRoZSBsaXN0ZW5lciBjbGFzcyBpbnNpZGUgQzJDb21wb25lbnQgY2xhc3MuCisgICAgICovCisgICAgY2xhc3MgTGlzdGVuZXIgOiBwdWJsaWMgQzJDb21wb25lbnQ6Okxpc3RlbmVyIHsKKyAgICBwdWJsaWM6CisgICAgICAgIGV4cGxpY2l0IExpc3RlbmVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudDo6TGlzdGVuZXI+ICZsaXN0ZW5lcik7CisgICAgICAgIHZpcnR1YWwgfkxpc3RlbmVyKCkgPSBkZWZhdWx0OworCisgICAgICAgIHZvaWQgb25Xb3JrRG9uZV9uYihzdGQ6OndlYWtfcHRyPEMyQ29tcG9uZW50PiBjb21wb25lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IHdvcmtJdGVtcykgb3ZlcnJpZGU7CisgICAgICAgIHZvaWQgb25UcmlwcGVkX25iKHN0ZDo6d2Vha19wdHI8QzJDb21wb25lbnQ+IGNvbXBvbmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IHNldHRpbmdSZXN1bHQpIG92ZXJyaWRlOworICAgICAgICB2b2lkIG9uRXJyb3JfbmIoc3RkOjp3ZWFrX3B0cjxDMkNvbXBvbmVudD4gY29tcG9uZW50LCB1aW50MzJfdCBlcnJvckNvZGUpIG92ZXJyaWRlOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50OjpMaXN0ZW5lcj4gbUxpc3RlbmVyOworICAgIH07CisKKyAgICBleHBsaWNpdCBDMkNvbXBvbmVudFdyYXBwZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiAmY29tcCk7CisgICAgdmlydHVhbCB+QzJDb21wb25lbnRXcmFwcGVyKCkgPSBkZWZhdWx0OworCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBzZXRMaXN0ZW5lcl92YigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudDo6TGlzdGVuZXI+ICZsaXN0ZW5lciwKKyAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2spIG92ZXJyaWRlOworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcXVldWVfbmIoc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiogY29uc3QgaXRlbXMpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgYW5ub3VuY2VfbmIoY29uc3Qgc3RkOjp2ZWN0b3I8QzJXb3JrT3V0bGluZT4gJml0ZW1zKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGZsdXNoX3NtKAorICAgICAgICAgICAgZmx1c2hfbW9kZV90IG1vZGUsIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4qIGNvbnN0IGZsdXNoZWRXb3JrKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGRyYWluX25iKGRyYWluX21vZGVfdCBtb2RlKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHN0YXJ0KCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBzdG9wKCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCByZXNldCgpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcmVsZWFzZSgpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiBpbnRmKCkgb3ZlcnJpZGU7CisKKyAgICBJbmplY3RlciBpbmplY3QoKTsKKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8TGlzdGVuZXI+IG1MaXN0ZW5lcjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+IG1Db21wOworCisgICAgU2ltcGxlTWV0aG9kU3RhdGUgbVN0YXJ0U3RhdGU7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQzJfQ09NUE9ORU5UX1dSQVBQRVJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9mYXVsdGluamVjdGlvbi9TaW1wbGVNZXRob2RTdGF0ZS5jcHAgYi9tZWRpYS9jb2RlYzIvZmF1bHRpbmplY3Rpb24vU2ltcGxlTWV0aG9kU3RhdGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3OWQ2NGUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvZmF1bHRpbmplY3Rpb24vU2ltcGxlTWV0aG9kU3RhdGUuY3BwCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJTaW1wbGVNZXRob2RTdGF0ZSIKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlICJTaW1wbGVNZXRob2RTdGF0ZS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK1NpbXBsZU1ldGhvZFN0YXRlOjpJbmplY3Rlcjo6SW5qZWN0ZXIoU2ltcGxlTWV0aG9kU3RhdGUgKnRoaXopIDogbVRoaXoodGhpeikge30KKwordm9pZCBTaW1wbGVNZXRob2RTdGF0ZTo6SW5qZWN0ZXI6OmhhbmcoKSB7CisgICAgbVRoaXotPm1Nb2RlID0gSEFORzsKK30KKwordm9pZCBTaW1wbGVNZXRob2RTdGF0ZTo6SW5qZWN0ZXI6OmZhaWwoYzJfc3RhdHVzX3QgZXJyLCBib29sIGV4ZWN1dGUpIHsKKyAgICBtVGhpei0+bU1vZGUgPSBleGVjdXRlID8gRVhFQ1VURSA6IE5PX09QOworICAgIG1UaGl6LT5tT3ZlcnJpZGUgPSB0cnVlOworICAgIG1UaGl6LT5tUmVzdWx0T3ZlcnJpZGUgPSBlcnI7Cit9CisKK1NpbXBsZU1ldGhvZFN0YXRlOjpTaW1wbGVNZXRob2RTdGF0ZSgpCisgICAgOiBtTW9kZShFWEVDVVRFKSwgbU92ZXJyaWRlKGZhbHNlKSwgbVJlc3VsdE92ZXJyaWRlKEMyX09LKSB7fQorCitTaW1wbGVNZXRob2RTdGF0ZTo6TW9kZSBTaW1wbGVNZXRob2RTdGF0ZTo6Z2V0TW9kZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbU1vZGU7Cit9CisKK2Jvb2wgU2ltcGxlTWV0aG9kU3RhdGU6Om92ZXJyaWRlUmVzdWx0KGMyX3N0YXR1c190ICpyZXN1bHQpIGNvbnN0IHsKKyAgICBpZiAoIW1PdmVycmlkZSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgICpyZXN1bHQgPSBtUmVzdWx0T3ZlcnJpZGU7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvZmF1bHRpbmplY3Rpb24vU2ltcGxlTWV0aG9kU3RhdGUuaCBiL21lZGlhL2NvZGVjMi9mYXVsdGluamVjdGlvbi9TaW1wbGVNZXRob2RTdGF0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjMDQ1OWQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvZmF1bHRpbmplY3Rpb24vU2ltcGxlTWV0aG9kU3RhdGUuaApAQCAtMCwwICsxLDgyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBTSU1QTEVfTUVUSE9EX1NUQVRFX0hfCisjZGVmaW5lIFNJTVBMRV9NRVRIT0RfU1RBVEVfSF8KKworI2luY2x1ZGUgPEMyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyoqCisgKiBTdGF0ZSBmb3IgYSBzaW1wbGUgbWV0aG9kIHdoaWNoIHJldHVybnMgYzJfc3RhdHVzX3QgYW5kIHRha2VzIG5vIHBhcmFtZXRlcnMuCisgKi8KK2NsYXNzIFNpbXBsZU1ldGhvZFN0YXRlIHsKK3B1YmxpYzoKKyAgICBlbnVtIE1vZGUgeworICAgICAgICAvLyBFeGVjdXRlIHRoZSBub3JtYWwgb3BlcmF0aW9uCisgICAgICAgIEVYRUNVVEUsCisgICAgICAgIC8vIERvbid0IGRvIGFueXRoaW5nCisgICAgICAgIE5PX09QLAorICAgICAgICAvLyBIYW5nOyBuZXZlciByZXR1cm4KKyAgICAgICAgSEFORywKKyAgICB9OworCisgICAgLyoqCisgICAgICogSW5qZWN0ZXIgY2xhc3MgdGhhdCBtb2RpZmllcyB0aGUgaW50ZXJuYWwgc3RhdGVzIG9mIHRoaXMgY2xhc3MuCisgICAgICovCisgICAgY2xhc3MgSW5qZWN0ZXIgeworICAgIHB1YmxpYzoKKyAgICAgICAgZXhwbGljaXQgSW5qZWN0ZXIoU2ltcGxlTWV0aG9kU3RhdGUgKnRoaXopOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBIYW5nIHRoZSBvcGVyYXRpb24uCisgICAgICAgICAqLworICAgICAgICB2b2lkIGhhbmcoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogRmFpbCB0aGUgb3BlcmF0aW9uIHdpdGggZ2l2ZW4gcGFyYW1zLgorICAgICAgICAgKgorICAgICAgICAgKiBccGFyYW0gZXJyICAgICAgIGVycm9yIGNvZGUgdG8gcmVwbGFjZSB0aGUgYWN0dWFsIHJldHVybiB2YWx1ZQorICAgICAgICAgKiBccGFyYW0gZXhlY3V0ZSAgIHdoZXRoZXIgdGhlIHdyYXBwZXIgc2hvdWxkIGV4ZWN1dGUgdGhlIG9wZXJhdGlvbgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBmYWlsKGMyX3N0YXR1c190IGVyciwgYm9vbCBleGVjdXRlID0gZmFsc2UpOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgU2ltcGxlTWV0aG9kU3RhdGUgKmNvbnN0IG1UaGl6OworICAgIH07CisKKyAgICBTaW1wbGVNZXRob2RTdGF0ZSgpOworCisgICAgLyoqCisgICAgICogR2V0IGV4ZWN1dGlvbiBtb2RlLgorICAgICAqLworICAgIE1vZGUgZ2V0TW9kZSgpIGNvbnN0OworCisgICAgLyoqCisgICAgICogT3ZlcnJpZGUgcmVzdWx0IGZyb20gcnVubmluZyB0aGUgb3BlcmF0aW9uIGlmIGNvbmZpZ3VyZWQgc28uCisgICAgICovCisgICAgYm9vbCBvdmVycmlkZVJlc3VsdChjMl9zdGF0dXNfdCAqcmVzdWx0KSBjb25zdDsKKworcHJpdmF0ZToKKyAgICBNb2RlIG1Nb2RlOworICAgIGJvb2wgbU92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG1SZXN1bHRPdmVycmlkZTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBTSU1QTEVfTUVUSE9EX1NUQVRFX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1NWRlNTAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvQW5kcm9pZC5icApAQCAtMCwwICsxLDY3IEBACisvLyBETyBOT1QgREVQRU5EIE9OIFRISVMgRElSRUNUTFkKKy8vIHVzZSBsaWJjb2RlYzItaGlkbC1kZWZhdWx0cyBpbnN0ZWFkCitjY19saWJyYXJ5IHsKKyAgICBuYW1lOiAibGliY29kZWMyX2hpZGxAMS4wIiwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorCisgICAgZGVmYXVsdHM6IFsiaGlkbF9kZWZhdWx0cyJdLAorCisgICAgc3JjczogWworICAgICAgICAiQ29tcG9uZW50LmNwcCIsCisgICAgICAgICJDb21wb25lbnRTdG9yZS5jcHAiLAorICAgICAgICAiQ29uZmlndXJhYmxlLmNwcCIsCisgICAgICAgICJJbnB1dFN1cmZhY2UuY3BwIiwKKyAgICAgICAgIklucHV0U3VyZmFjZUNvbm5lY3Rpb24uY3BwIiwKKyAgICAgICAgInR5cGVzLmNwcCIsCisgICAgXSwKKworICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJzeXN0ZW1faGVhZGVycyIsCisgICAgICAgICJsaWJjb2RlYzJfaW50ZXJuYWwiLCAvLyBwcml2YXRlCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmdyYXBoaWNzLmJ1ZmZlcnF1ZXVlQDEuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmdyYXBoaWNzLmNvbW1vbkAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYUAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5idWZmZXJwb29sQDEuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmMyQDEuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLm9teEAxLjAiLAorICAgICAgICAibGliYmFzZSIsCisgICAgICAgICJsaWJjb2RlYzIiLAorICAgICAgICAibGliY29kZWMyX3ZuZGsiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmhpZGxiYXNlIiwKKyAgICAgICAgImxpYmhpZGx0cmFuc3BvcnQiLAorICAgICAgICAibGliaHdiaW5kZXIiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2J1ZmZlcnBvb2xAMS4wIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2J1ZmZlcnF1ZXVlX2hlbHBlciIsCisgICAgICAgICJsaWJ1aSIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKKworICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImluY2x1ZGUiLAorICAgIF0sCisKKyAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmMyQDEuMCIsCisgICAgICAgICJsaWJjb2RlYzIiLAorICAgICAgICAibGliaGlkbGJhc2UiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfYnVmZmVycG9vbEAxLjAiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfYnVmZmVycXVldWVfaGVscGVyIiwKKyAgICAgICAgImxpYnVpIiwKKyAgICBdLAorfQorCisvLyBwdWJsaWMgZGVwZW5kZW5jeSBmb3IgQ29kZWMgMi4wIEhBTCBzZXJ2aWNlIGltcGxlbWVudGF0aW9ucworY2NfZGVmYXVsdHMgeworICAgIG5hbWU6ICJsaWJjb2RlYzItaGlkbC1kZWZhdWx0cyIsCisgICAgZGVmYXVsdHM6IFsibGliY29kZWMyLWltcGwtZGVmYXVsdHMiXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmMyQDEuMCIsCisgICAgICAgICJsaWJjb2RlYzJfaGlkbEAxLjAiLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvQ29tcG9uZW50LmNwcCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9Db21wb25lbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhNGM2YjIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvQ29tcG9uZW50LmNwcApAQCAtMCwwICsxLDEwNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNvZGVjMi1Db21wb25lbnQiCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKworI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+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+JiBjb21wb25lbnQsCisgICAgICAgIGNvbnN0IHNwPElDb21wb25lbnRMaXN0ZW5lcj4mIGxpc3RlbmVyLAorICAgICAgICBjb25zdCBzcDxDb21wb25lbnRTdG9yZT4mIHN0b3JlLAorICAgICAgICBjb25zdCBzcDw6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjFfMDo6CisgICAgICAgIElDbGllbnRNYW5hZ2VyPiYgY2xpZW50UG9vbE1hbmFnZXIpIDoKKyAgICBDb25maWd1cmFibGUobmV3IENhY2hlZENvbmZpZ3VyYWJsZSgKKyAgICAgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8Q29tcEludGY+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+KCp0aW1lVG9SZXRyeU5zKSk7CisgICAgfQorICAgIHJldHVybiByZXRyeTsKK30KKwordm9pZCBJbnB1dEJ1ZmZlck1hbmFnZXI6Om1haW4oKSB7CisgICAgQUxPR1YoIklucHV0QnVmZmVyTWFuYWdlcjogU3RhcnRpbmcgbWFpbiB0aHJlYWQiKTsKKyAgICBuc2Vjc190IHRpbWVUb1JldHJ5TnM7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisgICAgICAgIHdoaWxlIChtRGVhdGhOb3RpZmljYXRpb25zLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIEFMT0dWKCJJbnB1dEJ1ZmZlck1hbmFnZXI6IFdhaXRpbmcgZm9yIGJ1ZmZlciBkZWF0aHMiKTsKKyAgICAgICAgICAgIG1PbkJ1ZmZlckRlc3Ryb3llZC53YWl0KGxvY2spOworICAgICAgICB9CisgICAgICAgIGxvY2sudW5sb2NrKCk7CisgICAgICAgIEFMT0dWKCJJbnB1dEJ1ZmZlck1hbmFnZXI6IFNlbmRpbmcgYnVmZmVyIGRlYXRoIG5vdGlmaWNhdGlvbnMiKTsKKyAgICAgICAgd2hpbGUgKHByb2Nlc3NOb3RpZmljYXRpb25zKCZ0aW1lVG9SZXRyeU5zKSkgeworICAgICAgICAgICAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfZm9yKAorICAgICAgICAgICAgICAgICAgICBzdGQ6OmNocm9ubzo6bmFub3NlY29uZHModGltZVRvUmV0cnlOcykpOworICAgICAgICAgICAgQUxPR1YoIklucHV0QnVmZmVyTWFuYWdlcjogU2VuZGluZyBwZW5kaW5nIGRlYXRoIG5vdGlmaWNhdGlvbnMiKTsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigiSW5wdXRCdWZmZXJNYW5hZ2VyOiBObyBwZW5kaW5nIGRlYXRoIG5vdGlmaWNhdGlvbnMiKTsKKyAgICB9Cit9CisKK0lucHV0QnVmZmVyTWFuYWdlcjo6SW5wdXRCdWZmZXJNYW5hZ2VyKCkKKyAgICAgIDogbU1haW5UaHJlYWQoJklucHV0QnVmZmVyTWFuYWdlcjo6bWFpbiwgdGhpcykgeworfQorCitJbnB1dEJ1ZmZlck1hbmFnZXImIElucHV0QnVmZmVyTWFuYWdlcjo6Z2V0SW5zdGFuY2UoKSB7CisgICAgc3RhdGljIElucHV0QnVmZmVyTWFuYWdlciBpbnN0YW5jZXt9OworICAgIHJldHVybiBpbnN0YW5jZTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHV0aWxzCit9ICAvLyBuYW1lc3BhY2UgVjFfMAorfSAgLy8gbmFtZXNwYWNlIGMyCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL0NvbXBvbmVudFN0b3JlLmNwcCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9Db21wb25lbnRTdG9yZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQxYmJlMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9Db21wb25lbnRTdG9yZS5jcHAKQEAgLTAsMCArMSw0MzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNvZGVjMi1Db21wb25lbnRTdG9yZSIKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvQ29tcG9uZW50U3RvcmUuaD4KKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvSW5wdXRTdXJmYWNlLmg+CisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvMS4wL0NvbXBvbmVudC5oPgorI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMC9Db25maWd1cmFibGVDMkludGYuaD4KKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvdHlwZXMuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2JxaGVscGVyL1dHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9icWhlbHBlci9HcmFwaGljQnVmZmVyU291cmNlLmg+CisKKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPHV0aWwvQzJJbnRlcmZhY2VIZWxwZXIuaD4KKworI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2ZpbGUuaD4KKworI2lmZGVmIExPRworI3VuZGVmIExPRworI2VuZGlmCisKKyNpZmRlZiBQTE9HCisjdW5kZWYgUExPRworI2VuZGlmCisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorCisjaW5jbHVkZSA8b3N0cmVhbT4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPGlvbWFuaXA+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGMyIHsKK25hbWVzcGFjZSBWMV8wIHsKK25hbWVzcGFjZSB1dGlscyB7CisKK3VzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ7Cit1c2luZyA6OmFuZHJvaWQ6OkdyYXBoaWNCdWZmZXJTb3VyY2U7Cit1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYxXzA6OmltcGxlbWVudGF0aW9uOworCituYW1lc3BhY2UgLyogdW5uYW1lZCAqLyB7CisKK3N0cnVjdCBTdG9yZUludGYgOiBwdWJsaWMgQ29uZmlndXJhYmxlQzJJbnRmIHsKKyAgICBTdG9yZUludGYoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50U3RvcmU+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+aW5pdCgpOworfQorCitSZXR1cm48U3RhdHVzPiBJbnB1dFN1cmZhY2VDb25uZWN0aW9uOjpkaXNjb25uZWN0KCkgeworICAgIEFMT0dWKCJkaXNjb25uZWN0Iik7CisgICAgbU11dGV4LmxvY2soKTsKKyAgICBpZiAobVNvdXJjZSkgeworICAgICAgICAodm9pZCltU291cmNlLT5zdG9wKCk7CisgICAgICAgICh2b2lkKW1Tb3VyY2UtPnJlbGVhc2UoKTsKKyAgICAgICAgbVNvdXJjZS5jbGVhcigpOworICAgIH0KKyAgICBtSW1wbC5jbGVhcigpOworICAgIG1NdXRleC51bmxvY2soKTsKKyAgICBBTE9HVigiZGlzY29ubmVjdGVkIik7CisgICAgcmV0dXJuIFN0YXR1czo6T0s7Cit9CisKK30gIC8vIG5hbWVzcGFjZSB1dGlscworfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBjMgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMC9Db21wb25lbnQuaCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMC9Db21wb25lbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmRlYzFjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL2luY2x1ZGUvY29kZWMyL2hpZGwvMS4wL0NvbXBvbmVudC5oCkBAIC0wLDAgKzEsMTc0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDT0RFQzJfSElETF9WMV8wX1VUSUxTX0NPTVBPTkVOVF9ICisjZGVmaW5lIENPREVDMl9ISURMX1YxXzBfVVRJTFNfQ09NUE9ORU5UX0gKKworI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMC9Db25maWd1cmFibGUuaD4KKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvdHlwZXMuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYnVmZmVycG9vbC8xLjAvSUNsaWVudE1hbmFnZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2MyLzEuMC9JQ29tcG9uZW50TGlzdGVuZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2MyLzEuMC9JQ29tcG9uZW50U3RvcmUuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2MyLzEuMC9JQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8aGlkbC9TdGF0dXMuaD4KKyNpbmNsdWRlIDxod2JpbmRlci9JQmluZGVyLmg+CisKKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorI2luY2x1ZGUgPEMyQnVmZmVyLmg+CisjaW5jbHVkZSA8QzIuaD4KKworI2luY2x1ZGUgPGxpc3Q+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYzIgeworbmFtZXNwYWNlIFYxXzAgeworbmFtZXNwYWNlIHV0aWxzIHsKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9hcnJheTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfbWVtb3J5OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpJQmluZGVyOwordXNpbmcgOjphbmRyb2lkOjpzcDsKK3VzaW5nIDo6YW5kcm9pZDo6d3A7CisKK3N0cnVjdCBDb21wb25lbnRTdG9yZTsKKworc3RydWN0IENvbXBvbmVudEludGVyZmFjZSA6IHB1YmxpYyBDb25maWd1cmFibGU8SUNvbXBvbmVudEludGVyZmFjZT4geworICAgIENvbXBvbmVudEludGVyZmFjZSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4mIGludGVyZmFjZSwKKyAgICAgICAgICAgIGNvbnN0IHNwPENvbXBvbmVudFN0b3JlPiYgc3RvcmUpOworICAgIGMyX3N0YXR1c190IHN0YXR1cygpIGNvbnN0OworCitwcm90ZWN0ZWQ6CisgICAgYzJfc3RhdHVzX3QgbUluaXQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiBtSW50ZXJmYWNlOworICAgIHNwPENvbXBvbmVudFN0b3JlPiBtU3RvcmU7Cit9OworCitzdHJ1Y3QgQ29tcG9uZW50IDogcHVibGljIENvbmZpZ3VyYWJsZTxJQ29tcG9uZW50PiB7CisgICAgQ29tcG9uZW50KAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiYsCisgICAgICAgICAgICBjb25zdCBzcDxJQ29tcG9uZW50TGlzdGVuZXI+JiBsaXN0ZW5lciwKKyAgICAgICAgICAgIGNvbnN0IHNwPENvbXBvbmVudFN0b3JlPiYgc3RvcmUsCisgICAgICAgICAgICBjb25zdCBzcDw6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjFfMDo6CisgICAgICAgICAgICAgICAgSUNsaWVudE1hbmFnZXI+JiBjbGllbnRQb29sTWFuYWdlcik7CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzKCkgY29uc3Q7CisKKyAgICB0eXBlZGVmIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpidWZmZXJxdWV1ZTo6VjFfMDo6CisgICAgICAgICAgICBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI7CisKKyAgICAvLyBNZXRob2RzIGZyb20gSUNvbXBvbmVudCBmb2xsb3cuCisgICAgdmlydHVhbCBSZXR1cm48U3RhdHVzPiBxdWV1ZShjb25zdCBXb3JrQnVuZGxlJiB3b3JrQnVuZGxlKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBmbHVzaChmbHVzaF9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBSZXR1cm48U3RhdHVzPiBkcmFpbihib29sIHdpdGhFb3MpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgUmV0dXJuPFN0YXR1cz4gc2V0T3V0cHV0U3VyZmFjZSgKKyAgICAgICAgICAgIHVpbnQ2NF90IGJsb2NrUG9vbElkLAorICAgICAgICAgICAgY29uc3Qgc3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIHN1cmZhY2UpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgUmV0dXJuPFN0YXR1cz4gY29ubmVjdFRvT214SW5wdXRTdXJmYWNlKAorICAgICAgICAgICAgY29uc3Qgc3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIHByb2R1Y2VyLAorICAgICAgICAgICAgY29uc3Qgc3A8OjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6Om9teDo6VjFfMDo6CisgICAgICAgICAgICBJR3JhcGhpY0J1ZmZlclNvdXJjZT4mIHNvdXJjZSkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBSZXR1cm48U3RhdHVzPiBkaXNjb25uZWN0RnJvbUlucHV0U3VyZmFjZSgpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IGNyZWF0ZUJsb2NrUG9vbCgKKyAgICAgICAgICAgIHVpbnQzMl90IGFsbG9jYXRvcklkLAorICAgICAgICAgICAgY3JlYXRlQmxvY2tQb29sX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIFJldHVybjxTdGF0dXM+IGRlc3Ryb3lCbG9ja1Bvb2wodWludDY0X3QgYmxvY2tQb29sSWQpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgUmV0dXJuPFN0YXR1cz4gc3RhcnQoKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIFJldHVybjxTdGF0dXM+IHN0b3AoKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIFJldHVybjxTdGF0dXM+IHJlc2V0KCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBSZXR1cm48U3RhdHVzPiByZWxlYXNlKCkgb3ZlcnJpZGU7CisKK3Byb3RlY3RlZDoKKyAgICBjMl9zdGF0dXNfdCBtSW5pdDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+IG1Db21wb25lbnQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiBtSW50ZXJmYWNlOworICAgIHNwPElDb21wb25lbnRMaXN0ZW5lcj4gbUxpc3RlbmVyOworICAgIHNwPENvbXBvbmVudFN0b3JlPiBtU3RvcmU7CisgICAgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOjpWMV8wOjp1dGlsczo6RGVmYXVsdEJ1ZmZlclBvb2xTZW5kZXIKKyAgICAgICAgICAgIG1CdWZmZXJQb29sU2VuZGVyOworCisgICAgc3RkOjptdXRleCBtQmxvY2tQb29sc011dGV4OworICAgIC8vIFRoaXMgbWFwIGtlZXBzIEMyQmxvY2tQb29sIG9iamVjdHMgdGhhdCBhcmUgY3JlYXRlZCBieSBjcmVhdGVCbG9ja1Bvb2woKQorICAgIC8vIGFsaXZlLiBUaGVzZSBDMkJsb2NrUG9vbCBvYmplY3RzIGNhbiBiZSBkZWxldGVkIGJ5IGNhbGxpbmcKKyAgICAvLyBkZXN0cm95QmxvY2tQb29sKCksIHJlc2V0KCkgb3IgcmVsZWFzZSgpLCBvciBieSBkZXN0cm95aW5nIHRoZSBjb21wb25lbnQuCisgICAgc3RkOjptYXA8dWludDY0X3QsIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4+IG1CbG9ja1Bvb2xzOworCisgICAgLy8gVGhpcyBzdHJ1Y3QgaXMgYSBjb21wYXJhYmxlIHdyYXBwZXIgZm9yIElDb21wb25lbnQuCisgICAgLy8KKyAgICAvLyBBbiBJQ29tcG9uZW50IG9iamVjdCBpcyBlaXRoZXIgbG9jYWwgb3IgcmVtb3RlLiBJZiBpdCBpcyBsb2NhbCwgd2UgY2FuCisgICAgLy8gdXNlIHRoZSB1bmRlcmx5aW5nIHBvaW50ZXIgYXMgYSBrZXkuIElmIGl0IGlzIHJlbW90ZSwgd2UgaGF2ZSB0byB1c2UgdGhlCisgICAgLy8gdW5kZXJseWluZyBwb2ludGVyIG9mIHRoZSBhc3NvY2lhdGVkIGJpbmRlciBvYmplY3QgYXMgYSBrZXkuCisgICAgLy8KKyAgICAvLyBTZWUgaW50ZXJmYWNlc0VxdWFsKCkgZm9yIG1vcmUgZGV0YWlsLgorICAgIHN0cnVjdCBJbnRlcmZhY2VLZXkgeworICAgICAgICAvLyBBbiBJbnRlcmZhY2VLZXkgaXMgY29uc3RydWN0ZWQgZnJvbSBJQ29tcG9uZW50LgorICAgICAgICBJbnRlcmZhY2VLZXkoY29uc3Qgc3A8SUNvbXBvbmVudD4mIGNvbXBvbmVudCk7CisgICAgICAgIC8vIG9wZXJhdG9yPCBpcyBkZWZpbmVkIGhlcmUgdG8gY29udHJvbCB0aGUgZGVmYXVsdCBkZWZpbml0aW9uIG9mCisgICAgICAgIC8vIHN0ZDo6bGVzczxJbnRlcmZhY2VLZXk+LCB3aGljaCB3aWxsIGJlIHVzZWQgaW4gdHlwZSBSb3N0ZXIgZGVmaW5lZAorICAgICAgICAvLyBiZWxvdy4KKyAgICAgICAgYm9vbCBvcGVyYXRvcjwoY29uc3QgSW50ZXJmYWNlS2V5JiBvdGhlcikgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIGlzUmVtb3RlID8KKyAgICAgICAgICAgICAgICAgICAgKG90aGVyLmlzUmVtb3RlID8KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbW90ZSAmIHJlbW90ZQorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpsZXNzPElCaW5kZXIqPigpKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW90ZS51bnNhZmVfZ2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXIucmVtb3RlLnVuc2FmZV9nZXQoKSkgOgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3RlICYgbG9jYWwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKSA6CisgICAgICAgICAgICAgICAgICAgIChvdGhlci5pc1JlbW90ZSA/CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBsb2NhbCAmIHJlbW90ZQorICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSA6CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBsb2NhbCAmIGxvY2FsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Omxlc3M8SUNvbXBvbmVudCo+KCkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWwudW5zYWZlX2dldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyLmxvY2FsLnVuc2FmZV9nZXQoKSkpOworICAgICAgICB9CisgICAgcHJpdmF0ZToKKyAgICAgICAgYm9vbCBpc1JlbW90ZTsKKyAgICAgICAgd3A8SUJpbmRlcj4gcmVtb3RlOworICAgICAgICB3cDxJQ29tcG9uZW50PiBsb2NhbDsKKyAgICB9OworCisgICAgdHlwZWRlZiBzdGQ6Om1hcDxJbnRlcmZhY2VLZXksIHN0ZDo6d2Vha19wdHI8QzJDb21wb25lbnQ+PiBSb3N0ZXI7CisgICAgdHlwZWRlZiBSb3N0ZXI6OmNvbnN0X2l0ZXJhdG9yIExvY2FsSWQ7CisgICAgTG9jYWxJZCBtTG9jYWxJZDsKKyAgICB2b2lkIHNldExvY2FsSWQoY29uc3QgTG9jYWxJZCYgbG9jYWxJZCk7CisKKyAgICB2b2lkIGluaXRMaXN0ZW5lcihjb25zdCBzcDxDb21wb25lbnQ+JiBzZWxmKTsKKworICAgIHZpcnR1YWwgfkNvbXBvbmVudCgpIG92ZXJyaWRlOworCisgICAgZnJpZW5kIHN0cnVjdCBDb21wb25lbnRTdG9yZTsKKworICAgIHN0cnVjdCBMaXN0ZW5lcjsKK307CisKK30gIC8vIG5hbWVzcGFjZSB1dGlscworfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBjMgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQ09ERUMyX0hJRExfVjFfMF9VVElMU19DT01QT05FTlRfSApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL2luY2x1ZGUvY29kZWMyL2hpZGwvMS4wL0NvbXBvbmVudFN0b3JlLmggYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvaW5jbHVkZS9jb2RlYzIvaGlkbC8xLjAvQ29tcG9uZW50U3RvcmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODIxZThhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL2luY2x1ZGUvY29kZWMyL2hpZGwvMS4wL0NvbXBvbmVudFN0b3JlLmgKQEAgLTAsMCArMSwxMjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIENPREVDMl9ISURMX1YxXzBfVVRJTFNfQ09NUE9ORU5UU1RPUkVfSAorI2RlZmluZSBDT0RFQzJfSElETF9WMV8wX1VUSUxTX0NPTVBPTkVOVFNUT1JFX0gKKworI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMC9Db21wb25lbnQuaD4KKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvQ29uZmlndXJhYmxlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9jMi8xLjAvSUNvbXBvbmVudFN0b3JlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9idWZmZXJwb29sLzEuMC9JQ2xpZW50TWFuYWdlci5oPgorI2luY2x1ZGUgPGhpZGwvU3RhdHVzLmg+CisKKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorI2luY2x1ZGUgPEMyUGFyYW0uaD4KKyNpbmNsdWRlIDxDMi5oPgorCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxtdXRleD4KKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBjMiB7CituYW1lc3BhY2UgVjFfMCB7CituYW1lc3BhY2UgdXRpbHMgeworCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjFfMDo6SUNsaWVudE1hbmFnZXI7CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfYXJyYXk7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2hhbmRsZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfbWVtb3J5OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7Cit1c2luZyA6OmFuZHJvaWQ6OnNwOwordXNpbmcgOjphbmRyb2lkOjp3cDsKKworc3RydWN0IENvbXBvbmVudFN0b3JlIDogcHVibGljIENvbmZpZ3VyYWJsZTxJQ29tcG9uZW50U3RvcmU+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+CisKKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPG11dGV4PgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBjMiB7CituYW1lc3BhY2UgVjFfMCB7CituYW1lc3BhY2UgdXRpbHMgeworCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpWb2lkOwordXNpbmcgOjphbmRyb2lkOjpzcDsKK3VzaW5nIDo6YW5kcm9pZDo6R3JhcGhpY0J1ZmZlclNvdXJjZTsKKworc3RydWN0IElucHV0U3VyZmFjZUNvbm5lY3Rpb24gOiBwdWJsaWMgSUlucHV0U3VyZmFjZUNvbm5lY3Rpb24geworCisgICAgdmlydHVhbCBSZXR1cm48U3RhdHVzPiBkaXNjb25uZWN0KCkgb3ZlcnJpZGU7CisKK3Byb3RlY3RlZDoKKworICAgIElucHV0U3VyZmFjZUNvbm5lY3Rpb24oCisgICAgICAgICAgICBjb25zdCBzcDxHcmFwaGljQnVmZmVyU291cmNlPiYgc291cmNlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiYgY29tcG9uZW50KTsKKworICAgIElucHV0U3VyZmFjZUNvbm5lY3Rpb24oCisgICAgICAgICAgICBjb25zdCBzcDxHcmFwaGljQnVmZmVyU291cmNlPiYgc291cmNlLAorICAgICAgICAgICAgY29uc3Qgc3A8SUNvbXBvbmVudD4mIGNvbXBvbmVudCk7CisKKyAgICBib29sIGluaXQoKTsKKworICAgIGZyaWVuZCBzdHJ1Y3QgSW5wdXRTdXJmYWNlOworCisgICAgSW5wdXRTdXJmYWNlQ29ubmVjdGlvbigpID0gZGVsZXRlOworICAgIElucHV0U3VyZmFjZUNvbm5lY3Rpb24oY29uc3QgSW5wdXRTdXJmYWNlQ29ubmVjdGlvbiYpID0gZGVsZXRlOworICAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IElucHV0U3VyZmFjZUNvbm5lY3Rpb24mKSA9IGRlbGV0ZTsKKworICAgIHN0cnVjdCBJbXBsOworCisgICAgc3RkOjptdXRleCBtTXV0ZXg7CisgICAgc3A8R3JhcGhpY0J1ZmZlclNvdXJjZT4gbVNvdXJjZTsKKyAgICBzcDxJbXBsPiBtSW1wbDsKKworICAgIHZpcnR1YWwgfklucHV0U3VyZmFjZUNvbm5lY3Rpb24oKSBvdmVycmlkZTsKK307CisKK30gIC8vIG5hbWVzcGFjZSB1dGlscworfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBjMgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQ09ERUMyX0hJRExfVjFfMF9VVElMU19JTlBVVFNVUkZBQ0VDT05ORUNUSU9OX0gKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMC90eXBlcy5oIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL2luY2x1ZGUvY29kZWMyL2hpZGwvMS4wL3R5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThmNWM5NgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMC90eXBlcy5oCkBAIC0wLDAgKzEsMzY4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDT0RFQzJfSElETF9WMV8wX1VUSUxTX1RZUEVTX0gKKyNkZWZpbmUgQ09ERUMyX0hJRExfVjFfMF9VVElMU19UWVBFU19ICisKKyNpbmNsdWRlIDxjaHJvbm8+CisKKyNpbmNsdWRlIDxidWZmZXJwb29sL0NsaWVudE1hbmFnZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0lDbGllbnRNYW5hZ2VyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9idWZmZXJwb29sLzEuMC90eXBlcy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYzIvMS4wL0lDb21wb25lbnRTdG9yZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYzIvMS4wL3R5cGVzLmg+CisjaW5jbHVkZSA8Z3VpL0lHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KKworI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8QzJQYXJhbS5oPgorI2luY2x1ZGUgPEMyUGFyYW1EZWYuaD4KKyNpbmNsdWRlIDxDMldvcmsuaD4KKwordXNpbmcgbmFtZXNwYWNlIHN0ZDo6Y2hyb25vX2xpdGVyYWxzOworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBjMiB7CituYW1lc3BhY2UgVjFfMCB7CituYW1lc3BhY2UgdXRpbHMgeworCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2JpdGZpZWxkOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9oYW5kbGU7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgOjphbmRyb2lkOjpzdGF0dXNfdDsKK3VzaW5nIDo6YW5kcm9pZDo6c3A7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjFfMDo6aW1wbGVtZW50YXRpb246OgorICAgICAgICBDb25uZWN0aW9uSWQ7Cit1c2luZyA6OmFuZHJvaWQ6OklHcmFwaGljQnVmZmVyUHJvZHVjZXI7CisKKy8vIFR5cGVzIG9mIG1ldGFkYXRhIGZvciBCbG9ja3MuCitzdHJ1Y3QgQzJIaWRsX1JhbmdlIHsKKyAgICB1aW50MzJfdCBvZmZzZXQ7CisgICAgdWludDMyX3QgbGVuZ3RoOyAvLyBEbyBub3QgdXNlICJzaXplIiBiZWNhdXNlIHRoZSBuYW1lIGNvbGxpZGVzIHdpdGggQzJJbmZvOjpzaXplKCkuCit9OwordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMySW5mbywgQzJIaWRsX1JhbmdlLCAwPiBDMkhpZGxfUmFuZ2VJbmZvOworCitzdHJ1Y3QgQzJIaWRsX1JlY3QgeworICAgIHVpbnQzMl90IGxlZnQ7CisgICAgdWludDMyX3QgdG9wOworICAgIHVpbnQzMl90IHdpZHRoOworICAgIHVpbnQzMl90IGhlaWdodDsKK307Cit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJJbmZvLCBDMkhpZGxfUmVjdCwgMT4gQzJIaWRsX1JlY3RJbmZvOworCisvLyBDMlNldHRpbmdSZXN1bHQgLT4gU2V0dGluZ1Jlc3VsdAorU3RhdHVzIG9iamNweSgKKyAgICAgICAgU2V0dGluZ1Jlc3VsdCogZCwKKyAgICAgICAgY29uc3QgQzJTZXR0aW5nUmVzdWx0JiBzKTsKKworLy8gU2V0dGluZ1Jlc3VsdCAtPiBzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0PgorYzJfc3RhdHVzX3Qgb2JqY3B5KAorICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0PiogZCwKKyAgICAgICAgY29uc3QgU2V0dGluZ1Jlc3VsdCYgcyk7CisKKy8vIEMyUGFyYW1EZXNjcmlwdG9yIC0+IFBhcmFtRGVzY3JpcHRvcgorU3RhdHVzIG9iamNweSgKKyAgICAgICAgUGFyYW1EZXNjcmlwdG9yKiBkLAorICAgICAgICBjb25zdCBDMlBhcmFtRGVzY3JpcHRvciYgcyk7CisKKy8vIFBhcmFtRGVzY3JpcHRvciAtPiBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+CitjMl9zdGF0dXNfdCBvYmpjcHkoCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4qIGQsCisgICAgICAgIGNvbnN0IFBhcmFtRGVzY3JpcHRvciYgcyk7CisKKy8vIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeSAtPiBGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5CitTdGF0dXMgb2JqY3B5KAorICAgICAgICBGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5KiBkLAorICAgICAgICBjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkmIHMpOworCisvLyBGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5IC0+IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeQorYzJfc3RhdHVzX3Qgb2JqY3B5KAorICAgICAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkqIGQsCisgICAgICAgIGNvbnN0IEZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkmIHMpOworCisvLyBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkgLT4gRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeVJlc3VsdAorU3RhdHVzIG9iamNweSgKKyAgICAgICAgRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeVJlc3VsdCogZCwKKyAgICAgICAgY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5JiBzKTsKKworLy8gRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeSwgRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeVJlc3VsdCAtPiBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkKK2MyX3N0YXR1c190IG9iamNweSgKKyAgICAgICAgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5KiBkLAorICAgICAgICBjb25zdCBGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5JiBzcSwKKyAgICAgICAgY29uc3QgRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeVJlc3VsdCYgc3IpOworCisvLyBDMkNvbXBvbmVudDo6VHJhaXRzIC0+IENvbXBvbmVudFRyYWl0cworU3RhdHVzIG9iamNweSgKKyAgICAgICAgSUNvbXBvbmVudFN0b3JlOjpDb21wb25lbnRUcmFpdHMqIGQsCisgICAgICAgIGNvbnN0IEMyQ29tcG9uZW50OjpUcmFpdHMmIHMpOworCisvLyBDb21wb25lbnRUcmFpdHMgLT4gQzJDb21wb25lbnQ6OlRyYWl0cywgc3RkOjp1bmlxdWVfcHRyPHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPj4KKy8vIE5vdGU6IFRoZSBvdXRwdXQgZCBpcyBvbmx5IHZhbGlkIGFzIGxvbmcgYXMgYWxpYXNlc0J1ZmZlciByZW1haW5zIGFsaXZlLgorYzJfc3RhdHVzX3Qgb2JqY3B5KAorICAgICAgICBDMkNvbXBvbmVudDo6VHJhaXRzKiBkLAorICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8c3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+PiogYWxpYXNlc0J1ZmZlciwKKyAgICAgICAgY29uc3QgSUNvbXBvbmVudFN0b3JlOjpDb21wb25lbnRUcmFpdHMmIHMpOworCisvLyBDMlN0cnVjdERlc2NyaXB0b3IgLT4gU3RydWN0RGVzY3JpcHRvcgorU3RhdHVzIG9iamNweSgKKyAgICAgICAgU3RydWN0RGVzY3JpcHRvciogZCwKKyAgICAgICAgY29uc3QgQzJTdHJ1Y3REZXNjcmlwdG9yJiBzKTsKKworLy8gU3RydWN0RGVzY3JpcHRvciAtPiBDMlN0cnVjdERlc2NyaXB0b3IKK2MyX3N0YXR1c190IG9iamNweSgKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyU3RydWN0RGVzY3JpcHRvcj4qIGQsCisgICAgICAgIGNvbnN0IFN0cnVjdERlc2NyaXB0b3ImIHMpOworCisvLyBBYnN0cmFjdCBjbGFzcyB0byBiZSB1c2VkIGluCisvLyBvYmpjcHkoc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiAtPiBXb3JrQnVuZGxlKS4KK3N0cnVjdCBCdWZmZXJQb29sU2VuZGVyIHsKKyAgICB0eXBlZGVmIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMV8wOjoKKyAgICAgICAgICAgIFJlc3VsdFN0YXR1cyBSZXN1bHRTdGF0dXM7CisgICAgdHlwZWRlZiA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjFfMDo6CisgICAgICAgICAgICBCdWZmZXJTdGF0dXNNZXNzYWdlIEJ1ZmZlclN0YXR1c01lc3NhZ2U7CisgICAgdHlwZWRlZiA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6CisgICAgICAgICAgICBCdWZmZXJQb29sRGF0YSBCdWZmZXJQb29sRGF0YTsKKworICAgIC8qKgorICAgICAqIFNlbmQgYnBEYXRhIGFuZCByZXR1cm4gQnVmZmVyU3RhdHVzTWVzc2FnZSB0aGF0IGNhbiBiZSBzdXBwbGllZCB0bworICAgICAqIElDbGllbnRNYW5hZ2VyOjpyZWNlaXZlKCkgaW4gdGhlIHJlY2VpdmluZyBwcm9jZXNzLgorICAgICAqCisgICAgICogVGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBmcm9tIHdpdGhpbiB0aGUgZnVuY3Rpb24KKyAgICAgKiBvYmpjcHkoc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiAtPiBXb3JrQnVuZGxlKS4KKyAgICAgKgorICAgICAqIFxwYXJhbVtpbl0gYnBEYXRhIEJ1ZmZlclBvb2xEYXRhIGlkZW50aWZ5aW5nIHRoZSBidWZmZXIgdG8gc2VuZC4KKyAgICAgKiBccGFyYW1bb3V0XSBicE1lc3NhZ2UgQnVmZmVyU3RhdHVzTWVzc2FnZSBvZiB0aGUgdHJhbnNhY3Rpb24uIEluZm9ybWF0aW9uCisgICAgICogICAgaW5zaWRlIFxwIGJwTWVzc2FnZSBzaG91bGQgYmUgcGFzc2VkIHRvIHRoZSByZWNlaXZpbmcgcHJvY2VzcyBieSBzb21lCisgICAgICogICAgb3RoZXIgbWVhbnMgc28gaXQgY2FuIGNhbGwgcmVjZWl2ZSgpIHByb3Blcmx5LgorICAgICAqIFxyZXR1cm4gUmVzdWx0U3RhdHVzIHZhbHVlIHRoYXQgZGV0ZXJtaW5lcyB0aGUgc3VjY2VzcyBvZiB0aGUgb3BlcmF0aW9uLgorICAgICAqICAgIChTZWUgdGhlIHBvc3NpYmxlIHZhbHVlcyBvZiBSZXN1bHRTdGF0dXMgaW4KKyAgICAgKiAgICBoYXJkd2FyZS9pbnRlcmZhY2VzL21lZGlhL2J1ZmZlcnBvb2wvMS4wL3R5cGVzLmhhbC4pCisgICAgICovCisgICAgdmlydHVhbCBSZXN1bHRTdGF0dXMgc2VuZCgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4mIGJwRGF0YSwKKyAgICAgICAgICAgIEJ1ZmZlclN0YXR1c01lc3NhZ2UqIGJwTWVzc2FnZSkgPSAwOworCisgICAgdmlydHVhbCB+QnVmZmVyUG9vbFNlbmRlcigpID0gZGVmYXVsdDsKK307CisKKy8vIERlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgQnVmZmVyUG9vbFNlbmRlci4KKy8vCisvLyBUbyB1c2UgRGVmYXVsdEJ1ZmZlclBvb2xTZW5kZXIsIHRoZSBJQ2xpZW50TWFuYWdlciBpbnN0YW5jZSBvZiB0aGUgcmVjZWl2aW5nCisvLyBwcm9jZXNzIG11c3QgYmUgc2V0IGJlZm9yZSBzZW5kKCkgY2FuIG9wZXJhdGUuIERlZmF1bHRCdWZmZXJQb29sU2VuZGVyIHdpbGwKKy8vIGhvbGQgYSBzdHJvbmcgcmVmZXJlbmNlIHRvIHRoZSBJQ2xpZW50TWFuYWdlciBpbnN0YW5jZSBhbmQgdXNlIGl0IHRvIGNhbGwKKy8vIElDbGllbnRNYW5hZ2VyOjpyZWdpc3RlclNlbmRlcigpIHRvIGVzdGFibGlzaCB0aGUgYnVmZmVycG9vbCBjb25uZWN0aW9uIHdoZW4KKy8vIHNlbmQoKSBpcyBjYWxsZWQuCitzdHJ1Y3QgRGVmYXVsdEJ1ZmZlclBvb2xTZW5kZXIgOiBCdWZmZXJQb29sU2VuZGVyIHsKKyAgICB0eXBlZGVmIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMV8wOjppbXBsZW1lbnRhdGlvbjo6CisgICAgICAgICAgICBDbGllbnRNYW5hZ2VyIENsaWVudE1hbmFnZXI7CisgICAgdHlwZWRlZiA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjFfMDo6CisgICAgICAgICAgICBJQ2xpZW50TWFuYWdlciBJQ2xpZW50TWFuYWdlcjsKKworICAgIC8vIFNldCB0aGUgSUNsaWVudE1hbmFnZXIgaW5zdGFuY2Ugb2YgdGhlIHJlY2VpdmluZyBwcm9jZXNzIGFuZCB0aGUgcmVmcmVzaAorICAgIC8vIGludGVydmFsIGZvciB0aGUgY29ubmVjdGlvbi4gVGhlIGRlZmF1bHQgaW50ZXJ2YWwgaXMgNC41IHNlY29uZHMsIHdoaWNoCisgICAgLy8gaXMgc2xpZ2h0bHkgc2hvcnRlciB0aGFuIHRoZSBhbW91bnQgb2YgdGltZSB0aGUgYnVmZmVycG9vbCB3aWxsIGtlZXAgYW4KKyAgICAvLyBpbmFjdGl2ZSBjb25uZWN0aW9uIGZvci4KKyAgICBEZWZhdWx0QnVmZmVyUG9vbFNlbmRlcigKKyAgICAgICAgICAgIGNvbnN0IHNwPElDbGllbnRNYW5hZ2VyPiYgcmVjZWl2ZXJNYW5hZ2VyID0gbnVsbHB0ciwKKyAgICAgICAgICAgIHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6OmR1cmF0aW9uIHJlZnJlc2hJbnRlcnZhbCA9IDQ1MDBtcyk7CisKKyAgICAvLyBTZXQgdGhlIElDbGllbnRNYW5hZ2VyIGluc3RhbmNlIG9mIHRoZSByZWNlaXZpbmcgcHJvY2VzcyBhbmQgdGhlIHJlZnJlc2gKKyAgICAvLyBpbnRlcnZhbCBmb3IgdGhlIGNvbm5lY3Rpb24uIFRoZSBkZWZhdWx0IGludGVydmFsIGlzIDQuNSBzZWNvbmRzLCB3aGljaAorICAgIC8vIGlzIHNsaWdodGx5IHNob3J0ZXIgdGhhbiB0aGUgYW1vdW50IG9mIHRpbWUgdGhlIGJ1ZmZlcnBvb2wgd2lsbCBrZWVwIGFuCisgICAgLy8gaW5hY3RpdmUgY29ubmVjdGlvbiBmb3IuCisgICAgdm9pZCBzZXRSZWNlaXZlcigKKyAgICAgICAgICAgIGNvbnN0IHNwPElDbGllbnRNYW5hZ2VyPiYgcmVjZWl2ZXJNYW5hZ2VyLAorICAgICAgICAgICAgc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6ZHVyYXRpb24gcmVmcmVzaEludGVydmFsID0gNDUwMG1zKTsKKworICAgIC8vIEltcGxlbWVudGF0aW9uIG9mIEJ1ZmZlclBvb2xTZW5kZXI6OnNlbmQoKS4gc2VuZCgpIHdpbGwgZXN0YWJsaXNoIGEKKyAgICAvLyBidWZmZXJwb29sIGNvbm5lY3Rpb24gaWYgbmVlZGVkLCB0aGVuIHNlbmQgdGhlIGJ1ZmZlcnBvb2wgZGF0YSBvdmVyIHRvCisgICAgLy8gdGhlIHJlY2VpdmluZyBwcm9jZXNzLgorICAgIHZpcnR1YWwgUmVzdWx0U3RhdHVzIHNlbmQoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+JiBicERhdGEsCisgICAgICAgICAgICBCdWZmZXJTdGF0dXNNZXNzYWdlKiBicE1lc3NhZ2UpIG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIHN0ZDo6bXV0ZXggbU11dGV4OworICAgIHNwPENsaWVudE1hbmFnZXI+IG1TZW5kZXJNYW5hZ2VyOworICAgIHNwPElDbGllbnRNYW5hZ2VyPiBtUmVjZWl2ZXJNYW5hZ2VyOworICAgIGludDY0X3QgbVJlY2VpdmVyQ29ubmVjdGlvbklkOworICAgIGludDY0X3QgbVNvdXJjZUNvbm5lY3Rpb25JZDsKKyAgICBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjp0aW1lX3BvaW50IG1MYXN0U2VudDsKKyAgICBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpkdXJhdGlvbiBtUmVmcmVzaEludGVydmFsOworfTsKKworLy8gc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiAtPiBXb3JrQnVuZGxlCisvLyBOb3RlOiBJZiBidWZmZXJwb29sIHdpbGwgYmUgdXNlZCwgYnBTZW5kZXIgbXVzdCBub3QgYmUgbnVsbC4KK1N0YXR1cyBvYmpjcHkoCisgICAgICAgIFdvcmtCdW5kbGUqIGQsCisgICAgICAgIGNvbnN0IHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4mIHMsCisgICAgICAgIEJ1ZmZlclBvb2xTZW5kZXIqIGJwU2VuZGVyID0gbnVsbHB0cik7CisKKy8vIFdvcmtCdW5kbGUgLT4gc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PgorYzJfc3RhdHVzX3Qgb2JqY3B5KAorICAgICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+KiBkLAorICAgICAgICBjb25zdCBXb3JrQnVuZGxlJiBzKTsKKworLyoqCisgKiBQYXJzZXMgYSBwYXJhbXMgYmxvYiBhbmQgcmV0dXJucyBDMlBhcmFtIHBvaW50ZXJzIHRvIGl0cyBwYXJhbXMuCisgKiBccGFyYW1bb3V0XSBwYXJhbXMgdGFyZ2V0IHZlY3RvciBvZiBDMlBhcmFtIHBvaW50ZXJzCisgKiBccGFyYW1baW5dIGJsb2IgcGFyYW1ldGVyIGJsb2IgdG8gcGFyc2UKKyAqIFxyZXR2YWwgQzJfT0sgaWYgdGhlIGZ1bGwgYmxvYiB3YXMgcGFyc2VkCisgKiBccmV0dmFsIEMyX0JBRF9WQUxVRSBvdGhlcndpc2UKKyAqLworYzJfc3RhdHVzX3QgcGFyc2VQYXJhbXNCbG9iKAorICAgICAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gKnBhcmFtcywKKyAgICAgICAgY29uc3QgaGlkbF92ZWM8dWludDhfdD4gJmJsb2IpOworCisvKioKKyAqIENvbmNhdGVuYXRlcyBhIGxpc3Qgb2YgQzJQYXJhbXMgaW50byBhIHBhcmFtcyBibG9iLgorICogXHBhcmFtW291dF0gYmxvYiB0YXJnZXQgYmxvYgorICogXHBhcmFtW2luXSBwYXJhbXMgcGFyYW1ldGVycyB0byBjb25jYXRlbmF0ZQorICogXHJldHZhbCBDMl9PSyBpZiB0aGUgYmxvYiB3YXMgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQKKyAqIFxyZXR2YWwgQzJfQkFEX1ZBTFVFIGlmIHRoZSBibG9iIHdhcyBub3Qgc3VjY2Vzc2Z1bCAodGhpcyBvbmx5IGhhcHBlbnMgaWYgdGhlIHBhcmFtZXRlcnMgd2VyZQorICogICAgICAgICBub3QgY29uc3QpCisgKi8KK1N0YXR1cyBjcmVhdGVQYXJhbXNCbG9iKAorICAgICAgICBoaWRsX3ZlYzx1aW50OF90PiAqYmxvYiwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+ICZwYXJhbXMpOworU3RhdHVzIGNyZWF0ZVBhcmFtc0Jsb2IoCisgICAgICAgIGhpZGxfdmVjPHVpbnQ4X3Q+ICpibG9iLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+ICZwYXJhbXMpOworU3RhdHVzIGNyZWF0ZVBhcmFtc0Jsb2IoCisgICAgICAgIGhpZGxfdmVjPHVpbnQ4X3Q+ICpibG9iLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJJbmZvPj4gJnBhcmFtcyk7CitTdGF0dXMgY3JlYXRlUGFyYW1zQmxvYigKKyAgICAgICAgaGlkbF92ZWM8dWludDhfdD4gKmJsb2IsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlR1bmluZz4+ICZwYXJhbXMpOworCisvKioKKyAqIFBhcnNlcyBhIHBhcmFtcyBibG9iIGFuZCBjcmVhdGUgYSB2ZWN0b3Igb2YgQzJQYXJhbXMgd2hvc2UgbWVtYmVycyBhcmUgY29waWVzCisgKiBvZiB0aGUgcGFyYW1zIGluIHRoZSBibG9iLgorICogXHBhcmFtW291dF0gcGFyYW1zIHRoZSByZXN1bHRpbmcgdmVjdG9yCisgKiBccGFyYW1baW5dIGJsb2IgcGFyYW1ldGVyIGJsb2IgdG8gcGFyc2UKKyAqIFxyZXR2YWwgQzJfT0sgaWYgdGhlIGZ1bGwgYmxvYiB3YXMgcGFyc2VkIGFuZCBwYXJhbXMgd2FzIGNvbnN0cnVjdGVkCisgKiBccmV0dmFsIEMyX0JBRF9WQUxVRSBvdGhlcndpc2UKKyAqLworYzJfc3RhdHVzX3QgY29weVBhcmFtc0Zyb21CbG9iKAorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+KiBwYXJhbXMsCisgICAgICAgIFBhcmFtcyBibG9iKTsKKworLyoqCisgKiBQYXJzZXMgYSBwYXJhbXMgYmxvYiBhbmQgYXBwbGllcyB1cGRhdGVzIHRvIHBhcmFtcworICogXHBhcmFtW2luLG91dF0gcGFyYW1zIHBhcmFtcyB0byBiZSB1cGRhdGVkCisgKiBccGFyYW1baW5dIGJsb2IgcGFyYW1ldGVyIGJsb2IgY29udGFpbmluZyB1cGRhdGVzCisgKiBccmV0dmFsIEMyX09LIGlmIHRoZSBmdWxsIGJsb2Igd2FzIHBhcnNlZCBhbmQgcGFyYW1zIHdhcyB1cGRhdGVkCisgKiBccmV0dmFsIEMyX0JBRF9WQUxVRSBvdGhlcndpc2UKKyAqLworYzJfc3RhdHVzX3QgdXBkYXRlUGFyYW1zRnJvbUJsb2IoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiYgcGFyYW1zLAorICAgICAgICBjb25zdCBQYXJhbXMmIGJsb2IpOworCisvKioKKyAqIENvbnZlcnRzIGEgQnVmZmVyUG9vbCBzdGF0dXMgdmFsdWUgdG8gYzJfc3RhdHVzX3QuCisgKiBccGFyYW0gQnVmZmVyUG9vbCBzdGF0dXMKKyAqIFxyZXR1cm4gQ29ycmVzcG9uZGluZyBjMl9zdGF0dXNfdAorICovCitjMl9zdGF0dXNfdCB0b0MyU3RhdHVzKDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMV8wOjoKKyAgICAgICAgUmVzdWx0U3RhdHVzIHJzKTsKKworLy8gQnVmZmVyUXVldWUtQmFzZWQgQmxvY2sgT3BlcmF0aW9ucworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvLyBDcmVhdGUgYSBHcmFwaGljQnVmZmVyIG9iamVjdCBmcm9tIGEgZ3JhcGhpYyBibG9jayBhbmQgYXR0YWNoIGl0IHRvIGFuCisvLyBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyLgorc3RhdHVzX3QgYXR0YWNoVG9CdWZmZXJRdWV1ZShjb25zdCBDMkNvbnN0R3JhcGhpY0Jsb2NrJiBibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIGlnYnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGdlbmVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIGJxU2xvdCk7CisKKy8vIFJldHVybiBmYWxzZSBpZiBibG9jayBkb2VzIG5vdCBjb21lIGZyb20gYSBidWZmZXJxdWV1ZS1iYXNlZCBibG9ja3Bvb2wuCisvLyBPdGhlcndpc2UsIGV4dHJhY3QgZ2VuZXJhdGlvbiwgYnFJZCBhbmQgYnFTbG90IGFuZCByZXR1cm4gdHJ1ZS4KK2Jvb2wgZ2V0QnVmZmVyUXVldWVBc3NpZ25tZW50KGNvbnN0IEMyQ29uc3RHcmFwaGljQmxvY2smIGJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGdlbmVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCogYnFJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIGJxU2xvdCk7CisKKy8vIERpc2Fzc29jaWF0ZSB0aGUgZ2l2ZW4gYmxvY2sgd2l0aCBpdHMgZGVzaWduYXRlZCBidWZmZXJxdWV1ZSBzbyB0aGF0CisvLyBjYW5jZWxCdWZmZXIoKSB3aWxsIG5vdCBiZSBjYWxsZWQgd2hlbiB0aGUgYmxvY2sgaXMgZGVzdHJveWVkLiBJZiB0aGUgYmxvY2sKKy8vIGRvZXMgbm90IGhhdmUgYSBkZXNpZ25hdGVkIGJ1ZmZlcnF1ZXVlLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBmYWxzZS4KKy8vIE90aGVyd2lzZSwgaXQgcmV0dXJucyB0cnVlLgorLy8KKy8vIE5vdGU6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBhZnRlciBhdHRhY2hCdWZmZXIoKSBvciBxdWV1ZUJ1ZmZlcigpIGlzCisvLyBjYWxsZWQgbWFudWFsbHkuCitib29sIHlpZWxkQnVmZmVyUXVldWVCbG9jayhjb25zdCBDMkNvbnN0R3JhcGhpY0Jsb2NrJiBibG9jayk7CisKKy8vIENhbGwgeWllbGRCdWZmZXJRdWV1ZUJsb2NrKCkgb24gYmxvY2tzIGluIHRoZSBnaXZlbiB3b3JrTGlzdC4gcHJvY2Vzc0lucHV0CisvLyBkZXRlcm1pbmVzIHdoZXRoZXIgaW5wdXQgYmxvY2tzIGFyZSB5aWVsZGVkLiBwcm9jZXNzT3V0cHV0IHdvcmtzIHNpbWlsYXJseSBvbgorLy8gb3V0cHV0IGJsb2Nrcy4gKFRoZSBkZWZhdWx0IHZhbHVlIG9mIHByb2Nlc3NJbnB1dCBpcyBmYWxzZSB3aGlsZSB0aGUgZGVmYXVsdAorLy8gdmFsdWUgb2YgcHJvY2Vzc091dHB1dCBpcyB0cnVlLiBUaGlzIGltcGxpZXMgdGhhdCBpbiBtb3N0IGNhc2VzLCBvbmx5IG91dHB1dAorLy8gYnVmZmVycyBjb250YWluIGJ1ZmZlcnF1ZXVlLWJhc2VkIGJsb2Nrcy4pCisvLworLy8gTm90ZTogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGFmdGVyIFdvcmtCdW5kbGUgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5CisvLyBzZW50IG92ZXIgdGhlIFRyZWJsZSBib3VuZGFyeSB0byBhbm90aGVyIHByb2Nlc3MuCit2b2lkIHlpZWxkQnVmZmVyUXVldWVCbG9ja3MoY29uc3Qgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiYgd29ya0xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwcm9jZXNzSW5wdXQgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHByb2Nlc3NPdXRwdXQgPSB0cnVlKTsKKworLy8gQXNzaWduIHRoZSBnaXZlbiBibG9jayB0byBhIGJ1ZmZlcnF1ZXVlIHNvIHRoYXQgd2hlbiB0aGUgYmxvY2sgaXMgZGVzdHJveWVkLAorLy8gY2FuY2VsQnVmZmVyKCkgd2lsbCBiZSBjYWxsZWQuCisvLworLy8gSWYgdGhlIGJsb2NrIGRvZXMgbm90IGNvbWUgZnJvbSBhIGJ1ZmZlcnF1ZXVlLWJhc2VkIGJsb2NrcG9vbCwgdGhpcyBmdW5jdGlvbgorLy8gcmV0dXJucyBmYWxzZS4KKy8vCisvLyBJZiB0aGUgYmxvY2sgYWxyZWFkeSBoYXMgYSBidWZmZXJxdWV1ZSBhc3NpZ25tZW50IHRoYXQgbWF0Y2hlcyB0aGUgZ2l2ZW4gb25lLAorLy8gdGhlIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZS4KKy8vCisvLyBJZiB0aGUgYmxvY2sgYWxyZWFkeSBoYXMgYSBidWZmZXJxdWV1ZSBhc3NpZ25tZW50IHRoYXQgZG9lcyBub3QgbWF0Y2ggdGhlCisvLyBnaXZlbiBvbmUsIHRoZSBibG9jayB3aWxsIGJlIHJlYXNzaWduZWQgdG8gdGhlIGdpdmVuIGJ1ZmZlcnF1ZXVlLiBUaGlzCisvLyB3aWxsIGNhbGwgYXR0YWNoQnVmZmVyKCkgb24gdGhlIGdpdmVuIGlnYnAuIFRoZSBmdW5jdGlvbiB0aGVuIHJldHVybnMgdHJ1ZSBvbgorLy8gc3VjY2VzcyBvciBmYWxzZSBvbiBhbnkgZmFpbHVyZSBkdXJpbmcgdGhlIG9wZXJhdGlvbi4KKy8vCisvLyBOb3RlOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgZGV0YWNoQnVmZmVyKCkgb3IgZGVxdWV1ZUJ1ZmZlcigpCisvLyBpcyBjYWxsZWQgbWFudWFsbHkuCitib29sIGhvbGRCdWZmZXJRdWV1ZUJsb2NrKGNvbnN0IEMyQ29uc3RHcmFwaGljQmxvY2smIGJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgaWdicCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgYnFJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZ2VuZXJhdGlvbik7CisKKy8vIENhbGwgaG9sZEJ1ZmZlclF1ZXVlQmxvY2soKSBvbiBpbnB1dCBvciBvdXRwdXQgYmxvY2tzIGluIHRoZSBnaXZlbiB3b3JrTGlzdC4KKy8vIFNpbmNlIHRoZSBidWZmZXJxdWV1ZSBhc3NpZ25tZW50IGZvciBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlcnMgY2FuIGJlCisvLyBkaWZmZXJlbnQsIHRoaXMgZnVuY3Rpb24gdGFrZXMgZm9ySW5wdXQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGdpdmVuCisvLyBidWZmZXJxdWV1ZSBpcyBmb3IgaW5wdXQgYnVmZmVycyBvciBvdXRwdXQgYnVmZmVycy4gKFRoZSBkZWZhdWx0IHZhbHVlIG9mCisvLyBmb3JJbnB1dCBpcyBmYWxzZS4pCisvLworLy8gSW4gdGhlIChyYXJlKSBjYXNlIHRoYXQgYm90aCBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlcnMgYXJlIGJ1ZmZlcnF1ZXVlLWJhc2VkLAorLy8gdGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCB0d2ljZSwgb25jZSBmb3IgdGhlIGlucHV0IGJ1ZmZlcnMgYW5kIG9uY2UgZm9yCisvLyB0aGUgb3V0cHV0IGJ1ZmZlcnMuCisvLworLy8gTm90ZTogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGFmdGVyIFdvcmtCdW5kbGUgaGFzIGJlZW4gcmVjZWl2ZWQgZnJvbQorLy8gYW5vdGhlciBwcm9jZXNzLgordm9pZCBob2xkQnVmZmVyUXVldWVCbG9ja3MoY29uc3Qgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiYgd29ya0xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgaWdicCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IGJxSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBnZW5lcmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JJbnB1dCA9IGZhbHNlKTsKKworfSAgLy8gbmFtZXNwYWNlIHV0aWxzCit9ICAvLyBuYW1lc3BhY2UgVjFfMAorfSAgLy8gbmFtZXNwYWNlIGMyCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBDT0RFQzJfSElETF9WMV8wX1VUSUxTX1RZUEVTX0gKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy90eXBlcy5jcHAgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvdHlwZXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4Mjc1MDQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvdHlwZXMuY3BwCkBAIC0wLDAgKzEsMTgwMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ29kZWMyLXR5cGVzIgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMC90eXBlcy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvYnFoZWxwZXIvV0dyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgorCisjaW5jbHVkZSA8QzJBbGxvY2F0b3JJb24uaD4KKyNpbmNsdWRlIDxDMkFsbG9jYXRvckdyYWxsb2MuaD4KKyNpbmNsdWRlIDxDMkJsb2NrSW50ZXJuYWwuaD4KKyNpbmNsdWRlIDxDMkJ1ZmZlci5oPgorI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8QzJQYXJhbS5oPgorI2luY2x1ZGUgPEMyUGFyYW1JbnRlcm5hbC5oPgorI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8QzJXb3JrLmg+CisjaW5jbHVkZSA8dXRpbC9DMlBhcmFtVXRpbHMuaD4KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FVdGlscy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBjMiB7CituYW1lc3BhY2UgVjFfMCB7CituYW1lc3BhY2UgdXRpbHMgeworCit1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OkJ1ZmZlclBvb2xEYXRhOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYxXzA6OkJ1ZmZlclN0YXR1c01lc3NhZ2U7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjFfMDo6UmVzdWx0U3RhdHVzOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYxXzA6OmltcGxlbWVudGF0aW9uOjoKKyAgICAgICAgQ2xpZW50TWFuYWdlcjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMV8wOjppbXBsZW1lbnRhdGlvbjo6CisgICAgICAgIFRyYW5zYWN0aW9uSWQ7Cit1c2luZyA6OmFuZHJvaWQ6OlRXR3JhcGhpY0J1ZmZlclByb2R1Y2VyOworCituYW1lc3BhY2UgLyogdW5uYW1lZCAqLyB7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBDb21tb24sIHR5cGVuYW1lIERzdFZlY3RvciwgdHlwZW5hbWUgU3JjVmVjdG9yPgordm9pZCBjb3B5VmVjdG9yKERzdFZlY3RvciogZCwgY29uc3QgU3JjVmVjdG9yJiBzKSB7CisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoQ29tbW9uKSA9PSBzaXplb2YoZGVjbHR5cGUoKCpkKVswXSkpLAorICAgICAgICAgICAgIkRzdFZlY3RvcidzIGNvbXBvbmVudCBzaXplIGRvZXMgbm90IG1hdGNoIENvbW1vbiIpOworICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKENvbW1vbikgPT0gc2l6ZW9mKGRlY2x0eXBlKHNbMF0pKSwKKyAgICAgICAgICAgICJTcmNWZWN0b3IncyBjb21wb25lbnQgc2l6ZSBkb2VzIG5vdCBtYXRjaCBDb21tb24iKTsKKyAgICBkLT5yZXNpemUocy5zaXplKCkpOworICAgIHN0ZDo6Y29weSgKKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgQ29tbW9uKj4oJnNbMF0pLAorICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBDb21tb24qPigmc1swXSArIHMuc2l6ZSgpKSwKKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Q29tbW9uKj4oJigqZClbMF0pKTsKK30KKworLy8gQzJQYXJhbUZpZWxkIC0+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+PiYgd29ya0xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgaWdicCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IGJxSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBnZW5lcmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JJbnB1dCkgeworICAgIGZvckVhY2hCbG9jayh3b3JrTGlzdCwKKyAgICAgICAgICAgICAgICAgc3RkOjpiaW5kKGhvbGRCdWZmZXJRdWV1ZUJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpwbGFjZWhvbGRlcnM6Ol8xLCBpZ2JwLCBicUlkLCBnZW5lcmF0aW9uKSwKKyAgICAgICAgICAgICAgICAgZm9ySW5wdXQsICFmb3JJbnB1dCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSB1dGlscworfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBjMgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvYXVkaW8vQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvYXVkaW8vQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODc3NTRiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9hdWRpby9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitjY190ZXN0IHsKKyAgICBuYW1lOiAiVnRzSGlkbEMyVjFfMFRhcmdldEF1ZGlvRGVjVGVzdCIsCisgICAgZGVmYXVsdHM6IFsiVnRzTWVkaWFDMlYxXzBEZWZhdWx0cyJdLAorICAgIHNyY3M6IFsKKyAgICAgICAgIlZ0c0hpZGxDMlYxXzBUYXJnZXRBdWRpb0RlY1Rlc3QuY3BwIiwKKyAgICAgICAgLy8ibWVkaWFfYXVkaW9faGlkbF90ZXN0X2NvbW1vbi5jcHAiCisgICAgXSwKK30KKworY2NfdGVzdCB7CisgICAgbmFtZTogIlZ0c0hpZGxDMlYxXzBUYXJnZXRBdWRpb0VuY1Rlc3QiLAorICAgIGRlZmF1bHRzOiBbIlZ0c01lZGlhQzJWMV8wRGVmYXVsdHMiXSwKKyAgICBzcmNzOiBbCisgICAgICAgICJWdHNIaWRsQzJWMV8wVGFyZ2V0QXVkaW9FbmNUZXN0LmNwcCIsCisgICAgICAgIC8vIm1lZGlhX2F1ZGlvX2hpZGxfdGVzdF9jb21tb24uY3BwIgorICAgIF0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2F1ZGlvL1Z0c0hpZGxDMlYxXzBUYXJnZXRBdWRpb0RlY1Rlc3QuY3BwIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9hdWRpby9WdHNIaWRsQzJWMV8wVGFyZ2V0QXVkaW9EZWNUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZmQ5MjAwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9hdWRpby9WdHNIaWRsQzJWMV8wVGFyZ2V0QXVkaW9EZWNUZXN0LmNwcApAQCAtMCwwICsxLDkwNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vICNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgImNvZGVjMl9oaWRsX2hhbF9hdWRpb19kZWNfdGVzdCIKKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxmc3RyZWFtPgorCisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvY2xpZW50Lmg+CisjaW5jbHVkZSA8QzJBbGxvY2F0b3JJb24uaD4KKyNpbmNsdWRlIDxDMkNvbmZpZy5oPgorI2luY2x1ZGUgPEMyRGVidWcuaD4KKyNpbmNsdWRlIDxDMkJ1ZmZlci5oPgorI2luY2x1ZGUgPEMyQnVmZmVyUHJpdi5oPgorCit1c2luZyBhbmRyb2lkOjpDMkFsbG9jYXRvcklvbjsKKworI2luY2x1ZGUgPFZ0c0hhbEhpZGxUYXJnZXRUZXN0QmFzZS5oPgorI2luY2x1ZGUgIm1lZGlhX2MyX2F1ZGlvX2hpZGxfdGVzdF9jb21tb24uaCIKKyNpbmNsdWRlICJtZWRpYV9jMl9oaWRsX3Rlc3RfY29tbW9uLmgiCisKK3N0cnVjdCBGcmFtZUluZm8geworICAgIGludCBieXRlc0NvdW50OworICAgIHVpbnQzMl90IGZsYWdzOworICAgIGludDY0X3QgdGltZXN0YW1wOworfTsKKworY2xhc3MgTGluZWFyQnVmZmVyIDogcHVibGljIEMyQnVmZmVyIHsKKyAgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBMaW5lYXJCdWZmZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+JiBibG9jaykKKyAgICAgICAgOiBDMkJ1ZmZlcigKKyAgICAgICAgICAgICAge2Jsb2NrLT5zaGFyZShibG9jay0+b2Zmc2V0KCksIGJsb2NrLT5zaXplKCksIDo6QzJGZW5jZSgpKX0pIHt9Cit9OworCitzdGF0aWMgQ29tcG9uZW50VGVzdEVudmlyb25tZW50KiBnRW52ID0gbnVsbHB0cjsKKworbmFtZXNwYWNlIHsKKworY2xhc3MgQ29kZWMyQXVkaW9EZWNIaWRsVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlZ0c0hhbEhpZGxUYXJnZXRUZXN0QmFzZSB7CisgICBwcml2YXRlOgorICAgIHR5cGVkZWYgOjp0ZXN0aW5nOjpWdHNIYWxIaWRsVGFyZ2V0VGVzdEJhc2UgU3VwZXI7CisKKyAgIHB1YmxpYzoKKyAgICA6OnN0ZDo6c3RyaW5nIGdldFRlc3RDYXNlSW5mbygpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIDo6c3RkOjpzdHJpbmcoKSArCisgICAgICAgICAgICAgICAgIkNvbXBvbmVudDogIiArIGdFbnYtPmdldENvbXBvbmVudCgpLmNfc3RyKCkgKyAiIHwgIiArCisgICAgICAgICAgICAgICAgIkluc3RhbmNlOiAiICsgZ0Vudi0+Z2V0SW5zdGFuY2UoKS5jX3N0cigpICsgIiB8ICIgKworICAgICAgICAgICAgICAgICJSZXM6ICIgKyBnRW52LT5nZXRSZXMoKS5jX3N0cigpOworICAgIH0KKworICAgIC8vIGdvb2dsZS5jb2RlYzIgQXVkaW8gdGVzdCBzZXR1cAorICAgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKKyAgICAgICAgU3VwZXI6OlNldFVwKCk7CisgICAgICAgIG1EaXNhYmxlVGVzdCA9IGZhbHNlOworICAgICAgICBBTE9HVigiQ29kZWMyQXVkaW9EZWNIaWRsVGVzdCBTZXRVcCIpOworICAgICAgICBtQ2xpZW50ID0gYW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDcmVhdGVGcm9tU2VydmljZSgKKyAgICAgICAgICAgIGdFbnYtPmdldEluc3RhbmNlKCkuY19zdHIoKSk7CisgICAgICAgIEFTU0VSVF9ORShtQ2xpZW50LCBudWxscHRyKTsKKyAgICAgICAgbUxpc3RlbmVyLnJlc2V0KG5ldyBDb2RlY0xpc3RlbmVyKAorICAgICAgICAgICAgW3RoaXNdKHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4mIHdvcmtJdGVtcykgeworICAgICAgICAgICAgICAgIGhhbmRsZVdvcmtEb25lKHdvcmtJdGVtcyk7CisgICAgICAgICAgICB9KSk7CisgICAgICAgIEFTU0VSVF9ORShtTGlzdGVuZXIsIG51bGxwdHIpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE1BWF9JTlBVVF9CVUZGRVJTOyArK2kpIHsKKyAgICAgICAgICAgIG1Xb3JrUXVldWUuZW1wbGFjZV9iYWNrKG5ldyBDMldvcmspOworICAgICAgICB9CisgICAgICAgIG1DbGllbnQtPmNyZWF0ZUNvbXBvbmVudChnRW52LT5nZXRDb21wb25lbnQoKS5jX3N0cigpLCBtTGlzdGVuZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbUNvbXBvbmVudCk7CisgICAgICAgIEFTU0VSVF9ORShtQ29tcG9uZW50LCBudWxscHRyKTsKKworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3JTdG9yZT4gc3RvcmUgPQorICAgICAgICAgICAgYW5kcm9pZDo6R2V0Q29kZWMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZSgpOworICAgICAgICBDSEVDS19FUShzdG9yZS0+ZmV0Y2hBbGxvY2F0b3IoQzJBbGxvY2F0b3JTdG9yZTo6REVGQVVMVF9MSU5FQVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbUxpbmVhckFsbG9jYXRvciksCisgICAgICAgICAgICAgICAgIEMyX09LKTsKKyAgICAgICAgbUxpbmVhclBvb2wgPSBzdGQ6Om1ha2Vfc2hhcmVkPEMyUG9vbGVkQmxvY2tQb29sPihtTGluZWFyQWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CbG9ja1Bvb2xJZCsrKTsKKyAgICAgICAgQVNTRVJUX05FKG1MaW5lYXJQb29sLCBudWxscHRyKTsKKworICAgICAgICBtQ29tcE5hbWUgPSB1bmtub3duX2NvbXA7CisgICAgICAgIHN0cnVjdCBTdHJpbmdUb05hbWUgeworICAgICAgICAgICAgY29uc3QgY2hhciogTmFtZTsKKyAgICAgICAgICAgIHN0YW5kYXJkQ29tcCBDb21wTmFtZTsKKyAgICAgICAgfTsKKyAgICAgICAgY29uc3QgU3RyaW5nVG9OYW1lIGtTdHJpbmdUb05hbWVbXSA9IHsKKyAgICAgICAgICAgIHsieGFhYyIsIHhhYWN9LAorICAgICAgICAgICAgeyJtcDMiLCBtcDN9LAorICAgICAgICAgICAgeyJhbXJuYiIsIGFtcm5ifSwKKyAgICAgICAgICAgIHsiYW1yd2IiLCBhbXJ3Yn0sCisgICAgICAgICAgICB7ImFhYyIsIGFhY30sCisgICAgICAgICAgICB7InZvcmJpcyIsIHZvcmJpc30sCisgICAgICAgICAgICB7Im9wdXMiLCBvcHVzfSwKKyAgICAgICAgICAgIHsicGNtIiwgcGNtfSwKKyAgICAgICAgICAgIHsiZzcxMS5hbGF3IiwgZzcxMWFsYXd9LAorICAgICAgICAgICAgeyJnNzExLm1sYXciLCBnNzExbWxhd30sCisgICAgICAgICAgICB7ImdzbSIsIGdzbX0sCisgICAgICAgICAgICB7InJhdyIsIHJhd30sCisgICAgICAgICAgICB7ImZsYWMiLCBmbGFjfSwKKyAgICAgICAgfTsKKyAgICAgICAgY29uc3Qgc2l6ZV90IGtOdW1TdHJpbmdUb05hbWUgPQorICAgICAgICAgICAgc2l6ZW9mKGtTdHJpbmdUb05hbWUpIC8gc2l6ZW9mKGtTdHJpbmdUb05hbWVbMF0pOworCisgICAgICAgIHN0ZDo6c3RyaW5nIHN1YnN0cmluZzsKKyAgICAgICAgc3RkOjpzdHJpbmcgY29tcDsKKyAgICAgICAgc3Vic3RyaW5nID0gc3RkOjpzdHJpbmcoZ0Vudi0+Z2V0Q29tcG9uZW50KCkpOworICAgICAgICAvKiBUT0RPOiBiZXR0ZXIgYXBwcm9hY2ggdG8gZmluZCB0aGUgY29tcG9uZW50ICovCisgICAgICAgIC8qICJjMi5hbmRyb2lkLiIgPT4gMTF0aCBwb3NpdGlvbiAqLworICAgICAgICBzaXplX3QgcG9zID0gMTE7CisgICAgICAgIHNpemVfdCBsZW4gPSBzdWJzdHJpbmcuZmluZCgiLmRlY29kZXIiLCBwb3MpOworICAgICAgICBjb21wID0gc3Vic3RyaW5nLnN1YnN0cihwb3MsIGxlbiAtIHBvcyk7CisKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrTnVtU3RyaW5nVG9OYW1lOyArK2kpIHsKKyAgICAgICAgICAgIGlmICghc3RyY2FzZWNtcChjb21wLmNfc3RyKCksIGtTdHJpbmdUb05hbWVbaV0uTmFtZSkpIHsKKyAgICAgICAgICAgICAgICBtQ29tcE5hbWUgPSBrU3RyaW5nVG9OYW1lW2ldLkNvbXBOYW1lOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1Fb3MgPSBmYWxzZTsKKyAgICAgICAgbUZyYW1lc1JlY2VpdmVkID0gMDsKKyAgICAgICAgbVRpbWVzdGFtcFVzID0gMHU7CisgICAgICAgIG1UaW1lc3RhbXBEZXZUZXN0ID0gZmFsc2U7CisgICAgICAgIGlmIChtQ29tcE5hbWUgPT0gdW5rbm93bl9jb21wKSBtRGlzYWJsZVRlc3QgPSB0cnVlOworICAgICAgICBpZiAobURpc2FibGVUZXN0KSBzdGQ6OmNvdXQgPDwgIlsgICBXQVJOICAgXSBUZXN0IERpc2FibGVkIFxuIjsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7CisgICAgICAgIGlmIChtQ29tcG9uZW50ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGlmICg6OnRlc3Rpbmc6OlRlc3Q6Okhhc0ZhdGFsRmFpbHVyZSgpKSByZXR1cm47CisgICAgICAgICAgICBtQ29tcG9uZW50LT5yZWxlYXNlKCk7CisgICAgICAgICAgICBtQ29tcG9uZW50ID0gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICBTdXBlcjo6VGVhckRvd24oKTsKKyAgICB9CisKKyAgICBzdHJ1Y3Qgb3V0cHV0TWV0YURhdGEgeworICAgICAgICB1aW50NjRfdCB0aW1lc3RhbXBVczsKKyAgICAgICAgdWludDMyX3QgcmFuZ2VMZW5ndGg7CisgICAgfTsKKyAgICAvLyBjYWxsYmFjayBmdW5jdGlvbiB0byBwcm9jZXNzIG9uV29ya0RvbmUgcmVjZWl2ZWQgYnkgTGlzdGVuZXIKKyAgICB2b2lkIGhhbmRsZVdvcmtEb25lKHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4mIHdvcmtJdGVtcykgeworICAgICAgICBmb3IgKHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrIDogd29ya0l0ZW1zKSB7CisgICAgICAgICAgICAvLyBoYW5kbGUgY29uZmlndXJhdGlvbiBjaGFuZ2VzIGluIHdvcmsgZG9uZQorICAgICAgICAgICAgaWYgKCF3b3JrLT53b3JrbGV0cy5lbXB0eSgpICYmCisgICAgICAgICAgICAgICAgKHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUuc2l6ZSgpICE9IDApKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIkNvbmZpZyBVcGRhdGUiKTsKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IHVwZGF0ZXMgPQorICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUod29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZSk7CisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+IGNvbmZpZ1BhcmFtOworICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHVwZGF0ZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgQzJQYXJhbSogcGFyYW0gPSB1cGRhdGVzW2ldLmdldCgpOworICAgICAgICAgICAgICAgICAgICBpZiAoKHBhcmFtLT5pbmRleCgpID09IEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86Om91dHB1dDo6UEFSQU1fVFlQRSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIChwYXJhbS0+aW5kZXgoKSA9PSBDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86Om91dHB1dDo6UEFSQU1fVFlQRSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ1BhcmFtLnB1c2hfYmFjayhwYXJhbSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbUNvbXBvbmVudC0+Y29uZmlnKGNvbmZpZ1BhcmFtLCBDMl9ET05UX0JMT0NLLCAmZmFpbHVyZXMpOworICAgICAgICAgICAgICAgIEFTU0VSVF9FUShmYWlsdXJlcy5zaXplKCksIDB1KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1GcmFtZXNSZWNlaXZlZCsrOworICAgICAgICAgICAgbUVvcyA9ICh3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgJgorICAgICAgICAgICAgICAgICAgICBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSAhPSAwOworICAgICAgICAgICAgYXV0byBmcmFtZUluZGV4SXQgPQorICAgICAgICAgICAgICAgIHN0ZDo6ZmluZChtRmx1c2hlZEluZGljZXMuYmVnaW4oKSwgbUZsdXNoZWRJbmRpY2VzLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKSk7CisgICAgICAgICAgICBBTE9HVigiV29ya0RvbmU6IGZyYW1lSUQgcmVjZWl2ZWQgJWQiLAorICAgICAgICAgICAgICAgIChpbnQpd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpKTsKKworICAgICAgICAgICAgLy8gRm9yIGRlY29kZXIgY29tcG9uZW50cyBjdXJyZW50IHRpbWVzdGFtcCBhbHdheXMgZXhjZWVkcworICAgICAgICAgICAgLy8gcHJldmlvdXMgdGltZXN0YW1wCisgICAgICAgICAgICBib29sIGNvZGVjQ29uZmlnID0gKCh3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJGcmFtZURhdGE6OkZMQUdfQ09ERUNfQ09ORklHKSAhPSAwKTsKKyAgICAgICAgICAgIGlmICghY29kZWNDb25maWcgJiYKKyAgICAgICAgICAgICAgICAhd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgIEVYUEVDVF9HRSh3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbC50aW1lc3RhbXAucGVla3UoKSwKKyAgICAgICAgICAgICAgICAgICAgbVRpbWVzdGFtcFVzKTsKKyAgICAgICAgICAgICAgICBtVGltZXN0YW1wVXMgPQorICAgICAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbC50aW1lc3RhbXAucGVla3UoKTsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCByYW5nZUxlbmd0aCA9CisgICAgICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzWzBdLT5kYXRhKCkKKyAgICAgICAgICAgICAgICAgICAgLmxpbmVhckJsb2NrcygpLmZyb250KCkubWFwKCkuZ2V0KCkuY2FwYWNpdHkoKTsKKyAgICAgICAgICAgICAgICAvL0xpc3Qgb2YgdGltZXN0YW1wIHZhbHVlcyBhbmQgb3V0cHV0IHNpemUgdG8gY2FsY3VsYXRlIHRpbWVzdGFtcAorICAgICAgICAgICAgICAgIGlmIChtVGltZXN0YW1wRGV2VGVzdCkgeworICAgICAgICAgICAgICAgICAgICBvdXRwdXRNZXRhRGF0YSBtZXRhID0ge21UaW1lc3RhbXBVcywgcmFuZ2VMZW5ndGh9OworICAgICAgICAgICAgICAgICAgICBvQnVmZmVyTWV0YURhdGEucHVzaF9iYWNrKG1ldGEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgd29yay0+aW5wdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICAgICAgd29yay0+d29ya2xldHMuY2xlYXIoKTsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0eXBlZGVmIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gVUxvY2s7CisgICAgICAgICAgICAgICAgVUxvY2sgbChtUXVldWVMb2NrKTsKKyAgICAgICAgICAgICAgICBtV29ya1F1ZXVlLnB1c2hfYmFjayhzdGQ6Om1vdmUod29yaykpOworICAgICAgICAgICAgICAgIGlmICghbUZsdXNoZWRJbmRpY2VzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbUZsdXNoZWRJbmRpY2VzLmVyYXNlKGZyYW1lSW5kZXhJdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1RdWV1ZUNvbmRpdGlvbi5ub3RpZnlfYWxsKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBlbnVtIHN0YW5kYXJkQ29tcCB7CisgICAgICAgIHhhYWMsCisgICAgICAgIG1wMywKKyAgICAgICAgYW1ybmIsCisgICAgICAgIGFtcndiLAorICAgICAgICBhYWMsCisgICAgICAgIHZvcmJpcywKKyAgICAgICAgb3B1cywKKyAgICAgICAgcGNtLAorICAgICAgICBnNzExYWxhdywKKyAgICAgICAgZzcxMW1sYXcsCisgICAgICAgIGdzbSwKKyAgICAgICAgcmF3LAorICAgICAgICBmbGFjLAorICAgICAgICB1bmtub3duX2NvbXAsCisgICAgfTsKKworICAgIGJvb2wgbUVvczsKKyAgICBib29sIG1EaXNhYmxlVGVzdDsKKyAgICBib29sIG1UaW1lc3RhbXBEZXZUZXN0OworICAgIHN0YW5kYXJkQ29tcCBtQ29tcE5hbWU7CisgICAgdWludDY0X3QgbVRpbWVzdGFtcFVzOworICAgIHVpbnQzMl90IG1GcmFtZXNSZWNlaXZlZDsKKyAgICBzdGQ6Omxpc3Q8dWludDY0X3Q+IG1GbHVzaGVkSW5kaWNlczsKKyAgICBzdGQ6Omxpc3Q8dWludDY0X3Q+IG1UaW1lc3RhbXBVc2xpc3Q7CisgICAgOjphbmRyb2lkOjpMaXN0PG91dHB1dE1ldGFEYXRhPiBvQnVmZmVyTWV0YURhdGE7CisKKyAgICBDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCBtQmxvY2tQb29sSWQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiBtTGluZWFyUG9vbDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IG1MaW5lYXJBbGxvY2F0b3I7CisKKyAgICBzdGQ6Om11dGV4IG1RdWV1ZUxvY2s7CisgICAgc3RkOjpjb25kaXRpb25fdmFyaWFibGUgbVF1ZXVlQ29uZGl0aW9uOworICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gbVdvcmtRdWV1ZTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ+IG1DbGllbnQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6TGlzdGVuZXI+IG1MaXN0ZW5lcjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+IG1Db21wb25lbnQ7CisKKyAgIHByb3RlY3RlZDoKKyAgICBzdGF0aWMgdm9pZCBkZXNjcmlwdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgZGVzY3JpcHRpb24pIHsKKyAgICAgICAgUmVjb3JkUHJvcGVydHkoImRlc2NyaXB0aW9uIiwgZGVzY3JpcHRpb24pOworICAgIH0KK307CisKK3ZvaWQgdmFsaWRhdGVDb21wb25lbnQoCisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q29tcG9uZW50PiYgY29tcG9uZW50LAorICAgIENvZGVjMkF1ZGlvRGVjSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcCBjb21wTmFtZSwgYm9vbCYgZGlzYWJsZVRlc3QpIHsKKyAgICAvLyBWYWxpZGF0ZSBpdHMgYSBDMiBDb21wb25lbnQKKyAgICBpZiAoY29tcG9uZW50LT5nZXROYW1lKCkuZmluZCgiYzIiKSA9PSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICBBTE9HRSgiTm90IGEgYzIgY29tcG9uZW50Iik7CisgICAgICAgIGRpc2FibGVUZXN0ID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIFZhbGlkYXRlIGl0cyBub3QgYW4gZW5jb2RlciBhbmQgdGhlIGNvbXBvbmVudCB0byBiZSB0ZXN0ZWQgaXMgYXVkaW8KKyAgICBpZiAoY29tcG9uZW50LT5nZXROYW1lKCkuZmluZCgiZW5jb2RlciIpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgIEFMT0dFKCJFeHBlY3RlZCBEZWNvZGVyLCBnaXZlbiBFbmNvZGVyIik7CisgICAgICAgIGRpc2FibGVUZXN0ID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IHF1ZXJpZWQ7CisgICAgYzJfc3RhdHVzX3QgYzJlcnIgPQorICAgICAgICBjb21wb25lbnQtPnF1ZXJ5KHt9LCB7QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6aW5wdXQ6OlBBUkFNX1RZUEV9LAorICAgICAgICAgICAgICAgICAgICAgICAgIEMyX0RPTlRfQkxPQ0ssICZxdWVyaWVkKTsKKyAgICBpZiAoYzJlcnIgIT0gQzJfT0sgJiYgcXVlcmllZC5zaXplKCkgPT0gMCkgeworICAgICAgICBBTE9HRSgiUXVlcnkgbWVkaWEgdHlwZSBmYWlsZWQgPT4gJWQiLCBjMmVycik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgaW5wdXREb21haW4gPQorICAgICAgICAgICAgKChDMlN0cmVhbU1lZGlhVHlwZVNldHRpbmc6OmlucHV0KilxdWVyaWVkWzBdLmdldCgpKS0+bS52YWx1ZTsKKyAgICAgICAgaWYgKGlucHV0RG9tYWluLmZpbmQoImF1ZGlvLyIpID09IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgICAgICBBTE9HRSgiRXhwZWN0ZWQgQXVkaW8gQ29tcG9uZW50Iik7CisgICAgICAgICAgICBkaXNhYmxlVGVzdCA9IHRydWU7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBWYWxpZGF0ZXMgY29tcG9uZW50IG5hbWUKKyAgICBpZiAoY29tcE5hbWUgPT0gQ29kZWMyQXVkaW9EZWNIaWRsVGVzdDo6dW5rbm93bl9jb21wKSB7CisgICAgICAgIEFMT0dFKCJDb21wb25lbnQgSW5WYWxpZCIpOworICAgICAgICBkaXNhYmxlVGVzdCA9IHRydWU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQUxPR1YoIkNvbXBvbmVudCBWYWxpZCIpOworfQorCisvLyBTZXQgRGVmYXVsdCBjb25maWcgcGFyYW0uCit2b2lkIHNldHVwQ29uZmlnUGFyYW0oCisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q29tcG9uZW50PiYgY29tcG9uZW50LAorICAgIGludDMyX3QqIGJpdFN0cmVhbUluZm8pIHsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgQzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0IHNhbXBsZVJhdGVJbmZvKDB1LCBiaXRTdHJlYW1JbmZvWzBdKTsKKyAgICBDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86Om91dHB1dCBjaGFubmVsQ291bnRJbmZvKDB1LCBiaXRTdHJlYW1JbmZvWzFdKTsKKworICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiBjb25maWdQYXJhbXsmc2FtcGxlUmF0ZUluZm8sICZjaGFubmVsQ291bnRJbmZvfTsKKyAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPQorICAgICAgICBjb21wb25lbnQtPmNvbmZpZyhjb25maWdQYXJhbSwgQzJfRE9OVF9CTE9DSywgJmZhaWx1cmVzKTsKKyAgICBBU1NFUlRfRVEoZmFpbHVyZXMuc2l6ZSgpLCAwdSk7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgQzJfT0spOworfQorCisvLyBJbiBkZWNvZGVyIGNvbXBvbmVudHMsIG9mdGVuIHRoZSBpbnB1dCBwYXJhbWV0ZXJzIGdldCB1cGRhdGVkIHVwb24KKy8vIHBhcnNpbmcgdGhlIGhlYWRlciBvZiBlbGVtZW50YXJ5IHN0cmVhbS4gQ2xpZW50IG5lZWRzIHRvIGNvbGxlY3QgdGhpcworLy8gaW5mb3JtYXRpb24gYW5kIHJlY29uZmlndXJlCit2b2lkIGdldElucHV0Q2hhbm5lbEluZm8oCisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q29tcG9uZW50PiYgY29tcG9uZW50LAorICAgIENvZGVjMkF1ZGlvRGVjSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcCBjb21wTmFtZSwgaW50MzJfdCogYml0U3RyZWFtSW5mbykgeworICAgIC8vIHF1ZXJ5IG5TYW1wbGVSYXRlIGFuZCBuQ2hhbm5lbHMKKyAgICBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8QzJQYXJhbTo6SW5kZXg+IGluZGljZXN7CisgICAgICAgIEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86Om91dHB1dDo6UEFSQU1fVFlQRSwKKyAgICAgICAgQzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjpvdXRwdXQ6OlBBUkFNX1RZUEUsCisgICAgfTsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IGluUGFyYW1zOworICAgIGMyX3N0YXR1c190IHN0YXR1cyA9CisgICAgICAgIGNvbXBvbmVudC0+cXVlcnkoe30sIGluZGljZXMsIEMyX0RPTlRfQkxPQ0ssICZpblBhcmFtcyk7CisgICAgaWYgKHN0YXR1cyAhPSBDMl9PSyAmJiBpblBhcmFtcy5zaXplKCkgPT0gMCkgeworICAgICAgICBBTE9HRSgiUXVlcnkgbWVkaWEgdHlwZSBmYWlsZWQgPT4gJWQiLCBzdGF0dXMpOworICAgICAgICBBU1NFUlRfVFJVRShmYWxzZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc2l6ZV90IG9mZnNldCA9IHNpemVvZihDMlBhcmFtKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpblBhcmFtcy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgQzJQYXJhbSogcGFyYW0gPSBpblBhcmFtc1tpXS5nZXQoKTsKKyAgICAgICAgICAgIGJpdFN0cmVhbUluZm9baV0gPSAqKGludDMyX3QqKSgodWludDhfdCopcGFyYW0gKyBvZmZzZXQpOworICAgICAgICB9CisgICAgICAgIHN3aXRjaCAoY29tcE5hbWUpIHsKKyAgICAgICAgICAgIGNhc2UgQ29kZWMyQXVkaW9EZWNIaWRsVGVzdDo6YW1ybmI6IHsKKyAgICAgICAgICAgICAgICBBU1NFUlRfRVEoYml0U3RyZWFtSW5mb1swXSwgODAwMCk7CisgICAgICAgICAgICAgICAgQVNTRVJUX0VRKGJpdFN0cmVhbUluZm9bMV0sIDEpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBDb2RlYzJBdWRpb0RlY0hpZGxUZXN0OjphbXJ3YjogeworICAgICAgICAgICAgICAgIEFTU0VSVF9FUShiaXRTdHJlYW1JbmZvWzBdLCAxNjAwMCk7CisgICAgICAgICAgICAgICAgQVNTRVJUX0VRKGJpdFN0cmVhbUluZm9bMV0sIDEpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBDb2RlYzJBdWRpb0RlY0hpZGxUZXN0Ojpnc206IHsKKyAgICAgICAgICAgICAgICBBU1NFUlRfRVEoYml0U3RyZWFtSW5mb1swXSwgODAwMCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorCisvLyBMb29rVXBUYWJsZSBvZiBjbGlwcyBhbmQgbWV0YWRhdGEgZm9yIGNvbXBvbmVudCB0ZXN0aW5nCit2b2lkIEdldFVSTEZvckNvbXBvbmVudChDb2RlYzJBdWRpb0RlY0hpZGxUZXN0OjpzdGFuZGFyZENvbXAgY29tcCwgY2hhciogbVVSTCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqIGluZm8pIHsKKyAgICBzdHJ1Y3QgQ29tcFRvVVJMIHsKKyAgICAgICAgQ29kZWMyQXVkaW9EZWNIaWRsVGVzdDo6c3RhbmRhcmRDb21wIGNvbXA7CisgICAgICAgIGNvbnN0IGNoYXIqIG1VUkw7CisgICAgICAgIGNvbnN0IGNoYXIqIGluZm87CisgICAgfTsKKyAgICBzdGF0aWMgY29uc3QgQ29tcFRvVVJMIGtDb21wVG9VUkxbXSA9IHsKKyAgICAgICAge0NvZGVjMkF1ZGlvRGVjSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcDo6eGFhYywKKyAgICAgICAgICJiYmJfYWFjX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHouYWFjIiwKKyAgICAgICAgICJiYmJfYWFjX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHouaW5mbyJ9LAorICAgICAgICB7Q29kZWMyQXVkaW9EZWNIaWRsVGVzdDo6c3RhbmRhcmRDb21wOjptcDMsCisgICAgICAgICAiYmJiX21wM19zdGVyZW9fMTkya2Jwc180ODAwMGh6Lm1wMyIsCisgICAgICAgICAiYmJiX21wM19zdGVyZW9fMTkya2Jwc180ODAwMGh6LmluZm8ifSwKKyAgICAgICAge0NvZGVjMkF1ZGlvRGVjSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcDo6YWFjLAorICAgICAgICAgImJiYl9hYWNfc3RlcmVvXzEyOGticHNfNDgwMDBoei5hYWMiLAorICAgICAgICAgImJiYl9hYWNfc3RlcmVvXzEyOGticHNfNDgwMDBoei5pbmZvIn0sCisgICAgICAgIHtDb2RlYzJBdWRpb0RlY0hpZGxUZXN0OjpzdGFuZGFyZENvbXA6OmFtcm5iLAorICAgICAgICAgInNpbmVfYW1ybmJfMWNoXzEya2Jwc184MDAwaHouYW1ybmIiLAorICAgICAgICAgInNpbmVfYW1ybmJfMWNoXzEya2Jwc184MDAwaHouaW5mbyJ9LAorICAgICAgICB7Q29kZWMyQXVkaW9EZWNIaWRsVGVzdDo6c3RhbmRhcmRDb21wOjphbXJ3YiwKKyAgICAgICAgICJiYmJfYW1yd2JfMWNoXzE0a2Jwc18xNjAwMGh6LmFtcndiIiwKKyAgICAgICAgICJiYmJfYW1yd2JfMWNoXzE0a2Jwc18xNjAwMGh6LmluZm8ifSwKKyAgICAgICAge0NvZGVjMkF1ZGlvRGVjSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcDo6dm9yYmlzLAorICAgICAgICAgImJiYl92b3JiaXNfc3RlcmVvXzEyOGticHNfNDgwMDBoei52b3JiaXMiLAorICAgICAgICAgImJiYl92b3JiaXNfc3RlcmVvXzEyOGticHNfNDgwMDBoei5pbmZvIn0sCisgICAgICAgIHtDb2RlYzJBdWRpb0RlY0hpZGxUZXN0OjpzdGFuZGFyZENvbXA6Om9wdXMsCisgICAgICAgICAiYmJiX29wdXNfc3RlcmVvXzEyOGticHNfNDgwMDBoei5vcHVzIiwKKyAgICAgICAgICJiYmJfb3B1c19zdGVyZW9fMTI4a2Jwc180ODAwMGh6LmluZm8ifSwKKyAgICAgICAge0NvZGVjMkF1ZGlvRGVjSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcDo6ZzcxMWFsYXcsCisgICAgICAgICJiYmJfZzcxMWFsYXdfMWNoXzhraHoucmF3IiwKKyAgICAgICAgICJiYmJfZzcxMWFsYXdfMWNoXzhraHouaW5mbyJ9LAorICAgICAgICB7Q29kZWMyQXVkaW9EZWNIaWRsVGVzdDo6c3RhbmRhcmRDb21wOjpnNzExbWxhdywKKyAgICAgICAgImJiYl9nNzExbXVsYXdfMWNoXzhraHoucmF3IiwKKyAgICAgICAgICJiYmJfZzcxMW11bGF3XzFjaF84a2h6LmluZm8ifSwKKyAgICAgICAge0NvZGVjMkF1ZGlvRGVjSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcDo6Z3NtLAorICAgICAgICAiYmJiX2dzbV8xY2hfOGtoel8xM2ticHMucmF3IiwKKyAgICAgICAgICJiYmJfZ3NtXzFjaF84a2h6XzEza2Jwcy5pbmZvIn0sCisgICAgICAgIHtDb2RlYzJBdWRpb0RlY0hpZGxUZXN0OjpzdGFuZGFyZENvbXA6OnJhdywKKyAgICAgICAgImJiYl9yYXdfMWNoXzhraHpfczMybGUucmF3IiwKKyAgICAgICAgICJiYmJfcmF3XzFjaF84a2h6X3MzMmxlLmluZm8ifSwKKyAgICAgICAge0NvZGVjMkF1ZGlvRGVjSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcDo6ZmxhYywKKyAgICAgICAgICJiYmJfZmxhY19zdGVyZW9fNjgwa2Jwc180ODAwMGh6LmZsYWMiLAorICAgICAgICAgImJiYl9mbGFjX3N0ZXJlb182ODBrYnBzXzQ4MDAwaHouaW5mbyJ9LAorICAgIH07CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemVvZihrQ29tcFRvVVJMKSAvIHNpemVvZihrQ29tcFRvVVJMWzBdKTsgKytpKSB7CisgICAgICAgIGlmIChrQ29tcFRvVVJMW2ldLmNvbXAgPT0gY29tcCkgeworICAgICAgICAgICAgc3RyY2F0KG1VUkwsIGtDb21wVG9VUkxbaV0ubVVSTCk7CisgICAgICAgICAgICBzdHJjYXQoaW5mbywga0NvbXBUb1VSTFtpXS5pbmZvKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBkZWNvZGVORnJhbWVzKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gJmNvbXBvbmVudCwKKyAgICAgICAgICAgICAgICAgICBzdGQ6Om11dGV4ICZxdWV1ZUxvY2ssIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlICZxdWV1ZUNvbmRpdGlvbiwKKyAgICAgICAgICAgICAgICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+ICZ3b3JrUXVldWUsCisgICAgICAgICAgICAgICAgICAgc3RkOjpsaXN0PHVpbnQ2NF90PiAmZmx1c2hlZEluZGljZXMsCisgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmbGluZWFyUG9vbCwKKyAgICAgICAgICAgICAgICAgICBzdGQ6Omlmc3RyZWFtJiBlbGVTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6VmVjdG9yPEZyYW1lSW5mbz4qIEluZm8sCisgICAgICAgICAgICAgICAgICAgaW50IG9mZnNldCwgaW50IHJhbmdlLCBib29sIHNpZ25hbEVPUyA9IHRydWUpIHsKKyAgICB0eXBlZGVmIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gVUxvY2s7CisgICAgaW50IGZyYW1lSUQgPSBvZmZzZXQ7CisgICAgaW50IG1heFJldHJ5ID0gMDsKKyAgICB3aGlsZSAoMSkgeworICAgICAgICBpZiAoZnJhbWVJRCA9PSAoaW50KUluZm8tPnNpemUoKSB8fCBmcmFtZUlEID09IChvZmZzZXQgKyByYW5nZSkpIGJyZWFrOworICAgICAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+IHdvcms7CisgICAgICAgIC8vIFByZXBhcmUgQzJXb3JrCisgICAgICAgIHdoaWxlICghd29yayAmJiAobWF4UmV0cnkgPCBNQVhfUkVUUlkpKSB7CisgICAgICAgICAgICBVTG9jayBsKHF1ZXVlTG9jayk7CisgICAgICAgICAgICBpZiAoIXdvcmtRdWV1ZS5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgd29yay5zd2FwKHdvcmtRdWV1ZS5mcm9udCgpKTsKKyAgICAgICAgICAgICAgICB3b3JrUXVldWUucG9wX2Zyb250KCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHF1ZXVlQ29uZGl0aW9uLndhaXRfZm9yKGwsIFRJTUVfT1VUKTsKKyAgICAgICAgICAgICAgICBtYXhSZXRyeSsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghd29yayAmJiAobWF4UmV0cnkgPj0gTUFYX1JFVFJZKSkgeworICAgICAgICAgICAgQVNTRVJUX1RSVUUoZmFsc2UpIDw8ICJXYWl0IGZvciBnZW5lcmF0aW5nIEMyV29yayBleGNlZWRlZCB0aW1lb3V0IjsKKyAgICAgICAgfQorICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcCA9ICgqSW5mbylbZnJhbWVJRF0udGltZXN0YW1wOworICAgICAgICBpZiAoKCpJbmZvKVtmcmFtZUlEXS5mbGFncykgZmxhZ3MgPSAxdSA8PCAoKCpJbmZvKVtmcmFtZUlEXS5mbGFncyAtIDEpOworICAgICAgICBpZiAoc2lnbmFsRU9TICYmICgoZnJhbWVJRCA9PSAoaW50KUluZm8tPnNpemUoKSAtIDEpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgIChmcmFtZUlEID09IChvZmZzZXQgKyByYW5nZSAtIDEpKSkpCisgICAgICAgICAgICBmbGFncyB8PSBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNOworCisgICAgICAgIHdvcmstPmlucHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KWZsYWdzOworICAgICAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcCA9IHRpbWVzdGFtcDsKKyAgICAgICAgd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4ID0gZnJhbWVJRDsKKyAgICAgICAgeworICAgICAgICAgICAgVUxvY2sgbChxdWV1ZUxvY2spOworICAgICAgICAgICAgZmx1c2hlZEluZGljZXMuZW1wbGFjZV9iYWNrKGZyYW1lSUQpOworICAgICAgICB9CisgICAgICAgIGludCBzaXplID0gKCpJbmZvKVtmcmFtZUlEXS5ieXRlc0NvdW50OworICAgICAgICBjaGFyKiBkYXRhID0gKGNoYXIqKW1hbGxvYyhzaXplKTsKKworICAgICAgICBlbGVTdHJlYW0ucmVhZChkYXRhLCBzaXplKTsKKyAgICAgICAgQVNTRVJUX0VRKGVsZVN0cmVhbS5nY291bnQoKSwgc2l6ZSk7CisKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IGJsb2NrOworICAgICAgICBBU1NFUlRfRVEoQzJfT0ssCisgICAgICAgICAgICAgICAgICBsaW5lYXJQb29sLT5mZXRjaExpbmVhckJsb2NrKAorICAgICAgICAgICAgICAgICAgICAgIHNpemUsIHtDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFfSwKKyAgICAgICAgICAgICAgICAgICAgICAmYmxvY2spKTsKKyAgICAgICAgQVNTRVJUX1RSVUUoYmxvY2spOworCisgICAgICAgIC8vIFdyaXRlIFZpZXcKKyAgICAgICAgQzJXcml0ZVZpZXcgdmlldyA9IGJsb2NrLT5tYXAoKS5nZXQoKTsKKyAgICAgICAgaWYgKHZpZXcuZXJyb3IoKSAhPSBDMl9PSykgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJDMkxpbmVhckJsb2NrOjptYXAoKSBmYWlsZWQgOiAlZCIsIHZpZXcuZXJyb3IoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBBU1NFUlRfRVEoKHNpemVfdClzaXplLCB2aWV3LmNhcGFjaXR5KCkpOworICAgICAgICBBU1NFUlRfRVEoMHUsIHZpZXcub2Zmc2V0KCkpOworICAgICAgICBBU1NFUlRfRVEoKHNpemVfdClzaXplLCB2aWV3LnNpemUoKSk7CisKKyAgICAgICAgbWVtY3B5KHZpZXcuYmFzZSgpLCBkYXRhLCBzaXplKTsKKworICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuZW1wbGFjZV9iYWNrKG5ldyBMaW5lYXJCdWZmZXIoYmxvY2spKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuY2xlYXIoKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZW1wbGFjZV9iYWNrKG5ldyBDMldvcmtsZXQpOworICAgICAgICBmcmVlKGRhdGEpOworCisgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gaXRlbXM7CisgICAgICAgIGl0ZW1zLnB1c2hfYmFjayhzdGQ6Om1vdmUod29yaykpOworCisgICAgICAgIC8vIERPIFRIRSBERUNPRElORworICAgICAgICBBU1NFUlRfRVEoY29tcG9uZW50LT5xdWV1ZSgmaXRlbXMpLCBDMl9PSyk7CisgICAgICAgIEFMT0dWKCJGcmFtZSAjJWQgc2l6ZSA9ICVkIHF1ZXVlZCIsIGZyYW1lSUQsIHNpemUpOworICAgICAgICBmcmFtZUlEKys7CisgICAgICAgIG1heFJldHJ5ID0gMDsKKyAgICB9Cit9CisKK3ZvaWQgd2FpdE9uSW5wdXRDb25zdW1wdGlvbihzdGQ6Om11dGV4JiBxdWV1ZUxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpjb25kaXRpb25fdmFyaWFibGUmIHF1ZXVlQ29uZGl0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4mIHdvcmtRdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgYnVmZmVyQ291bnQgPSBNQVhfSU5QVVRfQlVGRkVSUykgeworICAgIHR5cGVkZWYgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBVTG9jazsKKyAgICB1aW50MzJfdCBxdWV1ZVNpemU7CisgICAgdWludDMyX3QgbWF4UmV0cnkgPSAwOworICAgIHsKKyAgICAgICAgVUxvY2sgbChxdWV1ZUxvY2spOworICAgICAgICBxdWV1ZVNpemUgPSB3b3JrUXVldWUuc2l6ZSgpOworICAgIH0KKyAgICB3aGlsZSAoKG1heFJldHJ5IDwgTUFYX1JFVFJZKSAmJiAocXVldWVTaXplIDwgYnVmZmVyQ291bnQpKSB7CisgICAgICAgIFVMb2NrIGwocXVldWVMb2NrKTsKKyAgICAgICAgaWYgKHF1ZXVlU2l6ZSAhPSB3b3JrUXVldWUuc2l6ZSgpKSB7CisgICAgICAgICAgICBxdWV1ZVNpemUgPSB3b3JrUXVldWUuc2l6ZSgpOworICAgICAgICAgICAgbWF4UmV0cnkgPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcXVldWVDb25kaXRpb24ud2FpdF9mb3IobCwgVElNRV9PVVQpOworICAgICAgICAgICAgbWF4UmV0cnkrKzsKKyAgICAgICAgfQorICAgIH0KK30KKworVEVTVF9GKENvZGVjMkF1ZGlvRGVjSGlkbFRlc3QsIHZhbGlkYXRlQ29tcE5hbWUpIHsKKyAgICBpZiAobURpc2FibGVUZXN0KSByZXR1cm47CisgICAgQUxPR1YoIkNoZWNrcyBpZiB0aGUgZ2l2ZW4gY29tcG9uZW50IGlzIGEgdmFsaWQgYXVkaW8gY29tcG9uZW50Iik7CisgICAgdmFsaWRhdGVDb21wb25lbnQobUNvbXBvbmVudCwgbUNvbXBOYW1lLCBtRGlzYWJsZVRlc3QpOworICAgIEFTU0VSVF9FUShtRGlzYWJsZVRlc3QsIGZhbHNlKTsKK30KKworVEVTVF9GKENvZGVjMkF1ZGlvRGVjSGlkbFRlc3QsIGNvbmZpZ0NvbXApIHsKKyAgICBkZXNjcmlwdGlvbigiVGVzdHMgY29tcG9uZW50IHNwZWNpZmljIGNvbmZpZ3VyYXRpb24iKTsKKyAgICBpZiAobURpc2FibGVUZXN0KSByZXR1cm47CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0YXJ0KCksIEMyX09LKTsKKyAgICBpbnQzMl90IGJpdFN0cmVhbUluZm9bMl0gPSB7MH07CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgIGdldElucHV0Q2hhbm5lbEluZm8obUNvbXBvbmVudCwgbUNvbXBOYW1lLCBiaXRTdHJlYW1JbmZvKSk7CisgICAgc2V0dXBDb25maWdQYXJhbShtQ29tcG9uZW50LCBiaXRTdHJlYW1JbmZvKTsKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RvcCgpLCBDMl9PSyk7Cit9CisKK1RFU1RfRihDb2RlYzJBdWRpb0RlY0hpZGxUZXN0LCBEZWNvZGVUZXN0KSB7CisgICAgZGVzY3JpcHRpb24oIkRlY29kZXMgaW5wdXQgZmlsZSIpOworICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKKworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdGFydCgpLCBDMl9PSyk7CisgICAgbVRpbWVzdGFtcERldlRlc3QgPSB0cnVlOworICAgIGNoYXIgbVVSTFs1MTJdLCBpbmZvWzUxMl07CisgICAgc3RkOjppZnN0cmVhbSBlbGVTdHJlYW0sIGVsZUluZm87CisKKyAgICBzdHJjcHkobVVSTCwgZ0Vudi0+Z2V0UmVzKCkuY19zdHIoKSk7CisgICAgc3RyY3B5KGluZm8sIGdFbnYtPmdldFJlcygpLmNfc3RyKCkpOworICAgIEdldFVSTEZvckNvbXBvbmVudChtQ29tcE5hbWUsIG1VUkwsIGluZm8pOworCisgICAgZWxlSW5mby5vcGVuKGluZm8pOworICAgIEFTU0VSVF9FUShlbGVJbmZvLmlzX29wZW4oKSwgdHJ1ZSk7CisgICAgYW5kcm9pZDo6VmVjdG9yPEZyYW1lSW5mbz4gSW5mbzsKKyAgICBpbnQgYnl0ZXNDb3VudCA9IDA7CisgICAgdWludDMyX3QgZmxhZ3MgPSAwOworICAgIHVpbnQzMl90IHRpbWVzdGFtcCA9IDA7CisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgaWYgKCEoZWxlSW5mbyA+PiBieXRlc0NvdW50KSkgYnJlYWs7CisgICAgICAgIGVsZUluZm8gPj4gZmxhZ3M7CisgICAgICAgIGVsZUluZm8gPj4gdGltZXN0YW1wOworICAgICAgICBib29sIGNvZGVjQ29uZmlnID0KKyAgICAgICAgICAgICgoMSA8PCAoZmxhZ3MgLSAxKSkgJiBDMkZyYW1lRGF0YTo6RkxBR19DT0RFQ19DT05GSUcpICE9IDA7CisgICAgICAgIGlmIChtVGltZXN0YW1wRGV2VGVzdCAmJiAhY29kZWNDb25maWcpCisgICAgICAgICAgICBtVGltZXN0YW1wVXNsaXN0LnB1c2hfYmFjayh0aW1lc3RhbXApOworICAgICAgICBJbmZvLnB1c2hfYmFjayh7Ynl0ZXNDb3VudCwgZmxhZ3MsIHRpbWVzdGFtcH0pOworICAgIH0KKyAgICBlbGVJbmZvLmNsb3NlKCk7CisgICAgaW50MzJfdCBiaXRTdHJlYW1JbmZvWzJdID0gezB9OworICAgIGlmIChtQ29tcE5hbWUgPT0gcmF3KSB7CisgICAgICAgIGJpdFN0cmVhbUluZm9bMF0gPSA4MDAwOworICAgICAgICBiaXRTdHJlYW1JbmZvWzFdID0gMTsKKyAgICB9IGVsc2UgeworICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgICAgIGdldElucHV0Q2hhbm5lbEluZm8obUNvbXBvbmVudCwgbUNvbXBOYW1lLCBiaXRTdHJlYW1JbmZvKSk7CisgICAgfQorICAgIHNldHVwQ29uZmlnUGFyYW0obUNvbXBvbmVudCwgYml0U3RyZWFtSW5mbyk7CisgICAgQUxPR1YoIm1VUkwgOiAlcyIsIG1VUkwpOworICAgIGVsZVN0cmVhbS5vcGVuKG1VUkwsIHN0ZDo6aWZzdHJlYW06OmJpbmFyeSk7CisgICAgQVNTRVJUX0VRKGVsZVN0cmVhbS5pc19vcGVuKCksIHRydWUpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKGRlY29kZU5GcmFtZXMoCisgICAgICAgIG1Db21wb25lbnQsIG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwgbUZsdXNoZWRJbmRpY2VzLAorICAgICAgICBtTGluZWFyUG9vbCwgZWxlU3RyZWFtLCAmSW5mbywgMCwgKGludClJbmZvLnNpemUoKSkpOworICAgIC8vIGJsb2NraW5nIGNhbGwgdG8gZW5zdXJlcyBhcHBsaWNhdGlvbiB0byBXYWl0IHRpbGwgYWxsIHRoZSBpbnB1dHMgYXJlCisgICAgLy8gY29uc3VtZWQKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgd2FpdE9uSW5wdXRDb25zdW1wdGlvbihtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUpKTsKKyAgICBlbGVTdHJlYW0uY2xvc2UoKTsKKyAgICBpZiAobUZyYW1lc1JlY2VpdmVkICE9IEluZm8uc2l6ZSgpKSB7CisgICAgICAgIEFMT0dFKCJJbnB1dCBidWZmZXIgY291bnQgYW5kIE91dHB1dCBidWZmZXIgY291bnQgbWlzbWF0Y2giKTsKKyAgICAgICAgQUxPR0UoImZyYW1lc1JlY2VpdmVkIDogJWQgaW5wdXRGcmFtZXMgOiAlenUiLCBtRnJhbWVzUmVjZWl2ZWQsCisgICAgICAgICAgICAgIEluZm8uc2l6ZSgpKTsKKyAgICAgICAgQVNTRVJUX1RSVUUoZmFsc2UpOworICAgIH0KKyAgICBBU1NFUlRfRVEobUVvcywgdHJ1ZSk7CisgICAgaWYgKG1UaW1lc3RhbXBEZXZUZXN0KSB7CisgICAgICAgIHVpbnQ2NF90IGV4cFRzOworICAgICAgICB1aW50MzJfdCBzYW1wbGVzUmVjZWl2ZWQgPSAwOworICAgICAgICAvLyBVcGRhdGUgU2FtcGxlUmF0ZSBhbmQgQ2hhbm5lbENvdW50CisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICAgICAgZ2V0SW5wdXRDaGFubmVsSW5mbyhtQ29tcG9uZW50LCBtQ29tcE5hbWUsIGJpdFN0cmVhbUluZm8pKTsKKyAgICAgICAgaW50IG5TYW1wbGVSYXRlID0gYml0U3RyZWFtSW5mb1swXTsKKyAgICAgICAgaW50IG5DaGFubmVscyA9IGJpdFN0cmVhbUluZm9bMV07CisgICAgICAgIHN0ZDo6bGlzdDx1aW50NjRfdD46Oml0ZXJhdG9yIGl0SW4gPSBtVGltZXN0YW1wVXNsaXN0LmJlZ2luKCk7CisgICAgICAgIGFuZHJvaWQ6Okxpc3Q8b3V0cHV0TWV0YURhdGE+OjppdGVyYXRvciBpdE91dCA9IG9CdWZmZXJNZXRhRGF0YS5iZWdpbigpOworICAgICAgICBFWFBFQ1RfRVEoKml0SW4sIGl0T3V0LT50aW1lc3RhbXBVcyk7CisgICAgICAgIGV4cFRzID0gKml0SW47CisgICAgICAgIHdoaWxlIChpdE91dCAhPSBvQnVmZmVyTWV0YURhdGEuZW5kKCkpIHsKKyAgICAgICAgICAgIEVYUEVDVF9FUShleHBUcywgaXRPdXQtPnRpbWVzdGFtcFVzKTsKKyAgICAgICAgICAgIGlmIChleHBUcyAhPSBpdE91dC0+dGltZXN0YW1wVXMpIGJyZWFrOworICAgICAgICAgICAgLy8gYnVmZmVyIHNhbXBsZXMgPSAoKHRvdGFsIGJ5dGVzKSAvIChhYyAqIChiaXRzIHBlciBzYW1wbGUgLyA4KSkKKyAgICAgICAgICAgIHNhbXBsZXNSZWNlaXZlZCArPSAoKGl0T3V0LT5yYW5nZUxlbmd0aCkgLyAobkNoYW5uZWxzICogMikpOworICAgICAgICAgICAgZXhwVHMgPSBzYW1wbGVzUmVjZWl2ZWQgKiAxMDAwMDAwbGwgLyBuU2FtcGxlUmF0ZTsKKyAgICAgICAgICAgIGl0T3V0Kys7CisgICAgICAgIH0KKyAgICAgICAgaXRJbiA9IG1UaW1lc3RhbXBVc2xpc3QuZW5kKCk7CisgICAgICAgIC0taXRJbjsKKyAgICAgICAgRVhQRUNUX0dUKGV4cFRzLCAqaXRJbik7CisgICAgICAgIG9CdWZmZXJNZXRhRGF0YS5jbGVhcigpOworICAgICAgICBtVGltZXN0YW1wVXNsaXN0LmNsZWFyKCk7CisgICAgfQorICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdG9wKCksIEMyX09LKTsKK30KKworLy8gdGh1bWJuYWlsIHRlc3QKK1RFU1RfRihDb2RlYzJBdWRpb0RlY0hpZGxUZXN0LCBUaHVtYm5haWxUZXN0KSB7CisgICAgZGVzY3JpcHRpb24oIlRlc3QgUmVxdWVzdCBmb3IgdGh1bWJuYWlsIik7CisgICAgaWYgKG1EaXNhYmxlVGVzdCkgcmV0dXJuOworCisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0YXJ0KCksIEMyX09LKTsKKyAgICBjaGFyIG1VUkxbNTEyXSwgaW5mb1s1MTJdOworICAgIHN0ZDo6aWZzdHJlYW0gZWxlU3RyZWFtLCBlbGVJbmZvOworCisgICAgc3RyY3B5KG1VUkwsIGdFbnYtPmdldFJlcygpLmNfc3RyKCkpOworICAgIHN0cmNweShpbmZvLCBnRW52LT5nZXRSZXMoKS5jX3N0cigpKTsKKyAgICBHZXRVUkxGb3JDb21wb25lbnQobUNvbXBOYW1lLCBtVVJMLCBpbmZvKTsKKworICAgIGVsZUluZm8ub3BlbihpbmZvKTsKKyAgICBBU1NFUlRfRVEoZWxlSW5mby5pc19vcGVuKCksIHRydWUpOworICAgIGFuZHJvaWQ6OlZlY3RvcjxGcmFtZUluZm8+IEluZm87CisgICAgaW50IGJ5dGVzQ291bnQgPSAwOworICAgIHVpbnQzMl90IGZsYWdzID0gMDsKKyAgICB1aW50MzJfdCB0aW1lc3RhbXAgPSAwOworICAgIHdoaWxlICgxKSB7CisgICAgICAgIGlmICghKGVsZUluZm8gPj4gYnl0ZXNDb3VudCkpIGJyZWFrOworICAgICAgICBlbGVJbmZvID4+IGZsYWdzOworICAgICAgICBlbGVJbmZvID4+IHRpbWVzdGFtcDsKKyAgICAgICAgSW5mby5wdXNoX2JhY2soe2J5dGVzQ291bnQsIGZsYWdzLCB0aW1lc3RhbXB9KTsKKyAgICB9CisgICAgZWxlSW5mby5jbG9zZSgpOworICAgIGludDMyX3QgYml0U3RyZWFtSW5mb1syXSA9IHswfTsKKyAgICBpZiAobUNvbXBOYW1lID09IHJhdykgeworICAgICAgICBiaXRTdHJlYW1JbmZvWzBdID0gODAwMDsKKyAgICAgICAgYml0U3RyZWFtSW5mb1sxXSA9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgICAgICBnZXRJbnB1dENoYW5uZWxJbmZvKG1Db21wb25lbnQsIG1Db21wTmFtZSwgYml0U3RyZWFtSW5mbykpOworICAgIH0KKyAgICBzZXR1cENvbmZpZ1BhcmFtKG1Db21wb25lbnQsIGJpdFN0cmVhbUluZm8pOworICAgIEFMT0dWKCJtVVJMIDogJXMiLCBtVVJMKTsKKworICAgIC8vIHJlcXVlc3QgRU9TIGZvciB0aHVtYm5haWwKKyAgICAvLyBzaWduYWwgRU9TIGZsYWcgd2l0aCBsYXN0IGZyYW1lCisgICAgc2l6ZV90IGkgPSAtMTsKKyAgICBkbyB7CisgICAgICAgIGkrKzsKKyAgICAgICAgZmxhZ3MgPSAwOworICAgICAgICBpZiAoSW5mb1tpXS5mbGFncykgZmxhZ3MgPSAxdSA8PCAoSW5mb1tpXS5mbGFncyAtIDEpOworCisgICAgfSB3aGlsZSAoIShmbGFncyAmIFNZTkNfRlJBTUUpKTsKKyAgICBlbGVTdHJlYW0ub3BlbihtVVJMLCBzdGQ6Omlmc3RyZWFtOjpiaW5hcnkpOworICAgIEFTU0VSVF9FUShlbGVTdHJlYW0uaXNfb3BlbigpLCB0cnVlKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShkZWNvZGVORnJhbWVzKAorICAgICAgICBtQ29tcG9uZW50LCBtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsIG1GbHVzaGVkSW5kaWNlcywKKyAgICAgICAgbUxpbmVhclBvb2wsIGVsZVN0cmVhbSwgJkluZm8sIDAsIGkgKyAxKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgIHdhaXRPbklucHV0Q29uc3VtcHRpb24obVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlKSk7CisgICAgZWxlU3RyZWFtLmNsb3NlKCk7CisgICAgRVhQRUNUX0dFKG1GcmFtZXNSZWNlaXZlZCwgMVUpOworICAgIEFTU0VSVF9FUShtRW9zLCB0cnVlKTsKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RvcCgpLCBDMl9PSyk7Cit9CisKK1RFU1RfRihDb2RlYzJBdWRpb0RlY0hpZGxUZXN0LCBFT1NUZXN0KSB7CisgICAgZGVzY3JpcHRpb24oIlRlc3QgZW1wdHkgaW5wdXQgYnVmZmVyIHdpdGggRU9TIGZsYWciKTsKKyAgICBpZiAobURpc2FibGVUZXN0KSByZXR1cm47CisgICAgdHlwZWRlZiBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IFVMb2NrOworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdGFydCgpLCBDMl9PSyk7CisgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gd29yazsKKyAgICAvLyBQcmVwYXJlIEMyV29yaworICAgIHsKKyAgICAgICAgVUxvY2sgbChtUXVldWVMb2NrKTsKKyAgICAgICAgaWYgKCFtV29ya1F1ZXVlLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIHdvcmsuc3dhcChtV29ya1F1ZXVlLmZyb250KCkpOworICAgICAgICAgICAgbVdvcmtRdWV1ZS5wb3BfZnJvbnQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFTU0VSVF9UUlVFKGZhbHNlKSA8PCAibVdvcmtRdWV1ZSBFbXB0eSBhdCB0aGUgc3RhcnQgb2YgdGVzdCI7CisgICAgICAgIH0KKyAgICB9CisgICAgQVNTRVJUX05FKHdvcmssIG51bGxwdHIpOworCisgICAgd29yay0+aW5wdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTTsKKyAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcCA9IDA7CisgICAgd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4ID0gMDsKKyAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5lbXBsYWNlX2JhY2sobmV3IEMyV29ya2xldCk7CisKKyAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IGl0ZW1zOworICAgIGl0ZW1zLnB1c2hfYmFjayhzdGQ6Om1vdmUod29yaykpOworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5xdWV1ZSgmaXRlbXMpLCBDMl9PSyk7CisKKyAgICB7CisgICAgICAgIHR5cGVkZWYgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBVTG9jazsKKyAgICAgICAgVUxvY2sgbChtUXVldWVMb2NrKTsKKyAgICAgICAgaWYgKG1Xb3JrUXVldWUuc2l6ZSgpICE9IE1BWF9JTlBVVF9CVUZGRVJTKSB7CisgICAgICAgICAgICBtUXVldWVDb25kaXRpb24ud2FpdF9mb3IobCwgVElNRV9PVVQpOworICAgICAgICB9CisgICAgfQorICAgIEFTU0VSVF9FUShtRW9zLCB0cnVlKTsKKyAgICBBU1NFUlRfRVEobVdvcmtRdWV1ZS5zaXplKCksIChzaXplX3QpTUFYX0lOUFVUX0JVRkZFUlMpOworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdG9wKCksIEMyX09LKTsKK30KKworVEVTVF9GKENvZGVjMkF1ZGlvRGVjSGlkbFRlc3QsIEVtcHR5QnVmZmVyVGVzdCkgeworICAgIGRlc2NyaXB0aW9uKCJUZXN0cyBlbXB0eSBpbnB1dCBidWZmZXIiKTsKKyAgICBpZiAobURpc2FibGVUZXN0KSByZXR1cm47CisgICAgdHlwZWRlZiBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IFVMb2NrOworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdGFydCgpLCBDMl9PSyk7CisgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gd29yazsKKyAgICAvLyBQcmVwYXJlIEMyV29yaworICAgIHsKKyAgICAgICAgVUxvY2sgbChtUXVldWVMb2NrKTsKKyAgICAgICAgaWYgKCFtV29ya1F1ZXVlLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIHdvcmsuc3dhcChtV29ya1F1ZXVlLmZyb250KCkpOworICAgICAgICAgICAgbVdvcmtRdWV1ZS5wb3BfZnJvbnQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFTU0VSVF9UUlVFKGZhbHNlKSA8PCAibVdvcmtRdWV1ZSBFbXB0eSBhdCB0aGUgc3RhcnQgb2YgdGVzdCI7CisgICAgICAgIH0KKyAgICB9CisgICAgQVNTRVJUX05FKHdvcmssIG51bGxwdHIpOworCisgICAgd29yay0+aW5wdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpMDsKKyAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcCA9IDA7CisgICAgd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4ID0gMDsKKyAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5lbXBsYWNlX2JhY2sobmV3IEMyV29ya2xldCk7CisKKyAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IGl0ZW1zOworICAgIGl0ZW1zLnB1c2hfYmFjayhzdGQ6Om1vdmUod29yaykpOworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5xdWV1ZSgmaXRlbXMpLCBDMl9PSyk7CisKKyAgICB7CisgICAgICAgIHR5cGVkZWYgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBVTG9jazsKKyAgICAgICAgVUxvY2sgbChtUXVldWVMb2NrKTsKKyAgICAgICAgaWYgKG1Xb3JrUXVldWUuc2l6ZSgpICE9IE1BWF9JTlBVVF9CVUZGRVJTKSB7CisgICAgICAgICAgICBtUXVldWVDb25kaXRpb24ud2FpdF9mb3IobCwgVElNRV9PVVQpOworICAgICAgICB9CisgICAgfQorICAgIEFTU0VSVF9FUShtV29ya1F1ZXVlLnNpemUoKSwgKHNpemVfdClNQVhfSU5QVVRfQlVGRkVSUyk7CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0b3AoKSwgQzJfT0spOworfQorCitURVNUX0YoQ29kZWMyQXVkaW9EZWNIaWRsVGVzdCwgRmx1c2hUZXN0KSB7CisgICAgZGVzY3JpcHRpb24oIlRlc3RzIEZsdXNoIGNhbGxzIik7CisgICAgaWYgKG1EaXNhYmxlVGVzdCkgcmV0dXJuOworICAgIHR5cGVkZWYgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBVTG9jazsKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RhcnQoKSwgQzJfT0spOworICAgIGNoYXIgbVVSTFs1MTJdLCBpbmZvWzUxMl07CisgICAgc3RkOjppZnN0cmVhbSBlbGVTdHJlYW0sIGVsZUluZm87CisKKyAgICBzdHJjcHkobVVSTCwgZ0Vudi0+Z2V0UmVzKCkuY19zdHIoKSk7CisgICAgc3RyY3B5KGluZm8sIGdFbnYtPmdldFJlcygpLmNfc3RyKCkpOworICAgIEdldFVSTEZvckNvbXBvbmVudChtQ29tcE5hbWUsIG1VUkwsIGluZm8pOworCisgICAgZWxlSW5mby5vcGVuKGluZm8pOworICAgIEFTU0VSVF9FUShlbGVJbmZvLmlzX29wZW4oKSwgdHJ1ZSk7CisgICAgYW5kcm9pZDo6VmVjdG9yPEZyYW1lSW5mbz4gSW5mbzsKKyAgICBpbnQgYnl0ZXNDb3VudCA9IDA7CisgICAgdWludDMyX3QgZmxhZ3MgPSAwOworICAgIHVpbnQzMl90IHRpbWVzdGFtcCA9IDA7CisgICAgbUZsdXNoZWRJbmRpY2VzLmNsZWFyKCk7CisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgaWYgKCEoZWxlSW5mbyA+PiBieXRlc0NvdW50KSkgYnJlYWs7CisgICAgICAgIGVsZUluZm8gPj4gZmxhZ3M7CisgICAgICAgIGVsZUluZm8gPj4gdGltZXN0YW1wOworICAgICAgICBJbmZvLnB1c2hfYmFjayh7Ynl0ZXNDb3VudCwgZmxhZ3MsIHRpbWVzdGFtcH0pOworICAgIH0KKyAgICBlbGVJbmZvLmNsb3NlKCk7CisgICAgaW50MzJfdCBiaXRTdHJlYW1JbmZvWzJdID0gezB9OworICAgIGlmIChtQ29tcE5hbWUgPT0gcmF3KSB7CisgICAgICAgIGJpdFN0cmVhbUluZm9bMF0gPSA4MDAwOworICAgICAgICBiaXRTdHJlYW1JbmZvWzFdID0gMTsKKyAgICB9IGVsc2UgeworICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgICAgIGdldElucHV0Q2hhbm5lbEluZm8obUNvbXBvbmVudCwgbUNvbXBOYW1lLCBiaXRTdHJlYW1JbmZvKSk7CisgICAgfQorICAgIHNldHVwQ29uZmlnUGFyYW0obUNvbXBvbmVudCwgYml0U3RyZWFtSW5mbyk7CisgICAgQUxPR1YoIm1VUkwgOiAlcyIsIG1VUkwpOworICAgIGVsZVN0cmVhbS5vcGVuKG1VUkwsIHN0ZDo6aWZzdHJlYW06OmJpbmFyeSk7CisgICAgQVNTRVJUX0VRKGVsZVN0cmVhbS5pc19vcGVuKCksIHRydWUpOworICAgIC8vIERlY29kZSAxMjggZnJhbWVzIGFuZCBmbHVzaC4gaGVyZSAxMjggaXMgY2hvc2VuIHRvIGVuc3VyZSB0aGVyZSBpcyBhIGtleQorICAgIC8vIGZyYW1lIGFmdGVyIHRoaXMgc28gdGhhdCB0aGUgYmVsb3cgc2VjdGlvbiBjYW4gYmUgY292ZXJlZCBmb3IgYWxsCisgICAgLy8gY29tcG9uZW50cworICAgIHVpbnQzMl90IG51bUZyYW1lc0ZsdXNoZWQgPSAxMjg7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoZGVjb2RlTkZyYW1lcygKKyAgICAgICAgbUNvbXBvbmVudCwgbVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLCBtRmx1c2hlZEluZGljZXMsCisgICAgICAgIG1MaW5lYXJQb29sLCBlbGVTdHJlYW0sICZJbmZvLCAwLCBudW1GcmFtZXNGbHVzaGVkLCBmYWxzZSkpOworICAgIC8vIGZsdXNoCisgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBmbHVzaGVkV29yazsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPQorICAgICAgICBtQ29tcG9uZW50LT5mbHVzaChDMkNvbXBvbmVudDo6RkxVU0hfQ09NUE9ORU5ULCAmZmx1c2hlZFdvcmspOworICAgIEFTU0VSVF9FUShlcnIsIEMyX09LKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgd2FpdE9uSW5wdXRDb25zdW1wdGlvbihtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsCisgICAgICAgICAgICAoc2l6ZV90KU1BWF9JTlBVVF9CVUZGRVJTIC0gZmx1c2hlZFdvcmsuc2l6ZSgpKSk7CisgICAgdWludDY0X3QgZnJhbWVJbmRleDsKKyAgICB7CisgICAgICAgIC8vVXBkYXRlIG1GbHVzaGVkSW5kaWNlcyBiYXNlZCBvbiB0aGUgaW5kZXggcmVjZWl2ZWQgZnJvbSBmbHVzaCgpCisgICAgICAgIFVMb2NrIGwobVF1ZXVlTG9jayk7CisgICAgICAgIGZvciAoc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmsgOiBmbHVzaGVkV29yaykgeworICAgICAgICAgICAgQVNTRVJUX05FKHdvcmssIG51bGxwdHIpOworICAgICAgICAgICAgZnJhbWVJbmRleCA9IHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpOworICAgICAgICAgICAgc3RkOjpsaXN0PHVpbnQ2NF90Pjo6aXRlcmF0b3IgZnJhbWVJbmRleEl0ID0KKyAgICAgICAgICAgICAgICBzdGQ6OmZpbmQobUZsdXNoZWRJbmRpY2VzLmJlZ2luKCksIG1GbHVzaGVkSW5kaWNlcy5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVJbmRleCk7CisgICAgICAgICAgICBpZiAoIW1GbHVzaGVkSW5kaWNlcy5lbXB0eSgpICYmCisgICAgICAgICAgICAgICAgKGZyYW1lSW5kZXhJdCAhPSBtRmx1c2hlZEluZGljZXMuZW5kKCkpKSB7CisgICAgICAgICAgICAgICAgbUZsdXNoZWRJbmRpY2VzLmVyYXNlKGZyYW1lSW5kZXhJdCk7CisgICAgICAgICAgICAgICAgd29yay0+aW5wdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgbVdvcmtRdWV1ZS5wdXNoX2JhY2soc3RkOjptb3ZlKHdvcmspKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAvLyBTZWVrIHRvIG5leHQga2V5IGZyYW1lIGFuZCBzdGFydCBkZWNvZGluZyB0aWxsIHRoZSBlbmQKKyAgICBtRmx1c2hlZEluZGljZXMuY2xlYXIoKTsKKyAgICBpbnQgaW5kZXggPSBudW1GcmFtZXNGbHVzaGVkOworICAgIGJvb2wga2V5RnJhbWUgPSBmYWxzZTsKKyAgICBmbGFncyA9IDA7CisgICAgd2hpbGUgKGluZGV4IDwgKGludClJbmZvLnNpemUoKSkgeworICAgICAgICBpZiAoSW5mb1tpbmRleF0uZmxhZ3MpIGZsYWdzID0gMXUgPDwgKEluZm9baW5kZXhdLmZsYWdzIC0gMSk7CisgICAgICAgIGlmICgoZmxhZ3MgJiBTWU5DX0ZSQU1FKSA9PSBTWU5DX0ZSQU1FKSB7CisgICAgICAgICAgICBrZXlGcmFtZSA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBmbGFncyA9IDA7CisgICAgICAgIGVsZVN0cmVhbS5pZ25vcmUoSW5mb1tpbmRleF0uYnl0ZXNDb3VudCk7CisgICAgICAgIGluZGV4Kys7CisgICAgfQorICAgIGlmIChrZXlGcmFtZSkgeworICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgICAgIGRlY29kZU5GcmFtZXMobUNvbXBvbmVudCwgbVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtRmx1c2hlZEluZGljZXMsIG1MaW5lYXJQb29sLCBlbGVTdHJlYW0sICZJbmZvLCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGludClJbmZvLnNpemUoKSAtIGluZGV4KSk7CisgICAgfQorICAgIGVsZVN0cmVhbS5jbG9zZSgpOworICAgIGVyciA9CisgICAgICAgIG1Db21wb25lbnQtPmZsdXNoKEMyQ29tcG9uZW50OjpGTFVTSF9DT01QT05FTlQsICZmbHVzaGVkV29yayk7CisgICAgQVNTRVJUX0VRKGVyciwgQzJfT0spOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICB3YWl0T25JbnB1dENvbnN1bXB0aW9uKG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwKKyAgICAgICAgICAgIChzaXplX3QpTUFYX0lOUFVUX0JVRkZFUlMgLSBmbHVzaGVkV29yay5zaXplKCkpKTsKKyAgICB7CisgICAgICAgIC8vVXBkYXRlIG1GbHVzaGVkSW5kaWNlcyBiYXNlZCBvbiB0aGUgaW5kZXggcmVjZWl2ZWQgZnJvbSBmbHVzaCgpCisgICAgICAgIFVMb2NrIGwobVF1ZXVlTG9jayk7CisgICAgICAgIGZvciAoc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmsgOiBmbHVzaGVkV29yaykgeworICAgICAgICAgICAgQVNTRVJUX05FKHdvcmssIG51bGxwdHIpOworICAgICAgICAgICAgZnJhbWVJbmRleCA9IHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpOworICAgICAgICAgICAgc3RkOjpsaXN0PHVpbnQ2NF90Pjo6aXRlcmF0b3IgZnJhbWVJbmRleEl0ID0KKyAgICAgICAgICAgICAgICBzdGQ6OmZpbmQobUZsdXNoZWRJbmRpY2VzLmJlZ2luKCksIG1GbHVzaGVkSW5kaWNlcy5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVJbmRleCk7CisgICAgICAgICAgICBpZiAoIW1GbHVzaGVkSW5kaWNlcy5lbXB0eSgpICYmCisgICAgICAgICAgICAgICAgKGZyYW1lSW5kZXhJdCAhPSBtRmx1c2hlZEluZGljZXMuZW5kKCkpKSB7CisgICAgICAgICAgICAgICAgbUZsdXNoZWRJbmRpY2VzLmVyYXNlKGZyYW1lSW5kZXhJdCk7CisgICAgICAgICAgICAgICAgd29yay0+aW5wdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgbVdvcmtRdWV1ZS5wdXNoX2JhY2soc3RkOjptb3ZlKHdvcmspKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBBU1NFUlRfRVEobUZsdXNoZWRJbmRpY2VzLmVtcHR5KCksIHRydWUpOworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdG9wKCksIEMyX09LKTsKK30KKworfSAgLy8gYW5vbnltb3VzIG5hbWVzcGFjZQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKKyAgICBnRW52ID0gbmV3IENvbXBvbmVudFRlc3RFbnZpcm9ubWVudCgpOworICAgIDo6dGVzdGluZzo6QWRkR2xvYmFsVGVzdEVudmlyb25tZW50KGdFbnYpOworICAgIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworICAgIGdFbnYtPmluaXQoJmFyZ2MsIGFyZ3YpOworICAgIGludCBzdGF0dXMgPSBnRW52LT5pbml0RnJvbU9wdGlvbnMoYXJnYywgYXJndik7CisgICAgaWYgKHN0YXR1cyA9PSAwKSB7CisgICAgICAgIGludCBzdGF0dXMgPSBSVU5fQUxMX1RFU1RTKCk7CisgICAgICAgIExPRyhJTkZPKSA8PCAiQzIgVGVzdCByZXN1bHQgPSAiIDw8IHN0YXR1czsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvYXVkaW8vVnRzSGlkbEMyVjFfMFRhcmdldEF1ZGlvRW5jVGVzdC5jcHAgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2F1ZGlvL1Z0c0hpZGxDMlYxXzBUYXJnZXRBdWRpb0VuY1Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmODZhYWQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2F1ZGlvL1Z0c0hpZGxDMlYxXzBUYXJnZXRBdWRpb0VuY1Rlc3QuY3BwCkBAIC0wLDAgKzEsNjc1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiY29kZWMyX2hpZGxfaGFsX2F1ZGlvX2VuY190ZXN0IgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC9jbGllbnQuaD4KKyNpbmNsdWRlIDxDMkFsbG9jYXRvcklvbi5oPgorI2luY2x1ZGUgPEMyQ29uZmlnLmg+CisjaW5jbHVkZSA8QzJEZWJ1Zy5oPgorI2luY2x1ZGUgPEMyQnVmZmVyLmg+CisjaW5jbHVkZSA8QzJCdWZmZXJQcml2Lmg+CisKK3VzaW5nIGFuZHJvaWQ6OkMyQWxsb2NhdG9ySW9uOworCisjaW5jbHVkZSA8VnRzSGFsSGlkbFRhcmdldFRlc3RCYXNlLmg+CisjaW5jbHVkZSAibWVkaWFfYzJfYXVkaW9faGlkbF90ZXN0X2NvbW1vbi5oIgorI2luY2x1ZGUgIm1lZGlhX2MyX2hpZGxfdGVzdF9jb21tb24uaCIKKworY2xhc3MgTGluZWFyQnVmZmVyIDogcHVibGljIEMyQnVmZmVyIHsKKyAgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBMaW5lYXJCdWZmZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+JiBibG9jaykKKyAgICAgICAgOiBDMkJ1ZmZlcigKKyAgICAgICAgICAgICAge2Jsb2NrLT5zaGFyZShibG9jay0+b2Zmc2V0KCksIGJsb2NrLT5zaXplKCksIDo6QzJGZW5jZSgpKX0pIHt9Cit9OworCitzdGF0aWMgQ29tcG9uZW50VGVzdEVudmlyb25tZW50KiBnRW52ID0gbnVsbHB0cjsKKworbmFtZXNwYWNlIHsKKworY2xhc3MgQ29kZWMyQXVkaW9FbmNIaWRsVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlZ0c0hhbEhpZGxUYXJnZXRUZXN0QmFzZSB7CisgICBwcml2YXRlOgorICAgIHR5cGVkZWYgOjp0ZXN0aW5nOjpWdHNIYWxIaWRsVGFyZ2V0VGVzdEJhc2UgU3VwZXI7CisKKyAgIHB1YmxpYzoKKyAgICA6OnN0ZDo6c3RyaW5nIGdldFRlc3RDYXNlSW5mbygpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIDo6c3RkOjpzdHJpbmcoKSArCisgICAgICAgICAgICAgICAgIkNvbXBvbmVudDogIiArIGdFbnYtPmdldENvbXBvbmVudCgpLmNfc3RyKCkgKyAiIHwgIiArCisgICAgICAgICAgICAgICAgIkluc3RhbmNlOiAiICsgZ0Vudi0+Z2V0SW5zdGFuY2UoKS5jX3N0cigpICsgIiB8ICIgKworICAgICAgICAgICAgICAgICJSZXM6ICIgKyBnRW52LT5nZXRSZXMoKS5jX3N0cigpOworICAgIH0KKworICAgIC8vIGdvb2dsZS5jb2RlYzIgQXVkaW8gdGVzdCBzZXR1cAorICAgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKKyAgICAgICAgU3VwZXI6OlNldFVwKCk7CisgICAgICAgIG1EaXNhYmxlVGVzdCA9IGZhbHNlOworICAgICAgICBBTE9HVigiQ29kZWMyQXVkaW9FbmNIaWRsVGVzdCBTZXRVcCIpOworICAgICAgICBtQ2xpZW50ID0gYW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDcmVhdGVGcm9tU2VydmljZSgKKyAgICAgICAgICAgIGdFbnYtPmdldEluc3RhbmNlKCkuY19zdHIoKSk7CisgICAgICAgIEFTU0VSVF9ORShtQ2xpZW50LCBudWxscHRyKTsKKyAgICAgICAgbUxpc3RlbmVyLnJlc2V0KG5ldyBDb2RlY0xpc3RlbmVyKAorICAgICAgICAgICAgW3RoaXNdKHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4mIHdvcmtJdGVtcykgeworICAgICAgICAgICAgICAgIGhhbmRsZVdvcmtEb25lKHdvcmtJdGVtcyk7CisgICAgICAgICAgICB9KSk7CisgICAgICAgIEFTU0VSVF9ORShtTGlzdGVuZXIsIG51bGxwdHIpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE1BWF9JTlBVVF9CVUZGRVJTOyArK2kpIHsKKyAgICAgICAgICAgIG1Xb3JrUXVldWUuZW1wbGFjZV9iYWNrKG5ldyBDMldvcmspOworICAgICAgICB9CisgICAgICAgIG1DbGllbnQtPmNyZWF0ZUNvbXBvbmVudChnRW52LT5nZXRDb21wb25lbnQoKS5jX3N0cigpLCBtTGlzdGVuZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbUNvbXBvbmVudCk7CisgICAgICAgIEFTU0VSVF9ORShtQ29tcG9uZW50LCBudWxscHRyKTsKKworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3JTdG9yZT4gc3RvcmUgPQorICAgICAgICAgICAgYW5kcm9pZDo6R2V0Q29kZWMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZSgpOworICAgICAgICBDSEVDS19FUShzdG9yZS0+ZmV0Y2hBbGxvY2F0b3IoQzJBbGxvY2F0b3JTdG9yZTo6REVGQVVMVF9MSU5FQVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbUxpbmVhckFsbG9jYXRvciksCisgICAgICAgICAgICAgICAgIEMyX09LKTsKKyAgICAgICAgbUxpbmVhclBvb2wgPSBzdGQ6Om1ha2Vfc2hhcmVkPEMyUG9vbGVkQmxvY2tQb29sPihtTGluZWFyQWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CbG9ja1Bvb2xJZCsrKTsKKyAgICAgICAgQVNTRVJUX05FKG1MaW5lYXJQb29sLCBudWxscHRyKTsKKworICAgICAgICBtQ29tcE5hbWUgPSB1bmtub3duX2NvbXA7CisgICAgICAgIHN0cnVjdCBTdHJpbmdUb05hbWUgeworICAgICAgICAgICAgY29uc3QgY2hhciogTmFtZTsKKyAgICAgICAgICAgIHN0YW5kYXJkQ29tcCBDb21wTmFtZTsKKyAgICAgICAgfTsKKyAgICAgICAgY29uc3QgU3RyaW5nVG9OYW1lIGtTdHJpbmdUb05hbWVbXSA9IHsKKyAgICAgICAgICAgIHsiYWFjIiwgYWFjfSwKKyAgICAgICAgICAgIHsiZmxhYyIsIGZsYWN9LAorICAgICAgICAgICAgeyJhbXJuYiIsIGFtcm5ifSwKKyAgICAgICAgICAgIHsiYW1yd2IiLCBhbXJ3Yn0sCisgICAgICAgIH07CisgICAgICAgIGNvbnN0IHNpemVfdCBrTnVtU3RyaW5nVG9OYW1lID0KKyAgICAgICAgICAgIHNpemVvZihrU3RyaW5nVG9OYW1lKSAvIHNpemVvZihrU3RyaW5nVG9OYW1lWzBdKTsKKworICAgICAgICBzdGQ6OnN0cmluZyBzdWJzdHJpbmc7CisgICAgICAgIHN0ZDo6c3RyaW5nIGNvbXA7CisgICAgICAgIHN1YnN0cmluZyA9IHN0ZDo6c3RyaW5nKGdFbnYtPmdldENvbXBvbmVudCgpKTsKKyAgICAgICAgLyogVE9ETzogYmV0dGVyIGFwcHJvYWNoIHRvIGZpbmQgdGhlIGNvbXBvbmVudCAqLworICAgICAgICAvKiAiYzIuYW5kcm9pZC4iID0+IDExdGggcG9zaXRpb24gKi8KKyAgICAgICAgc2l6ZV90IHBvcyA9IDExOworICAgICAgICBzaXplX3QgbGVuID0gc3Vic3RyaW5nLmZpbmQoIi5lbmNvZGVyIiwgcG9zKTsKKyAgICAgICAgY29tcCA9IHN1YnN0cmluZy5zdWJzdHIocG9zLCBsZW4gLSBwb3MpOworCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga051bVN0cmluZ1RvTmFtZTsgKytpKSB7CisgICAgICAgICAgICBpZiAoIXN0cmNhc2VjbXAoY29tcC5jX3N0cigpLCBrU3RyaW5nVG9OYW1lW2ldLk5hbWUpKSB7CisgICAgICAgICAgICAgICAgbUNvbXBOYW1lID0ga1N0cmluZ1RvTmFtZVtpXS5Db21wTmFtZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtRW9zID0gZmFsc2U7CisgICAgICAgIG1Dc2QgPSBmYWxzZTsKKyAgICAgICAgbUZyYW1lc1JlY2VpdmVkID0gMDsKKyAgICAgICAgaWYgKG1Db21wTmFtZSA9PSB1bmtub3duX2NvbXApIG1EaXNhYmxlVGVzdCA9IHRydWU7CisgICAgICAgIGlmIChtRGlzYWJsZVRlc3QpIHN0ZDo6Y291dCA8PCAiWyAgIFdBUk4gICBdIFRlc3QgRGlzYWJsZWQgXG4iOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlIHsKKyAgICAgICAgaWYgKG1Db21wb25lbnQgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgaWYgKDo6dGVzdGluZzo6VGVzdDo6SGFzRmF0YWxGYWlsdXJlKCkpIHJldHVybjsKKyAgICAgICAgICAgIG1Db21wb25lbnQtPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIG1Db21wb25lbnQgPSBudWxscHRyOworICAgICAgICB9CisgICAgICAgIFN1cGVyOjpUZWFyRG93bigpOworICAgIH0KKyAgICAvLyBjYWxsYmFjayBmdW5jdGlvbiB0byBwcm9jZXNzIG9uV29ya0RvbmUgcmVjZWl2ZWQgYnkgTGlzdGVuZXIKKyAgICB2b2lkIGhhbmRsZVdvcmtEb25lKHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4mIHdvcmtJdGVtcykgeworICAgICAgICBmb3IgKHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrIDogd29ya0l0ZW1zKSB7CisgICAgICAgICAgICAvLyBoYW5kbGUgY29uZmlndXJhdGlvbiBjaGFuZ2VzIGluIHdvcmsgZG9uZQorICAgICAgICAgICAgaWYgKCF3b3JrLT53b3JrbGV0cy5lbXB0eSgpICYmCisgICAgICAgICAgICAgICAgKHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUuc2l6ZSgpICE9IDApKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIkNvbmZpZyBVcGRhdGUiKTsKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IHVwZGF0ZXMgPQorICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUod29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZSk7CisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+IGNvbmZpZ1BhcmFtOworICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHVwZGF0ZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgQzJQYXJhbSogcGFyYW0gPSB1cGRhdGVzW2ldLmdldCgpOworICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW0tPmluZGV4KCkgPT0gQzJTdHJlYW1Dc2RJbmZvOjpvdXRwdXQ6OlBBUkFNX1RZUEUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Dc2QgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbUZyYW1lc1JlY2VpdmVkKys7CisgICAgICAgICAgICBtRW9zID0gKHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyAmCisgICAgICAgICAgICAgICAgICAgIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pICE9IDA7CisgICAgICAgICAgICBhdXRvIGZyYW1lSW5kZXhJdCA9CisgICAgICAgICAgICAgICAgc3RkOjpmaW5kKG1GbHVzaGVkSW5kaWNlcy5iZWdpbigpLCBtRmx1c2hlZEluZGljZXMuZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpKTsKKyAgICAgICAgICAgIEFMT0dWKCJXb3JrRG9uZTogZnJhbWVJRCByZWNlaXZlZCAlZCIsCisgICAgICAgICAgICAgICAgKGludCl3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCkpOworICAgICAgICAgICAgd29yay0+aW5wdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICAgICAgd29yay0+d29ya2xldHMuY2xlYXIoKTsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0eXBlZGVmIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gVUxvY2s7CisgICAgICAgICAgICAgICAgVUxvY2sgbChtUXVldWVMb2NrKTsKKyAgICAgICAgICAgICAgICBtV29ya1F1ZXVlLnB1c2hfYmFjayhzdGQ6Om1vdmUod29yaykpOworICAgICAgICAgICAgICAgIGlmICghbUZsdXNoZWRJbmRpY2VzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbUZsdXNoZWRJbmRpY2VzLmVyYXNlKGZyYW1lSW5kZXhJdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1RdWV1ZUNvbmRpdGlvbi5ub3RpZnlfYWxsKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZW51bSBzdGFuZGFyZENvbXAgeworICAgICAgICBhYWMsCisgICAgICAgIGZsYWMsCisgICAgICAgIGFtcm5iLAorICAgICAgICBhbXJ3YiwKKyAgICAgICAgdW5rbm93bl9jb21wLAorICAgIH07CisKKyAgICBib29sIG1Fb3M7CisgICAgYm9vbCBtQ3NkOworICAgIGJvb2wgbURpc2FibGVUZXN0OworICAgIHN0YW5kYXJkQ29tcCBtQ29tcE5hbWU7CisgICAgdWludDMyX3QgbUZyYW1lc1JlY2VpdmVkOworICAgIHN0ZDo6bGlzdDx1aW50NjRfdD4gbUZsdXNoZWRJbmRpY2VzOworCisgICAgQzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3QgbUJsb2NrUG9vbElkOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gbUxpbmVhclBvb2w7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiBtTGluZWFyQWxsb2NhdG9yOworCisgICAgc3RkOjptdXRleCBtUXVldWVMb2NrOworICAgIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlIG1RdWV1ZUNvbmRpdGlvbjsKKyAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IG1Xb3JrUXVldWU7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50PiBtQ2xpZW50OworICAgIHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ6Okxpc3RlbmVyPiBtTGlzdGVuZXI7CisgICAgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q29tcG9uZW50PiBtQ29tcG9uZW50OworCisgICBwcm90ZWN0ZWQ6CisgICAgc3RhdGljIHZvaWQgZGVzY3JpcHRpb24oY29uc3Qgc3RkOjpzdHJpbmcmIGRlc2NyaXB0aW9uKSB7CisgICAgICAgIFJlY29yZFByb3BlcnR5KCJkZXNjcmlwdGlvbiIsIGRlc2NyaXB0aW9uKTsKKyAgICB9Cit9OworCit2b2lkIHZhbGlkYXRlQ29tcG9uZW50KAorICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4mIGNvbXBvbmVudCwKKyAgICBDb2RlYzJBdWRpb0VuY0hpZGxUZXN0OjpzdGFuZGFyZENvbXAgY29tcE5hbWUsIGJvb2wmIGRpc2FibGVUZXN0KSB7CisgICAgLy8gVmFsaWRhdGUgaXRzIGEgQzIgQ29tcG9uZW50CisgICAgaWYgKGNvbXBvbmVudC0+Z2V0TmFtZSgpLmZpbmQoImMyIikgPT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgQUxPR0UoIk5vdCBhIGMyIGNvbXBvbmVudCIpOworICAgICAgICBkaXNhYmxlVGVzdCA9IHRydWU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBWYWxpZGF0ZSBpdHMgbm90IGFuIGVuY29kZXIgYW5kIHRoZSBjb21wb25lbnQgdG8gYmUgdGVzdGVkIGlzIGF1ZGlvCisgICAgaWYgKGNvbXBvbmVudC0+Z2V0TmFtZSgpLmZpbmQoImRlY29kZXIiKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICBBTE9HRSgiRXhwZWN0ZWQgRW5jb2RlciwgZ2l2ZW4gRGVjb2RlciIpOworICAgICAgICBkaXNhYmxlVGVzdCA9IHRydWU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiBxdWVyaWVkOworICAgIGMyX3N0YXR1c190IGMyZXJyID0KKyAgICAgICAgY29tcG9uZW50LT5xdWVyeSh7fSwge0MyUG9ydE1lZGlhVHlwZVNldHRpbmc6OmlucHV0OjpQQVJBTV9UWVBFfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDMl9ET05UX0JMT0NLLCAmcXVlcmllZCk7CisgICAgaWYgKGMyZXJyICE9IEMyX09LICYmIHF1ZXJpZWQuc2l6ZSgpID09IDApIHsKKyAgICAgICAgQUxPR0UoIlF1ZXJ5IG1lZGlhIHR5cGUgZmFpbGVkID0+ICVkIiwgYzJlcnIpOworICAgIH0gZWxzZSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIGlucHV0RG9tYWluID0KKyAgICAgICAgICAgICgoQzJTdHJlYW1NZWRpYVR5cGVTZXR0aW5nOjppbnB1dCopcXVlcmllZFswXS5nZXQoKSktPm0udmFsdWU7CisgICAgICAgIGlmIChpbnB1dERvbWFpbi5maW5kKCJhdWRpby8iKSA9PSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICAgICAgQUxPR0UoIkV4cGVjdGVkIEF1ZGlvIENvbXBvbmVudCIpOworICAgICAgICAgICAgZGlzYWJsZVRlc3QgPSB0cnVlOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gVmFsaWRhdGVzIGNvbXBvbmVudCBuYW1lCisgICAgaWYgKGNvbXBOYW1lID09IENvZGVjMkF1ZGlvRW5jSGlkbFRlc3Q6OnVua25vd25fY29tcCkgeworICAgICAgICBBTE9HRSgiQ29tcG9uZW50IEluVmFsaWQiKTsKKyAgICAgICAgZGlzYWJsZVRlc3QgPSB0cnVlOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFMT0dWKCJDb21wb25lbnQgVmFsaWQiKTsKK30KKworLy8gU2V0IERlZmF1bHQgY29uZmlnIHBhcmFtLgordm9pZCBzZXR1cENvbmZpZ1BhcmFtKAorICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4mIGNvbXBvbmVudCwKKyAgICBpbnQzMl90IG5DaGFubmVscywgaW50MzJfdCBuU2FtcGxlUmF0ZSkgeworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICBDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjppbnB1dCBzYW1wbGVSYXRlSW5mbygwdSwgblNhbXBsZVJhdGUpOworICAgIEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6aW5wdXQgY2hhbm5lbENvdW50SW5mbygwdSwgbkNoYW5uZWxzKTsKKworICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiBjb25maWdQYXJhbXsmc2FtcGxlUmF0ZUluZm8sICZjaGFubmVsQ291bnRJbmZvfTsKKyAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPQorICAgICAgICBjb21wb25lbnQtPmNvbmZpZyhjb25maWdQYXJhbSwgQzJfRE9OVF9CTE9DSywgJmZhaWx1cmVzKTsKKyAgICBBU1NFUlRfRVEoZmFpbHVyZXMuc2l6ZSgpLCAwdSk7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgQzJfT0spOworfQorCisvLyBMb29rVXBUYWJsZSBvZiBjbGlwcyBhbmQgbWV0YWRhdGEgZm9yIGNvbXBvbmVudCB0ZXN0aW5nCit2b2lkIEdldFVSTEZvckNvbXBvbmVudChDb2RlYzJBdWRpb0VuY0hpZGxUZXN0OjpzdGFuZGFyZENvbXAgY29tcCwgY2hhciogbVVSTCkgeworICAgIHN0cnVjdCBDb21wVG9VUkwgeworICAgICAgICBDb2RlYzJBdWRpb0VuY0hpZGxUZXN0OjpzdGFuZGFyZENvbXAgY29tcDsKKyAgICAgICAgY29uc3QgY2hhciogbVVSTDsKKyAgICB9OworICAgIHN0YXRpYyBjb25zdCBDb21wVG9VUkwga0NvbXBUb1VSTFtdID0geworICAgICAgICB7Q29kZWMyQXVkaW9FbmNIaWRsVGVzdDo6c3RhbmRhcmRDb21wOjphYWMsCisgICAgICAgICAiYmJiX3Jhd18yY2hfNDhraHpfczE2bGUucmF3In0sCisgICAgICAgIHtDb2RlYzJBdWRpb0VuY0hpZGxUZXN0OjpzdGFuZGFyZENvbXA6OmFtcm5iLAorICAgICAgICAgImJiYl9yYXdfMWNoXzhraHpfczE2bGUucmF3In0sCisgICAgICAgIHtDb2RlYzJBdWRpb0VuY0hpZGxUZXN0OjpzdGFuZGFyZENvbXA6OmFtcndiLAorICAgICAgICAgImJiYl9yYXdfMWNoXzE2a2h6X3MxNmxlLnJhdyJ9LAorICAgICAgICB7Q29kZWMyQXVkaW9FbmNIaWRsVGVzdDo6c3RhbmRhcmRDb21wOjpmbGFjLAorICAgICAgICAgImJiYl9yYXdfMmNoXzQ4a2h6X3MxNmxlLnJhdyJ9LAorICAgIH07CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemVvZihrQ29tcFRvVVJMKSAvIHNpemVvZihrQ29tcFRvVVJMWzBdKTsgKytpKSB7CisgICAgICAgIGlmIChrQ29tcFRvVVJMW2ldLmNvbXAgPT0gY29tcCkgeworICAgICAgICAgICAgc3RyY2F0KG1VUkwsIGtDb21wVG9VUkxbaV0ubVVSTCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgZW5jb2RlTkZyYW1lcyhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+ICZjb21wb25lbnQsCisgICAgICAgICAgICAgICAgICAgc3RkOjptdXRleCAmcXVldWVMb2NrLCBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSAmcXVldWVDb25kaXRpb24sCisgICAgICAgICAgICAgICAgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiAmd29ya1F1ZXVlLAorICAgICAgICAgICAgICAgICAgIHN0ZDo6bGlzdDx1aW50NjRfdD4gJmZsdXNoZWRJbmRpY2VzLAorICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJmxpbmVhclBvb2wsCisgICAgICAgICAgICAgICAgICAgc3RkOjppZnN0cmVhbSYgZWxlU3RyZWFtLCB1aW50MzJfdCBuRnJhbWVzLAorICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lLCBpbnQzMl90IG5DaGFubmVscywKKyAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5TYW1wbGVSYXRlLCBib29sIGZsdXNoZWQgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICBib29sIHNpZ25hbEVPUyA9IHRydWUpIHsKKyAgICB0eXBlZGVmIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gVUxvY2s7CisKKyAgICB1aW50MzJfdCBmcmFtZUlEID0gMDsKKyAgICB1aW50MzJfdCBtYXhSZXRyeSA9IDA7CisgICAgaW50IGJ5dGVzQ291bnQgPSBzYW1wbGVzUGVyRnJhbWUgKiBuQ2hhbm5lbHMgKiAyOworICAgIGludDMyX3QgdGltZXN0YW1wSW5jciA9CisgICAgICAgIChpbnQpKCgoZmxvYXQpc2FtcGxlc1BlckZyYW1lIC8gblNhbXBsZVJhdGUpICogMTAwMDAwMCk7CisgICAgdWludDY0X3QgdGltZXN0YW1wID0gMDsKKyAgICB3aGlsZSAoMSkgeworICAgICAgICBpZiAobkZyYW1lcyA9PSAwKSBicmVhazsKKyAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwOworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB3b3JrOworICAgICAgICAvLyBQcmVwYXJlIEMyV29yaworICAgICAgICB3aGlsZSAoIXdvcmsgJiYgKG1heFJldHJ5IDwgTUFYX1JFVFJZKSkgeworICAgICAgICAgICAgVUxvY2sgbChxdWV1ZUxvY2spOworICAgICAgICAgICAgaWYgKCF3b3JrUXVldWUuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgIHdvcmsuc3dhcCh3b3JrUXVldWUuZnJvbnQoKSk7CisgICAgICAgICAgICAgICAgd29ya1F1ZXVlLnBvcF9mcm9udCgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBxdWV1ZUNvbmRpdGlvbi53YWl0X2ZvcihsLCBUSU1FX09VVCk7CisgICAgICAgICAgICAgICAgbWF4UmV0cnkrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIXdvcmsgJiYgKG1heFJldHJ5ID49IE1BWF9SRVRSWSkpIHsKKyAgICAgICAgICAgIEFTU0VSVF9UUlVFKGZhbHNlKSA8PCAiV2FpdCBmb3IgZ2VuZXJhdGluZyBDMldvcmsgZXhjZWVkZWQgdGltZW91dCI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNpZ25hbEVPUyAmJiAobkZyYW1lcyA9PSAxKSkKKyAgICAgICAgICAgIGZsYWdzIHw9IEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU07CisgICAgICAgIGlmIChmbHVzaGVkKSB7CisgICAgICAgICAgICBmbGFncyB8PSBTWU5DX0ZSQU1FOworICAgICAgICAgICAgZmx1c2hlZCA9IGZhbHNlOworICAgICAgICB9CisgICAgICAgIHdvcmstPmlucHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KWZsYWdzOworICAgICAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcCA9IHRpbWVzdGFtcDsKKyAgICAgICAgd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4ID0gZnJhbWVJRDsKKyAgICAgICAgeworICAgICAgICAgICAgVUxvY2sgbChxdWV1ZUxvY2spOworICAgICAgICAgICAgZmx1c2hlZEluZGljZXMuZW1wbGFjZV9iYWNrKGZyYW1lSUQpOworICAgICAgICB9CisgICAgICAgIGNoYXIqIGRhdGEgPSAoY2hhciopbWFsbG9jKGJ5dGVzQ291bnQpOworICAgICAgICBlbGVTdHJlYW0ucmVhZChkYXRhLCBieXRlc0NvdW50KTsKKyAgICAgICAgQVNTRVJUX0VRKGVsZVN0cmVhbS5nY291bnQoKSwgYnl0ZXNDb3VudCk7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBibG9jazsKKyAgICAgICAgQVNTRVJUX0VRKEMyX09LLCBsaW5lYXJQb29sLT5mZXRjaExpbmVhckJsb2NrKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlc0NvdW50LCB7QzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEV9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYmxvY2spKTsKKyAgICAgICAgQVNTRVJUX1RSVUUoYmxvY2spOworICAgICAgICAvLyBXcml0ZSBWaWV3CisgICAgICAgIEMyV3JpdGVWaWV3IHZpZXcgPSBibG9jay0+bWFwKCkuZ2V0KCk7CisgICAgICAgIGlmICh2aWV3LmVycm9yKCkgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQzJMaW5lYXJCbG9jazo6bWFwKCkgZmFpbGVkIDogJWQiLCB2aWV3LmVycm9yKCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgQVNTRVJUX0VRKChzaXplX3QpYnl0ZXNDb3VudCwgdmlldy5jYXBhY2l0eSgpKTsKKyAgICAgICAgQVNTRVJUX0VRKDB1LCB2aWV3Lm9mZnNldCgpKTsKKyAgICAgICAgQVNTRVJUX0VRKChzaXplX3QpYnl0ZXNDb3VudCwgdmlldy5zaXplKCkpOworCisgICAgICAgIG1lbWNweSh2aWV3LmJhc2UoKSwgZGF0YSwgYnl0ZXNDb3VudCk7CisgICAgICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgd29yay0+aW5wdXQuYnVmZmVycy5lbXBsYWNlX2JhY2sobmV3IExpbmVhckJ1ZmZlcihibG9jaykpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5jbGVhcigpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5lbXBsYWNlX2JhY2sobmV3IEMyV29ya2xldCk7CisgICAgICAgIGZyZWUoZGF0YSk7CisKKyAgICAgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBpdGVtczsKKyAgICAgICAgaXRlbXMucHVzaF9iYWNrKHN0ZDo6bW92ZSh3b3JrKSk7CisKKyAgICAgICAgLy8gRE8gVEhFIERFQ09ESU5HCisgICAgICAgIEFTU0VSVF9FUShjb21wb25lbnQtPnF1ZXVlKCZpdGVtcyksIEMyX09LKTsKKyAgICAgICAgQUxPR1YoIkZyYW1lICMlZCBzaXplID0gJWQgcXVldWVkIiwgZnJhbWVJRCwgYnl0ZXNDb3VudCk7CisgICAgICAgIG5GcmFtZXMtLTsKKyAgICAgICAgdGltZXN0YW1wICs9IHRpbWVzdGFtcEluY3I7CisgICAgICAgIGZyYW1lSUQrKzsKKyAgICAgICAgbWF4UmV0cnkgPSAwOworICAgIH0KK30KKwordm9pZCB3YWl0T25JbnB1dENvbnN1bXB0aW9uKHN0ZDo6bXV0ZXgmIHF1ZXVlTG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSYgcXVldWVDb25kaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiYgd29ya1F1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBidWZmZXJDb3VudCA9IE1BWF9JTlBVVF9CVUZGRVJTKSB7CisgICAgdHlwZWRlZiBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IFVMb2NrOworICAgIHVpbnQzMl90IHF1ZXVlU2l6ZTsKKyAgICB1aW50MzJfdCBtYXhSZXRyeSA9IDA7CisgICAgeworICAgICAgICBVTG9jayBsKHF1ZXVlTG9jayk7CisgICAgICAgIHF1ZXVlU2l6ZSA9IHdvcmtRdWV1ZS5zaXplKCk7CisgICAgfQorICAgIHdoaWxlICgobWF4UmV0cnkgPCBNQVhfUkVUUlkpICYmIChxdWV1ZVNpemUgPCBidWZmZXJDb3VudCkpIHsKKyAgICAgICAgVUxvY2sgbChxdWV1ZUxvY2spOworICAgICAgICBpZiAocXVldWVTaXplICE9IHdvcmtRdWV1ZS5zaXplKCkpIHsKKyAgICAgICAgICAgIHF1ZXVlU2l6ZSA9IHdvcmtRdWV1ZS5zaXplKCk7CisgICAgICAgICAgICBtYXhSZXRyeSA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBxdWV1ZUNvbmRpdGlvbi53YWl0X2ZvcihsLCBUSU1FX09VVCk7CisgICAgICAgICAgICBtYXhSZXRyeSsrOworICAgICAgICB9CisgICAgfQorfQorCitURVNUX0YoQ29kZWMyQXVkaW9FbmNIaWRsVGVzdCwgdmFsaWRhdGVDb21wTmFtZSkgeworICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKKyAgICBBTE9HVigiQ2hlY2tzIGlmIHRoZSBnaXZlbiBjb21wb25lbnQgaXMgYSB2YWxpZCBhdWRpbyBjb21wb25lbnQiKTsKKyAgICB2YWxpZGF0ZUNvbXBvbmVudChtQ29tcG9uZW50LCBtQ29tcE5hbWUsIG1EaXNhYmxlVGVzdCk7CisgICAgQVNTRVJUX0VRKG1EaXNhYmxlVGVzdCwgZmFsc2UpOworfQorCitURVNUX0YoQ29kZWMyQXVkaW9FbmNIaWRsVGVzdCwgRW5jb2RlVGVzdCkgeworICAgIEFMT0dWKCJFbmNvZGVUZXN0Iik7CisgICAgaWYgKG1EaXNhYmxlVGVzdCkgcmV0dXJuOworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdGFydCgpLCBDMl9PSyk7CisgICAgY2hhciBtVVJMWzUxMl07CisgICAgc3RyY3B5KG1VUkwsIGdFbnYtPmdldFJlcygpLmNfc3RyKCkpOworICAgIEdldFVSTEZvckNvbXBvbmVudChtQ29tcE5hbWUsIG1VUkwpOworCisgICAgLy8gU2V0dGluZyBkZWZhdWx0IGNvbmZpZ3VyYXRpb24KKyAgICBpbnQzMl90IG5DaGFubmVscyA9IDI7CisgICAgaW50MzJfdCBuU2FtcGxlUmF0ZSA9IDQ0MTAwOworICAgIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lID0gMTAyNDsKKyAgICBzd2l0Y2ggKG1Db21wTmFtZSkgeworICAgICAgICBjYXNlIGFhYzoKKyAgICAgICAgICAgIG5DaGFubmVscyA9IDI7CisgICAgICAgICAgICBuU2FtcGxlUmF0ZSA9IDQ4MDAwOworICAgICAgICAgICAgc2FtcGxlc1BlckZyYW1lID0gMTAyNDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGZsYWM6CisgICAgICAgICAgICBuQ2hhbm5lbHMgPSAyOworICAgICAgICAgICAgblNhbXBsZVJhdGUgPSA0ODAwMDsKKyAgICAgICAgICAgIHNhbXBsZXNQZXJGcmFtZSA9IDExNTI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBhbXJuYjoKKyAgICAgICAgICAgIG5DaGFubmVscyA9IDE7CisgICAgICAgICAgICBuU2FtcGxlUmF0ZSA9IDgwMDA7CisgICAgICAgICAgICBzYW1wbGVzUGVyRnJhbWUgPSAxNjA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBhbXJ3YjoKKyAgICAgICAgICAgIG5DaGFubmVscyA9IDE7CisgICAgICAgICAgICBuU2FtcGxlUmF0ZSA9IDE2MDAwOworICAgICAgICAgICAgc2FtcGxlc1BlckZyYW1lID0gMTYwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBU1NFUlRfVFJVRShmYWxzZSk7CisgICAgfQorICAgIHNldHVwQ29uZmlnUGFyYW0obUNvbXBvbmVudCwgbkNoYW5uZWxzLCBuU2FtcGxlUmF0ZSk7CisgICAgc3RkOjppZnN0cmVhbSBlbGVTdHJlYW07CisgICAgdWludDMyX3QgbnVtRnJhbWVzID0gMTI4OworICAgIGVsZVN0cmVhbS5vcGVuKG1VUkwsIHN0ZDo6aWZzdHJlYW06OmJpbmFyeSk7CisgICAgQVNTRVJUX0VRKGVsZVN0cmVhbS5pc19vcGVuKCksIHRydWUpOworICAgIEFMT0dWKCJtVVJMIDogJXMiLCBtVVJMKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgZW5jb2RlTkZyYW1lcyhtQ29tcG9uZW50LCBtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgbUZsdXNoZWRJbmRpY2VzLCBtTGluZWFyUG9vbCwgZWxlU3RyZWFtLCBudW1GcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlc1BlckZyYW1lLCBuQ2hhbm5lbHMsIG5TYW1wbGVSYXRlKSk7CisgICAgLy8gYmxvY2tpbmcgY2FsbCB0byBlbnN1cmVzIGFwcGxpY2F0aW9uIHRvIFdhaXQgdGlsbCBhbGwgdGhlIGlucHV0cyBhcmUKKyAgICAvLyBjb25zdW1lZAorICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICB3YWl0T25JbnB1dENvbnN1bXB0aW9uKG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSkpOworICAgIGVsZVN0cmVhbS5jbG9zZSgpOworICAgIGlmIChtRnJhbWVzUmVjZWl2ZWQgIT0gbnVtRnJhbWVzKSB7CisgICAgICAgIEFMT0dFKCJJbnB1dCBidWZmZXIgY291bnQgYW5kIE91dHB1dCBidWZmZXIgY291bnQgbWlzbWF0Y2giKTsKKyAgICAgICAgQUxPR0UoImZyYW1lc1JlY2VpdmVkIDogJWQgaW5wdXRGcmFtZXMgOiAldSIsIG1GcmFtZXNSZWNlaXZlZCwgbnVtRnJhbWVzKTsKKyAgICAgICAgQVNTRVJUX1RSVUUoZmFsc2UpOworICAgIH0KKyAgICBpZiAoKG1Db21wTmFtZSA9PSBmbGFjIHx8IG1Db21wTmFtZSA9PSBhYWMpKSB7CisgICAgICAgIGlmICghbUNzZCkgeworICAgICAgICAgICAgQUxPR0UoIkNTRCBidWZmZXIgbWlzc2luZyIpOworICAgICAgICAgICAgQVNTRVJUX1RSVUUoZmFsc2UpOworICAgICAgICB9CisgICAgfQorICAgIEFTU0VSVF9FUShtRW9zLCB0cnVlKTsKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RvcCgpLCBDMl9PSyk7Cit9CisKK1RFU1RfRihDb2RlYzJBdWRpb0VuY0hpZGxUZXN0LCBFT1NUZXN0KSB7CisgICAgZGVzY3JpcHRpb24oIlRlc3QgZW1wdHkgaW5wdXQgYnVmZmVyIHdpdGggRU9TIGZsYWciKTsKKyAgICBpZiAobURpc2FibGVUZXN0KSByZXR1cm47CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0YXJ0KCksIEMyX09LKTsKKworICAgIHR5cGVkZWYgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBVTG9jazsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB3b3JrOworICAgIHsKKyAgICAgICAgVUxvY2sgbChtUXVldWVMb2NrKTsKKyAgICAgICAgaWYgKCFtV29ya1F1ZXVlLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIHdvcmsuc3dhcChtV29ya1F1ZXVlLmZyb250KCkpOworICAgICAgICAgICAgbVdvcmtRdWV1ZS5wb3BfZnJvbnQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dFKCJtV29ya1F1ZXVlIEVtcHR5IGlzIG5vdCBleHBlY3RlZCBhdCB0aGUgc3RhcnQgb2YgdGhlIHRlc3QiKTsKKyAgICAgICAgICAgIEFTU0VSVF9UUlVFKGZhbHNlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBBU1NFUlRfTkUod29yaywgbnVsbHB0cik7CisgICAgd29yay0+aW5wdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTTsKKyAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcCA9IDA7CisgICAgd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4ID0gMDsKKyAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5lbXBsYWNlX2JhY2sobmV3IEMyV29ya2xldCk7CisKKyAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IGl0ZW1zOworICAgIGl0ZW1zLnB1c2hfYmFjayhzdGQ6Om1vdmUod29yaykpOworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5xdWV1ZSgmaXRlbXMpLCBDMl9PSyk7CisgICAgdWludDMyX3QgcXVldWVTaXplOworICAgIHsKKyAgICAgICAgVUxvY2sgbChtUXVldWVMb2NrKTsKKyAgICAgICAgcXVldWVTaXplID0gbVdvcmtRdWV1ZS5zaXplKCk7CisgICAgICAgIGlmIChxdWV1ZVNpemUgPCBNQVhfSU5QVVRfQlVGRkVSUykgeworICAgICAgICAgICAgbVF1ZXVlQ29uZGl0aW9uLndhaXRfZm9yKGwsIFRJTUVfT1VUKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBBU1NFUlRfRVEobUVvcywgdHJ1ZSk7CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0b3AoKSwgQzJfT0spOworfQorCitURVNUX0YoQ29kZWMyQXVkaW9FbmNIaWRsVGVzdCwgRW1wdHlCdWZmZXJUZXN0KSB7CisgICAgZGVzY3JpcHRpb24oIlRlc3RzIGVtcHR5IGlucHV0IGJ1ZmZlciIpOworICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RhcnQoKSwgQzJfT0spOworCisgICAgdHlwZWRlZiBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IFVMb2NrOworICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+IHdvcms7CisgICAgeworICAgICAgICBVTG9jayBsKG1RdWV1ZUxvY2spOworICAgICAgICBpZiAoIW1Xb3JrUXVldWUuZW1wdHkoKSkgeworICAgICAgICAgICAgd29yay5zd2FwKG1Xb3JrUXVldWUuZnJvbnQoKSk7CisgICAgICAgICAgICBtV29ya1F1ZXVlLnBvcF9mcm9udCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0UoIm1Xb3JrUXVldWUgRW1wdHkgaXMgbm90IGV4cGVjdGVkIGF0IHRoZSBzdGFydCBvZiB0aGUgdGVzdCIpOworICAgICAgICAgICAgQVNTRVJUX1RSVUUoZmFsc2UpOworICAgICAgICB9CisgICAgfQorICAgIEFTU0VSVF9ORSh3b3JrLCBudWxscHRyKTsKKyAgICB3b3JrLT5pbnB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdCkwOworICAgIHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wID0gMDsKKyAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXggPSAwOworICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmVtcGxhY2VfYmFjayhuZXcgQzJXb3JrbGV0KTsKKworICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gaXRlbXM7CisgICAgaXRlbXMucHVzaF9iYWNrKHN0ZDo6bW92ZSh3b3JrKSk7CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnF1ZXVlKCZpdGVtcyksIEMyX09LKTsKKyAgICB1aW50MzJfdCBxdWV1ZVNpemU7CisgICAgeworICAgICAgICBVTG9jayBsKG1RdWV1ZUxvY2spOworICAgICAgICBxdWV1ZVNpemUgPSBtV29ya1F1ZXVlLnNpemUoKTsKKyAgICAgICAgaWYgKHF1ZXVlU2l6ZSA8IE1BWF9JTlBVVF9CVUZGRVJTKSB7CisgICAgICAgICAgICBtUXVldWVDb25kaXRpb24ud2FpdF9mb3IobCwgVElNRV9PVVQpOworICAgICAgICB9CisgICAgfQorICAgIEFTU0VSVF9FUShtV29ya1F1ZXVlLnNpemUoKSwgKHVpbnQzMl90KU1BWF9JTlBVVF9CVUZGRVJTKTsKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RvcCgpLCBDMl9PSyk7Cit9CisKK1RFU1RfRihDb2RlYzJBdWRpb0VuY0hpZGxUZXN0LCBGbHVzaFRlc3QpIHsKKyAgICBkZXNjcmlwdGlvbigiVGVzdCBSZXF1ZXN0IGZvciBmbHVzaCIpOworICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RhcnQoKSwgQzJfT0spOworCisgICAgdHlwZWRlZiBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IFVMb2NrOworICAgIGNoYXIgbVVSTFs1MTJdOworICAgIHN0cmNweShtVVJMLCBnRW52LT5nZXRSZXMoKS5jX3N0cigpKTsKKyAgICBHZXRVUkxGb3JDb21wb25lbnQobUNvbXBOYW1lLCBtVVJMKTsKKworICAgIC8vIFNldHRpbmcgZGVmYXVsdCBjb25maWd1cmF0aW9uCisgICAgbUZsdXNoZWRJbmRpY2VzLmNsZWFyKCk7CisgICAgaW50MzJfdCBuQ2hhbm5lbHMgPSAyOworICAgIGludDMyX3QgblNhbXBsZVJhdGUgPSA0NDEwMDsKKyAgICBpbnQzMl90IHNhbXBsZXNQZXJGcmFtZSA9IDEwMjQ7CisgICAgc3dpdGNoIChtQ29tcE5hbWUpIHsKKyAgICAgICAgY2FzZSBhYWM6CisgICAgICAgICAgICBuQ2hhbm5lbHMgPSAyOworICAgICAgICAgICAgblNhbXBsZVJhdGUgPSA0ODAwMDsKKyAgICAgICAgICAgIHNhbXBsZXNQZXJGcmFtZSA9IDEwMjQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBmbGFjOgorICAgICAgICAgICAgbkNoYW5uZWxzID0gMjsKKyAgICAgICAgICAgIG5TYW1wbGVSYXRlID0gNDgwMDA7CisgICAgICAgICAgICBzYW1wbGVzUGVyRnJhbWUgPSAxMTUyOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgYW1ybmI6CisgICAgICAgICAgICBuQ2hhbm5lbHMgPSAxOworICAgICAgICAgICAgblNhbXBsZVJhdGUgPSA4MDAwOworICAgICAgICAgICAgc2FtcGxlc1BlckZyYW1lID0gMTYwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgYW1yd2I6CisgICAgICAgICAgICBuQ2hhbm5lbHMgPSAxOworICAgICAgICAgICAgblNhbXBsZVJhdGUgPSAxNjAwMDsKKyAgICAgICAgICAgIHNhbXBsZXNQZXJGcmFtZSA9IDE2MDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQVNTRVJUX1RSVUUoZmFsc2UpOworICAgIH0KKyAgICBzZXR1cENvbmZpZ1BhcmFtKG1Db21wb25lbnQsIG5DaGFubmVscywgblNhbXBsZVJhdGUpOworICAgIHN0ZDo6aWZzdHJlYW0gZWxlU3RyZWFtOworICAgIHVpbnQzMl90IG51bUZyYW1lc0ZsdXNoZWQgPSAzMDsKKyAgICB1aW50MzJfdCBudW1GcmFtZXMgPSAxMjg7CisgICAgZWxlU3RyZWFtLm9wZW4obVVSTCwgc3RkOjppZnN0cmVhbTo6YmluYXJ5KTsKKyAgICBBU1NFUlRfRVEoZWxlU3RyZWFtLmlzX29wZW4oKSwgdHJ1ZSk7CisgICAgQUxPR1YoIm1VUkwgOiAlcyIsIG1VUkwpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICBlbmNvZGVORnJhbWVzKG1Db21wb25lbnQsIG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICBtRmx1c2hlZEluZGljZXMsIG1MaW5lYXJQb29sLCBlbGVTdHJlYW0sIG51bUZyYW1lc0ZsdXNoZWQsCisgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlc1BlckZyYW1lLCBuQ2hhbm5lbHMsIG5TYW1wbGVSYXRlKSk7CisgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBmbHVzaGVkV29yazsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPQorICAgICAgICBtQ29tcG9uZW50LT5mbHVzaChDMkNvbXBvbmVudDo6RkxVU0hfQ09NUE9ORU5ULCAmZmx1c2hlZFdvcmspOworICAgIEFTU0VSVF9FUShlcnIsIEMyX09LKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgd2FpdE9uSW5wdXRDb25zdW1wdGlvbihtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsCisgICAgICAgICAgICAoc2l6ZV90KU1BWF9JTlBVVF9CVUZGRVJTIC0gZmx1c2hlZFdvcmsuc2l6ZSgpKSk7CisgICAgdWludDY0X3QgZnJhbWVJbmRleDsKKyAgICB7CisgICAgICAgIC8vVXBkYXRlIG1GbHVzaGVkSW5kaWNlcyBiYXNlZCBvbiB0aGUgaW5kZXggcmVjZWl2ZWQgZnJvbSBmbHVzaCgpCisgICAgICAgIFVMb2NrIGwobVF1ZXVlTG9jayk7CisgICAgICAgIGZvciAoc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmsgOiBmbHVzaGVkV29yaykgeworICAgICAgICAgICAgQVNTRVJUX05FKHdvcmssIG51bGxwdHIpOworICAgICAgICAgICAgZnJhbWVJbmRleCA9IHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpOworICAgICAgICAgICAgc3RkOjpsaXN0PHVpbnQ2NF90Pjo6aXRlcmF0b3IgZnJhbWVJbmRleEl0ID0KKyAgICAgICAgICAgICAgICBzdGQ6OmZpbmQobUZsdXNoZWRJbmRpY2VzLmJlZ2luKCksIG1GbHVzaGVkSW5kaWNlcy5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVJbmRleCk7CisgICAgICAgICAgICBpZiAoIW1GbHVzaGVkSW5kaWNlcy5lbXB0eSgpICYmCisgICAgICAgICAgICAgICAgKGZyYW1lSW5kZXhJdCAhPSBtRmx1c2hlZEluZGljZXMuZW5kKCkpKSB7CisgICAgICAgICAgICAgICAgbUZsdXNoZWRJbmRpY2VzLmVyYXNlKGZyYW1lSW5kZXhJdCk7CisgICAgICAgICAgICAgICAgd29yay0+aW5wdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgbVdvcmtRdWV1ZS5wdXNoX2JhY2soc3RkOjptb3ZlKHdvcmspKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBtRmx1c2hlZEluZGljZXMuY2xlYXIoKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgZW5jb2RlTkZyYW1lcyhtQ29tcG9uZW50LCBtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgbUZsdXNoZWRJbmRpY2VzLCBtTGluZWFyUG9vbCwgZWxlU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgIG51bUZyYW1lcyAtIG51bUZyYW1lc0ZsdXNoZWQsIHNhbXBsZXNQZXJGcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICBuQ2hhbm5lbHMsIG5TYW1wbGVSYXRlLCB0cnVlKSk7CisgICAgZWxlU3RyZWFtLmNsb3NlKCk7CisgICAgZXJyID0KKyAgICAgICAgbUNvbXBvbmVudC0+Zmx1c2goQzJDb21wb25lbnQ6OkZMVVNIX0NPTVBPTkVOVCwgJmZsdXNoZWRXb3JrKTsKKyAgICBBU1NFUlRfRVEoZXJyLCBDMl9PSyk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgIHdhaXRPbklucHV0Q29uc3VtcHRpb24obVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLAorICAgICAgICAgICAgKHNpemVfdClNQVhfSU5QVVRfQlVGRkVSUyAtIGZsdXNoZWRXb3JrLnNpemUoKSkpOworICAgIHsKKyAgICAgICAgLy9VcGRhdGUgbUZsdXNoZWRJbmRpY2VzIGJhc2VkIG9uIHRoZSBpbmRleCByZWNlaXZlZCBmcm9tIGZsdXNoKCkKKyAgICAgICAgVUxvY2sgbChtUXVldWVMb2NrKTsKKyAgICAgICAgZm9yIChzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yayA6IGZsdXNoZWRXb3JrKSB7CisgICAgICAgICAgICBBU1NFUlRfTkUod29yaywgbnVsbHB0cik7CisgICAgICAgICAgICBmcmFtZUluZGV4ID0gd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCk7CisgICAgICAgICAgICBzdGQ6Omxpc3Q8dWludDY0X3Q+OjppdGVyYXRvciBmcmFtZUluZGV4SXQgPQorICAgICAgICAgICAgICAgIHN0ZDo6ZmluZChtRmx1c2hlZEluZGljZXMuYmVnaW4oKSwgbUZsdXNoZWRJbmRpY2VzLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUluZGV4KTsKKyAgICAgICAgICAgIGlmICghbUZsdXNoZWRJbmRpY2VzLmVtcHR5KCkgJiYKKyAgICAgICAgICAgICAgICAoZnJhbWVJbmRleEl0ICE9IG1GbHVzaGVkSW5kaWNlcy5lbmQoKSkpIHsKKyAgICAgICAgICAgICAgICBtRmx1c2hlZEluZGljZXMuZXJhc2UoZnJhbWVJbmRleEl0KTsKKyAgICAgICAgICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICBtV29ya1F1ZXVlLnB1c2hfYmFjayhzdGQ6Om1vdmUod29yaykpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIEFTU0VSVF9FUShtRmx1c2hlZEluZGljZXMuZW1wdHkoKSwgdHJ1ZSk7CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0b3AoKSwgQzJfT0spOworfQorCit9ICAvLyBhbm9ueW1vdXMgbmFtZXNwYWNlCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgeworICAgIGdFbnYgPSBuZXcgQ29tcG9uZW50VGVzdEVudmlyb25tZW50KCk7CisgICAgOjp0ZXN0aW5nOjpBZGRHbG9iYWxUZXN0RW52aXJvbm1lbnQoZ0Vudik7CisgICAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CisgICAgZ0Vudi0+aW5pdCgmYXJnYywgYXJndik7CisgICAgaW50IHN0YXR1cyA9IGdFbnYtPmluaXRGcm9tT3B0aW9ucyhhcmdjLCBhcmd2KTsKKyAgICBpZiAoc3RhdHVzID09IDApIHsKKyAgICAgICAgaW50IHN0YXR1cyA9IFJVTl9BTExfVEVTVFMoKTsKKyAgICAgICAgTE9HKElORk8pIDw8ICJDMiBUZXN0IHJlc3VsdCA9ICIgPDwgc3RhdHVzOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9hdWRpby9tZWRpYV9jMl9hdWRpb19oaWRsX3Rlc3RfY29tbW9uLmggYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2F1ZGlvL21lZGlhX2MyX2F1ZGlvX2hpZGxfdGVzdF9jb21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWViNjllCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9hdWRpby9tZWRpYV9jMl9hdWRpb19oaWRsX3Rlc3RfY29tbW9uLmgKQEAgLTAsMCArMSwyNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgTUVESUFfQzJfQVVESU9fSElETF9URVNUX0NPTU1PTl9ICisjZGVmaW5lIE1FRElBX0MyX0FVRElPX0hJRExfVEVTVF9DT01NT05fSAorCisjZGVmaW5lIE1BWF9SRVRSWSAyMAorI2RlZmluZSBUSU1FX09VVCAyMDBtcworI2RlZmluZSBNQVhfSU5QVVRfQlVGRkVSUyA4CisKKyNlbmRpZiAgLy8gTUVESUFfQzJfQVVESU9fSElETF9URVNUX0NPTU1PTl9ICmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2NvbW1vbi9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9jb21tb24vQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGY0NmVkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9jb21tb24vQW5kcm9pZC5icApAQCAtMCwwICsxLDMzIEBACitjY19saWJyYXJ5X3N0YXRpYyB7CisgICAgbmFtZTogIlZ0c01lZGlhQzJWMV8wQ29tbW9uVXRpbCIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgIlZ0c0hhbFRhcmdldFRlc3REZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzItaGlkbC1kZWZhdWx0cyIsCisgICAgXSwKKworICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9jb2RlYzIvaGlkbC9jbGllbnQvaW5jbHVkZSIsCisgICAgXSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIm1lZGlhX2MyX2hpZGxfdGVzdF9jb21tb24uY3BwIiwKKyAgICBdLAorCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyIuIl0sCit9CisKK2NjX2RlZmF1bHRzIHsKKyAgICBuYW1lOiAiVnRzTWVkaWFDMlYxXzBEZWZhdWx0cyIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgIlZ0c0hhbFRhcmdldFRlc3REZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzItaGlkbC1kZWZhdWx0cyIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJWdHNNZWRpYUMyVjFfMENvbW1vblV0aWwiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliY29kZWMyX2NsaWVudCIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvY29tbW9uL1JFQURNRS5tZCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvY29tbW9uL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTU2OWE4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9jb21tb24vUkVBRE1FLm1kCkBAIC0wLDAgKzEsMjIgQEAKKyMjIENvZGVjMiBIYWwgQCAxLjAgdGVzdHMgIyMKKy0tLQorIyMjIyBtYXN0ZXIgOgorRnVuY3Rpb25hbGl0eSBvZiBtYXN0ZXIgaXMgdG8gZW51bWVyYXRlIGFsbCB0aGUgQ29kZWMyIGNvbXBvbmVudHMgYXZhaWxhYmxlIGluIEMyIG1lZGlhIHNlcnZpY2UuCisKK3VzYWdlOiBNdHNIaWRsQzJWMVxfMFRhcmdldE1hc3RlclRlc3QgLUkgc29mdHdhcmUKKworIyMjIyBjb21wb25lbnQgOgorRnVuY3Rpb25hbGl0eSBvZiBjb21wb25lbnQgaXMgdG8gdGVzdCBjb21tb24gZnVuY3Rpb25hbGl0eSBhY3Jvc3MgYWxsIHRoZSBDb2RlYzIgY29tcG9uZW50cyBhdmFpbGFibGUgaW4gQzIgbWVkaWEgc2VydmljZS4gRm9yIGEgc3RhbmRhcmQgQzIgY29tcG9uZW50LCB0aGVzZSB0ZXN0cyBhcmUgZXhwZWN0ZWQgdG8gcGFzcy4KKwordXNhZ2U6IE10c0hpZGxDMlYxXF8wVGFyZ2V0Q29tcG9uZW50VGVzdCAtSSBzb2Z0d2FyZSAtQyA8Y29tcCBuYW1lPgorCisjIyMjIGF1ZGlvIDoKK0Z1bmN0aW9uYWxpdHkgb2YgYXVkaW8gdGVzdCBpcyB0byB2YWxpZGF0ZSBhdWRpbyBzcGVjaWZpYyBmdW5jdGlvbmFsaXR5IENvZGVjMiBjb21wb25lbnRzLiBUaGUgcmVzb3VyY2UgZmlsZXMgZm9yIHRoaXMgdGVzdCBhcmUgdGFrZW4gZnJvbSBoYXJkd2FyZS9pbnRlcmZhY2VzL21lZGlhL3Jlcy4gVGhlIHBhdGggdG8gdGhlc2UgZmlsZXMgb24gdGhlIGRldmljZSBpcyByZXF1aXJlZCB0byBiZSBnaXZlbiBmb3IgYml0c3RyZWFtIHRlc3RzLgorCit1c2FnZTogTXRzSGlkbEMyVjFcXzBUYXJnZXRBdWRpb0RlY1Rlc3QgLUkgc29mdHdhcmUgLUMgPGNvbXAgbmFtZT4gLVAgL3NkY2FyZC9tZWRpYQorCisjIyMjIHZpZGVvIDoKK0Z1bmN0aW9uYWxpdHkgb2YgdmlkZW8gdGVzdCBpcyB0byB2YWxpZGF0ZSB2aWRlbyBzcGVjaWZpYyBmdW5jdGlvbmFsaXR5IENvZGVjMiBjb21wb25lbnRzLiBUaGUgcmVzb3VyY2UgZmlsZXMgZm9yIHRoaXMgdGVzdCBhcmUgdGFrZW4gZnJvbSBoYXJkd2FyZS9pbnRlcmZhY2VzL21lZGlhL3Jlcy4gVGhlIHBhdGggdG8gdGhlc2UgZmlsZXMgb24gdGhlIGRldmljZSBpcyByZXF1aXJlZCB0byBiZSBnaXZlbiBmb3IgYml0c3RyZWFtIHRlc3RzLgorCit1c2FnZTogTXRzSGlkbEMyVjFcXzBUYXJnZXRWaWRlb0RlY1Rlc3QgLUkgc29mdHdhcmUgLUMgPGNvbXAgbmFtZT4gLVAgL3NkY2FyZC9tZWRpYQorCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2NvbW1vbi9tZWRpYV9jMl9oaWRsX3Rlc3RfY29tbW9uLmNwcCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvY29tbW9uL21lZGlhX2MyX2hpZGxfdGVzdF9jb21tb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkY2NkYmIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2NvbW1vbi9tZWRpYV9jMl9oaWRsX3Rlc3RfY29tbW9uLmNwcApAQCAtMCwwICsxLDUyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJtZWRpYV9jMl9oaWRsX3Rlc3RfY29tbW9uIgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJtZWRpYV9jMl9oaWRsX3Rlc3RfY29tbW9uLmgiCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YzI6OlYxXzA6OkZpZWxkU3VwcG9ydGVkVmFsdWVzOworCit2b2lkIGR1bXBGU1YoY29uc3QgRmllbGRTdXBwb3J0ZWRWYWx1ZXMmIHN2KSB7CisgICAgQUxPR0QoIkR1bXBpbmcgRlNWIGRhdGEiKTsKKyAgICB1c2luZyBuYW1lc3BhY2Ugc3RkOworICAgIGlmIChzdi50eXBlID09IEZpZWxkU3VwcG9ydGVkVmFsdWVzOjpUeXBlOjpFTVBUWSkgeworICAgICAgICBBTE9HRCgiRlNWIFZhbHVlIGlzIEVtcHR5Iik7CisgICAgfQorICAgIGlmIChzdi50eXBlID09IEZpZWxkU3VwcG9ydGVkVmFsdWVzOjpUeXBlOjpSQU5HRSkgeworICAgICAgICBBTE9HRCgiRHVtcGluZyBGU1YgcmFuZ2UiKTsKKyAgICAgICAgY291dCA8PCAiLnJhbmdlKCIgPDwgc3YucmFuZ2UubWluOworICAgICAgICBpZiAoc3YucmFuZ2Uuc3RlcCAhPSAwKSB7CisgICAgICAgICAgICBjb3V0IDw8ICI6IiA8PCBzdi5yYW5nZS5zdGVwOworICAgICAgICB9CisgICAgICAgIGlmIChzdi5yYW5nZS5udW0gIT0gMSB8fCBzdi5yYW5nZS5kZW5vbSAhPSAxKSB7CisgICAgICAgICAgICBjb3V0IDw8ICI6IiA8PCBzdi5yYW5nZS5udW0gPDwgIi8iIDw8IHN2LnJhbmdlLmRlbm9tOworICAgICAgICB9CisgICAgICAgIGNvdXQgPDwgIiAiIDw8IHN2LnJhbmdlLm1heCA8PCAiKSI7CisgICAgfQorICAgIGlmIChzdi52YWx1ZXMuc2l6ZSgpKSB7CisgICAgICAgIEFMT0dEKCJEdW1waW5nIEZTViB2YWx1ZSIpOworICAgICAgICBjb3V0IDw8IChzdi50eXBlID09IEZpZWxkU3VwcG9ydGVkVmFsdWVzOjpUeXBlOjpGTEFHUyA/ICIuZmxhZ3MoIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICIubGlzdCgiKTsKKyAgICAgICAgY29uc3QgY2hhciogc2VwID0gIiI7CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgcCA6IHN2LnZhbHVlcykgeworICAgICAgICAgICAgY291dCA8PCBzZXAgPDwgcDsKKyAgICAgICAgICAgIHNlcCA9ICIsIjsKKyAgICAgICAgfQorICAgICAgICBjb3V0IDw8ICIpIjsKKyAgICB9CisgICAgY291dCA8PCBlbmRsOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9jb21tb24vbWVkaWFfYzJfaGlkbF90ZXN0X2NvbW1vbi5oIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9jb21tb24vbWVkaWFfYzJfaGlkbF90ZXN0X2NvbW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3NjViYWEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2NvbW1vbi9tZWRpYV9jMl9oaWRsX3Rlc3RfY29tbW9uLmgKQEAgLTAsMCArMSwxODAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIE1FRElBX0MyX0hJRExfVEVTVF9DT01NT05fSAorI2RlZmluZSBNRURJQV9DMl9ISURMX1RFU1RfQ09NTU9OX0gKKworI2luY2x1ZGUgPGNvZGVjMi9oaWRsL2NsaWVudC5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9jMi8xLjAvdHlwZXMuaD4KKworI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisjaW5jbHVkZSA8aGlkbC9IaWRsU3VwcG9ydC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTXV0ZXhlZC5oPgorCit1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOjpWMV8wOwordXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpjMjo6VjFfMDo6dXRpbHM7CisKK3VzaW5nIDo6YW5kcm9pZDo6TXV0ZXhlZDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOworCisjaW5jbHVkZSA8VnRzSGFsSGlkbFRhcmdldFRlc3RFbnZCYXNlLmg+CisKKy8qCisgKiBIYW5kbGUgQ2FsbGJhY2sgZnVuY3Rpb25zIG9uV29ya0RvbmUoKSwgb25UcmlwcGVkKCksCisgKiBvbkVycm9yKCksIG9uRGVhdGgoKSwgb25GcmFtZXNSZW5kZXJlZCgpCisgKi8KK3N0cnVjdCBDb2RlY0xpc3RlbmVyIDogcHVibGljIGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6TGlzdGVuZXIgeworICAgcHVibGljOgorICAgIENvZGVjTGlzdGVuZXIoCisgICAgICAgIGNvbnN0IHN0ZDo6ZnVuY3Rpb248dm9pZChzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrSXRlbXMpPiBmbiA9CisgICAgICAgICAgICBudWxscHRyKQorICAgICAgICA6IGNhbGxCYWNrKGZuKSB7fQorICAgIHZpcnR1YWwgdm9pZCBvbldvcmtEb25lKAorICAgICAgICBjb25zdCBzdGQ6OndlYWtfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q29tcG9uZW50PiYgY29tcCwKKyAgICAgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiYgd29ya0l0ZW1zLAorICAgICAgICBzaXplX3QgbnVtRGlzY2FyZGVkSW5wdXRCdWZmZXJzKSBvdmVycmlkZSB7CisgICAgICAgIC8qIFRPRE8gKi8KKyAgICAgICAgQUxPR0QoIm9uV29ya0RvbmUgY2FsbGVkIik7CisgICAgICAgICh2b2lkKWNvbXA7CisgICAgICAgICh2b2lkKW51bURpc2NhcmRlZElucHV0QnVmZmVyczsKKyAgICAgICAgaWYgKGNhbGxCYWNrKSBjYWxsQmFjayh3b3JrSXRlbXMpOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBvblRyaXBwZWQoCisgICAgICAgIGNvbnN0IHN0ZDo6d2Vha19wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+JiBjb21wLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4mIHNldHRpbmdSZXN1bHRzKQorICAgICAgICBvdmVycmlkZSB7CisgICAgICAgIC8qIFRPRE8gKi8KKyAgICAgICAgKHZvaWQpY29tcDsKKyAgICAgICAgKHZvaWQpc2V0dGluZ1Jlc3VsdHM7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIG9uRXJyb3IoCisgICAgICAgIGNvbnN0IHN0ZDo6d2Vha19wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+JiBjb21wLAorICAgICAgICB1aW50MzJfdCBlcnJvckNvZGUpIG92ZXJyaWRlIHsKKyAgICAgICAgLyogVE9ETyAqLworICAgICAgICAodm9pZCljb21wOworICAgICAgICBBTE9HRCgib25FcnJvciBjYWxsZWQiKTsKKyAgICAgICAgaWYgKGVycm9yQ29kZSAhPSAwKSBBTE9HRSgiRXJyb3IgOiAldSIsIGVycm9yQ29kZSk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIG9uRGVhdGgoCisgICAgICAgIGNvbnN0IHN0ZDo6d2Vha19wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+JiBjb21wKSBvdmVycmlkZSB7CisgICAgICAgIC8qIFRPRE8gKi8KKyAgICAgICAgKHZvaWQpY29tcDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgb25JbnB1dEJ1ZmZlckRvbmUoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4mIGJ1ZmZlcikgb3ZlcnJpZGUgeworICAgICAgICAvKiBUT0RPICovCisgICAgICAgICh2b2lkKWJ1ZmZlcjsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgb25GcmFtZXNSZW5kZXJlZCgKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8UmVuZGVyZWRGcmFtZT4mIHJlbmRlcmVkRnJhbWVzKSBvdmVycmlkZSB7CisgICAgICAgIC8qIFRPRE8gKi8KKyAgICAgICAgKHZvaWQpcmVuZGVyZWRGcmFtZXM7CisgICAgfQorICAgIC8vIHN0ZDo6bXV0ZXggbVF1ZXVlTG9jazsKKyAgICAvLyBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSBtUXVldWVDb25kaXRpb247CisgICAgLy8gc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBtV29ya1F1ZXVlOworICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrSXRlbXMpPiBjYWxsQmFjazsKK307CisKKy8vIEEgY2xhc3MgZm9yIHRlc3QgZW52aXJvbm1lbnQgc2V0dXAKK2NsYXNzIENvbXBvbmVudFRlc3RFbnZpcm9ubWVudCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlZ0c0hhbEhpZGxUYXJnZXRUZXN0RW52QmFzZSB7CisgICBwcml2YXRlOgorICAgIHR5cGVkZWYgOjp0ZXN0aW5nOjpWdHNIYWxIaWRsVGFyZ2V0VGVzdEVudkJhc2UgU3VwZXI7CisKKyAgIHB1YmxpYzoKKyAgICB2aXJ0dWFsIHZvaWQgcmVnaXN0ZXJUZXN0U2VydmljZXMoKSBvdmVycmlkZSB7CisgICAgICAgIHJlZ2lzdGVyVGVzdFNlcnZpY2U8SUNvbXBvbmVudFN0b3JlPigpOworICAgIH0KKworICAgIENvbXBvbmVudFRlc3RFbnZpcm9ubWVudCgpIDogcmVzKCIvc2RjYXJkL21lZGlhLyIpIHt9CisKKyAgICB2b2lkIHNldENvbXBvbmVudChjb25zdCBjaGFyKiBfY29tcG9uZW50KSB7IGNvbXBvbmVudCA9IF9jb21wb25lbnQ7IH0KKworICAgIHZvaWQgc2V0SW5zdGFuY2UoY29uc3QgY2hhciogX2luc3RhbmNlKSB7IGluc3RhbmNlID0gX2luc3RhbmNlOyB9CisKKyAgICB2b2lkIHNldFJlcyhjb25zdCBjaGFyKiBfcmVzKSB7IHJlcyA9IF9yZXM7IH0KKworICAgIGNvbnN0IGhpZGxfc3RyaW5nIGdldEluc3RhbmNlKCkgY29uc3QgeyByZXR1cm4gaW5zdGFuY2U7IH0KKworICAgIGNvbnN0IGhpZGxfc3RyaW5nIGdldENvbXBvbmVudCgpIGNvbnN0IHsgcmV0dXJuIGNvbXBvbmVudDsgfQorCisgICAgY29uc3QgaGlkbF9zdHJpbmcgZ2V0UmVzKCkgY29uc3QgeyByZXR1cm4gcmVzOyB9CisKKyAgICBpbnQgaW5pdEZyb21PcHRpb25zKGludCBhcmdjLCBjaGFyKiogYXJndikgeworICAgICAgICBzdGF0aWMgc3RydWN0IG9wdGlvbiBvcHRpb25zW10gPSB7CisgICAgICAgICAgICB7Imluc3RhbmNlIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdJJ30sCisgICAgICAgICAgICB7ImNvbXBvbmVudCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnQyd9LAorICAgICAgICAgICAgeyJyZXMiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ1AnfSwKKyAgICAgICAgICAgIHswLCAwLCAwLCAwfX07CisKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIGludCBpbmRleCA9IDA7CisgICAgICAgICAgICBpbnQgYyA9IGdldG9wdF9sb25nKGFyZ2MsIGFyZ3YsICJJOkM6UDoiLCBvcHRpb25zLCAmaW5kZXgpOworICAgICAgICAgICAgaWYgKGMgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoIChjKSB7CisgICAgICAgICAgICAgICAgY2FzZSAnSSc6CisgICAgICAgICAgICAgICAgICAgIHNldEluc3RhbmNlKG9wdGFyZyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgJ0MnOgorICAgICAgICAgICAgICAgICAgICBzZXRDb21wb25lbnQob3B0YXJnKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAnUCc6CisgICAgICAgICAgICAgICAgICAgIHNldFJlcyhvcHRhcmcpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICc/JzoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAob3B0aW5kIDwgYXJnYykgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAgICAgICAgICJ1bnJlY29nbml6ZWQgb3B0aW9uOiAlc1xuXG4iCisgICAgICAgICAgICAgICAgICAgICJ1c2FnZTogJXMgPGd0ZXN0IG9wdGlvbnM+IDx0ZXN0IG9wdGlvbnM+XG5cbiIKKyAgICAgICAgICAgICAgICAgICAgInRlc3Qgb3B0aW9ucyBhcmU6XG5cbiIKKyAgICAgICAgICAgICAgICAgICAgIi1JLCAtLWluc3RhbmNlOiBzb2Z0d2FyZSBmb3IgQzIgY29tcG9uZW50cywgZWxzZSBkZWZhdWx0XG4iCisgICAgICAgICAgICAgICAgICAgICItQywgLS1jb21wb25lbnQ6IEMyIGNvbXBvbmVudCB0byB0ZXN0XG4iCisgICAgICAgICAgICAgICAgICAgICItUCwgLS1yZXM6IFJlc291cmNlIGZpbGVzIGRpcmVjdG9yeSBsb2NhdGlvblxuIiwKKyAgICAgICAgICAgICAgICAgICAgYXJndltvcHRpbmQgPzogMV0sIGFyZ3ZbMF0pOworICAgICAgICAgICAgcmV0dXJuIDI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICBwcml2YXRlOgorICAgIGhpZGxfc3RyaW5nIGluc3RhbmNlOworICAgIGhpZGxfc3RyaW5nIGNvbXBvbmVudDsKKyAgICBoaWRsX3N0cmluZyByZXM7Cit9OworCisvKgorICogY29tbW9uIGZ1bmN0aW9ucyBkZWNsYXJhdGlvbnMKKyAqLwordm9pZCBkdW1wRlNWKGNvbnN0IEZpZWxkU3VwcG9ydGVkVmFsdWVzJiBzdik7CisjZW5kaWYgIC8vIE1FRElBX0MyX0hJRExfVEVTVF9DT01NT05fSApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9jb21wb25lbnQvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvY29tcG9uZW50L0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI5MTNiNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvY29tcG9uZW50L0FuZHJvaWQuYnAKQEAgLTAsMCArMSwyMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJWdHNIaWRsQzJWMV8wVGFyZ2V0Q29tcG9uZW50VGVzdCIsCisgICAgZGVmYXVsdHM6IFsiVnRzTWVkaWFDMlYxXzBEZWZhdWx0cyJdLAorICAgIHNyY3M6IFsiVnRzSGlkbEMyVjFfMFRhcmdldENvbXBvbmVudFRlc3QuY3BwIl0sCit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvY29tcG9uZW50L1Z0c0hpZGxDMlYxXzBUYXJnZXRDb21wb25lbnRUZXN0LmNwcCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvY29tcG9uZW50L1Z0c0hpZGxDMlYxXzBUYXJnZXRDb21wb25lbnRUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2ZiNjU1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9jb21wb25lbnQvVnRzSGlkbEMyVjFfMFRhcmdldENvbXBvbmVudFRlc3QuY3BwCkBAIC0wLDAgKzEsMjA5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJjb2RlYzJfaGlkbF9oYWxfY29tcG9uZW50X3Rlc3QiCisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlIDxDMkNvbmZpZy5oPgorI2luY2x1ZGUgPGNvZGVjMi9oaWRsL2NsaWVudC5oPgorCisjaW5jbHVkZSA8VnRzSGFsSGlkbFRhcmdldFRlc3RCYXNlLmg+CisjaW5jbHVkZSAibWVkaWFfYzJfaGlkbF90ZXN0X2NvbW1vbi5oIgorCitzdGF0aWMgQ29tcG9uZW50VGVzdEVudmlyb25tZW50KiBnRW52ID0gbnVsbHB0cjsKKworbmFtZXNwYWNlIHsKKworLy8gZ29vZ2xlLmNvZGVjMiBDb21wb25lbnQgdGVzdCBzZXR1cAorY2xhc3MgQ29kZWMyQ29tcG9uZW50SGlkbFRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpWdHNIYWxIaWRsVGFyZ2V0VGVzdEJhc2UgeworICAgcHJpdmF0ZToKKyAgICB0eXBlZGVmIDo6dGVzdGluZzo6VnRzSGFsSGlkbFRhcmdldFRlc3RCYXNlIFN1cGVyOworCisgICBwdWJsaWM6CisgICAgdmlydHVhbCB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeworICAgICAgICBTdXBlcjo6U2V0VXAoKTsKKyAgICAgICAgbUNsaWVudCA9IGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q3JlYXRlRnJvbVNlcnZpY2UoCisgICAgICAgICAgICBnRW52LT5nZXRJbnN0YW5jZSgpLmNfc3RyKCkpOworICAgICAgICBBU1NFUlRfTkUobUNsaWVudCwgbnVsbHB0cik7CisgICAgICAgIG1MaXN0ZW5lci5yZXNldChuZXcgQ29kZWNMaXN0ZW5lcigpKTsKKyAgICAgICAgQVNTRVJUX05FKG1MaXN0ZW5lciwgbnVsbHB0cik7CisgICAgICAgIG1DbGllbnQtPmNyZWF0ZUNvbXBvbmVudChnRW52LT5nZXRDb21wb25lbnQoKS5jX3N0cigpLCBtTGlzdGVuZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbUNvbXBvbmVudCk7CisgICAgICAgIEFTU0VSVF9ORShtQ29tcG9uZW50LCBudWxscHRyKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7CisgICAgICAgIGlmIChtQ29tcG9uZW50ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIC8vIElmIHlvdSBoYXZlIGVuY291bnRlcmVkIGEgZmF0YWwgZmFpbHVyZSwgaXQgaXMgcG9zc2libGUgdGhhdAorICAgICAgICAgICAgLy8gZnJlZU5vZGUoKSB3aWxsIG5vdCBnbyB0aHJvdWdoLiBJbnN0ZWFkIG9mIGhhbmdpbmcgdGhlIGFwcC4KKyAgICAgICAgICAgIC8vIGxldCBpdCBwYXNzIHRocm91Z2ggYW5kIHJlcG9ydCBlcnJvcnMKKyAgICAgICAgICAgIGlmICg6OnRlc3Rpbmc6OlRlc3Q6Okhhc0ZhdGFsRmFpbHVyZSgpKSByZXR1cm47CisgICAgICAgICAgICBtQ29tcG9uZW50LT5yZWxlYXNlKCk7CisgICAgICAgICAgICBtQ29tcG9uZW50ID0gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICBTdXBlcjo6VGVhckRvd24oKTsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50PiBtQ2xpZW50OworICAgIHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ6Okxpc3RlbmVyPiBtTGlzdGVuZXI7CisgICAgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q29tcG9uZW50PiBtQ29tcG9uZW50OworCisgICBwcm90ZWN0ZWQ6CisgICAgc3RhdGljIHZvaWQgZGVzY3JpcHRpb24oY29uc3Qgc3RkOjpzdHJpbmcmIGRlc2NyaXB0aW9uKSB7CisgICAgICAgIFJlY29yZFByb3BlcnR5KCJkZXNjcmlwdGlvbiIsIGRlc2NyaXB0aW9uKTsKKyAgICB9Cit9OworCisvLyBUZXN0IEVtcHR5IEZsdXNoCitURVNUX0YoQ29kZWMyQ29tcG9uZW50SGlkbFRlc3QsIEVtcHR5Rmx1c2gpIHsKKyAgICBBTE9HVigiRW1wdHkgRmx1c2ggVGVzdCIpOworICAgIGMyX3N0YXR1c190IGVyciA9IG1Db21wb25lbnQtPnN0YXJ0KCk7CisgICAgQVNTRVJUX0VRKGVyciwgQzJfT0spOworCisgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBmbHVzaGVkV29yazsKKyAgICBlcnIgPSBtQ29tcG9uZW50LT5mbHVzaChDMkNvbXBvbmVudDo6RkxVU0hfQ09NUE9ORU5ULCAmZmx1c2hlZFdvcmspOworICAgIEFTU0VSVF9FUShlcnIsIEMyX09LKTsKKworICAgIGVyciA9IG1Db21wb25lbnQtPnN0b3AoKTsKKyAgICBBU1NFUlRfRVEoZXJyLCBDMl9PSyk7CisgICAgLy8gRW1wdHkgRmx1c2ggc2hvdWxkIG5vdCByZXR1cm4gYW55IHdvcmsKKyAgICBBU1NFUlRfRVEoZmx1c2hlZFdvcmsuc2l6ZSgpLCAwdSk7Cit9CisKKy8vIFRlc3QgUXVldWUgRW1wdHkgV29yaworVEVTVF9GKENvZGVjMkNvbXBvbmVudEhpZGxUZXN0LCBRdWV1ZUVtcHR5V29yaykgeworICAgIEFMT0dWKCJRdWV1ZSBFbXB0eSBXb3JrIFRlc3QiKTsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBtQ29tcG9uZW50LT5zdGFydCgpOworICAgIEFTU0VSVF9FUShlcnIsIEMyX09LKTsKKworICAgIC8vIFF1ZXVlaW5nIGFuIGVtcHR5IFdvcmtCdW5kbGUKKyAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IHdvcmtMaXN0OworICAgIGVyciA9IG1Db21wb25lbnQtPnF1ZXVlKCZ3b3JrTGlzdCk7CisgICAgQVNTRVJUX0VRKGVyciwgQzJfT0spOworCisgICAgZXJyID0gbUNvbXBvbmVudC0+cmVzZXQoKTsKKyAgICBBU1NFUlRfRVEoZXJyLCBDMl9PSyk7Cit9CisKKy8vIFRlc3QgQ29tcG9uZW50IENvbmZpZ3VyYXRpb24KK1RFU1RfRihDb2RlYzJDb21wb25lbnRIaWRsVGVzdCwgQ29uZmlnKSB7CisgICAgQUxPR1YoIkNvbmZpZ3VyYXRpb24gVGVzdCIpOworCisgICAgQzJTdHJpbmcgbmFtZSA9IG1Db21wb25lbnQtPmdldE5hbWUoKTsKKyAgICBFWFBFQ1RfTkUobmFtZS5lbXB0eSgpLCB0cnVlKSA8PCAiSW52YWxpZCBDb21wb25lbnQgTmFtZSI7CisKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBDMl9PSzsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IHF1ZXJpZWQ7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworCisgICAgLy8gUXVlcnkgc3VwcG9ydGVkIHBhcmFtcyBieSB0aGUgY29tcG9uZW50CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4gcGFyYW1zOworICAgIGVyciA9IG1Db21wb25lbnQtPnF1ZXJ5U3VwcG9ydGVkUGFyYW1zKCZwYXJhbXMpOworICAgIEFTU0VSVF9FUShlcnIsIEMyX09LKTsKKyAgICBBTE9HVigiTnVtYmVyIG9mIHRvdGFsIHBhcmFtcyAtICV6dSIsIHBhcmFtcy5zaXplKCkpOworCisgICAgLy8gUXVlcnkgYW5kIGNvbmZpZyBhbGwgdGhlIHN1cHBvcnRlZCBwYXJhbXMKKyAgICBmb3IgKHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4gcCA6IHBhcmFtcykgeworICAgICAgICBBTE9HRCgiUXVlcnlpbmcgaW5kZXggJWQiLCAoaW50KXAtPmluZGV4KCkpOworICAgICAgICBlcnIgPSBtQ29tcG9uZW50LT5xdWVyeSh7fSwge3AtPmluZGV4KCl9LCBDMl9ET05UX0JMT0NLLCAmcXVlcmllZCk7CisgICAgICAgIEVYUEVDVF9ORShxdWVyaWVkLnNpemUoKSwgMHUpOworICAgICAgICBFWFBFQ1RfRVEoZXJyLCBDMl9PSyk7CisgICAgICAgIGVyciA9IG1Db21wb25lbnQtPmNvbmZpZyh7cXVlcmllZFswXS5nZXQoKX0sIEMyX0RPTlRfQkxPQ0ssICZmYWlsdXJlcyk7CisgICAgICAgIEFTU0VSVF9FUShlcnIsIEMyX09LKTsKKyAgICAgICAgQVNTRVJUX0VRKGZhaWx1cmVzLnNpemUoKSwgMHUpOworICAgIH0KK30KKworLy8gVGVzdCBNdWx0aXBsZSBTdGFydCBTdG9wIFJlc2V0IFRlc3QKK1RFU1RfRihDb2RlYzJDb21wb25lbnRIaWRsVGVzdCwgTXVsdGlwbGVTdGFydFN0b3BSZXNldCkgeworICAgIEFMT0dWKCJNdWx0aXBsZSBTdGFydCBTdG9wIGFuZCBSZXNldCBUZXN0Iik7CisgICAgYzJfc3RhdHVzX3QgZXJyID0gQzJfT0s7CisKKyNkZWZpbmUgTUFYX1JFVFJZIDE2CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IE1BWF9SRVRSWTsgaSsrKSB7CisgICAgICAgIGVyciA9IG1Db21wb25lbnQtPnN0YXJ0KCk7CisgICAgICAgIEFTU0VSVF9FUShlcnIsIEMyX09LKTsKKworICAgICAgICBlcnIgPSBtQ29tcG9uZW50LT5zdG9wKCk7CisgICAgICAgIEFTU0VSVF9FUShlcnIsIEMyX09LKTsKKyAgICB9CisKKyAgICBlcnIgPSBtQ29tcG9uZW50LT5zdGFydCgpOworICAgIEFTU0VSVF9FUShlcnIsIEMyX09LKTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgTUFYX1JFVFJZOyBpKyspIHsKKyAgICAgICAgZXJyID0gbUNvbXBvbmVudC0+cmVzZXQoKTsKKyAgICAgICAgQVNTRVJUX0VRKGVyciwgQzJfT0spOworICAgIH0KKworICAgIGVyciA9IG1Db21wb25lbnQtPnN0YXJ0KCk7CisgICAgQVNTRVJUX0VRKGVyciwgQzJfT0spOworCisgICAgZXJyID0gbUNvbXBvbmVudC0+c3RvcCgpOworICAgIEFTU0VSVF9FUShlcnIsIEMyX09LKTsKKworICAgIC8vIFNlY29uZCBzdG9wIHNob3VsZCByZXR1cm4gZXJyb3IKKyAgICBlcnIgPSBtQ29tcG9uZW50LT5zdG9wKCk7CisgICAgQVNTRVJUX05FKGVyciwgQzJfT0spOworfQorCisvLyBUZXN0IENvbXBvbmVudCBSZWxlYXNlIEFQSQorVEVTVF9GKENvZGVjMkNvbXBvbmVudEhpZGxUZXN0LCBNdWx0aXBsZVJlbGVhc2UpIHsKKyAgICBBTE9HVigiTXVsdGlwbGUgUmVsZWFzZSBUZXN0Iik7CisgICAgYzJfc3RhdHVzX3QgZXJyID0gbUNvbXBvbmVudC0+c3RhcnQoKTsKKyAgICBBU1NFUlRfRVEoZXJyLCBDMl9PSyk7CisKKyAgICAvLyBRdWVyeSBDb21wb25lbnQgRG9tYWluIFR5cGUKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IHF1ZXJpZWQ7CisgICAgZXJyID0gbUNvbXBvbmVudC0+cXVlcnkoe30sIHtDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjppbnB1dDo6UEFSQU1fVFlQRX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJfRE9OVF9CTE9DSywgJnF1ZXJpZWQpOworICAgIEVYUEVDVF9ORShxdWVyaWVkLnNpemUoKSwgMHUpOworCisgICAgLy8gQ29uZmlndXJlIENvbXBvbmVudCBEb21haW4KKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgQzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6aW5wdXQqIHBvcnRNZWRpYVR5cGUgPQorICAgICAgICBDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjppbnB1dDo6RnJvbShxdWVyaWVkWzBdLmdldCgpKTsKKyAgICBlcnIgPSBtQ29tcG9uZW50LT5jb25maWcoe3BvcnRNZWRpYVR5cGV9LCBDMl9ET05UX0JMT0NLLCAmZmFpbHVyZXMpOworICAgIEFTU0VSVF9FUShlcnIsIEMyX09LKTsKKyAgICBBU1NFUlRfRVEoZmFpbHVyZXMuc2l6ZSgpLCAwdSk7CisKKyNkZWZpbmUgTUFYX1JFVFJZIDE2CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBNQVhfUkVUUlk7IGkrKykgeworICAgICAgICBlcnIgPSBtQ29tcG9uZW50LT5yZWxlYXNlKCk7CisgICAgICAgIEFTU0VSVF9FUShlcnIsIEMyX09LKTsKKyAgICB9Cit9CisKK30gIC8vIGFub255bW91cyBuYW1lc3BhY2UKKworLy8gVE9ETzogQWRkIHRlc3QgZm9yIEludmFsaWQgd29yaywKKy8vIFRPRE86IEFkZCB0ZXN0IGZvciBJbnZhbGlkIHN0YXRlcworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisgICAgZ0VudiA9IG5ldyBDb21wb25lbnRUZXN0RW52aXJvbm1lbnQoKTsKKyAgICA6OnRlc3Rpbmc6OkFkZEdsb2JhbFRlc3RFbnZpcm9ubWVudChnRW52KTsKKyAgICA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKyAgICBnRW52LT5pbml0KCZhcmdjLCBhcmd2KTsKKyAgICBpbnQgc3RhdHVzID0gZ0Vudi0+aW5pdEZyb21PcHRpb25zKGFyZ2MsIGFyZ3YpOworICAgIGlmIChzdGF0dXMgPT0gMCkgeworICAgICAgICBzdGF0dXMgPSBSVU5fQUxMX1RFU1RTKCk7CisgICAgICAgIExPRyhJTkZPKSA8PCAiQzIgVGVzdCByZXN1bHQgPSAiIDw8IHN0YXR1czsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvbWFzdGVyL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL21hc3Rlci9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxNjRkNjgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL21hc3Rlci9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitjY190ZXN0IHsKKyAgICBuYW1lOiAiVnRzSGlkbEMyVjFfMFRhcmdldE1hc3RlclRlc3QiLAorICAgIGRlZmF1bHRzOiBbIlZ0c01lZGlhQzJWMV8wRGVmYXVsdHMiXSwKKyAgICBzcmNzOiBbIlZ0c0hpZGxDMlYxXzBUYXJnZXRNYXN0ZXJUZXN0LmNwcCJdLAorfQorCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL21hc3Rlci9WdHNIaWRsQzJWMV8wVGFyZ2V0TWFzdGVyVGVzdC5jcHAgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL21hc3Rlci9WdHNIaWRsQzJWMV8wVGFyZ2V0TWFzdGVyVGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFlNjRjYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvbWFzdGVyL1Z0c0hpZGxDMlYxXzBUYXJnZXRNYXN0ZXJUZXN0LmNwcApAQCAtMCwwICsxLDEwMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiY29kZWMyX2hpZGxfaGFsX21hc3Rlcl90ZXN0IgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvY2xpZW50Lmg+CisKKyNpbmNsdWRlIDxWdHNIYWxIaWRsVGFyZ2V0VGVzdEJhc2UuaD4KKyNpbmNsdWRlICJtZWRpYV9jMl9oaWRsX3Rlc3RfY29tbW9uLmgiCisKK3N0YXRpYyBDb21wb25lbnRUZXN0RW52aXJvbm1lbnQqIGdFbnYgPSBudWxscHRyOworCituYW1lc3BhY2UgeworCisvLyBnb29nbGUuY29kZWMyIE1hc3RlciB0ZXN0IHNldHVwCitjbGFzcyBDb2RlYzJNYXN0ZXJIYWxUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VnRzSGFsSGlkbFRhcmdldFRlc3RCYXNlIHsKKyAgIHByaXZhdGU6CisgICAgdHlwZWRlZiA6OnRlc3Rpbmc6OlZ0c0hhbEhpZGxUYXJnZXRUZXN0QmFzZSBTdXBlcjsKKworICAgcHVibGljOgorICAgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKKyAgICAgICAgU3VwZXI6OlNldFVwKCk7CisgICAgICAgIG1DbGllbnQgPSBhbmRyb2lkOjpDb2RlYzJDbGllbnQ6OkNyZWF0ZUZyb21TZXJ2aWNlKAorICAgICAgICAgICAgZ0Vudi0+Z2V0SW5zdGFuY2UoKS5jX3N0cigpKTsKKyAgICAgICAgQVNTRVJUX05FKG1DbGllbnQsIG51bGxwdHIpOworICAgIH0KKworICAgcHJvdGVjdGVkOgorICAgIHN0YXRpYyB2b2lkIGRlc2NyaXB0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXNjcmlwdGlvbikgeworICAgICAgICBSZWNvcmRQcm9wZXJ0eSgiZGVzY3JpcHRpb24iLCBkZXNjcmlwdGlvbik7CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudD4gbUNsaWVudDsKK307CisKK3ZvaWQgZGlzcGxheUNvbXBvbmVudEluZm8oY29uc3Qgc3RkOjp2ZWN0b3I8QzJDb21wb25lbnQ6OlRyYWl0cz4mIGNvbXBMaXN0KSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb21wTGlzdC5zaXplKCk7IGkrKykgeworICAgICAgICBzdGQ6OmNvdXQgPDwgY29tcExpc3RbaV0ubmFtZSA8PCAiIHwgIiA8PCBjb21wTGlzdFtpXS5kb21haW47CisgICAgICAgIHN0ZDo6Y291dCA8PCAiIHwgIiA8PCBjb21wTGlzdFtpXS5raW5kIDw8ICJcbiI7CisgICAgfQorfQorCisvLyBMaXN0IENvbXBvbmVudHMKK1RFU1RfRihDb2RlYzJNYXN0ZXJIYWxUZXN0LCBMaXN0Q29tcG9uZW50cykgeworICAgIEFMT0dWKCJMaXN0Q29tcG9uZW50cyBUZXN0Iik7CisKKyAgICBDMlN0cmluZyBuYW1lID0gbUNsaWVudC0+Z2V0TmFtZSgpOworICAgIEVYUEVDVF9ORShuYW1lLmVtcHR5KCksIHRydWUpIDw8ICJJbnZhbGlkIENvZGVjMkNsaWVudCBOYW1lIjsKKworICAgIC8vIEdldCBMaXN0IG9mIGNvbXBvbmVudHMgZnJvbSBISURMIENvZGVjMkNsaWVudCBpbnN0YW5jZQorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyQ29tcG9uZW50OjpUcmFpdHM+IGxpc3RUcmFpdHMgPQorICAgICAgICBtQ2xpZW50LT5MaXN0Q29tcG9uZW50cygpOworCisgICAgaWYgKGxpc3RUcmFpdHMuc2l6ZSgpID09IDApCisgICAgICAgIEFMT0dFKCJXYXJuaW5nLCBDb21wb25lbnRJbmZvIGxpc3QgZW1wdHkiKTsKKyAgICBlbHNlIHsKKyAgICAgICAgKHZvaWQpZGlzcGxheUNvbXBvbmVudEluZm87CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbGlzdFRyYWl0cy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6TGlzdGVuZXI+IGxpc3RlbmVyOworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q29tcG9uZW50PiBjb21wb25lbnQ7CisgICAgICAgICAgICBsaXN0ZW5lci5yZXNldChuZXcgQ29kZWNMaXN0ZW5lcigpKTsKKyAgICAgICAgICAgIEFTU0VSVF9ORShsaXN0ZW5lciwgbnVsbHB0cik7CisKKyAgICAgICAgICAgIG1DbGllbnQtPmNyZWF0ZUNvbXBvbmVudChsaXN0VHJhaXRzW2ldLm5hbWUuY19zdHIoKSwgbGlzdGVuZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbXBvbmVudCk7CisgICAgICAgICAgICBBU1NFUlRfTkUoY29tcG9uZW50LCBudWxscHRyKSA8PCAiQ3JlYXRlIGNvbXBvbmVudCBmYWlsZWQgZm9yICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGxpc3RUcmFpdHNbaV0ubmFtZS5jX3N0cigpOworICAgICAgICB9CisgICAgfQorfQorCit9ICAvLyBhbm9ueW1vdXMgbmFtZXNwYWNlCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgeworICAgIGdFbnYgPSBuZXcgQ29tcG9uZW50VGVzdEVudmlyb25tZW50KCk7CisgICAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CisgICAgZ0Vudi0+aW5pdCgmYXJnYywgYXJndik7CisgICAgaW50IHN0YXR1cyA9IGdFbnYtPmluaXRGcm9tT3B0aW9ucyhhcmdjLCBhcmd2KTsKKyAgICBpZiAoc3RhdHVzID09IDApIHsKKyAgICAgICAgc3RhdHVzID0gUlVOX0FMTF9URVNUUygpOworICAgICAgICBMT0coSU5GTykgPDwgIkMyIFRlc3QgcmVzdWx0ID0gIiA8PCBzdGF0dXM7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfMzUyeDI4OF80MjBwXzMwZnBzXzMyZnJhbWVzLnl1diBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl8zNTJ4Mjg4XzQyMHBfMzBmcHNfMzJmcmFtZXMueXV2Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1YTNlNGIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfMzUyeDI4OF80MjBwXzMwZnBzXzMyZnJhbWVzLnl1dgpAQCAtMCwwICsxIEBACivKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzNzc3Nzc3Nzc3NzczMzMvLy8vLy8vLy8vLy8vLzMvLy8vLy8vLy8vLy8vMzMzMzM3Nzc7Oz8/Pz9DQ0NHR0dLS0tLS0tLT09PT0tLS0tLS0tLT09TU1NTU09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tLS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1dXV1NTU1NTT09PT09PT09PT09TU09PU1NTU1NTU1NTU09PT09PS0tLS0tPT09TU1NTU1NPT09LS0tLS0tLR0dHR0dPHhnNlYFtLWWdVTUZIQD03Nzg5Nzw8PDo8Oz42Oj04PDs6OTg3ODs7Oj87PTs8PD47P0E/QkJBQ0RFREE+PTw7QENDQUBDQ0FBR0hHSUtSwtXS09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXVysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMy8vLy8vLy8vLy8vLzMzMy8vLy8vLy8vLy8vLzMzMzc3Nzc3Oz8/P0NDQ0NHR0tLS0tLS09PT09PT09PT09PS09PT09TU1NTU1NTU09PT09PT09PT09PT09PT1NTU1NTU1NTT09PT09LS0tLS0tLT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1NTU1NPT09PT09PT09PU1NPT09TU1NTU1NTU1NPT09PS0tLS0tPT09PU1NTU1NTU09PT09PS0tLS0tLR0dHSzIxyZ2BcTVllUktHSz87Mzc4Ozg5Pj05PDpBOjs9Nzs8PDo6Nzg6Ozw/Oz88PTw/Pj9BPUFBPkNDREJAQT46Oz9EREFDRERCQklHSEhJTr7V0tPT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1crKy8vKysrKysrKy8vLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzMzMzMzMy8vLy8vMzMzMzMzMzMzLy8zMzMzMzMvLzMzMzc3Nzc3Ozs/P0NDQ0NDR0dLS0tLS09PT09PT09PU09PT09PT09TU1NXV1dTU1NTT09PU1NPT09PT09PT1NTU1NTU1NTU1NPT09PS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1tbV1dXV1dTU1NTT09PT09PT09PU1NTU09TU1NTU1NTU1NTT09PT0tLS0tLT09PU1NTU1NTU1NTU09PT09PT0tLS0tHR0s+Sd2hfXk9XZ01LRks9ODc2NTk5OTw+OT88Qzk7PDc5PD07OTc5Ojw9QDs+PT47PD48PT5BQD5EQ0NDP0E9Ojs+QkNFQ0NEQT9FSEpJSky61dPT09TU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8rKysvLy8vLy8vLy8zLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMzMzMzMzMzMzMzMzMzczMzMzMzMzMzMzMzMzMzc3Nzc3Ozs/Pz9DQ0NDQ0dHS0tPT09PT09PT09TU1NTU09TU1NTU1NTV1dXU1NTU1NPU1NTU09PT09TU1NTU1dTU1NTV1dTU09PT09LS0tLS0tLS09PT09TU1dXV1dbW1dXV1dXV1tbW1tXV1dXV1NTU1NTT09PT09PT1NTU1NTU1NTU1NTU1NTU09PT09LS0tLT09PU1NTU1dXV1dTU1NTT09PT09PT0tLS0dHRmn5nYWJOVWpKSElLPzw6OTM3Njc3PDs+Oj06Ojo4ODo7Ozg4Ojo7PD46PT09Ojw/PD0/QkA/Q0RDRD5APT08QENEQ0JEQkQ+REhJSUtMttfT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3MzMzMzMzMzMzMzMzNzc3NzczMzMzMzMzMzMzMzc3Nzc3Ozs7Pz8/Q0NDQ0NHS0tLT09PT09PT1NTU1NTU1NTU1NTU1NTV1dXV1NTU1NPT1NTU1NTU1NTU1NTU1dXV1NXV1dXV1NTU09PT09PS0tLT09PT09PU1NXV1dbW1tXV1dbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1NTU1NTU1NXU1NTU1NTT09PT09PT09PU1NTU1dXV1dXV1dTU1NTU09PT09PS0tLR0p+DaV9kU1hsSEhIS0A9Nzg0NzY6Oj47RDw9Ojw8OTg6OTo6OTs8Ojo7OT48Pjk9QDs/QUFCP0JCQUM9Pz8+PEBCRUNDQkBBO0ZJR01MSbLY09TU1NTU1NXV1dXV1dXV1dXW1tbW1tbV1dXW1svLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzM3Nzc3Nzc3Nzc3Ozc3NzczMzMzMzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc3Mzc3Nzs7Ozs7Pz8/P0NDQ0NHS0tLS09PT09PT09TU1NTU1NTU1NTU1NTV1NXV1dTU1NTU1NTU1NTU1NTV1NTU1dXV1dXV1dXV1dTU1NTU1NPT09PT09PT09PU1NXV1dbW1tbW1tbW1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTV1NTU1NXV1dXU1NTU1NTT09PT09PT1NTU1dXV1dXV1dXU1NTU1NTT09PT09LS0tSjiGxfZlJWakdIR0lBPTM2Njo7PDhDPEFBPjxBPDg5Ojw6Ojw8PDk8PTo7PD09PD89QD9AQT9AQUBCPD4+PzxCQ0NDRkBBQT1ISklOTUeu2NPU1NTV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbLy8vMy8vLy8vLy8vLy8vLy8vMzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzs7Ozs7Oz8/P0NDQ0NHR0dLS0tPT09PT09PT1NTU1NTU1NTU1NTU1NTV1dXV1dTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dXU1NTU1NTU09PT09PT1NTU1NTV1dbW1tbW1tbW1tbW1tbX19bW1tXV1dXV1dXV1dXV1dTU1NTU1dXV1dXV1dXU1NTU1NTU09PT09PT1NTU1NXV1dXV1dXV1dXV1NTU1NPT09PT0tLWroprY2VSWGhMSkdJQjg0OTQ6Ozo5QDk+Q0U/PDs5OTk9Oj07PDw6PTw7OTw9Ozs/PUA9PT5AQD9CQT5APD05QERDQkFBQj48SEpLTU5HqNnU1NXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbWy8vMzMvLy8vLy8vLy8vLy8rKy8vLy8zMzMzMzMzMzM3Nzc3Nzc7Ozs3Nzc3Nzc/Pz8/Pz8/Pz8/Pz9DQ0dHR0dHR0dHR0dHS0tHV2djY2NnZ2dra2trb29vZ2dnZ2dnZ2dra2tra2tjW19fX19fX19jX2NfX19rb2tra2tra2tvc29vb3Nzc3Nzc3Nzd3Nvb29va1NPT09PT09PT09PU1NbV1dXV1dXV1dXV1dXW1tbX1tbW1tbV1dXV1dXV1dXV1dTU1dXV1dXV1dXU1NTU1NTU1NTU09PU1NTU1NXV1dXW1dXV1dXV1dTU1NTT09PT09PS1bqKa2hoUlhkSUlMTkA5OTozO0A8Nz05QUM9QD89ODo6Ozk9Oz4/Ojs8PDo7PDo7Pj1APT8/P0FAQUE/QTw8Oz5BRENBREA9PElJSk1NRqPa09TV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbW1szMz9DPz8/Pz8/Pz8/Pz8/W3t3d3t7e3t7e3t7e3t3S0NDQ0NDQ0NDQ0NDQ0ci5ubm5ubm5ubm5ubq6t6WkpKSkpKSkpKSkpKSnhmBjY2NjY2NjY2NjZGRlhIuKioqKioqKioqKioemuri4uLi4uLi4uLi4ubSNi4uLi4uLi4uLioqKi4eBgoKCgoKCgoGBgYF/kdPT09PT09PS0tLS09PT2+Lh4uLi4uLi4uLj4+Pi2NfX1tbW1tbW1tbV1dXV1dXV1dXV1dbW1dXV1dXV1dTU1NTU1NTU1NTV1dXV1dXW1dXV1dXV1dXV1NTU1NTT09PT09XDkXJsaU5SYkxMVk08Ojo3Nz5DPzg+Oj8/QTw/QDc7Ojs7PTs+Pjo7PD48Oz07PT8+QDw/Pz1AQEBBPj88PjxAQUVCQkZAQD9HSEpLUEae2tXV1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19fMzNDS0tLS0tLS0tLS0tLR3uvr6+rq6urq6urq6uvp1dLS0tLS0tLS0tLS0tTEqaqqqqqqqqqqqqqqq6aGhIWFhYWFhYWFhYWFik4MEhISEhISEhISEhIRE0pUU1NTU1NTU1NTU1NPg6ejo6Ojo6Ojo6Ojo6ScWFJTU1NTU1NTU1NTU1RNQ0RERERERENDQ0RDP13R09PT09PT0tLS0tLS0t/q6+vr6+vr6+vr6+vr6dnX19fX1tbW1tbW1tbW1dXV1dXV1dbW1tbV1dXV1dXV1dXV1dTU1NTV1dXV1dXW1tXV1dXV1dXV1dXU1NTU1NTU1NPUy5h3bGlKTl9NUlVNPjw8NztAQz42Ojc+Pzs9QkA5PDk9Ozw6PD07PTs9Ozs9PD0+PT07QT08QUBBQT08Pzw7QEJDQURFPUFAQ0ZLS09GmNzV1dXV1dbW1tbW1tbW1tbW1tfX19fX19fX19fXzMzQ0tLS0tLS0tLS0tLS0d3q6enp6enp6enq6unq6dXS0tLS0tLS0tLS0tLUxaqrq6urq6urq6urq6yoiIeHh4eHh4eHh4eHh41SEhgYGBgYGBgYGBgYFxpOWVdXV1dXV1dXV1dXU4WopKSkpKSkpKSkpKSmnlxWV1dXV1dXV1dXV1dYUUlJSUlJSUlJSEhISERg0NPS0tLS0tLS0tLS0tHf6urq6urq6urq6urq6unZ19jX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dXV1dXV1dXU1NTU1NTU1NGcenFpSlRdT1JVTkQ+Pzs+QEA4Ojs4PDw8Oz46Ojs4Ozk5Ozw7Ojw5Ozs8Ozo9PT0+PUE/Pj8/Pj08PT88PEFBQ0FERTw+QEVGSktNRpPc1dXV1tbW1tbW1tbW1tbW1tfX19fX19fX19fX183Nz9HR0tLS0tLS0dLR0dDc6Ofn5+fn5+fn5+fn5+bV0dLS0tLS0tLS0tLS08Wtrq6urq6urq6urq6vq46NjY2NjY2NjY2NjY2SXSInJycnJycoKCgoKCcpWmNiYWJhYWJiYmJiYl6MrKmpqampqampqampqqNnYWJiYmJiYmJiYmJiYlxUVFRUVFRUVFRUVFVRa9DS0tLS0tLS0tLS0tLR3+np6enp6enp6enp6enn2djY2NjY19fX19fX19fX19fX19bW1tfX19fW1tbW1tbV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbV1dXV1dXU1NTU1NTWo3txZElbYE5OVU9AQT89REI+Oz06OTo6PTw7PDs6OTg5OTs8Ozw8Ojo7PDo7QD08PTxAQTxBQTs7PEA/PD1CP0RDQ0U8PkJERkpMTEWN3NXV1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjNzc3Ozs7Ozs7Ozs7NzMzMzs/Pz8/Pz8/Pz9DQ0NDQz87Ozs7Ozs7Ozs7Ozs7Ny8zMzMzMzMzMzMzMzMvJycrKysrKysrKysrKysfCw8PExMTExcXFxcbGxsvMy8zLzMzMzMzMzMzLz9HR0tLS0tLS0tLS0tLRzczMzMzMzMzMzMvLy8vKysrKysrKysvLysrLy83V1dXW1tbW1tbW1tbW1dfY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NfX19fX19fX1tfX19fX19bW1tbW1tbW1tXV1dXV1dXV1dbV1dbW1tbW1tbW1tXV1dXV1dTU1NTU169/cF5GXmJQUVdOR0ZDQ0lBPz07PDo8N0BBPD04Ojs4OTg7Pzs8PDs7PDw8PD87PD46Pj44PkI8Pj1BPjw+QkBERUNAPD5APkNJSUtEh9zV1tbW1tbW1tbW1tbX19fX19fX19jY2NjY2NjYzs3Nzc3Nzc3Nzc3NzdHNzc3NzczP09LSzs3P0s7Ozs7Ozs7O0tPPz8/S1M/P0tTV1M/Pz8/Pz8/Pz8/Pz8/P0NDQ0NDQ0dHR0dHS09PU1NTU1dXV1tbW1tfW1tbX1tfX19fX19fX19bW1tbW1tbW1dbW1tbW1tfX19fX19fX1tbW1tbW1tfX19fX19fX19fX2NjX1tbW1tbX19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjX19fX19jY19fX1tbW1tbW1tbW1tbW1tbW1dbW1dbW1tbW1tbW1tbW1tXV1dXV1NTV1di4gm9XSl9jUlFaS0hBQTxCPT07Oj4+PD4/PT0/ODk6OTk3OD48PD47Ozw7PDs/PT0+OTs7OT0+P0A+QD07OkI/QkNCPz0+QD5CRUdKQoDc1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2M7Ozs7Ozs7Nzc3Nzsqfys3Nzc3QuYOEi8fTwJrMz87Ozs7O0qucz9DTuZ/R0JyChIrIz87Ozs7Ozs7Ozs7Oz8/Pz8/P0NDQ0NDQ0NDR0dHR0tLT09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbV1dXV1dbW1tbV1dXV1dXV1NTU1NXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NfX19fX1tbW1tbW1tbW1tbW1tbV1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXYwIBuVU9gY1dZW0xMQkA9PTw9Ojw9Qj5CQkA8Ojg5ODo6Ojc7Pz4/PDw7PDo5Pzw8PTg5PD9BPj09PUFAPTtBQkBCQz47QD9BQUlHSkF629bW1tbW1tbX19fX19fX19jY2NjY2NnZ2djY2dnOzs7Ozs7Ozs7OzdKpj63Rzs7Ozpu3tqSiwJOerNPOzs7O0racpaPVspeYtbaTuLmvotLOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0dHS0tLT09TU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dbW1tbW1tXV1dXV1dXU1dXV1dXV1dXW1tbW1tbW1tbW1tfX19fX19jX19fY2NjY2NjY2djY2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2dnY2NjZ2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV18h/b1pTYWVeXVxPSkQ9QD8+PDc6Pjk/RD5AOTg3ODk7Ozw4OT89PTw9PD47OkE7OTs5OzxDQDw7PT5AQT49QkQ/QkM9PT8+Pz5ISUg/ddrW1tbX19fX19fX19fX2NjY2NjZ2dnZ2dnZ2dnZzs7Ozs7Ozs7Ozs/Inrym0tDQzsqgl36Cw6abr6fUz8/Pz86dnJGdw52ipqvSkX1+r7DRzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dLS0tPT09TU1dXV1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tbV1dXV1dXW1tbV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2djY2NjY2NnZ2dnZ2dnY2NjY2NfX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dbV1dXV1dfNiHNdWGloXl9gT0lGOkFAPj48PDk2P0I/Qjk2NDg6Ozo8Ojk+PD49PTs/PTxBPjw8Ojw8PTw6PEA9QEI+PkFCPUNDPT0+Oz9BRUtIQHDZ1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2c/Pz8/Pz87Ozs7SrKWnqdXAvNLHnY+ey9PJipiq1M/Pz9G/mKCbsq3Ihpmt1dLNnp7D0M/Pz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0dHS0tLS09PT1NTU1dXV1dXV1dbW1tbW1dbW1tbW1tbV1tbW1tbW1tbW1dXV1dXV1dXW1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnY2NjY19fX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0JB1W1tqaWFeXVNOSTxDQEE+Pz46OEVAP0I7NzQ5Ojo5Ozs4Oz0/Pj49QT08P0A9Pjw8PDw8Oj1AQD8/PT5CQD9AQkA8QD0+QUVLRz9r19fX19fX19fX2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnPz8/Pz8/Pz8/QzJ2Nl6zQmpfKxZ6ynpbN1q2YqtTPz8/TtJmWqrik26OYrdXTwKCg0M/Pz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0dHS0tLT09PT1NTU1NXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX19fX19fY19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tKUcl5ea2tqZV1PTEc/RENDQDo9OzxCPD08OTY0Ojk4Ojo5Nzs/QDs8PUA8PEE+PD07PTw/PDo8Q0A+PTs9QD5CPkBBPkA9QD9GSUQ/ZtXX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2traz8/Pz8/Pz8/P07GigJuvyqCjv8qcpYynrdiqmarUz8/P1KuafqOPoNihmK3V1bCiqdTQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1NXV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXW1tXW1tbW1tbV1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbSk3BgXnBoZmVaUUhHQkVDQEA3Ojo8Pjk8OTc2NTk6Njo8Ozc8QEA8Ojo9Ojw/Pj08OUA8PDo6OT9APT08PUBBQz9APz5BOz9ARkpCP2LS2NfX2NjY2NjY2NjY2dnZ2dnZ2tra29vb29vb28/Pz8/Pz8/P0M6fkGyclteqo9PSrqa1mJ/Vqpmq1M/Q0NSsm6eLlqHZoZit1dSjobrU0dHR0NDQ0dHQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1dXV1dbW1tfX19bW1tbW1tbW1tbX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfW1tfX19jY2NfX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX1tbW1tbW1tbW1tbW1tbX19fX19fW1tbW1tbX0pNuYFxxZGdkWlVKQENHREFBODs/PD07PDw3NTU4OTY4Ozo5PDo+Pzw9PTk8Pz49Ojo+OT06Ojg+Pzw9PTw+QEFDQT48PDpCRERKRkJd0NnX19jY2NjY2NjY2dnZ2dna2trb29vb29vb29vPz8/Pz8/Pz9G9n8O31pfA09HQ0srSzZeb1KqZq9XRz9DTtrKypZmp2qGYrtbNnp/J0tHR0dHR0dHR0dHR0NDR0dHR0dHR0tLT09PU1NTV1dXV1tbW1tfX19fX19bW1tbW1tfX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19fY2NjY2NjY2NjY2NjY2djZ2dnZ2dnZ2dnZ2dnZ2drZ2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fX19fX19fW1tfX1tbX19fX19fX19fX19bW19GSbF1cb2doYl1PRj9ISEZFQDw8Pj48PT08NzU2Ojk2Ojs6Ojs4QD86PDw5PD49Ozs6Pzk/Ojs5PT49Pjw7PTxAQ0I/Pz47Q0ZGR0hEWc3a2NjY2NjZ2dnZ2dnZ2dna2trb29vb29vb29vb0NDQz8/Pz8/Pz5V+e6WS1KKa08ySl6ObodirmavV0pem1cSimZabtNqjmK/Ywp+h0tHR0dHR0dHR0dHR0dHR0dHR0tLS0tLT09PU1NTV1dXV1tbW19fX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tbX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2tnZ2dnZ2dnZ2djY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX1tfPjGRWXnBrXGBgTkVITUlJT0M+OkI9PUBCOzU1Nzw6Nzo7Ojo7OT09OTo6OT0+Pz07OT47PDo8Ozk+PD47PD0+QENCPz5BPEFDR0ZGRVXJ29jY2NnZ2dnZ2dnZ2dra2tvb29vb29zc3Nzc3NDQ0NDQ0M/Pz9DR1aeZrcmjqL7KnbGdo7XZqZup2LiroMfVoqukmszYoZmt2rKkptbS0tLS0tLS0tLS0tLR0dHS0tLT0tPT09PU1NTV1dbW1tbX19fX19fX19fX19fX19fX19fX19bW1tbW1tfX19fX19fW1tbW1tbW1tbX19fW1tbW1tbW1tbX19fX2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2djY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fX19fX19fX19fY2NfX19fX19fYzYZdV2JvZE9dVEtIRlNRS0tAPj1EPD9DRj01NTc7OTY6Ozo8PTo7Pzo6OTg6PT0/Pjs/Oz49Ojs5Pjs9PD0+QURCQD8+PzxAQUVHRURSxdvY2dnZ2dnZ2dnZ2tra2tvb29vb3Nzc3Nzc3NzQ0NDQ0NDQ0NDQ0NO5gL3Tm5bP1LWLkZ/T1LyBu9TOlKDT08iRjbTV1LGEw9a5g7/V0tLS0tLS0tLS0tLS0tLS0tLT09PT09PU1NXV1dbW1tfX19fX19fY2NjY19fX19fX19fX19fX19fW1tbX19fX19fW1tbW1tbW1tbW19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2tnZ2tra2tra2tra29ra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2NfX2ct+WlVpaltMX01KTEpVTEZCPDw/RkVHS0g9NjY3Ojk3OTo7Ojw9OT45OTo4Oz0+PkE+PTk8PDo9Pj47PTk5Oj9FQUA+PT8/QkBHRURFUMHc2dnZ2dnZ2dna2trb29vb29vb3Nzc3Nzc3dzc0NDQ0NDQ0NDQ0NDQ0cHR0crI0tDUxLjS0tHSwtLQ08fM0tHUyMHV0dLRw9XS0cLT0tLS0tLS09PT09PT09LS0tPT09PU1NTU1NXV1dbW1tfX19fX19fX2NjY2NjX19fX2NfX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29va2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2djY2NjX19fX19fY2NjY2NjY2NjY2NjY19rHd1xSZ2laTlpOTFBRV0VKPz89P0FETExAPjc3NTs4ODk5Ojs8Pjw+ODo6OTs+P0A9Pj46NTo6Oz0/Ojs5Ojw+QkJAPz8/P0FCR0RDRE683dnZ2dnZ2dna2tvb29vb29vb3Nzc3Nzc3d3d3dDR0dDQ0NDQ0NDQ0NDS0NDR0dDQ0dPU0dHR0dPR0dHS0tHR0dPU0tLS0tXT09PV0tLS0tPT09PT09PT09PT09PT09PU1NTU1dXV1dbW1tfX19fX2NjY2NjY2NjY2NfX19jY19fX19fX19fX19fX19fX19fX1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tvb2tra2tra2trZ2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2trZ2tra29ra2trZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjbwXNYVWlrU0xSTlBSWVRGSTw+Qz9BQkVKPT03ODY5Nzc4OTk7Oz0/QDw9ODk7Ozs/Pjw8OTU6PT47OTk7PD8/P0JCQT1BPUBBQkZCQkJLtd7Z2dra2tra2tvb29vb29vc3Nzc3Nzd3d3d3d3R0dHR0dHR0dHR0dDQ0NDQ0NDQ0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tPT09PT09PT09PT09PT09TU1NPT1NTU1NTU1NXV1dXV1dXW1tbX19fX2NjY2NjY2NjY2NjY19fY2NjX19fX19fX19fX19fX19fX19fX19fW1tbX19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2NjY2NjY3LxvVFRsbExLUkpUUlVLRkQ6PkdEREFERjw/ODk6OTU5OTo3PD07PkA9PTc5Ojs5Pjs5OTY2Oj1AQT47PDk6Pj9DQT4/Qj0+QkNFQkFCSrDe2dra2tvb29vb29vb29vc3Nzc3Nzd3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0tLS0tLS0tLS0tLS0tLS0tPT09PT09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1tbW1tbW19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19fW1tbW1tfW19fX19jY2NjY2NjZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2dnZ2dnY2Ny2a1NbcGtLVVdSXFFXSEQ+PEJKRT1ISj89PDc4ODo1OTg5Njs+PD1APDw1OTk8Oj87OTk0ODw9PUFBPD47Ojw+QD89PkE9PUNGR0I/Qkmq39ra29vb29vb29vb3Nzc3Nzc3N3d3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHS0M/U0M7P0tLT0tLS0tLS0tLS0tPT09TU1NTU1NTU1NTU1NTU1NTU1NTU1NTV1dXV1dXV1dbW1tbW19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19jY2NfX19fX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dndsGRTYXJfT1pUV19RUkdCPUVJS0FBTEQ/Pzs5ODg5Mzg2ODY5Pj0+Pz06Njo7Pjs9PTo5Njg6PTtAQDxAPz0/P0I+PD48PEJFSElCPkNJpODa29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3t7S0tLS0tLS0tLS0dHR0dHR0dPT0bm7zLqbnLrQyNPT0tLS09PT09PT09PU1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2NjZ2dra2tra2tra2tra2tra2tra2tra2tra29va2tra29va2tvb2tra2tra2tra2tra2trb29vb29va2tra2tra2tra2tra2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ3qpfVWBuW1VZUVpeT0xHQ0ZNSUZEQ0k7QUE7PDg4NjU4Njk4Nzw/QT89Ojc8Pz48Pz87OjY4OD09QEE9QD5BQD1AOjs6Pj1BRUdKQkBDR57h29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e0tLS0tLS0tLS0tLS0tLS0tO+wMqaoKKViJGeqpOpz9TT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fY2NjY2NnZ2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dna2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2tvb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2d6iXFVeblheXU5aUFROQ0NMSUlJRklEPEFBPDs4NzY3OTc3OTk9P0E/PDo5QD88PkI/Ojg3NzY9P0BAPUBBPz88PTs7OD48P0VJSEE/Q0aX4dvb29zc3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3tPT09PT0tLS0tLS0tLS0tTIlZyum5m1iX2TjIKBhMTV09PT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tvb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dndmlpYYW5ZYVdPV01QRUJETElNS0ZJRT5CRDg4ODY3OTc1Njk4PT1BPjo4OT4+PD9APzw1Njc2PD4/PjtAQEA/Pj4/Pjs/PkFCRkdCQENIkeLb29zc3Nzc3d3d3d3d3d3d3d7e3t7e3t7f39/U09PT09PT09PT09LS0tLTz6h+kayPko6MhoCIiYSQo8rU09PT09PU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY19jY2NjY2NjY2NjY2NjX19fX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2tra29vb29ra2tra2tra2tna3JJaWWNuWlpSVV5QTDxAR05IUklIRT48SEY4OTc1Nzg3NTg5ODs+Pj07ODlBPj1AP0E+NzU5Njs+QUI/P0BAQUI/Pj8+QUBEQUZIQj9FSozi3Nzc3Nzc3d3d3d3d3d3e3t7e3t7f39/f39/f1NTU09PT09PT09PT09PWtaWaiIuQhYCFi4iBg4qLf4bC1tTU1NTU1NTV1dXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2dnZ2dna2dra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29ra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb2tra29uIWltnalxYTFpfVkg6TEhMSkpDREVDQUxINzo3Njc4ODU4Nzg5PDw7Ozk4QD89Pj8/PDY3PDQ3P0JCQUBAPz8/QT09P0A+QEBGRT09REuI4tzc3Nzd3d3d3d7e3t7e3t7e3t/f39/f39/f39TU1NTU1NPT09PT09PUxZKCg4WGfYGCfXx5foGCg36k29bU1NTU1NTV1dXV1dXV1tbV1tbW1tbW1tfX19fX19fX19fX19fX19jY2NjY2NjZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vc3Nzc3Nvb29vb29vb29vb29vb2tra2tra29vb29zb29zb29vb29vb29vb29vb29vb29va2tvb29vb29vb29vb29vb29vb2tvZgFpebWhaU0ldW1hKRE1ISlNMR0ZBQD9KQjg7NjY5OTc1ODY4Ozo7Ojw5OD09O0A9Ozo2NTw3Oz1CQEFBPD49QEE9PEA/Pz5CREU+PERLg+Lc3d3d3d3d3t7e3t7e3t7f39/f39/f39/f39/V1dTU1NTU1NPT09PT2LKEkKh9g3l2hIh/e3d5gn5+i67A1dTU1NXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dna2trZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2trb2tra2tvb29vb29vb29vc3Nzc3Nzc29vb29vb29vb29vb29va2trb29vb29zc3Nzc3Nvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc1nlcWmxmWFJPYFFSQUhHSkZYTEZAQENDSz87Ozc4ODc2NTc2ODo5PDw6PTs/PTs9Pjw7ODg8OT0/QkFCQzw8P0FCPj1BQkNCREVDQDtDTH3h3d3d3d3e3t7e3t7e39/f39/f39/f39/g4ODg1dXV1NXU1NTU1NPU0ruen3WKeXuIgICChYGDcnOAhYOMrNfV1NXV1dXW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NnZ2dna2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra29vb29ra2trb3Nzc3Nzc29zc3Nzc3Nzc3Nzb29vb29vb29vb29rb29vb29vb29zc3Nzc3Nzc3Nvb29zc3Nzc3Nvb29vb29vb29vb29vc3Nzc3Nzc3Nvb29vb3dByXV9wZVdLUGNPS0JHQ0pIS0ZBPEE9SFFBOjo3Nzg3Njc4Nzw6OD09PD47QD88Pz07Ojs5Ojk8QEJAQkNAPUFAPz1AQkNDQUBAP0A7RU144N3d3d7e3t/f39/f39/f39/f3+Dg4ODg4ODg4NXV1dXV1dXV1NXU18h4i4V8goh6g4SBfoKCc2l0hYuGkJ3U1tXU1dbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tvb2tvb3Nzc3Nzc3Nvc3Nzc3Nzc3Nzc29zb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb297KalxjcWVST1heSz9HTElPS0VAPkFCP0lPPjk6NzY7NzY6Ozc7Ojg6PDw+Oz09Oz48Ojs4OTo4OUFCQkFAQDtAQj06PkFCQz8+PT4/PUZOdN/e3t7e3t7f39/f39/f4ODg4ODg4ODg4ODg4OHV1dXV1dXV1dXV1s6dhpl+f5OTin+CgXx9gnNxm4mAgoOJwNnat7TQ19bW1tbX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tra2tra2tra2tra29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NvfwGNaW21gVlBTU0pETEhNSEk8PkFEQ0ZORDw8OTc5OjY4Ozk3PDk4OTw9OzlAPjpBPzw3NTc7ODpAQUVBPz45PUI/Oz1CQkI6Pj07PT5GTnHe3t7e3t/f39/f39/f4ODg4ODg4ODg4OHh4eHh1tbW1tbW1tbV1tjLioCHhYOXjHh7e3lvfYF1a3ebdHZ7eInHxpiMrdjZ19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2drZ2dna2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tra29vb3Nzc3dzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29zb29vb3Nzc3Nzc3Nzd3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3Nzc3Nzc4LdjV1lrYlJNVVFMSktGS0ZDQD5CQT9FTT4+PTg5OTo3OTo3NT03Nzo+PDs7Qjw5Pz05NjY4PTk6QEJGQD49PEBCREA9QD9DO0A9PD4/Rk9t3N/e3t/f3+Dg4ODg4ODg4ODg4OHh4eHh4eHh4dbW1tbW1tbW1tfVrYZ6d32rn3l4entzdH+Dfm9xe3l6c3t2k4qFgImkzdnY19fX2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tna2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29vb29vc3Nzc3N3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vc3Nzb3Nzc3Nzc3N3d3d3d3d3d3dzc3Nzc3Nzd3d3c3Nzc3Nzc3N3d3d3d3d3d3d3d3dzc3OGtYVtebGJSTVZMTUdLS0RGQkI7QT08RUxCQT44Ojk6Nzc5NjY6NTs+QDs9Oz89PD89Ojk5Ojw5PEVDRkA/PkBDQkQ9OT0/QT1CPz1APkdPadvf3t/f3+Dg4ODg4ODh4eHh4eHh4eHh4eHi4uLW1tbW1tbW1tfQmH+Qh4N9eoN2e3Vzenl6kKqmd3JyfoeHh4CAfoKEhJHJzNnX19jY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra29ra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2djY2NnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vb3Nzc3N3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzb29vb3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3dzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3NzhpV9UYm1iUE9TSUhHRkpJSUJBPkJCPEVFREA+ODo4Ozc3Ojc4ODY+Pz07PDk9PDo+PTs6Njc7NjpEQUY+Pz8/PkNBPzs9PT47REM/PjxIT2fZ4N/f3+Dg4ODg4eHh4eHh4eHh4eLi4uLi4uLi1tbW1tbW19jYyH52doN+fnR2eIaCenl1d5yhu6GEgoCAfoeKinx/gYaMnKjO2NjY2NjY2NjY2djY2NjZ2djY2NjY2dnZ2dra2tra2trb29rb29rb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3d3d3d3c35pbT2drXFBRUElDT0pLR0xHSkJAP0FHREBBPDg8ODg1ODk3Njc3QEA/Ozw5Pj04PTw8Ojc4PTk/RENGPkE/QkBDPzw6Pj0/PkVEPz07S1Fj1+Hf4ODg4ODh4eHh4eHh4uLi4uLi4uLi4uLj49bW1tbW19XB3LRueHJze3B6eXaFiIR7eH2AgZiljH98fnuRhZaLhoGDgY6Rvd3Z2NjY2NjZ2dnZ2dnZ2dnZ2dnY2dnZ2dna2tra2trb29va2tva2tra2trb29ra2tra2tnZ2dnZ2dnZ2dnZ2dna2trZ2dnZ2dra2tra2tnZ2dnZ2dna2tra2tra2tra2tra2tra2trb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t3d3d6NWFdobllQUUtISlNJTUhNSUtBQz9DRkJBRDo6PDg2NDg4NzY2Nj8+Pjo8OTw7Oj09PDw4Ozw8RERERD4/PkI+Qj84PT8/Q0NCQEE+O0xUY9Xh3+Dg4OHh4eHh4eLi4uLi4uLi4uLi4uPj4+PW1tbW1teslLZ6eHJvd5V7dHuLgHh1bn6Fg3t/hYhyfH2bnI6JioJ+g32Hk5rH1NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2trb29vb29vb29vb2tra2tra2tra2tra2tnZ2dnZ2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2trb2tra2tra2tra2trb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d7Zf1lgaGxcUUtHR09LTk5PTURGQkg/Q0hEREA6Ozs4NzU3Nzc4NThAPkA7PDk8Ozw+Ojk7OTk7OUZERUI8QD4/PEBDOz5AP0A/Qj8+OjtKVWPV4eDg4eHh4eHi4uLi4uLi4uLi4uPj4+Pj4+Pj1tbX19vKhYR3cXJubniVhHt4hH95dnB4c3eLkY6CdnN9ioaId3d1d4ODfIiIk8Pb2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2trb2tvb29vb29vb29vb29rb2tra2tra2tra2tra2tnZ2dnZ2dna2tra2tra2tra2trb2tra2tra2tra2tra2trb29vb2tra2trb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f0nVZaGlqVk5KSE1OR01EUElGSD9FPUZMREM+Ozs8OTc3OTY2OTU4Pj4/PTs8QDs9PDo3Ozc5OThHREVCPUE9Qj8+QDw/QUE/QEJAPjs8S1Ri1OLg4eHh4eLi4uLi4uLi4+Pj4+Pj4+Pj4+Pj49fX19fEknuJf29sbnV2foSBg4qGfnVybWVtiIaKjoR7c4OHint4e4OPj4GEioqxztrZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29zc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tvb2tvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3dzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f3t7e4clsW2pqalNOR0hOT0VIRk1JSUA7RD5ISUA9PDo6Ojg2ODo3Nzk0OD08PT07ODw8PDw4Njc4OTo6RUJFQT9APEI/Q0M+PkNEQUBAP0A8PUtRYdPj4OHh4uLi4uLi4uPj4+Pj4+Pj4+Pj4+Pj5OTX19fZqXaFfnx3bHB3eXh8jH2KhYB3anN0d3p9bot7fnl6foR/gIGDfnh8foeGlrbT2tnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra29ra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/e3uO9amFpa2lRTkZNTEtKWE1OR0FAQE9BRD9AOzw4ODk5Njg2NjY4NDs+PD07OTY6Ojk6OTU4OTg5OkJERj8+Pj5AQEBCPzxBQD88Pj9BOT5KT17S4+Hh4eLi4uLi4+Pj4+Pj4+Pj4+Pj4+Tk5OTk19fX2sqKhIB5c29tcXN1d4CUeHaAfHWHhXd1cnWgmXp7d3Z5doR0bWxue3iAmouTu9za2tra2tra2trb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc29vb29vb2tra2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f397js2lpbmloUFBPTExPUk9LU0Y/RURERT48PDg6ODc5OTU2ODY2NzM6Pjs+PTc6Pjk5OTk2Ojo4NzxDRUc/Pzs/PkA9PkE8Oz0+OUFAQDhBTlFc0OTh4eLi4uLj4+Pj4+Pj4+Pj4+Pk5OTk5OTk5NjY2NjauY6AenZ1bmpveHCBfWt0cnZ3hIV5h4d5lY55eXp1d3pza298gHx2fYh8gLLe2tra2tvb29vb29vb29vc3Nzc3Nzc3Nzc3dzc3Nzc3Nzc3Nzb29vb29rb29vb29ra2tra2tra2tra29va29vb29vb29vb29zc3Nzb29vb29vb29vb29vc3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3t7e3t7e3d7e3t3d3t7e3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/f39/f4qpqa2hrZFNQT0ZQVFJOSFJLPkREQ0I7Ozk5Ojg2Nzg1NjY4ODg0Oz88Pzw5PDw3Ozo6Nzo6Nzo9Q0JDPUE+Pzw5PT5BQDs8PDtFQD47Q05TXNDk4eLi4uLj4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTY2NjZ1p5vdntveHh2cG50d3BwdHBzb36Jc3qGhY2EenNtcoB6hn1vg5OBdnx9g4a13drb29vc29vc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzb29vb29vb29vb2tra2tra2tvb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4N/f3+KgbWhma2ZVVlJHUFFOS0xMRUJIRUc9OD08Ojo3Nzg2Nzc2NTY3NDg+PD09Ojg6OD46Ozc4Nzc6Oj5DRDtDQj49OD1AQUQ/Pjw+RTw+PUJNUF/S4+Hi4uLj4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk2NjY3MB2doCCfnp4eHBsdXlya399bHNvdGdoaYB/aWl4c2d+iYl4cIKGe3d9foWKvN3b3Nzc3Nzc3Nzc3Nzc3Nzc3d3c3Nzc3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODflGttZm5mU1NJUFlUTEhGTkZGRUJGPTs+PDs5Nzc4NTc5NjQ1NzU4PDs9Pjo6OztAOTs7ODc6OTlAQkE8QUE/Pzk/QEJFQ0FAQEM7Oz1ES01g1uTi4uLi4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk5NnZ2tmYc3uqhJaCcnR1dn14aGx8d2h4d25rcXR5gIJ3dHyBhIJ9c3CAin94gn95g8je29zc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f4N/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh24tubWdzY1lRTVVbV0hDSUZOS0dCRD8/Qjo7OjY2NzU2NzY0ODc2Ozw7Pj86PDk8Qjg3OTo6Ojk6QUFCQUJDQEE+PT9CQ0NEQUJGOTg9REpOYtjk4uLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXZ2drcqHGCtXiRfnNsem6EgXaCfWtoan+DeHV8dn2FhXRmcHl9d316gIqFe318foC03tzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3dzc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3Nzd3d3d3d3d3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e397e3t7e39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4ODg4ODg4tiFb3FrdWFWT1VVXE9ETUY+SkdKRUQ8P0I6PDk4Njg0NTY3NDc2NDk7Ozw7OD47PEE4ODo9OD04Oj09QEBAP0FCP0A+QENCQ0FBRTc2O0RMTmPa5OLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXl29ra3Z5sbnNxhY1ybXBuf391hH5rcnZ2enN4gXhzbnVwbWt2fHmFiIB/f392coODsd/c3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eDg4eHh4eHh4eHh4OLXhW1xb3ZeUldTWlpRSkhDQFFAQkQ8OT9BOjw5NzU3NDU2NjQ3NTY9PDo9PTk+OjxAODo6PDY7OTs+PUJCQjtBQkBDQEBEREM8PUA3OjxFS01l3OPi4uPj4+Pj5OTk5OTk5OTk5OTk5OXl5eXl5dPOxsB+cWxveHt2b3VuanNzbZKGeG50dG5vdIZ/b2twboJ0bXZyfY2DdnF/d3mKgabf3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3dzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t/f3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi1oZucG1xYFJZUFdfWUpMTElSP0Q9OTtCRjs6OTc0NTY1NzU0NjY2Pj07Pz45PTk7Pjg9Ozo0ODtAQENCQ0FCRkE/Q0BBQkREOz0+OTs8QkxNZODl4+Pk5OTj4+Tk5OTk5OTk5OTk5eXl5eXl5eW5t7Woc3JscHd6dHd4bXFydXd/hHRyc2xsa3F8bnBudGuBf3GAd32Eg355gHNygYqg2d3c3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh49WHcWxqbF5YWlVXYFZWUE9QTD1BOjs8RkE4Ojg3MzY1Njk2NTg1Nz89Oz8+OT04Ozw5PTs7NTo9Q0JCPENDREREQUE/PkJDQzw9Pjg5PENLS2PN0dnh1sjY4+Tk5OTk5OTk5OTk5eXl5eXl5eXltbW2q3J5cm59f3Z1d2hqaGlwb3Zta2tnZWZxdG15gG5teXd2iHhxa2podXV5dHV/wd/c3d3d3d3d3d3e3t7e3d3d3d7d3d3d3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHi4uHh4ePVhnFwY2lhV1NZV19MUk9STUtAPjg5O0E+ODc5NjQ3Njc6NjY2NDk+Pzo8Pzo/OTo6Nzo9PDk5PEFBPTtBQ0VDRkA+Pj5BRUQ+QEE3OD5GSEpesrW4wbm1u8jg5eXl5OTl5OXl5+fn5+fm5ebm5ra2tbWOfX5weoR1cnZnYmNlbGtyb2ZpbHZtd4Z9hXlsbHd4a3ZwfH14c3V5fHd2h7ng3d3d3d3d3d7e3t7e3t7d3t7e3t7d3d3d3d3d3t7e3t7d3t7e3t7e3t3d3d3d3d3d3d7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4eHj1Yd1bl5uY1pUU1hXS1NLSk1SR0E4Ozs+PDk4NzU2NTY2OTY4NjY5Pzw6PT07Pzo7Ozk8PDs5Oj4+Pjs8PUFEQkNBQEBBP0JDPDw9Nzs+REVKXrG1tLW2t7e2y9rJ3uXl3eDi3tXU1tPU4OPg39+2treuh3t/bnmNenJ1bWNobGxtaXR4enF5enqIh4N6aWh9cWRvcXyGgX55e318e4an2t7d3d3d3d7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4uHh49aGdmxhb19dV1lcWlJQSEpXTEVHPUA9Ozs9OTY0NjU1NTg2NzY3OD87OT09PDw5OTw6Pjw6OTg+Qjs7Pj5AREBDRUFAQD0/QDw9PTU5PEJHRl2xtbW2uLm5ubq9uMPT0r3BwcC6u7y6u8TMxb/Dt7e3hGl1gX1ndYd5Z3Vxa2t5eHB3fH15bWl3e3h3bml1j4FwbHl4d3d9gXuGgnmAoNze3d3d3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODh4OHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4ePXhXJrZ3RhW1hYX15TVVVRVUpMRj9JRDs5PTY2NDc3NTc4Nzc3ODk8PDo+PDg8Oj0+OTs8OTs5P0E8PT9DP0FARUJCQTw9Q0A6Pjw1NDlER0dasbW1tre5ubm5ubm3ubm4uLm5urq6urm5urm6u7e3uX9ucHN6b3B/eXNuc3Vsc3Z4cXFwb2tvcX6Bc2mHhIF9dHOHdW11hYmBgHJ2hafd3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uHj14lxa2xyW1dXXWBUUVVUUFJPSkNATUE9Ozk2NTM0NjQ2ODc3Nzk6Pjs8Pjs5PDo8PDk8PTw7PT0+PUNEREBDQkE/QD48PkE8OD06NjY6QkpIWLG1tLa2uLm5uLi5uLe3uLi5urq5ubi4uLi6uru3uKx7cnhxf3ZzfnBsbXpyZ29sbW50cHt3d3Jyd3pvhpJ2f3x8enZ5fH9zfYdyda3T393d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4eHh4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi49eHb2pxalVWV2FbT1FSUE5XSURESUo/Ojk6NzUzNDk1NzY2Nzg4Ojw7PD46PDo6PTw5PDw9Oz09PDs9REdEQ0E8PDw8Pj5AOzg8ODE1OkFGRVautbW1tre4uLm4uLi4uLe4ubq5uLi3t7i4ubq7t7mqcnB4d3x7e4J3aG5xam9qY2lyf21zcn54dHFsanaAeX2AgH91doB1a4qLgHaR1d/d3d7e39/f3t/f3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f4N/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLi4uPYhm1sdGVWUFxnWE1YU1JRWUVDS1BOOzk4ODY1NDM5NTY2NzY4Nzk+OT0+OTw5OTw7Njg5OTo8QEA9PkBGQEJCQDo+PEE9Pzs7OzYxNjxCR0RQqLa1tra2tre4t7i4uLi4uLm6ubi4t7e3t7e5ure2tIlyd3h9iXxwem99c2hqbGdnbHRscXd0cWx2c3Fxd3FyfHl4g3Z7d2mLkYp9kM7f3d7e3tvY2drZ297f39/e3+De39/f3Nvc3N3e3uDg3+Dg4ODf3t7e39jS397f397e3t/f3t7f3t/f3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLi4eLi4uLi4uLi4uLi4uLj4+Lj4+Li4uPj4+Pi4uLi4+Lk14NoZ3VkVlVkZVdKWllXW1Q9RU1LSD04NzU3NjQzOTQ0Nzc1Njc5PTo9Pjw9PDk7PDk5Oj45PD4/PkFBQ0FFRUQ+OzxBPjw5PDs3Mzc+REhFSqG2tbW1tbW2tre4uLi4t7e4uLi3tra2tra3uLm2traLfXpsbHp/cGx5dm5qaGdlcXp4b2lvb3B1c21zd4Fnb32CgYNyf3lqcHJ6f6ng393Zy8a/vb6/vsLN0tDW3tnc4NfQzcPCw8PH1dfT2dzX1NjX0MfExce9vM/Kz87Y3djO3N3c2t3T0dze39/e397e3t7e4N/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eLi4uLi4uLf4uPi4eLg4d7W29/Sw8rJx9Hb3OLk4eHg2dre1sbExcTN2trf5OHi4trX3st9aWZxYVleZWFNTFRLUlpMO0hNSEZBPTc2NjUzNDY2NDg3NjU2OTw7Pj46Pjk5PDk3OTs7Oj49PEBAQ0RCR0ZCQT08Q0A9OTw7Nzc3P0RGRkaZtrS1tbW2tra4uLi4uLi3uLi3s7W2t7a3t7i5tba3opdxb29waW50dnFmZWNrbmdvcm1mZ2tygWVvdnyAeGRzj39zaHFyaWVlbm+w39HFv7u5ubm5ubq6uru6vc3Gw8e/urq6uru7u8HCvcHFvby/vry7urq5ubq6ubm6w8XDucDDwby/ube/z8/U3tjc3t/g3tLa4N/f4ODg39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eDg4ODg4ODg4ODh4eHh4uLi4eDh4uLi4uHa2t3RwsPCu8XT1uDdydPDrrnAsaqrq6uwtLbJ0sXRxLG4v7Srq6usr7S0vMzE1c60tLureGxtbWBdYl9ZS1NVVFFQREBRTUhEPzo3ODQ3MzE1NjQ5ODQ2Njo8Oz08ODw5Njo6ODg5NzU8PDw/QEFAQkRDQkE8PkI/Pz09PTc1OD5DRUNAj7a0tLW1t7i4uLi4uLm5uLe1sautr7Oxs7OztLS0tqaei2tue3ZxeXhnY2hfcXdha25vaG99b25ja2lseHdsa4Z+bHB6dm1scG95sca8uru7urm5ubq6urq6urq6urq6urq6urq7u7q7u7y7urq6ubq7u7q6urq6urq6ubi3t7i4t7e2tbW1tbi3u8e+w8XHzcS4wMnH0tzZ2d/e3uDf39/f4ODh4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh3Nji4uLi4eHh4OHg3tfGxtHQztTe3tPO0t/SuLi8sq2trKysrrG+ua63rKipqamqq6urqqqqq6ysuKyqqqqrq6urra6urq6urryzrayrpHlub21fXl1dVE1SU1xUSkE/UElIPjg5NjgzNzMwNTczNzg1NzY2Ojw/PDg5Ozo6Ojg5OjY1OTs7Pj9EP0NFQkNCP0BAQT9APjw3ODc6QUVEP4W4tLS1tbe4uLm5uLi3t7SurKuqqq2urq6vsLGzs7WjcG5ucm1wg311aWFlaGZkY2Rxc21td25naW1tZXBzb29zcXN8h4F6dX11n7u6uru7urm5ubm6urq6urq6ubq6urq5uLm5ubm6urq6u7q5ubm5ubq6ubm6ubm4uLi3t7e4uLe3t7a2tbW2tra1tbW1tba1t7e3t7rBvrzGycrb3+Dg3tvd3d7h4tDW4uHg4ODg4ODg4ODg4ODg4OHg4OHi0768zNjd3OLg0dnbxL23sLCxsa+zu7uzsLS9s66urq2tra2sq6qqqqmpqKmpqampqqurqqqqqamoqampqampqaqqqqytrq6urq6urq6sraR4aWJxZmFZWlZRUk5cU0Y9QlJEQTc8OzY5NTY1NDU2NTg3NTY1Nzg7Pjw7OTk5Ojg3Nzk3Njg8Oz47RD8/Q0BBREE+P0M9Pjw+Ojo3Nz9DRj54srCztLW2t7i3trKurq2sq6uqqaqtraysrq+xs7S1t4xucnRqaIB5ZmpmZWxdaG5waGxxYmNmcoJ+dmhobGpueoaBhXx4cXF5gK+6ubq6urm5uLm5ubm5ubm5ubm5ubm4uLe3t7e3uLm5ubm5uLe3t7i5uLi4uLi3t7a2tre3t7e3tra2trW0tLW1tbW2trW1tre3t7e3t7e3tre4v8bP0MS+v8DE19e8ydra4OHg4ODh4eDg4ODh4eDb3t7Uzby3tre6wMDJxLfIvrKwsLCwr7Cvrq6ur7Cwr66urq6uraytrKurq6qpqampqampqampqKmpqKmpqampqKmpqKmpqqqrraytra2ur66trK2heWpjbWdiXFhRUFFLVEpCOklRP0E3PDk0OjU2NTQ1NDY4ODY4Njs6OTw9PTs6ODY2ODg6NzY3Pj09PT5BQUVCQkNBQUBBOj09Pz05Ojc9QUc8bKqmqKutsLGwrqupqKqrq6mpqamrrKytra2ur7O0tbilgIdvaWdzdGZrcG1qZGxvcm5rbWNrcHyJhG5qbHx4Y3uKfnNqc25rcY+7ubm5ubm5ubi4ubm5ubm5ubq5uLi4t7e3t7e3t7i5ubi4uLe2tra3t7e3t7a2t7a2tra3tra2tbW1tba1tLS0tbW1tra2tra3t7e3t7i4uLe2t7a2uLm4uLe3uL6+uLq9vcfb4OHg2Nnd4eHg3dfKwcPCurm5uLe4uLi3tbS0tLKysbGxsLCvr6+vr6+vr6+vr66ura2srKyrq6yqqqmoqKmppqepqaehpaipqamoop+hoZyip6inqausrK2ur7Cwrq2unXdwbGphY2BZUU1RTFJGQzlNUEY+ODs3Mjc5Njc0NDM1ODg3OTc7OTo9PTw6Ojk3NDo5ODY2OD8/QEI9RENDQ0FDQEJBQDtAP0A/PDw6O0NIPWOopaWlpqioqKenp6ipqqmoqKipqqqsra6wsLCztLW1taWYdn5xZmt4cW9tZmVsaGNsZ2ZpaX11bWlvfXZ5hWZod294b3Fvcninu7m5ubm5ubm4uLm6ubm5ubq5ubi3t7a1tba2tre3t7e3t7a2tba2tre2tbW1tra3t7e2tbS0tLS0tLS1tLS0tLW1tba2tra2t7e3t7e3t7a2tre2tre3uLe2t7i4t7i4uLi4wMXTyry8w83PyMC9urm5ubq6ubi4uLi4t7W0tLSzs7KysrGwr6+vr66urq+vr6+uraysrKurrKysq6ehoJ6gn5ydoaGdlpmkpKaon5mZmZmanZ+gn56fpKqtrq+ura2srJl1cGlrY2FeXVVOU0tSREQ4TktHQTo4NTI2OTY2NDczNzc3ODk3OTo7PT0+ODg4NzU6OTk1OD9AQEFEPkZBQkNAQkNCQT88QEJCQD0+OjpERj5cpqWmpqampqanqKenqKioqKenqaurrKytra2ttLS0tbekc311bnONf3JmanFjaW1jaGZobG51aV9jZ3VzdnpuZ3Bwcn56cYihu7m5ubm6urq6urm2s7W1uLm2trW1tra1tbW1tbW3tra3tra2tbW2tbW1tbS1tLa2t7e2tbS0s7O0tLW1tLS0tbW1tra2tra2t7e3t7e3tra2trW2tbW2tra2tra2tra3tra3uLi3uri4uLe3t7i5ubm5urq6urm4t7e3t7W1tLS0s7OysrKxsbCwr66urq6urq+vra2srKuppaSmpqScmZubmpmZmpmXl5eXl5aZm5iZmZmZm52en5+dnJ6gpKWko6OioqKQdG5jcGFeXltUU1RIVEo/PFFCRkM7ODYzNzo1NTQ4Mzg5OTc4OTc7OTs9Ozc6NzU2OTk4NTg+Pz9ART5CQD9DPzxBQUI/PT9EQT8+PTk9Q0Y/VaSlpqanqKeoqamop6ioqKioqKiqrKuqqaipq7W1tba5o3eKcXKHhnd0cGh5a2JjYWVsaW5zal9jZWNjZWprYmRqbHaXjX6ovbm3tre5u7u6uLWxrKurqq6wrKyrq62tq6yvsLGvr7CytbW2t7W1trW1tbW1trW2trSvr7O0tLSvra6vsrW0tbW1tbW2t7e3t7e3t7e3t7e3t7Owsra1tLa2tre3tra2tbW1tra3t7e5uLi4t7e3uLi4ubq6urq5uLi3t7e1tbS0tLS0tLS0s7OysbCvr6+vr66vr62oo6KgnJqampqZmZqbm5qampqbmpmZmZiXl5aYmZmZmpycnZ+foJ+goKChoaCgoJ+fi3RuaXRdYGZeUlRLRFRJPUVTSEVCOzo0NDY5NDQ1NzM4ODg3ODk5Ojs7Pz04OjkzNTg5NjM5PT5AP0A6QEJCQkA/QEJCPz0+QUFCPz06PkVDQFGjpqWlp6inqauqqKaoqKipp6ioqKinp6ioqaq1tbe3t7KZtH99kIx1Z2lqbGZjYGNoZW94cGlicXx5cGpmZmRma3NqhYystrKwra2ttLeysLCtrKuqqamop6ipqampqKinqKipqaeoqqurra2sqqytraysrq6trqunpaSnqqyopKOkpamwsbGztbW2t7i3t7W1tre4t7e3t7Kppaasq6ivtLa1s7W3t7a1tbW2tra3t7e4t7a2t7e3t7m6urq5uLi3t7Wxs7S0tLKxsK6sq6yurrCxsK2rqqmqqKijnJqZmJmYmJiYmZmZmZmZmpqZm5ubnJybmZeYmZqbnJydnJ2foKGhoqKioKGgoKCfnop1amtuWVxhVktPREdVRz5PV0hEPTw4MzQ0ODQ1NDgyODk4ODk6Ojw5OUA8Njk6MzY3OTE0PD8/QEFBOkNGRUJBREJDQTo7P0FCQz9APUBEQ0BPo6empaemqKqqqqakpqenqKioqKimpqaoq6uttba3t7e4rbJ1cHuDdmBiaWtiZWZhZGdmfYh5bHKAfXFvcXhjbW5xZo+srKurq6ysra6urK2trKuqp6WlpaWlpqioqKiopaeoqKeoqKeoqKmqp6Wko6KioqOioKKioaKhoKChoaKjpKOjpaWlqLC0s7OzsKuqqaqztLa3trGopaOioaGipKiqqairs7Sxrq6xs7W2tra3uLi3tre3t7e3t7a2uLe0sa6ppqerrKmnpqWkpKSkpKWnqaajoJ+enZycm5uampmZmJeXmZmZmJiZmpqampqampqbm5mYmpydnZ2dnZucoKGgoaOjoqCgoKCfnp2FdGtsaFdYU0pHTUVITUdAU1dGRz09OTM2Mzc0NjU3Mzg6Ojo6Ojw9OjpBPDY9ODM3ODgzNztAPz9AQDpCRUNAQkRDQT87O0BDQkNBQDxBQ0A9TqKnpqanp6mqq6mkpaWlpaaoqKippqanqKmpqrW2tre3t7izc2h7c2JnamtpaWJhZGloXV1tfHJma3J/fHR8bm1zc36gqamrq6uqq62trKusq6mpqKWjpKWmpqWmp6eqqaamp6enqKinp6iop6WjpKKhoaGhn56en5+fn56foKGho6Wko6OkpKSlp6enpqWkpaampqeqraumpKKhoaChpKWlpaempaeoqKalpaivtLa3trW1tra1tbOwrKupqa6rqKWlpqampaSkpaWlpqWkpKSkpaKhoaGgnp2bm5ucm5qamZiXmJiYmJiZmpmZmZmYmZmZmZqZmZydnJycnJybnJ+fn6ChoaKgoKCfnZ2cgHNrbmReU0pITUZETEtFRFFTQ0c9PDgzNjI4NDY0NjQ4OTg6Ozk7Pjw5PTs5PTczNTk2NTY8QD0/QD88P0JDPkJCQj89Pj5CQ0FFQD86PkVAO0+jpqWkpqeoqaelpKWlpKWnp6eoqKanp6alpqa1tba2trW2uYptcW1vfHxxZ2pmYGFsYFROW2hqbm9tgYJ9cWdxdn6aqKeoqqmpq6urrKqqqqimpqWkoqOlpqalpaWmqaqppqWjpKWmpqSko6Kio6KhoJ+fnp6cnJycnZ2dnJ2en6CioaKjo6OhoqKkpaSioqOjpKSjpKSko6Ggn6GipKanp6ipqaelpaSipKSlqK2wsKyrqqusqqmnpaWmpaWlpaalpaioqailpaWkpKSlpKOjpKOioaGhoqKgnp2cnJubm5qZmJiYmJmam5mYl5eWlpeXmJiZmpqcm5qampubm5ucnJ6goKGgnp6enpycm356bnJiXlNNSlBFRk5NQkBPRT5JOz01MzYzODM2Njc1Ojs4OTs5Oj49Ozo5OT03NjY5NjU2PkI+PkE/PT5DQT5DQ0BAO0A/QkJCRUA+Oz5FPzxQoKSjpKOjo6SkoqSlpaSlpqamp6empqalpqaltLW1tbS0tbiBaHx9ZXOCemxwdWFfY1ROT1FbaGxpbGxxbW5xbnScoqSnqKioqauqqqqqqaempaSjo6OjpKSlpqalp6ytqaShnp2epKShn56foKCenJ2dnJycmpqam5ucnJubm5ydnp6foKChoJ+goaOioKGjpKSjoqSlpaWkop+go6SkpKapqainpaGdnJ+jpaipqainqKioqaempaWkpKSlpqampqampqenpaWko6Ojo6KioqGhoqKhoqOkop+enZ2cmpubmpqZmJeXmJaWlZSUlJWVl5iYmpubnJuampqam5ucm5ucnp+fnpucnJyam5p/fnF0YFtUTUdNSEZMSj8/TkM8QDs8NDM4Mzc0NzU3ODs9ODo6OTk7PTs7ODk+Njc4OTU4OD9APT9BPjs9RD89REA/PzpAQUE/QUVAPjw8Qz88Tp2ioaKioKCipaSkpKWlpqenp6empqampaampbW1tbS0tLS3jHalsXdmc3Jvc2xjZGlYT1JRT09dgG1kYFptkZGSoqKjpaampqenqKiop6alpaOioaGhoaKjpaempqesq6emoJycm6Ghnpubmp2cmZiam5qampmZmZubm5uampqampucnZ6goaCfnp+hoJ6foqOko6Omp6inqKWioKGhoaGkpaWlpKCcmZmbnqOmpqampqanpqempaSlpKWlpqiop6inpaWlpaWkpKOjo6KhoqKioqKhoaKjo6Kgn56enZybnJubmZaUlJSTk5OTk5SUlJWWl5qam5ubm5qZmZqanJ2dnZ2dnZuampqamZqXf3dvc11aTkhKTkdFRklERU5APD09PDQ1OzQ2NDY1Njc5Ozg5OTg5OTw7PDc6Ozc4ODg1ODg/Qj9BQTw+P0A8PEJAQT49QT4/Pz1CQUA6OkA8PE+doqGfoJ+dn6OkpKSlpqeoqKenp6ampqampqW1tLS0tLS0tbSXtqd1Znh2Y2xjY2VjW1JTU1JNXqCMeFhodpajnp6hoaOjo6OjpKSlpqalpKSioaGjo6OjoqOlpqamp6enpp+bmpuioJqWl5Wam5qXl5iZmpqYmJqampqbm5qZmZmenZ2goqOjo6KkpKWinqGhoaKjpaampqSjoaCgn5+hoZ+goJ2amJiZm5yhpKOjpKWmp6alpaOjpKSkpKWnp6ampqampaWmpKOjo6SjoqKjpKGfoKGhoKGgoaCfn56dnZyamJeVk5KSkpKSkpOTkpOUlZaZmpqbm5qampqbnZ6enp2cnJybm5qamZmZlH10bHReWk9IRUdGQkVORT9GOzo+Pzs0Njo2OTM2NDY4OTo4OTc4ODo8Ozw5Ozs6OjY3ODk5Pj9APjw9QD5AOjlAQT89QT8+QUE+QUE/Ojk9PjpQnaCfnJucnJufoqOlpaWlp6iop6ampqanpqantLS0tLOysrGwsK2rkHiGj36amn93Yl1TUlFRTGKgootaiKCgn52YmZycnZ2eoaGgpKenp6WkoqGjp6alpaOipaampaanpqagm5mboaCXkpOSl5qcmpeXl5iampmampqam5qYmJmaoKCgoKGfoaKipKamop6gn5+goaOko6Khn56enpyanZuZmpqZmJeZnqCioqKioqKkpaWmpKSkpKKioqKkpaWlpaWlpaalpaOko6KioqGgoKGgnp+fn5+fnp+foJ+cm5qZl5WUlJSTkZCRkpKSkpKSk5SVl5iZmpmZmpqam5+fnp2cnJycmpmZmpiXl5F8cmdxXl1QRj9BRD9KT0JCRjhDRT4+OTg7Nzc0ODQ1OTo6Ozk3OTo8Ozo8PT48PDo2NzY5OD4/QT47Pz49PDg6PkFAQUE/P0FCP0RBPjo4PkE8U5ycm5uampycnaGio6KjoqSmp6alpaampqSjo7KysK2rp6amp6alpqiln6iop6qnoXmEXFFST0xcnKCAYpmgnp2clZOVlpeZmp2dnqGmpqampKOioqanp6ajpKampaWmp6amop2cn6Gfl5GRkJSXmp2YlpeWmJuZmpqampqZl5iam6Ghn56fnpybnJ6goJ6dn5+fn6Cio6SjoqCfnp2ZlpeXl5iYmZubnqKioqKioqGio6WlpKOio6SioaGhoqOkpKSko6SkpKSioqKhoqGgoJ+gnp2enp2dnZ2dnp6em5mYl5WTk5SUk5KQj5GSkZKSkZKTlJaXl5iYmZqampyenZ2dnJubmpiYmpmXlZaNempmamBiTkY+P0A9SkVAQ0A7QEE8Ozs5Ojc2NTg0Njc5OT04ODs6Oz87Ojs8Ojk6Nzc2ODs8Oz08Ojo8PTw3Oz5DQkRDPz1BQ0FEQT88OkBCO1eZmJqamZmam5ucnp2foqKhoqSlpKSlpqSioJ6op6alpqWlpaemp6ampqakpaanqKehqXJOUU1KVJahenKanJyenJeVlJWWmJiXl5qeoqKhoqOkpKOjpqalpKanpqWlpqalpaOgoKGhoJmSkI+Wm5menJaXl5eZm5ycnJqamZeZm5uen52cnZyZmZqcnZ2dnp6fn5+hoaCgoaKgn56bl5WVlZeanZ2fn6GhoqKio6OhoaCgoJ2cnaGioqOkpKOioaSlpKOko6SjoqKioqKhoKGfn52cnZ2cnJ2dnJ2enpqXlpaVlJOTkpKSkpCRkpKTkpGSlJWWl5iYmJiam5ycnJycnJ2cm5mYmZiWlJWXi3hsY2RiZFFHQT1DO0tIRDo7Ozw+OTo6OTo3Mzc5NTk5ODk8OTg7OT09Ozo7Ojk8PDc2NDc/PDo9Ozw/Pjw7ODxBQ0FDQkI+P0NAQkFAOj9APztZmZiampqam5ubmpydoKGhoaGhoqKioqKhn5+dpKWmpqenpaWmp6ampqWkpKalpKSkpaaGUFJQT0+PmHB6mpubnJ6cnJycm5ubmZiYm56dnp6foKOkoqGhoqOio6SkpqalpKSjoqGhnpyblZKUmJyam56amJiYmJqcnpyam5iWmZybnJycnJydmpqbnJ2dnp6dnp6fn52cnJyhoaCblpWVlZacn6Ggn5+hoKKjoqOhnZuZlpaWlpicnqCip6ikoaCgoqOjoqKioKCgoJ+fnp+gnp2cm5ucnJydnJmanJuWk5KSkpKUk5KSkpKSkpOSkpKRkpSVlpeYmJiYmZqcm5qbm5ucnJqZmJiXlZWWl4d3ZGdoZGJNQ0U8RDlJSkU5Ojs9PTo6Nzg6NjQ3OTU8OTY4OTc5PDs7PDo6PDs6PDw4Nzg3Pj07Pj46Qj86Ojo/QURCQ0FBQD9EQUFAPjpAPj06W5qYmZqbmpubm5uen6CgoaKioKCgn5+enp2dnKWkpaanpqWlpqakoqKio6Oko6Kjo6KnllRYVVJOZ21rgZ6am5udn6Cgn56enp6dnJ2dnJ6enp+goaCfn5+goKGio6OkpKSkoqGhnpuamZehtZ6ZmZienpiYmZmam5qWlZeWlZicnJ2cm52dnpybnJ2cnZ6bmJqeoaGdm5udoKKhmpWVlpaZoKKfnZueoaKjop+em5eXlJKSlJeYmZ2goqenpaGgn56goaGioaCfnp2cnJubnJubmpqZmpydnJmXmZaVk5GQkJCPkZKSkpKSkZKTk5OTk5OTlJWWlpeXl5manJubnJucnJqamZeXlpaVlZSEcmZsYmRbREJMPT84RktCPEA+Pj05Ozk6PTg1ODg2Ozg2Njo4PDw7Ozw8Ozk8Oj09OTU4Nzw5PD88OkE/Ojo6QEBDQkRBQ0A/Q0FAPj08QD09Ol+al5mamZeYmZycn5+foaGhoJ+fn56foKCenZ2lpKSko6OioqOjoZ+foaGipKOio6SiradXXl1UV19ua42dmpqbnJ2dm5ucnZ+enZycnJydnZ+goKChoaGgoKCgoqShoqKhoaCenJubm5mfq5ucmpuZnJ6ZlpaWl5eTjo6QlJabnJuam5udn52cnJycnJ6dlpSZnJ+in5ycnZ+hoJuXl5mZmpycnJubnZ6fnZqXlpaWlJOTlJiampqfoKGmpqWgn56fnqChoaCenJubnJybm5ybm5qZmJmZmZmXl5iVlJKQkJCQj5CSkpKSkZGTk5aYl5STkpSVlJWWlZaZmZmam52cnJyampmXlpaWlpaQgG9vZV5gV0BKSDg/N0lFP0VBPD07Ojo8Ozs3NTs4Njo3NTY6Oj47Oj0+Pj07Ozs+Ozo4Ojk5NkBBPTo8PTo6OT9BQ0JERUM+P0FBPz8+Pj89PDtgl5WXl5aVl5mbnqGhoKGioqCenp6enqCgn52bpaWkpKSioKCfoJ+dnaChoqOjo6OkobCjXWVkYGFua4GenJubm5ubmZianJ2enJubm5ycnJ6ipKGeoKGioqKhoKWzrKCgn5+enJmZmpqbrmp2nZ2em5manJiXlZWWkY6Nj5KYnZycm5ycnqCdnJucnJyempWVm56foZ+dnJyenp2cmpqampqampqbm5qXl5aTkpWVlpWTlZaam5qanZ6foqWjnp6fn5+en5+enZ6fnZycm5qcm5qbmpiZmJiYmJiYlZSTkZCRkJCQkZKTk5CRk5SYmZiVk5SVlZWWlZaXmZmXmZqenpyamJiXl5aWl5eYjX1ubV9lVlRFSzw3PjdSRUM+QkE4Ozw7OTg6ODY7Nzc6Njc5Oj0+Ojw8PT49PD06Pz06ODw9OTtAPj4/PT45OTs/QkNAQ0VDPT9DQj5AQD5APTw8YZWSlJWWlpeanJ6goKCgoaCgnp6enp6gn56em6WlpKSioJ+fnZ2dm5mbnJydnp+gn56rmGNpbW5pZm2enZybm5ybmpmZmZqam5ucm5uam5ygo6SgnZ+en6ChoJ+mkpurn6CgnpuamZqZqIREf5+enpyZmJqamJiYmJKOj5OXnJ2bnJ2cnJycnZycnp6dnpqVl5ygoaGfnp2eoJ+cnJuam5qbmpqYmpmVk5OTkpOWl5eVlJiYmZucnJydoJ+gnp6enp+fn56en6KjpKKgnp6cm5qam5uZmJmZmJeXlpWUlJORkZCQkZKTk5OSk5OUmJmYlpWUlZaWlpaWl5iYmJiXmZqamZeXl5aXlpeWl4l4dmddX1dURUU5OTs8WT5AOEI/OTw8Pjk4Ozg6Ozc5OjU4OTs9PDk9Oz0+PD0+Oz8/Ozk+PDw+Pz5AQUE9ODc7QkNFP0FFQz1AREJBQEQ7Oz47PGKWk5SUlpWUlpiYmZubnJycnZ2cnJ2en56dnJqkpKSkoJ+enpybm5qZmJiYmZucnZ6cpolla3R4bVuFop2dnJydnJqbmpqampydnZ2bmpuboKKinpucnZycnJ2eoJ5inKaenpyampucoaNRR4OgnZ6cm5qanZqam5yVkZOXm52dnJ2fnZycnJycnZ6fnp+cl5idn6GhoJ6cn6CfnJqbm5ubmpmZmZmZl5WWlZaYl5eXlpaYmZuenp2dn6GhoJ+fnp6fn5+dn5+hoqKhoZ+fn5yZm5qcnZuampmXlpaYl5eXlpWTkpGTlJSTlJSUlJaZmJaVlZeZmJeYl5eXl5eYl5iXl5eXlpaYl5eVl5eDeHZfW11eUT1GOjk4P1VDQTtDQzo8Pz86Ojk3Ozg4ODc0ODk8Ozw4Ojs8PTo8Pjk/QT06PTw+PkA/PUBBPjk2PERDRUBBRUU9PkVERD9COzo8OTpkl5SVlZaUlJSUlJWXmJiamZqcnJydnp6dnZybo6Oko6CenJuamZqZmJiYmZiam5ubm6WJa3F2em9lmp+enp2dnJybnZ6dnJ2enp2dnJydm5ygoJuampubm5udm5qmZl2joJuamZudnK51SUyGoJycnZybmp+fm5ydm5mZmZudnZ2dn52dn5+dnJydn5+fn5uanZ+goJ+dnJ6gnpubm5ubm5yampuamZudnJqZmJeYmJiYmp2foKCgoJ+hoaGgoJ+en5+fnp6foaKhoJ+enp+enJqam5ubmpqZlpaXmZmYmJiWlJOUlJWVk5OVlZSVlpWVlZSYmZuamZaWl5WWmJiWl5OUlJGRk4yRkJOWfXhqYWJiXFE8QDw2OENWSERCOjg7Oj47Nzc5Nj06OTk2NDc6Ozw+OTo6Oz47PT08QD47Oz46PT89PkBBP0A8NztBQ0U/P0REPj9EREM+Qj07PDs6Z5aTk5OTk5OTlJSVlpeWl5aWl5mbm5ybm5uamaOjoqCfnpuamJeYl5eXmJmYmZybm5qkgGpqb3lzcZegnp2dnJydnp6enp+enp2cnJydnp2bnJuampqam5ubmZmYpIBSeKKZmZqdm6CkX1ZOh6GcnJ2cm5qdn5ucnJubnJubnZ2dnJydnp2enZydnZ2cnJ2dm5uenp6dnZybnpubnJubm5ydnJubmpmbmpmYmZmYmpmZmpyfn5+jpaKfoaKioaGfnqCgn5+fnqCioaChn5+fn52ZmpucnZqZmJWWl5aVlZaTkpOUk5STkJCSk5GUkY+OkJGOlZabmJWYlJmXlJiRjJCPk5yTkoyFjIeDhndxZ2pkXFxRQT44NkJHYEJFR0A+Ozw7Ojg4NjU8ODo4MzQ6Njk9PTk5Ojs9Ozw6PD48Oj5AOj5APjw/QD8+PDg6Q0FEPz5CRD89Q0VCPUJAPDw8OmeYk5KSk5OSk5SVlJWXl5aWlZaXmZmZmpqampqkoqCfn52bmpmYmJiXl5iZmJmcnZ2cqH1nZXN7enOJop+enp2dnp6enZ2enZ6enp2dnZ6cm5ybmpubm5ycm5iYmaCIW1+UmpmbnJyjj2RaTIGinp6dnZybm52bnJybnJ2dnZ2dnJ2dnp+fn52cnZ2dm5qbnJmZnJ2dnZ2dm5uanJ2dnJycnp2dnZybmZeVlZeXmJqam5ubnZ6foqOhoKGhnJucm5ubnZqcmZycn6CfnZiZmZmUkpKUl5SPj4+OkYyNiYuQi4mLjpGRj4mQmJiQkoyNi5KQj5iYoqiqpqWlrKOmoZqep6eyqKKVo6Cfl39wcWlsXFtbTEY8NzdHR1g+SE5URjk+Ojg5ODc1PTk4NzMzOTY6Pjw6Nzo8Ozo6Ojo8PDs/PjtAQD47PT5BPDw2N0A+QkA+QUY+PEFEQT1DQj49PDlmmJSTk5OTkpOUlZOVl5iYmJaXl5iZmZqampqaoqGfnp2cm5mYmJiYmJiYmZmZm5ybnKx/am16f3lxh6Genp2cnZ6enp6enp6dnp2dnZ6enJubnJubm5ubm5uZmJmfl11ddpeanJ2dooFkWU1+op6enp2dnp6dnJydnJ2dnZ6fnZ2fn56goJ+enZ2dnZybnJ2em5qbm52enZ6dm5uanJ2cnp2cnZqYl5SRjo+QkJGVmJSWlJiZmpudmJuYlY2Mjo6TkpKRj4mQjpGRjo+Ki42NjYiIi4+Lg42NkY+MkI2Qk5WVnJihoJySn6SipKmam5eanKOprb3Bwbq8uL26ucC8ubq3uru7tL2zwbV/bnVmZ1peWUxJRTo7TElTPFZSSUM6QTo7Ozc3NTo6OjgyNTY4Oz08OTk7Ozw5Nzo4Ojw6PT85PD8+PDw9QTs5NTg8O0A/QT9EPTxBQkA8REM9PT06YZOTkZCUlJOTk5OTlJeYlpeZmJmYmZqbmpqamp+gnp+fnJqZmpqampmYl5iZmZmZmZmphXB1e4B3b4mhnp6enp6fn56en56fn56dnp6fnp2dnJ2cm5ubm5ucmpiZmZpgYWCAlp2cnph0Y1VOgKKfn5+enZ6hoJ6dnp2enZ2fn56en6CenZ6enJydnZ2cm5qYnJuVmJqamJiYmJmSjJCXlKCXk4+MjYqKiImMiJORh5CPjYqKkJCLjoqMi4+IiImJjpGOjYaFiYaKhoWLiI+SkJCNkJKXlpKamJ2TlJ6kpqaqq7Gsr6+rpquqsbm5tbS0rqyvtMDIxcXBvsbDxMTDurW+t7a0s7C2tb6qcHRyXGZfXl1JRj8/RUtMVklcTEQ/PUI6Qzk5Nzc7OTk3MTc5ODo+ODg6PDw7OTc5OTs9Oj4/OT5BPDs+PD46OTY5PDpBPkNBQT08QkBAPkJEPj8+OVyHhIOHi42KiYaFgYqMkZOVmJiHlZaWkpiampmenZ+gn52ampubm5ycm5iWmJiXl5ibqo56dXZ7f3mCoJ+fnp+goKCfn5+foKCfnp2dnp+enp2dnJqbm5ybm5uYmZmfaV5bZX+cnJ6Mal9QUoaem52dnZycoaGfnZ6dnZ2dnp2dnJiWlpaYlZWSlpmWk5GKjI+PjI+NkIuLj4+WiYiEi5GZjn2Fi42PjYyHioyQm4yRj4+Lio6TjIyNjIiSi4yFiYyPhouIh42KhYyEj4qXkJOYmpWbnKOqoaKknKKrsbe0ubWxtK2vsrKlp7O6sbq6vLa3tsDDw729vLa/urq8wbW4wL60r66mqa+3mm58Z1tjWl1fSEU+QUtJU1hZXkFGOTk9OkY/Pzo3Ozs7NjM6Nzo5Pjg6Ojw9OTk4Ozk7PDo+PTtAQDs8QjxAOjg0Nzw7QkBBQj4+O0NEREBDQz4+PjlhmZWLkYWNj5aSiHl9e3+Fi4OKgoqJhmuAeJCLlpqRnZ2UlJGTlpeampiWk42Sk5KQm5uIdndzcX1/cpGgnZubm5yenZ2eoKGgm5uWlpucmpubnJuYmZqYmJmbmpqXk3NoYVR2k5ech1xWUFeKko6SkY+Uk5KXm5mYm5ePjpCLjo2Ch4uLi4qLiI2RjIeHhoqIiZGKh4yEhYqNi4qNhI+UkIyDkJOUmZWQi5OTkZWRlpWOj5GMlI2Oj4qIj4ePhoeJiYmNiomJioWNh46JmJKUmpuXmKChp6Cko5qqqbO2sbWwqKqiqK6tn6qvsK21ubi8wr/BxLixtbCutrOwuL68ury+urOzp7G3wpB1gGNiXlpXUk1IRkVQSVlXX1tDUDpCQz1HRj84Nzo6NzU1OTc8OTw5ODo9Pjo6Nzs7Pjs7PTs9P0E7Pz48Pzo4NDM3OkFBQEI+PjpDREM/QUM7PT45Z6mloqKZn6CippeUiI2CiIJ1h4iKiIp7e3Z7enmPeoiSfn18en6CkYWBgH1zfH99fISHfnRweHZzfHaBj4iIiYeIioyMkZicl4iOhIuNi4iNkZCPi5GPi4yPkJGRjpKanpJ9oKOWpJxuTE9jhoaCjYuGiYp/iYqGiJiRiIOIg4KFfIuLjIaJi4iKkIyIi42PjI+Wh4mLio6NjY2Wk5OdnJyalpycm56bmpuYnpeTkZWWkJKRi4+LlpSMjYqDi4SEiYyQkIqOio2LipGJjZOTk5SVk5KcmZ6Xn6CfpaKvsamupKSfmKStpqa4t6ysu729wsPAv7+vpa2wsLS3uLO0uLa0ta6stK+4tLaBeXpjZmBeVlFRQUVMT0lcXl9UR0dCS0xCREA9ODg7OTU3Nzk3Ozc9PDk9Pj05Ozg6Oz88Oj06PkJBOD88Oj84NjQyOTtCQD9CPj04QEI/P0BEO0A+N2CloJqXnaGaoaCPl5efl5WCjaCfo6GdmpKOjIxycXBvdnFucG1ucHZub29waHBxcHR+c3FycXd7cnl2d3Jyd3Z6e3l8fXt/iIGEi3+PkYaNi4yGiouLiYeEgYaDgISgnY5/bJallZ+AiX9fcn+AgpKQhoSEhY2DhIyPj4+IjY+Hi4iRkJWRjpCKk5eOj5WYp6SfnZWYlpaln5udq6aqt7W4srGnr6qnpqGfmp2WkpWVkYqPjImTjZuVjYuLhoaJjJWQkJCLmZKVlZSbkJiTlIyNkYyWl5WilZ6mqauno6OqsJucpp+mq6G0vb6zs7+5u7u6uby9rqiusa6wuLyztLGxqrCpqLGxsqild3J0X2hhYFRWUUlKSFZNXl5eVExKRVFKRUdDPTk5OTc0ODY5Mzg4PTo9PD47OTs4Ojs/PDw+OT9DPzg7Ojg8Nzc2Mzc5RT4/Qz89N0BAQT4/RDw+PThUj4yGh4eUjJWZl5yWmZaNlZyWlZydoKCdmpiWeHFubXJ4cXFsbnJwa3FvcG1yc3t1dnd5fnVxeHZ0d3tybn98gX15eH1/eYOGg4WCg5CLkIuLi46Pi4mJhYKCfn+Aoot8blJ1nIyMWnF9fH59fIaOjYuGjZSRi5CXj5SXkpihlp6WlZunpp+goKawq6GjpbW0sqqmqq+isba5vcK7ucO+vLi9uLWxrLCsppuSk5mfm5SPk5WOmp2doJqfn5edo6qsoZ+em62hp6qwqaampJiRkZWUo6SirKSss7Szs6i3tru4sLKvra2yt7a6srW6s7e5u7i8urayr6yxsbKztLOxsa2us7Gzs6yhl3Zxc19jXlJRVE1PSUdYT1pcZFROR1VPRURKRD44OTg3NTg4ODU5Nzo6PTw/Ojg8ODk5PTs9PTpCPj84Ozo5Ojk4NjI1N0I+P0RAQDY+P0I/PEM8PT46Tn98go6MjJOTl5eaj5SWjZaRkZSXk5qanqGdnHJvcnFxcXFxcG5zcW91dHJxdneAdXd8eYV+d3t8eX1/fICJiYmDfXp/h4GIiYGAgIGGiIKGi4eIhYSIiIqFgIJ9mJp3WE9McJSGgkxgb3F3iIWKjouNkJmclJSUoJqan6Ktsa6ppKWtr6ysrLWuvrmtrqm1sLexq7G2rK+9wsLAvrq8trKutraxtK66u7OurKepp6unoqmtoKmooq+wuLSxvLq6urK0ta+8tLezt7e7t7mtrbCprLW5sbeytLe2sLu7vLu6ury1vLi0wbWsqqqrtLG3uLm1trSzsKymrrCqq7Cxq6yusLKxtK6qo5N4dnJlZ1tMUlBFTUlTV1JlXmdUUExcUUhMUkNBOTk3OTU4ODY2Ozc5Ojs6Pjk4Ozo6Ojw8Pj08RD45Njs7ODg+OTUxNTZCRkREP0A3Pj5DPjpBP0BAO0t/gomXmJSdlpabmIuSlo6XkZGVl5SZl5+bmZx8dHV2dXl1c3RudnJzdHV2d319gH56gXyDfoJ/fYB/hIKFj52RiYF/go+Xjo6HgoCBiIuFfoqRi3+IjYyLi4eRjaONVS8wPXeHd3ZBRF5rbYSQiYmQj42PlJSYkJWcmp2eqK6ysLC1tLOtsrW4sLy1tbGqsKqztbS7t7SztrS1r7i4t62noqassLCvtre3vrW5vLOysa61u7C0r6+yu7axuMC9tLS0s7izvLq2tLrAvbm6ubq+ubm5vrWysa+yr6q1tLGzsbSzrri4tb+vpKaoo6ussa+zrq6wsKytq6qroqKmqKKnrauqpaynoqeYeHlxZmVZT09NSVJNV01PX15cTlVVYlFEVE07Pzk8ODk1ODc1Nzk1Ojo6OTs4Ojw8Oj08Pj4/P0I9ODY6Ojk6QDs1MjY2QUZDQz4/Nz49Q0I5P0I/PjtLjpGTmJmVmZGTopiTkpKLk4uOkI+Vl5ablZSbhoJ9enh2dHRzdH53end2gIKDhouMhISFioaQiYeRk5aRjZaalY+IjI+emJaVkpCTl5qamZCeoZ2Tl5uhmp2boqacZ0FaSDt3eWtnRS84W2xzkI+LmJqPj4yUmpecnZugnaSstLm6vK+2tLi0tLK3uLmzq6+qqKy1srK1rrGrrqa3s7OxpaGotbCvrayrtbqyu7q6tLK3ur67ubG4sLmtqLK4u66ttLS3tbu2trm5vLe0r7G0t7a5s7e1pq2pq6ior6yprq2up6KxtLG0q6aop6Cjq66oqq6orLKwr6+pqKGeoaGjpqOgopqlo56ol3J3bmdiVUpUT09KRFBLX2JYWlFcVGBNSFJJQUA5Ojg2Njc3NTg5NDs5Ozk8Nzs+Ojg8PD0/QkBBPTs2OTk5Oj87NjM3OD5GQkJAQjk+PUBDPkBGQj44R5OWkZWTkpSQkZ+ZnZmVkI+Sko6Mk5aWko6RlZGSkIaBeXJzdXuBhI6HhZGTkpicnJiVkJWYo5yaoaeqqZ+clpeVnaKioZyZnpmlqKyvramnqqqpp6KlqKmrqamvj0tvoXhBe3djYlBQWkdgboqhoaSem5qkp6Spq66spaSoq6+xtK6qrK6zr6ystLS0ua6urayqrLKwsK2wqKqmsrS0uK6qtrqwr6qurLC3s7i0t7W0u7y4tbWxtauyrKiys7uvrbGytLa1sbG0s7OvrKuvs7a0sayutKqqpqWnrauoqKupqqifqbOwqqeppaOio7CtqaatpairrayppaSioKWipaOYmZyVnqKippdudWVnZFdPWUtLSktTVHBiWWRXX1tcUlpQTEM8ODk6Njk4NzQ3NzQ4Ojw6PDg6PTk3PDw7PkM/QT47OTo5Ojs+PTg0NThBREVEQkM5PjtAPkI/R0Q+N0KSm5SVlZaVj46Wl5qZlZGKk5SSjo+SkYqKiY2Ul5qTjYmCho6VkZSfmpuin5+jnqGhn5ijpKelpaapqa2rqaKmpKilpKGfnqOjra2srairrq6rq6ykoaKmqaeoo3hgv9amQ3uMgHVPbY51UmR/o6inoKKhrqyrqqetrqilpKmpqqmmo6iqqaekp66wr7Ovq7Crqq+yr7Czua+rqLCxrrCyubO0r62vtbCss7GurLW1tLSzs7CvrKyqrKusr7G0s7CwrrCwsKyqrauqq6alrrCysKumqbCvqaOkqaunqKaopquwq6mvqaaoqaalo6iwraqpqKKpo6WnpKGhoKKloZ2el5aYlJugpKmUbnNeamlfVlpOUk5RT1NlXGVjW11ZXFBZT0tAPDs5Ojc6ODczNTMzODo9OTo4OTo5Oj08PEBEPkA9OTo8PDw+Oz45NTo8QkFFQUNBOT47P0BEQENCQDdAkZ6YlJeZlpGHi5SSl5GIg4mLk4+OkI2Hh4SFlZmWmJeZlpqeop2ZnKKkoaCdn5qfoKGgpqGgoKCjo6KlqKmrramqpqOmpaCloKaop6aoqaepqaSnp5mdpKWjop1if73Ar3eeo5qUZUxheG1RdJWioqChn6GhqKCcn6GloaCmo6KfpKGspp6foaGkrKqnrKivq6e0sa6ur7WyrKqwq6mtrbWwrq6srreup6yqpKivsq+sq7Kvqqqpq6utqa6urrGxraqtqaunp6uoqauinaapqKilqKisqKilpKWop6iopqmsr6+oq6mhoqKlo6Opq6ymqKWjqKKhoKSdnZ+hoZ2bnZ+amZWcnKOqlG9zZm5yZF1dUFVPV1BeZWRsaGJiWlpSVE9NQTo9Ojo4Ozk1MTYzMjg4Ozk5OTk7OTk8Oz0/Qz5APTk7Ojs8QDw+PDk5PEFCRUFGQTo9Oz9BQUJBRUI4PYqWlJOYmpaPiISNjpGSjIiIiI+JiZCRjoqKiJubmZygpaKlnqKjoZqeoZyanZ6bnKOop6ugoKOYoJ2XnKGjo6WjoqKkrKilqaCepqmnq6mkoKKhoqehpq6mpp2eaoScuo+m0KGZsahYTKyTU2WPoJ6goJ6doKOZlpqYo6KipJ+ZnKGhoqCbmp6goaSgnaejqrGorqusqaSqqquorKalrKqws6+rq6mwq6appaWoq6ynpqevq6Wnq6upq6irqqqrrailqKOmpaesqayoopykoaOmo6qpqKano6SnqKanqKepqKupoaKoo5yepqWjqKino6WlpqmgpJ6inpeYnZ+doqKlnpiUlZ6go5d1d2t2eGJfXFVZUVVXW2Nfc19oX2NTUVlUSD48PTg7OTo4NTM3MzM0Nzo4OT05Ozo5PDxBQEM9PT44Ozw9PEA/Qj86ODo+P0NAREE6Oz49QD9DQ0VDOTyCmJmenZ2alZKKiZGRl5GQh4SJgoGNj4+Sj42cnZ+hpKmlqaeorK2moqKfmKSmo6Stsa6yp6asm56em5qjp6Cfo5+foq+rq6yoqKuvqaiqqKKgoaiqrbGyr6uiooZ3fn1yzsmxm6eva1WqsGJah6afpaKhnZ+imJWem5+fpKGblZigoZ2enJudnZuZmZWen6Oonp2iqKGaoaOmoqSoqaqoq7CxqKWlp6eopKWpqaqnoqWmqKadnqWloqClpaOlpqCjpaOjpaelqamqpKekpqKmp6SrqaenpKGlqKynpqWlo6OopJWdo5+bnaCjqaeopqGjo6mooKiioJyVkZqfn6GmopuXkpCamqCVfHdvfXlmW1tgX1pcVVxoZG9jbWlpYl5QUEA/Ozo4OTg8OzYzNDMzMzc5OTs8OTs7OT49QkBAPTs9ODw9QD08PENBPjo4PT9EP0M+Ojk+PEI/P0FEQjk6gJ6kp6Gem5+gmY+ZnaCWloqGj4iEi4qTl5SRo6Wnqq6trLOys7S4t62pqqevtLKxqq6usbKusa2lq7OssbGpq6+rq6y2sLSwq7GysaOgo6qqp6+3t7S1trOtrq2PhoNuj825lZCil3RUb3pzbnuVpqqno5+eo5udoZqWnqScm5aZoqefoJ+joJuUlpmWl5qfoJmVnqGZmJ2dpZ2gpKeqqaiqraylqaSlqaeqqaqsp6SkpKOimZmhnpqaoaCfpaWYnqSmpKqooqelpaGqp6mnp6ejqKWmpaGkqKesoqejoaalpaOVl52Ym5mVo6elpaSfnZ2lo6Kqo5+amZiXnJyaoaGakJOTl5ibjYB3cnZ4amJbX19cYllgZG5ta25hX2RgUE9BQDs7OTs4Ojk2MTQzNjQ3Nzc6PTo8Ozk9PUI/Pj89PDo/OTo7PD5BRUA9OTtAQj5DPTs5PjlAQEA/QkM7OXuao6OcoJ2dop2Zn6KioJibmJaYkpSQm5qWl7S0rrW4s7S4tre0uLm3tbm4ub28uKqLnLK4vLS9urW7uru4s7q/uLe5u7G3r6iusq2inaCrsre7u7u5ucG4tLWgiHlkWZ+3wKaonYh3a3FveHh6fYaOkpicoqWmq6WkmKGko52goaKooaOgpaGck5mYmJmco56cmpudl5uZlqWam5+hqKmpqKuvr66pqKmrrKytq6irp6WjoJyfo6Ojn6Cipammmpyip6Spn6GjoqKgpaanpqSooJ+ipKGjoqiop6OloKGop6alo5mbmJuTj6GknqKfmJiVoJuhpaCfm5udnJuamZugmo2YmZiTkYaBdnh5eGNbUllUX19hbWh2a3FoaWliWlNMQDw6Ozg5Nzk3NTU2Mjg1Njc3Ojw7Ozs7QD4/QD0+Pjk6PDk2Nz47QkZCPDg7PkNDRDw+OT43PkFCP0ZDOzhwkpqblJ6bm52Vl52doqajopaXnpaXl6GblJi+t7G4uba3t7i7l5S2vbu9vcDFtaK7mKC3v7+6wcm0nbu2sra/xcGooLa0urGqrrSxsLK0tbfBxszPzszJvrOkkHNmUkSLl4mJiH54cW5nZmxpa3FycXFydHyMqcTEu6Knqqynq6mlpqCnoKGmoZOWmJ2foqSjnZ6coaChnZekmpmdoKaqqqqtrq2tsLGrrK2sqamrrqimpaalpqSkpqaeo6eppKGcoKKjpqCio5+jpJ2foqWgpJyboZ6fo6GhpaSlqaOkpaGkp6ehn52elpOcoJeZko+MjJeWn5uWnJqdnJqTlpSUmJOQmp2YiouHgIB8gnhhXllTYWlhZnRvdGl0ZGlkYltMSz46OTg5ODg5NzM0NTI1NDY2OTw8Oz08P0E/QEA9Pj44OTs4Njc/OUJFQzw7PD5DREM9QDs9Nz1DQ0BFQjw3Z4yRk4qalZiblZWYm6Knq6aVl5iQlZmhnpeXvrWztLu6ubi5woeYt6u4u8DCxbOjw6e4s72/tMTHvbS7uL62wMTErqCworW2tb2+wcTHw8XH2+Pj2su8r6SXiHRZWlFDaXpsb3Vua2VlWVdeWFxjaWloZWBoibTAwLmpr7Gwr6yqoqajrJ+fpquXmqifpaWfoJydoKuwsKyiq5yYm6Cor7Kys6uorre1sq2tqaalqKulpaStqaShn6Cnnp6mqKmmnp+anqGlpqmcnaObl6KmmpuanZ+cmqGcmZ2eoKijn6GenaWioKOioZSZmpmTj4qLhI2Qk5uPjpiVm5eYkJORkomNl5iYk4uKi32AgIVwYGJfXmtjYm54dXdvbVtiUlZcTUc7PDk3OTc5Ojc0NDQxNDM3Njg8Ozo8PEBAPUA/Pj8+Ojo5Ojc6Pz5FRUU8PT1AQkJCQUE7PDhAQ0NARD87NV6MjIaFlouUlZeYl5ifpqellpWVkZebn5ual7mxtrO5vLy5urWqsryxvsG0vMe5uLuuv6fGw7/KxsnIxcXJvMLHx7+xsKe8vL7FxMbJx8XGvs3R1cq5p52UhnJeUVRLRFtmXmRrZWFgaFlUWFJWWFlcWFp0mba7q7SyrbOtqa6vp6awr7Ktqq+zpKu1qaeopKCgnqmyuL61tbWqqaausre4t7apq7i8ubexr66noqOop6SfqKOfnqCZoZydoqSnp6GelJuaoKGlnqChnpajnZSQlpiboZqflpORlpSin5qenJudoZ6kn56VnJiPkpOPjImTkJefiZCWkZuUmJGRlZaDjJWXlpKLjIh8f4R/amZoYWtsZ252cnJ2cmdeYFxSSUU/Ojo6Nzg0ODw3NjU0MjMzNjU3PDo7PDs9QD4/QD48PTk5OTs6PDw+QkRFPj49QENDQkREOzo4QUJCQUNAOTNbk4iEjZGKi5GRlZCSmp2fnJOSmJSdnZqXmpW2sbm1tb6+tri1uLO8vMTEusPHwb+0s8XFxr/CzcfLzsvLx8HDxsfIysXExcO7vLzBxcHFxL/CwcfLyLeUdWVVUE9USD5ea15fZWJgXWRhU1ZWVVNUV3Kbq7CqqKqtrKmlpZ6pr6uyu7q4u7e5t7O5uLOurLO0qrC1ub3Bur6+vL60urm4u7qysbS8u7q7s7Oyp6Smq6uioaCdmpudmpyXmpuenJygnZaclpuZnZ6io52UnJCNiY6OkZ6bnJWNh5KLmJiWmpybmJybnp6cmp6UjpiYmpSRmZeeoZWYmpKXlJWRlJqYk4+TnZaSi5F+enx/dWtsbmRvbWlxeG95amlhXWdhUUZEQTw5OTc2NDQ6ODQ2NTMzMzY1Nj05OTs7PT47Pj49Oz05OTs7Oz89QUNBQkFAPEBDQ0NFQjw4OUQ/P0BCPzsyV5uQkZCQh4WSjo2IjZCTlZGPjZSUm5STlpqRs7e4uLi+u7C1sri2tbbAw8G+w8LAvru+u7u8xMzEzNDLxsa/xcfLyNTLysjGv7u7vsS+xcjGxsTEw7m4w5thSURHS0Q9W2ViYWhjYFtjX1dRTk9PVX+0uqyupaSip6SgoKWZqrSxvsG+urm6uLW0srG0tLO6wL7Av769u7u9vsDCt7a3tru7sru+ubi3u7a3tKyoqamrpqijnpOampyYkZKZl5GRmJqXnpiWk5acm5+dlJOJiX6GiIyWlJiZkYmVkZeWlZmbmpaYl5idnpyhmJWZmZyXl5ybn56jnJ6WmJeTlpyZmZyUlp2UlpOJdnl6e3dua2lodlpnc3hzemdnXmRbUlhJRj87Nzg4NzYxNjk3NDQzMzM2NDY7ODo7Oz08OD0+PDo7PDs9Ozs+PkRBQURCQEBBQkNDREM9OTlCQD8/QD89MkyWmpaSk4yKmJCKi4yOkpKKiIaNkJiKj5CUl7O7tba/vb2xtrjBvby0uL/Bsbi3vsHFvbu8wsbJv8jOyMHEwcfKysbKxczIzcbIxb/DwMvNz8rGxMTEwsTBrYNPRk1FO01bX2VrZV9bYFlYUk1Uf6KqubWzq6mjoa2qrKetn6y0tL/Dvrm4vbawrausr7W0ur7Fv7u8urO5u7i5ubWtsLS9u7G/vLiytrmzubu0ra2orKyqqaeXnpualY2MmJSTjJWWlJyZl5WWmZKYn5mQiop+iYqKkY6Vl5OUn5mWkJSZmJmWmJOUm6GeoZiYmp2ZmZaenpibopqdnJuYmpuZlpeXlpyZlJyYfoB4eXZ2ZWZpamhea3BueXhjYmFgXlhXRkU4Ojg6OTc5NDQ5NzY2NTEyMzM0Ozo9Pzs9PTo6PTs8Pjo7Pz48QkBDQkJFQj0/Q0NDQ0RFQDk6QkFBQj5CQTVCkJeUlZmSj5qQjpKRjZSVi4qHjI2UiImPkpq2u7S8xsHEwr3BxcLAtLO9v6ywr7rDysPCvs3IxbfByMW/wcLIzMrCwsTJzM3Oz8zDx8bIycjIycfFycfIx8LGlmpYRz8/R15jYmpgWlhXU1V2mba+u7y6vKytpqm7urm3v7O1uLLAxrq3t8Gzsa2tqau1s7u2w7a2vbWxt762s7e4sLW2v7uwvbq0q7CxsbO8urOzrqutq6yxnaOjoJqQjpiXlZCclpaYlpWSnJmTm5+clpGUjpWQiYyQlZOUm56YmZKSnJedlJmSk5aZmJ2VnJ6do5yVnZ+TnKKcnKCfnaOemJSVl5ebmpmgkH99cXRxb2NhaHZpamp1bnlsXmRbVmBZTEhENjw5OTg4OjUzOjY2NDQxMzUyNTs6PD47Ozw9PDs8PTw7PD49P0E/RUFCQ0M+QEFARUVERUE7Nz5DQkI+Q0I4O4+akZaalJKUjZCUlI6VlI6Pi4yJk4uIkJObt8C6xsXEw8zCwcS9vrWvt7uvr7O6wMfFxMHMy8W2ucDCwsTHytHLwcPExsnFzNDNx8zJwsLHwsvLyMfMyc7Fxsa9qXJQSzBYU1VmYVNOT3CpyMjCxMbAvL60sbCwwb6+wcbAvre2w8K6urbAvrWyrKmvsri+tMC0tLi0t7nEua+8vrm+v8K/tbq2q6qsrq+wt768trSura2vtaWlqKimmpycnZyeopydmZOQkp2VmKCdmJiVmZmZl46LlH2QkJefmZmYk5GToI6Nko+VjpCUlaKdnKSem52elpyjoKGipKOkop6amZubm52enIN9cn14cGdga2p3bWlmdm90Y11jVVdVVE1HOjc7OTk3Nzo3NDg3ODQ1MjM0MjU7Ojk+Oj08Pz04Oj05OTk9PEBBQEVCQUJBQT9AP0RFREVAPDk+QkNCQENBOjSAoZeUmZiVkImUk5aTiZGMlJGOiJaKi5CXnMXLw8O8wMPHwbm9vbu4tre3rrK3uLzAwsDCx8bHurzAwsTHyMbSycHDw7+/vsTLyMrLyby8yMfJzcjDyMnJxcXCw8LBvJE/TnZ+iVZMb6TL1MW2v7/Av7q6vbWzs8C/ub/CucG3u8G8uri7ub27srCvsKy5wri9ube1t7q9xb24xsjCwcLGwr28tamurrCwr7O6t7m2sK+tr7OppquprqannqSlo6OjoqCblZiekZecl5GRlZeZlZmRlJiSlYyYo5qcnp2FiZ+TfJKWlZKUlJennaCipJ+en56foaGkoqKjoaOinJyfnqOgppl5enmAc3BmZWdka2Via25vb19ZXVdWTlBKRjk5Ozk3Njc3NjM3ODk1NjEzNTI3PDw8QDs/PDw6ODo8OTk4Pj1APz9GP0JBQz89QT5ARENDQTw5PENBQ0RBQDozbKKdlZedlo+PmJiZmIiSjZGVkI+Vjo6TlpbKy7u5urnBu7q3vsG8vLu5sa61uri4u8S6vsC+vru8wMXBxsK+xsK5u8O6uLm8vsHHwca7ucjIw8XEwMPBwcDEwcK9vMWnd2qDkJhvqcjIx9HBr729uLm7u764tbG6v7S8vrG5tbi7tryztbm2uba5t7GtusG6vMG/t77Ev8bDw8fHwrvAwr/Cv7iys7O1tLGut7S3tbSxrK2wp6alp7CtqJ+nq6ajqKWmpqCgn5SYmZSRkZWUl5OYl5qhnZ6hnKGdoaWglpSbkZeXmJqTnpmZqaSlpKWdo6CanqCkoqOcoqGjoJ6cnp6ppaiVfXqDeG5mYWViYWNkZGpjZ2RbWlpdWVFPRT07OTo7Nzc5OTY0OTk6NTMxNDUyNzo7O0A9Pzw8OTc3Ozo5Ojw+QD8+RDxCQURAPz49QkRCQkI9OjlCP0FCPT44NVmfnJiTmZaRlZiYmpeQkZCQk5GTlJKSkpSUxce4tbq5wrm5vMPFwri7ubGxtry6tbnAu7u5tre0tLW/u72/ub66urTAuLW3sq66u7fAt7zKz8C6v8C8u8W9usDEv72+r3NlfZGLidHFv7/Jv7DBv7q3u765tri0uLy1vbi1tK+zvLG3tri/tr25vb65t7q+u7/Axb29y8PGw8TAw762ubq2v7i7v7y4trOyq7CwsrWzs66sq6emnqeurauiqKumpqqjp6iqo5+Ym52bmpicnJiXnJuhpZ2anqGhoKGmoJqbnJiboJ+dnJ+coKiho6SknaKfmqKgop+el6Shop+dmpieqKWhi3x5iH1xZGFjY2hrZ2dqZmpeVlZUWU9UTEY4PzY7Ojc3OTs2NTo7PDYzMTM0MTc7OTg/PT47PDs3Njk5ODo7PUA/PkA9PT9CPjxAQUNDQT9DPTo2PEBBQDw9ODdJlJibj5OUkZWYlZGWkpWRkJGUlZSTk5OYlcHCwLq8ub62uL7EwMKxvbqytLO4vLW3vMC8vbS0sbC1t7W7wbi+ub+8vLe0t6+ut7W5v7vB1o23v7vDtbrHtrW4ury4ubaqo5iOf4PJv7+7wb65xr3Cv7zFuLe3tbi2try7uba0uLq1s7i8vbm/ucPAwLu5vLu+vcjEvcfEw7rAvb62sra4srm0usLCureysaysq62yr7Kur6ijpJ6rrKyqpKakpKiqoqemraihoaGmn6Oiop6bnKKfoKOdnJuhn6KgpKCem5eZn6GdnZ6eoaWkoaKioZ6ho5yinqCZnZijn52eoJqZoKKmnYR6g4F5cW1lZWdvamVsaFlZT0tLS1JKTEhEOT44PTs2Ojs5Njc8ODk4NjA0MzE3OTk7Pz0+Ojw6ODg5PDg6Ozs7PD1BPj09Q0E8P0NDREA/Pzw6Nz5CREE/QDg4P4mYmoyMkI+Tl5WMkpCakpGXmJaUlJKQmZTDvsbBwby8uLi6v7a8scK2tLyxtLa4s7q9v768sq2vrLGwt7y3u73BxLm3t7a1ubm6u7+8z8R3p8y9x7e5t622tLe5s7WxvMnDlUt6yr6/vr28v8jDxcW+x7i1s7O+uLm4vru6uby7urS3u7q5v7zEwL+5uri/ubvFxr3Fw8Kyur27sa+2uLO3s7q+wLm2rLGrrqmqqa2qqq6mpKWnrq2ppaOio6GkpaWmoqato6Klo5+ho6Gcmpyhn6CloaCenZygnaWgnpeVmZ2fn52gn6KmpaCknpybn6Ofn5mcmZ2epJyWnKOcnqGcppZ+f4Z8a25xZ3FrdGZjbmBcVUhLSkRKQ0NHPzo7OD48Nzs7OTc4Ozc8PDYyNzUxNjk8PD08QTs8Ojs6OT45Ojs9PUA+RD89PkRAPz9BRkQ/Pzw9OTc/QUNCQEI5Ojl3nJiLh4uQkpOWjY+TmpOQnZiSkY6QjpiTvbfHvsO+vbu+vL22uri9ure9s7OwuLi1uby7wLeqraSusLi7sr2+u8S2tbi1t7++xLzCxNavdH+6yM/CwLiutLS7vbe5sb3Dyo9DdM3Dwr++vbzHzMfHxMe8trW3wb27vMDDu7/Cv7y2t729vcHBwL+8ube8wru3v8W7wr++tbe8vK+vt7awtLO6ubq7r6mtq62rrKaqoqeuqKWqra2vp6Sgn6ajnqKjqKOjq6Oiop6dm5ublJaZnJyfpZ6fnpmYnpejoJyXmZqZmqOjop6jo6egpqCbnaCjnp2WoJmcoKCblJegn6WcmKKQgYaBcWZsam91b3hkaGNcY1FLVUhFRUNHQzw7OTg9Ojc6PTo4OTs3PD01MzY1MDY4OTo8O0A9PDo+PDk+OTk9Pjs/PkM8Pz5APz4/P0ZEQEE/Pjo3P0BDQz9APTo4ZqGYj4uNlZKVlY6PlpmVl5uVjoyMjY+bk7m2wbS/vLm8w8C+wLq1trKywLmvsry8sLe7tru8qqqjsLm9vLK8vrzFuLG4ubzGycrCxsnSmnFyq9LRzMrEtbq/xMi+vrS/wMB5Um3LxsK+wby/w8zKx8XGwbm+vcS/wL/CyL3HxsXFvLrEv7vBv7rAvLu7wMS9t7nCub69t7S2uLqur7WxsLCytre0t6yurKqsrKuoq6Gms6qlra+trKippaOkp5+io6Onoaeiop6cnZyamYyQlpeZnaKZnpuVkp2UoaCdmZ6fmJimpqKfoqKmoqeloqCko6GbnaCbnKKfl5WVnp6kmpafiYGDgXRwbW10bG1vYGNfYmJOSU0/RUA/REM7Ozo6Ozo4Ozw6OTw+Ojo+NDQ1NTE5OTo5PDtAPD89PTw4PDs6PDs7Pz5DPkI+QD89Pz9FRUJBQj87Nj9CRUQ9QUE6OlmfmJOSlZqVmpOQlpeclZuZlpSVkZKTnZm2uLaxuru6vsG5uca7trWypb69tLbBv66zvbS4wbGwsbS7xNDDur68xL63vMC/yc/HyMrKwodyc6PLzMvNysbCw8vOwby4vbqxcGNiu8jEwMC/xMDKycPDw8O5w76+ucC9w8bCys7Hxr26xr26v7m3wLm5vsDCvrW0vLi2u7CvsrK1r7Cvrqyus7CzsrirsbKxqrCrq6yrrLatqKyusqarrKmpoaWgpaakrKSmoaChnqGgnaCMlJeTm5+mmZ6emZOYnZ+gnp2eopuYp62ooqSgoKKqpqmhqKGlm6CgnZ2jn5SYmKKdpqGfm4J7eoh7bW14fGBxZFxfYGBUST5DRUlCQz5DOz42OTo7Ozs7Ozs7PT05PTU2NjIxODo5Ozs6QTs/PDw+Nzs8Ozw9PTw9Pz5BQUE/P0FCQUVDQkRAPDY+Q0RFPkJEPztTmZuZmJ6dmqCalpyZn5KdlZ2boJWWlJqYur20sLu8wcTCv8XGura5sqO7vbS3xLuwtbq2ucS4tLy3u7ur2sO+tr7Avr66ppypsrbDv6V6dniaxMfLyMHDwMDJysG/u7mxoX1zaq3IxcS/wMG/y8fDwMjAu8K7ubS7u8PDwc3QysS9tby7ub+5urW1s7/Avre0s7S4rbeqr7CwsrGvq6+nr7ausrG5rra2uLSzsLGttrS6sa6srranrLKsraSjoaenqLKrqqWkp6elpaCml5ujn6SmraKeo6KanaWiop+foaWenbC0sKSlnp+kqaevp6mgq6CiopqipJ2anqGmp6+psZWCe32Bem5zeXRocF5cX11aUkZFRE1JQUQ9SDs7NTk7Ojw8Ojs7Ozw/Oj01NDUxMjc4ODs8O0I8Pz46OzY6PTo7Pj0/QD87QUFBPj4/QkBBQkJFPjo1OkFCST9AQkA7TJqdnZ6fnZienZmampySoJWbnp+blZGRl8W+urbDvMbCvr/Ixbe1uLe2ubu0r7e3srWzt7m8u7a7u8S5bazOvba5wLyrfm5obmxygZWYc3d8l72/xsC5wLy+xcS9vbixsJmQfoCbysLDvL2/v8PDvr/Ivb7AuMi+q6Ghoaa5wcnFuLK4uLe9ubuxtrLIwLu2tLGwt6yzqbCtrbS3r6uuqrG1r7Gvt7O6usC/tre2sru6wLWyrbO3rLC6r7KloqWrrK+5s7KosK+xr6qiqKGkraitrLOun6inpqWmq6Sknqaqo6ayuLOrpZyfp6anrquqpbClpaWbpKOYn6exrLW4sLKOhHl/fHdtdXtxb2pcYGFaVFFBRklHS0BFQ0k8PTY7OTk8Ozo6Ozo9Pzw9NTU2MTM2OTg8QT5AOz1AOzs5PD04Oj08QD46Oj49Pj09PkBCQkJBRD03NDU9REc9Q0I/PEWUnqCgoJyXmpiYlZmdmZ2fm52bnJaRj5LDwMK9wrzEvLy7xbu3s7e2tru7s6CWtayvsbS0tLa4ucDNtHaAs722tcKlh2laXWBNUltabnN3gJ+4uMK6s7u3u72/uru7rqSbmYiRfsDEw768v7u7uLbBwrbAu8isvK26uJ+TkZujt7SwtLS1vLm+ubq7ysO7uravsL2xuK+ys7C3vbaur66wt7CsrLK2vbzEwrq9t7bAv8G3tbC2srGzurGxr6err6u2v7e1qbqztbmxp6uop7ausrG1uaisrK+qr7CqqKessayytry0saykqKuoqKusq6i2qaaonqadmKOuvLG7wbSmiYF7gnpzdnd4bnJhX2ddW1VKPT8/R0c9R0NDOTo1Ozk5Pjw8OTo8Pj4+Pjg4MzE1Nzg5Pj9BPzs6Pz08Oz09OTs8OTs6Nzs+PT1DQT8/QUJEQkE8ODU4PUNGPUREPzw/iZ2en52Xl5WUk5aZnpubmpuYlJ2Uio6Owb7Dwr6+vrm2usCxtbGzt7fCtbOrrbOoqa61r620trnCyaiEeImgr7Wea2VmVlhfSUlNUFNsd4WlsLe+ubK1sru5vLa5vrSVnKeWoXCuycTAvb+5s66yvbuuu7uUj87c5uLRuJqShn+dra+us7q3ur67wMXBu7y3sLXEtb+0uLu0u8PCs7a2sbisqaWrsr23v7+7u7exvL28trGvq6uprbOvsLCrsLSpuMC2sqm0tbC3tq2spqu7s660uMKwsbG1sbK1saywsri4ubi+tLGzrqyxramvrqqyuK6trainoZ6ptr+4ur+wlol9gHxxdHd0d3JtYGRiXF5PSUI/PUlERk1EQDc3NTs6OT48PDk4PT47PT86ODMyNTc2OD8/Qj86OD4+PTw5PDk7Ozo8Ozs6PEA+QkI9QEE/QkI/PDs3OjxBRD5CQz8+QYqgm6GdlJiVlZKYmpyWm5WalY2bj4SIhru0vb+7vLm3s7y8rLOytLS2wLXAr7Kzqqqxt62pubO3v8WriHx2jKCZYFRDV1ZIYWtWT0ZJYI2gq6+2urW0sqy8ubi1uMG9i5myo6ZypcvCv7m6ta6lrLOwprO5mujj29XX1c+6iXVqbJisp6+2s7K6tbu7u7W4trC1xLK+vL68ubrFybq9vraxp6SeoamxrrW5trKxq7S2trGopp6gmaWmpKynq6y2qa+6sa2kpq2lq7GrrKmtuLawsrjBtrGxtbGvu7ayt7W1sry1urKwsbKutLKqrq2nuLWyta2uqqiosrq9wLa0qY6Ce393cHxvdnNvZF5oWV1eU09OQj9KQ0FLSkA2NjU7Nzg+Ojs4Nz4+PDs/OjkzMjc1NzU8PD48PDg+Pjw8OTk5Ozs7Pjs7OTw+P0E9PEJAPz9CQD47Njc6QERBQ0E/QUKJoJ2loJSWmJiVnqCcl5uYmpGMmYmDhoS1r7S7u7S1sLG2uq6wtLOvtbq1urC1s7KttrqvrbyzuLi/tZGCeIiPb05KP2NaQU53gJRrTUFcgbC1s7WytK+su7q4trm/xnaEqp+bZae/uLWysa2tn6Snp52ror3Lq6i1ys/Py5l0a2xyoKSqra6nsKyvsbGtsa6ur7mwtLy+uLm4x8W8vLu4qaKcmJufp6assq6zqaapqq6popqXl5GcmpijnqKir6ekrKaompqemqGnp6anqa+2squ0trCqsK+xqbm2sbWxrqy3s7avrquuq7S1ra+rq7GtsbKoraurs7W3ur2wq6GLeoJ5cnZ0bXZqbF1ca1VeXFBOSERHTUJHTkc4NjY1OjU6PTg7OTc8PTo7PTo5MjM2Nzc3Pjs9Pjo6Pz48PDw6Ojs5Oz47PTk8Pj1CPDtAP0A/QT8+OjU1OkBFQkRBQEJBiJ+ipqGYm56dmqWpmJudmpmUjJmHhoeGrq2uuLmxsqiur7iyq7CwqrK1ubm+tbK4tLm6trm7tbWzt7aVjIiEe1hGQU6GWkpKWHaNgGNAUqK5s7SysLGtsLm4tru3ur2QorKspHOrsKmrraujqKCdnp2Ymq6zWjhLearFysaigIWSiIieo6mooKanpaqtp6ynqKesq6yyu7SztLm6trK2ramgmpaWm52fq6yqr6Oko6GpoJuTjo+QlJKSmZaanaSloJ+ep5iVkpSZnqSjoaWqrK2iqaqppKmtrqW0sa6xrKqprq+wraWmqqSos66trKmmpqmrpqqnq7Ksr7Oxq6mWgX+Bd3J5aXV0b2VVYmRYXVJPTUlASVNETkM9ODg3NTo3PD06Ozw4OTw7Ozw7ODI0ODk3ODs7PDs4PD0+Oz08Ojk8Ojs9PTw6OkA9PDw7QD5CQEE/Pjk1ODs8RkFDRD9BQYijpqKjnqCfp6Coqpufm5yZmI6Xi42PjKqpqLGvsK2lp6ayr6mmq6CvsLu1vby4wMG+vLy8ua6sr7G7qpmZlWlOQFJ4cVBJSUtnm4FZRVGtu7Gss6+urK22trK0ta6ppp+am52fpqieoKipn6GnlpuWl4ysfTJSaFZ0r7WxnoyaoqKblp2jop+epKCkrKWmqKSio6OrrLOuqa6urqeqraisoZyamJmYm6qoq6ufpqKbo5yVkIyPkJCTkJeVlpifnp6amaaXk4+Slp2ioKWipqSnoKKko6Ghq6uksq2qrKyno6yuraufoaKkpK+srKmmo6KqpKqppKmrpqmsq6ahiHmDfHZ/emN4bW5cUWlVUE9HUE1NQ1BSQD87PjQ6OjU7Oj07Ojk9OTk8Ozw8OzkzNjk5Njo7Pz06ODs6Pjw6PDs5Oz07PDw9PjxAPT88ODtAQEE/Pz45NDk8N0FDQkQ9QEOOqqSjoqGinaqlpqimoZ6dmZ2PmJWTkJWnpKGmqKmlpKChp6uhnKKbp6u1sry9wMLCwL7AuLSnpKyovMKrpL5pRVKcglFXSUlfS1OOYWRigK61qrK0rqqrr7Cys62lnZGXk4+YoJ+ioJyjpJ+dqJOZlJWLoGNehod0WoyjmZuYnaGkp6adnp+gnKGfo6innKehoKSfrKisrKCpq6agpKimrKOenp6al5qrpqqxo6WonqCclpOPj5KRmZCWlZiXn5ibmpukmZeUlZqdoJ2nqKWgo6Kho5+coKmqpa6upqipoaKqrqqnoaCio6msq6eppqShqaKlqaalpKKmpKijkn59gHV2fW5se2RoVlNkTkpIR09TTktOSDxFQD0yQDg1OTs+Ozk5Ozg6PDs7Ozk5NDg7ODc7Oz48Ojk8Oj07Ozw9OTw8PD49PUE+QEJAPTc6P0FCQEA/ODU1PDpAQ0BEPkFGlq6koqWeo6KpqKipqqWmnp2imJiZmZWbop6bnqOioKOgoZqgmJeXlqGorK62trq5ure3u66ooKGpoarGv8qhUEFynnhPbktLYmV1c2BbXnCPsa+us7Wqpqyso5uZlI2RlZeYmJyfoqKcnaSemqSWlpaUj4huh7q/o2Nnk4eUkY6eo6Kmop2fpp6dn6OmqJ6jpp+qnaqtqq6nqLClo6Smp6ymoaWim5mer6iusqumq6qgm5iYmJWTlpqTlZaalpuXmJihnpycl5uhm56ao6eln6GioqOdm6Gmp6aoraOppZ6kp6mkpaWhpaSsrKmmq6eioKSjpKenoZ+gpaKmoIl8gH53eX1leXlhYlNWYUlJS0xTVUpTUU05PkE2Nz02NTs6PDw5Ozs4Ojw9Ozs4NjU3OjY5Pj0+PDk5PTk9PTw+PTs7PDo+PTw/Pz9APT03Oj5AQEA/Pzg1NT08PkFCRkBAR6CupKaroaOqrK6tp6ypqKCipp6bm56aoJyalZmfn5uen56WlJOXk5KcnqSorq2sq6uvqq+pnpeepZ2jx8ePV1NJZKNdZX5vcl1Qa2NbZF9da4+0sLC4rKahnJ2alJiamZCOkZWRjI6Nk5minJeimJmWlpmIeqTH1tWfT2x/iYCDlJqYm6ujobCjmqOmpqqioaqiqaSosquxsqu5qKarp6urqKysp6Ggo7GusrG0qrKvo5mcnZ6hmJubmpiZm5WWm5aZnKWhoJqjoZqdmZ+kop6gn6KmnZulpqWkpaiip6OepqOinqaloqWlqKykpq2noJ2eoJ6gpaGenqWgppmBe4F8dnZzaIJtZVxTW1pNUktPT1ZNVE1CNz5DNzg9NzY6PDw9Ojw5ODo7PDo7OTc2Oj01OTw7QD03ODs3PTs9PT06Ozw4Pj09QD5BPj4+ODg8P0BAPT83NTg9Pj1BQEZAQUihqqCrq6GkqquwramtqaelpaWkoKGfnqWXl5SYmZ6YnJ2blo+VmZKRnJihnaqip6Cep6Gln5ySm6KanqukjXpVaXJ1dXFidnZYV2NgY2dZWFdlrK6sr6efnqKhl5GUnKCcmZiSk5+coaOanpqWnpmdlpqXj3efytqysmdGZnp4f4OBe4q1r6azrKGtraOvpaSmoamorrWzsr22vrCssa6tqaq0sbCoq6iztbizuK2ytKSgnaWgrKGhoqGgmpmWlqCcm5iloaCeo6Ggn5ucpaCfnZyhqJ+fp6meoaOkoKagnqehn5ymo5+ipaOooKmrpZ+dnZudmqainpyjnqeQgYN/fHh2and1Xm1bUmFJUlZIRlZXS0NNSD1LSThFPDc3Oz49PDo8OTg6Ojs6PDk2Njo8Nzs+PT8+OTc9OT47PEA8OkA6OkA/O0A+QUA9PDk3Oj5APzo+NzU4PT0/QUBEQEJGnKueqamipamorqimqqWmp6aoqqGlpKOmkpOVmJacmpqcmpWTmZuNk5+ZqJ2un6eenKGdnpqZkpiem6KhoKSAboJwYGNYTFtTWk1MUFhSSE1NR5esqqmloJ+akZKUmJiWlpWMiIuOlZ2cnZyelp2YpZ2gmpNwhr2yU4p1eXFlaWplXlBrrLqstLSwt7CutKmmpKWsqbmztbvDvMPBt7u2q66xuLe8r7OwtcG8t76zs7WirKKpqbKpq6inqJqZnpqqp6CZqKCfn6iopaWfnaqiop6bn6igpKetmaCjnp6nnqCmnpycoqGbo6KhnZympaWkn6KZnJukn6CboJyjiYaFfnZybWl3bWhuXVhbQ1dOSkdOR0NHTj0+TD41PDk2Oj0/PDs6Ojg4PDk6Ozs8NTQ6PDg5Pj4/Pjg4Pzk8Oz0/Oz1BPTo/PjxAPj8+Pz08Njs/QT07Pzg1ODw8QERCREFCQ5WqoKapo6mqqKmjoamgpqinrK6lqaWpqZSSl5mUmpqanJiYmZyamJmqoLGit6Swpp+enZ2XmJWZnpuco5+dimJXXmVgV01RRz4+P0NDPz5CUXioramqpqCen6Gjnp+em52clJOVlZ6emJSFnZmfmamirKCSgnuIg3qBkKWHc1pLX1pJQKfBtbm7wMO5vbusrqexrbHCtrjCxsDIysDKv7C5ub24wr64tLvGxL3DvLi0qrOtqrO0r7Ouqq+jnqyot7Kto7CmoaOwsa6wpKWuo6GgmqGmoaSqqpmdoJmao6CmqKGcnqKemaSenpiYo6OhpJ6mmpuipJ6fm5ubnIeGgXx0cmtrdXJxaFdcUUZVSERKUEk/RkI0Rkg5Njw+Nzs8Pjw8Ojo4OTw4OTs4Ozo5Ozw3Oz49Pj02OEA5Ozs9QDw9QDk3PDw7Pj0+PUI+Pjc6QUA+PD45NTg9Oz1DQEFDQkGRqqGlqqelqqimn6KnnKasp7Gyq62jqayVkpWalJecoqGbnqCinJ+psqu7sr+rr6ylnqCgnJyYmp+gmp+flX1gXmVgUUdEPUM/RTw/OTZOf6qzp6SkoqCepaymn5idlZKanpmVjIqGiIZ4bIafoqGpqbSReYyHh5ajpKaIYm5rka6ATES3xL/EyM3QyMvDsre1vrK+xbu+zM3GzMzM0se+v8DCvcfHwrjEysnEwce/urS6u7S7t7C2squ7sq67t8C7uqu4rauquLu1vK6uuKOmo56mpaKjqaaZm5+Zmp2nqqegoaGkmJSjlZSZkZydn6Sep5+en6KdmJmUmJSIhX56cmtkaW94a2ZaXEZMTUVEVE1FQkU3Oj87NTQ5OTc5Pj87PDs7OD48Njo9OTw9OTw9Ojs9Pj4+NztBOj45PT45PT44Nzs6Ojo/Pz1CPj83OkFAPTw9ODY2PDo8QD9BQUE+kqugp66noqulpKKipaGlqquwsq2upKmmlJWWmpaUm6SmnaGqp6KrrLy8v8PBsrK4p6Ghq6qhnJ6hoZ2bmn1zamFXTkU+SVl8cGJCPVyOrqyhmZucnp6Zl5eYk42Pl5eUj42QjIKDgnZycGxvjaSrrbKnc3Z5bmxsgoR7hVlWeYzAp2FuzMTEy9DS1c7Tyb3Av8O7xsXIxdHTzdPQ09PMysHGxsbKyM+/ydHNx8bJxsK9xMG+vr+1vrOtv8DDxMjFyMSvv7myuL3EwsG7vLy1rqenrqigoqmkmpagmpmdqKupo6SknpePm4uQmYmVmJugn6OdnZeempOTi5WPhYF5dXNlYmdyb2dfWlpET01DRlFJRENBNTU1ODlCPTY4OkE+Ozs+PDk+PTc6PTk6PDg8PDw7Pz8+PD0+Qzw7OkA9Ojs6Ojg4ODk7QT48QD8+OTtBQTs7Pjc4Njo7PkI+Q0FAPpOvn6ivpqiro6KloKampKuoq62qrqKqo5Kcl5ebmJuirJ2frqalsarFxszOzb+wwaikqKytqqCdo56bnZZrZl1USURAP0uFnqWahKCyraOenJ+amJeUk5SXkZCQjYiEhImHg4CBgYB5cXFuanaht7WZl29lZlxNVoOAcJB6aG9ftKdsn9PPxM3U1djR183Gx8nMw8XKz8rS19LX0tXW09TIzMfMzcrTzc7TzcbJysvCx8zHycnGv8Ozs8jFy8vMz8fKv76/vcHHxczMycnAw8CusLOonqGqo5qTnpyYnqaprKSlppaXipWFkZSHkpKSmZualpiQm5aQjIaRi4B7cnV2Z2Nnd2plV1hSRE5HQElRQz5CPToyMkE8RTw3ODxCPTs9Pzs7Pj05Oj48Oz44Ojk5Oj86Pj1APkA8Pjs+Ozk9PTw5Njo6Pj08PEA/Pjk6QEE6OT44Ojo6Oz4+PEE/QT6QrKKiqaanqKSfop2qqKOso6OnpqyiqZ+To5iWn56dpK6bn7CrqKyxyc3U18/Gu8esrbO3rK6jnqOinaGdY1NMSkRDP0JSrdG9sq+mnJycoKShnZuUlJWUin15cWxlYmhycHJ7hYqAdXBtcHJtg6yYi5ppV2NYX2RwgG1+j3JPc5uZgMbQ0cLP09bY1dXSy8nO0MvGzdLJ0tXX2dbY09bYzdLKztHMz9HN09DAycjLxMzNzM/QxsfItsDLwNLNzNDHysnAxMPIz83Q0c/NysjNuLe7qJ+lq6efmJ6jnp2qpa2pqKiSlYiQhIyRho2MiJOVmZCWjJiSj4aHjIR9eHN2cGNhZXNjXVJcSktHQUZJSj87QTg+NTU4Njs4Njo8QD07Pjw7OUA7OTo8Ozs8Nz09Ozo+Oz08Pjw/Ojo8Ozs5Oz89OTU7PD48PD0/Pz46O0BCOzk/OTg7PT0+PzxBQEQ8hqugnKegp6Oim6CbqaSlqaCfoaGmn6ifmKSimqmmoqarmqOwsamotdDU19rSx8bLtLXBxbG1qKGlpaCio1tJQEFEQUZQdbGvppqUl5+cmqCgnpudmpWJd2lkYV9gYF9eX19dYWx1c3BvbmtwbnKGjYuOYk9cVFxgUWZeWGVaTWp3eYfV0dDL0M3T19bT1dDP0tPRydPRx9DX19jS2NLX2dTWzM/Pyc3SzM/RwMfEycfPztLR0cjMzcDLzcbUz83PyMXLx8fJzMvU1NHVz9LM08K5xbGlqLWuqJuoq6Wdsqiws6ysk4+TjoiKjoOPi4SQjpmNk4+Zj4+ChYx8enFzdG1hY2ltX1ZRYEpKQ0ZDU04/PD40Mzo9NTI4NTU8PEA8Ozw6OTpAOjg7Oj46PTg+Ojo8QD08OTs9Pzk6Pz07PTw9PTo2PD0/QD08PT0+OjxAQjw6PDc0Oj48P0A9RkFEPYKknKClnqWlo5mcnaSeo6OfnZ+doJqnnpyhqZ+vraqqq52lrreoq7fX1NXZ2dHO0L+8zMm2vq6nqqiho6xnQzg9PkRYgqqon5eVl5manJ+dmJudk31xZWNiX19hX15hYF5hYF9gZW1wcG1qbW9zdH97cWtlVEdJUVBHRT1KUFxfdVtz1dTQyc7M0tbS0dbNz9XV0cXR08rQ1NXWztPR2NfX18zIzsTKz83KzcDKwcnKzs/QzNDOzszP0MjM0dHLzsvDysjKzcvM0tPO1NLR0NDKvci5sK67ubWrtrCtqLits7+7sZqOoJSRjo2IjpCFkY2ZjJGRlY6RgIWJenZvcG9rYWRucGFYXFtJRkZFTVlFO0A9MzM8PDg3ODY1Oz5APTk8PDg8Pjk8QDtAOj04Pzk4Oj88PTg7PkI6Oj08OkE9PTw6Nj08P0A9PDs9Pjg7QEE9Ojw4ODs+PD4+OkVCRT6Bn5mlp6Cgo6eam5+cl56eoZqdmpyappufpKefuLa1taykrK6+tLDA2NLX2tzWzs3Kw9LPwcGxqaytqaSyfEhGQjtWjaGblZOWm56enpyTlpeUiGteXl5hZGJgYGFhYGBgXl9fXVxibXJubXFxcnF3aU9+jWpRWEtXT0tgQEtbUm1idtHSzsbNzM3Uy87SzMrW1tDM0NPLzNDS08rO0dXS1dbKwMrCxs3DycrDzcTGycvLz8vOzdHO1MzHydDNycfLxsfCxsrMztHRx9DPzc7M0MXHwbi5vcTCvcO5srK+sLvDw7WqmKWhmJaRlZWSi5SNmpGUlI+PlYKJhnlxcmttaGBgcWhZWGhWTUdNSVFRQjtEPzs2ODo4Ojs1Nz09QTs6PD05PD05PT06Pjo8ODs9OTtAPD47Pj5BPDk9Pj1CPTs3NzU/PDw/PDw7PDw4O0FAPDo8OTs7Ozw9QTpFQUU+hJ6bqK2epKSqnJ6fmJKXm5+am56ZmaKVoamppcTCwb+7tbKxx8K4ytXW2drb2MzMz8jW1cTCta+0qKCtl3hsb292j5qNjJeVkJORkZWWlZCLe2ViYmJgXV5hY2JgX19gYWFgX11bXWdxcW9wcW1pbnBmfYt6ZmdbSlZdYzxBVkthaXfOzcbExs3K0cfKzc3F0NLPzczUysfKzs/Hxs7Sy9DPxbrEv8bKvcPHyc7Fw8jAx87IxM3LzdDJxcXQycbCxsnFv8HIzczMz8PKzMnHzNDFxci7x8PJycLPwL28v7DByca5vaqwsqelnaKcmJCbkKOZl5mRlZiJj4J4b3Vka2BeZnFhW1dgR0lIR0lNVUc/Sj02NDM1NT09NDg9PT06Oz08OTo7OT89OTw7PDg6PDo6QD1APD09Pjw6Qz48Pz04ODk6QD4/Pjw7Ozs7ODo+Pzw7Ojc5PD49Oz49RkFDPYOgm6qupa6qq5qdoJeUjpedmpmgmpqcm6WysazJzcrIxL68uczMxtDV1dja29jQyc/P0dPIwre7u62ktn5ngoahqZONjZaPhYODg4F9hIR/c19bXl1eYF5gY2RjX11cXl9gYF9bWlxha3JwbW1oZ2lqdoORkn1oaFRXZlBCRVxWV115ysS/wr/Cx8nIyMnHv8TLxcfKzMnEwcrJwcHLz8TLyL+5wbzGyL7Axs/LxMDDu8rHyLvJxsXKwb7Cy8bFxL7Gvr3BxMbMxsW8v8rDxcfSxcHJwMrKx8jG0MPDxsOuxMvHw8q3v7y6s6mspKWYn5iso6Gmm6Ogm5V8d3N1ZmpbYW5tWlxYUkRMR0NHRExERlNANTQzMzVAPTM6PDw7OTw8PDg7PTtBPTo8Ojs3Oz05Oz07PTs6OD4+PEI+Oz88OTk7Pz07QD48Ozk5OTk6Oz06PDo2OTw+PDs+O0NCRD5/pZypsqm0rrCdnp6YnImUm5man6Kfmp2ovri8ys/RzMfCw8bNzs7M1c/V2djZz8vSzc3OyMG1w76ysLZtXnp7nZGKkpaGeoCEhX91eHVycF9aW1xgYGJjZGRlZGBbXF5dXl1fW1laXGFucW1pZmdraGx/kp2Oc2VaW1NBQkVPUlNWkcK3uLu5t8DBwcO9vbi8vrjDycTGwbzGv7e6w8i/wcm7tru7xcO/vMLOw8a+vrXBvsS7vce8w7q1vcbEwsO3wLa2v7+8zcS9trrIu7++zMTCxsPGycfJxtDGwszHssfJw87MwMXCv7yyt7Cyp6ioubClrbCqrayUend4a2VoYGhvZFZeWUpGSkZIS0FGQkZKQTk6NjU4ODUzOzo7PDk8PDs5Ozk6QD46Ojw6Nzo7Nzo7Oz88OjxAPUA/PT8/Oz07O0A8Pj4+Ojk5ODk3ODo8PDw7OTo8Pjs7PjpAQEU+fqygrLWrt7SyoZ6fl5qNlJaan52mop2et8XCxMjO0srKysfNzc7RyNDG1tTV183Kz8XJxcfBusW9rK6nYGN3gJKLiIuEeH+Ghn99g3t0dGNcXF1eX2BiY2JiZGViXVxbXF5cXl1aW1xdZ3Jva2RjaWlrcomikn9mWVFRU05AO0dMcKCzrrKysrKyurS7sLavs66xusG7wMS7v7q0sbq+wLjHuLS8tsHCvbi9xsHDu7Wvs7W7v7TFuLu1rLm9vsC9sbq2sLe6s8a9t6+8v7W3tcW9vsPGwMTGxsfMxb/FxrvHy7/PycfDxcHDt8O9vba5vse/rLW7tbe2jnl0eGdnZWJrbl5WXmBGS0hISkdCREFFRj89OjU2NjYzMzs6Oz06Ozs6Oz44PEE9PDo7ODc5OTk7PDo+Ozk+Pz1APz5CQD1AOjo+Oz89PTk6Ojo4NTY7PT48PDo7OT49OT86PEBAPIi3pauzsby8sa2foJmUlJiXnqujr6qnpMbLzcjFyM3M0MvNyMnIysnKxNDN0s/NxcfBxcG/urjJt6uwmltnb4iOhYiJenh+hYZ2d4F8c2hdXV1dXmBfYGRhXmNlY19eXFteXF1eWltbXV9rb2xmY2ZoZ2p1kY+DbV9TWGRdT0REXZWYo6atqqiqp7KstK+xp62mq7K6ubXCubm5r6q0ubqzwbmvwLG9vLu1u8e5w7atqqiwssC2uL2wsaiys7W7vKuutqeutq68srCquLCuu667uLvAwL66w7/Gw8XAvMbBx8q4xcfFv8fDwrnExsK7xsnMy7O5wr27s4l0dndraWBibGlZV1dbQUxMTUpFQUM/RkE7Ojo5OTY4NTQ6Ojk7PD07Ojs+ODtAPD05Ojc5Pjk7PDo4Ozs6Pj45QT0/QD87Pjo7PDo9PDw4OTg5NzY4PDw9Ozw6Ojs+PTs/Ozs+QDyKwKuouLe5w62zqZ2ZlJaZoZymsLWxt6bFzdLLw8XBxM/GzcHDxr/ExMPDysLJyr/AvMK6s7W1w6+qsZNbaX6SiI6Pe3h9iYV5e4SAd25eXVxcXV9gX19kY2JkY2JgX11aW1paXVpaWlpcY21tZmRkZGZnaniHfm9oXGNsaXFzhJSXj5KdpKqhpqGpqKupr6KlnqmstLWwvLivtq6nrbezs7u3s7yvuLm1srvBssGvpamjq7Gzs6i9qquoq6yutbSmqK6hpLCps6anqK6mqLessbO3urq7sry+vr7Ev7XBwMfIt76/xbfEw7+7v8TCvsTIzMq/v8TAwKmHc3RzamlcYW9kV1ZYUEhaU1NLRkZFPj9AOjc4OTc3NjQzNzo5OTo8Ozs8PDc7PTs7Ozw4OT44PTs8Njo9Oz89N0E+P0A/Ojw8Oj05Ojs6Nzc3ODg3OTw7PDs5Ozo8OTc5Pjw+P0E7jMKvrry3ucSwtrCbmZWcmKqpsLGztb2vxdDPzMPHubnLwcu+u8m2vcO+usq4wcPCtba8trGvtbyuqKuTY22Ig4eLgHp9f354dH58c3dlX11cXF5fYF5fY2NhYmBhX11dXFpYWVtbWFdZXF9lamRiY2FkZGhtendxcWh0f39oa5OakI2GmJukoKCeo6Olpayem5qjpauwr7a2pq+rpqmzq7O5sLW1rba5srC6urG2paCkoKaxqKypuaqlp6eop7OtoKemn5ykpayfn6ekoaGxra2ssrWzs7C1vLa7wcCyur7DwbG5ucKzwL3Atbi7vb68wsfEw8S/v8SghHhxbGJmYGtvYFVZX0hOaE9USEZLRjw9QD06Ozs4MjY1MzY5OTk7OTo6PDo3PD88PDs8ODg8OTs6Ozc4Ojo8OTg+Oj89OTg8Ojs+OTc3NzY3ODg2NjY7Ojo7OTo7PDg1OTw6Pj5AO43Itba9uLrBur22oJ6VnaCmurars7O7s8TPycvCxbi3x8DMv7jKt7vFuLPFuLO/wKy2vLKspq+0raGjkmlyhoWGgHx4dXNvbWppaXBpX2BdXFxcXl9fYWNiYGBhYF5cW1xcWFlYWFhWWFpdXmNiYGNjY2JlZml2eHRvfIN8UmeNlYqKgJSZnKKZnJ2ho6GlnJmhmp2prqywtKKoqKmrq6S0uKy2r6yytK6zta+wqp+en6SisqSmqritoqamoKitqpmfn56ZnZ+lmpmjnJyesKmsqKqrrK2wsrivuLm6sLa8u7qrs7K5s720t7KxtbS/tb3AvcPCu7u9l4R7c2xfZV5kZFhUV15JV11LUEdKSkdBPD8/QTs/PDA1NjM1Ojs5Ozg5OTw8Nz4/Oz07Ozg4PDg5ODw3ODo7Ozo7Pzo9Ozc4PDo9PDc0Nzc2NzU3NDY2Ozc5Ojs6ODo5ODo7OTo8PzuJyba4vru4wcHBtKSkmZqkpsCyr7astLfFz8jIwMa7u8PDz765yLi4v7eywrSxu7usurqxop+pq6eYnpBtfoWGf3hybW9ta2JeYmZmXV1eXV1dXF1fYGFiY2NiYV9cW1taWllYV1dXV1dYV1pdYWJjY2JiY2RkbXpybnd+Zz1ljJKGioKRmZqim5eaoaSgopqdn5mXrKysrbCgpKGsqqahtK+wsayor7KnurOmtaCin5yjoq2joqq2qqKjpp6mpqOWmJ2XmZqdoJqXnZydnK2hrKijpKatq7KzqrWwsquyubWvqq+ysrO3s6+pra6xt7G6trq9v7ezsZSGenZmX2ZfW1lWU1pVS1tRTEpFSEtJQz0/QkJAQToyNDUyNDk5ODk7OTo9PDY9Pzs8Pjs3Ozs3Nzc+Njo+Ozo4Oj07PD06Ozw6PTs4Nzk3NDY1NTQ2Nzg1Ojo4Ojk5PDg3Ojg5PkA6gci9uL2/tr68v7KdpaOYpbHDtba9rbS4wszIxr/FtsHAx863wMO9s7m5ssC2sbm7rbK1r5+apKqglJuQeH+DhH94b3F0cWhlZGhkY1xcW1tdXVxbXmBhXl9fYF5cW1pcWllYVldXVlhXWFdVV2BiY2FhYmBgZGZycGtye1A5W32NhoyFjJiWmpmSnJ2moZydpZuamKmkra6pmqGhtqign62otammp62wpLewo7ego5yZmaqmoZqtua+joaScoqCfk5WhlJaWnJmYlpeclZ+pnqqkop2jqqqwrai0rKqmrbKwpauts7GvsK+vp6insq2xtLC7tLq3rqOUgnp3ZV9hV1lYU1JUS01eTFBMR0hNTEU9QD49Qjw7NzY1MzQ5ODg5OTo5Pjo4Pj47PTw8Nz49Njc2PTc7PTs5Nzk7Ozw+OTk6Ozo4Njc2NTQ1MzEwNDU2Nzk6ODo5Ojo3Ojs5OT1AOnbAvLS6wrG+t72tnaenoqq7wL3Aua60uMHMyMXCw73FuMjMssHCwa68u7W7vLW5ubCwsaqcmqGqlZGKi4CAfHdxaWxydHBoaGVkZmFcXFpZWlxcXF1eXVxbXF5cW1tZW1taWFZXV1ZXWFdXVlVaYmJgYGFfX2BiZ3Bpbm45LjBMgImNh4qTmJaakZuao6KgpKSdm52knamtpJ6gobWmoKCip7Khpaelr6Wxrau1nqCdlZWpoaKUrbGxn6Kjnp6Zm5OLoJORk5iYkpeYmJeep5unoaKapKWlq6SlsKeloqusraaprq+vq6iqqrOmpquvtLGuvLaxsK+fknt4c2ViXFtdWE5MUUhSYU1WUE9KTk9FQkQ/OT02OTo3NjQ1OTk7OTg4Nzs4OT0+Oz47PDY5Ozc7Njs3Ozs6ODU6Ozo7OzY8Ozg4NDc3NjMzMjEuLzI1NTY7Ojg7Nzg3Njw7Ojs7QTh4u7uxtr2wvLG3rJ6lpqy4u7zBxbqyubXEycnAwsbFx7bGxLPBv8Wrt7e9tr26u7WyrK2omZmgpIyKdImIfnZuY2FmaWhmZ2lmaWxgXVxbWlpaWlxdXFtcXl9cWllbWVlaW1dVWFdUVFZWUlRSVF9fXV5fXF1dYGFoa2thLh8rTHWEioWIjpqTmpGXm6GeqaKhoaGioJqnqKKYnKKwqaCgnKSpnaeinqysqqmtraKhoZWYopqcj6uosJyfop+el5mTip2RjZKTlZCYmJOcoaOcpKGilaCipKWbo6uloqSqpKutpa2yqaalpqa1pqmorbO1tLm6r6usnoxzcXBhW1dWVlJHUU9IWlxPUkpUS1NMRUdKQzg7Oz08OTY2Nzo5Ozo5NzY5Nzc6Ozo9PDw2Ozw4PjU5ODo4ODY1OTo7PDk3Pzw5Njc4NDUyMTIxLi4xNDI2Ojg2OTg1OTg5ODk7OUA5e7W0rLS7srCrsa2dqKevubmzwMi6tcCvxcjMusHJzMi1yb2xvsPJrbG4wbW8wLy0taqsppaanJyJgXKIg3t0aWlqbGdqbG1ramxlXVxcW1tcWlhaXVtbXmBgXFhYWllYV1hXVFZWVVRVVVJSTlBYXFpbXFxcXVxfYmlqYj0rPUxugIeDh4iSk5uVlZqkpKakqKSnpKCWo6uik5ejraefm5ian56umZyqs5+lpp+jo6GUlJuWlpKpqa2anJ+hoJuUkIyZjYuRjZKNlpWQnaGgo52co5WboaOhmKKoo6Koq6Crr6OtuKWjpKKsraqoq6+0t7K9tbOrrpiFdXRpXFlZU1VSRlhMUVtYTVVPUExRUklPSUI9Pz9BPz03NTc5OTw8OTc3Ojc5Ojs8PT47Nzs6Oj02ODo7ODk3Njk4OTo2Oj05OTU3NzU3MTE0MS0rLzQzNDk4ODo6ODo6NzQ4PTg/OX6zraeztq6oqK+um6morLe2rLzKu7a/rMzGxbjAzs/Hs8S7t7vCyLGtuL+3vL67s7amqaCWmJmXiHp0gHZ3bm1obW1tcGdnaWZkXVpbW1tbXFtZWltcXF5fX1xYWFlYV1hXVlVUU1VWVVVTU05QUFhZWVlcW1pbXV5jbnNTRFBbYHyCfYmGjpCZmJSZpqSiqqilraGllpypnZOToqelnJePjpmdrZaYp6qYn52UpaCekpGSkZOVqKqlmpiZnp6XjoyLk4WIjYOPi5GVkaCeoaSZlp+VmqGinpSbpaWoqKigsLCmsb2nn6OstKqup6+0sLm1wLGusKuRf3N0YldUVU5SSkdWUFJSTExYTktMT1NHTktBQ0ZEQz5CNzU4ODk7OTo3Ojo3PD06O0A+Ojk7OTo/NzU5Ojk4NzY5NTg3Nzk7ODU1NzY2NjEzMjAtKi4xMDI4Nzc7OTk7ODk0ODs4QDh/tKymsbeqpaKxq52qp6mysKS2xrS5urPKxbm6wcvQyrG2uLy9wMOxsLG3rrS0u7O0o6OdnZiXlYSAdmtnbG5xbnFqb2tkZWdlXlpZWllaWlpaWlpaXFxdXFpYWFhZWVdYV1VVVFJTVVNWVFFNTk1SV1hZWFhXWltbYGppZm5fblxqf3iIf4qKkJORl6OWmqWjoqibpJWdopmQjJ2hmZaWhYSRmqOPlaOclZaVh6Kam5OMjoqQmqWnm5WVl5yRk4iUjouBi42AkIuSkpKhmqCilpSZmJWippqNmaWnqKehoLSyqLO4oZ2jtqyqraSysqa1vLSrrLGiinp0bl5OUVFNT0ROTk5QS0ZOTkpKTk5RSE1KQUhMSUhEPzk1ODg4OTo7Njk6Njg7OTk+PDg6Pjk7Pzg3ODk6ODg1ODU3Njg4OTc0NTc3ODIwMzAxKyktLzEyODc2Ojk5OTk4NDk4OEE3d7anpLawpKekqqWgqaaks6qissS1tbKzxsW3usPKzMazrLq9tLjAr62psJ6mrruvraCam56VlYh8hG5fX2ZycHVxaW5pZWdoal9YWFhYWFlZWVpaWVtbXFxZWFhXWVlYVVZSUlNQUVRRU1VRTk1LS1NXV1ZXV1dXWlxhZVlfXGxfXnhvg3qEgIuJi5abipWXn56glqOTnpmTioSXmYtzjIJ9jZaVhZKZkJOOjXuZj5yMgomAipigo56Qk5iWhY6ClH5+c4qOepCHk5CQnZuampKWkJ6OoqOOiZqgoaOkm6K0r6yvrZ+YprimpbChsa6csbuqqa+pmYR4dGRWTVJQUE1DU05MUE1CUFFISU5TTklKSkVLTUdLSz44NDk4ODg7OzY5Ozc6PDk6Ojs3OT85PkA3OTo8ODk3NjQ0NDU4NzQzMTI0ODUvMDEwMikoLC0wMjc2NDc4OTo6NjU6ODdBN3i3oaO0qKalqKOmpaamprKnprTBuK+0sMnEuLnAzsa+s627waytxK2noaaSnaa3raOgkZaXkpB+eH9mV1ZfZ2ZpZ2huY2lpZmJcWFdYWFhZWVlZWVlaW1tbWVlZVldXV1NUUE5PTk9PUFNUUU1NSkdOU1NTVFRTVVhaXGhYWldpbWVkRU9piHmNfoWVkIaOjJuVmpSVlJGMlIh+koheO1Zue4qTiYCMkYyPhoZyi4SWgXmBe4aUnZWDlo6Qj4OGfZN4cW+GjX6JgZCOkJiamZOLkIqdiJ+YiIiWnpqhoJenrqmtqamelq2zoqWtma2rmKi0o6mtopN/dG5gW05TUldMRFRKUExMRk5PSUVMUU1LUEpJTlBHSko9NzU5OTk5OTo3Ojs6Pj44Oj09Nzo/OD4/NTg5Ozc5Njc1MzMzNzYwLi0vMzQ0MTEwLy8oKSsrLTM4NTQ3Nzk8Ojc5Ozg2QTl5t6CiraGmpqqgp6mno6qwqKe0wrmwtbDHwrizvc+/ua+utcKnqsSqop2Yg5ScsaOamYeUkIuHfnN2XVBMUVVZWlddXmJnY19ZV1dXWFhYWVpZWFlYWVpaWllYWFZXV1VTUk5MS0hHYlxNTlFNS0hGSE5RUUxPUlRVV1lgYFRSYm5jRTg3eY2Jh3WAjYaAhYiWiZSViZGFg5KEd4d+X0lQbXeKkYN9hIyKhH9/bX5/k3d1dniEjZpwUY2IioZ8fnmUdmd3hoh+ioiVi46Rk5eMhIqJlYSbjYKEkpuWnp2UpKOoqaWlnpuwqqGkpJGmqpaiqpyhpqeKd25mXlxIUVFTTUlVTVNJTEtPSUhGSk5MTVVLUVJQR0pEPTc2OTo4Ojs7ODo7OD4/OTk+PTg7PDY7OzQ3ODs2Nzc1MzQ0Njk2LzMvLjEyNTIyMS8sJykrKiw0ODMzOTg5Ojk5Ojo6Oj85d7aboqedn6Guoaeopaenr6yqtby2uLezwbu2p7nIuLaoqLW2qrK8p56Vjn+KlKmWlYt/joSDfnhxb1hNS01OT0xNUVdbXFpYWlVVVlZWV1lZWFhZWFhZWVlaWFhWVldVU1BNSkVAQJtrc3NJTUtERENJTk9oWU5RU1NVWmZcVGBnV1hQSoh8jIBsd397d3+Hjn6PmYuOeIONfnN+d3FtdHB0jY2Aen6JqoR6e2h2e45wcm14gYuNknh7gHuAd3NyknhodYWEhIV8lYuIio2LgH+Ei42AlIR8gI+YlJyWkZ+dqZ6goZ2gqaWfnZiNp6SSoKCWnp6kgnNpYl1dSldQUkhLWFJPSk1MUkpKSkxQSExRTFJVTkZJQj03ODs5OT49Ojs8OThAPzo6Pj03PT03OTkzNzc4NTY3NTI1MTQ3Mi8yLiwvLzIwMC8tKygoKS4xMjcyMTk4Nzo4Nzc1Ojw7N3aumaOhmJyftKmvqqWtq7Cxqr20sru4trq0sZ+3urKqnZ2sqaiyr6KakY2UgY6cjpF/d4Z4fHZwb2pZS0hJSEdFSEhQVFRUV1dTVVVVVVZXWFdYWFhYWFhYWVlXV1VWVVNQS0Y+OTNOPH6eTUhKREA9QURqlH5MTlFRU1ZeYl5cYVVlfo2SiYpzYHJ5cHN5g4t4gJiSfm6EjXp0eW5qfa18dJCKfnqGkoB8f3RmdXyGbG9oc3yKjYiAbXpxfXFtdo9xaHGBfo5wRIuFgoOFf3d4eoyGfYx7dX2Oko+Yi5Kbm6OWmZ2bnZ6hnJaNi6Wbjp2XjpaYkHlvbmdjW1hYVVFKU1VUT1BOUFZLTktPT0pRT0lPUExGRD07Nzk7Ojo/PTk8Ojk5Pz87ODs9Nzw5OTk5MjY2ODU2NjMzNjExMjI0LiwsLS0uLTAtKyonJyouMTM2Mi84NzY5NjY1Mjc5OTV5ppegnpagprCsrqunqbCvsau7uKu6vrizrKebsKesm4+WnKWppKGYmo6EknqJj4uLdnF8bXVxam1qWEtGR0VBQENESExMTVFRT1FTVFRUVVZWV1dYV1hZWVlZWVlWVlRTUUtENzhmNzA/qGlOSEM9OzpEioV6WUpOT1FUWFxcW1dWd5ebu3prb1tzcGh2c4KLdXiIg2xpiY92cndoaH6BcZaRioB9lX9JkpluZ3d+gm1qZGx5hZCShmtzbHxucnyGaW1wf3ONiYWGe31+e3dwdXSGgnmBeXB8jouKk4OWlpiakJOWlpmWnZaMg4mfkouSjYaQloBvam9vb1lWWFRSUllPUlVUU1hVTU9ITUtNT0tDSU5HRkA6OTk7OTk6Pjw5PDs6Oj0+Ojg6PDk/ODY4NzI3NTY1NTQxNDMyLzAyNCorKiotListKigqKCcsLTEyNTAsNTU2NzQ4NUhBODk1d5mRm5ian6Ssr6Ktqqi1r66ss7+rvMK/pqKalaSYno2Ei5ShopiZkZOLc456gIaMhnVvdGxxbWVra1lOREZDQDw+PkJGRkdLS0tMT1JSUlRUVFRWVldXWFlaWVlaV1ZUU1BMRTFAmjMganNDmW87PDk1PICChl9KTU5PUlZaUVZSUJh6V5BfaG9ddmlneXSFhHF9g4FxapaPcnF6aGicjkx5hJGIhI1mMXaHcmt9fYN0ZmV1foSEhYBmaWx1a3CAfGhxcXxuk42Pe3R9fXFxb3Ztg393eXVqeYiCiImDlpKSkIuNkZSUjpeNgHmIl4iHioaAkIh4bGtwaGVYUltYWVlbTlBVVllYTklIRUpKSEdCQEdFQ0c9OTk4Ozk6OTw6OTs6OjpAPDk6PDk4Pjc4NzcxNTIzNDUzMzY0NTAzMS4qKispLCwrKykoKycpLCwyMjYsLDQ3NzU0NzhpTzg7NW2SiJqQmZakqK2esZ6nuq+rsrDCsbvDx5qWjpWZi46FeoSQmJWNkYyQh3GHgnSHjIZ6cHNxb3BkcGdfVEZJQz88Ozk6P0BBRENFR0lLT1FRUVFSU1RVVlZYWlpZWFZVVFNQS0U4MC9cYLNHOVhQOzk0NDGWuotITE1PT1FVS0FIUEZdpamXZnFuZHVma3x7f3x2f4KCdm+ckXF3fnFzkoY1cZynnI2goYSihXZwhnuGfHOMrY2JgWhnYmpucm1wg3Vpb1h1cI6bkXZtf3t9bnJucIB7c3ZuYnWDf4aAhZCQioqJkYuRi4uOg3V4io6AfoOAfY58dHJxbWBcXV5cWllhX1JOW1pYV0xISUZJSD9DQUJIP0NEPTs6Nz07Ojs7OTo5OTs6Pzw4OD06ODs2NjY1MDEyMTI1MzQ3NDUzMS4vLCwrKSopKSoqKikoKikrLzNETTIxNjY2NDM8dlI3PTdikYGSh5WRnaSnnq+VpbSprbGuwbK7wcWWj4yUj4CIfG6BkJKJg4qHj4V1g4NslYiIfHV4eG14bndkal5JUEc+Pzc0NDg7Ojs9PkBCRUhLTExMTlBRUlRVVldYWlhWVVRTUExFPDUqnUtbQC1nSTk0Lz+Sg6muX0dMTU1QTDdDTVBRQkZ7aXRycm12ZnCBgXZ4f357iHpznpZ3fIR/g5iDmpxghamenIuDkI56dod+iYiOc4qXj4R7XWRxdHp8d4ptaGpieW+FkIJ6b4F4dYV6cHR6eGtuaV12hn2HfIeGjn+KkpeDjYWMhn1xhH+EfXZ3e3yJeHF0dWdoYFtcXlNcZ15XUFRYW1VHSkpFTEc/RkBERD9BQT07OTc8Ozs9PDo6OTk7Oz0+Nzk+OTk4NTY1NDI0NDAwNDY0NTU1NC0sKSsoJycnJigoKSkoKCsrKy8wMFVxPTIzMzMxRX5XND05XIx4in+TjJGcnZ6mkaCroLGor8Cyu8W6lo6Rk4d6hnZrf4uRg32Kg46MeIOAc6CEin19gX9wgX56aHdrUlhMQEUyMTEyNzY2ODg6PD5BRUZGR0lLTU9RUlNUVVdWVlZUU1BNRkA6Mj0gI5ZjjFs1MzExaT9Hb0lGSUtNTlFLSlNaVk5GX3d9cX9xdGp1iIV1d4SCepGDdJ2WhoSMkJOkjKypSIasr66KgYCUioGKgYSRqYeBmJiKnHRtfIGGh36OaGdoeX9uhYeChXGEhkdtgHdyeXZobWtfdn2CiH+HhIt5lJybiYqIkX96dYp2fHhtb3d+gXV1c21cXl5cY2RYZ2ZcVVBQV1lQRExLRk9JQ0ZDQ0FAQ0E9OTc4Ojo6Ozs6ODg4Ojo/PjY7Pjc1ODU3NzMzNDQyMzY2NTY3Nzg7REZMTU1MQzcrIiUnKykrKywvMDArbnUyMjQyMEyBXDU9PF6EdHx9iYSHkY6Vl5KWoJ2soKa4r7O9s5eNkouYi310cH6Jkn59jIOSlH2Gfoakh4h/goiFeIeJfnOEeF9jV0tCNjAuLzIzMTI0NjY4Oj0+P0JFR0hKTE5RU1RVVFRWVVNRT0dDPzgwLCOHWz8/ODQuXZZwc6NVRklLTE1PV19WaVdYWmF/h3uKeHx5fYqMeYCEjHyVkn+dnpWSmZmkrJKZu7GmusfDp4uMoaWOk4mBkXxxg56fkZ1/d4WFio+HkGlocISBdIyGhIpyhoJ3h4B7doR8bXZ1Zn+UjoaIiIaHh6CqopaIjpd/eoGIenlvZ2t4fnyAdWxmXlpbXmpeYWdgWlBMTldSUUlQSkROR0NKRENARERCPDo4Nz08Ojw6ODg3Nzg6PT04PD02ODY1NjYyMzQ0NDU3Njg2NzxCQj88ODo+Q1FeZVxHMicmLCwtLS4xKD+LWy4zMTBPg180PztudW9md4J6f4x/gZCOipqapJyhrKaqrrCXkZGEoZSEeHd/jJR8f5KGkpV/ioCSm46EgIGMioKJjYN/in9scGpdQkE0Li0vLy4uMDIyMzQ3Nzg7PT9CREhJTlFSVFJTU1RSUE9IRUI8ODcvOUM+PDw2My5sk5dNUEhKTEtKTVVfXndjYmdsj4+Cj4iLg4aIk4ONi5mHnJyPn6aioamSp7Shp8HCrceveLmUmnyNoZ6YhJOFgo6hn5SZkYWKhY+akZZscHWKjIKVjI2Od4+EcW2FgYqWkYKFiHKIoJWGkYmNj5aktKibjJSigoeSg31/a2pqfIKDg3VjXmVgW2hsXW1sX1dLSE5SUE5MTEZJUENETkZCQ0VGQz46OTY9PDo7Ojk4Nzc2Nzs6Nj06Nzg1NDU2MzQ0NTY2NjY4NTU2MzEwLiosLCkoKS46UGFcQCwoLSsrMCwncog3MjQwT4RiM0A8dW5nWW+Cb3WGcHaRhn6XlpqUnp6cp6CplpOYnmdlpJp+hJKReYCSiJGSfYqEmJKQg4CAi4yJhpCHhImGeHh/Z01SPi8vLiwvLi0vMDAwMjEyNTY3Oj9DRU5PUlRQUFFTUU5QSUVEPjs8OkRGPz48NzUyPD9SNUhISExLTU5RXWmBd216dZKQjpybmZKZkJyQl5qkmqOmnKWop6izlqq9qrTGyLbI0M++m6Bwaaqpn4STkoWcoJqbmaaRkYiVo5uad3p+lJiToZOXl4GUnnt3lZKqsoiMlp58k52bjZGVmKOhpbWvnJGYp4aWj42AiGxzc32BfnNqYl5iYGJoZWBnZ1xSRUpLUE9JSkxGR01DSExGRkNCR0VCOzg1PDw4OTk5NzU2NTg+NzU9ODQ3NDU3NTQ1MzY5NTg6NjE2ODYzLzAuLSosLy4tJyMqO1hiQigqLDEtKEuXXjA2M1GFZjJBQGlhXlBwdGBtfGF3jX17k46Oip+Sl56Wm6qYnqpCRH2HiYeYjXiCjYuOjXyKho+QjoGCgImLioWShYOGiYGAh3ZeYlA1NjAtMS8sLjAvLi8uLjAwMTU+QUFNUFJTUVJTVFJOU0xFRUA8Pj1GR0BBQDg2NjI8OTtGSEdJSU1OUFlpfolyjIKVm52qtLCdp6Wno6Swp62yrq6quK+xvJuxw6q4ycu3w7+3paKws6ysqqOLlpiEpaago5eBppmNoqqopYiFlKShoaqgpKmPm7CLlaOmt7qboKKvkqKcoZ2PoqGrrquytKGUpKmHmYiSiZV5en6GgWliaV1mY19kZF9nZ19bT0NJSFNORkhLRkpHRkZIQUtGQ0ZGQjs4Nz08ODg6OTc0NjU4PDU0PDc2OjQ0NjQ0NzM5PDM4PDIwMjU1MS8xLi0qKi8sLSooKiYlNVhYLywwLCwwhIE4NzFQhWg1QUNbWFRMaGJXaW5YeYR2gZOFh4Kcg5GQjJLayJ2Wc1aXiI+InI98hoyOiop6h4KHkY6DhIGLhYaIkoaChYmHiIeHcW5hQEU2NDwyLzExMC0sKy0wLi40PkNBTVVQUlNVVVZVTltQR0hEPD4+RkhDREE3Ozw1Qzs9RktJRkhRTlBXfYuYf6WbpqCnt8C8pa7As6ivvK+0urK8sr+0ubmit8SntcjHtb24tKijs62wsZuZkpqfiKevq6WUdp+kl6GssrSZlqquqK+2urK6rK+1orGrsbW7trSttJ+mp6KmmaivrLG4t7enmrWoi6SNkJKehniChXhbY2ZXZ2NiZGFhZ2FbVEpERExUUEhJSURJR0VBQEBLREJNRz04Njc7PDk3Ojk4NjU1NTcxMTw4ODk1NDY2NDk3Pj0zODkxLjAxMjExMzAsKiwuLCsrKyooJyopRVowMCovK2iSTzYwUodqNkFGV1FKTFtZUWJiV3l1cYGTfYSGk3WFf4CMe7+7o7yCtJSTjZuPhIiPkomJeYaAjJOMh4SBjn+BiY+Gf4aIhoqHkXt4bl1XQEROPDY6NDZBQjc2NDAvNkNIQ1FbT1FVV1VcV1BfVUlLS0E/PkdLRkVEOz5AN0Q3P0JKSkVGVlNPXoqdp56rrLirr7jFxLG3wbqwsL60tb6xvK61c6+ypLnEo6/GuLCzsbOnpLW2qrCgopabopKlsK6mraunpJihrbS7oqiyurW8v8y/xcW9vbPBt7q3vra6t7irq7Ckr6isva+8usHBq5i5p5StjpeXqYh9g35tWGVjWWxma2ZXXGRZVlNJR0ZMUEdDSElBSEQ+P0JCTEA/TUQ5OTY2OTo/Njo5OTY2MjQ2LzE5NTk5MzY0NjI3Oz0/NjoxLi81ODo5NjUwKigsLS0tLCwqKCgrKyhFUy8qMDBKj2s1MlCHbTY/RlJMQUxRVlNZVVp2anB+jYSAjoVuenN4h2K5oZmjiZSUlpKUk42Pl5KHh3uGgY2VioCEgYp6fIqHhn2Kg4KLhJZ9eHp1ZlBcZEdFTDtRY2FbXlNHPztIUERaY1FRWVhaZ1lUYF9MUk9EQT9JSkhFRUFAQzxFNkI+SEdKTFNaVF2PqLGvtbLBt7O3xcm3ub+6tbO5uLW8sriwxF9zsKSxmp2qvKikqKuqo6KytaGqqJ+Vlp6YoK6lp6aln6SUo6ixtKiys722wr7TycnTxsLFzMLKw8C9vL67u7a0r7i2tsK5xb3Cx6+euKmhq42kp7WIgYF0YWRjX1ljYGpnU1hhVlJVSUVFTUpAPkdEPUtBPUJAPUY+O0hANzk2Mzc5PjQ4OTo1NzA0NS8yNjM4OTM3NDQyNj84QD5HS1JUU1FQT1FRUEpBOS8sLCwqKygoLC0rL1A+KC40OIB9PDJLiHE5PkNLRUBJTVBSS1FdZ2xrcI+NhZBza3Jyc4fVwLWZoI2VmJmRjpeRlpaOhod9hoOMlop+g4CCeHuLg4d7i3qBioKXfnR9emxlcHVZXlxQZWRiYGVkXVxYV1xNZG1VUm1tX25fWGdkVFlVSkRCS0tJRkhISEdCSTpEP0hLU1RVXFpbkLS7tLmxwbq1tcfIt7S4tLe4sbWzsq20tZhjdKecrXBeoqybl6Cim6SeqqWUn5+Qk46VmJionqafnpqZg6SdraWqsK24sL251NHP19DKzNLMz83Kxr++wcm8wLzAwMTExMm+x82yo7qwtK6aq7e7mIB8bl9iXltgY1pkY1FcYFNRSkNBRUZFPEBGP0FIQj9DPDpFPj1KPzQ3NTM1Oz00Njg5NzcwMjIvMjQxNjk3NzU1NTVEM0VMTT41MS8wMDY6NDc3QElPSTstJioqKC0uLyxATSsvNTRtiUkwSIl0Pz5CREBDREZLT0RRW1lpX2+WkpCUbmtvdHWHtKyhoZ+LmZyZjI2VkZuShYqKfoiGjJCLiHyBg3N8ioOFe4l0gYqGlX9ze3lsbXV7aHJlaWxpZmpqaWBmaWlsWm1zlq2kvIiGZ1xvZ11ZWVRIS05QSktQS1NRSUxBSkZKT19eYWZpYJazwq21r7e5sq/CxLOut6+vuaqxsKWqtquLtaecmqaaTZmdjI6flpGmmKWVipOTiZCJj5GRnZuhl5qVloefmqebrK+psKi0tNTU1NbTzNDT1c3Sz8zEwcnQvcnJysnRxszNws/Rt6/DvMO5pLW5waKEcWVeX19aYllaZ1pRXVhOUEFCSEVCSDtAQz5BRz8/QTc7Qz5ASD00NjY1NTs6Njg3NjU0LzEwMTQ2Mjc4ODc1MzY3QzVCOD8tMC0xMzQ5PTk3LC4sMTtGSz0pLCguMDAwN0s/LTQ2VIhXMESHd0M7Qj5FQkFDSk0/VVlSZVZyj5CYgmdxb3h5g6GqnqaXjJqbl4uNlZGajn2Ji4WNioqKkId8hIJwf4eBhnuHcoOSi459cXh2bHB4fnF6bXhzbWmBcW1jam1weGl3fH7LvsHfp21jeG5jW2FgSlBSVU5ZXk9dXE5QTlRQVFRcbm12gnGVrLWpsaSts6irur6vqbOlo7elqq2gq7OijbCtmZeYjI6RkYSOm4GNppGciYOLhIuJhIuElJaYl5SbkZyXmZqfn6uspaiirK3P0tXSzszT1NTP1NHOx8PU0cbN0tPT1szR0cTR1sXAzsfHwqi9ts6efHFoYGRfWGFUX1tQUVRRT0g+QEZBQkU8QEE+REM+Pz86PT08PEpBNDU0NjU8ODg4NjY0NDEyLzAzNTI2NzY4NTMzOz08RT1AMTErLzI0OT41OTAxMDIyLTJETjMpLzMuMzI9TjIzOEN9XzJBhnREOj09ST5AQ0ZIPFVRTU5adIaFindsd3B9fn+hnp6hjIyYk5OLjJOPlYV5hY+QjYuJiJCGfoJ7cX6AgYd6hHWFk5CIf292c2xzfXt3e3OCeHJrgXNyaXBxenlyer7Lmn2LsYR2coR2Z2FqXUNaWVtWZWNYY2pTWFxdYGNdY3d6fYuBl6ijo5+dn6akqa63qaWyoaGsoKKtoaaxnoimmpOSkYmOjYiBk4hqlaKMmYSBhn6Rg4OTl62LlY2UmY6GkpGel6iwoqGhpaSpyc3PyMPM0dXS1NLO083G1tLM1NjW1tjU19XJ1NrNyNfX0cqrwsLLjXVxZWJhWlZbVF1RS0dKSkpAOzo7REFEPEJDPkdCPkJCOjw5PDpHQjQ2NTQ0PDU2ODc1NDMyNTAvMjU0Njc0NTU0NDw+PUU/QTYyLy0xNjs9MDgxLzI1NC8tLTtSMDE3LzUzMkZEMjg+bmI1PYF0TTk5QEk8QUQ/QTtPTEZKWHCAdX1ocnhygoqAnZWdlIWLlYmOiYiNho5/eIOTmIqMiIiLiH6CeHN7fYKId396hpGVgINud3Btdn92eHx0hnx6bYd2dG99doR1eHudtYw7QYrFpX6MfGllV0lDZmNlY2dqY213W15maGtuaG2AgoeRipydn5yQlpedoqOksKOjsZ6hpJyfqJ+isZuFnZGRkpCKioqGg4+Dfpybi42ChIV5lH+CqZWjjZKKl5KMfpiLmpKrs5ibnKicp77Dxrm3x87S0dLQzNLLyNTO0NXa19fY1NnYzdjbzsnZ2tHVvsrLtXp5cGdfW1RXU1xYRkdLSUVFPTo3OkBAQjlHRD9EQ0FDQjs/Ozs3REM3NTY1NTswNjg5NDQzMzQxMDE0NTU4NzQ0NDQ5QD5EQkM8MzMuNkZUV09RSkFKRj8xKiguQlMzOTI1NC83Szc1PGBiQTxzdlY4N0FIOj9DPjw5UUVDSlRrbm5wYnBxdIaNfZeRnYt+h5KDiYaEiYGHfHiFlpaJjoKHhYd6hHlxenuDhXV5hY6NnHmLcHxwcHqAcXuAcYOHgW6OenV3fHyCdX58hoevc1ipwraNkYJwbWI9XmhycHFwbnh2gWVob3J1eHF5i4aNk5GalZ+UhouSmp+anKieoKuaoZmYnaSdn6uZipmLj5GNhHuHh4OEi42fmZOIg4d+bJl6hJmGiJOMjZSMhnyciZSQrqqUlpifmaevtr2prr7HzMnKzMvQycPSytTX2dfY19Xb19PZ29XQ2trR1sjUypZ8fmtrXVxRVVRhSkNGSkg+QT49Nzo9Pzs9Rzw/QUFBREE+Pzo4N0RCNzU1NDc5LjU1NjQzNTUzMjMyMzY0NzU1MzQ1OEVCRENFQjU2PEZOU01bbmZjbnNrYVY+LDRMRzg2NTQzNEJGND1XX2hMdXheODs/Rjw8Qjw5OUQ+Q0dSal5tZGJma3aAiHGRkJqAeoCNfoKBgYR+g3t8hJiNh4t9hYeAd4J5b3t7hoF0eZKejqB2j3WCdHWBfnSAg2+BkIJvkoR1fIGFenaGe4m3xaTBybmBlpuPd3BlT2ZjgXqBd4aikIp4eXZ7g397hHZtk5aTlI6XkIKJjpWZlpWkm5aelZ2SkZainZiqlZCQiYyRgouDiIiBhY+RnZqZiIWLgYWXeoiJn5eQiI2Ji4J9oYmRjLyhmJOYmZ2ppqaun6i2v8DBucjKzs7EzcrR1tXV2dXX29TX2drb19va2djO28aIfXxqbGhiVllXWE5MRU5DOz09PDg6Oz05PUA2PT8/PD49PTk4NjdDQTY0NTU9ODA2NjU1NDc3NDU2MTM5NTU1NjQ1NTdISD1ESkU3OTI1O0g+Ozk6N0lQXVtSVVhLOVQ+Ozk1MzI3STg9TllNSHh4ZDU9PkM9PUA6Njo+PkBFUV9YZWFdW2h0enlsio2Sd3Z6int+f36AfIR6fYGRiYSFeoSHe3V9dG18fYZ/c36SnpGegpB7hn54j355iopugpqAdJmGfYGJhXx+kHqPqY6Pw6G9jJyjnX2JhH2JcouKfnOmmpyYk4V7jpCIhGhHcaCknYyLkJGEiIqQkpSNnJmSk4+VjIuUnpuTn5SQjY2Pin6OjY2Kg4iSlpmenoiLlJGdkYGKf6WYiISNgYWEgaWGioy3mJ2RlZaip6Genp2kr7e6tazAxsrQyMfMz9PT0tjT1dfA19jZ29ja2tnZ19u4e3x7bmxoWmJdVFFPSURMQjw8Pjk5Ozo5OTs8Nj89Pjw9OTk7OzM3RD83Mzc4PjcwNjg4MzU3PDM3ODA0OTc2NzU1NTQ2RlA1RE5JODkzOEFLPTszQ0BJPDpEV048TVRITj85NjMzMz5DO1tYPjVZeXBaPDxBPD0+ODY4OT89Q1FTUlheVVhmbW1taYGOinFyeYp7en98f3uHenx7i4aCfXSDhXlyeXNtgH6EfneFnKGbnZSRf4yIgJiIgJySb4iohXqhi3yRjYOIhJx9mpCJjKOjoJCkr6CKkIuFi4GShldyrYufq5uPg5ibj4+OXIKikYKMn5OUi4aHi5KSi5OTk46LjomHlZmbjpSVkIqRk4V/ioeRjIqJnJaYoaGGkp2Vn4qJiI2bkIOHjn+Ch4akhYyRspidkpWXoaKfmZKcnaiyuK2mvcLHzcjGz83QzM/X0dHVrtbV2NrY2trX1tnZoHKAd2ppX2BaVVhZQ0BJQz8+Pjo0ODo7Nzo7OjM7Oz89Pjc7OjoxOkc9OjI3PUA1MDY3NzI1NT82NTs1NTg1ODo1NzczNUhSN0dPSzk5ND1FSkI+MUZDTEE5ODpHWEA1SFdJNjYyMjM6RUNlWD8mX3lpX3o+Pjk8Ozk4OjtAO0JRS0tTWVBUY2N6bWF+koNubXeLeHl+eoF8hnt7d4aEf3NwhYJ6dXZ2dISChH5/kqajn6WiloqdkJWXi4qnl3OKso2EqJKEmZOFmYyilZ+YkoianqOTqbCgkJSQjY6IloxujbeFmsTIspuhpZucmJaQsZFkpM3IlY6Gh4iPkoyMkZOIhImIhZWYmY6Pk5KGk5aDfo+LmYeNkKqWlqKhiJielpqIjoeXl4mEjoyBf4ePpYmOk6ial5OXmaGZn5mTnZujs7Wmo7zCvsjFxcnIycLL1M3N1KnS0dbV1tja1NLZzoV1g2tmYWBgUUtWXEJCR0M7QT04Mzc7PDo5PTY0OTo8OjgyPzk5MjpJOj42N0JDMzI6OTYyNjQ+PTQ7PjY5NDk7NTc5NDRKUTxKUUs5QTdCR0lANjRKRUxGPjw4OEVUQTc+XDg2MjE0OjtFYFhBRmF0aExjWj41Ozo6NTs6PTpFTUZIUldTUkJlg0d1go58fG19iHh6fnqBgYN+dnaAgntsbop+eXx3eHyEhot+i6O0qKSrs6GWp6CmpJaVr6KDkLiVkbOajKGgjKSbr6OknZiQqJepma6wpJeUlZSQi5ialqDAjqPJuKuao6WtmZGbnLKdhoWoopyXhYiIjZSLipKOhoCFhoiRl5OLipOShpOXhYOQj5tzkJiylZajoIebmpOPipCKlpqIipaNhn2MmJ6KkJCcmpmTmZiflKCdlJ6bobGuo6S4v7TEx8S9w8O/x87LydKnz8zT0tDW2NLP2Lx1fXpgY1hjWVJJS09GQkNENT47NzY6Pzs8Nz00MjY2OTc3ND01OzU8Szw+OzxCQTc1PDs1Mjc3P0A2P0A3ODQ5ODc7PDU1T01EUFJMOEA9RUFHQTU6SkVORUQ6NkFAQlM+OURPMzIzNTc1PXZcPFJcdGlaTV1TPD04OTU2Nz06SkZER01cXVlKaGE7SISLentthYZ5fIR4gISBfXB4fH18b3KMeX2Be3iGi4mGhJOovK2ps72wpa6ztKmjorCtipq1nqO5pZWso5eprbimpKOfmamYqqSwsaqZmJyUlZGXoJeau7utyqFptriqsJWYnqOrkpe9o16psoKJiYyUhpB8jo18g4WNj5OTiIaSlYuOlYyKjJaYkZuZs5aUqp2Km5SRjJCRi5iaiZGdj4qJlZ+hjpWNl5mdkpyYnpShoJScnaauqKKks7irwsjEtbq9u8bIyMLQocbJzc3E19bQytSjc31sX11WYlNRSEQ+PENBQTc/ODc0PkY8PDY8MzUzNTU0NTRCMzk6Qk06QTtBSEI7OkA8NzQ2PEI5P0BCODc0Ojo2Pjw0N1RLQ1VRSjc8OklBREA0QUpITkJBPzZEQTxKTkQvVD0yNTQ6RUpcWEpaUW1ncHBEaWBLSTY3NTc6PkpAQ0lQZ0hhYGJwSkCLiX6Ac4eHfIGJdYGKg35tfXx8fnB3h3eNgYd7jY+Mhoyaq8PAsL3GvLO0wb20rayzt4yosq6uvaubuqOorbm4q6emoqGjo6qvsrGrnZyjmZuYl56ipaWSo7muqL+7rK2yuaWjp32Ihp2tvLCCi4uKkIOPg5GOeoGGkIyNm4eHjZaMipSWk5CZlpunmbCZkKqcjpqPkY6VkI+Vlo6QoJCIlZujrJWWj5ScnpSgnZuYn6CUmp+op6Sio7CzpsDGw7Cwu7bFxcO/zafHw8fDvNbQzMTKind2ZV9dYl5PTENMQEVHP0E+Qjw6ND5BPT01PTY+MzMzMjQyQTE3QEJNPkdAQ05DQT1DPDs4NkNDNUJJQjo4Nzg7NUI+NzlWS0RXT0Y4PTRLQEM+NEVLSE4+QUE2QkI/QlNFNThQMTQ1Ozw4O0Q+OUxqal07V1JkS2daVU83OUdFP0NGXGlGX2lnW11ck4yMiHuHi4aDjHWFkIqBbn57gX5xfoF6lHqSlJWYkJOWqLTGycDCzMLDuci9urCrubuYsra5ssCupcCjq7C8vaquq6Ojnqesr7WxqpugqpyinJafr7OnjKO6urXBvKuonLKko6iUhI6qxMOkgouOhoeEhpWUjHqDjJCOkaCLi5OQjoeXn5eSmJSWpZ+unIupm42Wj5GRlJWNkJSRjqGThpefn7OflJuUn6GapJ+aoJuglJiep6Smp6SvraW/w8KuqLe1ycO+ts6yxL7Du7PRycjBtXh8cF9bX21UTklETExMSkBBPUJEPDVBRDs6Mz04QjMzMjI2MkExNUlFTT5JQEhSQEg+Q0A7Pj1GQTVBVUA7OTk4PDdFPjg+VkpDV09HOD80TEBCOzVKS0NMP0I/PEJGPUFITDkrRzwzNjc0NjRBPzdPYU9hRS89PjZrbGpgQDpIPj9FQmhdTWVcZlRjapqNloqLiJKPhol5hZOPgXKAe41/d4eCgY95jaGWqJqbmLq+ycjKwtLJy8LNvcGzrby/p7q/vbzEuKzBqayzvL6qsKqkpaOsrrWut7agn66fpqOYo7O8qZyovMGjtrevq5OwrKqsl4aaqqelkIKMkqSViYB1iZF5hI2Rj52fkY6Sio6Lk6KXlpqUk6GdqZ6QpJmLjo+PlZaIfI6VkpGimpSgopy2ppCfl6Wko6WfnqaYnpWXm6WjqKiisqyou7/Dr6Wzt8zAuq7Ds7u9wbmswsLBv5pxfGRcWV5dTE1OS0dFQ0hBQUFESzo0REg6OzQ8N0YuMTIzNTJBMjZTSE48SkJKUUVLQ0VFOkVMQjw3RVY9PD04OT88ST86RVVJQVdRRjdBOks6Qjc5Sk1CSUBDPjxERzxCQ089MjBIMzY2MTcwPUI6PWpqSks1UVMzU3BwZE47RD1ARj5sSl9YYVpkZViekJ2Nlo6ekomKf4iekoR3hX+Ufn+QiImQgJagmq6npJjEvsjEyMbSzc7Ny7zCuLC6vLS9y7vDwre2vK20v7q8rq+ooamotq6vqrK4mp6soqiinau3t6qlr77Esb25s6eqtLOtrpaVpa2poJGOkrHFp5SOfJGVfYeRmI+pmJeSko6SlJKknJKcmJOgoaGbmJ6XiouPjp6IWo+Wl5KWpJlmmaSfs6WWo5WrrKuonJ+ml5mWmJWipKimnrWrqbq8wrSmtLXLwbiqtqyzu7iuqLi6vLeEb3FdW1dYUEdLVE5LP0FHRERIRkY4NUZNOz43PkFLLjMyMDI1QjU1UFdOPExGS1JMT0dHST5JUT86OElTOzs/Nzk+RExCQEhTS0BXUEY6QT9HNkE3O0hNQ0U7Qz00RkU6QkFCRzkvOkEzNjAzPkdEOTQ9dGRNRztFKzpmfGhWPD5AQkZCc0ZpSVJmZE1GppSclaGXqJWMkIOGpZKIgYeCmoSDlZCQk46aoZ+vvq6hyL7FxcjHzs7P0sq+vLaxu7u8v8+2xL64ubezs7azuLSsp5yrrLmrqaivsJijrqWopKW1wLCrrLS+w7nAuLOnuLS3sq+VpK2wsKWLk5SgjXPBmXyWmYSOlpqLsJWZmZSRkZmYpKKUnpqVmaecmqCfmIqMj5WdX0qWnJqUmaWXVJawn6+dn6WVr6+tppuhppSTmZiOnaCmoZm0qaqzvLu7q7Cyx8C4paurrbGxo6GysrSlc3JoX11RU01GUVFQUTtISkhGR0FDPTlLVD9BOj1GTS83NTM0OkI0NE5XTjxKS09VTlFKUEhISk9CPD5NUjs+PTg6PENSPkRIUklCV05JQENBRjM+NThKS0NBPUM7NUZBOkE/PkhANSpCNTIsPmNdZzozNXRkZUBSNyYjM31pVzw6QkNAPVJFV1N0YlZGSKqXmZ+hqK6YkZeHiqeWjoiShJ+HhJ2Xjp2gmqOltcm1qce8w8TJy8nIzM7Hv7uzr7q5wMLNtci7wbm2urKvr7S1p6Scq7S1q6qmrqyapK2mpamsur+oq7e3vsHAvriyssKwt7yso661rbqmiJqWpZt1vp+EmJyOkpiai66WoJualpSZnp+onaafmJmpmaCmnZePjJCdgm11kqKalZyin5CusqKrlqqrmKuvpaWhpaqSkpmciZWcop6WsKapqrq2vrOyrr65tqCjpqilppycrampjWZpZGJUTU5ISU9KVkw9TERNSUpAQ0Q8UVU8QUFCRU8xOD03Nz9CNzVVWE4/SE5RWFJQUVRKUUpKRUFFTVE/Pz04PTtHUjxFRFFCR1lNS0FIREU6OjM5S0lCPkNDOjlDPjxAPjs7RzctMj4tMYJoTnpcLzBraGA8PUJCODZ7Zlc8Oj0uLlNhTFZIfmVeSEaslJuhn7uumJSei5Kqm5GSk4iqjYeinoyjrZSjpLbHvbTBu8LCyMnGws7Iwr66sq+5tcHDyrbGssG8tbusqa2tsaSjmaq1u6eqp6yqnaivqKSrq767qK29tLe+x7y2tbjAsL3As6q1tqy/po+ilpCgn7ueiZqfmZadnY+2nqibpKKam6CZp6SxoJqdpZynqZyXk46Um4qWiIykoZScop6hta+lpZOyrJqrrZ+fpaSrkpaVoISQnp+claikoaGztLq2rai1srKdnaOlmpeVmaqhnnhkYGJgTElHSE5RSU1FRkZCUUpIQERHQVZTREg8QUdRMTpCNzpCRjc5XVlLQUxQVFVTTVdSTlVKREBKSk5POUM/NT08TlFDPz9QP0VaTUpBS0RHQDUzPUlHPz1FQTk3QTs8QDw8M0A8Lyc7KkiRQjpTSjAsW29XNzE8Kh1CgGRUNDktMTpoXUZEQ5xwYkdEqJeknp7DrJuXpJeYqJuVmZqOqpaVqKaVrK2Zoau3xcG7v7jBwsDIxL/Nx7y+urKwuLS/w8i2wLC8trq3p6SrrK2hoZurq8Sipaispp6rr62iqqi+uKatv7C3t8e3tLm4v7G+wba0srWwvqSWo5WSmpOtn5ChoqSiop6QvqSonairnJygmqWfvKKXo56hqKqgnJSMlJ2TnYaOhI2TnqSgnbaspZyXs6easKmgm6ufoo6alqCFjqGanJKlpJqXq7G2squlqq2snJigoJKOkJapn5RpZlxjX1FKSEtPTUhFRElAPU9IQDtGSUhbUk9LPUhOVTRCRjg+SEc1Q2JbS0NOUlVXVlFYVFJVSEA4UVFQTTpHQDRDSFFTSUM7Qz5HVktDQE8+SzwwNjtHRj47RkE1Nj85Oj85OzE1RDAtLTBNdlw0S1o1LE1uVzwtPSkeI3piUTVDS1E5b1NGPEt4ZmNYTqKbo5uexaygnqudnK2fkaKelqSgpqqrl7exo6qztsXCvcC2v8G8ycK/ysi2uLa0sbS0t8LGt7+xuLW6tqCnrautn56fpaTBpaGqrqCkqa2woqaovbWlsby3trbEsrO3ur6yw8C3uK20tbWjnKSUkZOgrJ6YoZyoqKqimsKsqJ2rrZqanZiln72hnKSXqqurpaCYjZqfkp2Ijld/lp6loaC5q6eTmbejn7OioZyxmKGQm5aego+gl5eOoqOVkKWusqypoqKlpJWVnZiLj5KTpJ+JY2dcZWJOSktLT0ZFQUdLPj1JQTo4SkpOXVFRST1MVlw5Rkk9RU1JOEhjXEtDTFBTWVlWV09aXklBPVdRSUs/SD81SE1YU0hBOkBBRFBIPz5RPks3MDk5RkU7OEc/LjY+Nzg+NzcvMT85MSUxUVVtW0pPMTA9Z1dEMTc9LSt3YVM2U1prV3NIRTY9dWVcTFCen6GYnsOnpaKzoJuxppKpo5+jn62pq528samstbLIw8HDs8LDvcfEvcXKvbCxtq6xtbC/xbW6sbC6tq2bqbCqq5yepqGowa2crbGcqaKusaqkqL23pra7va+3xK2ztMK/ssazurertbatqqKllZSToqugn5+ap6qur6+7saWfqamYmJeSoaO4oKCjka6vq6SlnZGgnZSdjpCMlJ2aop+otaenjZm1nKOwm6CdsJGhlZmVm4GSopaQjqCgk4ulrLClpqKdoJ6SkpqThouSjZyfgGRoXWlnS0pNSlNBQ0BJRzs7Rj45OU5NVV9SU0o+T15ePUhQQk1NSThOZFxMRUxSVFlbU1VPXGJIQT9aUUFIQUtBN0ZFTEtOPjtCSEROQj07TkBBMy85N0NCOTdGOys2PDQ2PDM1LS80QDErJ1Z0U2VPPzEwNGJbTTIzPjA7dl1eP1tVX2dyQDg8SJZ3ZUE0n6Sem5/Cp6OpsaCjtKmUsaqmoqSyrK2pu7OtsLS0x7/Ew7W/xL7KxbbBycK2rLWpsbiswMS0uK+ttrqlmauyrKuZoaeYrbu0nKiwm6yfrrSyqKu6sqe5tLeyucGqt7PDvbTFp76urbe1qaisoZaVkaWjoqKXl6Sut62xtLafnqikmZSUk6OgtqKkpZWtsbGlqKSgnZqZmZWXqKCfmaKer7Oipo2Yr5qlrZiboKeTnpCWmpuGl6CUjZCdnpOLqKmroaegmp6WjY+ZkIKGlomVn3pla15ta05RTk5UPUNBTkM7Okk/NzdRTl1fUlZRQVdhXUJJU0hXS0g6VGRdTkZPTltXW1JQUVhdR0FCW1BCRz5OQzlIR0hOUD8/Q0lCTEI8MklBOTQxNzdCPjs3RTcrNjkxNDgwMi0vLjw2LSNCcWdzazIzLzFbY1ozMzkwNnBbYkgwNUpxaldEV0aMeWZDO6SknKClv6Worq6gqbWpnLevq6OqtLaxsLi3sLe3uMW8w8e9vMPCyMG6wsbCu6q2pa27rsHDuLirrrK8o5Wusa6zl6aokaq6qaGnsJ2qoK+0s6uqtrWsu6yzsrq3rLmwwrq+v6bDqrC3r6mrq6admJiqoKGgkZegsK6zqrC4mZuqn5mWkpemn7aopKKir7Czq7Gmqp+bn5+bnaWdoZido7SwnJ+RlKaboaqclqSimJuMl5qUlpeelImRm5mUjqmop5+jm5mbk4ePmYt9jJeGj5psaW5ibm9YUVJaVEFDRFVAOzpJQTc6WFBkXlBXV0VZX15NTFNOXkxKP1pkXk5JUU5bVVlQS1NXWkk/RFhQREY+Tj89SUdHUVBCPURGQk0/OjJEPzc3NTQ3Pz05NUU0Kzc1LzI1MS4tLiwxPionKz1ccD0+MS4xZVtlQDE3NDdnWWFGKEA4bX1pXFY7iXtjQz2on5yhqbyhqq+qorC3qKSzsquhrLW9rrO5vbu9t7bBwr/Jw7nEw8HBucW+wbmwtqist7K8v7+1qq+yuJ+XrK2pr5ipqY6nu56lrbOfq6KxsLOsqrWztbytr7G1rLC1ssC6xberva+xt6ytqaKxpZ6lqJ6jlo+Yn7Kpsqmpspmdp5ualIygpqS0rqeirKytsKeyqrCpopueqKOelKGZnKi3qZiak5Kfmp+ioJKtoZubiJeajJ6anZSLj5eXmpempaOgnZaWlpOAkJWEe4+ThIyXZ21yaHFzX0dZZlZEQ05YRFo5SEI1Pl1RaFxOWl1IW19eTk1TWGRKS0NdY2BQTE1OWFdYUEpWVldMPUVVSkVEQU0/QUZISFFQQTtHREZLPTg3Qj02ODcxOT48NjVEMCs4MC8wNS8qLC8tKj0sKyUyKyo1SzEuJ19fYVUxNTE9YFZfOClDM1lVXGhLNYx6ZkxApZqgpKy1o6yopa6ttaiusrimp7C3xbext7/Bwra1usW+y8S5w8G7wLrFuMG6s7Ssqrq3u7u+tauvsbeZmaisrKydrauPq72eq6+xo6mfsa2zr662sbm2qq2vsqi2sLS6vMqyqrW0sbSwr6ehs5+aqKyfpJWVmpmxoq2gpa+WoqSZmZKMoqWnsqmhprGrqbSlrq+zrqOYna2nm5eempqsuaOYlJGPmZ2hmZiVrqKgl4OWm4+enZmXkYqUk56apaKjoZmWk5KVe4yQhXqNi4OLk2xueW92fWFGYGpaSUhaXD17SkdFNkFjVGlbTVxhS1xdW1JSU2JhTEtFYGFgUUxJUFdWVU9HV1ZVTjpJVklIP0NLP0VESEhRTkE/SEhIRTw3PT46NzU2MDk/ODY2QiwtOCwvMDQsKCwvLSo3NikoOS4kOks1LiJUYFZhLjUoQ15RXC4rQS9KR1BbRzNjWFRMRZqWn7CosKmspKOurbWotrK3o6yzt8m7tbu8wL61tLfDwMzHvMO9uL/AwLjAvbK9rqi6uri3w7esrrK6lpenr62opLKqlK+7pKyysqeno7K0sbKxtbC3s6murLKnuK+2tMPFtqm1tauwraqno7aen6exn6OUm5iUsZ6nm5+pjamjnZyVl6WlpLenorGzq6ewp62vtKykmKCsqJycnZyVqrmclY+PjJmdopiRmamlopmGlJiRnpyYl5eJl5CXmqidpKCSlpKQlXaEkIZ7hoOEjIxucXh2fIBcTGVsXEtOY10+YntHSThHaFdlW0xeYk1ZWldUWFVqXVBQSGFeX1BLR1FWVVJLSFdVVk04TVpORUBGSz9IQkNLU00/P0xPSEA7Oj47NjswNDE8PTQ1OD8pMDcpMS4yKSksLC0rLTkkMDQyJTlCNy4jQU5JZzI3J0ZhTFYlLUIuPUVMUTwzcWpMRUSRmKStpKytqqWjsLGzqbavtZ+rtLnIuq7CvcO4s7K1wsPOxMDCvrW+wcC7v720xKmrurG3uMC8sK20tJ6hp7GupqaxpZ2xtaypsrCrqKm1uqy1srWrs6yqq6msqbmusrDHv7ikua+pra2mp62xpaSjrqOonJ2bmq6Zo6Kio5Csn6Ogn6GppqW4pKu0tKSqq6msrrauop2jqKqcoJqbk6S0mY+KjoiRo6GWj5Wfo5eWh5CVlZ6bmZaViJiTlZmnnaGfjZORjpB3fo+EfH1+h4qKcnRzf359XFNjbl9OWWdcRkSWW0c6TW5YYltOYWJPVldWV1RZaF5RU01jW1tVS0ZPVFNOR0lWU1xOO1BeSkJESEpBRT8/S1NPPjpOTUM8PD45OjU9KzMyPTYyNDk6KDQ1KS8sMSgpKywtKiY1Ki8mMCkzODoxJiozRGU7NipIZEhKKzpJPzNDSVMsPo9sQEhJkJqoqaGor6SmorOzsLO0r7Cgq629zLuuwb3HsbSutMLD0cTFv8Kzv8LDvL+4vcWorbestLm9wLGss66ipKeuqqilsKOpsKqtqrGurqyrs7untrCyqbOpq6alpK66rKqxw7m0q7mpqaitqaexpamko62pqKKem6KslaSdl56ZrJ2ip6ihrKajray3sbCgqaKgqq6wrJ2ep6ipmqOYmZChqJiHhI+Li5+hkI2PmJ+TkoiJk5ehnZaZloeXk5OXpZydnYySkI2Jf3+IhHt3gIeFh3R0col3bF9ZYG5jUXNyXEs7hHxGPld1WGFZT2RcTlZWVVdRXGJfU1BPaFlXV0tHTE5SSEVJVlJdYzxQXUQ8RkhIQkc/PUpQTDo+T0o9OT89Mzk4OyozNT4xMDQ4NSg1LyosLjMwOyksLCclMjM0JCwyLTg2MCkoMj1eSzAuSWdERjg8QjA1RUtYMUCUXUFORpWWrKegqbGcp6iwtay3tK2qpKuqvcm8sb+5w6+xrbPEw83Ow7/AtMDDxLrBtMnErK+3rrO6wL60r6+sp6iqsamnqLGls6yqr62tsa6yrbO7pbizrKuup6ugo56xuKuqrbq2pLW1pKqnrKyqraCop6ewsaOmpaGhrJaqoZOboKaepKKqo6yinqaxtqysoaWimqmqrqqcoaWkpJmgmZaQmJ6UgoOQiYWdoY2MkI6ckpSOhY+apZuTkpuMk5KSlKOanJqLj4uLfIaBgoF6dYGDgX91eIqihnhqXmBuZldlh2ROQGeSTERieldiWFJmVU1WVlZUT1xdYVVLT2lXVlZISkhJT0JHSVNRWW9BTVhAOkpHRkVHPj5FUUg4Q0tFODdDNzI6OjoqNDk/Li80NjMpNCsqLCsuIzQuLSsmKCs3OSomNis8LjIsJjA3WFouMEpnQUE8PEMrOkpPXjREh0NKSUSWkK+koaqvl6inrbWqtbCqpKuqqLzBwLm6tLy1prKvxMnL0b/Bu7i/wMO6wrrCxK6ytbK0vMG9s7Kvraytp7aqpq2vqretp7CwrrGrtaq2tqe1t6uspKmpnKSetLOpqKSztJ+1raGqqKqorKefq6ypuLWpqaqpoamgrZuRqqGdoKSjpqOqnZymtK6npKmio5ekpqeqnKKko6CamKCRj4+Zjn+IjYeEnp6JhoyMkZGTj4WJl6Oajo2bkZKQj5KgmJqXjYuEf3SGgn9+eHWDf3t4fn+HnI9wcWZncXhcYXSIak9dmFZIbXlVZVZTZFBNVlVVUU9YW2JWSVBqVVdUR09YVUk+SUhPUVB4TU5WPTxLRD9AQTxAQ1VDOUFLPTU7RTIzOzo3KjQ6PSstMzQxKjgqKisqLCkqKC8qJiklMzssJDIpMi8yMiUvM1JjMDI/Zj1OWD9DLD9MVF8vSWw4UkY7lYyvoKSqq5mpo62usrSvqaWvqai7v7zBsrC5raK2r8jHx9DAv727vMO+u8TCv7+vsrOytr68wrGytKu0qaW1qaWtsrK3rqKstLGvsbmruK6prresqp6qq6CjobatqaGfr7KhtKqfqKeqoqqhoaytqL2uq66toaenn6yZj7CimKKhqKeep5uZqbCpop6roaGSoaKjp5iZqaWYmJmdj4uHlYh9joaEhaSXhoOEjYiRkJKGh5ahl4iSnpKTkI2RnZWXj4uGh3h0gYB8dHd5gHt1dHtrgoekdmleZWyBdWeIjHxSVm9eS3hzVGRTUl9NTVNaZ05NV1llWUdTaVJSP0JOUWFROklITFNJcVFMUzs8ST87PD07QEBXPDw+SDczQ0IxNTo5My01OjopLTMxLS02KSgrLSw1MiMyKScsJS47LiYxLjAtMTQlLDBNaDozOF89YWQ/RjFDUFtbK0hPO1lEM4+NsaCkpamjpKKsprOysKiksKequL7BvLGpuaqnrrDJxsfQw77Avrm/wL3JvMG4sbC1srq8ucCztLysuayjtKamq7C1t7Glprm0rLO7r7ylra22q62cqa+kn6SsqqicnqqypLOomqunqqSonaKpp6q9qrSwrp2ppKCunJqzo5alnKWkn6WamqirpZ6aqKGbkZugpJ2Zl6mqkpmakpCLg4+Ffo+Cf4ifj4eBf42Ik5GRhoOVm5SFk6OOlJGLkZuTloeKf4Bxenl9fGh2fHp1cXJ+aoZ5hYhkX2djcoV7bWh5XV5VQVd7bVRhUFJZTExOcHRdSVpbaFpGVmZQQz5KT0RDQTlIR0tTP2phSVE4PUg8PDw+Ojw/VDY6P0M0NUg+Mjs1OTAyNzw1KC41Ly0xMSYvPktJMSUaOTAlLCwwOS8sLCs2JzE3Iy0vR2pJMTRYPWZiQUo3R1NgVSo9O0ZdQCqNkbCYnp+opKKhq6S2sbGkqbCmrbnBvbaxpLmsqKiwwsjIzMK3vb+1uMG5yLbCtbWztbK9ubq9tq+5tr+sorOmqqqutLazqJu5u6iwvrK6oK60tqmrn62xo5ylqKmjnZulsKavoJ+rqaehqZujqKCtvKeusK6hqqKkrp6eraaYn5qhopyfm5mjqqKamqKklZaUn6GWm5alrIyfkZCRjIKKgICPgHualY2KfYCNiJKRjYuGk5iRhpSji5KRiJCZkJSBiX15a312eHhienpxb3F0eGuCdWuCZ2NnYm5zjm1iam9gb0BceWxVXk5RUktKTVRZVk1cXm1XRVlgUF5PSE1ERjs3SEVLTzxyaEpLOUFFOzs9PTs7PUo0OUI8MztHPDQ/MTgtNzg7MigwOS8sNS4uPS0qTD4qHTQ5JicuMzQuMCsvNCYsOiQ0MEFoWjEzUz1lX0RMNktWZE4pPTNSXj4jkZasmJ6Xp6Kgn6ejt6+toa+vqKy4w7u0rqC5r6uotLrHyse/uMG9r7S/t8S3w7OwurGywLa7vrequbi+qqS1p6ipr6y4r6eYubujrb60tKCtt7Wnpqews6CepaanoKSZnqynqJ6gqq+noKaWoqifsbifpLGvoKuhrKScpqeompucn6OVnJuanammlpueqJGYk5mdk5mWoaqRm4qOkId9h3+Cjn18oY2NiXqEjoaMjo2GipOajoiVn4mRlYKMl42SfYV8c3B8cXN0X3h3aW5xcXBrgHRlemxnZWRiZoaAYFtyanJNTYBpWFpNUUxLSFBTUEdMW2BvVEZZWlJnT0hLRUY1NkhCTEk1WmVKQDZFQjk6Pj0+OjpDNTk+OjNARjwyQDIzLzo7ODMmMjwwLDg1QiopLUMqLDQ7Tk5AOzczLS4rLTcqKjwlNTM9ZmQyNE0/ZVxGTz1SWmdIKj8wXVw1KJWbppiblayenaGjoLaqr6O0s6mpucW3s66gt62trLC1xcfAt7/BubC1vbe/u76wrL6ws7+yvMK4qru6uKeotaenqq+qsa6kl7u1o6q6ta+esbivqaWnr7GboaSgpKOglpuvpaGeoqivoaChkqOkorewoaaxq5+ro66YnaqlqJ+Ym52kk5mbmp2lqZmbm6WVlJeVnI6TmKKpopGKi5CGeoR+hIt6jpeKjod7g4mEio6PhpCTmIyOlZmLj5d+hpeMkHqBe3Byd25vc153d2RsbGxraoVvZ3JpamVpXWRzgWBba3ZpWkp/XltZTk9LSEhTVkczOF5fbFBFWVZaZU1JSUVFMDdGP0tCNklKSDs2Rjk0OT49PDk4QDg7ODo3QEk+ODw0LTM8PDc1KDU+MSw7QTEoKzY8IjhSPSoxMTM+RDUsLSc0Mio7KzEzOWNtNzRHQWZbSFREVF1oRC48MmRXLDGUoaGWlJuqm6OhoqG2qa2gu7elrL3FtLCvo7awrKyutMPDvLO+uraws7m4ure6r67As7O5r7/At6y9urWlorKppqixqauwn5m/tKSntLWonrK8qailqa+rmaKnnKOllJegsaSZnqSpqJyhn5KkoKS4qaSnrqedpKGok6CpoqGhmZucn5KZm5afoqqbmpiglJGVl5qNk5OkqaSQiYqPhnqEe4SFfJ2NiouHe4KFiImKkYaXkpKLkJSUjY6UeoOXkIt3fnxsdHJsa3Ngd3RoaGpnZ3CHaGhoZGZpamBqY2poW2Z7YmBTdFRcW1JMSkdJUFRAISpoX2lNRVhVX2BMSkhFQy46QjxGPDZLUEQ4OkQzNTc9PTg5NT86OzQ+OEBLPT45Myk4Pjw6OSo2QDMuRTQoKyw/MC1OPy4rLTcsMTE5NSwmLjUtODA1NzZgdEEzQ0RoW0pXR1VgaEIzNzlnUCcynqKkkY6jp5mcnp2js6ynqrq2pqzDwbixrKO2rqetrra/v7yywbawrbK2tri2tq2qvbOusrG8vrevvLuxpZ+1qaSks6aorZ2cwKqnpK+zqay1u56pqaywpZidqZ2mpJGYpayhmJ2kqaGboZuWn52ntaawqq6goJ2doZWgpqCioJqbmZuSmJ2TpZ2soZeWnZSTjZWYi46Ym6mgkomKi4l5hXaBgoGdh4uDiX6AhomHh5GEl5SPjo+RkZGMk3qDlY+Gc35+ZnlvamprZXRza2JnZGR2gWNlZmZlampja3JbX1ldbGNhTmlYWmBWSkdIS01TVz45XmxoSERWVF1bSUpHRkEuPD85QTg5UkZANzpCMDM3PTc2OTI6PDk3OjlETT1CPDAqPEA7QT0tNUIzNz0rKiwwQipKSy4vKiszNzIyKDU3JCs3LjcyNjg1XXlOMj5IaVtMWkpWYmZAOjNCaEglNZqjoI+Mq6GWlqCWpLKxorK9tqGxxby6srGjt6yqram4vLq6rcCxrq6utq+yuLOpq7mxr66ztbq1sLi9rKaetKmfoLCiqK2bor+fsKOusa+3rrWera+traKZnaaopZ+Vmqeln5ikoqidmp+ak5yerK+muqiuoqGam56ZnqSapJ2XnpiblJifkqiVqqeak5qakoyVmY2UlJuqp46OioqPfIJzgYGKmIWHfYmKhoaLjYuThZWbk5KOj5GWjpB/gI2Og2+Bf2Z5bWdraWZwcmtcZ2NjdIJiZmdqbmxnamppbl1sbHJwYFRjaWNmWklGTU1PWFFQVWFlgFVBV1NZVEdJRkVALzw9Nz82PEZOYTg6PzI0OUAzNzgyOD83PTg+RkpARDkyLT1BPUE9MDVAOUExLSsuMzw7SzYwLissLTI0OzYjMyopNi41NTQ2NVp8XTE5S2pbTVtLWGRkQEExSmZDJjSRoZuNjq+dmZOhmqmxr564v7WgtMG7vrqxprewp62kt7i3tqy7rqyqq7eqs7euprK1sq6psLW1sLK1uaaon7SnnJ2ooKermqe9l6yjrrC1ta2toLGtsKihm5yjq6eblJumo52aqaKklZqfm5CbpKqrqrugp6SgmJqZnaGPa6KWmZxwgpWZo4B1kqmnnpSUnpCJmJqAloqikHmHlI2DbWp/d4NxbIaLhn6FjIdxX2RhZ4SYhWuKjZSSdHeLhH6DkIBnh4BndWhlV1xoc25NUGljZ3KFaF9lZm5tal1gYYqPg4RlTktEOUdUaF5KSFFRVVVMSFNhcHRlRltRVVBGSEVDPjE7PTY9NjwzZlw1Ojw3NTtENDg2MDpCNz86PkZMQ0IzNDM9QUBAPTI4QEU9MSwsMDg9RzcwMS4qLiovNTY4LCMxJzIxNDoyNzZYgWwxNk9rW05cS1tmYj5HMVFkPSoui6SZhpWwm5qToJuqrKqjvcWuqbfCt728rae3sKSqorezsbKwuayppqy0pa+0o6m3tbWop6u2sq20rbOhqJ+yqZ2ho5mkpZiruZOlpa+zt62vpaquqqykoZ6coKamm5agpaSbm6emnZOenpePnaippLawpKOinJaYl5ejiKGOkpqGoIeSnKB/pX+mqp6SkpqRiIRzeI2OhYihdomNaZeJZn5zeKBviIeEfo99f6GgoJmAfYeec4aOdZuKbIeBg21pZWN6bHJhU4VtYmxpmHFYaXFviFleaVtsbFuIcm56coVmhoRaX0dOP0dfTkZSVlZRUVJXVWddTVZJUlJPRkhHPjw0OT05PDc7MDw8Nzk5OjY9RjU4NjA8Qjs8OT1GUUc9LjU8O0A9QD41OUdBODIqLzE8STkvMDEuKi4oLTQ1NzMlJjIxMTU+MTw4WIN1MjVSa1tOXExcZ189SzFXYTcvKIqnloOdq52YmJ2fqqmnqr/DrrG6vLfAv6qlt7CorKWytK6us7aqqKSwraW0spyutba0pqensrCssqitnamgsKefo6KYn6GarbKTo6Wltb2mraerqqyopaCfmJ+mo5mYpaKjmJykqJaTopuTk6OlpqG4pKSgo5iVk5eTnIivkJeUiamLlqGchbGAo6ydk5mdlHmC1KiAh5XBnMZ5eLGlt5dlgMCcv3mEhXqShH2QkJHKcpe7nMV6crWmu5B7gG2XsauweWhsWLGubmVpvJK8bmd6bnKP2H5Ta2O2sn6Bc5RzmqGqkFdPV2JPVk5GVVtYUVBTjV1XW1FBXURQTkVISTw8NTc9Ozo5Oi49Ozg3ODs5PkY2Ojc0PkA+Njk/RVJJOi41PjpCPD9BODpKPjUyKjIyQkUvLjMyLisvKC0vMTg2LSAvNDE2QTE9OVeDdzIxVGtcT1tNXmdcPkwxW100MSGLp5OBp6mfl5ydpayxqLDCvbK1wLW2vsGrprOsrKimrrOprrazpqeltKWnt62cs7G1q6akp7CtrLCmqZymo6+ioJ+dlZmenK2rk52in7O6o6upoq2upaGbmpmhp5+XmqefnpeepqeRnKaZk52hpqKhsaOfn6OXlpKXkpmFr2tqio2qfmaDlYatZHCdnZSZppRwrqGkfni7fWyhkHaxX2q0W6WAZZyQYWeDe2eAa3lrqWW+cWemi3WxanuxeHSSlGNubaduW4ShRWhmh5ZFdZxgfmd8pKeCWmCMq2iAlXh5aqc3Sq9cWFNsZFtLT1hgXFdWO06LT1dXL0lUU0pERkY9PzQ2Pzs4OjkwPTg5OTk6PTxEODs6Nj1BQDY8QEhRRzkwNzxBQz5ARDhARz0wMy4zM0U0Li41My8rLyguMC46Ni8nJDIwM0IvPjtVgnYyLVZqXE9ZTF9nWTpNNV9YMzAbkKKVg62npZ6jpKqxt6y1vb6wtsSxt7rBpqiwqq6oqK+uo7C6r6OkrbKjqbennrKysKOloamsrquvpqadoqGvmqGblpSWmpuspJWaoZ6zs6KsnKOtraCdmZafoaicmJ6jn5uZoaakj5yimZagn6qep6ahmqChlZWRlpCahbWbtXiFqZm1mXaGs5u3fpOWlqmUf2uBpnuChoiTlJN3q2drsVyreo2GlHSJco+HgYGJkJd4goGLl4uDoI6DsHZ3n3FsbGx8i06kWEhiYpl+Y2imX3lydVOTh15RqW1jcX2GgGKcLlGhb1tTa2hgTEpcZVlcWkI+sntYWEEjTWhGQ0VBQEExOT44ODo4NDs5OTw5OkE6RTo6OzY6Q0I4PT9LTkc6NTpARkJAQUQ8RkQ7MDIwMTtGLTAuOTQwLC4oLzMsPjgzMR8vMi1EMT08U31uMytYalxPWE1fZ1g3SjhhVTUwG5SglYezpqahr6mosqypu7bCsLvBrbi3v6msra2tpayxqaCuu6qgp7Oto6q0o6aysqejop6mqrGnr6eknZ+frpWemZSUlJidrKCZmaSota+iqo+qqKqbnZSXoKWnmp6cop6bn6KkopWbnpeZnaKpm6aanJuioZeTkZKTnIPVk5m5cLDBfsWGfNaUm7t8mpWlj42djaR7joikg6WDeqx5j51Wr3qIfp9ruVu6d4eEfqaClHuXeqp4jZ2PerFujoR0kbyFb5RQr6fFilGgemNgqmJzcohtl4hgU7W0yIWAiXxjpDNCnXZdUGppY1BAWGhaZGFKSE1xUVxRT1lmWkNFP0U/MD08NTk7NzQ8Ozg9OjxDOkY6Oz42OkBDOzZAT0xIPDk7REhDQkNEPEVGODEyMTFEQi4vMDQ4MystKS4zMjM5NzEjJTUqPjM9PVF3ajYqWWlbS11PX2ZUN0g6YVA3MSWbopSYsqioprSqpbSppLy3wbC5v7C1tLqytKewr6KvsqWfrbWomqe4raKvsJ+ztLCgpJ6fpqmwqLOoo5ucnaqVmJeVlpOWoKmcmZanrbCpo5+PraKolp2Vm6CloJihoKGgmqGhp5qeoZ6UmJqmoJynlZubn6GYkJKUkJ2Ism5otXGrh26OpnK0c3K2e5qXpIuPnY2ifpGhpn+xd4OR0tJ2XK57hX+kb5uqpmuHhX2tfZiZjnuxcZKejnezZZd0hJ5vnmeUUciLWsJcoHliX6xgdXOHYpeIXlnKnW+/gXVNS7VTVcZkVFFqY2VYQVBrYGxoUFZHSjk9VVJaV1hJRD9KPDI/OzU9PDQ2Pjs3Pjw9QztHOTtANzs+RDsuQ1JKRz4/PElKRkNFRD5ISTkxNzQ2QT8vLjI0MjUyLSkuMjYsNzQyJh82MDs1Oj1QcWg5J1dpXEJPVF9lUDVHPWBMNjIwop2SpLGto6u8raa0pqe1uryyur62tbO5uLKktLKgsLGinquvo5emuK2ksbCctLepoKWeoamksaesqaOZm5mnnZWTl5eQkqGnn5WTpaqwpqKXk62gppKTn5ujpZ6VmqWmoJqin62ZoZ6dkJWboZ2cpZWdlZminpWYlZGbhax7d6h2o42IhqlvrYqCp4OYmKGKkpuLon+TmomuhICCs1xys1KufYKCo39y2H54hn6PnYaamXavhoeRnId2tGGaZZqCgpVtklqwWEuadZh5ZmCsXnV3iGiYiGtdr3eVno94bDV5yK6yX0JUb15nYEVQbWBwbVZWTS5mZWlTWVA7QkVATDo1PzkxPTwxNj85OEA9OkM6Rzs8Pzo+PkU5LUVVSkVAQzpNS0pCSEc+R0s5Njw0Njo+LzA0MzMzLjIuLjE4Ki4zMiUhMDM3Njc9UGtlPiZWZ1xAPlZfY042R0JfSDo5OaCelaC5sZe0wq6osqipsrq3s7e+uLextLq0pLeynrOsn5+oq56Up7WrqLCxqq2zo5upoJ+nobWmpamimJyUpKCTkpuXkZSipJqSkKatr6ahlpmpoKKOkKGZp6SflZmkqJ2cpJ6snKGcn4yTn5qdoZmZm5aXoqCTl4+mnYapfX2leKGOjYKqcK2LgaeGlp+hiZiYiKODkoiUq32Ai515b7FaqIKCiJ96dNmAd4h0qIGOm4ySpHuUj5+EerJenWSgfoOVbZJdq1tak4CRf2hnqmNxe4FrmIdzXataiaCOa29lT0pDoVxbTHRdYmdNW2FfcXNfS1c3SpyYWEdFPUhHQU0zNUE4Ljs+MDVBNzhAPDY9PEY/Ojw2Pz1CNy5IVkpFQUg2S0lOQElLQEVOOjpANS47PjEwMjE0NCsqMDUvNywmMjEoJCQ2NjcxPFBlZUEmVWZbPzJVX2JMN0ZIXkIyPzijnpmawauXtMKuq6ypprSwt7C1vrm4sbC1uqi6s5+vpJ2kpqaek6mvqK6otauprqGYoKCmpKO5oaKroJaakKGflJOemZOYnp+QjIypsLCnnpebqKagjJGjl6eqppSXqKeenqCiraShnqGMk6GYn6CSnpeclZ2hlZaNqpyPrm1ytHOpi3WKp3O0eHOzgJGko5Gdjomkh5B3uHCNe4uiamu2WqGFZZeXaaCip26UcrR0k5l+smqFkYetanWzYZ1mom+Hk2uXXa1gTaF8hpJSc6NreX9+b5iHcVyvVjycd2ZUb24uXKdPY1NrZWJtWWNdYXB7Y1RbUz49bnEzQ0JAP0w6ITdANi47QDM3QzU4Pz8zOzxDREJKRk1JRjYySlRLRUJJNklKUD9ITkNGUD08RTUwOzswMTAvNzUsKyw0MjYvIzAwLCwdMjg5LzlOYGVEJ1VkWT4vVV5hTDVGTV44MUM4ppybnryhnLLAr62rq6e3qbeutb+0uq+ut7aqwLWoqaCbpaOhnJGpqae0orKnramgl5ynn6SruJ2irJqVmI6jopWMnaCbmJyfkZOUq7axqJmVnKypl4yTpZikrKKRlaqxo5+epquxmaGjkJiilqCblpyWoZOcqZyUkKqZh9SSmrtzsMOAw4Z+1ZabuHiIkJiMmIuMp4h6pLZ1fnd2woKasmCDunnAfXa4Y7WBjIepfZWBq6lxe390vIinoGmdYaaOr6F+jHWHq32+b3O8dLKDdHiBim6aiHFujaR0vV53fVphebxrWlZcanleamBmZ2NteG9ZXFpDQEB0QENHKzRHIic7PzEwPD83OkI5OT1DNDxATlpeYGBgX19aUFBSS0VGSjRITFJASk5FRk9CPUU4ND05MDIwLjg3LSouLzE4MCItMSwzHiw8OjA4TFhhRidUY1g8L1ReYEs1O0xbLTdBOaibnqO9oZeyw7Ctqaqssaa3r7bDsLiwrbiurcCwq6OinaOhnJuQqKOqsqS0payknpWaqpimrLicoq2XlJ+QpJ+SjJyinpedmpGVk6+5sqyWmKSop5SQlqSco6ydkJ+oq56an6iis5+jpY6noZSim52YlaOYj6+fkZSpnoWQmLZ/j5GMt5V4gpOatXdta25zb3mQhY+KdJ/Bu72ae4GxqHCAc5G5g32Hho2HjXyKh42YfKS7ub2cdHm0o3R3l3Z0sHWZnmaHao22dHJxeLaMXn96fYlog3luemOLrHB1hX9YW6dqRWRaVGZgY15jUWdncGx1Q05RTEM6Wk0/SzI7LyA4PjsuMz1BOTk/PTs8QzZCVFlaWltbWlteYGJgXVNHR0g0RElUQktOR0VPRj9HPDc/NzA3MC85Oi4sLy0qOC8lJjIoNCQoPjcvN0xUX0cnU2JXOCpPXl09KzpWVSc+OzyonqGiwKWWtcS0rKqorKqpua6wxa2zsq21prS4rKmhoaWeoJ2Zk6qjrKqltaemn5uVoKOdrKS8paCplpObkKGbko+hp6GSnZeUmJWytbetmZ6kpKKLkpGlm6Sqm5WopKWbmaGopqekqqGSrZ6XpJ6Yl5edno+vqJObpaGNan1pmqV3hnJ9mo50eWSHe72+wLpvk4Nylohhc2taX5uKYWOIj5VrYICWZG6ed2OWbIGalZRlXmBicJmIaXKLfYaVZ2t/cnR4fX9iXHh0gWhQXW6DfXuLa1hreoJzSkpvhnBOdExFWF1nYUxbWGZjX09bbXVpcVJRREVNO0dJPU0/MiwyQT84LzU/Qzw5O0A7PUM+UlZWV1laW1tcXWBhYWFgXFVHNURGVUVKT0hGUElJSDs4PTUxOi4wOzouMC03Nj01JiIvKjIsJTs4LTdKUl9JJ1NfVjQpUF9MKDI9W08nPzI+qaCoosKjm7W7tqKspa6np7SxrMerr7Kqs6K9sLCln6KnnaObmZmrpq6jpLSppJuYlaCapq2ovaeopJSTmpWfmZKWpKmokJ6RkJidsLO/rJunnqeiiJORqZqno5uaqqCjmZqjp6yjoKyjm7GblKegl5Wdn52WsKSXoKeYmpCbm6Ghl6ShmZyZmZmPlYFnbX1xd5KYlJKGjLarjYeYlo6KjJiWh5SVi4STlJKJjpOUmZSYlpmfoZmak6CcjYJ6pYVta32QfYB1i4qBcYJ4eXZ1iX98iWpzgXSDdWV2fXdrb3ptX2RdcGhNWVpmal9XWm95bW1mVU9GUjlOWU1STygrOktCNjM1PUBBOjpDPjxFTlNTVFZXWFpaXFxgYmJhX15eW1RLQ1NHS05ER1BMT0k8OjszODksMjs4MTApNklSTzgiKSsvMiM0Oyo3Rk9bSiZSXlMxMFReOis9OFxKLDwtQLOhs6PAoaSysregqaWyp6WvtKrHqqyvpLOkwKezoJ2kpJyjlZWfqqasoqO2q5+YlpWfl62ppcCeqqOVkZqXnpiSk6GenqKnk5KaqaizxLCaq52rn4+Wlqidqpycn6uYoJqboqSvp6KmqKCvmJennZmZoJ6dnK+gnKCllJaRl5Oen5ShnZegjpaTioqNjpeukHyWnIOSgourqYWBmZeJhI+eiHqEkIiGmpKIh4qWj5uXjZCXnaOVmJKQnI1/jmehs6+FioV2e5KKfXd5em9meY+BgYlrdYF5iHNpc397doOGgmp1ZHpmYGplY2Rma1lre29pal1TTFBEXlRFQD8+LDRARjs0NTs+QTs8Pz4+SE5OT1BTVVZWWFpbX2JjYV9eXl1eXVhWSktMQklPTVJKOzw6Nzg2LzI5NjQuKCYkLTEuLykrKjclKzwoNkNNTUQvVFxRMDVOWzE3RTNbRzU8LEC0obmwv6yrr7KxoKqnsq2irLKvxK+pqqKxrbyis5ufpqKhnJiXp6WppaSlsrSelJOdmZmwpa2+oKuikJCdmZmUkZWhnJeonYSerKyjtMi0oKqkq5eVl5qmnaianqOqk56fnaCqr6qmpKyjr5ufoKCYpJ6cnpyuo5iep5KWlpuQopeWp5yalmWCknxlfo2akGN5jm1oa3uSpatqZZuYfWeGimVlaWh7jqKPbGiNmJGjd2tqipiinpdza216hI6IelhmXoaDXm2MioF2XGhzd3aRf4iCbXeBeH9zbnmEdHaJh46DfGqHWV5sdWVdc4lpa3twa2NfUk5XSWRYQUo0PkY3P0ZENzE8PT9BRDs7REdISElMTlBSUlVXW15gYWFgXV1dXV5fXVpVT0RIT0tTTj0+PT02NTM1NTU0KiYmJSwqJS8qKyc2KiQ7Jy9BSltKLzdaTzYpRVkvRE8yWUM7Py49paC6vLqvrLSxqqWora6wpq2ssLuwqKajrK2wnqyWn6OdopmZpqqcraOlp6iyrp6Uoo+ir6W1uKWtoo6NmaCZk5KboJmZpZZ8pa+jqLXFuKWip6+enJSeop6jm6KoqJGeoJ2hqrCrrKSroaqbp5+nn6uWoJulr6OWm6iVn5yakaKVnKmXnX29g4hytHKEnYataHi5xLhxlKOjeqaZmXKrgnzLwMC7cYyjiIOefJaYiZ3AvYGWnZ2MnMHBfIJ8k42aw8B+bKWyb4yBb8p6f5t2kIOOgXV5gIB5cXp/h3B3hYyTeW14lGJnYHhkX2WCYl5zZ2xkZFlMVklRWkhPRDJJRT9EQj4vPD8+QEE6OERDQkNFSElLTU5RU1ZZXl9fYF9eXl5eX19fXVxTTVBHVU5BPz89NjQ2ODI3NiomJSMpKiYuKyopMTAfOSojPklbTCojQlAuI0ZbM1BZL1VBQjsvOJajucO1sLDBqqiUo6+osK6tpbKzrqmkpaWvq56qmJqin5yaqqahnauipKikpLSknKKSpa2rt7OnraKRkJicpZKQoKGYnJ+diKetpayuwcCxoamuqZaSnp2hmaGiqaOSoKCdnqyvq66npKSooaalnayokaOaqKypmpynmqqflZajlJ+hlZt+zpR4eqSBeZWWm1+uj16OqIKjoXynlptzq4OAr15jjap7qIeFoHSXk4izY4KrhqCNjbNqhK91fZeIt2KDrVqjzW6Qdnvae3+ZcH2IknZ9ZXqHdnZrfIdufYWQkX5tg5BgcWxwaGBfeWVccWdqZGdgUlRSV11LT0Q1QUhERDg+NjtAP0E7PThAPj8/QkRERklKTE5QUk9TXF5fX15dXV9gYF9fXVpXT1VKPT8+PDU1NzgxNjQoJyQhJywmJi8oJiszHTYwJDc7U0wrLC1KMCc7XDtMLSFQQEY0LjGtwsC/tbSwuJedkaOqqK2zq6WyqquqoqumrqmfppuZpZicoq+foJ+op6OloJ6wq5qdlaatq7CqqKuflJGan6SSj5+ll56no5+vpq2xqcDHs6ipsa6Wkp2boZefqKmelKCfnZ2tsKmsq5yoqKWiq5KrspakoaqpnaKlpJ+un5GYpZeemZKTkJegcYWMl3WFqIZxsX2ecqx/op+BpZCfdquCfa1/nHOtf6yHhp92mZJ7fJd+qoihi5GLnX2re4mVkKCBe61XncV7j3CTwX2BlWx1cIxtZXZlhW9hd25yb4mKko6DbpOSZnB1dXFhZ21mX29oaW5nZFdUXWFaUlNDOUpJQEQ8PjxARkRDRUE9PDw8PkBAQUJFRkdFQENJU1dZWlxdXl5cXl9hX15eXVtaUkM+OzkxNDc4NDUyJiMfHCAxJyAxJyAnNB41LSY3PVdKLTwoPTEpM1dARiEcRzpDMS4rsNPGxrKzn5yijqOioqyutq6osaWoqaatqqqnoaOdmaKVn6Wrn6Gln6ioop6dsKyXmpapp66rqKannpeUmaOhkpShrZudp6OvraWutqu6zrGtpq6rlpWcnaKYnq2rnJagmZ2fqbOrq6ucraulo6yarrGhp6utpZekqaenr6CQlKKimJOQhKRqpHWJeql0erJwgqaKmYxxiaCahqRgYVKshX+ug5t2rYKohoWfe5mXhXpmgKOJpJiGgqN9qX6BloiuX3ypVp6jkoF6o5+Ae8OuxItyr7OzuXFiqa/CdGiMjJiOgW6clXFvenh5cGxmZmVycGZ9amNdV2BqWFlVTU1RTENDQUI7Q0BAQkk8PTo5Ojw9Pj4/QT04NjtETFBSVFZYW15eXVxeYGFgX15dXF1bU0lCNjc5OTY2NCwmJCIgKCciKy0iJC4hMy0mQERXSCxHKzU1KjJQS0wjIEE5RDQsJ8PJ1tS/oZmrp6Cuop6vtLCuqayip6WpqqqopKagm6Senaanp6Ocq5mirKGjn6+hnZqSq6S0rq6gp5qdlZOmopGboqigoKadsaamqbKtt8mytaqrqZaRnJyimJ+ls5yZoJSdn6esraWwm62ro6OqobKtoamysKGZqKesrbOhkZShpZaZkHupbJ6Eh3WreXywb4KljImflpaglYHSuLS3yYGBsl9glKmDpYiHoHqZlZp4qsl0maSUqamQkpuNgJ2KmsbGeWehgqV0gZ+Ogn2vXW+0YrB1S6OHbadHgpNkjpCeknxxmZWBcXt1fnxuXGZqc3FmgWtfYVlkblxfWUlNTUtFREFCPkE8Qj9JOzc5Nzk5Ojs7OzMuNjxBRklMTU9RU1daW1tbXV5fXl9fXlxcXFxcWE1CNzU2ODUvKSglJiUkJiksNEVOUFBNRktKVkYqTDAvPS01T1RRHRw7PEYyLCSnpMDGuK2osq2spKKbsrisqqClmqikqauqp5+mppiqo6Cvq56loKyanqmlnae1nqKXk6mqtbGsm6ScoJSPpayRmpyno6Gqp66ipqiqsbXDsrOqrKiTiZecpJqho66ll6GVmZylpq2csZ6uqaefq6K2rKCwuK6dmq2msLGwopKWpqGYno2CnU54moF/n3qEo32DpIWHpp+dn5SEuHt8ebmCf8zGwrZ4m6GRi55+mpaXinafl4qll6Spf7CFnYaghKx9mpVjpm2kcI+FkIF8loJyrGCjcnCAmmC8fVJVdI6So5Z7fpSTjHZ7c4eAcV1tbnhyaoJvW2Rfam9jZV1LTVFUQUlIRkk6OUs/QjEwODg2Njg3Ny0qNT09P0JER0lMTlBUVllZWltcX19eXV9fXFpaWllVU09IQDg4Mi4sKi4rKicnP1FUVldXV1lYWFdVT1VGPEUzOlBbVBwbNj9ILC0gi4eYqaukqriqrqCboKyys6WeoJWlra2tqqecpqebo6ihs6+jqaeyoJiopJSitaKilZeiqbS4o5uhnKOSj6GxmZ6cp6ahorCunaapo7azxbCtqaypkYeQnKecoqScpZaemJmapqWrnLGir6WmmK+ku62htbWsnJyzsLavsKSVnK6eopyFj9G1w7d5h46FkZOQgKZ5lKF3jKCShKWCinGqhoW1bnJpmqSclYqffZiZhoePc6+CppujjqaLk52LlZCbbnGyXaV0k3qcbJh/e5l8balhonFxfp9ic7K4aHePlKaYfY2OlY56fXmQg25qeWl6c2+BdV5lZW9uZmhgSltYWDxISEBVNEBGPjwqKTYzLjAxMykmNDo7PD0+QENFSUtOUFJUVldXWV1fX15eYF9dW1pbWFVSUlFGOjIyMy8vKysoQFFSVFVUU1RWV1dYWFdVVVVVUU9RW1UlITJBSCQpJZJzjIqtvb68ubSelqekrbWhoZiVo6emrausmaajn6ahobaoo6mnsKOUq6OOpa2jnZCZmqqzs6Sco5yokZSXrp+gnqeknaidtpqjq6S2rcSwqaupooyEjpyioKailZmZnJmbmaemqJmtqK+jpZuspr2slLyvrJ2hrrC3qbCkmKevoaaWeaiQfXywd4qApKWInG2ycKGHrXyhj4OolZiArImFroWglaqgopeGn4GalYB7kn6rgJ2al4uqd52gkoqUkoF6r16kgX2mp2Sdf3yXcmqvXaRqcIaZXWBbjKBtlZGmmYKVj5qOfHyEmoBrboBjf3RugHpgZ2Zxb2loZ0NaYVs9S1UzVThCQkM4JCQzKycnMywgLzY2NzQzNTlAQ0ZJS01OUVNTU1ZaXV9hYGFhYV1dW1pXU1BPTkk3MDQyLiosQVRWVlZUVFVUVVVUVFVUU1RWV1dYVlVVUUhGSUojKCi9kpqDqMXBtsCznpqsoK23paOOm6SioLCwq5+loJ6tmZ+5oaOroK+pmq2hkKuopJaJm5CtsKymnqWbrZeYj6yhoZ2loZqlna+Zoqmnt6rBr6WopJ6LgI2bmp+mnpKUmJqUm5qmpaabqqytpKSeqai+pZbBqqmhoKqwt6mrpJ6yraaol3WvfpCLnIWHfrqtipllsI1lla19oY+Dp5WagayKhLCFppqkoaKRhaFdbGuBs2B/rXt7g4GxbWdumZmNibFbfrVcpIRryKJkn4B7u1d2tVmyfVKugHqsV4ChbZePqJuMmJKamXx6kaB/ZHV/Y4Z4dYF9Ymtocm5nZmVQVWRcQVZgPkkoPjk9NCEiLCUfMi4gKjEvMDQ1Nzk6PEFDRkhKTE5QUVJUV1peYGBgYWJeX1xbWFVQTkpHQzU1My4vQFVZWFdYV1hYV1dXV1ZXV1ZXWFdXWFlaWltcWFdXR0I70p+ysba9urPBsqKcrKaktaigipqgnZyzs6qfpKGetpmhtKiqrJ6wrZ6rnJWvp6GOiJuPr6uopqGlma6SmI+omaKdpZ+apKOmmqGjqrOqva+kqJ6djn2Lm5WgoJmPkZmbkpqYqaCjmqmuqKWloqSoup6fxKWjp5+psrOqrKSduauqq5SAqZKjr46bgIekl5mQgoC4w7qDjpyThKeXnIKsioKviaecm6arkX7WvcKqYqS/vX1+o4KD17u4tYaWlISevb6EbaOCb6uEbJyAerKwx4Npq7C8rHd2ob68c4CWjqadkZySmqB7g5OefGN+e2WPZ3qDfGFsZm1rY1FhW1NqXEBVYkNOKT06NC8fHyQfJTIgHSQoMDQ5NjY3ODs+QUNFR0lLTU5OUVRXXWFcX19hXmBbXFlUUU1IQz89QT81PVNZWVhZWVpZWlpZWFdXWFlaWllZWFlbW11dXFpWWFRXWruVs7Owv7ixvLKinK2mpbKmnYuYpcCquLKoosCnqLOdn7Kduqifrq+lppWUsKuXjIKbka6loqygo5yqn5eKo5Onnqecm6GppJmgoqyuqrqtqKObl5J8iJmRpZuSjpCXmY+Yk6maoZmqqaGqp6CjqrqdqMOin6yhqbCyqK2nnrilrKyZc3aqpLiGZImgcGiukYuQbm53pJCZn4F1rpmUcI+LcZaopJuYr6RzbW1tZot4b26CmXCBempxaWeKmJaZcmlqhYhncYZkXYhiam9ZXGZ9dqZfYXCNkG5lZX+Mk4+hmZmak5mhfYmRmHdmiHhpj2x7gHplbWRobWNLZFhKa1o7UWZGUSdLOisjHCAbIywpGBsYLTIuNTo0NTc6PD9BQkRGSEtMTU9RU1ZcV1pcYGBhXV1bVFBMSEQ9OkFCN01YWlpZWVpZWFhZWFdXV1dZXV5eXVxcXF1eXV5dW1tVV16playzqLm4sbOqqaGtnqOyqpiSv7PFy763q5/Bra6koqmtoLqjpK6sraWNlq6pj4uFlpasnqaqoJ2ko6CRi6STp5mpmpekq6KXn6emqLC7q6yam5KSfISXjaWYjZGQmJSOmJWolaCZqaObsKadoqu5n6+/p6OxpKqur6irqaW1oqy2lYqhqaa3nYmWo5mIqpuRlZ2SqbOZmqKqoLKWoqGdn6KdoaWilaynjZOTjYeTnJyVkZmTmZGPloaBpZuZlo+MlJSMkIeEfmeJfnSCdXOHinCnbHqTj5ORgIGNjpCPnZWil5qZpYSJl5F0a5F3cox4eH16am1mZXBlVWBZQGpbSGRiUFkrRj0rJyE3NTAuHxwhJTIoKjY5OTQ2OTs+P0FCREVKS0tNUFBRWFVXWV5gYWNdXlRRS0VDPjk9QEFTWFtcWldYWFhYWFlYWFpaW1xeX19gXl5eX19gYGBfWVlgppapqaS0ta6uorCjrZ+gtbGQjazIvsa7uqujpp+dp5+yqqS3p52ptaenkZitoouHiY+bp5WspJ+ZqJ+ekpSjl6iaqJqVp6KkkZyomqG2u6eqmZqQjXyBlYuglIqVkZaQj5SXppGgm6mgnLWjnaaqtqeuwK2itaStra6qp6awtp+supiRpaOntqKSnqegjqqgjpOfo6uwmqCjsKiwl6OgnKOqn56enZesnpOaopyUkJarmo6ZmZeRl6CSiKGel5WHk42RjpWLgX5li4V1hnR3h4JznGqGjpKTj4l9i5WSkpiUo5SfmaSFiZuKfXSXdHyMgHN8gGpvZl9xamBbYFpuZFBhZlFaOkdHRT4yPT45LyomKykmHSYzMTY2NTg5PT0/QUFDSUpHSktMTVNTVFVaYGBpYWVWUEtBQ0I6OUVNVlteXltaXFtbW1xdXV5fXV5fYGFiYmFhYWBiYmJkYlxbY5eVo6air7GrrqOppqyfp7WqkJCdpLW9sK2to6SbfJ+ks6WmsamXm7imo5SZqpyOhoqJnKKPrp6ilaifoJKWmZuui6qWj6qaqY2aqZCfubakpZmcjYh5gZOLmpOKlJGTkI2Sl6ONn5+onp+4on+DrrWirq50oruhsJ52eJ6nr7iTdKujnol/q39kXGJ2oI6ln4SYfW2Ss52ipq2qo2Wdn5JzeZqXcYGZqZhtf6OoimWcpp2Sl5iWjJOdkYaem5GWhJOIkJCSiYV3ao6GdoVweoV/f2Boh4qTkYpadZSQZ2iPj3N8qJycZnubioV6mWqGjIRweoBrcWZgd3Bsa2lcZmZiY3FUWz5OTk5TRz5AVUQ6MS8eHyY0OjMwNjY3ODw7PkBBQUZIQkdGSUtNU1RVWVxgaGZnV1FKPERHPDhVUltgYWJgXl9fYGFhX1xdX19gYWFiY2RhYmFhZWRjaGReXWablaWioK6vq6uppaitoqatpZKVq7exs6ebrKitmHSNn7GgqKunlJe5oKCPnKSekX+JiJuejKuZopWnoZ2Ol5KdhXatj4mnnKqSmaSKnLuzp6CZmIuIdXeSjZaTiZORkJSMkJShj5yhp5mcsZWBjJu0nLOMko25pZ99p6J5oKy0f42NpZ6Di4aQsaqvjYuXpJt6gYushZyeoaaop4eVhZh3pZt6h5yBl6eDgnuds3qKhqGYmpWYloKRl5eEm5pjeoeRhY+QkouDbXCOh3l/cH+AhH2Fc4WDlJF3lmiSdKCadH2ZhKOgiZh/lY6HhpprkI6HbHl8cnFoZnlwamxrXGVsamd1XV5JVExSQEU2LltVVTcpITA5Pj43NDM0Njg7Oj0+PkBEST9JRUpMR1NYW1lcYmFoZllRSDlFTDs+YVZeYmRlZGBhYWBiYl9dYGFhYmJiY2ZnY2JhYGVkY2djYWFonJeinqWsrKunrKCnsKamqaaZk6/JwLKil6iqt5+RhZ+tnKeioI6Qvp6ajZ+aoJB9ho6Zl4ernKKWoKGRjZOKhYCSp42Ho56llZmeh6C6saeem5KOhXB2kImVkIqUj4+bi4+SoJKYoaSWnquHn7SJtJmtisqGqKyItoWMr4Guq4KojKaYjZ19qI9ze3ecj6eXaJWkebSLoJ2lp5KYwoB/q4iYoXKegJqlfpeFlbOBoX2hlKGQmJeBj5Sci5mSjH2Fk4eOlpKKg21zj4V+eXGGgIN7g3SEgJWAj8Vmf6mHj6NrnoWknYWagY+RiYyacZCVhmp5dnx4aGl2cWhobF5kcG1nbllnR11RTTNFNTdOYmQ3JjM8RUdEOjY0NjU4Ozg+PT0/Qk0/TkpKTENQWl1cV2Jeam1cUUU9S01ASWNYXWNmaGdiYmJiZGNgX2JhYmNjY2VpaWNiYmJlY2FmY2JiaZSWoZ6vpqeopaufpLewqaunmpWgo6WspZimrLmksIGiqZ2mnp2KlLyak42hkp6PeoSWlpGHq5mbm5qihY6Md5qcj5+QiJ+lnJiamYijua2kmZyNjH5ibY+Kk5CNkIyNl4yQkqCPlKCgmaGnfqGnh62dn5Wtj5ybnJCEf6CMqKyFo42pmYyaf6J1gZmUa4Ktdk2reIeNnJGap6aAqat9g6F7eqdqnn+SbGeYhpi3iZ5+bmBkWYOXgI18ZGiLcpl9eZZsXX2Xbl9ScINcX2t4gl9YZIB8g3+WcKeqa4OjbnKlcJ+FoGpnoG1ccI5+Z1pghIFjWFFwd2ZudnRsanBfa3FubGpZaU9dWEY5QTVIRV9sNSxJRFJNTj04NDg1OTs2QDs7PkJQPlFSTE1CSlxdX1ddXmN2YE1EOk1PTlRhXFxmZmlpYmJkYmRkYmFiYGNkY2FjamtkYmRkZ2RiZ2VhY2iXlZyfuJ+po6askaG1u6quo5mYoaKlra6hnrC2pKmToqGgp5yajpm0mpCLnoyVi3WBlJKNiqeVlZmen36ThYWspYebkIuaqpmbm5KJprGnoZWaiImAaW6Ih4uOjomLjZKLkJOjjJSfn5uhpH+TgY+ioJOgdpyUjqeBn6V+haeqgqV4iXyEmn6icHOUiJZ8n415bYabjJmPmqiZjoede4Kic3amZp5+d6RfmHp9lHSibpi3tLp0k4iDgLWoZIHGuHtwlbaMcoCao2NzrKtgfGmds35tfIaBjYKLmHF/o2xyo3SfhYGkYJ2atJdzfZifs3V0XJ6yg2tjcHV4cmlwWWttdHNnXWpeYkxFPUQ2UkJaczM9U0dgSlI9PDM5NTo6NkQ7O0BKUD9VTU9RQEVfX1taWGBgfGRIQzhNV1VXYmFaZWZra2JiZWFkZGBhYmBkY19gY2tuY2NkZGhkYmdmY2hok5aUoreYqpuTn42kt7StrKCaop2kpKavnZyzr62UmaKboaWam5Weq5uLiJJ5i4VxgZaOipCgj5KUnph9kYqOqKGHl46KkqSVnZuNjKmopZ6Pl4eEfmp7hn59j42Ci5CQiY+UoYOXnp+cn56LiXecmKGMn3Ghioaph5qjjZSlqHytjH56oJl6o5N4gXSWiI2cfZafhpuOmJqlhaJkoXyIlpCbjW2eaJuOb5qZe4CLp35zaXSrg5+DdKpolZpdm4V2hZ5nqmuAuGZcqG+BnGCVjF6ndnWHiH6dZ5p1hpOSl46An2+akW+oml6pf3m8bH+qXI6EXbRoXW9ye3hsalxxa3p6ZGBnWGJCUUZPN1dEUm81S1tbX05aREAxNTE8OzdIPzpDSFU+WVJZXT5EYl5WYFFhY31qRUI5TlxeWWRmWGZnbm1iYmVfYWFfX2BgZWJeYmRvcWBkZWVrZWNpaGdraZWbiKmzmqaIY5Sbq7qxsKyeppycqaCfr5yesqmun5ilnKGgmZeWoKOZhomNaomAcnuXiIuWloORlJmQeouElaScipWPho2fk56diZCpo6CajJKKgIBpgYZ4f5aMeoiOjoiPlpt/k6Ken6CTmHJon4mejotwkoyAqYaXnaCknqV7sK2joriXd6Ozo6SAiZR5nXurmX6ijpyaloiXcaF8hY2vtX1rmpGheX6ZtaOkq6iEmXybfZ6bf3SqWl1ve5aLeJ5iTH97eoVjeZdCTJ9Yomlxe45sgIiDmXWbeIaJsbN/gJuTp3eDnm50fpVwmnRrpF6VdkhlZGF0cn9/b2ZhbGl3fGVlYlFfV15VV0BaRlFoRVRXXWJYXklEPUI4QEE6SUY4TEVYQVdSW1dERmJcWmBLYG19ckVCPFVfYlplaVZnaG1vYmZnXmFhXF1eYGhiX2VkdmxdZWdma2RlbGlpa2mTnICvrJiDU16gprO5srKpmqOMnKycnaqVoq2lo6mQoJ+dm5qWmKGdloiHiXeGgm95lYWRm4t8kZOXiHKBiZGhm3ORkIGJmpahnIaPqpyblYuLinyDbISFcYGhi3iFjYiHk5mWfJOjn52iiK2GfbWEjZ2ce6WVeamAlJqOiJ6ae6dod21+mXShc3J8noaZcJODrn2jg6WdmICjb16oZ3WiY2+lYZzTkH17mXhzdGKihpF/o3SkkHZrj7OMYIKYiXOqsqi8f3eDbX6/pqm0XZxte3CWbX9yonFdpGdzpmBopm2b1Jp9hptwe3uYbJx9eJhzbqmkZ2FmenKBhWxoZmVvd3hpYWNTXGdSUmJIWEpVYVhUXGZrXGVRRUNLTUpLQktFOE9AUU5YU1lPU1FgZmVqUmR3eXdJRkVjXmZaaGpUaWhqb2NqZ2BjX11dXV9oYmFpZXxkXmRnZGtkamxmaGxol5p/r6tUW0p+qa+xs6+yo5uZhZmqoKKlj6apoZqri5uZmZSZk5OhmI6IhntwfYRofY+DlZuBd5GOj4lvf4aPk5Jsl5R8ipOUpZeDj6ublJKLhol5g3aIgG6Bn4Z3gJKGiJmjl3qUoqKZn4mzoaK2i3msp6SupW+of5mNhYCZj3qkf6GZhphynoSkrq+Kl4yAjaSNlYKtoJN2tba1yaFzlIuBn2Cel6ltepWHoZx1ooh3oH6TmIuBcE1mo5JwmodzpXt5dGGDgWt9oGtxZF+ccX1zlmh6abO1s8amcph9ep1rnJurdoWbbnh5mGqafHaZc1FFfbNfandseohna2hjdXZxb1dfVFlpUVNpSldNWVRWXmlsb1ZnV01LQUpNS0hLT0JRS1BlY2ptZXRyc395fG51iXt7VFFPbF5pXGtpUmpoaWxnbGZjZV9dXV1eaWJkaWt7X11kaGNqZm9tZWlsZaCbh66lg2Q/k6Gyqq6vtaKikICYqqKjpo2mqJ+ep4SbmJeOl5CQnJOOiIN6anmHZYONf5igeXWPiYyCaYSFkYOMhZ2Neo2Ml6eUhJiqmIyRi4KJeoB9i3hwkKGGeYKVh4mWoJV/lKSmm5WVg2ZueJxsomR7cKV3m5dwZaaAlIl6pHmfloOXc553gYqVl4+5bpGKomJ9mKCUiG1yaaprdaBtb6Zgm2mLkGmWh5uWdaKBfppgjIaNdW+IYmigZZ5+aZt1b2NmiIFtcaJZXlpioWxdiItten1zcWSlbXiiZGenaJlzjJlwonBViZBwoGBmqFWLXlSYbm50bHODbnFpa3l0a3BSWVdXZlpUbUpaUF1JWGlpc2pZa1ZRUkZWXUxYU2JVaWtfeHR7fXB8fHKDe4Bzdo2AhHZeUnJiZ2JwZ1BqaGhsbG5oZGdfXV5dYGpiaml2dF1cY2hjampzbGZrbWOco5eleWRzbIqmraOpsLGmn4yAmKyen6eNo6KcpKOBlpmUjpqQjJiQjop7h3GAiGiLi3yZm3N1iX6Qe2WDhpSKiZWagnyJiJiokoGjrZGGkIuCin6AgI5yaY+mhH2Hk42JmKCPh5OppZyIpniVm36liJaKsZedj4Kulp6kdpOFeKlzpY+Emm6kooyShI2Du259pa+DhoWGk5Wbn3ylenKolaCWZ55+b6xkloqWk3eobaqigYl2iYN4q5GmiGuRsGt2s4ypa4qFbW2fnpGUX32ri6p2fX6KpJ12n3yDpJWdoGqbiHisaJ+ujLZ1eL6NpJNag6eOq2F2c3VyfHVxY2t/b2htVFdbVmFiXWxNXVJeSl5tb3dgW3FZXGBbZ3Vlbm9yYnJ0YHh6fnlyeYNzhH6Be3uMgYOAdmJ4ZGRuc2RSa2dob2xyamZpYV9eXGFrYmxsem9cXGJpYmxqd21nbG5ilaSpm4B/naOWqamdqKatpJmKg5ism5+mipymnquehY2bkIeckYaSjYyNdId7iIRwjYV+mZN0dIZykYNuf4uRh4WUj318g4eZp4+Ap6ePgY6JhZV2goeSbmyLqYCDi5SOiZyfiYyTqaKfjn90k5eIfoF4k66ifoGacI+Fdo6Jgn17cqeMcX59epiWm4SQeXt/foeUlZOKdpCYnaCDe32Ja4yFW3l5cnpxaW5+kopygHWBj5SUcYeEg2WMf2CBgIt3dXOUdW95bm2HbIOGXnVnd45lf4CFjKeZfXR7lWqJiHCBdn2Hd25uaY10enyYeIVcbFh5j2lveHNzcHh4cF1sh29qaFdbYFddZmtkV2NVX1JgcHl5bWt3Z2pra3d9cnN1c2FvdmJ0e4J4dXmCdn+AgIF5i4WDfntuf2xkeW5eVm5naXVreGppaWVcYFpjaWVscXRuWltibGRsbHluaGxvYY6TtqemiqChmqajmKWcq6KhhISYrZKeooqbqJuqmIOCnIx/l5SHjoqJjXKDfI99fo+Ee5iPdHKEcZWFe3yRi4aGkIV5foCJm6WOfKihi4WPkIWVgoaOmHZyhKmGjpKdkImfnoiMmqaen6qDiI2Vmn5+iJasp46RpY93bpuOgXiQbn2ohXF+lXFrcH2CoI2Ak46LaGxcgouLm5qejnOVi4hxdGuCd3SBWXJuh5GCfn+MaV1qZXuGhIqAYGl5e5t7gouCdYGFgWd3ioZqYG9xgHVecYmAiI6lk4Rli42DbneLhHGGj3pxaGlmfYR7lltda2hudlx8enh2b3Rzg2hdbotsbGNaWl9aWW1yXGBiWl9eZnR/fHZwdWRra2t8fnN8eXVkbnVobXx+dnp8e3l6gIF+b4WJhHt9dH55c39pVFxxaWx2cHVna2dkXWFYamhra3FybldbZW5sZ3N5b2hqbWCLiqivoI+ioJmenZeemKijon6Dma6OoJWInaORppWAfJmGfZKZiomHh4tzfoGMdoWLgoSXinJvgHKYhoR+kYOEhoqBe4GFjZyhkYOoooh4jpeJlYqLnJeEg3mtgpGYmpWKnp2IiKCpnqGho4qHk5ucopmVqaCmpJ6RmoWTi3l2jI2Dp35/kpCTlJ2yppuVn5CNsZKXg6SLjJSan4mQm4KIkYprfI53eGWDh5GLfImehIeMkYmJgYWFkHd8enSaoImGip2JhJN+fYqAf3Ruc4SBfXaFhomOo4+ChIyGgoyQjH2HjIuRhHpuhYZ+eplrc2lhdItxfnt3d3B3dYJdXm+HaG5hX1pdXVNpcVZlXV1ibWh2fH10b3Bla2ppgH1ueYByanBxbWeBe3OCgXh/fX+Fem2CjIZ8enh7fXqEeU5kdmpzbnB6ZWtlY2JgW3RlcGdycW1WXmx0bWh5enFnaWtkjIecuJ6WoaCXlJiZlJikoJ58gJqsj5+OhqGdjJ6WfnmVhHyOmoqHhISHbnmBgXOBiH6JlIRta356l4eEg49+gIaEhn2IhY+cn5SIrKCEc4qQhpKRi5yRfY16qoSOk5iXj5yWh4abpJ6hmZyFgpKamZiPmaafpJybj5V+jod0eoWNg6V7fY+QkYaYq6GelJ2QjqmNkICdi4iTmZ6Cj5d+ho6DcHiGcnVgf4SQhnWNmYGDkIOHhX+GhZVueXZ0kqKKjIWahIOMc3+JfHtxcHqGgnp2iI2DkaSOhIKOgIOKiYp3homLjX5yboCCfW9pbG5oXnqAaH59d3Z3dXx4XWBxfm51YWRbXV9SZ25UZlxeYmtpd3t/cmxtZGtqaIF/bHSCbG11cHpwhnluh4B2goB9hXZxgo2Ifnt8fH98gotgaHtqdWlpgmRqY2BpXGR1aG9idW1sVWNxeWVwentzZWptbYuInrWZoKKekpGVmIqan5+fe3mfp5Gci4emlYyYmXp7jYZ9iZKDjYOCg258gHlzgIV+i5J9a2h9gpeJgYiNfH2GhYd9kIORnZ2TiqmdgXGLi4yShqChiYWMfKeRiZCTmJSWk3iMop6fnZWYfoCQmpiSi5qioKKYlZCZfIuCd3+Cjoagf36MjY98mKSiopOakZCmjI6BmpGJkpabfpOSfoeOgXV0gnF3YX6BjoZyi5d9iYxyjX+DhoePaXhyeIyYkY9/ln6HiXKBhnt7b3d6iYN5eI6LgZSjkoqEj3qGhoeEdoOEiYl8aHR+gXp8cm1saF9+c2l9dnZ1fnOBa19hdHdxeGVkWV9fUmtpVmZaYGFoand6gnJnbGRsaGaAgWtufmhvcmx/eYd7bIyBc4GBfoJ0doKNhn98e3+Bfn+PaXKDbnRpYYdobGJfcVZ0b2xuYHhobVdqdHZjdXp7cmJqb3qJjJ6wkaSknI6Pl4+GnKCbnnx3paGOmIGNo4uJmpZ5fIaIf4OKf4mDgX9ygHt0doKFfouReGdjfYaXioKKi3h9gI6EeZeDlpmYjpehnH9wi4GRk4Wlm4iNiYOmlYWTjJeYkpJ3kZ2foJeTlnl+jpeXjZaanKOcl5GTmXeNg4F2g5WNnX6CiY2Mc5ejn6KUmY+PoYyKgpaXg5KVmX6YjXyIjYF2cX5ue2SBfYuFcYiUgJKCbImEgoGKhWZ2b3uFkZiMfJJ4i4d7f4Z7enB9d4iEeIKOh4mWn5SBgop2iIODgnd8g4qHeGJ6en91f3hobWZif2preHR1d35yfWRkYXNudXNuYVphX1ttZVNkWWFhaWt2eodyY2tjbWZofYJsaXVpbnBpgH2Cem6QhnJ/g4N/dHyDjIF/fnqCg358kG12iXN1bWWKbGpiYnVWhGlwbmB4Z2xianZwZnl8enFgcmyGhY+brJamp56NjJeHhp+Tl5l+eKqdi5l7mJ6MjJmQeXyBjH59hHyBg4F4dHp6dH2AhICJi4BkX32LlId/hIZ0fX6LgH6ZhpeWmY6lo5mAc4d7k5KJpo+MjoqSoJGEkpCVl5GLgY6XnpqRj5Byf42Rk4icnJ6ll5aLk5Vxi4uJa4SXj5l6iIiPiW+XnpuklJWLjJ6LhYGRnH+SkpWGmYh7ioqBenF6bHVsfH+Mfm6Gk4SVeHCDhH5/i4Blcmp7f5aXg36NdI+HgniGfHR2fnyEf3uBioKKkqGPeIOBdImHfYB0dYKJhXFjfHZ7cn5wYnBkZXxjb3B3c3l4dHVid2BwbHZucF1cYF5ea15RXlljYWludHyKbGBqZWpjaHeHbmdtaWttaIF9e3hvkIhzgIOFfXSBhol7g316goR9fY5yeYp4eG1sh2toX2lyY4dncW9ld2dubGF6aWp9e3hwYXhti4CYmKmfo6idiYqShoqdi5WZfnivmY2Xfp+UkZeUiHd+fIp9fIB3eICAcHV0fHCGfIGBin98YVx+j5GGgIOCcnqAiHuQk4qTk56Up52Vgn2BfY2KkaOJjoqNmJqNhpKZlJWOiYeLkZuSjoyMbYSQj5GInpmhoJaUiJWPbIaXgmWEmI6TeomEkIpwlpuUo5OSiYuZjIF/kJ59ko6SjJmOe4qFh3RzdmxxbnZ9i3RvhpKPk3F1gXyCg4l9ZnFteXyZk3yDiHSQiYBzh3htfnx/hHuDioaBi5Omi3qGe32KhHd+cXCBh4RmaXp1dnF8Y19xYWt0X3Fre3p6bXNxZnpeb21zbXNYW19gYmxbUVhZZWNncXKAiGddamlnYmdxjW9kamhlaWmBend2b46FdIGCg3x1goiGeIV8eISFen+Jd36Le3tzeIJqa19waHSAa3JvbXJnb2xlfGNugHp2cWx3d4p+opehp6Gmm4aLi4GPnIeTnXaCrJaTjoehjZaUkIB0fHeFeHl/c3N7hmxzcHtuinaAgYdvcFtZfpGNh4B/f3Z1gYGBoYeSi5WemaKWmHmKf4CMiJydio+GkpiWhYmVmpCWi4uLjYubiY2Pgm2Ji5CQiZyWoZuWk4SWhmiCoYFlhJuJkH6Lg4uBd5OZk5+SkYmIlIx+fY6Xe5CMj46aknyKgIJvdnBsbW9xfIZqdISPmYtxd4B1gomDemdzbnWAmY56h4R5k5B5dYdzb4d6hIp4iYSAhoyZoYZ7g3WBin94eG5rgYSDX3R1dHJyeVtfcWFxa19wa358cW5ua253YXBwa3JtWVliYWJvWFFUW2ZnY3VwhYNjXWttZGJma5JuYGdnX2hrgXVyc3CLgHV/g4B5doCLgHiFf3iIhneDhXyGjH97d4p/anFjfGOGfG5xbXRqaG9sdnhgcX95fHR1dICDfqSVmayep5aEjYR/l5SDkKB2jKCVk4aLm42Wjot6cnh1gnByhXRyd4lscG52bYh2g36AbW1VUYGqlIaDd353coR7g6KElIOWlJmdk5t5knuDjJKjmZOOiZWZkoSHl5qMk4qIjY6GnIOPiXtyi4WKjoecmp+alJN+knxmg5qFZoWfh5GEkYKJcYOQl5Ccj4+Mi4+Md3qRkHqOioySlox8iHyAa3Zrb2tsbXt/YXp+kJiCd3uCeIONfXpodGxzhpWKfYeFe5KOcXmDb3aLeYeLeId8f4mOnJuDe3p2gYp8dnBqbIKEe2F5cW9tc3RWX3BjcmJgbW96cmlwZmd1dWlybGJ3ZV1XZmFhc1RRT11nZV55cIl9YF1pcmJiZmaRal9oZVtncH5wbHF0in12fYaAdXZ+jHl7hYF4iINzhoV/jIyDe3qUeGZxa4NgiH1vb2t6YGpudX91X3R9eYd4dHOFfXigj5mwnKWOgot/g5qIgI2fgIyalI+FiJiOj4+Ed3R3dIBxcIV0cHKEcGxqd26Dbn19bXRzUk2C38iS1pJ7cHWFd4WihJV4lpKanZGafJRzhZCeoZKTkImTnJSGf5eWiIyNh5CMh5t+jYB3eox+iYyJnJucmpSSeIx0ZYaQhWuHoYSRiJeDhmOMkZmPlouXjI2KinF6k4h7joiKk5GJeYV7f218ZXJva217elyBepGQgXt+gICHj3t7aXNqc4qOiICFhHyUimx+fm1/iX2KhnuDeH+MkpiYiXx1d4OPeHJtZ3GAhW5rdXBqa3ZuVF9wZXBaYG1zeWhsa2NneXNxcWRgeGFgVmxgX3dRTkxiZ2NdenGKdl1cZXZhYmZljmRhZ2JZaXNzbmtyd4x9dHqGgnV2fotzf4Z/e4l/comIgpCKh3x+mHZlc258ZYh+b3BsgFlsbnl5c2B2enuNd3N3ind5nouarpqfkIKFd4iVfn2LnoiGoJKPhYyYhJOPh4F1eHB5cW+FcG1vf3NlZXlxfW15fWpoa2OkmsHcrvCgcmx2hXeGpYeTb5iSl6KWnIKScoaLopeIjZWKkJ2Wg4GWkIWJj4CQiYiVfYZ6dH+Jd4eEjZuamJiNjnWJdWyEh4l8iaKEkYmchIVei5OYi4+JjouKhIlte5WBfYiFiZGPhnaFfX5rfWR4dmtveXNYiXuSiIZ6f4GBhox/emZyaX+JjYmBgn+KlYRrgHVtho+AjoJ8gXh9jZOQl490cneHjHVzcWd1eoRjdW5xY2t3aFNhcmhsVmBvdXphc2RgaX9xc29bZHNhYlduW155Tk1NZWdiXnd0im5cXWV5X2BlZYVgY2NfWWpza25rc3iMfnR3hIF4d3uJcYOEfX6Je3SLiYiWhot/fpdzaHVxeWyMe250cYFXcXp2eXJkd3mHjGl3gIpyf5yGmKeco5KEfXGMlHh5jJ6FhqGNj3yWjYCaiIR7c3hwdGpwgmxqbX11X2F5d3txdXtnYGR869q1ycPch3JsdIN3i52Lj2uakZGelpSCiXGEiJ+NhIuVioyYlHyNk4iDiJB7j4uFjoB/dXiDhHKIgZOblpSXhYt1hn1ug4CHhpehgpOMnoOJYYOUj4eKhoqNh4GHaXyTf32Dg4mOjYJxhn5/cXdodnNqdXhsWo19koSGfoKFgoWLg3dhcmuHgY6JgH5+kI98bYFrd4SNhJCBeoB7fY6QjpSHbXB5jIV0a3FrcnmCYXVqcF5sd2FSZXNpZlNgcXd1YXBhXWiEcnRrWGhpY2lZbldcdk1LTWZnXmJzdIZrXFxleV9eZGd7YWRfXVlrb2VuanR4in5zdIF+e3Z6iHOFgn1/iHd2ioaPmIGMgnuTdWx3dnl4k3RueHt9WHqGcX9vZ3h3koJkdoaGcImWhZmhmqKKh3Rvkoxxd4+dfouaiYp9oH+EmoCBeHJ0bm9kcn9pZ214eFxgeXt7cXGAaWFnYX/Vto+RpnducXh9cpSSjolsm5CKnZOMh3tph4uYhoGSkYaHmI58jY2BgYmNe46MfYiEenN6g3pwh4CVmY6TkoCHdIKEdIF+iJGbnoaVj59+iGJ/k4eFiYWLjX9/gmd8kIB+f4KMj5B+bYN8g3VsbXd1dHd2bGOOgpCBhn99hoCFiYBwX3FvhHuNioB7fpCHenCDZXmBiIWKgXqEfH2RjI+Rgm1ueYt+dW1uamx8f2RpbGtabndZU2pzaWJRY3N4bWNmXlprhW91Y1xoX2VtYG9VXHBPSU9nZlxob3KAbVpcY3NgW2Nsd2VlXV1abG1jbWp0d4d/cXB/fH10eIZ4hYJ9gIh1eYmBkpV8iIZ2iIBveHl7g5NvbnuBd16Df3SCbWl6dJRzZ3OIfHGRkIOan5ughoh2dpR/bXeUmH+IkYSLjpp9jJp3fXZxb2xqYXV9Z2JqdXpaYHh8emxwfmVjZ2dXnY9fcnSXvsWFeHKWi5GAdJmNh56UjYlzaoiPlYB7lIuBhJuMfIqGfXyIjH6Sh3SHhXZ2fYFxdYaBnpSGlI6CgnF+hnOCeoiWm5aFko2dgIhmfZOCgYaEiolygX1nfYt7eX9/h4uPfWmAfYR2ZnB5eHN4dGxrj4aLgoyAeoOChISAa15wdnp9i4eEe4COf35ygGh3gYaJhIF3gnp+lIqOi3xta3qIfHZ0b2hofnhlXXJjWXF0VFRvc2liTmh1eWdhXl1YcIFwdVplY15rbmFxUFpsU0RUaGJabG9ufHBaW15tY1pjb3dkZ1xdYGtqY2xpc3eCg3Fvfnt/dHWDeoOCfIKGdn6JgZaQeIOKdIGHcnl5fo2Qb297gXFqgnl6fm5tfHaVa2p4hHRrk4yFnpigmYWIb32Mdmp5mY+Ag4uDlpiKeY+Wb3lzcWxqZGB0e2lfZnJ7W2FzfXpmcHphZWSOsbJ3S2NapdvSmHN8k42SeoCXjYaako2Hb2yFkpF5eZOGgISZinyHgHl4iIqDlH9uiYZxc317anmGg6WQhJKMgn5ufYF0gXeEmZeTiZKPlIWIcHqShH6Eg4mDboF4aICFeHJ/f4OKh3xlfH6EdmNxc4BpenFvdpqNh4SMfXh5gYV7g2tcb3xyf4aDiHyEh3qIcYBtb4KFjYKCcYN3f5aKjIJ2bGx9hH52emVoan9yYVp4XFpybk9YcnRnYEtud3ViXlxbWXZ/dHBYZ15na3Jgb09YaVM/WmdfW3FrZ3pyXFtZbGVZZHF5X2hdXmVsaGZraXF3f4hvbH9+gXVwgnqAgX+DgHaBhYiXinGCjXF7hXx6eYSUjHVren9scH51f35vcnx7k3BvgX94Z5GKgqGYnZKDhmeHhHBnepeKf4CFgpqKgnyNjWl4cmxsZl9hb3puX2NweV1kbIN6YHB2X2Rl1eu+izM6PoyPgHN6h4uRj3iFmY6AlI+Nf25thYyLdXyPf4WClYl8g3hudoaFgpV2bYeEa3R7dWV5g4SnjIOOi4J8bX5ydIJ4hJqPio+Rko2Mh397koh5gIWOg2yAcmmAf3htfHyBioN3YXmEgnJkcWl/bnZydYOdjYKBh4B0dn6Ac4FwW2t8c3eIgYl6hn98iHh5cGqGgo6CiHCAd32TiIl9c21qdYCAdXVcaWl5cVlXflRbcmZNW3NyZlxKcnlxXlxbWl12gHZqWmJbaGZvZGpOWGdSPl9mXF52ZmB1cVtZVW9kWmVxeVtoXmBmbWhqa2hweH6ObWqBhH95boB7fYF/gnt2goKMk4VwgItueH2Ae3uIk4mAaXt+anR8coZ7c3d+f4x6eIR+fGuLjIObnZaMgoBtjX5saX+Pjnx+f4OUgn99iohrdXFnaWNbY2dzb2BibHVhaHCJemFzc15iZJugkG5dNluwtnVrgYt/lIh3iJmIdZCMindwbYWChnR5iXiJfZOIen9zZ3WHfXyWbm+FfWh2eW5leomFpIeAhoyJfW19dH1/e4qXhoCTkJiJi4WKfI+KcXx+hnxpfm1rgHt5anp3goeBcl93gn5yZHJodoNudXyGlpOCfoOBcHh6fHV/bVdtfXVziYCFdoZ1gYl6d3Jsh3+Of4NxfXt8kIaHeW1taGyCgXRuXGhmdXJSXHxPXXJdT1xzcGRWS3R5a1haWVphcoF2Yl5dYWdkaWpmT1ppTkFiZVxhd2FcdW5YWFN1Ylplb3NYal9iaGtnbWxpcHd8k2xphIp9fXB/fnyBf4J7d4CAioyEcXuHb3J3g397iY2PhGp+e254eXaLd314gIKHgIN+fnpthIyImKONhYR7dot5a22FipJ5fnyCkoCAfouDcHJwY2ZeWGdfcHBgYWhxZmpviXRhc29bYWNqdnt/v52opcq5coeGdJV+eomVhHWSjodyc3CDeoJzdYZ0iHeUiXl5cWN2hXh/kmhxg3ZmdnVjanyEiJ6Cf36OjXxxfXKCd32PjoJ2lY2UkIiCiHuJimx5eoB1aHtpbH95c2l6doCDfWdgd4d9a2p0aHyBanaBjZKWf3x/f3J9d3x1f2JVdXtxcoeBgXuCcIaJd3dvboGAi318d3x6c4yEgHRncGdriIFxb11oY3RvTGZ3TV9vVlVadG5iUVB1eWNTWFhdYnKDdF1iXGllZWRsZVFccUlEZWJcZHJfXXhoVVdWeF5bZm5pV2xeYWpnZW9uaXB3epNuaYiMeX5ze355goGCfHZ9g4iGg3B3g3Nud4KCfomLlH9xgHx4enqBi3WDeH+BgYKEeoB1bn2Ji5ueiH6Ge3eHfGh1h42Ren+AfIqGhHePgGdwbmBlXFhlWm5zYWFhcW1saIluYHNpWF5jbYB3qdqpyIeIs3OLenGPd32JkYJ7lIuAdXR1fXZ/b3B/boV0lIZ4dWxgeYB4h41kcYJuZ3VtW219gZCTgIB4kpF8d3pshXN9j4qDcpWKkY+IhoZ7f4ZudXd/bWh3ZW18dm1rd3d/f3xgYniGemh1dmN+fGh1h4+Ol312gXdygHt9boBaVnF8b3OBhX1/d2uIhnN4anN+goJ8eXt3enGJf3pyZnJkbIuDbHNaamB2Zklvb01dY1hXVnluYlBTdXdaUVZYXmFzhXBdYWNuZWReb2NVXnNHQ2dgXmdpXVp8Y1JWXXZbW2dsYldrYGFuZmZscGhwdniPdGuOjXZ/d3h9d4GEgXx1fYOIiINvcX91cXV+hYGJjYt7d394hHx9hYd4iHx9gX2EgHt+cnV4i46fjIl7ind1g3pefoeajXmHhHSGh4V3iXtibm1cYltbYVZqdGRhXGhvcGeHcWFxZldcY2t/fMrOh7qia25vjG5zhnN+hoyAe5KFenl0eXR0empsdmOEdpKCdnBnXnyAeIqHZHGAampxY1hte4aciIKBcpeTdn16bYZvf4iKhnCWjpCIhoyEe3l/cnJwfmdocmNueHFqbHJ4fXx5XWR5gHhpdXlngndodYiMj5Z+c4hrcH+AeW59XVdvfGxyfYh6gG1uiYBwdmZ2fn9+gHR6b3lyhXp3cGRxYG2MgWtyV2tfeV1JcGxOWFZfVFV8a2JPVHZzUlJUV15jdoZqXmFra2ZjWm9iWWRxSEFpXWFnX1xWfF5PVmZxWltqaF1YaGFfcmZqaHFncXN2h3lulIp1f3t4fnmDiIB1dH+GhY6DcG97eHd1eoaFhoyGenx/dYt/fYaEhId/fn59hn98eHZ5dpGUn36NfYtudYB6ZISImIZzkotwhYWCeoN1Y25qWWBaXV5UaHNlYVlkcnJngXJha2VXWl9pf3i+rnugt25jdYhpdn1ze4WIe36NgHd4c3duenZlam9gh3WOgXNqYl59dniKgmVwfWdra1pWb3iLo4GFf3CZknB/dnOAbH6Aj4ZylIiNiIWJhX15dXNwaXpham1hbXZqZ2treXd6d1pmfX14ZXJ+boV0ZnaGjYeXgHGMaGx7g3VtdWJbbXpqcnmJeoBldIZ9bXBndH12fX5wemp5eX93dm9ka2Bsin1sbVVqYHhWTGxtUFNQaE5ZfWhiT1V2bE1RVFVfaHeEZ15hcWlnYFdqXV1sakpFa1tjZVdZVnpaTldva1ldbGVcWmVjXnVmbGVxZ3NwdIF4cJmFdn9/eH98hod9dnSCiICVg25zeXt7c3OFhoiIhHmBfXaPf32FiY6EgYN6fouDe3d8dnaZnZh6ioOHanZ+fW2FhZWBco+CcYaCfoKAcGZsZ1hdWlxbVGVxZV9YY3N1aXZwZWVjV1tbaH9wb3KAc4plZnqAa3Z3dHWFhniChXp3dHZuanpwYWhrZ4Z0jYRuZl5ee215iHxnbHdmamRVV3NwjqZ8hHt2lo9ze3F6eGx5eY+DdZd8iIaEh4R9dXFzbWh1XW1pYGx1ZGdnaXpve3JZZ4F2dWhwgHiCdmJ3hYt9loJvjGxufIFxZnNlYGp4ZnB1iHl8YXSDdmlrcHN5b3l4cntlfX19dnVtYmRgbIZ8bGpVaWJyVExrbFBNT3BIXnxmYU5WdWVLT1NYYmx4f2ZeZ3NrZWBXZFhjcl5MTGxYZGJVVFZ0V01Zd2VaX2xhXFtkZV92Z21icGp0b3F+dXSZgXh/gHiAfoaEen12goN+mIVucnR8e3RxhYWPgoB6i3Z0kYB8gZWOgYWEfH6Mhnp+gHZ6o6aKeYmGhWx1fXx2hIONe2+Gc3qFfYKDdW9qaWVWXVtbWlNjb2VbWWF0e2pobWhgYVheWmmAaWxvgGhtYml7emt1dXVwh4J6gX53dm56aGp5al9lbmiBd5CEZ2VYYXZofYZ4bmlvZmZdVVhvaI+odoF6fJCNeHRufW1xdHiNfneUdIaDgIaJdmp0d2hpb1xtZV5uc19nYmp4aHttW22DcnRqb4F+enhid4WFeZGGdIlzcHp/cmNxaFttdWRvcYZ6d2Fyf3BnaXdzcWt3dnN1YoJ5fHV0b2NiYWx8fGtrVWliZ1RMbmlQSFNrRmJ5ZmJNVHJeSk5VWmZteHtmX25yamRdVmFWb29YS1RpWGdeWE5WbFRLXXpgXF9sXV1bYmZgemhsYW9vdm5vd3V6l313gIF5gICHhnp5eoN9gZOEcXN0fnp2dIWIkH6BfZFsc5WBfIOfhX+HfYF/hoKAint2hKuff3qIiIVscYJ7doGAgnVviG59gHSKgGpwbmVkWF9aWlpVYmtnXFpfdYJpXm1sXGFXW1xrgWVydH1qa15teHdpdnhzb4d8fn56dnJsemhpd2ddZHNoeneSgGNiVGNuZYGEdXZmaGlhV1ZZaGSQp25+d4CLjXlwbntld215inp2jnGEfn+Ah25kd3RlaGldbGJecG9baF9sdWV6aF10gG5ya3F7f3Z2Y3WGjHyJiIGAeXN2fnRhcGxYcHFhbm+CenNjcYBsYWx5bmloeXhzcGSEc3h4c29jYGNsc31pa1RoXl9VTHVkUUhWYkhjd2ZiTFRxWUtNWFlpbHd7ZWVucmdjWlheWXhnVUpdZFhpWVlJV2ZQSWN5W15fbVteXWJkXn9pamBvdHltb252g5d5coGAfX+JjIZ+dnaGeIaMfXN1dYJ5enqCjI59f4WJanSXgXuLnX5+hnqAe358holzcY+tjHt8h49+ZnGJe3R+fXdzcIZsfH5tkHpjcHBiZV5lVlpZV2RmbGBdXXSFaFhwbVteWFpcbHtjcXd2bmNcb3V1aXZ3cm+GeX+Bendub3RlaHRlW2d1ZnZ2kXlfXVJlZWmBgXN8YWJpXFRYXmNkkKRoeHSChZB3bG14ZnZse4N5dIdygXl9eYBpZndtYWdhX2pgXnVrWWZdb29iemVbd3xrbm9weHl0dWVzhJOAiYSJe3dwc31yYXhjWW5uYG5vf3pyZXGAZF5tdWhjZnd6cmxtgXNxe3FwYV1kbG58ZWlTZ1laVU56YFJLWllIY3VkYUpVblVLTVpXam1ze2RsbXRjYVlaXGJ4XVRMZF5ZalRXSFlhTkhrd1lfYW5cXF9iY1yFaWhibnh6bW9qdoGQeW2CfoCBkoiEgXd1iXSLhnRydnaBeH19foyPgX+TfnB4loN9mZN5gIF3eX5/c4iEc3CZoXt7f4mVeWV1iXpzeXdsdXB/bHl8cJJzXnBvYWhibFRbWldpZG5mXFxyiWVTcm5bWllXYGx2Y2p1a2tfW291cm51dXVrh31/gXx3b25sZGlwY1trcmR0do5zXFZTY19wfn1wgFxhY15TWmFcZJKeZXJxhYOQc2tpeGtubnl5enGAdn9ze3p7ZGZ2aF5iW2FoXF93aFdiX3BoYXdhW3x2ampybnh0dHVpcYKWhIiAhnZ0a3B8bGZ3V1tpbGFvcH53c2VvfVtgb3BiXmlwfWtqcn1wb3Zpbl9aZGtsemFmU2ZVWFNReF1TUFlSSGR0YmFHVmxRSVBaVmxsbHxlbW9yYVxaWFptcVhTUWdXV2pUVUZaXU9Jc3ZZYGNuY1lhYWFejGpjZW16eWxvaXZ5hntrg32AhJp8goR5fYhuj4ZxbnZ6fXSCgn2Lj4ODl3R4gpSFgZ+JdYGAgXN/gXCHg3Zvopdze4aMh3tmd4tvbnxwZ3lye2xzdnONa150b2JnZmtTXlxWaGJtbVtccYxkTm9tXVZYVWZpc2hjdWVlXltwd29xdnZ6bIh9f32Id49zY2Rrb2Fcbm1jc3iHa1pUVmFidnt7b4RcY15jU1pgWmOWlGNucIKFiXJpZnhtZHJ1cXpreXR1b3t/dl9nc2RbXldiZFlidWVVYGFtZGFxXVx+b2hpc3F0cXV3bG2FlYOKfYZyc2dvfG9xb1JaZWlkb3F+dHJibHVVYnFqWl5uZHtka3R7cHFxaGxeWGNpanheZVNkVVdRVm9YUldUUEhlc2BiRlhrT0lYVFduaWV8aWx5a2JXXVZcdWVUU1hpUlpnVVRJW1pQTnl3W19lbWlaYmFfXo9uYmdreXZub2l2dn9+bIOAfYaYe3+HgYp/a5OIcmdzgHt1gIN+iY5/jJNzfYqRhYefhnt/hoxzgIZzfYJ1bqSMc4KNjHd4bnqNYGV9cWd6dHltbXF3g2dkfG1jZ2dpVGBfVWdgbXBcXm6OaE1pbGBVVlNvZ3NrZnhlZl5acnZuc3x5dG6Je393nHp5a2FlbG1eYG9qZXF5fmdaVVdfa3Z6eW6CXmFdaFZZYFhknIhia3CBhnx2a2l1a1t1cGp5aXVybm98gXNZa25gWV5WYmRYZXFjVF9iaWFibFpgfmtmbHR1b214d2xoho2AinyIbnFmcHtscWxhWF9nZm1xf3JyXmlsU2VwZFVibWF4YW90enRpbmppXldgZmh1XGRVYVZUT1lnU09cT1BJZXBdY0daak5KYExZbWVgeGlvgGVgVV9VXnZcVVNhaE9eY1VUS11aUVp2dl1fZm1oWGNhW16OcWNoanhxc21ndnR5gnOCg3qIj398ioiOem6QinRsc4F0f3+IhYeShJWPen2Mj4iRm4SAe4yEcn+Bc3R3cW6Tk5OTk5OTk5OTkpKSkpKSkpKSkpKSk5OTkpKSkpKSkpKSkpKSkZGRkJCPj4+Pj4+Ojo6Pj46OjY2Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2NjYyMjI2NjY2Njo6Ojo6OjY6OjY2Ojo6Oj4+Pjo2NjY2Oj4+Pj4+PjoKAfnp6fH5+fX1/fn59fn5+fn5+fn+Af4CAgIGAgIB/gIGBgYOHjI6Ojo6NjY2NjY2NjY2NjZKSkpOTkpKSkpKSkpKSkpGRkZGSkpKSkpKSkpKSkpKSkpKSkpGRkZCQkI+Pjo6Ojo6NjY6Ojo2NjY2Njo6Njo6OjY2NjY2Njo6Ojo6Ojo6NjYyMjY2MjIyNjY2Njo6Ojo6NjY2NjY2Njo6Ojo6OjY2NjY2Ojo6Ojo+Ogn99ent8fn59fX5+fn5+fn5+fn5+f4B/gICAgICAgH+BgYCBg4aMjY6NjY2NjY2NjIyMjIyMkpKSkpKSkpKSkpKSkpKSkZKSkpKSk5KSkpKRkZGRkZKSkpGRkZGQkJCQj4+Ojo6OjY2NjY2Njo6Ojo6OjY2NjY2NjY2NjY2Njo6Pj4+Pjo6NjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Njo6Ojo2NjY2NjY2NjY6Ojo6Cf3x6fH19fn19fn19fX59fn5+fn5+gH9/gICBgYGAf4CAgICDhouOjo2NjY2NjIyMjIyMjIyTk5OTk5OTk5OSkpKSkZGSkpKSkpKSkpGRkZGRkZGRkJCQkJGRkZCQkJCPj46Pjo6Ojo6Ojo6Ojo6Ojo2NjY2NjY2Oj42MjY2Njo+Pjo6Ojo6MjIyMjIyMjIyMjY2NjY2NjY2NjY2NjY2Njo6NjY2MjIyNjY2Njo6OjoN/fHp8fH1+fH1+fXx9fn59fn5+fn5/f3+BgYGAgICAgYCAgIOGi42NjY2NjIyMjIyMjIyMjJA+LjExMTAvb4eEhISEiF0tMDAwMC1GoaGhoaGhoJqZmpqampqKg4SEhIOFd2VnZmZmaFxDRERERENHZGhnZ2dnZ2tvbm1ubnFKKy4uLi4rSIWDg4ODg4OLjIyMjIyMjY2NjYyMjY2NjY2NjY2NjIyMjIyNjY2NjY2OhX19e3t6fX58fH59fX1+fX1+fn5+fn9/f4GBgYCAgICBgICAgoWKjI2MjIyMjIyMjIyMjIyMji4aHR0dHBpohYKCgoKGUxgdHR0dGTekpKSkpKSjnJycnJycnImBgoKCgoNyXV9fX19hUjQ1NTU1NDlcYF9fX19fZWdnZ2dnajwYHBwcHBg7g4GBgYGAgYqLi4yMjIyMjIyMjIyMjIyMjY2NjY2MjIyMjIyMjY2NjY2GfH16enp8fXt8fn19fX59fX5+fn5/f3+AgYCBgYGAgIGBgYGChYqNjYyMjIyMjIyMjIuLi4uRiYiIiIiIh42QkJCQkJCMh4eHh4eHiZKTkpKSkpKRkZGRkZGRj46Ojo2NjYuJiYmJiYmIhYaFhYWFhoiJiImJiYmKioqKioqJhYODg4ODg4WKioqKioqKi4uLi4uLi4uLjIyLi4yMjIyMjI2NjIyMjIyMjIyMjY2Njoh8f3l7enx8e319fX18fX19fX5+fn9/f4CBgYGBgYGAgYCAgYKFioyMjIyMjIyMjIuLi4uLi5GTk5OTk46RkpGJh46KkJKTkYuQjY6OhYqRkZGRkJCQkJCPj4+Pj4+Ojo6Njo6Ojo2Njo2Njo6Ojo6NjY2Njo6Ojo6NjY2NjY2Ojo6NjY2NjIuLi4uLiouLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyNjY2NiX59eHh5fH18fX19fHx9fX59fn5+f3+AgICBgYGBgYCBgIGCgoSKjIyMjIyMjIyLi4uLi4qLkJCRkZGPhI6QkIaKj4WNkJCLhYmJiY6IiZCQkJCQkJCQkI+Pj4+Ojo6NjY2NjYyMjIyMjIyMjIyMjIyMjIyMjI2NjIyMjIyMjIyMi4uLi4uLi4uLi4qKiouLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjI2Lfnx3d3h7fXx7fX18fH19fn5+fn5/f4CAgIGBgYGBgIGAgIGChIqMjIyMjIuLi4uLioqKioqQkJCQkIqFjoiOhoaPiY2QkIiFh42JkImMkI+Pj4+Qj5CPj4+Ojo6OjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLi4uLi4qKioqKi4qKi4qKi4uKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIt9e3d2d3t8fHx9fX19fX1+fn5/fn9/f3+AgIGAgYGAgYCBgYGEiYyMi4uLi4uLioqKioqKipCQkJCPhYOMjpCOiYyKjpCQiIWIjImPh46Pj4+Pj4+Pj4+Pjo6OjY2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKioqKioqLi4uKioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMin18dnZ4fHx7fH19fX19fn5+fn5+fn9/f4CAgYCBgYGBgIGAgYSJi4yLi4uLi4qKiomJiYmJkJCQkJCMhoyJjoeFjYmOi4yLhIqMiI6Hj4+Pjo+Pj4+Pjo6OjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKioqKioqKioqKi4uLioqKioqKioqLi4uLi4uLjIyMjIyMi4uMjIyKf313eHp7enp8fHx7fX1+fn5+fn9+fn9/gICAgICBgICAgYCBhIqMi4uLioqKioqJiYmJiYmPj4+Pj5CMjouPjIqPjI6MjY+Kjo2LjYyPj46Ojo6Ojo6Ojo6NjYyMjIyLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLjIiAfXh5enp6e318e3t9fn5+fn5/f35+f39/gICAgICAgIGBgIGEiouLioqKioqJiYmJiYmIiI+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Ojo6Ojo6Ojo6Ojo6Ojo2NjYyMjIyLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLioqKi4uLh4B8eHp6eXt8fHt8fH1+fn5+fn9/fn9/f39/gIB/gYGAgIB/gYSJi4qKioqJiYmJiYmJiIiIj4+Pj4+Pj4+Pj46Pj4+Oj4+Ojo6Ojo6Ojo6OjY2NjY2NjY2MjIyMjIuLi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKiYmKioqKioqKioqKioqKioqKioqKi4uHgHt5eXh6fHx6e3t9fX5+fn5+f39+f39/f39/f3+BgYCAgH+BhIiLiomJiYmJiYmJiIiIiIiOjo6Ojo6Pj46MjI+Sj5COjo6Ojo6NjY2NjY2NjY2NjIyMjIyMjIuLi4uLioqKioqLi4uLi4uLi4uLi4uMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKiomKiomJiYqKioqKioqJiYmJioqKioqKioqKioqKioqKioqKi4aAe3h5eHp8ent7fH19fn5+fn5/f35/f39+fn9/f4CAgYCAgIGEiIqJiYmJiYmJiIiIiIeHh46Ojo6Ojo6Ojo+MkJOQkI+Ojo6NjY2NjY2NjYyMjIyMjIyMjIuLi4uLi4qKioqKioqKi4uLi4uLi4uLi4uLi4uMjIyLi4uLi4uLioqKioqKioqKiYmJiYmJiYmJiYmKioqKiomJiYmJiYmJiYqKioqKiomJioqKioqKhYB6eHl5fHt6ent8fH1+fn1+fn9/fX9/f35/f39/gICBgICAgYSIiomJiYiIiIiIiIeHh4eHjY2Ojo6Ojo6Pj4+PjoyNkI2NjY2NjY2MjIyMjIyMjIyMi4uLi4uLioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYmJiYmJiYmKioqJiYmJiYmJiYmJiYmKioqJiYmJiYmJioqFf3l6eXh7e3p7fHx7fn5+fX5+f39+f35/fn+Af3+AgICBgYCChIeKiYmIiIiIh4eHh4eHh4eNjY2Njo6Oi42Nj5WPiYyPjYyNjYyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYR+eXt5ent7ent9fHt+fn59fn1+f35/fn9+f3+AgICAf4CAgICEh4mIiIiHh4eHh4eHh4aGhoyNjY2NjY+MjImKj42IjJGPjY2NjIyMjIyMjIyLi4uLi4uKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uKioqJiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJg355e3p8e3p7fX17fH9+fn5+fX5/fn9+f3+Af4CAgH+AgH9/f4OGiIiHh4eHh4aGhoaGhoaGjIyMjIyLiYyKiIeJhoyOjJCMjZGOjIyMi4uLi4uLi4uLi4qKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiImJiYmJiYmJiYmJiYmJiYmJiYmIiImJiYmJiYmJiYmJiYiIiIiIiYmCf3h7e3t6enx9fHx9f39+fn19fn9/f39/f4F/gIB/gICAgICAg4aIh4eHhoaGhoaGhoaGhoWMjIyMi4yOjoyKioeEiIuKjIuNjo+Li4uLi4uLi4uLi4uLioqKiomJiYmKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiomJiYmJiYiIiIiIiIiIiImJiYmJiYmJiYmJiIiIiIiIiYmIiIiIiIiIiIiIiIiIiIJ/eHp7enp6e3x8fX1+f35+fX1+f39/fn+AgICAf3+Af4CAgYCDhYiHh4aGhoaGhoaFhYWFhYyMjI2NjJCSjI2Ii4mJi4uLi4mLjIqMi4uLi4uLioqLi4qKiomJiYmJiYmJiYqKioqKioqKioqKioqKioqKioqKioqKiYqJioqJiYmJiYmIiIiIiIiIiIiIiImJiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIiIiIiIiIiHgXx4e3x5enp8fHx9fX9/fn59fX9/f39+fn+Af4B/f3+Af4CAgIKEh4eGhoaGhYWFhYWFhYWFjIyNkY+PjZGJjIaJjIuIiImMiYeNjo+NioqKioqKioqKiomJiYmJiYmJiYmJioqKioqKioqKioqKioqJioqKioqKiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4WAenl9e3t7enx8fHx9f39+fn19f39/f35+f4B/gH9/f4B/gH+AgoSHhoaGhYWFhYWFhYWFhISLi46PjoyLj4iHiYmMjYWFjo2KiYyNi46KioqKiomJiYmJiYmJiYmJiYmJiYmJiYmKioqKioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHhoaHh4eHhH55eX16enp7fXt8fX5+f35+fX5/f39/fX5/f3+Af39/f39/f4CChIaFhoWFhYWFhYWFhISEhIuLjI6MjI2Lh4mIiomHgoiNjoiKi5GTj4uJiYmJiYmJiYmJiYmIiYmJiYmJiYmJiYmKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIeHh4eHh4eIiIiIiIiIiIiIh4eHh4eHhoaGh4aGhoaGhoaGh4eDfXp5e3p5enx8e31+fn5/fn59fn9/fn9+fn+AgICAf35/f39/gIKEhoWFhYWFhISEhISEhISEioqOjYmIiIqKh4iHiomIioiIh4qGi5GPiomJiYmJiYiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHh4iIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGh4J8eXl6eXp7e3t7fX5+fn5+fn59gH9/f39/f4CAgH9/fn9/gICAgoSGhYWFhISEhISEhISEhISKi5CPiYmJi4qHh4WHiYuKiYSLjYmOjYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiIiIiImJiYmJiYiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGgXt4enp4e3x7e3x+fn9+fn5+fX1/f39/f3+Af4B/f39/f3+Af4CChIaFhYSEhISEhISEhISEhI+Qj4+IiYuIhoeIiYuLjIuJioqNio6Oj4iJiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoaAe3h5eXh4enp8fX1+f35+fn59fn9/f39/gIB/gICAf39/gIB/gYKDhoiGiIaDhISEhIODg4ODkpKOioeKi4qLh4uNiYqJi4iHiouIio+SioiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhn96eXh4eHl5eXx9fn5/fn5/fn1+f35/f3+Af39/f4CAgH+AgH+BgoOHjo+PjoiHhIWFhoaFhYWSkI6KiYmIiImKioiIh4aKi4eHiYmOkJGNh4iIiIiIiIiIiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4aGh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWGf3l4d3d3eXp5e3x9fn9+f35+fn5+f35+fn+Af4CAgICAf3+Af4GBg4eOjo6Ojo6Mjo2OjY2MjZCQjomHhoiJiYeIiouIiYyJiYaKjY6PkYuIiIiIiIeHh4eIiIiIiIiHh4eHh4iIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhYZ+eXd5d3d6eXl8e31/fn5/fn5+fn5+fn9+f4B/fn+Af39/f39+gIGEiI6Ojo6Ojo6Ojo6Ojo2NkJGOi42JjIiIiYaHiYaIioiHi4yLjpCQiIeIiYmJiIeHh4iIiYmIh4eHh4iIiYiIiIiIh4iIiIiHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhoaFhYaGhoWGhYSEhIWFhoaFhIWFhX55d3l2eHl4e3x7fn5+fn5+fn5+fn5+f39+f39+f39/f35/f3+AgYOGjY2Ojo6OjY6NjY6OjY2Qj42Ni46KhoiKhISLiYeDhYSDi4mLj42JjI6QkI+NjYyLjY6Pj42NjI2Nj4+Pjo6MjYyMjY2KiYiHiImHh4aHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoeHiYqKiIeJi4yNjo2LiImLi42OjYyJiImMgHl3d3Z6eXh7e3t+fn5+fn5+fn5+fn5/f39+fn5/f4B/f4B/f4CBg4aMjY2NjY2NjY2Qj4+Pj46NjI6KiYuMjIeFiY2Lh4aIh4aHh4uNjo6Pj4+Pjo+Pj4+Pj4+Pj4+Pj4+Ojo+Pj4+Pj4+Pj4+Oj46Oj46Mi4uJh4eHh4aIhoaGhoaGhoaGhoeLiYeHiIiLjY2Mi4yLjY2Ojo+Ojo6Pj46Ojo6Ojo6Ojo6Njo6NjY2AeHZ4eHp4enx6fH5+fn5+fn5+fn5+f39/fn59fn9/f39/gH9/gIGDhoyMjIyMjY+QkpOTk5KSjYyMjIqHioyKh4eJiYWCiouIiYWJjpCNjo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjI2NjI2LiYaHh4eHiYqLjY6NjYyNjY6OjY2OjY2NjY2NjY2NjY2NjY2OjIyNj4+OjY2MjIyLi313dXd5enp7e3p+fn5+fn5+f35+fn5/f39+fn1+f39/gICAf3+AgYOFj5KRkJGSk5OTk5OTkpKLi4uLiomMiouLiYuKhoeOjYiIjI6OjIuMjIyNj46Njo6Ojo2NjY2MjY2NjIyMjIyMjIyMjY2NjYyMjI2NjYyMjI2NjIyNjIyMi4yMi4yMjI2MjIyMjIyMjIyMjIyLi4uLi4yNjY6Sk5OSkpSRkJOVlZSTk5COjo6Oe3Z2d3h6ent7e31+fn5+fn5/fn5+fn5/f35+fn9+f39/gIB/f4CBgoSNkpKTkpOSkpOTkZKSkoqJioyJi4qJjIuKioiHiYqKi4mKjY2Mj46Nj5KUlJOUlJOTkpGSkI+Ojo2NjY2Pko+OkZGOjIuKioqLi4qKi5CPjoyMjIqKioqKioqKiouKioqKi4yLi4uMjIyKiouLi46RkpOTk5SUk5STk5SUlJOTk5KSkpKSk5F6dXZ2eHt7e3p6fX5+fn5+fn5+fn5+fX5/fn5+f39/f3+Af39/gIGChIuRkZGRkZKSkpGRkpGRiYmIiIqMiYiJiYuJhoSJhoyKh4ySkpKTk5OUlZWWlZWUk5OUlJSUlJSUlJSVlZWVlZWUlJOTkY+QkZKQjoyRlZWVk5KSjo+QjYqKi4qKi42OjY6RkpCRkpKSkpGRkpKSk5OTk5OTk5OTk5OTkpOSkpKSkpKSkpKSj3h1d3l6e3t7ent9fX19fn5/f35+fX5+fn5+f39/fn9/f4B/f3+AgYKEi5GQkJCSkpKRkZGRkZGIiIiIi4uJg4eLi4yMiIeHjYyNkpSSkpOTlJWWlpaVlZSSkpOTlJSUlJWVlZaXlpaWlpWUk5SUlJSVlJSUk5OVlZWUk5KTk5OTkJGSkZGSk5OTk5KSkpOSkpKSkpKSkpKSkpKSk5OTk5SUk5OSkpOTkpKSkpGRkZGPdnJ3enp7e3t8fX59fX1+fn9+fn9+fn5+fn6Af39/f3+Af3+Af4CBgoSKkJCRkZGRkZCQkJCQkIeHh4eIiIiFi4+KjI6Njo+OkJWUk5OTk5SUlZWVlJSUk5KSk5KTlZSUlZaWlpaWlpaWlpSTk5OTk5OUlJOSk5SVlZSTkpKSkpOTk5OTk5OTk5KSkpKSkpKSkpGSkpGRkZGRkZKTlJSUlJSTkpGRkZGRkZGRkZGRkYx0c3d6ent7e3x9fX1+fX5+f35+fn5+fn5+fn9/f39/fn9/f39/f4GDhIqQkJGRkJCQj4+Pj4+Ph4iKi4yNjYuOj42Mjo6RkpGSk5OSkpKSk5SUlJOSk5OTkpKSkpOTk5OTlJWVlZWUlZWUk5OTk5KSk5OUk5KTlJSUk5KSkpKSk5OTkpKSkpKRkZKSkpKSkpKSkpKSkZKRkZGSkpOTlJSUk5OSkZGRkZGQkJCQkZCRinN0dnp8fHp7fXx9fn59f35/f35+fn9+f31+f39+fn59f39/gH+AgYKDipCQkZGQj5CPjo+Pjo+Oj4+Pj4+Pj4+PkI2OjpCRkpKSkpKRkpKTk5OTkpGSkpKRkZGSk5KTk5OSk5STk5OTlJOSk5OTk5OTk5OSk5OTkpKSkpKSkpKSkpGRkZGSkZCRkZGRkpKRkZGRkpGRkZGRkpKSkpKSkpKSkpKRkJCQkJCQkJCQkJGGc3V2e3x8e3x9fX1+fn1/f35/fn5/gH9+fX5/fX5/fn5/f3+Af3+BgYGKkI+PkI+Pj4+Pj4+Pj4+Oj46Oj4+Pj5CQiI2PkJGRkpKSkpOTk5OTkpKSk5KSkZKRkZKSk4iFk5GRkpKSkZKSkpKSkpKTk5KRkZKTkpGRkpKSkpKRkJCQkJGRkZGQkJGSkZGRkZGSkZGRkZGRkZGSkpKSkpKSkZCRkZCPj4+Pj4+Pj4+PkX9ydHh8fHx7fHx9fX5+fn9+fn5/f3+AgH99fn5+f39+f39/f4CAf4GBgYqPj4+Pjo6Ojo+Pj46Ojo6Ojo+Pj4+Pj4+GjpCQkJCRkZGRkZGRkZGQkJCQkJKCgpKQkZGOdYaRkJCRkZCQkJGRkZGRkZGRkJCQkZGQkJGRkZGRkI+QkJCQkJGRkJCQkJCRkJCQkJCQkZCQkJCQkJCQkZCQkJCPj4+Pjo+Pj46Ojo+Pj4+PeHJ2eXx9fHp9fH19fn5+f35+f39/f4CAf39/fn5/f35/f39/gIB/gYGAio6Ojo6NjY2Ojo6Ojo6NjY2Oj4+Pj4+PjoiQkZCPj4+QkJCQkJCQkI+PkJCPkIhwhJCPkHx0iJCPj4+PkI+PkJCQkJCQj4+Oj4+QkI+PkJCQkJCPjo+QkJCPj4+Pj4+PkJCQkI+PkI+Qj4+PkI+PkJCQkI+OkI+Pj46OjoyMjY2NjIqDiYhzc3Z4fX58eX18fX1+fn5/fX5/fn9/f39/f4B/f39/f4CAgH+AgH+BgYCJjY2Ojo6Ojo6OjY2OjoyNjY6Ojo6Ojo2NiJCRkI6Njo6Ojo6Ojo6Pjo6Ojo6PjHNvio+KcniHj46OjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Pj46Oj4+Pj4+Pj4+Pjo+PjY2MjYyNjoyLi4mJiYiFhYSDgoKEgnR5fXp4dXJrZWltb2xmZmdncHNzd3l9fnl6e3x9fX5+fn59fn9/fn9/f39/gIB/f3+AgIGAgIB/f4CBgImNjY2NjY2MjYyMjIyMi4uLjYyMjIyMjIyGj5GRjIyMjIyMjIyMjIyMjIyMjIyNd217j4JzeIaNjY2MjIyNjY2NjYyMjI2MiomKi4uJh4KAh4iEgXt6gH57fXx8fXlzcnJycnV1cG1ramppZ2NkYV9bXF1eWFVXWFlTS0VJSkpLTE1PT0tgdHR3eX19eHp5e3x8fn5+fn1+f39+f35/f4CAgH+AgICBgYCAgICAgIGAf4OEhYWFiIuLjYyMjIuLi4yGiYqKioqKh4OOkJGNiouLi4uMiYmKioqKiouLi4dzbm+Ee3V2gIWDhIeJiYWCg397fHl6e3pzcHFxcW1samdsbWdlZmVmZGNlZGVkZWVlZWRkZGNhYV5dXFlYWFdUUFFSU1JTTU1KSUZESEpHR0hHR0xOSWdzdXh6fXp4d3l8fHx8fn5+fn9/fn9/f39+f4CAgIB/gICBgICAgICBgYFnXmBjYWNucX17ent/fXd8fHZ4ent4eHpvcXt4eXt8e3h3e394dXd0dHZ1dXZ3dGJeZF9ha3FmaGtsbm9tamlpaGhlZWRkZF9gYWJgYF5dWVhaWltdXV9gX2BfX19gYmFeXl5eWVldXF1bV1dWUlRSU1NOUUpISUZFRUhMTEhGR0lLSklNbXJ0eHp7end3eXt6e3x+fn1+f39+f35/f35+gIGAf3+AgIGAgICAgICCgWdYW1pZXFtcY1xaXF5ga3FtcHBvbm5vbmtpbmxrbG9qaWtraWpraWZmZ2dnaGhiXWpsXWVmZ2VjY2JhYmBgXVhbW1dYV1RWUVBUU1NNSkxLTExOTk9UWFhXVVVUUlBQTU1QT05LTE1QUU9MTEpHSUlHSEhJSEhIR0ZGSElKSEhISUlISVZwc3V5ent5dnZ5enp7fH59fX5/f35/fn5+f3+AgX9+f4B/gICAgICAgIGBbFtYVlZWWVlaWVlYVVZoamxubmxra2poaGloZGVkYlxiZl9fYWNfXF9dYF1eWlpqd2xibnJqYllZX1tYV1NOTUtLS0tMSUtNTktKS0tMSktQTEtLRkdHSUlGR0lISUZFSEdGRkVERUVEREVJSUlHSEdIRkZLTUtJSUlIR0hLTU1LTExMVXFzdnl6e3h2d3h3ent8fn1+fn9/f39+f3+AgIGAfn5/f4CAf4CAgIB/gYJoUlRVVlNVV1lZWVdXV1tbYWNfXlxbWFZWWVZSVFJRUVVUU1NUUE1KTU5QUk9NW2tya2FtdHJmUVFTUFBOTk9NSk1MS0xKSktLRklJSkxJR0pISUlFR0dGRkVFSElKR0ZHRkZHR0hKR0dISEpMSkpLSUlISktLSkhKS0pISUtMTU9QUEtUdHN1eHp6eHZ2d3d6enx+fX5+fn5/f35+fn+AgYB/f3+AgYB/gICAgH+AgmlQUlRXVVRWWVdYWFpbVFRTUlBRU1FRUU9OTlBQUU9MTlBPTk5NTEtNTk5QTU5dY29rWGlzdXBTTU9QUFBPTk5PTk5QTk1NS0lISEpJSUlJR0ZHR0dJSkhJSEhJSEhHSEdISElISUxLSklISkpJSkpIR0pMS0pJSUhKSktMTk1NTU9RTFVzcnN3enl3dnR2eHp7fX19fn5+fn9+fn5+gICBgICAf4GBgH+AgICAgICBbE9PTlRZVVVdW1lXV1hOTUpKSUZKT0xKSkdJSk1NS0pMTUpHSUlJSktLRkJGSFViZ2xvcG9tbFpMTE5NTk9NTk9MTk5OUFBPTE1MTk1MTEpJSEdJSElISElJS0xLS0pJS0pJSklJSUlJR0dKSUdJSUpKTk1OTEhJSklJSk1PT01MT1JOWXBwcnd4d3d0c3R3enx+fX5+fn5+fn5+fn9/gICAgICAgYCAf39/gICAgIFvS0pNTlFOTlVXVlZSU0lFQ0VFUkREQT5CP0RAQD5CREFAQURHRkVIRUNGR0hNWmdoZ3JubmhmZGBeXlhMSklKSUlLSkxQTk1MTU1MTU1NTElIREZGR0ZGRklKSUlLSkhMSklKSkpJSEhKS0tIRkdJSklLTU5OSktPTUxLTU1PUE5QT1BgcG9yd3h2dHJzdXd6fX19fn5+fn9+fn1/gICAgICAf4CAgIB/f3+AgICAgXNQUE5OUE1KS1BSUE5RQ0RCQUZRRT1DPT9FSDk6Oz0/PTxBRkA+Ojs+SVpdWlxlbG5qb21tbGtpaGtkU0dFRUZFR0dHR0pHSEpLR0NER0pHQ0RFQUFDR0hHSEdISktKSElMS0lISktLTU5MTUxMSkpMS0lLTU9PUFNRT1BQTk9QUlFNUGdwb3N2dXRycXR4eX19fX1+fn5+f4B+foCAgH9/gIB/f4CAgH+Af4B/gICCdlRVUVFQT0xNUFBOT09BQkFAQkE/Oz48Pj8/Ozg5ODs7OkA6Oz48Ozs7PUtbaW1ub2pvbWtqbG1mUUdFREdJSEM/QEBAQUFCQUE/Pjw9PkFAQD8+P0BFR0dHSUtMTk1OTUxNTUpLTVBVU05MTlFOTk1OTE1NTk9OTk1LS05OTk1OTkxUbnBwc3R0c3Fydnh5fX19fn1+fn5/gH5+gICAgICAgH9/gICAgH9/gH+BgIJ4UVFSVFJTUVNTUVFST0BAPT4/PD8+QEE/PT45Ozo7Ozk5Ojg4Ozw5Nzk7Oj1IY29zbW5sa2xoVUM+Q0ZEQ0NDPzs+PkBDQ0E/Pj9BPkBAQj9APD9CQEFDRUVFSktQT1BPTU1OTExMT1JRUFJOTExPTUtOT0xMTEtMS0tKS0tKTU1LS1xxcXF0c3RycXR4eHl9fn1+fn5+f39/fn5/gIGAgH+Af4CAgICAf4CAf4CAgXxSTU9RUFFSUlRSU1NOPDs8Ozs7P0BBQkA9PDk8PTw6Nzk6Ojk3OTo6Nzg6OTk9SmBzc3BoVD86Oz1AQUA9Ozs+PD08QEJDQT9BQkE9Pj09Oz0/Q0RCQD9BREJFR0pKSkpKTE1MTExNTExOVVNLTE1USVBKSU1KSUpLS0pJSEdKS0lKZnJxc3RzdXJydnl6e31+fn5+fX9+f39/f36AgICAf4CAgICAgIF/gIF/gYCBgFZMTlBQTlJRUFBRUU44PT88PDo9PkFAQT8+PkA/Pj48PT0/QD09PT9DOz09Pjw6Qmx9akA6Oz49Pj9AQEA/P0E/QEBBQEBAPT8/PTw6Oz09PD9AQEJCQUBCREZGRkdGR0dISUtMTExLTEtKS0lKSk1MTEpMS0lISUxMSklJSElLR01tcHF1dXR1c3V4eXl8fX5+fn5+fn5/gH9+gIB/f39/gH+AgYCAgYCBgICBgYCCYUtPT05OT1BPT1BQTzo8Pjw9Oz8+PkFBPz0/Q0NEQT89PkBBP0A7W25APkRFP0BBRF9kOz09Ozo9PkFBPz9AQD9BPz89PD48PTs7PD0+QUA/QD5AQ0NEQkRFSEVFR0hISEdGSUpJSUlJSUhKSkpKTEtKSklJSEhKSktMS0lLSktIVnBwcXNzdHR1eXp7fHx+f35+fn5+f39/f39/f3+Af4CAgICAf4GBgICAgIGBgIJtTFBRTk9QTk5PUFBPPjw8PT4/P0A+QEA/Pz9CRkQ+PDw9QD04Ojptd0g4Ozo9PkE7SGQ9PD08ODo7QD89PD08PEA9PTw8Pjs9PD0+QUBCQUBAQEJEQ0RFRkZGQ0VHSElJSEhJS0tMTUpKSUpNTUpLSktJSEhISEpJSktKSk5MSUlgcHBycnJ0dXZ5e319fH5+fn5+fn5/f35/f36AgIB/gICAgICAgYGAgICAgIGAgnZNTk5NTk5MTE5QT0w+QTw8PT8+QkM/PkFBQUJBQFlSPTw9SUxGRXV2Tjc4ODo7Pj9XakE7PDw6Ojs+Pj49PTc5Pz09Pj89Oz4/QEJDQkJDQ0FCQkFCQkRCQkRCRENGSUdGRkhJSUtNSklKSktMSkpJSkVESUlGRkhISUpKTEpGRmdwb3FxdHZ1d3t8fH18fn59fX1+fn9/foB+fn+AgH+AgICAgICBgYCAgICAgICBek5JS0tMTExFSUxOTTw/PDw9PkBAQUE7QkNCQ0BDcnpKO1x/g396fHdXPD0/PT0+RWh0TDo9Pj89PT5OU1VSTENAQD8+QT07P0JAQkNCQEJDQUNBPT0+QD0/QUFBQENFRUBAQ0JDR0dFRENGRUZGR0VFP0FHR0ZDRkRHSEpHQz5IbG9wcHF0dXZ5fHx8fHx+fn1+fn5+fn5+f36Af3+AgICAgICAgIGAf4CAf4CBgIF+UUhLTU1NS0pLTE9RQD8+PkFBQEBBR0FCRENFQUdyemtig4SDgoOAfV4+QENAQD1Kc3tZOj1BRUJBR2ZobGhhX09DQUE/Pj1AQT4+Pj88PkBER0VAPkBBP0BDRkVDQkNDQEJEREJERUFCPkFCQkFCQEA9QUJDRENDQUNFR0E/PVZwcHFwcnV1d3p8e3t7fX9+fX19fX1+fX5+fn9/foB/f4CAgICAgYCAgIB/gIGAgX5SSEtNTUxLS05OUlVEQkBDQ0FBQkBCQ0BAQUFARW50fYKCgYN+fYR2TUFDRUA/Pll7gF0/Q0VJSUlXampoaWhmZ09ER0VFRURFQ0E/QD4+QkZKSkdFRUdGRkpOTktKSUdHSEtMSUdHQ0REREVEQUJCQ0BDREVEREVERUZDQkFEZW9wcXF0dnV4e3x6fHt9f319fX19fn59f4B/f39/f39+gIGBf4CBgICAgH+AgICAfVJJSUpKSEpKTE9SU0dGRUdIREdIREA+PDs+QEVFaHN9gXx/hH55hXJDREVEQ1d1hoeHflhHSEpNTVNtd3BpbW9xZUtKSUhHR0hIRUNFRUVFRkhKSkZFR0lKTU9PTU1LSktKTU5LSUhHSEhIR0ZFRkZGREZIR0VFSEhGSEdIRlFubnBxcnV2eXt7e3p9fX5/fX19fX1+fn1/f39/fn5/gH+BgYGAgICAgICAf4GBgIB8UEhHSElGR0lKTU5OSkxJSUpLTE5KRkNBQkNGSkdge4B/d3+EhYOEiWxBQVZ0h4mHh4eIg1dITE5NVHJ4eHJub29sTUdJR0ZIRkhFQ0RERkVEREhIQ0NDRklLS0xMTExMTElKS0pKSElJSEpISEdISUhHR0hGRkZISklJSUlIXW9vcXJ0d3d6e3t6e319fn59fX19fX5+fYB/f39+fn+BgIGAgYCAgICAgIB/gYCAgHxNR0ZIRkVGR0dKS0pMTUxLTU5NT0tJSEhKS0tMTE5bfIKCg4OFhoaIhFZshYeGhoaHiIiHfFBMTUpbd3qCcW5tbWxLQ0NCQ0ZGRUJAPj5AQUJAQkQ/Pj9ERkhERkdJS0lKSEhIR0lJSkpJSEZKSkpKSUpJSkpKRklMTEpKS0tmb3BycnR2eHl7e3t8fH1+fn19fX19fn59f39/f35/f4CAgICAgYCAgIGAgICAgICAfU9GRkdGR0hHRUZHR01NTUtMS0lHQ0NDRElLS0xLSlSBg4SEgoKFhoaEgoWFhISGhoaHh4aKdUpKR1tnaGpmaXN6cUM9Ozo8QUFAPjw5OTg8PDw7Pjs4Oz9BQkBBQ0NCQEFBRERCQ0ZISUhISExNTEdJSk1NTk1KSktLSkxNU2xwcXRzc3d5e3t7fH19fn9+fX19fX1+fn5/foB/fn9/gICBgIGAgICAgYCAgIB/f39+UUZFRkdJSUdEQ0VGTk1MSklIRT85Oj5ARUhISklJZYWEhIR/gYKDgoODhIWFhoeIiIiIiYyPZ0VWZGpsYWVseIBlNzk2NDc5Ozw6ODU2Nzc4OTc4NzU4ODs7Oz1AOzk5OT08Pjs8PUFDRUhKTUxMR0lHT1JRUFBOTE1NT1Fdb3BydHN1eHp7e3x8fn5+f359fX59fX5+f39/gH9/f4CAgICAgYCAgICAgICAgIB/f39RR0ZHSEpIRkVGR0hMTEpJSUdDQjU2OjxDQENHSUlohoSEgX6Bg4ODgoOEhomKjIyLi4mKi42KZWJvcGxoa3FteFEzODczNTY4Ojg3NjU2NTY3Njc2Nzo2Nzg4OTo3NTc4OTc5ODY2OjxAR0ZJR0lGRUZPU1JTU1JPUFBSVGVwcXN0dHZ5e3t7fH1+fn5/fn19fX19f39/f3+Afn+AgICAgICBgICAgICAgICAgH9/flJISEhJS0lHSUpJSkpLREVIRUJANjc4OD06PUVDQmWFg4GAgoODg4ODhomLiomJioqKiouKi4uIcXV2cHB1cGpuSzQ4ODU1NzY5OTc3Njc2NTo5Ojo6Ozc5ODk4NzY2OTo5ODg3ODU4OTtBPT4+QkE/QUtMT1FQUU9PT1JXa3FydHR1dnl7e3t9fX5/fn9+fX19fX5/f4B+fn9/f4CAgH9/gICAgICAgICAgICAf39+VEhHSUlMTUtKS0tMSUg/QEFAPDo1Nzk4OTc7Qjo9cYSAgYOEhISEhYaJioqIh4eIiIqKjIuKi46Idnh3dnhybW1KODs8OTo7OTo7Ojo5Ozo5PT09Pjs7PDw6Pjs5Ozs8Ozw7OTo8ODo6Ojo5OTk8Pzw8QUJESUpNS0lLTFdvcnN1c3Z4e3t7fHt9f39+f359fX19fn9/f35/f39/f3+Bf4CAgICAgICAf4CAgH+Af35URkVGSUxOTkxKSk1CPzo7PDo4OTk4OTo6Ojs/Pkh+hIKChIWFhYaIiYiHhoaGiImIiYuMi4qMjY2CdXh7eHJxakhBQUI+QENBQD49Pj5APz8/QD9APT0/Qj5AQT9BPz1AQEA+P0E8Pjw7Ojs6OTs/PTs8PT1BQUNBQkNBWHBxdHR0dnp7e3x9e31/fn9/fn19fX5+f35+fn9+f4B/f4CAgIB/gIGAf39/gICAf39/flJFQ0FHSk5PTElHSzo4Ojs5Ojo8PDo6Oz09P0BCUoKCgoSFhIWEhomJiIiGhoaHiImKi4uLi4yNjIx/eHt6emtXTEhISEVGSEdFQ0FAQkVDQ0FCQ0I/QERIRUNFQ0VEQUZERkRFRkRAQj49QD49P0A+Pz4/Pj8+Pjo7PTxgcXJ0dHV3enp6fX19fn5+f39+fX19fX5/fn5+fn5/gH9/gICAgICAgICAf4CAgIB/f4B+UERAPUNIT01HRkJEOjc6Pjo8Oz4/Pz89QUBDREZXhIKDhIWGhoaIiYmIh4aGhoeJiYqLjI2MjIyMjIx+eXp3WU5TTUtLSUpKSklFRERHSEZEREVGREJISUtHSEdGSEdFS0lLSUpLSkNFQ0NEQkFBQ0JEQ0NERENBPTs9QGhwc3R0d3d5eHt8fH19fn5/f359fX1+fn9+fn59fn+Af3+AgH9/gICAgICAgICAgH+AgH9PQT49P0RMS0FCQkE5ODw+Ozw7PkA/QT5CQkdHSVmEgoOFhYaHiImJiIiHhoaGiIiIiYqMjY2NjYyMjol6enVdUVRPTE5LSktIS0dER0lJSUVGSUZGRUxMTUlKR0dISUpOTU9MTE5LR0ZHR0VFQ0ZFRkZERUhIRkNBP0BMbHB0dXZ4eXl5fHx8fX1+fn9+fn19fX1/f35+fn5+f39/f39/f3+AgICAgIB/gICAgICAf1FBPz4/RUdHPTxAQDg3PDs7PTo+QD4/QENGSUlQX4GDhYSFhoaHiIiIiIiIh4eIiIiJioyNjYyMjIyNjYR5enReUVBOTkxKSUZKSUVLSUdLSklKR0dHS0xOTExISElKTVFOT05MT0tJR0lKSElESUhIRkZHR0lHQ0JBQ1RucHV3d3l6eHl6e3x8fX5+f39+fn1+fX5+fn5/f36Af4B/f3+Af4CAgICAgICAgICAf39/VERBQUJHSEI/OD9AOTo8OD0+Oz1BPj9BREhKTFVxg4SFhISFhoeIiIiIiIeGiIiIiImJjIyLjIyMjIyMjXZ2eG1UU1BNTElHREhLSE1MR0tPTEtKSkxNTE9QTkhJS0xPUVFQUU9PSkhKSkxKS0ZHSEdGRklGRUVCQUJCXG9yd3h5enl5eXp6e3t+fn5/fn59fX19fn9+fn9+f4CAgIB/f39/gICAgICAgICAgH9/f39VRUNFRUdHRUQ7P0E7PTw5QD4+QEJHR0FHS0xQVnmFg4ODhISGiIiIiIiIh4eIiIiIiIqLi4qMjIyMjIyOf2RnbVlYVVFPTUxFRkdNUE9QV1VRUE9RU1JNU1RPTVNMUFNVVlJTUVBMSk1NTUtOSEdKRkVISkVERUVCRUNjcHV5eXp6ent6e3p6fH59fX9+fX19fXx9fn5/gH9/gICAf39/f3+BgYCAf39/gIB/f39/f1RGRkdHR0dIRj5AQj0/PT1CQEJCR1ZORk5QUFRYe4aDhYWEhYeIiIiIiIiIiIiIiIiJiouKioyMjI2PjIyMb2Fjb2RIVVNTUks7O1NUUmB1XVVWVFZZWVJYWFJaZlBVV1pdUlRXUU9NUlFQUFFMTEtISEpIRUZJSUlISWlydnl4eXl6e3t8ent8fXx9f359fX19fX1+f39/f3+AgIB/f39/f4GAgIB/f3+AgH9/f35+U0hKSUhHR0ZFPz9BQUVBQ0dFREVMWFJNVFVWWFp8hoWHhoWGh4iIiIiIiIiIiIiIiIiIlJyMioqMfmGKi4uIc2JqWT5bW1pVUj9AV1ZZXGRgVllicl1dV11aVkVRWVpbWV9UWWdSVlZYVVRWVE9PTUtMSklJTE1LT01Tb3R2eHl4eHp6ent6enx9fH5/fn1+fX19fn1/f39+f4CAgH9/f3+AgICAgH9/gH+Af39+fn5WSkpJSEdFRERCQT9ITUlNUEtJS1BUU1NYWlpcXHiFhIWFhYWGh4eHiIiIiIiIiIiIiImcnaCPiY5nO36MiYuMfXRzW15eXVRVU1dXVltbdYNZVX2QYVxYXV9XSVZdXVtbX1lIWVhZW11YWFlXUlFNUFFNTU9TUVFVUmFzc3Z3d3Z4eHh6e3p8fX19f39+fX59fX1+fn9/gH9/gIB/f3+Af3+AgICAf39/gIB/gHh5fVlOS0lJSEZCREBBOlBRUVdYUFFPUVNUVFhYWVpbboGCg4WEhYaHh4eHh4iIiIiIiIiIiJaanJeJioFuhomIh4SKgGpdXV5bVldVWFRTWFZjloBSZXJYWldfaFBgZltbWFxnYUdPWmhnXVtcXV1XUk9TUFBSVlZWVllabnJ0d3Z2dXh4eHt7fH19fX5/fn59fn18fn9/f3+Af39/gH+AgH9/gICBgYB/gH1yfX9/b3R8XVNQTk1LSkVDP0A7UFBaWltTU1FQUlJSVVNWVFdfdXiAhYSEhYaGhoaHh4eHiIiIh4eIh4ORjomJiIaFiIiGfoF9YFVZW1ZUV1RSUk1QTUxmeltdVFlVVl1aTFRaVVNUXlpYV1dXempYW1xcXlRRUVBJTk9XVlhbWmRwcnZ2dHR2eHl5e3t8fH1+fn99fX1+fX1+f39/gIB/f3+Afn56eHd2c3V7f3+AgHRrf35rcnleW1ZVU1JPS0ZDREFNXoNsVlJTTk9RT1FVUlNSUlVjZHaAgoKDhISEhIWFhISDhoaGhoeIhn6JiYiHhoOHh4h6cHNaTk9RUU1PTEpLRUZJRkM/VGRVf1JRUU5LUVRRTU9ZUk1OUVNWVU1RU1JQT01MSENJSFJUVVpcbHF1dXVzc3d6ent7fH17fX19fn19fX59fn9/f4B/f399fX5+f39/f4B+e3Zzd31+fmR1fWlxdF9kXV5bWVZRTElMSWFsknRQUVNOUVJRUltSU1JRUlVUYXN7fH+AgYKBgX99e3uAf4OChYaHgoaGhoGEgYaFhnZhYFBIQkVFREREQUVRQ0VBQz5DSUdWQEhOTEddaVBIRk5GREVGSUdIQkRIR0lLR0RCQURAT1FNU2RydHZ1c3R1enx7e3t7fHx9fHt+fX19fn5/f3+AgIB/f3x8fX+Af39/f4CBgH12dHt/bWh8Z25xZmllZGJcWFNRUFVSc1dlW09PTkxRU1BVWVNVUVFUUk9WX2tscnZ7e3h5dXJuc3RzeXh9f4OAg4OCgIKAg4GCbE9JQkM9PD5AQUBAP2tRS2BFRkhJRUI/R0xOR01SVUlCRT8+PD08PT0/PT9BQ0NAPz09Qj5KTkdVbnR0dXN0dnh6fHt8fHx9fX19fH59fXx+fn9/f4B/f39/enl3eHd2dnh7foB+fXt4dnx1YXhnbHBqbGppZmBbUVFaXFleSkpQUE5LTFFSUVRVVVdRUVdVUFhbYV1hZ21tbG9rZ2BucmptbHF1e3p9e3h6fHx4d3hlRUJCQz47Q0NCQkRCXF1Pe05PT05LTE1PT1FMS01XTUhHQEI8Ojc3NTk5PTs7Ozg6ODo/PEJIP1xzdHV2dXZ3eXx8fH18fH19fn18fX19fX9/f39/fn9/f314dXZ6e3p3eXh1d3t8eXh1eXdjcWhpcG1ubW1oZl5PUF9dWklIUFJRT01QUU5RUlRWWFNTWVRPWVpcV1ldXl5fZV9dXnF2a15gZ2t3b29sam9ubmxlYllIR0hIQ0JHSUZGRkRNUk9hV1NXUVBTU1JVW09PUVZQTUlDRj86OTY1ODc5Nzk6MzY1Nzk1PEM+ZXNzdnd3eXl7fX18fHt8fX5+fXt9fn19f39/fn5+fn9/e3d1eX18enh8fHx8dHd2d3Z1d2tuaWhxbm9vb2prYFZXXlpYTUtUVFNQUVVPTFJTVFdYVFRZUk1YWVpWWFhWWFldV1dYaHNrXVZhdGthYV9eZGFfXllVUU5PT01JSEpMSklGQ1FQU1pXVFROUVNZU1xlVU9TVFJOS0lIQz9BOTk5ODk3ODg1NzU3ODU5OkducXR3eHp7e3x+fX18e318fn5+en1+fH1/f359fn59f358dHR1e3hycW9vbnR4cXJzeHZ1cWZkZ3JucHBxbm1kXV9fWVdPUFhWVlNUVk9PVVZYWFlTVVRMS1RWVVVVV1BTVFdUVVJdbl9STlpgW1dZO0RWWFRbZkpMUFNST05NTk5OTEpGUVBVWVNUT0pPT1VTVFxWUlVTUk9NTElISEY/Pzw6Nzg3NjU5OTY3Njc1V3Bwc3d5ent8fX59fnx8fXx+fX15fX18fn5+fXx8fX1+fXxydnF4eHJ2dXFxbnBwb3B1dnRuamRkanBwcXJwbmZlZGNcXVJUWldYVVRXVFJYWFlZWVNVT0pHT1BPT01SSk9QT1BOTk9UTE1JUE9TVFUyPVhNSUBRPWNhUVNRUE5QUVBOTk1RTlRSUFNNSU1LT1JQUlJTVFFST0xNS0xMSENCQT06Ojg3NjtCNTU2Njpkb3F0d3h7fHx9fnx9fH19fX18e3h8ent9fX58e3l9fH18e3B1b3d1cHV0b3N2cHFxcHR1dmNqZ2VXaHRycnFuaGlocFZWVFVYVVdVUldWVVpZWFdVUVNGRUFGR0dIRkpESEpJR0VITEhKSEZMTVBNRy9FX1I+Mz8+am9hU1JRQEdUUVBRUFFOUU9RUExKTExPUE5OUFFRTlBPSkxNTUtHRUVDQTs9PDw6PUc2Njc3RG1wdHZ5e3t9fH18enx8fX5+fXt5dnh3eXl8fXp6dn17fHp6b3Fud3JwdnFtcHNwb3Bzc3N0ZmdgaFpXa3JzcmxtbWtuYWVQU1RSU1RPV1ZWWVlWUVFRT0A9Oz0/QUJBQ0BCRURBQEdIR0hFRkhKTUxFR0NPUkM4RU5TXWdUUVNBR1VQT1FRUE1NT01LTEtMTk9PUUxPT01ITEtJS0tMS0dGRkVEPEFBPjtARTs8ODlTcHJ0eHt7e317fHt5fHp7fn58e3V0dXJ2dnp7eHpyfHt8eXltcW94cnF1bm5xcm9vb3Rzc3J1dGtnZ15lam1wa29xbWltY0xPTkxRU0xUVVRXV1VMTEtJPDk4Nzs+QD48PUFAQj0+RUhGQ0VGSUdKSkBGQUFARkhFSk9IUVJiXFJQUk9TT09QTE1PTUxNTU5PTltXS01RT0dJSENJSkxMS0ZGRkU/QkM+PEJHP0I/QWRwc3Z6ent7fHt6end7d3l+fnx7cXN0cHJzd3N4eHN6e3l2d2xxb3ZxdHRsb3Fybm5vc3ZydHNycmtsZW5zaG1ubWxtbGprSUxISE9RSlFTUVRTT0tIQ0Q9OTc3OT9CPjs/QkBAPkBESkVDR0dJR0lFQkI/Pj1DQkFHSURNT2JlUU1PTldLTE5LTE5NTUxMT05TZE5KTFJJSUlFQUhKTE1OSkdJR0JBQkA/RUZFSERLbm92eXl5e3t6fHp3c3h0eHx8eXpucXJtbm9ycnZyc3h8eHZ2bXBtc3B1dGxwcHJvb29ydnVyVlZucWdseYRqbXFybm5qaG9ISkNHTU1KTVBNUE9ISkQ/QT05ODk6P0I/PEFCQUFERUdKRkRISEdHSENEP0I/P0BBPkNFQ0tOUlRMSklNVEZJSUpMSktMSUpNTU9QUlBKR0NMR0NCSklMTU9OSUpJR0NDQ0RISk1MSVlybXd5eHp7enl8dnJwdXJ0eHl2eGpxbmpsbG50dG10dXtzdHhyb21wb3ZzbnBvcnBvcHN0eWpOYGdzanR8eWdvc3FpcWhkcUhLREdISUdKS0lKS0RGQj0+PTo5OjtAQj89QUJDQ0dGSUtKRUlJRkdHQ0M7QUBCPkBAQ0VDSU1QSEhLR0hLREhKTE1ISkxISUpMS01dUkhIRE5GQUNKSk1MUE1LTEpLRkdHSk5OUU5MYm1pdnZ3enl7en1ybWxza3B0dHR1aHBtamlra3RwbnR0eXByeXRvcnFvd3NvcXB0cnBydXR5a05WbXVscXt2aW5vaWt0Z2RvRktDRkZHRUZGR0VHQkNAPjw9OTo6O0BDQD5BQ0VFSUVJSkxGSUlHRkZDQjtBQkM+QENEQ0RHTE5IS05IREhFSUxOTUdJTEdGR0lJTE5LSUdFTkhCRk1LTUxPTU1OTUtJSElPUlJTTlJmZmZyb3N4dnt6fGxoam5la3Fsc3BmbWxoaWtsdG1wdXR3cW94dG90c3J2c3BxcnRzcnR1dXZ2WFZ1dWtvdHJrb3ZsaG1lX3BHSURGRkVDQ0JFQERCPj8+Ojs7PTo8PkNBPkFDREZKRklITEhHR0dGRUNAPUREQj5BQ0NDRUdJSUdNUUpGRkdLTk9LRkhJRkVERUlKSEtJRkhPS0NJTEtPTU9OT09OSkpJTFJVVVNPV2RgYG1ncHJvcnl6Z2VoaGRpbGdxbGZsbWdpa2xzbHB2dXRwbnZyb3Nyc3V0cXNzdXRzdXZ2dnl2dXR3bGp1dW1ydnFsbmxlckxIRUVIQ0JBQkQ9QkE+QT06Oj0/Oj49QEI+QEFER0pGSUZJSEZGR0RDQkFBRkZDQkJDREVFR0dIRkxRTElPSkpNTElHSEVHRURDSUlIS0pHS1JNQk5OTE9OT09NTk9LS0tPVVdWVVNYX15caWFuam5ocnNiZGZlZGhoZm5qZm1taGtrbXJpcXZ0c3Ftdm5vcXJzd3Nyc3R1dnZ2dnd2d3d2dHd1anN1bnV0c3Fya2tyTUdHRkhCQkFERTxBQEBDPDg6PD45Pzw/QkBAQERGSEVIRkZIR0ZGRENFQ0RJRUNGRUJFR0VGR0dFSU1LSVFNSktISElFRkhIRUNJSklLTEtQU05EUVJPUFFOT01OUE1MTVNXVlhYVVhdWl1kYGljamlna19kZWZjZ2dna2dna21rbWxwcmh0dHVyc252b3FwcnR4cXNzdXZ1gpF5dnZ0eHV1d3htb3VvcnN1cXFpbnlNSEdISEJCQkZFPD9CQkQ8Nzs9Pjo+OkBCPj8/QkVGREdERUhFREZDREZFRkpFRUlHQ0dIRkhHRUNGS0pITktMS0hKTEZJSUtIRUtLTE1OT1JUT0hTVFJQUk9RTU5RTk1QV1pWWllWWl1ZWGFgYWBeaGVjYGRlaGdqaGhpZmhubGxubXFwaXV1eHJycHVwcHBydXZwdXN1d3V7fn14dnR3dnZ2eHBsdXBtc3RucHJyeE5ISEhJREJDSEU8QEVCRT04OT4+PTw8QUI8Pz5BQUZDRkNESURERUVGR0dHSUZHS0hESEhHSUdGREhLSUdLSU1LSktMSExLTEtKTktPTk9SVVZPS1VWU1BTUVJMT1FQT1RZWllcWllbXV5dYGNeXGFja2JgZGdocoVoZ2lmam1ucG9uc3JqdHV4cnNzdHJucHF2cnF1cnV1c355jn11dXZ2dnZ4cmh1cWtydGxxdnB0TElLSUtGQkVHRTxAR0NEQDo8PkA/Pj9CQjxAPkJBRkNFRUVJRkZFR0ZHSEZISElLSkZKSEhLSEZGTElIR0pHTExNTExJTUtNTU1QTFBQUVVWV09LVlVUUlNRUkxPUlJRVlpaXV5bXF5eXmBgYWRdY2BlZmBlaGpkc3Nmamdma29ycW9zc25zd3dxdXZ0c21vcnVvcnNwdXJ2cnSBdnV1dXd2dXd0Z3Rya3Fya3J2bnZKS0xKTEdDRURFPEBGRERDOz8/QUBAQENBP0I/QUNIQ0ZGR0lGSkZHRElIR0lISkxISEpKSUxKRkpLSElLSkdLS01NSkpNTE5OTlBLT1BSVVhWTU1UVVRSUVFQTU5UU1JXW11eX11dYF9gYWFgYWNlYmRoYmRpamd2i2xqaWdsb3NxcHFwcHJ5dnJ1dXRzbW1zc21xcm90dXRycHN3dHV1d3Z1dXRlcXNrcHFqcnVud0tMTExNR0RDQUU8P0VFRUM9QUFDQkJDREFDRUFBRUdDSEhJSEdKR0NHSUdISkZJTUhJSk1LTkxHS0lIS0tOUUtSUU1TTUtOTk9QUE9UT1dYWFtOUlBXXFpSV1BOVFVUVFhaX2JiX2RhXmBiXmBlYWFjaW5nY2hoaG54dmxoaW1vc3JwcXJycnZ0c3Vzc3Nua3NxbXByb3R2cnFxdXZ1c3d5d3V0dWNtdGtvcGpxdG93TE5MTExHRUFARD4+REVGQ0BEQkVEREZCQ0VHQ0NJRkNJSkpJSUtHREtKR0lKSUlMSEpKTkxPS0lMSEtMS1pmSmRcS2xTSE9OX25Va3NbcXBid2NTUGF2dWh1Y2F2YFhucWJkdmluemZbbHRgbGpUX3d2aWpnaGZnbG1qbW9qbW5zcnBycnFyc3Jzc3J0cm5sdG9ucHFxdXVxcXN0dnZ1dXl3dXR0YGt0a3Bwa3FycXlMTkpKSkZCP0BCPz1ERUZEQ0RDRUVERkJGRkdERUtGRkpNTEtMTEdHTUlHSktIS0tJS0tOTE1MTExJTE1MW3NiZHBebG1VTU5mc11mZnFsbnRncGlfYVlubmJwcGJrampmb3F0ZXRub1xvdWdwTUpxeXZrYWBrZWVteGxrdmxtcHNycHJxcHFycXJycnRybW1zbm5vcHN1dHFzc3R1dXV0d3h2dXRibXVrcHBscnJxektMSUhHRUQ/QUJAPkNGR0NGQ0ZFRkVEQ0hISERFS0hHTE5OTE1NRkpOSEpLSklMS0pKS0xNTk5NTUpNTU5bcm9vbnBwbGtNUFFsV01pYnRycGFtbnVcWWxQXG5tWnFta29teHh0c2lwXV9ya3FqVXV5eG9jXmtmYmdwb2pqbm9wcnNwcXBxcXJycXFycnRsbXJtbm5vcnV0cXRydHV1dHV1enZ1dGVudWtwb2xzcnJ5SUtHR0VFRUJCQj5AQEZIQ0dESUZFRUJGSUhIRUhMS0dNTU9MTU5HTE1JTEtJSk1JS0pKSk5QT05MTE5OTFxoZHVdbHFXbE5QUW1UWWtea2x2YWxkc1NlY05tWWxcdHBraWx4and1aHBdXnJraFdiY3d8b2NgZ2dhZGl0eGtubnFzc3BxcHFwcnFwcHBydWttcW1tbW9xc3Rxc3J0dnZzd3Z6dnV0aG91bHNvbXNydHZITEZJREVFQ0FCPUJBQ0ZESEdMSEVDQ0hLSUhGSkxMRk5MTFNSTEdMTEhOSkhITkhKSklITk9NTkxKTk1KWnNwcG9xcW1sT1FSbllya2dvb3Fxb210XW5YYXRfbm9wb3Fyb251c3R0altedGN3eHJqbnpoYWFjZmJiaW10dXBzdXZzcXBwcW9xdHt/fn13bGtxbmxtbnByc3F0dHN1dXR4eHl4dHVrb3VtdG9uc3N2c0hLSElCRURFQUE+RERCR0RISU1JRkNGSkxKR0ZLTkxGT0pLV1FLR0tKSk5KSEpMSUtKSEhLTU1NTUlLS0tTa2NbaV5faWNyclpfWWpuX2VlVWtfY1thYVFgbGhdalxuaWlkW29lZHBdWlxrW21xY3BzbGRnY2NnYGBqbXFwbnR5cnVxb3BxbnmFiIeHhoWAdnNua21tb25xcnR0cnR1dXZ5eHhzdW5xdW52cXF1dHdyR0dGSURFREZBQEJGRURHQkhKTEhGREdLTElFRkpPTElQSUxaUEpFSEhLTUlISkpLS0lISUZLS0tMR0hLS0xNTUxKS01OVFtcVFBUTFBPTk9PVlFPTlFOT1FKSk9QUWRxaVRZVlxbXFZZW11YXVxcY2ZhYWViY2ZfX2ZrbmltdHlydHJvcHB0hoeGhoaFhYaHg3pwbW1sa3FzdHRydHZ0dXl4eHV2cXJ1b3ZydHN1dXNHQ0RHRUVBRUNAREhERkdDSUtMSEZDR0tMSUVHSVBLTE9LTFdMSUVFSElKSElLSU1KSEZHR0lHSElFRkxJSkxPTUpQXFdeUFxbYF5NWFlTXFxiXk1YWk1YYVJLWWFaUl9kXGFYW2RkVlZYXFlaWFxWWVxdYl5kYWFfZWhrZ210dHFxdHBxcoGGhoaFhoWFhYaGhoR9cmtpb3Jzc3N0d3l5eHl4d3h0cnhyeHNxcnVydE9CQ0RMTUJEREJFSUVHR0ZLSktIRUVJSktGRUhIUEtNTUpNUklHRUBIRktJS0xKTEpIRkRJRkRGR0VGSkhDSk1MTFVfWWBYYGFbYFRYWVReXlpfUllcUF5cWU5eXF5TWl5jXlpdYGNgWV9jW2BeW1RYV1leXWNiY2FjZWhla3Jwb3Bwbm93hoaFhYaCe4CFhYaGhoaFf3VxcHJyc3Z5eXp5eXh4eHdyeXZ4cnF4dnR2YVJKSk1JRUNCQ0dIRkhHSUtKSklERktLS0VGSUpOS05LSExOR0dFPkdHS0lLTEpLS0lHRElEQ0RFQUZKRUFLTEpPW2NZX15hX1JUUldfYFxdWV5RWVxNVl9XS1FZW1BaX2FhXV5jYWBiYmJjY2VaUVlVVVxZXWNgX19jZGJob21ubGxsbHWFf4SDeXV8hIWFhYaGhYWGhoN9d3JydHh5eXl5f359eXV5dnZybnp3dnhZUUtGREdFQkVHSEZHSEhGR0lHSEdIS0lMRERLS05NTEtISkpISUY/R0dOS0tLTUtLS0lGR0NEQERBSElDQEpLSFBdYVpbZF1fVFFSWF1cXFxfWktXXExSXFlJTV5QT1xfYWNjY2NiXWRjYmRjZlhRVlRRWldaYF9eXmFhX2Rsa21qamxudn51gXp8hIWFhYWFhYaGhYaFhoaGgnpyc3V1e4WHh4eGhYSBfnhwend2eFxSTUNASUZERktKRkZGSEdHSUdGRklMSk5GREtLTU5KTElLSkhIRkJISFFNTEtPTUpLSUdHRUQ/RUNJSUNDSEdFVF1ZXlhfWV9bXVVYWFBdXVFLSlZeWF5bXVVZYVJRX19iYmBgYmJgY2JhZGRiWE9RUFFaUltdXV1dXl9fY2hnbGpubnB7e3x+e4CCg4SFhIWFhYWEhIWDhISHh4FzcneFh4eHh4eHh4eHh4WDgHx4XFNLQ0FIRkRHTVJIQ1FKRUdISEVGS0pNUEVGSUpLTkxMSUtLSUlHREhLUU9NTVBMTEtLSElDREFFRElHQ0NIRkRXVUVcVF1TVl9YT1RVTlpaTUlKVGBhW19YXl5hXU5YYVxgYF9iY2JdYWJXX19UUE9PT1dRXFtbXFxeX2FmZmVsZW9vd3x7gHt9f4CEhISEhISFhYODhYKDgoWFhnpvgYaGhoeHiIeGhoaFhYSFg35KTkZERkZIRElSYlBDVl5JR0dIREZNSlBQRUlJSktOTEtKTEtJSkdFSk5RUU5PT01OTE1IS0FEQkNER0RDQ0ZHQk1IQktLT09OTEZNRkdJSkhHTEtNT1BJTE9QT1NQS09TUlVaWVdZWFhkV09TVFBQTk1OVFJaWFhaXVxgYGRlY2dja2xwc3J5eX97en+EhISFhISEhIKEgH57gYOBfXuFhIaGhoeHhYWFhISEgoGAfUtJRUVIRkdES01dTEdHWExHSEpIR01MUVBIS0tLS05NVU5PSkpLR0dLUFNTTlBPTk9OTkdLRmBFRF9MRWdkRk5cSV5bcm1PTVVtWUxEUGBVa1dnSl1XVV5ETFFVTExTVlFSVFhXVFhVVFxVUGZaaGhkWFJqUlZVVFtcW2BfYWJhYl9maGZua2hyenx9foGEhISEg4ODgX18enJ7gXp7f4KAg4SEhYWBhIWBg4N/fnp7TElFR0ZIRUVLT1NJSkZgU0dKT0pJT01SUExNTExPUlVST09JS05HSE1RW1lPUFBOT09PSUpRf1FJfFlZcnRZUW1IcW5vYVZQcXFzUENrc21xc3BTb19ablhdVlxYVWtoVV1WY1pgWVtfVlZYf2p0dXVeX3ZeV2FbW2ZbXmBhYWFdX2FnbXBsX3B3dHiBgYKDg4J+fX+Adnh6bHZ+dHh9gHx+gIGChHyAg3p/gX9+d3dOSkVITU5CRExMRklLRVFVTEtOSUtSWFdRTk5PTVFUTk9RT0tLTkdNT1NbWlRRUk9QUFBKSFp4XVR4ZWhaU1VSdmd0bHBibmZqUXJPTXdtanJwc3Jxcm9vb4BdZXp1eHFxenF+c31rdX1iUmh8ZXNzb3Jye3xvfnhugHJfYGBiYVpgX2drbmtibGZnbHd+gYCCfXt4d4B0dnppcn5uc3x+d3h7foCDeHyAdXx/fHxzc05MR2BdR0FFTE1HSkpHSU9OTU1KTlZeWVVMUVNOWFpNU1NSTUtPSFFSVFlXV1BUUFBQUUtIZ3hsY3hybVtMTlZ5cHVtdWJvdlBlZUpmdnFtd2+AamZ4d2lXclFoem1panp6fWx4en9vaG9ZdnZqdnVwgF9yZn1pbHh8b15fX2JhWl1iZGdpaWRnYmNkbGxwcHN0c3NzenFyeGJsdWdyeXtycnZ5foFzdXpufH15eHJuTktTdU5DQkZQUEhKS0lLUE5OT01QWmBaV0tUV1BhXlJWUVlSTFBJU1RVWFdXUFVQT05SSktyb3V1cXVxZGlhV25McXBeRmh5V3ZUS2h5fXhgeXtzbmFdbW9jUmdxdW5teXB3bHZ0dHJsbl10fnprbXl8a3RsfGtwdnV4Xl9fYl5cX2RkaWdnZWVeYWJpaWlqa25va3FvbWpwYWNmY293eG9tcHN5f25xcGt7enRyb21MTFtWSEdFR1JQSUxNSktQUVBQUFBXXFlVTVVZVWVYUlJZXVNMTklUVFdXWVdPU05OTlFJUm1IaXdLYGR2d1ZYbE9ubHtzYWpnf3ZVTFdraH1sbWx4X1pwenteYHpzY3JveHFoZH1pcnxeVExsX3Z1a2l1e3ptfnhrfHBcXl5iW15hZGRmZWVlYlpjY2lra3JzcnZnbGloZGdhYWthZ3NybGdtbXJ9a21oa3t0bW1rbU9IS0tISkhIUVBMTk9MS1JSUk9TUldSVlRQV1pWVlRUVGFfUE5NSlRTVFFWVk5OTE1PUEtIUU5QVUxLTFNUU1NUUFZVUVFOUVFYWVJOUFVUWFhYW1tVUlNXW1dYV1pPU1VXWFhSXllXXldVUFlSV1dXV1heWmdyXltbWVxdX2NaX2NjZGZkY2NiWmNiZ2ZlbW5tdWVlZ2NhZl9dZ2BkbGhmZ2tocHpoZ2dqdWpoZ2lsUElLTExNS0pTUU1RUU9MVlVUUFRVWFVaVVFaXVVVVFdVWVdPT0tNVlRRTlVTTk9NTFFQTEpSUUtRTUtMUFJVU1FSU1NJSExOT1FSUVBRVFZSWFdcV1NSUFJUVVVTWlFOU1JYVlRZV1VaVlRSVlRUVVdYVlxZXWBdW1paXFxfY1tdYmNkZmRkZGFZYGFjYWJoaGltYmFkXl9jXFpkXGFtYV5mZWZtc2RpZ2prZWRjZmhQSktMT09MTVNQTlNRUE1YV1VUVVdXV1lVU1xgVldWWVVYUlBQSk5XU1BOVVBOUU5MU1BNT1VTTlJOTU9RVVFVUVJUVU5LTU9RVFRSUlFWV1VZWltZU1VSVFdWVllbVFBUVVhVVVpWWFpVU1JYVlVXW1hZXlxVWF5cXlxbXWBgXVtiYmNnZmVkYlhfYWJeYGdkZmVhXl9dXV5aWl9aX2dgXl1dYmhrYWdmZ2ZkYGJjYk9MTUxRUUxPVE9PU1FPUVtZV1dYWllYWVZdamRWWFlaV1ZTU09KTlZUUE9UUFBQTU1SUlBSWFRRUU9NUFRWT1hSVFVVT05NUVRVVVRUUlRXVltdXFpWVlFRVlhWW1tXUVRWVlZWWVRYWFZTU1lXVlpeWVxeXlVeXF5gXFtfX19eWmJiZGhnZGRiWGFgYl5eZmNjYGJdXFxcXFlaW1hbYVxfXVxfYl9fYmRlYmRfX2BcUE1OTlJRTVJST1NUUU9VXFpaV1tbXFlaW2RxbWhkX1tYVVVXUUxNVlNNTlJPUVJPTFBTUlVaVVNQUE1RWFdSV1NTU1hNT09RVFhWVVVTVVlYW15dW1tWUU5VVlVbW1dSU1dWV1hWVFlbVVRTWlhXXF5aXl9fVGFcYGFdYGJfXGBdY2BjZ2hkZmBZY2BhX19lZF9gYltaXFtcWlpZWFdcWlxbYF5fW15eYWBfYlxZYFtRTk9OVlFQVFFPVFRTUFdcXFxYXlxeVlteanF3eYBjXFtVVVdQTU9WU05RUU9SVFJMUlRUWVtXVU9ST1NYV1RTVVJSWk9QUlJWW1ZXV1NWWlhcXVtbXVZSTVRVVVtcVlJVVlZYWVNVWlxVU1NdWFpdXlxgYF9WYVtjYl1hZF5cYmFiXmNmaWRmXVtkYGFgYGNlX2JeWVpeW1xaWVhZV1daWlphXF1bXVxcWl1gV1tbWlBPT09ZUFVUUlFXUlRQW15eXVtgXGBVXF1oanJ9c2xnW1RXV1FOUlpTUlFUUlRVVEtSV1ZbWVpTT1NRVlZWVE9XUlJaUlRUVFhdV1hZU1hdWF5dWVpdVFROVVZXXltYUlVVWVlZVVdaXFZUV15aXV1gXWJiXVlfW2VhX2RkXl5jY2FdZWZpZGZdXWRhYGFhYmRgYl5YWl9aXFtYWFhXV1tZW2BcW1tcW1hZW15WXlldUU9PUlpQWlRVVlZTVFReXmBeXmJcYFVdXmJreXRsfWtaVFlUUFBTXFRVVFVUVllXTFJbV11bXVJPVVNYV1dUUFhSU1dTVlVVW11YW1lVWl5YX15ZXFlSVlFZWFlfW1pUVVZaWVpXWFpcV1VbXl1eYGFfY2NcXl1dZWFhZmReXmRjYFxnZGhlZGFfZGFgYWBiYl9gXldYXlpcXFpZWVdWXVpdXlpZW1xbV1lcXVZYV11TT1BWWVFdVVZZV1dVWF9fYWFgY11fVV1eYmVldYF6aFdYWVNVU1ZbWFdXVlZXXVhPVV1aXl1cVFJYU1dXVVNUWFJTVlRYV1hdXlhdW1ZdX1hfX1hcVlFYVFlaWmFaXFZXWFtaW1lZWltZV15fYF9jYmFkZFxiXGBmYWRmZF5fZGJhW2ZjaGVjZmBmX19hYWFhYF9eVlVdWVtcW1lbWVhdWltbWFhZW1laWl1fXVRZXVVOU1lWU1xUVldZVlZcYGFiY2BjXl9WW2BkYV96dW9oWVpZVFdUV1taWltZWFlgV1BVXlxgYFxUVFhQVVdWVFZXUlNVV1paW19eWl9cVl9fWV1eWV1VUlhXWVldYlpeV1hbXFtcW1taXFpaX19gYGRiY2RkYmRaYWViZmZlXmFiYGNdYmNpZGNnX2deYWFjYWFgXl9YVFtaWltbWFtYWFxbWltYVllYV1xbW2BdVl1dU09WWVZWWlVYVVhXWF1fYmFkYWRgXllZYWRiYGxmaF5cXFpWV1hZXFxdX1tZW2JWVVheXWFjXFJWWVBXV1dXV1ZTVVRYXFxeYGBdYFxXYV5bXltaXldVWFhbWl9gXF9ZWVxcXV5fXFtdWVtgYV5gZGNkZWVlYlhjZWRoZ2ReY2BgZWNcZWlkZWlfZl1jYmNhYWBfX1tYWVpZWlpYWVhXW1taW1dYWlRZXVxaYFxVXmJOU1dZVldZWFtcWFdZXmBiYWRhZGFdXllhY2JfYWBgXlxcXFdXW1tdXV9fXFpdY1laWF1gY2RfUlhZUFdXWFlZV1ZXVlxdXmBhYF9iXllhXV1eWVxeWVhVVltcYF5dX1taXl1eXmFdW1taXGBiX2JlY2VmZWZiWmRmZmlnYl9jXmFmZFloaGJmaWNlXmJiY2FgYF9dXFpYXFlZWFhaWFdaW1pZV1hVVVtdXV1gYGJieEtYV1tZVlxbXF1aV1xdX2BiZGFiYV1gWGJjYmFjYWJdW1xbWFdcXF9dYF9dW2BkXVxYW2JlY2FSXFpPWVhaW1taV1pZYF1gYmJgYWNfXGJdX11bXl1ZWFRXXV5fYF9gXFteXmBiY1xcWFxeYGJiY2VkZmRlZmRcZWZnaWZjYWJbY2dfXGloYmhpZWRgYmFjYV9gX1xdXFlcWVhXWFlYV1xaWldWWE9YWl1hY2Vmcmt/SllXXFpaX1xbXltYXVteX2FjYmFhXWJbYmRiYGJiYlxbW1pXWGlxYFxgX11cYWNfXllZY2VkYVNfWlJZWFxdXVtaW1tjYGJiY2BiZGFgY15gXF5eXllYVVtfXl1hYmBeW2BhYmZjX11UXWBgY2RkZmVnZWZmZV5lZmhoZ2RkYFplZ11hZ2hjaGhmY2BiYWNiX19fXV1bWltZWFhYVlpWXFtaVlZVTVhXXGhpa2h1eIF2dnZ2dnZ2dnZ2dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6e3p6ent7e3t7e3t7e3t7e3t7e3x7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHt7e3t8fHx8fHx8fHx8e3t7fHx8fHx7e3t7e3t7fYmIhoqHhIKCgoOCg4OCgoKCgoKCgoKCgoGAgYCBgICAgYCBgYGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t6e3t7e3t7fHx8fHx8fHx8fHx7e3t7e3t7e3t7e3x7e3t7e3t7fHx8fHt7e3t7e3t8iYmHiYaFgoGCgoKCgoKCgYKCgoKCgoKBgYGAgICAgICAgIGBgYB9fHx8e3x8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eHh5eXl5eXl5eXl5ent7e3t7e3t6enp6enp6ent7e3t6ent7e3t7e3t8fHx8fHx8fHx8fHx7e3t7e3t7fHx8e3t7e3t7e3t7fHx8fHx7fHt7e3uHiYiJhYSDgYKCgoODgoKCgoKCgoKCgYGBgICAgICAgICAgYKBgH58fHx8fHx8fHx8fHx8fHx2dnV2dnZ2dXZ2d3d3d3d3d3d3d3d3d3h4eHh4eHh4eHh4eHh4eHh4eHl5eXl5eXl5eXl5e3t7e3t7enp6enp6enp7e3t7e3p6e3x7e3x8fXx8fHx8fHx8fHx8fHx8fHx8e3x8fHx8e3t7e3t7e3x8fHx8fHt7e3t7e4aJiYiFhYOBgoKCgoOCgYKCgoKCgoKBgYGAgICAgICAgIGBgYCAfnx8fHx8fHx8fHx9fX18fHaIi4uLi4uLgX19fX19fYSMi4uLi454KSkqKiopKz0/Pj4+Pj5tgH5+f397pdfT09PT1ryGiYmJiYiQzNPS0tLT08S9vr++vsCiioyMjY2OiX9/f39/f359fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx8fHx8fHt7e3t7hIuHh4aHgoGDg4GCgoKCgoKCgoKCgoGBgYCAgICAgICAgYCBgIB+fHx8fHx8fHx9fXx8fH19doyQj4+Pj5CDfn9/f39+hpCPj4+Pk3kZGhoaGhocMTMzMzMzMmqCf4CAgHut6eTk5OToyomMjIyMipTd5uTk5eTl08zMzMzMz6qNj4+QkJCLf39/f39/f319fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e3uCjYeIh4eDgoSCgYKCgoKCgoOCgoKCgYGBgICAgICAgICAgICAgH58fHx8fHx8fXx8fH19fX12eHh4eHh4eHd3d3d3d3d4eXl5eXl6d29wcHBwcHBycnJycnJyd3p5eXp6en6Dg4ODg4SBfHx8fHx8fYOEhISEg4OCgoKCgoKCfnx9fX19fX18fX19fX19fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e4CMhomHh4SDhIKCgoKDgYKCg4KCgoGBgYGBgYCAf4CAgICAgICAfnx8fHx8fHx8fX19fX19fXZ2dnV1dXl2dnZ6e3h7eHd2d3p3eXl6fnx5eXh4eHh5eXl5enp5eXl5enp6eXh4eXl5eXl7e3t7e3t7eXl5eXl5eXl5eXl5eXp7e3t8fHx8fHx8fHx9fX19fX19fX18fH19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8f4uHi4qIhIODgoKCg4KBgoKDgoKCgYGBgYGAgIGAf4CAgH+AgYF+fX18fHx8fHx9fX19fX19d3d3dnZ3fXh3d316eH14d3Z5fXx8e3l8e3h3d3d3eHh4eHh5eXl5eXp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fHx8fHx8fHx7e3x8fHx8fHx8fHx+iomNjImFg4SEgoKDgoGCgoKCgoKBgYGBgYCAgICAgICAf4CAgH19fXx8fH19fX19fX19fX13d3d3d3p9eHt4fHx3e3h3dnp9fHp7eHx6eHh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fX19fXx9fX19fX19fX19fX19fHx8fHx8fHt7fHx8fHx8fHx8fH2Kio2NioWDg4SCgoKCgYGCgoKBgoGBgYKBgIGBgICAgIB/gIGAfXx9fX18fX19fX19fX19fXd3d3d3fX55d3d4e3p7eHd2e317eXt4fHl4eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt8fHx8fHx8fHx8fHx8fH19fX18fH18fH18fHx8fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8foqJjo2JhISEg4KCgoKBgYKBgoKCgYGBgoGAgYKAgICAgH+BgIB8fH19fX18fX19fX19fn5+d3d3d3d5fHl7eHx9eXt5enl6fXp5e3l8eHh4eHh4eHh4eXl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt7fHx7fHx8fHx8fHx8fXx8fX19fX19fXx8fHx8fHx8fXx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx/iIeNioeFhoaDg4ODgoGBgoGCgoGBgYGCgYCAgoF/gICAf4CAgHx8fX19fX19fX19fX5+fn53d3d3d3Z4eHl3eXp4enh5eXh7eHl6eXl4eHh5eXh4eHh5eXl5enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX18fH18fH19fX19fH19fX19fHx8fHx8fHx8fHx8fX+HiIyIhoeHhIKDhISCgYKBgYKCgoGBgYKBgIGBgYGAgIB/gIGAfHx9fX19fX19fX1+fn5+fnd3d3d3d3d3d3d3eHh4eHh4eHh4eHl5eXl5eXl5eXl5eXl6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fHx8fX19fHx8gIeIi4eHiYaEg4SDg4KBgYGCgoGBgYKCgYGBgIGBgYCAgICBgX97fH19fX19fX19fn5+fn5+d3d3d3d3d3d4eHd4dnl5eHh4eHh5eXl5eXl5eXl5eXl5enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fH19fXx9fXyBhoqKiYmIhIOFhISCgoGBgYGCgYGCgoGBgYCAgYGAgIGAgIGBf3x8fX19fX1+fn5+fn5+f394eHd4eHh4eHZxZGpeam15eXl4eHl5eXl5eXl5enp6enp6enp6enp7e3t8e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIGFiYqJioeEhYWEg4KBgYGBgoKBgYKBgYGBgYCBgYCAgYCBgIF+fH1+fn5+fn5+fn5+fn9/f3h4eHh4eHh5bWRiZV9fXm95eXl5eXl5eXl5eXp6enp6enp6enp6e3t7e3t7fHx8fHx8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goWKiomJhISGhYSDg4KBgYKCgoGBgoGBgYKBgIGBgICAgICBgX58fX5+fn5+fn5+fn9/f39/eHh4eHh4eW5kZWdlZGJeZnh5eXl5enp6enp6enp6enp6enp6e3t7e3t7e3x8fHx8fHt8fHt7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChouJiIqEhYaEg4OEgoGBgYGCgYKCgYGBgYCAgYGBgIB/gIGBf3x8fn5+fn5+fn9/f39/f394eHh4eHl3Z2VkZWZkZWFfaXl6enp6enp6enp6enp6ent7e3t7e3t7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHt8fHx8fHx8fHx9fX19fX19fX19fX19fXx9fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4eJh4SEhoSDg4WBgYGBgYKCgYGBgYKBgICAgYGAgYCAgYF+fHx/f35/f39/f39/f39/gHl5eXl5eWtlYWJlZWFlZV5ieHdze3p6enp6enp6enp6e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fH18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19g4aLhoiFhYaEgoOEhIKBgYGBgoKBgYKBgYGAgYGBgYGAgIGBgn98fH9/f39/f39/f3+AgICAeXl5eXl0Y2NlZGNmY2doZGZsZF5ze3p6enp6enp6enp6ent7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn6DhouGhoaGhYODg4SDgYGBgYGCgoGBgYKBgYCAgYGBgYCAgYGBfnx8f39/f39/gICAgICAgIB5eXl6d2RhY2diYmRdW2VfYV1eYGFoeHp6enp6enp6enp6e3t7e3t7fHx8e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+foSFi4eGhoaGhIODg4KBgYGBgoKCgYKBgoGAgIGBgYGAgYGBgYF+fX1/gH+AgICAgICAgICAgHl5eW9vYmJiZF5jZ19dYWFgXF9kYlttfHp6enp6enp6enp7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7fHx7e3x7fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5/hIiLhoSHhoaEhIODgoGBgYGCgYGBgYKCgYCAgYGBgYGBgYGBgX5+fYCAgICAgICAgICAgICBeXpwXWJlZGJkXmZnZ2BZYmJhY2VfXF1ze3t6enp7e3t7e3t8fHx8fHx8fHt7e3t7e3t7e3t7e3t7fHx8fHx8e3x8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fn19fn5+fn5+fn5+fn5+foCFjIqEhYaGhYODg4SCgYGBgYKBgYGBgoKCgYCBgYGCgICAgIGBf35+gICAgICAgICAgIGBgYF5emxiZGdjYmdmYWBgZGFiZWRjZGNeXGJ1fHt7e3t7e3t7e3x8fHx7e3x8fHx7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/gYeMiYWGhoeFg4SDgoGBgYGBgYKBgoKCg4KBgIGBgYKBgYGCgoF/f36AgICAgICAgIGBgYGBgXp7dGdnZmZkZGZmYF5fYWNlaGRlXmJkYHR8e3t7e3t7fHx8fHx8fHx8fHt7fHt8fHt7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f3+CiYqIhoaIhoWDhIOCgYGBgYGBgoGBgoKCgoGAgYGBgoKBgYKCgX9/f4GBgYGAgYGBgYGBgYGBenptaGNjZ2ZnZWdmZmdiZWRlYmdbYmVgdnx8e3x8fHx8fHx8fHx8e3t8fHx8e3x8fHt7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f39/f4SJioiGiYeFhYSEg4KBgYGBgYGCgYKCgYGBgYGBgYKBgoGBgICBgH9/gYGBgYGBgYGBgYGBgYF7emlpZGNqZmFgZmVjY2NnaWRjYmBiZGJ0fXx8fHx8fHt8fHx8fHx8e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f39+fn9/f39/f39/f3+AhIqMiIeJhoSFhYOCgYGBgYGBgYKBgoGBgYGBgYGBgoKBgYGBgYGAgH+BgYGBgYGBgYGBgYGBgXZzZWRnY2RmZWJlZmdkZmhmZWNgYGNkYHF9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fXx8fHx8fHx9fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/fn5+f35+f39/f39/f3+AgICFioyJiIqIhoaDgoKCgYGBgYGBgoGBgoGBgYGBgIGBgYGBgYGCgX+Af35/foCCgoKCgoKCgoKCc3NnZWRkZWlqaGZnZ2NhZmZlZmdmZWVjdX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fH19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gICAgICAgIWLioqJioeHhoSCgoGBgYGBgYKCgYKBgYGBgIGBgoKBgYGBgYGAf4B+dHRzdX1/goCAfn5/gYB0cmdkZWNmaWppZWNlY2BmZGRnZ2JiZWFwfXx8fHx8fHx8fHx8fHx8fHx9fX18fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f39/f39/f4CAgICAgIB/houLiouLh4eHhIOCgYGBgYGBgYKBgoKBgYGBgYKCgYCBgYGBgoCAgH5zc3NzdHV4dXV0dHV2dXVwZmNmZWhoaWdoZ2VmZWJfZGVmY2BiZ3d8fHx8fX19fX18fHx8fH19fX19fX19fXx9fXx8fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gIB/f3+AgICAgICAgICHjIyIi4qHh4eEhIKBgYGBgYGBgoGCgoGBgICBgoGBgYKBgoKCgYCAfnNzc3Nzc3NzdHR0dHNzdW9jY2FnZWhoZ2pmZGVnZmhmY2JlYl5ieX18e3t8fX19fX18fHx9fX19fX19e3x9fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn9/fn5+fn5+fn5/f39/f4CAgH9/gICBgICAgICAgYCAf4CAgYGAgIeLi4iNiYiJhoSFgYGBgYGBgYKCgYKCgYGBgIGCgoGBgYKBgoKBgIB+dHNzc3Nzc3Nzc3Nzc3N1cmdlZWRlamhoZ2ZpaGdjZWViZGNoZGd7eHVzc3R2dnl4dnR0dHZ3d3d2dHR0dXV4d3h4d3d6e3x9fXx9fn5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f35/f39/gH9+fHt7fX58eXl2dnZ5fHx6end2d3l7fXt4hIyMioyHh4iEhYSBgYGBgYGBgoGBgoGBgYGAgYKCgYGBgoGBgoGAgH51c3Nzc3Nzc3Nzc3Nzc3VzaGVnaGVrbGhqZ2lqZ2dnZmRkYmVkbnV0dHNzdHNzc3Nzc3Nzc3Nzc3NzdHNzc3Nzc3Nzc3N0dHV1c3V3eHl7fn59fn98f39/f39/f39/f314fH5+fXx4dXZ3eXd4dnRzc3N0dXRzc3Nzc3NzdHNzc3R0c3R0dHODjI2KiYeIhoOGg4GBgYGBgYGBgYGCgYGAgYGDgoKCgYCBgYGBgYCAf3VzdHRzc3Nzc3Nyc3NzdnZpY2hqaGpsZWZpbGhgZmVkY2BkZGZ0dXV1dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHRzdHRzc3Nzc3R2dnV1d3V4fH9+fX9+fHp4dXN0dXV1dHNzc3Nzc3N0dHR0dHR0dHR1dXR0dHV1dHR1dXR1dXV1dIaMjYuIhoeEhIWCgYGBgYGBgYGCgoGAgYCBgYKCgoGBgIGBgYGAgIB/dnNzc3Nzc3Nzc3Nzc3N2dnNnZ2pmaGdmaGhmZGlnY2NnZWVmcHZ1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dHR1dHR0dHR0dHRzdHR0dnV1d3Z0c3R0dHR0dHR0dXV1dXV0dXV1dXV1dXV0dHNzc3N0dHNzdHR0dHR1dXR1iY6MjIqHh4SEhYKBgYGBgYGBgYKCgoGBgICAgoKBgoGBgYGBgYCAgH93c3Nzc3NycnJyc3NzcnZ2dW5kXWNnZWlraGVoZ2dqamlnZXB2dXV1dXV0dHRzdHR0dHR0dHV1dXV1dXV0dHV1dHR1dXV1dXV1dXV1dXR0dHV1dXV1dXV0dHV0dHV1dXV1dXV1dXV1dXV1dXV1dXV0dHNzc3Nzc3N0dHNzc3Nzc3R0dHR0dHWKjoyMiYaGhIeFgoGBgYGBgYGBgoKBgYGBgYGCgYKBgYGBgYKBgYCAf3hzc3Nzc3JycnJyc3NzdnZ3d2liaGhnamtpaGZkZGVmaWhwdXR0dHRzc3JxcnJ0dXV0dHR0dHR0c3NycXFxcXNzdHR0dHR0dHR0dHV0cnJyc3R0dHR0dXV1dXV1dXR0dXR0dHR0dHR0dHR0dHR0c3Nzc3Nzc3Nzc3Nzc3N0dHN0dHR0dHR0dYuOjImGhYWFh4SCgYGBgYGBgYGBgoKCgYGAgIKCgoGBgYGBgYGBgIB/eXNzc3NycXJycnJzc3N3d3d3bGpoZGhpa3Z6a2VmZWhnbXJzdHN0c3JwcHBxcnN1dXR0c3Nzc3JycXBvb29vcHFzc3NycnJyc3R0dHNxcXFyc3RzdHR0dHRzc3Rzc3N0dHR0dHRzdHR0dHR0dHRzdHR0c3NycnFxcnJzc3Nyc3NzdHR0dHN2jZCMh4eFhYSEgoGCgoGBgYGBgYGCgoKBgYGAgYGCgoGBgoKBgYGAf395c3NycnFxcnJycnNzc3d3d3dzc2pnaWloeX99cW51bG5wcXJycnFxcG9wcXFxc3R0c3NycXFxcG9ubm1ubW5ubnBxcnJycnJycnJzcXBvb3BxcnJzc3JxcnJycnJycnJycnJzc3Jzc3Nzc3Nzc3Nzc3Jxb29ubm9vcXJzc3Jyc3NycnNzcnaPj4uHhoWFhYOCgoKBgYGBgYGBgYGBgoGBgYGCgoKBgoGCgYGCgX9/f3hxcHBwcXFycnJyc3Nzd3d2dnd2cnF0c252f352c3hwcHBycnJycXFwcHFxcXJzc3Nzc3FwcXBwb25ubm5ub25vcHBxcXFxcXBwcXJvb25vcHFxcXFxcHBxcXFxcXJycnJycnJycnFxcnFxcnJycnFwb29ubm1ubW5vcXJycnJycnJyc3JxeI+OjYaDg4aEgoOCgoGCgYGBgYKBgYGCgYGBgYKCgoKCgoKBgYKBf4B/d29wb3BxcnJyc3Nzc3J2dnZ2dnZ3dnZ1c3l/fnd3d29wcXFxcXFxcHBwcXJycnNzc3JycHBwcHBwb29vb29vb29wb3Bvb29vcHBxb29vcHBwcHBvcG9wcHFycXFxcnJycnFxcXFxcXFxcHBwcHBxb29ubm5tbW5tbm9wcXFxcXFxcXFxcXB7j42NhoODhYOCgoKCgYKBgYGBgoGCgYGCgoGCg4KBg4KBgYGAgYF/f392bm9wcHBxcXFxcXBwcHZ2dnZ2dXR0c3NxfYB9fX9zb3BxcXFwcHBwcXFwcXFxc3FycnFwbnyCb3Bwb29wcG9vb29vb29vb3BxcXBub3Bwb29wb29wcnJycnFxcXBxcnFwcXFxcHBwcHBwcHBwb29ubm1ubm5ubm9ub3BwcHFxcXFxcXFxcIKRjoqEhIOFhIOCgoGBgoKBgYKBgYGBgYGCgoKCgoKCgYGBgYCBgX9/gHVvb29wcXFxcXBwcHBwdnZ2dXRzcnJycnGAgoCBeXBwcHBvcHBwcHFxcXFxcXCHhnBycW9ymIJucHBwb3BxcHBvb29wb29vcXFwcG9wcG9vb25vcHFxcHBwb3Bvb3BwcHBwcHBwcHBvb29vb29vbm5tbW1ubm5ub25vb3BvcHBwcHBwcHBwiZCMiISDhIaDg4KCgYGCgoKCgYGBgYCAgYGBgoKBgYGBgYGBgIGBgH+AdG5vb3BxcXFwcG9vcG92dnVzcnFxcXFxcICDg39ycHBwcHBwcHBwcHFxcHBxcX2hgnByb4uefG5wcHFwcHBwcHBwcHBvcHBxcXBwcHFxb29vbm9wcHBvb29vcHBvb3BwcHBwcHBwcHBvb29vbm5ubm5ubW5ubm1ubm9wcG9vb29vb3BzcXWPj4uJg4KFh4ODgoKBgoGCgoKBgYKBgYGBgYGBgYGBgYCAgYGAgYGAf4B0b29vbm9vb29vb29vb3Z1dHNxcXFxcXJygIKCgXRxcXFxcXFxcXFxcXFxcXFxdZ2hd3F3n5x9b3FxcXFwcHBwcHFxcXBxcHBwcXBwcHBwcHBwcHBwcHBwcHFxcXBxcXBwcHFwcHFxcXFxcXFxcXJxcnFwcnRycnR0dHR1dnRzdHR0dXd3gpCPi4iDgoaHhISCg4GBgYKCgoGBgoGBgYKBgYGBgYGAgICBgYCBgYB/gHVvb29vb29vb25vb29vdXRzcnJycnJycnKDg4OCdnFycnFxcXJxcnJxcXJycnJxmKiQb4KjnX5wcXFycXFxcXFxcXFxcXFwcXFxcXFxcnNzcnJyc3V1dHR0dHR0dHV2d3d3d3d3eHh4eHd3eHh3d3Z3dnV2dnZ2d3h6e3x7e3t6enp6enyGkI2LiIODiIeHhYODgoGCgYKBgYGBgYKCgoGBgYGAgYCAgYGAgIGBgH+Ad3FxcXFxcG5ucG9wcG92dHV1c3Nzc3NzdYiDgYN5cnNzcnJyc3Jyc3Nzc3JzdHKTqaR5iKCdfHJzc3Nyc3N0dHV1dXV1dHV3eHd3d3d4eHh3eHh4eXl5eXl4eHl5eXp6e3t7e3t6enp5eXh3d3d1dnV2dnd5enp7fn5+fX1+fn5/gH5+gIyQi4qHg4WIi4iEg4SDgYGCgYGBgoGBgoKCgoKAgYGBgYCBgYGAgIGAf4B8enp5eXx5eHh2dXZ2dHl2d3h3d3Z3dnZ6fnx+fXx2dnd3dnV4enh4eHh4d3h5eZ+0qaSoqJd9e3l5eXh4eXl6enl5eXh4enp5eXh4eHh3dnd3eHh3eHh5eXp7e3p8fH1+fX9/f359e3t7e3p5enl5e3t/foB/fn5/fn19fX5+f35+fn6AjpCNioeEhoqLiIaGhIOBgoKBgYGCgYGCgoKCgoCBgoKBgYGBgYCBgIF/f4B/fn19fX9/f318e3t7eXh4eHh5eXl4eXh5eXl4enp6enp6e3t7fH1+fHt8e3uJr6ahtauso357enp4eXh4ent6enp5eXp8fHt6enx8fHp6ent9fHx+fn+AgoGAgYKAgH9/gYGBgIB/f35+fn5/fX1+f4CAf35+f39+fn9/f39/gH+Af4OQjoyHhoWIi4yIh4aFg4GCgYGBgYKBgoKCgoKBgYKDgoGBgYGBgIGBgIB/goOCgoGBgX99f39/f4F6enh4d3h4eHh5eHh5enp5e358enx9fXt8fX19fX19fZillqGyoJmnk32Af319fYCDgoCAf318fXx9fXt9fXx8fH19fX1+gYGChISDgoB/gYGBgH9/f4B/f39/f39+fn9/f39/f35+f3+Af39/gICAf4CAgICAhJCPi4eGhoiLi4mKhYaDgoKCgYGBgoGCgYKBgYGBgoOCgYCAgYGAgIGBgH+ChIKCgICAgH9+fn+AgH9/fn18fX19fYB/fX+Af35/gH9/fn9/gICBgICBgIGBnJyOoK+gn6KfgICBgH5+f39+f4B/fn5+f39/gYB/f4CBgYCAgYOEgoGCgoGCgH+AgYCBgYGAgH+BgICAf39/gICAgYGBgIGBgYCAgICBgoGBgYCAgYGFjo6MiYeHiYyLi4qGhoOCgoKBgYGCgoOCgoKBgIGBgYKCgICBgYCAgYGAf4KFg4KBgYCAf39+fn+AfX5+fn19fX5/fn9/f35+fn+AgYCAgICAfn9/gICBgYCXmo6YsaGYlpyFfH5+foB+fn5/f35/gICBgoKDg4KCg4KBgYKDg4OCgYGBgYKBgoKCgYKBgoGBgYGBgoKCgYGCgYKCgoGBgoKBgYKCgoKCgYGBgoKCgoaPkY+KiImKjY6MiYaFgoKCgoKBgYKCg4KCgoGBgYGBgYF/gIGBgYCBgIF/gYWEg4KCgoGCgYCAgIB8fHx7fH18fH9+fn9+fn5+f35+f39/f39/gH5+gIF+fp+rpZakm5uWoJ+Gf359f4B/gIF/f39/f3+BgYGCgoCAgYKDg4SDg4ODgoKCgoKCgoKCgoKCgoGCgoKDg4OCg4ODgoKCgYKCgoODg4ODgoKCgoODg4KCh5KTkIqKiouPj42Lh4SCgoKCgYGBgoKDgoKBgYGBgIGBgICAgYGBgIGBgYCAg4SDg4OEg4ODgoKCgXx9fHx9gn1+f4GCiIGCgoSCgYGDg4GBgYKDgoODho2fsqiioJidnaaoraigmZCHgYCAgYCAgH9/f3+AgICAgH9/gYODhYSEg4SDgoKCg4OCgoOCgoODg4ODg4SDg4KEhYWDg4SEgoKDhIOCg4ODg4OCgoODgoCKlJOPioqMj5GPjYuGg4KCgoKBgYGBgoOCgYGBgIGBgoGBgICBgYGAgYCAgH+BgoODg4SEhIOCgoKCfXx8fn6AgYOAg4OChIaFhoaFhIWFg4ODg4ODho2grbGmm5qgm56cnJ2hpKOdlIeDg4KDg4ODgoGAgIKCgYOCgYKCg4OEhYWEg4OChISEhIOEhISDg4OEg4ODg4OEg4SDhIWEhISDg4ODgoKCgoKCgoKBgYKCgo+UlI+Njo6RkY6KiISCgoKCgYGBgYGCg4GBgIGBgYGBgYCBgIGBgYCBgICAgIKChIKChIOCg4ODgoJ9fX2AgH+AgoGDg4ODhIaEhIOEhYWDg4GBg4OBg4uXmZeWmKCbnZ2dmZqXkImGhoeGhoeHhoaEgoGCg4SDg4ODg4ODhISFhYWDhISFhISEg4KBg4OCg4SEg4KCg4SCg4ODg4OCgoKCgoKCg4ODhIOFhYWFhoaIk5OTkI+Pj5KRjIqIgoKCgoKBgYGBgYKDgoKBgIGBgYGBgICAgYGBgICAgICAhISEgoKCgoGBgoKBgX+AgYOCgICAf4CCgoGDg4KCgYODg4SDg4GDhYSCgYGGjpSTl5qcnJuUj4mHiIiHh4eIiIiFhIOBgIGBgoKCg4GCg4SEhYSDg4OEg4OEhIOBgYGCg4OEhISDg4ODg4OEhIODgoSDg4ODhIWFhoeHh4eIiIiJiY6Tk5KOj46Rko+LiYeCgoKCgoKBgYGBgoKCgoGBgIGBgYGAgICBgYGAgIGAgICDg4KCgYKCgYGAf4CBhYWFhoOCgYB+fn+BgoSCgYKDhIOCg4ODg4KChISDhIODiJCTj5WYkoeDgoWFhYOEhIWFg4KBgH9/gIB/gIGEg4OEhYWEgoKBgoOCg4OFhIKDhISEhYaGhoaGhoWFhoeHhYaIh4aHiIeGhoaIiYeHhYaGhoeIkZORkI6QjpGRjImIhYGBgoKCgoGBgYGBgoOBgYGBgYGBgICAgICBgYCAgICAgISEg4KBgoGAgYGAgYKIh4aHhYSCgH99fX6AgH+AgYGBgYGBgoGAgYKDgYKCgoGAh5uIi4eCgoKBgICAf4GAgICAgH9+gIGBgYKCg4OEg4OEg4OCgoGBgoODg4SEg4SEhIOFhYaFh4eIh4eHh4eHh4eGhoaGh4WFhYaGhISEhIWEhYaSk5GOj4+OkI6JiIeEgoKCgoKCgoGBgIGCgoKCgoKCgYGBgYGAgYGBgICAgYGAgoSDg4KDgoGCgYKDg4iIh4iHhYSCgX5+gICAfn5/f4CBgYGCgoCBhI2DgH+AgIB/g4iOgIGCg4OBf39/gYCAgICAgICDg4KDg4ODgoOBgYKCgoOCgYKCgoOCgoSDhISDg4SEhYWFhYaGhoaFhISEhYWEhIWFhYSEhISDhISEhISEipSTkZCQj46NiYaFhIOBgYKCgoKCgYGAgYKCgoKBgoKBgYCBgYCBgYGAgICAgYGAg4OCgoOCgoKBgoOCiImJiYiHhYSDgYKEhIOBgoKCg4SCgoSEgoOJloiEgoSCgn9/jJWCgoGChIOBgYGCgoODg4KDg4ODg4SEg4OCg4KDg4ODg4KCgoKCgoGDhISEhYSFhYWFhIWEhIWFhYWDg4OEhISEhYWFhISEhISEg4ODg4OOlZKQkZGPjYyHhYODg4GBgoKCgoKBgYCBgoOCgYCCgYGBgICAgIGBgYCAgICBgICDhYSEhIODg4SDhIOGh4mIhoWDhIODg4WDgYCDgoWFhISDg4OChI6Zi4OFhISEgoCRmYaCgoKEg4ODgoSEhYSDg4ODgoKDhISDg4ODg4SFhISDg4KCgoKCgoSEhYSFhYWFhYODhYWFhYaFhoWEhIWEhYWGhYWFhIWEhISDhIODhJGUk5KTkI2MioWEhIODgYGCg4KCgoKBgYGCg4KBgYKBgYGBgICBgIGBgH+AgIGAgYaGhoaGhoaHh4aGhYSDhYaCgIGBgYGHgoB+f4GBj4yDgX9+fXx9jJyOgIKBgYKChJSUjIGCgYKDg4GLnJqhmoqCgoKDg4OEgoKEhIOEhIWEg4OCgoKCgYKCg4ODg4SFhYWFhIOEhYWGhYWEhISEhIOEhIWFhYWFhIODhIOEg4KGlJSSk5KPjYyIg4SEg4KBgoODgoKDg4GBgoKBgoKCgYGCgYGBgYCAgYGAgICAgICAhYWFhYaGhoaGhoWGg4ODg4GAgoKCgYKAf35/f4GVl4mAfX19fXuBmIyAg4GBgYCOlIyQgYKBgoKBiZKQjJajo4+BgoKCg4OBg4SDg4ODg4OEhIKCgoKDgoKDg4ODhIWEhISEg4OEhIODg4OEhIODg4ODg4SDg4ODg4KDg4KDgouUk5KTko2NioaDhIOEgYGCg4ODg4ODgoGBgoGCgoKCgoKBgYGBgICBgYCAf4CAgICDhISFhYWFhYWEhIWCg4KDgoKDg4OBgICAgICAgJWfin5+gH2Hi36EhIOEgoODgo2JhYyCgoOCg4KTlJaYkpeenImBgoODgoKDg4KCg4KDg4WEg4ODg4SDg4SEhISEhYWEhIWEg4SEg4OEhISEhISEg4SEhYSDg4SEhIODgoKDkJSSkpKPi4yIhoSFg4OBgYKDg4ODg4OCgYGCgoKCgoKDgoCBgoGAgICAgIB/gICAgISDhYWEhYWFhYSFhYOEhIWDg4SEhIKCgoOCgoSBkaGKf4yFfYaJgH6FhYWEhYJ/fX19f4KEg4OEhIuZlJqZl5aVkoSEhISEg4SEhIOEg4OFhoWFhYSFhYWFhYSFhoaGhoWFhYWFhYWFhYWGhoWGhoaFhoaGh4aFhYWFg4SEhIeTk5OSkoyKiIWGhYWCgoGBgoODg4OCg4KBgYKDg4ODgoKBgIGAgICAgICAgH+AgICAhYWFhYWGh4eGhYWFhISFhYSEhISEg4ODg4OEhYOJkYOEi4WCgYF+fYGHhoOAfn5/f35/gIOEg4SEkZWDiZaYlpWUiISFhYWEhYSGhYWFhYaGhoWGhYWGhYWHhoaGhoaFhIWFhYWFhIWGhoaHhoaGhoaHh4iIiIaFhYWEhYWGjZSTkpGQi4qHhoeGhIGCgYKDg4ODg4KDgoGBgoODg4KAgYGBgICAgICAgICAf4CAgICHh4eGhoeHiIeHhoaEg4ODhIODg4OEg4ODg4OEhISEgYKCgYmBf359foWBf39/f39/f36AgISFhIWdk4GBmJmYmJaLhYaFhoWFhoeHh4iGh4eGhoaHh4eGhoeHhoaGhYODhIWFhoSFhYaGhoeHhoaGhoeHh4eIiIeGhoaHh4eRlJORkZCLiYiFhoWDgoKBgoODg4ODgoKDgoKCgoOCgYCBgICBgICAgIGAgIB/gICAf4aHiIeHh4eIiYmIiIODgoKDgoSEhIWEg4KCg4SEhIOBgICAhIR/fn1+gH9/f39/gIB/f4B/f4WFiKGgm5ufnpKNkIqHiIiIhoaHiImJiYmIh4aHh4eJiIaHh4eHhoaFg4OEhYaGhYWFhoaGh4eFhoeGh4aGh4eHh4eHh4eFh5OTkY+RkIuHhoWFhIKCgYGCg4ODg4ODgoKCgoGCg4KCgIGBgYCAgICAgICAf3+AgYB/hoiIiIiHh4iJiYmIg4KCg4ODhIWHh4aFg4OFhISDg4GAgIGMiYGAgYGCgYGBgYB/gH9/fnt6gIiaoJqao6KbjIGMioiKi4qIiIiJiYuLioqIh4eIiIiHh4iIh4eGh4aEg4OFh4eHhoWFhISDhYWEhYWGhISEhYWFhoWGhYOJlJKQj5GOioaFhoWDgYGCgoKDg4ODgoKCgoKCgoKCgYGBgYGBgYCAgICAgIB/gICBgH+GiYiIiYeIiImJiIiEgoKDg4KDhImKh4aEhIWEg4OCgICAhISCgoKDg4KCgH9+fX19fX5+fHt7lKGXlpmfn5uYi4uJiImLiomJiImIioqJi4mGhoaGh4WGiIiIiIaGh4SDgoSHiIiIh4WCgoKDg4KDg4SCgYKDgoGEg4SDgY6TkpCPj4uIhYWGhIKBgYGBgoODg4OCgoKCgoKCgoGBgYGBgIGAgICAgICAgH+AgIGAf4WIh4eHhoeIiIiHh4SCg4OCgoOFiYqJh4WHhYSFhYKAgYOEgoOCgoODgX59fX5+fn5+fn1+fX2BlZOQl5iTmJqXjYeHh4iHh4mHh4aIh4aJiYSDhIOFhISFhYaIiIaFg4KCg4WHhoeGhoSCg4OEgoODhIKBgoGBgYODhIOEkZKQjo+Oi4eFhoaEgoGBgYGDg4ODg4KCgoKCgoKCgYGBgIGBgYCAgIB/gIGAf39/gIB/hYaGhYaGhoeHiIeGgYKEhIOChYeIi4qGhIaEgoaGgoKEhIODg4OCg4F9fH1/gH9+fn59fH1+fHqAkY6PkI6TmJmKg4aFhYODhYSEhISEhIWEgoKCgYSEgYKDg4WGhYSCgoGCgoODhYSEhIWEhIaDg4OFg4KDgYKDg4SFhIeSkY+Nj4yJhYSFhIWCgYGBgYODg4ODgoKCgoKCgoKBgYGBgYGAgICAf4CAgYB/gICAgICDhIWEhYWFh4eHh4aAgYGFg4OEhYSHiIWCgICAgX9/gYSEg4ODgoKAfX1/gICBf31+fn18fX17enqFkI2Mj5SXlISAgoKBf36BgYGCgYOBgoGCgoKBg4SAf4CAgYKCgICAgYCBgoGDgYGChIODhISCg4SDgoKBgoSDhYWGi5ORj4+Pi4iFhYODhIGAgYGBgoODg4KCgoKCgoKCgoGBgYCBgYCBgH9/gIGBgICAgH+AgIKCg4OChIOEhYWGhn+BfoCBgICAgIGDgn9+fn5+fX+ChISCg4KDgn59fn+AgIGAfn19fX1+fXx6e3uIj42Nj4+Gf35/gIB+fYB/foCAgX+AgIF/f4CBgX59fX+AgX9/fn+AgH+AgICAf4CCgICCgYCCgYGAgYGBgYKEg4aPkpCOj42Kh4eGg4ODgYGBgYGCg4ODgoKCgoKCgoOCgYGCgYGBgICAgH+AgICAgICAf39/gYGDhIGCgoOCg4SFgIB/fHx9fn19foCAfn1/fn1+gIODg4KCgYF/fX1+f4CAgH99fX19fHt7e3p6enuLj42Qhn5+fn5/f35/gH9+f3+Af4CAf359fn9/fn18fn+Af35+f3+Af39/f4B/f39+f4CBf4B+f39/gH9+f4B/hZKSj46Pi4uHiYWEg4KBgYGBgYKDg4ODg4OCgoKDg4KAgYKBgYGAgICAf3+AgIB/gIF/f36BgYSEgYKBg4OCg4OBgH99fn9+fX5/f4B/foF/f4CBhIOCgYB/f359fn5/gICAfn19fX17e3x6enp6eX+OjpSKf39/fn9/f4CAf35/f4CAgoB/fH5+f35+fXx/f4B/fn5/foB/f35/f4CAfn5/f39+f35/f35+fn19fX2Fk5KOjIuKiImIhISEgoKCgYGBgoOCgoOCgoODg4ODgYCBgYGBgYCAf39/f4CAgICAgIB/foCBhIOCgYGDhISDhICBgICBgIGAgYKCgoGBgoCBg4ODgYGBgYCAfX19fn5+f359fX19fXx8fHt6enp6eYOQjZWMgYKAgIGAf4F/gICAgYGCgoB+gH5/fn5+foGAgYB/f39/gICAf4B/gYB+f3+Afn9/fn+Af31+fn17fIaTkYyLioeHioiGhoSEgoGBgYGCg4ODg4OCg4OCgoKBgICBgYGAgH9/f39/gICAgICAgH9+fn+BgYGAgISGh4aHgoSDhYKBg4ODhYSEhISEg4ODhIKCgoKCgX5+fX19fn6AfX19fX19fX19fHp6eXl5e4eIlJWEg4GCg4GAgoCCgYGDgoODgYGBgIGAf4CBg4GEgoCAgYCBgYGAgYCCgX+BgIF/gIB/gICAfn9/fnx8iZSQiomIiIiJiIaGhoSCgoGBgoKDg4ODg4KDg4KCgYCAgICAgYGAf39/f4CAgICAgIGBf359fn5/f39+g4aHh4iChYSFg4SFhIWGhYaGhoWGhYGBg4ODgoKAfX19fX19fn59fX19fX18fX18e3l5eXl5fIKHkYSDgoSDgoKDhYeCg4SDgYKCg4OCgoKCgYKFg4iFgoGCgYKDgYGBgYSDgoOCgYKCgIGBgIF/gIGAf36Ok4yHiIeIh4aGhYaGhIKDgoGCgoODg4ODg4OCgYGBgH+AgYGBgYB/gH9/gICBgH+AgYB/fn19fX5+f36Ag4SHh4SGhoaFhoaHh4aHh4iHh4eGf32AgICCgX59fX19fX19fX19fX18fH5+fnx7eXh4eXl6fYGHf4KKhIOEhISXl4ODhIF9foGBgoGBgYKBg4aIjIWDgoKBhIKDg4KDhYSEhYODg4OCg4OCgoKCg4OCgpGQi4iIh4mHhoaEhoWEhISDgYKCg4ODg4ODgoGBgYCAgICBgIGBgH9/fn+AgICAf4CAgH9/fn1+fn+Bf4CCgYWFhYeGh4eHh4eIhoeHh4eGh4V+fX18fX9+fX19fX19fX19fX19fXx7iJKCe3x6fIZ5eXp7fX98hZGDg4OEhJSTgIGBf39/fn6EjIB/gICEhpCJhYSCgoGFhYuCgYKFhYaGhISFhYOEhIODhIOEhISIko+MiYiIiYeHh4WGhYSEhIKBgoKDg4ODg4OCgYGBgYB/gIGAgICAf39/f4CAgICAgYGBf39/f4CAgIGBgYGBg4OGh4aGh4aGiIeGhoaFhIOFhH59fHx8fX18fH19fX19fX19fX18fH+RlZaDe3qElHx5enp6ent/goCBgYOCgH59f397iJF8fI6WgH1+f4KGioWDg4SDgoOMiX9+f4OEhYWDhYaFhIWFg4SFhYaEhI6Rj4yKioyJiImHhYWFg4ODgYGCgoKDhIODgoGBgICBgICAgYGAgIB/f3+AgIB/gICAgX5+f4GBgoKCgoODgoOCgoWGhISFhYSGhIOEg4KBgIKAfn19fHx9fXx8fH18fH18fX19fHx8e4uRl4x6e3yBenl6e3x5eHx9foB/gH99e3t/fn2ClZF/hIh9fH5/goR8fIGChIN/f4eDfYKBgIKCgIODg4SEhISChIOEhYGEkZGOi4yMjoqJiYWFhYODg4KBgoODgoKDg4KCgYGAgIGAgICAgICAgH+Af3+Af357gICBenyAgYKDhYODhYWFhYODg4SCgYKDgoOCgoGBgIB/gX5+fX19fHx8fHx8fHx8fHx8fHx9fHx8fn6Kgnt6e3p4ent7fH17fn5+f35+fn19fICBgH2Gj4F+fYJ+f36Agnx8gH+CgIGAfnx7ioJ9gH9+gYCAgYKBgoCAgIGAf4uUkIyLjo6NiIiHhYWFhIOCgoKCg4OCgoODgYGBgICAgICAgH9+fXx7fHx9f3+AgHx6gYF4e4CCgYOFhIOFhYaHhYSAhpSIgIKBgYGBgH9/f39/fn5+gHx8fHx8fHx8fHx8fHx9fHx8fHx9fHl6e3t4eHl7e3p8goCBf4CBfX9/gH99gIKCgICAgX+CkYF/f4CAfoB+fn9+gIGBfX19e319fXx9fHx9gH+AgH6Afn6ClJKNjY6Oj4qFhoaFhISFg4KDgoODg4OCgoGBgYGAgICBgICAf4CAf39/fXt6fICAgHh+gXd7gIF/goKCgoKEhoeGhn6IlYp+gIGAf4B/foB+f39/fn+Bfnx7fHx8fHx8fHx8fH19fHt9fHx8e3x8fHp6eXt8en2Fg4OBgYF+gH9/gH6FgoF+gH9+foCFhoKAfn6Dhn99fH5/gIGAf39+fX19fX57fH1/f3+AfX9+f4yRjo2Njo2Nh4SGhoWEhISDg4OCg4ODg4KBgYGBgYCAgYGAgYGBgYGAgH9/f397en9/e3mAd3p/f31/f3+Af4KEhoaFf3+FgX5/gIB/gH5+f31/gIB/gIB/f318fHx9fn18fX19fX19fH58fXx7fXx8ent6fH19f4aFg4GAgH1+fX5/fouEgYd+fXx8f36Cgn99fH19gXx7fXx+gYSDgYB+fn5+fXx+f4B9foB+f36Eko2NjI+NjIqGhIWEhISDg4OCg4KDgoOCgYGBgYGAgYGBgYB/fXx8fH1+f39/f397e399d352eH59fH18fX5+gYGCg4F6fn58fn6AgH5/f35/fn+AgH+AgH9/fn9+fn5+fn1+fn99fH59fn19fXt8fHx7e3p9foCAg4OCf35/fHx8fXx8gYN+jH58e3t9fn1+fX18e3t9fHt7e3uAhoSChIOBf4B+f4KCgn9/goJ/gIuQjY2MjYuKiISEhIOEg4ODgoKCgoKCgoKBgYGAgoGBgYKCf3+AgIB/fn18fH5/fn55fX52e3Z4fXx8fHt9fX6BgICAf31/f31+f39/f4B/f39/f3+Af4GBgH99gH9/fn9+fn5+f3yCfX59fX17e319fHp8fH2BgoGAgIB9fX18fHx8fH18fnt/fnt7e3x8fH18e3x7e3x8enp9en6CfoKEhIKBgoGFhoWFhoaHhYGEkY+Ni4qLh4eFgoOEhISEg4KCgYGCgoKBgoGBgYGBgoGBgoKAgYKBgYCAgH9+e3x+fnx6fnh5dnd8fHx7e317f4GAf35/foB/f35/f35/gH9/f39/f39/gYKAfn6BgIB/f39/f39+fYN8fH19fH99fX19e3x+fn5/fn5/fnx8fXx8fXx9fnt8e3x8fHx9fH18fXx9fHt7e3x5e3x7e316fX5+f4CAg4eJiYmKiYqJhYiSj42JioeFhYOCgoOEhIOCgoKBgYKBgYKBgYGBgYKCgoGCgoCAgX98e3p6eXt9enx+fnl8eXh4dHx8fHt8fHx+gH9+f39/gIB/fn5+fX+Af39/f4CAf4CDgoB/gIGAgIB/f4CAgH58eXx+fX59fX5+jIZ9fX57e4ODfX19fH18fX19fX19fH17fXx9fX59fn19fn18e3t7fHt8fHt6e3t6enp7fn2ChoiHiIqKi4uJjJGQjoqJhoWEgoKCgoODg4OBgYGBgYGBgYGBgYKCgoOCgYKBgIGBf3+Af356eHl5en5+e3l6eH5zfHx8e3x8fH5+fn5/gH+AgIB/fn9+gIF/f4B/gIGAgoODgYCAgYGAgX+AgYKBf39+f35+gH57foGRjHx9f4qAjYx+fn19fX59fX59fXx8fX19fXx9fX1+fX1+fnx7e3t8e318e3p7e3l6enl6e35/g4OEiImKiImOkI6MiYmFhISCgYKCgoKCgoGCgoKBgYGCgYKCgoGCgoKBgoKAgYGAfoCAf39+e3p5e319eHx6f3KBfXt7fXx8fn59fYGBf4GAgX9/gH+AgX+AgIGCgYGEg4SCgYGCgYKCgICBg4KAf4F/fX6Afnx+f4iCf36DkYSEg4F/fn18jYd9fX59fX1+fnx9fXx9fX5+fX5/fH18e3x9fnx8e3x9enp6eXl5ent+foCBg4eEiI+Oi4qHhYSEg4KBgoKCgoGBgYGCgoKBgoKCgoKCgoKCgoGCgn+AgIB+f39/fn5/ent5fX16enp9cX6Cent9fX19fXp4f4KAgYKCgICBgYGBgICBgoKCgoWFhIKBgYKBgoGAgIKEgX9+gX99foF+fX5/gIB9fn+EgH5+f31+fX2KhX1+f31+foB+fX18fH5+fn99f4B9fX18fX9/fHx7fH17e3t6enp6e3x9fn1/goCJjouMiIWFhYSDgoKCgoKCgYGBgoKBgoKCgoKCgoGAgYKBgYKCf4CAgH9/f39+fn59eXp6fXx5d3t0e4d8dHd9fn17e3Z2fYCBg4KBgYKCgoKBgYGDg4OChYaEg4CAgIGDgX+AgYSBfn6Af35+gH59fn6AgH6Bfn+Af39/gH99f39/fn+Afn9/gH58fX18fn5+foF/gH2CgHx9gIB9e31+fXx8e3x8e3t7fHt8fH19fIqKiYmGhoWFhISDgYKBg4KAgIGCg4KCgoOCgoKCgoGCgoGBg4J/gIGAf39/fn5+fn57enp8fHt2e3R3f352cnt+fnt4dnd8gIGCgoKBgoODg4OCgoSDhIOFhoOCgX9/gIKAf4CAg4F+foB/fX+AfX1+foCAf4J/gYCAgICBgH1/f3+AgICAgIB/fnx9fX19fn59g32AfoKAfX6AgX98fn59fX17fH58fXx8fHt8e3x+ioeHhYaIhYSFhIKCgoGDgYCAgoKDgoKCg4ODg4KBgYGBgYGCgH6AgYB/fn5+fn5+fn56e3p9goN9dXF6fHpxen59eXh0dICAgoKCg4KDhIOEg4KDhISEg4WEgYGAgH6Agn9+f36Bf35+f4B9foB9fX19gIB/gYCBgYCAgIGBfn6Af4GAgIGBgH9+fX19fn1+fn19gYR/gH9+f4GBf31/f319fn1+fn1+fHt8enx7eoCIg4SEhYSEhIWDgYKBgYKBgICCgoOBgoOEg4SDg4KBgYKBgYOAfoCBf35+fn5+fX5+fnt7en6Jh354cnl9f3F6eHt4eXV1fYKDgYODg4OFhIWDg4OEg4OEhYOBf3+Af4CBfn19fn9+fn5+gH19f3x9fX6Bf4CAgIKAgIGAg4KAf4B+gIF/gIF/gH9+fn1+fn5/fX6FhYGBgX+Ag4F/foGAf35/f4B/fn17ent6fHt6goWAg4KCgoKCg4GBgYCAgoGAgIKCg4KBg4SDhIKEgoGBgoGCgoB+gIF/fn1+fn5+fX59fXp7fIWEe3tzeXt8cHd1dnd5dXR6hISBhISDhIWFhoSDg4WEgoODgoCBf39/f4B9fX1+f31+f39/fn1+fH19foF/gIB/gIB/gICDgoGAf36AgH+AgYCBgH9/f39/f4B/gIGCgoKBf4CDgn9/g4J/f4B/gX+Afnx6e3p8e3yCgX+Cf3+BgIKCgYF/f3+CgH6BgoKDgYGDg4KEgoSCgYGBf4GCgH6AgH9/fX5+fX19fn19e3t6gH94fHZ5enxxdHh3dnh1cnmFhYKEhIKEhYWGhIOChIOBg4GAgIF/f39/gHx9fX6AfX5/f39/fX98fn5+gX+Bf39+f4B/gYOCg4B/f4GBgYKBgYGAgIGAgIB/gIGBgYKDgYF/gISAfYGDhICAgX+BgYKAfXp7e3x8fH99f4B8f399fYGAgH59fX9+foKAgYKBgIKCgoKBg4KCgYB/gYKAfn9/fn99fX1+fX19fX19ent7fHZ9eXh6enJ1eXl2d3dzdYaFg4WEgYSEhYSEhIGDgoGDgX+AgX5+gH6AfX19foB+f4B+fn99f31/f3+BgIF/f3x+gH6AgYKDgYCAgYOFgoGAgYB/gYCAgYGAgYGBg4OBgX+Ag4B+goOEgICCgYKChIJ+e3t8fHx9fX1+fXp+fX14fn9/fHx8fn5+gYCBgYCAgoGBgYGDgoGBf4CAgoB9fn19f319fX59fH19fX16e3p8dnx6d3t4cnZ5e3Z2dnN0hoSEhYSChISFhIODgoOBgYOBgIGBfX+BfoF9fX1/f39/gH5+f319fYB/gIGBgX9+fH5/fn5/gYJ/gYGCg4eFgX9/fn6Af4CBgICAgIGCgYCAfoCCf3+BgoOBgYOCg4OFgn99fX18e3x8eXp7en55e3l4f357fHt+fX1/f4F/gH6BgICBgoOCgYF/gIGBf31+fH1+fX19fX18fn58fXx5e3x4enx3endzeHd6c3Z2c3SFhISFg4KDhISDgoKCg4GCgoF/gYF9gIB+gH1+fX5/gIB/f39/fnx+gH+BgIGAf399f39+fn+BgH2AgIGDg4N/f359fn5/f4CAgIB/gYKBgH99f4F/f4CCgoCBg4KEhYaEgH59fH18fHt5dnl5enl2eXZ+fHt7e359e399gH99fX9/f3+BgoGBgX5/gYF+fX18fX19fX19fXx+jYF8fXl7e3p5fHd4eHR1dXhyd3d0dYaEhIWEg4ODg4OCgYKDgoGDgn+Bf35/fn+AfX19fX6AgIB/f39/fH9/f4GAgYCAf3yAf35+foB+fX5+gYGCgn5/fn1+fn5+f3+Af32AgYB+fn1/gX5+gIKCf4KDgoOEh4SAgH58fXx8e3x1eXl4eHh5d3t8e3t7foV9fn1/ent+fn59foGAgIGAfX6BgH59fXx9fX19fX18e32Dgnx8ent7e3p7d3Z4dXJzdnB4eXJ4hYWFhYOEhIOChIKBgYKCgYKBgIF/fn5+foB+fX58foCAgH+AgIB8gH6AgH+BgYB/fYB+fn5/f319fX6AgYGAfn9+fn59fX5/fn9+fH6Af35+fn+Cfn6AgIF+gYOCg4OGhICBfnx9fHx7fHh3e3h1eXd3eXx7e3t9kod9fH13en1+fn19f35+gH98foB/fn19fH19fX19fHt8ent9enp4e3x6ent4dHh1cXJ0cHh4cXmEhYWFg4SDgoODgoGBgoKAgoCAgIB9fn5/gH18fnx/gIGAgICAgHyAf4B/f4GAf399gX9+f39+fX18f4CAgIB+f35+fn18fn9/f358fYB/fn1+gIJ/f3+Af36ChIKCg4WFgoJ+fXx7e3t8eXd7eXd4d3d4e3t7e3yFiX17end6fH19fHx9fX1/fnx9fn59fX18fX1+fX18fHt6enx7e3p5enp7enhzd3VxcXNveHdxe4WGhYWDhYKBg4OBgYGBgoCCgICAgH5/fn9/fXx+foCBgoGAgIGBfX6Af35/gX+Af3+Bf39/f319fH1/gICAgH9/f35/fXx+f39/f319f39+fn6CgYF/gIB/foGDgoKEg4SCgn5+fHx6fHt7eXt6d3N2d3h5e3p7eXp/fnt7d3p8fXx8fH59fH19fH19fXx8fX19fX99fXx9e3l8fHx7enp6enp6eHN2dXBwcm93dnJ7hYaEhYOEgoGDgoKCgYGCgYKBgYGAf4B/f39+fX9+gICBgYJ/goF9foF/f4CBf4B/gIJ/gIB+fH58f3+BgICAf4B/f4B+fX5+f4B/f39/gH9/f4J/gICAgIB/gYGAgISBgoKAf39+f3x9fn56fYR+dHx9enp6enx5eXp6hoV3eXx8fHx8fXx8fHx8fX19fHx9fX19fn19fX16eX18fH16enp6enp5c3V1b29xb3d0c3yFhoOEgoOCgYKBgoKCgYGBgoGCgYCAgICAgH59gH+Af4GCgn+CgX+AgX5/gYB/f4CAgn+Bf319f35/f4KAgICAgIB/gIB+fn1/gH9/gIB/f39/gH+AgICAgH+AgYCBgYGCgYCAf39/fn1/fnuBko16fH18e315e3p6eHqBgXh5e3x8fXx8fHx8fHx9fX18fH18fn1+fn59fHp8fHt8fXt5enp6eXl0dXVvb3Fwd3N0fYWGg4OCg4KAgYCCg4KAgYGCgYKBgYCBgIGAfn6Af4GAgYKCgIKCgICCfoCBgX9/gX+BgIF/fH6Af3+AgoCAgICAf3+AgH9+fX6Afn2AgIB/f3+AgICAgYCAf4CAgYCBgYKBgICAf39/fX5+fIGGiXx8fnt7fnl6e3p7j393d3l7fHt9fHx8fHt9fH19fX18fXx+fn5/f358enx9e319e3l6e3p5eXN0dW5zcXB4cnV6hYaDg4KDgoCAgIKCgYCCgYKCgoGBgYKAgYF/fn9/gYGCgYKBg4OAgYJ/gYGBf4CAgIB/gX99f4F/gICBgICAf4B+gICAf359foB+fn+Af39/gH9/gICBf4CBgH+BgIGCgoGAgICAgIB9foB9gIOCe35+e3x9e3p8fHuHenh4eXx8fH17fHx9fX18fH19fn19fX5+f3+Af317fHx8fHx7enl7e3l5c3J1bnZycHhxdXaFhYOEg4KCgYCBgoF/gIKCgoKDgYGDgoCCgYB/f4CCgoKBg4KEhICBgX6BgoF/gICAgH+Cf36AgYCCf4CAgIB/gH+AgIB/fn2Af35/f4CAgH+AgH+AgYF/gICAgIGAgYGBgYGAgYCAgH9/gH5/fX59fn57fXx9e3x8d3h1eHh5e3x8fXx8fHx8fX5/f39/fn19fn9/gIGAf3x9fHx9e3p7eXp8eHpzcnVud3FxenF2d4WFg4SDg4KBgoKDgICCgYSDg4SBgYOBgoKCgYCAgIKDgoCCgoSDf4GAfoKDgICBgICAf4CAf4GBgYKAf4CBgH9/gICAgIB/f4CAgH+AgICAgIB/f4CBgYCAgICAgYGAgoOCgoCCgYGCgYB/f4B/gId+fnx7fXx7fX54d3Z5eXp7fXx8fXt8fH19fn5/gIGAfn1+gICAgoGAfH59fX58d3t6ent5eXNxdW53cHV6cXZ5hYWCg4KDg4KChISAgIOBhoODhIGChICEg4KCgICCgoSBgYKBg4J/gIB/gYOCgYCBgYCAf4GBgYGBg4B/gIOCf35/goGAgH9+gYCBf4CAgYCBgYCAgIKBgYKBgX+BgYGBgoOCgoOBg4OCgYCBgH9/hH19fXx/fXp9f3t6dnp4eXt7fH19e3x9fX19fn+AgYGAgH+AgICDg4B8f35+fn15eXt6enp5c3J0b3dxd3lzd3uFgoKCgoOEgoOEg4CBg4OGg4ODgoKEgYSDgYOAgIKBg4GCgoGCgX+AgICCgYKBgYKCgIGAgICCgoGEgH6Bg4J/f4CDgoCBf4CCg4KAgYKBg4KDgoGBg4KChIGAgYOBgYKEg4KEhIODhIODgYGBgoCCf4B/fYB8enx/fHt3fHl5eXt6fX59fHx8fH1+foCBgYCAgIGBgYSEgH2Af39/f357e3t6e3p0cHhxeXR2eHR2e4SCg4KDg4SChIODgYKChIaEgoOCg4SBhIOBg4CBg4KCgoKCgYKAf4GAgIKBgoGCgoKBgIGBgYKCgoOAfoGDgn9/gYSEgYN/goKBg4KCgoGEg4OEgIKDgoOCgoGCgoOBg4SDhISEhISFg4SCgYOCgYOBgYGAgH58fIB9fHh8eXp5enx9f3x7fHx9fX18fICAgICAgYGBgYKBf4CAgICAf3t7e3p6enVweHd5dnV8dXZ8gICDgoODg4OEhISBgoOFhYWDg4KDhIKEhYKCgYKDg4GCgYKAgYB+gYCBgYKDgoKCgoGAgYKCg4KCgoB/gYOCf4CChIODgoGCgoGDgoKDg4ODg4SAgoOCg4OBgX+Bg4KDhYKEhISEhISDhISChIOEhIKBgoCBgHt9gH58eXx6enp9fHyBfXp8fH19fHp7fn5+gIB/gYGBgICAgIKBgIB/fX18fX18dnJ3eHh2dH92dX2Hh4OChIWDg4SFhIGChIaEhIOCg4SEgYOFg4KCgoODgYOBgoCCgH2AgIGCg4KCgoKEgoCCgoODgoKBgX+Cg4KAgYOFhIOCg4CCgoOCg4ODg4OEg4CCg4KEg4KCf4OCgoSEgoODhISEhIOEhIOEg4WEg4ODgoKAe4CBf3x8fXp6e32AfX9/fHx6fH59fH19fn5/f39/gICAgH9+foCBgICAfnx9fX5/fn18fHh2f3Z3f4SHg4KDhYODhIaEgYKGhoWEhIODhISChIWEgoKDg4SCg4KDgoKBfoCAgoKDgoKDg4SDgYKCg4ODg4KCgYGDgn+Cg4SDg4KEf4KEg4ODgoSDg4SCgIOEg4SDg4KCg4KChIOCg4OEhISEhIWEg4OEhYSFhIOBgoB9gYKAfXx8e3x8gH19foB+fn1/fnx8fH19fn5/fn+BgYGBgH9+fX6BgYB+fn19fX59fX5+f3+AfH2AgYKCg4OGg4SDhoSBgoiGhYSDg4SEhYGFhYWDg4SDhIODgoOCg4F+gYGCg4SCg4OEhIOCg4KEg4OCgoKDgYOCf4KDg4ODgoOAgoWDg4ODhIODhIOBgoSEhYODgoODg4GEg4GDg4SEg4SEhYSEhIWFhYWEg4ODf36BhIB9fXx8fHx/gX5/f39/fX99e3x9fX19fX5+f4CBgIGBgH99fH6Cf39+fn5+fX1/f39/gICAf4CEhISDhIWDhIOFf36CiouFhYSDgoSFgYaGhoOEhISEhIODg4OEgn+BgYODhYSFhIWEg4KEhISFhIODgoSDhYKBhISFhYaEgoCDh4SDg4OFhIWFhIGEg4OHgoOCg4GCgYSDgoODhIODhIWEhYWHh4aHhYSEhYSBf4GDf35+fH5+fX+BgH9+fHx/f358enx9fX19fX5+fn9/gIGBf319fIB/gH5+fn5+f3+BgYGBgYKAgYWFhIOEhIKEg4aAgoSFi4iEhYSEhYWDh4aGhISEhIWEhISEg4SEgYKDg4OEhIaEhYSDg4SEg3yDhHuBhHd5g4F9hH5+cnWDgoF2foOEgH2BdYF5g39/f36EhIKDgoOBg4SDhISFg4SFhoSEhn2Den1+f4N7hYOBhIOAf31+f35+gYOBfXt/fX6Afn18fHx9fX19fH19foB/gYJ/fX18f4GBgICAgH+BgYGBgYKDg4KChoSEhIWEgYOEhYOEhYOKiIWFhYOGhYSGhoaDhISFhYWEhYWEhIWCgoOEhYWFhoSFhIOEhYWCaICEanx7cXF8gXOGc3R0fYKDdXNxg4ZzcHVyc3SDdnt9dYF/goOBgnZ5hYCDgIR/hYSChYSCaHpyc3N8gHKChH6Dg32BfX5+fX6Cg4J8f4F9f4B9fXx8fHx9fXx8fn1+gX+BgX99fX2AgYKBgYGBgIGBgYKBgoKCgoSHhIWEhYSCgoSGhoOFhIaIhoaFg4aGh4eGh4OFhYaFg4KFhoSFhYODg4WEhoaGhIaEg4SEhn1we4FweXZ+g3+CbnlwdXN8dnl5hnKEg3B2eHF2dHR1cnN0dml/gG5yb3R2bnVsd216c26Ah3ptfXJzdnN2bW53bHB5bHV9f398foGAgX2Af32Af4B/fX18fHx9fH1+f32Af4CAfnx/foCBgYCBgICAgYCAgIKDgoKDhYeFhoCChYODhYeGg4WFhYaHh4SDhoeIiYaHhIWGiIeEg4WGhYWEhIOFhIKFhoaFhoWEhoWHdnB0e3BydX+HhYNtdW92b3x1coR5eYd4cXR3bndod3pucHaCcoN+b3p5eW1vbnpvb2x3fXiGcHF6cHJ0ZoF1fm57eXNveX+Af31+gX9/e39+fYB+gIB+foCAgYB+fn9/foF/gH9+fYB9f4CBgIB+fn+BgH9+goOCgoSFh4eEfoeEg4OFh4aEhYWFhoaIhISGh4iIhoeEhoaLiYWEhoeHhYOFhIWEgoWFhYWGhYWGhYZxdXByc29zenl+hHSIdHV+iHZugnKEhXluanJ/cW1zd3x/dXR8hH54cXV3bnl1enF2eHV6eYRyaW95eHBreXN6b3p3dnZwgYF/fn5/f396fn18fn1/f359gIGDg4CCg4GChIKBf4GBgH1/f4F+f35+f4GAfn6BgoCAgoSHhoODh4SEhIWHhoWFhYWHhoiFhYaFh4eGhoSGhomIhYSJioiFhIWFhoWDhYWEhoaGhoaGg3iLeXKIentwcIWEeIV4eWtzfnl7a3KDh4N6fG16eXl0fYB2bm+AgG90fHV3cXl9fW1+dW+DhYZ6gHJye3x1cG96a3N8bnaCgYF+fn99fXt9e3x9fX9/fn1/f4KCf4GDgYGEgYB/gICAfn9+f31/fn1/gH58fYGAfn6Ag4iFhoOFhYWFhoeFhYWFhYeHiIaEhoWHhoaFhIWFhIWFhomJh4WFhoWGhoWGhoSGhoaGhoWGh4eHhoaDhoWGh4iHhYeGhoOHhoWFg4SFhoWGhIaEg4SEhoSEgYODhIOFhIWEhYSGg4WGhYWEhIWHhoSEhYaFhX13hYOEhIOBgX5/fnt8e357fH1+f399fH9+gYB9f4F/f4GAfn5+gH5+f35+fX99fX5/fHt8f358fH+BiYaFhIaGhoWGhoWFhYWGhoeIhoSGhYeGhYWDhIWGhYSGhoeGhYSGhIWGhoaGhIeGh4eGhYeIiIiIhoWHhYaGiIaFiIeHhYeGhoiFhYaHhYaGhYOChYWGhYWDhYOEhIaEhoaEhYWDhoaFhoWEhoeGhISFhoOFhIKEg4OFg4OBfYB/e3t8fnt8fH1+fnx8fn2Af31/gH5+gH99fXyAfX5/fn5+f3x8fX57fHx/fHt7fn+Ih4SEiIaGhYeGhYWEhoaGhoiHhIWGh4aFhIODhIaFhIaFhoaFhYaEhYaGh4eFh4aJiIaGiIeIiYiFhYiFhoeGh4aHhoeFh4eGh4WFhoeFhoaFgoOFhoaEhIOEhIOEhoSGhoSFhYOGhoWGhYSGh4WEhIWFg4SHhoSCg4SDhIJ+gYB8e31+e3x7fn59fHx+fX5+fX9+fX1+fn19fH98fn58fYF/fHx8fXx8fH56e3t8foiHgoWIh4eGhoaGhYSGhoeGiIaEhISHhoSFh4OEhYSFh4SFhoaFhoSGhoeHhoaHh4mIhoaIh4iKiIWGiIWGh4WHhoeGh4WIiIeHhYaGh4WGhoWChISFhoWFhISEg4SFhIaGhoWGhIaFhoaFhYaGhYSDhISDhIeDhIGChIWDgYCAgHt7fX18fHx+fXx8fH1+fH18fn18fH18fHx8fXx+fXt8gH99fH18fnx8fHp6fHx9iIeChoiHhoeGhoaEhYaFhoaGhYOEhIaFhIiJg4GEg4SGhIaGhoaGhIeHiIiHh4eIioiGh4iHiImIhYiHhIaGhYeHh4WHhoiIh4eGh4aHhYaHhIKEg4SGhYeFhISEhISFhoaGhoaFh4WFh4WGhYaFhIOEg4OEh4GDgIKDhIKCgn+Ae3x+fXx8fH59fHx9fH17fHx7fHx9fXt7e318e359e3x/fX18fX1+fXx6ent7fHyIh4KGh4aGh4aGhYSFhoWFhYWEg4WChoSDiId/enqChYaEhoaFh4aEh4eIiIeHhoiKh4aHh4eIiYeFiIeFh4eGhoeHhYeGiIiHhoWHhoiGhoiEg4SEg4aGh4WFhISEhYaGhoaGhYaHhoaIhoaEhoWDg4ODgoOGgYN+goKDgIOCfn98f35+fHx9f318fX18fnt7e3p7fHx8e3t7fnt7fXt7e358fHx8fX5/fXt6fHp8fImHg4aFhoWGhoaFhIWFhYWFhIOBhIGGhIKEhHyAhn+ChYWGhYWGhYSHh4iIiIaFiYqHhYeGh4eIh4WIhYaHiIaGh4eGh4aIiIeFhoeGh4WFiIOEhoSEhoaHhoWEg4WFhoaGhoaFhoeGhoeHhYOFhYOBgoKBg4WCg36BgoF/hIJ+fn6Afn98fH1/fXt9fXx+enp7eXt8fXt7e3t+fHx8fHp7fXx8fHx+fYF8e3t7e3x8iYeEhoSGhIaGhYSFhoWEhIOEgoCDgYaDgYJ/eoSMe4CEhYeGhoaEhIeIh4aHhYWHiYeEh4WGhoiGhYeEhoeJhoaIh4eHhoeIhoSGhoaHhYWIg4SFhIaGhYeFhYSDhYWGhoeGhoWGhoaFhoeEg4SFgoGCgYCEg4KCfYGBgH+DgX5/f4B9f3x9fX59e359fH15enp5e3x9enp7e318fXx8enp9fHx9fH5+gHt7e3x+fXyIh4WGhYaEhoWFhYWFhYODgYOBgIGBhYJ/gH9/fXx7gYSFhoaEhYSEh4eGhoaFhIaJhoKGhIaGhoWFh4aGiImGhYiHiYeGh4eFhIaFhYaFhIeEhIWEiIaGiIWFhIKFhYaFhoaHhIaGhoWFhoKDg4WAgIGAgISAg4B8gYB+foOAfX9/gX2AfH1+fX57fn18fHl6enl6fX15ent7fHt8e3t6e319fH18f35+fHt7fX59fIiGhYaGhoSFhYSFhYSDgoGAgoGAgICDgX5+f4B5en2Ag4OFh4WEg4OHhoOEhYSChYiFgoSDg4WFhYWHh4aIiIaFiIeJh4aFhYWDhoSFh4OEhoWEhYSHhoaGhYaEgoWFhoaGhoaEhYaGhIWFgoKDhH9+gICAgYCEgHyBf31+gn5+gH6Afn99fX59fnt/fXt6eXp6eXp8fXl6e3t7enx7e3t7fH19fXx/fn18fHx/fnx7h4WFhoaGhoSFhIWDhYKBgICAgYB+f4KCfX1/f3t/f4KDg4WGhYSDg4aDgYOEgoCFh4WCg4GBg4SEhYaGh4eHhYWIhomHhoSEhIKFg4OGgoOFhYSGhIeGhYaFhYODhYSFhoWGhISEhIWDhYSAgIKDf35/f39/gIR/fIB9fX+CfYCBfn6Bfn5+fX1/e398e3p5eXp5ent8eXp6ent7fHp7e3t8fX19fYB9fXx7fYB/fXyGg4aGhYaGg4SChYKFgYGAf3+AgH5/gYF8fn9/fn+AgoKChISDgoGChIGAg4KBgISFhIKBf4CCg4KEhYWHhoaEhYeFh4WGgoOCgoOCgoWBg4SEhYaEhoaGh4aFg4SEg4SFhYWDhIODhIKEhIB/goJ/fX5+fn5/hH57f3x8gIF+gYB9foN8fn59fX57fnt7enl6enl6ent5enp6e3t8enx8e3x+fn1/gHx9fHx9f4B+gIaEhYWEh4SEg4KGgoOAgYB+fn+Afn9/gnx9f35+f3+BgYKEg4KBgYKCf4CBgoCAgoWEgoB/gIGCgYKGhYeFhISGhoOFg4WBgoGBgoGCg4GChISEhYWGh4eFhYWEg4ODhIWFhIGDgYOChIODgH+AgX59fX5+fH6Dfnx+fHyBgX6Cf31/gnx/fn19fHx8e3t6enp6eXt5enp5enp6e3x5e317e35/f4GAfX59fn1/gICAhoOEhYSFgoSCgoSCgYCCgH59fn9+f36AfX2Af35+foGBgoODgoSHgYF+gICBf3+ChIOBf35/gIJ/goWDhYOCg4WFgoSBg4CBgIGAgYKBgIGEg4OGhYWHhoWFhIWCgoKDhYSCgYGBgYCFg4F/foB/fnx8fn18foN9e358fYB/gIN9fYCBf35/fXx8fX17e3p5enl5e3l6enl6ent7e3p7fXx8f3+BgoB+gH9/gH+AgIDKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzNzc3Nzc3Nzc3NzczMzMvLy8vLy8vLy8vLy8vLzMvLy8vLy8vLy8vLy8vMzMzMzM3Nzc7Oz8/Pz9DQ0NHR0dLS0tLS0tLT09PT0tLS0tLS0tPT09TU1NTU09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tLS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1dXV1NTU1NTT09PT09PT09PT09TU09PU1NTU1NTU1NTU09PT09PS0tLS0tPT09TU1NTU1NPT09LS0tLS0tLR0dHR0dPHhnNlYFtLWWdVTUZIQD03Nzg5Nzw8PDo8Oz42Oj04PDs6OTg3ODs7Oj87PTs8PD47P0E/QkJBQ0RFREE+PTw7QENDQUBDQ0FBR0hHSUtSwtXS09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXVysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMy8vLy8vLy8vLy8vLzMzMy8vLy8vLy8vLy8vLzMzMzc3Nzc3Oz8/P0NDQ0NHR0tLS0tLS09PT09PT09PT09PS09PT09TU1NTU1NTU09PT09PT09PT09PT09PT1NTU1NTU1NTT09PT09LS0tLS0tLT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1NTU1NPT09PT09PT09PU1NPT09TU1NTU1NTU1NPT09PS0tLS0tPT09PU1NTU1NTU09PT09PS0tLS0tLR0dHSzIxyZ2BcTVllUktHSz87Mzc4Ozg5Pj05PDpBOjs9Nzs8PDo6Nzg6Oz0/Oz88PTw/Pj9BPUFBPkNDREJAQT46Oz9DREFDRERCQklHSEhJTr7V0tPT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1crKy8vKysrKysrKy8vLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzMzMzMzMy8vLy8vMzMzMzMzMzMzLy8zMzMzMzMvLzMzMzc3Nzc3Ozs/P0NDQ0NDR0dLS0tLS09PT09PT09PU09PT09PT09TU1NXV1dTU1NTT09PU1NPT09PT09PT1NTU1NTU1NTU1NPT09PS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1tbV1dXV1dTU1NTT09PT09PT09PU1NTU09TU1NTU1NTU1NTT09PT0tLS0tLT09PU1NTU1NTU1NTU09PT09PT0tLS0tHR0s+Sd2hfXk9XZ01LRks9ODc2NTk5OTw+OT88Qzk7PDc5PD07OTc5Ojw9QDs+PT47PD48PT5BQD5EQ0NDP0E9Ojs+QkNFQ0NEQT9FSEpJSky61dPT09TU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8rKysvLy8vLy8vLy8zLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMzMzMzMzMzMzMzMzMzczMzMzMzMzMzMzMzMzMzc3Nzc3Ozs/Pz9DQ0NDQ0dHS0tPT09PT09PT09TU1NTU09TU1NTU1NTV1dXU1NTU1NPU1NTU09PT09TU1NTU1dTU1NTV1dTU09PT09LS0tLS0tLS09PT09TU1dXV1dbW1dXV1dXV1tbW1tXV1dXV1NTU1NTT09PT09PT1NTU1NTU1NTU1NTU1NTU09PT09LS0tLT09PU1NTU1dXV1dTU1NTT09PT09PT0tLS0dHRmn5nYWJOVWpKSElLPzw6OTM3Njc2PTs+Oj06Ojo4ODo7Ozg4Ojs7PD46PT09Ojw/PD0/QkA/Q0RDRD5APT08QENEQ0JEQkQ+REhJSUtMttfT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3MzMzMzMzMzMzMzMzNzc3NzczMzMzMzMzMzMzMzc3Nzc3Ozs7Pz8/Q0NDQ0NHS0tLT09PT09PT1NTU1NTU1NTU1NTU1NTV1dXV1NTU1NPT1NTU1NTU1NTU1NTU1dXV1NXV1dXV1NTU09PT09PS0tLT09PT09PU1NXV1dbW1tXV1dbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1NTU1NTU1NXU1NTU1NTT09PT09PT09PU1NTU1dXV1dXV1dTU1NTU09PT09PS0tLR0p+DaV9kU1hsSEhIS0A9Nzg0NzY6Oj87RDw8Ojw8OTg6OTo6Ojs8Ojo7OT48Pjk9QDs/QUFCP0JCQUM9Pz8+PEBCRUNDQkBBO0ZJR01MSbLY09TU1NTU1NXV1dXV1dXV1dXW1tbW1tbV1dXW1svLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzM3Nzc3Nzc3Nzc3Ozc3NzczMzMzMzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc3Mzc3Nzs7Ozs7Pz8/P0NDQ0NHS0tLS09PT09PT09TU1NTU1NTU1NTU1NTV1NXV1dTU1NTU1NTU1NTU1NTV1NTU1dXV1dXV1dXV1dTU1NTU1NPT09PT09PT09PU1NXV1dbW1tbW1tbW1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTV1NTU1NXV1dXU1NTU1NTT09PT09PT1NTU1dXV1dXV1dXU1NTU1NTT09PT09LS0tSjiGxfZlJWakdIR0lBPTM2Njo7PDhDPEFBPjxBPDg5Ojw6Ojw8PDk8PTo7PD09PD89QD9AQT9AQUBCPD4+PzxCQ0NDRkBBQT1ISklOTUeu2NPU1NTV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbLy8vLy8vLy8vLy8vLy8vLy8vMzMzNzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzs7Ozs7Oz8/P0NDQ0NHR0dLS0tPT09PT09TU1NTU1NTU1NTU1NTU1NTV1dXV1dTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dXU1NTU1NTU1NTT09TU1NTU1NXV1dbW1tbW1tbW1tbW1tbX19bW1tXV1dXV1dXV1dXV1dTU1NTU1dXV1dXV1dXU1NTU1NTU09PT09PT1NTU1NXV1dXV1dXV1dXV1NTU1NPT09PT0tLWroprY2VSWGhMSkdJQjg0OTQ6Ozo5QDk+Q0U/PDs5OTk9Oj07PDw6PTw7OTw9Ozs/PUA9PT5AQD9CQT5APD05QERDQkFBQj48SEpLTU5HqNnU1NXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbWy8vR09PT09PT09PT09PT087Ky8vLzMzMzMzMzMzMzM3Nzc3Nzc7Ozs3Nzc3Nzc/Pz8/Pz8/Pz8/Pz9DQ0dHR0dHR0dHR0dHS0tHV2djY2NnZ2dra2tvb29vZ2dnZ2dna2tra2tra2tjW19fX19fX19jX2NfX19rb2tra2tra2tvc29vc2dfX19fX19fX1tbW1tbX2tva2tra2tra2trb3NzX1dXV1dXV1dXV1dXW1tbX1tbW1tbV1dXV1dXV1dXV1dTU1dXV1dXV1dXU1NTU1NTU1NTU09PU1NTU1NXV1dXW1dXV1dXV1dTU1NTT09PT09PS1bqKa2hoUlhkSUlMTkA5OTo0O0A8Nz05QUM9QD89ODo6Ozk9Oz4/Ojs8PDo7PDo7Pj1APT8/P0FAQUE/QTw8Oz5BRENBREA9PElJSk1NRqPa09TV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbW1svMg21wcHBwcHBwcHBwcGqn493d3t7e3t7e3t7e3t3S0NDQ0NDQ0NDQ0NDQ0ci5ubm5ubm5ubm5ubq6t6WkpKSkpKSkpKSkpKSnhmBjY2NjY2NjY2NkZGRlhIuKioqKioqKioqKioemuri4uLi4uLi4uLi4ubSNi4uLi4uLi4uLioqKiKG/vb29vb29vLy8vLy9tIuKioqKioqKioqKiouHvebh4uLi4uLi4uLj4+Pi2NfX1tbW1tbW1tbV1dXV1dXV1dXV1dbW1dXV1dXV1dTU1NTU1NTU1NTV1dXV1dXW1dXV1dXV1dXV1NTU1NTT09PT09XDkXJsaU5SYkxMVk08Ojo3Nz5DPzg+Oj8/QTw/QDc7Ojs7PTs+Pjo7PD48Oz07PT8+QDw/Pz1AQEBBPj88PjxAQUVCQkZAQD9HSEpLUEae2tXV1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19fLzU4mKysrKysrKysrKysiivTr6+rq6urq6urq6uvp1dLS0tLS0tLS0tLS0tTEqaqqqqqqqqqqqqqqq6aGhIWFhYWFhYWFhYWFik4MEhISEhISEhISEhIRE0pUU1NTU1NTU1NTU1NPg6ejo6Ojo6Ojo6Ojo6ScWFJTU1NTU1NTU1NTU056rqqqqqqqqqqpqamprJtUU1NTU1NTU1NTU1NTS6ry6+vr6+vr6+vr6+vr6dnX19fX1tbW1tbW1tbW1dXV1dXV1dbW1tbV1dXV1dXV1dXV1dTU1NTV1dXV1dXW1tXV1dXV1dXV1dXU1NTU1NTU1NPUy5h3bGlKTl9NUlVNPjw8Nzs/Qz42Ojc+Pzs9QkA5PDk9Ozw6PD07PTs9Ozs9PD0+PT07QT08QUBBQT08Pzw7QEJDQURFPUFAQ0ZLS09GmNzV1dXV1dbW1tbW1tbW1tbW1tfX19fX19fX19fXy81SLDExMTExMTExMTExJ43z6enp6enp6enq6unq6dXS0tLS0tLS0tLS0tLUxaqrq6urq6urq6urq6yoiIeHh4eHh4eHh4eHh41SEhgYGBgYGBgYGBgYFxpOWVdXV1dXV1dXV1dXU4WopKSkpKSkpKSkpKSmnlxWV1dXV1dXV1dXV1dTfbCrq6urq6urq6qqqq2dWVhYV1dXV1dXV1dXV0+r8erq6urq6urq6urq6unZ19jX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dXV1dXV1dXU1NTU1NTU1NGcenFpSlRdT1JVTkQ+Pzs/QEA4Ojs4PDw8Oz46Ojs4Ozk5Ozw7Ojw5Ozs8Ozo9PT0+PUE/Pj8/Pj08PT88PEFBQ0FERTw+QEVGSktNRpPc1dXV1tbW1tbW1tbW1tbW1tfX19fX19fX19fX18zOXDk9PT09PT09PT09PTWT8Ofn5+fn5+fn5+fn5+bV0dLS0tLS0tLS0tLS08Wtrq6urq6urq6urq6vq46NjY2NjY2NjY2NjY2SXSInJycnJycoKCgoKCcpWmNiYWJhYmJiYmJiYl6MrKmpqampqampqampqqJmYWJiYmJiYmJiYmJiXoWzr6+vr6+vr6+vr6+xoWNiYmJiYmJiYmJiYmJbr+/p6enp6enp6enp6enn2djY2NjY19fX19fX19fX19fX19bW1tfX19fW1tbW1tbV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbV1dXV1dXU1NTU1NTWo3txZElbYE5OVU9AQT89REI+Oz06OTo6PTw7PDs6OTg5OTs8Ozw8Ojo7PDo7QD08PTxAQTxBQTs7PEA/PD1CP0RDQ0U8PkJERkpMTEWN3NXV1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjMzcTCw8PDw8PDw8PDw8PCydDPz8/Pz8/Pz9DQ0NDQz87Ozs7Ozs7Ozs7Ozs7Ny8zMzMzMzMzMzMzMzMvJycrKysrKysrKysrKysfCw8PExMTExcXFxsbGxsvMy8zLzMzNzMzMzMzLz9HR0tLS0tLS0tLS0tLRzczMzMzMzMzMzMvLy8vO0tLS0tLS0tLS0tLT09HMzc3Nzc3Nzc3Nzc3NzdTY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NfX19fX19fX1tfX19fX19bW1tbW1tbW1tXV1dXV1dXV1dbV1dbW1tbW1tbW1tXV1dXV1dTU1NTU169/cF5GXmJQUVdOR0ZDQ0lBPz07PDo8N0BBPD04Ojs4OTg7Pzs8PDs7PDw8PD87PD46Pj44PkI8Pj1BPjw+QkBERUNAPD5APkNJSUtEh9zV1tbW1tbW1tbW1tbX19fX19fX19jY2NjY2NjYzc3P0NDPz8/Pz8/P0NTQ0M7MzczP09LSzs3P0s7Ozs7Ozs7O0tPPz9DU0s/Pz9PSz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0NDR0dHR0dHS09PU1NTU1dXV1tbW1tfW1tbX1tfX19fX19fX19bW1tbW1tbW1tbW1tbW1tfX19fX19fX1tbW1tbW1dXW1tbW1dbW1tbW19bW19jY2NjZ2dnZ2dnZ2dnY19jY2NjY2NjY2NnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjX19fX19jY19fX1tbW1tbW1tbW1tbW1tbW1dbW1dbW1tbW1tbW1tbW1tXV1dXV1NTV1di4gm9XSl9jUlFaS0hBQTxCPT07Oj4+PD4/PT0/ODk6OTk3OD48PD47Ozw7PDs/PT0+OTs7OT0+P0A+QD07OkI/QkNCPz0+QD5CRUdKQoDc1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2M7Ozs7Ozs7Nzc3Nzsqfys3Nzc3QuYOEi8fTwJrLz87Ozs7O0qucz9HIlKfS0ceSq9HOzs7Ozs7Ozs7Ozs7Oz8/Pz8/P0NDQ0NDQ0NDR0dHR0tLT09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbV1dXV1dbW1tbV1dXV1dXV1NTU1NXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NfX19fX1tbW1tbW1tbW1tbW1tXV1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXYwIBuVU9gY1dZW0xMQkA9PTw9Ojw9Qj5CQkA8Ojg5ODo6Ojc7Pz4/PDw7PDo5Pzw8PTg5PD9BPj09PUFAPTtBQkBCQz47QD9BQUlHSkF629bW1tbW1tbX19fX19fX19jY2NjY2NnZ2djY2dnOzs7Ozs7Ozs7OzdKpj63Rzs7Ozpu3tqSiwJOerNPOzs7O0racpaTRmqycsNGZrJqy0s7Ozs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0dHS0tLT09TU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dbW1tbW1tXV1dXV1dXU1dXV1dXV1dXW1tbW1tbW1tbW1tfX19fX19jX19fY2NjY2NjY2djY2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2dnY2NjZ2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV18h/b1pTYWVeXVxPSkQ9QD8+PDc6Pjk/RD5AOTg3ODk7Ozw4OT89PTw9PD47OkE7OTs5OzxDQDw7PT5AQT49QkQ/QkM9PT8+Pz5ISUg/ddrW1tbX19fX19fX19fX2NjY2NjZ2dnZ2dnZ2dnZzs7Ozs7Ozs7Ozs/Inrym0tDQzsqgl36Cw6abr6fUz8/Pz86dnJGevJWInJ7EkoadnM3Pzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dLS0tPT09TU1dXV1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tbV1dXV1dXW1tbV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2djY2NjY2NnZ2dnZ2dnY2NjY2NfX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dbV1dXV1dfNiHNdWGloXl9gT0lGOkFAPj48PDk2P0I/Qjo2NDg6Ozo8Ojk+PD49PTs/PTxBPjw8Ojw8PTw6PEA9QEI+PkFCPUNDPT0+Oz9BRUtIQHDZ1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2c/Pz8/Pz87Ozs7SrKWnqdXAvNLHnY+ey9PJipmq1M/Pz9G/mKCbsq7ByZiYxbzJl5nF0M/Pz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0dHS0tLS09PT1NTU1dXV1dXV1dbW1tbW1dbW1tbW1tbV1tbW1tbW1tbW1dXV1dXV1dXW1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnY2NjY19fX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0JB1W1tqaWFeXVNOSTxDQEE+QD46OEVAP0I6NzQ5Ojo5Ozs4Oz0/Pj49QT08P0A9Pjw8PDw8Oj1AQD8/PT5CQD9AQkA8QD0+QUVLRz9r19fX19fX19fX2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnPz8/Pz8/Pz8/QzJ2Nl6zQmpfKxZ6ynpbN1q2ZqtTPz8/TtJmWqrik1pSWn87Rkpmhz9DQ0M/Pz8/Pz8/Pz8/Pz8/P0NDQ0dHS0tLT09PT1NTU1NXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX19fX19fY19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tKUcl5ea2tqZV1PTEc/RENDQDo9OzxCPD08OTY0Ojk4Ojo5Nzs/QDs8PUA8PEE+PD07PTw/PDo8Q0A+PTs9QD5CPkBBPkA9QD9GSUQ/ZtXX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2traz8/Pz8/Pz8/P07GigJuvyqCjv8qcpYynrdiqmarUz8/P1KuafqOPpLOfw5varaO/ntXR0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1NXV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dbW1tXW1tbW1tbV1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbSk3BgXnBoZmVaUUhHQkVDQEA3Ojo8Pjk8OTc2NTk6Njo8Ozc8QEA8Ojo9Ojw/Pj08OUA8PDo6OT9APT08PUBBQz9APz5BOz9ARkpCP2LS2NfX2NjY2NjY2NjY2dnZ2dnZ2tra29vb29vb28/Pz8/Pz8/P0M6fkGyclteqo9PSrqa1mJ/Vqpmq1M/Q0NSsm6eLlaHQipKex8uIlZ7I0tHR0NDQ0dHQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1dXV1dbW1tfX19bW1tbW1tbW1tbX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfW1tfX19jY2NfX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX1tbW1tbW1tbW1tbW1tbX19fX19fW1tbW1tbX0pNuYFxxZGdkWlVKQENHREFBODs/PD07PDw3NTU4OTY4Ozo5PDo+Pzw9PTk8Pz49Ojo+OTw6Ojg+Pzw9PTw+QEFDQT48PDpCRERKRkJd0NnX19jY2NjY2NjY2dnZ2dna2trb29vb29vb29vPz8/Pz8/Pz9G9n8O31pfA09HQ0srSzZeb1KqZq9XRz9DTtrKypZmq0dulmbPQ26OZtdXR0dHR0dHR0dHR0NDR0dHR0dHR0tLT09PU1NTV1dXV1tbW1tfX19fX19bW1tbW1tfX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19fY2NjY2NjY2NjY2NjY2djZ2dnZ2dnZ2dnZ2dnZ2drZ2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fX19fX19fW1tfX1tbX19fX19fX19fX19bW19GSbF1cb2doYl1PRj9ISEZFQDw8Pj48PT08NzU2Ojk2Ojs6Ojs4QD86PDw5PD49Ozs6Pzk/Ojs5PT49Pjw7PTxAQ0I/Pz47Q0ZGR0hEWc3a2NjY2NjZ2dnZ2dnZ2dna2trb29vb29vb29vb0NDQz8/Pz8/Pz5V+e6WS1KKa08ySl6ObodirmavV0pem1cSimZadq5KnmqCtkKeYnrvV0dHR0dHR0dHR0dHR0dHR0tLS0tLS09PU1NTV1dXV1tbW19fX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tbX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2tnZ2dnZ2dnZ2djY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX1tfPjGRWXnBrXGBgTkVITUlJT0M+OkI9PUBCOzU1Nzw6Nzo7Ojo7OT09OTo6OT0+Pz07OT47PDo8Ozk+PD47PD0+QENCPz5BPEFDR0ZGRVXJ29jY2NnZ2dnZ2dnZ2dra2tvb29vb29zc3Nzc3NDQ0NDQ0M/Pz9DR1aeZrcmjqL7KnbGdo7XZqZup2LiroMfVoquknbGkpaigr6eiqZ3Q09LS0tLS0tLS0tLR0dHS0tLT0tPT09PU1NTV1dbW1tbX19fX19fX19fX19fX19fX19fX19bW1tbW1tfX19fX19fW1tbW1tbW1tbX19fW1tbW1tbW1tbX19fX2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2djY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fX19fX19fX19fY2NfX19fX19fYzYZdV2JvZE9dVEtIRlNRS0tAPj1EPD9DRj01NTc7OTY6Ozo8PTo7Pzo6OTg6PT0/Pjs/Oz49Ojs5Pjs9PD0+QURCQD8+PzxAQUVHRURSxdvY2dnZ2dnZ2dnZ2tra2tvb29vb3Nzc3Nzc3NzQ0NDQ0NDQ0NDQ0NO5gL3Tm5bP1LWLkZ/T1LyBu9TOlKDT08iRjbTWnZKNutWako6+1tLS0tLS0tLS0tLS0tLS0tLT09PT09PU1NXV1dbW1tfX19fX19fY2NjY19fX19fX19fX19fX19fW1tbX19fX19fW1tbW1tbW1tbW19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2tnZ2tra2tra2tra29ra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2NfX2ct+WlVpaltMX01KTEpVTEZCPDw/RkVHS0g9NjY3Ojk3OTo7Ojw9OT45OTo4Oz0+PkE+PTk8PDo9Pj47PTk5Oj9FQUA+PT8/QkBHRURFUMHc2dnZ2dnZ2dna2trb29vb29vb3Nzc3Nzc3dzc0NDQ0NDQ0NDQ0NDQ0cHR0crI0tDUxLjS0tHSwtLQ08fM0tHUyMHV09O5x9XT07nI1dLS0tLS09PT09PT09LS0tPT09PU1NTU1NXV1dbW1tfX19fX19fX2NjY2NjX19fX2NfX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29va2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2djY2NjX19fX19fY2NjY2NjY2NjY2NjY19rHd1xSZ2laTlpOTFBRV0VKPz89P0FETExAPjc3NTo4ODk5Ojs8Pjw+ODo6OTs+P0A9Pj46NTo6Oz0/Ojs5Ojw+QkJAPz8/P0FCR0RDRE683dnZ2dnZ2dna2tvb29vb29vb3Nzc3Nzc3d3d3dDR0dDQ0NDQ0NDQ0NDS0NDR0dDQ0dPU0dHR0dPR0dHS0tHR0dPU0tLS1dTT09PW1NLS0tPT09PT09PT09PT09PT09PU1NTU1dXV1dbW1tfX19fX2NjY2NjY2NjY2NfX19jY19fX19fX19fX19fX19fX19fX1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tvb2tra2tra2trZ2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2trZ2tra29ra2trZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjbwXNYVWlrU0xSTlBSWVRGSTw+Qz9BQkVKPT03ODY5Nzc4OTk7Oz0/QDw9ODk7Ozs/Pjw8OTU6PT47OTk7PD8/P0JCQT1BPUBBQkZCQkJLtd7Z2dra2tra2tvb29vb29vc3Nzc3Nzd3d3d3d3R0dHR0dHR0dHR0dDQ0NDQ0NDQ0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tPT09PT09PT09PT09PT09TU1NPT1NTU1NTU1NXV1dXV1dXW1tbX19fX2NjY2NjY2NjY2NjY19fY2NjX19fX19fX19fX19fX19fX19fX19fW1tbX19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2NjY2NjY3LxvVFRsbExLUkpUUlVLRkQ6PkdEREFERjw/ODk6OTU5OTo3PD07PkA9PTc5Ojs5Pjs5OTY2Oj1AQT47PDk6Pj9DQT4/Qj0+QkNFQkFCSrDe2dra2tvb29vb29vb29vc3Nzc3Nzd3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0tLS0tLS0tLS0tLS0tLS0tPT09PT09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1tbW1tbW19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19fW1tbW1tfW19fX19jY2NjY2NjZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2dnZ2dnY2Ny2a1NbcGtLVVdSXFFXSEQ+PEJKRT1ISj89PDc4ODo1OTg5Njs+PD1APDw1OTk8Oj87OTk0ODw9PUFBPD47Ojw+QD89PkE9PUNGR0I/Qkmq39ra29vb29vb29vb3Nzc3Nzc3N3d3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHS0M/U0M7P0tLT0tLS0tLS0tLS0tPT09TU1NTU1NTU1NTU1NTU1NTU1NTU1NTV1dXV1dXV1dbW1tbW19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19jY2NfX19fX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dndsGRTYXJfT1pUV19RUkdCPUVJS0FBTEQ/Pzs5ODg5Mzg2ODY5Pj0+Pz06Njo7Pjs9PTo5Njg6PTtAQDxAPz0/P0I+PD48PEJFSElCPkNJpODa29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3t7S0tLS0tLS0tLS0dHR0dHR0dPT0bm7zLqbnLrQyNPT0tLS09PT09PT09PU1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2NjZ2dra2tra2tra2tra2tra2tra2tra2tra29va2tra29va2tvb2tra2tra2tra2tra2trb29vb29va2tra2tra2tra2tra2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ3qpfVWBuW1VZUVpeT0xHQ0ZNSUZEQ0k7QUE7PDg4NjU4Njk4Nzw/QT89Ojc8Pz48Pz87OjY4OD09QEE9QD5BQD1AOjs6Pj1BRUdKQkBDR57h29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e0tLS0tLS0tLS0tLS0tLS0tO+wMqaoKKViJGeqpOpz9TT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fY2NjY2NnZ2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dna2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2tvb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2d6iXFVeblheXU5aUFROQ0NMSUlJRklEPEFBPDs4NzY3OTc3OTk9P0E/PDo5QD88PkI/Ojg3NzY9P0BAPUBBPz88PTs7OD48P0VJSEE/Q0aX4dvb29zc3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3tPT09PT0tLS0tLS0tLS0tTIlZyum5m1iX2TjIKBhMTV09PT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tvb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dndmlpYYW5ZYVdPV01QRUJETElNS0ZJRT5CRDg4ODY3OTc1Njk4PT1BPjo4OT4+PD9APzw1Njc2PD4/PjtAQEA/Pj4/Pjs/PkFCRkdCQENIkeLb29zc3Nzc3d3d3d3d3d3d3d7e3t7e3t7f39/U09PT09PT09PT09LS0tLTz6h+kayPko6MhoCIiYSQo8rU09PT09PU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY19jY2NjY2NjY2NjY2NjX19fX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2tra29vb29ra2tra2tra2tna3JJaWWNuWlpSVV5QTDxAR05IUklIRT48SEY4OTc1Nzg3NTg5ODs+Pj07ODlBPj1AP0E+NzU5Njs+QUI/P0BAQUI/Pj8+QUBEQUZIQj9FSozi3Nzc3Nzc3d3d3d3d3d3e3t7e3t7f39/f39/f1NTU09PT09PT09PT09PWtaWaiIuQhYCFi4iBg4qLf4bC1tTU1NTU1NTV1dXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2dnZ2dna2dra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29ra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb2tra29uIWltnalxYTFpfVkg6TEhMSkpDREVDQUxINzo3Njc4ODU4Nzg5PDw7Ozk4QD89Pj8/PDY3PDQ3P0JCQUBAPz8/QT09P0A+QEBGRT09REuI4tzc3Nzd3d3d3d7e3t7e3t7e3t/f39/f39/f39TU1NTU1NPT09PT09PUxZKCg4WGfYGCfXx5foGCg36k29bU1NTU1NTV1dXV1dXV1tbV1tbW1tbW1tfX19fX19fX19fX19fX19jY2NjY2NjZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vc3Nzc3Nvb29vb29vb29vb29vb2tra2tra29vb29zb29zb29vb29vb29vb29vb29vb29va2tvb29vb29vb29vb29vb29vb2tvZgFpebWhaU0ldW1hKRE1ISlNMR0ZBQD9KQjg7NjY5OTc1ODY4Ozo7Ojw5OD09O0A9Ozo2NTw3Oz1CQEFBPD49QEE9PEA/Pz5CREU+PERLg+Lc3d3d3d3d3t7e3t7e3t7f39/f39/f39/f39/V1dTU1NTU1NPT09PT2LKEkKh9g3l2hIh/e3d5gn5+i67A1dTU1NXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dna2trZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2trb2tra2tvb29vb29vb29vc3Nzc3Nzc29vb29vb29vb29vb29va2trb29vb29zc3Nzc3Nvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc1nlcWmxmWFJPYFFSQUhHSkZYTEZAQENDSz87Ozc4ODc2NTc2ODo5PDw6PTs/PTs9Pjw7ODg8OT0/QkFCQzw8P0FCPj1BQkNCREVDQDtDTH3h3d3d3d3e3t7e3t7e39/f39/f39/f39/g4ODg1dXV1NXU1NTU1NPU0ruen3WKeXuIgICChYGDcnOAhYOMrNfV1NXV1dXW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NnZ2dna2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra29vb29ra2trb3Nzc3Nzc29zc3Nzc3Nzc3Nzb29vb29vb29vb29rb29vb29vb29zc3Nzc3Nzc3Nvb29zc3Nzc3Nvb29vb29vb29vb29vc3Nzc3Nzc3Nvb29vb3dByXV9wZVdLUGNPS0JHQ0pIS0ZBPEE9SFFBOjo3Nzg3Njc4Nzw6OD09PD47QD88Pz07Ojs5Ojk8QEJAQkNAPUFAPz1AQkNDQUBAP0A7RU144N3d3d7e3t/f39/f39/f39/f3+Dg4ODg4ODg4NXV1dXV1dXV1NXU18h4i4V8goh6g4SBfoKCc2l0hYuGkJ3U1tXU1dbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tvb2tvb3Nzc3Nzc3Nvc3Nzc3Nzc3Nzc29zb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb297KalxjcWVST1heSz9HTElPS0VAPkFCP0lPPjk6NzY7NzY6Ozc7Ojg6PDw+Oz09Oz48Ojs4OTo4OUFCQkFAQDtAQj06PkFCQz8+PT4/PUZOdN/e3t7e3t7f39/f39/f4ODg4ODg4ODg4ODg4OHV1dXV1dXV1dXV1s6dhpl+f5OTin+CgXx9gnNxm4mAgoOJwNnat7TQ19bW1tbX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tra2tra2tra2tra29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NvfwGNaW21gVlBTU0pETEhNSEk8PkFEQ0ZORDw8OTc5OjY4Ozk3PDk4OTw9OzlAPjpBPzw3NTc7ODpAQUVBPz45PUI/Oz1CQkI6Pj07PT5GTnHe3t7e3t/f39/f39/g4ODg4ODg4ODg4OHh4eHh1tbW1tbW1tbV1tjLioCHhYOXjHh7e3lvfYF1a3ebdHZ7eInHxpiMrdjZ19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2drZ2dna2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tra29vb3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29zb29vb3Nzc3Nzc3Nzd3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3Nzc3Nzc4LdjV1lrYlJNVVFMSktGS0ZDQD5CQT9FTT4+PTg5OTo3OTo3NT03Nzo+PDs7Qjw5Pz05NjY4PTk6QEJGQD49PEBCREA9QD9DO0A9PD4/Rk9t3N/e3t/f3+Dg4ODg4ODg4ODg4OHh4eHh4eHh4dbW1tbW1tbW1tfVrYZ6d32rn3l4entzdH+Dfm9xe3l6c3t2k4qFgImkzdnY19fX2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tna2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29vb29vc3Nzc3N3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vc3Nzb3Nzc3Nzc3N3d3d3d3d3d3dzc3Nzc3Nzd3d3c3Nzc3Nzc3N3d3d3d3d3d3d3d3dzc3OGtYVtebGJSTVZMTUdLS0RGQkI7QT08RUxCQT44Ojk6Nzc5NjY6NTs+QDs9Oz89PD89Ojk5Ojw5PEVDRkA/PkBDQkQ9OT0/QT1CPz1APkdPadvf3t/f3+Dg4ODg4ODh4eHh4eHh4eHh4eHi4uLW1tbW1tbW1tfQmH+Qh4N9eoN2e3Vzenl6kKqmd3JyfoeHh4CAfoKEhJHJzNnX19jY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra29va2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2djY2NnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vb3Nzc3N3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzb29vb3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3dzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3NzhpV9UYm1iUE9TSUhHRkpJSUJBPkJCPEVFREA+ODo4Ozc3Ojc4ODY+Pz07PDk9PDo+PTs6Njc7NjpEQUY+Pz8/PkNBPzs9PT47REM/PjxIT2fZ4N/f3+Dg4ODg4eHh4eHh4eHh4eLi4uLi4uLi1tbW1tbW19jYyH52doN+fnR2eIaCenl1d5yhu6GEgoCAfoeKinx/gYaMnKjO2NjY2NjY2NjY2djY2NjZ2djY2NjY2dnZ2dra2tra2trb29rb29rb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3d3d3d3c35pbT2drXFBRUElDT0pLR0xHSkJAP0FHREBBPDg8ODg1ODk3Njc3QEA/Ozw5Pj04PTw8Ojc4PTk/RENGPkE/QkBDPzw6Pj0/PkVEPz07S1Fj1+Hf4ODg4ODh4eHh4eHh4uLi4uLi4uLi4uLj49bW1tbW19XB3LRueHJze3B6eXaFiIR7eH2AgZiljH98fnuRhZaLhoGDgY6Rvd3Z2NjY2NjZ2dnZ2dnZ2dnZ2dnY2dnZ2dna2tra2trb29va2tva2tra2trb29ra2tra2tnZ2dnZ2dnZ2dnZ2dna2trZ2dnZ2dra2tra2tnZ2dnZ2dna2tra2tra2tra2tra2tra2trb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t3d3d6NWFdobllQUUtISlNJTUhNSUtBQz9DRkJBRDo6PDg2NDg4NzY2Nj8+Pjo8OTw7Oj09PDw4Ozw8RERERT4/PkI+Qj84PT8/Q0NCQEE+O0xUY9Xh3+Dg4OHh4eHh4eLi4uLi4uLi4uLi4uPj4+PW1tbW1teslLZ6eHJvd5V7dHuLgHh1bn6Fg3t/hYhyfH2bnI6JioJ+g32Hk5rH1NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2trb29vb29vb29vb2tra2tra2tra2tra2tnZ2dnZ2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2trb2tra2tra2tra2trb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d7Zf1lgaGxcUUtHR09LTk5PTURGQkg/Q0hEREA6Ozs4NzU3Nzc4NThAPkA7PDk8Ozw+Ojk7OTk7OUZERUI8QD4/PEBDOz5AP0A/Qj8+OjtKVWPV4eDg4eHh4eHi4uLi4uLi4uLi4uPj4+Pj4+Pj1tbX19vKhYR3cXJubniVhHt4hH95dnB4c3eLkY6CdnN9ioaId3d1d4ODfIiIk8Pb2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2trb2tvb29vb29vb29vb29rb2tra2tra2tra2tra2tnZ2dnZ2dna2tra2tra2tra2trb2tra2tra2tra2tra2trb29vb2tra2trb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f0nVZaGlqVk5KSE1OR01EUElGSD9FPUZMREM+Ozs8OTc3OTY2OTU4Pj4/PTs8QDs9PDo3Ozc5OThHREVCPUE9Qj8+QDw/QUE/QEJAPjs8S1Ri1OLg4eHh4eLi4uLi4uLi4+Pj4+Pj4+Pj4+Pj49fX19fEknuJf29sbnV2foSBg4qGfnVybWVtiIaKjoR7c4OHint4e4OPj4GEioqxztrZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29zc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tvb2tvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3dzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f3t7e4clsW2pqalNOR0hOT0VIRk1JSUA7RD5ISUA9PDo6Ojg2ODo3Nzk0OD08PT07ODw8PDw4Njc4OTo6RUJFQT9APEI/Q0M+PkNEQUBAP0A8PUtRYdPj4OHh4uLi4uLi4uPj4+Pj4+Pj4+Pj4+Pj5OTX19fZqXaFfnx3bHB3eXh8jH2KhYB3anN0d3p9bot7fnl6foR/gIGDfnh8foeGlrbT2tnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra29ra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/e3uO9amFpa2lRTkZNTEtKWE1OR0FAQE9BRD9AOzw4ODk5Njg2NjY4NDs+PD07OTY6Ojk6OTU4OTg5OkJERj8+Pj5AQEBCPzxBQD88Pj9BOT5KT17S4+Hh4eLi4uLi4+Pj4+Pj4+Pj4+Pj4+Tk5OTk19fX2sqKhIB5c29tcXN1d4CUeHaAfHWHhXd1cnWgmXp7d3Z5doR0bWxue3iAmouTu9za2tra2tra2trb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc29vb29vb2tra2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f397js2lpbmloUFBPTExPUk9LU0Y/RURERD48PDg6ODc5OTU2ODY2NzM6Pjs+PTc6Pjk5OTk2Ojo4NzxDRUc/Pzs/PkA9PkE9Oz0+OUFAQDhBTlFc0OTh4eLi4uLj4+Pj4+Pj4+Pj4+Pk5OTk5OTk5NjY2NjauY6AenZ1bmpveHCBfWt0cnZ3hIV5h4d5lY55eXp1d3pza298gHx2fYh8gLLe2tra2tvb29vb29vb29vc3Nzc3Nzc3Nzc3dzc3Nzc3Nzc3Nzb29vb29rb29vb29ra2tra2tra2tra29va29vb29vb29vb29zc3Nzb29vb29vb29vb29vc3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3t7e3t7e3d7e3t3d3t7e3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/f39/f4qpqa2hrZFNQT0ZQVFJOSFJLPkREQ0I7Ozk5Ojg2Nzg1NjY4ODg0Oz88Pzw5PDw3Ozo6Nzo6Nzo9Q0JDPUE+Pzw5PT5BQDs8PDtFQD47Q05TXNDk4eLi4uLj4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTY2NjZ1p5vdntveHh2cG50d3BwdHBzb36Jc3qGhY2EenNtcoB6hn1vg5OBdnx9g4a13drb29vc29vc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29ra2tra2tvb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4N/f3+KgbWhma2ZVVlJHUFFOS0xMRUJIRUc9OD08Ojo3Nzg2Nzc2NTY3NDg+PD09Ojg6OD46Ozc4Nzc6Oj5DRDtDQj49OD1AQUM/Pjw+RTw+PUJNUF/S4+Hi4uLj4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk2NjY3MB2doCCfnp4eHBsdXlya399bHNvdGdoaYB/aWl4c2d+iYl4cIKGe3d9foWKvN3b3Nzc3Nzc3Nzc3Nzc3Nzc3d3c3Nzc3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODflGttZm5mU1NJUFlUTEhGTkZGRUJGPTs+PDs5Nzc4NTc5NjQ1NzU4PDs9Pjo6OztAOTs7ODc6OTlAQkE8QUE/Pzk/QEJFQ0FAQEM7Oz1ES01g1uTi4uLi4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk5NnZ2tmYc3uqhJaCcnR1dn14aGx8d2h4d25rcXR5gIJ3dHyBhIJ9c3CAin94gn95g8je29zc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f4N/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh24tubWdzY1lRTVVbV0hDSUZOS0dCRD8/Qjo7OjY2NzU2NzY0ODc2Ozw7Pj86PDk8Qjg3OTo6Ojk6QUFCQUJDQEE+PT9CQ0NEQUJGOTg9REpOYtjk4uLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXZ2drcqHGCtXiRfnNsem6EgXaCfWtoan+DeHV8dn2FhXRmcHl9d316gIqFe318foC03tzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3dzc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3Nzd3d3d3d3d3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e397e3t7e39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4ODg4ODg4tiFb3FrdWFWT1VVXE9ETUY+SkdKRUQ8P0I6PDk4Njg0NTY3NDc2NDk7Ozw7OD47PEE4ODo9OD04Oj09QEBAP0FCP0A+QENCQ0FBRTc2O0RMTmPa5OLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXl29ra3Z5sbnNxhY1ybXBuf391hH5rcnZ2enN4gXhzbnVwbWt2fHmFiIB/f392coODsd/c3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eDg4eHh4eHh4eHh4OLXhW1xb3ZeUldTWlpRSkhDQFFAQkQ8OT9BOjw5NzU3NDU2NjQ3NTY9PDo9PTk+OjxAODo6PDY7OTs+PUJCQjtBQkBDQEBEREM8PUA3OjxFS01l3OPi4uPj4+Pj5OTk5OTk5OTk5OTk5OXl5eXl5dPOxsB+cWxveHt2b3VuanNzbZKGeG50dG5vdIZ/b2twboJ0bXZyfY2DdnF/d3mKgabf3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3dzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t/f3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi1oZucG1xYFJZUFdfWUpMTElSP0Q9OTtCRjs6OTc0NTY1NzU0NjY2Pj07Pz45PTk7Pjg9Ozo0ODtAQENCQ0FCRkE/Q0BBQkREOz0+OTs8QkxNZODl4+Pk5OTj4+Tk5OTk5OTk5OTk5eXl5eXl5eW5t7Woc3JscHd6dHd4bXFydXd/hHRyc2xsa3F8bnBudGuBf3GAd32Eg355gHNygYqg2d3c3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh49WHcWxqbF5YWlVXYFZWUE9QTD1BOjs8RkE4Ojg3MzY1Njk2NTg1Nz89Oz8+OT04Ozw5PTs7NTo9Q0JCPENDREREQUE/PkJDQzw9Pjg5PENLS2PN0dnh1sjY4+Tk5OTk5OTk5OTk5eXl5eXl5eXltbW2q3J5cm59f3Z1d2hqaGlwb3Zta2tnZWZxdG15gG5teXd2iHhxa2podXV5dHV/wd/c3d3d3d3d3d3e3t7e3d3d3d7d3d3d3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHi4uHh4ePVhnFwY2lhV1NZV19MUk9STUtAPjg5O0E+ODc5NjQ3Njc6NjY2NDk+Pzo8Pzo/OTo6Nzo9PDk5PEFBPTtBQ0VDRkA+Pj5BRUQ+QEE3OD5GSEpesrW4wbm1u8jg5eXl5OTl5OXl5+fn5+fm5ebm5ra2tbWOfX5weoR1cnZnYmNlbGtyb2ZpbHZtd4Z9hXlsbHd4a3ZwfH14c3V5fHd2h7ng3d3d3d3d3d7e3t7e3t7d3t7e3t7d3d3d3d3d3t7e3t7d3t7e3t7e3t3d3d3d3d3d3d7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4eHj1Yd1bl5uY1pUU1hXS1NLSk1SR0E4Ozs+PDk4NzU2NTY2OTY4NjY5Pzw6PT07Pzo7Ozk8PDs5Oj4+Pjs8PUFEQkNBQEBBP0JDPDw9Nzs+REVKXrG1tLW2t7e2y9rJ3uXl3eDi3tXU1tPU4OPg39+2treuh3t/bnmNenJ1bWNobGxtaXR4enF5enqIh4N6aWh9cWRvcXyGgX55e318e4an2t7d3d3d3d7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4uHh49aGdmxhb19dV1lcWlJQSEpXTEVHPUA9Ozs9OTY0NjU1NTg2NzY3OD87OT09PDw5OTw6Pjw6OTg+Qjs7Pj5AREBDRUFAQD0/QDw9PTU5PEJHRl2xtbW2uLm5ubq9uMPT0r3BwcC6u7y6u8TMxb/Dt7e3hGl1gX1ndYd5Z3Vxa2t5eHB3fH15bWl3e3h3bml1j4FwbHl4d3d9gXuGgnmAoNze3d3d3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODh4OHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4ePXhXJrZ3RhW1hYX15TVVVRVUpMRj9JRDs5PTY2NDc3NTc4Nzc3ODk8PDo+PDg8Oj0+OTs8OTs5P0E8PT9DP0FARUJCQTw9Q0A6Pjw1NDlER0dasbW1tre5ubm5ubm3ubm4uLm5urq6urm5urm6u7e3uX9ucHN6b3B/eXNuc3Vsc3Z4cXFwb2tvcX6Bc2mHhIF9dHOHdW11hYmBgHJ2hafd3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uHj14lxa2xyW1dXXWBUUVVUUFJPSkNATUE9Ozk2NTM0NjQ2ODc3Nzk6Pjs8Pjs5PDo8PDk8PTw7PT0+PUNEREBDQkE/QD48PkE8OD06NjY6QkpIWLG1tLa2uLm5uLi5uLe3uLi5urq5ubi4uLi6uru3uKx7cnhxf3ZzfnBsbXpyZ29sbW50cHt3d3Jyd3pvhpJ2f3x8enZ5fH9zfYdyda3T393d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4eHh4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi49eHb2pxalVWV2FbT1FSUE5XSURESUo/Ojk6NzUzNDk1NzY2Nzg4Ojw7PD46PDo6PTw5PDw9Oz09PDs9REdEQ0E8PDw8Pj5AOzg8ODE1OkFGRVautbW1tre4uLm4uLi4uLe4ubq5uLi3t7i4ubq7t7mqcnB4d3x7e4J3aG5xam9qY2lyf21zcn54dHFsanaAeX2AgH91doB1a4qLgHaR1d/d3d7e39/f3t/f3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f4N/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLi4uPYhm1sdGVWUFxnWE1YU1JRWUVDS1BOOzk4ODY1NDM5NTY2NzY4Nzk+OT0+OTw5OTw7Njg5OTo8QEA9PkBGQEJCQDo+PEE9Pzs7OzYxNjxCR0RQqLa1tba2tre4t7i4uLi4uLm6ubi4t7e3t7e5ure2tIlyd3h9iXxwem99c2hqbGdnbHRscXd0cWx2c3Fxd3FyfHl4g3Z7d2mLkYp9kM7f3d7e3tvY2drZ297f39/e3+De39/f3Nvc3N3e3uDg3+Dg4ODf3t7e39jS397f397e3t/f3t7f3t/f3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLi4eLi4uLi4uLi4uLi4uLj4+Lj4+Li4uPj4+Pi4uLi4+Lk14NoZ3VkVlVkZVdKWllXW1Q9RU1LSD04NzU3NjQzOTQ0Nzc1Njc5PTo9Pjw9PDk7PDk5Oj45PD4/PkFBQ0FFRUQ+OzxBPjw5PDs3Mzc+REhFSqG2tbW1tbW2tre4uLi4t7e4uLi3tra2tra3uLm2traLfXpsbHp/cGx5dm5qaGdlcXp4b2lvb3B1c21zd4Fnb32CgYNyf3lqcHJ6f6ng393Zy8a/vb6/vsLN0tDW3tnc4NfQzcPCw8PH1dfT2dzX1NjX0MfExce9vM/Kz87Y3djO3N3c2t3T0dze39/e397e3t7e4N/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eLi4uLi4uLf4uPi4eLg4d7W29/Sw8rJx9Hb3OLk4eHg2dre1sbExcTN2trf5OHi4trX3st9aWZxYVleZWFNTFRLUlpMO0hNSEZBPTc2NjUzNDY2NDg3NjU2OTw7Pj46Pjk5PDk3OTs7Oj49PEBAQ0RCR0ZCQT08Q0A9OTw7Nzc3P0RGRkaZtrS1tbW2tra4uLi4uLi3uLi3s7W2t7a3t7i5tba3opdxb29waW50dnFmZWNrbmdvcm1mZ2tygWVvdnyAeGRzj39zaHFyaWVlbm+w39HFv7u5ubm5ubq6uru6vc3Gw8e/urq6uru7u8HCvcHFvby/vry7urq5ubq6ubm6w8XDucDDwby/ube/z8/U3tjc3t/g3tLa4N/f4ODg39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eDg4ODg4ODg4ODh4eHh4uLi4eDh4uLi4uHa2t3RwsPCu8XT1uDdydPDrrnAsaqrq6uwtLbJ0sXRxLG4v7Srq6usr7S0vMzE1c60tLureGxtbWBdYl9ZS1NVVFFQREBRTUhEPzo3ODQ3MzE1NjQ5ODQ2Njo8Oz08ODw5Njo6ODg5NzU8PDw/QEFAQkRDQkE8PkI/Pz09PTc1OD5DRUNAj7a0tLW1t7i4uLi4uLm5uLe1sautr7Oxs7OztLS0tqaei2tue3ZxeXhnY2hfcXdha25vaG99b25ja2lseHdsa4Z+bHB6dm1scG95sca8uru7urm5ubq6urq6urq6urq6urq6urq7u7q7u7y7urq6ubq7u7q6urq6urq6ubi3t7i4t7e2tbW1tbi3u8e+w8XHzcS4wMnH0tzZ2d/e3uDf39/f4ODh4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh3Nji4uLi4eHh4OHg3tfGxtHQztTe3tPO0t/SuLi8sq2trKysrrG+ua63rKipqamqq6urqqqqq6ysuKyqqqqrq6urra6urq6urryzrayrpHlub21fXl1dVE1SU1xUSkE/UElIPjg5NjgzNzMwNTczNzg1NzY2Ojw/PDg5Ozo6Ojg5OjY1OTs7Pj9EP0NFQkNCP0BAQT9APjw3ODc6QUVEP4W4tLS1tbe4uLm5uLi3t7SurKuqqq2urq6vsLGzs7WjcG5ucm1wg311aWFlaGZkY2Rxc21td25naW1tZXBzb29zcXN8h4F6dX11n7u6uru7urm5ubm6urq6urq6ubq6urq5uLm5ubm6urq6u7q5ubm5ubq6ubm6ubm4uLi3t7e4uLe3t7a2tbW2tra1tbW1tba1t7e3t7rBvrzGycrb3+Dg3tvd3d7h4tDW4uHg4ODg4ODg4ODg4ODg4OHg4OHi0768zNjd3OLg0dnbxL23sLCxsa+zu7uzsLS9s66urq2tra2sq6qqqqmpqKmpqampqqurqqqqqamoqampqampqaqqqqytrq6urq6urq6sraR4aWJxZmFZWlZRUk5cU0Y9QlJEQTc8OzY5NTY1NDU2NTg3NTY1Nzg7Pjw7OTk5Ojg3Nzk3Njg8Oz47RD8/Q0BBREE+P0M9Pjw+Ojo3Nz9DRj54srCztLW2t7i3trKurq2sq6uqqaqtraysrq+xs7S1t4xucnRqaIB5ZmpmZWxdaG5waGxxYmNmcoJ+dmhobGpueoaBhXx4cXF5gK+6ubq6urm5uLm5ubm5ubm5ubm5ubm4uLe3t7e3uLm5ubm5uLe3t7i5ubi4uLi3t7a2tre3t7e3tra2trW0tLW1tbW2trW1tre3t7e3t7e3tre4v8bP0MS+v8DE19e8ydra4OHg4ODh4eDg4ODh4eDb3t7Uzby3tre6wMDJxLfIvrKwsLCwr7Cvrq6ur7Cwr66urq6uraytrKurq6qpqampqampqampqKmpqKmpqampqKmpqKmpqqqrraytra2ur66trK2heWpjbWdiXFhRUFFLVEpCOklRP0E3PDk0OjU2NTQ1NTY4ODY4Njs6OTw9PTs6ODY2ODg6NzY3Pj09PT5BQUVCQkNBQUBBOj09Pz05Ojc9QUc8bKqmqKutsLGwrqupqKqrq6mpqamrrKytra2usLO0tbilgIdvaWdzdGZrcG1qZGxvcm5rbWNrcHyJhG5qbHx4Y3uKfnNqc25rcY+7ubm5ubm5ubi4ubm5ubm5ubq5uLi4t7e3t7e3t7i5ubi4uLe2tra3t7e3t7a2t7a2tra3tra2tbW1tba1tLS0tbW1tra2tra3t7e3t7i4uLe2t7a2uLm4uLe3uL6+uLq9vcfb4OHg2Nnd4eHg3dfKwcPCurm5uLe4uLi3tbS0tLKysbGxsLCvr6+vr6+vr6+vr66ura2srKyrq6yqqqmoqKmppqepqaehpaipqamoop+hoZyip6inqausrK2ur7Cwrq2unXdwbGphY2BZUU1RTFJGQzlNUEY+ODs3Mjc5Njc0NDM1ODg3OTc7OTo9PTw6Ojk3NDo5ODY2OD8/QEI9RENDQ0FDQEJBQDtAP0A/PDw6O0NIPWOopaWlpqioqKenp6ipqqmoqKipqqqsra6wsLCztLW1taWYdn5xZmt4cW9tZmVsaGNsZ2ZpaX11bWlvfXZ5hWZod294b3Fvcninu7m5ubm5ubm4uLm6ubm5ubq5ubi3t7a1tba2tre3t7e3t7a2tba2tre2tbW1tra3t7e2tbS0tLS0tLS1tLS0tLW1tba2tra2t7e3t7e3t7a2tre2tre3uLe2t7i4t7i4uLi4wMXTyry8w83PyMC9urm5ubq6ubi4uLi4t7W0tLSzs7KysrGwr6+vr66urq+vr6+uraysrKurrKysq6ehoJ6gn5udoaGdlpmkpKaon5mZmZmanZ+gn56fpKqtrq+ura2srJl1cGlrY2FeXVVOU0tSREQ4TktHQTo4NTI2OTY2NDczNzc3ODk3OTo7PT0+ODg4NzU6OTk1OD9AQEFEPkZBQkNAQkNCQT88QEJCQD0+OjpERj5cpqWmpqampqanqKenqKioqKenqaurrKytra2ttLS0tbekc311bnONf3JmanFjaW1jaGZobG51aV9jZ3VzdnpuZ3Bwcn56cYihu7m5ubm6urq6urm2s7W1uLm2trW1tra1tbW1tbW3tra3tra2tbW2tbW1tbS0tLa2t7e2tbS0s7O0tLW1tLS0tbW1tra2tra2t7e3t7e3tra2trW2tbW2tra2tra2tra3tra3uLi3uri4uLe3t7i5ubm5urq6urm4t7e3t7W1tLS0s7OysrKxsbCwr66urq6urq+vra2srKuppaSmpqScmZubmpmampmXl5eXl5aZm5iZmJmZm52en5+dnJ6gpKWko6OioqKQdG5jcGFeXltUU1RIVEo/PFFCRkM7ODYzNzo1NTQ4Mzg5OTc4OTc7OTs9Ozc6NzU2OTk4NTg+Pz9ART5CQD9DPzxBQUI/PT9EQT8+PTk9Q0Y/VaSlpqanqKeoqamop6ioqKioqKiqrKuqqaipq7W1tba5o3eKcXKHhnd0cGh5a2JjYWVsaW5zal9jZWNjZWprYmRqbHaXjX6ovbm3tre5u7u6uLWxrKurqq6wrKyrq62tq6yvsLGvr7CytbW2t7W1trW1tbW1tbW2trSvr7O0tLSvra6vsrW0tbW1tbW2t7e3t7e3t7e3t7e3t7Owsra1tLa2tre3tra2tbW1tra3t7e5uLi4t7e3uLi4ubq6urq5uLi3t7e1tbS0tLS0tLS0s7OysbCvr6+vr66vr62oo6KgnJqampqZmZqbm5qampqbmpmZmZiXl5aYmZmZmpycnZ+foJ+goKChoaCgoJ+fi3RuaXRdYGZeUlRLRFRJPUVTSEVCOzo0NDY5NDQ1NzM4ODg3ODk5Ojs7Pz04OjkzNTg5NjM5PT5AP0A6QEJCQkA/QEJCPz0+QUFCPz06PkVDQFGjpqWlp6inqauqqKaoqKipp6ioqKinp6ioqaq1tbe3t7KZtH99kIx1Z2lqbGZjYGNoZW94cGlicXx5cGpmZmRma3NqhYystrKwra2ttLeysLCtrKuqqamop6ipqampqKinqKipqaeoqqurra2sqqytraysrq6traunpaSnqqyopKOkpamwsbGztbW2t7i3t7W1tre4t7e3t7Kppaasq6ivtLa1s7W3t7a1tbW2tra3t7e4t7a2t7e3t7m6urq5uLi3t7Wxs7S0tLKxsK6sq6yurrCxsK2rqqmqqKijnJqZmJmYmJiYmZmZmZmZmpqZm5ubnJybmZeYmpqcnJydnJ2foKGhoqKioKGgoKCfnop1amtuWVxhVktPREdVRz5PV0hEPTw4MzQ0ODQ1NDgyODk4ODk6Ojw5OUA8Njk6MzY3OTE0PD8/QEFBOkNGRUJBREJDQTo7P0FCQz9APUBEQ0BPo6empaemqKqqqqakpqenqKioqKimpqaoq6uttba3t7e4rbJ1cHuDdmBiaWtiZWZhZGdmfYh5bHKAfXFvcXhjbW5xZo+srKurq6ysra6urK2trKyqp6WlpaWlpqioqKiopaeoqKeoqKeoqKmqp6Wko6KioqOioKKioaKhoKChoaKjpKOjpaWlqLC0s7OzsKuqqaqztLa3trGopaOioaGipKiqqairs7Sxrq6xs7W2tra3uLi3tre3t7e3t7a2uLe0sa6ppqerrKmnpqWkpKSkpKWnqaajoJ+enZycm5uampmZmJeXmZmZmJiZmpqampqampqbm5mYmpydnZ2dnZucoKGgoaOjoqCgoKCfnp2FdGtsaFdYU0pHTUVITUdAU1dGRz09OTM2Mzc0NjU3Mzg6Ojo6Ojw9OjpBPDY9ODM3ODgzNztAPz9AQDpCRUNAQkRDQT87O0BDQkNBQDxBQ0A9TqKnpqanp6mqq6mkpaWlpaaoqKippqanqKmpqrW2tre3t7izc2h7c2JnamtpaWJhZGloXV1tfHJma3J/fHR8bm1zc36gqamrq6uqq62trKusq6mpqKWjpKampqWmp6eqqaamp6enqKinp6iop6WkpKKhoaGhn56en5+fn56foKGho6Wko6OkpKSlp6enpqWkpaampqeqraumpKKhoaChpKWlpaempaeoqKalpaivtLa3trW1tra1tbOwrKupqa6rqKWlpqampaSkpaWlpqWkpKSkpaKhoaGgnp2bm5ucm5qamZiXmJiYmJiZmpmZmZmYmZmZmZqZmZydnJycnJybnJ+fn6ChoaKgoKCfnZ2cgHNrbmReU0pITUZETEtFRFFTQ0c9PDgzNjI4NDY0NjQ4OTg6Ozk7Pjw5PTs5PTczNTk2NTY8QD0/QD88P0JDPkJCQj89Pj5CQ0FFQD86PkVAO0+jpqWkpqeoqaelpKWlpKWnp6eoqKanp6alpqa1tba2trW2uYptcW1vfHxxZ2pmYGFsYFROW2hqbm9tgYJ9cWdxdn6aqKeoqqmpq6urrKqqqqimpaWkoqOlpqalpaWmqaqppqWjpKWmpqSko6Kio6KhoJ+fnp6cnJycnZ2dnJ2en6CioaKjo6OhoqKkpaSioqOjpKSjpKSko6Ggn6GipKanp6ipqaelpaSipKSlqK2wsKyrqqusqqmnpaWmpaWlpaalpqioqailpaWkpKSlpKOjpKOioaGhoqKgnp2cnJubm5qZmJiYmJmam5mXmJeWlpeXmJiZmpqcm5qampubm5ucnJ6goKGgnp6enpycm356bnJiXlNNSlBFRk5NQkBPRT5JOz01MzYzODM2Njc1Ojs4OTs5Oj49Ozo5OT03NjY5NjU2PkI+PkE/PT5DQT5DQ0BAO0A/QkJCRUA+Oz5FPzxQoKSjpKOjo6SkoqSlpaSlpqamp6empqalpqaltLW1tbS0tbiBaHx9ZXOCemxwdWFfY1ROT1FbaGxpbGxxbW5xbnScoqSnqKioqauqqqqqqaempaSjo6OjpKSlpqalp6ytqaShnp2epKShn56foKCdnJ2dnJycmpqam5ucnJubm5ydnp6foKChoJ+goaOioKGjpKSjoqSlpaWkop+go6SkpKapqainpaGdnJ+jpaipqainqKioqaempaWkpKSlpqampqampqenpaWko6Ojo6KioqGhoqKhoqOkop+enZ2cmpubmpqZmJeXmJaWlZSUlJWVl5iYmpubnJuampqam5ucm5ucnp+fnpucnJyam5p/fnF0YFtUTUdNSEZMSj8/TkM8QDs8NDM4Mzc0NzU3ODs9ODo6OTk7PTs7ODk+Njc4OTU4OD9APT9BPjs9RD89REA/PzpAQUE/QUVAPjw8Qz88Tp2ioaKioKCipaSkpKWlpqenp6empqampaampbW1tbS0tLS3jHalsXdmc3Jvc2xjZGlYT1JRT09dgG1kYFptkZGSoqKjpaampqenqKiop6alpaOioaGhoaKjpaempqesq6emoJ2cm6Ghnpubmp2cmZiam5qampmZmZubm5uampqampucnZ6goaCfnp+hoJ6foqOko6Omp6inqKWioKGhoaGkpaWlpKCcmZmbnqOmpqampqanpqempaOlpKWlpqiop6enpaWlpaWkpKOjo6KhoqKioqKhoaKjo6Kgn56enZybnJubmZaUlJSTk5OTkpSUlJWWl5qam5ubm5qZmZqanJ2dnZ2dnZuampqamZqXf3dvc11aTkhKTkdFRklERU5APD09PDQ1OzQ2NDY1Njc5Ozg5OTg5OTw7PDc6Ozc4ODg1ODg/Qj9BQTw+P0A8PEJAQT49QT4/Pz1CQUA6OkA8PE+doqGfoJ+dn6OkpKSlpqeoqKenp6ampqampqW1tLS0tLS0tbSXtqd1Znh2Y2xjY2VjW1JTU1JNXqCMeFhodpajnp6hoaOjo6OjpKSlpqalpKSioaGko6OjoqOlpqamp6enpp+bmpuioJqWl5Wam5qXl5iZmpqYmJqampqbm5qZmZmenZ2goqOjo6KkpKWinqGhoaKjpaampqSjoaCgn5+hoZ+goJ2amJiZmpygpKOjpKWmp6alpaOjpKSkpKWnp6ampqampaWmpKOjo6SjoqKjpKGfoKGhoKGgoaCfn56dnZyamJeVk5KSkpKSkpOTkpOUlZaZmpqbm5qampqbnZ6enp2cnJybm5qamZmZlH10bHReWk9IRUdGQkVORT9GOzo+Pzs0Njo2OTM2NDY4OTo4OTc4ODo8Ozw5Ozs6OjY3ODk5Pj9APjw9QD5AOjlAQT89QT8+QUE+QUE/Ojk9PjpQnaCfnJucnJufoqOlpaWlp6iop6ampqanpqantLS0tLOysrGwsK2rkHiGj36amn93Yl1TUlFRTGKgootaiKCgn52YmZycnZ2eoaGgpKenp6WkoqGjp6alpaOipaampaanpqagm5mboaCXkpOSl5qcmpeXl5iampmampqam5qYmJmaoKCgoKGfoaKipKamop6gn5+goaOko6Khn56enpyanZuZmpqZmJeZnqChoaKioqKkpaWmpKSkpKKioqKkpaWlpaWlpaalpaOko6KioqGgoKGgnp+fn5+fnp+foJ+cm5qZl5WUlJSTkZCRkpKSkpKSk5SVl5iZmpmZmpqam5+fnp2cnJycmpmZmpiXl5F8cmdxXl1QRj9BRD9KT0JCRjhDRT4+OTg7Nzc0ODQ1OTo6Ozk3OTo8Ozo8PT48PDo2NzY5OD4/QT47Pz49PDg6PkFAQUE/P0FCP0RBPjo4PkE8U5ycm5uampycnaGio6KjoqSmp6alpaampqSjo7KysK2rp6amp6alpqiln6iop6qnoXmEXFFST0xcnKCAYpmgnp2clZOVlpeZmp2dnqGmpqampKOioqanp6ajpKampaWmp6amop2cn6Gfl5GRkJSXmp2YlpeWmJuZmpqampqZl5iam6Ghn56fnpybnJ6goJ6dn56fn6Cio6SjoqCfnp2ZlpeXl5iYmZubnqKioqKioqGio6WlpKOio6SioaGhoqOkpKSko6SkpKSioqKhoqGgoJ+gnp2enp2dnZ2dnp6em5mYl5WTk5SUk5KQj5GSkZKSkZKTlJaXl5iYmZqampyenZ2dnJubmpiYmpmXlZaNempmamBiTkY+P0A9SkVAQ0A7QEE8Ozs5Ojc2NTg0Njc5OT04ODs6Oz87Ojs8Ojk6Nzc2ODs8Oz08Ojo8PTw3Oz5DQkRDPz1BQ0FEQT88OkBCO1eZmJqamZmam5ucnp2foqKhoqSlpKSlpqSioJ6op6alpqWlpaemp6ampqakpaanqKehqXJOUU1KVJahenKanJyenJeVlJWWmJiXl5qeoqKhoqOkpKOjpqalpKanpqWlpqalpaOgoKGhoJmSkI+Wm5menJaXl5eZm5ycnJqamZeZm5uen52cnZyZmZqcnZydnp6fn5+hoaCgoaKgn56bl5WVlZeanZ2fn6GhoqKio6OhoaCgoJ2cnaGioqOkpKOioaSlpKOko6SjoqKioqKhoKCfn52cnZ2cnJ2dnJ2enpqXlpaVlJOTkpKSkpCRkpKTkpGSlJWWl5iYmJiam5ycnJycnJ2cm5mYmZiWlJWXi3hsY2RiZFFHQT1DO0tIRDo7Ozw+OTo6OTo3Mzc5NTk5ODk8OTg7OT09Ozo7Ojk8PDc2NDc/PDo9Ozw/Pjw7ODxBQ0FDQkI+P0NAQkFAOj9APztZmZiampqam5ubm5ydoKGhoaGhoqKioqKhn5+dpKWmpqenpaWmp6ampqWkpKalpKSkpaaGUFJQT0+PmHB6mpubnJ6cnJycm5ubmZiYm56dnp6foKOkoqGhoqOio6SkpqalpKSjoqGhnpyblZKUmJyam56amJiYmJqcnpyam5iWmZybnJycnJydmpqbnJ2dnp6dnp6fn52cnJyhoaCblpWVlZacn6Ggn5+hoKKjoqOhnZuZlpaWlpicnqCip6ikoaCgoqOjoqKioKCgoJ+fnp+gnp2cm5ucnZydnJmanJuWk5KSkpKUk5KSkpKSkpOSkpKRkpSVlpeYmJiYmZqcm5qbm5ucnJqZmJiXlZWWl4d3ZGdoZGJNQ0U8RDlJSkU5Ojs9PTo6Nzg6NjQ3OTU8OTY4OTc5PDs7PDo6PDs6PDw4Nzg3Pj07Pj46Qj86Ojo/QURCQ0FBQD9EQUFAPjpAPj06W5qYmZqbmpubm5uen6CgoaKioKCgn5+enp2dnKWkpaanpqWlpqakoqKio6Oko6Kjo6KnllRYVVJOZ21rgZ6am5udn6Cgn56enp6dnJ2dnJ6enp+goaCfn5+goKGio6OkpKSkoqGhnpuamZehtZ6ZmZienpiYmZmam5qWlZeWlZicnJ2cm52dnpybnJ2cnZ6bmJqeoaGdm5udoKKhmpWVlpaZoKKfnZueoaKjop+em5eXlJKSlJeYmZ2goqenpaGgn56goaGioaCfnp2cnJubnJubmpqZmpydnJmXmZaVk5GQkJCPkZKSkpKSkZKTk5OTk5OTlJWWlpeXl5manJubnJucnJqamZeXlpaVlZSEcmZsYmRbREJMPT84RktCPEA+Pj05Ozk6PTg1ODg2Ozg2Njo4PDw7Ozw8Ozk8Oj09OTU4Nzw5PD88OkE/Ojo6QEBDQkRBQ0A/Q0FAPj08QD09Ol+al5mamZeYmpycn5+foaGhoJ+fn56foKCenZ2lpKSko6OioqOjoJ+foaGipKOio6SiradXXl1UV19ua42dmpqbnJ2dm5ucnZ+enZycnJydnZ+goKChoaGgoKCgoqShoqKhoaCenJubm5mfq5ucmpuZnJ6ZlpaWl5eTjo6QlJabnJuam5udn52cnJycnJ6dlpSZnJ+in5ycnZ+hoJuXl5mZmpycnJubnZ6fnZqXlpaWlJOTlJiampqfoKGmpqWgn56fnqChoaCenJubnJybm5ybm5qZmJmZmZmXl5iVlJKQkJCQj5CSkpKSkZGTk5aYl5STkpSVlJWWlZaZmZmam52cnJyampmXlpaWlpaQgG9vZV5gV0BKSDg/N0lFP0VBPD07Ojo8Ozs3NTs4Njo3NTY6Oj47Oj0+Pj07Ozs+Ozo4Ojk5NkBBPTo8PTo6OT9BQ0JERUM+P0FBPz8+Pj89PDtgl5WXl5aVl5mbnqGhoKGioqCenp6enqCgn52bpaWkpKSioKCfoJ+dnZ+hoqOjo6OkobCjXWVkYGFua4GenJubm5ubmZianJ2enJubm5ycnJ6ipKGeoKGioqKhoKWzrKCgn5+enJmZmpqbrmp2nZ2em5manJiXlZWWkY6Nj5KYnZycm5ycnqCdnJucnJyempWVm56foZ+dnJyenp2cmpqampqampqbm5qXl5aTkpWVlpWTlZaam5qanZ6foqWjnp6fn5+en5+enZ6fnZycm5qcm5qbmpiZmJiYmJiYlZSTkZCRkJCQkZKTk5CRk5SYmZiVk5SVlZWWlZaXmZmXmZqenpyamJiXl5aWl5eYjX1ubV9lVlRFSzw3PjdSRUM+QkE4Ozw7OTg6ODY7Nzc6Njc5Oj0+Ojw8PT49PD06Pz06ODw9OTtAPj4/PT45OTs/QkNAQ0VDPT9DQj5AQD5APTw8YZWSlJWWlpeanJ6goKCgoaCgnp6enp6gn56em6WlpKSioJ+fnp2dm5mbnJydnp+gn56rmGNpbW5pZm2enZybm5ybmpmZmZqam5ucm5uam5ygo6SgnZ+en6ChoJ+mkpurn6CgnpuamZqZqIREf5+enpyZmJqamJiYmJKOj5OXnJ2bnJ2cnJycnZycnp6dnpqVl5ygoaGfnp2eoJ+cnJuampqbmpqYmpmVk5OTkpOWl5eVlJiYmZucnJydoJ+gnp6enp+fn56en6KjpKKgnp6cm5qam5uamJmZmJeXlpWUlJORkZCQkZKTk5OSkpOUmJmYlpWUlZaWlpaWl5iYmJiXmZqamZeXl5aXlpeWl4l4dmddX1dURUU5OTs8WT5AOEI/OTw8Pjk4Ozg6Ozc5OjU4OTs9PDk9Oz0+PD0+Oz8/Ozk+PDw+Pz5AQUE9ODc7QkNFP0FFQz1AREJBQEQ7Oz47PGKWk5SUlpWUlpiYmZubnJycnZ2cnJ2en56dnJqkpKSkoJ+enpybm5qZmJiYmZucnZ6cpolla3R4bVuFop2dnJydnJqbmpqampydnZ2bmpuboKKinpucnZycnJ2eoJ5inKaenpyampucoaNRR4OgnZ6cm5qanZqam5yVkZOXm52dnJ2fnZycnJycnZ6fnp+cl5idn6GhoJ6cn6CfnJubm5qbmpmZmZmZl5WWlZaYl5eXlpaYmZuenp2dn6GhoJ+fnp6fn5+dn5+hoqKhoZ+fn5yZm5qcnZuampmXlpaYl5eXlpWTkpGTlJSTlJSUlJaZmJaVlZeZmJeYl5eXl5eYl5iXl5eXlpaYl5eVl5eDeHZfW11eUT1GOjk4P1VDQTtDQzo8Pz86Ojk3Ozg4ODc0ODk8Ozw4Ojs8PTo8Pjk/QT06PTw+PkA/PUBBPjk2PERDRUBBRUU9PkVERD9COzo8OTpkl5SVlZaUlJSUlJWXmJiamZqcnJydnp6dnZybo6Oko6CenJuamZqZmJiYmZiam5ubm6WJa3F2em9lmp+enp2dnJybnZ6dnJ2enp2dnJydm5ygoJuampubm5udm5qmZl2joJuamZudnK51SUyGoJycnZybmp+fm5ydm5mZmZudnZ2dn52dn5+dnJydn5+fn5uanZ+goJ+dnJ6gnpubm5ubm5yampuamZudnJqZmJeYmJiYmp2foKCgoJ+hoaGgoJ+en5+fnp6foaKhoJ+enp+enJqam5ubmpqZlpaXmZmYmJiWlJOUlJWVk5OVlZSVlpWVlZSYmZuamZaWl5WWmJiWl5OUlJGRk4yRkJOWfXhqYWJiXFE8QDw2OENWSERCOjg7Oj47Nzc5Nj06OTk2NDc6Ozw+OTo6Oz87PT08QD47Oz46PT89PkBBP0A8NztBQ0U/P0REPj9EREM+Qj07PDs6Z5aTk5OTk5OTlJSVlpeWl5aWl5mbm5ybm5uamaOjoqCfnpuamJeYl5eXmJmYmZybm5qkgGpqb3lzcZegnp2dnJydnp6enp+enp2cnJydnp2bnJuampqam5ubmZmYpIBSeKKZmZqdm6CkX1ZOh6GcnJ2cm5qdn5ucnJubnJubnZ2dnJydnp2enZydnZ2cnJ2dm5uenp6dnZybnpubnJycnJydnJubmpmbmpmYmZmYmpmZmpyfn5+jpaKfoaKioaGfnqCgn5+fnqCioaChn5+fn52ZmpucnZqZmJWWl5aVlZaTkpOUk5STkJCSk5GUkY+OkJGOlZabmJWYlJmXlJiRjJCPk5yTkoyFjIeDhndxZ2pkXFxRQT44NkJHYEJFR0A+Ozw7Ojg4NjU8ODo4MzQ6Njk9PTk5Ojs9Ozw6PD48Oj5AOj5APjw/QD8+PDg6Q0FEPz5CRD8+Q0VCPUJAPDw8OmeYk5KSk5OSk5SVlJWXl5aWlZaXmZmZmpqampqkoqCfn52bmpmYmJiXl5iZmJmcnZ2cqH1nZXN7enOJop+enp2dnp6enZ2enZ6enp2dnZ6cm5ybmpubm5ycm5iYmaCIW1+UmpmbnJyjj2RaTIGinp6dnZybm52bnJybnJ2dnZ2dnJ2dnp+fn52cnZ2dm5qbnJmZnJ2dnZ2dm5uanJ2dnJycnp2dnZybmZeVlZeXmJqam5ubnZ6foqOhoKGhnJucm5ubnZqcmZycn6CfnZiZmZmUkpKUl5SPj4+OkYyNiYuQi4mLjpGRj4mQmJiQkoyNi5KQj5iYoqiqpqWlrKOmoZqep6eyqKKVo6Cfl39wcWlsXFtbTEY8NzdHR1g+SE5URjk+Ojg5ODc1PTk4NzMzOTY6Pjw6Nzo8Ozo6Ojo8PDs/PjtAQD47PT5BPDw2N0A+QkA+QUY+PEFEQT1DQj49PDlmmJSTk5OTkpOUlZOVl5iYmJaXl5iZmZqampqaoqGfnp2cm5mYmJiYmJiYmZmZm5ybnKx/am16f3lxh6Genp2cnZ6enp6enp6dnp2dnZ6enJubnJubm5ubm5uZmJmfl11ddpeanJ2dooFkWU1+op6enp2dnp6dnJydnJ2dnZ6fnZ2fn56goJ+enZ2dnZybnJ2em5qbm52enZ6dm5uanJ2cnp2cnZqYl5SRjo+QkJGVmJSWlJiZmpudmJuYlY2Mjo6TkpKRj4mQjpGRjo+Ki42NjYiIi4+Lg42NkY+MkI2Qk5WVnJihoJySn6SipKmam5eanKOprb3Bwbq8uL26ucC8ubq3uru7tL2zwbV/bnVmZ1peWUxJRTo7TElTPFZSSUM6QTo7Ozc3NTo6OjgyNTY4Oz08OTk7Ozw5Nzk4Ojw6PT85PD8+PDw9QTs5NTg8O0A/QT9EPTxBQkA8REM9PT06YZOTkZCUlJOTk5OTlJeYlpeZmJmYmZqbmpqamp+gnp+fnJqZmpqampmYl5iZmZmZmZmphXB1e4B3b4mhnp6enp6fn56en56fn56dnp6fnp2dnJ2cm5ubm5ucmpiZmZpgYWCAlp2cnph0Y1VOgKKfn5+enZ6hoJ6dnp2enZ6fn56en6CenZ6enJydnZ2cm5qYnJuVmJqamJiYmJmSjJCXlKCXk4+MjYqKiImMiJORh5CPjYqKkJCLjoqMi4+IiImJjpGOjYaFiYaKhoWLiI+SkJCNkJKXlpKamJ2TlJ6kpqaqq7Gsr6+rpquqsbm5tbS0rqyvtMDIxcXBvsbDxMTDurW+t7a0s7C2tb6qcHRyXGZfXl1JRj8/RUtMVklcTEQ/PUI6Qzk5Nzc7OTk3MTc5ODo+ODg6PDw7OTc5OTs9Oj4/OT5BPDs+PD46OTY5PDpBPkNBQT08QkBAPkJEPj8+OVyHhIOHi42KiYaFgYqMkZOVmJiHlZaWkpiampmenZ+gn52ampubm5ycm5iWmJiXl5ibqo56dXZ7f3mCoJ+fnp+goKCfn5+foKCfnp2dnp+enp2dnJqbm5ybm5uYmZmfaV5bZX+cnJ6Mal9QUoaem52dnZycoaGfnZ6dnZ2dnp2dnJiWlpaYlZWSlpmWk5GKjI+PjI+NkIuLj4+WiYiEi5GZjn2Fi42PjYyHioyQm4yRj4+Lio6TjIyNjIiSi4yFiYyPhouIh42KhYyEj4qXkJOYmpWbnKOqoaKknKKrsbe0ubWxtK2vsrKlp7O6sbq6vLa3tsDDw729vLa/urq8wbW4wL60r66mqa+3mm58Z1tjWl1fSEU+QUtJU1hZXkFGOTk9OkY/Pzo3Ozs7NjM6Nzo5Pjg6Ojw9OTk4Ozk7PDo+PTtAQDs8QjxAOjg0Nzw7QkBBQj4+O0NEREBDQz0+PjlhmZWLkYWNj5aSiHl9e3+Fi4OKgoqJhmuAeJCLlpqRnZ2UlJGTlpeampiWk42Sk5KQm5uIdndzcX1/cpGgnZubm5yenZ2eoKGgm5uWlpucmpubnJuYmZqYmJmbmpqXk3NoYVR2k5ech1xWUFeKko6SkY+Uk5KXm5mYm5ePjpCLjo2Ch4uLi4qLiI2RjIeHhoqIiZGKh4yEhYqNi4qNhI+UkIyDkJOUmZWQi5OTkZWRlpWOj5GMlI2Oj4qIj4ePhoeJiYmNiomJioWNh46JmJKUmpuXmKChp6Cko5qqqbO2sbWwqKqiqK6tn6qvsK21ubi8wr/BxLixtbCutrOwuL68ury+urOzp7G3wpB1gGNiXlpXUk1IRkVQSVlXX1tDUDpCQz1HRj84Nzo6NzU1OTc8OTw5ODo9Pjo6Nzs7Pjs7PTs9P0E7Pz48Pzo4NDM3OkFBQEI+PjpDREM/QUM7PT45Z6mloqKZn6CippeUiI2CiIJ1h4iKiIp7e3Z7enmPeoiSfn18en6CkYWBgH1zfH99fISHfnRweHZzfHaBj4iIiYeIioyMkZicl4iOhIuNi4iNkZCPi5GPi4yPkJGRjpKanpJ9oKOWpJxuTE9jhoaCjYuGiYp/iYqGiJiRiIOIg4KFfIuLjIaJi4iKkIyIi42PjI+Wh4mLio6NjY2Wk5OdnJyalpycm56bmpuYnpeTkZWWkJKRi4+LlpSMjYqDi4SEiYyQkIqOio2LipGJjZOTk5SVk5KcmZ6Xn6CfpaKvsamupKSfmKStpqa4t6ysu729wsPAv7+vpa2wsLS3uLO0uLa0ta6stK+4tLaBeXpjZmBeVlFRQUVMT0lcXl9UR0dCS0xCREA9ODg7OTU3Nzk3Ozc9PDk9Pj05Ozg6O0A8Oj06PkJBOD88Oj84NjQyOTtCQD9CPj04QEI/PkBEO0A+N2CloJqXnaGaoaCPl5efl5WCjaCfo6GdmpKOjIxycXBvdnFucG1ucHZub29waHBxcHR+c3FycXd7cnl2d3Jyd3Z6e3l8fXt/iIGEi3+PkYaNi4yGiouLiYeEgYaDgISgnY5/bJallZ+AiX9fcn+AgpKQhoSEhY2DhIyPj4+IjY+Hi4iRkJWRjpCKk5eOj5WYp6SfnZWYlpaln5udq6aqt7W4srGnr6qnpqGfmp2WkpWVkYqPjImTjZuVjYuLhoaJjJWQkJCLmZKVlZSbkJiTlIyNkYyWl5WilZ6mqauno6OqsJucpp+mq6G0vb6zs7+5u7u6uby9rqiusa6wuLyztLGxqrCpqLGxsqild3J0X2hhYFRWUUlKSFZNXl5eVExKRVFKRUdDPTo5OTc0ODY5Mzg4PTo9PD47OTs4Ojs/PDw+OT9DPzg7Ojg8Nzc2Mzc5RT4/Qz89N0BAQT0/RDw+PThUj4yGh4eUjJWZl5yWmZaNlZyWlZydoKCdmpiWeHFubXJ4cXFsbnJwa3FvcG1yc3t1dnd5fnVxeHZ0d3tybn98gX15eH1/eYOGg4WCg5CLkIuLi46Pi4mJhYKCfn+Aoot8blJ1nIyMWnF9fH59fIaOjYuGjZSRi5CXj5SXkpihlp6WlZunpp+goKawq6GjpbW0sqqmqq+isba5vcK7ucO+vLi9uLWxrLCsppuSk5mfm5SPk5WOmp2doJqfn5edo6qsoZ+em62hp6qwqaampJiRkZWUo6SirKSss7Szs6i3tru4sLKvra2yt7a6srW6s7e5u7i8urayr6yxsbKztLOxsa2us7Gzs6yhl3Zxc19jXlJRVE1PSUdYT1pcZFROR1VPRURKRD44Ojg3NTg4ODU5Nzo6PTw/Ojg8ODk5PTs9PTpCPj84Ozo5Ojk4NjI1N0I+P0RAQDY+P0I/PEM8PT46Tn98go6MjJOTl5eaj5SWjZaRkZSXk5qanqGdnHJvcnFxcXFxcG5zcW91dHJxdneAdXd8eYV+d3t8eX1/fICJiYmDfXp/h4GIiYGAgIGGiIKGi4eIhYSIiIqFgIJ9mJp3WE9McJSGgkxgcHF3iIWKjouNkJmclJSUoJqan6Ktsa6ppKWtr6ysrLWuvrmtrqm1sLexq7G2rK+9wsLAvrq8trKutraxtK66u7OurKepp6unoqmtoKmooq+wuLSxvLq6urK0ta+8tLezt7e7t7mtrbCprLW5sbeytLe2sLu7vLu6ury1vLi0wbWsqqqrtLG3uLm1trSzsKymrrCqq7Cxq6yusLKxtK6qo5N4dnJlZ1tMUlBFTUlTV1JlXmdUUExcUUhMUkNBOTk3OTU4ODY2Ozc5Ojs6Pjk4Ozo6Ojw8Pj08RD45Njs7ODg+OTUxNTZCRkREP0A3Pj5DPjpBP0BAO0t/gomXmJSdlpabmIuSlo6XkZGVl5SZl5+bmZx8dHV2dXl1c3RudnJzdHV2d319gH56gXyDfoJ/fYB/hIKFj52RiYF/go+Xjo6HgoCBiIuFfoqRi3+IjYyLi4eRjaONVS8wPXeHd3ZBRV5rbYSQiYmQj42PlJSYkJWcmp2eqK6ysLC1tLOtsrW4sLy1tbGqsKqztbS7t7SztrS1r7i4t62noqassLCvtre3vrW5vLOysa61u7C0r6+yu7axuMC9tLS0s7izvLq2tLrAvbm6ubq+ubm5vrWysa+yr6q1tLGzsbSzrri4tb+vpKaoo6ussa+zrq6wsKytq6qroqKmqKKnrauqpaynoqeYeHlxZmVZT09NSVJNV01PX15cTlVUYlFEVE07Pzk8ODk1ODc1Nzk1Ojo6OTs4Ojw8Oj08Pj4/P0I9ODY6Ojk6QDs1MjY2QUZDQz4/Nz49Q0I5P0I/PjtLjpGTmJmVmZGTopiTkpKLk4uOkI+Vl5ablZSbhoJ9enh2dHRzdH53end2gIKDhouMhISFioaQiYeRk5aRjZaalY+IjI+emJaVkpCTl5qamZCeoZ2Tl5uhmp2boqacZ0FaSDt3eWtnRTA4WWxzkI+LmJqPj4yUmpecnZugnaSstLm6vK+2tLi0tLK3uLmzq6+qqKy1srK1rrGrrqa3s7OxpaGotbCvrayrtbqyu7q6tLK3ur67ubG4sLmtqLK4u66ttLS3tbu2trm5vLe0r7G0t7a5s7e1pq2pq6ior6yprq2up6KxtLG0q6aop6Cjq66oqq6orLKwr6+pqKGeoaGjpqOgopqlo56ol3J3bmdiVUpUT09KRFBLX2JYWlFcVF9NSFJJQUA5Ojg2Njc3NTg5NDs5Ozk8Nzs+Ojg8PD0/QkBBPTs2OTk5Oj87NjM3OD5GQkJAQjk+PUBDPkBGQj44R5OWkZWTkpSQkZ+ZnZmVkI+Sko6Mk5aWko6RlZGSkIaBeXJzdXuBhI6HhZGTkpicnJiVkJWYo5yaoaeqqZ+clpeVnaKioZyZnpmlqKyvramnqqqpp6KlqKmrqamvj0pvoXhBe3dkYVBRW0dgboqhoaSem5qkp6Spq66spaSoq6+xtK6qrK6zr6ystLO0ua6urayqrLKwsK2wqKqmsrS0uK6qtrqwr6qurLC3s7i0t7W0u7y4tbWxtauyrKiys7uvrbGytLa1sbG0s7OvrKuvs7a0sayutKqqpqWnrauoqKupqqifqbOwqqeppaOio7CtqaatpairrayppaSioKWipaOYmZyVnqKippdudWVnZFdPWUtLSktTVHBiWWRXX1tcUlpQTEM8ODk6Njk4NzQ3NzQ4Ojw6PDg6PTk3PDw7PkM/QT47OTo5Ojs+PTg0NThBREVEQkM5PjtAPkI/R0Q+N0KSm5SVlZaVj46Wl5qZlZGKk5SSjo+SkYqKiY2Ul5qTjYmCho6VkZSfmpuin5+jnqGhn5ijpKelpaapqa2rqaKmpKilpKGfnqOjra2srairrq6rq6ykoaKmqaeoo3hgwNamQ3uMgHVPbY52U2R/o6inoKKhrqyrqqetrqilpKmpqqmmo6iqqaekp66wr7Ovq7Crqq+yr7Czua+rqLCxrrCyubO0r62vtbCss7GurLW1tLSzs7CvrKyqrKusr7G0s7CwrrCwsKyqrauqq6alrrCysKumqbCvqaOkqaunqKaopquwq6mvqaaoqaalo6iwraqpqKKpo6WnpKGhoKKloZ2el5aYlJugpKmUbnNeamlfVlpOUk5RT1NlXGVjW11ZXFBZT0tAPDs5Ojc6ODczNTMzODo9OTo4OTo5Oj08PEBEPkA9OTo8PDw+Oz45NTo8QkFFQUNBOT47P0BEQENCQDdAkZ6YlJeZlpGHi5SSl5GIg4mLk4+OkI2Hh4SFlZmWmJeZlpqeop2ZnKKkoaCdn5qfoKGgpqGgoKCjo6KlqKmrramqpqOmpaCloKaop6aoqaepqaSnp5mdpKWjop1if73Ar3eeo5qUZUxheG1RdJWioqChn6GhqKCcn6GloaCmo6KfpKGspp6foaGkrKqnrKivq6e0sa6ur7WyrKqwq6mtrbWwrq6srreup6yqpKivsq+sq7Kvqqqpq6utqa6urrGxraqtqaunp6uoqauinaapqKilqKisqKilpKWop6iopqmsr6+oq6mhoqKlo6Opq6ymqKWjqKKhoKSdnZ+hoZ2bnZ+amZWcnKOqlG9zZm5yZF1dUFVPWE9eZWRsaGJiWlpSVE9NQTo9Ojo4Ozk1MTYzMjg4Ozk5OTk7OTk8Oz0/Qz5APTk7Ojs8QD0+PDk5PEFBRUFGQTo9Oz9BQUJBRUI4PYqWlJOYmpaPiISNjpGSjIiIiI+JiZCRjoqKiJubmZygpaKlnqKjoZqeoZyanZ6bnKOop6ugoKOYoJ2XnKGjo6WjoqKkrKilqaCepqmnq6mkoKKhoqehpq6mpp2eaoScuo+m0KGZsahYTKyTU2WPoJ6goJ6doKOZlpqYo6KipJ+ZnKGhoqCbmp6goaSgnaejqrGorqusqaSqqquorKalrKqws6+rq6mwq6appaWoq6ynpqevq6Wnq6upq6irqqqrrailqKOmpaesqayoopykoaOmo6qpqKano6SnqKanqKepqKupoaKoo5yepqWjqKino6WlpqmgpJ6inpeYnZ+doqKlnpiUlZ6go5d1d2t2eGJfXFVZUVVXW2Nfc19oX2NTUVlUSD48PTg7OTo4NTM3MzM0Nzo4OT05Ozo5PDxBQEM9PT44Ozw9PEA/Qj86ODo+P0NAREE6Oz49QD9DQ0VDOTyCmJmenZ2alZKKiZGRl5GQh4SJgoGNj4+Sj42cnZ+hpKmlqaeorK2moqKfmKSmo6Stsa6yp6asm56em5qjp6Cfo5+foq+rq6yoqKuvqaiqqKKgoaiqrbGyr6uiooZ3fn1yz8mxm6eva1WqsGJah6afpaKhnZ+imJWem5+fpKGblZigoZ2enJudnZuZmZWen6Oonp2iqKGaoaOmoqSoqaqoq7CxqKWlp6eopKWpqaqnoqWmqKadnqWloqClpaOlpqCjpaOjpaelqamqpKekpqKmp6SrqaenpKGlqKynpqWlo6OopJWdo5+bnaCjqaeopqGjo6mooKiioJyVkZqfn6GmopuXkpCamqCVfHdvfXlmW1tgX1pcVVxoZG9jbWlpYl5QUEA/Ozo4OTg8OzYzNDMzMzc5OTs8OTs7OT49QkBAPTs9ODw9QD08PENBPjo4PT9EP0M+Ojk/PEI/P0FEQjk6gJ6kp6Gem5+gmY+ZnaCWloqGj4iEi4qTl5SRo6Wnqq6trLOys7S4t62pqqevtLKxqq6usbKusa2lq7OssbGpq6+rq6y2sLSwq7GysaOgo6qqp6+3t7S1trOtrq2PhoNuj825lZGjl3RUb3pzbnuVpqqno5+eo5udoZqWnqScm5aZoqefoJ+joJuUlpmWl5qfoJmVnqGZmJ2dpZ2gpKeqqaiqraylqaSlqqeqqaqsp6SkpKOimZmhnpqaoaCfpaWYnqSmpKqooqelpaGqp6mnp6ejqKWmpaGkqKesoqekoaalpaOVl52Ym5mVo6elpaSfnZ2lo6Kqo5+amZiXnJyaoaGakJOTl5ibjX93cnZ4amJbX19cYllgZG5ta25hX2RgUE9BQDs7OTs4Ojk2MTQzNjQ3Nzc6PTo8Ozk9PUI/Pj89PDo/OTo7PD5CRUA9OTtAQT5DPDs5PzlAQEA/QkM7OXuao6OcoJ2dop2Zn6KioJibmJaYkpSQm5qWl7S0rrW4s7S4tre0uLm3tbm4ub28uKqLnLK4vLS9urW7uru4s7q/uLe5u7G3r6iusq2inaCrsre7u7u5ucG4tLWgiHlkWZ+3wKapnYh3a3FveHh6fYaOkpicoqWmq6WkmKGko52goaKooaOgpaGck5mYmJmco56cmpudl5uZlqWam5+hqKmpqKuvr66pqKirrKytq6irp6WjoJyfo6Ojn6Cipammmpyip6Spn6GjoqKgpaanpqSooJ+ipKGjoqiop6OloaGopqalo5mbmJuTj6GknqKfmJiVoJuhpaCfm5udnJuamZugmo2YmZiTkYaAdnh4eGNbUllUX19hbWh2a3FoaWliWlNMQDw6Ozg5Nzk3NTU2Mjg1Njc3Ojw7Ozs7QD4/QD0+Pjk6PDk2Nz47QkZCPDg7P0NDRDw+OT43PkFCP0ZDOzhwkpqblJ6bm52Vl52doqajopaXnpaXl6GblJi+t7G4uba3t7i7l5S2vbu9vcDFtaK7mKC3v7+6wcm0nbu2sra/xcGooLa0urGqrrSxsLK0tbfBxszPzszJvrOkkHNmUkSLl4mJiH54cW5nZmxpa3FycXFydHyMqcTEu6Knqqynq6mlpqCnoKGmoZOWmJ2foqSjnZ6coaChnZekmpmdoKaqqqqtrq2tsLGrrK2sqamrrqimpaalpqSkpqaeo6eppKGcoKKjpqCio5+jpJ2foqWgpJyboZ6fo6GhpaSlqaOkpaKkp6ehn52elpOcoJiZko+MjJeWn5uWnJqdnJqSlpSUmJOQmp2YiouHgIB8gnhhXllTYWlhZnRvdGl0ZGlkYltMSz46OTg5ODg5NzM0NTI1NDY2OTw8Oz08P0E/QEA9Pj44OTs4Njc/OUJFQzw7PD5DREM9QDs9Nz1DQ0BFQjw3Z4yRk4qalZiblZWYm6Knq6aVl5iQlZmhnpeXvrWztLu6ubi5woeYt6u4u8DCxbOjw6e4s72/tMTHvbS7uL62wMTErqCworW2tb2+wcTHw8XH2+Pj2su8r6SXiHRZWlFDaXpsb3Vua2VlWVdeWFxjaWloZWBoibTAwLmpr7Gwr6yqoqajrJ+fpquXmqifpaWfoJydoKuwsKyiq5yYm6Cor7Kys6uorre1sq2tqaalqKulpaStqaShn6Cnnp6mqKmmnp+anqGlpqmcnaObl6KmmpuanZ+cmqGcmZ2eoKijn6GfnaWioKOioZSZmpmTj4qLhI2Qk5uPjpiVm5eYkJORkomNl5iYk4uKi32AgIVwYGJfXmtjYm54dXdvbVtiUlZcTUc7PDk3OTc5Ojc0NDQxNDM3Njg8Ozs8PEBAPUA/Pj8+Ojo5Ojc6Pz5FRUU8PT1AQkJCQUE7PDhAQ0NARD87NV+MjIaFlouUlZeYl5ifpqellpWVkZebn5ual7mxtrO5vLy5urWqsryxvsG0vMe5uLuuv6fGw7/KxsnIxcXJvMLHx7+xsKe8vL7FxMbJx8XGvs3R1cq5p52UhnJeUVRLRFtmXmRrZWFgaFlUWFJWWFlcWFp0mba7q7SyrbOtqa6vp6awr7Ktqq+zpKu1qaeopKCgnqmyuL61tbWqqaausre4t7apq7i8ubexr66noqOop6SfqKOfnqCZoZydoqSnp6GelJuaoKGlnqChnpajnZSQlpiboZqflpORlpSin5qenJudoZ6kn56VnJiPkpOPjImTkJefiZCWkZuUmJGRlZaDjJWXlpKLjIh8f4R/amZoYWtsZ252cnJ2cmdeYFxSSUU/Ojo6Nzg0ODw3NjU0MjMzNjU3PDo7PDs9QD4/QD48PTk5OTs6PDw+QkRFPj49QENDQkREOzo4QUJCQUNAOTJbk4iEjZGKi5GRlZCSmp2fnJOSmJSdnZqXmpW2sbm1tb6+tri1uLO8vMTEusPHwb+0s8XFxr/CzcfLzsvLx8HDxsfIysXExcO7vLzBxcHFxL/CwcfLyLeUdWVVUE9USD5ea15fZWJgXWRhU1ZWVVNUV3Kbq7CqqKqtrKmlpZ6pr6uyu7q4u7e5t7O5uLOurLO0qrC1ub3Bur6+vL60urm4u7qysbS8u7q7s7Oyp6Smq6uioaCdmpudmpyXmpuenJygnZaclpuZnZ6io52UnJCNiY6OkZ6bnJWNh5KLmJiWmpybmJybnp6cmp6UjpiYmpSRmZeeoZWYmpKXlJWRlJqYk4+TnZaSi5F+enx/dWtsbmRvbWlxeG95amlhXWdhUUZEQTw5OTc2NDQ6ODQ2NTMzMjY1Nj05OTs7PT47Pj49Oz05OTs7Oz89QUNBQkFAPEBDQ0NFQjs4OUQ/P0BCPzsyV5uQkZCQh4WSjo2IjZCTlZGPjZSUm5STlpqRs7e4uLi+u7C1sri2tbbAw8G+w8LAvru+u7u8xMzEzNDLxsa/xcfLyNTLysjGv7u7vsS+xcjGxsTEw7m4w5thSURHS0Q9W2ViYWhjYFtjX1dRTk9PVX+0uqyupaSjp6SgoKWZqrSxvsG+urm6uLW0srG0tLO6wL7Av769u7u9vsDCt7a3tru7sru+ubi3u7a3tKyoqamrpqijnpOampyYkZKZl5GRmJqXnpiWk5acm5+dlJOJiX6GiIyWlJiZkYmVkZeWlZmbmpaYl5idnpyhmJWZmZyYl5ybn56jnJ6WmJeTl5yZmZyUlp2UlpOJdnl6e3dua2lodlpnc3hzemdnXmRbUlhJRj87Nzg4NzYxNjk3NDQzMzM2NDY7ODo8Oz08OD0+PDo7PDs9Ozs+PkRBQURCQEBBQkNDREM9OTlCQD8/QD89MkyWmpaSk4yKmJCKi4yOkpKKiIaNkJiKj5CUl7O7tba/vb2xtrjBvby0uL/Bsbi3vsHFvbu8wsbJv8jOyMHEwcfKysbKxczIzcbIxb/DwMvNz8rGxMTEwsTBrYNPRk1FO01bX2VrZV9bYFlYUk1Uf6KqubWyrKmjoa2qrKetn6y0tL/Dvrm4vbawrausr7W0ur7Fv7u8urO5u7i5ubWtsLS9u7G/vLiytrmzubu0ra2orKyqqaeXnpualY2MmJSTi5WWlJyZl5WWmZKYn5mQiop+iYqKkY6Vl5OUn5mWkJSZmJmWmJOUm6GeoZiYmp2ZmZaenpibopqdnJuYmpuZlpeXlpyZlJyYfoB4eXZ2ZWZqamhea3BueXhjYmFgXlhXRkU4Ojg6OTc5NDQ5NzY2NTEyMzM0Ozo9Pzs9PTo6PTs8Pjo7Pz48QkBDQkJFQj0/Q0NDQ0RFQDk6QkFBQj5CQTVCkJeUlZmSj5qQjpKRjZSVi4qHjI2UiImPkpq2u7S8xsHEwr3BxcLAtLO9v6ywr7rDysPCvs3IxbfByMW/wcLIy8rCwsTJzM3Oz8zDx8bIycjIycfFycfIx8LGlmpYRz8/R15jYmpgWlhXU1V2mba+u7y6vKytpqm7urm3v7O1uLLAxrq3t8Gzsa2tqau1s7u2w7a2vbWxt762s7e4sLW2v7uwvbq0q7CxsbO8urOzrqutq6yxnaOjoJqQjpiXlZCclpaYlpWSnJmTm5+clpGUjpWQiYyQlZOUm56YmZKSnJedlJmSk5aZmJ2VnJ6do5yVnZ+TnKKcnKCfnaOemJSVl5ebmpmgkH99cXRxb2NhaHZoamp1bnlsXmRbVmBZTEhENjw5OTg4OjUzOjY2NDQxMzUyNTs6PD47Ozw9PDs8PTw7PD49P0E/RUFCQ0M+QEFARUVERUE7Nz5DQkI+Q0I4O4+akZaalJKUjZCUlI6VlI6Pi4yJk4uIkJObt8C6xsXEw8zCwcS9vrWvt7uvr7O6wMfFxMHMy8W2ucDCwsTHytHLwsPExsnFzNDNx8zJwsLHwsvLyMfMyc7Fxsa9qXJQSzBYU1VmYVNOT3CpyMjCxMbAvL60sbCwwb6+wcbAvre2w8K6urbAvrWyrKmvsri+tMC0tLi0t7nEua+8vrm+v8K/tbq2q6qsrq+wt768trSura2vtaSlqKimmpycnZyeopydmZOQkp2VmKCdmJiVmZmZl46LlH2QkJefmZmYk5GToI6Nko+VjpCUlaKdnKSem56elpyjoKGipKOkop6amZubnJ2enIN9cn14cGdga2p3bWlmdm90Y11jVVdVU01HOjc7OTk3Nzo3NDg3ODQ1MjM0MjU7Ojk+Oj08Pz04Oz05OTk9PEBBQEVCQUJBQT9AP0RFREVAPDk+QkNCQENBOjSAoZeUmZiVkImUk5aTiZGMlJGOiJaKi5CXnMXLw8O8wMPHwbm9vbu4tre3rrK3uLzAwsDCx8bHurzAwsTHyMbSycHDw7+/vsTLyMrLyby8yMfJzcjDyMnJxcXCw8LBvJE/T3Z+iVZMb6TL1MW2v7/Av7q7vbWzs8C/ub/CucG3u8G8uri7ub27srCvsKy5wri9ube1t7q9xb24xsjCwcLGwr28tamurrCwr7O6t7m2sK+tr7OppquprqannqSlo6OjoqCblZiekZecl5GRlZeZlZmRlJiSlYyYo5qcnp2FiZ+TfJKWlZKUlJennaCipJ+en56foaGkoqKjoaOinJ2fnqOhppl5enmAc3BmZWdkbGVia25vb19ZXVdWTlBKRjk5Ozk3Njc3NjM3ODk1NjEzNTI3PDs8QDs/PDw6ODo8OTk4Pj1APz9GP0JBQz89QT5ARENDQTw5PENBQ0RBQDozbKKdlZedlo+PmJiZmIiSjZGVkI+Vjo6TlpbKy7u5urnBu7q3vsG8vLu5sa61uri4u8S6vsC+vru8wMXBxsK+xsK5u8O6uLm8vsHHwca7ucjIw8XEwMPBwcDEwcK9vMWnd2uDkJhvqcjIx9HBr729uLm7u763tLG6v7S8vrG5tbi7tryztbm2uba5t7GtusG6vMG/t77Ev8bDw8fHwrvAwr/Cv7iys7O1tLGut7S3tbSxrK2xp6Wlp7CtqJ+nq6ajqKWmpqCgn5SYmZSRkZWUl5OYl5qhnZ6hnKGdoaWglpSbkZeXmJqTnpmZqaSlpKWdoqCanqCkoqOcoqGjoJ6cnp6ppaiVfXqDeG5mYWViYWNkZGpjZ2RbWlpdWVFPRT07OTo7Nzc5OTY0OTk6NTMxNDUyNzo7OkA9Pzw8OTc3Ozo5Ojw+QD8+RDxCQURAPz49QkRCQkI+OjlCP0FCPT44NVmfnJiTmZaRlZiYmpeQkZCQk5GTlJKSkpSUxce4tbq5wrm5vMPFwri7ubGxtry6tbnAu7u5tre0tLW/u72/ub66urTAuLW3sq66u7fAt7zKz8C6v8C8u8W9usDEv72+r3NlfZGLidHFv7/Jv7DBv7q3u765tbi0uLy1vbi1tK+zvLG3tri/tr25vb65t7q+u7/Axb29y8PGw8TAw762ubq2v7i7v7y4trOyq7CwsrWzs66sq6emnqeurauiqKumpqqjp6iqo5+Ym52bmpicnJiXnJuhpZ2anqGhoKGmoJqbnJiboJ+dnJ+coKiho6SknaKfmqKgop+el6Shop+dmpieqKWhi3x5iH1xZGFjY2hrZ2dqZmpeVlZUWU9TTEY4PzY7Ojc3OTs2NTo7PDYzMTM0MTc7OTg/PT47PDs3Njk5ODo7PUA/PkA9PT9CPjxAQUNDQT9DPTo2PEBBQDw9ODdJlJibj5OUkZWYlZGWkpWRkJGUlZSTk5OYlcHCwLq8ub62uL7EwMKxvbqytLO4vLW3vMC8vbS0sbC1t7W7wbi+ub+8vLe0t6+ut7W5v7vB1o23v7vDtbrHtrW4ury4ubaqo5iOf4PJv7+7wb65xr3Cv7zFuLe3tLi2try7uba0t7q1s7i8vbm/ucPAwLu5vLu+vcjEvcfEw7rAvb62sra4srm0usLCureysaysq62yr7Kur6ijpJ6rrKyqpKakpKiqoqemraihoaGmn6Oiop6bnKKfoKOdnJuhn6KgpKCem5eZn6GdnZ6eoaWkoaKioZ6ho5yinqCZnZijn52eoJqZoKKmnYR6g4F5cW1lZWdvamVsaFlZT0tLS1JKTEhEOT44PTs2Ojs5Njc8ODk4NjA0MzE3OTk7Pz0+Ojw6ODg5PDg6Ozs7PD1BPj09Q0E8P0NDREA/Pzw6Nz5CREE/QDg4P4mYmoyMkI+Tl5WMkpCakpGXmJaUlJKQmZTDvsbBwby8uLi6v7a8scK2tLyxtLa4s7q9v768sq2vrLGwt7y3u73BxLm3t7a1ubm6u7+8z8R3p8y9x7e5t622tLe5s7WxvMnDlUt6yr6/vr28v8jDxcW+x7i2s7W9uLi4vru6uby7urS3u7q5v7zEwL+5uri/ubvFxr3Fw8Kyur27sa+2uLO3s7q+wLm2rLGrrqmqqa2qqq6mpKWnrq2ppaOio6GkpaWmoqato6Klo5+ho6Gcmpyhn6CloaCenZygnaWgnpeVmZ2fn52gn6KmpaCknpybn6Ofn5mcmZ2epJyWnKOcnqGcppZ+f4Z8a25xZ3FrdGZjbmBcVUhLSkRKQ0NHPzo7OD48Nzs7OTc4Ozc8PDYyNzUxNjk8PD08QTs8Ojs6OT45Ojs9PUA+RD89PkRAPz9BRkQ/Pzw9OTc/QUNCQEI5Ojl3nJiLh4uQkpOWjY+TmpOQnZiSkY2PjpiSvbfHvsO+vbu+vL22uri9ure9s7OwuLi1uby7wLeqraSusLi7sr2+u8S2tbi1t7++xLzCxNavdH+6yM/CwLiutLS7vbe5sb3Dyo9DdM3Dwr++vbzHzMfHxMe8tMDBwL27vMDDusDCv7y2t729vcHBwL+8ube8wru3v8W7wr++tbe8vK+vt7awtLO6ubq7r6mtq62rrKaqoqeuqKWqra2vp6Sgn6ajnqKjqKOjq6Oiop6dm5ublJaZnJyfpZ6fnpmYnpejoJyXmZqZmqOjop6jo6egpqCbnaCjnp2WoJmcoKCblJegn6WcmKKQgYaBcWZsam91b3hkaGNcY1FLVUhFRUNHQzw7OTg9Ojc6PTo4OTs3PD01MzY1MDY4OTo8O0A9PDo+PDk+OTk9Pjs/PkM8Pz5APz4/P0ZEQEE/Pjo3P0BDQz9APTo4ZqGYj4uNlZKVlY6PlpmVl5uVjoyMjY+bk7m2wbS/vLm8w8C+wLq1trKywLmvsry8sLe7tru8qqqjsLm9vLK8vrzFuLG4ubzGycrCxsnSmnFyq9LRzMrEtbq/xMi+vrS/wMB5Um3LxsK+wby/w8zKx8XGwbnCusW/wL/CyL3Hx8bFvLrEv7vBv7rAvLu7wMS9t7nCub69t7S2uLqur7WxsLCytre0t6yurKqsrKuoq6Gms6qlra+trKippaOkp5+io6Onoaeiop6cnZyamYyQlpeZnaKZnpuVkp2UoaCdmZ6fmJimpqKfoqKmoqeloqCko6GbnaCbnKKfl5WVnp6kmpafiYGDgXRwbW10bG1vYGNfYmJOSU0/RUA/REM7Ozo6Ozo4Ozw6OTw+Ojo+NDQ1NTE5OTo5PDtAPD89PTw4PDs6PDs7Pz5DPkI+QD89Pz9FRUJBQj87Nj9CRUQ9QUE6OlmfmJOSlZqVmpOQlpeclZuZlpSVkZKTnZm2uLaxuru6vsG5uca7trWypb69tLbBv66zvbS4wbGwsbS7xNDDur68xL63vMC/yc/HyMrKwodyc6PLzMvNysbCw8vOwby4vbqxcGNiu8jEwMC/xMDKycPDw8O7t7TBucC9wsbCyc7Hxr66xr26v7m3wLm5vsDCvrW0vLi2u7CvsrK1r7Cvrqyus7CzsrirsbKxqrCrq6yrrLatqKyusqarrKmpoaWgpaakrKSmoaChnqGgnaCMlJeTm5+mmZ6emZOYnZ+gnp2eopuYp62ooqSgoKKqpqmhqKGlm6CgnZ2jn5SYmKKdpqGfm4J7eoh7bW14fGBxZFxfYF9UST5DRUlCQz5DOz42OTo7Ozs7Ozs7PT05PTU2NjIxODo5Ozs6QTs/PDw+Nzs8Ozw9PTw9Pz5BQUE/P0FCQUVDQkRAPDY+Q0RFPkJEPztTmZuZmJ6dmqCalpyZn5KdlZ2boJWWlJqYur20sLu8wcTCv8XGura5sqO7vbS3xLuwtbq2ucS4tLy3u7ur2sO+tr7Avr66ppypsrbDv6V6dniaxMfLyMHDwMDJysG/u7mxoX1zaq3IxcS/wMG/y8fDwMjAvayrwLO7u8G+wMrOysS9tby7ub+5ubW1s7/Avre0s7S4rbeqr7CwsrGvq6+nr7ausrG5rra2uLSzsLGttrS6sa6srranrLKsraSjoaenqLKrqqWkp6elpaCml5ujn6SmraKeo6KanaWiop+foaWenrC0sKSlnp+kqaevp6mgq6CiopqipJ2anqGmp6+psZWCe32Bem5zeXRocF5cX11aUkZFRE1JQUQ9SDs7NTk7Ojw8Ojs7Oz0/Oj01NDUxMjc4ODs8O0I8Pz46OzY6PTo7Pj0/QD87QUFBPj4/QkBBQkJFPjo1OkFCST9AQkA7TJqdnZ6fnZienZmampySoJWbnp+blZGRl8W+urbDvMbCvr/Ixbe1uLe2ubu0r7e3srWzt7m8u7a7u8S5bazOvba5wLyrfm5obmxygZWYc3d8l72/xsC5wLy+xcS9vbixsJmQfoCbysLDvL2/v8PDvr/Ivb+llcO0trW9vr7OzMzCuLK4uLe9ubuxtrLIwLu2tLGwt6yzqbCtrbS3r6uuqrG1r7Gvt7O6usC/tre2sru6wLWyrbO3rLC6r7KloqWrrK+5s7KosK+xr6qiqKGkraitrLOun6inpqWmq6Sknqaqo6ayuLOrpZyfp6anrquqpbClpaWbpKOYn6exrLW4sLKOhHl/fHdtdXtxb2pcYGFaVFFBRklHS0BFQ0k8PTY7OTk8Ozo6Ozo9Pzw9NTU2MTM2OTg8QT5AOz1AOzs5PD04Oj08QD46Oj49Pj09PkBCQkJBRD03NDU9REc9Q0I/PEWUnqCgoJyXmpiYlZmdmZ2fm52bnJaRj5LDwMK9wrzEvLy7xbu3s7e2tru7s6CWtayvsbS0tLa4ucDNtHaAs722tcKlh2laXWBNUltabnN3gJ+4uMK6s7u3u72/uru7rqSbmYiRfsDEw768v7u7uLbBwrbCoIGntqqwvsK60snIw7GwtLS1vLm+urq7ysO7uravsL2xuK+ys7C3vbaur66wt7CsrLK2vbzEwrq9t7bAv8G3tbC2srGzurGxr6err6u2v7e1qbqztbmxp6uop7ausrG1uaisrK+qr7CqqKessayytry0saykqKuoqKusq6i2qaaonqadmKOuvLG7wbSmiYF7gnpzdnd4bnJhX2ddW1VKPT8/R0c9R0NDOTo1Ozk5Pjw8OTo8Pj4+Pjg4MzE1Nzg5Pj9BPzs6Pz08Oz09OTs8OTs6Nzs+PT1DQT8/QUJEQkE8ODU4PUNGPUREPzw/iZ2en52Xl5WUk5aZnpubmpuYlJ2Uio6Owb7Dwr6+vrm2usCxtbGzt7fCtbOrrbOoqa61r620trnCyaiEeImgr7Wea2VmVlhfSUlNUFNsd4WlsLe+ubK1sru5vLa5vrSVnKeWoXCuycTAvb+5s66yvbuuv59yeqONk5yfpcPCv72sqq+tsrq3ur67wMXBu7y3sLXEtb+0uLu0u8PCs7a2sbisqaWrsr23v7+7u7exvL28trGvq6uprbOvsLCrsLSpuMC2sqm0tbC3tq2spqu7s660uMKwsbG1sbK1saywsri4ubi+tLGzrqyxramvrqqyuK6trainoZ6ptr+4ur+wlol9gHxxdHd0d3JtYGRiXF5PSUI/PUlERk1EQDc3NTs6OT48PDk4PT47PT86ODMyNTc2OD8/Qj86OD4+PTw5PDk7Ozo8Ozs6PEA+QkI9QEE/QkI/PDs3OjxBRD5CQz8+QYqgm6GdlJiVlZKYmpyWm5WalY2bj4SIhru0vb+7vLm3s7y8rLOytLS2wLXAr7Kzqqqxt62pubO3v8WriHx2jKCZYFRDV1ZIYWtWT0ZJYI2gq6+2urW0sqy8ubi1uMG9i5myo6ZypcvCv7m6ta6lrLOwprSheYSnl5GPkI6OmbC0paiprsG1s7K6tbu7u7W4trC1xLK+vL+8ubrFybq9vraxp6SeoamxrrW5trKxq7S2trGopp6gmaWmpKynq6y2qa+6sa2kpq2lq7GrrKmtuLawsrjBtrGxtbGvu7ayt7W1sry1urKwsbKutLKqrq2nuLWyta2uqqiosrq9wLa0qY6Ce393cHxvdnNvZF5oWV1eU09OQj9KQ0FLSkA2NjU7Nzg+Ojs4Nz4+PDs/OjkzMjc1NzU8PD48PDg+Pjw8OTk5Ozs7Pjs7OTw+P0E9PEJAPz9CQD47Njc6QERBQ0E/QUKJoJ2loJSWmJiVnqCcl5uYmpGMmYmDhoS1r7S7u7S1sLG2uq6wtLOvtbq1urC1s7KttrqvrbyzuLi/tZGCeIiPb05KP2NaQU53gJRrTUFcgbC1s7WytK+su7q4trm/xnaEqp+bZae/uLWysa2tn6Snp52nqrrFy9PApJCUl4KDoKCkpbzErK6nsKuvsbGtsa6ur7mwtLy+uLm4x8W8vLu4qaKcmJufp6assq6zqaapqq6popqXl5GcmpijnqKir6ekrKaompqemqGnp6anqa+2squ0trCqsK+xqbm2sbWxrqy3s7avrquuq7S1ra+rq7GtsbKoraurs7W3ur2wq6GLeoJ5cnZ0bXZqbF1ca1VeXFBOSERHTUJHTkc4NjY1OjU6Pjg7OTc8PTo7PTo5MjM2Nzc3Pjs9Pjo6Pz48PDw6Ojs5Oz47PTk8Pj1CPDtAP0A/QT8+OjU1OkBFQkRBQEJBiJ+ipqGYm56dmqWpmJudmpmUjJmHhoeGrq2uuLmxsqiur7iyq7CwqrK1ubm+tbK4tLm6trm7tbWzt7aVjIiEe1hGQU6GWkpKWHaNgGNAUqK5s7SysLGtsLm4tru3ur2QorKspHOrsKmrraujqKCdnp2YmM7m4eHf1cankYl5bXGXoanBpqiooaanpaqtp6ynqKesq6yyu7SztLm6trK2ramgmpaWm52fq6yqr6Oko6GpoJuTjo+QlJKSmZaanaSloJ+ep5iVkpSZnqSjoaWqrK2iqaqppKmtrqW0sa6xrKqprq+wraWmqqSos66tq6impqmrpqqnq7Ksr7Oxq6mWgX+Bd3J5aXV0b2VVYmRYXVJPTUlASVJETkM9ODg3NTo3PD46Ozw4OTw7Ozw7ODI0ODk3ODs7PDs4PD0+Oz08Ojk8Ojs9PTw6OkA9PDw7QD5CQEE/Pjk1ODs8RkFDRD9BQYijpqKjnqCfp6Coqpufm5yZmI6Xi42PjKqpqLGvsK2lp6ayr6mmq6CvsLu1vby4wMG+vLy8ua6sr7G7qpmZlWlOQFJ4cVBJSUtnm4FZRVGtu7Gss6+urK22trK0ta6ppp+am52fpqieoKipn6GnlpuWlZvbz8bGzM/Mv5t9bGple6XGqpeiop+fpaCkrKWmqKSio6OrrLOuqa6urqeqraisoZyamJmYm6qoq6ufpqKbo5yVkIyPkJCTkJeVlpifnp6amaaXk4+Slp2ioKWipqSnoKKko6Ghq6uksq2qrKyno6yuraufoaKkpK+srKmmo6KqpKqppKmrpqmsq6ahiHmDfHZ/emN4bW5cUWlVUE9HUE1NQ1BSQD47PjQ6OjU7Oj07Ojk9OTk8Ozw8OzkzNjk5Njo7Pz06ODs6Pjw6PDs5Oz07PDw9PjxAPT88ODtAQEE/Pz45NDk8N0FDQkQ9QEOOqqSjoqGinaqlpqimoZ6dmZ2PmJWTkJWnpKGmqKmlpKChp6uhnKKbp6u1sry9wMLCwL7AuLSnpKyovMKrpL5pRVKcglFXSUlfS1OOYGNigK61qrK0rqqrr7Cys62lnZGXk4+YoJ+ioJyjpJ+dqJOZlJOunGNykLTGx8erfGlpbmaUtYubnp+hnKGfo6innKehoKSfrKisrKCpq6agpKimrKOenp6al5qrpqqxo6WonqCclpOPj5KRmZCWlZiXn5ibmpukmZeUlZqdoJ2nqKWgo6Kho5+coKmqpa6upqipoaKqrqqnoaCio6msq6eppqShqaKlqaalpKKmpKijkn59gHV2fW5se2RoVlNkTkpIR09TTktOSDxFQD0yQDg1OTs+Ozk5Ozg6PDs7Ozk5NDg7ODc7Oz48Ojk8Oj07Ozw9OTw8PD49PUE+QEJAPTc6P0FCQEA/ODU1PDpAQ0BEPkFGlq6koqWeo6KpqKipqqWmnp2imJiZmZWbop6bnqOioKOgoZqgmJeXlqGorK62trq5ure3u66ooKGpoarGv8qhUEFynnhPbktLYmV1c19aXnCPsa+us7Wqpqyso5uZlI2RlZeYmJyfoqKcnaSemqSWlpaXoUstSFqIs8LBq4Bxg4mDeH2Uop6fpp6dn6OmqJ6jpp+qnaqtqq6nqLClo6Smp6ymoaWim5mer6iusqumq6qgm5iYmJWTlpqTlZaalpuXmJihnpycl5uhm56ao6eln6GioqOdm6Gmp6aoraOppZ6kp6mkpaWhpaSsrKmmq6eioKSjpKenoZ+gpaKmoIl8gH53eXxleXlhYlNWYUlJS0xTVUpTUU05PkE2Nz02NTs6PDw5Ozs4Ojw9Ojs4NjU3OjY5Pj0+PDk5PTk9PTw+PTs7PDo+PTw/Pz9APT03Oj5AQEA/Pzg2NT08PkFCRkBAR6CupKaroaOqrK6tp6ypqKCipp6bm56aoJyalZmfn5uen56WlJOXk5KcnqSorq2sq6uvqq+pnpeepZ2jx8ePV1NJZKNcZX5vcl1Qa2NbZF9da4+0sLC4rKahnJ2alJiamZCOkZWRjI6Nk5minJeimJmVnIRSa39pYJSvrp6DgZ2eo5p/qqqlobCjmqOmpqqioaqiqaSosquxsqu5qKarp6urqKysp6Ggo7GusrG0qrKvo5mcnZ6hmJubmpiZm5WWm5aZnKWhoJqjoZqdmZ+kop6gn6KmnZulpqWkpaiip6OepqOinqaloqWlqKykpq2noJ2eoJ6gpaGenqWgppmBe4F8dnZzaYJtZVxTW1pNUktPT1ZNVE1CNz5DNzg9NzY6PDw9Ojw5ODo7PDo7OTc2Oj01OTw7QD03ODs3PTs9PT06Ozw4Pj09QD5BPj4+ODg8P0BAPT43NTg9Pj1BQEZAQUihqqCrq6GkqquwramtqaelpaWkoKGfnqWXl5SYmZ6YnJ2blo+VmZKRnJihnaqip6Cep6Gln5ySm6KanqukjXpVaHJ1dXFidnZYV2NgY2dZWFdlrK6sr6efnqKhl5GUnKCcmZiSk5+coaOanpqWnpmdlph8a5Cii15wmZiPi42eo6Wnp7e1sKazrKGtraOvpaSmoamorrWzsr22vrCssa6tqaq0sbCoq6iztbizuK2ytKSgnaWgrKGhoqGgmpmWlqCcm5iloaCeo6Ggn5ucpaCfnZyhqJ+fp6meoaOkoKagnqehn5ymo5+ipaOooKmrpZ+dnZudmqainpyjnqeQgYN/fHh2and2Xm1bUmFJUlZIRlZXS0NNSD1LSThGPDc3Oz49PDo8OTg6Ojs6PDk2Njo8Nzs+PT8+OTc9OT47PEA8OkA6OkA/O0A+QUA9PDk3Oj5APzo+NzU4PT0/QUBEQEJGnKueqamipamorqimqqWmp6aoqqGlpKOmkpOVmJacmpqcmpWTmZuNk5+ZqJ2un6eenKGdnpqZkpiem6KhoKSAboJwYGNYTFtTWk1MUFhSSE1NR5esqqmloJ+akZKUmJiWlpWMiIuOlZ2cnZyelp2YpZ+RgYCzysqTYoOFho+IlaCjoa68vristLSwt7CutKmmpKWsqbmztbvDvMPBt7u2q66xuLe8r7OwtcG8t76zs7WirKKpqbKpq6inqJqZnpqqp6CZqKCfn6iopaWfnaqiop6bn6igpKetmaCjnp6nnqCmnpycoqGbo6KhnZympaWkn6KZnJukn6CboJyjiYaFfnZybWl3bWhuXVhbQ1dOSkdNSENGTj0+TD40PDo2Oj0/PDs6Ojg4PDk6Ozs8NTQ6PDg5Pj4/Pjg4Pzk8Oz0/Oz1BPTo/PjxAPj8+Pz08Njs/QT07Pzg1ODw8QERCREFCQ5WqoKapo6mqqKmjoamgpqinrK6lqaWpqZSSl5mUmpqanJiYmZyamJmqoLGit6Swpp+enZ2XmJWZnpuco5+dimJXXmVgV01RRz4+P0NDPz5CUXioramqpqCen6Gjnp+em52clJOVlZ6emJSFnZmfmaqljX6BsNTSsXRhc3uDeI2WmZWlwMC+tbm7wMO5vbusrqexrbHCtrjCxsDIysDKv7C5ub24wr64tLvGxL3DvLi0qrOtqrO0r7Ouqq+jnqyot7Kto7CmoaOwsa6wpKWuo6GgmqGmoaSqqpmdoJmao6CmqKGcnqKemaSenpiYo6OhpJ6mmpuipJ6fm5ubnIeGgXx0cmtsdXJxaFdcUUZVSERKUEk/RUI0Rkg5Njw+Nzs8Pjw8Ojo4OTw4OTs4Ojo4Ozw3Oz49Pj02OEA5Ozs9QDw9QDk3PDw7Pj0+PUI+Pjc6QUA+PD45NTg9Oz1DQEFDQkGRqqGlqqelqqimn6KnnKasp7Gyq62jqayVkpWalJecoqGbnqCinJ+psqu7sr+rr6ylnqCgnJyYmp+gmp+flX1gXmVgUUdEPUM/RTw/OTZOf6qzp6SjoqCepaymn5idlZKanpmVjIqGiIZ4bIafoqGprZB9cKTVlHuHS1pwdHGCg3p4k73Iwr/EyM3QyMvDsre1vrK+xbu+zM3GzMzM0se+v8DCvcfHwrjEysnEwce/urS6u7W7t7C2squ7sq67t8C7uqu4rauquLu1vK6uuKOmo56mpaKjqaaZm5+Zmp2nqqegoaGkmJSjlZSZkZydn6Sep5+en6KdmJmUmJSIhX56cmtkaW94a2ZaXEZMTUVEVE1FQkU3Oj87NTQ5OTc5Pj87PDs7OD48Njo9OTw9OTw9Ojs9Pj4+NztBOj45PT45PT44Nzs6Ojs/Pz1CPj83OkFAPTw9ODY2PDo8QD9BQUE+kqugp66noqulpKKipaGlqquwsq2upKmmlJWWmpaUm6SmnaGqp6KrrLy8v8PBsrK4p6Ghq6qhnJ6hoZ2bmn1zamFXTkU+SVl8cGJCPVyOrqyhmZucnp6Zl5eYk42Pl5eUj42QjIKDgnZycGxvjaSrrq6OhWaDqH98dl9iYGRpaGNbUnbAysTEy9DS1c7Tyb3Av8O7xsXIxdHTzdPQ09PMysHGxsbKyM+/ydHNx8bJxsK9xMG/v7+1vrOtv8DDxMjFyMSvv7myuL3EwsG7vLy1rqenrqigoqmlmpagmpmdqKupo6SknpePm4uQmYmVmJugn6OdnZeempOTi5WPhYF5dXNlYmdyb2dfWlpET01DRlFJRENBNTU1ODlCPTY4OkE+Ozs+PDk+PTc6PTk6PDg8PDw7Pz8+PD0+Qzw7OkA9Ojs6Ojg4ODk7QT48QD8+OTtBQTs7Pjc4Njo7PkI+Q0FAPpOvn6ivpqiro6KloKampKuoq62qrqKqo5Kcl5ebmJuirJ2frqalsarFxszOzb+wwaikqKytqqCdo56bnZZrZl1USURAP0uFnqWahKCyraOenJ+amJeUk5SXkZCQjYiEhImHg4CBgYB5cXFuanaitrKXdH18enp+eXuShGVcUGxpWjxuzs/QxM3U1djR183Gx8nMw8XKz8rS19LX0tXW09TIzMfMzcrTzc7TzcbJysvCx8zHycnGv8Ozs8jFy8vMz8fKv76/vcHHxczMycnAw8CusLOonqKqo5qTnpyYnqaprKSlppaXipWFkZSHkpKSmZualpiQm5aQjIaRi4B7cnV2Z2Nnd2plV1hSRE5HQElRQz5CPToyMkE8RTw3ODxCPTs9Pzs7Pj05Oj48Oz44Ojk5Oj86Pj1APkA8Pjs+Ozk9PTw5Njk6Pj08PEA/Pjk6QEE6OT44Ojo6Oz4+PEE/QT6QrKKiqaanqKSfop2qqKOso6OnpqyiqZ+To5iWn56dpK6bn7CrqKyxyc3U18/Gu8esrbO3rK6jnqOinaGdY1NMSkRDP0JSrdG9sq+mnJycoKShnZqUlJWUin15cWxlYmhycHJ7hYqAdXBtcHJthKSZhmV8eHd/j5eckGloZmSopXU/pNjP0cLP09bY1dXSy8nO0MvGzdLK0tXX2dbY09bYzdLKztHMz9HN09DAycjLxMzNzM/PxsfItsDLwNLNzNDHysnAxMPIz83Q0c/NysjNuLe7qJ+lq6eemJ6jnp2qpa2pqKiSlYiQhIyRho2MiJOVmZCWjJiSj4aHjIR9eHN2cGNhZXNjXVJcSktHQUZJSj87QTg+NTU4Njs4Njo8QD07Pjw7OUA7OTo8Ozs8Nz09Ozo+Oz08Pjw/Ojo8Ozs5Oz89OTU7PD48PD0/Pz46O0BCOzk/OTg7PT0+PzxBQEQ8hqugnKegp6Oim6CbqaSlqaCfoaGmn6ifmKSimqmmoqarmqOwsamotdDU19rSx8bLtLXBxbG1qKGlpaCio1tJQEFEQUZQdbGvppqUl5+cmqCgnpudmpWJd2lkYV9gYF9eX19dYWx1c3BvbmtwbnKEkIZeX15ZV3GDfXxcU3FVireJY8/V0tDM0M3T19bT1dDP0tPRydPRyNDX19jS2NLX2dTWzM/Pyc3SzM/RwMfEycfPztLR0sjMzcDLzcbUz83PyMXLx8fJzMvU1NHVz9LM08K5xbGlqLWuqJuoq6Wdsqiws6ysk4+TjoiKjoOPi4SQjpmNk4+Zj4+ChYx8enFzdG1hY2ltX1ZRYEpKQ0ZDU04/PD40Mzo9NTI4NTU8PEA8Ozw6OTpAOjg7Oj46PTg+Ojo8QD08OTs9Pzk6Pz07PTw9PTo2PD0/QD08PT0+OjxAQjw6PDc0Oj48P0A9RkFEPYKknKClnqWlo5mcnaSeo6OfnZ+doJqnnpyhqZ+vraqqq52lrreoq7fX1NXZ2dHO0L+8zMm2vq6nqqiho6xnQzg9PkRYgqqon5eVl5manJ+dmJudk31xZWNiX19hX15hYF5hYF9gZW1wcG1qbW9zdIZ+T09SSlFve2x+bFNyWpKsgpHQ1dTQyc/M0tbS0dbNz9XV0cXR08rQ1NXWztPR2NfX18zIzsTKz83KzcDKwcnKzs/QzNDOzszP0MjM0dHLzsvDysjKzcvM0tPO1NLR0NDKvci5sK67ubWrtrCtqLits7+7sZqOoJSRjo2IjpCFkY2ZjJGRlY6RgIWJenZvcG9rYWRucGFYXFtJRkZFTVlFO0A9MzM8PDg3ODY1Oz5APTk8PDg8Pjk8QDtAOj04Pzk4Oj88PTg7PkI6Oj08OkE9PTw6Nj08P0A9PDs9Pjg7QEE9Ojw4ODs+PD4+OkVCRT6Bn5mlp6Cgo6eam5+cl56eoZqdmpyappufpKefuLa1taykrK6+tLDA2NLX2tzWzs3Kw9LPwcGxqaytqaSyfEhGQjtWjaGblZOWm56enpyTlpeUiGteXl5hZGJgYGFhYGBgXl9fXlxibXJubXFxcnJ2cVRPTk1cYXVmeoV2WWeDjHSezNLRzcbOzM3Uy87SzMrW1tDM0NPLzNDS08rO0dXS1dbKwMrCxs3DycrDzcTGycvLz8vOzdHO1MzHydDNycfLxsfCxsrMztHRx9DPzc3M0MXHwbi5vcPCvcO5srK+sLvDw7WqmKWhmJaRlZWSi5SNmpGUlI+PlYKJhnlxcmttaGBgcWhZWGhWTUdNSVFRQjtEPzs2ODo4Ojs1Nz09QTs6PD05PD05PT06Pjo8ODs9OTtAPD47Pj5BPDk9Pj1CPTs3NzU/PDw/PDw7PDw4O0FAPDo8OTs7Ozw9QTpFQUU+hJ6bqK2epKSqnJ6fmJKXm5+am56ZmaKVoamppcTCwb+7tbKxx8K4ytXW2drb2MzMz8jW1cTCta+0qKCtl3hsb292j5qNjJeVkJORkZWWlZCLe2ViYmJgXV5hY2JgX19gYWFgX11bXWdxcW9wcW1pbXJxXUpDTU5dW2BxYkhdb2dWkcbNzcbExs3K0cfKzc3F0NLPzczUysfKzs/Hxs7Sy9DPxbrEv8bKvcPHyc7Fw8jAx87IxM3LzdDJxcXQycbCxsnFv8HIzczMz8PKzMnHzNDExci7x8PJycLPwL28v7DByca5vaqwsqelnaKcmJCbkKOZl5mRlZiJj4J4b3Vka2BeZnFhW1dgR0lIR0lNVUc/Sj02NDM1NT09NDg9PT06Oz08OTo7OT89OTw7PDg6PDo6QD1APD09Pjw6Qz48Pz04ODk6QD4/Pjw7Ozs7ODo+Pzw7Ojc5PD49Oz49RkFDPYOgm6qupa6qq5qdoJeUjpedmpmgmpqcm6WysazJzcrIxL68uczMxtDV1dja29jQyc/P0dPIwre7u62ktn5ngoahqZONjZaPhYODg4F9hIR/c19bXl1eYF5gY2RjX11cXl9gYF9bWlxha3JwbW1oZ2lpd4NgRkRIR0I/TUxRVGdeTpe9x8TAwr/Cx8nIyMnHv8TLxcfKzMnEwcrJwcHLz8TLyL+5wbzGyL7Axs/LxMDDu8rHyLvJxsXKwb7Cy8bFxL7Gvr3BxMbMxsW8v8rDxcfSxcHJwMrKx8jG0MPDxsOuxMvHw8q3v7y6s6mspKWYn5iso6Gmm6Ogm5V8d3N1ZmpbYW5tWlxYUkRMR0NHRExERlM/NTQzMzVAPTM6PDw7OTw8PDg7PTtBPTo8Ojs3Oz05Oz07PTs6OD4+PEI+Oz88OTk7Pz07QD48Ozk5OTk6Oz06PDo2OTw+PDs+O0NCRD5/pZypsqm0rrCdnp6YnImUm5man6Kfmp2ovri8ys/RzMfCw8bNzs7M1c/V2djZz8vSzc3OyMG1w76ysLZtXnp7nZGKkpaGeoCEhX91eHVycF9aW1xgYGJjZGRlZGBbXF5dXl1fW1laXGFucW1pZmdraGx+cVtNSUc4Rj9DU0pUZFiUr7+4uLu5t8DBwcO9vbi8vrjDycTGwbzGv7e6w8i/wcm7tru7xcO/vMLOw8a+vrXBvsS7vce8w7q1vcbEwsO3wLa2v7+8zcS9trrIu7++zMTCxsPGycfJxtDGwszHssfJw87MwMXCv7yyt7Cyp6ioubClrbCqrayUend4a2VoYGhvZFZeWUpGSkZIS0FFQkZKQDk6NjU4ODUzOzo7PDk8PDs5Ozk6QD46Ojw6Nzo7Nzo7Oz88OjxAPUA/PT8/Oz07O0A8Pj4+Ojk5ODk3ODo8PDw7OTo8Pjs7PjpAQEU+fqygrLWrt7SyoZ6fl5qNlJaan52mop2et8XCxMjO0srKysfNzc7RyNDG1dTV183Kz8XJxcfBusW9rK6nYGN3gJKLiIuEeH+Ghn99g3t0dGNcXF1eX2BiY2JiZGViXVxbXF5cXl1aW1xdZ3Jva2RjaWlrdIFtWEtDTlc5Ok1GSFtUlaKzsLOysrKyurS7sLavs66xusG7wMS7v7q0sbq+wLjHuLS8tsHCvbi9xsHDu7Wvs7W7v7TFuLu1rLm9vsC9sbu2sLe6s8a9t6+8v7W3tcW9vsPFwMTGxsfMxb/FxrvHy7/PycfDxcHDt8O9vba5vse/rLW7tbe2jnl0eGdnZWJrbl5WXmBGS0hISkdCREFERj89OjU2NjYzMzs6Oz06Ozs6Oz44PEE9PDo7ODc5OTk7PDo+Ozk+Pz1APz5CQD1AOjo+Oz89PTk6Ojo4NTY7PT48PDo7OT49OT86PEBAPIi3pauzsby8sa2foJmUlJiXnqujr6qnpMbLzcjFyM3M0MvNyMnIysnKxNDN0s/NxcfBxcG/urjJt6uwmltnb4iOhYiJenh+hYZ2d4F8c2hdXV1dXmBfYGRhXmNlY19eXFteXF1eWltbXV9rb2xmY2ZoaGp3e19PUVlFOThGSURKYZ+XpKeuqqiqp7KstK+xp62mq7K7ubXCubm5r6q0ubuzwbqvwLG9vLu1u8e5w7etqqiwssC2uL2wsaiys7W7vKuutqeutq68srCquLCuu667uLvAwb66w7/Gw8XAvMbBx8q4xcfFv8fDwrnExsK7xsnMy7O5wr27s4l0dndraWBibGlZV1dbQUxMTUpFQUM/RkE6Ojo5OTY4NTQ6Ojk7PD07Ojs+ODtAPD05Ojc5Pjk7PDo4Ozs6Pj45QT0/QD87Pjo7PDo9PDw4OTg5NzY4PDw9Ozw6Ojs+PTs/Ozs+QDyKwKuouLe5w62zqZ2ZlJaZoZymsLWxt6bFzdLLw8XBxM/GzcHCxr/ExMPDysLJyr/AvMK6s7W1w6+qsZNbaX6SiI6Pe3h9iYV5e4SAd25eXVxcXV9gX19kY2JkY2JgX11aW1paXVpaWlpcY21tZmRkZGZnanpsT1pbREA7Njo9TYqakZSfpKqhpqGpqKupr6KlnqmstLWwvLivtq6nrbe0s7u3s7yvuLm1srvBssCvpamjq7Gzs6i9qquoq6yutbSmqK6hpbCps6enqK6mqLessbO3urq7sry+vr7Ev7XBwMfIt76/xbfFw7+7v8TCvsTIzMq/v8TAwKmHc3RzamlcYW9kV1ZYUEhaU1NLRkZFPj9AOjc4OTc3NjQzNzo5OTo8Ozs8PDc7PTs7Ozw4OT44PTs8Njo9Oz89N0E+P0A/Ojw8Oj05Ojs6Nzc3ODg3OTw7PDs5Ozo8OTc5Pjw+P0E7jMKvrry3ucSwtrCbmZWcmKqpsLGztb2vxdDPzMPHubnLwcu+u8m2vcO+usq4wcPCtba8trGvtbyuqKuTY22Ig4eLgHp9f354dH58c3dlX11cXF5fYF5fY2NhYmBhX11dXFpYWVtbWFdZXF9lamRiY2FkZGhtd11MSlZWUVE+QnqdkY6HmZyloKCeo6Olpayem5qjpKuxrra2pq+rpqmzq7O5sLW1rba5srC6urG2paCloKaxqKypuaqlp6eop7OtoKemn5ykpayfn6ekoaGxra2ssrWzs7C1vLa7wcCyur7DwbG5ucKzwL3Atbi7vb68wsfEw8S/v8SghHhxbGJmYGtvYFVZX0hOaE9USEZLRjw9QD06Ozs4MjY1MzY5OTk7OTo6PDo3PD88PDs8ODg8OTw6Ozc4Ojo8OTg+Oj89OTg8Ojs+OTc3NzY3ODg2NjY7Ojo7OTo7PDg1OTw6Pj5AO43Itba9uLrBur22oJ6VnaCmurars7O7s8TPycvCxbi3x8DMv7jKt7vFuLPFuLO/wKy2vLKspq+0raGjkmlyhoWGgHx4dXNvbWppaXBpX2BdXFxcXl9fYWNiYGBgYF5cW1xcWFlYWFhWWFpdXmNiYGNjY2JlZmtyV1BgZ29qWnyPloyLgpaanKKanJ2ho6GlnJmhmp2prqywtKKoqKmrq6S0uKy2r6yytK6zta+wqp+en6SisqSmqritoqamn6itqpmfn56ZnZ+lmpmjnJyesKmsqKqrrK2wsrivuLm7sLa8u7qrs7K5s720t7KxtbW/tb3AvcPCu7u9l4R7c2xfZV5kZFhUV15JV11LUEdKSkdBPD8/QTs/PDA1NjM1Ojs5Ozg5OTw8Nz4/Oz07Ozg4PDg5ODw3ODo7Ozo7Pzo9Ozc4PDo9PDc0Nzc2NzU3NDY2Ozc5Ojs6ODo5ODo7OTo8PzuJyba4vru4wcHBtKSkmZqkpsCyr7astLfFz8jIwMa7u8PDz765yLi4v7eywrSxu7usurqxop+pq6eYnpBtfoWGf3hybW9ta2JeYmZmXV1eXV1dXF1fYGFiY2NiYV9cW1taWllYV1dXV1dYV1pdYWJjY2JiY2Rkb2xldHxvSk+CkJSKjIWTmpujm5eZoqSgopqdn5mXrKusrbCgpKGsqqahtK+wsayor7KnurOmtaCin5yjoq2joqq2qqKjpp6mpqOWmJ2XmZqdoJqXnZydnK2hrKijpKatq7KzqrWwsquyubWvqq+ysrO3s66pra6xt7G6trq9v7ezsZSGenZmX2ZfW1lWU1pVS1tRTEpFSEtJQz0/QkJAQToyNDUyNDk5ODk7OTo9PDY9Pzs8Pjs3Ozs3Nzc+Njo+Ozo4Oj07PD06Ozw6PTs4Nzk3NDY1NTQ2Nzg1Ojo4Ojk5PDg3Ojg5PkA6gci9uL2/tr68v7KdpaOYpbHDtba9rbS4wszIxr/FtsHAx863wMO9s7m5ssC2sbm7rbK1r5+apKqglJuQeH+DhH94b3F0cWhlZGhkY1xcW1tdXVxbXmBhXl9fYF5cW1pcWllYVldXVlhXWFdVV2BiY2FhYmBgZGZxcXZ5YD5MYHKNiY6IjpiXm5mSnZ2moZydppuamKmkra6pmqGitqign62otammp62wpLewo7ego5yZmaqmoZqtua+joaScoqCfk5WhlJaWm5mYlpeclZ+pnqqkop2jqqqwrai0rKqmrbKwpauts7GwsK+vp6insq2xtLC8tLq3rqOUgnp3ZV9hV1lYU1JUS01eTFBMR0hNTEU9QD49Qjw7NzY1MzQ5ODg5OTo5Pjo4Pj47PTw8Nz49Njc2PTc7PTs5Nzk7Ozw+OTk6Ozo4Njc2NTQ1MzEwNDU2Nzk6ODo5Ojo3Ojs5OT1AOnbAvLS5wrG+t72tnaenoqq7wL3Aua60uMHMyMXCw73FuMjMssHCwa68u7W7vLW5ubCwsaqcmqGqlZGKi4CAfHdxaWxydHBoaGVkZmFcXFpZWlxcXF1eXVxbXF5cW1xZW1taWFZXV1ZXWFdXVlVaYmJgYGFfX2BiZ3BvdFIxLCk/eI6OiYyUmJaakZubpKKgpKSdm52knamtpJ6gobWmoKCip7Khpaelr6Wxrqu1nqCdlZWpoaKUrbGxn6Kjnp6Ym5OLoJORk5iYkpaYmJeep5unoqKapKWlq6SlsKeloqusraaprq+vq6iqqrOmpquvtLGuvLaxsK+fknt4c2ViXFtdWE5MUUhSYU1WUE9KTk9FQkQ/OT02OTo3NjQ1OTk7OTg4Nzs4OT0+Oz47PDY5Ojc7Njs3Ozs6ODU6Ozo7OzY8Ozg4NDc3NjMzMjEuLzI1NTY7Ojg7Nzg3Njw7Ojs7QTh4u7uxtb2wvLG3rJ6lpqy4u7zBxbqyubXEycnAwsbFx7bGxLPBv8Wrt7e9tr26u7WyrK2omZmgpIyKdImIfnZuY2FmaWhmZ2lmaWxgXVxbWlpaWlxdXFtcXl9cWllbWVlaW1dVWFdUVFZWUlRSVF9fXV5fXF1dYGFob25JKx8pRW+TjYeKjpuTm5KXm6GeqaKhoqGhoJqnqaKYnKKwqaCgnKSpnaeinqysqqmtraKhoZWYopqcj6uosJyfop+fl5mTip2RjZKTlpCYmJOcoaOcpaGilaCipKWbo6uloqSqpKqtpa2yqaalpqa1pqmorbO1tLm6r6usnoxzcXBhW1dWVlJHUU9IWlxPUkpUS1NMRUdKQzg7Oz08OTY2Nzo5Ozo5NzY5Nzc6Ozo9PDw2Ozw4PjU5ODo4ODY1OTo7PDk3Pzw5Njc4NDUyMTIxLi4xNDI2Ojg2OTg1OTg5ODk7OUA5e7W0rLS7srCrsa2dqKevubmzwMi6tcCvxcjMusHJzMi1yb2xvsPJrbG4wbW8wLy0taqsppaanJyJgXKIg3t0aWlqbGdqbG1ramxlXVxcW1tcWlhaXVtbXmBgXFhYWllYV1hXVFZWVVRVVVJSTlBYXFpbXFxcXVxfYmtqSjsvPUlch46FiYmTlJyWlpukpKakqaSnpKGWo6uik5ejraefm5ian56umZyqs5+lpp+jo6GUlJuWlpKpqa2anJ+hoJuUkIyZjYuRjZKNlpWQnaGgo52co5WboaOhmKKoo6Koq6Crr6SuuKWjpKKsraqoq6+0t7K9tbOrrpiFdXRpXFlZU1VSRlhMUVtYTVVPUExRUklPSUI9Pz9BPz03NTc5OTw8OTc3Ojc5Ojs8PT47Nzs7Oj02ODo7ODk3Njk4OTo2Oj05OTU3NzU3MTE0MS0rLzQzNDk4ODo6ODo6NzQ4PTg/OX6zraeztq6oqK+um6morLe2rLzKu7a/rMzGxbjAzs/Hs8S7t7vCyLGtuL+3vL67s7amqaCWmJmXiHp0gHZ3bm1obW1tcGdnaWZkXVpbW1tbXFtZWltcXF5fX1xYWFlYV1hXVlVUU1VWVVVTU05QUFhZWVlcW1pbXV5jcGxNQk90bGuEgIuHj5GamZWapqSiqqilraKllpypnZOToqelnJePjpmdrZaYp6qYn52UpaCekpGSkZOVqKqlmpiZnp6WjoyLk4WIjYOPi5GVkaCeoaSZlp+VmqGinpSbpaWoqKigsLCnsb2nn6OstKqup6+0sLm1wLGusKuRf3N0YldUVU5SSkdWUFJSTExYTktMT1NHTktBQ0ZEQz5CNzU4ODk7OTo3Ojo3PD06O0A+Ojk7OTo/NzU5Ojk4NzY5NTg3Nzk7ODU1NzY2NjEzMjAtKi4xMDI4Nzc7OTk7ODk0ODs4QDh/tKymsbeqpaKxq52qp6mysKS2xrS5urPKxbm6wcvQyrG2uLy9wMOxsLG3rrS0u7O0o6OdnZiXlYSAdmtnbG5xbnFqb2tkZWdlXlpZWllaWlpaWlpaXFxdXFpYWFhZWVdYV1VVVFJTVVNWVFFNTk1SV1hZWFhXWltbYGlqZmxkdXZhe3yLgYyLkJSSl6OWm6ajoqibpJWdopiQjJ2hmZaWhYSRmqOPlaOclZaVh6Kam5OMjoqQmqWnm5WVl5yRk4iUjouBi42AkIuSkpKhmqCilpSZmJWippqNmaWnqKehoLSyqLO4oZ2jtqyqraSysqa1u7SrrLGiinp0bl5OUVFNT0ROTk5QS0ZOTkpKTk5RSE1KQUhMSUhDPjk1ODg4OTo7Njk6Njg7OTk+PDg6Pjk7Pzg3ODk6ODg1ODU3Njg4OTc0NTc3ODIwMzAxKyktLzEyODc2Ojk5OTk4NDk4OEE3d7anpLawpKekqqWgqaaks6qissS1tbKzxsW3usPKzMazrLq9tLjAr62psJ6mrruvraCam56VlYh8hG5fX2ZycHVxaW5pZWdoal9YWFhYWFlZWVpaWVtbXFxZWFhXWVlYVVZSUlJQUVRRU1VRTk1LS1NXV1ZXV1dXWlxhZVpgW254ZXZyhXqFgYyJjJebipWXoJ6gl6OTnpmTi4WXmYtzjIJ9jZeVhZKZkJOOjXuZj5yMgomAipigo56Qk5iWhY6ClH5+c4qOepCHk5CQnZuampKWkJ6Oo6OOiZqgoaOkm6K0r6yvraCYprimpbChsa6csbyqqa+pmYR4dGRWTVJQUE1DU05MUE1CUFFISU5TTklKSkVLTUdLSz44NDk4ODg7OzY5Ozc6PDk6Ojs3OT85PkA3OTo8ODk3NjQ0NDU4NzQzMTI0ODUvMDEwMikoLC0wMjc2NDc4OTo6NjU6ODdBN3i3oaO0qKalqKOmpaamprKnprTBuK+0sMnEuLnAzsa+s627waytxK2ooaaSnaa3raOgkZaXkpB+eH9mV1ZfZ2ZpZ2huY2lpZ2JcWFdYWFhZWVlZWVlaW1tbWVlZVldXV1NUUE5QTk9PUFNUUU1NSkdOU1NTVFRTVVhaXGhYWlhpcWtmRlBpiXqOf4WWkYaOjJuVmpWVlJGMlIh+koheO1Zue4uTiYCMkYyPhoZyi4SWgXmBe4aUnZWDlo6Qj4OGfZN4cW+GjX6JgZCOkJeamZOLkIqdiJ+YiIiWnpqhoJenrqmtqaielq2zoqWtma2rmKi0o6mtopN/dG5gW05TUldMRFRKUExMRk5PSUVMUU1LUEpJTlBHSko9NzU5OTk5OTo3Ojs6Pj44Oj09Nzo/OD4/NTg5Ozc5Njc1MzMzNzYwLi0vMzQ0MTEwLy8oKSsrLTM4NTQ3Nzk8Ojc5Ozg2QTl5t6CiraGmpqqgp6mno6qwqKe0wrmwtbDHwrizvc+/ua+utcKnqsSqop2Yg5ScsaOamYeUkIuHfnN2XVBMUVVZWlddXmJnY19ZV1dXWFhYWVpZWFlYWVpaWllYWFZXV1VTUk5MS0hHYlxNTlFNS0hGSE5RUUxPUlRVV1lgYFVTZGxjRjk4eo6KiHaBjYd/hYiXipSViZGFg5KEd4d+X0lQbXeKkYN9hIyKhH9/bX5/k3d1dniEjZpwUY2IioZ8fnmUdmd3hoh+ioiVi46Rk5eMhIqIlYSbjYKEkpuWnp2UpKOoqaWknpuwqqGkpJGmqpaiqpyhpqeKd25mXlxIUVFTTUlVTVNJTEtPSUhGSk5NTVVLUVJQR0pEPTc2OTo4Ojs7ODo7OD4/OTk+PTg7PDY7OzQ3ODs2Nzc1MzQ0Njk2LzMvLjExNTIyMS8sJykrKiw0ODMzOTg5Ojk5Ojo6Oj85d7aboqedn6Guoaeopaenr6yqtby2uLezwbu2p7nIuLaoqLW2qrK8p56Vjn+JlKmWlYt/joSDfnhxb1hNS01OT0xNUVdbXFpYWlVVVlZWV1lZWFhZWFhZWVlaWFhWVldVU1BNSkVAQJtrc3NJTUtERENJTk9oWU5RU1NVWmZdVmFpWlpRS4h9jYBsd397d4CHj36QmYuOeYONfXN+d3FtdHB0jY2Aen6JqoR6e2h2e45wcm14gYuNknh7gHuAd3NyknhodYWEhIV8lYuIio2LgH+Ei42AlIR8gI+YlJyWkZ+dqZ6goZ2gqaWfnZiNp6SSoKCWnp6kgnNpYl1dSldQUkhLWFJPSk1MUkpKSkxQSUxRTVJVTkZJQj03ODs5OT49Ojs8OThAPzo6Pjw3PT03OTkzNzc4NTY3NTI1MTQ3Mi8yLiwuLzIwMC8tKygoKS4xMjcyMTk4Nzo4Nzc1Ojw7N3aumaOhmJyftKmvqqWtq7Cxqr20sru4trq0sZ+3urKqnZ2sqaiyr6KakY2UgY6cjpF/d4Z4fHZwb2pZS0hJSEdFSEhQVFRUV1dTVVVVVVZXWFdYWFhYWFhYWVlXV1VWVVNQS0Y+OTNOPH6eTUhKREA9QURqlH5MTlFRU1ZeYmFgY1ZogY6SiYt0YHJ6cHN6hIx5gZiSfm+EjXp1eW5qfa18dJCKfnqGkoB8f3RmdXyGbG9oc3yKjYeAbXpxfXFtdo9xaHGBfo5wRIuFgoOFf3d4eoyGfYx7dX2Oko+Yi5Kbm6OWmZ2bnZ6hnJaNi6Wbjp2XjpaYkHlvbmdjW1hYVVFKU1VUT1BOUFZLTktPT0pRT0lPUExGRD07Nzk7Ojo/PTk8Ojk5Pz87ODs9Nzw5OTk5MjY2ODU2NjMzNjExMjI0LiwsLS4uLTAtKyonJyouMTM2Mi84NzY5NjY1Mjc5OTV5ppegnpagprCsrqunqbCvsau7uKu6vrizrKebsKesm4+WnKWppKGYmo6EknmJj4uLdnF8bXVxam1qWEtGR0VBQENESExMTVFRT1FTVFRUVVZWV1dYV1hZWVlZWVlWVlRTUUtENzhmNzA/qGlOSEM9OzpEioV6WUpOT1FUWFxeYFxZeZmcvHttcFx0cWl2c4OMdnmJg21qiZB3cndoaX+BcZaRioB9lX9JkpluZ3d+gm1qZGx5hZCShmtzbHxucnyGaW1wf3ONiYWGe31+e3dwdXSGgnmBeXB8joyKk4OWlpiakJOWlpmWnZaMg4mfkouSjYaQloBvam9vb1lWWFRSUllPUlVUUlhVTU9ITUtNT0tDSU5HRkA6OTk7OTk6Pjw5PDs6Oj0+Ojg6PDk/ODY4NzI3NTY1NTQxNDMyLzAyNCorKiotListKigqKCcsLTEyNTAsNTU2NzQ4NUhBODk1d5mRm5ian6Ssr6Ktqqi1r66ss7+rvMK/pqKalaSYno2Ei5ShopiZkZOLc456gIaMhnVvdGxxbWVra1lOREZDQDw+PkJGRkdLS0tMT1JSUlRUVFRWVldXWFlaWVlaV1ZUU1BMRTFAmjMganNDmW87PDk1PICChl9KTU5PUlZaUVdVU5t7WJBganBed2poeXWGhXJ+hIFxapaPcnF6aWmcjkx5hJGIhI1mMXaHcmt9fYN0ZmV1foSEhYBmaWx1a3CAfGhxcXxuk42Pe3R9fXFxb3Ztg393eXVqeYiCiImDlpKSkIuNkZSUjpeNgHmIl4iHioaAkIh4bGtwaGVYUltYWVlbTlBVVllYTklIRUpKSEdCQEdFQ0c9OTk4Ozk6OTw6OTs6OjpAPDk6PDk4Pjc4NzcxNTIzNDUzMzY0NTAzMS4qKispLCwrKykoKycpLCwyMjYsLDQ3NzU0NzhpTzg7NW2SiJqQmZakqK2esZ6nuq+rsrDCsbvDx5qWjpWZi46FeoSQmJWNkIyQh3GHgnSHjIZ6cHNxb3BkcGdfVEZJQz88Ozk6P0BBRENFR0lLT1FRUVFSU1RVVlZYWlpZWFZVVFNQS0U4MC9cYLNHOVhQOzk0NDGWuotITE1PT1FVS0FIT0depqqYZ3JvZXZnbH18gH12gIKCdm+dknJ3fnFzkoY1cZynnI2goYSihXZwhnuGfHOMrY2JgWhmYmpucm1wg3Vpb1h1cI6bkXZtf3t9bnJucIB7c3ZuYnWDf4aAhZCQioqJkYuRi4uOg3V4io6AfoOAfY58dHJxbWBcXV5cWllhX1JOW1pYV0xISUZJSD9DQUJIP0NEPTs6Nz07Ojs7OTo5OTs6Pzw4OD06ODs2NjY1MDEyMTI1MzQ3NDUzMS4vLCwrKSopKSoqKikoKikrLzNETTIxNjY2NDM8dlI3PTdikYGTh5WRnaSnnq+VpbSprrCuwbK7wcWWj4yUj4CIfG6BkJKJg4qHj4V1g4NslYiIfHV4eG14bndkal5JUEc+Pzc0NDg7Ojs9PkBCRUhLTExMTlBRUlRVVldYWlhWVVRTUExFPDUqnUtbQC1nSTk0Lz+Sg6muX0dMTU1QTDdDTVBRQkZ8anVycm53Z3CBgnd5gH97iHtznpd4fIR+g5iDmpxghamenIuDkI56dod+iYiOc4qXj4R7XGRxdHp8d4ptaGpieW+FkIJ6b4F4dYV6cHR6eGtuaV12hn2HfIeGjn+KkpeDjYWMhn1xhH+EfXZ3e3yJeHF0dWdoYFtcXlNcZ15XUFRYW1VHSkpFTEc/RkBEQz9BQT07OTc8Ozs9PDo6OTk7Oz0+Nzk+OTk4NTY1NDI0NDAwNDY0NTU1NC0sKSsoJycnJigoKSkoKCsrKy8wMFVxPTIzMzMxRX5XND05XIx4in+TjJGcnZ6mkaCroLGor8Cyu8W6lo6Rk4d6hnZrf4uRg32Kg46MeIOAc6CEin19gX9wgX56aHdrUlhMQEUyMTEyNzY2ODg6PD5BRUZGR0lLTU9RUlNUVVdWVlZUU1BNRkA6Mj0gI5ZjjFs1MzExaT9Hb0lGSUtNTlFLSlNaVk9HYHh/coBydGt2iYZ1eISDepKDdZ2WhoSMkJOkjKypSIasr66KgYCUioGKgYWSqYeBmJiKnHRtfIGGh36OaGdoeX9uhYeChXGEhkdtgHdyeXZobWtfdn2CiH+HhIt5lJybiYqIkX96dYp2fHhtb3d+gXV1c21cXl5cY2RYZ2ZcVVBQV1lQRExLRk9JQ0ZDQ0E/Q0E9OTc4Ojo6Ozs6ODg4Ojo/PjY7Pjc1ODU3NzMzNDQyMzY2NTY3Nzg7REZMTU1MQzcrIiUnKykrKywvMDArbnUyMjQyMEyBXDU9PF6EdHx9iYWHkI6Vl5KWoJ2soKa4r7O8s5eNkouYi310cH6Jkn59jIOSlH2Gfoakh4h/goiFeIeJfnOEeF9jV0tCNjAuLzIzMTI0NjY4Oj0+P0JFR0hKTE5RU1RVVFRWVVNRT0dDPzgwLCOHWz8/ODQuXZZwc6NVRklLTE1PV19Wa1dZWmKBiXyLeXx6f4uMeoGEjH2WkX+dnpWSmZmkrJKZu7GmusfDp4uMoaWOk4mBkXxxg56fkZ1/d4WFio+HkGlocISBdIyGhIpyhoJ3h4B7doR8bXZ1Zn+UjoaIiIaHh6CqopaIjpd/eoGIenlvZ2t4fnyAdWxmXlpbXmpeYWdgWk9MTldSUUhQSkROR0NKRENBRENCPDo4Nz08Ojw6ODg3Nzg6PT04PD02ODY1NjYyMzQ0NDU3Njg2NzxCQj88ODo+Q1FeZVxHMicmLCwtLS4xKD+LWy4zMTBPg180PztudW9md4J6f4x/gZCOipqapJyhrKaqrrCXkZGEoZSEeHd/jJR8f5KGkpV/ioCSm46EgIGMioKJjYN/in9scGpdQkE0Li0vLy4uMDIyMzQ3Nzg7PT9CREhJTlFSVFJTU1RSUE9IRUI8ODcvOUM+PDw2My5sk5dNUEhKTEtKTlZfX3pkY2htkI+DkIqLhIeIlIOOi5mHnJyPoKeioamSp7Shp8HCrceveLmUmnyNoZ6YhJOFgo6hn5SZkYWKhY+akZZscHWKjIKVjI2Od4+EcW2FgYqWkYKFiHKIoJWGkYmNj5aktKibjJSigoeSg31/a2pqfIKDg3VjXmVgW2hsXW1sX1dLSE5SUE5MTEZJUENETkZCQ0VGQz46OTY9PDo7Ojk4Nzc2Nzs6Nj06Nzg1NDU2MzQ0NTY2NjY4NTU2MzEwLiosLCkoKS46UGFcQCwoLSsrMCwncog3MjQwT4RiM0A8dW5nWW+Cb3WGcHaRhn6XlpqUnp6cp6CplpOYnmdlpJp+hJKReYCSiJGSfYqEmJKQg4CAi4yJhpCHhImGeHh/Z01SPi8vLiwvLi0vMDAwMjEyNTY3Oz9DRU5PUlRQUFFTUU5QSUVEPjs8OkRGPz48NzUyPD9SNUhISExLTU5RXmqEeG97dpOSj56cmpObkJ2RmJqkmqSnnKapp6izlqq9qrXHyLbI0M++m6Bwaaqpn4STkoWcoJqbmaaRkYiVo5ubeHp+lJiToZOXl4GUnnt3lZKqsoiMlp58k52bjZGVmKOhpbWvnJGYp4aWj42AiGxzc32BfnNqYl5iYGJoZWBnZ1xSRUpLT05JSUxGR01DSE1GRkNCR0VCOzg1PDw4OTk5NzU2NTg+NzU9ODQ3NDU3NTQ1MzY5NTg6NjE2ODYzLzAuLSosLy4tJyMqO1hiQigqLDEtKEuXXjA2M1GFZjJBQGlhXlBwdGBtfGF3jn17k46Oip+Sl52Wm6qYnqpCRH2HiYeYjXiCjYuOjXyKho+QjoGCgImLioWShYOGiYGAh3ZeYlA1NjAtMS8sLjAvLi8uLjAwMTU+QUFNUFJTUVJTVFJOU0xFRUA8Pj1GR0BBQDg2NjI8OTtGSEdJSU1OUFlqgYpzjYOXnJ+rtbGeqKaoo6SwqK2zrq6quK+xvJuxw6q5ycu3w7+3paKws6ysqqOLlpiEpaago5eBppmNoqqopYiFlKShoaqgpKmPm7CLlaOmt7qboKKvkqKcoZ2PoqGrrquytKGUpKmHmYiSiZV5en6GgWliaV1mY19kZF9nZ19bT0NJSFNORkhLRkpHRkZIQUtGREZGQjs4Nz08ODg6OTc0NjU4PDU0PDc2OjQ0NjQ0NzM5PDM4PDIwMjU1MS8xLi0qKi8sLSooKiYlNVhYLywwLCwwhIE4NzFQhWg1QUNbWFRMaGJXaG9YeYR2gZOFh4Kcg5GQjJLayJ2Wc1aXiI+InI98hoyOiop6h4KHkY6DhIGLhYaIkoaChYmHiIeHcW5hQEU2NDwyLzExMC0sKy0wLi00P0NBTVVQUlNVVVZVTVtQR0hEPD4+RkhDREE3Ozw1Qzs9RktJRkhRTlBXfo6agKacqKCouMG9pa/Bs6mwvbC1urO8sr+0ubmit8SntcjHtb24tKijs62wsZuZkpqfiKevq6WUdp+kl6GssrSZlqquqK+2urK6rK+1orGrsbW7trSttJ+mp6KmmaivrLG4t7enmrWoi6SNkJKehniChXhbY2ZXZ2NiZGFhZ2FbVEpERExUUEhJSURJR0VBQEBLREJNRz04Njc7PDk3Ojk4NjU1NTcxMTw4ODk1NDY2NDk3Pj0zODkxLjAxMjExMzAsKiwuLCsrKyooJyopRVowMCovK2iSTzYwUodqNkFGV1FKTFtZUWFiV3l0cYGUfYSGk3WFf4CMe7+7o7yCtJSTjZuPhIiPkomJeYaAjJOMh4SBjn+BiY+Gf4aIhoqHkXt4bl1XQEROPDY6NDVBQjc2NDAvNkNIQ1FbT1FVV1VcV09fVUlLS0E/PkdLRkVEOz5AN0Q3P0JKSkVGVlNPXoueqJ+srbmssLnGxLK4wbuxsb60tb+yvK61c6+ypLnEo6/GuLCzsbOnpLW2qrCgopebopKlsK6mraunpJihrbS7oqiyurW8v8y/xcW9vbPBt7q3vra6t7irq7Ckr6isva+8usHBq5i5p5StjpeXqYh9g35tWGVjWWxma2ZXXGRZVlNJR0ZMUEdDSElBSEQ+P0JCTEA/TUQ5OTY2OTo/Njo5OTY2MjQ2LzE5NTk5MzY0NjI3Oz0/NjoxLi81ODo5NjUwKigsLS0tLCwqKCgrKyhFUy8qMDBKj2s1MlCHbTY/RlJMQUxRVlNZVVp2anB+joSAjoVuenN4h2K5oZmjiZSUlpKUk42Pl5KHh3uGgY2VioCEgYp6fIqHhnyKgoKLhJZ9eHp1ZVBcZEdFTDtRY2FbXlNHPztIUERaY1FRWVhaZ1lTYF9MU1BFQT9JSkhFRUFAQzxFNkI+SEdKTFNaVF2QqrKwtrLCt7S3xcq4ub+6trO5ubW8sriwxF9zsKSxmp6qvKikqKuqo6KytaGqqJ+Vlp6YoK6lp6aln6SUo6extKiys722wr7TycnTxsLFzMLKw8C9vL67u7a0r7i2tsK5xb3Cx6+euKmhq42kp7WIgYF0YWRkX1ljYGpnU1hhVlJVSUVFTUpBPkdEPUtBPUJAPUY+O0hANzk2Mzc5PjQ4OTo1NzA0NS8yNjM4OTM3NDQyNj84QD5HS1JUU1FQT1FRUEpBOS8sLCwqKygoLC0rL1A+KC40OIB9PDJLiHE5PkNLRUBJTVBSS1FdZ2xrcI+NhZBza3Jyc4fVwLWZoI2VmJmRjpeRlpaOhod9hoOMlop+g4CCeHuLg4d7i3mBioKXfnR9emtlcHVZXlxQZWRiYGVkXVxYV1xNZG1VUm1tX25fWGdkVFlVSkRCS0tJRkhISEdCSTpEP0hLU1RVXFpbkLS7tLqxwbq2tcfIt7S4tLe4sbWzsq20tZdjdKecrW9eoqybl6Cim6SeqqWUn5+Qk46VmJionqagnpqZg6SeraWqsK24sL251NHP19DKzNLMz87Kxr++wcm8wLzAwMTExMm+x82yo7qwtK6aq7e7mIB8bl9iXlpgY1pkZFFcYFNRSkNBRUZFPEBGPkFIQj9DPTpFPj1KPzQ3NTM1Oz00Njg5NzcwMjIvMjQxNjk3NzU1NTVEM0VMTT41MS8wMDY6NDc3QElPSTstJioqKC0uLyxATSsvNTRtiUkwSIl0Pz5CREBDREZLT0RRW1loX2+WkpCUbmtvdHWHtKyhoZ+LmZyZjI2VkZqShoqKfoiGi5CLiHyBg3N7ioOFe4l0goqGlX9ze3lsbXV7aHJlaWxpZmpqaGBmaWlsWm1zlq2kvIiGZ1xvZ11aWlRIS05QSktQS1NRSUxBSkZKT19eYWZpYJa0w661rri5sq/CxLOut6+vuqqxsKWqtquLtaecmqaaTZmdjI6flpGmmKWVipOTiZCJj5GRnZuhl5uVloefmqebrK+psKi0tNTU1NbTzNDT1c3Sz8zEwcnQvcnJysnRxszNws/Rt6/DvMO5pLW5waKEcWVeX19aYllaZlpRXVhOUEFCSEVCSDtBQz5BRz8/QTc7Qz5ASD00NjY1NTs6Njg3NjU0LzEwMTQ2Mjc4ODc1MzY3QzVCOD8tMC0xMzQ5PTk3LC4sMTtGSz0pLCguMDAwN0s/LTQ2VIhXMESHd0M7Qj5FQkFDSk0/VVlSZVZzkJCYgmdxb3h5g6GqnqaXjJqbl4uNlZGajn2Ji4WNiomKkId8hIJwf4eBhnuHcoOSi459cXh1bHB4fnF6bXhzbWmAcG1jam1weGh3fH7LvsHfp21jeG5jW2FgSlBSVU5ZXk9dXE5QTlRQVFRcbm12gnGVrLWqsaSts6irur6vqbOlo7elqq2gq7OijbCtmZeYjI6RkYSOm4GNppGciYOLhIuJhIuElJaYl5ObkZyXmZqfn6uspaiirK3P0tXSzszT1NTP1NHOx8PU0cbN0tPT18zR0cTR1sXAzsfHwqi9ts6efHFoYGRfWGJTX1tQUVRRT0g+QEZBQkU8QEE+REM+Pz86PT08PEpBNDU0NjU8ODg4NjY0NDEyLzAzNTI2NzY4NTMzOz08RT1AMTErLzI0OT41OTAxMDIyLTJETjMpLzMuMzI9TjIzOEN9XzJBhnREOj09ST5AQ0ZIPFVRTU5adYaFindsd3B9fn+hnp6hjIyYk5OLjJKPlYV5hZCQjYuJiJCGfoJ7cX6AgId6hHWFk5CIf292c2xzfXt3e3OCeHJrgHNyaXBxenlyer7Lmn2LsYR2coR2aGFqXUNaWVtWZWNYY2pTWFxdYGNdY3d6fYuBl6ijo5+en6akqa63qaWyoaGtoKKtoaaxnoimmpOSkYmOjYiBk4lqlKKMmYSBhn6Rg4OTl62LlY2UmY6Gk5Gel6iwoqGhpaSpyc3PyMPM0dTS1NLO083G1tLM1NjW1tjU19XJ1NrNyNfX0cqrwsLLjXVxZWJhWlZaVF1RS0dKSkpAOzo7REFEPEJDPkdCPkJCOjw5PDpHQjQ2NTQ0PDU2ODc1NDMyNTAvMjU0Njc0NTU0NDw+PUU/QTYyLy0xNjs9MDgxLzI1NC8tLTtSMDE3LzUzMkZEMjg+bmI1PYF0TTk5QEk8QUQ/QTtPTEZKWHCAdX1ocnhygomAnZWdlIWLlYmOiYiNho5/eIOTmIqMiIiLiH6CeHN7fYKHd396hpGVgINud3Btdn92eH10hXx6bYd2dW99doR1eHudtYw7QYrFpX6MfGllV0lDZmNlY2dqY213W15maGtuaG2AgoeRipydn5yQlpedoqOksKKjsZ6hpJyfqJ+isZuFnZGRkY+KioqGg4+Dfpybi42ChIV5lH+CqZWjjZKKl5KMfpiLm5Krs5ibnKicp77Dxrm3x87S0dLQzNLLyNTO0NXa19fY1NnYzdjbzsnZ2tHVvsrLtXp5cGdfW1RXUlxYRkdLSUVFPTo3OkBAQjpHRD9EQ0FDQjs/Ozs3REM3NTY1NTswNjg5NDQzMzQxMDE0NTU4NzQ0NDQ5QD5EQkM8MzMuNkZUV09RSkFKRj8xKiguQlMzOTI1NC83Szc1PGBiQTxzdlY4N0FIOj9DPjw5UUVDSlRrbm5wYnBxdIaNfJeRnYt+h5KDiYaEiYGHfHiFlpaIjoKHhYd6hHlxenuDhXV5hY6NnHmLb3xwcHqAcXuAcYOHgW6OenV3fHyCdX58hoevc1ipwraNkYJwbWI9XmhycHFwbnh2gWVob3J1eHF5i4aNk5GalZ+UhouSmp+anaieoKuboZmYnaSdnquZipmLj5GNhHuHh4OEi42fmZOIg4d+bJl6hJiGiJOMjZSMhnyciZSQrqqUlpifmaevtr2prr7HzMnJzMvQycPSytTX2dfY19Xb19PZ29XQ2trR1sjUypZ8fmtrXVxRVVRhSkNGSkg+QT49Nzo9Pzs9Rzw/QUFBREE+Pzo4N0RCNzU1NDc5LjU1NjQzNTUzMjMyMzY0NzU1MzQ1OEVCRENFQjU2PEZOU01bbmZjbnNrYVY+LDRMRzg2NTQzNEJGND1XX2hMdXheODs/Rjw8Qjw5OUQ+Q0dSal5tZGJma3aAiHGRkJqAeoCNfoKBgYR+g3t8hJiNh4t9hYeAd4J5b3t7hoF0eZKejqB2jnWCdHWBfnSAhG+BkIJvkoR1fIGFenaGe4m3xaTBybmBlpqPd3BlTmZjgXqBd4aikIp4eXZ7g397hHZtk5aTlI6XkIKJjpaZlpWkm5eelZ2SkZainZmqlZCQiYyRgouDiIiBhY+RnZuZiYWLgYWYeoiJn5eQiI2Ki4J9oYmRjLyhmJOYmZ2ppqaun6i2v8DBucjKzs7FzcnR1tXV2dXX29TX2drb19va2djO28aIfXxqbGhiVllXWE5MRU5DOz09PDg6Oz05PUA2PT8/PD49PTk4NjdDQTY0NTU9ODA2NjU1NDc3NDU2MTM4NTQ1NjQ1NTdISD1ESkU3OTI1O0g+Ozk6N0lQXVtSVVhLOVQ+Ozk1MzI3STg9TllNSHh4ZDU9PkM9PUA6Njo+PkBFUV9YZWFdW2h0enlsio2Sd3Z6int+f36AfIR6fYGRiYSFeoSHe3V9dG18fYZ+c36SnpGeg5F7hn54j355iopugpqAdJmGfYGJhXx+kHqPqY6Pw6G9jJyjnH2JhH2JcouKfnOmmpyYk4V7jpCIhGhHcaCknYyLkJGEiIqQkpONnJmSk4+VjIuUnpyTn5SQjY2Pin6OjY2Kg4iSlpqenoiLlJGdkYGLf6WYiISNgoWEgaWGioy3mJ2RlZaip6Genp2kr7e6tazAxsrQyMfMz9PT0tjT1dfA19jZ29ja2tnZ19u4e3x7bmxoWmJdVFFPSURMQjw8Pjk5Ojo5OTs8Nj89Pjw9OTk7OzM3RD83Mzc4PjcwNjg4MzU3PDM3ODA0OTc2NzU1NTQ2RlA1RE5JODkzOEFLPTszQ0BJPDpEV048TVRITj85NjMzMz5DO1tYPjVZeXBaPDxBPD0+ODY4OT89Q1FTUlheVVhmbW1taYGOinFyeYp7en98f3uHenx7i4aCfXSDhXlyeXNtgH6EfneFm6GbnZSSf4yIgJiIgJySboiohXqhi3yRjYOIhJx9mpCJjKOjoJCkr5+KkIuFi4GShldyrYufq5uPg5ibj4+OXIKikYKMn5OUi4aHi5KSi5OTk46LjomHlZqcjpSWkIqRk4V/ioeRjIqJnJaYoqKGkp2VoIqJiI2bkIOHjn+Dh4akhYyRspidkpSXoaKfmZKcnaizua2mvcLHzcjGz83QzM/X0dHVrtbV2NrY2trX1dnZoHKAd2ppX2BaVVhZQ0BJQz8+Pjo0ODo7Nzo7OjM7Oz89Pjc7OjoxOkc9OjI3PUA1MDY3NzI1NT82NTs1NTg1ODo1NzczNUhSN0dPSzk5ND1FSkI+MUZDTEE5ODpHWEA1SFdJNjYyMjM6RUNlWD8mX3lpX3o+Pjk8Ozk4OjtAO0JRS0tTWVBUY2J6bWF+koNvbXeLeHl+eoF9hnt7d4aEf3NwhYJ6dXZ2dISChH5/kqajn6WiloqdkJWXi4qnl3KKso2EqJKEmZOFmYyilZ+XkombnqOTqrCfkJSQjY6IloxujbeFmsTIspuhpZucmJaQsZFkpM3IlY6Gh4iPkoyMkZOIhImIhZWZmo6Pk5KGk5aDfo+LmYeNkKqXlqKiiJielpqIjoaXl4mEjoyBf4ePpIiOk6ial5OXmaGZn5mTnZujs7Wmo7zCvsfFxcnIycLL1M3N1KnS0dbV1tja1NLazoV1g2tnYWBgUUtWXEJCR0M7QT04Mzc7PDo5PTY0OTo8OjgyPzk5MjpJOj42N0JDMzI6OTYyNjQ+PTQ7PjY5NDk7NTc5NDRKUTxKUUs5QTdCR0lANjRKRUxGPjw4OEVUQTc+XDg2MjE0OjtFYFhBRmF0aExjWj41Ozo6NTs6PTpFTUZIUldTUkJlg0d1go58fG1+iHh6fnqBgYN+dnaAgntsbop+eXx3eHyEhot+i6O0qKSrs6GWp6CmpJaVr6KDkLiVkbOajKGgjKSbr6OlnZiQp5epma6wpJeUlZSQi5ialqDAjqPJuKuao6WtmZGbnLKdhoWoopyXhYiIjZSLipKPhoCFhoiSl5OLipOShpOXhYOQj5tzkJiylZajoYicmZOPipCKlpqIipaNhn2MmJ+KkJCcmpmTmZiglKCdlJ6bobGuo6S4v7TEx8S9w8O/x87LydKnz8zT0tDW2NLP2Lx1fXpgY1djWFJJS09GQkNENT47NzY6Pzs8Nz00MjY2OTc3ND01OzU8Szw+OzxCQTc1PDs1Mjc3P0A2P0A3ODQ5ODc7PDU1T01EUFJMOEA9RUFHQTU6SkVORUQ6NkFAQlM+OURPMzIzNTc1PXZcPFJcdGlaTV1TPD04OTU2Nz06SkZER01cXVlKaGE7SISLenpthYZ5fIR4gIWBfXB4fH18b3KMeX2Be3iGi4mGhJKovK2ps72wpa6ztKmjorCtipq1nqO5pZWspJeprbimpaOfmamYqqSwsaqZmJyUlZGXoJeau7utyqFptriqsJWYnqKrkpe9o16psoKJiYyUhpB8jo18g4WNj5OTiIaSlYuOlIyKjJaYkZuZtJaUqp2Lm5SRjZCSi5iaiZGdj4uKlp+ijZWNmJmdkpyYnpShoJScnaaup6Kks7irwsjEtbq9vMbIyMLQocbJzc3E19bQytOjc31sYF1WYlRRR0Q+PENBQTc/ODc0PkY8PDY8MzUzNTU0NTRCMzk6Qk06QTtBSEI7OkA8NzQ2PEI5P0BCODc0Ojo2Pjw0N1RLQ1VRSjc8OklBREA0QUpITkJBPzZEQTxKTkQvVD0yNTQ6RUpcWEpaUW1ncHBEaWBLSTY3NTc6PkpAQ0lQZ0hhYGJwSkCLiX6AcoeHfIGJdYKKg39tfXx8fnB3h3eNgYd7jY+Mhoyaq8PAsL3GvLO0wb20rayztoyosq2uvaubu6Oorbm4q6emoqGjo6qvsrGqnZyjmJuYl56ipqWSo7mvqL+8rK2yuaWjp32Ihp2tvLCCi4uKkIOPg5GOeYGGkIyNm4eHjZaMipSWk5CZlpunmrGZkKqcjpqPkY6VkI+Vlo6QoJCIlJujrJWWj5ScnpSgnpuYn6CUmp+op6Sio7CzpsDGw7Cwu7bFxMO+zKfHw8fDvNbQzMTKind2ZV9dYl5PTENMQEVHP0E+Qjw6ND5BPT01PTY+MzMzMjQyQTE3QEJNPkdAQ05DQT1DPDs4NkNDNUJJQjo4Nzg7NUI+NzlWS0RXT0Y4PTRLQEM+NEVLSE4+QUE2QkI/QlNFNThQMTQ1Ozw4O0Q+OUxqal07V1JkS2daVU83OUdFP0NGXGlGX2lnW11ck4yMiHuHi4aDjHWGkIqBb357gX5xfoF6lHqSlJWYkJOVqLTGycDCzMLDuci9urCrubuXsra5ssCupcCkq7C8vaquq6Ojnqesr7WxqZugqpyinJafsLSnjKO6urXBu6uonLKkpKiUhI6qxMOkgouOhoeEhpWUjHmDjJCOkaCLi5OQjoeXn5eSmJSWpaCunIypnI2Wj5GRlJWNkJSRjqGThpefn7OflJuUn6GZpJ+aoJuglJifpqSlp6SvraW/w8KuqLe1ycO+ts6yxL7Du7PRycjBtXh8cF9bX21UTklETExMSkBBPUJEPDVBRDs6Mz04QjMzMjI2MkExNUlFTT5JQEhSQEg+Q0A7Pj1GQTVBVUA7OTk4PDdFPjg+VkpDV09HOD80TEBCOzVKS0NMP0I/PEJGPUFITDkrRzwzNjc0NjRBPzdPYU9hRS89PjZrbGpgQDpIPj9FQmhdTWVcZlRjapqNloqLiJKPhol5hpOQgXKAe4x/d4eCgY95jaGWqJqbmLq+ycjKwtLJy8LNvcGzrby/p7rAvbzEuKzBqa2zvL6qsaqkpaOsrrSut7Wgn66fpqKYo7S8qZyovMGjtravq5OwrKqsl4aaqqelkIKMkqSViYB1iZF5hIyRkJ2fkY6Sio6Lk6KXlpqUk6GeqZ6QpJmLj4+PlZaIfI6VkpGimpSgopy2ppCfl6Sko6WfnqaYnpWXm6WjqKiisqyou8DEr6Wzt8zAuq7Ds7u9wbmswsLBv5pxfGRbWl5dTE1OS0dFQ0hBQUFESzo0REg6OzQ8N0YuMTIzNTJBMjZTSE48SkJKUUVLQ0VFOkVMQjw3RVY9PD04OT88ST86RVVJQVdRRjdBOks6Qjc5Sk1CSUBDPjxERzxCQ089MjBIMzY2MTcwPUI6PWpqSks1UVMzU3BwZE47RD1ARj5sSl9YYVpkZViej52Olo6ekomKf4mfkoR4hX+Ufn+QiImQgJagmq6npJjDvsjEyMbSzc7Ny7zCuLC6vbS9y7vEwra2vK20v7q8rq+ooaiotq6uqbK3mp6soqiinau3t6qlr77Esb25s6eqtLOtrZeVpa2poJGOkrHFp5SOfJGVfIaQmI+pmJeSko6SlJKknJKcmJOgoaGbmJ6XioyPj56IWo+Wl5KWpJlmmaOes6WWo5arraunnJ+ml5mWmJWhpKimnrWrqbq8wrSmtLXLwbiqtayzu7iuqLi6vLeEcHFdW1dYUEdLVE5LP0FHRERIRkY4NUZNOz43PkFLLjMyMDI1QjU1UFdOPExGS1JMT0dHST5JUT86OElTOzs/Nzk+RExCQEhTS0BXUEY6QT9HNkE3O0hNQ0U7Qz00RkU6QkFCRzkvOkEzNjAzPkdEOTQ9dGRNRztFKzpmfGhWPD5AQkZCc0ZpSVJmZE1GppSclaGXqJaMkIOGpZKIgYeCmoODlZCQk46aoZ+vvq6hx77FxcjHzs7O0sq+u7axu7u8v8+2xL63ubezsrWzuLSsp5yrrLmrqaiwsJijrqWopKW0wLCrrLS+wrnAubOnuLS3sq+VpK2wsKWLk5SgjXPBmX2WmYSOlpmLsJWZmZSRkZmYpKKUnpqVmaicmqGfmIqMj5WdX0qWnJqUmaSXVJawn6+dn6WVr7CtpZuhpZSTmZiOnZ+moZm0qaqzvLu7q7Cyx8C4pqurrbGxo6GysrSlc3JoX11RU01GUVFQUTtISkhGR0FDPTlLVD9BOj1FTS83NTM0OkI0NE5XTjxKS09VTlFKUEhISk9CPD5NUjs+PTg6PENSPkRIUklCV05JQENBRjM+NThKS0NBPUM7NUZBOkE/PkhANSpCNTIsPmNdZzozNXRkZUBSNyYjM31oWDw6QkNAPVJFV1N0YlZGSKuXmZ+hqK6YkZeHiqeWjYiShJ+HhJ2Xjp2gmqOltcm1qce8w8TJy8nIzc3Hv7uzr7q4wMLNtci7wbm2urKvr7S1p6Scq7S1q6qmrqyapK2mpamsur+oq7e3vsHAvreyssOwt72so661rbqmiJqWpZt1vp+EmZ2Okpiai66WoJualpSanp+onaafmZmpmaCmnZaPjJCdgm11kqKalZyin5CusqKrlqqqmKuvpaWhpaqSkpmciZWcop6WsKapqrq2vrOyrr65tqCjp6ilppycrampjWZpY2JUTU5ISU9KVUw9TERNSUpAQ0Q8UVU8QUFCRE8xOD03Nz9CNzVVWE4/SE5RWFJQUVRKUUpKRUFFTVE/Pz04PTtHUjxFRFFCR1lNS0FIREU6OjM5S0lCPkNDOjlDPjxAPjs7RzctMj4tMYJoTnpcLzBraGA8PUJCODZ6Zlc8Oj0uLlNhTFZIfmVeSEaslZyhn7uumJSei5Oqm5GRk4iqjYeinoyjrZSjpLbHvbTBu8LCyMnFws7Iwr66sq+5tcDCyrbGssG8tbusqa2tsaOjmaq1u6aqp6yqnaivqKSrqr27qKy9tLe+x7y2tbjAsL3As6q1t6y/po+ilpCgn7ueiZqgmJadnY62nqibpKKam6CZp6SxoJqdpZynqZyXk46Um4qWiIykoZScop6gtbCkpZOyq5qrrZ+fpaSqkpaVoISQnp+clamloaGztLq2rai1srKenKOlmpeVmaqhnnhkYGFgTElHSE5RSU1FRkZCUUpIQERHQVZTREg8QUdRMTpCNzpCRjc5XVlLQUxQVFVTTVdSTlVKREBKSk5POUM/NT08TlFDPz9QP0VaTUpBS0RHQDUzPUlHPz1FQTk3QTs8QDw8M0A8Lyc7KkiRQjpTSjAsW29XNzE8Kh1CgGRUNDktMTpoXUZEQ5xwYkdEqJeknp/DrJuXpJeZqJuVmZqOqpaVqKaVrK2Zoqu3xcK8v7jBwsDIxL/Nxry+ubKwubS/wsi2wLC8t7q3p6SrrK2hoZurq8Sipaispp6rr62iqqi+uKatvrC3t8e3tLm4v7C+wbe1srWwvqSWo5WSmpOtn5ChoqSiop6QvaSonairnJygmqWfvKKXo56hqKqgnJSMlJ2TnYaOhI2TnqSgnbasppyXs6easKignKufoo2alqCFjqGanJKlpZqXq7G2sqqlqq2snJigoJKOkJapn5RpZlxjX1FKSEtPTEdFRElAPU9IQDtGSUhbUlBLPUhOVTRCRjg+SEc1Q2JbS0NOUlVXVlFYVFJVSEA4UVFQTTpHQDRDSFFTSUM7Qz5HVktDQE8+SzwwNjtHRj47RkE1Nj85Oj85OzE1RDAtLTBNdlw0S1o1LE1uVzwtPSkeI3piUTVDS1E5b1NGPEt4ZmNYTqKbo5uexaugnqudnK2fkaKelqSfpqqrl7axo6qztsXDvcC2v8G8ycK/ysi2ubW0sbS0t8LGt7+xuLW6taCnrKusnp6fpaTBpaCqrqCkqa2woqaovbWlsby3trbDsrO3ur6yw8C3uK60tbWjnKSUkZOgrJ6YoZyoqKqimsGsqJ2rrZqanZiln72hnKSXqqqrpaCYjZqfkp2IjVd/lp6loaC5qqeTmbejn7OioZywmKGPm5Wego+gl5eOoqOVkKWusqypoqKlpJWVnJiLj5KTpJ+JY2dcZWJOSktLTkZFQUdLPj1JQTo4SkpOXVFRST1MVlw5Rkk9RE1JOEhjXEtDTFBTWVlWV09aXklBPVdRSUs/SD81SE1YU0hBOkBBRFBIPz5RPks3MDk5RkU7OEc/LjY+Nzg+NzcvMT85MSUxUVVtW0pPMTA9Z1dEMTc9LSt3YVM2U1prV3NIRTY9dWVcTFCeoKCYnsOnpKKzoJuxppKpo5+jnq2pq527samstbHIxMHDs8LDvcfEvcXKvbCxtq6xta+/xbW6sbG6tqybqbCqqpufpqGnwa2brLGcqaKusaqkqL23pra7va+3xK2ztMK/ssazurertbauq6KllZWToqugnp+ap6qurq+7saWfqKmZmJeSoqO3oKGjka2uq6SlnZGgnZSdjpCMlJ2aop+otaenjZm1nKOvm5+csJGhlZmVm4CSopaQjqChk4umrLClp6KdoJ6SkpqThYuSjZyfgGRoXWhmS0pMS1NBQ0BJRzs7Rj45OU5NVV9SU0o+T15ePUhQQk1MSThOZF1MRUxSVFlbU1VPXGJIQT9aUUFIQUtBN0ZFTEtOPjtCSEROQj07TkBBMy85N0NCOTdGOys2PDQ2PDM1LS80QDErJ1Z0U2VPPzEwNGJbTTIzPjA8d11eP1tVX2dyQDg8SJZ3ZUE0n6SemqDCp6OpsaCjtKmVsaumoqSyrK2pu7OtsLW0x7/Ew7W/xL7KxbbBycK1rLWpsLmsv8S0uK+ttrqmmauyrKuYoaeYrbu0nKiwm6yfrrSyp6q6sqe5tLiyucGqt7PDvbTFp76urbe1qaisoZaWkaWjoaGXl6Sut62xtLafnqikmZOUk6OgtqKkpZWtsbGlqKSgnZqZmpWXqKCfmaKer7Oipo2Yr5qlrJibn6eTnpCVmZuGl6CUjZCdnpOLqamroaegmp6WjY+ZkIKGlomVn3pla15sa05RTk5UPUNBTkM7Okk/NzdRTl1fUlZRQldgXUJKU0hXS0g6VGRdTkZPTltXW1JQUVhdR0FCW1BCRz5OQzlIR0hOUD8/Q0lCTEI8MklBOTQxNzdCPjs3RTcrNjkxNDgwMi0vLjw2LSNCcWdzazIzLzFcY1ozMzkwNnBbYkgwNUpxaldEV0aMeWZDO6SknKClvqWorq6gqbWqnbevq6OqtLaxsLi3sLe4uMW9w8e9vMPCyMG6wsbCuqq2pa27rcHDuLiqrbK8o5WusK6zl6aokaq6qqCmsJ2qoK+0s6qqtrWsu6yzsrq3rLmwwrq9v6bDqrC3r6mrq6admJiqoKGgkZegsK6zqrC4mZupn5mWkZemoLaopaKir7Czq7Gmqp+bn5+anaWdoZido7SwnJ+RlKaboamclqOimJqMl5qUlpeelImRm5mUjqmpp5+jnJmbk4ePmYt+jJeFj5tsaW5ibm9YUVFaVEFDRFVAOzpJQTc6WFBkXlFXV0VZX15NTFNPXkxKPlpkXk5JUU5bVVlQS1NXWkk/RFhQREY+Tj89SUdHUVBCPURGQk0/OjJEPzc3NTQ3Pz05NUU0Kzc1LzI1MS4tLiwxPionKz1ccD0+MS4xZVtkQDE3NDdnWWFGKEA4bX1pXFY7iXtjQz2on5yhqbygqq+qorC3qKSzsquhrbW9r7O5vbu9t7fBwr/Jw7nEw8HAucW+wbiwtqirt7K8v7+0qq+yuJ+Xq62prpipqY6nu5+lrbOfq6KxsLOsqrWztbytsLG1rLC1ssC6xbarva+xt6ytqqOxpZ6lqJ6jlo+Yn7Kpsqmpspmdp5ualIyfpqS0rqeirKytsKeyqrCpopuep6OelaGZnKi2qZiakpKfmZ6hoJKtoZuaiJeajJ6anZSLj5eXmpempqOgnpaWlpOAkJWEe4+Tg4yXZ21yaHFzX0dZZlZEQ01YRFo5SEI1Pl1RaFxPWl1HW19eTk1TWGNKS0NcY2BQTE1OWFdYUEpWVldMPUVVSkVEQU0/QUZISFFQQTtHREZLPTg3Qj02ODcxOT48NjVEMCs4MC8wNS8qLC8tKj0sKyUyKyo1SzEuJ19fYVYxNTE9YFZfOClDM1lVXGhLNYx6ZkxApZmfpKy1o6yopK6ttaius7imp7C3xrext7/Bwra1usW+zMW5w8G6wLrFuMG6s7Ssqrq3u7q+tauvsbeYmKisq6ycrquPq72dq66xo6mfsa2zrq61sbm2qq2vsqi2sLS6vMmyqrW0sbSwr6ehs5+aqKufpJWVmpmxoq2gpa+WoqSZmZKMoqWnsqmhprGrqbSlrq+zrqOYna2nm5eempqsuKKYk5GPmJyhmZiVrqGfl4OVmo6enZqXkYqUk56apaOjoZmWk5KVe4yQhXuNi4OLk2xueW92fWFGYGpaSUhaWz17SkdFNkFjVGlbTV1hS1xdW1JSU2JhTEtFYGFgUUxJUFdWVU9HV1ZVTjpJVklIP0NLP0VESEhRTkE/SEhIRTw3PT46NzU2MDk/ODY2QiwtOCwvMDQsKCwvLSo3NikoOS4kOks1LiJUYFZhLjUoQ15RXC4rQS9KR1BbRzNjWFRMRZqWn7CosKmspKOurbWotrO3o6yzt8m7tbu7v761tLfDwMzHvMO9t7+/wbjAvbK9rqi6uri3wresrrG6lpenrq2ppLKplK+7pKyysqanorK0sbKxtbC3s6murLKnuK+2tMPFtqm1tauwraqno7afn6ewn6OUm5iUsZ6nm5+pjaminZuVl6WlpLenorGzq6ewp62vtKykmKCsqJycnZyVqrmclY6PjJidopiRmaikoZmGlJiRnpyYl5eJl5CXm6idpaGSlpKQlXaEkIZ7hoKEjY1ucXh2fIBcTGVsXEtPZF0/YntHSThHaFdlXExeYk1ZWldUWFVqXU9QSGFeX1BLR1FWVVJLSFdVVk04TVpORUBGSz9IQkNLU00/P0xPSEA7Oj47NjswNDE8PTQ1OD8pMDcpMS4yKSksLC0rLTkkMDQyJTlCNy4jQU5JZzI3J0ZhTFYlLUIuPUVMUTwzcmpMRUSRmaStpKytqqWisLGyqbevtZ+rtLnIua7BvMO4s7K1wsPOxMDCvrW+wMC7v720xKmqubG2t8C8sKy0tJ6hp7GvpqexpZ2xtayqsrCrqKi1uqy1srWrs6yqq6msqbmusrHIv7ikubCpra2mqK2xpaSjrqOonJ2bmq6Zo6Kio5Csn6Ogn6GppqW4pKu0tKSqq6msrrWuop2jqKqcoJqbk6S1mo+JjoiRo6GWj5afo5eWh5GVlZ6bmZeViJiTlZmnnaGgjZORjpB3fo+EfXx9h4qKcnRzf359XFNjbl5OWmddRkSWW0c6TW5YYVtNYWJOVldWV1VZaF5RU01jW1tUS0ZPVFNOR0lWU1xOO1BeSkJESEpBRT8/S1NPPjpOTUM8PD45OjU9KzMyPTYyNDk6KDQ1KS8sMSgpKywtKiY1Ki8mMCkzODoxJiozRGU7NipIZEhKKzpJPzNDSVMsPo9rQEhJkJqoqaGor6Smo7OzsLO0sLCgq629zLuuwr3HsrSutMLD0cTFv8KzvsLDvL+4vcWorbess7m9wLGssq2ipKeuq6ilsKOqsKquqrGurqyrs7unt7CxqLKqq6Wlo6+6rKqxwrm0rLmpqaitqaexpamkoq2pqKKem6KslaWdl56ZrJ2hp6ihrKajray2sLGgqaKgqq2wrJ2ep6epmqSYmZChqJiGhI+Lip+hkI2PmJ6SkoiJkpahnZaZloeXk5OXpZ2dnYySkI2Jf3+IhHx3f4eFhnV0col3bF9ZX25iUXNxXEs7hHxGPld1V2FZT2RcTlZWVVdRXGJfU1BOaFlYV0tHTE5SSEVJVlJdYzxQXUQ8RkhIQkc/PUpQTDo+T0o9OT89Mzk4OyozNT4xMDQ4NSg1LyosLjMwOyksLCclMjM0JCwyLTg2MCkoMj1eSzAuSWdERjg8QjA1RUtYMUCUXUBORpWWrKegqbGcp6iwtay4ta2ppKuqvcm8sb+5w6+wrbPEw83Ow7/As8DDxLrBtMnErK+3rrO6wL60rq6sp6mqsamnqLGls62qr62tsK6yrbO7pbezrKyuqKufo56xt6uqrbq2pLW1pKqnq6yqraCopqawsaOnpaGhq5aqoZOboKaeo6Kqo6yinqaxtqysoqWimqmqrqmcoaWkpJmgmZaQmJ2TgYKQiYWdoI2LkI6ckZONhY+apZuTkpuMk5KRlKOanJqLj4uLfIaCgoF6dYGDgX51eIqihnhqXV9uZldlh2ROQGeSTERieldiWFJmVU1WVlZUT1xdYVZLT2lYVlZISkhJT0JHSVNRWW9BTVhAOkpHRkVHPj5FUUg4Q0tFODdDNzI6OjoqNDk/Li80NjMpNCsqLCsuIzQuLSsmKCs3OSomNis8LjIsJjA3WFouMEpnQUE8PEMrOkpPXjREh0JJSUSWkK6koaqvl6morbWqtbGqpKuqqbzBwLi6tLy1prOvxMnL0r/Bu7i/v8O6wrrBxK6xtbK0vMG+s7Kvraytp7eqpq2vqreup7CvrrGqtaq2tqe0t6uspKmqnKSetLOoqKSztJ+1raGqqKuoq6efq6youLWpqqmpoqifrZuRqqGdoKSipqKqnZymtK6npamio5ekpqeqnKKko6CamJ+Rj4+ZjX+HjIeEnp6JhoyMkZGTj4WIl6Oajo6bkpKQj5KgmJmXjYuEf3SGgn9+eHWDf3t4fn+HnY9wcWZmcHdcYXSIak9dmFZIbXlVZFZSY1BNVlRVUU9YW2JVSVFqVVdUR09YVUk+SUhPUVB4TU5WPTxLRD9AQTxAQ1VDOUFLPTU7RTIzOzo3KjQ6PSstMzQxKjgqKisqLCkqKC8qJiklMzssJDIpMi8yMiUvM1JjMDI/Zj1OWD9DLD9MVF8vSWs3UkY7lYyvoKSqrJmpo62usrSvqaSvqai7v7zBsrC5raK2r8jHyNDAv726vMO+u8TCv7+vsrOytb28wbKytKu0qaW1qaWts7K4rqGstLGvsbmrua6qrrerqp6qq6CjobatqaGfrrKgtKqfqKeqoqqhoaytqL2uq66toaenn6yZj7CimKKgqKeep5uZqbCoop+roqGSoaKip5mZqaWYmJmdj4uHlYh9joaEhaSXhoOEjYiRkJKGh5ahl4iRnpKTkI2RnZWYj4uGhnh0gX98dHd5gHt1dHtrg4ekdmleZWuAdWeIjHxSVm9eS3hzVGRTUV9NTVNaZ05NV1llWUdTalJSP0JOUWFROklITFNJcVFMUzs8ST87PD07QEBXPDw+SDczQ0IxNTo5My01OjopLTMxLS02KSgrLSw1MiMyKScsJS47LiYxLjAtMTQlLDBNaDozOF89YWQ/RjFDUFtbK0hQO1lDM4+NsaCjpaqjo6KsprOysaiksKequL7BvbGpuqqnrrDJxsjQw76/vbm/wL3JvMG4sbC1srq8ub+ztLysuayjtKamq7G1t7Glprm0rLO8r7ylra21q62cqa+kn6Ssqqicnaqyo7OomqunqaSonaKpp6m9qrSwrp2ppKCunJqzopaknKWkn6WamqiqpZ6aqaGbkZugpJ2ZlqipkZmakpCLgo+Ffo+Cf4ifj4eBf42Ik5GRhoOVm5SFk6KOlJGLkZuTloeKf4Bxenl9e2d2fHp1cXJ+aoZ5hYhkX2djcoV7bWh5XV5VQVd7bVRiUFJZS0xOcHRdSVpbaFpGVmZQQz5KT0RDQTlIR0tTP2phSVE4PUg8PDw+Ojw/VDY6P0M0NUg+Mjs1OTAyNzw1KC41Ly0xMSYvPktJMSUaOTAlLCwwOS8sLCs2JzE3Iy0vR2pJMTRYPWZiQUo3R1NgVSo9PEZcQCqOkbCYnp+opKGhq6S2sbGkqbCmrbnBvbexpLmsqKivw8nIzMK3vb+1uMG6yLbCtbSytbK9ubq9tq65tr+sorOmqqqutLazqJu5u6iwvrK6oK60tqmrn62wo5ylqamjnZuksKavoJ+qqaehqZujqKCtvKeusK6hqqKkrp6eraaYn5uhopyfm5mjqqKamaOjlZaUoKGWm5alrIyfkpCRjIKKgICPgHualY2KfYCNiJKRjYuGk5iRhpSkipOSiJCakJSBiX15a312eHhienpxb3F0eGqCdWuCZ2NnYW5zjm1iam9gb0BceWtWXk5RUktJTVRZVk1cXm1XRVlgUF5PSE1ERjs3SEVLTzxyaEpLOUFFOzs9PTs7PUo0OUI8MztHPDQ/MTgtNzg7MigwOS8sNS4uPS0qTD4qHTQ5JicuMzQuMCsvNCYsOiQ0MEFoWjEzUz1lX0RMNktWZE4pPTNSXj4jkZasmJ6Xp6Kgn6ejt6+toq+vqKy4w7u0rqC5r6uos7rHyse/uMG9r7S/t8S2w7KvurGywLa7vbequbi+qqS0pqipr624r6eXuLyjrb60tKCtuLWnpqews5+epaaooKWYnqynqJ6gqq+noKaXoqifsLifpLGvoKuhrKScpqeompubnqOVnJuanammlpueqJGYkpmdk5mWoaqRmoqNkId9h36Cjnx8oY2NiXqEjYaMj42GipOajoiUoIqRlYKMl42SfYV8c3B9cXNzX3h3aW5xcXBrgHNkemxnZWNhZoaAYFtyanJNTYBpWFpNUUxLSFBTUEdMW2BvVEZZWlJoT0hLRUY1NkhCTEk1WmVKQDZFQjk6Pj0+OjpDNTk+OjNARjwyQDIzLzo7ODMmMjwwLDg1QiopLUMqLDQ7Tk5AOzczLS4rLTcqKjwlNTM9ZmQyNE0/ZV1GTz1SWmdIKj8wXVw1KJWbpZiblayfnaGjoLarsKO0s6mpucW3s66huK2trK+1xcfAt7/BubC1vbe/u76wrL6ws7+yvMK4qru6uKentKenqq+rsq+kl7u1pKu6ta+esbmvqaWnr7GboaSgpKOglpuvpqGeoqivoaChkqSkobewoaaxq5+ro66YnaqlqJ+Ymp2kk5mbmp2lqZmbm6SVlJeVnI6Tl6KpopGKipCGeoR+hIt5j5eKjYd7g4mFio6PhpCTmIyOlZmLkJd+hpeMkHqBe3Byd25vc153dmRsbGxraoVuZnJpamVoXWRzgWBba3ZpWkp/XltYT09LSEhTVkczOV5fbFBFWVZZZk1JSUVFMDdGP0tCNklKSDs2Rjk0OT49PDk4QDg7ODo3QEk+ODw0LTM8PDc1KDU+MSw7QTEoKzY8IjhSPSoxMTM+RDUsLSc0Mio7KzEzOWNtNzRHQWZbSFREVF1oRC48MmRXLDGUoaGWlJuqm6OhoqG2qq2gu7elrL3FtLCvo7WvrKyvtMPDvLO+uraws7m4ure6r63As7O4r7/At6y9urWlorKpp6mxqauwn5m/tKSntLWonrK8qailqa+rmaKnnKOllJegsqSZnqSpqZyin5KkoKS4qaWnrqedpaGok6CpoqGhmZucn5GZm5afoaqbmpiglJGUl5qOk5OkqKSQiYqPhnqEe4SGfZ2NiouHe4KFiImKkoaXkpKLkJWUjo6Ue4OXkIt3fnxsdHJsa3Nhd3RoaGpoZ3CGaGhpZGZpaWBqY2poW2Z7YmBTdFRcW1JMSkdJUFRAISpoX2lNRFdVXmBMSkhFQy46QjxGPDZLUEQ4OkQzNTc9PTg5NT86OzQ+OEBLPT45Myk4Pjw6OSo2QDMuRTQoKyw/MC1OPy4rLTcsMTE5NSwmLjUtODA1NzZgdEEzQ0RnW0tXR1VgaEIzNzlnUCcynqKkkY6jp5mcnp2js6ynqrq2p6zDwbixrKO2rqetr7e/v7yywbawrrK2tri2tq2qvbOusrC8vrevu7uxpZ+1qaWks6aorZycwKqnpa+zqqy1u56pqaywpZidqZ2mpJGYpayimJ2kqaGboZuWn52ntaawqq6goJ2eoZWgpqCioJqbmZuSmJ2TpZ2soZeWnZSTjZWXi4+Ym6mgkomKi4l5hXaBgoGdh4uDiX6AhomHhpGEl5SPjo+RkZGMk3uDlY+Gc35+ZnlvamprZnRza2JnZGR2gWNlZmZlamlja3JbX1ldbGNhTmlYWmBWSkdJS01TWD45X2xoSENWVFxbSUpHRkEuPD85QTg5UkZANzpCMDM3PTc2OTI6PDk3OjlETT1CPDAqPEA7QT0tNUIzNz0rKiwwQipKSy4vKiszNzIyKDU3JCs3LjcyNjg1XXlOMj5IaVpMWkpWYmZAOjNCaEglNZqjoI+MrKGWlqCVpLKxorK9tqGxxby6srGjt6yqram4vLq6rcCxrq6utq+zuLOpq7mxr66ztbq1sLi8q6aetKmfn6+iqK2bob+fsKOusa+3rrWera+traKZnaaopZ+Vmqeln5ikoqidmp+ak5yerK+muqiuoqGam56ZnqSapJ2XnpiblJifkqiVqqeak5qakoyVmY2UlJuqp46OioqPe4JzgYGKmIWHfYmKhoaLjIqThZWbk5KOj5GXjpB/gI2Og2+Bf2Z5bWdraWZwcmtcZ2NjdIFiZmdqbmxnampobl1sbHJwYFRjaWNmWklGTE1PWFFRVWFlgFVBV1NZVEZJRkVALzw9Nz82PEZOYTg6PzI0OUAzNzgyOD83PTg+RkpARDkyLT1BPUE9MDVAOUExLSsuMzw7SzYwLissLTI0OzYjMyopNi41NTQ2NVp8XTE5S2pbTVtLWGRkQEExSmZDJjSRoZuNjq+dmJOhmqmxr564v7WgtMK7vrqxprevp62ktre3tqy7rqyqq7aqs7euprK1sa6psLW1sLO1uaaon7WnnJ2ooKermqe9l6yjrrC1ta2toLGtsKihm5yjq6eblJumo52aqaKklpqfm5CbpKqrqbugp6SgmJqZnaGPa6KWmZxwgpWZo391kamnnpSUnpCJmJqAloqikHmHlI2DbWl/d4NxbIaLhn6FjIdxX2RhZ4SYhWuKjZSSdHeLhH6DkIBnh4BndWhlV1xoc25NUGljZ3KFaF9lZm5tal1gYYqPg4RlTktEOUdUaF5KSFFQVVVMSFNhcHRlRltRVVBGSEVDPjE7PTY9NjwzZlw1Ojw3NTtENDg2MDpCNz86PkZMQ0IzNDM9QUBAPTI4QEU9MSwsMDg9RzcwMS4qLiovNTY4LCMxJzIxNDoxNzZYgWwxNk9rW05cS1tmYj5HMVFkPSoui6SZhpWwm5uToJuqrKqjvcWvqbfCt728raa3sKWqorazsrKwuayppqy0pa+0o6m3tbWop6u2sq20rbKhqJ6yqZ2ho5mkpZiruZOlpa+zt62vpaquqqykoZ6coKamm5agpaSbm6emnZOenpePnaeppLawpKKinZaYl5ejiKGOkpqGoIeSnKB/pX+lqp6SkpqRiIRzeI2OhYihdomNaZeIZn5zeKBviIeEfo99f6GgoJmAfYeec4aOdZuKbIeBg21pZWN6bHJhU4VtYmxpmHFYaXFwiFleaVtsbFuIcm56coVmhoRaX0dOP0dfTkZSVlZRUVJXVWddTVZJUlJPRkhHPjw0OT05PDc7MDw8Nzk5OjY9RjU4NjA8Qjs8OT1GUUc9LjU8O0A9QD41OUdBODIqLzE8STkvMDEuKi4oLTQ1ODMlJjIxMTU+MTw4WIN1MjVSa1tOXExcZ189SzFXYTcvKIqnl4Ocq52YmJ2eqqmnqr/Dr7G6vLbAvqqlt7CorKWytK6us7aqqKSwraW0spyutba0pqensrCssqetnamgsKefo6KYn6GarLOTo6Wltb2mraerqqyopKGgmJ+mo5mYpaKjmJykqJaTopuTkqOlpqG3pKSgo5iVk5eTnIivkJeUiamLlqGchbGAo6ydk5mdlHmC1KiAh5XBnMZ5eLGlt5dlgMCcv3mEhXqShH2QkJHKcpe7nMV6crWnupB7gG2XsauweWhsWLGubmVpvJK8bmd6bnKP2H5Ta2O2sn6BcpRzmqGqkFdPV2JPVk5GVVtYUVFTjV1XW1FBXURRTkVISTw8NTc9Ozo5Oi49Ozg3ODs5PkY2Ojc0PkA+Njk/RVJJOi41PjpCPD9BODpKPjUyKjIyQkUvLjMyLisvKC0vMTg2LSAvNDE2QTE9OVeDdzIxVGtcT1tNXmdcPkwxW100MSGMp5OBp6qfl5ydpayxqLDCvbK1wLW2vsGqprOsrKimrrOprrWzpqeltKWnuK2cs7G1q6akp7GtrbCmqpymo6+ioJ+dlZmenK2rk52in7O6o6upoq2upaGcmpmhp5+XmqefnpeepqeRnKaZk52hpqKhsaOfn6OWlpKXkpmFr2tqio2qfmaDlYatZHCdnZSZppRwrqGkfni7fWyhkHaxX2q0W6WAZZyQYWeDe2eAa3lrqWW+cWemi3WxanuxeHSSlGNubaduW4ShRWhmh5ZFdZxgfmd8pKeCWmCMq2iAlHh5aqc3Sq9cWFNsZFtLT1hfXFdWO06KT1dXL0lUU0pERkY9PzQ2Pzs4OjkwPTg5OTk6PTxEODs6Nj1BQDY8QEhRRzkwNzxBQz5ARDhARz0wMy4zM0UzLi41My8rLyguMC46NS8nJDIwM0IvPTtVgnYyLVZqXE9ZTF9nWTpNNV9YMzAbkKKVg62npZ6jpKqxt6y1vb6wtsSyt7rBpqiwqq6oqK+uo7C6r6OkrbKjqbinnrKysKOloamsrquvpqaeoqGvmqGblpSWmpqrpZWaoZ6zs6KsnKOtrKCdmZafoaicmJ6jn5uZoaakj5yimZagn6qep6ahmqChlpWRlpCahbWbtXiFqZm1mXaGs5u3fpOWlqmUf2uBpnuChoiTlJN3q2drsVyreo2GlHSJco+HgYGJkJd4goGLl4uDoI+EsHZ3n3FsbGx8i06kWEhiYpl+Y2imYHlydVOTh15RqW1jcX2GgGKcLlGhb1tTa2hgTEpbZFhcWkI+sntYWEEjTWhGQ0VBQEExOT44ODo4NDs5OTw5OkE6RTo6OzY6Q0I4PT9LTkc6NTpARkJAQUQ8RkQ7MDIwMTtGLDAuODQwLC4oLzMsPjgzMR8vMi1EMTw8U31uMytYalxPWE1fZ1g3SjhhVTUwG5SglYizpqahr6mos6ypu7bCsLvBrbi3v6msra2tpayxqaCuu6qgp7Oso6u0o6aysqejop6mqrGnr6eknZ+frpWemZSUlJedrKCZmaSota+iqo+qqKqbnZSXoKWnmp6cop6bn6KkopWbnpeZnKKpmqaanJuioZeTkZKTnYPVk5m5cLDBfsWGfNaUm7t8mpWlj42djaR7joikg6WDeqx5j51Wr3qIfp9ruVu6d4eEfqaClHuXeqp4jZ2PerFujoR0kbyFb5RQr6fFilGgemNgqmJzcohtl4hgU7W0yIWAiXxjpDNCnXZdUGppY1BAWGhaZGFKSE1xUFxRT1lmWkNFP0U/MD08NTk7NzQ8Ozg9OjxDOkY6Oz42OkBDOzZAT0xIPDk7REhDQkNEPEVGODEyMTFEQy4vMDQ4MystKS4zMjM5NzEjJTUqPjM9PVF3ajYqWWlbS11PX2ZUN0g6YVA3MSWbopSYsqioprSqpbSppLy3wbC5v7C1tLqytKewr6KvsqWfrbWnmqe4raKvsZ+ztLCgpJ6fpqmwqLOoo5ucnaqVmJeVlZOVoKmcmZanrbCpo5+PraKolp2Vm6CloJehoKGgmqGhp5ueoZ6UmJqmoJunlZubn6GYkJKUkJ2Ism5otXGrh26OpnK0c3K2e5qXpIuPnY2ifpGhpn+xd4OR0tJ2XK57hX+kb5uqpmuHhX2tfZiZjnuxcZKejnezZZd0hJ5vnmeUUciLWsJcoHliX6xgdXOHYpeIXlnKnW+/gXVNS7VTVcZkVFFqY2VYQVBrYGxoUFZHSjk9VVJaV1hJRD9KPDI/OzU9PDQ2Pjs3Pjw9QztHOTtANzs+RDsuQ1JKRz4/PElKRkNFRD5ISTkxNzQ2QT4vLjI0MjUyLSkuMjYsNzQyJh82MDs1Oj1QcWg5J1dpXEJPVF9lUDVHPWBMNjIwop2SpbGto6u8raa0pqe1uryxur62tbO5uLKktLKgsLGinquvo5emuK2ksbCctLepoKWeoamksaesqaOZm5mnnZWTl5eQkaGmn5WTpaqwpqKWk62gppKTn5ujpZ6VmqWmoJqin62ZoZ6dkJSboZ2cpZWdlZminpWYlZGahax7d6h2o42IhqlvrYqCp4OYmKGKkpuLon+TmomuhICCs1xys1KufYKCo39y2H54hn6PnYaamXavhoeRnId2tGGaZZqCgpVtklqwWEuadZh5ZmCsXnV3iGiYiGtdr3eVno94bDV5yK6yX0JUb15nYEVQbGBwbVZWTS5mZWlTWVA7QkVATDo1PzkxPTwxNj85OEA9OkM6Rzs8Pzo+PkU5LUVVSkVAQzpNS0pCSEc+R0s5Njw0Njo+LzA0MzMzLjIuLjE4Ki4zMiUhMDM3Njc9UGtlPiZWZ1xAPlZfY042R0JfSDo5OaCelaC5sJe0wq6os6ipsrq3s7e+uLextLq0pLeynrOsn5+oq56Up7WrqLCxqq2zo5upoJ+nobWmpamimJyUpKCTkpuXkZShpJqSkKatr6ahlZmqoKKOkKGZp6SflJmlqJycpJ6snKGcn4yTn5qdoZiZm5aXoqCTl4+mnYapfX2leKGOjYKqcK2LgaeGlp+hiZiYiKODkoiUq32Ai515b7FaqIKCiJ96dNmAd4h0qIGOm4ySpHuUj5+EerJenWSgfoOVbZJdq1tak4CRf2hnqmNxfIJrmIdzXataiaCOa29lT0pDoVxbTHRdYmdOW2FfcXNfS1c3SpyYWEdFPUhHQU0zNUE4Ljs+MDVBNzhAPDY9PEY/Ojw2Pz1CNy5IVkpFQUg2S0lOQElLQEVOOjpANS46PjEwMjE0NCsqMDUvNywmMjEoJCQ2NjcxPFBlZUEmVWZbPzJVX2JMN0ZIX0MyPziinpqawauXtMKuq62ppbSwt7C1vrm4sbC1uqi6s5+vpJ2kpqaek6mvqK6otKuprqGYoKCmpKO5oaKroJaakKGflJOemZOXnp+QjIyosLCnnpebqKagjJGjl6eqppSXqKednqCiraShnqGMlKGYn6CSnpeclZ2hlZaNqpyPrm1ytHOpi3WKp3O0eHOzgJGko5Gdjomkh5B3uHCNe4uiamu2WqGFZZeXaaCip26UcrR0k5l+smqFkYetanWzYZ1mom+Hk2uXXa1gTaF8hpJSc6NreH9+b5iHcVyvVjycd2ZUb24uXKdPY1NrZWJtWWNdYXB7Y1RbUj49bnEzQ0JAP0w6ITdANi47QDM3QzU4Pz8zOzxDREJKRk1JRjYySlRLRUJJNklKUD9ITkNGUD08RTUwOzswMTAvNzUsKyw0MjYvIzAwLCwdMjg5LzlOYGVEJ1VkWT4vVV5hTDVGTF44MUM4ppybnryhm7LAr62rq6e3qbeutb+0uq+ut7aqwLWoqaGbpaOhnJGpqae0orKnramgl5ynn6SruJ2jrJqVmI6jopWMnaCbmJyfkZOUqrawqJmVnKypl4yTpZikrKKRlaqxo5+epquxmaGjj5iilp+blpyWoZOcqZyUj6qZh9SSmrtzsMOAw4Z+1ZabuHiIkJiMmIuMp4h6pLZ1fnd2woKasmCDunnAfXa4Y7WBjIepfZWBq6lxe390vIinoGmdYaaOr6F+jHWHqn2+b3O8dLKDdHiBim6aiHFujaR0vV53fVphebxrWlZcanleamFmZ2Ntd29ZXFpDQEB0QENHKzRHIic7PzEwPD83OkI5OT1DNDxATlpeYGBgX19aUFBSS0VGSjRITFJASk5FRk9CPUU4ND05MDIwLjg3LSouLzE4MCItMSwzHiw8OjA4TFhhRidUY1g8L1ReYEs1O0xbLTdBOaebnqK9oZeyw7Ctqqqrsaa3r7bDr7iwrbiurcCwq6OinaOhnJuQqKOpsqS0payknpWaqpimrLicoa2YlJ+PpJ6SjJyinZedmZGVkq+5sqyWmKSop5SQlqSbo6ydkJ+oq5+an6ijtJ+jpY6noZSimpyYlaOYj6+fkpSpnoWQmLZ/j5GMt5V4gpOatXdta25zb3mQhY+KdJ/Bu72ae4GxqHCAc5G5g32Hho2HjXyKh42YfKS7ub2cdHm0o3R3l3Z0sHWZnmaHao21dHJxeLaMXn96fYlog3luemOLrHB1hX9YW6dqRWVaVGZgY15jUWdncGx1Q05RTUQ6W00/SjM7LyA4PjsuMz1BOTk/PTs8QzZCVFlaWltbWlteYGJgXVNHR0g0RElUQktOR0VPRj9HPDc/NzA3MC85Oi4sLy0qOC8lJjIoNCQoPjcvN0xUX0cnU2JXOCpPXl09KzpWVSc+OzynnqGiwKWWtcO0q6qorKqpua6wxa2zsq21prO3q6mhoaSeoJ2Zk6qjrKqltaemn5uVoKOdq6S9pqCplpObkKGakY6hp6GSnJeUmJSxtbeumZ6kpKKLkpGmmqWqm5WnpKWbmaGopaekqqGSrZ6XpJ6Xl5edno+vqJObpaGNan1pmqV3hnJ9mo50eWSHe72+wLpvk4Nylohhc2taX5uKYWOIj5VrYICWZG6ed2OWbICalZRlXmBicJmIaXKLfYaVZ2t/cnR4fX9iW3d0gWhQXW2DfXuLa1hreoJzSkpvhnBOdExFWF1nYUxbV2djX09bbXRpcVJRREVNO0dJPE0/MiwyQT84LzU/Qzw5O0A7PUM+UlZWV1laW1tcXWBhYWFgXFVHNURGVUVKT0hGUElJSDs4PTUxOi4wOzouMC03Nj01JiIvKjIsJTs4LTdKUl9JJ1NfVjQpUF9MKDI9W08nPzI+qaCoosKjm7W7tqOspa6np7SxrMirrrKqs6K9sLGln6KnnaObmZmrpq6jpLSopJuYlKCapa2nvqeopJSTmpWfmZKXpKmokJ6RkJicsLO/rZynnqeiiZORqZqoo5qaqqCjmZqjp6yjoKyjmrGblKeglpWdn52WsKSXoKeYmpCbm6Ghl6ShmZyZmZmPlYFnbX1xd5KYlJKGjLarjYaYlo6KjJiWh5SVi4STlJKJjpOUmJSYlpmfoZmak6CcjYJ6pYVta32QfYB1ioqBcYJ4eXZ1iX98impzgXSDdWV3fXdrb3ptX2RdcGhNWVpmamBXWm94bW1mVU9GUjlPWU1STygrOktCNjM1PUBBOTpDPjxFTlNTVFZXWFpaXFxgYmJhX15eW1RLQ1NHS05ER1BMT0k8OjszODksMjs4MjApNklSTzgiKSsvMiM0Oyo3Rk9bSiZSXlMxMFReOis9OFxKLDwtQLOgs6LAoaSysregqaWyp6WvtKrHqquvpbOkwKezoJ2jpJyjlZWfqqasoqK2q5+YlpWfl62ppMCeq6OUkZqWnZiSlKGenqKnk5GZqKezxLCaq52rn4+Wlqidqpucn6uYoZqcoqSvp6KmqJ+umJennZmZoJ6dm6+gnKGllJaRl5Oen5ShnZegjpaTioqNjpeukHyWnIOSgourqYWAmZeJhI+eiHqEkIiGmpKIh4qWj5uXjZCXnaOVmJKQnI1/jmehs6+FioV2e5KKfXd5em9meY+BgIlqdYF5iHNpc397doOGgmp1ZHpmYGplY2Rma1lse29pal1TTFBEXlRFQD8+LDRARjs0NTs+QTs8Pz4+SE5OT1BTVVZWWFpbX2JjYV9eXl1eXVhWSktMQklPTVJKOzw6Nzg2LzI5NjQuKCYkLTEuLykrKjclKzwoNkNNTUQvVFxRMDVOWzE3RTNbRzU8LEC0oLmwv6ysr7KxoKqnsqyirLKvxK+pqqKxrbyis5ufpqKhnJiXp6WppaSlsrSelJOdmZmvpa2+oKuikJCdmZmUkJWhnJeonISeq6yjtMi0oKqkqpaVl5qmnaianaOqlJ6fnaCqr6qmpKyjr5ufoKGXpJ6cnpyuo5iep5KWlpuQopeWp5yalmWCknxlfo2akGN5jm1oa3uSpatqZZuYfWeGimVlaWh7jqKPbGiNmJGjd2tqipiinpdza216hI6IelhmXoaDXm2MioF2XGhzd3aRgIiCbniCeH9zbnmEdHaJh46DfGqHWV5sdGRdc4lpa3xwa2NfUk5XSWRYQUo0PkY3P0ZENzE8PT9BRDs7REdISElMTlBSUlVXW15gYWFgXV1dXV5fXVpVT0RIT0tTTj0+PT02NTM1NTU0KiYmJSwqJS8qKyc2KiQ7Jy9BSltKLzdaTzYpRVkvRE8yWUM7Py49pqC6vLqvrLSxqqWora6wpq2ssLuwqKajra2wnquWn6OdoZmZpqqcraOlp6myrp6Uo4+ir6W1uaWtoo6NmaCYk5KaoJmZpZV8pq6jqLTFuKWip6+enJWeop6jm6KoqJGeoZ2hqrCsrKWroaqbp5+ooKyWoJulr6OWm6iUn5yakaKVnKmXnX29g4hytHKEnYataHi5xLhxlKOjeqaZmXKrgnzLwMC7cYyjiIOefJeZiZ3AvYGWnZ2MnMHBfIJ8k42aw8B9bKWyb4yBb8p6f5t3kIOOgXV5gH95cXp/h3B3hYyTeW14lGNnYHhkYGWCYl5zZ2xkZFlMVklRWkhPRDJJRT9EQj4vPD8+QEE6OERDQkNFSElLTU5RU1ZZXl9fYF9eXl5eX19fXVxTTVBHVU5BPz89NjQ2ODI3NiomJSMpKiYuKyopMTAfOSojPklbTCojQlAuI0ZbM1BZL1VBQjsvOJajucO1sLDBqqiUo6+psK6tpbKzrqmkpaWvqp+rmJqin5yaqqahnKuipKijpLSknKKSpa2qtrOnraGRkJmcpJKQn6GYm6CdiKetpayuwMCxoamvqZaSn52hmaKjqaOSoKGdnq2vq66opKSooaalnayokaOaqKypmpynmqqflZajlJ+hlZt+zpR4eqSBeZWWm1+uj16OqIKjoXynlptzq4OAr15jjap7qIeFoHSXk4izY4KrhqCNjbNqhK91fZeIt2KDrVqjzW6Qdnvae3+ZcH2IknZ9ZXuHdnZrfIdufYWQkX5tg5Bgcm1waGBfeWVccWdpZGdgUlRTV11LT0Q1QUhERDg+NjtAP0E7PThAPj8/QkRERklKTE5QUk9TXF5fX15dXV9gYF9fXVpXT1VKPT8+PDU1NzgxNjQoJyQhJywmJi8oJiszHTYwJDc7U0wrLC1KMCc7XDtMLSFQQEY0LjGtwsC/tbSwuJedkaOqqK20q6Wyq6uqoqumrqqfppuZpZecoq+foJ6op6KloJ+wq5qdlaauq7CqqKuflJGan6SSj56lmJ6no5+upqyxqL/Hs6ipsa6Wkp2coZefqaqelKCfnZ2usKmsq5ypqKWiq5KsspakoaqpnaKlpJ+un5GYpZeemZKTkJegcYWMl3WFqIZxsX2ecqx/op+BpZCfdquCfa1/nHOtf6yHhp92mZJ7fJd+qoihi5GMnX2re4mVkKCBe61XncV7j3CTwX2BlWx1cIxtZXZkhm5hd25yb4mKko+DbpKRZnB1dXFhZ21mX29oaW5nZFdUXWFaUlNDOUlJQEQ8Pj1ARkVDRUE9PDw8PkBAQUJFRkdFQENJU1dZWlxdXl5cXl9hX15eXVtaUkM+OzkxNDc4NDUyJiMfHCAxJyAxJyAnNB41LSY3PVdKLTwoPTEpM1dARiEcRzpDMS4rsNPGxrKzoJyijqKioqyutq6osaWoqaatq6umoaOdmKKVn6Wrn6Gln6ioop6dsKyXmpaop66rqKannpeUmaKhkpSgrZudp6OwraWttau6zbGtpq6rlpWcnaKYnq6snJagmZ6fqbOrq6ucraulo6yarrGhp6utpZekqaenr6CRlaKimJOQhKRqpHWJeql0erJwgqaKmYxxiaCahqRgYVKshX+ug5t2rYKohoWfe5mXhXpmgKOJpJiGgqN9qX6CloiuX3ypVp6jkoF6o5+Ae8OuxItyr7OzuXFiqa/CdGiMjJiOgW6clXFvenh5cGxmZmVycGZ9amNdV2BqWFlVTU1RTENDQUI7Q0BAQkk8PTo5Ojw9Pj4/QT04NjtETFBSVFZYW15eXVxeYGFgX15dXF1bU0lCNjc5OTY2NCwmJCIgKCciKy0iJC4hMy0mQERXSCxHKzU1KjJQS0wjIEE5RDQsJ8PJ1tS/oZmrp6Cuop6vtLCuqKyip6WoqquppKagm6SenaWnp6Ocq5mirKCjn6+hnJqSq6S0rq6gp5qdlZOmopGboqigoKadsaamqbKtt8iytaqrqZaRnZyimJ+ls52ZoZSdn6esraWwm62ro6OqobKtoamysKGZqKesrbOhkZShpZaZkHupbJ6Eh3WreXywb4KljImflpaglYHSuLS3yYGBsl9glKmDpYiHoHqZlZp4qsl0maSUqKmQkpuNgZ2KmsbGeWehgqV0gZ+Ogn2vXW+0YrB1S6OHbadHgpNkjpCdknxxmZWBcXt1fnxuXGZqc3FmgWtfYVlkblxfWUlNTUtFREFCPkE8Qj9JOzc5Nzk5Ojs7OzMuNjxBRklMTU9RU1daW1tbXV5fXl9fXlxcXFxcWE1CNzU2ODUvKSglJiUkJiksNEVOUFBNRktKVkYqTDAvPS01T1RRHRw7PEYyLCSnpMDGuK2psqyspaKbsrirqqGlmqekqauqpp+mppiqo5+uq52loKyanqmlnKe1nqKXk6mqtbGsm6WcoJSPpayRmpyno6Gqp66ipaeqsLXDsbOqrKiUipecpZqho66ll6GVmZympq2csZ6uqaefrKO2rKCxuK6dma2msLGwopKWpqGYno2CnU54moF/n3qEo32DpIWHpp+dn5SEuHt8ebmCf8zGwrZ4m6GRi55+mpaXinafl4qll6Spf7CFnYaghKx9mpVjpm2kcI+FkIF8loJyrGCjcnGAmmC8fVJVdI6So5d7fpSTjHZ7c4eAcV1tbnhyaoJvW2RgaW9jZF1LTFFUQUlIRkk6OUs/QjEwODg2Njg3Ny0qNT09P0JER0lMTlBUVllZWltcX19eXV9fXFpaWllVU09IQDg4Mi4sKi4rKicnP1FUVldXV1lYWFdVT1VGPEUzOlBbVBwbNj9ILC0gi4eYqaukq7iqrqCboKyzsqWeoJWlra2uqqecpqebo6ihs66iqaayoJippJSjtaKilZeiqbS4o5uhnKKSj6GxmZ6cp6ahorCunaapo7azxbGtqaypkYeQnKecoqScpZeemZqapqWrnLGir6WmmK+ku62htrWsnZyzsLavsKSWnK6eopyFj9G1w7d5h46FkZOQgKZ5lKF3jKCShKWCinGqhoW1bnJpmqSclYqffZiZhoePc6+CppujjqaLk52LlZCbbnGyXaV0k3qcbJh/e5l8balhonFxf59ic7K4aHePlKaYfY2OlY56fXmQg25qeWl6c2+BdV5lZW9uZmhgSltYWDxIR0BVNEBGPjwqKTYzLjAxMykmNDo7PD0+QENFSUtOUFJUVldXWV1fX15eYF9dW1pbWFVSUlFGOjIyMy8vKysoQFFSVFVUU1RWV1dYWFdVVVVVUU9RW1UlITJBSCQpJZJzjIqtvr68ubSelqekrbShoZmUoqemrqqrmKajn6WhoLano6insKOUq6OOpK2jnZCamqqzs6ScpJyokZSWrp+fnqeknaidtpujq6S2rMSwqauooYyEjpyioKailZmZnJmcmaemqJmtqK+jppuspr2slLyvrJ6hrrG3qbCkmaevoaaWeaiQfXywd4qApKWInG2ycKGHrXyhj4OolZiArImFroWglaqgopeGn4GalYB7kn6rgJ2al4uqd52gkoqUkoF6r16kgX2mp2Sdf3yXcmqvXaRrcIaZXWBbjKBtlZGmmYKVj5qOfHyEmYBrboBjf3RugHpgaGZxb2loZ0NZYVs9S1QzVThCQkM4JCQzKycnMywgLzY2NzQzNTlAQ0ZJS01OUVJTU1ZaXV9hYGFhYV1dW1pXU1BPTkk3MDQyLiosQVRWVlZUVFVUVVVUVFVUU1RWV1dYVlVVUUhGSUojKCi9kpqDqMXCtsCznpqsoK23paOOm6SioLCvqp+loJ6tmZ65oaOroK+pmq6hkKuopJaJmpCtr6ymnqWbrJeYj6yhoZ2loZqlna+Zoqmnt6rBr6Spo56LgI2bmp+mnpKUmZqUm5qmpaabqqytpKWfqai+pJbBqqmhoKqwt6mrpJ2yraaol3WvfpCLnIWHfrqtipllsI1lla19oY+Dp5WagayKhLCGp5qkoaKRhaFdbGuBs2B/rXt7g4GxbWdumZmNibFbfrVcpIRryKJkn4B7u1d2tVmyfFKugHqsV4ChbZePqJuMmJKamXx6kaB/ZHV/Y4Z4dYF9YmpncW5nZmVQVWRbQVZgPkkoPjk9NCEiLCUfMi4gKjEvMDQ1Nzk5PEFDRkhKTE5PUVJUV1peYGBgYWJeX1xbWFVQTkpGQzU1My4vQFVZWFdYV1hYV1dXV1ZXV1ZXWFdXWFlaWltcWFdXR0I70p+ysba9urPBsqKcrKaktaigipqgnZyzs6mfpKGetpmhtKiqrJ6vrZ6rm5Wvp6GOiJuOr6uopqGlma6SmI+omaGdpZ+apKOmmqGjqrOqva+kp56cjn2Lm5WgoJmPkZqbkpqYqaCjmqmuqKWmoqSou56fxaWjp5+psrOqrKSduauqq5SAqZKjr46bgIekl5mQgoC4w7qDjpyThKeXnIKsioKviaecm6arkX/WvcKqYqS/vX1+o4KD17u4tYaWlISevb6EbaOCb6uEbJyAerKwx4Npq7C8rHd2ob68c4CWjqadkZySmqB7g5OefGN+e2WPZ3qDfGFsZmtrY1FhW1NqXEBVYkNOKT06NC8fHyQfJTIgHSQoMDQ5NjY3Nzs+QUNGR0lLTU5OUVRXXWFcX19hXmBbXFlUUU1IQz89QT81PVNZWVhZWVpZWlpZWFdXWFlaWllZWFlbW11dXFpWWFRXWruVs7Owv7ixvLKinK2lpbKmnYuYpcCquLKoosCnqLOdn7Kduqifra+lppWUsKuXjIObka6loqygo5yqn5eKo5Kmnqebm6GppJmgoqyuqrqtqKOblpJ8iJmRpZuSj5GYmY+Yk6mboZmqqaGqp6CjqrqeqMOin6yhqbGyp62nnrilrKyZc3aqpLiGZImgcGiukYuQbm53pJCZn4F1rpmUcI+LcZaopJyYr6RzbW1tZot4b26CmXCBempxaWeKmJaZcmlqhYhncYZkXYhiam9ZXGZ9dqZfYXCNkG5lZX+Mk4+hmZmak5mhfYmRmHdmiHhpj2x6gHplbWRnbWNLZFhKa1o6UWZFUidLOisjHCAbIywpGBsYLTIuNTo0NTc6PD9BQkRFSEtMTU9RU1ZcV1pcYGBhXV1bVFBMSEQ9OkFCN01YWlpZWVpZWFhZWFdXV1dZXV5eXVxcXF1eXV5dW1tVV16playzqLm4sbOqqaGtnqOyqpiSv7PFyr63qp/Bra6koqisn7qjpK6sraWNlq6pj4uFlpasnaaqoJ2ko6CRi6STp5mpmpekq6KXnqemqLC7q6yam5KSfISXjaWXjZGQmJWOmJWplqCZqaObsaadoqu5n6/ApqOxpKuur6irqaW1oqy2lYqhqaa3nYmWo5mIqpuRlZ2SqbOZmqKqoLKWoqGdn6KdoaWilaynjZOTjYeTnJyVkZmTmZGPlYWBpZuZlo+MlJSMkIeEfmeJfnSCdXOHinCnbHqTj5ORgIGNjpCPnZWil5qZpYSJl5B0apF3cox4eH16am1lZHBlVWBZQGpcSGRiUFkrRj0rJyE3NTAuHxwhJTIoKjY5OTQ2OTs+P0FCREVKS0tNUFBRWFVXWV5gYWNdXlRRS0VDPjk9QEFTWFtcWVdYWFhYWFlYWFpaW1xeX19gXl5eX19gYGBfWVlgppapqaS0ta6uorCjrZ+ftbGQjazIvsa7uqujpp+dp5+xqaO2p52ptaenkZitoouHiY+bp5WspJ+ZqJ+ekpSjl6iaqJqVp6KkkZyomaK2uqiqmJqQjXyBlYuglIqVkZaRkJSXppGgm6mgnLajnaart6euwK2itaSura6qp6extp+supiRpaOntqKSnqegjqqgjpOfo6uwmqCjsKiwl6OgnKOqn56enZesnpOaopyUkJarmo6ZmZeQl6CSiKGel5WHk42RjpWLgX5li4V1hnR3h4JznGqFj5KTj4l9i5WSkpiUo5SfmaSFiZuKfXOXc3uMgHN8f2pvZV9xamBbYFpuZFFhZVFaOkdHRT4yPT45LyomKykmHSYzMTY2Njg6PT0/QUFDSUpHSktMTVNTVFVaYGBpYWVWUEtBQ0I6OUVNVlteXltaXFtbW1xdXV5fXV5fYGFiYmFhYWBiYmJkYlxbY5eVo6air7GrrqOppqyfp7WqkI+dpLW9sK2to6SbfJ+ksqSlsamXm7imo5SZqpyOhoqJnKKPrp6ilaifoJKWmZuui6mWj6maqo2aqZCfubekpZmcjYh5gZOMmpOKlJGUkI6Sl6OOn5+onp+4o3+Dr7Wirq50oruhsJ52eJ6nr7iTdKujnol/q39kXGJ2oI6ln4SYfW2Ss52ip62qo2Wen5JzeZqYcYGZqZhtf6KpimWcpp2Sl5iWjJOckYaem5GWhJOIj5CSiYV3ao6GdoVweoV/f2Boh4mTkYpadZSQZ2iPj3N8qJycZnubioV5mWqFjIRveoBrcWVgd3Bsa2lcZmViYnFUWz5OTk5TRz5AVUQ6MS8eHyY0OjMwNjY3ODw7PkBBQUZIQkdGSUtNU1RVWVxgaGZnV1FKPERHPDhVUltgYWJgXl9fYGFhX1xdX19gYWFiY2RhYmFhZWRjaGReXWablaWioK6vq6uppaitoqetpJKWq7axs6ebq6itmHSNn7GgqKunlJe5oKCPnKSekX+JiJuejKyZopWnoZ2Ol5KdhXatj4mnm6mSmKWKnLu0p6CZmIuJdXeTjZaTiZORkJSNkJShj5yhp5mcsZWAjJu0nLKMko25pZ99p6J5oKy1f42NpZ6Di4aQsKqvjYuXpJt6gYushZyeoaaop4eVhZh3pZt6iJyBl6eDgnucs3qKhqGYmpWYloKRl5eEm5ljeoiQhY+QkouDbXCOh3l/cH+AhH2Fc4WDlJF3lmiSdKCadH2ZhKOgiZh/lY2GhZprj46HbHl8cnFoZXlwamxrXGVsa2Z1XV5JVExSQEU2LltVVTcpITA5Pj43NDM1Njg7Oj0+PkBEST9JRUpMR1NYW1lbYmFoZllRSDlFTDs+YVZeYmRmZGBhYWBiYl9dYGFhYmJiY2ZnY2JhYGVkY2djYWFonJeinqWsrKunrKCnsKamqaWZlK/Iv7Gil6iqt5+RhZ6tnKeioI6Qvp6ajJ+aoJB9ho+Yl4esnKGWn6GRjZOJhYCSp42Ho56klZmfh5+6sqedm5KOhXF2kImVkIqUj4+bjI+SoJKYoaSWnquHn7SJtJmtisqGqKyItoWMr4Guq4KojKaYjZ19qI9ze3ecj6eXaJWkebSMoJ2lp5KYwoF/q4iYoXKegJqlfpeFlbOBoX2hk6GQmJeBj5Sci5mSjH2Fk4eNlpKJg21zj4V+eXGGgIN7g3SEgJWAj8Vmf6mHj6NrnoWknYSagY6QiYyacY+Uhml5dnx4aGl2cmhobF5kcG1nbllnR11STTNFNTdOYmQ3JjM8RUdEOjY0NjU4Ozg+PT0/Qk0/TkpKTENQWl1cV2FeaWxcUUU9S01ASWNYXWNmaGdiYmJiZGNgX2JhYmNjY2VpaWNiYmJlY2FmY2JiaZSWoZ6vpqeopaufpLewqaummpSgo6SspZimrLmksIGiqZ2mnp2JlLyZk42hkZ6PeoSXlpGHq5mbnJqihI+Md5qcj5+QiJ+lnJeamYejua2kmpyMjH5ibY+Kk5CNkIyNmIyQkqCPlaGhmaCnfqGnh62dn5atj5ybnJCEf6CMqKyFo42pmYyaf6J1gZmUa4Ktdk2reIeNnJGap6aAqat9g6F7eqdqnn+SbGeYhpi3iZ5+bmBkWYOXgI18ZGiLcpl9eZZsXX2XbV9ScINcX2t4gl9YZIB8g3+WcKeqa4OjbnKlcJ+FoGpnoG1ccI5+Z1pghIFjWFFwd2ZudXNranBea3FubGpZaU9dWUY5QTVIRV9sNSxJRFJNTj04NDg1OTs2QDs7PkJQPlFSTE1CSlxdX1ddXmJ1YE1EOk1PTlRhXFxmZmlpYmJkYmRkYmFiYGJkY2FjaWtkYmRkZ2RiZ2VhY2iXlZyfuJ+po6askaG1u6quopmYoaKlra+hnrC2pKmToqGgp5yajpm0mZCLn4yVi3WClJKMiqaVlZien36ThYWspIebkIuaq5mbm5KIprGnoZWaiImAaW6Ih4uOjomLjZKMkJOjjZSfn5yhpH+TgY+ioJOfdpyUjqeBn6V+haeqgqV4iXyEmn6icHOUiJZ8n415bYabjJmPmqiZjoede4Kic3amZp5+d6RfmHp9lHSibpi3tLp0k4iDgLWoZIHGuHtwlbaMcoCao2NzrKtgfGmds35tfIaBjYKLmHF/o2xyo3SfhYGkYZ2ZtJdzfZifs3V0XJ6yg2tjcHV3cmlwWWxtc3NnXWpeYkxFPUQ2UkJaczM9U0dgSlI9PDM5NTo6NkQ7O0BKUD9VTU9RQEVfX1taWGBgfGRIQzhNV1VXYmFaZWZra2JiZWFkZGBhYmBkZF9gY2tuY2NkZGhkYmdmY2hok5aUoreYqpuTn42kt7SsraCaop2ko6avnZyzr62UmaKaoaWZmpWfq5uLiJJ4i4VxgJaNiZChj5OUnZh9kYqNqKGHl46Jk6SVnJuNjKmopZ6Pl4eEfmp7h359kI2Ci5CQiZCUoYOXnqCdn56LiXecmKGMn3Ghioaph5qkjZSlqHytjH56oJl6o5N4gXSWiI2cfZafhpuOmJqlhaJkoXyIlpCbjW2eaJuOb5qZe4CLp31yaXSrg5+DdKpolZpdm4V2hZ5nqmuAuGZcqHCBnGCVjF6ndnWHiH6dZ5p1hpOSl46An2+akW6nml6pf3m7a36qXI6EXbRoXW5yenhsalxxa3l6ZGFnWGJCUkZPN1dEUm81S1tbX05aREEyNTE8OzdIPzpDSFU+WVJZXT5EYl5WYFFhY31qRUI5TlxeWWRmWGZnbm1iYmVfYWFfX2BgZWNeYmRvcWBkZWVrZWNpaGdraZWbiKmzmqaIY5Sbq7qxr6yeppycqaCfr5yesqmun5ikm6GgmZeWoKOZhomNaYiAcnuXiIuWloSRlZiQeouElaScipSPho2fk56diZGpo6CajJKKgIBpgYZ4f5aMeomOjoiQl5t/lKKen6CTmHJon4mejotwkoyAqYaYnaCknqV7sK2joriXd6Ozo6SAiZR5nXurmX6ijpyaloiXcaF8hY2vtX1rmpGheX6ZtaOkq6iEmXybfZ6bf3SqWl1ve5aLeJ5iTH97eoVjeZdCTJ9Yomlxe45sgIiDmXWbeIaJsbN/gJuTp3eDnm50fpVwmnRrpF6VdkhlZGF0cn5/b2ZhbGl3fGVlYlFfV11VV0BaRlFoRVRXXWJYXklEPUI4QEE6SUY4TEVYQVdSW1dERmJcWmBLYG19ckVCPFVfYlplaVZnaG1vYmZnXmFhXF1eYGhiX2VjdmxdZWdma2RlbGlpa2mTnICvrJiDU16gprO5sbKomqKMnKycnKqVoq2lo6mQn56em5qWmKGdloiHiXeGgW95lYWRm4t8kZOXiHKBiZGhm3ORkIGJmpahm4WPqpyblYuLinyDbISFcYGhi3iGjYiHk5mWfJOkoJ6iiK2GfbWEjZ2ce6WVeamAlJqOiJ6ae6dod21+mXShc3J8noaZcJODrn2jg6WdmICjb16oZ3WiY2+lYZzTkH17mXhzdGKihpB+o3SkkHZrj7OMYIKYiXOqsqi8f3eDbX6/pqm0XZxte3CWbX9yonFdpGdzpmBopm2b1Jp+hptwe3uYbJx8eJhzbqmkZ2FlenKAhWxoZmRvdnhoYWNTXGZRUmJIWEpVYVhUXGZrXGVRRkNLTUpLQktFOE9AUU5YU1lPU1FgZmZqUmR3eXdJRkVjXmZaaGpUaWhqb2NqZ2BjX11dXV9oYmFpZXxkXmRnZGtkamxmaGxol5p/r6tUW0p+qa+xs6+yo5uZhZmqoKKlj6apoZqri5uZmZSZk5OhmI6IhXtwfYRofY+DlZuBd5GOj4pvf4aPk5Jsl5R8ipOUpZeDj6ublJKLhol5g3aIgG2Bn4Z3gJOGiJmjmHuUoqOZn4mzoaK2i3msp6SupW+of5mNhYCZj3qkf6GZhphynoSkrq+Kl4yAjaSNlYKtoJN2tba1yaFzlIuBn2Cel6ltepWHoZx1ooh3oH6Sl4uBcE1mo5JwmodzpXt5dGGDgWt9oGtxZF+ccX1zlmh6abO1s8amcph9ep1rnJurdoWbbnd5mGqafHaYc1FFfbNfandseohna2hjdXZxb1dfVFlpUFNpSldNWVRWXmlsb1ZoV01LQUpNS0hKT0JRS1BlY2ptZXRyc395fG51iXt7VFFPbF5pXGtpUmpoaWxnbGZjZV9dXV1eaWJkaWt7X11kaGNqZm9tZWlsZaCbh66lg2Q/k6Gyqq6utKKikICYqqKjpo2mqJ+ep4SbmJeOl5CQnJOOiIN6anmHZYONf5igeXWOiYyBaYSFkYOMhZ2Neo2Ml6aUhJiqmIyRi4GJeoB9i3hwkKGGeYKVh4mWoJZ/lKWnm5WVg2ZueJxsomR7cKV3m5dwZaaAlIl6pHmfloOXc553gYqVl4+5bpGKomJ9mKCUiG1yaaprdaBtb6Zgm2mLkGmWh5uWdaKBfppgjIaNdXCIYmigZZ5+aZt1b2NmiIFtcaJZXlpioWxdiItten1zcWSlbXiiZGenaJlzjJlwonBViZBwoGBmqFWLXlSYbm50bHODbnFpa3l0a3BSWVdXZlpUbUpaUF1JWGlpc2pZbFdRUkZWXExYU2JVaWtfeHR7fXB8fHKDe4Bzdo2AhHZeUnJiZ2NwZ1BqaGhsbG5oZGdfXV5dYGpiaml2dF1cY2hjampzbGZrbWOco5eleWRzbIqmraOpsLGmn4uAmKyen6eNo6KcpKOBlpmUjpqQjJiQjop7h3GAiGiLi3yYm3N0iX6Qe2WDhpSKipaagnyJiJiokoGjrZGGkIuCiX6AgI5yaY+mhH2Hk42JmKCPiJOppZyIpniVm36liJaKsZedj4Kulp6kdZOFeKlzpY+Emm6kooyShI2Du259pa+DhoWGkpWcn3ylenKolaCWZ55+b6xkloqWk3eobaqigYl2iYN3q5GmiGuRsGt2s4ypa4qFbW2fnpGUX32ri6p2fX6KpJ12n3yDpJWdoGqbiHisaJ+ujbZ1eL6NpJNag6eOq2F1c3VyfHVxY2t/b2htVFdbVmFiXWxNXVJeSl5tb3dgW3FZW2BbZ3Rlbm9yYnJ0YHh6fnlyeYNzhH6Be3uMgYOAdmJ4ZGNucmRSa2dob2xyamZpYV9eXGFrYm1se29cXGJpYmxqd21nbG5ilaSpm4B/naOWqamdqKatpJmKgpism5+mipymnquehY2bkIeckYaSjYyNdId7iIRwjYV+mJN0dIZykYNuf4uRh4aUj318g4eZp4+Ap6ePgY6JhZR2goeSbmyLqYCDjJSOiZ2fiY2TqaKfjn90k5eIfoF4k66ifoGacI+Fdo6Jgn17cqeMcX59epiWm4SQeXt/foeUlZOKdpCYnqCDe36Ja4yFW3l5cnpxaW5+kopygHWBj5STcYeEg2WMf1+BgIt3dXOUdW95bm2HbIOGXnVnd45lf4CFjaiafXR7lWqJiHCBdn2Hd25uaI10enyYeIVcbFh5j2lveHNycHh4cF1sh29qaFdbYFddZ2tkV2NVX1JgcHl5bWt3Zmtra3d9cnJ1c2FvdmJ0e4J4dXqCdYCAgIF5i4WDfXtuf2xkeW5eVm5naHVreGppaWVcYFpjaWVscXVuWltibGRsbHluaGtvYY6TtqemiqChmqajmKWcq6KhhISYrZKeooqbqJuqmIOCnIx/l5SHjoqJjXKDfI99fo+Ee5iPdHOEcZWFe3yRi4aGkIV5foCJm6WPfKihi4WPkIWVgoaOmHZyhKmGjpKdkImfnoiMm6aen6qDiI2Vmn5+iJasp46RpY93bpuOgXiQbn2ohXF+lXFrcH2CoI2Ak46LaGxcgouLm5qejnOVi4hxdGuCd3SBWXJuh5GCfn+Mal1qZXuGhIqAYGl5e5t7gouCdYGFgWd3ioZqYG9xgHVecYmAiY6lk4Rli42DbneLhHGGj3pxaGlmfYV7lltda2hudlx8enh2b3Rzg2hdbotsbGNaWl9aWW1yXGBiWl9eZnR/fHZwdWRra2t8fXN8eXVkbnVobXx+dnp9e3l6gIF+b4WJhHt9dH55c39pVFxxaWx2cHVna2dkXWFYamhra3FybldbZW5sZ3N5b2hqbGCLiqivoI+ioJmenZeemKijon6Dma6OoJWInaORppWAfJmGfZKZiomHh4tzfoGMdoWLgoSXinJvgHKYhoR+kYODhoqBe4GFjZyhkYOoooh4jpeIlIqLnJeEg3msgpGYmpWKnp2IiKGpnqGho4qHk5ucopmVqaCmpJ6RmoWTi3p2jY2Dp35/kpCTlJ2yppuVn5CNsZKXg6WMjJWan4mRm4KIkYprfI53eGWDh5GLfImehIeMkImJgYWFkHd8enSaoImGip2JhJN+fYqAf3Ruc4SBfXaFhomOpI+ChIyGgoyQjH2Hi4qRhHpuhIZ+eplrc2lhdItxfnt4d3B4dYJdXm+HaW9gX1pdXVNpclZlXV1ibWh2fH10b3Bla2ppgH1ueYByanBxbWeBe3OCgXd/fn+Fem2CjIZ8enh7fXqEeU5kdmpzbnB6ZWtlY2JgW3RlcGZycW1WXmx0bWh5enFnaWtljIecuJ6WoaCXlJiZlJikoJ58f5qsj5+OhqGdjJ6WfnmVhHyOmoqHhISHbnmBgXOBiH6JlIRta356l4eEg49+gIaEhn2IhY+cn5SIrKCEcoqQhpKRi52RfY16qYSOk5iXj5yWh4abpJ6hmZyFgpKamZiPmKafpJybj5V+jod0eoaNg6V7fY+QkYaYq6GelJ2QjqmNkICdjIiTmZ6Cj5d+ho6DcHiGcnVgf4SQhnWNmYGDj4OHhX+GhZVueXZ0kqKKjIWahIOMc3+JfHxxcXqGgnp2iI2DkaSOhIKOgIOKiYp3homLjX5ybYCCfW9pbG5oXnqAaH59d3Z3dnt4XWBxfm51YWRbXV9SZ25VZlxeYmtpd3t/cmxtZGtqaIF/bHSCbGx1cHpwhnluh4F2goB9hXZxgo2Ifnt8fH97gopgaHtqdWhpgmRqY2BpXGR1aG9idW1sVWNxeWVwentzZWptbYuInrWZoKKfkpGVmIqan5+fe3ifp5Gci4emlYyYmXp7jYZ9iZKDjYOCg258gHlzgIV+i5J9a2h9gpeJgYiNfH2GhId9j4ORnZ2TiqmdgXCLi4yShp+hioWMfKeRiJCTmJSWk3iMop6fnZWYfoCQmpiSi5mioKOYlZCZfIuCd3+Cjoagf36MjY98mKSiopOakZCmjI6BmpCJkpabfpOSfoeOgXV0gnF3YX6BjoZyi5d9iYxyjICDhYaPaXhyeIyYkY9/ln6HiXKBhnt7b3d6iYN5eI6LgpSjkoqEj3qGhoeEdoKEiYl9aHN+gXp8cm1saF9+c2l9dnZ0fXSAa19gdHdxeGVkWV9fUmtpVmZaYGFpand6gnJnbGRsaGaAgWtufmhvcWx/eYd7bIyBc4CBfoJ0doKNhn98e3+BfX+PaXKDbnRpYYdobGJfcVZ0b2xuYHhobVdqdHZjdXp7cmJqb3qJjJ6wkaSknI6Pl4+GnKCbnnx3paGOmICNo4qJmpZ5fIaIf4OKf4mDgX9ygHt0doKFfouReGdjfYaXioKKi3h9gI6EeZeDlpmYjpehm39wi4KRk4Wlm4eMiYOmlYWTjJeYkpJ3kZyfoJeTlnl+jpeXjZaanKOcl5GTmXeNg4F2g5WNnX6CiY2Mc5ejn6KUmY+PoYyKgpaXg5KVmX6YjXyIjYF2cX5ue2SBfYuFcYeTgJGCbIiDgoCJhWZ2b3uFkZiLfJJ4i4d7f4Z7enB9d4iEeIKOh4qXn5SBgot2iIODgnd8g4qHeGF6en91f3hobWZif2preHR0d35yfWNkYXNudXNuYVphXlttZVNkWWFhaWx2eodyY2tjbWZofYJsaXVobnBqgH2Cem6QhnKAg4N/dHyDjIF/fnqCg358kG12iXN1bWWKbGpiYnVWhGlwbmB4Z2xianZwZnl8enFgcmyGhY+brJamp56NjJeHhp+Tl5l+eKqdi5l6mJ2MjJmQeXyBjH59hHyBg4F4dHp6dH2AhICJi4BkX32LlId/hIZ0fX6LgH6ZhpeVmI6lopiAc4d7k5GJpo+MjoqSoJGEkpCVl5GLgY+XnpqRj5Byf42Rk4icnJ6ll5aLk5Vxi4uJa4SXj5l6iIiPiW+XnpuklJWLjJ6LhYGRnH+SkpWGmYh7ioqBenF6bHVsfH+Mfm6Gk4OVd3CDhH5/i4Blcmp7f5aXg36NdI+HgniGfHR2fnyEf3uBioKLkqGPeIOBdImHfYB0dYKJhXFifHZ7cn5wYnBkZXxjb3B3c3l4dHVid2BwbHZucF1cYF5ea15RXlljYWludHyKbGBqZWtjaHeHbmdtaWttaYJ9e3hvkIh0gYSEfXSBhol7g316gYR9fY5yeYt4eG1sh2poX2lyY4dncW9ld2dubGF6aWp9e3hwYXhti4CYmKmfo6idiYqShoqdi5WZfnivmY2Xfp+UkZeUiHd+fIp9fIB3eICAcHV0fHCGfYGBin98YVx+j5GGgIOCcnqAiHuQk4qTk52Upp2Vgn2BfY2KkaOJjoqNmJqNhpKZlJWOiYiMkZuSjoyMbYSQj5GInpmioJaUiJWPbIaXgmWEmI6TeomEkIpwlpuVo5OSiYuZjIF/kJ59ko6SjJmOe4qFh3RzdmxxbnZ9i3Rvh5GPk3F1gXyCg4h8ZnFteXyZk3yDiHSQiYBzh3htfnx/hHuDioaBi5Smi3qGe36KhHd+cXCBhoRmaXp1dnF8Y19xYWt0X3Fre3p6bXNxZnpeb21zbXNYW19gYmxbUFhZZWNocnKAiGddamlnYmdxjW9kamhlaWmBend2cI6FdIGCg3x1goiFeIV8eISFen+Jd36Le3tzeINqa19waHSAa3JvbXJnb2xlfGNugHp2cWx3d4p+opehp6Cmm4aLi4GPnIeTnXaCq5WTjoehjZaUkIB0fHeFeHl/c3N7hmxzcHtui3aAgYdvcFtZfpGNh4B/f3Z1gYGBoYeSi5SemaKVmHmKf4GMiJydio+GkpiWhYmVmpCXjIuMjYubiY2Pgm2Ji5CQiZyWoZuXlISWhmiCoYFlhJuJkH6Lg4uBd5OZk5+TkYmIlIx+fY6Xe5GMj46aknyKgIJvdnBsbW9xfIZqdISPmYtxd4B1gomCeWdzbnWAmY57h4R5k5B5dYdybod6hIp4iYSAho2aoYZ7g3WBin94eG5rgYSDX3R1dHJyeVtfcWFwa19wa358cW5ua253YXBwa3JtWVliYWJvWFFUW2ZnY3VwhYNjXWttZGJma5JuYGdnX2hrgXVyc3GLgHV/g4F5doCLgHiFf3iIhneDhXyGi397d4p/anFjfGOGfG5xbXRqaG9sdnhgcX95fHR1dICDfqSVmayep5aEjYR/l5SDkKB2jKCUk4aLm42Wjot6cnh1gnByhXRyd4lscG52bYh2g36AbW1VUYGqlIaDd353coN6g6KDlIKWlJmdk5t5kXuDjJKjmZOOiZSZkoSHl5qMlIuJjo6GnIOPiXtyi4WKjoecmp+alZN+knxmg5qFZoWfh5GEkYKJcYOQl5Ccj5CNi4+Md3qRkHqOi4ySlox8iHyAa3Zrb2tsbXt/YXp+kJeCd3qCeIOMfHpodGxzhpWLfYeFe5KPcXmDb3WLeYiLeId8f4mOnZuDe3p2gop8d3BqbIKEfGF5cW9tc3RWX3BicmJgbW96cmlwZmd1dWlybGJ3ZV1XZmFgc1RRT11nZV55cIl9YFxpcmJiZmaRal9oZVtncH5wbHF0in12fYWAdXV+jHl7hYF4iINzhoV/jIyEfHqUeGZxa4NgiH1vb2t6YGpudH91X3R9eYd4dHOFfXigj5mwnKWOgot/g5qIgI2fgIyalI+FiJiOj4+Ed3R3dIBxcIV0cHKEcGxqd26Dbn19bXRyUk2C38iS1pJ7cHWEdoWhhJR4l5KZnZGafJRzhY+eoZOTkIqTnJSGf5eWiI2Nh5GMh5t+jYB3eox+iYyJnJucmpSSeIx0ZYaQhWuHooSRiJeDhmOMkZmPlouXjI2KinF6k4h7joiKk5GJeYV8f218ZXJva2x7elyBepCQgXt9gICGjnp6aXNqc4qPiYGFhHyUimx+fm1/in2KhXuDeH+Nk5mYinx1d4OPeHNtZ3CAhW5rdXBpa3VuVF9wZXBaYG1zeWhsa2NneXNwcWRgeGFgVmxfX3dRTkxiZ2NdenGKdl1cZXZhYmZljmRhZ2JZaXNzbmtyd4x9dHqGgnV2fYtzf4Z/e4l+comIgpCKiHx+mHZlc258ZYh+b3BsgFlsbnl5c2B2enuNdnJ3ind5nouarpqfkIKFd4iVfn2LnoiGoJKPhYyYhJOPh4F1eHB5cW+EcG1vf3NlZXlxfW15fWpna2OkmsHcrvCgcmx2hXeGpIaTb5iSlqGVnIKScYaKopeJjZWKkJ2Wg4GWkIWJj4CQiYiVfYZ6dH+Jd4eEjZyamJiNjnWJdWyEh4l8iaKEkYmchIVei5OYi5CJjouKhIhse5WBfYiFiZGPhnaFfX5rfWR4dmpueXNYiXuSiIZ6f4GBhox/emZyaX+JjYmCgX+KlYRrgXVth4+BjoJ9gXh9jpSRl490cneHjHVzcWd1eoRjdW5xY2t3aFJhcmhsVmBvdXphcmRgaX9xc29bZHJhYlduW115Tk1NZWdiXndzim5cXWR5XmBlZYVgY2NfWWpza25rc3iMfnR3hIF4d3uJcYOEfX6JenSLiYiVhox/fpdzaHVxeWyMe250cYFXcXp2eXJkd3mGjGl2gIlyf5yGmKebo5KEfXGMlHh5jJ6FhqGNj3yVjYCaiIR7c3hwc2pwgmxqbX11X2F4d3txdXtnYGR869q1ycPch3JsdIJ3i5yKj2uakZCelpSBiXGEiJ+NhIuVioyYlHyNk4iDiJB7j4uFjoB/dXiDhHKIgZOblpSXhYt1hn1ug4CHhpehgpOMnoOJYYOUj4eKhoqNh4GHaXyTf32DhImOjYJxhn5/cXdodnNqdXdsWo18koOGfoGEgYWKgnZhcmuHgY6JgX5+kZB9boFrd4SOhJCBeoB7fY+RjpSIbXB5jIV0a3BrcnmCYXVqcF1sd2FSZXNpZlNgcXd1YXBgXWiEcnRrWGhpY2lZbldcdk1LTWZnXmJzdIZrXFxleV5eZGd7YWRfXVlrb2VuanR4in5zdIF+e3Z6iHOFg3x/iHZ2ioaPmIGMgnuTdWx3dnl4k3RueHt9WHmGcX9vZ3h3koJkdoaFcImWhZmhmqKKh3Rvkoxxd4+dfouaiYp9oH+EmoCBeHJ0bm9kcn9pZm14eFxgeXt7cXGAamFnYX/Vto+RpnducXh9cZSSjohrm5CKnZOMh3toh4qZhoGSkYaHmI58jY2BgYmNe4+MfYiEenN6g3pwh4CVmY6Tk4CHdIKEdIF+iJGbnYaVj59+iGKAk4eFiIWLjX9/gmd8kIB+f4KMj5B+bYN8g3VsbXd1dHd2bGOOgo+Ahn99hoCFiX9wX3FvhHuOi4F8fpCIenCDZXmBiIWKgHqEfH2RjY+Rgm1ueYt+dW1ua2t7f2RpbGtabndaU2pzaWJRY3N4bWNmXlprhG50YlxoX2VtYG9VXHBPSU9nZlxob3KAbVpcY3NgXGNsd2VlXV1abG1jbWp0d4aAcnB/fH10eIZ4hYJ9gIh1eImBk5V8iIZ2iIBveHl7g5NvbnuBd16Df3SBbWl6dJRzZ3OIfHGRkIOan5ughoh2dpR/bXeUmH+IkYSKjpp9jJp3fXZxb2xqYXV9Z2JqdXpaYHh8emxwf2VjZ2dXnY9fcnOWvcWFd3KVi5GAdJmNh56UjYlzaoiOlYB7lIyBhJuMfIqGfXyIjH6Th3SHhXZ2fYFxdYaBnpSGlI6CgnF+hnOCeoiWm5aGk42dgIhmfpODgYaEiolygn5nfYt7eX9/h4uPfWmAfYR2ZnB5eHN4dGxrj4aLgouAeYOBhISAa15wdnp9i4eEe4COf35ygGh3gYWJhIF3gnp+lYqOi3xta3qJfHZ0b2hofndlXXJkWXF0VFRvc2liTmh1eWdhXl1ZcIFwdFplY15rbmFxUFpsU0RUaGJabG9ufHBaW15tY1pjb3dkZ1xdYGtqY2xqc3eCg3Fvfnt/dHWDeoOCfIKGdn6JgZaReIOKdIGHcnl5fo2Qb297gXFqgnl6fm5tfHaVa2p4hHRrk4yFnpigmYWIb36Mdmp5mY+AgouClpiKeY+Wb3lzcWxqZGB0e2lgZnJ7W2FyfXpmcHphZWSOsbJ3S2JapdvSmHN8ko2ReX+XjIWako2Hb2yFkpF6eZOGgISZinyHgHl4iYqDlX9uiYZxc317anmGg6WQhJKMgn5ufYF0gXeEmZeSipOPlIWIcHuThH6Eg4mDboF4aICFeHJ/f4OKh3xlfH6EdmNxc4BpenFvdpqNhoSLfXd5gYV7g2tcb3xyf4eDiHyEh3qIcYBtb4KFjIKCcYN3fpaKjIN3bWx9hH52emVoan5yYVp4W1pzbk9YcnRnYEtud3ViXlxbWXV+dG9YZ15ma3Ffb09YaVM/WmdfW3FrZ3pyXFtZbGVZZHF5X2hdXmVsaGZraXF3f4dvbH9+gXVwgnqAgX+DgHaBhYiXinGCjXF7hXx6eYSUjHVren9scH51f31vcnx7k3BvgX94ZpGKgqGZnZKDhmeHhHBnepeKf4CFgpqKgXyNjWl4cmxsZl9hb3puX2NweVxkbIN6YHB2X2Rl1eu+izM6PoyPgHN6hoqQjneFmY5/lI6Nf25thYyLdXyPf4WClYl8g3hudoaEgpV2bYeEa3V7dWV5g4SnjIOOi4J8bX5ydIJ4g5qPio+Rko2Mh397koh5gIWOg2yAcmmAf3htfHyBioN4YnmEgnJkcWl/bnZydYKdjIGAhn9zdn6Bc4FwW2t8c3iIgYp7hn98iHh5cGqGgo6CiHCAd32TiYp9c21qdoCAdXVcaWl5cVlXflRbcmZNW3NyZlxKcnlwXVxbWl12gHZqWmJbaGZvY2pOWGdSPl9mXV52ZmB1cVtZVW9kWmVxeVtoXmBmbWhqa2hweH6ObWqBhH95boF7fYF/gnp1gYGMk4VwgItueH2Ae3uIk4mAaXt+anR8coZ7c3Z+f4x6eIR+fGuLjIObnpeMgoFtjX5saX+Pjnx+gIOUgn99iohrdXFnaWNbY2dzb2BibHRhaHCJemFzc15iY5ugkG5dNluwtnVrgYp+lId3iJmHdZCMindwbYWChnR5iXiJfZOIen9zZ3WIfXyWbm+FfWh2eW5leomFpIeAhoyJfW19dH1/e4qXhoCTkJiJi4WKfJCKcXx+hnxpfm1rgHt5anp3goeBcmB3gn5yZHJndoNudXyGlZKCfoOAcHd6fHV/bVdtfXVziYCFdoZ0gol6d3Jsh3+Of4NxfXt8kIeHeW1taGyCgXRuXGhmdXJSXH1PXXJdT1xzcGRWS3R5a1haWlphcoF2Yl5dYWdkaWpmT1ppTkFiZVxhd2FcdW5YWFN1Yltlb3NYal9iaGtnbWxpcHd8k2xphIp9fHB/fnuBf4J7d4CAiYyEcnuHb3J3g397iY2PhGp+e254eXaKd314gIKHgIN+fnpthIyImKONhYR7dot5a22FiZJ5fnyCkoCAfoqEcHJwY2ZeWWdfcHBgYGhxZmpviXRhc29bYGRqdnt/v52opcq5coaFdJV+eomVhHSSjodyc3CDeoJzdYZ0iHeUiXl5cWN2hXl/kmhxg3VmdnVjanyEiJ6Cf36OjXxxfXKCd36QjoJ2lY2UkIiCiHuJimx5eoB1aHtpbH95c2l6doCDfWhgd4d9a2p0aHuBanaBjZKVf3x/f3J8d3x0f2JVdXtxcoeCgXuBcIaKd3hvboKBi318d3x6c4yEgHVncGdsiIFxb11oY3RvTGZ3TV9vVlRadG5jUVB1eWJSWFhdYnKDdF1iXGllZWNrZFJccUlEZWJcZHFeXXhoVldWeF5cZm5pV2xeYWpnZW9uaHB3epNuaYiMeX1ze355goGCfXZ9g4iGg3B2g3Nud4KCfoiLlH9xgHx4enqBi3WDeH+BgYKEeoB1bn2Ji5ueiH6Ge3eHfGh1ho2Ren+AfImGhHaQgGdvbmBlXFhmWW5zYWFhcWxsaIluYHNpWV5jbYB3qdqpyIeIs3OLenGPdn2JkYF7lIuAdXR1fXZ/b3B/bYV0lIZ4dWxgeYB4h41lcYJuZ3VtW219gZCTgIB4kpF8d3pshXN+j4qDcpWKkY+IhoZ7f4ZtdXd/bWh3ZW18dm1rd3d/f3xhYniGemh1dmN+fGh1h4+Oln12gXZygHp9bYBaVXF8b3OBhX1/d2uIhnN4anN/goJ8eXt3enGJf3tyZnNkbYuDbHNaamB2Zklvb01cY1hXVnluYlBTdXdZUVZYXmFzhXBdYWNtZWNeb2NVXnNHQ2dgXmdpXVp8Y1JWXXZbW2dsYldrYGFuZmZscGhwdniPdGuOjXZ/dnh9d4GEgXt0fYOIiINvcX91cXV+hYGIjYt7d394hHx9hYd4iHx9gX2EgHt+cnV4i46fjIl7ind1g3pefoeajXmHhHSGh4V3iXtibm1cYltbYVZqdGRhXGhvcGeHcWFwZldcY2t/fMrOh7qia25vjG5yhXN+hox/e5OFenl0eXR0empsdmOEdpKCdnBnXnyAeIqHZHGAampxY1hte4aciIKBcpeTdn16bYZvf4iKhnCWjpCIhoyEe3l/cnJwfmdocmNueHFqbHJ4fXx5XWV5gHhpdXlngndodYiMj5Z+c4hqcH6AeG59XVdvfGxzfoh6gG5uiX9wdmZ2fn9+gHV6b3lyhXp4cWVxYG2MgWtyV2tfeV1JcGxOWFZfVVZ8a2JPVHZzUlJUV15jdoZqXmFra2ZjWm9iWWNxSEFpXWFnX1xWfF5PVmZxWltqaF1YaGFfcmZqaHFncXN2h3lulYp1f3t4fnmDiIB1c3+FhY6DcG97eHd1eoaFhoyGenx/dYt/fYaDhId/fn59hn98eHZ5dpGUn36NfYtudYB6ZISImIZzkopvhYWCeoN1ZG5qWV9bXV1UaHNmYVlkcnJngXJha2RXWl9pf3i+rnugt25jdYhpdX1ze4WIe36NgHd4c3duenZlam9gh3WOgXNqYl59dniKgmVwfWdra1pWb3iLo4GFfnCZknF/dnOAbH6Aj4ZxlIiNiIWJhX15dXNwaXpham1hbXZqZ2treXd6d1pmfX14ZXJ+boV0ZnaGjYaXgHGMaGx7gnRtdWJbbXpqc3qJeoBldId9bXBndH12fX5wemp5eX94dm9ka2BtiX1sbVVqYHhWTGxtUFNQaU5ZfGhiT1V2bE1RVFVfZ3eEZ15hcWlnYVdpXV1sakpFa1tjZVdZVnpaTldva1ldbGVcWmVjXnVmbGVxZ3NwdIF4cJmFdn9/eH98hod9dnOCh3+Vg25zeXt7c3OFhoiJhHmBfXaPf32FiY6EgYN6fouDe3d8dnaZnZh6ioOHaXZ+fW2FhZWBco+CcYaCfoKAcGZsZ1hdW1xbU2VxZV9YY3N1aXZwZGViV1tbaH9wb3KAc4plZnqAa3Z3dHWFhniChXp3dHZuanpwYWhrZ4Z0jYRuZl5ee255iHxnbHdmamRWV3NwjqZ8hHt2lpBze3F6eGx5eo+DdZd8iIaEh4R9dXFzbWh1XW1pYG11ZGdnaXpve3JZZ4F3dWhwgHiCdmJ3hYt9lYJvjGtue4FxZXNlYGp4ZnB1iHl8YXWDdmprcHR5b3l4cntlfX19dnVtY2RgbIZ8bGpVamJyVExrbFBNT3FIXnxmYU5WdWVLTlRYYWt4f2ZeZ3NqZWBXZFhjcl5MTGxZZGJVVFV0V01Zd2VaX2xhXFtkZV93Z21ib2p0b3F+dXSZgXh/gHiAfoaEen12goN+l4VucnR8e3RxhYWPgoF6i3Z0kYB8gZWOgIWEfH6Mhnp+gHZ7o6aKeYmGhWx1fXx2hIONe2+Gc3qFfYKDdW5qaWVWXVtbWlNjb2VbWGF0e2pobWhgYVheWmmAaWtwgGhtYml7emt1dXVwh4J6gX53dm56aGp5al9lbmiBd5CEZ2VYYXZofYZ5bmlvZmZdVVhvaI+od4B6fJCNeHRufW1xdHiNfneUdIaDgIaJdmpzd2hpb1xtZV5uc19nYmp4aHttW22Dc3Rqb4F+enhid4WFeZGGc4hycHp/cmNxaFttdWRucYZ6d2FzgHBnaXdzcWt3dnN1YoJ5fXV0b2NiYmx9fGtrVWliZ1RMbmlQSFNsRmJ5ZmJNVHJeSk1VWmZteHtmX21xamRdVmBWb29YS1RpWGdeWE5WbFRLXXpgXF9sXV1bYmVgemhsYW9wdm5vd3V6mH13gIF5gICHhnp5eoN9gZOEcXR0fnp2dIWIkH6BfZFsc5WBe4KfhX+HfYB+hoKAint2hKyff3qIiIRscoN7doGAgnVviG59gHSKgGpvbmVkWF9aWlpVYmtnXFpfdoJpXm1sXGFXW1xrgWVydH1qal5teHdpdXhzb4d8fn56dnJsemhpd2ddZHNoeneSgGNiVGNuZYGEdXZmaGlhV1ZZaGSQqG9+d4CLjXlwbntmd215inp2jnGEfn+Ah25kd3RlaGldbGJecG9baF9tdWV6aF10gG5ya3F7f3Z2Y3WGjHyJiIGAeHJ2fnRhcGxYcHFhbm+CenNjcYBsYW16bmpoeXhzcGSEdHh4dG9jYGNtc31pa1RoXl9VTHVkUUhXYkhjd2ZiTFRxWUtMWFlpbHd7ZWVucmZjWlheWXdnVUpdZFhpWVlJV2VRSWN5W15fbVteXWJkXn9pamBudHhtb252g5d5coGAfX+JjIZ+dnaGeIaMfXR1dYJ5enqCi419f4WJanSXgXuKnX1+hXmAe358holzcY+ujHt7h5B+ZnGJe3R+fXdzcIZtfH5tkHpjcHBiZV1lVlpZV2RmbGBdXXSGaFlwbVteWFpcbHticXd2bWNcb3V1aXZ3cm+GeX+Bendub3RlaHRlW2d0ZnZ2kXlfXVJlZWmBgXN8YWJpXFRYXmNkkKVoeHSChZB3bG14Zndse4N5dIdygXl9eYBpZXdtYGdhX2pgXnVrWWZdb29iemVbd3xrbm9weHl0dWVzhJSAiYOJe3dwcn1yYXhjWm1uYG5vf3pzZXGAZF5udWhjZnd6cmttgXNxe3FwYV1kbW99ZGlTaFlaVU56YFJLWllIY3VkYUpVblVKTFpXam1ze2RsbHRjYVlaXGJ3XFRMZF5ZalRXSFlhTkhrd1lfYW5bW19iY12FaWhibnh5bW9qdoGQeW2CfoCBkoiEgXd1iXSMh3RydnaBd319foyPgX+TfnB4loN9mZJ5gIB4eX5/c4eEc3CZoXt7f4mWeWV1iXpzeXdsdHB/bHl8cJJzXnBvYWdibFRbWldpZG5mXFxyiWVTcm1bWVhXYGx2Y2p1ampfW291cm51dHVrh31/gXx3b25sZGlwY1trcmR0do5zXFZTY19wfn5wgFxhY15TWmFcZJKfZXJxhYOQc2tpeGtubnl5enGAdn9ze3p7ZGZ2aF5jW2FoXF93aFdiX3BoYXdhW3x2ampybnh0dHVpcYKWhIh/hXZza3B7bGZ3V1tpbGFvcX54c2VvfltgcHBhXmlwfWtqcn1wb3Zpb2BaZGtte2FmU2ZVWFNReF1TUFpSSGR0YmFHVmxRSVBaVmxsbHxlbW9yYVtaWFptcVhTUGdYV2pUVUZaXU9Jc3ZZYGNuY1hhYWFejGpjZW16eWxvaXZ5hntrg32AhJp8goR5fYhtj4Zxb3Z6fXSCgn2Lj4ODl3R4gpSGgZ+JdYGAgXR/gnCHg3Zvopdze4aMh3tmd4tvbnxwZ3hxe2xzdnONa150b2JnZmtTXlxWaGJtbVtccYxkTm9tXFZXVWZpc2hjdGVlXltwd29xdnZ6bIh9f32Id5BzY2Rrb2Fcbm1jc3iHa1pUVmFid3t8b4RcY15jU1pgWmOWlGNucIKFiXJpZnhtZHJ1cXpreXR1b3t/dl9nc2RcX1diZFlidWVVYGFtZGFxXV1+b2hpc3F0cXV3bG2FlIOKfIZycmdue29xb1JaZGlkb3F+dHNibXVVYnFqW15uZXxka3V8cHFxaGxeWGNpanheZlRkVVdRVm9YUldUUEhlc2BiRlhrT0lZVVduaWV8aWx5a2JXXFZcdWVUU1dpUlpnVVRJW1pQTnl3W19lbWpaYmFeXo9uYmdsenZub2l2dn9+bYOAfYaYe3+HgYp/a5OIcmd0gHt1gIN+iY5/jJNzfYqRhYefhnt/hoxzgIZzfYJ1bqSMc4KNjHd4bnqNYGV9cWd6dHltbXF3g2dkfG1jZ2doU2BfVWdgbXBcXm6OaE5qbGBVVlNvZ3NrZnhlZl5acnZuc3x5dG6Je4B3nHt6a2FlbG1eYG9qZXF5fmdaVVdfa3d6em6CXmFdaFZZYFhknIhia3CBhnx2a2l1a1t1cGp5aXVybm98gXNZa25gWV5WYmRYZXFjVF9iaWFibFpgfmtmbHR1b214d2xoho2AinuIbnFmcHtscWxhWF9nZ21xf3JyXmlsU2VxZFVibWF4YW90enRpbmppXldgZmh1XGRVYVZUT1lnU09dT1BJZXBdY0daak5KYExZbWVgeGlvgGVgVV5UXnZcVVNhZ09eY1VUS11aUVp2dl1fZm1oWGNhW16OcWNoanhyc21ndnR5gnOCg3qIj398ioiOem6QinRsc4F0f3+IhYeShJWPen2Mj4eRm4SAfI2Ecn+Bc3R3cW6Tk5OTk5OTk5OTkpKSkpKSkpKSkpKSk5OTkpKSkpKSkpKSkpKSkZGRkJCPj4+Pj4+Ojo6Pj46OjY2Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2NjYyMjI2NjY2Njo6Ojo6OjY6OjY2Ojo6Oj4+Pjo2NjY2Oj4+Pj4+PjoKAfnp6fX5+fX1/fn59fn5+fn5+fn+Af4CAgIGAgIB/gIGBgYOHjI6Ojo6NjY2NjY2NjY2NjZKSkpOTkpKSkpKSkpKSkpGRkZGSkpKSkpKSkpKSkpKSkpKSkpGRkZCQkI+Pjo6Ojo6NjY6Ojo2NjY2Njo6Njo6OjY2NjY2Njo6Ojo6Ojo6NjYyMjY2MjIyNjY2Njo6Ojo6NjY2NjY2Njo6Ojo6OjY2NjY2Ojo6Ojo+Ogn99ent8fn59fX5+fn5+fn5+fn5+f4B/gICAgICAgH+BgYCBg4aMjY6NjY2NjY2NjIyMjIyMkpGRkZGRkZGSkpKSkpKSkZKSkpKSk5KSkpKRkZGRkZKSkpGRkZGQkJCQj4+Ojo6OjY2NjY2Njo6Ojo6OjY2NjY2NjY2NjY2NjY6Ojo6Ojo2NjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Njo6Ojo2NjY2NjY2NjY6Ojo6Cf3x6fHx9fn19fn19fX59fn5+fn5+gH9/gICBgYGAf4CAgICDhouOjo2NjY2NjIyMjIyMjIySkZCQkJCQkJKSkpKSkZGSkpKSkpKSkpGRkZGRkZGRkJCQkJGRkZCQkJCPj46Pjo6Ojo6Ojo6Ojo6Ojo2NjY2NjY2NjY2NjY2NjY6Ojo6OjY2MjIyMjIyMjIyMjY2NjY2NjY2NjY2NjY2Njo6NjY2MjIyNjY2Njo6OjoN/fHp8e31+fH1+fXx9fn59fn5+fn5/f3+BgYGAgICAgYCAgIOGi42NjY2NjIyMjIyMjIyMjJTO2tjY2NjamoGEhISEiF0tMDAwMC1GoaGhoaGhoJqZmpqampqKg4SEhIOEd2VnZmZmaFxDRERERENHZGhnZ2dnZZCioKCgoKOAZGdnZ2dmb4SDg4ODg4OLjIyMjIyMjY2NjYyMjY2NjY2NjY2NjIyMjIyNjY2NjY2OhX19e3t6fX58fH59fX1+fX1+fn5+fn9/f4GBgYCAgICBgICAgoWKjI2MjIyMjIyMjIyMjIyMlNvp5+fn5+qcfoKCgoKGUxgdHR0dGTekpKSkpKSjnJycnJycnImBgoKBgYJyXV9fX19hUjQ1NTU1NDlcYF9fX19dkaakpKSkp3xdX19fX15qgoGBgYGAgYqLi4yMjIyMjIyMjIyMjIyMjY2NjY2MjIyMjIyMjY2NjY2GfH16enp8fXt8fn19fX59fX5+fn5/f3+AgYCBgYGAgIGBgYGChYqNjYyMjIyMjIyMjIuLi4uSl5iYmJiZmZKPkJCQkJCMh4eHh4eHiZOTkpKSkpKRkZGRkZGRj46Ojo2NjYuJiYmJiYmIhYaFhYWFhoiJiImJiYmNj4+Pj4+Pi4iIiIiIiImKioqKioqKi4uLi4uLi4uLjIyLi4yMjIyMjI2NjIyMjIyMjIyMjY2Njoh8f3l7enx8e319fX18fX19fX5+fn9/f4CBgYGBgYGAgYCAgYKFioyMjIyMjIyMjIuLi4uLi5GQkJCQkIuOkZGJh46KkJKTkYuQjI6Ph4+RkZGRkJCQkJCPj4+Pj4+Ojo6Njo6Ojo2Njo2Njo6Ojo6NjY2Njo6Ojo2MjIyMjIyMjY2MjIyMjIuLi4uLiouLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyNjY2NiX59eHh5fH18fX19fHx9fX59fn5+f3+AgICBgYGBgYCBgIGCgoSKjIyMjIyMjIyLi4uLi4qLkJCRkZGPhI6QkIaKj4WNkJCLhYmKho2GiZCQkJCQkJCQkI+Pj4+Ojo6NjY2NjYyMjIyMjIyMjIyMjIyMjIyMjI2NjIyMjIyMjIyMi4uLi4uLi4uLi4qKiouLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjI2Lfnx3dnh7fXx7fX18fH19fn5+fn5/f4CAgIGBgYGBgIGAgIGChIqMjIyMjIuLi4uLioqKioqQkJCQkIqFjoiOhoaPiY2QkIiFhoqFjoaLj4+Pj4+Qj5CPj4+Ojo6OjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLi4uLi4qKioqKi4qKi4qKi4uKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIt9e3d2eHt8fHx9fX19fX1+fn5/fn9/f3+AgIGAgYGAgYCBgYGEiYyMi4uLi4uLioqKioqKipCQkJCPhYOMjpCOiYyKjpCQiIWIjIaMiIiPj4+Pj4+Pj4+Pjo6OjY2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKioqKioqLi4uKioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMin18dnZ4fHx7fH19fX19fn5+fn5+fn9/f4CAgYCBgYGBgIGAgYSJi4yLi4uLi4qKiomJiYmJkJCQkJCMhoyJjoeFjYmOi4yLhIiHhoiFiY+Pjo+Pj4+Pjo6OjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKioqKioqKioqKi4uLioqKioqKioqLi4uLi4uLjIyMjIyMi4uMjIyKf313eHp7enp8fHx7fX1+fn5+fn9+fn9/gICAgICBgICAgYCBhIqMi4uLioqKioqJiYmJiYmPj4+Pj5CMjouPjIqPjI6MjY+KjoqLjYqOj46Ojo6Ojo6Ojo6NjYyMjIyLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLjIiAfXh5enp6e318e3t9fn5+fn5/f35+f39/gICBgICAgIGBgIGEiouLioqKioqJiYmJiYmIiI+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Oj46Ojo6Ojo6Ojo2NjYyMjIyLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLioqKi4uLh4B8eHp6eXt8fHt8fH1+fn5+fn9/fn9/f39/gIB/gYGAgIB/gYSJi4qKioqJiYmJiYmJiIiIj4+Pj4+Pj4+Pj46Pj4+Oj4+Ojo6Ojo6Ojo6OjY2NjY2NjY2MjIyMjIuLi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKiYmKioqKioqKioqKioqKioqKioqKi4uHgHt5eXh6fHx6e3t9fX5+fn5+f39+f39/f39/f3+BgYCAgH+BhIiLiomJiYmJiYmJiIiIiIiOjo6Ojo6Pj46MjI+Sj5COjo6Ojo6NjY2NjY2NjY2NjIyMjIyMjIuLi4uLioqKioqLi4uLi4uLi4uLi4uMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKiomKiomJiYqKioqKioqJiYmJioqKioqKioqKioqKioqKioqKi4aAe3h5eHp8ent7fH19fn5+fn5/f35/f39+fn9/f4CAgYCAgIGEiIqJiYmJiYmJiIiIiIeHh46Ojo6Ojo6Ojo+MkJOQkI+Ojo6NjY2NjY2NjYyMjIyMjIyMjIuLi4uLi4qKioqKioqKi4uLi4uLi4uLi4uLi4uMjIyLi4uLi4uLioqKioqKioqKiYmJiYmJiYmJiYmKioqKiomJiYmJiYmJiYqKioqKiomJioqKioqKhYB6eHl5fHt6ent8fH1+fn1+fn9/fX9/f35/f39/gICBgICAgYSIiomJiYiIiIiIiIeHh4eHjY2Ojo6Ojo6Pj4+PjoyNkI2NjY2NjY2MjIyMjIyMjIyMi4uLi4uLioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYmJiYmJiYmKioqJiYmJiYmJiYmJiYmKioqJiYmJiYmJioqFf3l6eXh7e3p7fHx7fn5+fX5+f39+f35/fn+Af3+AgICBgYCChIeKiYmIiIiIh4eHh4eHh4eNjY2Njo6Oi42Nj5WPiYyPjYyNjYyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYR+eXt5ent7ent9fHt+fn59fn1+f35/fn9+f3+AgICAf4CAgICEh4mIiIiHh4eHh4eHh4aGhoyNjY2NjY+MjImKj42IjJGPjY2NjIyMjIyMjIyLi4uLi4uKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uKioqJiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJg355e3p8e3p7fX17fH9+fn5+fX5/fn9+f3+Af4CAgH+AgH9/f4OGiIiHh4eHh4aGhoaGhoaGjIyMjIyLiYyKiIeJhoyOjJCMjZGOjIyMi4uLi4uLi4uLi4qKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiImJiYmJiYmJiYmJiYmJiYmJiYmIiImJiYmJiYmJiYmJiYiIiIiIiYmCf3h7e3t6enx9fHx9f39+fn19fn9/f39/f4F/gIB/gICAgICAg4aIh4eHhoaGhoaGhoaGhoWMjIyMi4yOjoyKioeEiIuKjIuNjo+Li4uLi4uLi4uLi4uLioqKiomJiYmKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiomJiYmJiYiIiIiIiIiIiImJiYmJiYmJiYmJiIiIiIiIiYmIiIiIiIiIiIiIiIiIiIJ/eHp7enp6e3x8fX1+f35+fX1+f39/fn+AgICAf3+Af4CAgYCDhYiHh4aGhoaGhoaFhYWFhYyMjI2NjJCSjI2Ii4mJi4uLi4mLjIqMi4uLi4uLioqLi4qKiomJiYmJiYmJiYqKioqKioqKioqKioqKioqKioqKioqKiYqJioqJiYmJiYmIiIiIiIiIiIiIiImJiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIiIiIiIiIiHgXx4e3x5enp8fHx9fX9/fn59fX9/f39+fn+Af4B/f3+Af4CAgIKEh4eGhoaGhYWFhYWFhYWFjIyNkY+PjZGJjIaJjIuIiImMiYeNjo+NioqKioqKioqKiomJiYmJiYmJiYmJioqKioqKioqKioqKioqJioqKioqKiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4WAenl9e3t7enx8fHx9f39+fn19f39/f35+f4B/gH9/f4B/gH+AgoSHhoaGhYWFhYWFhYWFhISLi46PjoyLj4iHiYmMjYWFjo2KiYyNi46KioqKiomJiYmJiYmJiYmJiYmJiYmJiYmKioqKioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHhoaHh4eHhH55eX16enp7fXt8fX5+f35+fX5/f39/fX5/f3+Af39/f39/f4CChIaFhoWFhYWFhYWFhISEhIuLjI6MjI2Lh4mIiomHgoiNjoiKi5GTj4uJiYmJiYmJiYmJiYmIiYmJiYmJiYmJiYmKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIeHh4eHh4eIiIiIiIiIiIiIh4eHh4eHhoaGh4aGhoaGhoaGh4eDfXp5e3p5enx8e31+fn5/fn59fn9/fn9+fn+AgICAf35/f39/gIKEhoWFhYWFhISEhISEhISEioqOjYmIiIqKh4iHiomIioiIh4qGi5GPiomJiYmJiYiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHh4iIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGh4J8eXl6eXp7e3t7fX5+fn5+fn59gH9/f39/f4CAgH9/fn9/gICAgoSGhYWFhISEhISEhISEhISKi5CPiYmJi4qHh4WHiYuKiYSLjYmOjYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiIiIiImJiYmJiYiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGgXt4enp4e3x7e3x+fn9+fn5+fX1/f39/f3+Af4B/f39/f3+Af4CChIaFhYSEhISEhISEhISEhI+Qj4+IiYuIhoeIiYuLjIuJioqNio6Oj4iJiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoaAe3h5eXh4enp8fX1+f35+fn59fn9/f39/gIB/gICAf39/gIB/gYKDhoiGiIaDhISEhIODg4ODkpKOioeKi4qLh4uNiYqJi4iHiouIio+SioiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhn96eXh4eHl5eXx9fn5/fn5/fn1+f35/f3+Af39/f4CAgH+AgH+BgoOHjo+PjoiHhIWFhoaFhYWSkI6KiYmIiImKioiIh4aKjIiHiYmOkJGNh4iIiIiIiIiIiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4aGh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWGf3l4d3d3eXp5e3x9fn9+f35+fn5+f35+fn+Af4CAgICAf3+Af4GBg4eOjo6Ojo6Mjo2OjY2MjZCQjomHhoiJiYeIiouIiYyJiYaKjY6PkYuIiIiIiIeHh4eIiIiIiIiHh4eHh4iIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhYZ+eXd5d3d6eXl8e31/fn5/fn5+fn5+fn9+f4B/fn+Af39/f39+gIGEiI6Ojo6Ojo6Ojo6Ojo2NkJGOi42JjIiIiYaHiYaIioiHi4yLjpCQiIeIiYmJiIeHh4iIiYmIh4eHh4iIiYiIiIiIh4iIiIiHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhoaFhYaGhoWGhYSEhIWFhoaFhIWFhX55d3l2eHl4e3x7fn5+fn5+fn5+fn5+f39+f39+f39/f35/f3+AgYOGjY2Ojo6OjY6NjY6OjY2Qj42Ni46KhoiKhISLiYeDhYSDi4mLj42JjI6QkI+NjYyLjY6Pj42NjI2Nj4+Pjo6MjYyMjY2KiYiHiImHh4aHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoeHiYqKiIeJi4yNjo2LiImLi42OjYyJiImMgHl3d3Z6eXh7e3t+fn5+fn5+fn5+fn5/f39+fn5/f4B/f4B/f4CBg4aMjY2NjY2NjY2Qj4+Pj46NjI6KiYuMjIeFiY2Lh4aIh4aHh4uNjo6Pj4+Pjo+Pj4+Pj4+Pj4+Pj4+Ojo+Pj4+Pj4+Pj4+Oj46Oj46Mi4uJh4eHh4aIhoaGhoaGhoaGhoeLiYeHiIiLjY2Mi4yLjY2Ojo+Ojo6Pj46Ojo6Ojo6Ojo6Njo6NjY2AeHZ4eHp4enx6fH5+fn5+fn5+fn5+f39/fn59fn9/f39/gH9/gIGDhoyMjIyMjY+QkpOTk5KSjYyMjIqHioyKh4eJiYWCiouIiYWJjpCNjo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjI2NjI2LiYaHh4eHiYqLjY6NjYyNjY6OjY2OjY2NjY2NjY2NjY2NjY2OjIyNj4+OjY2MjIyLi313dXd5enp7e3p+fn5+fn5+f35+fn5/f39+fn1+f39/gICAf3+AgYOFj5KRkJGSk5OTk5OTkpKLi4uLiomMiouLiYuKhoeOjYiIjI6OjIuMjIyNj46Njo6Ojo2NjY2MjY2NjIyMjIyMjIyMjY2NjYyMjI2NjYyMjI2NjIyNjIyMi4yMi4yMjI2MjIyMjIyMjIyMjIyLi4uLi4yNjY6Sk5OSkpSRkJOVlZSTk5COjo6Oe3Z2d3h6ent7e31+fn5+fn5/fn5+fn5/f35+fn9+f39/gIB/f4CBgoSNkpKTkpOSkpOTkZKSkoqJioyJi4qJjIuKioiHiYqKi4mKjY2Mj46Nj5KUlJOUlJOTkpGSkI+Ojo2NjY2Pko+OkZGOjIuKioqLi4qKi5CPjoyMjIqKioqKioqKiouKioqKi4yLi4uMjIyKiouLi46RkpOTk5SUk5STk5SUlJOTk5KSkpKSk5F6dXZ2eHt7e3p6fX5+fn5+fn5+fn5+fX5/fn5+f39/f3+Af39/gIGChIuRkZGRkZKSkpGRkpGRiYmIiIqMiYiJiYuJhoSJhoyKh4ySkpKTk5OUlZWWlZWUk5OUlJSUlJSUlJSVlZWVlZWUlJOTkY+QkZKQjoyRlZWVk5KSjo+QjYqKi4qKi42OjY6RkpCRkpKSkpGRkpKSk5OTk5OTk5OTk5OTkpOSkpKSkpKSkpKSj3h1d3l6e3t7ent9fX19fn5/f35+fX5+fn5+f39/fn9/f4B/f3+AgYKEi5GQkJCSkpKRkZGRkZGIiIiIi4uJg4eLi4yMiIeHjYyNkpSSkpOTlJWWlpaVlZSSkpOTlJSUlJWVlZaXlpaWlpWUk5SUlJSVlJSUk5OVlZWUk5KTk5OTkJGSkZGSk5OTk5KSkpOSkpKSkpKSkpKSkpKSk5OTk5SUk5OSkpOTkpKSkpGRkZGPdnJ3enp7e3t8fX59fX1+fn9+fn9+fn5+fn6Af39/f3+Af3+Af4CBgoSKkJCRkZGRkZCQkJCQkIeHh4eIiIiFi4+KjI6Njo+OkJWUk5OTk5SUlZWVlJSUk5KSk5KTlZSUlZaWlpaWlpaWlpSTk5OTk5OUlJOSk5SVlZSTkpKSkpOTk5OTk5OTk5KSkpKSkpKSkpGSkpGRkZGRkZKTlJSUlJSTkpGRkZGRkZGRkZGRkYx0c3d6ent7e3x9fX1+fX5+f35+fn5+fn5+fn9/f39/fn9/f39/f4GDhIqQkJGRkJCQj4+Pj4+Ph4iKi4yNjYuOj42Mjo6RkpGSk5OSkpKSk5SUlJOSk5OTkpKSkpOTk5OTlJWVlZWUlZWUk5OTk5KSk5OUk5KTlJSUk5KSkpKSk5OTkpKSkpKRkZKSkpKSkpKSkpKSkZKRkZGSkpOTlJSUk5OSkZGRkZGQkJCQkZCRinN0dnp8fHp7fXx9fn59f35/f35+fn9+f31+f39+fn59f39/gH+AgYKDipCQkZGQj5CPjo+Pjo+Oj4+Pj4+Pj4+PkI2OjpCRkpKSkpKRkpKTk5OTkpGSkpKRkZGSk5KTk5OSk5STk5OTlJOSk5OTk5OTk5OSk5OTkpKSkpKSkpKSkpGRkZGSkZCRkZGRkpKRkZGRkpGRkZGRkpKSkpKSkpKSkpKRkJCQkJCQkJCQkJGGc3V2e3x8e3x9fX1+fn1/f35/fn5/gH9+fX5/fX5/fn5/f3+Af3+BgYGKkI+PkI+Pj4+Pj4+Pj4+Oj46Oj4+Pj5CQiI2PkJGRkpKSkpOTk5OTkpKSk5KSkZKRkZKSk4iFk5GRkpKSkZKSkpKSkpKTk5KRkZKTkpGRkpKSkpKRkJCQkJGRkZGQkJGSkZGRkZGSkZGRkZGRkZGSkpKSkpKSkZCRkZCPj4+Pj4+Pj4+PkX9ydHh8fHx7fHx9fX5+fn9+fn5/f3+AgH99fn5+f39+f39/f4CAf4GBgYqPj4+Pjo6Ojo+Pj46Ojo6Ojo+PkI+Pj4+GjpCQkJCRkZGRkZGRkZGQkJCQkJKCgpKQkZGOdYaRkJCRkZCQkJGRkZGRkZGRkJCQkZGQkJGRkZGRkI+PkJCQkJGRkJCQkJCRkJCQkJCQkZCQkJCQkJCQkZCQkJCPj4+Pjo+Pj46Ojo+Pj4+PeHJ2eXx9fHp9fH19fn5+f35+f39/f4CAf39/fn5/f35/f39/gIB/gYGAio6Ojo6NjY2Ojo6Ojo6NjY2Oj4+Pj4+PjoiQkZCPj4+QkJCQkJCQkI+PkJCPkIhwhJCPkHx0iJCPj4+PkI+PkJCQkJCQj4+Oj4+QkI+PkJCQkJCPjo+QkJCPj4+Pj4+PkJCQkI+PkI+Qj4+PkI+PkJCQkI+OkI+Pj46OjoyMjY2NjIqDiYhzc3Z4fX58eX18fX1+fn5/fX5/fn9/f39/f4B/f39/f4CAgH+AgH+BgYCJjY2Ojo6Ojo6OjY2OjoyNjY6Ojo6Ojo2NiJCRkI6Njo6Ojo6Ojo6Pjo6Ojo6PjHNvio+KcniHj46OjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Pj46Oj4+Pj4+Pj4+Pjo+PjY2MjYyNjoyLi4mJiYiFhYSDgoKEgnR5fXp4dXJrZWltb2xmZmdncHNzd3l9fnl6e3x9fX5+fn59fn9/fn9/f39/gIB/f3+AgIGAgIB/f4CBgImNjY2NjY2MjYyMjIyMi4uLjYyMjIyMjIyGj5GRjIyMjIyMjIyMjIyMjIyMjIyNd217j4JzeIaNjY2MjIyNjY2NjYyMjI2MiomKi4uJh4KAh4iEgXt6gH57fXx8fXlzcnJycnV1cG1ramppZ2NkYV9bXF1eWFVXWFlTS0VJSkpLTE1PT0tgdHR3eX19eHp5e3x8fn5+fn1+f39+f35/f4CAgH+AgICBgYCAgICAgIGAf4OEhYSFiIuLjYyMjIuLi4yGiYqKioqKh4OOkJGNiouLi4uMiYmKioqKiouLi4dzbm+Ee3V2gIWDhIeJiYWCg397fHl6e3pzcHFxcW1samdsbWdlZmVmZGNlZGVkZWVlZWRkZGNhYV5dXFlYWFdUUFFSU1JTTU1KSUZESEpHR0hHR0xOSWdzdXh6fXp4d3l8fHx8fn5+fn9/fn9/f39+f4CAgIB/gICBgICAgICBgYFnXmBjYWNucX17ent/fXd8fHZ4ent4eHpvcXt4eXt8e3h3e394dXd0dHZ1dXZ3dGJeZF9ha3FmaGtsbm9tamlpaGhlZWRkZF9gYWJgYF5dWVhaWltdXV9gX2BfX19gYmFeXl5eWVldXF1bV1dWUlRSU1NOUUpISUZERUhMTEhGR0lLSklNbXJ0eHp7end3eXt6e3x+fn1+f39+f35/f35+gIGAf3+AgIGAgICAgICCgWdYW1pZXFtcY1xaXF5ga3FtcHBvbm5vbmtpbmxrbG9qaWtraWpraWZmZ2dnaGhiXWpsXWVmZ2VjY2JhYmBgXVhbW1dYV1RWUVBUU1NNSkxLTExOTk9UWFhXVVVUUlBQTU1QT05LTE1QUU9MTEpHSUlHSEhJSEhIR0ZGSElKSEhISUlISVZwc3V5ent5dnZ5enp7fH59fX5/f35/fn5+f3+AgX9+f4B/gICAgICAgIGBbFtYVlZWWVlaWVlYVVZoamxubmxra2poaGloZGVkYlxiZl9fYWNfXF9dYF1eWlpqd2xibnJqYllZX1tYV1NOTUtLS0tMSUtNTktKS0tMSktQTEtLRkdHSUlGR0lISUZFSEdGRkVERUVEREVJSUlHSEdIRkZLTUtJSUlIR0hLTU1LTExMVXFzdnl6e3h2d3h3ent8fn1+fn9/f39+f3+AgIGAfn5/f4CAf4CAgIB/gYJoUlRVVlNVV1lZWVdXV1tbYWNfXlxbWFZWWVZSVFJRUVVUU1NUUE1KTU5QUk9NW2tya2FtdHJmUVFTUFBOTk9NSk1MS0xKSktLRklJSkxJR0pISUlFR0dGRkVFSElKR0ZHRkZHR0hKR0dISEpMSkpLSUlISktLSkhKS0pISUtMTU9QUEtUdHN1eHp6eHZ2d3d6enx+fX5+fn5/f35+fn+AgYB/f3+AgYB/gICAgH+AgmlQUlRXVVRWWVdYWFpbVFRTUlBRU1FRUU9OTlBQUU9MTlBPTk5NTEtNTk5QTU5dY29rWGlzdXBTTU9QUFBPTk5PTk5QTk1NS0lISEpJSUlJR0ZHR0dJSkhJSEhJSEhHSEdISElISUxLSklISkpJSkpIR0pMS0pJSUhKSktMTk1NTU9RTFVzcnN3enl3dnR2eHp7fX19fn5+fn9+fn5+gICBgICAf4GBgH+AgICAgICBbE9PTlRZVVVdW1lXV1hOTUpKSUZKT0xKSkdJSk1NS0pMTUpHSUlJSktLRkJGSFViZ2xvcG9tbFpMTE5NTk9NTk9MTk5OUFBPTE1MTk1MTEpJSEdJSElISElJS0xLS0pJS0pJSklJSUlJR0dKSUdJSUpKTk1OTEhJSklJSk1PT01MT1JOWXBwcnd4d3d0c3R3enx+fX5+fn5+fn5+fn9/gICAgICAgYCAf39/gICAgIFvS0pNTlFOTlVXVlZSU0lFQ0VFUkREQT5CP0RAQD5CREFAQURHRkVIRUNGR0hNWmdoZ3JubmhmZGBeXlhMSklKSUlLSkxQTk1MTU1MTU1NTElIREZGR0ZGRklKSUlLSkhMSklKSkpJSEhKS0tIRkdJSklLTU5OSktPTUxLTU1PUE5QT1BgcG9yd3h2dHJzdXd6fX19fn5+fn9+fn1/gICAgICAf4CAgIB/f3+AgICAgXNQUE5OUE1KS1BSUE5RQ0RCQUZRRT1DPT9FSDk6Oz0/PTxBRkA+Ojs+SVpdWlxlbG5qb21tbGtpaGtkU0dFRUZFR0dHR0pHSEpLR0NER0pHQ0RFQUFDR0hHSEdISktKSElMS0lISktLTU5MTUxMSkpMS0lLTU9PUFNRT1BQTk9QUlFNUGdwb3N2dXRycXR4eX19fX1+fn5+f4B+foCAgH9/gIB/f4CAgH+Af4B/gICCdlRVUVFQT0xNUFBOT09BQkFAQkE/Oz48Pj8/Ozg5ODs7OkA6Oz48Ozs7PUtbaW1ub2pvbWtqbG1mUUdFREdJSEM/QEBAQUFCQUE/Pjw9PkFAQD8+P0BFR0dHSUtMTk1OTUxNTUpLTVBVU05MTlFOTk1OTE1NTk9OTk1LS05OTk1OTkxUbnBwc3R0c3Fydnh5fX19fn1+fn5/gH5+gICAgICAgH9/gICAgH9/gH+BgIJ4UVFSVFJTUVNTUVFST0BAPT4/PD8+QEE/PT45Ozo7Ozk5Ojg4Ozw5Nzk7Oj1IY29zbW5sa2xoVUM+Q0ZEQ0NDPzs+PkBDQ0E/Pj9BPkBAQj9APD9CQEFDRUVFSktQT1BPTU1OTExMT1JRUFJOTExPTUtOT0xMTEtMS0tKS0tKTU1LS1xxcXF0c3RycXR4eHl9fn1+fn5+f39/fn5/gIGAgH+Af4CAgICAf4CAf4CAgXxSTU9RUFFSUlRSU1NOPDs8Ozs7P0BBQkA9PDk8PTw6Nzk6Ojk3OTo6Nzg6OTk9SmBzc3BoVD86Oz1AQUA9Ozs+PD08QEJDQT9BQkE9Pj09Oz0/Q0RCQD9BREJFR0pKSkpKTE1MTExNTExOVVNLTE1USVBKSU1KSUpLS0pJSEdKS0lKZnJxc3RzdXJydnl6e31+fn5+fX9+f39/f36AgICAf4CAgICAgIF/gIF/gYCBgFZMTlBQTlJRUFBRUU44PT88PDo9PkFAQT8+PkA/Pj48PT0/QD09PT9DOz09Pjw6Qmx9akA6Oz49Pj8/QUA/P0E/QEBBQEBAPT8/PTw6Oz09PD9AQUJCQUBCREZGRkdGR0dISUtMTExLTEtKS0lKSk1MTEpMS0lISUxMSklJSElLR01tcHF1dXR1c3V4eXl8fX5+fn5+fn5/gH9+gIB/f39/gH+AgYCAgYCBgICBgYCCYUtPT05OT1BPT1BQTzo8Pjw9Oz8+PkFBPz0/Q0NEQT89PkBBP0A7W25APkRFP0BBRF9kOz09Ozo9P0FBPz9AQD9BPz89PD48PTs7PD0+QUA/QD5AQ0NEQkRFSEVFR0hISEdGSUpJSUlJSUhKSkpKTEtKSklJSEhKSktMS0lLSktIVnBwcXNzdHR1eXp7fHx+f35+fn5+f39/f39/f3+Af4CAgICAf4GBgICAgIGBgIJtTFBRTk9QTk5PUFBPPjw8PT4/P0A+QEA/Pz9CRkQ+PDw9QD04Ojptd0g4Ozo9PkE7SGQ9PD08ODo7REQ8PD08PEA9PTw8Pjs9PD0+QUBCQUBAP0JEQ0RFRkZGQ0VHSElJSEhJS0tMTUpKSUpNTUpLSktJSEhISEpJSktKSk5MSUlgcHBycnJ0dXZ6e319fH5+fn5+fn5/f35/f36AgIB/gICAgICAgYGAgICAgIGAgnZNTk5NTk5MTE5QT0w+QTw8PT8+QkM/PkFBQUJBQFlSPTw9SUxGRXV2Tjc4ODo7Pj9XakE7PDw6OjtMUj09PTk6Pzw9Pj89Oz4/QEJDQkJDQ0FCQkFCQkRCQkRCRENGSUdGRkhJSUtNSklKSktMSkpJSkVESUlGRkhISUpKTEpGRmdwb3FxdHZ1d3t8fH18fn59fX1+fn9/foB+fn+AgH+AgICAgICBgYCAgICAgICBek5JS0tMTExFSUxOTTw/PDw9PkBAQUE7QkNCQ0BDcnpKO1x/g396fHdXPD0/PT0+RWh0TDo9Pj89PE9oS0A8ODxBPz4+QT07P0JAQkNCQEJDQUNBPT0+QD0/QUFBQENFRUBAQ0JDR0dFRENGRUZGR0VFP0FHR0ZDRkRHSEpHQz5IbG9wcHF0dXZ5fHx8fHx+fn1+fn5+fn5+f36Af3+AgICAgICAgIGAf4CAf4CBgIF+UUhLTU1NS0pLTE9RQD8+PkFBQEBBR0FCRENFQUdyemtig4SDgoOAfV4+QENAQD1Kc3tZOj1BRUJBUG5eVFBIQUNDQUE/Pj1AQT4+Pj88PkBER0VAPkBBP0BDRkVDQkNDQEJEREJERUFCPkFCQkFCQEA9QUJDRENDQUNFR0E/PVZwcHFwcnV1d3p8e3t7fX9+fX19fX1+fX5+fn9/foB/f4CAgICAgYCAgIB/gIGAgX5SSEtNTUxLS05OUlVEQkBDQ0FBQkBCQ0BAQUFARW50fYKCgYN+fYR2TUFDRUA/Pll7gF0/Q0VJSklUaGdlX2BYRk1NRkVFRURFQ0E/QD4+QkZKSkdFRUdGRkpOTktKSUdHSEtMSUdHQ0REREVEQUJCQ0BDREVEREVERUZDQkFEZW9wcXF0dnV4e3x6fHt9f319fX19fn59f4B/f39/f39+gIGBf4CBgICAgH+AgICAfVJJSUpKSEpKTE9SU0dGRUdIREdIREA+PDs+QEVFaHN9gXx/hH55hXJDREVEQ1d1hoeHflhHSEpNTVxpaGplYmdaYU5JSUhHR0hIRUNFRUVFRkhKSkZFR0lKTU9PTU1LSktKTU5LSUhHSEhIR0ZFRkZGREZIR0VFSEhGSEdIRlFubnBxcnV2eXt7e3p9fX5/fX19fX1+fn1/f39/fn5/gH+BgYGAgICAgICAf4GBgIB8UEhHSElGR0lKTU5OSkxJSUpLTE5KRkNBQkNGSkdge4B/d3+EhYOEiWxBQVZ0h4mHh4eIg1dITE5NZnZvaGtpbG5hR0hIR0ZIRkhFQ0RERkVEREhIQ0NDRklLS0xMTExMTElKS0pKSUlJSEpISEdISUhHR0hGRkZISklJSUlIXW9vcXJ0d3d6e3t6e319fn59fX19fX5+fYB/f39+fn+BgIGAgYCAgICAgIB/gYCAgHxNR0ZIRkVGR0dKS0pMTUxLTU5NT0tJSEhKS0tMTE5bfIKCg4OFhoaIhFZshYeGhoaHiIiHfFBMTU5seHZubW9xcFE/RENCQ0ZGRUJAPj5AQUJAQkQ/Pj9ERkhERkdJS0lKSEhIR0lJSkpJSEZKSkpKSUpJSkpKRklMTEpKS0tmb3BzcnR2eHl7e3t8fH1+fn19fX19fn59f39/f35/f4CAgICAgYCAgIGAgICAgICAfU9GRkdGR0hHRUZHR01NTUtMS0lHQ0NDRElLS0xLSlSBg4SEgoKFhoaEgoWFhISGhoaHh4aKdUpJUnR6g3dwbWxuVjs/Ozo8QUFAPjw5OTg8PD07Pjs4Oz9BQkBBQ0NCQEFBRERCQ0ZISUhISExNTEdJSk1NTk1KSktLSkxNU2xwcXRzc3d5e3t7fH19fn9+fX19fX1+fn5/foB/fn9/gICBgIGAgICAgYCAgIB/f39+UUZFRkdJSUdEQ0VGTk1MSklIRT85Oj5ARUhISklJZYWEhIR/gYKDgoODhIWFhoeIiIiIiYyPZ0VZa296bmxvcXNPNjk2NDc5Ozw6ODU2Nzc4OTc4NzU4ODs7Oz1AOzk5OT08Pjs8PUFDRUhKTUxMR0lHT1JRUFBOTE1NT1Fdb3BydHN1eHp7e3x8fn5+f359fX59fX5+f39/gH9/f4CAgICAgYCAgICAgICAgIB/f39RR0ZHSEpIRkVGR0hMTEpJSUdDQjU2OjxDQENHSUlohoSEgX6Bg4ODgoOEhomKjIyLi4mKi42KZ2RqbGNlaXWBczw0ODczNTY4Ojg3NjU2NTY3Njc2Nzo2Nzg4OTo3NTc4OTc5Nzc2OjxAR0ZJR0lGRUZPU1JTU1JPUFBSVGVwcXN0dHZ5e3t7fH1+fn5/fn19fX19f39/f3+Afn+AgICAgICBgICAgICAgICAgH9/flJISEhJS0lHSUpJSkpLREVIRUJANjc4OD06PUVDQmWFg4GAgoODg4ODhomLiomJioqKiouKi4uHc3FvZmdwcn1lNDY4ODU1NzY5OTc3Njc2NTo5Ojo6Ozc5ODk4NzY2OTo5ODg2ODU4OTtBPT4+QkE/QUtMT1FQUU9PT1JXa3FydHR1dnl7e3t9fX5/fn9+fX19fX5/f4B+fn9/f4CAgH9/gICAgICAgH+AgICAf39+VEhHSUlMTUtKS0tMSUg/QEFAPDo1Nzk4OTc7Qjo9cYSAgYOEhISEhYaJioqIh4eIiIqKjIuKi42HeHNub3NtcWE5Ojs8OTo7OTo7Ojo5Ozo5PT09Pjs7PDw6Pjs5Ozs8Ozw7OTo8ODo6Ojo5OTk8Pzw8QUJESUpNS0lLTFdvcnN1c3Z4e3t7fHt9f39+f359fX19fn9/f35/f39/f3+Bf4CAgICAgICAf4CAgH+Af35URkVGSUxOTkxKSk1CPzo7PDo4OTk4OTo6Ojs/Pkh+hIKChIWFhYaIiYiHhoaGiImIiYuMi4qMjY6Ed3V5cm9vXUJCQUI+QENBQD49Pj5APz8/QD9APT0/Qj5AQT9APz1AQEA+P0E8Pjw7Ojs6OTs/PTs8PT1BQUNBQkNBWHBxdHR0dnp7e3x9e31/fn9/fn19fX5+f35+fn9+f4B/f4CAgIB/gIGAf39/gICAf39/flJFQ0FHSk5PTElHSzo4Ojs5Ojo8PDo7Oz09P0BCUoKCgoSFhIWEhomJiIiGhoaHiImKi4uLi4yNjY2Be3t2c3FWS0hISEVGSEdFQ0FAQkVDQ0FCQ0I/QERIRUNFQ0VEQUZFRkRFRkRAQj48QD49P0A+Pz4/Pj8+Pjo7PTxgcXJ0dHV3enp6fX19fn5+f39+fX19fX5/fn5+fn5/gH9/gICAgICAgICAf4CAgIB/f4B+UERAPUNIT01HRkJEOTc6Pjo8Oz4/Pz89QUBDREZXhIKDhIWGhoaIiYmIh4aGhoeJiYqLjI2MjIyMjIx/ent0Xk9STEtLSUpKSklGRERHSEZEREVGREJISUtHSEdGSEdFS0lLSUpLSkNFQ0NEQkFCQ0JEQ0NERENBPTs9QGhwc3R0d3d5eHt8fH19fn5/f359fX1+fn9+fn59fn+Af3+AgH9/gICAgICAgICAgH+AgH9PQT49P0RMS0BCQkE5ODw+Ozw7PkA/QT5CQkdHSVmEgoOFhYaHiImJiIiHhoaGiIiIiYqMjY2NjY2Mjol7enBcUVJOTE5LSktJS0dER0lJSUVGSUZGRUxMTUlKR0dISUpOTU9MTE5LR0ZHR0VFQ0ZFRkZERUhIRkNBP0BMbHB0dXZ4eXl5fHx8fX1+fn9+fn19fX1/f35+fn5+f39/f39/f3+AgICAgIB/gICAgICAf1FBPz4/RUdHPTxAQDg3PDs7PTo+QD4/QENGSUlQX4GDhYSFhoaHiIiIiIiIh4eIiIiJioyNjYyMjYyNjYR6enhkUE9NTkxKSUZKSUVLSUdLSklKR0dHS0xOTExISElKTVFOT05MT0tJR0lKSElESUhIRkZHR0lHQ0JBQ1RucHV3d3l6eHl6e3x8fX5+f39+fn1+fX5+fn5/f36Af4B/f3+Af4CAgICAgICAgICAf39/VERBQUJHSEI/OD9AOTo8OD0+Oz1BPj9BREhKTFVxg4SFhISFhoeIiIiIiIeGiIiIiImJjIyLjIyMjIyMjHZ3dHFVUlBNTElHREhKSE1MR0tPTEtKSkxNTE9QTkhJS0xPUVFQUU9PSkhKSkxKS0ZHSEdGRklGRUVCQUJCXG9yd3h5enl5eXp6e3t+fn5/fn59fX19fn9+fn9+f4CAgIB/f39/gICAgICAgICAgH9/f39VRUNFRUdHRUQ7P0E7PTw5QD4+QEJHR0FHS0xQVnmFg4ODhISGiIiIiIiIh4eIiIiIiIqLi4qMjIyMjIyOfmRgaF1XVVFPTUxFRkdNUE9QV1VRUE9RU1JNU1RPTVNMUFNVVlJTUVBMSk1NTUtOSEdKRkVISkVERUVCRUNjcHV5eXp6ent6e3p6fH59fX9+fX19fXx9fn5/gH9/gICAf39/f3+BgYCAf39/gIB/f39/f1VGRkdHR0dIRj5AQj0/PT1CQEJCR1ZORk5QUFRYe4aDhYWEhYeIiIiIiIiIiIiIiIiJiouKioyMjI2PjIyMb19eb2RIVVNTUks7O1NUUmB1XVVWVFZZWVJYWFJaZlBVV1pdUlRXUU9NUlFQUFFMTEtISEpIRUZJSUlISWlydnl4eXl6e3t8ent8fXx9f359fX19fX1+f39/f3+AgIB/f39/f4CAgIB/f3+AgH9/f35+U0hKSUhHR0ZFPz9BQUVBQ0dFREVMWFJNVFVWWFp8hoWHhoWGh4iIiIiIiIiIiIiIiIiIlJyMioqMfmGKi4uIc2JpWT1bWllUUj9AV1ZZXGRgVllicl1dV11aVkVRWVpbWV9UWWdSVlZYVVRWVE9PTUtMSklJTE1LT01Tb3R2eHl4eHp6ent6enx9fH5/fn1+fX19fn1/f39+f4CAgH9/f3+AgICAgH9/gH+Af39+fn5WSkpJSEdFRERCQT9ITUlNUEtJS1BUU1NYWlpcXHiFhIWFhYWGh4eHiIiIiIiIiIiIiImcnaCPiY5nO36MiYuMfXNzW15dXFNVU1dXVVtadYNZVX2QYVxYXV9XSVZdXVtbX1lIWVhZW11YWFlXUlFNUFFNTU9TUVFVUmFzc3Z3d3Z4eHh6e3p8fX19f39+fX59fX1+fn9/gH9/gIB/f3+Af3+AgICAf39/gIB/gHh5fVlOS0lJSEZCREBBOlBRUVdYUFBPUVNUVFhYWVpbboGCg4WEhYaHh4eHh4iIiIiIiIiIiJaanJeJioFuhomIh4SLgGlcXF1bVldVWFRSWFZjloBSZXJYWldfaFBgZltbWFxnYUdPWmhnXVtcXV1XUk9TUFBSVlZWVllabnJ0d3Z2dXh4eHt7fH19fX5/fn59fn18fn9/f3+Af39/gH+AgH9/gICBgYB/gH1yfX9/b3R8XVNQT01LSkVDP0A7UFBaWltSU1FQUlJSVVNWVFdfdXiAhYSEhYaGhoaHh4eHiIiIh4eIh4ORjomJiIaFiIiGfoB9YFRYW1ZUVlNSUk1QTUxmeltdVFlVVl1aTFRaVVNUXlpYV1dXemtYW1xcXlRRUVBJTk9XVlhbWmRwcnZ2dHR2eHl5e3t8fH1+fn99fX1+fX1+f39/gIB/f3+Afn56eHd2c3V7f3+AgHRrfn5rcnleW1ZVU1JPS0ZDREFNXoNsVlJTTk9RT1FVUlNSUlVjZHaAgoKDhISEhIWFhISDhoaGhoeIhn6JiYiHhoOHh4h6b3NaTk5RUU1PTEpLRUZJRkM/VGRVf1JRUU5LUVRRTU9ZUk1OUVNVVU1RU1JQT01MSENJSFJUVVpcbHF1dXVzc3d6ent7fH17fX19fn19fX59fn9/f4B/f399fX5+f39/f4B+e3Zzd31+fmR1fWlxdF9kXV5cWVVRTElMSWFsknRQUVNOUVJRUltSU1JRUlVUYXN7fH+AgYKBgX99enuAf4OChYaHgoaGhoGEgYaFhnZhXk9HQUVFRERDQUVRQ0VBQz5DSUdWQEhOTEddaVBIRk5GREVGSUdIQkRIR0lLR0RCQURAT1FNU2RydHZ1c3R1enx7e3t7fHx9fHt+fX19fn5/f3+AgIB/f3x8fX+Af39/f4CBgH12dHt/bWh8Z25xZmllZGJcWFNRUFVSc1dlW09PTkxRU1BVWVNVUVFUUk9WX2tscnZ7e3h5dHJuc3RzeXh9f4OAg4OCgIKAg4GCbE9JQkI8PD5AQUBAP2tRS2BFRkhJRUI/R0xOR01SVUlCRT8+PD08PT0/PT9BQ0NAPz09Qj5KTkdVbnR0dXN0dnh6fHt8fHx9fX19fH59fXx+fn9/f4B/f39/enl3eHd2dnh7foB+fXt4dnx1YXhnbHBqbGppZmBbUVFaXFleSkpQUU5LTFFSUVRVVVdRUVdVUFhbYV1hZ21tbG9rZ2BucmptbHF1e3p9e3h6fHx4d3hlREJCQj47Q0NCQkRCXF1Pe05PT05LTE1PT1FMS01XTUhHQEI8Ojc3NTk5PTs7Ozg6ODo/PEJIP1xzdHV1dXZ3eXx8fH18fH19fn58fX19fX9/f39/fn9/f314dXZ6e3p3eXh1d3t8eXh1eXdjcWhpcG1ubW1oZl5PUF9dWklIUFJRT01QUU5RUlRWWFNTWVRPWVpcV1ldXl5fZV9dXnF2a15gZ2t3b29sam9ubmxlYllIR0hIQ0JHSUZGRkRNUk9hV1NXUVBTU1JVW09PUVZQTUlERj46OTY1ODc5Nzk6MzY1Nzk1PEM+ZXNzdnd3enl7fX18fHt8fX5+fnt9fn19f39/fn5+fn9/e3d1eX18enh8fHx8dHd2d3Z1d2tuaWhxbm9vb2prYFZXXlpYTUtUVFNQUVVPTFJTVFdYVFRZUk1YWVpWWFhWWFldV1dYaHNrXVZhdGthYV9eZGFfXllVUU5PT01JSEpMSklGQ1FQU1pXVFROUVNZU1xlVU9TVFJOS0lIQz9BOTk5ODk3ODg1NzU3ODU5OkducXR3eHp7e3x+fX18e318fn5+en1+fH1/f359fn59f358dHR1e3hycW9vbnR4cXJzeHZ1cWZkZ3JucHBxbm1kXV9fWVdPUFhWVlNUVk9PVVZYWFlTVVRMS1RWVVVVV1BTVFdUVVJdbl9STlpgW1dZO0RWWFRbZkpMUFNST05NTk5OTEpGUVBVWVNUT0pOT1VTVFxWUlVTUk9NTElISEY/Pz06Nzg3NjU5OTY3Njc1V3Bwc3d5ent8fX59fnx8fXx+fX15fX18fn5+fXx8fX1+fXxydnF4eHJ2dXFxbnBwb3B1dnRuamRkanBwcXJwbmZlZGNcXVJUWldYVVRXVFJYWFlZWVNVT0pHT1BPT01SSk9QT1BOTk9UTE1JUE9TVFUyPVhNSUBRPWNhUVNRUE5QUVBOTk1RTlRSUFNNSUxKT1JQUlJTVFFST0xNS0xMSENCQT06Ojg3NjtCNTU2Njpkb3F0d3h7fHx9fnx9fH19fX18e3h8ent9fX58e3l9fH18e3B1b3d1cHV0b3N2cHFxcHR1dmNqZ2VXaHRycnFuaGlocFZWVFVYVVdVUldWVVpZWFdVUVNGRUFGR0dIRkpESEpJR0VITEhKSEZMTVBNRy9FX1I+Mz8+am9hU1JRQEdUUVBRUFFOUU9RUExKTExPUE5OUFFRTlBPSkxNTUtHRUVEQjs9PDw5PUc2Njc3RG1wdHZ5e3t9fX18enx8fX5+fXt5dnh3eXl8fXp6dn17fHp6b3Fud3JwdnFtcHNwb3Bzc3N0ZmdgaFpXa3JzcmxtbWtuYWVQU1RSU1RPV1ZWWVlWUVFRT0A9Oz0/QUJBQ0BCRURBQEdIR0hFRkhKTUxFR0NPUkM4RU5TXWdUUVNBR1VQT1FRUE1NT01LTEtMTk9PUUxPT01ITExJS0tMS0dGRkVEPEFBPjtARTs8ODlTcHJ0eHt6e318fHt5fHp6fn58e3V0dXJ2dnp7eHpyfHt8eXltcW94cnF1bm5xcm9vb3Rzc3J1dGtnZ15lam1wa29xbWltY0xPTkxRU0xUVVRYV1VMTEtJPDk4Nzs+QD48PUFAQj0+RUhHQ0VGSUdKSkBGQUFARkhFSk9IUVJiXFFQUk9TT09QTE1PTkxNTU5PTltXS01RT0dJSENISkxMS0ZGRkU/QkM+PEJHP0I/QWRwdHZ6enp7fHt6end7d3l+fnx7cXN0cHJzd3N4eHN6e3l2d2xxb3ZxdHRsb3Fybm5vc3ZydHNycmtsZW5zaG1ubWxtbGprSUxISE9RSlFTUVRTT0tIQ0Q9OTc3OT9CPjs/QkBAPkFESkVDR0dJR0lFQkI/Pj1DQkFHSURNT2JlUU1PTldLTE5LTE5NTUxMT05TZE5KTFJJSUlFQUhKTE1OSkdJR0JBQkA/RUZFSERLbm92eXl5e3t6fHp3c3h0eHx8eXpucXJtbm9ycnZyc3h8eHZ2bXBtc3B1dGxwcHJvb29ydnVyVlZucWdseYRqbXFybm5qaG9ISkNHTU1KTVBNUE9ISkQ/QT05ODk6P0I/PEFCQUFERUdLRkNISEdHSENEP0I/P0BBPkNFQ0tOUlRMSklNVEdJSUpMSktMSUpNTU9QUlBKR0NMR0NCSklMTU9OSUpJR0NDQ0RISk1MSVlybXd5eHp7enl8dnJwdXJ0eHl2eGpxbmpsbG50dG10dXtzdHhyb21wb3ZzbnBvcnBvcHN0eWpOYGdzanR8eWdvc3FpcWhkcUdLREdISEdKS0lKS0RGQj0+PTo5OjtAQj89QUJDQ0dGSUtKRElJRkdHQ0M7QUBCPkBAQ0VDSU1QSEhLR0hLREhKTE1ISkxISUpMS01dUkhIRE5GQUNKSk1MUE1LTUpLRkdHSk5OUU5MYm1pdnZ3enl7en1ybWxza3B0dHR1aHBtamlra3RwbnR0eXByeXRvcnFvd3NvcXB0cnBydXR5a05WbXVscXt2aW5vaWt0Z2RvRktERkVHRUZGR0VHQkNAPjw9OTo6O0BDQD5BQ0RFSUVJSkxGSUlHRkZDQjtBQkM+QENEQ0RHTE5IS05IREhFSUxOTUdJTEdGR0lJTE5LSUdFTkhCRk1LTUxPTU1OTUtISElPUlJTTlJmZmZxb3N4dXt6fGxoam5la3Fsc3BmbWxoaWtsdG1wdXR3cW94dG90c3J2c3BxcnRzcnR1dXZ2WFZ1dWtvdHJrb3ZsaG1lX3BHSURGRkVDQ0JFQERCPj8+Ojs7PTo8PkNBPkFDREZKRklITEhHR0dGRUNAPUREQj5BQ0NDREdISUdNUUlGRkdLTk9LRkhJRkVERUlKSEtJRkhPS0NJTEtPTE5NT09OSkpJTFJVVVJPV2RgYW1ncXJvcnl6Z2VoaGRpbGdxbGZsbWdpa2xzbHB2dXRwbnZyb3Nyc3V0cXNzdXRzdXZ2dnl2dXR3bGp1dW1ydnFsbmxlckxIRUVIQ0JBQkQ8QkE+QT06Oj0/Oz4+QEI+QEFER0pFSUZJSEdGR0RDQkFBRkZDQkJCREVER0dIRkxRTElPSkpNTElHSEVHRURDSUlIS0pHS1JNQk5OTFBOT09NTk9LS0tPVVdWVVNYX15caWFtaW5ocnNiZGZlZGhoZm5qZm1taGtrbXJpcXZ0c3Ftdm5vcXJzd3Nyc3R1dnZ2dnd2d3d2dHd1anN1bnV0c3FyamtzTUdIRkhCQkFERTxBQEBDPDg6PD45Pzw/QkBAQERGSEVIRkZIR0ZGRENFQ0RJRUNGRUJFR0VGR0dFSU1LSFFNSktISElFRkhIRUNJSUlLTUtPU05EUVJPUFFOT01OUE1MTVNXVlhYVVhdWl1kYGliamlna19kZWZjZ2dna2dna21rbWxwcmh0dHVyc252b3FwcnR4cXNzdXZ1gpF5dnZ0eHV1d3htb3VvcnN1cXFpbnlNSEdISEJCQkZFPD9CQkQ8Nzs9Pjo+OkBCPj8/QkVGREdERUhFREVDREVGR0pFRUlHQ0dIRkhHRUNGSkpHTktMS0hKTEZJSUtIRUtLTE1OT1JUT0hTVFJQUk9RTU5RTk1QV1pWWllWWl1aWGFgYWBeaGVjYGRlaGdqaGhpZmhubGxubXFwaXV1eHJycHVwcHBydXZwdXN1d3V7fn14dnR3dnZ2eHBsdXBtc3RucHJyeE5ISEdJREJDSEU8QEVDRT04OT4+PTw8QUI8Pz5BQUZDRkNESURERUVGR0dHSUZHS0hESUhHSUdGREhLSUdLSE1LSktMSExLTEtJTUtPTk9SVVZPS1VWU1BTUVJMT1FQT1RZWllcWllbXl5dYGNeXGFja2JgZGdocoVoZ2lmam1ucG9uc3JqdHV4cnNzdHJucHF2cnF1cnV1c355jn11dXZ2dnZ4cmh1cWtydGxxdnB0TElLSUtGQkVHRTxAR0NEQDo8PkA/Pj9CQTxAPkJBRkNFRUVJRUZFR0ZISEZISElLSkZKSEhLSEZGTEhISEpHTExNTExJTUtNTU1PTFBQUVVWV09LVlVUUlJRUkxPUlJRVltbXV5bXF5eXmBgYWRdY2BlZmBlaGpkc3Nmamdna29ycW9zc25zd3dxdXZ0c21vcnVvcnNwdXJ2cnSBdnV1dXd2dXd0Z3Rya3Fya3J2bnZKS0xKTEdDRURFPEBGRERDOz8/QkBAQERBP0I/QUNIQ0ZGR0lGSkZHRElIR0lISkxISEpKSUxKRkpMSElLSkdLS01NSkpNTE5OTVBLT1BSVFhWTU1UVVRSUlFQTU5UU1JXW11eX11dYF9gYWFgYWNlYmRoYmRpamd2i2xqaWdtb3NxcHFwcHJ5dnJ1dXRzbW1zc21xcm90dXRycHN3dHV1d3Z1dXRlcXNrcHFqcnVud0tMTExNR0RDQUQ8P0VFRUM9QUFDQkJDREFDRUFBRUdDSEhJSEdKR0NHSkdISkZJTUhJSk1LTkxHS0lIS0tOUUtSUU1TTUtOTk9QUE9UT1dYWFtOUlBXXFpSV1BOVFVUVFhaX2JiX2RhXmBiXmBlYWFjaW5nYmloaG54dmxoaW1vc3JwcXJycnZ0c3Vzc3Nua3NxbXByb3R2cnFxdXZ1c3d5d3V0dWNtdGtvcGpxdG93TE5MTExHRUFARD4+REVGQ0BEQkVEREZCQ0VHQ0NJRkNJSkpJSUtHREtKR0lKSUlMSEpKTkxPS0lMSEpMS1pmSmRcS2xTSE9OX25Va3NbcXBid2NTUGF2dWh1Y2F2YFhucWJkdmluemZbbHRgbGpUX3d2aWpnaGZnbG1qbW9qbW5zcnBycnFyc3Jzc3J0cm5sdG9ucHFxdXVxcXN0dnZ1dXl3dXR0YGt0a3Bwa3FycXlMTkpKSkZDP0BCPz1ERUZEQ0RDRUVERkJGRkdERUtGRkpNTEtMTEdHTUlHSktIS0tJS0tOTE1MTExJTE1MW3NiZHBebG1VTU5mc11mZnFsbnRncGlfYVlubmJwcGJrampmb3F0ZXRub1xvdWdwTUpxeXZrYWBrZWVteGxrdmxtcHNycHJxcHFycXJycnRybW1zbm5vcHN1dHFzc3R1dXV0d3h2dXRibXVrcHBscnJxektMSUhHRUQ/QUJAPkNGR0NGQ0ZFRkVEQ0hISERFS0hHTE5OTE1NRkpOSEpLSklMS0pKS0xNTk5NTUpNTU5bcm9vbnBwbGtNUFFsV01pYnRycGFtbnVcWWxQXG5tWnFta29teHh0c2lwXV9ya3FqVXV5eG9jXmtmYmdwb2pqbm9wcnNwcXBxcXJycXFycnRsbXJtbm5vcnV0cXRydHV1dHV1enZ1dGVudWtwb2xzcnJ5SUtHR0VFRUJCQj5AQEZIQ0dESUZFRUJGSUhIRUhMS0dNTU9MTU5HTE1JTEtJSk1JS0pKS09QT05MTE5OTFxoZHVdbHFXbE5QUW1UWWtea2x2YWxkc1NlY05tWWxcdHBraWx4and1aHBdXnJraFdiY3d8b2NgZ2dhZGl0eGtubnFzc3BxcHFwcnFwcHBydWttcW1tbW9xc3Rxc3J0dnZzd3Z6dnV0aG91bHNvbXNydHZITEZJREVFQ0FCPUJBQ0ZESEdMSEVDQ0hLSUhGSkxMRk5MTFNSTEdMTEhOSklITkhKSklITk9NTkxKTk1KWnNwcG9xcW1sT1FSbllya2dvb3Fxb210XW5YYXRfbm9wb3Fyb251c3R0altedGN3eHJqbnpoYWFjZmJiaW10dXBzdXZzcXBwcW9xdHt/fn13bGtxbmxtbnByc3F0dHN1dXR4eHl4dHVrb3VtdG9uc3N2c0hLSElCRUVFQUE+RERCR0RISU1JRkNGSkxKR0ZLTkxGT0pLV1JLR0tKSk5JSEpMSUtKSEhLTU1NTUlLS0tTa2NbaV5faWNyclpfWWpuX2VlVWtfY1thYVFgbGhdalxuaWlkW3BmZHBdWlxrW21xY3BzbGRnY2RnYGBqbXFwbnR5cnVxb3BxbnmFiIeHhoWAdnNua21tb25xcnR0cnR1dXZ5eHhzdW5xdW52cXF2dHdyR0dGSURFQ0ZBQEJGRURHQkhKTEhGREdLTElFRkpPTElQSUxbUUpFSEhLTUlISkpLS0lISUZLS0tMR0hLS0xNTUxKS01OVFtcVFBUTFBPTk9PVlFPTlFOT1FKSk9QUWRxaVRZV1xbXFZZW11YXVxcY2ZhYWViY2ZfX2ZrbmltdHlydHJvcHB0hoeGhoaFhYaHg3pwbW1sa3FzdHRydHZ0dXl4eHV2cXJ1b3ZydHN1dXNHQ0VHRUVBRUNAREhERkdDSUtMSEZER0tMSUVHSVBLTE9LTFdMSUVFSElKSElLSU1KSEZHR0lHSElFRkxJSkxPTUpQXFdeUFxbYF5NWFlTXFxiXk1YWk1YYVJLWWFaUl9kXGFYW2RkVlZYXFlaWFxWWVxdYl5kYGFfZWhrZ210dHFxdHBxcoGGhoaFhoWFhYaGhoR9cmtpb3Jzc3N0d3l5eHl4d3h0cnhyeHNxcnVydE9CQ0RMTUJEREJFSUVHR0ZLSktIRUVJSktGRUhIUEtNTUpNUkhHRUFIRkpJS0xKTEpIRkRJRkRGR0VGS0hDSk1MTFVfWWBYYGFbYFRYWVReXlpfUllcUF5cWU5eXF5TWl5jXlpdYGNgWV9jW2BeW1RYV1leXWNiY2FjZWhla3Jwb3Bwbm93hoaFhYaCe4CFhYaGhoaFf3VxcHJyc3Z5eXp5eXh4eHdyeXZ4cnF4dnR2YVJKSk1JRUNCQ0dIRkhHSEtKSklERktLS0VGSUpOS05LSExOR0hFPkdHTElLTEtLS0lHREhEQ0RFQUZKRUFLTEpPW2NZX15hX1JUUldfYFxdWV5RWVxNVl9XS1FZW1BaX2FhXV5jYWBiYmJjY2VaUVlVVVxZXWNgX19jZGJob21ubGxsbHWFf4SDeXV8hIWFhYaGhYWGhoN9d3JydHh5eXl5f359eXV5dnZybnp3dnhZUUtGREdFQkVHSUZHSEhGRklHSEdIS0lMRERLS05NTEtIS0pISUY/R0dOS0tLTUtLS0lGR0NEQERBSElDQEpLSFBdYVpbZF1fVFFSWF1cXFxfWktXXExSXFlJTV5RT1xfYWNjY2NiXWRjYmRjZlhRVlRRWldaYF9eXmFhX2Rsa21qamxudn51gXp8hIWFhYWFhYaGhYaFhoaGgnpyc3V1e4WHh4eGhYSBfnhwend2eFxSTUNASUZERktKRkZGSEdHSUdGRklMSk5GREtLTU5KTElLSkhJRkJISFFNTEtPTUpLSUdHRUQ/RUNJSUNDSEdFVF1ZXlhfWV9bXVVYWFBdXVFLSlZeWF5bXVVZYVJRX19iYmBgYmJgY2JhZGRiWE9RUFFaUltdXV1dXl9fZGhnbGpubnB7e3x+e4CCg4SFhIWFhYWEhIWDhISHh4FzcneFh4eHh4eHh4eHh4WDgHx4XFNLQ0FIRkRHTVJIQ1FKRUdISEVGS0pNUEVGSUpLTkxMSUtMSUlIREhLUU9NTVBMTEtLSElDREFFRElHQ0NIRkRXVUVcVF1TVl9YT1RVTlpaTUlKVGBhW19YXl5hXU5YYVxgYF9iY2JdYWJXX19UUE9PT1dRXFtbXFxeX2JmZmVsZW9vd3x7gHt9f4CEhISEhISFhYODhYKDgoWFhnpvgYaGhoeHiIeGhoaFhYSFg35KTkZERkZIRElSYlBDVl5JR0dIREZNSlBQRUlJSktOTEtLTEtJSkdFSk5RUU5PT01NTE1IS0FEQUNER0RDQ0ZHQk1IQktLT09OTEZNRkdJSkhHTEtNT1BJTE9QT1NQS09TUlVaWVdZWFhkV09TVFBQTk1OVFJaWFhaXVxgYWRlY2dja2xwc3J5eX97en+EhISFhISEhIKEgH57gYOBfXuFhIaGhoeHhYWFhISEgoGAfUtJRUVIRkdES01dTEZHWExHSEpIR01MUVBIS0tLS01NVU5PSkpLR0dLUFNTTlBPTU5OTkdLRmBFRF9MRWdkRk5cSV5bcm1PTVVtWUxEUGBVa1dnSl1XVV5ETFFVTExTVlFSVFhXVFhVVFxVUGZaaGhkWFJqUlZVVFtcW2BgYWJhYl9maGZua2hyenx9foGEhISEg4ODgX18enJ7gXp7f4KAg4SEhYWBhIWBg4N/fnp7TElFR0ZIRUVLT1NJSkZgU0hKT0pJT01SUUxNTExPUlVST09JTE5HSE1RW1lPUFBOT09PSUpRf1FJfFlZcnRZUW1IcW5vYVZQcXFzUENrc21xc3BTb19ablhdVlxYVWtoVV1WY1pgWVtfVlZYf2p0dXVeX3ZeV2FbW2ZbX2BhYWFdX2FnbXBsX3B3dHiBgYKDg4J+fX+Adnh6bHZ+dHh9gHx+gIGChHyAg3p/gX9+d3dOSkVITU5CRExMRklLRVFVTEtOSUtSWFdRTk5PTVFUTk9RT0tLTkdNUFNbWlRRUk9QUFBKSFp4XVR4ZWhaU1VSdmd0bHBibmZqUXJPTXdtanJwc3Jxcm9vb4BdZXp1eHFxenF+c31rdX1iUmh8ZXNzb3Jye3xvfnhugHJfYGBiYVpgX2drbmtibGZnbXd+gYCCfXt4d4B0dnppcn5uc3x+d3h7foCDeHyAdXx/fHxzc05MR2BdR0FFTU1ISkpHSU9OTU1KTlZeWVVMUVNOWFpNU1NSTUtPSFFSVFlXV1FUUFBQUUtIZ3hsY3hybVtLTlZ5cHVtdWJvdlBlZUlmdnFtd2+AamZ4d2lXclFoem1panp6fWx4en9vaG9ZdnZqdnVwgF9yZn1pbHh8b15fX2JhWl1iZGdpaWRnYmNkbGxwcHN0c3NzenFyeGJsdWdyeXtzcnZ5foFzdXpufH15eHJuTktTdU5DQkZQUEhKS0lLUE5OT01QWmBaV0tUV1BhXlJWUVlSTFBJU1RVWFdXUFVQT05SSktyb3V1cXVxZGliV25McXBeRmh5V3ZUTGl5fXhgeXtzbmFdbW9jUmdxdW5teXB3bHZ0dHJsbl10fnprbXl8a3RsfGtwdnV4Xl9fYl5cX2RkaWdnZWVeYWJpaWlqa25va3FvbWpwYWNmY293eG9tcHN5f25xcGt7enRyb21MTFtWSEdFR1JQSUxNSktQUVBQUFBXXFlVTVVZVWVYUlJZXVNMTklUVFdXWVdPU05OTlFJUm1IaXdLYGR2dlZYbE9ubHtzYWpnf3ZVTFdraH1sbWx4X1pwenteYHpzY3JveHFoZH1pcnxeVExsX3Z1a2l1e3ptfnhrfHBcXl5iW15hZGRmZWVlYlpjY2lra3JzcnZnbGloZGdhYWthZ3NybGdtbXJ9a21oa3t0bW1rbU9IS0tISkhIUVBMTk9MS1JSUk9TUldSVlRQV1pWVlVUVGFfUE5NSlRTVFFWVk5OTE1PUEtIUU5QVUxLTFNUVFNUUFZVUVFOUVFYWVJOUFVUWFhYW1tVUlNXW1dYV1pPU1VXWFhSXllXXldVUFlSV1dXV1heWmdyXltbWVxdX2NaX2NjZGZkY2NiWmNiZ2ZlbW5tdWVlZ2NhZl9dZ2BkbGhmZ2tocHpoZ2dqdWpoZ2lsUElLTExNS0pTUU1RUU9MVlVUUFRVWFVaVVFaXVVVVFdVWVdPT0tNVlRRTlVTTk9NTFFQTEpSUUtRTUtMUFJVU1FSU1NJSExOT1FSUVBRVFZSWFdcV1NSUFJUVVVTWlFOU1JYVlRZV1VaVlRSVlRUVVdYVlxZXWBdW1paXFxfY1tdYmNkZmRkZGFZYGFjYWJoaGltYmFkXl9jXVpkXGJtYV5mZWZtc2RpZ2prZWRjZmhQSktMT09MTVNQTlNRUE1YV1VUVVdXV1lVU1xgVldWWVVYUlBQSk5XU1BOVVBOUU5MU1BNT1VTTlJOTU9RVVFVUVJUVU5LTU9RVFRSUlFWV1VZWltZU1VSVFdWVllbVFBUVVhVVVpWWFpVU1JYVlVXW1hZXlxVWF5cXlxbXWBgXVtiYmNnZmVkYlhfYWJeYGdkZmVhXl9dXV5aWl9aX2dgXl1dYmhrYWdmZ2ZkYGJjYk9MTUxRUUxPVE9PU1FPUVtZV1dYWllYWVZdamRWWFlaV1ZTU09KTlZUUE9UUFBQTU1SUlBSWFRRUU9NUFRWT1hSVFVVT05NUVRVVVRUUlRXVlpdXFpWVlFRVlhWW1tXUVRWVlZWWVRYWFZTUllXVlpeWVxeXlVeXF5gXFtfX19eWmJiZGhnZGRiWGFgYl5eZmNjYGJdXFxcXFlaW1hbYVxfXVxfYl9fYmRlYmRfX2BcUE1OTlJRTVJST1NUUU9VXFpaV1tbXFhaW2RxbWhkX1tYVVVXUUxNVlNNTlJPUVJPTFFTUlVaVVNQUE1RWFdSV1NTU1hNT09RVFhWVVVTVVlYW15dW1tWUU5VVlVbW1dSU1dWV1hWVFlbVVRSWlhXXF5aXl9fVGFcYGFdYGJfXGBdY2BjZ2hkZmBZY2BhX19lZF9gYltaXFtcWVpZWFdcWlxbYF5fW15eYWBfY1xZYFtRTk9OVlFQVFFPVFRTUFdcXFxYXlxeVlxeanF3eYBjXFtVVVdQTU9WU05RUU9SVFJMUlRUWVpXVU9ST1NYV1RTVVJSWk9QUlJWW1ZXV1NWWlhcXVtbXVZSTVRVVVtcVlJVVlZYWVNVWlxVU1NdWFpdXlxgYF9WYVtjYl1hZF5cYmFiXmNmaWRmXVtkYGFgYGNlX2JeWVpeW1xbWFhZV1daWlphXF1bXVxcWl1gV1tbWlBPT09ZUFVUUlFXUlRQW15eXVtgXGBVXF1oanJ9c2xnW1RXV1FOUlpTUlFUUlRVVEtSV1ZbWlpTT1NRVlZWVE9XUlNaUlRUVFhdV1hZU1hdWF5dWVpdVFROVVZXXltYUlVVWVlZVVdaXFZTV15aXV1gXWJiXVlfW2VhX2RkXl5jY2FdZWZpZGZdXWRhYGFhYmRgYl5YWl9aXFtYWFhXV1tZW2BcW1tcW1haW15WXlldUU9PUlpQWlRVVlZTVFReXmBeXmJcYFVdXmJreXRsfWtaVFlUUFBTXFRVVFVUVllXTFJbV11bXVJPVVNYV1dUUFhSU1dTVlVVW11YW1lVWl5YX15ZXFlSVlFZWFlfW1pUVVZaWVpXWFpcV1VbXl1eYGFfY2NcXl1dZWFhZmReXmRjYFxnZGhlZGFfZGFgYWBiYl9gXldYXlpcXFpZWVdWXVpdXlpZW1xbV1lcXVZYV11TT1BWWVFdVVZZV1dVWF9fYWFgY11fVV1eYmVldYF6aFdYWVNVU1ZcWFdXVlZXXVhPVV1aXl1cVFJYU1dXVVNUWFJTVlRYV1hdXlhdW1ZdX1hfX1hcVlFYVFlaWmFaXFZXWFtaW1lZWltZV15fYF9jYmFkZFxiXGBmYWRmZF5fZGJhW2ZjaGVjZmBmX19hYWFhYF9eVlVdWVtcW1lbWVhdWltbWFhZW1laWl1fXVRZXVVOU1lWU1xUVldZVlZcYGFiY2BjXl9WW2BkYV96dW9oWVpZVVdUV1taWlxZWFlgV1BVXlxgYFxUVFhQVVdWVFZXUlNVV1paW19eWl9cVl9fWl1eWV1VUlhXWVldYlpeV1hbXFtcXFtaXFpaX19gYGRiY2RlYmRaYWVjZmZlXWFiYGNdYmNpZGNnX2deYWFjYWFgXl9YVFtaWltbWFtYWFxbWltYVllYV1xbW2BdVl1dU09WWVZWWlVYVVhXWF1fYmFkYWRgXllZYWRiYGxmaF5cXFpWV1hZXFxdX1tZW2JWVFheXWFjXFJWWVBXV1dXV1ZTVVRYXFxeYGBdYFxXYV5bXltaXldVV1dbW19gXF9YWVxcXV5eXFtdWVtgYV5gZGNkZWVmYlhjZWRoZ2ReY2BgZWNcZWlkZWlfZl1jYmNhYWBfX1tYWVpZWlpYWVhXW1taW1dYWlRZXVxaYFxVXmJOU1dZVldZWFtcWFdZXmBiYWRhZGFdXllhY2JfYWBgXlxcXFdXW1tdXV9fXFpdY1laWF1gY2RfUlhZUFdXWFlZV1ZXVlxdXmBhYF9iXllhXV1eWVxeWVhVVltcYF5dX1paXl1eXmFdXFtaXGBiX2JlY2VmZWZiWmRmZmlnYl9jXmFmZFloaGJmaWNlXmJiY2FgYF9dXVpYXFlZWFhaWFdaW1pZV1hVVVtdXV1gYGJieEtYV1tZVlxbW11aV1xdX2BiZGFiYV1gWGJjYmFjYWJdW1xbWFdcXF9dYF9dW2BkXVxYW2JlY2FSXFpPWVhaW1taV1pZYF1gYmJgYWNfXGJdX11bXl1ZWFRYXV1fYF9gXFteXmBiY1xcWFxeYGJiY2VkZmRlZmRcZWZnaWZjYWJbY2dfXGloYmhpZWRgYmFjYV9gX1xdXFlcWVhXWFlYV1xaWldWWE9YWl1hY2Zmcmt/SllXXFpaX1xbXltYXVteX2FjYmFhXWJbYmRiYGJiYlxbW1pXWGlxYFxgX11cYWNfXllZY2VkYVNfWlJZWFxdXVtaW1tjYGJiY2BiZGFgY15gXF5eXllYVVtfXl1hYmBeW2BhYmZjX11UXWBhY2RkZmVnZWZmZV5lZmhoZ2RkYFplZ11hZ2hjaGhmY2BiYWNiX19fXF1bWltZWFhYVlpWXFtaVlZWTVhXXGdpa2h1eIF2dnZ2dnZ2dnZ2dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6e3p6ent7e3t7e3t7e3t7e3t7e3x7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHt7e3t8fHx8fHx8fHx8e3t7fHx8fHx7e3t7e3t7fYmIhoqHhIKCgoOCg4OCgoKCgoKCgoKCgoGAgYCBgICAgYCBgYGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t6e3t7e3t7fHx8fHx8fHx8fHx7e3t7e3t7e3t7e3x7e3t7e3t7fHx8fHt7e3t7e3t8iYmHiYaFgoGCgoKCgoKCgYKCgoKCgoKBgYGAgICAgICAgIGBgYB9fHx8e3x8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eHh5eXl5eXl5eXl5eXt7e3t7e3t6enp6enp6e3x8fHx7fHt6enp6ent7fHx8fHx8fHx8fHx7e3t7e3t7fHx8e3t7e3t7e3t7fHx8fHx7fHt7e3uHiYiJhYSDgYKCgoODgoKCgoKCgoKCgYGBgICAgICAgICAgYKBgH58fHx8fHx8fHx8fHx8fHx2dnZ2dnZ2d3d2d3d3d3d3d3d3d3d3d3h4eHh4eHh4eHh4eHh4eHh4eHl5eXl5eXl5eXl5ent7e3t7enp6enp6enp8fX18fHx9fHt6enp6e3t8fHx8fHx8fHx8fHx8fHx8e3x8fHx8e3t7e3t7e3x8fHx8fHt7e3t7e4aJiYiFhYOBgoKCgoOCgYKCgoKCgoKBgYGAgICAgICAgIGBgYCAfnx8fHx8fHx8fHx9fX18fHVwb29vb3Bwen59fX19fYSMi4uLi454KSkqKiopKz0/Pj4+Pj5tgH5+f397pdfT09PT1ryGiYmJiYiQzNPS0tLT2FolKioqKiKM29LS0tLWun1+f39/f359fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx8fHx8fHt7e3t7hIuHh4aHgoGDg4GCgoKCgoKCgoKCgoGBgYCAgICAgICAgYCBgIB+fHx8fHx8fHx9fXx8fH19dXBub29vb296gH9/f39+hpCPj4+Pk3kZGhoaGhocMTMzMzMzMmqCf4CAgHut6eTk5OToyomMjIyMipTd5uTk5eXrVBMaGhobEI/v5eXl5enHfX5/f39/f319fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e3uCjYeIh4eDgoSCgYKCgoKCgoOCgoKCgYGBgICAgICAgICAgICAgH58fHx8fHx8fXx8fH19fX12dXV1dXV1dXZ3d3d3d3d4eXl5eXl6eG9wcHBwcHBycnJycnJyd3p5eXp6en6Dg4ODg4SBfHx8fHx8fYOEhISEg4R4c3Nzc3NzfYSEhISEhYJ8fX19fX19fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e4CMhomHh4SDhIKCgoKDgYKCg4KCgoGBgYGBgYCAf4CAgICAgICAfnx8fHx8fHx8fX19fX19fXZ2dnZ2dnl3dnZ6e3h7eHd2d3p4enl5fXp5eXh4eHh5eXl5enp5eXl5enp6eXh4eXl5eXl7e3t7e3t7eXl5eXl5eXx9fX19fX17enp6enp6e3x8fHx9fX19fX19fX18fH19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8f4uHi4qIhIODgoKCg4KBgoKDgoKCgYGBgYGAgIGAf4CAgH+AgYF+fX18fHx8fHx9fX19fX19d3d3dnZ3fXh3d316eH14d3Z5fXt7fXp8e3h3d3d3eHh4eHh5eXl5eXp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fHx8fHx8fHx7e3x8fHx8fHx8fHx+iomNjImFg4SEgoKDgoGCgoKCgoKBgYGBgYCAgICAgICAf4CAgH19fXx8fH19fX19fX19fX13d3d3d3p9eHt4fHx3e3h3dnp9fHt+eXx6eHh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fX19fXx9fX19fX19fX19fX19fHx8fHx8fHt7fHx8fHx8fHx8fH2Kio2NioWDg4SCgoKCgYGCgoKBgoGBgYKBgIGBgICAgIB/gIGAfXx9fX18fX19fX19fX19fXd3d3d3fX55d3d4e3p7eHd2e318eXx6fHt3eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt8fHx8fHx8fHx8fHx8fH19fX18fH18fH18fHx8fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8foqJjo2JhISEg4KCgoKBgYKBgoKCgYGBgoGAgYKAgICAgH+BgIB8fH19fX18fX19fX19fn5+d3d3d3d5fHl7eHx9eXt5enl6fXt7fHt9e3h4eHh4eHh4eXl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt7fHx7fHx8fHx8fHx8fXx8fX19fX19fXx8fHx8fHx8fXx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx/iIeNioeFhoaDg4ODgoGBgoGCgoGBgYGCgYCAgoF/gICAf4CAgHx8fX19fX19fX19fX5+fn53d3d3d3Z4eHl3eXp4enh5eXh7eHp6eXt5eHh5eXh4eHh5eXl5enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX18fH18fH19fX19fH19fX19fHx8fHx8fHx8fHx8fX+HiIyIhoeHhIKDhISCgYKBgYKCgoGBgYKBgIGBgYGAgIB/gIGAfHx9fX19fX19fX1+fn5+fnd3d3d3d3d3d3d3eHh4eHh4eHh4eHl5eHl5eXl5eXl5eXl6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fHx8fX19fHx8gIeIi4eHiYaEg4SDg4KBgYGCgoGBgYKCgYGBgIGBgYCAgICBgX97fH19fX19fX19fn5+fn5+d3d3d3d3d3d4eHd4dnl5eHh4eHh5eXl5eXl5eXl5eXl5enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fH19fXx9fXyBhoqKiYmIhIOFhISCgoGBgYGCgYGCgoGBgYCAgYGAgIGAgIGBf3x8fX19fX1+fn5+fn5+f394eHd4eHh4eHZxZGpeam15eXl4eHl5eXl5eXl5enp6enp6enp6enp7e3t8e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIGFiYqJioeEhYWEg4KBgYGBgoKBgYKBgYGBgYCBgYCAgYCBgIF+fH1+fn5+fn5+fn5+fn9/f3h4eHh4eHh5bWRiZV9fXm95eXl5eXl5eXl5eXp6enp6enp6enp6e3t7e3t7fHx8fHx8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goWKiomJhISGhYSDg4KBgYKCgoGBgoGBgYKBgIGBgICAgICBgH58fX5+fn5+fn5+fn9/f39/eHh4eHh4eW5kZWdlZGJeZnh5eXl5enp6enp6enp6enp6enp6e3t7e3t7e3x8fHx8fHt8fHt7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChouJiIqEhYaEg4OEgoGBgYGCgYKCgYGBgYCAgYGBgIB/gIGBf3x8fn5+fn5+fn9/f39/f394eHh4eHl3Z2VkZWZkZWFfaXl6enp6enp6enp6enp6ent7e3t7e3t7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHt8fHx8fHx8fHx9fX19fX19fX19fX19fXx9fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4eJh4SEhoSDg4WBgYGBgYKCgYGBgYKBgICAgYGAgYCAgYF+fHx/f35/f39/f39/f39/gHl5eXl5eWtlYWJlZWFlZV5ieHdze3p6enp6enp6enp6e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fH18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19g4aLhoiFhYaEgoOEhIKBgYGBgoKBgYKBgYGAgYGBgYGAgIGBgn98fH9/f39/f39/f3+AgICAeXl5eXl0Y2NlZGNmY2doZGZsZF5ze3p6enp6enp6enp6ent7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn6DhouGhoaGhYODg4SDgYGBgYGCgoGBgYKBgYCAgYGBgYCAgYGBfnx8f39/f39/gICAgICAgIB5eXl6d2RhY2diYmRdW2VfYV1eYGFoeHp6enp6enp6enp6e3t7e3t7fHx8e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+foSFi4eGhoaGhIODg4KBgYGBgoKCgYKBgoGAgIGBgYGAgYGBgYF+fX1/gH+AgICAgICAgICAgHl5eW9vYmJiZF5jZ19dYWFgXF9kYlttfHp6enp6enp6enp7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7fHx7e3x7fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5/hIiLhoSHhoaEhIODgoGBgYGCgYGBgYKCgYCAgYGBgYGBgYGBgX5+fYCAgICAgICAgICAgICBeXpwXWJlZGJkXmZnZ2BZYmJhY2VfXF1ze3t6enp7e3t7e3t8fHx8fHx8fHt7e3t7e3t7e3t7e3t7fHx8fHx8e3x8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fn19fn5+fn5+fn5+fn5+foCFjIqEhYaGhYODg4SCgYGBgYKBgYGBgoKCgYCBgYGCgICAgIGBf35+gICAgICAgICAgIGBgYF5emxiZGdjYmdmYWBgZGFiZWRjZGNeXGJ1fHt7e3t7e3t7e3x8fHx7e3x8fHx7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/gYeMiYWGhoeFg4SDgoGBgYGBgYKBgoKCg4KBgIGBgYKBgYGCgoF/f36AgICAgICAgIGBgYGBgXp7dGdnZmZkZGZmYF5fYWNlaGRlXmJkYHR8e3t7e3t7fHx8fHx8fHx8fHt7fHt8fHt7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f3+CiYqIhoaIhoWDhIOCgYGBgYGBgoGBgoKCgoGAgYGBgoKBgYKCgX9/f4GBgYGAgYGBgYGBgYGBenptaGNjZ2ZnZWdmZmdiZWRlYmdbYmVgdnx8e3x8fHx8fHx8fHx8e3t8fHx8e3x8fHt7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f39/f4SJioiGiYeFhYSEg4KBgYGBgYGCgYKCgYGBgYGBgYKBgoGBgICBgH9/gYGBgYGBgYGBgYGBgYF7emlpZGNqZmFgZmVjY2NnaWRjYmBiZGJ0fXx8fHx8fHt8fHx8fHx8e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f39+fn9/f39/f39/f3+AhIqMiIeJhoSFhYOCgYGBgYGBgYKBgoGBgYGBgYGBgoKBgYGBgYGAgH+BgYGBgYGBgYGBgYGBgXZzZWRnY2RmZWJlZmdkZmhmZWNgYGNkYHF9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fXx8fHx8fHx9fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/fn5+f35+f39/f39/f3+AgICFioyJiIqJhoaDgoKCgYGBgYGBgoGBgoGBgYGBgIGBgYGBgYGCgX+Af35/foCCgoKCgoKCgoKCc3NnZWRkZWlqaGZnZ2NhZmZlZmdmZWVjdX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fH19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gICAgICAgIWLioqJioeHhoSCgoGBgYGBgYKCgYKBgYGBgIGBgoKBgYGBgYGAf4B+dHRzdX1/goCAfn5/gYB0cmdkZWNmaWppZWNlY2BmZGRnZ2JiZWFwfXx8fHx8fHx8fHx8fHx8fHx9fX18fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f39/f39/f4CAgICAgIB/houLiouLh4eHhIOCgYGBgYGBgYKBgoKBgYGBgYKCgYCBgYGBgoCAgH5zc3NzdHV4dXV0dHV2dXVwZmNmZWhoaWdoZ2VmZWJfZGVmY2BiZ3d8fHx8fX19fX18fHx8fH19fX19fX19fXx9fXx8fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gIB/f3+AgICAgICAgICHjIyIi4qHh4eEhIKBgYGBgYGBgoGCgoGBgICBgoGBgYKBgoKCgYCAfnNzc3Nzc3NzdHR0dHNzdW9jY2FnZWhoZ2pmZGVnZmhmY2JlYl5ieX18e3t8fX19fX18fHx9fX19fX19e3x9fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn9/fn5+fn5+fn5/f39/f4CAgH9/gICBgICAgICAgYCAf4CAgYGAgIeLi4iNiYiJhoSFgYGBgYGBgYKCgYKCgYGBgIGCgoGBgYKBgoKBgIB+dHNzc3Nzc3Nzc3Nzc3N1cmdlZWRlamhoZ2ZpaGdjZWViZGNoZGd7eHVzc3R2dnl4dnR0dHZ3d3d2dHR0dXV4d3h4d3d6e3x9fXx9fn5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f35/f39/gH9+fHt7fX58eXl2dnZ5fHx6end2d3l7fXt4hIyMioyHh4iEhYSBgYGBgYGBgoGBgoGBgYGAgYKCgYGBgoGBgoGAgH51c3Nzc3Nzc3Nzc3Nzc3VzaGVnaGVrbGhqZ2lqZ2dnZmRkYmVkbnV0dHNzdHNzc3Nzc3Nzc3Nzc3NzdHNzc3Nzc3Nzc3N0dHV1c3V3eHl7fn59fn98f39/f39/f39/f314fH5+fXx4dXZ3eXd4dnRzc3N0dXRzc3Nzc3NzdHNzc3R0c3R0dHODjI2KiYeIhoOGg4GBgYGBgYGBgYGCgYGAgYGDgoKBgYCBgYGBgYCAf3VzdHRzc3Nzc3Nyc3NzdnZpY2hqaGpsZWZpbGhgZmVkY2BkZGZ0dXV1dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHRzdHRzc3Nzc3R2dnV1d3V4fH9+fX9+fHp4dXN0dXV1dHNzc3Nzc3N0dHR0dHR0dHR1dXR0dHV1dHR1dXR1dXV1dIaMjYuIhoeEhIWCgYGBgYGBgYGCgoGAgYCBgYKCgoGBgIGBgYGAgIB/dnNzc3Nzc3Nzc3Nzc3N2dnNnZ2pmaGdmaGhmZGlnY2NnZWVmcHZ1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dHR1dHR0dHR0dHRzdHR0dnV1d3Z0c3R0dHR0dHR0dXV1dXV0dXV1dXV1dXV0dHNzc3N0dHNzdHR0dHR1dXR1iY6MjIqHh4SEhYKBgYGBgYGBgYKCgoGBgICAgoKBgoGBgYGBgYCAgH93c3Nzc3NycnJyc3NzcnZ2dW5kXWNnZWlraGVoZ2dqamlnZXB2dXV1dXV0dHRzdHR0dHR0dHV1dXV1dXV0dHV1dHR1dXV1dXV1dXV1dXR0dHV1dXV1dXV0dHV0dHV1dXV1dXV1dXV1dXV1dXV1dXV0dHNzc3Nzc3N0dHNzc3Nzc3R0dHR0dHWKjoyMiYaGhIeFgoGBgYGBgYGBgoKBgYGBgYGCgYKBgYGBgYKBgYCAf3hzc3Nzc3JycnJyc3NzdnZ3d2liaGhnamtpaGZkZGVmaWhwdXR0dHRzc3JxcnJ0dXV0dHR0dHR0c3NycXFxcXNzdHR0dHR0dHR0dHV0cnJyc3R0dHR0dXV1dXV1dXR0dXR0dHR0dHR0dHR0dHR0c3Nzc3Nzc3Nzc3Nzc3N0dHN0dHR0dHR0dYuOjImGhYWFh4SCgYGBgYGBgYGBgoKCgYGAgIKCgoGBgYGBgYGBgIB/eXNzc3NycXJycnJzc3N3d3d3bGpoZGhpa3Z6a2VmZWhnbXJzdHN0c3JwcHBxcnN1dXR0c3Nzc3JycXBvb29vcHFzc3NycnJyc3R0dHNxcXFyc3R0dHR0dHRzc3Rzc3N0dHR0dHRzdHR0dHR0dHRzdHR0c3NycnFxcnJzc3Nyc3NzdHR0dHN2jZCMh4eFhYSEgoGCgoGBgYGBgYGCgoKBgYGAgYGCgoGBgoKBgYGAf395c3NycnFxcnJycnNzc3d3d3dzc2pnaWloeX99cW51bG5wcXJycnFxcG9wcXFxc3R0c3NycXFxcG9ubm1ubW5ubnBxcnJycnJycnJzcXBvb3BxcnJzc3JxcnJycnJycnJycnJzc3Jzc3Nzc3Nzc3Nzc3Jxb29ubm9vcXJzc3Jyc3NycnNzcnaPj4uHhoWFhYOCgoKBgYGBgYGBgYGBgoGBgYGCgoKBgoGCgYGCgX9/f3hxcHBwcXFycnJyc3Nzd3d2dnd2cnF0c252f352c3hwcHBycnJycXFwcHFxcXJzc3Nzc3JxcXBwb25ubm5ub25vcHBxcXFxcXBwcXJwb25vcHFxcXFxcHBxcXFxcXJycnJycnJycnFxcnFxcnJycnFwb29ubm1ubW5vcXJycnJycnJyc3JxeI+OjYaDg4aEgoOCgoGCgYGBgYKBgYGCgYGBgYKCgoKCgoKBgYKBf4B/d29wb3BxcnJyc3Nzc3J2dnZ2dnZ3dnZ1c3l/fnd3d29wcXFxcXFxcHBwcXJycnNzc3JycXFwcHBwb29vb29vb29wb3Bvb29vcHBxb29vcHBwcHBvcG9wcHFycXFxcnJycnFxcXFxcXFxcHBwcHBxb29ubm5tbW5tbm9wcXFxcXFxcXFxcXB7j42NhoODhYOCgoKCgYKBgYGBgoGCgYGCgoGCg4KBg4KBgYGAgYF/f392bm9wcHBxcXFxcXBwcHZ2dnZ2dXR0c3NxfYB9fX9zb3BxcXFwcHBwcXFwcXFxc3FycnFxb3yCb3Bwb29wcG9vb29vb29vb3BxcXBub3Bwb29wb29wcnJycnFxcXBxcnFwcXFxcHBwcHBwcHBwb29ubm1ubm5ubm9ub3BwcHFxcXFxcXFxcIKRjoqEhIOFhIOCgoGBgoKBgYKBgYGBgYGCgoKCgoKCgYGBgYCBgX9/gHVvb29wcXFxcXBwcHBwdnZ2dXRzcnJycnGAgoCBeXBwcHBvcHBwcHFxcXFxcXCHhnBycXBzmIJucHBwb3BxcHBvb29wb29vcXFwcG9wcG9vb25vcHFxcHBwb3Bvb3BwcHBwcHBwcHBvb29vb29vbm5tbW1ubm5ub25vb3BvcHBwcHBwcHBwiZCMiISDhIaDg4KCgYGCgoKCgYGBgYCAgYGBgoKBgYGBgYGBgIGBgH+AdG5vb3BxcXFwcG9vcG92dnVzcnFxcXFxcICDg39ycHBwcHBwcHBwcHFxcHBxcX2hgnByb4uefG5wcHFwcHBwcHBwcHBvcHBxcXBwcHFxb29vbm9wcHBvb29vcHBvb3BwcHBwcHBwcHBvb29vbm5ubm5ubW5ubm1ubm9wcG9vb29vb3BzcXWPj4uJg4KFh4ODgoKBgoGCgoKBgYKBgYGBgYGBgYGBgYCAgYGAgYGAf4B0b29vbm9vb29vb29vb3Z1dHNxcXFxcXJygIKCgXRxcXFxcXFxcXFxcXFxcXFxdZ2hd3F3n5x9b3FxcXFwcHBwcHFxcXBxcHBwcXBwcHBwcHBwcHBwcHBwcHFxcXBxcXBwcHFwcHFxcXFxcXFxcXJxcnFwcnRycnR0dHR1dnRzdHR0dXd3gpCPi4iDgoaHhISCg4GBgYKCgoGBgoGBgYKBgYGBgYGAgICBgYCBgYB/gHVvb29vb29vb25vb29vdXRzcnJycnJycnKDg4OCdnFycnFxcXJxcnJxcXJycnJxmKiQb4KjnX5wcXFycXFxcXFxcXFxcXFwcXFxcXFxcnNzcnJyc3V1dHR0dHR0dHV2d3d3d3d3eHh4eHd3eHh3d3Z3dnV2dnZ2d3h6e3x7e3t6enp6enyGkI2LiIODiIeHhYODgoGCgYKBgYGBgYKCgoGBgYGAgYCAgYGAgIGBgH+Ad3FxcXFxcG5ucG9wcG92dHV1c3Nzc3NzdYiDgYN5cnNzcnJyc3Jyc3Nzc3JzdHKTqaR5iKCdfHJzc3Nyc3N0dHV1dXV1dHV3eHd3d3d4eHh3eHh4eXl5eXl4eHl5eXp6e3t7e3t6enp5eXh3d3d1dnV2dnd5enp7fn5+fX1+fn5/gH5+gIyQi4qHg4WIi4iEg4SDgYGCgYGBgoGBgoKCgoKAgYGBgYCBgYGAgIGAf4B8enp5eXx5eHh2dXZ2dHl2d3h3d3Z3dnZ6fnx+fXx2dnd3dnV4enh4eHh4d3h5eZ+0qaSoqJd9e3l5eXh4eXl6enl5eXh4enp5eXh4eHh3dnd3eHh3eHh5eXp7e3p8fH1+fX9/f359e3t7e3p5enl5e3t/foB/fn5/fn19fX5+f35+fn6AjpCNioeEhoqLiIaGhIOBgoKBgYGCgYGCgoKCgoCBgoKBgYGCgYCBgIF/f4B/fn19fX9/f318e3t7eXh4eHh5eXl4eXh5eXl4enp6enp6e3t7fH1+fHt8e3uJr6ahtauso357enp4eXh4ent6enp5eXp8fHt6enx8fHp6ent9fHx+fn+AgoGAgYKAgH9/gYGBgIB/f35+fn5/fX1+f4CAf35+f39+fn9/f39/gH+Af4OQjoyHhoWIi4yIh4aFg4GCgYGBgYKBgoKCgoKBgYKDgoGBgYGBgIGBgIB/goOCgoGBgX99f39/f4F6enh4d3h4eHh5eHh5enp5e358enx9fXt8fX19fX19fZillqGyoJmnk32Af319fYCDgoCAf318fXx9fXt9fXx8fH19fX1+gYGChISDgoB/gYGBgH9/f4B/f39/f39+fn9/f39/f35+f3+Af39/gICAf4CAgICAhJCPi4eGhoiLi4mKhYaDgoKCgYGBgoGCgYKBgYGBgoOCgYCAgYGAgIGBgH+ChIKCgICAgH9+fn+AgH9/fn18fX19fYB/fX+Af35/gH9/fn9/gICBgICBgIGBnJyOoK+gn6KfgICBgH5+f39+f4B/fn5+f39/gYB/f4CBgYCAgYOEgoGCgoGCgH+AgYCBgYGAgH+BgICAf39/gICAgYGBgIGBgYCAgICBgoGBgYCAgYGFjo6MiYaHiYyLi4qGhoOCgoKBgYGCgoOCgoKBgIGBgYKCgICBgYCAgYGAf4KFg4KBgYCAf39+fn+AfX5+fn19fX5/fn9/f35+fn+AgYCAgICAfn9/gICBgYCXmo6YsaGYlpyFfH5+foB+fn5/f35/gIGBgoKDg4KCg4KBgYKDg4OCgYGBgYKBgoKCgYKBgoGBgYGBgoKCgYGCgYKCgoGBgoKBgYKCgoKCgYGBgoKCgoaPkY+KiImKjY6MiYaFgoKCgoKBgYKCg4KCgoGBgYGBgYF/gIGBgYCBgIF/gYWEg4KCgoGCgYCAgIB8fHx7fH18fH9+fn9+fn5+f35+f39/f39/gH5+gIF+fp+rpZakm5uWoJ+Gf359f4B/gIF/f39/f3+BgYGCgoCAgYKDg4SDg4ODgoKCgoKCgoKCgoKCgoGCgoKDg4OCg4ODgoKCgYKCgoODg4ODgoKCgoODg4KCh5KTkIuKi4uPj42Lh4SCgoKCgYGBgoKDgoKBgYGBgIGBgICAgYGBgIGBgYCAg4SDg4OEg4ODgoKCgXx9fHx9gn1+f4GCiIGCgoSCgYGDg4GBgYKDgoODho2fsqiioJidnaaoraigmZCHgYCAgYCAgH9/f3+AgICAgH9/gYODhYSEg4SDgoKCg4OCgoOCgoODg4ODg4SDg4KEhYWDg4SEgoKDhIOCg4ODg4OCgoODgoCKlJOPioqMj5GPjYuGg4KCgoKBgYGBgoOCgYGBgIGBgoGBgICBgYGAgYCAgH+BgoODg4SEhIOCgoKCfXx8fn6AgYOAg4OChIaFhoaFhIWFg4ODg4ODho2grbGmm5qgm56cnJ2hpKOdlIeDg4KDg4ODgoGAgIKCgYOCgYKCg4OEhYWEg4OChISEhIOEhISDg4OEg4ODg4OEg4SDhIWEhISDg4ODgoKCgoKCgoKBgYKCgo+UlI+Njo6RkY6KiISCgoKCgYGBgYGCg4GBgIGBgYGBgYCBgIGBgYCBgICAgIKChIKChIOCg4ODgoJ9fX2AgH+AgoGDg4ODhIaEhIOEhYWDg4GBg4OBg4uXmZeWmKCanZ2dmZqXkImGhoeGhoeHhoaEgoGCg4SDg4ODg4ODhISFhYWDhISFhISEg4KBg4OCg4SEg4KCg4SCg4ODg4OCgoKCgoKCg4OEhIOFhYWFhoaIk5OTkI+Pj5KRjIqIgoKCgoKBgYGBgYKDgoKBgIGBgYGBgICAgYGBgICAgICAhISEgoKCgoGBgoKBgX+AgYOCgICAf4CCgoGDg4KCgYODg4SDg4GDhYSCgYGGjpSTl5qcnJuUj4mHiIiHh4eIiIiFhIOBgIGBgoKCg4GCg4SEhYSDg4OEg4OEhIOBgYGCg4OEhISDg4ODg4OEhIODgoSDg4ODhIWFhoeHh4eIiIiJiY6Tk5KOj46Rko+LiYeCgoKCgoKBgYGBgoKCgoGBgIGBgYGAgICAgYGAgIGAgICDg4KCgYKCgYGAf4CBhYWFhoOCgYB+fn+BgoSCgYKDhIOCg4ODg4KChISDhIODiJCTjpSYkoeDgoWFhYOEhIWFg4KBgH9/gIB/gIGEg4OEhYWEgoKBgoOCg4OFhIKDhISEhYaGhoaGhoWFhoeHhYaIh4aHiIeGhoaIiYeGhYaGhoeIkZORkI6QjpGRjImHhYGBgoKCgoGBgYGBgoOBgYGBgYGBgICAgICBgYCAgICAgISEg4KBgoGAgYGAgYKIh4aHhYSCgH99fX6AgH+AgYGBgYGBgoGAgYKDgYKCgoGAh5uHi4eCgoKBgIGAf4GAgICAgH9+gIGBgYKCg4OEg4OEg4OCgoGBgoODg4SEg4SEhIOFhYaFh4eIh4eHh4eHh4eGhoaGh4WFhYaGhISEhIWEhYaSk5GOj4+OkI6JiYeEgoKCgoKCgoGBgIGCgoKCgoKCgYGBgYGAgYGBgICAgYGAgoSDg4KDgoGCgYKDg4iHh4iHhYSCgX5+gICAfn5/f4CBgYGCgoCBhI2DgH+AgIB/g4iOgIGCg4OBgIGAgYCAgICAgICDg4KDg4ODgoOBgYKCgoOCgYKCgoOCgoSDhISDg4SEhYWFhYaGhoaFhISEhYWEhIWFhYSEhISDhISEhISEipSTkZCQj46NiYaFhIOBgYKCgoKCgYGAgYKCgoKBgoKBgYCBgYCBgYGAgICAgYGAg4OCgoOCgoKBgoOCiImJiYiHhYSDgYKEhIOBgoKCg4SCgoSEgoOJloiEgoSCgn9/jJWCgoGChIOCh4iCgoSDg4KDg4ODg4SEg4OCg4KDg4ODg4KCgoKCgoGDhISEhYSFhYWFhIWEhIWFhYWDg4OEhISEhYWFhISEhISEg4ODg4OOlZKQkZGPjYyHhYODg4GBgoKCgoKBgYCBgoOCgYCCgYGBgICAgIGBgYCAgICBgICDhYSEhIODg4SDhIOGh4mIhoWDhIODg4WDgYCDgoWFhISDg4OChI6Zi4OFhISEgoCRmYaCgoKEg4KMkYGBhIWEg4SDgoKDhISDg4ODg4SFhISDg4KCgoKCgoSEhYSFhYWFhYODhYWFhYaFhoWEhIWEhYWGhYWFhIWEhISDhIODhJGUk5KTkI2MioWEhIODgYGCg4KCgoKBgYGCg4KBgYKBgYGBgICBgIGBgH+AgIGAgYaGhoaGhoaHh4aGhYSDhYaCgIGBgYGHgoB+f4GBj4yDgX9+fXx9jJyOgIKBgYKChJSUjIGCgYKDgY6biYODg4ODg4ODg4OEgoKEhIOEhIWEg4OCgoKCgYKCg4ODg4SFhYWFhIOEhYWGhYWEhISEhIOEhIWFhYWFhIODhIOEg4KGlJSSk5KPjYyIg4SEg4KBgoODgoKDg4GBgoKBgoKCgYGCgYGBgYCAgYGAgICAgICAhYWFhYaGh4aGhoWGg4ODg4GAgoKCgYKAf35/f4GVl4mAfX19fXuBmIyAg4GBgYCOlIyQgYKBgoKBjp2hpaCRhIKDhIKCg4OBg4SDg4ODg4OEhIKCgoKDgoKDg4ODhIWEhISEg4OEhIODg4OEhIODg4ODg4SDg4ODg4KDg4KDgouUk5KTko2NioaDhIOEgYGCg4ODg4ODgoGBgoGCgoKCgoKBgYGBgICBgYCAf4CAgICDhISFhYSFhYWEhIWCg4KDgoKDg4OBgICAgICAgJWfin5+gH2Hi36EhIOEgoODgo2JhYyCgoOCg4OLko+ZpqWXhIqIgoODgoKDg4KCg4KDg4WEg4ODg4SDg4SEhISEhYWEhIWEg4SEg4OEhISEhISEg4SEhYSDg4SEhIODgoKDkJSSkpKPi4yIhoSFg4OBgYKDg4ODg4OCgYGCgoKCgoKDgoCBgoGAgICAgIB/gICAgISDhYWEhYWFhYSFhYOEhIWDg4SEhIKCgoOCgoSBkaGKf4yFfYaJgH6FhYWEhYJ/fX19f4KEg4OEho+UlZKYoKCYlIaDhISEg4SEhIOEg4OFhoWFhYSFhYWFhYSFhoaGhoWFhYWFhYWFhYWGhoWGhoaFhoaGh4aFhYWFg4SEhIeTk5OSkoyKiIWGhYWCgoGBgoODg4OCg4KBgYKDg4ODgoKBgIGAgICAgICAgH+AgICAhYWFhYWGh4eGhYWFhISFhYSEhISEg4ODg4OEhYOJkYOEi4WCgYF+fYGHhoOAfn5/f35/gIOEg4SHmJebmJaZmJqThoSFhYWEhYSGhYWFhYaGhoWGhYWGhYWHhoaGhoaFhIWFhYWFhIWGhoaHhoaGhoaHh4iIiIaFhYWEhYWGjZSTkpGQi4qHhoeGhIGCgYKDg4ODg4KDgoGBgoODg4KAgYGBgICAgICAgICAf4CAgICHh4eGhoeHiIeHhoaEg4ODhIODg4OEg4ODg4OEhISEgYKCgYmBf359foWBf39/f39/f36AgISFg4ybiY2ZmZaUk42HhoaFhoWFhoeHh4iGh4eGhoaHh4eGhoeHhoaGhYODhIWFhoSFhYaGhoeHhoaGhoeHh4eIiIeGhoaHh4eRlJORkZCLiYiFhoWDgoKBgoODg4ODgoKDgoKCgoOCgYCBgICBgICAgIGAgIB/gICAf4aHiIeHh4eIiYmIiIODgoKDgoSEhIWEg4KCg4SEhIOBgICAhIR/fn1+gH9/f39/gIB/f4B/f4aElpmAfZGYmJeVj4iHiIiIhoaHiImJiYmIh4aHh4eJiIaHh4eHhoaFg4OEhYaGhYWFhoaGh4eFhoeGh4aGh4eHh4eHh4eFh5OTkY+RkIuHhoWFhIKCgYGCg4ODg4ODgoKCgoGCg4KCgIGBgYCAgICAgICAf3+AgYB/hoiIiIiHh4iJiYmIg4KCg4ODhIWHh4aFg4OFhISDg4GAgIGMiYGAgYGCgYGBgYB/gH9/fnt6gIufoZONmpuXlZKNiYiKi4qIiIiJiYuLioqIh4eIiIiHh4iIh4eGh4aEg4OFh4eHhoWFhISDhYWEhYWGhISEhYWFhoWGhYOJlJKQj5GOioaFhoWDgYGCgoKDg4ODgoKCgoKCgoKCgYGBgYGBgYCAgICAgIB/gICBgH+GiYiIiYeIiImJiIiEgoKDg4KDhImKh4aEhIWEg4OCgICAhISCgoKDg4KCgH9+fX19fX5+fHt7laOcm6Ghn5CCiouJiImLiomJiImIioqJi4mGhoaGh4WGiIiIiIaGh4SDgoSHiIiIh4WCgoGDg4KDg4SCgYKDgoGEg4SDgY6TkpCPj4uJhYWGhIKBgYGBgoODg4OCgoKCgoKCgoGBgYGBgIGAgICAgICAgH+AgIGAf4WIh4eHhoeIiIiHh4SCg4OCgoOFiYqJh4WHhYSFhYKAgYOEgoOCgoODgX59fX5+fn5+fn1+fX2Bk5WWoKGblIeJiIeHh4iHh4mHh4aIh4aJiYODhIOFhISFhYaIiIaFg4KCg4WHhoeGhoSCgoOEgoODhIKBgoGBgYODhIOEkZKQjo+Oi4eEhoaEgoGBgYGDg4ODg4KCgoKCgoKCgYGBgIGBgYCAgIB/gIGAf39/gIB/hYaGhYaGhoeHiIeGgYKEhIOChYeIi4qGhIaEgoaGgoKEhIODg4OCg4F9fH1/gH9+fn59fH1+fHp/j5SZm5qalY6DhIaFhYODhYSEhISEhIWEgoKCgYSEgYKDg4WGhYSCgoGCgoODhYSEhIWEhIaDg4OFg4KDgYKDg4SFhIeSkY+Nj4yJhYSFhIWCgYGBgYODg4ODgoKCgoKCgoKBgYGBgYGAgICAf4CAgYB/gICAgICDhIWEhYWFh4eHh4aAgYGFg4OEhYSHiIWCgICAgX9/gYSEg4ODgoKAfX1/gICBf31+fn18fX17enqDj5GOlZeYj4GBgoKBf36BgYGCgYOBgoGCgoKBg4SAf4CAgYKCgICAgYCBgoGDgYGChIODhISCg4SDgoKBgoSDhYWGi5ORj4+Pi4iFhYODhIGAgYGBgoODg4KCgoKCgoKCgoGBgYCBgYCBgH9/gIGBgICAgH+AgIKCg4OChIOEhYWGhn+BfoCBgICAgIGDgn9+fn5+fX+ChISCg4ODgn59fn+AgIGAfn19fX1+fXx6e3uGjI2RlJaFf39/gIB+fYB/foCAgX+AgIF/f4CBgX59fX+AgX9/fn+AgH+AgICAf4CCgICCgYCCgYGAgYGBgYKEg4aPkpCOj42Kh4eGg4ODgYGBgYGCg4ODgoKCgoKCgoOCgYGCgYGBgICAgH+AgICAgICAf39/gYGDhIGCgoOCg4SFgIB/fH19fn19foCAfn1/fn1+gIODg4KCgYF/fX1+f4CAgH99fX19fHt7e3p6enuJjY2SiX5/f35+f35/gH9+f3+Af4CAf359fn9/fn18fn+Af35+f3+Af39/f4B/f39+f4CBf4B+f39/gH9+f4B/hZKSj46Pi4uHiYWEg4KBgYGBgYKDg4ODg4OCgoKDg4KAgYKBgYGAgICAf3+AgIB/gIF/f36BgYSEgYKBg4OCg4OBgH98fn9+fX5/f4B/foF/f4CBhIOCgYB/f359fn5/gICAfn19fX17e3x6enp6eX+OjpSKgn9/fn9/f4CAf35/f4CAgoB/fH5+f35+fXx/f4B/fn5/foB/fn5/f4CAfn5/f39+f35/f35+fn19fX2Fk5KOjIuKiImIhISEgoKCgYGBgoOCgoOCgoODg4ODgYCBgYGBgYCAf39/f4CAgICAgIB/foCBhIOCgYGDhISDhICBgICBgIGAgYKCgoGBgoCBg4ODgYGBgYCAfX19fn5+f359fX19fXx8fHt6enp6eYOPi5SUgoKAgIGAf4F/gICAgYGCgoB+gH5/fn5+foGAgYB/f39/gICAf39/gYB+f3+Afn9/fn+Af31+fn17fIaTkYyLioeHioiGhoSEgoGBgYGCg4ODg4OCg4OCgoKBgICBgYGAgH9/f39/gICAgICAgH9+fn+BgYGAgISGh4aHgoSDhYKBg4ODhYSEhISEg4ODhIKCgoKCgX5+fX19fn6AfX19fX19fX19fHp6eXl5eoeIj5aHg4GCg4GAgoCCgYGDgoODgYGCgIGAf4CBg4GEgoCAgYCBgYGAgYCCgX+BgIF/gIB/gICAfn9/fnx8iZSQiomIiIiJiIaGhoSCgoGBgoKDg4ODg4KDg4KCgYCAgICAgYGAf39/f4CAgICAgIGBf359fn5/f39+g4aHh4iChYSFg4SFhIWGhYaGhoWGhYGBg4ODgoKAfX19fX19fn59fX19fX18fX18e3l5eXl5fIKEjYeCgoSDgoKDhYeCg4SDgYKCg4OCgoKCgYKFg4iFgoGCgYKDgYGBgYSDgoOCgYKCgIGBgIF/gIGAf36Ok4yHiIeIh4aGhYaGhIKDgoGCgoODg4ODg4OCgYGBgH+AgYGBgYB/gH9/gICBgH+AgYB/fn19fX5+f36Ag4SHh4SGhoaFhoaHh4aHh4iHh4eGf32AgICCgX59fX19fX19fX19fX18fH5+fnx7eXh4eXl6foGDf4KKhIOEhISXl4ODhIF9foGBgoGBgYKBg4aIjIWDgoKBhIKDg4KDhYSEhYODg4OCg4OCgoKCg4OCgpGQi4iIh4mHhoaEhoWEhISDgYKCg4ODg4ODgoGBgYCAgICBgIGBgH9/fn+AgICAf4CAgH9/fn1+fn+Bf4CCgYWFhYeGh4eHh4eIhoeHh4eGh4V+fX18fX9+fX19fX19fX19fX19fXx7iJKCe3x6fIZ5eXp7fX98hZGDg4OEhJSTgIGBf39/fn6Ei4B/gICEhpCJhYSCgoGFhYuCgYKFhYaGhISFhYOEhIODhIOEhISIko+MiYiIiYeHh4WGhYSEhIKBgoKDg4ODg4OCgYGBgYB/gIGAgICAf39/f4CAgICAgYGBf39/f4CAgIGBgYGBg4OGh4aGh4aGiIeGhoaFhIOFhH59fHx8fX18fH19fX19fX19fX18fH+RlZaDe3qElHx5enp6e3t/goCBgYOCgH59f397iJF8fI6Wf31/f4KGioWDg4SDgoONiX9+f4OEhYWDhIaFhIWFg4SFhYaEhI6Rj4yKioyJiImHhYWFg4ODgYGCgoKDhIODgoGBgICBgICAgYGAgIB/f3+AgIB/gICAgX5+f4GBgoKCgoODgoOCgoWGhISFhYSGhIOEg4KBgIKAfn19fHx9fXx8fH18fH18fX19fHx8e4uRl4x6e3yBenl6e3x5eHx9foB/gH99e3x/fn2ClZF/hIh9fH5/goR8fIGChIN/f4eDfYKBgIKCgIODhISEhISChIOEhYGEkZGOi4yMjoqJiYWFhYODg4KBgoODgoKDg4KCgYGAgIGAgICAgICAgH+Af3+Af357gICBenyAgYKDhYODhYWFhYODg4SCgYKDgoOCgoGBgIB/gX5+fX19fHx8fHx8fHx8fHx8fHx9fHx8fn6Kgnt6e3p4ent7fH17fn5+f35+fn19fICBgH2Gj4F+fYJ+f36Agnx8gH+CgIGAfnx7ioJ9gH9+gYCAgYKBgoCAgIGAf4uUkIyLjo6NiIiHhYWFhIOCgoKCg4OCgoODgYGBgICAgICAgH9+fXx7fHx9f3+AgHx6gYF4e4CCgYOFhIOFhYaHhYSAhpSIgIKBgYGBgH9/f39/fn5+gHx8fHx8fHx8fHx8fHx9fHx8fHx9fHl6e3t4eHl7e3p8goCBf4CBfX9/gH99gIKCgICAgX+CkYF/f4CAfoB+fn9+gIGBfX19e319fXx9fHx9gH+AgH6Afn6ClJKNjY6Oj4qFhoaFhISFg4KDgoODg4OCgoGBgYGAgICBgICAf4CAf39/fXt6fICAgHh+gXd7gIF/goKCgoKEhoeGhn6IlYp+gIGAgIB/foB+f39/fn+Bfnx7fHx8fHx8fHx8fH19fHt9fHx8e3x8fHp6eXt8en2Fg4OAgYF+gH9/gH6FgoF+gH9+foCFhoKAfn6Dhn99fH5/gIGAf39+fX19fX57fH1/f3+AfX9+f4yRjo2Njo2Nh4SGhoWEhIODg4OCg4ODg4KBgYGBgYCAgYGAgYGBgYGAgH9/f397en9/e3mAd3p/f31/f3+Af4KEhoaFf3+FgX5/gIB/gH5+f31/gIB/gIB/f318fHx9fn18fHx9fX19fH58fXx7fXx8ent6fH19f4aFg4CAgH1+fX5/fouEgYd+fXx8f36CgX99fX19gXx7fXx+gYSDgYB+fn5+fXx+f4B9foB+f36Eko2NjI+NjIqGhIWEhISDg4OCg4KDgoOCgYGBgYGAgYGBgYB/fXx8fH1+f39/f397e399d352eH59fH18fX5+gYGCg4F6fn58fn6AgH6Af35/fn+AgH+AgH9/fn9+fn5+fn1+fn99fH59fn19fXt8fHx7e3p9foCAg4OCf35/fHx8fXx8gYN+jH58e3t9fn1+fn17e3t9fHt7e3uAhoSChIOBf4B+f4KCgn9/goJ/gIuQjY2MjYuKiISEhIODg4ODgoKCgoKCgoKBgYGAgoGBgYKCf3+AgIB/fn18fH5/fn55fX52e3Z4fXx8fHt9fX6BgICAf31/f31+f39/f4B/f39/f3+Af4GBgH99gH9/fn9+fn5/f3yCfX59fX17e319fHp8fH2BgoGAgIB9fX18fHx8fH18fnt/fnt7e3x8fH18e3t7e3x8enp9en6CfoKEhIKAgoGFhoWFhoaHhYGEkY+Ni4qLh4eFgoOEhISEg4KCgYGCgoKBgoGBgYGBgoGBgoKAgYKBgYCAgH9+e3x+fnx6fnh5dnd8fHx7e317f4GAf35/foB/f35/f35/gH9/f39/f39/gYKAfn6BgIB/f39/f39+fYN8fH19fH99fX19e3x+fn5/fn5/fnx8fXx8fXx9fnt8e3x8fHx9fH18fXx9fHt7e3x5e3x7e316fX5+f4CAg4eJiYmKiYqJhYiSj42JioeFhYOCgoOEhIOCgoKBgYKBgYKBgYGBgYKCgoGCgoCAgX98e3p6eXt9enx+fnl8eXh4dHx8fHt8fHx+gH9+f39/gIB/fn5+fX+Af39/f4CAf4CDgoB/gIGAgIB/f4CAgH58eXx+fX59fX5+jIZ9fX57e4ODfX19fH18fX19fX19fH17fXx9fX59fn19fX18e3t7fHt8fHt6e3t6enp7fn6ChoiHiIuKi4uJjJGQjoqJhoWEgoKCgoODg4OBgYGBgYGBgYGBgYKCgoOCgYKBgIGBf3+Af356eHl5en5+e3l6eH5zfHx8e3x8fH5+fn5/gH+AgIB/fn9+gIF/f4B/gIGAgoSDgYCAgYGAgX+AgYKBf39+f35+gH57foGSjHx9f4qAjYx+fn19fX59fX59fXx8fX19fXx9fX1+fX1+fnx7e3t8fH18e3p7e3l6eXl5e35/g4OEh4mKiImOkI6MiYmFhISCgYKCgoKCgoGCgoKBgYGCgYKCgoGCgoKBgoKAgYGAfoCAf39+e3p5e319eHx6f3KBfXt7fXx8fn59fYGBf4GBgX9/gH+AgX+AgIGCgYGFg4SCgYGCgYKCgICBg4KAf4F/fX6Afnx/f4mCf36DkYSEg4F/fn18jYd9fX59fX1+fnx9fXx9fX5+fX5/fH18e3x9fnx8e3x9enp5eXl5ent+foCBg4eEiI+Oi4uHhYSEg4KBgoKCgoGBgYGCgoKBgoKCgoKCgoKCgoGCgn+AgIB+f39/fn5/ent5fX16enp9cX6Cent9fX19fXp4f4KAgYKCgICBgYGBgICBgoKCgoaFhIKBgYKBgoGAgIKEgX9+gYB9foF+fX5/gIB9foCEgH5+f31+fX2KhX1+f31+foB+fX18fH5+fn99f4B9fX18fX9/fHx7fH17e3t6enp6e3x9fn1/goCJjouMiIWFhYSDgoKCgoKCgYGBgoKBgoKCgoKCgoGAgYKBgYKCf4CAgH9/f39+fn59eXp6fXx5d3t0e4d8dHd9fn17e3Z2fYCBg4KBgYKCgoKBgYGDg4OChYaEg4CAgIGDgX+AgYSBfn6Af31+gH59fn6AgH+Bfn+Af39/gH99f39/f3+Afn9/gH58fX18fn5+foF/gH2CgHx9gIB9e31+fXx8e3x8e3t7fHt8fH19fIqKiYmGhoWFhISDgYKBg4KAgIGCg4KCgoOCgoKCgoGCgoGBg4J/gIGAf39/fn5+fn57enp8fHt2e3R3f352cnt+fnt4dnd8gIGCgoKBgoODg4OCgoSDhIOFhoOCgX9/gIKAf4CAg4F+foB/fX+AfX1+foCAf4J/gYCAgICBgH1/f3+AgICAgIB/fnx9fX19fn59g32AfoKAfX6AgX98fn59fX17fH58fXx8fHt8e3x+ioeHhYaIhYSFhIKCgoGDgYCAgoKDgoKCg4ODg4KBgYGBgYGCgH6AgYB/fn5+fn5+fn56e3p9goN9dXF6fHpxen59eXh0dICAgoKCg4KDhYOEg4KDhISEg4WEgYGAgH6Agn9+f36Bf35+f4B9foB9fX1+gH9/gYCBgICAgIGBfn6Af4GAf4CAgH9+fX19fn1+fn19gYR/gH9+f4GBf31/f319fn1+fn1+fHt8enx7eoCIg4SEhYSEhIWDgYKBgYKBgICCgoOBgoOEg4SDg4KBgYKBgYOAfoCBf35+fn5+fX5+fnt7en6Jh354cnl9f3F6eHt4eXV1fYKDgYODg4OFhIWDg4OEg4OEhYOBf3+Af4CBfn19fn9+fn5+gH19f3x9fX6Bf4CAgIKAgIGAg4KAf4B+gIF/gIGAgH9+fn1+fn5/fX6FhYGBgX+Ag4F/foGAf35/f4B/fn17ent6fHt6goWAg4KCgoKCg4GBgYCAgoGAgIKCg4KBg4SDhIKEgoGBgoGCgoB+gIF/fn1+fn5+fX59fXp7fIWEe3tzeXt8cHd1dnd5dXR6hISBhISDhIWFhoSDg4WEgoODgoCBf39/f4B9fX1+f31+f39/fn1+fH19foF/gIB/gIB/gICDgoGAf36AgH+AgYCBgH9/f39/f4B/gIGCgoKBf4CDgn9/g4J/f4B/gX+Af3x6fHp8e3yCgH+Cf3+BgIKCgYF/f3+BgH6BgoKDgYGDg4KEgoSCgYGBf4GCgH6AgH9/fX5+fX19fn19e3t6gH94fHZ5enxxdHh3dnh1cnmFhYKEhIKEhYWGhISChIOBg4GAgIF/f4B/gHx9fX6AfX5/f39+fX98fn5+gH+BgH9+f4B/gYOCg4B/f4GBgIKBgYGAgIGAgIB/gIGAgIKDgYF/gISAfYGDhICAgX+BgYKBfXp7e3x8fYB9f4B8f399fYGAgH59fX9/foKBgYKBgIKCgoKBg4KCgYB/gYKAfn9/fn99fX1+fX19fX19ent7fHZ9eXh6enJ1eXl2d3dzdYaFg4WFgoSEhYSEhIGDgoGDgX+AgX5+gH6AfX19foB+f4B+fn99f3x/f3+BgIF/f3x+gH6AgYKDgYCAgYOEgoGAgYB/gYCAgYGAgYGBg4OBgX+Ag4B+goOEgICCgYKChIJ+e3t8fHx9fn1+fXp+fX14fn9/fHx8fn5+gYCBgYCAgoGBgYGDgoGBf4CAgoB9fn19f319fX59fH19fX16e3p8dnx6d3t4cnZ5e3Z2dnN0hoSEhYWChISFhIODgoOBgYOBgIGBfX+BfoF9fX1/f39/gH5+f319fYB/gIGBgX9+fH5/fn5/gYJ/gYGCg4aFgX9/fn6Af4CBgICAgIKCgYCAfoCCf3+BgoOBgYOCg4OFg399fX18e3x8eXp7en55e3l4f357fHt+fX1/f4F/gH6BgICBgoOCgYF/gIGBf31+fH1+fX19fX18fn58fXx5e3x4enx3endzeHd6c3Z2c3SFhISGg4KEhISDgoKCg4GCgoGAgYF9gIB+gH1+fX5/gIB/f39/f3x+gH+BgIGAf359f39+fn+BgH2AgIGDg4N/f359fn5/f4CAgH9/gYKBgH99f4F+f4CCgoCBg4KEhIaEgH5+fHx8fHp5dnl5enl2eXZ+fHt7e359e399gH59fX9/f3+BgoGBgX5/gYF+fX18fX19fX19fXx+jYF8fXl7e3p5fHd4eHR1dXhyd3d0doaEhIWEg4ODg4OCgYKDgoGDgn+Bf35/fn+AfX19fX6AgIB/f39/fH9/f4GAgYCAf3yAf35+foB+fX5+gYGCgn5/fn1+fn5+f3+Af32AgIB+fn1/gX5+gIKCf4KDgoOEh4SAgH58fXx8e3x1eXl4eHh5d3t8e3t7f4V9fn1/ent+fn59foGAgIGAfX6BgH59fXx9fX19fX18e32Dgnx8ent7e3p7d3Z4dXJzdnB4eXJ4hYWFhYOEhIOChIKBgYKBgIKBgIF/fn5+foB+fX58foCAgH+AgIB8gH6AgH+BgYB/fYB+fn5/f359fX6AgYGAfn9+fn59fX5/fn9+fH6Af35+fn+Cfn6AgIF+gYOCg4OGhICBfnx9fHx7fHh3e3h1eXd3eXx6e3t9kod9fH13en1+fn19f35+gH98foB/fn19fH19fX19fHt8ent9enp4e3x6ent4dHh1cXJ0cHh4cXmEhYWFg4SDgoODgoGBgoKAgoCAgIB9fn5/gH18fnx/gIGAgICAgHx/f4B/f4GAf399gX9+f39+fX18f4CAgIB+f35+fn18fn9/f358fYB/fn1+gIJ/foCAf36ChIKCg4WFgoJ+fXx7e3t8eXd7eXd4d3d4e3t6e3yFiX17end6fH19fHx9fX1/fnx9fn59fX18fX5+fX18fHt6enx7e3p5enp7enhzd3VxcXNveHdxe4WGhYWDhYKBg4OBgYGBgoCCgICAgH5/fn9/fXx+foCBgoGAgIGBfX6Af35/gX+Af3+BgH9/f319fH1/gICAgH9/f35/fXx+f39/f319f39+fn6CgYF/gIB/foGDgoKEg4SCgn5+fHx6fHt7eXt6d3N2d3h5e3p7eXp/fnt7d3p8fXx8fH59fH19fH19fXx8fX19fX99fXx9e3l8fHx7enp6enp6eHN2dXBwcm93dnJ7hYaEhYOEgoGDgoKCgYGCgYKBgYGAf4B/f39+fX9+gICBgYJ/goF9foF/f4CBf4B/gIJ/gIB+fH58f3+BgICAf4B/f4B+fX5+f4B/f39/gH9/f4J/gICAgIB/gYGAgISBgoKAf39+f3x9fn56fYR+dHx9enp6enx5eXp6hoV3eXx8fHx8fXx8fHx8fX19fHx9fX19fn19fX16eX18fH16enp6enp5c3V1b29xb3d0c3yFhoOEgoOCgYKBgoKCgYKBgoGCgYCAgICAgH59gH+Af4GCgn+CgX+AgX5/gYB/f4CAgn+Bf319f35/f4KAgICAgIB/gIB+fn1/gH9/gIB/f39/gH+AgICAgH+AgYCBgYGCgYCAf39/fn1/fnuBko16fH18e315e3p6eHqBgXh5e3x8fXx8fHx8fHx9fX18fH18fn1+fn59fHp8fHt8fXt5enp6eXl0dXVvb3Fwd3N0fYWGg4OCg4KAgYCCg4KAgYGCgYKBgYCBgIGAfn6Af4GAgYKCgIKCgICCfoCBgX9/gX+BgIF/fH6Af3+AgoCAgICAf3+AgH9+fX6Afn2AgIB/f3+AgICAgYCAf4CAgYCBgYKBgICAf39/fX5+fIGGiXx8fnt7fnl6e3p7j393d3l7fHt9fHx8fHt9fH19fX18fXx+fn5/f358enx9e319e3l6e3p5eXN0dW5zcXB4cnV6hYaDg4KDgoCAgIKCgYCCgYKCgoGBgYKAgYF/fn9/gYGCgYKBg4OAgYJ/gYGBf4CAgIB/gX99f4F/gICBgICAf4B+gICAf359foB+fn+Af39/gH9/gICBf4CBgH+BgIGCgoGAgICAgIB9foB9gIOCe35+e3x9e3p8fHuHenh4eXx8fH17fHx9fX18fH19fn19fX5+f3+Af317fHx8fHx7enl7e3l5c3J1bnZycHhxdXaFhYOEg4KCgYCBgoF/gIKCgoKDgYGDgoCCgYB/gICCgoKBg4KEhICBgX6BgoF/gICAgH+Cf36AgYCCf4CAgIB/gH+AgIB/fn2Af35/f4CAgH+AgH+AgYF/gICAgIGAgYGBgYGAgYCAgH9/gH5/fX59fn57fXx9e3x8d3h1eHh5e3x8fXx8fHx8fX5/f39/fn19fn9/gIGAf3x9fHx9e3p7eXp8eHpzcnVud3FxenF2d4WFg4SDg4KBgoKDgICCgYSDg4SBgYOBgoKCgYCAgIKDgoCCgoSDf4GAfoKDgICBgICAf4CAf4GAgYKAf4CBgH9/gICAgIB/f4CAgH+AgICAgIB/f4CBgYCAgICAgYGAgoOCgoCCgYGCgYB/f4B/gId+fnx7fXx7fX54d3Z5eXp7fXx8fXt8fH19fn5/gIGAfn1+gICAgoGAfH59fX58d3t6ent5eXNxdW53cHV6cXZ5hYWCg4KDg4KChISAgIOBhoODhIGChICEg4KCgICCgoSBgYKBhIJ/gIB/gYOCgYCBgYCAf4GBgYGBg4B/gIOCf35/goGAgH9+gYCBf4CAgYCBgYCAgIKBgYKBgX+BgYGBgoOCgoOBg4OCgYCBgH9/hH19fXx/fXp9f3t6dnp4eXt7fH19e3x9fX19fn+AgYGAgH+AgICDg4B8f35+fn15eXt6enp5c3J0b3dxd3lzd3uFgoKCgoOEgoOEg4CAg4OGg4ODgoKEgYSDgYOAgIKBg4GCgoGCgX6AgICCgYKBgYKCgICAgICCgoGEgH6Bg4J/f4CDgoCBf4CCg4KAgYKBg4KDgoGBg4KChIGAgYOBgYKEg4KEhIODhIODgYGBgoCCf4B/fYB8enx/fHt3fHl5eXt6fX59fHx8fH1+foCBgYCAgIGBgYSEgH2Af39/f357e3t6e3p0cHhxeXR2eHR2e4SCg4KDg4SChIODgYKChIaEgoOCg4SBhIOBg4CBg4KCgoKCgIKAf4GAgIKBgoGCgoKBgIGBgYOCgoOAfoGDgn9/gYSEgYN/goKBg4KCgoGEg4OEgIKDgoOCgoGCgoOBg4SDhISEhISFg4SCgYOCgYOBgYGAgH58fIB9fHh8eXp5ent9f3x7fHx9fX18fICAgICAgYGBgYKBf4CAgICAf3t7e3p6enVweHd5dnV8dXZ8gICDgoODg4OEhISBgoOFhYWDg4KDhIKEhYKCgYKDg4GCgYKAgYB+gYCBgYKDgoKCgoGAgYKCg4KCg4B/gYOCgICChIODgoGCgoGDgoKDg4ODg4SAgoOCg4OBgX+Bg4KDhYKEhISEhISDhISChIOEhIKBgoCBgHt9gH58eXx6enp9fHyBfXp8fH19fHp7fn5+gIB/gYGBgICAgIKBgIB/fX18fH18dnJ3eHh2dH92dX2Hh4OChIWDg4SFhIGChIaEhIOCg4SEgYOFg4KCgoODgYOBgoCCgH2AgIGCg4KCgoKEgoCCgoODgoKBgICBg4KAgYOFhIOCg4CCgoOCg4ODg4OEg4CCg4KEg4KCf4OBgoSEgoODhISEhIOEhIOEg4WEg4ODgoKAe4CBf3x8fXp6e32AfX9/fHx6fH59fH19fn5/f39/gICAgH9+foCBgICAfnx9fn5/fn18fHh2f3Z3f4SHg4KDhYODhIaEgYKFhoWEhIODhISChIWEgoKDg4SCg4KDgoKBfoCAgoKDgoODg4SDgYKCg4OCg4KCgYGDgn+Cg4SDg4KEf4KEg4ODgoSDg4SCgIOEg4SDg4KCg4KChIOCg4OEhISEhIWEg4OEhYSFhIOBgoB9gYKAfXx8e3x8gH19foB+fn1/fnx8fH19fn5/fn+BgYGBgH9+fX6BgYB+fn1+fX59fX5+f3+AfH2AgYKCg4OGg4SDhoSBgoiGhYSDg4SEhYGFhYWDg4SDhIODgoOCg4F+gYGCg4SCg4OEhIOCg4KEg4ODgoKDgYOCf4KDg4ODgoOAgoWDg4ODhIODhIOBgoSEhYODgoODg4GEg4GDg4SEg4SEhYSEhIWFhYWEg4ODf36BhIB9fXx8fHx/gX5/f39/fX99e3x9fX19fX5+f4CBgIGBgH99fH6Cf39+fn5+fX1/f39/gICAf4CEhISDhIWDhIOFf36CiouFhYSDgoSFgYaGhoOEhISEhIODg4OEgn+BgYODhYSFhIWEg4KEhISFhIODgoSDhYKBhISFhYaEgoCDh4SDg4OFhIWFhIGEg4OHgoOCg4GCgYSDgoODhIODhIWEhYWHh4aHhYSEhYSBf4GDf35+fH5+fX+BgH9+fHx/f358enx9fX19fX5+fn9/gIGBf319fIB/gH5+fn5+f3+BgYGBgYKAgYWFhIOEhIKEg4aAgoSFi4mEhISEhYWDh4aGhISEhIWEhISEg4SEgYKDg4OEhIaEhYSDg4SEg3yDhHuBhHd5g4F9hH5+cnWDgoF2foOEgH2BdYF5g39/f36EhIKDgoOCg4SDhISFg4SFhoSFhn2Den1+f4N7hYOBhIOAf31+f35+gYOBfXt/fX6Afn18fHx9fX19fH19foB/gYJ/fX18f4GBgICAgH+BgYGBgYKDg4KChoSEhIWEgYOEhYOEhYOKiIWFhYOFhYSGhoaDhISFhYWEhYWEhIWCgoOEhYWFhoSFhIOEhYWCaICFanx7cXF8gXOGc3R0fYKDdXNxg4ZzcHVyc3SDdnt9dYF/goOBgnZ5hYCDgIR/hYSChYSCaHpyc3N8gHKChH6Dg32BfX5/fn+Cg4J8f4F9f4B9fXx8fHx9fXx8fn1+gX+BgX99fX2AgYKBgYGBgIGBgYKBgoKCgoSHhIWEhYSCgoSGhoOFhIaIhoaFg4aGhoeGh4OFhYaFg4KFhoSFhYODg4SEhoaGhIaEg4SEhn1we4FweXZ+g3+CbnlwdXN8dnl5hnKEg3B2eHF2dHR1cnN0dml/gG5yb3R2bnVsd216c26Ah3ptfXJzdnN2bW53bHB5bHV9f358foGAgX2Af32Af4B/fX18fHx9fH1+f32Af4CAfnx/foCBgYCBgICAgYCAgIKDgoKDhYeFhoCChYODhYeGg4WFhYaHh4SDhoaIiYaHhIWGiIeEg4WGhYWEhIOFhIKFhoaFhoWEhoWHdnB0e3BydX+HhYNtdW92b3x1coR5eYd4cXR3bndod3pucHaCcoN+b3p5eW1vbnpvb2x3fXiGcHF6cHJ0ZoF1fm57eXNveX+Af31+gYB/e39+fYB+gIB+foCAgYB+fn9/foF/gH9+fYB9f4CBgIB+fn+BgH9+goOCgoSFh4eEfoeEg4OFh4aEhYWFhoaIhISGh4iIhoeEhoaLioWEhoeHhYOFhIWEgoWFhYWGhYWGhYZxdXByc29zenl+hHSIdHV+iHZugnKEhnluanJ/cW1zd3x/dXR8hH54cXV3bnl1enF2eHV6eYRyaW95eHBreXN6b3p3dnZwgYB/fn5/f396fn19fn1/f359gIGDg4CCg4GChIKBf4GCgH1/f4F+f35+f4GAfn6BgoCAgoSHhoODh4SEhIWHhoWFhYWHhoiFhYaFh4eGhoSGhomIhYSJioiFhIWFhoWDhYWEhoaGhoaFg3iLeXKIentwcIWEeIV4eWtzfnl7a3KDh4N6fG16eXl0fYB2bm+AgG90fHV3cXl9fW1+dW+DhYZ6gHJye3x1cG96a3N8bnaCgYF+fn99fXt9e3x9fX9/fn1/f4KCf4GDgYGEgYB/gICAfn9+f31/fn1/gH58fYGAfn6Ag4iFhoOFhYWFhoeFhYWFhYeHiIaEhoWHhoaFhIWFhIWFhomJh4WFhoWGhoWGhoSGhoaGhoWGh4eHhoaDhoWGh4iHhYeGhoOHhoWFg4SFhoWGhIaEg4SEhoSEgYODhIOFhIWEhYSGg4WGhYWEhIWHhoSEhYaFhX13hYOEhIOCgX5/fnt8e357fH1+f399fH9+gIB9f4F/f4GAfn5+gH5+f35+fX99fX5/fHt8f358fH+BiYaFhIaGhoWGhoWFhYWGhoeIhoSGhYeFhYWDhIWGhYSGhoeGhYSGhIWGhoaGhIeGh4eGhYeIiIiIhoWHhYaGiIaFiIeHhYeGhoiFhYaHhYaGhYOChYWGhYWDhYOEhIaEhoaEhYWDhoaFhoWEhoeGhISFhoOFhIKEg4OFg4OBfYB/e3t8fnt8fH1+fnx8fn2Afn1/gH5+gH99fXyAfX5/fn5+f3x8fX57fHx/fHt7fn+Ih4SEiIaGhYeGhYWEhoaGhoiHhIWGh4aFhIODhIaFhIaFhoaFhYaEhYaGh4eFh4aJiIaGiIeIiYiFhYiFhoeGh4aHhoeFh4eGh4WFhoeFhoaFgoOFhoaEhIOEhIOEhoSGhoSFhYOGhoWGhYSGh4WEhIWFg4SHhoSCg4SDhIJ+gYB8e31+e3x7fn59fHx+fX5+fX9+fX1+fnx9fH98fn58fYF/fHx8fXx8fH56e3t8foiHgoWIh4eGhoaGhYSGhoeGiIaEhISHhoSFh4OEhYSFh4SFhoaFhoSGhoeHhoaHh4mIhoaIh4iKiIWGiIWGh4WHhoeGh4WIh4eHhYaGh4WGhoWChISFhoWFhISEg4SFhIaGhoWGhIaFhoaFhYaGhYSDhISDhIeDhIGChIWDgYCAgXt7fn18fHx+fXx8fH1+fH18fn18fH18fHx8fXx+fXt8gH99fH18fnx8fHp6fHx9iIeChoiHhoeGhoaEhYaFhoaGhYOFhIaFhIiJg4GEg4SGhIaGhoaGhIeHiIiHh4eIioiGh4iHiImIhYiHhIaGhYeHh4WHhoiIh4eGh4aHhYaHhIKEg4SGhYeFhISEhISFhoaGhoaFh4WFh4WGhYaFhIOEg4OEh4GDgIKDhIKCgn+Ae31/fXx8fH59fHx9fH17fHx7fHx9fXt7e318e359e3x/fX18fX1+fXx6ent7fHyIh4KGh4aGh4aGhYSFhoWFhYWEg4WChoSDiId/enqChYaEhoaFh4aEh4eIiIiHhoiKh4aHh4eIiYeFiIeFh4eGhoeHhYeGiIiHhoWHhoiGhoiEg4SEg4aGh4WFhISEhYaGhoaGhYaHhoaIhoaEhoWDg4ODgoOGgYN+goKDgIOCf398f39+fHx9f318fX18fnt7e3p7fHx8e3t7fnt7fXt6e358fHx8fX5/fXt6fHp8fImHg4aFhoWGhoaFhIWFhYWFhIOBhIGGhIKEhHyAhn+ChYWGhYWGhYSHh4iIiIaFiYqHhYeGh4eIh4WIhYaHiIaGh4eGh4aIiIeFhoeGh4WFiIOEhoWDhoaHhoWEg4WFhoaGhoaFhoaHhoeHhYOFhYOBgoKBg4WCg36BgoF/hIJ/fn5/fn98fH1/fXt9fXx+enp7eXt8fXt7e3t+fHx8fHp7fXx8fHx+fYF8e3t7e3x8iYeEhoSGhIaGhYSFhoWEhIOEgoCDgYaDgYJ/eoSMe4CEhYeGhoaEhIeIh4aHhYWHiYeEh4WGhoiGhYeEhoeIhoaIh4eHhoeIhoSGhoaHhYWIg4SFhIaGhoiFhYSDhYWGhoeGh4WGhoaFhoaEg4SFgoGCgYCEg4OCfYGBgH+DgX5/f4B8f3x9fX59e359fH15enp5e319enp7e318fXx8enp9fHx9fH5+gHt7e3x+fXyIh4WGhYaEhoSFhYWFhYODgYOBgIGBhYJ/gH9/fXx7gYSFhoaEhYSEh4eGhoaFhIaJhoKGhIaGhoWFh4aGiImGhYiHiYeGhoeFhIaFhYeFhIeDhIWEiIaGiIWFhIKFhYaFhoaHhIWGhoWFhoKDg4WAgIGAgISAg4B8gYB+foOAfX9/gX2AfH1+fX57fn18fHl6enl6fX15ent7fHt8e3t6e319fH18f35+fHt7fX59fIiGhYaGhoWFhYSFhYSDgoGAgoGAgICDgX5+foB5en2Ag4SFh4WEg4OHhoOEhYSChYiFgoSDg4WFhYWHh4aIiIaFiIeJh4aFhYWDhoSFh4ODhoSEhYSHhoaGhYaEgoWFhoaGhoaEhYaGhIWFgoKDhH9+gICAgYCDgHyBf31+gn5+gH6Af399fX59f3t/fXt6eXp6eXp8fXl6e3t7enx7e3t7fH19fXx/fn18fHx/fnx7h4WFhoaGhoSFhIWDhYKBgICAgYB+f4KCfX1/f3t/f4KDg4WGhYSDg4aDgYOEgoCFh4WCg4GBg4SEhYaGh4eHhYWIhomHhYSEhIKFg4SGgoOFhISGhIeGhYaFhYODhYSFhoWGhISEhIWDhYSAgIKDf35/f39/gIN/fIB9fX+CfYCBfn6Bfn5+fX1/e398e3p5eXp5ent8eXp6ent7fHp7e3t8fX19fYB9fXx8fYB/fXyGg4aGhYaGg4SChYKFgYGAf3+AgH5/gYF8fn9/fn+AgoKChISDgoGChIGAg4KBgISFhIKBf4CCg4KEhYWHhoaEhYeFh4WGgoOCgoOCgoWBg4SEhYaEhoaGhoaFg4SEg4SFhYWDhIODhIKEhIB/goJ/fX5+fn5/hH57f3x8gIF9gYB9foN9fn59fX57fnt7enl6enl6ent5enp6e3t8ent8e3x+fn1/gXx9fHx9f4B+gIaEhYWEh4SEg4KGgoOAgYB+fn+AfX9/gnx9f35+f3+BgYKEg4KBgYKCf4CBgoCAgoWEgoB/gIGCgYKGhYeFhISGhoOFg4WBgoGBgoGCg4GChISEhYWGh4eGhYWEg4ODhIWFhIGDgYOChIODgH+AgX59fX5+fH6Dfnx+fHyBgX6Cf35/gnx/fn19fHx8e3t6enp6eXt5e3p5enp6e3x5e317e35/f4GAfX99fX1/gICAhoSEhYSFgoSCgoSCgYCBgH59fn9+fn6AfX2Afn5+foGBgoODgoSHgYF+gICBf3+ChIOBf35/gIJ/goWDhYOCg4WFgoSBg4CBgIGAgYKBgIGEg4OGhYWHh4WEhIWCgoKDhYSCgYGBgYCFg4F/foB/fnx8fn18foN9e358fYB/gIN9fYCAf35/fXx8fX17e3p5enl5e3l6enl6ent7e3p7fX18f3+BgoB+gH+AgH+AgIDKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzNzc3Nzc3Nzc3NzczMzMvLy8vLy8vLy8vLy8vLzMvLy8vLy8vLy8vLy8vMzMzMzM3Nzc7Oz8/Pz9DQ0NHR0dLS0tLS0tLT09PT0tLS0tLS0tPT09TU1NTU09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tLS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1dXV1NTU1NTT09PT09PT09PT09TU09PU1NTU1NTU1NTU09PT09PS0tLS0tPT09TU1NTU1NPT09LS0tLS0tLR0dHR0dPHhnNlYFtLWWdVTUZIQD03Nzg5Nzw8PDo8Oz42Oj04PDs6OTg3ODs7Oj87PTs8PD47P0E/QkJBQ0RFREE+PTw7QENDQUBDQ0FBR0hHSUtSwtXS09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXVysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMy8vLy8vLy8vLy8vLzMzMy8vLy8vLy8vLy8vLzMzMzc3Nzc3Oz8/P0NDQ0NHR0tLS0tLS09PT09PT09PT09PS09PT09TU1NTU1NTU09PT09PT09PT09PT09PT1NTU1NTU1NTT09PT09LS0tLS0tLT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1NTU1NPT09PT09PT09PU1NPT09TU1NTU1NTU1NPT09PS0tLS0tPT09PU1NTU1NTU09PT09PS0tLS0tLR0dHSzIxyZ2BcTVllUktHSz87Mzc4Ozg5Pj05PDpBOjs9Nzs8PDo6Nzg6Oz0/Oz88PTw/Pj9BPUFBPkNDREJAQT46Oz9DREFDRERCQklHSEhJTr7V0tPT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1crKy8vKysrKysrKy8vLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzMzMzMzMy8vLy8vMzMzMzMzMzMzLy8zMzMzMzMvLzMzMzc3Nzc3Ozs/P0NDQ0NDR0dLS0tLS09PT09PT09PU09PT09PT09TU1NXV1dTU1NTT09PU1NPT09PT09PT1NTU1NTU1NTU1NPT09PS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1tbV1dXV1dTU1NTT09PT09PT09PU1NTU09TU1NTU1NTU1NTT09PT0tLS0tLT09PU1NTU1NTU1NTU09PT09PT0tLS0tHR0s+Sd2hfXk9XZ01LRks9ODc2NTk5OTw+OT88Qzk7PDc5PD07OTc5Ojw9QDs+PT47PD48PT5BQD5EQ0NDP0E9Ojs+QkNFQ0NEQT9FSEpJSky61dPT09TU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8rKysvLy8vLy8vLy8zLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMzMzMzMzMzMzMzMzMzczMzMzMzMzMzMzMzMzMzc3Nzc3Ozs/Pz9DQ0NDQ0dHS0tPT09PT09PT09TU1NTT1NTU1NTU1NTV1dXU1NTU1NPU1NTU09PT09TU1NTU1dTU1NTV1dTU09PT09LS0tLS0tLS09PT09TU1dXV1dbW1dXV1dXV1tbW1tXV1dXV1NTU1NTT09PT09PT1NTU1NTU1NTU1NTU1NTU09PT09LS0tLT09PU1NTU1dXV1dTU1NTT09PT09PT0tLS0dHRmn5nYWJOVWpKSElLPzw6OTM3Njc2PTs+Oj06Ojo4ODo7Ozg4Ojs7PD46PT09Ojw/PD0/QkA/Q0RDRD5APT08QENEQ0JEQkQ+REhJSUtMttfT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3MzMzMzMzMzMzMzMzNzc3NzczMzMzMzMzMzMzMzc3Nzc3Ozs7Pz8/Q0NDQ0NHS0tLT09PT09PT1NTU1NTU1NTU1NTU1NTV1dXV1NTU1NPT1NTU1NTU1NTU1NTU1dXV1NXV1dXV1NTU09PT09PS0tLT09PT09PU1NXV1dbW1tXV1dbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1NTU1NTU1NXU1NTU1NTT09PT09PT09PU1NTU1dXV1dXV1dTU1NTU09PT09PS0tLR0p+DaWBkU1hsSEhIS0A9Nzg0NzY6Oj87RDw8Ojw8OTg6OTo6Ojs8Ojo7OT48Pjk9QDs/QUFCP0JCQUM9Pz8+PEBCRUNDQkBBO0ZJR01MSbLY09TU1NTU1NXV1dXV1dXV1dXW1tbW1tbV1dXW1svLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzM3Nzc3Nzc3Nzc3Ozc3NzczMzMzMzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc3Mzc3Nzs7Ozs7Pz8/P0NDQ0NHS0tLS09PT09PT09TU1NTU1NTU1NTU1NTV1NXV1dTU1NTU1NTU1NTU1NTV1NTU1dXV1dXV1dXV1dTU1NTU1NPT09PT09PT09PU1NXV1dbW1tbW1tbW1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTV1NTU1NXV1dXU1NTU1NTT09PT09PT1NTU1dXV1dXV1dXU1NTU1NTT09PT09LS0tSjiGxfZlJWakdIR0lBPTM2Njo7PDhDPEJBPjxBPDg5Ojw6Ojw8PDk8PTo7PD09PD89QD9AQT9AQUBCPD4+PzxCQ0NDRkBBQT1ISklOTUeu2NPU1NTV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbLy8vLy8rKysvLy8vLy8vLy8vMzMzNzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzs7Ozs7Oz8/P0NDQ0NHR0dLS0tPT09PT09TU1NTU1NTU1NTU1NTU1NTV1dXV1dTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dXU1NTU1NTT0tPT09PT1NTU1NTV1dbW1tbW1tbW1tbW1tbX19bW1tXV1dXV1dXV1dXV1dTU1NTU1dXV1dXV1dXU1NTU1NTU09PT09PT1NTU1NXV1dXV1dXV1dXV1NTU1NPT09PT0tLWroprY2VSWGhMSkdJQjg0OTQ6Ozo5QDk+Q0U/PDs5OTk9Oj07PDw6PTw7OTw9Ozs/PUA9PT5AQD9CQT5APD05QERDQkFBQj48SEpLTU5HqNnU1NXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbWy8vQ0dDQ0NDQ0dHR0dHR0c3Ky8vLzMzMzMzMzMzMzM3Nzc3Nzc7Ozs3Nzc3Nzc/Pz8/Pz8/Pz8/Pz9DQ0dHR0dHR0dHR0dHS0tHV2djY2NnZ2dra2tvb29vZ2dnZ2dna2tra2tra2tjW19fX19fX19jX2NfX19rb2tra2tra2tvc29vc2dfX19fX19fX1tbW1tbW09LS09PT09PT1NXU1NbV1dXV1dXV1dXV1dXW1tbX1tbW1tbV1dXV1dXV1dXV1dTU1dXV1dXV1dXU1NTU1NTU1NTU09PU1NTU1NXV1dXW1dXV1dXV1dTU1NTT09PT09PS1bqKa2hoUlhlSUlMTkA5OTo0O0A8Nz05QUM9QD89ODo6Ozk9Oz4/Ojs8PDo7PDo7Pj1APT8/P0FAQUE/QTw8Oz5BRENBREA9PElJSk1NRqPa09TV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbW1svMlYWGhoaGhoeHh4eHh4Ky4t3d3t7e3t7e3t7e3t3S0NDQ0NDQ0NDQ0NDQ0ci5ubm5ubm5ubm5ubq6t6WkpKSkpKSkpKSkpKSnhmBjY2NjY2NjY2NkZGRlhIuKioqKioqKioqKioemuri4uLi4uLi4uLi4ubSNi4uLi4uLi4uLioqKiKG/vb29vb29vby8vLy7v9LS0tPT09PS0tPU09PT2+Lh4uLi4uLi4uLj4+Pi2NfX1tbW1tbW1tbV1dXV1dXV1dXV1dbW1dXV1dXV1dTU1NTU1NTU1NTV1dXV1dXW1dXV1dXV1dXV1NTU1NTT09PT09XDkXJsaU5TYkxMVk08Ojo3Nz5DPzg+Oj8/QTw/QDc7Ojs7PTs+Pjo7PD48Oz07PT8+QDw/Pz1AQEBBPj88PjxAQUVCQkZAQD9HSEpLUEae2tXV1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19fLzG5QU1NTU1NUVFRUVFRMoPPr6+rq6urq6urq6uvp1dLS0tLS0tLS0tLS0tTEqaqqqqqqqqqqqqqqq6aGhIWFhYWFhYWFhYWFik4MEhISEhISEhISEhIRE0pUU1NTU1NTU1NTU1NPg6ejo6Ojo6Ojo6Ojo6ScWFJTU1NTU1NTU1NTU056rqqqqqqqqqqpqampqLDS0tLT09PT0tLS0tLS0t/r6uvr6+vr6+vr6+vr6dnX19fX1tbW1tbW1tbW1dXV1dXV1dbW1tbV1dXV1dXV1dXV1dTU1NTV1dXV1dXW1tXV1dXV1dXV1dXU1NTU1NTU1NPUy5h3bGlKTl9NUlVNPjw8Nzs/Qz42Ojc+Pzs9QkA5PDk9Ozw6PD07PTs9Ozs9PD0+PT07QT08QUBBQT08Pzw7QEJDQURFPUFAQ0ZLS09GmNzV1dXV1dbW1tbW1tbW1tbW1tfX19fX19fX19fXy8xxVVhXV1dYWFhYWFhYUaHx6enp6enp6enq6unq6dXS0tLS0tLS0tLS0tLUxaqrq6urq6urq6urq6yoiIeHh4eHh4eHh4eHh41SEhgYGBgYGBgYGBgYFxpOWVdXV1dXV1dXV1dXU4WopKSkpKSkpKSkpKSmnlxWV1dXV1dXV1dXV1dTfbCrq6urq6urq6qqqqmy0tLS0tLS0tLS0tLS0tHf6urq6urq6urq6urq6unZ19jX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dXV1dXV1dXU1NTU1NTU1NGcenFpSlRdT1JVTkQ+Pzs/QEA4Ojs4PDw8Oz46Ojs4Ozk5Ozw7Ojw5Ozs8Ozo9PT0+PUE/Pj8/Pj08PT88PEFBQ0FERTw+QEVGSktNRpPc1dXV1tbW1tbW1tbW1tbW1tfX19fX19fX19fX18zNeF5hYGBgYGFhYWFhYVqk7ufn5+fn5+fn5+fn5+bV0dLS0tLS0tLS0tLS08Wtrq6urq6urq6urq6vq46NjY2NjY2NjY2NjY2SXSInJycnJycoKCgoKCcpWmNiYWJhYmJiYmJiYl6MrKmpqampqampqampqqJmYWJiYmJiYmJiYmJiXoWzr6+vr6+vr6+vr6+uttLS0tLS0tLS0tLS0tLR3+np6enp6enp6enp6enn2djY2NjY19fX19fX19fX19fX19bW1tfX19fW1tbW1tbV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbV1dXV1dXU1NTU1NTWo3txZElbYE5OVU9AQT89REI+Oz06OTo6PTw7PDs6OTg5OTs8Ozw8Ojo7PDo7QD08PTxAQTxBQTs7PEA/PD1CP0RDQ0U8PkJERkpMTEWN3NXV1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjMzMfFxcXFxcXFxcXFxcXFytDPz8/Pz8/Pz9DQ0NDQz87Ozs7Ozs7Ozs/Ozs7NzMzMzMzMzMzMzMzMzMvJycrKysrKysrKysrKysfCw8PExMTExcXFxsbGxsvMy8zLzMzNzMzMzMzLz9HR0tLS0tLS0tLS0tLRzczMzMzMzMzMzMvLy8vO0tLS0tLS0tLS0tLT09LV09TW1tbW1tbW1tbW1dfY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NfX19fX19fX1tfX19fX19bW1tbW1tbW1tXV1dXV1dXV1dbV1dbW1tbW1tbW1tXV1dXV1dTU1NTU169/cF5GXmJQUVdOR0ZDQ0lBPz07PDo8N0BBPD04Ojs4OTg7Pzs8PDs7PDw8PD87PD46Pj44PkI8Pj1BPjw+QkBERUNAPD5APkNJSUtEh9zV1tbW1tbW1tbW1tbX19fX19fX19jY2NjY2NjYzc3Pz8/Pz8/Pz8/Pz9PPz87MzczP09LSzs3P0s7Ozs7Ozs7O0tPPztHU1NPOztPTz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0NDR0dHR0dHS09PU1NTU1dXV1tbW1tfW1tbX1tfX19fX19fX19bW1tbW1tbW1tbW1tbW1tfX19fX19fX1tbW1tbW1dXW1tbW1tbW1tbW19bW1tbW1tbX19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjX19fX19jY19fX1tbW1tbW1tbW1tbW1tbW1dbW1dbW1tbW1tbW1tbW1tXV1dXV1NTV1di4gm9WSl9jUlFaS0hBQTxCPT07Oj4+PD4/PT0/ODk6OTk3OD48PD47Ozw7PDs/PT0+OTs7OT0+P0A+QD07OkI/QkNCPz0+QD5CRUdKQoDc1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2M7Ozs7Ozs7Nzc3Nzsqfys3Nzc3QuYOEi8fTwJrLz87Ozs7O0qucz9Ktg4OVz9GlotDOzs7Ozs7Ozs7Ozs7Oz8/Pz8/P0NDQ0NDQ0NDR0dHR0tLT09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbV1dXV1dbW1tbV1dXV1dXV1NTU1NXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NfX19fX1tbW1tbW1tbW1tbW1tXV1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXYwIBuVU9gY1dZW0xMQ0A9PTw9Ojw9Qj5CQkA8Ojg5ODo6Ojc7Pz4/PDw7PDo5Pzw8PTg5PD9BPj09PUFAPTtBQkBCQz47QD9BQUlHSkF629bW1tbW1tbX19fX19fX19jY2NjY2NnZ2djY2dnOzs7Ozs7Ozs7OzdKpj63Rzs7Ozpu3tqSiwJOerNPOzs7O0racpaTKm7y4mbWzoKKq0s7Ozs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0dHS0tLT09TU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dbW1tbW1tXV1dXV1dXU1dXV1dXV1dXW1tbW1tbW1tbW1tfX19fX19jX19fY2NjY2NjY2djY2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2dnY2NjZ2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV18h/b1pTYWVeXVxPSkQ9QD8+PDc6Pjk/RD5AOTg3ODk7Ozw4OT89PTw9PD47OkE7OTs5OzxDQDw7PT5AQT49QkQ/QkM9PT8+Pz5ISUg/ddrW1tbX19fX19fX19fX2NjY2NjZ2dnZ2dnZ2dnZzs7Ozs7Ozs7Ozs/Inrym0tDQzsqgl36Cw6abr6fUz8/Pz86dnJGes6aNgY3GnpiWnMfPzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dLS0tPT09TU1dXV1dXV1dXV1dXV1dbV1dXV1dXV1tbW1tbW1tbV1dXV1dXW1tbV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2djY2NjY2NnZ2dnZ2dnY2NjY2NfX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dbV1dXV1dfNiHNdWGloXl9gT0lGOkFAPj48PDk2P0I/Qjo2NDg6Ozo8Ojk+PD49PTs/PTxBPjw8Ojw8PTw6PEA9QEI+PkFCPUNDPT0+Oz9BRUtIQHDZ1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2c/Pz8/Pz87Ozs7SrKWnqdXAvNLHnY+ey9PJipmq1M/Pz9G/mKCbtZijiqvWupiinq+x0s/Pz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0dHS0tLS09PT1NTU1dXV1dXV1dbW1tbW1dbW1tbW1tbV1tbW1tbW1tbW1dXV1dXV1dXW1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnY2NjY19fX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0JB1W1tqaWFeXVNOSTxDQEE+QD46OEVAP0I6NzQ6Ojo5Ozs4Oz0/PT49QT08P0A9Pjw8PDw8Oj1AQD8/PT5CQD9AQkA8QD0+QUVLRz9r19fX19fX19fX2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnPz8/Pz8/Pz8/QzJ2Nl6zQmpfKxZ6ynpbN1q2ZqtTPz8/TtJmWqruKraubpbGZlrCzqdTQ0M/Pz8/Pz8/Pz8/Pz8/P0NDQ0dHS0tLT09PT1NTU1NXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX19fX19fY19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tKUcl5ea2tqZV1PTEc/RENDQDo9OzxCPD08OTY0Ojk4Ojo5Nzs/QDw8PUA8PEE+PD07PTw/PDo8Q0A+PTs9QD5CPkBBPkA9QD9GSUQ/ZtXX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2traz8/Pz8/Pz8/P07GigJuvyqCjv8qcpYynrdiqmarUz8/P1KuafqORjaWclqeQmYSdk6PV0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1NXV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dbW1tXW1tbW1tbV1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbSk3BgXnBoZmVaUUhHQkVDQEA3Ojo8Pjk8OTc2NTk6Njo8Ozc8QEA8Ojo9Ojw/Pj08OUA8PDo6OT9APT08PUBBQz9APz5BOz9ARkpCP2LS2NfX2NjY2NjY2NjY2dnZ2dnZ2tra29vb29vb28/Pz8/Pz8/P0M6fkGyclteqo9PSrqa1mJ/Vqpmq1M/Q0NSsm6eLlqKotKqef6CphZml1dHR0NDQ0dHQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1dXV1dbW1tbX19bW1tbW1tbW1tbX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfW1tfX19jY2NfX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX1tbW1tbW1tbW1tbW1tbX19fX19fW1tbW1tbX0pNuYFxxZGdkWlVKQENHREFBODs/PD07PDw3NTU4OTY4Ozo5PDo+Pzw9PTk8Pz49Ojo+OTw6Ojg+Pzw9PTw+QEFDQT48PDpCRERKRkJd0NnX19jY2NjY2NjY2dnZ2dna2trb29vb29vb29vPz8/Pz8/Pz9G9n8O31pfA09HQ0srSzZeb1KqZq9XRz9DTtrKypZmrz9jBnIC8raaYr9bR0dHR0dHR0dHR0NDR0dHR0dHR0tLT09PU1NTV1dXV1tbW1tfX19fX19bW1tbW1tfX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19fY2NjY2NjY2NjY2NjY2djZ2dnZ2dnZ2dnZ2dnZ2drZ2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fX19fX19fW1tfX1tbX19fX19fX19fX19bW19GSbF1cb2doYl1PRj9ISEZFQDw8Pj48PT08NzU2Ojk2Ojs6Ojs4QD86PDw5PD49Ozs6Pzk/Ojs5PT49Pjw7PTxAQ0I/Pz47Q0ZGR0hEWc3a2NjY2NjZ2dnZ2dnZ2dna2trb29vb29vb29vb0NDQz8/Pz8/Pz5V+e6WS1KKa08ySl6ObodirmavV0pem1cSimZadp5Ghnp6ZqJaYmrrV0dHR0dHR0dHR0dHR0dHR0tLS0tLS09PU1NTV1dXV1tbW19fX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tbX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2tnZ2dnZ2dnZ2djY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX1tfPjGRWXnBrXGBgTkVITUlJT0M+OkI9PUBCOzU1Nzw6Nzo7Ojo7OT09Ojo6OT0+Pz07OT47PDo8Ozk+PD47PD0+QENCPz5BPEFDR0ZGRVXJ29jY2NnZ2dnZ2dnZ2dra2tvb29vb29zc3Nzc3NDQ0NDQ0M/Pz9DR1aeZrcmjqL7KnbGdo7XZqZup2LiroMfVoquknLikq6Oew6CrpJvQ0tLS0tLS0tLS0tLR0dHS0tLT0tPT09PU1NTV1dbW1tbX19fX19fX19fX19fX19fX19fX19bW1tbW1tfX19fX19fW1tbW1tbW1tbX19fW1tbW1tbW1tbX19fX2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2djY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fX19fX19fX19fY2NfX19fX19fYzYZdV2JvZE9dVEtIRlNRS0tAPj1EPD9DRj01NTc7OTY6Ozo8PTo7Pzo6OTg6PT0/Pjs/Oz49Ojs5Pjs9PD0+QURCQD8+PzxAQUVHRURSxdvY2dnZ2dnZ2dnZ2tra2tvb29vb3Nzc3Nzc3NzQ0NDQ0NDQ0NDQ0NO5gL3Tm5bP1LWLkZ/T1LyBu9TOlKDT08iSjbTZqY+QrNfCj4271NHS0tLS0tLS0tLS0tLS0tLT09PT09PU1NXV1dbW1tfX19fX19fY2NjY19fX19fX19fX19fX19fW1tbX19fX19fW1tbW1tbW1tbW19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2tnZ2tra2tra2tra29ra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2NfX2ct+WlVpaltMX01KTEpVTEZCPDw/RkVHS0k9NjY3Ojk3OTo7Ojw9OT45OTo4Oz0+PkE+PTk8PDo9Pj47PTk5Oj9FQUA+PT8/QkBHRURFUMHc2dnZ2dnZ2dna2trb29vb29vb3Nzc3Nzc3dzc0NDQ0NDQ0NDQ0NDQ0cHR0crI0tDUxLjS0tHSwtLQ08fM0tHUyMHV0tXAv9bS1cXE1dHS0tLS09PT09PT09LS0tPT09PU1NTU1NXV1dbW1tfX19fX19fX2NjY2NjX19fX2NfX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29va2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2djY2NjX19fX19fY2NjY2NjY2NjY2NjY19rHd1xSZ2laTlpOTFBRV0VKPz8+PkFETExBPjc3NTo4ODk5Ojs8Pjw+ODo6OTs+P0A9Pj46NTo6Oz0/Ojs5Ojw+QkJAPz8/P0FCR0RDRE683dnZ2dnZ2dna2tvb29vb29vb3Nzc3Nzc3d3d3dDR0dDQ0NDQ0NDQ0NDS0NDR0dDQ0dPU0dHR0dPR0dHS0tHR0dPU0tLS1NXT09PU1NLS0tPT09PT09PT09PT09PT09PU1NTU1dXV1dbW1tfX19fX2NjY2NjY2NjY2NfX19jY19fX19fX19fX19fX19fX19fX1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tvb2tra2tra2trZ2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2trZ2tra29ra2trZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjbwXNYVWlrU0xSTlBSWVRGSTw+Qz9BQkVKPT03ODY5Nzc4OTk7Oz0/QDw8ODk7Ozs/Pjw8OTU6PT47OTk7PD8/P0JCQT1BPUBBQkZCQkJLtd7Z2dra2tra2tvb29vb29vc3Nzc3Nzd3d3d3d3R0dHR0dHR0dHR0dDQ0NDQ0NDQ0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tPT09PT09PT09PT09PT09TU1NPT1NTU1NTU1NXV1dXV1dXW1tbX19fX2NjY2NjY2NjY2NjY19fY2NjX19fX19fX19fX19fX19fX19fX19fW1tbX19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2NjY2NjY3LxvVFRsbExLUkpUUlVLRkQ6PkdEREFERjw/ODk6OTU5OTo3PD07PkA9PTc5Ojs5Pjs5OTY2Oj1AQT47PDk6Pj9DQT4/Qj0+QkNFQkFCSrDe2dra2tvb29vb29vb29vc3Nzc3Nzd3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0tLS0tLS0tLS0tLS0tLS0tPT09PT09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1tbW1tbW19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19fW1tbW1tfW19fX19jY2NjY2NjZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2dnZ2dnY2Ny2a1NbcGtLVVdSXFFXSEQ+PEJKRT1ISj89PDc4ODo1OTg5Njs+PD1APDw1OTk8Oj87OTk0ODw9PUFBPD47Ojw+QD89PkE9PUNGR0I/Qkmq39ra29vb29vb29vb3Nzc3Nzc3N3d3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHS0M/U0M7P0tLT0tLS0tLS0tLS0tPT09TU1NTU1NPU1NTU1NTU1NTU1NTU1NTV1dXV1dXV1dbW1tbW19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19jY2NfX19fX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dndsGRTYXJfT1pUV19RUkdCPUVJS0FBTEQ/Pzs5ODg5Mzg2ODY5Pj0+Pz06Njo7Pjs9PTo5Njg6PTtAQDxAPz0/P0I+PD48PEJFSElCPkNJpODa29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3t7S0tLS0tLS0tLS0dHR0dHR0dPT0bm7zLqbnLrQyNPT0tLS09PT09PT09PU1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2NjZ2dra2tra2tra2tra2tra2tra2tra2tra29va2tra29va2tvb2tra2tra2tra2tra2trb29vb29va2tra2tra2tra2tra2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ3qpfVWBuW1VZUVpeT0xHQ0ZNSUZEQ0k7QUE7PDg4NjU4Njk4Nzw/QT89Ojc8Pz48Pz87OjY4OD09QEE9QD5BQD1AOjs6Pj1BRUdKQkBDR57h29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e0tLS0tLS0tLS0tLS0tLS0tO+wMqaoKKViJGeqpOpz9TT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fY2NjY2NnZ2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dna2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2tvb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2d6iXFVeblheXU5aUFROQ0NMSUlJRklEPEJBPDs4NzY3OTc3OTk9P0E/PDo5QD88PkI/Ojg3NzY9P0BAPUBBPz88PTs7OD48P0VJSEE/Q0aX4dvb29zc3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3tPT09PT0tLS0tLS0tLS0tTIlZyum5m1iX2TjIKBhMTV09PT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tvb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dndmlpYYW5ZYVdPV01QRUJETElNS0ZJRT5CRDg4ODY3OTc1Njk4PT1BPjo4OT4+PD9APzw1Njc2PD4/PjtAQEA/Pj4/Pjs/PkFCRkdCQENIkeLb29zc3Nzc3d3d3d3d3d3d3d7e3t7e3t7f39/U09PT09PT09PT09LS0tLTz6h+kayPko6MhoCIiYSQo8rU09PT09PU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY19jY2NjY2NjY2NjY2NjX19fX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2tra29vb29ra2tra2tra2tna3JJaWWNuWlpSVV5QTDxAR05IUklIRT48SEY4OTc1Nzg3NTg5ODs+Pj07ODlBPj1AP0E+NzU5Njs+QUI/P0BAQUI/Pj8+QUBEQUZIQj9FSozi3Nzc3Nzc3d3d3d3d3d3e3t7e3t7f39/f39/f1NTU09PT09PT09PT09PWtaWaiIuQhYCFi4iBg4qLf4bC1tTU1NTU1NTV1dXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2dnZ2dna2dra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29ra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb2tra29uIWltnalxYTFpfVkg6TEhMSkpDREVDQUxINzo3Njc4ODU4Nzg5PDw7Ozk4QD89Pj8/PDY3PDQ3P0JCQUBAPz8/QT09P0A+QEBGRT09REuI4tzc3Nzd3d3d3d7e3t7e3t7e3t/f39/f39/f39TU1NTU1NPT09PT09PUxZKCg4WGfYGCfXx5foGCg36k29bU1NTU1NTV1dXV1dXV1tbV1tbW1tbW1tfX19fX19fX19fX19fX19jY2NjY2NjZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vc3Nzc3Nvb29vb29vb29vb29vb2tra2tra29vb29zb29zb29vb29vb29vb29vb29vb29va2tvb29vb29vb29vb29vb29vb2tvZgFpebWhaU0ldW1hKRE1ISlNMR0ZBQD9KQjg7NjY5OTc1ODY4Ozo7Ojw5OD09O0A9Ozo2NTw3Oz1CQEFBPD49QEE9PEA/Pz5CREU+PERLg+Lc3d3d3d3d3t7e3t7e3t7f39/f39/f39/f39/V1dTU1NTU1NPT09PT2LKEkKh9g3l2hIh/e3d5gn5+i67A1dTU1NXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dna2trZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2trb2tra2tvb29vb29vb29vc3Nzc3Nzc29vb29vb29vb29vb29va2trb29vb29zc3Nzc3Nvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc1nlcWmxmWFJPYFFSQUhHSkZYTEZAQENDSz87Ozc4ODc2NTc2ODo5PDw6PTs/PTs9Pjw7ODg8OT0/QkFCQzw8P0FCPj1BQkNCREVDQDtDTH3h3d3d3d3e3t7e3t7e39/f39/f39/f39/g4ODg1dXV1NXU1NTU1NPU0ruen3WKeXuIgICChYGDcnOAhYOMrNfV1NXV1dXW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NnZ2dna2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra29vb29ra2trb3Nzc3Nzc29zc3Nzc3Nzc3Nzb29vb29vb29vb29rb29vb29vb29zc3Nzc3Nzc3Nvb29zc3Nzc3Nvb29vb29vb29vb29vc3Nzc3Nzc3Nvb29vb3dByXV9wZVdLUGNPS0JHQ0pIS0ZBPEE9SFFBOjo3Nzg3Njc4Nzw6OD09PD47QD88Pz07Ojs5Ojk8QEJAQkNAPUFAPz1AQkNDQUBAP0A7RU144N3d3d7e3t/f39/f39/f39/f3+Dg4ODg4ODg4NXV1dXV1dXV1NXU18h4i4V8goh6g4SBfoKCc2l0hYuGkJ3U1tXU1dbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tvb2tvb3Nzc3Nzc3Nvc3Nzc3Nzc3Nzc29zb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb297KalxjcWVST1heSz9HTElPS0VAPkFCP0lPPjk6NzY7NzY6Ozc7Ojg6PDw+Oz09Oz48Ojs4OTo4OUFCQkFAQDtAQj06PkFCQz8+PT4/PUZOdN/e3t7e3t7f39/f39/f4ODg4ODg4ODg4ODg4OHV1dXV1dXV1dXV1s6dhpl+f5OTin+CgXx9gnNxm4mAgoOJwNnat7TQ19bW1tbX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tra2tra2tra2tra29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NvfwGNaW21gVlBTU0pETEhNSEk8PkFEQ0ZORDw8OTc5OjY4Ozk3PDk4OTw9OzlAPjpBPzw3NTc7ODpAQUVBPz45PUI/Oz1CQkI6Pj07PT5GTnHe3t7e3t/f39/f39/g4ODg4ODg4ODg4OHh4eHh1tbW1tbW1tbV1tjLioCHhYOXjHh7e3lvfYF1a3ebdHZ7eInHxpiMrdjZ19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2drZ2dna2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tra29vb3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29zb29vb3Nzc3Nzc3Nzd3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3Nzc3Nzc4LdjV1lrYlJNVVFMSktGS0ZDQD5CQT9FTT4+PTg5OTo3OTo3NT03Nzo+PDs7Qjw5Pz05NjY4PTk6QEJGQD49PEBCREA9QD9DO0A9PD4/Rk9t3N/e3t/f3+Dg4ODg4ODg4ODg4OHh4eHh4eHh4dbW1tbW1tbW1tfVrYZ6d32rn3l4entzdH+Dfm9xe3l6c3t2k4qFgImkzdnY19fX2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tna2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29vb29vc3Nzc3N3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vc3Nzb3Nzc3Nzc3N3d3d3d3d3d3dzc3Nzc3Nzd3d3c3Nzc3Nzc3N3d3d3d3d3d3d3d3dzc3OGtYVtebGJSTVZMTUdLS0RGQkI7QT08RUxCQT44Ojk6Nzc5NjY6NTs+QDs9Oz89PD89Ojk5Ojw5PEVDRkA/PkBDQkQ9OT0/QT1CPz1APkdPadvf3t/f3+Dg4ODg4ODh4eHh4eHh4eHh4eHi4uLW1tbW1tbW1tfQmH+Qh4N9eoN2e3Vzenl6kKqmd3JyfoeHh4CAfoKEhJHJzNnX19jY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra29va2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2djY2NnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vb3Nzc3N3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzb29vb3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3dzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3NzhpV9UYm1iUE9TSUhHRkpJSUJBPkJCPEVFREA+ODo4Ozc3Ojc4ODY+Pz07PDk9PDo+PTs6Njc7NjpEQUY+Pz8/PkNBPzs9PT47REM/PjxIT2fZ4N/f3+Dg4ODg4eHh4eHh4eHh4eLi4uLi4uLi1tbW1tbW19jYyH52doN+fnR2eIaCenl1d5yhu6GEgoCAfoeKinx/gYaMnKjO2NjY2NjY2NjY2djY2NjZ2djY2NjY2dnZ2dra2tra2trb29rb29rb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3d3d3d3c35pbT2drXFBRUElDT0pLR0xHSkJAP0FHREBBPDg8ODg1ODk3Njc3QEA/Ozw5Pj04PTw8Ojc4PTk/RENGPkE/QkBDPzw6Pj0/PkVEPz07S1Fj1+Hf4ODg4ODh4eHh4eHh4uLi4uLi4uLi4uLj49bW1tbW19XB3LRueHJze3B6eXaFiIR7eH2AgZiljH98fnuRhZaLhoGDgY6Rvd3Z2NjY2NjZ2dnZ2dnZ2dnZ2dnY2dnZ2dna2tra2trb29va2tva2tra2trb29ra2tra2tnZ2dnZ2dnZ2dnZ2dna2trZ2dnZ2dra2tra2tnZ2dnZ2dna2tra2tra2tra2tra2tra2trb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t3d3d6NWFdobllQUUtISlNJTUhNSUtBQz9DRkJBRDo6PDg2NDg4NzY2Nj8+Pjo8OTw7Oj09PDw4Ozw8RERERT4/PkI+Qj84PT8/Q0NCQEE+O0xUY9Xh3+Dg4OHh4eHh4eLi4uLi4uLi4uLi4uPj4+PW1tbW1teslLZ6eHJvd5V7dHuLgHh1bn6Fg3t/hYhyfH2bnI6JioJ+g32Hk5rH1NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2trb29vb29vb29vb2tra2tra2tra2tra2tnZ2dnZ2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2trb2tra2tra2tra2trb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d7Zf1lgaGxcUUtHR09LTk5PTURGQkg/Q0hEREA6Ozs4NzU3Nzc4NThAPkA7PDk8Ozw+Ojk7OTk7OUZERUI8QD4/PEBDOz5AP0A/Qj8+OjtKVWPV4eDg4eHh4eHi4uLi4uLi4uLi4uPj4+Pj4+Pj1tbX19vKhYR3cXJubniVhHt4hH95dnB4c3eLkY6CdnN9ioaId3d1d4ODfIiIk8Pb2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2trb2tvb29vb29vb29vb29rb2tra2tra2tra2tra2tnZ2dnZ2dna2tra2tra2tra2trb2tra2tra2tra2tra2trb29vb2tra2trb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f0nVZaGlqVk5KSE1OR01EUElGSD9FPUZMREM+Ozs8OTc3OTY2OTU4Pj4/PTs8QDs9PDo3Ozc5OThHREVCPUE9Qj8+QDw/QUE/QEJAPjs8S1Ri1OLg4eHh4eLi4uLi4uLi4+Pj4+Pj4+Pj4+Pj49fX19fEknuJf29sbnV2foSBg4qGfnVybWVtiIaKjoR7c4OHint4e4OPj4GEioqxztrZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29zc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tvb2tvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3dzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f3t7e4clsW2pqalNOR0hOT0VIRk1JSUA7RD5ISUA9PDo6Ojg2ODo3Nzk0OD08PT07ODw8PDw4Njc4OTo6RUJFQT9APEI/Q0M+PkNEQUBAP0A8PUtRYdPj4OHh4uLi4uLi4uPj4+Pj4+Pj4+Pj4+Pj5OTX19fZqXaFfnx3bHB3eXh8jH2KhYB3anN0d3p9bot7fnl6foR/gIGDfnh8foeGlrbT2tnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra29ra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/e3uO9amFpa2lRTkZNTEtKWE1OR0FAQE9BRD9AOzw4OTk5Njg2NjY4NDs+PD07OTY6Ojk6OTU4OTg5OkJERj8+Pj5AQEBCPzxBQD88Pj9BOT5KT17S4+Hh4eLi4uLi4+Pj4+Pj4+Pj4+Pj4+Tk5OTk19fX2sqKhIB5c29tcXN1d4CUeHaAfHWHhXd1cnWgmXp7d3Z5doR0bWxue3iAmouTu9za2tra2tra2trb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc29vb29vb2tra2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f397js2lpbmloUFBPTExPUk9LU0Y/RURERD48PDg6ODc5OTU2ODY2NzM6Pjs+PTc6Pjk5OTk2Ojo4NzxDRUc/Pzs/PkA9PkE9Oz0+OUFAQDhBTlFc0OTh4eLi4uLj4+Pj4+Pj4+Pj4+Pk5OTk5OTk5NjY2NjauY6AenZ1bmpveHCBfWt0cnZ3hIV5h4d5lY55eXp1d3pza298gHx2fYh8gLLe2tra2tvb29vb29vb29vc3Nzc3Nzc3Nzc3dzc3Nzc3Nzc3Nzb29vb29rb29vb29ra2tra2tra2tra29va29vb29vb29vb29zc3Nzb29vb29vb29vb29vc3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3t7e3t7e3d7e3t3d3t7e3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/f39/f4qpqa2hrZFNQT0ZQVFJOSFJLPkREQ0I7Ozk6Ojg2Nzg1NjY4ODg0Oz88Pzw5PDw3Ozo6Nzo6Nzo9Q0JDPUE+Pzw5PT5BQDs8PDtFQD47Q05TXNDk4eLi4uLj4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTY2NjZ1p5vdntveHh2cG50d3BwdHBzb36Jc3qGhY2EenNtcoB6hn1vg5OBdnx9g4a13drb29vc29vc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29ra2tra2tvb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4N/f3+KgbWhma2ZVVlJHUFFOS0xMRUJIRUc9OD08Ojo3Nzg2Nzc2NTY3NDg+PD09Ojg6OD46Ozc4Nzc6Oj5DRDtDQj49OD1AQUM/Pjw+RTw+PUJNUF/S4+Hi4uLj4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk2NjY3MB2doCCfnp4eHBsdXlya399bHNvdGdoaYB/aWl4c2d+iYl4cIKGe3d9foWKvN3b3Nzc3Nzc3Nzc3Nzc3Nzc3d3c3Nzc3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODflGttZm5mU1NJUFlUTEhGTkZGRUJGPTs+PDs5NzY4NTc5NjQ1NzU4PDs9Pjo6OztAOTs7ODc6OTlAQkE8QUE/Pzk/QEJFQ0FAQEM7Oz1ES01g1uTi4uLi4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk5NnZ2tmYc3uqhJaCcnR1dn14aGx8d2h4d25rcHR5gIJ3dHyBhIJ9c3CAin94gn95g8je29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f4N/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh24tubWdzY1lRTVVbV0hDSUZOS0dCRD8/Qjo7OjY2NzU2NzY0ODc2Ozw7Pj86PDk8Qjg3OTo6Ojk6QUFCQUJDQEE+PT9CQ0NEQUJGOTg9REpOYtjk4uLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXZ2drcqHGCtXiRfnNsem6EgXaCfWtoan+DeHZ8dX2FhXRmcHl9d316gIqFe318foC03tzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3dzc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3Nzd3d3d3d3d3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e397e3t7e39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4ODg4ODg4tiFb3FrdWFWT1VVXE9ETUY+SkdKRUQ8P0I6PDk4Njg0NTY3NDc2NDk7Ozw7OD47PEE4ODo9OD04Oj09QEBAP0FCP0A+QENCQ0FBRTc2O0RMTmPa5OLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXl29ra3Z5sbnNxhY1ybXBuf391hH5rcnZ2enN4gXhzbnVwbWt2fHmFiIB/f392coODsd/c3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eDg4eHh4eHh4eHh4OLXhW1xb3ZeUldTWlpRSkhDQFFAQkQ8OT9BOjw5NzU3NDU2NjQ3NTY9PDo9PTk+OjxAODo6PDY7OTs+PUJCQjtBQkBDQEBEREM8PUA3OjxFS01l3OPi4uPj4+Pj5OTk5OTk5OTk5OTk5OXl5eXl5dPOxsB+cWxveHt2b3VuanNzbZKGeG50dG5vdIZ/b2twboJ0bXZyfY2DdnF/d3mKgabf3Nzc3d3d3d3d3d3e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3dzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t/f3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi1oZucG1xYFJZUFdfWUpMTElSP0Q9OTtCRjs6OTc0NTY1NzU0NjY2Pj07Pz45PTk7Pjg9Ozo0ODtAQENCQ0FCRkE/Q0BBQkREOz0+OTs8QkxNZODl4+Pk5OTj4+Tk5OTk5OTk5OTk5eXl5eXl5eW5t7Woc3JscHd6dHd4bXFydXd/hHRyc2xsa3F8bnBudGuBf3GAd32Eg355gHNygYqg2d3c3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh49WHcWxqbF5YWlVXYFZWUE9QTD1BOjs8RkE4Ojg3MzY1Njk2NTg1Nz89Oz8+OT04Ozw5PTs7NTo9Q0JCPENDREREQUE/PkJDQzw9Pjg5PENLS2PN0dnh1sjY4+Tk5OTk5OTk5OTk5eXl5eXl5eXltbW2q3J5cm59f3Z1d2hqaGlwb3Zta2tnZWZxdG15gG5teXd2iHhxa2podXV5dHV/wd/c3d3d3d3d3d3e3t7e3d3d3d7d3d3d3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHi4uHh4ePVhnFwY2lhV1NZV19MUk9STUtAPjg5O0E+ODc5NjQ3Njc6NjY2NDk+Pzo8Pzo/OTo6Nzo9PDk5PEFBPTtBQ0VDRkA+Pj5BRUQ+QEE3OD5GSEpesrW4wbm1u8jg5eXl5OTl5OXl5+fn5+fm5ebm5ra2tbWOfX5weoR1cnZnYmNlbGtyb2ZpbHZtd4Z9hXlsbHd4a3ZwfH14c3V5fHd2h7ng3d3d3d3d3d7e3t7e3t7d3t7e3t7d3d3d3d3d3t7e3t7d3t7e3t7e3t3d3d3d3d3d3d7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4eHj1Yd1bl5uY1pUU1hXS1NLSk1SR0E4Ozs+PDk4NzU2NTY2OTY4NjY5Pzw6PT07Pzo7Ozk8PDs5Oj4+Pjs8PUFEQkNBQEBBP0JDPDw9Nzs+REVKXrG1tLW2t7e2y9rJ3uXl3eDi3tXU1tPU4OPg39+2treuh3t/bnmNenJ1bWNobGxtaXR4enF5enqIh4N6aWh9cWRvcXyGgX55e318e4an2t7d3d3d3d7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4uHh49aGdmxhb19dV1lcWlJQSEpXTEVHPUA9Ozs9OTY0NjU1NTg2NzY3OD87OT09PDw5OTw6Pjw6OTg+Qjs7Pj5AREBDRUFAQD0/QDw9PTU5PEJHRl2xtbW2uLm5ubq9uMPT0r3BwcC6u7y6u8TMxb/Dt7e3hGl1gX1ndYd5Z3Vxa2t5eHB3fH15bWl3e3h3bml1j4FwbHl4d3d9gXuGgnmAoNze3d3d3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODh4OHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4ePXhXJrZ3RhW1hYX15TVVVRVUpMRj9JRDs5PTY2NDc3NTc4Nzc3ODk8PDo+PDg8Oj0+OTs8OTs5P0E8PT9DP0FARUJCQTw9Q0A6Pjw1NDlER0dasbW1tre5ubm5ubm3ubm4uLm5urq6urm5urm6u7e3uX9ucHN6b3B/eXNuc3Vsc3Z4cXFwb2tvcX6Bc2mHhIF9dHOHdW11hYmBgHJ2hafd3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uHj14lxa2xyW1dXXWBUUVVUUFJPSkNATUE9Ozk2NTM0NjQ2ODc3Nzk6Pjs8Pjs5PDo8PDk8PTw7PT0+PUNEREBDQkE/QD48PkE8OD06NjY6QkpIWLG1tLa2uLm5uLi5uLe3uLi5urq5ubi4uLi6uru3uKx7cnhxf3ZzfnBsbXpyZ29sbW50cHt3d3Jyd3pvhpJ2f3x8enZ5fH9zfYdyda3T393d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4eHh4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi49eHb2pxalVWV2FbT1FSUE5XSURESUo/Ojk6NzUzNDk1NzY2Nzg4Ojw7PD46PDo6PTw5PDw9Oz09PDs9REdEQ0E8PDw8Pj5AOzg8ODE1OkFGRVautbW1tre4uLm4uLi4uLe4ubq5uLi3t7i4ubq7t7mqcnB4d3x7e4J3aG5xam9qY2lyf21zcn54dHFsanaAeX2AgH91doB1a4qLgHaR1d/d3d7e39/f3t/f3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f4N/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLi4uPYhm1sdGVWUFxnWE1YU1JRWUVDS1BOOzk4ODY1NTM5NTY2NzY4Nzk+OT0+OTw5OTw7Njg5OTo8QEA9PkBGQEJCQDo+PEE9Pzs7OzYxNjxCR0RQqLa1tba2tre4t7i4uLi4uLm6ubi4t7e3t7e5ure2tIlyd3h9iXxwem99c2hqbGdnbHRscXd0cWx2c3Fxd3FyfHl4g3Z7d2mLkYp9kM7f3d7e3tvY2drZ297f39/e3+De39/f3Nvc3N3e3uDg3+Dg4ODf3t7e39jS397f397e3t/f3t7f3t/f3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLi4eLi4uLi4uLi4uLi4uLj4+Lj4+Li4uPj4+Pi4uLi4+Lk14NoZ3VkVlVkZVdKWllXW1Q9RU1LSD04NzU3NjQzOTQ0Nzc1Njc5PTo9Pjw9PDk7PDk5Oj45PD4/PkFBQ0FFRUQ+OzxBPjw5PDs3Mzc+REhFSqG2tbW1tbW2tre4uLi4t7e4uLi3tra2tra3uLm2traLfXpsbHp/cGx5dm5qaGdlcXp4b2lvb3B1c21zd4Fnb32CgYNyf3lqcHJ6f6ng393Zy8a/vb6/vsLN0tDW3tnc4NfQzcPCw8PH1dfT2dzX1NjX0MfExce9vM/Kz87Y3djO3N3c2t3T0dze39/e397e3t7e4N/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eLi4uLi4uLf4uPi4eLg4d7W29/Sw8rJx9Hb3OLk4eHg2dre1sbExcTN2trf5OHi4trX3st9aWZxYVleZWFNTFRLUlpMO0hNSEZBPTc2NjUzNDY2NDg3NjU2OTw7Pj46Pjk5PDk3OTs7Oj49PEBAQ0RCR0ZCQT08Q0A9OTw7Nzc3P0RGRkaZtrS1tbW2tra4uLi4uLi3uLi3s7W2t7a3t7i5tba3opdxb29waW50dnFmZWNrbmdvcm1mZ2tygWVvdnyAeGRzj39zaHFyaWVlbm+w39HFv7u5ubm5ubq6uru6vc3Gw8e/urq6uru7u8HCvcHFvby/vry7urq5ubq6ubm6w8XDucDDwby/ube/z8/U3tjc3t/g3tLa4N/f4ODg39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eDg4ODg4ODg4ODh4eHh4uLi4eDh4uLi4uHa2t3RwsPCu8XT1uDdydPDrrnAsaqrq6uwtLbJ0sXRxLG4v7Srq6usr7S0vMzE1c60tLureGxtbWBdYl9ZS1NVVFFQREBRTUhEPzo3ODU3MzE1NjQ5ODQ2Njo8Oz08ODw5Njo6ODg5NzU8PDw/QEFAQkRDQkE8PkI/Pz09PTc1OD5DRUNAj7a0tLW1t7i4uLi4uLm5uLe1sautr7Oxs7OztLS0tqaei2tue3ZxeXhnY2hfcXdha25vaG99b25ja2lseHdsa4Z+bHB6dm1scG95sca8uru7urm5ubq6urq6urq6urq6urq6urq7u7q7u7y7urq6ubq7u7q6urq6urq6ubi3t7i4t7e2tbW1tbi3u8e+w8XHzcS4wMnH0tzZ2d/e3uDf39/f4ODh4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh3Nji4uLi4eHh4OHg3tfGxtHQztTe3tPO0t/SuLi8sq2trKysrrG+ua63rKipqamqq6urqqqqq6ysuKyqqqqrq6urra6urq6urryzrayrpHlub21fXl1dVE1SU1xUSkE/UElIPjg5NjgzNzMwNTczNzg1NzY2Ojw/PDg5Ozo6Ojg5OjY1OTs7Pj9EP0NFQkNCP0BAQT9APjw3ODc6QUVEP4W4tLS1tbe4uLm5uLi3t7SurKuqqq2urq6vsLGzs7WjcG5ucm1wg311aWFlaGZkY2Rxc21td25naW1tZXBzb29zcXN8h4F6dX11n7u6uru7urm5ubm6urq6urq6ubq6urq5uLm5ubm6urq6u7q5ubm5ubq6ubm6ubm4uLi3t7e4uLe3t7a2tbW2tra1tbW1tba1t7e3t7rBvrzGycrb3+Dg3tvd3d7h4tDW4uHg4ODg4ODg4ODg4ODg4OHg4OHi0768zNjd3OLg0dnbxL23sLCxsa+zu7uzsLS9s66urq2tra2sq6qqqqmpqKmpqampqqurqqqqqamoqampqampqaqqqqytrq6urq6urq6sraR4aWJxZmFZWlZRUk5cU0Y9QlJEQTc8OzY5NTY1NDU2NTk3NTY1Nzg7Pjw7OTk5Ojg3Nzk3Njg8Oz47RD8/Q0BBREE+P0M9Pjw+Ojo3Nz9DRj54srCztLW2t7i3trKurq2sq6uqqaqtraysrq+xs7S1t4xucnRqaIB5ZmpmZWxdaG5waGxxYmNmcoJ+dmhobGpueoaBhXx4cXF5gK+6ubq6urm5uLm5ubm5ubm5ubm5ubm4uLe3t7e3uLm5ubm5uLe3t7i5ubi4uLi3t7a2tre3t7e3tra2trW0tLW1tbW2trW1tre3t7e3t7e3tre4v8bP0MS+v8DE19e8ydra4OHg4ODh4eDg4ODh4eDb3t7Uzby3tre6wMDJxLfIvrKwsLCwr7Cvrq6ur7Cwr66urq6uraytrKurq6qpqampqampqampqKmpqKmpqampqKmpqKmpqqqrraytra2ur66trK2heWpjbWdiXFhRUFFLVEpCOklRP0E3PDk0OjU2NTQ1NTU4ODY4Njs6OTw9PTs6ODY2ODg6ODY3Pj09PT5BQUVCQkNBQUBBOj09Pz05Ojc9QUc8bKqmqKutsLGwrqupqKqrq6mpqamrrKytra2usLO0tbilgIdvaWdzdGZrcG1qZGxvcm5rbWNrcHyJhG5qbHx4Y3uKfnNqc25rcY+7ubm5ubm5ubi4ubm5ubm5ubq5uLi4t7e3t7e3t7i5ubi4uLe2tra3t7e3t7a2t7a2tra3tra2tbW1tba1tLS0tbW1tra2tra3t7e3t7i4uLe2t7a2uLm4uLe3uL6+uLq9vcfb4OHg2Nnd4eHg3dfKwcPCurm5uLe4uLi3tbS0tLKysbGxsLCvr6+vr6+vr6+vr66ura2srKyrq6yqqqmoqKmppqepqaehpaipqamoop+hoZyip6inqausrK2ur7Cwrq2unXdwbGphY2BZUU1RTFJGQzlNUEY+ODs3Mjc5Njc0NTM1ODg3OTc7OTo9PTw6Ojk3NDo5ODY1OD8/QEI9RENDQ0FDQEJBQDtAP0A/PDw6O0NIPWOopaWlpqioqKenp6ipqqmoqKipqqqsra6wsLCztLW1taWYdn5xZmt4cW9tZmVsaGNsZ2ZpaX11bWlvfXZ5hWZod294b3Fvcninu7m5ubm5ubm4uLm6ubm5ubm5ubi3t7W1tba2tre3t7e3t7a2tba2tre2tbW1tra3t7e2tbS0tLS0tLS1tLS0tLW1tba2tra2t7e3t7e3t7a2tre2tre3uLe2t7i4t7i4uLi4wMXTyry8w83PyMC9urm5ubq6ubi4uLi4t7W0tLSzs7KysrGwr6+vr66urq+vr6+uraysrKurrKysq6ehoJ6gn5udoaGdlpmkpKaon5mZmZmanZ+gn56fpKqtrq+ura2srJl1cGlrY2FeXVVOU0tSREQ4TktHQTo4NTI2OTY1NDczNzc3ODk3OTo7PT0+ODg4NzU6OTk1OD9AQEJEPkZBQkNAQkNCQT88QEJCQD0+OjpERj5cpqWmpqampqanqKenqKioqKenqaurrKytra2ttLS0tbekc311bnONf3JmanFjaW1jaGZobG51aV9jZ3VzdnpuZ3Bwcn56cYihu7m5ubm6urq6urm2s7W1uLm2trW1tra1tbW1tbW3tra3tra2tbW2tbW1tbS0tLa2t7e3tbS0s7O0tLW1tLS0tbW1tra2tra2t7e3t7e3tra2trW2tbW2tra2tra2tra3tra3uLi3uri4uLe3t7i5ubm5urq6urm4t7e3t7W1tLS0s7OysrKxsbCwr66urq6urq+vra2srKuppaSmpqScmZubmpmampmXl5eXl5aZm5iZmJmZm52en5+dnJ6gpKWko6OioqKQdG5jcGFeXltUU1RIVEo/PFFCRkM7ODYzNzo1NTQ4Mzg5OTc4OTc7OTs9Ozc6NzU2OTk4NTg+Pz9ART5CPz9DPzxBQUI/PT9EQT8+PTk9Q0Y/VaSlpqanqKeoqamop6ioqKioqKiqrKuqqaipq7W1tba5o3eKcXKHhnd0cGh5a2JjYWVsaW5zal9jZWNjZWprYmRqbHaXjX6ovbm3tre5u7u6uLWxrKurq6+wrKyrq62tq6uvsLGvr7CytbW2t7W1trW1tbW1tbW2trSvr7O0tLSvra6vsrW0tbW1tbW2t7e3t7e3t7e3t7e3t7Owsra1tLa2tre3tra2tbW1tra3t7e5uLi4t7e3uLi4ubq6urq5uLi3t7e1tbS0tLS0tLS0s7OysbCvr6+vr66vr62oo6KgnJqampqZmZqbm5qampqbmpmZmZiXl5aYmZmZmpycnZ+foJ+goKChoaCgoJ+fi3RuaXRdYGZeUlRLRFRJPUVTSEVCOzo0NDY5NDQ1NzM4ODg3ODk5Ojo7Pz04OjkzNTg5NjM5PT5AP0A6QEJCQkA/QEJCPz0+QUFCPz06PkVDQFGjpqWlp6inqauqqKaoqKipp6ioqKinp6ioqaq1tbe3t7KZtH99kIx1Z2lqbGZjYGNoZW94cGlicXx5cGpmZmRma3NqhYystrKwra2ttLeysLCtrKuqqamop6ipqampqKinqKipqaeoqqurra2sqqytraysrq6traunpaSnqqyopKOkpamwsbGztbW2t7i3t7W1tre4t7e3t7Kppaasq6ivtLa1s7W3t7a1tbW2tra3t7e4t7a2t7e3t7m6urq5uLi3t7Wxs7S0tLKxsK6sq6yurrCxsK2rqqmqqKijnJqZmJmYmJiYmZmZmZmZmpqZm5ubnJybmZeYmpqcnJydnJ2foKGhoqKioKGgoKCfnop1amtuWVxhVktPREdVRz5PV0hEPTw4MzQ0ODQ1NDgyODk4ODk6Ojw5OUA8Njk6MzY3OTE0PD8/QEBBOkNGRUJBREJDQTo7P0FCQz9APUBEQ0BPo6empaemqKqqqqakpqenqKioqKimpqaoq6uttba3t7e4rbJ1cHuDdmBiaWtiZWZhZGdmfYh5bHKAfXFvcXhjbW5xZo+srKurq6ysra6urK2trKyqp6WlpaWlpqioqKiopaeoqKeoqKeoqKmqp6Wko6KioqOioKKioaKhoKChoaKjpKOjpaWlqLC0s7OzsKuqqaqztLa3trGopaOioaGipKiqqairs7Sxrq6xs7W2tra3uLi3tre3t7e3t7a2uLe0sa6ppqerrKmnpqWkpKSkpKWnqaajoJ+enZycm5uampmZmJeXmZmZmJiZmpqampqampqbm5mYmpydnZ2dnZucoKGgoaOjoqCgoKCfnp2FdGtsaFdYU0pHTUVITUdAU1dGRz09OTM2Mzc0NTU3Mzg6Ojk6OTw+OjpBPDY9ODM3ODgzNztAPz9AQDpCRUNAQkRDQT87O0BDQkNBQDxBQ0A9TqKnpqanp6mqq6mkpaWlpaaoqKippqanqKmpqrW2tre3t7izc2h7c2JnamtpaWJhZGloXV1tfHJma3J/fHR8bm1zc36gqamrq6uqq62trKusq6mpqKWjpKampqWmp6eqqaamp6enqKinp6iop6WkpKKhoaGhn56en5+fn56foKGho6Wko6OkpKSlp6enpqWkpaampqeqraumpKKhoaChpKWlpaempaeoqKalpaivtLa3trW1tra1tbOwrKupqa6rqKWlpqampaSkpaWlpqWkpKSkpaKhoaGgnp2bm5ucm5qamZiXmJiYmJiZmpmZmZmYmZmZmZqZmZydnJycnJybnJ+fn6ChoaKgoKCfnZ2cgHNrbmReU0pITUZETEtFRFFTQ0c9PDgzNjI4NDY0NjQ4OTg6Ozk7Pjw5PTs5PTczNTk2NTY8QD0/QT88P0JDPkJCQj89Pj5CQ0FFQD86PkVAO0+jpqWkpqeoqaelpKWlpKWnp6eoqKanp6alpqa1tba2trW2uYptcW1vfHxxZ2pmYGFsYFROW2hqbm9tgYJ9cWdxdn6aqKeoqqmpq6urrKqqqqimpaWkoqOlpqalpaWmqaqppqWjpKWmpqSko6Kio6Khn5+fnp6cnJycnZ2dnJ2en6CioaKjo6OhoqKkpaSioqOjpKSjpKSko6Ggn6GipKanp6ipqaelpaSipKSlqK2wsKyrqqusqqmnpaWmpaWlpaalpqioqailpaWkpKSlpKOjpKOioaGhoqKgnp2cnJubm5qZmJiYmJmam5mXmJeWlpeXmJiZmpqcm5qampubm5ucnJ6goKGgnp6enpycm356bnJiXlNNSlBFRk5NQkBPRT5JOz01MzYzODM2Njc1Ojs4OTs5Oj49Ozo5OT03NjY5NjU2PkI+PkE/PT5DQT5DQ0BAO0A/QkJCRUA+Oz5FPzxQoKSjpKOjo6SkoqSlpaSlpqamp6empqalpqaltLW1tbS0tbiBaHx9ZXOCemxwdWFfY1ROT1FbaGxpbGxxbW5xbnScoqSnqKioqauqqqqqqaempaSjo6OjpKSlpqalp6ytqaShnp2epKShn56foKCdnJ2dnJycmpqam5ucnJubm5ydnp6foKChoJ+goaOioKGjpKSjoqSlpaWkop+go6SkpKapqainpaGdnJ+jpaipqainqKioqaempaWkpKSlpqampqampqenpaWko6Ojo6KioqGhoqKhoqOkop+enZ2cmpubmpqZmJeXmJaWlZSUlJWVl5iYmpubnJuampqam5ucm5ucnp+fnpucnJyam5p/fnF0YFtUTUdNSEZMSj8/TkM8QDs8NDM4Mzc0NzU3ODs9ODo6OTk7PTs7ODk+Njc4OTU4OD9APT9BPjs9RD89REA/PzpAQUE/QUVAPjw8Qz88Tp2ioaKioKCipaSkpKWlpqenp6empqampaampbW1tbS0tLS3jHalsXdmc3Jvc2xjZGlYT1JRT09dgG1kYFptkZGSoqKjpaampqenqKiop6alpaOioaGhoaKjpaempqesq6emoJ2cm6Ghnpubmp2cmZiam5qampmZmZubm5uampqampucnZ6goaCfnp+hoJ6foqOko6Omp6inqKWioKGhoaGkpaWlpKCcmZmbnqOmpqampqanpqempaOlpKWlpqiop6enpqWlpaWkpKOjo6KhoqKioqKhoaKjo6Kgn56enZybnJubmZaUlJSTk5OTkpSUlJWWl5qam5ubm5qZmZqanJ2dnZ2dnZuampqamZqXf3dvc11aTkhKTkdFRklERU5APD09PDQ1OzQ2NDY1Njc5Ozg5OTg5OTw7PDc6Ozc4ODg1ODg/Qj9BQTw+P0A8PEJAQT49QT4/Pz1CQUA6OkA8PE+doqGfoJ+dn6OkpKSlpqeoqKenp6ampqampqW1tLS0tLS0tbSXtqd1Znh2Y2xjY2VjW1JTU1JNXqCMeFhodpajnp6hoaOjo6OjpKSlpqalpKSioaGko6OjoqOlpqampqenpp+bmpuioJqWl5Wam5qXl5iZmpqYmJqampqbm5qZmZmenZ2goqOjo6KkpKWinqGhoaKjpaampqSjoaCgn5+hoZ+goJ2amJiZmpygpKOjpKWmp6alpaOjpKSkpKWnp6ampqampaWmpKOjo6SjoqKjpKGfoKGhoKGgoaCfn56dnZyamJeVk5KSkpKSkpOTkpOUlZaZmpqbm5qampqbnZ6enp2cnJybm5qamZmZlH10bHReWk9IRUdGQkVORT9GOzo+Pzs0Njo2OTM2NDY4OTo4OTc4ODo8Ozw5Ozs6OjY3ODk5Pj9APjw9QD5AOjlAQT89QT8+QUE+QUE/Ojk9PjpQnaCfnJucnJufoqOlpaWlp6iop6ampqanpqantLS0tLOysrGwsK2rkHiGj36amn93Yl1TUlFRTGKgootaiKCgn52YmZycnZ2eoaGgpKenpqWkoqGjp6alpaOipaampaanpqagm5mboaCXkpOSl5qcmpeXl5iampmampqam5qYmJmaoKCgoKGfoaKipKamop6gn5+goaOko6Khn56enpyanZuZmpqZmJeZnqChoaKioqKkpaWmpKSkpKKioqKkpaWlpaWlpaalpaOko6KioqGgoKGgnp+fn5+fnp+foJ+cm5qZl5WUlJSTkZCRkpKSkpKSk5SVl5iZmpmZmpqam5+fnp2cnJycmpmZmpiXl5F8cmdxXl1QRj9BRD9KT0JCRjhDRT4+OTg7Nzc0ODQ1OTo6Ozk4OTo8Ozo8PT48PDo2NzY5OD4/QT47Pz49PDg6PkFAQUE/P0FCP0RBPjo4PkE8U5ycm5uampycnaGio6KjoqSmp6alpaampqSjo7KysK2rp6amp6alpqiln6iop6qnoXmEXFFST0xcnKCAYpmgnp2clZOVlpeZmp2dnqGmpqampKOioqanp6ajpKampaWmp6amop2cn6Gfl5GRkJSXm52YlpeWmJuZmpqampqZl5iam6Ghn56fnpybnJ6goJ6dn56fn6Cio6SjoqCfnp2ZlpeXl5iYmZubnqKioqKioqGio6WlpKOio6SioaGhoqOkpKSko6SkpKSioqKhoqGgoJ+gnp2enp2dnZ2dnp6em5mYl5WTk5SUk5KQj5GSkZKSkZKTlJaXl5iYmZqampyenZ2dnJubmpiYmpmXlZaNempmamBiTkY+P0A9SkVAQ0A7QEE8Ozs5Ojc2NTg0Njc4OT04ODs6Oz87Ojs9Ojo7Nzc2ODs8Oz08Ojo8PTw3Oz5DQkRDPz1BQ0FEQT88OkBCO1eZmJqamZmam5ucnp2foqKhoqSlpKSlpqSioJ6op6alpqWlpaemp6ampqakpaanqKehqXJOUU1KVJahenKanJyenJeVlJWWmJiXl5qeoqKhoqOkpKOjpqalpKanpqWlpaalpaOgoKGhoJmSkI+Wm5menJaXl5eZm5ycnJqamZeZm5uen52cnZyZmZqcnZydnp6fn5+hoaCgoaKgn56bl5WVlZeanZ2fn6GhoqKio6OhoaCgoJ2cnaGioqOkpKOioaSlpKOko6SjoqKioqKhoKCfn52cnZ2cnJ2dnJ2enpqXlpaVlJOTkpKSkpCRkpKSkpGSlJWWl5iYmJiam5ycnJycnJ2cm5mYmZiWlJWXi3hsY2RiZFFHQT1DO0tIRDo7Ozw+OTo6OTo3Mzc5NTk4ODg8OTg7OT09Ozo7Ojk8PDc2NDc/PDo9Ozw/Pjw7ODxBQ0FDQkI+P0NAQkFAOj9APztZmZiampqam5ubm5ydoKGhoaGhoqKioqKhn5+dpKWmpqenpaWmp6ampqWkpKalpKSkpaaGUFJQT0+PmHB6mpubnJ6cnJycm5ubmZiYm56dnp6foKOkoqGhoqOio6SkpqalpKSjoqGhnpyblZKUmJyam56amJiYmJqcnpyam5iWmZybnJycnJydmpqbnJ2dnp6dnp6fn52cnJyhoaCblpWVlZacn6Ggn5+hoKKjoqOhnZuZlpaWlpicnqCip6ikoaCgoqOjoqKioKCgoJ+fnp+gnp2cm5ucnZydnJmanJuWk5KSkpKUk5KSkpKSkpOSkpKRkpSVlpeYmJiYmZqcm5qbm5ucnJqZmJiXlZWWl4d3ZGdoZGJNQ0U8RDlJSkU5Ojs9PTo6Nzg6NjQ3OTU8OTY4OTc5PDs7PDo6PDs6PDw4Njg3Pj07Pj46Qj86Ojo/QURCQ0FBQD9EQUFAPjpAPj06W5qYmZqbmpubm5uen6CgoaKioKCgn5+enp2dnKWkpaanpqWlpqakoqKio6Oko6Kjo6KnllRYVVJOZ21rgZ6am5udn6Cgn56enp6dnJ2dnJ6enp+goaCfn5+goKGio6OkpKSkoqGhnpuamZehtZ6ZmZienpiYmZmam5qWlZeWlZicnJ2cm52dnpybnJ2cnZ6bmJqeoaGdm5udoKKhmpWVlpaZoKKfnZueoaKjop+em5eXlJKSlJeYmZ2goqenpaGgn56goaGioaCfnp2cnJubnJubmpqZmpydnJmXmZaVk5GQkJCPkZKSkpKSkZKTk5OTk5OTlJWWlpeXl5manJubnJucnJqamZeXlpaVlZSEcmZsYmRbREJMPT84RktCPEA+Pj05Ozk6PTg1ODg2Ozg1Njo4PDw7Ozw8Ozk8Oj09OTU4Nzw5PD88OkE/Ojo6QEBDQkRBQ0A/Q0FAPj08QD09Ol+al5mamZeYmpycn5+foaGhoJ+fn56foKCenZ2lpKSko6OioqOjoZ+foKGipKOio6SiradXXl1UV19ua42dmpqbnJ2dm5ucnZ+enZycnJydnZ+goKChoaGgoKCgoqShoqKioaCenJubm5mfq5ucmpuZnJ6ZlpaWl5eTjo6QlJabnJuam5udn52cnJycnJ6dlpSZnJ+in5ycnZ+hoJuXl5mZmpycnJubnZ6fnZqXlpaWlJOTlJiampqfoKGmpqWgn56fnqChoaCenJubnJybm5ybm5qZmJmZmZmXl5iVlJKQkJCQj5CSkpKSkZGTk5aYl5STkpSVlJWWlZaZmZmam52cnJyampmXlpaWlpaQgG9vZV5gV0BKSDg/N0lFP0VBPD07Ojo8Ozs3NTs4Njs3NDY6Oj47Oj0+Pj07Ozs+Ozo4Ojk5NkBBPTo8PTo6OT9BQ0JERUM+P0FBPz8+Pj89PDtgl5WXl5aVl5mbnqGhoKGioqCenp6enqCgn52bpaWkpKSioKCfoJ+dnZ+hoqOjo6OkobCjXWVkYGFua4GenJubm5ubmZianJ2enJubm5ycnJ6ipKGeoKGioqKhoKWzrKCgn5+enJmZmpqbrmp2nZ2em5manJiXlZWWkY6Nj5KYnZycm5ycnqCdnJucnJyempWVm56foZ+dnJyenp2cmpqampqampqbm5qXl5aTkpWVlpWTlZaam5qanZ6foqWjnp6fn5+en5+enZ6fnZycm5qbm5qbmpiZmJiYmJiYlZSTkZCRkJCQkpKTk5CRk5SYmZiVk5SVlZWWlZaXmZmXmZqenpyamJiXl5aWl5eYjX1ubV9lVlRFSzw3PjdSRUM+QkE4Ozw7OTg6ODY7Nzc6Njc5Oj0+Ojw8PT49PD06Pz06ODw9OTtAPj4/PT45OTs/QkNAQ0VDPT9DQj5AQD5APTw8YZWSlJWWlpeanJ6goKCgoaCgnp6enp6gn56em6WlpKSioJ+fnp2dm5mbnJydnp+gn56rmGNpbW5pZm2enZybm5ybmpmZmZqam5ucm5uam5ygo6SgnZ+en6ChoJ+mkpurn6CgnpuampqZqIREgJ+fnpyZmJqamJiYmJKOj5OXnJ2bnJ2cnJycnZycnp6dnpqVl5ygoaGfnp2eoJ+cnJuampqbmpqYmpmVk5OTkpOWl5eVlJiYmZucnJydoJ+gnp6enp+fn56en6KjpKKgnp6cm5qam5uamJmZmJeXlpWUlJORkZCQkZKTk5OSkpOUmJmYlpWUlZaWlpaWl5iYmJiXmZqamZeXl5aXlpeWl4l4dmddX1dURUU5OTs8WT5AOEI/OTw8Pjk4Ozk6Ozc5OjU4OTs9PDk9Oz0+PD0+Oz8/Ozk+PDw+Pz5AQUE9ODc7QkNFP0FFQz1AREJBQEQ7Oz47PGKWk5SUlpWUlpiYmZubnJycnZ2cnJ2en56dnJqkpKSkoJ+enpybm5qZmJiYmZucnZ6cpolla3R4bVuFop2dnJydnJqbmpqampydnZ2bmpuboKKinpucnZycnJ2eoJ5inKaenpyampucoaNRSISgnZ6cm5qanZqam5yVkZOXm52dnJ2fnZycnJycnZ6fnp+cl5idn6GhoJ6cn6CfnJubm5qbmpmZmZmZl5WWlZaYl5eXlpaYmZuenp2dn6GhoJ+fnp6fn5+dn5+hoqKhoZ+fn5yZm5qcnZuampmXlpaYl5eXlpWTkpGTlJSTlJSUlJaZmJaVlZeZmJeYl5eXl5eYl5iXl5eXlpaYl5eVl5eDeHZfW11eUT1GOjk4P1VDQTtDQzo8Pz86Ojk3Ozg4ODc0ODk8Ozw4Ozs8PTo8Pjk/QT06PTw+PkA/PUBBPjk2PERDRUBBRUU9PkVERD9COzo8OTpkl5SVlZaUlJSUlJWXmJiamZqcnJydnp6dnZybo6Oko6CenJuamZqZmJiYmZiam5ubm6WJa3F2em9lmp+enp2dnJybnZ6dnJ2enp2dnJydm5ygoJuampubm5udm5qmZl2joJuamZudnK51SUyGoZydnZybmp+fm5ydm5mZmZudnZ2dn52dn5+dnJydn5+fn5uanZ+goJ+dnJ6gnpubm5ubm5yampuamZudnJqZmJeYmJiYmp2foKCgoJ+hoaGgoJ+en5+fnp6foaKhoJ+enp+enJqam5ubmpqZlpaXmZmYmJiWlJOUlJWVk5OVlZSVlpWVlZSYmZuamZaWl5WWmJiWl5OUlJGRk4yRkJOWfXhqYWJiXFE8QDw2OENWSERCOjg7Oj47Nzc5Nj06OTk2NDc6Ozw9OTo6Oz87PT08QD47Oz46PT89PkBBP0A8NztBQ0U/P0REPj9EREM+Qj07PDs6Z5aTk5OTk5OTlJSVlpeWl5aWl5mbm5ybm5uamaOjoqCfnpuamJeYl5eXmJmYmZybm5qkgGpqb3lzcZegnp2dnJydnp6enp+enp2cnJydnp2bnJuampqam5ubmZmYpIBSeKKZmZqdm6CkX1ZOh6GcnJ2cm5qdn5ucnJubnJubnZ2dnJydnp2enZydnZ2cnJ2dm5uenp6dnZybnpubnJycnJydnJubmpmbmpmYmZmYmpmZmpyfn5+jpaKfoaKioaGfnqCgn5+fnqCioaChn5+fn52ZmpucnZqZmJWWl5aVlZaTkpOUk5STkJCSk5GUkY+OkJGOlZabmJWYlJmXlJiRjJCPk5yTkoyFjIeDhndxZ2pkXFxRQT44NkJHYEJFR0A+Ozw7Ojg4NjU8ODo4MzQ6Njk9PTk5Ojs9Ozw6PD48Oj5AOj5APjw/QD8+PDg6Q0FEPz5CRD8+Q0VCPUJAPDw8OmeYk5KSk5OSk5SVlJWXl5aWlZaXmZmZmpqampqkoqCfn52bmpmYmJiXl5iZmJmcnZ2cqH1nZXN7enOJop+enp2dnp6enZ2enZ6enp2dnZ6cm5ybmpubm5ycm5iYmaCIW1+UmpmbnJyjj2RaTYGinp6dnZybm52bnJybnJ2dnZ2dnJ2dnp+fn52cnZ2dm5qbnJmZnJ2dnZ2dm5uanJ2dnJycnp2dnZybmZeVlZeXmJqam5ubnZ6foqOhoKGhnJucm5ubnZqcmZycn6CfnZiZmZmUkpKUl5SPj4+OkYyNiYuQi4mLjpGRj4mQmJiQkoyNi5KQj5iYoqiqpqWlrKOmoZqep6eyqKKVo6Cfl39wcWlsXFtbTEY8NzdHR1g+SE5URjk+Ojg5ODc1PTk4NzMzOTY6Pjw6Nzo8Ozo6Ojo8PDs/PjtAQD47PT5BPDw2N0A+QkA+QUY+PEFEQT1DQj49PDlmmJSTk5OTkpOUlZOVl5iYmJaXl5iZmZqampqaoqGfnp2cm5mYmJiYmJiYmZmZm5ybnKx/am16f3lxh6Genp2cnZ6enp6enp6dnp2dnZ6enJubnJubm5ubm5uZmJmfl11ddpeanJ2dooFkWU1/op6fnp2dnp6dnJydnJ2dnZ6fnZ2fn56goJ+enZ2dnZybnJ2em5qbm52enp6dm5uanJ2cnp2cnZqYl5SRjo+QkJGVmJSWlJiZmpudmJuYlY2Mjo6TkpKRj4mQjpGRjo+Ki42NjYiIi4+Lg42NkY+MkI2Qk5WVnJihoJySn6SipKmam5eanKOprb3Bwbq8uL26ucC8ubq3uru7tL2zwbV/bnVmZ1peWUxJRTo7TElTPFZSSUM6QTo7Ozc3NTo6OjgyNTY4Oz08OTk7Ozw5Nzo4Ojw6PT85PD8+PDw9QTs5NTg8O0A/QT9EPTxBQkA8REM9PT06YZOTkZCUlJOTk5OTlJeYlpeZmJmYmZqbmpqamp+gnp+fnJqZmpqampmYl5iZmZmZmZmphXB1e4B3b4mhnp6enp6fn56en56fn56dnp6fnp2dnJ2cm5ubm5ucmpiZmZpgYWCAlp2cnph0Y1VPgaKfn5+enZ6hoJ6dnp2enZ6fn56en6CenZ6enJydnZ2cm5qYnJuVmJqamJiYmJmSjJCXlKCXk4+MjYqKiImMiJORh5CPjYqKkJCLjoqMi4+IiImJjpGOjYaFiYaKhoWLiI+SkJCNkJKXlpKamJ2TlJ6kpqaqq7Gsr6+rpquqsbm5tbS0rqyvtMDIxcXBvsbDxMTDurW+t7a0s7C2tb6qcHRyXGZfXl1JRj8/RUtMVklcTEQ/PUI6Qzk5Nzc7OTk3MTc5ODo+ODg6PDw7OTc5Ojs9Oj4/OT5BPDs+PD46OTY5PDpBPkNBQT08QkBAPkJEPj8+OVyHhIOHi42KiYaFgYqMkZOVmJiHlZaWkpiampmenZ+gn52ampubm5ycm5iWmJiXl5ibqo56dXZ7f3mCoJ+fnp+goKCfn5+foKCfnp2dnp+enp2dnJqbm5ybm5uYmZmfaV5bZX+cnJ6Mal9QU4aem56dnZycoaGfnZ6dnZ2dnp2dnJiWlpaYlZWSlpmWk5GKjI+PjI+NkIuLj4+WiYiEi5GZjn2Fi42PjYyHioyQm4yRj4+Lio6TjIyNjIiSi4yFiYyPhouIh42KhYyEj4qXkJOYmpWbnKOqoaKknKKrsbe0ubWxtK2vsrKlp7O6sbq6vLa3tsDDw729vLa/urq8wbW4wL60r66mqa+3mm58Z1tjWl1fSEU+QUtJU1hZXkFGOTk9OkY/Pzo3Ozs7NjM5Nzo5Pjg6Ojw9OTk4Ozk7PDo+PTtAQDs8QjxAOjg0Nzw7QkBBQj4+O0NEREBDQz0+PjlhmZWLkYWNj5aSiHl9e3+Fi4OKgoqJhmuAeJCLlpqRnZ2UlJGTlpeampiWk42Sk5KQm5uIdndzcX1/cpGgnZubm5yenZ2eoKGgm5uWlpucmpubnJuYmZqYmJmbmpqXk3NoYVR2k5ech1xWUFeKko6SkY+Uk5KXm5mYm5ePjpCLjo2Ch4uLi4qLiI2RjIeHhoqIiZGKh4yEhYqNi4qNhI+UkIyDkJOUmZWQi5OTkZWRlpWOj5GMlI2Oj4qIj4ePhoeJiYmNiomJioWNh46JmJKUmpuXmKChp6Cko5qqqbO2sbWwqKqiqK6tn6qvsK21ubi8wr/BxLixtbCutrOwuL68ury+urOzp7G3wpB1gGNiXlpXUk1IRkVQSVlXX1tDUDpCQz1HRj84Nzo6NzU1OTc8OTw5ODo9Pjo6Nzs7Pjs7PTs9P0E7Pz48Pzo4NDM3OkFBQEI+PjpDREM/QUM7PT45Z6mlo6KZn6CippeUiI2CiIJ1h4iKiIp7e3Z7enmPeoiSfn18en6CkYWBgH1zfH99fISHfnRweHZzfHaBj4iIiYeIioyMkZicl4iOhIuNi4iNkZCPi5GPi4yPkJGRjpKanpJ9oKOWpJxuTE9jhoaCjYuGiYp/iYqGiJiRiIOIg4KFfIuLjIaJi4iKkIyIi42PjI+Wh4mLio6NjY2Wk5OdnJyalpycm56bmpuYnpeTkZWWkJKRi4+LlpSMjYqDi4SEiYyQkIqOio2LipGJjZOTk5SVk5KcmZ6Xn6CfpaKvsamupKSfmKStpqa4t6ysu729wsPAv7+vpa2wsLS3uLO0uLa0ta6stK+4tLaBeXpjZmBeVlFRQUVMT0lcXl9UR0dCS0xCREA9ODg7OTU3Nzk3Ozc9PDk9Pj05Ozg6O0A8Oj06PkJBOD88Oj84NjQyOTtCQD9CPj04QEI/PkBEO0A+N2CloJqXnaGaoaCPl5efl5WCjaCfo6GdmpKOjIxycXBvdnFucG1ucHZub29waHBxcHR+c3FycXd7cnl2d3Jyd3Z6e3l8fXt/iIGEi3+PkYaNi4yGiouLiYeEgYaDgISgnY5/a5allZ9/iX9fcn+AgpKQhoSEhY2DhIyPj4+IjY+Hi4iRkJWRjpCKk5eOj5WYp6SfnZWYlpaln5udq6aqt7W4srGnr6qnpqGfmp2WkpWVkYqPjImTjZuVjYuLhoaJjJWQkJCLmZKVlZSbkJiTlIyNkYyWl5WilZ6mqauno6OqsJucpp+mq6G0vb6zs7+5u7u6uby9rqiusa6wuLyztLGxqrCpqLGxsqild3J0X2hhYFRWUUlKSFZNXl5eVExKRVFKRUdDPTo5OTc0ODY5Mzg4PTo9PD47OTs4Ojs/PDw+OT9DPzg7Ojg8Nzc2Mzc5RT4/Qz89N0BAQT0/RDw+PThUj4yGh4eUjJWZl5yWmZaNlZyWlZydoKCdmpiWeHFubXJ4cXFsbnJwa3FvcG1yc3t1dnd5fnVxeHZ0d3tybn98gX15eH1/eYOGg4WCg5CLkIuLi46Pi4mJhYKCfn+Aoot8blJ1nIyMWXF9fH59fIaOjYuGjZSRi5CXj5SXkpihlp6WlZunpp+goKawq6GjpbW0sqqmqq+isba5vcK7ucO+vLi9uLWxrLCsppuSk5mfm5SPk5WOmp2doJqfn5edo6qsoZ+em62hp6qwqaampJiRkZWUo6SirKSss7Szs6i3tru4sLKvra2yt7a6srW6s7e5u7i8urayr6yxsbKztLOxsa2us7Gzs6yhl3Zxc19jXlJRVE1PSUdYT1pcZFROR1VPRURKRD44Ojg3NTg4ODU5Nzo6PTs/Ojg8OTk5PTs9PTpCPj84Ozo5Ojk4NjI1N0I+P0RAQDY+P0I/PEM8PT46Tn98go6MjJOTl5eaj5SWjZaRkZSXk5qanqGdnHJvcnFxcXFxcG5zcW91dHJxdneAdXd8eYV+d3t8eX1/fICJiYmDfXp/h4GIiYGAgIGGiIKGi4eIhYSIiIqFgIJ9mJp3WE9McZSGgktfcHF3iIWKjouNkJmclJSUoJqan6Ktsa6ppKWtr6ysrLWuvrmtrqm1sLexq7G2rK+9wsLAvrq8trKutraxtK66u7OurKepp6unoqmtoKmooq+wuLSxvLq6urK0ta+8tLezt7e7t7mtrbCprLW5sbeytLe2sLu7vLu6ury1vLi0wbWsqqqrtLG3uLm1trSzsKymrrCqq7Cxq6yusLKxtK6qo5N4dnJlZ1tMUlBFTUlTV1JlXmdUUExcUUhMUkNBOTk3OTU4ODY2Ozc5Ojs6Pjk4Ozo6Ojw8Pj08RD45Njs7ODg+OTUxNTZCRkREP0A3Pj5DPjpBP0BAO0t/gomXmJSdlpabmIuSlo6XkZGVl5SZl5+bmZx8dHV2dXl1c3RudnJzdHV2d319gH56gXyDfoJ/fYB/hIKFj52RiYF/go+Xjo6HgoCBiIuFfoqRi3+IjYyLi4eRjaONVC8wPXiHd3dARF1rbYSQiYmQj42PlJSYkJWcmp2eqK6ysLC1tLOtsrW4sLy1tbGqsKqztbS7t7SztrS1r7i4t62noqassLCvtre3vrW5vLOysa61u7C0r6+yu7axuMC9tLS0s7izvLq2tLrAvbm6ubq+ubm5vrWysa+yr6q1tLGzsbSzrri4tb+vpKaoo6ussa+zrq6wsKytq6qroqKmqKKnrauqpaynoqeYeHlxZmVZT09NSVJNV01PX15cTlVVYlFEVE07Pzk8ODk1ODc1Nzk1Ojo6OTs4Ojw8Oj08Pj4/P0I9ODY6Ojk6QDs1MjY2QUZDQz4/Nz49Q0I5P0I/PjtLjpGTmJmVmZGTopiTkpKLk4uOkI+Vl5ablZSbhoJ9enh2dHRzdH53end2gIKDhouMhISFioaQiYeRk5aRjZaalY+IjI+emJaVkpCTl5qamZCeoZ2Tl5uhmp2boqacZ0JbSDt4eWtnRTE4WmxzkI+LmJqPj4yUmpecnZugnaSstLm6vK+2tLi0tLK3uLmzq6+qqKy1srK1rrGrrqa3s7OxpaGotbCvrayrtbqyu7q6tLK3ur67ubG4sLmtqLK4u66ttLS3tbu2trm5vLe0r7G0t7a5s7e1pq2pq6ior6yprq2up6KxtLG0q6aop6Cjq66oqq6orLKwr6+pqKGeoaGjpqOgopqlo56ol3J3bmdiVUpUT09KRFBLX2JYWlFcVGBNSFJJQUA5Ojg2Njc3NTg5NDs5Ozk8Nzs+Ojg8PD0/QkBBPTs2OTk5Oj87NjM3OD5GQkJAQjk+PUBDPkBGQj44R5OWkZWTkpSQkZ+ZnZmVkI+Sko6Mk5aWko6RlZGSkIaBeXJzdXuBhI6HhZGTkpicnJiVkJWYo5yaoaeqqZ+clpeVnaKioZyZnpmlqKyvramnqqqpp6KlqKmrqamvj0pyonlBfHhkYlFTXUlgboqhoaSem5qkp6Spq66spaSoq6+xtK6qrK6zr6ystLO0ua6urayqrLKwsK2wqKqmsrS0uK6qtrqwr6qurLC3s7i0t7W0u7y4tbWxtauyrKiys7uvrbGytLa1sbG0s7OvrKuvs7a0sayutKqqpqWnrauoqKupqqifqbOwqqeppaOio7CtqaatpairrayppaSioKWipaOYmZyVnqKippdudWVnZFdPWUtLSktTVHBiWWRXX1tcUlpQTEM8ODk6Njk4NzQ3NzQ4Ojw6PDg6PTk3PDw7PkM/QT47OTo5Ojs+PTg0NThBREVEQkM5PjtAPkI/R0Q+N0KSm5SVlZaVj46Wl5qZlZGKk5SSjo+SkYqKiY2Ul5qTjYmCho6VkZSfmpuin5+jnqGhn5ijpKelpaapqa2rqaKmpKilpKGfnqOjra2srairrq6rq6ykoaKmqaeoo3hgwdalQ3yNgnVPbY52U2R/o6inoKKhrqyrqqetrqilpKmpqqmmo6iqqaekp66wr7Ovq7Crqq+yr7Czua+rqLCxrrCyubO0r62vtbCss7GurLW1tLSzs7CvrKyqrKusr7G0s7CwrrCwsKyqrauqq6alrrCysKumqbCvqaOkqaunqKaopquwq6mvqaaoqaalo6iwraqpqKKpo6WnpKGhoKKloZ2el5aYlJugpKmUbnNeamlfVlpOUk5RT1NlXGVjW11ZXFBZT0tAPDs5Ojc6ODczNTMzODo9OTo4OTo5Oj08PEBEPkA9OTo8PDw+Oz45NTo8QkFFQUNBOT47P0BEQERCQDdAkZ6YlJeZlpGHi5SSl5GIg4mLk4+OkI2Hh4SFlZmWmJeZlpqeop2ZnKKkoaCdn5qfoKGgpqGgoKCjo6KlqKmrramqpqOmpaCloKaop6aoqaepqaSnp5mdpKWjop1if73Arnigo5qVZUxheG1RdJWioqChn6GhqKCcn6GloaCmo6KfpKGspp6foaGkrKqnrKivq6e0sa6ur7WyrKqwq6mtrbWwrq6srreup6yqpKivsq+sq7Kvqqqpq6utqa6urrGxraqtqaunp6uoqauinaapqKilqKisqKilpKWop6iopqmsr6+oq6mhoqKlo6Opq6ymqKWjqKKhoKSdnZ+hoZ2bnZ+amZWcnKOqlG9zZm5yZF1dUFVPWE9eZWRsaGJiWlpSVE9NQTo9Ojo4Ozk1MTYzMjg4Ozk5OTk7OTk8Oz0/Qz5APTk7Ojs8QD0+PDk5PEFBRUFGQTo9Oz9BQUJBRUI4PYqWlJOYmpaPiISNjpGSjIiIiI+JiZCRjoqKiJubmZygpaKlnqKjoZqeoZyanZ6bnKOop6ugoKOYoJ2XnKGjo6WjoqKkrKilqaCepqmnq6mkoKKhoqehpq6mpp2eaoScuo+o0aKas6hYTKyTU2WPoJ6goJ6doKOZlpqYo6KipJ+ZnKGhoqCbmp6goaSgnaejqrGorqusqaSqqquorKalrKqws6+rq6mwq6appaWoq6ynpqevq6Wnq6upq6irqqqrrailqKOmpaesqayoopykoaOmo6qpqKano6SnqKanqKepqKupoaKoo5yepqWjqKino6WlpqmgpJ6inpeYnZ+doqKlnpiUlZ6go5d1d2t2eGJfXFVZUVVXW2Nfc19oX2NTUVlUSD48PTg7OTo4NTM3MzM0Nzo4OT05Ozo5PDxBQEM9PT44Ozw9PEA/Qj86ODo+P0NAREE6Oz49QD9DQ0VDOTyCmJmenZ2alZKKiZGRl5GQh4SJgoGNj4+Sj42cnZ+hpKmlqaeorK2moqKfmKSmo6Stsa6yp6asm56em5qjp6Cfo5+foq+rq6yoqKuvqaiqqKKgoaiqrbGyr6uiooZ3fn1yz8iwmqeva1WqsGNbh6WfpaKhnqCimJWem5+fpKGclZigoZ2enJudnZuZmZWen6Oonp2iqKGaoaOmoqSoqaqoq7CxqKWlp6eopKWpqaqnoqWmqKadnqWloqClpaOlpqCjpaOjpaelqamqpKekpqKmp6SrqaenpKGlqKynpqWlo6OopJWdo5+bnaCjqaeopqGjo6mooKiioJyVkZqfn6GmopuXkpCamqCVfHdvfXlmW1tgX1pcVVxoZG9jbWlpYl5QUEA/Ozo4OTg8OzYzNDMzMzc5OTs8OTs7OT49QkBAPTs9ODw9QD08PENBPjo4PT9EP0M+Ojk/PEI/P0FEQjk6gJ6kp6Gem5+gmY+ZnaCWloqGj4iEi4qTl5SRo6Wnqq6trLOys7S4t62pqqevtLKxqq6usbKusa2lq7OssbGpq6+rq6y2sLSwq7GysaOgo6qqp6+3t7S1trOtrq2PhoNukcy7lJOklnRUb3pzcH2WpqqnpKCfo5udoZqWnqScm5aZoqefoJ+joJuUlpmWl5qfoJmVnqGZmJ2dpZ2gpKeqqaiqraylqaSlqqeqqaqsp6SkpKOimZmhnpqaoaCfpaWYnqSmpKqooqelpaGqp6mnp6ejqKWmpaGkqKesoqekoaalpaOVl52Ym5mVo6elpaSfnZ2lo6Kqo5+amZiXnJyaoaGakJOTl5ibjX93cnZ4amJbX19cYllgZG5ta25hX2RgUE9BQDs7OTs4Ojk2MTQzNjQ3Nzc6PTo8Ozk9PUI/Pj89PDo/OTo7PD5CRUA9OTtAQT5DPDs5PzlAQEBAQ0M7OXuao6OcoJ2dop2Zn6KioJibmJaYkpSQm5qWl7S0rrW4s7S4tre0uLm3tbm4ub28uKqLnLK4vLS9urW7uru4s7q/uLe5u7G3r6iusq2inaCrsre7u7u5ucG4tLWgiHlkWJ+2vaanmoh3a3FveHl7foaOkpido6Wmq6WkmKGko52goaKooaOgpaGck5mYmJmco56cmpudl5uZlqWam5+hqKmpqKuvr66pqKirrKytq6irp6WjoJyfo6Ojn6Cipammmpyip6Spn6GjoqKgpaanpqSooJ+ipKGjoqiop6OloaGopqalo5mbmJuTj6GknqKfmJiVoJuhpaCfm5udnJuamZugmo2YmZiTkYaAdnh4eGNbUllUX19hbWh2a3FoaWliWlNMQDw6Ozg5Nzk3NTU2Mjg1Njc3Ojw7Ozs7QD4/QD0+Pjk6PDk2Nz47QkZCPDg7P0NDRDw+OT43PkFCP0ZDOzhwkpqblJ6bm52Vl52doqajopaXnpaXl6GblJi+t7G4uba3t7i7l5S2vbu9vcDFtaK7mKC3v7+6wcm0nbu2sra/xcGooLa0urGqrrSxsLK0tbfBxszPzszJvrOkkHNmUkSLlYaGhn14cW5nZmxpbHJycXJydX2NqcTEu6Knqqynq6mlpqCnoKGmoZOWmJ2foqSjnZ6coaChnZekmpmdoKaqqqqtrq2tsLGrrK2sqamrrqimpaalpqSkpqaeo6eppKGcoKKjpqCio5+jpJ2foqWgpJyboZ6fo6GhpaSlqaOkpaKkp6ehn52elpOcoJiZko+MjJeWn5uWnJqdnJqSlpSUmJOQmp2YiouHgIB8gnhhXllTYWlhZnRvdGl0ZGlkYltMSz46OTg5ODg5NzM0NTI1NDY2OTw8Oz08P0E/QEA9Pj44OTs4Njc/OUJFQzw7PD5DREM9QDs9Nz1DQ0BFQjw3Z4yRk4qalZiblZWYm6Knq6aVl5iQlZmhnpeXvrWztLu6ubi5woeYt6u4u8DCxbOjw6e4s72/tMTHvbS7uL62wMTErqCworW2tb2+wcTHw8XH2+Pj2su8r6SXiHRZWlFEaXhrbnRua2VlWVddWFxjamppZmFpirXBwLmpr7Gwr6yqoqajrJ+fpquXmqifpaWfoJydoKuwsKyiq5yYm6Cor7Kys6uorre1sq2tqaalqKulpaStqaShn6Cnnp6mqKmmnp+anqGlpqmcnaObl6KmmpuanZ+cmqGcmZ2eoKijn6GfnaWioKOioZSZmpmTj4qLhI2Qk5uPjpiVm5eYkJORkomNl5iYk4uKi32AgIVwYGJfXmtjYm54dXdvbVtiUlZcTUc7PDk3OTc5Ojc0NDQxNDM3Njg8Ozs8PEBAPUA/Pj8+Ojo5Ojc6Pz5FRUU8PT1AQkJCQUE7PDhAQ0NARD87NV+MjIaFlouUlZeYl5ifpqellpWVkZebn5ual7mxtrO5vLy5urWqsryxvsG0vMe5uLuuv6fGw7/KxsnIxcXJvMLHx7+xsKe8vL7FxMbJx8XGvs3S1cq5p52UhnJeUVRLRFtlXmNqZWFgaFlUWFNWWVpdWVt1mre8rLSyrbOtqa6vp6awr7Ktqq+zpKu1qaeopKCgnqmyuL61tbWqqaausre4t7apq7i8ubexr66noqOop6SfqKOfnqCZoZydoqSnp6GelJuaoKGlnqChnpajnZSQlpiboZqflpORlpSin5qenJudoZ6kn56VnJiPkpOPjImTkJefiZCWkZuUmJGRlZaDjJWXlpKLjIh8f4R/amZoYWtsZ252cnJ2cmdeYFxSSUU/Ojo6Nzg0ODw3NjU0MjMzNjU3PDo7PDs9QD4/QD48PTk5OTs6PDw+QkRFPj49QENDQkREOzo4QUJCQUNAOTJbk4iEjZGKi5GRlZCSmp2fnJOSmJSdnZqXmpW2sbm1tb6+tri1uLO8vMTEusPHwb+0s8XFxr/CzcfLzsvLx8HDxsfIysXExcO7vLzBxcHFxL/CwcfLyLeUdWVVUE9USD5ebF5fZWJgXWRhU1VXVlVVWHOcrbGqqKqtrKmlpZ6pr6uyu7q4u7e5t7O5uLOurLO0qrC1ub3Bur6+vL60urm4u7qysbS8u7q7s7Oyp6Smq6uioaCdmpudmpyXmpuenJygnZaclpuZnZ6io52UnJCNiY6OkZ6bnJWNh5KLmJiWmpybmJybnp6cmp6UjpiYmpSRmZeeoZWYmpKXlJWRlJqYk4+TnZaSi5F+enx/dWtsbmRvbWlxeG95amlhXWdhUUZEQTw5OTc2NDQ6ODQ2NTMzMjY1Nj05OTs7PT47Pj49Oz05OTs7Oz89QUNBQkFAPEBDQ0NFQjs4OUQ/P0BCPzsyV5uQkZCQh4WSjo2IjZCTlZGPjZSUm5STlpqRs7e4uLi+u7C1sri2tbbAw8G+w8LAvru+u7u8xMzEzNDLxsa/xcfLyNTLysjGv7u7vsS+xcjGxsTEw7m4w5thSURHS0Q9W2ViYmljYFtjX1dST1BQVoC0uqyupaSjqKSgoKWZqbSxvsG+urm6uLW0srG0tLO6wL7Av769u7u9vsDCt7a3tru7sru+ubi3u7a3tKyoqamrpqijnpOampyYkZKZl5GRmJqXnpiWk5acm5+dlJOJiX6GiIyWlJiZkYmVkZeWlZmbmpaYl5idnpyhmJWZmZyYl5ybn56jnJ6WmJeTl5yZmZyUlp2UlpOJdnl6e3dua2lodlpnc3hzemdnXmRbUlhJRj87Nzg4NzYxNjk3NDQzMzM2NDY7ODo8Oz08OD0+PDo7PDs9Ozs+PkRBQURCQEBBQkNDREM9OTlCQD8/QD89MkyWmpaSk4yKmJCKi4yOkpKKiIaNkJiKj5CUl7O7tba/vb2xtrjBvby0uL/Bsbi3vsHFvbu8wsbJv8jOyMHEwcfKysbKxczIzcbIxb/DwMvNz8rGxMTEwsTBrYNPRk1FO01bX2VrZV9bYFlZU05VgKOrubWyrKmjoa2prKetn6y0tL/Dvrm4vbawrausr7W0ur7Fv7u8urO5u7i5ubWtsLS9u7G/vLiytrmzubu0ra2orKyqqaeXnpualY2MmJSTi5WWlJyZl5WWmZKYn5mQiop+iYqKkY6Vl5OUn5mWkJSZmJmWmJOUm6GeoZiYmp2ZmZaenpibopqdnJuYmpuZlpeXlpyZlJyYfoB4eXZ2ZWZqamhea3BueXhjYmFgXlhXRkU4Ojg6OTc5NDQ5NzY2NTEyMzM0Ozo9Pzs9PTo6PTs8Pjo7Pz48QkBDQkJFQj0/Q0NDQ0RFQDk6QkFBQj5CQTVCkJeUlZmSj5qQjpKRjZSVi4qHjI2UiImPkpq2u7S8xsHEwr3BxcLAtLO9v6ywr7rDysPCvs3IxbfByMW/wcLIy8rCwsTJzM3Oz8zDx8bIycjIycfFycfIx8LGlmpYRz8/R15jYmpgWlhXVFZ3mrfAu7y6vKytpqm7urm3v7O1uLLBxrq3t8Gzsa2tqau1s7u2w7a2vbWxt762s7e4sLW2v7uwvbq0q7CxsbO8urOzrqutq6yxnaOjoJqQjpiXlZCclpaYlpWSnJmTm5+clpGUjpWQiYyQlZOUm56YmZKSnJedlJmSk5aZmJ2VnJ6do5yVnZ+TnKKcnKCfnaOemJSVl5ebmpmgkH99cXRxb2NhaHZoamp1bnlsXmRbVmBZTEhENjw5OTg4OjUzOjY2NDQxMzUyNTs6PD47Ozw9PDs8PTw7PD49P0E/RUFCQ0M+QEFARUVERUE7Nz5DQkI+Q0I4O4+akZaalJKUjZCUlI6VlI6Pi4yJk4uIkJObt8C6xsXEw8zCwcS9vrWvt7uvr7O6wMfFxMHMy8W2ucDCwsTHytHLwsPExsnFzNDNx8zJwsLHwsvLyMfMyc7Fxsa9qXJQSzBYU1VmYVNOUHGpyMjCxMfAvL60sLCwwr6+wcbAvre2w8K6urbAvrWyrKmvsri+tMC0tLi0t7nEua+8vrm+v8K/tbq2q6qsrq+wt768trSura2vtaSlqKimmpycnZyeopydmZOQkp2VmKCdmJiVmZmZl46LlH2QkJefmZmYk5GToI6Nko+VjpCUlaKdnKSem56elpyjoKGipKOkop6amZubnJ2enIN9cn14cGdga2p3bWlmdm90Y11jVVdVU01HOjc7OTk3Nzo3NDg3ODQ1MjM0MjU7Ojk+Oj08Pz04Oz05OTk9PEBBQEVCQUJBQT9AP0RFREVAPDk+QkNCQENBOjSAoZeUmZiVkImUk5aTiZGMlJGOiJaKi5CXnMXLw8O8wMPHwbm9vbu4tre3rrK3uLzAwsDCx8bHurzAwsTHyMbSycHDw7+/vsTLyMrLyby8yMfJzcjDyMnJxcXCw8LBvJE/T3Z+iVZMb6XL1MW2v7/Av7q7vbWzs8C/ub/DucC3u8G8uri7ub27srCvsKy5wri9ube1t7q9xb24xsjCwcLGwr28tamurrCwr7O6t7m2sK+tr7OppquprqannqSlo6OjoqCblZiekZecl5GRlZeZlZmRlJiSlYyYo5qcnp2FiZ+TfJKWlZKUlJennaCipJ+en56foaGkoqKjoaOinJ2fnqOhppl5enmAc3BmZWdkbGVia25vb19ZXVdWTlBKRjk5Ozk3Njc3NjM3ODk1NjEzNTI3PDs8QDs/PDw6ODo8OTk4Pj1APz9GP0JBQz89QT5ARENDQTw5PENBQ0RBQDozbKKdlZedlo+PmJiZmIiSjZGVkI+Vjo6TlpbKy7u5urnBu7q3vsG8vLu5sa61uri4u8S6vsC+vru8wMXBxsK+xsK5u8O6uLm8vsHHwca7ucjIw8XEwMPBwcDEwcK9vMWnd2uDkJdvqsnIx9HBr729uLm7u763tLC5vrO8vrG5tbi8tryztbm2uba5t7GtusG6vMG/t77Ev8bDw8fHwrvAwr/Cv7iys7O1tLGut7S3tbSxrK2xp6Wlp7CtqJ+nq6ajqKWmpqCgn5SYmZSRkZWUl5OYl5qhnZ6hnKGdoaWglpSbkZeXmJqTnpmZqaSlpKWdoqCanqCkoqOcoqGjoJ6cnp6ppaiVfXuDeG5mYWViYWNkZGpjZ2RbWlpdWVFPRT07OTo7Nzc5OTY0OTk6NTMxNDUyNzo7OkA9Pzw8OTc3Ozo5Ojw+QD8+RDxCQURAPz49QkRCQkI+OjlCP0FCPT44NVmfnJiTmZaRlZiYmpeQkZCQk5GTlJKSkpSUxce4tbq5wrm5vMPFwri7ubGxtry6tbnAu7u5tre0tLW/u72/ub66urTAuLW3sq66u7fAt7zKz8C6v8C8u8W9usDEv72+r3NlfZGKitHFv7/Jv7DBv7q3u765tbi0uLy0vbi1tLCzvLG3t7i/tr25vb65t7q+u7/Axb29y8PGw8TAw762ubq2v7i7v7y4trOyq7CwsrWzs66sq6emnqeurauiqKumpqqjp6iqo5+Ym52bmpicnJiXnJuhpZ2anqGhoKGmoJqbnJiboJ+dnJ+coKiho6SknaKfmqKgop+el6Shop+dmpieqKWhi3x5iH1xZGFjY2hrZ2dqZmpeVlZUWU9TTEY4PzY7Ojc3OTs2NTo7PDYzMTM0MTc7OTg/PT47PDs3Njk5ODo7PUA/PkA9PT9CPjxAQUNDQT9DPTk2PEBBQDw9ODdJlJibj5OUkZWYlZGWkpWRkJGUlZSTk5OYlcHCwLq8ub62uL7EwMKxvbqytLO4vLW3vMC8vbS0sbC1t7W7wbi+ub+8vLe0t6+ut7W5v7vB1Y24v7vDtbrHtrW4ury4ubaqpJiOfoTJv7+7wb65xr3Cv7zFuLa3tLi2tru7uLa0t7q1s7i8vbm/ucPAwLu5vLu+vcjEvcfEw7rAvb62sra4srm0usLCureysaysq62yr7Kur6ijpJ6rrKyqpKakpKiqoqemraihoaGmn6Oiop6bnKKfoKOdnJuhn6KgpKCem5eZn6GdnZ6eoaWkoaKioZ6ho5yinqCZnZijn52eoJqZoKKmnYR6g4F5cW1lZWdwamVsaFlZT0tLS1JKTEhEOT44PTs2Ojs5Njc8ODk4NjA0MzE3OTk7Pz0+Ojw6ODg5PDg6Ozs7PD1BPj09Q0E8P0NDREA/Pzw6Nz5CREE/QDg4P4mYmoyMkI+Tl5WMkpCakpGXmJaUlJKQmZTDvsbBwby8uLi6v7a8scK2tLyxtLa4s7q9v768sq2vrLGwt7y3u73BxLm3t7a1ubm6u7+8z8R3qMy9x7e5t622tLe5s7WxvcnElUp7yr6/vr28v8jDxcW+xri1srK9uLi4vrq6uby6urS3u7q5v7zEwL+5uri/ubvFxr3Fw8Kyur27sa+2uLO3s7q+wLm2rLGrrqmqqa2qqq6mpKWnrq2ppaOio6GkpaWmoqato6Klo5+ho6Gcmpyhn6CloaCenZygnaWgnpeVmZ2fn52gn6KmpaCknpybn6Ofn5mcmZ2epJyWnKOcnqGcppZ+f4d9a25xZ3FrdGZjbmBcVUhLS0RKQ0NHPzo7OD48Nzs7OTc4Ozc8PDYyNzUxNjk8PD08QTs8Ojs6OT45Ojs9PUA+RD89PkRAPz9BRkQ/Pzw9OTc/QUNCQEI5Ojl3nJiLh4uQkpOWjY+TmpOQnZiSkY2PjpiSvbfHvsO+vbu+vL22uri9ure9s7OwuLi1uby7wLeqraSusLi7sr2+u8S2tbi1t7++xLzCxNaudIC7yM/CwLiutLS7vbe5sb3Dyo5Ddc3Dwr++vbzHzMfHxMe9tbW2wb27u7/CusDCv7y2t729vcHBwL+8ube8wru3v8W7wr++tbe8vK+vt7awtLO6ubq7r6mtq62rrKaqoqeuqKWqra2vp6Sgn6ajnqKjqKOjq6Oiop6dm5ublJaZnJyfpZ6fnpmYnpejoJyXmZqZmqOjop6jo6egpqCbnaCjnp2WoJmcoKCblJegn6WcmKKQgYaBcmZsam91b3hkaGNcY1FLVUhFRUNHQzw7OTg9Ojc6PTo4OTs3PD01MzY1MDY4OTo8O0A9PDo+PDk+OTk9Pjs/PkM8Pz5APz4/P0ZEQEE/Pjo3P0BDQz9APTo4ZqGYj4uNlZKVlY6PlpmVl5uVjoyMjY+bk7m2wbS/vLm8w8C+wLq1trKywLmvsry8sLe7tru8qqqjsLm9vLK8vrzFuLG4ubzGycrCxsnSmXFyq9HRzMrEtbq/xMi+vrS/wMB5Um7LxsK+wby/w8zKx8XGwLm9vMS/v7/CyL3Hx8XFvLrEv7vBv7rAvLu7wMS9t7nCub69t7S2uLqur7WxsLCytre0t6yurKqsrKuoq6Gms6qlra+trKippaOkp5+io6Onoaeiop6cnZyamYyQlpeZnaKZnpuVkp2UoaCdmZ6fmJimpqKfoqKmoqeloqCko6GbnaCbnKKfl5WVnp6kmpafiYGDgXRwbW10bG1vYGNfYmJOSU0/RUA/REM7Ozo6Ozo4Ozw6OTw+Ojo+NDQ1NTE5OTo5PDtAPD89PTw4PDs6PDs7Pz5DPkI+QD89Pz9FRUJBQj87Nj9CRUQ9QUE6OlmfmJOSlZqVmpOQlpeclZuZlpSVkZKTnZm2uLaxuru6vsG5uca7trWypb69tLbBv66zvbS4wbGwsbS7xdDDur68xL63vMC/yc/HyMrKwoZyc6PMzMvNysbCw8vOwby4vbqycGNiu8jEwMC/xMDKycPDxMO5w769ub+8wsbCyc7Hxr66xr26v7m3wLm5vsDCvrW0vLi2u7CvsrK1r7Cvrqyus7CzsrirsbKxqrCrq6yrrLatqKyusqarrKmpoaWgpaakrKSmoaChnqGgnaCMlJeTm5+mmZ6emZOYnZ+gnp2eopuYp62ooqSgoKKqpqmhqKGlm6CgnZ2jn5SYmKKdp6Gfm4J7eoh7bW14fGBxZFxfYF9UST5DRUlCQz5DOz42OTo7Ozs7Ozs7PT05PTU2NjIxODo5Ozs6QTs/PDw+Nzs8Ozw9PTw9Pz5BQUE/P0FCQUVDQkRAPDY+Q0RFPkJEPztTmZuZmJ6dmqCalpyZn5KdlZ2boJWWlJqYur20sLu8wcTCv8XGura5sqO7vbS3xLuwtbq2ucS4tLy3u7ur2sO+tr7Avr66ppypsrbDv6V5dXiZxMfLyMHDwMDJysG/u7mxoX1za63IxcS/wMG/y8fDwMjAusG/w7O6usG+wMrOysS9tby8ub+5ubW1s7/Avre0s7S4rbeqr7CwsrGvq6+nr7ausrG5rra2uLSzsLGttrS6sa6srranrLKsraSjoaenqLKrqqWkp6elpaCml5ujn6SmraKeo6KanaWiop+foaWenrC0sKSlnp+kqaevp6mgq6CiopqipJ2anqGmp6+psZWCe32Bem5zeHRocF5cX11aUkZFRE1JQUQ9SDs7NTk7Ojw8Ojs7Oz0/Oj01NDUxMjc4ODs8O0I8Pz46OzY6PTo7Pj0/QD87QUFBPj4/QkBBQkJFPjo1OkFCST9AQkA7TJqdnZ6fnZienZmampySoJWbnp+blZGRl8W+urbDvMbCvr/Ixbe1uLe2ubu0r7e3srWzt7m8u7a7u8S5bazOvba5wLysfW5obm1ygZWYc3d8l72/xsC5wLy+xcS9vbixsJiQfYCbysLDvL2/v8PDv7/HvLzCtayutLS8vr/OzcvCt7K4t7e9ubuxtrLIwLu2tLGwt6yzqbCtrbS3r6uuqrG1r7Gvt7O6usC/tre2sru6wLWyrbO3rLC6r7KloqWrrK+5s7KosK+xr6qiqKGkraitrLOun6inpqWmq6Sknqaqo6ayuLOrpZyfp6anrquqpbClpaWbpKOYn6exrLW4sLKOhHl/fHdtdXtxb2pcYGFaVFFBRklHS0BFQ0k8PTY7OTk8Ozo6Ozo9Pzw9NTU2MTM2OTg8QT5AOz1AOzs5PD04Oj08QD46Oj49Pj09PkBCQkJBRD03NDU9REc9Q0I/PEWUnqCgoJyXmpiYlZmdmZ2fm52bnJaRj5LDwMK9wrzEvLy7xbu3s7e2tru7s6CWtayvsbS0tLa4ucDOtHaAs722tcKlh2laXmBNUltabnN3gJ+4uMK6s7u3u72/uru7rqSbmIeRfsDEw768v7u7uLbBwrXBuoCgsKyvvcC5z8rJw7GwtbS0vbq+urq7ysO7uravsL2xuK+ys7C3vbaur66wt7CsrLK2vbzEwrq9t7bAv8G3tbC2srGzurGxr6err6u2v7e1qbqztbmxp6uop7ausrG1uaisrK+qr7CqqKessayytry0saykqKuoqKusq6i2qaaonqadmKOuvLG7wbSmiYF7gnpzdnZ4bnJhX2ddW1VKPT8/R0c9R0NDOTo1Ozk5Pjw8OTo8Pj4+Pjg4MzE1Nzg5Pj9BPzs6Pz08Oz09OTs8OTs6Nzs+PT1DQT8/QUJEQkE8ODU4PUNGPUREPzw/iZ2en52Xl5WUk5aZnpubmpuYlJ2Uio6Owb7Dwr6+vrm2usCxtbGzt7fCtbOrrbOoqa61r620trnCyaiEeImgr7WdamVnVllgSUlNUFNsd4alsLe+ubK1sru5vLa5vrSVnKWWoXCuycTAvb+5s66yvLquwX5woqumrLq+uMvCv76sq7Cvs7q3ub67wMXBu7y3sLXEtb+0uLu0u8PCs7a2sbisqaWrsr23v7+7u7exvL28trGvq6uprbOvsLCrsLSpuMC2sqm0tbC3tq2spqu7s660uMKwsbG1sbK1saywsri4ubi+tLGzrqyxramvrqqyuK6trainoZ6ptr+4ur+wlol9gHxxdHd0d3JtYGRiXF5PSUI/PUlERk1EQDc3NTs6OT48PDk4PT47PT86ODMyNTc2OD8/Qj86OD4+PTw5PDk7Ozo8Ozs6PEA+QkI9QEE/QkI/PDs3OjxBRD5CQz8+QYqgm6GdlJiVlZKYmpyWm5WalY2bj4SIhru0vb+7vLm3s7y8rLOytLS2wLXAr7Kzqqqxt62pubO3v8WriHx2i6CZYFRDWFVHYWpWT0VKYI2grK+2urW0sqy8ubi1uMG9i5iwoqVypcvCv7m6ta6lrLOwqaRUgJahnqWttrTBtrWzpaeqqLC2s7K6tbu7u7W4trC1xLK+vL+8ubrFybq9vraxp6SeoamxrrW5trKxq7S2trGopp6gmaWmpKynq6y2qa+6sa2kpq2lq7GrrKmtuLawsrjBtrGxtbGvu7ayt7W1sry1urKwsbKutLKqrq2nuLWyta2uqqiosrq9wLa0qY6Ce393cHxwdnNvZF5oWV1eU09OQj9KQ0FLSkA2NjU7Nzg+Ojs4Nz4+PDs/OjkzMjc1NzU8PD48PDg+Pjw8OTk5Ozs7Pjs7OTw+P0E9PEJAPz9CQD47Njc6QERBQ0E/QUKJoJ2loJSWmJiVnqCcl5uYmpGMmYmDhoS1r7S7u7S1sLG2uq6wtLOvtbq1urC1s7KttrqvrbyzuLi/tZGCeIePb05KP2RZQk53gJRqTkFdgbC1s7WytK+su7q4trm/xnaDqp6aZKe/uLWysa2tn6Smp6WISYOPmZiZn6mtuKuqqp6kqaSrrq+nsKuvsbGtsa6ur7mwtLy+uLm4x8W8vLu4qaKcmJufp6assq6zqaapqq6popqXl5GcmpijnqKir6ekrKaompqemqGnp6anqa+2squ0trCqsK+xqbm2sbWxrqy3s7avrquuq7S1ra+rq7GtsbKoraurs7W3ur2wq6GLeoJ5cnZ0bXZqbF1ca1VeXFBOSERHTUJHTkc4NjY1OjU6Pjg7OTc8PTo7PTo5MjM2Nzc3Pjs9Pjo6Pz48PDw6Ojs5Oz47PTk8Pj1CPDtAP0A/QT8+OjU1OkBFQkRBQEJBiJ+ipqGYm56dmqWpmJudmpmUjJmHhoeGrq2uuLmxsqiur7iyq7CwqrK1ubm+tbK4tLm6trm7tbWzt7eVjIiEe1hGQU6HWUpKWHeNgWNBU6O5s7SysLGtsLm4tru3ur2QorKro3KrsKmrraujqKCdnp2kb0p7homIhY+bqK2joqOeq6+ho6mooaanpaqtp6ynqKesq6yyu7SztLm6trK2ramgmpaWm52fq6yqr6Oko6GpoJuTjo+QlJKSmZaanaSloJ+ep5iVkpSZnqSjoaWqrK2iqaqppKmtrqW0sa6xraqprq+wraWmqqSos66trKmmpqmrpqqnq7Ksr7Oxq6mWgX+Bd3J5aXV0b2VVYmRYXVJPTUlASVJETkM9ODg3NTo3PD46Ozw4OTw7Ozw7ODI0ODk3ODs7PDs4PD0+Oz08Ojk8Ojs9PTw6OkA9PDw7QD5CQEE/Pjk1ODs8RkFDRD9BQYijpqKjnqCfp6Coqpufm5yZmI6Xi42PjKqpqLGvsK2lp6ayr6mmq6CvsLu1vby4wMG+vLy8ua6sr7K8qpmZlWlOQFJ4cVBJSUtmm4FZRVKuu7Gss6+urK22trK0ta+ppp+am52epqieoKipn6GnlpuVp3pibmx7g36AiJuon56fobqkpZ2jo6CepaCkrKWmqKWio6OrrLOuqa6urqeqraisoZyamJmYm6qoq6ufpqKbo5yVkIyPkJCTkJaVlpifnp6amaaXk4+Slp2ioKWipqSnoKKko6Ghq6uksq2qrKyno6yuraufoaKkpK+srKmmo6KqpKqppKmrpqmsq6ahiHiDfHZ/emN4bW5dUWlVUE9HUE1NQ1BSQT87PjQ6OjU7Oj07Ojk9OTk8Ozw8OzkzNjk5Njo7Pz06ODs6Pjw6PDs5Oz07PDw9PjxAPT88ODtAQEE/Pz45NDk8N0FDQkQ9QEOOqqSjoqGinaqlpqimoZ6dmZ2PmJWTkJWnpKGmqKmlpKChp6uhnKKbp6u1sry9wMLCwL7AuLSnpKyovcKrpb5pRVKdglFXSUpfSVOOYGNigK61qrK0rqqrr7Cys62lnZGXk4+YoJ+ioJyjpJ+dqJSalaC1noN+jZGLg3p7jJmdnKeqkqqcn6ChnKGfo6innKehoKSfrKisrKCpq6agpKimrKOenp6al5qrpqqxo6WonqCclpOPj5KRmZCWlZiXn5icmZukmZeUlZqdoJ2nqKWgo6Kho5+doKmqpa6upqipoaKqrqqnoaCio6msq6eppqShqaKlqaalpKKmpKijkn58gHV2fW5sfGRpVlNkTkpIR09TTktOSDxFQD0yQDg1OTs+Ozk5Ozg6PDs7Ozk5NDg7ODc7Oz48Ojk8Oj07Ozw9OTw8PD49PUE+QEJAPTc6P0FCQEA/ODU1PDpAQ0BEPkFGlq6koqWeo6KpqKipqqWmnp2imJiZmZWbop6bnqOioKOgoZqgmJeXlqGorK62trq5ure3u66ooKGpoKrGv8uhUEFznnhPbktLYmV0c2BaXnCQsa+us7Wqpqyso5uZlI2RlZeYmJyfoqKcnaSemqSWlpXD2sO6tqGRjIyEc2t6mZ+xgZuroZ+gp5+dn6OmqJ6jpp+qnaqtqq6nqLClo6Smp6ymoqWim5mer6iusqumq6qgm5iYmJWTlpqTlZaalpuXmJihnpyclpuhm56ao6eln6GioqOdm6Gmp6aoraOppZ6kp6mkpaWhpaSsrKmmq6eioKSjpKenoaCgpaKmoIl8gH53eXxleXlhYlNWYUlJS0xTVUpTUU05P0E2Nz02NTs6PDw5Ozs4Ojw9Ojs4NjU3OjY5Pj0+PDk5PTk9PTw+PTs7PDo+PTw/Pz9APT03Oj5AQEA/Pzg2NT08PkFCRkBAR6CupKaroaOqrK6tp6ypqKCipp6bm56aoJyalZmfn5uen56WlJOXk5KcnqSorq2sq6uvqq+pnpeepZykx8ePV1NJZKRcZX5vcl1Qa2NbZF9da4+0sLC4rKahnJ2alJiamZCOkZWRjI6Nk5minJeimJaq4d3V1dG5oYqKi3VmYI68oXKqrqumorGjmqOmpqqioaqiqaSosquxsqu5qKarp6urqaysp6Ggo7GusrG0qrKuo5mcnZ6hmJubmpiZm5WWm5aZnKWhoJqjoZqdmZ+kop6gn6KmnZulpqWkpaijp6OepqOinqaloqWlqKykpq2noJ2eoJ6gpaGenqWgppmBe4F8dnZzaYJtZVxTW1pNUktPT1ZNVE1CNz5DNzg9NzY6PDw9Ojw5ODo7PDo7OTc2Oj01OTw7QD03ODs3PTs9PT06Ozw4Pj09QD5BPj4+ODg8P0BAPT43NTg9Pj1BQEZAQUihqqCrq6GkqquwramtqaelpaWkoKGfnqWXl5SYmZ6YnJ2blo+VmZKRnJihnaqip6Cep6Gln5ySm6KanqukjXpVaXJ2dXBjdnZYV2NgY2dZWFdmra6sr6efnqKglpCTm6CcmZeSk5+coaOanpuWnpmdvbWyvsPEwbGUgHhsaWGNtHGGt7i2sKe0rKKtraOvpaSmoamorrWzsr22vrCssa6tqaq0sbCoq6iztbizuK2ytKSgnaWgrKGhoqGgmpmWlp+bm5iloaCeo6Ggn5ucpaCfnZyhqJ+fp6meoaOkoKagnqehn5ymo5+ipaOooKmrpZ+dnZudmqainpyjnqeQgYJ/fHh2and1Xm1bUmFJUlZIRlZXS0NNSD1LSThGPDc3Oz49PDo8OTg6Ojs6PDk2Njo8Nzs+PT8+OTc9OT47PEA8OkA6OkA/O0A+QUA9PDk3Oj5APzo+NzU4PT0/QUBEQEJGnKueqamipamorqimqqWmp6aoqqGlpKOmkpOVmJacmpqcmpWTmZuNk5+ZqJ2un6eenKGdnpqZkpiem6KhoKSAboJwYGNYTFtTWk1MUFhSSE1NSJisqqmloJ+akpGUmJiWlpaMiIuOlJ2cnZ2elp2XrJdPWoOjt7y2on9uZWhpcoFfqrq9v7qttbSwt7CutKmmpKWsqbmztbvDvMPBt7u2q66xube8r7OwtcG8t76zs7WirKKpqbKpq6inqJqZnpqqp6CZp6Cfn6iopaWfnaqiop6bn6igpKetmZ+jnp6nnqCmnpycoqGbo6KhnZympaWkn6KZnJukn6CboJyjiYWFfnZybWl3bWhuXFhcQ1dOSkdNSENGTj0+TD40PDo2Oj0/PDs6Ojg4PDk6Ozs8NTQ6PDg5Pj4/Pjg4Pzk8Oz0/Oz1BPTo/PjxAPj8+Pz08Njs/QT07Pzg1ODw8QERCREFCQ5WqoKapo6mqqKmjoamgpqinrK6lqaWpqZSSl5mUmpqanJiYmZyamJmqoLGit6Swpp+enZ2XmJWZnpuco5+dimJXXmVgV01RRz4+P0NDPz5CUXipramqpqCen6KjnZ+em52blJOVlJ6emJSFnZmfmaxmQVJaeqOyt6iCaGFocXBggce+v8K/trq7wMO5vbusrqexrbHCtrjCxsDIysDKv7C5ub24wr64tLvGxL3DvLi0qrOtqrO0r7Ouqq+jnqyot7Kto7CmoaOwsa6wpKWvo6GgmqGmoaSqqpmdoJmaoqCmqKGcnqKemaSenpiYo6OhpJ6mmpuipJ6fm5ubnIeGgXx0cmtsdXJxaFdcUUZVSERKUEk/RUI0Rkg5Njw+Nzs8Pjw8Ojo4OTw4OTs4Ojo4Ozw3Oz49Pj02OEA5Ozs9QDw9QDk3PDw7Pj0+PUI+Pjc6QUA+PD45NTg9Oz1DQEFDQkGRqqGlqqelqqimn6KnnKasp7Gyq62jqayVkpWalJecoqGbnqCinJ+psqu7sr+rr6ylnqCgnJyYmp+gmp+flX1gXmVgUUdEPEM+RTw/OTZOfqqzp6SjoqCepaymn5idlZKanpmVjIqGiIZ4bIafoqSbbG97amGDpq6mf2ZoeYiMfrPHxMLHwcDFyM3QyMvDsre1vrK+xbu+zM3GzMzM0se+v8DDvsfHwrjEysnEwce/urS6u7W7t7C2squ7sq+8t8C7uqu4rauquLu1vK6uuKOmo56mpaKjqaaZm5+Zmp2nqqegoaGkmJSjlZSZkZydn6Sep5+en6KdmJmUmJSIhX56cmtkaW94a2VaXEZMTUVEVE1FQkU3Oj87NTQ5OTc5Pj87PDs7OD48Njo9OTw9OTw9Ojs9Pj4+NztBOj45PT45PT44Nzs6Ojs/Pz1CPj83OkFAPTw9ODY2PDo8QD9BQUE+kqugp66ooqulpKKipaGlqquwsq2upKmmlJWWmpaUm6SmnaGqp6KrrLy8v8PBsrK4p6Ghq6qhnJ6hoZ2bmn5zamFXTkU+SVl8b2JCPVyOrqygmZucnp6Zl5eYk42Pl5eUj42QjIKDgnZycGxvjaStjXR8opVlZpSemXlofJCdoqnBzcvGyMTFzNDS1c7Tyb3Av8O7xsXIxdHTzdPQ09PMysHGx8bKyM/AydHNx8bIxsK9xMG/v7+1vrOtv8DDw8fFyMSvv7myuL3EwsG7vLy1rqenrqigoqmlmpagmpmdqKupo6SknpePm4uQmYmVmJugn6OdnZeempOTi5WPhYF5dXNlYmdyb2deWlpET01DRlFJRENBNTU1ODlCPTY4OkE+Ozs+PDk+PTc6PTk6PDg8PDw7Pz8+PD0+Qzw7OkA9Ojs6Ojg4ODk7QT48QD8+OTtBQTs7Pjc4Njo7PkI+Q0FAPpOvn6ivpqiro6KloKampKuoq62qrqKqo5Kcl5ebmJuirJ2frqalsarFxszOzb+wwaikqKytqqCdo56bnZZrZl1USURAP0uGnqWahKCyraOenJ+amJeUk5SXkZCQjYiEhImHg4CBgYB5cXFuanaisYhyj7jFm2J7ioV0cYiUoaWluNHMzM3PxM3U1djR183Gx8nMw8XKz8rS19LX0tXW09TIzMfMzcrTzc7TzcbJysrCx8zHycnGv8Ozs8jFy8vLz8fKv76/vcHHxczMycnAw8CusLOonqKqo5qTnpyYnqaprKSlppaXipWFkZSHkpKSmZualpiQm5aQjIaRi4B7cnV2Z2NndmplVlhSRE5HQElRQz5CPToyMkE8RTw3ODxCPTs9Pzs7Pj05Oj48Oz44Ojk5Oj86Pj1APkA8Pjs+Ozk9PTw5Njo6Pj08PEA/Pjk6QEE6OT45Ojo6Oz4+PEE/QT6QrKKiqaanqKSfop2qqKOso6OnpqyiqZ+To5iWn56dpK6bn7CrqKyxyc3U18/Gu8esrbO3rK6jnqOinaGcY1NMSkRDP0NSrtG9sq+mnJycoKShnZqUlJWUin15cWxlYmhycHJ7hYqAdXBtcHJthZ+FaYS115dqbHZyeHeDkJubm7bU09LP0sPQ09bY1dXSy8nO0MvGzdLK0tXX2dbY09bYzdLKz9HMz9HN09DAycjLxMzNzM/PxsfItsDLwNLNzNDHysnAxMPIz83Q0c/NysjNuLe7qJ+lq6eemJ6jnp2qpa2pqKiSlYiQhIyRho2MiJOVmZCWjJiSj4aHjIR9eHN2cGNhZXJjXVJcSktHQUZJSj87QTg+NTU4Njs4Njo8QD07Pjw7OUA7OTo8Ozs8Nz09Ozo+Oz08Pjw/Ojo8Ozs5Oz89OTU7PD48PD0/Pz46O0BCOzk/OTg7PT0+PzxBQEQ8hqugnKegp6Oim6CbqaSlqaCfoaGmn6ifmKSimqmmoqarmqOwsamotdDU19rSx8bLtLXBxbG1qKGlpaCioltJQEFEQUZRdrKvppqUl5+cmqCgnpudmpWJd2lkYV9fX19eX19dYWx1c3BvbmtwbnOCiWZsp7VofGNfZXRweIiKiYqn1dPT0dHM0M3T19bT1dDP0tPRydPRyNDX19jS2NLX2dXWzM/Pyc3SzM7RwMfEycfPztHR0sjMzcDLzcbUz83PycXLx8fJzMvU1NHVz9LM08K5xbGlqLWuqJuoq6Wdsqiws6ysk4+TjoiKjoOPi4SQjpmNk4+Zj4+ChYx8enFzdG1hY2ltX1ZRYEpKQ0VDU04/PD40Mzo9NTI4NTU8PEA8Ozw6OTpAOjg7Oj46PTg+Ojo8QD08OTs9Pzk6Pz07PTw9PTo2PD0/QD08PT0+OjxAQjs5PDc0Oj48P0A9RkFEPYKknKClnqWlo5mcnaSeo6OfnZ+doJqnnpyhqZ+vraqqq52lrreoq7fX1NXZ2dHO0L+8zMm2vq6nqqiho6xnQzg9PkRYgqqon5eVl5manJ+dmJudk31xZWNiX19hX19hYF5gYF9gZW1wcG1qbW9zdYBoXoOYioNZTFpnYnF4cmpol9TM1dTRys/M09bS0dXNz9XV0cXR08rQ1NXWztPR2NjY18vIzsTKz83KzMDJwcnKzs/QzNDOzszP0MjM0NHLzsvDysjKzcvM0tPO1NLR0NDKvci5sK67ubWrtrCtqLits7+7sZqOoJSRjo2IjpCFkY2ZjJGRlY6RgIWJenZvcG9rYWRucGFYXFtJRkZETVlFO0A9MzM8PDg3ODU1Oz5APTk8PDg8Pjk8QDtAOj04Pzk4Oj88PTg7PkI6Oj08OkE9PTw6Nj09P0A9PDs9Pjg7QEE9Ojw4ODs+PD4+OkVCRT6Bn5mlp6Cgo6eam5+cl56eoZqdmpyappufpKefuLa1taykrK6+tLDA2NLX2tzWzs3Kw9LPwcGxqaytqaSyfEhGQjtWjaGblZOWm56enpyTlpeUiGteXl5hZGJgYGBgYGBgXmBfXlxibXJubXBwcnJ2c2dpcHFkWFBRV1hhYlxXS6fQydLSzsbOzM3Uy87SzMrW1tDM0NPLzNDR08rO0dXS1dbKv8rCxs3DyMrDzcTGycvLz8vOzdHO1MzHydDNycfLxsfCxsrMztHRx9DPzs7M0MXHwbi5vcPCvcO5srK+sLvDw7WqmKWhmJaRlZWSi5SNmpGUlI+PlYKJhnlxcmttaGBgcWhZWGhWTUdMSVFRQjtEPzs2ODo4Ojs1Nz09QTs6PD05PD05PT06Pjo8ODs9OTtAPD47Pj5BPDk9Pj1CPTs3NzY/PDw/PDw7PDw4O0FAPDo8OTs7Ozw9QTpFQUU+hJ6bqK2epKSqnJ6fmJKXm5+am56ZmaKVoamppcTCwb+7tbKxx8K4ytXW2drb2MzMz8jW1cTCta+0qKCtl3hsb3B3j5qNjJeVkJORkZWWlZCLfGViYmJgXV5hY2JgX19gYWFgX11bXWdxcW9wcW1pbXVuZXFzcnhwVk9OVHl3VW7BwMPOzsfFx83K0cfKzc3F0NLPzczUysfKzs/Hx8/Sy9DPxbrEv8bKvcPHyc7Fw8jAx87IxM3LzdDJxcXQycbCxsnFv8HIzczMz8PKzMnHzNDFxci7x8PJycLPwb28v7DByca5vaqwsqelnaKcmJCbkKOZl5mRlZiJj4J4b3Vka2BeZnFhW1dgR0lIR0lNVUc/Sj02NDM1NT09NDg9PT06Oz08OTo7OT89OTw7PDg6PDo6QD1APD09Pjw6Qz48Pz04ODk6QD4/Pjw7Ozs7ODo+Pzw7Ojc5PD49Oz49RkFDPYOgm6qupa6qq5qdoJeUjpedmpmgmpqcm6WysazJzcrIxL68uczMxtDV1dja29jQyc/P0dPIwre7u62ktn5ngoaiqpONjZaPhYODg4F9hIR+c19bXl1eYF5gY2RjX11cXl9gYF9bWlxha3JwbW1oZ2lqc19lfIaFaFdaTlaglmWbura7x8XBw8DDyMnIyMnHv8TLxcfKzMnEwcrJwcHLz8TLyL+5wbzGyL7Axs/LxMDDu8rHyLvJxsXKwb7Cy8bFxL7Gvr3BxMbMxsW8v8rDxcfSxcHJwMrKx8jG0MPDxsOuxMvHw8q3v7y6s6mspKWYn5iso6Gmm6Ogm5V8d3N1ZmpbYW5tWlxYUkRMR0NHRExERlM/NTQzMzVAPTM6PDw7OTw8PDg7PTtBPTo8Ojs3Oz05Oz07PTs6OD4+PEI+Oz88OTk7Pz07QD48Ozk5OTk6Oz06PDo2OTw+PDs+O0NCRD5/pZypsqm0rrCdnp6YnImUm5man6Kfmp2ovri8ys/RzMfCw8bNzs7M1c/V2djZz8vSzc3OyMG1w76ysLZtXnp8npGKkpaGeoCEhX91eHVycF9aW11gYGJjZGRlZGBbXF5dXl1fW1laXGFucW1pZmdraG5yW21wb1lLXV55oYltoLGurcC5ubu5uMDBwcO9vbi8vrjDycTGwr3GwLe7w8i/wcm7tru7xcO/vMLOw8a+vrXBvsS7vce8w7q1vcbEwsO3wLa2v7+8zcS9trrIu7++zMTCxsPGycfJxtDGwszIssfJw87MwMXDv7yyt7Cyp6ioubClrbCqrayUend4a2VoYGhvZFZeWUpGSkZIS0FFQkZKQTk6NjU4ODUzOzo7PDk8PDs5Ozk6QD46Ojw6Nzo7Nzo7Oz88OjxAPUA/PT8/Oz07O0A8Pj4+Ojk5ODk3ODo8PDw7OTo8Pjs7PjpAQEU+fqygrLWrt7SyoZ6fl5qNlJaan52mop2et8XCxMjO0srKysfNzc7RyNDG1dTV183Kz8XJxcfBusW9rK6nYGN2gZKLiIuEeH+Ghn99g3t0dGNcXF1eYGBiY2JiZGViXVxbXF5cXl1aW1xdZ3Jva2RjaWlrdndmYGhgRmZid4FvXpeqqKK0sbSzsrKzu7S7sLavs66xusG7wMS8v7q0srq+wLjHuLS8tsDCvbi9x8HDu7Wvs7W7v7TFuLu1rLm9vsC9sbu2sLe6s8a9t6+8v7W3tcW9vsPGwMTGxsfMxb/GxrvHy7/PycfDxsHDt8O9vba5vse/rLW7tbe2jnl0eGdnZWJrbl5WXmBGS0hISkdCREFFRj89OjU2NjYzMzs6Oz06Ozs6Oz44PEE9PDo7ODc5OTk7PDo+Ozk+Pz1APz5CQD1AOjo+Oz89PTk6Ojo4NTY7PT48PDo7OT49OT86PEBAPIi3pauzsby8sa2foJmUlJiXnqujr6qnpMXLzcjFyM3M0MvNyMnIysnKxNDN0s/NxcfBxcG/urjJt6uwmltnb4iOhoiJenh+hYZ2d4F8c2hdXV1dX2BfYGRhXmNlY19eXFteXF1eWltbXF9rb2xmY2ZoaGp4cFNlbmRdV2JdTFqZpqKYpqivq6mrqLKstK+xp62mq7K7ubXCubq5sKq0ubuzwbmvwLG9vLu1u8e5w7etqqiwssC2uL2wsaiys7W7vKuutqeutq68srCquLCuu667uLvAwb66w7/Gw8XAvMbBx8q4xcfFv8fDw7nExsK7xsnMy7O5wr27s4l0dndraWBibGlZV1dbQUxMTUpFQUM/RkE6Ojo5OTY4NTQ6Ojk7PD07Ojs+ODtAPD05Ojc5Pjk7PDo4Ozs6Pj45QT0/QD87Pjo7PDo9PDw4OTg5NzY4PDw9Ozw6Ojs+PTs/Ozs+QDyKwKuouLe5w62zqZ2ZlJaZoZymsLWxt6bFztLLw8XBxM/HzcHCxr/ExMPDysLJyr/AvMK6s7W1w66qsZNbaX6SiI6Pe3h9iYV5e4SAd25eXVxcXV9gX19kY2JkY2JgX11aW1paXVpaWlpcY21tZmRkZGZnbHlZUmhjRUtaUz5dmJ+ak5agpquipqGqqKuqr6KlnqmstLWwvLivt6+orbi0s7u3s7yvuLm1srzBssCupamjq7Gzs6i9qquoq6yutbSmqa6hpbCps6anqK6mqLessbO3uru7sry+vr7Ev7XBwMfIt76/xbfFw8C7v8TCvsTIzMq/v8TAwKmHc3RzamlcYW9kV1ZYUEhaU1NLRkZFPj9AOjc4OTc3NjQzNzo5OTo8Ozs8PDc7PTs7Ozw4OT44PTs8Njo9Oz89N0E+P0A/Ojw8Oj05Ojs6Nzc3ODg3OTw7PDs5Ozo8OTc5Pjw+P0E7jMKvrry3ucSwtrCbmZWcmKqpsLGztb2vxdDPzMPHubnLwsu+u8m2vcO+usq3wcPCtba8trGvtbytqauTY22Ig4eLgHp9f354dH58c3dlX11cXF5fYF5fY2NhYmBhX11dXFpYWVtbWFdZXF9lamRiY2FkZGhuckJGRURERlNJXpack5CKm56loaGepKSmpayfnJqjpayysLa2p7Crp6q0q7O5sLW1rba5srC6urG2pKCkoKaxqKypuaqlp6eop7OtoKenn5ylpqyfn6ekoaGxra2ssrWztLC1vLa7wcCyu77DwbG5ucKzwL3Atbi8vb68wsfEw8S/wMSghHlxbGJmYGtvYFVZX0hOaE9USEZLRjw9QD06Ozw4MjY1MzY5OTk7OTo6PDo3PD88PDs8ODg8OTw6Ozc4Ojo8OTg+Oj89OTg8Ojs+OTc3NzY3ODg2NjY7Ojo7OTo7PDg1OTw6Pj5AO43Itba9uLrBur22oJ6VnaCmurars7O7s8TPycvCxbi3x8DMv7jKt7vFuLPFuLO/wKy2vLKspq+0raGjkmlyhoWGgHx4dXNvbWppaXBpX2BdXFxcXl9fYWNiYGBgYF5cW1xcWFlYWFhWWFpdXmNiYGNjY2JlZW1mMzVCPTVHQ26Vmo+NhJecnaObnZ2ipKKmnZqhmp6qrqyxtKOoqamrrKS0uKy2r6yytK6zta+wqp+en6SisqWmqritoqamn6itq5mfoJ+ZnZ+lmpmjnJyesKmsqKqrrK2ws7mvuLm6sLa8u7qrs7K5s720t7KxtrW/tb3AvcPCu7u9l4R7c2xfZV5kZFhUV15JV11LUEdKSkdBPD8/QTs/PDA1NjM2Ojs5Ozg5OTw8Nz4/Oz07Ozg4PDg5ODw3ODo7Ozo7Pzo9Ozc4PDo9PDc0Nzc2NzU3NDY2Ozc5Ojs6ODo5ODo7OTo8PzuJyba4vru4wcHBtKSkmZqkpsCyr7astLfFz8jIwMa7u8PDz765yLi4v7eywrSxu7usurqxop+pq6eYnpBtfoWGf3hybW9ta2JeYmZmXV1eXV1dXF1fYGFiY2NiYV9cW1taWllYV1dXV1dYV1pdYWJjY2JiY2RlcVIxOjQvOEJeY4yWjYeVnJ2lnJibo6Who5uen5iYraytrrGgpKKtq6ehtbCxsayor7KnurOntqGin5yjoa2joqq2qqKjpp6mpqOWmZ2XmZqdoJqXnZydnK2hrKijpKatq7OzqrWwsquyubSvqq+ysrO3s66pra6yuLC6trq9v7ezsZSGenZmX2ZfW1lWU1pVS1tRTEpFSEtJQz0/QkJAQToyNDUyNDk5ODk7OTo9PDY9Pzs8Pjs3Ozs3Nzc+Njo+Ozo4Oj07PD06Ozw6PTs4Nzk3NDY1NTQ2Nzg1Ojo4Ojk5PDg3Ojg5PkA6gci9uL2/tr68v7KdpaOYpbHDtba9rbS4wszIxsDFtsHAx863wMO9s7m5sr+2sbm7rbK1r5+ao6qhlJqPeH+DhH94b3F0cWhmZGllY1xcW1tdXVxbXmBhXl9fYF5cW1pcWllYVldXVlhXWFdVV2BiY2FhYmBgZGdwUFE/LDErJDprpZWJkJqZnJqTnp6nopydppuamaqmrrCpm6Kit6mhoK6otaqmp62wpLewpLego5yZmaqmoZqtubCjoaScoqCgk5WhlJaWnJmYlpeclZ+pnqqkop6jqqqxrai0rKqnrbOwpauus7GvsK+vp6iosq6ytLC8tLq4rqOUgnp3ZV9hV1lYU1JUS01eTFBMR0hNTEU9QD49Qjw7NzY1MzQ5ODg5OTo5Pjo4Pj47PTw8Nz49Njc2PTc7PTs5Nzk7Ozw+OTk6Ozo4Njc2NTQ1MzEwNDU2Nzk6ODo5Ojo3Ojs5OT1AOnbAvLS5wrG+t72tnaenoqq7wL3Aua60uMHMx8XCw73FuMjMssHCwa68u7W7vLW5ubCwsaqcmqGplZGKi4CAfHdxaWxydHBoaGVkZmFcXFpZWlxcXF1eXVxbXF5cW1xZW1taWFZXV1ZXWFdXVlVaYmJhYGFfX2BiaHBoSjEiHCZKSX+Wi46VmpeckpycpKOhpKWdm56lnqqupZ+goranoaGiqLOipaelr6Wxrqu1n6GdlpWpoaKUrbGxn6Ojnp6YnJOMoJSRk5iYkpaYmJeep5unoqKapKWlq6SlsKelo6usraaprq+vq6iqqrOmpquvtLGuvLaxr6+fknt4c2ViXFtdWE5MUUhSYU1WUE9KTk9FQkQ/OT02OTo3NjQ1OTk7OTg4Nzs4OT0+Oz47PDY5Ojc7Njs3Ozs6ODU6Ozo7OzY8Ozg4NDc3NjMzMjEuLzI1NTY7Ojg7Nzg3Njw7Ojs7QTh4u7uxtb2wu7G3rJ6lpqy4u7zBxbqyubXEycnAwsbFx7bGxLPBv8Wrt7e9tr26u7WyrK2omZmfo4uKdImIfnZuY2FmaWhmZ2lmaWxgXVxbWlpaWlxdXFtcXl9cWllbWVlaW1dVWFdUVFZWUlRSVF9fXV5fXF1eX2FqaUc6NC86aXxwhIuMkJ2VnJOYnKKfqaOioqGioZuoqqOZnaOwqaGgnaSqnqiinqysqqmuraKiopWYopqckKupsJyfop+fl5mTip2RjZKUlpCYmJOcoaOcpaGilqCipKWbo6uloqSqpKutpa6yqaalp6a1pqqorbO1tLm6r6qsnoxzcXBgW1dWVlJHUU9IWlxPUkpUS1NMRUdKQzg7Oz08ODY2Nzo5Ozo5NzY5Nzc6Ozo9PDw3Ozw4PjU5ODo4ODY1OTo7PDk3Pzw5Njc4NDUyMTIxLi4xNDI2Ojg2OTg1OTg5ODk7OUA5e7W0rLS7srCrsa2dqKevubmzwMi6tcCvxcjMusHJzMi1ybyxvsPJrbG4wbW8wLy0taqsppaanJyJgXKIg3t0aWlpbGdqbG1ramxlXVxcW1tcWlhaXVtbXmBgXFhYWllYV1hXVFVWVVRVVVJTTlBZXFtbXFxcXVxfYmtLNUJCUn2Gd3uKi4uVlZ2Xl52kpaelqaWopaGXpKyilJikraifm5ian56umZyqs5+lpp+jo6GUlJuWlpKpqa2bnJ+hoJuUkIyZjYyRjZKNlpWQnaGgo52co5WboaOhmKKoo6Koq6CrsKSuuKWjpKOsraqoq6+0t7K9tbOrrpiFdXRpW1lZU1VSRlhMUVtYTVVPUExRUklPSkI9Pz9BPz03NTc5OTw8OTc3Ojc5Ojs8PT47Nzs7Oj02ODo7ODk3Njk4OTo2Oj05OTU3NzU3MTE0MS0rLzQzNDk4ODo6ODo6NzQ4PTg/OX6zraezt66oqK+um6morLe2rLzKu7a/rMzGxbjAzs/Hs8S7t7vCyLGtuL+3vL67s7amqaCWmJmXiHp0gHZ3bm1obW1tcGdnaWZkXVpbW1tbXFtZWltcXF5fX1xYWFlYV1hXVlVUU1VWVVVTU05PUVhZWVlcW1pbXV5mY1VYbG18gXqAgo2JkZOcm5abp6Wjq6mmrqOml52qnpSUo6elnJePjpmdrZaYp6qYn52UpaCekpGSkZOVqKqlmpiZnp6WjoyLk4aJjYOPi5KVkaCeoaSZlp+VmqGinpSbpaWnqaigsLCmsb2nn6OstKqup6+0sLm1wLGusKuRfnJ0Y1ZUVU5RSkdWUFJSTExYTktMT1NHTktBQ0ZFQz5CNzU4ODk7OTo3Ojo3PD06Oz8+Ojk7OTo/NzU5Ojk4NzY5NTg3Nzk7ODU1NzY2NjEzMjAtKi4xMDI4Nzc7OTk7ODk0ODs4QDh/tKymsbeqpaKxq52qp6mysKS2xrS5urPKxbm6wcvQyrG3uLy9wMOxsLG3rrS0u7O0o6OdnZiXlYSAdmtnbG5xbnFqb2tkZWdlXlpZWllaWlpaWlpaXFxdXFpYWFhZWVdYV1VVVFJTVVNWVFFNTk1SV1hZWFhXWltbYGpwanBld314g32Ngo6NkZaTmaSXnKekpKmcpZeeo5qRjZ6hmZaWhYSRmqOPlaKclZaVh6Kam5OMjoqQmqWnm5WVl5yRk4iUjouBjI2AkIuSkpKhmqCilpSZmJWippqNmaSnqaehoLSyqLO4oZ2jtqyqrqSysqa1u7SrrLGiinpzbl5OUVFNT0ROTk5QS0ZOTkpKTk5RSE1KQUhMSUhDPjk1ODg4OTo7Njk6Njg7OTk+PDg6Pjk7Pzg3ODk6ODg2ODU3Njg4OTc0NTc3ODIwMzAxKyktLzEyODc2Ojk5OTk4NDk4OEE3d7anpLawpKekqqWgqaaks6qissS1tbKzxsW3usPKzMazrbq9tLjAr66psJ6mrruvraCam56VlYh8hG5fX2ZycHVxaW5pZWdoal9YWFhYWFlZWVpaWVtbXFxZWFhXWVlYVVZSU1JQUVRRU1VRTk1LS1NXV1ZXV1dXWl1hZ19jXnJ4c3x0h32Hg46Ljpmdi5aZoZ+hl6SUn5qUjIaYmYtzjYJ9jZaWhpKakJOOjXuZj5yMgomAipigo56Qk5iWhY6ClH5+dIqOepCIk5CQnZuampKWkJ6Oo6OOiZqgoaSkm6K0r6ywrZ+YprimpbChsa6csbyqqa+pmYR4dGRWTVJQUE1DU05MUE1CUFFISU5TTklKSkVLTUdLSz44NDk4ODg7OzY5Ozc6PDk6Ojs3OT85PkA3OTo8ODk3NjQ0NDU4NzQzMTI0ODUvMDEwMikoLC0wMjc2NDc4OTo6NjY6ODdBN3i3oaO0qKalqKOlpaamprKnprTBuK+0sMnEuLnAzsa+s6y6waytxK2ooqaSnaa3raOgkZaXkpB+eH9mV1ZfZ2ZpZ2huY2lpZ2JcWFdYWFhZWVlZWVlaW1tbWVlZVldXV1NUUE5QTk9PUFNUUU1NSkdOU1NTVFRTVVlaXWhcXltsdW1pR1JrinyQgYeXkoeQjZ2Wm5WVlZKNlYh/k4lfO1dve4uTiYCMkoyPhoZyi4SWgXmBe4aUnZWDlo6Qj4OGfZN4cXCGjX2JgZCOkJeamZOLkIqdiJ+Yh4iWnpqhoJenrqmtqamelq2zoqWtma2rmKi0o6mto5N/dG5gW05TUldMRFRKUE1MRk5PSUVMUU1LUEpJTlBHSko9NzU5OTk5OTo3Ojs6Pj44Oj09Nzo/OD4/NTg5Ozc5Njc1MzMzNzYwLi0vMzQ0MTEwLy8oKSsrLTM4NTQ3Nzk8Ojc5Ozg2QTl5t6CiraGmpqqgpqmno6qwqKe0wrmwtbDHwrizvc+/ua+utcKnqsSqop2Yg5ScsaOamYeUkIuHfnN2XVBMUVVZWlddXmJnY19ZV1dXWFhYWVpZWFlYWVpaWllYWFZXV1VTUk5MS0hHYlxNTlFNS0hGSE5RUUxPUlRVWFlhY1pWaHBlSDs6e5CMiniCj4iAhomYi5WViZGGhJOFeIh/YEpRbneKkYN+hIyLhH9/bX5/k3d1dniEjZpwUY2IioZ8fnmUdmd3hoh+ioiVi46Rk5eMhIqIlYSbjYKFkpuWnp2UpKKoqaWknpuwqqGkpJGmqpaiqpyhpqeKd25mXlxIUVFTTUlVTVJJTEtPSUhGSk5NTVVLUVJQR0pEPTc2ODo4Ojs7ODo7OD4/OTk+PTg7PDY7OzQ3ODs3Nzc1MzQ0Njk2LzMvLjExNTIyMS8sJykrKiw0ODMzOTg5Ojk5Ojo6Oj85d7aboqedn6Guoaeopaeor6yqtby2uLezwbu2p7nIuLaoqLW2qrK8p56Vjn+JlKmWlYt/joSDfnhxb1hNS01OT0xNUVdbXFpYWlVVVlZWV1lZWFhZWFhZWVlaWFhWVldVU1BNSkVAQJtrc3NJTUtERENJTk9oWU9RU1NVWmhmXGRtXF1TTYqAj4JveYF8eIGJkH+QmYuPeoSNfnR/eHJudXB0jo6Ben6Kq4V6e2h2e45wcm14gYuNknh7gHuAd3NyknhodYWEhIV8lYqIio2LgH+Ei42AlIR8gY+YlJyWkZ+dqZ6goZ2gqaWfnZiNp6SSoKCWnp+kgXNpYl1dSldQUkhLWFJPSk1MUkpKSkxQSUxRTVJVTUZJQj03ODs5OT49Ojs8OThAPzo6Pjw3PT03OTk0Nzc4NTY3NTI1MTQ3Mi8yLiwuLzIwMC8tKygoKS4xMjcyMTk4Nzo4Nzc1Ojw7N3aumaOhmJ2ftKmvqqWtq7Cxqr20sru4trq0sZ+3urKqnZ2sqaiyr6KakY2UgY6cjpF/d4Z4fHZwb2pZS0hJSEdFSEhQVFRUV1ZTVVVVVVZXWFdYWFhYWFhYWVlXV1VWVVNQS0Y+OTNOPH6eTUhKREA9QURqlH5MTlFRU1ZeaG1paFlrg4+Ui4x2YnR7cnV7hY16gpiSf3CFjXp2em5rfq18dJCLf3qGkoB8f3RmdXyGbG9oc3yKjYeAbXpxfXFtdo9xaHGBfo5wRIuFgoOFf3d3eoyGfYx7dX2Oko+Yi5Kbm6OWmZ2bnZ6hnJaNi6Wbjp2XjpaYkHhvbmdjW1hYVVFKU1VUT1BOUFZLTktPT0pRT0lPUExGRD07Nzk7Ojo/PTk8Ojk5Pz87ODs9Nzw5OTk5MjY2ODU2NjMzNjExMjI0LiwsLS4uLTAtKyonJyouMTM2Mi84NzY5NjY1Mjc5OTV5ppegnpagprCsrqunqbCvsau7uKu7vrizrKebsKesm4+WnKWppaGYmo6EknmJj4uLdnF8bXVxam1qWEtGR0VBQENESExMTVFST1FTVFRUVVZWV1dYV1hZWVlZWVlWVlRTUUtENzhmNzA/qGlOSEM9OzpEioV6WUpOT1FUWF1hZ2NefJygvXxucl52c2p3dIWNd3qJhG5ripB3c3hpan+CcZaRjIF9lX9JkpluZ3d+gm1qZGx5hZCShmtzbHxucnyGaW1wf3ONiYWGe35/e3dwdHSGgnmBeXB8joyKk4OWlpiakJOWlpmWnZaMg4mfkouSjYaQl4Bwam9vb1lWWFRSUllPUlVUUlhVTU9ITUtNT0tDSU5HRkA6OTk7OTk6Pjw5PDs6Oj0+Ojg6PDk/ODY4NzI3NTY1NTQxNDMyLzAyNCorKiotListKigqKCcsLTEyNTAsNTU2NzQ4NUhBODk1d5mRm5ibn6Ssr6Ktqqi1r66ss7+rvMO/pqKalaSYno2Ei5ShoZiZkZOLc456gIaMhnVvdGxxbWVra1lOREZDQDw+PkFGRkdLS0tMT1JSUlRUVFRWVldXWFlaWVlaV1ZUU1BMRTFAmjMganNDmW87PDk1PICChl9JTU9PUlZaUVdYV51+W5NibHJgeWtpe3aHhXN/hYNya5ePcnJ7aWqdjkx5hZOJhI1mMXaHcmt9fYN0ZmV1f4SEhYBmaWx1a3CAfGhxcXxuk42Pe3R+fXFxb3Vtg393eXVqeYiCiImDlpKSkIuNkZSUjpeNgHmIl4iHioaAkIh4bGtwaGVYUltYWVlbTlBVVllYTklIRUpKSEdCQEdFQ0c9OTk4Ozk6OTw6OTs6OjpAPDk6PDk4Pjc4NzcxNTIzNDUzMzY0NTAzMS4qKispLCwrKykoKycpLCwyMjYsLDQ3NzU0NzhpTzg7NW2SiJqQmZakqK2esZ6nuq+rsrDCsbvDx5qWjpWZi46FeoSQmJWNkIyQh3GHgnSHjIZ6cHNxb3BkcGdfVEZJQz88Ozk6P0BBRENFR0lLT1FRUVFSU1RVVlZYWlpZWFZVVFNQS0U4MC9cYLNHOVhQOzk0NDGWuotITE1PT1FVS0FJUEhfqa2aanRxZ3hobX59gX53gYODd3CeknJ3gHJ0k4c1cJ2onY2goYSihXZwhnuGfHSMro2JgWhnYmpucm1wg3Vpb1h1cI6bkXZtf3t9bnJucIB7c3ZuYnWDf4aAhZCQioqJkYuRi4uOg3V4io6AfoOAfY58c3JxbWBcXV5cWllhX1JOW1pYV0xISUZJSD9DQUJIP0NEPTs6Nz07Ojs7OTo5OTs5Pzw4OD06ODs2NjY1MDEyMTI1MzQ3NDUzMS4vLCwrKSopKSoqKikoKikrLzNETTIxNjY2NDM8dlI3PTdikYGSiJWRnaSnnq+VpbSprrCuwbK7wcWWj4yUj4CIfG6BkJKJg4qHj4Z1goRslYiIfHV4eG14bndkal5JUEc+Pzc0NDg7Ojs9PkBCRUhMTExMTlBRU1RVVldYWlhWVVRTUExFPDUqnUtbQC1nSTk0Lz+Sg6muX0dMTU5QTDdDTVJSQ0h+bXh1dHB5aHKDhHh6gYB8iXt0n5d4fYWAhJmEmpxhhqqenIuDkI56d4h+iYiOdIuXj4R7XWRxdHp8d4ptaGpieW+FkIJ6b4F4dYV6cHR6eGtuaV12hn2HfIeGjn+KkpeDjYWMhn1xhH+EfXZ3e3yJeHF0dWdoYFtcXlNcZ15XUVRYW1VHSkpFTEc/RkBEQz5BQT07OTc8Ozs9PDo6OTk7Oz0+Nzk+OTk4NTY1NDI0NDAwNDY0NTU1NC0sKSsoJycnJigoKSkoKCsrKy8wMFVxPTIzMzMxRX5XND05XIx4in+TjJGcnZ6lkaCroLGor8Cyu8S6lo6Rk4d6hnZrf4uRg32Kg46MeIOBc6CEin19gX9wgX56aHdrUlhMQEUyMTEzNzY2ODg6PD5BRUZGR0lLTU9RUlNUVVdWVlZUU1BNRkA6Mj0gI5ZjjFs1MzExaT9Hb0lGSUtNT1FLSlRbV1BIYnuBdIJ0dm14i4d2eYWEe5OEdZ6XhoaNkZSljKypSIatr66KgYCUi4KLgoSSqYiBmJiKnHRtfIGGh36OaGdoeX9uhYeChXGEhkhsgHdyeXZobWtfdn2CiH+HhIt5lJybiYuIkX96dYp2fHhtb3d+gXV1c21cXl5cY2RYZ2VcVVBQV1lQRExLRk9JQ0ZDQ0FAQ0E9OTc4Ojo6Ozs6ODg4Ojo/PjY7Pjc1OTU3NzMzNDQyMzY2NTY3Nzg7REZMTU1MQzcrIiUnKykrKywvMDArbnUyMjQyMEyBXDU9PF6EdHx9iYWHkI6Vl5KWoJ2soKa4r7O9s5eNkouYi310cH6Jkn59jIOSlH2Gfoakh4h/goiFeIeJfnOEeF9jV0tCNjAuLzIzMTIzNjY4Oj0+P0JFR0hKTE5RU1RVVFRWVVNRT0dDPzgwLCOHWz8/OTQuXZZwc6NVRklLTE1PV2BXbFhaW2SEi36Ne358gIyOe4KFjX6XkoCen5aTmpmlrZKZu7GmusfDp4uMoaWOk4mBkXxxg56fkZ1/d4WFi5CHkGlocISBdIyHhIpyhoJ3iIB7doR8bXZ1Zn+UjoaIiIaHh6CqopaJjpd/eoGIeXlvZ2t4fnyAdWxlXltbXmpeYmdgWk9MTldSUUhQSkROR0NKRENARENBPDo4Nz08Ojw6ODg3Nzg6PT04PD02ODc1NjYyMzQ0NDU3Njg2NzxCQj88ODo+Q1FeZVxHMicmLCwtLS4xKD+LWy4zMTBPg180PztudXBmd4J6f4x/gZGOipqbpJ2hrKaqrrCXkZGEoZSEeHd/jJR8f5KGkpV/ioCSm46EgIGMioKJjYN/in9scGpdQkA0LS0vLy4vMDIyMzQ3Nzk7PT9CREhJTlFSVFJTU1RSUE9IRUI8ODcvOUM+PDw2My5sk5dNUEhKTEtKTVZfYXtlZGlvk5KGk4yNhomKlYSPjJqInZ2QoKijoqqTqLWhp8HCrceveLmUmnyNoZ6ZhJOFgo6hn5SZkYWKhY+akZZscHWKjIKVjI2Od4+EcW2FgYqWkYKFiHKIoJWGkYmNj5aktKibjJSig4eSg31/a2pqfIKDg3VjX2VgW2hsXmxsXldLSE5SUE5MTEZJUENETkZCQ0VGQz46OTY9PDo7Ojk4Nzc2Nzs6Nj06Nzg1NDU2MzQ0NTY2NjY4NTU2MzEwLiosLCkoKS46UGFcQCwoLSsrMCwncog3MjQwT4RiM0A8dW5nWW+Cb3WGcXaShn6XlpqUnp6cp6CplpOYnmdlpJp+hJKReYCSiJGSfYqEmJKQg4CAi4yJhpCHhImFeHh+Z01SPi8uLiwvLi0vMDAwMjEyNDY3Oz9DRU5PUlRQUFFTUU5QSUVEPjs8OkRGPz48ODUyPD9SNUhISExLTU5SXmuGeXB9eJaUkqCfnJWckp6RmZulm6WonaaqqKm0lqu+q7XHyLbI0M++m6Bwaaupn4STkoWcoJqbmaaSkYiVo5ubeHp+lJiToZOXl4GUnnt3lZKqsoiMlp58k52bjZGVmKOhpbWvnJCYp4eWj42AiGxzc32BfnNqYV5iYGJoZGBoZ1xSRUpLT05JSUxGR01DSExGRkNCR0VCOzg1PDw4OTk5NzU2NTg+NzU9ODQ3NDU3NTQ1MzY5NTg6NjE2ODYzLzAuLSosLy4tJyMqO1hiQigqLDEtKEuXXjA2M1GFZjJBQGlhXlBwdGBtfWF3jn17lI6Oip+Sl56Wm6qYnqpCRH2HiYeYjXiCjYuOjXyKho+QjoGCgImLioWShYOGiYGAh3deYlA0NjAtMi8sLjAvLi8uLjAwMTU+QUFNUVJTUVJTVVJOU0xFRUA8Pj1GR0BBQDg2NjI8OTtGSEdJSk1OUVlrgox0j4WZn6Gtt7OgqaippKaxqa60r6+rubCyvZuyw6u5ycu3w7+3paKws6ytqqOLlpiEpaago5eBppmNoqqopYiFlKShoaqgpKiPnLGLlaOmt7qboKKvkqKcoZ2PoqGrrquytKGUpKmImYiSiZV5en6GgWliaV1mY19lZF5nZ19bT0NJSFNORkhLRkpHRkZIQUtGREZGQjs4Nz08ODg6OTc0NjU4PDU0PDc2OjQ0NjQ0NzM5PDM4PDIwMjU1MS8xLi0qKi8sLSooKiYlNVhYLywwLCwwhIE4NzFQhWg1QUNbWFRMaGJXaW5YeoR2gZOFiIKbg5KRjJLayJ2Wc1aXiI+InI98hoyOiop6h4KHkY6DhIGLhYaIkoaChYmHiIeHcW5hQEU2NDwzLzExMC0sKy0wLi00P0NBTVVQUlNVVVZVTltQR0hEPD4+RkhDREE4Ozw1Qzs9RktJRkhRTlBXf4+bgaieqqOqusK/p7DCtKqxvrG2u7O9s8C1u7qiuMWotcjHtb24tKijtK2wsZuZkpqfiKevq6WUdp+kl6GssrSZlqquqK+2urK6rLC1orGssbW7trSttJ+mp6KmmaivrLG4t7immrWojKSOkJKfhniChXhbY2VXZ2NiZGFhZ2BbVEpERExUUEhJSURJR0VBQEBLREJNRz04Njc7PDk3Ojk4NjU1NTcxMTw4ODk1NDY2NDk3Pj0zODkxLjAxMjExMzAsKiwuLCsrKyooJyopRVowMCovK2iSTzYwUodqNkFGV1FKTFtZUWJiV3l1cYGUfYSGk3WFf4CMe7+7o7yCtJSTjZuPhIiPkomJeYaAjJOMh4SBjn+BiY+Gf4aIhoqHkHp4bl1XQEVOPDY6NDVBQjc2NC8vNkNIQlFbT1FVV1VcV1BfVUlLS0E/PkdLRkVEOz5AN0Q3P0JKSkVGVlNQXoygqqCurruvsrvIxbO5w7uysr+1tsCzva+2dLCzpbrEo6/GuLCzsbOnpLW2qrGgopebopKlsK6mraunpJihrbS7oqiyurW8v8y/xcW9vbPBt7q3vra6t7irq7Ckr6isva+8usHBq5i5p5StjpeXqYh+g35tWGRiWWxma2ZYXGNZVlNJR0ZMUEdDSElBSEQ+P0JCTEA/TUQ5OTY2OTo/Njo5OTY2MjQ2LzE5NTk5MzY0NjI3Oz0/NjoxLi81ODo5NjUwKigsLS0tLCwqKCgrKyhFUy8qMDBKj2s1MlCHbTY/RlJMQUxRVlNYVVp2anB+joOAjoRuenN4h2K5oZmjiZSUlpKUk42Pl5KHh3uGgY2VioCEgYp6fIqHhnyKgoGLg5V9d3p1ZVBcZEdFTDtRY2FbXlNGPztIUEVaY1FRWVhaZ1lUYF9MU1BFQT9JSkhFRUFARDxFNkI+SEdKTFNaVF2Rq7Oxt7PEuba5x8q5usC7trS6ubW8s7mxxWB0saSxmp6qvamlqKuqo6KytaGrqJ+Vlp+ZoK6lp6aln6SUo6extKiys722wr7TycnTxsPFzMLKw8C9vL67u7a0r7i2tsK5xb3Cx6+euKmhq42kp7WIgYF0YWNjX1hjYGpnU1hgVlJVSUVFTUpBPkdEPUtBPUJAPUc+O0hANzk2Mzc5PjQ4OTo1NzA0NS8yNjM4OTM3NDQyNj84QD5HS1JUU1FQT1FRUEpBOS8sLCwqKygoLC0rL1A+KC40OIB9PDJLiHE5PkNLRUBJTVBSS1FdZ2xrcI+NhY9zbHJyc4fVwLWZoI2VmJmRjpeRlpaOhod9hoOMlop+g4CCeHuLg4d7i3mBioKXfnN9emtmcHVZXlxQZWRiYGVkXVtYV1xNZG1VUm1tX25fWGdkVFlVSkRCS0tJRkhISEhCSTpEP0hLU1RVXFpbkra9tbuzwry3tsjJuLW6tbe4srazsq21tphkdaecrXBeoqycmKCim6SeqqWUn5+Qk46WmZion6agnpqZg6SeraWqsK24sL251NHP19DKzNLMz83Kxr++wcm8wLzAwMTExMm+x82yo7qwtK6aq7e7mIB8bV9iXlpgY1pkY1FbYFNQS0NBRUZFPEBGP0FIQj9DPTpFPj1KPzQ3NTM1Oz00Njg5NzcwMjIvMjQxNjk3NzU1NTVEM0VMTT41MS8wMDY6NDc3QElPSTstJioqKC0uLyxATSsvNTRtiUkwSIl0Pz5CREBDREZLT0RRW1loX2+WkpCUbmxvdHWHtKyhoZ+LmZyZjI2VkZqShoqKfoiGi5CLiHyBg3N7ioOFe4l0goqGlX9ze3lsbXV7aHJlaWxpZmpqaWBmaWlsWm1zlq2kvIiGZ1xvZ11aWlRIS05QSktQS1NRSUxBSkZKT19eYWZpYZe1xK62sLm6s6/CxbSuuLCwu6uysKWqt6uMtaedmqeaTZmdjI6flpGmmKWVipOTiZCJj5GRnZuhl5qVl4efmqebrK+osKi0tNTU1NbTzNDT1c3Sz8zEwcnQvcnJysnRxszNws/Rt6/DvMO5pLW5waKEcWVeX19aYllaZ1pRXVhPUEJCSEVCSDtAQz5BRz8/QTc7Qz5ASD00NjY1NTs6Njg3NjU0LzEwMTQ2Mjc4ODc1MzY3QzVCOD8tMC0xMzQ5PTk3LC4sMTtGSz0pLCguMDAwN0s/LTQ2VIhXMESHd0M7Qj5FQkFDSk0/VVlSZVZzkJCYgmdxb3l5g6GqnqaXjJqbl4uNlZGajn2Ji4WNiomKkId8hIJwf4eBhnuHcoOSi459cXh1bHF4fnF6bXhzbWmAcG1jaW1weGl3fH7LvsHfp21jeG5jW2JgSlBSVU5ZXk9dXE5QTlRQVFRcbm12gnGWrLarsqWvtKmru7+wqrSmpLimq62fq7SjjrCtmpeYjI+SkYSOm4GNppGciYOLhIqJhIuElJWYl5SbkZyXmZqfn6uspaiirK3P0tXSzszT1NTQ1NHOx8PU0cbN0tPT18zR0cTS1sXBzsfHwqi9t86efHFoYGVfWGJTX1tQUVRRT0g+QEZBQkU8QEE+REM+Pz86PT08PEpBNDU0NjU8ODg4NjY0NDEyLzAzNTI2NzY4NTMzOz08RT1AMTErLzI0OT41OTAxMDIyLTJETjMpLzMuMzI9TjIzOEN9XzJBhnREOj09ST5AQ0ZIPFVRTU5adYaFindsd3B9fn+hnp6hjIyYk5OLjJKPlYV5hZCQjYuJiJCGfoJ7cX6AgId6hHWFk5CIf292cmtzfXt3e3OCeHJrgHNyaW9xenlxer7Lmn2LsYR2coR2aGFrXUNaWltWZWNYZGpTWFxdYGNdY3d6fYuBmKmjpKCeoKelqq+4qqWzoqGtoaOtoaaxnoimmpOSkYmPjoiBk4lqlKKMmYSBhn6Rg4OTl62LlY2VmY6GkpGel6iwoqGhpaSpyc3PyMLM0dTS1NLO083G1tLM1NjW1tjU19XJ1NrNydfX0cqsw8LLjXVxZWJhWlZaVFxRS0dKSkpAOzo7REFEPEJDPkdCPkJCOjw5PDpHQjQ2NTQ0PDU2ODc1NDMyNTAvMjU0Njc0NTU0NDw+PUU/QTYyLy0xNjs9MDgxLzI1NC8tLTtSMDE3LzUzMkZEMjg+bmI1PYF0TTk5QEk8QUQ/QTtPTEZKWHCAdX1oc3hygomAnZWdlIWLlYmOiYiNho5/eIOTmIqMiIiLiH6CeHN7fYKHd396hpGVf4Nud3BtdX91eH10hXx5bYd2dG59doR0eHudtYw7QYrFpX6MfGllV0lDZmNlY2dqY213W15maGtuaG6AgoeRi5ydoJyQl5ieo6OlsaOksp+hpZ2gqJ+isZuFnpKRkY+KjIqGg4+Ef5ybjI2ChIV5lH+CqZWjjJGJl5KLfpiLm5Krs5ibnKicp77Dxrm2xs7S0dLQzNLLyNTO0NXa19fY1NnYzdjbzsnZ2tHVvsrLtXp5cGdfW1RXUlxXRkdKSUVFPTo3OkBAQjlHRD9EQ0FDQjs/Ozs3REM3NTY1NTswNjg5NDQzMzQxMDE0NTU4NzQ0NDQ5QD5EQkM8MzMuNkZUV09RSkFKRj8xKiguQlMzOTI1NC83Szc1PGBiQTxzdlY4N0FIOj9DPjw5UUVDSlRrbm5wYnBxdIaNfJeRnYt+h5KDiYaEiYGHfHiFl5aIjoKHhYd6hHlxenuDhXV5hY6NnHmLcHxvb3p/cXuAcYOHgW6OenV3fXyCdH58hoevc1ipwraNkYJwbWI9XmhycHFwbnh2gWVob3J1eHF6i4aNk5GalZ+Vh4uTm6CanameoKuboZqYnqSen6uZipqLkJGNhHyHh4OFi46fmZOIg4d+bJl6hJiGiJOMjZSMhnyciZSQrqqUlpifmaevtr2prb7HzMnJzMvQycPSytTX2NfY19Xb19Pa29XQ2trR1sjUy5Z8fmtrXVxRVVRhSUNGSUg+QT49Nzo9Pzs9Rzw/QUFBREE+Pzo4N0RCNzU1NDc5LzU1NjQzNTUzMjMyMzY0NzU1MzQ1OEVCRENFQjU2PEZOU01bbmZjbnNrYVY+LDRMRzg2NTQzNEJGND1XX2hMdXheODs/Rjw8Qjw5OUQ+Q0dSal5tZGJma3aAiHGRkJqAeoCNfoKCgYN+g3t8hJiNh4t+hYeAd4J5bnt7hoF0eZKejqB2jnWCc3WBfXOAhG+BkIJvkoR1fIGFenaGe4m3xaTBybiBlpuPd3BlTmZjgXqBd4aikIp4eXZ7g397hHZtk5aUlI6XkIKJjpaZlpWkm5eelZ2SkZainZmrlZCQiYyRgoyEiIiBhY+RnZuZiYWLgYWYeoiJn5eQiI2Ki4J9oYmRjLyhmJOYmZyppqaun6i2v8DBucjKzs7FzcnR1tXV2dXX29TW2drb19ra2djO28aIfXxqbGhiVllXV05MRU5DOz09PDg6Oz05PUA2PT8/PD49PTk4NjdDQTY0NTU9ODA2NjU1NDc3NDU2MTM4NTQ1NjQ1NTdISD1ESkU3OTI1O0g+Ozk6N0lQXVtTVVhLOVQ+Ozk1MzI3STg9TllNSHh4ZDU9PkM9PUA6Njo+PkBFUV9YZWFdW2h0enlsio2Sd3Z6int+gH5/fIR6foKRiYSFeYSHe3V9dG18fYZ+c36SnpGeg5F7hn54j354iopugpqAdJmGfoGJhHt+kHqPqY6Pw6G9i5yknX2JhH2JcouKfnOmmpyYk4V7jpCIhGhHcaCknYyLkJGEiIqQkpONnJmSk4+VjIuUnpyUoJSQjY2Pi36PjY2Kg4iSlpqenoiLlJGdkYGLf6WYiISNgoWEgaWGioy4mJ2RlZaip6Genp2kr7e6tazAxsrQyMfMz9PT0tjT1dfA19jZ29ja2tnZ19u4e3x7bmxoWmJdVFBPSURMQjw8Pjk5Ozo5OTs8Nj89Pjw9OTk7OzM3REA4Mzc4PjYwNjg4MzU3PDM3ODA0OTc2NzU1NTQ2RlA1RE5JODkzOEFLPTszQ0BJPDpEV048TVRITj85NjMzMz5DO1tYPjVZeXBaPDxBPD0+ODY4OT89Q1FTUlheVVhmbW1taYGOinFyeYp7en98f3uHenx7i4aCfXSDhXlzenNtgH6EfneFm6KbnZSSf4yIf5iHgJuSboiohXqhi3yRjYOIhJx9mpCKjKOioJCkr5+LkIuFi4GThldyrYufq5uPg5ibj4+OXIKikYKMn5OUi4aHi5KSi5OTk46LjomHlZqcj5SWkIqRk4aAi4iRjIqJnJaYoqKGkp2VoIqJiI2bkIOHjn+Dh4akhYyRs5idkpSXoaKfmpKcnqiyuK2mvcLHzcjGz83QzM/X0dHVrtbV2NrY2trX1dnZoHKAd2ppX2BaVVlZQ0FJQz8+Pjo0ODo7Nzo7OjM7Oz89Pjc7OjoxOkc9OjM3PUA1MDY3NzI1NT82NTs1NTg1ODo1NzczNUhSN0dPSzk5ND1FSkI+MUZDTEI6ODpHWEA1SFdJNjYyMjM6RUNlWD8mX3lpX3o+Pjk8Ozk4OjtAO0JRS0tTWVBUY2J6bWF+koNvbXeLeHl/eoF8hnx7d4aEf3NwhYJ6dXd2dISChH5/kqakn6Wil4qdkJSXi4qol3OKso2EqJKEmZOFmYyilZ+YkoibnqOSqbCfkJSQjY6IloxujbeFmsTIspuhpZucmJaQspFkpM3IlY6Gh4iPkoyMkZOIhImIhZWZmo+PlJKGk5aDf4+LmYeNkKqXlqKiiJielpqIjoaXl4mEjoyBf4ePpIiOk6ial5OXmaGZn5mUnZujs7Smo7zCvsfGxcnIycLL083N1KnS0dbW1tja1NLazoV1g2tnYWBgUUtWXEJCR0M7QT04Mzc7PDo5PTY0OTo8OjgyPzk5MjpJOj42N0JDMzI6OTYyNjQ+PTQ7PjY5NDk7NTc5NDRKUTxKUUs5QTdCR0lANjRKRUxGPjw4OEVUQTc+XDg2MjE0OjtFYFhBRmF0aExjWj41Ozo6NTs6PTpFTUZIUldTUkJlg0d1go58fG1+iHh6fnqBgYJ+dnaAgntsbot+eXx3eHyEhot+i6O0qKSrs6GWp6ClpJaVr6KDkLiVkrOajaGgjKSbr6KknZiQp5epma2wpJeUlZSQi5ialqDAjqPJuKuaoqWtmZGbnLKdhoWoopyXhYiIjZSLipKPhoCFhoiSmJSMipOShpOXhoSRkJxzkJiylZajoYicmZOPipCKlpqIipaNhn2MmJ+KkJCcmpmTmZiglKCdlZ+bobGto6S4v7TEx8S9w8O/xs7KydKnz8zT0dDW2NLP2Lx1fXlgY1djWFJJS09FQkNENT47NzY6Pzs8Nz00MjY2OTc3ND01OzU8TDw+OzxCQTc1PDs1Mjc3P0A2Pz83ODQ5ODc7PDU1T01EUFJMOEA9RUFHQTU6SUVORUQ6NkFAQlM+OURPMzIzNTc1PXZcPFJcdGlaTV1TPD04OTU2Nz06SkZER01cXFlKaGE7SISLenpthYZ5fIR4gIWBfXB4fH18b3KMen2Be3iGi4mGhJKovK2ps72wpa6zs6mjorCtipq1naO5pZWtpJeprbempKOfmamYqqSvsaqamZyUlZGYoJeau7utyqFptreqsJWYnqKrkpe9pF6psoKJiYyUhpB8jo18g4WNj5SUiIeSlouOlY2LjJeYkZuZtJaUqp2LnJSRjJCSi5iaiZGdj4uKlp+ijZWNl5mdk5yYnpShoJScnaauqKKks7irwsjEtrq9vMXIyMLQocbJzc3E19bQytOjc31sYF1WYlRRR0Q+PENBQTg/ODc0PkY8PDY8MzUzNTU0NTRCMzk6Qk06QTtBSEI7OkA8NzQ2PEI5P0BCODc0Ojo2Pjw0N1RLQ1VRSjc8OklBREA0QUpITkJBPzZEQTxKTkQvVD0yNTQ6RUpcWEpaUW1ncHBEaWBLSTY3NTc6PkpAQ0lQZkhhYGJwSkCLiX+AcoaHfIGJdYKKg35tfXx8fnB3h3eNgYd7jZCMhoyaq8PAsL3GvLO0wby0rKuztoyosq2uvaubu6Oorbm4q6amoqKko6qvsrGqnZyjmJuYmJ6ipqWTo7mvqL+8rK2yuaWjp32IhpytvbCCi4uKkIOPg5GOeYGGkIyNm4eHjZaMipSWk5CZlpunmrGZkKqcjpqPkY6VkI+Vlo6QoJCIlJujrJWWj5ScnpSgnZuYn6CVm5+np6SipLCzpsDGw7Cwu7bFxcO/zafHw8fDvNXQzMTKind2ZV9dYl5PTENMQEVHP0E/Qjw6ND5BPT01PTY+MzMzMjQxQTE3QEJOPkdAQ05DQT1DPTs4NkNDNUJJQjo4Nzg7NUI+NzlWS0RXT0Y4PTRLQEM+NEVKSE4+QUE2QkI/QlNFNThQMTQ1Ozw4O0Q+OUxqal07V1JkS2daVU83OUdFP0NGXGhGX2lnW11ck4yMiHuHi4aDjHWGkIqBb357gX5xfoF6lHqSlJSYkZOVqLTHycDCzMLDuce8uq+rubuXsra5ssGupcCkq7C8vKquq6Ojnqesr7WxqZugqpyinJafsLSnjKO6urXBu6uonLKkpKiUhI6pxMSkgouOh4iEhpWUjHmDjJCOkaCLi5OQjoeXn5eSmJSWpaCunIypnI6Wj5GQlJWNkJSRjqGThpefoLKflJuUoKGZpJ+aoJuglJmfp6Smp6SvraW/w8KuqLe1ycO+ts6yxL7Du7PRycjBtXh8cF9bX21UTklETExMSkBBPUJEPDVBRDs6Mz04QjMzMjI2M0ExNUlFTT5JQEhSQEg+Q0A7Pj1GQTVBVUA7OTk4PDdFPjg+VkpDV09HOD80TEBCOzVKS0NMP0I/PEJGPUFITDkrRzwzNjc0NjRBPzdPYU9hRS89PjZrbGpgQDpIPj9FQmdcTWVcZlRjapqNloqLiJKPhol5hpOQgXKAe4x/d4eCgY95jaGWqJqbmLq+ycjKwtLJy8LNvcGzrby/p7q/vbzEuKzBqa2zvL2qsKqkpaOsrrSut7Wgn66fpqKZo7S9qZyovMGjtravq5OwrKqsloaaqqelkYKMkqSViYB1iZF5hIyRkJ2fkY6Sio6Lk6KXlpqUk6GeqZ6QpJmMj46PlZaIfI6VkpGimpSgopy1ppCgl6Wko6WfnqaYnpWXnKWjqKiisq2ou8DEr6Wzt8zAuq7Ds7u9wbmtwsLBv5pxfGRbWl9eTE1OS0dFQ0hBQUFESzo0REg6OzQ8N0YuMTIzNTJBMjZTSE48SkJKUUVLQ0RFOkVMQjw3RVY9Oz04OT88ST86RVVJQVdRRjdBOks6Qjc5Sk1CSUBDPjxERzxCQ089MjBIMzY2MTcwPUI6PWpqSks1UVMzU3BwZE47RD1ARj5sSV9YYVpkZViej52Ol46ekomKf4ifkoR4hX+Ufn+QiImQgJahmq2npJjDvsnEyMbTzc7Ny7zCt7C6vbS9y7vEwra2vK20v7m8rq+ooamotq6uqbK3mp6soqiinau3t6qlr77Esb25s6eqtLOtrZaVpa2ooJGOkrHFp5WOfJGVfIaQmI+pmJeSko6SlJKknJKcmJOgoaGbmJ6XiouOjp2IWo+Wl5KWpJlmmaOes6WWopasraynnJ+ml5iWmJWho6imn7Wrqbq7w7SmtLXLwbiqtqyzu7iuqLi6vLeEcHFdW1ZXUEdLVE5LP0FHRERIRkY4NUZNOz43PkFLLjMyMDI1QjU1UFdOPExGS1JMT0dHST5JUT86OElTOzs/Nzk+RExCQEhTS0BXUEY6QT9HNkE3O0hNQ0U7Qz00RkU6QkFCRzkvOkEzNjAzPkdEOTQ9dGRNRztFKzpmfGhWPD5AQkZCc0ZpSVJmZE1GppSclqGXqJaMkIOHpZKIgYeCm4ODlZCQk46aop+vvq6hx77GxcjHzs7P0sq+u7axu7u8v8+2xL63ubezsrWzuLOsp5yrrLmrqaiwsJijrqWopKW1wbCrrbS+w7nAubOnuLS3sq+VpK2wr6WLk5SgjXPBmX2WmYSOlpmLsJWZmZSRkZmYpKKUnpqVmaicmqGfmImLjpScX0qWnJqUmaSXVJawn6+cn6WVr6+tppuhppSTmZiOnZ+moZm0qaqzvLy7q7Cyx8C4pqyrrbGxo6GysrSlc3JoX11RUkxGUVFQUTtISkhGR0FDPTlLVD9BOj1FTS83NTM0OkI0NE5XTjxKS09VTlFKUEhISk9CPD5NUjs+PTg6PENSPkRIUklCV05JQENBRjM+NThKS0NBPUM7NUVBOkE/PkhANSpCNTIsPmNdZzozNXRkZUBSNyYjM31oWDw6QkNAPVJFV1N0YlZGSKuXmZ+hqK6YkJeHiqeWjYiShZ+HhJ2Xjp2gmqOktcm1qce8xMTJy8nIzM7Hvrqzr7q4wMHNtci7wbm2urKvr7O0p6Scq7S1q6qmrqyapK2mpamsur+oq7e3vsHAvreyssOwt72so661rbqmiJuXpZt1vp+EmZ2Okpiai66WoJualpSanp+onaafmZmpmaCmnZaPjJCcgm11kqKalZyin5CusqKrlamqmKqvpqWhpaqSkpmciZWcop6WsKepqrq3vrOyrr65tqCjp6ilppycrampjWZpY2JUTU1HSU9KVUw9TERNSUpAQ0Q8UVU8QUFCRE8xOD03Nz9CNzVVWE4/SE5RWFJQUVRKUUpKRUFFTVE/Pz04PTtHUjxFRFFCR1lNS0FIREU6OjM5S0lCPkNDOjlDPjxAPjs7RzctMj4tMYJoTnpcLzBraGA8PUJCODZ6Zlc8Oj0uLlNhTVZIfmVeSEaslJyhn7uumJSei5Oqm5GRk4iqjYeinoyjrZSjpLbHvbTBu8LCyMnFws7Iwr25sq+5tcDDyrbGssG8tbusqa2tsaOjmaq1u6aqp6yqnaivqKSrqr67qK29tLe+x7y2tbjAsL2/s6m1t6y/pY+il5Chn7yeiZqgmJadnY62nqibpaKam6CZp6SxoJqdpZynqZyXk46Tm4qWiYykoZScop+gtbClppSxq5qrrZ+fpaSqkpaVoISQnp+clqmloaGztLu2rai1srKenKOlmpeVmaqhnnhkX2FgTElGSE5RSU5FRkZCUUpIQERHQVZTREg8QUdRMTtCNzpCRjc5XVlLQUxQVFVTTVdSTlVKREBKSk5POUM/NT08TlFDPz9QP0VaTUpBS0RHQDUzPUlHPz1FQTk3QTs8QDw8M0A8Lyc7KkiRQjpTSjAsW29XNzE8Kh1CgGRUNDktMTpoXUZEQ5xwYkdEqJeknp/DrJuXpJeZqJuVmpqOqpaVqKaVrayZoqu3xcK8v7jBwsDIxL/Nxru+ubKwubS+w8i2wLC8trq3p6SrrK2hoZurq8Sipaispp6rr62iqqi+uKatvrC3t8e3tLi4vrG+wLa0srWvvqOWo5WSmpOtn5ChoaSiop6QvqSonairnJygmqWfvKKXo56hqKqgnJWNlZ6TnoeOhI2TnqSgnbaspp2Xs6easKignKufoo2alZ+EjqGanJKlpZqXq7G2sqqlqq2snJigoJKPkJapn5RpZlxiXlBKSEtPTEhFRElAPU9IQDtGSUhbUlBLPUhOVTRCRjg+SEc1Q2JbS0NOUlVXVlFYVFJVSEA4UVFQTTpHQDRDSFFTSUM7Qz5HVktDQE8+SzwwNjtHRj47RkE1Nj85Oj85OzE1RDAtLTBNdlw0S1o1LE1uVzwtPSkeI3piUTVDS1E5b1JGPEt4ZmNYTqKbo5uexaugnqudnK2fkaKelqSfpqqrl7axo6qztsXDvcC2v8G8ycK/ysi2uLW0sbS0t8LGt7+xubW6tqCnrKusnp+gpaTBpaGqrqCkqa2woqaovbWlsby3trbDsrK3ur6yw8C4uK20tLWjnaSUkZOgrJ+YoZ2oqKqimsKsqJ2rrZqanZiln72hnKSXq6urpaCZjZqgkp6Ijlh/lp+moaC5qqeUmbejn7OioZywmKGPmpWego+gl5aOoqOVkKWusqypoqKlpJWVnJiLj5KTpJ+JY2dcZWFNSktLT0ZFQUdLPj1JQTk5SkpOXVFRST1MVl05Rkk9RE1JOEhjXEtDTFBTWVlWV09aXklBPVdRSUs/SEA1SE1YU0hBOkBBRFBIPz5RPks3MDk5RkU7OEc/LjY+Nzg+NzcvMT85MSUxUVVtW0pPMTA9Z1dEMTc9LSt3YVM2U1prV3NIRTY9dWVcTFCeoKCYnsOnpKKzoJuxp5Kqo5+jnq2prJ27samstbHIxMHDs8LDvcfEvcTKvbCxtq6xtbDAxbW6sbG6tq2aqbCqqpufpqGnwq2crbGcqaKusaqkqL23prW7va+3xK2zs8K/ssazurertLatqqKmlZWToquhn5+Zp6qurq+7saWfqamZmJeSoqO3oKGjka6uq6SlnpGhnpSdjpCNlJ2ao5+otaenjZm1nKOvm6CcsJGhlZiVm4CSopaPjqChk4umrLClp6KdoJ6SkpqThYuSjZyfgGRoXWhmS0pMS1NBQ0BJRzs7Rj44OU5NVV9SU0o+T15ePUhQQk1MSThOZF1MRUxSVFlbU1VPXGJIQT9aUUFIQUtCN0ZFTEtOPjtCSEROQj07TkBBMy85N0NCOTdGOys2PDQ2PDM1LS80QDErJ1Z0U2VPPzEwNGJbTTIzPjA8d11eP1tVX2dyQDg8SJZ3ZUE0n6SemqDCp6OpsaCjtKmVsaumoqSyrK2pu7KtsLW0x7/Ew7W/xL7KxbbAycK1rLWpsLmswMS0uK+ttrqlmauyrKuYoaeYrbu0nKiwm6yfrrSyp6q6sqa4s7iyucGqt7LDvbTFp76urbe1qaesoZaWkaWjoaGXl6Sut62xtLafnqikmZOUk6OgtqKkpZWtsbGlqKShnZmZmpWYqKCfmaKer7Oipo2Yr5qlrJibn6eTnpCVmZqGlqCVjJCdnpOLqamroaehmp6WjY+ZkIKGlYmVn3pla15sa05RTk5UPUNBTkM7Okk/NzdRTl1fUlZRQldgXUJKU0hWS0g6VGRdTkZPTltXW1JQUVhdR0FCW1BCRz5OQzlIR0hOUD8/Q0lCTEI8MklBOTQxNzdCPjs3RTcrNjkxNDgwMi0vLjw2LSNCcWdzazIzLzFcY1ozMzkwNnBbYkgwNUpxalZDV0aMeWZDO6SknKClv6aorq6gqbWqnbevq6OqtLawsLi3sLe4uMW9w8e9vMPCyMG6wcbBuqq2pa27rcHDuLiqrbK8o5WtsK6zl6aokaq5qqGnsJ2qoK+0s6qqtrWsuquzsrq3rLiwwbq9v6bDqrC2rqmrq6admJiqoKGgkZegsK6zqrC4mZupn5mWkZemoLaopaKir7Czq7Gnq5+an5+bnqWdoZido7SwnJ+RlKaaoamclqSimJqMlpmUlpedlImRm5mUjqmpp5+jnJmbk4ePmYt+jZeGj5psaW5ibm5YUVFaVEFDRFVAOztIQDc6WFBkXlFXV0VZX15OTFNPX0xKPlpkXk5JUU5bVVlQS1NXWkk/RFhQREY+Tj89SUdHUVBCPUNGQk0/OjJEPzc3NTQ3Pz05NUU0Kzc1LzI1MS4tLiwxPionKz1ccD0+MS4xZVtkQDE3NDdnWWFGKEA4bX1oXFY6iXtjQz2on5yhqbygqq+qorC3qaW0squhrbW9r7O4vLu9t7fBwr/Jw7nEw8HAucW9wbivtqirt7K8v7+0qq+yuJ+Xq62prpipqY6nu5+lrbOfq6KxsLOsqrWztbusr7G1rLC1ssC6xbarvK+xt6ytqqOxpZ6lqJ6jlo+Yn7Kpsqmpspmdp5ualIyfpqS0rqeirKytsKeyq7GpopueqKSelaGZnKi2qZiakpKfmZ+hoJKuoZuaiJeZjJ2anZSLj5eXmpempqOgnpeWlpSAkJWEe4+Tg4yXZ21yaHFzYEdZZlZEQ01YRFo5SEI2Pl1RaFxPWl1HW15eT01TWGRKS0NcY2BQTE1OWFdYUEpWVldMPUVVSkVEQU0/QUZISFFQQTtGREZLPTg3Qj02ODcxOT48NjVEMCs4MC8wNS8qLC8tKj0sKyUyKyo1SzEuJ19fYVYxNTE9YFZfOClDM1lVXGdLNYx6ZkxApZmfpKu2o6yopK6ttamvs7mmp7C3xrext7/Bwra1usW+zMW5w8G6wLrFuMG6s7Ssqrq4u7q+tauvsbeYmKirq6ycrquPq72dq66xo6qfsa2zrq61sbm3qq2vsqi2r7O6vMmzqrW1sbSwr6ehs5+aqKygpZWWmpmxoq2gpa+WoqSZmZKMoqWnsqmhprGrqbSlrq+zrqOZnq2nm5eempmsuKKYk5GPmJyhmZiVrqGfloKVmY6enZqXkYqUk56apaOjoJmXk5KWe4yRhXuNi4OLk2xueW92fWJGYGpaSUhaWz17SkdFNkFjVGlbTVxhS1xcWlJSUmJhTEtFYGFhUU1JUFdWVU9HV1ZVTjpJVklIP0NLP0VESEhRTkE/SEhIRTw3PT46NzU2MDk/ODY2QiwtOCwvMDQsKCwvLSo3NikoOS4kOks1LiJUYFZhLjUoQ15RXC4rQS9KR1BbRzNjWFRMRZqWn7CosamspKOurbWot7O3o6y0t8m7tbu7wL61tLfDwMzHvMO9t7+/wbjAvbK9rqi6ubi3wresrrG6lpenrqyopLKplK+7pKyysqano7K0sbKxtbC3s6murLKnuK+1s8TFtqm1tauwrqqno7afn6awoKOUm5mUsJ6nm5+pjaminZuVl6WlpLenorCzq6ewp62vtKykmKGsqJycnZyUqrmclY+PjJidopiRmaikoZiFlJeRnZyYl5eJl5CXm6idpaGSlpKQlneEkYZ8hoKEjY1ucXh2fIBdTGVsXEtPZF0/YntHSThHaFdlW01eYk1ZWVdVWFVqXU9QSGFeX1BLR1FWVVJLSFdVVk04TVpORUBGSz9IQkNLU00/P0xPSEA7Oj47NjswNDE8PTQ1OD8pMDcpMS4yKSksLC0rLTkkMDQyJTlCNy4jQU5IZzI3J0ZhTFYlLUIuPUVMUTwzcmpMRUSRmaStpKytqqaisLGyqrewtZ+rtbnJua7BvMO4s7K1wsPOxMDCvrW+wMC7v720xKmqubG2t8C8r6y0tJ6hp7GupaaxpZ6ytayqsrCrqKi1uqy1srWrtK2qq6msqbmtsrDHv7ilubCpra2mqK2xpaSjrqOonJ2bmq+ZoqKio5Csn6Ogn6GppqW4pKu0tKSqq6msrrWuopyjqKucoJmbkqS1mo+JjoiRo6GWj5afo5eVhpCVlJ6bmZeViJiTlZmnnKCgjZOSjpF4fo+FfXx9h4qKcnRzf35+XVNjbl5OWmddRkSWW0c6TW5YYVtOYWJOVlZWV1VZaF5RU01jWltUS0ZPVFNOR0lWU1xOO1BeSkJESEpBRT8/S1NPPjpOTUM8PD45OjU9KzMyPTYyNDk6KDQ1KS8sMSgpKywtKiY1Ki8mMCkzODoxJiozRGQ7NipIZEhKKzpJPzNDSVMsPo9rQEhJkJqoqaGpsKSno7OzsLS1sLCgq629zLuuwr3HsrSutMLD0cTFv8KzvsLDvL+4vcWorbestLi8wLGssq2ipKeuqqilsaOqsaquqrGurqyrs7unt7CyqbKqq6alpK66rKqwwrm0rLmpqaitqaexpamkoq6pqKKenKKslaWdmJ6ZrJ2hp6ihrKajray2sLGgqaKgqq2wrJ2ep6epmqOYmZCgqJiGhI+Li5+hkI2PmJ6SkoiIkpahnZaZloeXk5OXpZ2enYySkI6Kf3+IhXx3f4eFh3V0col3bF9ZX25iUXNxXEs7hHxGPld1V2FZT2NcTlVWVVdRXGJfU09PaFhYV0tHTE5SSEVJVlJdYzxQXUQ8RkhIQkc/PUpQTDo+T0o9OT89Mzk4OyozNT4xMDQ4NSg1LyosLjMwOyksLCclMjM0JCwyLTg2MCkoMTxeSzAuSmdERjg8QjA1RUtYMUCUXUBORpWWrKegqbGcp6iwtay4ta2qpKqqvcm8sb+5w6+wrbPEw83Ow7/As8DDxLrBtMnErK+3rrO6wL60rq6sp6mqsammqbGmtK2qr62tsa6yrbS7pbezrKyuqKugo56xt6uqrbm2pLW1pKqnrKyqraCopqexsaSnpaGhrJaqoZOboKaeo6Kqo6yinqaxtqysoqWimqmqrqmcoaWkpJmgmZaPmJ2TgYKQiYWdoI2LkI6ckZONhY6ZpZuTkpuMk5KRlKOanJqLj4uMfIaCgoF6dYGDgX51d4uih3hqXl9uZldlh2ROQGeSTEVieldiWFJmVU1WVlVUT1xdYVZMT2pYVlZISkhJT0JHSVNRWW9BTVhAOkpHRkVHPj5FUUg4Q0tFODdDNzI6OjoqNDk/Li80NjMpNCsqLCsuIzQuLSsmKCs3OSomNis8LTIsJjA2WFouMEpnQUE8PEMrOkpPXjREh0JJSUSWkK6koaqvmKiorbWqtbGqpauqqb3AwLi6tLy1prOvxMnL0r/Bu7i/v8O6wrrBxK6xtbK0vMG+s7Gvraytp7eqpa2wq7iup7CvrrGrtaq2tae0t6uspKqqnKSetLOoqKSztJ+1raGqqKuoq6efq6uoubapqqqqoqmfrZuRqqGdoKSipqKqnpymtK6npamio5ikpqeqnKKko6CZmJ+Rjo+ZjX+HjIeEnp6JhoyMkZGTj4WIlqOajo6bkpKQj5KfmJmXjYuEgHSHgn9+eHWDf3t4fn+InY9wcWZmcHdcYXSIak9dmFZIbXlVZFZTZFBNVVVVUU9YW2JWSVFqVVdUR09YVUk+SUhPUVB4TU5WPTxLRD9AQTxAQ1VDOUFLPTU7RTIzOzo3KjQ6PSstMzQxKjgqKisqLCkqKC8qJiklMzssJDIpMjAyMSUvMlJjMDJAZj1OWD9DLD9MVF8vSWs3UkY7lYyvoKSqrJmpo62usrSvqqSvqai7v7zBsrC5raK2r8jHx9DAv726vMO+u8TCwL+usrOztr28wbGytKu0qaW1qaWts7K4rqGstLGvsbmrua6qrrerqp6qq6CjobWtqKGfr7KhtKqfqKeqoqqhoaytqL2uq66toaeon6yZj7CimKKgqKeep5uZqbCpop+soqGSoaKip5mZqaaYmJmdj4uHlYh9joaEhaSXhoOEjYeQkJKFhpahl4iRnZGTkI2RnZWYj4uGhnh0gX99dHh6gHt1dHtrgoekdmleZWuAdWeIi3xSVnBfS3hzVGRTUV9NTVNaZk5NV1llWUdTalJSPkJOUWFROklITFNJcVFMUzs8ST87PD07QEBXPDw+SDczQ0IxNTo5My01OjopLTMxLS02KSgrLSw1MiMyKScsJS47LiYxLjAtMTQlLDBNaDozOF89YWQ/RjFDUFtbK0hQO1lDM4+NsaCkpaqjpKKsprOysaiksKequL/BvbGpuqqnrbDJxsfQw77Avbm/wL3JvMK4sbC1srq8ucCztbysuayjtKamq7G1t7Glprm0rbS8r7ylra22q62cqa+kn6SsqqicnaqypLOomqunqaSonaKpp6m9q7Swrp2ppKCvnJqzopakm6Wkn6WamqiqpZ6aqaGbkZugpJ2ZlqmqkZmak5CLgo+FfpCDgIifj4eBf42IkpCQhYKVm5SGk6GNlJGLkZuTloeKf4Byenl9e2d2fHt1cXJ+aoZ5hYhkX2djcoV7bWd5XV5WQld7bVRiUFJZS0xOcHRdSVpbaFlGVmdPQz5LT0RDQTlIR0tTP2phSVE4PUg8PDw+Ojw/VDY6P0M0NUg+Mjs1OTAyNzw1KC41Ly0xMSYvPktJMSUaOTAlLCwwOS8sLCs2JzE3Iy0vR2pJMTRYPWZiQUo3R1NgVSo9PEZcQCqOkbCYn5+ppKKhq6S2srGkqbCmrbnCvbexpLmsqaiwwsjIzMK3vb+1uMG6yLbDtbSztbK9ubq9tq65tr+sorOmqqqutLazqJu5u6ixvrK6oK60tqmrn62xo5ylqKmjnZulsKavoJ+qqaehqZujqKCtvKeusa6hqqKkrp6eraaYn5qhopufm5mjqqKamaOjlZaUoKGWm5amrIyfko+RjIKKgICPgXualY2KfYCMh5GQjYqFk5iRhpOjipKRh5CZkJSBiH16bH12eHhienpycHF0eGqCdWuCZ2NnYW5zjm1iam9fcEFdeWtWXk5RUUtJTVNZVk1cXmxXRVhhT15QSE1ERjs3SEVLTzxyaEpLOUFFOzs9PTs7PUo0OUI8MztHPDQ/MTgtNzg7MigwOS8sNS4uPS0qTD4qHTQ5JicuMzQuMCsvNCYsOiQ0MEFoWjEzUz1lX0RMNktWZE4pPTNSXT4jkZasmJ+Xp6Ohn6ejt6+toq+vqKy4w7u0rqC5r6uns7rHyse/uMK9r7S/t8S2w7KwurGywLa7vbequbi+qqS0pqipr624r6eXuLyjrb60tKGtuLWnpqiws6CepaWnoKWZnqynqJ6gqq+noKaXoqifsLifo7GvoauhrKScp6eompubn6KVnJyanammlpueqJGYkpmdk5mWoaqRm4qOkId9h36Cjnx8oY2NiXqEjYWLjo2FiZOajoiUn4mQlYKMl42RfIV8dHB8cXNzX3h4am9xcXBrgHNkemxnZWNhZoeAYFtyanJNToBpWFpNUUxLSFBSUEdNW19vVEVZWlJnT0hLRUY1NkhCTEk1WmVKQDZFQjk6Pj0+OjpDNTk+OjNARjwyQDIzLzo7ODMmMjwwLDg1QiopLUMqLDQ7Tk5AOzczLS4rLTcqKjwlNTM9ZmQyNE0/ZV1GTz1SWmdIKj8wXVs1KJWbpZiclayfnqGjoLarsKO0s6mpusW3s66huK2tq6+1xcfAt7/CubC1vbe/u76wrL6ws7+yvMK4qru6uKentKenqq+rsq+kl7u1pKu6ta+esbmvqaWnr7KcoaSgpKOglpuvpaGeoqivoaChkqOkorawoaaxq5+so66YnaqlqJ+Ymp2jk5qbmp2lqpqbm6WVlJeVnI6Tl6KpopGKi5CGeoR+hIt6j5eKjYd7g4iEiY2PhY+TmIyOlZmLj5Z+hpeMj3qBe3Bydm5vc154d2VsbGxraoVuZnJpamVoXWRzgWBba3ZpWkp/XltYT09LSEhSVUczOV1ebFBFWVVZZU1JSUVFMDdGP0tCNklKSDs2Rjk0OT49PDk4QDg7ODo3QEk+ODw0LTM8PDc1KDU+MSw7QTEoKzY8IjhSPSoxMTM+RDUsLSc0Mio7KzEzOWNtNzRHQWZbSFREVF1oRC48MmRXLDKUoaGWlJuqnKOhoqG2qa2gu7elrL7FtLCvo7WvrKyutMPDvLO/urexs7m4uri6r67As7O4r7/At629urWlorKpp6mxqauwn5m/tKSntLWonrK8qailqa+smaKnnKSllJegsaSZnqSpqZyin5KkoKS4qaSnrqaepaGok6CpoqGhmZudn5GZm5afoaqbmpiglJGUl5qOk5OkqKSQiYqPhnqEe4SGfZ2NiouHe4KFh4iKkoWWkpKLkJWUjo2Ue4OYj4t3fnxsdHJsa3Nhd3VoaGpoZ3CGaGhpZGZpaWBqY2poW2Z7Y2BTdFRcW1JMSkZJT1NAISpoXmlMRFdVXmBLSUhFQy46QjxGPDZLUEQ4OkQzNTc9PTg5NT86OzQ+OEBLPT45Myk4Pjw6OSo2QDMuRTQoKyw/MC1OPy4rLTcsMTE5NSwmLjUtODA1NzZgdEEzQ0RnW0tXR1VgaEIzNzlnUCcynqKkkY6kp5mcnp2jtKynqrq2p6zDwbixrKO2rqetrrfAv7yywrawrrK2trm2tq2qvbOusrG8v7evu7uxpZ+1qaWks6aorZycwKqnpa+zqqy1u56pqquxpZieqp2mpJGYpayhmJ2kqaGboZuWn52ntaawqq6hoZ2eoZWgpqCioJqbmZuSmJ2TpZ2soZeWnZSTjZWXi4+Ym6mgkomKi4l5hXeBgoGdh4uDiX6AhYiHhpGEl5SPjo+RkZGMk3uDlY+Gc35+ZnlvamprZnRza2NnZGR2gWNlZmZlamlja3JbX1ldbGRhTmlYWmBWSkdIS01SWD45X2xoSENVVF1bSUlHRkEuPD85QTg5UkdANzpCMDM3PTc2OTI6PDk3OjlETT1CPDAqPEA7QT0tNUIzNz0rKywwQipKSy4vKiszNzIyKDU3JCs3LjcyNjg1XXlOMj5IaVpMWkpWYmZAOjNCaEglNZqjoI+MrKGWlqCWpLOxorK9tqGxxby7srGjt6yqram4vLu6rcCxrq6utq+zuLOpq7mxr66ztrq2r7i9rKaetKmfn6+iqK2bob+fsKOusa+3rrWera+traKZnaeppZ+Vmqeln5ikoqidmp+ak5yerK+muqiuoqGam56ZnqSapJ2XnpiblJifkqiVqqeak5qakoyVmY2UlJuqp46OioqPe4JzgYGKmIWHfImKhoaKjImShZWbk5KOj5GXjpB/gI2Og2+Bf2Z5bWdraWZwcmtcZ2NjdIFiZmdqbmxnampobl1sbHJwYFRjaWNmWUlGTE1PWFJRVWFlgFVBV1NZVEdJRkVALzw9Nz82PEZOYTg6PzI0OUAzNzgyOD83PTg+RkpARDkyLT1BPUE9MDVAOUExLSsuMzw7SzYvLissLTI0OzYjMyopNi41NTQ2NVp8XTE5S2pbTVtLWGRkQEExSmZDJjSRoZuNjq+dmJOhmqmxr5+5v7WgtMK7vrqxprevp62kt7i3t6y7rqyqq7eqs7euprK1sq6psLa2sLO1uqapn7WnnJ2ooKermqe9l6ykrrC2taytn7GtsKmim5yjq6iblJumo52aqaKklpqfm5CbpKqrqryfp6SgmJqZnaGPa6KWmZxwgpWao391kamnnpSUnpCImJqAloqikHmHlI2DbWl/d4NxbIaLhn2FjIdxXmNhZ4SYhWuKjZSSdHeLhH6DkIBnh4BndWhlV1xoc25NUGljZ3OFaF9lZm5tal1gYYqPg4RlTktEOUdUaF5KR1BQVVVMSFNhcHRlRltRVVBGSEVDPjE7PTY9NjwzZlw1Ojw3NTtENDg2MDpCNz86PkZMQ0IzNDM9QUBAPTI4QEU9MSwsMDg9RzcwMS4qLiovNTY4LCMxJzIxNDoxNzVYgWwxNk9rW05cS1tmYj5HMVFkPSoui6SZhpWwm5qToJuqraqjvcWvqbfCt729raa3sKWqorezsrKwuayppqy0pq+0oqm3traop6y2sq60rbOhqZ+yqZ2ho5mkpZiruZOlpa+zt62upamuq6yloZ6coaemm5agpaSbm6emnZOenpePnaeppLawpKOinZaYl5ejiKGOkpqGoYeTnKB/pX+lqp6SkpqRiIRzeI2OhYihdoqNaZeIZn5zeKBviIeEfo99f6GgoJmAfYeec4aOdZuKbIeBg21pZWN6bHJhU4VtYmxpmHFYaXFwiFleaVtsbFuIcm56coVmhoRaX0dOP0dfTUVSVlZRUVJXVWddTVZIUlJPRkhHPjw0OT05PDc7MDw8Nzk5OjY9RjU4NjA8Qjs8OT1GUUc9LjU8O0A9QD41OUdBODIqLzE8STkvMDEuKi8oLTQ1ODMlJjIxMTU+MTw4WIN1MjVSa1tOXExcZ189SzFXYTcvKIqnl4Ocq52YmJ2fqqmnqr/Dr7G6vLbAv6qlt7CorKWytK6usrWpqKWwraW0sputtba1pqeosrCssqetnamgsKefo6KYn6GarLOTo6Wltr2mraerqqyopaGgmKCmo5mYpaKjmJykqJaTopuTkqOlpqG3pKSgo5iVk5eTnIivkJeUiamLlqGchbGAo6ydk5mdlHmC1KiAh5XBnMZ5eLGlt5dlgMCcv3mEhXqShHyQkJHKcpe7nMV6crWnupB7gG2WsauweWhsWLGubmVpvJK8bmd6b3KP2H5Ta2O2sn6BcpRzmqGqkFdPV2JPVk5GVVtYUVFTjV1XW1FBXERRTkVISTw8NTc9Ozo5Oi49Ozg3ODs5PkY2Ojc0PkA+Njk/RVJJOi41PjpCPD9BODpKPjUyKjIyQkUvLjMyLisvKC0vMTg2LSAvNDE2QTE9OleDdzIxVGtcT1tNXmdcPkwxW100MSGMp5OBp6qfl5yepayyqbDCvbK1wLW2vsGrp7SsrKimrrOpr7WypqeltKWnuK2cs7K2q6Wkp7GtrLCmqp2mo6+ioJ+dlZmenK2rk52in7O6o6qpoq2upaGcmpqip5+XmqefnpeepqeRnKaZk52hpqKhsaOfn6OWlpKXkpmFr2tqio2qfmaDlYatZHCdnZSZppRxrqGkfni7fWyhkHaxX2q0W6WAZZyRYGeDe2d/anhrqWW+cWemi3WxanuxeHSSlGNubaduW4ShRWhmh5ZFdZxgfmd8pKeCWmCMq2iAlXh5aqc3Sq9cWFNsZFtLTlhfXFdWO06KT1dXL0lUU0pERkY9PzQ2Pzs4OjkwPTg5OTk6PTxEODs6Nj1BQDY8QEhRRzkwNzxBQz5ARDhARz0wMy4zM0UzLi41My8rLyguMC46NS8nJDIwM0IvPTtVgnYyLVZqXE9ZTF9nWTpNNV9ZMzAbkKKVg62npZ6jpKqxt6y1vb+wtsSyt7rBpqmwqq6oqLCuo7C5rqOkrbKjqbinnrOzsKOloKmsr6uvpqeeo6GvmqGblpSWmpqrpJWaoZ+0s6KrnKOtraCemZagoqicmJ2jn5uZoaakj5yimZegn6qepqagmqChlpWRlpCahbWbtXiFqZm1mXaGs5u3fpOWlqmUfmuCpnuChoiTlJN3q2drsVyreo2GlHSJco+HgH+IkJd4goGLl4uDoI+EsHZ3n3FsbGx8i06kWEhiYpl+Y2imYHlydVOTh15RqW1jcX6HgGKcLlGhb1tTa2hgTEtbZFhcWkI+sntYWEEjTWhGQ0VBQEExOT44ODo4NDs5OTw5OkE6RTo6OzY6Q0I4PT9LTkc6NTpBRkJAQUQ8RkQ7MDIwMTtGLDAuODQwLC4oLzMsPjgzMR8vMi1EMT08U31uMytYalxPWE1fZ1c3SjhhVTUwG5SglYizpqahr6mnsqypu7bCsLvBrbi3v6msra2tpayxqaCuu6qgp7Oso6u0o6aysqejop6nqrGnsKelnZ6erpWemZSUlJedrKGZmaSota+iqo+qqKqbnZWXoKWnmZ6do5+bn6Olo5WbnpeZnKKpm6aanJuioJeTkZKTnYPVk5m5cLDBfsWGfNaUm7t8mpWlj42djaR7joikg6WCeqx5j51Wr3qIfp9quVq5doaEfqaClHuXeqp4jZ2PerFujoR0kbyFb5RQr6fFilGgemNgqmJzcohtl4hgU7W0yIWAiXxjpDNCnXZdUGppY1BAWGdaZGFKSE1xUFxRT1lmWUNEP0U/MD08NTk7NzQ8Ozg9OjxDOkY6Oz42OkBDOzZAT0xIPDo7REhDQkNEPEVGODEyMTFEQy4vMDQ4MystKS4zMjM5NzEjJTUqPjM9PVF3ajYqWWlbS11PX2ZUN0c6YVA3MSWbopSYsqioprSqpbSppLy3wbC5v7G1tLqytKewr6KvsqWfrbWomqe4raKvsJ+ztLCgpJ6fpqmwqLSoo5qcnaqVmJeVlZOVoKmcmZanrbCpo5+PraOolp2Wm6Gln5ehoaKhmqGip5ueoJ6UmJqmoJunlZubn6GYkJKUkJ2Ism5otXGrh26OpnK0c3K2e5qXpIuPnY2if5Ghpn+xdoOR0tJ2XK57hX+kb5uqpmuHhX2tfZiZjnuxcZKejnizZZd0hJ5vnmeUUciLWsJcn3liX61gdnOHYpeIXlnKnW+/gXVNS7VTVcZkVFFqY2VYQU9rYGxoUFZHSjk9VVJaV1hJQz9KPDI/OzU9PDQ2Pjs3Pjw9QztHOTtANzs+RDsuQ1JKRz4/PElKRkNFRD5ISTkxNzQ2QT4vLjI0MjUyLSkuMjYsNzQyJh82MDs1Oj1QcWg5J1dpXEJPVF9lUDVHPWFMNjIwop2SpbGto6u8raa0pqe2u7yyur62trS5uLKktLKgsLGinquvo5emuK2ksbCctLepoKWeoamksaesqaOZmpmnnZWTl5eQkaGmn5WTpaqwpqKWk62gppKUoJukpZ6UmqWnoZqjn62ZoJ6ekJWboZ2cpZWdlZqin5WYlZGahax7d6h2o42IhqlvrYqCp4OYmKGJkpqLon+TmomuhX+Cs1xys1KufYKCpH9x1314hX6PnYaamXavhoeRnId3tGGaZZqCgpVtklqwWEuadZh5ZmCtXnZ3iGiYiGxdr3eVno94bDV5yK6yX0JUb15nYEVQbGBwbVZWTS5mZWlTWVA7QURATDo1PzkxPTwxNj85OEA9OkM6Rzs8Pzo+PkU5LUVVSkVAQzpNS0pCSEc+R0s5Njw0Njo+LzA0MzMzLjIuLjE4Ki4zMiUhMDM3Njc9UGtlPiZWZ1xAPlZfY042R0NgSDo5OaCelaC5sJe0wq2os6ipsrq3s7e+ubextLq0pLeynrOsn5+oq56Up7WrqK+xqq2zo5upoJ+nobWmpqmimJ2UpKCTkpuXkZShpJqSkKatr6ahlZmqoKOPkaGYp6SglJqlqJ2cpJ6tnaGcn4yTnpqdoJeZm5aXoqCUl4+mnYapfX2leKGOjYKqcK2LgaeGlp+hiZeXiKOCkYiUqnyAi514b7FaqIKCiKB5dNh/doh0qIGOm4ySpHuUj5+Ee7JenWSgfoOVbZJdq1tak4CRf2hnqmRye4FrmIdzXqtaiaCOa29lT0pDoVxbTHRdYmdOW2FfcnNfS1c3SpuWWEhFPUdGQU0zNUE4Ljs+MDVBNzhAPDY9PEY/Ojw2Pz1CNy5IVkpFQUg2S0lOQElLQEVOOjpANS46PjEwMjE0NCsqMDUvNywmMjEoJCQ2NjcxPFBlZUEmVWZbPzJVX2JMN0ZJX0MyPziinpqawauXtMKuq62ppbSwt7C1vrm5sbC0uai6s5+vpJ2kpqaek6mwqa+ptKuprqGYoKCmpKO5oqKroJabkaGflJOemZOXnp+QjIyosLCnnpebqKagjJKklqaqp5SYqaednqCiraShnqCMlKGYn5+RnZeclZ6hlZaNqpyPrm1ytHOpi3WKp3O0eHOzgJGko5Kcjomkh5B3uHCNe4uiamu2WqGFZZeXaaGip22UcrR0k5l+smqFkYetanWzYZ1mom+Hk2uXXa1gTaF8h5FSc6NseX9+b5iHcl2vVjycd2ZUb24uXKdPY1NrZWJtWmNdYXB7Y1RbUj49bnAzQ0JAP006ITdANi47QDM3QzU4Pz8zOzxDREJKRk1JRjYySlRLRUJJNklKUD9ITkNGUD08RTUwOzswMTAvNzUsKyw0MjYvIzAwLCwdMjg5LzlOYGVEJ1VkWT4vVV5hTDVGTV44MUM4ppybnryhm7LArq2rrKe3qbevtb+0u6+utrWqwLWoqaGbpaOhnJGpqae1orKnramgl5ynn6SruJ2irJqVmY6jopWMnaCbmJyfkZOUqrawqJmVnKypl4yUpZejrKKRlquxo5+epquxmaGij5iilp+blZyWoZOdqZyUj6qZh9SSmrtzsMOAw4Z91ZabuHiIkJiMl4uMp4h6pLZ1fnd2woKasmCDunnAfHW4Y7WBjIepfZWBq6lxe390vIinoGmdYaaOr6F+jHWHqn2+b3O8dLKDdXiBim6aiHJujaR0vV53fVphebxrWlZcanleamFlZ2NteG9ZXFpDQEBzQENGKzVHIic7PzEwPD83OkI5OT1DNDxATlpeYGBfX19aUFBSS0VGSjRITFJASk5FRk9CPUU4ND05MDIwLjg3LSouLzE4MCItMSwzHiw8OjA4TFhhRidUY1g8L1ReYEs1O0xbLTdBOaebnqK9oZeyw7Ctqqussae3r7bDsLiwrbmurcCwq6OinqOhnJuQqKOqsqS0payknpWaqpimrLicoq2XlJ+PpJ+SjJyinZedmpGWkq+5sqyWmKSop5SQlqSbo62ekaCoq5+an6ijtJ+ipI6nopSimpyXlaOYkK+fkpSpnoSQmLZ/j5GMt5V4gpOatXdta25zb3mQhY+KdJ/Bu72ae4GxqHGAc5G5g32HhoyHjXyKh42YfKS7ub2cdHm0o3R3l3Z0sHWZnmaHao21dHJxd7aMXn96fYlog3luemOLrHB1hX9YW6dqRWVaVGZgY15jUWdncGx1Q05RTUQ6Wk0/SjM7MCA4PjsuMz1BOTk/PTs8QzZCU1laWltbWlteYGJgXVNHR0g0RElUQktOR0VPRj9HPDc/NzA3MC85Oi4sLy0qOC8lJjIoNCQoPjcvN0xUX0cnU2JXOSpPXl09KzpWVSc+OzynnqGiwKWWtcO0rKuorKupuq6wxa2zsq22prO3q6mhoaWeoJ2Zk6qjrKmltaenn5uVoKOdq6S9pqGplpObkKGbkY+hp6GSnJeUmJSxtbetmZ6kpKKLkpKmm6Wqm5WppaWbmaGopaekqqCRrZ6XpJ6Xl5edno+vqJObpaGNan1pm6V3hnJ9mo50eWSHe72+wLpvk4Nylohhc2taXpuJYGOIj5VrYICWZG6ed2OWbICalZRlXmBicJmIaXKLfYaVZ2t/cnR4fX9iW3d0gWhQXG2DfXuLa1hreoJzSkpvhnBOdExFWF1nYUxbV2djX09bbXRpcVJRREVNO0dJPU0/MiwyQT84LzU/Qzw5O0A7PUM+UlZWV1laW1xcXWBhYWFgXFVHNURGVUVKT0hGUElJSDs4PTUxOi4wOzouMC03Nj01JiIvKjIsJTs4LTdKUl9JJ1NfVjQpUF9MKDM+W08nPzI+qaCoosKjm7W6tqOspa6np7WxrMirr7Kqs6K9sLGln6KnnaObmZmrpq6jpLSopZuXlKCapa2ovaeopJSTm5WfmZKXpKmokJ6RkJicsLK/rJynnqeiiZORqZqoo5qaq6CjmZqjp6yjoKuimrGblKeglpSdn52WsKSXoKeYm5CcnKGhl6ShmZyZmZmPlYFnbX1xd5KYlJKGjLarjYaYlY6KjJiWh5SVi4STlJKJjpOUmJSYlpmfoZmak6CcjYJ6pYVta32QfYB1ioqBcYJ4eXZ1iX98impzgXSDdWV3fXdrb3ptX2RdcGhNWVpmamBXWm94bW1mVVBGUzlPWk1STygrOktCNjM1PUBBOTpDPjxFTlNTVFZXWFlaXF1gYmJhX15eW1RLQ1NHS05ER1BMT0k8OjszODksMjs4MjApNklSTzgiKSsvMiM0Oyo3Rk9bSiZSXlMxMFReOis9OFxKLDwtQLOhs6LAoaSysragqaWyp6WwtKrIqqyvpbSlwKezoJ2kpJyjlZWfqqasoqO2q5+YlpWfl62ppcCeq6OUkZuXnZeSlKGenqKnk5KZqKeyxLCbq52rn5CWlqidqpycn6yYoZucoqSvp6Klp5+umJennZmZoJ6dnK+gnKGllJaRl5Oen5ShnZegjpaTioqNjpeukHyWnIOSgourqYWAmZeJhJCeiHqEkIiGmpKIh4qWj5uXjZCXnaOVmJKQnI1/jmehs6+FioV2e5KKfXd5em9meY+BgIlqdYF5iHNpc397doOHgmp1ZHpmYGplY2Rma1lse29pa11TTFBEXlRGQD8+LDRARjs0NTs+QTs8Pz4+SE5OT1BTVVZWWFpcX2JjYV9eXl1eXVhWSktMQklPTVJKOzw6Nzg2LzI5NjQuKCYkLTEuLykrKjclKzwoNkNNTUQvVFxRMDVOWzE3RTRbRzU8LEC0oLmwv6ysr7KxoKqmsq2irLOvxK+pqqKxrbuis5ufpqKhnJiXp6WppaSlsrWelJOdmZmvpa2+oKuikJGdmZmUkZWhnJeonISfq6yjtMi0oKqkq5eWl5qmnambn6SrlJ6fnaCqr6mlo6uir5ufoKCYpJ6cnpyuo5iep5KWlZuRo5eWp5yalmWCknxlfo2akGN5jm1oa3uSpatqZZuYfWeGimVlaWh7jqKPbGiNmJGjd2tqipiinpdza216hI6IelhmXoaDXm2MioF2XGhzd3aRgIiCbXeBeH9zbXmEdHaJiI+DfGqHWV5sdGRec4lpa3xwa2RfUk5YSWRYQUo0PkY3P0ZENzE8PT9BRDs7REdISElMTlBSUlRXW15gYWFgXV1dXV5fXVpVT0RIT0tTTj0+PT02NTM1NTU0KiYmJSwqJS8qKyc2KiQ7Jy9BSltKLzdaTzYpRVkvRE8yWUM7Py49pqC6vbqvrLSxqqWora6wpq2tsLywqKajra6wnquWn6OdoZmZpqqcraOlp6myrZ6Uo4+ir6W2uaWuoo6OmqGZk5KaoJmZpZV8pq6jqLTEuKWip6+fnZWeop6jnKOpqJKfoZ2hqrCrq6SqoKqbp5+noKyWoJulr6OWm6mUn5uZkaOVnKmXnX29g4hytHKEnYataHi5xLhxlKOjeqaZmXKrgnzLwMC7cYyjiIOefJeZiZ3AvYGWnZ2MnMHBfIJ8k42aw8B9bKWyb4yBb8p6f5t2kIOOgXV5gIB5cXp/h3B3hYyTeW14lGNnYHhkYGWCYl5zZ2xkZFlMVklRWkhPRDJJRT9EQj4vPD8+QEE6OENDQkNFSElLTU5QU1ZZXl9fYV9eXl5eX19fXVxTTVBHVU5BPz89NjQ2ODI3NiomJSMpKiYuKyopMTAfOSojPklbTCojQlAuI0ZbM1BZL1ZBQjsvOJajucO1sLDAqaiUo6+osK6tprKzrqmkpaavqp6rmJqin5yaqqahnKuipKijpLSknKKSpa2rt7OnrqKRkJmcpZKRn6GYm6CdiKetpauuwMCxoamvqZaSn52imaKkqqOToKKdnq2vqq2no6OooaWlnayokaOaqKypmpynm6qflJajlJ+hlZt/zpR4eqSBeZWWm1+uj16OqIKjoXynlptzq4OAr15jjap7qIeFoHSXk4izY4KrhqCNjbNqhK91fZeIt2GDrVqjzW6Qdnvae3+ZcH2HknZ9ZXqHdnZrfIdufYaRkX5tg5Bgcm1waGBgemRccWdpZGdgUlRTV11LT0Q1QUhERDg+NjtAP0E7PTdAPj4/QkRERklKTE5QUk9TXF5fX15dXV9gYF9fXVpXT1VKPT8+PDU1NzgxNjQoJyQhJywmJi8oJiszHTYwJDc7U0wrLC1LMCc7XDtMLSFQQEY0LjGtwsC/tbSwuJedkaOqp62zq6ayq6uqoqumrqqfppuZpZecoq+foJ6op6KloJ+wq5qdlaaurLCqqKuflJGan6SSj56kl56no5+upqyxqL/Hs6ipsa6Wkp2coZefqaqflaGfnZ2usKmsqpyoqKWiq5KsspakoaqpnaKlpJ+un5GYpZeemZOTkZegcYWMl3WFqIZxsX2ecqx/op+BpY+edquCfa1/nHOtf6yHhp92mZJ7fJd+qoeijJKMnX6re4mUkJ+Ae61XncV7j3CTwX2BlW11b4xtZXZkhW5hd25yb4mKko+DbpKRZnB1dXFhZ21lX29paW9nZFhUXWFaUlNDOUlJQEM8PjxARkRDRUE9PDw8PkBAQUJFRkdFQENJU1dZWlxdXl5cXl9hX15eXFtaUkM+OzkyNDc4NDUyJiMfHCAxJyAxJyAnNB41LSY3PVdKLTwoPjEpM1dARiEcRzpDMS4rsNPGxrK0oJ2jjqOioqyvtq6osaWoqaatq6umoaOdmaKVn6Wrn6Gln6ioop6dsKyXmpaop66rp6annpeUmaKhkpSgrZudp6SwraWttau6zbGtpq6rlpWcnaKZnq6snJegmp6fqbOrq6ubrKulo6yarrGhp6utpZekqaenr6CRlaKimJOQhKRqpHWJeql0erJwgqaKmYxxiaCbh6RgYFKrhX+ug5t2rYKohoWfe5mXhXpmgKOJpJmGgqN9qX6CloeuX3ypVp6jkoF6o5+Ae8OvxYtyr7OzuXFiqa/CdGiMjJiOgm6clXFvenh5cG1nZWVycGZ9amNdV2BqWFlVTU1RTENDQUI7Q0FAQkk8PTo5Ojw9Pj4/QT04NjtETFBSVFZYW15eXVxeYWFgX15dXF1bU0lCNjc5OTY2NCwmJCIgKCciKy0iJC4hMy0mQERXSCxHKzU2KjJQS0wjIEE5RDQsJ8PJ1tS/oZmrp6Cvop6wtLCuqayip6WoqquppKagm6SenaWnp6Ocq5mirKCjn6+hnJqSq6S1r66gp5qdlZOmopGboqigoKadsaamqbKtt8iytaqrqZaRnZyimaCls52aoZSdn6esraSwm62ro6OqobKtoamysKGZqKesrbOhkZShpZaZkHuqbJ6Eh3WreXywb4KljImflpaglYHSuLS4yYGBsl9glKmDpYiHoHqZlZp4qsl0maSVqKmRk5qNgZyKmsbGeWehgqV0gZ+Ogn2vXXC0YrB1S6OHbadHgpNkj5CekXxxmZWBcXx1fnxuXGZqc3FmgWtfYVlkblxfWUlNTUtFREFCPkE8Qj9KOzc5Nzk5Ojs7OzMuNjxBRklMTU9RU1daW1tbXV5fXl9fXlxcXFxcWE1CNzU2ODUvKSglJiUkJiksNEVOUFBNRktKVkYqTDAvPS01T1RRHRw7PEYyLCSnpMDGuK2osq2spaKcsrisqqGlmqekqauqpp+mppiqo5+uq52loKyanqmlnKe2nqKXk6mqtbKsm6WcoJSPpayRmpyno6Gqp66ipaeqsLXDsbOqrKiUipecpZuho66ll6GVmZympq2csZ6uqaefrKO2rKCxuK6dmq2msLGwopKWpqGYno2CnU54moF/n3qEo32DpIWHpp+dn5SEuHt7ebmCf8zGwrZ4m6GRi59+mpaXinafl4qlmKSpf7CFnYaghKx9mpVjpm2kcI+FkIF9loJyrGCjc3GAmmC8fVJVdI6So5Z7fpSTjXd7c4Z/cVxubnhyaoJvW2RgaW9jZF1LTFFUQUlIRkk6OUs+QjEwODg2Njg3Ny0qNT09P0JER0lMTlBUVllZWltcX19eXV9fXVpaWlhVU09IQDg4Mi4sKi4rKicnP1FUVldXV1lYWFdVT1VGPEUzOlBbVBwbNj9ILC0gi4eYqaukq7mqrp+boayys6WeoJWlra2uqqecpqebo6ihs66iqaayoJippJSjtqKilZeiqbS4o5uhnKKSj6GxmZ6cp6ahorCunaapo7azxbGtqaypkYeQnKidoqScpZeemZqapqWrm7Cir6WmmK+ku62htrWsnJyzsLavsKSWnK6eopyFj9G1w7d5h46FkZOQgKZ5lKF3jKCShKWBinGqhoW0bnJqmqSclYqffZiZhoePc6+CppyjjqaLk52LlpCbbnGyXaV0k3qcbJl/e5l8balho3Fxf59ic7K4aHePlKaYfY2OlY56fnmQg25qeWl6c2+BdV5lZW9uZmhgSltYWDxISEBVNEBGPjwqKDYzLjAxMykmNDo7PD0+QENFSUtOUFJUVldXWV1fX15eX19dW1taWFVSUlFGOjIyMy8vKysoQFFSVFVUU1RWV1dYWFdVVVZUUU9RW1UlITJBSCQpJZJyjIqtvr+8urSelqekrbWhopmUoqemrqqrmKajn6Whobano6insKOUq6OOpK2inZCamqqzs6ScpJyokZSWrp+fnqeknaidtpujq6S2rMSwqauooYyEjpyioKajlpmanZmcmaemp5mtqK+jpZuspr2slLyvrJ6hrrG3qbCkmaevoaaWeaiRfXywd4qApKWInG2ycKGHrXyhj4OolZiArImFrYWglaqgopeGn4GalYB7kn6rgJ2bloureJ2hkoqUkoF6r16kgX2mp2SdgHyXc2qvXaVrcIWZXWBbjKBtlZGmmYOWjpqOfHyEmYBrbn9jf3RugHpgaGZxb2loZ0NZYVs+S1UzVThCQkM3JCQzKycnMywgLzY2NzQzNTlAQ0ZJS01OUVJTU1ZaXV9hYGBhYV5dW1pYU1BPTkk3MDQyLiosQVRWVlZVVFVVVVVUVFVUVFRWV1dYVlVVUUhGSUojKCi9k5qDqMXCtsCznpqsoK23paOOm6SioLCvqp+loJ6tmZ65oaOroK+pma6hkKuoo5aJmpCusKymnqWbrJeXj6yhoZ2loJqlna6Yoqmnt6rBr6Spo56LgY6bmp+mnpKUmZuVm5qmpaabqqytpKWfqai+pJbCq6mhoKqwt6mrpJ6yraaol3WvfpCLnIWHfrqtipllsI1lla19oY+Ep5WagayKhLCFppqkoaKRhaFcbGqBs2B/rXt7g4GxbWdvmZmMiLFbfrVcpIRryKJkn4B7vFh2tFmyfVKugHqsWIChbpiPqJyMmJKamnx6kaB/ZHV/Y4Z4dYF9YmpncW5nZmVQVWRcQVVgPkkoPjk9NCEiLCUfMi4gKjEvMDQ1Nzk5PEFDRkhKTE5QUVJUV1peYGBgYGJeX1xbWFVQTkpGQzU1My4vQFVZWFdYV1hYV1dYV1ZXV1ZXWFdXWFlaWltcWFdXR0I70p+ysbe9urPBsqKcrKaktamgipqgnpyzs6mfpKGetpmgtKiqrJ6vrZ2sm5Wvp6GOiJuOr6uopqGlma6SmI+pmaKdpJ6Zo6OlmaGjqrOqva+kp56dj36Lm5ahoJiPkZqckpqYqaCjmqmuqKamoqWou56fxaajp5+ps7OqrKOduquqq5SAqZKjr46bgIekl5mQgoC4w7qDjpyThKeXnIKsioKviKecm6arkX/WvcKqYqO/vX1+o4KD17q4tYWVk4Oevb6EbaOCb6uEbJx/erKwx4Npq7C9rHh3or68c4CWjqedkZySmqB7g5OefGN+e2WPZ3qDfGFsZmtrY1FhW1NqXEBVYkNOKT06NC8fHyQfJTIgHSQoMDQ5NjY3Nzs+QUNGR0lLTU5OUVRXXWFcX19hXmBbXFlUUU1IQz89QT81PVNZWFhZWVpZWlpZWFdXWFlaWllZWFlbW11dXFpWWFRXWryVs7Owv7ixvLKinK6mpbKmnYuYpcCquLKoosCnqLOdn7Kduqifra+lp5SUsKuXjIObka6loqygo5yqoJeLo5KmnqabmqGpo5mgoqyuqrqtqKObl5N9iJmRppuSj5GYmY+YlKmboZmqqaGrp6CjqrqeqMOin62iqbKyqK2nnrilrKyZc3aqpbiGZImgcGiukYuRbm53pJCZn4F1rpmUcI+LcZWopJyYr6RzbW1sZot4b26CmXGBempxaWeKl5aYcWlphohncYZkXYhiam9ZXGZ9dqZfYXGOkW5lZH+Nk4+imZmak5mhfYmRmHdmiHhpj2x7gHplbWRnbWNLZFhKa1o6UWZFUidLOisjHCAbIywpGBsYLTIuNTo0NTc6PD9BQkRFSEtMTU9RU1ZcV1pcYGBhXV1bVFBMSEQ9OkFCN01YWlpZWVpZWFhZWFdXV1dZXV5eXVxcXF1eXV5dW1tVV16plKyzqbm4srOqqaGunqOzqpiSv7PFyr+3qp/Bra6koqisn7qjpK6rraaOl66pj4uFlZatnqWpoJ2ko6CRi6WSp5momZejq6GXnaamqLC7q6yam5KSfISWjaWYjZGRmZWOmJaplqCZqqOcsaadoqu5n6/ApqOxpKuur6irqaW1oqy2lYqhqKa3nYmWo5mIqpuRlZ2SqbOZmqOqoLKWoqGdn6KcoaWilaynjZOTjIeTnJ2VkZmTmZGPlYWBpZuYlo6LlJSMkIeEfmeJfnSCdXOHinCnbHqTkJOSgIGNj5CPnZWil5qZpYSJl5B0apF3cox4eH16am1lZHBlVWBZQGpcSGRiUFkrRj0rJyE3NTAuHxwhJTIoKjY5OTQ2OTs+P0FCREVKS0tNUFBRWFVXWV5gYWNdXlRRS0VDPjk9QEFTWFtcWVdYWFhYWFlYWFpaW1xeX19gXl5eX19gYGBfWVlgppaoqqS0tq6uobCjrZ+gtrGQjqzIvsa8uqujpp+dp5+xqaO2p52ptKaokZisoouHiY+cp5Wro5+Yp56ekpSjl6iap5mUpqKlkZunmaK2uqiqmJqPjHyBlIuhlIqVkZaRkJSYppCgm6qgnbajnaart6euwK2itaWura6qp6extp+supiRpaSmtqKSnqegjqqgjpOfo6uwmqCjsKiwl6OgnKOqnp6enJasnpOaopuUkJarmo6ZmZeRlp+RiKGelpWGko2RjpWLgX5li4V1hnV4h4JznGqFj5KTkIl9i5WSkpiUo5SfmaSFiZuKfXOXdHyMgHN8f2pvZV9xamBbYFpuZFFhZVFaOkdHRT4yPT45LyomKykmHSY0MTY2Njg6PT0/QUFDSUpHSktMTVNTVFVaYGBpYWVWUEtBQ0I6OUVNVlteXltaXFtbW1xdXV5fXV5fYGFiY2FhYWBiYmJkYlxbY5eVo6eir7GrrqOppqyfp7WqkI+dpbW9sK6to6SbfJ+ksqSlsamXm7mmo5OZqpyOhoqJnKOPrZ2ilaifoJKWmZuui6iVj6iaqo2ZqZCfubekpZmcjIh5gpSMm5OKlZKUkY2Sl6ONn5+pnp+4o3+Dr7Wirq50oruhsZ52d56or7iTdKujnomAq39kXGJ2oI+ln4SYfW2Ss5yjp62qo2Wen5JzeZqYcICYqZhtf6KoimWcpp2SmJiWjZKckIaem5GXhJKHj5CSiYV3ao6GdoZwe4V/f2Boh4mTkYtadZSQZ2iQj3N8qJycZnubioV5mWqGjIRveoBrcmVgd3Bsa2lcZmViYnFUWz5OTk5TRz5AVUQ6MS8eHyY0OjMwNjY3ODw7PkBBQUZIQkdGSUtNU1VVWV1gaGZnWFFKPERHPDhVUltgYWJgXl9fYGFhX1xdX19gYWFiY2RhYmFhZWRjaGReXWablaajoK6vrKuppaitoqetpJKWq7axs6ebq6itmHSNn7GgqKunlJe5oKCPnKSdkX+JiJuejKuZopWnoZ2OlpKehXWtj4inm6qSmKWKnLu0p6CZmIuJdXeTjZaTipORkZSNkJShj5yhp5mcspWAjJu0nLKMko66pZ99p6F5oKy1f42NpZ6Di4aQsKqvjYuXpJt6gYushZydoaeop4eVhZh3pZt6iJyAl6eCgXucs3qKhqGYmpWYloKRl5eEm5lje4eQhY+QkouDbXCOh3mAcH+AhH6Fc4WDlJF4lmiSdKCadX2ZhKOgiZh/lY2GhZprj46HbHl8cnFoZXlwamxrXGVsa2Z1XV5JVExSQEU2LlpVVTcpITA5Pj43NDM1Njg7Oj0+PkBEST9JRUpMR1NYW1lcYmFoZlpRSDlFTDs+YVZeYmRmZGBhYWBiYl9dYGFhYmJiY2ZnY2JhYGVkY2djYWFonJein6asrauorKCnsKamqaWZlK/Iv7Gil6iqt5+RhZ6tnKeioI6Qvp6ajJ+aoJB8ho+Yl4esnKKWn6CRjJOJhYCSp42Ho56klZmfh5+6sqedm5KOhXF2kImVkIqUkI+bjJCSoJKYoaSWnquHn7SJtJmtisqHqayItoWMr4Guq4KojKaYjZ19qI9ze3ecj6eXaJWkebSMn56mp5KYwoF/q4iYoXKegJqlfZeFlbOBoX2hlKGQmJeBj5Sci5mSi32Fk4eNlpKJg21zj4V+eXGGgIN7g3SEgJaAj8Vmf6mHj6NrnoWknYSagY6QiYyacY+Uhml5dnx4aGl2cmhobF5kcG1nbllnR11STTNFNTdOYmQ3JjM8RUdEOjY0NjU4Ozg+PT0/Qk0/TklKTENQWl1cV2FeaWxcUUU9S01ASmNYXWNmaGdiYmJiZGNgX2JhYmNjY2VpaWNiYmJlY2FmY2JiaZSWop+vp6iopaufpLewqaummpSgo6SspZimrLmksIGiqZ2mnp2JlL2Zk42hkp6PeYSXlpGHq5mbm5mhhI6Md5qcj5+QiJ6lnJeamYejua2kmpyMjH5ibY+Lk5CNkI2NmIyRk6CPlaGhmaGnfqGnh62dn5atj52cnJCEf6CMqKyFo42pmYyaf6J1gZmUa4Ktdk2reIeNnJGaqKaAqat9g6F7eqdqnn+Sa2eXhpi3iZ5+bmBkWYOXgI18ZGiLcpl9eZZsXX2XbV9ScINcX2t4gl9YZIF8g3+XcKeqa4OjbnKlcJ+FoGpnoG1ccI5+Z1pghIFjWFFwd2ZudXNranBea3FubGpZaU9dWUY5QTVIRF9sNSxJRFJNTj04NDg1OTs2QDs7PkJQPlFSTE1CSlxdX1ddXmJ1YE1EOk1PTlRiXFxmZmlpYmJkYmRkYmFiYGJkY2FjaWtkYmRkZ2RiZ2VhY2iXlZ2guKCpo6askaG1u6quopmYoaKlra+hnrC2pKmToqGgp5yajpm0mZCLn4yVi3WBlJKMiqaVlZmenn6ShYWspIebkIqZqpmbm5KIprGnoZWaiImAaW6Ih4uOjoqLjZKMkZOjjZSfn5yipH+TgY+ioJOfdpyVj6eBn6V+haeqgqV4iXyEmn6icHOUiJZ8n415bYabjJmPm6iZjoede4Kic3amZp5+d6RfmHp9lHSibpi3tLp0k4iDgLWoZIHGuHtwlbaMcoCao2NzrKtgfGmds35tfIaBjYKLmHF/o2xyo3SfhYGkYZ2ZtJdzfZifs3V0XJ6yg2tjcHV3cmlwWWxtc3NnXWpeYkxFPUQ2UUJaczM9U0dgSlI9PDM5NTo5NkQ7O0BKUD9VTU9RQEVfX1taWGBgfGRIQzhNV1VXYmFaZWZra2JiZWFkZGBhYmBkZF9gY2tuY2NkZGhkYmdmY2hok5WUo7eYqpuTn42kt7StraCaop2ko6avnZyzr62UmaKaoaWZm5Wfq5uLiJJ4i4VxgJaNiZChj5KUnZh9kImNqKGHl46JkqSVnJuNjKmopZ6Pl4eEfmp7h359kI2Di5GRiZCUoYOXnqCdn56LiXecmKGMn3Ghioeph5qkjpWlqHytjH56oJl6o5N4gXSWiI2cfZafhpuOmJulhaJkoXyIlpCbjW2eaJuOb5qZeoCLp31yaXSrg5+DdKpolZpdm4V2hZ5nqmuAuGZcqHCBnGCVjF6ndnWHiH6eaJp1hpOSl46An2+akW6nml6pf3m7a36qXI6EXbRoXW5yenhsalxxa3l6ZGFnWGJCUkZPN1dDUm81TFtbX05aREEyNTE8OjdIPzpDSFU+WVJZXT5EYl5WYFFhY31qRUI5TlteWWRmWGZnbm1iYmVfYWFfX2BgZWNeYmRvcWBkZWVrZWNpaGdraZWbiam0mqeIY5Sbq7qxr6yeppycqaCfr5yesqmun5ilm6GgmZeXoKOZhomNaoiAcnuXiIuWloSRlZiQeoqElaScipSPhoyfk56diZGpo6CajJKKgIBpgYZ5f5eMe4mOjoiQl5t/lKKen6GTmHJon4mejotwkoyBqYaYnaGlnqV7sK2joriXd6Ozo6SAiZR5nXurmX6ijpyaloiXcaF8hY2vtX1rmpGheX6YtaKkq6iEmXybfZ6bf3SqWl1ve5aLeJ5iTH97eoVjeZdCTJ9Yompxe45sgIiEmXWbeIaJsbN/gJuTp3eDnm50fpVwmnRrpF6VdkhlZGF0cn9/b2ZhbGl3fGVlYlFfV11VV0BaRlFoRVRXXWJYXklEPUI4P0I6SUY4TEVYQVdSW1ZERmJcWmBLYG1+ckVCPFVfYlplaVZnaG1vYmZnXmFhXF1eYGhiX2VjdmxdZWdma2RlbGlpa2mTnICwrZmEU16gprO5srKpmqKMnKycnKqVoq2lo6mQoJ+em5qWmaGdloiHiXeGgW95lYWRm4t8kZOWiHKAiJGhm3OQkIGJmpahm4WPqpyblYuLinyDbISFcYKhjHiGjYiIk5mWfJOkoJ6iiK2GfbWEjZ2ce6WWeqmAlJqPiZ6ae6dod21+mXShc3J8noaZcJODrn2kg6WdmYCjb16pZ3WiY2+lYZzTkH17mXhzc2KihpB+o3SkkHZrj7OMYIKYiXOqsqi8f3eDbX6/pqm0XZttfHCWbX9yonJdpGdzpmBopm2b1Jp+hptwe3uYbJx8eJhzbqmkZ2FlenKAhWxoZmRvdnhoYWNTXGZRUmJIWUpVYVdUXGZrXGVRRkNLTUpLQktFOE9AUU5YU1lPU1FgZmZqUmN3eXdJRkVjXWVaaGpUaWhqb2NqZ2BjX11dXV9oYmFpZXxkXmRnZGtkamxmaGxol5p/r6pUXEt+qa+xs6+yo5uZhZmpoKKlj6apoZqri5uZmZSZk5KhmI6HhXtwfYRofY+DlZuAd5GOj4lvf4WOkpJsl5N8iZKUpZeDj6ublJKLhol5g3aIgG6Cn4Z3gJOGiJmjmHuUoqOZn4mzoaK2i3qsp6SupXCpgJmOhYCZj3qkgKGZhphynoSkrq+Kl4yAjaSNlYOtoJN2tba1yaFzlIuBn2Cel6lteZaHoJt0ooh3oH6Tl4uBcE1mo5Jwm4dzpXt5dGGDgWt+oGtxZF+ccX1zlmh5abO1tMamc5h9ep1rnJurdoWbbnd5mGqae3aYc1FFfbNfandseohna2hjdXZxb1dfVFlpUFNoSVdNWVRWXmlsb1ZoV05LQUpNS0hKT0FRS1BlY2ptZXRyc395fG51iXt7VFFPbF5pXGtpUmpoaWxnbGZjZV9cXV1eaWJkaWt7X11kZ2NqZm9tZWlsZaGbiK6lg2Q/k6Gyqq6vtaKikICXqqKjpo2mqJ+ep4SbmJeOl5CPnJOOiIN6anmHZYONf5igeXWPiYyBaYSFkYKMhZ2NeY2Ml6aUhJmqmI2Ri4GJeoB9i3hwkKGGeoGVh4mWoJZ/lKSmm5WVg2ZueJxsomR7caV3m5hwZqaAlIl6pHqfloOXc553gYqVl4+5bpGKomJ9mKCViG5yaaprdaBtb6Zgm2mLkGmWh5uWdaKBfppgjIaNdXCIYmigZZ5+aZt1b2NmiIFtcaJZXlpioWxdiItuen1zcmSlbXiiZGenaJlzjJlwonBViZBvoF9mqFWLXlSYbm50a3ODbnFpbHl0a3BSWVdXZlpUbUlaUF1JWGlpc2pZbFdRUkZWXExYU2FVaWtfd3R7fXB8fHKDe4Bzdo2AhHZeUnJiZ2NwZ1BqaGhrbG5oZGdfXV5dYGpiaml2dV1cY2hjampzbGZrbWOco5eleWRzbYumraOpsLGmn4uAmKudn6eNo6KcpKOBlpmUjpqQi5iQjop7h3GAiGmLi3yYm3N1iX6Qe2SDh5SJipWZgnyIh5iokoGjrZGGkIuCiX6AgI5yaZCmhH2Hk42ImaCPiJOppZyIpniVm36kiJaLsZidkIKvl5+kdZOFeKlzpY+Emm6kooyShI2Du259pa+Dh4WGk5Wcn3ylenKolaCWZ55+b6xkloqWk3eobaqigYl2iYN3q5GmiGuRsGt2s4ypa4qFbW2fnpGUX32ri6p2fn6LpZ52n3yDpJWdoGqbiHisaJ+ujLZ0d76NpJNag6eOq2F2c3VyfHVxY2t/b2htVFdbVmFiXWtNXVJeSl5tb3dgW3FZXGBbZ3Rlbm9yY3J0YHd6fnlyeYNzhH+Be3uMgYOAdmJ4ZGNucmRSa2dob2xyamZpYWBeXGFrYm1sem9cXGJpYmxqd21nbG5ilaSpnIF/naOWqamdqKaupJmKgpismp+mipymnquehY2bkIeckYWSjYyNdId7iIRvjYV+mJN0dIZzkoJtf4uRh4aTjn17goeZp4+Ap6ePgY6JhZR2goeSbmyLqYGDjJSOiZ2fiYyUqaKfjn90k5eIfoF5lK6if4GacY+Gd46Jgn17cqeMcn59epiWm4SQeXt/foeUlZOKdpCYnqCDe32Ja4yFW3l5cnpxaW5+kolxgHWBj5STcYeEgmWMf1+AgIt3dXOUdW95bm2HbIOGXnVnd45lf4CEjKiafXR7lWqJiHCBdn2Hd25uaI10enyYeIVcbFh5j2lveHNycHh4cF1sh29qaFdbYFddZmtkVmNVX1JgcHl5bWt3Zmtra3d9cnJ1dGFvdmJ0e4J4dXqCdYCAgIF5i4WDfXtuf2xkeW5eV25naHVreGppamVcYFpjamVtcXRuW1tibGRsbHluaGtvYY2Tt6imiaCimqajmKWcq6KhhISYrZKeooqbqJuqmIOCnIx/lpSHjoqJjXKDfI99fo+Ee5iPdHKEcZWFe32Si4aGj4R5foCIm6WPfKiijIaQkIWVgoaOmHZyhKmGjpKdkImfnoiMm6aen6qDiI2Vmn5+iZatp4+SpY93b5uOgXiQbn6ohXF+lXFrcH2CoI2Ak46LaGxcgouLm5qejnOVi4hxdGuCd3SBWXJuh5GBfn+Mal1qZXuGhImAYGl4ept7gouCdYGFgWd3ioZqYG9xgHVecYmAiI6mlIVli42DbneLhHGGj3pxaGlmfIR7lltda2hudlx8enh2b3Rzg2hdbotsbGNaWl9bWWxxXF9hWl9eZnR/fHZwdWRra2t8fXN8eXVlbnVobXx+d3p8e3l6gIB+b4WJhHt9dH55c39oVFxxaWx2cHVna2hkXWFYa2hra3FybldbZW5sZ3N5b2hqbGCLiqmwoY+ioZqenZeemKijon6Dma6OoJWJnaORppWAfJiGfZKZiYmGh4pzfoGMdoWLgoSXinJvgHKYhoN+koOEhomAeoGEjZyhkYOoooh5jpeIlIqLnJeEg3qtgpGYmpWKnp2HiKGpnqGho4qHk5uco5mVqqGnpp+SmoaUi3p2jY2Dp35/k5CSlJ2yppuVn5CNsZKXg6WMjJWan4mQm4KIkYprfI53eGWDhpGLfImehIeMkImJgYWEkHd8enSaoImGip2JhJN+fYqAf3RucoSBfXaFhYmOpZCChYyGgoyQjH2IjIqRhHpuhIV+eplrc2lhdItxfnt4d3B4dYJdXm+IaW9gX1pdXVNoclZkXV1ibWh2fH10b3Bla2ppf31ueYByanBxbGeBe3KCgHh/fX+Eem2CjIZ8enh7fXqDeE5jdmpzbnB6ZWtlY2JgW3RmcGdycW1VXWx0bWh5enFnaWtljIecuZ6WoaCYlJiZlJikoZ98f5qsj5+OhqCdjJ6WfXmVhHyOmYqGg4SHbnmBgXOBiH6JlIRta356l4eDg49+gIeEhXyHhY+cn5OIrKCEc4qQhpKRi52RfY17qoSOk5iWj5yXh4ebpJ6hmZyFgpKamZiPmaafpJybj5V/jod0eoaNhKV7fI6QkYaZq6KelJ2QjqmNkICdjIiTmZ6Cj5d+h46Db3iGcnVgf4SQhnSMmYGDj4OHhX+FhJVueXZ0kqKKjIWahISMc3+JfHtxcXqGgnp3iI2DkaaPhYOOgIOKiYp3homLjX5ybYCCfW9pbG5oXnqAaX59d3Z3dnt4XWBxfm51YGNbXV9SZ25VZlteYmtpdnp/cmxtZGtqaIF/bHSCbGx1cHpwhnluh4B2goB+hXZxgo2Ifnt8fH97gopgaHtqdWlpgmRqY2BpXGN1aG9idW1sVWNxeWVwentzZWptbYuJnraZoKOfkpGVmIuan5+fe3ifp5Gci4ellYyZmXp7jYZ9iZGEjIKCg258gHlzgYV+i5J9a2h9gpeJgYiNe32GhIZ8j4KQnZ2TiamdgXGLi4yShqChioWMfKiRiZCSl5OWk3iMop6fnZWYfoCQmpiSi5mioKOYlZCZfIuCd3+Cjoagf36MjI98mKWiopOakZCmjI+BmpCJkpabfpOSfoeOgXV0gnF3YX6BjoZxi5d9iYxyjH+ChYaPaHhyeIyYkY9/ln6IiXKBhnt7b3d6ioN5eI+LgpWkk4qFj3uGhoeEdoOEiYl9aHN+gXp8cm1saF9+dGl9dnZ0fXOBa19gdHZwd2RjWV9fUmtpVmZaYGFpanZ5gnJnbGRsaGaAgWtufmhvcWx/eYd6bIyBc4GBfoF0doKNhn98e3+BfX+PaXKDbnRpYYdobGJfcVZ0b2xtYHhobVdqdHZjdXp7cmJqb3qJjJ6xkaWknI6Pl4+GnKCbnnx3paGOmICNo4uJmpZ5fIaIf4OJf4mCgX9yf3t0doOFfouReGdjfYaXioKKi3h8gI2DeZaClpmYjpehm39wjIKRk4alm4eMiYOmloWTi5aXk5J2kZ2foJeTlnl+jpeXjZaanKOcl5GTmXeNg4F2g5aNnX6BiY2Mc5ejn6KUmY+PooyKgpaXg5KVmX6YjXyIjYF2cX5ue2SAfIuFcIeTgJGCbIiDgYCJhWZ1b3uFkZiLfJN4i4h7f4Z7enB9d4iFeIOPh4qXoZWBg4t2iISDgnd8g4qGeGF6en91gHlobWZif2preHR0d35yfWNkYXNudXJtYVphXlttZVNkWWFhaWt1eYZyY2tjbWZofYJsaXVobnBqgH2DeW2QhnKAg4N+dHyDjIF/fnqCg358kG12iXN1bWWKbGpiYnVWhGlwbmB4Z2xianZwZnl8enFgcmyGhY+brZemp56NjJeHhp+Tl5l+eKqdi5l6l52MjJmQeXyBjH58hHyBg4F4dHl6dH2AhICJi4BkX32LlId/hIZ0fH6Lf32YhpeVmI2kopiAc4d7k5GJpo+MjoqToJKEkpCUl5GLgY+XnpqRj5Byf42Rk4icnJ6ll5aLk5Vxi4uJa4SXj5l6h4iPiW+XnpuklJaLjJ6LhoGRnH+SkpWGmYh7ioqBeXJ6bHVsfH+Lfm2Fk4OVd3CDhH5+i4Blcml7f5aXg36NdJCHgniGfXR2fnyEgHuBi4KLk6OPeIOBdImHfYB0doKJhXFifHZ7cn5wY3BkZXxjb3B3c3l4dHVidmBwbHZub1xcYF5ea15RXlljYWludHuKbGBqZWtjaHeHbmdtaWttaYJ9e3dvkIhzgISEfXSBhol7g316gYR9fY5yeot4eG1sh2poX2lyY4dncW9ld2dubGF5aWt9e3hwYXhti4CYmKmfpKidioqShoqdi5WZfnivmY2XfZ+UkZeUiHd+fIp9fIB3eICAcHV0fG+GfYGBin98YVx+j5GGgIOCcnqAh3qPkomTkp2Tpp2Vgn2BfY6KkaOJjoqNmJqNhpKZlJaOioiMkZuSjoyMbYSQj5GInpmioJaUiJWPbIaXgmWEmI6TeomEkIpwlpuVo5STiYuZjIF/kJ59ko6SjJmOe4qFh3NzdmxxbnV8inRvh5GPk3F1gXyBgYh8ZXBseXyZk3yDiHSQiYBzh3huf3yAhXuEioaBi5SnjHqGe36LhXh+cXCBh4VmaXp1dnF8Y19xYWt0X3Fre3p5bHNxZXleb2xzbXJYW19gYmxbUFhZZWNocnJ/iGddamlnYmdxjW9kamhlaWmBend1b46FdIGCg3t1goiFeIV8eISFen+Jd3+Le3tyeINqa19waHSAa3JvbXJnb2xlfGNugHp2cWx3d4p+opehp6Cmm4eLi4GPnIeTnXaCq5WTjoehjZaUkIB0fHeFeHl/cnN7hmtzcHpui3aAgYdvcFtZfpGNh4B/f3V0gYCAoIeSi5SemKKVmHmKf4GNiJydio+GkpiWhYmVmpCXjIyNjYubiY2Pgm2Ji5CQiZyWoZuXlISWhmiCoYFlhJyJkH6Lg4uBd5OZk6CTkomJlI1+fY6Xe5GMj46aknyKgIJvdnBsbW9we4ZpdISPmYtxd4F1goiDeWZybnWAmY57h4R5k5B5dYdzb4h6hIp5ioSAho2bood7g3WCi394eW5sgYWDX3R1dHJyeVtfcWFwa19wa358cW5ua212YXBva3FtWVliYWJvWFFUW2ZnY3VwhYNjXWttZGJma5JuYGdnX2hrgXVyc3CLgHV/g4B5doCLgHiFf3iIhneDhXyGi397dop/anFjfGOGfG5xbXRqaG9sdnhfcX95fHR1dICDfqSVmq2ep5aFjYR/l5SDkKB2jKCUk4aLm42Wjot6cnl1gnByhXRxdohscG52bYh2g36AbW1VUYGqlIaCd392cYN6g6GDk4KVlJmdk5t4kXuDjJKjmZOOiZWZkoSHl5mMlIuJjo+GnIOPiXtyi4WKjoecmp+alJN+knxmg5qFZoWfh5GEkYKJcYORmJCcj5CNjI+Md3uRkHqOi4ySlox8iHyAa3dqbmtsbHt/YXp+j5eCd3uCeIOMfXlnc2xzhpWLfYeFepOPcXmDb3WLeYiKeYh7gIqOnZyEe3p2got8d3FqbIKEe2F5cW9uc3RWX3BicmJgbW96cWlwZmdzdWlybGJ3ZV1XZmFhc1RRT11nZV55cIl9YF1pcmJiZmaRal9oZVtncH5wbHF0in12fIaAdXZ+jHl7hYF4iINzhoV+jIyEfHmVeGZyaoNgiH5vb2t6YGpudH91X3R9eYd4dHOFfXigj5mxnKWOgot/g5qIgIyfgIualI+FiJiOj4+Ed3R3dIBxb4V0cHKEcGtpd26Dbn19bXRyUk2C38iS1pN7cHWEdoWhhJR4l5KZnZGZe5RzhZCeoZOUkYqTnJSGf5eWiI2Nh5GMh5t+jYB3eox+iYyKnJucmpOReIx0ZYaPhWuHooSRiJaDhmOMkZmPlouXjIyKinF6lIh7joiKk5GJeYV8f218ZXNva2x6eluBeZCQgXp+f4CGjnt7aXNqc4qPiYGFhHyUimt9fm1/in2KhXyEeICNk5mYiXx1d4OPeHJtZ3GAhW5sdXBpa3ZvU19wZXBaYG1zeWhsa2NneHJwcWRgeGFgVmxfX3dRTkxiZ2NdenKKdl5dZXZhYmVljmRhZ2JZaXNzbmtxdox8dHqGgnV2fYtzf4Z/e4l/comIgZGLiHx+mHZlc258ZYh+b3BsgFlsbnl5c2B2enuNdnJ3ind5noubrpqgkIKFd4iVfnyKnoiGoJKPhYyYhJOPh4F0eHB5cW+EcG1vf3NlZXlxfW15fWpna2OkmsHcrvChc2x2hXeGpIaTb5iSlqKWnIGScoaLopeIjpaLkJ2Wg4GWkIWJj4CQiYiVfYZ6dH+Jd4eEjpyamJiNjnWJdWyEh4l8iaKDkYmchIVei5OYi5CJj4uLhIlte5aBfYiFiZGPhnaFfX5rfWR4dmpueXNYiXuSiIV6foGBhox/eWZyaX+JjYmCgX6LlYRrgXVtho+BjoJ9gXh+jpSRl490cneHjHVzcWd2eoRjdW5xY2t4aFJhcmhsVmBvdXphcmRgaX1wc29bZHJhYlduW115T01MZWdiXnd0im5dXWR5Xl9lZYVgY2NfWWpza25rc3eMfXR3hIF4d3uJcYOEfX6Ie3SLiYiWhox/fpdzZ3VyeWyMe250cYFXcXp2eXJkd3mGjGl2gIlyf5yGmKebo5KEfXGMlHd5jJ6FhaGNj3yWjYCaiIR7c3dwdGpwgmxqbXx1X2F4d3txdXtnYGR869q1ycPch3NsdIJ3i5yKj2uakZCelpSBiXGFiJ+NhIuWi4yYlHyNk4iDiZB7j4uFjoB/dXiDhHKIgpOclpSXhIt1hn1ugoCHhpihgpOMnoOJYYOUj4eKhoqOh4GHaXyTf32DhImOjYJxhn5/cXdodnNqdHdsWo19k4OFfYCEgYSKgnZhcmuHgY6JgX5+kZB9bYFrd4WOhJCBe4B7fY+RjpSIbXB5jIV0a3Fsc3mCYXVqcF5teGFSZXNpZlNgcXd1YXBgXWiDcXRrWGhpY2lZbldcdk1LTGZnXmJzdIZrXFxleV5eZGd7YWRfXVlrb2ZvanR4in5zc4F+e3Z6iHSFg3x/h3Z3ioaPmYGMgnuTdWx3dnl4k3RueHt9WHmGcX9vZ3h3koJkdoaFcIqWhZmhmqKKiHRvkoxxd4+cfouaiYl9oH+EmoCBeHJ0bm9kcn9pZm14eFxgeXt7cXGAamFnYX/Vto6RpnhvcXh9cZSSjohrm5CKnZOMhntph4uZhoGSkYaHmI58jY2BgYmNe4+MfYiEenN6g3pwhoCWmo6Tk4CHdIKEdIF9iJCbnoaVj59+iGKAk4eFiYWLjYCAg2d8kIB+f4KMj5B+bYN8gnRsbXd1dHd2bGOOgY+AhX59hn+EiX9wX3FvhHuOi4F7fpCIeXCDZXmBiIWKgHqEfH6SjY+Rgm1ueYt+dW1ua2x7f2RpbGtab3haU2pzaWJRY3N4bWNmXlprhG50YlxoX2VtYG9VXHBPSE9nZlxob3GAbltcY3NgXGNsd2VlXV1abG1jbWpzd4Z/cnGAfH10eIZ4hYJ9gIh1eYmBk5V8iYZ2iIFweHl7hJNvbnuBd16DgHSBbWl6dJRzZ3OIfHGSkYOZn5ughoh2dpR/bXeUmH+IkISLjpp9jJp3fnZycGxqYXV9Z2JqdXpbYHh8emxwf2VjZ2dXnY9fcXOWvcWFd3KVi5GAdJmNh52UjYhza4iPlYB7lIuBhJuMfIqGfXyJjH6Th3SHhXZ2fYFxdYaBnpWGlI6BgXF+hnOCeYeVm5aGk42dgIhmfpODgYaEiolygX1nfYt7eX9/h4uPfWmAfIN2ZnB5eHN3dGxrj4aLgot/eYOBhISAa15wdnp9i4eEe4COf35ygGh4gYWJhIF3gnt/lYqOi3xta3qJfHZ0b2lofndlXXJkWXF1VFRvc2liTmh1eWdhXl1Zb4FwdFplY15rbmFxUFpsUkRUaGJabG9te3BaW15tY1pjb3dkZ1xdYGtqY2xpc3eBg3Jvfnt/dHWDeoOCfIKGdn6JgZaReIOKdIGIc3l5fo2Qb297gXFqgnl6fm5tfHaVa2p4hHRrk4yFnpigmYWIb36Mdmp5mY+AgoqClpiKeY+Wb3pzcWxqZGB0e2lgZnJ7W2FyfXpmcHphZWSOsbJ3S2JapdrSmHN8ko2Ren+XjIWako2Gb2yFkpF5eZOGgISZinyHgHl4iYqDlX9uiYZxc317anmGg6WRhJKMgn5ufYF0gXaDmZeSipOPlIWIcHuThH6Eg4mDb4F4aICFeHJ/f4OKh3xlfH6DdWNxc4BpeXFvdZmNhoSLfHd5gIR6gmtcb3xyf4eDiH2Fh3qIcYBtcIKFjIKCcYN3f5aKjIN3bWx+hH92emVoan5yYVp4W1pzb09YcnRnYEtud3ZiXlxbWXV+c3BYZ15ma3Jfb09YaVM/WWdfW3FrZ3lyXFtZbGVaY3B5X2hdXmVsaGZsaXJ4f4dwboB9gXZwgnuAgX+Df3aBhYmXinGCjXF7hnx6eYSUjHVren9scH51f31vcnx7k3BvgX95ZpKKgqGYnZGDhmeHhHBnepeKf4CFgpqKgXyNjWl4cmxsZl9hb3ltYGNveVxkbIN6YXF2X2Rl1eu+izM6PouPgHJ5hoqQjniGmY5/lI6Nf25thYyLdX2Pf4WClYl8g3hudoeEgpV2bYeEa3V7dWV5g4SnjIOOi4J8bH5ydIF4g5qPio+Rko2Mh397koh5gIWOg2yAcmmAf3htfHyBioN4YnmEgnJkcWl/bnVydYKcjIGAhn90dn6Ac4FwW2t8c3iIgYp7hn98iHd5cGuHg4+CiHCAd32TiYp9c21qdoCAdXVdaWl5cVpXflRbcmZNW3NyZlxKcnlxXVtbWl52gHZpWmJbaGZvY2pOWGdSPl5mXV52Zl91cVtZVW9kWmVxeVtoXmBnbWhqa2lweH6ObWqChIB5boF7fYF/gnp1goGMk4VwgItud32Ae3uIk4mAaXt9a3R8coZ7c3Z9fox6eIR+fGuMjISbnZaMgoFtjX5saX+Pjnx+f4OUgn99iohrdXFnaWNbY2dzb2BhbHRhaHCJemFzdF5iY5ugkG5dNluwtnVqgIl+lId4iJmHdZCMindwbYWChnR5iXiJfZOIen9zZ3aIfXyWbm+FfWh2eW5leomFpYeAhoyJfW19dH1/e4qXhoCTkJiJi4WKfJCKcXx+hnxpfm1rgHt5anp3goeBcmB3gn5yZHJndoNudXuGlZKCfYKAcHd6fHV/bVdtfXVziYCFdoZ0gol6d3JtiICOf4NxfXt8kIeHeW5taG2CgXVuXWhndXJSXH1PXXJdT1xzcGRWS3R5a1hZWVpicoF2YV5dYWdkaWpmT1ppTkFiZFxgd2FddW5YWFN1Yltlb3NYal9iaGtnbWxpcHd8k2xohIp9fHB/fnuBf4J6d4CAiYuEcnuHb3F3hH97iY2PhGp+e254eXaKd314f4GHf4R+fnpthIyImKONhYR8dot6a22FiZN6fXuCkoCAfoqEcHJwY2ZeWWdfcHBgYWhwZmpviXRhdG9bYGRqdnt/v52opcm4coWEdJV+eomVhHSSjodyc3CEeoJzdYZ0iHeUiXl5cWR3hnl/kmhxg3Vmd3ZkanyEiJ6Cf36OjXxxfXKCd36QjoJ2lY2UkIiCiHuJimx5eoB1aHtpbH95c2l6doCDfWhgd4h9a2p0aHuAanaBjZGVf3x+fnF8d3x0f2JVdXtxcoeCgXuBcIaJd3hvb4KCi318d3x6c4yEgHVocGdsiIFycF1oY3RvTGZ3TV9vVlRadG5iUU91eWJSWFhdYnGDdFxiXWllZWNrZFJccUlEZWJcZHFeXXhoVldWeF5cZm5pVmxeYWpnZW9uaHB3epNuaYiMeX1ze355goGCfHZ9g4iGg3B2g3Nud4KCfoiLlH9xgHx4enqBi3WDeH6AgYKEeoB1b32Ki5ueiH6Ge3eGfGh1h42Sen+AfImGhHaPgGdwbmBlXFhmWW1zYWFhcWxsaIluYHNpWF5jbYB3qdqpyIeIs3KKeXGPdn2JkYF7lIuAdXR1fnZ/b3B/bYV0lIZ4dWxgeYB4h41lcYJuZ3VuW219gZCTgIB4kpF8d3pshXN+j4qDcpWKkY+IhoZ7f4ZtdXd/bWh3ZW18dm1rd3d/f3xgYniGemh1dmN+e2h1ho+Oln11gHZygHt9bYBaVXF8b3OBhX1/d2uIhnN4anR/g4J8eXt3enGJf3tyZ3NkbYuEbHNbamB2Zklvb01cY1hXVnltYlBTdXdZUVZYXmFyhXBdYWNtZWNeb2NVXnNHQ2dgXmdpXVp7Y1JWXXZbW2dsYlZrYGBuZmZscGhwdniPdGuOjXZ/dnh9d4GDgXt0fYOIiINvcX91cXV9hYGJjYt7d394hHx9hYd4iHx9gX2EgHt+cnZ4i46fjIl7ind1g3pefoeajXqHhHSGh4V3iXtibm1cYltbYVVqdGRgW2hvcGeHcWFxZldcY2t/fMrOh7qia25vi25yhXN+hox/e5OFenl0enV0empsdmOEdpKCdm9nX3yAeIqHZHGAampxY1hte4aciYOBcpeTdn16bYZvf4iKhnCWjpCIhoyEe3l/cnJwfmdocmNueHFqbHJ4fXx5XWV6gHhpdXlngndodYeMjpV9c4dqb36AeG59XVdvfGxzfoh6gG5uin9wdmZ2f4B+gHV6b3lyhXp4cWVyYG2MgWtyWGtfeV1JcGxPWFZfVVZ8a2JPVHZzUlJUV15jdYZqXWFra2ZjWm9iWWNxSEFpXWFnX1xVe15PVmZxWltqaF1YaGFfcmZqaHFncXN2h3lulYp1f3t4fnmDh4B1c3+FhY6DcHB7eHd1eYaFh4yGenx/dYt/fYaDhId/fn59hn98eHZ5dpKUn36NfYtudYB6ZISImIZ0kopvhYaCeoN1Y25qWV9bXV1VaHNlYFlkcnJngXJha2RXWl9pf3i+rnugt25idIdpdX1ze4WIe36NgHd4c3dvenZlam9hh3WOgXNqYl59d3iKgmVwfWdra1tWb3iLpIGFf3CZknF/dnOAbH6Aj4ZylIiNiIWJhX15dXNwaXpham1hbXZqZ2treXd6d1tnfXx5ZnJ+boV0ZnWGjYaWgHCLZ2t7gnRtdWJbbXpqc3qJeoBldIZ8bXBndH53fX5wemp5eX94dm9kbGFsiX1sblZqYXhWTGxtUFNQaU5ZfWhiT1V2bE1RVFVfaHeEZ15hcWlnYVdpXV1sakpFbFtiZVdZVHlaTldva1ldbGVcWmVjXnRmbGVxZ3NwdIF4cJmFdn9/eH98hYd9dXOCh3+Vg25zeXt7c3KFhoiJhHmBfXaPf32FiY6EgYN6fouDe3d8d3aanZh6ioOHanZ+fW2FhZWBc4+CcYaCf4KAcGZsZ1ddW1xbU2VwZV9YY3J1aXZwZGViV1tbaH9wb3KAc4plZnp/anZ3dXWFhniChXp3dHZua3pwYWhrZ4Z0jYRuZ15ffG55iHxnbHdmamRWV3Nwjqd9hHt2lpB0e3F6eGx5eo+DdZd8iIaEh4R9dXFzbWh1XW1pYG11ZGdnaXpve3NZZ4F2dWhwgXiCdmJ3hYt9lYJvjGtte4FxZXNlYGp3ZnB1iHl8YXWDdmprcXR6cHl3cntlfX19dnVtY2VgbIZ8bWtWamNyVExrbFBNT3BHXnxmYU5WdWVLTlRYYWx4f2ZeZ3NqZWBXZFhjcl5MTGxYZGJVVFVzV01Zd2VaX2xhXFtkZV93Z21ib2p0b3F+dXSZgXh/gHiAfoaEen12goN+mIVucnR8e3VxhYWPgoF6i3V0kYB8gZWOgYWEfH6Mhnp+gXZ7o6aKeYmGhWx1fHx1hIONe2+GdHqFfYKDdW5qaWVWXVtbWlNjbmVcWWJ0e2pobWhgYVddWmmAaWtwgGhtYml7emt1dXVwh4J6gX53dm57aGp5al9lbmiBd5CEZ2VYYXZpfYZ5bmlvZmZdVVhvaI+od4F7fJCOeHRufW1xdHiNfneUdIaDgIaJdmp0d2hpb1xtZV5uc19nYmp4aHttW22Dc3Rqb4F+endhd4WFepGGc4hycHp/cmNxaFttdWRucYZ6d2FzgHBoanh0cWt3dnN1YoJ5fXV0b2NiYmx9fGtrVWliZ1RMbmlQSFJsRWF5ZmJOVHJeSk1VWmZteHtmX21xamRdVmBWcG9XSlRpWGdeWE5WbFRLXXpgXF9sXV1bYmVgemhsYW5wdm5vd3V6mH13gIF5gICHhnp5eoN9gZOEcXR0f3p2dIWIkH6BfZFsc5WBe4KfhX+HfYB+hoKAint1hKyff3qIiIRscoJ6doGAgnVviG99gHSKgGpvbmVkWF9aWlpVYmpnXFpfdYJpXm1sXGFWWltrgWVydH1qal5teHdodXhzb4d8fn56dnNsemhpd2ddZHNneneSgGNjVGRvZoGEdXZmaGlhV1ZZaGSQqG9/d3+Kjnpwbntmd215inp2jnGEfn+Ah25kd3RlaGldbGJecG9baF9tdWV6aF10gG5ya3F7f3Z1YnWGjHyJiIB/eHJ1fnRhcGxYcHFhbm+CenNjcYBsYW17cGpneXdzcGSEdHh4dG9jYGNtc31qbFRpXl9VTHVkUUhXYkdjd2ZiTFRxWUtMWFlpbHd7ZWVucmZjWlheWXdmVEldZFhpWVlJV2VRSWN5W15fbVteXWJkXn9pamBudHhtb252g5d5coGAfX+JjIZ+dXaGeIaMfXR1dYJ5enqCi419f4WJanSWgXuKnX1+hXmAe358holzcY+ujHx8h5B+ZnGIenR+fXdzcIZtfH5tkHpjcHBiZV1lVlpZV2Nma2BdXXSGaFlwbVteV1lbbHticXd2bWNcbnR1aHZ3cm+GeX+Bendvb3RlaHRlW2d1ZnZ2kXlfXVNlZWqBgXN8YWJpXFRYXmNkkKVpeXSChZB3bG14Zndse4N5dIdygXl9eYBpZndtYWdhX2tgXnVrWWZdb29iemVbd3xrbm9weHl0dWVzg5OAiYOJenZvcn1yYXhjWW5uYG9wf3pzZXGAZF9udmpjZnh6cmxtgXNxe3FwYV1kbW99ZWlUaFlaVU56YFJLWllIY3VkYUpVblVKTFpXam1ze2RsbHRjYVlaXGJ3XFRLZF5ZalRXSFlhTkhrd1lfYW5bW19iY12FaWhibnh5bW9qdoGQeW6DfoCCkoiEgXZ1iXSLhnRxdnaBd319foyPgX+TfnB4loN9mZJ5gIB4eX5/c4eEc3CZont7f4mWeWV1iHpzeXdsdHB/bHl8cJJzXnBvYWdibFRbWldpZG1mXFxyiWVTcm1bWVhXYGx2Y2p1ampfW250cm11dHVrh31/gXx3b25sZGlwY1trcmR0do5zXFdUZGBxfn5wgFxhY15TWmFcZJOfZXJxhYOQc2tpeGtubnl5enGAdn9ze3p7ZGZ2aF5jW2FoXF93aFdiX3BoYXdhW3x2ampybnh0dHRpcYKWhId/hXZzanB8bWZ3V1tpbGFvcX94c2VvflthcXFiX2lvfGtqcn1wb3ZqcGBaZGtte2FnVGdVWFNReF1TUFlSSGR0YmFHVmxRSVBaVmxsbHxlbW9yYVtaWFptcVhTUGdYV2pUVUZaXU9Jc3ZZYGNuY1hhYWFejGpjZW16eWxvaXZ5hntrhH2AhZl8goR5fYhtj4Zxb3Z6fXSCgn2Lj4ODl3R4gpSFgZ+JdYGAgXR/gnCHg3Zvopd0e4aMh3tmd4tvbnxwZ3hxe2xzdnONa150b2JnZmtTXlxWaGJsbFtccYxkTm9tXFZXVWZpc2hjdGVlXlpwdm9xdnZ6bIh9f32Id5BzY2Rrb2Fcbm1jc3iHa1pUVmJjd3t8b4RcY15jVFtgWmOXlWNucIKFiXJpZnhtZHJ1cXpreXR1b3t/dl9nc2RcX1diZFlidWVVYGFtZGFxXV1+b2hpc3F0cXV2bG2FlIOKfIVxcmdufG9xb1JaZWlkcHJ/dHNibXVVY3JrXF5uZHtka3V8cHFxaW1fWGNpanheZlVkVVdRVm9YUldUUEhlc2BiRlhrT0lZVVduaWV8aWx5a2JXXFZcdWVUU1dpUlpnVVRJW1pQTnl3W19lbWpaYmFeXo9uYmdsenZub2l2dn9+bYSAfoaXe3+HgYp/a5OIcmd0gHt2gIN+iY5/jJNzfYqRhYefhnt/hoxzgIZzfYJ1bqSMc4KNjHd4bnqNYGV9cWd6dHltbXF3g2dkfG1jZ2doU2BfVWdgbG9cXm6OaE5qbGBVVlNvZ3NrZnhlZl5acnZuc3x5dG6Je4B3nHt6a2FlbG1eYG5qZXF5fmdaVlhfbHh6em6CXmFdaFZYYFhknIhia3CBhnx2a2l1a1t1cGp5aXVybm98gXNZa25gWV5WY2RZZXFjVF9iaWFibFpgfmtmbHR1b214dmxoho2AinuIbXFmcHtscWxhWF9nZm5yf3JyXmlsU2ZxZVZibWF4YW90enRpbmtqX1dgZmh1XGRWYlZUT1lnU09dT1BIZXBdY0daak5KYExZbWVgeGlvgGVgVV5UXnZcVVNhZ09eY1VUS11aUVp2dl1fZm1oWGNhW16OcWNoanhyc21ndnN5g3OCg3uIjn58ioiOem6QinRsc4J0f3+IhYeShJWPen2Mj4iRm4SAfI2Ecn+Bc3R3cW6Tk5OTk5OTk5OTkpKSkpKSkpKSkpKSk5OTkpKSkpKSkpKSkpKSkZGRkJCPj4+Pj4+Ojo6Pj46OjY2Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2NjYyMjI2NjY2Njo6Ojo6OjY6OjY2Ojo6Oj4+Pjo2NjY2Oj4+Pj4+PjoKAfnp6fX5+fX1/fn59fn5+fn5+fn+Af4CAgIGAgIB/gIGBgYOHjI6Ojo6NjY2NjY2NjY2NjZKSkpOTkpKSkpKSkpKSkpGRkZGSkpKSkpKSkpKSkpKSkpKSkpGRkZCQkI+Pjo6Ojo6NjY6Ojo2NjY2Njo6Njo6OjY2NjY2Njo6Ojo6Ojo6NjYyMjY2MjIyNjY2Njo6Ojo6NjY2NjY2Njo6Ojo6OjY2NjY2Ojo6Ojo+Ogn99ent8fn59fX5+fn5+fn5+fn5+f4B/gICAgICAgH+BgYCBg4aMjY6NjY2NjY2NjIyMjIyMkpKSkpKSkpKSkpKSkpKSkZKSkpKSk5KSkpKRkZGRkZKSkpGRkZGQkJCQj4+Ojo6OjY2NjY2Njo6Ojo6OjY2NjY2NjY2NjY2NjY6Pj4+Pjo6NjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Njo6Ojo2NjY2NjY2NjY6Ojo6Cf3x6fHx9fn19fn19fX59fn5+fn5+gH9/gICBgYGAf4CAgICDhouOjo2NjY2NjIyMjIyMjIySk5OTk5KTk5KSkpKSkZGSkpKSkpKSkpGRkZGRkZGRkJCQkJGRkZCQkJCPj46Pjo6Ojo6Ojo6Ojo6Ojo2NjY2NjY2NjY2NjY2NjY6Pjo6Ojo6MjIyMjIyMjIyMjY2NjY2NjY2NjY2NjY2Njo6NjY2MjIyNjY2Njo6OjoN/fHp8e31+fH1+fXx9fn59fn5+fn5/f3+BgYGAgICAgYCAgIOGi42NjY2NjIyMjIyMjIyMjJFtZmdnZ2dnfYWEhISEiF0tMDAwMC1GoaGhoaGhoJqZmpqampqKg4SEhIOEd2VnZmZmaFxDRERERENHZGhnZ2dnZZCioKCgoKVeKi4uLi4rSIWDg4ODg4OLjIyMjIyMjY2NjYyMjY2NjY2NjY2NjIyMjIyNjY2NjY2OhX19e3t6fX58fH59fX1+fX1+fn5+fn9/f4GBgYCAgICBgICAgoWKjI2MjIyMjIyMjIyMjIyMkWdfYGBgX155g4KCgoKGUxgdHR0dGTekpKSkpKSjnJycnJycnImBgoKBgYJyXV9fX19hUjQ1NTU1NDlcYF9fX19dkaakpKSkqlYVHBwcHBg7g4GBgYGAgYqLi4yMjIyMjIyMjIyMjIyMjY2NjY2MjIyMjIyMjY2NjY2GfH16enp8fXt8fn1+fX59fX5+fn5/f3+AgYCBgYGAgIGBgYGChYqNjYyMjIyMjIyMjIuLi4uRjo2NjY2NjY+QkJCQkJCMh4eHh4eGiZOTkpKSkpKRkZGRkZGRj46Ojo2NjYuJiYmJiYmIhYaFhYWFhoiJiImJiYmNj4+Pj4+PiIKDg4KDgoWKioqKioqKi4uLi4uLi4uLjIyLi4yMjIyMjI2NjIyMjIyMjIyMjY2Njoh8f3l7enx8e319fX18fX19fX5+fn9/f4CBgYGBgYGAgYCAgYKFioyMjIyMjIyMjIuLi4uLi5GSkpKSko2QkpGJh46KkJKTkYuPioqQiY+RkZGRkJCQkJCPj4+Pj4+Ojo6Njo6Ojo2Njo2Njo6Ojo6NjY2Njo6Ojo2MjIyMjIyNjo6NjY2NjIuLi4uLiouLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyNjY2NiX59eHh5fH18fX19fHx9fX59fn5+f3+AgICBgYGBgYCBgIGCgoSKjIyMjIyMjIyLi4uLi4qLkJCRkZGPhI6QkIaKj4WNkJCLhYeGi4qFiJCQkJCQkJCQkI+Pj4+Ojo6NjY2NjYyMjIyMjIyMjIyMjIyMjIyMjI2NjIyMjIyMjIyMi4uLi4uLi4uLi4qKiouLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjI2Lfnx3dnh7fXx7fX18fH19fn5+fn5/f4CAgIGBgYGBgIGAgIGChIqMjIyMjIuLi4uLioqKioqQkJCQkIqFjoiOhoaPiY2QkIiFhYWIh4WHj4+Pj4+Qj5CPj4+Ojo6OjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLi4uLi4qKioqKi4qKi4qKi4uKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIt+e3d2eHt8fHx9fX19fX1+fn5/fn9/f3+AgIGAgYGAgYCBgYGEiYyMi4uLi4uLioqKioqKipCQkJCPhYOMjpCOiYyKjpCQiIWIjYmEhomPj4+Pj4+Pj4+Pjo6OjY2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKioqKioqLi4uKioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMin58dnZ4fHx7fH19fX19fn5+fn5/fn9/f4CAgYCBgYGBgIGAgYSJi4yLi4uLi4qKiomJiYmJkJCQkJCMhoyJjoeFjYmOi4yLhImIh4iDio+Pjo+Pj4+Pjo6OjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKioqKioqKioqKi4uLioqKioqKioqLi4uLi4uLjIyMjIyMi4uMjIyKf353eHp8enp8fHx7fX1+fn5+fn9+fn9/gICAgICBgICAgYCBhIqMi4uLioqKioqJiYmJiYmPj4+Pj5CMjouPjIqPjI6MjY+KjoqLjomOj46Ojo6Ojo6Ojo6NjYyMjIyLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLjIiAfXh5enl6e318e3t9fn5+fn5/f35+f39/gICBgICAgIGBgIGEiouLioqKioqJiYmJiYmIiI+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pjo6Oj46Ojo6Ojo6Ojo2NjYyMjIyLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLioqKi4uLh4B8eHp6eXt8fHt8fH1+fn5+fn9/fn9/f39/gIB/gYGAgIB/gYSJi4qKioqJiYmJiYmJiIiIj4+Pj4+Pj4+Pj46Pj4+Oj4+Ojo6Ojo6Ojo6OjY2NjY2NjY2MjIyMjIuLi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKiYmKioqKioqKioqKioqKioqKioqKi4uHgHt5eXh6fHx6e3t9fX5+fn5+f39+f39/f39/f3+BgYCAgH+BhIiLiomJiYmJiYmJiIiIiIiOjo6Ojo6Pj46MjI+Sj5COjo6Ojo6NjY2NjY2NjY2NjIyMjIyMjIuLi4uLioqKioqLi4uLi4uLi4uLi4uMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKiomKiomJiYqKioqKioqJiYmJioqKioqKioqKioqKioqKioqKi4aBe3h5eHp8ent7fH19fn5+fn5/f35/f39+fn9/f4CAgYCAgIGEiIqJiYmJiYmJiIiIiIeHh46Ojo6Ojo6Ojo+MkJOQkI+Ojo6NjY2NjY2NjYyMjIyMjIyMjIuLi4uLi4qKioqKioqKi4uLi4uLi4uLi4uLi4uMjIyLi4uLi4uLioqKioqKioqKiYmJiYmJiYmJiYmKioqKiomJiYmJiYmJiYqKioqKiomJioqKioqKhYB6eHl5fHt6ent8fH1+fn1+fn9/fX9/f35/f39/gICBgICAgYSIiomJiYiIiIiIiIeHh4eHjY2Ojo6Ojo6Pj4+PjoyNkI2NjY2NjY2MjIyMjIyMjIyMi4uLi4uLioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYmJiYmJiYmKioqJiYmJiYmJiYmJiYmKioqJiYmJiYmJioqFf3l6eXh7e3p7fHx7fn5+fX5+f39+f35/fn+Af3+AgICBgYCChIeKiYmIiIiIh4eHh4eHh4eNjY2Njo6Oi42Nj5WPiYyPjYyNjYyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYR+eXt5ent7ent9fHt+fn59fn1+f35/fn9+f3+AgICAf4CAgICEh4mIiIiHh4eHh4eHh4aGhoyNjY2NjY+MjImKj42IjJGPjY2NjIyMjIyMjIyLi4uLi4uKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uKioqJiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJg355e3p8e3p7fX17fH9+fn5+fX5/fn9+f3+Af4CAgH+AgH9/f4OGiIiHh4eHh4aGhoaGhoaGjIyMjIyLiYyKiIeJhoyOjJCMjZGOjIyMi4uLi4uLi4uLi4qKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiImJiYmJiYmJiYmJiYmJiYmJiYmIiImJiYmJiYmJiYmJiYiIiIiIiYmCf3h7e3t6enx9fHx9f39+fn19fn9/f39/f4F/gIB/gICAgICAg4aIh4eHhoaGhoaGhoaGhoWMjIyMi4yOjoyKioeEiIuKjIuNjo+Li4uLi4uLi4uLi4uLioqKiomJiYmKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiomJiYmJiYiIiIiIiIiIiImJiYmJiYmJiYmJiIiIiIiIiYmIiIiIiIiIiIiIiIiIiIJ/eHp7enp6e3x8fX1+f35+fX1+f39/fn+AgICAf3+Af4CAgYCDhYiHh4aGhoaGhoaFhYWFhYyMjI2NjJCSjI2Ii4mJi4uLi4mLjIqMi4uLi4uLioqLi4qKiomJiYmJiYmJiYqKioqKioqKioqKioqKioqKioqKioqKiYqJioqJiYmJiYmIiIiIiIiIiIiIiImJiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIiIiIiIiIiHgXx4e3x5enp8fHx8fX9/fn59fX9/f39+fn+Af4B/f3+Af4CAgIKEh4eGhoaGhYWFhYWFhYWFjIyNkY+PjZGJjIaJjIuIiImMiYeNjo+NioqKioqKioqKiomJiYmJiYmJiYmJioqKioqKioqKioqKioqJioqKioqKiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4WAenl9e3t7enx8fHx+f39+fn19f39/f35+f4B/gH9/f4B/gH+AgoSHhoaGhYWFhYWFhYWFhISLi46PjoyLj4iHiYmMjYWFjo2KiYyNi46KioqKiomJiYmJiYmJiYmJiYmJiYmJiYmKioqKioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHhoaHh4eHhH55eX16enp7fXt8fX5+f35+fX5/f39/fX5/f3+Af39/f39/f4CChIaFhoWFhYWFhYWFhISEhIuLjI6MjI2Lh4mIiomHgoiNjoiKi5GTj4uJiYmJiYmJiYmJiYmIiYmJiYmJiYmJiYmKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIeHh4eHh4eIiIiIiIiIiIiIh4eHh4eHhoaGh4aGhoaGhoaGh4eDfXp5e3p5enx8e31+fn5/fn59fn9/fn9+fn+AgICAf35/f39/gIKEhoWFhYWFhYWEhISEhISEioqOjYmIiIqKh4iHiomIioiIh4qGi5GPiomJiYmJiYiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHh4iIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGh4J8eXl6eXp7e3t7fX5+fn5+fn59gH9/f39/f4CAgH9/fn9/gICAgoSGhYWFhISEhISEhISEhISKi5CPiYmJi4qHh4WHiYuKiYSLjYmOjYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiIiIiImJiYmJiYiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGgXt4enp4e3x7e3x+fn9+fn5+fX1/f39/f3+Af4B/f39/f3+Af4CChIaFhYSEhISEhISEhISEhI+Qj4+IiYuIhoeIiYuLjIuJioqNio6Oj4iJiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoaAe3h5eXh4enp8fX1+f35+fn59fn9/f39/gIB/gICAf39/gIB/gYKDhoiGiIaDhISEhIODg4ODkpKOioeKi4qLh4uNiYqJi4iHiouIio+SioiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhn96eXh4eHl5eXx9fn5/fn5/fn1+f35/f3+Af39/f4CAgH+AgH+BgoOHjo+PjoiHhIWFhoaFhYWSkI6KiYmIiImKioiIh4aKjIiHiYmOkJGNh4iIiIiIiIiIiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4aGh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWGf3l4d3d3eXp5e3x9fn9+f35+fn5+f35+fn+Af4CAgICAf3+Af4GBg4eOjo6Ojo6Mjo2OjY2MjZCQjomHhoiJiYeIiouIiYyJiYaKjY6PkYuIiIiIiIeHh4eIiIiIiIiHh4eHh4iIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhYZ+eXd5d3d6eXl8e31/fn5/fn5+fn5+fn9+f4B/fn+Af39/f39+gIGEiI6Ojo6Ojo6Ojo6Ojo2NkJGOi42JjIiIiYaHiYaIioiHi4yLjpCQiIeIiYmJiIeHh4iIiYmIh4eHh4iIiYiIiIiIh4iIiIiHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhoaFhYaGhoWGhYSEhIWFhoaFhIWFhX55d3l2eHl4e3x7fn5+fn5+fn5+fn5+f39+f39+f39/f35/f3+AgYOGjY2Ojo6OjY6NjY6OjY2Qj42Ni46KhoiKhISLiYeDhYSDi4mLj42JjI6QkI+NjYyLjY6Pj42NjI2Nj4+Pjo6MjYyMjY2KiYiHiImHh4aHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoeHiYqKiIeJi4yNjo2LiImLi42OjYyJiImMgHl3d3Z6eXh7e3t+fn5+fn5+fn5+fn5/f39+fn5/f4B/f4B/f4CBg4aMjY2NjY2NjY2Qj4+Pj46NjI6KiYuMjIeFiY2Lh4aIh4aHh4uNjo6Pj4+Pjo+Pj4+Pj4+Pj4+Pj4+Ojo+Pj4+Pj4+Pj4+Oj46Oj46Mi4uJh4eHh4aIhoaGhoaGhoaGhoeLiYeHiIiLjY2Mi4yLjY2Ojo+Ojo6Pj46Ojo6Ojo6Ojo6Njo6NjY2AeHZ4eHp4enx6fH5+fn5+fn5+fn5+f39/fn59fn9/f4B/gH9/gIGDhoyMjIyMjY+QkpOTk5KSjYyMjIqHioyKh4eJiYWCiouIiYWJjpCNjo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjI2NjI2LiYaHh4eHiYqLjY6NjYyNjY6OjY2OjY2NjY2NjY2NjY2NjY2OjIyNj4+OjY2MjIyLi313dXd5enp7e3p+fn5+fn5+f35+fn5/f39+fn1+f39/gICAf3+AgYOFj5KRkJGSk5OTk5OTkpKLi4uLiomMiouLiYuKhoeOjYiIjI6OjIuMjIyNj46Njo6Ojo2NjY2MjY2NjIyMjIyMjIyMjY2NjYyMjI2NjYyMjI2NjIyNjIyMi4yMi4yMjI2MjIyMjIyMjIyMjIyLi4uLi4yNjY6Sk5OSkpSRkJOVlZSTk5COjo6Oe3Z2d3h6ent7e31+fn5+fn5/fn5+fn5/f35+fn9/f3+AgIB/f4CBgoSNkpKTkpOSkpOTkZKSkoqJioyJi4qJjIuKioiHiYqKi4mKjY2Mj46Nj5KUlJOUlJOTkpGSkI+Ojo2NjY2Pko+OkZGOjIuKioqLi4qKi5CPjoyMjIqKioqKioqKiouKioqKi4yLi4uMjIyKiouLi46RkpOTk5SUk5STk5SUlJOTk5KSkpKSk5F6dXZ2eHt7e3p6fX5+fn5+fn5+fn5+fX5/fn5+f39/f4CAf39/gIGChIuRkZGRkZKSkpGRkpGRiYmIiIqMiYiJiYuJhoSJhoyKh4ySkpKTk5OUlZWWlZWUk5OUlJSUlJSUlJSVlZWVlZWUlJOTkY+QkZKQjoyRlZWVk5KSjo+QjYqKi4qKi42OjY6RkpCRkpKSkpGRkpKSk5OTk5OTk5OTk5OTkpOSkpKSkpKSkpKSj3h1d3l6e3t7ent9fX1+fn5/f35+fX5+fn5+f39/fn9/gH9/f3+AgYKEi5GQkJCSkpKRkZGRkZGIiIiIi4uJg4eLi4yMiIeHjYyNkpSSkpOTlJWWlpaVlZSSkpOTlJSUlJWVlZaXlpaWlpWUk5SUlJSVlJSUk5OVlZWUk5KTk5OTkJGSkZGSk5OTk5KSkpOSkpKSkpKSkpKSkpKSk5OTk5SUk5OSkpOTkpKSkpGRkZGPdnJ3enp7e3t8fX59fX1+fn9+fn9+fn5+fn6Af39/f3+Af3+Af4CBgoSKkJCRkZGRkZCQkJCQkIeHh4eIiIiFi4+KjI6Njo+OkJWUk5OTk5SUlZWVlJSUk5KSk5KTlZSUlZaWlpaWlpaWlpSTk5OTk5OUlJOSk5SVlZSTkpKSkpOTk5OTk5OTk5KSkpKSkpKSkpGSkpGRkZGRkZKTlJSUlJSTkpGRkZGRkZGRkZGRkYx0c3d6ent7e3x9fX1+fX5+f35+fn5+fn5+fn9/f39/fn9/f39/f4GDhIqQkJGRkJCQj4+Pj4+Ph4iKi4yNjYuOj42Mjo6RkpGSk5OSkpKSk5SUlJOSk5OTkpKSkpOUk5OTk5WVlZWUlZWUk5OTk5KSk5OUk5KTlJSUk5KSkpKSk5OTkpKSkpKRkZKSkpKSkpKSkpKSkZKRkZGSkpOTlJSUk5OSkZGRkZGQkJCQkZCRinN0dnp8fHp7fXx9fn59f35/f35+fn9+f31+f39+fn59f39/gH+AgYKDipCQkZGQj5CPjo+Pjo+Oj4+Pj4+Pj4+PkI2OjpCRkpKSkpKRkpKTk5OTkpGSkpKRkZGSk5KTk5OSk5STk5OTlJOSk5OTk5OTk5OSk5OTkpKSkpKSkpKSkpGRkZGSkZCRkZGRkpKRkZGRkpGRkZGRkpKSkpKSkpKSkpKRkJCQkJCQkJCQkJGGc3V2e3x8e3x9fX1+fn1/f35/fn5/gH9+fX5/fX5/fn5/f3+Af3+BgYGKkI+PkI+Pj4+Pj4+Pj4+Oj46Oj4+Pj5CQiI2PkJGRkpKSkpOTk5OTkpKSk5KSkZKRkZKSk4iFk5GRkpKSkZKSkpKSkpKTk5KRkZKTkpGRkpKSkpKRkJCQkJGRkZGQkJGSkZGRkZGSkZGRkZGRkZGSkpKSkpKSkZCRkZCPj4+Pj4+Pj4+PkX9ydHh8fHx7fHx9fX5+fn9+fn5/f3+AgH99fn5+f39+f39/f4CAf4GBgYqPj4+Pjo6Ojo+Pj46Ojo6Ojo+PkI+Pj4+GjpCQkJCRkZGRkZGRkZGQkJCQkJKCgpKQkZGOdYaRkJCRkZCQkJGRkZGRkZGRkJCQkZGQkJGRkZGRkI+PkJCQkJGRkJCQkJCRkJCQkJCQkZCQkJCQkJCQkZCQkJCPj4+Pjo+Pj46Ojo+Pj4+PeHJ2eXx9fHp9fH19fn5+f35+f39/f4CAf35/fn5/f35/f39/gIB/gYGAio6Ojo6NjY2Ojo6Ojo6NjY2Oj4+Pj4+PjoiQkZCPj4+QkJCQkJCQkI+PkJCPkIhwhZCPkHx1iJCPj4+PkI+PkJCQkJCQj4+Oj4+QkI+Pj5CQkJCPjo+QkJCPj4+Pj4+PkJCQkI+PkI+Qj4+PkI+PkJCQkI+OkI+Pj46OjoyMjY2NjIqDiYhzc3Z4fX58eX18fX1+fn5/fX5/fn9/f39/f4B/f39/f4CAgH+AgH+BgYCJjY2Ojo6Ojo6OjY2OjoyNjY6Ojo6Ojo2NiJCRkI6Njo6Ojo6Ojo6Pjo6Ojo6PjHNvio+KcniHj46OjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Pj46Oj4+Pj4+Pj4+Pjo+PjY2MjYyNjoyLi4mJiYiFhYSDgoKEgnR5fXp4dXJrZWltb2xmZmdncHNzd3l9fnl6e3x9fH5+fn59fn9/fn9/f39/gIB/f3+AgIGAgIB/f4CBgImNjY2NjY2MjYyMjIyMi4uLjYyMjIyMjIyGj5GRjIyMjIyMjIyMjIyMjIyMjIyNd217j4JzeIaNjY2MjIyNjY2NjYyMjI2MiomKi4uJh4KAh4iEgXt6gH57fXx8fXlzcnJycnV1cG1ramppZ2NkYV9bXF1eWFVXWFlTS0VJSkpLTE1PT0tgdHR3eX19eHp5e3x8fX5+fn1+f39+f35/f4CAgH+AgICBgYCAgICAgIGAf4OEhYSFiIuLjYyMjIuLi4yGiYqKioqKh4OOkJGNiouLi4uMiYmKioqKiouLi4dzbm+Ee3V2gIWDhIeJiYWCg397fHl6e3pzcHFxcW1samdsbWdlZmVmZGNlZGVkZWVlZWRkZGNhYV5dXFlYWFdUUFFSU1JTTU1KSUZFSEpHR0hHR0xOSWdzdXh6fXp4d3l8fHx8fn5+fn9/fn9/f35+f4CAgIB/gICBgICAgICBgYFnXmBjYWNucX17ent/fXd8fHZ4ent4eHpvcXt4eXt8e3h3e394dXd0dHZ1dXZ3dGJeZF9ha3FmaGtsbm9tamlpaGhlZWRkZF9gYWJgYF5dWVhaWltdXV9gX2BfX19gYmFeXl5eWVldXF1bV1dWUlRSU1NOUUpISUZERUhMTEhGR0lLSklNbXJ0eHp7end3eXt6e3x+fn1+f39+f35/fn5+gIGAf3+AgIGAgICAgICCgWdYW1pZXFtcY1xaXF5ga3FtcHBvbm5vbmtpbmxrbG9qaWtraWpraWZmZ2dnaGhiXWpsXWZmZ2VjY2JhYmBgXVhbW1dYV1RWUVBUU1NNSkxLTExOTk9UWFhXVVVUUlBQTU1QT05LTE1QUU9MTEpHSUlHSEhJSEhIR0ZHSElKSEhISUlISVZwc3V5ent5dnZ5enp7fH59fX5/f35/fn5+f3+AgX9+f4B/gICAgICAgIGBbFtYVlZWWVlaWVlYVVZoamxubmxra2poaGloZGVkYlxiZl9fYWNfXF9dYF1eWlpqd21ibnNqYVlZX1tYV1NOTUtLS0tMSUtNTktKS0tMSktQTEtLRkdHSUlGR0lISUZFSEdGRkVERUVEREVJSUlHSEdIRkZLTUtJSUlIR0hLTU1LTExMVXFzdnl6e3h2d3h3ent8fn1+fn9/f39+f3+AgIGAfn5/f4CAf4CAgIB/gYJoUlRVVlNVV1lZWVdXV1tbYWNfXlxbWFZWWVZSVFJRUVVUU1NUUE1KTU5QUk9NW2tybGFudXJmUVFTUFBOTk9NSk1MS0xKSktLRklJSkxJR0pISUlFR0dGRkVFSElKR0ZHRkZHR0hKR0dISEpMSkpLSUlISktLSkhKS0pISUtMTU9QUEtUdHN1eHp6eHZ2d3d6enx+fX5+fn5/f35+fn+AgYB/f3+AgYB/gICAgH+AgmlQUlRXVVRWWVdYWFpbVFRTUlBRU1FRUU9OTlBQUU9MTlBPTk5NTEtNTk5QTU5dY29rWWlzdXBTTU9QUFBPTk5PTk5QTk1NS0lISEpJSUlJR0ZHR0dJSkhJSEhJSEhHSEdISElISUxLSklISkpJSkpIR0pMS0pJSUhKSktMTk1NTU9RTFVzcnN3enl3dnR2eHp7fX19fn5+fn9+fn5+gICBgICAf4GBgH+AgICAgICBbE9PTlRZVVVdW1lXV1hOTUpKSUZKT0xKSkdJSk1NS0pMTUpHSUlJSktLRkJGSFViaGxvcG9tbFpMTE5NTk9NTk9MTk5OUFBPTE1MTk1MTEpJSEdJSElISElJS0xLS0pJS0pJSklJSUlJR0dKSUdJSUpKTk1OTEhJSklJSk1PT01MT1JOWXBwcnd4d3d0dHR3enx+fX5+fn5+fn5+fn9/gICAgICAgYCAf39/gICAgIJvS0pNTlFOTlVXVlZSU0lFQ0VFUkREQT5CP0RAQD5CREFAQURHRkVIRUNGR0hNWmdoZ3JubmhmZGBeXlhMSklKSUlLSkxQTk1MTU1MTU1NTElIREZGR0ZGRklKSUlLSkhMSklKSkpJSEhKS0tIRkdJSklLTU5OSktPTUxLTU1PUE5QT1BgcG9yd3h2dHJzdXd6fX19fn5+fn9+fn1/gICAgICAf4CAgIB/f3+AgICAgXNQUE5OUE1KS1BSUE5RQ0RCQUZRRT1DPT9FSDk6Oz0/PTxBRkA+Ojs+SVpdW1xlbG5rb21tbGtpaGtkU0dFRUZFR0dHR0pHSEpLR0NER0pHQ0RFQUFDR0hHSEdISktKSElMS0lISktLTU5MTUxMSkpMS0lLTU9PUFNRT1BQTk9QUlFNUGdwb3N2dXRycXR4en19fX1+fn5+f4B+foCAgH9/gIB/f4CAgH+Af4CAgICCdlRVUVFQT0xNUFBOT09BQkFAQkE/Oz48Pj8/Ozg5ODs7OkA6Oz48Ozs7PUtcaW1ub2pvbWtqbG1mUUdFREdJSEM/QEBAQUFCQUE/Pjw9PkFAQD8+P0BFR0dHSUtMTk1OTUxNTUpLTVBVU05MTlFOTk1OTE1NTk9OTk1LS05OTk1OTkxUbnBwc3R0c3Fydnh5fX19fn1+fn5/gH5+gICAgICAgH9/gICAgH9/gH+BgYJ4UVFSVFJTUVNTUVFST0BAPT4/PD8+QEE/PT45Ozo7Ozk5Ojg4Ozw5Nzk7Oj1IY29zbW5sa2xpVUM+Q0ZEQkNDPzs+PkBDQ0E/Pj9BPkBAQj9APD9CQEFDRUVFSktQT1BPTU1OTExMT1JRUFJOTExPTUtOT0xMTEtMS0tKS0tKTU1LS1xxcXF0c3RycXR4eHl9fn1+fn5+f39/fn5/gIGAgH+Af4CAgICAf4CAf4CAgXxSTU9RUFFSUlRSU1NOPDs8Ozs7P0BBQkA9PDk8PTw6Nzk6Ojk3OTo6Nzg6OTk9SmBzc3BoVD86Oz1AQUA9Ozs+PD08QEJDQT9BQkE9Pj09Oz0/Q0RCQD9BREJFR0pKSkpKTE1MTExNTExOVVNLTE1USVBKSU1KSUpLS0pJSEdKS0lKZnJxc3RzdXJydnl6e31+fn5+fX9+f39/f36AgICAf4CAgICAgIF/gIF/gYCBgFZMTlBQTlJRUFBRUU44PT88PDo9PkFAQT8+PkA/Pj48PT0/QD09PT9DOz09Pjw6Qmx9akA6Oz49Pj9AQUA/P0FAQEBBQEBAPT8/PTw6Oz09PD9AQUJCQUBCREZGRkdGR0dISUtMTExLTEtKS0lKSk1MTEpMS0lISUxMSklJSElLR01tcHF1dXR1c3V4eXl8fX5+fn5+fn5/gH9+gIB/f39/gH+AgYCAgYCBgICBgYCCYUtPT05OT1BPT1BQTzo8Pjw9Oz8+PkFBPz0/Q0NEQT89PkBBP0A7W25APkRFP0BBRF9kOz09Ozo9PkFBQD5AQD9BPz89PD48PTs7PD0+QUA/QD5AQ0NEQkRFSEVFR0hISEdGSUpJSUlJSUhKSkpKTEtKSklJSEhKSktMS0lLSkpHVnBwcXNzdHR1eXp7fHx+f35+fn5+f39/f39/f3+Af4CAgICAf4GBgICAgIGBgIJtTFBRTk9QTk5PUFBPPjw8PT4/P0A+QEA/Pz9CRkQ+PDw9QD04Ojptd0k4Ozo9PkE7SGQ9PD08ODo7Pz49PD07PEA9PTw8Pjs9PD0+QUBCQUBAP0JEQ0RFRkZGQ0VHSElJSEhJS0tMTUpKSUpNTUpLSktJSEhISEpJSktKSk5MSUlfcHBycnJ0dXZ6e319fH5+fn5+fn5/f35/f36AgIB/gICAgICAgYGAgICAgIGAgnZNTk5NTk5MTE5QT0w+QTw8PT8+QkM/PkFBQUJBQFlSPTw9SUxGRXV2Tjc4ODo7Pj9XakE7PDw6Ojs+Pz89PTk6Pjw9Pj89Oz4/QEJDQkJDQ0FCQkFCQkRCQkRCRENGSUdGRkhJSUtNSklKSktMSkpJSkVESUlGRkhISUpKTEpGRmdwb3FxdHZ1d3t8fH18fn59fX1+fn9/foB+fn+AgH+AgICAgICBgYCAgICAgICBek5JS0tMTExFSUxOTTw/PDw9PkBAQUE7QkNCQ0BDc3pKO1x/g396fHdXPD0/PT0+RWh0TDo9Pj89PEFTRD88OTtBPz4+QT07P0JAQkNCQENDQUNBPT0+QD0/QUFBQENFRUBAQ0JDR0dFRENGRUZGR0VEQEFHR0ZDRkRHSEpHQz5IbG9wb3F0dXZ5fHx8fHx+fn1+fn5+fn5+f36Af3+AgICAgICAgIGAf4CAf4CBgIF+UUhLTU1NS0pLTE9RQD8+PkFBQEBBR0FCRENFQUdyemtig4SDgoOAfV4+QENAQD1Kc3tZOj1BRUFAWWFHQz09QEREQUA/Pj1AQT4+Pj88PkBER0VAPkBBP0BDRkVDQkJDQEJEREJERUFCPkFCQkFCQEA9QUJDRENDQUNFR0E/PVZwcHFwcnV0d3p8e3t7fX9+fX19fX1+fX5+fn9/foB/f4CAgICAgYCAgIB/gIGAgX5SSEtNTUxLS05OUlVEQkBDQ0FBQkBCQ0BAQUFARW90fYKCgYN+fYR2TUFDRUA/Pll7gF0/Q0VJSklqZlFNRUNHRkdFR0VFRURFQ0E/QD4+QkZKSkdFRUdGRkpOTktKSUdHSEtMSUdHQ0REREVEQUJCQ0BDREVEREVERUZDQkFEZW9wcXF0dnV4e3x6fHx+f319fX19fn59f4B/f39/f39+gIGBf4CBgICAgH+AgICAfVJJSUpKSEpKTE9SU0dGRUdIREdIREA+PDs+QEVFaHN9gXx/hH55hXJDREVEQ1d1hoeHflhHSEpMTmlnW1tWTEhOTUhJSEhHR0hIRUNFRUVFRkhKSkZFR0lKTU9PTU1LSktKTU5LSUhHSEhIR0ZFRkZGREZIR0VFSEhGSEZIRlFubnBxcnV2eXt7e3p9fX5/fX19fX1+fn1/f39/fn5/gH+BgYGAgICAgICAf4GBgIB8UEhHSElGR0lKTU5OSkxJSUpLTE5KRkNBQkNGSkdge4B/d3+EhYOEiWxBQVZ0h4mHh4eIg1dITE1WZWRiYGVgTl9JR0dHR0ZIRkhFQ0RERkVEREhIQ0NDRklLS0xMTExMTElKS0pKSUlJSEpISEdISUhHR0hGRkZISklJSUlIXW9vcXJ0d3d6e3t6e319fn59fX19fX5+fYB/f39+fn+BgIGAgYCAgICAgIB/gYCAgHxNR0ZIRkVGR0dKS0pMTUxLTU5NT0tJSEhKS0tMTE5bfIKCg4OFhoaIhFZshYeGhoaHiIiHfFBMTWNqaWhjZmhnX0BAQ0NDQ0ZGRUJAPj5AQUFAQkQ/Pj9ERkhERkdJSklKSEhIR0lJSUpJSEZKSkpKSUpJSkpKRklMTEpKS0tmb3BzcnR2eHl7e3t8fH1+fn19fX19fn59f39/f35/f4CAgICAgYCAgIGAgICAgICAfU9GRkdGR0hHRUZHR01NTUtMS0lHQ0NDRElLS0xLSlSBg4SEgoKFhoaEgoaFhISGhoaHh4aKdUlNbXVtamlpaWtJOjw+Ozo8QUFAPjw5OTg8PD07Pjs4Oz9BQkBBQ0NCQEFBRERCQ0ZISUhISExNS0dJSk1NTk1KSktLSkxNU2xvcXRzc3d5e3t7fH19fn9+fX19fX1+fn5/foB/fn9/gICBgIGAgICAgYCAgIB/f39+UUZFRkdJSUdEQ0VGTk1MSklIRT85Oj5ARUhISklJZYWEhIR/gYKDgoODhIWFhoeIiIiIiYyPZlF1eHRtbW5vbEQ3ODk2NDc5Ozw6ODU2Nzc4OTc4NzU4ODs7Oz1AOzk5OT08Pjs8PUFDRUhKTUxMR0lHT1JRUFBOTE1NT1Fdb3BydHN1eHp7e3x8fn5+f359fX59fX5+f39/gH9/f4CAgICAgYCAgICAgICAgIB/f39RR0ZHSEpIRkVGR0hMTEpJSUdDQjU2OjxDQENHSUlohoSEgX6Bg4ODgoOEhomKjIyLi4mKi42KbXZ8hHFvcG9uSzI2ODczNTY4Ojg3NjU2NTY3Njc2Nzo2Nzg4OTo3NTc4OTc5Nzc2OjxAR0ZJRklGRUZPU1JTU1JPUFBSVGVwcXN0dHZ5e3x7fH1+fn5/fn19fX19f39/f3+Afn+AgICAgICBgICAgICAgICAgH9/flJISEhJS0lHSUpJSkpLREVIRUJANjc4OD06PUVDQmWFg4GAgoODg4ODhomLiomJioqKiouKi4uIcnN8cnFub25EMzY4ODU1NzY5OTc3Njc2NTo5Ojo6Ozc5ODk4NzY2OTo5ODg2ODY4OTtBPT4+QkE/QUtMT1FQUU9PT1JXa3FydHR1dnp7e3t9fX5/fn9+fX19fX5/f4B+fn9/f4CAgH9/gICAgICAgH+AgICAf39+VEhHSUlMTUtKS0tMSUg/QEFAPDo1Nzk4OTc7Qjo9cYSAgYODhISEhYaJioqIh4eIiIqKjIuKi42FbGhsb3l9Zj47Ozs8OTo7OTo7Ojo5Ozo5PT09Pjs7PDw6Pjs5Ozs8Ozw7OTo8ODo6Ojo5OTk8Pzw8QUJESUpNS0lLTFdvcnN1c3V4e3t7fHt9f39+f359fX19fn9/f35/f39/f3+Bf4CAgICAgICAf4CAgH+Af35URkVGSUxOTkxKSk1CPzo7PDo4OTk4OTo6Ojs/Pkh+hIKChIWFhYaIiYiHhoaGiImIiYuMi4qMjY9/ZmxveX5eRUNCQUI+QENBQD49Pj5APz8/QD9APT0/Qj5AQT9APz1AQEA+P0E8Pjw7Ojs6OTs/PTs7PT1BQUNBQkNBWHBxdHR0dnp7e3x9e31/fn9/fn19fX5+f35+fn9+f4B/f4CAgIB/gIGAf39/gICAf39/flJFQkFHSk5PTElHSzo4Ojs5Ojo8PTo7Oz09P0BCUoKCgoSFhIWEhomJiIiGhoaHiImKi4uLi4yNjY15cHJvdl1LTEhISEVGSEdFQ0FAQ0VEQ0FCQ0I/QERIRUNFQ0VEQUZFRkRFRkRAQj48QD49P0A+Pz4/Pj8+Pjo7PTxgcXJ0dHV3enp6fX19fn5+f39+fX19fX5/fn5+fn5/gH9/gICAgICAgICAf4CAgIB/f4B+UERAPUNIT01HRkJEOTc6Pjo8Oz4/Pz89QUBDREZXhIKDhIWFhoaHiYmIh4aGhoeJiYqLjI2MjIyMjI18c3JwWExSTEtLSUpKSklGRERHSEdEREVGREJISUtHSEdGSEdFS0lLSUpLSkNGQ0NEQkFBQ0JEQ0NERENAPTs9QGhwc3R0d3d5eHt8fH19fn5/f359fX1+fn9+fn59fn+Af3+AgH9/gICAgICAgICAgH+AgH9PQT49P0RMS0BCQkE5ODw+Ozw7PkA/QT5CQkdHSVmEgoOFhYaHiImJiIiHhoaGiIiIiYqMjY2NjY2MjYp5d3VvY1FOTE5LSktIS0dER0lJSUVGSUZGRUxMTUlKR0dISUpOTU9MTE5LSEZHR0VFQ0ZGRkZERUhIRkNBP0BMbHB0dXZ4eXl5fHx8fX1+fn9/fn19fX1/f35+fn5+f39/f39/f3+AgICAgIB/gICAgICAf1FBPz4/RUdHPTxAQDg4PDs7PTo+QD4/QENGSUlQX4GDhYWFhoaHiIiIiIiIh4eIiIiJioyNjYyMjYyMjoV5fHhyWU5NTkxKSUZKSUZLSUdLSklKR0dHS0xOTE1ISElKTVFOT05NT0tJR0lKSElESUhIRkZHR0lHQ0JBQ1RucHV3d3l6eHl6e3x8fX5+f39+fn1+fX5+fn5/f36Af4B/f3+Af4CAgICAgICAgICAf39/VERBQUJHSEI/OD9AOTo8OD0+Oz1BPj9BREhKTFVxg4SEhIWFhoeIiIiIiIeGiIiIiIiJjIyLjIyMjIyMjHlyYl1bUFBNTElHREhKSE1MR0tPTEtKSkxNTE9QTkhJS0xPUVBQUU9PSkhKSkxKTEZHSEdGRkhGRUVCQUJCXG9yd3h5enl5eXp6e3x+fn5/fn59fX19fn9+fn9+f4CAgIB/f39/gICAgICAgICAgH9/f39VRUNFRUdHRUQ7P0E7PTw5QD4+QEJHR0FHS0xQVnmFg4ODhISGiIiIiIiIh4eIiIiIiIqLi4qMjIyMjIyNf2BcV1dXVVFPTUxFRkdNUE9QV1VRUE9RU1JNU1RPTVNMUFNVVlJTUVBMSk1NTUxOR0dKRkZISkVERUVCRUNjcHV5eXp6ent6e3p6fH59fX9+fX19fXx9fn5/gH9/gICAf39/f3+BgYCAf39/gIB/f39/f1VGRkdHR0dIRj5AQj0/PT1CQEJCR1ZORk5QUFRYe4aDhYWEhYeIiIiIiIiIiIiIiIiJiouKioyMjI2PjIyLbl9bbWRIVVNTUks7O1NUU2B1XVVWVFZZWVJYWFJaZlBVV1pdUlRXUU9NUlFQUFFLTEtISEpIRUZJSUlISWlydnl4eXh6e3t8ent8fXx9f359fX19fX1+f39/f3+AgIB/f39/f4CAgIB/f3+AgH9/f35+U0hKSUhHR0ZFPz9BQUVBQ0dFREVMWFJNVFVWWFp8hoWHhoWGh4iIiIiIiIiIiIiIiIiIlJyMioqMfmGKi4uIcmFoWD1bWllUUj9AV1ZZXGRgVllicl1dV11aVkVRWVpbWV9UWWdSVlZYVVRWVE9PTUpMSklJTE1LT01Tb3N2eHl4eHp5ent6e3x9e35/fn1+fX19fn1/f39+f4CAgH9/f3+AgICAgH9/gH+Af39+fn5WSkpJSEdFRERCQT9ITUlNUEtJS1BUU1NYWlpcXHiFhIaFhYWGh4eHiIiIiIiIiIiIiImcnaCPiY5nO36MiYuMfHJzW15dXFNVU1dXVVtadYNZVX2QYVxYXV9XSVZdXVtbX1lIWVhZW11YWFlXUlFNUFFNTU9TUVFVUmFzc3Z3d3Z4eHh6e3p8fX19f39+fX59fX1+fn9/gH9/gIB/f3+Af3+AgICAf39/gIB/gHh5fVlOS0lJSEZCREBBOlBRUVdYUFBPUVNUVFhYWVpbboGCg4WEhYaHh4eHh4iIiIiIiIiIiJaanJeJioFuhomIh4SLgGlcXF1bVldVWFRSWFZjloBSZXJYWldfaFBgZltbWFxnYUdPWmhnXVtcXV1XUk9TUFBSVlZWVllabnJ0d3Z2dXh4eHt7fH19fX5/fn59fn19fX9/f3+Af39/gH+AgH9/gICBgYB/gH1yfX9/b3R8XVNQT01LSkVDP0A7UFBaWltSU1FQUlJSVlNWVFdfdXiAhYSEhYaGhoaHh4eHiIiIiIeIh4ORjomJiIaFiIiGfoB9YFRYW1ZUVlNSUk1QTUxmeltdVFlVVl1aTFRaVVNUXlpYV1dXemtYW1xcXlRRUVBJTk9XVlhbWmRwcnZ2dHR2eHl5e3t8fX19fn99fX1+fX1+f39/gIB/f3+Afn56eHd2c3V7f3+AgHRrf35rcnleW1ZVU1JPS0ZDREFNXoNsVlJTTk9RT1FVUlNSUlVjZHaAgoKDhISEhIWFhISDhoaGhoeIhn6JiYmHhoOHh4d6b3NaTU5RUU1PTEpLRUZJRkM/VGRVf1JRUU5LUVRRTU9ZUk1OUVNVVU1RU1JQT01MSENJSFJUVVpcbHF1dXVzc3d6ent7fH17fX19fn19fX59fn9/f4B/f399fX5+f39/f4B+e3Zzd31+fmR1fWlxdF9kXV5cWVVQTElMSWFsknRQUVNOUVJRUltSU1JRUlVUYnN7fH+AgYKBgX99e3uAf4OChYaHgoaGhoGEgYaFhnZhXk9GQUVFRERDQUVRQ0VBQz5DSUdWQEhOTEddaVBIRk5GREVGSUdIQkRIR0lLR0RCQURAT1FNU2RydHZ1c3R1enx7e3t7fH19fHt+fX19fn5/f3+AgIB/f3x8fX+Af39/f4CBgH12dHt/bWh8Z25xZmllZGJcWFNRUFVSc1dlW09PTkxRU1FVWVNVUVFUU09WYGtscnZ7e3h5dHJuc3RzeXh+f4OAg4OCgIKAgoGCbE9JQkI8PD5AQUBAP2tRS2BFRkhJRUI/R0xOR01RVUlBRT8/PD08PT0/PT9BQ0NAPz09Qj5KTkdVbnV0dXN0dnh7fHt8fHx8fX19fH59fXx+fn9/f4B/f39/enl3eHd2dnh7foB+fXt4dnx1YXhnbHBqbGpqZmBbUVJaXFleSkpQUU5LTFFSUVRWVVdRUVdVUFhbYl1hZ21tbG9rZ2BucmptbHF1e3p9e3h6fHx4d3hlREJCQj47Q0NCQkRCXF1Pe05PT05LTE1PT1FMS01XTUhHQEE8OTc3NTk5PTs7Ozg6ODo/PEJIP1xzdHV1dXZ3eXx8fH18fH19fX58fn19fX9/f39/fn9/f314dXZ6e3p3eXh1d3t8eXh1eXdjcWhpcG1ubW1oZl5PUF9dWklIUFJRT01QUU5RUlRWWFNTWVRPWVpbV1ldXl5fZWBdXnF2a15gZ2t3b29sam9ubmxmYllIR0hIQ0JHSUZGRkRNUlBhV1NYUVBTU1JVW09PUVZQTUlERj46OTY1ODc5Nzk6MzY1Nzk1PEM+ZXNzdnd3eXl7fX18fHt8fX5+fnt+fn19f39/fn5+fn9/e3d1eX18enh8fHx8dHd2d3Z1d2tuaWhxbm9vb2prYFZXXlpYTUtUVFNQUVVPTFJTVFdYVFRZUk1XWVpWWFhWWFldV1dYaHNrXVZhc2tiYV9eZGFfXllVUU5PT01JSEpMSklGQ1FQU1tXVFROUVNZU1xlVU9TVFJOS0lIQz9BOTk5ODk3ODg1NzU3ODU5OUdtcnR3eHl7e3x+fX18e318fn5+en1+fH1/f359fn59f358dHR1e3hycW9vbnR4cXJzeHZ1cWZkZ3JucHBxbm1kXV9fWVdPUFhWVlNUVk9PVVZYWFlTVVRMS1RWVVVVV1BTVVdUVVJdbl5STlpfW1ZZO0RWWFRbZkpMUFNST05NTk5OTEpGUVBVWVNUT0pOT1VTVFxWUlVTUk9NTElISEY/Pzw6Nzg3NjU5OTY3NjY1V3Bwc3d5ent8fX19fnx8fXx+fX15fX18fn5+fXx8fX1+fXxydnF4eHJ2dXFxbnBwb3B1dnRuamRkanBwcXJwb2ZlZGNcXVJUWlZXVVRXVFJYWFlZWVNVT0pHT1BPT01SSlBQT1BOTk9UTE1JUE9TVFUyPVhNSUBRPWNhUVNRUE5QUVBOTk1RTlRSUFNNSUxKT1JQUlJTVFFST0xNS0xMSENCQT06Ojg3NjtCNTU2Njpkb3F0d3h7fHx9fnx9fH19fX18e3h8ent9fX58e3l9fH18e3B1b3d1cHV0b3N2cHFxcHR1dmNqZ2VXaHRycnFuaGlocFZWVFVYVVdVUldWVVpZWFdVUVNGRUFGR0dIRkpESEpJR0VITEhLSEZMTVBNRy9FX1I+Mz8+am9hU1JRQEdUUVBRUFFOUU9RUExKTExPUE9OUFFRTlBPSkxNTUtHRUVEQjs9PTw5PUc2Njc3RG1wdHZ5e3t8fX18enx8fX5+fXt5dnh3eXl8fXp6dn17fHp6b3Fud3JwdnFtcHNwb3Bzc3N0ZmdgaFpXa3JzcmxtbWtuYWVQU1RSU1RPV1ZWWVlWUVFRT0A9Oz0/QUJBQ0BCRURBQEdIR0hFRkhKTUxFR0NPUkM4RU5TXWdUUVNBR1VQT1FRUE1NT01LTEtMTk9PUUxPT01ITExJS0tMS0dGRkVEPEFBPjtARTs8ODlTcHJ0eHt6e318fHt5fHp6fn58e3V0dXJ2dnp7eHpyfHt8eXltcW94cnF1bm5xcm9vb3Rzc3J1dGtnZ15lam1wa25xbWltY0xPT01RU0xUVVRYV1VMTEtJPDk4Nzs+QD48PUFAQj0+RUhHQ0VGSUdKSkBGQUFARkhFSk9IUVJiXFFQUk9TT09QTE1PTkxNTU5PTltXS01RT0dJSENISkxMS0ZGRkU/QkM+PEJHP0I/QWRwdHZ6enp7fHt6end7d3l+fnx7cXN0cHJzd3R4eHN6e3l2d2xxb3ZxdHRsb3Fybm5vc3ZydHNycmtsZW5zaG1ubWxtbGprSUxISE9RSlFTUVRTT0tIQ0Q9OTc3OT9CPjs/QkBAPkBESUVDR0dKR0lFQkI/Pj1DQkFHSURNT2JlUU1PTldLTE5LTE5NTUxMT05TZE5KTFJJSUlFQUhKTE1OSkdJR0JBQkA/RUZFSERLbm92eXl5e3t6e3p3dHh0eHx8eXpucXJtbm9ycnZyc3h8eHZ2bXBtc3B1dGxwcHJvb29ydnVyVlZucWdseYRqbXFybm5qaG9ISkNHTU1KTVBNUE9ISkQ/QT05ODo6P0I/PEFCQUFERUdLRkNISEdHSENDP0I/P0BBPkRFQ0tOUlRMSklNVEZJSUpMSktMSUpNTU9QUlBKR0NLR0NCSUlMTU9OSUpJR0NDQ0RISk1MSVlybXd5eHp7enl8dnJwdXJ0eHl2eGpxbmpsbG50dG10dXtzdHhyb25xb3ZzbnBvcnBvcHN0eWpOYGdzanR8eWdvc3FpcWhkcUdLREdISEdKS0lKS0RGQj0+PTo5OjtAQj89QUJDQ0dGSUtKRElJRkdHQ0M7QUBCPkBAQkVDSU1QSEhLR0hLREhKTE1ISkxISUpMS01dUkhIRE5GQUNKSk1MUE1LTUpLRkdHSk5OUU5MYm1pdnZ3enl7en1ybWxza3B0dHR1aHBtamlra3RwbnR0eXByeXRvcnFvd3NvcXB0cnBydXR5a05WbXVscXt2aW5vaWt0Z2RvRktERkVHRUZGR0RHQkNAPjw9OTo6OkBDQD5BQ0RFSUVJSkxGSEhHRkZDQjtBQkM+QENEQ0RHTE5IS05IREhFSU1OTUdJTEdGR0lJTE5LSUdFTkhCRk1LTUxPTU1OTUtISElPUlJTTlJmZmZxb3N4dXt5fGxoam5la3Fsc3BmbWxoaWtsdG1wdXR3cW94dG90c3J2c3BxcnRzcnR1dXZ2WFZ1dWtvdHJrb3ZsaG1lX3BHSURGRkVDQ0NFQERCPj8+Ojs7PTo8PkNBPkFDRUZKRklITEhHR0dGRUNAPUREQj5BQ0NDREdISUdNUEpGRkdLTk9LRkhJRkVERUlKSEpJRkhPS0RJTEtPTU9OT09OSkpJTFJVVVJPV2RgYW1ncXJvcnl6Z2VoaGRpbGdxbGZsbWdpa2xzbHB2dXRwbnZyb3Nyc3V0cXNzdXRzdXZ2dnl2dXR3bGp1dW1ydnFsbmxlckxIRUVIQ0JBQkQ8QkE+QT06Oj0/Oz0+QEI+QEJER0pFSUZJSEdGR0VDQkFBRkZDQkJCREVER0dJRkxRTElPSkpNTElHSEVHRURDSUlIS0pHS1JNQk5OTFBOT09NTk9LS0tPVVdWVVNYX15caWFtaW5ocnNiZWZmZGhoZm5qZm1taGtrbXJpcXZ0c3Ftdm5vcXJzd3Nyc3R1dnZ2dnd2d3d2dHd1anN1bnV0c3FyamtzTUdIRkhCQkFERTxBQEBDPDg6PD45Pzw/QkBAQERGSEVIRkZIR0ZGRENFQ0RJRUNHRUJFR0VGR0dFSk1LSFFNSktISElFRkhIRUNJSUlLTUtPU05EUVJPUFFOT01OUE1MTVNXVlhYVVhdWl1kYGliamlna19lZWZjZ2dna2dna21rbWxwcmh0dHVyc252b3FwcnR4cXNzdXZ1gpF5dnZ0eHV1d3htb3VvcnN1cXFpbnlNSEdISEJCQkZFPD9CQkQ8Nzs9PTo+OkBCPj8/Q0VGREZERUhFREVDREVGR0pFRUpHQ0dIRkhHRUNGSkpHTktMS0hKTEZJSUtIRUtLTE1OT1JUT0hTVFNQUk9RTU5RTk1QV1pWWllWWl1aWGFgYWBeaGVjYGRmaGdqaGhpZmhubGxubXFwaXV1eHJycHVwcHBydXZwdXN1d3V7fn14dnR3dnZ2eHBsdXBtc3RucHJyeE5ISEdJREJDSEU8QEVCRT04OT4+PTw8QUI8Pz5BQUZDRkNESURERUVGR0dHSUZHS0hESUhHSUdGREhLSUdLSE1LSktMSExLTUtJTUtPTk9SVVZPS1VWU1BTUVJMT1FQT1RZWllcWllbXl5dYGJeXGFja2JgZGZncoVoZ2lmam1ucG9uc3JqdHV4cnNzdHJucHF2cnF1cnV1c355jn11dXZ2dnZ4cmh1cWtydGxxdnB0TElLSUtGQkVHRTxAR0NEQDo8P0A/Pj9CQTxAPkJBRkNFRUVJRUZFR0ZISEZISElLSkZKSEhLSEZGTElISEpHTExNTExJTUtNTU1PTFBQUVVWV09LVlZVU1JRUkxPUlJQVltbXV5bXF5eXmBgYWRdY2BlZmBlaGpkc3Nmamdna29ycW9zc25zd3dxdXZ0c21vcnVvcnNwdXJ2cnSBdnV1dXd2dXd0Z3Rya3Fya3J2bnZKS0xKTEdCRURFPEBGRERDOz8/QUBAQENBP0I/QUNIQ0ZGR0lGSkZHRElIR0lISkxISEpKSUxKRkpLSElLSkdLS01NSkpNTE5OTVBLT1BSVFhWTU5UVVRSUlFQTU5UU1JXW11eX11dYF9gYWFgYWNlYmRoYmRpamd2i2xqaWdtb3NxcHFwcHJ5dnJ1dXRzbW1zc21xcm90dXRycHN3dHV1d3Z1dXRlcXNrcHFqcnZud0tNTExNR0NDQUQ8P0VFRUM9QUFDQkNDREFDREFBRUdDSEhJSEdKR0NISUdISkZJTUhJSk1LTkxHS0lIS0tOUUtSUU1TTUtOTk9QUE9UT1dYWFtOU1BXXFpSV1BOVFVUVFhaX2JiX2RhXmBiXmBlYWFjaW5nYmloaG54dmxoaW1vc3JwcXJycnZ0c3Vzc3Nua3NxbXByb3R2cnFxdXZ1c3d5d3V0dWNtdGtvcGpxdG93TE5MTExHRUFARD4+REVGQ0BEQkVEREZCQ0VHQ0NJRkNJSkpJSUtHREtKR0hKSUlMSEpKTkxPS0lMSEpMS1pmSmRcS2xTSE9OX25Va3NbcXBid2NTUGF2dWh1Y2F2YFhucWJkdmluemZbbHRgbGpUX3d2aWpnaWZnbG1qbW9qbW5zcnBycnFyc3Jzc3J0cm5sdG9ucHFxdXVxcXN0dnZ1dXl3dXR0YGt0a3Bwa3FycXlMTkpKSkZDP0BCPz1ERUZEQ0RDRUVERkJGRkdERUtGRkpNTEtMTEdHTUlHSktIS0tJS0tOTE1MTExJTE1MW3NiZHBebG1VTU5mc11mZnFsbnRncGlfYVlubmJwcGJrampmb3F0ZXRub1xvdWdwTUpxeXZrYWBrZWVteGxrdm1ucHNycHJxcHFycXJycnRybW1zbm5vcHN1dHFzc3R1dXV0d3h2dHRibXVrcHBscnJxektMSUhHRUQ/QUJAPkNGR0NGQ0ZFRkVEQ0hISERFS0hHTE5OTE1NRkpOSEpLSklMS0pKS0xNTk5NTUpNTU5bcm9vbnBwbGtNUFFsV01pYnRycGFtbnVcWWxQXG5tWnFta29teHh0c2lwXV9ya3FqVXV5eG9jXmtmYmdwb2pqb3BwcnNwcXBxcXJycXFycnRsbXJtbm5vcnV0cXRydHV1dHV1enZ1dGVudWtwb2xzcnJ5SUtHR0VFRUJCQj5AQEZIQ0dESUZFRUJGSUhIRUhMSkdNTU9MTU5HTE1JTEtJSk1JS0pKS09QT05MTE5OTFxoZHVdbHFXbE5QUW1UWWtea2x2YWxkc1NlY05tWWxcdHBraWx4and1aHBdXnJraFdiY3d8b2NgZ2dhZGl0eWtubnFzc3BxcHFwcnFwcHBydWttcW1tbW9xc3Rxc3J0dnZzd3Z6dnV0aG91bHNvbXNydHZITEZJREVFQ0FCPUJBQ0ZESEdMSEVDQ0hLSUhGSkxMRk5MTFNSTEdMTEhOSklITkhKSklITk9NTkxKTk1KWnNwcG9xcW1sT1FSbllya2dvb3Fxb210XW5YYXRfbm9wb3Fyb251c3R0altedGN3eHJqbnpoYWFjZmJiaW10dXBzdXZzcXBwcW9xdHt/fn13bGtxbmxtbnByc3F0dHN1dXR4eHl4dHVrb3VtdG9udHN2c0hLSElCRUVFQUE+RERCR0RISU1JRkNGSkxKR0ZLTkxGT0pLV1JLR0tKSk5JSEpMSUtKSEhLTU1NTUlLS0tTa2NbaV5faWNyclpfWWpuX2VlVWtfY1thYVFgbGhdalxuaWlkW3BmZHBdWlxrW21xY3BzbGRnY2RnYGBrbXFwbnR5cnVxb3BxbnmFiIeHhoWAdnNua21tb25xcnR0cnR1dXZ5eHhzdW5xdW52cXF2dHdyR0dGSURFQ0ZBQEJGRURHQkhKTEhGQ0dLTElFRkpPTElQSUxbUUpFSEhLTUlISkpLS0lISUZLS0tMR0hLS0xNTUxKS01OVFtcVFBUTFBPTk9PVlFPTlFOT1FKSk9QUWRxaVRZV1xbXFZZW11YXVxcY2ZhYWViY2ZfX2ZrbWhtdHlydHJvcHB0hoeGhoaFhYaHg3pwbW1sa3FzdHRydHZ0dXl4eHV2cXJ1b3ZydHN1dXNHQ0RHRUVBRUNAREhERkdDSUtMSEZER0tMSUVHSVBLTE9LTFdMSUVFSElKSElLSU1KSEZHR0lISElFRkxJSkxPTUpQXFdeUFxbYF5NWFlTXFxiXk1YWk1YYVJLWWFaUl9kXGFYW2RkVlZYXFlaWFxWWVxdYl5kYWFfZWhrZ210dHFxdHBxcoGGhoaFhoWFhYaGhoR9cmtpb3Jzc3N0d3l5eHl4d3h0cnhyeHNxcnVydE9CQ0RMTUJEREJFSUVIR0ZLSktIRUZJSktGRUhIUEtNTUpNUklHRUFIRkpJS0xKTUpIRkRJRkRGR0VGS0hDSk5MTFVfWWBYYGFbYFRYWVReXlpfUllcUF5cWU5eXF5TWl5jXlpdYGNgWV9jW2BeW1RYV1leXWNiY2FjZWhla3Jwb3Bwbm93hoaFhYaCe4CFhYaGhoaFf3VxcHJyc3Z5eXp5eXh4eHZyeXZ4cnF4dnV2YVNKSk1JRUNCQ0dIRkhHSEtKSklERktLS0VGSUpOS05LSExOR0hFPkdHTElLTEtLS0lHREhEQ0RFQUZKRUFLTEpPW2NZX15hX1JUUldfYFxdWV5RWVxNVl9XS1FZW1BaX2FhXV5jYWBiYmJjY2VaUVhVVVxZXWNgX19jZGJob21ubGxsbHWFf4SDeXV8hIWFhYaGhYWGhoN9d3JydHh5eXl5f359eXV5dnZybnp3dnhZUUtGQ0dFQkVISUZHSEhGRklHSEdJS0lMRERLS05NTEtIS0pISUY/R0dOS0tLTUtLS0lGR0NEQERBSElDQEpLSFBdYVpbZF1fVFFSWF1cXFxfWktXXExSXFlJTV5RT1xfYWNjY2NiXGRjYmRjZlhRVVRRW1daYF9dXmFhX2Rsa21qamxudn51gXp8hIWFhYWFhYaGhYaFhoaGgnpyc3V1e4WHh4eGhYSBfnhwend2eFxSTUNASUZDRktKRkZGSEdHSUdGRklMSk5GREtKTU5KTElLSkhJRkJISFFNTEtPTUpLSUdHRUQ/RUNJSUNDSEdFVF1ZXlhfWV9bXVVYWE9dXVFLSlZeWF5bXVVZYFJRX19iYmBgYmJgY2JhZGRiWE9RUVFaUlpdXV1dXl9fZGhnbGpubnB7e3x+e4CCg4SFhIWFhYWEhIWDhISHh4FzcneFh4eHh4eHh4eIh4WDgHx4XFNLQ0FIRkRHTVJIQ1FKRUdISEVGS0lNUEVGSUpLTkxMSUtMSUlIREhLUU9NTVBMTEpLSElDREFFRElHQ0NIRkRXVUVcVF1TVl9YT1RVTlpaTUlKVGBhW19YXl5hXU9ZYVxgYF9iY2JdYWJXYF9UUE9PT1dRXFtbXFxeX2JmZmVsZW9vd3x7gHt9f4CEhISEhISFhYODhYKDgoWFhnpvgYaGhoeHiIeGhoaFhYSFg35JTkZERkZIRElSYlBDVl5JR0dIREZNS1BQRUlJSktOTEtLTEtJSkdFSk5RUU5PT01OTE1IS0FEQUNER0VDQ0ZHQk1IQktLT09OTEZNRkdJSkhHTExNT1BJTE9QT1NPTFBTUlVaWVdZWFhkV09TVFBQTk1OVFJaWFhaXVxgYWRlY2dja2xwc3J5eX97en+EhISFhISEhIKEgH57gYOBfXuFhIaGhoeHhYWFhISEgoGAfUtJRUVIRkdES01dTEdHWExHSEpIR01MUVFITEtLS05NVU5PSkpLR0dLUFNTTlBPTk5OTkhLRmBFRF9MRWdkRk5cSV5bcm1PTVVtWUxEUGBVa1dnSl1XVV5ETFFVTExTVlFSVFhXVFhVVFxVUGZaaGhkWFJqUlZVVFtcW2BgYWJhYmBmaGZua2hyenx9foGEhISEg4ODgX18enJ7gXp7f4KAg4SEhYWBhIWBg4N/fnp7TElGR0ZIRUVLT1NJSkZgVEhJT0pJT01SUUtNTExPUlVST09JTE1HSE1RW1lPUFBOT09PSUpRf1FJfFlZcnRZUW1IcW5vYVZQcXFzUENrc21xc3BTb19ablhdVlxYVWtoVV1WY1pgWVtfVlZYf2p0dXVeX3ZeV2FbW2ZbX2BhYGFdYGFnbXBsYHB3dHiBgYKDhIJ/fX+Adnh6bHZ+dHh9gHx+gIGChHyAg3p/gX9+d3dOSkVITU5CRExMR0lLRVJWTEtOSUtSWFdRTU9PTFFUTk9RT0tLTkdNUFNbWlNRUk9QUFBKSFp4XVR4ZWhaU1VSdmd0bHBibmZqUXJPTXdtanJwc3Jxcm9vb4BdZXp1eHFxenF+c31rdX1iUmh8ZXNzb3Jye3xvfnhugHJfYGBiYVpgX2drbmtibGZnbXd+gYCCfnt4d4B0dnppcn5uc3x+d3h7foCDeHyAdXx/fHxzc05LR2BdR0FFTU1ISkpHSlBPTU1KTlZeWVVMUVNOWFpNU1NSTkxPSFFSVFlXVlBUUFBQUUtIZ3hsY3hybVtLTlZ5cHVtdWJvdlBlZUpmdnFtd2+AamZ4d2lXclFoem1panp6fmx4en9vaG9ZdnZqdnVwgF9yZn1pbHh8b15fX2JhW11iZGdpamRnYmNkbGxwcHN0c3NzeXFyeGJsdWdxeXtzcnV5foFzdXpufH15eHJuTktTdU5DQkZQT0hKS0lLUE9PT01QWmBaWEtUV1BhXlJWUVlSTE9JU1RVWFdXUFVQT05SSktyb3V1cXVxZGliV25McXBeRmh5V3ZUTGl5fXhgeXtzbmFdbW9jUmhxdW5teXB3bHZ0dHJsbl10fnprbXl8a3RsfGtwdnV4Xl9fYl5cX2RkaWdoZWVeYWJpaWlqa25va3FvbWpwYWNmY293eG9tcHN5fm5xcGt7enRyb21MTFtWSEdFR1JQSUxNSktQUVBQUFBXXFhVTVVZVWVYUlJZXlNMTklUVFdXWVdPU05OTlFJUm1IaXdLYGR2dlZYbE9ubHtzYWpnf3ZVTFdraH1sbWx4X1pwenteYHpzY3JveHFoZH1pcnxeVUxsYHZ1a2l1e3ptfnhrfHBcXl5iW15hZGRnZWVlYlpjY2lra3JzcnZnbGloZGdhYWthZ3NybGdsbXJ8a21oa3t0bW1rbU9IS0tISkhIUVBMTk9MS1JSUk9TUldSVlRQV1pWVlRUVGFfUE5NS1RTVFFWVk5OTE1PUEtIUU5QVUxLTFNUVFNUUFZVUVFOUVFYWVJOUFVUWFhYW1tVUlNXW1dYWFpPU1VXWFhSXllXXlZUUFlSV1dXV1heWmdyXltbWVxdX2NaX2NjZGZkY2NiWmNiZ2ZlbW5tdWVlZ2NhZl9dZ2BkbGhmZ2tocHpoZ2dqdWpoZ2lsUUlLTExNS0pTUU1RUE9MVlVUUFRVWFVZVVFaXVZVVFdVWVdPT0xNVlRRTlVTTk9NTFFQTEpSUUtRTUtMUFNVU1FSU1NJSExOT1FSUVBRVFZSWFdcV1NSUFJUVVZTWlFOU1JYVlRZVlVaVlRSVVNUVVdYVlxZXmBdXFpaXFxfY1tdYmNkZmRkZGFZYGFjYWJoaGltYmFkXl9jXVpkXGJtYV5mZWZtc2RpZ2prZWRjZmhQSktMT09MTVNQTlNRUU1YV1VUVVdXV1pVU1xgVldWWVVYU1BQSk5XU1BOVVBOUU5MU1BNT1VTTlJOTU9RVVFVUVJUVU5LTU9RVFRSUlFWV1VZWltZU1VSVFdWVllbVFBUVVhVVVpVV1pWU1JXVlVXW1haX1xVWF5cXl1bXWBgXVtiYmNnZmVkYlhfYWJeYGdkZmVhXl9dXV5aWl9aX2dgXl1dY2hrYWdmaGZkYGJjYk9MTUxRUUxPVE9PU1FPUVtZV1dYW1lYWFZdamRWWFlaV1ZTU09KTlZUUE9VUFBQTk1SUlBSWFRRUU9NUFRWT1hSVFVVT05NUVNWVVRUUlRXVlpdXFpWVlFRVlhWW1tXUVRWVlZWWVRYWFZTUllXVlpeWV1fXlVeXF5gXFtfX19eWmJiZGhnZGRiWGFgYl5eZmNkYGJdXFxcXFlaW1hbYVteXVxfYl9fYmRlYmRfX2BcUE1OTlJRTVJST1NUUU9VXFpaV1tbXFlaW2RxbWhkX1tYVlVXUUxNVlNNTlJPUVJPTFFTUlVaVVNQUE1RWFdSV1NTU1hNT09RVFhWVVVTVVhYW15dW1tWUU5VVlVbXFdSU1dWV1hWVFlbVVRSWlhXXF5aXl9gVWFcYWFdYGJfXGBdY2FjZ2hkZmBZY2BhX19lZF9gYltaXFtcWVpZWFdcWlxbYF5fW15eYWBeYlxZYFtRTk9OVlFQVFFPVFRTUFdcXFxYXlxeV1xeanF3eYBjXFtVVVdQTU9WU05RUU9SVFFMUlRUWVtXVU9ST1NYV1RTVVJSWk9QUlJWW1ZXV1RWWlhcXVtbXVZTTVRVVVtcVlJVVlZYWVNVWlxVU1NdWFpdXlxgYGBWYVtjYl1hZF5cYmFjX2NmaWRmXltkYGFgYGNlX2JeWVpeW1xbWVhZVldaWlphXF1bXVxcWl1gV1tbWlBPT09ZUFVUUlFXUlRQW15eXVtgXGBVXF1oanJ9c2xnXFRXV1FPUlpTUlFUUlRVVEtSV1ZbWVpTT1NRVlZXVE9XUlNaUlRUVFhdV1hZU1hcWF5dWVpdVFVOVVZXXltYUlVVWVlZVVdaXFZTV15aXV1gXWJiXVlfW2VhX2RkXl5jY2FeZWZpZGZeXWRhYGFhYmRgYl5YWl9bXFtYWFhXV1tZW2BcW1tcW1haW15WXlldUU9PUlpQWlRVVlZUVFReXmBeXmJcYFVdXmJreXRsfWtaVVlUUFBTXFRVVFVUVllXTFJbV11bXVJPVVNYV1dUUFhSU1dTVlVVW11YW1pVWl5YX15ZXFlRV1JZWVlfW1pUVVZaWVpXWFpdV1VbXl1eYGFfZGNcXl1dZWFhZmReXmRjYFxnZGhlZGJfZGFgYWBiYl9gXldYXlpcXFpZWVdWXVpdXlpZW1xbV1lcXVZYV11TTlBWWVFdVVZZV1dVWF9fYWFgY11fVF1fYmVldYF6aFdZWVNVU1ZcWFdXVlZXXVhPVV1aXl1cVFJYU1dXVVNUWFJTVlRYV1hdXlhdW1ZdX1hfX1hcVlFYVFlaWmFaXFZXWFtaW1lZWltZV15fYF9jYmFkZFxiXGBmYWRmZF5fZGJiW2ZjaGVjZmBmX19hYWFhYF9eVlVdWVtcW1lbWVldW1tbWFhZW1laWl1fXVRZXVVOU1lWU1xUVldZVlZcYGFiY2BjXl9WW2BkYV96dW9oWVtZVVdUV1taWlxZWFlgV1BVXlxgYFxUVFhQVVdWVFZXUlNVV1paW19eWl9cVl9fWl1eWV1VUllXWVldYlpeV1hbXFtcW1taXFpaX19gYGRiY2RkYmRZYWZjZmZlXmFiYGNeYmNpZGNnX2deYWFjYWFgXl9YVFtaWltbWFtYWFxbWltYV1lYV1xbW2BdVl1dU09WWVZWWlVYVVhXWF1fYmFkYWRgXllZYWRiYGxmaF5bXFpWV1hZXFxdX1tZW2JWVFheXWFjXFJWWVBXV1dXV1ZTVVRYXFxeYGBdYFxXYV5bXltaXlhVWFdbW19gXF9YWVxcXV5fXFtdWVtgYV5gZWNkZWVmYlhjZWRoZ2ReY2BgZWNcZWlkZWlfZl1jYmNhYWBfX1tYWVtZWlpYWVhXW1taW1dYWlRZXVxaYFxVXmJOU1dZVldZWFtcWFdZXmBiYWRhZGFdXllhY2JfYWBgXlxcXFdXW1tdXV9fXFpdY1laWF1gY2RfUlhZUFdXWFlZV1ZXVlxdXmBhYF9iXllhXV1eWVxeWVhVV1tcYF5dX1paXl1eXmFdXFtaXGBiX2JlY2VmZWZiWmRmZmlnYl9jXmFmZFpoaGJmaWNlXmJiY2FgYF9dXVpYW1lZWFhaWFdaW1pZV1hVVVtdXV1gYGJieEtYV1tZVlxbXF1aV1xdX2BiZGFiYV1gWGJjYmFjYWJdW1xbWFdbXF9dYF9dW2BkXVxYW2JlY2FSXFpPWVhaW1taV1pZYF1gYmJgYWNfXGJdX11bXl1ZWVRYXV1fYF9gXFteXmBiY11cWFxeYGJiY2VkZmRlZmRcZWZnaWZjYWJbY2dgXGloYmhpZWRgYmFjYV9gX1xdXFlcWVhXWFlYV1xaWldXWE9YWl1hY2Zmcmt/SllXXFpaX1xbXlxYXVteX2FjYmFhXWJbYmRiYGJiYlxbW1pXWGlxYFxgX11cYWNfXllZY2VkYVNfWlJZWFxdXVtaW1tjYGJiY2BiZGFgY15gXF5eXllYVVtfXl1hYmBeW2BhYmZjX11UXWBhY2RkZmVnZWZmZV5lZmhoZ2RkYFplZ15hZ2hjaGhmY2BiYWNiX19fXF1bWltZWFhYVlpWXFtaVlZWTVhXXGdpa2h1eIF2dnZ2dnZ2dnZ2dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6e3p6ent7e3t7e3t7e3t7e3t7e3x7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHt7e3t8fHx8fHx8fHx8e3t7fHx8fHx7e3t7e3t7fYmIhoqHhIKCgoOCg4OCgoKCgoKCgoKCgoGAgYCBgICAgYCBgYGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t6e3t7e3t7fHx8fHx8fHx8fHx7e3t7e3t7e3t7e3x7e3t7e3t7fHx8fHt7e3t7e3t8iYmHiYaFgoGCgoKCgoKCgYKCgoKCgoKBgYGAgICAgICAgIGBgYB9fHx8e3x8fHx8fHx8fHx8dnV1dXV1dXV2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eHh5eXl5eXl5eXl5eXt7e3t7e3t6enp6enp6e3x8fHx8fHt7e3t7e3t8fHx8fHx8fHx8fHx7e3t7e3t7fHx8e3t7e3t7e3t7fHx8fHx7fHt7e3uHiYiJhYSDgYKCgoODgoKCgoKCgoKCgYGBgICAgICAgICAgYKBgH58fHx8fHx8fHx8fHx8fHx2dXR1dXV1dHV2d3d3d3d3d3d3d3d3d3h4eHh4eHh4eHh4eHh4eHh4eHl5eXl5eXl5eXl5e3t7e3t7enp6enp6enp8fX19fXx8fHt8fHt7fHx8fHx8fHx8fHx8fHx8fHx8e3x8fHx8e3t7e3t7e3x8fHx8fHt7e3t7e4aJiYiFhYOBgoKCgoOCgYKCgoKCgoKBgYGAgICAgICAgIGBgYCAfnx8fHx8fHx8fHx9fX18fHjF1NLS0tLUk3t9fX19fYSMi4uLi454KSkqKiopKz0/Pj4+Pj5tgH5+f397pdfT09PT1r2GiYmJiYiQzNPS0tLT2FolKysrKiVjko2NjIyNiX9/f39/f359fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx8fHx8fHt7e3t7hIuHh4aHgoGDg4GCgoKCgoKCgoKCgoGBgYCAgICAgICAgYCBgIB+fHx8fHx8fHx9fXx8fH19eNXn5OTk5OeZe39/f39+hpCPj4+Pk3kZGhoaGhocMTMzMzMzMmqCf4CAgHut6eTk5OToyomMjIyMipTd5uTk5eXrVBMbGxsbFF2WkZCQj5GMf39/f39/f319fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e3uCjYeIh4eDgoSCgYKCgoKCgoOCgoKCgYGBgICAgICAgICAgICAgH58fHx8fHx8fXx8fH19fX12fn9/f39/f3l3d3d3d3d4eXl5eXl7eHBvb29wcHBycnJycnJyd3p5eXp6en6Dg4ODg4SBfHx8fHx8fYSFhISEg4R4c3Nzc3NzeX18fH19fX18fX19fX19fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e4CMhomHh4SDhIKCgoKDgYKCg4KCgoGBgYGBgYCAf4CAgICAgICAfnx8fHx8fHx8fX19fX19fXZ0dHR0dHd0dnd6e3h7eHd2d3p4enp5fnl4eHl4eHh5eXl5enp5eXl5enp6eXh4eXl5eXl7e3t7e3t7eXl5eXl5eXx9fX19fX18e3t7fHx8fHx8fHx9fX19fX19fX18fH19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8f4uHi4qIhIODgoKCg4KBgoKDgoKCgYGBgYGAgIGAf4CAgH+AgYF+fX18fHx8fHx9fX19fX19d3d3dnZ3fXh3d316eH14d3Z5fXx9ent+e3d3d3d3eHh4eHh5eXl5eXp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fHx8fHx8fHx7e3x8fHx8fHx8fHx+iomNjImFg4SEgoKDgoGCgoKCgoKBgYGBgYCAgICAgICAf4CAgH19fXx8fH19fX19fX19fX13d3d3d3p9eHt4fHx3e3h3dnp9fXx9fH58d3h4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fX19fXx9fX19fX19fX19fX19fHx8fHx8fHt7fHx8fHx8fHx8fH2Kio2NioWDhISCgoKCgYGCgoKCgoGBgYKBgIGBgICAgIB/gIGAfXx9fX18fX19fX19fX19fXd3d3d3fX55d3d4e3p7eHd2e318eXt9fnx4eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt8fHx8fHx8fHx8fHx8fH19fX18fH18fH18fHx8fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8foqJjo2JhISEg4KCgoKBgYKBgoKCgYGBgoGAgYKAgICAgH+BgIB8fH19fX18fX19fX19fn5+d3d3d3d5fHl7eHx9eXt5enl6fXt8fXx+e3h4eHh4eHh4eXl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt7fHx7fHx8fHx8fHx8fXx8fX19fX19fXx8fHx8fHx8fXx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx/iIeNioeFhoaDg4ODgoGBgoGCgoGBgYGCgYCAgoF/gICAf4CAgHx8fX19fX19fX19fX5+fn53d3d3d3Z4eHl3eXp4enh5eXh7eHp7eXx4eHh5eXh4eHh5eXl5enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX18fH18fH19fX19fH19fX19fHx8fHx8fHx8fHx8fX+HiIyIhoeHhIKDhISCgYKBgYKCgoKBgYKBgIGBgYGAgIB/gIGAfHx9fX19fX19fX1+fn5+fnd3d3d3d3d3d3d3eHh4eHh4eHh4eHl5eHl5eXl5eXl5eXl6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fHx8fX19fHx8gIeIi4eHiYWEg4SDg4KBgYGCgoGBgYKCgYGBgIGBgYCAgICBgX97fH19fX19fX19fn5+fn5+d3d3d3d3d3d4eHd4dnl5eHh4eHh5eXl5eXl5eXl5eXl5enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fH19fXx9fXyBhoqKiYmIhIOFhISCgoGBgYGCgYGCgoGBgYCAgYGAgIGAgIGBf3x8fX19fX1+fn5+fn5+f394eHd4eHh4eHZxZGpeam15eXl4eXl5eXl5eXl5enp6enp6enp6enp7e3t8e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIGFiYqJioeEhYWEg4KBgYGBgoKBgYKBgYGBgYCBgYCAgYCBgIF+fH1+fn5+fn5+fn5+fn9/f3h4eHh4eHh5bWRiZV9fXm94eXl5eXl5eXl5eXp6enp6enp6enp6e3t7e3t7fHx8fHx8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goWKiomJhISGhYSDg4KBgYKCgoGBgoGBgYKBgIGBgICAgICBgH58fX5+fn5+fn5+fn9/f39/eHh4eHh4eW5kZWdlZGJeZnh5eXl5enp6enp6enp6enp6enp6e3t7e3t7e3x8fHx8fHt8fHt7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChouJiIqEhYaEg4OEgoGBgYGCgYKCgYGBgYCAgYGBgIB/gIGBf3x8fn5+fn5+fn9/f39/f394eHh4eHl3Z2VkZWZkZWFfaXl6enp6enp6enp6enp6ent7e3t7e3t7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHt8fHx8fHx8fHx9fX19fX19fX19fX19fXx9fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4eJh4SEhoSDg4WBgYGBgYKCgYGBgYKBgICAgYGAgYCAgYF+fHx/f35/f39/f39/f39/gHl5eXl5eWtlYWJlZWFlZV5ieHdze3p6enp6enp6enp6e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fH18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19g4aLhoiFhYaEgoOEhIKBgYGBgoKBgYKBgYGAgYGBgYGAgIGBgn98fH9/f39/f39/f3+AgICAeXl5eXl0Y2NlZGNmY2doZGZsZF5ze3p6enp6enp6enp6ent7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn6DhouGhoaGhYODg4SDgYGBgYGCgoGBgYKBgYCAgYGBgYCAgYGBfnx8f39/f39/gICAgICAgIB5eXl6d2RhY2diYmRdW2VfYV1eYGFoeHp6enp6enp6enp6e3t7e3t7fHx8e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+foSFi4eGhoaGhIODg4KBgYGBgoKCgYKBgoGAgIGBgYGAgYGBgYF+fX1/gH+AgICAgICAgICAgHl5eW9vYmJiZF5jZ19dYWFgXF9kYlttfHp6enp6enp6enp7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7fHx7e3x7fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5/hIiLhoSHhoaEhIODgoGBgYGCgYGBgYKCgYCAgYGBgYGBgYGBgX5+fYCAgICAgICAgICAgICBeXpwXWJlZGJkXmZnZ2BZYmJhY2VfXF1ze3t6enp7e3t7e3t8fHx8fHx8fHt7e3t7e3t7e3t7e3t7fHx8fHx8e3x8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fn19fn5+fn5+fn5+fn5+foCFjIqEhYaGhYODg4SCgYGBgYKBgYGBgoKCgYCBgYGCgICAgIGBf35+gICAgICAgICAgIGBgYF5emxiZGdjYmdmYWBgZGFiZWRjZGNeXGJ1fHt7e3t7e3t7e3x8fHx7e3x8fHx7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/gYeMiYWGhoeFg4SDg4GBgYGBgYKBgoKCg4KBgIGBgYKBgYGCgoF/f36AgICAgICAgIGBgYGBgXp7dGdnZmZkZGZmYF5fYWNlaGRlXmJkYHR8e3t7e3t7fHx8fHx8fHx8fHt7fHt8fHt7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f3+CiYqIhoaIhoWDhIOCgYGBgYGBgoGBgoKCgoGAgYGBgoKBgYKCgX9/f4GBgYGAgYGBgYGBgYGBenptaGNjZ2ZnZWdmZmdiZWRlYmdbYmVgdnx8e3t7fHx8fHx8fHx8e3t8fHx8e3x8fHt7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f39/f4SJioiGiYeFhYSEg4KBgYGBgYGCgYKCgYGBgYGBgYKBgoGBgICBgH9/gYGBgYGBgYGBgYGBgYF7emlpZGNqZmFgZmVjY2NnaWRjYmBiZGJ0fXx8fHx8fHt8fHx8fHx8e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f39+fn9/f39/f39/f3+AhIqMiIeJhoSFhYOCgYGBgYGBgYKBgoGBgYGBgYGBgoKBgYGBgYGAgH+BgYGBgYGBgYGBgYGBgXZzZWRnY2RmZWJlZmdkZmhmZWNgYGNkYHF9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fXx9fX18fHx9fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/fn5+f35+f39/f39/f3+AgICFioyJiIqJhoaDgoKCgYGBgYGBgoGBgoGBgYGBgIGBgYGBgYGCgX+Af35/foCCgoKCgoKCgoKCc3NnZWRkZWlqaGZnZ2NhZmZlZmdmZWVjdX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gICAgICAgIWLioqJioeHhoSCgoGBgYGBgYKCgYKBgYGBgIGBgoKBgYGBgYGAf4B+dHRzdX1/goCAfn5/gYB0cmdkZWNmaWppZWNlY2BmZGRnZ2JiZWFwfXx8fHx8fHx8fHx8fHx8fHx9fX18fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f39/f39/f4CAgICAgIB/houLiouLh4eHhIOCgYGBgYGBgYKBgoKBgYGBgYKCgYCBgYGBgoCAgH5zc3NzdHV4dXV0dHV2dXVwZmNmZWhoaWdoZ2VmZWJfZGVmY2BiZ3d8fHx8fX19fX18fHx8fH19fX19fX19fXx9fXx8fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gIB/f3+AgICAgICAgICHjIyIi4qHh4eEhIKBgYGBgYGBgoGCgoGBgICBgoGBgYKBgoKCgYCAfnNzc3Nzc3NzdHR0dHNzdW9jY2FnZWhoZ2pmZGVnZmhmY2JlYl5ieX18e3t8fX19fX18fHx9fX19fX19e3x9fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn9/fn5+fn5+fn5/f39/f4CAgH9/gICBgICAgICAgYCAf4CAgYGAgIeLi4iNiYiJhoSFgYGBgYGBgYKCgYKCgYGBgIGCgoGBgYKBgoKBgIB+dHNzc3Nzc3Nzc3Nzc3N1cmdlZWRlamhoZ2ZpaGdjZWViZGNoZGd7eHVzc3R2dnl4dnR0dHZ3d3d2dHR0dXV4d3h4d3d6e3x9fXx9fn5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f35/f39/gH9+fHt7fX58eXl2dnZ5fHx6end2d3l7fXt4hIyMioyHh4iEhYSBgYGBgYGBgoGBgoGBgYGAgYKCgYGBgoGBgoGAgH51c3Nzc3Nzc3Nzc3Nzc3VzaGVnaGVrbGhqZ2lqZ2dnZmRkYmVkbnV0dHNzdHNzc3Nzc3Nzc3Nzc3NzdHNzc3Nzc3Nzc3N0dHV1c3V3eHl7fn59fn98f39/f39/f39/f314fH5+fXx4dXZ3eXd4dnRzc3N0dXRzc3Nzc3NzdHNzc3R0c3R0dHODjI2KiYeIhoOGg4GBgYGBgYGBgYGCgYGAgYGDgoKBgYCBgYGBgYCAf3VzdHRzc3Nzc3Nyc3NzdnZpY2hqaGpsZWZpbGhgZmVkY2BkZGZ0dXV1dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHRzdHRzc3Nzc3R2dnV1d3V4fH9+fX9+fHp4dXN0dXV1dHNzc3Nzc3N0dHR0dHR0dHR1dXR0dHV1dHR1dXR1dXV1dIaMjYuIhoeEhIWCgYGBgYGBgYGCgoGAgYCBgYKCgoGBgIGBgYGAgIB/dnNzc3Nzc3Nzc3Nzc3N2dnNnZ2pmaGdmaGhmZGlnY2NnZWVmcHZ1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dHR1dHR0dHR0dHRzdHR0dnV1d3Z0c3R0dHR0dHR0dXV1dXV0dXV1dXV1dXV0dHNzc3N0dHNzdHR0dHR1dXR1iY6MjIqHh4SEhYKBgYGBgYGBgYKCgoGBgICAgoKCgoGBgYGBgYCAgH93c3Nzc3NycnJyc3NzcnZ2dW5kXWNnZWlraGVoZ2dqamlnZXB2dXV1dXV0dHRzdHR0dHR0dHV1dXV1dXV0dHV1dHR1dXV1dXV1dXV1dXR0dHV1dXV1dXV0dHV0dHV1dXV1dXV1dXV1dXV1dXV1dXV0dHNzc3Nzc3N0dHNzc3Nzc3R0dHR0dHWKjoyMiYaGhIeFgoGBgYGBgYGBgoKBgYGBgYGCgoKCgYGBgYKBgYCAf3hzc3Nzc3JycnJyc3NzdnZ3d2liaGhnamtpaGZkZGVmaWhwdXR0dHRzc3JxcnJ0dXV0dHR0dHR0c3NycXFxcXNzdHR0dHR0dHR0dHV0cnJyc3R0dHR0dXV1dXV1dXR0dXR0dHR0dHR0dHR0dHR0c3Nzc3Nzc3Nzc3Nzc3N0dHN0dHR0dHR0dYuOjImGhYWFh4SCgYGBgYGBgYGBgoKCgYGAgIKCgoGBgYGBgYGBgIB/eXNzc3NycXJycnJzc3N3d3d3bGpoZGhpa3Z6a2VmZWhnbXJzdHN0c3JwcHBxcnN1dXR0c3Nzc3JycXBvb29vcHFzc3NycnJyc3R0dHNxcXFyc3R0dHR0dHRzc3Rzc3N0dHR0dHRzdHR0dHR0dHRzdHR0c3NycnFxcnJzc3Nyc3NzdHR0dHN2jZCMh4eFhYSEgoGCgoGBgYGBgYGCgoKBgYGAgYGCgoGBgoKBgYGAf395c3NycnFxcnJycnNzc3d3d3dzc2pnaWloeX99cW51bG5wcXJycnFxcG9wcXFxc3R0c3NycXFxcG9ubm1ubW5ubnBxcnJycnJycnJzcXBvb3BxcnJzc3JxcnJycnJycnJycnJzc3Jzc3Nzc3Nzc3Nzc3Jxb29ubm9vcXJzc3Jyc3NycnNzcnaPj4uHhoWFhYOCgoKBgYGBgYGBgYGBgoGBgYGCgoKBgoGCgYGCgX9/f3hxcHBwcXFycnJyc3Nzd3d2dnd2cnF0c252f352c3hwcHBycnJycXFwcHFxcXJzc3Nzc3JxcXBwb25ubm5ub25vcHBxcXFxcXBwcXJwb25vcHFxcXFxcHBxcXFxcXJycnJycnJycnFxcnFxcnJycnFwb29ubm1ubm5vcXJycnJycnJyc3JxeI+OjYaDg4aEgoOCgoGCgYGBgYKBgYGCgoGBgYKCgoKCgoKBgYKBf4B/d29wb3BxcnJyc3Nzc3J2dnZ2dnZ3dnZ1c3l/fnd3d29wcXFxcXFxcHBwcXJycnNzc3JycXFwcHBwb29vb29vb29wb3Bvb29vcHBxb29vcHBwcHBvcG9wcHFycXFxcnJxcnFxcXFxcXFxcHBwcHBxb29ubm5tbW5ubm9wcXFxcXFxcXFxcXB7j42NhoODhYOCgoKCgYKBgYGBgoGCgIGCgoGCg4KBg4KBgYGAgYF/f392bm9wcHBxcXFxcXBwcHZ2dnZ2dXR0c3NxfYB9fX9zb3BxcXFwcHBwcXFwcXFxc3FycnFxb3yCb3Bwb29wcG9vb29vb29vb3BxcXBub3Bwb29wb29wcnJycnFxcXBxcnFwcXFxcHBwcHBwcHBwb29ubm1ubm5ubm9ub3BwcHFxcXFxcXFxcIKRjoqEhIOFhIOCgoGBgoGBgYKBgYGBgYGCgoKCgoKCgYGBgYCBgX9/gHVvb29wcXFxcXBwcHBwdnZ2dXRzcnJycnGAgoCBeXBwcHBvcHBwcHFxcXFxcXCHhnBycXBzmIJucHBwb3BxcHBvb29wb29vcXFwcG9wcG9vb25vcHFxcHBwb3Bvb3BwcHBwcHBwcHBvb29vb29vbm5tbW1ubm5ub25vb3BvcHBwcHBwcHBwiZCMiISDhIaDg4KCgYGCgoKCgYGBgYCAgYGBgoKBgYGBgYGBgIGBgH+AdG5vb3BxcXFwcG9vcG92dnVzcnFxcXFxcICDg39ycHBwcHBwcHBwcHFxcHBxcX2hgnByb4uefG9wcHFwcHBwcHBwcHBvcHBxcXBwcHFxb29vbm9wcHBvb29vcHBvb3BwcHBwcHBwcHBvb29vbm5ubm5ubW5ubm1ubm9wcG9vb29vb3BzcXWPj4uJg4KFh4ODgoKBgoGCgoKBgYKBgYGBgYGBgYGBgYCAgYGAgYGAf4B0b29vbm9vb29vb29vb3Z1dHNxcXFxcXJygIKCgXRxcXFxcXFxcXFxcXFxcXJxdJ2hdnF3n5x9b3FxcXFwcHBwcHFxcXBxcHBwcXBwcHBwcHBwcHBwcHBwcHFxcXBxcXBwcHFwcHFxcXFxcXFxcXJxcnFwcnRycnR0dHR1dnRzdHR0dXd3gpCPi4iDgoaHhISCg4GBgYKCgoGBgoGBgYKBgYGBgYGAgICBgYCBgYB/gHVvb29vb29vb25vb29vdXRzcnJycnJycnKDg4OCdnFycnFxcXJxcnJxcXJycnJxmKiQb4KjnX5wcXFycXFxcXFxcXFxcXFwcXFxcXFxcnNzcnJzc3V1dHR0dHR0dHV2d3d3d3d3eHh4eHd3eHh4d3Z3dnV2dnZ2d3h6e3x7e3t6enp6enyGkI2LiIODiIeHhYODgoGCgYKBgYGBgYKCgoGBgYGAgYCAgYGAgIGBgH+Ad3FxcXFxcG5ucG9wcG92dHV1c3Nzc3NzdYiDgYN5cnNzcnJyc3Jyc3Nzc3JzdHKTqaR5iKCdfHJzc3Nyc3N0dHV1dXV1dHV3eHd3d3d3eHh3eHh4eXl5eXl4eHl5eXp6e3t7e3t6enp5eXh3d3d1dnV2dnd5enp7fn5+fX1+fn5/gH5+gIyQi4qHg4WIi4iEg4SDgYGCgYGBgoGBgoKCgoKAgYGBgYCBgYGAgIGAf4B8enp5eXx5eHh2dXZ2dHl2d3h3d3Z3dnZ6fnx+fXx2dnd3dnV4enh4eHh4d3h5eZ+0qaSoqJd9e3l5eXh4eXl6enl5eXh4enp5eXh4eHh3dnd3eHh3eHh5eXp7e3p8fH1+fX9/f359e3t7e3p5enl5e3t/foB/fn5/fn19fX5+f35+fn6AjpCNioeEhoqLiIaGhIOBgoKBgYGCgYGCgoKCgoCBgoKBgYGCgYCBgIF/f4B/fn19fX9/f318e3t7eXh4eHh5eXl4eXh5eXl4enp6enp6e3t7fH1+fHt8e3uJr6ahtauso357enp4eXh4ent6enp5eXp8fHt6enx8fHp6ent9fHx+fn+AgoGAgYKAgH9/gYGBgIB/f35+fn5/fX1+f4CAf35+f39+fn9/f39/gH+Af4OQjoyHhoWIi4yIh4aFg4GCgYGBgYKBgoKCgoKBgYKDgoGBgYGBgIGBgIB/goOCgoGBgX99f39/f4F6enh4d3h4eHh5eHh5enp5e358enx9fXt8fX19fX19fZillqKyoJmnk32Af319fYCDgoCAf318fXx9fXt9fXx8fH19fX1+gYGChISDgoB/gYGBgH9/f4B/f39/f39+fn9/f39/f35+f3+Af39/gICAf4CAgICAhJCPi4eGhoiLi4mKhYaDgoKCgYGBgoGCgYKBgYGBgoOCgYCAgYGAgIGBgH+ChIKCgICAgH9+fn+AgH9/fn18fX19fYB/fX+Af36AgH9/fn9/gICBgICBgIGBnJyOoLCgn6KfgICBgH5+f39+f4B/fn5+f39/gYB/f4CBgYCAgYOEgoGCgoGCgH+AgYCBgYGAgH+BgICAf39/gICAgYGBgIGBgYCAgICBgoGBgYCAgYGFjo6MiYaHiYyLi4qGhoOCgoKBgYGCgoOCgoKBgIGBgYKCgICBgYCAgYGAf4KFg4KBgYCAf39+fn+AfX5+fn19fX5/fn9/f35+fn+AgYCAgICAfn9/gICBgYCXmo6YsqGYlpyFfH5+foB+fn5/f35/gIGBgoKDg4KCg4KBgYKDg4OCgYGBgYKBgoKCgYKBgoGBgYGBgoKCgYGCgYKCgoGBgoKBgYKCgoKCgYGBgoKCgoaPkY+KiImKjY6MiYaFgoKCgoKBgYKCg4KCgoGBgYGBgYF/gIGBgYCBgIF/gYWEg4KCgoGCgYCAgIB8fHx7fH18fH9+fn9+fn5+f35+f39/f39/gH5/gIF+fp+rpJakm5uWoJ+Gf35+f4B/gIF/f39/f3+BgYGCgoCAgYKDg4SDg4ODgoKCgoKCgoKCgoKCgoGCgoKDg4OCg4ODgoKCgYKCgoODg4ODgoKCgoODg4KCh5KTkIuKi4uPj42Kh4SCgoKCgYGBgoKDgoKBgYGBgIGBgICAgYGBgIGAgYCAg4SDg4OEg4ODgoKCgXx9fHx9gn1+f4GCiIGCgoSCgYGDg4GBgYKDgoODho2fsqiioJidnaaoraigmZGHgYCAgICAgH9/f3+AgICAgH9/gYODhYSEg4SDgoKCg4OCgoOCgoODg4ODg4SDg4KEhYWDg4SEgoKDhIOCg4ODg4OCgoODgoCKlJOPioqMjpGPjYuGg4KCgoKBgYGBgoOCgYGBgIGBgoGBgICBgYGAgYCAgH+BgoODg4SEhIOCgoKCfXx8fn6AgYOAg4OChIaFhoaFhIWFg4ODg4ODho2grbGmm5qgm56cnJ2hpKOdlIeDg4KDg4ODgoGAgIKCgYOCgYKCg4OEhYWEg4OChISEhIOEhISDg4OEg4ODg4OEg4SDhIWEhISDg4ODgoKCgoKCgoKBgYKCgo+UlI+Njo6RkY6KiISCgoKCgYGBgYGCg4GBgIGBgYGBgYCBgIGBgYCBgICAgIKChIKChIOCg4ODgoJ9fX2AgH+AgoGDg4ODhIaEhIOEhYWDg4GBg4OCg4uXmpeWmKCanZ2dmpqYkImGh4eGhoeHhoaEgoGCg4SDg4ODg4ODhISFhYWDhISFhISEg4KBg4OCg4SEg4KCg4SCg4ODg4OCgoKCgoKCg4OEhIOFhYWFhoaIk5OTkI+PkJKRjIqIgoKCgoKBgYGBgYKDgoKBgIGBgYGBgICAgYGBgICAgICAhISEgoKCgoGBgoKBgX+AgYOCgICAf4CCgoGDg4KCgYODg4SDg4GDhYSCgYGGjpSTl5qcnJuUj4mHiIiHh4eIiIiFhIOBgIGBgoKCg4GCg4SEhYSDg4OEg4OEhIOBgYGCg4OEhISDg4ODg4OEhIODgoSDg4ODhIWFhoeHh4eIiIiJiY6Tk5KOj46Rko+LiYeCgoKCgoKBgYGBgoKCgoGBgIGBgYGAgICAgYGAgIGAgICDg4KCgYKCgYGAf4CBhYWFhoOCgYB+fn+BgoSCgYKDhIOCg4ODg4KChISDhIODiJCTjpSYkoeDgoWFhYOEhIWFg4KBgH9/gIB/gIGEg4OEhYWEgoKBgoOCg4OFhIKDhISEhYaGhoaGhoWFhoeHhYaIh4aHiIeGhoaIiYeGhYaGhoeIkZOSkI6QjpGRjImHhYGBgoKCgoGBgYGBgoOBgYGBgYGBgICAgICBgYCAgICAgISEg4KBgoGAgYGAgYKIh4aHhYSCgH99fX6AgH+AgYGBgYGBgoGBgYKDgYKCgoGAh5uHi4eCg4KBgICAgIGAgICAgH9+gIGBgYKCg4OEg4OEg4OCgoGBgoODg4SEg4SEhIOFhYaFh4eIh4eHh4eHh4eGhoaGh4WFhYaGhISEhIWEhYaSk5GOjo+OkI6JiYeEgoKCgoKCgoGBgIGCgoKCgoKCgYGBgYGAgYGBgICAgYGAgoSDg4KDgoGCgYKDg4iHh4iHhYSCgX5+gICAfn5/f4CBgYGCgoCBhI2DgH+AgIB/g4iOgIGCg4OAf3+AgICAgICAgICDg4KDg4ODgoOBgYKCgoOCgYKCgoOCgoSDhISDg4SEhYWFhYaGhoaFhISEhYWEhIWFhYSEhISDhISEhISEipSTkZCQj46NiYaFhIOBgYKCgoKCgYGAgYKCgoKBgoKBgYCBgYCBgYGAgICAgYGAg4OCgoOCgoKBgoOCiImJiYiHhYSDgYKEhIOBgoKCg4SCgoSEgoOJloiEgoSCgn9/jJWCgoGChIOBgYCCgoODgoGDg4SDg4SEg4OCg4KDg4ODg4KCgoKCgoGDhISEhYSFhYWFhIWEhIWFhYWDg4OEhISEhYWFhISEhISEg4ODg4OOlZKRkZGPjYyHhYODg4GBgoKCgoKBgYCBgoOCgYCCgYGBgICAgIGBgYCAgICBgICDhYSEhIODg4SDhIOGh4mIhoWDhIODg4WDgYCDgoWFhISDg4OChI6Zi4OFhISEgoCRmYaCgoKEg4OChYKBhIWEg4ODgoODhISDg4ODg4SFhISDg4KCgoKCgoSEhYSFhYWFhYODhYWFhYaFhoWEhIWEhYWGhYWFhIWEhISDhIODhJGUk5OTkI2MioWEhIODgYGCg4KCgoKBgYGCg4KBgYKBgYGBgICBgIGBgH+AgIGAgYaGhoaGhoaHh4aGhYSDhYaCgIGBgYGHgoB+f4GBkIyDgX9+fXx9jJyOgIKBgYKChZSUjIGCgYKDgoWTg4GDhYODhIODg4OEgoKEhIOEhIWEg4OCgoKCgYKCg4ODg4SFhYWFhIOEhYWGhYWEhISEhIOEhIWFhYWFhIODhIOEg4KGlJSTk5KPjYyIg4SEg4KBgoODgoKDg4GBgoKBgoKCgYGCgYGBgYCAgYGAgICAgICAhYWFhYaGh4aGhoWGg4ODg4GAgoKCgYKAf35/f4GWl4mAfX19fXuBmIyAg4GBgYCOlIyQgYKBgoKCkZSBgYODgoODg4KCg4OBg4SDg4ODg4OEhIKCgoKDgoKDg4ODhIWEhISEg4OEhIODg4OEhIODg4ODg4SDg4ODg4KDg4KDgouUk5KTko2NioaDhIOEgYGCg4ODg4ODgoGBgoGCgoKCgoKBgYGBgICBgYCAf4CAgICDhISFhYSFhYWEhIWCg4KDgoKDg4OBgICAgICAgZWfin5+gH2Hi36EhIOEgoODgo2JhYyCgoOCg4aWlZCMgoKDhISDg4ODgoKDg4KCg4KDg4WEg4ODg4SDg4SEhISEhYWEhIWEg4SEg4OEhISEhISEg4SEhYSDhISEhIODgoKDkJSTkpKPi4yIhoSFg4OBgYKDg4ODg4OCgYGCgoKCgoKDgoCBgoGAgICAgIB/gICAgISDhYWEhYWFhYSFhYOEhIWDg4SEhIKCgoOCgoSBkaGKf4yEfYaJgH6FhYWEhYJ/fX19gIOEg4SEi5mgqqibioSOiYOEhISEg4SEhIOEg4OFhoWFhYSFhYWFhYSFhoaGhoWFhYWFhYWFhYWGhoWGhoaFhoaGh4aFhYWFg4SEhIeTk5ORko2KiIWGhYWCgoGBgoODg4OCg4KBgYKDg4ODgoKBgIGAgICAgICAgH+AgICAhYWFhYWGh4eGhYWFhISFhYSEhISEg4ODg4OEhYOJkYOEi4WCgYF+fYGHhoOAfn5/f39/f4OEhIWKk5igpaSbjZaHhYSFhYWEhYSGhYWFhYaGhoWGhYWGhYWGhoaHhoaFhIWFhYWFhIWGhoaHhoaGhoaHh4iIiIaFhYaFhYWGjZSTkpGQi4qHhoeGhIGCgYKDg4ODg4KDgoGBgoODg4KAgYGBgICAgICAgICAf4CAgICHh4eGhoeHiIeHhoaEg4ODhIODg4OEg4ODg4OEhISEgYKCgYmBf359foWCf39/f39/f36AgISEhpWXlZefn56dkoeIhoaFhoWFhoeHh4iGh4eGhoaHhoeGhoeHhoaGhYODhIWFhoSFhYaGh4eHhoaGhoeHh4eIiIeGhoaHh4eRlJORkZCLiIiFhoWDgoKBgoODg4ODgoKDgoKCgoOCgYCBgICBgICAgIGAgIB/gICAf4aHiIeHh4eIiYmIiIODgoKDgoSEhIWEg4KCg4SEhIOBgICAhIR/fn5/gH9/f39/gIB/f4B/f4WMnJual5qcm5mOh4iHiIiIhoaHiIiJiYmIh4aHh4eJiIaHh4eHhoeFg4OEhYaGhYWFhoaGh4eFhoeGh4aGh4eHh4eHh4eFh5OTkY+RkIuHhoWFhIKCgYGCg4ODg4ODgoKCgoGCg4KCgIGBgYCAgICAgICAf3+AgYB/hoiIiIiHh4iJiYmIg4KCg4ODhIWHh4aFg4OFhISEg4GAgIGMiYGAgYKCgYGBgYB/gH9/fnt6f5mXipSZmZiVlIyJiYmKi4qIiIiJiYuLioqIh4eIiIiHh4iIh4eGh4aEg4OFh4eHhoWFhISDhYWEhYWGhISEhYWFhoWGhYOJlJKQj5GOioaFhoWDgYGCgoKDg4ODgoKCgoKCgoKCgYGBgYGBgYCAgICAgIB/gICBgH+GiYiIiYeIiImJiIiEgoKDg4KDhImKh4aEhIWEg4OCgICAhISCgoKCgoKCgH9+fX19fX5+fHt8mpV/gZaYl5WTjYmJiImLiomJiImIioqJi4mGhoaGh4WGiIiIiIaGh4SDg4SHiIiIh4WCgoGDg4KDg4SCgYKDgoGEg4SDgY6TkpCPj4uJhYWGhIKBgYGBgoODg4OCgoKCgoKCgoGBgYGBgIGAgICAgICAgH+AgIGAf4WIh4eHhoeIiIiHh4SCg4OCgoOFiYqJh4WHhYSFhYKAgYOEgoOCgoKDgX59fX5+fn5+fn1+fX2Bl4+MmJaYl5OJh4eHh4iHh4mGh4aIh4eJiYODhIOFhISFhYaIiIaFg4KCg4WHhoeGhoSCgoOEgoODhIKBgoGBgYODhIOEkZKQjo+Oi4eEhoaEgoGBgYGDg4ODg4KCgoKCgoKCgYGBgIGBgYCAgIB/gIGAf39/gIB/hYaGhYaGhoeHiIeGgYKEhIOChYeIi4qGhIaEgoaGgoKEhIODg4OCg4F9fH1/gH9+fn59fH1+fHqCmp+cmI2Ki4OEhIaFhYODhYSEhISEhIWEgoKCgYSEgYKDg4WGhYSCgoGCgoODhYSEhIWEhIaEg4SFg4KDgYKDg4SFhIeSkY+NkIyJhoSFhIWCgYGBgYODg4ODgoKCgoKCgoKBgYGBgYGAgICAf4CAgYB/gICAgICDhIWEhYWFh4eHh4aAgYGFg4OEhYSHiIWCgICAgX9/gYSEg4ODgoKAfX1/gICBf31+fn18fX17enmHoJ6ajIeIgIKBgoKBf36BgYGCgYOBgoGCgoKBg4SAf4CAgYKCgICAgYCBgoGDgYGChIODhYSCg4SDgoKBgoSDhYWGi5ORj4+Pi4iFhYODhIGAgYGBgoODg4KCgoKCgoKCgoGBgYCBgYCBgH9/gIGBgICAgH+AgIKCg4OChIOEhYWGhn+BfoCBgICAf4GDgn9+fn5+fX+ChIOCg4ODgX59fn+AgIGAfn19fX1+fXx6e3qPm5eWkol+gH9/gIB+fYB/f4CAgX+AgIF/f4CBgX59fX+AgX9/fn+AgH+AgICAf4CCgICCgYCDgYGAgYGBgYKEg4aPkpCOj42Kh4eGg4ODgYGBgYGCg4ODgoKCgoKCgoOCgYGCgYGBgICAgH+AgICAgICAf39/gYGDhIGCgoOCg4SFgIB/fH19fn19fn+Af31/fn1+gIODgoKCgYF/fX1+f4CAgH9+fX19fHt7e3p6enuOl5WXhn5+f35+f35/gH9+f3+Af4CAf35+fn9/fn18fn+Af35+f3+Af39/f39/f4B/f4CBf4B+f39/gH9+f4B/hZKSj46Pi4uHiYWEhIKBgYGBgYKDg4ODg4OCgoKDg4KAgYKBgYGAgICAf3+AgIB/gIF/f36BgYSEgYKBg4OCg4OBgH98fn9+fX6Af4B/foF/f4CBhIOCgYB/f359fn5/gICAfn19fX17e3x6enp6eX+QkI+RkX9/fn9/f4CAf35/f4CAgoB/fH5+f35+fXx/f4B/fn5/f4B/fn5/f4CAfn6Af39+f35/f35+fn19fX2Fk5KOjIuKiImIhISEgoKCgYGBgoOCgoOCgoODg4ODgYCBgYGBgYCAf39/f4CAgICAgIB/foCBhIOCgYGDhISDhICBgICBgIGAgYKCgoGBgoCBg4ODgYGBgYCAfX19fn5+f359fX19fXx8fHt6enp6eYKNiY+Wh4GAgIGAf4F/gICAgYGCgoB+gH5/fn5/foGAgYB/f39/gICAf39/gYB+f3+Afn9/fn+Af31+fX17fIaTkYyLioeHioiGhoWEgoGBgYGCg4ODg4OCg4OCgoKBgICBgYGAgH9/f39/gICAgICAgH9+fn+BgYGAgISGh4aHgoSDhYKBg4ODhYSEhISEg4ODhIKBgoKCgH9+fX19fn6AfX19fX19fX19fHp6eXl5e4iJh4eIg4GCg4GAgoCCgYGDg4ODgYGBgIGAf4CBg4GEgoCAgYCBgYGAgYCCgX+BgIF/gIB/gICAfn9/fnx8iZSQiomIiIiJiIaGhoSCgoGBgoKDg4ODg4KDg4KCgYCAgICAgYGAf39/f4CAgICAgIGBf359fn5/f39+g4aHh4iChYSFhISFhIWGhoaGhoWGhYGBg4ODgoKAfX19fX19fn59fX19fX19fX18e3l5eXl5fIKChIWDgoSDgoKDhYeCg4SDgYKCg4OCgoKCgYKFg4iFgoGCgYKDgYGBgYSDgoOCgYKCgICBgIF/gIGAf36Ok4yHiIeIh4aGhYaGhIKDgoGCgoODg4ODg4OCgYGBgH+AgYGBgYB/gH9/gICBgH+AgYB/fn19fX5+f36Ag4SHh4SGhoaFhoaHh4aHh4iHh4eGf32AgICCgX59fX19fX19fX19fX18fH5+fnx7eXh4eXl6foGCf4KLhIOEhISXl4ODhIF9foGCgoGCgYKBg4aIjIWDgoKBhIKEg4KDhYSEhYODhIOCg4OCgoKCg4OCgpGQi4iJh4mHhoaEhoWEhISDgYKCg4ODg4ODgoGBgYCAgICBgIGBgH9/fn+AgICAf4CAgH9/fn1+fn+Bf4CCgYWFhYeGh4eHh4eIhoeHh4eGh4V+fX18fX9+fX19fX19fX19fX19fXx7iJKCe3x6fIZ5eXp8f4B9hpODg4OEhJSTgICBf39/fn6Ei4B/gYCEhpCJhYSCgoGFhYuDgYKFhYaGhISFhYOEhIODhIOEhYSIko+MiYiIiYeHh4WGhYSEhIKBgoKDg4ODg4OCgYGBgYB/gIGAgICAf39/f4CAgICAgYGBf39/f4CAgIGBgYGBg4OGh4aGh4aGiIeGhoaFhIOFhH59fHx8fX18fH19fX19fX19fX18fH+RlZaDe3qElHx5enp6e32AgoGCgYOCgH59f397iJF8fI6Wf31/f4KGioWDg4SDgoONiX99f4OEhYWDhIaFhIWFg4SFhYaEhI6Rj4yKioyJiImHhYWFg4SDgYKCgoKDhIODgoGBgICBgICAgYGAgIB/f3+AgIB/gICAgX5+f4GBgoKCgoODgoOCgoWGhISFhYSGhIOEg4KBgIKAfn19fHx9fXx8fH18fH18fX19fHx8e4uRl4x6e3yBenl6e3x5eX1+f4B/gX99e3x/fn2ClZF/hIh9fH5/goR8fIGChIN/f4eDfYKBgIKCgIODhISEhISChIOEhYGEkZGOi4yMjoqJiYWFhYODg4KBgoODgoKDg4KCgYGAgIGAgICAgICAgH+Af3+Af357gICBenyAgYKDhYODhIWFhYODg4SCgYKDgoOCgoGBgIB/gX5+fX59fHx8fHx8fHx8fHx8fHx9fHx8f36Kgnt6e3p4ent7fH17fn5/f35+fn59fICBgH6Gj4F+fYJ+f36Agnx8gH+CgIGAfnx7ioJ9gH9+gYCAgYKBgoCAgIGAf4uUkIyMjo6NiIiHhYWFhIOCgoKCg4OCgoODgoGBgICAgICAgH9+fXx7fHx9f3+AgHx6gYF4e4CCgYOFhIOFhYaGhISAhpSIgIKBgYGBgH9/f39/fn5+gHx8fHx8fHx8fHx8fHx9fHx8fHx9fHl6e3t4eHl7e3p8goCBf4CBfX9/gH99gIKCgICAgX+CkYF/f4CAfoB+fn9+gIGBfX19e319fXx9fHx9gH+AgH6Afn6ClJKNjI2Oj4qFhoaFhISFg4KDgoODg4OCgoGBgYGAgICBgICAf4CAf39/fXt6fICAgHh+gXd7gIF/goKCgoKEhoeGhn6IlYp+gIGAgIB/foB+f39/fn+Bfnx7fHx8fHx8fHx8fH19fHt9fHx8e3x8fHp6eXt8e32Fg4OAgYF+gH9/gH6FgoF+gH9+foCFhoKAfn6Dhn99fH5/gIGAf39+fX19fX57fH1/f3+AfX9+f4yRjo2Njo2Nh4SGhoWEhISDg4OCg4ODg4KBgYGBgYCAgYGAgYGBgYGAgH9/f397en9/e3mAd3p/f31/f3+Af4KEhoaFf3+FgX5/gIB/gH5+f35/gIB/f4B/f319fHx9fn18fX19fX19fH18fXx7fXx8ent6fH19f4aFg4CAgH1+fX5/fouEgYd+fXx8fn6Cgn99fX19gXx7fXx+gYSDgYB+fn5+fXx+f4B9foB+f36Eko2NjI+Ni4qGhIWEhISDg4OCg4KDgoOCgYGBgYGAgYGBgYB/fXx8fH1+f39/f397e399d352eH59fH19fX5+gYGCg4B6fn58fn6AgH6Af35/fn+AgH+AgH9/fn9+fn5+fn1+fn99fH59fn19fXt8fHx7e3p9foCAg4OCf35/fHx8fXx9gYN+jH58e3t9fn1+fn17e3t9fHt7e3uAhoSChIOBf4B+f4KCgn9/goJ/gIuQjY2MjYuKiISEhIOEg4ODgoKCgoKCgoKBgYGAgoGBgYKCf3+AgIB/fn18fH5/fn55fX52e3Z4fXx8fHt9fX6BgICAf31/f31+f39/f4B/f39/f3+Af4GBgH99gH9/fn9+fn5/f3yCfX59fX17e319fHp8fH2BgoGAgIB9fX18fHx8fH18fnt/fnt7e3x8fH18e3t7e3x8enp9en6CfoKEhIKBgoGFhoWFhoaHhYGEkY+Ni4qLh4eFgoOEhISEg4KCgYGCgoKBgoGBgYGBgoGBgoKAgYKBgYCAgH9+e3x+fnx6fnh5dnd8fHx7e317f4GAf35/foB/f35/f35/gH9/f39/f39/gYKAfn6BgIB/f39/f39+fYN8fH19fH99fX19e3x+fn9/fn5/fnx8fXx8fXx+fnt8e3x8fHx9fH18fnx9fHt7e3x5e3x7e316fX5+f4CAg4eJiYmKiYqJhYiRj42JioeFhYOCgoODhIOCgoKBgYKBgYKBgYGBgYKCgoGCgoCAgX98e3p6eXt9enx+fnl8eXh4dHx8fHt8fHx+gH9/f39/gIB/fn5+fX+Af39/f3+Af4CDgoB/gIGAgIB/f4CAgH58enx9fX59fX5+jIZ9fX57e4ODfX19fH18fX19fX1+fH18fXx9fX59fn19fX18e3t7fHt8fHt6e3t6enp7fn6DhYiHiIqLi4qJjJGQjoqJhoWEgoKCgoODg4OBgYGBgYGBgYGBgYKCgoOCgYKBgIGBf3+Af356eHl5en5+e3l6eH5zfHx8e3x8fH5+fn5/gH+AgIB/fn9+gIF/f4B/gIGAgoSEgYCAgYGAgX+AgYKBf39+f31+gH57foGSjHx9f4qAjYx+fn19fX59fX19fXx8fX19fXx9fX1+fX1+fnx7e3t8fH18e3p7e3l6eXh5e35/g4OEh4mKiImOkI6MiYmFhISCgYKCgoKCgoGCgoKBgYGCgYKCgoGCgoKBgoKAgYGAfoCAf39+e3p5e319eHx6f3KBfXt7fXx8fn59fYGBf4GBgX9/gH+AgX9/gIGCgYGFg4SCgYGCgYKBgICBg4KAf4F/fX6Afnx/f4mCf36CkYSEg4F/fn18jYd9fX59fXx/fnx9fXx9fX5+fX5/fH18e3x9fnx8e3x9enp5eXl5ent+foCBg4eEiI+Oi4uHhYSEg4KBgoKCgoGBgYGCgoKBgoKBgoKCgoKCgoGCgn+AgIB+f39/fn5/ent5fX16enp9cX6Cent9fX19fXp4f4KAgYKCgICBgYGBgICBgoKCgoaFhIKBgYKBg4GAgIKEgX9+gYB9foF+fX5/gIB9fn+EgH5+f31+fX2KhX1+f31+foB+fX18fH5+fn99f4B9fX18fX9/fHx7fH17e3t6enp7e3x9fn6Ag4CJjouMiIWFhYSDgoKCgoKCgYGBgoKBgoKCgoKCgoGBgoKBgYKCf4CAgH9/f39+fn59eXp6fXx5d3t0e4d8dHd9fn17e3Z2fYCBg4KBgYKCgoKBgYGDg4OChYaEg4CAgIGDgX+AgYSBfn6Af31+gH59fn6AgH+Bfn+Af39/gH99f39/f3+Afn9/gH58fX18fn5+foF/gH2CgHx9gIB9e319fXx8fHx9e3t7fHt8fH19fIqKiYmGhoWFhISDgYKBg4KAgIGCg4KCgoOCgoKCgoGCgoGBg4J/gIGAf39/fn5+fn57enp8fHt2e3R3f352cnt+fnt4dnd8gIGCgoKBgoODg4OCgoODhIOFhoOCgX9/gIKAf4CAg4B+foB/fX+AfX1+foCAf4J/gYCAgICBgH1/f3+AgIGAgIB/fnx9fX19fn59g32AfoKAfX6AgX98fn59fX17fX58fXx8fHt8e3x+ioeHhYaIhYSFhIKCgoGDgYCAgoKDgoKCg4ODg4KCgYGBgYGCgH6AgYB/fn5+fn5+fn56e3p9goN9dXF6fHpxen59eXh0dICAgoKCgoKDhYOEg4KDhISEg4WEgYGAgH6Agn9+f36Bf35+f4B9foB9fX1+gH9/gYCBgICAgIGBfn6Af4GAf4CAgH9+fX19fnx+fn19gYR/gH9+f4GBf31/f319fn1+fn1+fHt8enx7eoCIg4SEhYSEhISDgYKBgYKBgICCgoOBgoOEg4SDg4KBgYKBgYOAfoCBf35+fn5+fX5+fnt7en6Jh354cnl9f3F6eHt4eXV1fYKDgYODg4OFhIWDg4OEg4OEhYOBgICAf4CBfn19fn9+fn5+gH19f3x9fX6Bf4CAgIKAgIGAg4KAf4B+gIF/gIGAgH9+fn1+fn1/fn6FhYGBgX+Ag4F/foGAf35/foB/fn17ent6fHt6goWAg4KCgoKCg4GBgYCAgoGAgIKCg4KBg4SDhIKEgoGBgoGCgoB+gIF/fn1+fn5+fX59fXp7fIWEe3tzeXt8cHd1dnd5dXR6hISBhISDhIWFhoSDg4WEgoODgoCBf4B/f4B9fX1+f31+f39/fn1+fH19foF/gIB/gIB/gICDgoGAf36AgH+AgYCBgH9/f39/f39/gIGCgoKBf4CDgn9/g4J/f4B/gX+Af3x7e3p8e3yCgH+Cf3+BgIKCgYF/f3+CgH6BgoKDgYGDg4KEgoSCgYGBf4GCgH6AgH9/fX5+fX19fn1+e3t6gH94fHZ5enxxdHh3dnh1cnmFhYKEhIKEhYWFhISChIOBg4GAgIF/f4B/gHx9fX6AfX5/f39+fX98fn5+gX+BgH9+f4B/gIODg4F/f4GBgIKBgYGAgIGAgICAgIGAgIKDgYF/gISAfYGDhICAgX+BgYKBfXp7e3x8fYB+f4B9f399fYGAgH59fX9/foKBgYKBgIKCgoKBg4KCgYB/gYKAfn9/fn99fX1+fX19fX19ent7fHZ9eXh6enJ1eXl2d3dzdYaFg4WFgoSEhYSEg4GDgoGDgX+AgX5+gH6AfX19foB+f4B+fn99f3x/f3+BgIF/f3x+gH6AgYKDgYCAgoOEgoGAgYB/gYCAgYGAgYGBg4KBgX+Ag4B+goOEgICCgYKChIJ+e3t8fHx9fn1+fXp+fX14fn9/fHx8fn5+gYCBgYCAgoGBgYGDgoGBf4CAgoB9fn19f319fX59fH19fX16e3p8dnx6d3t4cnZ5e3Z3dnN0hoSEhYWChISFg4ODgYOBgYOBgIGBfX+BfoF9fX1/f39/gH5+f319fYB/gIGBgX9+fH5/fn5/gYJ/gYGCg4eFgX9/fn6Af4CAgICAgIKCgYCAfoCCf3+BgoOBgYOCg4OFg399fX18e3x8eXp7en55e3l4f357fHx+fX1/f4F/gH6BgICAgoOCgYF/gIGBf31+fH1+fX19fX18fn58fXx5e3x4enx3endzeHd6c3Z2c3SGhISGg4KDhISDgoKCg4GBgoGAgYF9gIB+gH1+fX5/gICAf39/f3x/gH+BgIGAf359f39+fn+BgH2AgIGDg4N/f359fn5/f4B/gH9/gYKBgH9+gIF+f4CCgoCBg4KEhYaEgH5+fHx8fHp5dnl5enl2eXZ+fHt7e359fH99gH59fX9/f3+BgoGBgX5/gYF+fX18fX19fX19fXx+jYF8fXl7e3p5fHd4eHR1dXhyd3d0doaEhIWEg4ODg4OCgYKDgYGDgn+Bf35/fn+AfX19fX6AgIB/f39/fIB/f4GAgYCAf3yAf35+foB/fX5+gYGCgn5/fn1+fn5+f3+Af32AgIB+fn1/gX5+gIKBf4KDgoOEh4SAgH58fXx8e3x1eHl4eHh5d3t8e3t7f4V9fn1/ent+fn59foGAgIGAfX6BgH59fXx9fX19fX18e32Dgnx8ent7e3p7d3Z4dXJzdnB4eXJ4hYWFhYOEhIOChIKBgYKBgIKBgIF/fn5+foB+fX58foCAgH+AgIB8gH6AgH+BgIB/fYB+fn5/f359fX6AgYGAfn9+fn59fX5/fn9+fH6Af35+fn+Cfn6AgIF+gYOCg4OGhICBfnx9fHx7fHh3e3h1eXd3eXx6e3t9kod9fH13en1+fn19f35+gH98foB/fn19fH19fX19fHt8ent9enp4e3x6ent4dHh1cXJ0cHh4cXmEhYWFg4SDgoODgoGBgoKAgYCAgIB9fn5/gH18fnx/gIGAgICAgHx/f4B+f4GAf39+gX9+f39+fX18f4CAgIB+f35+fn18fn9/f358fYB/fn1+gIJ/foCAf36ChIKCg4WFgoJ+fXx7e3t8eXd7eXd4d3d4e3t6e3yFiX17end6fH19fHx9fX1/fnx9fn59fX18fX5+fX18fHt6enx7e3p5enp7enhzd3VxcXNveHdxe4WGhYWDhYKBg4OBgoGBgoCCgICAgH5/fn9/fXx+foCBgoGAgIGBfX6Af35/gX+Af3+BgH9/f319fH1/gICAgH9/f35/fXx+f39/f319f39+fn6CgYF/gIB/foGDgoKEg4SCgn5+fHx6fHt7eXt6d3N2d3h5e3p7eXp/fnt7d3p8fXx8fH59fH19fH19fXx8fX19fX99fXx9e3l7fHx7enp6enp6eHN2dXBwcm93dnJ7hYaEhYOEgoGDgoKBgYGCgYKBgYGAf4B/f399fX9+gICBgYJ/goF9foF+fn+Bf4B/gIJ/gIB+fH58f3+BgICAf4B/f4B+fX5+f4B/f39/gH9/f4J/gICAgIB/gYGAgISBgoKAf39+f3x9fn56fYR+dHx9enp6enx5eXp6hoV3eXx8fHx8fXx8fHx8fX19fHx9fX19fn19fX16eX18fH16enp6enp5c3V1b29xb3d0c3yFhoOEgoOCgYKBgoKCgYKBgoGCgYCAgICAgH59gH+Af4GCgn+CgX+AgX5/gYB/f4CAgn+Bf319f35/f4KAgICAgIB/gIB+fn1/gH9/gIB/f39/gH+AgICAgH+AgYCBgYGCgYCAf39/fn1/fnuBko16fH18e315e3p6eHqBgXh5e3x8fXx8fHx8fHx9fX18fH18fn1+fn59fHp8fHt9fXt5enp6eXl0dXVvb3Fwd3N0fYWGg4OCg4KAgYCCg4KAgYGCgYKBgYCBgIGAfn6Af4GAgYKCgIKCgICCfoCBgX9/gX+BgIF/fH6Af3+AgoCAgICAf3+AgH9+fX6Afn2AgIB/f3+AgICAgYCAf4CAgYCBgYKBgICAf39/fX5+fIGGiXx8fnt7fnl6e3p7j393d3l8fHt9fHt8fHx9fH19fX18fXx+fn5/f358enx9e319e3l6e3p5eHN0dW5zcXB4cnV6hYaDg4KDgoCAgIKCgYCCgYKCgoGBgYKAgYF/fn9/gYGCgYKBg4OAgYJ/gYGBf4CAgIB/gX99f4F/gICBgICAf4B+gICAf359foB+fn+Af39/gH9/gICBf4CBgH+BgIGCgoGAgICAgIB9foB9gIOCe35+e3x9e3p8fHuHenh4eXx8fH17fHx9fH18fH19fn19fX5+f3+Af317fHx8fHx7enl7e3l5c3J1bnZycHhxdnaFhYOEg4KCgICBgoF/gIKCgoKDgYGDgoCCgYB/gICCgoKBg4KEhICBgX6BgoB/gICAgH+Cf36AgYCCf4CAgIB/gH+AgIB/fn2Af39/f4B/gH+AgH+AgYGAgICAgIGAgYGBgYGAgYCAgH9/gH5/fX59fn57fXx9fHx9eHh1eHh5e3x8fXt7fHx8fX5/f39/fn19foB/f4GAf3x9fHx9e3p7eXp8eHpzcnVud3FxenF2d4WFg4SDg4KBgoKDgICCgYSDg4SBgYOBgoKCgYCAgIKDgoCCgoSDf4GAfoKDgICBgICAf4CAf4GAgYKAf4CBgH9/gICAgIB/f4CAgH+AgICAgIB/f4CBgYCAgICAgYGAgoOCgoCCgYGCgYB/gIB/gId+fnx7fXx7fX94d3Z5eXp7fHx8fHt8fH19fn5/gIGAfn1+gICAgoGAfH59fX58d3t6ent5eXNxdW53cHV6cnZ5hYWCg4KDg4KChISAgIOAhoODhIGChICEg4KCgICCgoSBgYKBhIJ/gIB/gYOCgYCBgYCBgIGBgYGBg4B/gYOCf35/goGAgH9+gYCBf4CAgYCBgYCAgIKBgYKBgX+BgYGBgoOCgoOBg4OCgYCBgH9/hH19fXx/fXp9f3t5dnp4eXt7fH19e3x9fX19fn+AgYGAgH+AgICDg4B8f35+fn15eXt6enp5c3J0b3dxd3lzd3uFg4KDgoOEgoOEg4CBg4OGg4ODgoKEgYSDgYOAgIKBg4GCgoGCgX6AgICCgYKBgYKCgIGAgICCgoGEgH6Bg4J/foCDgoCBf4CCg4KAgYKBg4KDgYGBg4KChIGAgYOBgYKEg4KEhIODhIODgYGBgoCCf4B/fYB8enx/fHt3fHl5eXt6fX59fH18fH1+fn+BgYCAgIGBgYOEgH2Af39/f357e3t6e3p0cXhxeXR2eHR2e4SCg4KDg4SChIODgYKChIWEgoOCg4SBhIOBg4CBg4KCgoKCgYKAf4GAgIKBgoGCgoKBgIGBgYKCgoOAfoGDgX9/gYSEgYN/goKBg4GCgoGDg4OEgIKDgoOCgoGCgoOBg4SDhIOEhYSFg4SCgYOCgYOBgYGAgH58fIB9fHh8eXp5enx9f3x7fHx9fX18fICAgICAgYGBgYKBf4CAgICAf3t7e3p6enVweHd5dnV8dXZ8gICDgoODg4OEhISBgoOFhYWDg4KDhIKEhYKCgYKDg4GCgYKAgYB+gYCBgYKDgoKCgoGAgYKCg4KCgoB/gYKCgICChIODgoGCgoGDgoKDg4SDg4SAgoOCg4OBgX+Bg4KDhYKEhISEhISDhISChIOEhIKBgoCBgHt9gX58eXx6enp9fHyBfXp8fH19fHp7fn5+gIB/gYGBgICAgIGBgIB/fX18fH17dnJ2eHh2dH92dX2Hh4OChIWDg4SFhIGChIaEhIOCg4SEgYOFg4KCgoODgYOCgoCCgH2AgIGCg4KCgoKEgoCCgoODgoKBgICBg4KAgYOFhIOCg4CCgoOCg4ODg4OEg4CCg4KEg4KCf4OBgoSEgoSDhISEhIOEhIOEg4WEg4ODgoKAe4CBf3x8fXp6fH2AfX9/fHx6fH59fH19fn5/f39/gICAgH9+foCBgICAfnx9fn5/fn18fHh2f3Z3f4SHg4KDhoODhIaEgYKFhoWEhIODhISChIWFgoKDg4SCg4KDgoKBfoCAgoKDgoODg4SDgYKCg4OCg4KCgYGDgn+Cg4SDg4KEf4KEg4ODg4SDg4SCgIOEg4SDg4KCg4KChIOCg4OEhISEhIWEg4OEhYSFhIOBgoB9gYKAfXx8e3x8gH19foB+fn1/fnx8fH19fn5/fn+BgYGBgH9+fX6BgYB+fn1+fX5+fn5+f3+AfH2AgYKCg4OFg4SDhoSBgoiGhYSDg4SEhYGFhYWDg4SDhIODgoOCg4F+gYGCg4SCg4OEhIOCg4KEg4ODgoKDgYOCf4KDg4ODgoOAgoWDg4ODhIODhIOBgoSEhYODgoODgoGEg4GDg4SEg4SEhYSEhIWFhYWEg4ODf36Bg4B9fXx8fHx/gX5/f39/fX99e3x9fX19fX5+f4CBgIGBgH99fH6Cf39+fn5+fX1/f39/gYCAf4CEhIODg4WDhIOFf36CiouFhYSDgoSFgYaGhoOEhISEhIODg4OEgn+BgYODhYSFhIWEg4KEhISFhIODgoSDhYKBhISFhYaEgoCDh4SDg4OFhIWFhIGEg4OHgoOCg4GCgYSDgoODhIODhIWEhYWHh4aHhYSEhYSBf4GDf35+fH5+fX+BgH9+fHx/f358enx9fX19fX5+fn9/gIGBf319fIB/gH5+fn5+f3+BgYGBgYKAgYWFhIOEhIKEg4aAgoSFiomEhISEhYWCh4aGhISEhIWEhYSEg4SEgYKDg4OEhIaEhYSDg4SEg3yDhHuBhHd5g4J9hH5+cnWDgoF2foOFgH2BdYF6hH9/f3+EhIKDgoKBg4SDhISFg4SFhoSFhn2Een1+f4N7hYOBhIOBf31+f35+goOBfXt/fX6Afn18fHx9fX19fH19foB/gYJ/fX18f4GBgICAgH+BgYGBgYKDg4KChoSEhIaEgYOEhYOEhYSKiIWFhYOFhYSGhoaDhIWFhYWEhYWEhIWCgoOEhYWFhoSFhIOEhYWCaICFanx7cXF8gXOGc3R0fYKDdXNxg4ZzcHVyc3SDdnt9dYF/goOAgnZ5hYCDgIR/hYSChYWCaHpyc3N8gHKChH6Dg32BfX5/fn+Cg4J8f4F9f4B9fXx8fHx9fXx8fn1+gX+BgX99fX2AgYKBgYGBgIGBgYKBgoKCgoSHhIWEhYSCgoSGhoOFhIaIhoaFgoaGhoeGh4OFhYaFg4KFhoSFhYODg4SEhoaGhIaEg4SEhn1we4FweXZ+g3+CbnlwdXN8dnl5hnOEg3B2eHF2dHR1cnN0dml/gG5yb3R2bnVsd216c26Ah3ltfXJzdnN2bW53bHB5bHV9f358foGAgX2Af32Af4B/fX18fHx9fH1+f32Af4CAfnx/foCBgYCBgICAgYCAgIKDgoKDhYeGhoCChYODhYeGg4WFhYaHh4SDhoeIiYaHhIWGiIeEg4WGhYWEhIOFhIKFhoaFhoWEhoWHdnB0e3BydX+HhYNtdW92b3x1coR5eYd4cXR3bndod3pucHWCcoN+b3p5eW1vbnpvb2x3fXiGcHF6cHJ0ZoF1fm57eXNveX+Af31+gYB/e39+fYB+gIB+foCAgYB+fn9+foF/gIB+fYB9f4CBgIB+fn+BgH9+goOCgoSFh4eEfoeEhIOFh4aEhYWFhoaIhISGh4iIhoeEhoaLiYWEhoeHhYSFhIWEgoWFhYWGhYWGhYZxdXByc29zenl+hHSIdHV+iHZugnKEhnluanJ/cW1zd3x/dXR8hH54cXV3bnl1enF2eHV6eYRyaW95eHBreXN6b3p3dnZwgYB/fn5/f396fn19f31/f359gIGDg4CCg4GBhIKAf4GCgH1/f4F+f359foGAfn6BgoCAgoSHhoODhoSFhIWHhoWFhYWHhoiFhYaFh4eFhoSGhomIhYSJioiFhIaFhoWDhYWEhoaGhoaFg3iLeXKIentwcIWEeIV4eWtzfnl7a3KDh4N6fG16eXl0fYB2bm+AgG90fHV3cHl9fW1+dW+DhYZ6gHJye3x1cG96a3N8bnaCgYF+fn99fXt9e3x9fX9/fX1/f4KCf4GDgYGDgYB/gICAfn9+f31/fn1/gH58fYGAfn6Ag4iFhoOFhYWFhoeFhYWFhYeHiIaEhoWGhoaFhIWFhYWFhomKh4WFhoWGhoWGhoSGhoaGhoWGh4eHhoaEhoWGh4iHhYeGhoOHhoWFg4SGhoWGhIaEg4SEhoSDgYSDhIOFg4WEhYSGg4WGhYWEhIWHhoSEhYaFhX13hYSEhIOCgX5/fnt8e358fH1+f399fX9+gYB9f4F/f4GAfn5+gH5+f35+fX99fX5/fHt8f358fH+BiYaFhIaGhoWGhoWFhYWGhoeIhoSGhYeFhYWDhIWGhYSGhoaGhYWGhIWGhoaGhIeGh4eGhYeIiIiIhoWHhYaGiIaFiIeIhYeGhoiFhYaGhYaGhYOChYWGhYWDhISEhIaEhoaEhYWDhoaFhYWEhoaGhISFhoOFhIKEg4OFg4OBfYB/e3t8fnt8fH1+fnx8fn2Afn1/gH5+gH99fXyAfX5/fn5+fnx9fX57fHx/fHt7fn+Ih4SEiIaGhYeGhYWEhoaGhoiHhIWGh4aFhIODhIaFhIeFhoaFhYaEhYaGh4eFh4aJiIaGiIeIiYiFhYiFhoeGh4aHhoeFh4eGh4WFhoeFhoaFg4OFhoaEhIOEhIOEhoSGhoWFhYOGhoWGhYSGh4WEhIWFg4SIhoSDg4SDhIJ+gYB8e31+e3x7fn59fHx+fX5+fX9+fX1+fn19fH98fn58fYF/fHx8fXx8fH56e3t8foiHgoWIh4eGhoaGhISGhoeGiIaEhYSHhoSFh4OEhYSFh4SFhoaFhoSGhoeHhoaHh4mIhoaIh4iKiIWGiIWGh4WHhoeGh4WIiIeHhYaGh4WGhoWChISFhoWFhISEg4SFhIaGhoWGhIaFhoaFhYaHhYSDhISDhIeDhIGChIWDgYCAgHt7fn58fHx+fXx8fH1+fH18fn18fX18fHx8fXx+fXt8gX99fH18fnx8fHp6fHx9iIeChoiHhoeGhoaEhYaFhoWGhYOFhIaFhIiJg4GEg4SGhIaGhoaGhIeHiIiHh4eIioiGh4iHiImIhYiHhIaGhYeHh4WHhoiIh4eFh4eHhoaHhIKEg4SGhYeFhISEhISFhoaGhoWFh4WFh4WGhYaFhIOEg4OEh4GDgIKDhIKCgn+Ae31+fnx8fH59fHx9fH17fHx8fHx9fXt7e318e359e3x/fX18fX1+fXx6ent7fHyIh4KGh4aGh4aGhYSFhoWFhYWEg4WChoSDiId/enqChYaEhoaFh4aEh4eIiIiHhoiKh4aHh4eIiYeFiIaFh4eGhoeHhYeGiIiHhoWHh4iGhoeDg4SEg4aGh4WFhISEhYaGhoaGhYaHhoaIhoaEhoWDg4ODgoOGgYN+goKDgIOCf398f35+fHx9f318fX18fnt7e3p7fHx8e3t7fnt7fXt6e358fHx8fX5/fXt6fHp8fImHg4aFhoWGhoWFhIWFhYWFhIOBhIGGhIKEhHyAhn+ChYWGhYWGhYSHh4iIiIaFiYqHhYeGh4eIh4WIhYaHiIaGh4eGh4aIiIeFhoeGh4WFiIOEhoWDhoaHhoWEg4WFhoaGhoaFhoaHhoeHhYOFhYOBgoKBg4WCg36BgoF/hIJ/f35/fn58fH1/fXt9fXx+enp7eXt8fXt7e3t+fHx8fHp7fXx8fHx+fYF8e3t7e3x8iYeEhoSGhIaGhYSFhYWEhIOEgoCDgYaCgYJ/eoSMe4CEhYeGhoaFhIeIh4aHhYWHiYeEh4WGhoiGhYeEhoeJhoaIh4eHhoeIhoSGhoaHhYWHg4SFhIaGhoeFhYSDhYWGhoeGh4WGhoaFhoaEg4SFgoGCgYCEg4OCfYGBf36DgX5/f4B8f3x9fX59e359fH16enp5e319enp7e318fXx8enp9fHx9fH5+gHt7e3x+fXyIh4WGhYeEhoSFhYWFhIODgYOBgIKBhYKAgH9/fXx7gYSFhoaEhYSEh4eGhoaFhIaJhoKGhIaGhoWFh4aGiIiGhYiHiYeGhoeFhIaFhYeFhIeDhIWEiIaGh4WFhIKFhYaFhoaHhYWGhoWFhoKDg4WBgIGAgISAg4B8gYB+foKAfYB/gX2AfH1+fX57fn18fHl6enl6fX15ent7fHt8e3t6e319fH18f35+fHt7fX59fIiGhYaGhoWFhYSFhYSEgoKAgoGAgICDgX5+foB5en2Ag4SFh4WEg4OHhoOEhYSChYiFgoSDg4WFhYWHh4aIiIaFiIeJh4aFhYWDhoSFh4ODhoSEhYSHhoWGhYaEgoWFhoaGhoaEhYaGhIWFgoKDhH9+gICAgYCDgHyBf31+gn5+gH6Af399fX59f3t/fXt6eXp6eXp8fXl6e3t7enx7e3t7fH19fXx/fn18fH1/fnx7h4WFhoaGhoSFhIWDhYKBgICAgYB+f4KCfX1/f3t/f4KDg4WGhYSDg4aDgYOEgoCFh4WCg4GBg4SEhYaGh4eHhYWIhomHhYSEhIKFg4SGgoOGhISGhIeGhoWFhYODhYSFhoWGhISEhIWDhYSAgIKDf35/f39/gIN/fIB9fX+CfYCBfn6Bfn5+fX1/e398e3p5enp5ent8eXp6ent7fHp7e3t8fX59fYB9fXx8fYB/fXyGg4aGhYaGg4SDhoKFgYGAf3+AgH5/gYF8fn9/fn+AgoKChISDgoGChIGAg4KBgISFhIKBf4CCg4KEhYWHhoaEhYeFh4WGgoOCgoOCgoWBg4WEhYaEhoaGhoaFg4SEg4SFhYWDhIODhIKEhIB/goJ/fX5+fn5/hH57f3x8gIF9gYB9foN9fn59fX57fnt7enl6enl6ent5enp6e3t8enx8fHx+fn1/gXx9fHx9f4B+gIaEhYWEh4SEg4KGgoOAgYB+fn+AfX9/gnx9f35+f3+BgYKEg4KBgYKCf4CBgoCAgoWEgoB/gIGCgYKGhYeFhISGhoOFg4WBgoGBgoGCg4GChISEhYWGh4eGhYWEg4ODhIWFhIGDgYOChIODgH+AgX59fX5+fH6Dfnx+fHyBgX6Cf35/gnx/fn19fHx8e3t6enp6eXt5e3p5enp6e3x5e317e35/f4GAfX99fX1/gICAhoSEhYSFgoSCgoSCgoCBgH59fn9+fn6AfX2Afn5+foGBgoODgoSHgYF+gICBf3+ChIOBf35/gIJ/goWEhYOCg4WFgoSBg4CBgIGAgYKBgIGEg4OGhYWHh4WEhIWCgoKDhYSCgYGBgYCFg4F/foB/fnx8fn18foN9e358fYB/gIN9fYCBf35/fXx8fX17e3p5enl5e3l6enl6ent7e3p7fXx8f3+BgoB+gH+AgH+AgIDKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzNzc3Nzc3Nzc3NzczMzMvLy8vLy8vLy8vLy8vLzMvLy8vLy8vLy8vLy8vMzMzMzM3Nzc7Oz8/Pz9DQ0NHR0dLS0tLS0tLT09PT0tLS0tLS0tPT09TU1NTU09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tLS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1dXV1NTU1NTT09PT09PT09PT09TU09PU1NTU1NTU1NTU09PT09PS0tLS0tPT09TU1NTU1NPT09LS0tLS0tLR0dHR0dPHhnNlYFtLWWdVTUZIQD03Nzg5Nzw8PDo8Oz42Oj04PDs6OTg3ODs7Oj87PTs8PD47P0E/QkJBQ0RFREE+PTw7QENDQUBDQ0FBR0hHSUtSwtXS09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXVysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMy8vLy8vLy8vLy8vLzMzMy8vLy8vLy8vLy8vLzMzMzc3Nzc3Oz8/P0NDQ0NHR0tLS0tLS09PT09PT09PT09PS09PT09TU1NTU1NTU09PT09PT09PT09PT09PT1NTU1NTU1NTT09PT09LS0tLS0tLT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1NTU1NPT09PT09PT09PU1NPT09TU1NTU1NTU1NPT09PS0tLS0tPT09PU1NTU1NTU09PT09PS0tLS0tLR0dHSzIxyZ2BcTVllUktHSz87Mzc4Ozg5Pj05PDpBOjs9Nzs8PDo6Nzg6Oz0/Oz88PTw/Pj9BPUFBPkNDREJAQT46Oz9DREFDRERCQklHSEhJTr7V0tPT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1crKy8vKysrKysrKy8vLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzMzMzMzMy8vLy8vMzMzMzMzMzMzLy8zMzMzMzMvLzMzMzc3Nzc3Ozs/P0NDQ0NDR0dLS0tLS09PT09PT09PU09PT09PT09TU1NXV1dTU1NTT09PU1NPT09PT09PT1NTU1NTU1NTU1NPT09PS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1tbV1dXV1dTU1NTT09PT09PT09PU1NTU09TU1NTU1NTU1NTT09PT0tLS0tLT09PU1NTU1NTU1NTU09PT09PT0tLS0tHR0s+Sd2hfXk9XZ01LRks9ODc2NTk5OTw+OT88Qzk7PDc5PD07OTc5Ojw9QDs+PT47PD48PT5BQD5EQ0NDP0E9Ojs+QkNFQ0NEQT9FSEpJSky61dPT09TU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8rKysvLy8vLy8vLy8zLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMzMzMzMzMzMzMzMzMzczMzMzMzMzMzMzMzMzMzc3Nzc3Ozs/Pz9DQ0NDQ0dHS0tPT09PT09PT09TU1NTT1NTU1NTU1NTV1dXU1NTU1NPU1NTU09PT09TU1NTU1dTU1NTV1dTU09PT09LS0tLS0tLS09PT09TU1dXV1dbW1dXV1dXV1tbW1tXV1dXV1NTU1NTT09PT09PT1NTU1NTU1NTU1NTU1NTU09PT09LS0tLT09PU1NTU1dXV1dTU1NTT09PT09PT0tLS0dHRmn5nYWJOVWpKSElLPzw6OTM3Njc2PTs+Oj06Ojo4ODo7Ozg4Ojs7PD46PT09Ojw/PD0/QkA/Q0RDRD5APT08QENEQ0JEQkQ+REhJSUtMttfT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3MzMzMzMzMzMzMzMzNzc3NzczMzMzMzMzMzMzMzc3Nzc3Ozs7Pz8/Q0NDQ0NHS0tLT09PT09PT1NTU1NTU1NTU1NTU1NTV1dXV1NTU1NPT1NTU1NTU1NTU1NTU1dXV1NXV1dXV1NTU09PT09PS0tLT09PT09PU1NXV1dbW1tXV1dbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1NTU1NTU1NXU1NTU1NTT09PT09PT09PU1NTU1dXV1dXV1dTU1NTU09PT09PS0tLR0p+DaV9kU1hsSEhIS0A9Nzg0NzY6Oj87RDw8Ojw8OTg6OTo6Ojs8Ojo7OT48Pjk9QDs/QUFCP0JCQUM9Pz8+PEBCRUNDQkBBO0ZJR01MSbLY09TU1NTU1NXV1dXV1dXV1dXW1tbW1tbV1dXW1svLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzM3Nzc3Nzc3Nzc3Ozc3NzczMzMzMzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc3Mzc3Nzs7Ozs7Pz8/P0NDQ0NHS0tLS09PT09PT09TU1NTU1NTU1NTU1NTV1NXV1dTU1NTU1NTU1NTU1NTV1NTU1dXV1dXV1dXV1dTU1NTU1NPT09PT09PT09PU1NXV1dbW1tbW1tbW1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTV1NTU1NXV1dXU1NTU1NTT09PT09PT1NTU1dXV1dXV1dXU1NTU1NTT09PT09LS0tSjiGxfZlJWakdIR0lBPTM2Njo7PDhDPEJBPjxBPDg5Ojw6Ojw8PDk8PTo7PD09PD89QD9AQT9AQUBCPD4+PzxCQ0NDRkBBQT1ISklOTUeu2NPU1NTV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbLy8vMy8vLy8vLy8vLy8vLy8vMzMzNzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzs7Ozs7Oz8/P0NDQ0NHR0dLS0tPT09PT09TU1NTU1NTU1NTU1NTU1NTV1dXV1dTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dXU1NTU1NTU1NPT09TU1NTU1NXV1dbW1tbW1tbW1tbW1tbX19bW1tXV1dXV1dXV1dXV1dTU1NTU1dXV1dXV1dXU1NTU1NTU09PT09PT1NTU1NXV1dXV1dXV1dXV1NTU1NPT09PT0tLWroprY2VSWGhMSkdJQjg0OTQ6Ozo5QDk+Q0U/PDs5OTk9Oj07PDw6PTw7OTw9Ozs/PUA9PT5AQD9CQT5APD05QERDQkFBQj48SEpLTU5HqNnU1NXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbWy8vMzMvLy8vLy8vLy8vLy8rKy8vLzMzMzMzMzMzMzM3Nzc3Nzc7Ozs3Nzc3Nzc/Pz8/Pz8/Pz8/Pz9DQ0dHR0dHR0dHR0dHS0tHV2djY2NnZ2dra2tvb29vZ2dnZ2dna2tra2tra2tjW19fX19fX19jX2NfX19rb2tra2tra2tvc29vb2dfX19fX19fX19fX19bX2tva2tra2tra2trb3NzX1dXV1dXV1dXV1dXW1tbX1tbW1tbV1dXV1dXV1dXV1dTU1dXV1dXV1dXU1NTU1NTU1NTU09PU1NTU1NXV1dXW1dXV1dXV1dTU1NTT09PT09PS1bqKa2hoUlhlSUlMTkA5OTo0O0A8Nz05QUM9QD89ODo6Ozk9Oz4/Ojs8PDo7PDo7Pj1APT8/P0FAQUE/QTw8Oz5BRENBREA9PElJSk1NRqPa09TV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbW1szMz9DPz8/Pz8/Pz8/Pz8/W3t3d3t7e3t7e3t7e3t3S0NDQ0NDQ0NDQ0NDQ0ci5ubm5ubm5ubm5ubq6t6WkpKSkpKSkpKSkpKSnhmBjY2NjY2NjY2NkZGRlhIuKioqKioqKioqKioemuri4uLi4uLi4uLi4ubSNi4uLi4uLi4uLioqKiJ+7ubm5ubm5uLi4uLi5sIuLi4qKioqKioqKiouHvebh4uLi4uLi4uLj4+Pi2NfX1tbW1tbW1tbV1dXV1dXV1dXV1dbW1dXV1dXV1dTU1NTU1NTU1NTV1dXV1dXW1dXV1dXV1dXV1NTU1NTT09PT09XDkXJsaU5TYkxMVk08Ojo3Nz5DPzg+Oj8/QTw/QDc7Ojs7PTs+Pjo7PD48Oz07PT8+QDw/Pz1AQEBBPj88PjxAQUVCQkZAQD9HSEpLUEae2tXV1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19fMzNDS0tLS0tLS0tLS0tLR3uzr6+rq6urq6urq6uvp1dLS0tLS0tLS0tLS0tTEqaqqqqqqqqqqqqqqq6aGhIWFhYWFhYWFhYWFik4MEhISEhISEhISEhIRE0pUU1NTU1NTU1NTU1NPg6ejo6Ojo6Ojo6Ojo6ScWFJTU1NTU1NTU1NTU093qKSko6Ojo6Ojo6OjpZVTU1NTU1NTU1NTU1NTS6ry6+vr6+vr6+vr6+vr6dnX19fX1tbW1tbW1tbW1dXV1dXV1dbW1tbV1dXV1dXV1dXV1dTU1NTV1dXV1dXW1tXV1dXV1dXV1dXU1NTU1NTU1NPUy5h3bGlKTl9NUlVNPjw8Nzs/Qz42Ojc+Pzs9QkA5PDk9Ozw6PD07PTs9Ozs9PD0+PT07QT08QUBBQT08Pzw7QEJDQURFPUFAQ0ZLS09GmNzV1dXV1dbW1tbW1tbW1tbW1tfX19fX19fX19fXzMzQ0tLS0tLS0tLS0tLS0d3q6enp6enp6enq6unq6dXS0tLS0tLS0tLS0tLUxaqrq6urq6urq6urq6yoiIeHh4eHh4eHh4eHh41SEhgYGBgYGBgYGBgYFxpOWVdXV1dXV1dXV1dXU4WopKSkpKSkpKSkpKSmnlxWV1dXV1dXV1dXV1dTeqmlpaWkpKSkpKSkpKaXV1dXV1dXV1dXV1dXV0+r8erq6urq6urq6urq6unZ19jX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dXV1dXV1dXU1NTU1NTU1NGcenFpSlRdT1JVTkQ+Pzs/QEA4Ojs4PDw8Oz46Ojs4Ozk5Ozw7Ojw5Ozs8Ozo9PT0+PUE/Pj8/Pj08PT88PEFBQ0FERTw+QEVGSktNRpPc1dXV1tbW1tbW1tbW1tbW1tfX19fX19fX19fX183Nz9HR0tLS0tLS0dLR0dHc6Ofn5+fn5+fn5+fn5+bV0dLS0tLS0tLS0tLS08Wtrq6urq6urq6urq6vq46NjY2NjY2NjY2NjY2SXSInJycnJycoKCgoKCcpWmNiYWJhYmJiYmJiYl6MrKmpqampqampqampqqJmYWJiYmJiYmJiYmJiXoKtqampqampqampqamrnmNhYmJiYmJiYmJiYmJbr+/p6enp6enp6enp6enn2djY2NjY19fX19fX19fX19fX19bW1tfX19fW1tbW1tbV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbV1dXV1dXU1NTU1NTWo3txZElbYE5OVU9AQT89REI+Oz06OTo6PTw7PDs6OTg5OTs8Ozw8Ojo7PDo7QD08PTxAQTxBQTs7PEA/PD1CP0RDQ0U8PkJERkpMTEWN3NXV1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjNzc3Ozs7Ozs7Ozs7Ozc3Nzs/Pz8/Pz8/Pz9DQ0NDQz87Ozs7Ozs7Oz87Ozs7NzMzMzMzMzMzMzMzMzMvJycrKysrKysrKysrKysfCw8PExMTExcXFxsbGxsvMy8zLzMzNzMzMzMzLz9HR0tLS0tLS0tLS0tLRzczMzMzMzMzMzMvLy8vN0tLS0tLS0tLS0tLS0tHNzM3Nzc3Nzc3Nzc3NzdTY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NfX19fX19fX1tfX19fX19bW1tbW1tbW1tXV1dXV1dXV1dbV1dbW1tbW1tbW1tXV1dXV1dTU1NTU169/cF5GXmJQUVdOR0ZDQ0lBPz07PDo8N0BBPD04Ojs4OTg7Pzs8PDs7PDw8PD87PD46Pj44PkI8Pj1BPjw+QkBERUNAPD5APkNJSUtEh9zV1tbW1tbW1tbW1tbX19fX19fX19jY2NjY2NjYzs3Nzc3Nzc3Nzc3NzdHNzc3NzczP09LSzs3P0s7Ozs7Ozs7O0tPPz87Q09DO0tTV1NDPz8/Pz8/Pz8/Pz8/P0NDQ0NDR0dHR0dHS09PU1NTU1dXV1tbW1tfW1tbX1tfX19fX19fX19bW1tbW1tbW1tbW1tbW1tfX19fX19fX1tbW1tbW1dbW1tbW1tbW1tbW19fW2NjY2NjZ2dnZ2dnZ2dnY19jY2NjY2NjY2NnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjX19fX19jY19fX1tbW1tbW1tbW1tbW1tbW1dbW1dbW1tbW1tbW1tbW1tXV1dXV1NTV1di4gm9WSl9jUlFaS0hBQTxCPT07Oj4+PD4/PT0/ODk6OTk3OD48PD47Ozw7PDs/PT0+OTs7OT0+P0A+QD07OkI/QkNCPz0+QD5CRUdKQoDc1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2M7Ozs7Ozs7Nzc3Nzsqfys7Nzc3QuYOEi8fTwJrLz87Ozs7O0qucz8/SuY++1JyChIrGz87Ozs7Ozs7Ozs7Oz8/Pz8/P0NDQ0NDQ0NDR0dHR0tLT09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbV1dXV1dbW1tbV1dXV1dXV1NTU1NXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NfX19fX1tbW1tbW1tbW1tbW1tXV1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXYwIBuVU9gY1dZW0xMQ0A9PTw9Ojw9Qj5CQkA8Ojg5ODo6Ojc7Pz4/PDw7PDo5Pzw8PTg5PD9BPj09PUFAPTtBQkBCQz47QD9BQUlHSkF629bW1tbW1tbX19fX19fX19jY2NjY2NnZ2djY2dnOzs7Ozs7Ozs7OzdKpj63Rzs7Ozpu3tqSiwJOerNPOzs7O0racpaPUwJSwnLGWuLmvodLOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0dHS0tLT09TU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dbW1tbW1tXV1dXV1dXU1dXV1dXV1dXW1tbW1tbW1tbW1tfX19fX19jX19fY2NjY2NjY2djY2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2dnY2NjZ2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV18h/b1pTYWVeXVxPSkQ9QD8+PDc6Pjk/RD5AOTg3ODk7Ozw4OT89PTw9PD47OkE7OTs5OzxDQDw7PT5AQT49QkQ/QkM9PT8+Pz5ISUg/ddrW1tbX19fX19fX19fX2NjY2NjZ2dnZ2dnZ2dnZzs7Ozs7Ozs7Ozs/Inrym0tDQzsqgl36Cw6abr6fUz8/Pz86dnJGdxaSgi5HDk31+r7DRzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dLS0tPT09TU1dXV1dXV1dXV1dXV1dbV1dXV1dXV1tbW1tbW1tbV1dXV1dXW1tbV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2djY2NjY2NnZ2dnZ2dnY2NjY2NfX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dbV1dXV1dfNiHNdWGloXl9gT0lGOkFAPj48PDk2P0I/Qjo2NDg6Ozo8Ojk+PD49PTs/PTxBPjw8Ojw8PTw6PEA9QEI+PkFCPUNDPT0+Oz9BRUtIQHDZ1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2c/Pz8/Pz87Ozs7SrKWnqdXAvNLHnY+ey9PJipmq1M/Pz9G/mKCbs6edh5261NLNnp7D0M/Pz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0dHS0tLS09PT1NTU1dXV1dXV1dbW1tbW1dbW1tbW1tbV1tbW1tbW1tbW1dXV1dXV1dXW1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnY2NjY19fX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0JB1W1tqaWFeXVNOSTxDQEE+QD46OEVAP0I6NzQ6Ojo5Ozs4Oz0/PT49QT08P0A9Pjw8PDw8Oj1AQD8/PT5CQD9AQkA8QD0+QUVLRz9r19fX19fX19fX2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnPz8/Pz8/Pz8/QzJ2Nl6zQmpfKxZ6ynpbN1q2ZqtTPz8/TtJmWqrmXnJCfoNLTwKCg0M/Pz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0dHS0tLT09PT1NTU1NXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX19fX19fY19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tKUcl5ea2tqZV1PTEc/RENDQDo9OzxCPD08OTY0Ojk4Ojo5Nzs/QDw8PUA8PEE+PD07PTw/PDo8Q0A+PTs9QD5CPkBBPkA9QD9GSUQ/ZtXX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2traz8/Pz8/Pz8/P07GigJuvyaCjv8qcpYynrdiqmarUz8/P1KuafqOSiqyvkaG516+iqdTQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1NXV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dbW1tXW1tbW1tbV1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbSk3BgXnBoZmVaUUhHQkVDQEA3Ojo8Pjk8OTc2NTk6Njo8Ozc8P0A8Ojo9Ojw/Pj08OUA8PDo6OT9APT08PUBBQz9APz5BOz9ARkpCP2LS2NfX2NjY2NjY2NjY2dnZ2dnZ2tra29vb29vb28/Pz8/Pz8/P0M6fkGyclteqo9PSrqa1mJ/Vqpmq1M/Q0NSsm6eLmIqhmq2bqdijobrU0dHR0NDQ0dHQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1dXV1dbW1tbX19bW1tbW1tbW1tbX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfW1tfX19jY2NfX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX1tbW1tbW1tbW1tbW1tbX19fX19fW1tbW1tbX0pNuYFxxZGdkWlVKQENHREFBODs/PD07PDw3NTU4OTY4Ozo5PDo+Pzw9PTk8Pz49Ojo+OTw6Ojg+Pzw9PTw+QEFDQT48PDpCRERKRkJd0NnX19jY2NjY2NjY2dnZ2dna2trb29vb29vb29vPz8/Pz8/Pz9G9n8O31pfA09HQ0srSzZeb1KqZq9XRz9DTtrKypZubmqbFmKLRnp/J0tHR0dHR0dHR0dHR0NDR0dHR0dHR0tLT09PU1NTV1dXV1tbW1tfX19fX19bW1tbW1tfX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19fY2NjY2NjY2NjY2NjY2djZ2dnZ2dnZ2dnZ2dnZ2drZ2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fX19fX19fW1tfX1tbX19fX19fX19fX19bW19GSbF1cb2doYl1PRj9ISEZFQDw8Pj48PT08NzU2Ojk2Ojs6Ojs4QD86PDw5PD49Ozs6Pzk/Ojs5PT49Pjw7PTxAQ0I/Pz47Q0ZGR0hEWc3a2NjY2NjZ2dnZ2dnZ2dna2trb29vb29vb29vb0NDQz8/Pz8/Pz5V+e6WS1KKa08ySl6ObodirmavV0pem1cSimZacr56cm5utx5+h0tHR0dHR0dHR0dHR0dHR0dHR0tLS0tLS09PU1NTV1dXV1tbW19fX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tbX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2tnZ2dnZ2dnZ2djY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX1tfPjGRWXnBrXGBgTkVITUlJT0M+OkI9PUBCOzU1Nzw6Nzo7Ojo7OT09Ojo6OT0+Pz07OT47PDo8Ozk+PD47PD0+QENCPz5BPEFDR0ZGRVXJ29jY2NnZ2dnZ2dnZ2dra2tvb29vb29zc3Nzc3NDQ0NDQ0M/Pz9DR1aeZrcmjqL7KnbGdo7XZqZup2LiroMfVoqukms+mq6SexbSkptbS0tLS0tLS0tLS0tLR0dHS0tLT0tPT09PU1NTV1dbW1tbX19fX19fX19fX19fX19fX19fX19bW1tbW1tfX19fX19fW1tbW1tbW1tbX19fW1tbW1tbW1tbX19fX2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2djY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fX19fX19fX19fY2NfX19fX19fYzYZdV2JvZE9dVEtIRlNRS0tAPj1EPD9DRj01NTc7OTY6Ozo8PTo7Pzo6OTg6PT0/Pjs/Oz49Ojs5Pjs9PD0+QURCQD8+PzxAQUVHRURSxdvY2dnZ2dnZ2dnZ2tra2tvb29vb3Nzc3Nzc3NzQ0NDQ0NDQ0NDQ0NO5gL3Tm5bP1LWLkZ/T1LyBu9TOlKDT08iSjbTWzJOQp9e5g7/V0tLS0tLS0tLS0tLS0tLS0tLT09PT09PU1NXV1dbW1tfX19fX19fY2NjY19fX19fX19fX19fX19fW1tbX19fX19fW1tbW1tbW1tbW19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2tnZ2tra2tra2tra29ra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2NfX2ct+WlVpaltMX01KTEpVTEZCPDw/RkVHS0k9NjY3Ojk3OTo7Ojw9OT45OTo4Oz0+PkE+PTk8PDo9Pj47PTk5Oj9FQUA+PT8/QkBHRURFUMHc2dnZ2dnZ2dna2trb29vb29vb3Nzc3Nzc3dzc0NDQ0NDQ0NDQ0NDQ0cHR0crI0tDUxLjS0tHSwtLQ08fM0tHUyMHV0dTKvdXS0cLT0tLS0tLS09PT09PT09LS0tPT09PU1NTU1NXV1dbW1tfX19fX19fX2NjY2NjX19fX2NfX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29va2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2djY2NjX19fX19fY2NjY2NjY2NjY2NjY19rHd1xSZ2laTlpOTFBRV0VKPz89P0FETExBPjc3NTo4ODk5Ojs8Pjw+ODo6OTs+P0A9Pj46NTo6Oz0/Ojs5Ojw+QkJAPz8/P0FCR0RDRE683dnZ2dnZ2dna2tvb29vb29vb3Nzc3Nzc3d3d3dDR0dDQ0NDQ0NDQ0NDS0NDR0dDQ0dPU0dHR0dPR0dHS0tHR0dPU0tLS09XT09PV0tLS0tPT09PT09PT09PT09PT09PU1NTU1dXV1dbW1tfX19fX2NjY2NjY2NjY2NfX19jY19fX19fX19fX19fX19fX19fX1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tvb2tra2tra2trZ2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2trZ2tra29ra2trZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjbwXNYVWlrU0xSTlBSWVRGSTw+Qz9BQkVKPT03ODY5Nzc4OTk7Oz0/QDw8ODk7Ozs/Pjw8OTU6PT47OTk7PD8/P0JCQT1BPUBBQkZCQkJLtd7Z2dra2tra2tvb29vb29vc3Nzc3Nzd3d3d3d3R0dHR0dHR0dHR0dDQ0NDQ0NDQ0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tPT09PT09PT09PT09PT09TU1NPT1NTU1NTU1NXV1dXV1dXW1tbX19fX2NjY2NjY2NjY2NjY19fY2NjX19fX19fX19fX19fX19fX19fX19fW1tbX19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2NjY2NjY3LxvVFRsbExLUkpUUlVLRkQ6PkdEREFERjw/ODk6OTU5OTo3PD07PkA9PTc5Ojs5Pjs5OTY2Oj1AQT47PDk6Pj9DQT4/Qj0+QkNFQkFCSrDe2dra2tvb29vb29vb29vc3Nzc3Nzd3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0tLS0tLS0tLS0tLS0tLS0tPT09PT09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1tbW1tbW19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19fW1tbW1tfW19fX19jY2NjY2NjZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2dnZ2dnY2Ny2a1NbcGtLVVdSXFFXSEQ+PEJKRT1ISj89PDc4ODo1OTg5Njs+PD1APDw1OTk8Oj87OTk0ODw9PUFBPD47Ojw+QD89PkE9PUNGR0I/Qkmq39ra29vb29vb29vb3Nzc3Nzc3N3d3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHS0M/U0M7P0tLT0tLS0tLS0tLS0tPT09TU1NTU1NPU1NTU1NTU1NTU1NTU1NTV1dXV1dXV1dbW1tbW19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19jY2NfX19fX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dndsGRTYXJfT1pUV19RUkdCPUVJS0FBTEQ/Pzs5ODg5Mzg2ODY5Pj0+Pz06Njo7Pjs9PTo5Njg6PTtAQDxAPz0/P0I+PD48PEJFSElCPkNJpODa29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3t7S0tLS0tLS0tLS0dHR0dHR0dPT0bm7zLqbnLrQyNPT0tLS09PT09PT09PU1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2NjZ2dra2tra2tra2tra2tra2tra2tra2tra29va2tra29va2tvb2tra2tra2tra2tra2trb29vb29va2tra2tra2tra2tra2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ3qpfVWBuW1VZUVpeT0xHQ0ZNSUZEREk7QUE7PDg4NjU4Njk4Nzw/QT89Ojc8Pz48Pz87OjY4OD09QEE9QD5BQD1AOjs6Pj1BRUdKQkBDR57h29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e0tLS0tLS0tLS0tLS0tLS0tO+wMqaoKKViJGeqpOpz9TT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fY2NjY2NnZ2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dna2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2tvb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2d6iXFVeblheXU5aUFROQ0NMSUlJRkpEPEFBPDs4NzY3OTc3OTk9P0E/PDo5QD88PkI/Ojg3NzY9P0BAPUBBPz88PTs7OD48P0VJSEE/Q0aX4dvb29zc3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3tPT09PT0tLS0tLS0tLS0tTIlZyum5m1iX2TjIKBhMTV09PT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tvb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dndmlpYYW5ZYVdPV01QRUJETElNS0ZJRT5CRDg4ODY3OTc1Njk4PT1BPjo4OT4+PD9APzw1Njc2PD4/PjtAQEA/Pj4/Pjs/PkFCRkdCQENIkeLb29zc3Nzc3d3d3d3d3d3d3d7e3t7e3t7f39/U09PT09PT09PT09LS0tLTz6h+kayPko6MhoCIiYSQo8rU09PT09PU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY19jY2NjY2NjY2NjY2NjX19fX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2tra29vb29ra2tra2tra2tna3JJaWWNuWlpSVV5QTDxAR05IUklIRT48SEY4OTc1Nzg3NTg5ODs+Pj07ODlBPj1AP0E+NzU5Njs+QUI/P0BAQUI/Pj8+QUBEQUZIQj9FSozi3Nzc3Nzc3d3d3d3d3d3e3t7e3t7f39/f39/f1NTU09PT09PT09PT09PWtaWaiIuQhYCFi4iBg4qLf4bC1tTU1NTU1NTV1dXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2dnZ2dna2dra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29ra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb2tra29uIWltnalxYTFpfVkg6TEhMSkpDREVDQUxINzo3Njc4ODU4Nzg5PDw7Ozk4QD89Pj8/PDY3PDQ3P0JCQUBAPz8/QT09P0A+QEBGRT09REuI4tzc3Nzd3d3d3d7e3t7e3t7e3t/f39/f39/f39TU1NTU1NPT09PT09PUxZKCg4WGfYGCfXx5foGCg36k29bU1NTU1NTV1dXV1dXV1tbV1tbW1tbW1tfX19fX19fX19fX19fX19jY2NjY2NjZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vc3Nzc3Nvb29vb29vb29vb29vb2tra2tra29vb29zb29zb29vb29vb29vb29vb29vb29va2tvb29vb29vb29vb29vb29vb2tvZgFpebWhaU0ldW1hKRE1ISlNMR0ZBQD9KQjg7NjY5OTc1ODY4Ozo7Ojw5OD09O0A9Ozo2NTw3Oz1CQEFBPD49QEE9PEA/Pz5CREU+PERLg+Lc3d3d3d3d3t7e3t7e3t7f39/f39/f39/f39/V1dTU1NTU1NPT09PT2LKEkKh9g3l2hIh/e3d5gn5+i67A1dTU1NXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dna2trZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2trb2tra2tvb29vb29vb29vc3Nzc3Nzc29vb29vb29vb29vb29va2trb29vb29zc3Nzc3Nvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc1nlcWmxmWFJPYFFSQUhHSkZYTEZAQENDSz87Ozc4ODc2NTc2ODo5PDw6PTs/PTs9Pjw7ODg8OT0/QkFCQzw8P0FCPj1BQkNCREVDQDtDTH3h3d3d3d3e3t7e3t7e39/f39/f39/f39/g4ODg1dXV1NXU1NTU1NPU0ruen3WKeXuIgICChYGDcnOAhYOMrNfV1NXV1dXW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NnZ2dna2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra29vb29ra2trb3Nzc3Nzc29zc3Nzc3Nzc3Nzb29vb29vb29vb29rb29vb29vb29zc3Nzc3Nzc3Nvb29zc3Nzc3Nvb29vb29vb29vb29vc3Nzc3Nzc3Nvb29vb3dByXV9wZVdLUGNPS0JHQ0pIS0ZBPEE9SFFBOjo3Nzg3Njc4Nzw6OD09PD47QD88Pz07Ojs5Ojk8QEJAQkNAPUFAPz1AQkNDQUBAP0A7RU144N3d3d7e3t/f39/f39/f39/f3+Dg4ODg4ODg4NXV1dXV1dXV1NXU18h4i4V8goh6g4SBfoKCc2l0hYuGkJ3U1tXU1dbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tvb2tvb3Nzc3Nzc3Nvc3Nzc3Nzc3Nzc29zb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb297KalxjcWVST1heSz9HTElPS0VAPkFCP0lPPjk6NzY7NzY6Ozc7Ojg6PDw+Oz09Oz48Ojs4OTo4OUFCQkFAQDtAQj06PkFCQz8+PT4/PUZOdN/e3t7e3t7f39/f39/f4ODg4ODg4ODg4ODg4OHV1dXV1dXV1dXV1s6dhpl+f5OTin+CgXx9gnNxm4mAgoOJwNnat7TQ19bW1tbX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tra2tra2tra2tra29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NvfwGNaW21gVlBTU0pETEhNSEk8PkFEQ0ZORDw8OTc5OjY4Ozk3PDk4OTw9OzlAPjpBPzw3NTc7ODpAQUVBPz45PUI/Oz1CQkI6Pj07PT5GTnHe3t7e3t/f39/f39/g4ODg4ODg4ODg4OHh4eHh1tbW1tbW1tbV1tjLioCHhYOXjHh7e3lvfYF1a3ebdHZ7eInHxpiMrdjZ19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2drZ2dna2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tra29vb3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29zb29vb3Nzc3Nzc3Nzd3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3Nzc3Nzc4LdjV1lrYlJNVVFMSktGS0ZDQD5CQT9FTT4+PTg5OTo3OTo3NT03Nzo+PDs7Qjw5Pz05NjY4PTk6QEJGQD49PEBCREA9QD9DO0A9PD4/Rk9t3N/e3t/f3+Dg4ODg4ODg4ODg4OHh4eHh4eHh4dbW1tbW1tbW1tfVrYZ6d32rn3l4entzdH+Dfm9xe3l6c3t2k4qFgImkzdnY19fX2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tna2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29vb29vc3Nzc3N3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vc3Nzb3Nzc3Nzc3N3d3d3d3d3d3dzc3Nzc3Nzd3d3c3Nzc3Nzc3N3d3d3d3d3d3d3d3dzc3OGtYVtebGJSTVZMTUdLS0RGQkI7QT08RUxCQT44Ojk6Nzc5NjY6NTs+QDs9Oz89PD89Ojk5Ojw5PEVDRkA/PkBDQkQ9OT0/QT1CPz1APkdPadvf3t/f3+Dg4ODg4ODh4eHh4eHh4eHh4eHi4uLW1tbW1tbW1tfQmH+Qh4N9eoN2e3Vzenl6kKqmd3JyfoeHh4CAfoKEhJHJzNnX19jY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra29va2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2djY2NnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vb3Nzc3N3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzb29vb3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3dzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3NzhpV9UYm1iUE9TSUhHRkpJSUJBPkJCPEVFREA+ODo4Ozc3Ojc4ODY+Pz07PDk9PDo+PTs6Njc7NjpEQUY+Pz8/PkNBPzs9PT47REM/PjxIT2fZ4N/f3+Dg4ODg4eHh4eHh4eHh4eLi4uLi4uLi1tbW1tbW19jYyH52doN+fnR2eIaCenl1d5yhu6GEgoCAfoeKinx/gYaMnKjO2NjY2NjY2NjY2djY2NjZ2djY2NjY2dnZ2dra2tra2trb29rb29rb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3d3d3d3c35pbT2drXFBRUElDT0pLR0xHSkJAP0FHREBBPDg8ODg1ODk3Njc3QEA/Ozw5Pj04PTw8Ojc4PTk/RENGPkE/QkBDPzw6Pj0/PkVEPz07S1Fj1+Hf4ODg4ODh4eHh4eHh4uLi4uLi4uLi4uLj49bW1tbW19XB3LRueHJze3B6eXaFiIR7eH2AgZiljH98fnuRhZaLhoGDgY6Rvd3Z2NjY2NjZ2dnZ2dnZ2dnZ2dnY2dnZ2dna2tra2trb29va2tva2tra2trb29ra2tra2tnZ2dnZ2dnZ2dnZ2dna2trZ2dnZ2dra2tra2tnZ2dnZ2dna2tra2tra2tra2tra2tra2trb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t3d3d6NWFdobllQUUtISlNJTUhNSUtBQz9DRkJBRDo6PDg2NDg4NzY2Nj8+Pjo8OTw7Oj09PDw4Ozw8RERERT4/PkI+Qj84PT8/Q0NCQEE+O0xUY9Xh3+Dg4OHh4eHh4eLi4uLi4uLi4uLi4uPj4+PW1tbW1teslLZ6eHJvd5V7dHuLgHh1bn6Fg3t/hYhyfH2bnI6JioJ+g32Hk5rH1NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2trb29vb29vb29vb2tra2tra2tra2tra2tnZ2dnZ2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2trb2tra2tra2tra2trb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d7Zf1lgaGxcUUtHR09LTk5PTURGQkg/Q0hEREA6Ozs4NzU3Nzc4NThAPkA7PDk8Ozw+Ojk7OTk7OUZERUI8QD4/PEBDOz5AP0A/Qj8+OjtKVWPV4eDg4eHh4eHi4uLi4uLi4uLi4uPj4+Pj4+Pj1tbX19vKhYR3cXJubniVhHt4hH95dnB4c3eLkY6CdnN9ioaId3d1d4ODfIiIk8Pb2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2trb2tvb29vb29vb29vb29rb2tra2tra2tra2tra2tnZ2dnZ2dna2tra2tra2tra2trb2tra2tra2tra2tra2trb29vb2tra2trb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f0nVZaGlqVk5KSE1OR01EUElGSD9FPUZMREM+Ozs8OTc3OTY2OTU4Pj4/PTs8QDs9PDo3Ozc5OThHREVCPUE9Qj8+QDw/QUE/QEJAPjs8S1Ri1OLg4eHh4eLi4uLi4uLi4+Pj4+Pj4+Pj4+Pj49fX19fEknuJf29sbnV2foSBg4qGfnVybWVtiIaKjoR7c4OHint4e4OPj4GEioqxztrZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29zc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tvb2tvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3dzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f3t7e4clsW2pqalNOR0hOT0VIRk1JSUA7RD5ISUA9PDo6Ojg2ODo3Nzk0OD08PT07ODw8PDw4Njc4OTo6RUJFQT9APEI/Q0M+PkNEQUBAP0A8PUtRYdPj4OHh4uLi4uLi4uPj4+Pj4+Pj4+Pj4+Pj5OTX19fZqXaFfnx3bHB3eXh8jH2KhYB3anN0d3p9bot7fnl6foR/gIGDfnh8foeGlrbT2tnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra29ra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/e3uO9amFpa2lRTkZNTEtKWE1OR0FAQE9BRD9AOzw4OTk5Njg2NjY4NDs+PD07OTY6Ojk6OTU4OTg5OkJERj8+Pj5AQEBCPzxBQD88Pj9BOT5KT17S4+Hh4eLi4uLi4+Pj4+Pj4+Pj4+Pj4+Tk5OTk19fX2sqKhIB5c29tcXN1d4CUeHaAfHWHhXd1cnWgmXp7d3Z5doR0bWxue3iAmouTu9za2tra2tra2trb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc29vb29vb2tra2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f397js2lpbmloUFBPTExPUk9LU0Y/RURERD48PDg6ODc5OTU2ODY2NzM6Pjs+PTc6Pjk5OTk2Ojo4NzxDRUc/Pzs/PkA9PkE9Oz0+OUFAQDhBTlFc0OTh4eLi4uLj4+Pj4+Pj4+Pj4+Pk5OTk5OTk5NjY2NjauY6AenZ1bmpveHCBfWt0cnZ3hIV5h4d5lY55eXp1d3pza298gHx2fYh8gLLe2tra2tvb29vb29vb29vc3Nzc3Nzc3Nzc3dzc3Nzc3Nzc3Nzb29vb29rb29vb29ra2tra2tra2tra29va29vb29vb29vb29zc3Nzb29vb29vb29vb29vc3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3t7e3t7e3d7e3t3d3t7e3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/f39/f4qpqa2hrZFNQT0ZQVFJOSFJLPkREQ0I7Ozk6Ojg2Nzg1NjY4ODg0Oz88Pzw5PDw3Ozo6Nzo6Nzo9Q0JDPUE+Pzw5PT5BQDs8PDtFQD47Q05TXNDk4eLi4uLj4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTY2NjZ1p5vdntveHh2cG50d3BwdHBzb36Jc3qGhY2EenNtcoB6hn1vg5OBdnx9g4a13drb29vc29vc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29ra2tra2tvb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4N/f3+KgbWhma2ZVVlJHUFFOS0xMRUJIRUc9OD08Ojo3Nzg2Nzc2NTY3NDg+PD09Ojg6OD46Ozc4Nzc6Oj5DRDtDQj49OD1AQUM/Pjw+RTw+PUJNUF/S4+Hi4uLj4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk2NjY3MB2doCCfnp4eHBsdXlya399bHNvdGdoaYB/aWl4c2d+iYl4cIKGe3d9foWKvN3b3Nzc3Nzc3Nzc3Nzc3Nzc3d3c3Nzc3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODflGttZm5mU1NJUFlUTEhGTkZGRUJGPTs+PDs5NzY4NTc5NjQ1NzU4PDs9Pjo6OztAOTs7ODc6OTlAQkE8QUE/Pzk/QEJFQ0FAQEM7Oz1ES01g1uTi4uLi4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk5NnZ2tmYc3uqhJaCcnR1dn14aGx8d2h4d25rcHR5gIJ3dHyBhIJ9c3CAin94gn95g8je29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f4N/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh24tubWdzY1lRTVVbV0hDSUZOS0dCRD8/Qjo7OjY2NzU2NzY0ODc2Ozw7Pj86PDk8Qjg3OTo6Ojk6QUFCQUJDQEE+PT9CQ0NEQUJGOTg9REpOYtjk4uLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXZ2drcqHGCtXiRfnNsem6EgXaCfWtoan+DeHZ8dX2FhXRmcHl9d316gIqFe318foC03tzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3dzc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3Nzd3d3d3d3d3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e397e3t7e39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4ODg4ODg4tiFb3FrdWFWT1VVXE9ETUY+SkdKRUQ8P0I6PDk4Njg0NTY3NDc2NDk7Ozw7OD47PEE4ODo9OD04Oj09QEBAP0FCP0A+QENCQ0FBRTc2O0RMTmPa5OLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXl29ra3Z5sbnNxhY1ybXBuf391hH5rcnZ2enN4gXhzbnVwbWt2fHmFiIB/f392coODsd/c3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eDg4eHh4eHh4eHh4OLXhW1xb3ZeUldTWlpRSkhDQFFAQkQ8OT9BOjw5NzU3NDU2NjQ3NTY9PDo9PTk+OjxAODo6PDY7OTs+PUJCQjtBQkBDQEBEREM8PUA3OjxFS01l3OPi4uPj4+Pj5OTk5OTk5OTk5OTk5OXl5eXl5dPOxsB+cWxveHt2b3VuanNzbZKGeG50dG5vdIZ/b2twboJ0bXZyfY2DdnF/d3mKgabf3Nzc3d3d3d3d3d3e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3dzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t/f3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi1oZucG1xYFJZUFdfWUpMTElSP0Q9OTtCRjs6OTc0NTY1NzU0NjY2Pj07Pz45PTk7Pjg9Ozo0ODtAQENCQ0FCRkE/Q0BBQkREOz0+OTs8QkxNZODl4+Pk5OTj4+Tk5OTk5OTk5OTk5eXl5eXl5eW5t7Woc3JscHd6dHd4bXFydXd/hHRyc2xsa3F8bnBudGuBf3GAd32Eg355gHNygYqg2d3c3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh49WHcWxqbF5YWlVXYFZWUE9QTD1BOjs8RkE4Ojg3MzY1Njk2NTg1Nz89Oz8+OT04Ozw5PTs7NTo9Q0JCPENDREREQUE/PkJDQzw9Pjg5PENLS2PN0dnh1sjY4+Tk5OTk5OTk5OTk5eXl5eXl5eXltbW2q3J5cm59f3Z1d2hqaGlwb3Zta2tnZWZxdG15gG5teXd2iHhxa2podXV5dHV/wd/c3d3d3d3d3d3e3t7e3d3d3d7d3d3d3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHi4uHh4ePVhnFwY2lhV1NZV19MUk9STUtAPjg5O0E+ODc5NjQ3Njc6NjY2NDk+Pzo8Pzo/OTo6Nzo9PDk5PEFBPTtBQ0VDRkA+Pj5BRUQ+QEE3OD5GSEpesrW4wbm1u8jg5eXl5OTl5OXl5+fn5+fm5ebm5ra2tbWOfX5weoR1cnZnYmNlbGtyb2ZpbHZtd4Z9hXlsbHd4a3ZwfH14c3V5fHd2h7ng3d3d3d3d3d7e3t7e3t7d3t7e3t7d3d3d3d3d3t7e3t7d3t7e3t7e3t3d3d3d3d3d3d7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4eHj1Yd1bl5uY1pUU1hXS1NLSk1SR0E4Ozs+PDk4NzU2NTY2OTY4NjY5Pzw6PT07Pzo7Ozk8PDs5Oj4+Pjs8PUFEQkNBQEBBP0JDPDw9Nzs+REVKXrG1tLW2t7e2y9rJ3uXl3eDi3tXU1tPU4OPg39+2treuh3t/bnmNenJ1bWNobGxtaXR4enF5enqIh4N6aWh9cWRvcXyGgX55e318e4an2t7d3d3d3d7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4uHh49aGdmxhb19dV1lcWlJQSEpXTEVHPUA9Ozs9OTY0NjU1NTg2NzY3OD87OT09PDw5OTw6Pjw6OTg+Qjs7Pj5AREBDRUFAQD0/QDw9PTU5PEJHRl2xtbW2uLm5ubq9uMPT0r3BwcC6u7y6u8TMxb/Dt7e3hGl1gX1ndYd5Z3Vxa2t5eHB3fH15bWl3e3h3bml1j4FwbHl4d3d9gXuGgnmAoNze3d3d3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODh4OHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4ePXhXJrZ3RhW1hYX15TVVVRVUpMRj9JRDs5PTY2NDc3NTc4Nzc3ODk8PDo+PDg8Oj0+OTs8OTs5P0E8PT9DP0FARUJCQTw9Q0A6Pjw1NDlER0dasbW1tre5ubm5ubm3ubm4uLm5urq6urm5urm6u7e3uX9ucHN6b3B/eXNuc3Vsc3Z4cXFwb2tvcX6Bc2mHhIF9dHOHdW11hYmBgHJ2hafd3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uHj14lxa2xyW1dXXWBUUVVUUFJPSkNATUE9Ozk2NTM0NjQ2ODc3Nzk6Pjs8Pjs5PDo8PDk8PTw7PT0+PUNEREBDQkE/QD48PkE8OD06NjY6QkpIWLG1tLa2uLm5uLi5uLe3uLi5urq5ubi4uLi6uru3uKx7cnhxf3ZzfnBsbXpyZ29sbW50cHt3d3Jyd3pvhpJ2f3x8enZ5fH9zfYdyda3T393d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4eHh4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi49eHb2pxalVWV2FbT1FSUE5XSURESUo/Ojk6NzUzNDk1NzY2Nzg4Ojw7PD46PDo6PTw5PDw9Oz09PDs9REdEQ0E8PDw8Pj5AOzg8ODE1OkFGRVautbW1tre4uLm4uLi4uLe4ubq5uLi3t7i4ubq7t7mqcnB4d3x7e4J3aG5xam9qY2lyf21zcn54dHFsanaAeX2AgH91doB1a4qLgHaR1d/d3d7e39/f3t/f3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f4N/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLi4uPYhm1sdGVWUFxnWE1YU1JRWUVDS1BOOzk4ODY1NTM5NTY2NzY4Nzk+OT0+OTw5OTw7Njg5OTo8QEA9PkBGQEJCQDo+PEE9Pzs7OzYxNjxCR0RQqLa1tba2tre4t7i4uLi4uLm6ubi4t7e3t7e5ure2tIlyd3h9iXxwem99c2hqbGdnbHRscXd0cWx2c3Fxd3FyfHl4g3Z7d2mLkYp9kM7f3d7e3tvY2drZ297f39/e3+De39/f3Nvc3N3e3uDg3+Dg4ODf3t7e39jS397f397e3t/f3t7f3t/f3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLi4eLi4uLi4uLi4uLi4uLj4+Lj4+Li4uPj4+Pi4uLi4+Lk14NoZ3VkVlVkZVdKWllXW1Q9RU1LSD04NzU3NjQzOTQ0Nzc1Njc5PTo9Pjw9PDk7PDk5Oj45PD4/PkFBQ0FFRUQ+OzxBPjw5PDs3Mzc+REhFSqG2tbW1tbW2tre4uLi4t7e4uLi3tra2tra3uLm2traLfXpsbHp/cGx5dm5qaGdlcXp4b2lvb3B1c21zd4Fnb32CgYNyf3lqcHJ6f6ng393Zy8a/vb6/vsLN0tDW3tnc4NfQzcPCw8PH1dfT2dzX1NjX0MfExce9vM/Kz87Y3djO3N3c2t3T0dze39/e397e3t7e4N/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eLi4uLi4uLf4uPi4eLg4d7W29/Sw8rJx9Hb3OLk4eHg2dre1sbExcTN2trf5OHi4trX3st9aWZxYVleZWFNTFRLUlpMO0hNSEZBPTc2NjUzNDY2NDg3NjU2OTw7Pj46Pjk5PDk3OTs7Oj49PEBAQ0RCR0ZCQT08Q0A9OTw7Nzc3P0RGRkaZtrS1tbW2tra4uLi4uLi3uLi3s7W2t7a3t7i5tba3opdxb29waW50dnFmZWNrbmdvcm1mZ2tygWVvdnyAeGRzj39zaHFyaWVlbm+w39HFv7u5ubm5ubq6uru6vc3Gw8e/urq6uru7u8HCvcHFvby/vry7urq5ubq6ubm6w8XDucDDwby/ube/z8/U3tjc3t/g3tLa4N/f4ODg39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eDg4ODg4ODg4ODh4eHh4uLi4eDh4uLi4uHa2t3RwsPCu8XT1uDdydPDrrnAsaqrq6uwtLbJ0sXRxLG4v7Srq6usr7S0vMzE1c60tLureGxtbWBdYl9ZS1NVVFFQREBRTUhEPzo3ODU3MzE1NjQ5ODQ2Njo8Oz08ODw5Njo6ODg5NzU8PDw/QEFAQkRDQkE8PkI/Pz09PTc1OD5DRUNAj7a0tLW1t7i4uLi4uLm5uLe1sautr7Oxs7OztLS0tqaei2tue3ZxeXhnY2hfcXdha25vaG99b25ja2lseHdsa4Z+bHB6dm1scG95sca8uru7urm5ubq6urq6urq6urq6urq6urq7u7q7u7y7urq6ubq7u7q6urq6urq6ubi3t7i4t7e2tbW1tbi3u8e+w8XHzcS4wMnH0tzZ2d/e3uDf39/f4ODh4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh3Nji4uLi4eHh4OHg3tfGxtHQztTe3tPO0t/SuLi8sq2trKysrrG+ua63rKipqamqq6urqqqqq6ysuKyqqqqrq6urra6urq6urryzrayrpHlub21fXl1dVE1SU1xUSkE/UElIPjg5NjgzNzMwNTczNzg1NzY2Ojw/PDg5Ozo6Ojg5OjY1OTs7Pj9EP0NFQkNCP0BAQT9APjw3ODc6QUVEP4W4tLS1tbe4uLm5uLi3t7SurKuqqq2urq6vsLGzs7WjcG5ucm1wg311aWFlaGZkY2Rxc21td25naW1tZXBzb29zcXN8h4F6dX11n7u6uru7urm5ubm6urq6urq6ubq6urq5uLm5ubm6urq6u7q5ubm5ubq6ubm6ubm4uLi3t7e4uLe3t7a2tbW2tra1tbW1tba1t7e3t7rBvrzGycrb3+Dg3tvd3d7h4tDW4uHg4ODg4ODg4ODg4ODg4OHg4OHi0768zNjd3OLg0dnbxL23sLCxsa+zu7uzsLS9s66urq2tra2sq6qqqqmpqKmpqampqqurqqqqqamoqampqampqaqqqqytrq6urq6urq6sraR4aWJxZmFZWlZRUk5cU0Y9QlJEQTc8OzY5NTY1NDU2NTg3NTY1Nzg7Pjw7OTk5Ojg3Nzk3Njg8Oz47RD8/Q0BBREE+P0M9Pjw+Ojo3Nz9DRj54srCztLW2t7i3trKurq2sq6uqqaqtraysrq+xs7S1t4xucnRqaIB5ZmpmZWxdaG5waGxxYmNmcoJ+dmhobGpueoaBhXx4cXF5gK+6ubq6urm5uLm5ubm5ubm5ubm5ubm4uLe3t7e3uLm5ubm5uLe3t7i5ubi4uLi3t7a2tre3t7e3tra2trW0tLW1tbW2trW1tre3t7e3t7e3tre4v8bP0MS+v8DE19e8ydra4OHg4ODh4eDg4ODh4eDb3t7Uzby3tre6wMDJxLfIvrKwsLCwr7Cvrq6ur7Cwr66urq6uraytrKurq6qpqampqampqampqKmpqKmpqampqKmpqKmpqqqrraytra2ur66trK2heWpjbWdiXFhRUFFLVEpCOklRP0E3PDk0OjU2NTQ1NTY4ODY4Njs6OTw9PTs6ODY2ODg6ODY3Pj08PT5BQUVCQkNBQUBBOj09Pz05Ojc9QUc8bKqmqKutsLGwrqupqKqrq6mpqamrrKytra2usLO0tbilgIdvaWdzdGZrcG1qZGxvcm5rbWNrcHyJhG5qbHx4Y3uKfnNqc25rcY+7ubm5ubm5ubi4ubm5ubm5ubq5uLi4t7e3t7e3t7i5ubi4uLe2tra3t7e3t7a2t7a2tra3tra2tbW1tba1tLS0tbW1tra2tra3t7e3t7i4uLe2t7a2uLm4uLe3uL6+uLq9vcfb4OHg2Nnd4eHg3dfKwcPCurm5uLe4uLi3tbS0tLKysbGxsLCvr6+vr6+vr6+vr66ura2srKyrq6yqqqmoqKmppqepqaehpaipqamoop+hoZyip6inqausrK2ur7Cwrq2unXdwbGphY2BZUU1RTFJGQzlNUEY+ODs3Mjc5Njc0NTM1ODg3OTc7OTo9PTw6Ojk3NDo5ODY1OD8/QEI9RENDQ0FDQEJBQDtAP0A/PDw6O0NIPWOopaWlpqioqKenp6ipqqmoqKipqqqsra6wsLCztLW1taWYdn5xZmt4cW9tZmVsaGNsZ2ZpaX11bWlvfXZ5hWZod294b3Fvcninu7m5ubm5ubm4uLm6ubm5ubm5ubi3t7W1tba2tre3t7e3t7a2tba2tre2tbW1tra3t7e2tbS0tLS0tLS1tLS0tLW1tba2tra2t7e3t7e3t7a2tre2tre3uLe2t7i4t7i4uLi4wMXTyry8w83PyMC9urm5ubq6ubi4uLi4t7W0tLSzs7KysrGwr6+vr66urq+vr6+uraysrKurrKysq6ehoJ6gn5udoaGdlpmkpKaon5mZmZmanZ+gn56fpKqtrq+ura2srJl1cGlrY2FeXVVOU0tSREQ4TktHQTo4NTI2OTY1NDczNzc3ODk3OTo7PT0+ODg4NzU6OTk1OD9AQEFEPkZBQkNAQkNCQT88QEJCQD0+OjpERj5cpqWmpqampqanqKenqKioqKenqaurrKytra2ttLS0tbekc311bnONf3JmanFjaW1jaGZobG51aV9jZ3VzdnpuZ3Bwcn56cYihu7m5ubm6urq6urm2s7W1uLm2trW1tra1tbW1tbW3tra3tra2tbW2tbW1tbS0tLa2t7e3tbS0s7O0tLW1tLS0tbW1tra2tra2t7e3t7e3tra2trW2tbW2tra2tra2tra3tra3uLi3uri4uLe3t7i5ubm5urq6urm4t7e3t7W1tLS0s7OysrKxsbCwr66urq6urq+vra2srKuppaSmpqScmZubmpmampmXl5eXl5aZm5iZmJmZm52en5+dnJ6gpKWko6OioqKQdG5jcGFeXltUU1RIVEo/PFFCRkM7ODYzNzo1NTQ4Mzg5OTc4OTc7OTs9Ozc6NzU2OTk4NTg+Pz9ART5CPz9DPzxBQUI/PT9EQT8+PTk9Q0Y/VaSlpqanqKeoqamop6ioqKioqKiqrKuqqaipq7W1tba5o3eKcXKHhnd0cGh5a2JjYWVsaW5zal9jZWNjZWprYmRqbHaXjX6ovbm3tre5u7u6uLWxrKurq6+wrKyrq62tq6uvsLGvr7CytbW2t7W1trW1tbW1tbW2trSvr7O0tLSvra6vsrW0tbW1tbW2t7e3t7e3t7e3t7e3t7Owsra1tLa2tre3tra2tbW1tra3t7e5uLi4t7e3uLi4ubq6urq5uLi3t7e1tbS0tLS0tLS0s7OysbCvr6+vr66vr62oo6KgnJqampqZmZqbm5qampqbmpmZmZiXl5aYmZmZmpycnZ+foJ+goKChoaCgoJ+fi3RuaXRdYGZeUlRLRFRJPUVTSEVCOzo0NDY5NDQ1NzM4ODg3ODk5Ojo7Pz04OjkzNTg5NjM5PT5AP0A6QEJCQkA/QEJCPz0+QUFCPz06PkVDQFGjpqWlp6inqauqqKaoqKipp6ioqKinp6ioqaq1tbe3t7KZtH99kIx1Z2lqbGZjYGNoZW94cGlicXx5cGpmZmRma3NqhYystrKwra2ttLeysLCtrKuqqamop6ipqampqKinqKipqaeoqqurra2sqqytraysrq6traunpaSnqqyopKOkpamwsbGztbW2t7i3t7W1tre4t7e3t7Kppaasq6ivtLa1s7W3t7a1tbW2tra3t7e4t7a2t7e3t7m6urq5uLi3t7Wxs7S0tLKxsK6sq6yurrCxsK2rqqmqqKijnJqZmJmYmJiYmZmZmZmampqZm5ubnJybmZeYmpqcnJydnJ2foKGhoqKioKGgoKCfnop1amtuWVxhVktPREdVRz5PV0hEPTw4MzQ0ODQ1NDgyODk4ODk6Ojw5OUA8Njk6MzY3OTE0PD8/QEBBOkNGRUJBREJDQTo7P0FCQz9APUBEQ0BPo6empaemqKqqqqakpqenqKioqKimpqaoq6uttba3t7e4rbJ1cHuDdmBiaWtiZWZhZGdmfYh5bHKAfXFvcXhjbW5xZo+srKurq6ysra6urK2trKyqp6WlpaWlpqioqKiopaeoqKeoqKeoqKmqp6Wko6KioqOioKKioaKhoKChoaKjpKOjpaWlqLC0s7OzsKuqqaqztLa3trGopaOioaGipKiqqairs7Sxrq6xs7W2tra3uLi3tre3t7e3t7a2uLe0sa6ppqerrKmnpqWkpKSkpKWnqaajoJ+enZycm5uampmZmJeXmZmZmJiZmpqampqampqbm5mYmpydnZ2dnZucoKGgoaOjoqCgoKCfnp2FdGtsaFdYU0pHTUVITUdAU1dGRz09OTM2Mzc0NTU3Mzg6Ojk6OTw9OjpBPDY9ODM3ODgzNztAPz9AQDpCRUNAQkRDQT87O0BDQkNBQDxBQ0A9TqKnpqanp6mqq6mkpaWlpaaoqKippqanqKmpqrW2tre3t7izc2h7c2JnamtpaWJhZGloXV1tfHJma3J/fHR8bm1zc36gqamrq6uqq62trKusq6mpqKWjpKampqWmp6eqqaamp6enqKinp6iop6WkpKKhoaGhn56en5+fn56foKGho6Wko6OkpKSlp6enpqWkpaampqeqraumpKKhoaChpKWlpaempaeoqKalpaivtLa3trW1tra1tbOwrKupqa6rqKWlpqampaSkpaWlpqWkpKSkpaKhoaGgnp2bm5ucm5qamZiXmJiYmJiZmpmZmZmYmZmZmZqZmZydnJycnJybnJ+fn6ChoaKgoKCfnZ2cgHNrbmReU0pITUZETEtFRFFTQ0c9PDgzNjI4NDY0NjQ4OTg6Ozk7Pjw5PTs5PTczNTk2NTY8QD0/QT88P0JDPkJCQj89Pj5CQ0FFQD86PkVAO0+jpqWkpqeoqaelpKWlpKWnp6eoqKanp6alpqa1tba2trW2uYptcW1vfHxxZ2pmYGFsYFROW2hqbm9tgYJ9cWdxdn6aqKeoqqmpq6urrKqqqqimpaWkoqOlpqalpaWmqaqppqWjpKWmpqSko6Kio6KhoJ+fnp6cnJycnZ2dnJ2en6CioaKjo6OhoqKkpaSioqOjpKSjpKSko6Ggn6GipKanp6ipqaelpaSipKSlqK2wsKyrqqusqqmnpaWmpaWlpaalpqioqailpaWkpKSlpKOjpKOioaGhoqKgnp2cnJubm5qZmJiYmJmam5mXmJeWlpeXmJiZmpqcm5qampubm5ucnJ6goKGgnp6enpycm356bnJiXlNNSlBFRk5NQkBPRT5JOz01MzYzODM2Njc1Ojs4OTs5Oj49Ozo5OT03NjY5NjU2PkI+PkE/PT5DQT5DQ0BAO0A/QkJCRUA+Oz5FPzxQoKSjpKOjo6SkoqSlpaSlpqamp6empqalpqaltLW1tbS0tbiBaHx9ZXOCemxwdWFfY1ROT1FbaGxpbGxxbW5xbnScoqSnqKioqauqqqqqqaempaSjo6OjpKSlpqalp6ytqaShnp2epKShn56foKCdnJ2dnJycmpqam5ucnJubm5ydnp6foKChoJ+goaOioKGjpKSjoqSlpaWkop+go6SkpKapqainpaGdnJ+jpaipqainqKioqaempaWkpKSlpqampqampqenpaWko6Ojo6KioqGhoqKhoqOkop+enZ2cmpubmpqZmJeXmJaWlZSUlJWVl5iYmpubnJuampqam5ucm5ucnp+fnpucnJyam5p/fnF0YFtUTUdNSEZMSj8/TkM8QDs8NDM4Mzc0NzU3ODs9ODo6OTk7PTs7ODk+Njc4OTU4OD9APT9BPjs9RD89REA/PzpAQUE/QUVAPjw8Qz88Tp2ioaKioKCipaSkpKWlpqenp6empqampaampbW1tbS0tLS3jHalsXdmc3Jvc2xjZGlYT1JRT09dgG1kYFptkZGSoqKjpaampqenqKiop6alpaOioaGhoaKjpaempqesq6emoJ2cm6Ghnpubmp2cmZiam5qampmZmZubm5uampqampucnZ6goaCfnp+hoJ6foqOko6Omp6inqKWioKGhoaGkpaWlpKCcmZmbnqOmpqampqanpqempaOlpKWlpqiop6enpaWlpaWkpKOjo6KhoqKioqKhoaKjo6Kgn56enZybnJubmZaUlJSTk5OTkpSUlJWWl5qam5ubm5qZmZqanJ2dnZ2dnZuampqamZqXf3dvc11aTkhKTkdFRklERU5APD09PDQ1OzQ2NDY1Njc5Ozg5OTg5OTw7PDc6Ozc4ODg1ODg/Qj9BQTw+P0A8PEJAQT49QT4/Pz1CQUA6OkA8PE+doqGfoJ+dn6OkpKSlpqeoqKenp6ampqampqW1tLS0tLS0tbSXtqd1Znh2Y2xjY2VjW1JTU1JNXqCMeFhodpajnp6hoaOjo6OjpKSlpqalpKSioaGko6OjoqOlpqampqenpp+bmpuioJqWl5Wam5qXl5iZmpqYmJqampqbm5qZmZmenZ2goqOjo6KkpKWinqGhoaKjpaampqSjoaCgn5+hoZ+goJ2amJiZmpygpKOjpKWmp6alpaOjpKSkpKWnp6ampqampaWmpKOjo6SjoqKjpKGfoKGhoKGgoaCfn56dnZyamJeVk5KSkpKSkpOTkpOUlZaZmpqbm5qampqbnZ6enp2cnJybm5qamZmZlH10bHReWk9IRUdGQkVORT9GOzo+Pzs0Njo2OTM2NDY4OTo4OTc4ODo8Ozw5Ozs6OjY3ODk5Pj9APjw9QD5AOjlAQT89QT8+QUE+QUE/Ojk9PjpQnaCfnJucnJufoqOlpaWlp6iop6ampqanpqantLS0tLOysrGwsK2rkHiGj36amn93Yl1TUlFRTGKgootaiKCgn52YmZycnZ2eoaGgpKenpqWkoqGjp6alpaOipaampaanpqagm5mboaCXkpOSl5qcmpaXl5iampmampqam5qYmJmaoKCgoKGfoaKipKamop6gn5+goaOko6Khn56enpyanZuZmpqZmJeZnqChoaKioqKkpaWmpKSkpKKioqKkpaWlpaWlpaalpaOko6KioqGgoKGgnp+fn5+fnp+foJ+cm5qZl5WUlJSTkZCRkpKSkpKSk5SVl5iZmpmZmpqam5+fnp2cnJycmpmZmpiXl5F8cmdxXl1QRj9BRD9KT0JCRjhDRT4+OTg7Nzc0ODQ1OTo6Ozk3OTo8Ozo8PT48PDo2NzY5OD4/QT47Pz49PDg6PkFAQUE/P0FCP0RBPjo4PkE8U5ycm5uampycnaGio6KjoqSmp6alpaampqSjo7KysK2rp6amp6alpqiln6iop6qnoXmEXFFST0xcnKCAYpmgnp2clZOVlpeZmp2dnqGmpqampKOioqanp6ajpKampaWmp6amop2cn6Gfl5GRkJSXm52YlpeWmJuZmpqampqZl5iam6Ghn56fnpybnJ6goJ6dn56fn6Cio6SjoqCfnp2ZlpeXl5iYmZubnqKioqKioqGio6WlpKOio6SioaGhoqOkpKSko6SkpKSioqKhoqGgoJ+gnp2enp2dnZ2dnp6em5mYl5WTk5SUk5KQj5GSkZKSkZKTlJaXl5iYmZqampyenZ2dnJubmpiYmpmXlZaNempmamBiTkY+P0A9SkVAQ0A7QEE8Ozs5Ojc2NTg0Njc4OT04ODs6Oz87Ojs8Ojk6Nzc2ODs8Oz08Ojo8PTw3Oz5DQkRDPz1BQ0FEQT88OkBCO1eZmJqamZmam5ucnp2foqKhoqSlpKSlpqSioJ6op6alpqWlpaemp6ampqakpaanqKehqXJOUU1KVJahenKanJyenJeVlJWWmJiXl5qeoqKhoqOkpKOjpqalpKanpqWlpaalpaOgoKGhoJmSkI+Wm5menJaXl5eZm5ycnJqamZeZm5uen52cnZyZmZqcnZydnp6fn5+hoaCgoaKgn56bl5WVlZeanZ2fn6GhoqKio6OhoaCgoJ2cnaGioqOkpKOioaSlpKOko6SjoqKioqKhoKCfn52cnZ2cnJ2dnJ2enpqXlpaVlJOTkpKSkpCRkpKSkpGSlJWWl5iYmJiam5ycnJycnJ2cm5mYmZiWlJWXi3hsY2RiZFFHQT1DO0tIRDo7Ozw+OTo6OTo3Mzc5NTk4ODg8OTg7OT09Ozo7Ojk8PDc2NDc/PDo9Ozw/Pjw7ODxBQ0FDQkI+P0NAQkFAOj9APztZmZiampqam5ubm5ydoKGhoaGhoqKioqKhn5+dpKWmpqenpaWmp6ampqWkpKalpKSkpaaGUFJQT0+PmHB6mpubnJ6cnJycm5ubmZiYm56dnp6foKOkoqGhoqOio6SkpqalpKSjoqGhnpyblZKUmJyam56amJiYmJqcnpyam5iWmZybnJycnJydmpqbnJ2dnp6dnp6fn52cnJyhoaCblpWVlZacn6Ggn5+hoKKjoqOhnZuZlpaWlpicnqCip6ikoaCgoqOjoqKioKCgoJ+fnp+gnp2cm5ucnZydnJmanJuWk5KSkpKUk5KSkpKSkpOSkpKRkpSVlpeYmJiYmZqcm5qbm5ucnJqZmJiXlZWWl4d3ZGdoZGJNQ0U8RDlJSkU5Ojs9PTo6Nzg6NjQ3OTU8OTY4OTc5PDs7PDo6PDs6PDw4Njg3Pj07Pj46Qj86Ojo/QURCQ0FBQD9EQUFAPjpAPj06W5qYmZqbmpubm5uen6CgoaKioKCgn5+enp2dnKWkpaanpqWlpqakoqKio6Oko6Kjo6KnllRYVVJOZ21rgZ6am5udn6Cgn56enp6dnJ2dnJ6enp+goaCfn5+goKGio6OkpKSkoqGhnpuamZehtZ6ZmZienpiYmZmam5qWlZeWlZicnJ2cm52dnpybnJ2cnZ6bmJqeoaGdm5udoKKhmpWVlpaZoKKfnZueoaKjop+em5eXlJKSlJeYmZ2goqenpaGgn56goaGioaCfnp2cnJubnJubmpqZmpydnJmXmZaVk5GQkJCPkZKSkpKSkZKTk5OTk5OTlJWWlpeXl5manJubnJucnJqamZeXlpaVlZSEcmZsYmRbREJMPT84RktCPEA+Pj05Ozk6PTg1ODg2Ozg1Njo4PDw7Ozw8Ozk8Oj09OTU4Nzw5PD88OkE/Ojo6QEBDQkRBQ0A/Q0FAPj08QD09Ol+al5mamZeYmpycn5+foaGhoJ+fn56foKCenZ2lpKSko6OioqOjoZ+foKGipKOio6SiradXXl1UV19ua42dmpqbnJ2dm5ucnZ+enZycnJydnZ+goKChoaGgoKCgoqShoqKioaCenJubm5mfq5ucmpuZnJ6ZlpaWl5eTjo6QlJabnJuam5udn52cnJycnJ6dlpSZnJ+in5ycnZ+hoJuXl5mZmpycnJubnZ6fnZqXlpaWlJOTlJiampqfoKGmpqWgn56fnqChoaCenJubnJybm5ybm5qZmJmZmZmXl5iVlJKQkJCQj5CSkpKSkZGTk5aYl5STkpSVlJWWlZaZmZmam52cnJyampmXlpaWlpaQgG9vZV5gV0BKSDg/N0lFP0VBPD07Ojo8Ozs3NTs4Njo3NDY6Oj47Oj0+Pj07Ozs+Ozo4Ojk5NkBBPTo8PTo6OT9BQ0JERUM+P0FBPz8+Pj89PDtgl5WXl5aVl5mbnqGhoKGioqCenp6enqCgn52bpaWkpKSioKCfoJ+dnZ+hoqOjo6OkobCjXWVkYGFua4GenJubm5ubmZianJ2enJubm5ycnJ6ipKGeoKGioqKhoKWzrKCgn5+enJmZmpqbrmp2nZ2em5manJiXlZWWkY6Nj5KYnZycm5ycnqCdnJucnJyempWVm56foZ+dnJyenp2cmpqampqampqbm5qXl5aTkpWVlpWTlZaam5qanZ6foqWjnp6fn5+en5+enZ6fnZycm5qbm5qbmpiZmJiYmJiYlZSTkZCRkJCQkZKTk5CRk5SYmZiVk5SVlZWWlZaXmZmXmZqenpyamJiXl5aWl5eYjX1ubV9lVlRFSzw3PjdSRUM+QkE4Ozw7OTg6ODY7Nzc6Njc5Oj0+Ojw8PT49PD06Pz06ODw9OTtAPj4/PT45OTs/QkNAQ0VDPT9DQj5AQD5APTw8YZWSlJWWlpeanJ6goKCgoaCgnp6enp6gn56em6WlpKSioJ+fnp2dm5mbnJydnp+gn56rmGNpbW5pZm2enZybm5ybmpmZmZqam5ucm5uam5ygo6SgnZ+en6ChoJ+mkpurn6CgnpuamZqZqIREgJ+fnpyZmJqamJiYmJKOj5OXnJ2bnJ2cnJycnZycnp6dnpqVl5ygoaGfnp2eoJ+cnJuampqbmpqYmpmVk5OTkpOWl5eVlJiYmZucnJydoJ+gnp6enp+fn56en6KjpKKgnp6cm5qam5uamJmZmJeXl5WUlJORkZCQkZKTk5OSkpOUmJmYlpWUlZaWlpaWl5iYmJiXmZqamZeXl5aXlpeWl4l4dmddX1dURUU5OTs8WT5AOEI/OTw8Pjk4Ozg6Ozc5OjU4OTs9PDk9Oz0+PD0+Oz8/Ozk+PDw+Pz5AQUE9ODc7QkNFP0FFQz1AREJBQEQ7Oz47PGKWk5SUlpWUlpiYmZubnJycnZ2cnJ2en56dnJqkpKSkoJ+enpybm5qZmJiYmZucnZ6cpolla3R4bVuFop2dnJydnJqbmpqampydnZ2bmpuboKKinpucnZycnJ2eoJ5inKaenpyampucoaNRSISgnZ6cm5qanZqam5yVkZOXm52dnJ2fnZycnJycnZ6fnp+cl5idn6GhoJ6cn6CfnJubm5qbmpmZmZmZl5WWlZaYl5eXlpaYmZuenp2dn6GhoJ+fnp6fn5+dn5+hoqKhoZ+fn5yZm5qcnZuampmXlpaYl5eXlpWTkpGTlJSTlJSUlJaZmJaVlZeZmJeYl5eXl5eYl5iXl5eXlpaYl5eVl5eDeHZfW11eUT1GOjk4P1VDQTtDQzo8Pz86Ojk3Ozg4ODc0ODk8Ozw4Ozs8PTo8Pjk/QT06PTw+PkA/PUBBPjk2PERDRUBBRUU9PkVERD9COzo8OTpkl5SVlZaUlJSUlJWXmJiamZqcnJydnp6dnZybo6Oko6CenJuamZqZmJiYmZiam5ubm6WJa3F2em9lmp+enp2dnJybnZ6dnJ2enp2dnJydm5ygoJuampubm5udm5qmZl2joJuamZudnK51SUyGoZydnZybmp+fm5ydm5mZmZudnZ2dn52dn5+dnJydn5+fn5uanZ+goJ+dnJ6gnpubm5ubm5yampuamZudnJqZmJeYmJiYmp2foKCgoJ+hoaGgoJ+en5+fnp6foaKhoJ+enp+enJqam5ubmpqZlpaXmZmYmJiWlJOUlJWVk5OVlZSVlpWVlZSYmZuamZaWl5WWmJiWl5OUlJGRk4yRkJOWfXhqYWJiXFE8QDw2OENWSERCOjg7Oj47Nzc5Nj06OTk2NDc6Ozw9OTo6Oz87PT08QD47Oz46PT89PkBBP0A8NztBQ0U/P0REPj9EREM+Qj07PDs6Z5aTk5OTk5OTlJSVlpeWl5aWl5mbm5ybm5uamaOjoqCfnpuamJeYl5eXmJmYmZybm5qkgGpqb3lzcZegnp2dnJydnp6enp+enp2cnJydnp2bnJuampqam5ubmZmYpIBSeKKZmZqdm6CkX1ZOh6GcnJ2cm5qdn5ucnJubnJubnZ2dnJydnp2enZydnZ2cnJ2dm5uenp6dnZybnpubnJycnJydnJubmpmbmpmYmZmYmpmZmpyfn5+jpaKfoaKioaGfnqCgn5+fnqCioaChn5+fn52ZmpucnZqZmJWWl5aVlZaTkpOUk5STkJCSk5GUkY+OkJGOlZabmJWYlJmXlJiRjJCPk5yTkoyFjIeDhndxZ2pkXFxRQT44NkJHYEJFR0A+Ozw7Ojg4NjU8ODo4MzQ6Njk9PTk5Ojs9Ozw6PD48Oj5AOj5APjw/QD8+PDg6Q0FEPz5CRD8+Q0VCPUJAPDw8OmeYk5KSk5OSk5SVlJWXl5aWlZaXmZmZmpqampqkoqCfn52bmpmYmJiXl5iZmJmcnZ2cqH1nZXN7enOJop+enp2dnp6enZ2enZ6enp2dnZ6cm5ybmpubm5ycm5iYmaCIW1+UmpmbnJyjj2RaTYGinp6dnZybm52bnJybnJ2dnZ2dnJ2dnp+fn52cnZ2dm5qbnJmZnJ2dnZ2dm5uanJ2dnJycnp2dnZybmZeVlZeXmJqam5ubnZ6foqOhoKGhnJucm5ubnZqcmZycn6CfnZiZmZmUkpKUl5SPj4+OkYyNiYuQi4mLjpGRj4mQmJiQkoyNi5KQj5iYoqiqpqWlrKOmoZqep6eyqKKVo6Cfl39wcWlsXFtbTEY8NzdHR1g+SE5URjk+Ojg5ODc1PTk4NzMzOTY6Pjw6Nzo8Ozo6Ojo8PDs/PjtAQD47PT5BPDw2N0A+QkA+QUY+PEFEQT1DQj49PDlmmJSTk5OTkpOUlZOVl5iYmJaXl5iZmZqampqaoqGfnp2cm5mYmJiYmJiYmZmZm5ybnKx/am16f3lxh6Genp2cnZ6enp6enp6dnp2dnZ6enJubnJubm5ubm5uZmJmfl11ddpeanJ2dooFkWU1/op6fnp2dnp6dnJydnJ2dnZ6fnZ2fn56goJ+enZ2dnZybnJ2em5qbm52enZ6dm5uanJ2cnp2cnZqYl5SRjo+QkJGVmJSWlJiZmpudmJuYlY2Mjo6TkpKRj4mQjpGRjo+Ki42NjYiIi4+Lg42NkY+MkI2Qk5WVnJihoJySn6SipKmam5eanKOprb3Bwbq8uL26ucC8ubq3uru7tL2zwbV/bnVmZ1peWUxJRTo7TElTPFZSSUM6QTo7Ozc3NTo6OjgyNTY4Oz08OTk7Ozw5Nzo4Ojw6PT85PD8+PDw9QTs5NTg8O0A/QT9EPTxBQkA8REM9PT06YZOTkZCUlJOTk5OTlJeYlpeZmJmYmZqbmpqamp+gnp+fnJqZmpqampmYl5iZmZmZmZmphXB1e4B3b4mhnp6enp6fn56en56fn56dnp6fnp2dnJ2cm5ubm5ucmpiZmZpgYWCAlp2cnph0Y1VPgaKfn5+enZ6hoJ6dnp2enZ6fn56en6CenZ6enJydnZ2cm5qYnJuVmJqamJiYmJmSjJCXlKCXk4+MjYqKiImMiJORh5CPjYqKkJCLjoqMi4+IiImJjpGOjYaFiYaKhoWLiI+SkJCNkJKXlpKamJ2TlJ6kpqaqq7Gsr6+rpquqsbm5tbS0rqyvtMDIxcXBvsbDxMTDurW+t7a0s7C2tb6qcHRyXGZfXl1JRj8/RUtMVklcTEQ/PUI6Qzk5Nzc7OTk3MTc5ODo+ODg6PDw7ODc5Ojs9Oj4/OT5BPDs+PD46OTY5PDpBPkNBQT08QkBAPkJEPj8+OVyHhIOHi42KiYaFgYqMkZOVmJiHlZaWkpiampmenZ+gn52ampubm5ycm5iWmJiXl5ibqo56dXZ7f3mCoJ+fnp+goKCfn5+foKCfnp2dnp+enp2dnJqbm5ybm5uYmZmfaV5bZX+cnJ6Mal9RU4aem56dnZycoaGfnZ6dnZ2dnp2dnJiWlpaYlZWSlpmWk5GKjI+PjI+NkIuLj4+WiYiEi5GZjn2Fi42PjYyHioyQm4yRj4+Lio6TjIyNjIiSi4yFiYyPhouIh42KhYyEj4qXkJOYmpWbnKOqoaKknKKrsbe0ubWxtK2vsrKlp7O6sbq6vLa3tsDDw729vLa/urq8wbW4wL60r66mqa+3mm58Z1tjWl1fSEU+QUtJU1hZXkFGOTk9OkY/Pzo3Ozs7NjM6Nzo5Pjg6Ojw9OTk4Ozk7PDo+PTtAQDs8QjxAOjg0Nzw7QkBBQj4+O0NEREBDQz0+PjlhmZWLkYWNj5aSiHl9e3+Fi4OKgoqJhmuAeJCLlpqRnZ2UlJGTlpeampiWk42Sk5KQm5uIdndzcX1/cpGgnZubm5yenZ2eoKGgm5uWlpucmpubnJuYmZqYmJmbmpqXk3NoYVR2k5ech1xXUFeKko6SkY+Uk5KXm5mYm5ePjpCLjo2Ch4uLi4qLiI2RjIeHhoqIiZGKh4yEhYqNi4qNhI+UkIyDkJOUmZWQi5OTkZWRlpWOj5GMlI2Oj4qIj4ePhoeJiYmNiomJioWNh46JmJKUmpuXmKChp6Cko5qqqbO2sbWwqKqiqK6tn6qvsK21ubi8wr/BxLixtbCutrOwuL68ury+urOzp7G3wpB1gGNiXlpXUk1IRkVQSVlXX1tDUDpCQz1HRj84Nzo6NzU1OTc8OTw5ODo9Pjo6Nzs7Pjs7PTs9P0E7Pz48Pzo4NDM3OkFBQEI+PjpDREM/QUM7PT45Z6mlo6KZn6CippeUiI2CiIJ1h4iKiIp7e3Z7enmPeoiSfn18en6CkYWBgH1zfH99fISHfnRweHZzfHaBj4iIiYeIioyMkZicl4iOhIuNi4iNkZCPi5GPi4yPkJGRjpKanpJ9oKOWpJxuTVBjhoaCjYuGiYp/iYqGiJiRiIOIg4KFfIuLjIaJi4iKkIyIi42PjI+Wh4mLio6NjY2Wk5OdnJyalpycm56bmpuYnpeTkZWWkJKRi4+LlpSMjYqDi4SEiYyQkIqOio2LipGJjZOTk5SVk5KcmZ6Xn6CfpaKvsamupKSfmKStpqa4t6ysu729wsPAv7+vpa2wsLS3uLO0uLa0ta6stK+4tLaBeXpjZmBeVlFRQUVMT0lcXl9UR0dCS0xCREA9ODg7OTU3Nzk3Ozc9PDk9Pj05Ozg6O0A8Oj06PkJBOD88Oj84NjQyOTtCQD9CPj04QEI/PkBEO0A+N2CloJqXnaGaoaCPl5efl5WCjaCfo6GdmpKOjIxycXBvdnFucG1ucHZub29waHBxcHR+c3FycXd7cnl2d3Jyd3Z6e3l8fXt/iIGEi3+PkYaNi4yGiouLiYeEgYaDgISgnY5+apSllZ19iIBfcn+AgpKQhoSEhY2DhIyPj4+IjY+Hi4iRkJWRjpCKk5eOj5WYp6SfnZWYlpaln5udq6aqt7W4srGnr6qnpqGfmp2WkpWVkYqPjImTjZuVjYuLhoaJjJWQkJCLmZKVlZSbkJiTlIyNkYyWl5WilZ6mqauno6OqsJucpp+mq6G0vb6zs7+5u7u6uby9rqiusa6wuLyztLGxqrCpqLGxsqild3J0X2hhYFRWUUlKSFZNXl5eVExKRVFKRUdDPTo5OTc0ODY5Mzg4PTo9PD47OTs4Ojs/PDw+OT9DPzg7Ojg8Nzc2Mzc5RT4/Qz89N0BAQT0/RDw+PThUj4yGh4eUjJWZl5yWmZaNlZyWlZydoKCdmpiWeHFubXJ4cXFsbnJwa3FvcG1yc3t1dnd5fnVxeHZ0d3tybn98gX15eH1/eYOGg4WCg5CLkIuLi46Pi4mJhYKCfn+Aoot7bVF1nIyMWnF9fH59fIaOjYuGjZSRi5CXj5SXkpihlp6WlZunpp+goKawq6GjpbW0sqqmqq+isba5vcK7ucO+vLi9uLWxrLCsppuSk5mfm5SPk5WOmp2doJqfn5edo6qsoZ+em62hp6qwqaampJiRkZWUo6SirKSss7Szs6i3tru4sLKvra2yt7a6srW6s7e5u7i8urayr6yxsbKztLOxsa2us7Gzs6yhl3Zxc19jXlJRVE1PSUdYT1pcZFROR1VPRURKRD44Ojg3NTg4ODU5Nzo6PTw/Ojg8ODk5PTs9PTpCPj84Ozo5Ojk4NjI1N0I+P0RAQDY+P0I/PEM8PT46Tn98go6MjJOTl5eaj5SWjZaRkZSXk5qanqGdnHJvcnFxcXFxcG5zcW91dHJxdneAdXd8eYV+d3t8eX1/fICJiYmDfXp/h4GIiYGAgIGGiIKGi4eIhYSIiIqFgIJ9mJp3V05LcpOGg01fb3F3iIWKjouNkJmclJSUoJqan6Ktsa6ppKWtr6ysrLWuvrmtrqm1sLexq7G2rK+9wsLAvrq8trKutraxtK66u7OurKepp6unoqmtoKmooq+wuLSxvLq6urK0ta+8tLezt7e7t7mtrbCprLW5sbeytLe2sLu7vLu6ury1vLi0wbWsqqqrtLG3uLm1trSzsKymrrCqq7Cxq6yusLKxtK6qo5N4dnJlZ1tMUlBFTUlTV1JlXmdUUExcUUhMUkNBOTk3OTU4ODY2Ozc5Ojs6Pjk4Ozo6Ojw8Pj08RD45Njs7ODg+OTUxNTZCRkREP0A3Pj5DPjpBP0BAO0t/gomXmJSdlpabmIuSlo6XkZGVl5SZl5+bmZx8dHV2dXl1c3RudnJzdHV2d319gH56gXyDfoJ/fYB/hIKFj52RiYF/go+Xjo6HgoCBiIuFfoqRi3+IjYyLi4eRjaONVC8vPXiHd3ZBRF1rbYSQiYmQj42PlJSYkJWcmp2eqK6ysLC1tLOtsrW4sLy1tbGqsKqztbS7t7SztrS1r7i4t62noqassLCvtre3vrW5vLOysa61u7C0r6+yu7axuMC9tLS0s7izvLq2tLrAvbm6ubq+ubm5vrWysa+yr6q1tLGzsbSzrri4tb+vpKaoo6ussa+zrq6wsKytq6qroqKmqKKnrauqpaynoqeYeHlxZmVZT09NSVJNV01PX15cTlVVYlFEVE07Pzk8ODk1ODc1Nzk1Ojo6OTs4Ojw8Oj08Pj4/P0I9ODY6Ojk6QDs1MjY2QUZDQz4/Nz49Q0I5P0I/PjtLjpGTmJmVmZGTopiTkpKLk4uOkI+Vl5ablZSbhoJ9enh2dHRzdH53end2gIKDhouMhISFioaQiYeRk5aRjZaalY+IjI+emJaVkpCTl5qamZCeoZ2Tl5uhmp2boqacZ0JbSDt4eWtnRTE4WmxzkI+LmJqPj4yUmpecnZugnaSstLm6vK+2tLi0tLK3uLmzq6+qqKy1srK1rrGrrqa3s7OxpaGotbCvrayrtbqyu7q6tLK3ur67ubG4sLmtqLK4u66ttLS3tbu2trm5vLe0r7G0t7a5s7e1pq2pq6ior6yprq2up6KxtLG0q6aop6Cjq66oqq6orLKwr6+pqKGeoaGjpqOgopqlo56ol3J3bmdiVUpUT09KRFBLX2JYWlFcVGBNSFJJQUA5Ojg2Njc3NTg5NDs5Ozk8Nzs+Ojg8PD0/QkBBPTs2OTk5Oj87NjM3OD5GQkJAQjk+PUBDPkBGQj44R5OWkZWTkpSQkZ+ZnZmVkI+Sko6Mk5aWko6RlZGSkIaBeXJzdXuBhI6HhZGTkpicnJiVkJWYo5yaoaeqqZ+clpeVnaKioZyZnpmlqKyvramnqqqpp6KlqKmrqamvj0pyonlBfHhkYlFUXklgboqhoaSem5qkp6Spq66spaSoq6+xtK6qrK6zr6ystLO0ua6urayqrLKwsK2wqKqmsrS0uK6qtrqwr6qurLC3s7i0t7W0u7y4tbWxtauyrKiys7uvrbGytLa1sbG0s7OvrKuvs7a0sayutKqqpqWnrauoqKupqqifqbOwqqeppaOio7CtqaatpairrayppaSioKWipaOYmZyVnqKippdudWVnZFdPWUtLSktTVHBiWWRXX1tcUlpQTEM8ODk6Njk4NzQ3NzQ4Ojw6PDg6PTk3PDw7PkM/QT47OTo5Ojs+PTg0NThBREVEQkM5PjtAPkI/R0Q+N0KSm5SVlZaVj46Wl5qZlZGKk5SSjo+SkYqKiY2Ul5qTjYmCho6VkZSfmpuin5+jnqGhn5ijpKelpaapqa2rqaKmpKilpKGfnqOjra2srairrq6rq6ykoaKmqaeoo3hgwdalQ3yOg3VPbo52U2R/o6inoKKhrqyrqqetrqilpKmpqqmmo6iqqaekp66wr7Ovq7Crqq+yr7Czua+rqLCxrrCyubO0r62vtbCss7GurLW1tLSzs7CvrKyqrKusr7G0s7CwrrCwsKyqrauqq6alrrCysKumqbCvqaOkqaunqKaopquwq6mvqaaoqaalo6iwraqpqKKpo6WnpKGhoKKloZ2el5aYlJugpKmUbnNeamlfVlpOUk5RT1NlXGVjW11ZXFBZT0tAPDs5Ojc6ODczNTMzODo9OTo4OTo5Oj08PEBEPkA9OTo8PDw+Oz45NTo8QkFFQUNBOT47P0BEQENCQDdAkZ6YlJeZlpGHi5SSl5GIg4mLk4+OkI2Hh4SFlZmWmJeZlpqeop2ZnKKkoaCdn5qfoKGgpqGgoKCjo6KlqKmrramqpqOmpaCloKaop6aoqaepqaSnp5mdpKWjop1if73ArnmhpJqVZUxfeG1RdJWioqChn6GhqKCcn6GloaCmo6KfpKGspp6foaGkrKqnrKivq6e0sa6ur7WyrKqwq6mtrbWwrq6srreup6yqpKivsq+sq7Kvqqqpq6utqa6urrGxraqtqaunp6uoqauinaapqKilqKisqKilpKWop6iopqmsr6+oq6mhoqKlo6Opq6ymqKWjqKKhoKSdnZ+hoZ2bnZ+amZWcnKOqlG9zZm5yZF1dUFVPWE9eZWRsaGJiWlpSVE9NQTo9Ojo4Ozk1MTYzMjg4Ozk5OTk7OTk8Oz0/Qz5APTk7Ojs8QD0+PDk5PEFBRUFGQTo9Oz9BQUJBRUI4PYqWlJOYmpaPiISNjpGSjIiIiI+JiZCRjoqKiJubmZygpaKlnqKjoZqeoZyanZ6bnKOop6ugoKOYoJ2XnKGjo6WjoqKkrKilqaCepqmnq6mkoKKhoqehpq6mpp2eaoScuo6p0aKas6hYTK2TU2WPoJ6goJ6doKOZlpqYo6KipJ+ZnKGhoqCbmp6goaSgnaejqrGorqusqaSqqquorKalrKqws6+rq6mwq6appaWoq6ynpqevq6Wnq6upq6irqqqrrailqKOmpaesqayoopykoaOmo6qpqKano6SnqKanqKepqKupoaKoo5yepqWjqKino6WlpqmgpJ6inpeYnZ+doqKlnpiUlZ6go5d1d2t2eGJfXFVZUVVXW2Nfc19oX2NTUVlUSD48PTg7OTo4NTM3MzM0Nzo4OT05Ozo5PDxBQEM9PT44Ozw9PEA/Qj86ODo+P0NAREE6Oz49QD9DQ0VDOTyCmJmenZ2alZKKiZGRl5GQh4SJgoGNj4+Sj42cnZ+hpKmlqaeorK2moqKfmKSmo6Stsa6yp6asm56em5qjp6Cfo5+foq+rq6yoqKuvqaiqqKKgoaiqrbGyr6uiooV3fn1yzsavmaava1WqsGNbh6WfpaKhnqCimJWem5+fpKGblZigoZ2enJudnZuZmZWen6Oonp2iqKGaoaOmoqSoqaqoq7CxqKWlp6eopKWpqaqnoqWmqKadnqWloqClpaOlpqCjpaOjpaelqamqpKekpqKmp6SrqaenpKGlqKynpqWlo6OopJWdo5+bnaCjqaeopqGjo6mooKiioJyVkZqfn6GmopuXkpCamqCVfHdvfXlmW1tgX1pcVVxoZG9jbWlpYl5QUEA/Ozo4OTg8OzYzNDMzMzc5OTs8OTs7OT49QkBAPTs9ODw9QD08PENBPjo4PT9EP0M+Ojk/PEI/P0FEQjk6gJ6kp6Gem5+gmY+ZnaCWloqGj4iEi4qTl5SRo6Wnqq6trLOys7S4t62pqqevtLKxqq6usbKusa2lq7OssbGpq6+rq6y2sLSwq7GysaOgo6qqp6+3t7S1trOtrqyOhoNukcy8lJSllnRUb3pzcH2WpqqnpKCfo5udoZqWnqScm5aZoqefoJ+joJuUlpmWl5qfoJmVnqGZmJ2dpZ2gpKeqqaiqraylqaSlqqeqqaqsp6SkpKOimZmhnpqaoaCfpaWYnqSmpKqooqelpaGqp6mnp6ejqKWmpaGkqKesoqekoaalpaOVl52Ym5mVo6elpaSfnZ2lo6Kqo5+amZiXnJyaoaGakJOTl5ibjX93cnZ4amJbX19cYllgZG5ta25hX2RgUE9BQDs7OTs4Ojk2MTQzNjQ3Nzc6PTo8Ozk9PUI/Pj89PDo/OTo7PD5CRUA9OTtAQT5DPDs5PzlAQEBAQkM7OXuao6OcoJ2dop2Zn6KioJibmJaYkpSQm5qWl7S0rrW4s7S4tre0uLm3tbm4ub28uKqLnLK4vLS9urW7uru4s7q/uLe5u7G3r6iusq2inaCrsre7u7u5ucG4tLWfh3lkWJ+1u6anmYh3a3FveHl7foWOkpido6Wmq6WkmKGko52goaKooaOgpaGck5mYmJmco56cmpudl5uZlqWam5+hqKmpqKuvr66pqKirrKytq6irp6WjoJyfo6Ojn6Cipammmpyip6Spn6GjoqKgpaanpqSooJ+ipKGjoqiop6OloaGopqalo5mbmJuTj6GknqKfmJiVoJuhpaCfm5udnJuamZugmo2YmZiTkYaAdnh4eGNbUllUX19hbWh2a3FoaWliWlNMQDw6Ozg5Nzk3NTU2Mjg1Njc3Ojw7Ozs7QD4/QD0+Pjk6PDk2Nz47QkZCPDg7P0NDRDw+OT43PkFCP0ZDOzhwkpqblJ6bm52Vl52doqajopaXnpaXl6GblJi+t7G4uba3t7i7l5S2vbu9vcDFtaK7mKC3v7+6wcm0nbu2sra/xcGooLa0urGqrrSxsLK0tbfBxszPzszJvrOkj3JmUkSLlYWFhX14cW5nZmxpbHJycXJydX2NqcTEu6Knqqynq6mlpqCnoKGmoZOWmJ2foqSjnZ6coaChnZekmpmdoKaqqqqtrq2tsLGrrK2sqamrrqimpaalpqSkpqaeo6eppKGcoKKjpqCio5+jpJ2foqWgpJyboZ6fo6GhpaSlqaOkpaKkp6ehn52elpOcoJiZko+MjJeWn5uWnJqdnJqSlpSUmJOQmp2YiouHgIB8gnhhXllTYWlhZnRvdGl0ZGlkYltMSz46OTg5ODg5NzM0NTI1NDY2OTw8Oz08P0E/QEA9Pj44OTs4Njc/OUJFQzw7PD5DREM9QDs9Nz1DQ0BFQjw3Z4yRk4qalZiblZWYm6Knq6aVl5iQlZmhnpeXvrWztLu6ubi5woeYt6u4u8DCxbOjw6e4s72/tMTHvbS7uL62wMTErqCworW2tb2+wcTHw8XH2+Pj2su8rqOViHRZWlFEaXdqbnRua2VlWVddWFxjamppZmFpi7bBwLmpr7Gwr6yqoqajrJ+fpquXmqifpaWfoJydoKuwsKyiq5yYm6Cor7Kys6uorre1sq2tqaalqKulpaStqaShn6Cnnp6mqKmmnp+anqGlpqmcnaObl6KmmpuanZ+cmqGcmZ2eoKijn6GfnaWioKOioZSZmpmTj4qLhI2Qk5uPjpiVm5eYkJORkomNl5iYk4uKi32AgIVwYGJfXmtjYm54dXdvbVtiUlZcTUc7PDk3OTc5Ojc0NDQxNDM3Njg8Ozs8PEBAPUA/Pj8+Ojo5Ojc6Pz5FRUU8PT1AQkJCQUE7PDhAQ0NARD87NV+MjIaFlouUlZeYl5ifpqellpWVkZebn5ual7mxtrO5vLy5urWqsryxvsG0vMe5uLuuv6fGw7/KxsnIxcXJvMLHx7+xsKe8vL7FxMbJx8XGvs3S1cq5ppyThXJeUVRLRFtlXmNqZWFgaFlUWFNXWVpdWVt1mre8rLSyrbOtqa6vp6awr7Ktqq+zpKu1qaeopKCgnqmyuL61tbWqqaausre4t7apq7i8ubexr66noqOop6SfqKOfnqCZoZydoqSnp6GelJuaoKGlnqChnpajnZSQlpiboZqflpORlpSin5qenJudoZ6kn56VnJiPkpOPjImTkJefiZCWkZuUmJGRlZaDjJWXlpKLjIh8f4R/amZoYWtsZ252cnJ2cmdeYFxSSUU/Ojo6Nzg0ODw3NjU0MjMzNjU3PDo7PDs9QD4/QD48PTk5OTs6PDw+QkRFPj49QENDQkREOzo4QUJCQUNAOTJbk4iEjZGKi5GRlZCSmp2fnJOSmJSdnZqXmpW2sbm1tb6+tri1uLO8vMTEusPHwb+0s8XFxr/CzcfLzsvLx8HDxsfIysXExcO7vLzBxcHFxL/CwcfLyLaTdGNVUE9USD5ebF9fZWJgXWRhU1VXVlVVWHOcrbGqqKqtrKmlpZ6pr6uyu7q4u7e5t7O5uLOurLO0qrC1ub3Bur6+vL60urm4u7qysbS8u7q7s7Oyp6Smq6uioaCdmpudmpyXmpuenJygnZaclpuZnZ6io52UnJCNiY6OkZ6bnJWNh5KLmJiWmpybmJybnp6cmp6UjpiYmpSRmZeeoZWYmpKXlJWRlJqYk4+TnZaSi5F+enx/dWtsbmRvbWlxeG95amlhXWdhUUZEQTw5OTc2NDQ6ODQ2NTMzMjY1Nj05OTs7PT47Pj49Oz05OTs7Oz89QUNBQkFAPEBDQ0NFQjs4OUQ/P0BCPzsyV5uQkZCQh4WSjo2IjZCTlZGPjZSUm5STlpqRs7e4uLi+u7C1sri2tbbAw8G+w8LAvru+u7u8xMzEzNDLxsa/xcfLyNTLysjGv7u7vsS+xcjGxsTEw7m4w5thSURHS0Q9W2VhYmljYFtjX1dST1BQV4G0uqyupaSjqKSgoKWZqbSxvsG+urm6uLW0srG0tLO6wL7Av769u7u9vsDCt7a3tru7sru+ubi3u7a3tKyoqamrpqijnpOampyYkZKZl5GRmJqXnpiWk5acm5+dlJOJiX6GiIyWlJiZkYmVkZeWlZmbmpaYl5idnpyhmJWZmZyYl5ybn56jnJ6WmJeTl5yZmZyUlp2UlpOJdnl6e3dua2lodlpnc3hzemdnXmRbUlhJRj87Nzg4NzYxNjk3NDQzMzM2NDY7ODo8Oz08OD0+PDo7PDs9Ozs+PkRBQURCQEBBQkNDREM9OTlCQD8/QD89MkyWmpaSk4yKmJCKi4yOkpKKiIaNkJiKj5CUl7O7tba/vb2xtrjBvby0uL/Bsbi3vsHFvbu8wsbJv8jOyMHEwcfKysbKxczIzcbIxb/DwMvNz8rGxMTEwsTBrYNPRk1FO01aXWVsZV9bYFlZU05VgKOrubWyrKmjoa2prKetn6y0tL/Dvrm4vbawrausr7W0ur7Fv7u8urO5u7i5ubWtsLS9u7G/vLiytrmzubu0ra2orKyqqaeXnpualY2MmJSTi5WWlJyZl5WWmZKYn5mQiop+iYqKkY6Vl5OUn5mWkJSZmJmWmJOUm6GeoZiYmp2ZmZaenpibopqdnJuYmpuZlpeXlpyZlJyYfoB4eXZ2ZWZqamhea3BueXhjYmFgXlhXRkU4Ojg6OTc5NDQ5NzY2NTEyMzM0Ozo9Pzs9PTo6PTs8Pjo7Pz48QkBDQkJFQj0/Q0NDQ0RFQDk6QkFBQj5CQTVCkJeUlZmSj5qQjpKRjZSVi4qHjI2UiImPkpq2u7S8xsHEwr3BxcLAtLO9v6ywr7rDysPCvs3IxbfByMW/wcLIy8rCwsTJzM3Oz8zDx8bIycjIycfFycfIx8LGlmpYRz8/Rl1iYWpgWlhXVFZ3mre/u7y6vKytpqm7urm3v7O1uLLBxrq3t8Gzsa2tqau1s7u2w7a2vbWxt762s7e4sLW2v7uwvbq0q7CxsbO8urOzrqutq6yxnaOjoJqQjpiXlZCclpaYlpWSnJmTm5+clpGUjpWQiYyQlZOUm56YmZKSnJedlJmSk5aZmJ2VnJ6do5yVnZ+TnKKcnKCfnaOemJSVl5ebmpmgkH99cXRxb2NhaHZoamp1bnlsXmRbVmBZTEhENjw5OTg4OjUzOjY2NDQxMzUyNTs6PD47Ozw9PDs8PTw7PD49P0E/RUFCQ0M+QEFARUVERUE7Nz5DQkI+Q0I4O4+akZaalJKUjZCUlI6VlI6Pi4yJk4uIkJObt8C6xsXEw8zCwcS9vrWvt7uvr7O6wMfFxMHMy8W2ucDCwsTHytHLwsPExsnFzNDNx8zJwsLHwsvLyMfMyc7Fxsa9qXJQSzBYU1ZlYVNOUHGpyMjCxMfAvL60sLCwwr6+wcbAvre2w8K6urbAvrWyrKmvsri+tMC0tLi0t7nEua+8vrm+v8K/tbq2q6qsrq+wt768trSura2vtaSlqKimmpycnZyeopydmZOQkp2VmKCdmJiVmZmZl46LlH2QkJefmZmYk5GToI6Nko+VjpCUlaKdnKSem56elpyjoKGipKOkop6amZubnJ2enIN9cn14cGdga2p3bWlmdm90Y11jVVdVU01HOjc7OTk3Nzo3NDg3ODQ1MjM0MjU7Ojk+Oj08Pz04Oz05OTk9PEBBQEVCQUJBQT9AP0RFREVAPDk+QkNCQENBOjSAoZeUmZiVkImUk5aTiZGMlJGOiJaKi5CXnMXLw8O8wMPHwbm9vbu4tre3rrK3uLzAwsDCx8bHurzAwsTHyMbSycHDw7+/vsTLyMrLyby8yMfJzcjDyMnJxcXCw8LBvJE/T3eAilZMb6XL1MW2v7/Av7q7vbWzs8C/ub/DucC3u8G8uri7ub27srCvsKy5wri9ube1t7q9xb24xsjCwcLGwr28tamurrCwr7O6t7m2sK+tr7OppquprqannqSlo6OjoqCblZiekZecl5GRlZeZlZmRlJiSlYyYo5qcnp2FiZ+TfJKWlZKUlJennaCipJ+en56foaGkoqKjoaOinJ2fnqOhppl5enmAc3BmZWdkbGVia25vb19ZXVdWTlBKRjk5Ozk3Njc3NjM3ODk1NjEzNTI3PDs8QDs/PDw6ODo8OTk4Pj1APz9GP0JBQz89QT5ARENDQTw5PENBQ0RBQDozbKKdlZedlo+PmJiZmIiSjZGVkI+Vjo6TlpbKy7u5urnBu7q3vsG8vLu5sa61uri4u8S6vsC+vru8wMXBxsK+xsK5u8O6uLm8vsHHwca7ucjIw8XEwMPBwcDEwcK9vMWnd2uCkJdvq8jIx9HBr729uLm7u763tLC5vrO8vrG5tbi7tryztbm2uba5t7GtusG6vMG/t77Ev8bDw8fHwrvAwr/Cv7iys7O1tLGut7S3tbSxrK2xp6Wlp7CtqJ+nq6ajqKWmpqCgn5SYmZSRkZWUl5OYl5qhnZ6hnKGdoaWglpSbkZeXmJqTnpmZqaSlpKWdoqCanqCkoqOcoqGjoJ6cnp6ppaiVfXuDeG5mYWViYWNkZGpjZ2RbWlpdWVFPRT07OTo7Nzc5OTY0OTk6NTMxNDUyNzo7OkA9Pzw8OTc3Ozo5Ojw+QD8+RDxCQURAPz49QkRCQkI+OjlCP0FCPT44NVmfnJiTmZaRlZiYmpeQkZCQk5GTlJKSkpSUxce4tbq5wrm5vMPFwri7ubGxtry6tbnAu7u5tre0tLW/u72/ub66urTAuLW3sq66u7fAt7zKz8C6v8C8u8W9usDEv72+r3NkfZGKitHFv7/Jv7DBv7q3u765tbi0uLy0vbi1tLCzvLG3t7i/tr25vb65t7q+u7/Axb29y8PGw8TAw762ubq2v7i7v7y4trOyq7CwsrWzs66sq6emnqeurauiqKumpqqjp6iqo5+Ym52bmpicnJiXnJuhpZ2anqGhoKGmoJqbnJiboJ+dnJ+coKiho6SknaKfmqKgop+el6Shop+dmpieqKWhi3x5iH1xZGFjY2hrZ2dqZmpeVlZUWU9TTEY4PzY7Ojc3OTs2NTo7PDYzMTM0MTc7OTg/PT47PDs3Njk5ODo7PUA/PkA9PT9CPjxAQUNDQT9DPTo2PEBBQDw9ODdJlJibj5OUkZWYlZGWkpWRkJGUlZSTk5OYlcHCwLq8ub62uL7EwMKxvbqytLO4vLW3vMC8vbS0sbC1t7W7wbi+ub+8vLe0t6+ut7W5v7vB1Y24v7vDtbrHtrW4ury4ubaqpJiNfoTJv7+7wb65xr3Cv7zFuLa3tLi2tru7uLa0t7q1s7i8vbm/ucPAwLu5vLu+vcjEvcfEw7rAvb62sra4srm0usLCureysaysq62yr7Kur6ijpJ6rrKyqpKakpKiqoqemraihoaGmn6Oiop6bnKKfoKOdnJuhn6KgpKCem5eZn6GdnZ6eoaWkoaKioZ6ho5yinqCZnZijn52eoJqZoKKmnYR6g4F5cW1lZWdwamVsaFlZT0tLS1JKTEhEOT44PTs2Ojs5Njc8ODk4NjA0MzE3OTk7Pz0+Ojw6ODg5PDg6Ozs7PD1BPj09Q0E8P0NDREA/Pzw6Nz5CREE/QDg4P4mYmoyMkI+Tl5WMkpCakpGXmJaUlJKQmZTDvsbBwby8uLi6v7a8scK2tLyxtLa4s7q9v768sq2vrLGwt7y3u73BxLm3t7a1ubm6u7+8z8R3qMy9x7e5t622tLe5s7WxvcnElEl7yr6/vr28v8jDxcW+xri1srK9uLi4vrq6uby6urS3u7q5v7zEwL+5uri/ubvFxr3Fw8Kyur27sa+2uLO3s7q+wLm2rLGrrqmqqa2qqq6mpKWnrq2ppaOio6GkpaWmoqato6Klo5+ho6Gcmpyhn6CloaCenZygnaWgnpeVmZ2fn52gn6KmpaCknpybn6Ofn5mcmZ2epJyWnKOcnqGcppZ+f4d9a25xZ3FrdGZjbmBcVUhLS0RKQ0NHPzo7OD48Nzs7OTc4Ozc8PDYyNzUxNjk8PD08QTs8Ojs6OT45Ojs9PUA+RD89PkRAPz9BRkQ/Pzw9OTc/QUNCQEI5Ojl3nJiLh4uQkpOWjY+TmpOQnZiSkY2PjpiSvbfHvsO+vbu+vL22uri9ure9s7OwuLi1uby7wLeqraSusLi7sr2+u8S2tbi1t7++xLzCxNaudIC7yM/CwLiutLS7vbe5sb3Dyo1Ddc3Dwr++vbzHzMfHxMe9tbW2wb27u7/CusDCv7y2t729vcHBwL+8ube8wru3v8W7wr++tbe8vK+vt7awtLO6ubq7r6mtq62rrKaqoqeuqKWqra2vp6Sgn6ajnqKjqKOjq6Oiop6dm5ublJaZnJyfpZ6fnpmYnpejoJyXmZqZmqOjop6jo6egpqCbnaCjnp2WoJmcoKCblJegn6WcmKKQgYaBcmZsam91b3lkaGNcY1FLVUhFRUNHQzw7OTg9Ojc6PTo4OTs3PD01MzY1MDY4OTo8O0A9PDo+PDk+OTk9Pjs/PkM8Pz5APz4/P0ZEQEE/Pjo3P0BDQz9APTo4ZqGYj4uNlZKVlY6PlpmVl5uVjoyMjY+bk7m2wbS/vLm8w8C+wLq1trKywLmvsry8sLe7tru8qqqjsLm9vLK8vrzFuLG4ubzGycrCxsnSmXFyq9HRzMrEtbq/xMi+vrS/wMF4Um7LxsK+wby/w8zKx8XGwLm9vMS/v7/CyL3Hx8XFvLrEv7vBv7rAvLu7wMS9t7nCub69t7S2uLqur7WxsLCytre0t6yurKqsrKuoq6Gms6qlra+trKippaOkp5+io6Onoaeiop6cnZyamYyQlpeZnaKZnpuVkp2UoaCdmZ6fmJimpqKfoqKmoqeloqCko6GbnaCbnKKfl5WVnp6kmpafiYGDgXRwbW10bG1vYGNfYmJOSU0/RUA/REM7Ozo6Ozo4Ozw6OTw+Ojo+NDQ1NTE5OTo5PDtAPD89PTw4PDs6PDs7Pz5DPkI+QD89Pz9FRUJBQj87Nj9CRUQ9QUE6OlmfmJOSlZqVmpOQlpeclZuZlpSVkZKTnZm2uLaxuru6vsG5uca7trWypb69tLbBv66zvbS4wbGwsbS7xdDDur68xL63vMC/yc/HyMrKwoZyc6PMzMvNysbCw8vOwby4vbqxb2Niu8jEwMC/xMDKycPDxMO5w769ub+8wsbCyc7Hxr66xr26v7m3wLm5vsDCvrW0vLi2u7CvsrK1r7Cvrqyus7CzsrirsbKxqrCrq6yrrLatqKyusqarrKmpoaWgpaakrKSmoaChnqGgnaCMlJeTm5+mmZ6emZOYnZ+gnp2eopuYp62ooqSgoKKqpqmhqKGlm6CgnZ2jn5SYmKKdp6Gfm4J7eoh7bW14fGBxZFxfYF9UST5DRUlCQz5DOz42OTo7Ozs7Ozs7PT05PTU2NjIxODo5Ozs6QTs/PDw+Nzs8Ozw9PTw9Pz5BQUE/P0FCQUVDQkRAPDY+Q0RFPkJEPztTmZuZmJ6dmqCalpyZn5KdlZ2boJWWlJqYur20sLu8wcTCv8XGura5sqO7vbS3xLuwtbq2ucS4tLy3u7ur28O+tr7Avr66ppypsrbDv6V5dXiZxMfLyMHDwMDJysG/u7mxoHxybK3IxcS/wMG/y8fDwMjAusK7ubO6usG+wMrOysS9tby8ub+5ubW1s7/Avre0s7S4rbeqr7CwsrGvq6+nr7ausrG5rra2uLSzsLGttrS6sa6srranrLKsraSjoaenqLKrqqWkp6elpaCml5ujn6SmraKeo6KanaWiop+foaWenrC0sKSlnp+kqaevp6mgq6CiopqipJ2anqGmp6+psZWCe32Bem5zeHRocF5cX11aUkZFRE1JQUQ9SDs7NTk7Ojw8Ojs7Oz0/Oj01NDUxMjc4ODs8O0I8Pz46OzY6PTo7Pj0/QD87QUFBPj4/QkBBQkJFPjo1OkFCST9AQkA7TJqdnZ6fnZienZmampySoJWbnp+blZGRl8W+urbDvMbCvr/Ixbe1uLe2ubu0r7e3srWzt7m8u7a7u8S4ba3Ovba5wLysfW5obm1ygZWYc3d8l72/xsC5wLy+xcS9vbixsJiQfYCbysLDvL2/v8PDv7/HvLzAtLOutLS8vr/OzcvCt7K4t7e9ubuxtrLIwLu2tLGwt6yzqbCtrbS3r6uuqrG1r7Gvt7O6usC/tre2sru6wLWyrbO3rLC6r7KloqWrrK+5s7KosK+xr6qiqKGkraitrLOun6inpqWmq6Sknqaqo6ayuLOrpZyfp6anrquqpbClpaWbpKOYn6exrLW4sLKOhHl/fHdtdXtxb2pcYGFaVFFBRklHS0BFQ0k8PTY7OTk8Ozo6Ozo9Pzw9NTU2MTM2OTg8QT5AOz1AOzs5PD04Oj08QD46Oj49Pj09PkBCQkJBRD03NDU9REc9Q0I/PEWUnqCgoJyXmpiYlZmdmZ2fm52bnJaRj5LDwMK9wrzEvLy7xbu3s7e2tru7s6CWtayvsbS0tLa4ucDNs3aBs722tcKlh2laXmBNUltabnN3gJ+4uMK6s7u3u72/uru7rqSbmIeQfsDEw768v7u7uLbBwrW/urStrqyvvcC5z8rJw7GwtbS0vbq+urq7ysO7uravsL2xuK+ys7C3vbaur66wt7CsrLK2vbzEwrq9t7bAv8G3tbC2srGzurGxr6err6u2v7e1qbqztbmxp6uop7ausrG1uaisrK+qr7CqqKessayytry0saykqKuoqKusq6i2qaaonqadmKOuvLG7wbSmiYF7gnpzdnZ4bnJhX2ddW1VKPT8/R0c9R0NDOTo1Ozk5Pjw8OTo8Pj4+Pjg4MzE1Nzg5Pj9BPzs6Pz08Oz09OTs8OTs6Nzs+PT1DQT8/QUJEQkE8ODU4PUNGPUREPzw/iZ2en52Xl5WUk5aZnpubmpuYlJ2Uio6Owb7Dwr6+vrm2usCxtbGzt7fCtbOrrbOoqa61r620trnCyaiEeIqgr7WdamVnVllgSUlNUFNsd4alsLe+ubK1sru5vLa5vrSWnKWVoXGuycTAvb+5s66yvLquu7SzpaqmrLq+uMvCv76sq7Cvs7q3ub67wMXBu7y3sLXEtb+0uLu0u8PCs7a2sbisqaWrsr23v7+7u7exvL28trGvq6uprbOvsLCrsLSpuMC2sqm0tbC3tq2spqu7s660uMKwsbG1sbK1saywsri4ubi+tLGzrqyxramvrqqyuK6trainoZ6ptr+4ur+wlol9gHxxdHd0d3JtYGRiXF5PSUI/PUlERk1EQDc3NTs6OT48PDk4PT47PT86ODMyNTc2OD8/Qj86OD4+PTw5PDk7Ozo8Ozs6PEA+QkI9QEE/QkI/PDs3OjxBRD5CQz8+QYqgm6GdlJiVlZKYmpyWm5WalY2bj4SIhru0vb+7vLm3s7y8rLOytLS2wLXAr7Kzqqqxt62pubO3v8WqiHx1jKCZYFRDWFVHYWpWT0VKYI2grK+2urW0sqy8ubi1uMG9i5iwoaVypcvCv7m6ta6lrLOxprKwqJ2gnqSttrTBtrWzpaeqqLC2s7K6tbu7u7W4trC1xLK+vL+8ubrFybq9vraxp6SeoamxrrW5trKxq7S2trGopp6gmaWmpKynq6y2qa+6sa2kpq2lq7GrrKmtuLawsrjBtrGxtbGvu7ayt7W1sry1urKwsbKutLKqrq2nuLWyta2uqqiosrq9wLa0qY6Ce393cHxwdnNvZF5oWV1eU09OQj9KQ0FLSkA2NjU7Nzg+Ojs4Nz4+PDs/OjkzMjc1NzU8PD48PDg+Pjw8OTk5Ozs7Pjs7OTw+P0E9PEJAPz9CQD47Njc6QERBQ0E/QUKJoJ2loJSWmJiVnqCcl5uYmpGMmYmDhoS1r7S7u7S1sLG2uq6wtLOvtbq1urC1s7KttrqvrbyzuLi/tZGCeIiPb05KP2RZQk53gJRqTkFdgbC1s7WytK+su7q4trm/xXWDqp6ZY6m/uLWysa2tn6SnpqKuppyVmJeZnqituKuqqp6kqKSrrq+nsKuvsbGtsa6ur7mwtLy+uLm4x8W8vLu4qaKcmJufp6assq6zqaapqq6popqXl5GcmpijnqKir6ekrKaompqemqGnp6anqa+2squ0trCqsK+xqbm2sbWxrqy3s7avrquuq7S1ra+rq7GtsbKoraurs7W3ur2wq6GLeoJ5cnZ0bXZqbF1ca1VeXFBOSERHTUJHTkc4NjY1OjU6Pjg7OTc8PTo7PTo5MjM2Nzc3Pjs9Pjo6Pz48PDw6Ojs5Oz47PTk8Pj1CPDtAP0A/QT8+OjU1OkBFQkRBQEJBiJ+ipqGYm56dmqWpmJudmpmUjJmHhoeGrq2uuLmxsqiur7iyq7CwqrK1ubm+tbK4tLm6trm7tbWzt7aVjIiEe1hGQU6HWUpKWHeNgWNBU6O5s7SysLGtsLm4tru3uryPobKro3KssKmrraujqKCdnaWahZ+UkJSWjpadp62joqOfoaaio6mpoaanpaqtp6ynqKesq6yyu7SztLm6trK2ramgmpaWm52fq6yqr6Oko6GpoJuTjo+QlJKSmZaanaSloJ+ep5iVkpSZnqSjoaWqrK2iqaqppKmtrqW0sa6xraqprq+wraWmqqSos66trKmmpqmrpqqnq7Ksr7Oxq6mWgX+Bd3J5aXV0b2VVYmRYXVJPTUlASVJETkM9ODg3NTo3PD46Ozw4OTw7Ozw7ODI0ODk3ODs7PDs4PD0+Oz08Ojk8Ojs9PTw6OkA9PDw7QD5CQEE/Pjk1ODs8RkFDRD9BQYijpqKjnqCfp6Coqpufm5yZmI6Xi42PjKqpqLGvsK2lp6ayr6mmq6CvsLu1vby4wMG+vLy8ua6sr7K8qZmZlWlOQFJ4cVBJSUtnnIFZRVKuu7Gss6+urK22trK0ta6opp+am52epqieoKipn6Gnlp+RVYGekYyOlIuVmaKnn5+hoqGlpZyjo6CepaCkrKWmqKWio6OrrLOuqa6urqeqraisoZyamJmYm6qoq6ufpqKbo5yVkIyPkJCTkJeVlpifnp6amaaXk4+Slp2ioKWipqSnoKKko6Ghq6uksq2qrKyno6yuraufoaKkpK+srKmmo6KqpKqppKmrpqmsq6ahiHiDfHZ/emN4bW5dUWlVUE9HUE1NQ1BSQT87PjQ6OjU7Oj07Ojk9OTk8Ozw8OzkzNjk5Njo7Pz06ODs6Pjw6PDs5Oz07PDw9PjxAPT88ODtAQEE/Pz45NDk8N0FDQkQ9QEOOqqSjoqGinaqlpqimoZ6dmZ2PmJWTkJWnpKGmqKmlpKChp6uhnKKbp6u1sry9wMLCwL7AuLSnpKyovcKrpb5pRVKdglFXSUpgSlSOYGNigK61qrK0rqqrr7Cys62lnZGXk4+XoJ+hoJyjpJ+eqJSjVVaHlY+LjJSQlpqgp56fn6Cjpaicn6ChnKGfo6innKehoKSfrKisrKCpq6agpKimrKOenp6al5qrpqqxo6WonqCclpOPj5KRmZCWlZiXn5icmZukmZeUlZqdoJ2nqKWgo6Kho5+doKmqpa6upqipoaKqrqqnoaCio6msq6eppqShqaKlqaalpKKmpKijkn58gHV2fW5se2RpVlNkTkpIR09TTktOSDxFQD0yQDg1OTs+Ozk5Ozg6PDs7Ozk5NDg7ODc7Oz48Ojk8Oj07Ozw9OTw8PD49PUE+QEJAPTc6P0FCQEA/ODU1PDpAQ0BEPkFGlq6koqWeo6KpqKipqqWmnp2imJiZmZWbop6bnqOioKOgoZqgmJeXlqGorK62trq5ure3u66ooKGpoKrGv8uhUEFynndPbktLY2Z1c2BaXnCQsa+us7Wqpqyso5uZlI2RlZeYmJyfoqKcnaSemqSakzpkhI2Mi46XlJmeoqmdoaCcpqerop+gp5+dn6OmqJ6jpp+qnaqtqq6nqLClo6Smp6ymoqWim5mer6iusqumq6qgm5iYmJWTlpqTlZaalpuXmJihnpyclpuhm56ao6eln6GioqOdm6Gmp6aoraOppZ6kp6mkpaWhpaSsrKmmq6eioKSjpKenoaCgpaKmoIl8gH53eXxleXlhYlNWYUlJS0xTVUpTUU05P0E2Nz02NTs6PDw5Ozs4Ojw9Ojs4NjU3OjY5Pj0+PDk5PTk9PTw+PTs7PDo+PTw/Pz9APT03Oj5AQEA/Pzg2NT08PkFCRkBAR6CupKaroaOqrK6tp6ypqKCipp6bm56aoJyalZmfn5uen56WlJOXk5KcnqSorq2sq6uvqq+pnpeepZykx8eOV1NJZaNbZX5vcl1Ra2NbZF9da4+0sLC4rKahnJ2alJeamZCOkZWRjI6Nk5minJeio4A9ZICBe3l/lJido6Onnqarn6eurqqmorGjmqOmpqqioaqiqaSosquxsqu5qKarp6urqaysp6Ggo7GusrG0qrKuo5mcnZ6hmJubmpiZm5WWm5aZnKWhoJqjoZqdmZ+kop6gn6KmnZulpqWkpaijp6OepqOinqaloqWlqKykpq2noJ2eoJ6gpaGenqWgppmBe4F8dnZzaYJtZVxTW1pNUktPT1ZNVE1CNz5DNzg9NzY6PDw9Ojw5ODo7PDo7OTc2Oj01OTw7QD03ODs3PTs9PT06Ozw4Pj09QD5BPj4+ODg8P0BAPT43NTg9Pj1BQEZAQUihqqCrq6GkqquwramtqaelpaWkoKGfnqWXl5SYmZ6YnJ2blo+VmZKRnJihnaqip6Cep6Gln5ySm6KanqukjXpVaXJ2dXBjdnZYV2NgY2dZWFdmra6sr6efnqKglpCTm6CcmZeSk5+coaOanpuWnqCDamNmcHp4dX6Mm6apq6W1sp+ttLe2sKe0rKKtraOvpaSmoamorrWzsr22vrCssa6tqaq0sbCoq6iztbizuK2ytKSgnaWgrKGhoqGgmpmWlp+bm5iloaCeo6Ggn5ucpaCfnZyhqJ+fp6meoaOkoKagnqehn5ymo5+ipaOooKmrpZ+dnZudmqainpyjnqeQgYJ/fHh2and1Xm1bUmFJUlZIRlZXS0NNSD1LSThGPDc3Oz49PDo8OTg6Ojs6PDk2Njo8Nzs+PT8+OTc9OT47PEA8OkA6OkA/O0A+QUA9PDk3Oj5APzo+NzU4PT0/QUBEQEJGnKueqamipamorqimqqWmp6aoqqGlpKOmkpOVmJacmpqcmpWTmZuNk5+ZqJ2un6eenKGdnpqZkpiem6KhoKSAboJwYGNYTFtTWk1MUFhSSE1NSJisqqmloJ+akpGUmJiWlpaMiIuOlJ2cnZyelp2etqt/Z3+GfXV5e4GdtK6zwZipt7i9v7qttbSwt7CutKmmpKWsqbmztbvDvMPBt7u2q66xube8r7OwtcG8t76zs7WirKKpqbKpq6inqJqZnpqqp6CZp6Cfn6iopaWfnaqiop6bn6igpKetmZ+jnp6nnqCmnpycoqGbo6KhnZympaWkn6KZnJukn6CboJyjiYWFfnZybWl3bWhuXFhcQ1dOSkdNSENGTj0+TD40PDo2Oj0/PDs6Ojg4PDk6Ozs8NTQ6PDg5Pj4/Pjg4Pzk8Oz0/Oz1BPTo/PjxAPj8+Pz08Njs/QT07Pzg1ODw8QERCREFCQ5WqoKapo6mqqKmjoamgpqinrK6lqaWpqZSSl5mUmpqanJiYmZyamJmqoLGit6Swpp+enZ2XmJWZnpuco5+dimJXXmVgV01RRz4+P0NDPz5CUXipramqpqCen6KjnZ+em52blJOVlJ6emJSFnZmgvNW5lYWIjIV6cXBsgKm7xJyQucO+v8K/trq7wMO5vbusrqexrbHCtrjCxsDIysDKv7C5ub24wr64tLvGxL3DvLi0qrOtqrO0r7Ouqq+jnqyot7Kto7CmoaOwsa6wpKWvo6GgmqGmoaSqqpmdoJmao6CmqKGcnqKemaSenpiYo6OhpJ6mmpuipJ6fm5ubnIeGgXx0cmtsdXJxaFdcUUZVSERKUEk/RUI0Rkg5Njw+Nzs8Pjw8Ojo4OTw4OTs4Ojo4Ozw3Oz49Pj02OEA5Ozs9QDw9QDk3PD07Pj0+PUI+Pjc6QUA+PD45NTg9Oz1DQEFDQkGRqqGlqqelqqimn6KnnKasp7Gyq62jqayVkpWalJecoqGbnqCinJ+psqu7sr+rr6ylnqCgnJyYmp+gmp+flX1gXmVgUUdEPEM+RTw/OTZOfqqzp6SjoqCepaymn5idlZKanpmVjIqGiIZ4bYefs9vUvKuciYaLgnJoXV2QzrZzrcfFxcPIwsDFyM3QyMvDsre1vrK+xbu+zM3GzMzM0se+v8DDvsfHwrjEysnEwce/urS6u7W7t7C2squ7sq+8t8C7uqu4rauquLu1vK6uuKOmo56mpaKjqaaZm5+Zmp2nqqegoaGkmJSjlZSZkZydn6Sep5+en6KdmJmUmJSIhX56cmtkaW94a2VaXEZMTUVEVE1FQkU3Oj87NTQ5OTc5Pj87PDs7OD48Njo9OTw9OTw9Ojs9Pj4+NztBOj45PT45PT44Nzs6Ojs/Pz1CPj83OkFAPTw9ODY2PDo8QD9BQUE+kqugp66ooqulpKKipaGlqquwsq2upKmmlJWWmpaUm6SmnaGqp6KrrLy8v8PBsrK4p6Ghq6qhnJ6hoZ2bmn5zamFXTkU+SVl8b2JCPVyOrqygmZucnp6Zl5eYk42Pl5eUj42QjIKDgnZycG1wkbvDx8TAt5aDgoSEcmBXhbmAgNDMzMzHysXFzNDS1c7Tyb3Av8O7xsXIxdHTzdPQ09PMysHGx8bKyM/AydHNx8bIxsK9xMG/v7+1vrOtv8DDw8fFyMSvv7myuL3EwsG7vLy1rqenrqigoqmlmpagmpmdqKupo6SknpePm4uQmYmVmJugn6OdnZeempOTi5WPhYF5dXNlYmdyb2deWlpET01DRlFJRENBNTU1ODlCPTY4OkE+Ozs+PDk+PTc6PTk6PDg8PDw7Pz8+PD0+Qzw7OkA9Ojs6Ojg4ODk7QT48QD8+OTtBQTs7Pjc4Njo7PkI+Q0FAPpOvn6ivpqiro6KloKampKuoq62qrqKqo5Kcl5ebmJuirJ2frqalsarFxszOzb+wwaikqKytqqCdo56bnZZrZl1USURAP0uGnqWahKCyraOenJ+amJeUk5SXkZCQjYiEhImHg4CBgYB5cXJvbHuIZ46ttrWhjn16emtoZXGEX7rU0dHNzc7QxM3U1djR183Gx8nMw8XKz8rS19LX0tXW09TIzMfMzcrTzc7TzcbJysrCx8zHycnGv8Ozs8jFy8vLz8fKv76/vcHHxczMycnAw8CusLOonqKqo5qTnpyYnqaprKSlppaXipWFkZSHkpKSmZualpiQm5aQjIaRi4B7cnV2Z2NndmplVlhSRE5HQElRQz5CPToyMkE8RTw3ODxCPTs9Pzs7Pj05Oj48Oz44Ojk5Oj86Pj1APkA8Pjs+Ozk9PTw5Njo6Pj08PEA/Pjk6QEE6OT44Ojo6Oz4+PEE/QT6QrKKiqaanqKSfop2qqKOso6OnpqyiqZ+To5iWn56dpK6bn7CrqKyxyc3U18/Gu8esrbO3rK6jnqOinaGcY1NMSkRDP0NSrtG9sq+mnJycoKShnZqUlJWUin15cWxlYmhycHJ7hYqAdXBtcXFweVFZfJiko5Z+b2pjZmpmXZPY0dLT1NLP0cPQ09bY1dXSy8nO0MvGzdLK0tXX2dbY09bYzdLKz9HMz9HN09DAycjLxMzNzM/PxsfItsDLwNLNzNDHysnAxMPIz83Q0c/NysjNuLe7qJ+lq6eemJ6jnp2qpa2pqKiSlYiQhIyRho2MiJOVmZCWjJiSj4aHjIR9eHN2cGNhZXJjXVJcSktHQUZJSj87QTg+NTU4Njs4Njo8QD07Pjw7OUA7OTo8Ozs8Nz09Ozo+Oz08Pjw/Ojo8Ozs5Oz89OTU7PD48PD0/Pz46O0BCOzk/OTg7PT0+PzxBQEQ8hqugnKegp6Oim6CbqaSlqaCfoaGmn6ifmKSimqmmoqarmqOwsamotdDU19rSx8bLtLXBxbG1qKGlpaCioltJQEFEQUZRdrKvppqUl5+cmqCgnpudmpWJd2lkYV9fX19eX19dYWx1c3Bwbmxxb3WAY1p3kpuZhWlhX2NpY3nM1M3P1dTU0dHM0M3T19bT1dDP0tPRydPRyNDX19jS2NLX2dXWzM/Pyc3SzM7RwMfEycfPztHR0sjMzcDLzcbUz8zPycXLx8fJzMvU1NHVz9LM08K5xbGlqLWuqJuoq6Wdsqiws6ysk4+TjoiKjoOPi4SQjpmNk4+Zj4+ChYx8enFzdG1hY2ltX1ZRYEpKQ0VDU04/PD40Mzo9NTI4NTU8PEA8Ozw6OTpAOjg7Oj46PTg+Ojo8QD08OTs9Pzk6Pz07PTw9PTo2PD0/QD08PT0+OjxAQjs5PDc0Oj48P0A9RkFEPYKknKClnqWlo5mcnaSeo6OfnZ+doJqnnpyhqZ+vraqqq52lrreoq7fX1NXZ2dHO0L+8zMm2vq6nqqiho6xnQzg9PkRYgqqon5eVl5manJ+dmJudk31xZWNiX19hX15hYF5hYF9gZW1wcG1rbnFydnxgXYCUmIpnWVlebXWXx9TOy9LN1dTRys/M09bS0dbNz9XV0cXR08rQ1NXWztPR2NjY18vIzsTKz83KzMDJwcnKzs/QzNDOzszP0MjM0NHLzsvDysjKzcvM0tPO1NLR0NDKvci5sK67ubWrtrCtqLits7+7sZqOoJSRjo2IjpCFkY2ZjJGRlY6RgIWJenZvcG9rYWRucGFYXFtJRkZETVlFO0A9MzM8PDg3ODU1Oz5APTk8PDg8Pjk8QDtAOj04Pzk4Oj88PTg7PkI6Oj08OkE9PTw6Nj08P0A9PDs9Pjg7QEE9Ojw4ODs+PD4+OkVCRT6Bn5mlp6Cgo6eam5+cl56eoZqdmpyappufpKefuLa1taykrK6+tLDA2NLX2tzWzs3Kw9LPwcGxqaytqaSyfEhGQjtWjaGblZOWm56enpyTlpeUiGteXl5hZGJgYGFhYGBgXl9fXlxibXFubnFxcnF3d1tnh4+KYlVZaoKRnbPNzsTNytLSzsbOzM3Uy87SzcvX1tDM0dTLzNDR08rO0dXS1dbKwMrCxs3DyMrDzcTGycvLz8vOzdHO1MzHydDNycfLxsfCxsrMztHRx9DPzs7M0MXHwbi5vcPCvcO5srK+sLvDxLWqmKWhmJaRlZWSi5SNmpGUlI+PlYKJhnlxcmttaGBgcWhZWGhWTUdMSVFRQjtEPzs2ODo4Ojo1Nz09QTs6PD05PD05PT06Pjo8ODs9OTtAPD47Pj5BPDk9Pj1CPTs3NzU/PDw/PDw7PDw4O0FAPDo8OTs7Ozw9QTpFQUU+hJ6bqK2epKSqnJ6fmJKXm5+am56ZmaKVoamppcTCwb+7tbKxx8K4ytXW2drb2MzMz8jW1cTCta+0qKCtl3hsb3B3j5qNjJeVkJORkZWWlZCLfGViYmJgXV5hY2JgX19gYWFgX11bXWdxcXBxcW1pbXhoVXiDfFtUaX+Sm5+uxca/wcTOzsfFx83K0cfKzc3G0dLPzczUysfKzs/Hx8/Sy9DPxbrEv8bKvcPHyc7Fw8jAx87IxM3LzdDJxcXQycbCxsnFv8HIzczMz8PKzMnHzNDFxci7x8PJycLPwb28v7DByce5vaqxsqelnaKcmJCbkKOZl5mRlZiJj4J4b3Vka2BeZnFhW1dgR0lIR0lNVUc/Sj02NDM1NT09NDg9PT06Oz08OTo7OT89OTw7PDg6PDo6QD1APD09Pjw6Qz48Pz04ODk6QD4/Pjw7Ozs7ODo+Pzw7Ojc5PD49Oz49RkFDPYOgm6qupa6qq5qdoJeUjpedmpmgmpqcm6WysazJzcrIxL68uczMxtDV1dja29jQyc/P0dPIwre7u62ktn5ngoWiqpONjZaPhYODg4F9hIR+c19bXl1eYF5gY2RjX11cXl9gYF9bWlxha3JwbW1oZ2lrcV9lb2pYXHeCkZeXore6uri7yMXBw8DDyMnIyMnHwcXLxcfKzcnEwcrJwcHLz8TLyL+5wbzGyL7Axs/LxMDDu8rHyLvJxsXKwb7Cy8bFxL7Gvr3BxMbMxsW8v8rDxcfSxcHJwMrKxsjG0MPDxsOuxMvHw8q3v7y6s6mspKWYn5iso6Gmm6Ogm5V8d3N1ZmpbYW5tWlxYUkRMR0NHRExERlM/NTQzMzVAPTM6PDw7OTw8PDg7PTtBPTo8Ojs3Oz05Oz07PTs6OD4+PEI+Oz88OTk7Pz07QD48Ozk5OTk6Oz06PDo2OTw+PDs+O0NCRD5/pZypsqm0rrCdnp6YnImUm5man6Kfmp2ovri8ys/RzMfCw8bNzs7M1c/V2djZz8vSzc3OyMG1w76ysLZtXnp8npGKkpaGeoCEhX91eHVycF9aW11gYGJjZGRlZGBbXF5dXl1fW1laXGJucW5pZmdraW52XFpaXGBzfoaGgpKur7GvrsC5uru5uMDBwcO9vbm8v7nEycXGwr3GwLe7w8i/wcm7tru7xcO/vMLOw8a+vrXBvsS7vce8w7q1vcbEwsO3wLa2v7+8zcS9trrIu7++zMTCxsPGycfJxtDGwszIssfJw87MwMXDv7yyt7Cyp6ioubClrbCqrayUend4a2VoYGhvZFZeWUpGSkZIS0FFQkZKQTk6NjU4ODUzOzo7PDk8PDs5Ozk6QD46Ojw6Nzo7Nzo7Oz88OjxAPUA/PT8/Oz07O0A8Pj4+Ojk5ODk3ODo8PDw7OTo8Pjs7PjpAQEU+fqygrLWrt7SyoZ6fl5qNlJaan52mop2et8XCxMjO0srKysfNzc7RyNDG1dTV183Kz8XJxcfBusW9rK6nYGN2gZKLiIuEeH+Ghn99g3t0dGNcXF1eYGBiY2JiZGViXVxbXF5cXl1aW1xdZ3Jwa2RjaWpqdXBIT1xZaHNvaWSTpaaqqKO1sbWzsrKzu7W8sLavs6+yu8K7wcS8v7q0srq+wLjIuLS8tsDCvbi9x8HDu7Wvs7W7v7TFuLu1rLm9vsC9sbu2sLe6s8a9t6+8v7W3tcW9vsPGwMTGxsfMxb/GxrvHy7/PycfDxsHDt8O9vba5vse/rLW7tbe2jnl0eGdnZWJrbl5WXmBGS0hISkdCREFFRj89OjU2NjYzMzs6Oz06Ozs6Oz44PEE9PDo7ODc5OTk7PDo+Ozk+Pz1APz5CQD1AOjo+Oz89PTk6Ojo4NTY7PT48PDo7OT49OT86PEBAPIi3pauzsby8sa2foJmUlJiXnqujr6qnpMXLzcjFyM3M0MvNyMnIysnKxNDN0s/NxcfBxcG/urjJt6uwmltnb4iOhoiJenh+hYZ2d4F8c2hdXV1dX2BfYGRhXmNlY19eXFteXF1eWltbXF9rb2xmY2ZoZ2p5X0NQTFxcVlJzoZqepqKap6mvq6mrqLOtta+xp62mrLO7urbDubq5sKq0ubuzwrmvwLG9vLu1u8e5w7etqqiwssC2uL2wsaiys7W7vKuutqeutq68srCquLCuu667uLvAwb66w7/Gw8XAvMbBx8q4xcfFv8fDw7nExsK7xsnMy7O5wr27s4l0dndraWBibGlZV1dbQUxMTUpFQUM/RkE6Ojo5OTY4NTQ6Ojk7PD07Ojs+ODtAPD05Ojc5Pjk7PDo4Ozs6Pj45QT0/QD87Pjo7PDo9PDw4OTg5NzY4PDw9Ozw6Ojs+PTs/Ozs+QDyKwKuouLe5w62zqZ2ZlJaZoZymsLWxt6bFztLLw8XBxM/HzcHCxr/ExMPDysLJyr/AvMK6s7W1w66qsZNbaX6SiI6Pe3h9iYV5e4SAd25eXVxcXV9gX19kY2JkY2JgX11aW1paXVpaWlpdY21tZmRkZGVnbHhRPUVMWF9al6WWnZ+blZehp6uipqGqqauqr6Klnqqttbaxvbivt6+orbi0s7y3s7ywuLm1srzBssCupamjq7Gzs6i9qquoq6yutbSmqa6hpbCps6anqK6mqLessbO3uru7sry+vr7Ev7XBwMfIt76/xbfFw8C7v8TCvsTIzMq/v8TAwKmHc3RzamlcYW9kV1ZYUEhaU1NLRkZFPj9AOjc4OTc3NjQzNzo5OTo8Ozs8PDc7PTs7Ozw4OT44PTs8Njo9Oz89N0E+P0A/Ojw8Oj05Ojs6Nzc3ODg3OTw7PDs5Ozo8OTc5Pjw+P0E7jMKvrry3ucSwtrCbmZWcmKqpsLGztb2vxdDPzMPHubnLwsu+u8m2vcO+usq3wcPCtba8trGvtbytqauTZG2Ig4eLgHp9f354dH58c3dlX11cXF5fYF5fY2NhYmBhX11dXFpYWVtbWFdZXF9lamRiY2FkZGhuc0ZEZIFwXZSZh5yulpKMnJ6moaGfpKWmpayfnJukpayysLa2p7Crp6q0q7O5sLW1rra5s7C6urG2pKCkoKaxqKypuaqlp6eop7OtoKenn5ylpqyfn6ekoaGxra2ssrWztLC1vLa7wcCyu77DwbG5ucKzwL3Atbi8vb68wsfEw8S/wMSghHlxbGJmYGtvYFVZX0hOaE9USEZLRjw9QD06Ozw4MjY1MzY5OTk7OTo6PDo3PD88PDs8ODg8OTw6Ozc4Ojo8OTg+Oj89OTg8Ojs+OTc3NzY3ODg2NjY7Ojo7OTo7PDg1OTw6Pj5AO43Itba9uLrBur22oJ6VnaCmurars7O7s8TPycvCxbi3x8DMv7jKt7vFuLPFuLO/wKy2vLKspq+0raGjkmlyhoWGgHx4dXNvbWppaXBpX2BdXFxcXl9fYWNiYGBgYF5cW1xcWFlYWFhWWFpdXmNiYGNjY2JlZWxrWXt5X1RcRF5ik6SRh5idnqSbnZ6ipKKmnZqim56qrqyxtKOoqamrrKS0uKy2r62zta+zta+wqp+en6SisqWmqritoqamn6itq5mfoJ+ZnZ+lmpmjnJyesKmsqKqrrK2ws7mvuLm6sLa8u7qrs7K5s720t7KxtrW/tb3AvcPCu7u9l4R7c2xfZV5kZFhUV15JV11LUEdKSkdBPD8/QTs/PDA1NjM2Ojs5Ozg5OTw8Nz4/Oz07Ozg4PDg5ODw3ODo7Ozo7Pzo9Ozc4PDo9PDc0Nzc2NzU3NDY2Ozc5Ojs6ODo5ODo7OTo8PzuJyba4vru4wcHBtKSkmZqkpsCyr7astLfFz8jIwMa7u8PDz765yLi4v7eywrSxu7usurqxop+pq6eYnpBtfoWGf3hybW9ta2JeYmZmXV1eXV1dXF1fYGFiY2NiYV9cW1taWllYV1dXV1dYV1pdYWJjY2JiY2Rlb2ZZWEgyISJcWF+OlImWnZ6lnJmbo6WhpJueoJqYra2trrGgpKKtq6ehtbCxsaypr7OourOntqGin5yjoa2joqq2qqKjpp6mpqOWmZ2XmZqdoJqXnZydnK2hrKijpKatq7OzqrWwsquyubSvqq+ysrO3s66pra6yuLC6trq9v7ezsZSGenZmX2ZfW1lWU1pVS1tRTEpFSEtJQz0/QkJAQToyNDUyNDk5ODk7OTo9PDY9Pzs8Pjs3Ozs3Nzc+Njo+Ozo4Oj07PD06Ozw6PTs4Nzk3NDY1NTQ2Nzg1Ojo4Ojk5PDg3Ojg5PkA6gci9uL2/tr68v7KdpaOYpbHDtba9rbS4wszIxsDFtsHAx863wMO9s7m5sr+2sbm7rbK1r5+ao6qhlJqPeH+DhH94b3F0cWhlZGllY1xcW1tdXVxbXmBhXl9fYF5cW1pcWllYVldXVlhXWFdVV2BiY2FhYmBgZGZxUTozIRoraJSPeJGMkZuZnZqUn5+oop2ep5yamaqmrrCqm6Kjt6mhoK6otaqmp66xpLiwpLego5yZmaqmoZqtubCjoaScoqCgk5WhlJaWnJmYlpeclZ+pnqqkop6jqqqxrai0rKqnrbOwpauus7GvsK+vp6iosq6ytLC8tLq4rqOUgnp3ZV9hV1lYU1JUS01eTFBMR0hNTEU9QD49Qjw7NzY1MzQ5ODg5OTo5Pjo4Pj47PTw8Nz49Njc2PTc7PTs5Nzk7Ozw+OTk6Ozo4Njc2NTQ1MzEwNDU2Nzk6ODo5Ojo3Ojs5OT1AOnbAvLS6wrG+t72tnaenoqq7wL3Aua60uMHMx8XCw73FuMjMssHCwa68u7W7vLW5ubCwsaqcmqGplZGKi4CAfHdxaWxydHBoaGVkZmFcXFpZWlxcXF1eXVxbXF5cW1xZW1taWFZXV1ZXWFdXVlVaYmJgYGFfX2BiaWk9My0yTn+Nk4yTjo+Wm5ick52dpaSipaaenJ6ln6qupZ+ho7anoaGiqbOipailsKaxrqu1n6GdlpWpoaKUrbGxn6Ojnp6YnJOMoJSRk5iYkpeYmJeep5unoqKapKWlq6SlsKelo6usraaprq+vq6iqqrOmpquvtLGuvLaxr6+fknt4c2ViXFtdWE5MUUhSYU1WUE9KTk9FQkQ/OT02OTo3NjQ1OTk7OTg4Nzs4OT0+Oz47PDY5Ojc7Njs3Ozs6ODU6Ozo7OzY8Ozg4NDc3NjMzMjEuLzI1NTY7Ojg7Nzg3Njw7Ojs7QTh4u7uxtr2wu7G3rJ6lpqy4u7zBxbqyubXEycnAwsbFx7bGxLPBv8Wrt7e9tr26u7WyrK2omZmfo4uKdImIfnZuY2FmaWhmZ2lmaWxgXVxbWlpaWlxdXFtcXl9cWllbWVlaW1dVWFdUVFZWUlRSVF9fXV5fXF1dYGFrWDQ/TXSEiomMkoyOkZ6VnZSZnaOgq6Sjo6KjoZupqqOZnaSxqaGgnaWqnqiin62sqqmuraKiopWYopqckKypsJyfop+fl5mTip2RjZKUlpCYmJOcoaOcpaGilaCipKWbo6uloqSqpKutpa6yqaalpqa1pqqorbO1tLm6r6qsnoxzcXBhW1dWVlJHUU9IWlxPUkpUS1NMRUdKQzg7Oz08OTY2Nzo5Ozo5NzY5Nzc6Ozo9PDw2Ozw4PjU5ODo4ODY1OTo7PDk3Pzw5Njc4NDUyMTIxLi4xNDI2Ojg2OTg1OTg5ODk7OUA5e7W0rLS7srCrsa2dqKevubmzwMi6tcCvxcjMusHJzMi1ybyxvsPJrbG4wbW8wLy0taqsppaanJyJgXKIg3t0aWlqbGdqbG1ramxlXVxcW1tcWlhaXVtbXmBgXFhYWllYV1hXVFVWVVRVVVJTTlBZXVtbXFxcXVxfY2hAUnGHe4WGhY+KjIyXlp6YmJ6lpqmmqqaopaKYpK2jlJikrqmgnJmboJ+umZyqs5+lpp+jo6GUlJuWlpKpqa2bnJ+hoJuUkIyYjYyRjZKNlpWQnaGgo52co5WboaOhmKKoo6Koq6CrsKSuuKWjpKOsraqoq6+0t7K9tbOrrpiFdXRpW1lZU1VSRlhMUVtYTVVPUExRUklPSUI9Pz9BPz03NTc5OTw8OTc3Ojc5Ojs8PT47Nzs7Oj02ODo7ODk3Njk4OTo2Oj05OTU3NzU3MTE0MS0rLzQzNDk4ODo6ODo6NzQ4PTg/OX6zraezt66oqK+um6morLe2rLzKu7a/rMzGxbjAzs/Hs8S7t7vCyLGtuL+3vL67s7amqaCWmJmXiHp0gHZ3bm1obW1tcGdnaWZkXVpbW1tbXFtZWltcXF5fX1xYWFlYV1hXVlVUU1VWVVVTU05PUVhZWVlcW1pbXV5lcXl2f3OAhYGJhI+LkpSdm5ecqKekrKqnr6OmmJ6rn5SUo6imnZeRj5qerpaYp6qYn52UpaCekpGSkZOVqKqlmpiZnp6WjoyLk4aJjYOPi5KVkaCeoaSZlp+VmqGinpSbpaWnqaigsLCmsb2nn6OstKqup6+0sLm1wLGusKuRfnJ0Y1ZUVU5SSkdWUFJSTExYTktMT1NHTktBQ0ZFQz5BNzU4ODk7OTo3Ojo3PD06O0A+Ojk7OTo/NzU5Ojk4NzY5NTg3Nzk7ODU1NzY2NjEzMjAtKi4xMDI4Nzc7OTk7ODk0ODs4QDh/tKymsbeqpaKxq52qp6mysKS2xrS5urPKxbm6wcvQyrG3uLy9wMOxsLG3rrS0u7O0o6OdnZiXlYSAdmtnbG5xbnFqb2tkZWdlXlpZWllaWlpaWlpaXFxdXFpYWFhZWVdYV1VVVFJTVVNWVFFNTk1SV1hZWFhXWltbYGp0bHJpe4J8hn+PhI+Ok5eVmqWYnailpKqdppeepJqRjp6impeXhoWSm6SPlaKclZaVh6Kam5OMjoqQmqWnm5WVl5yRk4iUjouBjI2AkIuSkpKhmqCilpSZmJWippqNmaSnqaehoLSyqLO4oZ2jtqyqrqSysqa1u7SrrLGiinpzbl5OUVFNT0ROTk5QS0ZOTkpKTk5RSE1KQUhMSUhDPjk1ODg4OTo7Njk6Njg7OTk+PDg6Pjk7Pzg3ODk6ODg2ODU3Njg4OTc0NTc3ODIwMzAxKyktLzEyODc2Ojk5OTk4NDk4OEE3d7anpLawpKekqqWgqaaks6qissS1tbKzxsW3usPKzMazrbq9tLjAr66psJ6mrruvraCam56VlYh8hG5fX2ZycHVxaW5pZWdoal9YWFhYWFlZWVpaWVtbXFxZWFhXWVlYVVZSU1JQUVRRU1VRTk1LS1NXV1ZXV1dWWl1haWRoY3Z8dn53iX6IhY+Nj5qdjJeaoqCimKSVoJqUjIaYmotzjYN+jpeWhpKakJOOjXuZj5yMgomAipigo56Qk5iWhY6ClH5+dIqOepCIk5CQnZuampKWkJ2Oo6OOiZqgoaSkm6K0r6ywrZ+YprimpbChsa6csLuqqa+pmYR4dGRWTVJQUE1DU05MUE1CUFFISU5TTklKSkVLTUdLSz03NDk4ODg7OzY5Ozc6PDk6Ojs3OT85PkA3OTo8ODk3NjQ0NDU4NzQzMTI0ODUvMDEwMikoLC0wMjc2NDc4OTo6NjY6ODdBN3i3oaO0qKalqKOlpaamprKnprTBuK+0sMnEuLnAzsa+s6y6waytxK2ooqaSnaa3raOgkZaXkpB+eH9mV1ZfZ2ZpZ2huY2lpZ2JcWFdYWFhZWVlZWVlaW1tbWVlZVldXV1NUUE5QTk9PUFNUUU1NSkdOU1NTVFRTVVlaXWhfY2BxeHFrSVNti32RgoiYk4iRjp6XnJWVlZONlYl/k4lfO1ZvfIyUioCMkoyPhoZyi4SWgXmBe4aUnZWDlo6Qj4OGfZN4cXCGjX2JgZCOkJeamZOLkIqdiJ+Yh4iWnpqhoJenrqmtqamelq2zoqWtma2smKezo6mto5N/dG5gW05TUldMRFRKUE1MRk5PSUVMUU1LUEpJTlBHSko9NzU5OTk5OTo3Ojs6Pj44Oj09Nzo/OD4/NTg5Ozc5Njc1MzMzNzYwLi0vMzQ0MTEwLy8oKSsrLTM4NTQ3Nzk8Ojc5Ozg2QTl5t6CiraGmpqqgpqmno6qwqKe0wrmwtbDHwrizvc+/ua+utcKnqsSqop2Yg5ScsaOamYeUkIuHfnN2XVBMUVVZWlddXmJnY19ZV1dXWFhYWVpZWFlYWVpaWllYWFZXV1VTUk5MS0hHYlxNTlFNS0hGSE5RUUxPUlRVWFlgZV5bbXVpSj07fJKNi3mEkImCh4qZjJWUiZGGhJSFeIh/YEpRbniLkoR+hIyLhH9/bX5/k3d1dniEjZpwUY2IioZ8fnmUdmd3hoh+ioiVi46Rk5eMhIqIlIWbjYKFkpuWnp2UpKKoqaWknpuwqqGkpJGmqpahqZyhpqeKd25mXlxIUVFTTUlVTVNJTEtPSUhGSk5MTVVLUVJQR0pEPTc2OTo4Ojs7ODo7OD4/OTk+PTg7PDY7OzQ3ODs2Nzc1MzQ0Njk2LzMvLjExNTIyMS8sJykrKiw0ODMzOTg5Ojk5Ojo6Oj85d7aboqedn6Guoaeopaeor6yqtby2uLezwbu2p7nIuLaoqLW2qrK8p56Vjn+JlKmWlYt/joSDfnhxb1hNS01NTkxNUVdbXFpYWlVVVlZWV1lZWFhZWFhZWVlaWFhWVldVU1BNSkVAQJtrc3NJTUtERENJTk9oWU5RU1NVWmt0ZGhxYF9VT4yDkIRweoJ9eYKKkYCRmYuPeoWOf3R/eHJudXB0jo6Ben6Kq4V6e2h2e45wcm14gYuNknh7gHuAd3NyknhodYWEhIV8lYqIio2LgH+Ei42AlIR8gY+YlJyWkZ+dqZ6goZ2gqaWfnZiNp6SSoJ+Wnp+kgXNpYl1dSldQUkhLWFJPSk1MUkpKSkxQSExRTVJVTUZJQjw3ODs5OT49Ojs8OThAPzo6Pjw3PT03OTkzNzc4NTY3NTI1MTQ3Mi8yLiwuLzIwMC8tKygoKS4xMjcyMTk4Nzo4Nzc1Ojw7N3aumaOhmJ2ftKmvqqWtq7Cxqr20sru4trq0sZ+3urKqnZ2sqaiyr6KakY2UgY6cjpF/d4Z4fHZwb2pZS0hJSEdFSEhQVFRUV1dTVVVVVVZXWFdYWFhYWFhYWVlXV1VWVVNQS0Y+OTNOPH6eTUhKREA9QURqlH5MTlFRU1ZecXpwa1xuhpGVjIx3Y3V9c3V8ho57gpiSf3CGjnt2em5rfq18dJCLf3qGkoB8f3RmdXyGbG9oc3yKjYeAbXpxfXFtdo9xaHGBfo5wRIuFgoOFf3d3eoyGfYx7dX2Oko+Yi5Kbm6OWmZ2bnZ6hnJaNi6Wbjp2XjpaYkHhvbmdjW1hYVVFKU1VUT1BOUFZLTktPT0tST0lPUExGRD07Nzk7Ojo/PTk8Ojk5Pz87ODs9Nzw5OTk5MjY2ODU2NjMzNjExMjI0LiwsLS4uLTAtKyonJyouMTM2Mi84NzY5NjY1Mjc5OTV5ppegnpagprCsrquoqbGvsau8uKu7vrizrKebsKesm4+WnKWppaGYmo6EknmJj4uLdnF8bXVxam1qWEtGR0VBQENESExMTVFRT1FTVFRUVVZWV1dYV1hZWVlZWVlWVlRTUUtENzhmNzA/qGlOSEM9OzpEioV6WUpOT1FUWF1kbWlif5+jvnxwdF93dGt4dYaOeHqKhG5ri5F4c3hpan+CcZaRjIF9lX9JkpluZ3d+gm1qZGx5hZCShmtzbHxucnyGaW1wf3ONiYWGe35/e3dwdHSGgnmBeXB8jouKk4OWlpiakJOWlpmXnZaMg4mfkouSjYaQl4Bwam9vb1lWWFRSUllPUlVUUlhVTU5ITUtNT0tDSU5HRkA6OTk7OTk6Pjw5PDs6Oj0+Ojg6PDk/ODY4NzI3NTY1NTQxNDMyLzAyNCorKiotListKigqKCcsLTEyNTAsNTU2NzQ4NUhBODk1d5mRm5ibn6Ssr6Ktqqi1r66stL+rvMO/pqKalaSYno2Ei5ShoZiZkZOLc456gIaMhnVvdGxxbWVra1lOREZDQDw+PkFGRkdLS0tMT1JSUlRUVFRWVldXWFlaWVlaV1ZUU1BMRTFAmjMganNDmW87PDk1PICChl9JTU9PUlZaUVhaWqCBXZVjbXRhemxqfHeIhnSAhYRza5iQc3J7aWqdjkx5hZOJhI1mMXaHcmt9fYN0ZmV1f4SEhYBmaWx1a3CAfGhxcXxuk42Pe3R+fXFxb3Vtg393eXVqeYiCiImDlpKSkIuNkZSUjpeNgHmIl4iHioaAkIh4bGtwaGVYUltYWVlbTlBVVllYTklIRUpKSEdCQEdFQ0c9OTk4Ozk6OTw6OTs6OjpAPDk6PDk4Pjc4NzcxNTIzNDUzMzY0NTAzMS4qKispLCwrKykoKycpLCwyMjYsLDQ3NzU0NzhpTzg7NW2SiJqQmZakqK2esZ6nuq+rsrDCsbvDx5qWjpWZi46FeoSQmJWNkIyQh3GHgnSHjIZ6cHNxb3BkcGdfVEZJQz48Ozk6P0BBRENFR0lLT1FRUVFSU1RVVlZYWlpZWFZVVFNQS0U4MC9cYLNHOVhQOzk0NDGWuotITE1PT1FVS0FJUUhgqq6cbHVyaHlpbn9+gn94goSEeHGfk3N3gHJ0k4c1cJ2onY2goYSihXZwhnuGfHSMro2JgWhnYmpucm1wg3Vpb1h1cI6bkXZtf3t9bnJucIB7c3ZuYnWDf4aAhZCQioqJkYuRi4uOg3V4io6AfoOAfY58c3JxbWBcXV5cWllhX1JOW1pYV0xISkZJSD9DQUJIP0NEPTs6Nz07Ojs7OTo5OTs6Pzw4OD06ODs2NjY1MDEyMTI1MzQ3NDUzMS4vLCwrKSopKSoqKikoKikrLzNETTIxNjY2NDM8dlI3PTdikYGSiJWRnaSnnq+VpbSprrCuwbK7wcWWj4yUj4CIfG6BkJKJg4qHj4Z1goRslYiIfHV4eG14bndkal5JUEc9Pzc0NDk7Ojs9PkBCRUhMTExMTlBRUlRVVldYWlhWVVRTUExFPDUqnUtbQC1nSTk0Lz+Sg6muX0dMTU5QTDdDTVFSQ0iAb3p3dnF6aXOEhXl7goF9inx0oJh5fYWAhJmEmpxhhqqenIuDkI56d4h+iYiOdIuXj4R7XWRxdHp8d4ptaGpieW+FkIJ6b4F4dYV6cHR6eGtuaV12hn2HfIeGjn+KkpeDjYWMhn1xhH+EfXZ3e3yJeHF0dWdoYFtcXlNcZ15XUVRYW1VHSkpES0c/RkBEQz5BQT07OTc8Ozs9PDo6OTk7Oz0+Nzk+OTk4NTY1NDI0NDAwNDY0NTU1NC0sKSsoJycnJigoKSkoKCsrKy8wMFVxPTIzMzMxRX5XND05XIx4in+TjJGcnZ6mkaCqoLGor8Cyu8S6lo6Rk4d6hnZrf4uRg32Kg46MeIOAc6CEin19gX9wgX56aHdrUlhMQEUyMTEzNzY2ODg6PD5BRUZGR0pLTU9RUlNUVVdWVlZUU1BNRkA6Mj0gI5ZjjFs1MzExaT9Hb0lGSUtNT1FLSlRbV1FJZH2DdoR1d255i4h3eoaEfZSFdp+Yh4aNkZSljKypSIatr66KgYCUi4KLgoSSqYiBmJiKnHRtfIGGh36OaGdoeX9uhYeChXGEhkhsgHdyeXZobWtfdn2DiH+HhYt5lJybiYuIkX96dYp2fHhtb3d+gXV1c21cXl5cY2RYZ2VcVVBQV1lQRExLRk9JQ0ZDQ0FAQ0E9OTc4Ojo6Ozs6ODg4Ojo/PjY7Pjc1ODU3NzMzNDQyMzY2NTY3Nzg7REZMTU1MQzcrIiUnKykrKywvMDArbnUyMjQyMEyBXDU9PF6EdHx9iYWHkI6Vl5KWoJ2soKa4r7O9s5eNkouYi310cH6Jkn59jIOSlH2Gfoakh4h/goiFeIeJfnOEeF9jV0tCNjAuLzIzMTIzNjY4Oj0+P0JFR0hKTU5RU1RVVFRWVVNRT0ZDPzgwLCOHWz8/ODQuXZZwc6NVRklLTE1PV2BYbVhaXGWGjYCPfIB9gY2PfIOGjn+Yk4CfoJeUmpmlrZKZu7Gnu8fDp4uMoaWOk4mBkXxxg56fkZ1/d4WFi5CHkGlocISBdIyHhIpyhoJ3iIB7doR8bXV1Zn+UjoaIiIeIh6CqopaJjpd/eoGIenlvZ2t4fnyAdWxlXltbXmpeYmdgWk9MTlhSUUhQSkROR0NKRENBRERCPDo4Nz08Ojw6ODg3Nzg6PT04PD02ODc1NjYyMzQ0NDU3Njg2NzxCQj88ODo+Q1FeZVxHMicmLCwtLS4xKD+LWy4zMTBPg180PztudXBmd4J6f4x/gZGOipqbpJ2hrKaqrrCXkZGEoZSEeHd/jJR8f5KGkpV/ioCSm46EgIGMioKJjYN/in9scGpdQkA0LS0vLy4uMDIyMzQ3Nzg7PT9CREhJTlFSVFJTU1RSUE9IREI8ODcvOUM+PDw2My5sk5dNUEhKTEtKTVZfYXxlZWpxlZSIlY6Ph4qLloWQjZuJnp6QoamkoqqTqLWhp8HCrceveLmUmnyNoZ6ZhJOFgo6hn5SZkYWKhY+akZZscHWKjIKVjI2Od4+EcW2FgYqWkYKFiHGIoJaGkYmNj5aktKibjJSig4eSg31/a2pqfIKDg3VjX2VgW2hsXmxsXldLSE5SUU5MTEZJUENETkZCQ0VGQz06OTY9PDo7Ojk4Nzc2Nzs6Nj06Nzg1NDU2MzQ0NTY2NjY4NTU2MzEwLiosLCkoKS46UGFcQCwoLSsrMCwncog3MjQwT4RiM0A8dW5nWW+Cb3WGcXaShn6XlpqUnp6cp6CplpOYnmdlpJp+hJKReYCSiJGSfYqEmJKQg4CAi4yJhpCHhImFeHh+Z01SPi8uLiwvLi0vMDAwMjEyNDY3Oz9DRU5PUlRQUFFTUU5QSUVEPjs8OkRGPz48NzUyPD9SNUhISExLTU5SXmyHenF+eZiWlaKgnZadk5+SmpymnKapnaerqKm0lqu+q7bHyLfI0M++m6Bwaaupn4STkoWcoJqbmaaSkYiVo5ubeHp+lJiTopKXl4GUnnt3lZKqsoiMl598lJ2bjZGVmKOhpbWvnJCYp4eWj42AiGxzc32BfnNqYV5iYGJoZGBoZ1xSRUpLUE9JSUxGRk1DSExGRkNCR0RBOjg1PDw4OTk5NzU2NTg+NzU9ODQ3NDU3NTQ1MzY5NTg6NjE2ODYzLzAuLSosLy4tJyMqO1hiQigqLDEtKEuXXjA2M1GFZjJBQGlhXlBwdGBtfWF3jn17lI6Oip+Sl56Wm6qYnqpCRH2HiYeYjXiCjYuOjXyKho+QjoGCgImLioWShYOGiYGAh3deYlA0NjAtMi8sLjAvLi8uLjAwMTU+QUFNUVJTUVJTVVJOU0xFRUA8Pj1GR0BBQDg2NjI8OTtGSEdJSU1PUVlsg411kIacoKOvubSgqqmqpaayqa60sLCsurCyvZuyw6u6ycu4w7+3paKws6ytqqOLlpiEpaago5eBppmNoqqopYiFlKShoKuhpKiPnLGLlaOmt7qboKKvkqKcoZ2Po6GrrquytKGUpKmImYiSiZV5en6GgWliaV1mY19lZF5nZ19bT0NJSFNORkhMRkpHRkZIQUtGQ0ZGQTs4Nz08ODg6OTc0NjU4PDU0PDc2OjQ0NjQ0NzM5PDM4PDIwMjU1MS8xLi0qKi8sLSooKiYlNVhYLywwLCwwhIE4NzFQhWg1QUNbWFRMaGJXaW5YeoR2gZOFiIKbg5KRjJLayJ2Wc1aXiI+InI98hoyOiop6h4KHkY6DhIGLhYaIkoaChYmHiIeHcW5hQEU2NDwzLzExMC0sKy0wLi00P0NBTVVQUlNVVVZVTltQR0dEPD4+RkhDRUE3Ozw1Qzs9RktJRkhRTlBXgJCdgqqfraWsvMTAp7DDtaqxvrG2vLS9s8C1u7qiuMWotcnHtb24tKijtK2wsZuZkpqfiKevq6WUdp+kl6GssrSZlqquqK62u7K6rLC1orGssbW7trSutJ+mp6GmmqmvrLG4t7immrWojKSOkJKfhniChXhbY2VXZ2NiZGFhZ2BbVEpERExVUUhJSkRJR0VBQEBLREJNRzw4Njc7PDk3Ojk4NjU1NTcxMTw4ODk1NDY2NDk3Pj0zODkxLjAxMjExMzAsKiwuLCsrKyooJyopRVowMCovK2iSTzYwUodqNkFGV1FKTFtZUWJiV3l1cYGUfYSGk3WFf4CMe7+7o7yCtJSTjZuPhIiPkomJeYaAjJOMh4SBjn+BiY+Gf4aIhoqHkHp4bl1XQEVOPDY6NDVBQjc2NC8vNkNIQlFbT1FVV1VcV1BfVUlLSkE/PkdLRkVEOz5AN0Q3P0JKSkVGVlNQXo2hqqGusL2ws7zJxrS5w7yysr+1tsCzvq+2dLCzpbrEpK/GubCzsbOnpLW2qrGgopebopKlsK6mraunpJihrbS7oqiyurW8v8y/xcW9vbPBt7q3vra6t7msq7Ckr6mtvbC8usHBq5i5p5StjpeXqYh+g35tWGRiWWxma2ZYXGNZVlNJR0ZMUUdDSElBSEQ+P0JCTEBATUQ5OTY2OTo/Njo5OTY2MjQ2LzE5NTk5MzY0NjI3Oz0/NjoxLi81ODo5NjUwKigsLS0tLCwqKCgrKyhFUy8qMDBKj2s1MlCHbTY/RlJMQUxRVlNZVVp2anB+joOAjoRuenN4h2K5oZmjiZSUlpKUk42PlpGHhnuGgY2VioCEgYp6fIqHhnyKgoGLg5V9d3p1ZVBcZEdFTDtRY2FbXlNGPztIUEVaY1FSWVhaZ1lUYF9MU1BFQT9JSkhFRUFARDxFNkI+SEdKTFNaVF2SrLSyuLXFu7a6x8u5usC7trS6uba9s7mxxWB0saSxmp6qvamlqKuqo6KytaCrqJ+Vlp+ZoK6lp6aln6SUo6extKiys722wb7TycnTxsPFzMLKw8C+vb67vLe0r7i3tsO5xb3Cx6+euKmhq42kp7WIgYF0YWNjX1ljYGpnU1hgVlJVSUVFTktBPkdEPUtBPUJAPUY+O0hANzk2Mzc5PjQ4OTo1NzA0NS8yNjM4OTM3NDQyNj84QD5HS1JUU1FQT1FRUEpBOS8sLCwqKygoKy0sL1A+KC40OIB9PDJLiHE5PkNLRUBJTVBSS1FdZ2xrcI+NhY9zbHJyc4fVwLWZoI2VmJmRjpeRlpaOhod9hoOMlop+g3+CeHuLg4d7i3mBioKXfnR9emtmcHVZXlxQZWRiYGVkXVtYV1xNZG1VUm1tX25fWGdkVFlVSkRCS0tJRkhISEhCSTpEP0hLU1RVXFpbkra+tru0w7y4t8jJubW5tbe4sra0s661tZhkdaecrXBeoqycmKCim6SeqqWUn5+Qk46WmZion6agnpqZg6SeraWqsK24sL251NHP19DKzNLMz87Kxr++wsm9wbzBwMTExcq+x82yo7qwtK6aq7e7mIB8bV9iXlpfY1pkY1FbYFNQS0NBRUZFPEBGPkFIQkBDPTpFPj1KPzQ3NTM1Oz00Njg5NzcwMjIvMjQxNjk3NzU1NTVEM0VMTT41MS8wMDY6NDc3QElPSTstJioqKC0uLyxATSsvNTRtiUkwSIl0Pz5CREBDREZLT0RRW1loX2+WkpCUbmxvdHWHtKyhoZ+LmZyZjI2VkZqRhYqKfoiGjJCLiHyBg3N7ioOFe4l0goqGlX9ze3lsbXV7aHJlaWxpZ2pqaWBmaWlsWm1zlq2kvIiGZ1tvZ11aWlRIS05QSktQS1NRSUxBSkZKT19eYWZpYZe1xa+3sbm7s7DDxbSvuLCwu6uysKaqt6uMtaedmqeaTZmdjI6flpGmmKWVipOTiZCJj5GRnZuhl5qVl4efmqebrK+osKi0tNTU1NbTzNDT1c3Sz8zFwsnQvsnJysnRx8zNws/Rt6/DvMO5pLW5waKEcWVeX19aYllaZ1pRXVhPUEJCSEVCSDtBQz5BRz8/QTc7RD5ASD00NjY1NTs6Njg3NjU0LzEwMTQ2Mjc4ODc1MzY3QzVCOD8tMC0xMzQ5PTk3LC4sMTtGSz0pLCguMDAwN0s/LTQ2VIhXMESHd0M7Qj5FQkFDSk0/VVlSZVZzkJCYgmdxb3l5g6GqnqaXjJqbl4uNlZGajn2Ji4SNioqKkId8hIJwf4eBhnuHcoOSi459cXh1bHF4fnF6bXhzbWmBcG1jaW1weGl3fH7Lv8Hfp21jeG5jW2JgSlBSVU5ZXk9dXE5QTlRQVFRcbm12gnGWrbersqWvtKmru7+wqrSmpLimq66gq7SjjrCtmpeYjI+SkYSOm4GNppGciYOLhIqJhIuElJWYl5SbkZyXmZqfn6uspaiirK3P0tXSzszT1NTP1NHOx8PU0cfN0tPT18zR0cTS1sXBzsfHwqi9t86efHFoYGVfWGJTX1tQUVRRT0g+QEZBQkU8QEE+RUQ+Pz86PT08PEpBNDU0NjU8ODg4NjY0NDEyLzAzNTI2NzY4NTMzOz08RT1AMTErLzI0OT41OTAxMDIyLTJETjMpLzMuMzI9TjIzOEN9XzJBhnREOj09ST5AQ0ZIPFVRTU5adYaFindsd3B9fn+hnp6hjIyYk5OLjJKPlYV5hY+QjYqKiJCGfoJ7cn6AgId6hHWFk5CIf292cmtzfXt3e3OCeHJrgHNyaW9xenlxer7Lmn6MsoR2coR2aGFrXUNaWltWZWNYZGpTWFxdYGNdY3d6fYuBmKmjpKCeoKelqq+4qqWzoqGtoaOtoaexn4immpOSkYmQjoiBk4lqlKKMmYSBhn6Rg4OTl62LlY2VmY6GkpGel6iwoqGhpaSpyc3PyMLM0dTS1NLO083G1tLM1NjW1tjU19XJ1NrNydfX0cqsw8LLjXVxZWJhWlZaVVxRS0dKSkpAOzo7REFEPEJDPkdCPkJCOzw5PDpHQjQ2NTQ0PDU2ODc1NDMyNTAvMjU0Njc0NTU0NDw+PUU/QTYyLy0xNjs9MDgxLzI1NC8tLTtSMDE3LzUzMkZEMjg+bmI1PYF0TTk5QEk8QUQ/QTtPTEZKWHCAdX1oc3hygomAnZWdlIWLlYmOiYiNho5/eIOTmIqMh4iLiH6Cd3N7fYKHd396hpGVf4Nud3BtdX91eH10hXx5bId2dG59doR0eHudtYw7QYvFpX6MfGllV0lDZmNlY2dqY213W15maGtuaG6AgoeRi5ydoJyQl5ieo6OlsaOksp+hpZ2gqKCjsZyFnpKRkY+KjIqGg4+Ef5ybjI2ChIV5lH+CqZWjjJGJl5KLfpiLm5Krs5ibnKicp77Dxrm2xs7S0dLQzNLLyNTO0NXa19fY1NnYzdjbzsnZ2tHVvsrLtXp5cGdfXFRXUl1XRkdKSUVFPTo3OkBAQjpGRD9EQ0FEQjs/Ozs3REM3NTY1NTswNjc5NDQzMzQxMDE0NTU4NzQ0NDQ5QD5EQkM8MzMuNkZUV09RSkFKRj8xKiguQlMzOTI1NC83Szc1PGBiQTxzdlY4N0FIOj9DPjw5UUVDSlRrbm5wYnBxdIaNfJeRnYt+h5KDiYaEiYGHfHiFl5aIjoOHhYd6hHhxenuDhXV5hY6NnHmLcHxvb3p/cXuAcYOHgW6OenV3fXyCdH58hoevc1ipwraNkYJwbWI9XmhycHFwbnh2gWVob3J1eHF6i4aNk5GalZ+Vh4uTm6CanameoayboZqYnqWen6uZi5qLkJGNhHyHh4OFi46fmZOIhId+bJl6hJiGiJOMjZSMhnyciZSQrqqUlpifmaevtr2prb7HzMnJzMvQycPSytTX2dfY19Xb19PZ29XQ2trR1sjUy5Z8fWtqXVxRVVRhSUNGSUg+QT49Nzo9Pzs9Rz0/QUFBREE+Pjo4N0RCNzU1NDc5LjU1NjQzNTUzMjMyMzY0NzU1MzQ1OEVCRENFQjU2PEZOU01bbmZjbnNrYVY+LDRMRzg2NTQzNEJGND1XX2hMdXheODs/Rjw8Qjw5OUQ+Q0dSal5tZGJma3aAiHGRkJqAeoCNfoKCgYN+g3t8hJiNh4t+hYaAd4J5bnt7hoF0eZKejqB2jnWCc3WBfXOAhG+BkIJvkoR1fIGFenaGe4m3xaTBybiBlpuPd3BlTmZjgXqBd4aikIp4eXZ7g397hHZtk5aUlI6XkIOJj5aZlpWlnJeflZ6TkZeinZmrlZCQioyRgoyEiIiBhY+RnZuZiYaMgYWYeoiJn5eQiI2Ki4J9oYmRjLyhmJOYmZ2ppqaun6i2v8DBucfKzs7FzcnR1tXV2dXX29TX2drb19va2djO28aIfXxpa2dhVllXV05MRU5DOz09PDg6Oz05PUA2PT9APD89PDk4NjdDQTY0NTU9ODA2NjU1NDc3NDU2MTM4NTQ1NjQ1NTdISD1ESkU3OTI1O0g+Ozo6N0lQXVtTVVhLOVQ+Ozk1MzI3STg9TllNSHh4ZDU9PkM9PUA6Njo+PkBFUV9YZWFdW2h0enlsio2Sd3Z6int+gH5/fIR6foKRiYSFeoSHe3V9dG18fYZ+c36SnpGeg5F7hn54j354iopugpqAdJmGfoGJhHt+kHqPqY6Pw6G9i5yknX2JhH2JcouKfnOmmpyYk4V7jpCIhGhHcaCknYyLkJKFiIqQkpONnJmSk5CWjYuVn5yUoJSRjY2Pi36Pjo2Kg4iSlpqenoiMlZKdkYGLf6WZiISNgoWEgaWGioy4mJ2RlZaiqKGenp2kr7e6tazAxsrQyMfMz9PT0tjT1dfA19jZ29ja2tnZ19u4e3x6bmtoWWJdVFBPSURMQjw8Pjk5Ojo5OTs9Nj8+Pjw9OTo7OzM3REA4Mzc4PjcwNjg4MzU3PDM3ODA0OTc2NzU1NTQ2RlA1RE5JODkzOEFLPTszQ0BJPDpEV048TVRITj85NjMzMz5DO1tYPjVZeXBaPDxBPD0+ODY4OT89Q1FTUlheVVhmbW1taYGOinFyeYp7en98f3uHenx7i4aCfXSDhXlzenNtgH6EfneFm6KbnZSSf4yIf5iHgJuSboiohXqhi3yRjYOIhJx9mpCKjKOioJCkr5+LkIuFi4GThldyrYufq5uPg5ibj4+OXIKikYKMn5OUjIaIi5KSi5OTk46Lj4qHlpqcj5SWkIqRk4aAi4iRjIqJnJaYoqKGk52WoIqJiI2bkIOIjn+Dh4akhYyRs5idkpSXoaGempKcnqiyuK2mvcLHzcjGz83QzM/X0dHVrtbV2NrY2trX1dnZoHKAd2poX19aVVlZQ0FJQz8+Pjo0OTo7Nzo7OjM7Oz89Pjc7OToxOkc9OjM3PUA1MDY3NzI1NT82NTs1NTg1ODo1NzczNUhSN0dPSzk5ND1FSkI+MUZDTEI6ODpHWEA1SFdJNjYyMjM6RUNlWD8mX3lpX3o+Pjk8Ozk4OjtAO0JRS0tTWVBUY2J6bWF+koNvbXeLeHl/eoF8hnx7d4aEf3NwhYJ6dXd2dISChH5/kqakn6Wil4qdkJSXi4qol3OKso2EqJKEmZOFmYyilZ+YkoibnqOSqbCfkJSQjY6IloxujbeFmsTIspuhpZucmJaQspFkpM3IlY6Gh4iPkoyMkpOJhYqJhZaZmo+PlJOGlJeDf4+LmYeNkKqXlqKiiJmelpqIjoaXl4mEjoyBf4ePpIiOk6ial5OXmaGZn5mTnZujs7Smo7zBvsfFxcnIycLL083N1KnS0dbW1tja1NLazoV1g2tmYGBfUUtWXEJCR0M7QT04Mzc7PDo4PTY0OTo8OjgyPzk5MjpJOj42N0JDMzI6OTYyNjQ+PTQ7PjY5NDk7NTc5NDRKUTxKUUs5QTdCR0lANjRKRUxGPjw4OEVUQTc+XDg2MjE0OjtFYFhBRmF0aExjWj41Ozo6NTs6PTpFTUZIUldTUkJlg0d1go58fG1+iHh6fnqBgYJ+dnaAgntsbot+eXx3eHyEhot+i6O0qKSrs6GWp6ClpJaVr6KDkLiVkrOajaGgjKSbr6KknZiQp5epma2wpJeUlZSQi5ialqDAjqPJuKuaoqWtmZGbnLKdhoWoopyYhYiIjZSLi5OPh4CGh4iSmJSMipOThpSYhoSRkJxzkJiylZajoYicmZOPipCKlpqJipaNhn2MmJ+KkJCcmpmTmZiglKGdlZ+bobGto6S3vrPFx8S9w8O/xs7KydKnz8zT0dDW2NLP2Lx1fXlgYldiWFJJS09FQkNENT47NzY6Pzs8Nz00MjY2OTc3ND01OzU8TDw+OzxCQTc1PDs0Mjc3P0A2Pz83ODQ5ODc7PDU1T01EUFJMOEA9RUFHQTU6SUVORUQ6NkFAQlM+OURPMzIzNTc1PXZcPFJcdGlaTV1TPD04OTU2Nz06SkZER01cXFlKaGE7SISLenpthYZ5fIR4gIWBfXB4fH18b3ONen2Be3iGi4mGhJKovK2ps72wpa6zs6mjorCtipq1naO5pZWtpJeprbempKOfmamYqqSvsaqamZyUlZGYoJeau7utyqFptreqsJWYnqKrkpe9pF6qsoKJiYyUhpB8jo59g4aOj5SUiIeSlouPlY2LjJeYkZuZtJaVqp2LnJSSjZCSi5iaipKdj4uKlp+ijZWNl5mdk5yYnpShoJScnaauqKKks7irwsjEtrq9vMXIyMLQocbJzc3E19bQytOjc31sX1xVYVNRSEQ+PENBQTg/ODc0PkY8PDY8MzUzNTU0NTRCMzk6Qk06QTtBSEI7OkA8NzQ2PEI5P0BCODc0Ojo2Pjw0N1RLQ1VRSjc8OklBREA0QUpITkJBPzZEQTxKTkQvVD0yNTQ6RUpcWEpaUW1ncHBEaWBLSTY3NTc6PkpAQ0lQZkhhYGJwSkCLiX+AcoaHfIGJdYKKg35tfXx8fnB3h3eNgYd7jZCMhoyaq8LAsL3GvLO0wby0rKuztoyosq2tvaubu6Oorbm4q6amoqKko6qvsrGqnZykmJuYmJ6ipqWTo7mvqL+8rK2yuaWjp32IhpytvbCCi4uKkIOPg5GOeoGHkI2OnIiIj5eNipSXlJCalpunmrGakaudjpqPko6VkI+Vlo6QoJCIlZykrJSWj5ScnpSgnZuYn6CVm5+op6SipLCzpsDGw7Cwu7bFxcO/zafHw8fDvNXQzMTKinZ1ZF9dYl1PTENMQEVHPkE/Qjw6ND5BPT01PTY+MzMzMjQxQTE3QEJOPkdAQ05DQT1DPTs4NkNCNUJJQjo4Nzg7NUI+NzlWS0RXT0Y4PTRLQEM+NEVKSE4+QUE2QkI/QlNFNThQMTQ1Ozw4O0Q+OUxqal07V1JkS2daVU83OUdFP0NGXGhGX2lnW11ck4yMiHuHi4aDjHWGkIqBbn57gX5xfoF6lHqSlJSYkZOVqLTHycDCzMLDuce8uq+rubuXsra6ssCvpcCjq7C8vKquq6Ojnqesr7WxqZugqpyinJafsLSnjKO6urXBu6uonLKkpKiUhI6pxMSkgouOh4iEhpWUjHqDjJGOkaGMjJSRjoeXoJiTmZWWpaCunYyqnI6Wj5KRlZWNkJSRjqGThpefoLKflJuUoKGZpJ+aoJuglJmfp6Smp6SvraW/w8KuqLe1ycO+ts6yxL7Du7PRycfBtXd7b15bX21UTklETUtLSkBBPUJEPDVBRDs6Mz04QjMzMjI2M0ExNUlFTT5JQEhSQEg+Q0A7Pj1GQTVBVUA7OTk4PDdFPjg+VkpDV09HOD80TEBCOzVKS0NMP0I/PEJGPUFITDkrRzwzNjc0NjRBPzdPYU9hRS89PjZrbGpgQDpIPj9FQmdcTWVcZlRjapqNloqLiJKPhol5hpOQgXKAe4x/d4eCgY95jaGWqJqamLu+ycjKwtLJysLNvcGzrby/p7q/vbzEuK3BqayzvL2qsKqkpaOsrrSutrWgn66fpqKZo7S9qZyovMGjtravq5OwrKqsloaaqqelkYKMkqSViYB1iZF5hY2RkJ6fko+Ui4+Lk6OZl5uUk6GeqZ+RpZqMj4+QlZaIfI6VkpGimpWgopy1ppCgl6Wko6WfnqaYnpWXnKWjqKiisq2ou8DEr6Wzt8zAuq7Ds7u9wbmtwsLCv5lwe2NbWV9eTE1OS0dEQ0hCQUFESzo0REg6OzQ8N0YuMTIzNTJBMjZTSE48SkJKUUVLQ0RFOkVMQjw3RVY9Oz04OT88ST86RVVJQVdRRjdBOks6Qjc5Sk1CSUBDPjxERzxCQ089MjBIMzY2MTcwPUI6PWpqSks1UVMzU3BwZE47RD1ARj5sSV9YYVpkZViej52Ol46ekomKf4ifkoR4hX+Ufn+QiImQgJahmq6no5jDvsnEyMbTzc7Ny7zCt7C6vbS9y7vDwba3vK20wLm8rq+ooamotq6uqbK3mp6soqiinau3t6qlr77Esb25s6eqtLOtrZaVpa2ooJGOkrHFp5WNfZGVfYeRmI+qmZeTk4+TlJKlnZOdmZOgoaGcmJ+Yi4yPkJ6IWo+Wl5KWpJlmmaOes6WWopasraynnJ+ml5iWmJWho6imn7Wrqbq7w7SmtLXLwbiqtqyzu7iuqLi6vLeEb3BcWlZXUEdMVE5LP0FIRERIRkY4NUZNOz43PkFLLjMyMDI1QjU1UFdOPExGS1JMT0dHST5JUT86OElTOzs/Nzk+RExCQEhTS0BXUEY6QT9HNkE3O0hNQ0U7Qz00RkU6QkFCRzkvOkEzNjAzPkdEOTQ9dGRNRztFKzpmfGhWPD5AQkZCc0ZpSVJmZE1GppSclqGXqJaMkIOHpZKIgYeCm4ODlZCQlI6aop+vvq6hx77GxcjHzs7P0sq+u7axu7u8v8+1xL23ubezsrazuLOsp5yrrLmrqaivr5ejrqWopKW1wbCrrbS+wrnAubOnuLS3sq+VpK2wr6WLk5SgjXPBmX2XmYSOlpqLsZWamZWSkpmYpaOVn5qVmaicm6GgmYqMj5adYEqWnJqUmaSXVJawn6+cn6WVr6+tppuhppSTmZiOnZ+moZm0qaqzvLy7q7Cyx8C4pqyrrbGxo6GysrSlc3FnXlxQUk1GUVFQUTtIS0hGR0FDPTlLVD9BOj1FTS83NTM0OkI0NE5XTjxKS09VTlFKUEhISk9CPD5NUjs+PTg6PENSPkRIUklCV05JQENBRjM+NThKS0NBPUM7NUVBOkE/PkhANSpCNTIsPmNdZzozNXRkZUBSNyYjM31oWDw6QkNAPVJFV1N0YlZGSKuXmZ+hqK6YkJeHiqeWjYiShZ+HhJ2Xjp6gmqOktcm0qce8w8TJy8nIzM7Gvrqzr7q4wMHNtci6wbm1urKvr7O0p6Scq7S1q6qnrayZpK6mpamsur+oq7e3vsHAvreyssOwt72so660rbqmiJuXpZp1vp+EmJ2Okpiai66WoZybl5SanqCpnqegmJmpmaGnnZeQjZGdg211k6KalZyin5CusqKrlamqmKqvpqWhpaqSkpmciZWcop6WsKepqrq3vrOyrr65tqCjp6ilppycrampjWZoY2BTTU1HSU9KVUw9TEVNSUpAQ0Q8UVU8QUFCRE8xOD03Nz9CNzVVWE4/SE5RWFJQUVRKUUpKRUFFTVE/Pz04PTtHUjxFRFFCR1lNS0FIREU6OjM5S0lCPkNDOjlDPjxAPjs7RzctMj4tMYJoTnpcLzBraGA8PUJCODZ6Zlc8Oj0uLlNhTVZIfmVeSEaslJyhn7uumJSei5Oqm5GRk4iqjYeinoyjrJSjpLbHvbTCu8PCyMnFws7Iwr25sq+5tcDDyrbGssG8tbusqa2ssKOjmaq1u6aqp6yqnaivqKSrq768qK28tLe+xry2tbjAsL2/s6m1t6y/pY+il5Chn7yeiZqgmZednY+3nqicpaOam6Cap6WyoZqdpZynqZ2YlI+Um4uWiYykoZScop+gtbClppSxq5qrrZ+fpaSqkpaVoISQnp+clqmloaG0tLq2rai1srKenKOlmpeVmaqhnnhjX2FfTElGSE5RSU5FRkZCUUpIQERHQVZTREg8QUdRMTtCNzpCRjc5XVlLQUxQVFVTTVdSTlVKREBKSk5POUM/NT08TlFDPz9QP0VaTUpBS0RHQDUzPUlHPz1FQTk3QTs8QDw8M0A8Lyc7KkiRQjpTSjAsW29XNzE8Kh1CgGRUNDktMTpoXUZEQ5xwYkdFqJeknp/DrJuXpJeZqJuVmpqOqpaVqKaVrayZoqu3xcK8v7fBwsDIxL/Nxru+ubKwubS+w8i1wLC8trq3p6Srq62hoZurq8Sipaispp6rr6yiqqi+uKatvrC3t8a3tLi4vrG+wLa0srWwvqOWo5WTmpOtn5ChoaSio56QvqSonairnJygm6afvaKYpJ6iqaugnZWNlZ6TnoeOhI2TnqSgnbaspp2Xs6easKignKufoo2alZ+EjqGanJKlpJqYq7G1saqlqq2snJigoJKPkJapn5RpZVxiXlBKSEtPTEhFRElAPU9IQDtGSUhbUlBLPUhOVTRCRjg+SEc1Q2JbS0NOUlVXVlFYVFJVSEA4UVFQTTpHQDRDSFFTSUM7Qz5HVktDQE8+SzwwNjtHRj47RkE1Nj85Oj85OzE1RDAtLTBNdlw0S1o1LE1uVzwtPSkeI3piUTVDS1E5b1JGPEt4ZmNYTqKbo5uexaugnqudnK2fkaKelqSfpqqrl7axo6mztsXCvcC2wMK8ycK/ysi2uLW0sbS0t8LGt7+xubW6tqCnrKusnp+gpaTBpaGqraCkqa2woqeovbWlsbu3trXDsrK3ur6yw8C4uK20tbWjnaSUkZOgrZ+YoZ2oqKqimsKsqJ2rrZqanZimoL2hnaSYq6uspqGZjZqfkp6Ijlh/lp+moaC5qqeUmbejn7OioZywmKGPmpWego+gl5eOoqOVkKWus6upoqKlpJWVnJiLj5KTpJ+JY2dcZWFNSktLT0ZFQUdLPj1JQTk5SkpOXVFRST1MVl05Rkk9RE1JOEhjXEtDTFBTWVlWV09aXklBPVdRSUs/SEA1SE1YU0hBOkBBRFBIPz5RPks3MDk5RkU7OEc/LjY+Nzg+NzcvMT85MSUxUVVtW0pPMTA9Z1dEMTc9LSt3YVM2U1prV3NIRTY9dWVcTFCeoKCYnsOnpKKzoJyyp5Kqo5+jnq2prJ27samstbHIw8HDs8LDvsfEvcTKvbCxtq6xtbDAxbW6sbG6tq2aqbCpqpufpqGnwq2crbGcqqKusaqkqL23pra7va+3w62zs8K/ssazurertbauqqKmlZWUoquhn5+Zp6uvr6+7saWfqamZmJeToqS4oKGjkq6vq6SlnpGhnpSdjpCNlJ2ao5+otaenjZm1nKOvm6CcsJGhlZiVm4CSopaQjp+gk4umrLClp6KdoJ6SkpqThYuSjZyfgGRoXWhmS0pMS1NBQ0BJRzs7Rj44OU5NVV9SU0o+T15ePUhQQk1MSThOZF1MRUxSVFlbU1VPXGJIQT9aUUFIQUtCN0ZFTEtOPjtCSEROQj07TkBBMy85N0NCOTdGOys2PDQ2PDM1LS80QDErJ1Z0U2VPPzEwNGJbTTIzPjA8d11eP1tVX2dyQDg8SJZ3ZUE0n6SemqDCp6OpsaCjtKmVsaumoqSyrK2pu7KtsLW0xr/ExLa/xL7KxbbAycK1rLWpsLmswMS0uK+ttrqlmauyrKqYoaeYrbu0nKiwm62frrWyp6q7s6e5s7iyuMCqt7LDvbTFp76urbe1qaesoZaWkaWkoaGXl6Sut62xtLafnqikmZOUk6Ogt6OkpZWusbGlqaWhnpuZmpWYqKCfmaKer7Oipo2Yr5qlrJibn6eTnpCVmZqGl6CVjZCdnpSLqamqoqehmp6WjY+ZkIKGlYmVn3plal1sa05RTk5UPUNBTkM7Okk/NzdRTl1fUlZRQldgXUJKU0hWS0g6VGRdTkZPTltXW1JQUVhdR0FCW1BCRz5OQzlIR0hOUD8/Q0lCTEI8MklBOTQxNzdCPjs3RTcrNjkxNDgwMi0vLjw2LSNCcWdzazIzLzFcY1ozMzkwNnBbYkgwNUpxalZDV0aMeWZDO6SknKClv6aorq6gqbWqnbevq6OqtLawsLi3sLe4t8S9w8e9vMPCx8G6wcbBuqq2pa27rcHDuLiqrbK8o5Wtsa2yl6aokaq5qqGnsJ2roK+0s6qqt7Wsu6yzsrm3rLiwwbq9v6bDqrC2rqmrq6admJiqoaGgkZegsK+zq7C4mZupn5mWkpemoLeppaKir7Gzq7Gnq6CcoJ+bnqWdoZido7SwnJ+RlKaaoamclqSimJqMlpmUlpeelImSm5mUjqmpp6CjnJmbk4ePmYt+jZeGj5tsaW1ibm5YUVFaVEFDRFVAOztIQDc6WFBkXlFXV0VZX15OTFNPX0xKPlpkXk5JUU5bVVlQS1NXWkk/RFhQREY+Tj89SUdHUVBCPUNGQk0/OjJEPzc3NTQ3Pz05NUU0Kzc1LzI1MS4tLiwxPionKz1ccD0+MS4xZVtkQDE3NDdnWWFGKEA4bX1oXFY6iXtjQz2on5yhqbygqq+qo7G3qaW0squhrbW9r7O4vLu9t7bAwr/JxLnEw8DAucW9wbivtqirt7K8v7+0qq+yuJ+XrK2orpipqY6nu5+lrbOeq6KxsLOsqraztbytsLG1rLC1ssC6xbarvK+xt6ytqqOxpZ6lqJ6jlo+Yn7Kqs6mqspmdp5ualIygpqS0rqehrKytsaezq7Gpo5ueqKSelaGanKi2qZiakpKfmZ+hoJKtoZuaiJeZjJ2anpSLj5eXmpenpaOgnpeWlpSAkJWEe4+ThI2XZ21yaHFzYEdZZlZEQ01YRFo5SEI1Pl1RaFxPWl1HW15eT01TWGRKS0NcY2BQTE1OWFdYUEpWVldMPUVVSkVEQU0/QUZISFFQQTtGREZLPTg3Qj02ODcxOT48NjVEMCs4MC8wNS8qLC8tKj0sKyUyKyo1SzEuJ19fYVYxNTE9YFZfOClDM1lVXGdLNYx6ZkxApZmfpKu2o6yopa6ttamvs7mmp7C3xrext7/Cwra1usW+zMW5w8G6wLrFuMG6s7Ssqrq4u7q+tauvsbeZmKirq6ycrquPq76eq6+xo6qfsa2zrq61sbm3qq2usae1sLO6vMmyqrW1sbSwrqags6CaqKygpZWWmpmxoq2gpa+WoaSamZKNoqWnsqmhprGsqrWlrrC0r6OZna2nm5eem5qsuKKYk5GPmJyhmZiVrqGfl4OWm46enJqXkYuUk56ZpaOjoZmXk5KWe4yRhXuNi4OMk2xueW92fWJGYGpaSUhaWz17SkdFNkFiVWlbTVxhS1xcWlJTU2JhTEtFYGFgUE1JUFdWVU9HV1ZVTjpJVklIP0NLP0VESEhRTkE/SEhIRTw3PT46NzU2MDk/ODY2QiwtOCwvMDQsKCwvLSo3NikoOS4kOks1LiJUYFZhLjUoQ15RXC4rQS9KR1BbRzNjWVRMRZqWn7CosamspKOurbWot7O3o6y0t8m7tbu7wL61tLfDwMzHu8S9t7+/wbjAvbK9rqi6ubi3wresrrK6lpenr6yopLKplK+7pKyysqano7K0sbKxtbC3s6muq7KmuK+1s8TFtqm1tauwrqmnoraen6awoKOUm5mUsJ6nm5+pjaminpuVl6WlpLenorCzq6ewp62vtKykmaGsqJycnZ2VqrmclY+PjJido5iRmKikoZmGlZiRnZyYl5aIl4+Xm6idpaGSlpKQlneEkYZ8hoKEjY1ucXh2fIBdTGVsXEpPZF0/YntHSThHZ1dmW01eYk1ZWVdVWFVpXU9QSGFeX1BKSFFWVVJLSFdVVk04TVpORUBGSz9IQkNLU00/P0xPSEA7Oj47NjswNDE8PTQ1OD8pMDcpMS4yKSksLC0rLTkkMDQyJTlCNy4jQU5IZzI3J0ZhTFYlLUIuPUVMUTwzcmtMRUSRmaStpKytqqajsLKyqrewtZ+rtbnJua7BvMO4s7K1wsPPxMDCvrW+wMC7v720xKmqubG2t8C8r6y0tJ6hp7GupaaxpZ6yta2qsrGrqKi1uqy1srWrtK2qq6isqbmtsrDHv7ilubCpra2mp62wpaSjrqOonJ2bmq+ZoqKio5Csn6Ogn6GppqW4pKu0tKSqq6msrrauop2jqKucoJmbk6S1mo+JjoiRo6GWj5afo5eWh5GWlJ6bmZaVh5iSlZmnnKCgjZOSjpF4fo+FfX19h4qKcnRzf35+XVNjbl5OWmddRkSWW0c6Tm1YYltOYWJOVlZWV1VZaF5RU01jWltUS0dPVFNOR0lWU1xOO1BeSkJESEpBRT8/S1NPPjpOTUM8PD45OjU9KzMyPTYyNDk6KDQ1KS8sMSgpKywtKiY1Ki8mMCkzODoxJiozRGQ7NipIZEhKKzpJPzNDSVMsPo9sQEhJkJqoqaGpsKSno7O0sLS0sLCgq629zLuuwr3HsrSutMHD0cTGv8GyvsLDvL+4vcWorbestLi8wLGssq6ho6euqqilsaOqsKquq7Gurqyrs7unt7CyqbKqq6alo626rauwwrm0rLmpqaitqaexpamkoq6pqKKenKKslaWdmJ6ZrJ6ip6ihrKajray2sLGgqaOgqq2wrJ2ep6epmqOYmZCgqJiGhI+Li5+gkIyOl56SkoiJkpahnZaZloaXk5SXpZyenYySkI6Kf3+IhHx3gIeFh3V0col3bF9ZYG5jUXNxXEs7hHxGPld1WGBZT2NcTlVWVVdRXGJfU09PaFlXVktHTE5SSEVJVlJdYzxQXUQ8RkhIQkc/PUpQTDo+T0o9OT89Mzk3OyozNT4xMDQ4NSg1LyosLjMwOyksLCclMjM0JCwyLTg2MCkoMTxeSzAuSmdERjg8QjA1RUtYMUCUXUBORpWWrKegqbGcp6iwtay4ta2qpKqqvcm8sb+5w6+wrbPDxM7Ow7/AtMDDxLrBtMnErK+3rrO6wL60rq6spqiqsammqbKmtK2qr62tsa6yrbS7pbezrKyuqKugo56wt6yqrbm2pLW1pKqnrKyqraCopqexsaSnpaGhq5aqoZOboKaepKOqo6yinqaxtqysoqWjmqmrrqmdoaWkpJmgmZaPmJ2TgYKQiYWdoI2LkI2ckZONhY6ZpZuTkZuMk5KSlKOanJqLj4uMfIaCgoF6dYGEgX51d4uih3hqXmBuZldmh2ROQGeSTEVieldiWFJmVU1WVlVUT1xdYVZMT2pXVlZJSkhJT0JHSVNRWW9BTVhAOkpHRkVHPj5FUUg4Q0tFODdDNzI7OjoqNDk/Li80NjMpNCsqLCsuIzQuLSsmKCs3OSomNis8LTIsJjA2WFouMEpnQUE8PEMrOkpPXjREh0JJSUSWkK6koaqvmKmorbWqtbGqpauqqbzAwLm6tLy1prOvw8nL0b/Bu7m/v8O6wrrBxK6xtbK0vMG+s7Gvraysp7eqpa2wq7iuqLCvrrGrtaq2tae0t6uspKqqnKSes7OpqKSztJ+1raGqqKuoq6efq6uoubapqqqpoqmfrZuRqqGdoKSjpqKqnpymtK6npamipJilpqeqnKKko6CZmJ+Rjo+ZjX+HjIeEnp6JhoyMkJCTj4WIlqOajo2bkZKQj5KfmJmXjYuEgHSHgn9+eHWDgHp4fn+InY9wcWZncXhcYXSIak9dmFZIbXlVZFZTY1BNVVVVUU9YW2JWSVFqVFZUR1BZVUk+SUhPUVB4TU5WPTxLRD9AQTxAQ1VDOUFLPTU7RTIzOzk3KjQ6PSstMzQxKjgqKisqLCkqKC8qJiklMzssJDIpMjAyMSUvMlJjMDJAZj1OWD9DLD9MVF8vSWs3UkY7lY2voKWqrJmqo62usrSvqqSvqai7v7zBsrC5raK2r8jHyNHAv726vMO+u8TCwL+vsrOztr28wbGytKu0qaW2qaWts7K4r6KttLGvsbmrua6qrrerqp6qq6CjobWtqaGfrrKhtKqeqKero6qhoaytqL2uq66toaeon6yZj7ChmKKgqKaep5uZqbCpop+soqGSoqKjp5maqaaYmJmdj4uHlYh9joaEhaSWhoOEjYiRkJKGh5ahl4mRnpGTkI2RnJWYj4uGhnh0gYB9dHh6gHt0dHtqgoikdmleZWuBdWeIi3xSVnBfS3hzVGRTUV9NTVNaZk5NV1llWUdTalJRPkJOUWFROklITFNJcVFMUzs8ST87PD07QEBXPDw+SDczQ0IxNTo5My01OjopLTMxLS02KSgrLSw1MiMyKScsJS47LiYxLjAtMTQlLDBNaDozOF89YWQ/RjFDUFtbK0hQO1lDM4+OsKCkpaqjpKOsprSzsaiksKequL/BvbGpuqqnrbDJxsjQw77Avbm/wL3JvMK4sbC1srq8ucCztbysuayjtaenrLG2uLKlp7m1rbS8r7ylra22q62cqa+kn6SsqqicnaqypLOomqqnqqSpnaKpp6m9q7Swrp2ppKCvnJqzopalm6Wkn6WamqiqpZ6aqaGbkZugpJ6Zl6mqkZmakpCLgo+FfpCDgIifj4eBf42Jk5CRhoOVm5SGk6KOlJGLkZuTloeKf4Byenl+fGh2fHt1cXF+aoZ6hYhkX2djcoV7bWd5XV5WQld7bVRhUFJZS0xOcHRdSVpbaFlGVmdPQz5LTkRDQTlIR0tTP2phSVE4PUg8PDw+Ojw/VDY6P0M0NUg+Mjs1OTAyNzw1KC41Ly0xMSYvPktJMSUaOTAlLCwwOS8sLCs2JzE3Iy0vR2pJMTRYPWZiQUo3R1NgVSo9PEZcQCqOkrCZn5+ppKKhq6S2srGkqbCmrbnCvbewpLmsqaiwwsjJzMK3vb+1uMG6yLbDtbSztbK9ubq9tq65tr+sorSmqquutbe0qZy5u6ixvrK6oK60tqmrn62xo5ylqKmjnZuksKavoZ+qqaeiqpyjqKCtvKeusa6hqqKkrp6erKaYn5qhopufm5mjqqKamaOjlZaUn6GWnJamrIyfko+RjIKKgICPgXualYyJfYCNiJKQjYuHk5iRh5SkipKRh5CZkJSBiH16bH12eXhienpycHFzeGqCdWuCZ2NnYW5zjm1iam9fcEFdeWtWXk5RUUtJTVNZVk1cXmxXRVhhT15QSE1ERjs3SEVLTzxyaEpLOUFFOzs9PTs7PUo0OUI8MztHPDQ/MTgtNzg7MigwOS8sNS4uPS0qTD4qHTQ5JicuMzQuMCsvNCYsOiQ0MEFoWjEzUz1lX0RMNktWZE4pPTNSXT4jkZarmJ+Xp6Khn6ikt6+toq+vqKy4w7q0rqC5r6uns7rHyse/uMK9r7S/t8S2w7KwurGywLa7vbequbi+qqS1p6iqr624r6iYuLykrb60tKGtuLWnpqiws6CepaWnoaWZnqynqJ6gqq+noKaXoqifsLifo7GvoauhrKScp6aompubn6KVnJyanammlpueqJGYkpmdk5mWoaqRm4qOkId9h36Cjnx8oY2MiXqEjYaMjo2GipOaj4mVoImQlYKMl42RfIV8dHB8cXN0YHh4am9xcXBrf3NkemxoZWNhZoeAYFtyanJNToBpWFpNUUxLSFBSUEdNW19vVEVZWlJnT0hLRUY1NkhCTEk1WmVKQDZFQjk6Pj0+OjpDNTk+OjNARjwyQDIzLzo7ODMmMjwwLDg1QiopLUMqLDQ7Tk5AOzczLS4rLTcqKjwlNTM9ZmQyNE0/ZV1GTz1SWmdIKj8wXVs1KJWbpZiclayfnqGkobersKO0s6mpusW3s66huK2tq6+1xcfAt7/CubC1vbe/u76wrL6ws7+yvMK4qru6uKeotainq6+rsq+kmLu2pKu6ta+esbmvqaWnr7KcoaSgpKOglpuvpqGfoqivoaCik6Okorawoaaxq5+so66YnaqlqJ+Ymp2jk5qbmp2lqpqbm6WVlJeVnI6Tl6KpopGKi5CGeoR+hIt6j5eKjYd6goiFio2PhpCTmIyOlpmLj5Z+hpeMj3qBe3Bydm5vc194d2VsbGxqaoVuZnJpa2VoXWRzgWBba3ZpWkp/XlxYT09LSEhSVUczOV1ebFBFWVVZZU1JSUVFMDdGP0tCNklKSDs2Rjk0OT49PDk4QDg7ODo3QEk+ODw0LTM8PDc1KDU+MSw7QTEoKzY8IjhSPSoxMTM+RDUsLSc0Mio7KzEzOWNtNzRHQWZbSFREVF1oRC48MmRXLDKUoaGXlJuqnKOhoqG3qq2gu7elrL3FtLGvo7WvrKyutMPDvLO/urexs7m4uri6r67As7O4r7/At629urWlorKpp6mxqq2xn5m/taSntLWonrK8qailqa+smaKnnKSllJegsqSZnqOoqZyin5KkoKS4qaSnrqaepaGok6CpoqGhmZudn5GZm5afoaqbmpiglJGUl5qNlJOkqKSQiYqPhnqEe4SGfZ2NiouHeoGFiImKkoaXkpKLkJWUjo2Ue4OYj4t3fnxsdHJsbHNhd3VoaGpnZ3CHaGhpZGZpaWBqY2poW2Z7Y2BTdFRcW1JMSkZJT1NAISpoXmlMRFdVXmBLSUhFQy46QjxGPDZLUEQ4OkQzNTc9PTg5NT86OzQ+OEBLPT45Myk4Pjw6OSo2QDMuRTQoKyw/MC1OPy4rLTcsMTE5NSwmLjUtODA1NzZgdEEzQ0RnW0tXR1VgaEIzNzlnUCcynqKkkY6kppqdnp2jtK2nqrq2p6zEwbixrKO2rqetrrfAv7yywrewrrK2trm2tq2qvbOusrG8v7euu7uxpZ+2qqWls6eprZ2cwKunpa+zqqy1u56pqquxpZieqp2mpJGYpayimJ6kqaGcoZuWn52ntaawqq6hoZ2eoZWgpp+hoJqbmZuSmJ2TpZ2soZeWnZSTjZWXi4+Ym6mfkomKi4l5hXeBgoGdh4uCin2AhYiHhpGEl5SQjo+RkZGMk3uDlY+Gc35+ZnlvamprZnRza2NnZGR2gWJlZmZmamlja3JbX1lebWRhTmlYWmBWSkdIS01SWD45X2xoSENVVF1bSUlHRUEuPD85QTg5UkZANzpCMDM3PTc2OTI6PDk3OjlETT1CPDAqPEA7QT0tNUIzNz0rKiwwQipKSy4vKiszNzIyKDU3JCs3LjcyNjg1XXlOMj5IaVpMWUpWYmZAOjNCaEglNZqjoI+MraGXl6CWpLOxorK9tqGxxry6srGjt6yqram4vLu6rcCyrq6utq+zuLOpq7mxr66ztrq2r7i9rKaetaqfoK+jqa6bob+gsKOusa+3rrWera+traKZnaeppZ+Vmqeln5mkoqidmp+ak5yerK+muqiuoqGam56ZnqSapJ2XnpiblJifkqiVqqeak5qakoyVmY6UlJqppo6OioqPe4JzgYGKmIWHfImKhoaKjImShZWbk5KPkJGXjpB/gI2Og2+Bf2Z5bWdraWZxcmtcaGNjdIFiZmdqbmxnampobl1sbHNwYFRjaWNmWUlGTE1PWFJRVWFlgFVBV1NZVEdJRkVALzw9Nz82PEZOYTg6PzI0OUAzNzgyOD83PTg+RkpARDkyLT1BPUE9MDVAOUAxLSsuMzw7SzYvLissLTI0OzYjMyopNi41NTQ2NVp8XTE5S2pbTVtLWGRkQEExSmZDJjSRoZuNj7CdmZOhmqmxr5+5v7WgtMK7vrqxprevp62kt7i3t627rq2qq7eqs7euprK1sq6psLa2sLO1uqapn7WonJ2ooKismqe9mKykrq+2taytn7GtsKmim5yjq6iclJyno52aqaKklpqfm5CbpKqrqryfp6SgmJqZnaGPa6KWmZxwgpWao391kamnnpSUnpCImJqAloqhkHmHlI2DbWl/d4NxbIaLhn2FjIdxXmNhZ4SYhmuLjpSSdHeLhH6DkIBnh4BndWhlV1xoc21OUGpjZ3OFaF9lZm5tal1gYYqPg4RlTktEOUdUaF5KR1BQVVVMSFJgb3RlRltRVVBGSEVDPjE7PTY9NjwzZlw1Ojw3NTtENDg2MDpCNz86PkZMQ0IzNDM9QUBAPTI4QEU9MSwrMDg9RzcwMS4qLiovNTY4LCMxJzIxNDoxNzVYgWwxNk9rW05cS1tmYj5HMVFkPSoui6SZhpWwm5uToJuqraqjvcWvqbfCt729raa3sKWqorezsrKxuayppqy0pq+0oqm3traop6y2sq60rbOhqZ+zqZ2ho5ulppiruZSlpa+zt62upamuq6yloZ6coaemm5egpaWbm6emnZOenpePnaeppLawpKOinZaYl5ejiKGOkpqGoYeTnKB/pX+lqp6SkpqRiIRzeI2OhYihdomNaZeIZn5zeKBviIeEfo99f6GgoJmAfYiedIeOdZuKbIeBg21pZWN6bHJhU4VtYmxpmHFYaXFwiFheaVtsbFuIcm56coVnhoRaX0dOP0dfTUVSVlZRUVNXVGddTVZIUlJPRkhHPjw0OT05PDc7MDw8Nzk5OjY9RjU4NjA8Qjs8OT1GUUc9LjU8O0A9QD41OUdBODIpLjE8STkvMDEuKi8oLTQ1ODMlJjIxMTU+MTw4WIN1MjVSa1tOXExcZ189SzFXYTcvKIqnl4Ocq5yYmJ2fqqmnqr/Dr7G6vLfAv6qlt7CprKSytK6us7eqqKWwraW0sputtba1pqeosrCssqetnamgsaefo6KZn6GarLOUo6Wltr2mraerqqyopaGgmKCmo5mZpaOkmJykqZaUopuTkqOlpqG3pKSgo5iVk5eSnIivkJeUiamLlqGchbGAo6ydk5mdlHmC1KiAh5XBm8d5eLGlt5dlgMCcv3mEhXqShHyQkJHKcpe8nMV6crWmu5B7gG2WsauweWhsWLGubmVpvZK8bmd6b3KP2H5Ta2O2sn6BcpRzmqGqkFdPV2JPVk5GVVtYUVFTjFxXW1BBXERRTkVISTw8NTc9Ozo5Oi49Ozg3ODs5PkY2Ojc0PkA+Njk/RVJJOi41PjpCPD9BODpKPjUyKjIyQkUvLjMyLisvKC0vMTg2LSAvNDE2QTE9OleDdzIxVGtcT1tNXmdcPkwxW100MSGMp5OBp6qfl5yepayyqbDCvrK1v7W2vsGrp7SsrKmmrrOpr7azp6emtKWnuK2cs7K2q6Wkp7GtrLCmqp2mpLCioZ+dlpqenK2rk52in7O6o6qpoq2upaGcmpqip5+Xm6egn5iep6eRnKaak52hpqKhsaOfn6OWlpKXkpmFr2tqio2qfmaDlYatZHCdnZSZppRxrqGkfni7fWuhkHaxX2q0W6WAZZyRYGeDe2d/anhrqWW+cmemjHWxanyxeHSSlGNubaduW4ShRWhmh5ZFdZxgfmd8pKeCWl+Mq2iAlXh5aqc3Sq9cWFNsZFtLTlhfXFdWO06JT1dXL0lUU0pDRkY9PzQ2Pzs4OjkwPTg5OTk6PTxEODs6Nj1BQDY8QEhRRzkwNzxBQz5ARDhARz0xMy0zM0UzLi41My8rLyguMC46NS8nJDIwM0IvPTtVgnYyLVZqXE9ZTF9nWTpNNV9ZMzAbkKKVg62npZ6jpKqxt6y1vb+wtsSyt7rBpqmwqq6oqK+uo7C6r6OkrbKjqbinnrOzsKOloKmsr6uvpqeeo6Gvm6KblpWWmpqrpZWaoZ+0s6KrnKOtraCemZagoqicmJ2jn5uZoaakj5yimZegn6qepqagmqChlpWRlpCahbWbtXiFqZm1mXaGs5u3fpOWlqmUfmuCpnuChoiTlJN3q2drsVyreo2GlHSJco+HgH+IkJd4goGLmIuDoI+EsHZ3n3FsbGx8i06kWEhiYpl+Y2imYHlydVOTh15QqW1jcX6HgGKcLlGhb1tTa2hgTEtbZFhcWkI+sXlXWEEjTWhGQ0VBQEExOT44ODo4NDs6OTw4OkE6RTo6OzY6Q0I4PT9LTkc6NTpBRkJAQUQ8RkQ7MDIwMTtGLDAuODQwLC4oLzMsPjgzMR8vMi1EMT08U31uMytYalxPWE1fZ1c3SjhhVTUwG5SglYizpqahr6mns6ypu7bCsLvBrbi3v6msra2tpq2xqaCuu6qgp7Sso6u0pKays6ejop6nqrGnsKelnZ+frpWemZSUlZidrKCZmaSota+iqo+qqKqbnZWXoKWomp6cop6bn6Olo5WbnpeZnKKpm6aZnJuioJeTkZOTnIPVk5m5cLDBfsWGfNaUm7t8mpWlj42djaR7joikg6WCeqx5j51Wr3qIfp9quVq5doaEfqaClHuYeqp4jZ2PerFujoR0kbyFb5RQr6fFilGgemNgqmJzcohtl4hgU7W0yIWAiXxjpDNCnXZdUGppY1BAWGdaZGFKSE1uTlxRT1lmWUNEP0U/MD08NTk7NzQ8Ozg9OjxDOkY6Oz42OkBDOzZAT0xIPDo7REhDQkNEPEVGODEyMTFEQi4vMDQ4MystKS4zMjM5NzEjJTUqPjM9PVF3ajYqWWlbS11PX2ZUN0c6YVA3MSWbopSYsqioprSqpbSppLy3wbC5v7G1tLqytKexr6KwsqafrbWnmqe5raKvsJ+ztLChpJ6fpqmwqLSoo5udnaqVmJeVlZSWoKmcmZanrbCpo5+PraOolp2Wm6GloZihoaGhmqGip5ueoJ6UmJqmoJunlZubn6GYkJKUkJ2Ism5otXGrh26OpnK0c3K2e5qXpIuPnY2if5Ghpn+xdoOR0tJ2XK57hX+kb5uqpmuHhX2tfZiZjnuxcZKejnizZZd0hJ5vnmaUUciLWsJcn3liX61gdnOHYpeIXlnKnW+/gXVNS7VTVcZkVFFqY2VYQU9rYGxoUFZHSTk9VVJaV1hJQz9KPDI/OzU9PDQ2Pjs3Pjw9QztHOTtANzs+RDsuQ1JKRz4/PElKRkNFRD5ISTkxNzQ2QT4vLjI0MjUyLSkuMjYsNzQyJh82MDs1Oj1QcWg5J1dpXEJPVF9lUDVHPWFMNjIwop2SpbCso6u8raa0pqe2u7yyur62trS5uLKltLOgsbGinquvpJemua2ksbCbtLiqoKWeoamksaesqaOZnJmnnZWTl5eRkqGmn5WTpaqwpqKWk62gppKUoJukpp+VmqWmoZqjn62ZoJ6ekJWboZ2cpZWdlZqin5WYlZGbhax7d6h2o42IhqlvrYqCp4OYmKGJkpqLon+TmomuhX+Cs1xys1KufYKCpH9x1314hX6PnYaamXavhoeRnId3tGGaZZqCgpVtklqwWEuadZh5ZmCtXnZ3iGiYiGxdr3eVno94bDV5yK6yX0JUb15nYEVQbGBwbVZWTS5mZGlTWVA7QURATDo1PzkxPTwxNj85OEA9OkM6Rzs8Pzo+PkU5LUVVSkVAQzpNS0pCSEc+R0s5Njw0Njo+LzA0MzMzLjIuLjE4Ki4zMiUhMDM3Njc9UGtlPiZWZ1xAPlZfY042R0NgSDo5OaCelaC5sJe0wq2os6ipsrq3s7e+ubextLq0pLeyn7Osn56oq5+Up7WrqK+xqq20pJupoJ+nobWmpqmimJ2UpKCTkpuXkZShpJqSkKatr6ahlZmqoKOPkaGZqKSglZmlqJ2cpJ6tnaGdoI2TnpqdoZiZm5aXoqCUl5CmnYapfX2leKGOjYKqcK2LgaeGlp+hiZeXiKOCkYiUqnyAi514b7FaqIKCiKB5dNh/doh0qIGOm4ySpHuUj5+Ee7JenWSgfoOVbZJcq1tak4CRf2hnqmRye4FrmIdzXqtaiaCOa29lT0pDoVxbTHRdYmdOW2FfcnNfS1Y3SpuVWUdFPUdGQU0zNUE4Ljs+MDVBNzhAPDY9PEY/Ojw2Pz1CNy5IVkpFQUg2S0lOQElLQEVOOjpANS47PjEwMjE0NCsqMDUvNywmMjEoJCQ2NjcxPFBlZUEmVWZbPzJVX2JMN0ZJX0MyPziinpqawKuYtMKuq62ppbSwt7C1vrm5sbC1uqi6tJ+vpJ2kp6eek6mwqa+ptKuqrqGYoKCmpKO5oqKroJabkaGflJOemZOXnp+QjIyosLCnnpebqKagjJKkl6iqp5SXqaeenqCiraShnqKMlKGYn6CSnpeclZ6hlZaOq5yPrm1ytHOpi3WKp3O0eHOzgJGko5Kcjomkh5B3uHCNe4uiamu2WqGFZZeXaaGip22UcrR0k5l+smqFkYetanWzYZ1mom+Hk2uXXK1fTaF8h5FSc6NseX9+b5iHcl2vVjycd2ZUb24uXKdPY1NrZWJtWmNdYXB7Y1RaUj4/bnAzQ0JAP006ITdANi47QDM3QzU4Pz8zOzxDREJKRk1JRjYySlRLRUJJNklKUD9ITkNGUD08RTUwOzswMTAvNzUsKyw0MjYvIzAwLCwdMjg5LzlOYGVEJ1VkWT4vVV5hTDVGTV44MUM4ppybnryhm7LArq2rrKe3qbevtb+0u6+ut7aqwLWoqaCapaOhnJGqqae1orKnrqmgl5ynn6SruJ2irJqVmY6jopWMnaCbmJyfkZOUqrawqJmVnKypl4yUpZmlrKKRlqqyo5+epquxmaGjj5iilp+blpyWoZOdqZyUkKuZh9SSmrtzsMOAw4Z+1ZabuHiIkJiMl4uMp4h6pLZ1fnd2woKasmCDunnAfHW4Y7WCjIepfZWBq6lxe390vIinoGmdYaaOr6F+jHSHqn2+b3O8dLKDdXiBim6aiHJujaR0vV53fVphebxrWlZcanleamFlZ2NteG9aXFlDQUFzQENGKzVHIic7PzEwPD83OkI5OT1DNDxATlpeYGBfX19aUFBSS0VGSjRITFJASk5FRk9CPUU4ND05MDIwLjg3LSouLzE4MCItMSwzHiw8OjA4TFhhRidUY1g8L1ReYEs1O0xbLTdBOaebnqK9oZeyw7Ctqqussae3r7bEsLiwrbmurcCwq6OhnqOhnJuQqKOqsqS0paylnpWaqpimrLicoq2XlJ+PpJ+SjJyinZedmpGWkq+5sqyWmKSop5SQlqScpKyekKCoq5+an6ijs5+jpY6nopSimpyYlaOYkK+gkpSpnoSQmLZ/j5GMt5V4gpOatXdta25zb3mQhY+KdJ/Bu72ae4GxqHGAc5G5g3yGhoyHjXyKh42YfKS7ub2cdHq0o3R3l3Z0sHWZnmaGao21dHJxd7aMXn96fYlog3luemOLrHB1hX9YW6dqRWVaVGZgY15jUWdncGx1Q05QTUQ7Wk0/SjM7MCA4PjsuMz1BOTk/PTs8QzZCVFlaWltbWlteYGJgXVNHR0g0RElUQUtOR0VPRj9HPDc+NzA3MC85Oi4sLy0qOC8lJjIoNCQoPjcvN0xUX0cnU2JXOCpPXV09KzpWVSc+OzynnqGiv6WWtMO0rKuorKupuq6wxa2zsq22prO4q6mhoaWeoJ2Zk6qjrKmltaenn5uVoKOdq6S9pqGplpObkKGbkY+hp6GTnJeUmJSxtbetmZ6kpKKLkpKmm6Wqm5WppaWbmaGopaekqaGRrZ+WpJ6Xl5edno+vqJSbpqGNan1pm6Z3h3J9mY50eWSHe72+wLpvk4NylohgcmpaXpuJYGOIj5VrYICVY22dd2KVbICalZRlXmBjcJqKaXKLfYaVZ2t/cnV4fX5iW3d0gWhQXG2DfXuLa1hreoJzSkpvhnBOdE1FWF1nYUxbV2djX09bbXVpcVJRREVNO0dJPU0/MiwyQT84LzU/Qzw5O0A7PUM+UlZWV1laW1xcXWBhYWFgXFVHNURGVUVLT0hGUElJSDs4PTUxOi4wOzouMC03Nj01JiIvKjIsJTs4LTdKUl9JJ1NgVjQpUF9MKDM+W08nPzI+qaCoosKjm7W6tqOspa6np7WxrMirr7Kqs6K9sLGmn6KnnaObmZmrpq6jpLSopZuXlKCbpq2ovaeopJSTm5WfmZKXpKiokJ2RkJicsLK/rJynnqeiiZORqZqoo5qaq6CjmZqjp6yjoKujmrCblaeglpSdn52XsKWYoaeZm5CcnKKimKWhmZuZmZmPlYFnbX1xd5KYlJKFi7WqjYaYlY6KjJiWh5SVioSTlJGJjpOUmJSYlpqgoZqblKCcjYJ6pYVta32RfIB1ioqBcYJ4eXZ1iX98impzgXSDdWV3fXdrb3ptYGNdcGhNWVpmamBXWm95bW1mVFBGUzlPWk1RTygrOktCNjM1PUBBOTpDPjxFTlNTVFZXWFlaXF1gYmJhX15eW1RLQ1NHS05ER1BMT0k8OjszODksMjs4MjApNklSTzgiKSsvMiM0Oyo3Rk9bSiZSXlMxMFReOis9OFxKLDwtQLOhs6LAoaSysragqaWyp6WwtKrIqqyvpbSlwKazoJ2kpJyjlZWfqqasoqO2q5+YlpWflq2ppcCeq6OUkZuXnZeSlKGenqKnk5KZqKeyxLCbq52rn5CWlqidqpycn6yYoZucoqSvp6KlqJ+umJennZmZoJ6dnK+gnKGmlZeSl5OfoJSinZegjpaTioqNjpeukHyWnIOSgouqqYWAmZeJhJCeiHqEkIeGmpKIhoqWj5uXjZGYnaSWmZOQnI1/jmehs6+FioR2e5KKfXd5em9meY+BgIlqdYF5iHNpc397doOHgmt1ZHlmYGplY2Rma1lse29pa11TTFBEXlRFQD8+LDRARjs0NTs+QTs8Pz4+SE5OT1BTVVZWWFpcX2JjYV9dXl1eXVhWSktMQklPTVJKOzw6Nzg2LzI5NjQuKCYkLTEuLykrKjclKzwoNkNNTUQvVF1RMDVNWzE3RTRbRzU8LEC0oLmwv6yrrrKxoKqmsq2irLOvxK+pqqKxrbyis5ufpqKhnJiXp6WppaSlsrWelJOdmZmvpa2+oKuikJGdmZmUkZWhnJeonISfq6yjtMi0oKqkq5eWl5qmnambn6SrlJ6fnaCqr6qmpKuirpufoKCYpJ6cn5yvo5iep5KXlpyRo5iXp5yal2WCknxlfo2akGN5jm1oa3uSpKpqZZuYfWeGimVlaWh7jqGPa2eNmJGjd2tqi5mjn5hzbG16hI6IelhmXoaDXm2MioF2XGhzd3aRgIiCbXeBeH9zbXmEdHaJiI+DfGuHWV5sdGRec4lpa3xxa2RfUk5YSWRYQUo0Pkc3P0ZENzE8PT9BRDs7REdISElMTlBSUlRXW15gYWFgXV1dXV5fXVpVT0RIT0tTTj0+PT02NTM1NTU0KiYmJSwqJS8qKyc2KiQ7Jy9BSltKLzdaTzYpRVkvRE8yWUM7Py49pqC6vbqvrLSxqqWora6wpq2tsLywqKajra6wnqyWn6OdoZmZpqqcraOlp6myrZ6Uo4+ir6W2uaWuoo6OmqGZk5KaoJmZpJV8pq6jqLTEuKWip6+fnZWeop6jnKOpqJKfoZ2hqrCrq6SroKqcp5+noKyWoZulsKSXm6mVoJ2akaOWnamXnX29g4hytHKEnYataHi5xLhxk6KjeqaZmXKrgnzLwMC7cYyjiIKffZeZiZ3AvYKXnZ6NncLBfIJ8k42aw8B9bKWyb4yBb8p6f5t2kIOOgXV5gIB5cXp/h3B3hYyTeW54lGNnYHhkYGWCY150Z2xkZFlMVklRWkhPRDJJRT9EQj4vPD8+QEE6OENDQkNFSElLTU5QU1ZZXl9fYF9eXl5eX19fXVxTTVBHVU5BPz89NjQ2ODI3NiomJSMpKiYuKyopMTAfOSojPklbTCojQlAuI0ZbM1BZL1ZBQjsvOJajucO1sLDAqaiUo6+osK6tprKzrqmkpaavq5+qmJqin5yaqqahnKuipKikpLSknKKSpq2rt7OnrqKRkJmcpZKRn6GYm5+diKetpayuwMCxoamvqZaSn52imqKkqqOToKKdnq2vqq2npKSooaalnayokaOaqK2pmpyom6uglZaklZ+ilpx+zpR4eqSBeZWWm1+uj16Op4GioHynlptzq4OAr15jjap7qIeFoHWXk4izY4KrhqGOjbNqhK90fZeIt2GDrVqjzW6Qdnvae3+ZcH2HknZ9ZXqHdnZrfIdufYaRkX5tg5Bhcm1waGBgemRccWhqZGdgUlRTV11LT0M1QUhERDg+NjtAP0E7PThAPj8/QkRERklKTE5QUk9TXF5fX15dXV9gYF9fXVpXT1VKPT8+PDU1NzgxNjQoJyQhJywmJi8oJiszHTYwJDc7U0wrLC1LMCc7XDtMLSFQQEY0LjGtwsC/tbSwuJedkaOqp62zq6ayq6uqo6qmr6mfppuZpZecoq+foJ+op6KloJ+wq5qdlaeurLCqqKuflJGan6SSj56lmJ6no5+upqyxqcDHs6ipsa6Wkp2copefqaqflaGfnZ2usKmsqpyoqKWiq5KsspaloqqqnaKlpKCun5GYppifmZOTkZegcYWMl3WFqIZxsX2ecqx+op+BpY+edquCfa1/nHOtf6yHhp92mZJ7fJd+qoiijJKMnX6re4mUkJ+Ae61XncV7j3CTwX2BlW11b4xtZXZlhm9hd25yb4mKko+DbpKRZnB1dXFhZ21lX29paW9nZFhUXWFaUlNEOUlJQEQ8PjxARkRDRUE9PDw8PkBAQUJFRkdFQENJU1dZWlxdXl5cXl9hX15eXFtaUkM+OzkxNDc4NDUyJiMfHCAxJyAxJyAnNB41LSY3PVdKLTwnPjEpM1dARiEcRzpDMS4rsNPGxrK0oJ2jjqOioqyvtq6osaaoqqatq6umoaOdmaKVn6Wrn6Gln6ioop6dsKyXmpaop66rp6annpeUmaOhkZSgrZudp6OwraWttqu6zrKtpq6sl5WcnaKZnq6snJegmp6fqbOrq6ubraulo6uarrGhp6utpZikqaior6GRlaKjmZORhKRqpHWJeql0erJwgqaKmYxxiaCbh6RgYFKrhX+ug5t2rYKohoWfepmXhntmgKOJpJmGgqN9qX6CloeuX3ypVp6jkoF6o5+Ae8OvxYtyr7OzuXJiqa/CdGiMjJiOgm6clXFvenh5cG1nZWVycGZ9amNdV2BqWFlVTU1RTENDQUI7Q0BAQkk8PTo5Ojw9Pj4/QT04NjtETFBSVFZYW15eXVxeYGFgX15dXF1bU0lCNjc5OTY2NCwmJCIgKCciKy0iJC4hMy0mQERXSCxHKzU2KjJQS0wjIEE5RDQsJ8LJ1dS/oZmrp6Cvop6wtLCuqayip6aoqquppKagm6SenaWnp6Ocq5qirKGjn6+hnJqSq6S1r66gp5qdlZOmopCaoqigoKacsaamqbKut8iytaqsqZaRnZyimaCls52aoZSdn6esraSwm62ro6OqobOtoaqzsaGaqKetrrShkZSippeakXuqbJ6Eh3WreXywb4KljImflpaglYHSuLS4yYGBsl9glKmDpYiHoHqYlpp4qsl0mqSVqKmRk5qNgZyKmsbGeWehgqV0gZ+Ogn2vXXC0YrB1S6OHbadHgpNkj5CekXxxmZWBcXx1fnxuXGZqc3FmgWtfYVlkblxfWUlOTUtFREFCPkE8Qj9KOzc5Nzk5Ojs7OzMuNjxBRklMTU9RU1daW1tbXV5fXl9fXlxcXFxcWE1CNzU2ODUvKSglJiUkJiksNEVOUFBNRktKVkYqTDAvPS01T1RRHRw7PEYyLCSnpMDGuK2osq2spaKcsrisqqGlmqikqquqpp+mppiqo5+uq52loKyanqmlnKe2nqKXk6mrtbKsm6WcoJSPpayRmZyoo6Gqp66ipaepsLXDsrOqraiTipecpZuho66ll6GVmZympq2csZ6vqaefrKO3rKGxuK+dmq6msbKxo5OWpqKYno6CnU54moF/n3qEo32DpIWHpp+dn5SEuHt7ebmCf8zGwrZ4m6GRi59+mpaXinaemIqkl6Opf7CFnYaghKx9mpVjpm2kcI+FkIF9loJyrGCjc3GAmmC8fVJVdI6So5Z7fpSTjXd7c4Z/cVxubnhyaoJwW2RgaW9jZF1MTVFUQUlIRkk6OUs+QjEwODg2Njg3Ny0qNT09P0JER0lMTlBUVllZWltcX19eXV9fXVpaWlhVU09IQDg4Mi4sKi4rKicnP1FUVldXV1lYWFdVT1VGPEUzOlBbVBwbNj9ILC0gi4eZqaukq7mqrp+boayys6WeoJWlra2uqqecpqebo6ihs66iqaayoJippJSjtqKilZeiqbS4o5uhnKKSj6GxmZ6bp6ahorCunaaporayxbGtqa2pkYeQnKidoqScpZeemZqapqWrm7Cir6WnmK+ku6yhtratnZy0sbevsaWXnK6fop2Fj9G1w7d5h46FkZOQgKZ5lKF3jKCShKWBinGqhoW0bnJpmqSclYqffJiZhoePc6+CpZuijqaLk52LlpCbbnGyXaV0k3qcbJl/e5l8balho3Fxf59ic7K4aHePlKaYfY2OlY56fnmQg25qeWl6c2+BdV5lZW9uZmhgS1tYWDxISEBVNEBGPjwqKDYzLjAxMykmNDo7PD0+QENFSUtOUFJUVldXWV1fX15eX19dW1taWFVSUlFGOjIyMy8vKysoQFFSVFVUU1RWV1dYWFdVVVZUUU9RW1UlITJBSCQpJZJzjIqtvr+8urSelqekrbWhopmUoqimrqurmKajn6Whobano6insKOUrKOOpK2inZCamqqzs6ScpJyokZSXrp+fnqeknaidtpujq6S2rMSwqaupooyEjpyioKailpmanZmcmaemp5mtqK+kpputpr2slL2vrJ+hr7K3qbKlmqiwoqeXeaiRfXywd4qApKWInG2ycKGHrXyhj4OnlZiArImFrYWglaqgopeGn4CZlYB7kn6rgJ2aloureJ2hkoqUkoF6r16kgX2mp2SdgHyXc2qvXaVrcIWZXWBbjKBtlZGmmYOWjpqOfHyEmYBrbn9jf3RugHpgaGZxb2loaENaYVs+S1UzVThCQkM3JCQzKycnMywgLzY2NzQzNTlAQ0ZJS01OUVJTU1ZaXV9hYGFhYV5dW1pYU1BPTkk3MDQyLiosQVRWVlZVVFVVVVVUVFVUVFRWV1dYVlVVUUhGSUojKCi9k5qDqMXCtsCznpqsoK23paOOm6Sin7Cwqp+loJ6tmZ65oaOroK+pma6hkKuoo5aJmpCusKymnqWbrJeXj6yhoZ2moZqlna6Yoaint6nBr6SppJ6LgY6bmp+nn5KUmZuVm5qmpaabqqytpKWfqai+pJbCrKqioKqxt6ispZ6yraeol3WvfpCLnIWHfrqtipllsI1lla19oY+EppWagayKhLCFppqkoaGRhaFcbGqBs2B/rXt7g4GxbWdvmZmMiLFbfrVcpIRryKJkn4B7vFh2tFmyfVKugHqsWIChbZiPqJuMmJKamnx6kZ9/ZXV/Y4Z4dIF9YmpncW5nZmZQVWRcQVVgPkkoPjk9NCEiLCUfMi4gKjEvMDQ1Nzk5PEFDRkhKTE5QUVJUV1peYF9gYWJeX1xbWFVQTkpGQzU1My4vQFVZWFdYV1dYV1dXV1ZXV1ZXWFdXWFlaWltcWFdXR0I70p+ysbe9urPBsqKcrKaktamgipqgnpyzs6mfpKGetpmgtKiqrJ6vrZ2sm5Wvp6GOiJuOr6uopqGlma6SmI+pmaKepZ+ao6OlmaCiqrOpva+kqJ6dj36Lm5ahoZqQkZqckpqYqaCimqmuqKamoqSpu56gxqakqKCps7OqraWeuqyrq5SAqZKjr46bgIekl5mQgoC4w7qDjpyThKeXnIKsioKviKecm6aqkH7VvcKqYqO/vX1+o4KE17q4tYWVk4Oevb6EbaOCb6uEbJx/erKwx4Npq7C9rHh3or68c4CWjqedkZuSmqB7g5Ode2R+e2WPZ3mCfGFsZmtrY1FiW1NqXD9VYkNNKT06NC8fHyQfJTIgHSQoMDQ5NjY3Nzs+QUNGR0lLTU5OUVRXXWFcX19hXmBbXFlUUU1IQz89QT81PVNZWFhZWVpZWlpZWFdXWFlaWllZWFlbW11dXFpWWFRXWryVs7Owv7ixvLKinK6mpbKmnYuYpcCquLKoosCnqLOdn7Kduqifra+lp5SUsKuXjIObka6loqygo5yqoJeLo5KmnqecmqGpo5mfoayuqrqtp6Oal5N9iJmRppyTj5GYmY+YlKmboZmqqaGrp6CjqrueqMSin62iqLKyp66pn7mmra2Zc3aqpbiGZImgcGiukYuQbm53pJCZn4F1rpiUcI+LcZWoo5qXrqRybGxsZot4b26CmXGBempxaWeKl5aYcWlphohncYZkXYhiam9ZXGZ9dqZfYXGOkW5lZH+Nk4+imZmZk5qifomRmHdniXhpj2t5gHplbWRnbWNLZVhKa1o6UWZGUSdLOisjHCAbIywpGBsYLTIuNTo0NTc6PD9BQkRFSEtMTU9RU1ZcV1pcYF9hXV1bVFBMSEQ9OkFCN01YWlpZWVpZWFhZWFdXV1dZXV5eXVxcXF1eXV5dW1tVV16plKyzqbm4srOqqaGunqOzqpiSv7PFyr+3qp/Bra6koqisn7qjpK6rraaOl66pj4uFlZatnqaqoJ2ko6CRi6WSp5mpmpejqqGWnqanqLC7q6uam5OTfISWjqaZjpKRmZWOmJaplqCZqaOcsaadoqu5n6/Bp6OypaqusKmrqaW1oqy2lYqhqKa3nYmWo5mIqpuRlZ2SqbOZmqOqoLKWoqGdn6KcoaWilaunjZKSjIeTnJ2VkZmTmZGPlYWBpZuYlo6LlJSMkIeFfmeJfnSCdXOHinCnbHqTkJOSgIGNj5CPnZWil5qapYSJl5Bza5F3cYx4d316am1lZHBlVWFZQGpcSGNiUFkrRj0rJyE3NTAuHxwhJTIoKjY5OTQ2OTs+P0FCREVKS0tNUFBRWFRWWV5gYWNdXlRRS0VDPjk9QEFTWFtcWVdYWFhYWFlYWFpaW1xeX19gXl5eX19gYGBfWVlgppaoqqS0tq6uobCjrZ+gtrGQjqzIvsa8uqujpp+dp5+xqaO2p52ptKaokZisoouHiY+cp5WspJ+Yp56ekpSjl6iaqJqUpqGkkZypmqK2u6eqmJqQjX2BlYyilYuVkZaRkJSYppCgm6qgnbajnaart6euwK2itqWurq+rp6extp+tu5iRpaSmtqKSnqegjqqgjpOfo6uwmqCjsKivmKOgnKOqnp6enZesnZOZoZuUkJarmo6ZmZeRlp+RiKGelpWFko2RjpWLgX5mi4V1hnV4h4JznGqFj5KTkIl9i5WSkpiUo5OfmaSFipuKfXSXdHuMgHN8f2pvZV9xamBbYFpuZFBhZlFaOkdHRT4yPT45LyomKykmHSY0MTY2Njg6PT0/QUFDSUpHSktMTVNTU1VaYGBpYWVWUEtBQ0I6OUVNVlteXltaXFtbW1xdXV5fXV5fYGFiYmFhYWBiYmJkYlxbY5eVo6eir7GrrqOppqyfp7WqkI+dpbW9sK6to6SbfJ+ksqSlsamXm7mmo5OZqpyOhoqJnKKPrp6ilaifoJKWmZuui6mWj6iZqI2aqpCfurekpJicjYl6gpSNnJSLlZKUkY2Sl6ONn5+pnp+4o3+Dr7Wir650o7yisJ53eJ6nr7iUdayjnomAq39kXGJ2oI+ln4SYfW2Ss5yjp62qomWen5JzeZqXcYGZqJhtf6KoimWcpp2SmJiWjZKckIaem5CWhJKHj5CSiYV3ao6HdoZwe4V/f2Boh4mTkYtadZSQZ2iQj3N7qJycZnubioV6mWqFjIRveoBrcmVgd3Bsa2lcZmZiYnFUWz5OTk5TRz5AVUQ6MS8eHyY0OjMwNjY3ODw7PkBBQUZIQkdGSUtNU1RVWV1gaGZnWFFKPERHPDhVUltgYWJgXl9fYGFhX1xdX19gYWFiY2RhYmFhZWRjaGReXWablaajoK6vrKuppaitoqetpJKWq7exs6ebq6itmHSNnrGgqKunlJe5oKCPnKSdkX+JiJqejKuZoZSnoZ2OlpKehHatj4inm6mSmaWKnbu0qKCZmIuJdXeTjZeTipSRkZSNkJShj5yhp5mcspWAjJu1nbOMko66pp99p6J5oKy0f46NpZ6Di4aQsKqvjYuXpJt6gYushZydoaeop4eVhZh3pZt6h5yBl6eCgnucsnqKhqGYmpWYloKRl5eEm5lieoeQhY+QkouDbXCNh3mAcH+AhH6Fc4WDlJF4lmiSdKCadX2ZhaOgiZh/lIyFhZprj46GbHl8cXFoZXhwamxrXGVsamZ1XV5JVExSQEU2LlpVVTcpITA5Pj43NDM1Njg7Oj0+PkBEST9KRUpLR1NYW1lcYmFoZlpRSDlFTDs+YVZeYmRmZGBhYWBiYl9dYGFhYmJiY2ZnY2JhYGVkY2djYWFonJein6asrauorKCnr6amqaWZlK/JwLGil6iqt5+RhZ6tnKeioI6Qvp6ajJ+aoJB8hY6Yl4eqm6CVn6CRjJOJhoCRp42Ho56klZmfiJ+6sqiempKOhXF2kImVkIqUkI+bjJCSoJKYoaSWnquHn7SJtJqtisqHqayItoWNsIGvrIKojKaYjZ19qI9ze3edj6eXaJWkebSMn56mp5KYwoF/q4iYoXKegJqlfZeFlbKBoX2hlKGQmJeBj5Sci5mSi32Fk4eNlpKJg21yj4V+eXGGgIN7g3SEgJaAj8Vmf6mHj6NrnoWknYWagY6Ph4uacZCUhml5dXx4aGl2cmhobF5kcG1nbllnR11STTNFNDdOYmQ3JjM8RUdEOjY0NjU4Ozg+PT0/Qk0/TklKTENQWl1cV2FeaWxcUUU9S01ASmNYXWNmaGdiYmJiY2NgX2JhYmNjY2VpaWNiYmJlY2FmY2JiaZSWop+vp6iopaufo7ewqaummpSgpKWspZimrLmksIGiqZ2mnp2JlL2Zk42hkp6PeYSWlZGHqpiampmhhI6Ld5ucj5+QiJ6lnJeamYikua6lmpyMjH5ibY+Lk5CNkI2NmIyRk6CPlaGhmaGnfqGnh62doJatj52cnJCFgKCMqayFo42pmYyaf6J1gZmUbIKtdk2reIeNnJGaqKaAqat9g6F7eqdqnn+Sa2eXhpe3iZ5+bmBkWYOXgI17ZGiLcpl9eZZsXX2XbV9ScINcX2t4gl9YZIF8g3+XcKeqa4OjbnKlcJ+FoGpnoG1bb4x9Z1pghIFjWFFwd2ZudXNram9danFubGpZaU9dWUY5QTVIRF9sNSxJRFJNTj04NDg1OTs2QDs7PkJQPlFSTE1CSlxdX1ddXmJ1YE1EOk1PTlRiXFxmZmlpYmJkYmRkYmFiYGJkY2FjaWtkYmRkZ2RiZ2VhY2iXlZ2guKCpo6askaC2u6quopmYoaOmra+hnrC2pKmToqGgp5yajpm0mZCLn4yVi3WBk5KMiqaUlJidnn6ShYWspIebkIqZqpmbm5KJp7GnopaaiImAaW6Ih4uOjoqLjZKMkZOjjZSfn5yipH+TgY+ioZSgdpyVj6eCoKZ/haerg6V4iXyEmn6icHOUiJZ8n415bYabjJmPm6iZjoede4Kic3amZp5+d6RfmHp9k3Sibpi3tLp0k4iDgLWoZIHGuHtwlbaMcoCao2JzrKtgfGmds35tfIaBjYKLmHF/o2xyo3SfhYGkYZ2Zs5ZyfZifs3V0XJ6yg2tjcHV3cmlvWGttc3NnXWleYkxFPUQ2UUJaczM9U0dgSlI9PDM5NTo5NkQ7O0BKUD9VTU9RQERfX1taWGBgfGRIQzhNV1VXYmFaZWZra2JiZWFkY2BhYmBkZF9gY2tuY2NkZGhkYmdmY2hok5WUo7eYqpuTn42ktrStraCaop2ko6avnZyzr62UmaKaoaWZm5Wfq5uLiJJ4i4VxgZaNio+gjpKUnZh9kImNqKCHl46JkqSVnJuNi6mopZ6Ql4eFfmp7h359kI2Di5GRiZCUoYOXnqCdn56LiXecmKKNn3Ghioeph5uljpSmqX2tjH56oJl6o5N4gXSWiI2cfZafhpuOmJulhaJkoXyIlpCbjW2eaJuOb5qZeoCLp31yaXSrg5+DdKpolZpdm4V2hZ5nqmuAuGZcqHCBnGCVjF6ndnWHiH6eaJp1hpOSl46An2+akW6nml2pf3m7a36qXI6EXbRoXW5yenhraVxxa3l6ZGBmWGJCUUZPN1dDUm81TFtbX05aREEyNTE8OzdIPzpDSFU+WVJZXT5EYl5WYFFhY31qRUI5TlteWWRmWGZnbm1iYmVfYWFfX2BgZWNeYmRvcWBkZWVrZWNpaGdraZWbiam0mqeIY5Sbq7mxr6yeppycqaCfr5yesqmun5ilm6GgmZeXoKOZhomNaoiAcnuXiIuWlYORlZiQeoqElaScipSPhoyfk56diZCpo6CajJKKgYBpgYZ5f5eMe4mOjoiQl5t/lKKen6GTmHJon4mfj4xwkoyBqYeYnqGlnqZ7sK2joriXd6Ozo6SAiZR5nXurmX6ijpyaloiXcaF8hY2vtX1rmpGheX6YtaKkq6iEmXybfZ6bf3SqWl1ve5aLeJ5iTH97eoVjeZdCTJ9Yompxe45sgIiEmXWbeIaJsbN/gJuTp3eDnm5zfZVwmnRrpF6VdkhlZGF0cn9/b2ZgbGl3fGVlYVFfV11UV0BaRlFoRVRXXWJYXklEPUI4P0I6SUY4TEVYQVdSW1ZERmJcWmBLYG1+ckVCPFVfYlplaVZnaG1vYmZnXmFhXF1eYGhiX2Vjdm1dZWdma2RlbGlpa2mTnICwrZmEU16gprO5srKpmqKMnKycnKqVoq2lo6mQoJ+dm5qWmaGdloiHiXeGgW95lYWRm4p7kZOWiHKAiJKhnHORkIGJmpahnIWPqZyblYuLi32DbISFcYKhjHiGjYiIk5mWfJOjoJ6iiK2GfbWEjp6de6WWeqmAlZuPiZ+bfKdod21+mXShc3J8noaZcJODrn2kg6WdmYCjb16oZ3WiY2+lYZzTkH17mXhzc2KihpB+o3SkkHZrj7OMYIKYiXOqsqi8f3eDbX6/pqm0XZttfHCWbX9yonJdpGdzpmBopm2b1Jp+hptwenuXbJx8eJdzbqmkZ2FlenKAhWxoZmRvdnhoYGNTXGZRUWJIWUpVYVdUXGZrXGVRRkNLTUpLQktFOE9AUU5YU1lPU1FgZmZqUmN3eXdJRkVjXWVaaGpUaWhqb2NqZ2BjYFxdXV9oYmFpZXxkXmRnZGtkamxnaGxol5p/r6pUXEt+qa+xs6+yo5uZhZmqoaKlj6apoZqri5uZmZSZk5OhmI6HhXtwfYRofY+DlJqAd5GOj4lvf4WOkpJsl5N8ipOUpZeDj6ublJOLhol5g3aIgW6Cn4Z4gZKGiJmjmHuUoqOZn4mzoaK2i3qsp6SupXCpgJqOhYCakHukgKGZhphynoSkrq+Kl4yAjaSNlYOtoJN2tba1yaFzlIuBn2Cel6lteZaHoJt0ooh3oH6Tl4uBcE1mo5Jwm4dzpHt5dGGDgWt+oGtxZF+ccX1zlmh5aLK1tMamc5h9ep1rnJurdoWbbnd5mGqae3WYclFFfbNfandseohna2hjdXVxbldfVFlpUFNoSVdNWVRWXmlsb1ZoV05LQUpNS0hKT0FRS1BlY2ptZXRyc395fG51iXt7VFFPbF5pXGtpUmpoaWxobGZjZV9cXV1eaWJkaWt7X11kZ2NqZm9tZWlsZaGbiK6lg2Q/k6Gyqq6vtaKikICYq6Ojpo2mqJ+ep4SbmJeOl5CQnJOOiIN6anmHZYONf5igeXWPiYyBaYSFkYKMhZ2Neo6Ml6aUhJmqmI2Si4GJeoB9jHlwkKGGeoKVh4mWoJZ/lKWonJWVg2ZueJxsomR7caV3m5hwZ6aAlYp6pHqfloOXc553gYqVl4+5bpGKomJ9maCViG5yaaprdaBtb6Zgm2mLkGmWh5uWdaKBfppgjIaNdXCIYmigZZ5+aZt1b2NmiIFtcaJaXltioWxdiItuen1xcWSlbXiiZGenaJlzjJlwonBViZBvoF9mqFSLXlSYbm50a3ODbnFpbHl0a3BSWVdXZlpUbUlaUF1JWGlpc2pZbFdRUkZWXExYU2FVaWtfd3R7fXB8fHKDe4Bzdo2AhHZeUnJiZ2NwZ1BqaGhrbG5oZGdfXV5dYGpiaml2dV1cY2hjampzbWZrbWOco5eleWRzbYumraOpsLGmn4uAmKyen6eNo6KcpKOBlpmUjpqQjJiQjop7h3GAiGmLi3yYm3N1iX6Qe2SDh5SJipWZgnyJiJiokoGjrZGGkIuCin6AgI90aZCmhH2HlI2ImaCPiJOppp2IpniVm36kiJaLsZidkIKvl5+ldpSGeKlzpY+Emm6kooyShI2Du259pa+DhoWGk5Wcn3ylenKolaCWZ55+b6xkloqWk3eobaqigYl2iYN3q5GmiGuRsGt2s4ypa4qFbW2fnpKVYH6ri6p2fn6KpJ53n3yDpJWdoGqbiHisaJ+ujLZ0d76NpJNag6eOq2F2c3VyfHVxY2t/b2ltU1dbVmFiXWtNXVJeSl5tb3dgW3FZXGBbZ3Rlbm9yY3J0YHd6fnlyeYNzhH+Be3uMgYOAdmJ4ZGNucmRSa2dob2xyamZpYWBeXGFrYm1sem9cXGJpYmxqeG1nbG5ilaSpnIF/naOWqamdqKaupJmKgpism5+mipymnquehY2bkIeckYaSjYyMc4Z6iIRvjIR9mZN0dIZzkoJtf4uRh4aTjn17goeZp4+Ap6ePgY6JhZV2goeSb2yLqYGDjJSOiZ2fiYyUqqKfj4B1lJeIfoF5lK6if4GacY+Gd46Jgn17cqeMcn59epiWm4SQeXt/foeUlZOKdpCYnqCDe32Ja4yFW3l5cnpxaW5+kolxgHWBj5STcYeEgmWMf1+Bf4t3dHKUdW95bm2HbIOFXXVnd45lf4CEjKeZfXR7lWqJiHCBdn2Hd25uaI10enyYeIVcbFh5j2lveHNycHh4cF1sh25qZ1ZbYFddZmtkVmNVX1JgcHl5bWt3Zmtra3d9cnJ1dGFvdmJ0e4J4dXqCdYCAgIF4i4WDfXtuf2xkeW5eV25naHVreGppamVcYFpjamVtcXRuW1tibGRsbHluaGxvYY2Tt6imiaCimqajmKScq6KhhISYrZKeooqbqJuqmYOCnIx/l5SHjoqJjXGCfI99fo6Ee5iPdHKEcZWFe32Si4aGj4R5foCIm6WPfKiijIaQkIWVg4aOmHZyhKmGjpKdkImfnoiMm6efn6qDiY6Vmn5+iZatp4+RpY93b5uPgXiQbn6ohXF+lXFrcH2CoI2Ak46LaGxcgouLm5qejnOVi4hxdGuCd3SBWXJuh5GBfn+Mal1qZXuGhImAYGl4epp7goqBdYGFgWd3ioZqX29xgXVecYmAiI2klIVli42DbneLhHGGj3pxaGlmfIR7lltca2hudlt8eXh2b3Rzg2hdbotra2JaWl9bWWxxXF9hWl9eZnR/fHZwdWRra2t8fXN8eXVkbnVobXx+d3p8e3l6gIB+b4aKhHt9dH55c39oVFxxaWx2cHVna2hkXWFYa2hra3FybldbZW5sZ3N6b2hqbWCLiqmwoY+ioZqenZeemKijon6Dma6OoJWJnaORppWAfJiGfZKZiomHh4pyfYGMdoWLgYSXinJvgHKYhoN+koOEhomAeoGEjZyhkYOoooh5jpeJlYuLnJeEg3qtgpGYmpWKnp2HiKGqn6GipIuIk5uco5mVqqGnpp+SmoaUjHp2jY2Dp35/kpCSlJ2yppuVn5CNsZKXg6WMjJWan4mQm4KIkYprfI53eGWDh5GLfImehIeMkImJgYWEkHd8enSZoIiGiZ2JhJN+fYqAf3RucoSBfXaFhYmOpI+ChYyGgoyQjH2IjIqRhHpuhIV+eplrc2lhdIpxfnt4d3B4dYJdXm+HaG5fXlpdXVNoclZkXV1ibWh2fH10b3Bla2ppgH1ueYByanBxbGeBe3KCgHh/fX+Ee22CjIZ8enh7fXqDeE5jdmpzbnB6ZWtlY2JgW3RmcGdycW1VXWx0bWl5enFnaWtkjIecuZ6WoaCYlJiZlJikoZ58f5qsj5+Oh6CdjJ6WfXmVhHyOmYqGhISGbnmBgXOBh32JlIRta356l4eDg49+gIeEhXyIhY+cn5OIrKCEc4uQhpKRi52RfY17qoSOk5iWj5yXh4ebpZ+imZyFgpKamZiPmqefpZ2cj5V/j4h1e4aNhKV7fI6QkYaZq6KelJ2QjqmNkICdjIiTmZ6Cj5d+ho6Db3iGcnVgf4SQhnWNmYGDkIOHhX+FhJVueXZ0kqGKi4WahISMc3+Je3xxcXqHgnp3iI2DkaWOhYOOgIOKiYp3homLjX5ybYCCfW9pbG5oXnp/aX59d3Z3dnt4XWBxfm50YGNbXV9SZ25UZlteYmtpdnp/cmxtZGtqaIF/bHSCbGx1b3pwhnpuh4B2goB+hXZxgo2Ifnt8fH97gopgaHtqdWlpgmRqY2BpXGN1aG9idW1sVWNxeWVwentzZWptbYuJnraZoKOfkpGVmIuanp+ee3ifp5Gci4ellYyZmXp6jYZ9iZGEjIKCg258gHlzgYR9i5J9a2h9gpeJgYiNe32GhIZ8kIORnZ2TiamdgXGMi4yShqChioWMfKiRiZCSl5OWk3iNo5+gnZWYfoCQmpiSjJujoaOZlpCafYyDd3+Cjoagf36MjI98mKWiopOakZCmjI+BmpGJkpebfpOSfoeOgXV0gnF3YX6AjoZyi5Z9iIxyjH+ChYaPaHhyeIuYkY9/ln6IiXKBhnt8cHd6ioN5eI+LgpWkk4qFj3uGhoeEdoOEiYl9aHN+gXp8cm1saF9+dGl9dnZ0fXOBa19gdHZwd2RjWV9fUmtpVmZaYGFoanZ5gnFna2RsaGaAgGtufmhvcWx+eId7bIyBc4GBfoF0doKNhn98e4CBfX+PaXKDbnRpYYdobGJfcVZ0b2xtYHhobVdqdHZjdXp7cmJqb3qJjJ6xkaWknI6Pl4+GnKCbnX13paGOmICNo4uJmpZ5fIaIf4OJf4mCgX9yf3t0doOFfYqRd2djfoaXioKKi3h8gI2DeZeDlpmYjZehnH9wjIKRk4alm4eMiYOmloWTi5aXk5J2kZ2goZeTlXh+jpeXjZabnaSdmJKUmniNhIJ3g5WNnX6BiY2Mc5ejn6KUmY+PooyKgpaXg5KWmX6YjXyIjYF2cX5ue2SAfIuFcYeTgJGCbIeDgYCJhWZ1b3uGkZeLfJN4i4h7f4Z7enF9d4iFeIOPh4qXoZWBg4t2iISDgnd8g4qGeGF6en91gHlobWZif2preHR0d35yfWNkYXNudXJtYVphXltsZVNkWWFhaGt2eYZxY2tjbWZofINtaXVobnBpgH2Dem6QhnKAg4N+dHyDjIGAfnuCg358kG12iXN1bWWKbGpiYnVWhGlwbmB4Z2xianZwZnl8enFgcmyGhY+brZemp56NjJeHhp+Tl5l+eKqdi5p7l52MjJmQeXyBjH58hHyBg4F4dHl6dH2AhH+Ji4BkX32LlId/hIZ0fX6Lf32ZhpeVmI2kopmAc4d7k5GJpo+MjoqToJKEkpCUl5GLgY+Xn5qRj49yf42Rk4mdnZ6ml5eMlJVyi4yJa4SXj5l6h4iPiW+XnpuklJWLjJ6LhoGRnH+SkpWGmYh7ioqBeXF6bHVsfH+Lfm6Gk4OVeHGChH5+i4Blcml7f5WWg36NdJCHgniGfXV3f3yEgHuCi4KLk6OPeIOBdImHfYB0doKJhXFifHZ7cn5wY3BkZXxjb3B3c3l4dHVid2BwbHZub1xcX15ea15QXlljYWhudHuJbGBpZWtjaXeHbmdtaWttaIF9e3hvkIhzgISEfXSBhol7g316gYR9fY5yeot4eG1sh2poX2lyY4dncW9ld2dubGF5aWt9e3hwYXhti4CYmKmfpKidioqShoqdi5WYfnivmY2Yfp+UkZeUiHd+fIp9fIB3eICAcHV0fG+GfYGBin98YVx+j5GGgIOCc3uAh3qPkomTkp2VppyWgn2BfY6KkaOJjoqNmJqNhpKZlJaOioiMkpySj4uLbYSQj5GInpmioJaViJaQbYeYg2WFmI6TeomEkIpwlpuVo5OSiYuZjIF/kJ19ko6SjJmOe4qFh3NzdmxxbnV8inRuhpGPk3F1gXyBgYh8ZXBseXuYk3yDiHSQiYBzh3huf3yAhXuEi4eCi5SnjHqGe36LhXh+cXCBh4VmaXp1dnF8Y19xYWt0X3Fre3p5bHNxZnpeb2xzbXJYW19gYWxcUFdYZWNncXF/iGddaWlnYmdxjW9kamhlaWmBend1b46FdIGCg3t1goiFeIV8eISFen+Jd3+Le3tyeINqa19waHSAa3JvbXJnb2xlfGNugHp3cWx3d4p+opehp6Cmm4eLi4GPnIeTnXaCq5WTj4ihjZaUkIB0fHeFeHl/cnN7hmtzcHpui3aAgYdvcFtZfpGNh4B/f3Z1gICAoIeSi5SemqKVmHiKf4GNiJydio+GkpiWhYmVmpCXjIyNjYyciY6QgmyJi5GRip2WoZuXlISXhmmDooFlhJyJkH6Lg4uBd5OZk5+SkYmJlI1+fY6Xe5GMj46aknyKgIJvdnBsbW9we4ZpdIOPmYtxd4B1goiDeWZybnV/mI57h4R5k5B5dYdzb4h6hIp5ioWBho2bood7g3WCi394eW5sgYWDX3R1dHJyeVtfcWFwa19wa358cW5ua253YXBva3FtWVliYWJvWVFUWmZnY3VwhINjXWtuZGNma5JuYGdnX2hrgXVyc3CLgHV/g4B5doCLgHmFf3iIhneDhXyGi397dop/anFjfGOGfG5xbXRqaG9sdnhfcX95fHR1dICDfqSVmqyep5aFjYR/l5SDkKB2jKCUk4eMm42Wjot6cnl1gnByhXRxdohscG52bYh2g36AbW1VUYGrlIaCd393coN6g6GDk4KVlJqdk5t4knuDjJKjmZOOiZWZkoSHl5mMlIuJj4+HnYSQintyi4WKjoicmp+blZN/k31nhJuGZ4Wfh5GEkYKJcYORmJCcj4+MjI+Md3uRkHqOi4ySlox8iHyAa3dqbmtsbHt/Ynp+j5eBdnuBeIOMfXlnc2xzhpSLfoeFepKPcXmDb3WLeYiKeYh8gIqOnZyEe3p2got8d3FqbIKEe2F5cW9tc3RWX3BicmJgbW96cWlwZmd1dWlybGJ3ZV1XZmFgc1RRT1xmZV15cIh9YFxpcmJiZWaRal9oZVtncH5wa3F0in12fIaAdXZ+jHl7hYF4iINzhoV+jIyEfHmVeGZyaoNgiH5vb2t6YGpudH91X3R9eYd4dHOFfXigj5mwnKWOgot/g5qHgIyfgIualI+FiJiOj4+Ed3R3dIBxcIV0cHKEcGtpd26Dbn19bXRzUk2C38iS1pN7cHWEdoWhhJR3lpGZnZGZe5RzhZCeoZKTkYuTnJSGf5eWiI2Nh5GNh5t+jYB3eo1+iYyKnJucmpSSeYx1ZoeQhWuHooSRiJaDhmOMkZmPlYuXjIyKinF6lIh7joiKk5GJeoZ8f218ZXNva2x6eluBeZCQgXp+f4CGjnt7aXNqc4qPiYGFhHyUimt9fm1/in2KhXyEeYCNk5mYiXx1d4OPeHNtZ3GAhW5sdXBpanVuU19wZXBaYG1zeWhsa2NneXNwcWRgeGFgVmxfX3ZQTkxiZ2NdenGJdV1cZXZhYmVljmRhZ2JZaXNzbmtxdox8dHqGgnV2fYtzgIZ/e4l/comIgZGLiHx+mHZlc258ZYh+bnBsgFlsbnl5c2B2enuNdnJ3ind5noubrpqgkIKFd4iVfnyKnoiGoJKPhYyYhJOPh4F0eHB5cW+EcG1vf3NlZXlxfW15fWpoa2OkmsHcrvChc2x2hXeGpIaTcJeRlqGVnIGScoaLopeJjZaLkJ2Wg4GWkIWJj4CRi4mVfYZ6dX+JeIeEjpyamJiOj3aJdW2FiIl8iaKDkYmchIVei5OXi4+Jj4uLhIlte5aBfYiFiZGPhnaGfn5rfWR4dmpueXNYiXuSiIV6foGBhox/eWZyaX+JjYmCgX6LlYRrgXVtho+BjoJ9gXh+jpSRl490cneHjHVzcWd2eoRjdW5xY2p2aFJhcmhsVmBvdXphcmRgaX9xc29bZHJhYlduW114Tk1MZWdiXndziW5cXGR5Xl9lZYVgY2NfWWpza25rc3eMfXR3hIF4d3uJcYOEfX6Ie3SLiYiWhox/fpdzZ3VyeWyMe250cYFXcXp2eXJkd3mGjGl2gIlyf5yGmKebo5KEfXGMlHd5jJ6FhaGNj3yWjYCaiIR7c3dwdGpwgmxqbXx1X2F4d3txdXtnYGR869q1ycPch3NsdIJ3i5yKj2qZkZCelpSBiXGFiJ+NhIuWi4yYlHyNk4iDiZB7kIuFjoB/dXiDhHKIgpOclpSXhYx1hn1vg4GHhpihgpOMnoOJYYOUj4eKhoqOh4GHaXyTf32DhImOjYJyh39/cXdodnNqdHdsWo19k4OFfYCEgYSKgnZhcmuIgY6JgX5+kZB9bYFrd4WOhJCBe4B8fY+RjpSIbXB5jIV0a3Bsc3mCYXVqcF5sd2FSZXNpZlNgcXd1YXBgXWiEcnRrWGhoY2lZbVdcdUxLTGZnXmJzc4VqXFxleV5eZGd7YWRfXVlrb2ZvanR4in5zc4F+e3Z6iHOFg3x/h3Z3ioaPmYGMgnuTdWx3dnl4k3RueHt9WHmGcX9vZ3h3koJkdoaFcIqWhZmhmqKKiHRvkoxxd4+cfouaiYl9oH+EmoCBeHJ0bm9kcn9pZm14eFxgeXt7cXGAaWFnYX/Vto6RpnhvcXh9cZSSjohrmo+JnZOMhntph4uZhoGSkYaHmI58jY2BgYmNe46MfYiEenN6g3txhoCWmo6Tk4GIdIKFdYJ/iZGcnYaVj59+iGJ/k4eFiIWLjYCAg2d8kIB+f4KMj5B+bYN8g3VsbXd1dXh2bGOOgY+AhX59hn+EiX9wX3FwhHuOi4F7fpCIeXCDZXmBiIWKgHqEfH6SjY+Rgm1ueYt+dW1ua2x7f2RpbGtabndaU2pzaWJRY3N4bWNmXlprhG50YlxoX2VtYG9VXHBPSE9nZlxob3KAbltcY3NgXGNsd2VlXV1abG1jbWpzd4Z/cXB/fH10eIZ4hYJ8gId1eYmBk5V8iYZ2iIFweHl7hJNvbnuBd16DgHSBbWl6dJRzZ3OIfHGSkYOZn5ughoh2dpR/bXeUmH+IkISLjpp9jJp3fnZycGxqYXV9Z2JqdXpbYHh8emxwfmVjZ2dXnY9fcXOWvcWFd3KVi5GAdJiMh52UjYhza4iPlYB7lIuBhJuMfIqGfXyJjH6Th3SHhXZ2fYJxdYaBnpWGlI+CgnF+h3ODeoiWm5aGk42dgIhmfZOCgIaEiolygX1nfYt7eX9/h4uPfWmAfYR2ZnB5eHR4dGxrj4aLgot/eYOBhISAa15wdnp9i4eEe4COf35ygGh4gYWJhIF3gnt/lYqOi3xta3qJfHZ0b2hofndlXXJkWXB0U1Rvc2liTmh1eWdhXl1Zb4FwdFplY11rbmFxUFpsUkRUaGJabG9ufHBaW15tY1pjb3dkZ1xdYGtqY2xpc3eBg3Fufnt/dHWDeoSCfIKFdn6JgZaReIOKdIGIc3l5fo2Qb297gXFqgnl6fm5tfHaVa2p4hHRrk4yFnpigmYWIb36Mdmp5mY+AgoqClpiKeY+Wb3pzcWxqZGB0e2lgZnJ7W2FyfXpmcHphZWSOsbJ3S2JapdrSmHN8ko2Ren+WjIWako2Gb2yFkpF5eZOGgISZinyHgHl4iYqDlX9uiYZxc317anmGg6WRhJOMgn9ufoJ1gneEmpeSipOPlIWIcHqShH6DhImDb4F4aICFeHJ/f4OKh3xlfH6EdmNxc4BqenFvdZmNhoSLfHd5gIR6gmtccHxyf4eDiH2Fh3qIcYBtcIKFjYKCcYN3f5aKjIN3bWx9hH52emVoan5yYVp4W1pybk5YcnRnYEtud3ZiXlxbWXV+c3BYZ15ma3Ffb09YaVM/WWdfW3FraHpyXFtZa2VZY3B5X2hdXmVsaGZsaXF4f4dvbX99gXVwgnuAgX+Df3aBhYmXinGCjXF7hnx6eYSUjHVren9scH50f31vcnx7k3BvgX95ZpKKgqGYnZGDhmeHhHBnepeKf4CFgpqKgXyNjWl4cmxsZl9hb3ltX2JveVxkbIN6YXF2X2Rl1eu+izM6PouPgHJ5hoqQjniFmY5/lI6Nf25thYyLdX2Pf4WClYl8g3hudoeEgpV2bYeEa3V7dWV5g4SnjIOPjIN9bX9zdYJ4hJqPi4+RkoyMh397koh5gIWOg2yAcmmAfnhtfHuBioN4YnmEgnJkcWl/bnZydYKcjIGAhn90dn6Ac4FvW2t9c3iIgYp7hn98iHd5cGuHgo6CiHCAd32TiYp9c21qdoCAdXVdaWl5cVpXflRbcmZNW3NyZlxKcnlxXVtbWl52gHZpWmJbZ2ZvY2pOWGZRPV5mXV52Zl91cVtZVW9kWmRxelxoXmBnbWdqa2lweH2ObWqChIB5boF7fYF/gnp1goGMk4VwgItud32Ae3uIk4mAaXt9a3R8coZ7c3Z9f4x6eIR+fGuMjISbnZaMgoFtjX5saX+Pjnx+f4OUgn99iohrdXFnaWNbY2dzb2BhbHRhaHCJemFzdF5iY5ugkG5dNluwtnVqgIl+lId3iJmHdZCMindwbYWChnR5iXiJfZOIen9zZ3aIfXyWbm+FfWh2eW5leomFpYeAh42JfW19dH5/e4qXhoGSkJiJi4WKfJCKcXx+hnxpfm1rgHt5anp2goeBcmB3gn5yZHJndoNudXyGlZKCfYKAcHd6fHV+bVdtfXVziYCFdoZ0gol6d3JtiH+Of4NxfXt8kIeHeW1taGyCgXVuXWhndXJSXH1PXXJdT1xzcGRWS3R5a1hZWVpicoF2YV5dYWdkaWpmT1poTkFhZFxgd2FcdW1YWFN1Ylplb3NYal9iaGtnbWxpcHd8k2xphIp9fHB/fnuBf4J6d4CAiYuEcnuHb3F3hH97iY2PhGp+e254eXeKd314gIKHf4R+fnpthIyImKONhYR8dot6a22FiZN6fXuCkoCAfoqEcHJwY2ZeWWdfcHBgYWhwZmpviXRhdG9bYGRqdnt/v52opcm4coWEdJV+eomVhHSSjodyc3CEeoJzdYZ0iHeUiXl5cWR3hnl/kmhxg3Vmd3ZkanyEiJ6CgH+Ojn1xfnKDeH6QjoJ3lYyUkIiCiHuJimx5eoB1aHtpbH95c2l6doCDfWhgd4h9a2p0aHuBanaCjZGVf3x+fnF8dnx0fmJVdXtxcoeCgXuBcIaJd3hvb4KBi318d3x6c4yEgHVncGdsiIFycF1oY3RvTGZ3TV9vVlRadG5iUU91eWJSWFhdYnGDdFxiXWllZWNrZFJccUlEZGJcZHFeXHhoVVdWeF5cZm5pV2xeYWpnZW5uaHB3epNuaYiMeX5ze355goGCfHZ9g4iGg3B2g3Nud4KCfoiLlH9xgHx4enqBi3WDeH+BgYKEeoB1b32Ki5ueiH6Ge3eGfGh1h42Sen+AfImGhHaPgGdwbmBlXFhmWW1zYWFhcWxsaIluYHNpWF5jbYB3qdqpyIeIs3KKeXGPdn2JkYF7lIuAdXR1fnZ/b3B/bYV0lIZ4dWxgeYF5iI1lcYJuZ3VuW219gZCTgIF5kpJ9d3pshXR/j4qDcpWJkY+IhoZ7f4ZtdXd/bWh3ZW18dm1qd3Z/f3xgYniGemh1dmN+fGh1h4+Oln11gHZygHp9bYBZVnJ9b3OBhX1/d2uIhnN4anR/goJ8eXt3enGJf3tyZnNkbYuEbHNbamB2Zklvb01cY1hXVnltYlBTdXdZUVZYXmFyhXBdYWNtZWNeb2NVXnJHQmZfXmdpXVp7Y1JWXXZbW2drYVdrYGBuZmZscWhwdniPdGuOjXZ/d3h9d4GDgXt0fYOIiINvcX91cXV9hYGJjYt7d394hHx9hYd4iHx9gX2EgHt+cnZ4i46fjIl7ind1g3pefoeajXqHhHSGh4V3iXtibm1cYltbYVVqdGRgW2hvcGeHcWFxZldcY2t/fMrOh7qia25vi25yhXN+hox/e5OFenl0enV0empsdmOEdpKCdm9nX3yBeYuIZHGAampxY1hte4aciYOCcpeTd317bYZvgImKhnCWjpCIhoyEe3l/cnJwfmdocmNueHFqbHF3fXx5XWV6gHhpdXlngndodYiMjpV9c4dqb36AeG59XVdwfW1zfoh6gG5uin9wdmZ2fn9+gHV6b3lyhXp4cWVxYG2MgWtyWGtfeV1JcGxPWFZfVVZ8a2JPVHZzUlJUV15jdYZqXWFra2ZjWm9iWWNwR0FoXWFnX1xWfF5PVmZxWltqaF1YaGFfcmZqaHFncXN2h3lulYp1gHt3fnmDh4B1c3+FhY6DcHB7eHd1eYaFh4yGenx/dYt+fYaDhId/fn59hn98eHZ5dpKUn36NfYtudYB6ZISImIZ0kopvhYaCeoN1Y25qWV9bXV1VaHNlYFlkcnJngXJha2RXWl9pf3i+rnufuG5idIdpdX1ze4WIe36NgHd4c3dvenZlam9hh3WOgXNqYl59d3mLgmVwfWdra1tWb3iLpIGFf3CZknF/d3SAbH+Aj4Zyk4eMiIWJhX15dXNwaXpham1hbXZqZ2treXd6d1tnfXx5ZnJ+boV0ZnaGjYaWgHCLZ2t7g3RsdWJbbnpqc3qJeoBldIZ8bXBndH12fH5wemp5eX94dm9ka2BtiX1sblZqYXhWTGxtUFNQaU5ZfWhiT1V2bE1RVFVfaHeEZ15hcWlnYVdpXV1saUpEalpiZVdZVXlaTldva1ldbGVdWmVjXnRmbGVxZnNwdIF4cJmFdoB/eH98hYd9dXOCh3+Vg25zeXt7c3KFhoiJhHmBfXaPf32EiY6EgYN6fouDe3d8d3aanZh6ioOHanZ+fW2FhZWBc4+CcYaCf4KAcGZsZ1hdW1xbVGVwZV9YY3J1aXZwZGViV1tbaH9wb3KAc4plZnp/anZ3dHSFhniChXp3dHZua3pwYWhrZ4Z0jYNtZ15ffG96iXxobHdmamRWV3Nwjqd9hHx2lpBze3F7eGx5eo+DdZd7iIaEh4R9dXFzbWh1XW1pYGx1ZGdmaXpve3JZZ4F2dWhwgXiCd2N4hYt9lYJvjGtte4FxZnNlYGt4ZnB1iHl8YXWDdWlrcXR5b3h3cntlfX19dnVtY2RgbIZ8bWtWamNyVExrbFBNT3BHXnxmYU5WdWVLTlRYYWx4f2ZeZ3NqZWBXZFhjcl5MS2tZZGJWVFVzVk1Zd2VaX2xgXFtkZV93Z21ib2l0b3F+dXSZgXiAgXiAf4aEen12goN+mIVucnR8e3VxhYWOgoF6i3V0kIB9gZWOgIWEfH6Mhnp+gXZ7o6aKeYmGhWx1fHx1hIONe2+GdHqFfYKDdW5qaWVWXVtbWlNjbmVcWWJ0e2pobWhgYVdeWmmAaWtwgGhtYml7emt1dXVwh4J6gX53dm57aGp5al9lbmiBd5CEZ2VYYXZpfYZ5bmlvZmZdVVhvaI+od4F6fJCOeHRufW1xdHiNfneUdIaDgIaJdmpzd2hpb1xtZV5uc19nYmp4aHttW22Dc3Rqb4F+enhid4WFepGGc4hycHp/cmNxaFttdWRucYZ6d2FygG9naXhzcWt3dnN1YoJ5fXV0b2NiYmx9fGtrVWliZ1RMbmhQSFJsRWF5ZmJNVHJeSk1VWmZteXtmX21xamRdVmBWb29YS1RpWGdfWU5VbFRLXXpfXF9sXV1bYmVgemhsYW5wdm5vd3V6mH13gIF5gICHhnp5eoN9gZOEcXR0f3p2dIWIkH6BfZFsc5WBe4KfhX+HfYB+hoKAint1hKyff3qIiIRscoJ6doGAgnVviG99gHSKgGpvbmVkWF9aWlpVYmpnXFpfdYJpXm1sXGFXW1xrgWVydH1qal5teHdodXhzb4d8fn56dnNsemhpd2ddZHNneneSgGNjVGRvZoGEdnZmaGlhV1ZZaGSQqG9/d3+Kjnpwb3tmd215inp2jnGEfn+Ah25kd3RlaGldbGJecHBbZ19tdWV6aF10gG5ya3F7f3Z2ZHWGjHyJiIB/eHJ1fnRhcGxYcHFhbm+CenNjcYBrYGx6bmloeXdzcGSEdHh4dG9jYGNtc31qbFRpXl9VTHVjUUdXYkdjd2ZhTFRxWUtMWFlpbXd7ZWVucmZjWlheWXdmVUtdZFhpWFpJV2VRSWN4W11fbVteXGJkXn9pamBudHhtb252g5d5coGAfX+JjIZ+dXaGeIaMfXR1dYJ5enqCjI59f4WJanSWgXuKnX1+hXmAe358holzcY+ujHx8h5B+ZnGIenR+fXdzcIZtfH5tkHpjcHBiZV1lVlpZV2Nma2BdXXSGaFhwbVteWFpcbHticXd2bWNcbnR1aXZ3cm6GeX+Bendvb3RlaHRlW2d1ZnZ2kXlfXVNlZWqCgXN8YWJpXFRYXmNkkKVpeXSChZB4bG15Zndse4N5dIdygXl9eYBpZXdtYGdhX2tgXnVrWWZdb29iemVbd3xrbm9weHl0dWZzg5OAiYOJenZvcn1yYXhjWW5uYG9wgHpzZXGAZF5tdWhjZnh6cmxtgXNxe3FwYV1kbW99ZWlUaFlaVU55X1JKWllIY3VkYUpVblVKTFtXam1ze2RsbHVjYVlaXGJ3XFRMZF5ZalRXSFlhTkhqdlhfYW5bW19iY12FaWhibnh5bW9qdoGQeW6DfoCCkoiEgXZ1iXSMhnRxdnaBd319foyPgX+TfnB4loN9mZJ5gIB4eX5/c4eEc3CZont7f4mWeWV1iHpzeXdsdHB/bHl8cJJzXnBvYWdibFRbWldpZG1mXFxyiWVTcm5bWVhXYGx2Y2p1ampfW251c251dHVrh31/gXx3b25sZGlwY1trcmR0do5zXFdUZGBxf35xgVxhY15TWmFcZJOfZXJxhYOQc2tqeGxubnl5enGAdn9ze3p7ZGZ2aF5jW2FoXF93aFdiXnBoYXdhW3x2ampybnh0dHVqcoKWhId/hXZzanB8bWZ3V1tpbGFvcX95c2VvflpgcHBhXmlvfGtqcn1wb3ZqcGBaZGtte2FnVGdVWFNRd1xSUFlSSGRzYmBHVmxRSVBaVWtsa3xlbW9yYVtaWFptcVhTUGdYV2lUVUdaXE9Jc3VYYGNuY1hhYWFejGpjZW16eWxvaXZ5hntrhH2AhZl8goR5fYhtj4Zxb3Z6fXSCgn2Lj4ODl3R4gpSFgZ+JdYGAgXR/gnCHg3Zvopd0e4aMh3tmd4tvbnxwZ3hxe2xzdnONa150b2JnZmtTXlxWaGJsbFtccYxkTm9tXFZXVWdpc2hjdGVlXlpwdnBydnZ6bIh9f32Id5BzY2Rrb2Fcbm1jc3iHa1pUVmJjd3x8cIRcY15jVFtgWmOXlWNucIKFiXJpZnluZHJ1cXpreXR1b3t/dl9nc2RcX1diZFlidWVVX2BtZGFxXV1+b2hpc3F0cXV3bW2FlIOKfIVxcmdufG9xb1JaZWlkcHJ/dXNibHVVYnFqW15uZHtka3V8cHFxaW1fWGNpanheZlVkVVdRVm9YUVdUUEhlcl9hRlhrT0lZVFZuaWR8aWx5a2JXXFZcdWVUUlZpUllnVVRJWltQTnl3W19lbWpaYmFeXo9uYmdsenZub2l2dn9+bYSAfoaXe3+HgYp/a5OIcmd0gHt1gIN+iY5/jJNzfYqRhYefhnt/hoxzgIZzfYJ1bqSMc4KNjHd4bnqNYGV9cWd6dHltbXF3g2dkfG1kZ2doU2BfVWdgbG9cXm6OaE1pbGBVVlNvZ3NrZnhlZl5acnZvdHx5dG6Ke393nHt6a2FlbG1eYG5qZXF5fmdaVlhfbHh7em+DXmFdaFZYYFhknIhia3CBhnx2a2p2bFt1cGp5aXVybm98gXNZa25gWV5WY2RZZXFjVF9iaWFibFpgfmtmbHR1b214d21pho2AinuIbXFmcHtscWxhWF9nZm5ygHNyXmlsU2VwZFVibWF4YW90enRpbmtqX1dgZmh1XGRWYlZUT1lnU09dT1BIZXBdY0daak5KYEtYbWVfeGlvf2VgVV5UXnZcVVJgZ1BeYlVUS1xaUVp2dl1fZm1oWGNhW16OcWNoanhyc21ndnN5g3OCg3uIjn58ioiOeW6PinRsc4J0f3+IhYeShJWPen2Mj4iRm4SAfI2Ecn+Bc3R3cW6Tk5OTk5OTk5OTkpKSkpKSkpKSkpKSk5OTkpKSkpKSkpKSkpKSkZGRkJCPj4+Pj4+Ojo6Pj46OjY2Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2NjYyMjI2NjY2Njo6Ojo6OjY6OjY2Ojo6Oj4+Pjo2NjY2Oj4+Pj4+PjoKAfnp6fX5+fX1/fn59fn5+fn5+fn+Af4CAgIGAgIB/gIGBgYOHjI6Ojo6NjY2NjY2NjY2NjZKSkpOTkpKSkpKSkpKSkpGRkZGSkpKSkpKSkpKSkpKSkpKSkpGRkZCQkI+Pjo6Ojo6NjY6Ojo2NjY2Njo6Njo6OjY2NjY2Njo6Ojo6Ojo6NjYyMjY2MjIyNjY2Njo6Ojo6NjY2NjY2Njo6Ojo6OjY2NjY2Ojo6Ojo+Ogn99ent8fn59fX5+fn5+fn5+fn5+f4B/gICAgICAgH+BgYCBg4aMjY6NjY2NjY2NjIyMjIyMkpKSkpKSkpKSkpKSkpKSkZKSkpKSk5KSkpKRkZGRkZKSkpGRkZGQkJCQj4+Ojo6OjY2NjY2Njo6Ojo6OjY2NjY2Njo6Ojo6Ojo6Ojo6Ojo2NjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Njo6Ojo2NjY2NjY2NjY6Ojo6Cf3x6fHx9fn19fn19fX59fn5+fn5+gH9/gICBgYGAf4CAgICDhouOjo2NjY2NjIyMjIyMjIySlJOTk5OTk5OSkpKSkZGSkpKSkpKSkpGRkZGRkZGRkJCQkJGRkZCQkJCPj46Pjo6Ojo6Ojo6Ojo6Ojo2NjY2NjY2Ojo6Ojo6OjY2Ojo6OjY2MjIyMjIyMjIyMjY2NjY2NjY2NjY2NjY2Njo6NjY2MjIyNjY2Njo6OjoN/fHp8e31+fH1+fXx9fn59fn5+fn5/f3+BgYGAgICAgYCAgIOGi42NjY2NjIyMjIyMjIyMjJA/LzExMTAvb4eEhISEiF0tMDAwMC1GoaGhoaGhoJqZmpqampqKg4SEhIOEd2VnZmZmaFxDRERERENHZGhnZ2dnaE1CQ0NERENYaGZnZ2dmb4SDg4ODg4OLjIyMjIyMjY2NjYyMjY2NjY2NjY2NjIyMjIyNjY2NjY2OhX19e3t6fX58fH59fX1+fX1+fn5+fn9/f4GBgYCAgICBgICAgoWKjI2MjIyMjIyMjIyMjIyMjy0aHR0dHBpohoKCgoKGUxgdHR0dGTekpKSkpKSjnJycnJycnImBgoKBgYJyXV9fX19hUjQ1NTU1NDlcYF9fX2BhQTU2NTU1NE1hX19fX15qgoGBgYGAgYqLi4yMjIyMjIyMjIyMjIyMjY2NjY2MjIyMjIyMjY2NjY2GfH16enp8fXt8fn1+fX59fX5+fn5/f3+AgYCBgYGAgIGBgYGChYqNjYyMjIyMjIyMjIuLi4uRiYeHiIiIh46QkJCQkJCMh4eHh4eGiZKTkpKSkpKRkZGRkZGRj46Ojo2NjYuJiYmJiYmIhYaFhYWFhoiJiImJiYmHhYWFhYWFh4mIiIiIiImKioqKioqKi4uLi4uLi4uLjIyLi4yMjIyMjI2NjIyMjIyMjIyMjY2Njoh8f3l7enx8e319fX18fX19fX5+fn9/f4CBgYGBgYGAgYCAgYKFioyMjIyMjIyMjIuLi4uLi5GTk5OTk46RkpGJh46KkJKTkYuQjouNhYqRkZGRkJCQkJCPj4+Pj4+Ojo6Njo6Ojo2Njo2Njo6Ojo6NjY2Njo6Ojo6Ojo6Ojo6NjY2MjIyMjIuLi4uLiouLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyNjY2NiX59eHh5fH18fX19fHx9fX59fn5+f3+AgICBgYGBgYCBgIGCgoSKjIyMjIyMjIyLi4uLi4qLkJCRkZGPhI6QkIaKj4WNkJCLhYiHio6IiZCQkJCQkJCQkI+Pj4+Ojo6NjY2NjYyMjIyMjIyMjIyMjIyMjIyMjI2NjIyMjIyMjIyMi4uLi4uLi4uLi4qKiouLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjI2Lfnx3dnh7fXx7fX18fH19fn5+fn5/f4CAgIGBgYGBgIGAgIGChIqMjIyMjIuLi4uLioqKioqQkJCQkIqFjoiOhoaPiY2QkIiFhYWIj4mMkI+Pj4+Qj5CPj4+Ojo6OjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLi4uLi4qKioqKi4qKi4qKi4uKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIt+e3d2eHt8fHx9fX19fX1+fn5/fn9/f3+AgIGAgYGAgYCBgYGEiYyMi4uLi4uLioqKioqKipCQkJCPhYOMjpCOiYyKjpCQiIWHh4iMiI6Pj4+Pj4+Pj4+Pjo6OjY2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKioqKioqLi4uKioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMin58dnZ4fHx7fH19fX19fn5+fn5/fn9/f4CAgYCBgYGBgIGAgYSJi4yLi4uLi4qKiomJiYmJkJCQkJCMhoyJjoeFjYmOi4yLhImIhYyIj4+Pjo+Pj4+Pjo6OjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKioqKioqKioqKi4uLioqKioqKioqLi4uLi4uLjIyMjIyMi4uMjIyKf353eHp7enp8fHx7fX1+fn5+fn9+fn9/gICAgICBgICAgYCBhIqMi4uLioqKioqJiYmJiYmPj4+Pj5CMjouPjIqPjI6MjY+KjoyLjYyOj46Ojo6Ojo6Ojo6NjYyMjIyLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLjIiAfXh5enl5e318e3t9fn5+fn5/f35+f39/gICBgICAgIGBgIGEiouLioqKioqJiYmJiYmIiI+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Ojo+Ojo6Ojo6Ojo6Ojo2NjYyMjIyLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLioqKi4uLh4B8eHp6eXt8fHt8fH1+fn5+fn9/fn9/f39/gIB/gYGAgIB/gYSJi4qKioqJiYmJiYmJiIiIj4+Pj4+Pj4+Pj46Pj4+Oj4+Ojo6Ojo6Ojo6OjY2NjY2NjY2MjIyMjIuLi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKiYmKioqKioqKioqKioqKioqKioqKi4uHgHt5eXh6fHx6e3t9fX5+fn5+f39+f39/f39/f3+BgYCAgH+BhIiLiomJiYmJiYmJiIiIiIiOjo6Ojo6Pj46MjI+Sj5COjo6Ojo6NjY2NjY2NjY2NjIyMjIyMjIuLi4uLioqKioqLi4uLi4uLi4uLi4uMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKiomKiomJiYqKioqKioqJiYmJioqKioqKioqKioqKioqKioqKi4aBe3h5eHp8ent7fH19fn5+fn5/f35/f39+fn9/f4CAgYCAgIGEiIqJiYmJiYmJiIiIiIeHh46Ojo6Ojo6Ojo+MkJOQkI+Ojo6NjY2NjY2NjYyMjIyMjIyMjIuLi4uLi4qKioqKioqKi4uLi4uLi4uLi4uLi4uMjIyLi4uLi4uLioqKioqKioqKiYmJiYmJiYmJiYmKioqKiomJiYmJiYmJiYqKioqKiomJioqKioqKhYB6eHl5fHt6ent8fH1+fn1+fn9/fX9/f35/f39/gICBgICAgYSIiomJiYiIiIiIiIeHh4eHjY2Ojo6Ojo6Pj4+PjoyNkI2NjY2NjY2MjIyMjIyMjIyMi4uLi4uLioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYmJiYmJiYmKioqJiYmJiYmJiYmJiYmKioqJiYmJiYmJioqFf3l6eXh7e3p7fHx7fn5+fX5+f39+f35/fn+Af3+AgICBgYCChIeKiYmIiIiIh4eHh4eHh4eNjY2Njo6Oi42Nj5WPiYyPjYyNjYyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYR+eXt5ent7ent9fHt+fn59fn1+f35/fn9+f3+AgICAf4CAgICEh4mIiIiHh4eHh4eHh4aGhoyNjY2NjY+MjImKj42IjJGPjY2NjIyMjIyMjIyLi4uLi4uKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uKioqJiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJg355e3p8e3p7fX17fH9+fn5+fX5/fn9+f3+Af4CAgH+AgH9/f4OGiIiHh4eHh4aGhoaGhoaGjIyMjIyLiYyKiIeJhoyOjJCMjZGOjIyMi4uLi4uLi4uLi4qKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiImJiYmJiYmJiYmJiYmJiYmJiYmIiImJiYmJiYmJiYmJiYiIiIiIiYmCf3h7e3t6enx9fHx9f39+fn19fn9/f39/f4F/gIB/gICAgICAg4aIh4eHhoaGhoaGhoaGhoWMjIyMi4yOjoyKioeEiIuKjIuNjo+Li4uLi4uLi4uLi4uLioqKiomJiYmKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiomJiYmJiYiIiIiIiIiIiImJiYmJiYmJiYmJiIiIiIiIiYmIiIiIiIiIiIiIiIiIiIJ/eHp7enp6e3x8fX1+f35+fX1+f39/fn+AgICAf3+Af4CAgYCDhYiHh4aGhoaGhoaFhYWFhYyMjI2NjJCSjI2Ii4mJi4uLi4mLjIqMi4uLi4uLioqLi4qKiomJiYmJiYmJiYqKioqKioqKioqKioqKioqKioqKioqKiYqJioqJiYmJiYmIiIiIiIiIiIiIiImJiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIiIiIiIiIiHgXx4e3x5enp8fHx8fX9/fn59fX9/f39+fn+Af4B/f3+Af4CAgIKEh4eGhoaGhYWFhYWFhYWFjIyNkY+PjZGJjIaJjIuIiImMiYeNjo+NioqKioqKioqKiomJiYmJiYmJiYmJioqKioqKioqKioqKioqJioqKioqKiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4WAenl9e3t7enx8fHx+f39+fn19f39/f35+f4B/gH9/f4B/gH+AgoSHhoaGhYWFhYWFhYWFhISLi46PjoyLj4iHiYmMjYWFjo2KiYyNi46KioqKiomJiYmJiYmJiYmJiYmJiYmJiYmKioqKioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHhoaHh4eHhH55eX16enp7fXt8fX5+f35+fX5/f39/fX5/f3+Af39/f39/f4CChIaFhoWFhYWFhYWFhISEhIuLjI6MjI2Lh4mIiomHgoiNjoiKi5GTj4uJiYmJiYmJiYmJiYmIiYmJiYmJiYmJiYmKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIeHh4eHh4eIiIiIiIiIiIiIh4eHh4eHhoaGh4aGhoaGhoaGh4eDfXp5e3p5enx8e31+fn5/fn59fn9/fn9+fn+AgICAf35/f39/gIKEhoWFhYWFhYSEhISEhISEioqOjYmIiIqKh4iHiomIioiIh4qGi5GPiomJiYmJiYiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHh4iIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGh4J8eXl6eXp7e3t7fX5+fn5+fn59gH9/f39/f4CAgH9/fn9/gICAgoSGhYWFhISEhISEhISEhISKi5CPiYmJi4qHh4WHiYuKiYSLjYmOjYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiIiIiImJiYmJiYiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGgXt4enp4e3x7e3x+fn9+fn5+fX1/f39/f3+Af4B/f39/f3+Af4CChIaFhYSEhISEhISEhISEhI+Qj4+IiYuIhoeIiYuLjIuJioqNio6Oj4iJiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoaAe3h5eXh4enp8fX1+f35+fn59fn9/f39/gIB/gICAf39/gIB/gYKDhoiGiIaDhISEhIODg4ODkpKOioeKi4qLh4uNiYqJi4iHiouIio+SioiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhn96eXh4eHl5eXx9fn5/fn5/fn1+f35/f3+Af39/f4CAgH+AgH+BgoOHjo+PjoiHhIWFhoaFhYWSkI6KiYmIiImKioiIh4aKjIiHiYmOkJGNh4iIiIiIiIiIiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4aGh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWGf3l4d3d3eXp5e3x9fn9+f35+fn5+f35+fn+Af4CAgICAf3+Af4GBg4eOjo6Ojo6Mjo2OjY2MjZCQjomHhoiJiYeIiouIiYyJiYaKjY6PkYuIiIiIiIeHh4eIiIiIiIiHh4eHh4iIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhYZ+eXd5d3d6eXl8e31/fn5/fn5+fn5+fn9+f4B/fn+Af39/f39+gIGEiI6Ojo6Ojo6Ojo6Ojo2NkJGOi42JjIiIiYaHiYaIioiHi4yLjpCQiIeIiYmJiIeHh4iIiYmIh4eHh4iIiYiIiIiIh4iIiIiHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhoaFhYaGhoWGhYSEhIWFhoaFhIWFhX55d3l2eHl4e3x7fn5+fn5+fn5+fn5+f39+f39+f39/f35/f3+AgYOGjY2Ojo6OjY6NjY6OjY2Qj42Ni46KhoiKhISLiYeDhYSDi4mLj42JjI6QkI+NjYyLjY6Pj42NjI2Nj4+Pjo6MjYyMjY2KiYiHiImHh4aHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoeHiYqKiIeJi4yNjo2LiImLi42OjYyJiImMgHl3d3Z6eXh7e3t+fn5+fn5+fn5+fn5/f39+fn5/f4B/f4B/f4CBg4aMjY2NjY2NjY2Qj4+Pj46NjI6KiYuMjIeFiY2Lh4aIh4aHh4uNjo6Pj4+Pjo+Pj4+Pj4+Pj4+Pj4+Ojo+Pj4+Pj4+Pj4+Oj46Oj46Mi4uJh4eHh4aIhoaGhoaGhoaGhoeLiYeHiIiLjY2Mi4yLjY2Ojo+Ojo6Pj46Ojo6Ojo6Ojo6Njo6NjY2AeHZ4eHp4enx6fH5+fn5+fn5+fn5+f39/fn59fn9/f39/gH9/gIGDhoyMjIyMjY+QkpOTk5KSjYyMjIqHioyKh4eJiYWCiouIiYWJjpCNjo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjI2NjI2LiYaHh4eHiYqLjY6NjYyNjY6OjY2OjY2NjY2NjY2NjY2NjY2OjIyNj4+OjY2MjIyLi313dXd5enp7e3p+fn5+fn5+f35+fn5/f39+fn1+f39/gICAf3+AgYOFj5KRkJGSk5OTk5OTkpKLi4uLiomMiouLiYuKhoeOjYiIjI6OjIuMjIyNj46Njo6Ojo2NjY2MjY2NjIyMjIyMjIyMjY2NjYyMjI2NjYyMjI2NjIyNjIyMi4yMi4yMjI2MjIyMjIyMjIyMjIyLi4uLi4yNjY6Sk5OSkpSRkJOVlZSTk5COjo6Oe3Z2d3h6ent7e31+fn5+fn5/fn5+fn5/f35+fn9/f39/gIB/f4CBgoSNkpKTkpOSkpOTkZKSkoqJioyJi4qJjIuKioiHiYqKi4mKjY2Mj46Nj5KUlJOUlJOTkpGSkI+Ojo2NjY2Pko+OkZGOjIuKioqLi4qKi5CPjoyMjIqKioqKioqKiouKioqKi4yLi4uMjIyKiouLi46RkpOTk5SUk5STk5SUlJOTk5KSkpKSk5F6dXZ2eHt7e3p6fX5+fn5+fn5+fn5+fX5/fn5+f39/f3+Af39/gIGChIuRkZGRkZKSkpGRkpGRiYmIiIqMiYiJiYuJhoSJhoyKh4ySkpKTk5OUlZWWlZWUk5OUlJSUlJSUlJSVlZWVlZWUlJOTkY+QkZKQjoyRlZWVk5KSjo+QjYqKi4qKi42OjY6RkpCRkpKSkpGRkpKSk5OTk5OTk5OTk5OTkpOSkpKSkpKSkpKSj3h1d3l6e3t7ent9fX1+fn5/f35+fX5+fn5+f39/fn9/f4B/f3+AgYKEi5GQkJCSkpKRkZGRkZGIiIiIi4uJg4eLi4yMiIeHjYyNkpSSkpOTlJWWlpaVlZSSkpOTlJSUlJWVlZaXlpaWlpWUk5SUlJSVlJSUk5OVlZWUk5KTk5OTkJGSkZGSk5OTk5KSkpOSkpKSkpKSkpKSkpKSk5OTk5SUk5OSkpOTkpKSkpGRkZGPdnJ3enp7e3t8fX59fX1+fn9+fn9+fn5+fn6Af39/f3+Af3+Af4CBgoSKkJCRkZGRkZCQkJCQkIeHh4eIiIiFi4+KjI6Njo+OkJWUk5OTk5SUlZWVlJSUk5KSk5KTlZSUlZaWlpaWlpaWlpSTk5OTk5OUlJOSk5SVlZSTkpKSkpOTk5OTk5OTk5KSkpKSkpKSkpGSkpGRkZGRkZKTlJSUlJSTkpGRkZGRkZGRkZGRkYx0c3d6ent7e3x9fX1+fX5+f35+fn5+fn5+fn9/f39/fn9/f39/f4GDhIqQkJGRkJCQj4+Pj4+Ph4iKi4yNjYuOj42Mjo6RkpGSk5OSkpKSk5SUlJOSk5OTkpKSkpOTkpOTlJWVlZWUlZWUk5OTk5KSk5OUk5KTlJSUk5KSkpKSk5OTkpKSkpKRkZKSkpKSkpKSkpKSkZKRkZGSkpOTlJSUk5OSkZGRkZGQkJCQkZCRinN0dnp8fHp7fXx9fn59f35/f35+fn9+f31+f39+fn59f39/gH+AgYKDipCQkZGQj5CPjo+Pjo+Oj4+Pj4+Pj4+PkI2OjpCRkpKSkpKRkpKTk5OTkpGSkpKRkZGSk5KTk5OSk5STk5OTlJOSk5OTk5OTk5OSk5OTkpKSkpKSkpKSkpGRkZGSkZCRkZGRkpKRkZGRkpGRkZGRkpKSkpKSkpKSkpKRkJCQkJCQkJCQkJGGc3V2e3x8e3x9fX1+fn1/f35/fn5/gH9+fX5/fX5/fn5/f3+Af3+BgYGKkI+PkI+Pj4+Pj4+Pj4+Oj46Oj4+Pj5CQiI2PkJGRkpKSkpOTk5OTkpKSk5KSkZKRkZKSk4iFk5GRkpKSkZKSkpKSkpKTk5KRkZKTkpGRkpKSkpKRkJCQkJGRkZGQkJGSkZGRkZGSkZGRkZGRkZGSkpKSkpKSkZCRkZCPj4+Pj4+Pj4+PkX9ydHh8fHx7fHx9fX5+fn9+fn5/f3+AgH99fn5+f39+f39/f4CAf4GBgYqPj4+Pjo6Ojo+Pj46Ojo6Ojo+PkI+Pj4+GjpCQkJCRkZGRkZGRkZGQkJCQkJKCgpKQkZGOdYaRkJCRkZCQkJGRkZGRkZGRkJCQkZGQkJGRkZGRkI+PkJCQkJGRkJCQkJCRkJCQkJCQkZCQkJCQkJCQkZCQkJCPj4+Pjo+Pj46Ojo+Pj4+PeHJ2eXx9fHp9fH19fn5+f35+f39/f4CAf35/fn5/f35/f39/gIB/gYGAio6Ojo6NjY2Ojo6Ojo6NjY2Oj4+Pj4+PjoiQkZCPj4+QkJCQkJCQkI+PkJCPkIhwhZCPkHx1iJCPj4+PkI+PkJCQkJCQj4+Oj4+QkI+PkJCQkJCPjo+QkJCPj4+Pj4+PkJCQkI+PkI+Qj4+PkI+PkJCQkI+OkI+Pj46OjoyMjY2NjIqDiYhzc3Z4fX58eX18fX1+fn5/fX5/fn9/f39/f4B/f39/f4CAgH+AgH+BgYCJjY2Ojo6Ojo6OjY2OjoyNjY6Ojo6Ojo2NiJCRkI6Njo6Ojo6Ojo6Pjo6Ojo6PjHNvio+KcniHj46OjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Pj46Oj4+Pj4+Pj4+Pjo+PjY2MjYyNjoyLi4mJiYiFhYSDgoKEgnR5fXp4dXJrZWltb2xmZmdncHNzd3l9fnl6e3x9fX1+fn59fn9/fn9/f39/gIB/f3+AgIGAgIB/f4CBgImNjY2NjY2MjYyMjIyMi4uLjYyMjIyMjIyGj5GRjIyMjIyMjIyMjIyMjIyMjIyNd217j4JzeIaNjY2MjIyNjY2NjYyMjI2MiomKi4uJh4KAh4iEgXt6gH57fXx8fXlzcnJycnV1cG1ramppZ2NkYV9bXF1eWFVXWFlTS0VJSkpLTE1PT0tgdHR3eX19eHp5e3x8fX5+fn1+f39/f35/f4CAgH+AgICBgYCAgICAgIGAf4OEhYSFiIuLjYyMjIuLi4yGiYqKioqKh4OOkJGNiouLi4uMiYmKioqKiouLi4dzbm+Ee3V2gIWDhIeJiYWCg397fHl6e3pzcHFxcW1samdsbWdlZmVmZGNlZGVkZWVlZWRkZGNhYV5dXFlYWFdUUFFSU1JTTU1KSUZFSEpHR0hHR0xOSWdzdXh6fXp4d3l8fHx8fn5+fn9/fn9/f39+f4CAgIB/gICBgICAgICBgYFnXmBjYWNucX17ent/fXd8fHZ4ent4eHpvcXt4eXt8e3h3e394dXd0dHZ1dXZ3dGJeZF9ibHFmaGtsbm9tamlpaGhlZWRkZF9gYWJgYF5dWVhaWltdXV9gX2BfX19gYmFeXl5eWVldXF1bV1dWUlRSU1NOUUpISUZERUhMTEhGR0lLSklNbXJ0eHp7end3eXt6e3x+fn1+f39+f35/f35+gIGAf3+AgIGAgICAgICCgWdYW1pZXFtcY1xaXF5ga3FtcHBvbm5vbmtpbmxrbG9qaWtraWpraWZmZ2dnaGhiXWpsXWZmZ2VjY2JhYmBgXVhbW1dYV1RWUVBUU1NNSkxLTExOTk9UWFhXVVVUUlBQTU1QT05LTE1QUU9MTEpHSUlHSEhJSEhIR0ZHSElKSEhISUlISVZwc3V5ent5dnZ5enp7fH59fX5/f35/fn5+f3+AgX9+f4B/gICAgICAgIGBbFtYVlZWWVlaWVlYVVZoamxubmxra2poaGloZGVkYlxiZl9fYWNfXF9dYF1eWlpqd21ibnJqYVlZX1tYV1NOTUtLS0tMSUtNTktKS0tMSktQTEtLRkdHSUlGR0lISUZFSEdGRkVERUVEREVJSUlHSEdIRkZLTUtJSUlIR0hLTU1LTExMVXFzdnl6e3h2d3h3ent8fn1+fn9/f39+f3+AgIGAfn5/f4CAf4CAgIB/gYJoUlRVVlNVV1lZWVdXV1tbYWNfXlxbWFZWWVZSVFJRUVVUU1NUUE1KTU5QUk9NW2tybGFtdXJmUVFTUFBOTk9NSk1MS0xKSktLRklJSkxJR0pISUlFR0dGRkVFSElKR0ZHRkZHR0hKR0dISEpMSkpLSUlISktLSkhKS0pISUtMTU9QUEtUdHN1eHp6eHZ2d3d6enx+fX5+fn5/f35+fn+AgYB/f3+AgYB/gICAgH+AgmlQUlRXVVRWWVdYWFpbVFRTUlBRU1FRUU9OTlBQUU9MTlBPTk5NTEtNTk5QTU5dY29rWWlzdXBTTU9QUFBPTk5PTk5QTk1NS0lISEpJSUlJR0ZHR0dJSkhJSEhJSEhHSEdISElISUxLSklISkpJSkpIR0pMS0pJSUhKSktMTk1NTU9RTFVzcnN3enl3dnR2eHp7fX19fn5+fn9+fn5+gICBgICAf4GBgH+AgICAgICBbE9PTlRZVVVdW1lXV1hOTUpKSUZKT0xKSkdJSk1NS0pMTUpHSUlJSktLRkJGSFViaGtvcG9tbFpMTE5NTk9NTk9MTk5OUFBPTE1MTk1MTEpJSEdJSElISElJS0xLS0pJS0pJSklJSUlJR0dKSUdJSUpKTk1OTEhJSklJSk1PT01MT1JOWXBwcnd4d3d0c3R3enx+fX5+fn5+fn5+fn9/gICAgICAgYCAf39/gICAgIFvS0pNTlFOTlVXVlZSU0lFQ0VFUkREQT5CP0RAQD5CREFAQURHRkVIRUNGR0hNWmdoZ3JubmhmZGBeXlhMSklKSUlLSkxQTk1MTU1MTU1NTElIREZGR0ZGRklKSUlLSkhMSklKSkpJSEhKS0tIRkdJSklLTU5OSktPTUxLTU1PUE5QT1BgcG9yd3h2dHJzdXd6fX19fn5+fn9+fn1/gICAgICAf4CAgIB/f3+Af4CAgXNQUE5OUE1KS1BSUE5RQ0RCQUZRRT1DPT9FSDk6Oz0/PTxBRkA+Ojs+SVpdWlxlbG5rb21tbGtpaGtkU0dFRUZFR0dHR0pHSEpLR0NER0pHQ0RFQUFDR0hHSEdISktKSElMS0lISktLTU5MTUxMSkpMS0lLTU9PUFNRT1BQTk9QUlFNUGdwb3N2dXRycXR4eX19fX1+fn5+f4B+foCAgH9/gIB/f4CAgH+Af4B/gICCdlRVUVFQT0xNUFBOT09BQkFAQkE/Oz48Pj8/Ozg5ODs7OkA6Oz48Ozs7PUtbaW1ub2pvbWtpbG1mUUdFREdJSEM/QEBAQUFCQUE/Pjw9PkFAQD8+P0BFR0dHSUtMTk1OTUxNTUpLTVBVU05MTlFOTk1OTE1NTk9OTk1LS05OTk1OTkxUbnBwc3R0c3Fydnh5fX19fn1+fn5/gH5+gICAgICAgH9/gICAgH9/gH+BgYJ4UVFSVFJTUVNTUVFST0BAPT4/PD8+QEE/PT45Ozo7Ozk5Ojg4Ozw5Nzk7Oj1IY29zbW5samtoVUM+Q0ZEQkNDPzs+PkBDQ0E/Pj9BPkBAQj9APD9CQEFDRUVFSktQT1BPTU1OTExMT1JRUFJOTExPTUtOT0xMTEtMS0tKS0tKTU1LS1xxcXF0c3RycXR4eHl9fn1+fn5+f39/fn5/gIGAgH+Af4CAgICAf4CAf4CAgXxSTU9RUFFSUlRSU1NOPDs8Ozs7P0BBQkA9PDk8PTw6Nzk6Ojk3OTo6Nzg6OTk9SmBzdHBnVD86Oz1AQUA9Ozs+PD08QEJDQT9BQkE9Pj09Oz0/Q0RCQD9BREJFR0pKSkpKTE1MTExNTExOVVNLTE1USVBKSU1KSUpLS0pJSEdKS0lKZnJxc3RzdXJydnl6e31+fn5+fX9+f39/f36AgICAf4CAgICAgIF/gIF/gYCBgFZMTlBQTlJRUFBRUU44PT88PDo9PkFAQT8+PkA/Pj48PT0/QD09PT9DOz09Pjw6Qmx8aj85Oz49Pj9AQEA+P0E/QEBBQEBAPT8/PTw6Oz09PD9AQUJCQUBCREZGRkdGR0dISUtMTExLTEtKS0lKSk1MTEpMS0lISUxMSklJSElLR01tcHF1dXR1c3V4eXl8fX5+fn5+fn5/gH9+gIB/f39/gH+AgYCAgYCBgICBgYCCYUtPT05OT1BPT1BQTzo8Pjw9Oz8+PkFBPz0/Q0NEQT89PkBBP0A7W25APkRFP0BBRF9kOz09Ozo9PkFBQD5AQD9BPz89PD48PTs7PD0+QUA/QD5AQ0NEQkRFSEVFR0hISEdGSUpJSUlJSUhKSkpKTEtKSklJSEhKSktMS0lLSkpHVnBwcXNzdHR1eXp7fHx+f35+fn5+f39/f39/f3+Af4CAgICAf4GBgICAgIGBgIJtTFBRTk9QTk5PUFBPPjw8PT4/P0A+QEA/Pz9CRkQ+PDw9QD04Ojptd0k4Ozo9PkE7SGQ9PD08ODo7Pz89PD07PEA9PTw8Pjs9PD0+QUBCQUBAP0JEQ0RFRkZGQ0VHSElJSEhJS0tMTUpKSUpNTUpLSktJSEhISEpJSktKSk5MSUlfcHBycnJ0dXZ6e319fH5+fn5+fn5/f35/f36AgIB/gICAgICAgYGAgICAgIGAgnZNTk5NTk5MTE5QT0w+QTw8PT8+QkM/PkFBQUJBQFlSPD09SUxGRXV2Tjc4ODo7Pj9XakE7PDw6Ojs+Pz89PTk6Pjw9Pj89Oz4/QEJDQkJDQ0FCQkFCQkRCQkRCRENGSUdGRkhJSUtNSklKSktMSkpJSkVESUlGRkhISUpKTEpGRmdwb3FxdHZ1d3t8fH18fn59fX1+fn9/foB+fn+AgH+AgICAgICBgYCAgICAgICBek5JS0tMTExFSUxOTTw/PDw9PkBAQUE7QkNCQ0BDc3lJO1x/g396fHdXPD0/PT0+RWh0TDo9Pj89PT5BQ0A8OTtBPz4+QT07P0JAQkNCQENDQUNBPT0+QD0/QUFBQENFRUBAQ0JDR0dFRENGRUZGR0VEQEFHR0ZDRkRHSEpHQz5IbG9wcHF0dXZ5fHx8fHx+fn1+fn5+fn5+f36Af3+AgICAgICAgIGAf4CAf4CBgIF+UUhLTU1NS0pLTE9RQD8+PkFBQEBBR0FCRENFQUdyeWtig4SDgoOAfV4+QENAQD1Kc3tZOj1BRUFCQkZIQz08QEREQUA/Pj1AQT4+Pj88PkBER0VAPkBBP0BDRkVDQkNDQEJEREJERUFCPkFCQkFCQEA9QUJDRENDQUNFR0E/PVZwcHFwcnV1d3p8e3t7fX9+fX19fX1+fX5+fn9/foB/f4CAgICAgYCAgIB/gIGAgX5SSEtNTUxLS05OUlVEQkBDQ0FBQkBCQ0BAQUFARW90fYKCgYN+fYR2TUFDRUA/Pll7gF0/Q0VJSUxRTU1LRUNGR0dFR0VFRURFQ0E/QD4+QkZKSkdFRUdGRkpOTktKSUdHSEtMSUdHQ0REREVEQUJCQ0BDREVEREVERUZDQkFEZW9wcXF0dnV4e3x6fHx+f319fX19fn59f4B/f39/f39+gIGBf4CBgICAgH+AgICAfVJJSUpKSEpKTE9SU0dGRUdIREdIREA+PDs+QEVFaHN9gXx/hH55hXJDREVEQ1d1hoeHflhHSEpOaVpPUE5JR0lISElJSEhHR0hIRUNFRUVGRkhKSkZFR0lKTU9PTU1LSktKTU5LSUhHSEhIR0ZFRkZGREZIR0VFSEhGSEdIRlFubnBxcnV2eXt7e3p9fX5/fX19fX1+fn1/f39/fn5/gH+BgYGAgICAgICAf4GBgIB8UEhHSElGR0lKTU5OSkxJSUpLTE5KRkNBQkNGSkdge4B/d3+EhYOEiWxBQVZ0h4mHh4eIg1dIS1ZzXlZRS0hISEhER0dHR0ZIRkhFQ0RERkVEREhIQ0NDRklLS0xMTExMTElKS0pKSUlJSEpISEdISUhHR0hGRkZISklJSUlIXW9vcXJ0d3d6e3t6e319fn59fX19fX5+fYB/f39+fn+BgIGAgYCAgICAgIB/gYCAgHxNR0ZIRkVGR0dKS0pMTUxLTU5NT0tJSEhKS0tMTE5bfIKCg4OFhoaIhFZshIeGhoaHiIiHfFBKWW5lXl1UR0NNRkBAQ0NDQ0ZGRUJAPj5AQUFAQkQ/Pj9ERkhERkdJSklKSEhIR0lJSkpJSEZKSkpKSUpJSkpKRklMTEpKS0tmb3BzcnR2eHl7e3t8fH1+fn19fX19fn59f39/f35/f4CAgICAgYCAgIGAgICAgICAfU9GRkdGR0hHRUZHR01NTUtMS0lHQ0NDRElLS0xLSlSBg4SEgoKFhoaEgoaFhISGhoaHh4aKdUpgYmFhY2VTTlg8PDw+Ozo8QUFAPjw5OTg8PD07Pjs4Oz9BQkBBQ0NCQEFBRERCQ0ZISUhISExNTEdJSk1NTk1KSktLSkxNU2xwcXRzc3d5e3t7fH19fn9+fX19fX1+fn5/foB/fn9/gICBgIGAgICAgYCAgIB/f39+UUZFRkdJSUdEQ0VGTk1MSklIRT85Oj5ARUhISklJZYWEhIR/gYKDgoODhIWFhoeIiIiIiYyOcWhoZ2VnaWZoRjY4ODk2NDc5Ozw6ODU2Nzc4OTc4NzU4ODs7Oz1AOzk5OT08Pjs8PUFDRUhKTUxMR0lHT1JRUFBOTE1NT1Fdb3BydHN1eHp7e3x8fn5+f359fX59fX5+f39/gH9/f4CAgICAgYCAgICAgICAgIB/f39RR0ZHSEpIRkVGR0hMTEpJSUdDQjU2OjxDQENHSUlohoSEgX6Bg4ODgoOEhomKjIyLi4mKi4yMeG1saWhpalk1NjU1ODczNTY4Ojg3NjU2NTY3Njc2Nzo2Nzg4OTo3NTc4OTc5Nzc2OjxAR0ZJRklGRUZPU1JTU1JPUFBSVGVwcXN0dHZ5e3t7fH1+fn5/fn19fX19f39/f3+Afn+AgICAgICBgICAgICAgICAgH9/flJISEhJS0lHSUpJSkpLREVIRUJANjc4OD06PUVDQmWFg4GAgoODg4ODhomLiomJioqKiouKiouJdm1tbWxsVTc4NTY4ODU1NzY5OTc3Njc2NTo5Ojo6Ozc5ODk4NzY2OTo5ODg2ODU4OTtBPT4+QkE/QUtMT1FQUU9PT1JXa3FydHR1dnp7e3t9fX5/fn9+fX19fX5/f4B+fn9/f4CAgH9/gICAgICAgH+AgICAf39+VEhHSUlMTUtKS0tMSUg/QEFAPDo1Nzk4OTc7Qjo9cYSAgYOEhISEhYaJioqIh4eIiIqKjIuKi42Icm5vb3BlQD46Ozs8OTo7OTo7Ojo5Ozo5PT09Pjs7PDw6Pjs5Ozs8Ozw7OTo8ODo6Ojo5OTk8Pzw8QUJESUpNS0lLTFdvcnN1c3Z4e3t7fHt9f39+f359fX19fn9/f35/f39/f3+Bf4CAgICAgICAf4CAgH+Af35URkVGSUxOTkxKSk1CPzo7PDo4OTk4OTo6Ojs/Pkh+hIKChIWFhYaIiYiHhoaGiImIiYuMi4qMjY6CcnJxcWNHRkNCQUI+QENBQD49Pj5APz8/QD9APT0/Qj5AQT9APz1AQEA+P0E8Pjw7Ojs6OTs/PTs8PT1BQUNBQkNBWHBxdHR0dnp7e3x9e31/fn9/fn19fX5+f35+fn9+f4B/f4CAgIB/gIGAf39/gICAf39/flJFQ0FHSk5PTElHSzo4Ojs5Ojo8PTo7Oz09P0BCUoKCgoSFhIWEhomJiIiGhoaHiImKi4uLi4yNjY1+cnNyU0tKS0hISEVGSEdFQ0FAQkVDQ0FCQ0I/QERIRUNFQ0VEQUZFRkRFRkRAQj48QD49P0A+Pz4/Pj8+Pjo7PTxgcXJ0dHV3enp6fX19fn5+f39+fX19fX5/fn5+fn5/gH9/gICAgICAgICAf4CAgIB/f4B+UERAPUNIT01HRkJEOTc6Pjo8Oz4/Pz89QUBDREZXhIKDhIWFhoaIiYmIh4aGhoeJiYqLjI2MjIyMjIt7enReZ11QS0tLSUpKSklGRERHSEdEQ0VGREJISUtHSEdGSEdFS0lLSUpLSkNGQ0NEQkFBQ0JEQ0NERENBPTs9QGhwc3R0d3d5eHt8fH19fn5/f359fX1+fn9+fn59fn+Af3+AgH9/gICAgICAgICAgH+AgH9PQT49P0RMS0BCQkE5ODw+Ozw7PkA/QT5CQkdHSVmEgoOFhYaHiImJiIiHhoaGiIiIiYqMjY2NjY2Mjol7eHtvZ1VNTE1KSktIS0dER0lISUVFSEZGRUxMTUlKR0dISUpOTU9MTE5LSEZHR0VFQ0ZGRkZERUhIRkNBP0BMbHB0dXZ4eXl5fHx8fX1+fn9+fn19fX1/f35+fn5+f39/f39/f3+AgICAgIB/gICAgICAf1FBPz4/RUdHPTxAQDg4PDs7PTo+QD4/QENGSUlQX4GDhYSFhoaHiIiIiIiIh4eIiIiJioyNjYyMjYyNjoJ4clVSUk9NTktJSUZKSUVLSUdLSklKR0dHS0xOTExISElKTVFOUE5NT0tJR0lKSElESUhIRkZHR0lHQ0JBQ1RucHV3d3l6eHl6e3x8fX5+f39+fn1+fX5+fn5/f36Af4B/f3+Af4CAgICAgICAgICAf39/VERBQUJHSEI/OD9AOTo8OD0+Oz1BPj9BREhKTFVxg4SEhISFhoeIiIiIiIeGiIiIiImJjIyLjIyMjIyMjHNbVlRRUU9MS0hHQ0hKSE1MR0tPTEtKSkxNTE9QTkhJS0xPUVFQUU9PSkhKSkxKTEZHSEdGRklGRUVCQUJCXG9yd3h5enl5eXp6e3t+fn5/fn59fX19fn9+fn9+f4CAgIB/f39/gICAgICAgICAgH9/f39VRUNFRUdHRUQ7P0E7PTw5QD4+QEJHR0FHS0xQVnmFg4ODhISGiIiIiIiIh4eIiIiIiIqLi4qMjIyMjIyNfFxbV1ZXVVFOTEtFRkdNUE9QV1VRUE9RU1JNU1RPTVNMUFNVVlJTUlBMSk1NTUtOR0dKRkZISkVERUVCRUNjcHV5eXp6ent6e3p6fH59fX9+fX19fXx9fn5/gH9/gICAf39/f3+BgYCAf39/gIB/f39/f1VGRkdHR0dIRj5AQj0/PT1CQEJCR1ZORk5QUFRYe4aDhYWEhYeIiIiIiIiIiIiIiIiJiouKioyMjI2PjIuLbF1abWJHVVNSUUs7O1NUU2B1XVVWVFZZWVJYWFJaZlBVV1pdUlRXUU9NUlFQUFFLS0tISEpIRUZJSUlISWlydnl4eXh6e3t8ent8fXx9gH59fX19fX1+f39/f3+AgIB/f39/f4CAgIB/f3+AgH9/f35+U0hKSUhHR0ZFPz9BQUVBQ0dFREVMWFJNVFVWWFp8hoWHhoWGh4iIiIiIiIiIiIiIiIiIlJyMioqMfmGKi4uHb19nWDxZWllUUT9AV1ZZXGRgVllicl1dV11aVkVRWVpbWV9UWWdSVlZYVVRWVE9PTUpMSklJTE1LT01Tb3N2eHl4d3l5ent6e3x9e35/fn1+fX19fn1/f39+f4CAgH9/f3+AgICAgH9/gH+Af39+fn5WSkpJSEdFRERCQT9ITUlNUEtJS1BUU1NYWlpcXHiFhIWFhYWGh4eHiIiIiIiIiIiIiImcnaCPiY5nO36LiYuMe3FyWl1dXFNVU1dXVVtadYNZVX2QYVxYXV9XSVZdXVtbX1lIWVhZW11YWFlXUlFNUFFNTU9TUVFVUmFzc3Z3d3Z4eHh6e3p8fX19f39+fX59fX1+fn9/gH9/gIB/f3+Af3+AgICAf39/gIB/gHh5fVlOS0lJSEZCREBBOlBRUVdYUFBPUVNUVFhYWVpbboGCg4WEhYaHh4eHh4iIiIiIiIiIiJaanJeIioFuhomIh4SLgGhbXF1aVVdVWFNSWFZjloBSZXJYWldfaFBgZltbWFxnYUdPWmhnXVtcXV1XUk9TUFBSVlZWVllabnJ0d3Z2dXh4eHt7fH19fX5/fn59fn18fn9/f3+Af39/gH+AgH9/gICBgYB/gH1yfX9/b3R8XVNQT01LSkVDP0A7UFBaWltSU1FQUlJSVVNWVFdfdXiAhYSEhYaGhoaHh4eHiIiIh4eIh4ORjomJiIaFiIiGfoB9X1NXWlZTVlRSUk1QTUxmeltdVFlVVl1aTFRaVVNUXlpYV1dXemtYW1xcXlRRUVBJTk9XVlhbWmRwcnZ2dHR2eHl5e3t8fX19fn99fX1+fX1+f39/gIB/f3+Afn56eHd2c3V7f3+AgHRrf35rcnleW1ZVU1JPS0ZDREFNXoNsVlJTTk9RT1FVUlNSUlVjZHaAgoKDhISEhIWFhISDhoaGhoeIhn6JiYiHhoOHh4d6b3JZTE1QUE1PTEpLRUZJRkM/VGRVf1JRUU5LUVRRTU9ZUk1OUVNVVU1RU1JQT01MSENJSFJUVVpcbHF1dXVzc3d6ent7fH17fX19fn19fX59fn9/f39/f399fX5+f39/f4B+e3Zzd31+fmR1fWlxdF9kXV5cWVVQTElMSWFsknRQUVNOUVJRUltSU1JRUlVUYnN7fH+AgYKBgX99e3uAf4OChYaHgoaGhoGEgYaFhnZgXk5FQERERERDQUVRQ0VBQz5DSUdWQEhOTEddaVBIRk5GREVGSUdIQkRIR0lLR0RCQURAT1FNUmRydHZ1c3R1enx7e3t7fHx9fHt+fX19fn5/f3+AgIB/f3x8fX+Af39/f4CBgH12dHt/bWh8Z25xZmllZGJcWFNRUFVSc1dlW09PTkxRU1FVWVNVUVFUU09WYGtscnZ7e3h5dHJuc3RzeXh+f4OAg4OCgIKAgoGCbE5IQUE8PD5AQUBAP2tRS2BFRkhJRUI/R0xOR01RVUlBRT8/PD08PT0/PT9BQ0NAPz09Qj5KTkdVbnV0dXN0dnh7fHt8fHx8fX19fH59fXx+fn9/f4B/f39/enl3eHd2dnh7foB+fXt4dnx1YXhnbHBqbGppZmBbUVJaXFleSkpQUU5LTFFSUVRWVVdRUVdVUFhbYl1hZ21tbG9rZ2BucmptbHF1e3p9e3h6fHx4d3hlREJBQj07Q0NCQkRCXF1Pe05PT05LTE1PT1FMS01XTUhHQEE8OTc3NTk5PTs7Ozg6ODo/PEJIP1xzdHV1dXZ3eXx8fH18fH19fX58fX19fX9/f39/fn9/f314dXZ6e3p3eXh1d3t8eXh1eXdjcWhpcG1ubW1oZl5PUF9cWklIUFJRT01QUU5RUlRWWFNTWVRPWVpbV1ldXl5fZWBdXnF2a15gZ2t3b29sam9ubmxmYllIR0hIQ0JHSUZGRURNUlBhV1NYUVBTU1JVW09PUVZQTUlERj46OTY1ODc5Nzk6MzY1Nzk1PEM+ZXNzdnd3eXl7fX18fHt8fX5+fnt9fn19f39/fn5+fn9/e3d1eX18enh8fHx8dHd2d3Z1d2tuaWhxbm9vb2prYFZXXlpYTUtUVFNQUVVPTFJTVFhYVFRZUk1XWVpWWFhWWFldV1dYaHNrXVZhc2tiYV9eZGFfXllVUU5PT01JSEpMSklGQ1FQU1tXVFROUVNZU1xlVU9TVFJOS0lIQz9BOTk5ODk3ODg1NzU3ODU5OkdtcnR3eHl7e3x+fX18e318fn5+en1+fH1/f359fn59f358dHR1e3hycW9vbnR4cXJzeHZ1cWZkZ3JucHBxbm1kXV9fWVdPUFhWVlNUVk9PVVZYWFlTVVRMS1RWVVVVV1BTVVdUVVJdbl5STlpfW1ZZO0RWWFRbZkpMUFNST05NTk5OTEpGUVBVWVNUT0pPT1VTVFxWUlVTUk9NTElISEY/Pjw6Nzg3NjU5OTY3Njc1V29wc3d5ent8fX19fXx9fXx+fX15fX18fn5+fXx8fX1+fXxydnF4eHJ2dXFxbnBwb3B1dnRuamRkanBwcXJwb2ZlZGNcXVJUWlZXVVRXVFJYWFlZWVNVT0pHT1BPT01SSlBQT1BOTk9UTE1JUE9TVFUyPVhNSUBRPWNhUVNRUE5QUVBOTk1RTlRSUFNNSUxLT1JQUlJTVFFST0xNS0xMSENCQT06Ojg3NjtCNTU2Njpkb3F0d3h7fHx9fnx9fH19fX18e3h8ent9fX58e3l9fH18e3B1b3d1cHV0b3N2cHFxcHR1dmNqZ2VXaHRycnFuaWlocFZWVFVYVVdVUldWVVpZWFdVUVNGRUFGR0dIRkpESEpJR0VITEhLSEZMTVBNRy9FX1I+Mz8+am9hU1JRQEdUUVBRUFFOUU9RUExKTExPUE5OUFFRTlBPSkxNTUtHRUVEQjs9PDw5PUc2Njc3RG1wdHV5e3t8fX18enx8fX5+fXt5dnh3eXl8fXp6dn17fHp6b3Fud3JwdnFtcHNwb3Bzc3N0ZmdgaFpXa3JzcmxtbWtuYWVQU1RSU1RPV1ZWWVlWUVFRT0A9Oz0/QUJBQ0BCRURBQEdIR0hFRkhKTUxFR0NPUkM4RU5TXWdUUVNBR1VQT1FRUE5NTk1LTEtMTk9PUUxPT01ITExJS0tMS0dGRkVEPEFBPjtARTs8ODlTcHJ0eHt6e317fHt5fHp6fn58e3V0dXJ2dnp6eHpyfHt8eXltcW94cnF1bm5xcm9vb3Rzc3J1dGtnZ15lam1wa29xbWltY0xPT01RU0xUVVRYV1VMTEtJPDk4Nzs+QD48PUFAQj0+RUhHQ0VGSUdKSkBGQUFARkhFSk9IUVJiXFFQUk9TT09QTExPTUxNTU5PTltXS01RT0dJSENISkxMS0ZGRkU/QkM+PEJHP0I/QWRwc3d6enp7fHt6end7d3l+fnx7cXN0cHJzd3R4eHN6e3l2d2xxb3ZxdHRsb3Fybm5vc3ZydHNycmtsZW5zaG1ubWxtbGprSUxISE9RSlFTUVRTT0tIQ0Q9OTc3OT9CPjs/QkBAPkBESUVDR0dJR0lFQkI/Pj1DQkFHSURNT2JlUU1PTldLTE5LTE1NTUxMT05TZE5KTFJISUlFQUhKTE1OSkdJR0JBQkA/RUZFSERLbm92eXl5e3t6fHp3c3h0eHx8eXpucXJtbm9ycnZyc3h8eHZ2bXBtc3B1dGxwcHJvb29ydnVyVlZucWdseYRqbXFybm5qaG9ISkNHTU1KTVBNUE9ISkQ/QT05ODo6P0I/PEFCQUFERUdLRkNISUdHSENDP0I/P0BBPkRFQ0tOUlRMSklNVEZJSUpMSktMSUpNTU9QUlBKR0NMR0NCSklMTU9OSUpJR0NDQ0RISk1MSVlybXd5eHp7enl8dnJwdXJ0eHl2eGpxbmpsbG50dG10dXtzdHhyb25xb3ZzbnBvcnBvcHN0eWpOYGdzanR8eWdvc3FpcWhkcUdLREdISEdKS0lKS0RGQj0+PTk5OjtAQj89QUJDQ0dGSUtKRElJRkdHQ0M7QUBCPkBAQkVDSU1QSEhLR0hLREhKTE1ISkxISUpMS01dUkhIRE5GQUNKSk1MUE1LTUpLRkdHSk5OUU5MYm1pdnZ3enl7en1ybWxza3B0dHR1aHBtamlra3RwbnR0eXByeXRvcnFvd3NvcXB0cnBydXR5a05WbXVscXt2aW5vaWt0Z2RvRktERkVHRUZGR0VHQkNAPjw9OTo6OkBDQD5BQ0RFSUVJSkxGSUlHRkZEQjtBQ0M+QENEQ0RHTE5IS05IREhFSUxOTUhJTEdGR0lJTE5LSUdFTkhCRk1LTUxPTU1OTUtISElPUlJTTlJmZmZxb3N4dXt6fGxoam5la3Fsc3BmbWxoaWtsdG1wdXR3cW94dG90c3J2c3BxcnRzcnR1dXZ2WFZ1dWtvdHJrb3ZsaG1lX3BHSURGRkVDQ0NFQERCPj8+Ojs7PTo9PkNBPkFDRUZKRklITEhHR0dGRUNAPURFQj5BQ0NDREdISUdNUEpGRkdLTk9LRkhJRkVERUlKSEpJRkhPS0NJTUtPTU9OT1BOSkpJTFJVVVJPV2RgYW1ncHJvcnl6Z2VoaGRpbGdxbGZsbWdpa2xzbHB2dXRwbnZyb3Nyc3V0cXNzdXRzdXZ2dnl2dXR3bGp1dW1ydnFsbmxlckxIRUVIQ0JBQkQ9QkE+QT06Oj0/Oz0+QEI+QEJER0pFSUZJSEdGR0VDQkFBRkZDQkJCREVER0dJRkxRTElPSkpNTElHSEVHRkRDSUlIS0pHS1JNQk5OTVBOT09NTk9LS0tPVVdWVVNYX15caWFtaW5ocnNiZWZmZGhoZm5qZm1taGtrbXJpcXZ0c3Ftdm5vcXJzd3Nyc3R1dnZ2dnd2d3d2dHd1anN1bnV0c3FyamtzTUdIRkhCQkFERTxBQEBDPDg6PT45Pzw/QkBAQERGSEVIRkZIR0ZGRENFQ0RJRUNHRUJFR0VGR0dFSk1LSFFNSktISElFRkhIRUNJSUlLTUtPU05EUVJQUFFOT01OUE1MTVNXVlhYVVhdWl1kYGhiamlna19lZWZjZ2dna2dna21rbWxwcmh0dHVyc252b3FwcnR4cXNzdXZ1gpF5dnZ0eHV1d3htb3VvcnN1cXFpbnlNSEdISEJCQkZFPD9CQkQ8Nzo+PTo+OkBCPj8/Q0VGREZERUhGREVDREVGR0pFRUpHQ0dIRkhHRUNGSkpHTktMS0hKTEZJSUtIRUtLTE1OT1JUT0hTVVNQUk9RTU5RTk1QV1pWWllWWl1ZWGFgYWBeaGVjYGRmaGdqaGhpZmhubGxubXFwaXV1eHJycHVwcHBydXZwdXN1d3V7fn14dnR3dnZ2eHBsdXBtc3RucHJyeE5ISEdJREJDSEU8QEVCRT04OT4+PTw8QUI8Pz5BQUZDRkNESUVERUVGR0dHSUZHS0hESUhHSUdGREhLSUdLSE1LSktMSExLTUtKTktPTk9SVVZPS1VXU1BTUVJMT1FQT1RZWllcWllbXl5dYGNeXGFja2JgZGdncoVoZ2lmam1ucG9uc3JqdHV4cnNzdHJucHF2cnF1cnV1c355jn11dXZ2dnZ4cmh1cWtydGxxdnB0TElLSUtGQkVHRTxAR0NEQDo8P0A/Pj9CQTxAPkFBRkNFRUVJRUZFR0ZISEZISElLSkZKSEhLSEZGTElISEpHTExNTExJTUtOTU1QTFBQUVVWV09LVlZVU1NRUkxPUlJQVltbXV5bXF5fX2FgYWRdY2BlZmBlaGpkc3Nmamdna29ycW9zc25zd3dxdXZ0c21vcnVvcnNwdXJ2cnSBdnV1dXd2dXd0Z3Rya3Fya3J2bnZKS0xKTEdDRURFPEBGRERDOz8/QkBAQENBP0I/QUNIQ0ZGR0lGSUZHRElIR0lISkxISEpKSUxKRkpLSElLSkdLS01NSkpNTU5OTlBLT1FSVFhWTU5UVlRSUlFQTU5UU1JXW11eX11dYF9gYWFgYWNlYmRoYmRpamd2i2xqaWdtb3NxcHFwcHJ5dnJ1dXRzbW1zc21xcm90dXRycHN3dHV1d3Z1dXRlcXNrcHFqcnZud0tMTExNR0RDQUQ8P0VFRUM9QUFDQkJDREFDREFBRUdDSEhJSEdKR0NISUdISkZJTEhJSk1LTkxHS0lIS0tOUUtSUU1TTUtOTk9QUE9UT1dYWFtOU1BXXFpSV1BOVFVUVFhaX2JiX2RhXmBiXmBlYWFjaW5nYmloaG54dmxoaW1vc3JwcXJycnZ0c3Vzc3Nua3NxbXByb3R2cnFxdXZ1c3d5d3V0dWNtdGtvcGpxdG93TE5MTExHRUFARD4+REVGQ0BEQkVEREZCQ0VHQ0NJRkNISktJSUtHREtKR0hKSUlLSEpKTkxPS0lMSEpMS1pmSmRcS2xTSE9OX25Va3NbcXBid2NTUGF2dWh1Y2F2YFhucWJkdmluemZbbHRgbGpUX3d2aWpnaWZnbG1qbW9qbW5zcnBycnFyc3Jzc3J0cm5sdG9ucHFxdXVxcXN0dnZ1dXl3dXR0YGt0a3Bwa3FycXlMTkpKSkZDP0BCPz1ERUZEQ0RDRkVERkJGRkdERUtGRkpNTEtMTEdHTUlHSktIS0tJS0tOTE1MTExJTE1MW3NiZHBebG1VTU5mc11mZnFsbnRncGlfYVlubmJwcGJrampmb3F0ZXRub1xvdWdwTUpxeXZrYWBrZWVteGxrdm1ucHNycHJxcHFycXJycnRybW1zbm5vcHJ1dHFzc3R1dXV0d3h2dXRibXVrcHBscnJxektMSUhHRUQ/QUJAPkNGR0JGQ0ZFRkVEQ0hISERFS0hHTE5OTE1NRkpOSEpLSklMSkpKS0xNTk5NTUpNTU5bcm9vbnBwbGtNUFFsV01pYnRycGFtbnVcWWxQXG5tWnFta29teHh0c2lwXV9ya3FqVXV5eG9jXmtmYmdwcGpqb3BwcnNwcXBxcXJycXFycnRsbXJtbm5vcnV0cXRydHV1dHV1enZ1dGVudWtwb2xzcnJ5SUtHR0VFRUJCQj5AQEZHQkdESUZFRUJGSUhJRUhMSkdNTU9MTU5HTE1JTEtJSk1JS0pKS09QT05NTE5OTFxoZHVdbHFXbE5QUW1UWWtea2x2YWxkc1NlY05tWWxcdHBraWx4and1aHBdXnJraFdiY3d8b2NgZ2dhZGl1eWtubnFzc3BxcHFwcnFwcHBydWttcW1tbW9xc3Rxc3J0dnZzd3Z6dnV0aG91bHNvbXNydHZITEZJREVFQ0FCPUJBQ0dESEdMSEVDQ0hKSUhGSkxMRk5MTFNSTEdMTEhOSklITkhKSklITk9NTkxKTk1KWnNwcG9xcW1sT1FSbllya2dvb3Fxb210XW5YYXRfbm9wb3Fyb251c3R0altedGN3eHJqbnpoYWFjZmJiaW10dXBzdXZzcXBwcW9ydHt/fn13bGtxbmxtbnByc3F0dHN1dXR4eHl4dHVrb3VtdG9uc3N2c0hLSElCRUVFQUE+RERCR0RISU1JRkNGSkxKR0ZLTkxGT0pLV1JLR0tKSk5JSEpMSUtKSEhLTU1NTUlLS0tTa2NbaV5faWNyclpfWWpuX2VlVWtfY1thYVFgbGhdalxuaWlkW3BmZHBdWlxrW21xY3BzbGRnY2RnYGBrbXBwb3R5cnVxb3BxbnmFiIeHhoWAdnNua21tb25xcnR0cnR1dXZ5eHhzdW5xdW53cXJ2dHdyR0dGSURFQ0ZBQEJGRURHQkhKTEhGREdLTElFRkpPTElQSUxbUUpFSEhLTUlISkpLS0lISUdLS0tMR0hLS0xNTUxKS01OVFtcVFBUTFBPTk9PVlFPT1FOT1FKSk9QUWRxaVRZV1xbXFZZW11YXVxcY2ZhYWViY2ZfX2ZrbWhtdHlydHJvcHB0hoeGhoaFhYaHg3pwbW1sa3FzdHRydHZ0dXl4eHV2cXJ1b3ZydHN1dXNHQ0VHRkVBRUNAREhERkdDSUtMSEZER0tMSUVHSVBLTE9LTFdMSUVFSElKSElLSU1KSEZHR0lHSElFRkxJSkxPTUpQXFdeUFxbYF5NWFlTXFxiXk1YWk1YYVJLWWFaUl9kXGFYW2RkVlZYXFlaWFxWWVxdYl5kYGFfZWhrZ210dHFxdHBxcoGGhoaFhoWFhYaGhoR9cmtpb3Jzc3N0d3l5eHl4d3h0cXhyeHNxcnVydE9CQ0RMTUJEQ0JFSUVHR0ZLSktIRUVJSktGRUhIUEtNTUpNUklHRUFIRkpJS0xKTEpIRkRJRkRGR0VGS0hDSk5MTFVfWWBYYGFbYFRYWVReXlpfUllcUF5cWU5fXF5TWl5jXlpdYGNgWV9jW2BeW1RYV1leXWNiY2FjZWhla3Jwb3Bwbm93hoaFhYaCe4CFhYaGhoaFf3VxcHJyc3Z5eXp5eXh4eHdyeXZ4cnF4dnR2YVNKSk1JRUNCQ0dIRkhHSEtKSklERktLS0VGSUpOS05LSExOR0hFPkdHTElLTEtLS0lHREhEQ0RFQUZKRUBKTEpPW2NZX15hX1JUUldfYFxdWV5RWVxNVl9XS1FZW1BaX2FhXV5jYWBiYmJjY2VaUVhVVVxZXWNgX19jZGJob21ubGxsbHWFf4SDeXV8hIWFhYaGhYWGhoN9d3JydHh5eXl5f359eXV5dnZybnp3dnhYUUtGQ0dFQkVHSUZHSEhGRklHSEdIS0lMRERLS05NTEtIS0pISUY/R0dOS0tLTUtLS0lGR0NEQERBSElDQElKSFBdYVpbZF1fVFFSWF1cXFxfWktXXExSXFlJTV5RT1xfYWNjY2NiXGRjYmRjZlhRVVRRW1daYF9eXmFhX2Rsa21qamxudn51gXp8hIWFhYWFhYaGhYaFhoaGgnpyc3V1e4WHh4eGhYSBfnhwend2eFxSTUNASUZERktKRkZGSEdHSUdGRklMSk5GREtLTU5KTElLSkhIRkJISFFNS0tPTUpLSUdHRUQ/RUNJSUJCR0ZFVF1ZXlhfWV9bXVVYWE9dXVFLSlZeWF5bXVVZYFJRX19iYmBgYmJgY2JhZGRiWE9RUVFaUltdXV1dXl9fZGhnbGpubnB7e3x+e4CCg4SFhIWFhYWEhIWDhISHh4FzcneFh4eHh4eHh4eHh4WDgHx4XFNLQ0FIRkRHTVJIQ1FKRUdISEVGS0pNUEVGSUpLTkxMSUtMSUhHREhLUU9NTVBMTEpLSElDREFFRElHQ0JHRkRXVUVcVF1TVl9YT1RVTlpaTUlKVGBhW19YXl5hXU9ZYVxgYF9iY2JdYWJXYF9UUE9PT1dRXFtbXFxeX2JmZmVsZW9vd3x7gHt9f4CEhISEhIWFhYODhYKDgoWFhnpvgYaGhoeHiIeGhoaFhYSFg35JTkZERkZIRElSYlBDVl5JR0dIREZNS1BQRUlJSktOTEtLTEtJSkdFSk5RUU5PT01OTE1IS0FEQUNER0VDQkVHQk1IQktLT09OTEZNRkdJSkhHTEtNT1BJTE9QT1NPTFBTUlVaWVdZWFhkV09TVFBQTk1PVFNaWFhaXVxgYWRlY2dja2xwc3J5eX97en+EhISFhISEhIKEgH57gYOBfXuFhIaGh4eHhYWFhISEgoGAfUtJRUVHRkdES01dTEdHWExHSEpIR01MUVFIS0tLS05NVU5PSkpLR0dLUFNTTlBPTk5OTkdLRmBFRF9MRWZkRU5cSV5bcm1PTVVtWUxEUGBVa1dnSl1XVV5ETFFVTExTVlFSVFhXVFhVVFxVUGZaaGhkWFJqUlZVVFtcW2BgYWJhYmBmaGZua2hyenx9foGEhISEg4ODgX18enJ7gXp7f4KAg4SEhYWBhIWAg4N/fnp7TElGR0ZIRUVLT1NJSkZgVEhJT0pJT01SUUxNTExPUlVST09JS01HSE1RW1lPUFBOT09PSUpRf1FJfFlZcnRZUW1IcW5vYVZQcXFzUENrc21xc3BTb19bblhdVlxYVWtoVV1WY1pgWVtfVlZYf2p0dXVeX3ZeV2FbW2ZbX2BhYGFdYGFnbXBsYHB3dHiBgYKDg4J/fX+Adnh6bHZ+dHh9gHx+gIGChHyAg3p/gX9+d3dOSkVITU5CRExMRklLRVJWTEtOSUtSWFdRTU9PTVFUTk9RT0tLTkdNUFNbWlNRUk9QUFBKSFp4XVR4ZWhaU1VSdmd0bHBibmZqUXJPTXdtanJwc3JxcnBvb4BdZXp1eHFxenF+c31rdX1iUmh8ZXNzb3Jye3xvfnhugHJfYGBiYVpgX2drbmtibGZnbXd+gYCCfnt4d4B0dnppcn5uc3x+d3h7foCDeHyAdXx/fHxzc05LR2BdR0FFTU1ISkpHSlBPTU1KTlZeWVVMUVNOWFpNU1NSTktPSFFSVFlXVlBUUFBQUUtIZ3hsY3hybVtLTlZ5cHVtdWJvdlBlZUpmdnFtd2+AamZ4eGlXclFoem1panp6fWx4en9vaG9ZdnZqdnVwgF9yZn1pbHh8b15fX2JhW11iZGdpaWRnYmNkbGxwcHN0c3NzeXFyeGJsdWdxeXtzcnZ5foFzdXpufH15eHJvTktTdU5DQkZQUEhKS0lLUE9PT01QWmBaV0tUV1BhXlJWUVlSTFBJU1RWWFdXT1VQT05SSktyb3V1cXVxZGliV25McXBeRmh5V3ZUTGl5fXhgeXtzbmFdbW9jUmhxdW5teXB3bHZ0dHJsbl10fnprbXl8a3RsfGtwdnV4Xl9fYl5dX2RkaWdnZWVeYWJpaWlqa25va3FvbWpwYWNmY293eG9tcHN5fm5xcGt7enRzb21MTFtWSEdFR1JQSUxNSktQUVBQUFBXXFhVTVVZVWVYUlJZXlNMTklUVFZXWVdPU05OTlJJUm1IaXdLYGR2dlZYbE9ubHtzYWpnf3ZVTFdraH1sbWx4X1pwenteYHpzY3JveHFoZH1pcnxeVExsYHZ1a2l1e3ptfnhrfHBcXl5iW15iZGRnZWVlYlpjY2lra3JzcnZnbGloZGdgYWthZ3NybGdtbXJ8a21oa3t0bW5rbU9IS0tISkhIUVBMTk9MS1JSUk9TUldSVlRQV1pWVlRUVGFfUE5NS1RTVFFWVk5OTE1PUEtIUU5QVUxLTFNUVFNUUFZVUVFOUVFYWVJOUFVUWFhYW1tVUlNXW1dYWFpPU1VXWFhSXllXXlZUUFlSV1dXV1heWmdyXltbWVxdX2NaX2NjZGZkY2NiWmNiZ2ZlbW5tdWVlZ2NhZl9dZ2BkbGhmZ2tocHpoZ2dqdWpoZ2lsUUlLTExNS0pTUU1RUE9MVlVUUFRVWFVZVVFaXVZVVFdVWVdPT0xNVlRRTlVTTk9NTFFQTEpRUUtRTUtMUFJVU1FSU1NJSExOT1FSUVFRVFZSWFdcV1NSUFJUVVZTWlFOU1JYVlRZVlVaVlRSVVRUVVdYVlxZXmBdXFpaXFxfY1tdYmNkZmRkZGFZYGFjYWJoaGltYmFkXl9jXVpkXGJtYV5mZWZtc2RpZ2prZWRjZmhQSktMT09MTVNQTlNRUU1YV1VUVVdXV1pVU1xgVldWWVVYU1BQSk5XU1BOVVBOUU5MU1BNT1VTTlJOTU9RVVFVUVJUVU5LTU9RVFRSUlFWV1VZWltZU1VSVFdWVllbVFBUVVhVVVpVV1pWU1JXVlVXW1haX1xVWF5cXl1bXWFhXltiYmNnZmVkYlhfYWJdYGdkZmVhXl9dXV5aWmBaX2dgXl1dYmhrYWdmaGZkYGJjYk9MTUxRUUxPVE9PU1FPUVtZV1dYW1lYWVZdamRWWFlaV1ZTU09KTlZUUE9VUFBQTU1SUlBSWFRRUU9NUFRWT1hSVFVVT05NUVRWVVRUUlRXVlpdXFpWVlFRVlhWW1tXUVRWVlZWWVRYWFZTUllXVlpeWV1fXlVeXF5gXFtfX19fWmJiZGhnZGRiWGFgYl5eZmNjYGJdXFxcXFlaW1hbYVteXVxfYl9fYmRlYmRfX2BcUE1OTlJRTVJST1NUUU9VXFpaV1tbXFhaW2RxbWhkX1tYVlVXUUxNVlNNTlJPUVJPTFFTUlVaVVNQUE1RWFdSV1NTU1hNT09RVFhWVVVTVVlYW15dW1tWUU5VVlVbXFdSU1dWV1hWVFlbVVRSWlhXXF5aXl9gVWFcYWFdYGJfXGBdY2FjZ2hkZmBZY2BhX19lZF9gYltaXFtcWVpZWFdcWlxbYF5fW15eYWBeYlxZYFtRTk9OVlFQVFFPVFRTUFdcXFxYXlxeVlxeanF3eYBjXFtVVVdRTU9WU05RUU9SVFJMUlRUWVpXVU9ST1NYV1RTVVJSWk9QU1JWW1ZXV1NWWlhcXVtbXVZTTVRVVVxcV1JVVlZYWVNVWlxVU1NdWFpdXlxgYGBWYVtjYl1hZF5cYmFjX2NmaWRmXltkYGFgYGNlX2JeWVpeW1xbWVhZV1daWlphXF1bXVxcWl1gV1tbWlBPT09ZUFVUUlFXUlRQW15eXVtgXGBVXF1oanJ9c2xnXFRXV1FOUlpTUlFUUlRVVEtSV1ZbWlpTT1NRVlZWVE9XUlNaUlRUVFhdV1hZU1hdWF5dWVpdVFVOVVZXXltZUlVVWVlZVVdaXFZTV15aXV1gXGJiXVlfW2VhX2RkXl5jY2FeZWZpZGZeXWRhYGFhYmRgYl5YWl9bXFtYWFhXV1tZW2BcW1tcW1haW15WXlldUU9PUlpQWlRVVlZTVFReXmBeXmJcYFVdXmJreXRsfWtaVVlUUFBTXFRVVFVUVllXTFJbV11bXVJPVVNYV1dUUFhSU1dTVlVVW11YW1lVWl5YX15ZXFlRV1JZWFlfW1pUVVZaWVpXWFpdV1VbXl1eYGFfZGNcXl1dZWFiZmReXmRjYFxnZGhlZGJfZGFgYWBiYl9gXldYXlpcXFpZWVdWXVpdXlpZW1xbV1lcXVZYV11TTlBWWVFdVVZZV1dVWF9fYWFgY11fVF1fYmVldYF6aFdZWVNVU1ZcWFdXVlZXXVhPVV1aXl1cVFJXU1dXVVNUWFJTVlRYV1hdXlhdW1ZdX1hfX1hcVlFYVFlaWmFZXFZXWFtaW1lZWltZV15fYF9jYmFkZFxiXGBmYWRmZF5fZGJiW2ZjaGVjZmBmX19hYWFhYF9eVlVdWVtcW1lbWVldW1tbWFhZW1laWl1fXVRZXVVOU1lWU1xUVldZVlZcYGFiY2BjXl9WW2BkYV96dW9oWVtZVVdUV1taWlxZWFlgV1BVXlxgYFxUVFhQVVdWVFZXUlNVV1paW19eWl9cVl9fWl1eWV1VUllXWVldYlpeV1hbXFtcW1taXFpaX19gYGRiY2RkYmRZYWZjZmZlXmFiYGNeYmNpZGNnX2deYWJjYWFgXl9YVFtaWltbWFtYWFxbWltYV1lYV1xbW2BdVl1dU09WWVZWWlVYVVhXWF1fYmFkYWRgXllZYWRiYGxmaF5bXFpWV1hZXFxdX1tZW2JWVFheXWFjXFJWWVBXV1dXV1ZTVVRYXFxeYGBdYFxXYV5bXltaXlhVWFdbW19gXF9YWVxcXV5fXFtdWVtgYV5gZWNkZWVmYlhjZWRoZ2ReY2BgZWNcZWlkZWlfZl1jYmNhYWBfX1tYWVtZWlpYWVhXW1taW1dYWlRZXVxaYFxVXmJOU1dZVldZWFtcWFdZXmBiYWRhZGFdXllhY2JfYWBgXlxcXFdXW1tdXV9fXFpdY1laWF1gY2RfUlhZUFdXWFlZV1ZXVl1dXmBhYF9iXllhXV1eWVxeWVhVV1tcYF5dX1paXl1eXmFdXFtaXGBiX2JlY2VmZWZiWmRmZmlnYl9jXmFmZFppaGJmaWNlXmJiY2FgYF9dXVpYXFlZWFhaWFdaW1pZV1hVVVtdXV1gYGJieEtYV1tZVlxbXF1aV1xdX2BiZGFiYV1gWGJjYmFjYWJdW1xbWFdbXF9dYF9dW2BkXVxYW2JlY2FSXFpPWVhaW1taV1pZYF1gYmJgYWNfXGJdX11bXl1ZWVRYXV1fYF9gXFteXmBiY11cWFxeYGJiY2VkZmRlZmRcZWZnaWZjYWJcY2dgXGloYmhpZWRgYmFjYV9gX1xdXFlcWVhXWFlYV1xaWldXWE9YWl1hY2Zmcmt/SllXXFpaX1xbXlxYXVteX2FjYmFhXWJbYmRiYGJiYlxbW1pXWGlxYFxgX11cYWNfXllZY2VkYVNfWlJZWFxdXVtaW1tjYGJiY2BiZGFgY15gXF5eXllYVVtfXl1hYmBeW2BhYmZjX11UXWBhY2RkZmVnZWZmZV5lZmhoZ2RkYFtmZ15haGhiaGhmY2BiYGNiX19fXF1bWltZWFhYVlpWXFtaVlZVTVhXXGdpa2h1eIF2dnZ2dnZ2dnZ2dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6e3p6ent7e3t7e3t7e3t7e3t7e3x7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHt7e3t8fHx8fHx8fHx8e3t7fHx8fHx7e3t7e3t7fYmIhoqHhIKCgoOCg4OCgoKCgoKCgoKCgoGAgYCBgICAgYCBgYGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t6e3t7e3t7fHx8fHx8fHx8fHx7e3t7e3t7e3t7e3x7e3t7e3t7fHx8fHt7e3t7e3t8iYmHiYaFgoGCgoKCgoKCgYKCgoKCgoKBgYGAgICAgICAgIGBgYB9fHx8e3x8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eHh5eXl5eXl5eXl5eXt7e3t7e3t6enp6enp6e3t7fHt7e3t6enp6ent7fHx8fHx8fHx8fHx7e3t7e3t7fHx8e3t7e3t7e3t7fHx8fHx7fHt7e3uHiYiJhYSDgYKCgoODgoKCgoKCgoKCgYGBgICAgICAgICAgYKBgH58fHx8fHx8fHx8fHx8fHx2dnV2dnZ2dXZ2d3d3d3d3d3d3d3d3d3h4eHh4eHh4eHh4eHh4eHh4eHl5eXl5eXl5eXl5e3t7e3t7enp6enp6enp7e3t7e3t7e3p6enp6e3t8fHx8fHx8fHx8fHx8fHx8e3x8fHx8e3t7e3t7e3x8fHx8fHt7e3t7e4aJiYiFhYOBgoKCgoOCgYKCgoKCgoKBgYGAgICAgICAgIGBgYCAfnx8fHx8fHx8fHx9fX18fHaIi4uLi4uLgX19fX19fYSMi4uLi454KSkqKiopKz0/Pj4+Pj5tgH5+f397pdfT09PT1r2GiYmJiYiQzNPS0tLT1Z6GiYmJiYaz1tLS0tLWun1+f39/f359fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx8fHx8fHt7e3t7hIuHh4aHgoGDg4GCgoKCgoKCgoKCgoGBgYCAgICAgICAgYCBgIB+fHx8fHx8fHx9fXx8fH19doyQj4+Pj5CDfn9/f39+hpCPj4+Pk3kZGhoaGhocMTMzMzMzMmqCf4CAgHut6eTk5OToyomMjIyMipTd5uTk5eTnpYmMjIyMiL/p5eXl5enHfX5/f39/f319fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e3uCjYeIh4eDgoSCgYKCgoKCgoOCgoKCgYGBgICAgICAgICAgICAgH58fHx8fHx8fXx8fH19fX12eHh4eHh4eHd3d3d3d3d4eXl5eXl5d29wcHBwcHBycnJycnJyd3p5eXp6en6Dg4ODg4SBfHx8fHx8fYSFhISEhIR+fHx8fHx7gYSEhISEhYJ8fX19fX19fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e4CMhomHh4SDhIKCgoKDgYKCg4KCgoGBgYGBgYCAf4CAgICAgICAfnx8fHx8fHx8fX19fX19fXZ2dnV1dXl2dnZ6e3h7eHd2d3p3eXp6fnx5eXh4eHh5eXl5enp5eXl5enp6eXh4eXl5eXl7e3t7e3t7eXl5eXl5eXp7e3p7e3t6enp6enp6e3x8fHx9fX19fX19fX18fH19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8f4uHi4qIhIODgoKCg4KBgoKDgoKCgYGBgYGAgIGAf4CAgH+AgYF+fX18fHx8fHx9fX19fX19d3d3dnZ3fXh3d316eH14d3Z5fXx8enl8e3h3d3d3eHh4eHh5eXl5eXp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fHx8fHx8fHx7e3x8fHx8fHx8fHx+iomNjImFg4SEgoKDgoGCgoKCgoKBgYGBgYCAgICAgICAf4CAgH19fXx8fH19fX19fX19fX13d3d3d3p9eHt4fHx3e3h3dnp9fX59eXt6eHh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fX19fXx9fX19fX19fX19fX19fHx8fHx8fHt7fHx8fHx8fHx8fH2Kio2NioWDhISCgoKCgYGCgoKCgoGBgYKBgIGBgICAgIB/gIGAfXx9fX18fX19fX19fX19fXd3d3d3fX55d3d4e3p7eHd2e318fHx6fHl4eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt8fHx8fHx8fHx8fHx8fH19fX18fH18fH18fHx8fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8foqJjo2JhISEg4KCgoKBgYKBgoKCgYGBgoGAgYKAgICAgH+BgIB8fH19fX18fX19fX19fn5+d3d3d3d5fHl7eHx9eXt5enl6fXt8fXp8eHh4eHh4eHh4eXl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt7fHx7fHx8fHx8fHx8fXx8fX19fX19fXx8fHx8fHx8fXx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx/iIeNioeFhoaDg4ODgoGBgoGCgoGBgYGCgYCAgoF/gICAf4CAgHx8fX19fX19fX19fX5+fn53d3d3d3Z4eHl3eXp4enh5eXh7eHp7eXl4eHh5eXh4eHh5eXl5enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX18fH18fH19fX19fH19fX19fHx8fHx8fHx8fHx8fX+HiIyIhoeHhIKDhISCgYKBgYKCgoKBgYKBgIGBgYGAgIB/gIGAfHx9fX19fX19fX1+fn5+fnd3d3d3d3d3d3d3eHh4eHh4eHh4eHl5eXl5eXl5eXl5eXl6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fHx8fX19fHx8gIeIi4eHiYWEg4SDg4KBgYGCgoGBgYKCgYGBgIGBgYCAgICBgX97fH19fX19fX19fn5+fn5+d3d3d3d3d3d4eHd4dnl5eHh4eHh5eXl5eXl5eXl5eXl5enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fH19fXx9fXyBhoqKiYmIhIOFhISCgoGBgYGCgYGCgoGBgYCAgYGAgIGAgIGBf3x8fX19fX1+fn5+fn5+f394eHd4eHh4eHZxZGpeam15eXl4eHl5eXl5eXl5enp6enp6enp6enp7e3t8e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIGFiYqJioeEhYWEg4KBgYGBgoKBgYKBgYGBgYCBgYCAgYCBgIF+fH1+fn5+fn5+fn5+fn9/f3h4eHh4eHh5bWRiZV9fXm95eXl5eXl5eXl5eXp6enp6enp6enp6e3t7e3t7fHx8fHx8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goWKiomJhISGhYSDg4KBgYKCgoGBgoGBgYKBgIGBgICAgICBgH58fX5+fn5+fn5+fn9/f39/eHh4eHh4eW5kZWdlZGJeZnh5eXl5enp6enp6enp6enp6enp6e3t7e3t7e3x8fHx8fHt8fHt7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChouJiIqEhYaEg4OEgoGBgYGCgYKCgYGBgYCAgYGBgIB/gIGBf3x8fn5+fn5+fn9/f39/f394eHh4eHl3Z2VkZWZkZWFfaXl6enp6enp6enp6enp6ent7e3t7e3t7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHt8fHx8fHx8fHx9fX19fX19fX19fX19fXx9fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4eJh4SEhoSDg4WBgYGBgYKCgYGBgYKBgICAgYGAgYCAgYF+fHx/f35/f39/f39/f39/gHl5eXl5eWtlYWJlZWFlZV5ieHdze3p6enp6enp6enp6e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fH18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19g4aLhoiFhYaEgoOEhIKBgYGBgoKBgYKBgYGAgYGBgYGAgIGBgn98fH9/f39/f39/f3+AgICAeXl5eXl0Y2NlZGNmY2doZGZsZF5ze3p6enp6enp6enp6ent7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn6DhouGhoaGhYODg4SDgYGBgYGCgoGBgYKBgYCAgYGBgYCAgYGBfnx8f39/f39/gICAgICAgIB5eXl6d2RhY2diYmRdW2VfYV1eYGFoeHp6enp6enp6enp6e3t7e3t7fHx8e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+foSFi4eGhoaGhIODg4KBgYGBgoKCgYKBgoGAgIGBgYGAgYGBgYF+fX1/gH+AgICAgICAgICAgHl5eW9vYmJiZF5jZ19dYWFgXF9kYlttfHp6enp6enp6enp7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7fHx7e3x7fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5/hIiLhoSHhoaEhIODgoGBgYGCgYGBgYKCgYCAgYGBgYGBgYGBgX5+fYCAgICAgICAgICAgICBeXpwXWJlZGJkXmZnZ2BZYmJhY2VfXF1ze3t6enp7e3t7e3t8fHx8fHx8fHt7e3t7e3t7e3t7e3t7fHx8fHx8e3x8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fn19fn5+fn5+fn5+fn5+foCFjIqEhYaGhYODg4SCgYGBgYKBgYGBgoKCgYCBgYGCgICAgIGBf35+gICAgICAgICAgIGBgYF5emxiZGdjYmdmYWBgZGFiZWRjZGNeXGJ1fHt7e3t7e3t7e3x8fHx7e3x8fHx7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/gYeMiYWGhoeFg4SDg4GBgYGBgYKBgoKCg4KBgIGBgYKBgYGCgoF/f36AgICAgICAgIGBgYGBgXp7dGdnZmZkZGZmYF5fYWNlaGRlXmJkYHR8e3t7e3t7fHx8fHx8fHx8fHt7fHt8fHt7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f3+CiYqIhoaIhoWDhIOCgYGBgYGBgoGBgoKCgoGAgYGBgoKBgYKCgX9/f4GBgYGAgYGBgYGBgYGBenptaGNjZ2ZnZWdmZmdiZWRlYmdbYmVgdnx8e3t7fHx8fHx8fHx8e3t8fHx8e3x8fHt7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f39/f4SJioiGiYeFhYSEg4KBgYGBgYGCgYKCgYGBgYGBgYKBgoGBgICBgH9/gYGBgYGBgYGBgYGBgYF7emlpZGNqZmFgZmVjY2NnaWRjYmBiZGJ0fXx8fHx8fHt8fHx8fHx8e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f39+fn9/f39/f39/f3+AhIqMiIeJhoSFhYOCgYGBgYGBgYKBgoGBgYGBgYGBgoKBgYGBgYGAgH+BgYGBgYGBgYGBgYGBgXZzZWRnY2RmZWJlZmdkZmhmZWNgYGNkYHF9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fXx8fX18fHx9fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/fn5+f35+f39/f39/f3+AgICFioyJiIqJhoaDgoKCgYGBgYGBgoGBgoGBgYGBgIGBgYGBgYGCgX+Af35/foCCgoKCgoKCgoKCc3NnZWRkZWlqaGZnZ2NhZmZlZmdmZWVjdX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fH19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gICAgICAgIWLioqJioeHhoSCgoGBgYGBgYKCgYKBgYGBgIGBgoKBgYGBgYGAf4B+dHRzdX1/goCAfn5/gYB0cmdkZWNmaWppZWNlY2BmZGRnZ2JiZWFwfXx8fHx8fHx8fHx8fHx8fHx9fX18fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f39/f39/f4CAgICAgIB/houLiouLh4eHhIOCgYGBgYGBgYKBgoKBgYGBgYKCgYCBgYGBgoCAgH5zc3NzdHV4dXV0dHV2dXVwZmNmZWhoaWdoZ2VmZWJfZGVmY2BiZ3d8fHx8fX19fX18fHx8fH19fX19fX19fXx9fXx8fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gIB/f3+AgICAgICAgICHjIyIi4qHh4eEhIKBgYGBgYGBgoGCgoGBgICBgoGBgYKBgoKCgYCAfnNzc3Nzc3NzdHR0dHNzdW9jY2FnZWhoZ2pmZGVnZmhmY2JlYl5ieX18e3t8fX19fX18fHx9fX19fX19e3x9fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn9/fn5+fn5+fn5/f39/f4CAgH9/gICBgICAgICAgYCAf4CAgYGAgIeLi4iNiYiJhoSFgYGBgYGBgYKCgYKCgYGBgIGCgoGBgYKBgoKBgIB+dHNzc3Nzc3Nzc3Nzc3N1cmdlZWRlamhoZ2ZpaGdjZWViZGNoZGd7eHVzc3R2dnl4dnR0dHZ3d3d2dHR0dXV4d3h4d3d6e3x9fXx9fn5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f35/f39/gH9+fHt7fX58eXl2dnZ5fHx6end2d3l7fXt4hIyMioyHh4iEhYSBgYGBgYGBgoGBgoGBgYGAgYKCgYGBgoGBgoGAgH51c3Nzc3Nzc3Nzc3Nzc3VzaGVnaGVrbGhqZ2lqZ2dnZmRkYmVkbnV0dHNzdHNzc3Nzc3Nzc3Nzc3NzdHNzc3Nzc3Nzc3N0dHV1c3V3eHl7fn59fn98f39/f39/f39/f314fH5+fXx4dXZ3eXd4dnRzc3N0dXRzc3Nzc3NzdHNzc3R0c3R0dHODjI2KiYeIhoOGg4GBgYGBgYGBgYGCgYGAgYGDgoKBgYCBgYGBgYCAf3VzdHRzc3Nzc3Nyc3NzdnZpY2hqaGpsZWZpbGhgZmVkY2BkZGZ0dXV1dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHRzdHRzc3Nzc3R2dnV1d3V4fH9+fX9+fHp4dXN0dXV1dHNzc3Nzc3N0dHR0dHR0dHR1dXR0dHV1dHR1dXR1dXV1dIaMjYuIhoeEhIWCgYGBgYGBgYGCgoGAgYCBgYKCgoGBgIGBgYGAgIB/dnNzc3Nzc3Nzc3Nzc3N2dnNnZ2pmaGdmaGhmZGlnY2NnZWVmcHZ1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dHR1dHR0dHR0dHRzdHR0dnV1d3Z0c3R0dHR0dHR0dXV1dXV0dXV1dXV1dXV0dHNzc3N0dHNzdHR0dHR1dXR1iY6MjIqHh4SEhYKBgYGBgYGBgYKCgoGBgICAgoKCgoGBgYGBgYCAgH93c3Nzc3NycnJyc3NzcnZ2dW5kXWNnZWlraGVoZ2dqamlnZXB2dXV1dXV0dHRzdHR0dHR0dHV1dXV1dXV0dHV1dHR1dXV1dXV1dXV1dXR0dHV1dXV1dXV0dHV0dHV1dXV1dXV1dXV1dXV1dXV1dXV0dHNzc3Nzc3N0dHNzc3Nzc3R0dHR0dHWKjoyMiYaGhIeFgoGBgYGBgYGBgoKBgYGBgYGCgoKCgYGBgYKBgYCAf3hzc3Nzc3JycnJyc3NzdnZ3d2liaGhnamtpaGZkZGVmaWhwdXR0dHRzc3JxcnJ0dXV0dHR0dHR0c3NycXFxcXNzdHR0dHR0dHR0dHV0cnJyc3R0dHR0dXV1dXV1dXR0dXR0dHR0dHR0dHR0dHR0c3Nzc3Nzc3Nzc3Nzc3N0dHN0dHR0dHR0dYuOjImGhYWFh4SCgYGBgYGBgYGBgoKCgYGAgIKCgoGBgYGBgYGBgIB/eXNzc3NycXJycnJzc3N3d3d3bGpoZGhpa3Z6a2VmZWhnbXJzdHN0c3JwcHBxcnN1dXR0c3Nzc3JycXBvb29vcHFzc3NycnJyc3R0dHNxcXFyc3R0dHR0dHRzc3Rzc3N0dHR0dHRzdHR0dHR0dHRzdHR0c3NycnFxcnJzc3Nyc3NzdHR0dHN2jZCMh4eFhYSEgoGCgoGBgYGBgYGCgoKBgYGAgYGCgoGBgoKBgYGAf395c3NycnFxcnJycnNzc3d3d3dzc2pnaWloeX99cW51bG5wcXJycnFxcG9wcXFxc3R0c3NycXFxcG9ubm1ubW5ubnBxcnJycnJycnJzcXBvb3BxcnJzc3JxcnJycnJycnJycnJzc3Jzc3Nzc3Nzc3Nzc3Jxb29ubm9vcXJzc3Jyc3NycnNzcnaPj4uHhoWFhYOCgoKBgYGBgYGBgYGBgoGBgYGCgoKBgoGCgYGCgX9/f3hxcHBwcXFycnJyc3Nzd3d2dnd2cnF0c252f352c3hwcHBycnJycXFwcHFxcXJzc3Nzc3JxcXBwb25ubm5ub25vcHBxcXFxcXBwcXJwb25vcHFxcXFxcHBxcXFxcXJycnJycnJycnFxcnFxcnJycnFwb29ubm1ubm5vcXJycnJycnJyc3JxeI+OjYaDg4aEgoOCgoGCgYGBgYKBgYGCgoGBgYKCgoKCgoKBgYKBf4B/d29wb3BxcnJyc3Nzc3J2dnZ2dnZ3dnZ1c3l/fnd3d29wcXFxcXFxcHBwcXJycnNzc3JycXFwcHBwb29vb29vb29wb3Bvb29vcHBxb29vcHBwcHBvcG9wcHFycXFxcnJycnFxcXFxcXFxcHBwcHBxb29ubm5tbW5ubm9wcXFxcXFxcXFxcXB7j42NhoODhYOCgoKCgYKBgYGBgoGCgYGBgoGCg4KBg4KBgYGAgYF/f392bm9wcHBxcXFxcXBwcHZ2dnZ2dXR0c3NxfYB9fX9zb3BxcXFwcHBwcXFwcXFxc3FycnFxb3yCb3Bwb29wcG9vb29vb29vb3BxcXBub3Bwb29wb29wcnJycnFxcXBxcnFwcXFxcHBwcHBwcHBwb29ubm1ubm5ubm9ub3BwcHFxcXFxcXFxcIKRjoqEhIOFhIOCgoGBgoGBgYKBgYGBgYGCgoKCgoKCgYGBgYCBgX9/gHVvb29wcXFxcXBwcHBwdnZ2dXRzcnJycnGAgoCBeXBwcHBvcHBwcHFxcXFxcXCHhnBycXBzmIJucHBwb3BxcHBvb29wb29vcXFwcG9wcG9vb25vcHFxcHBwb3Bvb3BwcHBwcHBwcHBvb29vb29vbm5tbW1ubm5ub25vb3BvcHBwcHBwcHBwiZCMiISDhIaDg4KCgYGCgoKCgYGBgYGBgYGBgoKBgYGBgYGBgIGBgH+AdG5vb3BxcXFwcG9vcG92dnVzcnFxcXFxcICDg39ycHBwcHBwcHBwcHFxcHBxcX2hgm9yb4uefG9wcHFwcHBwcHBwcHBvcHBxcXBwcHFxb29vbm9wcHBvb29vcHBvb3BwcHBwcHBwcHBvb29vbm5ubm5ubW5ubm1ubm9wcG9vb29vb3BzcXWPj4uJg4KFh4ODgoKBgoGCgoGBgYKBgYGBgYGBgYGBgYCAgYGAgYGAf4B0b29vbm9vb29vb29vb3Z1dHNxcXFxcXJygIKCgXRxcXFxcXFxcXFxcXFxcXJxdZ2hdnF3n5x9b3FxcXFwcHBwcHFxcXBxcHBwcXBwcHBwcHBwcHBwcHBwcHFxcXBxcXBwcHFwcHFxcXFxcXFxcXJxcnFwcnRycnR0dHR1dnRzdHR0dXd3gpCPi4iDgoaHhISCg4GBgYKCgoGCgoGBgYKBgYGBgYGAgICBgYCBgYB/gHVvb29vb29vb25vb29vdXRzcnJycnJycnKDg4OCdnFycnFxcXJxcnJxcXJycnJxmKiQb4KjnX5wcXFycXFxcXFxcXFxcXFwcXFxcXFxcnNzcnJyc3V1dHR0dHR0dHV2d3d3d3d3eHh4eHd3eHh4d3Z3dnV2dnZ2d3h6e3x7e3t6enp6enyGkI2LiIODiIeHhYODgoGCgYKBgYGBgYKCgoGBgYGAgYCAgYGAgIGBgH+Ad3FxcXFxcG5ucG9wcG92dHV1c3Nzc3NzdYiDgYN5cnNzcnJyc3Jyc3Nzc3JzdHKTqaR5iKGefHJzc3Nyc3N0dHV1dXV1dHV3eHd3d3d4eHh3eHh4eXl5eXl4eHl5eXp6e3t7e3t6enp5eXh3d3d1dnV2dnd5enp7fn5+fX1+fn5/gH5+gIyQi4qHg4WIi4iEg4SDgYGCgYGBgoGBgoKCgoKAgYGBgYCBgYGAgIGAf4B8enp5eXx5eHh2dXZ2dHl2d3h3d3Z3dnZ6fnx+fXx2dnd3dnV4enh4eHh4d3h5eZ+0qaSnqZd9e3l5eXh4eXl6enl5eXh4enp5eXh4eHh3dnd3eHh3eHh5eXp7e3p8fH1+fX9/f359e3t7e3p5enl5e3t/foB/fn5/fn19fX5+f35+fn6AjpCNioeEhoqLiIaGhIOBgoKBgYGCgYGCgoKCgoCBgoKBgYGCgYCBgIF/f4B/fn19fX9/f318e3t7eXh4eHh5eXl4eXh5eXl4enp6enp6e3t7fH1+fHt8e3uJr6ahtaqso357enp4eXh4ent6enp5eXp8fHt6enx8fHp6ent9fHx+fn+AgoGAgYKAgH9/gYGBgIB/f35+fn5/fX1+f4CAf35+f39+fn9/f39/gH+Af4OQjoyHhoWIi4yIh4aFg4GCgYGBgYKBgoKCgoKBgYKDgoGBgYGBgIGBgIB/goOCgoGBgX99f39/f4F6enh4d3h4eHh5eHh5enp5e358enx9fXt8fX19fX19fZillqKyoJmnk32Af319fYCDgoCAf318fXx9fXt9fXx8fH19fX1+gYGChISDgoB/gYGBgH9/f4B/f39/f39+fn9/f39/f35+f3+Af39/gICAf4CAgICAhJCPi4eGhoiLi4mKhYaDgoKCgYGBgoGCgYKBgYGBgoOCgYCAgYGAgIGBgH+ChIKCgICAgH9+fn+AgH9/fn18fX19fYB/fX+Af36AgH9/fn9/gICBgICBgIGBnJyOoLCgn6KfgICBgH5+f39+f4B/fn5+f39/gYB/f4CBgYCAgYOEgoGCgoGCgH+AgYCBgYGAgH+BgICAf39/gICAgYGBgIGBgYCAgICBgoGBgYCAgYGFjo6MiYaHiYyLi4qGhoOCgoKBgYGCgoOCgoKBgIGBgYKCgICBgYCAgYGAf4KFg4KBgYCAf39+fn+AfX5+fn19fX5/fn9/f35+fn+AgYCAgICAfn9/gICBgYCXmo6YsaGYlZyFfH5+fn9+fn5/f35/gIGBgoKDg4KCg4KBgYKDg4OCgYGBgYKBgoKCgYKBgoGBgYGBgoKCgYGCgYKCgoGBgoKBgYKCgoKCgYGBgoKCgoaPkY+KiImKjY6MiYaFgoKCgoKBgYKCg4KCgoGBgYGBgYF/gIGBgYCBgIF/gYWEg4KCgoGCgYCAgIB8fHx7fH18fH9+fn9+fn5+f35+f39/f39/gH5+gIF+fp+rpJekm5uWoZ+Gf319f4B/gIF/f39/f3+BgYGCgoCAgYKDg4SDg4ODgoKCgoKCgoKCgoKCgoGCgoKDg4OCg4ODgoKCgYKCgoODg4ODgoKCgoODg4KCh5KTkIuKi4uPj42Kh4SCgoKCgYGBgoKDgoKBgYGBgIGBgICAgYGBgIGBgYCAg4SDg4OEg4ODgoKCgXx9fHx9gn1+f4GCiIGCgoSCgYGDg4GBgYKDgoODho6fsqiioJmdnaaorKigmZGHgYCAgYCAgH9/f3+AgICAgH9/gYODhYSEg4SDgoKCg4OCgoOCgoODg4ODg4SDg4KEhYWDg4SEgoKDhIOCg4ODg4OCgoODgoCKlJOPioqMjpGPjYuGg4KCgoKBgYGBgoOCgYGBgIGBgoGBgICBgYGAgYCAgH+BgoODg4SEhIOCgoKCfXx8fn6AgYOAg4OChIaFhoaFhIWFg4ODg4ODho2grbGmm5qgm56cnJ2hpKOdlIeDg4KDg4ODgoGAgIKCgYOCgYKCg4OEhYWEg4OChISEhIOEhISDg4OEg4ODg4OEg4SDhIWEhISDg4ODgoKCgoKCgoKBgYKCgo+UlI+Njo6RkY6KiISCgoKCgYGBgYGCg4GBgIGBgYGBgYCBgIGBgYCBgICAgIKChIKChIOCg4ODgoJ9fX2AgH+AgoGDg4ODhIaEhIOEhYWDg4GBg4OBg4uXmpeWmKCbnZ2dmZqXkImGh4eGhoeHhoaEgoGCg4SDg4ODg4ODhISFhYWDhISFhISEg4KBg4OCg4SEg4KCg4SCg4ODg4OCgoKCgoKCg4OEhIOFhYWFhoaIk5OTkI+PkJKRjIqIgoKCgoKBgYGBgYKDgoKBgIGBgYGBgICAgYGBgICAgICAhISEgoKCgoGBgoKBgX+AgYOCgICAf4CCgoGDg4KCgYODg4SDg4GDhYSCgYGGjpSTl5qcnJuUj4mHiIiHh4eIiIiFhIOBgIGBgoKCg4GCg4SEhYSDg4OEg4OEhIOBgYGCg4OEhISDg4ODg4OEhIODgoSDg4ODhIWFhoeHh4eIiIiJiY6Tk5KOj46Rko+LiYeCgoKCgoKBgYGBgoKCgoGBgIGBgYGAgICAgYGAgIGAgICDg4KCgYKCgYGAf4CBhYWFhoOCgYB+fn+BgoSCgYKDhIOCg4ODg4KChISDhIOEiJCTj5SYkoeDgoWFhYOEhIWFg4KBgH9/gIB/gIGEg4OEhYWEgoKBgoOCg4OFhIKDhISEhYaGhoaGhoWFhoeHhYaIh4aHiIeGhoaIiYeGhYaGhoeIkZOSkI6QjpGRjImHhYGBgoKCgoGBgYGBgoOBgYGBgYGBgICAgICBgYCAgICAgISEg4KBgoGAgYGAgYKIh4aHhYSCgH99fX6AgH+AgYGBgYGBgoGAgYKDgYKCgoGAh5uIi4eCgoKBgICAf4GAgICAgH9+gIGBgYKCg4OEg4OEg4OCgoGBgoODg4SEg4SEhIOFhYaFh4eIh4eHh4eHh4eGhoaGh4WFhYaGhISEhIWEhYaSk5GOjo+OkI6JiIeEgoKCgoKCgoGBgIGCgoKCgoKCgYGBgYGAgYGBgICAgYGAgoSDg4KDgoGCgYKDg4iHh4iHhYSCgX5+gICAfn5/f4CBgYGCgoCBhI2DgH+AgIB/g4iOgIGCg4OAf39/gICAgICAgICDg4KDg4ODgoOBgYKCgoOCgYKCgoOCgoSDhISDg4SEhYWFhYaGhoaFhISEhYWEhIWFhYSEhISDhISEhISEipSTkZCQj46NiYaFhIOBgYKCgoKCgYGAgYKCgoKBgoKBgYCBgYCBgYGAgICAgYGAg4OCgoOCgoKBgoOCiImJiYiHhYSDgYKEhIOBgoKCg4SCgoSEgoOJloiEgoSCgn9/jJWCgoGChIKBgYGCgoODgoGDg4SDg4SEg4OCg4KDg4ODg4KCgoKCgoGDhISEhYSFhYWFhIWEhIWFhYWDg4OEhISEhYWFhISEhISEg4ODg4OOlZKRkZGPjYyHhYODg4GBgoKCgoKBgYCBgoOCgYCCgYGBgICAgIGBgYCAgICBgICDhYSEhIODg4SDhIOGh4mIhoWDhIODg4WDgYCDgoWFhISDg4OChI6Zi4OFhISEgoCRmYaCgoKEg4OCgoGBhIWEg4ODgoKDhISDg4ODg4SFhISDg4KCgoKCgoSEhYSFhYWFhYODhYWFhYaFhoWEhIWEhYWGhYWFhIWEhISDhIODhJGUk5KTkI2MioWEhIODgYGCg4KCgoKBgYGCg4KBgYKBgYGBgICBgIGBgH+AgIGAgYaGhoaGhoaHh4aGhYSDhYaCgIGBgYGHgoB+f4GBkIyDgX9+fXx9jJyOgIKBgYKChJSUjIGCgYKDgoGBgYKDhYODg4KDg4OEgoKEhIOEhIWEg4OCgoKCgYKCg4ODg4SFhYWFhIOEhYWGhYWEhISEhIOEhIWFhIWFhIODhIOEg4KGlJSSk5KPjYyIg4SEg4KBgoODgoKDg4GBgoKBgoKCgYGCgYGBgYCAgYGAgICAgICAhYWFhYaGh4aGhoWGg4ODg4GAgoKCgYKAf35/f4GWl4mAfX19fXuBmIyAg4GBgYCOlIyQgYKBgoKBg4KDgoODgoOCgoKCg4OBg4SDg4ODg4OEhIKCgoKDgoKDg4ODhIWEhISEg4OEhIODg4OEhIODg4ODg4SDg4ODg4KDg4KDgouUk5KTko2NioaDhIOEgYGCg4ODg4ODgoGBgoGCgoKCgoKBgYGBgICBgYCAf4CAgICDhISFhYSFhYWEhIWCg4KDgoKDg4OBgICAgICAgZWfin5+gH2Hi36EhIOEgoODgo2JhYyCgoODgoqPgoODgoODg4KCgoODgoKDg4KCg4KDg4WEg4ODg4SDg4SEhISEhYWEhIWEg4SEg4OEhISEhISEg4SEhYSDg4SEhIODgoKDkJSSkpKPi4yIhoSFg4OBgYKDg4ODg4OCgYGCgoKCgoKDgoCBgoGAgICAgIB/gICAgISDhYWEhYWFhYSFhYOEhIWDg4SEhIKCgoOCgoSBkaGKf4yEfYaJgH6FhYWEhYJ/fX19gIOEg4OGmI+Cg4SEhISFg4OEhISEg4SEhIOEg4OFhoWFhYSFhYWFhYSFhoaGhoWFhYWFhYWFhYWGhoWGhoaFhoaGh4aFhYWFg4SEhIeTk5OSkoyKiIWGhYWCgoGBgoODg4OCg4KBgYKDg4ODgoKBgIGAgICAgICAgH+AgICAhYWFhYWGh4eGhYWFhISFhYSEhISEg4ODg4OEhYOJkYOEi4WCgYF+fYGHhoOAfn5/f39/f4OEg42ZlZKIhIWEhYWEhISFhYWEhYSGhYWFhYaGhoWGhYWGhYWHhoaGhoaFhIWFhYWFhIWGhoaHhoaGhoaHh4iIiIaFhYaEhYWGjZSTkpGQi4qHhoeGhIGCgYKDg4ODg4KDgoGBgoODg4KAgYGBgICAgICAgICAf4CAgICHh4eGhoeHiIeHhoaEg4ODhIODg4OEg4ODg4OEhISEgYKCgYmBf359foWBf39/f39/f36AgISFlJujq6KTh4WQh4aHhoaFhoWFhoeHh4iGh4eGhoaHh4eGhoeHhoaGhYODhIWFhoSFhYaGhoeHhoaGhoeHh4eIiIeGhoaHh4eRlJORkZCLiYiFhoWDgoKBgoODg4ODgoKDgoKCgoOCgYCBgICBgICAgIGAgIB/gICAf4aHiIeHh4eIiYmIiIODgoKDgoSEhIWEg4KCg4SEhIOBgICAhIR/fn5/gH9/f39/gIB/f4B/f4mSnaWmpqKTkJKIh4iHiIiIhoaHiImJiYmIh4aHh4eJiIaHh4eHhoeFg4OEhYaGhYWFhoaGh4eFhoeGh4aGh4eHh4eHh4eFh5OTkY+RkIuHhoWFhIKCgYGCg4ODg4ODgoKCgoGCg4KCgIGBgYCAgICAgICAf3+AgYB/hoiIiIiHh4iJiYmIg4KCg4ODhIWHh4aFg4OFhISDg4GAgIGMiYGAgYKCgYGBgYB/gH9/fnt5iZiXnKGgnZ2ajIiJiYmKi4qIiIiJiYuLioqIh4eIiIiHh4iIh4eGh4aEg4OFh4eHhoWFhISDhYWEhYWGhISEhYWFhoWGhYOJlJKQj5GOioaFhoWDgYGCgoKDg4ODgoKCgoKCgoKCgYGBgYGBgYCAgICAgIB/gICBgH+GiYiIiYeIiImJiIiEgoKDg4KDhImKh4aEhIWEg4OCgICAhISCgoKCgoKCgH9+fX19fX59fHt+kpuZnZ6cnZOHiImJiImLiomJiImIioqJi4mGhoaGh4WGiIiIiIaGh4SDg4SHiIiIh4WCgoGDg4KDg4SCgYKDgoGEg4SDgY6TkpCPj4uJhYWGhIKBgYGBgoODg4OCgoKCgoKCgoGBgYGBgIGAgICAgICAgH+AgIGAf4WIh4eHhoeIiIiHh4SCg4OCgoOFiYqJh4WHhYSFhYKAgYOEgoOCgoKDgX59fX5+fn5+fn1+fX2AlZqZm5qZkoWGh4eHh4iHh4mHh4aIh4aJiYODhIOFhISFhYaIiIaFg4KCg4WHhoeGhoSCgoOEgoODhIKBgoGBgYODhIOEkZKQjo+Oi4eEhoaEgoGBgYGDg4ODg4KCgoKCgoKCgYGBgIGBgYCAgIB/gIGAf39/gIB/hYaGhYaGhoeHiIeGgYKEhIOChYeIi4qGhIaEgoaGgoKEhIODg4OCg4F9fH1/gH9+fn59fH1+fHqAlpmZmJWSgoKEhIaFhYODhYSEhISEhIWEgoKCgYSEgYKDg4WGhYSCgoGCgoODhYSEhIWEhIaEg4SFg4KDgYKDg4SFhIeSkY+Nj4yJhYSFhIWCgYGBgYODg4ODgoKCgoKCgoKBgYGBgYGAgICAf4CAgYB/gICAgICDhIWEhYWFh4eHh4aAgYGFg4OEhYSHiIWCgICAgX9/gYSEg4ODgoKAfX1/gICBf31+fn18fX17e3qGl5eVlo+BgYKBgoKBf36BgYGCgYOBgoGCgoKBg4SAf4CAgYKCgICAgYCBgoGDgYGChIODhYSCg4SDgoKBgoSDhYWGi5ORj4+Pi4iFhYODhIGAgYGBgoODg4KCgoKCgoKCgoGBgYCBgYCBgH9/gIGBgICAgH+AgIKCg4OChIOEhYWGhn+BfoCBgICAf4GDgn9+fn5+fX+ChISCg4KDgn59fn+AgIGAfn19fX1+fXx6fHuKlpaThIB/gH9/gIB+fYB/foCAgX+AgIF/f4CBgX59fX+AgX9/fn+AgH+AgICAf4CCgICCgYGDgYGAgYGBgYKEg4aPkpCOj42Kh4eGg4ODgYGBgYGCg4ODgoKCgoKCgoOCgYGCgYGBgICAgH+AgICAgICAf39/gYGDhIGCgoOCg4SFgIB/fH19fn19foCAf31/fn1+gIODg4KCgYF/fX1+f4CAgH9+fX19fHt7e3p7e3yNjIqLl4x9f35+f35/gH9+f3+Af4CAf359fn9/fn18fn+Af35+f3+Af39/f4B/f4B/f4CBf4B+f39/gH9+f4B/hZKSj46Pi4uHiYWEhIKBgYGBgYKDg4ODg4OCgoKDg4KAgYKBgYGAgICAf3+AgIB/gIF/f36BgYSEgYKBg4OCg4OBgH98fn9+fX6Af4B/foF/f4CBhIOCgYB/f359fn5/gICAfn19fX17e3x6enp6eX6MjYqRj4F/fn9/f4CAf35/f4CAgoB/fH5+f35+fXx/f4B/fn5/foB/f35/f4CAfn6Af39+f35/f35+fn19fX2Fk5KOjIuKiImIhISEgoKCgYGBgoOCgoOCgoODg4ODgYCBgYGBgYCAf39/f4CAgICAgIB/foCBhIOCgYGDhISDhICBgICBgIGAgYKCgoGBgoCBg4ODgYGBgYCAfX19fn5+f359fX19fXx8fHt6enp6eYaOh4KCg4KAgIGAf4F/gICAgYGCgoB+gH5/fn5+foGAgYB/f39/gICAf39/gYB+f3+Afn9/fn+Af31+fn17fIaTkYyLioeHioiGhoSEgoGBgYGCg4ODg4OCg4OCgoKBgICBgYGAgH9/f39/gICAgICAgH9+fn+BgYGAgISGh4aHgoSDhYKBg4ODhYSEhISEg4ODhIKCgoKCgX5+fX19fn6AfX19fX19fX19fHp6eXl5e4WEgoKEg4GCg4GAgoCCgYGDg4ODgYGCgIGAf4CBg4GEgoCAgYCBgYGAgYCCgn+BgIF/gIB/gICAfn9/fnx8iZSQiomIiIiJiIaGhoSCgoGBgoKDg4ODg4KDg4KCgYCAgICAgYGAf39/f4CAgICAgIGBf359fn5/f39+g4aHh4iChYSFhISFhIWGhYaGhoWGhYGBg4ODgoKAfX19fX19fn59fX19fX18fX18e3l5eXl4fIKDhIWDgYSDgoKDhYeCg4SDgYKCg4OCgoKCgYKFg4iFgoGCgYKDgYGBgYSDgoOCgYKCgICBgIF/gIGAf36Ok4yHiIeIh4aGhYaGhIKDgoGCgoODg4ODg4OCgYGBgH+AgYGBgYB/gH9/gICBgH+AgYB/fn19fX5+f36Ag4SHh4SGhoaFhoaHh4aHh4iHh4eGf32AgICCgX59fX19fX19fX19fX18fH5+fnx7eXh4eXl6f4KCf4OLhIOEhISXl4ODhIF9foGBgoGCgYKBg4aIjIWDgoKBhIKEg4KDhYSEhYODhIOCg4OCgoKCg4OCgpGQi4iIh4mHhoaEhoWEhISDgYKCg4ODg4ODgoGBgYCAgICBgIGBgH9/fn+AgICAf4CAgH9/fn1+fn+Bf4CCgYWFhYeGh4eHh4eIhoeHh4eGh4V+fX18fX9+fX19fX19fX19fX19fXx7iJKCe3x6fIZ5eXl8gIB9h5SDg4OEhJSTgIGBf39/fn6Ei4B/gICEhpCJhYSCgoGFhYuDgYKFhYaGhIOFhYOEhIODhIOEhISIko+MiYiIiYeHh4WGhYSEhIKBgoKDg4ODg4OCgYGBgYB/gIGAgICAf39/f4CAgICAgYGBf39/f4CAgIGBgYGBg4OGh4aGh4aGiIeGhoaFhIOFhH59fHx8fX18fH19fX19fX19fX18fH+RlZaDe3qElHx5enp7fH2BgoGCgYOCgH59f397iJF8fI6Wf31/f4KGioWDg4SDgoONiX99f4OEhYWDhYaGhIWFg4SFhYaEhI6Rj4yKioyJiImHhYWFg4SDgYGCgoKDhIODgoGBgICBgICAgYGAgIB/f3+AgIB/gICAgX5+f4GBgoKCgoODgoOCgoWGhISFhYSGhIOEg4KBgIKAfn19fHx9fXx8fH18fH18fX19fHx8e4uRl4x6e3yBenl6e3x5eX1+f4B/gX99e3x/fn2ClZF/hIh9fH5/goR8fIGChIN/f4eDfYKBgIKCgIODhISEhISChIOEhYGEkZGOi4yMjoqJiYWFhYODg4KBgoODgoKDg4KCgYGAgIGAgICAgICAgH+Af3+Af357gICBenyAgYKDhYODhYWFhYODg4SCgYKDgoOCgoGBgIB/gX5+fX19fHx8fHx8fHx8fHx8fHx9fHx8fn6Kgnt6e3p4ent7fH17fn5/f35+fn59fICBgH6Gj4F+fYJ+f36Agnx8gH+CgIGAfnx7ioJ9gH9+gYCAgYKAgoCAgIGAf4uUkIyMjo6NiIiHhYWFhIOCgoKCg4OCgoODgYGBgICAgICAgH9+fXx7fHx9f3+AgHx6gYF4e4CCgYOFhIOFhIaGhYSAhpSIgIKBgYGBgH9/f39/fn5+gHx8fHx8fHx8fHx8fHx9fHx8fHx9fHl6e3t4eHl7e3p8goCBf4CBfX9/gH99gIKCgICAgX+CkYF/f4CAfoB+fn9+gIGBfX19e319fXx9fHx9gH+AgH6Afn6BlJKNjI2Oj4qFhoaFhISFg4KDgoODg4OCgoGBgYGAgICBgICAf4CAf39/fXt6fICAgHh+gXd7gIF/goKCgoKEhoeGhn6IlYp+gIGAgIB/foB+f39/fn+Bfnx7fHx8fHx8fHx8fH19fHt8fHx8e3x8fHp6eXt8en2Fg4OAgYF+gH9/gH6FgoF+gH9+foCFhoKAfn6Dhn99fH5/gIGAf39+fX19fX57fH1/f3+AfX9+f4yRjo2Njo2Nh4SGhoWEhIODg4OCg4ODg4KBgYGBgYCAgYGAgYGBgYGAgH9/f397en9/e3mAd3p/f31/f3+Af4KEhoaFf3+FgX5/gIB/gH5+f31/gIB/f4B/f319fHx9fn18fH19fX19fH58fXx7fXx8ent6fH19f4aFg4CAgH1+fX5/fouEgYd+fXx8f36Cgn99fX19gXx7fXx+gYSDgYB+fn5+fXx+f4B9foB+f36Eko2NjI+NjIqGhIWEhIODg4OCg4KDgoOCgYGBgYGAgYGBgYB/fXx8fH1+f39/f397e399d352eH59fH18fX5+gYGCg4B6fn58fn6Af35/f35/fn+AgH+AgH9/fn9+fn5+fn1+fn99fH59fn19fXt8fHx7e3p9foCAg4OCf35/fHx8fXx8gYN+jH58e3t9fn1+fn17e3t9fHt7e3uAhoSChIOCf4B+f4KCgn9/goJ/gIuQjY2MjYuKiISEhIODg4ODgoKCgoKCgoKBgYGAgoGBgYKCf3+AgIB/fn18fH5/fn55fX52e3Z4fXx8fHt9fX6BgICAf31/f31+f39/foB/f39/f3+Af4GBgH99gH9/fn9+fn5/f3yCfX59fX17e319fHp8fH2BgoGAgIB9fX18fHx8fH18fnt/fnt7e3x8fH18e3t7e3x8enp9en6CfoKEhIOBgoGFhoWFhoaHhYGEkY+Ni4qLh4eFgoOEhISEg4KCgYGCgoKBgoGBgYGBgoGBgoKAgYKBgYCAgH9+e3x+fnx6fnh5dnd8fHx7e317f4GAf35/foB/f35/f35/gH9/f39/f39/gYKAfn6BgIB/f39/f39+fYN8fH19fH99fX19e3x+fn9/fn5/fnx8fXx8fXx+fnt8e3x8fHx9fH18fnx9fHt7e3x5e3x7e316fX5+f4CAg4eJiYmKiIqJhYiSj42JioeFhYOCgoODhIOCgoKBgYKBgYKBgYGBgYKCgoGCgoCAgX98e3p6eXt9enx+fnl8eXh4dHx8fHt8fHx+gH9/f39/gIB/fn5+fn+AgH9/f3+Af4CDgoB/gIGAgIB/f4CAgH58enx9fX59fX5+jIZ9fX57e4ODfX19fH18fX19fX1+fH17fXx9fX59fn19fX18e3t6fHt8fHt6e3t6enp7fn6DhYiHiIqLi4uJjJGQjoqJhoWEgoKCgoODg4OBgYGBgYGBgYGBgYKCgoOCgYKBgIGBf3+Af356eHl5en5+e3l6eH5zfHx8e3x8fH5+fn5/gH+AgIB/fn9+gIF/f4B/gIGAgoSEgYCAgYGAgX+AgYKBf39+f31+gH57foGSjHx9f4qAjYx+fn19fX5+fX59fHx8fn19fXx9fX1+fX1+fnx7e3t8fH18e3p7e3l6enl5e35/g4OEh4mKiImOkI6MiYmFhISCgYKCgoKCgoGCgoKBgYGCgYKCgoGCgoKBgoKAgYGAf4CAf39+e3p5e319eHx6f3KBfXt7fXx8fn59fYGBf4GBgX9/gH+AgX9/gIGCgYGFg4SCgYGCgYKCgICBg4KAf4F/fX6Afnx/f4mCf36DkYSEg4F/fn18jYd9fX59fXx+f3x9fXx9fX5+fX5/fH18e3x9fnx8e3x9enp5eXl5ent+foCBg4eEiI+Oi4qHhYSEg4KBgoKCgoGBgYGCgoKBgoKCgoKCgoKCgoGCgn+AgIB+f39/fn5/ent5fX16enp9cX6Cent9fX19fXp4f4KAgYKCgICBgYGBgICBgoKCgoWFhIKBgYKBgoF/gIKEgX9+gYB9foF+fX5/gIB9foCEgH5+f31+fX2KhX1+f31+foB+fX18fH5+fn99f4B9fX18fX9/fHx7fH17e3t6enp7e3x9fn6Ag4CJjouMiIWFhYSDgoKCgoKCgYGBgoKBgoKCgoKCgoGBgoKBgYKCf4CAgH9/f39+fn59eXp6fXx5d3t0e4d8dHd9fn17e3Z2fYCBg4KBgYKCgoKBgYGDg4OChYaEg4CAgIGDgX+AgYSBfn6Af31+gH59fn6AgH+Bfn+Af39/gH99f39/f3+Afn9/gH58fX18fn5+foF/gH2CgHx9gIB9e319fXx8fHx9e3t7fHt8fH19fIqKiYmGhoWFhISDgYKBg4KAgIGCg4KCgoOCgoKCgoGCgoGBg4J/gIGAf39/fn5+fn57enp8fHt2e3R3f352cnt+fnt4dnd8gIGCgoKBgoODg4OCgoSDhIOFhoOCgX9/gIKBgICAg4B+foB/fX+AfX1+foCAf4J/gYCAgICBgH1/f3+AgICAgIB/fnx9fX19fn59g32AfoKAfX6AgX98fn59fX17fX58fXx8fHt8e3x+ioeHhYaIhYSFhIKCgoGDgYCAgoKDgoKCg4ODg4KBgYGBgYGCgH6AgYB/fn5+fn5+fn56e3p9goN9dXF6fHpxen59eXh0dICAgoKCg4KDhYOEg4KDhISEhIWEgYGAgH6Agn9+f36Bf35+f4B9foB9fX1+gH9/gYCBgICAgIGBfn6Af4GAf4GAgH9+fX19fn1+fn19gYR/gH9+f4GBf31/f319fn1+fn1+fHt8enx7eoCIg4SEhYSEhIWDgYKBgYKBgICCgoOBgoOEg4SDg4KBgYKBgYOAfoCBf35+fn5+fX5+fnt7en6Jh354cnl9f3F6eHt4eXV1fYKDgYODg4OFhIWDg4OEg4OEhIOBgICAf4CBfn19fn9+fn5+gH19f3x9fX6Af4CAgIKAgIGAg4KAf4B+gIF/gIGAgH9+fn5+fn1/fn6FhYGBgX+Ag4F/foGAf35/f4B/fn17ent6fHt6goWAg4KCgoKCg4GBgYCAgoGAgIKCg4KBg4SDhIKEgoGBgoGCgoB+gIF/fn1+fn5+fX59fXp7fIWEe3tzeXt8cHd1dnd5dXR6hISBhISDhIWFhoSDg4WEgoODgoCBf39/f4B9fX1+f31+f39/fn1+fH19foF/f4B/gIB/gICDgoGAf36AgH+AgYCBgH9/f39/f4B/gIGCgoKBf4CDgn9/g4J/f4B/gX+Af3x6fHp8e3yCgH+Cf3+BgIKCgYF/f3+BgH6BgoKDgYGDg4KEgoSCgYGBf4GCgH6AgH9/fX5+fX19fn19e3t6gH94fHZ5enxxdHh3dnh1cnmFhYKEhIKEhYWGhISChIOBg4GAgIF/f4B/gHx9fX6AfX5/f39+fX98fn5+gX+BgH9+f4B/gYOCg4B/f4GBgIKBgYGAgIGAgIB/gIGAgIKDgYF/gISAfYGDhICAgX+BgYKBfXp7e3x8fYB9f4B8f399fYGAgH59fX9/foKBgYKBgIKCgoKBg4KCgYB/gYKAfn9/fn99fX1+fX19fX19ent7fHZ9eXh6enJ1eXl2d3dzdYaFg4WFgoSEhYSEhIGDgoGDgX+AgX5+gH6AfX19foB+f4B+fn99f3x/f4CBgIF/f3x+gH6AgYKDgYCAgYOEgoGAgYB/gYCAgYGAgYGBg4OBgX+Ag4B+goOEgICCgYKChIJ+e3t8fHx9fn1+fXp+fX14fn9/fHx8fn5+gYCBgYCAgoGBgYGDgoGBf4CAgoB9fn19f319fX59fH19fX16e3p8dnx6d3t4cnZ5e3Z2dnN0hoSEhYWChISFg4ODgYOBgYOBgIGBfX+BfoF9fX1/f39/gH5+f359fYB/gIGBgX9+fH5/fn5/gYJ/gYGCg4eFgX9/fn6Af4CAgICAgIKCgYCAfoCCf3+BgoOBgYOCg4OFg399fX18e3x8eXp7en15e3l4f357fHt+fX1/f4F/gH6BgICAgoOCgYF/gIGBf31+fH1+fX19fX18fn58fXx5e3x4enx3endzeHd6c3Z2c3SFhISGg4KDhISDgoKCg4GCgoGAgYF9gIB+gH1+fX5/gIB/f39/f3x/gH+BgIGAf359f39+fn+BgH2AgIGDg4N/f359fn5/f4CAgH9/gYKBgH9+gIF+f4CCgoCBg4KEhIaEgH5+fHx8fHp5dnl5enl2eXZ+fHt7e359e399gH59fX9/f3+BgoGBgX5/gYF+fX18fX19fX19fXx+jYF8fXl7e3p5fHd4eHR1dXhyd3d0doaEhIWEg4ODg4OCgYKDgoGDgn+Bf35/fn+AfX19fX6AgIB/f39/fIB/f4GAgYCAf3yAf35/fn9/fX5+gYGCgn5/fn1+fn5+f3+Af32AgIB+fn1/gX5+gIKCf4KDgoOEh4SAgH58fXx8e3x1eXl4eHh5d3t8e3t7f4V9fn1/ent+fn59foGAgIGAfX6BgH59fXx9fX19fX18e32Dgnx8ent7e3p7d3Z4dXJzdnB4eXJ4hYWFhYOEhIOChIKBgYKBgIKBgIF/fn5+foB+fX58foCAgH+AgIB8gH6AgH+BgIB/fYB+fn9/f359fX6AgYGAfn9+fn59fX5/fn9+fH6Af35+fn+Cfn6AgIF+gYOCg4OGhICBfnx9fHx7fHh3e3h1eXd3eXx6e3t9kod9fH13en1+fn19f35+gH98foB/fn19fH19fX19fHt8ent9enp4e3x6ent4dHh1cXJ0cHh4cXmEhYWFg4SDgoODgoGBgoKAgoCAgIB9fn5/gH18fnx/gIGAgICAgHyAf4B+f4GAf399gX9+f39+fX18gICAgIB+f35+fn18fn9/f358fYB/fn1+gIJ/foCAf36ChIKCg4WFgoJ+fXx7e3x8eXd7eXd4d3d4e3t6e3yFiX17end6fH19fHx9fX1/fnx9fn59fX18fX5+fX18fHt6enx7e3p5enp7enhzd3VxcXNveHdxe4WGhYWDhYKBg4OBgoGBgoCCgICBgH5/fn9/fXx+foCBgoGAgIGBfX6Af35/gX+Af3+BgH9/f319fH1/gICAgH9/f35/fXx+f39/f319f39+fn6CgYF/gIB/foGDgoKEg4SCgn5+fHx6fHt7eXt6d3N2d3h5e3p7eXp/fnt7d3p8fXx8fH59fH19fH19fXx8fX19fX99fXx9e3l7fHx7enp6enp6eHN2dXBwcm93dnJ7hYaEhYOEgoGDgoKBgYGCgYKBgYGAf4B/f399fX9+gICBgYJ/goF9foF+fn+Bf4B/gIJ/gIB+fH58f3+BgICAf4B/f4B+fX5+f4B/f39/gH9/f4J/gICAgIB/gYGAgISBgoKAf39+f3x9fn56fYR+dHx9enp6enx5eXp6hoV3eXx8fHx8fXx8fHx8fX19fHx9fX19fn19fX16eX18fH16enp6enp5c3V1b29xb3d0c3yFhoOEgoOCgYKBgoKCgYKBgoGCgYCAgICAgH59gH+Af4GCgn+CgX+AgX5/gYB/f4CAgn+Bf319f35/f4KAgICAgIB/gIB+fn1/gH9/gIB/f39/gH+AgICAgH+AgYCBgYGCgYCAf39/fn1/fnuBko16fH18e315e3p6eHqBgXh5fHx8fXx8fHx8fHx9fX18fH18fn1+fn59fHp8fHt8fXt5enp6eXl0dXVvb3Fwd3N0fYWGg4OCg4KAgYCCg4KAgYGCgYKBgYCBgIGAfn6Af4GAgYKCgIKCgICCfoCBgX9/gX+BgIF/fH6Af3+AgoCAgICAf3+AgH9+fX6Afn2AgIB/f3+AgICAgYCAf4CAgYCBgYKCgICAf39/fX5+fIGGiXx8fnt7fnl6e3p7j393d3l7fHt9fHx8fHt9fH19fX18fXx+fn5/f358enx9e3x9e3l6e3p5eXN0dW5zcXB4cnV6hYaDg4KDgoCAgIKCgYCCgYKBgoGBgYKAgYF/fn9/gYGCgYKBg4OAgYJ/gYGBf4CAgIB/gX99f4F/gICBgICAf4B+gICAf359foB+fn+Af39/gH9/gICBf4CBgH+BgIGCgoKAgICAgIB9foB9gIOCe35+e3x9e3p8fHuHenh4eXx8fH17fHx9fX18fH19fn19fX5+f3+Af317fH18fHx7enl7e3l5c3J1bnZycHhxdXaFhYOEg4KCgICBgoF/gIKCgoKDgYGDgoCCgYB/gICCgoKBg4KEhICBgX6BgoF/gICAgH+Cf36AgYCCf4B/gIB/gH+AgIB/fn2Af35/f4CAgH+AgH+AgYF/gICAgIGAgYGBgYGAgYCAgH9/gH5/fX59fn57fXx9e3x9eHh1eHh5e3x8fXt8fHx8fX5/f39/fn19fn9/gIGAf3x9fHx9e3p7eXp8eHpzcnVud3FxenF2d4WFg4SDg4KBgoKDgICCgYSDg4SBgYOBgoKCgYCAgIKDgoCCgoSDf4GAfoKDgICBgICAf4CAf4GAgYKAf4CBgH9/gICAgIB/f4CAgH+AgICAgIB/f4CBgYCAgICAgYGAgoOCgoCCgYGCgYB/f4B/gId+fnx7fXx7fX94d3Z5eXp8fHx8fHt8fH19fn5/gIGAfn1+gICAgoGAfH59fX58d3t6ent5eXNxdW53cHV6cXZ5hYWCg4KDg4KChISAgIOBhoODhIGChICEg4KCgICCgoSBgYKBhIJ/gIB/gYOCgYCBgYCAf4GBgYGBg4B/gIOCf35/goGAgH9+gYCBf4CAgYCBgYCAgIKBgYKBgX+BgYGBgoOCgoOBg4OCgYCBgH9/hH19fXx/fXp9f3t6dnp4eXt7fH19e3x9fX19fn+AgYGAgH+AgICDg4B8f35+fn15eXt6enp5c3J0b3dxd3lzd3uFgoKCgoOEgoOEg4CAg4OGg4ODgoKEgYSDgYOAgIKBg4GCgoGCgX6AgICCgYKCgYKCgIGAgICCgoGEgH6Bg4F/f4CDgoCBf4CCg4KAgYKBg4KDgoGBg4KChIGAgYOBgYKEg4KEhIODhIODgYGBgoCCf4B/fYB8enx/e3t3fHl5eXt6fX59fHx8fH1+foCBgYCAgIGBgYSEgH2Af39/f357e3t6e3p0cHhxeXR2eHR2e4SCg4KDg4SChIODgYKChIaEgoOCg4SBhIOBg4CBg4KCgoKCgYKAf4GAgIKBgoGCgoKBgIGBgYOCgoOAfoGDgX9/gYSEgYN/goKBg4KCgoGEg4OEgIKEgoOCgoGCgoOBg4SDhIOEhISFg4SCgYOCgYOBgYGAgH58fIB9fHh8eXp5enx9f3x7fHx9fX18fICAgICAgYGBgYKBf4CAgICAf3t7e3p6enVweHd5dnV8dXZ8gICDgoODg4OEhISBgoOFhYWDg4KDhIKEhYKCgYKDg4GCgYKAgYB+gYCBgYKDgoKCgoGAgYKCg4KCg4B/gYOCgICChIODgoGCgoGDgoKDg4ODg4SAgoSDg4OBgX+Bg4KDhYKEhISEhISDhISChIOEhIKBgoCBgHt9gX58eXx6enp9fHyBfnp8fH19fHp7fn5+gIB/gYGBgICAgIKBgIB/fX18fH18dnJ2eHh2dH92dX2Hh4OChIWDg4SFhIGChIaEhIOCg4SEgYOFg4KCgoODgYOBgoCCgH2AgIGCg4KCgoKEgoCCgoODgoKBgICCg4KAgYOFhIOCg4CCgoOCg4ODg4OEg4CCg4KEg4KCf4OBgoSEgoODhISEhIOEhIOEg4WEg4ODgoKAe4CBf3x8fXp6fH2AfX9/fHx6fH59fH19fn5/f39/gICAgH9+foCBgICAfnx9fn5/fn18fHh2f3Z3f4SHg4KDhoODhIaEgYKFhoWEhIODhISChIWFgoKDg4SCg4KDgoKBfoCAgoKDgoODg4SDgYKCg4OCg4KCgYGDgn+Cg4SDg4KEf4KEg4ODgoSDg4SCgIOEg4SDg4KCg4KChIOCg4OEhISEhIWEg4OEhYSFhIOBgoB9gYKAfXx8e3x8gH19foB+fn1/fnx8fH19fn5/fn+BgYGBgH9+fX6BgYB+fn1+fX59fX5+f3+AfH2AgYKCg4OGg4SDhoSBgoiGhYSDg4SEhYGFhYWDg4SDhIODgoOCg4F+gYGCg4SCg4OEhIOCg4KEg4ODgoKDgYOCf4KDg4ODgoOAgoWDg4ODhIODhIOBgoSEhYODgoODgoGEg4GDg4SEg4SEhYSEhIWFhYWEg4ODf36BhIB9fXx8fHx/gX5+f39/fX99e3x9fX19fX5+f4CBgIGBgH99fH6Cf39+fn5+fX1/f39/gICAf4CEhIODg4WDhIOFf36CiouFhYSDgoSFgYaGhoOEhISEhIODg4OEgn+BgYODhYSFhIWEg4KEhISFhIODgoSDhYKBhISFhYaEgoCDh4SDg4OFhIWFhIGEg4OHgoOCg4GCgYSDgoODhIOEhIWEhYWHh4aHhYSEhYSBf4GDf35+fH5+fX+BgH9+fHx/f358enx9fX19fX5+fn9/gIGBf319fIB/gH5+fn5+f3+BgYGBgYKAgYWFhIOEhIKEg4aAgoSFi4mEhISEhYWCh4aGhISEhIWEhISEg4SDgYKDg4OEhIaEhYSDg4SEg3yDhHuBhHd5g4F9hH5+cnWDgoF2foOEgH2BdYF6hH9/f36EhIKDgoKBg4SDhISFg4SFhoSFhn2EeX1+f4N7hYOAhIOAf31+f35+gYOBfXt/fX6Afn18fHx9fX19fH19foB/gYJ/fX18f4GBgICAgH+BgYGBgYKDg4KChoSEhIWEgYOEhYOEhYSKiIWFhYOFhYSGhoaDhISFhYWEhYWEhIWCgoOEhYWFhoSFhIOEhYWCaICFanx7cXF8gXOGc3R0fYKDdXNxg4ZzcHVyc3SDdnt9dYF/goOAgnZ5hYCDgIR/hYSChYWCaHpyc3N8gHKBhH6Dg32BfX5/fn+Cg4J8f4F9f4B9fXx8fHx9fHx8fn1+gX+BgX99fX2AgYKBgYGBgIGBgYKBgoKCgoSHhIWEhYSBgoSGhoOFhIaIhoaFg4aGhoeGh4OFhYaFg4KFhoSFhYODg4SEhoaGhIaEg4SEhn1we4FweXZ+g3+CbnlwdXN8dnl5hnKEg3B2eHF2dHR1cnN0dml/gG5yb3R2bnVsd216c26Ah3ltfXJzdnN2bW53bHB5bHV9f358foGAgX2Af32Af4B/fX18fH19fH1+f32Af4CAfnx/foCBgYCBgICAgYGAgIKDgoKDhYeGhoCChYODhYeGg4WFhYaHh4SDhoaIiYaHhIWGiIeEg4WGhYWEhIOFhIKFhoaFhoWEhoWHdnB0e3BydX+HhYNtdW92b3x1coR5eYd4cXR3bndod3pucHaCcoN+b3p5eW1vbnpvb2x3fXiGcHF6cHJ0ZoF1fm57eXNveX+Af31+gYB/e39+fYF+gIB+foCAgYB+fn9+foF/gH9+fYB9f4CBgIB+fn+BgH9+goOCgoSFh4eEfoeEg4OFh4aEhYWFhoaIhISGh4iIhoeEhoaLioWEhoeHhYSFhIWEgoWFhYWGhYWGhYZxdXByc29zenl+hHSIdHV+iHZugnKEhnluanJ/cW1zd3x/dXR8hH54cXV3bnl1enF2eHV6eYRyaW95eHBreXN6b3p3dnZwgYB/fn5/f396fn19f31/f359gIGDg4CCg4GBhIKBf4GCgH1/f4F+f359foGAfn6BgoCAgoSHhoODhoSEhIWHhoWFhYWHhoiFhYaFh4eFhoSGhomIhYSJi4iFhIaFhoWDhYWEhoaGhoaFg3iLeXKIentwcIWEeIV4eWtzfnl7a3KDh4N6fG16eXl0fYB2bm+AgG90fHV3cHl9fW19dW+DhYZ6gHJye3x1cG96a3N8bnaCgYF+fn99fXt9e3x9fX9/fn1/f4KCf4GDgYGDgYB/gICAfn9+f31/fn1/gH58fYGAfn6Ag4iFhoOFhYWFhoeFhYWFhYeHiIaEhoWHhoaFhIWFhIWFhomKh4WFhoWGhoWGhoSGhoaGhoWGh4eHhoaEhoWGh4iHhYeGhoOHhoWFg4SFhoWGhIaEg4SEhoSDgYODhIOFg4WEhYSGg4WGhYWEhIWHhoSEhYaFhX13hYOEhIOCgX5/fnt8e357fH1+f399fH9+gYB9f4F/f4GAfn5+gH5+f35+fX99fX5/fHt8f358fH+BiYaFhIaGhoWGh4WFhYWGhoeIhoSGhYeFhYWDhIWGhYSGhoeGhYSGhIWGhoaGhIeGh4eGhoeIiIiIhoWHhYaGiIaFiIeIhYeGhoiFhYaHhYaGhYOChYWGhYWDhYSEhIaEhoWEhYWDhoaFhYWEhoeGhISFhoOFhIKEg4OFg4OBfYB/e3t8fnt8fH1+fnx8fn2Afn1/gH5+gH99fXyAfX5/fn5+f3x8fX57fHx/fHt7fn+Ih4SEiIaGhYeGhYWEhoaGhoiHhIWGh4aFhIODhIaFhIeFhoaFhYaEhYaGh4eFh4aJiIaGiIeIiYiFhYiFhoeGh4aHhoeFh4eGh4WFhoeFhoaFg4OFhoaEhIOEhIOEhoSGhoWFhYOGhoWGhYSGh4WEhIWFg4SIhoSDg4SDhIJ+gYB8e31+e3x7fn59fHx+fX5+fX9+fX1+fnx9fH98fn58fYF/fHx8fXx8fH56e3t8foiHgoWIh4eGhoaGhISGhoeGiIaEhYSHhoSFh4OEhYSFh4SFhoaFhoSGhoeHhoaHh4mIhoaIh4iKiIWGiIWGh4aHhoeGh4WIiIeHhYaGh4WGhoWChISFhoWFhISEg4SFhIaGhoWGhIaFhoaFhYaGhYSDhISDhIeDhIGChIWDgYCAgXt7fn18fHx+fXx8fH1+fH18fn18fX18fHx8fXx+fXt8gX99fH18fnx8fHp6fHx9iIeChoiHhoeGhoaEhYaFhoaGhYOFhIaFhIiJg4GEg4SGhIaGhoaGhIeHiIiHh4eIioiGh4iHiImIhYiHhIaGhoeHh4WHhoiIh4eFh4eHhYaHhIKEg4SGhYeFhISEhISFhoaGhoaFh4WFh4WGhYaFhIOEg4OEh4GDgIKDhIKCgn+Ae31/fXx8fH59fH19fH17fHx7fHx9fXt7e318e359e3x/fX18fX1+fXx6ent7fHyIh4KGh4aGh4aGhYSFhoWFhYWEg4WChoSDiId/enqChYaEhoaFh4aEh4eIiIiHhoiKh4aHh4eIiYeFiIeFh4eGhoeHhYeGiIiHhoWHhoiGhoiEg4SEg4aGh4WFhISEhYaGhoaGhYaHhoaIhoaEhoWDg4ODgoOGgYN+goKDgIOCf398f39+fHx9f318fX18fnt7e3p7fHx8e3t7fnt7fXt6e358fHx8fX5/fXt6fHp8fImHg4aFhoWGhoWFhIWFhYWFhIOBhIGGhIKEhHyAhn+ChYWGhYWGhYSHh4iIiIaFiYqHhYeGh4iIh4WIhYaHiIaGh4eGh4aIiIeFhoeGh4WFiIOEhoWDhoaHhoWEg4WFhoaGhoaFhoaHhoeHhYOFhYOBgoKBg4WCg36BgoF/hIJ/f35/fn98fH1/fXt9fXx+enp7eXt8fXt7e3t+fHx8fHp7fXx8fHx+fYF8e3t7e3x8iYeEhoSGhIaGhYSFhYWEhIOEgoCDgYaDgYJ/eoSMe4CEhYeGhoaEhIeIh4aHhYWHiYeEh4WGhoiGhYeEhoeIhoaIh4eHhoeIhoSGhoaHhYWIg4SFhIaGhoeFhYSDhYWGhoeGh4WGhoaFhoaEg4SFgoGCgYCEg4KCfYGBf36DgX5/f4B8f3x9fX59e359fH15enp5e3x9enp7e318fXx8enp9fHx9fH5+gHt7e3x+fXyIh4WGhYeEhoSFhYWFhIODgYOBgIKBhYJ/gH9/fXx7gYSFhoaEhYSEh4eGhoaFhIaJhoKGhIaGhoWFh4WHiIiGhYiHiYeGhoeFhIaFhYeFhIeDhIWEiIaGh4WFhIKFhYaFhoaHhYWGhoWFhoKDg4WBgIGAgISAg4B8gYB+foKAfYB/gX2AfH1+fX57fn18e3l6enl6fX15enp7fHt8e3t6e319fH18f35+fHt7fX59fIiGhYaGhoWFhYSFhYSDgoKAgoGAgICDgX5+foB5en2Ag4SFh4WEg4OHhoOEhYSChYiFgoSDg4WFhYWGh4aIiIaFiIeJh4aFhYWDhoSFh4ODhoSEhYSHhoWGhYaEgoWFhoaGhoaEhYaGhIWFgoKDhH9+gICAgYCDgHyBf31+gn5+gH6Af399fX59f3t/fXt6eXp6eXp8fXl6ent7enx7e3t7fH19fXx/fn18fHx/fnx7h4WFhoaGhoSFhIWDhYKBgICAgYB+f4KCfX1/f3t/f4KDg4WGhYSDg4aDgYOEgoCFh4WCg4GBg4SEhYaGh4eHhYWIhomHhYSEhIKFg4SGgoOGhISGhIeGhoWFhYOEhYSFhoWGhISEhIWDhYSAgIKDf35/f39/gIN/fIB9fX+CfYCBfn6Bfn5+fX1/e398e3p5enp5ent8eXp6e3t7fHp7e3t8fX19fYB9fXx8fYB/fXyGg4aGhYaGg4SDhoKFgYGAf3+AgH5/gYF8fn9/fn+AgoKChIWDgoGChIGAg4KBgISFhIKBf4CCg4KEhYWHhoaEhYeFh4WGgoOCgoOCgoWBg4WEhYaEhoaGhoaFg4SEg4SFhYWDhIODhIKEhIB/goJ/fX5+fn5/hH57f3x8gIF9gYB9foN9fn59fX57fnt7enl7enl6ent5enp6e3t8enx8fHx+fn1/gXx9fHx9f4B+gIaEhYWEh4SEg4KGgoOAgYB+fn+AfX9/gnx9f35+f3+BgYKEg4KBgYKCf4CBgoCAgoWEgoB/gIGCgYKGhYeFhISGhoOFg4WBgoGBgoGCg4GChISEhYWGh4eGhYWEg4ODhIWFhIGDgYOChIODgH+AgX59fX5+fH6Dfnx+fHyBgX6Cf35/gnx/fn19fHx8e3t6enp6eXt5e3p5enp6e3x5e317e35/f4GAfX99fX1/gICAhoSEhYSFgoSCgoSCgoCBgH59fn9+fn6AfX2Afn5+foGBgoODgoSHgYF+gICBf3+ChIOBf35/gIJ/goWEhYOCg4WFgoSBg4CBgIGAgYKBgIGEg4OGhYWHh4WEhIWCgoKDhYSCgYGBgYCFg4F/foB/fnx8fn18foN9e358fYB/gIN9fYCBf35/fXx8fH17e3p5enl5e3l6enl6ent7e3p7fXx8f3+BgoB+gH+AgH+AgIDKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzNzc3Nzc3Nzc3NzczMzMvLy8vLy8vLy8vLy8vLzMvLy8vLy8vLy8vLy8vMzMzMzM3Nzc7Oz8/Pz9DQ0NHR0dLS0tLS0tLT09PT0tLS0tLS0tPT09TU1NTU09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tLS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1dXV1NTU1NTT09PT09PT09PT09TU09PU1NTU1NTU1NTU09PT09PS0tLS0tPT09TU1NTU1NPT09LS0tLS0tLR0dHR0dPHhnNlYFtLWWdVTUZIQD03Nzg5Nzw8PDo8Oz42Oj04PDs6OTg3ODs7Oj87PTs8PD47P0E/QkJBQ0RFREE+PTw7QENDQUBDQ0FBR0hHSUtSwtXS09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXVysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMy8vLy8vLy8vLy8vLzMzMy8vLy8vLy8vLy8vLzMzMzc3Nzc3Oz8/P0NDQ0NHR0tLS0tLS09PT09PT09PT09PS09PT09TU1NTU1NTU09PT09PT09PT09PT09PT1NTU1NTU1NTT09PT09LS0tLS0tLT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1NTU1NPT09PT09PT09PU1NPT09TU1NTU1NTU1NPT09PS0tLS0tPT09PU1NTU1NTU09PT09PS0tLS0tLR0dHSzIxyZ2BcTVllUktHSz87Mzc4Ozg5Pj05PDpBOjs9Nzs8PDo6Nzg6Oz0/Oz88PTw/Pj9BPUFBPkNDREJAQT46Oz9DREFDRERCQklHSEhJTr7V0tPT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1crKy8vKysrKysrKy8vLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzMzMzMzMy8vLy8vMzMzMzMzMzMzLy8zMzMzMzMvLzMzMzc3Nzc3Ozs/P0NDQ0NDR0dLS0tLS09PT09PT09PU09PT09PT09TU1NXV1dTU1NTT09PU1NPT09PT09PT1NTU1NTU1NTU1NPT09PS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1tbV1dXV1dTU1NTT09PT09PT09PU1NTU09TU1NTU1NTU1NTT09PT0tLS0tLT09PU1NTU1NTU1NTU09PT09PT0tLS0tHR0s+Sd2hfXk9XZ01LRks9ODc2NTk5OTw+OT88Qzk7PDc5PD07OTc5Ojw9QDs+PT47PD48PT5BQD5EQ0NDP0E9Ojs+QkNFQ0NEQT9FSEpJSky61dPT09TU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8rKysvLy8vLy8vLy8zLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMzMzMzMzMzMzMzMzMzczMzMzMzMzMzMzMzMzMzc3Nzc3Ozs/Pz9DQ0NDQ0dHS0tPT09PT09PT09TU1NTT1NTU1NTU1NTV1dXU1NTU1NPU1NTU09PT09TU1NTU1dTU1NTV1dTU09PT09LS0tLS0tLS09PT09TU1dXV1dbW1dXV1dXV1tbW1tXV1dXV1NTU1NTT09PT09PT1NTU1NTU1NTU1NTU1NTU09PT09LS0tLT09PU1NTU1dXV1dTU1NTT09PT09PT0tLS0dHRmn5nYWJOVWpKSElLPzw6OTM3Njc2PTw+Oj06Ojo4ODo7Ozg4Ojs7PD46PT09Ojw/PD0/QkA/Q0RDRD5APT08QENEQ0JEQkQ+REhJSUtMttfT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3MzMzMzMzMzMzMzMzNzc3NzczMzMzMzMzMzMzMzc3Nzc3Ozs7Pz8/Q0NDQ0NHS0tLT09PT09PT1NTU1NTU1NTU1NTU1NTV1dXV1NTU1NPT1NTU1NTU1NTU1NTU1dXV1NXV1dXV1NTU09PT09PS0tLT09PT09PU1NXV1dbW1tXV1dbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1NTU1NTU1NXU1NTU1NTT09PT09PT09PU1NTU1dXV1dXV1dTU1NTU09PT09PS0tLR0p+DaV9kU1hsSEhIS0A9Nzg0NzY6Oj87RDw8Ojw8OTg6OTo6Ojs8Ojo7OT48Pjk9QDs/QUFCP0JCQUM9Pz8+PEBCRUNDQkBBO0ZJR01MSbLY09TU1NTU1NXV1dXV1dXV1dXW1tbW1tbV1dXW1svLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzM3Nzc3Nzc3Nzc3Ozc3NzczMzMzMzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc3Mzc3Nzs7Ozs7Pz8/P0NDQ0NHS0tLS09PT09PT09TU1NTU1NTU1NTU1NTV1NXV1dTU1NTU1NTU1NTU1NTV1NTU1dXV1dXV1dXV1dTU1NTU1NPT09PT09PT09PU1NXV1dbW1tbW1tbW1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTV1NTU1NXV1dXU1NTU1NTT09PT09PT1NTU1dXV1dXV1dXU1NTU1NTT09PT09LS0tSjiGxfZlJWakdIR0lBPTM2Njo7PDhDPEJBPjxBPDg5Ojw6Ojw8PDk8PTo7PD09PD89QD9AQT9AQUBCPD4+PzxCQ0NDRkBBQT1ISklOTUeu2NPU1NTV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbLy8vLy8vLy8vLy8vLy8vLy8vMzMzNzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzs7Ozs7Oz8/P0NDQ0NHR0dLS0tPT09PT09TU1NTU1NTU1NTU1NTU1NTV1dXV1dTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dXU1NTU1NTT09PT09PT1NTU1NTV1dbW1tbW1tbW1tbW1tbX19bW1tXV1dXV1dXV1dXV1dTU1NTU1dXV1dXV1dXU1NTU1NTU09PT09PT1NTU1NXV1dXV1dXV1dXV1NTU1NPT09PT0tLWroprY2VSWGhMSkdJQjg0OTQ6Ozo5QDk+Q0U/PDs5OTk9Oj07PDw6PTw7OTw9Ozs/PUA9PT5AQD9CQT5APD05QERDQkFBQj48SEpLTU5HqNnU1NXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbWy8vR09PT09PT09PT09PT087Ky8vLzMzMzMzMzMzMzM3Nzc3Nzc7Ozs3Nzc3Nzc/Pz8/Pz8/Pz8/Pz9DQ0dHR0dHR0dHR0dHS0tHV2djY2NnZ2dra2tvb29vZ2dnZ2dna2tra2tra2tjW19fX19fX19jX2NfX19rb2tra2tra2tvc29vb2dfX19fX19fX19fX19fW1NPT09PT09PT09PU1NbV1dXV1dXV1dXV1dXW1tbX1tbW1tbV1dXV1dXV1dXV1dTU1dXV1dXV1dXU1NTU1NTU1NTU09PU1NTU1NXV1dXW1dXV1dXV1dTU1NTT09PT09PS1bqKa2hoUlhlSUlMTkA5OTo0O0A8Nz05QUM+QD89ODo6Ozk9Oz4/Ojs8PDo7PDo7Pj1APT8/P0FAQUE/QTw8Oz5BRENBREA9PElJSk1NRqPa09TV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbW1svMg21wcHBwcHBwcHBwcGqn493d3t7e3t7e3t7e3t3S0NDQ0NDQ0NDQ0NDQ0ci5ubm5ubm5ubm5ubq6t6WkpKSkpKSkpKSkpKSnhmBjY2NjY2NjY2NkZGRlhIuKioqKioqKioqKioemuri4uLi4uLi4uLi4ubSNi4uLi4uLi4uLioqKiJ+7ubm5ubm5uLi4uLi3vdPT09PT09PS0tLS09PT2+Lh4uLi4uLi4uLj4+Pi2NfX1tbW1tbW1tbV1dXV1dXV1dXV1dbW1dXV1dXV1dTU1NTU1NTU1NTV1dXV1dXW1dXV1dXV1dXV1NTU1NTT09PT09XDkXJsaU5TYkxMVk08Ojo3Nz5DPzg+Oj8/QTw/QDc7Ojs7PTs+Pjo7PD48Oz07PT8+QDw/Pz1AQEBBPj88PjxAQUVCQkZAQD9HSEpLUEae2tXV1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19fLzU4mKysrKysrKysrKysiivTr6+rq6urq6urq6uvp1dLS0tLS0tLS0tLS0tTEqaqqqqqqqqqqqqqqq6aGhIWFhYWFhYWFhYWFik4MEhISEhISEhISEhIRE0pUU1NTU1NTU1NTU1NPg6ejo6Ojo6Ojo6Ojo6ScWFJTU1NTU1NTU1NTU093qKSko6Ojo6Ojo6OjoqvT0tLT09PT0tLS0tLS0t/r6uvr6+vr6+vr6+vr6dnX19fX1tbW1tbW1tbW1dXV1dXV1dbW1tbV1dXV1dXV1dXV1dTU1NTV1dXV1dXW1tXV1dXV1dXV1dXU1NTU1NTU1NPUy5h3bGlKTl9NUlVNPjw8Nzs/Qz42Ojc+Pzs9QkA5PDk9Ozw6PD07PTs9Ozs9PD0+PT07QT08QUBBQT08Pzw7QEJDQURFPUFAQ0ZLS09GmNzV1dXV1dbW1tbW1tbW1tbW1tfX19fX19fX19fXy81SLDExMTExMTExMTExJ43z6enp6enp6enq6unq6dXS0tLS0tLS0tLS0tLUxaqrq6urq6urq6urq6yoiIeHh4eHh4eHh4eHh41SEhgYGBgYGBgYGBgYFxpOWVdXV1dXV1dXV1dXU4WopKSkpKSkpKSkpKSmnlxWV1dXV1dXV1dXV1dTeqmlpaWkpKSkpKSkpKOs0tLS0tLS0tLS0tLS0tHf6urq6urq6urq6urq6unZ19jX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dXV1dXV1dXU1NTU1NTU1NGcenFpSlRdT1JVTkQ+Pzs/QEA4Ojs4PDw8Oz46Ojs4Ozk5Ozw7Ojw5Ozs8Ozo9PT0+PUE/Pj8/Pj08PT88PEFBQ0FERTw+QEVGSktNRpPc1dXV1tbW1tbW1tbW1tbW1tfX19fX19fX19fX18zOXDk9PT09PT09PT09PTWT8Ofn5+fn5+fn5+fn5+bV0dLS0tLS0tLS0tLS08Wtrq6urq6urq6urq6vq46NjY2NjY2NjY2NjY2SXSInJycnJycoKCgoKCcpWmNiYWJhYmJiYmJiYl6MrKmpqampqampqampqqJmYWJiYmJiYmJiYmJiXoKtqampqampqampqamosNLS0tLS0tLS0tLS0tLR3+np6enp6enp6enp6enn2djY2NjY19fX19fX19fX19fX19bW1tfX19fW1tbW1tbV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbV1dXV1dXU1NTU1NTWo3txZElbYE5OVU9AQT89REI+Oz06OTo6PTw7PDs6OTg5OTs8Ozw8Ojo7PDo7QD08PTxAQTxBQTs7PEA/PD1CP0RDQ0U8PkJERkpMTEWN3NXV1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjMzcTCw8PDw8PDw8PDw8PCydDPz8/Pz8/Pz9DQ0NDQz87Ozs7Ozs7Ozs7Ozs7NzMzMzMzMzMzMzMzMzMvJycrKysrKysrKysrKysfCw8PExMTExcXFxsbGxsvMy8zLzMzNzMzMzMzLz9HR0tLS0tLS0tLS0tLRzczMzMzMzMzMzMvLy8vN0tLS0tLS0tLS0tLS0tLU09TW1tbW1tbW1tbW1dfY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NfX19fX19fX1tfX19fX19bW1tbW1tbW1tXV1dXV1dXV1dbV1dbW1tbW1tbW1tXV1dXV1dTU1NTU169/cF5GXmJQUVdOR0ZDQ0lBPz07PDo8N0BBPD04Ojs4OTg7Pzs8PDs7PDw8PD87PD46Pj44PkI8Pj1BPjw+QkBERUNAPD5APkNJSUtEh9zV1tbW1tbW1tbW1tbX19fX19fX19jY2NjY2NjYzc3P0NDPz8/Pz8/P0NTQ0M7MzczP09LSzs3P0s7Ozs7Ozs7O0tPPz8/T08/P0NPSz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0NDR0dHR0dHS09PU1NTU1dXV1tbW1tfW1tbX1tfX19fX19fX19bW1tbW1tbW1tbW1tbW1tfX19fX19fX1tbW1tbW1dbW1tbW1tbW1tbW19fW1tbW1tbX19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjX19fX19jY19fX1tbW1tbW1tbW1tbW1tbW1dbW1dbW1tbW1tbW1tbW1tXV1dXV1NTV1di4gm9WSl9jUlFaS0hBQTxCPT07Oj4+PD4/PT0/ODk6OTk3OD48PD47Ozw7PDs/PT0+OTs7OT0+P0A+QD07OkI/QkNCPz0+QD5CRUdKQoDc1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2M7Ozs7Ozs7Nzc3Nzsqfys3Nzc3QuYOEi8fTwJrLz87Ozs7O0qucz9DQoZbL08eSq9HOzs7Ozs7Ozs7Ozs7Oz8/Pz8/P0NDQ0NDQ0NDR0dHR0tLT09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbV1dXV1dbW1tbV1dXV1dXV1NTU1NXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NfX19fX1tbW1tbW1tbW1tbW1tXV1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXYwIBuVU9gY1dZW0xMQ0A9PTw9Ojw9Qj5CQkA8Ojg5ODo6Ojc7Pz4/PDw7PDo5Pzw8PTg5PD9BPj09PUFAPTtBQkBCQz47QD9BQUlHSkF629bW1tbW1tbX19fX19fX19jY2NjY2NnZ2djY2dnOzs7Ozs7Ozs7OzdKpj63Rzs7Ozpu3tqSiwJOerNPOzs7O0racpaPWp6Crn8+ZrJqy0s7Ozs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0dHS0tLT09TU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dbW1tbW1tXV1dXV1dXU1dXV1dXV1dXW1tbW1tbW1tbW1tfX19fX19jX19fY2NjY2NjY2djY2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2dnY2NjZ2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV18h/b1pTYWVeXVxPSkQ9QD8+PDc6Pjk/RD5AOTg3ODk7Ozw4OT89PTw9PD47OkE7OTs5OzxDQDw7PT5AQT49QkQ/QkM9PT8+Pz5ISUg/ddrW1tbX19fX19fX19fX2NjY2NjZ2dnZ2dnZ2dnZzs7Ozs7Ozs7Ozs/Inrym0tDQzsqgl36Cw6abr6fUz8/Pz86dnJGeuZ6WkKG0lYadnM3Pzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dLS0tPT09TU1dXV1dXV1dXV1dXV1dbV1dXV1dXV1tbW1tbW1tbV1dXV1dXW1tbV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2djY2NjY2NnZ2dnZ2dnY2NjY2NfX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dbV1dXV1dfNiHNdWGloXl9gT0lGOkFAPj48PDk2P0I/Qjo2NDg6Ozo8Ojk+PD49PTs/PTxBPjw8Ojw8PTw6PEA9QEI+PkFCPUNDPT0+Oz9BRUtIQHDZ1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2c/Pz8/Pz87Ozs7SrKWnqdXAvNLHnY+ey9PJipmq1M/Pz9G/mKCbtZefoKiZtb/Jl5nF0M/Pz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0dHS0tLS09PT1NTU1dXV1dXV1dbW1tbW1dbW1tbW1tbV1tbW1tbW1tbW1dXV1dXV1dXW1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnY2NjY19fX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0JB1W1tqaWFeXVNOSTxDQEE+QD46OEVAP0I6NzQ6Ojo5Ozs4Oz0/Pj49QT08P0A9Pjw8PDw8Oj1AQD8/PT5CQD9AQkA8QD0+QUVLRz9r19fX19fX19fX2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnPz8/Pz8/Pz8/QzJ2Nl6zQmpfKxZ6ynpbN1q2ZqtTPz8/TtJmWqrmcpqCLn8TTkZmhz9DQ0M/Pz8/Pz8/Pz8/Pz8/P0NDQ0dHS0tLT09PT1NTU1NXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX19fX19fY19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tKUcl5ea2tqZV1PTEc/RENDQDo9OzxCPD08OTY0Ojk4Ojo5Nzs/QDs8PUA8PEE+PD07PTw/PDo8Q0A+PTs9QD5CPkBBPkA9QD9GSUQ/ZtXX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2traz8/Pz8/Pz8/P07GigJuvyqCjv8qcpYynrdiqmarUz8/P1KuafqOPpZvHyZTYraO/ntXR0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1NXV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dbW1tXW1tbW1tbV1tbW1tbX19fX19fX19fX19fX2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbSk3BgXnBoZmVaUUhHQkVDQEA3Ojo8Pjk8OTc2NTk6Njo8Ozc8QEA8Ojo9Ojw/Pj08OUA8PDo6OT9APT08PUBBQz9APz5BOz9ARkpCP2LS2NfX2NjY2NjY2NjY2dnZ2dnZ2tra29vb29vb28/Pz8/Pz8/P0M6fkGyclteqo9PSrqa1mJ/Vqpmq1M/Q0NSsm6eLl5SflZWku82IlZ7I0tHR0NDQ0dHQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1dXV1dbW1tbX19bW1tbW1tbW1tbX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfW1tfX19jY2NfX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX1tbW1tbW1tbW1tbW1tbX19fX19fW1tbW1tbX0pNuYFxxZGdkWlVKQENHREFBODs/PD07PDw3NTU4OTY4Ozo5PDo+Pzw8PTk8Pz49Ojo+OTw6Ojg+Pzw9PTw+QEFDQT48PDpCRERKRkJd0NnX19jY2NjY2NjY2dnZ2dna2trb29vb29vb29vPz8/Pz8/Pz9G9n8O31pfA09HQ0srSzZeb1KqZq9XRz9DTtrKypZ2Gnq+znaXQ26OZtdXR0dHR0dHR0dHR0NDR0dHR0dHR0tLT09PU1NTV1dXV1tbW1tfX19fX19bW1tbW1tfX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19fY2NjY2NjY2NjY2NjY2djZ2dnZ2dnZ2dnZ2dnZ2drZ2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fX19fX19fW1tfX1tbX19fX19fX19fX19bW19GSbF1cb2doYl1PRj9ISEZFQDw8Pj48PT08NzU2Ojk2Ojs6Ojs4QD86PDw5PD49Ozs6Pzk/Ojs5PT49Pjw7PTxAQ0I/Pz47Q0ZGR0hEWc3a2NjY2NjZ2dnZ2dnZ2dna2trb29vb29vb29vb0NDQz8/Pz8/Pz5V+e6WS1KKa08ySl6ObodirmavV0pem1cSimZagj6ObopyckaeYnrvV0dHR0dHR0dHR0dHR0dHR0tLS0tLS09PU1NTV1dXV1tbW19fX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tbX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2tnZ2dnZ2dnZ2djY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX1tfPjGRWXnBrXGBgTkVITUlJT0M+OkI9PUBCOzU1Nzw6Nzo7Ojo7OT09Ojo6OT0+Pz07OT47PDo8Ozk+PD47PD0+QENCPz5BPEFDR0ZGRVXJ29jY2NnZ2dnZ2dnZ2dra2tvb29vb29zc3Nzc3NDQ0NDQ0M/Pz9DR1aeZrcmjqL7KnbGdo7XZqZup2LiroMfVoquknL6eqKGjnqiiqZ3Q09LS0tLS0tLS0tLR0dHS0tLT0tPT09PU1NTV1dbW1tbX19fX19fX19fX19fX19fX19fX19bW1tbW1tfX19fX19fW1tbW1tbW1tbX19fW1tbW1tbW1tbX19fX2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2djY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fX19fX19fX19fY2NfX19fX19fYzYZdV2JvZE9dVEtIRlJRS0tAPj1EPD9DRj01NTc7OTY6Ozo7PTo7Pzo6OTg6PT0/Pjs/Oz49Ojs5Pjs9PD0+QURCQD8+PzxAQUVHRURSxdvY2dnZ2dnZ2dnZ2tra2tvb29vb3Nzc3Nzc3NzQ0NDQ0NDQ0NDQ0NO5gL3Tm5bP1LWLkZ/T1LyBu9TOlKDT08iRjbTZr42RpdSako6+1tLS0tLS0tLS0tLS0tLS0tLT09PT09PU1NXV1dbW1tfX19fX19fY2NjY19fX19fX19fX19fX19fW1tbX19fX19fW1tbW1tbW1tbW19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2tnZ2tra2tra2tra29ra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2NfX2ct+WlVpaltMX01KTEpUTEZCPDw/RkVHS0k9NjY3Ojk3OTo7Ojs9OT45ODo4Oz0+PkE+PTk8PDo9Pj47PTk5Oj9FQUA+PT8/QkBHRURFUMHc2dnZ2dnZ2dna2trb29vb29vb3Nzc3Nzc3dzc0NDQ0NDQ0NDQ0NDQ0cHR0crI0tDUxLjS0tHSwtLQ08fM0tHUyMHV0tXAvdbU07nI1dLS0tLS09PT09PT09LS0tPT09PU1NTU1NXV1dbW1tfX19fX19fX2NjY2NjX19fX2NfX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29va2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2djY2NjX19fX19fY2NjY2NjY2NjY2NjY19rHd1xSZ2laTlpOTFBRV0VKPz89P0FETExBPjc3NTo4ODg5OTo8Pjw+Nzo6OTs+P0A9Pj46NTo6Oz0/Ojs5Ojw+QkJAPz8/P0FCR0RDRE683dnZ2dnZ2dna2tvb29vb29vb3Nzc3Nzc3d3d3dDR0dDQ0NDQ0NDQ0NDS0NDR0dDQ0dPU0dHR0dPR0dHS0tHR0dPU0tLS1NXT09PW1NLS0tPT09PT09PT09PT09PT09PU1NTU1dXV1dbW1tfX19fX2NjY2NjY2NjY2NfX19jY19fX19fX19fX19fX19fX19fX1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tvb2tra2tra2trZ2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2trZ2tra29ra2trZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjbwXNYVWlrU0xSTlBSWVRGSTw+Qz9BQkVKPT03ODY5Nzc4OTk7Oz0/QDw8ODk7Ozs/Pjw8OTU6PT47OTk7PD8/P0JCQT1BPUBBQkZCQkJLtd7Z2dra2tra2tvb29vb29vc3Nzc3Nzd3d3d3d3R0dHR0dHR0dHR0dDQ0NDQ0NDQ0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tPT09PT09PT09PT09PT09TU1NPT1NTU1NTU1NXV1dXV1dXW1tbX19fX2NjY2NjY2NjY2NjY19fY2NjX19fX19fX19fX19fX19fX19fX19fW1tbX19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2NjY2NjY3LxvVFRsbExLUkpUUlVLRkQ6PkdEREFERjw/ODk6OTU5OTo3PD07PkA9PTc5Ojs5Pjs5OTY2Oj1AQT47PDk6Pj9DQT4/Qj0+QkNFQkFCSrDe2dra2tvb29vb29vb29vc3Nzc3Nzd3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0tLS0tLS0tLS0tLS0tLS0tPT09PT09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1tbW1tbW19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19fW1tbW1tfW19fX19jY2NjY2NjZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2dnZ2dnY2Ny2a1NbcGtLVVdSXFFXSEQ+PEJKRT1ISj89PDc4ODo1OTg5Njs+PD1APDw1OTk8Oj87OTk0ODw9PUFBPD47Ojw+QD89PkE9PUNGR0I/Qkmq39ra29vb29vb29vb3Nzc3Nzc3N3d3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHS0M/U0M7P0tLT0tLS0tLS0tLS0tPT09TU1NTU1NPU1NTU1NTU1NTU1NTU1NTV1dXV1dXV1dbW1tbW19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19jY2NfX19fX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dndsGRTYXJfT1pUV19RUkdCPUVJS0FBTEQ/Pzs5ODg5Mzg2ODY5Pj0+Pz06Njo7Pjs9PTo5Njg6PTtAQDxAPz0/P0I+PD48PEJFSElCPkNJpODa29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3t7S0tLS0tLS0tLS0dHR0dHR0dPT0bm7zLqbnLrQyNPT0tLS09PT09PT09PU1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2NjZ2dra2tra2tra2tra2tra2tra2tra2tra29va2tra29va2tvb2tra2tra2tra2tra2trb29vb29va2tra2tra2tra2tra2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ3qpfVWBuW1VZUVpeT0xHQ0ZNSUZEREk7QUE7PDg4NjU4Njk4Nzw/QT89Ojc8Pz48Pz87OjY4OD09QEE9QD5BQD1AOjs6Pj1BRUdKQkBDR57h29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e0tLS0tLS0tLS0tLS0tLS0tO+wMqaoKKViJGeqpOpz9TT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fY2NjY2NnZ2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dna2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2tvb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2d6iXFVeblheXU5aUFROQ0NMSUlJRkpEPEFBPDs4NzY3OTc3OTk9P0E/PDo5QD88PkI/Ojg3NzY9P0BAPUBBPz88PTs7OD48P0VJSEE/Q0aX4dvb29zc3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3tPT09PS0tLS0tLS0tLS0tTIlZyum5m1iX2TjIKBhMTV09PT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tvb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dndmlpYYW5ZYVdPV01QRUJES0lNS0ZJRT5CRDg4ODY3OTc1Njk4PT1BPjo4OT4+PD9APzw1Njc2PD4/PjtAQEA/Pj4/Pjs/PkFCRkdCQENIkeLb29zc3Nzc3d3d3d3d3d3d3d7e3t7e3t7f39/U09PT09PT09PT09LS0tLTz6h+kayPko6MhoCIiYSQo8rU09PT09PU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY19jY2NjY2NjY2NjY2NjX19fX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2tra29vb29ra2tra2tra2tna3JJaWWNuWlpSVV5QTDxAR05IUklIRT48SEY4OTc1Nzg3NTg5ODs+Pj07ODlBPj1AP0E+NzU5Njs+QUI/P0BAQUI/Pj8+QUBEQUZIQj9FSozi3Nzc3Nzc3d3d3d3d3d3e3t7e3t7f39/f39/f1NTU09PT09PT09PT09PWtaWaiIuQhYCFi4iBg4qLf4bC1tTU1NTU1NTV1dXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2dnZ2dna2dra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29ra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb2tra29uIWltnalxYTFpfVkg6TEhMSkpDREVDQUxINzo3Njc4ODU4Nzg5PDw7Ozk4QD89Pj8/PDY3PDQ3P0JCQUBAPz8/QT09P0A+QEBGRT09REuI4tzc3Nzd3d3d3d7e3t7e3t7e3t/f39/f39/f39TU1NTU1NPT09PT09PUxZKCg4WGfYGCfXx5foGCg36k29bU1NTU1NTV1dXV1dXV1tbV1tbW1tbW1tfX19fX19fX19fX19fX19jY2NjY2NjZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vc3Nzc3Nvb29vb29vb29vb29vb2tra2tra29vb29zb29zb29vb29vb29vb29vb29vb29va2tvb29vb29vb29vb29vb29vb2tvZgFpebWhaU0ldW1hKRE1ISlNMR0ZBQD9KQjg7NjY5OTc1ODY4Ozo7Ojw5OD09O0A9Ozo2NTw3Oz1CQEFBPD49QEE9PEA/Pz5CREU+PERLg+Lc3d3d3d3d3t7e3t7e3t7f39/f39/f39/f39/V1dTU1NTU1NPT09PT2LKEkKh9g3l2hIh/e3d5gn5+i67A1dTU1NXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dna2trZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2trb2tra2tvb29vb29vb29vc3Nzc3Nzc29vb29vb29vb29vb29va2trb29vb29zc3Nzc3Nvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc1nlcWmxmWFJPYFFSQUhHSkZYTEZAQENDSz87Ozc4ODc2NTc2ODo5PDw6PTs/PTs9Pjw7ODg8OT0/QkFCQzw8P0FCPj1BQkNCREVDQDtDTH3h3d3d3d3e3t7e3t7e39/f39/f39/f39/g4ODg1dXV1NTU1NTU1NPU0ruen3WKeXuIgICChYGDcnOAhYOMrNfV1NXV1dXW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NnZ2dna2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra29vb29ra2trb3Nzc3Nzc29zc3Nzc3Nzc3Nzb29vb29vb29vb29rb29vb29vb29zc3Nzc3Nzc3Nvb29zc3Nzc3Nvb29vb29vb29vb29vc3Nzc3Nzc3Nvb29vb3dByXV9wZVdLUGNPS0JHQ0pIS0ZBPEE9SFFBOjo3Nzg3Njc4Nzw6OD09PD47QD88Pz07Ojs5Ojk8QEJAQkNAPUFAPz1AQkNDQUBAP0A7RU144N3d3d7e3t/f39/f39/f39/f3+Dg4ODg4ODg4NXV1dXV1dXV1NXU18h4i4V8goh6g4SBfoKCc2l0hYuGkJ3U1tXU1dbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tvb2tvb3Nzc3Nzc3Nvc3Nzc3Nzc3Nzc29zb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb297KalxjcWVST1heSz9HTElPS0VAPkFCP0lPPjk6NzY7NzY6Ozc7Ojg6PDw+Oz09Oz48Ojs4OTo4OUFCQkFAQDtAQj06PkFCQz8+PT4/PUZOdN/e3t7e3t7f39/f39/f4ODg4ODg4ODg4ODg4OHV1dXV1dXV1dXV1s6dhpl+f5OTin+CgXx9gnNxm4mAgoOJwNnat7TQ19bW1tbX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tra2tra2tra2tra29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NvfwGNaW21gVlBTU0pETEhNSEk8PkFEQ0ZORDw8OTc5OjY4Ozk3PDk4OTw9OzlAPjpBPzw3NTc7ODpAQUVBPz45PUI/Oz1CQkI6Pj07PT5GTnHe3t7e3t/f39/f39/g4ODg4ODg4ODg4OHh4eHh1tbW1tbW1tbV1tjLioCHhYOXjHh7e3lvfYF1a3ebdHZ7eInHxpiMrdjZ19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2drZ2dna2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tra29vb3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29zb29vb3Nzc3Nzc3Nzd3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3Nzc3Nzc4LdjV1lrYlJNVVFMSktGS0ZDQD5CQT9FTT4+PTg5OTo3OTo3NT03Nzo+PDs7Qjw5Pz05NjY4PTk6QEJGQD49PEBCREA9QD9DO0A9PD4/Rk9t3N/e3t/f3+Dg4ODg4ODg4ODg4OHh4eHh4eHh4dbW1tbW1tbW1tfVrYZ6d32rn3l4entzdH+Dfm9xe3l6c3t2k4qFgImkzdnY19fX2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tna2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29vb29vc3Nzc3N3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vc3Nzb3Nzc3Nzc3N3d3d3d3d3d3dzc3Nzc3Nzd3d3c3Nzc3Nzc3N3d3d3d3d3d3d3d3dzc3OGtYVtebGJSTVZMTUdLS0RGQkI7QT08RUxCQT44Ojk6Nzc5NjY6NTs+QDs9Oz89PD89Ojk5Ojw5PEVDRkA/PkBDQkQ9OT0/QT1CPz1APkdPadvf3t/f3+Dg4ODg4ODh4eHh4eHh4eHh4eHi4uLW1tbW1tbW1tfQmH+Qh4N9eoN2e3Vzenl6kKqmd3JyfoeHh4CAfoKEhJHJzNnX19jY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra29va2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2djY2NnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vb3Nzc3N3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzb29vb3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3dzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3NzhpV9UYm1iUE9TSUhHRkpJSUJBPkJCPEVFREA+ODo4Ozc3Ojc4ODY+Pz07PDk9PDo+PTs6Njc7NjpEQUY+Pz8/PkNBPzs9PT47REM/PjxIT2fZ4N/f3+Dg4ODg4eHh4eHh4eHh4eLi4uLi4uLi1tbW1tbW19jYyH52doN+fnR2eIaCenl1d5yhu6GEgoCAfoeKinx/gYaMnKjO2NjY2NjY2NjY2djY2NjZ2djY2NjY2dnZ2dra2tra2trb29rb29rb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3d3d3d3c35pbT2drXFBRUElDT0pLR0xHSkJAP0FHREBBPDg8ODg1ODk3Njc3QEA/Ozw5Pj04PTw8Ojc4PTk/RENGPkE/QkBDPzw6Pj0/PkVEPz07S1Fj1+Hf4ODg4ODh4eHh4eHh4uLi4uLi4uLi4uLj49bW1tbW19XB3LRueHJze3B6eXaFiIR7eH2AgZiljH98fnuRhZaLhoGDgY6Rvd3Z2NjY2NjZ2dnZ2dnZ2dnZ2dnY2dnZ2dna2tra2trb29va2tva2tra2trb29ra2tra2tnZ2dnZ2dnZ2dnZ2dna2trZ2dnZ2dra2tra2tnZ2dnZ2dna2tra2tra2tra2tra2tra2trb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t3d3d6NWFdobllQUUtISlNJTUhNSUtBQz9DRkJBRDs6PDg2NDg4NzY2Nj8+Pjo8OTw7Oj09PDw4Ozw8RERERT4/PkI+Qj84PT8/Q0NCQEE+O0xUY9Xh3+Dg4OHh4eHh4eLi4uLi4uLi4uLi4uPj4+PW1tbW1teslLZ6eHJvd5V7dHuLgHh1bn6Fg3t/hYhyfH2bnI6JioJ+g32Hk5rH1NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2trb29vb29vb29vb2tra2tra2tra2tra2tnZ2dnZ2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2trb2tra2tra2tra2trb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d7Zf1lgaGxcUUtHR09LTk5PTURGQkg/Q0hERUA6Ozs4NzU3Nzc4NThAPkA7PDk8Ozw+Ojk7OTk7OUZERUI8QD4/PEBDOz5AP0A/Qj8+OjtKVWPV4eDg4eHh4eHi4uLi4uLi4uLi4uPj4+Pj4+Pj1tbX19vKhYR3cXJubniVhHt4hH95dnB4c3eLkY6CdnN9ioaId3d1d4ODfIiIk8Pb2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2trb2tvb29vb29vb29vb29rb2tra2tra2tra2tra2tnZ2dnZ2dna2tra2tra2tra2trb2tra2tra2tra2tra2trb29vb2tra2trb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f0nVZaGlqVk5KSE1OR01EUElGSD9FPUZMREM+Ozs8ODc3OTY2OTU4Pj4/PTs8QDs9PDo3Ozc5OThHREVCPUE9Qj8+QDw/QUE/QEJAPjs8S1Ri1OLg4eHh4eLi4uLi4uLi4+Pj4+Pj4+Pj4+Pj49fX19fEknuJf29sbnV2foSBg4qGfnVybWVtiIaKjoR7c4OHint4e4OPj4GEioqxztrZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29zc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tvb2tvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3dzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f3t7e4clsW2pqalNOR0hOT0VIRk1JSUA7RD5ISUA9PDo6Ozg2ODo3Nzk0OD08PT07ODw8PDw4Njc4OTo6RUJFQT9APEI/Q0M+PkNEQUBAP0A8PUtRYdPj4OHh4uLi4uLi4uPj4+Pj4+Pj4+Pj4+Pj5OTX19fZqXaFfnx3bHB3eXh8jH2KhYB3anN0d3p9bot7fnl6foR/gIGDfnh8foeGlrbT2tnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra29ra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/e3uO9amFpa2lRTkZNTEtKWE1OR0FAQE9BRD9AOzw4OTk5Njg2NjY4NDs+PD07OTY6Ojk6OTU4OTg5OkJERj8+Pj5AQEBCPzxBQD88Pj9BOT5KT17S4+Hh4eLi4uLi4+Pj4+Pj4+Pj4+Pj4+Tk5OTk19fX2sqKhIB5c29tcXN1d4CUeHaAfHWHhXd1cnWgmXp7d3Z5doR0bWxue3iAmouTu9za2tra2tra2trb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc29vb29vb2tra2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f397js2lpbmloUFBPTExPUk9LU0Y/RURERD48PDg6ODc5OTU2ODY2NzM6Pjs+PTc6Pjk5OTk2Ojo4NzxDRUc/Pzs/PkA9PkE9Oz0+OUFAQDhBTlFc0OTh4eLi4uLj4+Pj4+Pj4+Pj4+Pk5OTk5OTk5NjY2NjauY6AenZ1bmpveHCBfWt0cnZ3hIV5h4d5lY55eXp1d3pza298gHx2fYh8gLLe2tra2tvb29vb29vb29vc3Nzc3Nzc3Nzc3dzc3Nzc3Nzc3Nzb29vb29rb29vb29ra2tra2tra2tra29va29vb29vb29vb29zc3Nzb29vb29vb29vb29vc3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3t7e3t7e3d7e3t3d3t7e3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/f39/f4qpqa2hrZFNQT0ZQVFJOSFJLPkREQ0I7Ozk5Ojg2ODg1NjY4ODg0Oz88Pzw5PDw3Ozo6Nzo6Nzo9Q0JDPUE+Pzw5PT5BQDs8PDtFQD47Q05TXNDk4eLi4uLj4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTY2NjZ1p5vdntveHh2cG50d3BwdHBzb36Jc3qGhY2EenNtcoB6hn1vg5OBdnx9g4a13drb29vc29vc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29ra2tra2tvb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4N/f3+GgbWhma2ZVVlJHUFFOS0xMRUJIRUc9OD08Ojo3Nzg2Nzc2NTY3NDg+PD09Ojg6OD46Ozc4Nzc6Oj5DRDtDQj49OD1AQUM/Pjw+RTw+PUJNUF/S4+Hi4uLj4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk2NjY3MB2doCCfnp4eHBsdXlya399bHNvdGdoaYB/aWl4c2d+iYl4cIKGe3d9foWKvN3b3Nzc3Nzc3Nzc3Nzc3Nzc3d3c3Nzc3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODflGttZm5mU1NJUFlUTEhGTkZGRUJGPTs+PDs5NzY4NTc5NjQ1NzU4PDs9Pjo6OztAOTs7ODc6OTlAQkE8QUE/Pzk/QEJFQ0FAQEM7Oz1ES01g1uTi4uLi4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk5NnZ2tmYc3uqhJaCcnR1dn14aGx8d2h4d25rcHR5gIJ3dHyBhIJ9c3CAin94gn95g8je29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f4N/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh24tubWdzY1lRTVVbV0hDSUZOS0dCRD8/Qjo7OjY2NzU2NzY0ODc2Ozw7Pj86PDk8Qjg3OTo6Ojk6QUFCQUJDQEE+PT9CQ0NEQUJGOTg9REpOYtjk4uLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXZ2drcqHGCtXiRfnNsem6EgXaCfWtoan+DeHZ8dX2FhXRmcHl9d316gIqFe318foC03tzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3dzc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3Nzd3d3d3d3d3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e397e3t7e39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4ODg4ODg4tiFb3FrdWFWT1VVXE9ETUY+SkdKRUQ8P0I6PDk4Njg0NTY3NDc2NDk7Ozw7OD47PEE4ODo9OD04Oj09QEBAP0FCP0A+QENCQ0FBRTc2O0RMTmPa5OLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXl29ra3Z5sbnNxhY1ybXBuf391hH5rcnZ2enN4gXhzbnVwbWt2fHmFiIB/f392coODsd/c3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eDg4eHh4eHh4eHh4OLXhW1xb3ZeUldTWlpRSkhDQFFAQkQ8OT9BOjw5NzU3NDU2NjQ3NTY9PDo9PTk+OjxAODo6PDY7OTs+PUJCQjtBQkBDQEBEREM8PUA3OjxFS01l3OPi4uPj4+Pj5OTk5OTk5OTk5OTk5OXl5eXl5dPOxsB+cWxveHt2b3VuanNzbZKGeG50dG5vdIZ/b2twboJ0bXZyfY2DdnF/d3mKgabf3Nzc3d3d3d3d3d3e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3dzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t/f3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi1oZucG1xYFJZUFdfWUpMTElSP0Q9OTtCRjs6OTc0NTY1NzU0NjY2Pj07Pz45PTk7Pjg9Ozo0ODtAQENCQ0FCRkE/Q0BBQkREOz0+OTs8QkxNZODl4+Pk5OTj4+Tk5OTk5OTk5OTk5eXl5eXl5eW5t7Woc3JscHd6dHd4bXFydXd/hHRyc2xsa3F8bnBudGuBf3GAd32Eg355gHNygYqg2d3c3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh49WHcWxqbF5YWlVXYFZWUE9QTD1BOjs8RkE4Ojg3MzY1Njk2NTg1Nz89Oz8+OT04Ozw5PTs7NTo9Q0JCPENDREREQUE/PkJDQzw9Pjg5PENLS2PN0dnh1sjY4+Tk5OTk5OTk5OTk5eXl5eXl5eXltbW2q3J5cm59f3Z1d2hqaGlwb3Zta2tnZWZxdG15gG5teXd2iHhxa2podXV5dHV/wd/c3d3d3d3d3d3e3t7e3d3d3d7d3d3d3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHi4uHh4ePVhnFwY2lhV1NZV19MUk9STUtAPjg5O0E+ODc5NjQ3Njc6NjY2NDk+Pzo8Pzo/OTo6Nzo9PDk5PEFBPTtBQ0VDRkA+Pj5BRUQ+QEE3OD5GSEpesrW4wbm1u8jg5eXl5OTl5OXl5+fn5+fm5ebm5ra2tbWOfX5weoR1cnZnYmNlbGtyb2ZpbHZtd4Z9hXlsbHd4a3ZwfH14c3V5fHd2h7ng3d3d3d3d3d7e3t7e3t7d3t7e3t7d3d3d3d3d3t7e3t7d3t7e3t7e3t3d3d3d3d3d3d7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4eHj1Yd1bl5uY1pUU1hXS1NLSk1SR0E4Ozs+PDk4NzU2NTY2OTY4NjY5Pzw6PT07Pzo7Ozk8PDs5Oj4+Pjs8PUFEQkNBQEBBP0JDPDw9Nzs+REVKXrG1tLW2t7e2y9rJ3uXl3eDi3tXU1tPU4OPg39+2treuh3t/bnmNenJ1bWNobGxtaXR4enF5enqIh4N6aWh9cWRvcXyGgX55e318e4an2t7d3d3d3d7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4uHh49aGdmxhb19dV1lcWlJQSEpXTEVHPUA9Ozs9OTY0NjU1NTg2NzY3OD87OT09PDw5OTw6Pjw6OTg+Qjs7Pj5AREBDRUFAQD0/QDw9PTU5PEJHRl2xtbW2uLm5ubq9uMPT0r3BwcC6u7y6u8TMxb/Dt7e3hGl1gX1ndYd5Z3Vxa2t5eHB3fH15bWl3e3h3bml1j4FwbHl4d3d9gXuGgnmAoNze3d3d3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODh4OHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4ePXhXJrZ3RhW1hYX15TVVVRVUpMRj9JRDs5PTY2NDc3NTc4Nzc3ODk8PDo+PDg8Oj0+OTs8OTs5P0E8PT9DP0FARUJCQTw9Q0A6Pjw1NDlER0dasbW1tre5ubm5ubm3ubm4uLm5urq6urm5urm6u7e3uX9ucHN6b3B/eXNuc3Vsc3Z4cXFwb2tvcX6Bc2mHhIF9dHOHdW11hYmBgHJ2hafd3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uHj14lxa2xyW1dXXWBUUVVUUFJPSkNATUE9Ozk2NTM0NjQ2ODc3Nzk6Pjs8Pjs5PDo8PDk8PTw7PT0+PUNEREBDQkE/QD48PkE8OD06NjY6QkpIWLG1tLa2uLm5uLi5uLe3uLi5urq5ubi4uLi6uru3uKx7cnhxf3ZzfnBsbXpyZ29sbW50cHt3d3Jyd3pvhpJ2f3x8enZ5fH9zfYdyda3T393d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4eHh4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi49eHb2pxalVWV2FbT1FSUE5XSURESUo/Ojk6NzUzNDk1NzY2Nzg4Ojw7PD46PDo6PTw5PDw9Oz09PDs9REdEQ0E8PDw8Pj5AOzg8ODE1OkFGRVautbW1tre4uLm4uLi4uLe4ubq5uLi3t7i4ubq7t7mqcnB4d3x7e4J3aG5xam9qY2lyf21zcn54dHFsanaAeX2AgH91doB1a4qLgHaR1d/d3d7e39/f3t/f3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f4N/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLi4uPYhm1sdGVWUFxnWE1YU1JRWUVDS1BOOzk4ODY1NTM5NTY2NzY4Nzk+OT0+OTw5OTw7Njg5OTo8QEA9PkBGQEJCQDo+PEE9Pzs7OzYxNjxCR0RQqLa1tba2tre4t7i4uLi4uLm6ubi4t7e3t7e5ure2tIlyd3h9iXxwem99c2hqbGdnbHRscXd0cWx2c3Fxd3FyfHl4g3Z7d2mLkYp9kM7f3d7e3tvY2drZ297f39/e3+De39/f3Nvc3N3e3uDg3+Dg4ODf3t7e39jS397f397e3t/f3t7f3t/f3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLi4eLi4uLi4uLi4uLi4uLj4+Lj4+Li4uPj4+Pi4uLi4+Lk14NoZ3VkVlVkZVdKWllXW1Q9RU1LSD04NzU3NjQzOTQ0Nzc1Njc5PTo9Pjw9PDk7PDk5Oj45PD4/PkFBQ0FFRUQ+OzxBPjw5PDs3Mzc+REhFSqG2tbW1tbW2tre4uLi4t7e4uLi3tra2tra3uLm2traLfXpsbHp/cGx5dm5qaGdlcXp4b2lvb3B1c21zd4Fnb32CgYNyf3lqcHJ6f6ng393Zy8a/vb6/vsLN0tDW3tnc4NfQzcPCw8PH1dfT2dzX1NjX0MfExce9vM/Kz87Y3djO3N3c2t3T0dze39/e397e3t7e4N/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eLi4uLi4uLf4uPi4eLg4d7W29/Sw8rJx9Hb3OLk4eHg2dre1sbExcTN2trf5OHi4trX3st9aWZxYVleZWFNTFRLUlpMO0hNSEZBPTc2NjUzNDY2NDg3NjU2OTw7Pj46Pjk5PDk3OTs7Oj49PEBAQ0RCR0ZCQT08Q0A9OTw7Nzc3P0RGRkaZtrS1tbW2tra4uLi4uLi3uLi3s7W2t7a3t7i5tba3opdxb29waW50dnFmZWNrbmdvcm1mZ2tygWVvdnyAeGRzj39zaHFyaWVlbm+w39HFv7u5ubm5ubq6uru6vc3Gw8e/urq6uru7u8HCvcHFvby/vry7urq5ubq6ubm6w8XDucDDwby/ube/z8/U3tjc3t/g3tLa4N/f4ODg39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eDg4ODg4ODg4ODh4eHh4uLi4eDh4uLi4uHa2t3RwsPCu8XT1uDdydPDrrnAsaqrq6uwtLbJ0sXRxLG4v7Srq6usr7S0vMzE1c60tLureGxtbWBdYl9ZS1NVVFFQREBRTUhEPzo3ODU3MzE1NjQ5ODQ2Njo8Oz08ODw5Njo6ODg5NzU8PDw/QEFAQkRDQkE8PkI/Pz09PTc1OD5DRUNAj7a0tLW1t7i4uLi4uLm5uLe1sautr7Oxs7OztLS0tqaei2tue3ZxeXhnY2hfcXdha25vaG99b25ja2lseHdsa4Z+bHB6dm1scG95sca8uru7urm5ubq6urq6urq6urq6urq6urq7u7q7u7y7urq6ubq7u7q6urq6urq6ubi3t7i4t7e2tbW1tbi3u8e+w8XHzcS4wMnH0tzZ2d/e3uDf39/f4ODh4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh3Nji4uLi4eHh4OHg3tfGxtHQztTe3tPO0t/SuLi8sq2trKysrrG+ua63rKipqamqq6urqqqqq6ysuKyqqqqrq6urra6urq6urryzrayrpHlub21fXl1dVE1SU1xUSkE/UElIPjg5NjgzNzMwNTczNzg1NzY2Ojw/PDg5Ozo6Ojg5OjY1OTs8Pj9EP0NFQkNCP0BAQT9APjw3ODc6QUVEP4W4tLS1tbe4uLm5uLi3t7SurKuqqq2urq6vsLGzs7WjcG5ucm1wg311aWFlaGZkY2Rxc21td25naW1tZXBzb29zcXN8h4F6dX11n7u6uru7urm5ubm6urq6urq6ubq6urq5uLm5ubm6urq6u7q5ubm5ubq6ubm6ubm4uLi3t7e4uLe3t7a2tbW2tra1tbW1tba1t7e3t7rBvrzGycrb3+Dg3tvd3d7h4tDW4uHg4ODg4ODg4ODg4ODg4OHg4OHi0768zNjd3OLg0dnbxL23sLCxsa+zu7uzsLS9s66urq2tra2sq6qqqqmpqKmpqampqqurqqqqqamoqampqampqaqqqqytrq6urq6urq6sraR4aWJxZmFZWlZRUk5cU0Y9QlJEQTc8OzY5NTY1MzU2NTg3NTY1Nzg7Pjw7OTk5Ojg3Nzk3Njk9Oz47RD8/Q0BBREE+P0M9Pjw+Ojo3Nz9DRj54srCztLW2t7i3trKurq2sq6uqqaqtraysrq+xs7S1t4xucnRqaIB5ZmpmZWxdaG5waGxxYmNmcoJ+dmhobGpueoaBhXx4cXF5gK+6ubq6urm5uLm5ubm5ubm5ubm5ubm5uLe3t7e3uLm5ubm5uLe3t7i5ubi4uLi3t7a2tre3t7e3tra2trW0tLW1tbW2trW1tre3t7e3t7e3tre4v8bP0MS+v8DE19e8ydra4OHg4ODh4eDg4ODh4eDb3t7Uzby3tre6wMDJxLfIvrKwsLCwr7Cvrq6ur7Cwr66urq6uraytrKurq6qpqampqampqampqKmpqKmpqampqKmpqKmpqqqrraytra2ur66trK2heWpjbWdiXFhRUFFLVEpCOklRP0E3PDk0OjU2NTQ1NTU4ODY4Njw6OTw9PTs6ODY2ODg6NzY3Pj09PT5BQUVCQkNBQUBBOj09Pz05Ojc9QUc8bKqmqKutsLGwrqupqKqrq6mpqamrrKytra2usLO0tbilgIdvaWdzdGZrcG1qZGxvcm5rbWNrcHyJhG5qbHx4Y3uKfnNqc25rcY+7ubm5ubm5ubi4ubm5ubm5ubq5uLi4t7e3t7e3t7i5ubi4uLe2tra3t7e3t7a2t7a2tra3tra2tbW1tba1tLS0tbW1tra2tra3t7e3t7i4uLe2t7a2uLm4uLe3uL6+uLq9vcfb4OHg2Nnd4eHg3dfKwcPCurm5uLe4uLi3tbS0tLKysbGxsLCvr6+vr6+vr6+vr66ura2srKyrq6yqqqmoqKmppqepqaehpaipqamoop+hoZyip6inqausrK2ur7Cwrq2unXdwbGphY2BZUU1RTFJGQzlNUEY+ODs3Mjg5Njc0NDM1ODg3OTc7OTo9PTw6Ojk3NDo5ODY2OD8+QEI9RENDQ0FDQEJBQDtAP0A/PDw6O0NIPWOopaWlpqioqKenp6ipqqmoqKipqqqsra6wsLCztLW1taWYdn5xZmt4cW9tZmVsaGNsZ2ZpaX11bWlvfXZ5hWZod294b3Fvcninu7m5ubm5ubm4uLm6ubm5ubm5ubi3t7W1tba2tre3t7e3t7a2tba2tre2tbW1tra3t7e2tbS0tLS0tLS1tLS0tLW1tba2tra2t7e3t7e3t7a2tre2tre3uLe2t7i4t7i4uLi4wMXTyry8w83PyMC9urm5ubq6ubi4uLi4t7W0tLSzs7KysrGwr6+vr66urq+vr6+uraysrKurrKysq6ehoJ6gn5udoaGdlpmkpKaon5mZmZmanZ+gn56fpKqtrq+ura2srJl1cGlrY2FeXVVOU0tSREQ4TktHQTo4NTI2OTY2NDczNzc3ODk3OTo7PT0+ODg4NzU6OTk1OD9AQEFEPkZBQkNAQkNCQT88QEJCQD0+OjpERj5cpqWmpqampqanqKenqKioqKenqaurrKytra2ttLS0tbekc311bnONf3JmanFjaW1jaGZobG51aV9jZ3VzdnpuZ3Bwcn56cYihu7m5ubm6urq6urm2s7W1uLm2trW1tra1tbW1tbW3tra3tra2tbW2tbW1tbS0tLa2t7e3tbS0s7O0tLW1tLS0tbW1tra2tra2t7e3t7e3tra2trW2tbW2tra2tra2tra3tra3uLi3uri4uLe3t7i5ubm5urq6urm4t7e3t7W1tLS0s7OysrKxsbCwr66urq6urq+vra2srKuppaSmpqScmZubmpmampmXl5eXl5aZm5iZmJmZm52en5+dnJ6gpKWko6OioqKQdG5jcGFeXltUU1RIVEo/PFFCRkM7ODYzNzo1NTQ4Mzg5OTc4OTc7OTs9Ozc6NzU2OTk4NTg+Pz9ART5CPz9DPzxBQUI/PT9EQT8+PTk9Q0Y/VaSlpqanqKeoqamop6ioqKioqKiqrKuqqaipq7W1tba5o3eKcXKHhnd0cGh5a2JjYWVsaW5zal9jZWNjZWprYmRqbHaXjX6ovbm3tre5u7u6uLWxrKurq6+wrKyrq62tq6uvsLGvr7CytbW2t7W1trW1tbW1tbW2trSvr7O0tLSvra6vsrW0tbW1tbW2t7e3t7e3t7e3t7e3t7Owsra1tLa2tre3tra2tbW1tra3t7e5uLi4t7e3uLi4ubq6urq5uLi3t7e1tbS0tLS0tLS0s7OysbCvr6+vr66vr62oo6KgnJqampqZmZqbm5qampqbmpmZmZiXl5aYmZmZmpycnZ+foJ+goKChoaCgoJ+fi3RuaXRdYGZeUlRLRFRJPUVTSEVCOzo0NDY5NDQ1NzM4ODg3ODk5Ojs7Pz04OjkzNTg5NjM6PT5AP0A6QEJCQj8/QEJCPz0+QUFCPz06PkVDQFGjpqWlp6inqauqqKaoqKipp6ioqKinp6ioqaq1tbe3t7KZtH99kIx1Z2lqbGZjYGNoZW94cGlicXx5cGpmZmRma3NqhYystrKwra2ttLezsLCtrKuqqamop6ipqamoqKinqKipqaeoqqurra2sqqytraysrq6traunpaSnqqyopKOkpamwsbGztbW2t7i3t7W1tre4t7e3t7Kppaasq6ivtLa1s7W3t7a1tbW2tra3t7e4t7a2t7e3t7m6urq5uLi3t7Wxs7S0tLKxsK6sq6yurrCxsK2rqqmqqKijnJqZmJmYmJiYmJmZmZmampqZm5ubnJybmZeYmpqcnJydnJ2foKGhoqKioKGgoKCfnop1amtuWVxhVktPREdVRz5PV0hEPTw4MzQ0ODQ1NDgyODk4ODk6Ojw5OUA8Njk5MzY3OTE0PD8/QEBBOkNGRUJBREJDQTo7P0FCQz9APUBEQ0BPo6empaemqKqqqqakpqenqKioqKimpqaoq6uttba3t7e4rbJ1cHuDdmBiaWtiZWZhZGdmfYh5bHKAfXFvcXhjbW5xZo+srKurq6ysra6urK2trKyqp6WlpaWlpqiop6iopaaoqKeoqKeoqKmqp6Wko6KioqOioKKioaKhoKChoaKjpKOjpaWlqLC0s7OzsKuqqaqztLa3trGopaOioaGipKiqqairs7Sxrq6xs7W2tra3uLi3tre3t7e3t7a2uLe0sa6ppqerrKmnpqWkpKSkpKWnqaajoJ+enZycm5uampmZmJeXmZmYmJiZmpqampqampqbm5mYmpydnZ2dnZucoKGgoaOjoqCgoKCfnp2FdGtsaFdYU0pHTUVITUdAU1dGRz09OTM2Mzc0NTU3Mzg6Ojo6OTw+OjpBPDc8ODM3ODgzNztAPz9AQDpCRUNAQkRDQT87O0BDQkNBQDxBQ0A9TqKnpqanp6mqq6mkpaWlpaaoqKippqanqKmpqrW2tre3t7izc2h7c2JnamtpaWJhZGloXV1tfHJma3J/fHR8bm1zc36gqamrq6uqq62trKysq6qpqKWjpKWmpqWmp6eqqKamp6enqKinp6iop6WkpKKhoaGgn56en5+fn56foKGho6Wko6OkpKSlp6enpqWkpaampqeqraumpKKhoaChpKWlpaempaeoqKalpaivtLa3trW1tra1tbOwraupqa6rqKWlpqanpaSkpaWlpqWkpKSkpaKhoaGgnp2bm5ucm5qamZiXmJiYmJmampmZmZmYmZmZmZqZmZydnJycnJybnJ+fn6ChoaKgoKCfnZ2cgHNrbmReU0pITUZETEtFRFFTQ0c9PDgzNjI4NDY0NjQ4OTg6Ozk7Pjw5PTs5PTczNTk2NTY8Pz0/QT88P0JDP0JCQj89Pj5CQ0FFQD86PkVAO0+jpqWkpqeoqaelpKWlpKWnp6eoqKanp6alpqa1tba2trW2uYptcW1vfHxxZ2pmYGFsYFROW2hqbm9tgYJ9cWdxdn6aqKeoqqmpq6urrKqqqqimpaWjoqOlpqalpaWmqaqppqWjpKWmpqSjo6Kio6Khn5+fnp6cnJycnZ2dnJ2en6CioaKjo6OhoqKkpaSioqOjpKSjpKSko6Ggn6GipKanp6ipqaelpaSipKSlqK2wsKyrqqusqqmnpaWmpaWlpaalpqioqailpaWkpKSlpKOjpKOioaGhoqKgnp2cnJubm5qZmJiYmJmam5mYl5eWlpeXmJiZmpqcm5qampubm5ucnJ6goKGgnp6enpycm356bnJiXlNNSlBFRk5NQkBPRT5JOz01MzYzODM2Njc1Ojs4OTs5Oj4+Ozo5OT03NjY5NjU2PkI+PkE/PT5DQT5DQ0BAO0A/QkJCRUA+Oz5FPzxQoKSjpKOjo6SkoqSlpaSlpqamp6empqalpqaltLW1tbS0tbiBaHx9ZXOCemxwdWFfY1ROT1FbaGxpbGxxbW5xbnScoqSnqKioqauqqqqqqaempaSjo6OjpKSlpqalp6ytqaShnp2eo6Shn56foKCdnJ2dnJycmpqam5ucnJubm5ydnp6foKChoJ+goaOioKGjpKSjoqSlpaWkop+go6SkpKapqainpaGdnJ+jpaipqainqKioqaempaSkpKSlpqampqampqenpaWko6Ojo6KioqGhoqKhoqOkop+enZ2cmpubmpqZmJeXmJaWlZSUlJWVl5iYmpubnJuampqam5ucm5ucnp+fnpucnJyam5p/fnF0YFtUTUdNSEZMSj8/TkM8QDs8NDM4Mzc0NzU3ODs9ODo6OTk7PTs7ODk+Njc4OTU4OD9APT9BPjs9RD89REA/PzpAQUE/QUVAPjw8Qz88Tp2ioaKioKCipaSkpKWlpqenp6empqampaampbW1tbS0tLS3jHalsXdmc3Jvc2xjZGlYT1JRT09dgG1kYFptkZGSoqKjpaampqenqKiop6alpaOioaGhoaKjpaempqesq6emoJ2cm6Ghnpubmp2cmZiam5qampmZmZubm5uampqampucnZ6goaCfnp+hoJ6foqOko6Omp6inqKWioKGhoaGkpaWlpKCcmZmbnqOmpqampqanpqempaOlpKWlpqiop6enpaWlpaWkpKOjo6KhoqKioqKhoaKjo6Kgn56enZybnJubmZaUlJSTk5OTkpSUlJWWl5qam5ubm5qZmZqanJ2dnZ2dnZuampqamZqXf3dvc11aTkhKTkdFRklERU5APD09PDQ1OzQ2NDY1Njc5Ozg5OTg5OD07PDc6Ozc4ODg1ODg/Qj9BQTw+P0A8PEJAQT49QT4/Pz1CQUA6OkA8PE+doqGfoJ+dn6OkpKSlpqeoqKenp6ampqampqW1tLS0tLS0tbSXtqd1Znh2Y2xjY2VjW1JTU1JNXqCMeFhodpajnp6hoaOjoqOjpKSlpqalpKSioaGjo6OjoqOlpqampqenpp+bmpuioJqWl5Wam5qXl5iZmpqYmJqampqbm5qZmZmenZ2goqOjo6KkpKWinqGhoaKjpaampqSjoaCgn5+hoZ+goJ2amJiZmpygpKOjpKWmp6alpaOjpKSkpKWnp6ampqampaWmpKOjo6SjoqKjpKGfoKGhoKGgoaCfn56dnZyamJeVk5KSkpKSkpOTkpOUlZaZmpqbm5qampqbnZ6enp2cnJybm5qamZmZlH10bHReWk9IRUdGQkVORT9GOzo+Pzs0Njo2OTM2NDY4OTo4OTc4ODo9Ozw5Ozs6OjY3ODk5Pj9APjw9QD5AOjlAQT89QT8+QUE+QUE/Ojk9PjpQnaCfnJucnJufoqOlpaWlp6iop6ampqanpqantLS0tLOysrGwsK2rkHiGj36amn93Yl1TUlFRTGKgootaiKCgn52YmZycnZ2eoKGgpKenpqWjoqGjp6ampaOjpqampqanpqagm5mboaCXkpOSl5qcmpeXl5iampmampqam5qYmJmaoKCgoKGfoaKipKamop6gn5+goaOko6Khn56enpyanZuZmpqZmJeZnqChoaKioqKkpaWmpKSkpKKioqKjpaSlpaWlpaWlpKOko6KioqGgoKGgnp+fn5+fnp6foJ+cm5qZl5WUlJSTkZCQkZKSkpKSk5SVl5iZmpmZmpqam5+fnp2cnJycmpmZmpiXl5F8cmdxXl1QRj9BRD9KT0JCRjhDRT4+OTg7Nzc0ODQ1OTo6Ozk3OTo8Ozo8PT48PDo2NzY5OD4/QT47Pz49PDg6PkFAQUE/P0FCP0RBPjo4PkE8U5ycm5uampycnaGio6KjoqSmp6alpaampqSjo7KysK2rp6amp6alpqiln6iop6qnoXmEXFFST0xcnKCAYpmgnp2clZOVlpeZmpydnqGmpqalpKOioqanp6ajpKampaWmp6amop2cn6Gfl5GRkJSXm52YlpeXmJuZmpqampqZl5iam6Ghn56fnpybnJ6goJ6dn56fn6Cio6SjoqCfnp2ZlpeXl5iYmZubnqKioqKioqGio6WlpKOio6SioaGhoqOjpKWko6SkpKSioqKhoqGgoJ+gnp2enp2dnZ2dnZ+em5mYl5WTk5SUk5KQj5GSkZKSkZKTlJaXl5iYmZqampyenZ2dnJubmpiYmpmXlZaNempmamBiTkY+P0A9SkVAQ0A7QEE8Ozs5Ojg2NTg0Njc4OT04ODs6Oz87Ojs8Ojo6Nzc2ODs8Oz08Ojo8PTw3Oz5DQkRDPz1BQ0FEQT88OkBCO1eZmJqamZmam5ucnp2foqKhoqSlpKSlpqSioJ6op6alpqWlpaemp6ampqakpaanqKehqXJOUU1KVJahenKanJyenJeVlJWWl5iXl5qeoqKhoqOkpKOjpqalpKanpqWlpaalpaOgoKGhoJmSkI+Wm5qenJaXl5eZm5ycnJqamZeZm5uen52cnZyZmZqcnZydnp6fn5+hoaCgoaKgn56bl5WVlZeanZ2fn6GhoqKio6OhoaCgoJ2cnaGioqOkpKOioaSlpKOko6SjoqKioqKhoKCfn52cnZ2cnJ2dnJ2enpqXlpaVlJOTkpKSkZCRkpKSkpGSlJWWl5iYmJiam5ycnJycnJ2cm5mYmZiWlJWXi3hsY2RiZFFHQT1DO0tIRDo7Ozw+OTo6OTo3Mzc5NTo4ODg8OTg7OT09Ozo7Ojk8PDc2NDc/PDo9Ozw/Pjw7ODxBQ0FDQkI+P0NAQkFAOj9APztZmZiampqam5ubm5ydoKGhoaGhoqKioqKhn5+dpKWmpqenpaWmp6ampaWkpKalpKSkpaaGUFJQT0+PmHB6mpubnJ6cnJycm5ubmZiYm56dnp+foKOkoqGhoqOio6SkpqalpKSjoqGhnpyblZOVmZyam56amJiYmJqcnpyam5iWmZybnJycnJydmpqbnJ2dnp6dnp6fn52cnJyhoaCblpWVlZacn6Ggn5+hoKKjoqOhnZuZlpaWlpicnqCip6ikoaCgoqOjoqKioKCgoJ+fnp+gnp2cm5ucnZydnJmanJuWk5KSkpKUk5KSkpKSkpOSkpKRkpSVlpeYmJiYmZqcm5qbm5ucnJqZmJiXlZWWl4d3ZGdoZGJNQ0U8RDlJSkU5Ojs9PTo6Nzg6NjQ3OTU8OTY4OTc5PDs7PDo6PDs6PDw4Njg3Pj07Pj46Qj86Ojo/QURCQ0FBQD9EQUFAPjpAPj06W5qYmZqbmpubm5uen6CgoaKioKCgn5+enp2dnKWkpaanpqWlpqakoqKio6Oko6Kjo6KnllRYVVJOZ21rgZ6am5udn6Cgn56enp6dnJydnJ6enp+goaCfn6CgoKGio6OkpKSkoqGhnpyamZejt5+ZmZienpiYmZmam5qWlZeWlZicnJ2cm52dnpybnJ2cnZ6bmJqeoaGdm5udoKKhmpWVlpaZoKKfnZueoaKjop+em5eXlJKSlJeYmZ2goqenpaGgn56goaGioaCfnp2cnJubnJubmpqZmpydnJmYmZaVk5GQkJCPkZKSkpKSkZKTk5OTk5OTlJWWlpeXl5manJubnJucnJqamZeXlpaVlZSEcmZsYmRbREJMPT84RktCPEA+Pj05Ozk6PTg1ODg2Ozg1Njo4PDw7Ozw8Ozk8Oj09OTU4Nzw5PD88OkE/Ojo6QEBDQkRBQ0A/Q0FAPj08QD09Ol+al5mamZeYmpycn5+foaGhoJ+fn56foKCenZ2lpKSko6OioqOjoJ+foKGipKOio6SiradXXl1UV19ua42dmpqbnJ2dm5ucnZ+enZycnJydnZ+goKGgoaGgoKGhoqahoqKioaCenJubm5mhqZacm5uZnJ6alpaWl5eTjo6QlJabnJuam5udn52cnJycnJ6dlpSZnJ+in5ycnZ+hoJuXl5mZmpycnJubnZ6fnZqXlpaWlJOTlJiampqfoKGmpqWgn56fnqChoaCenJubnJybm5ybm5qZmJmZmZmXl5iVlJKQkJCQj5CRkpKSkZGTk5aYl5STkpSVlJWWlZaZmZmam52cnJyampmXlpaWlpaQgG9vZV5gV0BKSDg/N0lFP0VBPT07Ojo7Ozs3NTs4Njs3NDY6Oj47Oj0+Pj07Ozs+PDo4Ojk5NkBBPTo8PTo6OT9BQ0JERUM+P0FBPz8+Pj89PDtgl5WXl5aVl5mbnqGhoKGioqCenp6enqCgn52bpaWkpKSioKCfoJ+dnZ+hoqOjo6OkobCjXWVkYGFua4GenJubm5ubmZianJ2enJubm5ycnJ6ipaGeoKGioqKhoKWyraCgn5+enJmZmpqcrmZ4nZ2em5manJmXlZWWkY6Nj5KYnZycm5ycnqCdnJucnJyempWVm56foZ+dnJyenp2cmpqampqampqbm5qXl5aTkpWVlpWTlZaam5qanZ6foqWjnp6fn5+en5+enZ6fnZycm5qbmpqbmpiZmJiYmJiYlZSTkZCRkJCQkZKTkpCRk5SYmZiVk5SVlZWWlZaXmZmXmZqenpyamJiXl5aWl5eYjX1ubV9lVlRFSzw3PjdSRUM+QkE4Ozw7OTg6ODY7Nzc6Njc5Oj0+Ojw8PT49PD06Pz06ODw9OTtAPj4/PT45OTs/QkNAQ0VDPT9DQj5AQD5APTw8YZWSlJWWlpeanJ6goKCgoaCgnp6enp6gn56em6WlpKSioJ+fnp2dm5mbnJydnp+gn56rmGNpbW5pZm2enZybm5ybmpmZmZqam5ucm5uam5ygo6SgnZ6en6CgoJ+mk5isn6CfnZuampqZqoBEgZ+enpyZmJqamJiYmJKOj5OXnJ2bnJ2cnJycnZycnp6dnpqVl5ygoaGfnp2eoJ+cnJuampqbmpqYmpmVk5OTkpOWl5eVlJiYmZucnJydoJ+gnp6enp+fn56en6KjpKKgn56dm5qampuamJmZmJeXlpWUlJORkZCQkZKSk5OSk5OUl5mYlpWUlZaWlpaWl5iYmJiXmZqamZeXl5aXlpeWl4l4dmddX1dURUU5OTs8WT5AOEI/OTw8PTk4Ozg6Ozc5OjU4OTs9PDk9Oz0+PD0+Oz8/Ojk+PDw+Pz5AQUE9ODc7QkNFP0FFQz1AREJBQEQ7Oz47PGKWk5SUlpWUlpiYmZubnJycnZ2cnJ2en56dnJqkpKSkoJ+enpybm5qZmJiYmZucnZ6cpolla3R4bVuFop2dnJydnJqbmpqampydnZ2bmpubn6KinpucnZycnJ2eoJ9hmaifnpyampuco6FPSISgnZ6cm5qanZqam5yVkZOXm52dnJ2fnZycnJycnZ6fnp+cl5idn6ChoJ2cn6CfnJubm5qbmpmZmZmZl5WWlZaYl5eXlpaYmZuenp2dn6GhoJ+fnp6fn5+dn5+hoqKhoZ+fnpyZm5qcnJuampmWlpaYl5eXlpWTkpGTlJSTlJSUlJaZmJaVlZeZmJeYl5eXl5eYl5iXl5eXlpaYl5eVl5eDeHZfW11eUT1GOjk4P1VDQTtCQzk8Pz87Ojk3Ozg4ODc0ODk8Ozw4Ozs8PTo8Pjk/QTw6PTw+PkA/PUBBPjk2PERDRUBBRUU9PkVERD9COzo8OTpkl5SVlZaUlJSUlJWXmJiamZqcnJydnp6dnZybo6Oko6CenJuamZqZmJeYmZiam5ubm6WJa3F2em9lmp+enp2dnJybnZ6dnJ2enp2dnJydm5ygoJuampubm5udm5qnalyioJuZmZudnK9ySkyGoZycnZybmp+fm5ydm5mZmZudnZ2dn52dn5+dnJydn5+fn5uanZ+goJ+dnJ6gnpubm5ubm5yampuamZudnJqZmJeYmJiYmp2foKCgoJ+hoaGgoJ+en5+fnp6foaKhoJ+enp+enJqam5ubmpqZlpaXmZiYmJiWlJOUlJWVk5OVlZSVlpWVlZSYmZuamZaWl5WWmJiWl5OUlJGRk4yRkJOWfXhqYWJiXFE8QDw2OENWSERCOjg7Oj47Nzc5Nj06OTk2NDc6Ozw9OTo6Oz87PT08QD47Oz46PT89PkBBP0A8NztBQ0U/P0REPj9EREM+Qj07PDs6Z5aTk5OTk5OTlJSVlpeWl5aWl5mbm5ybm5uamaOjoqCfnpuamJeYl5eXmJmYmZybm5qkgGpqb3lzcZegnp2dnJydnp6enp+enp2cnJydnp2bnJuampqam5ubmZmYpYJTd6KZmZqdm6CjX1dOh6GcnJ2cm5qdn5ucnJubnJubnZ2dnJydnp2enZydnZ2cnJ2dm5uenp6dnZybnpuanJycnJydnJubmpmbmpmYmZmYmpmZmpyfn5+jpaKfoaKioaGfnqCgn5+fnqCioaChn5+fn52ZmpucnZqZmJWWl5aVlpaTkpOUk5STkJCSk5GUkY+OkJGOlZabmJWYlJmXlJiRjJCPk5yTkoyFjIeDhndxZ2pkXFxRQT44NkJHYEJFR0A+Ozw7Ojg4NjU8ODo4MzQ6Njk9PTk5Ojs9Ozw6PD48Oj5AOj5APjw/QD8+PDg6Q0FEPz5CRD8+Q0VCPUJAPDw8OmeYk5KSk5OSk5SVlJWXl5aWlZaXmZmZmpqampqkoqCfn52bmpmYmJiXl5iZmJmcnZ2cqH1nZXN7enOJop+enp2dnp6enZ2enZ6enp2dnZ6cm5ybmpubm5ycm5iYmaCKXGCTm5qbnZyjj2VaTYGinp6dnZybm52bnJybnJ2dnZ2dnJ2dnp+fn52cnZ2dm5qbnJmZnJ2dnZ2dm5uanJ2dnJycnp2dnZybmZeVlZeXmJqam5ubnZ6foqOhoKGhnJucm5ubnZqcmZycn6CfnZiZmZmUkpKUl5SPj5COkYyNiYuQi4mLjpGRj4mQmJiQkoyNi5KQj5iYoqiqpqWlrKOmoZqep6eyqKKVo6Cfl39wcWlsXFtbTEY8NzdHR1g+SE5URjk+Ojg5ODc1PTk4NzMzOTY6Pjw6Nzo8Ozo6Ojo8PDs/PjtAQD47PT5BPDw2N0A+QkA+QUY+PEFEQT1DQj49PDlmmJSTk5OTkpOUlZOVl5iYmJaXl5iZmZqampqaoqGfnp2cm5mYmJiYmJiYmZmZm5ybnKx/am16f3lxh6Genp2cnZ6enp6enp6dnp2dnZ6enJubnJubm5ubm5yZmJmemV1edZaanJ2dooFlWk1/op6fnp2dnp6dnJydnJ2dnZ6fnZ2fn56goJ+enZ2dnZybnJ2em5ubm52enZ6dm5ubnJ2cnp2cnZqYl5SRjo+QkJGVmJSWlJiZmpudmJuYlY2Mjo6TkpKRj4mQjpGRjo+Ki42NjYiIi4+Lg42NkY+MkI2Qk5WVnJihoJySn6SipKmam5eanKOprb3Bwbq8uL26ucC8ubq3uru7tL2zwbV/bnVmZ1peWUxJRTo7TElTPFZSSUM6QTo7Ozc3NTo6OjgyNTY4Oz08OTk7Ozw5Nzo4Ojw5PT85PD8+PDw9QTs5NTg8O0A/QT9EPTxBQkA8REM9PT06YZOTkZCUlJOTk5OTlJeYlpeZmJmYmZqbmpqamp+gnp+fnJqZmpqampmYl5iZmZmZmZmphXB1e4B3b4mhnp6enp6fn56en56fn56dnp6fnp2cnJ2cm5ubm5ucmpiZmZthYmB+lZ6cnpd0Y1VPgaKen5+enZ6hoJ6dnp2enZ6fn56en6CenZ6enJydnZ2cm5qYnJuVmJmamJiYmJmSjJCXlKCXk4+MjYqKiImMiJORh5CPjYqKkJCLjoqMi4+IiImJjpGOjYaFiYaKhoWLiI+SkJCNkJKXlpKZmJ2TlJ6kpqaqq7Gsr6+rpquqsbm5tbS0rqyvtMDIxcXBvsbDxMTDurW+t7a0s7C2tb6qcHRyXGZfXl1JRj8/RUtMVklcTEQ/PUI6Qzk5Nzc7OTk3MTc5ODo+ODg6PDw7OTc5OTo9Oj4/OT5BPDs+PD46OTY5PDpBPkNBQT08QkBAPkJEPj8+OVyHhIOHi42KiYaFgYqMkZOVmJiHlZaWkpiampmenZ+gn52ampubm5ycm5iWmJiXl5ibqo56dXZ7f3mCoJ+fnp+goKCfn5+foKCfnp2dnp+enZ2dnJqbm5ybm5uYmZmfaV1bY32cnJ6LaV5QU4efm56dnZycoaGfnZ6dnZ2dnp2dnJiWlpaYlZWSlpmWk5GKjI+PjJCOkIuLj4+WiIiEi5GZjn2Fi42PjYyHioyQm4yRj4+Lio6TjIyNjIiSi4yFiYyPhouIh42KhYyEj4qXkJOYmpWbnKOqoaKknKKqsbe0ubWxtK2vsrKlp7O6sbq6vLa3tsDDw729vLa/urq8wbW4wL60r66mqa+3mm58Z1tjWl1fSEU+QUtJU1hZXkFGOTk9OkY/Pzo3Ozs7NjM6Nzo5Pjg6Ojw9OTk4Ojk7PDo+PTtAQDs8QjxAOjg0Nzw7QkBBQj4+O0NEREBDQz0+PjlhmZWLkYaNj5aSiHl9e3+Fi4OKgoqJhmuAeJCLlpqRnZ2UlJGTlpeampiWk42Sk5KQm5uIdndzcX1/cpGgnZubm5yenZ2eoKGgm5uWlpucmpybnJuYmZqYmJmbmpqXk3ZuZlZ5lJidiVtUUFmLko6SkY+Uk5KXm5mYm5ePjpCLjo2Ch4uLi4qLiI2RjIeHhoqIiZGKh4yEhYqNi4qNhI+UkIyDkJOUmZWQi5OTkZWRlpWOj5GMlI2Oj4qIj4ePhoeJiYmNiomJioWNh46JmJKUmpuXmKChp6Cko5qqqbO2sbWwqKqiqK6tn6qvsK21ubi8wr/BxLixtbCutrOwuL68ury+urOzp7G3wpB1gGNiXlpXUk1IRkVQSVlXX1tDUDpCQz1HRj84Nzo6NzU1OTc8OTw5ODo9Pjo6ODs7Pjs7PTs9P0E7Pz48Pzo4NDM3OkFBQEI+PjpDREM/QUM7PT45Z6mloqKZn6CippeUiI2CiIJ1h4iKiIp7e3Z7enmPeoiSfn18en6CkYWBgH1zfH99fISHfnRweHZzfHaBj4iIiYeIioyMkZicl4iOhIuNi4iNkZCPjJGPi4yPkJGRjpOdn5J/oqWYpp10T1Bkh4eCjYuGiYp/iYqGiJiRiIOIg4KFfIuLjIaJi4iKkIyIi42PjI+Wh4mLio6NjY2Wk5OdnJyalpycm56bmpuYnpeTkZWWkJKRi4+LlpSMjYqDi4SEiYyQkIqOio2LipGJjZOTk5SVk5KcmZ6Xn6CfpaKvsamupKSfmKStpqa4t6ysu729wsPAv7+vpa2wsLS3uLO0uLa0ta6stK+4tLaBeXpjZmBeVlFRQUVMT0lcXl9UR0dCS0xCREA9ODg7OTU3Nzk3Ozc9PDk9Pj05Ozg6OkA8Oj06PkJBOD88Oj84NjQyOTtCQD9CPj04QEI/PkBEO0A+N2CloJqXnaGaoaCPl5efl5WCjaCfo6GdmpKOjIxycXBvdnFucG1ucHZub29waHBxcHR+c3FycXd7cnl2d3Jyd3Z6e3l8fXt/iIGEi3+PkYaNi4yGiouLiYeEgYaDgIWim4x8ZpKlk5x7iINjdICAgpKQhoSEhY2DhIyPj4+IjY+Hi4iRkJWRjpCKk5eOj5WYp6SfnZWYlpaln5udq6aqt7W4srGnr6qnpqGfmp2WkpWVkYqPjImTjZuVjYuLhoaJjJWQkJCLmZKVlZSbkJiTlIyNkYyWl5WilZ6mqauno6OqsJucpp+mq6G0vb6zs7+5u7u6uby9rqiusa6wuLyztLGxqrCpqLGxsqild3J0X2hhYFRWUUlKSFZNXl5eVExKRVFKRUdDPTo5OTc0ODY5Mzg4PTo9PD47OTs4Ojs/PDw+OT9DPzg7Ojg8Nzc2Mzc5RT4/Qz89N0BAQT0/RDw+PThUj4yGh4eUjJWZl5yWmZaNlZyWlZydoKCdmpiWeHFubXJ4cXFsbnJwa3FvcG1yc3t1dnd5fnVxeHZ0d3tybn98gX15eH1/eYOGg4WCg5CLkIuLi46Pi4mJhYKCfn6Co4l5bFFznI2LWHB7fH9+fIWOjYuGjZSRi5CXj5SXkpihlp6WlZunpp+goKawq6GjpbW0sqqmqq+isba5vcK7ucO+vLi9uLWxrLCsppuSk5mfm5SPk5WOmp2doJqfn5edo6qsoZ+em62hp6qwqaampJiRkZWUo6SirKSss7Szs6i3tru4sLKvra2yt7a6srW6s7e5u7i8urayr6yxsbKztLOxsa2us7Gzs6yhl3Zxc19jXlJRVE1PSUdYT1pcZFROR1VPRURKRD44Ojg3NTg4ODU5Nzk6PTw/Ojg8ODk5PTs9PTpCPj84Ozo5Ojk4NjI1N0I+P0RAQDY+P0I/PEM8PT46Tn98go6MjJOTl5eaj5SWjZaRkZSXk5qanqGdnHJvcnFxcXFxcG5zcW91dHJxdneAdXd8eYV+d3t8eX1/fICJiYmDfXp/h4GIiYGAgIGGiIKGi4eIhYSIiIqFgIJ9mZl1U0tLc5OFgkxeb3F3iYWKjouNkJmclJSUoJqan6Ktsa6ppKWtr6ysrLWuvrmtrqm1sLexq7G2rK+9wsLAvrq8trKutraxtK66u7OurKepp6unoqmtoKmooq+wuLSxvLq6urK0ta+8tLezt7e7t7mtrbCprLW5sbeytLe2sLu7vLu6ury1vLi0wbWsqqqrtLG3uLm1trSzsKymrrCqq7Cxq6yusLKxtK6qo5N4dnJlZ1tMUlBFTUlTV1JlXmdUUExcUUhMUkNBOTk3OTU4ODY2Ozc5Ojs6PTg4Ozo5Ojw8Pj08RD45Njs7ODg+OTUxNTZCRkREP0A3Pj5DPjpBP0BAO0uAgomXmJSdlpabmIuSlo6XkZGVl5SZl5+bmZx8dHV2dXl1c3RudnJzdHV2d319gH56gXyDfoJ/fYB/g4KFj52RiYF/go+Xjo6HgoCBiIuFfoqRi3+IjYyLi4eRjqOLUDAvO3iGdnVAQltqboKQiYmQj42PlJSYkJWcmp2eqK6ysLC1tLOtsrW4sLy1tbGqsKqztbS7t7SztrS1r7i4t62noqassLCvtre3vrW5vLOysa61u7C0r6+yu7axuMC9tLS0s7izvLq2tLrAvbm6ubq+ubm5vrWysa+yr6q1tLGzsbSzrri4tb+vpKaoo6ussa+zrq6wsKytq6qroqKmqKKnrauqpaynoqeYeHlxZmVZT09NSVJNV01PX15cTlVVYlFEVE07Pzo8ODk1ODc1Nzk1Ojo6OTw4Ojw9Oj08Pj4/P0I9ODY6Ojk6QDs1MjY2QUZDQz4/Nz49Q0I5P0I/PjtLjpGTmJmVmZGTopiTkpKLk4uOkI+Vl5ablZSbhoJ9enh2dHRzdH53end2gIKDhouMhISFioaQiYeRk5aRjZaalY+IjI+emJaVkpCTl5qamZCeoZ2Tl5uhmp2boqecY0NfSzx4eGlmRzE2V21ykI+LmJqPj4yUmpecnZugnaSstLm6vK+2tLi0tLK3uLmzq6+qqKy1srK1rrGrrqa3s7OxpaGotbCvrayrtbqyu7q6tLK3ur67ubG4sLmtqLK4u66ttLS3tbu2trm5vLe0r7G0t7a5s7e1pq2pq6ior6yprq2up6KxtLG0q6aop6Cjq66oqq6orLKwr6+pqKGeoaGjpqOgopqlo56ol3J3bmdiVUpUT09KRFBLX2JYWlFcVGBNSFJJQUA5Ojg2Njc3NTg5NDs5Ozk8Nzs+Ojg8PD0/QkBBPTs2OTk5Oj87NjM3OD5GQkJAQjk+PUBDPkBGQz44R5OWkZWTkpSQkZ+ZnZmVkI+Sko6Mk5aWko6RlZGSkIaBeXJzdXuBhI6HhZGTkpicnJiVkJWYo5yaoaeqqZ+clpeVnaKioZyZnpmlqKyvramnqqqpp6KlqKmrqaqujkl4qn5AfHhlYlFWY0peb4qhoaSem5qkp6Spq66spaSoq6+xtK6qrK6zr6ystLO0ua6urayqrLKwsK2wqKqmsrS0uK6qtrqwr6qurLC3s7i0t7W0u7y4tbWxtauyrKiys7uvrbGytLa1sbG0s7OvrKuvs7a0sayutKqqpqWnrauoqKupqqifqbOwqqeppaOio7CtqaatpairrayppaSioKWipaOYmZyVnqKippdudWVnZFdPWUtLSktTVHBiWWRXX1tcUlpQTEM8ODk6Njk4NzQ3NzQ4Ojw6PDg6PTk3PDw7PkM/QT47OTo5Ojs+PTg0NThBREVEQkM5PjtAPkI/R0U+N0KSm5SVlZaVj46Wl5qZlZGKk5SSjo+SkYqKiY2Ul5qTjYmCho6VkZSfmpuin5+jnqGhn5ijpKelpaapqa2rqaKmpKilpKGfnqOjra2srairrq6rq6ykoaKmqaeoonZjwtSlRX2QhHhPbY14VmKAo6inoKKhrqyrqqetrqilpKmpqqmmo6iqqaekp66wr7Ovq7Crqq+yr7Czua+rqLCxrrCyubO0r62vtbCss7GurLW1tLSzs7CvrKyqrKusr7G0s7CwrrCwsKyqrauqq6alrrCysKumqbCvqaOkqaunqKaopquwq6mvqaaoqaalo6iwraqpqKKpo6WnpKGhoKKloZ2el5aYlJugpKmUbnNeamlfVlpOUk5RT1NlXGVjW11ZXFBZT0tAPDs5Ojc6ODczNTMzODo9OTo4OTo5Oj08PEBEPkA9OTo8PDw+Oz45NTo8QkFFQUNBOT47P0BEQERCQDdAkZ6YlJeZlpGHi5SSl5GIg4mLk4+OkI2Hh4SFlZmWmJeZlpqeop2ZnKKkoaCdn5qfoKGgpqGgoKCjo6KlqKmrramqpqOmpaCloKaop6aoqaeqqaSnp5mdpKWjop5jgbvArnyko5qXbElce3BSdJWjoqChn6GhqKCcn6GloaCmo6KfpKGspp6foaGkrKqnrKivq6e0sa6ur7WyrKqwq6mtrbWwrq6srreup6yqpKivsq+sq7Kvqqqpq6utqa6urrGxraqtqaunp6uoqauinaapqKilqKisqKilpKWop6iopqmsr6+oq6mhoqKlo6Opq6ymqKWjqKKhoKSdnZ+hoZ2bnZ+amZWcnKOqlG9zZm5yZF1dUFVPWE9eZWRsaGJiWlpSVE9NQTo9Ojo4Ozk1MTYzMjg4Ozk5OTk7OTk8Oz0/Qz5APTk7Ojs8QD0+PDk5PEFBRUFGQTo9O0BBQUJBRUI4PYqWlJOYmpaPiISNjpGSjIiIiI+JiZCRjoqKiJubmZygpaKlnqKjoZqeoZyanZ6bnKOop6ugoKOYoJ2XnKGjo6WjoqKkrKilqaCepqmnq6mkoKKgoqehpq6mppyfbIOYuYus06ObtKxcTa+aVWWQoZ6goJ6doKOZlpqYo6KipJ+ZnKGhoqCbmp6goaSgnaejqrGorqusqaSqqquorKalrKqws6+rq6mwq6appaWoq6ynpqevq6Wnq6upq6irqqqrrailqKOmpaesqayoopykoaOmo6qpqKano6SnqKanqKepqKupoaKoo5yepqWjqKino6WlpqmgpJ6inpeYnZ+doqKlnpiUlZ6go5d1d2t2eGJfXFVZUVVXW2Nfc19oX2NTUVlUSD48PTg7OTo4NTM3MzM0Nzo4OT05Ozo5PDxBQEM9PT44Ozw9PEA/Qj86ODo+P0NAREE6Oz49QD9DQ0VDOTyCmJmenZ2alZKKiZGRl5GQh4SJgoGNj4+Sj42cnZ+hpKmlqaeorK2moqKfmKSmo6Stsa6yp6asm56em5qjp6Cfo5+foq+rq6yoqKuvqaiqqKKgoaiqrbGyr6ujo4d3fnpz0cSwmaOtbFanrmZdh6agpaKhnZ+imJWem5+fpKGclZigoZ2enJudnZuZmZWen6Oonp2iqKGaoaOmoqSoqaqoq7CxqKWlp6eopKWpqaqnoqWmqKadnqWloqClpaOlpqCjpaOjpaelqamqpKekpqKmp6SrqaenpKGlqKynpqWlo6OopJWdo5+bnaCjqaeopqGjo6mooKiioJyVkZqfn6GmopuXkpCamqCVfHdvfXlmW1tgX1pcVVxoZG9jbWlpYl5QUEA/Ozo4OTg8OzYzNDMzMzc5OTs8OTs7OT49QkBAPTs9ODw9QD08PENBPjo4PT9EP0M+Ojk/PEI/P0FEQjk6gJ6kp6Gem5+gmY+ZnaCWloqGj4iEi4qTl5SRo6Wnqq6trLOys7S4t62pqqevtLKxqq6usbKusa2lq7OssbGpq6+rq6y2sLSwq7GysaOgo6qqp6+3t7W1trKtsK2Ph4Ftksu9lZWmlXRWbXd1c3+VpqqnpKGfo5udoZqWnqScm5aZoqefoJ+joJuUlpmWl5qfoJmVnqGZmJ2dpZ2gpKeqqaiqraylqaSlqqeqqaqsp6SkpKOimZmhnpqaoaCfpaWYnqSmpKqooqelpaGqp6mnp6ejqKWmpaGkqKesoqekoaalpaOVl52Ym5mVo6elpaSfnZ2lo6Kqo5+amZiXnJyaoaGakJOTl5ibjX93cnZ4amJbX19cYllgZG5ta25hX2RgUE9BQDs7OTs4Ojk2MTQzNjQ3Nzc6PTo8Ozk9PUI/Pj89PDo/OTo7PD5CRUA9OTtAQT5DPDs5PzlAQEBAQkM7OXuao6OcoJ2dop2Zn6KioJibmJaYkpSQm5qWl7S0rrW4s7S4tre0uLm3tbm4ub28uKqLnLK4vLS9urW7uru4s7q/uLe5u7G3r6iusq2inaCrsri7vLy6usK5tbSehnZhVp61u6anmYd4bXJweHl6fYSMkZaboaanrKalmKGko52goaKooaOgpaGck5mYmJmco56cmpudl5uZlqWam5+hqKmpqKuvr66pqKirrKytq6irp6WjoJyfo6Ojn6Cipammmpyip6Spn6GjoqKgpaanpqSooJ+ipKGjoqiop6OloaGopqalo5mbmJuTj6GknqKfmJiVoJuhpaCfm5udnJuamZugmo2YmZiTkYaAdnh4eGNbUllUX19hbWh2a3FoaWliWlNMQDw6Ozg5Nzk3NTU2Mjg1Njc3Ojw7Ozs7QD4/QD0+Pjk6PDk2Nz47QkZCPDg7P0NDRDw+OT43PkFCP0ZDOzhwkpqblJ6bm52Vl52doqajopaXnpaXl6GblJi+t7G4uba3t7i7l5S2vbu9vcDFtaK7mKC3v7+6wcm0nbu2sra/xcGooLa0urGqrrSxsLK0tbjCyM7S0MzIvbGjjXBlUkSIlIWFhX14cm9mZWtoa3FzcXFydHuLqcbGu6Knqqynq6mlpqCnoKGmoZOWmJ2foqSjnZ6coaChnZekmpmdoKaqqqqtrq2tsLGrrK2sqamrrqimpaalpqSkpqaeo6eppKGcoKKjpqCio5+jpJ2foqWgpJyboZ6fo6GhpaSlqaOkpaKkp6ehn52elpOcoJiZko+MjJeWn5uWnJqdnJqSlpSUmJOQmp2YiouHgIB8gnhhXllTYWlhZnRvdGl0ZGlkYltMSz46OTg5ODg5NzM0NTI1NDY2OTw8Oz08P0E/QEA9Pj44OTs4Njc/OUJFQzw7PD5DREM9QDs9Nz1DQ0BFQjw3Z4yRk4qalZiblZWYm6Knq6aVl5iQlZmhnpeXvrWztLu6ubi5woeYt6u4u8DCxbOjw6e4s72/tMTHvbS7uL62wMTErqCworW2tb2+wcTHw8XH2+Tj2cm7rqOVhnJZWlFEZndqbnRua2VlWVhdWFxiaWpoZWFrj7jBwLmpr7Gwr6yqoqajrJ+fpquXmqifpaWfoJydoKuwsKyiq5yYm6Cor7Kys6uorre1sq2tqaalqKulpaStqaShn6Cnnp6mqKmmnp+anqGlpqmcnaObl6KmmpuanZ+cmqGcmZ2eoKijn6GfnaWioKOioZSZmpmTj4qLhI2Qk5uPjpiVm5eYkJORkomNl5iYk4uKi32AgIVwYGJfXmtjYm54dXdubVtiUlZcTUc7PDk3OTc5Ojc0NDQxNDM3Njg8Ozs8PEBAPUA/Pj8+Ojo5Ojc6Pz5FRUU8PT1AQkJCQUE7PDhAQ0NARD87NV+MjIaFlouUlZeYl5ifpqellpWVkZebn5ual7mxtrO5vLy5urWqsryxvsG0vMe5uLuuv6fGw7/KxsnIxcXJvMLHx7+xsKe8vL7FxMbJx8XGvszQ1Mq5ppqRhHBcUVRLRFtmXmNqZWJhaFtVWVRXWVpcWV15nri6q7SyrbOtqa6vp6awr7Ktqq+zpKu1qaeopKCgnqmyuL61tbWqqaausre4t7apq7i8ubexr66noqOop6SfqKOfnqCZoZydoqSnp6GelJuaoKGlnqChnpajnZSQlpiboZqflpORlpSin5qenJudoZ6kn56VnJiPkpOPjImTkJefiZCWkZuUmJGRlZaDjJWXlpKLjIh8f4R/amZoYWtsZ252cnJ1cmdeYFxSSUU/Ojo6Nzg0ODw3NjU0MjMzNjU3PDo7PDs9QD4/QD48PTk5OTs6PDw+QkRFPj49QENDQkREOzo4QUJCQUNAOTJbk4iEjZGKi5GRlZCSmp2fnJOSmJSdnZqXmpW2sbm1tb6+tri1uLO8vMTEusPHwb+0s8XFxr/CzcfLzsvLx8HDxsfIysXExcO7vLzBxcHFxL7DwcfLybiVdGFUT09TSD5fbF9fZWNiX2RiVFZXVlRVW3mirrCqqKutrKmlpZ6pr6uyu7q4u7e5t7O5uLOurLO0qrC1ub3Bur6+vL60urm4u7qysbS8u7q7s7Oyp6Smq6uioaCdmpudmpyXmpuenJygnZaclpuZnZ6io52UnJCNiY6OkZ6bnJWNh5KLmJiWmpybmJybnp6cmp6UjpiYmpSRmZeeoZWYmpKXlJWRlJqYk4+TnZaSi5F+enx/dWtsbmRvbWlxeG95amlhXWdhUUZEQTw5OTc2NDQ6ODQ2NTMzMjY1Nj05OTs7PT47Pj49Oz05OTs7Oz89QUNBQkFAPEBDQ0NFQjs4OUQ/P0BCPzsyV5uQkZCQh4WSjo2IjZCTlZGPjZSUm5STlpqRs7e4uLi+u7C1sri2tbbAw8G+w8LAvru+u7u8xMzEzNDLxsa/xcfLyNTLysjGv7u7vsS+xcjGxsTEw7m4w59mS0RHS0Q9WmRiYmpkYVxkX1hTUFBSXIe2uqyupaSjqKSgoKWZqbSxvsG+urm6uLW0srG0tLO6wL7Av769u7u9vsDCt7a3tru7sru+ubi3u7a3tKyoqamrpqijnpOampyYkZKZl5GRmJqXnpiWk5acm5+dlJOJiX6GiIyWlJiZkYmVkZeWlZmbmpaYl5idnpyhmJWZmZyYl5ybn56jnJ6WmJeTl5yZmZyUlp2UlpOJdnl6e3dua2lodlpncnhzemdnXmRbUlhJRj87Nzg4NzYxNjk3NDQzMzM2NDY7ODo8Oz08OD0+PDo7PDs9Ozs+PkRBQURCQEBBQkNDREM9OTlCQD8/QD89MkyWmpaSk4yKmJCKi4yOkpKKiIaNkJiKj5CUl7O7tba/vb2xtrjBvby0uL/Bsbi3vsHFvbu8wsbJv8jOyMHEwcfKysbKxczIzcbIxb/DwMvNz8rGxMTEwsTBsIpTR01FO0taX2ZsZ19cYFlaVE9Zh6esuLWyrKmjoa2prKetn6y0tL/Dvrm4vbawrausr7W0ur7Fv7u8urO5u7i5ubWtsLS9u7G/vLiytrmzubu0ra2orKyqqaeXnpualY2MmJSTi5WWlJyZl5WWmZKYn5mQiop+iYqKkY6Vl5OUn5mWkJSZmJmWmJOUm6GeoZiYmp2ZmZaenpibopqdnJuYmpuZlpeXlpyZlJyYfoB4eXZ2ZWZqamhea29ueXhjYmFgXlhXRkU4Ojg6OTc5NDQ5NzY2NTEyMzM0Ozo9Pzs9PTo6PTs8Pjo7Pz48QkBDQkJFQj0/Q0NDQ0RFQDk6QkFBQj5CQTVCkJeUlZmSj5qQjpKRjZSVi4qHjI2UiImPkpq2u7S8xsHEwr3BxcLAtLO9v6ywr7rDysPCvs3IxbfByMW/wcLIy8rCwsTJzM3Oz8zDx8bIycjIycfFycfIx8LHnXFcSD8/RF5iYWtiW1hXU1mAobm/u7y6vKytpqm7urm3v7O1uLLBxrq3t8Gzsa2tqau1s7u2w7a2vbWxt762s7e4sLW2v7uwvbq0q7CxsbO8urOzrqutq62xnaOjoJqQjpiXlZCclpaYlpWSnJmTm5+clpGUjpWQiYyQlZOUm56YmZKSnJedlJmSk5aZmJ2VnJ6do5yVnZ+TnKKcnKCfnaOemJSVl5ebmpmgkH99cXRxb2NhaHZoamp0bnlsXmRbVWBZTEhENjw5OTg4OjUzOjY2NDQxMzUyNTs6PD47Ozw9PDs8PTw7PD49P0E/RUFCQ0M+QEFARUVERUE7Nz5DQkI+Q0I4O4+akZaalJKUjZCUlI6VlI6Pi4yJk4uIkJObt8C6xsXEw8zCwcS9vrWvt7uvr7O6wMfFxMHMy8W2ucDCwsTHytHLwsPExsnFzNDNx8zJwsLHwsvLyMfMyc7GxsbAr3pVTi9WVFdoYVJOVHqyycjCxMfAvL60sLCwwr6+wcbAvre2w8K6urbAvrWyrKmvsri+tMC0tLi0t7nEua+8vrm+v8K/tbq2q6qsrq+wt768trSura2utaSlqKimmpycnZyeopydmZOQkp2VmKCdmJiVmZmZl46LlH2QkJefmZmYk5GToI6Nko+VjpCUlaKdnKSem56elpyjoKGipKOkop6amZubnJ2enIN9cn14cGdga2p3bWlmdm90Y11jVVdVU01HOjc7OTk3Nzo3NDg3ODQ1MjM0MjU7Ojk+Oj08Pz04Oz05OTk9PEBBQEVCQUJBQT9AP0RFREVAPDk+QkNCQENBOjSAoZeUmZiVkImUk5aTiZGMlJGOiJaKi5CXnMXLw8O8wMPHwbm9vbu4tre3rrK3uLzAwsDCx8bHurzAwsTHyMbSycHDw7+/vsTLyMrLyby8yMfJzcjDyMnJxcXCwsLDwZVDTnmDjlZQea3N08W2v7/Av7q7vbWzs8C/ub/DucC3u8G8uri7ub27srCvsKy5wri9ube1t7q9xb24xsjCwcLGwr28tamurrCwr7O6t7m2sK+tr7OppquprqannqSlo6OjoqCblZiekZecl5GRlZeZlZmRlJiSlYyYo5qcnp2FiZ+TfJKWlZKUlJennaCipJ+en56foaGkoqKjoaOinJ2fnqOhppl5enmAc3BmZWdkbGVia25vb19ZXVdWTlBKRjk5Ozk3Njc3NjM3ODk1NjEzNTI3PDs8QDs/PDw6ODo8OTk4Pj1APz9GP0JBQz89QT5ARENDQTw5PENBQ0RBQDozbKKdlZedlo+PmJiZmIiSjZGVkI+Vjo6TlpbKy7u5urnBu7q3vsG8vLu5sa61uri4u8S6vsC+vru8wMXBxsK+xsK5u8O6uLm8vsHHwca7ucjIw8XEwMPBwcDEwcK+vMemeW2CkZZytMzIx9HBr729uLm7u763tLC5vrO8vrG5tbi8tryztbm2uba5t7GtusG6vMG/t77Ev8bDw8fHwrvAwr/Cv7iys7O1tLGut7S3tbSxrK2xp6Wlp7CtqJ+nq6ajqKWmpqCgn5SYmZSRkZWUl5OYl5qhnZ6hnKGdoaWglpSbkZeXmJqTnpmZqaSlpKWdoqCanqCkoqOcoqGjoJ6cnp6ppaiVfXqDeG5mYWViYWNkZGpjZ2RbWlpdWVFPRT07OTo7Nzc5OTY0OTk6NTMxNDUyNzo7OkA9Pzw8OTc3Ozo5Ojw+QD8+RDxCQURAPz49QkRCQkI+OjlCP0FCPT44NVmfnJiTmZaRlZiYmpeQkZCQk5GTlJKSkpSUxce4tbq5wrm5vMPFwri7ubGxtry6tbnAu7u5tre0tLW/u72/ub66urTAuLW3sq66u7fAt7zJz8C6v8C8u8W9usDEv72/rnBhfJGKi9HFv7/Jv7DBv7q3u765tbi0uLy0vbi1tLCzvLG3t7i/tr25vb65t7q+u7/Axb29y8PGw8TAw762ubq2v7i7v7y4trOyq7CwsrWzs66srKemnqeurauiqKumpqqjp6iqo5+Ym52bmpicnJiXnJuhpZ2anqGhoKGmoJqbnJiboJ+dnJ+coKeho6SknaKfmqKgop+el6Shop+dmpieqKWhi3x5iH1xZGFjY2hrZ2dqZmpeVlZUWU9TTEY4PzY7Ojc3OTs2NTo7PDYzMTM0MTc7OTg/PT47PDs3Njk5ODo7PUA/PkA9PT9CPjxAQUNDQT9DPTk2PEBBQDw9ODdJlJibj5OUkZWYlZGWkpWRkJGUlZSTk5OYlcHCwLq8ub62uL7EwMKxvbqytLO4vLW3vMC8vbS0sbC1t7W7wbi+ub+8vLe0t6+ut7W5v7vB1Iy4v7vDtbrHtrW4ury4ubarpZiNfITJv7+7wb65xr3Cv7zFuLa3tLi2tru7uLa0t7q1s7i8vbm/ucPAwLu5vLu+vcjEvcfEw7rAvb62sra4srm0usLCureysaysq62yr7Kur6ijpJ6rrKyqpKakpKiqoqemraihoaGmn6Oiop6bnKKfoKOdnJuhn6KgpKCem5eZn6GdnZ6eoaWkoaGioZ6ho5yinqCZnZijn52eoJqZoKKmnYR6g4F5cW1lZWdwamVsaFlZT0tLS1JKTEhEOT44PTs2Ojs5Njc8ODk4NjA0MzE3OTk7Pz0+Ojw6ODg5PDg6Ozs7PD1BPj09Q0E8P0NDREA/Pzw6Nz5CREE/QDg4P4mYmoyMkI+Tl5WMkpCakpGXmJaUlJKQmZTDvsbBwby8uLi6v7a8scK2tLyxtLa4s7q9v768sq2vrLGwt7y3u73BxLm3t7a1ubm6u7+8z8N2qMy9x7e5t622tLe5s7WxvcnFlUh8yr6/vr28v8jDxcW+xri1srK9uLi4vrq6uby6urS3u7q5v7zEwL+5uri/ubvFxr3Fw8Kyur27sa+2uLO3s7q+wLm2rLGrrqmqqa2qqq6mpKWnrq2ppaOio6GkpaWmoqato6Klo5+ho6Gcmpyhn6CloaCenZygnaWgnpeVmZ2fn52gn6KmpaCknpybn6Ofn5mcmZ2epJyWnKOcnqGcppZ+f4d9a25xZ3FrdGZjbmBcVUhLS0RKQ0NHPzo7OD48Nzs7OTc4Ozc8PDYyNzUxNjk8PD08QTs8Ojs6OT45Ojs9PUA+RD89PkRAPz9BRkQ/Pzw9OTc/QUNCQEI5Ojl3nJiLh4uQkpOWjY+TmpOQnZiSkY2PjpiSvbfHvsO+vbu+vL22uri9ure9s7OwuLi1uby7wLeqraSusLi7sr2+u8S2tbi1t7++xLzCxNetc4C7yM/CwLiutLS7vbe5sb3Dyo1Eds3Dwr++vbzHzMfHxMe9tbW2wb27u7/CusDCv7y2t729vcHBwL+8ube8wru3v8W7wr++tbe8vK+vt7awtLO6ubq7r6mtq62rrKaqoqeuqKWqra2vp6Sgn6ajnqKjqKOjq6Oiop6dm5ublJaZnJyfpZ6fnpmYnpejoJyXmZqZmqOjop6jo6egpqCbnaCjnp2WoJmcoKCblJegn6WcmKKQgYaBcmZsam51b3lkaGNcY1FLVUhFRUNHQzw7OTg9Ojc6PTo4OTs3PD01MzY1MDY4OTo8O0A9PDo+PDk+OTk9Pjs/PkM8Pz5APz4/P0ZEQEE/Pjo3P0BDQz9APTo4ZqGYj4uNlZKVlY6PlpmVl5uVjoyMjY+bk7m2wbS/vLm8w8C+wLq1trKywLmvsry8sLe7tru8qqqjsLm9vLK8vrzFuLG4ubzGycrCxsnRmHBzrNHRzMrEtbq/xMi+vrS/wMB3UW/LxsK+wby/w8zKx8XGwLm9vMS/v7/CyL3Hx8XFvLrEv7vBv7rAvLu7wMS9t7nCub69t7S2uLqur7WxsLCytre0t6yurKqsrKuoq6Gms6qlra+trKippaOkp5+io6Onoaeiop6cnZyamYyQlpeZnaKZnpuVkp2UoaCdmZ6fmJimpqKfoqKmoqeloqCko6GbnaCbnKKfl5WVnp6kmpafiYGDgXRwbWx0bG1vYGNfYmJOSE4/RUA/REM7Ozo6Ozo4Ozw6OTw+Ojo+NDQ1NTE5OTo5PDtAPD89PTw4PDs6PDs7Pz5DPkI+QD89Pz9FRUJBQj87Nj9CRUQ9QUE6OlmfmJOSlZqVmpOQlpeclZuZlpSVkZKTnZm2uLaxuru6vsG5uca7trWypb69tLbBv66zvbS4wbGwsbS7xdHDur68xL63vMC/yc/HyMrJwYVxc6XMzMvNysbCw8vOwby4vbqwbmNjvMjEwMC/xMDKycPDxMO5w769ub+8wsbCyc7Hxr66xr26v7m3wLm5vsDCvrW0vLi2u7CvsrK1r7Cvrqyus7CzsrirsbKxqrCrq6yrrLatqKyusqarrKmpoaWgpaakrKSmoaChnqGgnaCMlJeTm5+mmZ6emZOYnZ+gnp2eopuYp62ooqSgoKKqpqmhqKGlm6CgnZ2jn5SYmKKdp6Gfm4J7eoh7bW14fGBxZFxfYF9UST5DRUlCQz5DOz42OTo7Ozs7Ozs7PT05PTU2NjIxODo5Ozs6QTs/PDw+Nzs8Ozw9PTw9Pz5BQUE/P0FCQUVDQkRAPDY+Q0RFPkJEPztTmZuZmJ6dmqCalpyZn5KdlZ2boJWWlJqYur20sLu8wcTCv8XGura5sqO7vbS3xLuwtbq2ucS4tLy3u7ur28O+tr7Avr66ppypsrbDv6V4dXibxMbLyMHDwL/JysG/u7mxoHxya67IxcS/wMG/y8fDwMjAusK7urO6usG+wMrOysS9tby8ub+5ubW1s7/Avre0s7S4rbeqr7CwsrGvq6+nr7ausrG5rra2uLSzsLGttrS6sa6srranrLKsraSjoaenqLKrqqWkp6elpaCml5ujn6SmraKeo6KanaWiop+foaWenrC0sKSknp+kqaevp6mgq6CiopqipJ2anqGmp6+psZWCe32Bem5zeHRocF5cX11aUkZFRE1JQUQ9SDs7NTk7Ojw8Ojs7Oz0/Oj01NDUxMjc4ODs8O0I8Pz46OzY6PTo7Pj0/QD87QUFBPj4/QkBBQkJFPjo1OkFCST9AQkA7TJqdnZ6fnZienZmampySoJWbnp+blZGRl8W+urbDvMbCvr/Ixbe1uLe2ubu0r7e3srWzt7m8u7a7u8S3ba3Ovba5wLysfW5obm1ygZWYc3d8l72/xsC5wLy+xcS9vbixsJiPfICbysLDvL2/v8PDv7/HvLy/tLSutbW8vr/OzcvCt7K4t7e9ubuxtrLIwLu2tLGwt6yzqbCtrbS3r6uuqrG1r7Gvt7O6usC/tre2sru6wLWyrbO3rLC6r7KloqWrrK+5s7KosK+xr6qiqKGkraitrLOun6inpqWmq6Sknqaqo6ayuLOrpZyfp6anrquqpbClpaWbpKOYn6exrLW4sLKOhHl/fHdtdXtwb2pcYGFaVFFBRklHS0BFQ0k8PTY7OTk8Ozo6Ozo9Pzw9NTU2MTM2OTg8QT5AOz1AOzs5PD04Oj08QD46Oj49Pj09PkBCQkJBRD03NDU9REc9Q0I/PEWUnqCgoJyXmpiYlZmdmZ2fm52bnJaRj5LDwMK9wrzEvLy7xbu3s7e2tru7s6CWtayvsbS0tLa4ucDNsnaBs722tcKlh2laXmBNUltabnN3gZ+4uMK6s7u3u72/uru7rqSal4aQfsDEw768v7u7uLbBwrW/urWur62wvcC5z8rJw7GwtbS0vbq+urq7ysO7uravsL2xuK+ys7C3vbaur66wt7CsrLK2vbzEwrq9t7bAv8G3tbC2srGzurGxr6err6u2v7e1qbqztbmxp6uop7ausrG1uaisrK+qr7CqqKessayytry0sayjqKuoqKusq6i2qaaonqadmKOuvLG7wbSmiYF7gnpzdnZ3bnJhX2ZdW1VKPT8/R0c9R0NDOTo1Ozk5Pjw8OTo8Pj4+Pjg4MzE1Nzg5Pj9BPzs6Pz08Oz09OTs8OTs6Nzs+PT1DQT8/QUJEQkE8ODU4PUNGPUREPzw/iZ2en52Xl5WUk5aZnpubmpuYlJ2Uio6Owb7Dwr6+vrm2usCxtbGzt7fCtbOrrbOoqa61r620trnCyaeFeIqgr7WdamVnVllgSUlNUFNsd4alsLe+ubK1sru5vLa5vrSWm6WVoHGuycTAvb+5s66yvLquu7Szpquorbq+uMvCv76sq7Cvs7q3ub67wMXBu7y3sLXEtb+0uLu0u8PCs7a2sbisqaWrsr23v7+7u7exvL28trGvq6uprbOvsLCrsLSpuMC2sqm0tbC3tq2spqu7s660uMKwsbG1sbK1saywsri4ubi+tLGzrqyxramvrqqyuK6trainoZ6ptr+4ur+wlol9gHxxdHd0d3JsX2NhXF5PSUI/PUlERk1EQDc3NTs6OT48PDk4PT47PT86ODMyNTc2OD8/Qj86OD4+PTw5PDk7Ozo8Ozs6PEA+QkI9QEE/QkI/PDs3OjxBRD5CQz8+QYqgm6GdlJiVlZKYmpyWm5WalY2bj4SIhru0vb+7vLm3s7y8rLOytLS2wLXAr7Kzqqqxt62pubO3v8WqiHx1jKCYYFRDWFVHYWpWT0VKYY2grK+2urW0sqy8ubi1uMG9i5evoaVypcvCv7m6ta6lrLOwpq+tqJ2gn6WttrXCt7a0paiqqLC2s7K6tbu7u7W4trC1xLK+vL+8ubrFybq9vraxp6SeoamxrrW5trKxq7S2trGopp6gmaWmpKynq6y2qa+6sa2kpq2lq7GrrKmtuLawsrjBtrGxtbGvu7ayt7W1sry1urKwsbKutLKqrq2nuLWyta2uqqiosrq9wLa0qY6Ce393cHxvdnNuY15nWV1eU09OQj9KQ0FLSkA2NjU7Nzg+Ojs4Nz4+PDs/OjkzMjc1NzU8PD48PDg+Pjw8OTk5Ozs7Pjs7OTw+P0E9PEJAPz9CQD47Njc6QERBQ0E/QUKJoJ2loJSWmJiVnqCcl5uYmpGMmYmDhoS1r7S7u7S1sLG2uq6wtLOvtbq1urC1s7KttrqvrbyzuLi+tJCCeIiPb05KP2RZQk53gJRqTkFdgbC1s7WytK+su7q4trm/xXWCqJ2ZY6m/uLWysa2tn6SmppyjpZyWmZman6muuayrq5+lqKSrrq+nsKuvsbGtsa6ur7mwtLy+uLm4x8W8vLu4qaKcmJufp6assq6zqaapqq6popqXl5GcmpijnqKir6ekrKaompqemqGnp6anqa+2squ0trCqsK+xqbm2sbWxrqy3s7avrquuq7S1ra+rq7GtsbKoraurs7W3ur2wq6GLeoJ5cnZzbXVqbF1ca1ReXFBOSERHTUJHTkc4NjY1OjU6Pjg7OTc8PTo7PTo5MjM2Nzc3Pjs9Pjo6Pz48PDw6Ojs5Oz47PTk8Pj1CPDtAP0A/QT8+OjU1OkBFQkRBQEJBiJ+ipqGYm56dmqWpmJudmpmUjJmHhoeGrq2uuLmxsqiur7iyq7CwqrK1ubm+tbK4tLm6trm7tbWzt7aVjIiEe1hGQU6HWUpKWHeNgWNBU6O4s7SysLGtsLm4tru3uryPobGqo3KssKmrraujqKCdnp2Wl6GVkZWXj5eeqK6ko6Sgoqaio6mpoaanpaqtp6ynqKesq6yyu7SztLm6trK2ramgmpaWm52fq6yqr6Oko6GpoJuTjo+QlJKSmZaanaSloJ+ep5iVkpSZnqSjoaWqrK2iqaqppKmtrqW0sa6xraqprq+wraWmqqSos66trKmmpqmrpqqnq7Ksr7Oxq6mWgX+Bd3J5aHV0b2VVYWRXXVJPTUlASVJETkM9ODg3NTo3PD46Ozw4OTw7Ozw7ODI0ODk3ODs7PDs4PD0+Oz08Ojk8Ojs9PTw6OkA9PDw7QD5CQEE/Pjk1ODs8RkFDRD9BQYijpqKjnqCfp6Coqpufm5yZmI6Xi42PjKqpqLGvsK2lp6ayr6mmq6CvsLu1vby4wMG+vLy8ua6sr7K8qpmZlWlNQFJ4cVBJSUtnnIFZRFKuu7Gss6+urK22trK0ta6opp6am52epqieoKipn6GnlpqWl42bkoyOlIyWmqOooJ+hoqGmpZyjo6CepaCkrKWmqKWio6OrrLOuqa6urqeqraisoZyamJmYm6qoq6ufpqKbo5yVkIyPkJCTkJeVlpifnp6amaaXk4+Slp2ioKWipqSnoKKko6Ghq6uksq2qrKyno6yuraufoaKkpK+srKmmo6KqpKqppKmrpqmsq6ahiHiDfHZ/emN4bW5dUWlVUE9HUE1NQ1BSQT87PjQ6OjU7Oj07Ojk9OTk8Ozw8OzkzNjk5Njo7Pz06ODs6Pjw6PDs5Oz07PDw9PjxAPT88ODtAQEE/Pz45NDk8N0FDQkQ9QEOOqqSjoqGinaqlpqimoZ6dmZ2PmJWTkJWnpKGmqKmlpKChp6uhnKKbp6u1sry9wMLCwL7AuLSnpKyovcKrpb5pRVKdglFXSUpgS1SOYWNiga61qrK0rqqrr7Cys62lnZGXk4+XoJ+hoJyjpJ+eqJSZlJWKlI6KjZWRl5uhqZ6en6Cjpaicn6ChnKGfo6innKehoKSfrKisrKCpq6agpKimrKOenp6al5qrpqqxo6WonqCclpOPj5KRmZCWlZiXn5icmZukmZeUlZqdoJ2nqKWgo6Kho5+doKmqpa6upqipoaKqrqqnoaCio6msq6eppqShqaKlqaalpKKmpKijkn58gHV2fW5se2RpVlJkTklIR09TTktOSDxFQD0yQDg1OTs+Ozk5Ozg6PDs7Ozk5NDg7ODc7Oz48Ojk8Oj07Ozw9OTw8PD49PUE+QEJAPTc6P0FCQEA/ODU1PDpAQ0BEPkFGlq6koqWeo6KpqKipqqWmnp2imJiZmZWbop6bnqOioKOgoZqgmJeXlqGorK62trq5ure3u66ooKGpoKrGv8uhUEFznXdQbktMY2Z1c2BaXnCQsa+us7Wqpqyso5uZlI2RlZeYmJyfoqKcnaSemqSVnZqUjY+Pj5CXlpqeo6mdoKCepqerop+gp5+dn6OmqJ6jpp+qnaqtqq6nqLClo6Smp6ymoqWim5mer6iusqumq6qgm5iYmJWTlpqTlZaalpuXmJihnpyclpuhm56ao6eln6GioqOdm6Gmp6aoraOppZ6kp6mkpaWhpaSsrKmmq6eioKSjpKenoaCgpaKmoIl8gH53eXxleXlhYlNWYUhJS0xTVUpTUU05P0E2Nz02NTs6PDw5Ozs4Ojw9Ojs4NjU3OjY5Pj0+PDk5PTk9PTw+PTs7PDo+PTw/Pz9APT03Oj5AQEA/Pzg2NT08PkFCRkBAR6CupKaroaOqrK6tp6ypqKCipp6bm56aoJyalZmfn5uen56WlJOXk5KcnqSorq2sq6uvqq+pnpeepZykx8eOV1NKZaNaZX5vcl1Ra2NbZF9ca4+0sLC4rKahnJ2alJeamZCOkZWRjI6Nk5minJanpaGVlZaRlpaUm5mdo6Son6WjnqeurqqmorGjmqOmpqqioaqiqaSosquxsqu5qKarp6urqaysp6Ggo7GusrG0qrKuo5mcnZ6hmJubmpiZm5WWm5aZnKWhoJqjoZqdmZ+kop6gn6KmnZulpqWkpaijp6OepqOinqaloqWlqKykpq2noJ2eoJ6gpaGenqWgppmBe4F8dnZzaYJtZVxTW1pNUUtPT1ZNVE1CNz5DNzg9NzY6PDw9Ojw5ODo7PDo7OTc2Oj01OTw7QD03ODs3PTs9PT06Ozw4Pj09QD5BPj4+ODg8P0BAPT43NTg9Pj1BQEZAQUihqqCrq6GkqquwramtqaelpaWkoKGfnqWXl5SYmZ6YnJ2blo+VmZKRnJihnaqip6Cep6Gln5ySm6KanqukjXpVaXJ2dXBjdnZYV2NgY2dZWFdnra6sr6efnqKglpCTm6CcmZeSk5+coaOanpqYo259l5mgm6KenKKcoqarraerqKSstLe2sKe0rKKtraOvpaSmoamorrWzsr22vrCssa6tqaq0sbCoq6iztbizuK2ytKSgnaWgrKGhoqGgmpmWlp+bm5iloaCeo6Ggn5ucpaCfnZyhqJ+fp6meoaOkoKagnqehn5ymo5+ipaOooKmrpZ+dnZudmqainpyjnqeQgYJ/fHh2and1Xm1bUmFJUlZIRlZXS0NNSD1LSThGPDc3Oz49PDo8OTg6Ojs6PDk2Njo8Nzs+PT8+OTc9OT47PEA8OkA6OkA/O0A+QUA9PDk3Oj5APzo+NzU4PT0/QUBEQEJGnKueqamipamorqimqqWmp6aoqqGlpKOmkpOVmJacmpqcmpWTmZuNk5+ZqJ2un6eenKGdnpqZkpiem6KhoKSAboJwYGNYTFtTWk1MUFhSSE1NSJisqqmloJ+akpGUmJiWlpaMiIuOlJ2cnZyfmUhHj5+fpqOup6SsoKirtbC0sLCttri9v7qttbSwt7CutKmmpKWsqbmztbvDvMPBt7u2q66xube8r7OwtcG8t76zs7WirKKpqbKpq6inqJqZnpqqp6CZp6Cfn6iopaWfnaqiop6bn6igpKetmZ+jnp6nnqCmnpycoqGbo6KhnZympaWkn6KZnJukn6CboJyjiYWFfnZybWl3bWhuXFhcQ1dOSkdNSENGTj0+TD40PDo2Oj0/PDs6Ojg4PDk6Ozs8NTQ6PDg5Pj4/Pjg4Pzk8Oz0/Oz1BPTo/PjxAPj8+Pz08Njs/QT07Pzg1ODw8QERCREFCQ5WqoKapo6mqqKmjoamgpqinrK6lqaWpqZSSl5mUmpqanJiYmZyamJmqoLGit6Swpp+enZ2XmJWZnpuco5+diWFXXmVgV01RRz4+P0NDPz5CUXipramqpqCen6KjnZ+em52blJOVlJ6emJSFpnYqYJKeo6uuuK+vrq+vuLy7u7i1uMO+v8K/trq7wMO5vbusrqexrbHCtrjCxsDIysDKv7C5ub24wr64tLvGxL3DvLi0qrOtqrO0r7Ouqq+jnqyot7Kto7CmoaOwsa6wpKWvo6GgmqGmoaSqqpmdoJmao6CmqKGcnqKemaSenpiYo6OhpJ6mmpuipJ6fm5ubnIeGgXx0cmtsdXJxaFdcUUZVSERKUEk/RUI0Rkg5Njw+Nzs8Pjw8Ojo4OTw4OTs4Ojo4Ozw3Oz49Pj02OEA5Ozs9QDw9QDk3PD07Pj0+PUI+Pjc6QUA+PD45NTg9Oz1DQEFDQkGRqqGlqqelqqimn6KnnKasp7Gyq62jqayVkpWalJecoqGbnqCinJ+psqu7sr+rr6ylnqCgnJyYmp+gmp+flXxfXmVgUUdEPEM+RTw/OTZOfqqzp6SjoqCepaymn5idlZKanpmVjIqGiIZ4bItXNWaFfHmAlry8vLC5wcPCxr++wsbGxcPIwsDFyM3QyMvDsre1vrK+xbu+zM3GzMzM0se+v8DDvsfGwrjEysnEwce/urS6u7W7t7C2squ7sq+8t8C7uqu4rauquLu1vK6uuKOmo56mpaKjqaaZm5+Zmp2nqqegoaGkmJSjlZSZkZydn6Sep5+en6KdmJmUmJSIhX56cmtkaW94a2VaXEZMTUVEVE1FQkU3Oj87NTQ5OTc5Pj87PDs7OD48Njo9OTw9OTw9Ojs9Pj4+NztBOj45PT45PT44Nzs6Ojs/Pz1CPj83OkFAPTw9ODY2PDo8QD9BQUE+kqugp66ooqulpKKipaGlqquwsq2upKmmlJWWmpaUm6SmnaGqp6KrrLy8v8PBsrK4p6Ghq6qhnJ6hoZ2bmn1zamFXTkU+SVl8b2JCPVyOrqygmZucnp6Zl5eYk42Pl5eUj42QjIKDgnZycGxwbFRga3BybnOPrsS+wczN0MjEyNDMzMzHysXFzNDS1c7Tyb3Av8O7xsXIxdHTzdPQ09PMysHGx8bKyM/AydHNx8bIxsK9xMG/v7+1vrOtv8DDw8fFyMSvv7myuL3EwsG7vLy1rqenrqigoqmlmpagmpmdqKupo6SknpePm4uQmYmVmJugn6OdnZeempOTi5WPhYF5dXNlYmdyb2deWlpET01DRlFJRENBNTU1ODlCPTY4OkE+Ozs+PDk+PTc6PTk6PDg8PDw7Pz8+PD0+Qzw7OkA9Ojs6Ojg4ODk7QT48QD8+OTtBQTs7Pjc4Njo7PkI+Q0FAPpOvn6ivpqiro6KloKampKuoq62qrqKqo5Kcl5ebmJuirJ2frqalsarFxszOzb+wwaikqKytqqCdo56bnZZrZl1USURAP0uGnqWahKCyraOenJ+amJeUk5SXkZCQjYiEhImHg4CBgYB5cXFuanuAZFh3d3Jucn+dvs/N08qz0dDQ0dHNzc7QxM3U1djR183Gx8nMw8XKz8rS19LX0tXW09TIzMfMzcnTzc7TzcbJysrCx8zHycnGv8Ozs8jFy8vLz8fKv76/vcHHxczMycnAw8CusLOonqKqo5qTnpyYnqaprKSlppaXipWFkZSHkpKSmZualpiQm5aQjIaRi4B7cnV2Z2NndmplVlhSRE5HQElRQz5CPToyMkE8RTw3ODxCPTs9Pzs7Pj05Oj48Oz44Ojk5Oj86Pj1APkA8Pjs+Ozk9PTw5Njo6Pj08PEA/Pjk6QEE6OT44Ojo6Oz4+PEE/QT6QrKKiqaanqKSfop2qqKOso6OnpqyiqZ+To5iWn56dpK6bn7CrqKyxyc3U18/Gu8esrbO3rK6jnqOinaGcY1RMSkRDP0NSrtG9sq+mnJycoKShnZqUlJWUin15cWxlYmhycHJ7hYqAdXBtcHJvhHt2gH10cnVvdJ7P0NOZttfT0dLU1NLP0cPQ09bY1dXSy8nO0MvGzdLK0tXX2dbY09bYzdLKz9HMz9HN09DAycjLxMzNzM/PxsfItsDLwNLNzNDHysnAxMPIz83Q0c/NysjNuLe7qJ+lq6eemJ6jnp2qpa2pqKiSlYiQhIyRho2MiJOVmZCWjJiSj4aHjIR9eHN2cGNhZXJjXVJcSktHQUZJSj87QTg+NTU4Njs4Njo8QD07Pjw7OUA7OTo8Ozs8Nz09Ozo+Oz08Pjw/Ojo8Ozs5Oz89OTU7PD48PD0/Pz46O0BCOzk/OTg7PT0+PzxBQEQ8hqugnKegp6Oim6CbqaSlqaCfoaGmn6ifmKSimqmmoqarmqOwsamotdDU19rSx8bLtLXBxbG1qKGlpaCioltJQEFEQUZRdrKvppqUl5+cmqCgnpudmpWJd2lkYV9fX19eX19dYWx1c3Bvbmtwb3ODgHuBeW1paF5tvtOjf9LW1M7P1dTU0dHM0M3T19bT1dDP0tPRydPRyNDX19jS2NLX2dXWzM/Pyc3SzM7RwMfEycfPztHR0sjMzcDLzcbUz8zPycXLx8fJzMvU1NHVz9LM08K5xbGlqLWuqJuoq6Wdsqiws6ysk4+TjoiKjoOPi4SQjpmNk4+Zj4+ChYx8enFzdG1hY2ltX1ZRYEpKQ0VDU04/PD40Mzo9NTI4NTU8PEA8Ozw6OTpAOjg7Oj46PTg+Ojo8QD08OTs9Pzk6Pz07PTw9PTo2PD0/QD08PT0+OjxAQjs5PDc0Oj48P0A9RkFEPYKknKClnqWlo5mcnaSeo6OfnZ+doJqnnpyhqZ+vraqqq52lrreoq7fX1NXZ2dHO0L+8zMm2vq6nqqiho6xmQzg9PkRYgqqon5eVl5manJ+dmJudk31xZWNiX19hX15hYF5hYF9gZW1wcG1qbG9zdn1yeYByYlxTWaOtcqvaz9POy9LN1dTRys/M09bS0dbNz9XV0cXR08rQ1NXWztPR2NjY18vIzsTJz83KzMDJwcnKzs/QzNDOzszP0MjM0NHLzsvDysjKzcvM0tPO1NLR0NDKvci5sK67ubWrtrCtqLits7+7sZqOoJSRjo2IjpCFkY2ZjJGRlY6RgIWJenZvcG9rYWRucGFYXFtJRkZETVlFO0A9MzM8PDg3ODU1Oz5APTk8PDg8Pjk8QDtAOj04Pzk4Oj88PTg7PkI6Oj08OkE9PTw6Nj08P0A9PDs9Pjg7QEE9Ojw4ODs+PD4+OkVCRT6Bn5mlp6Cgo6eam5+cl56eoZqdmpyappufpKefuLa1taykrK6+tLDA2NLX2tzWzs3Kw9LPwcGxqaytqaSye0hGQjtXjaGblZOWm56enpyTlpeUiGteXl5hZGJgYGFhYGBgXl9fXlxibXJubnBxcnF2dG93eXRjW1x7d4jR1MnMzcTNytLSzsbOzM3Uy87SzcvX1tDM0dTLzNDS08rO0dXS1dbKwMrCxs3DyMrDzcTGycvLz8vOzdHO1MzHydDNycfLxsfCxsrMztHRx9DPzs7M0MXHwbi5vcPCvcO5srK+sLvDxLWqmKWhmJaRlZWSi5SNmpGUlI+PlYKJhnlxcmttaGBgcWhZWGhWTUdMSVFRQjtEPzs2ODo4Ojs1Nz09QTs6PD05PD05PT06Pjo8ODs9OTtAPD47Pj5BPDk9Pj1CPTs3NzU/PDw/PDw7PDw4O0FAPDo8OTs7Ozw9QTpFQUU+hJ6bqK2epKSqnJ6fmJKXm5+am56ZmaKVoamppcTCwb+7tbKxx8K4ytXW2drb2MzMz8jW1cTCta+0qKCtl3hsb3B3j5qNjJeVkJORkZWWlZCLfGViYmJgXV5hY2JgX19gYWFgX11bXWdxcW9wcW1pbXNwaHJ0Z2ZjXXfCxcfHxMS9wcXOzsfFxs3K0cjLzc3G0dLPzczUysfKzs/Hx8/Sy9DPxbrEv8bKvcPHyc7Fw8jAx87IxM3LzdDJxcXQycbCxsnFv8HIzczMz8PKzMnHzNDFxci7x8PJycLPwb28v7DByce5vaqxsqelnaKcmJCbkKOZl5mRlZiJj4J4b3Vka2BeZnFhW1dgR0lIR0lNVUc/Sj02NDM1NT09NDg9PT06Oz08OTo7OT89OTw7PDg6PDo6QD1APD09Pjw6Qz48Pz04ODk6QD4/Pjw7Ozs7ODo+Pzw6Ojc5PD49Oz49RkFDPYOgm6qupa6qq5qdoJeUjpedmpmgmpqcm6WysazJzcrIxL68uczMxtDV1dja29jQyc/P0dPIwre7u62ktn5ngoWiqpONjZaPhYODg4F9hIR+c19bXl1eYF5gY2RjX11cXl9gYF9bWlxha3JwbW1oZ2lqdWpjYl5iZV2oxri/wbm5uLi9yMXBw8DDx8rIyMnIwcXMxsjKzcnEwcrJwcHLz8TLyL+5wbzGyL7Axs/LxMDDu8rHyLvJxsXKwb7Cy8bFxL7Gvr3BxMbMxsa8v8rDxcfSxcHJwMrKxsjG0MPDxsOuxMvHw8q3v7y6s6mspKWYn5iso6Gmm6Ogm5V8d3N1ZmpbYW5tWlxYUkRMR0NHRExERlM/NTQzMzVAPTM6PDw7OTw8PDg7PTtBPTo8Ojs3Oz05Oz07PTs6OD4+PEI+Oz88OTk7Pz07QD48Ozk5OTk6Oz06PDo2OTw+PDs+O0NCRD5/pZypsqm0rrCdnp6YnImUm5man6Kfmp2ovri8ys/RzMfCw8bNzs7M1c/V2djZz8vSzc3OyMG1w76ysLZsXnl8n5GKkpaGeoCEhX91eHVycF9aW11gYGJjZGRlZGBbXF5dXl1gW1laXGFucW1pZmdraW53XFhWXWFpqsGttbiwsLGvr8G6uru6uMDBwcS+vbm9wLnEysXGwr3GwLe7w8i/wcm7tru7xcO/vMLOw8a+vrXBvsS7vce8w7q1vcbEwsO3wLa2v7+8zcS9trrIu7++zMTCxsPGycfJxtDGwszIssfJw87MwMXDv7yyt7Cyp6ioubClrbCqrayUend4a2VoYGhvZFZeWUpGSkZIS0FFQkZKQTk6NjU4ODUzOzo7PDk8PDs5Ozk6QD46Ojw6Nzo7Nzo7Oz88OjxAPUA/PT8/Oz07O0A8Pj4+Ojk5ODk3ODo8PDw7OTo8Pjs7PjpAQEU+fqygrLWrt7SyoZ6fl5qNlJaan52mop2et8XCxMjO0srKysfNzc7RyNDG1dTV183Kz8XJxcfBusW9rK6mYGN2gZKLiIuEeH+Ghn99g3t0dGNcXF1eYGBiY2JiZGViXVxbXF5cXl1aW1xdZ3Jva2RjaWprd3JPUVdicZq0q66upKerqaS1srWzsrO0u7W9sbewta+yu8K7wcS8v7q0srq+wLjIuLS8tsDCvbi9x8HDu7Wvs7W7v7TFuLu1rLm9vsC9sbu2sLe6s8a9t6+8v7W3tcW9vsPGwMTGxsfMxb/GxrvHy7/PycfDxsHDt8O9vba5vse/rLW7tbe2jnl0eGdnZWJrbl5WXmBGS0hISkdCREFFRj89OjU2NjYzMzs6Oz06Ozs6Oz44PEE9PDo7ODc5OTk7PDo+Ozk+Pz1APz5CQD1AOjo+Oz89PTk6Ojo4NTY7PT48PDo7OT49OT86PEBAPIi3pauzsby8sa2foJmUlJiXnqujr6qnpMXLzcjFyM3M0MvNyMnIysnKxNDN0s/NxcfBxcG/urjJt6uwmVtnb4iPhoiJenh+hYZ2d4F8c2hdXV1dX2BfYGRhXmNlY19eXFteXF1eWltbXV9rb2xmY2ZoaGx7ZUlcdYeUqKioo5ufp6SbqKmwrKmrqbOttbCyqK2nrLO7urbDubq5sKq0ubuzwrmvwLG9vLu1u8e5w7etqqiwssC2uL2wsaiys7W7vKuutqeutq68srGquLCuu667uLvAwb66w7/Gw8XAvMbBx8q4xcfFv8fDw7nExsK7xsnMy7O5wr27s4l0dndraWBibGlZV1dbQUxMTUpFQUM/RkE6Ojo5OTY4NTQ6Ojk7PD07Ojs+ODtAPD05Ojc5Pjk7PDo4Ozs6Pj45QT0/QD87Pjo7PDo9PDw4OTg5NzY4PDw9Ozw6Ojs+PTs/Ozs+QDyKwKuouLe5w62zqZ2ZlJaZoZymsLWxt6bFztLLw8XBxM/HzcHCxr/ExMPDysLJyr/AvMK6s7W1w66qsJJbaX6SiI6Pe3h9iYV5e4SAd25eXVxcXV9gX19kY2JkY2JgX11aW1paXVpaWlpcY21tZmRkZGZobXlkbYSQk5uipa6am6GdlpmiqKyjp6GrqaursKOmn6mttbaxvbivt6+orbi0s7y3s72wuLm1srzBssCvpamjq7Gzs6i9qquoq6yutbSmqa6hpa+ps6aoqK6mqLessbO3uru7sry+vr7Ev7XBwMfIt7+/xbfFw8C7v8TCvsTIzMq/v8TAwKmHc3RzamlcYW9kV1ZYUEhaU1NLRkZFPj9AOjc4OTc3NjQzNzo5OTo8Ozs8PDc7PTs7Ozw4OT44PTs8Njo9Oz89N0E+P0A/Ojw8Oj05Ojs6Nzc3ODg3OTw7PDs5Ozo8OTc5Pjw+P0E7jMKvrry3ucSwtrCbmZWcmKqpsLGztb2vxdDPzMPHubnLwsu+u8m2vcO+usq3wcTBtLa8trGvtbytqauTZG2Ig4eLgHp9f354dH58c3dlX11cXF5fYF5fY2NhYmBhX11dXFpYWVtbWFdZXF9lamRiY2FkZGhteXmAh4aTmJGVraagmJSOnqCnoqKfpKSmpa2fnJujpayysLa3p7CsqKq0q7O5sLa2rra6s7C6urG2pKCkoKaxqKypuaqlp6eop7OtoKenn5ykpqyfn6ekoaGxra2ssrWztLC1vLa7wcCyu77DwbG5ucKzwL3Atbi8vb68wsfEw8S/wMSghHlxbGJmYGtvYFVZX0hOaE9USEZLRjw9QD06Ozs4MjY1MzY5OTk7OTo6PDo3PD88PDs8ODg8OTw6Ozc4Ojo8OTg+Oj89OTg8Ojs+OTc3NzY3ODg2NjY7Ojo7OTo7PDg1OTw6Pj5AO43Itba9uLrBur22oJ6VnaCmurars7O7s8TPycvCxbi3x8DMv7jKt7vFuLPFuLO/wKy2vLKspq+0raGjkmlyhoWGgHx4dXNvbWppaXBpX2BdXFxcXl9fYWNiYGBgYF5cW1xcWFlYWFhWWFpdXmNiYGNjY2JlZmx5c3FqWFtvRXugn5SSiZqen6Wbnp6ipKKnnZuim56qrqyxtaSoqqmsrKS0uKy3sKyzta+zta+wqp+en6SisqWmqritoqamn6itq5mfoJ6ZnZ+lmpmjnJyesKmsqKqrrK2ws7mvuLm6sLa8u7qrs7K5s720t7KxtrW/tb3AvcPCu7u9l4R7c2xfZV5kZFhUV15JV11LUEdKSkdBPD8/QTs/PDA1NjM2Ojs5Ozg5OTw8Nz4/Oz07Ozg4PDg5ODw3ODo7Ozo7Pzo9Ozc4PDo9PDc0Nzc2NzU3NDY2Ozc5Ojs6ODo5ODo7OTo8PzuJyba4vru4wcHBtKSkmZqkpsCyr7astLfFz8jIwMa7u8PDz765yLi4v7eywrSxu7usubqxop+pq6eYnpBtfoWGf3hybW9ta2JeYmZmXV1eXV1dXF1fYGFiY2NiYV9cW1taWllYWFdXV1dYV1pdYWJjY2JiY2RlcGpYQSI6cWhph5ySkoyXnp6mnZqbo6WhpJufoJmYrq2tr7KgpKKtq6ehtbCxsqypsLOourOntqGin5yjoa2joqq2q6Kjpp6mpqOWmZ2XmZqdn5qXnZydnK2hrKijpKatq7OzqrWwsquyubSvqq+ysrO3s66pra6yuLC6trq9v7ezsZSGenZmX2ZfW1lWU1pVS1tRTEpFSEtJQz0/QUFAQToyNDUyNDk5ODk7OTo9PDY9Pzs8Pjs3Ozs3Nzc+Njo+Ozo4Oj07PD06Ozw6PTs4Nzk3NDY1NTQ2Nzg1Ojo4Ojk5PDg3Ojg5PkA6gci9uL2/tr68v7KdpaOYpbHDtba9rbS4wszIxsDFtsHAx863wMO9s7m5sr+2sbm7rbK1r5+ao6qhlJqPeH+DhH94b3F0cWhlZGllY1xcW1tdXVxbXmBhXl9fYF5cW1pcWllYVldWVlhXWFdVV2BiY2FhYmBgZGZyRBkcSIqUkI6ZkZSOk5yanpuVn5+nop2dp5uamqunr7CqnKOjt6mhoK6otaqnp66xpLiwpLego5yZmaqmoZqtubCjoaScoqCgk5WhlJaWnJmYlpeclZ+pnqqkop6jqqqxrai0rKqnrbOwpauus7GvsK+vp6iosq6ytLC8tLq4rqOUgnp3ZV9hV1lYU1JUS01eTFBMR0hNTEU9QD49Qjw6NzY1MzQ5ODg5OTo5Pjo4Pj47PTw8Nz49Njc2PTc7PTs5Nzk7Ozw+OTk6Ozo4Njc2NTQ1MzEwNDU2Nzk6ODo5Ojo3Ojs5OT1AOnbAvLS6wrG+t72tnaenoqq7wL3Aua60uMHMx8XCw73FuMjMssHCwa68u7W7vLW5ubCvsKqcmqGplZGKi4CAfHdxaWxydHBoaGVkZmFcXFpZWlxcXF1eXVxbXF5cW1xZW1taWFZXV1ZXWFdXVlVaYmJgYGFfX2Bial8lN26Hi46OlJKWkJGYnJmdlJ6dpaSipaaenJ+moKuvpp+ho7anoaGiqbOipailsKaxrqu1n6GdlpWpoaKUrbGxn6Ojnp6YnJOMoJSRk5iYkpeYmJeep5unoqKapKWlq6SlsKelo6usraaprq+vq6iqqrOmpquvtLGuvLaxr6+fknt4c2ViXFtdWE5MUUhSYU1WUE9KTk9FQkQ/OT02OTo3NjQ1OTk7OTg4Nzs4OT0+Oz47PDY5Ojc7Njs3Ozs6ODU6Ozo7OzY8Ozg4NDc3NjMzMjEuLzI1NTY7Ojg7Nzg3Njw7Ojs7QTh4u7uxtr2wu7G3rJ6lpqy4u7zBxbqyubXEycnAwsbFx7bGxLPBv8Wrt7e9tr26u7WyrK2omZmfo4uKdImIfnZuY2FmaWhmZ2lmaWxgXVxbWlpaWlxdXFtcXl9cWllbWVlaW1dVWFdVVFZWUlRSVF9fXV5fXF1dYGFsV1yHg4mHjYuNlY6Qk6CXnpWanqOgq6Sjo6Kkopyqq6SanqWxqqGhnqWqnqiin62sqqmuraKiopWYopqckKupsJyfop+fl5mTip2RjZKUlpCYmJOcoaOcpaGilaCipKWbo6uloqSqpKutpa6yqaalpqa1pqqorbO1tLm6r6qsnoxzcXBgW1dWVlJHUU9IWlxPUkpUS1NMRUdKQzg7Oz08OTY2Njo5Ozo5NzY5Nzc6Ozo9PDw2Ozw4PjU5ODo4ODY1OTo7PDk3Pzw5Njc4NDUyMTIxLi4xNDI2Ojg2OTg1OTg5ODk7OUA5e7W0rLS7srCrsa2dqKevubmzwMi6tcCvxcjMusHJzMi1ybyxvsPJrbG4wbW8wLy0taqsppaanJyJgXKIg3t0aWlqbGdqbG1ramxlXVxcW1tcWlhaXVtbXmBgXFhYWllYV1hXVFZWVVRVVVJTTlBZXVtbXFxcXVxfYmuDiX2Kf4iIh5KMj46YmKCZmZ+mp6qnq6eppaKYpK6klZikr6mgnJmboJ+umZyqs5+mpp+jo6GVlJuWlpKpqa2bnJ+hoZuUkIyYjYyRjZKNlpWQnaGgo52co5WboaOhmKKoo6Koq6CrsKSuuKWjpKOsraqoq6+0t7K9tbOrrpiFdXRpW1lZU1VSRlhMUVtYTVVPUExRUklPSUI9Pz9BPz03NTc5OTw8OTc3Ojc5Ojs8PT47Nzs7Oj02Nzo7ODk3Njk4OTo2Oj05OTU3NzU3MTE0MS0rLzQzNDk4ODo6ODo6NzQ4PTg/OX6zraezt66oqK+um6morLe2rLzKu7a/rMzGxbjAzs/Hs8S7t7vCyLGtuL+3vL67s7amqaCWmJmXiHp0gHZ3bm1obW1tcGdnaGZkXVpbW1tbXFtZWltcXF5fX1xYWFlYV1hXVlVUU1VWVVVTU05PUVhZWVlcW1pbXV5keoR6g3eEiIOLh5GMk5aenZieqailraupsKOnmZ6soJSUo6innZiQj5qerpaYp6qYn52UpaCekpGSkZOVqKqlmpiZnp6XjoyLk4aJjYOPi5KVkaCeoaSZlp+VmqGinpSbpaWnqaigsLCmsb2nn6OstKqup6+0sLm1wLGusKuRfnJ0Y1ZUVU5RSkdWUFJSTExYTktMT1NHTktBQ0ZFQz5BNzU4ODk7OTo3Ojo3PD06O0A+Ojk7OTo/NzU5Ojk4NzY5NTg3Nzk7ODU1NzY2NjEzMjAtKi4xMDI4Nzc7OTk7ODk0ODs4QDh/tKymsbeqpaKxq52qp6mysKS2xrS5urPKxbm6wcvQyrG3uLy9wMOxsLG3rrS0u7O0o6OdnZiXlYSAdmtnbG5xbnFqb2tkZWdlXlpZWllaWlpaWlpaXFxdXFpYWFhZWVdYV1VVVFJTVVNWVFJNTk1SV1hZWFhXWltbYGl3cHZtf4V/iIKRhpCQlJiWm6aZnqmmpaudppiepZuSjp6impeXhoWSm6SPlaKclpaVh6Kam5OMjoqQmqWnnJWVl5yRk4iUjouBjI2AkIuSkpKhmqCilpSZmJWippqNmaSnqaehoLSyqLO4oZ2jtqyqrqSysqa1u7WrrLGiinpzbl5OUVFNT0ROTk5QS0ZOTkpKTk5RSE1KQUhMSUhDPjk1ODg4OTo7Njk6Njg7OTk+PDg6Pjk7Pzg3ODk6ODg2ODU3Njg4OTc0NTc3ODIwMzAxKyktLzEyODc2Ojk5OTk4NDk4OEE3d7anpLawpKekqqWgqaaks6qissO1tbKzxsW3usPKzMazrbq9tLjAr66psJ6mrruvraCam56VlYh8hG5fX2ZycHVxaW5pZWdoal9YWFhYWFlZWVpaWVtbXFxZWFhXWVlYVVZSU1JQUVRRU1VRTk1LS1NXV1ZXV1dWWl1hbGltZ3t/eoF6jICKhpGNkJufjZibo6GjmKSWoZuUjYeZmoxzjYN+jpeWhpKakJSOjXuZj52MgomAipigo56Qk5iWhY6ClH5+dIqOepCIk5CQnZuampKWkJ2Oo6OOiZqgoaSkm6K0r6ywrZ+YprimpbChsa6csbyqqa+pmYR4dGRWTVJQUE1DU05MUE1CUFFISU5TTklKSkVLTUdLSz03NDk4ODg7OzY5Ozc6PDk6Ojs3OT85PkA3OTo8ODk3NjQ0NDU4NzQzMTI0ODUvMDEwMikoLC0wMjc2NDc4OTo6NjY6ODdBN3i3oaO0qKalqKOlpaamprKnprTBuK+0sMnEuLnAzsa+s6y6waytxK2ooqaSnaa3raOgkZaXkpB+eH9mV1ZfZ2ZpZ2huY2lpZ2JcWFdYWFhZWVlZWVlaW1tbWVlZVldXV1NUUE5QTk9PUFNUUU1NSkdOU1NTVFRTVVhbXWlkZ2R1fHRtS1VujH+Tg4qalYmSkJ6YnZWUlpONlYmAlIlfO1ZvfIyUioCMkoyPhoZyi4SWgXmBe4aUnZWDlo6Qj4OGfZN4cXCGjX2JgZCOkJeamZOLkIqdiJ+Yh4iWnpqhoJenrqmtqamelq2zoqWtma2rmKi0o6mto5N/dG5gW05TUldMRFRKUE1MRk5PSUVMUU1LUEpJTlBHSko9NzU5OTk5OTo3Ojs6Pj44Oj09Nzo/OD4/NTg5Ozc5Njc1MzMzNzYwLi0vMzQ0MTEwLy8oKSsrLTM4NTQ3Nzk8Ojc5Ozg2QTl5t6CiraGmpqqgpqmno6qwqKe0wbmwtbDHwrizvc+/ua+utcKnqsSqop2Yg5ScsaOamYeUkIuHfnN2XVBMUVVZWlddXmJnY19ZV1dXWFhYWVpZWFlYWVpaWllYWFZXV1VTUk5MS0hHYlxNTlFNS0hGSE5RUUxPUlRVWFlgaWRecXlsTD89fZOPjXqFkoqDiIuajZaUiZGGhJOFeYl/YEpRbniLkoR+hIyLhH9/bX5/k3d1dniEjZpwUY2IioZ8fnmUdmd3hoh+ioiVi46Rk5eMhIqIlIWbjYKFkpuWnp2UpKKoqaWknpuwqqGkpJGmqpaiqpyhpqeKd25mXlxIUVFTTUlVTVJJTEtPSUhGSk5MTVVLUVJQR0pEPTc2ODo4Ojs7ODo7OD4/OTk+PTg7PDY7OzQ3ODs2Nzc1MzQ0Njk2LzMvLjExNTIyMS8sJykrKiw0ODMzOTg5Ojk5Ojo6Oj85d7aboqedn6Guoaeopaeor6yqtry2uLezwbu2p7nIuLaoqLW2qrK8p56Vjn+JlKmWlYt/joOCfnhxb1hNS01NTktNUVdbXFpYWlVVVlZWV1lZWFhZWFhZWVlaWFhWVldVU1BNSkVAQJtrc3NJTUtERENJTk9oWU5RU1RVWm19am12Y2NYUo6GkoVxfIR+eoOLkoGSmYuOeoWPf3V/eHNvdXB0jo6Ben6Kq4V6e2h2e45wcm14gYuNknh7gHuAd3NyknhodYWEhIV8lYqIio2LgH+Ei42AlIR8gY+YlJyWkZ+dqZ6goZ2gqaWfnZiNp6OToJ+Wnp+kgXNpYl1dSldQUkhLWFJPSk1MUkpKSkxQSExRTVJVTUZJQj03ODs5OT49Ojs8OThAPzo6Pj03PT03OTk0Nzc4NTY3NTI1MTQ3Mi8yLiwuLzIwMC8tKygoKS4xMjcyMTk4Nzo4Nzc1Ojw7N3aumaOhmJ2ftKmvqqWtq7Cxqr20sru4trq0sZ+3urKqnZ2sqaiyr6KakY2UgY6cjpF+d4Z3fHdwb2pZS0hJSEdFSEhQVFRUV1dTVFVVVVZXWFdYWFhYWFhYWVlXV1VWVVNQS0Y+OTNOPH6eTUhKREA9QURqlH5MTlFRU1Zec352cmFxiZSXjY15ZHd+dHZ9h498g5iRf3CGj3t2e29rfq18dJCLf3qGkoB8f3RmdXyGbG9oc3yKjYeAbXlxfXFtdo9xaHGBfo5wRIuFgoOFf3d3eoyGfYx7dX2Oko+Yi5Kam6OWmZ2bnZ6hnJaNi6Wajp2XjpaYkHhvbmdjW1hYVVFKU1VUT1BOUFZLTktPT0pST0lPUExGRD07Nzk7Ojo/PTk8Ojk5Pz87ODs9Nzw5OTk5MjY2ODU2NjMzNTExMjI0LiwsLS4uLTAtKyonJyouMTM2Mi84NzY5NjY1Mjc5OTV5ppegnpagprCsrquoqbGvsau8uKu7vrizrKebsKesm4+WnKWppaGYmo6EknmJj4uLdnF8bXVwam1qWEtGR0VBQENESExMTVFSUFFTVFRUVVZWV1dYV1hZWVlZWVlWVlRTUUtENzhmNzA/qGlOSEM9OzpEioV6WUpOT1FUWF1lb29ng6WpwH1xdmB5dmx5d4aPeXuLhW5ri5J4c3hpaoCCcZaRjIF9lX9JkpluZ3d+gm1qZGx5hZCShmtybHxucnyGaW1wf3ONiYWGe35/e3dwdHSGgnmBeXB8jouKk4OWl5iakJOWlpmXnZaMg4mfkouSjYaQl4Bwam9vb1lWWFRSUllPUlVUUlhVTU5ITUtNT0tDSU5HRkA6OTk7OTk6Pjw5PDs6Oj0+Ojg6PDk/ODY4NzI3NTY1NTQxNDMyLzAyNCorKiotListKigqKCcsLTEyNTAsNTU2NzQ4NUhBODk1d5mRm5ibn6Ssr6Ktqqi1r66stL+rvMO/pqKalaSYno2Ei5ShoZiZkZOLc456gIaMhnVvdGxwbWVra1lOREZDQDw+PkFGRkdLS0tNUFJSUlRUVFRWVldXWFlaWVlaV1ZUU1BMRTFAmjMganNDmW87PDk1PICChl9JTU9PUlZaUVhbXqWGYZhlb3VifG1rfXiJh3WBh4Vza5mRdHN8aWqdjkx5hZOJhI5mMXaHcmt9fYN0ZmV1f4SEhYBmaWx1a3CAfGhxcXxuk42Pe3R+fXFxb3Vtg393eXVqeYiCiImDlpKSkIuNkZSUjpeNgHmIl4iHioaAkIh4bGtwaGVYUltYWVlbTlBVVllYTklIRUpKSEdCQEdFQ0c9OTk4Ozk6OTw6OTs6OjpAPDk6PDk4Pjc4NzcxNTIzMzUzMzY0NTAzMS4qKispLCwrKykoKycpLCwyMjYsLDQ3NzU0NzhpTzg7NW2SiJqQmZakqK2esZ6nuq+rsrDCsbvDx5qWjpWZi46FeoSQmJWNkIyQh3GHgnSIjIZ6cHNxb3BkcGdfVEZJQz48Ozk6P0BBRENFR0pMT1FRUVFSU1RVVlZYWlpZWFZVVFNQS0U4MC9cYLNHOVhQOzk0NDGWuotITE1PT1FVTEJJUUlirrKebnd0aXpqb4B/g4B5g4WFeXKglHR4gHN0lIc1cJ2onY+hoYSihXZwhnuGfHSMro2JgWhnYmpucm1wg3Vpb1h1cI6bkXZtf3t9bnJucIB7c3ZuYnWDf4aAhZCQioqJkYuRi4uOg3V4io6AfoOAfY58c3JxbWBcXV5cWllhX1JOW1pYV0xISkZJRz9DQUJIP0NEPTs6Nz07Ojs7OTo5OTs6Pzw4OD06ODs2NjY1MTExMTI1MzQ3NDUzMS4vLCwrKSopKSoqKikoKikrLzNETTIxNjY2NDM8dlI3PTdikYGSiJWRnaSnnq+VpbSprrCuwbK7wcWWj4yUj4CIfG6BkJKJg4qHj4Z1goRslYiIe3V4eGx3bndkal5JUEc9Pzc0NDg7Ojs9PkBCRUhMTExMTlBRU1RVVldYWlhWVVRTUExFPDUqnUtbQC1nSTk0Lz+Sg6muX0dMTU5QTDhETlJTREqEc3x5eXN7anSFhnp8g4J+i311oZl5foWAhJmEmpxhhqqfnYqDkI56d4h+iYiOc4uXj4R7XWRxdHp8d4ptaGpieW+FkIJ6b4F4dYV6cHR6eGtuaV12hn2HfIeGjn+KkpeDjYWMhn1xhH+EfXZ3e3yJeHF0dWdoYFtcXlNcZ15XUVRYW1VHSkpES0c/RkBEQz5BQT07OTc8Ozs9PDo6OTk7Oz0+Nzk+OTk4NTY1MzI0NDAwNDY0NTU1NC0sKSsoJycnJigoKSkoKCsrKy8wMFVxPTIzMzMxRX5XND05XIx4in+TjJGcnZ6mkaCqoLGor8Cyu8S6lo6Rk4d6hnZrf4uRg32Kg46MeIOAc6GEin19gX9wgX56aHdrUlhMQEUyMTEzNzY2ODg6PD5BRUZGR0pLTU9RUlNUVVdWVlZUU1BNRkA6Mj0gI5ZjjFs1MzExaT9Hb0lGSUxNT1FMS1RcWFJLZ4GFeIZ3eW96jYl4e4eFfpaHdqCZh4aOkpSljaypSIausK6LgYCUi4KLgoSSqYeAmJiKnHRtfIGGh36OaGdoeX9uhYeChXGEhkhsgHdyeXZobWtfdn2DiH+HhYt5lJybiYuIkX96dYp2fHhtb3d+gXV1c21cXl5cY2RYZ2ZcVVBQV1lQRExLRk9JQ0ZDQ0FAQ0E9OTc4Ojo6Ozs6ODg4Ojo/PjY7Pjc1ODU3NzMzNDQyMzY2NTY3Nzg7REZMTU1MQzcrIiUnKykrKywvMDArbnUyMjQyMEyBXDU9PF6EdHx9iYWHkI6Vl5KWoJ2soKa4r7O9s5eNkouYi310cH6Jkn59jIOSlH2Gfoakh4iAgoiFeIeJfnOEeF9jV0tCNjAuLzIzMTIzNjY4Oj0+P0JFR0hKTU5RU1RVVFRWVVNRT0dDPzgwLCOHWz8/OTQuXZZwc6NVRklLTU1QV2BYb1lbXWeJj4ORfoF/g4+PfISHj4CZlIGfoJeUm5qmrZOZu7Gnu8fDqIuMoaWOk4mBkXxxg56fkZ1/d4WFi5CHkGlocISBdIyHhIpyhoJ3iIB7doR8bXV1Zn+UjoaIiIeIh6CqopaJjpd/eoGIeXlvZ2t4fnyAdWxlXltbXmpeYmdgWk9MTlhSUUlQSkROR0NKRENBRERCPDo4Nz08Ojw6ODg3Nzg6PT04PD02ODY1NjYyMzQ0NDU3Njg2NzxCQj88ODo+Q1FeZVxHMicmLCwtLS4xKD+LWy4zMTBPg180PztudXBmd4J6f4x/gZCOipqbpJ2hrKaqrrCXkZGEoZSEeHd/jJR8fpKGkpV/ioCSm46EgIGMioKJjYN/in9scGpdQkA0LS0vLy4uMDIyMzQ3Nzg7PT9CREhJTlFSVFJTU1RSUE9IREI8ODcvOUM+PDw2My5sk5dNUEhKTExLTlZfYn5mZmtymJaLl5CQiIuMl4aRjpyKn5+Roqmko6uTqbaiqMHCrceveLqUmnyNoZ6ZhJOFgo6hn5SZkYWKhY+ZkZZscHWKjIKVjI2Od4+EcW2FgYqWkYKFiHGIoJaGkYmNj5aktKibjJSig4eSg31/a2pqfIKDg3VjX2VgW2hsXmxsXldLSE5SUU1MTEZJUENETkZCQ0VGQz06OTY9PDo7Ojk4Nzc2Nzs6Nj06Nzg1NDU2MzQ0NTY2NjY4NTU2MzEwLiosLCkoKS46UGFcQCwoLSsrMCwncog3MjQwT4RiM0A8dW5nWW+Cb3WGcXaShn6XlpqUnp6cp6CplpOYnmdlpJp+hJKReX+SiJGSfYqEmJKQg4CAi4yJhpCHhImFeHh+Z01SPi8uLiwvLi0vMDAwMjEyNDY3Oz9DRU5PUlRQUFFTUU5QSUVEPjs8OkRGPz48ODUyPD9SNUhISExMTU5SXm2Je3J/e5uZl6Sin5eelKCTm52nnaeqnqerqaq1l6u/q7bHyLfI0M++m6Bwaaupn4STkoWcoJqbmaaSkYiVopubeHp+lJiTopKXl4GUnnt3lZKqsoiMl598lJ2bjZGVmKOhpbWvnJCYp4eWj42AiGxzc32BfnNqYV5iYGJoZGBoZ1xSRUpLUE9JSUxGRk1DSExGRkNCR0RBOjg1PDw4OTk5NzU2NTg+NzU9ODQ3NDU3NTQ1MzY5NTg6NjE2ODYzLzAuLSosLy4tJyMqO1hiQigqLDEtKEuXXjA2M1GFZjJBQGlhXlBwdGBtfWF3jn17lI6Oip+Sl56Wm6qYnqpCRH2HiYeYjXiCjYqOjHyKho+QjoGCgImLioWShYOGiYGAh3deYlA0NjAtMS8sLjAvLi8uLjAwMTU+QUFNUVJTUVJTVVJOU0xFRUA8Pj1GR0BBQDg2NjI8OTtGSEdJSk5PUVlshI52koieoqaxu7airKqrpqezqq+1sbGturGzvZuyw6u6ycu3w7+4paKws6ytqqOLlpiEpaago5eBppmNoquopYiFlKShoKuhpKiPnLGLlaOmt7qboKKvkqOdop2Po6GrrquytKGUpKmImYiSiZV5en6GgWliaV1mY19lZF5nZ19bT0NJSFNORkhMRkpHRkZIQUtGQ0ZGQTs4Nz08ODg6OTc0NjU4PDU0PDc2OjQ0NjQ0NzM5PDM4PDIwMjU1MS8xLi0qKi8sLSooKiYlNVhYLywwLCwwhIE4NzFQhWg1QUNbWFRMaGJXaW5YeoR2gZOFiIKbg5KRjJLayJ2Wc1aXiI+InI98hoyOiop6h4KHkY6DhIGLhYaIkoaChYmHiIeHcW5hQEU2NDwyLzExMC0sKy0wLi00P0NBTVVQUlNVVVZVTltQR0dEPD4+RkhDRUE4Ozw1Qzs9RktJR0hRT1FXgJGeg6uhr6euvsXBqLHEtauyv7K3vbW+tMG2u7qjuMWotcjHtb25tKijtK2wsZuZkpqfiKevq6WUdp+kl6GssrSZlqquqK62u7K6rLC1orGssbW7trSutKCnqKOnmqmvrLG4t7immrWojKSOkJKfhniChXhbY2VXZ2NiZGFhZ2BbVEpERExVUUhJSkRJR0VBQEBLREJNRzw5Njc7PDk3Ojk4NjU1NTcxMTw4ODk1NDY2NDk3Pj0zODkxLjAxMjExMzAsKiwuLCsrKyooJyopRVowMCovK2iSTzYwUodqNkFGV1FKTFtZUWJiV3l1cIGUfYSGk3WFf4CMe7+7o7yCtJSTjZuPhIiPkomIeYaAjJOMh4SBjn+BiY+Gf4aIhoqHkHp4bl1WQEVOPDY6NDVBQjc2NC8vNkNIQlFbT1FVV1VcV1BfVUlLSkE/PkdLRkZEOz5AN0Q3P0JKSkVGVlRQXo6jrKKwsb+ytb7Kx7W6xL2ys8C2t8G0vrC3dLGzprrEpLDGubCysbSopLW2qrGgopebopKlsK6mraunpJigrLS7oqiyurW8v8y/xcW9vbPBt7q3vra6t7msrLGlsKmtvbC8usHBq5i5p5StjpeXqYh+g35tWGRiWWxma2ZYXGNZVlNJR0ZMUUdDSElBSEQ+P0JCTEBATUQ5OTY2OTo/Njo5OTY2MjQ2LzE5NTk5MzY0NjI3Oz0/NjoxLi81ODo5NjUwKigsLS0tLCwqKCgrKyhFUy8qMDBKj2s1MlCHbTY/RlJMQUxRVlNZVVp2am9+joOAjoRuenN4h2K5oZmjiZSUlpKUk42PlpGHhnuGgY2VioCEgYp6fIqHhnyKgoGLg5V9d3p1ZVBcZEdFTDtRY2FbXlNGPztIUEVaY1FSWFhaZ1lUYF9MU1BFQT9JSkhFRUFARDxFNkI+SEdKTFNZVF2SrbazubbHvLi7ycy6u8C7t7W7ura9s7mxxWB1sqSxmp6qvamlqKuqpKKytaCrqJ+Vlp+ZoK6lp6aln6OTo6extKiys722wb7TycnTxsPFzMLKw8C9vL67vLe0r7i3tsO5xb3Cx6+euKmhq42kp7WIgYF0YWNjX1ljYGpnU1hgVlJVSUVFTktAPkdEPUtBPUJAPUY+O0hANzk2Mzc5PjQ4OTo1NzA0NS8yNjM4OTM3NDQyNj84QD5HS1JUU1FQT1FRUEpBOS8sLCwqKygoLC0sL1A+KC40OIB9PDJLiHE5PkNLRUFJTVBSS1FdZ2xrcI+NhY9zbHJyc4fVwLWZoI2VmJmRjpeRlpaOhod9hoOMlop+g3+CeHuLg4d7i3mBioKXfnR9emtmcHVZXlxQZWRiYGVkXVtYV1xNZG1VUm1tX25fWGdkVFlVSkRCS0tJRkhISEhCSTpEP0hLU1RVXFpbkre+t7y1xL65uMnKura5tbe5sre0s661tphkdaecrXBeoqycmKCim6SeqqWUn5+Qk46WmZion6agnpqZg6SerKWqsK24sL251NHP19DKzNLMz87Kxr++wsq9wbzBwMTExcq+x82yo7qwtK6aq7i7mIB8bV9iXlpfY1pkY1FbYFNQS0NBRUZFPEBFPkFIQkBDPTpFPj1KPzQ3NTM1Oz00Njg5NzcwMjIvMjQxNjk3NzU1NTVEM0VMTT41MS8wMDY6NDc3QElPSTstJioqKC0uLyxATSsvNTRtiUkwSIl0Pz5CREBDREZLT0RRW1loX2+WkpCUbmxvdHWHtKyhoZ+LmZyZjI2VkZqRhYqKfoiGjJCLiHyBg3N7ioOFe4l0goqGlX9ze3lsbXV7aHJlaWxpZ2pqaWBmaWlsWm1zlq2kvIiGZ1tvZ11aWlRIS05QSktQS1NRSUxBSkZKT19eYWZpYZa1xbC4srq7s7DExrWvuLCwu6uysaaqt6uMtaedmqeaTpmdjI6flpGmmKWVipOTiZCJj5GRnZuhl5qVloeemqebrK+osKi0tNTU1NbTzNDT1c3Sz8zEwsnQvsnJysnRx8zNws/Rt6/DvMO5pLW5waKEcWVeX19aYllaZ1pRXVhPUEJCSEVCSDtBQz5BRz8/QTc7RD5ASD00NjY1NTs6Njg3NjU0LzEwMTQ2Mjc4ODc1MzY3QzVCOD8tMC0xMzQ5PTk3LC4sMTtGSz0pLCguMDAwN0s/LTQ2VIhXMESHd0M7Qj5FQkFDSk0/VVlSZVZzkJCYgmdxb3l5g6GqnqaXjJqbl4uNlZGajn2Ji4SNioqKkId8hIJwf4eBhnuHcoOSi459cXh1bHF4fnF6bXhzbWmBcG1jaW1weGl3fH7Lv8Hfp21jeG5jW2JgSlBSVU5ZXk9dXE5QTlRQVFRcbm12gnGWrLers6avtamru7+wqrSlpLimq66gq7SjjrCtmpeYjJCTkYSOm4GNppGciYOLhIqJhIuElJWYl5SbkZyXmZqfn6uspaiirK3P0tXSzszT1NTP1NHOx8PU0cfN0tPT18zR0cTS1sXBzsfHwqi9t86efHFoYGVfWGJTX1tQUVRRT0g+QEZBQkU8QEE+RUQ+Pz86PT08PEpBNDU0NjU8ODg4NjY0NDEyLzAzNTI2NzY4NTMzOz08RT1AMTErLzI0OT41OTAxMDIyLTJETjMpLzMuMzI9TjIzOEN9XzJBhnREOj09ST5AQ0ZIPFVRTU5adYaFindsd3B9fn+hnp6hjIyYk5OLjJKPlYV5hY+QjYqKiJCGfoJ7cn6AgId6hHWFk5CIf292cmtzfXt3e3OCeHJrgHNyaW9xenlxer7Lmn6MsoR2coR2aGFrXUNaWltWZWNYZGpTWFxdYGNdY3d6fYuBmKmkpKGfoKelqq+4qqWyoaGtoaOtoaexn4immpOSkYmRjoiBk4lqlKKMmYSBhn6Rg4OTl62LlY2VmY6GkpGel6iwoqGhpaSpyc3PyMLM0dTS1NLO083G1tLM1NjW1tjU19XJ1NrNydfX0cqsw8LLjXVxZWJhWlZaVVxRS0dKSkpAOzo7REFEPEJDPkdCPkJCOzw5PDpHQjQ2NTQ0PDU2ODc1NDMyNTAvMjU0Njc0NTU0NDw+PUU/QTYyLy0xNjs9MDgxLzI1NC8tLTtSMDE3LzUzMkZEMjg+bmI1PYF0TTk5QEk8QUQ/QTtPTEZKWHCAdX1oc3hygomAnZWdlIWLlYmOiYiNho5/eIOTmIqMh4eLiH6Cd3N7fYKHd396hpGVf4Nud3BtdX91eH10hXx5bId2dG59doR0eHudtYw7QYvFpX6MfGllV0lDZmNlY2dqY213W15maGtuaG6AgoeRi5ydoJ2Ql5ieo6OlsaOjsZ6hpZ2gqKCjsZyFnpKRkY+LjYuGg4+Ef5ybjI2ChIV5lH+CqZWjjJGJl5KLfpiLmpKrs5ibnKicp77Dxrm2xs7S0dLQzNLLyNTO0NXa19fY1NnYzdjbzsnZ2tHVvsrLtXp5cGdfXFRXUl1XRkdKSUVFPTo3OkBAQjpGRD9EQ0FEQjs/Ozs3REM3NTY1NTswNjc5NDQzMzQxMDE0NTU4NzQ0NDQ5QD5EQkM8MzMuNkZUV09RSkFKRj8xKiguQlMzOTI1NC83Szc1PGBiQTxzdlY4N0FIOj9DPjw5UUVDSlRrbm5wYnBxdIaNfJeRnYt+h5KDiYaEiYGHfHiFlpaIjoKHhYd6hHhxenuDhXV5hY6NnHmLcHxvb3p/cXuAcYOHgG6OenV3fXyCdH58hoevc1ipwraNkYJwbWI9XmhycHFwbnh2gWVob3J1eHF6i4aNk5GalZ+Vh4yTmqCanqmfoKyboZqYn6Wen6uZi5qLkJKNhX2Ih4OFi46gmZOIg4d+bJl6hJiGiJOMjZSMhnyciZSQrqqUlpifmaevtr2prb7HzMnJzMvQycPSytTX2dfY19Xb19PZ29XQ2trR1sjUy5Z7fWtqXVxRVFVgSUNGSUg+QT49Nzo9Pzs9Rz0/QUFBREE+Pjo4N0RCNzU1NDc5LjU2NjQzNTU0MjMyMzY0NzU1MzQ1OEVCRENFQjU2PEZOU01bbmZjbnNrYVY+LDRMRzg2NTQzNEJGND1XX2hMdXheODs/Rjw8Qjw5OUQ+Q0dSal5tZGJma3aAiHGRkJqAeoCNfoKCgYN+g3t8hJiNh4t+hYaAd4J5bnt7hoF0eZKejqB2jnWCc3WBfXOAhG+BkIJvkoR1fIGFenaGe4m3xaTBybiBlpuPd3BlTmZjgXqBd4aikIp4eXZ7g397hHZtk5aUlI6XkYOJj5aalpalnJeflp6SkZeinZmrlZCQioyRgoyFiIiBhpCRnpuZiIaMgYWXeoiJn5eQiI2Ki4J9oYmRjLyhmJOYmZ2ppqaun6i2v8DBucfKzs7FzcnR1tXV2dXX29TW2drb19va2djO28aIfXtpa2dhVVlWV05MRU5DOz09PDg6Oz05PUA2PT9APD89PDk4NjdDQTY0NTU9ODA2NjU1NDc3NDU2MTM4NTQ1NjQ1NTdISD1ESkU3OTI1O0g+Ozo6N0lQXVpSVVhLOVQ+Ozk1MzI3STg9TllNSHh4ZDU9PkM9PUA6Njo+PkBFUV9YZWFdW2h0enlsio2Sd3Z6int+gH5/fIR6fYKRiYSFeoSHe3V9dG18fYZ+dH+SnpGeg5F7hn54j354iopugpqAdJmGfoGJhHt+kHqPqY6Pw6G9i5yknX2JhH2JcouKfnOmmpyYk4V7jpCIhGhHcaCknYyLkJKFiIqQk5SOnJmSlJCWjYyVn5yUoJSRjY2Pi36Qjo6KhImSlpqen4mMlJKdkYKLgKWZiISNgoWEgaWGioy4mJ2RlZaiqKGenp2kr7e6tazAxsrQyMfMz9PT0tjT1dfA19jZ29ja2tnZ19u5e3t6bmtoWWJdVFBPSURMQjw8Pjk5Ojo5OTs9Nj8+Pjw9OTo7OzM3RD83Mzc4PjcwNjg4MzU3PDM3ODA0OTc2NzU1NTQ2RlA1RE5JODkzOEFLPTszQ0BJPDlEV048TVRITj85NjMzMz5DO1tYPjVZeXBaPDxBPD0+ODY4OT89Q1FTUlheVVhmbW1taYGOinFyeYp7en98f3uHenx7i4aCfXSDhXlzenNtgH6EfneFm6KbnZSSf4yIf5iHgJuSboiohXqgi3yRjYOIhJx9mpCKjKOioJCkr5+LkIuFi4GThldyrYufq5uPg5ibj4+OXIKikYKMn5OVjIeIjJKSi5SUk46Lj4qHlpqcj5SWkIqRk4aAi4iSjYqKnJaYoqKGk52WoIqJiI2bkIOIjoCDh4akhYyRs5idkpSXoaGempKcnqiyuK2mvcLHzcjGz83QzM/X0dHVrtbV2NrY2trX1dnZoHJ/d2poX15ZVVlZQ0FJQz8+Pjo0OTo7Nzo7OjM7Oz89Pjc7OTowOkc9OjM3PUA1MDY3NzI1NT82NTs1NTg1ODo1NzczNUhSN0dPSzk5ND1FSkI+MUZDTEI5ODpHWEA1SFdJNjYyMjM6RUNlWD8mX3lpX3o+Pjk8Ozk4OjtAO0JRS0tTWVBUY2J6bWF+koNvbXeLeHl/eoF8hXt7doWEf3NwhYJ6dXd2dISChH5/kqakn6Wil4qdkJSXi4qol3OKsY2Ep5KEmZOFmYyilZ+Yk4ianqOSqbCfkJSQjY6IloxujbeFmsTIspuhpZucmJaQspFkpM3Ilo+Gh4iQko2NkpOJhYqJhZaZmo+PlJOGlJeDf4+LmYiNkKqWl6OjiJmelpqIjoaWl4mEjoyBf4ePpIiOk6ial5OXmaGZn5mTnZujs7Smo7zBvsfFxcnIycLL083N1KnS0dbW1tja1NLazoR1gmtmYGBfUEtWXEJCR0M7QT04Mzc7PDo4PTY0OTo8OjgyPzk5MjlJOj42N0JDMzI6OTYyNjQ+PTQ7PjY5NDk7NTc5NDRKUTxKUUs5QTdCR0lANjRKRUxGPjw4OEVUQTc+XDg2MjE0OjtFYFhBRmF0aExjWj41Ozo6NTs6PTpFTUZIUldTUkJlg0d1go58fG1+iHh6fnqBgYJ+dnaAgntsbot+eXx3eHyEhop+i6O0qKSqs6GWp6ClpJaVr6KDkLiVkrOajaGgjKSbr6KknZiQp5epma2wpJeUlZSQi5ialqDAjqPJuKuaoqWtmZGbnLKdhoWoopyYhYiIjpSMipOPh4CGh4iTmJSMipOThpSYhoSRkJx0kJiylZakoYicmZOPipCKlpqJipaNhn2MmJ+KkJCcmpmTmZiglKGdlZ+bobGto6S3vrPFx8S9w8O/xs7KydKnzszT0dDW2NLP2Lx1fHhfYldiWFJJS09FQkNENT47NzY6Pzs8Nz00MjY2OTc3ND01OzU8TDw+OzxCQTc1PDs0Mjc3P0A2Pz83ODQ5ODc7PDU1T01EUFJMOEA9RUFHQTU6SUVORUQ6NkFAQlM+OURPMzIzNTc1PXZcPFJcdGlaTV1TPD04OTU2Nz06SkZER01cXFlKaGE7SISLenpthYZ5fIR4gIWBfXB4fH18b3ONen2Be3iGi4mGhJKovK2psr2wpa6zs6mjorCtipq1naK4pZWtpJeprbempKOfmamYqqSvsaqamZyUlZGYoJeau7utyqFptreqsJWYnqKrkpe9pF6qsoKJioyUh5B8jo59g4aOkJSUiIeSlouPlY2LjJeZkpyZtJaVq56LnJSSjZCSi5iaipKdj4uJlqCijZWNl5mdk5yYnpShoJScnaauqKKks7irwsjEtrq9vMXIyMLQocbJzc3E19bQytOjc31rX1tVYVNRR0Q+PENBQjg/ODc0PkY8PDY8MzUzNTU0NTRCMzk6Qk06QTtBSEI7OkA8NzQ2PEI5P0BCODc0Ojo2Pjw0N1RLQ1VRSjc8OklBRUA0QUpITkJBPzZEQTxKTkQvVD0yNTQ6RUpcWEpaUW1ncHBEaWBLSTY3NTc6PkpAQ0lQZkhhYGJwSkCLiX+AcoaHfIGJdYKKg35tfXx8fnB3h3eNgYd7jZCMhoyaq8LAsL3GvLO0wby0rKuztoyosq2tvaubu6Oorbm4q6amoqKko6qvsrGqnZykmJuYmJ6ipqWTo7mvqL+8rK2yuaWjp32IhpytvbCCi4uKkIOPg5GOeoGHkI2OnIiIj5eNipSXlJCalpynmrCakaudjpqPko6WkY+Vl46RoJCIlJukrJSWj5ScnpShnpuYoKCVmp6np6SipLCzpsDGw7Cwu7bFxcO/zafHw8fDvNXQzMTKinZ2ZF9cYl1PTENMQEVHPkE/Qjw6ND5BPT01PTY+MzMzMjQxQTE3QEJOPkdAQ05DQT1DPTs4NkNCNUJJQjo4Nzg7NUI+NzlWS0RXT0Y4PTRLQEM+NEVKSE4+QUE2QkI/QlNFNThQMTQ1Ozw4O0Q+OUxqal07V1JkS2daVU83OUdFP0NGXGhGX2lnW11ck4yMiHuHi4aDjHWGkIqBbn57gX5xfoF6lHqSlJSYkZOVqLTHycDCzMLDuce8uq+rubuXsra6ssCvpcCjq7C8vKquq6Oinqesr7WxqZugqpyinJafsLSnjKO6urXBu6uonLKkpKiUhI6pxMSkgouOhoiEhpWUjHqDjJGPkaGMjJSRj4iXoJiTmZSWpaCunIyqnI6Wj5KRlZWNkJSRj6GThpefoLKflJuUoKGZpKCaoJuglJiep6Smp6SvraW/w8KuqLe1ycO+ts6yxL7Du7PRycfBtXd7b15bXmxUTklETUtLSkBBPUJEPDVBRDs6Mz04QjMzMjI2M0EwNUlFTT5JQEhSQEg+Q0A7Pj1GQTVBVUA7OTk4PDdFPjg+VkpDV09HOD80TEBCOzVKS0NMP0I/PEJGPUFITDkrRzwzNjc0NjRBPzdPYU9hRS89PjZrbGpgQDpIPj9FQmdcTWVcZlRjapqNloqLiJKPhol5hpOQgXKAe4x/d4eCgo95jaGWqJqamLu+ycjKwtLJysLNvcGzrby/p7q/vbzEuK3BqayzvL2qsKqkpaOsrrSutrWgn66fpqKZo7S9qZyovMGjtravq5OwrKqsloaaqqelkYKMkqSViYB1iZF5hY2RkJ6fko+Ui4+MlKOZl5uUk6KeqZ+RpZqMj4+QlZaIfI6VkpKjmpWgopy1ppCgl6Wko6WfnqaYnpWXnKWjqKiisqyou8DEr6Wzt8zAuq7Ds7u9wbmtwsLCv5lwe2NbWV5dTU1OS0dEQ0hCQUFESzo0REg6OzQ8N0YuMTIzNTJCMjZTSE48SkJKUUVLQ0RFOkVMQjw3RVY9Oz04OT88ST86RVVJQVdRRjdBOks6Qjc5Sk1CSUBDPjxERzxCQ089MjBIMzY2MTcwPUI6PWpqSks1UVMzU3BwZE47RD1ARj5sSV9YYVpkZViej52Ol46ekomKf4ifkoR4hX+Ufn+QiImQgJahmq6no5jDvsnEyMbTzc7Ny7zCt7C6vbS9y7vDwba3vK20wLm8rq+ooamotq6uqbK3mp6soqiinau3t6qlr77Esb25s6eqtLOtrZaVpa2ooJGOkrHFp5WNfZGVfYeRmI+qmZeTk46TlZOlnZOdmZOgoqGcmJ+Yi4yPkJ6IWpCWl5KWpJlmmaOes6WWopasraynnJ+nl5iWmJaho6imn7Wrqbq7w7SmtLXLwbiqtqyzu7iuqLi6vLeEb3BcWlZXUEdMVE5LP0FIRERIRkY4NUZNOz43PkFLLjMyMDI1QjU1UFdOPExGS1JMT0dHST5JUT86OElTOzs/Nzk+RExCQEhTS0BXUEY6QT9HNkE3O0hNQ0U7Qz00RkU6QkFCRzkvOkEzNjAzPkdEOTQ9dGRNRztFKzpmfGhWPD5AQkZCc0ZpSVJmZE1GppSclqGXqJaMkIOHpZKIgYeCm4ODlZCQlI6aop+vvq6hx77GxcjHzs7P0sq+u7axu7u8v8+1xL23ubezsrazuLOsp5yrq7mrqaivr5ejrqWopKW1wbCrrbS+wrnAubOnuLS3sq+VpK2wr6WLk5SgjXPBmX2XmYSOlpmLsZWamZWSkpmZpaOVn5uWmqicm6GgmYqMj5adYEqWnJqVmaWXVJawn6+cn6WVr6+tppuhppSTmZmOnZ+moZm0qaqzvLy7q7Cyx8C4pqyrrbGxo6GysrSlc3FnXlxQU01GUVFQUTtIS0hGR0FDPTlLVD9BOj1FTS83NTM0OkIzNE5XTjxKS09VTlFKUEhISk9CPD5NUjs+PTg6PENSPkRIUklCV05JQENBRjM+NThKS0NBPUM7NUVBOkE/PkhANSpCNTIsPmNdZzozNXRkZUBSNyYjM31oWDw6QkNAPVJFV1N0YlZGSKuXmZ+hqK6YkJeHiqeWjYiShZ+HhJyXjp6gmqOktcm0qce8w8TJy8nIzM7Gvrqzr7q4wMHNtci6wbm1urKvr7O0p6ScqrS1q6qnrayZpK6mpamsusCoq7e3vsHAvreyssOwt72so661rbqmiJuXpZp1vp+EmJ2Okpiai66WoZybl5San6CpnqegmZqqmaGnnpeQjZGdg211k6KalZyin5CtsqKrlamqmKqvpqWhpaqTkpmciZWcop6WsKepqrq3vrOyrr65tqCjp6ilppycrampjWZoY2BTTU1HSU9KVUw9TUVNSUpAQ0Q8UVU8QUFCRE8xOD03Nz9CNzVVWE4/SE5RWFJQUVRKUUpKRUFFTVE/Pz04PTtHUjxFRFFCR1lNS0FIREU6OjM5S0lCPkNDOjlDPjxAPjs7RzctMj4tMYJoTnpcLzBraGA8PUJCODZ6Zlc8Oj0uLlNhTVZIfmVeSEaslJyhn7uumJSei5Oqm5GRk4iqjIahnoyjrJSjpLbHvbTCu8PCyMnFws7Iwr25sq+5tcDDyrbGscG8tbusqa2ssKOjmaq0u6aqp6yqnaivqKSrq768qK28tLe+xry2tbjAsL2/s6m1t6y/pY+il5Chn7yeiZqgmZednY+3n6mcpaOanKGap6SzoZudpZynqZ2YlI+Um4uWiYykopSco5+gtbClppOxq5qrrZ+fpaSqkpaVoISQnp+clqmkoaG0tbq2rai1srKenKKmmpeVmauhnnhjX2FfTElGSE5RSU5FRkdCUUpIQERHQVZTREg8QUdRMTtCNzpCRjc5XVlLQUxQVFVTTVdSTlVKREBKSk5POUM/NT08TlFDPz9QP0VaTUpBS0RHQDUzPUlHPz1FQTk3QTs8QDw8M0A8Lyc7KkiRQjpTSjAsW29XNzE8Kh1CgGRUNDktMTpoXUZEQ5xwYkdFqJeknp/DrJuXpJeZqJuVmpqOqpaVqKaVrayZoqu3xcK8v7fBwsDIxL/Nxru+ubKwubS+w8i1v7C8trq3p6Srq62hoZurqsSipaispp6rr6yiqqi+uKatvrC3t8a3tLi4vrG+wLa0srWvvqOWo5WTmpOtn5ChoaSio56QvqSpnamsnZ2hm6afvaKYo56iqaugnZWNlZ6TnoeOhI2TnqSgnbasppyWsqaZsKignKufoY2alZ+EjqGanJKlpJqYq7G1saqlqq2sm5igoZKOkJapn5RpZVxiXlBKSEtPTEhFRElAPU9IQDtGSUhbUk9LPUhOVTRCRjg+SEc1Q2JbS0NOUlVXVlFYVFJVSEA4UVFQTTpHQDRDSFFTSUM7Qz5HVktDQE8+SzwwNjtHRj47RkE1Nj85Oj85OzE1RDAtLTBNdlw0S1o1LE1uVzwtPSkeI3piUTVDS1E5b1JGPEt4ZmNYTqObo5uexaugnqudnK2fkaKelqSfpqqrl7axo6mztsXCvcC2wMK8ycK/ysi2uLW0sbS0t8LGt76xuLS6tqCnrKqrnp6fpaTBpaGqraCkqa2woqeovbWlsbu3trXDsrK3ur6yw8C4uK20tLWjnaSUkZOgrJ+YoZ2oqKqimsKsqJ2srZubnpimoL2hnaSYq6uspqGZjZqfkp6Ijlh/lp+moaC5qqeUmLajnrOioZyxmKCPmpWego+gl5aOoqOVkKWus6upoqKlpJWVnJmLj5KTpJ+JY2dcZWFNSktLT0ZFQUdLPj1JQTk5SkpOXVFRST1MVlw4Rkk9RE1JOEhjXEtDTFBTWVlWV09aXklBPVdRSUs/SEA1SE1YU0hBOkBBRFBIPz5RPks3MDk5RkU7OEc/LjY+Nzg+NzcvMT85MSUxUVVtW0pPMTA9Z1dEMTc9LSt3YVM2U1prV3NIRTY9dWVcTFCfoKCYnsOnpKKzoJyyp5Kqo5+jnq2prJ27samstbHIw8HDs8LDvsfEvcTKvbCxtq6xtbDAxbW6sbC6tq2aqbCpqZuepqGnwq2crbGcqqKusaqkqL23pra7va+3w62zs8K/ssazurertLatqqKmlZWUoquhn5+Zp6uvr6+7sqWfqamZmZeToqS4oKGjkq6vq6SlnpGhnpSdjpCNlJ2ao5+otaenjZi0nKOvm6CcsJGhlJiVm4CSopaPjqCgk4umrLClp6KdoJ6SkpqUhYuSjZyfgGRoXWhmS0pMS1NBQ0BJRzs7Rj44OU5NVV9SU0o+T15dPUhQQk1MSThOZF1MRUxSVFlbU1VPXGJIQT9aUUFIQUtCN0ZFTEtOPjtCSEROQj07TkBBMy85N0NCOTdGOys2PDQ2PDM1LS80QDErJ1Z0U2VPPzEwNGJbTTIzPjA8d11eP1tVX2dyQDg8SJZ3ZUE0n6Sfm6DCp6OpsaCjtKmVsaumoqSyrK2pu7KtsLW0xr/ExLa/xL7KxbbAycK1rLWpsLmswMS0t6+ttrqlmauyrKqYoaeYrbu0nKiwm62frrWyp6q7s6e5s7iyuMCqt7LDvbTFp76urbe1qaesoZaWkaWkoaGXl6Sut62xtLafn6mkmZOUk6Ogt6OkpZWusbGlqaWhnpuZmpWXqKCfmaKfr7OjpoyXr5qlq5ebn6eTnY+VmZqGlqCVjJCdnpSLqamqoqehmp6WjI+ZkIGGlYiVn3plal1sa05RTk5UPUNBTkM7Okk/NzdRTl1fUlZRQVdgXEJKU0hWS0g6VGRdTkZPTltXW1JQUVhdR0FCW1BCRz5OQzlIR0hOUD8/Q0lCTEI8MklBOTQxNzdCPjs3RTcrNjkxNDgwMi0vLjw2LSNCcWdzazIzLzFcY1ozMzkwNnBbYkgwNUpxaVZDV0aMeWZDO6SknKGlv6aorq6gqbWqnbevq6OqtLaxsLi3sLe4t8S9w8e9vMPCx8G6wcbBuqq2pa27rcHDt7eqrbK8o5Wtsa2yl6aokaq5qqGnsJ2roK+0s6qqt7Wsu6yzsrm3rLiwwbq9v6bDqrC2rqmrq6admJiqoaGgkZegsK+zq7C5mZupn5mWkpemoLeppaKir7Gzq7Gnq6CcoJ+bnqWdoZidpLSwnJ+Qk6aaoamblqOhmJqLlpmUlpedlImSm5mUjqmpp6CjnJmbk4ePmYt+jJeGj5tsaW1ibm5YUVFaVEFDRFVAOztIQDc6WFBkXlBXV0RZXl5OTFNOX0xKPlpkXk5JUU5bVVlQS1NXWkk/RFhQREY+Tj89SUdHUVBCPUNGQk0/OjJEPzc3NTQ3Pz05NUU0Kzc1LzI1MS4tLiwxPionKz1ccD0+MS4xZVtkQDE3NDdnWWFGKEA4bH1oXFY6iXtjQz2on5yhqbygqq+qo7G3qaW0squhrbW9r7O4vLu9t7bAwr/JxLnEw8DAucW9wbivtqirt7K8v7+0qq6yuJ+XrK2orpioqY6nu5+lrbOeq6KxsLOsqraztbytsLG1rLC1ssC6xbarvK+xt6ytqqOxpZ6kqJ6jlo+Yn7Kqs6mqs5mdp5ualI2gpqS0rqehrKytsaezq7Gpo5ueqKSelaGZnKi2qZiakpGemZ6hn5KtoJqah5eZjJ2anZSLj5eXmpenpqOgnpeWlpSBkJWFe4+Tg4yXZ21yaHFzYEdZZlZEQ01YRFo5SEI1Pl1RaFxOWl1HW15dT01TWGRKS0NcY2BQTE1OWFdYUEpWVldMPUVVSkVEQU0/QUZISFFQQTtGREZLPTg3Qj02ODcxOT48NjVEMCs4MC8wNS8qLC8tKj0sKyUyKyo1SzEuJ19fYVYxNTE9YFZfOClDM1lVXGdLNYx6ZkxApZmfpKu2o6uopa6ttamus7imp7C3xrawt7/Bwra0usW+zMW5w8G6wLrEuMG6s7Wsqrq4u7q+tauvsbeZmKirq6ycrquPq76eq6+xo6qfsa2zrq62sbi2qq2usae1sLO6vMmyqrW1sbSwrqags6CaqKygpJWVmpmxoq2gpa+WoqSamZKMoqWnsqmhprGsqrWkrrC0r6OZna2nm5eempmsuKKXk5GPmJyhmZiVrqGfloKVmY6enJqXkYuUk56ZpaOjoZmXk5KWe4yRhXuNi4OMk2xueW92fWJGYGpaSUhaWz17SkdFNkFiVWlbTVxhSlxcWlJTU2JhTEtFYGFgUE1JUFdWVU9HV1ZVTjpJVklIP0NLP0VESEhRTkE/SEhIRTw3PT46NzU2MDk/ODY2QiwtOCwvMDQsKCwvLSo3NikoOS4kOks1LiJUYFZhLjUoQ15RXC4rQS9KR1BbRzNjWVRMRZqWn7CosamspKOurbWot7O3o6y0t8m6tLu7wL60s7fDwMzHu8S9t7/AwLjAvbK9rqi6ubi3wresrrK6lpenr6yopLOplK+7pKyysqano7K0sbKxtbC3sqmuq7KmuK+1s8TFtqm1tauwrqmnoraen6awoKOUm5mUsJ6nm5+pjaminZuVl6WlpLenorCzq6exp62vtaykmaCsqJycnZyUqrmclY+PjJido5iRmKikoJiFk5eRnZyYl5aIl4+Xm6idpaGSlpKQlneEkYZ8hoKEjY1ucXh2fIBcTGVsXEpPZF0/YntHSThHZ1dmW0xeYkxZWVdVWFVpXU9QSGFeX1BKSFFWVVJLSFdVVk04TVpORUBGSz9IQkNLU00/P0xPSEA7Oj47NjswNDE8PTQ1OD8pMDcpMS4yKSksLC0rLTkkMDQyJTlCNy4jQU5IZzI3J0ZhTFYlLUIuPUVMUTwzcmtMRUSRmaStpKytqqajsLKyqrewtZ+rtbnJuK7BvMO3s7G1wsPPxMDCvrW+wcC7v7y0xKiqubG2t8C8r6y0tJ6hp7GupaaxpZ6ytayqsrGrqKi1uqy1srWrs6yqq6isqbmtsrDHv7ilubCpra2mp62wpaSjrqOom52bmq+ZoqKio5Csn6Ogn6GppqW4pKu0tKSqq6isrrauop2jqKucoJmbkqS1mo+JjoiRo6GWj5afopaVhpCVlJ6bmZaVh5iSlZmnnKCgjZOSjpF4fo6EfX19h4qKcnRzf35+XFNjbl5OWmddRkSWW0c6Tm1YYlpNYWJOVlZWV1VZaF5RU01jWltUS0dPVFNOR0lWU1xOO1BeSkJESEpBRT8/S1NPPjpOTUM8PD45OjU9KzMyPTYyNDk6KDQ1KS8sMSgpKywtKiY1Ki8mMCkzODoxJiozRGQ7NipIZEhKKzpJPzNDSVMsPo9sQEhJkJqoqaGpr6Sno7O0sLS0sLCgq629zLquwbzHsbSts8HD0cTGv8GyvsPCvL+4vcWorbestLi8wLGssq6ho6euqqilsaOqsKquq7Gurqyrs7unt7CyqbKpqqalo626rauwwrm0rLmpqaitqaexpamkoq6qqKGem6OslaWdmJ6Zq52hp6ihrKajray2sLGgqaKfqq2wq52ep6epmqOYmZCgqJiGg4+Li5+gkIyOl56SkYiIkpahnZaZloaXk5SXpZyenYySkI6Kf3+IhH13gIeFh3V0col3bF9ZYG5jUXNxXEs7hHxGP1d1WGBZT2NcTVVWVVdRXGJfU09PaFlXVktHTE5SSEVJVlJdYzxQXUQ8RkhIQkc/PUpQTDo+T0o9OT89Mzk3OyozNT4xMDQ4NSg1LyosLjMwOyksLCclMjM0JCwyLTg2MCkoMTxeSzAuSmdERjg8QjA1RUtYMUCUXUBORpWWrKegqbGbqKiwtay4ta2ppKuqvcm8sb64w6+wrLPDxM7Ow7/AtMDExLrBtcnErK+3rrO6wL60rq6spqiqsammqbKmtK2qr62tsa6yrbS7pbizrKytp6ugo56wt6yqrbm2pLW1pKqnrKyqraCopqexsaSmpaGhq5aqoZOboKWeo6Oqo6yinqaxtqysoqWjmqmrramdoaWkpJmgmZaPmJ2TgYKQiYWdoI2LkI2bkJKNhY6ZpZuTkZuMk5KSlKOanJqLj4uMfIeBgoJ7dYGEgX51d4ujh3hqXmBuZldmh2ROQGeSTEVieldiWFJlVU1WVlVUT1xdYVZMT2pXVlZJSkhJT0JHSVNRWW9BTVhAOkpHRkVHPj5FUUg4Q0tFODdDNzI7OjoqNDk/Li80NjMpNCsqLCsuIzQuLSsmKCs3OSomNis8LTIsJjA2WFouMEpnQUE8PEMrOkpPXjREh0JJSUSWkK6koamvmKmorbWqtbCqpKuqqbzAwLm5tLy1prKvw8nL0b/Bu7nAwMK6wbrCxK6xtbK0vMG+s7Gvraysp7eqpa2wq7iuqLCvrrGrtaq2tae1t6yspKmqnKSes7OpqKSztJ+1raGqqKuoq6efq6uoubapqqqpoamfrZuRqqGdoKOjpqKqnpymtK6npamipJekpqeqnKKko6CZmJ+Rjo+ZjX6HjIeFnp6JhYyLkI+SjoWIl6Oajo2bkZKQj5KfmJmXjYuEgHSHgX9+eHWDgHp4fn+InY9wcWZncXhcYXSIak9dmFZIbXlVZFZSYk9MVVVVUU9YW2JWSVFqVFZUR1BZVUk+SUhPUVB4TU5WPTxLRD9AQTxAQ1VDOUFLPTU7RTIzOzk3KjQ6PSstMzQxKjgqKisqLCkqKC8qJiklMzssJDIpMjAyMSUvMlJjMDJAZj1OWD9DLD9MVF8vSWs3UkY7lY2voKWprJmqo62usrSvqqSvqai7v7zBsrC5raK2r8jHyNHAv726vMO+u8TBwL+vsrOztr28wbKytKu0qaW2qaWts7K4r6KttbGvsbmrua6qrrerqp6qq6CjobWtqaGfrrKhtKqeqKero6qhoaytqL2uq66toaeon6yZj7ChmKKgqKeep5uYqbCpop+soqGSoaKjp5iaqaaYmJmdj4uHlYh8jYaEhaSWhoODjIeQkJKFh5WglomRnZGTkI2RnJWYj4uGhnh0gX99dHh6gHt0dHtqgoikdmleZWyBdWeIi3xSVnBeS3hzVGRTUV9NTVNaZk5NV1llWUdTalJRPkJOUWFROklITFNJcVFMUzs8ST87PD07QEBXPDw+SDczQ0IxNTo5My01OjopLTMxLS02KSgrLSw1MiMyKScsJS47LiYxLjAtMTQlLDBNaDozOF89YWQ/RjFDUFtbK0hQO1lDM4+OsKCkpaqipaOsprSzsaiksKequL/BvbGpuqqnrbDJxsjQw77Avbm/wL3JvMK4sbC1srq8ucCztbytuayjtaanrLG2uLKmp7m1rbS8r7ylra21q62cqa+kn6SsqqicnaqypLOomqqnqqSpnaKpp6m9q7Owrp2ppKCvnJqzopalm6Wkn6WamaiqpZ6aqaGbkZugpJ2Zl6mqkZmakpCLgo+FfY+DgIiej4eAfoyIkpCRhYKUmpOGk6KNlJGLkZuTloeKf4Byenl+fGh2fHt1cXF+aoZ6hYhkX2hjcoV7bWd5XV5WQld7bVRhUFJZS0xOcHRdSVpbaFlGVmdPQz5LTkRDQTlIR0tTP2phSVE4PUg8PDw+Ojw/VDY6P0M0NUg+Mjs1OTAyNzw1KC41Ly0xMSYvPktJMSUaOTAlLCwwOS8sLCs2JzE3Iy0vR2pJMTRYPWZiQUo3R1NgVSo9PEZcQCqOkrCZn5+ppKKhq6S2srGkqbCmrbnCvbewpLmsqaiwwsjJzMK3vb+1uMG6yLbDtbSztbK9ubq9tq65tr+torOmqquutLe0qZy5u6ixvrK6oK60tqmrnq2xo5ylqKmjnZuksKavoZ+qqaeiqpyjqKCtvKeusa6hqqKkrp6erKaYn5qhopufm5mjqqKamaOjlZaUn6GWnJamrIyfko+RjIKKgICPgXualIyJfX+Mh5GQjYqGkpeRh5SjipKRh5CZkJSBiH16bH12eXhienpycHFzeGqCdWuCZ2NnYW5zjm1iam9fcEFdeWtWXk5RUUtJTVNZVk1cXmxXRVhhT15QSE1ERjs3SEVLTzxyaEpLOUFFOzs9PTs7PUo0OUI8MztHPDQ/MTgtNzg7MigwOS8sNS4uPS0qTD4qHTQ5JicuMzQuMCsvNCYsOiQ0MEFoWjEzUz1lX0RMNktWZE4pPTNSXT4jkZarmJ+Xp6Khn6ikt6+toq+vqKy4w7q0rqC5r6uns7rHyse/uMK9r7S/t8S2w7KwurGywLa7vbequri+qqS1p6iqr624sKiYuLyjrb60tKGtt7Wmpqiws6CepaWnoaSZnqynqJ6gqq+noKaXoqifsLifo7GvoauhrKScp6aompubn6KVnJuanammlpueqJGYkpmdk5mWoaqRm4qOkId9h3+Cjnx8oYyMiXqEjYWLjo2FiZOajomVn4mQlYKMl42RfIV8dHB8cXN0YHh4am9xcXBrf3NkemxoZWRhZoeAYFtyanJNToBpWFpNUUxLSFBSUEdNW19vVEVZWlJnT0hLRUY1NkhCTEk1WmVKQDZFQjk6Pj0+OjpDNTk+OjNARjwyQDIzLzo7ODMmMjwwLDg1QiopLUMqLDQ7Tk5AOzczLS4rLTcqKjwlNTM9ZmQyNE0/ZV1GTz1SWmdIKj8wXVs1KJWbpZiclayfnqGkobersKO0s6mpusW3s66huK2tq6+1xcfAt7/CubC1vbe/u76wrL6ws7+yvMK4qru6uKeotainq6+rsq+kmLu2pKu6ta+esbivqaWnr7KcoaSgpKOglpuvpqGfoqivoaCik6Okorawoaaxq5+so66YnaqlqJ+Ymp2jk5qbmp2lqpqbm6WVlJeVnI6Tl6KpopGKi5CGeoN+hIt5j5eKjYd6goiEiY2PhY+TmIyOlpmLj5Z+hpeMj3qBe3Bydm5vc194d2VsbGxqaoVvZnJpa2ZoXmRzgWBba3ZpWkp/XlxYT09LSEhSVUczOV1ebFBFWVVZZU1JSUVFMDdGP0tCNklKSDs2Rjk0OT49PDk4QDg7ODo3QEk+ODw0LTM8PDc1KDU+MSw7QTEoKzY8IjhSPSoxMTM+RDUsLSc0Mio7KzEzOWNtNzRHQWZbSFREVV1oRC48MmRXLDKUoaGXlJuqnKOhoqG3qq2gu7elrL3FtLGvo7WvrKyutMPDvLO/urexs7m4uri6r67As7O4r7/At629urWmorKpp6mxqq2xoJm/taSntLWonrK8qailqbCsmaKnnKSllJegsqSZnqOoqZyin5KkoKS4qaSnrqaepaGok6CpoqGhmZudn5GZm5afoaqbmpiglJGUlpmNlJOkqKSQiYqPhnmEe4SGfZ2NiYqHeoGEh4iKkoWWk5OLkJaUjo2Ue4OYj4t3fnxsdHJsbHNhd3VoaGpnZ3CHaGhpY2ZqamBrY2poW2Z7Y2BTdFRcW1JMSkZJT1NAISpoXmlMRFdVXmBLSUhFQy46QjxGPDZLUEQ4OkQzNTc9PTg5NT86OzQ+OEBLPT45Myk4Pjw6OSo2QDMuRTQoKyw/MC1OPy4rLTcsMTE5NSwmLjUtODA1NzZgdEEzQ0RnW0tXR1VgaEIzNzlnUCcynqKkkY6kppqdnp2jtK2nqrq2p6zEwbiwrKO2rqetrrbAv7yywrawrrK2tbi2tq2qvbOusrG8v7evvLuxpZ+2qqWls6eprZ2cwKunpa+zqqy1u56oqquxpZieqp2mpJGYpayimJ6kqaGcopyWn52ntaawqq6hoZ2eoZWgpp+hoJqbmZuSmJ2TpZ2soZeWnZSTjZWXi4+Ym6mfkoiKi4h4hXaBgoGdh4qCin1/hYiHhpGElpSQjo+RkZGMk3uDlY+Gc35+Znlva2prZnVza2NnZGR2gWJlZmZmampja3JbX1lebWRhTmlYWmBWSkdIS01SWD45X2xoSENVVF1bSUlHRUEuPD85QTg5UkZANzpCMDM3PTc2OTI6PDk3OjlETT1CPDAqPEA7QT0tNUIzNz0rKywwQipKSy4vKiszNzIyKDU3JCs3LjcyNjg1XXlOMj5IaVpMWUpWYmZAOjNCaEglNZqjoI+MraGXl6CWpLOxorK9tqGxxry6sbGjt6yqram4vLu6rcCyrq6utq6yuLOpq7mxr66ztrq2r7i9rKaetamfn6+jqa6cob+gsKOusa+3rrWera+trqKZnaeppZ+Vmqeln5mkoqidmp+alJyerK+muqiuoqGam56ZnqSapJ2Xnpebk5ifkqiVqqeak5qakoyVmY6UlJqppo6NiomOe4FzgYGKmIWHfImJhYWKjImShJSbk5KPkJGXjpB/gI2Og2+Bf2Z5bWhraWZxcmtcaGNjdIFiZmdqbmxna2pobl1sbHNwYFRjaWNmWUlGTE1PWFFRVWFlgFVBV1NZVEZIRkVALzw9Nz82PEZOYTg6PzI0OUAzNzgyOD83PTg+RkpARDkyLT1BPUE9MDVAOUAxLSsuMzw7SzYvLissLTI0OzYjMyopNi41NTQ2NVp8XTE5S2pbTVtLWGRkQEExSmZDJjSRoZuNj7CdmZOhmqmxr5+5v7WgtMK7vbqxprevp62kt7e2t627rqyqq7aps7euprK1sq6psLa2sLO2uqapn7WonJ2ooKismqe9mKykrq+2taytn7GtsKmim5yjq6iclJynpJ2aqaKklpqfm5CbpKqrqryfp6SgmJqZnaGPa6KWmZxwgpWao391kamnnpSUnpCImJqAloqhkHmHlIyDbWl+doNxbIaLhn2FjIdwXmNhZ4SYhWuLjpSSdHeLhH6DkIBnh4BndWhlV1xoc21OUGpjZ3OFaF9lZm5tal5fYYqPg4RlTktEOUdUaF5KR1FQVFVMSFJgb3RlRltRVVBGSEVDPjE7PTY9NjwzZlw1Ojw3NTtENDg2MDpCNz86PkZMQ0IzNDM9QUBAPTI4QEU9MSwrMDg9RzcwMS4qLiovNTY4LCMxJzIxNDoxNzVYgWwxNk9rW05cS1tmYj5HMVFkPSoui6SZhpWwm5uToJuqraqjvcWvqbfCt729raa3sKWqorazsbKxuayppqy0pa+0oqm3traop6y2sq60rbOhqZ+zqp6go5ulpperuZSlpa+zt62upamuq6yloZ6coaemm5egpaWbm6emnZOen5iQnqippLawpKOinZaYl5ejiKGOkpqGoIeTnKB/pX+lqp6SkpqRiIRzeI2OhYihdoiMaZeIZn1zeKBviIeDfo58f6GgoJmAfIeedIeOdZuKbIeBg21pZWN6bHJhU4VtYmxpmHFYaXFwiFheaVtsbFuIcm56coVnhoRaX0dOP0dfTUVSVlZRUVNXVGddTVZIUlJPRkdHPjw0OT05PDc7MDw8Nzk5OjY9RjU4NjA8Qjs8OT1GUUc9LjU8O0A9QD41OUdBODIpLjE8STkvMDEuKi8oLTQ1ODMlJjIxMTU+MTw4WIN1MjVSa1tOXExcZ189SzFXYTcvKIqnl4Ocq5yYmJ2fqamnqr/Dr7G6vLbAv6qlt6+prKSytK6us7aqqKWwraW0sputtba1pqeosrCssqetnaqgsaefoqKZoKGarLOUo6Wltr2mraerqqyopqGgmKCmo5mZpaOkmJykqZaUopyTk6OlpqG3pKSgo5iVk5eSnIivkJeUiamLlqGchbGAo6ydk5mdlHmC1KiAh5XBm8d5eLGlt5dkgMCcv3mEhHmRhHyQkJHKcpe8nMV6crWmu5B7gG2WsauweWhsWLGubmVpvZK8bmd6b3KP2H5Ta2O2sn+BcpRzmqGqkFdPV2JPVk5GVVtYUVBSjFxXW1BBXERRTkVHSTw8NTc9Ozo5Oi49Ozg3ODs5PkY2Ojc0PkA+Njk/RVJJOi41PjpCPD9BODpKPjUyKjIyQkUvLjMyLisvKC0vMTg2LSAvNDE2QTE9OleDdzIxVGtcT1tNXmdcPkwxW100MSGMp5OBp6qfl5yepayyqLDCvrK1v7W2vsGrp7OsrKmmrrOprrazp6emtKWnt62cs7K2q6Wkp7GtrLCmqp2mo7CioZ+dlpqenK2rk52in7S6o6qpoq2upaGdmpqip5+Xm6egn5iep6eRnKaak52hpqKhsaOfn6OWlpKXkpmFr2tqio2qfmaDlYatZHCdnZSZppRxrqGkfni7fWuhj3axX2q0W6WAZZyRYGaCe2Z/anhrqWW+cmemjHWxanyxeHSSlGNubaduW4ShRWhmh5ZFdZxgfmd8pKeCWl+Mq2iAlXh5aqc3Sq9cWFNsZFtLTlhfXFdWO06JT1dXL0lUU0pDRkY9PzQ2Pzs4OjkwPTg5OTk6PTxEODs6Nj1BQDY8QEhRRzkwNzxBQz5ARDhARz0xMy0zM0UzLi41My8rLyguMC46NS8nJDIwM0IvPTtVgnYyLVZqXE9ZTF9nWTpNNV9ZMzAbkKKVg62npZ6jpKqxt6y1vb+wtsSyt7rBpqmwqq6oqK+uorC6r6OkrbKjqLinnrOzsKOloKmsr6uvpqeeo6Gvm6KalpWWmZqrpZWaoZ+0s6KrnKOtraCempagoqicmJ2jn5uZoaakj5yimZegn6qepqagmp+hlpWRlpCahbWbtXiFqZm1mXaGs5u3fpOWlqmUfmuCpnuChoiSlJJ3q2drsVyreo2GlHSJco+GgH+IkJd4goKLmIuDoI+EsHZ3n3FsbGx8i06kWEhiYpl+Y2imYHlydVOTh15QqW1jcX6HgGKcLlGhb1tTa2hgTEtbZFhcWkI+sXlXWEEjTWhGQ0VBQEExOT44ODo4NDs6OTw5OkE6RTo6OzY6Q0I4PT9LTkc6NTpBRkJAQUQ8RkQ7MDIwMTtGLDAuODQwLC4oLzMsPjgzMR8vMi1EMTw8U31uMytYalxPWE1fZ1g3SjlhVTUwG5WglYizpqahr6mns6ypu7bCsLvBrbi3v6msra2tpq2xqaCuu6qgp7Sso6u0pKays6ejop6nqrGnsKelnp+frpWemZSVlZedq6CZmaSota+iqY+pqKqbnZWXoKWomp6cop6bn6Olo5WbnpeZnKKpm6aZnJuioJeTkZOTnIPVk5m5cLDBfsWGfNaUm7t8mpWlj42djaR7joekgqWCeqx5j51Wr3qIfp9quVq5doaDfaaCk3yYeqp4jZ2PerFujoR0kbyFb5RQr6fFilGgemNgqWJzcohtl4hgU7W0yIaAiXxjpDNCnXZdUGppY1BAWGdaZGFKSE1uTlxRT1lmWUNEP0U/MD08NTk7NzQ8PDg9OjxDOkY6Oj82OkBDOzZAT0xIPDo7REhDQkNEPEVGODEyMTFEQy4vMDQ4MystKS4zMjM5NzEjJTUqPjM9PVF3ajYqWWlbS11PX2ZUN0c6YVA3MSWbopSZsqioprSqpbSppLy3wbC5v7G1tLqytKexr6KwsqafrbWnmqe5raKvsJ+ztLChpJ6fpqmwqLSoo5udnaqVmJaVlpSWoKicmZaorbCpo56PraKolp2Xm6CloZihoaGhmqGip5ueoJ6UmJqmoJunlZubn6GYkJKUkJ2Ism5otXGrh26OpnK0c3K2e5qXpIuPnY2if5GhpX6wdoOR0tJ2XK57hX+kb5uqpmuGhHytfZeZjnuwcpKdjnizZZd0hJ5vnmaUUciLWsJcn3liX61gdnOHYpeIXlnKnW+/gXVNS7VTVcZkVFFqY2VYQU9rYGxoUFZHSTk9VVJaV1hJQz9KPDI/OzU9PDQ2Pjs3Pjw9QztHOTtANzs+RDsuQ1JKRz4/PElKRkNFRD5ISTkxNzQ2QT4vLjI0MjUyLSkuMjYsNzQyJh82MDs1Oj1QcWg5J1dpXEJPVF9lUDVHPWFMNjIwop2TpbCso6u8raa0pqe2u7yyur62trS5uLKltLOgsbGinquvpJemua2ksbCbtLiqoKWdoamksaesqaOZnJmnnZWTl5eRkaGmn5WSpauwpqKWk62gpZKUoJukpp+VmqWmoZqjn62ZoJ6ekJWboZ2cpZWdlZqin5WYlZGbhax7d6h2o42IhqlvrYqCp4OYmKGJkpqLon+TmomuhX+Cs1xys1KufYKCpH9x1314hX6OnYWamnavhomRnId3tGGaZZqCgpVtklqwWEuadZh5ZmCtXnZ3iGiYiGxdr3eVno94bDV5yK6yX0JUb15nYEVQbGBwbVZWTS5mZGlTWVA7QURATDo1PzkxPTwxNj85OEA9OkM6Rzs8Pzo+PkU5LUVVSkVAQzpNS0pCSEc+R0s5Njw0Njo+LzA0MzMzLjIuLjE4Ki4zMiUhMDM3Njc9UGtlPiZWZ1xAPlZfY042R0NgSDo5OaCelaC5sJe0wq2os6ipsrq3s7e+ubextLq0pLeyn7Osn56oq5+Up7WrqK+xqq20pJupoJ+nobWmpqmimJ2UpKCTkpuYkZShpJqSkKatr6aglZmpoKKPkaGZqKSglZmlqJ2cpJ6tnaGdoI2TnpqdoZiZm5aXoqCUl5CmnYapfX2leKGOjYKqcK2LgaeGlp+hiZeXiKOCkYiUqnyAi514b7FaqIKCiKB5dNh/dodzqIGOm42SpHyWkJ+Ee7JenWSgfoOVbZJcq1tak4CRf2hnqmRye4FrmIdzXqtaiaCOa29lT0pDoVxbTHRdYmdOW2FfcnNfS1Y3SpuUWEdFPUdGQU0zNUE4Ljs+MDVBNzhAPDY9PEY/Ojw2Pz1CNy5IVkpFQUg2S0lOQElLQEVOOjpANS47PjEwMjE0NCsqMDUvNywmMjEoJCQ2NjcxPFBlZUEmVWZbPzJVX2JMN0ZJX0MyPziinpqawKuYtMKuq62ppbSwt7C1vrm5sbC1uqi6tJ+vpJ2kp6eek6mwqa+ptauqrqGYoJ+mpKO5oqOroJabkKGflJOemZOXnp+PjIuosLCnnZebqKafjJKkl6iqp5SXqaeenqCiraShnqKMlKGYn6CSnpeclZ6hlZaOq5yPrm1ytHOpi3WKp3O0eHOzgJGko5Kcjomkh5B3uG+Me4uiamu2WqGFZZeXaaGip22TcrR0k5h/smqFkoitanWzYZ1mom+Hk2uXXK1fTaF8h5FSc6NseX9+b5iHcl2vVjycd2ZUb24uXKdPY1NrZWJtWmNdYXB7Y1RaUj4+bW8zQ0JAP006ITdANi47QDM3QzU4Pz8zOzxDREJKRk1JRjYySlRLRUJJNklKUD9ITkNGUD08RTUwOzswMTAvNzUsKyw0MjYvIzAwLCwdMjg5LzlOYGVEJ1VkWT4vVV5hTDVGTV44MUM4ppybn7yhm7LArq2rrKe3qbevtb+0u6+ut7aqwLWoqaCapaOhnJGqqae1orKnrqmgl5unn6SruJ2irJqVmY6jopWMnKCbmJyfkZOUqrawqJmUm6yql4yUpZilrKKRlqqyo5+epquxmaGjj5iilp+blpyWoZOdqZyUkKuZh9SSmrtzsMOAw4Z+1ZabuHiIkJiMl4uMp4h6pLZ1fXd2woKasmCDunnAfHW4Y7WCjIepfJWBrKlxe390vIinoGmdYaaOr6F+jHSHqn2+b3O8dLKDdXiBim6aiHJujaR0vV53fVphebxrWlZcanleamFlZ2NteG9aXFlDQUBzQENGKzVHIic7PzEwPD83OkI5OT1DNDxATlpeYGBfX19aUFBSS0VGSjRITFJASk5FRk9CPEU4ND05MDIwLjg3LSouLzE4MCItMSwzHiw8OjA4TFhhRidUY1g8L1ReYEs1O0xbLTdBOaebnqK9oZeyw7Ctqqussae3r7bEsLiwrbmurcCwq6OhnqOhnJuQqaOqsqS0paylnpWZqpimrLicoq2XlJ+PpJ+SjJyinZedmpGVkq+5sqyWmKSop5SQlqScpK2ekaCoq5+bn6ijs5+jpY6nopSimpyYlaOYkK+gkpSpnoSQmLZ/j5GMt5V4gpOatXdta25zb3mQhY+KdJ/Bu72ae4GxqHGAc5G5g3yGhoyHjXyKh4yXfKS7ub2cdXq0o3R3l3Z0sHWZnmaGao21dHJxd7aMXn96fYlog3luemOLrHB1hX9YW6dqRWVaVGZgY15jUWdncGx1Q05QTUQ6Wk0/SjM7MCA4PjsuMz1BOTk/PTs8QzZCU1laWltbWlteYGJgXVNHR0g0RElUQUtOR0VPRj9HPDc/NzA3MC85Oi4sLy0qOC8lJjIoNCQoPjcvN0xUX0cnU2JXOCpPXl09KzpWVSc+OzynnqCiv6WWtMO0rKuorKupuq6wxa2zsq21prO4q6mhoaWeoJ2Zk6ukrKmltaenn5uVoKOdq6S9pqGplpObkKGakY+hp6GTnJeTl5SxtbetmZ6kpKKLkpKmm6Wqm5WppKWcmqGopaekqaGRrZ+WpJ6Xl5edno+vqJSbpqGNan1pm6Z4h3J9mY50eWSHe72+wLpvk4NylohgcmpaXpuJYGOIj5VrYICVY22dd2KVbICalZRlXmBjcZqKaXKLfYaVZ2t/cnV4fX5iW3d0gWhQXG6DfXuLa1hreoJzSkpvhnBOdE1FWF1nYUxbWGdjX09bbXVpcVJRREVNO0dJPU0/MiwyQT84LzU/Qzw5O0A7PUM+UlZWV1laW1xcXWBhYWFgXFVHNURGVUVKT0hGUElJSDs4PTUxOi4wOzouMC03Nj01JiIvKjIsJTs4LTdKUl9JJ1NgVjQpUF9MKDM+W08nPzI+qaCoosKjm7W6tqOspa6np7WxrMirr7Kqs6K9sLGmn6KnnaObmZmrpq6jpLSopJuXlKCbpq2ovaeopJSTmpWfmZKXpKiokJ2RkJicsLK/rJynnqeiiZORqZqoo5uaq6CjmZujp6yjoKujmrCblaeglpSdn52XsKWYoaeZm5CcnKKjmKWhmZuZmZmPlYFnbX1xd5KYlJKFi7WqjYaYlY6KjJiWh5SVioSTlJGJjpOUmJSYlpqgoZqclKGdjoJ6pYVta32RfIB1ioqBcYJ4eXZ2ioB8imtzgXSDdWV3fXdrb3ptYGNdcGhNWVpmamBXWm95bW1mVFBGUzlPWk1RTygrOktCNjM1PUBBOTpDPjxFTlNTVFZXWFlaXF1gYmJhX15eW1RLQ1NHS05ER1BMT0k8OjszODksMjs4MjApNklSTzgiKSsvMiM0Oyo3Rk9bSiZSXlMxMFReOis9OFxKLDwtQLOgs6LAoaSysragqaWyp6WwtKrIqqyvpLSlwKazoJ2kpJyjlZWfqqasoqO2q5+YlpWflq2ppcCeq6OUkZuXnZeSk6GenqKnkpKZqKeyxLCbq52rn5CWlqedqpucn6yYoZucoqSvp6KlqJ+umJennZmZoJ6dnK+gnKGmlZeSl5OfoJWinZegjpaTioqNjpeukHyWnIOSgouqqYWAmZeJhJCeiHqEkIeGmpKIhoqWj5uXjZGYnaSWmpORnY1/jmehs6+FioR2e5KKfXd5em9meZCBgIlrdYF6iHNpc397doOHgmt1ZHlmYGpmY2Rma1lse29pa11TTFBEXlRFQD8+LDRARjs0NTs+QTs8Pz4+SE5OT1BTVVZWWFpcX2JjYV9dXl1eXVhWSktMQklPTVJKOzw6Nzg2LzI5NjQuKCYkLTEuLykrKjclKzwoNkNNTUQvVF1RMDVNWzE3RTRbRzU8LEC0oLmvv6yrrrKxoKqmsq2irLOvxK+pqqKxrbyis5ufpqKhnJiXp6WppaSlsrWdlJOdmZmvpa2+oKuikJGdmZiUkJShnJeonISeqqujtMi0oKqkq5eWl5mlnamanqOrlJ6fnqCpr6qmpKuirpufoKCYpJ6cn5yvo5iep5KXlpyRo5iXp5yal2WCknxlfo2akGN5jm1oa3uSpKpqZZuYfWeGimVlaWh7jqGPa2eNmJGjd2tqi5mjn5hzbG56hI6IelhmXoaDXm2LiYF2XGhzd3aSgIiCbniCeIBzbXmEdHaJiI+DfGuHWV5sdGRec4lpa3xxa2RfUk5YSWRYQUo0Pkc3P0ZENzE8PT9BRDs7REdISElMTlBSUlRXW15gYWFgXV1dXV5fXVpVT0RIT0tTTj0+PT02NTM1NTU0KiYmJSwqJS8qKyc2KiQ7Jy9BSltKLzdaTzYpRVkvRE8yWUM7Py49pZ+6vLqvrLSxqqWora6wpq2tsLywqKajra6wnqyWn6OdoZmZpqqcrKOlp6iyrZ6Uo4+ir6W2uaWuoo6OmqGZk5KaoJmZpJV7pa2iqLTEuKWip6+fnZSdoZ6jm6KpqJKfoZ6gqbCrq6SroKqcp5+noKyWoZulsKSXm6mVoJ2akaOWnamXnX29g4hytHKEnYataHi5xLhxk6KjeqaZmXKrgnzLwMC7cYyjiIKffZeZiZ3AvYKXnZ6NncLBfIJ8k42aw8B9bKWyb4yBb8p6f5t3kYOOgXZ5gYB5cXp/h3B3hYyTeW54lGNnYHhkYGWCY150Z2xkZFlMVklRWkhPRDJJRT9EQj4vPD8+QEE6OERDQkNFSElLTU5QU1ZZXl9fYV9eXl5eX19fXlxTTVBHVU5BPz89NjQ2ODI3NiomJSMpKiYuKyopMTAfOSojPklbTCojQlAuI0ZbM1BZL1ZBQjsvOJajucO1sLDAqaiUo6+osK6tprKzrqmkpaavq5+qmJqin5yaqqeinauipKikpLSjnKKSpq2rt7OnrqKRkZmcpZKRn6GXm5+diKaspKytwMCxoamvqZeRnpyimaGjqqOToaKdnayuqq2npKSnoaalnayokaOaqK2pmpyom6uglZWklaCilpx+zpR4eqSBeZWWm1+uj16Op4GioHynlptzq4OAr15jjKp7qIeFoHWYk4izY4KrhqGOjbNqhK91fZeIt2GDrVqjzW6Qdnvae3+ZcH6HknZ+ZXuIdnZrfIdufYaRkX5tg5Bhcm1waGBgeWRccWhqZGdgUlRTV11LT0M1QUhERDg+NjtAP0E7PThAPj4/QkRERklKTE5QUk9TXF5fX15dXV9gYF9fXVpXT1VKPT8+PDU1NzgxNjQoJyQhJywmJi8oJiszHTYwJDc7U0wrLC1LMCc7XDtMLSFQQEY0LjGtwsC/tbSwuJedkaOqp62zq6ayq6uqo6qmr6mfppuZpJecoq+foJ+op6KloJ+wrJqdlaeurLCqqKuflJGan6SSj56kl52no5+tpauwqMDHs6ipsa6WkpyaoZefqamflaGfnZysrqisqpyoqKSiq5KsspaloqqqnaKlpKCun5GYppmfmZOTkJegcYWMl3WFqIZxsX2ecqx+op+BpY+edquCfa1/nHKtfquHhp92mZJ7fJd+qoiijJKMnX6re4mUkJ+Ae61XncV7j3CTwX2BlW11b4xtZXZlhm9hd25yb4mKko+DbpORZnB1dXFhZ21lX29paW5nZFhTXWFZUlNDOUlJQEQ8PjxARkRDRUE9PDw8PkBAQUJFRkdFQENJU1dZWlxdXl5cXl9hX15eXVtaUkM+OzkxNDc4NDUyJiMfHCAxJyAxJyAnNB41LSY3PVdKLTwnPjEpM1dARiEcRzpDMS4rsNPGxrK0oJ2jjqOioqyvtq6osaaoqqatq6umoaOdmaGVn6Wrn6Gln6ioop6dsKyXmpaop66rp6annpeUmaOhkZSgrJqdpqOvrKSstaq6zrKtpq6sl5SbnKKZnq6snJegmp6fqLGqq6ubraulo6uarrGhqKuupZikqaior6GRlaKjmZORhKRqpHWJeql0erJwgqaKmYxxiaCbh6RgYFKrhX+ug5t2rYGnhoWfepmXhntmgKOJpJmGgqN9qX6CloeuX3ypVp6jkoF6o5+Ae8OvxYtyr7OzuXJiqa/CdGiMjJiOgm6clXFvenh5cG1nZWVycGZ8aWNdV2BqWFlVTExRTENDQUI7Q0BAQkk8PTo5Ojw9Pj4/QT04NjtETFBSVFZYW15eXVxeYWFgX15dXF1bU0lCNjc5OTY2NCwmJCIgKCciKy0iJC4hMy0mQERXSCxHKzU2KjFQS0wjIEE5RDQsJ8LJ1dS/oZmrp6Cvop6wtLCuqayip6aoqquppKWfm6SenaWnp6Ocq5qirKGjn6+hnJqSq6O1r66gp5qdlZOmopCaoqefn6WcsaWkqLGtt8iytaqsqZaSnJuimZ+ls52aoZSdn6asraSwm62qo6OqobOtoaqzsaGaqKetrrShkZSippeakXypbJ6Eh3WreXywb4KljImflpaglYHSuLS4yYGBsl9glKmDpImHoHqYlpp4qsl0mqSVqKmRk5qNgZyKmsbGeWehgqV0gZ+Ogn2vXXC0YrB1S6OHbadHgpNkj5CekXxxmZWBcXx1fnxuXGZqc3FmgWteYVlkbVxfWUlNTEtFREFCPkE8Qj9KOzc5Nzk5Ojs7OzMuNjxBRklMTU9RU1daW1tbXV5fXl9fXlxcXFxcWE1CNzU2ODUvKSglJiUkJiksNEVOUFBNRktKVkYqTDAvPS01T1RRHRw7PEYyLCSnpMDGuK2osq2spaKcsrisqqGlmqikqquqpp+mpZiqo5+uq52loKyanqmlnKe2nqKXk6iqtbKsm6WcoJSPpayRmZyno5+pp66hpaepsLXDsrOqraiTipecpZuho6+ll6GVmZylpq2csZ6uqKafrKO3rKGyuK+dmq6msbKxo5OWpqKZno6CnU54moF/n3qEo32DpIWHpp+dn5SEuHt7ebmCf8zGwrZ4m6GQi59+mpaXinaemIqlmKSpf7CFnYaghKx9mpVjpm2kcI+FkIF9loJyrGCjc3GAmmC8fVJVdI6So5Z7fpSTjHZ7c4aAcVxubnhyaoFvW2RfaW5iZF5MTFFUQUlIRkk6OUs+QjEwODg2Njg3Ny0qNT09P0JER0lMTlBUVlhZWltcX19eXV9fXVpaWlhVU09IQDg4Mi4sKi4rKicnP1FUVldXV1lYWFdVT1VGPEUzOlBbVBwbNj9ILC0gi4eZqaukq7mqrp+boayys6WeoJWlra2uqqecpqaao6ehs66iqaayoJippJSjtqKilZehqbS4o5uhnKKSj6GxmZ6bpqWgoa+unKWoorayxbGtqa2pkYeQnKicoqScpZeemJqapqSrm7CirqSmmK+ku6yhtratnZy0sbevsaWXnK6go5yFj9G1w7d5h46FkZOQgKZ5lKF3jKCShKWBinGqhoW0bnJqmaOclYqefJiZhoePc6+CppyjjqaLk52LlpCbbnGyXaV0k3qcbJl/e5l8balho3Fxf59ic7K4aHePlKaYfY2OlY55fnmQg25qeWl6c2+AdV5lZW9tZmdgSltYWDxISEBVNEBGPjwqKDYzLjAxMykmNDo7PD0+QENFSUtOUFJUVldXWV1fX15eX19dW1taWFVSUlFGOjIyMy8vKysoQFFSVFVUU1RWV1dYWFdVVVZUUU9RW1UlITJBSCQpJZJzjIqtvr+8urSelqekrbWhopmUoqimrqurmKain6agoLano6insKOUrKOOpK2inZCamqqzs6ScpJyokZSXrp+fnqainKedtZqiqqS2rMSwqaupoYyEjpyioKailZmanZmbmaalqJmtqK6jpZutpr2slL2vrJ+hr7K4qbKlmqiwoqeXeaiRfXywd4qApKWInG2ycKGHrXyhj4OnlZiArImFroWflKqgoZeGn4CZlYB7kn6rgJ2bloureJ2hkoqUkoF6r16kgX2mp2SdgH2Xc2qvXaVrcIWZXWBbjKBtlZGmmYOWjpmOfHyEmYBrbn9jf3RugHpgZ2ZxbmhnaENZYVs+S1UzVThCQkM3JCQzKycnMywgLzY2NzQzNTlAQ0ZJS01OUVJTU1ZaXV9hYGFhYV5dW1pYU1BPTkk3MDQyLiosQVRWVlZUVFVUVVVUVFVUU1RWV1dYVlVVUUhGSUojKCi9k5qDqMXCtsCznpqsoK24paOOm6Sin7Cwqp+kn52tmZ65oKOroK+pma6hkKuoo5aJmpCusKymnqWbrJeXj6yhoJ2moZqkna6Yoaint6nBr6WppJ6LgI6bmp+mnpKUmZuUm5qmpaabqqyspKWfqai+pJbCrKqioKuyuKmspZ6yraeol3WvfpCLnIWHfrqtipllsI1lla19oI+DppWagayKhLCFppqkoaGQhKBcbGqBs2B/rXt7g4GxbWdvmZmMiLFbfrVcpIRryKJkn4B7vFh2tVmyfVKugHqsWIChbZiQqJuMmJKamnx6kZ9/ZXV+Y4Z4dIF8YWpncG1nZWZPVWRcQVVfPkkoPjk9NCEiLCUfMi4gKjEvMDQ1Nzk5PEFDRkhKTE5QUVJUV1peYF9gYWFeX1xbWFVQTkpGQzU1My4vQFVZWFdYV1dYV1dYV1ZXV1dXWFdXWFlaWltcWFdXR0I70p+ysbe9urPBsqKcrKaktaigipqgnpyzs6mfo6CetZmgtKiqrJ6vrZ2sm5Wvp6GOiJuOr6uopqGlma6SmI+omaGdpZ+ao6OlmaCiqrOpvbClqJ6cjn2Lm5ahoJiPkZqckpqYqaCimqmuqKamoqWpu56gxqakqKCqtLSrraWeuqyrq5SAqZKjr46bgIekl5mQgoC4w7qDjpyShKeXnIKsioKviKecm6aqkH7VvcKqYqO/vX1+o4KD17q4tYWVk4Oevb6EbaOCb6uEbJx/erKwx4Npq7C9rHh3or68c4CWjqadkZuSmqB7g5Oce2R+e2WPZ3mCe2FsZWtqY1BiW1NqXD9UYUNOKT06NC8fHyQfJTIgHSQoMDQ5NjY3Nzs+QUNGR0lLTU5OUVRXXWFcX19hXmBbXFlUUU1IQz89QT81PVNZWVhZWVpZWlpZWFdXWFlaWllZWFlbW11dXFpWWFRXWryVs7Owv7ixvLKinK6mpLKmnYuYpcCquLKoob+mp7KcnrGcuqifra+lp5SUsKuXjIObka6loqygo5yqoJeLo5KmnaecmqGpo5mfoaytqrquqKOalpJ8iJmRppuSj5GYmY+YlKmboZmqqaGrp6CjqrueqMSin62iqbOzqa6on7mmra2Zc3aqpbiGZImgcGiukYqQbm53pJCZn4F1rpiUcI+LcZWoo5uXrqRybGxsZot4b26CmXGBempxaWeKl5aYcWlphYhncYZkXYhiam9ZXGZ9dqZfYXGOkW5lZH+Nk4+hmJmZk5qifomRlnZniHhpj2t5gHllbWNmbGJLZVhKbFo6UGVFUidLOisjHCAbIywpGBsYLTIuNTo0NTc6PD9BQkRFSEtMTU9RU1ZcV1pcYGBhXV1bVFBMSEQ9OkFCN01YWlpZWVpZWFhZWFdXVldZXF5eXVxcXF1eXV5dW1tVV16plKyzqbm4srOqqaGunaOyqZeSv7PFyr+3q57ArK2koqesn7qjpK6rraaOl66pj4uFlZatnqaqoJ2ko6CRi6SSppipmpejqqGWnaamp6+6rKyam5KRe4SWjaWYjZGRmZWOmJaplqCYqaObsaadoqu5n6/Bp6OypauvsKmsqqa1oqy2lYqhqKa3nYmWo5mHqpuRlZ2SqbKZmqOqoLKWoqGdn6KcoaWhlaunjZKSjIeTnJ2VkZmTmZGPloaBpZuYlo6LlJSMkIaEfWeJfnSCdXOHinCnbHqUkZOSgYGNj5CPnZWil5qapYSJl49zapF3cYx4d316am1kY29kVWFZQGpcSGNhT1krRj0rJyE3NTAuHxwhJTIoKjY5OTQ2OTs+P0FCREVKS0tNUFBRWFVWWV5gYWNdXlRRSkVEPjk9QEFTWFtcWVdYWFhYWFlYWFpaXFxeX19gXl5eX19gYGBfWVlgppaoqqS0tq6uobCjrZ+gtbGQjqzIvsa8uqujpZ6cp5+xqaO2p52ptKaokZisoouHiY+cp5WspJ+Yp56ekpSjlqeZqJqUpqGkkJuomaG1uqirmZqPjHyBlIuhlIqVkZaRkJSYppCgm6qfnLajnaart6euwK2itqWur6+rqKixt6Ctu5iRpaSmtqKSnqegjqqgjpKfo6uvmqCjr6ivmKOgnKOqnp6enJarnZOZoZuUkJarmo6ZmZeRlp+SiaGelpWFko2RjpWLgH1mi4V1hnV4h4JznGqFj5STkIl9i5WSkpiUo5OfmaSFipqJfHOXc3uMgHN8f2pvZF5wamBbYFpuZFBgZVBaOkdHRT4yPT45LyomKykmHSY0MTY2Njg6PT0/QUFDSUpHSktMTVNTU1VaYGBpYWVWUEpBQ0I6OUVNVlteXltaXFtbW1xdXV5fXV5fX2FhYmFhYWBiYmJkYlxbY5eVo6eir7GrrqOppqyfp7WqkI+dpbW9sK6toqOaep6jsqSlsamXm7mmo5OZqpyOhoqJnKKPrp6ilaifoJKWmZutiqmWj6iZqY2ZqY+eubakpZmcjIh5gpSMm5OKlZKUkY2Sl6ONn5+pnp+4o3+Dr7Wir650o7yisZ93eJ+osLmUdayjnomAq39kXGJ2oI+ln4SXfW2Ss5yjp62qomWen5JzeZqXcICYqJhtf6KoimWcpp2SmJiWjZKckoaem5CWhJKHj4+SiYV3ao6GdoZwe4V/f2Boh4qUkotadZSQZ2iQj3N7qJycZnubiYR5mWqFjIRveoBrcmVfdnFsa2hcZmZiYnBTWz5OTk5TRz5AVUQ6MS8eHyY0OjMwNjY3ODw7PkBBQUZIQkdGSUtNU1RVWV1gaGZoWFBKPERHPDhVUltgYWJgXl9fYGFhX1xdX19gYWFiY2RhYmFhZWRjaGReXWablaajoK6wrKuppaitoqetpJKWq7axs6ebq6esl3OMnbCgqKunlJe5oKCPnKSdkX+JiJuejKyaopWnoZ2OlpKehHWtj4inm6mRl6SJnLqzqKCZmIuJdXeTjZaTipSRkZSNkJShj5yhp5mcspWAjJu1nbOMko66pqB+p6J6oa21gI6NpZ6Di4aQsaqvjIqXpJt6gIushpudoaeop4eVhZh3pZt6h5yBl6eCgnucsnqKhqGYmpWYloORl5eFm5lieoeQhY+QkouDbXCOh3mAcH+AhH6Fc4WElZF4lmiSdKCadX2ZhaOgiZh/lIyFhZprj46GbHh7cXFnZHdvamxrXGVramZ0XF5JVExSQEU2LlpVVTcpITA5Pj43NDM1Njg7Oj0+PkBEST9JRUpMR1NYW1lcYmFoZlpRSDlETDs+YVZeYmRmZGBhYWBiYl9dYGFhYmJiY2ZnY2JhYGVkY2djYWFonJein6asrauorKCnr6amqaWZlK/Iv7Gil6iptp6QhJ2snKeioI6Qvp6ajJ+aoJB8ho+Zl4esnKGWn6CRjJOJhoCRp42Ho52klJiehp66sqiempKOhXF2kImVkIqUkI+bjJCSn5KXoaWWnquHn7SJtJqtisqHqayItoWNsIGvrIKojKaYjZ19qI9ye3ecj6eXaJWkebSMn56mp5KYwoF/q4iYoXKegJqlfZeFlbKBoX2hlKGQmZeBj5Sci5mSi32Fk4eOlpKJg21yj4V+eXGGgIN7g3SEgJaAj8Vmf6mHj6NrnoWknYWagY6Ph4uacY+UhWh4dXx4aGh2cGhobF5kcGxnbllnR11STTNFNDdOYmQ3JjM8RUdEOjY0NjU4Ozg+PT0/Qk0/TklKTENQWl1cV2FeaWxcUUU9S01ASmNYXWNmaGdiYmJiY2NgX2JhYmNjY2VpaWNiYmJlY2FmY2JiaZSWop+vp6iopaufo7ewqaummpSgo6SrpJemq7ijr4ChqJ2mnp2JlL2Zk42hkp6PeYSWlpGHq5mbnJmhhI6Ld5ucj5+QiJ6knJaamIejua6lmpyMjH5ibY+Lk5CNkI2NmIyRkqCPlKGhmaGnfqGnh62doJatj52cnJCFgKCMqa2Fo42pmYyaf6J1gJmUa4Ktdk2reIeNnJGaqKaAqat9g6F7eqdqnn+Sa2eXhpe3iZ5+bmBkWYOXgI17ZGiLcpl9eZZsXX2XbV9ScINcX2t4gl9YZIF8g3+WcKeqa4OjbnKlcJ+FoGpnoG1bb4x9Z1pghIBiWFBvd2ZtdHJram9danBsbGpZaU9dWUY5QTVIRF9sNSxJRFJNTj04NDg1OTs2QDs7PkJPPlFSTE1CSlxdX1ddXmJ1YE1EOk1PTlRiXFxmZmlpYmJkYmRkYmFiYGJkY2FjaWtkYmRkZ2RiZ2VhY2iXlZ2guKCpo6askaC2u6quopmYoaKlra6hnq+1o6iSoaCgp5yajpm0mZCLn4yVi3WBlJKMiqaVlZmenn6ShYWspIebkIqZqZmam5KIprGnopaaiImAaW6Ih4uOjoqLjZKMkZOjjZSfoJyhpH+TgY+ioZSgdpyVj6eCoKZ/haerg6V4iXyEmn6icHOUiJZ8n415bYabjJmPm6iZjoede4Kic3amZp5+d6RfmHp9k3Sibpi3tLp0k4iDgLWoZIHGuHtwlbaMcoCao2JzrKtgfGmds35tfIaBjYKLmHF/o2xyo3SfhYGkYZ2Zs5ZyfZifs3VzW56yg2pib3R2cWlvWGtscnNnXWleYkxFPUQ2UUJaczM9U0dgSlI9PDM5NTo5NkQ7O0BKUD9VTU9RQEVfX1taWGBgfGRIQzhNV1VXYmFaZWZra2JiZWFkY2BhYmBkZF9gY2tuY2NkZGhkYmdmY2hok5WUo7eYqpuTn42ktrStraCaop2ko6aunZyyrqyTmKKaoaSZm5Wfq5uLiJJ4i4VxgJaOipChj5KUnZh9kImNqKCHl46JkqSUnJuNi6mopZ6Ql4eFfmp7h359kI2Di5GRiZCUoYOXnqCdoJ6LiXecmKKNn3Ghioeph5uljpSmqX2tjH56oJl6o5N4gXSWiI2cfZafhpuOmJulhaJkoXyIlpCbjW2eaJuOb5qZeoCLp31yaXSrg5+DdKpolZpdm4V2hZ5nqmuAuGZcqHCBnGCVjF6ndnWHiH6eaJp1hpOSl46An2+akW6nml2pf3m7a36qXI6EXbRnXG5yenhraVxxanh5ZGBmWGJCUUZPN1dDUm81TFtbX05aREEyNTE8OzZIPzpDSFU+WVJZXT5EYl5WYFFhY31qRUI5TlteWWRmWGZnbm1iYmVfYWFfX2BgZWNeYmRvcWBkZWVrZWNpaGdraZWbiam0mqeIY5Sbq7mxsKyeppycqaCfr5yesamtnpekm6GgmZeXoKOZhomNaoiAcnuXiIyWloSRlZiQeoqElaOcipSPhoyfkp2diZCpo6CajJKKgYBpgYZ5f5eMe4mOjoiQl5t/lKOfoKGTmHJon4mfj4xwkoyBqYeYnqGlnqZ7sK2joriXd6Ozo6SAiJR5nXurmX6ijpyaloiXcaF8hY2vtX1rmpGheX6YtaKkq6iEmXybfZ6bf3SqWl1ve5aLeJ5iTH97eoVjeZdCTJ9Yompxe45sgIiEmXWbeIaJsbN/gJuTp3eDnm5zfZVwmnRrpF2VdkhlZGB0cX5+b2ZgbGl2fGVlYVFfV11UV0BaRlFoRVRXXWJYXklEPUI4P0I6SUY4TEVYQVdSW1ZERmJcWmBLYG1+ckVCPFVfYlplaVZnaG1vYmZnXmFhXF1eYGhiX2Vjdm1dZWdma2RmbGloa2mTnICwrZmEU16gprO5srKpmqKMnKycnKqUoqyko6iPoJ6dm5qWmaGdloiHiXeGgW95lYWRm4t8kZOWiHKAiJKhnHORkIGJmpWhm4WPqZyblYuLi3yDbISFcYKhjHiGjYiIk5mWfJOkoJ6iiK2GfbWEjp6de6WWeqmBlZuPiZ+bfKdod21+mXShc3J8nYaZcJODrn2kg6WdmYCjb16pZ3WiY2+lYZzTkH17mXhzc2KihpB+o3SkkHZrj7OMYIKYiXOqsqi8f3eDbX6/pqm0XZtufHCWbX9yonJdpGdzpmBopm2b1Jp+hptwenuYbJx8eJdzbqmkZ2BlenGAhWxoZmRudXhoYGNTXGZRUWJIWUpVYVdUXGZrXGVRRkNLTUpLQktFOE9AUU5YU1lPU1FgZmZqUmN3eXdJRkVjXWVaaGpUaWhqb2NqZ2BjYFxdXV9oYmFpZXxkXmRnZGtkam1naGxol5p/r6pUXEt+qa+xs6+yo5uZhZmpoKGkjqapoZmqi5uZmZSZk5KhmI6HhXtwfYRofY+DlJqAd5GOj4lvf4aPk5Jsl5N8iZKTpZeDj6ublJOLhol5g3aHgG6Cn4Z3gJKGiJmjmHuUo6SZn4mzoaK2i3qsp6SupXCpgJqOhYCakHukgKGZhphynoSkrq+Kl4yAjaSNlYOtoJN2tba1yaFzlIuBn2Cel6lteZaHoJt0ooh3oH6Tl4uBcE1mo5Jwm4dzpHt5dGGDgWt+oGtxZF+ccX1zlmh5abO1tMamc5h9ep1rnJurdoWbbXZ4mGqae3WYclFFfbNfanZreohma2hjdXVxbldfVFlpUFNoSVdNWVRWXmlsb1ZoV05LQUpNS0hKT0FRS1BlY2ptZXRyc395fG51iXt7VFFPbF5pXGtpUmpoaWxobGZjZV9cXV1eaWJkaWt7X11kaGNqZm9tZWlsZaGbiK6lg2Q/k6Gyqq6vtaKikICXqqKjpYylp56dpoObmJeOl5CPnJOOiIN6anmHZYONf5igeXWPiYyBaYSFkoOMhZ2NeY2LlqaThJmqmI2Si4GJeoB9i3lwkKGGeYCVh4mWoJZ/lKWonJWVg2ZueJxsomR7caV3m5hwZ6aAlYp6pHqfloOXc553gYqVl4+5bpGKomJ9maCViG5yaaprdaBtb6Zgm2mLkGmWh5uWdaKBfppgjIaNdXCIYmigZZ5+aZt1b2NmiIFtcaJaXltioW1diItuen1zcmSlbXiiZGenaJlzjJlwom9ViZBvoF9mqFSLXlSYbm1za3KCbXBpbHl0a3BSWVdXZlpUbUlZT11JWGlpc2tZbFdRUkZWXExYU2FVaWtfd3R7fXB8fHKDe4Bzdo2AhHZeUnJiZ2NwZ1BqaGhrbG5oZGdfXV5dYGpiaml2dV1cY2hjampzbWZrbWOco5eleWRzbYumraOpsLGmn4uAmKudn6aMo6Kbo6KBlpmUjpqQi5iQjop7h3GAiGmLi3yYm3N1iX6Qe2SDh5WKipWZgnyIh5eokYGjrZGGkIuCin6AgI5zaZCmhH2Gk42ImaCPiJOppp2IpniVm36kiJaLsZidkIKvl5+ldpSGeKlzpY+Emm6kooyShI2Du259pa+DhoWGk5Wcn3ylenKolaCWZ55+b6xkloqWk3eobaqigYl2iYN3q5GmiGuRsGt2s4ypa4qFbW2fnpKVYH6ri6p2fn6LpZ52n3yDpJWdoGqbiHisaJ6tjLZ0d76NpJNag6eOq2F1cnRwfHVxY2t/b2ltU1dbVmFiXWtNXVJdSl5tb3dgW3FZXGBbZ3Rlbm9yY3J0YHd6fnlyeYNzhH+Be3uMgYKAdmJ4ZGNucmRSa2dob2xyamZpYWBeXGFrYm1sem9cXGJpYmxqeG1nbG5ilaSpnIF/naOWqamdqKaupJmKgpismp+lipumnamdhY2bkIeckYWSjYyNdId7iIRvjYV+mJN0dIZzkoJtf4uRh4aTjn17goaYpo5/p6ePgY6JhZV2goeSb2yLqYGDjJSOiZ2fiYyUqqKfj4B1lJeIfoF5lK6if4GbcY+Gd46Jgn17cqeMcn59epiWm4SQeXt/foeUlZOKdpCYnqCDe32Ja4yFW3l5cnpxaW5+kolxgHWBj5STcYeEgmWMf1+Bf4t3dHKUdW95bm2HbISFXnVnd45lgICFjaiafXR7lWqJiHCBdn2Hd25uaIxzenyYeIVcbFh5j2lveHJxb3h4cF1rh25qZ1ZbYFddZmtkVmNVX1FfcHl5bWt3Zmtra3d9cnJ1dGFvdmJ0e4J4dXqCdYCAgIF4i4WDfXtuf2xkeW5eV25naHVreGppamVcYFpjamVtcXRuW1tibGRsbHluaGxvYY2Tt6imiaCimqajmKScq6KhhISYrZKeoYmbp5upmIOCnIx/lpSHjoqJjXKDfI99fo+Fe5iPdHKEcZWFe32Si4aGj4R5foCHmqWOfKiijIaQkIWVg4aOmHdyhKmGjpKdkImfnoiMm6efn6qEiY6Vmn5+iZatp4+Rpo93b5uPgXiQbn6ohXF+lXFrcH2CoI2Ak46LaGxcgouLm5qejnOVi4hxdGuCd3SBWXJuh5GBfn+Mal1qZHuGhImAYGl4epp7goqBdYGFgWd3ioZqYXBxgXRecYqBiI6llIVli42DbneLhHGGj3pxaGhlfIR7lltca2hudlt8eXh1bnNzg2dcbYtra2JaWl9bWWxxXF9hWl9dZXR/fHZwdWRra2t8fXN8eXVkbnVobXx+d3p8e3l6gIB+b4aKhHt9dH55c39oVFxxaWx2cHVna2hkXWFYa2hra3FybldbZW5sZ3N6b2hqbWCLiqmwoY+ioZqenZeemKijon6Dma6OoJWInKKRpZV/fJiGfZKZiYmGh4pzfoGMdoWMgoSXinJvgHKYhoN+koOEhomAeoGEjJyhkYOnooh5jpeJlYuLnJeEg3qtgpGYmpWKnp2HiKGqn6Gio4uIk5uco5mVqqGnpp+SmoeVjHp2jY2Dp35/kpCTlJ2yppuVn5CNsZKXg6WMjJWan4mQm4KIkYprfI53eGWDh5GLfImehIeMkImIgYWEkHd8enSZoIiGiZ2JhJN+fYqAgHVvcoSCfneFhoqPpZCChYyGgoyQjH2IjIqRhHptg4V+eplrc2lhdIpxfnp3d293dIJdXm+HaG5fXlpdXVNoclZkXV1ibGh2fH10b3Bla2ppgH1ueYByanBxbGeBe3KCgHh/fX+Ee22CjIZ8enh7fXqDeE5jdmpzbnB6ZWtlY2JgW3RmcGdycW1VXWx0bWl5enFnaWtkjIecuZ6WoaCYlJiZlJikoJ58f5qsj5+OhqCdi56WfXmVhHyOmYqGg4SHbnmBgXOBiH6JlIRta356l4eEg5B/gIeEhXyHhY+cn5OIrKCEc4uQhpKRi52RfY17qoSOk5iWj5yWh4ebpZ+imp2FgpKampiPmaafpZ2cj5V/j4h1e4aNhKV7fI6QkYaZq6KelJ2QjqmNkICdjIiTmZ6Cj5d+h46Db3iGcnVgf4SQhnWNmYGDkIOHhX+FhJVueXZ0kqGKi4Wag4SMc3+Je3xycXqHgnp3iY2DkaaPhYOOgIOKiYp3homLjH5xbX+CfG9obG1oX3p/aH58dnV2dXt4XF9xfm50YGNbXV9SZ25UZVteYmtpdnp/cmxtZGtqaIF/bHSBbGx1b3pwhnluh4B2goB+hXZygo2Ifnt8fH97gopgaHtqdWlpgmRqY2BpXGN1aG9idW1sVWNxeWVwentzZWptbYuJnraZoKOfkpGVmIuanp+ee3ifp5Gci4ellYuYmXl6jYV8iZGEjIKCg258gHlzgYV+i5F9a2h9gpeJgYiOfH6GhIZ8j4KQnZ2TiamdgXGMi4yShqChioWMfKiRiJCSl5OWk3iNo5+gnZaZf4CQm5mSjJqioKOZl5CafYyDd3+Cjoagf36MjI98mKShopOakZCmjI+BmpGJkpebfpOSfoeOgXV0gnF3YX6AjoZyi5Z9iIxyjH+ChYaPaHhyeIuYkY9/ln2IinKBhnt8cHd6ioJ4eI+LgZSlkouFj3uFhoeEdoOEiYl8Z3N9gHl7cW1rZ19+c2h8dXZ0fHOAal5gdHZwd2RjWV9fUmtpVWVZYGFoanZ5gnFna2RsaGaAgGtufmhvcWx+eYd6bIyBc4GBfoF0doKNhn98e4CBfX+PaXKDbnRpYYdobGJfcVZ0b21tYHhobVdqdHZjdXp7cmJqb3qJjJ6xkaWknI6Pl4+GnKCbnX13paGOmICNo4uImpZ5e4aHfoOJf4mCgX9yf3t0doOFfoqReGdjfoaXioKKjHl9gI2DeZaClpmYjZehnH9wjIKRk4alm4eMiYOmlYWTi5aYk5J3kZ2goZeUlnl+jpiYjpaanKOdmJKUmniNhIJ3g5WNnX6BiY2Mc5ejn6KUmY+PooyKgpaXg5KWmX6YjXyIjYF2cX5ue2SAfIuFcYeTgJGCbIeDgYCJhWZ1b3uFkZeLfJJ3i4h7f4Z7enF9d4iDeIOPh4mXoZWBg4t2iISDgnd8g4qHeGB6eX50f3hnbWVhf2pqd3N0dn5xfGNjYHNudXJtYVphXltsZVJjWWFhaGt2eYZxY2tjbWZofINtaXVobnBpgH2CeW2QhnKAg4N+dHyDjIGAfnuCg358kG12iXN1bWWKbGpiYnZWhGlwbmB4Z2xianZwZnl8enFgcmyGhY+brZemp56NjJeHhp+Tl5l+eKqdi5l6l52LjJiQeXyBjH58hHyBg4F4dHl6dH2AhICJi4BkX32LlYd/hYZ1fX6Lf32YhpeVmI2kopmAc4d7k5GJpo+MjoqToJGDkpCVl5GLgY+Xn5qRkJBzf42SlImdnZ6ml5eMlJVyi4yJa4SXj5l6h4iPiW+XnZqklJWLjJ6MhoGRnH+SkpWGmYh7ioqBeXF6bHVsfH+Lfm6Gk4OVeHGChH5+i4Blcml7f5aXg36Nc4+HgniGfXV3f3yEf3uCi4OKk6OPeIOBdImHfYB0doKJhXBifHZ7cn1wYm9jZHxjbnB2c3h3c3RidmBvbHZub1xcX15eal5QXVljYWhudHuJbGBpZWtjaXeHbmdsaWttaIF9e3dvkIhzgISEfXSBhol7g316gYR9fY5yeot4eG1sh2poX2lyY4dncW9ld2dubGF5aWt9e3hwYXhti4CYmKmfpKidioqShoqdi5WYfnivmY2XfZ+UkZeTiHd+e4p9fIB3eICAcHV0fG+GfYGBin98YVx+j5GGgIODc3uAh3qPkomTkp2VppyWgn2BfY6KkaOIjoqNmJqNhpKZlJaOioiMkpySj4yMboSQj5GInpmioJaViZaQbYeYg2WFmI6TeomEkIpwlpqUo5OSiYuZjIF/kJ19ko6SjJmOe4qFh3NzdmxxbnV8inRuhpGPk3F1gXyBgYh8ZXBseXyZk3yDiHSQiYBzh3huf3yAhXuEi4eCi5SnjHqGe36KhXd+cXCBh4VmaXp1dnF8Yl9wYWt0X3Fqe3l5bHNwZXlebmxzbXJYW19gYWtbUFdYZWNncXF/iGddaWlnYmdxjW9kaWhlaWmBend1b46FdIGCg3t1goiFeIV8eISFen+Jd3+Le3tyeINqa19waHSAa3JvbXJnb2xlfGNugHp3cWx3d4p+opehp6Cmm4eLi4GPnIeTnXaCq5WTjoehjZaUj39zfHaFeHl/c3N7hmtzcHpui3aAgYhvcVtZfpGNh4B/f3Z1gICAoIeSi5SemqKVmHiKf4GNiJydio+GkpiWhYmVmpCXi4uNjYyciY2Qg22Ji5CRip2WoZuXlIWXh2mDooFlhJyJkH6Lg4uBd5OYkp+TkYmJlI1+fY6Xe5GMj46aknyKgIJvdnBsbW9we4ZpdIOPmYtxd4B1goiDeWZybnWAmY57h4N5k5B5dYdzb4d6hIp5ioWBh42aooZ7g3WCi393eW5sgYWDX3R1c3FxeVpfcWFwa15wan17cW1tam12YG9va3FtWVliYWJuWFFUWmZnY3VwhINjXWtuZGNma5JuYGdnX2hrgXVyc3CLgHV/g4B5doCLgHmFf3iIhneDhXyGi397dop/anFjfGOGfG5xbXRqaG9sdnhfcX95fHV1dICDfqSVmqyep5aFjYR/l5SDkKB2jKCUk4eLm42Wjot5cXh0gnByhXRxdohscG52bYh2g36Abm5VUYGrlYeDeH93coN6g6CCk4KVlJqdk5t4knuDjJKjmZOOiZWZkoSHl5mMlIuJj4+HnYSQinxzi4WKjoicmp+blZN/k31ohJuGZ4Wfh5GEkYKJcYORmJCcj4+MjI+Md3uRkHqOi4yRlox8iHyAa3dqbmtsbHt/Ynp+j5eBdnuBeIOMfXlnc2xzhpWLfoeFepOPcXmDb3aLeYiKeYh8gYqPnZ2Ee3p2got8d3FqbIKEe2F5cW5tcnRWX3BicmFgbW96cWhvZmZzdGlxa2J3ZV1XZmBgclNRT1xmZV15cIh9YFxpcmJiZWaRal9oZVtncH5wa3F0in12fIaAdXZ+jHl7hYF4iINzhoV+jIyEfHmVeGZya4NgiH5vb2t6YGpudH91X3R9eYZ4dHOFfXigj5mwm6WOgot/g5qIgIyfgIualI+FiJiOj4+EdnR3dIBxcIV0cHKEcGtpd26Dbn19bXVzUk2C38iS1pN7cHWEdoSgg5R3lpGZnZGZe5RzhZCeoZOTkImTnJSGf5eWiI2NiJGMh5t/joB3eo1+iYyKnJucmpSSeYx1ZoeQhWuHooSRiJeDhmOMkZmPlYuXjIyKinF6lIh7joiKkpGJeoZ8f218ZXNva2x6eluBeZCQgXp+f4CGjnt6aHJqc4qPiYGFhHyUimt9fm1/i32KhXyDeICOlJmZinx1d4OPeHJtZ3GAhW5rdXBoanVuU19vZXBaYGxyeGdramJmeHJwcWNfd2BgVmtfXnZQTkxhZ2NdenGJdV1cZXZhYmVljmRhZ2JZaXNzbmtxdox8dHqGgnV2fotzgIZ/e4l/comIgZGLiHx+mHZlc258ZYh+bnBsgFlsbnl5c2B2enuNdnJ3ind5noubrpqgkIKFd4iVfnyKnoiGoJKPhYyYhJOOh4F0eHB5cW+Eb21vf3NlZXlxfW16fWpoa2OkmsHcrvChc2x2hHaFo4aTcJeRlqGVnIGScoaLopeJjZWKkJ2Wg4GWkIWJj4CRiYmWfod6dX+JeIeEjpyamJiOj3aJdW2FiIl8iaKDkYmchIVei5OXi4+Jj4uLhIlte5aBfYiFiZGPhnaGfn5rfWR4dmpueXNYiXuSiIV6foGBhox/eWVyaX+JjYmCgX6LlYRrgXVth4+BjoN9gXh+j5SSmI90cneHjHVzcWd2eoRjdW5xY2p2aFJhcWdsVl9vdHphcmRgaX1wc29bY3JgYlZuWVx4Tk1MZGZiXndziW5cXGR5Xl9lZYVgY2NfWWpza25rc3eMfXR3hIF4d3uJcYOEfX6Ie3SLiYiWhox/fpdzZ3VyeWyMe250cYFXcXp2eXJld3mHjWl2gIlyf5yGmKabo5KEfXGMlHd5jJ6FhaGNj3yWjYCZiIR7c3dwdGpwgWxpbXx1X2F4d3xxdXxoYGR869q1ycPch3NsdIJ3i5uJj2qZkZCelpSBiXGFiJ+NhIuVioyYlHyNk4iDiY97j4qFj4F/dniDhHKIgpOclpSXhYx1hn5vg4GHhpihgpOMnoOJYYOUj4eKhoqOh4GHaXyTf32DhImOjYJyh39/cXdodnNqdHdsWo19k4OFfYCEgYSKgnZhcmuIgY6JgX5+kZB9bYFrd4SOhJCCe4B8fo+Rj5WIbnB5jIV0a3Fsc3mCYXVqb11sd2FSZXJpZlNgcHZ1YXBgXWiDcXNrV2doYmlYbVZbdUxLTGVnXmJzc4VqXFxleV5eZGd7YWRfXVlrb2ZvanR4in5zc4F+e3Z6iHOFg3x/h3Z3ioaPmYGMgnuTdWx3dnl4k3RueHt9WHmGcYBvZ3l3koNkdoaFcIqWhZmgmqKKh3Rvkoxxd4+cfouaiYl9oH+DmYCBeHJ0bm9kcn9pZm14eFxgeXt7cXGAamFnYX/Vto6RpnhucXd8cZORjYhrmo+JnZOMhntph4uZhoGSkYaHmI58jY2BgYqNfI+MfYmEenR6g3txhoCWmo6Tk4GIdYKFdIJ/iZGcnYaUj59+iGJ/k4eFiIWLjYCAg2d8kIB+f4KMj5B+bYN8g3VsbXd1dXh2bGOOgY+AhX59hn+EiX9wX3FvhHuOi4F7fpCIeXCDZXmBiYWKgXqEfH6SjY+Rg21ueYt+dW1ua2x7f2RpbGpZbndaU2pzaWJRY3J4bWNmXlpqg250YlxoX2RsX25VW3BPSE9nZVxnb3GAbVpcY3NgXGNsd2VlXV1aa2xjbWpzd4Z/cXB/fH10eIZ4hYJ8gId1eYmBkpV8iYZ2iIFweHl7hJNvbnuBd16DgHSCbWl6dJRzZ3OIfHGSkYOZnpughoh2dpR/bXeUmH+IkISLjpp8i5p3fnZxcGxqYXV8Z2JqdXpbYHh8em1xf2VjaGdXnY9fcXOWvMSEd3GUipCAdJiMh52UjYhza4iPlYB7lIuBhJuMfIqGfXyJjH+Th3SIhXZ2fYJxdYaBnpWGlI+CgnF+h3ODeoiWm5aGko2cgIhmfZOCgIaEiolygX1nfYt7eX9/h4uPfWmAfYR2ZnB5eHR4dGxrj4aLgot/eYOBhISAa15wd3p9i4eFe4COf35ygGh4gYaJhIJ3gnp/louOi3xta3qIfHZ0b2lofndlXXFjWHB0U1Rvc2liTmh1eWdhXl1Yb4BvdFllY11qbWBwT1lsUkRUaGJabG9te29ZW15tY1pjb3dkZ1xdYGtqY2xpc3eBg3Fufnt/dHWDeoSCfIKFdn6JgZaReIOKdIGIc3l5fo2Qb297gXFqgnl6fm5tfHaWa2p4hHRrk4yFnpigmYWIb36Mdmp5mY+AgoqClpiKeY6Wb3pzcWxqZGB0e2lgZnJ7W2FzfXpncHphZWSOsbJ3S2JapdrRl3J7koyReX+WjIWako2Gb2yFkpF5eZOGgISZinyHgHl4iYqElYBviodxdH17anmGg6WRhJOMgn9ufoJ1gneEmpeSipOPlIWHcHqShH6DhIqDb4F4aICFeHJ/f4OKh3xlfH6EdmNxc4BqenFvdZmNhoSLfHd5gIR6gmtcb3xyf4aDiH2Fh3qIcYBtcIKFjYKDcYN3f5eLjYN3bW1+g392emVoan5yYVp4Wllybk5YcnRmYEttd3ViXlxbWXV9cnBXZ15manFfb05XaVM/WWdfW3BrZ3lxW1tZa2VZY3B5X2hdXmVsaGZsaXF4f4dvbX99gXZwgnuAgX+Df3aBhYmXinGCjXF7hnx6eYSUjHVren9scH50f31vcnx7lHBvgH95ZpKKgqGYnZGDhmeHhHBnepeKfoCFgpmKgXyNjWl4cmxsZl9hb3ltX2JveVxkbIN6YXF2X2Rl1eu+izI6PouOgHJ5homPjXeFmY5/lI6Nf25thYyLdX2Pf4WClYl8g3hudoeFgpZ3boeEa3V7dGV5g4SnjIOPjIN9bX9zdYJ4hJqPi4+RkoyLh397kod4gIWNg2yAc2mAfnhtfHuBioN4YnmEgnJkcWl/bnZydYKcjIGAhn90dn6Ac4FvWmt9c3iIgYp7hn98iHd5cGuHgo6CiXGAd32UiYp9dG1qdoCAdXVcaWl5cVpXfVNacmZNW3NyZlxKcXhwXVtbWl11f3VpWWJbZ2VuYmlNV2ZRPV5mXV52Zl91cVtZVW9kWmRweVtoXmBnbWdqa2lweH2ObWqChIB5boF7fYF/gnp1goGMk4VwgItud32Ae3uIk4mAaXt+a3R8coZ7c3d9f4x6eIR+fGuMjISbnZaMgoFsjX5raH+Pjnx+f4OUgn99iohrdXFnaWNbY2dzb2BhbHRhaHCJemFzdF5iY5ugkG5cNVqvtXVqgIp+k4d3iJiHdZCMindwbYWChnR5iXiJfZOIen9zZ3WIfn2Xb3GFfWh2eW5leomFpYeAh42JfW19dH5/e4qXhoGSkJiJi4WKfI+Jcnx+hXxpfm1rgXt5anp2goeBcmB3gn5yZHJndoNudXyGlZKCfYKAcHd6fHV+bVhtfXVzin+GdoZ0gol6d3JtiH+Of4NxfXt8kYeIem1taG2CgXVuXWhmdHJSXHxOXHFdT1xzcGRWS3R5a1hZWVphcYF1YV1dYGZkaGhmTlpoTkFhZFxgdmFcdW1YWFN0YVtlb3JXal9iaGtnbWxpcHd8k2xphIp9fHB/fnuBf4J6d4CAiYuEcnuHb3F3hH97iY2PhGp+e254eXeKd314gIKHf4R+fnpthIyImKONhYR7dot6a22FiZJ5fXuCkoCAfYqEcHJwY2ZeWWdfcHBgYWhwZmpviXRhdG9bYGRqdnt/vpynpMm4coWEc5R9eYiUhHSSjodyc3CEeoJzdYZ0iHeUiXl5cWR3hnqAkmhxhHVmd3ZkanyEiJ6CgH+Ojn1xfnKDeH6QjoJ3lYyUkIiCiHqJiWx5en91aHppbH95c2l6doCDfWhgeIh9a2p0aHuBanaCjZGVf3x+fnF8dnx0fmJVdXtxcoiCgnuBcIaJd3hvb4KBi318d3x7dI2EgXVocGdsiIJycF1oY3RvTGZ2TF5vVlRadG5iUU90eWJSWFhdYXCCc1thXWhlZWNqZFFbcUlEZGJcZHFeXHhoVVdWd15cZm5oVmxeYWpnZW5uaHB3epNuaYiMeX1ze355goGCfHZ9g4iGg3B2g3Nud4KCfoiLlH9xgHx4enqBi3SDeH+BgYKEeoB1b32Ki5ueiH6Ge3eGe2d1h42Ren+AfImGhHaPgGdwbmBlXFhmWW1zYWFhcWxsaIluYHNpWF5jbYB3qdqpx4aIs3KKeXCOdn2IkIF7lIuAdXR1fnZ/b3B/bYV0lIZ4dWxgeYF5iI5lcYNvZ3VuW219gZCTgIF5kpJ9d3pshXR/j4qDcpWJkY+IhoZ7f4ZtdXZ/bWh3Zm18dm1qd3Z/f3xgYniGemh1dmN+fGh1h4+Oln11gHZygHp9bYBZVnJ9b3OChn5/d2uIhnN4anR/goJ8eXt3eXGKf3tyZ3NkbYuEbHNbal92Zklvb0xbY1hXVnltYlBTdXZZUVZYXmByhG9cYGNtZGNdb2NUXXJHQmZfXmZpXVp7Y1JWXHVbW2drYVZrYGBuZmZscWhwdniPdGuOjXZ/dnh9d4GDgXt0foOIiINvcX91cXV9hYGJjYt7d394hHx9hYd4h3x9gX2EgHt+cnZ4i46fjIl7ind1g3pefoeajXmHhHSGh4R3iXtibm1cYltbYVVqdGRgW2hvcGeHcWFxZldcY2t/fMrOh7qia25vi21yhHJ+hot/e5KFenl0enV0empsdmOEdpKCdm9nX3yBeYuIZXGAampxY1hte4aciYOCcpeTd317bYZvgImKhnCWjpCIhoyEe3l/cnJwfmdocmNueHFqbHF3fXx5XWV6gHhpdXlngndodYiMjpV9c4dqb36AeG59XVdwfW1zfol7gG1uin9wdmZ2fn9+gHV7cHhyhXt4cWVyYG2LgWtyWGtfeF1JcGxOV1ZfVFV8a2JPVHZyUVJUV15idIZpXWBramZiWW5hWGNwR0FoXWFmX1xWfF5PVmVxWVtqaF1YaGFfcmZqaHFncXN3h3lulYp1f3t3fnmDh4B1c3+FhY6DcHB7eHd1eYaFh4yGenx/dYt+fYaEhId/fn59hn98eHZ5dpKUn36NfYtudYB6ZISImIZ0kopvhYWCeoN1Y25qWV9bXV1VaHNlYFlkcnJngXJha2RXWl9pf3i+rnqfuG5idIdpdXxyeoSHe36NgHd4c3dvenZlam9hh3WOgXNqYl59d3iKgmVwfWhra1pWb3iLpIGFf3CZknF/d3SAbH+Aj4Zyk4eMiIWJhX15dXNvaXlham1hbXZqZ2treXd6d1tnfXx5ZnJ+boV0ZnaGjYaWgHCLZ2t7g3RsdWJbbnpqc3qKe4BldId8bXBndH12fH5wemp4eX94d29lbGFsiX1sblZqYXhWS2tsT1JPaU5ZfWhiT1V1a01RVFVeZnaEZ11hcWhnYVdpXFxraUpFalpiZVdYVXlaTldualldbGVcWmVjXnRmbGVxZnNwdIF4cJmFdn9/eH98hYd9dXSCh3+Vg25zeXt7c3KFhoiIhHmBfXaPf32EiY6EgYN6fouDe3d8d3aanZh6ioOHanZ+fWyEhpWBco+CcYaCfoKAb2ZsZ1hdW1xbVGVwZV9YY3J1aXZwZGViV1tbaH9wb3KAc4plZnp/anV3dHSEhniChXp3dHZua3pwYWhrZ4Z0jYRuZl5ffG96iX1obXdmamRWV3Nwjqd9hHx2lpBze3F7eGx5eo+DdZd8iIaDh4R9dXFzbWh1XW1pYG11ZGdmaXpve3NZZ4F2dWhwgXiCdmJ3hYt9lYJvjGtte4FxZnNlX2t4ZnF1iXp9YXWDdWlrcXR5b3h3cntlfH1+d3VuY2VgbIZ8bWtWamNyVExqa1BMT3BIXnxmYU5WdGRLT1RYYWt3fmZdZ3NpZV9XY1djcV1LS2tYZGJVVFVzVk1ZdmVaX2xgXFtkZV93Z21icGl0b3F+dXSZgXh/gHiAf4aEen12goN+mIVucnR8e3RxhYWOgYF6i3V0kIB9gZSOgIWEfH6Mhnp+gXZ7o6aKeYmGhWx1fHx1hIONe2+Fc3qFfYKDdW5qaWVWXVtbWlNjbmVbWGJ0e2ppbWhgYVdeWmmAaWxvgGdtYml7emt0dXVvhoJ6gX53dm57aGp5al9lbmiBd5CEZ2VYYXZpfYZ5bmlvZmZdVVhvaY+od4F6fJCOeHRufW1xdHiNfneUdIaDgIWJdmpzdmhpb1xtZV5uc19nYmp4aHttW22Dc3Rqb4F+endhd4WFepGGc4hycHp/cmNxaFttdmRvcod6d2FygG9naXhzcWt3dnN1YoJ6fXZ1b2NiYm18fGtrVWliZ1RMbmhQSFJsRWF5ZmJNVHJfSk1VWWVseHtmX21wamNdVmBWcG9XSlNoWGdeWE1VbFRLXXpfXF9sXV1bYmVgemhsYW9vdm5vd3V6mH13gIF5gICHhnp5eoN9gZOEcXR0fnp2dIWIkH6BfZFsc5WBe4KfhX+HfYB+hoKAint1hKyff3qIiIRscoJ6doGBgnVuh299gHSKgGpvbmVkWF9aWlpVYmpnXFpfdYJpXm1sXGFXW1xrgWVxdX1pal5teHdodXhzbod8fn56dnNsemhpd2ddZHNneneSgWNjVGRvZoGEdnZmaGphV1ZZaGOQqG9/d3+Kjnpwb3tmd215inp2jnGEfX9/h25kd3RlaGldbGJecHBbZ19tdWV6aF10gG5ya3F7f3Z1YnWGjHyJiIB/eHJ1fnRhcGxYcHJhb3CDenRjcYBrYGx6bmloeXdzcGSDdHh4dHBkYGNtcn1qbFRpXl9VTHVjUUdXYkdjd2ZhTFRxWUtMWFhobHZ6ZWRtcWZjWlhdWHdnVEpcY1hpWFhIV2VRSWN4W11fbVteXGJkXn9pamBvdHhtb252g5d5coGAfX+JjIZ+dXaGeIaMfXR1dYJ5enqCjI59f4WJanSWgXuKnX1+hXmAe358holzcY+ujHx8h5B+ZnGIenR+fXZyb4ZsfH5tkHpjcHBiZV1lVlpZV2Nma2BdXXOGaVlxblteWFpcbHticXd2bGNcbnR1aHV3cW6GeX+Bendvb3RlaHRlW2d1ZnZ2knpfXVNlZWqCgXN8YWNpXFRXXmJkkKVpeXSChZB4bG15Zndse4N5dIdygXh8eYBpZXdtYGdhX2tgXnVrWWZdb29iemVbd3xrbm9weHl0dWVzg5OAiYOJenZvcn1yYXhjWm5vYG9wgHpzZXGAZF5tdWhjZnh6cmttgHNye3FxYV5lbW59ZGlUaFlaVU55X1JKWllIY3VkYUpVblVKTFpXaWxye2RsbHNiYVlaW2F3XVRLY11ZalNWR1lhTkhqdlhfYW5bW19iY12FaWhibnh5bW9qdoGQeW6DfoCCkoiEgXZ1iXSMhnRxdnaBd319foyPgX+TfnB4loN9mZJ5gIB4eX5/c4eEc3CZont7f4mWeWV1iHpzeXdsdHB/bHl8cJJzXnBvYWdibFRbWldpZG1mXFxxiWVTcm5bWVhXYGt1ZGp1ampfW250cm10dHVrh31/gX13b25sZGlwY1trcmR0do5zXFdUY19wf35xgVxiY15TWmFcZJOfZXJxhYOQc2tqeGxubnl5enGAdn9ze3p7ZGZ2aF5jW2FoXF53aFdiXnBoYXdhW3x2ampybnh0dHRpcYKWhId/hXZzanB8bWZ3V1tpbGFwcX94c2VvflpgcHBhXmlvfGtqcn1xb3Zpb2BbZGtse2FmVGdVWFNRd1xSUFlSSGRzYmBHVmxRSVBaVWtsa3xlbW9yYVtaWFlscFdTUGZXV2lTVEZaXE9Jc3VYYGNuY1hhYWFejGpjZW16eWxuaXZ5hntrhH2AhZl8goR5fYhtj4Zxb3Z6fXSCgn2Lj4ODl3R4gpSFgZ+JdYF/gXR/gnCHg3Zvopd0e4aMh3tmd4tvbnxwZ3hxe2xzdnONa150b2JnZmtTXlxWaGJsbFtccY1kT29tXFZXVWZoc2hjdGVlXlpwdm9xdnZ6bIh9gH2Id5BzY2Rrb2Fcbm1jc3iHa1pUVmJidnx8cIRcY19jVFpgWmOXlWNucIKFiXJpZnluZHJ1cXpreXR1b3t/dl9nc2RcX1diZFlhdWVVX2BtZGFxXV1+b2hpc3F0cXV2bG2FlIOKfIVxcmdufG9xb1JaZWlkcHJ/dXNibHVVYnFqW15uZHtka3R8cXFxaWxfWGRpanheZlVkVVdRVm9YUVdUUEhlcl9hRlhrT0lZVFZuaWR8aWt4a2FXXFVbdGRTUlZoUVlnVFNIWltQTnl3W19lbWpaYmFeXo9uYmdseXZubml2dn9+bYSAfoaXe3+HgYp/a5OIcmd0gHt1gIN+iY5/jJNzfYqRhYefhnt/hoxzgIZzfYJ1bqSMc4KNjHd4bnqNYGV9cWd6dHlsbXF3g2dkfG1kZ2doU2BfVWdgbG9cXm6OaE1pbGBVVlNvZXJrZnhlZV1acnZuc3t5c26Ke4B3nHt6a2FlbG1eYG5qZXB5fmdaVlhfand7em+DX2JeZ1ZZYFhknIhia3CBhnx3a2p2bFt1cGp5aXVybm97gXNYa29gWV5WY2RYZXFjVF9iaWFibFpgfmtmbHR1b214dmxoho2AinuIbXFmcHtscWxhWF9nZ25yf3NyXmlsU2VwZFVibWF4YW90enRpbmtqXldgZmh1XGRWYlZUT1lnU09dT1BIZXBdY0daak5KYEtYbWVfeGhufmRgVV5UXXVbVFJgZ05eYlVTSlxaUVp2dl1fZm1oWGNhW16OcWNoanhyc21odnN5g3OCg3uIjn58ioiOeW6PinRsc4Jzf3+IhYeShJWPen2Mj4iRm4SAfIyEcn+Bc3R3cW6Tk5OTk5OTk5OTkpKSkpKSkpKSkpKSk5OTkpKSkpKSkpKSkpKSkZGRkJCPj4+Pj4+Ojo6Pj46OjY2Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2NjYyMjI2NjY2Njo6Ojo6OjY6OjY2Ojo6Oj4+Pjo2NjY2Oj4+Pj4+PjoKAfnp6fX5+fX1/fn59fn5+fn5+fn+Af4CAgIGAgIB/gIGBgYOHjI6Ojo6NjY2NjY2NjY2NjZKSkpOTkpKSkpKSkpKSkpGRkZGSkpKSkpKSkpKSkpKSkpKSkpGRkZCQkI+Pjo6Ojo6NjY6Ojo2NjY2Njo6Njo6OjY2NjY2Njo6Ojo6Ojo6NjYyMjY2MjIyNjY2Njo6Ojo6NjY2NjY2Njo6Ojo6OjY2NjY2Ojo6Ojo+Ogn99ent8fn59fX5+fn5+fn5+fn5+f4B/gICAgICAgH+BgYCBg4aMjY6NjY2NjY2NjIyMjIyMkpGRkZGRkZGSkpKSkpKSkZKSkpKSk5KSkpKRkZGRkZKSkpGRkZGQkJCQj4+Ojo6OjY2NjY2Njo6Ojo6OjY2NjY2Njo6Ojo6Ojo6Pj4+Pjo6NjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Njo6Ojo2NjY2NjY2NjY6Ojo6Cf3x6fHx9fn19fn19fX59fn5+fn5+gH9/gICBgYGAf4CAgICDhouOjo2NjY2NjIyMjIyMjIySkZCQkJCQkJKSkpKSkZGSkpKSkpKSkpGRkZGRkZGRkJCQkJGRkZCQkJCPj46Pjo6Ojo6Ojo6Ojo6Ojo2NjY2NjY2Ojo6Ojo6Ojo6Pjo6Ojo6MjIyMjIyMjIyMjY2NjY2NjY2NjY2NjY2Njo6NjY2MjIyNjY2Njo6OjoN/fHp8e31+fH1+fXx9fn59fn5+fn5/f3+BgYGAgICAgYCAgIOGi42NjY2NjIyMjIyMjIyMjJTO2tjY2NjamoGEhISEiF0tMDAwMC1GoaGhoaGhoJqZmpqampqKg4SEhIOEd2VnZmZmaFxDRERERENHZGhnZ2dnaE1CQ0NEREU5Li4uLi4rSIWDg4ODg4OLjIyMjIyMjY2NjYyMjY2NjY2NjY2NjIyMjIyNjY2NjY2OhX19e3t6fX58fH59fX1+fX1+fn5+fn9/f4GBgYCAgICBgICAgoWKjI2MjIyMjIyMjIyMjIyMlNvp5+fn5+qcfoKCgoKGUxgdHR0dGTekpKSkpKSjnJycnJycnImBgoKBgYJyXV9fX19hUjQ1NTU1NDlcYF9fX2BhQTU2NTU1NycbHBwcHBg7g4GBgYGAgYqLi4yMjIyMjIyMjIyMjIyMjY2NjY2MjIyMjIyMjY2NjY2GfH16enp8fXt8fn1+fX59fX5+fn5/f3+AgYCBgYGAgIGBgYGChYqNjYyMjIyMjIyMjIuLi4uSl5iYmJiZmZKPkJCQkJCMh4eHh4eHiZOTkpKSkpKRkZGRkZGRj46Ojo2NjYuJiYmJiYmIhYaFhYWFhoiJiImJiYmHhYWFhYWFhIODg4KDgoWKioqKioqKi4uLi4uLi4uLjIyLi4yMjIyMjI2NjIyMjIyMjIyMjY2Njoh8f3l7enx8e319fX18fX19fX5+fn9/f4CBgYGBgYGAgYCAgYKFioyMjIyMjIyMjIuLi4uLi5GQkJCQkIuOkZGJh46KkJKTkYuQjYyPh4+RkZGRkJCQkJCPj4+Pj4+Ojo6Njo6Ojo2Njo2Njo6Ojo6NjY2Njo6Ojo6Ojo6Ojo6Ojo6NjY2NjIuLi4uLiouLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyNjY2NiX59eHh5fH18fX19fHx9fX59fn5+f3+AgICBgYGBgYCBgIGCgoSKjIyMjIyMjIyLi4uLi4qLkJCRkZGPhI6QkIaKj4WNkJCLhYeHh4yGiZCQkJCQkJCQkI+Pj4+Ojo6NjY2NjYyMjIyMjIyMjIyMjIyMjIyMjI2NjIyMjIyMjIyMi4uLi4uLi4uLi4qKiouLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjI2Lfnx3dnh7fXx7fX18fH19fn5+fn5/f4CAgIGBgYGBgIGAgIGChIqMjIyMjIuLi4uLioqKioqQkJCQkIqFjoiOhoaPiY2QkIiFhYaFjoaLj4+Pj4+Qj5CPj4+Ojo6OjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLi4uLi4qKioqKi4qKi4qKi4uKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIt+e3d2eHt8fHx9fX19fX1+fn5/fn9/f3+AgIGAgYGAgYCBgYGEiYyMi4uLi4uLioqKioqKipCQkJCPhYOMjpCOiYyKjpCQiIWGhoeMiIiPj4+Pj4+Pj4+Pjo6OjY2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKioqKioqLi4uKioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMin58dnZ4fHx7fH19fX19fn5+fn5/fn9/f4CAgYCBgYGBgIGAgYSJi4yLi4uLi4qKiomJiYmJkJCQkJCMhoyJjoeFjYmOi4yLhIiGhoiFiY+Pjo+Pj4+Pjo6OjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKioqKioqKioqKi4uLioqKioqKioqLi4uLi4uLjIyMjIyMi4uMjIyKf353eHp8enp8fHx7fX1+fn5+fn9+fn9/gICAgICBgICAgYCBhIqMi4uLioqKioqJiYmJiYmPj4+Pj5CMjouPjIqPjI6MjY+KjoqKjIqOj46Ojo6Ojo6Ojo6NjYyMjIyLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLjIiAfXh5enl6e318e3t9fn5+fn5/f35+f39/gICBgICAgIGBgIGEiouLioqKioqJiYmJiYmIiI+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pjo+Oj46Ojo6Ojo6Ojo2NjYyMjIyLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLioqKi4uLh4B8eHp6eXt8fHt8fH1+fn5+fn9/fn9/f39/gIB/gYGAgIB/gYSJi4qKioqJiYmJiYmJiIiIj4+Pj4+Pj4+Pj46Pj4+Oj4+Ojo6Ojo6Ojo6OjY2NjY2NjY2MjIyMjIuLi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKiYmKioqKioqKioqKioqKioqKioqKi4uHgHt5eXh6fHx6e3t9fX5+fn5+f39+f39/f39/f3+BgYCAgH+BhIiLiomJiYmJiYmJiIiIiIiOjo6Ojo6Pj46MjI+Sj5COjo6Ojo6NjY2NjY2NjY2NjIyMjIyMjIuLi4uLioqKioqLi4uLi4uLi4uLi4uMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKiomKiomJiYqKioqKioqJiYmJioqKioqKioqKioqKioqKioqKi4aBe3h5eHp8ent7fH19fn5+fn5/f35/f39+fn9/f4CAgYCAgIGEiIqJiYmJiYmJiIiIiIeHh46Ojo6Ojo6Ojo+MkJOQkI+Ojo6NjY2NjY2NjYyMjIyMjIyMjIuLi4uLi4qKioqKioqKi4uLi4uLi4uLi4uLi4uMjIyLi4uLi4uLioqKioqKioqKiYmJiYmJiYmJiYmKioqKiomJiYmJiYmJiYqKioqKiomJioqKioqKhYB6eHl5fHt6ent8fH1+fn1+fn9/fX9/f35/f39/gICBgICAgYSIiomJiYiIiIiIiIeHh4eHjY2Ojo6Ojo6Pj4+PjoyNkI2NjY2NjY2MjIyMjIyMjIyMi4uLi4uLioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYmJiYmJiYmKioqJiYmJiYmJiYmJiYmKioqJiYmJiYmJioqFf3l6eXh7e3p7fHx7fn5+fX5+f39+f35/fn+Af3+AgICBgYCChIeKiYmIiIiIh4eHh4eHh4eNjY2Njo6Oi42Nj5WPiYyPjYyNjYyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYR+eXt5ent7ent9fHt+fn59fn1+f35/fn9+f3+AgICAf4CAgICEh4mIiIiHh4eHh4eHh4aGhoyNjY2NjY+MjImKj42IjJGPjY2NjIyMjIyMjIyLi4uLi4uKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uKioqJiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJg355e3p8e3p7fX17fH9+fn5+fX5/fn9+f3+Af4CAgH+AgH9/f4OGiIiHh4eHh4aGhoaGhoaGjIyMjIyLiYyKiIeJhoyOjJCMjZGOjIyMi4uLi4uLi4uLi4qKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiImJiYmJiYmJiYmJiYmJiYmJiYmIiImJiYmJiYmJiYmJiYiIiIiIiYmCf3h7e3t6enx9fHx9f39+fn19fn9/f39/f4F/gIB/gICAgICAg4aIh4eHhoaGhoaGhoaGhoWMjIyMi4yOjoyKioeEiIuKjIuNjo+Li4uLi4uLi4uLi4uLioqKiomJiYmKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiomJiYmJiYiIiIiIiIiIiImJiYmJiYmJiYmJiIiIiIiIiYmIiIiIiIiIiIiIiIiIiIJ/eHp7enp6e3x8fX1+f35+fX1+f39/fn+AgICAf3+Af4CAgYCDhYiHh4aGhoaGhoaFhYWFhYyMjI2NjJCSjI2Ii4mJi4uLi4mLjIqMi4uLi4uLioqLi4qKiomJiYmJiYmJiYqKioqKioqKioqKioqKioqKioqKioqKiYqJioqJiYmJiYmIiIiIiIiIiIiIiImJiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIiIiIiIiIiHgXx4e3x5enp8fHx8fX9/fn59fX9/f39+fn+Af4B/f3+Af4CAgIKEh4eGhoaGhYWFhYWFhYWFjIyNkY+PjZGJjIaJjIuIiImMiYeNjo+NioqKioqKioqKiomJiYmJiYmJiYmJioqKioqKioqKioqKioqJioqKioqKiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4WAenl9e3t7enx8fHx+f39+fn19f39/f35+f4B/gH9/f4B/gH+AgoSHhoaGhYWFhYWFhYWFhISLi46PjoyLj4iHiYmMjYWFjo2KiYyNi46KioqKiomJiYmJiYmJiYmJiYmJiYmJiYmKioqKioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHhoaHh4eHhH55eX16enp7fXt8fX5+f35+fX5/f39/fX5/f3+Af39/f39/f4CChIaFhoWFhYWFhYWFhISEhIuLjI6MjI2Lh4mIiomHgoiNjoiKi5GTj4uJiYmJiYmJiYmJiYmIiYmJiYmJiYmJiYmKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIeHh4eHh4eIiIiIiIiIiIiIh4eHh4eHhoaGh4aGhoaGhoaGh4eDfXp5e3p5enx8e31+fn5/fn59fn9/fn9+fn+AgICAf35/f39/gIKEhoWFhYWFhYWEhISEhISEioqOjYmIiIqKh4iHiomIioiIh4qGi5GPiomJiYmJiYiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHh4iIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGh4J8eXl6eXp7e3t7fX5+fn5+fn59gH9/f39/f4CAgH9/fn9/gICAgoSGhYWFhISEhISEhISEhISKi5CPiYmJi4qHh4WHiYuKiYSLjYmOjYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiIiIiImJiYmJiYiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGgXt4enp4e3x7e3x+fn9+fn5+fX1/f39/f3+Af4B/f39/f3+Af4CChIaFhYSEhISEhISEhISEhI+Qj4+IiYuIhoeIiYuLjIuJioqNio6Oj4iJiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoaAe3h5eXh4enp8fX1+f35+fn59fn9/f39/gIB/gICAf39/gIB/gYKDhoiGiIaDhISEhIODg4ODkpKOioeKi4qLh4uNiYqJi4iHiouIio+SioiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhn96eXh4eHl5eXx9fn5/fn5/fn1+f35/f3+Af39/f4CAgH+AgH+BgoOHjo+PjoiHhIWFhoaFhYWSkI6KiYmIiImKioiIh4aKjIiHiYmOkJGNh4iIiIiIiIiIiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4aGh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWGf3l4d3d3eXp5e3x9fn9+f35+fn5+f35+fn+Af4CAgICAf3+Af4GBg4eOjo6Ojo6Mjo2OjY2MjZCQjomHhoiJiYeIiouIiYyJiYaKjY6PkYuIiIiIiIeHh4eIiIiIiIiHh4eHh4iIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhYZ+eXd5d3d6eXl8e31/fn5/fn5+fn5+fn9+f4B/fn+Af39/f39+gIGEiI6Ojo6Ojo6Ojo6Ojo2NkJGOi42JjIiIiYaHiYaIioiHi4yLjpCQiIeIiYmJiIeHh4iIiYmIh4eHh4iIiYiIiIiIh4iIiIiHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhoaFhYaGhoWGhYSEhIWFhoaFhIWFhX55d3l2eHl4e3x7fn5+fn5+fn5+fn5+f39+f39+f39/f35/f3+AgYOGjY2Ojo6OjY6NjY6OjY2Qj42Ni46KhoiKhISLiYeDhYSDi4mLj42JjI6QkI+NjYyLjY6Pj42NjI2Nj4+Pjo6MjYyMjY2KiYiHiImHh4aHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoeHiYqKiIeJi4yNjo2LiImLi42OjYyJiImMgHl3d3Z6eXh7e3t+fn5+fn5+fn5+fn5/f39+fn5/f4B/f4B/f4CBg4aMjY2NjY2NjY2Qj4+Pj46NjI6KiYuMjIeFiY2Lh4aIh4aHh4uNjo6Pj4+Pjo+Pj4+Pj4+Pj4+Pj4+Ojo+Pj4+Pj4+Pj4+Oj46Oj46Mi4uJh4eHh4aIhoaGhoaGhoaGhoeLiYeHiIiLjY2Mi4yLjY2Ojo+Ojo6Pj46Ojo6Ojo6Ojo6Njo6NjY2AeHZ4eHp4enx6fH5+fn5+fn5+fn5+f39/fn59fn9/f4B/gH9/gIGDhoyMjIyMjY+QkpOTk5KSjYyMjIqHioyKh4eJiYWCiouIiYWJjpCNjo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjI2NjI2LiYaHh4eHiYqLjY6NjYyNjY6OjY2OjY2NjY2NjY2NjY2NjY2OjIyNj4+OjY2MjIyLi313dXd5enp7e3p+fn5+fn5+f35+fn5/f39+fn1+f39/gICAf3+AgYOFj5KRkJGSk5OTk5OTkpKLi4uLiomMiouLiYuKhoeOjYiIjI6OjIuMjIyNj46Njo6Ojo2NjY2MjY2NjIyMjIyMjIyMjY2NjYyMjI2NjYyMjI2NjIyNjIyMi4yMi4yMjI2MjIyMjIyMjIyMjIyLi4uLi4yNjY6Sk5OSkpSRkJOVlZSTk5COjo6Oe3Z2d3h6ent7e31+fn5+fn5/fn5+fn5/f35+fn9/f3+AgIB/f4CBgoSNkpKTkpOSkpOTkZKSkoqJioyJi4qJjIuKioiHiYqKi4mKjY2Mj46Nj5KUlJOUlJOTkpGSkI+Ojo2NjY2Pko+OkZGOjIuKioqLi4qKi5CPjoyMjIqKioqKioqKiouKioqKi4yLi4uMjIyKiouLi46RkpOTk5SUk5STk5SUlJOTk5KSkpKSk5F6dXZ2eHt7e3p6fX5+fn5+fn5+fn5+fX5/fn5+f39/f4CAf39/gIGChIuRkZGRkZKSkpGRkpGRiYmIiIqMiYiJiYuJhoSJhoyKh4ySkpKTk5OUlZWWlZWUk5OUlJSUlJSUlJSVlZWVlZWUlJOTkY+QkZKQjoyRlZWVk5KSjo+QjYqKi4qKi42OjY6RkpCRkpKSkpGRkpKSk5OTk5OTk5OTk5OTkpOSkpKSkpKSkpKSj3h1d3l6e3t7ent9fX19fn5/f35+fX5+fn5+f39/fn9/gH9/f3+AgYKEi5GQkJCSkpKRkZGRkZGIiIiIi4uJg4eLi4yMiIeHjYyNkpSSkpOTlJWWlpaVlZSSkpOTlJSUlZWVlZaXlpaWlpWUk5SUlJSVlJSUk5OVlZWUk5KTk5OTkJGSkZGSk5OTk5KSkpOSkpKSkpKSkpKSkpKSk5OTk5SUk5OSkpOTkpKSkpGRkZGPdnJ3enp7e3t8fX59fX1+fn9+fn9+fn5+fn6Af39/f3+Af3+Af4CBgoSKkJCRkZGRkZCQkJCQkIeHh4eIiIiFi4+KjI6Njo+OkJWUk5OTk5SUlZWVlJSUk5KSk5KTlZSUlZaWlpaWlpaWlpSTk5OTk5OUlJOSk5SVlZSTkpKSkpOTk5OTk5OTk5KSkpKSkpKSkpGSkpGRkZGRkZKTlJSUlJSTkpGRkZGRkZGRkZGRkYx0c3d6ent7e3x9fX1+fX5+f35+fn5+fn5+fn9/f39/fn9/f39/f4GDhIqQkJGRkJCQj4+Pj4+Ph4iKi4yNjYuOj42Mjo6RkpGSk5OSkpKSk5SUlJKSk5OTkpKSkpOUk5OTk5WVlZWUlZWUk5OTk5KSk5OUk5KTlJSUk5KSkpKSk5OTkpKSkpKRkZKSkpKSkpKSkpKSkZKRkZGSkpOTlJSUk5OSkZGRkZGQkJCQkZCRinN0dnp8fHp7fXx9fX59f35/f35+fn9+f31+f39+fn59f39/gH+AgYKDipCQkZGQj5CPjo+Pjo+Oj4+Pj4+Pj4+PkI2OjpCRkpKSkpKRkpKTk5OTkpGSkpKRkZGSk5KTk5OSk5STk5OTlJOSk5OTk5OTk5OSk5OTkpKSkpKSkpKSkpGRkZGSkZCRkZGRkpKRkZGRkpGRkZGRkpKSkpKSkpKSkpKRkJCQkJCQkJCQkJGGc3V2e3x8e3x9fX1+fn1/f35/fn5/gH9+fX5/fX5/fn5/f3+Af3+BgYGKkI+PkI+Pj4+Pj4+Pj4+Oj46Oj4+Pj5CQiI2PkJGRkpKSkpOTk5OTkpKSk5KSkJKRkZKSk4eFk5GRkpKSkZKSkpKSkpKTk5KRkZKTkpGRkpKSkpKRkJCQkJGRkZGQkJGSkZGRkZGSkZGRkZGRkZGSkpKSkpKSkZCRkZCPj4+Pj4+Pj4+PkX9ydHh8fHx7fHx9fX5+fn9+fn5/f3+AgH99fn5+f39+f39/f4CAf4GBgYqPj4+Pjo6Ojo+Pj46Ojo6Ojo+PkI+Pj4+GjpCQkJCRkZGRkZGRkZGQkJCQkJKCgZKRkZKOdYaRkJCRkZCQkJGRkZGRkZGRkJCQkZGQkJGRkZGRkI+PkJCQkJGRkJCQkJCRkJCQkJCQkZCQkJCQkJCQkZCQkJCPj4+Pjo+Pj46Ojo+Pj4+PeHJ2eXx9fHp9fH19fn5+f35+f39/f4CAf35/fn5/f35/f39/gIB/gYGAio6Ojo6NjY2Ojo6Ojo6NjY2Oj4+Pj4+PjoiQkZCPj4+QkJCQkJCQkI+PkJCPkIhwhJGPkHx1iJCPj4+PkI+PkJCQkJCQj4+Oj4+QkI+Pj5CQkJCPjo+QkJCPj4+Pj4+PkJCQkI+PkI+Qj4+PkI+PkJCQkI+OkI+Pj46OjoyMjY2NjIqDiYhzc3Z4fX58eX19fX1+fn5/fX5/fn9/f39/f4B/f39/f4CAgH+AgH+BgYCJjY2Ojo6Ojo6OjY2OjoyNjY6Ojo6Ojo2NiJCRkI6Njo6Ojo6Ojo6Pjo6Ojo6PjHNvio+JcniHj46OjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Pj46Oj4+Pj4+Pj4+Pjo+PjY2MjYyNjoyLi4mJiYiFhYSDgoKEgnR5fXp4dXJrZWltb2xmZmdncHNzd3l9fnl6e3x9fX1+fn59fn9/fn9/f39/gIB/f3+AgIGAgIB/f4CBgImNjY2NjY2MjYyMjIyMi4uLjYyMjIyMjIyGj5GRjIyMjIyMjIyMjIyMjIyMjIyNdm57j4JzeIaNjY2MjIyNjY2NjYyMjI2MiomKi4uJh4KAh4iEgXt6gH57fXx8fXlzcnJycnV1cG1ramppZ2NkYV9bXF1eWFVXWFlTS0VJSkpLTE1PT0tgdHR3eX19eHp5e3x8fX5+fn1+f39+f35/f4CAgH+AgICBgYCAgICAgIGAf4OEhYSFiIuLjYyMjIuLi4yGiYqKioqKh4OOkJGNiouLi4uMiYmKioqKiouLi4dzbW6DenR2gIWDhIeJiYWCg397fHl6e3pzcHFxcW1samdsbWdlZmVmZGNlZGVkZWVlZWRkZGNhYV5dXFlYWFdUUFFSU1JTTU1KSUZFSEpHR0hHR0xOSWdzdXh6fXp4d3l8fHx8fn5+fn9/fn9/f35+f4CAgIB/gICBgICAgICBgYFnXmBjYWNucX17ent/fXd8fHZ4ent4eHpvcXt4eXt8e3h3e394dXd0dHZ1dXZ3dGJeZF9ia3FmaGtsbm9tamlpaGhlZWRkZF9gYWJgYF5dWVhaWltdXV9gX2BfX19gYmFeXl5eWVldXF1bV1dWUlRSU1NOUUpISUZERUhMTEhGR0lLSklNbXJ0eHp7end3eXt6e3x+fn1+f39+f35/fn5+gIGAf3+AgIGAgICAgICCgWdYW1pZXFtcY1xaXF5ga3FtcHBvbm5vbmtpbmxrbG9qaWtraWpraWZmZ2dnaGhiXmxsXWZnZ2ViY2JhYmBgXVhbW1dYV1RWUVBUU1NNSkxLTExOTk9UWFhXVVVUUlBQTU1QT05LTE1QUU9MTEpHSUlHSEhJSEhIR0ZHSElKSEhISUlISVZwc3V5ent5dnZ5enp7fX59fX5/f35/fn5+f3+AgX9+f4B/gICAgICAgIGBbFtZVlZWWVlaWVlYVVZoamxubmxra2poaGloZGVkYlxiZl9fYWNfXF9dYF1eWlprd21ibnNqYlpZX1tYV1NOTUtLS0tMSUtNTktKS0tMSktQTEtLRkdHSUlGR0lISUZFSEdGRkVERUVEREVJSUlHSEdIRkZLTUtJSUlIR0hLTU1LTExMVXFzdnl6e3l2d3h3ent9fn1+fn9/f39+f3+AgIGAfn5/f4CAf4CAgIB/gYJoUlRVVlNVV1lZWVdXV1tbYWNfXlxbWFZWWVZSVFJRUVVUU1NUUE1KTU5QUk9NW2tybGFtdHJnUVFTUFBOTk9NSk1MS0xKSktLRklJSkxJR0pISUlFR0dGRkVFSElKR0ZHRkZHR0hKR0dISEpMSkpLSUlISktLSkhKS0pISUtMTU9QUEtUdHN1eHp6eHZ2d3d6enx+fX5+fn5/f35+fn+AgYB/f3+AgYB/gICAgH+AgmlQUlRXVVRWWVdYWFpbVFRTUlBRU1FRUU9OTlBQUU9MTlBPTk5NTEtNTk5QTU5cZG9rWWlzdXBTTU9QUFBPTk5PTk5QTk1NS0lISEpJSUlJR0ZHR0dJSkhJSEhJSEhHSEdISElISUxLSklISkpJSkpIR0pMS0pJSUhKSktMTk1NTU9RTFVzcnN3enl3dnR2eHp7fX19fn5+fn9+fn5+gICBgICAf4GBgH+AgICAgH+BbE9PTlRZVVVdW1lXV1hOTUpKSUZKT0xKSkdJSk1NS0pMTUpHSUlJSktLRkJFSVZjZ2tvcG5tbFpNTE5NTk9NTk9MTk5OUFBPTE1MTk1MTEpJSEdJSElISElJS0xLS0pJS0pJSklJSUlJR0dKSUdJSUpKTk1OTEhJSklJSk1PT01MT1JOWXBwcnd4d3d0c3R3enx+fX5+fn5+fn5+fn9/gICAgICAgYCAf39/gICAgIJvS0pNTlFOTlVXVlZSU0lFQ0VFUkREQT5CP0RAQD5CREFAQURHRkVIRUNHSElOW2dpZ3JubmlmZGBfX1hMSklKSUlLSkxQTk1MTU1MTU1NTElIREZGR0ZGRklKSUlLSkhMSklKSkpJSEhKS0tIRkdJSklLTU5OSktPTUxLTU1PUE5QT1BgcG9yd3h2dHJzdXd6fX19fn5+fn9+fn1/gICAgICAf4CAgIB/f3+AgICAgXNQUE5OUE1KS1BSUE5RQ0RCQUZRRT1DPT9FSDk6Oz0/PTxBRkA+Ojs+SVpdW11mbG5rb21tbGtpaWtjUkdFRUZFR0dHR0pHSEpLR0NER0pHQ0RFQUFDR0hHSEdISktKSElMS0lISktLTU5MTUxMSkpMS0lLTU9PUFNRT1BQTk9QUlFNUGdwb3N2dXRycXR4eX19fX1+fn5+f4B+foCAgH9/gIB/f4CAgH+Af4CAgICCdlRVUVFQT0xNUFBOT09BQkFAQkE/Oz48Pj8/Ozg5ODs7OkA6Oz48Ozs7PUpbaW5ub2pvbWtqbGxlUEdFREdJSEM/QEBAQUFCQUE/Pjw9PkFAQD8+P0BFR0dHSUtMTk1OTUxNTUpLTVBVU05MTlFOTk1OTE1NTk9OTk1LS05OTk1OTkxUbnBwc3R0c3Fydnh5fX19fn1+fn5/gH5+gICAgICAgH9/gICAgH9/gH+BgYJ4UVFSVFJTUVNTUVFST0BAPT4/PD8+QEE/PT45Ozo7Ozk5Ojg4Ozw5Nzk6Oj1HYm5zbm5sa2xnVEI/Q0ZEQkNDPzs+PkBDQ0E/Pj9BPkBAQj9APD9CQEFDRUZFSktQT1BPTU1OTExMT1JRUFJOTExPTUtOT0xMTEtMS0tKS0tKTU1LS1xxcXF0c3RycXR4eHl9fn1+fn5+f39/fn5/gIGAgH+Af4CAgICAf4CAf4CAgXxSTU9RUFFSUlRSU1NOPDs8Ozs7P0BBQkA9PDk8PTw6Nzk6Ojk3OTo6Nzg6OTk8SV9zdHFmUj86Oz1AQUA9Ozs+PD08QEJDQT9BQkE9Pj09Oz0/Q0RCQD9BREJFR0pKSkpKTE1MTExNTExOVVNLTE1USVBKSU1KSUpLS0pJSEdKS0lKZnJxc3RzdXJydnl6e31+fn5+fX9+f39/f36AgICAf4CAgICAgIF/gIF/gYCBgFZMTlBQTlJRUFBRUU44PT88PDo9PkFAQT8+PkA/Pj48PT0/QD09PT9DOz09Pjw6Qmx9aT46Oz49Pj9AQEA+P0FAQEBBQEBAPT8/PTw6Oz09PD9AQUJCQUBBREZGRkdGR0dISUtMTExLTEtKS0lKSk1MTEpMS0lISUxMSklJSElLR01tcHF1dXR1c3V4eXl8fX5+fn5+fn5/gH9+gIB/f39/gH+AgYCAgYCBgICBgYCCYUtPT05OT1BPT1BQTzo8Pjw9Oz8+PkFBPz0/Q0NEQT89PkBBP0A8XG5APkRFPz9BRF9kPD09Ozs9PkFBQD5AQD9BPz89PD48PTs7PD0+QUA/QD5AQ0NEQkNFSEVFR0hISEdGSUpJSUlJSUhKSkpKTEtKSklJSEhKSktMS0lLSkpIVnBwcXNzdHR1eXp7fHx+f35+fn5+f39/f39/f3+Af4CAgICAf4GBgICAgIGBgIJtTFBRTk9QTk5PUFBPPjw8PT4/P0A+QEA/Pz9CRkQ+PDw9QD04Ojttd0g4Ozo9PkE6SWU9PD08ODo7Pz89PD07PEA9PTw9PTs9PD0+QUBCQUBAP0JEQ0RFRkZGQ0VHSElJSEhJS0tMTUpKSUpNTUpLSktJR0hISEpJSktKSk5MSUlfcHBycnJ0dXZ6e319fH5+fn5+fn5/f35/f36AgIB/gICAgICAgYGAgICAgIGAgnZNTk5NTk5MTE5QT0w+QTw8PT8+QkM/PkFBQUJBQFlSPDw9SUxGRnV3TTc4ODo7Pj9XakE7PDw6Ozs+Pz89PTg6Pjw9Pj89Oz4/QEJDQkJDQ0FCQkFCQkRCQkRCRENGSUdGRkhJSUtNSklKSktMSkpJSkVESUlGRkhISUpKTEpGRmdwb3FxdHZ1d3t8fH18fn59fX1+fn9/foB+fn+AgH+AgICAgICBgYCAgICAgICBek5JS0tMTExFSUxOTTw/PDw9PkBAQUE7QkNCQ0BDcnlJO1x/g396fHdXPD0/PT0+RWh0TDo9Pj89PT9BQ0A8OTtBPz4+QT07P0FAQkNCQENDQUNBPT0+QD0/QUFBQENFRUBAQ0JDR0dFRENGRUZGR0VEQEFHR0ZDRkRHSEpHQz5IbG9wcHF0dXZ5fHx9fHx+fn1+fn5+fn5+f36Af3+AgICAgICAgIGAf4CAf4CBgIF+UUhLTU1NS0pLTE9RQD8+PkFBQEBBR0FCRENFQUdyeWtig4SDgoOAfV4+QENAQD1Kc3tZOj1BRUFCQkZIQz08QEREQUA/Pj1AQT4+Pj88PkBER0VAPkBBP0BDRkVDQkNDQEJEREJERUFCPkFCQkFCQEA9QUJDRENDQUNFR0E/PVZwcHFwcnV1d3p8e3t7fX9+fX19fX1+fX5+fn9/foB/f4CAgICAgYCAgIB/gIGAgX5SSEtNTUxLS05OUlVEQkBDQ0FBQkBCQ0BAQUFARW50fYKCgYN+fYR2TUFDRUA/Pll7gF0/Q0VJSkpJTU1LRUNGRkdFR0VFRURFQ0E/QD4+QkZKSkdFRUdGRkpOTktKSUdHSEtMSUdHQ0REREVEQUJCQ0BDREVEREVERUZDQkFEZW9wcXF0dnV4e3x6fHx+f319fX19fn59f4B/f39/f39+gIGBf4CBgICAgH+AgICAfVJJSUpKSEpKTE9SU0dGRUdIREdIREA+PDs+QEVFaHN9gXx/hH55hXJDREVEQ1d1hoeHflhHSEpMTk9QUE1JR0lHSElJSEhHR0hIRUNFRUVGRkhKSkZFR0lKTU9PTU1LSktKTU5LSUhHSEhIR0ZFRkZGREZIR0VFSEhGSEdIRlFubnBxcnV2eXt7e3p9fX5/fX19fX1+fn1/f39/fn5/gH+BgYGAgICAgICAf4GBgIB8UEhHSElGR0lKTU5OSkxJSUpLTE5KRkNBQkNGSkdge4B/d3+EhYOEiWxBQVZ0h4mHh4eIg1dISk9OT09NS0dHR0dER0dHR0ZIRkhFQ0RERkVEREhIQ0NDRklLS0xMTExMTElKS0pKSUlJSEpISEdISUhHR0hGRkZISklJSUlIXW9vcXJ0d3d6e3t6e319fn59fX19fX5+fYB/f39+fn+BgIGAgYCAgICAgIB/gYCAgHxNR0ZIRkVGR0dKS0pMTUxLTU5NT0tJSEhKS0tMTE5bfIKCg4OFhoaIhFZshIeGhoaHiIiHfE9YZExJSUdHRERDQ0BAQ0NDQ0ZGRUJAPj5AQUFAQkQ/Pj9ERkhERkdJSklKSEhIR0lJSkpJSEZKSkpKSUpJSkpKRklMTEpKS0tmb3BzcnR2eHl7e3t8fH1+fn19fX19fn59f39/f35/f4CAgICAgYCAgIGAgICAgICAfU9GRkdGR0hHRUZHR01NTUtMS0lHQ0NDRElLS0xLSlSBg4SEgoKFhoaEgoaFhISGhoaHh4aKdm9pU01APkE/Pz88PDw+Ozo8QUFAPjw5OTg8PD07Pjs4Oz9BQkBBQ0NCQEFBRERCQ0ZISUhISExNTEdJSk1NTk1KSktLSkxNU2xwcXRzc3d5e3t7fH19fn9+fX19fX1+fn5/foB/fn9/gICBgIGAgICAgYCAgIB/f39+UUZFRkdJSUdEQ0VGTk1MSklIRT85Oj5ARUhISklJZYWEhIR/gYKDgoODhIWFhoeIiIiIiYyOfmxiYVI+OD9ANzc4ODk2NDc5Ozw6ODU2Nzc4OTc4NzU4ODs7Oz1AOzk5OT08Pjs8PUFDRUhKTUxMR0lHT1JRUFBOTE1NT1Fdb3BydHN1eHp7e3x8fn5+f359fX59fX5+f39/gH9/f4CAgICAgYCAgICAgICAgIB/f39RR0ZHSEpIRkVGR0hMTEpJSUdDQjU2OjxDQENHSUlohoSEgX6Bg4ODgoOEhomKjIyLi4mKi42Mb2BkZVlBVz01NjU1ODczNTY4Ojg3NjU2NTY3Njc3Nzo2Nzg4OTo3NTc4OTc5Nzc2OjxAR0ZJRklGRUZPU1JTU1JPUFBSVGVwcXN0dHZ5e3x7fH1+fn5/fn19fX19f39/f3+Afn+AgICAgICBgICAgICAgICAgH9/flJISEhJS0lHSUpJSkpLREVIRUJANjc4OD06PUVDQmWFg4GAgoODg4ODhomKiomJioqKiouKi4yGamZraWZRNzg4NTU4ODU1NzY5OTc3Njc2NTo5Ojo6Ozc5ODk4NzY2OTo5ODg2ODU4OTtBPT4+QkE/QUtMT1FQUU9PT1JXa3FydHR1dnp7e3t9fX5/fn9+fX19fX5/f4B+fn9/f4CAgH9/gICAgICAgH+AgICAf39+VEhHSUlMTUtKS0tMSUg/QEFAPDo1Nzk4OTc7Qjo9cYSAgYOEhISEhYaJioqIh4eIiIqKjIuKi46Ea2xrYj88Pj85OTs8OTo7OTo7Ojo5Ozo5PT09Pjs7PDw6Pjs5Ozs8Ozw7OTo8ODo6Ojo5OTk8Pzw8QUJESUpNS0lLTFdvcnN1c3Z4e3t7fHt9f39+f359fX19fn9/f35/f39/f3+Bf4CAgICAgICAf4CAgH+Af35URkVGSUxOTkxKSk1CPzo7PDo4OTk4OTo6Ojs/Pkh+hIKChIWFhYaIiYiHhoaGiImIiYuMi4qMjY6AbWxgRURGRkJBQUI/QENBQD49Pj5APz8/QD9APT0/Qj5AQT9APz1AQEA+P0E8Pjw7Ojs6OTs/PTs8PT1BQUNBQkNBWHBxdHR0dnp7e319e31/fn9/fn19fX5+f35+fn9+f4B/f4CAgIB/gIGAf39/gICAf39/flJFQ0FHSk5PTElHSzo4Ojs5Ojo8PTo7Oz09P0BCUoOCgoSFhIWEhomJiIiGhoaHiImKi4uLi4yNjI17bWtPS01LSkdISEVGSEdFQ0FAQkVDQ0FCQ0I/QERIRUNFQ0VEQUZFRkRFRkRAQj49QD49P0A+Pz4/Pj8+Pjo7PTxgcXJ0dHV3enp6fX19fn5+f39+fX19fX5/fn5+fn5/gH9/gICAgICAgICAf4CAgIB/f4B+UERAPUNIT01HRkJEOTc6Pjo8Oz4/Pz89QUBDREZXhIKDhIWFhoaIiYmIh4aGhoeJiYqLjI2MjIyMjYt4bWFtZE1PS0tLSUlKSklGRERHSEdEQ0VGREJISUtHSEdGSEdFS0lLSUpLSkNGQ0NEQkFBQ0JEQ0NERENBPTs9QGhwc3R0d3d5eHt8fH19fn5/f359fX1+fn9+fn59fn+Af3+AgH9/gICAgICAgICAgH+AgH9PQT49P0RMS0BCQkE5ODw+Ozw7PkA/QT5CQkdHSVmEgoOFhYaHiImJiIiHhoaGiIiIiYqMjY2NjYyMjId5eWVhT09NTE1KSUpIS0dER0lISUVFSEZGRUxMTUlKR0dISUpOTU5MTE5LSEZHR0VFQ0ZGRkZERUhIRkNBP0BMbHB0dXZ4eXl5fHx8fX1+fn9+fn19fX1/f35+fn5+f39/f39/f3+AgICAgIB/gICAgICAf1FBPz4/RUdHPTxAQDg4PDs7PTo+QD4/QENGSUlQX4GDhYSFhoaHiIiIiIiIh4eIiIiJioyNjYyMjIuMjYZpUlJPTk5NTkpISEVKSUVLSUdLSklKR0dHS0xOTE1ISElKTVFOUE5NT0tJR0lKSElESUhIRkZHR0lHQ0JBQ1RucHV3d3l6eHl6e3x8fX5+f39+fn1+fX5+fn5/f36Af4B/f3+Af4CAgICAgICAgICAf39/VERBQUJHSEI/OD9AOTo8OD0+Oz1BPj9BREhKTFVxg4SEhISFhoeIiIiIiIeGiIiIiIiJjIyLjIyMjIyMjGFUVVNQUE9MS0hHQ0hKR0xLR0tPTEtKSkxNTE9QTkhJS0xPUVFQUU9PSkhKSkxKTEZHSEdGRklGRUVCQUJCXG9yd3h5enl5eXp6e3t+fn5/fn59fX19fn9+fn9+f4CAgIB/f39/gICAgICAgICAgH9/f39VRUNFRUdHRUQ7P0E7PTw5QD4+QEJHR0FHS0xQVnmFg4ODhISGiIiIiIiIh4eIiIiIiIqLi4qMjIyMjIyOfVpYVVVWVVBOTEtFRkZMT05QV1VRUE9RU1JNU1RPTVNMUFNVVlJTUlBMSk1NTUtOR0dKRkZISkVERUVCRUNjcHV5eXp6ent6e3p6fH59fX9+fX19fXx9fn5/gH9/gICAf39/f3+BgYCAf39/gIB/f39/f1VGRkdHR0dIRj5AQj0/PT1CQEJCR1ZORk5QUFRYe4aDhYWEhIeIiIiIiIiIiIiIiIiJiouKioyMjI2PjIyMalpYbGNHVFJSUUs7O1JTUmB1XVVWVFZZWVJYWFJaZlBVV1pdUlRXUU9NUlFQUFFLS0tISEpIRUZJSUlISWlydnl4eXh6e3t8ent8fXx9f359fX19fX1+f39/f3+AgIB/f39/f4CAgIB/f3+AgH9/f35+U0hKSUhHR0ZFPz9BQUVBQ0dFREVMWFJNVFVWWFp8hoWHhoWGh4iIiIiIiIiIiIiIiIiIlJyMiouMfmGKi4uHbl1lVjtZWllUUT9AVlVYXGRgVllicl1dV11aVkVRWVpbWV9UWWdSVlZYVVRWVE9PTUpMSklJTE1LT01Tb3N2eHl4d3p6ent6e3x9e35/fn1+fX19fn5/f39+f4CAgH9/f3+AgICAgH9/gH+Af39+fn5WSkpJSEdFRERCQT9ITUlNUEtJS1BUU1NYWlpcXHiFhIWFhYWGh4eHiIiIiIiIiIiIiImcnaCPiY5nO36LiYqMem9wWlxdXFNVU1ZWVVtadYNZVX2QYVxYXV5XSVZdXVtbX1lIWVhZW11YWFlXUlFNUFFNTU9TUVFVUmFzc3Z3d3Z4eHh6e3p8fX19f39+fX59fX1+fn9/gH9/f4B/f3+Af3+AgICAf39/gIB/gHh5fVlOS0lJSEZCREBBOlBRUVdYUFBPUVNUVFhYWVpbboGCg4WEhYaHh4eHh4iIiIiIiIiIiJaanJeIioFuhomIh4SLfmdaWlxaVVdVV1JRV1ZjloBSZXJYWldfaFBgZltbWFxnYUdPWmhnXVtcXV1XUk9TUFBSVlZWVllabnJ0d3Z2dXh4eHt7fH19fX5/fn59fn18fn9/f3+Af39/gH+AgH9/gICBgYB/gH1yfX9/b3R8XVNQT01LSkVDP0A7UFBaWltTU1FPUlJSVVNWVFdfdXiAhYSEhYaGhoaHh4eHiIiIh4eIh4ORjomJiIaFiIiGfoB8XlJXWVZTVlNSUUxPTUtmeVtdVFlVVl1aTFRaVVNUXlpYV1dXemtYW1xcXlRRUVBJTk9XVlhbWmRwcnZ2dHR2eHl5e3t8fH1+fn99fX1+fX1+f39/gIB/f39/fn56eHd2c3V7f3+AgHRrf35rcnleW1ZVU1JPS0ZDREFOXoNsVlJTTk9RT1FVUlNSUlVjZHaAgoKDhISEhIWFhISDhoaGhoeIhn6JiYmHhoOHh4d5b3JYS01PUE1PTEpLREVJRUM+VGRVf1JRUU5LUVRRTU9ZUk1OUVNVVU1RU1JQT01MSENJSFJUVVpcbHF1dXVzc3d6ent7fH17fX19fn19fX59fn9/f4B/f399fX5+f39/f4B+e3Zzd31+fmR1fWlxdF9kXV5cWVVQTElMSWFsknRQUVNOUVJRUltSU1JRUlVUYnN7fH+AgYKBgX99e3uAf4OChYaHgoaGhoGEgYaFhnZgXk1FQERERERDQUVQQkNBQz1DSUdWQEhOTEddaVBIRk5GREVGSUdIQkRIR0lLR0RCQURAT1FNUmRydHZ1c3R1enx7e3t7fHx9fHt+fX19fn5/f3+AgIB/f3x8fX+Af39/f4CBgH12dHt/bWh8Z25xZmllZGJcWFNRUFVSc1dlW09PTkxRU1FVWVNVUVFUU09WYGtscnZ7e3h5dHJuc3RzeXh+f4OAg4OCgIKAgoGCbE5IQEE7PD5AQD9AP2tQSmBFRkhJRUI/R0xOR01RVUlBRT4/PD08PT0/PT9BQ0NAPz09Qj5KTkdVbnV0dXN0dnh7fHt8fHx9fX19fH59fXx+fn9/f4CAf39/enl3eHd2dnh7foB+fXt4dnx1YXhnbHBqbGppZmBbUVJaXFleSkpQUU5LTFFSUVRWVVdRUVdVUFhbYl1hZ21tbG9rZ2BucmptbHF1e3p9e3h6fHx4d3hlREJBQj06QkNBQURCXF1Pe05PT05LTE1PT1FMS01XTUhHQEE8OTc3NTk5PTs7Ozg6ODo/PEJIP1xzdHV1dXZ3eXx8fH18fH19fn58fn19fX9/f39/fn9/f314dXZ6e3p3eXh1d3t8eXh1eXdjcWhpcG1ubW1oZl5PUF9dWklIUFJRT01QUU5RUlRWWFNTWVRPWVpbV1ldXl5fZWBdXnF2a15gZ2t3b29sam9ubmxmYllIR0hIQkFHSUVFRkRNUlBhV1JXUVBTU1JVW09PUVZQTUlERj46OTY1ODc5Nzk6MzY1Nzk1PEM+ZXNzdnd3eXl7fX18fHt8fX5+fnt+fn19f39/fn5+fn9/e3d1eX18enh8fHx8dHd2d3Z1d2tuaWhxbm9vb2prYFZXXlpYTUxUVFNQUVVPTFJTVFhYVFRZUk1XWVpWWFhWWFldV1dYaHNrXVZhc2tiYV9eZGFfXllUUU5PTkxJSEpMSUlGQ1FQU1tXVFROUVNZU1xlVU9TVFFOS0lIQz9BOTk5ODk3ODg1NzU3ODU5OUdtcnR3eHl7e3x+fX18e318fn5+en1+fH1/f359fn59f358dHR1e3hycW9vbnR4cXJzeHZ1cWZkZ3JucHBxbm1kXV9fWVdPUFhWVlNUVk9PVVZYWFlTVVRMS1RWVVVVV1BTVVdUVVJdbl5STlpfW1ZZO0RWWFRbZkpMUFNST01NTk5OTEpGUVBVWVNUT0pOT1VTVFxWUlVTUk9NTElISEY/Pjw6Nzg3NjU5OTY3NjY1V3Bwc3d5ent8fX59fnx8fXx+fX15fX18fn5+fXx8fX1+fXxydnF4eHJ2dXFxbnBwb3B1dnRuamRkanBwcXJwb2ZlZGNcXVJUWlZXVVRXVFJYWFlZWVNVT0pHT1BPT01SSlBQT1BOTk9UTE1JUE9TVFUyPVhNSUBRPWNhUVNRUE5QUVBOTk1RTlRSUFNNSUxKT1JQUlJTVFFST0xNS0xMSENCQT06Ojg3NjtCNTU2Njpkb3F0d3h7fHx9fnx9fH19fX18e3h8ent9fX58e3l9fH18e3B1b3d1cHV0b3N2cHFxcHR1dmNqZ2VXaHRycnFuaWlocFZWVFVYVVdVUldWVVpZWFdVUVNGRUFGR0dIRkpESEpJR0VITEhLSEZMTVBNRy9FX1I+Mz8+am9hU1JRQEdVUVBRUFFOUU9RUExKTExPUE9OUFFRTlBPSkxNTUtHRUVEQjs9PDw5PUc2Njc3RG1wdHV5e3t8fX18enx8fX5+fXt5dnh3eXl8fXp6dn17fHp6b3Fud3JwdnFtcHNwb3Bzc3N0ZmdgaFpXa3JzcmxtbWtuYWVQU1RSU1RPV1ZWWVlWUVFRT0A9Oz0/QUJBQ0BCRURBQEdIR0hFRkhKTUxFR0NPUkM4RU5TXWdUUVNBR1VQT1FRUE5NTk1LTEtLTk9PUUxPT01ITExJS0tMS0dGRkVEPEFBPjtARTs8ODlTcHJ0eHt6e318fHt5fHp6fn58e3V0dXJ2dnp6eHpyfHt8eXltcW94cnF1bm5xcm9vb3Rzc3J1dGtnZ15lam1wa25xbWltY0xPT01RU0xUVVRYV1VMTEtJPDk4Nzs+QD48PUFAQj0+RUhHQ0VGSUdKSkBGQUFARkhFSk9IUVJiXFFQUk9TT09QTExPTUxNTE1PTltXS01RT0dJSENISkxMSkZGRkU/QkM+PEJHP0I/QWRwc3d6ent7fHt6end7d3l+fnx7cXN0cHJzd3R4eHN6e3l2d2xxb3ZxdHRsb3Fybm5vc3ZydHNycmtsZW5zaG1ubWxtbGprSUxISE9RSlFTUVRTT0tIQ0Q9OTc3OT9CPjs/QUBAPkBESUVDR0dJR0lFQkI/Pj1DQkFHSURNT2JlUU1PTldLTE1LTE1NTUxMT05TZE5LTFJJSUlFQUhKTE1OSkdJR0JBQkA/RUZFSERLbm92eXl5e3t6fHp3dHh1eHx8eXpucXJtbm9ycnZyc3h8eHZ2bXBtc3B1dGxwcHJvb29ydnVyVlZucWdseYRqbXFybm5qaG9ISkNHTU1KTVBNUE9ISkQ/QT05ODo6P0I/PEBCQUFERUdLRkNISUdHSENDP0I/P0BBPkRFQ0tOUlRMSklNVEdJSUpMSUtMSUpNTU9QUlBLR0NLR0NCSUlMTU9OSUpJR0NDQ0RJSk1MSVlybXd5eHp7enl8dnJwdXJ0eHl2eGpxbmpsbG50dG10dXtzdHhyb25xb3ZzbnBvcnBvcHN0eWpOYGdzanR8eWdvc3FpcWhkcUhLREdISEdKS0lKS0RGQj0+PTk5OjtAQj89QkJDQ0dGSUtKRElJRkdHQ0M7QUBCPkBAQkVDSU1QSEhLR0hLREhJTE1ISkxISUpMS01dUkhIRE5GQUNKSk1MUE1LTUpLRkdHSk1OUU5MYm1pdnZ3enl7en1ybWxza3B0dHR1aHBtamlra3RwbnR0eXByeXRvcnFvd3NvcXB0cnBydXR5a05WbXVscXt2aW5vaWt0Z2RvRktERkVHRUZGR0VHQkNAPjw9OTo6OkBDQD5CQ0RFSUVJSkxGSUlHRkZEQjtBQ0M+QENEQ0RHTE5IS05IREhFSUxOTUdJTEdGR0lJTE5LSUdFTkhCRk1LTUxPTU1OTUtISElPUlFSTlJmZmZxb3N4dXt6fGxoam5la3Fsc3BmbWxoaWtsdG1wdXR3cW94dG90c3J2c3BxcnRzcnR1dXZ2WFZ1dWtvdHJrb3ZsaG1lX3BHSURGRkVDQ0JFQERBPj8+Ojs7PTo8PkNBPkFDRUZKRklITEhHR0dGRUNAPURFQj5BQ0NDREdISUdNUEpGRkdLTk9LRkhJRkVERUlKSEpJRkhPS0NJTUtPTU9OT09OSkpJTFJVVVJPV2RgYW1ncHJvcnl6Z2VoaGRpbGdxbGZsbWdpa2xzbHB2dXRwbnZyb3Nyc3V0cXNzdXRzdXZ2dnl2dXR3bGp1dW1ydnFsbmxlckxIRUVIQ0JBQkQ9QkE+QT06Oj0/Oj0+QEI+QEJER0pFSUZJSEZGR0VDQkFBRkZDQkJCREVER0dJRkxRTElPSkpMTElHSEVHRkRDSUlIS0pHS1JNQk5OTVBOT09NTk9LS0tPVVdWVVNYX15caWFtaW5ocnNiZWZmZGhoZm5qZm1taGtrbXJpcXZ0c3Ftdm5vcXJzd3Nyc3R1dXZ2dnd2d3d2dHd1anN1bnV0c3FyamtzTUdIRkhCQkFERTxBQEBDPDg6PT45Pzw/QkBAQERGSEVIRkZIR0ZGRENFQ0RJRUNHRUJFR0VGR0dFSk1LSFFNSktISElFRkhIRUNJSUlLTUtPU05EUVJQUFFOT01OUE1MTVNXVlhYVVhdWl1kYGhiamlna19lZWZjZ2dna2dna21rbWxwcmh0dHVyc252b3FwcnR4cXNzdXZ1gpF5dnZ0eHV1d3htb3VvcnN1cXFpbnlNSEdISEJCQkZFPD9CQkQ8Nzo+Pjo+OkBCPj8/Q0VGREZERUhFREVDREVGR0pFRUpHQ0dIRkhHRUNGSkpHTktMS0hKTEZJSUtIRUtLTE1OT1JUT0hTVVNQUk9RTU5RTk1QV1pWWllWWl1ZWGFgYWBeaGVjYGRmaGdqaGhpZmhubGxubXFwaXV1eHJycHVwcHBydXZwdXN1d3V7fn14dnR3dnZ2eHBsdXBtc3Rub3JyeE5ISEdJREJDSEU8QEVCRT04OT4+PTw8QUI8Pz5BQUZDRUNDSURERUVGR0dHSUZHS0hESUhHSUdGREhLSUdLSE1LSktMSExLTUtKTktPTk9SVVZPS1VXU1BTUVJMT1FQT1RZWllcWllbXl5dYGNeXGFja2JgZGZncoVoZ2lmam1ucG9uc3JqdHV4cnNzdHJucHF2cnF1cnV1c355jn11dXZ2dnZ4cmh1cWtydGxxdnB0TElLSUtGQkVHRTxAR0NEQDo8P0A/Pj9CQTxAPkFBRkNFRURJRUZFR0ZISEZISElLSkZKSEhLSEZGTElISEpHTExNTExJTUtOTU1PTFBQUVVWV09LVlZVU1JRUUxPUlJQVltbXV5bXF5fX2FgYWRdY2BlZmBlaGpjc3Nmamdna29ycW9zc25zd3dxdXZ0c21vcnVvcnNwdXJ2cnSBdnV1dXd2dXd0Z3Rya3Fya3J2bnZKS0xKTEdCRURFPEBGRERDOz8/QUBAQENBP0I/QUNIQ0ZFRklGSUZHRElJR0lISkxISEpKSUxKRkpLSElLSkdLS01NSkpNTU5OTlBLT1BSVFhWTU5UVlRSUlFQTE5UU1JXW11eX11dYF9gYWFgYWNlYmRoYmRpamd2i2xqaWdtbnNxcHFwcHJ5dnJ1dXRzbW1zc21xcm90dXRycHN3dHV1d3Z1dXRlcXNrcHFqcnZud0tMTExNR0NDQUQ8P0VFRUM9QUFDQkJDREFDREFBRUdDSEdISEdKR0NISUdISkZJTEhJSk1LTkxHS0lIS0tOUUtSUU1TTUtOTk9QUE9UT1dYWFtOU1BXXFpSV1BOVFVUVFhaX2JiX2RhXmBiXmBlYWFjaW5nYmloaG54dmxoaW1uc3JwcXJycnZ0c3Vzc3Nua3NxbXByb3R2cnFxdXZ1c3d5d3V0dWNtdGtvcGpxdG93TE5MTExHRUFARD4+REVGQ0BDQUVEREZCQ0VHQ0NJRkNJSkpJSUtHREtKR0hKSUlLSEpKTkxPS0lMSEpMS1pmSmRcS2xTSE9OX25Va3NbcXBid2NTUGF2dWh1Y2F2YFhucWJkdmluemZbbHRgbGpUX3d2aWpnaWZnbG1qbW9qbW5zcnBycnFyc3Jzc3J0cm5sdG9ucHFxdXVxcXN0dnZ1dXl3dXR0YGt0a3Bwa3FycXlMTkpKSkZDP0BCPz1ERUZEQ0RCRUVERkJGRkdERUtGRUpNTEtMTEdHTUlHSktIS0tJS0tOTE5MTExJTExMW3NiZHBebG1VTU5mc11mZnFsbnRncGlfYVlubmJwcGJrampmb3F0ZXRub1xvdWdwTUpxeXZrYWBrZWVteGxrdm1ucHNycHJxcHFycXJycnRybW1zbm5vcHJ1dHFzc3R1dXV0d3h2dHRibXVrcHBscnJxektMSUhHRUQ/QUJAPkNGR0JGQ0ZFRkVEQ0hIR0RFS0hHTE5OTE1MRkpOSEpLSklMSkpKS0xNTk5NTUpNTU5bcm9vbnBwbGtNUFFsV01pYnRycGFtbnVcWWxRXG1tWnFta29teHh0c2lwXV9ya3FqVXV5eG9jXmtmYmdwcGppb3BwcnNwcXBxcHJycXFycnRsbXJtbm5vcnV0cXRydHV1dHV1enZ1dGVudWtwb2xzcnJ5SUtHR0VFRUJCQj5AQEZHQkdESUZFRUJGSUhIRUhMSkdNTU5LTU5HTE5JTEtJSk1JS0pKS09QT05NTE5OTFxoZHVdbHFXbE5QUW1UWWtea2x2YWxkc1NlY05tWWxcdHBraWx4and1aHBdXnJraFdiY3d8b2NgZ2dhZGl1eWtubnFzc3BxcHFwcnFwcHBydWttcW1tbW9xc3Rxc3J0dnZzd3Z6dnV0aG91bHNvbXNydHZITEZJREVFQ0FCPUJBQ0dESEdMSEVDQ0hLSUhGSkxMRk5MTFNSTEdMTEhOSklITkhKSklITk9NTkxKTk1KWnNwcG9xcW1sT1FSbllya2dvb3Fxb210XW5YYXRfbm9wb3Fyb251c3R0altedGN3eHJqbnpoYWFjZmJiaW10dXBzdXZzcXBwcW9ydHt/fn13bGtxbmxtbnByc3F0dHN1dXR4eHl4dHVrb3VtdG9uc3N2c0hLSElCRUVFQUE+RERCR0RISU1JRkNGSkxKR0ZLTkxFT0pLV1JLR0tKSk5JSEpMSUtKSEhLTU1NTUlLS0tTa2NbaV5faWNyclpfWWpuX2VlVWtfY1thYVFgbGhdalxuaWlkW3BmZHBdWlxrW21xY3BzbGRnY2RnYGBrbXBwb3R5cnVxb3BxbnmFiIeHhoWAdnNua21tb25xcnR0cnR1dXZ5eHhzdW5xdW53cXJ2dHdyR0dGSURFQ0ZBQEJGRURHQkhKTEhGREdLTElFRkpPTElQSUxbUUpFSEhLTUlISkpLS0lISUdLS0tMR0hLS0xNTUxKS01OVFtcVFBUTFBPTk9PVlFPT1FOT1FKSk9QUWRxaVRZV1xbXFZZW11YXVxcY2ZhYWViY2ZfX2ZrbWhtdHlydHJvcHB0hoeGhoaFhYaHg3pwbW1sa3FzdHRydHZ0dXl4eHV2cXJ1b3ZydHN1dXNHQ0VHRkVBRUNAREhERkdDSUtMSEZER0tMSUVHSVBLTE9LTFdMSUVFSElKSElLSU1KSEZHR0lHSElFRkxJSkxPTUpQXFdeUFxbYF5NWFlTXFxiXk1YWk1YYVJLWWFaUl9kXGFYW2RkVlZYXFlaWFxWWVxdYl5kYWFfZWhrZ210dHFxdHBxcoGGhoaFhoWFhYaGhoR9cmtpb3Jzc3N0d3l5eHl4d3h0cXhyeHNxcnVydE9CQ0RMTUJEQ0JFSUVHR0ZLSktIRUZJSktGRUhIUEtNTUpNUklHRUFIRkpJS0xKTEpIRkRJRkRGR0VGSkhDSk5LTFVfWWBYYGFbYFRYWVReXlpfUllcUF5cWU5fXF5TWl5jXlpdYGNgWV9jW2BeW1RYV1leXWNiY2FjZWhla3Jwb3Bwbm93hoaFhYaCe4CFhYaGhYaFf3VxcHJyc3Z5eXp5eXh4eHdyeXZ4cnF4dnR2YVNKSk1JRUNCQ0dIRkhHSEtKSklERktLS0VGSUpOS05LSExOR0hFPkdHTElLTEtLS0lHREhEQ0RFQUZKREBKTEpPW2NZX15hX1JUUldfYFxdWV5RWVxNVl9XS1FZW1BaX2FhXV5jYWBiYmJjY2VaUVhVVVxZXWNgX19jZGJob21ubGxsbHWFf4SDeXV8hIWFhYaGhYWGhoN9d3JydHh5eXl5f359eXV5dnZybnp3dnhYUUtGQ0dFQkVHSUZHSEhGRklHSEdIS0lMRERLS05NTEtIS0pISUY/R0dOS0tLTUtLS0lGR0NEQERBSElCP0lKSE9dYVpbZF1fVFFSWF1cXFxfWktXXExSXFlJTV5RT1xfYWNjY2NiXGRjYmRjZlhRVVRRW1daYF9eXmFhX2Rsa21qamxudn51gXp8hIWFhYWFhYaGhYaFhYaGgnpyc3V1e4WHh4eGhYSBfnhwend2eFxSTUNASUZDRktKRkZGSEdHSUdGRklMSk5GREtLTU5KTElLSkhIRkJISFFNS0tPTEpLSUdHRUQ/RUNJSUJCR0ZFVF1ZXlhfWV9bXVVYWE9dXVFLSlZeWF5bXVVZYFJRX19iYmBgYmJgY2JhZGRiWE9RUVFaUltdXV1dXl9fZGhnbGpubnB7e3x+e4CCg4SFhIWFhYWEhIWDhISHh4FzcneFh4eHh4eHh4eIh4WDgHx4XFNLQ0FIRkRHTVJIQ1FKRUdISEVGS0pNUEVGSUpLTkxMSUtMSUhHREhLUU9NTVBMTEpLSElDREFFRElHQ0JHRkRXVUVcVF1TVl9YT1RVTlpaTUlKVGBhW19YXl5hXU9ZYVxgYF9iY2JdYWJXYF9UUE9PT1hRXFtbXFxeX2JmZmVsZW9vd3x7gHt9f4CEhISEhIWFhYODhYKDgoWFhnpvgYaGhoeHiIeGhoaFhYSFg35JTkZERkZIRElSYlBDVl5JR0dIREZNS1BQRUlJSktOTExLTEtJSkdFSk5RUU5PT01OTE1IS0FEQUNER0VDQkVHQk1IQktLT09OTEZNRkdJSkhHTEtNT1BJTE9QT1NPTFBTUlVaWVdZWFhkV09TVFBQTk1PVFNaWFhaXVxgYWRlY2dja2xwc3J5eX97en+EhISFhISEhIKEgH57gYOBfXuFhIaGh4eHhYWFhISEgoGAfUtJRUVHRkdES01dTEdHWExHSEpIR01MUVFITEtLS05NVU5PSkpLR0dLUFNTTlBPTk5OTkdLRmBFRF9MRWZkRU5cSV5bcm1PTVVtWUxEUWBVa1dnSl1XVV5ETFFVTExTVlFSVFhXVFhVVFxVUGZaaGhkWFJqUlZVVFtcW2BgYWJhYmBmaGZua2hyenx9foGEhISEg4ODgX18enJ7gXp7f4KAg4SEhYWBhIWBg4N/fnp7TElGR0ZIRUVLT1NJSkZgVEhJT0pJT01SUUxNTExPUlVST09JTE1HSE1RW1lPUFBOT09PSUpRf1FJfFlZcnRZUW1IcW5vYVZQcXFzUENrc21xc3BTb19bblhdVlxYVWtoVV1WY1pgWVtfVlZYf2p0dXVeX3ZeV2FbW2ZbX2BhYGFdYGFnbXBsYHB3dHiBgYKDg4J/fX+Adnh6bHZ+dHh9gHx+gIGChHyAg3p/gX9+d3dOSkVITU5CRExMRklLRVFWTEtOSUtSWFdRTk9PTVFUTk9RT0tLTkdNUFNbWlNRUk9QUFBKSFp4XVR4ZWhaU1VSdmd0bHBibmZqUXJPTXdtanJwc3JxcnBvb4BdZXp1eHFxenF+c31rdX1iUmh8ZXNzb3Jye3xvfnhugHJfYGBiYVpgX2drbmtibGZnbXd+gYCDfnt4d4B0dnppcn5uc3x+d3h7foCDeHyAdXx/fHxzc05LR2BdR0FFTU1ISkpHSlBPTU1KTlZeWVVMUVNOWFpNU1NSTktPSFFSVFlXVlBUUFBQUUtIZ3hsY3hybVtLTlZ5cHVtdWJvdlBlZUpmdnFtd2+AamZ4eGlXclFoem1panp6fmx4en9vaG9ZdnZqdnVwgF9yZn1pbHh8b15fX2JhW11iZGdpamRnYmNkbGxwcHN0c3NzeXFyeGJsdWdxeXtzcnZ5foFzdXpufH15eHJuTktTdU5DQkZQUEhKS0lLUE9PT01QWmBaV0tUV1BhXlJWUVlSTFBJU1RWWFdXT1VQT05SSktyb3V1cXVxZGliV25McXBeRmh5V3ZUTGl5fXhgeXtzbmFdbW9jUmhxdW5teXB3bHZ0dHJsbl10fnprbXl8a3RsfGtwdnV4Xl9fYl5dX2RkaWdoZWVeYWJpaWlqa25va3FvbWpwYWNmY293eG9tcHN5f25xcGt7enRzb21MTFtWSEdFR1JQSUxNSktQUVBQUFBXXFhVTVVZVWVYUlJZXlNMTklUVFZXWVdPU05OTlFIUm1IaXdLYGR2dlZYbE9ubHtzYWpnf3ZVTFdraH1sbWx4X1pwenteYHpzY3JveHFoZH1pcnxeVExsYHZ1a2l1e3ptfnhrfHBcXl5iW15iZGRnZWVlYlpjY2lra3JzcnZnbGloZGdgYWthZ3NybGdtbXJ8a21oa3t0bW5rbU9IS0tISkhIUVBMTk9MS1JSUk9TUldSVlRQV1pWVlRUVGFfUE5NS1RTVFFWVk5OTE1PUEpIUU5QVUxLTFNUVFNUUFZVUVFOUVFYWVJOUFVUWFhYW1tVUlNXW1dYWFpPU1VXWFhSXllXXlZUUFlSV1dXV1heWmdyXltbWVxdX2NaX2NjZGZkY2NiWmNiZ2ZlbW5tdWVlZ2NhZl9dZ2BkbGhmZ2tocHpoZ2dqdWpoZ2lsUUlLTExNS0pTUU1RUE9MVlVUUFRVWFVZVVFaXVZVVFdVWVdPT0xNVlRRTlVTTk9NTFFQTEpRUUtRTUtLUFNVU1FRU1NJSExOT1FSUVFRVFZSWFdcV1NSUFJUVVZTWlFOU1JXVlRZVlVaVlRSVVRUVFdYVlxZXmBdXFpaXFxfY1tdYmNkZmRkZGFZYGFjYWJoaGltYmFkXl9jXVpkXGJtYV5mZWZtc2RpZ2prZWRjZmhQSktMT09MTVNQTlNRUU1YV1VUVVdXV1pVU1xgVldWWVVYU1BQSk5XU1BOVVBOUU5MU1BNT1VTTlFOTU5RVVFVUVJUVU5LTU9RVFRSUlFWV1VZWltZU1VSVFdWVllbVFBUVVhVVVpVV1pWU1JXVlVXW1haX1xVWF5cXl1bXWBhXltiYmNnZmVkYlhfYWJdYGdkZmVhXl9dXV5aWmBaX2dgXl1dYmhrYWdmaGZkYGJjYU9MTUxRUUxPVE9PU1FPUVtZV1dYW1lYWFZcamRWWFlaV1ZTU09KTlZUUE9UUFBQTU1SUlBSWFRRUU9NT1NWT1hSVFVVT05NUVRWVVRUUlRXVlpdXFpWVlFRVlhWW1tXUVRXVlZWWVRYWFZTUllXVVpeWV1fXlVeXF5gXFtfX19fWmJiZGhnZGRhWGFgYl5eZmNjYGJdXFxcXFlaW1hbYVteXVxfYl9fYmRlYmRfX2BcUE1OTlJRTVJST1NUUU9VXFpaV1tbXFlaW2RxbWhkX1tYVlVXUUxNVlNNTlJPUVJPTFFTUlVaVVNQUE1RV1dSV1NTU1hNT09RVFhWVVVTVVlYW15dW1tWUU5VVlVbXFdSVFdWV1hWVFhbVVRSWlhXXF5aXl9gVWFcYWFdYGJfXGBdY2BjZ2hkZmBZY2BhX19lZF9gYltaXFtcWVpZWFdcWlxbYF5fW15eYWBeY1xZYFpRTk9OVlFQVFFPVFRTUFdcXFxYXlxeV1xeanF3eYBjXFtVVVdRTU9WU05RUU9SVFJMUlRUWVpXVU9ST1NYV1RTVVJSWk9QU1JWW1ZXV1RWW1hcXVtbXVZTTVRVVVxcVlJVVlZYWVNVWlxVU1NdWFpdXlxgYGBWYVtjYl1hZF5cYmFiX2NmaWRmXltkYGFgYGNlX2JeWVpeW1xbWVhZV1daWlphXF1bXVxcWl1gV1tbWlBPT09ZUFVUUlFXUlRQW15eXVtgXGBVXF1oanJ9c2xnXFRXV1FOUlpTUlFUUlRVVEtSV1ZbWlpTT1NRVlZWVE9XUlNaUlRUVFhdV1hZU1hdWF5dWVpdVFVOVVZXXltYUlVVWVlZVVdaXFZUV15aXV1gXWJiXVlfW2VhX2RkXl5jY2FeZWZpZGZeXWRhYGFhYmRgYl5YWl9bXFtYWFhXV1tZW2BcW1tcW1haW15WXlldUU9PUlpQWlRVVlZTVFReXmBeXmJcYFVdXmJreXRsfWtaVVlUUFBTXFRVVFVUVllXTFJbV11bXVJPVVNYV1dUUFhSU1dTVlVVW11YW1lVWl5YX15ZXFlRV1JZWFlfW1pUVVZaWVpXWFpcV1VbXlxeYGFfZGNcXl1dZWFhZmReXmRjYFxnZGhlZGJfZGFgYWBiYl9gXldYXlpcXFpZWVdWXVpdXlpZW1xbV1lcXVZYV11TTlBWWVFdVVZZV1dVWF9fYWFgY11fVF1fYmVldYF6aFdZWVNVU1ZcWFdXVlZXXVhPVV1aXl1cVFJXU1dXVVNUWFJTVlRYV1hdXlhdW1ZdX1hfX1hcVlFYVFlaWmFZXFZXWFtaW1lZWltZV15fYF9jYmFkZFxiXGBmYWRmZF5fZGJiW2ZjaGVjZmBmX19hYWFhYF9eVlVdWVtcW1lbWVldW1tbWFhZW1laWl1fXVRZXVVOU1lWU1xUVldZVlZcYGFiY2BjXl9WW2BkYV96dW9oWVtZVVdUV1taWlxaWFlgV1BVXlxgYFxUVFhQVVdWVFZXUlNVV1paW19eWl9cVl9fWl1eWV1VUllXWVldYlpeVldbXFtcXFtaXFpaX19gYGRiY2RkYmRZYWZiZmZlXmFiYGNeYmNpZGNnX2deYWJjYWFgXl9YVFtaWltbWFtYWFxbWltXV1lYV1xbXGBdVl1dU09WWVZWWlVYVVhXWF1fYmFkYWRgXllZYWRiYGxmaF5bXFpWV1hZXFxdX1tZW2JWVFheXWFjXFJWWVBXV1dXV1ZTVVRYXFxeYGBdYFxXYV5bXltaXlhVWFdbW19gXF9YWVxcXV5fXFtdWVxgYV5gZWNkZWVmYlhjZWRoZ2ReY2BgZWNcZWlkZWlfZl1jYmNhYWBfX1tYWVtZWlpYWVhXW1taW1dYWlRZXVxaYFxVXmJOU1dZVldZWFtcWFdZXmBiYWRhZGFdXllhY2JfYWBgXlxcXFdXW1tdXV9fXFpdY1laWF1gY2RfUlhZUFdXWFlZV1ZXVlxdXmBhYF9iXllhXV1eWVxeWVhVV1tcYF5dX1paXl1eXmFdXFtaXGBiX2JlY2VmZWZiWmRmZmlnYl9jXmFmZFppaGJmaWNlXmJiY2FgYF9dXFpYW1lZWFhaWFdaW1pZV1hVVVtdXV1gYGJieEtYV1tZVlxbXF1aV1xdX2BiZGFiYV1gWGJjYmBjYWJdW1xbWFdbXF9dYF9dW2BkXVxYW2JlY2FSXFpPWVhaW1taV1pZYF1gYmJgYWNfXGJdX11bXl1ZWVRYXV1fYF9gXFteXmBiY11cWFxeYGJiY2VkZmRlZmRcZWZnaWZjYWJcY2dgXGloYmhpZWRgYmFjYV9gX11dXFlcWVhXWFlYV1xaWldXWE9YWl1hY2Zmcmt/SllXXFpaX1xbXlxYXVteX2FjYmFhXWJbYmRiYGJiYlxbW1pXWGlxYFxgX11cYWNfXllZY2VkYVNfWlJZWFxdXVtaW1tjYGJiY2BiZGFgY15gXF5eXllYVVtfXl1hYWBeW2BhYmZjX11UXWBgY2RkZmVnZWZmZV5lZmhoZ2RkYFpmZ15haGhiaGhmY2BiYGNiX19fXF1bWltZWFhYVlpWXFtaVlZVTVhXXGdpa2h1eIF2dnZ2dnZ2dnZ2dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6e3p6ent7e3t7e3t7e3t7e3t7e3x7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHt7e3t8fHx8fHx8fHx8e3t7fHx8fHx7e3t7e3t7fYmIhoqHhIKCgoOCg4OCgoKCgoKCgoKCgoGAgYCBgICAgYCBgYGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t6e3t7e3t7fHx8fHx8fHx8fHx7e3t7e3t7e3t7e3x7e3t7e3t7fHx8fHt7e3t7e3t8iYmHiYaFgoGCgoKCgoKCgYKCgoKCgoKBgYGAgICAgICAgIGBgYB9fHx8e3x8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eHh5eXl5eXl5eXl5eXt7e3t7e3t6enp6enp6e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx7e3t7e3t7fHx8e3t7e3t7e3t7fHx8fHx7fHt7e3uHiYiJhYSDgYKCgoODgoKCgoKCgoKCgYGBgICAgICAgICAgYKBgH58fHx8fHx8fHx8fHx8fHx2dnZ2dnZ2d3d2d3d3d3d3d3d3d3d3d3h4eHh4eHh4eHh4eHh4eHh4eHl5eXl5eXl5eXl5e3t7e3t7enp6enp6enp7e3t7e3t7e3t7e3t7fXx8fHx8fHx8fHx8fHx8fHx8e3x8fHx8e3t7e3t7e3x8fHx8fHt7e3t7e4aJiYiFhYOBgoKCgoOCgYKCgoKCgoKBgYGAgICAgICAgIGBgYCAfnx8fHx8fHx8fHx9fX18fHVwb29vb3Bwen59fX19fYSMi4uLi454KSkqKiopKz0/Pj4+Pj5tgH5+f397pdfT09PT1r2GiYmJiYiQzNPS0tLT1Z6GiYmJiYmLjYyMjIyOiX9/f39/f359fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx8fHx8fHt7e3t7hIuHh4aHgoGDg4GCgoKCgoKCgoKCgoGBgYCAgICAgICAgYCBgIB+fHx8fHx8fHx9fXx8fH19dXBub29vb296gH9/f39+hpCPj4+Pk3kZGhoaGhocMTMzMzMzMmqCf4CAgHut6eTk5OToyomMjIyMipTd5uTk5eTnpYmMjIyMjI+Qj4+Pj5CLf39/f39/f319fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e3uCjYeIh4eDgoSCgYKCgoKCgoOCgoKCgYGBgICAgICAgICAgICAgH58fHx8fHx8fXx8fH19fX12dXV1dXV1dXZ3d3d3d3d4eXl5eXl6eG9vb29wcHBycnJycnJyd3p5eXp6en6Dg4ODg4SBfHx8fHx8fYOEhISEhIR+fHx8fHx8fH18fH19fX18fX19fX19fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e4CMhomHh4SDhIKCgoKDgYKCg4KCgoGBgYGBgYCAf4CAgICAgICAfnx8fHx8fHx8fX19fX19fXZ2dnZ2dnl3dnZ6e3h7eHd2d3p4enp5fXl4eHl4eHh5eXl5enp5eXl5enp6eXh4eXl5eXl7e3t7e3t7eXl5eXl5eXp7e3p7e3t7e3t7fHx8fHx8fHx9fX19fX19fX18fH19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8f4uHi4qIhIODgoKCg4KBgoKDgoKCgYGBgYGAgIGAf4CAgH+AgYF+fX18fHx8fHx9fX19fX19d3d3dnZ3fXh3d316eH14d3Z5fXx9fXp8e3d3d3d3eHh4eHh5eXl5eXp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fHx8fHx8fHx7e3x8fHx8fHx8fHx+iomNjImFg4SEgoKDgoGCgoKCgoKBgYGBgYCAgICAgICAf4CAgH19fXx8fH19fX19fX19fX13d3d3d3p9eHt4fHx3e3h3dnp9fX19eXx6d3h4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fX19fXx9fX19fX19fX19fX19fHx8fHx8fHt7fHx8fHx8fHx8fH2Kio2NioWDhISCgoKCgYGCgoKBgoGBgYKBgIGBgICAgIB/gIGAfXx9fX18fX19fX19fX19fXd3d3d3fX55d3d4e3p7eHd2e3x9fHt6fHt3eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt8fHx8fHx8fHx8fHx8fH19fX18fH18fH18fHx8fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8foqJjo2JhISEg4KCgoKBgYKBgoKCgYGBgoGAgYKAgICAgH+BgIB8fH19fX18fX19fX19fn5+d3d3d3d5fHl7eHx9eXt5enl6fXx9fHt9e3h4eHh4eHh4eXl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt7fHx7fHx8fHx8fHx8fXx8fX19fX19fXx8fHx8fHx8fXx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx/iIeNioeFhoaDg4ODgoGBgoGCgoGBgYGCgYCAgoF/gICAf4CAgHx8fX19fX19fX19fX5+fn53d3d3d3Z4eHl3eXp4enh5eXh7eHp7eXt5eHh5eXh4eHh5eXl5enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX18fH18fH19fX19fH19fX19fHx8fHx8fHx8fHx8fX+HiIyIhoeHhIKDhISCgYKCgYKCgoKBgYKBgIGBgYGAgIB/gIGAfHx9fX19fX19fX1+fn5+fnd3d3d3d3d3d3d3eHh4eHh4eHh4eHl5eHl5eXl5eXl5eXl6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fHx8fX19fHx8gIeIi4eHiYWEg4SDg4KBgYGBgoGBgYKCgYGBgIGBgYCAgICBgX97fH19fX19fX19fn5+fn5+d3d3d3d3d3d4eHd4dnl5eHh4eHh5eXl5eXl5eXl5eXl5enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fH19fXx9fXyBhoqKiYmIhIOFhISCgoGBgYGCgYGCgoGBgYCAgYGAgIGAgIGBf3x8fX19fX1+fn5+fn5+f394eHd4eHh4eHZxZGpeam15eXl4eXl5eXl5eXl5enp6enp6enp6enp7e3t8e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIGFiYqJioeEhYWEg4KBgYGBgoKBgYKBgYGBgYCBgYCAgYCBgIF+fH1+fn5+fn5+fn5+fn9/f3h4eHh4eHh5bWRiZV9fXm94eXl5eXl5eXl5eXp6enp6enp6enp6e3t7e3t7fHx8fHx8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goWKiomJhISGhYSDg4KBgYKCgoGBgoGBgYKBgIGBgICAgICBgH58fX5+fn5+fn5+fn9/f39/eHh4eHh4eW5kZWdlZGJeZnh5eXl5enp6enp6enp6enp6enp6e3t7e3t7e3x8fHx8fHt8fHt7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChouJiIqEhYaEg4OEgoGBgYGCgYKCgYGBgYCAgYGBgIB/gIGBf3x8fn5+fn5+fn9/f39/f394eHh4eHl3Z2VkZWZkZWFfaXl6enp6enp6enp6enp6ent7e3t7e3t7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHt8fHx8fHx8fHx9fX19fX19fX19fX19fXx9fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4eJh4SEhoSCg4WBgYGBgYKCgYGBgYKBgICAgYGAgYCAgYF+fHx/f35/f39/f39/f39/gHl5eXl5eWtlYWJlZWFlZV5ieHdze3p6enp6enp6enp6e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fH18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19g4aLhoiFhYaEgoOEhIKBgYGBgoKBgYKBgYGAgYGBgYGAgIGBgn98fH9/f39/f39/f3+AgICAeXl5eXl0Y2NlZGNmY2doZGZsZF5ze3p6enp6enp6enp6ent7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn6DhouGhoaGhYODg4SDgYGBgYGCgoGBgYKBgYCAgYGBgYCAgYGBfnx8f39/f39/gICAgICAgIB5eXl6d2RhY2diYmRdW2VfYV1eYGFoeHp6enp6enp6enp6e3t7e3t7fHx8e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+foSFi4eGhoaGhIODg4KBgYGBgoKCgYKBgoGAgIGBgYGAgYGBgYF+fX1/gH+AgICAgICAgICAgHl5eW9vYmJiZF5jZ19dYWFgXF9kYlttfHp6enp6enp6enp7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7fHx7e3x7fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5/hIiLhoSHhoaEhIODgoGBgYGCgYGBgYKCgYCAgYGBgYGBgYGBgX5+fYCAgICAgICAgICAgICBeXpwXWJlZGJkXmZnZ2BZYmJhY2VfXF1ze3t6enp7e3t7e3t8fHx8fHx8fHt7e3t7e3t7e3t7e3t7fHx8fHx8e3x8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fn19fn5+fn5+fn5+fn5+foCFjIqEhYaGhYODg4SCgYGBgYKBgYGBgoKCgYCBgYGCgICAgIGBf35+gICAgICAgICAgIGBgYF5emxiZGdjYmdmYWBgZGFiZWRjZGNeXGJ1fHt7e3t7e3t7e3x8fHx7e3x8fHx7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/gYeMiYWGhoeFg4SDg4GBgYGBgYKBgoKCg4KBgIGBgYKBgYGCgoF/f36AgICAgICAgIGBgYGBgXp7dGdnZmZkZGZmYF5fYWNlaGRlXmJkYHR8e3t7e3t7fHx8fHx8fHx8fHt7fHt8fHt7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f3+CiYqIhoaIhoWDhIOCgYGBgYGBgoGBgoKCgoGAgYGBgoKBgYKCgX9/f4GBgYGAgYGBgYGBgYGBenptaGNjZ2ZnZWdmZmdiZWRlYmdbYmVgdnx8e3t8fHx8fHx8fHx8e3t8fHx8e3x8fHt7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f39/f4SJioiGiYeFhYSEg4KBgYGBgYGCgYKCgYGBgYGBgYKBgoGBgICBgH9/gYGBgYGBgYGBgYGBgYF7emlpZGNqZmFgZmVjY2NnaWRjYmBiZGJ0fXx8fHx8fHt8fHx8fHx8e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f39+fn9/f39/f39/f3+AhIqMiIeJhoSFhYOCgYGBgYGBgYKBgoGBgYGBgYGBgoKBgYGBgYGAgH+BgYGBgYGBgYGBgYGBgXZzZWRnY2RmZWJlZmdkZmhmZWNgYGNkYHF9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fXx9fX18fHx9fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/fn5+f35+f39/f39/f3+AgICFioyJiIqJhoaDgoKCgYGBgYGBgoGBgoGBgYGBgIGBgYGBgYGCgX+Af35/foCCgoKCgoKCgoKCc3NnZWRkZWlqaGZnZ2NhZmZlZmdmZWVjdX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gICAgICAgIWLioqJioeHhoSCgoGBgYGBgYKCgYKBgYGBgIGBgoKBgYGBgYGAf4B+dHRzdX1/goCAfn5/gYB0cmdkZWNmaWppZWNlY2BmZGRnZ2JiZWFwfXx8fHx8fHx8fHx8fHx8fHx9fX18fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f39/f39/f4CAgICAgIB/houLiouLh4eHhIOCgYGBgYGBgYKBgoKBgYGBgYKCgYCBgYGBgoCAgH5zc3NzdHV4dXV0dHV2dXVwZmNmZWhoaWdoZ2VmZWJfZGVmY2BiZ3d8fHx8fX19fX18fHx8fH19fX19fX19fXx9fXx8fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gIB/f3+AgICAgICAgICHjIyIi4qHh4eEhIKBgYGBgYGBgoGCgoGBgICBgoGBgYKBgoKCgYCAfnNzc3Nzc3NzdHR0dHNzdW9jY2FnZWhoZ2pmZGVnZmhmY2JlYl5ieX18e3t8fX19fX18fHx9fX19fX19e3x9fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn9/fn5+fn5+fn5/f39/f4CAgH9/gICBgICAgICAgYCAf4CAgYGAgIeLi4iNiYiJhoSFgYGBgYGBgYKCgYKCgYGBgIGCgoGBgYKBgoKBgIB+dHNzc3Nzc3Nzc3Nzc3N1cmdlZWRlamhoZ2ZpaGdjZWViZGNoZGd7eHVzc3R2dnl4dnR0dHZ3d3d2dHR0dXV4d3h4d3d6e3x9fXx9fn5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f35/f39/gH9+fHt7fX58eXl2dnZ5fHx6end2d3l7fXt4hIyMioyHh4iEhYSBgYGBgYGBgoGBgoGBgYGAgYKCgYGBgoGBgoGAgH51c3Nzc3Nzc3Nzc3Nzc3VzaGVnaGVrbGhqZ2lqZ2dnZmRkYmVkbnV0dHNzdHNzc3Nzc3Nzc3Nzc3NzdHNzc3Nzc3Nzc3N0dHV1c3V3eHl7fn59fn98f39/f39/f39/f314fH5+fXx4dXZ3eXd4dnRzc3N0dXRzc3Nzc3NzdHNzc3R0c3R0dHODjI2KiYeIhoOGg4GBgYGBgYGBgYGCgYGAgYGDgoKBgYCBgYGBgYCAf3VzdHRzc3Nzc3Nyc3NzdnZpY2hqaGpsZWZpbGhgZmVkY2BkZGZ0dXV1dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHRzdHRzc3Nzc3R2dnV1d3V4fH9+fX9+fHp4dXN0dXV1dHNzc3Nzc3N0dHR0dHR0dHR1dXR0dHV1dHR1dXR1dXV1dIaMjYuIhoeEhIWCgYGBgYGBgYGCgoGAgYCBgYKCgoGBgIGBgYGAgIB/dnNzc3Nzc3Nzc3Nzc3N2dnNnZ2pmaGdmaGhmZGlnY2NnZWVmcHZ1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dHR1dHR0dHR0dHRzdHR0dnV1d3Z0c3R0dHR0dHR0dXV1dXV0dXV1dXV1dXV0dHNzc3N0dHNzdHR0dHR1dXR1iY6MjIqHh4SEhYKBgYGBgYGBgYKCgoGBgICAgoKCgoGBgYGBgYCAgH93c3Nzc3NycnJyc3NzcnZ2dW5kXWNnZWlraGVoZ2dqamlnZXB2dXV1dXV0dHRzdHR0dHR0dHV1dXV1dXV0dHV1dHR1dXV1dXV1dXV1dXR0dHV1dXV1dXV0dHV0dHV1dXV1dXV1dXV1dXV1dXV1dXV0dHNzc3Nzc3N0dHNzc3Nzc3R0dHR0dHWKjoyMiYaGhIeFgoGBgYGBgYGBgoKBgYGBgYGCgYKCgYGBgYKBgYCAf3hzc3Nzc3JycnJyc3NzdnZ3d2liaGhnamtpaGZkZGVmaWhwdXR0dHRzc3JxcnJ0dXV0dHR0dHR0c3NycXFxcXNzdHR0dHR0dHR0dHV0cnJyc3R0dHR0dXV1dXV1dXR0dXR0dHR0dHR0dHR0dHR0c3Nzc3Nzc3Nzc3Nzc3N0dHN0dHR0dHR0dYuOjImGhYWFh4SCgYGBgYGBgYGBgoKCgYGAgIKCgoGBgYGBgYGBgIB/eXNzc3NycXJycnJzc3N3d3d3bGpoZGhpa3Z6a2VmZWhnbXJzdHN0c3JwcHBxcnN1dXR0c3Nzc3JycXBvb29vcHFzc3NycnJyc3R0dHNxcXFyc3R0dHR0dHRzc3Rzc3N0dHR0dHRzdHR0dHR0dHRzdHR0c3NycnFxcnJzc3Nyc3NzdHR0dHN2jZCMh4eFhYSEgoGCgoGBgYGBgYGCgoKBgYGAgYGCgoGBgoKBgYGAf395c3NycnFxcnJycnNzc3d3d3dzc2pnaWloeX99cW51bG5wcXJycnFxcG9wcXFxc3R0c3NycXFxcG9ubm1ubW5ubnBxcnJycnJycnJzcXBvb3BxcnJzc3JxcnJycnJycnJycnJzc3Jzc3Nzc3Nzc3Nzc3Jxb29ubm9vcXJzc3Jyc3NycnNzcnaPj4uHhoWFhYOCgoKBgYGBgYGBgYGBgoGBgYGCgoKBgoGCgYGCgX9/f3hxcHBwcXFycnJyc3Nzd3d2dnd2cnF0c252f352c3hwcHBycnJycXFwcHFxcXJzc3Nzc3JxcXBwb25ubm5ub25vcHBxcXFxcXBwcXJwb25vcHFxcXFxcHBxcXFxcXJycnJycnJycnFxcnFxcnJycnFwb29ubm1ubm5vcXJycnJycnJyc3JxeI+OjYaDg4aEgoOCgoGCgYGBgYKBgYGCgoGBgYKCgoKCgoKBgYKBf4B/d29wb3BxcnJyc3Nzc3J2dnZ2dnZ3dnZ1c3l/fnd3d29wcXFxcXFxcHBwcXJycnNzc3JycXFwcHBwb29vb29vb29wb3Bvb29vcHBxb29vcHBwcHBvcG9wcHFycXFxcnJxcnFxcXFxcXFxcHBwcHBxb29ubm5tbW5ubm9wcXFxcXFxcXFxcXB7j42NhoODhYOCgoKCgYKBgYGBgoGCgIGCgoGCg4KBg4KBgYGAgYF/f392bm9wcHBxcXFxcXBwcHZ2dnZ2dXR0c3NxfYB9fX9zb3BxcXFwcHBwcXFwcXFxdHFycnFxb36CbnBwb29wcG9vb29vb29vb3BxcXBub3Bwb29wb29wcnJycnFxcXBxcnFwcXFxcHBwcHBwcHBwb29ubm1ubm5ubm9ub3BwcHFxcXFxcXFxcIKRjoqEhIOFhIOCgoGBgoKBgYKBgYGBgYGCgoKCgoKCgYGBgYCBgX9/gHVvb29wcXFxcXBwcHBwdnZ2dXRzcnJycnGAgoCBeXBwcHBvcHBwcHFxcXFxcXCHiHBycXB0moFucHBwb3BxcHBvb29wb29vcXFwcG9wcG9vb25vcHFxcHBwb3Bvb3BwcHBwcHBwcHBvb29vb29vbm5tbW1ubm5ub25vb3BvcHBwcHBwcHBwiZCMiISDhIaDg4KCgYGCgoKCgYGBgYCAgYGBgoKBgYGBgYGBgIGBgH+AdG5vb3BxcXFwcG9vcG92dnVzcnFxcXFxcICDg39ycHBwcHBwcHBwcHFxcHBxcX2ig29yb42ffG9wcHFwcHBwcHBwcHBvcHBxcXBwcHFxb29vbm9wcHBvb29vcHBvb3BwcHBwcHBwcHBvb29vbm5ubm5ubW5ubm1ubm9wcG9vb29vb3BzcXWPj4uJg4KFh4ODgoKBgoGCgoKBgYKBgYGBgYGBgYGBgYCAgYGAgYGAf4B0b29vbm9vb29vb29vb3Z1dHNxcXFxcXJygIKCgXRxcXFxcXFxcXFxcXFxcXJxdZ6id3F3oJx9b3FxcXFwcHBwcHFxcXBxcHBwcXBwcHBwcHBwcHBwcHBwcHFxcXBxcXBwcHFwcHFxcXFxcXFxcXJxcnFwcnRycnR0dHR1dnRzdHR0dXd3gpCPi4iDgoaHhISCg4GBgYKCgoGBgoGBgYKBgYGBgYGAgICBgYCBgYB/gHVvb29vb29vb25vb29vdXRzcnJycnJycnKDg4OCdnFycnFxcXJxcnJxcXJycnJxmKmQb4KjnX5wcXFycXFxcXFxcXFxcXFwcXFxcXFxcnNzcnJyc3V1dHR0dHR0dHV2d3d3d3d3eHh4eHd3eHh4d3Z3dnV2dnZ2d3h6e3x7e3t6enp6enyGkI2LiIODiIeHhYODgoGCgYKBgYGBgYKCgoGBgYGAgYCAgYGAgIGBgH+Ad3FxcXFxcG5ucG9wcG92dHV1c3Nzc3NzdYiDgYN5cnNzcnJyc3Jyc3Nzc3JzdHKTqaR7iaGdfHJzc3Nyc3N0dHV1dXV1dHV3eHd3d3d3eHh3eHh4eXl5eXl4eHl5eXp6e3t7e3t6enp5eXh3d3d1dnV2dnd5enp7fn5+fX1+fn5/gH5+gIyQi4qHg4WIi4iEg4SDgYGCgYGBgoGBgoKCgoKAgYGBgYCBgYGAgIGAf4B8enp5eXx5eHh2dXZ2dHl2d3h3d3Z3dnZ6fnx+fXx2dnd3dnV4enh4eHh4d3h5eaC0qaapqZd9e3l5eXh4eXl6enl5eXh4enp5eXh4eHh3dnd3eHh3eHh5eXp7e3p8fH1+fX9/f359e3t7e3p5enl5e3t/foB/fn5/fn19fX5+f35+fn6AjpCNioeEhoqLiIaGhIOBgoKBgYGCgYGCgoKCgoCBgoKBgYGCgYCBgIF/f39/fn19fX9/f318e3t7eXh4eHh5eXl4eXh5eXl4enp6enp6e3t7fH1+fHt8e3uKr6Shtaqso397enp4eXh4ent6enp5eXp8fHt6enx8fHp6ent9fHx+fn+AgoGAgYKAgH9/gYGBgIB/f35+fn5/fX1+f4CAf35+f39+fn9/f39/gH+Af4OQjoyHhoWIi4yIh4aFg4GCgYGBgYKBgoKCgoKBgYKDgoGBgYGBgIGBgIB/goOCgoGBgX99f39/f4F6enh4d3h4eHh5eHh5enp5e358enx9fXt8fX19fX19fZmllqKxoJmnlH2Af319fYCDgoCAf318fXx9fXt9fXx8fH19fX1+gYGChISDgoB/gYGBgH9/f4B/f39/f39+fn9/f39/f35+f3+Af39/gICAf4CAgICAhJCPi4eGhoiLi4mKhYaDgoKCgYGBgoGCgYKBgYGBgoOCgYCAgYGAgIGBgH+ChIKCgICAgH9+fn+AgH9/fn18fX19fYB/fX+Af35/gH9/fn9/gICBgICBgIGBnJyNoLCgn6KfgICBgH5+f39+f4B/fn5+f39/gYB/f4CBgYCAgYOEgoGCgoGCgH+AgYCBgYGAgH+BgICAf39/gICAgYGBgIGBgYCAgICBgoGBgYCAgYGFjo6MiYaHiYyLi4qGhoOCgoKBgYGCgoOCgoKBgIGBgYKCgICBgYCAgYGAf4KFg4KBgYCAf39+fn+AfX5+fn19fX5/fn9/f35+fn+AgYCAgICAfn9/gICBgYCXm5CYsaGYlZ2FfX5+foB+fn5/f35/gIGBgoKDg4KCg4KBgYKDg4OCgYGBgYKBgoKCgYKBgoGBgYGBgoKCgYGCgYKCgoGBgoKBgYKCgoKCgYGBgoKCgoaPkY+KiImKjI6MiYaFgoKCgoKBgYKCg4KCgoGBgYGBgYF/gIGBgYCBgIF/gYWEg4KCgoGCgYCAgIB8fHx7fH18fH9+fn9+fn5+f35/f39/f39/gH5+gIF+f6GrpZakm5uYoqCHf35+f4B/gIF/f39/f3+BgYGCgoCAgYKDg4SDg4ODgoKCgoKCgoKCgoKCgoGCgoKDg4OCg4ODgoKCgYKCgoODg4ODgoKCgoODg4KCh5KTkIuKi4uPj42Lh4SCgoKCgYGBgoKDgoKBgYGBgIGBgICAgYGBgIGAgYCAg4SDg4OEg4ODgoKCgXx9fHx9gn1+f4GCiIGCgoSBgYGDg4GBgYKDgoSEh4+hsqehoJmdnaaorKmhmpGHgYCAgICAgH9/f3+AgICAgH9/gYODhYSEg4SDgoKCg4OCgoOCgoODg4ODg4SDg4KEhYWDg4SEgoKDhIOCg4ODg4OCgoODgoCKlJOPioqMj5GPjYuGg4KCgoKBgYGBgoOCgYGBgIGBgoGBgICBgYGAgYCAgH+BgoODg4SEhIOCgoKCfXx8fn6AgYOAg4OChIaFhoaFhIWFg4ODg4ODho2frbGmm5qgm56cnJ6hpKOdlIiDg4KDg4ODgoGAgIKCgYOCgYKCg4OEhYWEg4OChISEhIOEhISDg4OEg4ODg4OEg4SDhIWEhISDg4ODgoKCgoKCgoKBgYKCgo+UlI+Njo6RkY6KiISCgoKCgYGBgYGCg4GBgIGBgYGBgYCBgIGBgYCBgICAgIKChIKChIOCg4ODgoJ9fX2AgH+AgoGDg4ODhIaEhIOEhYWDg4GBg4OCg4qXmZeWmKCbnZ6dmpqXkImGh4eGhoeHhoaEgoGCg4SDg4ODg4ODhISFhYWDhISFhISEg4KBg4OCg4SEg4KCg4SCg4ODg4OCgoKCgoKCg4OEhIOFhYWFhoaIk5OTkI+PkJKRjIqIgoKCgoKBgYGBgYKDgoKBgIGBgYGBgICAgYGBgICAgICAhISEgoKCgoGBgoKBgX+AgYOCgICAf4CCgoGDg4KCgYODg4SDg4GDhYSCgYGGjpSTl5qcnZyVj4mHiIiHh4eIiIiFhIOBgIGBgoKCg4GCg4SEhYSDg4OEg4OEhIOBgYGCg4OEhISDg4ODg4OEhIODgoSDg4ODhIWFhoeHh4eIiIiJiY6Tk5KOj46Rko+LiYeCgoKCgoKBgYGBgoKCgoGBgIGBgYGAgICAgYGAgIGAgICDg4KCgYKCgYGAf4CBhYWFhoOCgYB+fn+BgoSCgYKDhIOCg4ODg4KChISDhIODiJCUjpSYkYeCgoWFhYOEhIWFg4KBgH9/gIB/gIGEg4OEhYWEgoKBgoOCg4OFhIKDhISEhYaGhoaGhoWFhoeHhYaIh4aHiIeGhoaIiYeGhYaGhoeIkZOSkI6QjpGRjImHhYGBgoKCgoGBgYGBgoOBgYGBgYGBgICAgICBgYCAgICAgISEg4KBgoGAgYGAgYKIh4aHhYSCgH99fX6AgH+AgYGBgYGBgoGBgYKDgYKCgoGAh5uIjIeCg4KBgICAf4GAgICAgH9/gIGBgYKCg4OEg4OEg4OCgoGBgoODg4SEg4SEhIOFhYaFh4eIh4eHh4eHh4eGhoaGh4WFhYaGhISEhIWEhYaSk5GOjo+OkI6JiIeEgoKCgoKCgoGBgIGCgoKCgoKCgYGBgYGAgYGBgICAgYGAgoSDg4KDgoGCgYKDg4iHh4iHhYSCgX5+gICAfn5/f4CBgYGCgoCBhI2DgH+AgYB/g4mOgIGCg4OAf39/gICAgICAgICCg4KDg4ODgoOBgYKCgoOCgYKCgoOCgoSDhISDg4SEhYWFhYaGhoaFhISEhYWEhIWFhYSEhISDhISEhISEipSTkZCQj46NiYaFhIOBgYKCgoKCgYGAgYKCgoKBgoKBgYCBgYCBgYGAgICAgYGAg4OCgoOCgoKBgoOCiImJiYiHhYSDgYKEhIOBgoKCg4SCgoSEgoOKloiEgoSCgX9/jJWCgoGChIOBgYGCgoODgoGDg4SDg4SEg4OCg4KDg4ODg4KCgoKCgoGDhISEhYSFhYWFhIWEhIWFhYWDg4OEhISEhYWFhISEhISEg4ODg4OOlZKQkZGPjYyHhYODg4GBgoKCgoKBgYCBgoOCgYCCgYGBgICAgIGBgYCAgICBgICDhYSEhIODg4SDhIOGh4mIhoWDhIODg4WDgYCDgoWGhISDg4OChI6Zi4OFhISEgoCRmYaCgoKEg4OCg4GBhIWEg4ODgoKDhISDhIODg4SFhISDg4KCgoKCgoSEhYSFhYWFhYODhYWFhYaFhoWEhIWEhYWGhYWFhIWEhISDhIODhJGUk5KSkI2MioWEhIODgYGCg4KCgoKBgYGCg4KBgYKBgYGBgICBgIGBgH+AgIGAgYaGhoaGhoaHh4aGhYSDhYaCgIGBgYGHgoB+f4GBkIyDgX9+fXx9jJyOgIKBgYKChZSUjIGCgYKDgoKCgYKDhYODg4KDg4OEgoKEhIOEhIWEg4OCgoKCgYKCg4ODg4SFhYWFhIOEhYWGhYWEhISEhIOEhIWFhIWFhIODhIOEg4KGlJSSlJKPjYyIg4SEg4KBgoODgoKDg4GBgoKBgoKCgYGCgYGBgYCAgYGAgICAgICAhYWFhYaGh4aGhoWGg4ODg4GAgoKCgYKAf35/f4GWl4mAfX19fXuBmIyAg4GBgYCOlIyQgYKBgoKCgYKDgoODgoOCgoKCg4OBg4SDg4ODg4OEhIKCgoKDgoKDg4ODhIWEhISEg4OEhIODg4OEhIODg4ODg4SDg4ODg4KDg4KDgouUk5KTko2NioaDhIOEgYGCg4ODg4ODgoGBgoGCgoKCgoKBgYGBgICBgYCAf4CAgICDhISFhYSFhYWEhIWCg4KDgoKDg4OBgICAgICAgZWfin5+gH2Hi36EhIOEgoODgo2JhYyCgoODg4KCg4ODgoODg4KCgoODgoKDg4KCg4KDg4WEg4ODg4SDg4SEhISEhYWEhIWEg4SEg4OEhISEhISEg4SEhYSDg4SEhIODgoKDkJSSkpKPi4yIhoSFg4OBgYKDg4ODg4OCgYGCgoKCgoKDgoCBgoGAgICAgIB/gICAgISDhYWEhYWFhYSFhYOEhIWDg4SEhIKCgoOCgoSBkaGKf4yFfYaJgH6FhYWEhYJ/fX19gIOEg4KDhIOEg4OEhISEg4OEhISEg4SEhIOEg4OFhoWFhYSFhYWFhYSFhoaGhoWFhYWFhYWFhYWGhoWGhoaFhoaGh4aFhYWFg4SEhIeTk5OSko2KiIWGhYWCgoGBgoODg4OCg4KBgYKDg4ODgoKBgIGAgICAgICAgH+AgICAhYWFhYWGh4eGhYWFhISFhYSEhISEg4ODg4OEhYOJkYOEi4WCgYF+fYGHhoOAfn5/f39/f4ODhIuGhISEhIWFhISEhISFhYWEhYSGhYWFhYaGhoWGhYWGhYWHhoaGhoaFhIWFhYWFhIWGhoaHhoaGhoaHh4iIiIaFhYaEhYWGjZSTkpGQi4qHhoeGhIGCgYKDg4ODg4KDgoGBgoODg4KAgYGBgICAgICAgICAf4CAgICHh4eGhoeHiIeHhoaEg4ODhIODg4OEg4ODg4OEhISEgYKCgYmBf359foWBf39/f39/f36AgIOPl4aFhoWFhYWFhoeHhoaFhoWFhoeHh4iGh4eGhoaHh4eGhoeHhoaGhYODhIWFhoSFhYaGhoeHhoaGhoeHh4eIiIeGhoaHh4eRlJORkZCLiIiFhoWDgoKBgoODg4ODgoKDgoKCgoOCgYCBgICBgICAgIGAgIB/gICAf4aHiIeHh4eIiYmIiIODgoKDgoSEhIWEg4KCg4SEhIOBgICAhIR/fn5/gH9/f39/gIB/f4B/gZWWko+IiIeHhoeIh4iHiIiIhoaHiImJiYmIh4aHh4eJiIaHh4eHhoeFg4OEhYaGhYWFhoaGh4eFhoeGh4aGh4eHh4eHh4eFh5OTkY+RkIuHhoWFhIKCgYGCg4ODg4ODgoKCgoGCg4KCgIGBgYCAgICAgICAf3+AgYB/hoiIiIiHh4iJiYmIg4KCg4ODhIWHh4aFg4OFhISEg4GAgIGMiYGAgYKCgYGBgYB/gH9/fnt6ip2npJiMiYuLiImJiYmKi4qIiIiJiYuLioqIh4eIiIiHh4iIh4eGh4aEg4OFh4eHhoWFhISDhYWEhYWGhISEhYWFhoWGhYOJlJKQj5GOioaFhoWDgYGCgoKDg4ODgoKCgoKCgoKCgYGBgYGBgYCAgICAgIB/gICBgH+GiYiIiYeIiImJiIiEgoKDg4KDhImKh4aEhIWEg4OCgICAhISCgoKCgoKCgH9+fX19fX5+fHt9maekopiPlYuIiIqJiImLiomJiImIioqJi4mGhoaGh4WGiIiIiIaGh4SDg4SHiIiIh4WCgoGDg4KDg4SCgYKDgoGEg4SDgY6TkpCPj4uJhYWGhIKBgYGBgoODg4OCgoKCgoKCgoGBgYGBgIGAgICAgICAgH+AgIGAf4WIh4eHhoeIiIiHh4SCg4OCgoOFiYqJh4WHhYSFhYKAgYOEgoOCgoKDgX59fX5+fn5+fn1+fXyBnKCdnZyPhoWGh4eHh4iHh4mHh4aIh4aJiYODhIOFhISFhYaIiIaFg4KCg4WHhoeGhoSCgoOEgoODhIKBgoGBgYODhIOEkZKQjo+Oi4eEhoaEgoGBgYGDg4ODg4KCgoKCgoKCgYGBgIGBgYCAgIB/gIGAf39/gIB/hYaGhYaGhoeHiIeGgYKEhIOChYeIi4qGhIaEgoaGgoKEhIODg4OCg4F9fH1/gH9+fn59fH1+fHqDnJuclYSDgoODhIaFhYODhYSEhISEhIWEgoKCgoSEgYKDg4WGhYSCgoGCgoODhYSEhIWEhIaEg4SFg4KDgYKDg4SFhIeSkY+Nj4yJhYSFhIWCgYGBgYODg4ODgoKCgoKCgoKBgYGBgYGAgICAf4CAgYB/gICAgICDhIWEhYWFh4eHh4aAgYGFg4OEhYSHiIWCgICAgX9/gYSEg4ODgoKAfX1/gICBf31+fn18fX17enmJm5uXhYCBgYGBgoKBf36BgYGCgYOBgoGCgoKBg4SAf4CAgYKCgICAgYCBgoGDgYGChIODhYSCg4SDgoKBgoSDhYWGi5ORj4+Pi4iFhYODhIGBgYGBgoODg4KCgoKCgoKCgoGBgYCBgYCBgH9/gIGBgICAgH+AgIKCg4OChIOEhYWGhn+BfoCBgICAf4GDgn9+fn5+fX+ChISCg4KDgn59fn+AgIGAfn19fX1+fXx6enuNmpWFgoB/f39/gIB+fYB/f4CAgX+AgIF/f4CBgX59fX+AgX9/fn+AgH+AgICAf4CCgICCgYGDgYGAgYGBgYKEg4aPkpCOj42Kh4eGg4ODgYGBgYGCg4ODgoKCgoKCgoOCgYGCgYGBgICAgH+AgICAgICAf39/gYGDhIGCgoOCg4SFgIB/fH19fn19foCAf31/fn1+gIODg4KCgYF/fX1+f4CAgH9+fX19fHt7e3p6enuPk5Gaj35+f35+f35/gH9+f3+Af4CAf359fn9/fn18fn+Af35+f3+Af39/f4B/f4B/f4CBf4B+f39/gH9+f4B/hZKSj46Pi4uHiYWEhIKBgYGBgYKDg4ODg4OCgoKDg4KAgYKBgYGAgICAf3+AgIB/gIF/f36BgYSEgYKBg4OCg4OBgH98fn9+fX6Af4B/foF/f4CBhIOCgYB/f359fn5/gICAfn19fXx7e3x6enp6eYCMjIyLgX9/fn9/foCAf35/f4CAgoB/fH5+f35+fXx/f4B/fn5/foB/f35/f4CAfn6Af39+f35/f35+fn19fX2Fk5KOjIuKiImIhISEgoKCgYGBgoOCgoOCgoODg4ODgYCBgYGBgYCAf39/f4CAgICAgIB/foCBhIOCgYGDhISDhICBgICBgIGAgYKCgoGBgoCBg4ODgYGBgYCAfX19fn5+f359fX19fXx8fHt6enp6eX+FgICBgYKAgIB/f4F/gICAgYGCgoB+gH5/fn5+foGAgYB/f39/gICAf39/gYB+f3+Afn9/fn+Af31+fX17fIaTkYyLioeHioiGhoSDgoGBgYGCg4ODg4OCg4OCgoKBgICBgYGAgH9/f39/gICAgICAgH9+fn+BgYGAgISGh4aHgoSDhYKBg4ODhYSEhISEg4ODhIKCgoKCgX9+fX19fn6AfX19fX19fX18fHp6eXl5eoGCgoKFg4GCg4GAgoCCgYGDg4ODgYGCgIGAf4CBg4GEgoCAgYCBgYGAgYCCgn+BgIF/gIB/gICAfn9/fnx8iZSQiomIiIiJiIaGhoSCgoGBgoKDg4ODg4KDg4KCgYCAgICAgYGAf39/f4CAgICAgIGBf359fn5/f39+g4aHh4iChYSFhISFhIWGhYaGhoWGhYGBg4ODgoKAfX19fX19fn59fX19fX18fX18e3l5eXl5fIKDhIWCgYSDgoKDhYeCg4SDgYKCg4OCgoKCgYKFg4iFgoGCgYKDgYGBgYSDgoOCgYKCgICBgIF/gIGAf36Ok4yHiIeIh4aGhYaGhIKDgoGCgoODg4ODg4OCgYGBgH+AgYGBgYB/gH9/gICBgH+AgYB/fn19fX5+f36Ag4SHh4SGhoaFhoaHh4aHh4iHh4eGf32AgICCgX59fX19fX19fX19fX18fH5+fnx7eXh4eXl5gIKDf4OMhIOEhISXl4ODhIF9foGBgoGCgYKBhIaIjIWDgoKBhIKEg4KDhYSEhYODhIOCg4OCgoKCg4OCgpGQi4iIh4mHhoaEhoWEhISDgYKCg4ODg4ODgoGBgYCAgICBgIGBgH9/fn+AgICAf4CAgH9/fn1+fn+Bf4CCgYWFhYeGh4eHh4eIhoeHh4eGh4V+fX18fX9+fX19fX19fX19fX19fXx7iJKCe3x6fIZ5eXl8gYF+iJWDg4OEhJSTgICBf39/fn6Ei4B/gYCEhpCJhYSCgoGFhYuDgYKFhYaGhIOFhYOEhIODhIOEhISIko+MiYiIiYeHh4WGhYSEhIKBgoKDg4ODg4OCgYGBgYB/gICAgICAf39/f4CAgICAgYGBf39/f4CAgIGBgYGBg4OGh4aGh4aGiIeGhoaFhIOFhH59fHx8fX18fH19fX19fX19fX18fH+RlZaDe3qElHx5enp7fH6Bg4GCgYOCgH59f397iJF8fI6Wf31/f4KGioWDg4SDgoONiX99f4OEhYWDhYaFhIWFg4SFhYaEhI6Rj4yKioyJiImHhYWFg4SDgYGCgoKDhIODg4GBgICBgICAgYGAgIB/f3+AgIB/gICAgX5+f4GBgoKCgoODgoOCgoWGhISFhYSGhIOEg4KBgIKAfn19fHx9fXx8fH18fH18fX19fHx8e4uRl4x6e3yBenl6e3x5eX19f4B/gX99e3t/fn2ClZF/hIh9fH5/goR8fIGChIN/f4eDfYOBgIKCgIODhISEhISChIOEhYGEkZGOi4yMjoqJiYWFhYODg4KBgoODgoKDg4KCgYGAgIGAgICAgICAgH+Af3+Af357gICBenyAgYKDhYODhIWFhYODg4SCgYKDgoOCgoGBgIB/gX5+fX19fHx8fHx8fHx8fHx8fHx9fHx8f36Kgnt6e3p4ent7fH18fn5/f35+fn59fICBgH2Gj4F+fYJ+f36Agnx8gH+CgIGAfn17ioJ9gH9+gYCAgYKAgoCAgIGAf4uUj4yMjo6NiIiHhYWFhIOCgoKCg4OCgoODgYGBgICAgICAgH9+fXx7fHx9f3+AgHx6gYF4e4CCgYOFhIOFhYaHhYSAhpSIgIKBgYGBgH9/f3+Afn5+gHx8fHx8fHx8fHx8fHx9fHx8fHx9fHl6e3t4eHl7e3p8goCBf4CBfX9/gH99gIKCgICAgX+CkYF/f4CAfoB+fn9+gIGBfXx9e319fXx9fHx9gH+AgH6Afn6ClJKNjI2Oj4qFhoaFhISFg4KDgoODg4OCgoGBgYGAgICBgICAf4CAf39/fXt6fICAgHh+gXd7gIF/goKCgoKEhoeGhn6IlYp+gIGAgIB/foB+f39/fn+Bfnx7e3x8fHx8fHx8fH19fHt9fHx8e3x8fHp6eXt8e32Fg4OAgYF+gH9/gH+FgoF+gH9+foCFhoKAfn6Dhn99fH5/gIGAf39+fX19fX57fH1/f3+AfX9+f4yRjo2Njo2Nh4SGhoWEhIODg4OCg4ODg4KBgYGBgICBgYGAgYGBgYGAgH9/f397en9/e3mAd3p/f31/f3+Af4KEhoaFf3+FgX5/gIB/gH5+f35/gIB/gIB/f319fHx9fn18fH19fX19fH58fXx7fXx8ent6fH19f4aFg4CAgH1+fX5/foyEgYd+fXx8f36Cgn99fX19gXx7fXx+gYSDgYB+fn5+fXx+f4B9foB+f36Eko2OjI+NjIqGhIWEhIODg4OCg4KDgoOCgYGBgYGAgYGBgYB/fXx8fH1+f39/f397e399d352eH59fH18fX5+gYGCg4F6fn58fn6Af35/f35/fn+AgH+AgH9/fn9+fn5+fn1+fn99fH59fn19fXt8fHx7e3p9foCAg4OCf35/fHx8fXx9gYN+jH58e3t9fn1+fn17e3t9fHt7e3uAhoSChIOBf4B+f4KCgn9/goJ/gIuQjY2MjYuKiISEhIODg4ODgoKCgoKCgoKBgYGAgoGBgYKCf3+AgIB/fn18fH5/fn55fX52e3Z4fXx8fHt9fX6BgICAf31/f31+f39/foB/f39/f3+Af4GBgH99gH9/fn9+fn5/f3yCfX59fX17e319fHp8fH2BgoGAgIB9fX18fHx8fH18fnt/fnt7e3x8fH18e3t7e3x8enp9en6CfoKEhIKAgoGFhoWFhoaHhYGEkY+Ni4qLh4eFgoOEhISEg4KCgYGCgoKBgoGBgYGBgoGBgoKAgYKBgYCAgH9+e3x+fnx6fnh5dnd8fHx7e317f4GAf35/foB/f35/f35/gH9/f39/f39/gYKAfn6BgIB/f39/f39+fYN8fH19fH99fX19e3x+fn5/fn5/fnx8fXx8fXx+fnt8e3x8fHx9fH18fnx9fHt7e3x6e3x7fH16fX5+f4CAg4eJiYmKiYqJhYiSj42JioeFhYOCgoOEhIOCgoKBgYKBgYKBgYGBgYKCgoGCgoCAgX98e3p6eXt9enx+fnl8eXh4dHx8fHt8fHx+gH9/f39/gIB/fn5+fX+AgH9/f3+Af4CDgoB/gIGAgIB/f4CAgH58enx9fX59fX5+jIZ9fX57e4ODfX19fX18fX19fX1+fH18fXx9fX58fn19fX18e3t6fHt8fHt6e3t6enp7fn6ChYiHiIqLi4uJjJGQjoqJhoWEgoKCgoODg4OBgYGBgYGBgYGBgYKCgoOCgYKBgIGBf3+Af356eHl5en5+e3l6eH5zfHx8e3x8fH5+fn5/gH+AgIB/fn9+gIF/f4B/gIGAgoSEgYCAgYGAgX+AgYKBf39+f31+gH57foGSjHx9f4qAjYx+fn19fX5+fX59fHx8fn18fXx9fX1+fX1+fnx7e3t8fH18e3t7e3l6eXl5e35/g4OEh4mKiImOkI6MiYmFhISCgYKCgoKCgoGCgoKBgYGCgYKCgoGCgoKBgoKAgYGAfoCAf39+e3p5e319eHx6f3KBfXt7fXx8fn59fYGBf4GBgX9/gH+AgX+AgIGCgYGFg4SCgYGCgYKBgICBg4KAf4F/fX6Afnx/f4mCf36DkYSEg4F/fn18jYd9fX59fXx+fnx9fXx9fX5+fX5/fH19e3x9fnx8e3x9enp5eXl5ent+foCBg4eEiI+Oi4qHhYSEhIKBgoKCgoGBgYGCgoKBgoKCgoKCgoKCgoGCgn+AgIB+f39/fn5/ent5fX16enp9cX6Cent9fX19fXp4f4KAgYKCgICBgYGBgICBgoKCgoWFhIKBgYKBgoF/gIKEgX9+gYB9foF+fX5/gIB9foCEgH5+f31+fX2KhX1+f31+foB+fH18fH5+fn99f4B9fX18fX9/fHx7fH17e3t6enp7e3x9fn6Ag4CJjouMiIWFhYSEgoKCgoKCgYGBgoKBgoKCgoKCgoGBgoKBgYKCf4CAgH9/f39+fn59eXp6fXx5d3t0e4d8dHd9fn17e3Z2fYCBg4KBgYKCgoKBgYGDg4OChYaEg4CAgIGDgX+AgYSBfn6Af31+gH59fn6AgH+Bf3+Af39/gH99f39/f3+Afn9/gH58fX18fn5+foF/gH2CgHx9gIB9e319fXx8e3x9e3t7fHt8fH19fIqKiYmGhoWFhISDgYKBg4KAgIGCg4KCgoOCgoKCgoGCgoGBg4J/gIGAf39/fn5+fn57enp8fHt2e3R3f352cnt+fnt4dnd8gIGCgoKBgoODg4OCgoSDhIOFhoOCgX9/gIKBgICAg4B+foB/fX+AfX1+foCAf4J/gYCAgICBgH1/f3+AgICAgIB/fnx9fX19fn59gn2AfoKAfX6AgX98fn59fX17fX58fXx8fHt8e3x+ioeHhYaIhYSFhIKCgoGDgYCAgoKDgoKCg4ODg4KBgYGBgYGCgH6AgYB/fn5+fn5+fn56e3p9goN9dXF6fHpxen59eXh0dICAgoKCg4KDhYOEg4KDhISEhIWEgYGAgH6Agn9+f36Bf35+f4B9foB9fX1+gH9/gYCBgICAgIGBfn6Af4GAf4CAgH9+fX19fnx+fn19gYR/gH9+f4GBf31/f319fn1+fn1+fHt8enx7eoCIg4SEhYSEhISDgYKBgYKBgICCgoOBgoOEg4SDg4KBgYKBgYOAfoCBf35+fn5+fX1+fnt7en6Jh354cnl9f3F6eHt4eXV1fYKDgYODg4OFhIWDg4OEg4OEhIOBgICAf4CBfn19fn9+fn5+gH19f3x9fX6Af4CAgIKAgIGAg4KAf4B+gIF+gIGAgH9+fn5+fn1/fn6FhYGBgX+Ag4F/foGAf35/foB/fn17ent6fHt6goWAg4KCgoKCg4GBgYCAgoGAgIKCg4KBg4SDhIKEgoGBgoGCgoB+gIF/fn1+fn5+fX59fXp7fIWEe3tzeXt8cHd1dnd5dXR6hISBhISDhIWFhoSDg4WEgoODgoCBf4B/f4B9fX1+f31+f39/fn1+fH19foF/f4B/gIB/gICDgoGAf36AgH+AgYCBgH9/f39/f4CAgIGCgoKBf4CDgn9/g4J/f4B/gX+Af3x6fHp8e3yCgH+Cf3+BgIKCgYF/f3+BgH6BgoKDgYGDg4KEgoSCgYGBf4GCgH6AgH9/fX5+fX19fn19e3t6gH94fHZ5enxxdHh3dnh1cnmFhYKEhIKEhYWGhISChIOBg4GAgIF/f4B/gHx9fX6AfX5/f39+fX98fn5+gX+BgH9+f4B/gIOCg4F/f4GBgYKBgYGBgIGAgICAgIGAgIKDgYF/gISAfYGDhICAgX+BgYKBfXp7e3x8fYB+f4B8f399fYGAgH59fX9/foKBgYKBgIKCgoKBg4KCgYB/gYKAfn9/fn99fX1+fX19fX19ent7fHZ9eXh6enJ1eXl2d3dzdYaFg4WFgoSEhYSEg4GDgoGDgX+AgX5+gH6AfX19foB+f4B+fn99f3x/f3+BgIF/f3x+gH6AgYKDgYCAgoOEgoGAgYB/gYCAgYGAgYGBg4OBgX+Ag4B+goOEgICCgYKChIJ+e3t8fHx9fn1+fXp+fX14fn9/fHx8fn5+gYCBgYCAgoGBgYGDgoGBf4CAgoB9fn19f319fX59fH19fX16e3p8dnx6d3t4cnZ5e3Z2dnN0hoSEhYWChISFg4ODgYOBgYOBgIGBfX+BfoF9fX1/f39/gH5+f359fYB/gIGBgX9+fH5/fn5/gYJ/gYGCg4eFgX9/fn6Af4CAgICAgIKCgYCAfoCCf3+BgoOBgYOCg4OFg399fX18e3x8eXp7en15e3l4f357fHx+fX1/f4F/gH6BgICAgoOCgYF/gIGBf31+fH1+fX19fX18fn58fXx5e3x4enx3endzeHd6c3d2c3SGhISGg4KDhISDgoKCg4GCgoGAgYF9gIB+gH1+fX5/gIB/f39/f3x/gH+BgIGAf359f39+fn+BgH2AgIGDg4N/f359fn5/f4B/gIB/gYKBgH9+f4F+f4CCgoCBhIKEhIaEgH5+fHx8fHp5dnl5enl2eXZ+fHt7e359e399gH59fX9/f3+BgoGBgX5/gYF+fX18fX19fX19fXx+jYF8fXl7e3p5fHd4eHR1dXhyd3d0doaEhIWEg4ODg4OCgYKDgoGDgn+Bf35/fn+AfX19fX6AgIB/f39/fIB/f4GAgYCAf3yAf35/fn9/fX5+gYGCgn5/fn1+fn5+f3+Af32AgIB+fn5/gX5+gIKCf4KDgoOEh4SAgH58fXx8e3x1eXl4eHh5d3t8e3t7f4V9fn1/ent+fn59foGAgIGAfX6BgH59fXx9fX19fX18e32Dgnx8ent7e3p7d3Z4dXJzdnB4eXJ4hYWFhYOEhIOChIKBgYKBgIKBgIF/fn5+foB+fX58foCAgH+AgIB8gH6AgH+BgIB/fYB+fn9/f359fX6AgYGAfn9+fn59fX5/fn9+fH6Af35+fn+Cfn6AgIF+gYOCg4OGhICBfnx9fHx7fHh3e3h1eXd3eXx6e3t9kod9fH13en1+fn19f35+gH98foB/fn19fH19fX19fHt8ent9enp4e3x6ent4dHh1cXJ0cHh4cXmEhYWFg4SDgoODgoGBgoKAgoCAgIB9fn5/gH18fnx/gIGAgICAgHx/f4B+f4GAf399gX9+f39+fX18f4CAgIB+f35+fn18fn9/f358fYB/fn1+gIJ/foCAf36BhIKCg4WFgoJ+fX17e3x8eXd7eXd4d3d4e3t7e3yFiX17end6fH19fHx9fX1/fnx9fn59fX18fX5+fX18fHt6enx7e3p5enp7enhzd3VxcXNveHdxe4WGhYWDhYKBg4OBgoGBgoCCgICAgH5/fn9/fXx+foCBgoGAgIGBfX6Af35/gX+Af3+BgH9/f319fH1/gICAgH9/f35+fXx+f39/f319f39+fn6CgYF/gIB/foGDgoKEg4SCgn5+fHx6fHt7eXt6d3N2d3h5e3p7eXp/fnt7d3p8fXx8fH59fH19fH19fXx8fX19fX99fXx9e3l7fHx7enp6enp6eHN2dXBwcm93dnJ7hYaEhYOEgoGDgoKBgYGCgYKAgYGAf4B/f399fX9+gICBgYJ/goF9foF+fn+Bf4B/gIJ/gIB+fH58f3+BgICAf4B/f4B+fX5+f4B/f39/gH9/f4J/gICAgIB/gYGAgISBgoKAf39+f3x9fn56fYV+dHx9enp6enx5eXp6hoV3eXx8fHx8fXx8fHx8fX19fHx9fX19fn19fX16eX18fH16enp6enp5c3V1b29xb3d0c3yFhoOEgoOCgYKBgoKCgYKBgoGBgYCAgICAgH59gH+Af4GCgn+CgX+AgX5/gYB/f4CAgn+Bf319f35/f4KAgICAgIB/gIB+fn1/gH9+gIB/f39/gH+AgICAgH+BgYCBgYGCgYCAf39/fn1/fnuBk416fH18e315e3p6eHqBgXh5fHx8fXx8fHx8fHx9fX18fH18fn1+fn59fHp8fHt9fXt5enp6eXl0dXVvb3Fwd3N0fYWGg4OCg4KAgYCCgoGAgYGCgYKBgYCBgIGAfn6Af4GAgYKCgIKCgICCfoCBgX9/gX+BgIF/fH6Af3+AgoCAgICAf3+AgH9+fX6Afn2AgIB/f3+AgICAgYCAf4CAgYCBgYKCgICAf39/fX5/fIGGiXx8fnt7fnl6e3p7j393d3l7fHt9fHx8fHt9fH19fX18fXx+fn5/f358enx9e3x9e3l6e3p5eHN0dW5zcXB4cnV6hYaDg4KDgoCAgIKCgYCCgYKBgoGBgYKAgYF/fn9/gYGCgYKBg4OAgYJ/gYGBf4CAgIB/gX99f4F/gICBgICAf4B+gICAf359foB+fn+Af39/gH9/gICBf4CBgH+BgIGCgoKAgICAgIB9foB9gIOCe35+e3x9e3p8fHuHenh4eXx8fH17fHx9fX18fX19fn19fX5+f3+Af317fH18fHx7enl7e3l5c3J1bnZycHhxdXaFhYOEg4KCgICBgoF/gIKCgoKDgYGDgoCCgYB/gICCgoKBg4KEhICBgX6BgoF/gICAgH+Cf36AgYCCf4B/gIB/gH+AgIB/fn2Af35/f4CAgH+AgH+AgYGAgICAgIGAgYGBgYGAgYCAgH9/gH5/fX59fn57fXx9e3x9eHh1eHh5e3x8fXt8fHx8fX5/f39/fn19fn9/gIGAf3x9fHx9e3p7eXp8eHpzcnVud3FxenF2d4WFg4SDg4KBgoKDgICCgYSDg4SBgYOBgoKCgYCAgIKDgoCCgoSDf4GAfoKDgICBgICAf4CAf4GAgYKAf4CBgH9/gICAgIB/f4CAgH+AgICAgIB/f4CBgYCAgICAgYGAgoOCgoCCgYGCgYB/gIB/gId+fnx7fXx7fX94d3Z5eXp7fXx8fXt8fH19fn5/gIGAfn1+gICAgoGAfH59fX58d3t6ent5eXNxdW53cHV6cXZ5hYWCg4KDg4KChISAgIOAhoODhIGChICEg4KCgICCgoSBgYKBhIJ/gIB/gYOCgYCBgYCAf4GBgYGBg4B/gIOCf35/goGAgH9+gYCBf4CAgYCBgYCAgIKBgYKBgX+BgYGBgoOCgoOBg4OCgYCBgH9/hH19fXx/fXt9f3t6dnp4eXt7fH19e3x9fX19fn+AgYCAgH+AgICDg4B8f35+fn15eXt6enp5c3J0b3dxd3lzd3uFgoKCgoOEgoOEg4CBg4OGg4ODgoKEgYSDgYOAgIKBg4GCgoGCgX6AgICCgYKBgYKCgIGAgICCgoGEgH6Bg4F/f4CDgoCBf4CCg4KAgYKBg4KDgoGBg4KChIGAgYOBgYKEg4KEhIODhIODgYGBgoCCf4B/fYB8enx/e3t3fHl5eXt6fX59fHx8fH1+foCBgYCAgIGBgYSEgH2Af39/f357e3t6e3p0cHhxeXR2eHR2e4SCg4KDg4SChIODgYKChIWEgoODg4SBhIOAg4CBg4KCgoKCgYKAf4GAgIKBgoGCgoKBgIGBgYKCgoOAfoGDgX9/gYSEgYN/goKBg4KCgoGEg4OEgIKEgoOCgoGCgoOBg4SDhIOEhISFg4SCgYOCgYOBgYGAgH58fIB9fHh8eXp5enx9f3x7fHx9fX18fICAgICAgYGBgYKBf4CAgICAf3t7e3p6enVweHd5dnV8dXZ8gICDgoODg4OEhISBgoOFhYWDg4KDhIKEhYKCgYKDg4GCgYKAgYB+gYCBgYKDgoKCgoGAgYKCg4KCg4B/gYOCgICChIODgoGCgoGDgoKDg4ODg4SAgoSDhIOBgX+Bg4KDhYKEhISEhISDhISChIOEhIKBgoCBgHt9gX58eXx6enp9fHyBfXp8fH19fHp7fn5+gH9/gYGAgICAgIKBgIB/fX18fH18dnJ2eHh2dH92dX2Hh4OChIWDg4SFhIGChIaEhIOCg4SEgYOFg4KCgoODgYOCgoCCgH2AgIGCg4KCgoKEgoCCgoODgoKBgICBg4KAgYOFhIOCg4CCgoOCg4ODg4OEg4CCg4KEg4KCf4OBgoSEgoODhISEhIOEhIOEg4WEg4ODgoKAe4CBf3x8fXp6fH2AfX9/fHx6fH59fH19fn5/f39/gICAgH9+foCBgICAfnx9fn5/fn18fHh2f3Z3f4SHg4KDhoODhIaEgYKFhoWEhIODhISChIWFgoKDg4SCg4KDgoKBfoCAgoKDgoODg4SCgYKCg4OCg4KCgYGDgn+Cg4SDg4KEf4KEg4ODgoSDg4SCgIOEg4SDg4KCg4KChIOCg4OEhISEhIWEg4OEhYSFhIOBgoB9gYKAfXx8e3x8gH19foB+fn1/fnx8fH19fn5/fn+BgYGBgH99fX6BgYB+fn1+fX5+fn5+f3+AfH2AgYKCg4OFg4SDhoSBgoiGhYSDg4SEhYGFhYWDg4SDhIODgoOCg4F+gYGCg4SCg4OEhIOCg4KEg4ODgoKDgYOCf4KDg4ODgoOAgoWDg4ODhIODhIOBgoSEhYODgoODg4GEg4GDg4SEg4SEhYSEhIWFhYWEg4ODf36BhIB9fXx8fHx/gX5/fn9/fX99e3x9fX19fX5+f4CBgIGBgH59fH6Cf39+fn5+fX1/f39/gICAf4CEhIODg4WDhIOFf36CiouFhYSDgoSFgYaGhoOEhISEhIODg4OEgn+BgYODhYSFhIWEg4KEhISFhIODgoSDhYKBhISFhYaEgoCDh4SDg4OFhIWFhIGEg4OHgoOCg4GCgYSDgoODhIODhIWEhYWHh4aHhYSEhYSBf4GDf35+fH5+fX+BgH9+fHx/f358enx9fX19fX5+fn9/gIGBf319fIB/gH5+fn5+f3+BgYGBgYKAgYWFhIOEhIKEg4aAgoSFi4mEhISEhYWCh4aGhISEhIWEhYSEg4SEgYKDg4OEhIaEhYSDg4SEg3yDhHuBhHd5g4F9hH5+cnWDgoF2foOFgH2BdYF6hH9/f36FhIKDg4KBg4SDhISFg4SFhoSFhn2EeXx+f4N7hYOBhIOAf31+f35+gYOBfXt/fX6Afn18fHx9fX19fH19foB/gYJ/fX18f4GBgICAgH+BgYGBgYKDg4KChoSEhIWEgYOEhYOEhYSKiIWFhYOFhYSGhoaDhISFhYWEhYWEhIWCgoOEhYWFhoSFhIOEhYWCaICFanx7cXF8gXOGc3R0fYKDdXNxg4ZzcHVyc3SDdnt9dYF/goOBgnZ5hYCDgIR/hYSChYWCaHpyc3N8gHKBg3+Dg32BfX5/fn+Cg4J8f4F9f4B9fXx8fHx9fHx8fn1+gX+BgX99fX2AgYKBgYGBgIGBgYKBgoKCgoSHhIWEhYSBgoSGhoOFhIaIhoaFgoaGhoeGh4OFhYaFg4KFhoSFhYODg4SEhoaGhIaEg4SFhn1we4FweXZ+g3+CbnlwdXN8dnl5hnKEg3B2eHF2dHR1cnN0dml/gG5yb3R2bnVsd216c26Ah3ltfXJzdnN2bW53bHB5bHV9f358foGAgX2Af32Af4B/fX18fHx9fH1+f32Af4CAfnx/foCBgYCBgICAgYCAgIKDgoKEhYeGhoCChYODhYeGg4WFhYaHh4SDhoaIiYaHhIWGiIeEg4WGhYWEhIOFhIKFhoaFhoWEhoWHdnB0e3BydX+HhYNtdW92b3x1coR5eYd4cXR3bndod3pucHaCcoN+b3p5eW1vbnpvb2x3fXiGcHF6cHJ1ZoF1fm57eXNveX+Af31+gYB/e39+fIB+gIB+foCAgYB+fn9+foF/gH9+fYB9f4CBgIB+fn+BgH9+goOCgoSFh4eEfoeEg4OFh4aEhYWFhoaIhISGh4iIhoeEhoaLiYWEhoeHhYSFhYWEgoWFhYWGhYWGhYZxdXByc29zenl+g3SIdHV+iHZugnKEhnluanJ/cW1zd3x/dXR8hH54cXV3bnl1enF2eHV6eYRyaW95eHBreXN6b3p3dnZwgYB/fn5/f396fn18f31/f359gIGDg4CCg4GBhIKBf4GCgH1/f4F+f359foGAfn6BgoCAgoSHhoODhoSEhIWHhoWFhYWHhoiFhYaFh4eFhoSGhomIhYSJi4iFhIaFhoWDhYWEhoaGhoaFg3iLeXKIentwcIWFeIV4eWtzfnl7a3KDh4N6fG16eXl0fYB2bm+AgG90fHV3cHl9fW19dW+DhYZ6gHJye3x1cG96a3N8bnaCgYF+fn99fXt9e3x9fH9/fX1/f4KCf4GDgYGDgYB/gICAfn9+f31/fn1/gH58fYGAfn6Ag4iFhoOFhYWFhoeFhYWFhYeHiIaEhoWHhoaFhIWFhYWFhomKh4WFhoWGhoWGhoSGhoaGhoWGh4eHhoaEhoWGh4iHhYeGhoOHhoWFg4SFhoWGhIaEg4SEhoSEgYSDhIOFg4WEhYSGg4WGhYWEhIWHhoSEhYaFhX13hYOEhIOCgX5/fnt8e358fHx9f399fX9+gYB9f4F/f4GAfn5+gH5+f35+fX99fX5/fHt8f358fH+BiYaFhIaGhoWGhoWFhYWGhoeJhoSGhYeFhYWDhIWGhYSGhoeGhYSGhIWGhoaGhIeGh4eGhYeIiIiIhYWHhYaGiIaFiIeIhYeGhoiFhYaHhYaGhYOChYWGhYWDhISEhIaEhoWEhYWDhoaFhYWEhoeGhISFhoOFhIKEg4OFg4OBfYB/e3t8fnt8fH1+fnx8fn2Afn1/gH5+gH99fXyAfX1/fn5+f3x8fX57fHx/fHt7fn+Ih4SEiIaGhYeGhYWEhoaGhoiHhIWGh4aFhIODhIaFhIeFhoaFhYaEhYaGh4eFh4aJiIaGiIeIiYiFhYiFhoeGh4aHhoeFh4eGh4WFhoeFhoaFg4OFhoaEhIOEhIOEhoSGhYWFhYOGhoWGhYSGh4WEhIWFg4SHhoOCg4SDhIJ+gYB8e31+e3x7fn59fHx+fX5+fX9+fX1+fnx9fH98fn58fYF/fHx8fXx8fH56e3t8foiHgoWIh4eGhoaGhISGhoeGiIaEhYSHhoSFh4OEhYSFh4SFhoaFhoSGhoeHhoaHh4mIhoaIh4iJiIWGiIWGh4aHhoeGh4WIiIeHhYaGh4WGhoWChISFhoWFhISEg4SFhYaGhoWGhIaFhoaFhYaHhYSDhISDhIeDhIGChIWDgYCAgHt7fn58fHx+fXx8fH1+fH18fn18fX18fHx8fXx+fXt8gX99fH18fnx8fHp6fHx9iIeChoiHhoeGhoaEhYaFhoWGhYOFhIaFhIiJg4GEg4SGhIaGhoaGhIeHiIiHh4eIioiGh4iHiImIhYiHhIaGhoeGh4WHhoiIh4eFh4eHhoaHhIKEg4SGhYeFhISEhISFhoaGhoaFh4WFh4WGhYaFhIOEg4OEh4GDgIKDhIKCgn+Ae31+fnx8fH59fH19fH17fHx7fHx9fXt7e318e359e3x/fX18fX1+fXx6ent7fHyIh4KGh4aGh4aGhYSFhoWFhYWEg4WChoSDiId/enqChYaEhoaFh4aEh4eIiIiHhoiKh4aHh4eIiYeFiIeFh4eGhoeHhYeGiIiHhoWHh4iGhoiEg4SEg4aGh4WFhISEhYaGhoaGhYaHhoaHhoaEhoWDg4ODgoOGgYN+goKDgIOCf398f35+fHx9f318fX18fnt7e3p7fHx8e3t7fnt8fXt6e358fHx8fX5/fXt6fHp8fImHg4aFhoWGhoWFhIWFhYWFhIOBhIGGhIKEhHyAhn+ChYWGhYWGhYSHh4iIiIaFiYqHhYeGh4iIh4WIhYaHiIaGh4eGh4aIiIeFhoeGh4WFiIOEhoSDhoaHhoWEg4WFhoaGhoaFhoaHhoeHhYOFhYOBgoKBg4WCg36BgoF/hIJ/fn5/fn58fH1/fXt9fXx+enp7eXt8fXt7e3t+fHx8fHp7fXx8fHx+fYF8e3t7e3x8iYeEhoSGhIaGhYSFhYWEhIOEgoCDgYaCgYJ/eoSMe4CEhYeGhoaEhIeIh4aHhYWHiYeEh4WGhoiGhYeEhoeIhoaIiIeHhoeIhoSGhoaHhYWIg4SFhIaGhoeFhYSDhYWGhoeGhoWGhoaFhoaEg4SFgoGCgYCEg4KCfYGBf36DgX5/f4B8f3x9fX59e359fH15enp5e319enp7e318fXx8enp9fHx9fH5+gHt7e3x+fXyIh4WGhYeEhoSFhYWFhYODgYOBgIKBhYKAgH9/fXx7gYSFhoaEhYSEh4eGhoaFhIaJhoKGhIaGhoWFh4WHiIiGhYiHiIeGhoeFhIaFhYeFhIeDhIWEiIaGh4WFhIKFhYaFhoaHhIWGhoWFhoKDg4WAgIGAgIOAg4B8gYB+foKAfYB/gX2AfH1+fX57fn18e3l6enl6fX15ent7fHt8e3t6e319fH18f35+fHt7fX59fIiGhYaGhoSFhYSFhYSDgoKAgoGAgICDgX5+foB5en2Ag4SFh4WEg4OHhoOEhYSChYiFgoSDg4WFhYWGh4aIiIaFiIeJh4aFhYWDhoSFh4ODhoSEhYSHhoWGhYaEgoWFhoaGhoaEhYaGhIWFgoKDhH9+gICAgYCDgHyAf31+gn5+gH6Af399fX59f3t/fXt6eXp6eXp8fXl6ent7enx7e3t7fH19fXx/fn18fHx/fnx7h4WFhoaGhoSFhIWDhYKBgICAgYB+f4KCfX1/f3t/f4KDg4WGhYSDg4aDgYOEgoCFh4WCg4GBg4SEhYaGh4eHhYWIhomHhYSEhIKFg4SGgoOGhISGhIeGhoWFhYOEhYSFhoWGhISFhIWDhYSAgIKDf35/f39/gIN/fIB+fX+CfYCBfn6Bfn5+fX1/e398e3p5enp5ent8eXp6ent7fHp7e3t8fX59fYB9fXx8fYB/fXyGg4aGhYaGg4SDhYKFgYGAf3+AgH5/gYF8fn9/foCAgoKChISDgoGChIGAg4KBgIOFhIKBf4CCg4KEhYWHhoaEhYeFh4WGgoOCgoOCgoWBg4WEhYaEhoaGhoaFg4SEg4SFhYWDhIODhIKEhIB/goJ/fX5+fn5/hH57f3x8gIF9gYB9foN8fn59fX57fnt7enl6enl6ent5enp6e3t8enx8fHx+fn1/gXx9fHx9f4B+gIaEhYWEh4SEg4KGgoOAgYB+fn+AfX9/gnx9f35+fn+BgYKEg4KBgYKCf4CBgoCAgoWEgoB/gIGCgYKGhYeFhISGhoOFg4WBgoGBgoGCg4GChISEhYWGh4eGhYWEg4ODhIWFhIGDgYOChIODgH+AgX59fX5+fH6Dfnx+fHyBgX6Cf35/gnx/fn19fHx8e3t6enp6eXt5enp5enp6e3x5e317e35/f4GAfX99fX1/gICAhoSEhYSFgoSCgoSCgoCBgH59fn9+fn6AfX2Afn5+foGBgoODgoSHgYF+gICBf3+ChIOBf35/gIJ/goWEhYOCg4WFgoSBg4CBgIGAgYKBgIGEg4OGhYWHh4WEhIWCgoKDhYSCgYGBgYCFg4F/foB/fnx8fn18foN9e358fYB/gIN9fYCBf35/fXx8fH17e3p5enl5e3l6enl6ent7e3p7fXx8f3+BgoB+gH+AgH+AgIDKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzNzc3Nzc3Nzc3NzczMzMvLy8vLy8vLy8vLy8vLzMvLy8vLy8vLy8vLy8vMzMzMzM3Nzc7Oz8/Pz9DQ0NHR0dLS0tLS0tLT09PT0tLS0tLS0tPT09TU1NTU09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tLS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1dXV1NTU1NTT09PT09PT09PT09TU09PU1NTU1NTU1NTU09PT09PS0tLS0tPT09TU1NTU1NPT09LS0tLS0tLR0dHR0dPHhnNlYFtLWWdVTUZIQD03Nzg5Nzw8PDo8Oz42Oj04PDs6OTg3ODs7Oj87PTs8PD47P0E/QkJBQ0RFREE+PTw7QENDQUBDQ0FBR0hHSUtSwtXS09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXVysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMy8vLy8vLy8vLy8vLzMzMy8vLy8vLy8vLy8vLzMzMzc3Nzc3Oz8/P0NDQ0NHR0tLS0tLS09PT09PT09PT09PS09PT09TU1NTU1NTU09PT09PT09PT09PT09PT1NTU1NTU1NTT09PT09LS0tLS0tLT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1NTU1NPT09PT09PT09PU1NPT09TU1NTU1NTU1NPT09PS0tLS0tPT09PU1NTU1NTU09PT09PS0tLS0tLR0dHSzIxyZ2BcTVllUktHSz87Mzc4Ozg5Pj05PDpBOjs9Nzs8PDo6Nzg6Oz0/Oz88PTw/Pj9BPUFBPkNDREJAQT46Oz9DREFDRERCQklHSEhJTr7V0tPT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1crKy8vKysrKysrKy8vLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzMzMzMzMy8vLy8vMzMzMzMzMzMzLy8zMzMzMzMvLzMzMzc3Nzc3Ozs/P0NDQ0NDR0dLS0tLS09PT09PT09PU09PT09PT09TU1NXV1dTU1NTT09PU1NPT09PT09PT1NTU1NTU1NTU1NPT09PS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1tbV1dXV1dTU1NTT09PT09PT09PU1NTU09TU1NTU1NTU1NTT09PT0tLS0tLT09PU1NTU1NTU1NTU09PT09PT0tLS0tHR0s+Sd2hfXk9XZ01LRks9ODc2NTk5OTw+OT88Qzk7PDc5PD07OTc5Ojw9QDs+PT47PD48PT5BQD5EQ0NDP0E9Ojs+QkNFQ0NEQT9FSEpJSky61dPT09TU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8rKysvLy8vLy8vLy8zLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMzMzMzMzMzMzMzMzMzczMzMzMzMzMzMzMzMzMzc3Nzc3Ozs/Pz9DQ0NDQ0dHS0tPT09PT09PT09TU1NTU09TU1NTU1NTV1dXU1NTU1NPU1NTU09PT09TU1NTU1dTU1NTV1dTU09PT09LS0tLS0tLS09PT09TU1dXV1dbW1dXV1dXV1tbW1tXV1dXV1NTU1NTT09PT09PT1NTU1NTU1NTU1NTU1NTU09PT09LS0tLT09PU1NTU1dXV1dTU1NTT09PT09PT0tLS0dHRmn5nYWJOVWpKSElLPzw6OTM3Njc2PTs+Oj06Ojo4ODo7Ozg4Ojs7PD46PT09Ojw/PD0/QkA/Q0RDRD5APT08QENEQ0JEQkQ+REhJSUtMttfT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3MzMzMzMzMzMzMzMzNzc3NzczMzMzMzMzMzMzMzc3Nzc3Ozs7Pz8/Q0NDQ0NHS0tLT09PT09PT1NTU1NTU1NTU1NTU1NTV1dXV1NTU1NPT1NTU1NTU1NTU1NTU1dXV1NXV1dXV1NTU09PT09PS0tLT09PT09PU1NXV1dbW1tXV1dbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1NTU1NTU1NXU1NTU1NTT09PT09PT09PU1NTU1dXV1dXV1dTU1NTU09PT09PS0tLR0p+DaV9kU1hsSEhIS0A9Nzg0NzY6Oj87RDw8Ojw8OTg6OTo6Ojs8Ojo7OT48Pjk9QDs/QUFCP0JCQUM9Pz8+PEBCRUNDQkBBO0ZJR01MSbLY09TU1NTU1NXV1dXV1dXV1dXW1tbW1tbV1dXW1svLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzM3Nzc3Nzc3Nzc3Ozc3NzczMzMzMzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc3Mzc3Nzs7Ozs7Pz8/P0NDQ0NHS0tLS09PT09PT09TU1NTU1NTU1NTU1NTV1NXV1dTU1NTU1NTU1NTU1NTV1NTU1dXV1dXV1dXV1dTU1NTU1NPT09PT09PT09PU1NXV1dbW1tbW1tbW1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTV1NTU1NXV1dXU1NTU1NTT09PT09PT1NTU1dXV1dXV1dXU1NTU1NTT09PT09LS0tSjiGxfZlJWakdIR0lBPTM2Njo7PDhDPEJBPjtBPDg5Ojw6Ojw8PDk8PTo7PD09PD89QD9AQT9AQUBCPD4+PzxCQ0NDRkBBQT1ISklOTUeu2NPU1NTV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbLy8vLy8rKysvLy8vLy8vLy8vMzMzNzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzs7Ozs7Oz8/P0NDQ0NHR0dLS0tPT09PT09TU1NTU1NTU1NTU1NTU1NTV1dXV1dTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dXU1NTU1NTU09PT09TU1NTU1NXV1dbW1tbW1tbW1tbW1tbX19bW1tXV1dXV1dXV1dXV1dTU1NTU1dXV1dXV1dXU1NTU1NTU09PT09PT1NTU1NXV1dXV1dXV1dXV1NTU1NPT09PT0tLWroprY2VSWGhMSkdJQjg0OTQ6Ozo5QDk+Q0U/PDs5OTk9Oj07PDw6PTw7OTw9Ozs/PUA9PT5AQD9CQT5APD05QERDQkFBQj48SEpLTU5HqNnU1NXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbWy8vQ0dDQ0NDQ0dHR0dHR0c3Ky8vLzMzMzMzMzMzMzM3Nzc3Nzc7Ozs3Nzc3Nzc/Pz8/Pz8/Pz8/Pz9DQ0dHR0dHR0dHR0dHS0tHV2djY2NnZ2dra2tvb29vZ2dnZ2dna2tra2tra2tjW19fX19fX19jX19fX19jZ2NjY2NjY2NjZ2dnZ29zc3Nzc3Nzd3Nvb29vb2tra2tra2tra2trb3NzX1dXV1dXV1dXV1dXW1tbX1tbW1tbV1dXV1dXV1dXV1dTU1dXV1dXV1dXU1NTU1NTU1NTU09PU1NTU1NXV1dXW1dXV1dXV1dTU1NTT09PT09PS1bqKa2hoUlhlSUlMTkA5OTo0O0A8Nz05QUM9QD89ODo6Ozk9Oz4/Ojs8PDo7PDo7Pj1APT8/P0FAQUE/QTw8Oz5BRENBREA9PElJSk1NRqPa09TV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbW1svMlYWGhoaGhoeHh4eHh4Ky4t3d3t7e3t7e3t7e3t3S0NDQ0NDQ0NDQ0NDQ0ci5ubm5ubm5ubm5ubq6t6WkpKSkpKSkpKSkpKSnhmBjY2NjY2NjY2NkZGRlhIuKioqKioqKioqKioemuri4uLi4uLi4uLi4uLepp6enp6enp6enp6enqZeAgoKCgoKCgoGBgYGBg4uKioqKioqKioqKiouHvebh4uLi4uLi4uLj4+Pi2NfX1tbW1tbW1tbV1dXV1dXV1dXV1dbW1dXV1dXV1dTU1NTU1NTU1NTV1dXV1dXW1dXV1dXV1dXV1NTU1NTT09PT09XDkXJsaU5TYkxMVk08Ojo3Nz5DPzg+Oj8/QTw/QDc7Ojs7PTs+Pjo7PD48Oz07PT8+QDw/Pz1AQEBBPj88PjxAQUVCQkZAQD9HSEpLUEae2tXV1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19fLzG5QU1NTU1NUVFRUVFRMoPPr6+rq6urq6urq6uvp1dLS0tLS0tLS0tLS0tTEqaqqqqqqqqqqqqqqq6aGhIWFhYWFhYWFhYWFik4MEhISEhISEhISEhIRE0pUU1NTU1NTU1NTU1NPg6ejo6Ojo6Ojo6Ojo6Ogh4SEhISEhISEhISEhIhnQERERERERENDQ0REQ0ZTU1NTU1NTU1NTU1NTS6ry6+vr6+vr6+vr6+vr6dnX19fX1tbW1tbW1tbW1dXV1dXV1dbW1tbV1dXV1dXV1dXV1dTU1NTV1dXV1dXW1tXV1dXV1dXV1dXU1NTU1NTU1NPUy5h3bGlKTl9NUlVNPjw8Nzs/Qz42Ojc+Pzs9QkA5PDk9Ozw6PD07PTs9Ozs9PD0+PT07QT08QUBBQT08Pzw7QEJDQURFPUFAQ0ZLS09GmNzV1dXV1dbW1tbW1tbW1tbW1tfX19fX19fX19fXy8xxVVhXV1dYWFhYWFhYUaHx6enp6enp6enq6unq6dXS0tLS0tLS0tLS0tLUxaqrq6urq6urq6urq6yoiIeHh4eHh4eHh4eHh41SEhgYGBgYGBgYGBgYFxpOWVdXV1dXV1dXV1dXU4WopKSkpKSkpKSkpKSlooqGh4eHh4eHh4eHh4eKakZJSUlJSUlJSEhISEdKV1dXV1dXV1dXV1dXV0+r8erq6urq6urq6urq6unZ19jX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dXV1dXV1dXU1NTU1NTU1NGcenFpSlRdT1JVTkQ+Pzs/QEA4Ojs4PDw8Oz46Ojs4Ozk5Ozw7Ojw5Ozs8Ozo9PT0+PUE/Pj8/Pj08PT88PEFBQ0FERTw+QEVGSktNRpPc1dXV1tbW1tbW1tbW1tbW1tfX19fX19fX19fX18zNeF5hYGBgYGFhYWFhYVqk7ufn5+fn5+fn5+fn5+bV0dLS0tLS0tLS0tLS08Wtrq6urq6urq6urq6vq46NjY2NjY2NjY2NjY2SXSInJycnJycoKCgoKCcpWmNiYWJhYmJiYmJiYl6MrKmpqampqampqampqaeQjo6Ojo6NjY2NjY2NkHNRVFRUVFRUVFRUVFVUVmBiYmJiYmJiYmJiYmJbr+/p6enp6enp6enp6enn2djY2NjY19fX19fX19fX19fX19bW1tfX19fW1tbW1tbV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbV1dXV1dXU1NTU1NTWo3txZElbYE5OVU9AQT89REI+Oz06OTo6PTw7PDs6OTg5OTs8Ozw8Ojo7PDo7QD08PTxAQTxBQTs7PEA/PD1CP0RDQ0U8PkJERkpMTEWN3NXV1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjMzMfFxcXFxcXFxcXFxcXFytDPz8/Pz8/Pz9DQ0NDQz87Ozs7Ozs7Ozs/Ozs/NzMzMzMzMzMzMzMzMzMvJycrKysrKysrKysrKysfCw8PExMTExcXFxsbGxsvMy8zLzMzNzMzMzMzLz9HR0tLS0tLS0tLS0tLS0NDQ0NDPz8/Pz8/Pz8/NysrKysrKysvLysvLy8vNzc3Nzc3Nzc3Nzc3NzdTY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NfX19fX19fX1tfX19fX19bW1tbW1tbW1tXV1dXV1dXV1dbV1dbW1tbW1tbW1tXV1dXV1dTU1NTU169/cF5GXmJQUVdOR0ZDQ0lBPz07PDo8N0BBPD04Ojs4OTg7Pzs8PDs7PDw8PD87PD46Pj44PkI8Pj1BPjw+QkBERUNAPD5APkNJSUtEh9zV1tbW1tbW1tbW1tbX19fX19fX19jY2NjY2NjYzc3Pz8/Pz8/Pz8/Pz9PPz87MzczP09LSzs3P0s7Ozs7Ozs7O0dTPz87S0s/OztPTz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0NDR0dHR0dHS09PU1NTU1dXV1tbW1tfW1tbX1tfX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1tfX19fX19fX19fX2NjX2NjY2NjZ2dnZ2dnZ2dnY19jY2NjY2NjY2NnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjX19fX19jY19fX1tbW1tbW1tbW1tbW1tbW1dbW1dbW1tbW1tbW1tbW1tXV1dXV1NTV1di4gm9XSl9jUlFaS0hBQTxCPT07Oj4+PD4/PT0/ODk6OTk3OD48PD47Ozw7PDs/PT0+OTs7OT0+P0A+QD07OkI/QkNCPz0+QD5CRUdKQoDc1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2M7Ozs7Ozs7Nzc3Nzsqfys3Nzc3QuYOEi8fTwJrLz87Ozs7O07udz8/Sp57Qz9GlotDOzs7Ozs7Ozs7Ozs7Oz8/Pz8/P0NDQ0NDQ0NDR0dHR0tLT09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbV1dXV1dbW1tbV1dXV1dXV1NTU1NXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NfX19fX1tbW1tbW1tbW1tbW1tXV1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXYwIBuVU9gY1dZW0xMQ0A9PTs9Ojw9Qj5CQkA8Ojg5ODo6Ojc7Pz4/PDw7PDo5Pzw8PTg5PD9BPj09PUFAPTtBQkBCQz47QD9BQUlHSkF629bW1tbW1tbX19fX19fX19jY2NjY2NnZ2djY2dnOzs7Ozs7Ozs7OzdKpj63Rzs7Ozpu3tqSiwJOerNPOzs7O0rWVm7PWs56jptawoKKq0s7Ozs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0dHS0tLT09TU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dbW1tbW1tXV1dXV1dXU1dXV1dXV1dXW1tbW1tbW1tbW1tfX19fX19jX19fY2NjY2NjY2djY2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2dnY2NjZ2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV18h/b1pTYWVeXVxPSkQ9QD8+PDc6Pjk/RD5AOTg3ODk7Ozw4OT89PTw9PD47OkE7OTs5OzxDQDw7PT5AQT49QkQ/QkM9PT8+Pz5ISUg/ddrW1tbX19fX19fX19fX2NjY2NjZ2dnZ2dnZ2dnZzs7Ozs7Ozs7Ozs/Inrym0tDQzsqgl36Cw6abr6fUz8/Pz9GfoKqu0J2ak53AnpiWnMfPzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dLS0tPT09TU1dXV1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tbV1dXV1dXW1tbV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2djY2NjY2NnZ2dnZ2dnY2NjY2NfX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dbV1dXV1dfNiHNdWGloXl9gT0lGOkFAPj48PDk2P0I/Qjo2NDg6Ozo8Ojk+PD49PTs/PTxBPjw8Ojw8PTw6PEA9QEI+PkFCPUNDPT0+Oz9BRUtIQHDZ1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2c/Pz8/Pz87Ozs7SrKWnqdXAvNLHnY+ey9PJipmq1M/Pz8/RxYeatMCYoZy0mJyinq+x0s/Pz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0dHS0tLS09PT1NTU1dXV1dXV1dbW1tbW1dbW1tbW1tbV1tbW1tbW1tbW1dXV1dXV1dXW1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnY2NjY19fX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0JB1W1tqaWFeXVNOSTxDQEE+QD46OEVAP0I6NzQ6Ojo5Ozs4Oz0/Pj49QT08P0A9Pjw8PDw8Oj1AQD8/PT5CQD9AQkA8QD0+QUVLRz9r19fX19fX19fX2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnPz8/Pz8/Pz8/QzJ2Nl6zQmpfKxZ6ynpbN1q2ZqtTPz8/Pz9anmbW2mZatuYaelrCzqdTQ0M/Pz8/Pz8/Pz8/Pz8/P0NDQ0dHS0tLT09PT1NTU1NXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX19fX19fY19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tKUcl5ea2tqZV1PTEc/RENDQDo9OzxCPD08OTY0Ojk4Ojo5Nzs/QDs8PUA8PEE+PD07PTw/PDo8Q0A+PTs9QD5CPkBBPkA9QD9GSUQ/ZtXX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2traz8/Pz8/Pz8/P07GigJuvyqCjv8qcpYynrdiqmarUz8/Pz8/VpZm2rZiBoJZ4m4Sek6PV0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1NXV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dbW1tXW1tbW1tbV1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbSk3BgXnBoZmVaUUhHQkVDQEA3Ojo8Pjk8OTc2NTk6Njo8Ozc8QEA8Ojo9Ojw/Pj08OUA8PDo6OT9APT08PUBBQz9APz5BOz9ARkpCP2LS2NfX2NjY2NjY2NjY2dnZ2dnZ2tra29vb29vb28/Pz8/Pz8/P0M6fkGyclteqo9PSrqa1mJ/Vqpmq1M/Q0NDQ1qWZtq6bqIiceZ+phZml1dHR0NDQ0dHQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1dXV1dbW1tbX19bW1tbW1tbW1tbX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfW1tfX19jY2NfX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX1tbW1tbW1tbW1tbW1tbX19fX19fW1tbW1tbX0pNuYFxxZGdkWlVKQENHREFBODs/PD07PDw3NTU4OTY4Ozo5PDo+Pzw9PTk8Pz49Ojo+OTw6Ojg+Pzw9PTw+QEFDQT48PDpCRERKRkJd0NnX19jY2NjY2NjY2dnZ2dna2trb29vb29vb29vPz8/Pz8/Pz9G9n8O31pfA09HQ0srSzZeb1KqZq9XRz9DQ0NWlmra3ta+mnIq9raaYr9bR0dHR0dHR0dHR0NDR0dHR0dHR0tLT09PU1NTV1dXV1tbW1tfX19fX19bW1tbW1tfX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19fY2NjY2NjY2NjY2NjY2djZ2dnZ2dnZ2dnZ2dnZ2drZ2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fX19fX19fW1tfX1tbX19fX19fX19fX19bW19GSbF1cb2doYl1PRj9ISEZFQDw8Pj48PT08NzU2OTk2Ojs6Ojs4QD86PDw5PD49Ozs6Pzk/Ojs5PT49Pjw7PTxAQ0I/Pz47Q0ZGR0hEWc3a2NjY2NjZ2dnZ2dnZ2dna2trb29vb29vb29vb0NDQz8/Pz8/Pz5V+e6WS1KKa08ySl6ObodirmavV0pem09DWppq0xqOXl52lp5aYmrrV0dHR0dHR0dHR0dHR0dHR0tLS0tLS09PU1NTV1dXV1tbW19fX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tbX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2tnZ2dnZ2dnZ2djY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX1tfPjGRWXnBrXGBgTkVITUlJT0M+OkI9PUBCOzU1Nzw6Nzo7Ojo7OT09OTo6OT0+Pz07OT47PDo8Ozk+PD47PD0+QENCPz5BPEFDR0ZGRVXJ29jY2NnZ2dnZ2dnZ2dra2tvb29vb29zc3Nzc3NDQ0NDQ0M/Pz9DR1aeZrcmjqL7KnbGdo7XZqZup2LirocfS16Wbsdifq6Sb0J+rpJvQ0tLS0tLS0tLS0tLR0dHS0tLT0tPT09PU1NTV1dbW1tbX19fX19fX19fX19fX19fX19fX19bW1tbW1tfX19fX19fW1tbW1tbW1tbX19fW1tbW1tbW1tbX19fX2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2djY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fX19fX19fX19fY2NfX19fX19fYzYZdV2JvZE9dVEtIRlNRS0tAPj1EPD9DRj01NTc7OTY6Ozo8PTo7Pzo6OTg6PT0/Pjs/Oz49Ojs5Pjs9PD0+QURCQD8+PzxAQUVHRURSxdvY2dnZ2dnZ2dnZ2tra2tvb29vb3Nzc3Nzc3NzQ0NDQ0NDQ0NDQ0NO5gL3Tm5bP1LWLkZ/T1LyBu9TOlKDT0dS1gsPVxZCNt9fCj4271NHS0tLS0tLS0tLS0tLS0tLT09PT09PU1NXV1dbW1tfX19fX19fY2NjY19fX19fX19fX19fX19fW1tbX19fX19fW1tbW1tbW1tbW19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2tnZ2tra2tra2tra29ra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2NfX2ct+WlVpaltMX01KTEpVTEZCPDw/RkVHS0k9NjY3Ojk3OTo7Ojw9OT45OTo4Oz0+PkE+PTk8PDo9Pj47PTk5Oj9FQUA+PT8/QkBHRURFUMHc2dnZ2dnZ2dna2trb29vb29vb3Nzc3Nzc3dzc0NDQ0NDQ0NDQ0NDQ0cHR0crI0tDUxLjS0tHSwtLQ08fM0tHR0cPU0dTHw9XR1cXE1dHS0tLS09PT09PT09LS0tPT09PU1NTU1NXV1dbW1tfX19fX19fX2NjY2NjX19fX2NfX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29va2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2djY2NjX19fX19fY2NjY2NjY2NjY2NjY19rHd1xSZ2laTlpOTFBRV0VKPz89P0FETExBPTc3NTo4ODk5Ojs8Pjw+ODo6OTs+P0A9Pj46NTo6Oz0/Ojs5Ojw+QkJAPz8/P0FCR0RDRE683dnZ2dnZ2dna2tvb29vb29vb3Nzc3Nzc3d3d3dDR0dDQ0NDQ0NDQ0NDS0NDR0dDQ0dPU0dHR0dPR0dHS0tHR0tLU0tLS1NXT09PU1NLS0tPT09PT09PT09PT09PT09PU1NTU1dXV1dbW1tfX19fX2NjY2NjY2NjY2NfX19jY19fX19fX19fX19fX19fX19fX1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tvb2tra2tra2trZ2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2trZ2tra29ra2trZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjbwXNYVWlrU0xSTlBSWVRGSTw+Qz9BQkVKPT03ODY5Nzc4OTk7Oz0/QDw9ODk7Ozs/Pjw8OTU6PT47OTk7PD8/P0JCQT1BPUBBQkZCQkJLtd7Z2dra2tra2tvb29vb29vc3Nzc3Nzd3d3d3d3R0dHR0dHR0dHR0dDQ0NDQ0NDQ0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tPT09PT09PT09PT09PT09TU1NPT1NTU1NTU1NXV1dXV1dXW1tbX19fX2NjY2NjY2NjY2NjY19fY2NjX19fX19fX19fX19fX19fX19fX19fW1tbX19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2NjY2NjY3LxvVFRsbExLUkpUUlVLRkQ6PkdEREFERjw/ODk6OTU5OTo3PD07PkA9PTc5Ojs5Pjs5OTY2Oj1AQT47PDk6Pj9DQT4/Qj0+QkNFQkFCSrDe2dra2tvb29vb29vb29vc3Nzc3Nzd3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0tLS0tLS0tLS0tLS0tLS0tPT09PT09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1tbW1tbW19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19fW1tbW1tfW19fX19jY2NjY2NjZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2dnZ2dnY2Ny2a1NbcGtLVVdSXFFXSEQ+PEJKRT1ISj89PDc4ODo1OTg5Njs+PD1APDw1OTk8Oj87OTk0ODw9PUFBPD47Ojw+QD89PkE9PUNGR0I/Qkmq39ra29vb29vb29vb3Nzc3Nzc3N3d3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHS0M/U0M7P0tLT0tLS0tLS0tLS0tPT09TU1NTU1NTU1NTU1NTU1NTU1NTU1NTV1dXV1dXV1dbW1tbW19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19jY2NfX19fX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dndsGRTYXJfT1pUV19RUkdCPUVJS0FBTEQ/Pzs5ODg5Mzg2ODY5Pj0+Pz06Njo7Pjs9PTo5Njg6PTtAQDxAPz0/P0I+PD48PEJFSElCPkNJpODa29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3t7S0tLS0tLS0tLS0dHR0dHR0dPT0bm7zLqbnLrQyNPT0tLS09PT09PT09PU1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2NjZ2dra2tra2tra2tra2tra2tra2tra2tra29va2tra29va2tvb2tra2tra2tra2tra2trb29vb29va2tra2tra2tra2tra2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ3qpfVWBuW1VZUVpeT0xHQ0ZNSUZEREk7QUE7PDg4NjU4Njk4Nzw/QT89Ojc8Pz48Pz87OjY4OD09QEE9QD5BQD1AOjs6Pj1BRUdKQkBDR57h29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e0tLS0tLS0tLS0tLS0tLS0tO+wMqaoKKViJGeqpOpz9TT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fY2NjY2NnZ2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dna2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2tvb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2d6iXFVeblheXU5aUFROQ0NMSUlJRklEPEFBPDs4NzY3OTc3OTk9P0E/PDo5QD88PkI/Ojg3NzY9P0BAPUBBPz88PTs7OD48P0VJSEE/Q0aX4dvb29zc3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3tPT09PT0tLS0tLS0tLS0tTIlZyum5m1iX2TjIKBhMTV09PT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tvb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dndmlpYYW5ZYVdPV01QRUJETElNS0ZJRT5CRDg4ODY3OTc1Njk4PT1BPjo4OT4+PD9APzw1Njc2PD4/PjtAQEA/Pj4/Pjs/PkFCRkdCQENIkeLb29zc3Nzc3d3d3d3d3d3d3d7e3t7e3t7f39/U09PT09PT09PT09LS0tLTz6h+kayPko6MhoCIiYSQo8rU09PT09PU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY19jY2NjY2NjY2NjY2NjX19fX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2tra29vb29ra2tra2tra2tna3JJaWWNuWlpSVV5QTDxAR05IUklIRT48SEY4OTc1Nzg3NTg5ODs+Pj07ODlBPj1AP0E+NzU5Njs+QUI/P0BAQUI/Pj8+QUBEQUZIQj9FSozi3Nzc3Nzc3d3d3d3d3d3e3t7e3t7f39/f39/f1NTU09PT09PT09PT09PWtaWaiIuQhYCFi4iBg4qLf4bC1tTU1NTU1NTV1dXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2dnZ2dna2dra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29ra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb2tra29uIWltnalxYTFpfVkg6TEhMSkpDREVDQUxINzo3Njc4ODU4Nzg5PDw7Ozk4QD89Pj8/PDY3PDQ3P0JCQUBAPz8/QT09P0A+QEBGRT09REuI4tzc3Nzd3d3d3d7e3t7e3t7e3t/f39/f39/f39TU1NTU1NPT09PT09PUxZKCg4WGfYGCfXx5foGCg36k29bU1NTU1NTV1dXV1dXV1tbV1tbW1tbW1tfX19fX19fX19fX19fX19jY2NjY2NjZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vc3Nzc3Nvb29vb29vb29vb29vb2tra2tra29vb29zb29zb29vb29vb29vb29vb29vb29va2tvb29vb29vb29vb29vb29vb2tvZgFpebWhaU0ldW1hKRE1ISlNMR0ZBQD9KQjg7NjY5OTc1ODY4Ozo7Ojw5OD09O0A9Ozo2NTw3Oz1CQEFBPD49QEE9PEA/Pz5CREU+PERLg+Lc3d3d3d3d3t7e3t7e3t7f39/f39/f39/f39/V1dTU1NTU1NPT09PT2LKEkKh9g3l2hIh/e3d5gn5+i67A1dTU1NXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dna2trZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2trb2tra2tvb29vb29vb29vc3Nzc3Nzc29vb29vb29vb29vb29va2trb29vb29zc3Nzc3Nvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc1nlcWmxmWFJPYFFSQUhHSkZYTEZAQENDSz87Ozc4ODc2NTc2ODo5PDw6PTs/PTs9Pjw7ODg8OT0/QkFCQzw8P0FCPj1BQkNCREVDQDtDTH3h3d3d3d3e3t7e3t7e39/f39/f39/f39/g4ODg1dXV1NXU1NTU1NPU0ruen3WKeXuIgICChYGDcnOAhYOMrNfV1NXV1dXW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NnZ2dna2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra29vb29ra2trb3Nzc3Nzc29zc3Nzc3Nzc3Nzb29vb29vb29vb29rb29vb29vb29zc3Nzc3Nzc3Nvb29zc3Nzc3Nvb29vb29vb29vb29vc3Nzc3Nzc3Nvb29vb3dByXV9wZVdLUGNPS0JHQ0pIS0ZBPEE9SFFBOjo3Nzg3Njc4Nzw6OD09PD47QD88Pz07Ojs5Ojk8QEJAQkNAPUFAPz1AQkNDQUBAP0A7RU144N3d3d7e3t/f39/f39/f39/f3+Dg4ODg4ODg4NXV1dXV1dXV1NXU18h4i4V8goh6g4SBfoKCc2l0hYuGkJ3U1tXU1dbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tvb2tvb3Nzc3Nzc3Nvc3Nzc3Nzc3Nzc29zb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb297KalxjcWVST1heSz9HTElPS0VAPkFCP0lPPjk6NzY7NzY6Ozc7Ojg6PDw+Oz09Oz48Ojs4OTo4OUFCQkFAQDtAQj06PkFCQz8+PT4/PUZOdN/e3t7e3t7f39/f39/f4ODg4ODg4ODg4ODg4OHV1dXV1dXV1dXV1s6dhpl+f5OTin+CgXx9gnNxm4mAgoOJwNnat7TQ19bW1tbX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tra2tra2tra2tra29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NvfwGNaW21gVlBTU0pETEhNSEk8PkFEQ0ZORDw8OTc5OjY4Ozk3PDk4OTw9OzlAPjpBPzw3NTc7ODpAQUVBPz45PUI/Oz1CQkI6Pj07PT5GTnHe3t7e3t/f39/f39/g4ODg4ODg4ODg4OHh4eHh1tbW1tbW1tbV1tjLioCHhYOXjHh7e3lvfYF1a3ebdHZ7eInHxpiMrdjZ19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2drZ2dna2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tra29vb3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29zb29vb3Nzc3Nzc3Nzd3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3Nzc3Nzc4LdjV1lrYlJNVVFMSktGS0ZDQD5CQT9FTT4+PTg5OTo3OTo3NT03Nzo+PDs7Qjw5Pz05NjY4PTk6QEJGQD49PEBCREA9QD9DO0A9PD4/Rk9t3N/e3t/f3+Dg4ODg4ODg4ODg4OHh4eHh4eHh4dbW1tbW1tbW1tfVrYZ6d32rn3l4entzdH+Dfm9xe3l6c3t2k4qFgImkzdnY19fX2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tna2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29vb29vc3Nzc3N3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vc3Nzb3Nzc3Nzc3N3d3d3d3d3d3dzc3Nzc3Nzd3d3c3Nzc3Nzc3N3d3d3d3d3d3d3d3dzc3OGtYVtebGJSTVZMTUdLS0RGQkI7QT08RUxCQT44Ojk6Nzc5NjY6NTs+QDs9Oz89PD89Ojk5Ojw5PEVDRkA/PkBDQkQ9OT0/QT1CPz1APkdPadvf3t/f3+Dg4ODg4ODh4eHh4eHh4eHh4eHi4uLW1tbW1tbW1tfQmH+Qh4N9eoN2e3Vzenl6kKqmd3JyfoeHh4CAfoKEhJHJzNnX19jY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra29va2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2djY2NnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vb3Nzc3N3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzb29vb3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3dzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3NzhpV9UYm1iUE9TSUhHRkpJSUJBPkJCPEVFREA+ODo4Ozc3Ojc4ODY+Pz07PDk9PDo+PTs6Njc7NjpEQUY+Pz8/PkNBPzs9PT47REM/PjxIT2fZ4N/f3+Dg4ODg4eHh4eHh4eHh4eLi4uLi4uLi1tbW1tbW19jYyH52doN+fnR2eIaCenl1d5yhu6GEgoCAfoeKinx/gYaMnKjO2NjY2NjY2NjY2djY2NjZ2djY2NjY2dnZ2dra2tra2trb29rb29rb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3d3d3d3c35pbT2drXFBRUElDT0pLR0xHSkJAP0FHREBBPDg8ODg1ODk3Njc3QEA/Ozw5Pj04PTw8Ojc4PTk/RENGPkE/QkBDPzw6Pj0/PkVEPz07S1Fj1+Hf4ODg4ODh4eHh4eHh4uLi4uLi4uLi4uLj49bW1tbW19XB3LRueHJze3B6eXaFiIR7eH2AgZiljH98fnuRhZaLhoGDgY6Rvd3Z2NjY2NjZ2dnZ2dnZ2dnZ2dnY2dnZ2dna2tra2trb29va2tva2tra2trb29ra2tra2tnZ2dnZ2dnZ2dnZ2dna2trZ2dnZ2dra2tra2tnZ2dnZ2dna2tra2tra2tra2tra2tra2trb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t3d3d6NWFdobllQUUtISlNJTUhNSUtBQz9DRkJBRDo6PDg2NDg4NzY2Nj8+Pjo8OTw7Oj09PDw4Ozw8RERERT4/PkI+Qj84PT8/Q0NCQEE+O0xUY9Xh3+Dg4OHh4eHh4eLi4uLi4uLi4uLi4uPj4+PW1tbW1teslLZ6eHJvd5V7dHuLgHh1bn6Fg3t/hYhyfH2bnI6JioJ+g32Hk5rH1NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2trb29vb29vb29vb2tra2tra2tra2tra2tnZ2dnZ2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2trb2tra2tra2tra2trb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d7Zf1lgaGxcUUtHR09LTk5PTURGQkg/Q0hEREA6Ozs4NzU3Nzc4NThAPkA7PDk8Ozw+Ojk7OTk7OUZERUI8QD4/PEBDOz5AP0A/Qj8+OjtKVWPV4eDg4eHh4eHi4uLi4uLi4uLi4uPj4+Pj4+Pj1tbX19vKhYR3cXJubniVhHt4hH95dnB4c3eLkY6CdnN9ioaId3d1d4ODfIiIk8Pb2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2trb2tvb29vb29vb29vb29rb2tra2tra2tra2tra2tnZ2dnZ2dna2tra2tra2tra2trb2tra2tra2tra2tra2trb29vb2tra2trb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f0nVZaGlqVk5KSE1OR01EUElGSD9FPUZMREM+Ozs8OTc3OTY2OTU4Pj4/PTs8QDs9PDo3Ozc5OThHREVCPUE9Qj8+QDw/QUE/QEJAPjs8S1Ri1OLg4eHh4eLi4uLi4uLi4+Pj4+Pj4+Pj4+Pj49fX19fEknuJf29sbnV2foSBg4qGfnVybWVtiIaKjoR7c4OHint4e4OPj4GEioqxztrZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29zc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tvb2tvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3dzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f3t7e4clsW2pqalNOR0hOT0VIRk1JSUA7RD5ISUA9PDo6Ojg2ODo3Nzk0OD08PT07ODw8PDw4Njc4OTo6RUJFQT9APEI/Q0M+PkNEQUBAP0A8PUtRYdPj4OHh4uLi4uLi4uPj4+Pj4+Pj4+Pj4+Pj5OTX19fZqXaFfnx3bHB3eXh8jH2KhYB3anN0d3p9bot7fnl6foR/gIGDfnh8foeGlrbT2tnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra29ra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/e3uO9amFpa2lRTkZNTEtKWE1OR0FAQE9BRD9AOzw4OTk5Njg2NjY4NDs+PD07OTY6Ojk6OTU4OTg5OkJERj8+Pj5AQEBCPzxBQD88Pj9BOT5KT17S4+Hh4eLi4uLi4+Pj4+Pj4+Pj4+Pj4+Tk5OTk19fX2sqKhIB5c29tcXN1d4CUeHaAfHWHhXd1cnWgmXp7d3Z5doR0bWxue3iAmouTu9za2tra2tra2trb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc29vb29vb2tra2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f397js2lpbmloUFBPTExPUk9LU0Y/RURERD48PDg7ODc5OTU2ODY2NzM6Pjs+PTc6Pjk5OTk2Ojo4NzxDRUc/Pzs/PkA9PkE9Oz0+OUFAQDhBTlFc0OTh4eLi4uLj4+Pj4+Pj4+Pj4+Pk5OTk5OTk5NjY2NjauY6AenZ1bmpveHCBfWt0cnZ3hIV5h4d5lY55eXp1d3pza298gHx2fYh8gLLe2tra2tvb29vb29vb29vc3Nzc3Nzc3Nzc3dzc3Nzc3Nzc3Nzb29vb29rb29vb29ra2tra2tra2tra29va29vb29vb29vb29zc3Nzb29vb29vb29vb29vc3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3t7e3t7e3d7e3t3d3t7e3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/f39/f4qpqa2hrZFNQT0ZQVFJOSFJLPkREQ0I7Ozk6Ojg2Nzg1NjY4ODg0Oz88Pzw5PDw3Ozo6Nzo6Nzo9Q0JDPUE+Pzw5PT5BQDs8PDtFQD47Q05TXNDk4eLi4uLj4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTY2NjZ1p5vdntveHh2cG50d3BwdHBzb36Jc3qGhY2EenNtcoB6hn1vg5OBdnx9g4a13drb29vc29vc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29ra2tra2tvb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4N/f3+KgbWhma2ZVVlJHUFFOS0xMRUJIRUc9OD08Ojo3Nzg2Nzc2NTY3NDg+PD09Ojg6OD46Ozc4Nzc6Oj5DRDtDQj49OD1AQUM/Pjw+RTw+PUJNUF/S4+Hi4uLj4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk2NjY3MB2doCCfnp4eHBsdXlya399bHNvdGdoaYB/aWl4c2d+iYl4cIKGe3d9foWKvN3b3Nzc3Nzc3Nzc3Nzc3Nzc3d3c3Nzc3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODflGttZm5mU1NJUFlUTEhGTkZGRUJGPTs+PDs5Nzc4NTc5NjQ1NzU4PDs9Pjo6OztAOTs7ODc6OTlAQkE8QUE/Pzk/QEJFQ0FAQEM7Oz1ES01g1uTi4uLi4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk5NnZ2tmYc3uqhJaCcnR1dn14aGx8d2h4d25rcHR5gIJ3dHyBhIJ9c3CAin94gn95g8je29zc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f4N/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh24tubWdzY1lRTVVbV0hDSUZOS0dCRD8/Qjo7OjY2NzU2NzY0ODc2Ozw7Pj86PDk8Qjg3OTo6Ojk6QUFCQUJDQEE+PT9CQ0NEQUJGOTg9REpOYtjk4uLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXZ2drcqHGCtXiRfnNsem6EgXaCfWtoan+DeHZ8dX2FhXRmcHl9d316gIqFe318foC03tzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3dzc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3Nzd3d3d3d3d3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e397e3t7e39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4ODg4ODg4tiFb3FrdWFWT1VVXE9ETUY+SkdKRUQ8P0I6PDk4Njg0NTY3NDc2NDk7Ozw7OD47PEE4ODo9OD04Oj09QEBAP0FCP0A+QENCQ0FBRTc2O0RMTmPa5OLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXl29ra3Z5sbnNxhY1ybXBuf391hH5rcnZ2enN4gXhzbnVwbWt2fHmFiIB/f392coODsd/c3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eDg4eHh4eHh4eHh4OLXhW1xb3ZeUldTWlpRSkhDQFFAQkQ8OT9BOjw5NzU3NDU2NjQ3NTY9PDo9PTk+OjxAODo6PDY7OTs+PUJCQjtBQkBDQEBEREM8PUA3OjxFS01l3OPi4uPj4+Pj5OTk5OTk5OTk5OTk5OXl5eXl5dPOxsB+cWxveHt2b3VuanNzbZKGeG50dG5vdIZ/b2twboJ0bXZyfY2DdnF/d3mKgabf3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3dzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t/f3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi1oZucG1xYFJZUFdfWUpMTElSP0Q9OTtCRjs6OTc0NTY1NzU0NjY2Pj07Pz45PTk7Pjg9Ozo0ODtAQENCQ0FCRkE/Q0BBQkREOz0+OTs8QkxNZODl4+Pk5OTj4+Tk5OTk5OTk5OTk5eXl5eXl5eW5t7Woc3JscHd6dHd4bXFydXd/hHRyc2xsa3F8bnBudGuBf3GAd32Eg355gHNygYqg2d3c3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh49WHcWxqbF5YWlVXYFZWUE9QTD1BOjs8RkE4Ojg3MzY1Njk2NTg1Nz89Oz8+OT04Ozw5PTs7NTo9Q0JCPENDREREQUE/PkJDQzw9Pjg5PENLS2PN0dnh1sjY4+Tk5OTk5OTk5OTk5eXl5eXl5eXltbW2q3J5cm59f3Z1d2hqaGlwb3Zta2tnZWZxdG15gG5teXd2iHhxa2podXV5dHV/wd/c3d3d3d3d3d3e3t7e3d3d3d7d3d3d3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHi4uHh4ePVhnFwY2lhV1NZV19MUk9STUtAPjg5O0E+ODc5NjQ3Njc6NjY2NDk+Pzo8Pzo/OTo6Nzo9PDk5PEFBPTtBQ0VDRkA+Pj5BRUQ+QEE3OD5GSEpesrW4wbm1u8jg5eXl5OTl5OXl5+fn5+fm5ebm5ra2tbWOfX5weoR1cnZnYmNlbGtyb2ZpbHZtd4Z9hXlsbHd4a3ZwfH14c3V5fHd2h7ng3d3d3d3d3d7e3t7e3t7d3t7e3t7d3d3d3d3d3t7e3t7d3t7e3t7e3t3d3d3d3d3d3d7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4eHj1Yd1bl5uY1pUU1hXS1NLSk1SR0E4Ozs+PDk4NzU2NTY2OTY4NjY5Pzw6PT07Pzo7Ozk8PDs5Oj4+Pjs8PUFEQkNBQEBBP0JDPDw9Nzs+REVKXrG1tLW2t7e2y9rJ3uXl3eDi3tXU1tPU4OPg39+2treuh3t/bnmNenJ1bWNobGxtaXR4enF5enqIh4N6aWh9cWRvcXyGgX55e318e4an2t7d3d3d3d7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4uHh49aGdmxhb19dV1lcWlJQSEpXTEVHPUA9Ozs9OTY0NjU1NTg2NzY3OD87OT09PDw5OTw6Pjw6OTg+Qjs7Pj5AREBDRUFAQD0/QDw9PTU5PEJHRl2xtbW2uLm5ubq9uMPT0r3BwcC6u7y6u8TMxb/Dt7e3hGl1gX1ndYd5Z3Vxa2t5eHB3fH15bWl3e3h3bml1j4FwbHl4d3d9gXuGgnmAoNze3d3d3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODh4OHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4ePXhXJrZ3RhW1hYX15TVVVRVUpMRj9JRDs5PTY2NDc3NTc4Nzc3ODk8PDo+PDg8Oj0+OTs8OTs5P0E8PT9DP0FARUJCQTw9Q0A6Pjw1NDlER0dasbW1tre5ubm5ubm3ubm4uLm5urq6urm5urm6u7e3uX9ucHN6b3B/eXNuc3Vsc3Z4cXFwb2tvcX6Bc2mHhIF9dHOHdW11hYmBgHJ2hafd3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uHj14lxa2xyW1dXXWBUUVVUUFJPSkNATUE9Ozk2NTM0NjQ2ODc3Nzk6Pjs8Pjs5PDo8PDk8PTw7PT0+PUNEREBDQkE/QD48PkE8OD06NjY6QkpIWLG1tLa2uLm5uLi5uLe3uLi5urq5ubi4uLi6uru3uKx7cnhxf3ZzfnBsbXpyZ29sbW50cHt3d3Jyd3pvhpJ2f3x8enZ5fH9zfYdyda3T393d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4eHh4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi49eHb2pxalVWV2FbT1FSUE5XSURESUo/Ojk6NzUzNDk1NzY2Nzg4Ojw7PD46PDo6PTw5PDw9Oz09PDs9REdEQ0E8PDw8Pj5AOzg8ODE1OkFGRVautbW1tre4uLm4uLi4uLe4ubq5uLi3t7i4ubq7t7mqcnB4d3x7e4J3aG5xam9qY2lyf21zcn54dHFsanaAeX2AgH91doB1a4qLgHaR1d/d3d7e39/f3t/f3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f4N/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLi4uPYhm1sdGVWUFxnWE1YU1JRWUVDS1BOOzk4ODY1NTM5NTY2NzY4Nzk+OT0+OTw5OTw7Njg5OTo8QEA9PkBGQEJCQDo+PEE9Pzs7OzYxNjxCR0RQqLa1tba2tre4t7i4uLi4uLm6ubi4t7e3t7e5ure2tIlyd3h9iXxwem99c2hqbGdnbHRscXd0cWx2c3Fxd3FyfHl4g3Z7d2mLkYp9kM7f3d7e3tvY2drZ297f39/e3+De39/f3Nvc3N3e3uDg3+Dg4ODf3t7e39jS397f397e3t/f3t7f3t/f3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLi4eLi4uLi4uLi4uLi4uLj4+Lj4+Li4uPj4+Pi4uLi4+Lk14NoZ3VkVlVkZVdKWllXW1Q9RU1LSD04NzU3NjQzOTQ0Nzc1Njc5PTo9Pjw9PDk7PDk5Oj45PD4/PkFBQ0FFRUQ+OzxBPjw5PDs3Mzc+REhFSqG2tbW1tbW2tre4uLi4t7e4uLi3tra2tra3uLm2traLfXpsbHp/cGx5dm5qaGdlcXp4b2lvb3B1c21zd4Fnb32CgYNyf3lqcHJ6f6ng393Zy8a/vb6/vsLN0tDW3tnc4NfQzcPCw8PH1dfT2dzX1NjX0MfExce9vM/Kz87Y3djO3N3c2t3T0dze39/e397e3t7e4N/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eLi4uLi4uLf4uPi4eLg4d7W29/Sw8rJx9Hb3OLk4eHg2dre1sbExcTN2trf5OHi4trX3st9aWZxYVleZWFNTFRLUlpMO0hNSEZBPTc2NjUzNDY2NDg3NjU2OTw7Pj46Pjk5PDk3OTs7Oj49PEBAQ0RCR0ZCQT08Q0A9OTw7Nzc3P0RGRkaZtrS1tbW2tra4uLi4uLi3uLi3s7W2t7a3t7i5tba3opdxb29waW50dnFmZWNrbmdvcm1mZ2tygWVvdnyAeGRzj39zaHFyaWVlbm+w39HFv7u5ubm5ubq6uru6vc3Gw8e/urq6uru7u8HCvcHFvby/vry7urq5ubq6ubm6w8XDucDDwby/ube/z8/U3tjc3t/g3tLa4N/f4ODg39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eDg4ODg4ODg4ODh4eHh4uLi4eDh4uLi4uHa2t3RwsPCu8XT1uDdydPDrrnAsaqrq6uwtLbJ0sXRxLG4v7Srq6usr7S0vMzE1c60tLureGxtbWBdYl9ZS1NVVFFQREBRTUhEPzo3ODU3MzE1NjQ5ODQ2Njo8Oz08ODw5Njo6ODg5NzU8PDw/QEFAQkRDQkE8PkI/Pz09PTc1OD5DRUNAj7a0tLW1t7i4uLi4uLm5uLe1sautr7Oxs7OztLS0tqaei2tue3ZxeXhnY2hfcXdha25vaG99b25ja2lseHdsa4Z+bHB6dm1scG95sca8uru7urm5ubq6urq6urq6urq6urq6urq7u7q7u7y7urq6ubq7u7q6urq6urq6ubi3t7i4t7e2tbW1tbi3u8e+w8XHzcS4wMnH0tzZ2d/e3uDf39/f4ODh4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh3Nji4uLi4eHh4OHg3tfGxtHQztTe3tPO0t/SuLi8sq2trKysrrG+ua63rKipqamqq6urqqqqq6ysuKyqqqqrq6urra6urq6urryzrayrpHlub21fXl1dVE1SU1xUSkE/UElIPjg5NjgzNzMwNTczNzg1NzY2Ojw/PDg5Ozo6Ojg5OjY1OTs7Pj9EP0NFQkNCP0BAQT9APjw3ODc6QUVEP4W4tLS1tbe4uLm5uLi3t7SurKuqqq2urq6vsLGzs7WjcG5ucm1wg311aWFlaGZkY2Rxc21td25naW1tZXBzb29zcXN8h4F6dX11n7u6uru7urm5ubm6urq6urq6ubq6urq5uLm5ubm6urq6u7q5ubm5ubq6ubm6ubm4uLi3t7e4uLe3t7a2tbW2tra1tbW1tba1t7e3t7rBvrzGycrb3+Dg3tvd3d7h4tDW4uHg4ODg4ODg4ODg4ODg4OHg4OHi0768zNjd3OLg0dnbxL23sLCxsa+zu7uzsLS9s66urq2tra2sq6qqqqmpqKmpqampqqurqqqqqamoqampqampqaqqqqytrq6urq6urq6sraR4aWJxZmFZWlZRUk5cU0Y9QlJEQTc8OzY5NTY1NDU2NTg3NTY1Nzg7Pjw7OTk5Ojg3Nzk3Njg8Oz47RD8/Q0BBREE+P0M9Pjw+Ojo3Nz9DRj54srCztLW2t7i3trKurq2sq6uqqaqtraysrq+xs7S1t4xucnRqaIB5ZmpmZWxdaG5waGxxYmNmcoJ+dmhobGpueoaBhXx4cXF5gK+6ubq6urm5uLm5ubm5ubm5ubm5ubm4uLe3t7e3uLm5ubm5uLe3t7i5ubi4uLi3t7a2tre3t7e3tra2trW0tLW1tbW2trW1tre3t7e3t7e3tre4v8bP0MS+v8DE19e8ydra4OHg4ODh4eDg4ODh4eDb3t7Uzby3tre6wMDJxLfIvrKwsLCwr7Cvrq6ur7Cwr66urq6uraytrKurq6qpqampqampqampqKmpqKmpqampqKmpqKmpqqqrraytra2ur66trK2heWpjbWdiXFhRUFFLVEpCOklRP0E3PDk0OjU2NTQ1NTY4ODY4Njs6OTw9PTs6ODY2ODg6ODY3Pj09PT5BQUVCQkNBQUBBOj09Pz05Ojc9QUc8bKqmqKutsLGwrqupqKqrq6mpqamrrKytra2usLO0tbilgIdvaWdzdGZrcG1qZGxvcm5rbWNrcHyJhG5qbHx4Y3uKfnNqc25rcY+7ubm5ubm5ubi4ubm5ubm5ubq5uLi4t7e3t7e3t7i5ubi4uLe2tra3t7e3t7a2t7a2tra3tra2tbW1tba1tLS0tbW1tra2tra3t7e3t7i4uLe2t7a2uLm4uLe3uL6+uLq9vcfb4OHg2Nnd4eHg3dfKwcPCurm5uLe4uLi3tbS0tLKysbGxsLCvr6+vr6+vr6+vr66ura2srKyrq6yqqqmoqKmppqepqaehpaipqamoop+hoZyip6inqausrK2ur7Cwrq2unXdwbGphY2BZUU1RTFJGQzlNUEU+ODs3Mjc5Njc0NDM1ODg3OTc7OTo9PTw6Ojk3NDo5ODY1OD8/QEI9RENDQ0FDQEJBQDtAP0A/PDw6O0NIPWOopaWlpqioqKenp6ipqqmoqKipqqqsra6wsLCztLW1taWYdn5xZmt4cW9tZmVsaGNsZ2ZpaX11bWlvfXZ5hWZod294b3Fvcninu7m5ubm5ubm4uLm6ubm5ubm5ubi3t7W1tba2tre3t7e3t7a2tba2tre2tbW1tra3t7e2tbS0tLS0tLS1tLS0tLW1tba2tra2t7e3t7e3t7a2tre2tre3uLe2t7i4t7i4uLi4wMXTyry8w83PyMC9urm5ubq6ubi4uLi4t7W0tLSzs7KysrGwr6+vr66urq+vr6+uraysrKurrKysq6ehoJ6gn5udoaGdlpmkpKaon5mZmZmanZ+gn56fpKqtrq+ura2srJl1cGlrY2FeXVVOU0tSREQ4TktHQTo4NTI2OTY1NDczNzc3ODk3OTo7PT0+ODg4NzU6OTk1OD9AQEFEPkZBQkNAQkNCQT88QEJCQD0+OjpERj5cpqWmpqampqanqKenqKioqKenqaurrKytra2ttLS0tbekc311bnONf3JmanFjaW1jaGZobG51aV9jZ3VzdnpuZ3Bwcn56cYihu7m5ubm6urq6urm2s7a1uLm2trW1tra1tbW1tbW3tra3tra2tbW2tbW1tbS0tLa2t7e3tbS0s7O0tLW1tLS0tbW1tra2tra2t7e3t7e3tra2trW2tbW2tra2tra2tra3tra3uLi3uri4uLe3t7i5ubm5urq6urm4t7e3t7W1tLS0s7OysrKxsbCwr66urq6urq+vra2srKuppaSmpqScmZubmpmampmXl5eXl5aZm5iZmJmZm52en5+dnJ6gpKWko6OioqKQdG5jcGFeXltUU1RIVEo/PFFCRkM7ODYzNzo1NTQ4Mzg5OTc4OTc7OTs9Ozc6NzU2OTk4NTg+Pz9ART5CPz9DPzxBQUI/PT9EQT8+PTk9Q0Y/VaSlpqanqKeoqamop6ioqKioqKiqrKuqqaipq7W1tba5o3eKcXKHhnd0cGh5a2JjYWVsaW5zal9jZWNjZWprYmRqbHaXjX6ovbm3tre5u7u6uLWxrKurqq6wrKyrq62tq6uvsLGvr7CytbW2t7W1trW1tbW1tbW2trSvr7O0tLSvra6vsrW0tbW1tbW2t7e3t7e3t7e3t7e3t7Owsra1tLa2tre3tra2tbW1tra3t7e5uLi4t7e3uLi4ubq6urq5uLi3t7e1tbS0tLS0tLS0s7OysbCvr6+vr66vr62oo6KgnJqampqZmZqbm5qampqbmpmZmZiXl5aYmZmZmpycnZ+foJ+goKChoaCgoJ+fi3RuaXRdYGZeUlRLRFRJPUVTSEVCOzo0NDY5NDQ1NzM4ODg3ODk5Ojs7Pz04OjkzNTg5NjM5PT5AP0A6QEJCQkA/QEJCPz0+QUFCPz06PkVDQFGjpqWlp6inqauqqKaoqKipp6ioqKinp6ioqaq1tbe3t7KZtH99kIx1Z2lqbGZjYGNoZW94cGlicXx5cGpmZmRma3NqhYystrKwra2ttLeysLCtrKuqqaiop6ipqampqKinqKipqaeoqqurra2sqqytraysrq6traunpaSnqqyopKOkpamwsbGztbW2t7i3t7W1tre4t7e3t7Kppaasq6ivtLa1s7W3t7a1tbW2tra3t7e4t7a2t7e3t7m6urq5uLi3t7Wxs7S0tLKxsK6sq6yurrCxsK2rqqmqqKijnJqZmJmYmJiYmZmZmZmZmpqZm5ubnJybmZeYmpqcnJydnJ2foKGhoqKioKGgoKCfnop1amtuWVxhVktPREdVRz5PV0hEPTw4MzQ0ODQ1NDgyODk4ODk6Ojw5OUA8Njk6MzY3OTE0PD8/QEBBOkNGRUJBREJDQTo7P0FCQz9APUBEQ0BPo6empaemqKqqqqakpqenqKioqKimpqaoq6uttba3t7e4rbJ1cHuDdmBiaWtiZWZhZGdmfYh5bHKAfXFvcXhjbW5xZo+srKurq6ysra6urK2trKyqp6WmpaWlpqioqKiopaeoqKeoqKeoqKmqp6Wko6KioqOioKKioaKhoKChoaKjpKOjpaWlqLC0s7OzsKuqqaqztLa3trGopaOioaGipKiqqairs7Sxrq6xs7W2tra3uLi3tre3t7e3t7a2uLe0sa6ppqerrKmnpqWkpKSkpKWnqaajoJ+enZycm5uampmZmJeXmZmZmJiZmpqampqampqbm5mYmpydnZ2dnZucoKGgoaOjoqCgoKCfnp2FdGtsaFdYU0pHTUVITUdAU1dGRz09OTM2Mzc0NTU3Mzg6Ojo6OTw9OjpBPDY9ODM3ODgzNztAPz9AQDpCRUNAQkRDQT87O0BDQkNBQDxBQ0A9TqKnpqanp6mqq6mkpaWlpaaoqKippqanqKmpqrW2tre3t7izc2h7c2JnamtpaWJhZGloXV1tfHJma3J/fHR8bm1zc36gqamrq6uqq62trKusq6mpqKWjpKampqWmp6eqqaamp6enqKinp6iop6WkpKKhoaGhn56en5+fn56foKGho6Wko6OkpKSlp6enpqWkpaampqeqraumpKKhoaChpKWlpaempaeoqKalpaivtLa3trW1tra1tbOwrKupqa6rqKWlpqampaSkpaWlpqWkpKSkpaKhoaGgnp2bm5ucm5qamZiXmJiYmJiZmpmZmZmYmZmZmZqZmZydnJycnJybnJ+fn6ChoaKgoKCfnZ2cgHNrbmReU0pITUZETEtFRFFTQ0c9PDgzNjI4NDY0NjQ4OTg6Ozk7Pjw5PTs5PTczNTk2NTY8QD0/QD88P0JDPkJCQj89Pj5CQ0FFQD86PkVAO0+jpqWkpqeoqaelpKWlpKWnp6eoqKanp6alpqa1tba2trW2uYptcW1vfHxxZ2pmYGFsYFROW2hqbm9tgYJ9cWdxdn6aqKeoqqmpq6urrKqqqqimpaWkoqOlpqalpaWmqaqppqWjpKWmpqSko6Kio6Khn5+fnp6cnJycnZ2dnJ2en6CioaKjo6KhoqKkpaSioqOjpKSjpKSko6Ggn6GipKanp6ipqaelpaSipKSlqK2wsKyrqqusqqmnpaWmpaWlpaalpqioqailpaWkpKSlpKOjpKOioaGhoqKgnp2cnJubm5qZmJiYmJmam5mXl5eWlpeXmJiZmpqcm5qampubm5ucnJ6goKGgnp6enpycm356bnJiXlNNSlBFRk5NQkBPRT5JOz01MzYzODM2Njc1Ojs4OTs5Oj49Ozo5OT03NjY5NjU2PkI+PkE/PT5DQT5DQ0BAO0A/QkJCRUA+Oz5FPzxQoKSjpKOjo6SkoqSlpaSlpqamp6empqalpqaltLW1tbS0tbiBaHx9ZXOCemxwdWFfY1ROT1FbaGxpbGxxbW5xbnScoqSnqKioqauqqqqqqaempaSjo6OjpKSlpqalp6ytqaShnp2epKShn56foKCdnJ2dnJycmpqam5ucnJubm5ydnp6foKChoJ+goaOioKGjpKSjoqSlpaWkop+go6SkpKapqainpaGdnJ+jpaipqainqKioqaempaWkpKSlpqampqampqenpaWko6Ojo6KioqGhoqKhoqOkop+enZ2cmpubmpqZmJeXmJaWlZSUlJWVl5iYmpubnJuampqam5ucm5ucnp+fnpucnJyam5p/fnF0YFtUTUdNSEZMSj8/TkM8QDs8NDM4Mzc0NzU3ODs9ODo6OTk7PTs7ODk+Njc4OTU4OD9APT9BPjs9RD89REA/PzpAQUE/QUVAPjw8Qz88Tp2ioaKioKCipaSkpKWlpqenp6empqampaampbW1tbS0tLS3jHalsXdmc3Jvc2xjZGlYT1JRT09dgG1kYFptkZGSoqKjpaampqenqKiop6alpaOioaGhoaKjpaempqesq6emoJ2cm6Ghnpubmp2cmZiam5qampmZmZubm5uampqampucnZ6goaCfnp+hoJ6foqOko6Omp6inqKWioKGhoaGkpaWlpKCcmZmbnqOmpqampqanpqempaOlpKWlpqiop6enpaWlpaWkpKOjo6KhoqKioqKhoaKjo6Kgn56enZybnJubmZaUlJSTk5OTkpSUlJWWl5qam5ubm5qZmZqanJ2dnZ2dnZuampqamZqXf3dvc11aTkhKTkdFRklERU5APD09PDQ1OzQ2NDY1Njc5Ozg5OTg5OTw7PDc6Ozc4ODg1ODg/Qj9BQTw+P0A8PEJAQT49QT4/Pz1CQUA6OkA8PE+doqGfoJ+dn6OkpKSlpqeoqKenp6ampqampqW1tLS0tLS0tbSXtqd1Znh2Y2xjY2VjW1JTU1JNXqCMeFhodpajnp6hoaOjo6OjpKSlpqalpKSioaGko6OjoqOlpqamp6enpp+bmpuioJqWl5Wam5qXl5iZmpqYmJqampqbm5qZmZmenZ2goqOjo6KkpKWinqGhoaKjpaampqSjoaCgn5+hoZ+goJ2amJiZmpygpKOjpKWmp6alpaOjpKSkpKWnp6ampqampaWmpKOjo6SjoqKjpKGfoKGhoKGgoaCfn56dnZyamJeVk5KSkpKSkpOTkpOUlZaZmpqbm5qampqbnZ6enp2cnJybm5qamZmZlH10bHReWk9IRUdGQkVORT9GOzo+Pzs0Njo2OTM2NDY4OTo4OTc4ODo8Ozw5Ozs6OjY3ODk5Pj9APjw9QD5AOjlAQT89QT8+QUE+QUE/Ojk9PjpQnaCfnJucnJufoqOlpaWlp6iop6ampqanpqantLS0tLOysrGwsK2rkHiGj36amn93Yl1TUlFRTGKgootaiKCgn52YmZycnZ2eoaGgpKenpqWkoqGjp6alpaOipaampaanpqagm5mboaCXkpOSl5qcmpeXl5iampmampqam5qYmJmaoKCgoKGfoaKipKamop6gn5+goaOko6Khn56enpyanZuZmpqZmJeZnqChoaKioqKkpaWmpKSkpKKioqKkpaWlpaWlpaalpaOko6KioqGgoKGgnp+fn5+fnp+foJ+cm5qZl5WUlJSTkZCRkpKSkpKSk5SVl5iZmpmZmpqam5+fnp2cnJycmpmZmpiXl5F8cmdxXl1QRj9BRD9KT0JCRjhDRT4+OTg7Nzc0ODQ1OTo6Ozk3OTo8Ozo8PT48PDo2NzY5OD4/QT47Pz49PDg6PkFAQUE/P0FCP0RBPjo4PkE8U5ycm5uampycnaGio6KjoqSmp6alpaampqSjo7KysK2rp6amp6alpqiln6iop6qnoXmEXFFST0xcnKCAYpmgnp2clZOVlpeZmp2dnqGmpqampKOioqanp6ajpaampaWmp6amop2cn6Gfl5GRkJSXm52YlpeWmJuZmpqampqZl5iam6Ghn56fnpybnJ6goJ6dn56fn6Cio6SjoqCfnp2ZlpeXl5iYmZubnqKioqKioqGio6WlpKOio6SioaGhoqOkpKSko6SkpKSioqKhoqGgoJ+gnp2enp2dnZ2dnp6em5mYl5WTk5SUk5KQj5GSkZKSkZKTlJaXl5iYmZqampyenZ2dnJubmpiYmpmXlZaNempmamBiTkY+P0A9SkVAQ0A7QEE8Ozs5Ojc2NTg0Njc4OT04ODs6Oz87Ojs8Ojk6Nzc2ODs8Oz08Ojo8PTw3Oz5DQkRDPz1BQ0FEQT88OkBCO1eZmJqamZmam5ucnp2foqKhoqSlpKSlpqSioJ6op6alpqWlpaemp6ampqakpaanqKehqXJOUU1KVJahenKanJyenJeVlJWWmJiXl5qeoqKhoqOkpKOjpqalpKanpqWlpqalpaOgoKGhoJmSkI+Wm5menJaXl5eZm5ycnJqamZeZm5uen52cnZyZmZqcnZydnp6fn5+hoaCgoaKgn56bl5WVlZeanZ2fn6GhoqKio6OhoaCgoJ2cnaGioqOkpKOioaSlpKOko6SjoqKioqKhoKCfn52cnZ2cnJ2dnJ2enpqXlpaVlJOTkpKSkpCRkpKSkpGSlJWWl5iYmJiam5ycnJycnJ2cm5mYmZiWlJWXi3hsY2RiZFFHQT1DO0tIRDo7Ozw+OTo6OTo3Mzc5NTo4ODg8OTg7OT09Ozo7Ojk8PDc2NDc/PDo9Ozw/Pjw7ODxBQ0FDQkI+P0NAQkFAOj9APztZmZiampqam5ubm5ydoKGhoaGhoqKioqKhn5+dpKWmpqenpaWmp6ampqWkpKalpKSkpaaGUFJQT0+PmHB6mpubnJ6cnJycm5ubmZiYm56dnp6foKOkoqGhoqOio6SkpqalpKSjoqGhnpyblZOVmZyam56amJiYmJqcnpyam5iWmZybnJycnJydmpqbnJ2dnp6dnp6fn52cnJyhoaCblpWVlZacn6Ggn5+hoKKjoqOhnZuZlpaWlpicnqCip6ikoaCgoqOjoqKioKCgoJ+fnp+gnp2cm5ucnZydnJmanJuWk5KSkpKUk5KSkpKSkpOSkpKRkpSVlpeYmJiYmZqcm5qbm5ucnJqZmJiXlZWWl4d3ZGdoZGJNQ0U8RDlJSkU5Ojs9PTo6Nzg6NjQ3OTU8OTY4OTc5PDs7PDo6PDs6PDw4Nzg3Pj07Pj46Qj86Ojo/QURCQ0FBQD9EQUFAPjpAPj06W5qYmZqbmpubm5uen6CgoaKioKCgn5+enp2dnKWkpaanpqWlpqakoqKio6Oko6Kjo6KnllRYVVJOZ21rgZ6am5udn6Cgn56enp6dnJ2dnJ6enp+goaCfn5+goKGioqOkpKSkoqGhnpuamZamuZ+ZmZienpiYmZmam5qWlZeWlZicnJ2cm52dnpybnJ2cnZ6bmJqeoaGdm5udoKKhmpWVlpaZoKKfnZueoaKjop+em5eXlJKSlJeYmZ2goqenpaGgn56goaGioaCfnp2cnJubnJubmpqZmpydnJmXmZaVk5GQkJCPkZKSkpKSkZKTk5OTk5OTlJWWlpeXl5manJubnJucnJqamZeXlpaVlZSEcmZsYmRbREJMPT84RktCPEA+Pj05Ozk6PTg1ODg2Ozg1Njo4PDw7Ozw8Ozk8Oj09OTU4Nzw5PD88OkE/Ojo6QEBDQkRBQ0A/Q0FAPj08QD09Ol+al5mamJeYmpycn5+foaGhoJ+fn56foKCenZ2lpKSko6OioqOjoZ+foaGipKOio6SiradXXl1UV19ua42dmpqbnJ2dm5ucnZ+enZycnJydnZ+goKChoaGgoKGgo6ahoqGioaCenJubm5mjppGcm5yZnJ6ZlpaWl5eTjo6QlJabnJuam5udn52cnJycnJ6dlpSZnJ+in5ycnZ+hoJuXl5mZmpycnJubnZ6fnZqXlpaWlJOTlJiampqfoKGmpqWgn56fnqChoaCenJubnJybm5ybm5qZmJmZmZmXl5iVlJKQkJCQj5CSkpKSkZGTk5aYl5STkpSVlJWWlZaZmZmam52cnJyampmXlpaWlpaQgG9vZV5gV0BKSDg/N0lFP0VBPD07Ojo8Ozs3NTs4Njs3NDY6Oj47Oj0+Pj07Ozs+Ozo4Ojk5NkBBPTo8PTo6OT9BQ0JERUM+P0FBPz8+Pj89PDtgl5WXl5aVl5mbnqGhoKGioqCenp6enqCgn52bpaWkpKSioKCfoJ+dnZ+hoqOjo6OkobCjXWVkYGFua4GenJubm5ubmZianJ2enJubm5ycnJ6ipKGeoKGioqKhoKaxrqCgn5+enJmZmpqdrWF5nZ2em5manJiXlZWWkY6Nj5KYnZycm5ycnqCdnJucnJyempWVm56foZ+dnJyenp2cmpqampqampqbm5qXl5aTkpWVlpWTlZaam5qanZ6foqWjnp6fn5+en5+enZ6fnZycm5qcm5qbmpiZmJiYmJiYlZSTkZCRkJCQkZKTk5CRk5SYmZiVk5SVlZWWlZaXmZmXmZqenpyamJiXl5aWl5eYjX1ubV9lVlRFSzw3PjdSRUM+QkE4Ozw7OTg6ODY7Nzc6Njc5Oj0+Ojw8PT49PD06Pz06ODw9OTtAPj4/PT45OTs/QkNAQ0VDPT9DQj5AQD5APTw8YZWSlJWWlpeanJ6goKCgoaCgnp6enp6gn56em6WlpKSioJ+fnp2dm5mbnJydnp+gn56rmGNpbW5pZm2enZybm5ybmpmZmZqam5ucm5uam5ygo6SgnZ+en6CgoJ+mkpWtn6CgnpuamZqZq3tDgZ+enpyZmJqamJiYmJKOj5OXnJ2bnJ2cnJycnZycnp6dnpqVl5ygoaGfnp2eoJ+cnJuampqbmpqYmpmVk5OTkpOWl5eVlJiYmZucnJydoJ+gnp6enp+fn56en6KjpKKgnp6cm5qam5uamJmZmJeXlpWUlJORkZCQkZKTk5OSkpOUmJmYlpWUlZaWlpaWl5iYmJiXmZqamZeXl5aXlpeWl4l4dmddX1dURUU5OTs8WT5AOEI/OTw8Pjk4Ozg6Ozc5OjU4OTs9PDk9Oz0+PD0+Oz8/Ozk+PDw+Pz5AQUE9ODc7QkNFP0FFQz1AREJBQEQ7Oz47PGKWk5SUlpWUlpiYmZubnJycnZ2cnJ2en56dnJqkpKSkoJ+enpybm5qZmJiYmZucnZ6cpolla3R4bVuFop2dnJydnJqbmpqampydnZ2bmpuboKKinpucnZycnJ2en6FhlqienpyampubpJ9NSYSgnZ6cm5qanZqam5yVkZOXm52dnJ2fnZycnJycnZ6fnp+cl5idn6GhoJ6cn6CfnJubm5qbmpmZmZmZl5WWlZaYl5eXlpaYmZuenp2dn6GhoJ+fnp6fn5+dn5+hoqKhoZ+fn5yZm5qcnZuampmXlpaYl5eXlpWTkpGTlJSTlJSUlJaZmJaVlZeZmJeYl5eXl5eYl5iXl5eXlpaYl5eVl5eDeHZfW11eUT1GOjk4P1VDQTtDQzo8Pz86Ojk3Ozg4ODc0ODk8Ozw4Ozs8PTo8Pjk/QT06PTw+PkA/PUBBPjk2PERDRUBBRUU9PkVERD9COzo8OTpkl5SVlZaUlJSUlJWXmJiamZqcnJydnp6dnZybo6Oko6CenJuamZqZmJiYmZiam5ubm6WJa3F2em9lmp+enp2dnJybnZ6dnJ2enp2dnJydm5ygoJuampubm5udm5mnbFqgoJuampudnK9uS0yGoZydnpybmp+fm5ydm5mZmZudnZ2dn52dn5+dnJydn5+fn5uanZ+goJ+dnJ6gnpubm5ubm5yampuamZudnJqZmJeYmJiYmp2foKCgoJ+hoaGgoJ+en5+fnp6foaKhoJ+enp+enJqam5ubmpqZlpaXmZmYmJiWlJOUlJWVk5OVlZSVlpWVlZSYmZuamZaWl5WWmJiWl5OUlJGRk4yRkJOWfXhqYWJiXFE8QDw2OENWSERCOjg7Oj47Nzc5Nj06OTk2NDc6Ozw9OTo6Oz87PT08QD47Oz46PT89PkBBP0A8NztBQ0U/P0REPj9EREM+Qj07PDs6Z5aTk5OTk5OTlJSVlpeWl5aWl5mbm5ybm5uamaOjoqCfnpuamJeYl5eXmJmYmZybm5qkgGpqb3lzcZegnp2dnJydnp6enp+enp2cnJydnp2bnJuampqam5ubmZmYpYRUdKKamZqdm6GhYFhOh6GcnJ2cm5qdn5ucnJubnJubnZ2dnJydnp2enZydnZ2cnJ2dm5uenp6dnZybnpubnJycnJydnJubmpmbmpmYmZmYmpmZmpyfn5+jpaKfoaKioaGfnqCgn5+fnqCioaChn5+fn52ZmpucnZqZmJWWl5aVlZaTkpOUk5STkJCSk5GUkY+OkJGOlZabmJWYlJmXlJiRjJCPk5yTkoyFjIeDhndxZ2pkXFxRQT44NkJHYEJFR0A+Ozw7Ojg4NjU8ODo4MzQ6Njk9PTk5Ojs9Ozw6PD48Oj5AOj5APjw/QD8+PDg6Q0FEPz5CRD8+Q0VCPUJAPDw8OmeYk5KSk5OSk5SVlJWXl5aWlZaXmZmZmpqampqkoqCfn52bmpmYmJiXl5iZmJmcnZ2cqH1nZXN7enOJop+enp2dnp6enZ2enZ6enp2dnZ6cm5ybmpubm5ycm5iYmaCLXWCRmpmbnZyjjmVaTICinp6dnZybm52bnJybnJ2dnZ2dnJ2dnp+fn52cnZ2dm5qbnJmZnJ2dnZ2dm5uanJ2dnJycnp2dnZybmZeVlZeXmJqam5ubnZ6foqOhoKGhnJucm5ubnZqcmZycn6CfnZiZmZmUkpKUl5SPj4+OkYyNiYuQi4mLjpGRj4mQmJiQkoyNi5KQj5iYoqiqpqWlrKOmoZqep6eyqKKVo6Cfl39wcWlsXFtbTEY8NzdHR1g+SE5URjk+Ojg5ODc1PTk4NzMzOTY6Pjw6Nzo8Ozo6Ojo8PDs/PjtAQD47PT5BPDw2N0A+QkA+QUY+PEFEQT1DQj49PDlmmJSTk5OTkpOUlZOVl5iYmJaXl5iZmZqampqaoqGfnp2cm5mYmJiYmJiYmZmZm5ybnKx/am16f3lxh6Genp2cnZ6enp6enp6dnp2dnZ6enJubnJubm5ubm5uZmJmemV5fc5WanJ2doYBlWk1/op6fnp2dnp6dnJydnJ2dnZ6fnZ2fn56goJ+enZ2dnZybnJ2em5qbm52enZ6dm5ubnJ2cnp2cnZqYl5SRjo+QkJGVmJSWlJiZmpudmJuYlY2Mjo6TkpKRj4mQjpGRjo+Ki42NjYiIi4+Lg42NkY+MkI2Qk5WVnJihoJySn6SipKmam5eanKOprb3Bwbq8uL26ucC8ubq3uru7tL2zwbV/bnVmZ1peWUxJRTo7TElTPFZSSUM6QTo7Ozc3NTo6OjgyNTY4Oz08OTk7Ozw5Nzo4Ojw6PT85PD8+PDw9QTs5NTg8O0A/QT9EPTxBQkA8REM9PT06YZOTkZCUlJOTk5OTlJeYlpeZmJmYmZqbmpqamp+gnp+fnJqZmpqampmYl5iZmZmZmZmphXB1e4B3b4mhnp6enp6fn56en56fn56dnp6fnp2dnJ2cm5ubm5ucmpiZmJthYmB8lJ6cnpZzY1VPgaGen5+enZ6hoJ6dnp2enZ6fn56en6CenZ6enJydnZ2cm5qYnJuVmJqamJiYmJmSjJCXlKCXk4+MjYqKiImMiJORh5CPjYqKkJCLjoqMi4+IiImJjpGOjYaFiYaKhoWLiI+SkJCNkJKXlpKamJ2TlJ6kpqaqq7Gsr6+rpquqsbm5tbS0rqyvtMDIxcXBvsbDxMTDurW+t7a0s7C2tb6qcHRyXGZfXl1JRj8/RUtMVklcTEQ/PUI6Qzk5Nzc7OTk3MTc5ODo+ODg6PDw7OTc5OTs9Oj4/OT5BPDs+PD46OTY5PDpBPkNBQT08QkBAPkJEPj8+OVyHhIOHi42KiYaFgYqMkZOVmJiHlZaWkpiampmenZ+gn52ampubm5ycm5iWmJiXl5ibqo56dXZ7f3mCoJ+fnp+goKCfn5+foKCfnp2dnp+enp2dnJqbm5ybm5uYmZigalxaYXubnJ6JaV5QVIiem56dnZycoaGfnZ6dnZ2dnp2dnJiWlpaYlZWSlpmWk5GKjI+PjI+NkIuLj4+WiYiEi5GZjn2Fi42PjYyHioyQm4yRj4+Lio6TjIyNjIiSi4yFiYyPhouIh42KhYyEj4qXkJOYmpWbnKOqoaKknKKrsbe0ubWxtK2vsrKlp7O6sbq6vLa3tsDDw729vLa/urq8wbW4wL60r66mqa+3mm58Z1tjWl1fSEU+QUtJU1hZXkFGOTk9OkY/Pzo3Ozs7NjM6Nzo5Pjg6Ojw9OTk4Ozk7PDo+PTtAQDs8QjxAOjg0Nzw7QkBBQj4+O0NEREBDQz0+PjlhmZWLkYWNj5aSiHl9e3+Fi4OKgoqJhmuAeJCLlpqRnZ2UlJGTlpeampiWk42Sk5KQm5uIdndzcX1/cpGgnZubm5yenZ2eoKGgm5uWlpucmpubnJuYmZqYmJmbmpqWknhza1h8lZieiltUUFmLko6SkY+Uk5KXm5mYm5ePjpCLjo2Ch4uLi4qLiI2RjIeHhoqIiZGKh4yEhYqNi4qNhI+UkIyDkJOUmZWQi5OTkZWRlpWOj5GMlI2Oj4qIj4ePhoeJiYmNiomJioWNh46JmJKUmpuXmKChp6Cko5qqqbO2sbWwqKqiqK6tn6qvsK21ubi8wr/BxLixtbCutrOwuL68ury+urOzp7G3wpB1gGNiXlpXUk1IRkVQSVlXX1tDUDpCQz1HRj84Nzo6NzU1OTc8OTw5ODo9Pjo6Nzs7Pjs7PTs9P0E7Pz48Pzo4NDM3OkFBQEI+PjpDREM/QUM7PT45Z6mloqKZn6CippeUiI2CiIJ1h4iKiIp7e3Z7enmPeoiSfn18en6CkYWBgH1zfH99fISHfnRweHZzfHaBj4iIiYeIioyMkZicl4iOhIuNi4iNkZCPi5GPi4yPkJGRjpWfn5KApKeZppp5VU9kh4eCjYuGiYp/iYqGiJiRiIOIg4KFfIuLjIaJi4iKkIyIi42PjI+Wh4mLio6NjY2Wk5OdnJyalpycm56bmpuYnpeTkZWWkJKRi4+LlpSMjYqDi4SEiYyQkIqOio2LipGJjZOTk5SVk5KcmZ6Xn6CfpaKvsamupKSfmKStpqa4t6ysu729wsPAv7+vpa2wsLS3uLO0uLa0ta6stK+4tLaBeXpjZmBeVlFRQUVMT0lcXl9UR0dCS0xCREA9ODg7OTU3Nzk3Ozc9PDk9Pj05Ozg6O0A8Oj06PkJBOD88Oj84NjQyOTtCQD9CPj04QEI/PkBEO0A+N2CloJqXnaGaoaCPl5efl5WCjaCfo6GdmpKOjIxycXBvdnFucG1ucHZub29waHBxcHR+c3FycXd7cnl2d3Jyd3Z6e3l8fXt/iIGEi3+PkYaNi4yGiouLiYeEgYaDgIWkmYt6Yo6jkphzhYVodX+AgpKQhoSEhY2DhIyPj4+IjY+Hi4iRkJWRjpCKk5eOj5WYp6SfnZWYlpaln5udq6aqt7W4srGnr6qnpqGfmp2WkpWVkYqPjImTjZuVjYuLhoaJjJWQkJCLmZKVlZSbkJiTlIyNkYyWl5WilZ6mqauno6OqsJucpp+mq6G0vb6zs7+5u7u6uby9rqiusa6wuLyztLGxqrCpqLGxsqild3J0X2hhYFRWUUlKSFZNXl5eVExKRVFKRUdDPTo5OTc0ODY5Mzg4PTo9PD47OTs4Ojs/PDw+OT9DPzg7Ojg8Nzc2Mzc5RT4/Qz89N0BAQT0/RDw+PThUj4yGh4eUjJWZl5yWmZaNlZyWlZydoKCdmpiWeHFubXJ4cXFsbnJwa3FvcG1yc3t1dnd5fnVxeHZ0d3tybn98gX15eH1/eYOGg4WCg5CLkIuLi46Pi4mJhYKCfn6Eood2alBxm42KV255e39+fIWOjYuGjZSRi5CXj5SXkpihlp6WlZunpp+goKawq6GjpbW0sqqmqq+isba5vcK7ucO+vLi9uLWxrLCsppuSk5mfm5SPk5WOmp2doJqfn5edo6qsoZ+em62hp6qwqaampJiRkZWUo6SirKSss7Szs6i3tru4sLKvra2yt7a6srW6s7e5u7i8urayr6yxsbKztLOxsa2us7Gzs6yhl3Zxc19jXlJRVE1PSUdYT1pcZFROR1VPRURKRD44Ojg3NTg4ODU5Nzo6PTw/Ojg8ODk5PTs9PTpCPj84Ozo5Ojk4NjI1N0I+P0RAQDY+P0I/PEM8PT46Tn98go6MjJOTl5eaj5SWjZaRkZSXk5qanqGdnHJvcnFxcXFxcG5zcW91dHJxdneAdXd8eYV+d3t8eX1/fICJiYmDfXp/h4GIiYGAgIGGiIKGi4eIhYSIiIqFgIJ9mZhyTkdJc5KDgEpcbm92iYWKjouNkJmclJSUoJqan6Ktsa6ppKWtr6ysrLWuvrmtrqm1sLexq7G2rK+9wsLAvrq8trKutraxtK66u7OurKepp6unoqmtoKmooq+wuLSxvLq6urK0ta+8tLezt7e7t7mtrbCprLW5sbeytLe2sLu7vLu6ury1vLi0wbWsqqqrtLG3uLm1trSzsKymrrCqq7Cxq6yusLKxtK6qo5N4dnJlZ1tMUlBFTUlTV1JlXmdUUExcUUhMUkNBOTk3OTU4ODY2Ozc5Ojs6Pjk4Ozo6Ojw8Pj08RD45Njs7ODg+OTUxNTZCRkREP0A3Pj5DPjpBP0BAO0t/gomXmJSdlpabmIuSlo6XkZGVl5SZl5+bmZx8dHV2dXl1c3RudnJzdHV2d319gH56gXyDfoJ/fYB/hIKFj52RiYF/go+Xjo6HgoCBiIuFfoqRi3+IjYyLi4eRj6OITDMyO3mEdXI/PVZqbYGQiYmQj42PlJSYkJWcmp2eqK6ysLC1tLOtsrW4sLy1tbGqsKqztbS7t7SztrS1r7i4t62noqassLCvtre3vrW5vLOysa61u7C0r6+yu7axuMC9tLS0s7izvLq2tLrAvbm6ubq+ubm5vrWysa+yr6q1tLGzsbSzrri4tb+vpKaoo6ussa+zrq6wsKytq6qroqKmqKKnrauqpaynoqeYeHlxZmVZT09NSVJNV01PX15cTlVVYlFEVE07Pzk8ODk1ODc1Nzk1Ojo6OTs4Ojw8Oj08Pj4/P0I9ODY6Ojk6QDs1MjY2QUZDQz4/Nz49Q0I5P0I/PjtLjpGTmJmVmZGTopiTkpKLk4uOkI+Vl5ablZSbhoJ9enh2dHRzdH53end2gIKDhouMhISFioaQiYeRk5aRjZaalY+IjI+emJaVkpCTl5qamZCeoZ2Tl5uhmp2boqebX0VkTj15d2dkSDU2VG5xj4+LmJqPj4yUmpecnZugnaSstLm6vK+2tLi0tLK3uLmzq6+qqKy1srK1rrGrrqa3s7OxpaGotbCvrayrtbqyu7q6tLK3ur67ubG4sLmtqLK4u66ttLS3tbu2trm5vLe0r7G0t7a5s7e1pq2pq6ior6yprq2up6KxtLG0q6aop6Cjq66oqq6orLKwr6+pqKGeoaGjpqOgopqlo56ol3J3bmdiVUpUT09KRFBLX2JYWlFcVGBNSFJJQUA5Ojg2Njc3NTg5NDs5Ozk8Nzs+Ojg8PD0/QkBBPTs2OTk5Oj87NjM3OD5GQkJAQjk+PUBDPkBGQj44R5OWkZWTkpSQkZ+ZnZmVkI+Sko6Mk5aWko6RlZGSkIaBeXJzdXuBhI6HhZGTkpicnJiVkJWYo5yaoaeqqZ+clpeVnaKioZyZnpmlqKyvramnqqqpp6KlqKmrqamujEuCtoZAe3toY1JfcVFbb4qhoaSem5qkp6Spq66spaSoq6+xtK6qrK6zr6ystLO0ua6urayqrLKwsK2wqKqmsrS0uK6qtrqwr6qurLC3s7i0t7W0u7y4tbWxtauyrKiys7uvrbGytLa1sbG0s7OvrKuvs7a0sayutKqqpqWnrauoqKupqqifqbOwqqeppaOio7CtqaatpairrayppaSioKWipaOYmZyVnqKippdudWVnZFdPWUtLSktTVHBiWWRXX1tcUlpQTEM8ODk6Njk4NzQ3NzQ4Ojw6PDg6PTk3PDw7PkM/QT47OTo5Ojs+PTg0NThBREVEQkM5PjtAPkI/R0Q+N0KSm5SVlZaVj46Wl5qZlZGKk5SSjo+SkYqKiY2Ul5qTjYmCho6VkZSfmpuin5+jnqGhn5ijpKelpaapqa2rqaKmpKilpKGfnqOjra2srairrq6rq6ykoaKmqaeoonRoxdKoSYCVjH1PbIp7WmCAo6inoKKhrqyrqqetrqilpKmpqqmmo6iqqaekp66wr7Ovq7Crqq+yr7Czua+rqLCxrrCyubO0r62vtbCss7GurLW1tLSzs7CvrKyqrKusr7G0s7CwrrCwsKyqrauqq6alrrCysKumqbCvqaOkqaunqKaopquwq6mvqaaoqaalo6iwraqpqKKpo6WnpKGhoKKloZ2el5aYlJugpKmUbnNeamlfVlpOUk5RT1NlXGVjW11ZXFBZT0tAPDs5Ojc6ODczNTMzODo9OTo4OTo5Oj08PEBEPkA9OTo8PDw+Oz45NTo8QkFFQUNBOT47P0BEQENCQDdAkZ6YlJeZlpGHi5SSl5GIg4mLk4+OkI2Hh4SFlZmWmJeZlpqeop2ZnKKkoaCdn5qfoKGgpqGgoKCjo6KlqKmrramqpqOmpaCloKaop6aoqaepqaSnp5mdpKWjop5igri/qoWvo5qdd0dXgXJSc5SioqChn6GhqKCcn6GloaCmo6KfpKGspp6foaGkrKqnrKivq6e0sa6ur7WyrKqwq6mtrbWwrq6srreup6yqpKivsq+sq7Kvqqqpq6utqa6urrGxraqtqaunp6uoqauinaapqKilqKisqKilpKWop6iopqmsr6+oq6mhoqKlo6Opq6ymqKWjqKKhoKSdnZ+hoZ2bnZ+amZWcnKOqlG9zZm5yZF1dUFVPWE9eZWRsaGJiWlpSVE9NQTo9Ojo4Ozk1MTYzMjg4Ozk5OTk7OTk8Oz0/Qz5APTk7Ojs8QD0+PDk5PEFBRUFGQTo9Oz9BQUJBRUI4PYqWlJOYmpaPiISNjpGSjIiIiI+JiZCRjoqKiJubmZygpaKlnqKjoZqeoZyanZ6bnKOop6ugoKOYoJ2XnKGjo6WjoqKkrKilqaCepqmnq6mkoKKhoqehpq6mppyeb4KUs4i21qacuLFiULSjVmSQoZ6goJ6doKOZlpqYo6KipJ+ZnKGhoqCbmp6goaSgnaejqrGorqusqaSqqquorKalrKqws6+rq6mwq6appaWoq6ynpqevq6Wnq6upq6irqqqrrailqKOmpaesqayoopykoaOmo6qpqKano6SnqKanqKepqKupoaKoo5yepqWjqKino6WlpqmgpJ6inpeYnZ+doqKlnpiUlZ6go5d1d2t2eGJfXFVZUVVXW2Nfc19oX2NTUVlUSD48PTg7OTo4NTM3MzM0Nzo4OT05Ozo5PDxBQEM9PT44Ozw9PEA/Qj86ODo+P0NAREE6Oz49QD9DQ0VDOTyCmJmenZ2alZKKiZGRl5GQh4SJgoGNj4+Sj42cnZ+hpKmlqaeorK2moqKfmKSmo6Stsa6yp6asm56em5qjp6Cfo5+foq+rq6yoqKuvqaiqqKKgoaiqrbGyr6ujo4l3f3V407upk56obFWhqmhfh6egpaKhnZ+imJWem5+fpKGblZigoZ2enJudnZuZmZWen6Oonp2iqKGaoaOmoqSoqaqoq7CxqKWlp6eopKWpqaqnoqWmqKadnqWloqClpaOlpqCjpaOjpaelqamqpKekpqKmp6SrqaenpKGlqKynpqWlo6OopJWdo5+bnaCjqaeopqGjo6mooKiioJyVkZqfn6GmopuXkpCamqCVfHdvfXlmW1tgX1pcVVxoZG9jbWlpYl5QUEA/Ozo4OTg8OzYzNDMzMzc5OTs8OTs7OT49QkBAPTs9ODw9QD08PENBPjo4PT9EP0M+Ojk/PEI/P0FEQjk6gJ6kp6Gem5+gmY+ZnaCWloqGj4iEi4qTl5SRo6Wnqq6trLOys7S4t62pqqevtLKxqq6usbKusa2lq7OssbGpq6+rq6y2sLSwq7GysaOgo6qqp6+3t7W0trKssK2QiH9smMfEl5yqknZaaXN1dX+SpamnpKCfo5udoZqWnqScm5aZoqefoJ+joJuUlpmWl5qfoJmVnqGZmJ2dpZ2gpKeqqaiqraylqaSlqqeqqaqsp6SkpKOimZmhnpqaoaCfpaWYnqSmpKqooqelpaGqp6mnp6ejqKWmpaGkqKesoqekoaalpaOVl52Ym5mVo6elpaSfnZ2lo6Kqo5+amZiXnJyaoaGakJOTl5ibjX93cnZ4amJbX19cYllgZG5ta25hX2RgUE9BQDs7OTs4Ojk2MTQzNjQ3Nzc6PTo8Ozk9PUI/Pj89PDo/OTo7PD5CRUA9OTtAQT5DPDs5PzlAQEBAQkM7OXuao6OcoJ2dop2Zn6KioJibmJaYkpSQm5qWl7S0rrW4s7S4tre0uLm3tbm4ub28uKqLnLK4vLS9urW7uru4s7q/uLe5u7G3r6iusq2inaCqsre7vLy6usK5tLOdhHReUZ2wr6SikYR3bnNxd3h5fIKJjpSZoKWnrKalmKGko52goaKooaOgpaGck5mYmJmco56cmpudl5uZlqWam5+hqKmpqKuvr66pqKirrKytq6irp6WjoJyfo6Ojn6Cipammmpyip6Spn6GjoqKgpaanpqSooJ+ipKGjoqiop6OloaGopqalo5mbmJuTj6GknqKfmJiVoJuhpaCfm5udnJuamZugmo2YmZiTkYaAdnh4eGNbUllUX19hbWh2a3BoaWliWlNMQDw6Ozg5Nzk3NTU2Mjg1Njc3Ojw7Ozs7QD4/QD0+Pjk6PDk2Nz47QkZCPDg7P0NDRDw+OT43PkFCP0ZDOzhwkpqblJ6bm52Vl52doqajopaXnpaXl6GblJi+t7G4uba3t7i7l5S2vbu9vcDFtaK7mKC3v7+6wcm0nbu2sra/xcGooLa0urGqrrSxsLK0tbjDydDU0czHvK+hjG1jUkODjX5+gHl1b21kZGlnanFycXFxcnmJqcfHvKKnqqynq6mlpqCnoKGmoZOWmJ2foqSjnZ6coaChnZekmpmdoKaqqqqtrq2tsLGrrK2sqamrrqimpaalpqSkpqaeo6eppKGcoKKjpqCio5+jpJ2foqWgpJyboZ6fo6GhpaSlqaOkpaKkp6ehn52elpOcoJiZko+MjJeWn5uWnJqdnJqSlpSUmJOQmp2YiouHgIB8gnhhXllTYWlgZnRvdGl0ZGlkYltMSz46OTg5ODg5NzM0NTI1NDY2OTw8Oz08P0E/QEA9Pj44OTs4Njc/OUJFQzw7PD5DREM9QDs9Nz1DQ0BFQjw3Z4yRk4qalZiblZWYm6Knq6aVl5iQlZmhnpeXvrWztLu6ubi5woeYt6u4u8DCxbOjw6e4s72/tMTHvbS7uL62wMTErqCworW2tb2+wcTHw8TH2+Tj18e5raKUhG9XWFBEYXJna3JraGNlWFdcV1tgaGlnZGBskrrAv7mpr7Gwr6yqoqajrJ+fpquXmqifpaWfoJydoKuwsKyiq5yYm6Cor7Kys6uorre1sq2tqaalqKulpaStqaShn6Cnnp6mqKmmnp+anqGlpqmcnaObl6KmmpuanZ+cmqGcmZ2eoKijn6GfnaWioKOioZSZmpmTj4qLhI2Qk5uPjpiVm5eYkJORkomNl5iYk4uKi32AgIVwYGJfXmtjYm54dXdubVtiUlZcTUc7PDk3OTc5Ojc0NDQxNDM3Njg8Ozs8PEBAPUA/Pj8+Ojo5Ojc6Pz5FRUU8PT1AQkJCQUE7PDhAQ0NARD87NV+MjIaFlouUlZeYl5ifpqellpWVkZebn5ual7mxtrO5vLy5urWqsryxvsG0vMe5uLuuv6fGw7/KxsnIxcXJvMLHx7+xsKe8vL7FxMbJx8XGvsvP1Mu5pZiPgm5aUFRKQ1xmXWFoZGFhaVxUWFVXWFlbWF99obi5q7SyrbOtqa6vp6awr7Ktqq+zpKu1qaeopKCgnqmyuL61tbWqqaausre4t7apq7i8ubexr66noqOop6SfqKOfnqCZoZydoqSnp6GelJuaoKGlnqChnpajnZSQlpiboZqflpORlpSin5qenJudoZ6kn56VnJiPkpOPjImTkJefiZCWkZuUmJGRlZaDjJWXlpKLjIh8f4R/amZoYWtsZ251cnJ1cmdeYFxSSUU/Ojo6Nzg0ODw3NjU0MjMzNjU3PDo7PDs9QD4/QD48PTk5OTs6PDw+QkRFPj49QENDQkREOzo4QUJCQUNAOTJbk4iEjZGKi5GRlZCSmp2fnJOSmJSdnZqXmpW2sbm1tb6+tri1uLO8vMTEusPHwb+0s8XFxr/CzcfLzsvLx8HDxsfIysXExcO7vLzBxcHFxL7DwcfLybqXdF9STk9SRz1ebGBfZWNhXmRjVFVXVlRVXX+nrq+qqKutrKmlpZ6pr6uyu7q4u7e5t7O5uLOurLO0qrC1ub3Bur6+vL60urm4u7qysbS8u7q7s7Oyp6Smq6uioaCdmpudmpyXmpuenJygnZaclpuZnZ6io52UnJCNiY6OkZ6bnJWNh5KLmJiWmpybmJybnp6cmp6UjpiYmpSRmZeeoZWYmpKXlJWRlJqYk4+TnZaSi5F+enx/dWtsbmRvbWlxeG95amlhXWdhUUZEQTw5OTc2NDQ6ODQ2NTMzMjY1Nj05OTs7PT47Pj49Oz05OTs7Oz89QUNBQkFAPEBDQ0NFQjs4OUQ/P0BCPzsyV5uQkZCQh4WSjo2IjZCTlZGPjZSUm5STlpqRs7e4uLi+u7C1sri2tbbAw8G+w8LAvru+u7u8xMzEzNDLxsa/xcfLyNTLysjGv7u7vsS+xcjGxsTEw7m3xKNqTENFSkQ9WWFhZGxkYVxlX1lTUFBVYYu3uayupaSjp6SgoKWZqbSxvsG+urm6uLW0srG0tLO6wL7Av769u7u9vsDCt7a3tru7sru+ubi3u7a3tKyoqamrpqijnpOampyYkZKZl5GRmJqXnpiWk5acm5+dlJOJiX6GiIyWlJiZkYmVkZeWlZmbmpaYl5idnpyhmJWZmZyYl5ybn56jnJ6WmJeTl5yZmZyUlp2UlpOJdnl6e3dua2lodlpncnhzemdnXmRbUlhJRj87Nzg4NzYxNjk3NDQzMzM2NDY7ODo8Oz08OD0+PDo7PDs9Ozs+PkRBQURCQEBBQkNDREM9OTlCQD8/QD89MkyWmpaSk4yKmJCKi4yOkpKKiIaNkJiKj5CUl7O7tba/vb2xtrjBvby0uL/Bsbi3vsHFvbu8wsbJv8jOyMHEwcfKysbKxczIzcbIxb/DwMvNz8rGxMTEwsTBs5BWSE1GO0lYX2htaF9cX1laVFBdjaqsuLWyrKmjoa2prKetn6y0tL/Cvrm4vbawrausr7W0ur7Fv7u8urO5u7i5ubWtsLS9u7G/vLiytrmzubu0ra2orKyqqaeXnpualY2MmJSTi5WWlJyZl5WWmZKYn5mQiop+iYqKkY6Vl5OUn5mWkJSZmJmWmJOUm6GeoZiYmp2ZmZaenpibopqdnJuYmpuZlpeXlpyZlJyYfoB4eXZ1ZWZqamhea29ueXhjYmFgXlhXRkU4Ojg6OTc5NDQ5NzY2NTEyMzM0Ozo9Pzs9PTo6PTs8Pjo7Pz48QkBDQkJFQj0/Q0NDQ0RFQDk6QkFBQj5CQTVCkJeUlZmSj5qQjpKRjZSVi4qHjI2UiImPkpq2u7S8xsHEwr3BxcLAtLO9v6ywr7rDysPCvs3IxbfByMW/wcLIy8rCwsTJzM3Oz8zDx8bIycjIycfFycfIx8LIo3dgSD8/QV5dXGtkW1hWUl2IqLq+ury6vKytpqm7urm3v7O1uLLBxrq3t8Gzsa2tqau1s7u2w7a2vbWxt762s7e4sLW2v7uwvbq0q7CxsbO8urOzrqutq62xnaOjoJqQjpiXlZCclpaYlpWSnJmTm5+clpGUjpWQiYyQlZOUm56YmZKSnJedlJmSk5aZmJ2VnJ6do5yVnZ+TnKKcnKCfnaOemJSVl5ebmpmgkH99cXRxb2NhaHZoamp0bnlsXmRbVWBZTEhDNjw5OTg4OjUzOjY2NDQxMzUyNTs6PD47Ozw9PDs8PTw7PD49P0E/RUFCQ0M+QEFARUVERUE7Nz5DQkI+Q0I4O4+akZaalJKUjZCUlI6VlI6Pi4yJk4uIkJObt8C6xsXEw8zCwcS9vrWvt7uvr7O6wMfFxMHMy8W2ucDCwsTHytHLwsPExsnFzNDNx8zJwsLHwsvLyMfMyc3GxsfCtYFdVC9VWV1sX1FNV4S5ysfCxMbAvL60sLCwwr6+wcbAvre2w8K6urbAvrWyrKmvsri+tMC0tLi0t7nEua+8vrm+v8K/tbq2q6qsrq+wt768trSura2utaSlqKimmpycnZyeopydmZOQkp2VmKCdmJiVmZmZl46LlH2QkJefmZmYk5GToI6Nko+VjpCUlaKdnKSem56elpyjoKGipKOkop6amZubnJ2enIN9cn14cGdga2p3bWlmdm90Y11jVVdVU01HOjc7OTk3Nzo3NDg3ODQ1MjM0MjU7Ojk+Oj08Pz04Oz05OTk9PEBBQEVCQUJBQT9AP0RFREVAPDk+QkNCQENBOjSAoZeUmZiVkImUk5aTiZGMlJGOiJaKi5CXnMXLw8O8wMPHwbm9vbu4tre3rrK3uLzAwsDCx8bHurzAwsTHyMbSycHDw7+/vsTLyMrLyby8yMfJzcjDyMnJxcXBwsLFxpxOUoCJlVVUg7XO0sW2v7/Av7q7vbWzs8C/ub/DucC3u8G8uri7ub27srCvsKy5wri9ube1t7q9xb24xsjCwcLGwr28tamurrCwr7O6t7m2sK+tr7OppquprqannqSlo6OjoqCblZiekZecl5GRlZeZlZmRlJiSlYyYo5qcnp2FiZ+TfJKWlZKUlJennaCipJ+en56foaGkoqKjoaOinJ2fnqOhppl5enmAc3BmZWdkbGVia25vb19ZXVdWTlBKRjk5Ozk3Njc3NjM3ODk1NjEzNTI3PDs8QDs/PDw6ODo8OTk4Pj1APz9GP0JBQz89QT5ARENDQTw5PENBQ0RBQDozbKKdlZedlo+PmJiZmIiSjZGVkI+Vjo6TlpbKy7u5urnBu7q3vsG8vLu5sa61uri4u8S6vsC+vru8wMXBxsK+xsK5u8O6uLm8vsHHwca7ucjIw8XEwMPBwcDEwcK+vMWnfHSAkZR1vM7Hx9DAr729uLm7u763tLC5vrO8vrG5tbi7tryztbm2uba5t7GtusG6vMG/t77Ev8bDw8fHwrvAwr/Cv7iys7O1tLGut7S3tbSxrK2xp6Wlp7CtqJ+nq6ajqKWmpqCgn5SYmZSRkZWUl5OYl5qhnZ6hnKGdoaWglpSbkZeXmJqTnpmZqaSlpKWdoqCanqCkoqOcoqGjoJ6cnp6ppaiVfXuDeG5mYWViYWNkZGpjZ2NbWlpdWVFPRT07OTo7Nzc5OTY0OTk6NTMxNDUyNzo7OkA9Pzw8OTc3Ozo5Ojw+QD8+RDxCQURAPz49QkRCQkI+OjlCP0FCPT44NVmfnJiTmZaRlZiYmpeQkZCQk5GTlJKSkpSUxce4tbq5wrm5vMPFwri7ubGxtry6tbnAu7u5tre0tLW/u72/ub66urTAuLW3sq66u7fAt7zJz8C6v8C8u8W9usDEv72+sXNhgJGJis/Ev8DJvrDBv7q3u765tbi0uLy0vbi1tLCzvLG3tri/tr25vb65t7q+u7/Axb29y8PGw8TAw762ubq2v7i7v7y4trOyq7CwsrWzs66sq6emnqeurauiqKumpqqjp6iqo5+Ym52bmpicnJiXnJuhpZ2anqGhoKGmoJqbnJiboJ+dnJ+coKiho6SknaKfmqKgop+el6Shop+dmpieqKWhi3x5iH1xZGFiY2dqZ2dqZmpeVlZUWU9TTEY4PzY7Ojc3OTs2NTo7PDYzMTM0MTc7OTg/PT47PDs3Njk5ODo7PUA/PkA9PT9CPjxAQUNDQT9DPTo2PEBBQDw9ODdJlJibj5OUkZWYlZGWkpWRkJGUlZSTk5OYlcHCwLq8ub62uL7EwMKxvbqytLO4vLW3vMC8vbS0sbC1t7W7wbi+ub+8vLe0t6+ut7W5v7vB1Iy4v7vDtbrHtrW4ury4ubaztp6NdITJv7+7wb65xr3Cv7zFuLa3tLi2tru7uLa0t7q1s7i8vbm/ucPAwLu5vLu+vcjEvcfEw7rAvb62sra4srm0usLCureysaysq62yr7Kur6ijpJ6rrKyqpKakpKiqoqemraihoaGmn6Oiop6bnKKfoKOdnJuhn6KgpKCem5eZn6GdnZ6eoaWkoaKioZ6ho5yinqCZnZijn52eoJqZoKKmnYR6g4F5cW1lZWZwamVsaFlZT0tLS1JKTEhEOT44PTs2Ojs5Njc8ODk4NjA0MzE3OTk7Pz0+Ojw6ODg5PDg6Ozs7PD1BPj09Q0E8P0NDREA/Pzw6Nz5CREE/QDg4P4mYmoyMkI+Tl5WMkpCakpGXmJaUlJKQmZTDvsbBwby8uLi6v7a8scK2tLyxtLa4s7q9v768sq2vrLGwt7y3u73BxLm3t7a1ubm6u7+8z8N2qMy9x7e5t622tLe5s7Wxu8bHlkJ8yr6/vr28v8jDxcW+xri1srK9uLi4vrq6uby6urS3u7q5v7zEwL+5uri/ubvFxr3Fw8Kyur27sa+2uLO3s7q+wLm2rLGrrqmqqa2qqq6mpKWnrq2ppaOio6GkpaWmoqato6Klo5+ho6Gcmpyhn6CloaCenZygnaWgnpeVmZ2fn52gn6KmpaCknpybn6Ofn5mcmZ2epJyWnKOcnqGcppZ+f4Z8a25xZ3FrdGZjbmBcVUhLS0RKQ0NHPzo7OD48Nzs7OTc4Ozc8PDYyNzUxNjk8PD08QTs8Ojs6OT45Ojs9PUA+RD89PkRAPz9BRkQ/Pzw9OTc/QUNCQEI5Ojl3nJiLh4uQkpOWjY+TmpOQnZiSkY2PjpiSvbfHvsO+vbu+vL22uri9ure9s7OwuLi1uby7wLeqraSusLi7sr2+u8S2tbi1t7++xLzCxNetc4C7yM/CwLiutLS7vbe5sL3DyIxGds3Dwr++vbzHzMfHxMe9tbW2wb27u7/CusDCv7y2t729vcHBwL+8ube8wru3v8W7wr++tbe8vK+vt7awtLO6ubq7r6mtq62rrKaqoqeuqKWqra2vp6Sgn6ajnqKjqKOjq6Oiop6dm5ublJaZnJyfpZ6fnpmYnpejoJyXmZqZmqOjop6jo6egpqCbnaCjnp2WoJmcoKCblJegn6WcmKKQgYaAcmZsam51b3hjaGNcY1FLVUhFRUNHQzw7OTg9Ojc6PTo4OTs3PD01MzY1MDY4OTo8O0A9PDo+PDk+OTk9Pjs/PkM8Pz5APz4/P0ZEQEE/Pjo3P0BDQz9APTo4ZqGYj4uNlZKVlY6PlpmVl5uVjoyMjY+bk7m2wbS/vLm8w8C+wLq1trKywLmvsry8sLe7tru8qqqjsLm9vLK8vrzFuLG4ubzGycrCxsnRmHBzrNHRzMrEtbq/xMi+vrS/wL93U2/LxsK+wby/w8zKx8XGwLm9vMS/v7/CyL3Hx8XFvLrEv7vBv7rAvLu7wMS9t7nCub69t7S2uLqur7WxsLCytre0t6yurKqsrKuoq6Gms6qlra+trKippaOkp5+io6Onoaeiop6cnZyamYyQlpeZnaKZnpuVkp2UoaCdmZ6fmJimpqKfoqKmoqeloqCko6GbnaCbnKKfl5WVnp6kmpafiYGDgXRwbWx0bGxuX2NfYmJOSE4/RUA/REM7Ozo6Ozo4Ozw6OTw+Ojo+NDQ1NTE5OTo5PDtAPD89PTw4PDs6PDs7Pz5DPkI+QD89Pz9FRUJBQj87Nj9CRUQ9QUE6OlmfmJOSlZqVmpOQlpeclZuZlpSVkZKTnZm2uLaxuru6vsG5uca7trWypb69tLbBv66zvbS4wbGwsbS7xdDCur68xL63vMC/yc/HyMrJwYZxc6XMzMvNysbCw8vOwby4vbqwb2Rju8jEwMC/xMDKycPDxMO5w769ub+8wsbCyc7Hxr66xr26v7m3wLm5vsDCvrW0vLi2u7CvsrK1r7Cvrqyus7CzsrirsbKxqrCrq6yrrLatqKyusqarrKmpoaWgpaakrKSmoaChnqGgnaCMlJeTm5+mmZ6emZOYnZ+gnp2eopuYp62ooqSgoKKqpqmhqKGlm6CgnZ2jn5SYmKKdp6Gfm4J7eoh7bW14fGBxY1tfYF9UST5DRUlCQz5DOz42OTo7Ozs7Ozs7PT05PTU2NjIxODo5Ozs6QTs/PDw+Nzs8Ozw9PTw9Pz5BQUE/P0FCQUVDQkRAPDY+Q0RFPkJEPztTmZuZmJ6dmqCalpyZn5KdlZ2boJWWlJqYur20sLu8wcTCv8XGura5sqO7vbS3xLuwtbq2ucS4tLy3u7ur2sO+tr7Avr66ppypsrbDv6V4dXibxMbLyMHDwMDJysG/u7mxoH5zbK3IxcS/wMG/y8fDwMjAusK7urO6usG+wMrOysS9tby8ub+5ubW1s7/Avre0s7W4rbeqr7CwsrGvq6+nr7ausrG5rra2uLSzsLGttrS6sa6srranrLKsraSjoaenqLKrqqWkp6elpaCml5ujn6SmraKeo6KanaWiop+foaWenrC0sKSlnp+kqaevp6mgq6CiopqipJ2anqGmp6+psZWCe32Bem5zeHRocF5cX11aUkZFRE1JQUQ9SDs7NTk7Ojw8Ojs7Oz0/Oj01NDUxMjc4ODs8O0I8Pz46OzY6PTo7Pj0/QD87QUFBPj4/QkBBQkJFPjo1OkFCST9AQkA7TJqdnZ6fnZienZmampySoJWbnp+blZGRl8W+urbDvMbCvr/Ixbe1uLe2ubu0r7e3srWzt7m8u7a7u8S3ba3Ovba5wLysfW5obm1ygZWYcnd8l72/xsC5wLy+xcS9vbixsJmPfoKcysLDvL2/v8PDv7/HvLy/tLSutbW8vr/OzcvCt7K4t7e9ubuxtrLIwLu2tLGxt6yzqbCtrbS3r6uuqrG1r7Gvt7O6usC/tre2sru6wLWyrbO3rLC6r7KloqWrrK+5s7KosK+xr6qiqKGkraitrLOun6inpqWmq6Sknqaqo6ayuLOrpZyfp6anrquqpbClpaWbpKOYn6exrLW4sLKOhHl/fHdtdXtwb2pcYGFaU1FBRklHS0BFQ0k8PTY7OTk8Ozo6Ozo9Pzw9NTU2MTM2OTg8QT5AOz1AOzs5PD04Oj08QD46Oj49Pj09PkBCQkJBRD03NDU9REc9Q0I/PEWUnqCgoJyXmpiYlZmdmZ2fm52bnJaRj5LDwMK9wrzEvLy7xbu3s7e2tru7s6CWtayvsbS0tLa4ucDNsnWBs722tcKlh2laXmBNUltabnN2gZ+4uMK6s7u3u72/uru7r6Sal4iSfsDEw768v7u7uLbBwrW/urWur62wvcC5z8rJw7GwtbS0vbq+urq7ysO7uravsL2xuK+ys7C3vbaur66wt7CsrLK2vbzEwrq9t7bAv8G3tbC2srGzurGxr6err6u2v7e1qbqztbmxp6uop7ausrG1uaisrK+qr7CqqKessayytry0saykqKuoqKusq6i2qaaonqadmKOuvLG7wbSmiYF7gnpzdnZ3bnJhX2ZdW1VKPT8/R0c9R0NDOTo1Ozk5Pjw8OTo8Pj4+Pjg4MzE1Nzg5Pj9BPzs6Pz08Oz09OTs8OTs6Nzs+PT1DQT8/QUJEQkE8ODU4PUNGPUREPzw/iZ2en52Xl5WUk5aZnpubmpuYlJ2Uio6Owb7Dwr6+vrm2usCxtbGzt7fCtbOrrbOoqa61r620trnCyaeEeIqgr7WdamVnVllgSUlNUFNsdoalsLe+ubK1sru5vLa5vrSVnKaXoXKuycTAvb+5s66yvLquu7Szpquorbq+uMvCv76sq7Cvs7q3ub67wMXBu7y3sLXEtb+0uLu0u8PCs7a2sbisqaWrsr23v7+7u7exvL28trGvq6uprbOvsLCrsLSpuMC2sqm0tbC3tq2spqu7s660uMKwsbG1sbK1saywsri4ubi+tLGzrqyxramvrqqyuK6trainoZ6ptr+4ur+wlol9gHxxdHd0d3JsX2NhXF5PSUI/PUlERk1EQDc3NTs6OT48PDk4PT47PT86ODMyNTc2OD8/Qj86OD4+PTw5PDk7Ozo8Ozs6PEA+QkI9QEE/QkI/PDs3OjxBRD5CQz8+QYqgm6GdlJiVlZKYmpyWm5WalY2bj4SIhru0vb+7vLm3s7y8rLOytLS2wLXAr7Kzqqqxt62pubO3v8WqiHx1jKCYYFRDWFVHYWpWT0VKYI2grK+2urW0sqy8ubi1uMG9ipewoaZzpcvCv7m6ta6lrLOxprCtqJ2gn6WttrXCt7a0paiqqLC2s7K6tbu7u7W4trC2xLK+vL+8ubrFybq9vraxp6SeoamxrrW5trKxq7S2trGopp6gmaWmpKynq6y2qa+6sa2kpq2lq7GrrKmtuLawsrjBtrGxtbGvu7ayt7W1sry1urKwsbKutLKqrq2nuLWyta2uqqiosrq9wLa0qY6Ce393cHxvdnNuY15nWV1eU09OQT9KQ0FLSkA2NjU7Nzg+Ojs4Nz4+PDs/OjkzMjc1NzU8PD48PDg+Pjw8OTk5Ozs7Pjs7OTw+P0E9PEJAPz9CQD47Njc6QERBQ0E/QUKJoJ2loJSWmJiVnqCcl5uYmpGMmYmDhoS1r7S7u7S1sLG2uq6wtLOvtbq1urC1s7KttrqvrbyzuLi+tJCCeIiPb05KP2RZQk53gJRqTkBcga+1s7WytK+su7q4trm/xXWBqZ2aZKe/uLWysa2tn6Smp52kpZyWmZmZn6muuayrq5+lqKSrrq+nsKuvsbGtsa6usLmwtLy+uLm4x8W8vLu4qaKcmJufp6assq6zqaapqq6popqXl5GcmpijnqKir6ekrKaompqemqGnp6anqa+2squ0trCqsK+xqbm2sbWxrqy3s7avrquuq7S1ra+rq7GtsbKoraurs7W3ur2wq6GLeoJ5cndzbXVqbF1ca1ReXFBOSERHTUJHTkc4NjY1OjU6Pjg7OTc8PTo7PTo5MjM2Nzc3Pjs9Pjo6Pz48PDw6Ojs5Oz47PTk8Pj1CPDtAP0A/QT8+OjU1OkBFQkRBQEJBiJ+ipqGYm56dmqWpmJudmpmUjJmHhoeGrq2uuLmxsqiur7iyq7CwqrK1ubm+tbK4tLm6trm7tbWzt7aVjIiEe1hGQU6HWUpKWHeNgWNAU6O5s7SysLGtsLm4tru3uryPobGrpHOrsKmrraujqKCdnp6Xl6CVkpaXj5ifqK6ko6Sgoqaio6mpoaanpaqtp6ynqKesq6yyu7SztLm6trK2ramgmpaWm52fq6yqr6Oko6GpoJuTjo+QlJKSmZaanaSloJ+ep5iVkpSZnqSjoaWqrK2iqaqppKmtrqW0sa6xraqprq+wraWmqqSos66trKmmpqmrpqqnq7Ksr7Oxq6mWgX+Bd3J5aHV0b2VVYWRXXVJPTUlASVJETkM9ODg3NTo3PD46Ozw4OTw7Ozw7ODI0ODk3ODs7PDs4PD0+Oz08Ojk8Ojs9PTw6OkA9PDw7QD5CQEE/Pjk1ODs8RkFDRD9BQYijpqKjnqCfp6Coqpufm5yZmI6Xi42PjKqpqLGvsK2lp6ayr6mmq6CvsLu1vby4wMG+vLy8ua6sr7K8qpmZlWhOQFJ4cFBJSUtnnIBZRFKuu7Gss6+urK22trK0ta6opp6am52fpqieoKipn6GnlpqWl46dk46Qlo2Xm6SooKCioqGlpZyjo6CepaCkrKWmqKSio6OrrLOuqa6urqeqraisoZyamJmYm6qoq6ufpqKbo5yVkIyPkJCTkJeVlpifnp6amaaXk4+Slp2ioKWipqSnoKKko6Ghq6uksq2qrKyno6yuraufoaKkpK+srKmmo6KqpKqppKmrpqmsq6ahiHiDfHZ/emN3bW5dUWlVUE9HUE1NQ1BSQD47PjQ5OjU7OT07Ojk9OTk8Ozw8OzkzNjk5Njo7Pz06ODs6Pjw6PDs5Oz07PDw9PjxAPT88ODtAQEE/Pz45NDk8N0FDQkQ9QEOOqqSjoqGinaqlpqimoZ6dmZ2PmJWTkJWnpKGmqKmlpKChp6uhnKKbp6u1sry9wMLCwL7AuLSnpKyovcKrpb1oRVKdglFXSUpgSlSNYGNiga61qrK0rqqrr7Cys62lnZGXk4+XoJ+ioJyjpJ+eqJSalZaLlpGNj5eSmJ2iqp+fn6Cjpaicn6ChnKGfo6innKehoKSfrKisrKCpq6agpKimrKOenp6al5qrpqqxo6WonqCclpOPj5KRmZCWlZiXn5icmZukmZeUlZqdoJ2nqKWgo6Kho56doKmqpa6upqipoaKqrqqnoaCio6msq6eppqShqaKlqaalpKKmpKijkn58gHV2fW5re2RpVlJkTklIR09TTktOSDxFQD0yQDg1OTs+Ozk5Ozg6PDs7Ozk5NDg7ODc7Oz48Ojk8Oj07Ozw9OTw8PD49PUE+QEJAPTc6P0FCQEA/ODU1PDpAQ0BEPkFGlq6koqWeo6KpqKipqqWmnp2imJiZmZWbop6bnqOioKOgoZqgmJeXlqGorK62trq5ure3u66ooKGpoKrGv8ugUEFznXdQbktLY2Z0c19aXnCQsa+us7Wqpqyso5uZlI2RlZeYmJyfoqKcnaSemqSWl5eVj5GRkZKal5ugpKqeoaGepqerop+gp5+dn6OmqJ6jpp+qnaqtqq6nqLClo6Smp6ymoqWimpmer6iusqumq6qgm5iYmJWTlpqTlZaalpuXmJihnpyclpuhm56ao6eln6GioqOdm6Gmp6aoraOppZ6kp6mkpaWhpaSsrKmmq6eioKSjpKenoaCgpaKmoIl8gH53eXxleXpgYlNWYUhJS0tTVEpTUU05P0E2Nz02NTs6PDw5Ozs4Ojw9Ojs4NjU3OjY5Pj0+PDk5PTk9PTw+PTs7PDo+PTw/Pz9APT03Oj5AQEA/Pzg2NT08PkFCRkBAR6CupKaroaOqrK6tp6ypqKCipp6bm56aoJyalZmfn5uen56WlJOXk5KcnqSorq2sq6uvqq+pnpeepZykx8eOV1NKZaNaZX5vclxRa2NbZF9cao+0sLC4rKahnJ2alJeamZCOkZWRjI6Nk5minJeimJmXl5iUmZiWnZufpaWpoKaknqeurqqmorGjmqOmpqqioaqiqaSosquxsqu5qKarp6urqaysp6Ggo7GusrG0qrKuo5mcnZ6hmJubmpiZm5WWm5aZnKWhoJqjoZqdmZ+kop6gn6KmnZulpqWkpaijp6OepqOinqaloqWlqKykpq2noJ2eoJ6gpaGenqWgppmBe4F8dnZzaYJsZltTW1pNUUtPT1ZNU01CNz5DNzg9NzY6PDw9Ojw5ODo7PDo7OTc2Oj01OTw7QD03ODs3PTs9PT06Ozw4Pj09QD5BPj4+ODg8P0BAPT43NTg9Pj1BQEZAQUihqqCrq6GkqquwramtqaelpaWkoKGfnqWXl5SYmZ6YnJ2blo+VmZKRnJihnaqip6Cep6Gln5ySm6KanqukjHlVaXJ2dXBjdnZYV2NgY2dYV1Znra6sr6efnqKglpCTm6CcmZeSk5+coaOanpuWnpqel5qinaSgnqOepKisraisqKSstLe2sKe0rKKtraOvpaSmoamorrWzsr22vrCssa6tqaq0sbCoq6iztbizuK2ytKSgnaWgrKGhoqGgmpmWlp+bm5iloaCeo6Ggn5ucpaCfnZyhqJ+fp6meoaOkoKagnqehn5ymo5+ipaOooKmrpZ+dnZudmqainpyjnqeQgYJ/fHh2anh1Xm1bUmFJUlZIRlZXSkNNSD1LSThGPDc3Oz49PDo8OTg6Ojs6PDk2Njo8Nzs+PT8+OTc9OT47PEA8OkA6OkA/O0A+QUA9PDk3Oj5APzo+NzU4PT0/QUBEQEJGnKueqamipamorqimqqWmp6aoqqGlpKOmkpOVmJacmpqcmpWTmZuNk5+ZqJ2un6eenKGdnpqZkpiem6KhoKOAboJwYGNYTFtTWk1MUFhSR0xMR5isqqmloJ+akpGUmJiWlpaMiIuOlJ2cnZyelp2Zpp+gp6WwqaatoqqttrC1srCttri9v7qttbSwt7CutKmmpKWsqbmztbvDvMPBtrq2q66xube8r7OwtcG8t76zs7WirKKpqbKpq6inqJqZnpqqp6CZp6Cfn6iopaSenaqiop6bn6igpKetmZ+jnp6nnqCmnpycoqGbo6KhnZympaWkn6KZnJukn6CboJyjiYWFfnZybWl3bWhuXFhcQ1dOSkdNSENGTj0+TD40PDo2Oj0/PDs6Ojg4PDk6Ozs8NTQ6PDg5Pj4/Pjg4Pzk8Oz0/Oz1BPTo/PjxAPj8+Pz08Njs/QT07Pzg1ODw8QERCREFCQ5WqoKapo6mqqKmjoamgpqinrK6lqaWpqZSSl5mUmpqanJiYmZyamJmqoLGit6Swpp+enZ2XmJWZnpuco5+dimFXXmVgV01RRz4+P0NDPz5CUXipramqpqCen6KjnZ6emp2blJOVlJ6emJSFnp2gmaujq7GvubGxsLGwur28vLm2uMO+v8K/trq7wMO5vbusrqexrbHCtrjCxsDIysDJv7C5ub24wr64tLvGxL3DvLi0qrOtqrO0r7Ouqq6jnqyotrKto7CmoaOwsa6wpKWvo6GgmqGmoaSqqpmdoJmao6CmqKGcnqKemaSenpiYo6OhpJ6mmpuipJ6fm5ubnIeGgXx0cmtsdXJxaFdcUUZVSEVKUEk/RUI0Rkg5Njw+Nzs8Pjw8Ojo4OTw4OTs4Ojo4Ozw3Oz49Pj02OEA5Ozs9QDw9QDk3PD07Pj0+PUI+Pjc6QUA+PD45NTg9Oz1DQEFDQkGRqqGlqqelqqimn6KnnKasp7Gyq62jqayVkpWalJecoqGbnqCinJ+psqu7sr+rr6ylnqCgnJyYmp+gmp+flXxfXmVgUUdEPEM+RTw/OTZOfqqzp6SjoqCepaymnpeclJGanpmVjIqGiIZ4bIqloqKrq7K8tsO9vrK7wcPCxb+/wsbGxcPIwsDFyM3QyMvDsre1vrK+xbu+zM3GzMzM0se+v8DDvsfGwrjEysnEwce/urS6u7W7t7C2squ7sq+8t7+7uqu4rauquLu1vK6uuKOmo56mpaKjqaaZm5+Zmp2nqqegoaGkmJSjlZSZkZydn6Sep5+en6KdmJmUmJSIhX56cmtkaW94a2VaXEZMTUVEVE1FQkU3Oj87NTQ5OTc5Pj87PDs7OD48Njo9OTw9OTw9Ojs9Pj4+NztBOj45PT45PT44Nzs6Ojs/Pz1CPj83OkFAPTw9ODY2PDo8QD9BQUE+kqugp66ooqulpKKipaGlqquwsq2upKmmlJWWmpaUm6SmnaGqp6KrrLy8v8PBsrK4p6Ghq6qhnJ6hoZ2bmn1zamFXTkU+SVl8b2JCPVyOrqygmZucnp6Zl5eYko2Pl5eUj42QjIKDgnZycG1wh6WsrbS4xLrNx8u+wszNzczHyNDMzMzHysXFzNDS1c7Tyb3Av8O7xsXIxdHTzdPQ09PMysHGx8bKyM/AydHNx8bIxsK8w8G/v7+1vrOtv8DDw8fFx8Svv7myuL3EwsK6vLy1rqenrqigoqmlmpagmpmdqKupo6SknpePm4uQmYmVmJugn6OdnZeempOTi5WPhYF5dXNlYmdyb2deWlpET01DRVBJRENBNTU1ODlCPTY4OkE+Ozs+PDk+PTc6PTk6PDg8PDw7Pz8+PD0+Qzw7OkA9Ojs6Ojg4ODk7QT48QD8+OTtBQTs7Pjc4Njo7PkI+Q0FAPpOvn6ivpqiro6KloKampKuoq62qrqKqo5Kcl5ebmJuirJ2frqalsarFxszOzb+wwaikqKytqqCdo56bnZZrZl1USURAP0uGnqWahKCyraOenJ+amJeUk5SXkZCPjIeEhIiGg4CBgYB5cXJva3iitru5vMrB09LSyM3O0dPR0dDQ0dHNzc7QxM3U1djR183Gx8nMw8XKz8rS19LX0tXW09TIzMfMzcnTzc7TzcbJysrCxszHycnGv8Ozs8jFy8vLz8fKv76/vcHHxczMycnAw8CusLOonqKqo5qTnpyYnqaprKSlppaXipWFkZSHkpKSmZualpiQm5aQjIaRi4B7cnV2Z2NndmplVlhSRE5HQElRQz5CPToyMkE8RTw3ODxCPTs9Pzs7Pj05Oj48Oz44Ojk5Oj86Pj1APkA8Pjs+Ozk9PTw5Njo6Pj08PEA/Pjk6QEE6OT44Ojo6Oz4+PEE/QT6QrKKiqaanqKSfop2qqKOso6OnpqyiqZ+To5iWn56dpK6bn7CrqKyxyc3U18/Gu8esrbO3rK6jnqOinaGcY1RMSkRDP0NSrtG9sq+mnJycoKShnZqUlJWUin14cWtlYmhycHJ7hYqAdXBtcXJvhJytvMfR0dfW1dHWzdTW1tPT0dLU1NLP0cPQ09bY1dXSy8nO0MvGzdLK0tXX2dbY09bYzdLKz9HMz9HN09DAycjLxMzNzM/PxsfItsDLwNLNzNDHysjAxMPIz83Q0c/NysjNuLe7qJ+lq6eemJ6jnp2qpa2pqKiSlYiQhIyRho2MiJOVmZCWjJiSj4aHjIR9eHN2cGNhZXJjXVJcSktHQUZJSj87QTg+NTU4Njs4Njo8QD07Pjw7OUA7OTo8Ozs8Nz09Ozo+Oz08Pjw/Ojo8Ozs5Oz89OTU7PD48PD0/Pz46O0BCOzk/OTg7PT0+PzxBQEQ8hqugnKegp6Oim6CbqaSlqaCfoaGmn6ifmKSimqmmoqarmqOwsamotdDU19rSx8bLtLXBxbG1qKGlpaCioltJQEFEQUZRdrKvppqUl5+cmqCgnpucmpWJd2ljYV9fX19eX19dYWx1c3Bwbmxwb3WAd5i41dfW19bT18/V1NnU1M7P1dTU0dHM0M3T19bT1dDP0tPRydPRyNDX19jS2NLX2dXWzM/Pyc3SzM7RwMfEycfPztLR0sjMzcDLzcbUz8zOycXLx8fJzMvU1NHVz9LM08K5xbGlqLWuqJuoq6Wdsqiws6ysk4+TjoiKjoOPi4SQjpmNk4+Zj4+ChYx8enFzdG1hY2ltX1ZRYEpKQ0VDU01APD40Mzo9NTI4NTU8PEA8Ozw6OTpAOjg7Oj46PTg+Ojo8QD08OTs9Pzk6Pz07PTw9PTo2PD0/QD08PT0+OjxAQjs5PDc0Oj48P0A9RkFEPYKknKClnaWlo5mcnaSeo6OfnZ+doJqnnpyhqZ+vraqqq52lrreoq7fX1NXZ2dHO0L+8zMm2vq6nqqiho6xmQzg9PkRYgqqon5eVl5manJ+dmJuck31xZWNiX19hX15hYF5hYF9gZW1wcG1rbnB0eXZpfKnN1NjY2NHF09LXz9POy9LN1dTRys/M09bS0dbNz9XV0cXR08rQ1NXWztPR2NjY18vIzsTJz83KzMDJwcnKzs7QzNDOzszPz8jM0NHLzsvDycfKzcvM0tPO09LR0NDKvci5sK67ubWrtrCtqLits7+7sZqOoJSRjo2IjpCFkY2ZjJGRlY6RgIWJenZvcG9rYWRucGFYXFtJRkZETVlFO0A9MzM8PDg3ODU1Oz5APTk8PDg8Pjk8QDtAOj04Pzk4Oj88PTg7PkI6Oj08OkE9PTw6Nj08P0A9PDs9Pjg7QEE9Ojw4ODs+PD4+OkVCRT6Bn5mlp6Cfo6eam5+cl56eoZqdmpyappufpKefuLa1taykrK6+tLDA2NLX2tzWzs3Kw9LPwcGxqaytqaSye0hGQjtXjaGblZOWm56enpyTlpeUiGteXl5hZGJgYGFhYGBgXl9fXlxibXFubnJydHV6cWJtnsfV1NCkys/O08rNzsTNytLSzsbOzM3Uy87SzcrW1tDM0dTLzNDR08rO0dXS1dbKwMrBxs3DyMrDzcTGycvLz8vOzdDO1MzGydDNycfLxsfCxsrMztHRx9DPzs7M0MXHwbi5vcPCvcO5srK+sLvDxLWqmKWhmJaRlZWSi5SNmpGUlI+PlYKJhnlxcmttaGBgcWhZWGhWTUdMSVFRQjtEPzs2ODo4Ojs1Nz09QTs6PD05PD05PT06Pjo8ODs9OTtAPD47Pj5BPDk9Pj1CPTs3NzU/PDw/PDw7PDw4O0FAPDo8OTs7Ozw9QTpFQUU+hJ6bqK2epKSqnJ6fmJKXm5+am56ZmaKVoamppcTCwb+7tbKxx8K4ytXW2drb2MzMz8jW1cTCta+0qKCtl3hsb3B3j5qNjJeVkJORkZWWlZCLfGViYmJgXV5hY2JgX19gYWFgX11bXWdxcXBxcm9rcXl0ZW6fz82bl9bJw8jIxca+wsXOzsfFxs3K0cjLzc3F0NLPzczUysfKzs/Hx8/Sy9DPxbrEv8bKvcPHyc7Fw8jAx87IxM3KzNDIxcXQycbCxsnFv8HIzczMz8PKzMnHzNDFxci7x8PJycLPwb28v7DByce5vaqxsqelnaKcmJCbkKOZl5mRlZiJj4J4b3Vka2BeZnFhW1dgR0lIR0lNVEc/Sj02NDM1NT09NDg9PT06Oz08OTo7OT89OTw7PDg6PDo6QD1APD09Pjw6Qz48Pz04ODk6QD4/Pjw7Ozs7ODo+Pzw7Ojc5PD49Oz49RkFDPYOgm6qupa6qq5qdoJeUjpedmpmgmpqcm6WysazJzcrIxL68uczMxtDV1dja29jQyc/P0dPIwre7u62ktn5ngoWiqpONjZaPhYODg4F9hIR+c19bXl1eYF5gY2RjX11cXl9gYF9bWlxha3Jwbm5pam1uemdVgMCiebvPw7i/wrq6uri9yMXBw8DDx8rIyMnHwMXLxsjKzcnEwcrJwcHLz8TLyL+5wbzGyL7Axs/LxMDDu8rHyLvJxsXKwb7Cy8bFxL7Gvr3BxMbMxsa8v8rDxcfSxcHJwMrKxsjG0MPDxsOuxMvHw8q3v7y6s6mspKWYn5iso6Gmm6Ogm5V8d3N1ZmpbYW5tWlxYUkRMR0JHRExERlJANTQzMzVAPTM6PDw7OTw8PDg7PTtBPTo8Ojs3Oz05Oz07PTs6OD4+PEI+Oz88OTk7Pz07QD48Ozk5OTk6Oz06PDo2OTw+PDs+O0NCRD5/pZypsqm0rrCdnp6YnImUm5man6Kfmp2ovri8ys/RzMfCw8bNzs7M1c/V2djZz8vSzc3OyMG1w76ysLZsXnl8n5GKkpaGeoCEhX91eHVycF9aW11gYGJjZGRlZGBbXF5dXl5gW1laXGJucW5qaGlubXN5VmqUe6vDxcCutbiwsbKwsMG7u7u5uMDBwcS+vbm9v7nEycXGwr3GwLe7w8i/wcm7tru7xcO/vMLOw8a+vrXBvsS7vce8w7q1vcbEwsO3wLa2v7+8zcS9trrIu7++zMTCxsPGycfJxtDGwszIssfJw87MwMXDv7yyt7Cyp6ioubClrbCqrayUend4a2VoYGhvZFZeWUpGSkZIS0FFQkZKQTk6NjU4ODUzOzo7PDk8PDs5Ozk6QD46Ojw6Nzo7Nzo7Oz88OjxAPUA/PT8/Oz07O0A8Pj4+Ojk5ODk3ODo8PDw7OTo8Pjs7PjpAQEU+fqygrLWrt7SyoZ6fl5qNlJaan52mop2et8XCxMjO0srKysfNzc7RyNDG1dTV183Kz8XJxcfBusW9rK6mYGN2gZKLiIuEeH+Ghn99g3t0dGNcXF1eYGBiY2JiZGViXVxbXF5cXl1aW1xdZ3JwbGZlbG1ve3heZpLHub+3rK+upaisqqW3s7WzsrO0u7W9sbewta6yu8K7wcS8v7q0srq+wLjIuLS8tsDCvbi9x8HDu7Wvs7W7v7TFuLu1rLm9vsC9sbu2sLe6s8a9t6+8v7W3tcW9vsPGwMTGxsfLxb/GxrvHy7/PycfDxsHDt8O9vba5vse/rLW7tbe2jnl0eGdnZWJrbl5WXmBGS0hISkdCREFFRj89OjU2NjYzMzs6Oz06Ozs6Oz44PEE9PDo7ODc5OTk7PDo+Ozk+Pz1APz5CQD1AOjo+Oz89PTk6Ojo4NTY7PT48PDo7OT49OT86PEBAPIi3pauzsby8sa2foJmUlJiXnqujr6qnpMbLzcjFyM3M0MvNyMnIysnKxNDN0s/NxcfBxcG/urjJt6uwmVtnb4iOhoiJenh+hYZ2d4F8c2hdXV1dX2BfYGRhXmNlY19eXFteXF1eWltbXF9rb21nZWhrbG9+bWi6uLazrqirpZygp6WcqaqxrKmrqbOttbCyqK2mrLO7urbDubq5sKq0ubuzwrmvwLG9vLu1u8e5w7etqqiwssC2uL2wsaiys7W7vKuutqeutq68srGquLCuu667uLvAwb66w7/Gw8XAvMbBx8q4xcfFv8fDw7nExsK7xsnMy7O5wr27s4l0dndraWBibGlZV1dbQUxMTUpFQUM/RkE6Ojo5OTY4NTQ6Ojk7PD07Ojs+ODtAPD05Ojc5Pjk7PDo4Ozs6Pj45QT0/QD87Pjo7PDo9PDw4OTg5NzY4PDw9Ozw6Ojs+PTs/Ozs+QDyKwKuouLe5w62zqZ2ZlJaZoZymsLWxt6bFztLLw8XBxM/HzcHCxr/ExMPDysLJyr/AvMK6s7W1w66qsJJbaX6SiI6Pe3h9iYV5e4SAd25eXVxcXV9gX19kY2JkY2JgX11aW1paXVpaWlpcZG1uZmVmZ2lrcHqJt6+0rKOipKSYnqKemJqjqayjp6GrqayrsKOmn6qttLaxvbivt6+orbi0s7y3s72wuLm1srzBssCvpamjq7Gzs6i9qquoq6yutbSmqa6hpa+ps6aoqK6mqLessbO3urq7sry+v77Ev7XBwMfIt7+/xbfFw8C7v8TCvsTIzMq/v8TAwKmHc3RzamlcYW9kV1ZYUEhaU1NLRkZFPj9AOjc4OTc3NjQzNzo5OTo8Ozs8PDc7PTs7Ozw4OT44PTs8Njo9Oz89N0E+P0A/Ojw8Oj05Ojs6Nzc3ODg3OTw7PDs5Ozo8OTc5Pjw+P0E7jMKvrry3ucSwtrCbmZWcmKqpsLGztb2vxdDPzMPHubnLwsu+u8m2vcO+usq3wcTBtLa8trGvtbytqauSY22Ig4eLgHp9f354dH58c3dlX11cXF5fYF5fY2NhYmBhX11dXFpYWVtbWFdZXF9ma2VjZWRmaGxxgqWkqqKamZ6hkZqimJWPn6CnoqKfpaWnpa2fnJukpqyysLa3p7CsqKq0q7O5sLa2rra6s7C6urG2pKCkoKaxqKypuaqlp6eop7OtoKenn5ykpqyfn6ekoaGxra2ssrWzs7C1vLa7wcCyu77DwbG5ucKzwL3Atbi8vb68wsfEw8S/wMSghHlxbGJmYGtvYFVZX0hOaE9USEZLRjw9QD06Ozs4MjY1MzY5OTk7OTo6PDo3PD88PDs8ODg8OTw6Ozc4Ojo8OTg+Oj89OTg8Ojs+OTc3NzY3ODg2NjY7Ojo7OTo7PDg1OTw6Pj5AO43Itba9uLrBur22oJ6VnaCmurars7O7s8TPycvCxbi3x8DMv7jKt7vFuLPFuLO/wKy2vLKspq+0raGjkmlyhoWGgHx4dXNvbWppaXBpX2BdXFxcXl9fYWNiYGBgYF5cW1xcWFlYWFhWWFtdXmRiYWRlZWRoamyGnKelopaXnZOYn5WTiZufoKWbnp+jpaKnnZqim5+qr62xtaSoqqmsrKS0uKy3sKyzta+zta+wqp+en6SisqWmqritoqamoKitq5mfoJ6ZnZ+lmpmjnJyesKmsqKqrrK2wsrmvuLm6sLa8u7qrs7K5s720t7KxtrW/tb3AvcPCu7u9l4R7c2xfZV5kZFhUV15JV11LUEdKSkdBPD8/QTs/PDA1NjM1Ojs5Ozg5OTw8Nz4/Oz07Ozg4PDg5ODw3ODo7Ozo7Pzo9Ozc4PDo9PDc0Nzc2NzU3NDY2Ozc5Ojs6ODo5ODo7OTo8PzuJyba4vru4wcHBtKSkmZqkpsCyr7astLfFz8jIwMa7u8PDz765x7i4v7eywrSxu7usubqxop+pq6eYnpBtfoWGf3hybW9ta2JeYmZmXV1eXV1dXF1fYGFiY2NiYV9cW1taWllYWFdXV1dYV1pdYWNjZGRlZmdpcYmQgpOrl5aTl52Sk42Zn5+mnZucpKahpJufoZuYrq2trrKgpKKtq6ehtbCxsqypsLOourOntqGin5yjoa2joqq2q6Kjpp2mpqOWmZ2XmZqdn5qXnZydnK2hrKijpKatq7OzqrWwsquyubSvqq+ysrO3s66pra6yuLC6trq9v7ezsZSGenVmX2ZfW1lWU1pVS1tRTEpFSEtJQz0/QUFAQToyNDUyNDk5ODk7OTo9PDY9Pzs8Pjs3Ozs3Nzc+Njo+Ozo4Oj07PD06Ozw6PTs4Nzk3NDY1NTQ2Nzg1Ojo4Ojk5PDg3Ojg5PkA6gci9uL2/tr68v7KdpaOYpbHDtba9rbS4wczIxr/FtsHAx862wMO9s7m5sr+2sbm7rbK1r5+ao6qhlJqPeH+DhH94b3F0cWhlZGllY1xcW1tdXVxbXmBhXl9fYF5cW1pcWllYVldWVlhXWFdVV2FjZGJiY2NjZmlzc0dNfZCQkpOak5aRlJ2bn5uWoKCoo56eqJybmqunrrCqnKOjt6mhoK6otaqnp66xpLiwpLego5yZmaqmoZqtubCjoaSco6Cgk5WhlJaWnJmYlpeclZ+pnqqkop2jqqqxrai0rKqnrbOwpauus7GvsK+vp6iosq6ytLC8tLq4rqOUgnp2ZV9hV1lYU1JUS01eTFBMR0hMS0U9QD49Qjw6NzY1MzQ5ODg5OTo5Pjo4Pj47PTw8Nz49Njc2PTc7PTs5Nzk7Ozw+OTk6Ozo4Njc2NTQ1MzEwNDU2Nzk6ODo5Ojo3Ojs5OT1AOnbAvLS6wrG+t72tnaenoqq7wL3Aua60uMHMx8XCw73FuMjMssHCwa68u7W7vLW5ubCvsKqcmqGplZGKi4CAfHdxaWxydHBoaGVkZmFcXFpZWlxcXF1eXVxbXF5cW1xZW1taWFZXV1ZXWFdXVlVaYmJhYWJgYWNka3JlZ26Ijo+PlpSYkpKYnZqdlZ+epqWjpqefnZ+moKqvpp+ho7anoaGiqbOipailsKaxrqu1n6GdlpWpoaKUrbGxn6KjnZ6YnJOMoJSRk5iYkpeYmJeep5unoaKapKWlq6SlsKelo6usraaorq+vq6iqqrOmpquvtLGuvLaxr6+fknt4c2ViXFtdWE5MUUhSYU1WUE9KTU9FQkQ/OT02OTo3NjQ1OTk7OTg4Nzs4OT0+Oz47PDY5Ojc7Njs3Ozs6ODU6Ozo7OzY8Ozg4NDc3NjMzMjEuLzI1NTY7Ojg7Nzg3Njw7Ojs7QTh4u7uxtr2wu7G3rJ6lpqy4u7zBxbqyubXEycnAwsbFx7bFxLPBv8Wrt7e9tr26u7WyrK2omZmfo4uKdImIfnZuY2FmaWhmZ2lmaWxgXVxbWlpaWlxdXFtcXl9cWllbWVlaW1dVWFdUVFZWUlRSVF9fXl9gXV9fYWNpgY+FhYuJj42Ol5CRk6GXnpWbnqShrKWkpKOjopyqq6SanqWxqqGhnqWqnqiin62sqqmuraKiopWYopqckKupsJufop+fl5mTip2RjZKUlpCYmJOcoaOcpKCilaCipKWbo6uloqSqpKutpa6yqaalpqa0pqqorbO1tLm6r6qsnoxzcXBgW1dWVlJHUU9IWlxPUkpUS1NMRUdJQzg7Oz08OTY2Nzo5Ozo5NzY5Nzc6Ozo9PDw2Ozw4PjU5ODo4ODY1OTo7PDk3Pzw5Njc4NDUyMTIxLi4xNDI2Ojg2OTg1OTg5ODk7OUA5e7W0rLS7srCrsa2dqKevubmzwMi6tcCvxcjMusHJzMi1ybyxvsPJrbG4wbW8wLy0taqsppaanJyJgXKIg3t0aWlqbGdqbG1ramxlXVxcW1tcWlhaXVtbXmBgXFhYWllYV1hXVFZWVVRVVVJTTlBZXVtcXV1dXl5hY2yIin6LgYqLiZSPkI+ZmaGamp+nqKqoq6eppqOZpa+klZmlr6mgnJmboJ+umZyqs5+mpp+jo6GUlJuWlpKpqa2bnJ+hoZuUkIyYjYyRjZKNlpWQnaGgo52co5WboaOhmKKoo6Koq6CrsKSuuKWjpKOsraqoq6+0t7K9tbOrrpiFdXRpW1hZU1VSRlhMUVtYTVVPUExRUklPSUI9Pz9BPz03NTc5OTw8OTc3Ojc5Ojs8PT47Nzs7Oj02Nzo7ODk3Njk4OTo2Oj05OTU3NzU3MTE0MS0rLzQzNDk4ODo6ODo6NzQ4PTg/OX6zraezt66oqK+um6morLe2rLzKu7a/rMzGxbjAzs/Hs8S7t7vCyLGtuL+3vL67s7amqaCWmJmXiHp0gHZ3bm1obW1tcGdnaWZkXVpbW1tbXFtZWltcXF5fX1xYWFlYV1hXVlVUU1VWVVVTU05PUVlZWVlcXFxdXl9keoZ8hHmGi4WNiZONlJefnpmeqqimrqypsKSomp+soJWVpKinnZiQj5qerpaYp6qYn52UpaCekpGSkZOVqKqlmpiZnp6XjoyLk4aJjYOPi5KVkaCeoaSZlp+VmqGinpSbpaWnqaigsLCmsb2nn6OstKuup6+0sLm1wLGusKuRfnJ0Y1ZUVU5RSkdWUFJSTExYTktNT1JHTktBQ0ZEQz5BNzU4ODk7OTo3Ojo3PD06O0A+Ojk7OTo/NzU5Ojk4NzY5NTg3Nzk7ODU1NzY2NjEzMjAtKi4xMDI4Nzc7OTk7ODk0ODs4QDh/tKymsbeqpaKxq52qp6mysKS2xrS5urPKxbm6wcvQyrG3uLy9wMOxsLG3rrS0u7O0o6OdnZiXlYSAdmtnbG5xbnFqb2tkZWdlXlpZWllaWlpaWlpaXFxdXFpYWFhZWVdYV1VVVFJTVVNWVFFNTk1SV1hZWFlYW1tcYGl6dHlvgoeCi4WTh5GRlZiXnKean6qmpqudp5mgpZuSj5+jmpeXhoWSm6SPlaKclpaVh6Kam5OMjoqQmqWnnJWVl5yRk4iUjouBjI2AkIuSkpKhmqCilpSZmJWippqNmaSnqaehoLSyqLO4oZ2jt6yqrqSysqa1u7WrrLGiinpzbl5OUVFNT0ROTk5QS0ZOTkpKTk5RSU1KQUhMSUhDPjk1ODg4OTo7Njk6Njg7OTk+PDg6Pjk7Pzg3ODk6ODg2ODU3Njg4OTc0NTc3ODIwMzAxKyktLzEyODc2Ojk5OTk4NDk4OEE3d7anpLawpKekqqWgqaaks6qissO1tbKzxsW3usPKzMazrbq9tLjAr66psJ6mrruvraCam56VlYh8hG5fX2ZycHVxaW5pZWdoal9YWFhYWFlZWVpaWVtbXFxZWFhXWVlYVVZSU1JQUVRRU1VRTk1LTFNXV1ZXWFhXWl1hbGxwan6CfYN8jYGLh5KOkZygjpmco6GjmKSXoZyVjYeZmoxzjYN+jpeWhpKakJSOjXuZj52MgomAipigo56Qk5iWhY6ClH5+dIqOepCIk5CQnZuampKWkJ2Oo6OOiZqgoaSkm6K0r6ywrZ+YprimpbChsa6csbyqqa+pmYR4dGRWTVJQUE1DU05MUE1CUFFISU5TTUhKSkRLTUZLSz03NDk4ODg7OzY5Ozc6PDk6Ojs3OT85PkA3OTo8ODk3NjQ0NDU4NzQzMTI0ODUvMDEwMikoLC0wMjc2NDc4OTo6NjY6ODdBN3i3oaO0qKalqKOlpaamprKnprTBuK+0sMnEuLnAzsa+s6y6waytxK2ooqaSnaa3raOgkZaXkpB+eH9mV1ZfZ2ZpZ2huY2lpZ2JcWFdYWFhZWVlZWVlaW1tbWVlZVldXV1NUUE5QTk9PUFNUUU1NSkdOU1NTVFVUVlhaXWlma2d5f3dwTFZvjYCUhIualomSkJ6YnZWUlpSPloqAlIlfO1ZvfIyUioCMkoyPhoZyi4SWgXmBe4aUnZWDlo6Qj4OGfZN4cXCGjX2JgZCOkJeamZOLkIqdiJ+Yh4iWnpqhoJenrqmtqamelq2zoqatma2rmKi0o6mtopN/dG5gW05TUldMRFRKUE1MRk5PSUVMUU1LT0pJTVBGSUo9NzU5OTk5OTo3Ojs6Pj44Oj09Nzo/OD4/NTg5Ozc5Njc1MzMzNzYwLi0vMzQ0MTEwLy8oKSsrLTM4NTQ3Nzk8Ojc5Ozg2QTl5t6CiraGmpqqgpqmno6qwqKe0wbmwtbDHwrizvc+/ua+utcKnqsSqop2Yg5ScsaOamYeUkIuHfnN2XVBMUVVZWlddXmJnY19ZV1dXWFhYWVpZWFlYWVpaWllYWFZXV1VTUk5MS0hHYlxNTlFNS0hGSE5RUU1PUlRVWFlgamhidXxvTUA+fpWQjnuGk4uDiYyajZaUiZKHhZWGeYl/YEpRbniLkoR+hIyLhH9/bX5/k3d1dniEjZpwUY2IioZ8fnmUdmd3hoh+ioiVi46Rk5eMhIqIlIWbjYKFkpuWnp2UpKKoqaWknpuwqqGkpJGmqpaiqpyhpqeKd25mXlxIUVFTTUlVTVNJTEtPSUhGSk5MTVRLUVFPRkpEPTc2OTo4Ojs7ODo7OD4/OTk+PTg7PDY7OzQ3ODs2Nzc1MzQ0Njk2LzMvLjExNTIyMS8sJykrKiw0ODMzOTg5Ojk5Ojo6Oj85d7aboqadn6Guoaeopaeor6yqtry2uLezwbu2p7nIuLaoqLW2qrK8p56Vjn+JlKmWlYt/joOCfnhxb1hNS01NTkxNUVdbXFpYWlVVVlZWV1lZWFhZWFhZWVlaWFhWVldVU1BNSkVAQJtrc3NJTUtERENJTk9oWU5RU1RVWm6BbnB4ZWVZUo6Ik4ZyfYV/e4SLk4GSmYuPe4aPgHV/eHNvdXB0jo6Ben6Kq4V6e2h2e45wcm14gYuNknh7gHuAd3NyknhodYWEhIV8lYqIio2LgH+Ei42AlIR8gY+YlJyWkZ+dqZ6goZ2gqaWfnZiNp6OToJ+Wnp+kgXNpYl1dSldQUkhLWFJPSk1MUkpKSkxQSExRTVJUTUZJQj03ODs5OT49Ojs8OThAPzo6Pj03PT03OTkzNzc4NTY3NTI1MTQ3Mi8yLiwuLzIwMC8tKygoKS4xMjcyMTk4Nzo4Nzc1Ojw7N3aumaOhmJ2ftKmvqqWtq7Cxqr20sru4trq0sZ+3urKqnZ2sqaiyr6KakY2UgY6cjpF+d4Z3fHdwb2pZS0hJSEdFSEhQVFRUV1dTVFVVVVZXV1dYWFhYWFhYWVlXV1VWVVNQS0Y+OTNOPH6eTUhKREA9QURqlH5MTlFRU1ZedYF5dGJzipSXjY16ZXh/dXd+iJB8g5iSgHGGj3t2e29rfq18dJCLf3qGkoB8f3RmdXyGbG9oc3yKjYeAbXlxfXFtdo9xaHGBfo5wRIuFgoOFf3d3eoyGfYx7dX2Oko+Yi5Kam6OWmZ2bnZ6hnJaNi6Wajp2XjpaYkHhvbmdjW1hYVVFKU1VUT1BOUFZLTktPT0pST0lPUExGRD07Nzk7Ojo/PTk8Ojk5Pz87ODs9Nzw5OTk5MjY2ODU2NjMzNjExMjI0LiwsLS4uLTAtKyonJyouMTM2Mi84NzY5NjY1Mjc5OTV5ppegnpagprCsrquoqbGvsau8uKu7vrizrKebsKesm4+WnKWppKGYmY6EknmJj4uLdnF8bXVwam1qWEtGR0VBQENESExMTVFSUFFTVFRUVVZWV1dYV1hZWVlZWVlWVlRTUUtENzhmNzA/qGlOSEM9OzpEioV6WUpOT1FUWF1mcHBphaWpwH1yd2F6d216d4ePeXuLhW9sjJJ4c3hpaoCCcZaRjIF9lX9JkpluZ3d+gm1qZGx5hZCShmtybHxucnyGaW1wf3ONiYWGe35/e3dwdHSGgnmBeXB8jouKk4OWl5iakJOWlpmXnZaMg4mfkouSjYaQl4Bwam9vb1lWWFRSUllPUlVUUlhVTU5ITUtNT0tDSU5HRkA6OTk7OTk6Pjw5PDs6Oj0+Ojg6PDk/ODY4NzI3NTY1NTQxNDMyLzAyNCorKiotListKigqKCcsLTEyNTAsNTU2NzQ4NUhBODk1d5mRm5ibn6Ssr6Ktqqi1r66stL+rvMO/paKZlaSYno2Ei5ShoZiZkZOLc456gIaMhnVvdGxwbGVsallOREZDQDw+PkFGRkdLS0tNUFJSUlRUVFRWVldXWFlaWVlaV1ZUU1BMRTFAmjMganNDmW87PDk1PICChl9JTU9PUlZaUVlbX6aGYZhmcHdjfG5sfnmKiHWBh4V0bJmRdHN8aWqdjkx5hZOJhI5mMXaHcmt9fYN0ZmV1f4SEhYBmaWx1a3CAfGhxcXxuk42Pe3R+fXFxb3Vtgn93eXVqeYiCiImDlpKSkIuNkZSUjpeNgHmIl4iHioaAkIh4bGtwaGVYUltYWVlbTlBVVllYTklIRUpKSEdCQEdFQ0c9OTk4Ozk6OTw6OTs6OjpAPDk6PDk4Pjc4NzcxNTIzNDUzMzY0NTAzMS4qKispLCwrKykoKycpLCwyMjYsLDQ3NzU0NzhpTzg7NW2SiJqQmZakqK2esZ6nuq+rsrDCsbvDx5qWj5WZi46FeoSQmJWNkIyQh3GHgnSIjIZ6cHNxb3BkcGdfVEZJQz48Ozk6P0BBRENFR0pMT1FRUVFSU1RVVlZYWlpZWFZVVFNQS0U4MC9cYLNHOVhQOzk0NDGWuotITE1PT1FVTEJJUUlirrKecHl1antrcIKAhIB6hIWFeXKglHR4gHN0lIc1cJ2onY+hoYSihXZwhnuGfHSMro2JgWhnYmpucm1wg3Vpb1h1cI6bkXZtf3t9bnJucIB7c3ZuYnWDf4aAhZCQioqJkYuRi4uOg3V4io6AfoOAfY58c3JxbWBcXV5cWllhX1JOW1pYV0xISkZJRz9DQUJIP0NEPTs6Nz07Ojs7OTo5OTs6Pzw4OD06ODs2NjY1MTEyMTI1MzQ3NDUzMS4vLCwrKSopKSoqKikoKikrLzNETTIxNjY2NDM8dlI3PTdikYGSiJWRnaSnnq+VpbSprrCuwbK7wcWWkIyUj4CIfG6BkJKJg4qHj4Z1goRslYiIe3V4eGx3bndjal5JUEc9Pzc0NDk7Ojs9PkBCRUhMTExMTlBRUlRVVldYWlhWVVRTUExFPDUqnUtbQC1nSTk0Lz+Sg6muX0dMTU5QTDhETlJTREqEc356enR9a3WGh3t8hIN+i311oZl5foWAhJmEmpxhhqqfnYqDkI56d4h+iYiOc4uXj4R7XWRxdHp8d4ptaGpieW+FkIJ6b4F4dYV6cHR6eGtuaV12hn2HfIeGjn+KkpeDjYWMhn1xhH+EfXZ3e3yJeHF0dWdoYFtcXlNcZ15XUVRYW1VHSkpES0c/RkBEQz5BQT07OTc8Ozs9PDo6OTk7Oz0+Nzk+OTk4NTY1MzI0NDAwNDY0NTU1NC0sKSsoJycnJigoKSkoKCsrKy8wMFVxPTIzMzMxRX5XND05XIx4in+TjJGcnZ6mkaCqoLGor8Cyu8W6lo6Rk4d6hnZrf4uRg32Kg46MeIOAc6CEin19gX9wgX56aHZrUlhMQEUyMTEzNzY2ODg6PD5BRUdGR0pLTU9RUlNUVVdWVlZUU1BNRkA6Mj0gI5ZjjFs1MzExaT9Hb0lGSUxNT1FMS1RcWFJLZ4GHeoh4enB7jop5e4iGfpaHdqGZh4aOkpSljaypSIausK6LgYCUi4KLgoSSqYeAmJiKnHRtfIGGh36OaGdoeX9uhYeChXGEhkhsgHdyeXZobWtfdn2DiH+HhYt5lJybiYuIkX96dYp2fHhtb3d+gXV1c21cXl5cY2RYZ2ZcVVBQV1lQRExLRk9JQ0ZDQ0FAQ0E9OTc4Ojo6Ozs6ODg4Ojo/PjY7Pjc1ODU3NzMzNDQyMzY2NTY3Nzg7REZMTU1MQzcrIiUnKykrKywvMDArbnUyMjQyMEyBXDU9PF6EdHx9iYWHkI6Vl5KWoJ2soKa4r7O9s5eNkouYi310cH6Jkn59jIOSlH2Gfoakh4h/goiFeIeJfnOEeF9jV0tCNjAuLzIzMTI0NjY4Oj0+P0JFR0hKTU5RU1RVVFRWVVNRT0dDPzgwLCOHWz8/ODQuXZZwc6NVRklLTU1QV2BYb1lbXWiLkYWTf4KAg5CRfYWIkICZlIGgoZiUm5qmrZOZu7Gnu8fDqIuMoaWOk4mBkXxxg56fkZ1/d4WFi5CHkGlocISBdIyHhIpyhoJ3iIB7doR8bXV1Zn+UjoaIiIeIh6CqopaJjpd/eoGIenlvZ2t4fnyAdWxlXltbXmpeYmdgWk9MTlhSUUlQSkROR0NKRENBRERCPDo4Nz08Ojw6ODg3Nzg6PT04PD02ODY1NjYyMzQ0NDU3Njg2NzxCQj88ODo+Q1FeZVxHMicmLCwtLS4xKD+LWy4zMTBPg180PztudXBmd4J6f4x/gZCOipqbpJ2hrKaqrrCXkZGEoZSEeHd/jJR8fpKGkpV/ioCSm46DgIGMioKJjYN/in9scGpdQkA0LS0vLy4uMDIyMzQ3Nzg7PT9CREhJTlFSVFJTU1RSUE9IREI8ODcvOUM+PDw2My5sk5dNUEhJTExLTlZgY39mZmx0mpiNmJGRiYyNmIeSj52LoJ+Ro6qlo6uTqbaiqMHCrceveLqUmnyNoZ6ZhJOFgo6hn5SZkYWKhY+ZkZZscHWKjIKVjI2Od4+EcW2FgYqWkYKFiHGIoJaGkYmNj5aktKibjJSig4eSg31/a2pqfIGCg3VjX2VgW2hsXmxsXldLSE5SUU1MTEZJUENETkZCQ0VGQz06OTY9PDo7Ojk4Nzc2Nzs6Nj06Nzg1NDU2MzQ0NTY2NjY4NTU2MzEwLiosLCkoKS46UGFcQCwoLSsrMCwncog3MjQwT4RiM0A8dW5nWW+Cb3WGcXaShn6XlpqUnp6cp6CplpOYnmdlpJp+hJKReX+SiJGSfYqEmJKQgoCAi4yJhpCHhImFeHh+Z01SPi8uLiwvLi0vMDAwMjEyNDY3Oz9DRU5PUlRQUFFTUU5QSUVEPjs8OkRGPz48NzUyPD9SNUhISExMTU5SXm6Ke3KAfJ2amqWkoJiflqGUnJ6nnaiqn6isqaq1l6u/q7bHyLfI0M++m6Bwaaupn4STkoWcoJqbmaaSkYiVopubeHp+lJiTopKXl4GUnnt3lZKqsoiMl598lJ2bjZGVmKOhpbWvnJCYp4eWj42AiGxzc32BfnNqYV5iYGJoZGBoZ1xSRUpLUE9JSUxGRk1DSExGRkNCR0RBOjg1PDw4OTk5NzU2NTg+NzU9ODQ3NDU3NTQ1MzY5NTg6NjE2ODYzLzAuLSosLy4tJyMqO1hiQigqLDEtKEuXXjA2M1GFZjJBQGlhXlBwdGBtfWF3jn17lI6Oip+Sl56Wm6qYnqpCRH2HiYeYjXiCjYqOjHyKho+QjoGCgImLioWShYOGiYGAh3deYlA0NjAtMS8sLjAvLi8uLjAwMTU+QUFNUVJTUVJTVVJOU0xFRUA8Pj1GR0BBQDg2NjI8OTtGSEdJSk5PUVlthY92lImgpKeyvLejraurpqizq6+1sbGtu7GzvZuyw6u6ycu3w7+4paKws6ytqqOLlpiEpaago5eBppmNoquopYiFlKShoKuhpKiPnLGLlaOmt7qboKKvkqGdop2Po6GrrquytKGUpKmImYiSiZV5en6GgGliaV1mY19lZF5nZ19bT0NJSFNORkhMRkpHRkZIQUtGQ0ZGQTs4Nz08ODg6OTc0NjU4PDU0PDc2OjQ0NjQ0NzM5PDM4PDIwMjU1MS8xLi0qKi8sLSooKiYlNVhYLywwLCwwhIE4NzFQhWg1QUNbWFRMaGJXaW5YeoR2gZOFiIKbg5KRjJLayJ2Wc1aXiI+InI98hoyOiop6h4KHkI6DhIGLhYaIkoaChYmHiIeHcW5hQEU2NDwyLzExMC0sKy0wLi00P0NBTVVQUlNVVVZVTltQR0dEPD4+RkhDRUE3Ozw1Qzs9RktJR0hRT1BXgJKfg6yisamwv8bCqbLFtauyv7K3vbW/tMG2u7qjuMWotcjHtb25tKijtK2wsZuZkpqfiKevq6WUdp+kl6GssrSZlqquqK62u7K6rLC1orGssbW7trSutJ+mp6OnmqmvrLG4t7immrWojKSOkJKfhniBhXdbY2VXZ2NiZGFhZ2BbVEpERExVUUhJSkRJR0VBQEBLREJNRz04Njc7PDk3Ojk4NjU1NTcxMTw4ODk1NDY2NDk3Pj0zODkxLjAxMjExMzAsKiwuLCsrKyooJyopRVowMCovK2iSTzYwUodqNkFGV1FKTFtZUWJiV3l1cIGUfYSGk3WFf4CMe7+7o7yCtJSTjZuPhIiPkomIeYaAjJKMh4SBjn+BiY+Gf4aIhoqHkHp4bl1WQEVOPDY6NDVBQjc2NC8vNkNIQlFbT1FVV1VcV1BfVUlLSkE/PkdLRkZEOz5AN0Q3P0JKSkVGVlRQXo6jrKKxs8G0tsDLyLW7xL2ys7+2t8G0v7C3dLGzprrEpLDGubCysbSopLW2qrGgopebopKlsK6mraunpJigrLS7oqiyurW8v8y/xcW9vbPBt7q3vra6t7msq7ClsKmtvbC8usHBq5i5p5StjpeXqYh+g35sWGRiWWxma2ZYXGNZVlNJR0ZMUUdDSElBSEQ+P0JCTEBATUQ5OTY2OTo/Njo5OTY2MjQ2LzE5NTk5MzY0NjI3Oz0/NjoxLi81ODo5NjUwKigsLS0tLCwqKCgrKyhFUy8qMDBKj2s1MlCHbTY/RlJMQUxRVlNZVVp2am9+joOAjoRuenN4h2K5oZmjiZSUlpKUk42PlpGHhnuGgY2VioCEgYp6fIqHhn2KgoGLg5V9d3p1ZVBcZEdFSztRY2FbXlNGPztIUEVaY1FSWVhaZ1lUYF9MU1BFQT9JSkhFRUFARDxFNkI+SEdKTFNZVF2Trre0ubfIvri8ycy6u8C7t7W7ura9s7mxxWB1saSxmp6qvamlqKuqpKKytaCrqJ+Vlp+ZoK6lp6aln6OTo6extKiys722wb7TycnTxsPFzMLKw8C+vb67vLe0r7i3tsO5xb3Cx6+euKmhq42kp7WIgYFzYWNjX1ljYGpnU1hgVlJVSUVFTktAPkdEPUtBPUJAPUY+O0hANzk2Mzc5PjQ4OTo1NzA0NS8yNjM4OTM3NDQyNj84QD5HS1JUU1FQT1FRUEpBOS8sLCwqKygoLC0sL1A+KC40OIB9PDJLiHE5PkNLRUBJTVBSS1FdZ2xrcI+NhY9zbHJyc4fVwLWZoI2VmJmRjpeRlpaOhod9hoOMlop+g3+CeHuKg4d7i3mBioKXfnR9emtmcHVZXVxQZWRiYGVkXVtYV1xNZG1VUm1tX25fWGdkVFlVSkRCS0tJRkhISEhCSTpEP0hLU1RVXFpbk7i/uL22xb+6uMnKura5tbe5sre0s661tphkdaecrXBeoqycmKCim6SeqqWUn5+Qk46WmZion6agnpqZg6SerKWqsK24sL251NHP19DKzNLMz87Kxr++wsq9wbzBwMTExcq+x82yo7qwtK6aq7i6mIB7bV9hXVpfYlpkY1FbYFNQS0NBRUZFPEBFPkFIQkBDPTpFPj1KPzQ3NTM1Oz00Njg5NzcwMjIvMjQxNjk3NzU1NTVEM0VMTT41MS8wMDY6NDc3QElPSTstJioqKC0uLyxATSsvNTRtiUkwSIl0Pz5CREBDREZLT0RRW1loX2+WkpCUbmxvdHWHs6ugoZ+LmZyZjIyVkZqRhYqKfoiGjJCLiHyBg3N7ioKFe4l0goqGlX9ze3lsbXV7aHJlaWxpZ2pqaWBmaWlsWm1zlq2kvIiGZ1tvZ11ZWlRIS05QSktQS1NRSUxBSkZKT19eYWZpYZe2xrC4srq8tLDExrWvuLCwu6uysaaqt6uMtaedmqeaTpmdjI6flpGmmKWVipOTiZCJj5GRnZuhl5qVloeemqebrK+osKi0tNTU1NbTzNDT1c3Sz8zFwsnQvsnJysnRx8zNws/Rt6/DvMO5pLW5waKDcGVeX19aYVhaZ1pRXVhPUEJCSEVCSDtBQz5BRz8/QTc7RD5ASD00NjY1NTs6Njg3NjU0LzEwMTQ2Mjc4ODc1MzY3QzVCOD8tMC0xMzQ5PTk3LC4sMTtGSz0pLCguMDAwN0s/LTQ2VIhXMESHd0M7Qj5FQkFDSk0/VVlSZVZzkJCYgmdxb3l5g6CpnqaXjJqbl4uNlZGajn2Ji4SNioqKkId8hIJwf4eBhnuHcoOSi459cXh1bHF4fnF6bnhzbWmBcG1jaW1weGl3fH7Lv8Hfp21jeG5jW2JgSlBSVU5ZXk9dXE5QTlRQVFRcbm12gnGWrbers6avtamsu7+wqrSmpLimq66gq7SjjrCtmpeYjJGTkYSOm4GNppGciYOLhIqJhIuElJWYl5SbkZyXmZqfn6uspaiirK3P0tXSzszT1NTP1NHOx8PU0cfN0tPT18zR0cTS1sXBzsfHwqi9t86efHBnX2RfV2FTX1tQUVRRT0g+QEZBQkU8QEE+RUQ+Pz86PT08PEpBNDU0NjU8ODg4NjY0NDEyLzAzNTI2NzY4NTMzOz08RT1AMTErLzI0OT41OTAxMDIyLTJETjMpLzMuMzI9TjIzOEN9XzJBhnREOj09ST5AQ0ZIPFVRTU5adYaFindsd3B9fn+hnp6hjIyYk5OLjJKPlYV5hY+QjYqKiJCGfoJ7cn6AgYd6hHWFk5CIf292cmtzfXt3e3OBeHJrgHNyaW9xenlxer7Lmn6LsYR2coR2aGFrXUNaWltWZWNYZGpTWFxdYGNdY3d6fYuBmKmkpKGfoKelqq+4qqWzoqGtoaOtoaexn4immpOSkYmSj4iBk4lqlKKMmYSBhn6Rg4OTl62LlY2VmY6GkpGel6iwoqGhpaSpyc3PyMLM0dTS1NLO083G1tLM1NjW1tjU19XJ1NrNydfX0cqsw8LLjXVwZWJhWVVaVFxRS0dKSkpAOzo7REFEPEJDPkdCPkJCOzw5PDpHQjQ2NTQ0PDU2ODc1NDMyNTAvMjU0Njc0NTU0NDw+PUU/QTYyLy0xNjs9MDgxLzI1NC8tLTtSMDE3LzUzMkZEMjg+bmI1PYF0TTk5QEk8QUQ/QTtPTEZKWHCAdX1oc3hygomAnJSdlIWLlYmOiYiNho5/eIOTmIqMh4iLiH6Cd3N7fYKHd396hpGVf4Nud3BtdX91eH10hXx5bId2dG59doR0eHudtYw7QIvFpX6MfGllV0lDZmNlY2dqY213W15maGtuaG6AgoeRi5ydoJ2Ql5ieo6OlsaOksp+hpZ2gqKCjsZyFnpKRkY+LjouGg4+Ef5ybjI2ChIV5lH+CqZWjjJGJl5KLfpiLmpKrs5ibnKicp77Dxrm2xs7S0dLQzNLLyNTO0NXa19fY1NnYzdjbzsnZ2tHVvsrLtXp5cGZfW1NXUlxXRkdKSUVFPTo3OkBAQjpGRD9EQ0FEQjs/Ozs3REM3NTY1NTswNjg5NDQzMzQxMDE0NTU4NzQ0NDQ5QD5EQkM8MzMuNkZUV09RSkFKRj8xKiguQlMzOTI1NC83Szc1PGBiQTxzdlY4N0FIOj9DPjw5UUVDSlRrbm5wYnBxdIaNfJeQnYt+h5KDiYaEiYGHfHiFlpaIjoOHhYZ6hHhxenuDhnV5hY6NnHmLcHxvb3p/cXuAcYOHgG6OenV3fXyCdH58hoevc1iqwraNkYJwbWI9XmhycHFwbnh2gWVob3J1eHF6i4aNk5GalZ+Vh4yTmqCanqmfoayboZqYn6Wen6uZi5qLkJGNhX2Ih4OFi46gmZOIg4d+bJl6hJiGiJOMjZSMhnyciZSPrqqUlpifmaevtr2prb7HzMnJzMvQycPSytTX2dfY19Xb19PZ29XQ2trR1sjUy5Z7fWpqXVxRVFRgSUNGSUg+QT49Nzo9Pzs9Rz0/QUFBREE+Pjo4N0RCNzU1NDc5LjU1NjQzNTUzMjMyMzY0NzU1MzQ1OEVCRENFQjU2PEZOU01bbmZjbnNrYVY+LDRMRzg2NTQzNEJGND1XX2hMdXheODs/Rjw8Qjw5OUQ+Q0dSal5tZGJma3aAiHGRkJqAeoCNfoKCgYN+g3t8hJiNh4t+hYaAdoJ5bnt7hoF0eZKejqB2jnWCc3WBfXOAhG+BkIJvkoR1fIGFenaGe4m3xaTBybiBlpuPd3BlTmZjgXqBd4aikIp4eXZ7g397hHZtk5aTlI6XkYOJj5aalpalnJeflp6SkZeinZmrlZCQioyRgoyFiIiBhpCRnpuZiIaMgYWXeoiJn5eQiI2Ki4J9oYmRi7yhmJOYmZ2ppqaun6i2v8DBucfKzs7FzcnR1tXV2dXX29TX2drb19va2djO28aIfXtpa2dhVVlWV05MRU5DOz09PDg6Oz05PUA2PT9APD89PDk4NjdDQTY0NTU9ODA2NjU1NDc3NDU2MTM4NTQ1NjQ1NTdISD1ESkU3OTI1O0g+Ozo6N0lQXVpSVVhLOVQ+Ozk1MzI3STg9TllNSHh4ZDU9PkM9PUA6Njo+PkBFUV9YZWFdW2h0enlsio2Sd3Z6int+gH5/fIR6fYKRiYSFeoSHenV9dG18fYZ+dH+SnpGeg5F7hn54j354iopugpqAdJmGfoGJhHt+kHqPqY6Pw6G9i5yknH2JhH2JcouKfnOmmpyYk4V7jpCIhGhHcaCknYuLkJKFiIqQk5SOnJmSlJCWjYyVn5yUoJSRjY2Pi36Qjo6LhImSlpqen4mMlJKdkYKLgKWZiISNgoWEgaSHi4u4mJ2RlZaiqKGenp2kr7e6tazAxsrQyMfMz9PT0tjT1dfA19jZ29ja2tnZ19u5e3t6bmtoWWJdVFBPSURMQjw8Pjk5Ojo5OTs9Nj8+Pjw9OTo7OzM3RD83Mzc4PjcwNjg4MzU3PDM3ODA0OTc2NzU1NTQ2RlA1RE5JODkzOEFLPTszQ0BJPDlEV048TVRITj85NjMzMz5DO1tYPjVZeXBaPDxBPD0+ODY4OT89Q1FTUlheVVhmbW1taYGOinFyeYp7en98f3uHenx7i4aCfXSDhXlyenNtgH6EfneFm6KbnZSSf4yIf5iHgJuSboeohXqgi3yRjYOIhJx9mpCKjKOioJCkr5+LkIuFi4GThldyrYufq5uPg5ibj4+OXIKikYKMn5OVjIeIjJKSi5SUk46Lj4qHlpqcj5SWkIqRk4aAi4iSjYqKnJaYoqKGk52WoIqJiI2bkIOIjoCDh4WkhoyQs5idkpSXoaGemZKcnqiyuK2mvcLHzcjGz83QzM/X0dHVrtbV2NrY2trX1dnZoHJ/d2poX15ZVVlZQ0FJQz8+Pjo0OTo7Nzo7OjM7Oz89Pjc7OTowOkc9OjM3PUA1MDY3NzI1NT82NTs1NTg1ODo1NzczNUhSN0dPSzk5ND1FSkI+MUZDTEI5ODpHWEA1SFdJNjYyMjM6RUNlWD8mX3lpX3o+Pjk8Ozk4OjtAO0JRS0tTWVBUY2J6bWF+koNvbXeLeHl/eoF8hXt7doWEf3NwhYF6dXZ2dISChH5/kqakn6Wil4qdkJSXi4qol3KKsY2Ep5KEmZOFmYyilZ+Yk4ianqOSqbCfkJSQjY6IloxujbeFmsTIspuhpZucmJaQspFkpM3HlY+Gh4iQko2NkpOJhYqJhZaZmo+PlJOGlJeDf4+LmYiNkKqWl6OjiJmelpqIjoaWl4mEjoyBf4ePpImOlKial5OXmaGZn5mTnZujs7Smo7zBvsfFxcnIycLL083N1KnS0dbW1tja1NLazoR1gmtmYGBfUEtWXEJCR0M7QT04Mzc7PDo4PTY0OTo8OjgyPzk5MjlJOj42N0JDMzI6OTYyNjQ+PTQ7PjY5NDk7NTc5NDRKUTxKUUs5QTdCR0lANjRKRUxGPjw4OEVUQTc+XDg2MjE0OjtFYFhBRmF0aExjWj41Ozo6NTs6PTpFTUZIUldTUkJlg0d1go58fG1+iHh6fnqBgYJ+dnaAgntsb4p+eXx3eHyEhop+i6O0qKSqs6GWp6ClpJaVr6KDkLiVkrOajaGgjKSbr6KknZiQp5epma2wpJeUlZSQi5ialqDAjqPJuKuaoqWtmZGbnLKdhoWoopyYhYiIjpSMipOPh4CGh4iTmJSMipOThpSYhoSRkJx0kZiylZakoYicmZOPipCKlpqJipaNhn2MmJ+KkJCcmpmTmZiglKGdlZ+bobGto6S3vrPFx8S9w8O/xs7KydKnzszT0dDW2NLP2Lx1fHhfYldiWFJJS09FQkNENT46NzY6Pzs8Nz00MjY2OTc3ND01OzU8TDw+OzxCQTc1PDs0Mjc3P0A2P0A3ODQ5ODc7PDU1T01EUFJMOEA9RUFHQTU6SkVORUQ6NkFAQlM+OURPMzIzNTc1PXZcPFJcdGlaTV1TPD04OTU2Nz06SkZER01cXFlKaGE7SISLenpthYZ5fIR4gIWBfXB4fH18b3OMeX2Be3iGi4mGhJKovK2psr2wpa6zs6mjorCsipq1naK4pZWtpJeprbempKOfmamYqqSvsamZmJuUlZGYoJeZu7utyqFptreqsJWYnqOrkpe9pF6qs4KJioyUh5B8jo59g4aOkJSUiIeSlouPlY2LjJeZk5yZtJaVq56LnJSSjZCSi5iaipKdj4uJlaCijZWNl5mdk5yYnpShoJScnaWuqKKks7irwsjEtrq9vMXIyMLQocbJzc3E19bQytOjc31rX1tVYVNRR0Q+PENBQjg/ODc0PkY8PDY8MzUzNTU0NTRCMzk6Qk06QTtBSEI7OkA8NzQ2PEI5P0BCODc0Ojo2Pjw0N1RLQ1VRSjc8OklBREA0QUpITkJBPzZEQTxKTkQvVD0yNTQ6RUpcWEpaUW1ncHBEaWBLSTY3NTc6PkpAQ0lQZkhhYGJwSkCLin6AcoaHfIGJdYKKg35tfXx8fnB3h3eNgYd7jZCMhoyaq8PAsL3GvLO0wby0rKuztoyosq2tvaubu6Oorbm4q6amoqKko6qvsrGqnZyjmJuYmJ6ipaWTo7mvqMC7rK2yuaWjp32IhpytvbCCi4uKkIOPg5GOeoGHkI2OnIiIj5eNipSXlJCal52nmrCakaudjpqPko6VkY+Vl46RoJCIlJukrJSWj5ScnpShnpuYn6CVmp6np6SipLCzpsDGw7Cwu7bFxcO/zafHw8fDvNXQzMTKinZ2ZF9cYl1PTENMQEVHPkE/Qjw6ND5BPT01PTY+MzMzMjQyQTE3QEJOPkdAQ05DQT1DPTs4NkNDNUJJQjo4Nzg7NUI+NzlWS0RXT0Y4PTRLQEM+NEVLSE4+QUE2QkI/QlNFNThQMTQ1Ozw4O0Q+OUxqal07V1JkS2daVU83OUdFP0NGXGhGX2lnW11ck4yMiHuHi4aDjHWGkIqBbn57gX5xfoF6lHqSlJSYkZOVqLTHycDCzMLDuce8uq+rubuXsra6ssCvpcCjq7C8vKquq6Oinqesr7WxqZugqpyinJafsLOnjKK6urXBu6uonLKko6iUhI6pxMSkgouOhoiEhpWUjHqDjJGPkaGMjJSRj4iXoJiTmZWXpaCunIyqnI6Wj5KRlZWNkJSRj6GThpefoLKflJuUoKGZpKCaoJuglJiep6Smp6SvraW/w8KuqLe1ycO+ts6yxL7Du7PRycjBtXd7b15bXmxUTklETUtLSUBBPUJEPDVBRDs6Mz04QjMzMjI2M0EwNUlFTT5JQEhSQEg+Q0A7Pj1GQTVBVUA7OTk4PDdFPjg+VkpDV09HOD80TEBCOzVKS0NMP0I/PEJGPUFITDkrRzwzNjc0NjRBPzdPYU9hRS89PjZrbGpgQDpIPj9FQmdcTWVcZlRjapmNlomLiJKPhol5hpOQgXKAe4x/d4aBgo95jaGWqJqamLu+ycjKwtLJysLNvcGzrby/p7q/vbzEuK3BqayzvL2qsKqkpaOsrrSutrWgn66fpqKZo7S8qZupvMGjtravq5Ovq6qsloaaqqelkYKMkqSViYB1iZF5hY2RkJ6fko+Ui4+MlKOZl5uVlKKeqZ+RpZqMj4+QlZaIfI6VkpKjmpWgopy1ppCgl6Wko6WfnqaYnpWXnKWjqKiisqyou8DEr6Wzt8zAuq7Ds7u9wbmtwsLCv5lwe2NbWV5dTU1OS0dEQ0hCQUFDSzo0REg6OzQ8N0YuMTIzNTJCMjZTSE48SkJKUUVLQ0RFOkVMQjw3RVY9Oz04OT88ST86RVVJQVdRRjdBOks6Qjc5Sk1CSUBDPjxERzxCQ089MjBIMzY2MTcwPUI6PWpqSks1UVMzU3BwZE47RD1ARj5sSV9YYVpkZVeekJ2Ol46ekomKf4ifkoR4hX+Ufn+QiImQgJahmq6no5jDvsnEyMbTzc7Ny7zCt7C6vbS9y7vDwba3vK20wLm8rq+ooamotq6uqbK3mp6soqiinau3t6mlr77Esb24s6eqtLOtrpaVpa2ooJGOkrHFp5WNfZGVfYeRmI+qmZeTk46TlZOlnZOdmZSgoqGcmJ+Yi4yPkJ6IWo+Wl5KWpJlmmaOes6WWopasraynnJ+nl5iWmJaho6imn7Wrqbq7w7SmtLXLwbiqtqyzu7iuqLi6vLeEb3BcWlZXUEdMVE5LP0FIRERIRkY4NUZNOz43PkFLLjMyMDI1QjU1UFdOPExGS1JMT0dHST5JUT86OElTOzs/Nzk+RExCQEhTS0BXUEY6QT9HNkE3O0hNQ0U7Qz00RkU6QkFCRzkvOkEzNjAzPkdEOTQ9dGRNRztFKzpmfGhWPD5AQkZCc0ZpSVJmY01GppSclqGXqJaMkIOHpZKIgYeCm4ODlZCQlI6aop+vvq6hx77GxcjHzs7P0sq+u7axu7u8v8+1xL23ubezsrazuLOsp5yrq7mrqaivr5ejrqWopKW1wbCrrLS+w7nAuLOnuLS3sq+VpK2wr6SLk5SgjXPBmX2XmYSOlpmLsZWamZWSkpmZpaOVn5uWmqicm6GgmYqMj5adYEqWnJqVmaWXVJawn6+cn6WVr6+tppuhppSTmZmOnZ+moZm0qaqzvLy7q7Cyx8C4pqyrrbGxo6GysrSlc3FnXlxQU01GUVFQUTtIS0hGR0FDPTlLVD9BOj1FTS83NTQ0OkIzNE5XTjxKS05VTlFKUEhISk9CPD5NUjs+PTg6PENSPkRIUklCV05JQENBRjM+NThKS0NBPUM7NUVBOkE/PkhANSpCNTIsPmNdZzozNXRkZUBSNyYjM31oWDw6QkNAPVJFV1NzYlZGSKuXmZ+hqK6YkJeHiqeWjYiShZ+HhJyXjp2gmqOktcm0qce8w8TJy8nIzM7Hvrqzr7q4wMHNtci6wbm1urKvr7O0p6ScqrS1q6qnrayZpK6mpamsusCoq7e2vsHAvreyssOwt7yso661rbqliJuXpZp1vp+EmJ2Okpiai66WoZybl5San6CpnqegmZqqmaGnnpeQjZGdg211k6KalJyjn5CtsqKrlamqmKqvpqWhpaqTkpmciZWcop6WsKepqrq3vrOyrr65tqCjp6ilppycrKmpjWZoY2BTTU1HSU9KVUw9TUVNSUpAQ0Q8UVU8QUFCRE8xOD03Nz9CNzVVWE4/SE5RWFJQUVRKUUpKRUFFTVE/Pz04PTtHUjxFRFFCR1lNS0FIREU6OjM5S0lCPkNDOjlDPjxAPjs7RzctMj4tMYJoTnpcLzBraGA8PUJCODZ6Zlc8Oj0uLlNhTVZIfmVeSEaslJyhn7uumJSei5Oqm5GRk4iqjIahnoyjrJSjpLbHvbTCu8PCyMnFws7Iwr25sq+5tcDDyrbGscG8tbusqa2ssKOjmaq0u6aqp6yqnaivqKSrqr68qK28tLe+xry2tbjAsL2/s6m1t6y/pY+il5Chn7yeiZqgmZednY+2n6mcpaOam6Cap6WzoZudpZyoqp2YlI+Um4uWiYykoZScop+gtbClppOxq5qrrZ+fpaSqkpaVoISQnp+clqmkoaG0tbq2rai1srKenKKmmpeVmaqhnnhjX2FfTElGSE5RSU5FRkdCUUpIQERHQVZTREg8QUdRMTtCNzpCRjc5XVlLQUxQVFVTTVdSTlVKREBKSk5POUM/NT08TlFDPz9QP0VaTUpBS0RHQDUzPUlHPz1FQTk3QTs8QDw8M0A8Lyc7KkiRQjpTSjAsW29XNzE8Kh1CgGRUNDktMTpoXUZEQ5xwYkdFqJeknp/DrJuXpJeZqJuVmpqOqpaVqKaVrayZoqu3xcK8v7fBwsDIxL/Nxru+ubKwubS+w8i1v7C8trq3p6Srq62hoZurqsSipaispp6rr6yiqqi+uKatvrC3t8a3tLi4vrG+wLa0srWvvqOWo5WTmpOtn5ChoaSio56QvqSonamsnJygm6afvaKYo56iqaugnZWNlZ6TnoeOhI2TnqSgnbasppyWsqaZsKignKufoY2alZ+EjqGanJKlpJqYq7G1saqlqq2sm5igoZKOkJapn5RpZVxiXlBKSEtPTEhFRElAPU9IQDtGSUhbUk9LPUhOVTRCRjg+SEc1Q2JbS0NOUlVXVlFYVFJVSEA4UVFQTTpHQDRDSFFTSUM7Qz5HVktDQE8+SzwwNjtHRj47RkE1Nj85Oj85OzE1RDAtLTBNdlw0S1o1LE1uVzwtPSkeI3piUTVDS1E5b1JGPEt4ZmNYTqObo5uexaugnqudnK2fkaKelqSfpqqrl7axo6mztsXCvcC2wMK8ycK/ysi2uLW0sbS0t8LGt76xuLS6tqCnrKqrnp6fpaTBpaGqraCkqa2woqaovbWlsbu3trXDsrK3ur6yw8C4uK20tLWjnaSUkZOgrJ+YoZ2oqKqimsKsqJ2srZqanZimoL2hnaSYq6urpqCZjZqfkp6Ijlh/lp+moaC5qqaUmLajnrOioZyxmKCPmpWego+gl5aOoqOVkKWus6upoqKlpJWVnJmLj5KTpJ+JY2dcZWFNSktLT0ZFQUdLPj1JQTk5SkpOXVFRST1MVlw4Rkk9RE1JOEhjXEtDTFBTWVlWV09aXklBPVdRSUs/SEA1SE1YU0hBOkBBRFBIPz5RPks3MDk5RkU7OEc/LjY+Nzg+NzcvMT85MSUxUVVtW0pPMTA9Z1dEMTc9LSt3YVM2U1prV3NIRTY9dWVcTFCfn6CYnsOnpKKzoJyyp5Kpo5+jnq2prJ27samstbHIw8HDs8LDvsfEvcTKvbCxtq6xtbDAxbW6sbC6tq2aqbCpqZuepqGnwq2crbGcqqKusamkp723pra7va+3w62zs8K/ssazurertLatqqKmlZWUoquhn5+Zp6uvr6+7sqWfqamZmJeSoqS4oKGjkq6vq6SlnpGhnpSdjpCNlJ2ao5+otaenjZi0nKOvm6CcsJGhlJiVm4CSopaPjqCgk4umrLClp6KdoJ6SkpqUhYuSjZyfgGRoXWhmS0pMS1NBQ0BIRzs7Rj44OU5NVV9SU0o+T15dPUhQQk1MSThOZF1MRUxSVFlbU1VPXGJIQT9aUUFIQUtCN0ZFTEtOPjtCSEROQj07TkBBMy85N0NCOTdGOys2PDQ2PDM1LS80QDErJ1Z0U2VPPzEwNGJbTTIzPjA8d11eP1tVX2dyQDg8SJZ3ZUE0n6Sem6DCp6OpsaCjtKmVsaumoqSyrK2pu7KtsLW0xr/ExLa/xL7KxbbAycK1rLWpsLmswMS0t6+ttrqlmauyrKqYoaeYrbu0nKiwm62frrSxp6q6s6e5s7iyuMCqt7LDvbTFp76urbe1qaeroJaWkaWkoaGXl6Sut62xtLafn6mkmZOUk6Ogt6OkpZWusbKlqaWhnpuZmpWXqJ+emaKfr7Oipo2Yr5qlq5ebn6eTnY+VmZqGlqCVjJCdnpSLqamqoqehmZ6WjI+ZkIGGlYiVn3plal1sa05RTk5UPUNBTkM7Okk/NzdRTl1fUlZRQVdgXEJKU0hWS0g6VGRdTkZPTltXW1JQUVhdR0FCW1BCRz5OQzlIR0hOUD8/Q0lCTEI8MklBOTQxNzdCPjs3RTcrNjkxNDgwMi0vLjw2LSNCcWdzazIzLzFcY1ozMzkwNnBbYkgwNUpxaVZDV0aMeWZDO6SknKClv6aorq6gqbWqnbevq6OqtLaxsLi3sLe4t8S9w8e9vMPCx8G6wcbBuqq2pa27rcHDt7eqrbK8o5Wtsa2yl6aokaq5qqGnsJ2roK+0s6qqt7Wsu6yzsrm3rLiwwbq9v6bDqrC2rqmrq6admJiqoaGgkZegsK+zq7C5mZupn5mWkpemoLeppaKir7Gzq7Gnq6CcoJ+bnqWdoZido7Swm5+RlKaaoamblqOhmJqLlpmUlpedlImSm5mUjqmpp6CjnJibk4ePmYt+jJeGj5tsaW1ibm5YUVFaVEFDRFRAOztIQDc6WFBkXlBXV0RZXl5OTFNOX0xKPlpkXk5JUU5bVVlQS1NXWkk/RFhQREY+Tj89SUdHUVBCPUNGQk0/OjJEPzc3NTQ3Pz05NUU0Kzc1LzI1MS4tLiwxPionKz1ccD0+MS4xZVtkQDE3NDdnWWFGKEA4bH1oXFY6iXtjQz2on5yhqLygqa+qorG3qKS0saqhrbW9r7O4vLu9t7bAwr/JxLnEw8DAucW9wbivtqirt7K8v7+0qq6yuJ+XrK2orpioqY6nu5+lrbOeq6KxsLOsqraztbytsLG1rLC0ssC6xbarvK+xt6ytqaOxpZ6kqJ6jlo+Yn7Kqs6mqs5mdp5ualI2gpqS0rqehrKytsaeyq7Gpo5ueqKSelKCZnKi2qZeak5KfmZ6hn5KtoJqah5eZjJ2anZSLj5eXmpenpqOgnpaWlpSBkJWFe4+Tg4yXZ21yaHFzYEdZZlZEQ01YRFo5SEI1Pl1RaFxOWl1HW15dT01TWGRKS0NcY2BQTE1OWFdYUEpWVldMPUVVSkVEQU0/QUZISFFQQTtGREZLPTg3Qj02ODcxOT48NjVEMCs4MC8wNS8qLC8tKj0sKyUyKyo1SzEuJ19fYVYxNTE9YFZfOClDM1lVXGdLNYx6ZkxApJqgpKu2o6uopK6ttamus7imp7C3xrawt7/Bwra0usW+zMW5w8G6wLrEuMG6s7Wsqrq4u7q+tauvsbaZmKirq6ycrquPq76eq6+xo6qfsa2zrq62sbi2qq2usae1sLO6vMmyqrW0sLSwrqags6CaqKygpJWVmpmxoq2gpa+WoqSamZKMoqWnsqmhprGsqrWkrrC0r6OZna2nm5eempmsuKKXk5GPmJyhmZiVrqGfloKVmY6enJqXkYuUk56ZpaOjoZmXk5KWe4yRhXuNi4OMk2xueW92fWJGYGpaSUhaWz17SkdFNkFiVWlbTVxhSlxcWlJTU2JhTEtFYGFgUE1JUFdWVU9HV1ZVTjpJVklIP0NLP0VESEhRTkE/SEhIRTw3PT46NzU2MDk/ODY2QiwtOCwvMDQsKCwvLSo3NikoOS4kOks1LiJUYFZhLjUoQ15RXC4rQS9KR1BbRzNjWFRLRZqWoLCnsamspKOurbSot7O3o6y0t8m6tLu7wL60s7fDwMzHu8S9t7/AwLjAvbK9rqi6ubi3wresrrG5lZenr6yopLOplK+7pKyysqano7K0sLKxtLC3sqmuq7KmuK+1s8TFtqm1tauwramnoraen6awoKOUm5mUsJ6nm5+pjaminZuVl6WlpLenorCzq6exp62vtaykmaCsqJycnZyUqrmclY+PjJido5iRmKikoJiFk5eRnZyYl5aIl4+Xm6idpaGSlpKQlneEkYZ8hoKEjY1ucXh2fIBcTGVsXEpPZF0/YntHSThHZ1dmW0xeYkxZWVdVWFVpXU9QSGFeX1BKSFFWVVJLSFdVVk04TVpORUBGSz9IQkNLU00/P0xPSEA7Oj47NjswNDE8PTQ1OD8pMDcpMS4yKSksLC0rLTkkMDQyJTlCNy4jQU5IZzI3J0ZhTFYlLUIuPUVMUTwzcmtMRESRmaSto6ytqqajsLKyqrewtZ+rtbnJuK7BvMO3s7G1wsPPxMDCvrW+wcC7v7y0xKiqubG2t8C8r6y0tJ6hp7GupaaxpZ6ytayqsrGrqKi0uqy0srSrs6yqq6isqbmtsrDHv7ikubCpra2mp62wpaSjrqOom52bmq+ZoqKio5Csn6Ogn6GppqW4pKu0tKSqq6isrrauop2jqKucoJmbkqS1mo+JjoiRo6GWj5afopaVhpCVlJ6bmZaVh5iSlZmnnKCgjZOSjpF4fo6EfX19h4qKcnRzf35+XFNjbl5OWmddRkSWW0c6Tm1YYlpNYWJOVlZWV1VZaF5RU01jWltUS0dPVFNOR0lWU1xOO1BeSkJESEpBRT8/S1NPPjpOTUM8PD45OjU9KzMyPTYyNDk6KDQ1KS8sMSgpKywtKiY1Ki8mMCkzODoxJiozRGQ7NipIZEhKKzpJPzNDSVMsPo9rP0hJkJupqaGpr6Sno7OzsLS0sLCgq629zLquwbzHsbSts8HD0cTGv8GyvsPCvL+4vcWorbestLi8wLGssq2ho6euqqilsaOqsKquq7Gurqyrs7qmt7CyqbKpqqalo626rKqwwrm0rLmoqKitqaexpamkoq6qqKGem6OslaWdmJ6Zq52hp6ihrKajray2sLGgqaKfqq2wq52ep6epmqOYmZCgqJiGg4+Li5+gkIyOl56SkYiIkpahnZaZloaXk5SXpZyenYySkI6Kf3+IhH13gIeFh3V0col3bF9ZYG5jUXNxXEs7hHtGP1d1WGBZT2NcTVVWVVdRXGJfU09PaFlXVktHTE5SSEVJVlJdYzxQXUQ8RkhIQkc/PUpQTDo+T0o9OT89Mjo3OyozNT4xMDQ4NSg1LyosLjMwOyksLCclMjM0JCwyLTg2MCkoMTxeSzAuSWdERjg8QjA1RUtYMUCUXUBORpWWrKegqbGbqKiwtay4ta2ppKuqvcm8sb64w6+wrLPDxM7Ow7/AtMDExLrBtcnErK+3rrO6wL60rq6spqipsammqbKmtK2qr62tsa6yrbO6pLizrKytp6ugo56wt6uqrbm2pLW1o6mnrKyqraCopqexsaSmpaGhq5aqoZOboKWeo6Oqo6yinqaxtqysoqWjmqmrramdoaWkpJmgmZaPmJ2TgYKQiYWdoI2LkI2bkJKNhY6ZpZuTkZuMk5KSlKOanJqLj4uMfIeBgoJ7dYGEgX51d4ujh3hqXmBuZldmh2ROQGeSTERieldiWFJlVU1WVlVUT1xdYVZMT2pXVlZJSkhJT0JHSVNRWW9BTVhAOkpHRkVHPj5FUUg4Q0tFODdDNzI6OjoqNDk/Li80NjMpNCsqLCsuIzQuLSsmKCs3OSomNis8LTIsJjA2WFouMEpnQUE8PEMrOkpPXjREhkJJSUSWka+koqmvmKmorbWqtbCqpKuqqbzAwLm5tLy1prKvw8nL0b/Bu7nAwMK6wbrCxK6xtbK0vMG+s7Guraysp7eqpa2wq7iuqLCvrrGrtaq2taa0t6yspKmqnKSes7OoqKSztJ+1raGpqKuoq6efq6uoubapqqqpoamfrZuRqqGdoKOjpqKqnpymtK6npamipJekpqeqnKKko6CZmJ+Rjo+ZjX6HjIeFnp6JhYyLkI+SjoWIlqOajo2bkZKQj5KfmJmXjYuEgHSHgX9+eHWDgHp4fn+InY9wcWZncXhcYXSIak9dmFZIbXlVZFZSYk9MVVVVUU9YW2JWSVFqVFZUR1BZVUk+SUhPUVB4TU5WPTxLRD9AQTxAQ1VDOUFLPTU7RTEzOzk3KjQ6PSstMzQxKjgqKisqLCkqKC8qJiklMzssJDIpMjAyMSUvMlJjMDI/Zj1OWD9DLD9MVF8vSWs3UkY7lY2voKWprJmqo6yusrSvqqSvqai7v7zCsq+5raK2r8jHyNHAv726vMO9u8PBv7+vsbOytr28wbKytKu0qaW2qaWts7K4r6KttbGvsbmquK6qrrerqp6qq6CjobWtqaGfrrKhtKqeqKero6qhoaytqL2uq66toaenn6uZj7CimKKgqKeep5uYqbCpop+soaGSoaKjp5iaqKWYmJicj4uHlYh8jYaEhaSWhoODjIeQkJKFh5WhlomRnpGTkI2RnJWYj4uGhnh0gX99dHh5gHt0dHtqgoikdmleZWyBdWeIi3xSVnBeSnhzVGRTUV9NTVNaZk5NV1llWUdTalJRPkJOUWFROklITFNJcVFMUzs8ST87PD07QEBXPDw+SDczQ0IxNTo5My01OjopLTMxLS02KSgrLSw1MiMyKScsJS47LiYxLjAtMTQlLDBNaDozOF89YWQ/RjFDUFtbK0hQO1lDM4+OsKCkpaqipaOsprSzsaiksKequL7BvbCouaqnrbDJxsjQwr2/vbm/v73JvMK4sbC1sbq8ucCztLytuayjtaanrLG2uLKmp7m1rbS8r7ulra21q62cqa+kn6SsqqicnaqypLOomqqnqqSpnaKpp6m9q7Owrp2po6Cum5qzopalm6Wkn6WamaiqpZ6aqaCbkZqgpJ2Zl6mpkZmakpCLgo+FfY+DgIiej4eAfoyIkpCRhYKUm5SGk6KNlJGLkZuTloeKf4Byenl+fGh2fHt1cHJ+aoZ6hYhkX2hjcoV7bWd5XV5WQld7bVRhUFJZS0xOcHRdSVpbaFlGVmdPQz5LTkRDQTlIR0tTP2phSVE4PUg8PDw+Ojw/VDY6P0M0NUg+Mjs1OTAyNzw1KC41Ly0xMSYvPktJMSUaOTAlLCwwOS8sLCs2JzE3Iy0vR2pJMTRYPWZiQUo3R1NgVSo9PEZcQCqOkrCZn5+ppKKhq6S2srGkqbCmrbnCvbewpLmsqaiwwsjJzMG3vb+1uMG6yLXDtbSztbK9ubq9tq65tr+torOmqquutLe0qZy5u6ixvrK6oK60tqmrnq2xo5ylqKmjnZuksKavoZ+qqaeiqpyjqKCtvKeusa6hqqKjrp6erKaYn5qhopufm5mjqqKamqOjlZaTn6GWnJamrIufkY+RjIKLgICPgXualIyJfX+Mh5GQjYqGk5iRh5SjipKRh5CZkJSBiH16bH12eXhienpycHBzeGqCdWuCZ2NnYW5zjm1iam9fcEFdeWtWXk5RUUtJTVNZVk1cXmxXRVhhT15QSE1ERjs3SEVLTzxyaEpLOUFFOzs9PTs7PUo0OUI8MztHPDQ/MTgtNzg7MigwOS8sNS4uPS0qTD4qHTQ5JicuMzQuMCsvNCYsOiQ0MEFoWjEzUz1lX0RMNktWZE4pPTNSXT4jkZarmJ+Xp6Khn6ejt6+toq+vqKu4wrqzraC5r6uns7rHyse/t8K9r7S+t8S2wrKwubGywLa7vbequbi+qqS1p6iqr624sKiYuLyjrb60tKGtt7Wmpqiws6CepaWnoaSZnqynqJ6gqq+noKaXoqifsLifo7GvoauhrKScpqaompubn6KVnJuanammlpueqJGYkpidk5mWoaqQmomNkId9h3+Cjnx8oYyMiXqEjYWLjo2FiZOajomVn4mQlYKMl42RfIV8dHB8cXN0YHh4aW9wcXBrf3NkemxoZWRhZoeAYFtyanJNToBpWFpNUUxLSFBSUEdNW19vVEVZWlJnT0hLRUY1NkhCTEk1WmVKQDZFQjk6Pj0+OjpDNTk+OjNARjwyQDIzLzo7ODMmMjwwLDg1QiopLUMqLDQ7Tk5AOzczLS4rLTcqKjwlNTM9ZmQyNE0/ZV1GTz1SWmdIKj8wXVs1KJWbpZiclayfnqGkobersKO0s6mpusS3sq6huK2tq6+1xcfAt7/BubC0vbe/u76wrL6ws7+xvMK4qbu6uKeotainq6+rsq+kmLu2pKu6ta+esbivqaWnr7KcoaSgpKOglpuvpqGfoqivoaCik6Okorawoaaxq5+so66XnKqlqJ+Ymp2jk5qbmp2lqpqbm6WUlJeVnI6Tl6KooZCJio+GeoN+hIt5j5eKjYd6goiEiY2PhY+TmIyOlpmLj5Z+hpeMj3qBe3Bydm5vc194d2RsbGxqaoVvZnJpa2ZoXmRzgWBba3ZpWkp/XlxYT09LSEhSVUczOV1ebFBFWVVZZU1JSUVFMDdGP0tCNklKSDs2Rjk0OT49PDk4QDg7ODo3QEk+ODw0LTM8PDc1KDU+MSw7QTEoKzY8IjhSPSoxMTM+RDUsLSc0Mio7KzEzOWNtNzRHQWZbSFREVV1oRC48MmRXLDKUoaGXlJuqnKOhoqG3qq2gu7elrL3FtLGvo7WvrKyutMPDvLO/urexs7m4ure6r67As7S5r7/At6y9urWmorKpp6mxqq2xoJm/taSntLWonrK8qailqbCsmaKnnKSllJegsqSZnqOoqZyin5KkoKS4qaSnrqaepaGokp+poqGhmZudn5GZm5afoaqbmpihlJGUlpmNlJOkqKSQiYmOhnmEe4SGfZ2NiYqHeoGEh4iKkoWWk5OLkJaUjo2Ue4OYj4t3fnxsdHJsbHNhd3RoaGpnZ3CHaGhpY2ZpaWBqY2poW2Z7Y2BTdFRcW1JMSkZJT1NAISpoXmlMRFdVXmBLSUhFQy46QjxGPDZLUEQ4OkQzNTc9PTg5NT86OzQ+OEBLPT45Myk4Pjw6OSo2QDMuRTQoKyw/MC1OPy4rLTcsMTE5NSwmLjUtODA1NzZgdEEzQ0RnW0tXR1VgaEIzNzlnUCcynqKjkI2kppqdnp2jtK2nqrq2p6zEwbexrKO2rqetrrbAv7yywrawrrK2tbi2tq2qvbOusrG8v7euvLuxpZ+2qqWls6eprZ2cwKunpK+yqay1u56oqquxpZieqp2mpJGYpayimJ6kqaGcopuWn52ntaawqq6hoZ2eoZSgpp+hoJqbmZuSmJ2TpZ2soZeWnZOTjZWXi4+Ym6ifkYiJi4h4hXaBgoGdh4qCin1/hYiHhpGElpSQjo+RkZGMk3uDlY+Gc35+Znlva2prZnRza2NnZGR2gWJlZmZmampja3JbX1lebWRhTmlYWmBWSkdIS01SWD45X2xoSENVVF1bSUlHRkEuPD85QTg5UkZANzpCMDM3PTc2OTI6PDk3OjlETT1CPDAqPEA7QT0tNUIzNz0rKiwwQipKSy4vKiszNzIyKDU3JCs3LjcyNjg1XXlOMj5IaVpMWkpWYmZAOjNCaEglNZqjoI+MraGXl6CWpLOxorK9tqGxxry6sbGjt6yqram4vLu6rcCyrq6utq6yuLOpq7mxr66ztrq2sLi9rKadtamfn6+jqa6cob+gsKOusK63rrWera+trqKZnaeppZ+Vmqeln5mkoqidmp+alJyerK+muqiuoqGam56ZnqSapJ2Xnpebk5ifkqiVqqeak5qakoyVmY2UlJqppo6NiomOe4FzgYGKmIWHfImJhYWKjImShJSbk5KPkJGXjpB/gI2Og2+Bf2Z5bWhraWZxcmtcaGNjdIFiZmdqbmxna2pobl1sbHNwYFRjaWNmWUlGTE1PWFFRVWFlgFVBV1NZVEZIRkVALzw9Nz82PEZOYTg6PzI0OUAzNzgyOD83PTg+RkpARDkyLT1BPUE9MDVAOUAxLSsuMzw7SzYvLissLTI0OzYjMyopNi41NTQ2NVp8XTE5S2pbTVtLWGRkQEExSmZDJjSRoZuNj7CdmZOhmqmxr5+5v7WgtMK7vbqxprevp62kt7e2t627rqyqq7aps7euprK1sq6psLa2sLO2uqeon7WonJ2ooKismqe9mKyjrq+1ta2tn7GtsKmim5yjq6iclJympJ2aqaKklpqfm5Cbo6qrqryfp6SgmJqZnaGPa6KWmZxwgpWao391kamnnpSUnpCIl5mAloqhkHmHlIyDbWl+doNxbIaLhn2FjIdwXmNhZ4SYhWuLjpSSdHeLhH6DkIBnh4BndWhlV1xoc21OUGpjZ3OFaF9lZm5tal5fYYqPg4RlTktEOUdUaF5KR1FQVFVMSFJgb3RlRltRVVBGSEVDPjE7PTY9NjwzZlw1Ojw3NTtENDg2MDpCNz86PkZMQ0IzNDM9QUBAPTI4QEU9MSwrMDg9RzcwMS4qLiovNTY4LCMxJzIxNDoxNzVYgWwxNk9rW05cS1tmYj5HMVFkPSouiqOZhZWwm5uToJuqraqjvcWvqbfCt729raa3sKWqorazsbKxuayppqy0pa+0oqm3traop6y2sq60rbOhqZ6zqp6go5ulpperuZSlpa+zt62upamuq6yloZ6coaemm5egpaWam6emnZOen5eQnaippLawpKOinZaYl5ejiKGOkpqGoIeTnKB/pX+lqp6SkpqRiIRyeI2OhYihdoiMaZeIZn1zeKBviIeDfo58f6GgoJmAfIeedIeOdZuKbIeBg21pZWN6bHJhU4VtYmxpmHFYaXFwiFheaVtsbFuIcm56coVnhoRaX0dOP0dfTUVSVlZRUVNXVGddTVZIUlJPRkdHPjw0OT05PDc7MDw8Nzk5OjY9RjU4NjA8Qjs8OT1GUUc9LjU8O0A9QD41OUdBODIpLjE8STkvMDEuKi8oLTQ1ODMlJjIxMTU+MTw4WIN1MjVSa1tOXExcZ189SzFXYTcvKIqmloKcq5yYmJ2fqamnqr/DrrG6vLbAv6qlt6+prKSytK6us7aqqKWwraW0sputtba1pqeosrCssqetnamfsaefoqKZoKGarLOUo6SltbymraerqqyopqGgmKCmo5mZpaOkmJykqZaTopyTkqOlpqG3pKSgo5iVk5eSnIivkJeUiamLlqGchbGAo6ydk5mdlHmC1KiAh5XBm8d5eLGlt5dkgMCcv3mEhHmRhHyQkJHKcpe8nMV6crWmu5B7gG2WsauweWhsWLGubmVpvZK8bmd6b3KP2H5Ta2O2sn+BcpRzmqGqkFdPV2JPVk5GVVtYUVBSjFxXW1BBXERRTkVHSTw8NTc9Ozo5Oi49Ozg3ODs5PkY2Ojc0PkA+Njk/RVJJOi41PjpCPD9BODpKPjUyKjIyQkUvLjMyLisvKC0vMTg2LSAvNDE2QTE9OleDdzIxVGtcT1tNXmdcPkwxW100MSGMppKAp6qfl5yepayyqLDCvbG1v7W2vsGrp7OsrKmmrrOprrazp6emtKWnt62cs7K2q6Wkp7GtrLCmqp2mo7CioZ+dlpqenK2rk52in7S6o6qpoq2upaGdmpqip5+Xm6egn5iep6eRnKaak52hpqKhsaOfn6OWlpKXkpmFr2tqio2qfmaDlYatZHCdnZSZppRxrqGkfni7fWuhj3axX2q0W6WAZZyRYGaCe2Z/anhrqWW+cmemjHWxanyxeHSSlGNubaduW4SgRWhmh5ZFdZxgfmd8pKeCWl+Mq2iAlXh5aqc3Sq9cWFNsZFtLTlhfXFdWO06JT1dXL0lUU0pDRkY9PzQ2Pzs4OjkwPTg5OTk6PTxEODs6Nj1BQDY8QEhRRzkwNzxBQz5ARDhARz0xMy0zM0UzLi41My8rLyguMC46NS8nJDIwM0IvPTtVgnYyLVZqXE9ZTF9nWTpNNV9ZMzAbkKKVgq2npZ6jpKqxt6y0vb+vtsSyt7rBpqmwqq6oqK+uorC6r6OkrbKjqLinnrOzsKOloKmsr6uvpqeeo6Gvm6KalpWWmZqrpZWaoZ60s6KrnKOtraCemZagoqicmJ2jn5uZoaakj5yimZagn6qepqagmp+hlpWRlpCahbWbtXiFqZm1mXaGs5u3fpOWlqmUfmuBpnuChoiSlJJ3q2drsVyreo2GlHSJco+GgH+IkJd4goKLmIuDoI+EsHZ3n3FsbGx8i06kWEhiYpl+Y2imYHlydVOTh15QqW1jcX6HgGKcLlGhb1tTa2hgTEtbZFhcWkI+sXlXWEEjTWhGQ0VBQEExOT44ODo4NDs6OTw5OkE6RTo6OzY6Q0I4PT9LTkc6NTpBRkJAQUQ8RkQ7MDIwMTtGLDAuODQwLC4oLzMsPjgzMR8vMi1EMTw8U31uMytYalxPWE1fZ1g3SjhhVDUwG5WglYizpqahr6mns6ypu7bCsLvBrbi3v6msra2tpq2xqaCuu6qgp7Sso6u0pKays6ejop6nqrGnsKeknp+frpWemZSVlZedq6CZmaSotK+iqY+pqKqbnZWXoKWomp6cop6bn6Olo5WbnpeZnKKpm6aZnJuioJeTkZOTnIPVk5m5cLDBfsWGfNaUm7t8mpWlj42djaR7joejgqWCeqx5j51Wr3qIfp9quVq5doaDfaaCk3yYeqp4jZ2PerFujoR0kbyFb5RQr6fFilGgemNgqWJzcohtl4hgU7W0yIaAiXxjpDNCnXZdUGppY1BAWGdaZGFKSE1uTlxRT1lmWUNEP0U/MD08NTk7NzQ8Ozg9OjxDOkY6Oz42OkBDOzZAT0xIPDo7REhDQkNEPEVGODEyMTFEQy4vMDQ4MystKS4zMjM5NzEjJTUqPjM9PVF3ajYqWWlbS11PX2ZUN0c6YVA3MSWbopSZsqioprSqpbSppLy3wbC5v7G1tLqytKexr6KwsqafrbWnmqe5raKvsJ+ztLChpJ6fpqmwqLSoo5udnaqVmJaVlpSWoKicmZanrbCpo56PraKolp2Xm6CloZihoaGhmqGip5ueoJ6UmJqmoJunlZubn6GYkJKUkJ2Ism5otXGrh26OpnK0c3K2e5qXpIuPnY2jf5GhpX6wdoOR0tJ2XK57hX+kb5uqpmuGhHytfZeZjnuwcpKdjnizZZd0hJ5vnmaUUciLWsJcn3liX61gdnOHYpeIXlnKnW+/gXVNS7VTVcZkVFFqY2VYQU9rYGxoUFZHSTk9VVJaV1hJQz9KPDI/OzU9PDQ2Pjs3Pjw9QztHOTtANzs+RDsuQ1JKRz4/PElKRkNFRD5ISTkxNzQ2QT4vLjI0MjUyLSkuMjYsNzQyJh82MDs1Oj1QcWg5J1dpXEJPVF9lUDVHPWFMNjIwoZ2SpbCso6u8raa0pqe2u7yyur62trS5uLKltLOgsbGinquvpJemua2ksbCbtLiqoKWdoamksaesqaOZnJmnnZWTl5eRkaGmn5WSpaqwpqKWk62gpZKUoJukpp+VmqWmoZqin6yZoJ6ekJWboZ2cpZWdlZqin5WYlZGbhax7d6h2o42IhqlvrYqCp4OYmKGJkpqLon+TmomuhX+Cs1xys1KufYKCpH9x1314hX6OnYWamnavhomRnId3tGGaZZqCgpVtklqwWEuadZh5ZmCtXnZ3iGiYiGxdr3eVno94bDV5yK6yX0JUb15nYEVQbF9wbVZWTS5mZGlTWVA7QURATDo1PzkxPTwxNj85OEA9OkM6Rzs8Pzo+PkU5LUVVSkVAQzpNS0pCSEc+R0s5Njw0Njo+LzA0MzMzLjIuLjE4Ki4zMiUhMDM3Njc9UGtlPiZWZ1xAPlZfY042R0NgSDo5OaCelaC5sJe0wq2os6ipsrq3s7e+uLextLq0pLeyn7Osn56oq56Up7WrqK+xqq20pJupoJ+nobWmpqmimJ2UpKCTkpuYkZShpJqSkKatr6aglZmpoKKPkaGZqKSglZmlqJ2cpJ6snKGdoI2TnpqdoZiZm5aXoqCUl5CmnYapfX2leKGOjYKqcK2LgaeGlp+hiZeXiKOCkYiUqnyAi514b7FaqIKCiKB5dNh/dodzqIGOm42SpHyWkJ+Ee7JenWSgfoOVbZJcq1tak4CRf2hnqmRye4FrmIdzXqtaiaCOa29lT0pDoVxbTHRdYmdOW2FfcnNfS1Y3SpuUWEdFPUdGQU0zNUE4Ljs+MDVBNzhAPDY9PEY/Ojw2Pz1CNy5IVkpFQUg2S0lOQElLQEVOOjpANS47PjEwMjE0NCsqMDUvNywmMjEoJCQ2NjcxPFBlZUEmVWZbPzJVX2JMN0ZJX0MyPziinpqav6uYtMKuq62ppbSwt7C1vri4sbC1uqi6tJ+vpJ2kp6edk6mwqa+ptKuqrqGYoJ+mpKO5oqOroJabkKGflJOemZOXnp+PjIuosK+nnZebqKafjJKkl6iqp5SXqaeenqCiraShnqKMlKGYn6CSnpeclZ6hlZaOq5yPrm1ytHOpi3WKp3O0eHOzgJGko5Kcjomkh5B3uG+Me4uiamu2WqGFZZeXaaGip22TcrR0k5h/smqFkoitanWzYZ1mom+Hk2uXXK1fTaF8h5FSc6NseX9+b5iHcl2vVjycd2ZUb24uXKdPY1NrZWJtWmNdYHB7Y1RaUj4+bW8zQ0JAP006ITdANi47QDM3QzU4Pz8zOzxDREJKRk1JRjYySlRLRUJJNklKUD9ITkNGUD08RTUwOzswMTAvNzUsKyw0MjYvIzAwLCwdMjg5LzlOYGVEJ1VkWT4vVV5hTDVGTV44MUM4ppybnruhm7LArq2rrKe3qbevtb+0uq+ut7aqwLWoqaCapaOhnJGqqae1orKnrqmgl5unn6SruJ2irJqVmY6jopWMnKCbmJyfkZOUqrawqJmUnKyql4yUpZilrKKRlqqyo5+dpquxmaGjj5iilp+blpyWoZOdqZyUkKuZh9SSmrtzsMOAw4Z+1ZabuHiIkJiMl4uMp4h6pLZ1fXd2woKasmCDunnAfHW4Y7WCjIepfJWBrKlxe390vIinoGmdYaaOr6F+jHSHqn2+b3O8dLKDdXiBim6aiHJujaR0vV53fVphebxrWlZcanleamFlZ2JteG9aXFlDQUBzQENGKzVHIic7PzEwPD83OkI5OT1DNDxATlpeYGBfX19aUFBSS0VGSjRITFJASk5FRk9CPEU4ND05MDIwLjg3LSouLzE4MCItMSwzHiw8OjA4TFhhRidUY1g8L1ReYEs1O0xbLTdBOaebnqK9oZeyw7Ctqqussae3r7bDsLiwrbmurcCwq6OhnaKhm5uQqaOqsqS0paylnpWZqpimrLicoq2Xk5+PpJ+SjJyinZedmpGVkq+5sqyVl6Onp5SQlqScpKyekKCoq5+bn6ijs5+jpY6nopSimpyYlaOYkK+gkpSpnoSQmLZ/j5GMt5V4gpOatXdta25zb3mQhY+KdJ/Bu72ae4GxqHCAc5G5g3yGhoyHjXyKh4yXfKS7ub2cdXq0o3R3l3Z0sHWZnmaGao21dHJxd7aMXn96fYlog3luemOLrHB1hX9YW6dqRWVaVGZgY15jUWdmcGx1Q05QTUQ6Wk0/SjM7MCA4PjsuMz1BOTk/PTs8QzZCVFlaWltbWlteYGJgXVNHR0g0RElUQktOR0VPRj9HPDc/NzA3MC85Oi4sLy0qOC8lJjIoNCQoPjcvN0xUX0cnU2JXOCpPXl09KzpWVSc+OzynnqCiv6WWtMO0rKuorKupuq6wxa2zsq21prO4q6mioaWeoJ2Zk6ujrKmltaenn5uVoKOdq6S9pqGplpObkKGakY+hp6GTnJeTl5SxtbetmZ6kpKKLkpKmm6Wqm5WppKWcmqGopaekqaGRrZ+WpJ6Xl5edno+vqJSbpqGNan1pm6Z4h3J9mY50eWSHe72+wLpvk4NylYdgcmpaXpuJYGOIjpVrYICVY22dd2KVa4CalZRlXmBjcJqKaHKLfYaVZ2t/cnV4fX5iW3d0gWhQXG6DfXuLa1hreoJzSkpvhnBOdE1FWF1nYUxaWGdjX09bbXVpcVJQREVNO0dJPU0/MiwyQT84LzU/Qzw5O0A7PUM+UlZWV1laW1xcXWBhYWFgXFVHNURGVUVKT0hGUElJSDs4PTUxOi4wOzouMC03Nj01JiIvKjIsJTs4LTdKUl9JJ1NgVjQpUF9MKDM+W08nPzI+qaCoosKjm7W6tqOspa6np7WxrMirr7Kqs6K9sLGmn6KnnKObmZmrpq6jpLSopJuXlKCbpq2ovaeopJSTmpWfmZKXpKiokJ2RkJicsLK/rJunnqeiiZORqZqoo5uaq6CjmZujp6yjoKujmrCblaeglpSdn52XsKWYoaeZm5CcnKKjmKWhmZuZmZmPlYFnbX1xd5KXlJKFi7WqjYaYlY6KjJiWh5SVioSTlJGJjpKUmJOYlpqgoZqclKCdjoJ6pYVta32RfIB1ioqBcYJ4eXZ2ioB8impzgXSDdWV3fXdrb3ptYGNdcGhNWFpmamBXWm95bW1mVE9GUzlPWk1RTygrOktCNjM1PUBBOTpDPjxFTlNTVFZXWFlaXF1gYmJhX15eW1RLQ1NHS05ER1BMT0k8OjszODksMjs4MjApNklSTzgiKSsvMiM0Oyo3Rk9bSiZSXlMxMFReOis9OFxKLDwtQLOgs6LAoaSysragqaWyp6WwtKrIqqyvpLSlwKazoJ2kpJyjlZWfqqasoqO2q5+YlpWflq2ppcCeq6OUkZuXnZeSk6GenqKnkpKZqKeyxLCaq52qn5CWlqidqpucn6yYoZucoqSvp6KlqJ+umJennZmZoJ6dnK+gnKGmlZeSl5OfoJWinZegjpaTioqNjpeukHyWm4OSgouqqYWAmZeJg4+eiHqEkIeGmpKIhoqWjpuXjZGYnaSWmpORnY1/jmehs6+FioR2e5KKfXd5em9meZCBgIlrdYF6iHNpc397doOHgmt1ZHlmYGplY2Rma1lse29pa1xTTFBEXlRFQD8+LDRARjs0NTs+QTs8Pz4+SE5OT1BTVVZWWFpcX2JjYV9eXl1eXVhWSktMQklPTVJKOzw6Nzg2LzI5NjQuKCYkLTEuLykrKjclKzwoNkNNTUQvVF1RMDVNWzE3RTRbRzU8LEC0oLmvv6yrrrKxoKqmsq2irLOvxK+pqqKxrbyis5ufpqKhnJiXp6WppaSlsrWdlJOdmZmvpa2+oKuikJGdmZiUkJShnJeonISeqqujtMi0n6qkqpaWl5qmnamanqOrlJ6fnqCpr6qmpKuirpufoKCYpJ6cn5yvo5iep5KXlpyRo5iXp5yal2WCknxlfo2akGN5jm1pa3uSpKpqZZuYfWeGimVlaWh7jqGPa2eNmJGjd2tqi5mjn5hzbG56hI6IelhmXoaDXm2LiYF2XGhzd3aSgIeCbneCeIBzbXmEdHaIiI+DfGuHWV5sdGRec4lpa3xxa2RfUk5YSWRYQUo0Pkc3P0ZENzE8PT9BRDs7REdISElMTlBSUlRXW15gYWFgXV1dXV5fXVpVT0RIT0tTTj0+PT02NTM1NTU0KiYmJSwqJS8qKyc2KiQ7Jy9BSltKLzdaTzYpRVkvRE8yWUM7Py49pZ+6vLqvrLSxqqWora6wpq2tsLywqKajra6wnqyWn6OdoZmZpqqcrKOlp6iyrZ6Uo4+ir6W2uaWuoo6OmaGZk5KaoJmZpJV7pa2iqLTEuKWip6+fnZSeop6jm6KpqJKfoZ6gqbCrq6SroKqcp5+noKyWoZulsKSXm6mVoJ2akaOWnamXnX29g4hytHKEnYataHi5xLhxk6KjeqaZmXKrgnzLwMC7cYyjiIKffZaYiZ3AvYKXnZ6NncLBfIJ8k42aw8B9bKWyb4yBb8p6f5t3kYOOgXZ5gIB5cXp/h3B3hYyTeW54lGNnYHhkYGWCY150Z2xkY1hMVklRWkhPRDJJRT9EQj4vPD8+QEE6OERDQkNFSElLTU5QU1ZZXl9fYF9eXl5eX19fXVxTTVBHVU5BPz89NjQ2ODI3NiomJSMpKiYuKyopMTAfOSojPklbTCojQlAuI0ZbM1BZL1ZBQjsvOJajucO1sLDAqaiUo6+osK6tprKzrqmkpaavq5+qmJqin5yaqqeinKuipKikpLSjnKKSpq2rt7OnrqGRkZmcpZKQn6GYm5+diKaspKytwMCxoamvqZeRn52imaGjqqOToaKdnqyvqq2npKSnoaalnayokaOaqK2pmpyom6uglZaklaCilpx+zpR4eqSBeZWWm1+uj16Op4GioHynlptzq4OAr15jjKp7qIeFoHSXk4izY4KrhqGOjbNqhK91fZeIt2GDrVqjzW6Qdnvae3+ZcH6HknZ+ZXuIdnZrfIdufYaRkX5tg5Bhcm1waGBgeWRccWhqZGdgUlRTV11LT0M1QUhERDg+NjtAP0E7PThAPj8/QkRERklKTE5QUk9TXF5fX15dXV9gYF9fXVpXT1VKPT8+PDU1NzgxNjQoJyQhJywmJi8oJiszHTYwJDc7U0wrLC1LMCc7XDtMLSFQQEY0LjGtwsC/tbSwuJedkaOqp62zq6ayq6uqo6qmr6mfppuZpJecoq+foJ6op6KloJ+wrJqdlaeurLCqqKuflJGan6SSj56lmJ6no5+tpauwqMDHs6ipsa6Wkp2bopefqamflaGfnZ2tr6msqpyoqKWiq5KsspaloqqqnaKlpKCun5GYppmfmZOTkJegcYWMl3WFqIZxsX2ecqx+oZ6BpY+edquCfa1/nHKtfquHhp92mZJ7fJd+qoiijJKMnX6re4mUkJ+Ae61XncV7j3CTwX2BlW11b4xtZXZlhm9hd25ybomKko+DbpORZnB1dXFhZ21lX29paW5nZFhTXWFZUlNDOUlJQEQ8PjxARkRDRUE9PDw8PkBAQUJFRkdFQENJU1dZWlxdXl5cXl9hX15eXVtaUkM+OzkxNDc4NDUyJiMfHCAxJyAxJyAnNB41LSY3PVdKLTwnPjEpM1ZARiEcRzpDMS4rsNPGxrK0oJ2jjqOioqyvtq6osaaoqqatq6umoaOdmaGVn6Wrn6Gln6ioop6dsKyXmpaop66rp6annpeUmaOhkZSgrZudpqOvrKSstaq6zrKtpq6sl5WcnaKZnq6snJegmp6fqbKrq6ubraulo6uarrGhqKuupZikqaior6GRlaKjmZORhKRqpHWJeql0erJwgqaKmYxxiKCah6RgYFKshX+ug5t2rYGnhoWfepmXhntmgKOJpJmGgqN9qX6CloeuX3ypVp6jkoF6o5+Ae8OvxYtyr7OzuXFiqa/CdGiMjJiOgm6clXFvenh5cG1nZWVycGZ8aWNdV2BqWFlVTExRTENDQUI7Q0BAQkk8PTo5Ojw9Pj4/QT04NjtETFBSVFZYW15eXVxeYGFgX15dXF1bU0lCNjc5OTY2NCwmJCIgKCciKy0iJC4hMy0mQERXSCxHKzU2KjFQS0wjIEE5RDQsJ8LJ1dS/oZmrp6Cvop6wtLCuqayip6aoqquppKWfm6SenaWnp6Ocq5qirKGjn6+hnJqSq6O1r66gp5qdlZOmopCaoqign6WcsaWkqLGtt8iytaqsqZaRnZyimZ+ls52aoZSdn6esraSwm62qo6OqobOtoaqzsaGaqKetrrShkZSippeakXypbJ6Eh3WreXywb4KljImflpaflIHSuLS4yYGBsl9glKmDpImHoHqYlpp4qsl0mqSVqKmRkpqNgZyKmsbGeWehgqV0gZ+Ogn2vXXC0YrB1S6OGbadHgpNkj5CekXxxmZWBcXx1fnxuXGZqc3FmgWteYVlkbVxfWUlNTEtFREFCPkE8Qj9KOzc5Nzk5Ojs7OzMuNjxBRklMTU9RU1daW1tbXV5fXl9fXlxcXFxcWE1CNzU2ODUvKSglJiUkJiksNEVOUFBNRktKVkYqTDAvPS01T1RRHRw7PEYyLCSnpMDGuK2osq2spaKcsrisqqGlmqikqquqpp+mpZiqo5+uq52loKyanqmlnKe2nqKXk6iqtbKsm6WcoJSPpayRmZyoo6Cqp66hpaepsLXDsrOqraiTipecpZuho6+ll6GVmZylpq2csZ6vqaefrKO3rKGxuK+dmq6msbKxo5OWpqKZno6CnU54moF/n3qEo32DpIWHpp+cnpOEuHt7ebmCf8zGwrZ4m6GQi59+mpaXinaemIqlmKSpf7CFnYaghKx9mpVjpm2kcI+FkIF9loJyrGCjc3GAmmC8fVJVdI6So5Z7fpSTjHZ7c4aAcVxubnhyaoFvW2RfaW5iZF5MTFFUQUlIRkk6OUs+QjEwODg2Njg3Ny0qNT09P0JER0lMTlBUVlhZWltcX19eXV9fXVpaWlhVU09IQDg4Mi4sKi4rKicnP1FUVldXV1lYWFdVT1VGPEUzOlBbVBwbNj9ILC0gi4eZqaukq7mqrp+boayys6WeoJWlra2uqqecpqaao6ehs66iqaayoJippJSjtqKilZehqbS4o5uhnKKSj6GxmZ6bp6ahorCunKWoorayxbGtqa2pkYeQnKicoqScpZeemJqapqSrm7Cir6WnmK+ku6yhtrWtnZy0sbevsaWXnK6go5yFj9G1w7d5h46FkZOQgKZ5lKF3jKCRhKWBinGqhoW0bnJqmaOclYqefJiZhoePc6+CppyjjqaLk52LlpCbbnGyXaV0k3qcbJl/e5l8balho3Fxf59ic7K4aHePlKaYfY2OlY55fnmQg25qeWl6c2+AdV5lZW9tZmdgSltYWDxISEBVNEBGPjwqKDYzLjAxMykmNDo7PD0+QENFSUtOUFJUVldXWV1fX15eX19dW1taWFVSUlFGOjIyMy8vKysoQFFSVFVUU1RWV1dYWFdVVVZUUU9RW1UlITJBSCQpJZJzjIqtvr+8urSelqekrbWhopmUoqimrqurmKain6agoLano6insKOUrKOOpK2inZCamqqzs6ScpJyokZSXrp+fnqeknaidtZqiqqS2rMSwqaupoYyEjpyioKailZmanZmbmaalqJmtqK+kpputpr2slL2vrJ6hr7K4qbKlmqiwoqeXeaiRfXywd4qApKWInG2ycKGHrXyhj4OnlZiArImFroWflKqgoZeGn4CZlYB7kn6rgJ2bloureJ2hkoqUkoF6r16kgX2mp2SdgHyXc2qvXaVrcIWZXWBbjKBtlZGmmYOWjpmOfHyEmYBrbn9jf3RugHpgZ2ZxbmhnaENZYVs+S1UzVThCQkM3JCQzKycnMywgLzY2NzQzNTlAQ0ZJS01OUVJTU1ZaXV9hYGFhYV5dW1pXU1BPTkk3MDQyLiosQVRWVlZUVFVUVVVUVFVUU1RWV1dYVlVVUUhGSUojKCi9k5qDqMXCtsCznpqsoK24paOOm6Sin6+wqp+kn52tmZ65oKOroK+pma6hkKuoo5aJmpCusKymnqWbrJeXj6yhoJ2moZqlna6Yoaint6nBr6WppJ6LgI6bmp+mnpKUmZuUm5qmpaabqqytpKWfqai+pJbDrKmioKuyuKmspZ6yraeol3WvfpCLnIWHfbqtipllsI1lla19oI+DppWagayKhLCFppqkoaGQhKBcbGqBs2B/rXt7g4GxbWdvmZmMiLFbfrVcpIRryKJkn4B7vFh2tVmyfVKugHqsWIChbZiQqJuMmJKZmXx6kJ9/ZXV+Y4Z4dIF8YWpncG1nZWZPVWRcQVVfPkkoPjk9NCEiLCUfMi4gKjEvMDQ1Nzk5PEFDRkhKTE5QUVJUV1peYGBgYWJeX1xbWFVQTkpGQzU1My4vQFVZWFdYV1hYV1dYV1ZXV1dXWFdXWFlaWltcWFdXR0I70p+ysbe9urPBsqKcrKaktaigipqgnpyzs6mfo6CetZmgtKiqrJ6vrZ2sm5Wvp6GOiJuOr6uopqGlma6SmI+omaGdpZ+ao6OlmaCiqrOpvbClqJ6cjn2Lm5ahoJiPkZqckpqYqaCimqmuqKamoqSpu56gxqakqKCqtLSrraWeuqyrq5SAqZKjr46bf4ekl5mQgoC4w7qDjpyShKeXnIKsioKviKecm6aqkH7VvcKqYqO/vX1+o4KD17q4tYWVk4Oevb6EbaOCb6uEbJx/erKwx4Npq7C9rHh3or68c4CWjqadkZuSmp97gpKce2R+e2WPZ3mCe2FsZWtqY1BiW1NqXD9UYUNOKT06NC8fHyQfJTIgHSQoMDQ5NjY3Nzs+QUNGR0lLTU5OUVRXXWFcX19hXmBbXFlUUU1IQz89QT81PVNZWVhZWVpZWlpZWFdXWFlaWllZWFlbW11dXFpWWFRXWryVs7Owv7ixvLKinK6mpLKmnYuYpcCquLKoob+mp7KcnrGcuqifra+lp5SUsKuXjIObka6loqygo5yqoJeLo5KmnaecmqGpo5mfoaytqrquqKOalpJ8iJmRppuSj5GYmY+YlKmboZmqqaGrp6CjqrueqMSin62iqbOzqa6on7mmra2Zc3aqpbiGZImgcGiukYqQbm53pJCZn4F1rpiUcI+LcZWoo5uXrqRybGxsZot4b26CmXGBempxaWeKl5aYcWlphYhncYZkXYhiam9ZXGZ9dqZfYXGOkW5lZX+Nk4+hmJmZk5mhfoiRlndniHhpj2t5gHllbWNmbGJLZVhKbFo6UGVFUidLOisjHCAbIywpGBsYLTIuNTo0NTc6PD9BQkRFSEtMTU9RU1ZcV1pcYGBhXV1bVFBMSEQ9OkFCN01YWlpZWVpZWFhZWFdXVldZXF5eXVxcXF1eXV5dW1tVV16plKyzqbm4srOqqaGunaOyqZeSv7PFyr+3qp7ArK2koqesn7qjpK6rraaOl66pj4uFlZatnqaqoJ2ko6CRi6SSp5ipmpejqqGWnaamp7C7rKyam5KRe4SWjaWYjZGRmZWOmJaplqCYqaObsaadoqu5n6/Bp6OypauvsKmsqqa1oqy2lYqhqKa3nYmWo5mHqpuRlZ2SqbKZmqOqoLKWoqGdn6KcoaWhlaunjZKSjIeTnJ2VkZmTmZGPlYaBpZuYlo6LlJSMkIaEfWeJfnSCdXOHinCnbHqUkZOSgYGNj5CPnZWil5qapISJlo9zapF3cYx4d316am1kY29kVWFZQGpcSGNhT1krRj0rJyE3NTAuHxwhJTIoKjY5OTQ2OTs+P0FCREVKS0tNUFBRWFVWWV5gYWNdXlVRSkVEPjk9QEFTWFtcWVdYWFhYWFlYWFpaXFxeX19gXl5eX19gYGBfWVlgppaoqqS0tq6uobCjrZ+gtbGQjqzIvsW7uauipZ6cp5+xqaO2p52ptKaokZisoouHiY+cp5WspJ+Yp56ekpSjlqiaqJqUpqGkkJuomaG2u6irmZqPjHyBlIuhlIqVkZaRkJSYppCgm6qfnLajnaart6euwK2itqWur6+rqKixt6Ctu5iRpaSmtqKSnqegjqqgjpKfo6uvmqCjr6ivmKOgnKOqnp6enJarnZOZoZuUkJarmo6ZmZeRlp+SiaGelpWFko2RjpWLgH1mi4V1hnV4h4JznGqFj5STkIl8i5WSkpiUo5OfmaSFipqJfHOXc3uMgHN8f2pvZF5wamBbYFpuZFBgZVBaOkdHRT4yPT45LyomKykmHSY0MTY2Njg6PT0/QUFDSUpHSktMTVNTU1VaYGBpYGVWUEpBQ0I6OUVNVlteXltaXFtbW1xdXV5fXV5fX2FhYmFhYWBiYmJkYlxbY5eVo6eir7GrrqOppqyfp7WqkI+dpbW8sK2toqOaep6jsqSlsamXm7mmo5OZqpyOhoqJnKKPrp6ilaifoJKWmZuui6qWj6iZqY2ZqY+furekpZmcjIh5gpSMm5OKlZKUkY2Sl6ONn5+pnp+4o3+Dr7Wir650o7yisZ93eJ+osLmUdayjnomAq39kXGJ2oI+ln4SXfW2Ss5yjp62qomWen5JzeZqXcICYqJhtf6KoimWcpp2SmJiWjZKckoaem5CWhJKHj4+SiYV3ao6GdoZwe4V/f2Boh4qUkotadZSQZ2iQj3N7qJybZnqaiYR5mWqFjIRveoBrcmVfdnFsa2hcZmZiYnBTWz5OTk5TRz5AVUQ6MS8eHyY0OjMwNjY3ODw7PkBBQUZIQkdGSUtNU1RVWV1gaGZnWFBKPERHPDhVUltgYWJgXl9fYGFhX1xdX19gYWFiY2RhYmFhZWRjaGReXWablaajoK6vrKuppaitoqetpJKWq7axs6ebq6esl3OMnbCgqKunlJe5oKCPnKSdkX+JiJuejKyaopWnoZ2OlpKehHWtj4inm6mRl6SJnLu0qKCZmIuJdXeTjZaTipSRkZSNkJShj5yhp5mcspWAjJu1nbOMko66pqB+p6J6oa21gI6NpZ6Di4aQsaqvjIqXpJt6gIushpudoaeop4eVhZh3pZt6h5yBl6eCgnucsnqKhqGYmpWYloORl5eFm5lieoeQhY+QkouDbXCOhnmAcH+AhH6Fc4WElZF4lmeSdKCadX2ZhaOgiJh/lIyFhZprj46GbHh7cXFnZHdvamxrXGVramV0XF5JVExSQEU2LlpVVTcpITA5Pj43NDM1Njg7Oj0+PkBEST9JRUpMR1NYW1lbYWFoZlpRSDlETDs+YVZeYmRmZGBhYWBiYl9dYGFhYmJiY2ZnY2JhYGVkY2djYWFonJein6WsrKuorKCnr6amqaWZlK/Iv7Gil6iptp6QhJ2snKeioI2Qvp6ajJ+aoJB8ho+Zl4esnKGWn6CRjJOJhoCRp42Ho52klJiehp66sqiempKOhXF2kImVkIqUkI+bjJCSn5KXoaWWnquHn7SJtJqtisqHqayItoWNsIGvrIKojKaYjZ19qI9ye3ecj6eXaJWkebSMn56mp5KYwoF/q4iYoXKegJqlfZeFlbKBoX2hlKGQmJeBj5Sci5mSi32Fk4eOlpKJg21yj4V+eXGGgIN7g3SEgJaAj8Vmf6mHj6NrnoWknYSagY6Ph4uacY+UhWh4dXx4aGh2cGhobF5kcGxmbFhnR11STTNFNDZOYmQ3JjM8RUdEOjY0NjU4Ozg+PT0/Qk0/TklKTENQWl1cV2FeaWxcUUU9S01ASmNYXWNmaGdiYmJiY2NgX2JhYmNjY2VpaWNiYmJlY2FmY2JiaZSWop+vp6iopaufo7ewqaummpSgo6SrpJemq7ijr4ChqJ2mnp2JlL2Zk42hkp6PeYSWlpGHq5mbnJmhhI6Ld5ucj5+QiJ6knJaamIejua6lmpyMjH5ibY+Lk5CNkI2NmIyRkqCPlKGhmaGnfqGnh62doJatj52cnJCFgKCMqa2Fo42pmYyaf6J1gJmUa4Ktdk2reIeNnJGaqKaAqat9g6F7eqdqnn+Sa2eXhpe3iZ5+bmBkWYOXgI17ZGiLcpl9eZZsXX2XbV9ScINcX2t4gl9YZIF8g3+XcKeqa4OjbnKlcJ+FoGpnoG1bb4x9Z1pghIBiWFBvd2ZtdHJram9danFta2lYaU9dWUY5QTVIRF9sNSxJQ1JNTj04NDg1OTs2QDs7PkJPPlFSTE1CSlxdX1ddXmJ1YE1EOk1PTlRiXFxmZmlpYmJkYmRkYmFiYGJkY2FjaWtkYmRkZ2RiZ2VhY2iXlZ2guKCpo6askaC2u6quopmYoaKlra6hnq+1o6iSoaCgp5yajpm0mZCLn4yVi3WBlJKMiqaVlZmenn6ShYWspIebkIqZqZmam5KIprGnopaaiImAaW6Ih4uOjoqLjZKMkZOjjZSfoJyhpH+TgY+ioZSgdpyVj6eCoKZ/haerg6V4iXyEmn6icHOUiJZ8n415bYabjJmPm6iZjoede4Kic3amZp5+d6RfmHp9k3Sibpi3tLp0k4iDgLWoZIHGuHtwlbaMcoCao2JzrKtgfGmds35tfIaBjYKLmHF/o2xyo3SfhYGkYZ2Zs5ZyfZifs3VzW56yg2pib3R2cWlvWGttc3JmXWleYkxFPUQ2UUJaczM9U0dfSlI9PDM5NTo6NkQ7O0BKUD9VTU9RQEVfX1taWGBgfGRIQzhNV1VXYmFaZWZra2JiZWFkY2BhYmBkZF9gY2tuY2NkZGhkYmdmY2hok5WUo7eYqpuTn42ktrSsraCaop2ko6aunZyyrqyTmKKaoaSZmpSeq5uLiJJ4i4VxgJaOipChj5KUnZh9kImNqKCHl46JkqSUnJuNi6mopZ6QloeFfmp7h359kI2Di5GRiZCUoYOXnqCdoJ6LiXecmKKNn3Ghioeph5uljpSmqX2tjH56oJl6o5N4gXSWiI2cfZafhpuOmJulhaJkoXyIlpCbjW2eaJuOb5qZeoCLp31yaXSrg5+DdKpolZpdm4V2hZ5nqmuAuGZcqHCBnGCVjF6ndnWHiH6eaJp1hpOSl46An2+akW6nml2pf3m7a36qXI6EXbRnXG5yenhraVxxa3l5Y2BmWGJCUUZPN1dDUm81S1taX05aREEyNTE7OzZIPzpDSFU+WVJZXT5EYl5WYFFhY31qRUI5TlteWWRmWGZnbm1iYmVfYWFfX2BgZWNeYmRvcWBkZWVrZWNpaGdraZWbiam0mqeIY5Sbq7mxr6yeppycqaCfr5yesamtnpekm6GgmZaWoKOZhomNaoiAcnuXiIyWloSRlZiQeoqElaOcipSPhoyfkp2diZCpo6CajJKKgYBpgYZ5f5eMe4mOjoiQl5t/lKOfoKGTmHJon4mfj4twkoyAqYeYnqGlnqZ7sK2joriXd6Ozo6SAiJR5nXurmX6ijpyaloiXcaF8hY2vtX1rmpGheX6YtaKkq6iEmXybfZ6bf3SqWl1ve5aLeJ5iTH97eoVjeZdCTJ9Yompxe45sgIiEmXWbeIaJsbN/gJuTp3eDnm5zfZVwmnRrpF2VdkhlZGB0cX5+b2ZgbGl2fGRlYlFfV11UV0BaRlFoRFNXXGJYXklEPUI4P0I6SUY4TEVYQVdSW1ZERmJcWmBLYG1+ckVCPFVfYlplaVZnaG1vYmZnXmFhXF1eYGhiX2Vjdm1dZWdma2RmbGloa2mTnICwrZmEU16gprO5srKomqKMnKycnKqUoqyko6iPoJ6dm5mWmKGdloiHiXeGgW95lYWRm4t8kZOWiHKAiJKhnHORkIGJmpWhm4WPqZyblYuLi3yDbISFcYKhjHiGjYiIk5mWfJOkoJ6iiK2GfbWEjp6ce6WWeqmBlZuPiZ+bfKdod21+mXShc3J8nYaZcJODrn2kg6WdmYCjb16oZ3WiY2+lYZzTkH17mXhzc2KihpB+o3SkkHZrj7OMYIKYiXOqsqi8f3eDbX6/pqm0XZxtfHCWbX9yonJdpGdzpmBopm2b1Jp+hptweXuXbJx8eJdzbqmkZ2BlenGAhWxoZmRudnhnYGNTXGZRUWJIWEpVYVdUW2VqXGVRRkNLTUpLQktFOE9AUU5YU1lPU1FgZmZqUmN3eXdJRkVjXWVaaGpUaWhqb2NqZ2BjYFxdXV9oYmFpZXxkXmRnZGtkam1naGxol5p/r6pUXEt+qa+xs6+yo5uZhZmpoKGkjqapoZmqipqYmJOZk5KhmI6HhXtwfYRofY+DlJqBd5GOj4lvf4aPk5Jsl5N8iZKTpZeDj6ublJOLhol5g3aHgG6Cn4Z4gZKGiJmjmHuUo6SZn4mzoaK2i3qsp6SupXCpgJqOhYCakHukgKGZhphynoSkrq+Kl4yAjaSNlYKtoJN2tba1yaFzlIuBn2Cdl6ltepWHoJt0ooh3oH6Tl4uBcE1mo5JwmodzpHt5dGGDgWt9oGtxZF+ccX1zlmh5abO1tMamc5h9ep1rnJurdoWbbXZ4mGqae3WYclFFfbNfanZreohma2hjdXVxbldfVFlpUFNoSVZNWVRWXWhrblZnV05LQUpNS0hKT0FRS1BlY2ptZXRyc395fG51iXt7VFBObF5pXGtpUmpoaWxobGZjZWBcXV1eaWJkaWt7X11kaGNqZm5tZWlsZaGbiK6lg2Q/k6Gyqq6vtaKikICXqqKjpYylp56dpoOal5aOl5CPnJOOiIN6anmHZYONf5igeXWPiYyBaYSFkoOMhZ2NeY2LlqaTg5iqmI2Si4GJeoB9i3lwkKGGeoKVh4mWoJZ/lKWonJWVg2ZueJxsomR7caV3m5hwZ6aAlYp6pHqfloOXcp53gYqVl4+5bpGKomJ9mKCViG1yaaprdaBtb6ZfmmmLkGmWh5uWdaKBfppgjIaNdXCIYmigZZ5+aZt1b2NmiIFtcaJaXltioW1diItuen1zcmSlbXiiZGenaJlzjJlwom9ViZBvoF9mqFSLXlSYbm1za3KCbXBpbHl0a3BSWVdXZlpUbUlZT11JWGlpc2pZa1ZRUkZWXExYU2FVaWtfd3R7fXB8fHKDe4Bzdo2AhHZeUXJiZ2NwZ1BqaGhrbG5oZGdfXV5dYGpiaml2dV1cY2hjampzbWZrbWOco5eleWRzbYumraOpsLGmn4uAmKudn6aMo6Kbo6KBlpiTjpqQi5iQjop7h3GAiGmLi3yYm3N1iX2Qe2SDh5WKipWZgnyIh5eokYGjrJCGkYuCin6AgI5zaZCmhH2HlI2ImaCPiJOppp2IpniVm36kiJaLsZidkIKvl56ldpSGeKlzpY+Emm6kooyShI2Du259pa+ChoWGk5Wcn3ylenKolaCWZp5+b6xkloqWk3eobaqigYl2iYN3q5GmiGuRsGt2s4ypa4qFbW2fnpKVYH6ri6p2fn6LpZ52n3yDpJWdoGqbiHisaJ6tjLZ0d76NpJNag6eOq2F1cnRwfHVxY2t/b2ltU1dbVmFiXWtNXVJdSl5tbndfW3FZXGBbZ3Rlbm9yY3J0YHd6fnlyeYNzhH+Be3uMgYKAdmJ4ZGNucmRSa2dob2xyamZpYWBeXGFrYm1sem9cXGJpYm1qeG1nbG5ilaSpnIF/naOWqamdqKaupJmKgpismp+lipumnamdhYyaj4ackYWSjYyNdId7iIRvjYV+mJN0dIZykYJtf4uRh4aTjn17goaYpo5/pqeOgY6JhZV2goeSb2yLqYGDjJSOiZ2fiYyUqqKfj4B1lJeIfoF5lK6if4GbcY+Gd46Jgn17cqeMcX19epiWm4SPeXt/foeUlZOKdpCYnqCDe32Ja4yFW3l5cnpxaW5+kolxgHWBj5STcYeEgmWMf1+Bf4t3dHKUdW95bm2HbISFXnVnd45lgICFjaiafXR7lWqJiHCBdn2Hd25uaIxzenyYeIVcbFh5j2lveHJxb3h4cF1rh25qZ1ZbYFddZmtkVmNVX1FfcHh5bGt2Zmtra3d9cnJ1dGFvdmJ0e4J4dXqCdYCAgIF4i4WDfXtuf2xkeW5eV25naHVreGppamVcYFpjamVtcXRuW1tibGRsbHluaGxvYY2Tt6imiaCimqajmKScq6KhhISYrZKeoYmbp5upmIOBm4t/lpSHjoqJjXKDfI99fo+Fe5iPdHKEcJWFe32Si4aGj4R5foCHmqWOfKihi4aQkIWVg4aOmHdyhKmGjpKdkImfnoiMm6efn6qDiI6Vmn5+iZatp4+Rpo93b5uPgXiQbn6ohXB9lXFrcH2BoI2Ak46LaGxcgouLm5qejnOVi4hxdGuBdnSBWXJuh5GBfn+Mal1qZHuGhImAYGl4epp7goqBdYGFgWd3ioZqYXBxgXRecYqBiI6llIVli42DbneLhHGGj3pxaGhlfIR7lltca2hudlt8eXh1bnNzg2dcbYtra2JaWl9bWWxxXF9hWl9dZXR/e3VwdGRra2t8fXN8eXVkbnVobXx+d3p8e3l6gIB+b4aKhHt9dH55c39oVFxxaWx2cHVna2hkXWFYa2hra3FybldbZW5sZ3N6b2hqbWCLiqmwoY+ioZqenZeemKijon6Dma6OoJWInKKRpZV/e5iFfZKZiYmGh4pzfoGMdoWMgoSXinJvgHKYhoN+koOEhomAeoGEjJyhkYOnooh5jpeJlYuLnJeEg3qtgpGYmpWKnp2HiKGqn6Gio4uHk5uco5mVqqGnpp+SmoeVjHp2jY2Dp35/kpCTlJ2yppuVn5CNsZKXg6WMjJWan4mQm4KIkYprfI53eGWDh5GLfImehIeMkImIgYWEkHd8enSZoIiGiZ2JhJN+fYqAgHVvcoSCfneGhoqPpZCChYyGgoyQjH2IjIqRhHptg4V+eplrc2lhdIpxfnp3d293dIJdXm+HaG5fXlpdXVNoclZkXV1ibGh1fHxzb3Bka2ppgH1ueYByanBxbGeBe3KCgHh/fX+Ee22CjIZ8enl7fXqDeE5jdmpzbnB6ZWtlY2JgW3RmcGdycW1VXWx0bWh5enFnaWtkjIecuZ6WoaCYlJiZlJikoJ58f5qsj5+OhqCdi56WfXmUg3uOmYqGg4SHbnmBgXOBiH6JlIRta356l4eEg5B/gIeEhXyHhY+cn5OHq6CEc4uQhpKRi52RfY17qoSOk5iWj5yWh4ecpZ+imp2FgpKamZiPmaafpZ2cj5V/j4h1e4aNhKV7fI6QkYaZq6GelJ2QjqmNkICdjIiTmZ6Cj5d+ho6Db3iGcXVgf4SQhnWNmYGDkIOHhX+FhJVueXZ0kqGKi4Wag4SMc3+Je3xycXqHg3p3iY6DkaaPhYOOgIOKiYp3homLjH5xbX+CfG9obG1oX3p/aH58dnV2dXt4XF9xfm50YGNbXV9SZ25UZVteYmtpdnl/cWxtZGtqaIF/bHSBbGx1b3pwhnluh4B2goB+hXZxgo2Ifnt7fH97gopgaHtqdWhpgmRqY2BpXGN1aG9idW1sVWNxeWVwentzZWptbYuJnraZoKOfkpGVmIuanp+ee3ifp5Gci4ellYuYmXl6jYV8iZGEjIKCg258gHlzgYV+i5F9a2h9gpeJgYiOfH6GhIZ8j4KQnZ2TiaidgHCMi4yShqChioWMfKiRiJCSl5OWk3iNo5+gnZaZf4CQmpiSjJqioKOZl5CafYyDd3+Cjoagf36MjI98mKShopOakZCmjI+BmpGJkpebfpOSfoeOgXVzgnB3YX6AjoZyi5Z9iIxyjH+ChYaPaHhyeIuYkY9/ln2IinGBhnt8cHd6ioN5eY+MgpSkkouFj3uFhoeEdoOEiYl8Z3N9gHl7cW1rZ19+c2h8dXZ0fHOAal5gdHZwd2RjWV9fUmtpVWVZYGFoanZ5gnFna2RsaGaAgGtufmhvcWx+eYd6bIyBc4GBfoF0doKNhn98en+BfX+PaXKDbnRpYYdobGJfcVZ0b21tYHhobVdqdHZjdXp7cmJqb3qJjJ6xkaWknI6Pl4+GnKCbnX13paGOmICNo4uImpZ5e4aHfoOJf4mCgX9yf3t0doOFfoqReGdjfoaXioKKjHl9gI2DeZaClpmYjpehnH5wjIKRk4alm4eMiYOmlYWTi5aYk5J3kZ2goZeUlnl+jpeXjZaanKOdmJKUmniNhIJ3g5WNnX6BiY2Mc5ejn6KUmY+PooyKgpaXg5KWmX6YjXyIjYF2cX1ue2SAfIuFcYeTgJGCbIeDgYCJhWZ1b3uFkZeLfJJ3i4h7f4V7enF9d4iEeYOPiIqXoZWBg4t2iISDgnd8g4qHeGB6eX50f3hnbWVhf2pqd3N0dn5xfGNjYHNudXJtYVphXltsZVJjWWFhaGt2eYZxY2tjbWZofINtaXVobnBpgH2CeW2QhnKAg4N/dHyDjIGAfXqCg358kG12iXN1bWWKbGpiYnZWhGlwbmB4Z2xianZwZnl8enFgcmyGhY+brZemp56NjJeHhp+Tl5l+eKqdi5l6l52LjJiQeXyBjH58hHyBg4F4dHl6dH2AhICJi4BkX32LlYd+hIZ1fX6Lf32YhpeVmI2kopl/cod7k5GJpo+MjoqToJGDkpCVl5GLgY+Yn5qRkJBzf42Rk4mdnZ6ml5eMlJVyi4yJa4SXj5l6h4iPiW+XnZqklJWLjJ6LhoGRnH+SkpWGmYh7ioqBeXF5a3VsfH+Lfm6Gk4OVeHGChH5+i4Blcml7f5aXg36Nc4+Hg3iGfHV3f3yEf3uCi4OLk6OPeIOBdImHfYB0doKJhXBhfHZ7cn1wYm9jZHxjbnB2c3h3c3RidmBvbHZub1xcX15eal5QXVljYWhudHuJa2BpZWtjaXeHbmdsaWttaIF9e3dvkIhzgISEfXSBhol7g316gYR9fY5yeot4eG1sh2poX2lyY4dncW9ld2dubGF5aWt9e3hwYXhti4CYmKmfo6idioqShYqdi5WYfnivmY2XfZ+UkZeTiHd+e4p9fIB3eICAcHV0fG+GfYGBin98YVx+j5GGf4ODc3uAh3qPkomTkp2TppyWgn2BfY6KkaOIjoqNmJqNhpKZlJaOioiMkpySj4yMboSQj5GInpmioJaViZaQbYeYg2WFmI6TeomEkIpwlpqUo5OSiYuZjIF/kJ19ko6SjJmOe4qFh3NzdmtwbnV8inRuhpGPk3F1gXyBgYh8ZXBseXyZk3yDiHSQiYBzh3huf3yAhXuEi4eCi5SnjHqGe36KhXd+cXCBh4RlaHl1dnF8Yl9wYWt0X3Fqe3l5bHNwZXlebmxzbXJYW19gYWtbUFdYZWNncXF/h2ZdaWlnYmdxjW9kaWhlaWmBend1b46FdIGCg3t1goiFeIV8eISFen+Jd3+Le3tyeINqa19waHSAa3JvbXJnb2xlfGNugHp3cWx3d4p+opehp6Cmm4eLi4GPnIeTnXaCq5WTjoehjZaUj39zfHaFeHl/c3N7hmtzcHpui3aAgYhvcVtZfpGNh4B/f3Z1gICAoIeSi5SemKKVmHiKf4GNiJydio+GkpiWhYmVmpCXi4uMjYyciY6Qg22Ji5CRip2WoZuXlIWXh2mDooFlhJyJkH6Lg4uBd5OYkp+TkYmJlI1+fY6Xe5GMj46aknyKgIJvdnBsbW9we4ZpdIOPmYtxd4B1goiDeWZybnWAmY57h4N5k5B5dYdzb4d6hIp5ioWCh42aooZ7g3WCi393eW5sgYWDXnN1c3FxeVpfcWFwa15wan17cW1tam12YHBva3FtWVliYWJuWFFUWmZnY3VwhIJiXWtuZGNma5JuYGdnX2hrgXVyc3CLgHV/g4B4dYCLgHmFf3iHhneDhXyGi397dop/anFjfGOGfG5xbXRqaG9sdnhfcX95fHV1dICDfqSVmqyep5aFjYR/l5SDkKB2jKCUk4aLm42Wjot5cXh0gnByhXRxdohscG52bYh2g36Abm5VUYGrlIeDeH93coN6g6CCk4KVlJmck5t4knuDjJKjmZOOiZWZkoSHl5mMlIuJj4+HnYSQinxzi4WKjoicmp+blZN/k31ohJuGZ4Wfh5GEkYKJcYORmJCbj4+MjI+Md3uRkHqOi4yRlox8iHyAa3ZqbmtsbHt/Ynp+j5eBdnuBeIOMfXlnc2xzhpWLfYeFepOPcHmDb3aLeYiKeYh8gYuPnZ2Ee3p2got8d3FqbIKEe2B4cW5tcnRWX3BicmFgbW96cWhvZmZzdGlxa2J3ZV1XZmBgclNRT1xmZV15cIh8YFxpcmJiZWaRal9oZVtncH5wa3F0in12fIaAdXV+jHl7hYF4iINzhoV+jIyEfHmVeGZya4NgiH1vb2t6YGpudX91X3R9eYZ4dHOFfXigj5mwm6WOgot/g5mHgIyfgIualI+FiJiPj4+EdnR3dIBxcIV0cHKEcGtpd26Dbn19bXVzUk2C38iS1pN7cHWEdoSgg5R3lpGZnZGZe5RzhZCeoZOTkImTnJSGf5eWiI2NiJKNiJt/joB3eo1+iYyKnJucmpSSeYx1ZoeQhWuHooSRiJeDhmOMkZmPlYuXjIyKi3F6lIh7joiKkpGJeYV8f2x7ZXNwa2x6eluBeZCQgXp+f4CGjnt6aHJqc4qOiYGEhHyUimt9fm1/i32KhXyDeICOlJmZinx1d4OPeHJtZ3GAhW5rdXBoanVuU19vZXBaYGxyeGdramJmeHJwcGNgd2BgVmtfXnZQTkxhZ2JdenGJdV1cZXZhYmVljmRhZ2JZaXNzbmtxdox8dHqGgnV2fotzgIZ/e4l/comIgZGLiHx+mHZlc258ZYh+b3BsgFlsbnl5c2B2enuNdnJ3ind5noubrpqgkIKFd4iVfnyKnoiGoJKPhYyYhJOOh4F0eHB5cW+Eb21vf3NlZXlxfW16fWpoa2OkmsHcrvChc2x2hHaFo4aTcJeRlqGVnIGScoaLopeJjZWKkJ2Wg4GWkIWJj4CRiomWfod6dX+JeIeEjpyamJiOj3aJdG2FiIl8iaKDkYmchIVei5OXi4+Jj4uLhIlte5aBfYiFiZGPhnaFfX5rfWR4dWpueXNYiXuSiIV6foGBhox/eWVyaX+JjYmBgn6LlYRrgXVtho+BjoN9gXh+j5SSmI90cneHjHVzcWd2eoRjdW5xY2p2aFJhcWdsVl9vdHphcmRgaX1wcm5bY3JgYlZuWVx4Tk1MZGZiXndziW5cXGR5Xl9lZYVgY2NfWWpza25rc3eMfXR3hIF4d3uJcYOEfX6Ie3SLiYiWhox/fpdzZ3VyeWyMe250cYFXcXp2eXJld3mHjWl2gIlyf5yGmKabo5KEfXGMlHd5jJ6FhaGNj3yWjYCZiIR7c3dwdGpwgWxpbXx1X2F4d3xxdXxoYGR869q1ycPch3NsdIJ3i5uJj2qZkZCelpSBiXGFiJ+NhIuVioyYlHyNk4iDiY97kIuFj4F/dniDhHKIgpOclpSXhYx1hn5vg4GHhpihgpOMnoOJYYOUj4eKhomNh4GHaXyTf32DhImOjYJxhn5/cXdodnJpdHdsWo19k4OFfYCEgYSKgnZhcmuIgI6JgX5+kZB9bYFrd4SNhJCCe4B8fo+Rj5WIbnB5jIV0a3Fsc3mCYXVqb11sd2FSZXJpZlNgcHZ1YXBgXWiDcXNqV2doYmlYbVZbdUxLTGVnXmJzc4VqXFxleV5eZGd7YWRfXVlrb2ZvanR4in5zc4F+e3Z6iHOFg3x/h3Z3ioaPmYGMgnuTdWx3dnl4k3RueHt9WHqGcYBvZ3l3koNkdoaFcIqWhZmgmqKKh3Rvkoxxd4+cfouaiYl8oH+EmYCBeHJ0bm9kcn9pZm14eFxgeXt7cXGAamFnYX/Vto6RpnhucXd8cZORjYhrmo+JnZOMhntph4uZhoGSkYaHmI58jY2BgYqNfI+MfYmEenR6g3txhoCWmo6Tk4GIdIKFdIJ/iZGcnYaUj59+iGJ/k4eFiISKjYCAg2d8kIB+f4KMj5B+bYN8gnRrbXd1dHd2bGOOgY+AhX59hn+EiX9wX3FvhHuOi4F7fpCIeXCDZXmBiYWKgXqEfH6SjY+Rg21ueYt+dW1ua2x7f2RpbGpZbndaU2pzaWJRY3J4bWNmXlpqg25zYltnX2RsX25VW3BPSE9nZVxnb3GAbVpcY3NgXGNsd2VlXV1aa2xjbWpzd4Z/cXB/fH10eIZ4hYJ8gId1eYmBkpV8iYZ2iIFweHl7hJNvbnuBd16DgHSCbWl6dJRzZ3OIfHGSkYOZnpughoh2dpR/bXeUmH+IkISLjpp9jJp2fnZxcGxqYXV8Z2JqdXpbYHh8em1xf2VjaGdXnY9fcXOWvMSEd3GUipCAdJiMh52UjYhza4iPlYB7lIuBhJuMfIqGfXyJjH+Th3SJhXZ2fYJxdYaBnpWGlI+CgnF+h3ODeoiWm5aGko2cgIhmfZOCgIaDiYlygX1nfYt7eX9/h4uPfWmAfIN2Zm95eHN3dGxrj4aLgot/eYOBhISAa15wd3p9i4eEe4COf35ygGh4gYaJhIJ3gnp/louOi3xta3qIfHZ0b2lofndlXXFjWHB0U1Rvc2liTmh1eWdhXl1Yb4BvdFlkYV1qbWBwT1lsUkRUaGJabG9te29ZW15tY1pjb3dkZ1xdYGtqY2xpc3eBg3Fufnt/dHWDeoSCfIKFdn6JgZaReIOKdIGIc3l5fo2Qb297gXFpgnl6fm5tfHaWa2p4hHRrk4yFnpigmYWIb36Mdmp5mY+AgoqClpiKeo+Wb3pzcWxqZGB0e2lgZnJ7W2FzfXpncHphZWSOsbJ3S2JapdrRl3J7koyReX+WjIWako2Gb2yFkpF5eZOGgISZinyHgHl4iYqElYBviodxdH17anmGg6WRhJOMgn5ufoJ1gneEmpeSipOPlIWHcHqShH6Dg4mDb4F4aICFeHJ/f4OKh3xlfH6DdmNwc4BpeXFvdZmNhoSLfHd5gIR6gmtcb3xyf4eDiH2Fh3qIcYBtcIKFjYKDcYN3f5iLjYN3bW1+g392emVoan5yYVp4Wllybk5YcnRmYEttd3ViXlxbWXV9cnBXZl1manFfb05XaVM/WWdfW3BrZ3lxW1tZa2VZY3B5X2hdXmVsaGZsaXF4f4dvbX99gXVwgnuAgX+Df3aBhYmXinGCjXF7hnx6eYSUjHVren9rb350f31vcnx7lHBvgH95ZpKJgqGYnZGDhmeHhHBnepeKfoCFgpmKgXyNjWl4cmxsZl9hb3ltYGJveVxkbIN6YXF2X2Rl1eu+izI6PouOgHJ5homPjXeFmY5/lI+Nf25thYyLdX2Pf4WClYl8g3hudoeFgpZ3boeEa3V7dGV5g4SnjIOPjIN9bX9zdYJ4hJqPi4+RkoyLhn57kod4gIWNg2yAcml/fnhtfHuBioN4YnmEgnFkcWh+bnVydYKcjIGAhn90dn6Ac4FvW2t9c3iIgYp7hn98iHd5cGuHgo6CiXGAd32UiYp9dG1qdoCAdXVcaWl5cVpXfVNacmZNW3NyZlxKcXhwXVtbWl11f3VpWWJbZ2VuYmlNV2ZRPV5mXV52Zl91cVtZVW9kWmRweVtoXmBnbWdqa2hweH2ObWqBhH95boF7fYF/gnp1goGMk4VwgItud32Ae3uIk4mAaXt+anR8coZ7c3d9f4x6eIR+fGuMjIObnZaMgoFsjX5raH+Pjnx+f4OUgn99iohrdXFnaWNbY2dzb2BhbHRhaHCJemFzdF5iY5ugkG5cNVqvtXVqgIp+k4d3iJiHdZCMindwbYWChnR5iXiJfZOIen5zZ3WIfn2Xb3GGfWh2eW5leomFpYeAh42JfW19dH5/e4qXhoGSkJiIi4SJfI+Jcnx+hXxpfm1rgHt5anp2goeAcmB3gX5xZHJndYJudXuGlZKCfYKAcHd6fHV+bVdtfXVzin+GdoZ0gol6d3JtiH+Of4NxfXt8kYeIem1taG2CgXVuXWhmdHJSXHxOXHFdT1xzcGRWS3N5alhZWVphcYF1YV1dYGZkaGhmTlpoTkFhZFxgdmFcdW1YWFN0YVtlb3JXal9iaGtnbWxpcHd8k2xohIl9fHB/fnuBf4J6d4CAiYuEcnuHb3F3hH97iY2PhGp+e254eXeKd314gIKHf4R+fnpthIyImKONhYR7dot6a22FiZJ5fXuCkoCAfYqEcHJwY2ZeWWdfcHBgYWhwZmpviXRhdG9bYGRqdnt/vpynpMm4coWEc5R9eYiUhHSSjYdyc3CEeoJzdYZ0iHeUiXl5cWR3hnqAkmhxhHVmd3ZkanyEiJ6CgH+Ojn1xfnKDeH6QjoJ3lYyUj4iCiHqJiWx5en91aHppbH95c2l6doCDfWhgeId9amp0aHuAanaBjZGVf3x+fnF8dnx0fmJVdXtxcoiCgnuBcIaJd3hvb4KBi318d3x7c42EgXVocGdsiIJycF1oY3RvTGZ2TF5vVlRadG5iUU90eWJSWFhdYXCCc1thXWhlZWNqZFFbcUlEZGJcZHFeXHhoVVdWd15cZm5oVmxeYWpnZW5uaHB3epNuaYiMeX1ze355goGCfHZ9g4iGg3B2g3Nud4KCfoiLlH9xgHx4enqBi3SDeH+BgYKEeoB1b32Ji5ueiH6Ge3eGe2d1h42Ren+AfImGhHaPgGdwbmBlXFhmWW1zYWFhcWxsaIluYHNpWF5jbYB3qdqpx4aIs3KKeXCOdn2IkIF7lIuAdXR1fnZ/b3B/bYV0lIZ4dGxgeYF5iI5lcYNvZ3VuW219gZCTgIF5kpJ9d3pshXR/j4qDcpWJkY+HhYV7f4ZtdXZ/bWh3Zm18dm1qd3Z/f3xgYniGemh1dmN+e2h1ho+Oln11gHZygHp9bYBZVnJ9b3OChn5/d2uIhnN4anR/goJ8eXt3enGKf3tyZ3NkbYuEbHNbal92Zklvb0xbY1hXVnltYlBTdXdZUVZYXmByhG9cYGNtZGNdb2NUXXJHQmZfXmZpXVp7Y1JWXHVbW2drYVZrYGBuZmZscWhwdniOdGuOjHV/dnh9d4GDgXt0foOIiINvcX91cXV9hYGJjYt7d394hHx9hYd4h3x9gX6FgHt+cnZ4i46fjIl7ind1g3pefoeajXmHhHSGh4R3iXtibm1cYltbYVVqdGRgW2hvcGeHcWFxZldcY2t/fMrOh7qia25vi21yhHJ+hot/e5KFenl0eXV0empsdmOEdpKCdm9nX3yBeYuIZXGAampxY1hte4aciYOCcpeTd317bYZvgImKhnCWjpCIhoyEe3l/cnJwfmdocmNteHFqbHF3fXx5XWV5gHdpdXhmgndodYeMjpV9c4dqb36AeG59XVdwfW1zfol7gG1uin9wdmZ2fn9+gHV7cHlzhXt4cWVyYG2LgWtyWGtfeF1JcGxOV1ZfVFV8a2JPVHZzUlJVV15idIZpXWBramZiWW5hWGNwR0FoXWFmX1xWfF5PVmVxWVtqaF1YaGFfcmZqaHFncXN2hnlulYp0f3t3fnmDh4B1c3+FhY6DcHB7eHd1eYaFh4yGenx/dYt+fYaEhId/fn99h398eHZ5dpGTn36NfYtudYB6ZISImIZ0kopvhYWCeoN1Y25qWV9bXV1VaHNlYFlkcnJngXJha2RXWl9pf3i+rnqfuG5idIdpdXxyeoSHe36NgHd4cndvenZlam9hh3WOgXNqYl59d3iKgmVwfWhra1pWb3iLpIGFf3CZknF/d3SAbH+Aj4Zyk4eMiIWJhX15dXNvaXlham1hbXZqZ2treXd6d1tnfXx4ZXJ9boR0ZnWGjYaWgHCLZ2t7g3RsdWJbbnpqc3qKe4BldId8bXBndH12fH5wemp5eoB4dm9lbGFsiX1sblZqYXhWS2tsT1JPaU5ZfWhiT1V2bE1RVFVeZnaEZ11hcWhnYVdpXFxraUpFa1piZVdYVXlaTldualldbGVdWmVjXnRmbGVxZnNwdIF4cJmFdn9/eH98hYd9dXOCh3+Vg25zeXt7c3KFhoiIhHmBfXaPf32EiY6EgYN7fouDe3d8d3aanZd6ioOHanZ+fWyEhpWBco+CcYWCfoKAb2ZsZ1hdW1xbVGVwZV9YY3J1aXZwZGViV1tbaH9wb3KAc4plZnp/anV3dHSEhXiBhXp3dHVua3pwYWhrZ4Z0jYRuZl5ffG96iX1obXdmamRWV3Nwjqd9hHx2lpBze3F7eGx5eo+DdZd8h4aDh4R9dXFzbWh1XW1pYG11ZGdmaXpve3JZZ4F2dWhwgHiCdmJ3hYt8lYJvjGtte4FxZnNlYGt4ZnF1iXp9YXWDdWlrcXR5b3h3cntlfX1+d3VuYmVgbIZ8bWtWamNyVExqa1BMT3BIXnxmYU5WdWVKT1NYYWt3fmZdZ3NpZV9XY1dicV1LS2tYZGJVVFVzVk1ZdmVaX2xgXFtjZV93Z21icGl0b3F+dXSZgXd/gHiAf4aEen12goN+mIVucnR8e3RxhYWOgYB6i3V0kIB9gZSOgIWEfX6Mhnp+gXZ7o6WKeYmGhWx1fHx1hIONe2+Fc3qFfYKDdW5qaWVWXVtbWlNjbmVbWGJ0e2ppbWhgYVdeWmmAaWxvgGdtYml7emt0dXVvhoJ6gX52dW56aGp5al9lbmiBd5CEaGVYYXZpfYZ5bmlvZmddVVhvaY+od4F6fJCOeHRufW1xdHiNfneUdIWDgIWJdmpzdmhpb1xtZV5uc19nYmp4aHttW22DcnRqb4B+eXdhd4WEeJCGc4hycHp/cmNxaFttdmRvcod6d2FygG9naXhzcWt3dnN1YoJ6fXZ1b2NiYm18fGtrVWliZ1RMbmhQSFJsRWF5ZmJNVHJeSk1VWWVseHtmX21wamNdVmBVb25XSlNoWGdeWE1VbFRLXXpfXF9sXV1bYmVgemhsYW9vdm5vd3V6mH13gIF5gICHhnp5eoN9gZOEcXR0fnp2dIWIkH6BfZBsc5WBe4KfhX+HfYB+hoKAint1hKyff3qIiIRscoJ6doGBgnVuh299gHSKgGpvbmVkWF9aWlpVYmpnXFpfdYJpXm1sXGFXW1xrgWVxdX1pal5teHdodXhzbod8fn56dnNsemdpd2ddZHNneneSgWNjVGRvZoGEdnZmaGphV1ZZaGOQqG9/d3+Kjnpwb3tmd215inp2jnGDfX9/h25kd3RlaGldbGJecHBbZ19tdWV6aF10gG5ya3F7fnV1YnWGjHuIiIB/eHJ1fnRhcGxYcHJhb3CDenRjcYBrYGx6bmloeXdzcGSDdHh4dHBkYGNtcn1qbFRpXl9VTHVjUUdXYkdjd2ZhTFRwWUtMWFhobHZ6ZWRtcWZjWlhdWHZmVEpcY1hpWFhIV2VRSWN4W11fbVteXGJjXn9pamBudHhtb252g5d5coGAfX+JjIZ+dXaGeIaMfXR1dYJ5enqCjI59foWJanSWgXuKnX1+hXmAe358holzcY+ujHt7h5B+ZnGIenR+fXZyb4ZsfH5tkHpjcHBiZV1lVlpZV2Nma2BdXXOGaFlxblteWFpcbHticXd2bGNcbnR1aHV3cW6FeX+Bendvb3RlaHRlW2d1ZnZ2knpfXVNlZWqCgXN8YWNpXFRXXmJkkKVpeXSChZB4bG15Zndse4N5dIdygHh8eYBpZXdtYGdhX2tgXnVrWWZdb29iemVbd3xrbm5weHl0dWVzg5N/iIOJenZvcn1yYXhjWm5vYG9wgHpzZXGAZF5tdWhjZnh6cmttgHNye3FxYV5lbW59ZGlUaFlaVU55X1JKWllIY3VkYUpUbVVKTFpXaWxye2RsbHNiYVlaW2F2XFRLY11ZalNWR1lhTkhqdlhfYW5bW19iY12FaWhibnd5bW9qdoGQeG2DfoCCkoiEgXZ1iXSMhnRxdnaBd319foyPgX+TfnB4loN9mZJ5gIB4eX5/c4eEc3CZonp7gImVeWV1iHpzeXdsdHB/bHl8cJJzXnBvYWdibFRbWldpZG1mXFxxiWVTcm5bWVhXYGx2ZGp1ampfW250cm10dHVrhn1/gH13b25sZGlwY1trcmR0do5zXFdUZGBxf35xgVxiY15TWmFcZJOfZXJxhYOQc2tqeGxubnl5enGAdn9ze3p7ZGZ2aF5jW2FoXF53aFdiXnBoYXdhW3x2ampyb3h0c3RpcYKVg4d/hXZzanB8bWZ3V1tpbGFwcX94c2VvflpgcHBhXmlvfGtqcn1xb3Zpb2BbZGtse2FmVGdVWFNRd1xSUFlSSGRzYmBHVmtRSVBaVWtsa3xlbW9yYVtaWFlscFdTUGZXV2lTVEZaXE9Jc3VYYGNuY1hhYWJdjGpjZW16eWxuaXZ5hnprhH2AhZl8goR5fYhtj4Zxb3Z6fXSCgn2Lj4OCl3R4gpSFgZ+JdYF/gXR/gnCHg3Zvopdze4aLh3tmd4tvbnxwZ3hxe2xzdnONa150b2JnZWtTXlxWaGJsbFtccY1kTm9tXFZXVWdpdGhjdGVlXlpwdm9xdnZ6bIh9gH2Id5BzY2Rrb2Fcbm1jc3iHa1pUVmJjd3x8cIRcY19jVFpgWmOXlWNucIKFiXJpZnluZHJ1cXpreXR1b3t/dl9nc2RcX1diZFlhdWVVX2BtZGFxXV1+b2hpc3F0cHV2bG2FlIKJfIVxcmdufG9xb1JaZWlkcHJ/dXNibHVVYnFqW15uZHtka3R8cXFxaWxfWGRpanheZlVkVVdRVm9YUVdUUEhlcl9hRlhrT0lYVFZuaWR8aWt4a2FXXFVbdGRTUlZoUVlnVFNIWltQTnl3W19lbWpaYmBfXo9uYWdreXZubml2dn9+bYSAfoaXe3+HgYp/a5OIcmd0gHt1gIN+iY5/i5NzfYqRhYefhnt/hoxzgIZzfYJ1bqSMc4GNi3d4bnqNYGV9cWd6dHlsbXF3g2dkfG1jZ2doU2BfVWdgbG9cXm6OaE1pbGBVVlNvZnNrZnhlZV1acnZuc3t5c26Je4B3nHt6a2FlbG1eYG5qZXB5fmdaVlhfbHh7em+DX2JeZ1ZZYFhknIhia3CBhnx3a2p2bFt1cGp5aXVybm98gXNYa29gWV5WY2RYZXFjVF9iaWFibFpgfmtmbHN1b214dmxohox/iXuIbXFmcHtscWxhWF9nZ25yf3NyXmlsU2VwZFVibWF4YW90enRpbmtqXldgZmh1XGRWYlZUT1lnU09dT1BIZXBdY0daak5KYEtYbWVfeGhufmRgVV5UXXVbVFJgZ05eYlVTSlxaUVp2dl1fZm1oWGNhW16OcGNoandyc21odnR5gnOCg3qIjn58ioiOeW6PinRsc4Jzf3+IhYeShJWPen2Mj4iRm4SAfIyEcn+Bc3R3cW6Tk5OTk5OTk5OTkpKSkpKSkpKSkpKSk5OTkpKSkpKSkpKSkpKSkZGRkJCPj4+Pj4+Ojo6Pj46OjY2Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2NjYyMjI2NjY2Njo6Ojo6OjY6OjY2Ojo6Oj4+Pjo2NjY2Oj4+Pj4+PjoKAfnp6fX5+fX1/fn59fn5+fn5+fn+Af4CAgIGAgIB/gIGBgYOHjI6Ojo6NjY2NjY2NjY2NjZKSkpOTkpKSkpKSkpKSkpGRkZGSkpKSkpKSkpKSkpKSkpKSkpGRkZCQkI+Pjo6Ojo6NjY6Ojo2NjY2Njo6Njo6OjY2NjY2Njo6Ojo6Ojo6NjYyMjY2MjIyNjY2Njo6Ojo6NjY2NjY2Njo6Ojo6OjY2NjY2Ojo6Ojo+Ogn99ent8fn59fX5+fn5+fn5+fn5+f4B/gICAgICAgH+BgYCBg4aMjY6NjY2NjY2NjIyMjIyMkpKSkpKSkpKSkpKSkpKSkZKSkpKSk5KSkpKRkZGRkZKSkpGRkZGQkJCQj4+Ojo6OjY2NjY2Njo6Ojo6NjY2NjY2NjY2NjY2Njo6Ojo6Ojo2NjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Njo6Ojo2NjY2NjY2NjY6Ojo6Cf3x6fHx9fn19fn19fX59fn5+fn5+gH9/gICBgYGAf4CAgICDhouOjo2NjY2NjIyMjIyMjIySk5OTk5KTk5KSkpKSkZGSkpKSkpKSkpGRkZGRkZGRkJCQkJGRkZCQkJCPj46Pjo6Ojo6Ojo6Ojo6NjY2NjY2NjY2Njo2MjY2Ojo6Ojo6OjY2MjIyMjIyMjIyMjY2NjY2NjY2NjY2NjY2Njo6NjY2MjIyNjY2Njo6OjoN/fHp8e31+fH1+fXx9fn59fn5+fn5/f3+BgYGAgICAgYCAgIOGi42NjY2NjIyMjIyMjIyMjJFtZmdnZ2dnfYWEhISEiF0tMDAwMC1GoaGhoaGhoJqZmpqampqKg4SEhIOEd2VnZmZmaFxDREREREJLkpqZmZmZmnpsbm1ubm9qZmdnZ2dmb4SDg4ODg4OLjIyMjIyMjY2NjYyMjY2NjY2NjY2NjIyMjIyNjY2NjY2OhX19e3t6fX58fH59fX1+fX1+fn5+fn9/f4GBgYCAgICBgICAgoWKjI2MjIyMjIyMjIyMjIyMkWdfYGBgX155g4KCgoKGUxgdHR0dGTekpKSkpKSjnJycnJycnImBgoKBgYJyXV9fX19hUjQ1NTU1Mz+TnpycnJydd2VnZ2dnaGNfX19fX15qgoGBgYGAgYqLi4yMjIyMjIyMjIyMjIyMjY2NjY2MjIyMjIyMjY2NjY2GfH16enp8fXt8fn19fX59fX5+fn5/f3+AgYCBgYGAgIGBgYGChYqNjYyMjIyMjIyMjIuLi4uRjo2NjY2NjY+QkJCQkJCMh4eHh4eHiZOTkpKSkpKRkZGRkZGRj46Ojo2NjYuJiYmJiYmIhYaFhYWFho2Ojo6Ojo6LioqKiomKiYiIiIiIiImKioqKioqKi4uLi4uLi4uLjIyLi4yMjIyMjI2NjIyMjIyMjIyMjY2Njoh8f3l7enx8e319fX18fX19fX5+fn9/f4CBgYGBgYGAgYCAgYKFioyMjIyMjIyMjIuLi4uLi5GSkpKSko2QkpGJh46KkJKTkYuSjo2RiI+RkZGRkJCQkJCPj4+Pj4+Ojo6Njo6Ojo2Njo2Njo6Ojo6NjIyMjY2NjY2NjY2NjY2NjY2MjIyMjIuLi4uLiouLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyNjY2NiX59eHh5fH18fX19fHx9fX59fn5+f3+AgICBgYGBgYCBgIGCgoSKjIyMjIyMjIyLi4uLi4qLkJCRkZGPhI6QkIaKj4WNkJCOhY2HhomGiJCQkJCQkJCQkI+Pj4+Ojo6NjY2NjYyMjIyMjIyMjIyMjIyMjIyMjI2NjIyMjIyMjIyMi4uLi4uLi4uLi4qKiouLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjI2Lfnx3dnh7fXx7fX18fH19fn5+fn5/f4CAgIGBgYGBgIGAgIGChIqMjIyMjIuLi4uLioqKioqQkJCQkIqFjoiOhoaPiY2QkJCIi4aFhIWHj4+Pj4+Qj5CPj4+Ojo6OjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLi4uLi4qKioqKi4qKi4qKi4uKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIt+e3d2eHt8fHx9fX19fX1+fn5/fn9/f3+AgIGAgYGAgYCBgYGEiYyMi4uLi4uLioqKioqKipCQkJCPhYOMjpCOiYyKjpCQkIiLhIeEhomPj4+Pj4+Pj4+Pjo6OjY2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKioqKioqLi4uKioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMin18dnZ4fHx7fH19fX19fn5+fn5+fn9/f4CAgYCBgYGBgIGAgYSJi4yLi4uLi4qKiomJiYmJkJCQkJCMhoyJjoeFjYmOi4yQiIyGhoiDio+Pjo+Pj4+Pjo6OjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKioqKioqKioqKi4uLioqKioqKioqLi4uLi4uLjIyMjIyMi4uMjIyKf353eHp8enp8fHx7fX1+fn5+fn9+fn9/gICAgICBgICAgYCBhIqMi4uLioqKioqJiYmJiYmPj4+Pj5CMjouPjIqPjI6MjY+LjoyLjomOj46Ojo6Ojo6Ojo6NjYyMjIyLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLjIiAfXh5enl6e318e3t9fn5+fn5/f35+f39/gICBgICAgIGBgIGEiouLioqKioqJiYmJiYmIiI+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Ojo6Oj46Ojo6Ojo6Ojo2NjYyMjIyLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLioqKi4uLh4B8eHp6eXt8fHt8fH1+fn5+fn9/fn9/f39/gIB/gYGAgIB/gYSJi4qKioqJiYmJiYmJiIiIj4+Pj4+Pj4+Pj46Pj4+Oj4+Ojo6Ojo6Ojo6OjY2NjY2NjY2MjIyMjIuLi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKiYmKioqKioqKioqKioqKioqKioqKi4uHgHt5eXh6fHx6e3t9fX5+fn5+f39+f39/f39/f3+BgYCAgH+BhIiLiomJiYmJiYmJiIiIiIiOjo6Ojo6Pj46MjI+Sj5COjo6Ojo6NjY2NjY2NjY2NjIyMjIyMjIuLi4uLioqKioqLi4uLi4uLi4uLi4uMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKiomKiomJiYqKioqKioqJiYmJioqKioqKioqKioqKioqKioqKi4aBe3h5eHp8ent7fH19fn5+fn5/f35/f39+fn9/f4CAgYCAgIGEiIqJiYmJiYmJiIiIiIeHh46Ojo6Ojo6Ojo+MkJOQkI+Ojo6NjY2NjY2NjYyMjIyMjIyMjIuLi4uLi4qKioqKioqKi4uLi4uLi4uLi4uLi4uMjIyLi4uLi4uLioqKioqKioqKiYmJiYmJiYmJiYmKioqKiomJiYmJiYmJiYqKioqKiomJioqKioqKhYB6eHl5fHt6ent8fH1+fn1+fn9/fX9/f35/f39/gICBgICAgYSIiomJiYiIiIiIiIeHh4eHjY2Ojo6Ojo6Pj4+PjoyNkI2NjY2NjY2MjIyMjIyMjIyMi4uLi4uLioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYmJiYmJiYmKioqJiYmJiYmJiYmJiYmKioqJiYmJiYmJioqFf3l6eXh7e3p7fHx7fn5+fX5+f39+f35/fn+Af3+AgICBgYCChIeKiYmIiIiIh4eHh4eHh4eNjY2Njo6Oi42Nj5WPiYyPjYyNjYyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYR+eXt5ent7ent9fHt+fn59fn1+f35/fn9+f3+AgICAf4CAgICEh4mIiIiHh4eHh4eHh4aGhoyNjY2NjY+MjImKj42IjJGPjY2NjIyMjIyMjIyLi4uLi4uKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uKioqJiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJg355e3p8e3p7fX17fH9+fn5+fX5/fn9+f3+Af4CAgH+AgH9/f4OGiIiHh4eHh4aGhoaGhoaGjIyMjIyLiYyKiIeJhoyOjJCMjZGOjIyMi4uLi4uLi4uLi4qKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiImJiYmJiYmJiYmJiYmJiYmJiYmIiImJiYmJiYmJiYmJiYiIiIiIiYmCf3h7e3t6enx9fHx9f39+fn19fn9/f39/f4F/gIB/gICAgICAg4aIh4eHhoaGhoaGhoaGhoWMjIyMi4yOjoyKioeEiIuKjIuNjo+Li4uLi4uLi4uLi4uLioqKiomJiYmKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiomJiYmJiYiIiIiIiIiIiImJiYmJiYmJiYmJiIiIiIiIiYmIiIiIiIiIiIiIiIiIiIJ/eHp7enp6e3x8fX1+f35+fX1+f39/fn+AgICAf3+Af4CAgYCDhYiHh4aGhoaGhoaFhYWFhYyMjI2NjJCSjI2Ii4mJi4uLi4mLjIqMi4uLi4uLioqLi4qKiomJiYmJiYmJiYqKioqKioqKioqKioqKioqKioqKioqKiYqJioqJiYmJiYmIiIiIiIiIiIiIiImJiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIiIiIiIiIiHgXx4e3x5enp8fHx9fX9/fn59fX9/f39+fn+Af4B/f3+Af4CAgIKEh4eGhoaGhYWFhYWFhYWFjIyNkY+PjZGJjIaJjIuIiImMiYeNjo+NioqKioqKioqKiomJiYmJiYmJiYmJioqKioqKioqKioqKioqJioqKioqKiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4WAenl9e3t7enx8fHx9f39+fn19f39/f35+f4B/gH9/f4B/gH+AgoSHhoaGhYWFhYWFhYWFhISLi46PjoyLj4iHiYmMjYWFjo2KiYyNi46KioqKiomJiYmJiYmJiYmJiYmJiYmJiYmKioqKioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHhoaHh4eHhH55eX16enp7fXt8fX5+f35+fX5/f39/fX5/f3+Af39/f39/f4CChIaFhoWFhYWFhYWFhISEhIuLjI6MjI2Lh4mIiomGgoiNjoiKi5GTj4uJiYmJiYmJiYmJiYmIiYmJiYmJiYmJiYmKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIeHh4eHh4eIiIiIiIiIiIiIh4eHh4eHhoaGh4aGhoaGhoaGh4eDfXp5e3p5enx8e31+fn5/fn59fn9/fn9+fn+AgICAf35/f39/gIKEhoWFhYWFhISEhISEhISEioqOjYmIiIqKh4iHiomIioiIh4qGi5GPiomJiYmJiYiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHh4iIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGh4J8eXl6eXp7e3t7fX5+fn5+fn59gH9/f39/f4CAgH9/fn9/gICAgoSGhYWFhISEhISEhISEhISKi5CPiYmJi4qHh4WHiYuKiYSLjYmOjYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiIiIiImJiYmJiYiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGgXt4enp4e3x7e3x+fn9+fn5+fX1/f39/f3+Af4B/f39/f3+Af4CChIaFhYSEhISEhISEhISEhI+Qj4+IiYuIhoeIiYuLjIuJioqNio6Oj4iJiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoaAe3h5eXh4enp8fX1+f35+fn59fn9/f39/gIB/gICAf39/gIB/gYKDhoiGiIaDhISEhIODg4ODkpKOioeKi4qLh4uNiYqJi4iHiouIio+SioiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhn96eXh4eHl5eXx9fn5/fn5/fn1+f35/f3+Af39/f4CAgH+AgH+BgoOHjo+PjoiHhIWFhoaFhYWSkI6KiYmIiImKioiIh4aKjIiHiYmOkJGNh4iIiIiIiIiIiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4aGh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWGf3l4d3d3eXp5e3x9fn9+f35+fn5+f35+fn+Af4CAgICAf3+Af4GBg4eOjo6Ojo6Mjo2OjY2MjZCQjomHhoiJiYeIiouIiYyJiYaKjY6PkYuIiIiIiIeHh4eIiIiIiIiHh4eHh4iIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhYZ+eXd5d3d6eXl8e31/fn5/fn5+fn5+fn9+f4B/fn+Af39/f39+gIGEiI6Ojo6Ojo6Ojo6Ojo2NkJGOi42JjIiIiYaHiYaIioiHi4yLjpCQiIeIiYmJiIeHh4iIiYmIh4eHh4iIiYiIiIiIh4iIiIiHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhoaFhYaGhoWGhYSEhIWFhoaFhIWFhX55d3l2eHl4e3x7fn5+fn5+fn5+fn5+f39+f39+f39/f35/f3+AgYOGjY2Ojo6OjY6NjY6OjY2Qj42Ni46KhoiKhISLiYeDhYSDi4mLj42JjI6QkI+NjYyLjY6Pj42NjI2Nj4+Pjo6MjYyMjY2KiYiHiImHh4aHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoeHiYqKiIeJi4yNjo2LiImLi42OjYyJiImMgHl3d3Z6eXh7e3t+fn5+fn5+fn5+fn5/f39+fn5/f4B/f4B/f4CBg4aMjY2NjY2NjY2Qj4+Pj46NjI6KiYuMjIeFiY2Lh4aIh4aHh4uNjo6Pj4+Pjo+Pj4+Pj4+Pj4+Pj4+Ojo+Pj4+Pj4+Pj4+Oj46Oj46Mi4uJh4eHh4aIhoaGhoaGhoaGhoeLiYeHiIiLjY2Mi4yLjY2Ojo+Ojo6Pj46Ojo6Ojo6Ojo6Njo6NjY2AeHZ4eHp4enx6fH5+fn5+fn5+fn5+f39/fn59fn9/f39/gH9/gIGDhoyMjIyMjY+QkpOTk5KSjYyMjIqHioyKh4eJiYWCiouIiYWJjpCNjo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjI2NjI2LiYaHh4eHiYqLjY6NjYyNjY6OjY2OjY2NjY2NjY2NjY2NjY2OjIyNj4+OjY2MjIyLi313dXd5enp7e3p+fn5+fn5+f35+fn5/f39+fn1+f39/gICAf3+AgYOFj5KRkJGSk5OTk5OTkpKLi4uLiomMiouLiYuKhoeOjYiIjI6OjIuMjIyNj46Njo6Ojo2NjY2MjY2NjIyMjIyMjIyMjY2NjYyMjI2NjYyMjI2NjIyNjIyMi4yMi4yMjI2MjIyMjIyMjIyMjIyLi4uLi4yNjY6Sk5OSkpSRkJOVlZSTk5COjo6Oe3Z2d3h6ent7e31+fn5+fn5/fn5+fn5/f35+fn9/f39/gIB/f4CBgoSNkpKTkpOSkpOTkZKSkoqJioyJi4qJjIuKioiHiYqKi4mKjY2Mj46Nj5KUlJOUlJOTkpGSkI+Ojo2NjY2Pko+OkZGOjIuKioqLi4qKi5CPjoyMjIqKioqKioqKiouKioqKi4yLi4uMjIyKiouLi46RkpOTk5SUk5STk5SUlJOTk5KSkpKSk5F6dXZ2eHt7e3p6fX5+fn5+fn5+fn5+fX5/fn5+f39/f3+Af39/gIGChIuRkZGRkZKSkpGRkpGRiYmIiIqMiYiJiYuJhoSJhoyKh4ySkpKTk5OUlZWWlZWUk5OUlJSUlJSUlJSVlZWVlZWUlJOTkY+QkZKQjoyRlZWVk5KSjo+QjYqKi4qKi42OjY6RkpCRkpKSkpGRkpKSk5OTk5OTk5OTk5OTkpOSkpKSkpKSkpKSj3h1d3l6e3t7ent9fX19fn5/f35+fX5+fn5+f39/fn9/f4B/f3+AgYKEi5GQkJCSkpKRkZGRkZGIiIiIi4uJg4eLi4yMiIeHjYyNkpSSkpOTlJWWlpaVlZSSkpOTlJSUlJWVlZaXlpaWlpWUk5SUlJSVlJSUk5OVlZWUk5KTk5OTkJGSkZGSk5OTk5KSkpOSkpKSkpKSkpKSkpKSk5OTk5SUk5OSkpOTkpKSkpGRkZGPdnJ3enp7e3t8fX59fX1+fn9+fn9+fn5+fn6Af39/f3+Af3+Af4CBgoSKkJCRkZGRkZCQkJCQkIeHh4eIiIiFi4+KjI6Njo+OkJWUk5OTk5SUlZWVlJSUk5KSk5KTlZSUlZaWlpaWlpaWlpSTk5OTk5OUlJOSk5SVlZSTkpKSkpOTk5OTk5OTk5KSkpKSkpKSkpGSkpGRkZGRkZKTlJSUlJSTkpGRkZGRkZGRkZGRkYx0c3d6ent7e3x9fX1+fX5+f35+fn5+fn5+fn9/f39/fn9/f39/f4GDhIqQkJGRkJCQj4+Pj4+Ph4iKi4yNjYuOj42Mjo6RkpGSk5OSkpKSk5SUlJOSk5OSkpKSkpOTk5OTk5WVlZWUlZWUk5OTk5KSk5OUk5KTlJSUk5KSkpKSk5OTkpKSkpKRkZKSkpKSkpKSkpKSkZKRkZGSkpOTlJSUk5OSkZGRkZGQkJCQkZCRinN0dnp8fHp7fXx9fn59f35/f35+fn9+f31+f39+fn59f39/gH+AgYKDipCQkZGQj5CPjo+Pjo+Oj4+Pj4+Pj4+PkI2OjpCRkpKSkpKRkpKTk5OTkpGSkpGRkZGSk5KSkpOSk5STk5OTlJOSk5OTk5OTk5OSk5OTkpKSkpKSkpKSkpGRkZGSkZCRkZGRkpKRkZGRkpGRkZGRkpKSkpKSkpKSkpKRkJCQkJCQkJCQkJGGc3V2e3x8e3x9fX1+fn1/f35/fn5/gH9+fX5/fX5/fn5/f3+Af3+BgYGKkI+PkI+Pj4+Pj4+Pj4+Oj46Oj4+Pj5CQiI2PkJGRkpKSkpOTk5OTkpKSk5KSj5KRkZKSk4aFk5GRkpKSkZKSkpKSkpKTk5KRkZKTkpGRkpKSkpKRkJCQkJGRkZGQkJGSkZGRkZGSkZGRkZGRkZGSkpKSkpKSkZCRkZCPj4+Pj4+Pj4+PkX9ydHh8fHx7fHx9fX5+fn9+fn5/f3+AgH99fn5+f39+f39/f4CAf4GBgYqPj4+Pjo6Ojo+Pj46Ojo6Ojo+PkI+Pj4+GjpCQkJCRkZGRkZGRkZGQkJCQkJGCgJKQkZKNdYeRkJCRkZCQkJGRkZGRkZGRkJCQkZGQkJGRkZGRkI+PkJCQkJGRkJCQkJCRkJCQkJCQkZCQkJCQkJCQkZCQkJCPj4+Pjo+Pj46Ojo+Pj4+PeHJ2eXx9fHp9fH19fn5+f35+f39/f4CAf39/fn5/f35/f39/gIB/gYGAio6Ojo6NjY2Ojo6Ojo6NjY2Oj4+Pj4+PjoiQkZCPj4+QkJCQkJCQkI+PkJCPkIhwgpCPkHt1iJCPj4+PkI+PkJCQkJCQj4+Oj4+QkI+PkJCQkJCPjo+QkJCPj4+Pj4+PkJCQkI+PkI+Qj4+PkI+PkJCQkI+OkI+Pj46OjoyMjY2NjIqDiYhzc3Z4fX58eX18fX1+fn5/fX5/fn9/f39/f4B/f39/f4CAgH+AgH+BgYCJjY2Ojo6Ojo6OjY2OjoyNjY6Ojo6Ojo2NiJCRkI6Njo6Ojo6Ojo6Pjo6Ojo6PjHNuiY+JcniHj46OjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Pj46Oj4+Pj4+Pj4+Pjo+PjY2MjYyNjoyLi4mJiYiFhYSDgoKEgnR5fXp4dXJrZWltb2xmZmdncHNzd3l9fnl6e3x9fX1+fn59fn9/fn9/f39/gIB/f3+AgIGAgIB/f4CBgImNjY2NjY2MjYyMjIyMi4uLjYyMjIyMjIyGj5GRjIyMjIyMjIyMjIyMjIyMjIyMdm16j4JzeIaNjY2MjIyNjY2NjYyMjI2MiomKi4uJh4KAh4iEgXt6gH57fXx8fXlzcnJycnV1cG1ramppZ2NkYV9bXF1eWFVXWFlTS0VJSkpLTE1PT0tgdHR3eX19eHp5e3x8fX5+fn1+f39+f35/f4CAgH+AgICBgYCAgICAgIGAf4OEhYSFiIuLjYyMjIuLi4yGiYqKioqKh4OOkJGNiouLi4uMiYmKioqKiouLi4dzbW2CeXR1gIWDhIeJiYWCg397fHl6e3pzcHFxcW1samdsbWdlZmVmZGNlZGVkZWVlZWRkZGNhYV5dXFlYWFdUUFFSU1JTTU1KSUZESEpHR0hHR0xOSWdzdXh6fXp4d3l8fHx8fn5+fn9/fn9/f39+f4CAgIB/gICBgICAgICBgYFnXmBjYWNucX17ent/fXd8fHZ4ent4eHpvcXt4eXt8e3h3e394dXd0dHZ1dXZ3dGFeZF9ianBmaGtsbm9tamlpaGhlZWRkZF9gYWJgYF5dWVhaWltdXV9gX2BfX19gYmFeXl5eWVldXF1bV1dWUlRSU1NOUUpISUZERUhMTEhGR0lLSklNbXJ0eHp7end3eXt6e3x+fn1+f39+f35/f35+gIGAf3+AgIGAgICAgICCgWdYW1pZXFtcY1xaXF5ga3FtcHBvbm5vbmtpbmxrbG9qaWtraWpraWZmZ2dnaGhhX21sXWZnZ2ViY2JhYmBgXVhbW1dYV1RWUVBUU1NNSkxLTExOTk9UWFhXVVVUUlBQTU1QT05LTE1QUU9MTEpHSUlHSEhJSEhIR0ZHSEpKSEhISUlISVZwc3V5ent5dnZ5enp7fH59fX5/f35/fn5+f3+AgX9+f4B/gICAgICAgIGBbFtYVlZWWVlaWVlYVVZoamxubmxra2poaGloZGVkYlxiZl9fYWNfXF9dYF1eWlprd2xib3NqYlpZX1tYV1NOTUtLS0tMSUtNTktKS0tMSktQTEtLRkdHSUlGR0lISUZFSEdGRkVERUVEREVJSUlHSEdIRkZLTUtJSUlIR0hLTU1LTExMVXFzdnl6e3h2d3h3ent8fn1+fn9/f39+f3+AgIGAfn5/f4CAf4CAgIB/gYJoUlRVVlNVV1lZWVdXV1tbYWNfXlxbWFZWWVZSVFJRUVVUU1NUUE1KTU5QUk9NW2pya19sdHNnUVFTUFBOTk9NSk1MS0xKSktLRklJSkxJR0pISUlFR0dGRkVFSElKR0ZHRkZHR0hKR0dISEpMSkpLSUlISktLSkhKS0pISUtMTU9QUEtUdHN1eHp6eHZ2d3d6enx+fX5+fn5/f35+fn+AgYB/f3+AgYB/gICAgH+AgmlQUlRXVVRWWVdYWFpbVFRTUlBRU1FRUU9OTlBQUU9MTlBPTk5NTEtNTk5QTU5cY25rWmlzdXBTTU9QUFBPTk5PTk5QTk1NS0lISEpJSUlJR0ZHR0dJSkhJSEhJSEhHSEdISElISUxLSklISkpJSkpIR0pMS0pJSUhKSktMTk1NTU9RTFVzcnN3enl3dnR2eHp7fX19fn5+fn9+fn5+gICBgICAf4GBgH+AgICAgICBbE9PTlRZVVVdW1lXV1hOTUpKSUZKT0xKSkdJSk1NS0pMTUpHSUlJSktLRUNFSVZiZmtxcG5tbFpNTE5NTk9NTk9MTk5OUFBPTE1MTk1MTEpJSEdJSElISElJS0xLS0pJS0pJSklJSUlJR0dKSUdJSUpKTk1OTEhJSklJSk1PT01MT1JOWXBwcnd4d3d0c3R3enx+fX5+fn5+fn5+fn9/gICAgICAgYCAf39/gICAgIFvS0pNTlFOTlVXVlZSU0lFQ0VFUkREQT5CP0RAQD5CREFAQURHRkVIRUNHSElOW2doZ3FubmlmZGBfX1hMSklKSUlLSkxQTk1MTU1MTU1NTElIREZGR0ZGRklKSUlLSkhMSklKSkpJSEhKS0tIRkdJSklLTU5OSktPTUxLTU1PUE5QT1BgcG9yd3h2dHJzdXd6fX19fn5+fn9+fn1/gICAgICAf4CAgIB/f3+AgICAgXNQUE5OUE1KS1BSUE5RQ0RCQUZRRT1DPT9FSDk6Oz0/PTxBRkA+Ojw9SFlcW15mbG5rb21tbGtpaWpiUUdFRUZFR0dHR0pHSEpLR0NER0pHQ0RFQUFDR0hHSEdISktKSElMS0lISktLTU5MTUxMSkpMS0lLTU9PUFNRT1BQTk9QUlFNUGdwb3N2dXRycXR4eX19fX1+fn5+f4B+foCAgH9/gIB/f4CAgH+Af4B/gICCdlRVUVFQT0xNUFBOT09BQkFAQkE/Oz48Pj8/Ozg5ODs7OkA6Oz48Ozs7PUpaaG5ucGpubWtqbGxkT0dFREdJSEM/QEBAQUFCQUE/Pjw9PkFAQD8+P0BFR0dHSUtMTk1OTUxNTUpLTVBVU05MTlFOTk1OTE1NTk9OTk1LS05OTk1OTkxUbnBwc3R0c3Fydnh5fX19fn1+fn5/gH5+gICAgICAgH9/gICAgH9/gH+BgIJ4UVFSVFJTUVNTUVFST0BAPT4/PD8+QEE/PT45Ozo7Ozk5Ojg4Ozw5Nzk7Oj1FYG5zbm5sbGxmUUI/Q0ZEQ0NDPzs+PkBDQ0E/Pj9BPkBAQj9APD9CQEFDRUVFSktQT1BPTU1OTExMT1JRUFJOTExPTUtOT0xMTEtMS0tKS0tKTU1LS1xxcXF0c3RycXR4eHl9fn1+fn5+f39/fn5/gIGAgH+Af4CAgICAf4CAf4CAgXxSTU9RUFFSUlRSU1NOPDs8Ozs7P0BBQkA9PDk8PTw6Nzk6Ojk3OTo6Nzg6OTk8SFx0dXFlUD46Oz1AQUA9Ozs+PD08QEJDQT9BQkE9Pj09Oz0/Q0RCQD9BREJFR0pKSkpKTE1MTExNTExOVVNLTE1USVBKSU1KSUpLS0pJSEdKS0lKZnJxc3RzdXJydnl6e31+fn5+fX9+f39/f36AgICAf4CAgICAgIF/gIF/gYCBgFZMTlBQTlJRUFBRUU44PT88PDo9PkFAQT8+PkA/Pj48PT0/QD09PT9DOz09Pjw6QWp8aT05Oz49Pj9AQEA+P0E/QEBBQEBAPT8/PTw6Oz09PD9AQUJCQUBCREZGRkdGR0dISUtMTExLTEtKS0lKSk1MTEpMS0lISUxMSklJSElLR01tcHF1dXR1c3V4eXl8fX5+fn5+fn5/gH9+gIB/f39/gH+AgYCAgYCBgICBgYCCYUtPT05OT1BPT1BQTzo8Pjw9Oz8+PkFBPz0/Q0NEQT89PkBBP0A8XG5APkRFP0BBQVtjPD09Ozo9PkFBQD5AQD9BPz89PD48PTs7PD0+QUA/QD5AQ0NEQkRFSEVFR0hISEdGSUpJSUlJSUhKSkpKTEtKSklJSEhKSktMS0lLSkpIVnBwcXNzdHR1eXp7fHx+f35+fn5+f39/f39/f3+Af4CAgICAf4GBgICAgIGBgIJtTFBRTk9QTk5PUFBPPjw8PT4/P0A+QEA/Pz9CRkQ+PDw9QD04Ojttd0g4Ozo9PkE6SWQ9PD08ODo7Pz89PD07PEA9PTw8Pjs9PD0+QUBCQUBAP0JEQ0RFRkZGQ0VHSElJSEhJS0tMTUpKSUpNTUpLSktJSEhISEpJSktKSk5MSUlfcHBycnJ0dXZ6e319fH5+fn5+fn5/f35/f36AgIB/gICAgICAgYGAgICAgIGAgnZNTk5NTk5MTE5QT0w+QTw8PT8+QkM/PkFBQUJBQFlSPD09SUxGRnV3TTc4ODo7Pj5WakE7PDw6Ojs+Pz89PTk6Pjw9Pj89Oz4/QEJDQkJDQ0FCQkFCQkRCQkRCRENGSUdGRkhJSUtNSklKSktMSkpJSkVESUlGRkhISUpKTEpGRmdwb3FxdHZ1d3t8fH18fn59fX1+fn9/foB+fn+AgH+AgICAgICBgYCAgICAgICBek5JS0tMTExFSUxOTTw/PDw9PkBAQUE7QkNCQ0BDcnlJO1x/g396fHdXPD0/PT0+RWh0TDo9Pj89PT9BQ0A8OTtBPz4+QT07P0JAQkNCQENDQUNBPT0+QD0/QUFBQENFRUBAQ0JDR0dFRENGRUZGR0VEQEFHR0ZDRkRHSEpHQz5IbG9wcHF0dXZ5fHx8fHx+fn1+fn5+fn5+f36Af3+AgICAgICAgIGAf4CAf4CBgIF+UUhLTU1NS0pLTE9RQD8+PkFBQEBBR0FCRENFQUdyeWtig4SDgoOAfV4+QENAQD1Kc3tZOj1BRUFCQkZIQz08QEREQUA/Pj1AQT4+Pj88PkBER0VAPkBBP0BDRkVDQkNDQEJEREJERUFCPkFCQkFCQEA9QUJDRENDQUNFR0E/PVZwcHFwcnV1d3p8e3x7fX9+fX19fX1+fX5+fn9/foB/f4CAgICAgYCAgIB/gIGAgX5SSEtNTUxLS05OUlVEQkBDQ0FBQkBCQ0BAQUFARW50fYKCgYN+fYR2TUFDRUA/Pll7gF0/Q0VJSklJTU1LRUNGR0dFR0VFRUREQ0E/QD4+QkZKSkdFRUdGRkpOTktKSUdHSEtMSUdHQ0REREVEQUJCQ0BDREVEREVERUZDQkFEZW9wcXF0dnV4e3x6e3t+f319fX19fn59f4B/f39/f39+gIGBf4CBgICAgH+AgICAfVJJSUpKSEpKTE9SU0dGRUdIREdIREA+PDs+QEVFaHN9gXx/hH55hXJDREVEQ1d1hoeHflhHSEpNTE5PT0xIR0hHSElJSEhHR0hIRUNFRUVGRkhKSkZFR0lKTU9PTU1LSktKTU5LSUhHSEhIR0ZFRkZGREZIR0VFSEhGSEdIRlFubnBxcnV2eXt7e3p8fX5/fX19fX1+fn1/f39/fn5/gH+BgYGAgICAgICAf4GBgIB8UEhHSElGR0lKTU5OSkxJSUpLTE5KRkNBQkNGSkdge4B/d3+EhYOEiWxBQVZ0h4mHh4eIg1dITE1MTU5MSUZHR0dER0dHR0ZIRkhFQ0RERkVEREhIQ0NDRklLS0xMTExMTElKS0pKSUlJSEpISEdISUhHR0hGRkZISklJSUlIXW9vcXJ0d3d6e3t6e319fn59fX19fX5+fYB/f39+fn+BgIGAgYCAgICAgIB/gYCAgHxNR0ZIRkVGR0dKS0pMTUxLTU5NT0tJSEhKS0tMTE5bfIKCg4OFhoaIg1ZshIeGhoaHiIiHfFBLTEtISEZGRERDQ0BAQ0NDQ0ZGRUJAPj5AQUFAQkQ/Pj9ERkhERUdJSklKSEhIR0lJSkpJSEZKSkpKSUpJSkpKRklMTEpKS0tmb3BzcnR2eHl7e3t8fH1+fn19fX19fn59f39/f35/f4CAgICAgYCAgIGAgICAgICAfU9GRkdGR0hHRUZHR01NTUtMS0lHQ0NDRElLS0xLSlSBg4SEgoKFhoaDgoaFhISGhoaHh4aKdUtKRkI/P0A/Pz88PDw+Ozo8QUFAPjw5OTg8PD07Pjs4Oz9BQkBBQ0NCQEFBRERCQ0ZISUhISExNTEdJSk1NTk1KSktLSkxNU2xwcXRzc3d5e3t7fH19fn9+fX19fX1+fn5/foB/fn9/gICBgIGAgICAgYCAgIB/f39+UUZFRkdJSUdEQ0VGTk1MSklIRT85Oj5ARUhISklJZYWEhIR/gYKDgoODhIWFhoeIiIiIiYyPaENBPTg4Ojo5ODc4ODk2NDc5Ozw6ODU2Nzc4OTc4NzU4ODs7Oz1AOzk5OT08Pjs8PUFDRUhKTUxMR0lHT1JRUFBOTE1NT1Fdb3BydHN1eHp7e3x8fn5+f359fX59fX5+f39/gH9/f4CAgICAgYCAgICAgICAgIB/f39RR0ZHSEpIRkVGR0hMTEpJSUdDQjU2OjxDQENHSUlohoSEgX6Bg4ODgoOEhomKjIyLi4mKi4yJYEM3NTU1NzY2NjU1ODczNTY4Ojg3NjU2NTY3Njc2Nzo2Nzg4OTo3NTc4OTc5Nzc2OjxAR0ZJR0lGRUZPU1JTU1JPUFBSVGVwcXN0dHZ5e3t7fH1+fn5/fn19fX19f39/f3+Afn+AgICAgICBgICAgICAgICAgH9/flJISEhJS0lHSUpJSkpLREVIRUJANjc4OD06PUVDQmWFg4GAgoODg4ODhomLiomJioqKiouJioqHZkk1OUA1ODg3NDU3ODU1NzY5OTc3Njc2NTo5Ojo6Ozc5ODk4NzY2OTo5ODg2ODU4OTtBPT4+QkE/QUtMT1FQUU9PT1JXa3FydHR1dnp7e3t9fX5/fn9+fX19fX5/f4B+fn9/f4CAgH9/gICAgICAgH+AgICAf39+VEhHSUlMTUtKS0tMSUg/QEFAPDo1Nzk4OTc7Qjo9cYSAgYOEhISEhYaJioqIh4eIiIqKjIuKioyDZVBaQzo8PT45OTo7ODo7OTo7Ojo5Ozo5PT09Pjs7PDw6Pjs5Ozs8Ozw7OTo8ODo6Ojo5OTk8Pzw8QUJESElNS0lLTFdvcnN1c3Z4e3t8fHt9f39+f359fX19fn9/f35/f39/f3+Bf4CAgICAgICAf4CAgH+Af35URkVGSUxOTkxKSk1CPzo7PDo4OTk4OTo6Ojs/Pkh+hIKChIWFhYaIiYiHhoaGiImIiYuMi4qLi4x9alM9QkRFRUJBQEI/QENBQD49Pj5APz8/QD4/PT0/Qj5AQT9APz1AQEA+P0E8Pjw7Ojs6OTs/PTs8PT1BQUNBQkNBWHBxdHR0dnp7e3x9e31/fn9/fn19fX5+f35+fn9+f4B/f4CAgIB/gIGAf39/gICAf39/flJFQ0FHSk5PTElHSzo4Ojs5Ojo8PTo7Oz09P0BCUoKCgoSFhIWEhomJiIiGhoaHiImKi4uLi4uMiot0RUNHSkxKSkdHSEVGSEdFQkFAQ0VEQ0FCQkI/QERIRUNFQ0VEQUZFRkRFRkRAQj48QD49P0A+Pz4/Pj8+Pjo7PTxgcXJ0dHV3enp7fX19fn5+f39+fX19fX5/fn5+fn5/gH9/gICAgICAgICAf4CAgIB/f4B+UERAPUNIT01HRkJEOTc6Pjo8Oz4/Pz89QUBDREZXhIKDhIWFhoaIiYmIh4aGhoeJiYqLjI2MjIyLi4laSlBOTkxPSkpLSUlKSklFQ0RGR0ZEQ0VGREJISUtHSEdGSEdFS0lLSUpLSkNGQ0NEQkFBQ0JEQ0NERENBPTs9QGhwc3R0d3d5eHt8fH19fn5/f359fX1+fn9+fn59fn+Af3+AgH9/gICAgICAgICAgH+AgH9PQT49P0RMS0BCQkE5ODw+Ozw7PkA/QT5CQkdHSVmEgoOFhYaHiImJiIiHhoaGiIiIiYqMjY2NjIyLjIFsbVVOTU9MSkxKSUpISkZER0lISUVFSEZGRUxMTUlKR0dISUpOTU5MTE5LSEZHR0VFQ0ZGRkZERUhIRkNBP0BMbHB0dXZ4eXl5fHx8fX1+fn9+fn19fX1/f35+fn5+f39/f39/f3+AgICAgIB/gICAgICAf1FBPz4/RUdHPTxAQDg3PDs7PTo+QD4/QENGSUlQX4GDhYSFhoaHiIiIiIiIh4eIiIiJioyNjYyMjIuLjn1gWFBPTk1MTUpISEVJSUVLSUdKSklKR0dHS0xOTExISElKTVFOUE5NT0tJR0lKSElESUhIRkZHR0lHQ0JBQ1RucHV3d3l6eHl6e3x8fX5+f39+fn1+fX5+fn5/f36Af4B/f3+Af4CAgICAgICAgICAf39/VERBQUJHSEI/OD9AOTo8OD0+Oz1BPj9BREhKTFVxg4SEhISFhoeIiIiIiIeGiIiIiImJjIyLjIyMjIuLil9UVFJPT05LSkdGQkdKR0xLRktPTEtKSkxNTE9QTkhJS0xPUVFQUU9PSkhKSkxKS0ZHSEdGRkhGRUVCQUJCXG9yd3h5enl5eXp6e3t+fn5/fn59fX19fn9+fn9+f4CAgIB/f39/gICAgICAgICAgH9/f39VRUNFRUdHRUQ7P0E7PTw5QD4+QEJHR0FHS0xQVnmFg4ODhISGiIiIiIiIh4eIiIiIiIqLi4qMjIyMi4uOfVpYVFRWVE9NS0pERUdMT05PV1VRUE9RU1JNU1RPTVNMUFNVVlJTUVBMSk1NTUtOR0dKRkZISkRERUVCRUNjcHV5eXp6ent6e3p6fH59fX9+fX19fXx9fn5/gH9/gICAf39/f3+BgYCAf39/gIB/f39/f1VGRkdHR0dIRj5AQj0/PT1CQEJCR1ZORk5QUFRYe4aDhYWEhIeIiIiIiIiIiIiIiIiJiouKioyMjI2PjIyMaVlYa2JGVFFRUEo7O1JTUmB1XVVWVFZZWVJYWFJaZlBVV1pdUlRXUU9NUlFQUFFLS0tISEpIRUZJSUlISWlydnl4eXl6e3t8ent8fXx9gH59fX19fX1+f39/f3+AgIB/f39/f4CAgIB/f3+AgH9/f35+U0hKSUhHRkZFPz9BQUVBQ0dFREVMWFJNVFVWWFp8hoWHhoWGh4iIiIiIiIiIiIiIiIiIlJyMioqMfmGKi4uHbVxlVjpZWVhTUT9AVlVYXGRgVllicl1dV11aVkVRWVpbWV9UWWdSVlZYVFRWVE9PTUpMSklJTE1LT01Tb3R2eHl4d3p5ent6enx9e35/fn1+fX19fn1/f39+f4CAgH9/f3+AgICAgH9/gH+Af39+fn5WSkpJSEdFRERCQT9ITUlNUEtJS1BUU1NYWlpcXHiFhIWFhYWGh4eHiIiIiIiIiIiIiImcnaCPiY5nO36LiYqMem9wWVtcW1JUUlZWVVtadYNZVX2QYVxYXV5XSVZdXVtbX1lIWVhZW11YWFlXUlFNUFFNTU9TUVFVUmFzc3Z3d3Z4eHh6e3p8fX19f39+fX59fX1+fn9/gH9/gIB/f3+Af3+AgICAf39/gIB/gHh5fVlOS0lJSEZCREBBOlBRUVdYUFBPUVNUVFhYWVpbboGCg4WEhYaHh4eHh4iIiIiIiIiIiJaanJeIioFuhomIh4SLfmdZWVxZVFZUV1JRV1ZjloBRZXJYWldfaFBgZltbWFxnYUdPWmhnXVtcXV1XUk9TUFBSVlZWVllabnJ0d3Z2dXh4eHt7fH19fX5/fn59fn18fn9/f3+Af39/gH+AgH9/gICBgYB/gH1yfX9/b3R8XVNQT01LSkVDP0A7UFBaWltSU1FPUlJSVVNWVFdfdXiAhYSEhYaGhoaHh4eHiIiIh4eIh4ORjomJiIaFiIiGfoB8XVFWWFVSVVNRUUxPTUtmeVtdVFlVVl1aTFRaVVNUXlpYV1dXemtYW1xcXlRRUVBJTk9XVlhbWmRwcnZ2dHR2eHl5e3t8fH1+fn99fX1+fX1+f39/gIB/f3+Afn56eHd2c3V7f3+AgHRrfn5rcnleW1ZVU1JPS0ZDREFNXoNsVlJTTk9RT1FVUlNSUlVjZHaAgoKDhISEhIWFhISDhoaGhoeIhn6JiYiHhoOHh4d5bXFXSkxOT0tOS0lKREVJRUM+VGRVf1JRUU5LUVRRTU9ZUk1OUVNVVU1RU1JQT01MSENJSFJUVVpcbHF1dXVzc3d6ent7fH17fX19fn19fX59fn9/f4B/f399fX5+f39/f4B+e3Zzd31+fmR1fWlxdF9kXV5cWVVQTElMSWFsknRQUVNOUVJRUltSU1JRUlVUYnN7fH+AgYKBgX99e3uAf4OChYaHgoaGhoGEgYaFhnVfXUxEP0NDQ0NCQERQQkNBQz1DSUdWQEhOTEddaVBIRk5GREVGSUdIQkRIR0lLR0RCQURAT1FNUmRydHZ1c3R1enx7e3t7fHx9fHt+fX19fn5/f3+AgIB/f3x8fX+Af39/f4CBgH12dHt/bWh8Z25xZmllZGJcWFNRUFVSc1dlW09PTkxRU1FVWVNVUVFUU09WYGtscnZ7e3h5dHJuc3RzeXh9f4OAg4OCgIKAgoGCa01HP0A7Oz4/Pz8/PmtQSmBFRkhJRUI/R0xOR01SVUlCRT8/PD08PT0/PT9BQ0NAPz09Qj5KTkdVbnR0dXN0dnh6fHt8fHx9fX19fH59fXx+fn9/f4B/f39/enl3eHd2dnh7foB+fXt4dnx1YXhnbHBqbGppZmBbUVJaXFleSkpQUU5LTFFSUVRVVVdRUVdVUFhbYl1hZ21tbG9rZ2BucmptbHF1e3p9e3h6fHx4d3hlQ0BAQj06QkNBQURCXF1Pe05PTk5LTE1PT1FMS01XTUhHQEI8OTc3NTk5PTs7Ozg5ODo/PEJIP1xzdHV1dXZ3eXx8fH18fH19fn58fX19fX9/f39/fn9/f314dXZ6e3p3eXh1d3t8eXh1eXdjcWhpcG1ubW1oZl5PUF9dWklIUFJRT01QUU5RUlRWWFNSWVRPWVpbV1ldXl5fZWBdXnF2a15gZ2t3b29sam9ubmxmYllIRkZIQkFHSUVFRkRNUlBhV1JXUVBTU1JVW09PUVZQTUlERj46OTY1ODc5Nzk6MzY1Nzk1PEM+ZXNzdnd3eXl7fX18fHt8fX5+fnt9fn19f39/fn5+fn9/e3d1eX18enh8fHx8dHd2d3Z1d2tuaWhxbm9vb2prYFZXXlpYTUtUVFNQUVVPTFJTVFhYVFRZUk1XWVpWWFhWWFldV1dYaHNrXVZhc2thYV9eZGFfXllUUU5PTkxJSEpMSUlGQ1FQU1tXVFROUVNZU1xlVU9TU1FOS0lIQz9BOTk5ODk3ODg1NzU3ODU5OkducXR3eHl7e3x+fX18e318fn5+en1+fH1/f359fn59f358dHR1e3hycW9vbnR4cXJzeHZ1cWZkZ3JucHBxbm1kXV9fWVdPUFhWVlNUVk9PVFZYWFlTVVRMS1RWVVVVV1BTVVdUVVJdbl5STllfW1ZZO0RWWFRbZkpMUFNTT01NTk5OTEpGUVBVWVNUT0pOT1VTVFxWUlVTUk9NTElISEY/Pj06Nzg3NjU5OTY3Njc1V3Bwc3d5ent8fX59fnx8fXx+fX15fX18fn5+fXx8fX1+fXxydnF4eHJ2dXFxbnBwb3B1dnRuamRkanBwcXJwbmZlZGNcXVJUWlZXVVRXVFJYWFlZWVNVT0pHT1BPT01SSlBQT1BOTk9UTE1JUE9TVFUyPVhNSUBRPWNhUVNRUE5QUVBOTk1RTlRSUFJNSUxKT1JQUlJTVFFST0xNS0xMSENCQT06Ojg3NjtCNTU2Njpkb3F0d3h7fHx9fnx9fH19fX18e3h8ent9fX58e3l9fH18e3B1b3d1cHV0b3N2cHFxcHR1dmNqZ2VXaHRycnFuaWlocFZWVFVYVVdVUldWVVpZWFdVUVNGRUFGR0dIRkpESEpJR0VITEhLSEZMTVBNRy9FX1I+Mz8+am9hU1JRQEdVUVBRUFFOUU9QT0xKTExPUE5OUFFRTlBPSkxNTUtHRUVEQjs9PDw5PUc2Njc3RG1wdHV5e3t8fX18enx8fX5+fXt5dnh3eXl8fXp6dn17fHp6b3Fud3JwdnFtcHNwb3Bzc3N0ZmdgaFpXa3JzcmxtbWtuYWVQU1RSU1RPV1ZWWVlWUVFRT0A9Oz0/QUJBQ0BCRURBQEdIR0hFRkhKTUxFR0NPUkM4RU5TXWdTUVNBR1VQT1FRUE5NTk1LTEtLTk9PUU1PT01ITExJS0tMS0dGRkVEPEFBPjtARTs8ODlTcHJ0eHt6e318fHt5fHp6fn58e3V0dXJ2dnp6eHpyfHt8eXltcW94cnF1bm5xcm9vb3Rzc3J1dGtnZ15lam1wa29xbWltY0xPT01RU0xUVVRYV1VMTEtJPDk4Nzs+QD48PUFAQj0+RUhHQ0VGSUdKSkBGQUFARkhFSk9IUVJhXFFQUk9TT09QTExPTUxNTE1PTltXS01RT0dJSENISkxMSkZGRkU/QkM+PEJHP0I/QWRwc3d6enp7fHt6end7d3l+fnt7cXN0cHJzd3R4eHN6e3l2d2xxb3ZxdHRsb3Fybm5vc3ZydHNycmtsZW5zaG1ubWxtbGprSUxISE9RSlFTUVRTT0tIQ0Q9OTc3OT9CPjs/QkBAPkBESUVDR0dJR0lFQkI/Pj1DQkFHSURNT2JlUU1PTldLTE1LTE1NTUxMT05TZE5KTFJJSUlFQUhKTE1OSkdJR0JBQkA/RUZFSERLbm92eXl5e3t6fHp3c3h0eHx8eXpucXJtbm9ycnZyc3h8eHZ2bXBtc3B1dGxwcHJvb29ydnVyVlZucWdseYRqbXFybm5qaG9ISkNHTU1KTVBNUE9ISkQ/QT05ODo6P0I/PEBCQUFERUdLRkNISUdHSENDP0I/P0BBPkRFQ0tOUlRMSklNVEdJSUpMSktMSUpNTU9QUlBLR0NMR0NCSkpMTU9OSUpJR0NDQ0RJSk1MSVlybXd5eHp7enl8dnJwdXJ0eHl2eGpxbmpsbG50dG10dXtzdHhyb25xb3ZzbnBvcnBvcHN0eWpOYGdzanR8eWdvc3FpcWhkcUhLREdISEdKS0lKS0RGQj0+PTk5OjtAQj89QkJDQ0dGSUtKRElJRkdHQ0M7QUBCPkBAQkVDSU1QSEhLR0hLREhJTE1ISkxISUpMS01dUkhIRE5GQUNKSk1MUE1LTUpLRkdHSk1OUU5MYm1pdnZ3enl7en1ybWxza3B0dHR1aHBtamlra3RwbnR0eXByeXRvcnFvd3NvcXB0cnBydXR5a05WbXVscXt2aW5vaWt0Z2RvRktERkVHRUZGR0VHQkNAPjw9OTo6OkBDQD5CQ0RFSUVJSkxGSUlHRkZEQjtBQ0M+QENEQ0RHTE5IS05IREhFSUxOTUdJTEdGR0lJTE5LSUdFTkhCRk1LTUxPTU1OTUtISElPUlFSTlJmZmZxb3N4dXt6fGxoam5la3Fsc3BmbWxoaWtsdG1wdXR3cW94dG90c3J2c3BxcnRzcnR1dXZ2WFZ1dWtvdHJrb3ZsaG1lX3BHSURGRkVDQ0JFQERCPj8+Ojs7PTo9PkNBPkFDRUZKRklITEhHR0dGRUNAPURFQj5BQ0NDREdISUdNUEpGRkdLTk9LRkhJRkVERUlKSEpJRkhPS0NJTUtPTU9OT1BOSkpJTFJVVVJPV2RgYW1ncHJvcnl6Z2VoaGRpbGdxbGZsbWdpa2xzbHB2dXRwbnZyb3Nyc3V0cXNzdXRzdXZ2dnl2dXR3bGp1dW1ydnFsbmxlckxIRUVHQ0JBQkQ9QkE+QT06Oj0/Oj0+QEI+QEJERkpFSUZJSEZGR0VDQkFBRkZDQkJCREVER0dJRkxRTElPSkpMTElHSEVHRkRDSUlIS0pHS1JNQk5OTVBOT09NTk9LS0tPVVdWVVNYX15caWFtaW5ocnNiZWZmZGhoZm5qZm1taGtrbXJpcXZ0c3Ftdm5vcXJzd3Nyc3R1dnZ2dnd2d3Z2dHd1anN1bnV0c3FyamtzTUdIRkhCQkFERTxBQEBDPDg6PT45Pzw/QkBAQERGSEVIRkZIR0ZGRENFQ0RJRUNHRUJFR0VGR0dFSk1LSFFNSktISElFRkhIRUNJSUlLTUtPU05EUVJQUFFOT01OUE1MTVNXVlhYVVhdWl1kYGhiamlna19lZWZjZ2dna2dna21rbWxwcmh0dHVyc252b3FwcnR4cXNzdXZ1gpF5dnZ0eHV1d3htb3VvcnN1cXFpbnlNSEdISEJCQkZFPD9CQkQ8Nzo+PTo+OkBCPj8/Q0VGREZERUhFREVDREVGR0pFRUpHQ0dIRkhHRUNGSkpHTktMS0hKTEZJSUtIRUtLTE1OT1JUT0hTVVNQUk9RTU5RTk1QV1pWWllWWl1ZWGFgYGBeaGVjYGRmaGdqaGhpZmhubGxubXFwaXV1eHJycHVwcHBydXZwdXN1d3V7fn14dnR3dnZ2eHBsdXBtc3RucHJyeE5ISEdJREJDSEU8QEVCRT04OT4+PTw8QUI9Pz5BQkZDRUNDSURDRUVGR0dHSUZHS0hESUhHSUdGREhLSUdLSE1LSktMSExLTUtKTktPTk9SVVZPS1VXU1BTUVJMT1FQT1RZWllcWllbXl5dYGNeXGFja2JgZGdncoVoZ2lmam1ucG9uc3JqdHV4cnNzdHJucHF2cnF1cnV1c355jn11dXZ2dnZ4cmh1cWtydGxxdnB0TElLSUtGQkVHRTxAR0NEQDo8P0A/Pj9CQTxAPkFBRkNFRURJRUZFR0ZISEZISElLSkZKSEhLSEZGTElIR0pHTExNTExJTUtNTU1PTFBQUVVWV09LVlZVU1NRUUxPUlJQVltbXV5bXF5fX2FgYWRdY2BlZmBlaGpkc3Nmamdna29ycW9zc25zd3dxdXZ0c21vcnVvcnNwdXJ2cnSBdnV1dXd2dXd0Z3Rya3Fya3J2bnZKS0xKTEdDRURFPEBGRERDOz8/QkBAQENBP0I/QUNIQ0ZFRklGSUZHRElJR0lISkxISEpKSUxKRkpLSElLSkdLS01NSkpNTE5OTlBLT1FSVFhWTU5UVlRSUlFQTE5UU1JXW11eX11dYF9gYWFgYWNlYmRoYmRpamd2i2xqaWdtb3NxcHFwcHJ5dnJ1dXRzbW1zc21xcm90dXRycHN3dHV1d3Z1dXRlcXNrcHFqcnZud0tMTExNR0RDQUQ8P0VFRUM9QUFDQkJDREFDREFBRUdDSEdISEdKR0NISUdISkZJTEhJSk1LTUxHS0lIS0tOUUtSUU1TTUtOTk9QUE9UT1dYWFtOU1BXXFpSV1BOVFVUVFhaX2JiX2RhXmBiXmBlYWFjaW5nYmloaG54dmxoaW1vc3JwcXJycnZ0c3Vzc3Nua3NxbXByb3R2cnFxdXZ1c3d5d3V0dWNtdGtvcGpxdG93TE5MTExHRUFARD4+REVGQ0BDQUVEREZCQ0VHQ0NJRkNJSkpJSUtHREtKR0hKSUlLSEpKTkxOS0lMSEpMS1pmSmRcS2xTSE9OX25Va3NbcXBid2NTUGF2dWh1Y2F2YFhucWJkdmluemZbbHRgbGpUX3d2aWpnaWZnbG1qbW9qbW5zcnBycnFyc3Jzc3J0cm5sdG9ucHFxdXVxcXN0dnZ1dXl3dXR0YGt0a3Bwa3FycXlMTkpKSkZDP0BCPz1ERUZEQ0RCRUVERkJGRkdERUtGRUpNTEtMTEdHTUlHSktIS0tJS0tOTE5MTExJTE1MW3NiZHBebG1VTU5mc11mZnFsbnRncGlfYVlubmJwcGJrampmb3F0ZXRub1xvdWdwTUpxeXZrYWBrZWVteGxrdm1ucHNycHJxcHFycXJycnRybW1zbm5vcHJ1dHFzc3R1dXV0d3h2dXRibXVrcHBscnJxektMSUhHRUQ/QUJAPkNGR0JGQ0ZFRkVEQ0hIR0RFS0hHTE5OS01NRkpOSEpLSklMS0pKS0xNTk5NTUpNTU5bcm9vbnBwbGtNUFFsV01pYnRycGFtbnVcWWxRXG1tWnFta29teHh0c2lwXV9ya3FqVXV5eG9jXmtmYmdwcGpqb3BwcnNwcXBxcXJycXFycnRsbXJtbm5vcnV0cXRydHV1dHV1enZ1dGVudWtwb2xzcnJ5SUtHR0VFRUJCQj5AQEZHQkdESUVFRUJGSUhIRUhMSkdNTU5LTU5HTE1JTEtJSk1JS0lKS09QT05NTE5OTFxoZHVdbHFXbE5QUW1UWWtea2x2YWxkc1NlY05tWWxcdHBraWx4and1aHBdXnJraFdiY3d8b2NgZ2dhZGl1eWtubnFzc3BxcHFwcnFwcHBydWttcW1tbW9xc3Rxc3J0dnZzd3Z6dnV0aG91bHNvbXNydHZITEZJREVFQ0FCPUJBQ0dESEdMSEVDQ0hLSUhGSkxMRk5MTFNSTEdMTEhOSklITkhKSklITk9NTkxKTk1KWnNwcG9xcW1sT1FSbllya2dvb3Fxb210XW5YYXRfbm9wb3Fyb251c3R0altedGN3eHJqbnpoYWFjZmJiaW10dXBzdXZzcXBwcW9ydHt/fn13bGtxbmxtbnByc3F0dHN1dXR4eHl4dHVrb3VtdG9uc3N2c0hLSElCRUVFQUE+RERCR0RISU1JRkNGSkxKR0ZLTkxFT0pLV1JLR0tKSk5JSEpMSUtKSEhLTU1NTUlLS0tTa2NbaV5faWNyclpfWWpuX2VlVWtfY1thYVFgbGhdalxuaWlkW3BmZHBdWlxrW21xY3BzbGRnY2RnYGBrbXBwb3R5cnVxb3BxbnmFiIeHhoWAdnNua21tb25xcnR0cnR1dXZ5eHhzdW5xdW53cXJ2dHdyR0dGSURFQ0ZBQEJGRURHQkhKTEhGREdLTElFRkpPTElQSUxbUUpFSEhLTUlISkpLS0lISUdLS0tMR0hLS0xNTUxKS01OVFtcVFBUTFBPTk9PVlFPT1FOT1FKSU5QUWRxaVRZV1xbXFZZW11YXVxcY2ZhYWViY2ZfX2ZrbWhtdHlydHJvcHB0hoeGhoaFhYaHg3pwbW1sa3FzdHRydHZ0dXl4eHV2cXJ1b3ZydHN1dXNHQ0VHRkVBRUNAREhERkdDSUtMSEZER0tMSUVHSVBLTE9LTFdMSUVFSElKSElLSU1KSEZHR0lHSElFRkxJSkxPTElQXFdeUFxbYF5NWFlTXFxiXk1YWk1YYVJKWWFaUl9kXGFYW2RkVlZYXFlaWFxWWVxdYl5kYGFfZWhrZ210dHFxdHBxcoGGhoaFhoWFhYaGhoR9cmtpb3Jzc3N0d3l5eHl4d3h0cXhyeHNxcnVydE9CQ0RMTUJEQ0JFSUVHR0ZLSktIRUVJSktGRUhIUEtNTUpNUklHRUFIRkpJS0xKTEpIRkRJRkRGR0VGSkhDSk1LTFVfWWBYYGFbYFRYWVReXlpfUllcUF5cWU5eXF5TWl5jXlpdYGNgWV9jW2BeW1RYV1leXWNiY2FjZWhla3Jwb3Bwbm93hoaFhYaCe4CFhYaGhYaFf3VxcHJyc3Z5eXp5eXh4eHdyeXZ4cnF4dnR2YVNKSk1JRUNCQ0dIRkhHSEtKSklERktLS0VGSUpOS05LSExOR0hFPkdHTElLTEtLS0lHREhEQ0RFQUZKREBKTEpPW2NZX15hX1JUUldfYFxdWV5RWVxNVl9XS1FZW1BaX2FhXV5jYWBiYmJjY2VaUVhVVVxZXWNgX19jZGJob21ubGxsbHWFf4SDeXV8hIWFhYaGhYWGhoN9d3JydHh5eXl5f359eXV5dnZybnp3dnhYUUtGQ0dFQkVHSUZHSEhGRklHSEdIS0lMRERLS05NTEtIS0pISUY/R0dOS0tLTUtLS0lGR0NEQERBSElCP0lKSE9dYVpbZF1fVFFSWF1cXFxfWktXXExSXFlJTV5RT1xfYWNjY2NiXGRjYmRjZlhRVVRRW1daYF9eXmFhX2Rsa21qamxudn51gXp8hIWFhYWFhYaGhYaFhoaGgnpyc3V1e4WHh4eGhYSBfnhwend2eFxSTUNASUZDRktKRkZGSEdHSUdGRklMSk5GREtLTU5KTElLSkhIRkJISFFNS0tPTEpLSUdHRUQ/RUNJSUJCR0ZFVF1ZXlhfWV9bXVVYWE9dXVFLSlZeWF5bXVVZYFJRX19iYmBgYmJgY2JhZGRiWE9RUVFaUltdXV1dXl9fZGhnbGpubnB7e3x+e4CCg4SFhIWFhYWEhIWDhISHh4FzcneFh4eHh4eHh4eHh4WDgHx4XFNLQ0FIRkRHTVJIQ1FKRUdISEVGS0pNUEVGSUpLTkxMSUtMSUhHREhLUU9NTVBMTEpLSElDREFFRElHQ0JHRkRXVUVcVF1TVl9YT1RVTlpaTUlKVGBhW19YXl5hXU9ZYVxgYF9iY2JdYWJXX19UUE9PT1dRXFtbXFxeX2JmZmVsZW9vd3x7gHt9f4CEhISEhIWFhYODhYKDgoWFhnpvgYaGhoeHiIeGhoaFhYSFg35JTkZERkZIRElSYlBDVl5JR0dIREZNS1BQRUlJSktOTEtLTEtJSkdFSk5RUU5PT01OTE1IS0FEQUNER0VDQkVHQk1IQktLT09OTEZNRkdJSkhHTEtNT1BJTE9QT1NPTFBTUlVaWVdZWFhkV09TVFBQTk1PVFNaWFhaXVxgYWRlY2dja2xwc3J5eX97en+EhISFhISEhIKEgH57gYOBfXuFhIaGh4eHhYWFhISEgoGAfUtJRUVIRkdES01dTEdHWExHSEpIR01MUVFITEtLS05NVU5PSkpLR0dLT1NTTlBPTk5OTkdLRmBFRF9MRWZkRU5bSV5bcm1PTVVtWUxEUGBVa1dnSl1XVV5ETFFVTExTVlFSVFhXVFhVVFxVUGZaaGhkWFJqUlZVVFtcW2BgYWJhYmBmaGZua2hyenx9foGEhISEg4ODgX18enJ7gXp7f4KAg4SEhYWBhIWBg4N/fnp7TElGR0ZIRUVLT1NJSkZgVEhJT0pJT01SUUtNTExPUlVST09JTE1HSExQW1lPUFBOT09PSUpRf1FJfFlZcXRZUW1IcW5vYVZQcXFzUENrc21xc3BTb19bblhdVlxYVWtoVV1WY1pgWVtfVlZYf2p0dXVeX3ZeV2FbW2ZbX2BhYWFdYGFnbXBsYHB3dHiBgYKDg4J/fX+Adnh6bHZ+dHh9gHx+gIGChHyAg3p/gX9+d3dOSkVITU5CRExMRklLRVFWTEtOSUtSWFdRTU9PTVFUTk9RT0tLTkdNT1JbWlNRUk9QUFBKSFp4XVR4ZWhaU1VSdmd0bHBibmZqUXJPTXdtanJwc3JxcnBvb4BdZXp1eHFxenF+c31rdX1iUmh8ZXNzb3Jye3xvfnhugHJfYGBiYVpgX2drbmtibGZnbXd+gYCDfnt4d4B0dnppcn5uc3x+d3h7foCDeHyAdXx/fHxzc05LRmBdR0FFTU1ISkpHSlBPTU1KTlZeWVVMUVNOWFpNU1NSTktPSFFSVFlXVlBUUFBQUUtIZ3hsY3hybVtLTlZ5cHVtdWJvdlBlZUlmdnFtd2+AamZ4eGlXclFoem1panp6fWx4en9vaG9ZdnZqdXVwgF9yZn1pbHh8b15fX2JhW11iZGdpaWRnYmNkbGxwcHN0c3NzeXFyeGJsdWdxeXtzcnZ5foFzdXpufH15eHJuTkpTdU5DQkZQUEhKS0lLUE9PT01QWmBaV0tUV1BhXlJWUVlSTE9JU1RVWFdXUFVQT05SSktyb3V1cXVxZGliV25McXBeRmh5V3ZUTGl5fXhgeXtzbmFdbW9jUmhxdW5teXB3bHZ0dHJsbl10fnprbXl8a3RsfGtwdnV4Xl9fYl5dX2RkaWdoZWVeYWJpaWlqa25va3FvbWpwYWNmY293eG9tcHN5fm5xcGt7enRzb21MTFtWSEdFR1JQSUxNSktQUVBQUFBXXFhVTVVZVWVYUlJZXlNNTUlUVFZXWVdPU05OTlFIUm1IaXdLYGR2dlZYbE9ubHtzYWpnf3ZVTFdraH1sbWx4X1pwenteYHpzY3JveHFoZH1pcnxeVExsYHZ1a2l1e3ptfnhrfHBcXl5iW15iZGRnZWVlYlpjY2lra3JzcnZnbGloZGdgYWthZ3NybGdtbXJ8a21oa3t0bW1rbU9IS0tISkhIUVBMTk9MS1JSUk9TUldSVlRQV1pWVlRUVGFfUE5NSlRTVFFWVk5OTE1PUEpIUU5QVUxLTFNUU1NUUFZVUVFOUVFYWVJOUFVUWFhYW1tVUlNXW1dYWFpPU1VXWFhSXllXXlZUUFlSV1dXV1heWmdyXltbWVxdX2NaX2NjZGZkY2NiWmNiZ2ZlbW5tdWVlZ2NhZl9dZ2BkbGhmZ2tocHpoZ2dqdWpoZ2lsUUlLTExNS0pTUU1RUE9MVlVUUFRVWFVZVVFaXVZVVFdVWVdPT0xNVlRRTlVTTk9NTFFQS0pRUUtRTUtLUFJVU1FSU1NJSExOT1FSUVFRVFZSWFdcV1NSUFJUVVZTWlFOU1JXVlRZVlRaVlRSVVRUVFdYVlxZXmBdXFpaXFxfY1tdYmNkZmRkZGFZYGFjYWJoaGltYmFkXl9jXVpkXGJtYV5mZWZtc2RpZ2prZWRjZmhQSktMT09MTVNQTlNRUU1YV1VUVVdXV1pVU1xgVldWWVVYU1BQSk5XU1BOVVBOUU5MU1BNT1VTTlFOTU5RVVFVUVJUVU5LTU9RVFRSUlFWV1VZWltZU1VSVFdWVllbVFBUVVhVVVpVV1pWU1JXVlVXW1haX1xVWF5cXl1bXWBhXltiYmNnZmVkYlhfYWJdYGdkZmVhXl9dXV5aWl9aX2dgXl1dYmhrYWdmaGZkYGJjYU9MTUxRUUxPVE9PU1FPUVtZV1dYW1lYWVZcamRWWFlaV1ZTU09KTlZUUE9UUFBQTU1SUlBSWFRRUU9NT1NWT1hSVFVVT05NUVNWVVRUUlRXVlpdXFpWVlFRVlhWW1tXUVRXVlZWWVRYWFVTUllXVVpeWV1fXlVeXF5gXFtfX19fWmJiZGhnZGRiWGFgYl5eZmNjYGJdXFxcXFlaW1hbYVteXVxfYl9fYmRlYmRfX2BcUE1OTlJRTVJST1NUUU9VXFpaV1tbXFhaW2RxbWhkX1tYVlVXUUxNVlNNTlJPUVJPTFFTUlVaVVNQUE1RWFdSV1NTU1hNT09RVFhWVVVTVVhYW15dW1tWUU5VVlVbXFdSVFdWV1hWVFhbVFNSWlhXXF5aXl9gVWFcYWFdYGJfXGBdY2BjZ2hkZmBZY2BhX19lZF9gYltaXFtcWVpZWFdcWlxbYF5fW15eYWBeYlxZYFpRTk9OVlFQVFFPVFRTUFdcXFxYXlxeVlxeanF3eYBjXFtVVVdRTU9WU05RUU9SVFJMUlRUWVpXVU9ST1NYV1RTVVJSWk9QU1JWW1ZXV1RWWlhcXVtbXVZTTVRVVVxcVlJUVlZYWVNVWlxVU1NdWFpdXlxgYGBWYVtjYl1hZF5cYmFiX2NmaWRmXltkYGFgYGNlX2JeWVpeW1xbWVhZV1daWlphXF1bXVxcWl1gV1tbWlBPT09ZUFVUUlFXUlRQW15eXVtgXGBVXF1oanJ9c2xnXFRXV1FOUlpTUlFUUlRVVEtSV1ZbWlpTT1NRVlZWVE9XUlNaUlRUVFhdV1hZU1hcWF5dWVpdVFVOVVZXXltYUlVVWVlZVVdaXFZUV15aXV1gXWJiXVlfW2VhX2RkXl5jY2FeZWZpZGZeXWRhYGFhYmRgYl5YWl9bXFtYWFhXV1tZW2BcW1tcW1haW15WXlldUE9PUlpQWlRVVlZTVFReXmBeXmJcYFVdXmJreXRsfWtaVVlUUFBTXFRVVFVUVllXTFJbV11bXVJPVVNYV1dUUFhSU1dTVlVVW11YW1lVWl5YX15ZXFlRV1JZWFlfW1pUVVZaWVpXWFpcVlVbXlxeYGFeZGNcXl1dZWFhZmReXmRjYFxnZGhlZGJfZGFgYWBiYl9gXldYXlpcXFpZWVdWXVpdXlpZW1xbV1lcXVZYV11TTlBWWVFdVVZZV1dVWF9fYWFgY11fVF1fYmVldYF6aFdZWVNVU1ZcWFdXVlZXXVhPVV1aXl1cVFJXU1dXVVNUWFJTVlRYV1hdXlhdW1ZdX1hfX1hcVlFYVFlaWmFZXFZXWFtaW1lZWltYV15fYF9jYmFkZFxiXGBmYWRmZF5fZGJiW2ZjaGVjZmBmX19hYWFhYF9eVlVdWVtcW1lbWVldW1tbWFhZW1laWl1fXVRZXVVOU1lWU1xUVldZVlZcYGFiY2BjXl9WW2BkYV96dW9oWVtZVVdUV1taWlxZWFlgV1BWXlxgYFxUVFhQVVdWVFZXUlNVV1paW19eWl9cVl9fWl1eWV1VUllXWVldYlpeVldbXFtcW1taXFlaX19gYGRiY2RkYmRZYWZjZmZlXmFiYGNeYmNpZGNnX2deYWJjYWFgXl9YVFtaWltbWFtYWFxbWltXV1lYV1xbXGBdVl1dU09WWVZWWlVYVVhXWF1fYmFkYWRgXllZYWRiYGxmaF5bXFpWV1hZXFxdX1tZW2JWVFheXWFjXFJWWVBXV1dXV1ZTVVRYXFxeYGBdYFxXYV5bXltaXlhVWFdbW19gXF9YWVxcXV5fXFtdWFtgYV5gZWNkZWVmYlhjZWRoZ2ReY2BgZWNcZWlkZWlfZl1jYmNhYWBfX1tYWVtZWlpYWVhXW1taW1dYWlRZXVxaYFxVXmJOU1dZVldZWFtcWFdZXmBiYWRhZGFdXllhY2JfYWBgXlxcXFdXW1tdXV9fXFpdY1laWF1gY2RfUlhZUFdXWFlZV1ZXVl1dXmBhYF9iXllhXV1eWVxeWVhVV1tcYF5dX1paXl1eXmFdXFtaXGBiX2JlY2VmZWZiWmRmZmlnYl9jXmFmZFppaGJmaWNlXmJiY2FgYF9dXFpYXFlZWFhaWFdaW1pZV1hVVVtdXV1gYGJieEtYV1tZVlxbXF1aV1xdX2BiZGFiYV1gWGJjYmFjYWJdW1xbWFdbXF9dYF9dW2BkXVxYW2JlY2FSXFpPWVhaW1taV1pZYF1gYmJgYWNfXGJdX11bXl1ZWVRYXV1fYF9gXFteXmBiY11cWFxeYGJiY2VkZmRlZmRcZWZnaWZjYWJcY2dgXGloYmhpZWRgYmFjYV9gX1xdXFlcWVhXWFlYV1xaWldXWE9YWl1hY2Zmcmt/SllXXFpaX1xbXlxYXVteX2FjYmFhXWJbYmRiYGJiYlxbW1pXWGlxYFxgX11cYWNfXllZY2VkYVNfWlJZWFxdXVtaW1tjYGJiY2BiZGFgY15gXF5eXllYVVtfXl1hYWBeW2BhYmZjX11UXWBgY2RkZmVnZWZmZV5lZmhoZ2RkYFpmZ15haGhiaGhmY2BiYGNiX19fXF1bWltZWFhYVlpWXFtaVlZVTVhXXGdpa2h1eIF2dnZ2dnZ2dnZ2dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6e3p6ent7e3t7e3t7e3t7e3t7e3x7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHt7e3t8fHx8fHx8fHx8e3t7fHx8fHx7e3t7e3t7fYmIhoqHhIKCgoOCg4OCgoKCgoKCgoKCgoGAgYCBgICAgYCBgYGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t6e3t7e3t7fHx8fHx8fHx8fHx7e3t7e3t7e3t7e3x7e3t7e3t7fHx8fHt7e3t7e3t8iYmHiYaFgoGCgoKCgoKCgYKCgoKCgoKBgYGAgICAgICAgIGBgYB9fHx8e3x8fHx8fHx8fHx8dnV1dXV1dXV2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eHh5eXl5eXl5eXl5ent7e3t7e3t7e3t7e3t7e3t7e3t7enp6enp6ent7fHx8fHx8fHx8fHx7e3t7e3t7fHx8e3t7e3t7e3t7fHx8fHx7fHt7e3uHiYiJhYSDgYKCgoODgoKCgoKCgoKCgYGBgICAgICAgICAgYKBgH58fHx8fHx8fHx8fHx8fHx2dXR1dXV1dHV2d3d3d3d3d3d3d3d3d3h4eHh4eHh4eHh4eHh4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3x8fHx8fHx6e3t7e3p7e3t6enp6e3t8fHx8fHx8fHx8fHx8fHx8e3x8fHx8e3t7e3t7e3x8fHx8fHt7e3t7e4aJiYiFhYOBgoKCgoOCgYKCgoKCgoKBgYGAgICAgICAgIGBgYCAfnx8fHx8fHx8fHx9fX18fHjF1NLS0tLUk3t9fX19fYSMi4uLi454KSkqKiopKz0/Pj4+Pj5tgH5+f397pdfT09PT1ryGiYmJiYqCRT4/Pz8/O5vDvr++vr3K1NLS0tLWun1+f39/f359fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx8fHx8fHt7e3t7hIuHh4aHgoGDg4GCgoKCgoKCgoKCgoGBgYCAgICAgICAgYCBgIB+fHx8fHx8fHx9fXx8fH19eNXn5OTk5OeZe39/f39+hpCPj4+Pk3kZGhoaGhocMTMzMzMzMmqCf4CAgHut6eTk5OToyomMjIyMjYM6MjMzMzMuodLMzMzMy9nl5eXl5enHfX5/f39/f319fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e3uCjYeIh4eDgoSCgYKCgoKCgoOCgoKCgYGBgICAgICAgICAgICAgH58fHx8fHx8fXx8fH19fX12fn9/f39/f3l3d3d3d3d4eXl5enp6eG9wcHBwcHBycnJycnJyd3p5eXp6en6Dg4ODg4SBfHx8fHx8fHZ1dXV1dXV+g4KCgoKCg4SEhISEhYJ8fX19fX19fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e4CMhomHh4SDhIKCgoKDgYKCg4KCgoGBgYGBgYCAf4CAgICAgICAfnx8fHx8fHx8fX19fX19fXZ0dHR0dHd0dnd6e3h7eHd2d3p4enp5fnp5eXh4eHh5eXl5enp5eXl5enp6eXh4eXl5eXl7e3t7e3t7fHx8fHx8fHp5eXl5eXp6enp6enp6e3x8fHx9fX19fX19fX18fH19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8f4uHi4qIhIODgoKCg4KBgoKDgoKCgYGBgYGAgIGAf4CAgH+AgYF+fX18fHx8fHx9fX19fX19d3d3dnZ3fXh3d316eH14d3d4fXl9fXx9e3h3d3d3eHh4eHh5eXl5eXp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fHx8fHx8fHx7e3x8fHx8fHx8fHx+iomMjImFg4SEgoKDgoGCgoKCgoKBgYGBgYCAgICAgICAf4CAgH19fXx8fH19fX19fX19fX13d3d3d3p9eHt4fHx3e3h3d3d8en19fH19eHh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fX19fXx9fX19fX19fX19fX19fHx8fHx8fHt7fHx8fHx8fHx8fH2Kio2NioWDg4SCgoKCgYGCgoKBgoGBgYKBgIGBgICAgIB/gIGAfXx9fX18fX19fX19fX19fXd3d3d3fX55d3d4e3p7eHd3d3x6fXt8fXx4eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt8fHx8fHx8fHx8fHx8fH19fX18fH18fH18fHx8fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8foqJjo2JhISEg4KCgoKBgYKBgoKCgYGBgoGAgYKAgICAgH+BgIB8fH19fX18fX19fX19fn5+d3d3d3d5fHl7eHx9eXt5enp4fHp9fHt9e3h4eHh4eHh4eXl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt7fHx7fHx8fHx8fHx8fXx8fX19fX19fXx8fHx8fHx8fXx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx/iIeNioeFhoaDg4ODgoGBgoGCgoGBgYGCgYCAgoF/gICAf4CAgHx8fX19fX19fX19fX5+fn53d3d3d3Z4eHl3eXp4enh5eXh6eXp6eHt4eHh5eXh4eHh5eXl5enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX18fH18fH19fX19fH19fX19fHx8fHx8fHx8fHx8fX+HiIyIhoeHhIKDhISCgYKBgYKCgoGBgYKBgIGBgYGAgIB/gIGAfHx9fX19fX19fX1+fn5+fnd3d3d3d3d3d3d3eHh4eHh4eHh4eHl5eHl5eXl5eXl5eXl6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fHx8fX19fHx8gIeIi4eHiYaEg4SDg4KBgYGCgoGBgYKCgYGBgIGBgYCAgICBgX97fH19fX19fX19fn5+fn5+d3d3d3d3d3d4eHd4dnl5eHh4eHh5eXl5eXl5eXl5eXl5enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fH19fXx9fXyBhoqKiYmIhIOFhISCgoGBgYGCgYGCgoGBgYCAgYGAgIGAgIGBf3x8fX19fX1+fn5+fn5+f394eHd4eHh4eHZxZGpeam15eXl4eHl5eXl5eXl5enp6enp6enp6enp7e3t8e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIGFiYqJioeEhYWEg4KBgYGBgoKBgYKBgYGBgYCBgYCAgYCBgIF+fH1+fn5+fn5+fn5+fn9/f3h4eHh4eHh5bWRiZV9fXm95eXl5eXl5eXl5eXp6enp6enp6enp6e3t7e3t7fHx8fHx8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goWKiomJhISGhYSDg4KBgYKCgoGBgoGBgYKBgIGBgICAgICBgH58fX5+fn5+fn5+fn9/f39/eHh4eHh4eW5kZWdlZGJeZnh5eXl5enp6enp6enp6enp6enp6e3t7e3t7e3x8fHx8fHt8fHt7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChouJiIqEhYaEg4OEgoGBgYGCgYKCgYGBgYCAgYGBgIB/gIGBf3x8fn5+fn5+fn9/f39/f394eHh4eHl3Z2VkZWZkZWFfaXl6enp6enp6enp6enp6ent7e3t7e3t7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHt8fHx8fHx8fHx9fX19fX19fX19fX19fXx9fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4eJh4SEhoSDg4WBgYGBgYKCgYGBgYKBgICAgYGAgYCAgYF+fHx/f35/f39/f39/f39/gHl5eXl5eWtlYWJlZWFlZV5ieHdze3p6enp6enp6enp6e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fH18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19g4aLhoiFhYaEgoOEhIKBgYGBgoKBgYKBgYGAgYGBgYGAgIGBgn98fH9/f39/f39/f3+AgICAeXl5eXl0Y2NlZGNmY2doZGZsZF5ze3p6enp6enp6enp6ent7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn6DhouGhoaGhYODg4SDgYGBgYGCgoGBgYKBgYCAgYGBgYCAgYGBfnx8f39/f39/gICAgICAgIB5eXl6d2RhY2diYmRdW2VfYV1eYGFoeHp6enp6enp6enp6e3t7e3t7fHx8e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+foSFi4eGhoaGhIODg4KBgYGBgoKCgYKBgoGAgIGBgYGAgYGBgYF+fX1/gH+AgICAgICAgICAgHl5eW9vYmJiZF5jZ19dYWFgXF9kYlttfHp6enp6enp6enp7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7fHx7e3x7fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5/hIiLhoSHhoaEhIODgoGBgYGCgYGBgYKCgYCAgYGBgYGBgYGBgX5+fYCAgICAgICAgICAgICBeXpwXWJlZGJkXmZnZ2BZYmJhY2VfXF1ze3t6enp7e3t7e3t8fHx8fHx8fHt7e3t7e3t7e3t7e3t7fHx8fHx8e3x8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fn19fn5+fn5+fn5+fn5+foCFjIqEhYaGhYODg4SCgYGBgYKBgYGBgoKCgYCBgYGCgICAgIGBf35+gICAgICAgICAgIGBgYF5emxiZGdjYmdmYWBgZGFiZWRjZGNeXGJ1fHt7e3t7e3t7e3x8fHx7e3x8fHx7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/gYeMiYWGhoeFg4SDgoGBgYGBgYKBgoKCg4KBgIGBgYKBgYGCgoF/f36AgICAgICAgIGBgYGBgXp7dGdnZmZkZGZmYF5fYWNlaGRlXmJkYHR8e3t7e3t7fHx8fHx8fHx8fHt7fHt8fHt7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f3+CiYqIhoaIhoWDhIOCgYGBgYGBgoGBgoKCgoGAgYGBgoKBgYKCgX9/f4GBgYGAgYGBgYGBgYGBenptaGNjZ2ZnZWdmZmdiZWRlYmdbYmVgdnx8e3x8fHx8fHx8fHx8e3t8fHx8e3x8fHt7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f39/f4SJioiGiYeFhYSEg4KBgYGBgYGCgYKCgYGBgYGBgYKBgoGBgICBgH9/gYGBgYGBgYGBgYGBgYF7emlpZGNqZmFgZmVjY2NnaWRjYmBiZGJ0fXx8fHx8fHt8fHx8fHx8e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f39+fn9/f39/f39/f3+AhIqMiIeJhoSFhYOCgYGBgYGBgYKBgoGBgYGBgYGBgoKBgYGBgYGAgH+BgYGBgYGBgYGBgYGBgXZzZWRnY2RmZWJlZmdkZmhmZWNgYGNkYHF9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fXx8fHx8fHx9fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/fn5+f35+f39/f39/f3+AgICFioyJiIqJhoaDgoKCgYGBgYGBgoGBgoGBgYGBgIGBgYGBgYGCgX+Af35/foCCgoKCgoKCgoKCc3NnZWRkZWlqaGZnZ2NhZmZlZmdmZWVjdX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fH19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gICAgICAgIWLioqJioeHhoSCgoGBgYGBgYKCgYKBgYGBgIGBgoKBgYGBgYGAf4B+dHRzdX1/goCAfn5/gYB0cmdkZWNmaWppZWNlY2BmZGRnZ2JiZWFwfXx8fHx8fHx8fHx8fHx8fHx9fX18fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f39/f39/f4CAgICAgIB/houLiouLh4eHhIOCgYGBgYGBgYKBgoKBgYGBgYKCgYCBgYGBgoCAgH5zc3NzdHV4dXV0dHV2dXVwZmNmZWhoaWdoZ2VmZWJfZGVmY2BiZ3d8fHx8fX19fX18fHx8fH19fX19fX19fXx9fXx8fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gIB/f3+AgICAgICAgICHjIyIi4qHh4eEhIKBgYGBgYGBgoGCgoGBgICBgoGBgYKBgoKCgYCAfnNzc3Nzc3NzdHR0dHNzdW9jY2FnZWhoZ2pmZGVnZmhmY2JlYl5ieX18e3t8fX19fX18fHx9fX19fX19e3x9fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn9/fn5+fn5+fn5/f39/f4CAgH9/gICBgICAgICAgYCAf4CAgYGAgIeLi4iNiYiJhoSFgYGBgYGBgYKCgYKCgYGBgIGCgoGBgYKBgoKBgIB+dHNzc3Nzc3Nzc3Nzc3N1cmdlZWRlamhoZ2ZpaGdjZWViZGNoZGd7eHVzc3R2dnl4dnR0dHZ3d3d2dHR0dXV4d3h4d3d6e3x9fXx9fn5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f35/f39/gH9+fHt7fX58eXl2dnZ5fHx6end2d3l7fXt4hIyMioyHh4iEhYSBgYGBgYGBgoGBgoGBgYGAgYKCgYGBgoGBgoGAgH51c3Nzc3Nzc3Nzc3Nzc3VzaGVnaGVrbGhqZ2lqZ2dnZmRkYmVkbnV0dHNzdHNzc3Nzc3Nzc3Nzc3NzdHNzc3Nzc3Nzc3N0dHV1c3V3eHl7fn59fn98f39/f39/f39/f314fH5+fXx4dXZ3eXd4dnRzc3N0dXRzc3Nzc3NzdHNzc3R0c3R0dHODjI2KiYeIhoOGg4GBgYGBgYGBgYGCgYGAgYGDgoKBgYCBgYGBgICAf3VzdHRzc3Nzc3Nyc3NzdnZpY2hqaGpsZWZpbGhgZmVkY2BkZGZ0dXV1dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHRzdHRzc3Nzc3R2dnV1d3V4fH9+fX9+fHp4dXN0dXV1dHNzc3Nzc3N0dHR0dHR0dHR1dXR0dHV1dHR1dXR1dXV1dIaMjYuIhoeEhIWCgYGBgYGBgYGCgoGAgYCBgYKCgoGBgIGBgYGAgIB/dnNzc3Nzc3Nzc3Nzc3N2dnNnZ2pmaGdmaGhmZGlnY2NnZWVmcHZ1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dHR1dHR0dHR0dHRzdHR0dnV1d3Z0c3R0dHR0dHR0dXV1dXV0dXV1dXV1dXV0dHNzc3N0dHNzdHR0dHR1dXR1iY6MjIqHh4SEhYKBgYGBgYGBgYKCgoGBgICAgoKCgoGBgYGBgYCAgH93c3Nzc3NycnJyc3NzcnZ2dW5kXWNnZWlraGVoZ2dqamlnZXB2dXV1dXV0dHRzdHR0dHR0dHV1dXV1dXV0dHV1dHR1dXV1dXV1dXV1dXR0dHV1dXV1dXV0dHV0dHV1dXV1dXV1dXV1dXV1dXV1dXV0dHNzc3Nzc3N0dHNzc3Nzc3R0dHR0dHWKjoyMiYaGhIeFgoGBgYGBgYGBgoKBgYGBgYGCgYKBgYGBgYKBgYCAf3hzc3Nzc3JycnJyc3NzdnZ3d2liaGhnamtpaGZkZGVmaWhwdXR0dHRzc3JxcnJ0dXV0dHR0dHR0c3NycXFxcXNzdHR0dHR0dHR0dHV0cnJyc3R0dHR0dXV1dXV1dXR0dXR0dHR0dHR0dHR0dHR0c3Nzc3Nzc3Nzc3Nzc3N0dHN0dHR0dHR0dYuOjImGhYWFh4SCgYGBgYGBgYGBgoKCgYGAgIKCgoGBgYGBgYGBgIB/eXNzc3NycXJycnJzc3N3d3d3bGpoZGhpa3Z6a2VmZWhnbXJzdHN0c3JwcHBxcnN1dXR0c3Nzc3JycXBvb29vcHFzc3NycnJyc3R0dHNxcXFyc3R0dHR0dHRzc3Rzc3N0dHR0dHRzdHR0dHR0dHRzdHR0c3NycnFxcnJzc3Nyc3NzdHR0dHN2jZCMh4eFhYSEgoGCgoGBgYGBgYGCgoKBgYGAgYGCgoGBgoKBgYGAf395c3NycnFxcnJycnNzc3d3d3dzc2pnaWloeX99cW51bG5wcXJycnFxcG9wcXFxc3R0c3NycXFxcG9ubm1ubW5ubnBxcnJycnJycnJzcXBvb3BxcnJzc3JxcnJycnJycnJycnJzc3Jzc3Nzc3Nzc3Nzc3Jxb29ubm9vcXJzc3Jyc3NycnNzcnaPj4uHhoWFhYOCgoKBgYGBgYGBgYGBgoGBgYGCgoKBgoGCgYGCgX9/f3hxcHBwcXFycnJyc3Nzd3d2dnd2cnF0c252f352c3hwcHBycnJycXFwcHFxcXJzc3Nzc3JxcXBwb25ubm5ub25vcHBxcXFxcXBwcXJwb25vcHFxcXFxcHBxcXFxcXJycnJycnJycnFxcnFxcnJycnFwb29ubm1ubW5vcXJycnJycnJyc3JxeI+OjYaDg4aEgoOCgoGCgYGBgYKBgYGCgYGBgYKCgoKCgoKBgYKBf4B/d29wb3BxcnJyc3Nzc3J2dnZ2dnZ3dnZ1c3l/fnd3d29wcXFxcXFxcHBwcXJycnJzc3JycXFwcHBwb29vb29vb29wb3Bvb29vcHBxb29vcHBwcHBvcG9wcHFycXFxcnJycnFxcXFxcXFxcHBwcHBxb29ubm5tbW5tbm9wcXFxcXFxcXFxcXB7j42NhoODhYOCgoKCgYKBgYGBgoGCgYGCgoGCg4KBg4KBgYGAgYF/f392bm9wcHBxcXFxcXBwcHZ2dnZ2dXR0c3NxfYB9fX9zb3BxcXFwcHBwcXFwcXFxdHFycnFxbn+DbnBwb29wcG9vb29vb29vb3BxcXBub3Bwb29wb29wcnJycnFxcXBxcnFwcXFxcHBwcHBwcHBwb29ubm1ubm5ubm9ub3BwcHFxcXFxcXFxcIKRjoqEhIOFhIOCgoGBgoKBgYKBgYGBgYGCgoKCgoKCgYGBgYCBgX9/gHVvb29wcXFxcXBwcHBwdnZ2dXRzcnJycnGAgoCBeXBwcHBvcHBwcHFxcXFxcXCIiHBxcXB0moBucHBwb3BxcHBvb29wb29vcXFwcG9wcG9vb25vcHFxcHBwb3Bvb3BwcHBwcHBwcHBvb29vb29vbm5tbW1ubm5ub25vb3BvcHBwcHBwcHBwiZCMiISDhIaDg4KCgYGCgoKCgYGBgYCAgYGBgoKBgYGBgYGBgIGBgH+AdG5vb3BxcXFwcG9vcG92dnVzcnFxcXFxcICDg39ycHBwcHBwcHBwcHFxcHBxcXyihHBycI6efG5wcHFwcHBwcHBwcHBvcHBxcXBwcHFxb29vbm9wcHBvb29vcHBvb3BwcHBwcHBwcHBvb29vbm5ubm5ubW5ubm1ubm9wcG9vb29vb3BzcXWPj4uJg4KFh4ODgoKBgoGCgoKBgYKBgYGBgYGBgYGBgYCAgYGAgYGAf4B0b29vbm9vb29vb29vb3Z1dHNxcXFxcXJygIKCgXRxcXFxcXFxcXFxcXFxcXFxdZ6jeHB4oJx9b3FxcXFwcHBwcHFxcXBxcHBwcXBwcHBwcHBwcHBwcHBwcHFxcXBxcXBwcHFwcHFxcXFxcXFxcXJxcnFwcnRycnR0dHR1dnRzdHR0dXd3gpCPi4iDgoaHhISCg4GBgYKCgoGBgoGBgYKBgYGBgYGAgICBgYCBgYB/gHVvb29vb29vb25vb29vdXRzcnJycnJycnKDg4OCdnFycnFxcXJxcnJxcXJycnJxmKmRb4KjnX5wcXFycXFxcXFxcXFxcXFwcXFxcXFxcnNzcnJyc3V1dHR0dHR0dHV2d3d3d3d3eHh4eHd3eHh4d3Z3dnV2dnZ2d3h6e3x7e3t6enp6enyGkI2LiIODiIeHhYODgoGCgYKBgYGBgYKCgoGBgYGAgYCAgYGAgIGBgH+Ad3FxcXFxcG5ucG9wcG92dHV1c3Nzc3NzdYiDgYN5cnNzcnJyc3Jyc3Nzc3Nzc3KTqqV8iqGdfHJzc3Nyc3N0dHV1dXV1dHV3eHd3d3d4eHh3eHh4eXl5eXl4eHl5eXp6e3t7e3t6enp5eXh3d3d1dnV2dnd5enp7fn5+fX1+fn5/f35+gIyQi4qHg4WIi4iEg4SDgYGCgYGBgoGBgoKCgoKAgYGBgYCBgYGAgIGAf4B8enp5eXx5eHh2dXZ2dHl2d3h3d3Z3dnZ6fnx+fXx2dnd3dnV4enh4eHh4d3h4eaGzqaepqpd9e3l5eXh4eXl6enl5eXh4enp5eXh4eHh3dnd3eHh3eHh5eXp7e3p8fH1+fX9/f359e3t7e3p5enl5e3t/foB/fn5/fn19fX5+f35+fn6AjpCNioeEhoqLiIaGhIOBgoKBgYGCgYGCgoKCgoCBgoKBgYGCgYCBgIF/f4B/fn19fX9/f318e3t7eXh4eHh5eXl4eXh5eXl4enp6enp6e3t7fH1+fHt8e3uKr6KhtamrpH97enp4eXh4ent6enp5eXp8fHt6enx8fHp6ent9fHx+fn+AgoGAgYKAgH9/gYGBgIB/f35+fn5/fX1+f4CAf35+f39+fn9/f39/gH+Af4OQjoyHhoWIi4yIh4aFg4GCgYGBgYKBgoKCgoKBgYKDgoGBgYGBgIGBgIB/goOCgoGBgX99f39/f4F6enh4d3h4eHh5eHh5enp5e358enx9fXt8fX19fX19fZmklqGxn5imlX2Af319fYCDgoCAf318fXx9fXt9fXx8fH19fX1+gYGChISDgoB/gYGBgH9/f4B/f39/f39+fn9/f39/f35+f3+Af39/gICAf4CAgICAhJCPi4eGhoiLi4mKhYaDgoKCgYGBgoGCgYKBgYGBgoOCgYCAgYGAgIGBgH+ChIKCgICAgH9+fn+AgH9/fn18fX19fYB/fX+Af35/gH9/fn9/gICBgICBgIGBnJuMn7ChoKKegICBgH5+f39+f4B/fn5+f39/gYB/f4CBgYCAgYOEgoGCgoGCgH+AgYCBgYGAgH+BgICAf39/gICAgYGBgIGBgYCAgICBgoGBgYCAgYGFjo6MiYaHiYyLi4qGhoOCgoKBgYGCgoOCgoKBgIGBgYKCgICBgYCAgYGAf4KFg4KBgYCAf39+fn+AfX5+fn19fX5/fn9/f35+fn+AgYCAgICAfn9/gICBgYCXm5CXsKCYlJyGfH5+foB+fn5/f35/gIGBgoKDg4KCg4KBgYKDg4OCgYGBgYKBgoKCgYKBgoGBgYGBgoKCgYGCgYKCgoGBgoKBgYKCgoKCgYGBgoKCgoaPkY+KiImKjY6MiYaFgoKCgoKBgYKCg4KCgoGBgYGBgYF/gIGBgYCBgIF/gYWEg4KCgoGCgYCAgIB8fHx7fH18fH9+fn9+fn5+f35+f39/f39/gH5/f4B+gKGspZeimpyZoqGIgH5+f4B/gIF/f39/f3+BgYGCgoCAgYKDg4SDg4ODgoKCgoKCgoKCgoKCgoGCgoKDg4OCg4ODgoKCgYKCgoODg4ODgoKCgoODg4KCh5KTkIuKi4uPj42Lh4SCgoKCgYGBgoKDgoKBgYGBgIGBgICAgYGBgIGAgYCAg4SDg4OEg4ODgoKCgXx9fHx9gn1+f4GCiIGCgoSCgYGDg4GBgYKDgoSEiJCisqagoZmdnaanrKmhm5KHgYCAgICAgH9/f3+AgICAgH9/gYODhYSEg4SDgoKCg4OCgoOCgoODg4ODg4SDg4KEhYWDg4SEgoKDhIOCg4ODg4OCgoODgoCKlJOPioqMj5GPjYuGg4KCgoKBgYGBgoOCgYGBgIGBgoGBgICBgYGAgYCAgH+BgoODg4SEhIOCgoKCfXx8fn6AgYOAg4OChIaFhoaFhIWFg4ODg4ODho2fra+kmpqgm52cnZ2gpKKck4eDg4KDg4ODgoGAgIKCgYOCgYKCg4OEhYWEg4OChISEhIOEhISDg4OEg4ODg4OEg4SDhIWEhISDg4ODgoKCgoKCgoKBgYKCgo+UlI+Njo6RkY6KiISCgoKCgYGBgYGCg4GBgIGBgYGBgYCBgIGBgYCBgICAgIKChIKChIOCg4ODgoJ9fX2AgH+AgoGDg4ODhIaEhIOEhYWDg4GBg4OBg4mVmJaVmJ+bnZ6dmpmXj4iGh4eGhoeHhoaEgoGCg4SDg4ODg4ODhISFhYWDhISFhISEg4KBg4OCg4SEg4KCg4SCg4ODg4OCgoKCgoKCg4OEhIOFhYWFhoaIk5OTkI+Pj5KRjIqIgoKCgoKBgYGBgYKDgoKBgIGBgYGBgICAgYGBgICAgICAhISEgoKCgoGBgoKBgX+AgYOCgICAf4CCgoGDg4KCgYODg4SDg4GDhYSCgYGFjZSTlpmcnZyVj4mHiIiHh4eIiIiFhIOBgIGBgoKCg4GCg4SEhYSDg4OEg4OEhIOBgYGCg4OEhISDg4ODg4OEhIODgoSDg4ODhIWFhoeHh4eIiIiJiY6TkpKOj46Rko+LiYeCgoKCgoKBgYGBgoKCgoGBgIGBgYGAgICAgYGAgIGAgICDg4KCgYKCgYGAf4CBhYWFhoOCgYB+fn+BgoSCgYKDhIOCg4ODg4KChISDhIODh4+VjZSYkIaDgoWFhYOEhIWFg4KBgH9/gIB/gIGEg4OEhYWEgoKBgoOCg4OFhIKDhISEhYaGhoaGhoWFhoeHhYaIh4aHiIeGhoaIiYeGhYaGhoeIkZKSj46QjpGRjImHhYGBgoKCgoGBgYGBgoOBgYGBgYGBgICAgICBgYCAgICAgISEg4KBgoGAgYGAgYKIh4aHhYSCgH99fX6AgH+AgYGBgYGBgoGAgYKDgYKCgoGAhpmIjIaCgoKBgICAf4GAgH+AgH9+gIGBgYKCg4OEg4OEg4OCgoGBgoODg4SEg4SEhIOFhYaFh4eIh4eHh4eHh4eGhoaGh4WFhYaGhISEhIWEhYaSk5GOjo+OkI6JiIeEgoKCgoKCgoGBgIGCgoKCgoKCgYGBgYGAgYGBgICAgYGAgoSDg4KDgoGCgYKDg4iHh4iHhYSCgX5+gICAfn5/f4CBgYGCgoCBhI2DgH+AgIB/gomOgIGCg4OAf39/gICAgICAgICDg4KDg4ODgoOBgYKCgoOCgYKCgoOCgoSDhISDg4SEhYWFhYaGhoaFhISEhYWEhIWFhYSEhISDhISEhISEipSTkZCQj46NiIaFhIOBgYKCgoKCgYGAgYKCgoKBgoKBgYCBgYCBgYGAgICAgYGAg4OCgoOCgoKBgoOCiImJiYiHhYSDgYKEhIOBgoKCg4SCgoSEgoOJloiEgoSCgn9/jJWCgoGChIOBgYGCgoODgoGDg4SDg4SEg4OCg4KDg4ODg4KCgoKCgoGDhISEhYSFhYWFhIWEhIWFhYWDg4OEhISEhYWFhISEhISEg4ODg4OOlZKQkZGPjYyHhYODg4GBgoKCgoKBgYCBgoOCgYCCgYGBgICAgIGBgYCAgICBgICDhYSEhIODg4SDhIOGh4mIhoWDhIODg4WDgYCDgoWFhISDg4OChI6Zi4OFhISEgoCRmYaCgoKEg4OCg4GBhIWEg4ODgoKDhISDg4ODg4SFhISDg4KCgoKCgoSEhYSFhYWFhYODhYWFhYaFhoWEhIWEhYWGhYWFhIWEhISDhIODhJGUk5KSj4yMioWEhIODgYGCg4KCgoKBgYGCg4KBgYKBgYGBgICBgIGBgH+AgIGAgYaGhoaGhoaHh4aGhYSDhYaCgIGBgYGHgoB+f4GBkIyDgX9+fXx9jJyOgIKBgYKChJSUjIGCgYKDgoKBgYKDhYODg4KDg4OEgoKEhIOEhIWEg4OCgoKCgYKCg4ODg4SFhYWFhIOEhYWGhYWEhISEhIOEhIWFhYWFhIODhIOEg4KGlJSSlJKPjYyIg4SEg4KBgoODgoKDg4GBgoKBgoKCgYGCgYGBgYCAgYGAgICAgICAhYWFhYaGh4aGhoWGg4ODg4GAgoKCgYKAf35/f4GWl4mAfX19fXuBmIyAg4GBgYCOlIyQgYKBgoKCgYKDgoODgoOCgoKCg4OBg4SDg4ODg4OEhIKCgoKDgoKDg4ODhIWEhISEg4OEhIODg4OEhIODg4ODg4SDg4ODg4KDg4KDgouUk5KTko2NioaDhIOEgYGCg4ODg4ODgoGBgoGCgoKCgoKBgYGBgICBgYCAf4CAgICDhISFhYSFhYWEhIWCg4KDgoKDg4OBgICAgICAgZWfin5+gH2Hi36EhIOEgoODgo2JhYyCgoOCg4KCg4ODgoODg4KCgoODgoKDg4KCg4KDg4WEg4ODg4SDg4SEhISEhYWEhIWEg4SEg4OEhISEhISEg4SEhYSDg4SEhIODgoKDkJSSkpKPi4yIhoSFg4OBgYKDg4ODg4OCgYGCgoKCgoKDgoCBgoGAgICAgIB/gICAgISDhYWEhYWFhYSFhYOEhIWDg4SEhIKCgoOCgoSBkaGKf4yFfYaJgH6FhYWEhYJ/fX19gIOEg4OEg4OEg4ODhISEg4OEhISEg4SEhIOEg4OFhoWFhYSFhYWFhYSFhoWGhoWFhYWFhYWFhYWGhoWGhoaFhoaGh4aFhYWFg4SEhIeTk5ORkoyKiIWGhYWCgoGBgoODg4OCg4KBgYKDg4ODgoKBgIGAgICAgICAgH+AgICAhYWFhYWGh4eGhYWFhISFhYSEhISEg4ODg4OEhYOJkYOEi4WCgYF+fYGHhoOAfn5/f39/f4OEg4SEhISEhISEhISEhISFhYWEhYSGhYWFhYaGhoWGhYWGhYWHhoaGhoaFhIWFhYWFhIWGhoaHhoaGhoaHh4iIiIaFhYaEhYWGjZSTkpGQi4qHhoeGhIGCgYKDg4ODg4KDgoGBgoODg4KAgYGBgICAgICAgICAf4CAgICHh4eGhoeHiIeHhoaEg4ODhIODg4OEg4ODg4OEhISEgYKCgYmBf359foWBf39/f39/f36AgISEhIWGhoaFhYWGhoeHhoaFhoWFhoeHh4iGh4eGhoaHh4eGhoeHhoaGhYODhIWFhoSFhYaGhoeHhoaGhoeHh4eIiIeGhoaHh4eRlJORkZCLiYiFhoWDgoKBgoODg4ODgoKDgoKCgoOCgYCBgICBgICAgIGAgIB/gICAf4aHiIeHh4eIiYmIiIODgoKDgoSEhIWEg4KCg4SEhIOBgICAhIR/fn5/gH9/f39/gIB/f4B/gImFhoiIiIeHhoaIh4iHiIiIhoaHiImJiYmIh4aHh4eJiIaHh4eHhoeFg4OEhYaGhYWFhoaGh4eFhoeGh4aGh4eHh4eHh4eFh5OTkY+RkIuHhoWFhIKCgYGCg4ODg4ODgoKCgoGCg4KCgIGBgYCAgICAgICAf3+AgYB/hoiIiIiHh4iJiYmIg4KCg4ODhIWHh4aFg4OFhISDg4GAgIGMiYGAgYKCgYGBgYB/gH9/fnt7goaHiYqKiYmJiImJiYmKi4qIiIiJiYuLioqIh4eIiIiHh4iIh4eGh4aEg4OFh4eHhoWFhISDhYWEhYWGhISEhYWFhoWGhYOJlJKQj5GOioaFhoWDgYGCgoKDg4ODgoKCgoKCgoKCgYGBgYGBgYCAgICAgIB/gICBgH+GiYiIiYeIiImJiIiEgoKDg4KDhImKh4aEhIWEg4OCgICAhISCgoKCgoKCgH9+fX19fX5+fHt7i4yIi4qLiomIiImJiImLiomJiImIioqJi4mGhoaGh4WGiIiIiIaGh4SDgoSHiIiIh4WCgoGDg4KDg4SCgYKDgoGEg4SDgY6TkpCPj4uJhYWGhIKBgYGBgoODg4OCgoKCgoKCgoGBgYGBgIGAgICAgICAgH+AgIGAf4WIh4eHhoeIiIiHh4SCg4OCgoOFiYqJh4WHhYSFhYKAgYOEgoOCgoKDgX59fX5+fn5+fn1+fX2Bl5CIjI6Hh4WGh4eHh4iHh4mHh4aIh4aJiYODhIOFhISFhYaIiIaFg4KCg4WHhoeGhoSCgoOEgoODhIKBgoGBgYODhIOEkZKQjo+Oi4eEhoaEgoGBgYGDg4ODg4KCgoKCgoKCgYGBgIGBgYCAgIB/gIGAf39/gIB/hYaGhYaGhoeHiIeGgYKEhIOChYeIi4qGhIaEgoaGgoKEhIODg4OCg4F9fH1/gH9+fn59fH1+fHqEmpOWioODgYKDhIaFhYODhYSEhISEhIWEgoKCgYSEgYKDg4WGhYSCgoGCgoODhYSEhIWEhIaEg4SFg4KDgYKDg4SFhIeSkY+Nj4yJhYSFhIWCgYGBgYODg4ODgoKCgoKCgoKBgYGBgYGAgICAf4CAgYB/gICAgICDhIWEhYWFh4eHh4aAgYGFg4OEhYSHiIWCgICAgX9/gIODg4ODgoKAfX1/gICBf31+fn18fX17enqInY2DgoGBgIGBgoKBf36BgYGCgYOBgoGCgoKBg4SAf4CAgYKCgICAgYCBgoGDgYGChIODhYSBg4SDgoKBgoSDhYWGi5ORj4+Pi4iFhYODhIGAgYGBgoODg4KCgoKCgoKCgoGBgYCBgYCBgH9/gIGBgICAgH+AgIKCg4OChIOEhYWGhn+BfoCBgICAf4GDgn9+fn5+fX+Cg4OCg4KDgn59fn+AgIGAfn19fX1+fXx6e3uKhYKAf39/f35/gIB+fYB/foCAgX+AgIF/f4CBgX59fX+AgX9+fn+AgH+AgICAf4CCgICCgYGDgYGAgYGBgYKEg4aPkpCOj42Kh4eGg4ODgYGBgYGCg4ODgoKCgoKCgoOCgYGCgYGBgICAgH+AgICAgICAf39/gYGDhIGCgoOCg4SFgIB/fH19fn19foCAf31/fn1+gIODg4KCgYF/fX1+f4CAgH9+fX19fHt7e3p6enuDhIN+gH9+fn1/f35/gH9+f3+Af4CAf359fn9/fn18fn+Afn5+f3+Af39/f4B/f4B+f4CBf4B+f39/gH9+f4B/hZKSj46Pi4uHiYWEhIKBgYGBgYKDg4ODg4OCgoKDg4KAgYKBgYGAgICAf3+AgIB/gIF/f36BgYSEgYKBg4OCg4OBgH98fn9+fX6Af4B/foF/f4CBhIOCgYB/f359fn5/gICAfn19fXx7e3x6enp6eX6Wk4N/gH9/fn9/foCAf35/f4B/goB/fH5+f35+fXx/f4B/fn5/foB/f35/f4CAfn5/f39+f35/f35+fn19fX2Fk5KOjIuKiImIhISEgoKCgYGBgoOCgoOCgoODg4ODgYCBgYGBgYCAf39/f4CAgICAgIB/foCBhIOCgYGDhISDhICBgICBgIGAgYKCgoGBgoCBg4ODgYGBgYCAfn19fn5+f359fX19fXx8fHt6enp5eYKLhICBgYGAgIB/f4F/gICAgYGCgoB+gH5/fn5+foGAgYF/f39/gICAf39/gYB+f3+Afn9/fn+Af31+fn17fIaTkYyLioeHioiGhoSDgoGBgYGCg4ODg4OCg4OCgoKBgICBgYGAgH9/f39/gICAgICAgH9+fn+BgYGAgISGh4aHgoSDhYKBg4ODhYSEhISEg4ODhIKCgoKCgX9+fX19fn6AfX19fX19fX19fHp6eXl5eoCCgoKFg4GCg4GAgoCCgYGDgoODgYGCgIGAf4CBg4GEgoCAgYCBgYCAgYCCgn+BgIF/gIB/gICAfn9/fnx8iZSQiomIiIiJiIaGhoSCgoGBgoKDg4ODg4KDg4KCgYCAgICAgYGAf39/f4CAgICAgIGBf359fn5/f39+g4aHh4iChYSFhISFhIWGhYaGhoWGhYGBg4ODgoKAfX19fX19fn59fX19fX18fX18e3l5eXl4fYKDhIWCgYSDgoKDhYeCg4SDgYKCg4OCgoKCgYKFg4iFgoGCgYKDgYGBgYSDgoOCgYKCgICBgIF/gIGAf36Ok4yHiIaIh4aGhYaGhIKDgoGCgoODg4ODg4OCgYGBgH+AgYGBgYB/gH9/gICBgH+AgYB/fn19fX5+f36Ag4SHh4SGhoaFhoaHh4aHh4iHh4eGf32AgICCgX59fX19fX19fX19fX18fH5+fnx7eXh4eXl5gIODf4OMhIOEhISXl4ODhIF9foGBgoGBgYKBg4aIjIWDgoKBhIKEg4KDhYSEhYODg4OCg4OCgoKCg4OCgpGQi4iIh4mHhoaEhoWEhISDgYKCg4ODg4ODgoGBgYCAgICBgIGBgH9/fn+AgICAf4CAgH9/fn1+fn+Bf4CCgYWFhYeGh4eHh4eIhoeHh4eGh4V+fX18fX9+fX19fX19fX19fX19fXx7iJKCe3x6fIZ5eXl8gYF+iJaDg4OEhJSTgIGBf39/fn6Ei4B/gICEhpCJhYSCgoGFhYuDgYKFhYaGhIOFhYOEhIODhIOEhISIko+MiYiIiYeHh4WGhYSEhIKBgoKDg4ODg4OCgYGBgYB/gIGAgICAf39/f4CAgICAgYGBf39/f4CAgIGBgYGBg4OGh4aGh4aGiIeGhoaFhIOFhH59fHx8fX18fH19fX19fX19fX18fH+RlZaDe3qElHx5enp7fH6Bg4GCgYOCgH59f397iJF8fI6Wf31/f4KGioWDg4SDgoONiX9+f4OEhYWDhYaFhIWFg4SFhYaEhI6Rj4yKioyJiImHhYWFg4SDgYGCgoKDhIODgoGBgICBgICAgYGAgIB/f3+AgIB/gICAgX5+f4GBgoKCgoODgoOCgoWFhISFhYSGhIOEg4KBgIKAfn19fHx9fXx8fH18fH18fX19fHx8e4uRl4x6e3yBenl6e3x5eX19f4B/gH98e3t+fn2ClZF/hIh9fH5/goR8fIGChIN/f4eDfYKBgIKCgIODhISEhISChIOEhYGEkZGOi4yMjoqJiYWFhYODg4KBgoODgoKDg4KCgYGAgIGAgICAgICAgH+Af3+Af357gICBenyAgYKDhYODhYWFhYODg4OCgYKDgoOCgoGBgIB/gX5+fX19fHx8fHx8fHx8fHx8fHx9fHx8fn6Kgnt6e3p4ent7fH18fn5+f35+fX19fH+BgH2Gj4F+fYJ+f36Agnx8gH+CgIGAfnx7ioJ9gH9+gYCAgYKBgoCAgIGAf4uUkIyLjo6NiIiHhYWFhIOCgoKCg4OCgoODgYGBgICAgICAgH9+fXx7fHx9f3+AgHx6gYF4e4CCgYOFhIOFhIaHhYSAhpSIgIKBgYGBgH9/f39/fn5+gHx8fHx8fHx8fHx8fHx9fHx8fHx9fHl6e3t4eHl7e3p8goCBf3+AfX9+f359gIKCgICAgX+CkYF/f4CAfoB+fn9+gIGBfX19e319fXx9fHx9gH+AgH6Afn6ClJKNjI2Oj4qFhoaFhISFg4KDgoODg4OCgoGBgYGAgICBgICAf4CAf39/fXt6fICAgHh+gXd7gIF/goKCgoKEhoeGhn6IlYp+gIGAgIB/foB+f39/fn+Bfnx7e3x8fHx8fHx8fH19fHt9fHx8e3x8fHp6eXt8en2Fg4OAgYF+gH5/gH6FgoF+gH9+foCFhoKAfn6Dhn99fH5/gIGAf39+fX19fX57fH1/f3+AfX9+f4yRjo2Njo2Nh4SGhoWEhIODg4OCg4ODg4KBgYGBgYCAgYGAgYGBgYGAgH9/f397en9/e3mAd3p/f31/f3+Af4KEhoaFf3+FgX5/gIB/gH5+f31/gIB/gIB/f319fHx9fn18fH19fX19fH58fXx7fXx8ent6fH19f4aFg4CAgH1+fX5/fouEgYd+fXx8f36CgX99fX19gXx7fXx+gYSDgYB+fn5+fXx+f4B9foB+f36Eko2NjI+NjIqGhIWEhIODg4OCg4KDgoOCgYGBgYGAgYGBgYB/fXx8fH1+f39/f397e399d352eH59fH18fX5+gYGCg4F6fn58fn6Af35/f35/fn+AgH+AgH9/fn9+fn5+fn1+fn99fH59fn19fXt8fHx7e3p9foCAg4OCf35/fHx8fXx8gYN+jH58e3t9fn1+fn17e3t9fHt7e3uAhoSChIOCf4B+f4KCgn9/goJ/gIuQjY2MjYuKiISEhIODg4ODgoKCgoKCgoKBgYGAgoGBgYKCf3+AgIB/fn18fH5/fn55fX52e3Z4fXx8fHt9fX6BgICAf31/f31+f39/foB/f39/f3+Af4GBgH99gH9/fn9+fn5/f3yCfX59fX17e319fHp8fH2BgoGAgIB9fX18fHx8fH18fnt/fnt7e3x8fH18e3t7e3x8enp9en6CfoKEhIOBgoGFhoWFhoaHhYGEkY+Ni4qLh4eFgoOEhISEg4KCgYGCgoKBgoGBgYGBgoGBgoKAgYKBgYCAgH9+e3x+fnx6fnh5dnd8fHx7e317f4GAf35/foB/f35/f35/gH9/f39/f39/gYKAfn6BgIB/f39/f39+fYN8fH19fH99fX19e3x+fn5/fn5/fnx8fXx8fXx9fnt8e3x8fHx9fH18fnx9fHt7e3x5e3x7e316fX5+f4CAg4eJiYmKiYqJhYiSj4yJioeFhYOCgoOEhIOCgoKBgYKBgYKBgYGBgYKCgoGCgoCAgX98e3p6eXt9enx+fnl8eXh4dHx8fHt8fHx+gH9/f39/gIB/fn5+fYCAgH9/f3+Af4CDgoB/gIGAgIB/f4CAgH58enx9fX59fX5+jIZ9fX57e4ODfX19fH18fX19fX19fH18fXx9fX58fn19fX18e3t6fHt8fHt6e3t6enp7fn6ChYiHiIqLi4uJjJGQjoqJhoWEgoKCgoODg4OBgYGBgYGBgYGBgYKCgoOCgYKBgIGBf3+Af356eHl5en5+e3l6eH5zfHx8e3x8fH5+fn5/gH+AgIB/fn9+gIF/f4B/gIGAgoSEgYCAgYGAgX+AgYKBf39+f31+gH57foGSjHx9f4qAjYx+fn19fX59fX59fHx8fn18fXx9fX1+fX1+fnx7e3t8fH18e3p7e3l6eXl5e35/g4OEh4mKiImOkI6MiYmFhISCgYKCgoKCgoGCgoKBgYGCgYKCgoGCgoKBgoKAgYGAfoCAf39+e3p5e319eHx6f3KBfXt7fXx8fn59fYGBf4GBgX9/gH+AgX+AgIGCgYGFg4SCgYGCgYKCgICBg4KAf4F/fX6Afnx/f4mCf36DkYSEg4F/fn18jYd9fX59fXx+fnx9fXx9fX5+fX5/fH19e3x9fnx8e3x9enp5eXl5ent+foCBg4eEiI+Oi4qHhYSEg4KBgoKCgoGBgYGCgoKBgoKCgoKCgoKCgoGCgn+AgIB+f39/fn5/ent5fX16enp9cX6Cent9fX19fXp4f4KAgYKCgICBgYGBgICBgoKCgoaFhIKBgYKBgoF/gIKEgX9+gYB9foF+fX5/gIB9foCEgH5+f31+fXyKhX1+f31+foB+fX18fH5+fn99f4B9fX18fX9/fHx7fH17e3t6enp7e3x9fX2Ag4CJjouMiIWFhYSDgoKCgoKCgYGBgoKBgoKCgoKCgoGBgoKBgYKCf4CAgH9/f39+fn59eXp6fXx5d3t0e4d8dHd9fn17e3Z2fYCBg4KBgYKCgoKBgYGDg4OChYaEg4CAgIGDgX+AgYSBfn6Af31+gH59fn6AgH+Bfn+Af39/gH99fn5/f3+Afn9/gH58fX18fn5+foF/gH2CgHx9gIB9e31+fXx8e3x9e3t7fHt8fHx9fIqKiYmGhoWFhISDgYKBg4KAgIGCg4KCgoOCgoKCgoGCgoGBg4J/gIGAf39/fn5+fn57enp8fHt2e3R3f352cnt+fnt4dnd8gIGCgoKBgoODg4OCgoSDhIOFhoOCgX9/gIKBgICAg4B+foB/fX+AfX1+foCAf4J/gYCAgICBgH1/f3+AgICAgIB/fnx9fX19fn59g32AfoKAfX6AgX98fn59fX17fX58fXx8fHt8e3x+ioeHhYaIhYSFhIKCgoGDgYCAgoKDgoKCg4ODg4KBgYGBgYGCgH6AgYB/fn5+fn5+fn56e3p9goN9dXF6fHpxen59eXh0dICAgoKCg4KDhYOEg4KDhISEhIWEgYGAgH6Agn9+f36Bf35+f4B9foB9fX1+gH9/gYCBgICAgIGBfn6Af4GAf4CAgH9+fX19fn1+fn19gYR/gH9+f4GBf31/f319fn1+fn1+fHt8enx7eoCIg4SEhYSEhIWDgYKBgYKBgICCgoOBgoOEg4SDg4KBgYKBgYOAfoCBf35+fn5+fX5+fnt7en6Jh354cnl9f3F6eHt4eXV1fYKDgYODg4OFhIWDg4OEg4OEhIOBgICAf4CBfn19fn9+fn5+gH19f3x9fX6Af4CAgIKAgIGAg4KAf4B+gIF+gIGAgH9+fn5+fn1/fn6FhYGBgX+Ag4F/foGAf35/f4B/fn17ent6fHt6goWAg4KCgoKCg4GBgYCAgoGAgIKCg4KBg4SDhIKEgoGBgoGCgoB+gIF/fn1+fn5+fX59fXp7fIWEe3tzeXt8cHd1dnd5dXR6hISBhISDhIWFhoSDg4WEgoODgoCBf39/f4B9fX1+f31+f39/fn1+fH19foF/f4B/gIB/gICDgoGAf36AgH+AgYCBgH9/f39/f4B/gIGCgoKBf4CDgn9/g4J/f4B/gX+Af3x6fHp8e3yCgH+Cf3+BgIKCgYF/f3+BgH6BgoKDgYGDg4KEgoSCgYGBf4GCgH6AgH9/fX5+fX19fn19e3t6gH94fHZ5enxxdHh3dnh1cnmFhYKEhIKEhYWGhISChIOBg4GAgIF/f4B/gHx9fX6AfX5/f39+fX98fn5+gX+BgH9+f4B/gYOCg4B/f4GBgIKBgYGBgIGAgIB/gIGAgIKDgYF/gISAfYGDhICAgX+BgYKBfXp7e3x8fYB9f4B8f399fYGAgH59fX9/foKBgYKBgIKCgoKBg4KCgYB/gYKAfn9/fn99fX1+fX19fX19ent7fHZ9eXh6enJ1eXl2d3dzdYaFg4WEgoSEhYSEhIGDgoGDgX+AgX5+gH6AfX19foB+f4B+fn99f3x/f3+BgIF/f3x+gH6AgYKDgYCAgYOEgoGAgYB/goCAgYGAgYGBg4OBgX+Ag4B+goOEgICCgYKChIJ+e3t8fHx9fn1+fXp+fX14fn9/fHx8fn5+gYCBgYCAgoGBgYGDgoGBf4CAgoB9fn19f319fX59fH19fX16e3p8dnx6d3t4cnZ5e3Z2dnN0hoSEhYSChISFg4ODgYOBgYOBgIGBfX+BfoF9fX1/f39/gH5+f359fYB/gIGBgX9+fH5/fn5/gYJ/gYGCg4eFgX9/fn6Af4CAgICAgIKCgYCAfoCCf3+BgoOBgYOCg4OFg399fX18e3x8eXp7en15e3l4f357fHt+fX1/f4F/gH6BgICAgoOCgYF/gIGBf31+fH1+fX19fX18fn58fXx5e3x4enx3endzeHd6c3Z2c3SFhISGg4KDhISDgoKCg4GCgoGAgYF9gIB+gH1+fX5/gIB/f39/f3x/f3+BgIGAf359f39+fn+BgH2AgIGDg4N/f359fn5/f4CAgIB/gYKBgH9+f4F+f4CCgoCBg4KEhIaEgH5+fHx8fHp5dnl5enl2eXZ+fHt7e359e399gH59fX9/f3+BgoGBgX5/gYF+fX18fX19fX19fXx+jYF8fXl7e3p5fHd4eHR1dXhyd3d0doaEhIWEg4ODg4OCgYKDgoGDgn+Bf35/fn+AfX19fX6AgIB/f39/fIB/f4GAgYCAf3yAf35/fn9/fX5+gYGCgn5/fn1+fn5+f3+Af32AgIB+fn5/gX5+gIKCf4KDgoOEh4SAgH58fXx8e3x1eXl4eHh5d3t8e3t7f4V9fn1/ent+fn59foGAgIGAfX6BgH59fXx9fX19fX18e32Dgnx8ent7e3p7d3Z4dXJzdnB4eXJ4hYWFhYOEhIOChIKBgYKBgIKBgIF/fn5+foB+fX58foCAgH+AgIB8gH6AgH+BgIB/fYB+fn9/f359fX6AgYGAfn9+fn59fX5/fn9+fH6Af35+fn+Cfn6AgIF+gYOCg4OGhICBfnx9fHx7fHh3e3h1eXd3eXx6e3t9kod9fH13en1+fn19f35+gH98foB/fn19fH19fX19fHt8ent9enp4e3x6ent4dHh1cXJ0cHh4cXmEhYWFg4SDgoODgoGBgoKAgoCAgIB9fn5/gH18fnx/gIGAgICAgHx/f4B+f4GAf399gX9+f39+fX18f4CAgIB+f35+fn18fn9/f358fYB/fn1+gIJ/foCAf36ChIKCg4WFgoJ+fXx7e3x8eXd7eXd4d3d4e3t6e3yFiX17end6fH19fHx9fX1/fnx9fn59fXx8fX5+fX18fHt6enx7e3p5enp7enhzd3VxcXNveHdxe4WGhYWDhYKBg4OBgoGBgoCCgICAgH5/fn9/fXx+foCBgoGAgIGBfX6Af35/gX+Af3+BgH9/f319fH1/gICAgH9/f35/fXx+f39/f319f39+fn6CgYF/gIB/foGDgoKEg4SCgn5+fHx6fHt7eXt6d3N2d3h5e3p7eXp/fnt7d3p8fXx8fH59fH19fH19fXx8fX19fX99fXx9e3l7fHx7enp6enp6eHN2dXBwcm93dnJ7hYaEhYOEgoGDgoKBgYGCgYKAgYGAf4B/f399fX9+gICBgYJ/goF9foF+fn+Bf4B/gIJ/gIB+fH58f3+BgICAf4B/f4B+fX5+f4B/f39/gH9/f4J/gICAgIB/gYGAgISBgoKAf39+f3x9fn56fYV+dHx9enp6enx5eXp6hoV3eXx8fHx8fXx8fHx8fX19fHx9fX19fn19fX16eX18fH16enp6enp5c3V1b29xb3d0c3yFhoOEgoOCgYKBgoKCgYKBgoGBgYCAgICAgH59gH+Af4GCgn+CgX+AgX5/gYB/f4CAgn+Bf319f35/f4KAgICAgIB/gIB+fn1/gH9/gIB/f39/gH+AgICAgH+AgYCBgYGCgYCAf39/fn1/fnuBk416fH18e315e3p6eHqBgXh5e3x8fXx8fHx8fHx9fX18fH18fn1+fn59fHp8fHt8fXt5enp6eXl0dXVvb3Fwd3N0fYWGg4OCg4KAgYCCg4KAgYGCgYKBgYCBgIGAfn6Af4GAgYKCgIKCgICCfoCBgX9/gX+BgIF/fH6Af3+AgoCAgICAf3+AgH9+fX6Afn2AgIB/f3+AgICAgYCAf4CAgYCBgYKCgICAf39/fX5+fIGGiXx8fnt7fnl6e3p7j393d3l7fHt9fHx8fHt9fH19fX18fXx+fn5/f358enx9e3x9e3l6e3p5eXN0dW5zcXB4cnV6hYaDg4KDgoCAgIKCgYCCgYKBgoGBgYKAgYF/fn9/gYGCgYKBg4OAgYJ/gYGBf4CAgIB/gX99f4F/gICBgICAf4B+gICAf359foB+fn+Af39/gH9/gICBf4CBgH+BgIGCgoKAgICAgIB9foB9gIOCe35+e3x9e3p8fHuHenh4eXx8fH17fHx9fX18fH19fn19fX5+f3+Af317fH18fHx7enl7e3l5c3J1bnZycHhxdXaFhYOEg4KCgICBgoF/gIKCgoKDgYGDgoCCgYB/gICCgoKBg4KEhICBgX6BgoF/gICAgH+Cf36AgYCCf4B/gIB/gH+AgIB/fn2Af35/f4CAgH+AgH+AgYF/gICAgIGAgYGBgYGAgYCAgH9/gH5/fX59fn57fXx9e3x8d3h1eHh5e3x8fXx8fHx8fX5/f39/fn19fn9/gIGAf3x9fHx9e3p7eXp8eHpzcnVud3FxenF2d4WFg4SDg4KBgoKDgICCgYSDg4SBgYOBgoKCgYCAgIKDgoCCgoSDf4GAfoKDgICBgICAf4CAf4GAgYKAf4CBgH9/gICAgIB/f4CAgH+AgICAgIB/f4CBgYCAgICAgYGAgoOCgoCCgYGCgYB/f4B/gId+fnx7fXx7fX94d3Z5eXp8fHx8fXt8fH19fn5/gIGAfn1+gICAgoGAfH59fX58d3t6ent5eXNxdW53cHV6cXZ5hYWCg4KDg4KChISAgIOBhoODg4GChICEg4KCgICCgoSBgYKBhIJ/gIB/gYOCgYCBgYCAf4GBgYGBg4B/gIOCf35/goGAgH9+gYCBf4CAgYCBgYCAgIKBgYKBgX+BgYGBgoOCgoOBg4OCgYCBgH9/hH19fXx/fXp9f3t6dnp4eXt7fH19e3x9fX19fn+AgYGAgH+AgICDg4B8f35+fn15eXt6enp5c3J0b3dxd3lzd3uFgoKCgoOEgoOEg4CAg4OGg4ODgoKEgYSDgYOAgIKBg4GCgoGCgX6AgICCgYKBgYKCgIGAgICCgoGEgH6Bg4F/f4CDgoCBf4CCg4KAgYKBg4KDgoGBg4KChIGAgYOBgYKEg4KEhIODhIODgYGBgoCCf4B/fYB8enx/e3t3fHl5eXt6fX59fHx8fH1+foCBgYCAgIGBgYSEgH2Af39/f357e3t6e3p0cHhxeXR2eHR2e4SCg4KDg4SChIODgYKChIaEgoODg4SBhIOAg4CBg4KCgoKCgIKAf4GAgIKBgoGCgoKBgIGBgYOCgoOAfoGDgX9/gYSEgYN/goKBg4KCgoGEg4OEgIKEgoOCgoGCgoOBg4SDhISEhISFg4SCgYOCgYOBgYGAgH58fIB9fHh8eXp5enx9f3x7fHx9fX18fICAgICAgYGBgYKBf4CAgICAf3t7e3p6enVweHd5dnV8dXZ8gICDgoODg4OEhISBgoOFhYWDg4KDhIKEhYKCgYKDg4GCgYKAgYB+gYCBgYKDgoKCgoGAgYKCg4KCg4B/gYOCgICChIODgoGCgoGDgoKDg4ODg4SAgoSDg4OBgX+Bg4KDhYKEhISEhISDhISChIOEhIKBgoCBgHt9gX58eXx6enp9fHyBfXp8fH19fHp7fn5+gIB/gYGAgICAgIKBgIB/fX18fH18dnJ2eHh2dH92dX2Hh4OChIWDg4SFhIGChIaEhIOCg4SEgYSFg4KCgoODgYOBgoCCgH2AgIGCg4KCgoKEgoCCgoODgoKBgICBg4KAgYOFhIOCg4CCgoOCg4ODg4OEg4CCg4KEg4KCf4OBgoSEgoODhISEhIOEhIOEg4WEg4ODgoKAe4CBf3x8fXp6fH2AfX9/fHx6fH59fH19fn5/f39/gICAgH9+foCBgICAfnx9fn5/fn18fHh2f3Z3f4SHg4KDhoODhIaEgYKFhoWEhIODhISChIWFgoKDg4SCg4KDgoKBfoCAgoKDgoODg4SDgYKCg4OCg4KCgYGDgn+Cg4SDg4KEf4KEg4ODgoSDg4SCgIOEg4SDg4KCg4KChIOCg4OEhISEhIWEg4OEhYSFhIOBgoB9gYKAfXx8e3x8gH19foB+fn1/fnx8fH19fn5/fn+BgYGBgH99fX6BgYB+fn1+fX59fX5+f3+AfH2AgYKCg4OGg4SDhoSBgoiGhYSDg4SEhYGFhYWDg4SDhIODgoOCg4F+gYGCg4SCg4OEhIOCg4KEg4ODgoKDgYOCf4KDg4ODgoOAgoWDg4ODhIODhIOBgoSEhYODgoODg4GEg4GDg4SEg4SEhYSEhIWFhYWEg4ODf36BhIB9fXx8fHx/gX5/f39/fX99e3x9fX19fX5+f4CBgIGBgH59fH6Cf39+fn5+fX1/f39/gICAf4CEhIODg4WDhIOFf36CiouFhYSDgoSFgYaGhoOEhISEhIODg4OEgn+BgYODhYSFhIWEg4KEhISFhIODgoSDhYKBhISFhYaEgoCDh4SDg4OFhIWFhIGEg4OHgoOCg4GCgYSDgoODhIODhIWEhYWHh4aHhYSEhYSBf4GDf35+fH5+fX+BgH9+fHx/f358enx9fX19fX5+fn9/gIGBf319fIB/gH5+fn5+f3+BgYGBgYKAgYWFhIOEhIKEg4aAgoSFi4mEhISEhYWCh4aGhISEhIWEhISEg4SDgYKDg4OEhIaEhYSDg4SEg3yDhHuBhHd5g4F9hH5+cnWDgoF2foOEgH2BdYF5g39/f36EhIKDgoOBg4SDhISFg4SFhoSFhn2EeXx+f4N7hYOBhIOAf31+f35+gYOBfXt/fX6Afn18fHx9fX19fH19foB/gYJ/fX18f4GBgICAgH+BgYGBgYKDg4KChoSEhIWEgYOEhYOEhYSKiIWFhYOFhYSGhoaDhISFhYWEhYWEhIWCgoOEhYWFhoSFhIOEhYWCaICFanx7cXF8gXOGc3R0fYKDdXNxg4ZzcHVyc3SDdnt9dYF/goOBgnZ5hYCDgIR/hYSChYWCaHpyc3N8gHKChH6Dg32BfX5/fn+Cg4J8f4F9f4B9fXx8fHx9fHx8fn1+gX+BgX99fX2AgYKBgYGBgIGBgYKBgoKCgoSHhIWEhYSBgoSGhoOFhIaIhoaFg4aGhoeGh4OFhYaFg4KFhoSFhYODg4SEhoaGhIaEg4SFhn1we4FweXZ+g3+CbnlwdXN8dnl5hnKEg3B2eHF2dHR1cnN0dml/gG5yb3R2bnVsd216c26Ah3ltfXJzdnN2bW53bHB5bHV9f358foGAgX2Af32Af4B/fX18fHx9fH1+f32Af4CAfnx/foCBgYCBgICAgYCAgIKDgoKEhYeGhoCChYODhYeGg4WFhYaHh4SDhoaIiYaHhIWGiIeEg4WGhYWEhIOFhIKFhoaFhoWEhoWHdnB0e3BydX+HhYNtdW92b3x1coR5eYd4cXR3bndod3pucHaCcoN+b3p5eW1vbnpvb2x3fXiGcHF6cHJ0ZoF1fm57eXNveX+Af31+gYB/e39+fIB+gIB+foCAgYB+fn9/foF/gH9+fYB9f4CBgIB+fn+BgH9+goOCgoSFh4eEfoeEg4OFh4aEhYWFhoaIhISGh4iIhoeEhoaLioWEhoeHhYOFhIWEgoWFhYWGhYWGhYZxdXByc29zenl+hHSIdHV+iHZugnKEhnluanJ/cW1zd3x/dXR8hH54cXV3bnl1enF2eHV6eYRyaW95eHBreXN6b3p3dnZwgYB/fn5/f396fn18f31/f359gIGDg4CCg4GBhIKBf4GCgH1/f4F+f35+f4GAfn6BgoCAgoSHhoODh4SEhIWHhoWFhYWHhoiFhYaFh4eFhoSGhomIhYSJi4iFhIWFhoWDhYWEhoaGhoaFg3iLeXKIentwcIWEeIV4eWtzfnl7a3KDh4N6fG16eXl0fYB2bm+AgG90fHV3cXl9fW1+dW+DhYZ6gHJye3x1cG96a3N8bnaCgYF+fn99fXt9e3x9fH9/fn1/f4KCf4GDgYGDgYB/gICAfn9+f31/fn1/gH58fYGAfn6Ag4iFhoOFhYWFhoeFhYWFhYeHiIaEhoWHhoaFhIWFhIWFhomKh4WFhoWGhoWGhoSGhoaGhoWGh4eHhoaDhoWGh4iHhYeGhoOHhoWFg4SFhoWGhIaEg4SEhoSEgYODhIOFhIWEhYSGg4WGhYWEhIWHhoSEhYaFhX13hYOEhIOCgX5/fnt8e357fHx9f399fH9+gYB9f4F/f4GAfn5+gH5+f35+fX99fX5/fHt8gH58fH+BiYaFhIaGhoWGhoWFhYWGhoeIhoSGhYeFhYWDhIWGhYSGhoeGhYSGhIWGhoaGhIeGh4eGhYeIiIiIhoWHhYaGiIaFiIeIhYeGhoiFhYaHhYaGhYOChYWGhYWDhYSEhIaEhoWEhYWDhoaFhoWEhoeGhISFhoOFhIKEg4OFg4OBfYB/e3t8fnt8fH1+fnx8fn2Afn1/gH5+gH99fXyAfX5/fn5+f3x8fX57fHx/fHt7fn+Ih4SEiIaGhYeGhYWEhoaGhoiHhIWGh4aFhIODhIaFhIeFhoaFhYaEhYaGh4eFh4aJiIaGiIeIiYiFhYiFhoeGh4aHhoeFh4eGh4WFhoeFhoaFgoOFhoaEhIOEhIOEhoSGhYWFhYOGhoWGhYSGh4WEhIWFg4SHhoOCg4SDhIJ+gYB8e31+e3x7fn59fHx+fX5+fX9+fX1+fnx9fH98fn58fYF/fHx8fXx8fH56e3t8foiHgoWIh4eGhoaGhISGhoeGiIaEhYSHhoSFh4OEhYSFh4SFhoaFhoSGhoeHhoaHh4mIhoaIh4iKiIWGiIWGh4WHhoeGh4WIiIeHhYaGh4WGhoSChISFhoWFhISEg4SFhIaGhoWGhIaFhoaFhYaGhYSDhISDhIeDhIGChIWDgYCAgXt7fn18fHx+fXx8fH1+fH18fn18fX18fHx8fXx+fXt8gX99fH18fnx8fHp6fHx9iIeChoiHhoeGhoaEhYaFhoaGhYOFhIaFhIiJg4GEg4SGhIaGhoaGhIeHiIiHh4eIioiGh4iHiImIhYiHhIaGhoeHh4WHhoiIh4eFh4eHhYaHhIKEg4SGhYeFhISEhISFhoaGhoaFh4WFh4WGhYaFhIOEg4OEh4GDgIKDhIKCgn+Ae31/fXx8fH59fH19fH17fHx7fHx9fXt7e318e359e3x/fX18fX1+fXx6ent7fHyIh4KGh4aGh4aGhYSFhoWFhYWEg4WChoSDiId/enqChYaEhoaFh4aEh4eIiIiHhoiKh4aHh4eIiYeFiIeFh4eGhoeHhYeGiIiHhoWHhoiGhoeEg4SEg4aGh4WFhISEhYaGhoaGhYaHhoaIhoaEhoWDg4ODgoOGgYN+goKDgIOCf398f39+fHx9f318fX18fnt7e3p7fHx8e3t7fnt7fXt6e358fHx8fX5/fXt6fHp8fImHg4aFhoWGhoWFhIWFhYWFhIOBhIGGhIKEhHyAhn+ChYWGhYWGhYSHh4iIiIaFiYqHhYeGh4eIh4WIhYaHiIaGh4eGh4aIiIeFhoeGh4WFiIOEhoWDhoaHhoWEg4WFhoaGhoaFhoaHhoeHhYOFhYOBgoKBg4WCg36BgoF/hIJ/fn5/fn98fH1/fXt9fXx+enp7eXt8fXt7e3t+fHx8fHp7fXx8fHx+fYF8e3t7e3x8iYeEhoSGhIaGhYSFhoWEhIOEgoCDgYaDgYJ/eoSMe4CEhYeGhoaEhIeIh4aHhYWHiYeEh4WGhoiGhYeEhoeIhoaIh4eHhoeIhoSGhoaHhYWIg4SFhIaGhoeFhYSDhYWGhoeGhoWGhoaFhoaEg4SFgoGCgYCEg4KCfYGBf36DgX5/f4B8f3x9fX59e359fH15enp5e3x9enp7e318fXx8enp9fHx9fH5+gHt7e3x+fXyIh4WGhYeEhoSFhYWFhYODgYOBgIKBhYJ/gH9/fXx7gYSFhoaEhYSEh4eGhoaFhIaJhoKGhIaGhoWFh4WHiIiGhYiHiYeGhoeFhIaFhYeFhIeDhIWEiIaGh4WFhIKFhYaFhoaHhIWGhoWFhoKDg4WAgIGAgIOAg4B8gYB+foKAfYB/gX2AfH1+fX57fn18e3l6enl6fX15enp7fHt8e3t6e319fH18f35+fHt7fX59fIiGhYaGhoSFhYSFhYSDgoGAgoGAgICDgX5+foB5en2Ag4SFh4WEg4OHhoOEhYSChYiFgoSDg4WFhYWGh4aIiIaFiIeJh4aFhYWDhoSFh4ODhoSEhYSHhoWGhYaEgoWFhoaGhoaEhYaGhIWFgoKDhH9+gICAgYCDgHyBf31+gn5+gH6Af399fX59f3t/fXt6eXp6eXp8fXl6ent7enx7e3t7fH19fXx/fn18fHx/fnx7h4WFhoaGhoSFhIWDhYKBgICAgYB+f4KCfX1/f3t/f4KDg4WGhYSDg4aDgYOEgoCFh4WCg4GBg4SEhYaGh4eHhYWIhomHhYSEhIKFg4SGgoOGhISGhIeGhoWFhoOEhYSFhoWGhISFhIWDhYSAgIKDf35/f39/gIN/fIB9fX+CfYCBfn6Bfn5+fX1/e398e3p5enp5ent8eXp6e3t7fHp7e3t8fX19fYB9fXx8fYB/fXyGg4aGhYaGg4SDhoKFgYGAf3+AgH5/gYF8fn9/foCAgoKChISDgoGChIGAg4KBgISFhIKBf4CCg4KEhYWHhoaEhYeFh4WGgoOCgoOCgoWBg4WEhYaEhoaGhoaFg4SEg4SFhYWDhIODhIKEhIB/goJ/fX5+fn5/hH57f3x8gIF9gYB9foN9fn59fX57fnt7enl7enl6ent5enp6e3t8enx8fHx+fn1/gXx9fHx9f4B+gIaEhYWEh4SEg4KGgoOAgYB+fn+AfX9/gnx9f35+fn+BgYKEg4KBgYKCf4CBgoCAgoWEgoB/gIGCgYKFhYeFhISGhoOFg4WBgoGBgoGCg4GChISEhYWGh4eGhYWDg4ODhIWFhIGDgYOChIODgH+AgX59fX5+fH6Dfnx+fHyBgX6Cf35/gnx/fn19fHx8e3t6enp6eXt5enp5enp6e3x5e317e35/f4GAfX99fX1/gICAhoSEhYSFgoSCgoSCgoCBgH59fn9+fn6AfX2Afn5+foGBgoODgoSHgYF+gICBf3+ChIOBf35/gIJ/goWEhYOCg4WFgoSBg4CBgIGAgYKBgIGEg4OGhYWHh4WEhIWCgoKDhYSCgYGBgYCFg4F/foB/fnx8fn18foN9e358fYB/gIN9fYCBf35/fXx8fH17e3p5enl5e3l6enl6ent7e3p7fXx8f3+BgoB+gH+AgH+AgIDKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzNzc3Nzc3Nzc3NzczMzMvLy8vLy8vLy8vLy8vLzMvLy8vLy8vLy8vLy8vMzMzMzM3Nzc7Oz8/Pz9DQ0NHR0dLS0tLS0tLT09PT0tLS0tLS0tPT09TU1NTU09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tLS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1dXV1NTU1NTT09PT09PT09PT09TU09PU1NTU1NTU1NTU09PT09PS0tLS0tPT09TU1NTU1NPT09LS0tLS0tLR0dHR0dPHhnNlYFtLWWdVTUZIQD03Nzg5Nzw8PDo8Oz42Oj04PDs6OTg3ODs7Oj87PTs8PD47P0E/QkJBQ0RFREE+PTw7QENDQUBDQ0FBR0hHSUtSwtXS09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXVysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMy8vLy8vLy8vLy8vLzMzMy8vLy8vLy8vLy8vLzMzMzc3Nzc3Oz8/P0NDQ0NHR0tLS0tLS09PT09PT09PT09PS09PT09TU1NTU1NTU09PT09PT09PT09PT09PT1NTU1NTU1NTT09PT09LS0tLS0tLT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1NTU1NPT09PT09PT09PU1NPT09TU1NTU1NTU1NPT09PS0tLS0tPT09PU1NTU1NTU09PT09PS0tLS0tLR0dHSzIxyZ2BcTVllUktHSz87Mzc4Ozg5Pj05PDpBOjs9Nzs8PDo6Nzg6Oz0/Oz88PTw/Pj9BPUFBPkNDREJAQT46Oz9DREFDRERCQklHSEhJTr7V0tPT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1crKy8vKysrKysrKy8vLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzMzMzMzMy8vLy8vMzMzMzMzMzMzLy8zMzMzMzMvLzMzMzc3Nzc3Ozs/P0NDQ0NDR0dLS0tLS09PT09PT09PU09PT09PT09TU1NXV1dTU1NTT09PU1NPT09PT09PT1NTU1NTU1NTU1NPT09PS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1tbV1dXV1dTU1NTT09PT09PT09PU1NTU09TU1NTU1NTU1NTT09PT0tLS0tLT09PU1NTU1NTU1NTU09PT09PT0tLS0tHR0s+Sd2hfXk9XZ01LRks9ODc2NTk5OTw+OT88Qzk7PDc5PD07OTc5Ojw9QDs+PT47PD48PT5BQD5EQ0NDP0E9Ojs+QkNFQ0NEQT9FSEpJSky61dPT09TU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8rKysvLy8vLy8vLy8zLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMzMzMzMzMzMzMzMzMzczMzMzMzMzMzMzMzMzMzc3Nzc3Ozs/Pz9DQ0NDQ0dHS0tPT09PT09PT09TU1NTT1NTU1NTU1NTV1dXU1NTU1NPU1NTU09PT09TU1NTU1dTU1NTV1dTU09PT09LS0tLS0tLS09PT09TU1dXV1dbW1dXV1dXV1tbW1tXV1dXV1NTU1NTT09PT09PT1NTU1NTU1NTU1NTU1NTU09PT09LS0tLT09PU1NTU1dXV1dTU1NTT09PT09PT0tLS0dHRmn5nYWJOVWpKSElLPzw6OTM3Njc2PTs+Oj06Ojo4ODo7Ozg4Ojs7PD46PT09Ojw/PD0/QkA/Q0RDRD5APT08QENEQ0JEQkQ+REhJSUtMttfT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3MzMzMzMzMzMzMzMzNzc3NzczMzMzMzMzMzMzMzc3Nzc3Ozs7Pz8/Q0NDQ0NHS0tLT09PT09PT1NTU1NTU1NTU1NTU1NTV1dXV1NTU1NPT1NTU1NTU1NTU1NTU1dXV1NXV1dXV1NTU09PT09PS0tLT09PT09PU1NXV1dbW1tXV1dbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1NTU1NTU1NXU1NTU1NTT09PT09PT09PU1NTU1dXV1dXV1dTU1NTU09PT09PS0tLR0p+DaV9kU1hsSEhIS0E9Nzg0NzY6Oj87RDw8Ojw8OTg6OTo6Ojs8Ojo7OT49Pjk9QDs/QUFCP0JCQUM9Pz8+PEBCRUNDQkBBO0ZJR01MSbLY09TU1NTU1NXV1dXV1dXV1dXW1tbW1tbV1dXW1svLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzM3Nzc3Nzc3Nzc3Ozc3NzczMzMzMzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc3Mzc3Nzs7Ozs7Pz8/P0NDQ0NHS0tLS09PT09PT09TU1NTU1NTU1NTU1NTV1NXV1dTU1NTU1NTU1NTU1NTV1NTU1dXV1dXV1dXV1dTU1NTU1NPT09PT09PT09PU1NXV1dbW1tbW1tbW1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTV1NTU1NXV1dXU1NTU1NTT09PT09PT1NTU1dXV1dXV1dXU1NTU1NTT09PT09LS0tSjiGxfZlJWakdIR0lBPjM2Njo7PDhDPEJBPjtBPDg5Ojw6Ojw8PDk8PTo7PD09PD89QD9AQT9AQUBCPD4+PzxCQ0NDRkBBQT1ISklOTUeu2NPU1NTV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbMzMvLy8vLy8vLy8vLy8vLy8vMzMzNzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzs7Ozs7Oz8/P0NDQ0NHR0dLS0tPT09PT09TU1NTU1NTU1NTU1NTU1NTV1dXV1dTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dXU1NTU1dXU0tPU1NTU1NTU1NTV1dbW1tbW1tbW1tbW1tbX19bW1tXV1dXV1dXV1dXV1dTU1NTU1dXV1dXV1dXU1NTU1NTU09PT09PT1NTU1NXV1dXV1dXV1dXV1NTU1NPT09PT0tLWroprY2VSWGhMSkdJQjg0OTQ6Ozo5QDk+Q0U/PDw5OTk9Oj07PDw6PTw7OTw9Ozs/PUA9PT5AQD9CQT5APD05QERDQkFBQj48SEpLTU9IqNnU1NXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbWzMzLy8vLy8vLy8vLy8vLy8rKy8vLzMzMzMzMzMzMzM3Nzc3Nzc7Ozs3Nzc3Nzc/Pz8/Pz8/Pz8/Pz9DQ0dHR0dHR0dHR0dHS0tHV2djY2NnZ2dra2tvb29vZ2dnZ2dna2tra2tra2tjW19fX19fX19jX19fX19jZ2NjY2NjY2NjZ2dnZ29zc3Nzc3Nzd3Nvb29za09LT09PT09TU1NTU1NbW1dXV1dXV1dXV1dXW1tbX1tbW1tbV1dXV1dXV1dXV1dTU1dXV1dXV1dXU1NTU1NTU1NTU09PU1NTU1NXV1dXW1dXV1dXV1dTU1NTT09PT09PS1bqKa2hoUlhlSUlMTkA5OTo0O0A8Nz05QUM9QD89ODo6Ozk9Oz4/Ojs8PDo7PDo7Pj1APT8/P0FAQUE/QTw8Oz5BRENBREA9PElJSk1ORqPa09TV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbW1szMz9DPz8/Pz8/Pz8/Pz8/W3t3d3t7e3t7e3t7e3t3S0NDQ0NDQ0NDQ0NDQ0ci5ubm5ubm5ubm5ubq6t6WkpKSkpKSkpKSkpKSnhmBjY2NjY2NjY2NkZGRlhIuKioqKioqKioqKioemuri4uLi4uLi4uLi4uLepp6enp6enp6enp6enqZeAgoKCgoKCgoGBgYGAj9LS0tLS0tLT09PS09PT3OPi4uLi4uLi4uLj4+Pi2NfX1tbW1tbW1tbV1dXV1dXV1dXV1dbW1dXV1dXV1dTU1NTU1NTU1NTV1dXV1dXW1dXV1dXV1dXV1NTU1NTT09PT09XDkXJsaU5TYkxMVk08Ojo3Nz5DPzg+Oj8/QTw/QDc7Ojs7PTs+Pjo7PD48Oz07PT8+QDw/Pz1AQEBBPj88PjxAQUVCQkZAQD9HSEpLUEae2tXV1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19fMzNDS0tLS0tLS0tLS0tLR3uzr6+rq6urq6urq6uvp1dLS0tLS0tLS0tLS0tTEqaqqqqqqqqqqqqqqq6aGhIWFhYWFhYWFhYWFik4MEhISEhISEhISEhIRE0pUU1NTU1NTU1NTU1NPg6ejo6Ojo6Ojo6Ojo6OghoSEhISEhISEhISEhIhnQERERERERENDQ0RDP1zT09LS0tLS0tLS0tLS0eDs6+vr6+vr6+vr6+vr6dnX19fX1tbW1tbW1tbW1dXV1dXV1dbW1tbV1dXV1dXV1dXV1dTU1NTV1dXV1dXW1tXV1dXV1dXV1dXU1NTU1NTU1NPUy5h3bGlKTl9NUlVNPjw8Nzs/Qz42Ojc+Pzs9QkA4PDo9Ozw6PD07PTs9Ozs9PD0+PT07QT08QUBBQT08Pzw7QEJDQURFPUFAQ0ZLS09GmNzV1dXV1dbW1tbW1tbW1tbW1tfX19fX19fX19fXzMzR0tLS0tLS0tLS0tLS0d3q6enp6enp6enq6unq6dXS0tLS0tLS0tLS0tLUxaqrq6urq6urq6urq6yoiIeHh4eHh4eHh4eHh41SEhgYGBgYGBgYGBgYFxpOWVdXV1dXV1dXV1dXU4WopKSkpKSkpKSkpKSloomHh4eHh4eHh4eHh4eKakZJSUlJSUlJSEhISENg0tPS0tLS0tLS0tLS0tHf6+rq6urq6urq6urq6unZ19jX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dXV1dXV1dXU1NTU1NTU1NGcenFpSlRdT1JVTkQ+Pzs/QEA4Ojs4PDw8PD46Ojs4Ozk5Ozw7Ojw5Ozs8Ozo9PT0+PUE/Pj8/Pj08PT88PEFBQ0FERTw+QEVGSktNRpPc1dXV1tbW1tbW1tbW1tbW1tfX19fX19fX19fX183N0NLS0tLS0tLS0dHR0dDc6Ofn5+fn5+fn5+fn5+bV0dLS0tLS0tLS0tLS08Wtrq6urq6urq6urq6vq46NjY2NjY2NjY2NjY2SXSInJycnJycoKCgoKCcpWmNiYWJhYmJiYmJiYl6MrKmpqampqampqampqaeQjo6Ojo6NjY2NjY2NkHNRVFRUVFRUVFRUVFVRatLT0tLS0tLS0tLS0tLS3+np6enp6enp6enp6enn2djY2NjY19fX19fX19fX19fX19bW1tfX19fW1tbW1tbV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbV1dXV1dXU1NTU1NTWo3txZElbYE5OVU9AQT89REI+Oz06OTs6PTw7PDs6OTg5OTs8Ozw8Ojo7PDo7QD08PTxAQTxBQTs7PEA/PD1CP0RDQ0U8PkJERkpMTEWN3NXV1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjNzc7Ozs7Ozs7Ozc3Nzc3Nzs/Pz8/Pz8/Pz9DQ0NDQz87Ozs7Ozs7Ozs7Ozs7NzMzMzMzMzMzMzMzMzMvJycrKysrKysrKysrKysfCw8PExMTExcXFxsbGxsvMy8zLzMzNzMzMzMzLz9HR0tLS0tLS0tLS0tLS0NDQ0NDPz8/Pz8/Pz8/NysrKysrKysvLysvMzMzT1NTV1dXV1dXW1dbW1tjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NfX19fX19fX1tfX19fX19bW1tbW1tbW1tXV1dXV1dXV1dbV1dbW1tbW1tbW1tXV1dXV1dTU1NTU169/cF5GXmJQUVdOR0ZDQ0lBPz07PDo8N0BBPD04Ojo4OTg7Pzs8PDs7PDw8PD87PD46Pj44PkI8Pj1BPjw+QkBERUNAPD5APkNJSUtEh9zV1tbW1tbW1tbW1tbX19fX19fX19jY2NjY2NjYzs3Nzc3Nzc3Nzc3NzdHNzc3NzczP09LSzs3P0s7Ozs7Ozs7O0dTPz87R0s7P0tTV1NDPz8/Pz8/Pz8/Pz8/P0NDQ0NDR0dHR0dHS09PU1NTU1dXV1tbW1tfW1tbX1tfX19fX19fX19bW1tbW1tbW1tbW1tbW1tfW1tbW1tbW1tXV1dXV1tfX19fX19fX19fX2NjX1tbW1tbX19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjX19fX19jY19fX1tbW1tbW1tbW1tbW1tbW1dbW1dbW1tbW1tbW1tbW1tXV1dXV1NTV1di4gm9XSl9jUlFaS0hBQTxCPT07Oj4+PD4/PT0/ODk6OTk3OD48PD47Ozw7PDs/PT0+OTs7OT0+P0A+QD07OkI/QkNCPz0+QD5CRUdKQoDc1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2M7Ozs7Ozs7Nzc3Nzsqfys3Nzc3QuYOEi8fTwJrLz87Ozs7O07udz8/TuJ7P0ZyChIrGz87Ozs7Ozs7Ozs7Oz8/Pz8/P0NDQ0NDQ0NDR0dHR0tLT09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbV1dXV1dbW1tbV1dXV1dXV1NTU1NXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NfX19fX1tbW1tbW1tbW1tbW1tXV1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXYwIBuVU9gY1dZW0xMQ0A9PTs9Ojw9Qj5CQkA8Ojg5ODo6Ojc7Pz4/PDw7PDo5Pzw8PTg5PD9BPj09PUFAPTtBQkBCQz47QD9BQUlHSkF629bW1tbW1tbX19fX19fX19jY2NjY2NnZ2djY2dnOzs7Ozs7Ozs7OzdKpj63Rzs7Ozpu3tqSiwJOerNPOzs7O0rWVm7PVspeZubqVuLmvodLOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0dHS0tLT09TU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dbW1tbW1tXV1dXV1dXU1dXV1dXV1dXW1tbW1tbW1tbW1tfX19fX19jX19fY2NjY2NjY2djY2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2dnY2NjZ2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV18h/b1pTYWVeXVxPSkQ9QD8+PDc6Pjk/RD5AOTg3ODk7Ozw4OT89PTw9PD47OkE7OTs5OzxDQDw7PT5AQT49QkQ/QkM9PT8+Pz5ISUg/ddrW1tbX19fX19fX19fX2NjY2NjZ2dnZ2dnZ2dnZzs7Ozs7Ozs7Ozs/Inrym0tDQzsqgl36Cw6abr6fUz8/Pz9GfoKqu1JyjqLLRkn1+r7DRzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dLS0tPT09TU1dXV1dXV1dXV1dXV1dbV1dXV1dXV1tbW1tbW1tbV1dXV1dXW1tbV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2djY2NjY2NnZ2dnZ2dnY2NjY2NfX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dbV1dXV1dfNiHNdWGloXl9gT0lGOkFAPj88PDk2P0I/Qjo2NDc6Ozo8Ojk+PD49PTs/PTxBPjw8Ojw8PTw6PEA9QEI+PkFCPUNDPT0+Oz9BRUtIQHDZ1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2c/Pz8/Pz87Ozs7SrKWnqdXAvNLHnY+ey9PJipmq1M/Pz8/RxYeasdXDhpq11dPNnp7D0M/Pz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0dHS0tLS09PT1NTU1dXV1dXV1dbW1tbW1dbW1tbW1tbV1tbW1tbW1tbW1dXV1dXV1dXW1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnY2NjY19fX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0JB1W1tqaWFeXVNOSTxDQEE+QD46OEVAP0M6NzQ5Ojo5Ozs4Oz0/Pj49QT08P0A9Pjw8PDw8Oj1AQD8/PT5CQD9AQkA8QD0+QUVLRz9r19fX19fX19fX2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnPz8/Pz8/Pz8/QzJ2Nl6zQmpfKxZ6ynpbN1q2ZqtTPz8/Pz9anmbHU1qOYtNTTwKCg0M/Pz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0dHS0tLT09PT1NTU1NXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX19fX19fY19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tKUcl5ea2tqZV1PTEc/RENDQDo9OzxCPD09OTY0Ojk5Ojo5Nzs/QDs8PUA8PEE+PD07PTw/PDo8Q0A+PTs9QD5CPkBBPkA9QD9GSUQ/ZtXX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2traz8/Pz8/Pz8/P07GigJuvyaCjv8qcpYynrdiqmarUz8/Pz8/UpJmx1NWimbTU1bCiqdTQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1NXV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dbW1tXW1tbW1tbV1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbSk3BgXnBoZmVaUUhHQkVDQEA3Ojo8Pjo8OTc2NTk6Njo8Ozc8QEA8Ojo9Ojw/Pj08OUA8PDo6OT9APT08PUBBQz9APz5BOz9ARkpCP2LS2NfX2NjY2NjY2NjY2dnZ2dnZ2tra29vb29vb28/Pz8/Pz8/P0M6fkGyclteqo9PSrqa1mJ/Vqpmq1M/Q0NDQ1KSZstXVopm11NSjobrU0dHR0NDQ0dHQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1dXV1dbW1tbX19bW1tbW1tbW1tbX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfW1tfX19jY2NfX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX1tbW1tbW1tbW1tbW1tbX19fX19fW1tbW1tbX0pNuYFxxZGdkWlVKQENHREFBODs/PD07PDw3NTU4OTY4Ozo5PDo+Pzw9PTk8Pz49Ojo+OTw6Ojg+Pzw9PTw+QEFDQT48PDpCRERKRkJd0NnX19jY2NjY2NjY2dnZ2dna2trb29vb29vb29vPz8/Pz8/Pz9G9n8O31pfA09HQ0srSzZeb1KqZq9XRz9DQ0NWkmrPV1aKattTNnp/J0tHR0dHR0dHR0dHR0NDR0dHR0dHR0tLT09PU1NTV1dXV1tbW1tfX19fX19bW1tbW1tfX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19fY2NjY2NjY2NjY2NjY2djZ2dnZ2dnZ2dnZ2dnZ2drZ2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fX19fX19fW1tfX1tbX19fX19fX19fX19bW19GSbF1cb2doYl1PRj9ISEZFQDw8Pj48PT08NzU2OTk2OTs6Ojs4QD86PDw5PD49Ozs6Pzk/Ojs5PT49Pjw7PTxAQ0I/Pz47Q0ZGR0hEWc3a2NjY2NjZ2dnZ2dnZ2dna2trb29vb29vb29vb0NDQz8/Pz8/Pz5V+e6WS1KKa08ySl6ObodirmavV0pem09DVpJqz1dajmrbXw5+g0tHR0dHR0dHR0dHR0dHR0dHR0tLS0tLS09PU1NTV1dXV1tbW19fX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tbX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2tnZ2dnZ2dnZ2djY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX1tfPjGRWXnBrXGBgTkVITUlJT0M+OkI9PUBCOzU1Nzw6Nzo7Ojo7OT09OTo6OT0+Pz07OT47PDo8Ozk+PD47PD0+QENCPz5BPEFDR0ZGRVXJ29jY2NnZ2dnZ2dnZ2dra2tvb29vb29zc3Nzc3NDQ0NDQ0M/Pz9DR1aeZrcmjqL7KnbGdo7XZqZup2LirocfS1qObsdbXopu02rKkptbS0tLS0tLS0tLS0tLR0dHS0tLT0tPT09PU1NTV1dbW1tbX19fX19fX19fX19fX19fX19fX19bW1tbW1tfX19fX19fW1tbW1tbW1tbX19fW1tbW1tbW1tbX19fX2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2djY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fX19fX19fX19fY2NfX19fX19fYzYZdV2JvZE9dVEtIRlNRS0xAPj1EPD9DRj01NTc7OTY6Ozo8PTo7Pzo6OTg6PT0/Pjs/Oz49Ojs5Pjs9PD0+QURCQD8+PzxAQUVHRURSxdvY2dnZ2dnZ2dnZ2tra2tvb29vb3Nzc3Nzc3NzQ0NDQ0NDQ0NDQ0NO5gL3Tm5bP1LWLkZ/T1LyBu9TOlKDT0dW1gsPT1bGDxta5g7/V0tLS0tLS0tLS0tLS0tLS0tLT09PT09PU1NXV1dbW1tfX19fX19fY2NjY19fX19fX19fX19fX19fW1tbX19fX19fW1tbW1tbW1tbW19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2tnZ2tra2tra2tra29ra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2NfX2ct+WlVqaltMX01KTEpVTEZCPDw/R0VHS0k9NjY3Ojk3OTo7Ojw9OT45OTo4Oz0+PkE+PTk8PDo9Pj47PTk5Oj9FQUA+PT8/QkBHRURFUMHc2dnZ2dnZ2dna2trb29vb29vb3Nzc3Nzc3dzc0NDQ0NDQ0NDQ0NDQ0cHR0crI0tDUxLjS0tHSwtLQ08fM0tHR0cPU0tLQw9XR0cLT0tLS0tLS09PT09PT09LS0tPT09PU1NTU1NXV1dbW1tfX19fX19fX2NjY2NjX19fX2NfX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29va2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2djY2NjX19fX19fY2NjY2NjY2NjY2NjY19rHd1xSZ2laTlpOTFBRV0VKPz8+PkFFTExBPjc3NTs4ODk5Ojs8Pjw+ODo6OTs+P0A9Pj46NTo6Oz0/Ojs5Ojw+QkJAPz8/P0FCR0RDRE683dnZ2dnZ2dna2tvb29vb29vb3Nzc3Nzc3d3d3dDR0dDQ0NDQ0NDQ0NDS0NDR0dDQ0dPU0dHR0dPR0dHS0tHR0tLU0tLS0tXT09PV0tLS0tPT09PT09PT09PT09PT09PU1NTU1dXV1dbW1tfX19fX2NjY2NjY2NjY2NfX19jY19fX19fX19fX19fX19fX19fX1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tvb2tra2tra2trZ2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2trZ2tra29ra2trZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjbwXNYVWlrU0xSTlBSWVRGSTw+Qz9BQkVLPj43ODY5Nzc4OTk7Oz0/QDw9ODk7Ozs/Pjw8OTU6PT47OTk7PD8/P0JCQT1BPUBBQkZCQkJLtd7Z2dra2tra2tvb29vb29vc3Nzc3Nzd3d3d3d3R0dHR0dHR0dHR0dDQ0NDQ0NDQ0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tPT09PT09PT09PT09PT09TU1NPT1NTU1NTU1NXV1dXV1dXW1tbX19fX2NjY2NjY2NjY2NjY19fY2NjX19fX19fX19fX19fX19fX19fX19fW1tbX19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2NjY2NjY3LxvVFRsbExLUkpUUlVLRkQ6PkdEREFERjw/ODk6OTY5OTo3PD07PkA9PTc5Ojs5Pjs5OTY2Oj1AQT47PDk6Pj9DQT4/Qj0+QkNFQkFCSrDe2dra2tvb29vb29vb29vc3Nzc3Nzd3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0tLS0tLS0tLS0tLS0tLS0tPT09PT09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1tbW1tbW19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19fW1tbW1tfW19fX19jY2NjY2NjZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2dnZ2dnY2Ny2a1NbcGtLVVdSXFFXSEQ+PEJKRT1ISj89PDc4ODo2OTg5Njs+PD1APDw1OTk8Oj87OTk0ODw9PUFBPD47Ojw+QD89PkE9PUNGR0I/Qkmq39ra29vb29vb29vb3Nzc3Nzc3N3d3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHS0M/U0M7P0tLT0tLS0tLS0tLS0tPT09TU1NTU1NTU1NTU1NTU1NTU1NTU1NTV1dXV1dXV1dbW1tbW19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19jY2NfX19fX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dndsGRTYXJfT1pUV19RUkdCPUVJS0FBTEQ/Pzs5ODg5Mzg2ODY5Pj0+Pz06Njo7Pjs9PTo5Njg6PTtAQDxAPz0/P0I+PD48PEJFSElCPkNJpODa29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3t7S0tLS0tLS0tLS0dHR0dHR0dPT0bm7zLqbnLrQyNPT0tLS09PT09PT09PU1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2NjZ2dra2tra2tra2tra2tra2tra2tra2tra29va2tra29va2tvb2tra2tra2tra2tra2trb29vb29va2tra2tra2tra2tra2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ3qpfVWBuW1VZUVpeT0xHQ0ZNSUZEREk7QUE7PDg4NjU4Njk4Nzw/QT89Ojc8Pz48Pz87OjY4OD09QEE9QD5BQD1AOjs6Pj1BRUdKQkBDR57h29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e0tLS0tLS0tLS0tLS0tLS0tO+wMqaoKKViJGeqpOpz9TT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fY2NjY2NnZ2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dna2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2tvb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2d6iXFVeblheXU5aUFROQ0NMSUlJRkpEPEFBPDs4NzY3OTc3OTk9P0E/PDo5QD88PkI/Ojg3NzY9P0BAPUBBPz88PTs7OD48P0VJSEE/Q0aX4dvb29zc3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3tPT09PT0tLS0tLS0tLS0tTIlZyum5m1iX2TjIKBhMTV09PT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tvb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dndmlpYYW5ZYVdPV01QRUJETElNS0ZJRT5CRDk4ODY3OTc1Njk4PT1BPjo4OT4+PD9APzw1Njc2PD4/PjtAQEA/Pj4/Pjs/PkFCRkdCQENIkeLb29zc3Nzc3d3d3d3d3d3d3d7e3t7e3t7f39/U09PT09PT09PT09LS0tLTz6h+kayPko6MhoCIiYSQo8rU09PT09PU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY19jY2NjY2NjY2NjY2NjX19fX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2tra29vb29ra2tra2tra2tna3JJaWWNuWlpSVV5QTDxAR05IUklIRT48SEY4OTc1Nzg3NTg5ODs+Pj07ODlBPj1AP0E+NzU5Njs+QUI/P0BAQUI/Pj8+QUBEQUZIQj9FSozi3Nzc3Nzc3d3d3d3d3d3e3t7e3t7f39/f39/f1NTU09PT09PT09PT09PWtaWaiIuQhYCFi4iBg4qLf4bC1tTU1NTU1NTV1dXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2dnZ2dna2dra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29ra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb2tra29uIWltnalxYTFpfVkg6TEhMSkpDREVDQExINzo3Njc4ODU4Nzg5PDw7Ozk4QD89Pj8/PDY3PDQ3P0JCQUBAPz8/QT09P0A+QEBGRT09REuI4tzc3Nzd3d3d3d7e3t7e3t7e3t/f39/f39/f39TU1NTU1NPT09PT09PUxZKCg4WGfYGCfXx5foGCg36k29bU1NTU1NTV1dXV1dXV1tbV1tbW1tbW1tfX19fX19fX19fX19fX19jY2NjY2NjZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vc3Nzc3Nvb29vb29vb29vb29vb2tra2tra29vb29zb29zb29vb29vb29vb29vb29vb29va2tvb29vb29vb29vb29vb29vb2tvZgFpebWhaU0ldW1hKRE1ISlNMR0ZBQD9KQjg7NjY5OTc1ODY4Ozo7Ojw5OD09O0A9Ozo2NTw3Oz1CQEFBPD49QEE9PEA/Pz5CREU+PERLg+Lc3d3d3d3d3t7e3t7e3t7f39/f39/f39/f39/V1dTU1NTU1NPT09PT2LKEkKh9g3l2hIh/e3d5gn5+i67A1dTU1NXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dna2trZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2trb2tra2tvb29vb29vb29vc3Nzc3Nzc29vb29vb29vb29vb29va2trb29vb29zc3Nzc3Nvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc1nlcWmxmWFJPYFFSQUhHSkZYTEZAQENDSz87Ozc4ODc2NTc2ODo5PDw6PTs/PTs9Pjw7ODg8OT0/QkFCQzw8P0FCPj1BQkNCREVDQDtDTH3h3d3d3d3e3t7e3t7e39/f39/f39/f39/g4ODg1dXV1NXU1NTU1NPU0ruen3WKeXuIgICChYGDcnOAhYOMrNfV1NXV1dXW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NnZ2dna2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra29vb29ra2trb3Nzc3Nzc29zc3Nzc3Nzc3Nzb29vb29vb29vb29rb29vb29vb29zc3Nzc3Nzc3Nvb29zc3Nzc3Nvb29vb29vb29vb29vc3Nzc3Nzc3Nvb29vb3dByXV9wZVdLUGNPS0JHQ0pIS0ZBPEE9SFBBOjo3Nzg3Njc4Nzw6OD09PD47QD88Pz07Ojs5Ojk8QEJAQkNAPUFAPz1AQkNDQUBAP0A7RU144N3d3d7e3t/f39/f39/f39/f3+Dg4ODg4ODg4NXV1dXV1dXV1NXU18h4i4V8goh6g4SBfoKCc2l0hYuGkJ3U1tXU1dbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tvb2tvb3Nzc3Nzc3Nvc3Nzc3Nzc3Nzc29zb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb297KalxjcWVST1heSz9HTElPS0VAPkFCP0lPPjk6NzY7NzY6Ozc7Ojg6PDw+Oz09Oz48Ojs4OTo4OUFCQkFAQDtAQj06PkFCQz8+PT4/PUZOdN/e3t7e3t7f39/f39/f4ODg4ODg4ODg4ODg4OHV1dXV1dXV1dXV1s6dhpl+f5OTin+CgXx9gnNxm4mAgoOJwNnat7TQ19bW1tbX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tra2tra2tra2tra29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NvfwGNaW21gVlBTU0pETEhNSEk8PkFEQ0ZORDw7OTc5OjY4Ozk3PDk4OTw9OzlAPjpBPzw3NTc7ODpAQUVBPz45PUI/Oz1CQkI6Pj07PT5GTnHe3t7e3t/f39/f39/g4ODg4ODg4ODg4OHh4eHh1tbW1tbW1tbV1tjLioCHhYOXjHh7e3lvfYF1a3ebdHZ7eInHxpiMrdjZ19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2drZ2dna2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tra29vb3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29zb29vb3Nzc3Nzc3Nzd3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3Nzc3Nzc4LdjV1lrYlJNVVFMSktGS0ZDQD5CQT9FTT4+PTg5OTo3OTo3NT03Nzo+PDs7Qjw5Pz05NjY4PTk6QEJGQD49PEBCREA9QD9DO0A9PD4/Rk9t3N/e3t/f3+Dg4ODg4ODg4ODg4OHh4eHh4eHh4dbW1tbW1tbW1tfVrYZ6d32rn3l4entzdH+Dfm9xe3l6c3t2k4qFgImkzdnY19fX2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tna2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29vb29vc3Nzc3N3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vc3Nzb3Nzc3Nzc3N3d3d3d3d3d3dzc3Nzc3Nzd3d3c3Nzc3Nzc3N3d3d3d3d3d3d3d3dzc3OGtYVtebGJSTVZMTUdLS0RGQkI7QT08RUxCQT44Ojk6Nzc5NjY6NTs+QDs9Oz89PD89Ojk5Ojw5PEVDRkA/PkBDQkQ9OT0/QT1CPz1APkdPadvf3t/f3+Dg4ODg4ODh4eHh4eHh4eHh4eHi4uLW1tbW1tbW1tfQmH+Qh4N9eoN2e3Vzenl6kKqmd3JyfoeHh4CAfoKEhJHJzNnX19jY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra29va2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2djY2NnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vb3Nzc3N3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzb29vb3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3dzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3NzhpV9UYm1iUE9TSUhHRkpJSUJBPkJCPEVFREA+ODo5Ozc3Ojc4ODY+Pz07PDk9PDo+PTs6Njc7NjpEQUY+Pz8/PkNBPzs9PT47REM/PjxIT2fZ4N/f3+Dg4ODg4eHh4eHh4eHh4eLi4uLi4uLi1tbW1tbW19jYyH52doN+fnR2eIaCenl1d5yhu6GEgoCAfoeKinx/gYaMnKjO2NjY2NjY2NjY2djY2NjZ2djY2NjY2dnZ2dra2tra2trb29rb29rb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3d3d3d3c35pbT2drXFBRUElDT0pLR0xHSkJAP0FHREBBPDg8ODg1ODk3Njc3QEA/Ozw5Pj04PTw8Ojc4PTk/RENGPkE/QkBDPzw6Pj0/PkVEPz07S1Fj1+Hf4ODg4ODh4eHh4eHh4uLi4uLi4uLi4uLj49bW1tbW19XB3LRueHJze3B6eXaFiIR7eH2AgZiljH98fnuRhZaLhoGDgY6Rvd3Z2NjY2NjZ2dnZ2dnZ2dnZ2dnY2dnZ2dna2tra2trb29va2tva2tra2trb29ra2tra2tnZ2dnZ2dnZ2dnZ2dna2trZ2dnZ2dra2tra2tnZ2dnZ2dna2tra2tra2tra2tra2tra2trb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t3d3d6NWFdobllQUUtISlNJTUhNSUtBQz9DRkJBRDo6PDg2NDg4NzY2Nj8+Pjo8OTw7Oj09PDw4Ozw8RERERT4/PkI+Qj84PT8/Q0NCQEE+O0xUY9Xh3+Dg4OHh4eHh4eLi4uLi4uLi4uLi4uPj4+PW1tbW1teslLZ6eHJvd5V7dHuLgHh1bn6Fg3t/hYhyfH2bnI6JioJ+g32Hk5rH1NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2trb29vb29vb29vb2tra2tra2tra2tra2tnZ2dnZ2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2trb2tra2tra2tra2trb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d7Zf1lgaGxcUUtHR09LTk5PTURGQkg/Q0hEREA6Ozs4NzU3Nzc4NThAPkA7PDk8Ozw+Ojk7OTk7OUZERUI8QD4/PEBDOz5AP0A/Qj8+OjtKVWPV4eDg4eHh4eHi4uLi4uLi4uLi4uPj4+Pj4+Pj1tbX19vKhYR3cXJubniVhHt4hH95dnB4c3eLkY6CdnN9ioaId3d1d4ODfIiIk8Pb2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2trb2tvb29vb29vb29vb29rb2tra2tra2tra2tra2tnZ2dnZ2dna2tra2tra2tra2trb2tra2tra2tra2tra2trb29vb29ra2trb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f0nVZaGlqVk5KSE1OR01EUElGSD9FPUZMREM+Ozs8OTc3OTY2OTU4Pj4/PTs8QDs9PDo3Ozc5OThHREVCPUE9Qj8+QDw/QUE/QEJAPjs8S1Ri1OLg4eHh4eLi4uLi4uLi4+Pj4+Pj4+Pj4+Pj49fX19fEknuJf29sbnV2foSBg4qGfnVybWVtiIaKjoR7c4OHint4e4OPj4GEioqxztrZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29zc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tvb2tvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3dzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f3t7e4clsW2pqalNOR0hOT0VIRk1JSUA7RD5ISUA9PDo6Ojg2ODo3Nzk0OD08PT07ODw8PDw4Njc4OTo6RUJFQT9APEI/Q0M+PkNEQUBAP0A8PUtRYdPj4OHh4uLi4uLi4uPj4+Pj4+Pj4+Pj4+Pj5OTX19fZqXaFfnx3bHB3eXh8jH2KhYB3anN0d3p9bot7fnl6foR/gIGDfnh8foeGlrbT2tnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra29ra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/e3uO9amFpa2lRTkZNTEtKWE1OR0FAQE9BRD9AOzw4OTk5Njg2NjY4NDs+PD07OTY6Ojk6OTU4OTg5OkJERj8+Pj5AQEBCPzxBQD88Pj9BOT5KT17S4+Hh4eLi4uLi4+Pj4+Pj4+Pj4+Pj4+Tk5OTk19fX2sqKhIB5c29tcXN1d4CUeHaAfHWHhXd1cnWgmXp7d3Z5doR0bWxue3iAmouTu9za2tra2tra2trb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc29vb29vb2tra2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f397js2lpbmloUFBPTExPUk9LU0Y/RURERD48PDg7ODc5OTU2ODY2NzM6Pjs+PTc6Pjk5OTk2Ojo4NzxDRUc/Pzs/PkA9PkE9Oz0+OUFAQDhBTlFc0OTh4eLi4uLj4+Pj4+Pj4+Pj4+Pk5OTk5OTk5NjY2NjauY6AenZ1bmpveHCBfWt0cnZ3hIV5h4d5lY55eXp1d3pza298gHx2fYh8gLLe2tra2tvb29vb29vb29vc3Nzc3Nzc3Nzc3dzc3Nzc3Nzc3Nzb29vb29rb29vb29ra2tra2tra2tra29va29vb29vb29vb29zc3Nzb29vb29vb29vb29vc3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3t7e3t7e3d7e3t3d3t7e3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/f39/f4qpqa2hrZFNQT0ZQVFJOSFJLPkREQ0I7Ozk6Ojg2Nzg1NjY4ODg0Oz88Pzw5PDw3Ozo6Nzo6Nzo9Q0JDPUE+Pzw5PT5BQDs8PDtFQD47Q05TXNDk4eLi4uLj4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTY2NjZ1p5vdntveHh2cG50d3BwdHBzb36Jc3qGhY2EenNtcoB6hn1vg5OBdnx9g4a13drb29vc29vc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29ra2tra2tvb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4N/f3+KgbWhma2ZVVlJHUFFOS0xMRUJIRUc9OD08Ojo3Nzg2Nzc2NTY3NDg+PD09Ojg6OD46Ozc4Nzc6Oj5DRDtDQj49OD1AQUM/Pjw+RTw+PUJNUF/S4+Hi4uLj4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk2NjY3MB2doCCfnp4eHBsdXlya399bHNvdGdoaYB/aWl4c2d+iYl4cIKGe3d9foWKvN3b3Nzc3Nzc3Nzc3Nzc3Nzc3d3c3Nzc3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODflGttZm5mU1NJUFlUTEhGTkZGRUJGPTs+PDs5Nzc4NTc5NjQ1NzU4PDs9Pjo6OztAOTs7ODc6OTlAQkE8QUE/Pzk/QEJFQ0FAQEM7Oz1ES01g1uTi4uLi4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk5NnZ2tmYc3uqhJaCcnR1dn14aGx8d2h4d25rcHR5gIJ3dHyBhIJ9c3CAin94gn95g8je29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f4N/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh24tubWdzY1lRTVVbV0hDSUZOS0dCRD8/Qjo7OjY2NzU2NzY0ODc2Ozw7Pj86PDk8Qjg3OTo6Ojk6QUFCQUJDQEE+PT9CQ0NEQUJGOTg9REpOYtjk4uLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXZ2drcqHGCtXiRfnNsem6EgXaCfWtoan+DeHZ8dX2FhXRmcHl9d316gIqFe318foC03tzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3dzc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3Nzd3d3d3d3d3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e397e3t7e39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4ODg4ODg4tiFb3FrdWFWT1VVXE9ETUY+SkdKRUQ8P0I6PDk4Njg0NTY3NDc2NDk7Ozw7OD47PEE4ODo9OD04Oj09QEBAP0FCP0A+QENCQ0FBRTc2O0RMTmPa5OLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXl29ra3Z5sbnNxhY1ybXBuf391hH5rcnZ2enN4gXhzbnVwbWt2fHmFiIB/f392coODsd/c3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eDg4eHh4eHh4eHh4OLXhW1xb3ZeUldTWlpRSkhDQFFAQkQ8OT9BOjw5NzU3NDU2NjQ3NTY9PDo9PTk+OjxAODo6PDY7OTs+PUJCQjtBQkBDQEBEREM8PUA3OjxFS01l3OPi4uPj4+Pj5OTk5OTk5OTk5OTk5OXl5eXl5dPOxsB+cWxveHt2b3VuanNzbZKGeG50dG5vdIZ/b2twboJ0bXZyfY2DdnF/d3mKgabf3Nzc3d3d3d3d3d3e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3dzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t/f3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi1oZucG1xYFJZUFdfWUpMTElSP0Q9OTtCRjs6OTc0NTY1NzU0NjY2Pj07Pz45PTk7Pjg9Ozo0ODtAQENCQ0FCRkE/Q0BBQkREOz0+OTs8QkxNZODl4+Pk5OTj4+Tk5OTk5OTk5OTk5eXl5eXl5eW5t7Woc3JscHd6dHd4bXFydXd/hHRyc2xsa3F8bnBudGuBf3GAd32Eg355gHNygYqg2d3c3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh49WHcWxqbF5YWlVXYFZWUE9QTD1BOjs8RkE4Ojg3MzY1Njk2NTg1Nz89Oz8+OT04Ozw5PTs7NTo9Q0JCPENDREREQUE/PkJDQzw9Pjg5PENLS2PN0dnh1sjY4+Tk5OTk5OTk5OTk5eXl5eXl5eXltbW2q3J5cm59f3Z1d2hqaGlwb3Zta2tnZWZxdG15gG5teXd2iHhxa2podXV5dHV/wd/c3d3d3d3d3d3e3t7e3d3d3d7d3d3d3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHi4uHh4ePVhnFwY2lhV1NZV19MUk9STUtAPjg5O0E+ODc5NjQ3Njc6NjY2NDk+Pzo8Pzo/OTo6Nzo9PDk5PEFBPTtBQ0VDRkA+Pj5BRUQ+QEE3OD5GSEpesrW4wbm1u8jg5eXl5OTl5OXl5+fn5+fm5ebm5ra2tbWOfX5weoR1cnZnYmNlbGtyb2ZpbHZtd4Z9hXlsbHd4a3ZwfH14c3V5fHd2h7ng3d3d3d3d3d7e3t7e3t7d3t7e3t7d3d3d3d3d3t7e3t7d3t7e3t7e3t3d3d3d3d3d3d7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4eHj1Yd1bl5uY1pUU1hXS1NLSk1SR0E4Ozs+PDk4NzU2NTY2OTY4NjY5Pzw6PT07Pzo7Ozk8PDs5Oj4+Pjs8PUFEQkNBQEBBP0JDPDw9Nzs+REVKXrG1tLW2t7e2y9rJ3uXl3eDi3tXU1tPU4OPg39+2treuh3t/bnmNenJ1bWNobGxtaXR4enF5enqIh4N6aWh9cWRvcXyGgX55e318e4an2t7d3d3d3d7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4uHh49aGdmxhb19dV1lcWlJQSEpXTEVHPUA9Ozs9OTY0NjU1NTg2NzY3OD87OT09PDw5OTw6Pjw6OTg+Qjs7Pj5AREBDRUFAQD0/QDw9PTU5PEJHRl2xtbW2uLm5ubq9uMPT0r3BwcC6u7y6u8TMxb/Dt7e3hGl1gX1ndYd5Z3Vxa2t5eHB3fH15bWl3e3h3bml1j4FwbHl4d3d9gXuGgnmAoNze3d3d3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODh4OHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4ePXhXJrZ3RhW1hYX15TVVVRVUpMRj9JRDs5PTY2NDc3NTc4Nzc3ODk8PDo+PDg8Oj0+OTs8OTs5P0E8PT9DP0FARUJCQTw9Q0A6Pjw1NDlER0dasbW1tre5ubm5ubm3ubm4uLm5urq6urm5urm6u7e3uX9ucHN6b3B/eXNuc3Vsc3Z4cXFwb2tvcX6Bc2mHhIF9dHOHdW11hYmBgHJ2hafd3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uHj14lxa2xyW1dXXWBUUVVUUFJPSkNATUE9Ozk2NTM0NjQ2ODc3Nzk6Pjs8Pjs5PDo8PDk8PTw7PT0+PUNEREBDQkE/QD48PkE8OD06NjY6QkpIWLG1tLa2uLm5uLi5uLe3uLi5urq5ubi4uLi6uru3uKx7cnhxf3ZzfnBsbXpyZ29sbW50cHt3d3Jyd3pvhpJ2f3x8enZ5fH9zfYdyda3T393d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4eHh4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi49eHb2pxalVWV2FbT1FSUE5XSURESUo/Ojk6NzUzNDk1NzY2Nzg4Ojw7PD46PDo6PTw5PDw9Oz09PDs9REdEQ0E8PDw8Pj5AOzg8ODE1OkFGRVautbW1tre4uLm4uLi4uLe4ubq5uLi3t7i4ubq7t7mqcnB4d3x7e4J3aG5xam9qY2lyf21zcn54dHFsanaAeX2AgH91doB1a4qLgHaR1d/d3d7e39/f3t/f3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f4N/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLi4uPYhm1sdGVWUFxnWE1YU1JRWUVDS1BOOzk4ODc1NTM5NTY2NzY4Nzk+OT0+OTw5OTw7Njg5OTo8QEA9PkBGQEJCQDo+PEE9Pzs7OzYxNjxCR0RQqLa1tba2tre4t7i4uLi4uLm6ubi4t7e3t7e5ure2tIlyd3h9iXxwem99c2hqbGdnbHRscXd0cWx2c3Fxd3FyfHl4g3Z7d2mLkYp9kM7f3d7e3tvY2drZ297f39/e3+De39/f3Nvc3N3e3uDg3+Dg4ODf3t7e39jS397f397e3t/f3t7f3t/f3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLi4eLi4uLi4uLi4uLi4uLj4+Lj4+Li4uPj4+Pi4uLi4+Lk14NoZ3VkVlVkZVdKWllXW1Q9RU1LSD04NzU3NjQzOTQ0Nzc1Njc5PTo9Pjw9PDk7PDk5Oj45PD4/PkFBQ0FFRUQ+OzxBPjw5PDs3Mzc+REhFSqG2tbW1tbW2tre4uLi4t7e4uLi3tra2tra3uLm2traLfXpsbHp/cGx5dm5qaGdlcXp4b2lvb3B1c21zd4Fnb32CgYNyf3lqcHJ6f6ng393Zy8a/vb6/vsLN0tDW3tnc4NfQzcPCw8PH1dfT2dzX1NjX0MfExce9vM/Kz87Y3djO3N3c2t3T0dze39/e397e3t7e4N/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eLi4uLi4uLf4uPi4eLg4d7W29/Sw8rJx9Hb3OLk4eHg2dre1sbExcTN2trf5OHi4trX3st9aWZxYVleZWFNTFRLUlpMO0hNSEZBPTc2NjUzNDY2NDg3NjU2OTw7Pj46Pjk5PDk3OTs7Oj49PEBAQ0RCR0ZCQT08Q0A9OTw7Nzc3P0RGRkaZtrS1tbW2tra4uLi4uLi3uLi3s7W2t7a3t7i5tba3opdxb29waW50dnFmZWNrbmdvcm1mZ2tygWVvdnyAeGRzj39zaHFyaWVlbm+w39HFv7u5ubm5ubq6uru6vc3Gw8e/urq6uru7u8HCvcHFvby/vry7urq5ubq6ubm6w8XDucDDwby/ube/z8/U3tjc3t/g3tLa4N/f4ODg39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eDg4ODg4ODg4ODh4eHh4uLi4eDh4uLi4uHa2t3RwsPCu8XT1uDdydPDrrnAsaqrq6uwtLbJ0sXRxLG4v7Srq6usr7S0vMzE1c60tLureGxtbWBdYl9ZS1NVVFFQREBRTUhEPzo3ODU3MzE1NjQ5ODQ2Njo8Oz08ODw5Njo6ODg5NzU8PDw/QEFAQkRDQkE8PkI/Pz09PTc1OD5DRUNAj7a0tLW1t7i4uLi4uLm5uLe1sautr7Oxs7OztLS0tqaei2tue3ZxeXhnY2hfcXdha25vaG99b25ja2lseHdsa4Z+bHB6dm1scG95sca8uru7urm5ubq6urq6urq6urm6urq6urq7u7q7u7y7urq6ubq7u7q6urq6urq6ubi3t7i4t7e2tbW1tbi3u8e+w8XHzcS4wMnH0tzZ2d/e3uDf39/f4ODh4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh3Nji4uLi4eHh4OHg3tfGxtHQztTe3tPO0t/SuLi8sq2trKysrrG+ua63rKipqamqq6urqqqqq6ysuKyqqqqrq6urra6urq6urryzrayrpHlub21fXl1dVE1SU1xUSkE/UElIPjg5NjgzNzMwNTczNzg1NzY2Ojw/PDg5Ozo6Ojg5OjY1OTs8Pj9EP0NFQkNCP0BAQT9APjw3ODc6QUVEP4W4tLS1tbe4uLm5uLi3t7SurKuqqq2urq6vsLGzs7WjcG5ucm1wg311aWFlaGZkY2Rxc21td25naW1tZXBzb29zcXN8h4F6dX11n7u6uru7urm5ubm6urq6urq6ubq6urq5uLm5ubm6urq6u7q5ubm5ubq6ubm6ubm4uLi3t7e4uLe3t7a2tbW2tra1tbW1tba1t7e3t7rBvrzGycrb3+Dg3tvd3d7h4tDW4uHg4ODg4ODg4ODg4ODg4OHg4OHi0768zNjd3OLg0dnbxL23sLCxsa+zu7uzsLS9s66urq2tra2sq6qqqqmpqKmpqampqqurqqqqqamoqampqampqaqqqqytrq6urq6urq6sraR4aWJxZmFZWlZRUk5cU0Y9QlJEQTc8OzY5NTY1NDU2NTg3NTY1Nzg7Pjw7OTk5Ojg3Nzk3Njg8Oz47RD8/Q0BBREE+P0M9Pjw+Ojo3Nz9DRj54srCztLW2t7i3trKurq2sq6uqqaqtraysrq+xs7S1t4xucnRqaIB5ZmpmZWxdaG5waGxxYmNmcoJ+dmhobGpueoaBhXx4cXF5gK+6ubq6urm5uLm5ubm5ubm5ubm5ubm4uLe3t7e3uLm5ubm5uLe3t7i5ubi4uLi3t7a2tre3t7e3tra2trW0tLW1tbW2trW1tre3t7e3t7e3tre4v8bP0MS+v8DE19e8ydra4OHg4ODh4eDg4ODh4eDb3t7Uzby3tre6wMDJxLfIvrKwsLCwr7Cvrq6ur7Cwr66urq6uraytrKurq6qpqampqampqampqKmpqKmpqampqKmpqKmpqqqrraytra2ur66trK2heWpjbWdiXFhRUFFLVEpCOklRP0E3PDk0OjU2NTQ1NTY4ODY4Njs6OTw9PTs6ODY2ODg6ODY3Pj09PT5BQUVCQkNBQUBBOj09Pz05Ojc9QUc8bKqmqKutsLGwrqupqKqrq6mpqamrrKytra2usLO0tbilgIdvaWdzdGZrcG1qZGxvcm5rbWNrcHyJhG5qbHx4Y3uKfnNqc25rcY+7ubm5ubm5ubi4ubm5ubm5ubq5uLi4t7e3t7e3t7i5ubi4uLe2tra3t7e3t7a2t7a2tra3tra2tbW1tba1tLS0tbW1tra2tra3t7e3t7i4uLe2t7a2uLm4uLe3uL6+uLq9vcfb4OHg2Nnd4eHg3dfKwcPCurm5uLe4uLi3tbS0tLKysbGxsLCvr6+vr6+vr6+vr66ura2srKyrq6yqqqmoqKmppqepqaehpaipqamoop+hoZyip6inqausrK2ur7Cwrq2unXdwbGphY2BZUU1RTFJGQzlNUEU+ODs3Mjc5Njc0NDM1ODg3OTc7OTo9PTw6Ojk3NDo5ODY1OD8/QEI9RENDQ0FDQEJBQDtAP0A/PDw6O0NIPWOopaWlpqioqKenp6ipqqmoqKipqqqsra6wsLCztLW1taWYdn5xZmt4cW9tZmVsaGNsZ2ZpaX11bWlvfXZ5hWZod294b3Fvcninu7m5ubm5ubm4uLm6ubm5ubm5ubi3t7W1tba2tre3t7e3t7a2tba2tre2tbW1tra3t7e2tbS0tLS0tLS1tLS0tLW1tba2tra2t7e3t7e3t7a2tre2tre3uLe2t7i4t7i4uLi4wMXTyry8w83PyMC9urm5ubq6ubi4uLi4t7W0tLSzs7KysrGwr6+vr66urq+vr6+uraysrKurrKysq6ehoJ6gn5udoaGdlpmkpKaon5mZmZmanZ+gn56fpKqtrq+ura2srJl1cGlrY2FeXVVOU0tSREQ4TktHQTo4NTI2OTY1NDczNzc3ODk3OTo7PT0+ODg4NzU6OTk1OD9AQEFEPkZBQkNAQkNCQT88QEJCQD0+OjpERj5cpqWmpqampqanqKenqKioqKenqaurrKytra2ttLS0tbekc311bnONf3JmanFjaW1jaGZobG51aV9jZ3VzdnpuZ3Bwcn56cYihu7m5ubm6urq6urm2s7a1uLm2trW1tra1tbW1tbW3tra3tra2tbW2tbW1tbS0tLa2t7e3tbS0s7O0tLW1tLS0tbW1tra2tra2t7e3uLe3tra2trW2tbW2tra2tra2tra3tra3uLi3uri4uLe3t7i5ubm5urq6urm4t7e3t7W1tLS0s7OysrKxsbCwr66urq6urq+vra2srKuppaSmpqScmZubmpmampmXl5eXl5aZm5iZmJmZm52en5+dnJ6gpKWko6OioqKQdG5jcGFeXltUU1RIVEo/PFFCRkM7ODYzNzo1NTQ4Mzg5OTc4OTc7OTs9Ozc6NzU2OTk4NTg+Pz9ART5CPz9DPzxBQUI/PT9EQT8+PTk9Q0Y/VaSlpqanqKeoqamop6ioqKioqKiqrKuqqaipq7W1tba5o3eKcXKHhnd0cGh5a2JjYWVsaW5zal9jZWNjZWprYmRqbHaXjX6ovbm3tre5u7u6uLWxrKurqq6wrKyrq62tq6uvsLGvr7CytbW2t7W1trW1tbW1tbW2trSvr7O0tLSvra6vsrW0tbW1tbW2t7e3t7e3t7e3t7e3t7Owsra1tLa2tre3tra2tbW1tra3t7e5uLi4t7e3uLi4ubq6urq5uLi3t7e1tbS0tLS0tLS0s7OysbCvr6+vr66vr62oo6KgnJqampqZmZqbm5qampqbmpmZmZiXl5aYmZmZmpycnZ+foJ+goKChoaCgoJ+fi3RuaXRdYGZeUlRLRFRJPUVTSEVCOzo0NDY5NDQ1NzM4ODg3ODk5Ojs7Pz04OjkzNTg5NjM5PT5AP0A6QEJCQkA/QEJCPz0+QUFCPz06PkVDQFGjpqWlp6inqauqqKaoqKipp6ioqKinp6ioqaq1tbe3t7KZtH99kIx1Z2lqbGZjYGNoZW94cGlicXx5cGpmZmRma3NqhYystrKwra2ttLeysLCtrKuqqaiop6ipqampqKinqKipqaeoqqurra2sqqytraysrq6traunpaSnqqyopKOkpamwsbGztbW2t7i3t7W1tre4t7e3t7Kppaasq6ivtLa1s7W3t7a1tbW2tra3t7e4t7a2t7e3t7m6urq5uLi3t7Wxs7S0tLKxsK6sq6yurrCxsK2rqqmqqKijnJqZmJmYmJiYmZmZmZmZmpqZm5ubnJybmZeYmpqcnJydnJ2foKGhoqKioKGgoKCfnop1amtuWVxhVktPREdVRz5PV0hEPTw4MzQ0ODQ1NDgyODk4ODk6Ojw5OUA8Njk6MzY3OTE0PD8/QEBBOkNGRUJBREJDQTo7P0FCQz9APUBEQ0BPo6empaemqKqqqqakpqenqKioqKimpqaoq6uttba3t7e4rbJ1cHuDdmBiaWtiZWZhZGdmfYh5bHKAfXFvcXhjbW5xZo+srKurq6ysra6urK2trKyqp6WmpaWlpqioqKiopaeoqKioqKeoqKmqp6Wko6KioqOioKKioaGhoKChoaKjpKOjpaWmqLC0s7OzsKuqqaqztLa3trGopaOioaGipKiqqairs7Sxrq6xs7W2tra3uLi3tre3t7e3t7a2uLe0sa6ppqerrKmnpqWkpKSkpKWnqaajoJ+enZycm5uampmZmJeXmZmZmJiZmpqampqampqbm5mYmpydnZ2dnZucoKGgoaOjoqCgoKCfnp2FdGtsaFdYU0pHTUVITUdAU1dGRz09OTM2Mzc0NTU3Mzg6Ojo6OTw9OjpBPDY9ODM3ODgzNztAPz9AQDpCRUNAQkRDQT87PEBDQkNBQDxBQ0A9TqKnpqanp6mqq6mkpaWlpaaoqKippqanqKmpqrW2tre3t7izc2h7c2JnamtpaWJhZGloXV1tfHJma3J/fHR8bm1zc36gqamrq6uqq62trKusq6mpqKWjpKampqWmp6eqqaamp6enqKinp6iop6WkpKKhoaGhn56en5+fn56foKGho6Wko6OkpKSmp6enpqWkpaampqeqraumpKKhoaChpKalpaempaeoqKalpaivtLa3trW1tra1tbOwrKupqa6rqKWlpqampaSkpaWlpqWkpKSkpaKhoaGgnp2bm5ucm5qamZiXmJiYmJiZmpmZmZmYmZmZmZqZmZydnJycnJybnJ+fn6ChoaKgoKCfnZ2cgHNrbmReU0pITUZETEtFRFFTQ0c9PDgzNjI4NDY0NjQ4OTg6Ozk7Pjw5PTs5PTczNTk2NTY8QD0/QD88P0JDPkJCQj89Pj5CQ0FFQD86PkVAO0+jpqWkpqeoqaelpKWlpKWnp6eoqKanp6alpqa1tba2trW2uYptcW1vfHxxZ2pmYGFsYFROW2hqbm9tgYJ9cWdxdn6aqKeoqqmpq6urrKqqqqimpaWkoqOlpqalpaWmqaqppqWjpKWmpqSko6Kio6Khn5+fnp6cnJycnJ2dnJ2en6CioaKjo6KhoqKkpaSioqOjpKSjpKSko6Ggn6GipKanp6ipqaelpaSipKSlqK2wsKyrqqusqqmnpaWmpaWlpaalpqioqailpaWkpKSlpKOjpKOioaGhoqKgnp2cnJubm5qZmJiYmJmam5mXl5eWlpeXmJiZmpqcm5qampubm5ucnJ6goKGgnp6enpycm356bnJiXlNNSlBFRk5NQkBPRT5JOz01MzYzODM2Njc1Ojs4OTs5Oj49Ozo5OT43NjY5NjU2PkI+PkE/PT5DQT5DQ0BAO0BAQkJCRUA+Oz5FPzxQoKSjpKOjo6SkoqSlpaSlpqamp6empqalpqaltLW1tbS0tbiBaHx9ZXOCemxwdWFfY1ROT1FbaGxpbGxxbW5xbnScoqSnqKioqauqqqqqqaempaSjo6OjpKSlpqalp6ytqaShnp2epKShn56foKCdnJ2dnJycmpqam5ucnJubm5ydnp6foKCgoJ+goaOioKGjpKSjoqSlpaWkop+go6SkpKapqainpaGdnJ+jpaipqainqKioqaempaWkpKSlpqampqampqenpaWko6Ojo6KioqGhoqKhoqOkop+enZ2cmpubmpqZmJeXmJaWlZSUlJWVl5iYmpubnJuampqam5ucm5ucnp+fnpucnJyam5p/fnF0YFtUTUdNSEZMSj8/TkM8QDs8NDM4Mzc0NzY3ODs9ODo6OTk7PTs7ODk+Njc4OTU4OD9APT9BPjs9RD89REA/PzpAQUE/QUVAPjw8Qz88Tp2ioaKioKCipaSkpKWlpqenp6empqampaampbW1tbS0tLS3jHalsXdmc3Jvc2xjZGlYT1JRT09dgG1kYFptkZGSoqKjpaampqenqKiop6alpaOioaGhoaKjpaempqesq6emoJ2cm6Ghnpubmp2cmZiam5qampmZmZubm5uampqampucnZ6goaCfnp+hoJ6foqOko6Omp6inqKWioKGhoaGkpaWlpKCcmZmbnqOmpqampqanpqempaOlpKWlpqiop6enpaWlpaWkpKOjo6KhoqKioqKhoaKjo6Kgn56enZybnJubmZaUlJSTk5OTk5SUlJWWl5qam5ubm5qZmZqanJ2dnZ2dnZuampqamZqXf3dvc11aTkhKTkdFRklERU5APD09PDQ1OzQ2NDY1Njc5Ozg5OTg5OTw7PDc6Ozc4ODg1ODg/Qj9BQTw+P0A8PEJAQT49QT4/Pz1CQUA6OkA8PE+doqGfoJ+dn6OkpKSlpqeoqKenp6ampqampqW1tLS0tLS0tbSXtqd1Znh2Y2xjY2VjW1JTU1JNXqCMeFhodpajnp6hoaOjo6OjpKSlpqalpKSioaGko6OjoqOlpqamp6enp5+bmpuioJqWl5Wam5qXl5iZmpqYmJqampqbm5qZmZmenZ2goqOjo6KkpKWinqGhoaKjpaampaSjoaCgn5+hoZ+goJ2amJiZmpygpKOjpKWmp6alpaOjpKSkpKWnp6ampqampaWmpKOjo6SjoqKjpKGfoKGhoKGgoaCfn56dnZyamJeVk5KSkpKSkpOTkpOUlZaZmpqbm5qampqbnZ6enp2cnJybm5qamZmZlH10bHReWk9IRUdGQkVORT9GOzo+Pzs0Njo2OTM2NDY4ODo4OTc4ODo8Ozw5Ozs6OjY3ODk5Pj9APjw9QD5AOjlAQT89QT8/QUE+QUE/Ojk9PjpQnaCfnJucnJufoqOlpaWlp6iop6ampqanpqantLS0tLOysrGwsK2rkHiGj36bmn93Yl1TUlFRTGKgootaiKCgn52YmZycnZ2eoaGgpKenpqWkoqGjp6alpaOipaampqanpqagm5mboaCXkpOSl5qcmpeXl5iampmampqam5qYmJmaoKCgoKGfoaKipKamop6gn5+goaOko6Khn56enpyanZuZmpqZmJeZnqChoaKioqKkpaWmpKSkpKKioqKkpaWlpaWlpaalpaOko6KioqGgoKGgnp+fn5+fnp+foJ+cm5qZl5WUlJSTkZCRkpKSkpKSk5SVl5iZmpmZmpqam5+fnp2cnJycmpmZmpiXl5F8cmdxXl1QRj9BRD9KT0JCRjhDRT4+OTg7Nzc0ODQ1OTo6Ozk3OTo8Ozo8PT48PDo2NzY5OD4/QT47Pz49PDg6PkFAQUE/P0FCP0RBPjo4PkE8U5ycm5uampycnaGio6KjoqSmp6alpaampqSjo7KysK2rp6amp6alpqiln6iop6qnoXmEXFFST0xcnKCAYpmgnp2clZOVlpeZmp2dnqGmpqampKOioqanp6ajpaampaWnp6amop6cn6Gfl5GQkJSXm52YlpeWmJuZmpqampqZl5iam6Ghn56fnZybnJ6goJ6dn56fn6Cio6SjoqCfnp2ZlpeXl5iYmZubnqKioqKioqGio6WlpKOio6SioaGhoqOkpKSko6SkpKSioqKhoqGgoJ+gnp2enp2dnZ2dnp6em5mYl5WTk5SUk5KQj5GSkZKSkZKTlJaXl5iYmZqampyenZ2dnJubmpiYmpmXlZaNempmamBiTkY+P0A9SkVAQ0A7QEE8Ozs5Ojc2Njg0Njc4OT04ODs6Oz87Ojs8Ojk6Nzc2ODs8Oz08Ojo8PTw3Oz5DQkRDPz1BQ0BEQT88OkBCO1eZmJqamZmam5ucnp2foqKhoqSlpKSlpqSioJ6op6alpqWlpaemp6ampqakpaanqKehqXJOUU1KVJahenKanJyenJeVlJWWmJiXl5qeoqKhoqOkpKOjpqalpKanpqWlpqalpaOgoKGhoJmSj46Wm5menJaXl5eZm5ycnJqamZeZm5uen52cnZyZmZqcnZydnp6fn5+hoaCgoaKgn56bmJWVlZeanZ2fn6GhoqKio6OhoaCgoJ2cnaGioqOkpKOioaSlpKOko6SjoqKioqKhoaGfn52cnZ2cnJ2dnJ2enpqXlpaVlJOTkpKSkpCRkpKSkpGSlJWWl5iYmJiam5ycnJycnJ2cm5mYmZiWlJWXi3hsY2RiZFFHQT1DO0tIRDo7Ozw+OTo6OTo3Mzc5NTo4ODg8OTg7OT09Ozo7Ojk8PDc2NDc/PDo9Ozw/Pjw7ODxBQ0FDQkI+P0JAQkFAOj9APztZmZiampqam5ubm5ydoKGhoaGhoqKioqKhn5+dpKWmpqenpaWmp6ampqWkpKalpKSkpaaGUFJQT0+PmHB6mpubnJ6cnJycm5ubmZiYm56dnp6foKOkoqGhoqOio6SkpqalpKSjoqGhnpyblJmqnJuam56amJiYmJqcnpyam5iWmZybnJycnJydmpqbnJ2dnp6dnp6fn52cnJyhoaCblpWVlZacn6Ggn5+hoKKjoqOhnZuZlpaWlpicnqCip6ikoaCgoqOjoqKioKCgoJ+fnp+gnp2cm5ucnZydnJmanJuWk5KSkpKUk5KSkpKSkpOSkpKRkpSVlpeYmJiYmZqcm5qbm5ucnJqZmJiXlZWWl4d3ZGdoZGJNQ0U8RDlJSkU5Ojs9PTo6Nzg6NjQ3OTU8OTY4OTc5PDs7PDo6PDs6PDw4Nzg3Pj07Pj46Qj86Ojo/QURCQ0FBQD9EQUFAPjpAPj06W5qYmZqbmpubm5uen6CgoaKioKCgn5+enp2dnKWkpaanpqWlpqakoqKio6Oko6Kjo6KnllRYVVJOZ21rgZ6am5udn6Cgn56enp6dnJ2dnJ6enp+goaCfn5+goKGioqOkpKSkoqGhnpuamZqtqp6ZmZienpiYmZmam5qWlZeWlZicnJ2cm52dnpybnJ2cnZ6bmJqeoaGdm5udoKKhmpWVlpaZoKKfnZueoaKjop+em5eXlJKSlJeYmZ2goqenpaGgn56goaGioaCfnp2cnJubnJubmpqZmpydnJmXmZaVk5GQkJCPkZKSkpKSkZKTk5OTk5OTlJWWlpeXl5manJubnJucnJqamZeXlpaVlZSEcmZsYmRbREJMPT84RktCPEA+Pj05Ozk6PTg1ODg2Ozg1Njo4PDw7Ozw8Ozk8Oj09OTU4Nzw5PD88OkE/Ojo6QEBDQkRBQ0A/Q0FAPj08QD09Ol+al5mamJeYmpycn5+foaGhoJ+fn56foKCenZ2lpKSko6OioqOjoZ+foKGipKOio6SiradXXl1UV19ua42dmpqbnJ2dm5ucnZ+enZycnJydnZ+goKChoaGgoKGgorCnoaKioqCenJubm5queXqbm5yZnJ6ZlpaWl5eTjo6QlJabnJuam5udn52cnJycnJ6dlpSZnJ+in5ycnZ+hoJuXl5mZmpycnJubnZ6fnZqXlpaWlJOTlJiampqfoKGmpqWgn56fnqChoaCenJubnJybm5ybm5qZmJmZmZmXl5iVlJKQkJCQj5CSkpKSkZGTk5aYl5STkpSVlJWWlZaZmZmam52cnJyampmXlpaWlpaQgG9vZV5gV0BKSDg/N0lFP0VBPD07Ojo8Ozs3NTs4Njs3NDY6Oj47Oj0+Pj07Ozs+Ozo4Ojk5NkBBPTo8PTo6OT9BQ0JERUM+P0FBPz8+Pj89PDtgl5WXl5aVl5mbnqGhoKGioqCenp6enqCgn52bpaWkpKSioKCfoJ+dnZ+hoqOjo6OkobCjXWVkYGFua4GenJubm5ubmZianJ2enJubm5ycnJ6ipKGeoKGioqKhoKSlraefoKCenJmZmpmmk0uBnZ2em5manJiXlZWWkY6Nj5KYnZycm5ycnqCdnJucnJyempWVm56foZ+dnJyenp2cmpqampqampqbm5qXl5aTkpWVlpWTlZaam5qanZ6foqWjnp6fn5+en5+enZ6fnZycm5qbmpqbmpiZmJiYmJiYlZSTkZCRkJCQkZKTk5CRk5SYmZiVk5SVlZWWlZaXmZmXmZqenpyamJiXl5aWl5eYjX1ubV9lVlRFSzw3PjdSRUM+QkE4Ozw7OTg6ODY7Nzc6Njc5Oj0+Ojw8PT49PD06Pz06ODw9OTtAPj4/PT45OTs/QkNAQ0VDPT9DQj5AQD5APTw8YZWSlJWWlpeanJ6goKCgoaCgnp6enp6gn56em6WlpKSioJ+fnp2dm5mbnJydnp+gn56rmGNpbW5pZm2enZybm5ybmpmZmZqam5ucm5uam5ygo6SgnZ+en6ChoJ+jonmqpKCgnpuampudqFpJhJ+enpyZmJqamJiYmJKOj5OXnJ2bnJ2cnJycnZycnp6dnpqVl5ygoaGfnp2eoJ+cnJuampqbmpqYmpmVk5OTkpOWl5eVlJiYmZucnJydoJ+gnp6enp+fn56en6KkpKKgnp6cm5qam5uamJmZmJeXlpWUlJORkZCQkZKTk5OSkpOUmJmYlpWUlZaWlpaWl5iYmJiXmZqamZeXl5aXlpeWl4l4dmddX1dURUU5OTs8WT5AOEI/OTw8Pjk4Ozg6Ozc5OjU4OTs9PDk9Oz0+PD0+Oz8/Ozk+PDw+Pz5AQUE9ODc7QkNFP0FFQz1AREJBQEQ7Oz47PGKWk5SUlpWUlpiYmZubnJycnZ2cnJ2en56dnJqkpKSkoJ+enpybm5qZmJiYmZucnZ6cpolla3R4bVuFop2dnJydnJqbmpqampydnZ2bmpuboKKinpucnZycnJ2enqhtb6uin5yampycrIJLT4efnp6cm5qanZqam5yVkZOXm52dnJ2fnZycnJycnZ6fnp+cl5idn6GhoJ6cn6CfnJubm5qbmpmZmZmZl5WWlZaYl5eXlpaYmZuenp2dn6GhoJ+fnp6fn5+dn5+hoqKhoZ+fn5yZm5qcnZuampmXlpaYl5eXlpWTkpGTlJSTlJSUlJaZmJaVlZeZmJeYl5eXl5eYl5iXl5eXlpaYl5eVl5eDeHZfW11eUT1GOjk4P1VDQTtDQzo8Pz86Ojk3Ozg4ODc0ODk8Ozw4Ozs8PTo8Pjk/QT06PTw+PkA/PUBBPjk2PERDRUBBRUU9PkVERD9COzo8OTpkl5SVlZaUlJSUlJWXmJiamZqcnJydnp6dnZybo6Oko6CenJuamZqZmJiYmZiam5ubm6WJa3F2em9lmp+enp2dnJybnZ6dnJ2enp2dnJydm5ygoJuampubm5udnJqkiFSEqJuamZucnqpkVFGIoJ2dnZybmp+fm5ydm5mZmZudnZ2dn52dn5+dnJydn5+fn5uanZ+goJ+dnJ6gnpubm5ubm5yampuamZudnJqZmJeYmJiYmp2foKCgoJ+hoaGgoJ+en5+fnp6foaKhoJ+enp+enJqam5ucmpqZlpaXmZmYmJiWlJOUlJWVk5OVlZSVlpWVlZSYmZuamZaWl5WWmJiWl5OUlJGRk4yRkJOWfXhqYWJiXFE8QDw2OENWSERCOjg7Oj47Nzc5Nj06OTk2NDc6Ozw9OTo6Oz87PT08QD47Oz46PT89PkBBP0A8NztBQ0U/P0REPj9EREM+Qj07PDs6Z5aTk5OTk5OTlJSVlpeWl5aWl5mbm5ybm5uamaOjoqCfnpuamJeYl5eXmJmYmZybm5qkgGpqb3lzcZegnp2dnJydnp6enp+enp2cnJydnp2bnJuampqam5ubmZmZoJNiYpudmJudm6KWZl1Rh6GdnZ2cm5qdn5ucnJubnJubnZ2dnJydnp2enZydnZ2cnJ2dm5uenp6dnZybnpubnJycnJydnJubmpmbmpmYmZmYmpmZmpyfn5+jpaKfoaKioaGfnqCgn5+fnqCioaGhn5+fn52ZmpucnZqZmJWWl5aVlZaTkpOUk5STkJCSk5GUkY+OkJGOlZabmJWYlJmXlJiRjJCPk5yTkoyFjIeDhndxZ2pkW1xRQT44NkJHYEJFR0A+Ozw7Ojg4NjU8ODo4MzQ6Njk9PTk5Ojs9Ozw6PD48Oj5AOj5APjw/QD8+PDg6Q0FEPz5CRD8+Q0VCPUJAPDw8OmeYk5KSk5OSk5SVlJWXl5aWlZaXmZmZmpqampqkoqCfn52bmpmYmJiXl5iZmJmcnZ2cqH1nZXN7enOJop+enp2dnp6enZ2enZ6enp2dnZ6cm5ybmpubm5ycnJmYmZyZZWN9nJibnZykh2dcUYKinZ6dnZybm52bnJybnJ2dnZ2dnJ2dnp+fn52cnZ2dm5qbnJmZnJ2dnZ2dm5uanJ2dnJycnp2dnZybmZeVlZeXmJqam5ubnZ6foqOhoKGhnJucm5ubnZqcmZycn6CfnZiZmZmUkpKUl5SPj4+OkYyNiYuQi4mLjpGRj4mQmJiQkoyNi5KQj5iYoqiqpqWlrKOmoZqep6eyqKKVo6Cfl39wcWlsXFtcTEY8NzdHR1g+SE5URjk+Ojg5ODc1PTk4NzMzOTY6Pjw6Nzo8Ozo6Ojo8PDs/PjtAQD47PT5BPDw2N0A+QkA+QUY+PEFEQT1DQj49PDlmmJSTk5OTkpOUlZOVl5iYmJaXl5iZmZqampqaoqGfnp2cm5mYmJiYmJiYmZmZm5ybnKx/am16f3lxh6Genp2cnZ6enp6enp6dnp2dnZ6enJubnJubm5ubm5yZmZmapGhnZoiXnJyenHlmWlSDop6fnp2dnp6dnJydnJ2dnZ6fnZ2fn56goJ+enZ2dnZybnJ2em5qbm52enZ6dm5ubnJ2cnp2cnZqYl5SRjo+QkJGVmJSWlJiZmpudmJuYlY2Mjo6TkpKRj4mQjpGRjo+Ki42NjYiIi4+Lg42NkY+MkI2Qk5WVnJihoJySn6SipKmam5eanKOprb3Bwbq8uL26ucC8ubq3uru7tL2zwbV/bnVmZ1peWUxJRTo7TElTPFZSSUM6QTo7Ozc3NTo6OjgyNTY4Oz08OTk7Ozw5Nzo4Ojw6PT85PD8+PDw9QTs5NTg8O0A/QT9EPTxBQkA8REM9PT06YZOTkZCUlJOTk5OTlJeYlpeZmJmYmZqbmpqamp+gnp+fnJqZmpqampmYl5iZmZmZmZmphXB1e4B3b4mhnp6enp6fn56en56fn56dnp6fnp2dnJ2cm5ubm5ucmpiZmJ9uZWJshp2dn5BvY1ZXh6GfoJ+enZ6hoJ6dnp2enZ6fn56en6CenZ6enJydnZ2cm5qYnJuVmJqamJiYmJmSjJCXlKCXk4+MjYqKiImMiJORh5CPjYqKkJCLjoqMi4+IiImJjpGOjYaFiYaKhoWLiI+SkJCNkJKXlpKamJ2TlJ6kpqaqq7Gsr6+rpquqsbm5tbS0rqyvtMDIxcXBvsbDxMTDurW+t7a0s7C2tb6qcHRyXGZfXl1JRj8/RUtMVklcTEQ/PUI6Qzk5Nzc7OTk3MTc5ODo+ODg6PDw7OTc5OTs9Oj4/OT5BPDs+PD46OTY5PDpBPkNBQT08QkBAPkJEPj8+OVyHhIOHi42KiYaFgYqMkZOVmJiHlZaWkpiampmenZ+gn52ampubm5ycm5iWmJiXl5ibqo56dXZ7f3mCoJ+fnp+goKCfn5+foKCfnp2dnp+enp2dnJqbm5ybm5uYmZmfeXNyXniZnKGOYVlTWo6dm56dnZycoaGfnZ6dnZ2dnp2dnJiWlpaYlZWSlpmWk5GKjI+PjI+NkIuLj4+WiYiEi5GZjn2Fi42PjYyHioyQm4yRj4+Lio6TjIyNjIiSi4yFiYyPhouIh42KhYyEj4qXkJOYmpWbnKOqoaKknKKrsbe0ubWxtK2vsrKlp7O6sbq6vLa3tsDDw729vLa/urq8wbW4wL60r66mqa+3mm58Z1tjWl1fSEU+QUtJU1hZXkFGOTk9OkY/Pzo3Ozs7NjM5Nzo5Pjg6Ojw9OTk4Ozk7PDo+PTtAQDs8QjxAOjg0Nzw7QkBBQj4+O0NEREBDQz0+PjlhmZWLkYWNj5aSiHl9e3+Fi4OKgoqJhmuAeJCLlpqRnZ2UlJGTlpeampiWk42Sk5KQm5uIdndzcX1/cpGgnZubm5yenZ2eoKGgm5uWlpucmpubnJuYmZqYmJmbmpqWkpuflHmaqKGqlHxiUmCQko6SkY+Uk5KXm5mYm5ePjpCLjo2Ch4uLi4qLiI2RjIeHhoqIiZGKh4yEhYqNi4qNhI+UkIyDkJOUmZWQi5OTkZWRlpWOj5GMlI2Oj4qIj4ePhoeJiYmNiomJioWNh46JmJKUmpuXmKChp6Cko5qqqbO2sbWwqKqiqK6tn6qvsK21ubi8wr/BxLixtbCutrOwuL68ury+urOzp7G3wpB1gGNiXlpXUk1IRkVQSVlXX1tDUDpCQz1HRj84Nzo6NzU1OTc8OTw5ODo9Pjo6Nzs7Pjs7PTs9P0E7Pz48Pzo4NDM3OkFBQEI+PjpDREM/QUM7PT45Z6mloqKZn6CippeUiI2CiIJ1h4iKiIp7e3Z7enmPeoiSfn18en6CkYWBgH1zfH99fISHfnRweHZzfHaBj4iIiYeIioyMkZicl4iOhIuNi4iNkZCPi5GPi4yPkJGRjqCfjn1iiamYmm6Dh2twiIeCjYuGiYp/iYqGiJiRiIOIg4KFfIuLjIaJi4iKkIyIi42PjI+Wh4mLio6NjY2Wk5OdnJyalpycm56bmpuYnpeTkZWWkJKRi4+LlpSMjYqDi4SEiYyQkIqOio2LipGJjZOTk5SVk5KcmZ6Xn6CfpaKvsamupKSfmKStpqa4t6ysu729wsPAv7+vpa2wsLS3uLO0uLa0ta6stK+4tLaBeXpjZmBeVlFRQUVMT0lcXl9UR0dCS0xCREA9ODg7OTU3Nzk3Ozc9PDk9Pj05Ozg6O0A8Oj06PkJBOD88Oj84NjQyOTtCQD9CPj04QEI/PkBEO0A+N2CloJqXnaGaoaCPl5efl5WCjaCfo6GdmpKOjIxycXBvdnFucG1ucHZub29waHBxcHR+c3FycXd7cnl2d3Jyd3Z6e3l8fXt/iIGEi3+PkYaNi4yGiouLiYeEgYaDf4yojXhpUnCdj4xWbXl7gn5/gpKQhoSEhY2DhIyPj4+IjY+Hi4iRkJWRjpCKk5eOj5WYp6SfnZWYlpaln5udq6aqt7W4srGnr6qnpqGfmp2WkpWVkYqPjImTjZuVjYuLhoaJjJWQkJCLmZKVlZSbkJiTlIyNkYyWl5WilZ6mqauno6OqsJucpp+mq6G0vb6zs7+5u7u6uby9rqiusa6wuLyztLGxqrCpqLGxsqild3J0X2hhYFRWUUlKSFZNXl5eVExKRVFKRUdDPTo5OTc0ODY4Mzg4PTo9PD47OTs4Ojs/PDw+OT9DPzg7Ojg8Nzc2Mzc5RT4/Qz89N0BAQT0/RDw+PThUj4yGh4eUjJWZl5yWmZaNlZyWlZydoKCdmpiWeHFubXJ4cXFsbnJwa3FvcG1yc3t1dnd5fnVxeHZ0d3tybn98gX15eH1/eYOGg4WCg5CLkIuLi46Pi4mJhYKCfn6QoHpPQ0l2lIODSVdvc3eCe4aOjYuGjZSRi5CXj5SXkpihlp6WlZunpp+goKawq6GjpbW0sqqmqq+isba5vcK7ucO+vLi9uLWxrLCsppuSk5mfm5SPk5WOmp2doJqfn5edo6qsoZ+em62hp6qwqaampJiRkZWUo6SirKSss7Szs6i3tru4sLKvra2yt7a6srW6s7e5u7i8urayr6yxsbKztLOxsa2us7Gzs6yhl3Zxc19jXlJRVE1PSUdYT1pcZFROR1VPRURKRD44Ojg3NTg4ODU5Nzo6PTw/Ojg8ODk5PTs9PTpCPj84Ozo5Ojk4NjI1N0I+P0RAQDY+P0I/PEM8PT46Tn98go6MjJOTl5eaj5SWjZaRkZSXk5qanqGdnHJvcnFxcXFxcG5zcW91dHJxdneAdXd8eYV+d3t8eX1/fICJiYmDfXp/h4GIiYGAgIGGiIKGi4eIhYSIiIqFgIGAoJRTNDQ7eYV1ckM4TmtvgIeKjouNkJmclJSUoJqan6Ktsa6ppKWtr6ysrLWuvrmtrqm1sLexq7G2rK+9wsLAvrq8trKutraxtK66u7OurKepp6unoqmtoKmooq+wuLSxvLq6urK0ta+8tLezt7e7t7mtrbCprLW5sbeytLe2sLu7vLu6ury1vLi0wbWsqqqrtLG3uLm1trSzsKymrrCqq7Cxq6yusLKxtK6qo5N4dnJlZ1tMUlBFTUlTV1JlXmdUUExcUUhMUkNBOTk3OTU4ODY2Ozc5Ojs6Pjk4Ozo6Ojw8Pj08RD45Njs7ODg+OTUxNTZCRkREP0A3Pj5DPjpBP0BAO0t/gomXmJSdlpabmIuSlo6XkZGVl5SZl5+bmZx8dHV2dXl1c3RudnJzdHV2d319gH56gXyDfoJ/fYB/hIKFj52RiYF/go+Xjo6HgoCBiIuFfoqRi3+IjYyLi4eRj6FuRmRVP3p6Z2RMPDlNbnWNiomQj42PlJSYkJWcmp2eqK6ysLC1tLOtsrW4sLy1tbGqsKqztbS7t7SztrS1r7i4t62noqassLCvtre3vrW5vLOysa61u7C0r6+yu7axuMC9tLS0s7izvLq2tLrAvbm6ubq+ubm5vrWysa+yr6q1tLGzsbSzrri4tb+vpKaoo6ussa+zrq6wsKytq6qroqKmqKKnrauqpaynoqeYeHlxZmVZT09NSVJNV01PX15cTlVVYlFEVE07Pzk8ODk1ODc1Nzk1Ojo6OTs4Ojw8Oj08Pj4/P0I9ODY6Ojk6QDs1MjY2QUZDQz4/Nz49Q0I5P0I/PjtLjpGTmJmVmZGTopiTkpKLk4uOkI+Vl5ablZSbhoJ9enh2dHRzdH53end2gIKDhouMhISFioaQiYeRk5aRjZaalY+IjI+emJaVkpCTl5qamZCeoZ2Tl5uhmp2boqSYUXSwkUh7h3htUml/WVdxiJCMmJqPj4yUmpecnZugnaSstLm6vK+2tLi0tLK3uLmzq6+qqKy1srK1rrGrrqa3s7OxpaGotbCvrayrtbqyu7q6tLK3ur67ubG4sLmtqLK4u66ttLS3tbu2trm5vLe0r7G0t7a5s7e1pq2pq6ior6yprq2up6KxtLG0q6aop6Cjq66oqq6orLKwr6+pqKGeoaGjpqOgopqlo56ol3J3bmdiVUpUT09KRFBLX2JYWlFcVGBNSFJJQUA5Ojg2Njc3NTg5NDs5Ozk8Nzs+Ojg8PD0/QkBBPTs2OTk5Oj87NjM3OD5GQkJAQjk+PUBDPkBGQj44R5OWkZWTkpSQkZ+ZnZmVkI+Sko6Mk5aWko6RlZGSkIaBeXJzdXuBhI6HhZGTkpicnJiVkJWYo5yaoaeqqZ+clpeVnaKioZyZnpmlqKyvramnqqqpp6KlqKmrqamshF+/2KxGkqOakF1rgnteXoOioaSem5qkp6Spq66spaSoq6+xtK6qrK6zr6ystLO0ua6urayqrLKwsK2wqKqmsrS0uK6qtrqwr6qurLC3s7i0t7W0u7y4tbWxtauyrKiys7uvrbGytLa1sbG0s7OvrKuvs7a0sayutKqqpqWnrauoqKupqqifqbOwqqeppaOio7CtqaatpairrayppaSioKWipaOYmZyVnqKippdudWVnZFdPWUtLSktTVHBiWWRXX1tcUlpQTEM8ODk6Njk4NzQ3NzQ4Ojw6PDg6PTk3PDw7PkM/QT47OTo5Ojs+PTg0NThBREVEQkM5PjtAPkI/R0Q+N0KSm5SVlZaVj46Wl5qZlZGKk5SSjo+SkYqKiY2Ul5qTjYmCho6VkZSfmpuin5+jnqGhn5ijpKelpaapqa2rqaKmpKilpKGfnqOjra2srairrq6rq6ykoaKmqaeopm96vcCqmsyonrOaSFaEcFJ4n6mnoKKhrqyrqqetrqilpKmpqqmmo6iqqaekp66wr7Ovq7Crqq+yr7Czua+rqLCxrrCyubO0r62vtbCss7GurLW1tLSzs7CvrKyqrKusr7G0s7CwrrCwsKyqrauqq6alrrCysKumqbCvqaOkqaunqKaopquwq6mvqaaoqaalo6iwraqpqKKpo6WnpKGhoKKloZ2el5aYlJugpKmUbnNeamlfVlpOUk5RT1NlXGVjW11ZXFBZT0tAPDs5Ojc6ODczNTMzODo9OTo4OTo5Oj08PEBEPkA9OTo8PDw+Oz45NTo8QkFFQUNBOT47P0BEQENCQDdAkZ6YlJeZlpGHi5SSl5GIg4mLk4+OkI2Hh4SFlZmWmJeZlpqeop2ZnKKkoaCdn5qfoKGgpqGgoKCjo6KlqKmrramqpqOmpaCloKaop6aoqaepqaSop5qdpKWjoqJygZmujsnOsp6wsm5TvqBUbJSjoqChn6GhqKCcn6GloaCmo6KfpKGspp6foaGkrKqnrKivq6e0sa6ur7WyrKqwq6mtrbWwrq6srreup6yqpKivsq+sq7Kvqqqpq6utqa6urrGxraqtqaunp6uoqauinaapqKilqKisqKilpKWop6iopqmsr6+oq6mhoqKlo6Opq6ymqKWjqKKhoKSdnZ+hoZ2bnZ+amZWcnKOqlG9zZm5yZF1dUFVPWE9eZWRsaGJiWlpSVE9NQTo9Ojo4Ozk1MTYzMjg4Ozk5OTk7OTk8Oz0/Qz5APTk7Ojs8QD0+PDk5PEFBRUFGQTo9Oz9BQUJBRUI4PYqWlJOYmpaPiISNjpGSjIiIiI+JiZCRjoqKiJubmZygpaKlnqKjoZqeoZyanZ6bnKOop6ugoKOYoJ2XnKGjo6WjoqKkrKilqaCepqmnq6mkoKKgo6ehpq6mppygjX2Fe4bQvZiXqJxyUpqsZ2OOo52goJ6doKOalpqYo6KipJ+ZnKGhoqCbmp6goaSgnaejqrGorqusqaSqqquorKalrKqws6+rq6mwq6appaWoq6ynpqevq6Wnq6upq6irqqqrrailqKOmpaesqayoopykoaOmo6qpqKano6SnqKanqKepqKupoaKoo5yepqWjqKino6WlpqmgpJ6inpeYnZ+doqKlnpiUlZ6go5d1d2t2eGJfXFVZUVVXW2Nfc19oX2NTUVlUSD48PTg7OTo4NTM3MzM0Nzo4OT05Ozo5PDxBQEM9PT44Ozw9PEA/Qj86ODo+P0NAREE6Oz49QD9DQ0VDOTyCmJmenZ2alZKKiZGRl5GQh4SJgoGNj4+Sj42cnZ+hpKmlqaeorK2moqKfmKSmo6Stsa6yp6asm56em5qjp6Cfo5+foq+rq6yoqKuvqaiqqaKgoqiqrrGyrqukqZiIe2qdvcOrrp6JdmRweHp2h6Okp6OhnaCimZWem5+fpKGblZigoZ2enJudnZuZmZWen6Oonp2iqKGaoaOmoqSoqaqoq7CxqKWlp6eopKWpqaqnoqWmqKadnqWloqClpaOlpqCjpaOjpaelqamqpKekpqKmp6SrqaenpKGlqKynpqWlo6OopJWdo5+bnaCjqaeopqGjo6mooKiioJyVkZqfn6GmopuXkpCamqCVfHdvfXlmW1tgX1pcVVxoZG9jbWlpYl5QUEA/Ozo4OTg8OzYzNDMzMzc5OTs8OTs7OT49QkBAPTs9ODw9QD08PENBPjo4PT9EP0M+Ojk/PEI/P0FEQjk6gJ6kp6Gem5+gmY+ZnaCWloqGj4iEi4qTl5SRo6Wnqq6trLOys7S4t62pqqevtLKxqq6usbKusa2lq7OssbGpq6+rq6y2sLSwq7GysaOgo6qqp6+3trSztrKwsqeJdV5Olp+Qj42Ae3Nwc3F4fH6Fkp2hpKOipJudoZqWnqScm5aZoqefoJ+joJuUlpmWl5qfoJmVnqGZmJ2dpZ2gpKeqqaiqraylqaSlqqeqqaqsp6SkpKOimZmhnpqaoaCfpaWYnqSmpKqooqelpaGqp6mnp6ejqKWmpaGkqKesoqekoaalpaOVl52Ym5mVo6elpaSfnZ2lo6Kqo5+amZiXnJyaoaGakJOTl5ibjX93cnZ4amJbX19cYllgZG5ta25hX2RgUE9BQDs7OTs4Ojk2MTQzNjQ3Nzc6PTo8Ozk9PUI/Pj89PDo/OTo7PD5CRUA9OTtAQT5DPDs5PzlAQEBAQkM7OXuao6OcoJ2dop2Zn6KioJibmJaYkpSQm5qWl7S0rrW4s7S4tre0uLm3tbm4ub28uKqLnLK4vLS9urW7uru4s7q/uLe5u7G3r6iusq2inaCrsra7vr/Av8W/tauTcGZYR3eAc3V6cW5paGJiaWlvdnd4fYONmKOorKakmaGko52goaKooaOgpaGck5mYmJmco56cmpudl5uZlqWam5+hqKmpqKuvr66pqKirrKytq6irp6WjoJyfo6Ojn6Cipammmpyip6Spn6GjoqKgpaanpqSooJ+ipKGjoqiop6OloaGopqalo5mbmJuTj6GknqKfmJiVoJuhpaCfm5udnJuamZugmo2YmZiTkYaAdnh4eGNbUllUX19hbWh2a3FoaWliWlNMQDw6Ozg5Nzk3NTU2Mjg1Njc3Ojw7Ozs7QD4/QD0+Pjk6PDk2Nz47QkZCPDg7P0NDRDw+OT43PkFCP0ZDOzhwkpqblJ6bm52Vl52doqajopaXnpaXl6GblJi+t7G4uba3t7i7l5S2vbu9vcDFtaK7mKC3v7+6wcm0nbu2sra/xcGooLa0urGqrrSxsLK0tbrI0tnc1ce6rZ+QeFxbT0Vea2VqcGhkYmdZV11ZXmZubm1tbG6BqMjGu6Knqqynq6mlpqCnoKGmoZOWmJ2foqSjnZ6coaChnZekmpmdoKaqqqqtrq2tsLGrrK2sqamrrqimpaalpqSkpqaeo6eppKGcoKKjpqCio5+jpJ2foqWgpJyboZ6fo6GhpaSlqaOkpaKkp6ehn52elpOcoJiZko+MjJeWn5uWnJqdnJqSlpSUmJOQmp2YiouHgIB8gnhhXllTYWlgZnRvdGl0ZGlkYltMSz46OTg5ODg5NzM0NTI1NDY2OTw8Oz08P0E/QEA9Pj44OTs4Njc/OUJFQzw7PD5DREM9QDs9Nz1DQ0BFQjw3Z4yRk4qalZiblZWYm6Knq6aVl5iQlZmhnpeXvrWztLu6ubi5woeYt6u4u8DCxbOjw6e4s72/tMTHvbS7uL62wMTErqCworW2tb2+wcTHw8TF2eLfz72wqJyNeGJVV01FXmxhY2plYWJpXVVcV1laXmNhXGOAqcXAvbipr7Gwr6yqoqajrJ+fpquXmqifpaWfoJydoKuwsKyiq5yYm6Cor7Kys6uorre1sq2tqaalqKulpaStqaShn6Cnnp6mqKmmnp+anqGlpqmcnaObl6KmmpuanZ+cmqGcmZ2eoKijn6GfnaWioKOioZSZmpmTj4qLhI2Qk5uPjpiVm5eYkJORkomNl5iYk4uKi32AgIVwYGJfXmtjYm54dXdubVtiUlZcTUc7PDk3OTc5Ojc0NDQxNDM3Njg8Ozs8PEBAPUA/Pj8+Ojo5Ojc6Pz5FRUU8PT1AQkJCQUE7PDhAQ0NARD87NV+MjIaFlouUlZeYl5ifpqellpWVkZebn5ual7mxtrO5vLy5urWqsryxvsG0vMe5uLuuv6fGw7/KxsnIxcXJvMLHx7+xsKe8vL7FxMbJx8XGvMfHztDEq417b1xTVFZLQF5sZWZuZWJeZmFVWFpYVldXYoOltru5q7SyrbOtqa6vp6awr7Ktqq+zpKu1qaeopKCgnqmyuL61tbWqqaausre4t7apq7i8ubexr66noqOop6SfqKOfnqCZoZydoqSnp6GelJuaoKGlnqChnpajnZSQlpiboZqflpORlpSin5qenJudoZ6kn56VnJiPkpOPjImTkJefiZCWkZuUmJGRlZaDjJWXlpKLjIh8f4R/amZoYWtsZ251cnJ1cWdeYFxSSUU/Ojo6Nzg0ODw3NjU0MjMzNjU3PDo7PDs9QD4/QD48PTk5OTs6PDw+QkRFPj49QENDQkREOzo4QUJCQUNAOTJbk4iEjZGKi5GRlZCSmp2fnJOSmJSdnZqXmpW2sbm1tb6+tri1uLO8vMTEusPHwb+0s8XFxr/CzcfLzsvLx8HDxsfIysXExcO7vLzBxcHFxL/EwsbJycCkiFpMSEpOSD5aYGJscWhhX2VcWFVTVFFWgLbDr6yqqqqtrKmlpZ6pr6uyu7q4u7e5t7O5uLOurLO0qrC1ub3Bur6+vL60urm4u7qysbS8u7q7s7Oyp6Smq6uioaCdmpudmpyXmpuenJygnZaclpuZnZ6io52UnJCNiY6OkZ6bnJWNh5KLmJiWmpybmJybnp6cmp6UjpiYmpSRmZeeoZWYmpKXlJWRlJqYk4+TnZaSi5F+enx/dWtsbmRvbWlxeG95amlhXWdhUUZEQTw5OTc2NDQ6ODQ2NTMzMjY1Nj05OTs7PT47Pj49Oz05OTs7Oz89QUNBQkFAPEBDQ0NFQjs4OUQ/P0BCPzsyV5uQkZCQh4WSjo2IjZCTlZGPjZSUm5STlpqRs7e4uLi+u7C1sri2tbbAw8G+w8LAvru+u7u8xMzEzNDLxsa/xcfLyNTLysjGv7u7vsS+xcjHxsTEw7izwbqgd0xKUUk9TVRiamluY19fWlxVU1p/mq23tKuupaSjp6SgoKWZqrSxvsG+urm6uLW0srG0tLO6wL7Av769u7u9vsDCt7a3tru7sru+ubi3u7a3tKyoqamrpqijnpOampyYkZKZl5GRmJqXnpiWk5acm5+elJOJiX6GiIyWlJiZkYmVkZeWlZmbmpaYl5idnpyhmJWZmZyYl5ybn56jnJ6WmJeTl5yZmZyUlp2UlpOJdnl6e3dua2lodlpmcnhzemdnXmRbUlhJRj87Nzg4NzYxNjk3NDQzMzM2NDY7ODo8Oz08OD0+PDo7PDs9Ozs+PkRBQURCQEBBQkNDREM9OTlCQD8/QD89MkyWmpaSk4yKmJCKi4yOkpKKiIaNkJiKj5CUl7O7tba/vb2xtrjBvby0uL/Bsbi3vsHFvbu8wsbJv8jOyMHEwcfKysbKxczIzcbIxb/DwMvNz8rGxMPEwsW9u76RZVZLQko9XlZYa2dbWllYVnCQsLGruLWzrKmjoa2prKetoKy1tL/Cvrm4vbawrausr7W0ur7Fv7u8urO5u7i5ubWtsLS9u7G/vLiytrmzubu0ra2orKyqqaeXnpualY2MmJSTi5WWlJyZl5WWmZKYn5mQiop+iYqKkY6Vl5OUn5mWkJSZmJmWmJOUm6GeoZiYmp2ZmZaenpibopqdnJuYmpuZlpeXlpyZlJyYfoB4eXZ1ZWZpamheam9ueXhjYmFgXlhXRkU4Ojg6OTc5NDQ5NzY2NTEyMzM0Ozo9Pzs9PTo6PTs8Pjo7Pz48QkBDQkJFQj0/Q0NDQ0RFQDk6QkFBQj5CQTVCkJeUlZmSj5qQjpKRjZSVi4qHjI2UiImPkpq2u7S8xsHEwr3BxcLAtLO9v6ywr7rDysPCvs3IxbfByMW/wcLIy8rCwsTJzM3Oz8zDx8bIycjIycfFycfIyL/GxragbEtZQVJye4BaUlBTa5++wLq9u7y6vKytpqm7urm3wLO1uLLAxrq3t8Gzsa2tqau1s7u2w7a2vbWxt762s7e4sLW2v7uwvbq0q7CxsbO8urOzrqutq62xnaOjoJqQjpiXlZCclpaYlpWSnJmTm5+clpGUjpWQiYyQlZOUm56YmZKSnJedlJmSk5aZmJ2VnJ6do5yVnZ+TnKKcnKCfnaOemJSVl5ebmpmgkH99cXRxb2NhZ3Zpamp0bnlsXmRbVWBZTEhDNjw5OTg4OjUzOjY2NDQxMzUyNTs6PD47Ozw9PDs8PTw7PD49P0E/RUFCQ0M+QEFARUVERUE7Nz5DQkI+Q0I4O4+akZaalJKUjZCUlI6VlI6Pi4yJk4uIkJObt8C6xsXEw8zCwcS9vrWvt7uvr7O6wMfFxMHMy8W2ucDCwsTHytHLwsPExsnFzNDNx8zJwsLHwsvLyMfMyc3FxcXEycCqjXhvjJmdU09xn8LSx8TBxMfBvL60sbCwwr6+wcbAv7i2w8K6urbAvrWyrKmvsri+tMC0tLi0t7nEua+8vrm+v8K/tbq2q6qsrq+wt768trSura2utaSlqKimmpycnZyeopydmZOQkp2VmKCdmJiVmZmZl46MlH2QkJefmZmYk5GToI6Nko+VjpCUlaKdnKSem56elpyjoKGipKOkop6amZubnJ2enIN9cn14cGdga2p3bGlmdW90Y11jVVdVU01HOjc7OTk3Nzo3NDg3ODQ1MjM0MjU7Ojk+Oj08Pz04Oz05OTk9PEBBQEVCQUJBQT9AP0RFREVAPDk+QkNCQENBOjSAoZeUmZiVkImUk5aTiZGMlJGOiJaKi5CXnMXLw8O8wMPHwbm9vbu4tre3rrK3uLzAwsDCx8bHurzAwsTHyMbSycHDw7+/vsTLyMrLyby8yMfJzcjDyMnJxcXBwcDCzrxzaoWZl1qRy8vNz8W2v7/AwLq7vbWzs8C/ub/DucC3u8G8uri7ub27srCvsKy5wri9ube1t7q9xb24xsjCwcLGwr28tamurrCwr7O6t7m2sK+tr7OppquprqannqSlo6OjoqCblZiekZecl5GRlZeZlZmRlJiSlYyYo5qcnp2FiZ+TfJKWlZKUlJennaCipJ+en56foaGkoqKjoaOinJ2fnqOhppl5enmAc3BmZWZja2Ria21vb19ZXVdWTlBKRjk5Ozk3Njc3NjM3ODk1NjEzNTI3PDs8QDs/PDw6ODo8OTk4Pj1APz9GP0JBQz89QT5ARENDQTw5PENBQ0RBQDozbKKdlZedlo+PmJiZmIiSjZGVkI+Vjo6TlpbKy7u5urnBu7q3vsG8vLu5sa61uri4u8S6vsC+vru8wMXBxsK+xsK5u8O6uLm8vsHHwca7ucjIw8XEwMPBwcDEwcK9vMLBmYCOmYh/0svEyNHBr729uLm7u763tLC5vrO8vrG5tbi7tryztbm2uba5t7GtusG6vMG/t77Ev8bDw8fHwrvAwr/Cv7iys7O1tLGut7S3tbSxrK2xp6Wlp7CtqJ+nq6ajqKWmpqCgn5SYmZSRkZWUl5OYl5qhnZ6hnKGdoaWglpSbkZeXmJqTnpmZqaSlpKWdoqCanqCkoqOcoqGjoJ6cnp6ppaiVfXuDeG5mYWViYWNjZGpjZ2NbWlpdWVFPRT07OTo7Nzc5OTY0OTk6NTMxNDUyNzo7OkA9Pzw8OTc3Ozo5Ojw+QD8+RDxCQURAPz49QkRCQkI+OjlCP0FCPT44NVmfnJiTmZaRlZiYmpeQkZCQk5GTlJKSkpSUxce4tbq5wrm5vMPFwri7ubGxtry6tbnAu7u5tre0tLW/u72/ub66urTAuLW3sq66u7fAt7zKz8C7v8C8u8S9usDEv729tr7IpJRmj83Ev8DJv7DBv7q3u765tbi0uLy0vbi1tLCzvLG3tri/tr25vb65t7q+u7/Axb29y8PGw8TAw762ubq2v7i7v7y4trOyq7CwsrWzs66sq6emnqeurauiqKumpqqjp6iqo5+Ym52bmpicnJiXnJuhpZ2anqGhoKGmoJqbnJiboJ+dnJ+coKiho6SknaKfmqKgop+el6Shop+dmpieqKWhi3x5iH1xZGFiY2hqZ2dqZWpeVlZUWU9TTEY4PzY7Ojc3OTs2NTo7PDYzMTM0MTc7OTg/PT47PDs3Njk5ODo7PUA/PkA9PT9CPjxAQUNDQT9DPTo2PEBBQDw9ODdJlJibj5OUkZWYlZGWkpWRkJGUlZSTk5OYlcHCwLq8ub62uL7EwMKxvbqytLO4vLW3vMC8vbS0sbC1t7W7wbi+ub+8vLe0t6+ut7W5v7vB1Y26v7vDtbrHt7a5u7y4ubW6xMmmQovJv7+7wb65xr3Cv7zFuLa3tLi2tru7uLa0t7q1s7i8vbm/ucPAwLu5vLu+vcjEvcfEw7rAvb62sra4srm0usLCureysaysq62yr7Kur6ijpJ6rrKyqpKakpKiqoqemraihoaGmn6Oiop6bnKKfoKOdnJuhn6KgpKCem5eZn6GdnZ6eoaWkoaKioZ6ho5yinqCZnZijn52eoJqZoKKmnYR6g4F5cW1lZWZwamVsaFhZT0tLS1JKTEhEOT44PTs2Ojs5Njc8ODk4NjA0MzE3OTk7Pz0+Ojw6ODg5PDg6Ozs7PD1BPj09Q0E8P0NDREA/Pzw6Nz5CREE/QDg4P4mYmoyMkI+Tl5WMkpCakpGXmJaUlJKQmZTDvsbBwby8uLi6v7a8scK2tLyxtLa4s7q9v768sq2vrLGwt7y3u73BxLm3t7a1ubm6u7+8z8R4qcy9x7e5uK22tLe5s7WyusXKmkaAyr+/vr28v8jDxcW+xri1srK9uLi4vrq6uby6urS3u7q5v7zEwL+5uri/ubvFxr3Fw8Kyur27sa+2uLO3s7q+wLm2rLGrrqmqqa2qqq6mpKWnrq2ppaOio6GkpaWmoqato6Klo5+ho6Gcmpyhn6CloaCenZygnaWgnpeVmZ2fn52gn6KmpaCknpybn6Ofn5mcmZ2epJyWnKOcnqGcppZ+f4Z8a25xZ3FrdGZibmBcVEhLS0RKQ0NHPzo7OD48Nzs7OTc4Ozc8PDYyNzUxNjk8PD08QTs8Ojs6OT45Ojs9PUA+RD89PkRAPz9BRkQ/Pzw9OTc/QUNCQEI5Ojl3nJiLh4uQkpOWjY+TmpOQnZiSkY2PjpiSvbfHvsO+vbu+vL22uri9ure9s7OwuLi1uby7wLeqraSusLi7sr2+u8S2tbi1t7++xLzCxNeudIG7yM/CwLiutbW7vbe5sb7Dx45Me83Dwr++vbzHzMfHxMe9tbW2wb27u7/CusDCv7y2t729vcHBwL+8ube8wru3v8W7wr++tbe8vK+vt7awtLO6ubq7r6mtq62rrKaqoqeuqKWqra2vp6Sgn6ajnqKjqKOjq6Oiop6dm5ublJaZnJyfpZ6fnpmYnpejoJyXmZqZmqOjop6jo6egpqCbnaCjnp2WoJmcoKCblJegn6WcmKKQgYaAcmZsam51b3hjaGJcY1FLVUhFRUNHQzw7OTg9Ojc6PTo4OTs3PD01MzY1MDY4OTo8O0A9PDo+PDk+OTk9Pjs/PkM8Pz5APz4/P0ZEQEE/Pjo3P0BDQz9APTo4ZqGYj4uNlZKVlY6PlpmVl5uVjoyMjY+bk7m2wbS/vLm8w8C+wLq1trKywLmvsry8sLe7tru8qqqjsLm9vLK8vrzFuLG4ubzGycrCx8nSmXF0rtHRzMrEtbq/xMi+vrS+wMB7WXPLxsK+wby/w8zKx8XGwLm9vMS/v7/CyL3Hx8XFvLrEv7vBv7rAvLu7wMS9t7nCub69t7S2uLqur7WxsLCytre0t6yurKqsrKuoq6Gms6qlra+trKippaOkp5+io6Onoaeiop6cnZyamYyQlpeZnaKZnpuVkp2UoaCdmZ6fmJimpqKfoqKmoqeloqCko6GbnaCbnKKfl5WVnp6kmpafiYGDgXRvbGx0bGxuX2NfYWJOSE4/RUA/REM7Ozo6Ozo4Ozw6OTw+Ojo+NDQ1NTE5OTo5PDtAPD89PTw4PDs6PDs7Pz5DPkI+QD89Pz9FRUJBQj87Nj9CRUQ9QUE6OlmfmJOSlZqVmpOQlpeclZuZlpSVkZKTnZm2uLaxuru6vsG5uca7trWypb69tLbBv66zvbS4wbGwsbS7xdDCur68xL63vMC/yc/HyMrKwYZydKbMzMvNysbCw8vOwby4vLqxcmlmu8jEwMC/xMDKycPDxMO5w769ub+8wsbCyc7Hxr66xr26v7m3wLm5vsDCvrW0vLi2u7CvsrK1r7Cvrqyus7CzsrirsbKxqrCrq6yrrLatqKyusqarrKmpoaWgpaakrKSmoaChnqGgnaCMlJeTm5+mmZ6emZOYnZ+gnp2eopuYp62ooqSgoKKqpqmhqKGlm6CgnZ2jn5SYmKKdp6Gfm4J7eoh7bW14fGBxY1tfYF9UST5DRUlCQz5DOz42OTo7Ozs7Ozs7PT05PTU2NjIxODo5Ozs6QTs/PDw+Nzs8Ozw9PTw9Pz5BQUE/P0FCQUVDQkRAPDY+Q0RFPkJEPztTmZuZmJ6dmqCalpyZn5KdlZ2boJWWlJqYur20sLu8wcTCv8XGura5sqO7vbS3xLuwtbq2ucS4tLy3u7ur2sO+tr7Avr66ppypsrbDwKV5dnmcxMbLyMHDwMDJysG/u7mxoYF4ca7IxcS/wMG/y8fCwMjAusK7urO6usG+wMrOysS9tby8ub+5ubW1s7/Avre0s7W4rbeqr7CwsrGvq6+nr7ausrG5rra2uLSzsLGttrS6sa6srranrLKsraSjoaenqLKrqqWkp6elpaCml5ujn6SmraKeo6KanaWiop+foaWenrC0sKSlnp+kqaevp6mgq6CiopqipJ2anqGmp6+psZWCe32Bem5zeHRocF5cX11aUkZFRE1JQUQ9SDs7NTk7Ojw8Ojs7Oz0/Oj01NDUxMjc4ODs8O0I8Pz46OzY6PTo7Pj0/QD87QUFBPj4/QkBBQkJFPjo1OkFCST9AQkA7TJqdnZ6fnZienZmampySoJWbnp+blZGRl8W+urbDvMbCvr/Ixbe1uLe2ubu0r7e3srWzt7m8u7a7u8S3ba3Ovba5wL2rfW5obm1ygZWYc3h9mL2/xsC5wLy+xcS9vbixr5yVg4icysLDvL2/v8PDvr/HvLy/tLSutbW8vr/OzcvCt7K4t7e9ubuxtrLIwLu2tLGxt6yzqbCtrbS3r6uuqrG1r7Gvt7O6usC/tre2sru6wLWyrbO3rLC6r7KloqWrrK+5s7KosK+xr6qiqKGkraitrLOun6inpqWmq6Sknqaqo6ayuLOrpZyfp6anrquqpbClpaWbpKOYn6exrLW4sLKOhHl/fHdtdXtxb2pcYGBaU1BBRklHS0BFQ0k8PTY7OTk8Ozo6Ozo9Pzw9NTU2MTM2OTg8QT5AOz1AOzs5PD04Oj08QD46Oj49Pj09PkBCQkJBRD03NDU9REc9Q0I/PEWUnqCgoJyXmpiYlZmdmZ2fm52bnJaRj5LDwMK9wrzEvLy7xbu3s7e2tru7s6CWtayvsbS0tLa4ucDNsnaBs722tcKlh2laXmBNUltbbnR3gqG4uMK6s7u3u72/uru7rqOenY6Zf7/Ew768v7u7uLbBwrW/urWur62wvcC5z8rJw7GwtbS0vbq+urq7ysO7uravsL2xuK+ys7C3vbaur66wt7CsrLK2vbzEwrq9t7bAv8G3tbC2srGzurGxr6err6u2v7e1qbqztbmxp6uop7ausrG1uaisrK+qr7CqqKessayytr20saykqKuoqKusq6i2qaaonqadmKOuvLG7wbSmiYF7gnpzdnZ3b3FhX2ZdW1VKPT8/R0c9R0NDOTo1Ozk5Pjw8OTo8Pj4+Pjg4MzE1Nzg5Pj9BPzs6Pz08Oz09OTs8OTs6Nzs+PT1DQT8/QUJEQkE8ODU4PUNGPUREPzw/iZ2en52Xl5WUk5aZnpubmpuYlJ2Uio6Owb7Dwr6+vrm2usCxtbGzt7fCtbOrrbOoqa61r620trnCyaeFeIqgr7WdamZnVllgSUlNUFRsd4emsLe+ubK1sry5vLa5vrWVoKudqHSuycTAvb+5s66yvLquu7Szpquorbq+uMvCv76sq7Cvs7q3ub67wMXBu7y3sLXEtb+0uLu0u8PCs7a2sbisqaWrsr23v7+7u7exvL28trGvq6uprbOvsLCrsLSpuMC2sqm0tbC3tq2spqu7s660uMKwsbG1sbK1saywsri4ubi+tLGzrqyxramvrqqyuK6trainoZ6ptr+4ur+wlol9gHxxdHd0d3JsX2NhXF5PSUI/PUlERk1EQDc3NTs6OT48PDk4PT47PT86ODMyNTc2OD8/Qj86OD4+PTw5PDk7Ozo8Ozs6PEA+QkI9QEE/QkI/PDs3OjxBRD5CQz8+QYqgm6GdlJiVlZKYmpyWm5WblY2bj4SIhru0vb+7vLm3s7y8rLOytLS2wLXAr7Kzqqqxt62pubO3v8WqiHx2jKGYYFRDWFVHYWpWT0VKYY6hrK+2urW0sqy8ubi1uMG9i5qzpqp0psvCv7m6ta6lrLOxprCtqJ2gn6WttrXCt7a0paiqqLC2s7K6tbu7u7W4trC2xLK+vL+8ubrFybq9vraxp6SeoamxrrW5trKxq7S2trGopp6gmaWmpKynq6y2qa+6sa2kpq2lq7GrrKmtuLawsrjBtrGxtbGvu7ayt7W1sry1urKwsbKutLKqrq2nuLWyta2uqqiosrq9wLa0qY6Ce393cHxvdnNuY15nWV1dU09OQT9KQ0FKSkA2NjU7Nzg+Ojs4Nz4+PDs/OjkzMjc1NzU8PD48PDg+Pjw8OTk5Ozs7Pjs7OTw+P0E9PEJAPz9CQD47Njc6QERBQ0E/QUKJoJ2loJSWmJiVnqCcl5uYmpGMmYmDhoS1r7S7u7S1sLG2uq6wtLOvtbq1urC1s7KttrqvrbyzuLi/tJCCeYiQb09KP2RZQk53gJRqTkFcgrC1s7WytK+su7q4trm/xnaErKCcZam/uLWysa2tn6Smp52kpZyWmZmZn6muuayrq5+lqKSrrq+nsKuvsbGtsa6usLmwtLy+uLm4x8W8vLu4qaKcmJufp6assq6zqaapqq6popqXl5GcmpijnqKir6ekrKaompqemqGnp6anqa+2squ0trCqsK+xqbm2sbWxrqy3s7avrquuq7S1ra+rq7GtsbKoraurs7W3ur2wq6GLeoJ5cndzbXVqbF1ca1VeXFBOSERHTUJHTkY4NjY1OjU6Pjg7OTc8PTo7PTo5MjM2Nzc3Pjs9Pjo6Pz48PDw6Ojs5Oz47PTk8Pj1CPDtAP0A/QT8+OjU1OkBFQkRBQEJBiJ+ipqGYm56dmqWpmJudmpmUjJmHhoeGrq2uuLmxsqiur7iyq7CwqrK1ubm+tbK4tLm6trm7tbWzt7aVjIiEfFhGQU+HWUpKWHeNgWNBU6O5s7SysLGtsLm4tru3u7yQorGrpHOssKmrraujqKGdnZ6Xl6CVkpaXj5ifqK6ko6Sgoqaio6mpoaanpaqtp6ynqKesq6yyu7SztLm6trK2ramgmpaWm52fq6yqr6Oko6GpoJuTjo+QlJKSmZaanaSloJ+ep5iVkpSZnqSjoaWqrK2iqaqppKmtrqW0sa6xraqprq+wraWmqqSos66trKmmpqmrpqqnq7Ksr7Oxq6mWgX+Bd3J5aHV0bmVVYWRXXVJPTUlASVNFTkM9ODg3NTo3PD46Ozw4OTw7Ozw7ODI0ODk3ODs7PDs4PD0+Oz08Ojk8Ojs9PTw6OkA9PDw7QD5CQEE/Pjk1ODs8RkFDRD9BQYijpqKjnqCfp6Coqpufm5yZmI6Xi42PjKqpqLGvsK2lp6ayr6mmq6CvsLu1vby4wMG+vLy8ua6sr7K8qZiZlGhNP1J4cVBJSUtnnIBaRVOvu7Gss6+urK22trK0ta6ppp6am52fpqieoKipn6GnlpuWl46dk4+Qlo2Xm6SooKCioqGlpZyjo6CepaCkrKWmqKSio6OrrLOuqa6urqeqraisoZyamJmYm6qoq6ufpqKbo5yVkIyPkJCTkJaVlpifnp6amaaXk4+Slp2ioKWipqSnoKKko6Ghq6uksq2qrKyno6yuraufoaKkpK+srKmmo6KqpKqqpKmrpqmsq6ahiHiDfHZ/emN3bW5dUWlVUE9HUE1NQ1BSQD47PjQ5OjU7OT07Ojk9OTk8Ozw8OzkzNjk5Njo7Pz06ODs6Pjw6PDs5Oz07PDw9PjxAPT88ODtAQEE/Pz45NDk8N0FDQkQ9QEOOqqSjoqGinaulpqimoZ6dmZ2PmJWTkJWnpKGmqKmlpKChp6uhnKKbp6u1sry9wMLCwL7AuLSnpKyovcKqpb1oRFKdglFXSUpgSlWNYWRjga61qrK0rqqrr7Cys62lnZGXk4+XoJ+ioJyjpJ+eqJSblpaMl5GNkJeTmJ2jqp+fn6Cjpaicn6ChnKKfo6ionKehoKSfrKisrKCpq6agpKimrKOenp6al5qrpqqxo6WonqCclZOQj5GRmZCWlZiXn5icmZukmZeUlZqdoJ2nqKWgo6Kho56doKmqpa6upqipoaKqrqqnoaCio6msq6eppqShqaKlqaalpKKmpKijkn58f3V2fW5se2RpVlJkTkpIR09TTktOSDxFQDwyQDg1OTs+Ozk5Ozg6PDs7Ozk5NDg7ODc7Oz48Ojk8Oj07Ozw9OTw8PD49PUE+QEJAPTc6P0FCQEA/ODU1PDpAQ0BEPkFGlq6koqWeo6KpqKipqqWmnp2imJiZmZWbop6bnqOioKOgoZqgmJeXlqGorK62t7q5ure3u66ooKGpoKrGv8qgUEFznXZPbUpLY2Z0c2BbYHGQsa+us7Wqpqyso5uZlI2RlZaYmJyfoqKcnaSemqSXl5eWkJKRkpOal5ugpKqeoaGepqerop+gp5+dn6SnqZ6jpp+qnaqtqq6nqLClo6Smp6ymoqWimpmer6iusqumq6qgm5iYmJWTlpqTlZWalpuXl5ihnpyclpuhm56ao6eln6GioqOdm6Gmp6aoraOppZ6kp6mkpaWhpaSsrKmmq6eioKSjpKenoaCgpaKmoIl7gH13eXxleXpgYlNVYUhJSktTVEpTUU05P0E2Nz02NTs6PDw5Ozs4Ojw9Ojs4NjU3OjY5Pj0+PDk5PTk9PTw+PTs7PDo+PTw/Pz9APT03Oj5AQEA/Pzg2NT08PkFCRkBAR6CupKaroaOqrK6tp6ypqKCipp6bm56aoJyalZmfn5uen56WlJOXk5KcnqSorq2sq6uvqq+pnpeepZykxsaMV1NKZaRaZX1vclxRa2NbZWBea4+0sLC4rKahnJ2alJeamZCOkZWRjI6Nk5minJejmZqXmJmUmZiWnZufpaapoKaknqeurqumorGjmqSmpqqioaqiqaSosquxsqu5qKarp6urqaysp6Ggo7GusrG0qrKuo5mcnZ6hmJubmpeZm5SWm5aZnKWhoJqjoZqdmZ+kop6gn6KmnZulpqWkpaijp6OepqOinqaloqWlqKykpq2noJ2eoJ6gpaGenqWgppmBe4F8dnZzaYJsZlxTWlpNUUtPT1ZNU01CNz5DNzg9NzY6PDw9Ojw5ODo7PDo7OTc2Oj01OTw7QD03ODs3PTs9PT06Ozw4Pj09QD5BPj4+ODg8P0BAPT43NTg9Pj1BQEZAQUihqqCrq6GkqquwramtqaelpaWkoKGfnqWXl5SYmZ6YnJ2blo+VmZKRnJihnaqip6Cep6Gln5ySm6Kan6qjjHlVaXF2dXBjdnZYWGNgY2haWVdnra6sr6efnqKglpCTm6CbmZeSk5+coaObnpuWn5qfl5uinqWhnqSfpKitramsqaSstLe2sKe0rKKtraOvpaSmoamorrWzsr22vrCssa6tqaq0sbCoq6iztrizuK2ytKSgnaWgrKGhoqGgmpiWlZ+bm5iloaCeo6Ggn5ucpaCfnZyhqJ+fp6meoaOkoKagnqehn5ymo5+ipaOooKmrpZ+dnZudmqainpyjnqeQgYKAfXh2anh1Xm1bUmFJUlVIRlVXSkNNRz1LSThFPDc3Oz49PDo8OTg6Ojs6PDk2Njo8Nzs+PT8+OTc9OT47PEA8OkA6OkA/O0A+QUA9PDk3Oj5APzo+NzU4PT0/QUBEQEJGnKueqamipamprqimqqWmp6aoqqGlpKOmkpOVmJacmpqcmpWTmZuNk5+ZqJ2un6eenKGdnpqZkpiem6GhoKOAb4JwYGNYTFtSWk1MUFhSSE1NR5isqqmloJ+akpGUmJiWlpaMiIuOlZ2dnZyel56Zpp+gqKWxqqeuo6uutrC1srGutri9v7qttbSwt7CutKmmpKWsqbmztbvDvMPBtrq2q66xubi8r7OwtcK8t76zs7WirKKpqbKpq6inqJqZnpqqp6CZp6Cfn6iopaSenaqiop6bn6igpKetmZ+jnp6nnqCmnpycoqGbo6KhnZympaWkn6KZnJukn6CboJyjiYWFfnZybWl3bWluXFhcQ1dOSkdNSENGTj0+TD40PDk2Oj0/PDs6Ojg4PDk6Ozs8NTQ6PDg5Pj4/Pjg4Pzk8Oz0/Oz1BPTo/PjxAPj8+Pz08Njs/QT07Pzg1ODw8QERCREFCQ5WqoKapo6mqqKmjoamgpqinrK6lqaWpqpSSl5mUmpqanJiYmZyamJmqoLGit6Swpp+enZ2XmJWZnpuco56dimJXXmVgV01RRz0/QENDPz5CUXipramqpp+en6KjnZ6dmp2blJOVlJ6emJSFnZqgmqukq7KwubKysbKxur28vLm2uMO+v8K/trq7wMS5vbusr6exrbHCtrjCxsDIysDJv7C5ub25wr64tLvGxL3DvLezqrOtqrO0r7Ouqq+jnayotrGto7CmoaOwsa6wpKWvo6GgmqGmoaSqqpmdoJmao6CmqKGcnqKemaSenpiYo6OhpJ6mmpuipJ6fm5ubnIeGgXx0cmtsdXJxaFdcUUZVSERKUEk/RUI0Rkg5NTw+Nzs8Pjw8Ojo4OTw4OTs4Ojo4Ozw3Oz49Pj02OEA5Ozs9QDw9QDk3PDw7Pj0+PUI+Pjc6QUA+PD45NTg9Oz1DQEFDQkGRqqGlqqelqqimn6KnnKasp7Gyq62jqayVkpWalJecoqGbnqCinJ+psqu7sr+rr6ylnqCgnJyYmp+gmqCflXxfXmVgUUdFPEM+Rjw+OTZOfqqzp6OjoqCepaumnpeclJGanpmVjIqGiIZ4bYigpKKrrLS8tsO9vrO7wcPCxcC/wsbFxcPIwsDFx83QyMvDsre1vrK+xbu+zM3FzMzM0se+v8DDvsfGwrfDysnDwce/urS6u7W7t7C2sqq6sq68uL+7uqu4rauquLu1vK6uuKOmo56mpaKjqaaZm5+Zmp2nqqegoaGkmJSjlpSZkZydn6Sep5+en6KdmJmUmJSIhX56cmtkaW94a2VaXEZMTUVEVE1FQ0U3Oj87NTQ5OTc5Pj87PDs7OD48Njo9OTw9OTw9Ojs9Pj4+NztBOj45PT45PT44Nzs6Ojs/Pj1CPj83OkFAPTw9ODY2PDo8QT9BQUE+kqugp66ooqulpKKipaGlqquwsq2upKmmlJWWmpaUm6SmnaGqp6KrrLy8v8PBsrK4p6Ghq6qhnJ6hoZ2bmn1zamFXT0U+SVp8b2JCPVyOrqygmZubnp6Zl5eXko2Pl5eUj42QjIKDgndycW1wj6atrrS5xbvNx8u+wczNzczIyNDMzMzHysXGzNDS1c7Tyb3Av8O7xsXIxdHTzdPQ09PMysHGxsbKyM/AydHNx8bIxsK8xMG+v7+2vrOtv8DDw8fEx8Svv7myuL3EwsK6vLy1rqenraigoqmlmpagmpmdqKupo6SknpePm4uQmYmVmJugn6OdnZeempOTi5WPhYF5dHNlYmdyb2deWlpET01ERVBJRENBNTU1ODlCPTY4OkE+Ozs+PDk+PTc6PTk6PDg8PDw7Pz8+PD0+Qzw7OkA9Ojs6Ojg4ODk7QT88QD8+OTtBQTs7Pjc4Njo8PkI+Q0FAPpOvn6ivpqiro6KloKampKuoq62qrqKqo5Kcl5ebmJuirJ2frqalsarFxszOzb+wwaikqKytqqCdo56cnZVqZl1USURBP0uGnqWZhKCyraOenJ+amJeUkpSWkZCPjIeEhIiGg4CBgYB5cXJvbHmktrq5vsvB09HTyM3O0dPR0tDQ0dHNzs/Qxc3U1djR183Gx8nMw8XKz8rT19HX0tXW09TIzMbMzcnTzc7TzcbJysrCxszHycnGv8Ozs8jFy8vLz8fKv76/vcHHxczMycnAw8Cur7OonqKqo5qTnpyYnqaprKSlppaXipWFkZSHkpKSmZualpiQm5aQjIaRi4B7cnV2Z2NndmplVlhSRE5GQElRQz5CPToyMkE8RTw3OTxCPTs9Pzs7Pj05Oj48Oz44Ojk5Oj86Pj1APkA8Pjs+Ozk9PTw5Njo6Pj08PEA/Pjk6QEE6OT44Ojo6Oz4+PEE/QT6QrKKiqaanqKSfop2qqKOso6OnpqyiqZ+To5iWn56dpK6bn7CrqKyxyc3U18/Gu8esrbO3rK6jnqOinaGcYlRMSkRDP0NSr9G9sq+mnJycoKShnZqUk5WUiX14cWtlYmhycHJ7hYqAdXBucXNwhbPDvsXR0NfW1dLWzdTW1tTT0dLT1NLP0sPQ09bY1dXSy8rO0cvGzdLK0tXW2dbY09bYzdLKz9HMz9HM09DAycjLxMzNzM/PxcfItsDLwNLNzNDGysnAxMPIzs3Q0c/NysjNuLe7qJ+lq6efmJ6jnp2qpa2pqKiSlYiQhIyRho2MiJOVmZCWjJiSj4aHjIR9eHN2cGNgZXJjXVJcSktHQUVJSj47QTg+NTU4Njs4Njo8QD07Pjw7OUA7OTo8Ozs8Nz09Ozo+Oz08Pjw/Ojo8Ozs5Oz89OTU7PD48PD0/Pz46O0BCOzk/OTg7PT0+PzxBQEQ8hqugnKegp6Oim6CbqaSlqaCfoaGmn6ifmKSimqmmoqarmqOwsamotdDU19rSx8bLtLXBxbG1qKGkpaCioVpJQEFEQUZRdrKvppqUl5+cmqCgnpucmpWJd2ljYV9fX19eX19dYWx1c3Bwb2xxcXWSxMjH1NbX19bT1tDV1NnU1M7P1dTU0dHM0c3T19bT1dDP0tPRydPRyNDY19jR2NLX2dTWzM/Pyc3Sy87RwMbEycfPztHR0sjMzcDLzcbUz8zPyMTLx8fIzMvU1NHVz9LM08K5xbGlqLWup5uoq6Wdsqiws62sk4+TjoiLjoOPi4SQjpmNk4+Zj4+ChYx8enFzdG1iY2ltX1ZRYEpKQ0VDUk1APD40Mzo9NTI4NTU8PEA8Ozw6OTpAOjg7Oj46PTg+Ojo8QD08OTs9Pzk6Pz07PTw9PTo2PD0/QD08PT0+OjxAQjs5PDc0Oj48P0A9RkFEPYKknKClnaWlo5mcnaSeo6OfnZ+doJqnnpyhqZ+vraqqq52lrreoq7fY1NXZ2dHO0L+8zMm2vq6mqqiho6xmQzg9PkRYgqqon5eVl5manJ+dmJyckn1xZWNiX19hX15hYF9gYF9gZW1wcG5rb3J2d5zMwdPV09jY1tnR0tLXz9POy9LN1dTRys/M09bS0dXNz9XV0cXR1MrQ1NXWztPR2NfX18vIzsTJz8zKzMDJwcnKzs7Py9DOzszPz8jM0NDLzsvDysfJzcvM0tPO1NLR0NDKvci5sK67ubWrtrCtqLits767sZqOoJSRjo2IjpCFkY2ZjJGRlY6RgIWJenZvcG9rYWRucGFYXFtKRkZETVhFO0A9MzM8PDg3ODU1Oz5APTk8PDg8Pjk8QDtAOj04Pjk4Oj88PTg7PkI6Oj08OkE9PTw6Nj09P0A9PDs9Pjg7QEE9Ojw4ODs+PD4+OkVCRT6Bn5mlp6Cfo6eam5+cl56eoZqdmpyappufo6efuLa1taykrK6+tLDA2NLX2tzWzs3Kw9LPwcGxqaytqaSxekhGQjtXjaGblZOWm56enpyTlpeUiGteXl5hZGJgYGFhYGBgXmBfXlxibXJvb3N0dXZ5pL/M1dHW09PY1s7O08vOzsXOytLSz8fOzc3Uy87SzcvX1tDM0dTLy9DS08rO0dXS1dXKwMrBxs3CycrDzcTGycvLz8rOzdDO1MzGydDNycfLxcfCxsrMzdDSx9DPzs7M0MXHwbi5vcPDvcO5s7K+sbvDxLaqmKWhmJaSlZWSi5SNmpGUlI+PlYKJhnlxcmttaGBgcWhZWGhWTUdMSVBRQjtEPzs2ODo4Ojs1Nz09QDs6PD05PD05PT06Pjo8Nzs9OTtAPD47Pj5BPDk9Pj1CPTs3NzY/PDw/PDw7PDw4O0FAPDo8OTs7Ozw9QTpFQUU+hJ6bqK2epKSqnJ6fmJKXm5+am56ZmaKVoamppcTCwb+7tbKxx8K4ytXW2drb2MzMz8jW1cTCta+0qKCtl3hsb3B3j5qNjJeVkJORkZWWlZCLe2ViYmJgXV5hY2JgX2BgYWFfX11bXWdycnByc3Btcnmlx9POzNDP09TJxMjIxca/w8XPzsfFx83K0cjLzs3G0dLQzszUysfKzs/Hx8/Sy9DPxbrEv8bKvcPIys7Fw8fAx83IxMzKzM/IxMTQycbCxsnFv8HHzMvMz8LLzMnHy9DFxce7x8PJycLPwb28v7DByce6vaqxsqelnaKcmJCbkKOZl5mRlZiJj4J4b3Vka2BeZnFhW1dgR0hIR0lNVEc/Sj02NDM1NT09NDg9PT06Oz08OTo7OT89OTw7PDg6PDo6QD1APD09Pjw6Qz48Pz04ODk6QD4/Pjw7Ozs7ODo+Pzw7Ojc5PD49Oz49RkFDPYOgm6qupa6qq5qdoJeUjpedmpmgmpqcm6WysazJzcrIxL68uczMxtDV1dja29jQyc/P0dPIwre7u62ktn5ngoWiqpONjZaPhYODg4F9hIR+c2BbXl1eYF5gY2RjX11dXl9gYF9bWlxgbHJxbm9rbG9vfbnRy8LCz8vNxLq/w7q7urm+yMbCw8DDyMrJyMrIwcXMxsjKzcnEwcrJwcHL0MXLyL+5wbzGx77Axs/LxMDDu8nHybzJx8XKwb7Cy8bFxL7Gvb3Bw8XMxca8wMnDxcfSxMHJv8rKxsjG0cPDxsOuxMvHw8q3v7y6tKmspKWYn5iso6Gmm6Ogm5V8d3N1ZmpbYW5tWlxYUkRMR0JHRUxERlNANTQzMzVAPTM6PDw7OTw8PDg7PTtBPTo8Ojs3Oz05Oz07PTs6OD4+PEI+Oz88OTk7Pz07QD48Ozk5OTk6Oz06PDo2OTw+PDs+O0NCRD5/pZypsqm0rrCdnp6YnImUm5man6Kfmp2ov7i8ys/RzMfCw8bNzs7M1c/V2djZz8vSzc3OyMG1w76ysLZsXnl8n5GKkpaGeoCFhX91eHVycF9bW11gYGJkZGRlZGBcXF5dXl5gW1laXGJvcm5raWtwb3OPyLuYwMzAxsGwtrmxsbOxsMG7u7y6uMHBwcS+vbm9v7nEysXGwr3GwLe7w8m/wcm7tru6xsO/vMLOw8a+vrXBvcO7vce8w7q0vcbEwsO3wLa2vr+7zMO9trrIu7++y8PBxsPGycfJxtDGwszHssfJw87NwcXDv72yt7Cyp6ioubClrbCqrayUend4a2VoYGhvZFZeWUpGSkZIS0FGQkZKQTk6NjU4ODUzOzo7PDk8PDs5Ozk6QD46Ojw6Nzo7Nzo7Oz88OjxAPUA/PT8/Oz07O0A8Pj4+Ojk5ODk3ODo8PDw7OTo8Pjs7PjpAQEU+fqygrLWqt7SyoZ6fl5qNlJaan52mop2et8XCxMjO0srKysfNzc7RyNDG1dTV183KzsXJxcfBusW9rK6mYGN1gZKLiIuEeH+Ghn99g3t0dGNcXF1eYGBiY2JiZGViXVxbXF5cXl1aW1xeaHNxbWdnbm9yeZuOn8TDusC4rbCwpqmtq6W3s7W0s7O0u7a9srewtK6yu8K8wcS8v7q0srq+wLjIuLS8tsHCvbi9x8HEu7WvsrW6v7TFuLu1rLm9vsC9sbu2sLe6s8a8t6+7v7W3tcW8v8PGwMTFxsfMxcDGxrvHy8DPycfDxsHDt8O9vba5vse/rLW7tbe2jnl0eGdnZWJrbl5WXmBGS0hISkZCREFFRj89OjU2NjYzMzs6Oz06Ozs6Oz44PEE9PDo7ODc5OTk7PDo+Ozk+Pz1APz5CQD1AOjo+Oz89PTk6Ojo4NTY7PT48PDo7OT49OT86PEBAPIi3pauzsby8sa2foJmUlJiXnqujr6qnpMbLzcjFyM3M0MvNyMnIysnKxNDN0s/NxcfBxcG/urjJt6uwmVtnb4mOhoiJenh+hoZ2d4F8c2hdXV1dX2BfYGRhXmNlY19eXFteXF1eWltbXV9scG5pZmptbnN7ir+/uLi0r6qrpp2hqKadqaqxraqsqbSttrCzqa6nrLO7urbDubq5sKu0ubu0wrmvwLG+vLu2vMi5w7etqqiwssC2uL2wsaixs7W7vKyutqautq67srGqubCuu668uLzAwL66w7/Gw8XAvMbCyMu4xcfFv8fEw7rExsK7xsnMy7O5wr27s4l0dndraWBibGlZV1dbQUxLTUpFQUNAR0E7Ojo5OTY4NTQ6Ojk7PD07Ojs+ODtAPD05Ojc5Pjk7PDo4Ozs6Pj45QT0/QD87Pjo7PDo9PDw4OTg5NzY4PDw9Ozw6Ojs+PTs/Ozs+QDyKwKuouLe5w62zqZ2ZlJaZoZymsLWxt6bFztLLw8XBxM/HzcHCxr/ExMPDysLJyr/AvMG6s7W1w66qsJJbaX6SiI6Pe3h9iYV6e4SAd25eXVxcXV9gX19kY2JjZGJgX15aW1paXVpaWlpcZW5vaGZnaWtucoStubC1raSjpaWZn6OfmJqkqq2kqKKrqqyrsKOmn6qttbaxvbivt6+orri0tLy4s7ywuLm2srzBssGvpqmjq7GztKi9qquoq62utbSmqK2hpK+psqaoqK6lqLessbO3urq7sry+vr/Fv7XCwcfIt7/AxbfEw8C7v8TCvsTIzMq/v8TAwKmHc3RzamlcYW9kV1ZYUEhaUlNLRkZFPj9AOjc4OTc3NjQzNzo5OTo8Ozs8PDc7PTs7Ozw4OT44PTs8Njo9Oz89N0E+P0A/Ojw8Oj05Ojs6Nzc3ODg3OTw7PDs5Ozo8OTc5Pjw+P0E7jMKvrry3ucSwtrCbmZWcmKqpsLGztb2vxdDPzcPHubnLwsu+u8m2vcO+usq3wcPBtLa8trGvtbytqauSY22Ig4eLgHp9f354dH58c3dlX11cXF5fYF5fY2NhYmBgX15dXFpYWVtbWVhaXF9ma2ZkZmVoa29yhamlq6Ocmp+jk5ujmZaPoKGoo6OfpaWnpq6gnZukpqyysLe3p7CsqKq0q7S6sba2rra6s7C7urG3paCkoKexqKypuqqlpqeop7OtoKinn5ykpqyfn6ekoKGxra2ssrWztLG1vba7wcCyu77DwbK5ucKzwL3Atbi8vb68wsfEw8S/wMSghHhxbGJmYGtvYFVZX0hOaE9USEZLRjw9QD06Ozs4MjY1MzY5OTk7OTo6PDo3PD88PDs8ODg8OTw6Ozc4Ojo8OTg+Oj89OTg8Ojs+OTc3NzY3ODg2NjY7Ojo7OTo7PDg1OTw6Pj5AO43Itba9uLrAur21oJ6UnaGmurars7O7s8TPycvCxri3x8DMv7jKt7vFuLPFuLO/wKy1vLKspq+0raGjkmlyhoWGgHx4dXNvbWppaXBpX2BdXFxcXl9fYWNiYGBgYF5cW1xcWFlYWFhWWFtdX2RjY2ZnZ2drbW6Hnaidk5OXnpSZoJaUi5ygoaacn5+jpaOnnpuinJ+rsK2xtaSpqqqsrKW0uK23sKyzta+ztq+xqp+en6SisqWmqrmtoqamoKitq5mgoJ6ZnZ+lmpqjnJyesKmsqKqrrK2ws7mvuLm6sLa8u7qss7O5s720t7GxtrW/tb3AvcPCu7u9l4R7c2xfZV5kZFhUV15JV11LUEdKSkdBPD8/QTs/PDA1NTM2Ojs5Ozg5OTw8Nz4/Oz07Ozg4PDg5ODw3ODo7Ozo7Pzo9Ozc4PDo9PDc0Nzc2NzU3NDY2Ozc5Ojs6ODo5ODo7OTo8PzuJyba4vru4wcHBtKSkmZqkpsCyr7astbfFz8jIwMa7u8PDz765x7i4v7eywrSxu7usubqxop+pq6eYnpBtfoWGf3hybW9ta2JeYmZmXV1eXV1dXF1fYGFiY2NiYV9cW1taWllYWFdXV1hYWFpdYmRkZmZmaGlrcoynmpCRkZiUmJ6TlI6aoKCnnpudpaaipZufoZqZr66ur7KhpaOuq6iitbCysqypsLOou7OntqGjn5yjoq6joqq2q6Ojpp6mpqOWmZ2XmZudoJqXnZydnK2hrKijpKatq7O0qrWwsquzubSvqrCysrO3s66pra6yt7C6trq9wLizsZSGeXVmX2ZfW1pWU1pVS1tRTEpFSEtJQz0/QUFAQToyNDUyNDk5ODk7OTo9PDY9Pzs8Pjs3Ozs3Nzc+Njo+Ozo4Oj07PD06Ozw6PTs4Nzk3NDY1NTQ2Nzg1Ojo4Ojk5PDg3Ojg5PkA6gci9uL2/tr68v7OdpaOYpbHDtba9rbS5wczIxr/FtsHAx862wMO9s7m5sr+2sbm7rbK0r5+ao6qhlJqPeH+DhH94b3F0cWhlZGllY1xcW1tdXVxbXmBhXl9fYF5cW1pcWllYVldXVlhXWFdWV2FkZWNkZWRkaGp2oJmQkI2Rk5SclJeSlZ6coJyWoaGpo56eqJyamqunr7CrnKOkuKqhoK+ot6unp66xpLiwpLego5yZmaumoZqtubCjoaScoqCfk5ShlJaWm5mYlpeclZ+pnqqkop2jqqqxrai0rKqnrbOwpauus7GvsK+vp6iosq6xtLC8tLq4r6OVgnp2ZV9hV1lYU1JUS01eTFBMR0hMS0U9QD49Qjw6NzY1MzQ5ODg5OTo5Pjo4Pj47PTw8Nz49Njc2PTc7PTs5Nzk7Ozw+OTk6Ozo4Njc2NTQ1MzEwNDU2Nzk6ODo5Ojo3Ojs5OT1AOnbAvLS6wrG+t72unaenoqq7wL3Aua60uMHMx8XCw73FuMjMssHCwa68u7W7vLW5ubCvsKqcmqGplZGKi4CAfHdxaWxydHBoaGVkZmFcXFpZWlxcXF1eXVxbXF5cW1xZW1taWFZXV1ZXWFdXV1ZbYmNjYmNiYmNmaYCSjpGJjpCRl5WZk5SZnpuelaCfpqWjpqefnJ+moKuvpqCio7eooaGiqbOipailsKaxrqy1n6GdlpWpoaKUrbGxn6Ojnp6Ym5OLoZSRk5iYk5eYmJeep5unoaKapKWlq6SlsKelo6usraaprrCvq6iqqrOmpquvtLGuvLaxsK+gk3t4c2ViXFtdWE5MUUhSYU1WUE9KTU9FQkQ/OT02OTo3NjQ1OTk7OTg4Nzs4OT0+Oz47PDY5Ojc7Njs3Ozs6ODU6Ozo7OzY8Ozg4NDc3NjMzMjEuLzI1NTY7Ojg7Nzg3Njw7Ojs7QTh4u7uxtr2wu7G3rJ6lpqy3u7zBxbqyubXEycnAw8bFx7bGxLPBv8Wrt7e9tr26u7WyrK2omZmfo4uKdImIfnZuY2FmaWhmZ2lmaWxgXVxbWlpaWlxdXFtcXl9cWllbWVlaW1dVWFdVVFZWUlRSVWBhX2BhX2BgYmRpfo6Oho2LkI6QmZGTlaKYn5acoKWhrKWkpKOko52rq6Wan6WxqqGhnqWqnqiin66sqqmuraKiopWYopuckKupsJyfop+fl5iTiZ6RjZKTlpCYmJOcoaOcpKCilaCipKWbo6uloqOrpKutpa6yqqalpqa0pqqorbO1tLm6sKusnoxzcXBgW1dWVlJHUU9IWlxPUkpUS1NMRUdKRDg7Oz48OTY2Nzo5Ozo5NzY5Nzc6Ozo9PDw2Ozw4PjU5ODo4ODY1OTo7PDk3Pzw5Njc4NDUyMTIxLi4xNDI2Ojg2OTg1OTg5ODk7OUA5e7W0rLS7srCrsq2dqKevubmzwMi6tsCvxcjMusHJzMi1ybyxvcPJrbG4wbW8wLy0taqsppaanJyJgXKIg3t0aWlqbGdqbG1ramxlXVxcW1tcWlhaXVtbXmBgXFhYWllYV1hXVFVWVVRVVVJSTlFZXVxdXV5eX19iZG2Ji3+NgouNi5aQkZCbmqGbm6CoqauorKeppqSZpa+klZmlr6mgnJmboJ+umpyrs6Cmpp+ipKGUlJuWlpKpqq2bnZ+hoZuUkIyZjoyRjJKNlpWQnaGgo52co5WboaOhmKKoo6Koq6CrsKSuuKajpKOsramoq6+0t7K9tbOrr5iFdXRpW1hZUlVSRlhMUVtYTVVPUUxRUklOSkI9Pz9BPz03NTc5OTw8OTc3Ojc5Ojs8PT47Nzs7Oj02Nzo7ODk3Njk4OTo2Oj05OTU3NzU3MTE0MS0rLzQzNDk4ODo6ODo6NzQ4PTg/OX6zraeztq6oqK+um6morLe2rLzKu7a/rMvGxbjBzs/Hs8S6t7vCyLGtuL+3vL67s7amqaCWmJmXiHp0gHZ3bm1obW1tcGdnaWZkXVpbW1tbXFtZWltcXF5fX1xYWFlYV1hXVlVUU1VWVVVTU05PUVlaWlpdXFxdX2Bke4h9hnqIjIaPipSPlZegn5qfq6mmr6yosKWpmp+toZWWpKinnZiQj5qer5eZp6qZoJ2UpaGfkpGSkZOVqKulmpmZnp6XjoyLk4aJjYOPi5KVkaCeoaSZlp+VmqGinpSbpaWnqaigsLCmsb2ooKOstKqup7C0sLm1wLGusauQfnJ0Y1ZUVk5SSkdWUFJSTExYTktNT1JITktBQ0ZERD5BNzU4ODk7OTo3Ojo3PD06O0A+Ojk7OTo/NzU5Ojk4NzY5NTg3Nzk7ODU1NzY2NjEzMjAtKi4xMDI4Nzc7OTk7ODk0ODs4QDh/tKymsbeqpaKxq52qp6mysKS2xrS5urPKxbm6wcvQyrK2uLy9wMOxsLG3rrS0u7O0o6OdnZiXlYSAdmtnbG5xbnJqb2tkZWdlXlpZWllaWlpaWlpaXFxdXFpYWFhZWVdYV1VVVFJTVVNWVFJOTk5SV1haWVlYXFxdYWp8dntxhImDjYaViJKSlpqYnaiboKumpqyeqJmgppyTj5+jmpeXhoWSm6SQlaOdlpaWiKKbm5SMjoqQmqWnnJWVl5uRk4iUjouBjI2AkIuSkpKhmqCilpSZmJWippqNmaSnqaehoLSyqLO4oZ2jt6ypraSzsqa1u7WrrLGjinpzbl5OUVFNT0ROTk5QS0ZOTkpKTk5RSU1KQUhMSEhDPjk1ODg4OTo7Njk6Njg7OTk+PDg6Pjk7Pzg3ODk6ODg2ODU3Njg4OTc0NTc3ODIwMzAxKyktLzEyODc2Ojk5OTk4NDk4OEE3d7ampLexpaekqqWgqaaks6qissO1tbKzxsa3usPKzMazrLm9tLjAr66psJ6mrruvraCam56VlYh8hG5fX2ZycHZxam5pZWdoal9YWFhYWFlZWVpaWVtbXFxZWFhXWVlYVVZSU1JQUVRRU1VRTU1LTFNXV1ZYWFhYWl1hbm5ybICEf4V9j4KNiJKQkp2hjpqdo6KkmKWWopyVjYiZmoxzjYN+jpeWhpKakJSOjnuZj52NgomAipigo56Qk5iWhY6DlH5+dIqOepCIk5CQnZuampKWkJ2Oo6OOiZqgoaSkm6K0r6ywrZ+YprimpbChsa6csbyqqa+qmYN4dGRWTVJQUE1DU05MUE1CUFFISU5TTUhKSkRLTUZLSz03NDk4ODg7OzY5Ozc6PDk6Ojs3OT85PkA3OTo8ODk3NjQ0NDU4NzQzMTI1ODUvMDEwMikoLC0wMjc2NDc4OTo6NjY6ODdBN3i3oaO0qKalqKOlpaamprKnprTBuK+0sMnEuLnAzsa+s6y6waytxK2ooqaSnaa3raOgkJaXkpB+eH9mV1ZfZ2ZpZ2hvY2lpZ2JcWFdYWFhZWVlZWVlaW1tbWVlZVldXV1NUUE5QTk9PUFNUUU1NSkhOVFNTVFVVV1lbXWlobWh7gXlxTVZwjoGVhYybl4qTkZ+YnZWUlpSPloqAlIlfO1ZvfIyUioCMkoyQhoZzi4WXgXmBe4aUnZWDlo6RkIOGfZN4cXCGjX2JgZCOkJeamZOLkIqdiJ+YiIiWnpqhoJenrqmtqamelq2zoqaumaysmKi0o6mto5N/dG5gW05TUldMRFRKUE1MRk5PSUVMUU1LT0pJTVBGSUo9NzU5OTk5OTo3Ojs6Pj44Oj09Nzo/OD4/NTg5Ozc5Njc1MzMzNzYwLi0vMzQ0MTEwLy8oKSsrLTM4NTQ3Nzk8Ojc5Ozg2QTl5t6CjraGmpqmgpqmno6qwqKe0wbmwtbDHwrizvc+/ua+utcKnqsSqop2Yg5ScsaOamIeUkIuHfnN2XVBMUVVZWlddXmJnY19ZV1dXWFhYWVpZWFlYWVpaWllYWFZXV1VTUk5MS0hHYlxNTlFNS0lGSE5RUU1PUlRWWFpga2pkdn5xTkE/f5WRkHyHlIyEio2bjpaViZKIhpWHeYl/YEpRbniLkoR+hI2LhYB/bX9/lHh2dniEjZpwUY2IioZ8fniUdmh3hoh+ioiVi46Rk5eMhIqIlYSbjYOEkpuWnp2UpKKoqaWknpuwqqGkpJKmqpaiqpyhpqiJdm5nXlxIUVFTTUlVTVJJTEtPSUhGSk5MTVRLUVFPR0pEPTc2OTo4Ojs7ODo7OD4/OTk+PTg7PDY7OzQ3ODs2Nzc1MzQ0Njk2LzMvLjEyNTIyMS8sJykrKiw0ODMzOTg5Ojk5Ojo6Oj85d7aco6edn6Guoaeopaeor6yqtry2uLezwbu2qLnIuLaoqLW2qrK8p56VjX+JlKmWlYt/joOCfnhxb1hNS01OT0xNUVdbXFpYWlVVVlZWV1lZWFhZWVhZWVlaWFhWVldVU1BNSkVAQJtrc3NJTUtFRENJTk9oWU9RU1RVWm6BcHN6Z2ZaU4+JlIdzfoaAfIWMk4KSmYuPe4aPgHaAeHNvdXF0jo6Ben6Kq4V6e2l2e45wcm14gYuNknh7gHuAd3NzknhndYWEhIV8lYqIio2LgH+Ei42AlIR8gI+YlJyWkZ+dqZ6goZ2gqaWenZiNp6SToJ+Wnp+kgXNpYl1dSldQUkdLWFJPSk1MUkpKSkxQSExRTFJUTUZJQj03ODs5OT49Ojs8OThAPzo6Pj03PT03OTkzNzc4NTY3NTI1MTQ3Mi8yLiwvLzIwMC8tKygoKS4xMjcyMTk4Nzo4Nzc1Ojw7N3aumaOhmJ2ftKmvqqWtq7Cxqr20sru4trq0sZ+3urKqnZ2sqaiyr6KakY2UgY6cjpF/doZ3fHZvb2pZS0hISEdFSEhQVFRUV1dTVFVVVVZXV1dYWFhYWFhYWVlXV1VWVVNQS0Y+OTNOPH6eTUhKREA9QURqlH5MT1FRU1ZedYJ6dmR0i5WYjY57ZnmAdnh/iJB8g5iSgHGHj3x3e29rfq19dJCLf3qGkoF9f3RmdnyGbG9oc3yKjYeAbXlxfXFtdo9xaHGBfo5wRIuFgoOFf3d3eoyGfYx7dX2Oko+Yi5Kam6OWmZ2anZ6hnJaNi6Wbjp2XjpaYkHhvbmdjW1hYVVFKU1VUT1BOUFZLTktPT0pST0hOUExGRDw7Nzk7Ojo/PTk8Ojk5Pz87ODs9Nzw5OTk5MjY2ODU2NjMzNTExMjI0LiwsLS4uLTAtKyonJyouMTM2Mi84NzY5NjY1Mjc5OTV5ppegnpagprCsrquoqbGvsau8uKy7vrizrKebsKesm4+WnaWppKGYmY+FknmJj4uLdnF8bXVwam1qWEtGR0VBQENESExMTVFSUFFTVFRUVVZWV1dYV1hZWVlZWVlWVlRTUUtENzhmNzA/qGlOSEM9OzpEioV6WkpOUFFUWF1lb3BqhqWqwH5zeGJ7d257eIePeXuLhm9tjJJ5dHlqaoCCcZaRjIF9lYBKk5luaHd+gm1qZGx5hZCShmtybHxucnyGaW1wf3ONiYWHe35/e3dwdHSGgnmBeXB8jouKk4OWl5iakJOWlpmXnZaMg4mfkouSjYaQl4Bvam9vb1lWWFRSUVlPUlRUUlhVTU5ITUtNT0tDSU5HRkA6OTk7OTk6Pjw5PDs6Oj0+Ojg6PDk/ODY4NzI3NTY1NTQxNDMyLzAyNCorKiotListKigqKCcsLTEyNTAsNTU2NzQ4NUhBODk1d5mRm5ibn6Wtr6Ktqqi1r66stL+rvMO/paKalaSYno2Ei5ShoZiZkZOLc456gIaMhnVvdGtwbGRsallOREZDQDw+PkFGRkdLS0tNUFJSUlRUVFRWVldXWFlaWVlaV1ZUU1BMRTFAmjMganNDmW87PDk1PICChl9JTU9PUlZaUVhbX6aHYZlncnhkfW9sf3mKiHWBh4V0bJqSdHR8amqdjk15hZOJhI5nMXaHc2x+foN0ZmV1f4SEhYBmaWx1a3CAfGhxcXxuk42PfHR+fXFxbnVtgn93eXVqeYiCiImDlpKSkIuNkZSUjpeNgHmIl4iHioaAkIh4bGtwaGVYUltYWVlbTVBVVllYTklIRUpKSEdDQEdFQ0c9OTk4Ozk6OTw6OTs6OjpAPDk6PDk4Pjc4NzcxNTIzNDUzMzY0NTAzMS8qKispLCwrKykoKycpLCwyMjYsLDQ3NzU0NzhpTzg7NW2SiJqQmZakqK2esZ6nuq+rsrDCsbvDx5qWj5SZi46FeoSQmJSNkIyPhnGHgnSIjIZ6cHJwb29kcWdfVEZJQz48Ozk6P0BBRENFR0lMT1FRUVFSU1RVVlZYWlpZWFZVVFNQS0U4MC9cYLNHOVhQOzk0NDGWuotITE1PT1FVTEFJUUlir7KfcHp2a3xscYKBhIB6hIWFeXKglXR4gHN1lIc1cZ2onY6hoYSjhXZwh3yHfHSMro2JgWhnYmpucm1wg3VpcFh1cI6bkXZtf3t9bXJucIB7c3ZuYnWDf4aAhZCQioqJkYuRi4uOg3V4io6AfoOAfY57c3FxbWBbXV5cWllhX1JOW1pYV0xISkZJRz9DQUJHP0NEPTs5Nz07Ojs7OTo5OTs6Pzw4OD06ODs2NjY1MTEyMTI1MzQ3NDUzMS4vLCwrKSopKSoqKikoKikrLzNETTIxNjY2NDM8dlI3PTdikoGSiJWRnaSnnq+VpbSprrCuwbK7wcWWkIyUj4CIfG6BkJKJg4qHj4Z1goRslYiIe3V4eG13bndkal5JUEc9Pzc0NDk7Ozs9PkBCRUhMTExMTlBRUlRVVldYWlhWVVRTUExFPDUqnUtbQC1nSTk0Lz+Sg6muX0hMTU5QTDdDTVFTREuFdH97e3V+bHaHh3t8hIN+i311opp6foaBhJmEmpxhhqqfnYqDkI56d4l+iYiOc4uXj4R7XWRxdHp8d4ptaGpieW+FkIJ6b4F4dYR6cHR6eGtuaV12hn2HfIeGjn+KkpeDjYWMhn1xhH+EfXZ3e3yJeHF0dWZnYFtbXlNcZ15XUFRYW1VHSkpFS0c/RkBEQz5BQT07OTc8Ozs9PDo6OTk7Oz0+Nzk+OTk4NTY1MzI0NDAwNDY0NTU1NC0sKSsoJicnJigoKSkoKCsrKy8wMFVxPTIzMzMxRX5XND05XI14in+TjJGcnZ+mkaCqoLGor8Cyu8W6lo6RlId7hnZrf4yRgn2Kg46MeIOAc6CEin19gX9wgX56aHZsUlhMQEUyMTEzNzY2ODg6PD5BRUdGR0pLTU9QUVNUVVdWVlZUU1BNRkA6Mj0gI5ZjjFs1MzExaT9Hb0lGSUxNT1FMS1RdWVJLaIKHeol5e3F8j4t5fIiGfpaHdqGaiIePkpSlja2pSIaur66LgYCUi4KLgoSSqYeAmJiKnHRtfIGGh36OaGdoeX9uhYeChXGEhkhsgHdyeXZobWtfdn2DiH+IhIt5lZybiYuIkX96dYp2fHhtb3d+gXV1c21cXl5bY2RYZ2VcVFBQVllQRExLRk9JQ0ZDQ0BAQ0E9OTc4Ojo6Ozs6ODg4Ojo/PjY7Pjc1OTU3NzMzNDQyMzY2NTY3Njg7REZMTU1MQzcrIiUnKykrKywvMDArbnUyMjQyMEyBXDU9PF6EdHx9iYWHkY6Wl5KWoJ6soKa4r7O9s5eNkouYi310cH6Jkn59jIOSlH2Gfoakh4h/goiFeIeJfnOEeF9jV0tCNjAuLzMzMTIzNjY4Oj0+P0JFR0hKTU5RU1RVVFRWVVNRT0dDPzgwLCOHWz8/ODQuXZZwc6NVRklLTU1QV2BZb1lcXmmMkoaUgIOBhJGSfoWIkYGalYKhoZiVm5qmrZOZu7Gnu8fDqIuMoaWOlImBkXxxg56fkZ1/d4WFi5CHkGlocISBdIyHhIpyhoJ3iIB7doR8bnZ1Zn+UjoeIiYeIh6GropaJjpd/eoGIeXlwZ2t4f3x/dWxlXltbXmpeYmdgWk9MTldSUUlQSkROR0NKRENBRERBPDo4Nz08Ojw6ODg3Nzg6PT04PD02ODc1NjYyMzQ0NDU3Njg2NzxCQj88ODo+Q1FeZVxHMicmLCwtLS4xKD+LWy4zMTBPg180PztudXBmd4N6f4x/gZCOipqbpJ2hrKarr7CXkZGEoZSEeHd/jJR8fpKGkpV/ioCSm46DgIGMioKJjYN/ioBtcGpdQkA0LS0vLy4uMDIyMzQ3Nzk7PT9CREhJTlFSVFJTU1RSUE9IREI8ODcvOUM+PDw2My5sk5dNUElJTExLTlZgY39mZ210m5mOmZKSio2OmYiSj52LoKCSo6qlpKyTqbaiqMHCrseveLqUmnyNoZ6ZhJOFgo6hn5SZkYWKhY+ZkZZscHWKjIKWjI2Od4+EcW2FgYqWkYOFiHGIoJaGkomNj5aktKmbjJSig4eSg31/a2pqfIGCg3VjXmRgW2dsXWxsXldLSE5SUU1MTEZJUENETUZCQ0VGQj05OTc9PDo7Ojk4Nzc2Nzs6Nj06Nzg1NDU2MzQ0NTY2NjY4NTU2MzEwLiosLCkoKS46UGFcQCwoLSsrMCwncog3MjQwT4RiM0A8dW5nWW+Cb3WGcXaShn6XlpqUnp6cp6CplpOYnmdlpJp+hJKReX+SiJGSfYqEmJKQgoCAi4yJhpGHhYmFeHh+Z01SPi8uLiwvLi0vMDAwMjEyNDY3Oz9DRU5PUlRQUFFTUU5QSUVEPjs8OkRGPz48NzUyPD9SNUhISExMTU5SXm6KfHOBfJ6cm6eloZmglqKUnJ6onqirn6isqaq2l6u/q7bIyLfI0M++m6Bwaaupn4STkoWcoJqbmaaSkYiVopubeHp+lJiTopOXl4GUnnt3lZKrsomNl598lJ2bjZKVmKOhprWvnJCYqIeWj42AiGxzc32BfnNpYF5iYGJoZGBnZlxSRUpLUE9JSUxGRk1DSExGR0NCR0VBOjg1PDw4OTk5NzU2NTg+NzU9ODQ3NDU3NTQ1MzY5NTg6NjE2ODYzLzAuLSosLy4tJyMqO1hiQigqLDEtKEuXXjA2M1GFZjJBQGlhXlBwdGBtfGF3jn17lI6Oip+Sl56Wm6qYnqpCRH2HiYeYjXiCjYqOjHyKho+QjoGCgImLioSShYOHiYGAh3ZeYlA0NjAtMS8sLjAvLy8uLjAwMTU+QUFNUVJTUVJTVFJOU0xFRUA8Pj1GR0BBQDg2NjI8OTtGSEdJSk5PUVlthY93lImhpaizvLekrqurpqi0q7C2srGtu7Gzvpyzw6u6ycq3w7+4paKws6ytqqOLlpiFpqago5eBppmNoquopYiFlKShoKuhpKiPnLGLlaOmt7qboKKwkqKdop2Qo6Grr6yytaKUpKqImYiSiZV5en6GgGliaV1mY15kZF5nZ19bT0NJSFNORkhMRkpHRkZIQUtGQ0ZGQTs4Nz08ODg6OTc0NjU4PDU0PDc2OjQ0NjQ0NzM5PDM4PDIwMjU1MS8xLi0qKi8sLSooKiYlNVhYLywwLCwwhIE4NzFQhWg1QUNbWFRMaGJXaW9YeoV2gZOFiIKbg5KQjJLayJ2Wc1aXiI+InI98hoyOiop6h4KHkI6DhIGLhYaIkoaDhYmHiIeHcW5hQEU2NDwzLzExMC0sKy0xLi00P0NBTVVRUlNVVVZVTltQR0hFPD4+RkhDRUE3Ozw1Qzs9RktJR0hRT1BXgZKfhK2isamxwMbCqrPFtquzv7O4vra/tMG2u7qjuMWotsnHtb65tKijtK2wsZuZkpqfiKevq6WUdp+kl6GssrSZlqquqa62u7K6rLC1orGssbW7t7WutKCnqKOnmqmvrLK5t7imm7apjKSOkZOfhniBhXdbY2VXZ2NiZGBhZ2BbVEpERExVUUhJSkRJR0VBQEBLREJNRzw4Njc7PDk3Ojk4NjU1NTcxMTw4ODk1NDY2NDk3Pj0zODkxLjAxMjExMzAsKiwuLCsrKyooJyopRVowMCovK2iSTzYwUodqNkFGV1FKTFtZUWJjV3l1cIGUfYSGk3WFf4CMe7+7o7yCtJSTjZuPhIiPkomIeYaAjJKMh4SBjn+BiY+HgIaIhYqHkXp4bl1WQEVNPDY6NTZBQjc2NC8vNkNIQlFcUFFVV1VcVlBfVUlMS0E/PkdLRkZEOz5AN0Q3P0JKSkVGVlNQXo+kraOxs8G1t8HMyLW7xL2zs8C2uMG1v6+3dLGzpbrEpLDGubGzsbSopLW2qrGgopebopKlsK6mraunpJigrLS7oqiyurW8v8y/xcW9vbPBt7q3vre6t7msrLClsKmtvbC8usHBq5i5p5StjpeXqoh+g35sWGRiWWtmamZXXGNZVlNJR0ZMUUdDSElBSEQ+P0JCTEBATUQ5OTY2OTo/Njo5OTY2MjQ2LzE5NTk5MzY0NjI3Oz0/NjoxLi81ODo5NjUwKigsLS0tLCwqKCgrKyhFUy8qMDBKj2s1MlCHbTY/RlJMQUxRVlNZVVp2am9+joSAjYRuenN4h2K5oZmjiZSUlpKUk42PlpKHhnuGgY2VioCEgYp6fIuHhn2KgoGLhJV9d3p1ZVBcZEdFTDtRY2FbXlNGPztIUEVaY1FSWFhaZ1lUYGBMU1BFQT9JSkhFRUFARDxFNkI+SEdKTFNaVF2Trri0urjIv7m9ycy7vMG7t7W7ura9tLqxxmB1sqSxmp6rvamlqKuqpKKytaCrqJ+Vlp+ZoK6lp6aln6SToqextKeysr22wb7TycnTxsPFzMLKw8C+vb67vLe0r7i3tsO5xb3Cx6+euamhq46kqLWIgYFzYGNjX1hjYGpnUlhgVlJVSUVFTktAPkdEPUpBPUJAPUY+O0hBNzk2Mzc5PjQ4OTo1NzA0NS8yNjM4OTM3NDQyNj84QD5HS1JUU1FQT1FRUEpBOS8sLCwqKygoLC0sL1A+KC40OIB9PDJLiHE5PkNLRUBJTVBSS1FdZ2xrcI+MhI9zbHJyc4fVwLWZoI2VmJmRjpeSlpaOhod9hoONlop+g3+DeHuLg4d8i3mBioKXfnR9emtmcHVZXVxQZWRiYGVkXVtYV1xNZG1VUm1tX25fWGdkVVlVSkRCS0tJRkhISEhCSTpEP0hLVFRWXFpbkrnAuL22xb+6uMnKura5tbe5sre1s662tphkdaicrXBeoqycmKCim6SeqqWUn6CQk46WmZion6agnpqZg6SerKWqsK24sL251NHP1tDKzNLMz87Kxr++wsq9wbzBwMTExcq+yM6zpLuwtK+aq7i7mH97bV5hXVpfYlpkY1BbYFNQS0NBRUZFPEBFPkFIQUBEPTpFPj1KPzM3NTM1Oz00Njg5NzcwMjIvMjQxNjk3NzU1NTVEM0VMTT41MS8wMDY6NDc3QElPSTstJioqKC0uLyxATSsvNTRtiUkwSIl0Pz5CREBDREZLT0RRXFloX2+WkZCUbmxvdHWHs6ugoZ+LmZyZjIyVkZuShYqKfoiHjJCLiXyBg3N7ioOFe4l0goqGlX9ze3lsbXV7aHJlaWxpZ2ppaGBmaWlsWm1zlq2kvIiGZ1tvaF1aWlRIS05QSktQS1NRSExBSkZKT19eYmdpYZe3x7C5srq9tbHExrWvuLGwu6uysaert6uMtqedmqeaTpqdjI6flpGmmKWVipOTiZCJj5GRnZuhl5qVloeemqebrK+osKi0tNTV1dbTy9DU1c3Tz83FwsnQvsnJysnRx8zNwtDRt6/DvMS5pbW6wqKDcGVeXl9ZYVhaZlpRXVhPUEJCSEVCSDtBQz5BRz8/QTc7RD5ASD00NjY1NTs6Njg3NjU0LzEwMTQ2Mjc4ODc1MzY3QzVCOD8tMC0xMzQ5PTk3LC4sMTtGSz0pLCguMDAwN0s/LTQ2VIhXMESHd0M7Qj5FQkFDSk0/VVlSZVZzkJCYgmhxb3l5g6CpnqaXjJqbl4uNlZGajn2Ji4SNioqLkIh8hIJwf4eBhnuHcoOSi459cXh1bHF4fnF6bnhzbGmBcG1jam1weGl3fH7Lv8Hfp21jeG5jW2FgSlBSVU5ZXlBdXE5QTlRRVVRcbm12gnGWrbistKawtaqsvL+wqrSmpLimq66gq7SjjrGumpeYjJGTkYSOm4GNppGciYOLhIqJhIuElJWYl5ObkJyYmZqfnquspaiirK3P0tXSzszT1NTQ1NHOyMPU0cfN0tPT18zR0cXS1sXAzsfHwqi+t86ee3BnX2ReWGFTXlpQUVRRT0g+QEZBQkU8QEE+RUQ+Pz86PT08PEpBNDU0NjU8ODg4NjY0NDEyLzAzNTI2NzY4NTMzOz08RT1AMTErLzI0OT41OTAxMDIyLTJETjMpLzMuMzI9TjIzOEN9XzJBhnREOj09ST5AQ0ZIPFZSTU5adYaFindsd299fn+hnp6hjIyYk5OLjJKPloR5hY+QjYqJiJGGf4J7cn6AgYd6hHWFk5CIf292cmtzfXt3e3OBeHJqgHNyaW9xenlxer7Lmn6MsoR2coR2aGFrXUNaWltWZWNZZGpUWFxdYGReY3d6fouBmKmjpaGfoKilqrC4qqWzo6GtoqOtoaexn4immpOSkYmRjoiBk4lqlKKMmYSBhn6Rg4OTl62LlY2Umo6Gk5Gel6ewoaGhpaSpyM3PyMLM0dTS1NLO083G1tLM1NjW1tjU19XJ1NrNydfX0cqsw8LLjHRwZWJhWVVaVFxQS0dJSkpAOzo7REFEPEJDPkdCPkJCOzw5PDpHQjQ2NTQ0PDU2ODc1NDMyNTAvMjU0Njc0NTU0NDw+PUU/QTYyLy0xNjs9MDgxLzI1NC8tLTtSMDE3LzUzMkZEMjg+bmI1PYF0TTk5QEk8QUQ/QTtQTEZLWXCAdX1oc3hygomAnJSdlIWLlYmPioiNh45/eIOTmIqMiIiLiX6DeHN7fYOHd396hpGVf4Nud3BtdX92eH10hXx5bId2dG59doR0eHudtYw7QYvFpX6MfGllV0lDZmNlY2dqZG53W15maGtuaW6Ag4iQi5ydoJ2Ql5ieo6OlsaOks5+hpZ2gqKCjsZyFnpKSkpCKjouGg4+EfpybjI2ChIV6lH+CqZWjjJGKl5KLfpiLmpKrs5ibnKicp73Dxrm2xs7S0dLQzNLLydTO0NXa19fY1NnYzdjbzsnZ2tHWvsvLtXp4cGZeW1NXUltWRkdKSUVFPTo3OkBAQjpGRD9EQ0FEQjs/Ozs3REM3NTY1NTswNjg5NDQzMzQxMDE0NTU4NzQ0NDQ5QD5EQkM8MzMuNkZUV09RSkFKRj8xKiguQlMzOTI1NC83Szc1PGBiQTxzdlY4N0FIOj9DPjw5UUVDSlRrbm5wYnBxc4WNfJeQnYt/h5KDiYaFiYGHfHiFlpaIjoKHhYZ6hHlxe3uDhnV6hY6NnHmLcHxvb3p/cXuBcYOHgG6OenR3fXyCdX57hoevc1ipwraNkYJwbmI9XmhycHFwbnh2gWVob3J1eHF6i4aOk5GblZ+Vh4yTm6CanqmfoayboZqZn6Wen6uZi5qMkJGNhH2Ih4OFi46gmZOIg4d+bJl6hJmGiJOMjZSMhnyciZSPrqqUlpifmaevtr2prb7HzMnJzMvQycPSytTX2NfY19Xb19PZ29XQ29rR1sjUy5Z7fWpqXFtRVFRfSENGSUg+QT49Nzo9Pzs9Rz0/QUFBREE+Pzo4N0VCNzU1NDc5LzU2NjQzNTU0MjMyMzY0NzU1MzQ1OEVCRENFQjU2PEZOU01bbmZjbnNrYVY+LDRMRzg2NTQzNEJGND1XX2hMdXheODs/Rjw8Qjw5OUQ/Q0dSal5tZGJma3aAiHGRj5qAeoCNfoKCgYN+g3t8hJiNh4t+hYaAdoJ5b3t7hoF0epKejqB2jnWCdHWBfXOAhG+BkIJvkoR1fIGFenaGe4i3xaTBybiBlpuPd3BlTmZjgXqBd4aikIp4eXZ7g397hHZtk5aUlY+XkYSJj5aZl5alnJiflp6TkpejnZmrlZCQiYyRgoyFiIiBhpCRnpuZiIaMgYWXeoiJn5eQiI2Ki4J9oYqRi7yhmJSYmZyppqaun6i2v8DAucfKzs7FzcrR1tXV2dXX29TW2drb19va2tjO28aIfXtpa2diVVhWVk5MRU5DOz09PDg6PD44PUA2PT9APT8+PDk4NjdEQTY0NTU9ODA2NjU1NDc3NDU2MTM4NTQ1NjQ1NTdISD1ESkU3OTI1O0g+Ozo6N0lQXVpSVVhLOVQ+Ozk1MzI3STg9TllNSHh4ZDU9PkM9PUA6Njo+PkBFUV9YZWFdW2h0enlsiYySd3Z6int+gH5/fIR6fYKRiYSFeoSHenV9dG18fYZ+dH+TnpGeg5F8hn54j354iopugpqAdJmGfoGJhXx9kHqPqY6Pw6G9jJyjnH2JhH2JcouKfnOmmpyYk4V7jpCIhGhHcaCknYyLkJKFiYuQkpSOnZqSlJCWjYyVn5yUoJSRjY2Pi36Qjo6LhImSlpqen4mMlJKdkYKLgKaZiISNgoWEgKWHiou4mJ2RlZaiqKGenp2kr7e6tazAxsrQyMfMz9PT0tjT1dfA19jZ29ja2tnZ19u5e3t6bWtnWWJcVFBPSURMQjw8Pjk5Ojo5OTs9Nj8+Pjw9OTo7OzM3REA4Mzc4PjYwNjg4MzU3PDM3ODA0OTc2NzU1NTQ2RlA1RE5JODkzOEFLPTszQ0BJPDlEV048TVRITj85NjMzMz5DO1tYPjVZeXBaPDxBPD0+ODY4OT89RFJTUlheVVhmbW1taYGOinFzeYp7en98f3uHenx7i4aCfXSDhXlyenNtgH6EfneFnKKbnZSSgIyIf5iHgJyRboeohXqgi3yRjYOIhJt9mpCKjKOioJCkr5+LkIuFi4GThldyrYufq5uPg5ibj4+OXIKikYKMn5OVjIeIjJKTi5SUk46Lj4qHlpucj5SWkIqSk4aAi4iSjYqKnZaZoqKGk52WoIqJiI2ckIOIjn+Dh4WkhoyQs5idkpWXoaKfmZKcnaiyuaymvcLHzcjGz83QzM/X0dHVrtbV2NrY2trX1dnZoHJ/d2loX15ZVFhZQ0FIQz8+Pjo0OTo7Nzo7OzM7Oz89Pjc7OToxOkg+OjM3PUA1MTY3NzI1NT82NTs1NTg1ODo1NzczNUhSN0dPSzk5ND1FSkI+MUZDTEI5ODpHWEA1SFdJNjYyMjM6RUNlWD8mX3lpX3o+Pjk8Ozk4OjtAO0JRS0tTWVBUY2N6bWF+kYNvbXeLeHl/eoF8hXt7doWEf3NwhYF6dXZ2dISDhX5/kqakn6ailoqdkJSXi4qol3OKsY2Ep5KEmZOFmYyilZ+Yk4ianqOSqbCgkJSQjY6IloxujbeFmsTIspuhpZucmJaQspFkpM3Ilo+Gh4iPko2NkpOJhYqJhZaZm4+PlJOGlJeDf4+LmYiNkKqWl6OjiJmflpqIjoaWl4qEjo2Bf4iPpImNk6ial5OXmaGZn5mTnZujs7Smo7zBvsfFxcnIycLL083N1KnS0dbW1tja1NPazoR1gmtmYGBfUEtWXEJCR0M7QT04Mzc7PDo4PTY0OTo8OjgyPzk5MjpJOj02N0JDMzI6OTYyNjQ+PTQ7PjY5NDk7NTc5NDRKUTxKUUs5QTdCR0lANjRKRUxGPjw4OEVUQTc+XDg2MjE0OjtFYFhBRmF0aExjWj41Ozo6NTs6PTpFTUZIUldTUkJlg0d1go59fG19iHh6fnqBgYJ+dnaAgntsb4t+eXx3eHyEh4t+i6O0qKSrs6GWp6ClpJaVr6KDkLiVkrOZjaGgjKSbr6KknZiQp5epma2wpJeUlZSQi5ialqDAjqPJuauaoqWtmZGbnLKdhoWoop2YhYiIjpWMi5OPh4GGh4iTmJSMipOThpSYhoSRkJx0kZmylZakoYicmpOPipCKl5qJi5aNhn2MmZ6KkI+cmpmTmZiglaGdlZ+bobGuo6S3vrPFx8S9w8O/xs7KydKnz83T0dDW2NLP2Lx1fHhfYldiWFJJS09FQkNENT46NzY6Pzs8Nz00MjY2OTc3ND01OzU8TDw+OzxCQTc1PDs0Mjc3P0A2P0A3ODQ5ODc7PDU1T01EUFJMOEA9RUFHQTU6SkVORUQ6NkFAQlM+OURPMzIzNTc1PXZcPFJcdGlaTV1TPD04OTU2Nz06SkZER01bXFlJaGE7SISKentthYZ5fIR4gIWBfXB4fH18b3OMen2Ce3iFi4mGg5KovK2ps72vpa6zs6mjorCsipq1naK4pZWtpJeprbempKOfmamYqqSvsaqamJuUlZGYoJeZu7utyqFptreqsJWYnqKrkpe9pF6psoKJioyUh5F8j459g4aOkJSUiIeSlouPlY2LjZaZk52atJaVq56LnJSSjZCSi5ibipKdj4uJlaChjZWNl5mdk5yZnpWioJScnaWvqKGls7irwsjEtru9vMXIyMLQocbJzc3E19bQy9Ojc31rX1xVYVNRR0Q+PENBQjg/ODc0PkY8PDY8MzUzNTU0NTRCMzk6Qk06QTtBSEI7OkA8NzQ2PEI5P0BCODc0Ojo2Pjw0N1RLQ1VRSjc8OklBREA0QUpITkJBPzZEQTxKTkQvVD0yNTQ6RUpcWEpaUW1ncHBEaWBLSTY3NTc6PkpAQ0lQZkhhYGJwSUCLiX+AcoaHfIGJdYKKg35tfX18fnB3h3eNgYd7jY+Mhoyaq8PAsL3Gu7O0wby0rKuzt4yosq2tvaubuqSorbm3qqamoqKko6qvsrGqnZyjmJuYl56ipaWSo7muqMC7rK2yuaWkp32Ihpytva+Ci4uKkIOOg5GOeYGHkI2OnIiIj5eNipSXlJCal52nmrCakaudjpqPko6VkI+Vl46RoJCIlJujrJWWj5ScnpSgnpuYoKGUmp6np6SipLCzpsHGw7Cwu7bFxMO/zafHw8fDvNbQzMTKinZ1ZF9cYl1PS0NMQEVHPkE/Qjw6ND5BPT01PTY+MzMzMjQyQTE3QEJOP0dAQ05DQT1DPTs4NkNCNUJJQjo4Nzg7NUI+NzlWS0RXT0Y4PTRLQEM+NEVLSE4+QUE2QkI/QlNFNThQMTQ1Ozw4O0Q+OUxqal07V1JkS2daVU83OUdFP0NGXGhGX2lnWl1ck4yMiHuHi4aDjHWGkIqBbn57gX5xfoF6lXqSlJSYkZOVqLTHycDCzMHDuse8uq+rubuXsra6s8CupcCkq7C8vKquq6Ojnqisr7WwqpugqpyinJafsLSni6K6urXBu6uonLKkpKiUhI6pxMOkgouOh4iEhpWUjHmDjJGPkqGMjJSRj4iXoJeSmZWXpqCunIyqnI6Wj5KRlZWOkJWRj6GThpefoLKflJuUoKGZpKCaoJyglJiep6Smp6SvraW/xMKuqbe1ycO+ts+yxb7DvLPRycfBtXd7b19aXmxUTklETUtLSUBBPUJEPDVBRDs6Mz04QjMzMjI2M0EwNUlFTj5JQEhSQEg+Q0A7Pj1GQTVBVUA7OTk4PDdFPjg+VkpDV09HOD80TEBCOzVKS0NMP0I/PEJGPUFITDkrRzwzNjc0NjRBPzdPYU9hRS89PjZrbGpgQDpIPj9FQmdcTWVcZlRjapmNl4mLiJKPhol5hpOQgXKAe41/d4aBgpB6jaGWqJqamLu+ycjKwtLJysLNvMGzrby/p7q/vrzEuKzBqayzu72qsKqkpaOsrrSttrWgoK6fpaKYo7S8qZuovMGjtbavq5KvrKqrloaaqqelkYKMk6SVioB1iZJ5hY2RkJ6gko6Ui4+MlKOZlpuUlKOeqZ+RpZqMj4+QlZaIfY+VkpKjmpWgopy1ppCfl6Wko6WfnqaYnpWXnKWjqKiisq2ou8DEr6Wzt8zAua7Ds7u9wbmtwsLCv5lwe2NbWF5cTU1OSkdEQ0hCQkFDSzo0REg6OzQ8N0UuMTIzNTJCMjZTSE48SkJKUUVLQ0RFOkVMQjw3RVY9Oz04OT88ST86RVVJQVdRRjdBOks6Qjc5Sk1CSUBDPjxERzxCQ089MjBIMzY2MTcwPUI6PWpqSks1UVMzU3BwZE47RD1ARj5sSV9YYVpkZFeekJ2Nl46ekomKf4ifkoR4hX+Vfn+QiIqQgJWgma6no5jDvsnEyMbSzc7Ny7zCt7C6vbS9y7vDwba3vK2zwLm8rq+ooamotq2uqbK3mp6soqehnau3t6mlr77Esb25s6eps7OtrpaVpa2ooJGOkrHFp5WNfZGVfYeRmI+qmZiTk46TlZOlnpOdmZOhoqGcmJ+Yi4yPj56IWpCWl5KWpZllmKOes6WWoparraunnJ+nl5iWmJWhpKmnn7asqbq8w7WmtLXLwbiqtqyzu7iuqLi6vLeEbnBcWlZXUEdLU01LP0FIRURIRkY4NUZNOz43PkFKLjMyMDI1QjU1UFdOPExGS1JMT0dHST5JUT86OElTOzs/Nzk+RExCQEhTS0BXUEY6QT9HNkE3O0hNQ0U7Qz00RkU6QkFCRzkvOkEzNjAzPkdEOTQ9dGRNRztFKzpmfGhWPD5AQkZCc0ZpSVJlY0xGpZSclaGXqJaMkIOHpZKIgYeCm4SDlZCRlI6aop+vvq6hx77GxcjHzs7O0sq+u7axuru8v8+1xL23ubeysrazt7Osppyrq7mrqaivsJejrqSnpKW0wbCrrLO+wrnAubOnuLS3s6+VpK2wr6WLk5WhjXPBmX2WmYSOlpmLsZWampWSkpmZpqOVoJuWmqmcm6GgmYqMj5adYEqWnJqVmaWXVJawn6+cn6WUr6+tppuhppSTmZmOnaCnoZm0qaqzvby7q7Cyx8C4pqyrrbGxo6GysrSlc3FnXlxQUk1FUVFQUTtIS0lGR0FDPTlLVD9BOj1FTTA3NTQ0OkIzNE5XTzxKS05VTlFKUEhISk9CPD5NUjs+PTg6PENSPkRIUklCV05JQENBRjM+NThKS0NBPUM7NEVBOkE/PkhANSpCNTIsPmNdZzozNXRkZUBSNyYjM31oWDw6QkNAPVJFV1NzYlZGSKuXmZ+hqK6YkJeHiqeWjoiThaCIhJyXj56gm6Oltcm0qca8w8TIy8nIzM7Hvrqzrrm5wcHNtci7wbm1urGvr7K0p6ScqrS1q6mmrayZpK6lpaisusCoq7a2v8HAv7iyssOwt72ro661rbqliJuXppt2vp+EmJyOkpiai66WoZybl5San6GpnqigmpuqmaGnnpeQjZGdg211k6KalZ2jn5CusqOrlamqmKuvpaWhpaqTkpmciZWcop6Wsaapq7q3vbOyrr65tqCjp6mlppycrKmpjWZoYmBTTE1HSE5KVUw9TUVNSUpAQ0Q8UVU8QUFCRE8xOD03Nz9CNzVVWE4/SE5RWFJQUVRKUUpKRUFFTVE/Pz04PTtHUjxFRFFCR1lNS0FIREU6OjM5S0lCPkNCOTlDPjxAPjs7RzctMj4tMYJoTnpcLzBraGA8PUJCODZ6Zlc8Oj0uLlNhTVZIfmVeSEaslZyhn7uumZSei5Oqm5GSk4mqjYahnoyjrJSkpLbHvbTBu8LCx8nFws7Iwr25sq+5tcDCyrbGscG8tburqa2ssKOjmaq0uqaqp6yqnaivp6Srqr68qK28tLi+xry2tbjAsL3As6m1tqu/pY+jl5Ghn7ueiZqgmZednY+2nqmcpaObnKGap6WzopuepZyoqp2YlY+Um4uWiYykoZScop+hta+lppOxq5qrrZ+fpaSqkZaVoISQnp+clqmkoaG0tLq1rai1srKenKOmmpeVmaqhnnhjX2FfTElGSE5RSU1ERkZCUUtIQURHQVZSREg8QUdRMTtBNzpCRjc5XVlLQUxQVFVTTVdSTlVKREBKSk5POUM/NT08TlFDPz9QP0VaTUpBS0RHQDUzPUlHPz1FQTk3QTs8QDw8M0A8Lyc7KkiRQjpTSjAsW29XNzE8Kh1CgGRUNDktMTpoXUZEQ5xwYkdFp5eknp7DrJuXpJeZqJuVmpqPqpaVqKaVrayZoqq2xcK8v7jAwsDIxL/Nxru+ubKwuLS/w8i1v7C8t7q3p6Srq6yhoZurqsSipamspp6rr6yiqqi/uKatvrC3t8a2tLm4vrK/wba0srSvvaOWo5WSm5Otn5ChoaSio56QvqSpnamsnZ2gm6afvaKYo56iqaugnZaNlZ6TnoeOhI2TnqShnbWsppyWsqaZsKmgm6ufoY2alZ+EjqGam5KlpJqYq7G1saqlqq2snJigoZKOkJWon5RqZVxiXlBKSEtPTUhFQ0lAPU9IQDtHSUhbUk9LPUhOVTRCRTg+SEc1Q2JbS0NOUlVXVlFYVFJVSEA4UVFQTTpHQDRDSFFTSUM7Qz5HVktDQE8+SzwwNjtHRj47RkE1Nj85Oj85OzE1RDAtLDBNdlw0S1o1LE1uVzwtPSkeI3piUTVDS1E5b1JGPEt4ZmNYTqKbpJuexayhn6ydnK2fkqKelqWgpqmsl7axo6qztsXCvcC2v8G7ycK/ysi2uLW1sbS0t8LGt76xuLW6tqCnraqrnZ6fpaTBpaCprqCkqa2woqaovbWmsry3trXDsrO3ur6zxMC4uK60tLSjnaSUkZOgrJ+YoZ2oqKqimsKtqZ2srZubnpimoL2hnaSYq6urpqCZjZmfkp6Ijlh/lp6moaC4qqaUmLajnrKioZywmKCPmpSego+gl5aOoqOVkKWus6upoqKlpZWVnJmLj5GTpJ+JY2dcZWFNSktLT0ZFQUZLPj1JQTk5SkpOXVFRST1MVlw4Rkk9RE1JOEhjXEtDTFBTWVlWV09aXklBPVdRSUs/SEA1SE1YU0hBOkBBRFBIPz5RPks3MDk5RkU7OEc/LjY+Nzg+NzcvMT85MSUxUVVtW0pPMTA9Z1dEMTc9LSt3YVM2U1prV3NIRTY9dWVcTE+eoKGYnsOnpaKzoJyyp5Oqo5+jn6yprJ27samstbHIw8HDs8LDvsfEvcTKvbCwtq6xtbDAxbW6sbC6tq2aqbCpqZuepqGowq2brLGcqqKusaqkp723pre7va+3w62zs8K/ssezurertLatqqKmlZWUoquhn5+Zp6uvr6+7sqafqamZmZeToqS4oaGjkq6vq6SlnpKhnpSdjpCNlJ2ao5+ntKenjZi0nKOvm5+cr5GglJiUmoCSopaPjqCgk4umrLClp6KdoJ6SkpqUhYuSjZyfgGRoXWhmS0pMS1NCQ0BJRzs7Rj44OU5NVV9SU0o+T15dPUhQQk1MSThOZF1MRUxSVFlbU1VPXGJIQT9aUUFIQUtCN0ZFTEtOPjtCSEROQj07TkBBMy85N0NCOTdGOys2PDQ2PDM1LS80QDErJ1Z0U2VPPzEwNGJbTTIzPjA8d11eP1tVX2ZyQDg8SJZ3ZUE0n6Sfm5/CqKOqsaCjtKmVsqumoqSyrK2pu7KtsLS0xr/ExLXAxL7KxbbAycK1q7WpsbmswMW0uK6ttrqlmauyq6qYoaeXrbu1m6iwm62frrSyp6q6s6e5sriyuMCquLLCvbTFp76urbe1qaesoZaWkaWkoaGXl6Sut62ytbafnqikmZSUk6Ogt6OkpZWusbKlqaShnpqZmpWYqJ+emKKfr7Kip42Xr5ilq5ibn6aSnY+VmJqGlqCVjJCdnpSLqamqoqehmZ2WjI+ZkIGGlomVn3pmal1sa09RTk5UPUJBTkM7Okk/NzdRTl1fUlZRQVdgXEJKU0hWS0g6VGRdTkZPTltXW1JQUVhdR0FCW1BCRz5OQzlIR0hOUD8/Q0lCTEI8MklBOTQxNzdCPjs3RTcrNjkxNDgwMi0vLjw2LSNCcWdzazIzLzFcY1ozMzkwNnBbYkgwNUpxalZDV0aMeWZDO6SknKGlv6aorq6gqbWqnbivq6SqtLexsLi3sLe4t8W9w8e9vMTCx8G5wcbBuqq2pa27rcHDt7iqrbK8o5WtsK2yl6aokaq5qqGnsJ2roK+0s6qqt7Wsu6yzsrm3rLiwwbq9v6bDqrC2rqmqq6admJiqoaGgkZegsK6zq7C5mZupn5mWkpemoLeppaKir7Gzq7Gnq6CcoJ+bnqWdoJedpLSwm5+QlKaaoKmblqOgl5mLlpmUlpedlImSm5mUjqmpp6CjnJibk4ePmYt+jJeGj5psam1ibm5YUVFaVEFDRVVAOztIQDc6WFBkXlBXV0RZXl5OTFNPX0xKPlpkXk5JUU5bVVlQS1NXWkk/RFhQREY+Tj89SUdHUVBCPUNGQk0/OjJEPzc3NTQ3Pz05NUU0Kzc1LzI1MS4tLiwxPionKz1ccD0+MS4xZVtkQDE3NDdnWWFGKEA4bX1oXFY6iXtjQz2on5yhqbyhqq+qorG3qaW0squhrbW9r7O4vbu9t7bBw7/JxLnFw8DAucW+wbivtqirt7K8v7+0qq6yuJ+XrK2orpioqY6nu5+lrbOfq6KxsLOsqraztbytsLG1rLC1scC6xbarvK+xt6ysqaKxpZ6kqJ+jlo+Yn7Kqs6mqs5mdp5ualI2gpqS0rqehrKytsaeyq7Gpo5ueqKSelKCZm6m2qZeakpKfmZ6hn5KtoJqZh5eYjJ2anZSLj5aXmpempqOgnpaWl5SBkJWFe4+Tg4yXZ21zaHBzX0dZZlZEQ05YRFo5SEI1Pl1RaFxOWl1HW15dT01SWGRLS0NdY2BQTE1OWFdYUEpWVldMPUVVSkVEQU0/QUZISFFQQTtGREZLPTg3Qj02ODcxOT48NjVEMCs4MC8wNS8qLC8tKj0sKyUyKyo1SzEuJ19fYVYxNTE9YFZfOClDM1lVXGdLNYx6ZkxApJqfpKy2o6yopK6ttamus7imprC4xrawt7/Bwra0usW+zMW5w8G6wLrEuMG5srWsqrq4u7q+tauvsbeZmKirq6ucrquPq76eq6+xo6qfsa2yrq62sri2qq2usae1r7S6vMmyqrW0sbSvrqags5+aqKygpJWVmpmxoq2gpa+WoaSZmZKNoqWmsqmhprGsqrWkrrC0r6OZna2nm5edmZmsuKKXk5GPmZyhmJiUraGfloKVmY6enZqWkYqUk56apaOjoZmXk5KWe4yRhXuNi4OLk2xueW91fGFGYGpaSUhaWz17SkdFNkFiVWlbTVxhSltcWlNTU2JhTEtFYGFgUExJUFdWVU9HV1ZVTjpJVklIP0NLP0VESEhRTkE/SEhIRTw3PT46NzU2MDk/ODY2QiwtOCwvMDQsKCwvLSo3NikoOS4kOks1LiJUYFZhLjUoQ15RXC4rQS9KR1BbRzNjWFRLRZqWn6+osamspaOurrWpt7O3o6y0t8q6tLu7wL60s7fEwMzHvMS9t7/AwLjAvbK9rqi6ubi3wresrrK5lZenrqynpLKqlK+7pKyysqanorGzsLKxtbC3sqmuq7KmuK+1s8TFtqm1tauwramnorafn6axoKSUm5iUsJ6nm5+pjaminZuVl6WlpLanorCzq6exp62wtaykmaGsqJycnZuUqrmclY+PjJidopiRmKikoJiFk5eRnZyYl5eIlo+Xm6icpKGSlpKQlneEkYZ8hoKEjI1ucXh2fH9dS2VsXEpPZFw/YntHSThHZ1dmW0xeYk1YWVdVWFVpXU9PSGFdX1BKSFFWVVJLSFdVVk04TVpORUBGSz9IQkNLU00/P0xPSEA7Oj47NjswNDE8PTQ1OD8pMDcpMS4yKSksLC0rLTkkMDQyJTlCNy4jQU5IZzI3J0ZhTFYlLUIuPUVMUTwzcmtMRESRmaStpKytq6ajsLKyqrewtZ+rtbrJuK7BvMO3s7G1wsPPxMDCvrS9wcC7v7y0xKiqubG2t8C8r6y0tJ2hp7GtpaaxpZ6ytayqsrGrqKi0uay0srWss6yqq6isqbmtsrDHv7ikubCpra2mp6ywpaSjrqOpnJ2bmq+ZoqKio5Csn6Ogn6GppqW4pKu0tKSqq6isrrauop2jqKqcoJmakqS0mY+JjoiRo6CWjpWfopaVhpCVlJ6bmZaVh5eSlZmnnKCgjZOSjpF4fo6EfX19h4qKcnRzf35+XFNkbl5OWmddRkSWW0c6Tm1YYlpNYWJOVlZWV1RZaF5RUkxkWltUS0dPVFNOR0lWU1xOO1BeSkJESEpBRT8/S1NPPjpOTUM8PD45OjU9KzMyPTYyNDk6KDQ1KS8sMSgpKywtKiY1Ki8mMCkzODoxJiozRGQ7NipIZEhKKzpJPzNDSVMsPo9rP0hJkJupqqGpr6Sno7O0sLS1sbCgq629zLquwbzHsbSttMLD0cTFv8GyvsPCvL+4vcWorbestLi8wLGssq6ho6euqqelsaOrsaquq7Gurqyrsrqnt7GyqbKpqqalo626rKqwwrm0rLmoqaitqaewpamkoq6qqKKenKKslaWdl56Yq52hp6ihrKairKy2sLGgqaKfqq2wrJ2epqepmqOXmJCgqJiGg4+Li5+gkIyOl56SkYiIkpahnZaYloaWk5OXpZydnYySkI2Kf3+IhH13gIeFh3V0col2bF9ZYG5jUXNyXEs8hHxGP1d1WGBZT2NcTVVWVVdRXGJfU09PaFhXVktHTE5SSEVJVlJdYzxQXUQ8RkhIQkc/PUpQTDo+T0o9OT89Mjo3OyozNT4xMDQ4NSg1LyosLjMwOyksLCclMjM0JCwyLTg2MCkoMTxeSzAuSWdERjg8QjA1RUtYMUCUXUBORpWXrKehqbGcqKivtay4ta6ppKurvcm7sL64w6+wrLLExM7Ow7+/tMHExLrBtMnErK+3rrO6wL60rq6spqepsammqLKmtK2qsK2tsa+yrLO6pLizrKytp6ugo56wt6uqrbm2pLW1o6morKyqrKCopqexsaOmpaGhq5aqoZSboKWeo6Kqo6yinqaxtqysoqWjmqmrrqmdoaWkpJmfmZWPmJ2TgYKQiYWdoI2Lj42bkJONhY6ZpZuSkZuLk5GRlKOam5qLj4uLfIeBgoJ7dYGEgX51eIujh3hrXmBuZ1dmh2ROQGeSTERieldiWFJlVU1WVVVUT1xdYVZLTmlXVlZJSkhJT0JHSVNRWW9BTVhAOkpHRkVHPj5FUUg4Q0tFODdDNzI6OjoqNDk/Li80NjMpNCsqLCsuIzQuLSsmKCs3OSomNis8LTIsJjA2WFouMEpnQUE8PEMrOkpPXjREhkJJSUSXka+koqmvmKmorbWqtrCqpKupqbzBwLi5tLy1prKvxMrL0b/Bu7jAwMK6wbrCxK6xtbK0vMG+s7GvraysqLeqpq2wq7iuqLGwrrGrtaq1tqe1t6uspKmqnKSes7OoqKSztJ+1raGpqKuoq6afq6uoubapqqmpoamfrZuRqaGdoKOipqKqnZumtK6npamipJelpqeqnKKjo5+ZmJ+Rjo+YjX6HjIeFnp6IhYuLkJCSjoWIlqOajo2akZKQjpKfl5mWjYuEf3SHgX9+eHWDgHp4foCInY9wcmdncXhcYXSIaU9dmFZIbXlVZFZSYk9MVlRVUU9YW2JWSFBqVFZUR1BZVUk+SUhPUVB4TU5WPTxLRD9AQTxAQ1VDOUFLPTU7RTEzOzk3KjQ6PSstMzQxKjgqKisqLCkqKC8qJiklMzssJDIpMjAyMSUvMlJjMDI/Zj1OWD9DLD9MVF8vSWs3UkY7lY2vn6WqrJmqpK2usrSvqqWvqam7vrvBsbC5raK2r8nHyNHAv726vMO9u8PBv7+vsrOytr28wbGys6uzqaW1qKSss7K4r6KttbGvsbmquK6qr7erqp6qq6CjobWtqaGfr7KhtaqeqKeqo6qhoaytqL2vq66toaenn6uZj6+imKKgqKaep5uYqbCpop+soqGSoaKjp5iaqKWYmJidj4uHlIh8jYaEhaSWhoOCjIeQj5KFh5WhlomSnZGTkI2RnJSXj4qGhnh0gX99dHh6gXt0dHtqgoijdmleZWyBdWeIi3xSV3BeS3hzVGRTUV9NTVNaZ05NV1llWUdTalJRPkJOUWFROklITFNJcVFMUzs8ST87PD07QEBXPDw+SDczQ0IxNTo5My01OjopLTMxLS02KSgrLSw1MiMyKScsJS47LiYxLjAtMTQlLDBNaDozOF89YWQ/RjFDUFtbK0hQO1lDNI+OsJ6kpaqipaOsprSzsamksKequL7BvLCouaqnrrDJx8jRwr3Avrm/v73JvMK4sbC1srq8ucCztLytuayjtaanrLG2uLKmp7m1rbS8r7ulra22qq2cqa+kn6Wsq6icnaqypLSpmqqnqaSpnaOpqKm9q7Owrp2po6Cum5qyopakm6Wkn6WamaeqpZ6aqaGbkZugpJ2ZlqipkZmakpCLgo+FfY+Cf4iej4eAfoyIkpCRhYKUm5SGk6KNk5GLkZqSlYeKf4Byenh+fGh3fHt1cXJ+aYZ6hIhkYGhjcoV7bWh5XV5WQ1h7bVRhUFJZS0tNcHRdSVpbZ1pGVmdPQz5LTkRDQTlIR0tTP2phSVE4PUg8PDw+Ojw/VDY6P0M0NUg+Mjs1OTAyNzw1KC41Ly0xMSYvPktJMSUaOTAlLCwwOS8sLCs2JzE3Iy0vR2pJMTRYPWZiQUo3R1NgVSo9PEZcQCqOkq+Yn56ppKOhqqS3srGkqbGnrbnBvbWwpLmsqKiww8nJzMG3vb+1uMG6yLXDtbSztbK9ubq9tq65tr+torOmqquutbe0qZy6u6ixv7K6oK+0tqmsnq2xo5ylp6mjnZykr6avoZ+rqaeiqpyjqaCtu6eusa6hqqKjrp6erKaXn5qhopufmpmiqqKamqOjlZaTn6GWnJalrIufkY+RjIKKf3+PgHqalIyJfX+Mh5GQjYqGk5iRh5SjipGRh5CZkJOBiH15bH12eXhie3pycHFzeGqCdWqDZ2NoYW5zjm1ianBgb0JdeWtWXk5RUUtJTVNZVk1cXm1XRVhhT15QSE1ERjs3SEVLTzxyaEpLOUFFOzs9PTs7PUo0OUI8MztHPDQ/MTgtNzg7MigwOS8sNS4uPS0qTD4qHTQ5JicuMzQuMCsvNCYsOiQ0MEFoWjEzUz1lX0RMNktWZE4pPTNSXT0jkZermJ+Xp6Ohn6ejt6+uoq+wqau5wrqzraC5r6uns7rHysi/t8G+r7S+t8S2wrKwurGywLa7vrequbi9qqS0pqiqr625sKiYuLyjrb60s6GuuLWnpqiws6CepKWooaSZnqyoqJ6gqq+noKaXoqigsLifo7GvoauhrKScpqapmpqbn6KVnJuZnammlpueqJCXkpidk5mWoamQmomNkId9h36CjXx7oYyNiHmEjYaLjo2GiZOajomVn4mQlYOMlo2RfYV8dHB8cXN0YHl4am9wcXBqf3NkemxoZWRiZoeAYFtyanFNToBpWFpNUUxLSFBSUUhNXF9vVEVZWlJnT0hLRUY1NkhCTEk1WmVKQDZFQjk6Pj0+OjpDNTk+OjNARjwyQDIzLzo7ODMmMjwwLDg1QiopLUMqLDQ7Tk5AOzczLS4rLTcqKjwlNTM9ZmQyNE0/ZV1GTz1SWmdIKj8wXVs1KJWbpZiclayfnqGkobersKO0tKmpusW3s66guK2urLC1xcfAtr/CubC0vbe/u76wrL6ws7+yvcK5qru6uKeotainq6+rs7ClmLu2pKu6ta6esbivqaWnr7KcoaSgpKShlpuvpqGfo6ivoaCik6Skorewoaaxq5+so6+XnKqlqJ+Ymp2jk5qbmZylqpqbm6SUlJeVnI6Tl6KooZCJio+GeoN9g4p5jpeKjYd6goiEiY2PhY+TmIyOlpmLjpZ/hpeMj3mBe3Bydm5vdF94d2VtbGxqaoRvZnJpa2ZoXmR0gWBba3ZpWkp/XlxYT09LSEhSVUczOV1ebFFFWVVZZU1ISUVFMDdGP0tCNklKSDs2Rjk0OT49PDk4QDg7ODo3QEk+ODw0LTM8PDc1KDU+MSw7QTEoKzY8IjhSPSoxMTM+RDUsLSc0Mio7KzEzOWNtNzRHQWZbSFREVV1oRC48MmRXLDKUoaGXlJyqnKShoqC3qq6gu7ilrL3FtLGvo7WwrKyutcPDvLO/urexs7m4ure6r67As7S5sL/AuK29urWlorKpp6mxq62xoJm/taSntbWonrK8qailqbCsmaOnnKSllJihsaWZn6OoqZyin5OloKS4qKSnrqaepaGokp+ooqGhmZudn5Gam5afoaqbmpiglJCTlpmNlJOjp6SQiYmOhnmEeoSFfJ2NiYqHeoGEh4mKkoWWk5OLkJaUjY2UfIOXjot3fnxsdHJsbHNhd3VpaWpnZ2+GaGhpY2ZpaWBqY2poXGZ7Y2BTdFRcW1NMSkdJT1NAISpoXmpNRFdVXmBLSUdFQy46QjxGPDZLUEQ4OkQzNTc9PTg5NT86OzQ+OEBLPT45Myk4Pjw6OSo2QDMuRTQoKyw/MC1OPy4rLTcsMTE5NSwmLjUtODA1NzZgdEEzQ0RnW0tXR1VgaEIzNzlnUCcynaKkkI2kppqdnp2jtK2nqrq2p6zEwbexrKO2rqeurra/vryywbewrrK2tri2tq2qvbOusrG9v7euvLuxpJ+2qqWls6iqrZ2cwKunpa+yqay1u56oqauxpZieqZ2mpJGZpqyimJ6kqaGboZyWn52ntaawqq6hoZ2eoZSgpp+hoJqbmZuSmJyTpZ2soZeWnJSSjZWXi4+Ym6mfkYiJi4h4hXaBgoGdh4qCiX1/hYiHhpGElpSQjpCRkZGMknuDlY6Gc319Znhva2prZnVza2NnZGR2gWNlZmZmampja3NbX1pdbWRhTmlYWmBWSkdIS01TWD45X2xpSENVVF1bSUhGRkEuPD85QTg5UkZANzpCMDM3PTc2OTI6PDk3OjlETT1CPDAqPEA7QT0tNUIzNz0rKiwwQipKSy4vKiszNzIyKDU3JCs3LjcyNjg1XXlOMj5IaVpMWkpWYmZAOjNCaEglNZqjoI+LrKGYl6CWpLOxorK9tqGxxry6sbGktqyqrqi4u7q5rcCyrq6utq6yuLOprLmxr66ztrq2sLi9rKaetamfn6+jqa6cosCgsaOusK63rbWera6traKanaappZ+Vmqeln5mloqidmp+blJyerK+muqiuoqGam56ZnqSapJ2Xnpebk5ifkqiVqqeak5qakoyVmY2UlJqppo6NiomOe4F0gYGKmIWHfImJhYWKjIqShJSbk5KPkJCWjpB/gIyOgnCAfmZ5bWhraWZxcmtcaGNjdIFiZmdqbmxnampobl1sbHRwYVRjaWRmWklGTE1PWVFQVmFlgVVBV1NZVEZIRkVALzw9Nz82PEZOYTg6PzI0OUAzNzgyOD83PTg+RkpARDkyLT1BPUE9MDVAOUAxLSsuMzw7SzYvLissLTI0OzYjMyopNi41NTQ2NVp8XTE5S2pbTVtLWGRkQEExSmZDJzSRoZuNjrCempOhmqmxr5+5v7WgtMK7vbqxpravqK2ktre2tqy8r6yqq7aqs7iuprO1sq6psLa2sbO1uqapn7WonJ2ooaismqe9mKyjrq+1taysn7Gtr6mim5yiq6iclJympJ2aqqKklpqfnJCbpKqqqryfp6SgmJqZnaGPa6KWmZxwgpWao391kamnnpSUnpCJl5mAloqhkHmHlIyDbWl+doNxbIaLhn2FjIdwXmNhZ4SYhWuLj5SSdHeLhH6Dj39nhoBndWhlV1xoc25OUGpjZ3OFaF9lZm5tal1gYYqPhIRmTktEOUdUZ15KR1BQVVVMSFNhcHRmRltRVVBGSEVDPjE7PTY9NjwzZlw1Ojw3NTtENDg2MDpCNz86PkZMQ0IzNDM9QUBAPTI4QEU9MSwrMDg9RzYwMS4qLiovNTY4LCMxJzIxNDoxNzVYgWwxNk9rW05cS1tmYj5HMVFkPSoui6OZhZWwm5uToJuqraqjvcWvqbjCuL28rae2sKWro7aysbKwua2ppqy0pq+1o6m4traop6y2sq60rbOhqZ+zqp6go5ulppiruZSlpa+zt62upamtqqyloZ6coKemm5egpaWbm6emnZOfn5iQnqippLawpKOinZaYl5ejiKCOkpmGoIeTnKB/pH+lqp6SkpqSiIRyeI2OhYihdoiMaZeIZn1zeKBviIeDfo58f6GgoJmAfIeedIeOdZuKbIeBg2xoZWN6bHFhU4VtYmxpmHFYaXFwiFheaVtsbFuIcW56coVnhoRaXkdOP0dfTUVSVlZRUVJXVWdeTVdJUlJQRkdHPjw0OT05PDc7MDw8Nzk5OjY9RjU4NjA8Qjs8OT1GUUc9LjU8O0A9QD41OUdBODIpLjE8STkvMDEuKi8oLTQ1ODMlJjIxMTU+MTw4WIN1MjVSa1tOXExcZ189SzFXYTcwKIqmloOcq5yZmJ2fqqqnqr/DrrG6vbfAvqqlt7CprKWytK6vsraqqaWwraW0s5yttba1pqeos7CtsqeunaqfsaefoqKZoaGarbOUo6Wltb2mrKerqqyopaGgmJ+mo5mZpaOkmJykqZaUo5yUk6OkpqG3pKSgo5iVk5eSnIivkJeUiamLlqGchbGAo6ydk5mdlHmC1KiAh5XBm8d5eLGlt5dkgMCcv3mEhHmRhHyQkJHKcpe8nMV6crWmu5B7gGyWsauweGhrWLGubmVpvJK8bmd6b3KP2H5Ta2O2sn+BcpV0mqGqkFdPV2JQVk5GVVtYUVBSjVxXW1FBXURRTkVHSTw8NTc9Ozo5Oi49Ozg3ODs5PkY2Ojc0PkA+Njk/RVJJOi41PjtCPD9BODpKPjUyKjIyQkUvLjMyLisvKS0vMTg2LSAvNDE2QTE9OleDdzIxVGtcT1tNXmdcPkwxW100MSGMppKAp6qfl5ydpayyqLDCvbG1v7W3vsGqp7OsrKmnrrOpr7WzpqemtKWnuK+cs7K2q6Wkp7GurrCmqp2no7CioZ+dlpqenK2rk56in7S6oqqpoa2upaGdmpqhp5+Xm6egn5iep6eRnKealJ2hpqKhsaOfn6OWlpKXkpmFr2tqio2qfmaDlYatZHCdnZSZppRxrqGkfni7fWuhj3axX2q0W6WAZZyRYGaCe2Z/anhrqWW+cmemjHWxanyxeHSSk2NtbaduW4SgRWhmh5ZFdZxgfmd8pKeCWl+Lq2mAlXh5aqc3Sq9cWFNsZFtLTlhfXFdWO06JUFdXL0lUU0pERUY9PzQ2Pzs4OjkwPTg5OTk6PTxEODs6Nj1BQDY8QEhRRzkwNzxBQz5ARDhARz0xMy0zM0UzLi41My8rLyguMC46NS8nJDIwM0IvPTtVgnYyLVZqXE9ZTF9nWTpNNV9ZMzAbkKKVgqyopZ6jpKqxt6y0vb+vtsSyt7rBpqmwq66oqa+uo7C6rqOkrbKjqLionrOzsKOloKqtr6yvpqefo6Gvm6KalpWWmpqspZaboZ+0s6KrnKKtraCdmpegoaicmJ2jn5yZoaakj52imZehn6qepqagmp+hlpWRlpCahbWbtXiFqZm1mXaGs5u3fpOWlqmUf2uBpnuChoiSlJJ3q2drsVyreo2GlHSJco+GgH+IkJd4goKLmIuDoI+EsHZ3n3Fra2x8i06kWEhiYpl+Y2imYHlydVOTh15QqW1jcX6HgGKcLlGhb1tTa2hgTEtbZFhcWkI/snlYWEEjTWhGQ0RBQEExOT44ODo4NDs6OTw5OkE6RTo6OzY6Q0I4PT9LTkc6NTpBRkJAQUQ8RkQ7MDIwMTtGLDAuOTQwLC4oLzMsPjgzMR8vMi1EMTw8U31uMytYalxPWE1fZ1g3SjhhVTUwG5WflYizpqahr6mns6ypu7bCsLvCrbi2v6qsra2tpq2xqaCuvKqgp7Sso6u1pKays6ekop6nqrKosKelnp+frZWfmJSVlZedq6CZmaSotK6iqY+pqKqbnZWYoKSnmp6cop+boKOko5WbnpeZnaKpm6aZnJyioJeTkZOTnYPVk5m5cLDBfsaGfNaUm7t8mpWlj42djaR7joekgqWCeqx5j51Wr3qIfp9quVu6d4eEfaaCk3yYeql4jZ2Pe7FujoR0kbyFb5RQr6fFilGgemNgqmJzcohtl4hgU7W0yIaAiXxjpDNCnXZdUGppZFBAWGdaZGFKSE5uTlxST1lmWUNEP0U/MD08NTk7NzQ8Ozg9OjxDOkY6Oz42OkBDOzZAT0xIPDo7REhDQkNEPEVGODEyMTFEQy4vMDQ4MystKC4zMjM5NzEjJTUqPjM9PVF3ajYqWWlbS11PX2ZUN0c6YVE3MSWbopSZsqioprSqpbSppLy3wbC5wLG1tLqztaexr6Kwsqafrbaomqe5raOvsaCztLGhpJ6fp6mwqLSopJudnamVmJeVl5WWoKicmZanrbCpo5+PraKolp6Xm6GloZihoaGhmqGippueoZ6UmZumn5unlZucn6GYkJGUkZ2Ism5otXGrh26OpnK0c3K2e5qXpIuPnY2jf5GhpX6wdoOR0tJ2XK57hX+kb5uqpmuHhX2tfZeZjnuwcpKdjnizZZZ0hJ5vnmaUUsiLWsJcn3liX61gdnOHYpeIXlnKnW+/gXVNS7VTVcZkVFFqY2ZYQU9rYGxoUFVISTk9VlJaV1hJQz9KPDI/OzU9PDQ2Pjs3Pjw9QztHOTtANzs+RDsuQ1JKRz4/PElKRkNFRD5ISTkxNzQ2QT4vLjI0MjUyLSkuMjYsNzQyJh82MDs1Oj1QcWg5J1dpXEJPVF9lUDVHPWFNNjIwoZ2SpbCso6u8raa0pqe2u7yyur+3trO5ubKktLOgsbGinquwpJemua2ksbCctLiqoKadoamksaisqaSZm5mmnZWTl5iSkqGmn5WSpaqwpqKWk62gpZKUoJukpp+Vm6amoZqin62ZoJ6ekJWboZ2cppWdlpqin5WYlZGbhax7d6h2o42IhqlvrYqCp4OYmKGJkpqLon+TmYmuhX+Cs1xys1KufYKCpH9y2H54hn6PnYWamnavhomRnId3tGGaZZqCgpRsklqwWEuadZh5ZmCtXnZ3iGiYiGtdr3eVno94bDV5yK6yX0JUb15nYEVQbV9wbVZWTS5mZGlTWFE7QURATDo1PzkxPTwxNj85OEA9OkM6Rzs8Pzo+PkU5LUVVSkVAQzpNS0pCSEc+R0s5Nzw0Njo+LzA0MzMzLjIuLjE4Ki4zMiUhMDM3Njc9UGtlPiZWZ1xAPlZfY042R0NgSTo5OZ+elKC5sJe0wq2os6ipsrq3s7i+ubextLu1pLeyn7Osn56orJ+Up7WrqLCxq620pJupoJ+oobWmpqmimZ2Uo6GTkpuYkZShpJqSkKatr6ahlZmpn6KOkaGZqKWhlZmlqZ2cpJ6snaGdoI2TnpqdoZiZm5aXoqCTl5CmnoapfX2leKGOjYKqcK2LgaeGlp+hiZeXiKOCkYiUqnyAi514b7FaqIKCiKB5dNmAd4h0qIGOm42SpHyWkJ+Ee7JenGSgfoOVbJJcq1tak4CRf2hnqmRye4FrmIdzXataiaCOa29lT0pDoVxbTHRdYmdNW2FfcnRfS1Y3SpuUWEdFPUdGQU0zNUE4Ljs+MDVBNzhAPDY9PEY/Ojw2Pz1CNy5IVkpFQUg2S0lOQElLQEVOOjpANC47PjEwMjE0NCsqMDUvNywmMjEoJCQ2NjcxPFBlZUEmVWZbPzJVX2JMN0ZJX0MyPziinpqav6uYtMKuq62ppbSwt7G1vrm5srC2uqi6tJ+vpJ2kp6eek6qwqa+ptayqr6GYoaCmpKS5oqOroJabkKGflJOemZOXnp6PjIuosK+nnZebqKafjJKjl6irp5WXqaeenqCjraShnqKNlKGYn6CSnpeclZ6hlZaOq5yPrm1ytHOpi3WKp3O0eHOzgJGko5Kcjomkh5B3uG+Me4uiamu2WqGFZZeXaaCip26UcrR0k5h/smqFkoita3WzYZ1mom+Hk2qXXK1fTaF8h5FSc6NseX9+b5iHcVyvVjycd2ZUb24uXKdPY1NrZWJtWmNdYXB7Y1RaUj4+bW8zQ0JAP0w5ITdANi47QDM3QzU4Pz8zOzxDREJKRk1JRjYySlRLRUJJNklKUD9ITkNGUD08RTUwOzswMTAvNzUsKyw0MjYvIzAwLCwdMjg5LzlOYGVEJ1VkWT4vVV5hTDVGTV44MUM4ppubnbuhm7LAr62rrKe3qbevtcC0u6+ut7aqwLWoqaCapaOhnJGqqae1o7Korqqgl5ynoKWruZ2jrZuWmY6kopWMnaCbmJyfkZOUqrawqJmUnKypl4yTpZmlraORlqqypJ+epquxmaGjkJmilqCblpyXoZOdqZyUkKuZh9SSmrtzsMOAw4Z+1ZabuHiIkJiMl4uMp4h6o7Z1fXd2woKasmCDunnAfHW4Y7WBjIepfZWBrKlxe390vIinoGmdYaaOr6J+jHSHqn2+b3O8dLKDdXiBim6aiHFujaR0vV53fVphebxrWlZcanleamFlZ2NteG9aXFpEQUBzQENGKzVHIic7PzEwPD83OkI5OT1DNDxATlpeYGBfX19aUFBSS0VGSjRITFJASk5FRk9CPEU4ND05MDIwLjg3LSouLzE4MCItMSwzHiw8OjA4TFhhRidUY1g8L1ReYEs1O0xbLTdBOaeanqK8oZeyw7Ctqqursae4r7bEsLmwrLmurcCxq6OinqOhm5uQqaSqsqO0pq2ln5aaqpmnrLmdo62YlKCQpZ+SjJyinZidmpGVkq+5sqyVl6Onp5SQlqScpK2ekaCoq5+bn6ijs5+jpY6ooZSimpyYlaOYkK+gkpSpnoSQmLZ/j5GMt5V4gpOatXdta25zb3mQhY+KdJ7Bu72ZeoGxqHCAc5G5g3yGhoyHjXyKh42XfKS7ub2cdXq0o3R2l3Z0sHWZnmaGao21dHJxd7aMXn96fYlog3lueWKLrHB1hX9YW6dqRWVaVGZgY15jUWhncW11Qk5QTUQ7Wk0/SjM7MCA4PjsuMz1BOTk/PTs8QzZCVFlaWltbWlteYGJgXVNHR0g0RElUQktOR0VPRj9HPDc/NzA3MC85Oi4sLy0qOC8lJjIoNCQoPjcwN0xUX0cnU2JXOCpPXl09KzpWVic+OzynnqChv6WWtMO0rKuorKupuq6wxa60say2prS4rKmhoaWeoJ2Zk6ukramltKenn5uWoKOdrKS+pqGqlpOckKGakY+hp6GTnJeTl5SxtbetmZ6kpKKLkpKmm6Wqm5appaWcmqGopaekqaGSrZ6Wo56Xl5edno+vqJSbpqGNan1pm6Z4h3J9mY50eWSHe72+wLpvk4NylYdhc2paXZqJYWOIjpVrYICVY22dd2KVa4CalZRlXmBjcJqKaHKLfYWVZ2p+cnV4fX5iW3d0gWhQXG6DfXyLa1hre4JySkpvhnBOdE1FWF1nYUxaWGdjX09bbnVpclJQREVOO0hJPU0/MiwyQT84LzU/Qzw5O0A7PUM+UlZWV1laW1xcXWBhYWFgXFVHNURGVUVKT0hGUElJSDs4PTUxOi4wOzouMC03Nj01JiIvKjIsJTs4LTdKUl9JJ1NgVjQpUF9MKDM+W08nPzI+qaCoosKjm7W6taOspa6np7WxrMirr7Gps6K9sbGmoKKonKKbmZmspq+jo7SppZuXlaGbpq2ovqeopZSTm5WfmZKXpKiokJ6RkJicsLK/rJunnqeiiZORqZqoo5qarKCjmZujp6yjoKujmrGblKeglpSdn52XsKWXoaeZm5CcnKKjmKWhmZuZmZmPlYFnbX1xd5KXlJKFi7WqjIWXlY6KjJiWh5SVioSTlJGJjpKUmJSYlpqgoZqclKCdjYJ6pYZsanyRfIB1ioqBcYJ4eXZ2ioB8impzgXWDdWV3fXdrb3ptYGNdcGhNWFpmamBXWnB6bm1mVE9GUzlPWk1STygrOktCNjM1PUBBOTpDPjxFTlNTVFZXWFlaXF1gYmJhX15eW1RLQ1NHS05ER1BMT0k8OjszODksMjs4MjApNklSTzgiKSsvMiM0Oyo3Rk9bSiZSXlMxMFReOis9OFxLLDwtQLOhs6LAoaSysragqqayp6WwtKrIqqyvpLSlwKezoJ2kpJyjlZWgqqeso6K2q5+Zlpafl62qpcGeq6OVkZuXnZeSk6GenaGnk5KZqKeyxLCaq52rn5CXlqidqpucn62ZoZudoqSvp6KlqJ+umJennJmaoJ6dnK+gnKGmlZeSl5OfoJWinZegjpaTioqNjpeukHyWm4OSgouqqYWAmJeJg4+eiHqEkIeGmpKIhoqWj5uXjZGYnaOWmpORnY1/jmahs6+FioR2e5KKfXZ5em9meZCBgIlrdYF6iHJpc397doOHgmt1ZHlmYGplY2Rma1lse3BpalxTTFBEXlRGQD8+LDRARjs0NTs+QTs8Pz4+SE5OT1BTVVZWWFpcX2JjYV9eXl1eXVhWSktMQklPTVJKOzw6Nzg2LzI5NjQuKCYkLTEuLykrKjclKzwoNkNNTUQvVF1RMDVNWzE3RTRbRzU8LEC0oLqvv6yrrrKxoKumsa2irLOvxK+qq6Kyrbyjs5ufpqKhnJmXqKWppqSlsrSelZSdmZmwpa6+oKyikJGdmZmUkZShnJeonISfqqujtMi0n6qkq5aWl5qmnamanqOslJ6fnqCpr6qmpKyirpufoKCYpJ6cn5yvo5iep5KXlpyRo5iXp5yal2WCknxlfo2akGN5jm1pa3uSpKpqZJqXfWeGimVlaWh7jqGPbGiNmJGjd2tqi5mjnplzbG56g42HelhlXoaDXm2LiYF2XGhzd3eSgIeCbniCeIBzbXmEdHaIiI+DfGuHWV5sdWRec4lpa3xxa2NeUk5YSWRYQUo0Pkc3P0ZENzE8PT9BRDs7REdISElMTlBSUlRXW15gYWFgXV1dXV5fXVpVT0RIT0tTTj0+PT02NTM1NTU0KiYmJSwqJS8qKyc2KiQ7Jy9BSltKLzdaTzYpRVkvRE8yWUM7Py49pZ+6vLmvrLSxqqWora2wpq2tsLywqaajra6wnqyWoKOdopmZpqqcraOlqKmyrZ6Vo4+ir6W2uaauo46OmqGZk5Kan5mZpJV7pa2iqLTEuKWip6+fnpSeop6jm6KpqZKfoZ6gqrCrrKSroKqbp5+noKuVoZulsKSXm6qVoJyakaOWnamXnX29g4hytHKEnYataHi5xLhxk6KjeqWZmHOrgnzLwMC7cYyiiIOffZaYiZ3AvYKXnZ2NncLBfIJ7ko2aw8B+bKWyboyBb8p6f5t3kYOOgXZ5gYB5cXp/h3B3hYyTeW54lGNmX3lkYGWCY150aGxkY1hMV0lRWkhPRDJJRT9EQj4vPD8+QEE6OERDQkNFSElLTU5QU1ZZXl9fYF9eXl5eX19fXVxTTVBHVU5BPz89NjQ2ODI3NiomJSMpKiYuKyopMTAfOSojPklbTCojQlAuI0ZbM1BZL1ZBQjsvOJajucO0sLDAqaiUo6+psK6tprO0r6mlpaawq5+rmJqin5yaqqeinayipaikpLSknaKSpq2rt7OnrqKRkZmcpZKRn6CYm5+dh6aspKutwMCxoamvqZeRn52imqGjqqOToKKenq2vqq2npKSnoaalna2okaSaqK2pmpypm6uglZWklaCilpx+zpR4eqSBeZWWm1+uj16Op4GioHynlptzq4OAr15jjap7p4eFoHWXk4izY4KrhqGNjbNqhK50fZeIt2GCrVqjzW2QdXvae3+ZcH6IknZ+ZXuIdnZrfIhufYaRkX9tg5BhcmxwaGBgeWRccWhqZGdgUlRTV11LT0M1QUhERDg+NjtAP0E7PThAPj8/QkRERklKTE5QUk9TXF5fX15dXV9gYF9fXVpXT1VKPT8+PDU0NzcxNjQoJyQhJywmJi8oJiszHTYwJDc7U0wrLC1LMCc7XDtMLSFQQEY0LjGtwsC/tbSwuJedkaOqp62zq6ayrKyqoqqnr6mgp5uZpZecoq+foJ6op6OmoZ+wrJqdlaeurLCqqKyflJKbn6STj56kl52no56upauwqL/Hs6ipsa6Wkp2bopefqaqflaCfnZ2tr6msqp2oqKSiq5KsspaloqqqnaOmpKGvn5GYppifmZOTkZegcYWMl3WFqIZxsX2ecqx+oZ6BpY+ed6qCfa1/nHOtfquHhp92mZJ7fJd+qoiijJGMnX6reoiUkJ+Ae61WnMR6j2+SwX2BlW11b4xtZXZlhm9hd25yb4mKko+EbpKRZnB1dXFhZ21lX29paW5nZFhTXWFaUlNDOUlJQEQ8PjxARkRDRUE9PDw8PkBAQUJFRkdFQENJU1dZWlxdXl5cXl9hX15eXVtaUkM+OzkyNDc4NDUyJiMfHCAxJyAxJyAnNB41LSY3PVdKLTwoPjEpM1ZARiEcRzpDMS4rsNPGxrK0oJ2jjqOioqyvtq6osKaoqqatq6umoaSdmaGVoKWrn6KloKioo5+dsKyXmpapp66sqKeonpeUmqOhkpSgrZudpqKvrKSstaq5zbKtpq6sl5WcnaKYnq2snZegmZ6fqbKrq6ucrKuko6ybr7GiqKuupZilqqipsKGRlaKkmZORhKRqpHWJeql0erJwgqaKmYxxiKCah6RgYFKrhH+ug5t2rYGnhoafepmXhntmgKOJpJmGgqN9qX6BloeuX32pVZ2ikoF6op+Ae8OvxYtyr7OzuXFiqa/CdGiMjJiOgm6clXFuenh5cG1nZWVycGZ8aWNdV2BqWFlVTExRTENDQUI7Q0BAQkk8PTo5Ojw9Pj4/QT04NjtETFBSVFZYW15eXVxeYGFgX15dXF1bU0lCNjc5OTY2NCwmJCIgKCciKy0iJC4hMy0mQERXSCxHKzU2KjFQS0wjIEE5RDQsJ8PJ1dW/oZmrp6Cvop6wtLCuqayip6aoqquppKafm6Senaanp6OcrJqirKGjn6+inJuTq6S1r66gqJqdlpSmo5CaoqifoKWcsKakqLGstsiytaqsqZaRnZyhmJ+ks52aoZSdn6esraWwm62qo6KqobOtoaqzsKGaqKeurrSikpWippiakXuqbJ6Eh3WreXywb4Kki4mflpaflIHSuLS4yYCBsl9glKmDpImHoHqYlpp4qsl0mqSVqKmRk5qMgJyKmsbHeGahgqVzgZ+Ogn2vXXC0YrB1S6OGbadHgpNkjpCeknxxmZWBcXx1fnxuXGZqc3FmgWteYVlkbVxfWUlOTEtFREFCPkE8Qj9KOzc5Nzk5Ojs7OzMuNjxBRklMTU9RU1daW1tbXV5fXl9fXlxcXFxcWE1CNzU2ODUvKSglJiUkJiksNEVOUFBNRktKVkYqTDAvPS01T1RRHRw7PEYyLCSnpMDGuK2osq2spaKcsrisqqClmqilqquppp+mppiqo6Cuq52moKyanqmlnae2n6KXk6mqtrKtm6WcoJSPpayRmZynoqCppq6hpKepsLXDsrOqraiTiZedpZqho66ll6GVmZylpq2csZ6vqaeerKO3rKGxuK+dmq6msrKyo5OWp6KZno6CnU54moF/n3qEo32DpISHpp6cnpOEuHt7ebmCf8zGwrZ4m6GQi59+mpaXinaemIqlmKSof7CFnYaghKx9mpRipWykcI+EkIF9loJyrGCjc3GAmmC8fVJVdI6So5Z7fpSTjHZ8c4aAcVxubnhyaoFvW2RfaW5iZF5MTFFUQUlIRkk6OUs+QjEwODg2Njg3Ny0qNT09P0JER0lMTlBUVlhZWltcX19eXV9fXVpaWllVU09IQDg4Mi4sKi4rKicmP1FUVldXV1lYWFdVT1VGPEUzOlBbVBwbNj9ILC0gi4eZqaukq7mqrp+boayys6WeoJWlrq2uq6ecpqaao6ehs6+iqaeyoJmqpZSitaKilZehqbS4pJuinaOSj6GxmZ6bpqShoq+unKWoorayxLGtqa2pkYeQnKecoqScpZeemJqapqSrm7Cir6WmmK+ku6yhtratnZy0sbewsaWXnK6fo5yFj9G1w7d5h46FkZOQgKZ4lKF3jKCRhKWBinGqhoW0bnJqmaOclYqefJiZhoePc6+CpZuijaaLk52LlpCbbXGyXaVzk3qba5l/e5l8balho3Fxf59ic7K4aHePlKaYfY2OlY15fnmQg25qeWl5cm+AdV5lZW9tZmdgSltYWDxISEBVNEBGPjwqKDYzLjAxMykmNDo7PD0+QENFSUtOUFJUVldXWV1fX15eX19dW1paWFVSUlFGOjIyMzAvKysoQFFSVFVUU1RWV1dYWFdVVVZUUU9RW1UlITJBSCQpJZNzjYqtv7+8urSelqelrbWhopmVo6imrqusmaain6agobano6mnsaOUrKOOpa2jnZCamqqzs6ScpJypkZSXrp+fnqajnKectZmiqqS2q8OwqaupoYyEjpyioKajlZqanJmbmaelqJmtqa+jpZutpr2slL2wrJ6hr7K5qrKlmqiwoqeXeaiQfXywd4qApKWInG2yb6CHrXyhj4OnlZiArImFroWflKqgoZeGn4CZlYB7kn6rgJ2aloureJ2gkoqUkoF6r16jgX2mp2OdgHyXc2qvXaVrcIWZXWBbjKBtlZGmmYOWjpmNfHyEmIBrbn9jf3RugHphZ2ZxbmhnaENaYVs+S1UzVThCQkM3JCQzKycnMywgLzY2NzQzNTlAQ0ZJS01OUVNTU1ZaXV9hYGBhYV1dW1pYU1BPTkk4MDUyLiosQVRWVlZVVFVVVVVUVFVUVFRWV1dYVlVVUUhGSUojKCi9k5qDqcbCtsGzn5qsoK24paOOm6Sjn7Cwqp+kn52tmZ+5oKOroK+pmq6hkKuopJaJm5CusKymnqabrJeXj6yhoJ2loZmknK6Yoaint6nBr6WppJ6LgI6bmp+mnpKVmpuUm5qmpaWbqqytpKWfqqi+pJbCq6mioKuyuKmtpZ+yraeol3avfpCLnIWHfbqtipllsY1lla19oI+DppWagayKhLCFppqkoaGRhaBbbGqBs2B/rXt7g4GxbWdvmZiMiLFbfrVdpIRryKJkn4B7vFh2tVmyfVKugHqsWIChbZiQqJuMmJKZmHx6kJ5/ZXV/Y4V4dIB8YmpncW1nZWZPVmRcQVVfPkkoPjo9NCEiLCUfMi4gKjEvMDQ1Nzk6PEFDRkhKTE5QUVJUV1peYF9gYWJeX1xbWFVQTkpHQzU1My4vQFVaWFdYV1hYV1dYV1ZXV1dXWFdXWFlaWltcWFdXR0I70p+zsbe9urPBs6OcrKaktqigipqgn52zs6mfo6CetZmgtKiqrJ6vrZ6sm5WvqKKOiJuOr6yop6Gmma6SmI+omaGdpJ+Zo6OmmaCiqrOpva+kqJ6dj32Lm5ahoJmQkpqckpqYqaCimqmuqKamoqWpu56gxqakqKCqtLSrraWeuqyrq5SAqZKjr46bf4ekl5mQgoC4w7qDjpyShKeXnIKsioKviKecm6aqkH7VvcKqYqO/vX1+o4KD17q4tYWVk4Oevb6EbKOCb6uEbJx/erKwx4Npq7C9rHh3or68c4CWjqadkZuSmp97gpKce2R+fGWOZ3mCe2FsZWtqY1BhW1NqXD9VYkNOKT06NC8fHyQfJTIgHSQoMDQ5NjY3ODs+QURGR0pLTU5OUVRXXWFcX19hXmBbXFlUUU1IQz89QT81PVNZWVhZWVpZWlpZWFdXWFlaWllZWFlbW11dXFpWWFRXWryVs7Oxv7myvbKhnK6mpbKmnYyYpb+quLKoor+np7KcnrGcuqifra+mp5SUsKyXjIObka6loqygo5yqoJeKopKmnaecmqGoopmfoayuqrqtqKOal5N8h5mRppuSj5GYmI+YlKmboZmqqaGqp6CjqrudqMWioK6jqbOzqa6on7mmra2Zc3WqpLeGZImgcGiukYqQbm53pJCZn4F1rpiUcI+LcZWoo5uXrqRybWxsZot4b26CmXGBempxaWeKl5aYcWlphYhncYZkXYhiam9ZXGZ9dqZfYXGOkW5lZX+Nk4+hmJmZk5mhfomRlndniHhpjmt6f3llbGNmbGJLZFhKbFo6UGVFUidLOisjHCAbIiwpGBsYLTIuNTo0NTc6PD9BQkRFSEtMTU9RU1ZcV1pcYGBhXV1bVFBMSEQ9OkFCN01YWlpZWVpZWFhZWVdXVldZXF5eXVxcXF1eXV5dW1tVV16plKyzqbm4srOqqaGunqOyqZeSvrLEyr+3qp/ArK2koaesoLqjpK6srqeOl66pj4uFlpetnaaqoJ2jo6CRi6SSppmomZajqqCWnaamp7C7rKyam5OSe4SWjaWYjZGRmZSOmJaplqCYqaObsaadoqu5n6/Bp6OypauvsKmsqqa2oqy2lYqgqKW2nYmWo5mHqpuRlZ2SqbKZmqOqoLKWoqGdn6KcoaWhlaunjZKSjIeTnJ2VkZmTmZGOlYaBpZuYlo6LlJSLkIaEfWeJfnSCdXOGinCnbHqUkZOSgYGNj5CPnZWil5qZpISJlo9zapF3cYx4d3x6am1kY29kVWFZQGpcSGNhT1krRj0rJyE3NTAuHxwhJTIoKjY5OTQ2OTs+P0FCREVKS0tNUFBRWFRWWV5gYWNdXlVRSkVEPjk9QEFTWFtcWVdYWFhYWFlYWFpbXFxeX19gXl5eX19gYGBfWVlgppaoqqW0tq6uorCjrZ+gtbGQjqzHvsa7uaujpZ6cpp+xqaS3p52ptaeokZitoouHiY+cp5WspJ+Yp56ekpSjlqeaqJmUpqGkkJuomaG2u6irmZqQjHyBlIuhlIqVkZaQkJSYppCfm6qfnLajnqert6euwa2jtqWur6+rqKiyt6Ctu5iRpaSmtqKSnqegjqqgjpKfo6yvmqCjr6ivmKOgnKOqnp6dnJarnZOZoZuUkJarmo6ZmZaQlp+SiaGelZWFko2RjpWLgH1mi4V1hnV4h4JznGqFj5STkIl8i5WSkpiUo5OfmaSFipqJfHOXc3qLgHN8f2pvZF5wamBbYFluZFBgZVBaOkdHRT4yPT45LyomKykmHSY0MTY2Njg6PT0/QUFDSUpHSktMTVNTU1VaYGBpYGVWUEpBQ0I6OUVNVlteXltaXFtbW1xdXV9fXV5fYGFhYmFhYWBiYmJkYlxbY5eVo6ejr7KsrqOppq2fp7WqkJCdpbW8sK2toqOae56jsqSlsamXm7mno5OZqpyOhoqJnKKPrp6ilaifoJKWmJqti6mWj6iZqY2ZqY+eurekpZmbjYh5gZSMm5OKlZKUkY2Sl6ONnp+pnp+4o4CEr7Wir690o72jsZ93eZ+psLmUdayjnomAqn9kXGJ2oI+ln4SXfW2Ss5yjp62qomWen5JzeZqXcICYqJdtf6KoimWcpp2SmJiWjJKckoaempCWhJKHj4+SiYV3ao6GdoZwe4V/f2Boh4qUkotadZSQZ2iQj3N7qJybZnqaiYR5mWqEi4RveYBrcmVfdnBsa2hbZ2ZiYnBTXD5OTk5TRz5AVUQ5MS8eHyY0OjMwNjY3ODw7PkBBQUZIQkdGSUtNU1RVWV1gaGZnV1FKPERHPDhVUltgYWJgXl9fYGFhX1xdX19gYWFiY2RhYmFhZWRjaGReXWablaajoK6wrKuppaiuoqatpJKWq7axs6ebq6esl3SMnbCgqKunlJe5oKCPnKSdkX+JiJuejayaopWnoZ2OlpGehHWtj4imm6mRl6SJnLu0qKCZmIuJdXeTjZaTipORkZSMkJShj5uhp5mcspaAjJu1nLOMko67pqB+p6J6oa21gI6NpZ6Di4aQsaqvjIqXpJt6gIushpydoaeop4eVhZh3pZt6h5uBmKeCgnucsnqKhqGYmpWYloKRl5eFm5ljeoeQhY+QkouDbXCOhnmAcH+AhH6Fc4WElZF4lmeSdKCadX2ZhaOfiJh/lIyFhZprjo6GbHh7cXFnZHhvamxrW2VsamV0XF5JVExSQEU1LlpVVTYpITA5PT43NDM1Njg7Oj0+PkBEST9JRUpMR1NYW1lbYWFoZllRSDlFTDw+YlZeYmRmZGBhYWBiYl9dYGFhYmJiY2ZnY2JhYGVkY2djYWFonJein6WsrKuorJ+osKamqaWZlK/Iv7Gil6iptZ6QhZ2snKeioI2Qvp6ajZ+aoJB8ho+ZmIisnKKWn6GRjJOJhoCRp42Hop2klJieh5+6sqiempKOhXF2kImVkIqUkI+bjJCSn5KXoaWWnquHn7SJtJqtisqHqa2It4WNsIGurIKojKaYjZ19qI9ye3ecj6eXaJWkebSMn56mp5KYwoF/q4iYoXKegJqlfZeFlbKBoX2hk6CQmJeBjpOci5mSjH2Fk4eOlpKJg21yj4V+eXGGgIN7g3SEgJaAj8Vmf6mHj6NrnoSknYSagY6Ph4uacZCUhWh4dXx4aGh2cWhobF5kcG1nbVhnR11STTJENDZOYmU3JjM8RUdEOjY0NjU4Ozg+PT0/Qk0/TklKTENQWl1cV2FeaWxcUUU9TE1ASmRYXWNmaGdiYmJiY2NgX2JhYmNjY2VpaWNiYmJlY2FmY2JiaZSWop+vp6iopaufo7ewqaqmmpSgo6SrpJemq7ijsIGhqJ2mnp2JlL2ak42hkp6PeYSWlpGIq5mbm5mihY6Ld5ucj5+QiJ6lnJaamIejua6lmpyMjH5ibY+Lk5CNkI2NmIyRkqCPlKChmaGnfqGnh62doJatj56cnZGFgKCMqa2Fo42pmYyaf6N1gJmUa4Ktdk2reIeNnJGaqKeAqat9g6F7eqdqnn+Sa2eXhpe3iZ5+bmBkWYOXf4x7ZGiLc5l9eZZsXX2XbV9TcINcX2t4gl9YZIF8g3+XcKeqa4OjbnKlcJ+FoGpmoG1bb4x9Z1pghIBiWFBvd2ZtdHNram9ea3Fta2lYaU9eWUY5QTRIRF9sNSxJQ1JNTj04NDg1OTs2QDs7PkJPPlFSTE1CSlxdX1deXmJ1YE1EOk1PTlRiXFxmZmlpYmJkYmRkYmFiYGJkY2FjaWtkYmRkZ2RiZ2VhY2iXlZ2guKCpo6askaC2u6utopmYoaKlra6hnq+1o6iToaCgp5yajpm0mpCLn4yVi3WBlJKNiqeWlZien3+ShYWspIeakIqZqZmam5KIprGnopaaiImAaW6Ih4uOjoqLjZKMkZOjjZSfoJyhpH+TgY+joZSgd5yVj6eDoaZ/haerg6V4iXyEmn6icHOUiJZ8n415bYebjJmPm6iaj4ede4Kic3amZp5+d6RfmHp9k3Sibpi3tLp0k4eCf7WoZIHGuHtwlbaMcoCapGNzrKtgfGmds35tfIaBjYKLmHF/o2xyo3SfhYGkYJ2Zs5ZxfZifs3VzW56yg2pjb3R2cWhvWGttc3JmXWleY0xFPUQ2UkJaczM9U0dfSlI9PDM5NTo6NkQ7O0BKUD9VTU9RQEVfXltaWGBgfGRIQzhMV1VXY2FaZmZra2JiZWFkY2BhYmBkZF9gY2tuY2NkZGhkYmdmY2hok5WUo7eYqpuToI2kt7StraCaop2ko6aunZyyrqyTmKGaoaSZmpSfq5uLiJJ4i4VxgJaOipChj5KUnZh9kImNqKCHl46JkqOUnJuNi6mopZ6Ql4eFfmp7h359kI2Di5CRiZCUoYOXn6CdoJ6LiXecmKKMn3Khi4epiJuljpSmqX2tjH56oJl6o5N4gXSWiI2cfZafhpuOmJulhqJkoXyIlpCbjW2eaJuOb5qZe4CLp31yaHSrg56DdKpolZpdm4V2hZ1nqmuAuGZcqHCBnGCVjF6ndnWHiH6eaJp0hZOSl46An2+akG6nml2ofni7a36qXI6EXbRnXG5yenhraVxxa3l5Y2BmWGJCUUZPN1dEU281S1taX09aREAxNTE7OzZIPzpDSFU+WVJZXT5EYl5WYFFhY31qRUI5TlteWWVnWGZnbm1iYmVfYWFfX2BgZWNeYmRvcWBkZWVrZWNpaGdraZWbiam0mqeIY5Sbq7qxr6yeppycqaCfr5yesamtnZekm6GgmZaWoaSZhomNaoiAcnuXiIuWloSRlZiQeoqElaScipSPhoyekp2diZCpo6CajJKKgYBpgYZ5f5eMe4mOjoiQl5t/lKOfoKGTmHJon4qfj4xwkoyBqYeYnqGlnqZ7sK2joriXd6Ozo6SAiJR5nXuqmn+ijpyaloiXcaF8hY2vtX1rmpGheX6ZtaOkq6iEmXybfZ2af3SqWl1ve5aLeJ5iTH97eoVjeZdCTJ9Yompxe45sgIiEmXWbeIaJsbN/gJuTp3eDnW5zfZVwmnRrpF2VdkhlZGB0cX5+bmZgbGl2e2RkYlFfWF1VV0BaRlFoRVNXXGJYXklEPUI4P0E6SUY4TEVYQVdSW1ZERmJcWmBLYG1+ckVDPFVfYlpmalZnaG1vYmZnXmFhXF1eYWhiX2Vjdm1dZWdma2RmbGloa2mTnICwrZmEU16gprO5srKpmqKMnKycnKqUoqykoqiPoJ6dm5mWmKGdloiHiXeGgW95lYWRm4t8kZOWiHKAiJKhm3OQkIGJmpWhm4WPqZyblYuLi32DbISFcYKhjHiGjYiIk5mWfJSkoZ6iiK2GfbWEjp6ce6WWeqmBlZuPiZ+bfKdod21+mXShc3J8nYaZcJODrn2kg6admYGkb16oZ3WiY2+lYZzTkH17mXhzdGKihpB+o3Okj3Vrj7OMYIKYiXOqsqi8f3eDbX6/pqm0XZtufHCWbX9yonJdpGdzpmBopm2b1Jp9hptwenuYbJx8eJdzbqmkZ2BlenGAhGxnZmRvdXdnYWNTXGZRUWJJWEpVYVdTW2VqW2VRRkRLTUpLQktFOE9AUU5YU1lPU1FhZWVqUmN3eXdJRkVjXWVaaGpUaWhqb2NqZ2BjYFxdXV9oYmFoZXxkXmRnZGtkam1naGxol5qAsKtUXEt+qa+xtK+zo5uZhZmpoKGkjqWpoZmqipqYmJOZk5KhmI+IhntwfYVofY+DlJqBd5CNj4lvf4WPk5Jsl5N8iZKTpZaDj6ublJOLhop5g3aIgG6Cn4Z3gJKGiJqjmHuUo6San4mzoaK2i3qsp6SupXCpgJqOhYCakHukgKGZhphynoSjrq+Kl4yAjaSNlYOtoJR2tbW1yaFzlIuBn2Cdl6lteZWHoJt0ood3oH6Tl4uBb01mo5JwmodzpHt6dGGDgWt9oGtxZF+ccX1zlmh5abO1tMamc5h9ep1rnJurdoWbbXZ4mGqae3WYclBFfbNfanZreYdma2hjdXVwbldfVFlpUVNoSVZNWVRWXWhrblZnV05LQkpNS0hKT0FRS1BlY2ptZXRzc355fG51iXt7VFBPbF5pXGtpUmpoaWxnbGZjZWBcXV1eaWJkaWt7X11kaGNqZm5tZWlsZaGbiK6mhGU/k6Gyqq6vtaKikICXqqKjpYylp56dpoObl5aOl5CPnJOOiIN6anmHZYONf5igeXWPiIyBaYSFkYOMhZ2Neo2LlqaTg5mqmI2Si4GJen99i3lwkKGGeoGVh4mWoJZ/lKWonJaWhGZueJxsomR8caV3m5hwZ6aAlYp6pHqfloOXcp93gYqVl4+5bpGKomJ9maCViG1yaaprdaBtb6ZfmmmLkGmWh5uVdKKAfZpgjIaNdW+IYmigZZ5+aZt1b2NmiIJtcaJaXltjoW1diItuen1zcmSlbXiiZGenaJlzjJlwom9ViZBvoF9mqFSLXlSYbm1za3KCbXBpbHlza29SWVdXZlpUbUlZT11JWGlpc2pZa1ZRUkZWXE1YU2FVaWtfd3R7fXB9fHKDe4Bzdo2AhHZeUXJiZ2NwZ1BqaGhrbG5oZGdfXV5dYGpjaml2dV1cY2ljampzbWZrbWOcpJilemR0bYunrqOpsLGmn4yAmKudn6aMo6Kbo6KBlpiTjpqQi5iQjop8h3GAiWmLi3yYnHN0iX2QfGSCh5SJiZWZgnyIh5eokYGjrJCGkYuCin6AgI9zaZCmhH2GlI2ImaCPiJOppp2IpniVm36liJaMspiekIKvl5+ldpSGeKlzpY+Emm6looyShI2Du259pa+DhoWGk5Wcn3ylenKolaCWZp5+b6xjlYqWk3eobaqigYl2iIN3q5GmiGuRsGt2s4ypa4qGbW2fnpKVYH6ri6p2fn6LpZ52n3yDpJWdoGqbiHisaJ6tjLZ0d76NpJNZg6eOq2F1cnRxfHVxY2t/b2hsU1dbVmFiXWtNXVJdSl5tbndfW3FZXGBbZ3Rlbm9yYnF0YHd6fnlyeYNzg3+Be3uMgYKAdmJ4ZGNucmRSa2dob2xyamZpYWBeXGJrYm1sem9cXGJpYmxqeG1nbG5ilaWqnIB/naOWqaqdqKaupJmKgpismp+lipumnamdhYyaj4eckYWSjYyNdId7iYRwjYV+mJR0dIVykoNtf4uRh4aTjn17goaYpo5/pqeOgY6JhZV2goeTb2yLqYGDjJSOiZ2fioyUq6Ogj4B1lJeIfoF5lK6jf4GbcY+Gd46Jgn17cqeMcX19epiWm4SPeXt/foeTlZOKdpCYnqCDe32Ja4yFW3l5cnpxaW5+kolxgHWBj5STcYaEgmWMf1+Af4t3dHKUdW95bm6HbISFXnVnd45lgICFjaiafXR7lWqJiHCBdn2Hd25tZ4xzenyYeIVca1h5j2lveHJyb3h4cF1rh25qZ1ZbYFddZmtkVmJVX1FfcHh5bGt2ZmprbHd9cnJ1c2FvdWJ0e4F4dXqDdX+Af4B4ioWDfXttf2xkeW5fV25naHVreGppamVcYFpjamVtcXRuW1tibGRsbHluaGxvYY2UuKimiaCimqakmKWcq6KhhISYrZKeoYmbp5upmIOBm4t/lpSHjoqJjXKDfI99fo+Fe5iPdHKDcJWFe3ySi4aGj4V5foCHmqWOfKihi4aQkIWVg4aOmHdyhKmGjpKdkImfnoiMm6ifoKqDiI6Vmn5+iZatqI+Rpo93b5uPgXiQbn6ohXB9lXFrcH2BoI2Ak46MaG1dg4uLm5qejnOVi4hxdGuBdnSBWXJuhpGBfn6Mal1qZHuFhImAYGl4epp7goqBdYGFgmd3ioZqYXBxgXVecYqAiI6llIVli42DbneLhHGGkHpxZ2hlfIR7lltcamdudlt8eXh1bnNzg2dcbYtra2JaWl9bWmxxXF9hWl9dZnR+e3VwdGNra2t8fnN8eHVkbXVobXx+dnp8e3l6gIB+b4aKhHt9c355c39oVVxxaWx1b3Vna2hkXWFYa2hsa3FybVdbZW5sZ3N6b2hqbWCLi6qwoI+ioZqenZeemKijon6Dma6OoJWInKKRpZV/e5iFfZKZiYmGh4pzfoGMdoWMgoWXinFvgHKYhoN+koOEhoqBeoGFjJyhkYOnooh5jpeJlYuLnJiEg3qtgpGXmpWKnp2IiKGqn6Gio4uHk5uco5mWqqGnpp+SmoaUjHp2jY2Dp35/kpCSk5yyppuVn5CNspOXg6WMjJWan4mQm4KIkYprfI53eGWChpCLfImdhIeMkIiIgISEkHd8enSZoIiGiZ2JhJN+fYqAgHVvcoSBfXeGhoqPpZCChYyGgoyQjH2HjIqRhHltg4V+eplrcmhhdIpxfnp3d3B3dIJdXm+HaG5fXlpdXVNoclZkXF1ibGh1e3xzb3Bka2tqgH1ueYByanBwbGeBe3KCgHh/fX+Ee22CjYZ8eXh7fXqDeE5kdmpybXB6ZWtlY2JgW3RmcGZycW1VXWx0bWl5enFnaWtkjIecuZ6WoqCYlJiYlJikoJ58f5qsj5+OhqCdi56WfXiUg3yOmYqGg4SHbnmBgXOBiH6JlIRta356l4aDgo9/gIeEhn2HhY6cnpOHq6CEc4uQhpKRi52SfY17qoSOk5iWj5yWh4ecpZ+imp2FgpKamZmQmqafpZ2dj5V/j4h1e4aNhKV7fI6QkYaYq6GelJ2QjqqNkICdjIiTmZ6Cj5d+ho6Db3eGcXVgfoOPhnWMmICDj4KGhX6FhJRueXV0kaGKi4WahISMc3+JfHxycXqHgnp3io6DkaaPhYOOgIOKiYp3homLjX5wbH+CfG5obG1oX3p/aX58dnV2dXt4XF9wfm51YGNbXV9SZ25UZVteYmtpdnp+cWxtZGtqaIGAbHOBbGx1b3lvhnluh4B2goB+hXZxgo2Ifnt6fH97gopgaXxqdWhpgmRqY2BpXGN1aG9idW1sVWNxeWVwentzZWptbYuJnreaoaOfkZGVl4uanp+ee3ifp5Gci4ellIuYmXl6jYV8iZGEjIKCg258gHlzgYV+i5F9amh9gpeIf4eNfX6GhIZ9j4KQnJ2SiaidgHCMi4ySh6ChioWMfaiRiZCSl5OWk3iMo6CgnZaZf4CQmpiSjJujoaSZl5GafYyDd3+Cjoaff36MjI98mKWhopOakZCmjI+BmpGJkpebfpOSfoeOgXV0gnB3YX2AjYZxi5V8iIxxjH+ChYaPaHdxeIuYkY9/ln2HinGBhnt8cHd6ioN5eY+MgpSlkouFj3uGhoeEdoOEiYl8Z3N9gHl7cWxrZ19+c2h8dXZ0fXOAal5gdHZwd2RjWV9fUmtpVWVZX2FoanZ5gnFna2RtaGaAgWtufWhvcmx+eYd6bIyBc4GBfoF0doKNhn98en+BfX+PaXKDbnNpYYdobGJfcVZ0b21tYHhobVdqdHZjdXp7cmJqb3qJjJ6ykqWlnI6Pl4+GnKCbnXx2paGOmICNo4uImpZ5e4aHfoOJf4mCgX9yf3t0doOFfoqReGdjfYaXiYCJi3l9gI2DeZeClpmXjZehnH5wjIKRlIamm4iMiYOmlYWTi5aXk5J3kZ2goZeTlnl/jpiXjpaanKSdmJKUmniOhIJ3g5WNnX6BiY2Mc5ejn6KTmY+PooyLg5aYg5KWmX6YjHyIjYF2cX1ue2SAfIqFcIeTf5GCbIeDgoCJhWV1bnuFkZeLfJN3i4h7f4V8enF9d4iEeISPiIqXoZWBg4t2iISDgnd8g4qHeGF6eX50f3hnbWVhf2pqd3N0dX1xfGJjYHRudXJtYVphXltsZVJjWWBhaGt2eYZxY2pjbWVofYNsaHRobnBpgH2CeW2QhnGAhIN/dHyDjIGAfXqCg358kG12iXR0bWWKbGpiYnZWhGlwbmB4Z2xianZwZnl8enFgcmyGhY+crZemqJ6NjJeHhp+Tl5l+eKqdi5l6l52Li5iQeXyBjH58g3yBg4F4dHl7dH2BhICJi4BkX32LlIZ+hIZ1fX6Kf32ZhZeVmI2ko5l/c4d7lJKKpo+MjoqToZKDkZCVl5GLgY+Xn5qSj5Bzf42SlImdnZ6ml5eMlJVyi42Ja4SXj5l6h4iPiW+XnZqklJWLjJ+MhoKSnH+SkpWHmYh8ioqBenF5a3Vse36Lfm2FkoKUeHCBg35+i4BkcWl7f5aXhH6Mc4+Hg3iGfHV3f3yEf3uCi4SLk6OPeIOBdImHfYB0doKJhXBhfHZ6cX1vYm9jZHxjbm92c3h3c3RhdmBvbHVtb1xcX15eal5QXVljYWhtdHuJbGBpZmpjaXeIbmZsaWptaIF9e3dvkIhzgISEfXSBhol7g316gYR9fY5yeot4eG5sh2poX2lyY4dncW9ld2dubGF5aWt9e3hwYXhti4CYmaqgo6idioqRhoqdi5WYfnivmY2XfZ+UkZaTiHd+fIp9fIB3eICAcHV0fG+GfYGBin98YVx+j5KGf4ODc3uAh3uPkomTkp2TppyWgn2BfY6KkqSJjoqNmJuNhpGYlJaPioiMkpySj4uMbYOPj5GJnpmioZeViJaQbYeYg2aFmI6TeoiEkIpwlpqUo5OSiYuZjIJ/kJ19ko+SjJmOe4qFh3NydWtwbnV8inRuhpCOknF1gHyBgoh8ZHBseXyZk32DiHOQiYBzh3huf3x/hXuEi4eDi5SnjHuHe36LhXd+cXCBh4RlaHl1dXB8Yl9wYWt0XnFqe3l5bHNwZXhdbmxzbXJYW19gYWtbUFdYZWNncXF/h2ZdamlnYmdxjW9kaWdlaWmBend1b46FdIGCg3t1goiFeIV8eISFen+Jd3+Le3tyeINqa2BwaHSAa3JvbXJnb2xlfGNugHp3cWx3d4p+opehqKCmm4eMioGQnIeTnXaCq5WTjoehjZaTj390fHeFeHl/c3N7hmtzcHpui3eAgYhvcVtZfpGNiIB/f3d1gYGAoIaRi5OdmKGVmHiKf4GNiZydio+GkpiWhYmVmZCXi4uMjYyciY2Pgm2Ji5CRip2WoZyXlIWXh2mDooJlhJyJkH6Lg4uBd5OYkp+TkYmJlY1/fo+XfJGNj46akXyKgINvdXBsbW9we4Vpc4OOmItxd4B1gomDeWZybnWAmo57h4N5k5B5dodzb4h6hIt5ioWCh42aood7g3WCi393eW5sgoWDXnN1c3FweVpfcWFwa15wan17cW1tamx2YG9vanFtWVliYWJuWFFUWmZnY3ZwhIJiXWtuZGJma5JuYGdmYGhrgXVyc3CLgHV/g4B4dYCLgHmFf3eHhneDhXyHjH97d4p/anFjfGOGfG5xbXRqaG9sdnhfcX95fHV1dICDfqSVmq2eppaFjYN/l5SDkKB2jKCUk4aLm42Wjot6cnh0gnByhXRxdohscG52bYl3g36Abm5VUYGrlIeCeIB3coN6gqGCk4KVlJmck5t4knuDjJKkmpOOiZWZkoSHl5mMlIuJj4+HnYSQinxyi4WJjoicmp+blZR/k31ohJuGZ4Wfh5KEkYKJcYORmJCcj5CMjI+Nd3uSkXqOi4yRlox8iHyAa3ZqbmtsbHt/YXp+jpaCdnqAeIOMfHlmc2tzhpWLfoeFepOOcHmEb3aLeYiLeYd8gYuPnZ2EfHt2got9d3BqbIKEe2F5cW5tc3RWX3BicmFgbG56cWhwZmZzdGhxa2F3ZV1XZmFgclNRT1xmZV15cIh8YFxpcmJiZWaRal9oZVtncH5wbHF0in12fIWAdXV+jHl7hYF4iINzhoV+jI2EfHmVeGZya4NgiH5vb2t6YGpudH91X3R9eYZ4dHOFfXigj5mwnKWOgop/g5qIgIyegIualI+FiJiPj4+Ed3R3dIBxcIV0cHKEcGtpd26Dbn19bnVzUk2C38iS1pN7cHWDdYSgg5R3lpKZnJGZe5RzhZCfoZOTkYmTnJSGf5eWiY6NiJKNiJx/joF3eox+iYyKnJucm5WSeYx1ZoeQhmuHooSRiJeDhmOMkZmPlYuXjIyKi3F6lIh7joiKkpGJeYV8fmx7ZXNwa2t6eVuAeY+PgXp9fn+Gjnt6Z3JqcoqOiYGFhHyUimt9fm1/i36KhXyDeYCOlJmZiXx1d4OQeHJtZ3GAhW5rdXBoanVuVF9vZXBaYGxyeGdra2JmeHJwcGNfd2BgVmtfXnZQTkthZ2NdenGKdV1cZXZhYmVlj2RhZmJZaXNzbmtyd4x9dHqGgnV2fotzgIZ/e4l/comIgZGLiHx+mHZlc259ZYh+bnBsgFlsbnl5dGF2e3uNdnJ3ind5n4ubrpufkIKFd4iVfn2KnYiGoJGPhYyYhJOOh4F0eHB5cW+Eb21vf3NlZXlxfW16fWpoa2OkmsHcrvChcmx2hHaFo4aSb5eRlqGWnIGScoaLo5eJjpWKkZ2Wg4GWkIaKkICRiomWfod6dX+JeIeEjpyamJmOj3aJdW2FiIp8iaKDkYmchIVei5OXi4+Jj4uLhYlte5aBfYiFiZGPhnaFfX1rfWR4dWpueXNXiHqSh4V5foCBhox/eWVyaX+JjomBgn6LloRrgXVth5CBjoN9gXh+j5SSmI90cneHjHVzcWd2eoRjdW5xY2p3aFJhcWdsVl9vdHphcmRfaH5wcm5aY3JgYlZuWVx4Tk1MZGdiXndziW5cXGR5XmBkZYVgY2NfWWpya25rc3eMfnR3hIF4d3uJcYOEfX6Ie3SLiYiWhox/fpdzZ3VyeWyLe250cYFXcXp2eXJld3mHjGl2gIlyf5yHmKeco5KFfXGMlHh5jJ6EhaGNjnyWjYCZh4R7cndwdGpwgWxpbXx1X2F4d3txdXxoYGR869q1ycPch3JsdIF2i5uJjmqZkJCdlpSBiXGFiaCOhYuVioyYlHyNk4iDiZB7kIuFj4F/dniDhHKIgpOclpSXhox1hn1ug4GIhpihgpOMnoOJYYOUj4eKhomNh4GHan2UgH2DhImOjYJxhn5/cXdodnJpdHdrWox8koKFfX+DgISKgnVhcmqHgI+KgX5+kZB8bYFrd4WOhZGCe4B8fo+Rj5WIbnB5jIZ1a3Fsc3mCYHVqb11rd2BSZXJpZlNgcHZ0YXBgXWiDcXNqV2doYmlYbVZbdUxLTGVnX2Jzc4VqXFxleV5eZGd7YWRfXVlrbmVvanR4in5zc4F+e3Z6h3OFg3x/h3Z3ioaPmYGMgnuTdWx3dnl4k3RueHp9WHqGcYBvZ3l3koJkdoaFcIqWhZmhmqKKh3Rvk4tyd4+cfouaiYl8oH+EmX+BeHJ0bm9kcn9pZm14eFxfeXt7cXGAamFmYX/Vto6RpnhucXd8cZORjYdrmo+JnJOMhntph4uZh4GSkYaHmI58jY2BgYqNfI+MfYmEenR6g3txhoCWmo6TlIGIdYOFdYJ/iZGcnoaUj59+iGJ/k4eFiISKjYCAg2d9kYB+f4KMj5B+bYJ8gnRrbXd1dHd2a2ONgY6AhX58hX+EiX9wX3FvhHuOi4F7fpCHeXCDZXmBiYaLgnqDfH6SjY+Rg25ueYt+dW1ua2x7fmRpbGpZbndaUmpzaWJRY3N4bGJlXlpqg25zYlxoX2RsYG5VW3BOSE9nZVxnb3GAbVpcY3NgXGNsd2RlXV1abGxjbWpzd4d/cXCAe310eIZ4hYJ8gIh1eYmBkpZ8iYZ2iYFweHl7hJNvbnyBd16Df3SCbWl6c5RzZ3OIfHKSkYOan5ughoh2dpV/bXeVmH6IkISKjZp9jJp2fnZxcGxqYXV8Z2JqdXpbYHh8em1xf2VjZ2dXnY9fcXOWvMSEd3GUipB/c5iMh52UjYh0a4iPlYB7lIyBhJuMfIqGfXyJjH+TiHWJhXZ2fYFxdYaBnpWGlI+CgnF/h3ODeoiWm5eGk42cgIhmfZOCgIaDiYlygn5nfYt7eX9/h4uPfWmAfYN2Zm95eHN3c2xqjoWKgYp/eIKBhISAa11wd3p9i4iFe4COf31xgGh4gYaKhYN3gnp/louOi3xta3qJfHZ0b2lofXdlXXFjWHB0U1Rvc2liTmh0eGZhXl1Yb4BvdFllY11qbWBwT1lsUkRUaGJabG9te29ZW15tY1pjcHZkZ1xdYGxqY2xpc3eBgnFufnt/dHWDeoSCfIKGdn6JgZaReIOKdIGIc3l5fo2Qb297gXFpgXl6fm5tfHaWa2p4hHRrlI2FnpigmYWIb36Mdmp5mY9/goqClZeKeo+Wb3pzcGxqZGB0e2lgZnJ7W2FzfXpncHphZWSOsbJ3S2JapdrRl3J7koyReX+WjIWZko2Gb2yGkpF6eZOHgYSZinyHf3l4iYqElYBviodxdH17anmGg6WRhZONg39ufoJ1gneFmZeTipOPlIWHcHuShH6Dg4mDb4F4aICFeHJ/f4OKh3xlfH6EdmNwc4BoeXFvdZmMhoOKe3Z4gIR6gmtbb3xyf4eDiH2FiHqIcYBtcIKFjYOEcYN3f5iLjYN3bW19g392emVoan5yYVp4W1lybk5YcnNmYEttd3ViXltbWXV9cnBYaF5manFfb05XaVI/WWdfW3BrZ3lxW1tZa2VZY3F5X2hdXmVsaGZsaXF4f4dvbX99gXVwgXuAgX+Df3aBhYmXinGCjXF7hnx6eYSUjHVren9sb350gH1vcnx7lHBvgH95ZpKKgqGYnZKDhWeHg3BnepeKfoCFgpqKgXyNjWl4cmtrZl9hb3ltX2JveV1kbIN6YXF2X2Rl1eu+izI6PouOgHJ5homPjXeFmI1/k4+Nf25thYyMdX2Pf4WClYl8g3hudoeFg5Z3boeEa3V7dWV5g4SnjIOPjIN9bX9zdYJ4hJqPi4+RkoyLhn57kod4gIWNg2yAcmmAfnhtfHuBioN4YnmEgXFkcWh+bXVxdYGbi4F/hX5zdX2AcoBvWmt8c3iIgYp7hn98h3d5cGuGgo6CiXGAd36Viop+dG1qdoCAdXVcaWl4cVpXflNacmVMW3NyZltKcXhwXltaWVx1f3VpWWJbZ2VuYmlNWGZRPV5mXV52Zl91cVtZVW9kWmVxeVtoXmBnbWdpa2lweH2ObWqBhH95boB7fYF/gnp1goGMk4VwgItud36Be3uIk4l/aXt9a3R8coZ7c3d9f4x6eIR+fGuMjISbnZaMgoBsjX5raH+Pjnt+f4OVgn99iohrdXFnaWNbY2dzb2BhbHRhaHCJemFzdF5iY5ugkG5cNVqvtXVqgIp+k4Z3h5iHdY+MinhwbYWDh3R5iXiJfZOIen5yZ3aIfn2Xb3GGfWh2eW5leomFpYeAh42JfW19dX5/e4qXhoGTkJeIi4SJfI+JcXx+hXxpfm1rgXt5anp2goeAcmB3gn5xZHJndYJtdXuGlJGBfYF/b3d5e3R9bFdtfXVzioCGd4Z1gYl6d3JtiH+Of4NxfXt8kYeIem5taW2CgnVuXWhmdHJSXHxOXHFcT1xzb2RWS3N5a1hZWFlgcYB1YV1dYGdkaGhmTlpoTkFhZFxgdmFcdW1YWFN0YVtlb3NXal9iaGtnbWxpcHd8k2xohIl9fHB+fnyBf4J6d4CAiYuEcnuHb3F3hH97iY2Pg2p+e254eXeKd314gIKHf4R+fnpthIyImKONhYR7dot5a22FiZJ5fXuCkoCAfYqDcHJwYmZeWWdfcHBgYWhwZmpviXRhdG9bYGRqdnt/vpynpMm4coWEc5N9eYiUhHSRjYhyc3CEe4NzdYZ0iHeUiXl5cGN3hnmAkmlyhHVmd3ZjanyEiJ6CgH+Oj31xfnODeH6QjoJ3lY2Uj4iCiHuJiWx5en92aHppbH95c2l6doCDfWhgeIh9ampzaHuAanaBjJGUfnp9fnF7dntzfWFVdXtxc4iCgXuCcIaJd3dvb4KBi318d3x7dI2EgXVocWhsiIJycF1oY3RvTGZ2TF5vVVRZc25iUU90eWJTV1dcYXCCc1thXWhlZWNqZFFbcUlEZGJcZHFeXHhoVVdWd15cZm5pVmxeYWpnZW5uaHB3epNuaYiMeX1ye355goGCfHZ9g4iGg3B2g3Ntd4KCfomLlH9xgHx4enqBi3SDeH+BgYKEeoB1b32Ji5ueiH6Ge3eHfGh1ho2Ren+AfImGhHaPgGdwbl9kXFhmWW1zYWFhcWxsaIluYHNpWF5jbYB3qdmpx4aIs3KKeXCOdn2IkIF6lIuAdXR1fnd/cHB/boV0lIZ4dGxgeoF5iI5lcYNvZ3VuW219gZCTgIF5kZJ9d3pshXR+j4qDcpWKkI6HhYV7f4ZtdXZ/bmh3ZW18dm1qd3Z/f3xgYniGemh1dWN+e2d1ho6NlXx0f3VxgHp8bH5ZVnJ8b3SChn5/d2uIhnN4anR/goJ8eXt3enGKf3xyZ3RkbYuEbXRba2B2Zklvb0xbY1hXVnhtYlBTdXZZUVVXXWByhG9cYGNtZGNdb2NUXXJHQmZfXmZpXVp7Y1JWXHVbW2drYVZrYGBuZmZscWhwdniPdGuOjHV/dnh9d4GDgXt0foOIiINvcYB1cXV+hoKJjYt7d394hHx9hYd4h3x9gX6FgHt+c3Z4i46fjYl7ind1g3pefoeajXmHhHSGh4R3iXpibmxbYltbYVVqdGRgW2hvcGeHcWFxZldcY2t/fMrOhrmia25ui21yhXJ+hYt/e5KGenl0enV1e2psdmOEdpKCdm9nX3yBeYuIZXGAampxY1hse4aciYOCcpeUdn17bYdwgImKhnCWjpCIhYuEe3l/cnJwfmdocmNueHFqbHF3fX16XWV6gHdpdXlmgnZndIeLjZR9coZqb36AeG17XFhwfWxzfol7gW1uiX9wdmZ2foB+gHV6cHlzhXt4cWVyYG2LgWtzWGtfeV1JcGxOV1ZfVFV8a2JPVHZzUVJUVl1idIZpXGBramZiWW5hWGNwR0FoXWFmX1xWfF5PVmVxWVtqaF1YZ2FfcmZqaHFncXN3h3lulYp0f3t3fnmDh4B1c3+GhY6DcHB8eHd1eYeGh4yGenx/dYt+fYaEhId/fn59h398eHZ5dpGTn36NfYtudYB6ZISIl4ZzkopvhYWCeoN1ZG5qWV9bXV1VaHNlYFlkcnJngXJha2RXWl9pf3i+rnqft25idIdpdHxyeoSHe36NgHh4c3dve3dlam9gh3WOgXNqYl5+eHiKgmVwfWhra1pWb3eLpIGFf3GZknF/d3SBbH+Bj4Zyk4eMh4SJhX15dXNvaXlham1hbXZqZ2treXd6d1tnfnx4ZXN+boR0ZnaGjYaVf2+LZmt6gnRsdGJbbnpqc3qKeoFldIZ9bXBndH53fH5wemp5eoB4d29lbGFsiX1sblZrYXhWTGtsT1JPaU5ZfWdiT1V2bE1RVFVeZnaEZ15hcWhnYVdpXVxraUpFa1piZVdYVXlaTldualldbGVdWmVjXnVmbGVxZnNwdIF4cJmFdn9/eH98hYd9dnSCh4CVg25zeXt7c3OFh4iIhHmBfXaPf32EiY6DgYN7fouDe3d8d3aanZd6ioOHanZ+fWyEhpSAco+CcYaCfoKAcGZsZ1ddW1xbU2VwZV9YY3J1aXZwZGViV1tbaH9wb3J/c4llZnp/anV2dHSEhXiBhXp3dHVua3pxYmhrZ4Z0jYNtZl5ffG96iX1obXdmamRWV3Nwjqd9hHx2lpBze3J7eWx6eo+Ddpd8h4aDh4R9dXFzbWh1XW1pX2x1ZGdmaXpve3JZZ4F3dWhwgHiCdmJ3hYt8lIFui2pte4BwZXJlX2t4ZnF1iXp9YXWDdmlrcXR6b3h4cntlfX5+d3VuY2VhbIZ8bWtWamNyVExrbFBMT3BIXntlYU5WdWVLT1NXYGt3fmZdZ3NpZV9XY1dicV1MS2tYZGJVVFVzV01ZdmVaX2xgXFtjZV93Z21icGl0b3F+dXSZgXd/gHiAf4aEen12goN+mIVucnR8e3RxhYWPgoB6i3V0kIB9gZSOgIWEfH6Mhnp+gXZ7o6WKeYmGhWx1fXt1hIONem+Fc3qFfYKEdW5qaWVWXVtbWlNjbmVbWGJ0e2pobWhgYVdfWmmAaWtvf2dsYml7emt0dXVvhoJ7gX12dm56aGp5al9lbmmBd5CEZ2VYYndpfoZ5bmlvZmZdVVlwaY+od4F6fJCOeHVvfW5ydHiOfneUdIWCgIaIdmpzdmhpb1xtZV5uc19nYmp4aHttW22Dc3Rqb4B+eXdhdoWEeZCGc4hxb3l/cWJwaFttdmNwcod6d2FygG9naXhzcWt3dnR1YoJ6fXZ1b2NjYm18fGtrVWliZ1RMbmhQSFJsRWF4ZWFNVHNeSk1VWWVseHtmX21wamRdVmBVb29XSlNoWGdeWE1VbFRLXHpfXF9rXV1bYmVgemhsYW9vdm5vd3V6l313gIF5gICHhnp5eoN9gZOEcXR0fnp2dIWIkH2BfJBsc5WBe4KfhX+HfYB+hoKAint2hKyff3qIiIRscoJ6doGBgnRuh299gHSKgGpvbmRkWF9aWlpVYmpnXFpfdYJpXm1sXGFWW1xrgWVxdHxpal1teHdodXhzboZ8fn56dnNsemhpeGddZHNoeneSgWNjVGRvZ4GEdnZmaGlhV1ZZaGSQqG9/eICLjnpwb3tmeG55inp2jnGDfX9/hm5kd3NkaWldbGJecG9bZ19tdWV6aF10gG9ya3F7fnV2YnWFi3uIiIB/d3J1fnNgcGxYcHJhcHCDe3NjcYBrYGx6b2lneXd0cGSDdHl5dHFkYWRtcn5qa1RpXl9VTHVjUUdXYkdjdmVhTFRxWUtMWFhnbHZ6ZWVtcWZjWlhdWHdmVEpcY1hpWFhIV2VRSWJ4W11fbVteXWJjXoBpa2BvdHhtb252g5d5coGAfX+JjIZ+dXaGeIaMfXR1dYJ5enqCjI59f4SJanSWgXuKnX1+hXmAe358holzcY+ujHt7h5B+ZnGIenR+fXZyb4Zse35tkHpjcG9iZV1lVlpZV2Nma2BdXXOGaVhwbVteV1pcbHticXd1bGJbbnR1aHV3cm6GeX+Bendvb3RlaHRlW2d1ZnZ2knpgXVNlZmqCgXN8YWNpXFRYXmJkkKVpeXSChZB4bG54Zndse4N5dIhygHh8eIBpZndtYGhhX2tgXnVrWWZdb29iemVbd3xrbm5weHl0dGVzg5J/iIOIenZvcXxxYXdjWm5vYG9wgHtyZXGAZF5tdWljZnh6cmxtgHRyfHJxYV5lbW59ZWlUaFlaVU55YFJLWllIYnRjYEpVblVKTFpWaWxye2NsbHNjYVpaW2F3XFRLY11ZalNWR1lhTkhqdlhfYW1bW19iY12FaWhibnh5bG9qdoGQeG2CfoCBkoiEgXZ1iXSLhnRxdnaCd319foyPgX+TfnB4loN9mZJ5gIB4eX5/c4iEc3CZont7f4mWeGR1iXlzeXZrdHB/bHl8cJFyXnBvYGdibFRbWldpZG1mXFxyiWZScm1bWVhXYGx2ZGp1amlfW251cm10dXVrhn1/gHx3b25sZWlxY1trcmR0do5zXFdUZGBxf35xgVxiY15TWmFcZJOfZXJxhIOQc2tqeGxub3l5enGAdn9zenp7ZGZ2aF5jW2FoXF53aVdiXnBoYXdhW3x2ampyb3h0c3RocYKVg4d/hHVyanB7bGV2V1tpbGFwcX95c2Vvflpgb3FiXmlvfGtqcn1xb3Zpb2BbZGtse2FnVGdVWFJRd1xTUFlSSGNzYmBHVmxRSVBaVmtsa3xlbW9yYVtaWFlscFdTUGZXV2lTVEZaXE9Jc3VYYGRtY1hgYWJdjGpkZW16eGtvaXV5hXtrhH2AhJl9goR5fYhtj4Zxb3Z6fXSCgn2Lj4OCl3R4gpOGgZ+JdYF/gXR/gnCHgnVvopdze4aMh3tmd4tvbnxwZ3hxe2xzdnONa150bmFnZmtTXlxWaGJsbFtccYxkTm9tXFZXVWZpdGhjdGVlXVpwdm9xdnZ6bIh9gH2Id5BzY2Vrb2Fdbm1kc3iIa1pUVmJjd3x8cIRcY19jVFpgWmOXlWNucIOEiXJqZ3luZXJ1cXpreXR1b3p+dl9nc2RcX1diZFlhdWZWX2BtZGFxXV1+cGhpc3F0cXV2a22Fk4KJfIVxcWZue29wblJaZWlkcHJ/dXNibHVVYnFrW15uZHtka3R8cXFxaWxfWGRpanheZlVlVVZQVW9YUldUUEhlcl9hRlhrT0lYVFZuaWR8aWt4a2FXXFZbdGRTUldoUVlnVFNIWltQTnh3W19mbWpaYmBfXo9uYmdreXZubml2dn5+bYSAfoaXe3+HgYp+a5OIcmd0gHt1gIN+iY5/i5NzfYqRhYefhnt/hoxzgIZzfYJ1bqSMc4GNjHd4bnqNYGV9cWd6dHlsbXF3g2dkfG1jZmdoU2BfVWdgbG9cXm6OaE1pbGBVVlNuZnNrZnhkZV1acnZuc3t5dG6Je4F3nHt6bGJlbG1eYG9qZXF5f2daVlhfbHh7em+DX2JeaFZZYFhknIhia3GBhnx3a2p2bFt1cGp5aXVybm97gHNYa29fWV5XY2RYZXFjVF9iaWFibFpgfmtmbHN1b214dmtohYx/iXqIbXBlb3tscWxiWF9nZ25yf3NyXmlsU2VwZFVibWF4Ym91enRqbmtqX1hgZmh1XWRXYlZTT1lnU09dT09IZW9dY0daak5KX0tYbWVfeGhufmRgVV5UXXVbVFNgZ05eYlVTSlxaUVp2dl1fZm1oWGNhW16OcWNoanhyc21ndnN5g3OCg3uIjn58ioiOeW6QinRsc4J0f3+IhYeRhJWPen2Mj4iRm4SAfIyEcn+Bc3R3cW6Tk5OTk5OTk5OTkpKSkpKSkpKSkpKSk5OTkpKSkpKSkpKSkpKSkZGRkJCPj4+Pj4+Ojo6Pj46OjY2Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2NjYyMjI2NjY2Njo6Ojo6OjY6OjY2Ojo6Oj4+Pjo2NjY2Oj4+Pj4+PjoKAfnp6fX5+fX1/fn59fn5+fn5+fn+Af4CAgIGAgIB/gIGBgYOHjI6Ojo6NjY2NjY2NjY2NjZKSkpOTkpKSkpKSkpKSkpGRkZGSkpKSkpKSkpKSkpKSkpKSkpGRkZCQkI+Pjo6Ojo6NjY6Ojo2NjY2Njo6Njo6OjY2NjY2Njo6Ojo6Ojo6NjYyMjY2MjIyNjY2Njo6Ojo6NjY2NjY2Njo6Ojo6OjY2NjY2Ojo6Ojo+Ogn99ent8fn59fX5+fn5+fn5+fn5+f4B/gICAgICAgH+BgYCBg4aMjY6NjY2NjY2NjIyMjIyMkpKSkpKSkpKSkpKSkpKSkZKSkpKSk5KSkpKRkZGRkZKSkpGRkZGQkJCQj4+Ojo6OjY2NjY2Njo6Ojo6NjY2NjY2NjY2NjY2Njo6Pj4+Pjo6NjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Njo6Ojo2NjY2NjY2NjY6Ojo6Cf3x6fHx9fn19fn19fX59fn5+fn5+gH9/gICBgYGAf4CAgICDhouOjo2NjY2NjIyMjIyMjIySk5OTk5OTk5OSkpKSkZGSkpKSkpKSkpGRkZGRkZGRkJCQkJGRkZCQkJCPj46Pjo6Ojo6Ojo6Ojo6NjY2NjY2NjY2Njo2MjY2Njo+Pj46Ojo2MjIyMjIyMjIyMjY2NjY2NjY2NjY2NjY2Njo6NjY2MjIyNjY2Njo6OjoN/fHp8e31+fH1+fXx9fn59fn5+fn5/f3+BgYGAgICAgYCAgIOGi42NjY2NjIyMjIyMjIyMjJA+LjExMTEvb4eEhISEiF0tMDAwMC1GoaGhoaGhoJqZmpqampqKg4SEhIOEd2VnZmZmaFxDREREREJLkpqZmZmZmnpsbm1ubnFJLDAwLy8sSYWDg4ODg4OLjIyMjIyMjY2NjYyMjY2NjY2NjY2NjIyMjIyNjY2NjY2OhX19e3t6fX58fH59fX1+fX1+fn5+fn9/f4GBgYCAgICBgICAgoWKjI2MjIyMjIyMjIyMjIyMjy0aHR0dHBpohoKCgoKGUxgdHR0dGTekpKSkpKSjnJycnJycnImBgoKBgYJyXV9fX19hUjQ1NTU1Mz+TnpycnJydd2VnZ2dnazwYHBwdHRg7g4GBgYGAgYqLi4yMjIyMjIyMjIyMjIyMjY2NjY2MjIyMjIyMjY2NjY2GfH16enp8fXt8fn19fX59fX5+fn5/f3+AgYCBgYGAgIGBgYGChYqNjYyMjIyMjIyMjIuLi4uRiYeIiIiIho2QkJCQkJCMh4eHh4eHiZKTkpKSkpKRkZGRkZGRj46Ojo2NjYuJiYmJiYmIhYaFhYWFho2Ojo6Ojo6LioqKiomJhoKCgoKCgoSKioqKioqKi4uLi4uLi4uLjIyLi4yMjIyMjI2NjIyMjIyMjIyMjY2Njoh8f3l7enx8e319fX18fX19fX5+fn9/f4CBgYGBgYGAgYCAgYKFioyMjIyMjIyMjIuLi4uLi5GTk5OTk46SkpGJh46KkJKTkYuSjo6OhYqRkZGRkJCQkJCPj4+Pj4+Ojo6Njo6Ojo2Njo2Njo6Ojo6NjIyMjY2NjY2NjY2NjY2Njo6NjY2NjIuLi4uLiouLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyNjY2NiX59eHh5fH18fX19fHx9fX59fn5+f3+AgICBgYGBgYCBgIGCgoSKjIyMjIyMjIyLi4uLi4qLkJCRkZGPhI6QkIaKj4WNkJCOhY6JiY6IiZCQkJCQkJCQkI+Pj4+Ojo6NjY2NjYyMjIyMjIyMjIyMjIyMjIyMjI2NjIyMjIyMjIyMi4uLi4uLi4uLi4qKiouLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjI2Lfnx3dnh7fXx7fX18fH19fn5+fn5/f4CAgIGBgYGBgIGAgIGChIqMjIyMjIuLi4uLioqKioqQkJCQkIqFjoiOhoaPiY2QkJCIjo2JkYmMkI+Pj4+Qj5CPj4+Ojo6OjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLi4uLi4qKioqKi4qKi4qKi4uKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIt+e3d2eHt8fHx9fX19fX1+fn5/fn9/f3+AgIGAgYGAgYCBgYGEiYyMi4uLi4uLioqKioqKipCQkJCPhYOMjpCOiYyKjpCQkImOjImQiI6Pj4+Pj4+Pj4+Pjo6OjY2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKioqKioqLi4uKioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMin18dnZ4fHx7fHx9fX19fn5+fn5+fn9/f4CAgYCBgYGBgIGAgYSJi4yLi4uLi4qKiomJiYmJkJCQkJCMhoyJjoeFjYmOi4uQiI2MiY6Hj4+Pjo+Pj4+Pjo6OjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKioqKioqKioqKi4uLioqKioqKioqLi4uLi4uLjIyMjIyMi4uMjIyKf353eHp7enp8fHx7fX1+fn5+fn9+fn9/gICAgICBgICAgYCBhIqMi4uLioqKioqJiYmJiYmPj4+Pj5CMjouPjIqPjI6MjY+Mjo2LjYyOj46Ojo6Ojo6Ojo6NjYyMjIyLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLjIiAfXh5enl5e318e3t9fn5+fn5/f35+f39/gICBgICAgIGBgIGEiouLioqKioqJiYmJiYmIiI+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Ojo6Ojo6Ojo6Ojo6Ojo2NjYyMjIyLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLioqKi4uLh4B8eHp6eXt8fHt8fH1+fn5+fn9/fn9/f39/gIB/gYGAgIB/gYSJi4qKioqJiYmJiYmJiIiIj4+Pj4+Pj4+Pj46Pj4+Oj4+Ojo6Ojo6Ojo6OjY2NjY2NjY2MjIyMjIuLi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKiYmKioqKioqKioqKioqKioqKioqKi4uHgHt5eXh6fHx6e3t9fX5+fn5+f39+f39/f39/f3+BgYCAgH+BhIiLiomJiYmJiYmJiIiIiIiOjo6Ojo6Pj46MjI+Sj5COjo6Ojo6NjY2NjY2NjY2NjIyMjIyMjIuLi4uLioqKioqLi4uLi4uLi4uLi4uMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKiomKiomJiYqKioqKioqJiYmJioqKioqKioqKioqKioqKioqKi4aBe3h5eHp8e3t7fH19fn5+fn5/f35/f39+fn9/f4CAgYCAgIGEiIqJiYmJiYmJiIiIiIeHh46Ojo6Ojo6Ojo+MkJOQkI+Ojo6NjY2NjY2NjYyMjIyMjIyMjIuLi4uLi4qKioqKioqKi4uLi4uLi4uLi4uLi4uMjIyLi4uLi4uLioqKioqKioqKiYmJiYmJiYmJiYmKioqKiomJiYmJiYmJiYqKioqKiomJioqKioqKhYB6eHl5fHt6ent8fH1+fn1+fn9/fX9/f35/f39/gICBgICAgYSIiomJiYiIiIiIiIeHh4eHjY2Ojo6Ojo6Pj4+PjoyNkI2NjY2NjY2MjIyMjIyMjIyMi4uLi4uLioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYmJiYmJiYmKioqJiYmJiYmJiYmJiYmKioqJiYmJiYmJioqFf3l6eXh7e3p7fHx7fn5+fX5+f39+f35/fn+Af3+AgICBgYCChIeKiYmIiIiIh4eHh4eHh4eNjY2Njo6Oi42Nj5WPiYyPjYyNjYyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYR+eXt5ent7ent9fHt+fn59fn1+f35/fn9+f3+AgICAf4CAgICEh4mIiIiHh4eHh4eHh4aGhoyNjY2NjY+MjImKj42IjJGPjY2NjIyMjIyMjIyLi4uLi4uKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uKioqJiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJg355e3p8e3p7fX17fH9+fn5+fX5/fn9+f3+Af4CAgH+AgH9/f4OGiIiHh4eHh4aGhoaGhoaGjIyMjIyLiYyKiIeJhoyOjJCMjZGOjIyMi4uLi4uLi4uLi4qKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiImJiYmJiYmJiYmJiYmJiYmJiYmIiImJiYmJiYmJiYmJiYiIiIiIiYmCf3h7e3t6enx9fHt9f39+fn19fn9/f39/f4F/gIB/gICAgICAg4aIh4eHhoaGhoaGhoaGhoWMjIyMi4yOjoyKioeEiIuKjIuNjo+Li4uLi4uLi4uLi4uLioqKiomJiYmKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiomJiYmJiYiIiIiIiIiIiImJiYmJiYmJiYmJiIiIiIiIiYmIiIiIiIiIiIiIiIiIiIJ/eHp7enp6e3x8fX1+f35+fX1+f39/fn+AgICAf3+Af4CAgYCDhYiHh4aGhoaGhoaFhYWFhYyMjI2NjJCSjI2Ii4mJi4uLi4mLjIqMi4uLi4uLioqLi4qKiomJiYmJiYmJiYqKioqKioqKioqKioqKioqKioqKioqKiYqJioqJiYmJiYmIiIiIiIiIiIiIiImJiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIiIiIiIiIiHgXx4e3x5enp8fHx8fX9/fn59fX9/f39+fn+Af4B/f3+Af4CAgIKEh4eGhoaGhYWFhYWFhYWFjIyNkY+PjZGJjIaJjIuIiImMiYeNjo+NioqKioqKioqKiomJiYmJiYmJiYmJioqKioqKioqKioqKioqJioqKioqKiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4WAenl9e3t7enx8fHx9f39+fn19f39/f35+f4B/gH9/f4B/gH+AgoSHhoaGhYWFhYWFhYWFhISLi46PjoyLj4iHiYmMjYWFjo2KiYyNi46KioqKiomJiYmJiYmJiYmJiYmJiYmJiYmKioqKioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHhoaHh4eHhH55eX16enp7fXt8fX5+f35+fX5/f39/fX5/f3+Af39/f39/f4CChIaFhoWFhYWFhYWFhISEhIuLjI6MjI2Lh4mIiomGgoiNjoiKi5GTj4uJiYmJiYmJiYmJiYmIiYmJiYmJiYmJiYmKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIeHh4eHh4eIiIiIiIiIiIiIh4eHh4eHhoaGh4aGhoaGhoaGh4eDfXp5e3p5enx8e31+fn5/fn59fn9/fn9+fn+AgICAf35/f39/gIKEhoWFhYWFhYSEhISEhISEioqOjYmIiIqKh4iHiomIioiIh4qGi5GPiomJiYmJiYiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHh4iIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGh4J8eXl6eXp7e3t7fX5+fn5+fn59gH9/f39/f4CAgH9/fn9/gICAgoSGhYWFhISEhISEhISEhISKi5CPiYmJi4qHh4WHiYuKiYSLjYmOjYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiIiIiImJiYmJiYiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGgXt4enp4e3x7e3x+fn9+fn5+fX1/f39/f3+Af4B/f39/f3+Af4CChIaFhYSEhISEhISEhISEhI+Qj4+IiYuIhoeIiYuLjIuJioqNio6Oj4iJiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoaAe3h5eXh4enp8fX1+f35+fn59fn9/f39/gIB/gICAf39/gIB/gYKDhoiGiIaDhISEhIODg4ODkpKOioeKi4qLh4uNiYqJi4iHiouIio+SioiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhn96eXh4eHl5eXx9fn5/fn5/fn1+f35/f3+Af39/f4CAgH+AgH+BgoOHjo+PjoiHhIWFhoaFhYWSkI6KiYmIiImKioiIh4aKjIiHiYmOkJGNh4iIiIiIiIiIiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4aGh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWGf3l4d3d3eXp5e3x9fn9+f35+fn5+f35+fn+Af4CAgICAf3+Af4GBg4eOjo6Ojo6Mjo2OjY2MjZCQjomHhoiJiYeIiouIiYyJiYaKjY6PkYuIiIiIiIeHh4eIiIiIiIiHh4eHh4iIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhYZ+eXd5d3d6eXl8e31/fn5/fn5+fn5+fn9+f4B/fn+Af39/f39+gIGEiI6Ojo6Ojo6Ojo6Ojo2NkJGOi42JjIiIiYaHiYaIioiHi4yLjpCQiIeIiYmJiIeHh4eIiYmIh4eHh4iIiYiIiIiIh4iIiIiHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhoaFhYaGhoWGhYSEhIWFhoaFhIWFhX55d3l2eHl4e3x7fn5+fn5+fn5+fn5+f39+f39+f39/f35/f3+AgYOGjY2Ojo6OjY6NjY6OjY2Qj42Ni46KhoiKhISLiYeDhYSDi4mLj42JjI6QkI+NjYyLjY6Pj42NjI2Nj4+Pjo6MjYyMjY2KiYiHiImHh4aHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoeHiYqKiIeJi4yNjo2LiImLi42OjYyJiImMgHl3d3Z6eXh7e3t+fn5+fn5+fn5+fn5/f39+fn5/f4B/f4B/f4CBg4aMjY2NjY2NjY2Qj4+Pj46NjI6KiYuMjIeFiY2Lh4aIh4aHh4uNjo6Pj4+Pjo+Pj4+Pj4+Pj4+Pj4+Ojo+Pj4+Pj4+Pj4+Oj46Oj46Mi4uJh4eHh4aIhoaGhoaGhoaGhoeLiYeHiIiLjY2Mi4yLjY2Ojo+Ojo6Pj46Ojo6Ojo6Ojo6Njo6NjY2AeHZ4eHp4enx6fH5+fn5+fn5+fn5+f39/fn59fn9/f39/gH9/gIGDhoyMjIyMjY+QkpOTk5KSjYyMjIqHioyKh4eJiYWCiouIiYWJjpCNjo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjI2NjI2LiYaHh4eHiYqLjY6NjYyNjY6OjY2OjY2NjY2NjY2NjY2NjY2OjIyNj4+OjY2MjIyLi313dXd5enp7e3p+fn5+fn5+f35+fn5/f39+fn1+f39/gICAf3+AgYOFj5KRkJGSk5OTk5OTkpKLi4uLiomMiouLiYuKhoeOjYiIjI6OjIuMjIyNj46Njo6Ojo2NjY2MjY2NjIyMjIyMjIyMjY2NjYyMjI2NjYyMjI2NjIyNjIyMi4yMi4yMjI2MjIyMjIyMjIyMjIyLi4uLi4yNjY6Sk5OSkpSRkJOVlZSTk5COjo6Oe3Z2d3h6ent7e31+fn5+fn5/fn5+fn5/f35+fn9/f39/gIB/f4CBgoSNkpKTkpOSkpOTkZKSkoqJioyJi4qJjIuKioiHiYqKi4mKjY2Mj46Nj5KUlJOUlJOTkpGSkI+Ojo2NjY2Pko+OkZGOjIuKioqLi4qKi5CPjoyMjIqKioqKioqKiouKioqKi4yLi4uMjIyKiouLi46RkpOTk5SUk5STk5SUlJOTk5KSkpKSk5F6dXZ2eHt7e3p6fX5+fn5+fn5+fn5+fX5/fn5+f39/f3+Af39/gIGChIuRkZGRkZKSkpGRkpGRiYmIiIqMiYiJiYuJhoSJhoyKh4ySkpKTk5OUlZWWlZWUk5OUlJSUlJSUlJSVlZWVlZWUlJOTkY+QkZKQjoyRlZWVk5KSjo+QjYqKi4qKi42OjY6RkpCRkpKSkpGRkpKSk5OTk5OTk5OTk5OTkpOSkpKSkpKSkpKSj3h1d3l6e3t7ent9fX1+fn5/f35+fX5+fn5+f39/fn9/f4B/f3+AgYKEi5GQkJCSkpKRkZGRkZGIiIiIi4uJg4eLi4yMiIeHjYyNkpSSkpOTlJWWlpaVlZSSkpOTlJSUlJWVlZaXlpaWlpWUk5SUlJSVlJSUk5OVlZWUk5KTk5OTkJGSkZGSk5OTk5KSkpOSkpKSkpKSkpKSkpKSk5OTk5SUk5OSkpOTkpKSkpGRkZGPdnJ3enp7e3t8fX59fX1+fn9+fn9+fn5+fn6Af39/f3+Af3+Af4CBgoSKkJCRkZGRkZCQkJCQkIeHh4eIiIiFi4+KjI6Njo+OkJWUk5OTk5SUlZWVlJSUk5KSk5KTlZSUlZaWlpaWlpaWlpSTk5OTk5OUlJOSk5SVlZSTkpKSkpOTk5OTk5OTk5KSkpKSkpKSkpGSkpGRkZGRkZKTlJSUlJSTkpGRkZGRkZGRkZGRkYx0c3d6ent7e3x9fX1+fX5+f35+fn5+fn5+fn9/f39/fn9/f39/f4GDhIqQkJGRkJCQj4+Pj4+Ph4iKi4yNjYuOj42Mjo6RkpGSk5OSkpKSk5SUlJOSk5OTkpKSkpOTk5STk5WVlZWUlZWUk5OTk5KSk5OUk5KTlJSUk5KSkpKSk5OTkpKSkpKRkZKSkpKSkpKSkpKSkZKRkZGSkpOTlJSUk5OSkZGRkZGQkJCQkZCRinN0dnp8fHp7fXx9fn59f35/f35+fn9+f31+f39+fn59f39/gH+AgYKDipCQkZGQj5CPjo+Pjo+Oj4+Pj4+Pj4+PkI2OjpCRkpKSkpKRkpKTk5OTkpGSkpKRkZGSk5ORj5OSk5STk5OTlJOSk5OTk5OTk5OSk5OTkpKSkpKSkpKSkpGRkZGSkZCRkZGRkZKRkZGRkpGRkZGRkpKSkpKSkpKSkpKRkJCQkJCQkJCQkJGGc3V2e3x8e3x9fX1+fn1/f35/fn5/gH9+fX5/fX5/fn5/f3+Af3+BgYGKkI+PkI+Pj4+Pj4+Pj4+Oj46Oj4+Pj5CQiI2PkJGRkpKSkpOTk5OTkpKSk5KSjpCRkZGSk3+Ek5GRkpKSkZKSkpKSkpKTk5KRkZKTkpGRkpKSkpKRkJCQkJGRkZGQkJGSkZGRkZGSkZGRkZGRkZGSkpKSkpKSkZCRkZCPj4+Pj4+Pj4+PkX9ydHh8fHx7fHx9fX5+fn9+fn5/f3+AgH99fn5+f39+f39/f4CAf4GBgYqPj4+Pjo6Ojo+Pj46Ojo6Ojo+PkI+Pj4+GjpCQkJCRkZGRkZGRkZGQkJCQkJKEeZCRkJKIc4mRkJCRkZCQkJGRkZGRkZGRkJCQkZGQkJGRkZGRkI+PkJCQkJGRkJCQkJCRkJCQkJCQkZCQkJCQkJCQkZCQkJCPj4+Pjo+Pj46Ojo+Pj4+PeHJ2eXx9fHp9fH19fn5+f35+f39/f4CAf39/fn5/f35/f39/gIB/gYGAio6Ojo6NjY2Ojo6Ojo6NjY2Oj4+Pj4+PjoiQkZCPj4+QkJCQkJCQkI+PkJCPkI1we5CPj3d2iJCPj4+PkI+PkJCQkJCQj4+Oj4+QkI+PkJCQkJCPjo+QkJCPj4+Pj4+PkJCQkI+PkI+Qj4+PkI+PkJCQkI+OkI+Pj46OjoyMjY2NjIqDiYhzc3Z4fX58eX18fX1+fn5/fX5/fn9/f39/f4B/f39/f4CAgH+AgH+BgYCJjY2Ojo6Ojo6OjY2OjoyNjY6Ojo6Ojo2NiJCRkI6Njo6Ojo6Ojo6Pjo6Ojo6OjnVshZCHcniHj46OjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Pj46Oj4+Pj4+Pj4+Pjo+PjY2MjYyNjoyLi4mJiYiFhYSDgoKEgnR5fXp4dXJrZWltb2xmZmdncHNzd3l9fnl6e3x9fX1+fn59fn9/fn9/f39/gIB/f3+AgIGAgIB/f4CBgImNjY2NjY2MjYyMjIyMi4uLjYyMjIyMjIyGj5GRjIyMjIyMjIyMjIyMjIyMjIyNeG11joF0doaNjY2MjIyNjY2NjYyMjI2MiomKi4uJh4KAh4iEgXt6gH57fXx8fXlzcnJycnV1cG1ramppZ2NkYV9bXF1eWFVXWFlTS0VJSkpLTE1PT0tgdHR3eX19eHp5e3x8fX5+fn1+f39+f35/f4CAgH+AgICBgYCAgICAgIGAf4OEhYSFiIuLjYyMjIuLi4yGiYqKioqKh4OOkJGNiouLi4uMiYmKioqKiouLi4hwYmd4c291goWDhIeJiYWCg397fHl6e3pzcHFxcW1samdsbWdlZmVmZGNlZGVkZWVlZWRkZGNhYV5dXFpYWFdUUFFSU1JTTU1KSUZESEpHR0hHR0xOSWdzdXh6fXp4d3l8fHx8fn5+fn9/fn9/f39+f4CAgIB/gICBgICAgICBgYFnXmBjYWNucX17ent/fXd8fHZ4ent4eHpvcXt4eXt8e3h3e394dXd0dHZ1dXZ3clxiaVxiZGtnaGtsbm9tamlpaGhlZWRkZF9gYWJgYF5dWVhaWltdXV9gX2BfX19gYmFeXl5eWVldXF1bV1dWUlRSU1NOUUpISUZERUhMTEhGR0lLSklNbXJ0eHp7end3eXt6e3x+fn1+f39+f35/f35+gIGAf3+AgIGAgICAgICCgWdYW1pZXFtcY1xaXF5ga3FtcHBvbm5vbmtpbmxrbG9qaWtraWpraWZmZ2dnaGhgY3RsXmpuZ2RiY2JhYmBgXVhbW1dYV1RWUVBUU1NNSkxLTExOTk9UWFhXVVVUUlBQTU1QT05LTE1QUU9MTEpHSUlHSEhJSEhIR0ZHSEpKSEhISUlISVZwc3V5ent5dnZ5enp7fH59fX5/f35/fn5+f3+AgX9+f4B/gICAgICAgIGBbFtYVlZWWVlaWVlYVVZoamxubmxra2poaGloZGVkYlxiZl9fYWNfXF9dYF1eWltrc2thbXRuZVlZX1tYV1NOTUtLS0tMSUtNTktKS0tMSktQTEtLRkdHSUlGR0lISUZFSEdGRkVERUVEREVJSUlHSEdIRkZLTUtJSUlIR0hLTU1LTExMVXFzdnl6e3h2d3h3ent8fn1+fn9/f39+f3+AgIGAfn5/f4CAf4CAgIB/gYJoUlRVVlNVV1lZWVdXV1tbYWNfXlxbWFZWWVZSVFJRUVVUU1NUUE1KTU5QUk9NW2Vva1ppc3RrUlFTUFBOTk9NSk1MS0xKSktLRklJSkxJR0pISUlFR0dGRkVFSElKR0ZHRkZHR0hKR0dISEpMSkpLSUlISktLSkhKS0pISUtMTU9QUEtUdHN1eHp6eHZ2d3d6enx+fX5+fn5/f35+fn+AgYB/f3+AgYB/gICAgH+AgmlQUlRXVVRWWVdYWFpbVFRTUlBRU1FRUU9OTlBQUU9MTlBPTk5NTEtNTk5QTU5YYmhtbm9wcW5TTE9QUFBPTk5PTk5QTk1NS0lISEpJSUlJR0ZHR0dJSkhJSEhJSEhHSEdISElISUxLSklISkpJSkpIR0pMS0pJSUhKSktMTk1NTU9RTFVzcnN3enl3dnR2eHp7fX19fn5+fn9+fn5+gICBgICAf4GBgH+AgICAgICBbE9PTlRZVVVdW1lXV1hOTUpKSUZKT0xKSkdJSk1NS0pMTUpHSUlJSktLRUNGSVZjZmdxbm1oZ11RTk5OT09NTk9MTk5OUFBPTE1MTk1MTEpJSEdJSElISElJS0xLS0pJS0pJSklJSUlJR0dKSUdJSUpKTk1OTEhJSklJSk1PT01MT1JOWXBwcnd4d3d0c3R3enx+fX5+fn5+fn5+fn9/gICAgICAgYCAf39/gICAgIFvS0pNTlFOTlVXVlZSU0lFQ0VFUkREQT5CP0RAQD5CREFAQURHRkVIRUVLTU1SX2ptaG5tbWpoZmNjY1pMSklKSUlLSkxQTk1MTU1MTU1NTElIREZGR0ZGRklKSUlLSkhMSklKSkpJSEhKS0tIRkdJSklLTU5OSktPTUxLTU1PUE5QT1BgcG9yd3h2dHJzdXd6fX19fn5+fn9+fn1/gICAgICAf4CAgIB/f3+AgICAgXNQUE5OUE1KS1BSUE5RQ0RCQUZRRT1DPT9FSDk6Oz0/PTxBRkA+Ojw+RVRdX2NpbG5pbWxsampramdeT0dFRUZFR0dHR0pHSEpLR0NER0pHQ0RFQUFDR0hHSEdISktKSElMS0lISktLTU5MTUxMSkpMS0lLTU9PUFNRT1BQTk9QUlFNUGdwb3N2dXRycXR4eX19fX1+fn5+f4B+foCAgH9/gIB/f4CAgH+Af4B/gICCdlRVUVFQT0xNUFBOT09BQkFAQkE/Oz48Pj8/Ozg5ODs7OkA6Oz48Ozs7O0dWX25wcWtta2ppbWdYSUVFREdJSEM/QEBAQUFCQUE/Pjw9PkFAQD8+P0BFR0dHSUtMTk1OTUxNTUpLTVBVU05MTlFOTk1OTE1NTk9OTk1LS05OTk1OTkxUbnBwc3R0c3Fydnh5fX19fn1+fn5/gH5+gICAgICAgH9/gICAgH9/gH+BgIJ4UVFSVFJTUVNTUVFST0BAPT4/PD8+QEE/PT45Ozo7Ozk5Ojg4Ozw5Nzk7Ozw9UWVxcnNvbGhYRUA/Q0ZEQ0NDPzs+PkBDQ0E/Pj9BPkBAQj9APD9CQEFDRUVFSktQT1BPTU1OTExMT1JRUFJOTExPTUtOT0xMTEtMS0tKS0tKTU1LS1xxcXF0c3VycXR4eHp9fn1+fn5+f39/fn5/gIGAgH+Af4CAgICAf4CAf4CAgXxSTU9RUFFSUlRSU1NOPDs8Ozs7P0BBQkA9PDk8PTw6Nzk6Ojk3OTo6Nzg6OTk5PEtue3FWQTg6PD1AQUA9Ozs+PD08QEJDQT9BQkE9Pj09Oz0/Q0RCQD9BREJFR0pKSkpKTE1MTExNTExOVVNLTE1USVBKSU1KSUpLS0pJSEdKS0lKZnJxc3RzdXJydnl6e31+fn5+fX9+f39/f36AgICAf4CAgICAgIF/gIF/gYCBgFZMTlBQTlJRUFBRUU44PT88PDo9PkFAQT8+PkA/Pj48PT0/QD09PT9DOz09PT08O0psZTk6Oz09Pj9AQUA/P0E/QEBBQEBAPT8/PTw6Oz09PD9AQUJCQUBCREZGRkdGR0dISUtMTExLTEtKS0lKSk1MTEpMS0lISUxMSklJSElLR01tcHF1dXR1c3V4eXl8fX5+fn5+fn5/gH9+gIB/f39/gH+AgYCAgYCBgICBgYCCYUtPT05OT1BPT1BQTzo8Pjw9Oz8+PkFBPz0/Q0NEQT89PkBBP0A8XG5APkRFPz9BOkZfPj49Ozo9PkFBPz5AQD9BPz89PD48PTs7PD0+QUA/QD5AQ0NEQkRFSEVFR0hISEdGSUpJSUlJSUhKSkpKTEtKSklJSEhKSktMS0lLSkpIVnBwcXNzdHR1eXp7fHx+f35+fn5+f39/f39/f3+Af4CAgICAf4GBgICAgIGBgIJtTFBRTk9QTk5PUFBPPjw8PT4/P0A+QEA/Pz9CRkQ+PDw9QD04Ojttd0g4Ozo9PUE8S2Q9PD08ODo7Pz49PD07PEA9PTw8Pjs9PD0+QUBCQUBAP0JEQ0RFRkZGQ0VHSElJSEhJS0tMTUpKSUpNTUpLSktJSEhISEpJSktKSk5MSUlfcHBycnJ0dXZ6e319fH5+fn5+fn5/f35/f36AgIB/gICAgICAgYGAgICAgIGAgnZNTk5NTk5MTE5QT0w+QTw8PT8+QkM/PkFBQUJBQFlSPDw9SU1GRnV3TTc4ODo7Pj5XakE7PDw6Ojs+Pz89PTk6Pjw9Pj89Oz4/QEJDQkJDQ0FCQkFCQkRCQkRCRENGSUdGRkhJSUtNSklKSktMSkpJSkVESUlGRkhISUpKTEpGRmdwb3FxdHZ1d3t8fH18fn59fX1+fn9/foB+fn+AgH+AgICAgICBgYCAgICAgICBek5JS0tMTExFSUxOTTw/PDw9PkBAQUE7QkNCQ0BDc3lJO11/g396fHdXPD0/PT0+Rmh0TDo9Pj89PT9BQ0A8OTtBPz4+QT07P0JAQkNCQENDQUNBPT0+QD0/QUFBQENFRUBAQ0JDR0dFRENGRUZGR0VEQEFHR0ZDRkRHSEpHQz5IbG9wcHF0dXZ5fHx9fHx+fn1+fn5+fn5+f36Af3+AgICAgICAgIGAf4CAf4CBgIF+UUhLTU1NS0pLTE9RQD8+PkFBQEBBR0FCRENFQUhyeWtig4SDg4OAfV4+QENAQT1KcntZOj1BRUFCQkZIQz08QEREQUA/Pj1AQT4+Pj88PkBER0VAPkBBP0BDRkVDQkJDQEJEREJERUFCPkFCQkFCQEA9QUJDRENDQUNFR0E/PVZwcHFwcnV1d3p8e3t7fX9+fX19fX1+fX5+fn9/foB/f4CAgICAgYCAgIB/gIGAgX5SSEtNTUxLS05OUlVEQkBDQ0FBQkBCQ0BAQUFARm90fYKCgYN+fYV2TUFDRUA/Pll7gF0/Q0VJSklJTU1LRUNGR0dFR0VFRUREQ0E/QD4+QkZKSkdFRUdGRkpOTktKSUdHSEtMSUdHQ0REREVEQUJCQ0BDREVEREVERUZDQkFEZW9wcXF0dnV4e3x6fHx+f319fX19fn59f4B/f39/f39+gIGBf4CBgICAgH+AgICAfVJJSUpKSEpKTE9SU0dGRUdIREdIREA+PDs+QEVFaHN9gXx/hH55hXJDREVEQ1d1hoeHflhHSEpNTE5PT0xIR0hHSElJSEhHR0hIRUNFRUVFRkhKSkZFR0lKTU9PTU1LSktKTU5LSUhHSEhIR0ZFRkZGREZIR0VFSEhGSEZIRlFubnBxcnV2eXt7e3p8fX5/fX19fX1+fn1/f39/fn5/gH+BgYGAgICAgICAf4GBgIB8UEhHSElGR0lKTU5OSkxJSUpLTE5KRkNBQkNGSkdge4B/d3+EhYOEimxBQVZ0h4mHh4eIg1dITE1MTU5MSUdHR0dER0dHR0ZIRkhFQ0RERkVEREhIQ0NDRklLS0xMTExMTElKS0pKSUlJSEpISEdISUhHR0hGRkZISklJSUlIXW9vcXJ0d3d6e3t6e319fn59fX19fX5+fYB/f39+fn+BgIGAgYCAgICAgIB/gYCAgHxNR0ZIRkVGR0dKS0pMTUxLTU5NT0tJSEhKS0tMTE5bfIKCg4OFhoaIg1ZshIeGhoaHiIiHfFBLTEtIR0ZGREVDQ0BAQ0NDQ0ZGRUJAPj5AQUFAQkQ/Pj9ERkhERUdJSklKSEhIR0lJSkpJSEZKSkpKSUpJSkpKRklMTEpKS0tmb3BzcnR2eHl7e3t8fH1+fn19fX19fn59f39/f35/f4CAgICAgYCAgIGAgICAgICAfU9GRkdGR0hHRUZHR01NTUtMS0lHQ0NDRElLS0xMSlSBg4SEgoKFhoaEgoaFhISGhoaHh4aKdUlJRkI/P0A/Pz88PDw+Ozo8QUFAPjw5OTg8PD07Pjs4Oz9BQkBBQ0NCQEFBRERCQ0ZISUhISEtNTEdJSk1NTk1KSktLSkxMU2xwcXRzc3d5e3t7fH19fn9+fX19fX1+fn5/foB/fn9/gICBgIGBgICAgYCAgIB/f39+UUZFRkdJSUdEQ0VGTk1MSklIRT85Oj5ARUhISkpJZYWEhIR/gYKDgoODhIWFhoeIiIiIiYyOZkJCPTg4Ojo5ODc4ODk2NDc5Ozw6ODU1Nzc4OTc4NzU4ODs7Oz1AOzk5OT08Pjs8PUFDRUhKTUxMR0lIT1JRUFBOTE1NT1Fdb3BydHN1eHp7e3x8fn5+f359fX59fX5+f39/gH9/f4CAgICAgYCAgICAgICAgIB/f39RR0ZHSEpIRkVGR0hMTEpJSUdDQjU2OjxDQENHSUlohoSEgX6Bg4ODgoOEhomKjIyLi4mKi4yJVDo4NjU2NzY2NjU2NzczNTY4Ojg3NjU2NTY3Njc2ODo2Nzg4OTs3NTc4OTc5ODc2OjxAR0ZJRklGRUZQU1JTU1JPUFBSVGVxcXN0dHZ5e3t7fH1+fn5/fn19fX19f39/f39/fn+AgICAgICBgICAgICAgICAgH9/flJISEhJS0lHSUpJSkpLREVIRUJANTc4OD06PUVDQmWFg4GAgYODg4ODhYmLiomJioqKiouJioqBRzU2NjQ2ODg3NDU3ODU2NzY5OTc3Njc2NTo5Ojo6Ozc5ODk4Nzc3OTo5ODg3ODY4OTtBPT4+QkE/QUtMT1FQUU9PT1JXa3FydHR1dnp7e3t9fX5/fn9+fX19fX5/f4B+f39/f4CAgH9/gICAgICAgH+AgICAf39+VEhHSUlMTUtKS0tMSUg/QEFAPDo1Nzk4OTc7Qjo9cYSAgYODhISEhYaJioqIh4iIiIqKjIqJiYx6Pjw6ODs8PT45Ojo7ODo7OTo7Ojo5Ozo5PT09Pjs7PD06PTs5Ozs8Ozw8OTo8ODo6Ojo5OTk8Pzw8QUJESUpMS0lLTFdvcnN1c3V4e3t8fHt9f39+f359fX19fn9/f35/f39/f3+Bf4CAgICAgICAf4CAgH+Af35URkVGSUxOTkxKSk1CPzo7PDo4OTk4OTo6Ojs/Pkh+hIKChIWFhYaIiYiHhoaGiImIiYuMi4mKioxvTz4+QkRFRUJBQEI/QEJBQD49Pj5APz8/QD8/PT0/Qj9BQT9APz1AQEA+P0E9Pjw7Ojs5OTs/PTs8PT1BQUNBQkNBWHBxdHR0dnp7e319e31/fn9/fn19fX5+f35+fn9+f4B/f4CAgIB/gIGAf39/gICAf39/flJFQkFHSk5PTElHSzo4Ojs5Ojo8PTo7Oz09P0BCUoKCgoSFhIWEhomJiIiGhoaHiImKi4uLioqLiYxjPkRGSkxKSkZHSEVGR0dFQkFAQ0VDQ0FCQ0I/QERIRENFQ0VFQUZFRkRFRkRAQj48QD49P0A+Pz4/Pj8+Pjo7PTxgcXJ0dHV3enp7fX19fn5+f39+fX19fX5/fn5+fn5/gH9/gICAgICAgICAf4CAgIB/f4B+UERAPUNIT01HRkJEOTc6Pjo8Oz4/Pz89QUBDQ0ZXhIKDhIWFhoaIiYmIh4aGhoeJiYqLjI2MjIuKiodWSE1NTkxPSkpLSUlKSklFQ0RGR0ZEQ0VGREJISUtISEdGSEdFSklLSUpLSkNGQ0NEQkFBQ0JEQ0NERENBPTs9QGhwc3R0d3d5eHt8fH19fn5/f359fX1+fn9+fn59fn+Af3+AgH9/gICAgICAgICAgH+AgH9PQT49P0RMS0FCQkE5ODw+Ozw7PkA/QT5CQkdHSlmEgoOFhYaHiImJiIiHhoaGiIiIiYqMjY2NjIuKjH9QTlBPTU9MSkxKSUlISkZERkhISUVFSEZGRUxMTUlKR0ZISUpOTU5MTE5LSEZHR0VFQ0ZGRkZERUhIRkNBP0BMbHB0dXZ4eXl5fHx8fX1+fn9+fn19fX1/f35+fn5+f39/f39/f3+AgICAgIB/gICAgICAf1FBPz4/RUdHPTxAQDg3PDs8PTo+QD4/QENGSUpRX4GDhYSFhoaHiIiIiIiIh4eIiIiJioyNjYyMi4uKjXJOU1FPTk1MTUpIR0VJSUVKSEdKSklKR0dHS0xOTE1ISElKTVBOUE5NT0tJR0lKSElESUhIRkZHR0lHQ0JBQ1VucHV3d3l6eHl6e3x8fX5+f39+fn1+fX5+fn5/f36Af4B/f3+Af4CAgICAgICAgICAf39/VERBQUJHSEI/OD9AODo8OD0+Oz1BPj9BREhKTFVxg4SEhISFhoeIiIiIiIeGiIiIiIiJjIyLjIyMi4uLi2BUVFJPT05LSkhGQkdKR0xKRktPTEtKSktNTE9QTkhJS0xPUVFQUU9PSkhKSkxKS0ZHSEdGRkhGRUVCQUJCXG9yd3h5enl5eXp6e3t+fn5/fn59fX19fn9+fn9+f4CAgIB/f39/gICAgICAgICAgH9/f39VRUNFRUdHRUQ7P0E7PTw5QD4+QEJHR0FHS0xQVnmFg4ODhISGiIiIiIiIh4eIiIiIiIqLi4qMjIyMi4uOfVlYVFRVVE9NS0pERUZLT05PV1VRUE9RU1JNU1RPTVNMUFNVVlJTUVBMSk1NTUtOR0dKRkZISkRERUVCRUNjcHV5eXp6ent6e3p6fH59fX9+fX19fXx9fn5/gH9/gICAf39/f3+BgYCAf39/gIB/f39/f1VGRkdHR0dIRj5AQj0/PT1CP0JCR1ZORk5QUFRYe4aDhYWEhIeIiIiIiIiIiIiIiIiJiouKioyMjIyOi4uMaVlXa2FGVFFRUEk7O1JTUmB1XVVWVFZZWVJYWFJaZlBVV1pdUlRXUU9NUlFQUFFLS0tISEpIRUZJSUlISWlydnl4eXh6e3t8ent8fXx9gH59fX19fX1+f39/f3+AgIB/f39/f4CAgIB/f3+AgH9/f35+U0hKSUhHRkZFPz9BQUVBQ0dFREVMWFJNVFVWWFt8hoWHhoWGh4iIiIiIiIiIiIiIiIiIlJyMioqMfWGKi4uHbVxlVTpZWVhTUT9AVlVZXGRgVllicl1dV11aVkVRWVpbWV9UWWdSVlZYVFRWVE9PTUpMSklJTE1LT01Tb3N2eHl4d3l5ent6e3x9e35/fn1+fX19fn1/f39+f4CAgH9/f3+AgICAgH9/gH+Af39+fn5WSkpJSEdFRERCQT9ITUlNUEtJS1BUU1NYWlpcXHiFhIWFhYWGh4eHiIiIiIiIiIiIiImcnaCPiY5nO36LiYqLeW9wWVtcW1JUUlZWVFtadYNZVX2QYV1YXV5XSVZdXVtbX1lIWVhZW11YWFlXUlFNUFFNTU9TUVFVUmFzc3Z3d3Z4eHh6e3p8fX19f39+fX59fX1+fn9/gH9/gIB/f3+Af3+AgICAf39/gIB/gHh5fVlOS0lJSEZCREBBOlBRUVdYUFBPUVNUVFhYWVpbboGCg4WEhYaHh4eHh4iIiIiIiIiIiJaanJeIioFuhomIh4SKfmdZWVxZVFZUV1JRV1ZjloBRZXJYWldfaFBgZltbWFxnYUdPWmhnXFtcXV1XUk9TUFBRVlZWVllabnJ0d3Z2dXh4eHt7fH19fX5/fn59fn18fn9/f3+Af39/gH+AgH9/gICBgYB/gH1yfX9/b3R8XVNQT01LSkVDP0A7UFBaWltTU1FPUlJSVVNWVFdfdXiAhYSEhYaGhoaHh4eHiIiIh4eIh4ORjomJiIaFiIiGfYB8XFFWWFVSVVJRUUxPTUtmeVtdVFlVVl1aTFRaVVNUXlpYV1dXemtYW1tcXlRRUVBJTk9XVlhbWmRwcnZ2dHR2eHl5e3t8fX19fn99fX1+fX1+f39/gIB/f3+Afn56eHd2c3V7f3+AgHRrfn5rcnleW1ZVVFJPS0ZDREFNXoNsVlJTTk9RT1FVUlNSUlVjZHaAgoKDhISEhIWFhISDhoaGhoeIhn6JiYiHhoOHh4d5bnFWSkxOT0tNS0hKREVJRUM+VGRVf1JRUU5LUVRRTU9ZUk1OUVNVVU1RU1JQT01MSENJSFJUVVpcbHF1dXVzc3d6ent7e317fX19fn19fX59fn9/f39/f399fX5+f39/f4B+e3Zzd31+fmR1fWlxdF9kXV5bWVZQTElMSWFsknRQUVNOUVJRUltSU1JRUlVUYnN7fH+AgYKBgX99e3uAf4OChYaHgoaGhoGEgYaFhnVfXUxEP0NDQ0NCP0RQQkNAQz1DSUdWQEhOTEddaVBIRk5GREVGSUdIQ0RIR0hLR0RCQURAT1FNUmRydHZ1c3R1enx7e3t7fH19fHt+fX19fn5/f3+AgIB/f3x8fX+Af39/f4CBgH12dHt/bWh8Z25xZmllZGJcWFNRUFVSc1dlW09PT0xRU1FVWVNVUVFUU09WYGtscnZ7e3h5dHJuc3RzeXh+f4OAg4OCgIKAgoGCa01HP0A7Oz5AQD8/PmtQS2FFRkhJRUI/R0xOR01RVUlBRT8/PD08PT0/PT9BQ0NAPzw9Qj5KTkdVbnR0dXN0dnh6fHt9fHx9fX19fH59fXx+fn9/f4B/f39/enl3eHd2dnh7foB+fXt4dnx1YXhnbHBqbGppZmBbUVJaXFleSkpQUU5MTFFSUVRWVFdSUVdWUFhbYl1hZ21tbG9rZ2BucmptbHF1e3p9e3h6fHx4d3hlQ0BAQj06QkNCQkRCXF1Pe05PTk5LTE1PT1FMS01XTUhHQEE8OTc3NTk5PTs7Ozg5ODk/PEJIP1xzdHV2dXZ3eXx8fH18fH19fn58fX19fX9/f39/fn9/f314dXZ6e3p3eXh1d3t8eXh1eXdjcWhpcG1ubW1oZl5PUF5cWklIUFJRT01QUU5RUlRWWFNSWVROWVpbV1ldXl5fZWBdXnF2a15gZ2t3b29sam9ubmxmYllIRkZIQkFHSUVFRkRNUlBhV1JXUVBTU1JVW09PUVZQTUlERj46OTY1ODc5Nzk6MzY1Nzk1PEM+ZXNzdnd3eXl7fX18fHt8fX5+fnt9fn19f39/fn5+fn9/e3d1eX18enh8fHx8dHd2d3Z1d2tuaWhxbm9vb2prYFVXXlpYTUxUVFNQUVVPTFJTVFdYVFRYUUxXWVpWWFhWWFldV1hYaHNrXVZhc2tiYV9eZGFfXllUUU5OTkxJSEpMSUlGQ1FQU1tXVFROUVNZU1xlVU9TU1FOS0lIQz9BOTk5ODk3ODg1NzU3ODU5OUdtcXR3eHl7e3x9fX18e318fn5+en1+fH1/f359fn59f358dHR1e3hycW9vbnR4cXJzeHZ1cWZkZ3JucHBwbm1kXV9fWVdPUFhWVlNUVk9PVFZYWFlTVVRMS1RWVVVVV1BTVVdUVVJdbl5STllfW1ZZO0RWWFRbZkpMT1JST01NTk5OTUpGUVBVWVNUT0pOT1VTVFxWUlVTUk9NTElISEY/Pj06Nzg3NjU5OTY3NjY1V3Bwc3d5ent8fX59fnx9fXx9fX15fX18fn5+fXx8fX1+fXxydnF4eHJ2dXFxbnBwb3B1dnRuamRkanBwcXJwb2ZlZGNcXVJUWlZXVVRXVFJYWFlZWVJVT0pHT1BPT01SSlBQT1BOTk9UTE1JUE9TVFUyPVhNSUBRPWNhUVNRUE5QUVBOTk1RTlRSUFJNSUxLT1JQUlJTVFFST0xNS0xMSENCQT06Ojg3NjtCNTU2Njpkb3F0d3h7fHx9fnx9fH19fX18e3h8ent9fX58e3l9fH18e3B1b3d1cHV0b3N2cHFxcHR1dmNqZ2VXaHRycnFuaWlocFZWVFVYVVdVUldWVVpZWFdVUVNGRUFGR0dIRkpESEpJR0VITEhLSUZMTVBNRy9FX1I+Mz8+am9hUlJRQEdVUVBRUFFOUU9QT0xKTExPUE5OUFFRTlBPSkxNTUtHRUVEQjs9PDw5PUc2Njc3RG1wdHV5e3t8fX18enx8fX5+fXt5dnh3eXl8fXp6dn17fHp6b3Fud3JwdnFtcHNwb3Bzc3N0ZmdgaFpXa3JzcmxtbWtuYWVQU1RSU1RPV1ZWWVlWUVFRT0A9Oz0/QUJBQ0BCRURBQEdIR0hGRkhKTUxFR0NPUkM4RU5TXWdTUFNBR1VQT1FRUE1NTk1LTEtMTk9PUU1PT01ITExJS0tMS0dGRkVEPEFBPjtARTs8ODlTcHJ0eHt6e318fHt5fHp6fn58e3V0dXJ2dnp6eHpyfHt8eXltcW94cnF1bm5xcm9vb3Rzc3J1dGtnZ15lam1wa29xbWltY0xPT01RU0xUVVRYV1VNTEtJPDk4Nzs+QD48PUFAQj0+RUhHQ0ZGSUdKSkBGQUFARkhFSk9IUVJhXFFQUk9TT09QTExPTUxNTE1PTltXS01RT0dJSENISkxMSkZGRkU/QkM+PEJHP0I/QWRwc3d6ent7fHt6end7d3l+fnt7cXN0cHJzd3R4eHN6e3l2d2xxb3ZxdHRsb3Fybm5vc3ZydHNycmtsZW5zaG1ubWxtbGprSUxISE9RSlFTUVRTT0tIREQ9OTc3OT9CPjs/QkBAPkFESkVDR0dJRklFQkI/Pj1DQkFHSUVOT2JlUU1PTldLTE1LTE1NTUxLT05TZE5KTFJJSUlFQUhKTE1OSkdJRkJBQkA/RUZFSERLbm92eXl5e3t6e3p3dHh1eHx8eXpucXJtbm9ycnZyc3h8eHZ2bXBtc3B1dGxwcHJvb29ydnZyVlZucWdseYRqbXFybm5qaG9ISkNHTU1KTVBNUE9ISkQ/QT05ODo6P0I/PEBCQUFERUdKRkNISUdHSENDP0I/P0BBPkRFQ0xOUlRMSklNVEdJSUpMSktMSUpMTU9QUlBLR0NMR0NCSklMTU9OSUpJR0NDQ0RJSk1MSVlybXd5eHp7e3l8dnJwdXJ0eHl2eGpxbmpsbG50dG10dXtzdHhyb25xb3ZzbnBvcnBvcHN0eWpOYGdzanR8eWdvc3FpcWhkcUdLREdISEdKS0lKS0RHQj0+PTo5OjtBQj89QkJDQ0dGSUtKRElJRkdHQ0M7QUBCPkBAQ0VESU1QSEhLR0hLREhJTE1ISkxISUpMS01dUkhIRE5GQURKSk1NUE1LTUpLRkdHSk1OUU5MYm1pdnZ3enl8en1ybWxza3B0dHR1aHBtamlra3RwbnR0eXByeXRvcnFvd3NvcXB0cnBydXR5a05WbXVscXt2aW5vaWt0Z2RvRktERkVHRUZGR0VHQkNAPjw9OTo6O0BDQD5CQ0VFSUVJSkxGSUlHRkZEQjtBQ0M+QENDQ0RHTE5IS05IREhFSUxOTUdJTEdGR0lJTE5LSUdFTkhDR01LTUxPTU1OTUtISElPUlFSTlJmZmZxb3N4dXt6fGxoam9la3Fsc3BmbWxoaWtsdG1wdXR3cW94dG90c3J2c3BxcnRzcnR1dXZ2WFZ1dWtvdHJrb3ZsaG1lX3BHSkRGRkVDQ0JFQERBPj8+Ojs7PTo9PkNBPkFDRUZKRklITEhHR0dGRUNAPURFQj5BQ0NDREdISUdNUEpGRkdLTk9LRkhJRkVERUlKSEpJRkhQS0RJTUtPTU9OT1BOSkpJTFJVVVJPV2RgYW1ncHJvcnl6Z2VoaGRpbGdxbGZsbWdpa2xzbHB2dXRwbnZyb3Nyc3V0cXNzdXRzdXZ2dnl2dXR3bGp1dW1ydnFsbmxlckxIRUVIQ0JBQkQ9QkE+QT06Oj0/Oj0+QEI+QEJER0pFSUZJSEZGR0VDQkFBRkZDQkJCREVFR0dJRkxRTElPSkpMTElHSEVHRkRDSUlIS0pHS1JNQk5PTVFOT09NTk9LS0tPVVdWVVNYX15caWFtaW5ocnNiZWZmZGloZm5pZm1taGtrbXJpcXZ1c3Ftdm5vcXJzd3Nyc3R1dnZ2dnd2d3Z2dHd1anN1bnV0c3FyamtzTUdIRkhCQkFERDxBQEBDPDg5PT45Pzw/QkBAQERGSEVJRkZIR0ZGRENFQ0RJRUNHRUJFR0VGR0dFSk1LSFFNSktISElFRkhIRUNJSUlLTUtPU05EUVJQUVFOUE1OUE1MTVNXVlhXVVhdWl1kYGhiamlna19lZWZjZ2dna2dna21rbWxwcmh0dHVyc252b3FwcnR4cXNzdXZ1gpF5dnZ0eHV1d3htb3VvcnN1cXFpbnlNSEdISEJCQkZEPD9CQkQ8Nzo+Pjo+OkBCPj8/QkVGREdERUhGREVEREVGR0pFRUpHQ0dIRkhHRUNGSkpHTUtMS0hKTEZJSUtIRUtLTExOT1JUUEhTVVNQU09RTU5RTk1QV1pWWllWWl1aWGFgYGBeaGVjYGRmaGdqaGhpZmhubGxubXFwaXV1eHJycHVwcHBydXZwdXN1dnV7fn14dnR3dnZ2eHBsdXBtc3RucHJyeE5JSEdJQ0FDSEU8QEVCRT05Oj4+PTw8QUI8Pz5BQkZDRUNDSEVDRUVGR0dHSUZHS0hESEhHSUdGREhLSUdLSE1LSktMSExLTUtKTkxPT09SVVZPS1VXU1FTUVJMT1FQT1RZWllcWllbXl5eYGNeXGFja2JgZGdocoVoZ2lmam1ucG9uc3JqdHV4cnNzdHJucHF2cnF1cnV1c355jn11dXZ2dnZ4cmh1cWtydGxxdnB0TUlLSEpGQkVHRTxAR0NEQDo8PkA/Pj9CQTxAPkFBRkNFRURJRUZFR0ZISEZISElLSkZKSEhLSEZGTElISEpHTExNTExJTUtNTU1PTFBQUVVWV09LVlZVU1NRUUxPUlJQVltbXV5bXF5fX2FgYWRdY2BlZmBlaGpjc3NmamdnbHBycW9zc25zd3dxdXZ0c21vcnVvcnNwdXJ2cnSBdnV1dXd2dXd0Z3Rya3Fya3J2bnZKSkxKTEdDRURFPEBGRERDOz8/QUBAQENBP0I/QUNIQ0ZFRklGSUZGRUlJR0lISkxISEpKSUxKRkpLSElKSkdLS01NSkpNTE5OTlBMT1BSVFhWTU5UVlRSUlFQTE5UU1JXW15eX11dYF9gYWFgYWNlYmRoYmRpamd2i2xqaWdtb3NxcHFwcHJ5dnJ1dXRzbW1zc21xcm90dXRycHN3dHV1d3Z1dXRlcXNrcHFqcnZud0tNTEtNR0RDQUQ8P0VFRUM9QUFDQkJDREFDREFBRUdDSEdISEdKR0RISUdISkZJTEhJSk1LTUxHS0lIS0tOUUtSUU1TTUtOTk9QUE9UT1dYWFtOU1BXXFpSV1BOVFVUVFhaX2JiX2RhXmBiXmBlYWFjaW5oY2loaG54dmxoaW1vc3JwcXJycnZ0c3Vzc3Nua3NxbXByb3R2cnFxdXZ1c3d5d3V0dWNtdGtvcGpxdG93TE5MTExHRUFARD4+REVGQ0BDQUVEREZCQ0VHQ0NJRUNJSkpJSUtHRUtKR0hKSUlLSEpKTkxOS0lMSEpMS1pmSmRcS2xTSE9OX25Va3NbcXBid2NTUGF2dWh1Y2F2YFhucWJkdmluemZbbHRgbGpUX3d2aWpnaWZnbG1qbW9qbW5zcnBycnFyc3Jzc3J0cm5sdG9ucHFxdXVxcXN0dnZ1dXl3dXR0YGt0a3Bwa3FycXlMTkpKSkZDP0BCPz1ERUZEQ0RCRUVERkJGRkdERUpFRUpNTUtMTEdHTUlHSktIS0tJS0tOTE5MTExJTE1MW3NiZHBebG1VTU5mc11nZnFsbnRncGlfYVlubmJwcGJrampnb3F0ZXRub1xvdWdwTUpxeXZrYmBrZWVteGxrdm1ucHNycHJxcHFycXJycnRybW1zbm5vcHJ2dHFzc3R1dXV0d3h2dXRibXVrcHBscnJxektMSUhHRUQ/QUJAPkNGR0JGQ0ZFRkVEQ0hIR0RFS0hHTE1OTE1NRkpOSEpLSklMSkpKS0xNTk5NTUpOTU1bcm9vbnBwbGtNUFFsV05pYnRycGFtbnVcWWxRXG1tWnFta29teHh0c2lwXV9ya3FqVXV5eHBjXmtmYmdwcGpqb3BwcnNwcXBxcXJycXFycnRsbXJtbm5vcnV0cXRydHV1dHV1enZ1dGVudWtwb2xzcnJ5SUtHR0VFRUJCQj5AQEZHQkdESUVFRUJGSUhIRUdLSkdNTU5LTU5HTE5JTEtJSk1JS0lKS09QT05NTE5OTFxoZHVdbHFXbE5QUW1VWmtea2x2YWxkc1NlY05tWWxcdHBraWx4and1aHBdXnJraFdiY3d8b2NgZ2dhZGp1eWtubnFzc3BxcHFwcnFwcHBydWttcW1tbW9xc3Rxc3J0dnZzd3Z6dnV0aG91bHNvbXNydHZITEZJREVFQ0FCPUJBQ0dESEdMSEVDQ0hLSEhGSkxMRk5MTFNSTEdMTUhOSkhITkhKSklITk9NTkxKTk1KWnNwcG9xcW1sT1FSbllxa2dvb3Fxb210XW5YYXRfbm9wb3Fyb251c3R0altddGN3eHJqbnpoYWFjZmJiam10dXBzdXZzcXBwcW9ydHt/fn13bGtxbmxtbnByc3F0dHN1dXR4eHl4dHVrb3VtdG9udHN2c0hLSElCRUVFQUA+RERCR0RISU1JRkNGSkxJR0ZKTUxFT0pLV1JLR0tLSk5JSUpMSUtKSUhKTU1NTUlLS0tTa2NbaV5faWNyclpfWWpvX2VlVWtfY1thYVFgbGhdalxuaWlkW3BmZHBdWlxrW21xY3BzbGRnY2RnYGBrbXBwb3R5cnVxb3BxbnmFiIeHhoWAdnNua21tb25xcnR0cnR1dXZ5eHh0dW5xdW53cXJ2dHdyR0dGSURFREZBQEJGRURHQkhKTEhGREdLTElFRkpPTElQSUxbUUpFSEhLTUlIS0pLS0lISUdLS0tMR0hLS0xNTUxKS01OVFtcVFBUTFBPTk9PVlFPT1FOT1FKSU5QUWRxaVRZV1xbXFVZW11YXVxcY2ZhYWViY2VfX2ZrbWhtdHlydHJvcHB0hoeGhoaFhYaHg3pwbW1sa3FzdHRydHZ0dXl4eHV2cXJ1b3ZydHN1dXNHQ0VHRkZBRUNAREhERkdDSUtMSEZER0tMSERHSVBLTE9LTFdMSUVFSElKSElLSU1KSEZHR0lHSElFRkxJSkxPTElQXFdeUFxbYF5NWFlTXFxiXk1YWk1YYVJKWWFaUl9kXGFYW2RkVlZYXFlaWFxWWVxdYl5kYGFfZWhrZ210dHFxdHBxcoGGhoaFhoWFhYaGhoR9cmtpb3Jzc3N0eHl5eHl4d3h0cXhyeHNxcnVydE9CQ0VMTUJEQ0JFSUVHR0ZLSktIRUZJSktGRUhIUEpNTUpNUklIRUFIRkpJS0xKTUpIRkRJRkRGR0VFSkhDSk1LTFVfWWBYYGFbYFRYWVReXlpfUllcUF5cWU5eXF5TWl5jXlpdYGNgWV9jW2BeW1RYV1leXWNiYmFjZWhla3Jwb3Bwbm93hoaFhYaCe4CFhYaGhYaFf3VxcHJyc3Z5eXp5eXh4eHdyeXZ4cnF4dnR2YVNKSk1JREJCQ0dIRkhHSEtJSUlER0tLS0VGSUpOS05MSExOR0hFPkdHTElLTEtLS0lHRElEQ0RFQkZKREBKTEpPW2NZX15hX1JUUldfYFxdWV5RWVxNVl9XS1FZWlBaX2FhXV5jYWBiYmJjY2VaUVlWVVxZXWNgX19jZGJob21ubGxsbHWFf4SDeXV8hIWFhYaGhYWGhoN9d3JydHd5eXl5f359eXV5dnZybnp3dnhYUUtGQ0dFQkVHSUZHSEhGRkpHSEdJS0lMRERLSk1NTExISkpISkY/R0dOS0tLTUtLS0lGR0NEQERBSElCP0lKSFBdYVpbZF1fVFFSWF1cXFxfWktXXExSXFlJTV5RT1xfYWNjY2NiXGRjYmRjZlhRVVRSW1daYF9eXmFhX2Rsa21qamxudn51gXp8hIWFhYWFhYaGhYaFhYaGgnpyc3V1e4WHh4eGhYSBfnhwend2eFxSTUNASUZDRktKRkZGSEdGSUZGRklMSk5GREtLTE5KTElLSkhJRkJISVFNTEtPTEpLSUdHRUQ/RUNISEFCR0dFVF1ZXlhfWV9bXVVYWE9dXVFLSlZeWF5bXVVZYFJRX19iYmBgYmJgY2JhZGRhWE9RUVFaUltdXV1dXl9fZGhnbGpubnB7e3x+e4CCg4SEhIWFhYWEhIWDhIWHh4FzcneFh4eHh4eHh4eHh4WDgHx4XFNLQ0FIRkRHTVJIQ1FKRkhISEVGS0pNUEVGSUpLTkxMSUxMSElHREhLUU5NTFBMTEpLSElDREFFREhHQkFHRURXVUVcVF1TVl9YT1RVTlpaTUlKVGBhW19YXl5hXU9ZYVxgYF9iY2JdYWJXX19UUE9PT1dRXFtbXFxeYGJmZmVsZm9vd3x7gHt9f4CEhISEhIWFhYODhYKDgoWFhnpvgYaGhoeHiIeGhoaFhYSFg35JTkZERkZIRElSYlBDVl5JR0dIREZNS1BQRUlJSktOTExMTUtKSkdFSk5RUU5PT01OTE1IS0FEQUNERkRDQkVGQk1IQktLT09OTEZNRkdJSkhHTEtNT1BJTE9QT1NPTFBTUlVaWVdZWFhkV09TVFBQTk1PVFJaWFhaXVxgYWRlY2dja2xwc3J6eX97en+EhISEhISEhIKEgH57gYOBfXuFhIaGh4eHhYWFhISEgoGAfUtJRUVIRkdES01dTEdHWE1ISEpIR01MUVFITEtLS05NVU5PS0tLR0dLUFNTTlBPTk9OTkdLRmBFRF9MRWZkRU1bSV5bcm1PTVVtWUxEUGBVa1dnSl1YVV5ETFFVTExTVlFSVFhXVFhVVFxVUGZaaGhkWFJqUlZVVFtcW2BgYWJiYmBmaGZua2hyenx9foGEhISEg4ODgX18enJ7gXp7f4KBg4SEhYWBhIWBg4N/fnp7TElGR0ZIRUVLT1NJSkZgVEhJT0pJT01SUUtNTExPUlVST09JS01HSE1RW1lPUFBOT09PSUpRf1FJfFlZcXRZUW1IcW5vYVZQcXFzUENrc21xc3BTb19bblhdVlxYVWtoVV1WY1pgWVtgVlZYf2p0dXVfX3ZfWGFbW2ZbX2BhYWFdYGJnbXBsYHB3dHiBgYKDg4J/fX+Adnh6bHZ+dHh9gHx+gIGChHyAg3p/gX9+d3dOSkVITU5CRExMR0lMRVFWTEtOSUtSWFdRTU9PTVFUTk9RUEtLTkdNUFNbWlNRUk9QUFBKSFp4XVR4ZWhaU1VSdmd0bHBibmZqUXJPTXdtanJwc3JxcnBvb4BdZXp1eHFxenF+c31rdX1iUmh8ZXNzb3Nye3xvfnhugHJfYGBiYVpgYGdrbmtibGZnbXd+gYCDfnt4d4B0dnppcn5uc3x+d3h7foCDeHyAdXx/fHxzc05LRmBdR0FFTU1ISktHSlBPTU1KTlZeWVVMUVNOWVpNU1NSTktPSFFSU1lXVlBUUFBQUUtIZ3hsY3hybVtLTlZ5cHVtdWJudlBkZUpmdnFtd2+AamZ4eGlXclFoem1panp6fWx4en9vaG9ZdnZqdXVwgWByZn1pbHh8b15fX2JhW11jZGdpaWRnYmNkbGxwcHN0c3NzeXFyeGJsdWdxeXtzcnZ5foFzdXpufH15d3JuTkpTdU5DQkZQUEhKS0lLUE9PT01QWmBaV0tUV1BhXlJWUVlSTE9JU1RVWFdXUFVQT05SSkxyb3V1cXVxZGliV25McXBeRmh5V3ZUTGl5fXhgeXtzbmFdbW9jUmhxdW5teXB3bHZ0dHJsbl10fnprbXl8a3RsfGtwdnV4Xl9fYl5dX2RkaWdoZWVeYWJpaWlqa25va3FubWpwYWNmY293eG9tcHN5fm5xcGp7enRzb21MTFtWSEdFR1JQSUxNSktQUVBQUFBXXFhVTVVZVWVYUlJZXlNMTklUVFZXWVdPU05OTlFIUm1IaXdLYGR2dlZYbE9ubHtzYWpnf3ZVTFdraH1sbWx4X1twenteYHpzY3JveHFoZH1pcnxeVExsYHZ1a2l1e3ttfnhrfHBcXl9iW15iZGRnZWVlYlpjY2lra3JzcndnbGloZGdgYWthZ3NybGdtbXJ8a21oa3t0bW1rbU9HS0tJSkhIUVBMTk9MS1JSUk9TUldSVlRQV1tWVlRUVGFfUE5NS1RTVFFVVk5OTE1PUEpIUU5QVUxLTFNUU1NUUFZVUVFOUVFYWVJOUFVUWFhYW1pVUlNXW1dYV1pPU1VXWFhSXllXXlZUUFlSV1dXV1heW2dyXltbWVxdX2NaX2NjZGZkY2NiWmNjZmZlbW5tdWVlZ2NhZl9dZ2BkbGhmZ2tocHpoZ2drdWpoZ2lsUUlLTE1NS0pTUU1RUE9MVlVUUFRVWFVZVVFaXVZVVFdVWVdPT0tNVlRRTlVTTk9NTFFQS0pSUUtRTUtLUFJVU1FSU1NJSExOT1FSUVFRVFZSWFdcV1NTUFJUVVZTWlFOU1JYVlRZVlRaVlRSVVRUVVdYVl1ZXmBdXFpaXFxfY1tdYmNkZmRkZGFZYGFjYWJoaGltYmFkXl9jXVpkXGJtYV5mZWZtc2RpaGtrZWRjZmhQSktLT09MTVNQTlNRUU1YV1VUVVdXV1pVU1xgVldWWVVYU1BQSk5XU1BOVVBOUU5MU1BMT1VTTlFOTU5RVVFVUVJUVU5LTU9RVFRSUlFWV1VZWltZU1VSVFdXV1lbVFBUVVhVVVpVV1pWU1JXVlVXW1haX1xVWF5cXl1bXWBhXltiYmNnZmVkYlhfYWJdYGdkZmVhXl9dXV5aWl9aX2dgXl1dYmhrYWdmaGZkYGJjYVBMTUxQUUxPVE9PU1FPUVtaWFdYW1lYWVZcamRWWFlaV1ZTU09KTlZUUE9UUFBQTkxRUVBSWFRRUU9NT1NWT1dSVFVVT05NUVNWVVRUUlRXVlpdXFpWVlFRVlhWW1tXUVRXVlZWWVRYWFZTUllXVlpeWV1fXlVeXF5gXFtfX19fWmJiZGhnZGRiWGFgYl5eZmNjYGJdXFxcXFlaW1hbYVteXVxfYl9fYmRlYmRfX2BcUE1OTlJRTVJST1NUUU9VXFpaV1tbXFhaW2RxbWhkX1tZVlVXUUxNVlNNTlJPUVJPTFBTUlVaVVNQUE1RWFdSV1NTU1hNT09RVFhWVVVTVVlYW15dW1tWUk9VVlZbW1dSVFdWV1hWVFhbVFNSWlhXXF5aXl9gVWFcYWFdYGJfXWBdY2BjZ2hkZmBZY2BhX19lZF9gY1taXFtcWVpZWFdcWVxbYF5fW15eYWBeYlxZYFpRTk9OVlFQVFJPVVRTUFdcXFxYXlxeVlxeanF3eYBjXFtVVVhRTU9WU05RUVBSVFJLUVRUWVpXVU9ST1NYV1RTVVJSWk9QU1JWW1ZWV1NWWlhdXltbXlZTTlRVVlxcVlJUVlZYWVNUWVxVU1NdWFpdXlxgYGBWYVtjYl1hY19cYmFiX2NmaWRmXltkYGFgYWNkX2JfWVpeW1xbWVhZV1daWlphXF1bXVxcWl1gV1tbWlBPT09ZUFVUUlFXUlRQW15eXVtgXGBVXF1oanJ9c2xnXFRXV1FOUlpTUlFUUlRVVEtSVlZbWlpTT1NRVlZWVE9XUlNaUlRUVFhdV1hYU1hcWF5dWVpdVFVOVldXXltYUlVVWVlZVVdZXFVUV15ZXV1gXWJiXllfW2VhX2RkXl5jY2FeZWZpZGZdXWRhYGBhYmRgYl5YWl9bXFtYWFhXV1taXGBcW1tcW1haW15WXlldUE9PUlpQW1RVVlZUVFReXmBeXmJcYFVdXmJreXRsfWtaVVlVUVFTXFRVVFVUVllXTFJbV11bXVJPVVNYV1dUUFhSU1dTVlVVW11YW1lVWl5YX15ZXFlSV1JZWVlfW1pUVVZaWVpXWFpcVlVaXlxeYGFfZGNcXl1dZWFhZmReXmRjYFxnZGhlZGJfZGFfYWBiYl9gXldYXlpcXFpZWVdWXVpdXlpZW1xbV1lcXVZYV11TT1BXWVFcVVZZV1dVWF9fYWFgY11fVF1fYmVldYF6aFhZWVNVU1ZcWFdXVlZXXVhPVV1aXl1cVFJXU1dWVVNUWFJTVlRYV1hdXlhdW1ZdX1hfX1hcVlFZVFlaWmFZXFZXWFtaW1lZWltYVl1fYF9jYmFkZF1iXGBmYWRmZF5fZGJiW2ZjaGVjZmFmX19hYWFhYF9eVlVdWVtcW1lbWVldW1tbWFhZW1laWl1fXVRZXVVOVFlWU1xUVldZVlZcYGFiY2FjXl9WW2BkYV96dW9oWVxaVVdUV1taWVxZWFlgV1BWXlxgYFxUVFhQVVdWVFZXUlNVV1paW19eWl9cVl9fWV1eWV5VU1lXWVldYlpeVldbXFtcW1taW1lZX19gYGRjY2RlYmRZYWZjZmZlXmFiYGNeYmNpZGNnX2deYWJjYWFgXl9YVFtaWltbWFtYWFxbWltXV1lYV1xbXGBdVl1dU09WWlZWWlVYVVhXWF1fYmFkYWRgXllZYWRiYGxmaF5bXVtWV1hZXFxcX1tZW2JWVFheXWFjXFJWWVBXVldXV1ZTVVRYXFxeYGBdYFxXYV5bXlxbXlhWWFhbW19gXF9YWVxcXV5eXFtdWFtgYV5gZWNkZWVmYlhjZWRoZ2ReY2BgZWNdZWlkZWlfZl1jYmNhYWBfX1tYWVtZWlpYWVhXW1taW1dYWlRZXVxaYFxVXmJOU1dZVldaWFtcWFdZXmBiYWRhZGFdXllhY2JfYWBgXlxcXFdXW1tdXV9fXFpdY1laWF1gY2RfUlhZUFdXWFlZV1ZXVl1dXmBhYF9iXllhXV1eWV1eWVhVV1tcYF5dX1paXl1eXmFdXFtaXGBiX2JlY2VmZWZiWmRmZmlnY19jXmFmZFppaWNmaWNlXmJiY2FgYF9dXVpYXFlZWFhaWFdaW1pZV1hVVVtdXV1gYGJieEtYV1tZV11bXF1aV1xdX2BiZGFiYV1gWGJjYmFjYWJdW1xbWFdbXV9dYF9dW2BkXVxYWmJlY2FSXFpPWFhaW1taV1pZYF1gYmJgYWNfXGJdX11bXl5ZWVRYXV5fYF9gXFteXmBiY11cWFxeYGJiY2VkZmRlZmRcZWZnaWZjYWJcY2dgXGlpYmhpZWRgYmFjYV9gX11dXFlcWVhXWFlYV1xaWldXWE9YWl1hY2Zmcmt/SllXXFpaX1xbXlxYXVteX2FjYmFhXWJbYmRiYGJjYlxbW1pXWGlxYFxgX11cYWNfXllZY2VkYVNfWlJZWFxdXVxaW1tjYGJiY2BiZGFgY15gXF5eXlpYVltfXl1hYWBeW2BhYmVjX11UXWBgY2RkZmVnZWZmZV5lZmhoZ2RkYFtlZ15haGhiaGhmY2BiYGNiX19fXV1bWltZWFhYVlpWXFtbVlZVTVhXXGdpa2h1eIF2dnZ2dnZ2dnZ2dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6e3p6ent7e3t7e3t7e3t7e3t7e3x7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHt7e3t8fHx8fHx8fHx8e3t7fHx8fHx7e3t7e3t7fYmIhoqHhYOCgoOCg4OCgoKCgoKCgoKCgoGAgYCBgICAgYCBgYGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t6e3t7e3t7fHx8fHx8fHx8fHx7e3t7e3t7e3t7e3x7e3t7e3t7fHx8fHt7e3t7e3t8iYmHiYaFgoGCgoKCgoKCgYKCgoKCgoKBgYGAgICAgICAgIGBgYB9fHx8e3x8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eHh5eXl5eXl5eXl5eXt7e3t7e3t7e3t7e3t7e3t7e3t7ent7e3t7e3t8fHx8fHx8fHx8fHx7e3t7e3t7fHx8e3t7e3t7e3t7fHx8fHx7fHt7e3uHiYiJhYSDgYKCgoODgoKCgoKCgoKCgYGBgICAgICAgICAgYKBgH58fHx8fHx8fHx8fHx8fHx2dnV2dnZ2dXZ2d3d3d3d3d3d3d3d3d3h4eHh4eHh4eHh4eHh4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3x8fHx8fHx6e3t7e3p6ent7e3t7fHx8fHx8fHx8fHx8fHx8fHx8e3x8fHx8e3t7e3t7e3x8fHx8fHt7e3t7e4aJiYiFhYOBgoKCgoOCgYKCgoKCgoKBgYGAgICAgICAgIGBgYCAfnx8fHx8fHx8fHx9fX18fHaIi4uLi4uLgX19fX19fYSMi4uLi454KSkqKiopKz0/Pj4+Pj5tgH5+f397pdfT09PT1r2GiYmJiYqCRT4/Pz8/O5vDvr++vsGiioyMjIyNiX5/f39/f359fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx8fHx8fHt7e3t7hIuHh4aHgoGDg4GCgoKCgoKCgoKCgoGBgYCAgICAgICAgYCBgIB+fHx8fHx8fHx9fXx8fH19doyQj4+Pj5CDfn9/f39+hpCPj4+Pk3kZGhoaGhocMTMzMzMzMmqCf4CAgHut6eTk5OToyomMjIyMjYM6MjMzMzMuodLMzMzMz6qNkJCQkJKLf39/f39/f319fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e3uCjYeIh4eDgoSCgYKCgoKCgoOCgoKCgYGBgICAgICAgICAgICAgH58fHx8fHx8fXx8fH19fX12eHh5eHh4eHd3d3d3d3d4eXl5enl5d29wcHBwcHBycnJycnJyd3p5eXp6en6Dg4ODg4SBfHx8fHx8fHZ1dXV1dXV+g4KCgoKCgHx8fX19fX18fX19fX19fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e4CMhomHh4SDhIKCgoKDgYKCg4KCgoGBgYGBgYCAf4CAgICAgICAfnx8fHx8fHx8fX19fX19fXZ2dnZ1dXl2dnZ6e3h7eHd2d3p3eXl6fnx5eXh4eHh5eXl5enp5eXl5enp6eXh4eXl5eXl7e3t7e3t7fHx8fHx8fHp5eXl5eXp6fHt7fHx7fHx8fHx9fX19fX19fX18fH19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8f4uHi4qIhIODgoKCg4KBgoKDgoKCgYGBgYGAgIGAf4CAgH+AgYF+fX18fHx8fHx9fX19fX19d3d3dnZ3fXh3d316eH14d3d4fXl7e3l8e3h3d3d3eHh4eHh5eXl5eXp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fHx8fHx8fHx7e3x8fHx8fHx8fHx+iomMjImFg4SEgoKDgoGBgoKCgoKBgYGBgYCAgICAgICAf4CAgH19fXx8fH19fX19fX19fX13d3d3d3p9eHt4fHx3e3h3d3d7eXl7eHx6eHh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fX19fXx9fX19fX19fX19fX19fHx8fHx8fHt7fHx8fHx8fHx8fH2Kio2NioWDg4SCgoKCgYGCgoKBgoGBgYKBgIGBgICAgIB/gIGAfXx9fX18fX19fX19fX19fXd3d3d3fX55d3d4e3p7eHd3d3t5ent3fHl4eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt8fHx8fHx8fHx8fHx8fH19fX18fH18fH18fHx8fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8foqJjo2JhISEg4KDgoKBgYKBgoKCgYGBgoGAgYKAgICAgH+BgIB8fH19fX18fX19fX19fn5+d3d3d3d5fHl7eHx9eXt5enp3e3l6fHl8eHh4eHh4eHh4eXl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt7fHx7fHx8fHx8fHx8fXx8fX19fX19fXx8fHx8fHx8fXx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx/iIeNioeFhoaDg4ODgoGBgoGCgoGBgYGCgYCAgoF/gICAf4CAgHx8fX19fX19fX19fX5+fn53d3d3d3Z4eHl3eXp4enh5eXh6eXl6eXl4eHh5eXh4eHh5eXl5enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX18fH18fH19fX19fH19fX19fHx8fHx8fHx8fHx8fX+HiIyIhoeHhIKDhISCgYKBgYKCgoGBgYKBgIGBgYGAgIB/gIGAfHx9fX19fX19fX1+fn5+fnd3d3d3d3d3d3d3eHh4eHh4eHh4eHl5eXl5eXl5eXl5eXl6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fHx8fX19fHx8gIeIi4eHiYWDg4SDg4KBgYGCgoGBgYKCgYGBgIGBgYCAgICBgX97fH19fX19fX19fn5+fn5+d3d3d3d3d3d4eHd4dnl5eHh4eHh5eXl5eXl5eXl5eXl5enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fH19fXx9fXyBhoqKiYmIhIOFhISCgoGBgYGCgYGCgoGBgYCAgYGAgIGAgIGBf3x8fX19fX1+fn5+fn5+f394eHd4eHh4eHZxZGpeam15eXl4eHl5eXl5eXl5enp6enp6enp6enp7e3t8e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIGFiYqJioeEhYWEg4KBgYGBgoKBgYKBgYGBgYCBgYCAgYCBgIF+fH1+fn5+fn5+fn5+fn9/f3h4eHh4eHh5bWRiZV9fXm95eXl5eXl5eXl5eXp6enp6enp6enp6e3t7e3t7fHx8fHx8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goWKiomJhISFhYSDg4KBgYKCgoGBgoGBgYKBgIGBgICAgICBgH58fX5+fn5+fn5+fn9/f39/eHh4eHh4eW5kZWdlZGJeZnh5eXl5enp6enp6enp6enp6enp6e3t7e3t7e3x8fHx8fHt8fHt7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChouJiIqEhYaEg4OEgoGBgYGCgYKCgYGBgYCAgYGBgIB/gIGBf3x8fn5+fn5+fn9/f39/f394eHh4eHl3Z2VkZWZkZWFfaXl6enp6enp6enp6enp6ent7e3t7e3t7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHt8fHx8fHx8fHx9fX19fX19fX19fX19fXx9fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4eJh4SEhoSCg4WBgYGBgYKCgYGBgYKBgICAgYGAgYCAgYF+fHx/f35/f39/f39/f39/gHl5eXl5eWtlYWJlZWFlZV5ieHdze3p6enp6enp6enp6e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fH18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19g4aLhoiFhYaEgoOEhIKBgYGBgoKBgYKBgYGAgYGBgYGAgIGBgn98fH9/f39/f39/f3+AgICAeXl5eXl0Y2NlZGNmY2doZGZsZF5ze3p6enp6enp6enp6ent7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn6DhouGhoaGhYODg4SDgYGBgYGCgoGBgYKBgYCAgYGBgYCAgYGBfnx8f39/f39/gICAgICAgIB5eXl6d2RhY2diYmRdW2VfYV1eYGFoeHp6enp6enp6enp6e3t7e3t7fHx8e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+foSFi4eGhoaGhIODg4KBgYGBgoKCgYKBgoGAgIGBgYGAgYGBgYF+fX1/gH+AgICAgICAgICAgHl5eW9vYmJiZF5jZ19dYWFgXF9kYlttfHp6enp6enp6enp7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7fHx7e3x7fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5/hIiLhoSHhoaEhIODgoGBgYGCgYGBgYKCgYCAgYGBgYGBgYGBgX5+fYCAgICAgICAgICAgICBeXpwXWJlZGJkXmZnZ2BZYmJhY2VfXF1ze3t6enp7e3t7e3t8fHx8fHx8fHt7e3t7e3t7e3t7e3t7fHx8fHx8e3x8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fn19fn5+fn5+fn5+fn5+foCFjIqEhYaGhYODg4SCgYGBgYKBgYGBgoKCgYCBgYGCgICAgIGBf35+gICAgICAgICAgIGBgYF5emxiZGdjYmdmYWBgZGFiZWRjZGNeXGJ1fHt7e3t7e3t7e3x8fHx7e3x8fHx7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/gYeMiYWGhoeFg4SDgoGBgYGBgYKBgoKCg4KBgIGBgYKBgYGCgoF/f36AgICAgICAgIGBgYGBgXp7dGdnZmZkZGZmYF5fYWNlaGRlXmJkYHR8e3t7e3t7fHx8fHx8fHx8fHt7fHt8fHt7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f3+CiYqIhoaIhoWDhIOCgYGBgYGBgoGBgoKCgoGAgYGBgoKBgYKCgX9/f4GBgYGAgYGBgYGBgYGBenptaGNjZ2ZnZWdmZmdiZWRlYmdbYmVgdnx8e3t8fHx8fHx8fHx8e3t8fHx8e3x8fHt7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f39/f4SJioiGiYeFhYSEg4KBgYGBgYGCgYKCgYGBgYGBgYKBgoGBgICBgH9/gYGBgYGBgYGBgYGBgYF7emlpZGNqZmFgZmVjY2NnaWRjYmBiZGJ0fXx8fHx8fHt8fHx8fHx8e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f39+fn9/f39/f39/f3+AhIqMiIeJhoSFhYOCgYGBgYGBgYKBgoGBgYGBgYGBgoKBgYGBgYGAgH+BgYGBgYGBgYGBgYGBgXZzZWRnY2RmZWJlZmdkZmhmZWNgYGNkYHF9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fXx8fX18fHx9fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/fn5+f35+f39/f39/f3+AgICFioyJiIqJhoaDgoKCgYGBgYGBgoGBgoGBgYGBgIGBgYGBgYGCgX+Af35/foCCgoKCgoKCgoKCc3NnZWRkZWlqaGZnZ2NhZmZlZmdmZWVjdX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fH19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gICAgICAgIWLioqJioeHhoSCgoGBgYGBgYKCgYKBgYGBgIGBgoKBgYGBgYGAf4B+dHRzdX1/goCAfn5/gYB0cmdkZWNmaWppZWNlY2BmZGRnZ2JiZWFwfXx8fHx8fHx8fHx8fHx8fHx9fX18fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f39/f39/f4CAgICAgIB/houLiouLh4eHhIOCgYGBgYGBgYKBgoKBgYGBgYKCgYCBgYGBgoCAgH5zc3NzdHV4dXV0dHV2dXVwZmNmZWhoaWdoZ2VmZWJfZGVmY2BiZ3d8fHx8fX19fX18fHx8fH19fX19fX19fXx9fXx8fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gIB/f3+AgICAgICAgICHjIyIi4qHh4eEhIKBgYGBgYGBgoGCgoGBgICBgoGBgYKBgoKCgYCAfnNzc3Nzc3NzdHR0dHNzdW9jY2FnZWhoZ2pmZGVnZmhmY2JlYl5ieX18e3t8fX19fX18fHx9fX19fX19e3x9fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn9/fn5+fn5+fn5/f39/f4CAgH9/gICBgICAgICAgYCAf4CAgYGAgIeLi4iNiYiJhoSFgYGBgYGBgYKCgYKCgYGBgIGCgoGBgYKBgoKBgIB+dHNzc3Nzc3Nzc3Nzc3N1cmdlZWRlamhoZ2ZpaGdjZWViZGNoZGd7eHVzc3R2dnl4dnR0dHZ3d3d2dHR0dXV4d3h4d3d6e3x9fXx9fn5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f35/f39/gH9+fHt7fX58eXl2dnZ5fHx6end2d3l7fXt4hIyMioyHh4iEhYSBgYGBgYGBgoGBgoGBgYGAgYKCgYGBgoGBgoGAgH51c3Nzc3Nzc3Nzc3Nzc3VzaGVnaGVrbGhqZ2lqZ2dnZmRkYmVkbnV0dHNzdHNzc3Nzc3Nzc3Nzc3NzdHNzc3Nzc3Nzc3N0dHV1c3V3eHl7fn59fn98f39/f39/f39/f314fH5+fXx4dXZ3eXd4dnRzc3N0dXRzc3Nzc3NzdHNzc3R0c3R0dHODjI2KiYeIhoOGg4GBgYGBgYGBgYGCgYGAgYGDgoKBgYCBgYGBgICAf3VzdHRzc3Nzc3Nyc3NzdnZpY2hqaGpsZWZpbGhgZmVkY2BkZGZ0dXV1dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHRzdHRzc3Nzc3R2dnV1d3V4fH9+fX9+fHp4dXN0dXV1dHNzc3Nzc3N0dHR0dHR0dHR1dXR0dHV1dHR1dXR1dXV1dIaMjYuIhoeEhIWCgYGBgYGBgYGCgoGAgYCBgYKCgoGBgIGBgYGAgIB/dnNzc3Nzc3Nzc3Nzc3N2dnNnZ2pmaGdmaGhmZGlnY2NnZWVmcHZ1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dHR1dHR0dHR0dHRzdHR0dnV1d3Z0c3R0dHR0dHR0dXV1dXV0dXV1dXV1dXV0dHNzc3N0dHNzdHR0dHR1dXR1iY6MjIqHh4SEhYKBgYGBgYGBgYKCgoGBgICAgoKCgoGBgYGBgYCAgH93c3Nzc3NycnJyc3NzcnZ2dW5kXWNnZWlraGVoZ2dqamlnZXB2dXV1dXV0dHRzdHR0dHR0dHV1dXV1dXV0dHV1dHR1dXV1dXV1dXV1dXR0dHV1dXV1dXV0dHV0dHV1dXV1dXV1dXV1dXV1dXV1dXV0dHNzc3Nzc3N0dHNzc3Nzc3R0dHR0dHWKjoyMiYaGhIeFgoGBgYGBgYGBgoKBgYGBgYGCgYKBgYGBgYKBgYCAf3hzc3Nzc3JycnJyc3NzdnZ3d2liaGhnamtpaGZkZGVmaWhwdXR0dHRzc3JxcnJ0dXV0dHR0dHR0c3NycXFxcXNzdHR0dHR0dHR0dHV0cnJyc3R0dHR0dXV1dXV1dXR0dXR0dHR0dHR0dHR0dHR0c3Nzc3Nzc3Nzc3Nzc3N0dHN0dHR0dHR0dYuOjImGhYWFh4SCgYGBgYGBgYGBgoKCgYGAgIKCgoGBgYGBgYGBgIB/eXNzc3NycXJycnJzc3N3d3d3bGpoZGhpa3Z6a2VmZWhnbXJzdHN0c3JwcHBxcnN1dXR0c3Nzc3JycXBvb29vcHFzc3NycnJyc3R0dHNxcHFyc3R0dHR0dHRzc3Rzc3NzdHR0dHRzdHR0dHR0dHRzdHR0c3NycnFxcnJzc3Nyc3NzdHR0dHN2jZCMh4eFhYSEgoGCgoGBgYGBgYGCgoKBgYGAgYGCgoGBgoKBgYGAf395c3NycnFxcnJycnNzc3d3d3dzc2pnaWloeX99cW51bG5wcXJycnFxcG9wcXFxc3R0c3NycXFxcG9ubm1tbW5ubnBxcnJycnJycnJzcXBvb3BxcnJzc3JxcnJycnJycnJycnJzc3Jzc3Nzc3Nzc3Nzc3Jxb29ubm9vcXJzc3Jyc3NycnNzcnaPj4uHhoWFhYOCgoKBgYGBgYGBgYGBgoGBgYGCgoKBgoGCgoGCgX9/f3hxcHBwcXFycnJyc3Nzd3d2dnd2cnF0c252f352c3hwcHBycnJycXFwcHFxcXJzc3Nzc3JxcXBwb25ubm5ub25vcHBxcXFxcXBwcXJwb25vcHFxcXFxcHBxcXFxcXJycnJycnJycnFxcnFxcnJycnFwb29ubm1ubW5vcXJycnJycnJyc3JxeI+OjYaDg4aEgoOCgoGCgYGBgYKBgYGCgYGBgYKCgoKCgoKBgYKBf4B/d3Bwb3BxcnJyc3Nzc3J2dnZ2dnZ3dnZ1c3l/fnd3d29wcXFxcXFxcHBwcXJycnJzc3JycXBydXBwb29vb29vb29wb3Bvb29vcHBxb29vcHBwcHBvcG9wcHFycXFxcnJycnFxcXFxcXFxcHBwcHBxb29ubm5tbW5tbm9wcXFxcXFxcXFxcXB7j42NhoODhYOCgoKCgYKBgYGBgoGCgYGCgoGCg4KBg4KBgYGAgYF/f392bm9wcHBxcXFxcXBwcHZ2dnZ2dXR0c3NxfYB9fX9zb3BxcXFwcHBwcXFwcXFyd3RxcnJxbomGbnBwb29wcG9vb29vb29vb3BxcXBub3Bwb29wb29wcnJycnFxcXBxcnFwcXFxcHBwcHBwcHBwb29ubm1ubm5ubm9ub3BwcHFxcXFxcXFxcIKRjoqEhIOFhIOCgoGBgoKBgYKBgYGBgYGCgoKCgoKCgYGBgYCBgX9/gHVvb29wcXFxcXBwcHBwdnZ2dXRzcnJycnGAgoCBeXBwcHBvcHBwcHFxcXFwcnCFk3JxcW97nn5ucHBwb3BxcHBvb29wb29vcXFwcG9wcG9vb25vcHFxcHBwb3Bvb3BwcHBwcHBwcHBvb29vb29vbm5tbW1ubm5ub25vb3BvcHBwcHBwcHBwiZCMiISDhIaDg4KCgYGCgoKCgYGBgYCAgYGBgoKBgYGBgYGBgIGBgH+AdG5vb3BxcXFwcG9vcG92dnVzcnFxcXFxcICDg39ycHBwcHBwcHBwcHFxcHBxcXejkHBxcZWffW9wcHFwcHBwcHBwcHBvcHBxcXBwcHFxb29vbm9wcHBvb29vcHBvb3BwcHBwcHBwcHBvb29vbm5ubm5ubW5ubm1ubm9wcG9vb29vb3BzcXWPj4uJg4KFh4ODgoKBgoGCgoKBgYKBgYGBgYGBgYGBgYCAgYGAgYGAf4B0b29vbm9vb29vb29vb3Z1dHNxcXFxcXJygIKCgXRxcXFxcXFxcXFxcXFxcXFyc5yogW97op5+cHFxcXFwcHBwcHFxcXBxcHBwcXBwcHBwcHBwcHBwcHBwcHFxcXBxcXBwcHFwcHFxcHFxcXFxcXJxcnFwcnRycnR0dHR1dnRzdHR0dXd3gpCPi4iDgoaHhISCg4GBgYKCgoGBgoGBgYKBgYGBgYGAgICBgYCBgYB/gHVvb29vb29vb25vb29vdXRzcnJycnJycnKDg4OCdnFycnFxcXJxcnJxcXJycnJxlKubcIOjn35wcXFycXFxcXFxcXFxcXFwcXFxcXFxcnNzcnJyc3V1dHR0dHR0dHV2d3d3d3d3eHd4eHd3eHh4d3Z3dnV2dnZ2d3h6e3x7e3t6enp6enyGkI2LiIODiIeHhYODgoGCgYKBgYGBgYKCgoGBgYGAgYCAgYGAgIGBgH+Ad3FxcXFxcG5ucG9wcG92dHV1c3Nzc3NzdYiDgoN5cnNzcnJyc3Jyc3Nzc3Nzc3KTsaqLlaade3Nzc3Nyc3N0dHV1dXV1dHV3eHd3d3d4eHh3eHh4eXl5eXl4eHl5eXp6e3t7e3t6enp5eXh3d3d1dnV2dnd5enp7fn5+fX1+fn5/f35+gIyQi4qHg4WIi4iEg4SDgYGCgYGBgoGBgoKCgoKAgYGBgYCBgYGAgIGAf4B8enp5eXx5eHh2dXZ2dHl2d3h3d3Z3dnZ6fnx+fnx2dnd3dnV4enh4eHh4eHh4fKmvo7Gtr598e3l5eXh4eXl6enl5eXh4enp5eXh4eHh3dnd3eHh3eHh5eXp7e3p8fH1+fX9/f359e3t7e3p5enl5e3t/foB/fn5/fn19fX5+f35+fn6AjpCNioeEhoqLiIaGhIOBgoKBgYGCgYGCgoKCgoCBgoKBgYGCgYCBgIF/f4B/fn19fX9/f318e3t7eXh4eHh5eXl4eXh5eXl4enp6enp6e3t7fH1+fHx8fHuPq5mhtKSfqYh6e3p4eXh4ent6enp5eXp8fHt6enx8fHp6ent9fHx+fn+AgoGAgYKAgH9/gYGBgIB/f35+fn5/fX1+f4CAf35+f39+fn9/f39/gH+Af4OQjoyHhoWIi4yIh4aFg4GCgYGBgYKBgoKCgoKBgYKDgoGBgYGBgIGBgIB/goOCgoGBgX99f39/f4F6enh4d3h4eHh5eHh5enp5e358enx9fXt8fX19fX19fZmhlaOvn5yjmn5/f319fYCDgoCAf318fXx9fXt9fXx8fH19fX1+gYGChISDgoB/gYGBgH9/f4B/f39/f39+fn9/f39/f35+f3+Af39/gICAf4CAgICAhJCPi4eGhoiLi4mKhYaDgoKCgYGBgoGCgYKBgYGBgoOCgYCAgYGAgIGBgH+ChIKCgICAgH9+fn+AgH9/fn18fX19fYB/fX+Af35/gH9/fn9/gICBgICBgIGBmZuJmLChnZ2dg4CBgH9/f39+f4B/fn5+f39/gYB/f4CBgYCAgYOEgoGCgoGCgH+AgYCBgYGAgH+BgICAf39/gICAgYGBgIGBgYCAgICBgoGBgYCAgYGFjo6MiYaHiYyLi4qGhoOCgoKBgYGCgoOCgoKBgIGBgYKCgICBgYCAgYGAf4KFg4KBgYCAf39+fn+AfX5+fn19fX5/fn9/f35+fn+AgYCAgICAfn9/gICBgX+XpJ2Uo5uZkZ2Ie31+foB+fn5/f35/gIGBgoKDg4KCg4KBgYKDg4OCgYGBgYKBgoKCgYKBgoGBgYGBgoKCgYGCgYKCgoGBgoKBgYKCgoKCgYGBgoKCgoaPkY+KiImKjY6NiYaFgoKCgoKBgYKCg4KCgoGBgYGBgYF/gIGBgYCBgIF/gYWEg4KCgoGCgYCAgIB8fHx7fH18fH9+fn9+fn5+f35+f39/f39/gH5/f4B+hqivpp6ZnZ+mqaaPhYF/f4B/gIF/f39/f3+BgYGCgoCAgYKDg4SDg4ODgoKCgoKCgoKCgoKCgoGCgoKDg4OCg4ODgoKCgYKCgoODg4ODgoKCgoODg4KCh5KTkIuKi4uPj42Lh4SCgoKCgYGBgoKDgoKBgYGBgIGBgICAgYGBgIGAgYCAg4SDg4OEg4ODgoKCgXx9fHx9gn1+f4GCiIGCgoSCgYGDg4GBgYKDgoWGjZqrr6Cbo52fnqKkqquln5SHgYCAgICAgH9/f3+AgICAgH9/gYODhYSEg4SDgoKCg4OCgoOCgoODg4ODg4SDg4KEhYWDg4SEgoKDhIOCg4ODg4OCgoODgoCKlJOPioqMj5GPjYuGg4KCgoKBgYGBgoOCgYGBgIGBgoGBgICBgYGAgYCAgH+BgoODg4SEhIOCgoKCfXx8fn6AgYOAg4OChIaFhoaFhIWFg4ODg4SDhoyfq6mgmZminZ6en52eoaCakIaDg4KDg4ODgoGAgIKCgYOCgYKCg4OEhYWEg4OChISEhIOEhISDg4OEg4ODg4OEg4SDhIWEhISDg4ODgoKCgoKCgoKBgYKCgo+UlI+Njo6RkY6KiISCgoKCgYGBgYGCg4GBgIGBgYGBgYCBgIGBgYCBgICAgIKChIKChIOCg4ODgoJ9fX2AgH+AgoGDg4ODhIaEhIOEhYWDg4GBg4OCgoaPkpSVl5ycnp+emZiTjYiGh4eGhoeHhoaEgoGCg4SDg4ODg4ODhISFhYWDhISFhISEg4KBg4OCg4SEg4KCg4SCg4ODg4OCgoKCgoKCg4OEhIOFhYWFhoaIk5OTkY+Pj5KRjIqIgoKCgoKBgYGBgYKDgoKBgIGBgYGBgICAgYGBgICAgICAhISEgoKCgoGBgoKBgX+AgYOCgICAf4CCgoGDg4KCgYODg4SDg4GDhYSCgYCDiJCVlJCXnZqRioaHiIiHh4eIiIiFhIOBgIGBgoKCg4GCg4SEhYSDg4OEg4OEhIOBgYGCg4OEhISDg4ODg4OEhIODgoSDg4ODhIWFhoeHh4eIiIiJiY6TkpKOj46Rko+LiYeCgoKCgoKBgYGBgoKCgoGBgIGBgYGAgICAgYGAgIGAgICDg4KCgYKCgYGAf4CBhYWFhoOCgYB+fn+BgoSCgYKDhIOCg4ODg4KChISDhIOCg4ybh5CUioSCg4WFhYOEhIWFg4KBgH9/gIB/gIGEg4OEhYWEgoKCgoOCg4OFhIKDhISEhYaGhoaGhoWFhoeHhYaIh4aHiIeGhoaIiYeGhYaGhoeIkZKSkI6QjpGRjImHhYGBgoKCgoGBgYGBgoOBgYGBgYGBgICAgICBgYCAgICAgISEg4KBgoGAgYGAgYKIh4aHhYSCgH99fX6AgH+AgYGBgYGBgoGAgYKDgYKCgoKBgYiHjYOCg4KBgICAf4GAgH+AgH9+gIGBgYKCg4OEg4OEg4OCgoGBgoODg4SEg4SEhIOFhYaFh4eIh4eHh4eHh4eGhoaGh4WFhYaGhISEhIWEhYaSk5GOjo+OkI6JiIeEgoKCgoKCgoGBgIGCgoKCgoKCgYGBgYGAgYGBgICAgYGAgoSDg4KDgoGCgYKDg4iHh4iHhYSCgX5+gICAfn5/f4CBgYGCgoCBhI2DgH+AgIB/f4mRgIGCg4OAf39/gICAgICAgICDg4KDg4ODgoOBgYKCgoOCgYKCgoOCgoSDhISDg4SEhYWFhYaGhoaFhISEhYWEhIWFhYSEhISDhISEhISEipSTkZCQj46NiIaFhIOBgYKCgoKCgYGAgYKCgoKBgoKBgYCBgYCBgYGAgICAgYGAg4OCgoOCgoKBgoOCiImJiYiHhYSDgYKEhIOBgoKCg4SCgoSEgoOJloiEgoSCgn+AjJWCgoGChIKBgYGCgoODgoGDg4SDg4SEg4OCg4KDg4ODg4KCgoKCgoGDhISEhYSFhYWFhIWEhIWFhYWDg4OEhISEhYWFhISEhISEg4ODg4OOlZKQkZGPjYyHhYODg4GBgoKCgoKBgYCBgoOCgYCCgYGBgICAgIGBgYCAgICBgICDhYSEhIODg4SDhIOGh4mIhoWDhIODg4WDgYCDgoWFhISDg4OChI6Zi4OFhISEgoCRmYaCgoKEhIOCgoGBhIWEg4ODgoKDhISDg4ODg4SFhISDg4KCgoKCgoSEhYSFhYWFhYODhYWFhYaFhoWEhIWEhYWGhYWFhIWEhISDhIODhJGUk5KSj4yMioWEhIODgYGCg4KCgoKBgYGCg4KBgYKBgYGBgICBgIGBgH+AgIGAgYaGhoaGhoaHh4aGhYSDhYaCgIGBgYGHgoB+f4GBkIyDgX9+fXx9jJyOgIKBgYKChZSUjIGCgYKDg4KCgYKDhYODg4KDg4OEgoKEhIOEhIWEg4OCgoKCgYKCg4ODg4SFhYWFhIOEhYWGhYWEhISEhIOEhIWFhYWFhIODhIOEg4KGlJSSlJKPjYyIg4SEg4KBgoODgoKDg4GBgoKBgoKCgYGCgYGBgYCAgYGAgICAgICAhYWFhYaGh4aGhoWGg4ODg4GAgoKCgYKAf35/f4GWl4mAfX19fXuBmIyAg4GBgYCPlIyQgYKBgoKCgYKDgoODgoOCgoKCg4OBg4SDg4ODg4OEhIKCgoKDgoKDg4ODhIWEhISEg4OEhIODg4OEhIODg4ODg4SDg4ODg4KDg4KDgouUk5KTko2NioaDhIOEgYGCg4ODg4ODgoGBgoGCgoKCgoKBgYGBgICBgYCAf4CAgICDhISFhYSFhYWEhIWCg4KDgoKDg4OBgICAgICAgZWfin5+gH2Hi36EhIOEgoODgo6JhYyCgoOCgoKCg4ODgoODg4KCgoODg4KDg4KCg4KDg4WEg4ODg4SDg4SEhISEhYWEhIWEg4SEg4OEhISEhISEg4SEhYSDg4SEhIODgoKDkJSSkpKPi4yIhoSFg4OBgYKDg4ODg4OCgYGCgoKCgoKDgoCBgoGAgICAgIB/gICAgISDhYWEhYWFhYSFhYOEhIWDg4SEhIKCgoOCgoSBkaGKf4yFfYaJgH6FhYWEhYJ/fn19gIKEg4ODg4OEg4ODhISEg4OEhISEg4SEhIOEg4OFhoWFhYSFhYWFhYSFhoWGhoWFhYWFhYWFhYWGhoWGhoaFhoaGh4aFhYWFg4SEhIeTk5OSkoyLiIWGhYWCgoGBgoODg4OCg4KBgYKDg4ODgoKBgIGAgICAgICAgH+AgICAhYWFhYWGh4eGhYWFhISFhYSEhISEg4ODg4OEhYOJkYOEi4WCgYF+fYGHhoOAfn5/f39/f4OEg4OEhISEhISEhISEhISFhYWEhYSGhYWFhYaGhoWGhYWGhYWHhoaGhoaFhIWFhYWFhIWGhoaHhoaGhoaHh4iIiIaFhYaFhYWGjZSTkpGQi4qHhoeGhIGCgYKDg4ODg4KDgoGBgoODg4KAgYGBgICAgICAgICAf4CAgICHh4eGhoeHiIeHhoaEg4ODhIODg4OEg4ODg4OEhISEgYKCgYmBf359foWBf39/f39/f36AgISFhIWGhoaFhYWGhoeHhoaFhoWFhoeHh4iGh4eGhoaHhoeGhoeHh4aGhYSDhIWFhoWFhYaGhoeHhoaGhoeHh4eIiIeGhoaHh4eRlJORkZCLiYiFhoSDgoKBgoODg4ODgoKDgoKCgoOCgYCBgICBgICAgIGAgIB/gICAf4aHiIeHh4eIiYmIiIODgoKDgoSEhIWEg4KCg4OEhIOBgICAhIR/fn5/gH9/f39/gIB/f4B/f4WFhoiIiIeHh4eIh4iHiIiIhoaHiImJiYmIh4aHh4eJiIaHh4eHhoeFhIOEhYaGhYWFhoaGh4eFhoeGh4aHh4eHh4eHh4eFh5OTkY+RkIuHhoWFhIKCgYGCg4ODg4ODgoKCgoGCg4KCgIGBgYCAgICAgICAf3+AgYB/hoiIiIiHh4iJiYmIg4KCg4ODhIWHh4aFg4OFhISEg4GAgIGMiYGAgYKCgYGBgYB/gH9/fnt6gIaHiIqKiYmJiImJiYmKi4qIiIiJiYuLioqIh4eIiImHh4iIh4iGh4aEg4OFh4eHhoWFhISEhYWEhYWGhISEhYWFhoWGhYOJlJOQj5COioaFhoWDgYGCgoKDg4ODgoKCgoKCgoKCgYGBgYGBgYCAgICAgIB/gICBgH+GiYiIiYeIiImJiIiEgoKDg4KDhImKh4aEhIWEg4OCgICAhYSCgoKCgoKCgH9+fX19fX5+fHt8g4eJi4uKiomIiIqJiImLiomJiImIioqJi4mHhoaGh4WGiIiJiIaGh4SDgoSIiIiIh4WCgoGDg4KDg4SCgYKDgoGEg4SDgY6TkpCPj4uJhYWGhIKBgYGBgoODg4OCgoKCgoKCgoGBgYGBgIGAgICAgICAgH+AgIGAf4WIh4eHhoeIiIiHh4SCg4OCgoOFiYqJh4WHhYSFhYKAgYOEgoOCgoKDgX59fX5+fn5+fn1+fX19g4eJioqHh4WGh4eHh4iHh4mHh4aIh4eJiYODhIOFhISFhYeIiIaFg4OCg4WHhoeGhoSCgoOEgoOEhIKBgoGBgYODhIOEkZKQjo+Oi4eEhoaEgoGAgYGDg4ODg4KCgoKCgoKCgYGBgIGBgYCAgIB/gIGAf39/gIB/hYaGhYaGhoeHiIeGgoKEhIOChYeIi4qGhIaEgoaGgoKEhIODg4OCgoF9fH1/gH9+fn59fH19fHl8g4iIhoSDgoKDhIaFhYODhYSEhISEhIWEgoKCgoSEgYKDg4WGhYSCgYGCgoODhYSEhIWEhIaEg4SFg4KDgYKDg4SFhIeSkY+NkIyJhoSFhIWCgYCBgYODg4ODgoKCgoKCgoKBgYGBgYGAgICAf4CAgYB/gICAgICDhIWEhIWFhoeHh4aAgYGFg4OEhYSHiIWCgICAgX9/gYODg4ODgoKAfX1/gICBf31+fn18fX17enqBkISEgoGBgIGAgoKBf36BgYGCgYOBgoGCgoKBg4SAf4CAgYKCgICAgICBgYGDgYGChIODhYSCg4SDgoKBgoSDhYWGi5ORj4+Pi4iFhYODhIGAgYGBgoODg4KCgoKCgoKCgoGBgYCBgYCBgH9/gIGBgICAgH+AgIKCg4OChIOEhYWGhn+BfoCBgICAf4GDgn9+fn5+fX+Cg4OCg4KDgn59fn+AgIGAfn19fX1+fXx6eXyDgoKBf39/f35/gIB+fYB/foCAgX+AgIF/f4CBgX59fX+AgYB/foCAgICAgICAf4CCgICCgYGDgYGAgYGBgYKEg4aPkpCOj42Kh4eGg4ODgYGBgYGCg4ODgoKCgoKCgoOCgYGCgYGBgICAgH+AgICAgICAf39/gYKDhIGCgoOCg4SFgIB/fH19fn19foCAf31/fn1+gIODgoKCgYF/fX1+f4CAgH9+fX19fHt7e3p6enqAgIB/f39+fn1/f35/gH9+f3+Af4CAf35+fn9/fn18fn+Af35+f3+Af39/f4B/f39+f4CBf4B+f39/gH9+f4B/hZKSj46PjIuHiYWEg4KBgYGBgYKDg4ODg4OCgoKDg4KAgYKBgYGAgICAf3+AgIB/gIF/f36BgYSEgYKBg4OCg4OBgH98fn9+fX6Af4B/foF/f4CBhIOCgYB/f359fn5/gICAfn19fXx7e3x6enl5eXuAgH+AgH9/fn9/foCAf35/f4CAgoB/fH5+f35+fXx/f4B/fn5/f4B/f35/f4CAfn2Af39+f35/f35+fn19fX2Fk5KOjIuKiImIhISEgoKCgYGBgoOCgoOCgoODg4ODgYCBgYGBgYCAf39/f4CAgICAgIB/foCBhIOCgYGDhISDhICBgICBgIGAgYKCgoGBgoCBg4ODgYGBgYCAfn19fn5+f359fX19fXx8fHt6eXl5eH2BgICBgYGAgIB/f4F/gICAgYGCgoB+gH5/fn5+foGAgYF/f39/gICAf39/gYB+f3+Afn9/fn+Af31+fn17fIaTkYyLioeHioiGhoSDgoGBgYGCg4ODg4OCg4OCgoKBgICBgYGAgH9/f39/gICAgICAgH9+fn+BgYGAgISGh4aHgoSDhYOBg4ODhYSEhISEg4ODhIKCgoKCgX9+fX19fn6AfX19fX19fX19e3p6eXl5eoGCgoKFg4GCg4GAgoCCgYGDgoODgYGCgIGAf4CBg4GEgoCAgYCBgYCAgYCCgn+BgIF/gIB/gICAfn9/fnx8ipSQiomIiIiJiIaGhoSCgoGBgoKDg4ODg4KDg4KCgYCAgICBgYGAf39/f4CAgICAgIGBf359fn5/f39+g4aHh4iChoSFg4SFhIWGhYaGhoWGhYGBg4ODgoKAfX19fX19fn59fX19fX18fX18e3l5eXh4fYODhIWCgYSDgoKDhYeCg4SDgYKCg4OCgoKCgYKFg4iFgoGCgYKDgYGBgYSDgoOCgYKCgICBgIF/gIGAf36Ok4yHiIaIh4aGhYaGhIKDgoGCgoODg4ODg4OCgYGBgH+AgYCBgYB/gH9/gICBgH+AgYB/fn19fX5+f36Ag4SHh4SGhoaFhoaHh4aHh4iHh4eGf32AgICCgX59fX19fX19fX19fX18fH5+fnx7eXh3eHl5gIODf4ONhIOEhISXl4ODhIF9f4GCgoGCgYKBg4aIjIWDgoKBhIKEg4KDhYSEhYODg4OCg4OCgoKCg4OCgpGQi4iJh4mHhoaEhoaFhISDgYKCg4ODg4ODgoGBgYCAgICBgIGBgH9/fn+AgICAf4CAgH9/fn1+fn+Bf4CCgYWFhYeGh4eGh4eIhoeHh4eGh4V+fX18fX9+fX19fX19fX19fX19fXx7iJKCe3x6fIZ5eXl8gYF+iJaEg4OEhJSTgIGBf39/fn6Fi4B/gICEhpCJhYSCgoGFhYuDgYKFhYaGhIOFhIOEhIODhIOEhISIko+MiYiIiYeHh4WGhYSFhIKBgoKDg4ODg4OCgYGBgYB/gICAgICAf39/f4CAgICAgYGBf39/f4CAgIGBgYGBg4OGh4aGh4aGiIeGhoaFhIOFhH59fHx8fX18fH19fX19fX19fX18fH+RlZaDe3qElHx5enp7fH+Bg4GCgYOCgH59fn57iJF8fI6Wf31/f4KGioWDg4SDgYONiX99f4OEhYWDhYWFhIWFg4SFhYaEhI6Rj4yKioyJiImHhYWFg4ODgYGCgoKDhIODgoGBgICBgICAgYGAgIB/f3+AgIB/gICAgX5+f4GBgoKCgoODgoOCgoWGhISFhYSGhIOEg4KBgIKAfn19fHx9fXx8fH18fH18fX19fHx8e4uRl4x6e3yAenl6e3x5eX19f4B/gH98e3t+fn2ClZF/hIh9fH5/goR8fIGChIKAf4eDfYKBf4KCgIODhISEhISChIOEhYGEkZGOi4yMjoqJiYWFhYODg4KBgoODgoKDg4KCgYGAgIGAgICAgICAgH+Af3+Af357gICBenyAgoKDhYODhYWFhYODg4SCgYKDgoODgoGBgIB/gX5+fX19fHx8fHx8fHx8fHx8fHx9fHx8fn6Kgnt6e3p4ent7fH18fn5+f35+fX19fH+BgH2Gj4F9fYJ+f36Agnx8gH+CgIKAfnx7ioJ9gH9+gYCAgYKBgoCAgIGAf4uUkIyMjo6NiIiHhYWFhIOCgoKCg4OCgoODgYGBgICAgICAgH9+fXx7fHx9f3+AgHx6gYF4e4CCgYOFhIOFhIaGhISAhpSIgIKBgYGBgH9/f39/fn5+gHx8fHx8fHx8fHx8fHx9fHx8fHx9fHl6e3t4eHl7enp8goCBf3+BfX9+f359gIKCgICAgX+CkYF/f4CAfoB+fn9+gIGBfX19e319fXx9fHx9gH+AgH6Afn6ClJKNjI2Oj4qFhoaFhISFg4KDgoODg4OCgoGBgYGAgICBgICAf4CAf39/fXt6fICAgHh+gXd7gIF/goKCgoKEhoeGhn6IlYp+gIGAgIB/foB+f39/fn+Bfnx7e3x8fHx8fHx8fH59fHt8fHx8e3x8fHp6eXt8en2Fg4OAgYF+gH5/gH6FgoF+gH9+foCFhoKAfn6Dhn99fH5/gIGAf39+fX19fX57fH1/f3+AfX9+f4yRjo2Njo2Nh4SGhoWEhIODg4OCg4ODg4KBgYGBgYCAgYGAgYGBgYGAgH9/f397en9/e3mAd3p/f31/f3+Af4KEhoaFf3+FgX5/gIB/gH5+f35/gIB/f4B/f319fHx9fn18fH19fX19fH58fXx7fXx8ent6fH19f4aFg4CAgH1+fX5/foyEgYd+fXx8f36CgX99fX19gXx7fXx+gYSDgYB+fn5+fXx+f399foB+f36Eko2NjI+NjIqGhIWEhISDg4OCg4KDgoOCgYGBgYGAgYGBgYB/fXx8fH1+f39/f397e399d352eH59fH18fX5+gYGCg4B6fn58fn6Af35/f35/fn+AgH+AgH9/fn9+fn5+fn1+fn99fH59fn19fXt8fHx6e3p9f4CAg4OCf35/fHx8fXx8gYN+jH58e3t9fn1+fn17e3t9fHt7e3uAhoSChIOCf4B+f4KCgn9/goJ/gIuQjY2MjYuKiISEhIODg4ODgoKCgoKCgoKBgYGAgoGBgYKCf3+AgIB/fn18fH5/fn55fX52e3Z4fXx8fHt9fX6BgICAf31/f31+f39/foB/f39/f3+Af4GBgH99gH9/fn9+fn5/f3yCfX59fX17e319fHp8fH6AgoGAgIB9fX18fHx8fH18fnt/fnt7e3x8fH18e3t7e3x8enp9en6CfoKEhIOBgoGFhoWFhoaHhYGEkY+Ni4qLh4eFgoOEhISEg4KCgYGCgoKBgoGBgYGBgoGBgoKAgYKBgYCAgH9+e3x+fnx6fnh5dnd8fHx7e318f4GAf35/foB/f35/f35/gH9/f3+Af39/gYKAfn6BgIB/f39/f39+fYN8fH19fH99fX19e3x+fn9/fn5/fnx8fXx8fXx9fnt8e3x8fHx9fH18fXx9fHt7e3x5e3x7e316fX5+f4CAg4eJiYmKiYqJhYiSj4yJioeFhYOCgoOEhIOCgoKBgYKBgYKBgYGBgYKCgoGCgoCAgX98e3p6eXt9enx+fnl8eXh4dHx8fHx8fHx+gH9/f39/gIB/fn5+fX+AgH9/f3+Af4CDgoB/gIGAgIB/f4CBf358enx9fX59fX5+jIZ9fX57e4ODfX5+fX18fX19fX19fH17fXx9fX58fn19fX18e3t6fHt8fHt6e3t6enp7fn6DhYiHiIqLi4uJjJGQjoqIhoWEgoKCgoODg4OBgYGBgYGBgYGBgYGCgoOCgYKBgIGBf3+Af356eHl5en5+e3l6eH5zfHx8e3x8fH5+fn5/gH+AgIB/fn9+gIF/f4B/gIGAgoSEgYCAgYGAgX+AgYKBf39+f31+gH57foGSjHx9f4qAjYx+fn19fX5+fX59fHx8fn18fXx9fX1+fX1+fnx7e3t8fH18e3p7e3l6enh5e35/g4OEh4mKiImOkI6MiYmFhISCgYKCgoKCgoGCgoKBgYGCgYKCgoGCgoKBgoKAgYGAfoCAf39+e3p5e319eHx6f3KBfXt7fXx8fn59fYGCf4GBgX9/gH+AgX+AgIGCgYGFg4SCgYGCgYKCgICBg4KAf4F/fX6Afnx/f4mCf36CkYSEg4F/fn18jYd9fX59fXx+fnx9fXx9fX5+fX5/fH19e3x9fnx8e3x9enp5eXl5e3t+foCBg4eEiI+Oi4uHhYSEhIKBgoKCgoGBgYGCgoKBgoKBgoKCgoKCgoGCgn+AgIB+f39/fn5/ent5fX16enp9cX6Cent9fX19fXp4f4KAgYKCgICBgYGBgICBgoKCgoaFhIKBgYGBg4F/gIKEgX9+gYB9foF+fX5/gIB9fn+EgH5+f31+fX2KhX1+f31+foB+fH18fH5+fn99f4B9fX18fX9/fHx7fH17e3t6enp7e3x9fn6Ag4CJjouMiIWFhYSEgoKCgoKCgYGBgoKBgoKCgoKCgoGBgoKBgYKCf4CAgH9/f39+fn59eXp6fXx5d3t0e4d8dHd9fn17e3Z2fYCBg4KBgYKCgoKBgYGDg4OChYaEg4GAgIGDgX+AgYSBfn6Af35+gH59fn6AgX+Bf3+Af39/gH99f39/f3+Afn9/gH58fX18fn5+foF/gH2CgHx9gIB9e319fXx8fHt8e3t7fHt8fH19fIqLiYiGhoWFhISDgYKBg4KAgIGCg4KCgoOCgoKCgoGCgoGBg4J/gIGAf39/fn5+fn57enp8fHt2e3R3f352cnt+fnt4dnd8gIGCgoKBgoODg4OCgoODhIOFhoOCgX9/gIOBgICAg4F+foB/fX+AfX1+foCAf4J/gYGAgICBgH1/f3+AgICAgIB/fnx9fX19fn5+gn2AfoKAfX6AgX98fn59fX17fH58fXx8fHt8e3x+ioeHhYaIhYSFhIKCgoGDgYCAgoKDgoKCg4ODg4KBgYGBgYGCgH6AgYB/fn5+fn5+fn56e3p9goN9dXF6fHpxen59eXh0dICAgoKCg4KDhYOEg4KDhISEhIWEgYGAgH6AgoB+f36Bf35+f4B9foB9fX1+gH9/gYCBgYCAgIGBfn6Af4GAf4CAgH9+fX19fnx+fn19gYR/gH9+f4GBf31/f319fn1+fn1+fHt8enx7eoCIg4SEhYSEhIWDgYKBgYKBgICCgoOBgoOEg4SDg4KBgYKBgYOAf4CBf35+fn5+fX5+fnt7en6Jh354cnl9f3F6eHt4eXV1fYKDgYODg4OFhIWDg4OEg4OEhIOBgH+Af4CBfn19fn9+fn5+gH19f3x9fX6Af4CAgIKAgIGAg4KAf4B+gIF+gIGAgH9+fn5+fn1/fn6FhYGBgH+Ag4F/foGAf35/f4B/fn17ent6fHt6goWAg4KCgoKCg4GBgYCAgoGAgIKCg4KBg4SDhIKEgoGBgoGCgoB+gIF/fn1+fn5+fX59fXp7fIWEe3tzeXt8cHd1dnd5dXR6hISBhISDhIWFhoSDg4SEgoODgoCBf39/f4B9fX1+f31+f39/fn1+fH19foF/f4B/gIB/gICDgoGAf36AgH+AgYCBgH9/f39/f4B/gIGCgoKBf4CDgn9/g4J/f4B/gX+Af3x6fHp8e3yCgH+Cf3+BgIKCgYF/f3+BgH6BgoKDgYGDg4KEgoSCgYGBf4GCgH6AgH9/fX5+fX19fn19e3t6gH94fHZ5enxxdHh3dnh1cnmFhYKEhIKEhYWGhISChIOBg4GAgIF/f4B/gHx9fX6AfX5/f39+fX98fn5+gX+BgH9+f4B/gYOCg4B/f4GBgIKBgYGAgIGAgIB/gIGAgIKDgYF/gISAfYGDhICAgX+BgYKBfXp7e3x8fH9+f4B8f399fYGAgH59fX9/foKBgYKBgIKCgoKBg4KCgYB/gYKAfn9/fn99fX1+fX19fX19ent7fHZ9eXh6enJ1eXl2d3dzdYaFg4WEgoSEhYSEg4GDgoGDgX+AgX5/gH6AfX19foB+f4B+fn99f3x/f3+BgIF/f3x+gH6AgYKDgYCAgYOEgoGAgYB/gYCAgYGAgYGBg4OBgX+Ag4B+goOEgICCgYKChIJ+e3t8fHx8fX1+fXp+fX14fn9/fHx8fn5+gYCBgYCAgoGBgYGDgoGBf4CAgoB9fn19f319fX59fH19fX16e3p8dnx6d3t4cnZ5e3Z2dnN0hoSEhYSChISFg4ODgYOBgYOBgIGBfX+BfoF9fX1/f39/gH5+f359fYB/gIGBgX9+fH5/fn5/gYJ/gYGCg4eFgX9/fn6Af4CAgYGAgIKCgYCAfoCCf3+BgoOBgYOCg4OFg399fX18e3x8eXp7en55e3l4f357fHt+fX1/f4F/gH6BgICAgoOCgYF/gIGBf31+fH1+fX19fX18fn58fXx5e3x4enx3endzeHd6c3Z2c3SGhISGg4KDhISDgoKCg4GCgoGAgYF9gIB+gH1+fX5/gICAf39/f3x/f3+BgIGAf359f39+fn+BgH2AgIGDg4N/f359fn5/f4CAgX9/gYKBgH9+f4F+f4CCgoCBg4KEhIaEgH5+fHx8fHp5dnl5enl2eXZ+fHt7e359e399gH99fX9/f3+BgoGBgX5/gYF+fX18fX19fX19fXx+jYF8fXl7e3p5fHd4eHR1dXhyd3d0doaEhIWEg4ODg4OCgYKDgoGDgn+Bf35/fn+AfX19fH6AgIB/f39/fIB/f4GAgYCAf3yAf35/foB/fX5+gYGCgn5/fn1+fn5+f3+Af32AgIB+fn5/gX5+gIKCf4KDgoOEh4SAgH58fXx8e3x1eXl4eHh5d3t8e3t7foV9fn1/ent+fn59foGAgIGAfX6BgH59fXx9fX19fX18e32Dgnx8ent7e3p7d3Z4dXJzdnB4eXJ4hYWFhYOEhIOChIKBgYKBgIKBgIF/fn5+foB+fX58foCAgICAgIB8gH6AgH+BgIB/fYF/fn9/f359fX6AgYKBfn9+fn59fX5/fn9+fH6Af35+fn+Cfn6AgIF+gYODg4OGhICBfnx9fHx7fHh3e3h1eXd3eXx6e3t9kod9fH13en1+fn19f35+gH98foB/fn19fH19fX19fHt8ent9enp4e3x6ent4dHh1cXJ0cHh4cXmEhYWFg4SDgoODgoGBgoKAgYGAgIB9fn5/gH18fn1/gIGAgICAgHx/f4B+f4GAf39+gX9+f39+fX18f4CAgIB+f35+f318fn9/f358fYB/fn1+gIJ/foCAf36ChIKCg4WFgoJ+fXx7e3x8eXd8eXd4d3d4e3t7e3yFiX17end6fH19fHx9fX1/fnx9fn59fXx8fX5+fX18fHt6enx7e3p5enp7enhzd3VxcXNveHdxe4WGhYWDhYKBg4OBgoGBgoCBgICBgH5/fn9/fXx+fYCBgoGAgIGBfX6Af35/gX+Af3+BgH9/f319fH1/gICAgH9/f35/fXx+f39/f319f39+fn6CgYF/gIB/foGDgoKEg4SCgn5+fHx6fHt7eXt6d3N2d3h5e3p7eXp/fnt7d3p8fXx8fH59fH19fH19fXx8fX19fX99fXx9e3l7fHx7enp6enp6eHN2dXBwcm93dnJ7hYaEhYOEgoGDgoKBgYGCgYKBgYGAf4B/f399fX9+gICBgYJ/goF9foF+fn+Bf4B/gIJ/gIB+fH58f3+BgICAf4B/f4B+fX5+f4B/f39/gH9/f4J/gICAgIB/gYGAgISBgoKAf39+f3x9fn56fYV+dHx9enp6enx5eXp6hoV3eXx8fHx8fXx8fHx8fX19fHx9fX19fn19fX16eX18fH16enp6enp5c3V1b29xb3d0c3yFhoOEgoOCgYKBgoKCgYKBgoCCgYCAgICAgH59gH+Af4GCgn+CgX+AgX5/gYB/f4CAgn+Bf319f35/f4KAgICAgIB/gIB+fn1/gH9/gIB/f39/gH+AgICAgH+AgYCBgYGCgYCAf39/fn1/fnuBk416fH18e315e3p6eHqBgXh5e3x8fXx8fHx8fHx9fX18fH18fn1+fn59fHp8fHt8fXt5enp6eXl0dXVvb3Fwd3N0fYWGg4OCg4KAgYCCg4KAgYGBgYKBgYCAgIGAfn6Af4GAgYKCgIKCgICCfoCBgX9/gX+BgIF/fH6Af3+AgoCAgICAf3+AgH9+fX6Afn2AgIB/f3+AgICAgYCAf4CAgYCBgYKCgICAf39/fX5+fIGGiXx8fnt7fnl6e3p7j393d3l7fHt9fHx8fHt9fH19fX18fXx+fn5/f358enx9e3x9e3l6e3p5eXN0dW5zcXB4cnV6hYaDg4KDgoCAgIKCgYCCgYKBgoGBgYKAgYF/fn9/gYGCgYKBg4OAgYJ/gYGBf4CAgIB/gX99f4F/gICBgICAf4B+gICAf359foB+fn+Af39/gH9/gICBf4CBgH+BgIGCgoKAgICAgIB9foB9gIOCe35+e3x9e3p8fHuHenh4eXx8fH17fHx9fX18fH19fn19fX5+f3+Af317fH18fHx7enl7e3l5c3J1bnZycHhxdXaFhYOEg4KCgICBgoF/gIKCgoKDgYGDgoCCgYB/gICCgoKBg4KEhICBgX6BgoF/gICAgH+Cf36AgYCCf4B/gIB/gH+AgIB/fn2Af35/f4B/gH+AgH+AgYGAgICAgIGAgYGBgYGAgYCAgH9/gH5/fX59fn57fXx9fHx8eHh1eHh5e3x8fXx8fHx8fX5/f39/fn19fn9/gIGAf3x9fHx9e3p7eXp8eHpzcnVud3FxenF2d4WFg4SDg4KBgoKDgICCgYSDg4SBgYOBgoOCgYCAgIKDgoCCgoSDf4GAfoKDgICBgICAf4CAf4GBgIKAf4CBgH9/gICAgIB/f4CAgH+AgICAgIB/f4CBgYCAgICAgYGAgoOCgoCCgYGBgYB/gIB/gId+fnx7fXx7fX94d3Z5eXp7fXx8fXt8fH19fn5/gIGAfn1+gICAgoGAfH59fX58d3t6ent5eXNxdW53cHV6cXZ5hYWCg4KDg4KChISAgIOBhoODg4GChICEg4KCgICCgoSBgYKBhIJ/gIB/gYOCgYGBgYCAf4GBgYGAg4B/gIOCf35/goGAgH9+gYCBf4CAgYCBgYCAgIKBgYKBgX+BgYGBgoOCgoOBg4OCgYCBgH9/hH19fXx/fXt9f3p5dnp4eXt7fH19e3x9fX19fn+AgYGAgH+AgICDg4B9f35+fn15eXt6enp5c3J0b3dxd3lzd3uFgoKCgoOEgoOEg4CAg4OGg4ODgoKEgYSDgYOAgIKBhIGCgoGCgX6AgICCgYKBgYKCgIGAgICCgoGEgH6Bg4J/f4CDgoCBf4CCg4KAgYKBg4KDgoGBg4KChIGAgYOBgYKEg4KEhIODhIODgYGBgoCCf4B/fYB8enx/e3t3fHl5eXt6fX59fHx8fH1+foCBgYCAgIGBgYSEgH2Af39/f357e3t6e3p0cHhxeXR2eHR3e4SCg4KDg4SChIODgYKDhIaEgoOCg4SBhIOBg4CBg4KCgoKCgYKAf4GAgIKBgoGBgoKBgIGBgYKCgoOAfoGDgX+AgYSEgYN/goKBg4GCgoGDg4OEgIKEgoOCgoGCgoOBg4SDhISEhISFg4SCgYOCgYOBgYGAgH58fIB9fHh8eXp5enx9f3x7fHx9fX18fICAgICAgYGBgYKBfoGAgICAf3t7e3p6enVweHd5dnV8dXZ8gICDgoODg4OEhISAgoOGhYWDg4KDhIKEhYKCgYKDg4GCgYJ/gYB+gYCBgYKDgoKCgoGAgYKCg4KCg4B/gYOCgICChIODgoGCgoGDgoKDg4SDg4SAgoSDg4OBgX+Bg4KDhYKEhISEhISDhISChIOEhIKBgoGBgHt9gX58eXx6enp9fHyBfXp8fH19fHp7fn5+gIB/gYGAgICAgIKBgIB/fX18fH18dnJ2eHh2dH92dX2Hh4OChIWDg4SFhICChYWEhIOCg4SEgYSFg4KCgoODgYOCgoCCgH2AgIGCg4KCgoKEgoCCgoOEgoKBgICBg4KAgYOFhIOCg4CCgoOCg4ODhIOEg4CCg4KEg4KCf4OBgoSEgoSDhISEhIOEhIOEg4WEg4ODgoKAe4CBf3x8fXp6fH1/fX9/fHx6fH59fH19fn5/f39/gICAgH9+foCBgICAfnx9fn5/fn18fHh2f3Z3f4SHg4KDhoODhIaEgYKFhoWEhIODhISChIWFgoKDg4SCg4KDgoKBfoCAgoKDgoODg4SDgYKCg4OCg4GCgYGDgn+ChISDg4KEf4KEg4ODgoSEg4OCgIOEg4SDg4KCg4KChIOCg4OEhISEhIWEg4OEhYSFhIOBgoB9gYKAfXx8e3x8gH19foB+fn1/fnx8fH19fn5/fn+BgYGBgH99fX6BgYB+fn1+fX59fX5+f3+AfH2AgYKCg4OFg4SDhoSBgoiHhYSDgoSEhYGFhYWDg4SDhIODgoOCg4F+gYGDg4SCg4OEhIOCg4KEg4ODgoKDgYOCf4KDg4ODgoOAgoWDg4ODhIODhIOBgoSEhYOCgoODgoGEg4GDg4SEg4SEhYSEhIWFhYWEg4ODf36BhIB9fXx8fHx/gX5/fn9/fX99e3x9fX19fX5+f4CBgIGBgH59fH6Cf39+fn5+fX1/f39/gICAf4CEhIODg4WDhIOFf36CiouFhYSDgoSFgYaGhoOEhISEhIODg4OEgn+BgYODhYSFhIWEg4KEhISFhIODgoSDhYKBhISFhYaEgoCDh4SDg4OFhIWFhIGEg4OHgoOCg4GCgYSDgoODhIODhIWEhYWHh4aHhYSEhYSBf4GDf35+fH5+fX+BgH9+fHx/f358enx9fX19fX5+fn9/gIGBf319fIB/gH5+fn5+f3+BgYGBgYKAgYWFhIOEhIKEg4aAgoWFiomEhISEhYWCh4aGhIWEhIWEhYSEg4SDgYKCg4OEhIaEhYSDg4SEg3yDhHuBhHd5g4F9hH5+cnWDgoF2foOEgH2BdYF6hH9/f36EhIKDgoKBg4SDhISFg4SFhoSFhn2EeXx+f4N7hYOBhIOAf31+f31+gYOBfXt/fX6Afn18fHx9fX19fH19f4B/gYJ/fX18f4GBgICAgH+BgYGBgYKDg4KChoSEhIWEgYOEhYOEhYSKiIWFhYOFhYSGhoaDhIWFhYWEhYWEhIWCgoOEhYWFhoSFhIOEhYWCaICFanx7cXF8gXOGc3R0fYKDdXNxg4ZzcHVyc3SDdnt9dYF/goOBgnZ5hYCDgIR/hYSChYWCaHpyc3N8gHKBhH6Dg32BfX5/fX6Cg4J8f4F9f4B9fXx8fHx9fHx8fn1+gX+BgX99fX2AgYKBgYGBgIGBgYKBgoKCgoSHhIWEhYSBgoSGhoOFg4aIhoaFg4aGhoeGh4OFhYaFg4KFhoSFhYODg4SEhoaGhIaEg4SFhn1xe4FweXZ+g3+CbnlwdXN8dnl5hnKEg3B2eHF2dHR1cnN0dml/gG5yb3R2bnVsd216c26Ah3ltfXJzdnN2bW53bHB5bHV+f398foGAgX2Af32Af4B/fX18fHx9fH1+f32Af4CAfnx/foCBgYCBgICAgYCAgIKDgoKEhYeGhoCChYODhYeGg4WFhYaHh4SDhoaIiYaHhIWGiIeEg4WGhYWEhIOFhIKFhoaFhoWEhoWHdnB0e3BydX+HhYNtdW92b3x1coR5eYd4cXR3bndod3pucHaCcoN+b3p5eW1vbnpvb2x3fXiGcHF6cHJ0ZoF1fm57eXNveX+Af31+gYB/e39+fIB+gIB+foCAgYB+fn9/foF/gH9+fYB9f4CBgIB+fn+BgH9+goOCgoSFh4eEfoeEg4OFh4aEhoWFhoaIhISGh4iIhoeEhoaLiYWEhoeHhYOFhIWEgoWFhYWGhYWGhYZxdXByc29zenl+hHSIdHV+iHZugnKEhnluanJ/cW1zd3x/dXR8hH54cXV3bnl1enF2eHV6eYRyaW95eHBreXN6b3p3dnZwgYB/fn5/f396fn18f31/f359gIGDg4CCg4GBhIKBf4GCgH1/f4F+f35+f4GAfn6BgoCAgoSHhoODhoSFhYaHhoWFhYWHhoiFhYaFh4eFhoSGhomIhYSJi4iGhIaFhoWDhYWEhoaGhoaFg3iLeXKIentwcIWEeIV4eWtzfnl7a3KDh4N6fG16eXl0fYB2bm+AgG90fHV3cXl9fW1+dW+DhYZ6gHJye3x1cG96a3N8bnaCgYF+fn99fXt9e3x9fH9/fn1/f4KCf4GDgYGDgYB/gICAfn9+f31/fn1/gH58fYGAfn6Ag4iFhoOFhYWFhoeFhYWFhYeHiIaEhoWHhoaFhIWFhIWFhomKh4WEhoWGhoWGhoSGhoaGhoWGh4eHhoaEhoWGh4iHhYeGhoOHhoWFg4SFhoWGhIaEg4SEhoSEgYODhIOFhIWEhYSGg4WGhYWEhIWHhoSEhYaFhX14hYOEhIOCgX5/fnt8e357fHx9f399fH9+gYB9f4F/f4GAfn5+gH5+f35+fX99fX5/fHt8f358fH+BiYaFhIaGhoWGhoWFhYWGhoeIhoSGhYeFhYWDhIWGhYSGhoaGhYSGhIWGhoaGhIeGh4eGhYeIiIiIhoSHhYaGiIaFiIeIhYeGhoiFhYaHhYaGhYOChYWGhYWDhYSEhIaEhoaEhYWDhoaFhoWEhoeGhISFhoOFhIKEg4OFg4OBfYB/e3t8fnt8fH1+fnx8fn2Afn1/gH5+gH99fXyAfX5/fn5+f3x8fX57fHx/fHt7fn+Ih4SEiIaGhYeGhYWEhoaGhoiHhIWGh4aFhIODhIaFhIeFhoaFhYaEhYaGh4eFh4aJiIaGiIeIiYiFhYiFhoeGh4aHhoeFh4eGh4WFhoeFhoaFgoOFhoaEhIOEhIOEhoSGhYWFhYOGhoWGhYSGh4WEhIWFg4SHhoOCg4SDhIJ+gYB8e31+e3x7fn59fHx+fX5+fX9+fX1+fnx9fH98fn58fYF/fHx8fXx8fH56e3t8foiHgoWIh4eGhoaGhISGhoeGiIaEhYSHhoSFh4OEhYSFh4SFhoaFhoSGhoeHhoaHh4mIhoaIh4iKiIWHiIWGh4WHhoeGh4WIiIeHhYaGh4WGhoSBhISFhoWFhISEg4SFhIaGhoWGhIaFhoaFhYaGhYSDhISDhIeDhIGChIWDgYCAgHt7fn18fHx+fXx8fH19fH18fn18fX18fHx8fXx+fXt8gX99fH18fnx8fHp6fHx9iIeChoiHhoeGhoaDhYaFhoaGhYOFhIaFhIiJg4GEg4SGhIaGhoaGhIeHiIiHh4eIioiGh4iHiImIhYiHhIaGhoeHh4WHhoiIh4eFh4eHhYaHhIKEg4SGhYeFhISEhISFhoaGhoaFh4WFh4WGhYaFhIOEg4OEh4GDgIKDhIKCgn+Ae31/fXx8fH59fH19fH17fHx7fHx9fXt7e318e359e3x/fX18fX1+fXx6ent7fHyIh4KGhoaGh4aGhYOFhoWFhYWEg4WChoSDiId/enqChYaEhoaFh4aEh4eIiIiHhoiKh4aHh4eIiYeFiIeFh4eGhoeHhYeGiIiHhoWHhoiGhoeDg4SEg4aGh4WFhISEhYaGhoaGhYaHhoaIhoaEhoWDg4ODgoOGgYN+goKDgIOCf398f39+fHx9f318fX18fnt7e3p7fHx8e3t7fnt7fXt6e358fHx8fX5/fXt6fHp8fImHg4aFhoWGhoWEhIWFhYWFhIOBhIGGhIKEhHyAhn+ChYWGhYWGhYSHh4iHiIaFiYqHhYeGh4eIh4WIhYaHiIaGh4eGh4aIiIeFhoeGh4WFiIOEhoWDhoaHhoWEg4WFhoaGhoaFhoaHhoeHhYOFhYOBgoKBg4WCg36BgoF/hIJ/fn5/fn98fH1/fXt9fXx+enp7eXt8fXt7e3t+fHx8fHp7fXx8fHx+fYF8e3t7e3x8iYeEhoSGhIaGhYSFhoWEhIOEgoCDgYaDgYJ/eoSMe4CEhYeGhoaEhIeIh4eHhYWHiYeEh4WGhoiGhYeEhoeIhoaIh4eHhoeIhoSGhoaHhYWHg4SFhIaGhoeFhYSDhYWGhoeGhoWGhoaFhoaEg4SFgoGCgYCEg4OCfYGBf36DgX5/f4B9f3x9fX59e359fH15enp5e3x9enp7e318fXx8enp9fHx9fH5+gHt7e3x+fXyIh4WGhYeEhoSFhYWFhYODgYOBgIKBhYJ/gH9/fXx7gYSFhoaEhYSEh4eGhoaFhIaJhoKGhIaGhoWFh4WHiImGhYiHiYeGhoeFhIaFhYeFhIeDhIWEiIaGh4WFhIKFhYaFhoaHhIWGhoWFhoKDg4WAgIGAgIOAg4B8gYB+foKAfYB/gn2AfH1+fX57fn18fHl6enl6fX15enp7fHt8e3t6e319fH18f35+fHt7fX59fIiGhYaGhoSFhYSFhYSDgoKAgoGAgICDgX5+foB5en2Ag4OFh4WEg4OHhoOEhYSChYiFgoSDg4WFhYWHh4aIiIaFiIeJh4aFhYWDhoSFh4OEhoSEhYSHhoWGhYaEgoWFhoaGhoaEhYaGhIWFgoKDhH9+gICAgYCDgHuBf31+gn5+gH6Af399fX59f3t/fXt6eXp6eXp8fXl6ent7enx7e3t7fH19fXx/fn18fHx/fnx7h4WFhoaGhoSFhIWDhYKBgICAgYB+f4KCfX1/f3t/f4KDg4WGhYSDg4aDgYOEgoCFh4WCg4GBg4SEhYaGh4eHhYWIhomHhYSEhIKFg4SGgoOFhISGhIeGhYWFhoOEhYSFhoWGhISFhIWDhYSAgIKDf35/f39/gIN/fIB9fX+CfYCBfn6Bfn5+fX1/e398e3p5enp5ent8eXp6e3t7fHp7e3t8fX19fYB9fXx8fYB/fXyGg4aGhYaGg4SDhoKFgYGAf3+AgH5/gYJ8fn9/foCAgoKChISDgoGChIGAg4KBgISFhIKBf4CCg4OEhYWHhoaEhYeFh4WGgoOCgoOCgoWBg4WEhYaEhoaHhoaFgoSEg4SGhYWDhIODhIKEhIB/goJ/fX5/fn5/hH57f3x8gIF9gYB9foN9fn59fX57fnt7enl7enl6ent5enp6e3t8enx8fHx+fn1/gXx9fHx9f4B+gIaEhYWEh4SEg4KGgoOAgYB+fn+AfX5/gnx9f35+fn+BgYKEg4KBgYKCf4CBgoCAgoWEgoB/gIGCgYOFhYeFhISGhoOFg4WBgoGBgoGCg4GChISEhYWGh4eGhYWDg4ODhIWFhIGDgYOChIODgH+AgX59fX5+fH6Dfnx+fHyBgH6Cf35/gnx/fn19fHx8e3t6enp6eXt5enp5enp6e3x5e317e35/f4GAfX59fX1/gICAhoSEhYSFgoSCgoSCgoCBgH59fn9+fn6AfX2Afn5+foGBgoODgoSHgYF+gICBf3+ChIOBf35/gIJ/goWEhYOCg4WFgoSBg4CBgIGBgYKBgIGEg4OGhYWHh4WEhIWCgoKDhYSCgYGBgYCFg4F/foB/fnx9fn18foN9e358fYF/gIN9fYCBf35/fXx8fH17e3p5enl5e3l6enl6ent7e3p7fXx8f3+BgoB+gH+AgH+AgIDKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzNzc3Nzc3Nzc3NzczMzMvLy8vLy8vLy8vLy8vLzMvLy8vLy8vLy8vLy8vMzMzMzM3Nzc7Oz8/Pz9DQ0NHR0dLS0tLS0tLT09PT0tLS0tLS0tPT09TU1NTU09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tLS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1dXV1NTU1NTT09PT09PT09PT09TU09PU1NTU1NTU1NTU09PT09PS0tLS0tPT09TU1NTU1NPT09LS0tLS0tLR0dHR0dPHhnNlYFtLWWdVTUZIQD03Nzg5Nzw8PDo8Oz42Oj04PDs6OTg3ODs7Oj87PTs8PD47P0E/QkJBQ0RFREE+PTw7QENDQUBDQ0FBR0hHSUtSwtXS09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXVysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMy8vLy8vLy8vLy8vLzMzMy8vLy8vLy8vLy8vLzMzMzc3Nzc3Oz8/P0NDQ0NHR0tLS0tLS09PT09PT09PT09PS09PT09TU1NTU1NTU09PT09PT09PT09PT09PT1NTU1NTU1NTT09PT09LS0tLS0tLT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1NTU1NPT09PT09PT09PU1NPT09TU1NTU1NTU1NPT09PS0tLS0tPT09PU1NTU1NTU09PT09PS0tLS0tLR0dHSzIxyZ2BcTVllUktHSz87Mzc4Ozg5Pj05PDpBOjs9Nzs8PDo6Nzg6Oz0/Oz88PTw/Pj9BPUFBPkNDREJAQT46Oz9DREFDRERCQklHSEhJTr7V0tPT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1crKy8vKysrKysrKy8vLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzMzMzMzMy8vLy8vMzMzMzMzMzMzLy8zMzMzMzMvLzMzMzc3Nzc3Ozs/P0NDQ0NDR0dLS0tLS09PT09PT09PU09PT09PT09TU1NXV1dTU1NTT09PU1NPT09PT09PT1NTU1NTU1NTU1NPT09PS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1tbV1dXV1dTU1NTT09PT09PT09PU1NTU09TU1NTU1NTU1NTT09PT0tLS0tLT09PU1NTU1NTU1NTU09PT09PT0tLS0tHR0s+Sd2hfXk9XZ01LRks9ODc2NTk5OTw+OT88Qzk7PDc5PD07OTc5Ojw9QDs+PT47PD48PT5BQD5EQ0NDP0E9Ojs9QkNFQ0NEQT9FSEpJSky61dPT09TU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8rKysvLy8vLy8vLy8zLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMzMzMzMzMzMzMzMzMzczMzMzMzMzMzMzMzMzMzc3Nzc3Ozs/Pz9DQ0NDQ0dHS0tPT09PT09PT09TU1NTU09TU1NTU1NTV1dXU1NTU1NPU1NTU09PT09TU1NTU1dTU1NTV1dTU09PT09LS0tLS0tLS09PT09TU1dXV1dbW1dXV1dXV1tbW1tXV1dXV1NTU1NTT09PT09PT1NTU1NTU1NTU1NTU1NTU09PT09LS0tLT09PU1NTU1dXV1dTU1NTT09PT09PT0tLS0dHRmn5nYWJOVWpKSElLPzw6OTM3Njc2PTs+Oj06Ojo4ODo7Ozg4Ojs7PD46PT09Ojw/PD0/QkA/Q0RDRD5APT08QENEQ0JEQkQ+REhJSUtMttfT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3MzMzMzMzMzMzMzMzNzc3NzczMzMzMzMzMzMzMzc3Nzc3Ozs7Pz8/Q0NDQ0NHS0tLT09PT09PT1NTU1NTU1NTU1NTU1NTV1dXV1NTU1NPT1NTU1NTU1NTU1NTU1dXV1NXV1dXV1NTU09PT09PS0tLT09PT09PU1NXV1dbW1tXV1dbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1NTU1NTU1NXU1NTU1NTT09PT09PT09PU1NTU1dXV1dXV1dTU1NTU09PT09PS0tLR0p+DaV9kU1hsSEhIS0A9Nzg0NzY6Oj87RDw8Ojw8OTg6OTo6Ojs8Ojo7OT49Pjk9QDs/QUFCP0JCQUM9Pz8+PEBCRUNDQkBBO0ZJR01MSbLY09TU1NTU1NXV1dXV1dXV1dXW1tbW1tbV1dXW1svLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzM3Nzc3Nzc3Nzc3Ozc3NzczMzMzMzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc3Mzc3Nzs7Ozs7Pz8/P0NDQ0NHS0tLS09PT09PT09TU1NTU1NTU1NTU1NTV1NXV1dTU1NTU1NTU1NTU1NTV1NTU1dXV1dXV1dXV1dTU1NTU1NPT09PT09PT09PU1NXV1dbW1tbW1tbW1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTV1NTU1NXV1dXU1NTU1NTT09PT09PT1NTU1dXV1dXV1dXU1NTU1NTT09PT09LS0tSjiGxfZlJWakdIR0lBPjM2Njo7PDhDPEJBPjtBPDg5Ojw6Ojw8PDk8PTo7PD09PD89QD9AQT9AQUBCPD4+PzxCQ0NDRkBBQT1ISklOTUeu2NPU1NTV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbMzMvLy8vLy8vLy8vLy8vLy8vMzMzNzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzs7Ozs7Oz8/P0NDQ0NHR0dLS0tPT09PT09TU1NTU1NTU1NTU1NTU1NTV1dXV1dTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dXU1NTU1NTU1NTT09TU1NTU1NXV1dbW1tbW1tbW1tbW1tbX19bW1tXV1dXV1dXV1dXV1dTU1NTU1dXV1dXV1dXU1NTU1NTU09PT09PT1NTU1NXV1dXV1dXV1dXV1NTU1NPT09PT0tLWroprY2VSWGhMSkdJQjg0OTQ6Ozo5QDk+Q0U/PDw5OTk9Oj07PDw6PTw7OTw9Ozs/PUA9PT5AQD9CQT5APD05QERDQkFBQj48SEpLTU5IqNnU1NXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbWzMzR09PT09PT09PT09PT087Ky8vLzMzMzMzMzMzMzM3Nzc3Nzc7Ozs3Nzc3Nzc/Pz8/Pz8/Pz8/Pz9DQ0dHR0dHR0dHR0dHS0tHV2djY2NnZ2dra2tvb29vZ2dnZ2dna2tra2tra2tjW19fX19fX19jX19fX19jZ2NjY2NjY2NjZ2dnZ2NfX19fX19fX1tbW1tbX2tva2tra2tra2trb3NzX1dXV1dXV1dXV1dXW1tbX1tbW1tbV1dXV1dXV1dXV1dTU1dXV1dXV1dXU1NTU1NTU1NTU09PU1NTU1NXV1dXW1dXV1dXV1dTU1NTT09PT09PS1bqKa2hoUlhlSUlMTkA5OTo0O0A8Nz05QUM9QD89ODo6Ozk9Oz4/Ojs8PDo7PDo7Pj1APT8/P0FAQUE/QTw8Oz5BRENBREA9PElJSk1ORqPa09TV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbW1szNhG1wcHBwcHBwcHBwcGqn493d3t7e3t7e3t7e3t3S0NDQ0NDQ0NDQ0NDQ0ci5ubm5ubm5ubm5ubq6t6WkpKSkpKSkpKSkpKSnhmBjY2NjY2NjY2NkZGRlhIuKioqKioqKioqKioemuri4uLi4uLi4uLi4uLepp6enp6enp6enp6enprG+vb29vb29vby8vLy9tIuKioqKioqKioqKiouHvebh4uLi4uLi4uLj4+Pi2NfX1tbW1tbW1tbV1dXV1dXV1dXV1dbW1dXV1dXV1dTU1NTU1NTU1NTV1dXV1dXW1dXV1dXV1dXV1NTU1NTT09PT09XDkXFrak5TYkxMVk08Ojo3Nz5DPzg+Oj8/QTw/QDc7Ojs7PTs+Pjo7PD48Oz07PT8+QDw/Pz1AQEBBPj88PjxAQUVCQkZAQD9HSEpLT0ae2tXV1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19fMzk4mKysrKysrKysrKysiivTr6+rq6urq6urq6uvp1dLS0tLS0tLS0tLS0tTEqaqqqqqqqqqqqqqqq6aGhIWFhYWFhYWFhYWFik4MEhISEhISEhISEhIRE0pUU1NTU1NTU1NTU1NPg6ejo6Ojo6Ojo6Ojo6OghoSEhISEhISEhISEhIKVrKqqqqqqqqqpqamprJtUU1NTU1NTU1NTU1NTS6ry6+vr6+vr6+vr6+vr6dnX19fX1tbW1tbW1tbW1dXV1dXV1dbW1tbV1dXV1dXV1dXV1dTU1NTV1dXV1dXW1tXV1dXV1dXV1dXU1NTU1NTU1NPUy5h2bGlKTl9NUlVNPjw8Nzs/Qz42Ojc+Pzs8QkA4PDk9Ozw6PD07PTs9Ozs9PD0+PT07QT08QUBBQT08Pzw7QEJDQURFPUFAQ0ZLS09GmNzV1dXV1dbW1tbW1tbW1tbW1tfX19fX19fX19fXzc5SKzExMTExMTExMTExJ43z6enp6enp6enq6unq6dXS0tLS0tLS0tLS0tLUxaqrq6urq6urq6urq6yoiIeHh4eHh4eHh4eHh41SEhgYGBgYGBgYGBgYFxpOWVdXV1dXV1dXV1dXU4WopKSkpKSkpKSkpKSloomHh4eHh4eHh4eHh4eFl62rq6urq6urq6qqqq2dWVhYV1dXV1dXV1dXV0+r8erq6urq6urq6urq6unZ19jX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dXV1dXV1dXU1NTU1NTU1NGcenFpSlRdT1JVTkQ+Pzs/QEA4Ojs4PDw8PD46Ojs4Ozk5Ozw7Ojw5Ozs8Ozo9PT0+PUE/Pj8/Pj08PT88PEFBQ0FERTw+QEVGSktNRpPc1dXV1tbW1tbW1tbW1tbW1tfX19fX19fX19fX183PXDk9PT09PT09PT09PTWT8Ofn5+fn5+fn5+fn5+bV0dLS0tLS0tLS0tLS08Wtrq6urq6urq6urq6vq46NjY2NjY2NjY2NjY2SXSInJycnJycoKCgoKCcpWmNiYWJhYmJiYmJiYl6MrKmpqampqampqampqaeQjo6Ojo6NjY2NjY2Ni5yxr6+vr6+vr6+vr6+xoWNiYmJiYmJiYmJiYmJbr+/p6enp6enp6enp6enn2djY2NjY19fX19fX19fX19fX19bW1tfX19fW1tbW1tbV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbV1dXV1dXU1NTU1NTWo3txZElbYE5OVU9AQT89REI+Oz06OTs6PTw7PDs6OTg5OTs8Ozw8Ojo7PDo7QD08PTxAQTxBQTs7PEA/PD1CP0RDQ0U8PkJERkpMTEWN3NXV1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjNzcXCw8PDw8PDw8PDw8PCydDPz8/Pz8/Pz9DQ0NDQz87Ozs7Ozs7Ozs7Ozs7NzMzMzMzMzMzMzMzMzMvJycrKysrKysrKysrKysfCw8PExMTExcXFxsbGxsvMy8zLzMzNzMzMzMzLz9HR0tLS0tLS0tLS0tLS0NDQ0NDPz8/Pz8/Pz87Q09LS0tLS0tLS0tLT09HMzc3Nzc3Nzc3Nzc3NzdTY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NfX19fX19fX1tfX19fX19bW1tbW1tbW1tXV1dXV1dXV1dbV1dbW1tbW1tbW1tXV1dXV1dTU1NTU169/cF5GXmJQUVdOR0ZDQ0lBPz07PDo8N0BBPD04Ojo4OTg7Pzs8PDs7PDw8PD87PD46Pj44PkI8Pj1BPjw+QkBERUNAPD5APkNJSUtEh9zV1tbW1tbW1tbW1tbX19fX19fX19jY2NjY2NjYzs3P0NDPz8/Pz8/P0NTQ0M7MzczP09LSzs3P0s7Ozs7Ozs7O0dTPz9DU0s/Pz9PSz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0NDR0dHR0dHS09PU1NTU1dXV1tbW1tfW1tbX1tfX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXW1tbW1tbW1tbW19bW2NjY2NjZ2dnZ2dnZ2dnY19jY2NjY2NjY2NnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjX19fX19jY19fX1tbW1tbW1tbW1tbW1tbW1dbW1dbW1tbW1tbW1tbW1tXV1dXV1NTV1di4gm9XSl9jUlFaS0hBQTxCPT07Oj4+PD4/PT0/ODk6OTk3OD48PD47Ozw7PDs/PT0+OTs7OT0+P0A+QD07OkI/QkNCPz0+QD5CRUdKQoDc1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2M7Ozs7Ozs7Nzc3Nzsqfys3Nzc3QuYOEi8fTwJrLz87Ozs7O07udz9HIlKfS0ceSq9HOzs7Ozs7Ozs7Ozs7Oz8/Pz8/P0NDQ0NDQ0NDR0dHR0tLT09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbV1dXV1dbW1tbV1dXV1dXV1NTU1NXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NfX19fX1tbW1tbW1tbW1tbW1tXV1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXYwIBuVU9gY1dZW0xMQ0A9PTs9Ojw9Qj5CQkA8Ojg5ODo6Ojc7Pz4/PDw7PDo5Pzw8PTg5PD9BPj09PUFAPTtBQkBCQz47QD9BQUlHSkF629bW1tbW1tbX19fX19fX19jY2NjY2NnZ2djY2dnOzs7Ozs7Ozs7OzdKpj63Rzs7Ozpu3tqSiwJOerNPOzs7O0rWVm7TRmqycsNGZrJqy0s7Ozs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0dHS0tLT09TU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dbW1tbW1tXV1dXV1dXU1dXV1dXV1dXW1tbW1tbW1tbW1tfX19fX19jX19fY2NjY2NjY2djY2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2dnY2NjZ2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV18h/b1pTYWVeXVxPSkQ9QD8+PDc6Pjk/RD5AOTg3ODk7Ozw4OT89PTw9PD47OkE7OTs5OzxDQDw7PT5AQT49QkQ/QkM9PT8+Pz5ISUg/ddrW1tbX19fX19fX19fX2NjY2NjZ2dnZ2dnZ2dnZzs7Ozs7Ozs7Ozs/Inrym0tDQzsqgl36Cw6abr6fUz8/Pz9GfoKqvzZOInJ7EkoadnM3Pzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dLS0tPT09TU1dXV1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tbV1dXV1dXW1tbV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2djY2NjY2NnZ2dnZ2dnY2NjY2NfX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dbV1dXV1dfNiHNdWGloXl9gT0lGOkFAPj88PDk2P0I/Qjo2NDc6Ozo8Ojk+PD49PTs/PTxBPjw8Ojw8PTw6PEA9QEI+PkFCPUNDPT0+Oz9BRUtIQHDZ1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2c/Pz8/Pz87Ozs7SrKWnqdXAvNLHnY+ey9PJipmq1M/Pz8/RxYeasde9yZiYxbzJl5nF0M/Pz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0dHS0tLS09PT1NTU1dXV1dXV1dbW1tbW1dbW1tbW1tbV1tbW1tbW1tbW1dXV1dXV1dXW1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnY2NjY19fX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0JB1W1tqaWFeXVNOSTxDQEE+QD46OEVAP0M6NzQ5Ojo5Ozs4Oz0/Pj49QT08P0A9Pjw8PDw8Oj1AQD8/PT5CQD9AQkA8QD0+QUVLRz9r19fX19fX19fX2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnPz8/Pz8/Pz8/QzJ2Nl6zQmpfKxZ6ynpbN1q2ZqtTPz8/Pz9anmbHV0pSWn87Rkpmhz9DQ0M/Pz8/Pz8/Pz8/Pz8/P0NDQ0dHS0tLT09PT1NTU1NXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX19fX19fY19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tKUcl5ea2tqZV1PTEc/RENDQDo9OzxCPD09OTY0Ojk5Ojo5Nzs/QDs8PUA8PEE+PD07PTw/PDo8Q0A+PTs9QD5CPkBBPkA9QD9GSUQ/ZtXX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2traz8/Pz8/Pz8/P07GigJuvyaCjv8qcpYynrdiqmarUz8/Pz8/VpZmx2bCfw5varaO/ntXR0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1NXV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dbW1tXW1tbW1tbV1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbSk3BgXnBoZmVaUUhHQkVDQEA3Ojo8Pjo8OTc2NTk6Njo8Ozc8QEA8Ojo9Ojw/Pj08OUA8PDo6OT9APT08PUBBQz9APz5BOz9ARkpCP2LS2NfX2NjY2NjY2NjY2dnZ2dnZ2tra29vb29vb28/Pz8/Pz8/P0M6fkGyclteqo9PSrqa1mJ/Vqpmq1M/Q0NDQ1qWZstbNipKex8uIlZ7I0tHR0NDQ0dHQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1dXV1dbW1tbX19bW1tbW1tbW1tbX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfW1tfX19jY2NfX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX1tbW1tbW1tbW1tbW1tbX19fX19fW1tbW1tbX0pNuYFxxZGdkWlVKQENGQ0FBODs/PD07PDw3NTU4OTY4Ozo5PDo+Pzw9PTk8Pz49Ojo+OTw6Ojg+Pzw9PTw+QEFDQT48PDpCRERKRkJd0NnX19jY2NjY2NjY2dnZ2dna2trb29vb29vb29vPz8/Pz8/Pz9G9n8O31pfA09HQ0srSzZeb1KqZq9XRz9DQ0NWlmrPWzdulmbPQ26OZtdXR0dHR0dHR0dHR0NDR0dHR0dHR0tLT09PU1NTV1dXV1tbW1tfX19fX19bW1tbW1tfX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19fY2NjY2NjY2NjY2NjY2djZ2dnZ2dnZ2dnZ2dnZ2drZ2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fX19fX19fW1tfX1tbX19fX19fX19fX19bW19GRbF1cb2doYl1PRj9ISEdFQDw8Pj48PT08NzU2OTk2OTs6Ojs4QD86PDw5PD49Ozs6Pzk/Ojs5PT49Pjw7PTxAQ0I/Pz47Q0ZGR0hEWc3a2NjY2NjZ2dnZ2dnZ2dna2trb29vb29vb29vb0NDQz8/Pz8/Pz5V+e6WS1KKa08ySl6ObodirmavV0pem09DWppq0zY6nmqCtkKeYnrvV0dHR0dHR0dHR0dHR0dHR0tLS0tLS09PU1NTV1dXV1tbW19fX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tbX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2tnZ2dnZ2dnZ2djY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX1tfPjGRWXnBrXGBgTkVITUlJT0M+OkI9PUBDOzU1Nzw6Nzo7Ojo7OT09OTo6OT0+Pz07OT47PDo8Ozk+PD47PD0+QENCPz5BPEFDR0ZGRVXJ29jY2NnZ2dnZ2dnZ2dra2tvb29vb29zc3Nzc3NDQ0NDQ0M/Pz9DR1aeZrcmjqL7KnbGdo7XZqZup2LirocfS16WbtLyjpaigr6eiqZ3Q09LS0tLS0tLS0tLR0dHS0tLT0tPT09PU1NTV1dbW1tbX19fX19fX19fX19fX19fX19fX19bW1tbW1tfX19fX19fW1tbW1tbW1tbX19fW1tbW1tbW1tbX19fX2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2djY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fX19fX19fX19fY2NfX19fX19fYzYZdV2JvZE9dVEtIRlNRS0xAPj1EPD9DRj01NTc7OTY6Ozo8PTo7Pzo6OTg6PT0/Pjs/Oz49Ojs5Pjs9PD0+QURCQD8+PzxAQUVHRURSxdvY2dnZ2dnZ2dnZ2tra2tvb29vb3Nzc3Nzc3NzQ0NDQ0NDQ0NDQ0NO5gL3Tm5bP1LWLkZ/T1LyBu9TOlKDT0dS1gsTVnZKNutWako6+1tLS0tLS0tLS0tLS0tLS0tLT09PT09PU1NXV1dbW1tfX19fX19fY2NjY19fX19fX19fX19fX19fW1tbX19fX19fW1tbW1tbW1tbW19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2tnZ2tra2tra2tra29ra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2NfX2ct+WlVqaltMX01KTEpVTEZCPDw/R0VHS0g9NjU3Ojk3OTo7Ojw9OT45OTo4Oz0+PkE+PTk8PDo9Pj46PTk5Oj9FQUA+PT8/QkBHRURFUMHc2dnZ2dnZ2dna2trb29vb29vb3Nzc3Nzc3dzc0NDQ0NDQ0NDQ0NDQ0cHR0crI0tDUxLjS0tHSwtLQ08fM0tHR0cPU09O5x9XT07nI1dLS0tLS09PT09PT09LS0tPT09PU1NTU1NXV1dbW1tfX19fX19fX2NjY2NjX19fX2NfX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29va2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2djY2NjX19fX19fY2NjY2NjY2NjY2NjY19rHd1xSZ2laTlpOTFBRV0VKPz89P0FFTExBPTc3NTs4ODk5Ojs8Pjw+ODo6OTs+P0A9Pj46NTo6Oz0/Ojs5Ojw+QkJAPz8/P0FCR0RDRE683dnZ2dnZ2dna2tvb29vb29vb3Nzc3Nzc3d3d3dDR0dDQ0NDQ0NDQ0NDS0NDR0dDQ0dPU0dHR0dPR0dHS0tHR0tLU0tLS1dTT09PW1NLS0tPT09PT09PT09PT09PT09PU1NTU1dXV1dbW1tfX19fX2NjY2NjY2NjY2NfX19jY19fX19fX19fX19fX19fX19fX1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tvb2tra2tra2trZ2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2trZ2tra29ra2trZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjbwXNYVWlrU0xSTlBSWVRGSTw+Qz9BQkVLPj43ODY5Nzc4OTk7Oz0/QDw9ODk7Ozs/Pjw8OTU6PT47OTk7PD8/P0JCQT1BPUBBQkZCQkJLtd7Z2dra2tra2tvb29vb29vc3Nzc3Nzd3d3d3d3R0dHR0dHR0dHR0dDQ0NDQ0NDQ0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tPT09PT09PT09PT09PT09TU1NPT1NTU1NTU1NXV1dXV1dXW1tbX19fX2NjY2NjY2NjY2NjY19fY2NjX19fX19fX19fX19fX19fX19fX19fW1tbX19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2NjY2NjY3LxvVFRsbExLUkpUUlVLRkQ6PkdEREFERjw/ODk6OTY5OTo3PD07PkA9PTc5Ojs5Pjs5OTY2Oj1AQT47PDk6Pj9DQT4/Qj0+QkNFQkFCSrDe2dra2tvb29vb29vb29vc3Nzc3Nzd3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0tLS0tLS0tLS0tLS0tLS0tPT09PT09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1tbW1tbW19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19fW1tbW1tfW19fX19jY2NjY2NjZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2dnZ2dnY2Ny2a1NbcGtLVVdSXFFXSEQ+PEJKRT1ISj89PDc4ODo2OTg5Njs+PD1APDw1OTk8Oj87OTk0ODw9PUFBPD47Ojw+QD89PkE9PUNGR0I/Qkmq39ra29vb29vb29vb3Nzc3Nzc3N3d3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHS0M/U0M7P0tLT0tLS0tLS0tLS0tPT09TU1NTU1NTU1NTU1NTU1NTU1NTU1NTV1dXV1dXV1dbW1tbW19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19jY2NfX19fX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dndsGRTYXJfT1pUV19RUkdCPUVJS0FBTEQ/Pzs5ODg5Mzg2ODY5Pj0+Pz06Njo7Pjs9PTo5Njg6PTtAQDxAPz0/P0I+PD48PEJFSElCPkNJpODa29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3t7S0tLS0tLS0tLS0dHR0dHR0dPT0bm7zLqbnLrQyNPT0tLS09PT09PT09PU1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2NjZ2dra2tra2tra2tra2tra2tra2tra2tra29va2tra29va2tvb2tra2tra2tra2tra2trb29vb29va2tra2tra2tra2tra2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ3qpfVWBuW1VZUVpeT0xHQ0ZNSUZEREk7QUE7PDg4NjU4Njk4Nzw/QT89Ojc8Pz48Pz87OjY4OD09QEE9QD5BQD1AOjs6Pj1BRUdKQkBDR57h29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e0tLS0tLS0tLS0tLS0tLS0tO+wMqaoKKViJGeqpOpz9TT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fY2NjY2NnZ2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dna2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2tvb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2d6iXFVeblheXU5aUFROQ0NMSUlJRkpEPEFBPDs4NzY3OTc3OTk9P0E/PDo5QD88PkI/Ojg3NzY9P0BAPUBBPz88PTs7OD48P0VJSEE/Q0aX4dvb29zc3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3tPT09PT0tLS0tLS0tLS0tTIlZyum5m1iX2TjIKBhMTV09PT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tvb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dndmlpYYW5ZYVdPV01QRUJETElNS0ZJRT5CRDk4ODY3OTc1Njk4PT1BPjo4OT4+PD9APzw1Njc2PD4/PjtAQEA/Pj4/Pjs/PkFCRkdCQENIkeLb29zc3Nzc3d3d3d3d3d3d3d7e3t7e3t7f39/U09PT09PT09PT09LS0tLTz6h+kayPko6MhoCIiYSQo8rU09PT09PU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY19jY2NjY2NjY2NjY2NjX19fX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2tra29vb29ra2tra2tra2tna3JJaWWNuWlpSVV5QTDxAR05IUklIRT47SEY4OTc1Nzg3NTg5ODs+Pj07ODlBPj1AP0E+NzU5Njs+QUI/P0BAQUI/Pj8+QUBEQUZIQj9FSozi3Nzc3Nzc3d3d3d3d3d3e3t7e3t7f39/f39/f1NTU09PT09PT09PT09PWtaWaiIuQhYCFi4iBg4qLf4bC1tTU1NTU1NTV1dXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2dnZ2dna2dra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29ra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb2tra29uIWltnalxYTFpfVkg6TEhMSkpDREVDQExINzo3Njc4ODU4Nzg5PDw7Ozk4QD89Pj8/PDY3PDQ3P0JCQUBAPz8/QT09P0A+QEBGRT09REuI4tzc3Nzd3d3d3d7e3t7e3t7e3t/f39/f39/f39TU1NTU1NPT09PT09PUxZKCg4WGfYGCfXx5foGCg36k29bU1NTU1NTV1dXV1dXV1tbV1tbW1tbW1tfX19fX19fX19fX19fX19jY2NjY2NjZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vc3Nzc3Nvb29vb29vb29vb29vb2tra2tra29vb29zb29zb29vb29vb29vb29vb29vb29va2tvb29vb29vb29vb29vb29vb2tvZgFpebWhaU0ldW1hKRE1ISlNMR0ZBQD9KQjg7NjY5OTc1ODY4Ozo7Ojw5OD09O0A9Ozo2NTw3Oz1CQEFBPD49QEE9PEA/Pz5CREU+PERLg+Lc3d3d3d3d3t7e3t7e3t7f39/f39/f39/f39/V1dTU1NTU1NPT09PT2LKEkKh9g3l2hIh/e3d5gn5+i67A1dTU1NXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dna2trZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2trb2tra2tvb29vb29vb29vc3Nzc3Nzc29vb29vb29vb29vb29va2trb29vb29zc3Nzc3Nvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc1nlcWmxmWFJPYFFSQUhHSkZYTEZAQENDSz87Ozc4ODc2NTc2ODo5PDw6PTs/PTs9Pjw7ODg8OT0/QkFCQzw8P0FCPj1BQkNCREVDQDtDTH3h3d3d3d3e3t7e3t7e39/f39/f39/f39/g4ODg1dXV1NXU1NTU1NPU0ruen3WKeXuIgICChYGDcnOAhYOMrNfV1NXV1dXW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NnZ2dna2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra29vb29ra2trb3Nzc3Nzc29zc3Nzc3Nzc3Nzb29vb29vb29vb29rb29vb29vb29zc3Nzc3Nzc3Nvb29zc3Nzc3Nvb29vb29vb29vb29vc3Nzc3Nzc3Nvb29vb3dByXV9wZVdLUGNPS0JHQ0pIS0ZBPEE9SFBBOjo3Nzg3Njc4Nzw6OD09PD47QD88Pz07Ojs5Ojk8QEJAQkNAPUFAPz1AQkNDQUBAP0A7RU144N3d3d7e3t/f39/f39/f39/f3+Dg4ODg4ODg4NXV1dXV1dXV1NXU18h4i4V8goh6g4SBfoKCc2l0hYuGkJ3U1tXU1dbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tvb2tvb3Nzc3Nzc3Nvc3Nzc3Nzc3Nzc29zb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb297KalxjcWVST1heSz9HTElPS0VAPkFCP0lPPjk6NzY7NzY6Ozc7Ojg6PDw+Oz09Oz48Ojs4OTo4OUFCQkFAQDtAQj06PkFCQz8+PT4/PUZOdN/e3t7e3t7f39/f39/f4ODg4ODg4ODg4ODg4OHV1dXV1dXV1dXV1s6dhpl+f5OTin+CgXx9gnNxm4mAgoOJwNnat7TQ19bW1tbX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tra2tra2tra2tra29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NvfwGNaW21gVlBTU0pETEhNSEk8PkFEQ0ZORDw8OTc5OjY4Ozk3PDk4OTw9OzlAPjpBPzw3NTc7ODpAQUVBPz45PUI/Oz1CQkI6Pj07PT5GTnHe3t7e3t/f39/f39/g4ODg4ODg4ODg4OHh4eHh1tbW1tbW1tbV1tjLioCHhYOXjHh7e3lvfYF1a3ebdHZ7eInHxpiMrdjZ19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2drZ2dna2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tra29vb3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29zb29vb3Nzc3Nzc3Nzd3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3Nzc3Nzc4LdjV1lrYlJNVVFMSktGS0ZDQD5CQT9FTT4+PTg5OTo3OTo3NT03Nzo+PDs7Qjw5Pz05NjY4PTk6QEJGQD49PEBCREA9QD9DO0A9PD4/Rk9t3N/e3t/f3+Dg4ODg4ODg4ODg4OHh4eHh4eHh4dbW1tbW1tbW1tfVrYZ6d32rn3l4entzdH+Dfm9xe3l6c3t2k4qFgImkzdnY19fX2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tna2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29vb29vc3Nzc3N3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vc3Nzb3Nzc3Nzc3N3d3d3d3d3d3dzc3Nzc3Nzd3d3c3Nzc3Nzc3N3d3d3d3d3d3d3d3dzc3OGtYVtebGJSTVZMTUdLS0RGQkI7QT08RUxCQT44Ojk6Nzc5NjY6NTs+QDs9Oz89PD89Ojk5Ojw5PEVDRkA/PkBDQkQ9OT0/QT1CPz1APkdPadvf3t/f3+Dg4ODg4ODh4eHh4eHh4eHh4eHi4uLW1tbW1tbW1tfQmH+Qh4N9eoN2e3Vzenl6kKqmd3JyfoeHh4CAfoKEhJHJzNnX19jY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra29va2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2djY2NnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vb3Nzc3N3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzb29vb3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3dzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3NzhpV9UYm1iUE9TSUhHRkpJSUJBPkJCPEVFREA+ODo4Ozc3Ojc4ODY+Pz07PDk9PDo+PTs6Njc7NjpEQUY+Pz8/PkNBPzs9PT47REM/PjxIT2fZ4N/f3+Dg4ODg4eHh4eHh4eHh4eLi4uLi4uLi1tbW1tbW19jYyH52doN+fnR2eIaCenl1d5yhu6GEgoCAfoeKinx/gYaMnKjO2NjY2NjY2NjY2djY2NjZ2djY2NjY2dnZ2dra2tra2trb29rb29rb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3d3d3d3c35pbT2drXFBRUElDT0pLR0xHSkJAP0FHREBBPDg8ODg1ODk3Njc3QEA/Ozw5Pj04PTw8Ojc4PTk/RENGPkE/QkBDPzw6Pj0/PkVEPz07S1Fj1+Hf4ODg4ODh4eHh4eHh4uLi4uLi4uLi4uLj49bW1tbW19XB3LRueHJze3B6eXaFiIR7eH2AgZiljH98fnuRhZaLhoGDgY6Rvd3Z2NjY2NjZ2dnZ2dnZ2dnZ2dnY2dnZ2dna2tra2trb29va2tva2tra2trb29ra2tra2tnZ2dnZ2dnZ2dnZ2dna2trZ2dnZ2dra2tra2tnZ2dnZ2dna2tra2tra2tra2tra2tra2trb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t3d3d6NWFdobllQUUtISlNJTUhNSUtBQz9DRkJBRDo6PDg2NDg4NzY2Nj8+Pjo8OTw7Oj09PDw4Ozw8RERERT4/PkI+Qj84PT8/Q0NCQEE+O0xUY9Xh3+Dg4OHh4eHh4eLi4uLi4uLi4uLi4uPj4+PW1tbW1teslLZ6eHJvd5V7dHuLgHh1bn6Fg3t/hYhyfH2bnI6JioJ+g32Hk5rH1NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2trb29vb29vb29vb2tra2tra2tra2tra2tnZ2dnZ2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2trb2tra2tra2tra2trb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d7Zf1lgaGxcUUtHR09LTk5PTURGQkg/Q0hEREA6Ozs4NzU3Nzc4NThAPkA7PDk8Ozw+Ojk7OTk7OUZERUI8QD4/PEBDOz5AP0A/Qj8+OjtKVWPV4eDg4eHh4eHi4uLi4uLi4uLi4uPj4+Pj4+Pj1tbX19vKhYR3cXJubniVhHt4hH95dnB4c3eLkY6CdnN9ioaId3d1d4ODfIiIk8Pb2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2trb2tvb29vb29vb29vb29rb2tra2tra2tra2tra2tnZ2dnZ2dna2tra2tra2tra2trb2tra2tra2tra2tra2trb29vb29ra2trb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f0nVZaGlqVk5KSE1OR01EUElGSD9FPUZMREM+Ozs8OTc3OTY2OTU4Pj4/PTs8QDs9PDo3Ozc5OThHREVCPUE9Qj8+QDw/QUE/QEJAPjs8S1Ri1OLg4eHh4eLi4uLi4uLi4+Pj4+Pj4+Pj4+Pj49fX19fEknuJf29sbnV2foSBg4qGfnVybWVtiIaKjoR7c4OHint4e4OPj4GEioqxztrZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29zc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tvb2tvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3dzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f3t7e4clsW2pqalNOR0hOT0VIRk1JSUA7RD5ISUA9PDo6Ojg2ODo3Nzk0OD08PT07ODw8PDw4Njc4OTo6RUJFQT9APEI/Q0M+PkNEQUBAP0A8PUtRYdPj4OHh4uLi4uLi4uPj4+Pj4+Pj4+Pj4+Pj5OTX19fZqXaFfnx3bHB3eXh8jH2KhYB3anN0d3p9bot7fnl6foR/gIGDfnh8foeGlrbT2tnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra29ra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/e3uO9amFpa2lRTkZNTEtKWE1OR0FAQE9BRD9AOzw4OTk5Njg2NjY4NDs+PD07OTY6Ojk6OTU4OTg5OkJERj8+Pj5AQEBCPzxBQD88Pj9BOT5KT17S4+Hh4eLi4uLi4+Pj4+Pj4+Pj4+Pj4+Tk5OTk19fX2sqKhIB5c29tcXN1d4CUeHaAfHWHhXd1cnWgmXp7d3Z5doR0bWxue3iAmouTu9za2tra2tra2trb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc29vb29vb2tra2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f397js2lpbmloUFBPTExPUk9LU0Y/RURERD48PDg7ODc5OTU2ODY2NzM6Pjs+PTc6Pjk5OTk2Ojo4NzxDRUc/Pzs/PkA9PkE9Oz0+OUFAQDhBTlFc0OTh4eLi4uLj4+Pj4+Pj4+Pj4+Pk5OTk5OTk5NjY2NjauY6AenZ1bmpveHCBfWt0cnZ3hIV5h4d5lY55eXp1d3pza298gHx2fYh8gLLe2tra2tvb29vb29vb29vc3Nzc3Nzc3Nzc3dzc3Nzc3Nzc3Nzb29vb29rb29vb29ra2tra2tra2tra29va29vb29vb29vb29zc3Nzb29vb29vb29vb29vc3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3t7e3t7e3d7e3t3d3t7e3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/f39/f4qpqa2hrZFNQT0ZQVFJOSFJLPkREQ0I7Ozk6Ojg2Nzg1NjY4ODg0Oz88Pzw5PDw3Ozo6Nzo6Nzo9Q0JDPUE+Pzw5PT5BQDs8PDtFQD47Q05TXNDk4eLi4uLj4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTY2NjZ1p5vdntveHh2cG50d3BwdHBzb36Jc3qGhY2EenNtcoB6hn1vg5OBdnx9g4a13drb29vc29vc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29ra2tra2tvb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4N/f3+KgbWhma2ZVVlJHUFFOS0xMRUJIRUc9OD08Ojo3Nzg2Nzc2NTY3NDg+PD09Ojg6OD46Ozc4Nzc6Oj5DRDtDQj49OD1AQUM/Pjw+RTw+PUJNUF/S4+Hi4uLj4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk2NjY3MB2doCCfnp4eHBsdXlya399bHNvdGdoaYB/aWl4c2d+iYl4cIKGe3d9foWKvN3b3Nzc3Nzc3Nzc3Nzc3Nzc3d3c3Nzc3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODflGttZm5mU1NJUFlUTEhGTkZGRUJGPTs+PDs5Nzc4NTc5NjQ1NzU4PDs9Pjo6OztAOTs7ODc6OTlAQkE8QUE/Pzk/QEJFQ0FAQEM7Oz1ES01g1uTi4uLi4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk5NnZ2tmYc3uqhJaCcnR1dn14aGx8d2h4d25rcHR5gIJ3dHyBhIJ9c3CAin94gn95g8je29zc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f4N/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh24tubWdzY1lRTVVbV0hDSUZOS0dCRD8/Qjo7OjY2NzU2NzY0ODc2Ozw7Pj86PDk8Qjg3OTo6Ojk6QUFCQUJDQEE+PT9CQ0NEQUJGOTg9REpOYtjk4uLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXZ2drcqHGCtXiRfnNsem6EgXaCfWtoan+DeHZ8dX2FhXRmcHl9d316gIqFe318foC03tzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3dzc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3Nzd3d3d3d3d3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e397e3t7e39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4ODg4ODg4tiFb3FrdWFWT1VVXE9ETUY+SkdKRUQ8P0I6PDk4Njg0NTY3NDc2NDk7Ozw7OD47PEE4ODo9OD04Oj09QEBAP0FCP0A+QENCQ0FBRTc2O0RMTmPa5OLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXl29ra3Z5sbnNxhY1ybXBuf391hH5rcnZ2enN4gXhzbnVwbWt2fHmFiIB/f392coODsd/c3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eDg4eHh4eHh4eHh4OLXhW1xb3ZeUldTWlpRSkhDQFFAQkQ8OT9BOjw5NzU3NDU2NjQ3NTY9PDo9PTk+OjxAODo6PDY7OTs+PUJCQjtBQkBDQEBEREM8PUA3OjxFS01l3OPi4uPj4+Pj5OTk5OTk5OTk5OTk5OXl5eXl5dPOxsB+cWxveHt2b3VuanNzbZKGeG50dG5vdIZ/b2twboJ0bXZyfY2DdnF/d3mKgabf3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3dzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t/f3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi1oZucG1xYFJZUFdfWUpMTElSP0Q9OTtCRjs6OTc0NTY1NzU0NjY2Pj07Pz45PTk7Pjg9Ozo0ODtAQENCQ0FCRkE/Q0BBQkREOz0+OTs8QkxNZODl4+Pk5OTj4+Tk5OTk5OTk5OTk5eXl5eXl5eW5t7Woc3JscHd6dHd4bXFydXd/hHRyc2xsa3F8bnBudGuBf3GAd32Eg355gHNygYqg2d3c3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh49WHcWxqbF5YWlVXYFZWUE9QTD1BOjs8RkE4Ojg3MzY1Njk2NTg1Nz89Oz8+OT04Ozw5PTs7NTo9Q0JCPENDREREQUE/PkJDQzw9Pjg5PENLS2PN0dnh1sjY4+Tk5OTk5OTk5OTk5eXl5eXl5eXltbW2q3J5cm59f3Z1d2hqaGlwb3Zta2tnZWZxdG15gG5teXd2iHhxa2podXV5dHV/wd/c3d3d3d3d3d3e3t7e3d3d3d7d3d3d3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHi4uHh4ePVhnFwY2lhV1NZV19MUk9STUtAPjg5O0E+ODc5NjQ3Njc6NjY2NDk+Pzo8Pzo/OTo6Nzo9PDk5PEFBPTtBQ0VDRkA+Pj5BRUQ+QEE3OD5GSEpesrW4wbm1u8jg5eXl5OTl5OXl5+fn5+fm5ebm5ra2tbWOfX5weoR1cnZnYmNlbGtyb2ZpbHZtd4Z9hXlsbHd4a3ZwfH14c3V5fHd2h7ng3d3d3d3d3d7e3t7e3t7d3t7e3t7d3d3d3d3d3t7e3t7d3t7e3t7e3t3d3d3d3d3d3d7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4eHj1Yd1bl5uY1pUU1hXS1NLSk1SR0E4Ozs+PDk4NzU2NTY2OTY4NjY5Pzw6PT07Pzo7Ozk8PDs5Oj4+Pjs8PUFEQkNBQEBBP0JDPDw9Nzs+REVKXrG1tLW2t7e2y9rJ3uXl3eDi3tXU1tPU4OPg39+2treuh3t/bnmNenJ1bWNobGxtaXR4enF5enqIh4N6aWh9cWRvcXyGgX55e318e4an2t7d3d3d3d7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4uHh49aGdmxhb19dV1lcWlJQSEpXTEVHPUA9Ozs9OTY0NjU1NTg2NzY3OD87OT09PDw5OTw6Pjw6OTg+Qjs7Pj5AREBDRUFAQD0/QDw9PTU5PEJHRl2xtbW2uLm5ubq9uMPT0r3BwcC6u7y6u8TMxb/Dt7e3hGl1gX1ndYd5Z3Vxa2t5eHB3fH15bWl3e3h3bml1j4FwbHl4d3d9gXuGgnmAoNze3d3d3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODh4OHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4ePXhXJrZ3RhW1hYX15TVVVRVUpMRj9JRDs5PTY2NDc3NTc4Nzc3ODk8PDo+PDg8Oj0+OTs8OTs5P0E8PT9DP0FARUJCQTw9Q0A6Pjw1NDlER0dasbW1tre5ubm5ubm3ubm4uLm5urq6urm5urm6u7e3uX9ucHN6b3B/eXNuc3Vsc3Z4cXFwb2tvcX6Bc2mHhIF9dHOHdW11hYmBgHJ2hafd3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uHj14lxa2xyW1dXXWBUUVVUUFJPSkNATUE9Ozk2NTM0NjQ2ODc3Nzk6Pjs8Pjs5PDo8PDk8PTw7PT0+PUNEREBDQkE/QD48PkE8OD06NjY6QkpIWLG1tLa2uLm5uLi5uLe3uLi5urq5ubi4uLi6uru3uKx7cnhxf3ZzfnBsbXpyZ29sbW50cHt3d3Jyd3pvhpJ2f3x8enZ5fH9zfYdyda3T393d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4eHh4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi49eHb2pxalVWV2FbT1FSUE5XSURESUo/Ojk6NzUzNDk1NzY2Nzg4Ojw7PD46PDo6PTw5PDw9Oz09PDs9REdEQ0E8PDw8Pj5AOzg8ODE1OkFGRVautbW1tre4uLm4uLi4uLe4ubq5uLi3t7i4ubq7t7mqcnB4d3x7e4J3aG5xam9qY2lyf21zcn54dHFsanaAeX2AgH91doB1a4qLgHaR1d/d3d7e39/f3t/f3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f4N/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLi4uPYhm1sdGVWUFxnWE1YU1JRWUVDS1BOOzk4ODc1NTM5NTY2NzY4Nzk+OT0+OTw5OTw7Njg5OTo8QEA9PkBGQEJCQDo+PEE9Pzs7OzYxNjxCR0RQqLa1tba2tre4t7i4uLi4uLm6ubi4t7e3t7e5ure2tIlyd3h9iXxwem99c2hqbGdnbHRscXd0cWx2c3Fxd3FyfHl4g3Z7d2mLkYp9kM7f3d7e3tvY2drZ297f39/e3+De39/f3Nvc3N3e3uDg3+Dg4ODf3t7e39jS397f397e3t/f3t7f3t/f3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLi4eLi4uLi4uLi4uLi4uLj4+Lj4+Li4uPj4+Pi4uLi4+Lk14NoZ3VkVlVkZVdKWllXW1Q9RU1LSD04NzU3NjQzOTQ0Nzc1Njc5PTo9Pjw9PDk7PDk5Oj45PD4/PkFBQ0FFRUQ+OzxBPjw5PDs3Mzc+REhFSqG2tbW1tbW2tre4uLi4t7e4uLi3tra2tra3uLm2traLfXpsbHp/cGx5dm5qaGdlcXp4b2lvb3B1c21zd4Fnb32CgYNyf3lqcHJ6f6ng393Zy8a/vb6/vsLN0tDW3tnc4NfQzcPCw8PH1dfT2dzX1NjX0MfExce9vM/Kz87Y3djO3N3c2t3T0dze39/e397e3t7e4N/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eLi4uLi4uLf4uPi4eLg4d7W29/Sw8rJx9Hb3OLk4eHg2dre1sbExcTN2trf5OHi4trX3st9aWZxYVleZWFNTFRLUlpMO0hNSEZBPTc2NjUzNDY2NDg3NjU2OTw7Pj46Pjk5PDk3OTs7Oj49PEBAQ0RCR0ZCQT08Q0A9OTw7Nzc3P0RGRkaZtrS1tbW2tra4uLi4uLi3uLi3s7W2t7a3t7i5tba3opdxb29waW50dnFmZWNrbmdvcm1mZ2tygWVvdnyAeGRzj39zaHFyaWVlbm+w39HFv7u5ubm5ubq6uru6vc3Gw8e/urq6uru7u8HCvcHFvby/vry7urq5ubq6ubm6w8XDucDDwby/ube/z8/U3tjc3t/g3tLa4N/f4ODg39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eDg4ODg4ODg4ODh4eHh4uLi4eDh4uLi4uHa2t3RwsPCu8XT1uDdydPDrrnAsaqrq6uwtLbJ0sXRxLG4v7Srq6usr7S0vMzE1c60tLureGxtbWBdYl9ZS1NVVFFQREBRTUhEPzo3ODU3MzE1NjQ5ODQ2Njo8Oz08ODw5Njo6ODg5NzU8PDw/QEFAQkRDQkE8PkI/Pz09PTc1OD5DRUNAj7a0tLW1t7i4uLi4uLm5uLe1sautr7Oxs7OztLS0tqaei2tue3ZxeXhnY2hfcXdha25vaG99b25ja2lseHdsa4Z+bHB6dm1scG95sca8uru7urm5ubq6urq6urq6urq6urq6urq7u7q7u7y7urq6ubq7u7q6urq6urq6ubi3t7i4t7e2tbW1tbi3u8e+w8XHzcS4wMnH0tzZ2d/e3uDf39/f4ODh4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh3Nji4uLi4eHh4OHg3tfGxtHQztTe3tPO0t/SuLi8sq2trKysrrG+ua63rKipqamqq6urqqqqq6ysuKyqqqqrq6urra6urq6urryzrayrpHlub21fXl1dVE1SU1xUSkE/UElIPjg5NjgzNzMwNTczNzg1NzY2Ojw/PDg5Ozo6Ojg5OjY1OTs8Pj9EP0NFQkNCP0BAQT9APjw3ODc6QUVEP4W4tLS1tbe4uLm5uLi3t7SurKuqqq2urq6vsLGzs7WjcG5ucm1wg311aWFlaGZkY2Rxc21td25naW1tZXBzb29zcXN8h4F6dX11n7u6uru7urm5ubm6urq6urq6ubq6urq5uLm5ubm6urq6u7q5ubm5ubq6ubm6ubm4uLi3t7e4uLe3t7a2tbW2tra1tbW1tba1t7e3t7rBvrzGycrb3+Dg3tvd3d7h4tDW4uHg4ODg4ODg4ODg4ODg4OHg4OHi0768zNjd3OLg0dnbxL23sLCxsa+zu7uzsLS9s66urq2tra2sq6qqqqmpqKmpqampqqurqqqqqamoqampqampqaqqqqytrq6urq6urq6sraR4aWJxZmFZWlZRUk5cU0Y9QlJEQTc8OzY5NTY1NDU2NTg3NTY1Nzg7Pjw7OTk5Ojg3Nzk3Njg8Oz47RD8/Q0BBREE+P0M9Pjw+Ojo3Nz9DRj54srCztLW2t7i3trKurq2sq6uqqaqtraysrq+xs7S1t4xucnRqaIB5ZmpmZWxdaG5waGxxYmNmcoJ+dmhobGpueoaBhXx4cXF5gK+6ubq6urm5uLm5ubm5ubm5ubm5ubm4uLe3t7e3uLm5ubm5uLe3t7i5ubi4uLi3t7a2tre3t7e3tra2trW0tLW1tbW2trW1tre3t7e3t7e3tre4v8bP0MS+v8DE19e8ydra4OHg4ODh4eDg4ODh4eDb3t7Uzby3tre6wMDJxLfIvrKwsLCwr7Cvrq6ur7Cwr66urq6uraytrKurq6qpqampqampqampqKmpqKmpqampqKmpqKmpqqqrraytra2ur66trK2heWpjbWdiXFhRUFFLVEpCOklRP0E3PDk0OjU2NTQ1NTY4ODY4Njs6OTw9PTs6ODY2ODg6ODY3Pj09PT5BQUVCQkNBQUBBOj09Pz05Ojc9QUc8bKqmqKutsLGwrqupqKqrq6mpqamrrKytra2usLO0tbilgIdvaWdzdGZrcG1qZGxvcm5rbWNrcHyJhG5qbHx4Y3uKfnNqc25rcY+7ubm5ubm5ubi4ubm5ubm5ubq5uLi4t7e3t7e3t7i5ubi4uLe2tra3t7e3t7a2t7a2tra3tra2tbW1tba1tLS0tbW1tra2tra3t7e3t7i4uLe2t7a2uLm4uLe3uL6+uLq9vcfb4OHg2Nnd4eHg3dfKwcPCurm5uLe4uLi3tbS0tLKysbGxsLCvr6+vr6+vr6+vr66ura2srKyrq6yqqqmoqKmppqepqaehpaipqamoop+hoZyip6inqausrK2ur7Cwrq2unXdwbGphY2BZUU1RTFJGQzlNUEU+ODs3Mjc5Njc0NDM1ODg3OTc7OTo9PTw6Ojk3NDo5ODY1OD8/QEI9RENDQ0FDQEJBQDtAP0A/PDw6O0NIPWOopaWlpqioqKenp6ipqqmoqKipqqqsra6wsLCztLW1taWYdn5xZmt4cW9tZmVsaGNsZ2ZpaX11bWlvfXZ5hWZod294b3Fvcninu7m5ubm5ubm4uLm6ubm5ubm5ubi3t7W1tba2tre3t7e3t7a2tba2tre2tbW1tra3t7e2tbS0tLS0tLS1tLS0tLW1tba2tra2t7e3t7e3t7a2tre2tre3uLe2t7i4t7i4uLi4wMXTyry8w83PyMC9urm5ubq6ubi4uLi4t7W0tLSzs7KysrGwr6+vr66urq+vr6+uraysrKurrKysq6ehoJ6gn5udoaGdlpmkpKaon5mZmZmanZ+gn56fpKqtrq+ura2srJl1cGlrY2FeXVVOU0tSREQ4TktHQTo4NTI2OTY1NDczNzc3ODk3OTo7PT0+ODg4NzU6OTk1OD9AQEFEPkZBQkNAQkNCQT88QEJCQD0+OjpERj5cpqWmpqampqanqKenqKioqKenqaurrKytra2ttLS0tbekc311bnONf3JmanFjaW1jaGZobG51aV9jZ3VzdnpuZ3Bwcn56cYihu7m5ubm6urq6urm2s7a1uLm2trW1tra1tbW1tbW3tra3tra2tbW2tbW1tbS0tLa2t7e3tbS0s7O0tLW1tLS0tbW1tra2tra2t7e3uLe3tra2trW2tbW2tra2tra2tra3tra3uLi3uri4uLe3t7i5ubm5urq6urm4t7e3t7W1tLS0s7OysrKxsbCwr66urq6urq+vra2srKuppaSmpqScmZubmpmampmXl5eXl5aZm5iZmJmZm52en5+dnJ6gpKWko6OioqKQdG5jcGFeXltUU1RIVEo/PFFCRkM7ODYzNzo1NTQ4Mzg5OTc4OTc7OTs9Ozc6NzU2OTk4NTg+Pz9ART5CPz9DPzxBQUI/PT9EQT8+PTk9Q0Y/VaSlpqanqKeoqamop6ioqKioqKiqrKuqqaipq7W1tba5o3eKcXKHhnd0cGh5a2JjYWVsaW5zal9jZWNjZWprYmRqbHaXjX6ovbm3tre5u7u6uLWxrKurqq6wrKyrq62tq6uvsLGvr7CytbW2t7W1trW1tbW1tbW2trSvr7O0tLSvra6vsrW0tbW1tbW2t7e3t7e3t7e3t7e3t7Owsra1tLa2tre3tra2tbW1tra3t7e5uLi4t7e3uLi4ubq6urq5uLi3t7e1tbS0tLS0tLS0s7OysbCvr6+vr66vr62oo6KgnJqampqZmZqbm5qampqbmpmZmZiXl5aYmZmZmpycnZ+foJ+goKChoaCgoJ+fi3RuaXRdYGZeUlRLRFRJPUVTSEVCOzo0NDY5NDQ1NzM4ODg3ODk5Ojs7Pz04OjkzNTg5NjM5PT5AP0A6QEJCQkA/QEJCPz0+QUFCPz06PkVDQFGjpqWlp6inqauqqKaoqKipp6ioqKinp6ioqaq1tbe3t7KZtH99kIx1Z2lqbGZjYGNoZW94cGlicXx5cGpmZmRma3NqhYystrKwra2ttLeysLCtrKuqqaiop6ipqampqKinqKipqaeoqqurra2sqqytraysrq6traunpaSnqqyopKOkpamwsbGztbW2t7i3t7W1tre4t7e3t7Kppaasq6ivtLa1s7W3t7a1tbW2tra3t7e4t7a2t7e3t7m6urq5uLi3t7Wxs7S0tLKxsK6sq6yurrCxsK2rqqmqqKijnJqZmJmYmJiYmZmZmZmZmpqZm5ubnJybmZeYmpqcnJydnJ2foKGhoqKioKGgoKCfnop1amtuWVxhVktPREdVRz5PV0hEPTw4MzQ0ODQ1NDgyODk4ODk6Ojw5OUA8Njk6MzY3OTE0PD8/QEBBOkNGRUJBREJDQTo7P0FCQz9APUBEQ0BPo6empaemqKqqqqakpqenqKioqKimpqaoq6uttba3t7e4rbJ1cHuDdmBiaWtiZWZhZGdmfYh5bHKAfXFvcXhjbW5xZo+srKurq6ysra6urK2trKyqp6WmpaWlpqioqKiopaeoqKeoqKeoqKmqp6Wko6KioqOioKKioaKhoKChoaKjpKOjpaWlqLC0s7OzsKuqqaqztLa3trGopaOioaGipKiqqairs7Sxrq6xs7W2tra3uLi3tre3t7e3t7a2uLe0sa6ppqerrKmnpqWkpKSkpKWnqaajoJ+enZycm5uampmZmJeXmZmZmJiZmpqampqampqbm5mYmpydnZ2dnZucoKGgoaOjoqCgoKCfnp2FdGtsaFdYU0pHTUVITUdAU1dGRz09OTM2Mzc0NTU3Mzg6Ojo6OTw9OjpBPDY9ODM3ODgzNztAPz9AQDpCRUNAQkRDQT87PEBDQkNBQDxBQ0A9TqKnpqanp6mqq6mkpaWlpaaoqKippqanqKmpqrW2tre3t7izc2h7c2JnamtpaWJhZGloXV1tfHJma3J/fHR8bm1zc36gqamrq6uqq62trKusq6mpqKWjpKampqWmp6eqqaamp6enqKinp6iop6WkpKKhoaGhn56en5+fn56foKGho6Wko6OkpKSmp6enpqWkpaampqeqraumpKKhoaChpKWlpaempaeoqKalpaivtLa3trW1tra1tbOwrKupqa6rqKWlpqampaSkpaWlpqWkpKSkpaKhoaGgnp2bm5ucm5qamZiXmJiYmJiZmpmZmZmYmZmZmZqZmZydnJycnJybnJ+fn6ChoaKgoKCfnZ2cgHNrbmReU0pITUZETEtFRFFTQ0c9PDgzNjI4NDY0NjQ4OTg6Ozk7Pjw5PTs5PTczNTk2NTY8QD0/QD88P0JDPkJCQj89Pj5CQ0FFQD86PkVAO0+jpqWkpqeoqaelpKWlpKWnp6eoqKanp6alpqa1tba2trW2uYptcW1vfHxxZ2pmYGFsYFROW2hqbm9tgYJ9cWdxdn6aqKeoqqmpq6urrKqqqqimpaWkoqOlpqalpaWmqaqppqWjpKWmpqSko6Kio6Khn5+fnp6cnJycnJ2dnJ2en6CioaKjo6KhoqKkpaSioqOjpKSjpKSko6Ggn6GipKanp6ipqaelpaSipKSlqK2wsKyrqqusqqmnpaWmpaWlpaalpqioqailpaWkpKSlpKOjpKOioaGhoqKgnp2cnJubm5qZmJiYmJmam5mXl5eWlpeXmJiZmpqcm5qampubm5ucnJ6goKGgnp6enpycm356bnJiXlNNSlBFRk5NQkBPRT5JOz01MzYzODM2Njc1Ojs4OTs5Oj49Ozo5OT03NjY5NjU2PkI+PkE/PT5DQT5DQ0BAO0BAQkJCRUA+Oz5FPzxQoKSjpKOjo6SkoqSlpaSlpqamp6empqalpqaltLW1tbS0tbiBaHx9ZXOCemxwdWFfY1ROT1FbaGxpbGxxbW5xbnScoqSnqKioqauqqqqqqaempaSjo6OjpKSlpqalp6ytqaShnp2epKShn56foKCdnJ2dnJycmpqam5ucnJubm5ydnp6foKChoJ+goaOioKGjpKSjoqSlpaWkop+go6SkpKapqainpaGdnJ+jpaipqainqKioqaempaWkpKSlpqampqampqenpaWko6Ojo6KioqGhoqKhoqOkop+enZ2cmpubmpqZmJeXmJaWlZSUlJWVl5iYmpubnJuampqam5ucm5ucnp+fnpucnJyam5p/fnF0YFtUTUdNSEZMSj8/TkM8QDs8NDM4Mzc0NzY3ODs9ODo6OTk7PTs7ODk9Njc4OTU4OD9APT9BPjs9RD89REA/PzpAQUE/QUVAPjw8Qz88Tp2ioaKioKCipaSkpKWlpqenp6empqampaampbW1tbS0tLS3jHalsXdmc3Jvc2xjZGlYT1JRT09dgG1kYFptkZGSoqKjpaampqenqKiop6alpaOioaGhoaKjpaempqesq6emoJ2cm6Ghnpubmp2cmZiam5qampmZmZubm5uampqampucnZ6goaCfnp+hoJ6foqOko6Omp6inqKWioKGhoaGkpaWlpKCcmZmbnqOmpqampqanpqempaOlpKWlpqiop6enpaWlpaWkpKOjo6KhoqKioqKhoaKjo6Kgn56enZybnJubmZaUlJSTk5OTk5SUlJWWl5qam5ubm5qZmZqanJ2dnZ2dnZuampqamZqXf3dvc11aTkhKTkdFRklERU5APD09PDQ1OzQ2NDY1Njc5Ozg5OTg5OTw7PDc6Ozc4ODg1ODg/Qj9BQTw+P0A8PEJAQT49QT4/Pz1CQUA6OkA8PE+doqGfoJ+dn6OkpKSlpqeoqKenp6ampqampqW1tLS0tLS0tbSXtqd1Znh2Y2xjY2VjW1JTU1JNXqCMeFhodpajnp6hoaOjo6OjpKSlpqalpKSioaGko6OjoqOlpqamp6enp5+bmpuioJqWl5Wam5qXl5iZmpqYmJqampqbm5qZmZmenZ2goqOjo6KkpKWinqGhoaKjpaampaSjoaCgn5+hoZ+goJ2amJiZmpygpKOjpKWmp6alpaOjpKSkpKWnp6ampqampaWmpKOjo6SjoqKjpKGfoKGhoKGgoaCfn56dnZyamJeVk5KSkpKSkpOTkpOUlZaZmpqbm5qampqbnZ6enp2cnJybm5qamZmZlH10bHReWk9IRUdGQkVORT9GOzo+Pzs0Njo2OTM2NDY4ODo4OTc4ODo8Ozw5Ozs6OjY3ODk5Pj9APjw9QD5AOjlAQT89QT8/QUE+QUE/Ojk9PjpQnaCfnJucnJufoqOlpaWlp6iop6ampqanpqantLS0tLOysrGwsK2rkHiGj36bmn93Yl1TUlFRTGKgootaiKCgn52YmZycnZ2eoaGgpKenpqWkoqGjp6alpaOipaampaanpqagm5mboaCXkpOSl5qcmpeXl5iampmampqam5qYmJmaoKCgoKGfoaKipKamop6gn5+goaOko6Khn56enpyanZuZmpqZmJeZnqChoaKioqKkpaWmpKSkpKKioqKkpaWlpaWlpaalpaOko6KioqGgoKGgnp+fn5+fnp+foJ+cm5qZl5WUlJSTkZCRkpKSkpKSk5SVl5iZmpmZmpqam5+fnp2cnJycmpmZmpiXl5F8cmdxXl1QRj9BRD9KT0JCRjhDRT4+OTg7Nzc0ODQ1OTo6Ozk3OTo8Ozo8PT48PDo2NzY5OD4/QT47Pz49PDg6PkFAQUE/P0FCP0RBPjo4PkE8U5ycm5uampycnaGio6KjoqSmp6alpaampqSjo7KysK2rp6amp6alpqiln6iop6qnoXmEXFFST0xcnKCAYpmgnp2clZOVlpeZmp2dnqGmpqampKOioqanp6ajpaampaWmp6amop6cn6GgmJKRj5SXm52YlpeWmJuZmpqampqZl5iam6Ghn56fnpybnJ6goJ6dn56fn6Cio6SjoqCfnp2ZlpeXl5iYmZubnqKioqKioqGio6WlpKOio6SioaGhoqOkpKSko6SkpKSioqKhoqGgn5+gnp2enp2dnZ2dnp6em5mYl5WTk5SUk5KQj5GSkZKSkZKTlJaXl5iYmZqampyenZ2dnJubmpiYmpmXlZaNempmamBiTkY+P0A9SkVAQ0A7QEE8Ozs5Ojc2NTg0Njc4OT04ODs6Oz87Ojs8Ojk6Nzc2ODs8Oz08Ojo8PTw3Oz5DQkRDPz1BQ0FEQT88OkBCO1eZmJqamZmam5ucnp2foqKhoqSlpKSlpqSioJ6op6alpqWlpaemp6ampqakpaanqKehqXJOUU1KVJahenKanJyenJeVlJWWmJiXl5qeoqKhoqOkpKOjpqalpKanpqWlpqempaOgoKGhn5mSlaSampmenJaXl5eZm5ycnJqamZeZm5uen52cnZyZmZqcnZydnp6fn5+hoaCgoaKgn56bl5WVlZeanZ2fn6GhoqKio6OhoaCgoJ2cnaGioqOkpKOioaSlpKOko6SjoqKioqKhoaGfn52cnZ2cnJ2dnJ2enpqXlpaVlJOTkpKSkpCRkpKSkpGSlJWWl5iYmJiam5ycnJycnJ2cm5mYmZiWlJWXi3hsY2RiZFFHQT1DO0tIRDo7Ozw+OTo6OTo3Mzc5NTo4ODg8OTg7OT09Ozo7Ojk8PDc2NDc/PDo9Ozw/Pjw7ODxBQ0FDQkI+P0NAQkFAOj9APztZmZiampqam5ubm5ydoKGhoaGhoqKioqKhn5+dpKWmpqenpaWmp6ampqWkpKalpKSkpaaGUFJQT0+PmHB6mpubnJ6cnJycm5ubmZiYm56dnp6foKOkoqGhoqOio6WkpaWlpKSjoqGhnZyalqmqnZuam56amJiYmJqcnpyam5iWmZybnJycnJydmpqbnJ2dnp6dnp6fn52cnJyhoaCblpWVlZacn6Ggn5+hoKKjoqOhnZuZlpaWlpicnqCip6ikoaCgoqOjoqKioKCgoJ+fnp+gnp2cm5ucnZydnJmanJuWk5KSkpKUk5KSkpKSkpOSkpKRkpSVlpeYmJiYmZqcm5qbm5ucnJqZmJiXlZWWl4d3ZGdoZGJNQ0U8RDlJSkU5Ojs9PTo6Nzg6NjQ3OTU8OTY4OTc5PDs7PDo6PDs6PDw4Nzg3Pj07Pj46Qj86Ojo/QURCQ0FBQD9EQUFAPjpAPj06W5qYmZqbmpubm5uen6CgoaKioKCgn5+enp2dnKWkpaanpqWlpqakoqKio6Oko6Kjo6KnllRYVVJOZ21rgZ6am5udn6Cgn56enp6dnJ2dnJ6enp+goaCfn5+goKGipqSjpKSkoqGhnpuamap9fpyZmZienpiYmZmam5qWlZeWlZicnJ2cm52dnpybnJ2cnZ6bmJqeoaGdm5udoKKhmpWVlpaZoKKfnZueoaKjop+em5eXlJKSlJeYmZ2goqenpaGgn56goaGioaCfnp2cnJubnJubmpqZmpydnJmXmZaVk5GQkJCPkZKSkpKSkZKTk5OTk5OTlJWWlpeXl5manJubnJucnJqamZeXlpaVlZSEcmZsYmRbREJMPT84RktCPEA+Pj05Ozk6PTg1ODg2Ozg1Njo4PDw7Ozw8Ozk8Oj09OTU4Nzw5PD88OkE/Ojo6QEBDQkRBQ0A/Q0FAPj08QD09Ol+al5mamJeYmpycn5+foaGhoJ+fn56foKCenZ2lpKSko6OioqOjoZ+foaGipKOio6SiradXXl1UV19ua42dmpqbnJ2dm5ucnZ+enZycnJydnZ+goKChoaGgoKGgoLG1pKCioaCenJuamqKXUIOcm5yZnJ6ZlpaWl5eTjo6QlJabnJuam5udn52cnJycnJ6dlpSZnJ+in5ycnZ+hoJuXl5mZmpycnJubnZ6fnZqXlpaWlJOTlJiampqfoKGmpqWgn56fnqChoaCenJubnJybm5ybm5qZmJmZmZmXl5iVlJKQkJCQj5CSkpKSkZGTk5aYl5STkpSVlJWWlZaZmZmam52cnJyampmXlpaWlpaQgG9vZV5gV0BKSDg/N0lFP0VBPD07Ojo8Ozs3NTs4Njs3NDY6Oj47Oj0+Pj07Ozs+Ozo4Ojk5NkBBPTo8PTo6OT9BQ0JERUM+P0FBPz8+Pj89PDtgl5WXl5aVl5mbnqGhoKGioqCenp6enqCgn52bpaWkpKSioKCfoJ+dnZ+hoqOjo6OkobCjXWVkYGFua4GenJubm5ubmZianJ2enJubm5ycnJ6ipKGeoKGioqKhoKGnkrGin5+enJmZmpuqYkyHnZ2em5manJiXlZWWkY6Nj5KYnZycm5ycnqCdnJucnJyempWVm56foZ+dnJyenp2cmpqampqampqbm5qXl5aTkpWVlpWTlZaam5qanZ6foqWjnp6fn5+en5+enZ6fnZycm5qbmpqbmpiZmJiYmJiYlZSTkZCRkJCQkZKTk5CRk5SYmZiVk5SVlZWWlZaXmZmXmZqenpyamJiXl5aWl5eYjX1ubV9lVlRFSzw3PjdSRUM+QkE4Ozw7OTg6ODY7Nzc6Njc5Oj0+Ojw8PT49PD06Pz06ODw9OTtAPj4/PT45OTs/QkNAQ0VDPT9DQj5AQD5APTw8YZWSlJWWlpeanJ6goKCgoaCgnp6enp6gn56em6WlpKSioJ+fnp2dm5mbnJydnp+gn56rmGNpbW5pZm2enZybm5ybmpmZmZqam5ucm5uam5ygo6SgnZ+en6ChoKCfqoF9rqKgnpuZmpqnjE5Tip+enpyZmJqamJiYmJKOj5OXnJ2bnJ2cnJycnZycnp6dnpqVl5ygoaGfnp2eoJ+cnJuampqbmpqYmpmVk5OTkpOWl5eVlJiYmZucnJydoJ+gnp6enp+fn56en6KjpKKgnp6cm5qam5uamJmZmJeXlpWUlJORkZCQkZKTk5OSkpOUmJmYlpWUlZaWlpaWl5iYmJiXmZqamZeXl5aXlpeWl4l4dmddX1dURUU5OTs8WT5AOEI/OTw8Pjk4Ozg6Ozc5OjU4OTs9PDk9Oz0+PD0+Oz8/Ozk+PDw+Pz5AQUE9ODc7QkNFP0FFQz1AREJBQEQ7Oz47PGKWk5SUlpWUlpiYmZubnJycnZ2cnJ2en56dnJqkpKSkoJ+enpybm5qZmJiYmZucnZ6cpolla3R4bVuFop2dnJydnJqbmpqampydnZ2bmpuboKKinpucnZycnJ2enqKXWYmtnpyZm5ydq2pVVYqenZ6cm5qanZqam5yVkZOXm52dnJ2fnZycnJycnZ6fnp+cl5idn6GhoJ6cn6CfnJubm5qbmpmZmZmZl5WWlZaYl5eXlpaYmZuenp2dn6GhoJ+fnp6fn5+dn5+hoqKhoZ+fn5yZm5qcnZuampmXlpaYl5eXlpWTkpGTlJSTlJSUlJaZmJaVlZeZmJeYl5eXl5eYl5iXl5eXlpaYl5eVl5eDeHZfW11eUT1GOjk4P1VDQTtDQzo8Pz86Ojk3Ozg4ODc0ODk8Ozw4Ozs8PTo8Pjk/QT06PTw+PkA/PUBBPjk2PERDRUBBRUU9PkVERD9COzo8OTpkl5SVlZaUlJSUlJWXmJiamZqcnJydnp6dnZybo6Oko6CenJuamZqZmJiYmZiam5ubm6WJa3F2em9lmp+enp2dnJybnZ6dnJ2enp2dnJydm5ygoJuampubm5udnJudom1jnqCZmZydoZppYFiMoJydnpybmp+fm5ydm5mZmZudnZ2dn52dn5+dnJydn5+fn5uanZ+goJ+dnJ6gnpubm5ubm5yampuamZudnJqZmJeYmJiYmp2foKCgoJ+hoaGgoJ+en5+fnp6foaKhoJ+enp+enJqam5ubmpqZlpaXmZmYmJiWlJOUlJWVk5OVlZSVlpWVlZSYmZuamZaWl5WWmJiWl5OUlJGRk4yRkJOWfXhqYWJiXFA8QDw2OENWSERCOjg7Oj47Nzc5Nj06OTk2NDc6Ozw9OTo6Oz87PT08QD47Oz46PT89PkBBP0A8NztBQ0U/P0REPj9EREM+Qj07PDs6Z5aTk5OTk5OTlJSVlpeWl5aWl5mbm5ybm5uamaOjoqCfnpuamJeYl5eXmJmYmZybm5qkgGpqb3lzcZegnp2dnJydnp6enp+enp2cnJydnp2bnJuampqam5ubmZmZm6JzaX+imJucnKOLal9YhqCcnJ2cm5qdn5ucnJubnJubnZ2dnJydnp2enZydnZ2cnJ2dm5uenp6dnZybnpubnJycnJydnJubmpmbmpmYmZmYmpmZmpyfn5+jpaKfoaKioaGfnqCgn5+fnqCioaGhn5+fn52ZmpucnZqZmJWWl5aVlZaTkpOUk5STkJCSk5GUkY+OkJGOlZabmJWYlJmXlJiRjJCPk5yTkoyFjIeDhndxZ2pkW1xRQT44NkJHYEJFR0A+Ozw7Ojg4NjU8ODo4MzQ6Njk9PTk5Ojs9Ozw6PD48Oj5AOj5APjw/QD8+PDg6Q0FEPz5CRD8+Q0VCPUJAPDw8OmeYk5KSk5OSk5SVlJWXl5aWlZaXmZmZmpqampqkoqCfn52bmpmYmJiXl5iZmJmcnZ2cqH1nZXN7enOJop+enp2dnp6enZ2enZ6enp2dnZ6cm5ybmpubm5ycnJmYmZmpdXBqi5ecnZ2bfGhfXIehnZ6dnZybm52bnJybnJ2dnZ2dnJ2dnp+fn52cnZ2dm5qbnJmZnJ2dnZ2dm5uanJ2dnJycnp2dnZybmZeVlZeXmJqam5ubnZ6foqOhoKGhnJucm5ubnZqcmZycn6CfnZiZmZmUkpKUl5SPj4+OkYyNiYuQi4mLjpGRj4mQmJiQkoyNi5KQj5iYoqiqpqWlrKOmoZqep6eyqKKVo6Cfl39wcWlsXFtcTUY8NzdHR1g+SE5URjk+Ojg5ODc1PTk4NzMzOTY6Pjw6Nzo8Ozo6Ojo8PDs/PjtAQD47PT5BPDw2N0A+QkA+QUY+PEFEQT1DQj49PDlmmJSTk5OTkpOUlZOVl5iYmJaXl5iZmZqampqaoqGfnp2cm5mYmJiYmJiYmZmZm5ybnKx/am16f3lxh6Genp2cnZ6enp6enp6dnp2dnZ6enJubnJubm5ubm5yZmJmYo3tsa2+HnJyelHBlW1+KoZ6fnp2dnp6dnJydnJ2dnZ6fnZ2fn56goJ+enZ2dnZybnJ2em5qbm52enZ6dm5ubnJ2cnp2cnZqYl5SRjo+QkJGVmJSWlJiZmpudmJuYlY2Mjo6TkpKRj4mQjpGRjo+Ki42NjYiIi4+Lg42NkY+MkI2Qk5WVnJihoJySn6SipKmam5eanKOprb3Bwbq8uL26ucC8ubq3uru7tL2zwbV/bnVmZ1peWUxJRTo7TElTPFZSSUM6QTo7Ozc3NTo6OjgyNTY4Oz08OTk7Ozw5Nzo4Ojw6PT85PD8+PDw9QTs5NTg8O0A/QT9EPTxBQkA8REM9PT06YZOTkZCUlJOTk5OTlJeYlpeZmJmYmZqbmpqamp+gnp+fnJqZmpqampmYl5iZmZmZmZmphXB1e4B3b4mhnp6enp6fn56en56fn56dnp6fnp2dnJ2cm5ubm5ucmpiZmZ+Ji5J0fpygo5F4ZVVgkKGfoJ+enZ6hoJ6dnp2enZ6fn56en6CenZ6enJydnZ2cm5qYnJuVmJqamJiYmJmSjJCXlKCXk4+MjYqKiImMiJORh5CPjYqKkJCLjoqMi4+IiImJjpGOjYaFiYaKhoWLiI+SkJCNkJKXlpKamJ2TlJ6kpqaqq7Gsr6+rpquqsbm5tbS0rqyvtMDIxcXBvsbDxMTDurW+t7a0s7C2tb6qcHRyXGZfXl1JRj8/RUtMVklcTEQ/PUI6Qzk5Nzc7OTk3MTc5ODo+ODg6PDw7OTc5OTs9Oj4/OT5BPDs+PD46OTY5PDpBPkNBQT08QkBAPkJEPj8+OVyHhIOHi42KiYaFgYqMkZOVmJiHlZaWkpiampmenZ+gn52ampubm5ycm5iWmJiXl5ibqo56dXZ7f3mCoJ+fnp+goKCfn5+foKCfnp2dnp+enp2dnJqbm5ybm5uYmZqgppyNbIixp6R4ioZjYZecm56dnZycoaGfnZ6dnZ2dnp2dnJiWlpaYlZWSlpmWk5GKjI+PjI+NkIuLj4+WiYiEi5GZjn2Fi42PjYyHioyQm4yRj4+Lio6TjIyNjIiSi4yFiYyPhouIh42KhYyEj4qXkJOYmpWbnKOqoaKknKKrsbe0ubWxtK2vsrKlp7O6sbq6vLa3tsDDw729vLa/urq8wbW4wL60r66mqa+3mm58Z1tjWl1fSEU+QUtJU1hZXkFGOTk9OkY/Pzo3Ozs7NjM6Nzo5Pjg6Ojw9OTk4Ozk7PDo+PTtAQDs8QjxAOjg0Nzw7Qj9BQj4+O0NEREBDQz0+PjlhmZWLkYWNj5aSiHl9e3+Fi4OKgoqJhmuAeJCLlpqRnZ2UlJGTlpeampiWk42Sk5KQm5uIdndzcX1/cpGgnZubm5yenZ2eoKGgm5uWlpucmpubnJuYmZqYmJmbmpqWpaCIeFtrp5aWW3SBfHaUko2SkY+Uk5KXm5mYm5ePjpCLjo2Ch4uLi4qLiI2RjIeHhoqIiZGKh4yEhYqNi4qNhI+UkIyDkJOUmZWQi5OTkZWRlpWOj5GMlI2Oj4qIj4ePhoeJiYmNiomJioWNh46JmJKUmpuXmKChp6Cko5qqqbO2sbWwqKqiqK6tn6qvsK21ubi8wr/BxLixtbCutrOwuL68ury+urOzp7G3wpB1gGNiXlpXUk1IRkVQSVlXX1tDUDpCQz1HRj84Nzo6NzU1OTc8OTw5ODo9Pjo6Nzs7Pjs7PTs9P0E7Pz48Pzo4NDM3OkFBQEI+PjpDREM/QUM7PT45Z6mloqKZn6CippeUiI2CiIJ1h4iKiIp7e3Z7enmPeoiSfn18en6CkYWBgH1zfH99fISHfnRweHZzfHaBj4iIiYeIioyMkZicl4iOhIuNi4iNkZCPi5GPi4yPkJGQkqiPa1RQcpyKi05ddHiAiIeCjYuGiYp/iYqGiJiRiIOIg4KFfIuLjIaJi4iKkIyIi42PjI+Wh4mLio6NjY2Wk5OdnJyalpycm56bmpuYnpeTkZWWkJKRi4+LlpSMjYqDi4SEiYyQkIqOio2LipGJjZOTk5SVk5KcmZ6Xn6CfpaKvsamupKSfmKStpqa4t6ysu729wsPAv7+vpa2wsLS3uLO0uLa0ta6stK+4tLaBeXpjZmBeVlFRQUVMT0lcXl9UR0dCS0xCREA9ODg7OTU3Nzk3Ozc9PDk9Pj05Ozg6O0A8Oj06PkJBOD88Oj84NjQyOTtCQD9CPj04QEI/PkBEO0A+N2CloJqXnaGaoaCPl5efl5WCjaCfo6GdmpKOjIxycXBvdnFucG1ucHZub29waHBxcHR+c3FycXd7cnl2d3Jyd3Z6e3l8fXt/iIGEi3+PkYaNi4yGiouLiYeEgYaDf5OoejsvPHiPenlHOlNvdYGAgpKQhoSEhY2DhIyPj4+IjY+Hi4iRkJWRjpCKk5eOj5WYp6SfnZWYlpaln5udq6aqt7W4srGnr6qnpqGfmp2WkpWVkYqPjImTjZuVjYuLhoaJjJWQkJCLmZKVlZSbkJiTlIyNkYyWl5WilZ6mqauno6OqsJucpp+mq6G0vb6zs7+5u7u6uby9rqiusa6wuLyztLGxqrCpqLGxsqild3J0X2hhYFRWUUlKSFZNXl5eVExKRVFKRUdDPTo5OTc0ODY4Mzg4PTo9PD47OTs4Ojs/PDw+OT9DPzg7Ojg8Nzc2Mzc5RT4/Qz89N0BAQT0/RDw+PThUj4yGh4eUjJWZl5yWmZaNlZyWlZydoKCdmpiWeHFubXJ4cXFsbnJwa3FvcG1yc3t1dnd5fnVxeHZ0d3tybn98gX15eH1/eYOGg4WCg5CLkIuLi46Pi4mJhYKCfn+emU9PVD97hG5mTjs1UHB6foWOjYuGjZSRi5CXj5SXkpihlp6WlZunpp+goKawq6GjpbW0sqqmqq+isba5vcK7ucO+vLi9uLWxrLCsppuSk5mfm5SPk5WOmp2doJqfn5edo6qsoZ+em62hp6qwqaampJiRkZWUo6SirKSss7Szs6i3tru4sLKvra2yt7a6srW6s7e5u7i8urayr6yxsbKztLOxsa2us7Gzs6yhl3Zxc19jXlJRVE1PSUdYT1pcZFROR1VPRURKRD44Ojg3NTg4ODU5Nzo6PTw/Ojg8ODk5PTs9PTpCPj84Ozo5Ojk4NjI1N0I+P0RAQDY+P0I/PEM8PT46Tn98go6MjJOTl5eaj5SWjZaRkZSXk5qanqGdnHJvcnFxcXFxcG5zcW91dHJxdneAdXd8eYV+d3t8eX1/fICJiYmDfXp/h4GIiYGAgIGGiIKGi4eIhYSIiIqFgIGApHVTgXhQfJWJeVJofFJcdYSKjouNkJmclJSUoJqan6Ktsa6ppKWtr6ysrLWuvrmtrqm1sLexq7G2rK+9wsLAvrq8trKutraxtK66u7OurKepp6unoqmtoKmooq+wuLSxvLq6urK0ta+8tLezt7e7t7mtrbCprLW5sbeytLe2sLu7vLu6ury1vLi0wbWsqqqrtLG3uLm1trSzsKymrrCqq7Cxq6yusLKxtK6qo5N4dnJlZ1tMUlBFTUlTV1JlXmdUUExcUUhMUkNBOTk3OTU4ODY2Ozc5Ojs6Pjk4Ozo6Ojw8Pj08RD45Njs7ODg+OTUxNTZCRkREP0A3Pj5DPjpBP0BAO0t/gomXmJSdlpabmIuSlo6XkZGVl5SZl5+bmZx8dHV2dXl1c3RudnJzdHV2d319gH56gXyDfoJ/fYB/hIKFj52RiYF/go+Xjo6HgoCBiIuFfoqRi3+IjYyLi4eRjZ9hjdbAX6avpKZwcYp/VmiGi4mQj42PlJSYkJWcmp2eqK6ysLC1tLOtsrW4sLy1tbGqsKqztbS7t7SztrS1r7i4t62noqassLCvtre3vrW5vLOysa61u7C0r6+yu7axuMC9tLS0s7izvLq2tLrAvbm6ubq+ubm5vrWysa+yr6q1tLGzsbSzrri4tb+vpKaoo6ussa+zrq6wsKytq6qroqKmqKKnrauqpaynoqeYeHlxZmVZT09NSVJNV01PX15cTlVVYlFEVE07Pzk8ODk1ODc1Nzk1Ojo6OTs4Ojw8Oj08Pj4/P0I9ODY6Ojk6QDs1MjY2QUZDQz4/Nz49Q0I5P0I/PjtLjpGTmJmVmZGTopiTkpKLk4uOkI+Vl5ablZSbhoJ9enh2dHRzdH53end2gIKDhouMhISFioaQiYeRk5aRjZaalY+IjI+emJaVkpCTl5qamZCeoZ2Tl5uhmp2boqORZb/QrZXbt6bAsVRed2lVhJCLmJqPj4yUmpecnZugnaSstLm6vK+2tLi0tLK3uLmzq6+qqKy1srK1rrGrrqa3s7OxpaGotbCvrayrtbqyu7q6tLK3ur67ubG4sLmtqLK4u66ttLS3tbu2trm5vLe0r7G0t7a5s7e1pq2pq6ior6yprq2up6KxtLG0q6aop6Cjq66oqq6orLKwr6+pqKGeoaGjpqOgopqlo56ol3J3bmdiVUpUT09KRFBLX2JYWlFcVGBNSFJJQUA5Ojg2Njc3NTg5NDs5Ozk8Nzs+Ojg8PD0/QkBBPTs2OTk5Oj87NjM3OD5GQkJAQjk+PUBDPkBGQj44R5OWkZWTkpSQkZ+ZnZmVkI+Sko6Mk5aWko6RlZGSkIaBeXJzdXuBhI6HhZGTkpicnJiVkJWYo5yaoaeqqZ+clpeVnaKioZyZnpmlqKyvramnqqqpp6KlqKmrqaqygXOzr53RxaKYrK1xasWHUHufoqSem5qkp6Spq66spaSoq6+xtK6qrK6zr6ystLO0ua6urayqrLKwsK2wqKqmsrS0uK6qtrqwr6qurLC3s7i0t7W0u7y4tbWxtauyrKiys7uvrbGytLa1sbG0s7OvrKuvs7a0sayutKqqpqWnrauoqKupqqifqbOwqqeppaOio7CtqaatpairrayppaSioKWipaOYmZyVnqKippdudWVnZFdPWUtLSktTVHBiWWRXX1tcUlpQTEM8ODk6Njk4NzQ3NzQ4Ojw6PDg6PTk3PDw7PkM/QT47OTo5Ojs+PTg0NThBREVEQkM5PjtAPkI/R0Q+N0KSm5SVlZaVj46Wl5qZlZGKk5SSjo+SkYqKiY2Ul5qTjYmCho6VkZSfmpuin5+jnqGhn5ijpKelpaapqa2rqaKmpKilpKGfnqOjra2srairrq6rq6ykoaKmqaeorI1+k4SKyM6ws6qSdEausVtwnamnoKKhrqyrqqetrqilpKmpqqmmo6iqqaekp66wr7Ovq7Crqq+yr7Czua+rqLCxrrCyubO0r62vtbCss7GurLW1tLSzs7CvrKyqrKusr7G0s7CwrrCwsKyqrauqq6alrrCysKumqbCvqaOkqaunqKaopquwq6mvqaaoqaalo6iwraqpqKKpo6WnpKGhoKKloZ2el5aYlJugpKmUbnNeamlfVlpOUk5RT1NlXGRjW11ZXFBZT0tAPDs5Ojc6ODczNTMzODo9OTo4OTo5Oj08PEBEPkA9OTo8PDw+Oz45NTo8QkFFQUNBOT47P0BEQENCQDdAkZ6YlJeZlpGHi5SSl5GIg4mLk4+OkI2Hh4SFlZmWmJeZlpqeop2ZnKKkoaCdn5qfoKGgpqGgoKCjo6KlqKmrramqpqOmpaCloKaop6aoqaepqaSoppqdpKWjoqWhjINvmLGjnpyHgXRjeox1bZSkoqChn6GhqKCcn6GloaCmo6KfpKGspp6foaGkrKqnrKivq6e0sa6ur7WyrKqwq6mtrbWwrq6srreup6yqpKivsq+sq7Kvqqqpq6utqa6urrGxraqtqaunp6uoqauinaapqKilqKisqKilpKWop6iopqmsr6+oq6mhoqKlo6Opq6ymqKWjqKKhoKSdnZ+hoZ2bnZ+amZWcnKOqlG9zZm5yZF1dUFVPWE9eZWRsaGJiWlpSVE9NQTo9Ojo4Ozk1MTYzMjg4Ozk5OTk7OTk8Oz0/Qz5APTk7Ojs8QD0+PDk5PEFBRUFGQTo9Oz9BQUJBRUI4PYqWlJOYmpaPiISNjpGSjIiIiI+JiZCRjoqKiJubmZygpaKlnqKjoZqeoZyanZ6bnKOop6ugoKOYoJ2XnKGjo6WjoqKkrKilqaCepqmnq6mkoKKgo6ehpq6mppyonYFrUYySgH6CdnRvcHN0foCQo6Ghn56doKOalpqYo6KipJ+ZnKGhoqCbmp6goaSgnaejqrGorqusqaSqqquorKalrKqws6+rq6mwq6appaWoq6ynpqevq6Wnq6upq6irqqqrrailqKOmpaesqayoopykoaOmo6qpqKano6SnqKanqKepqKupoaKoo5yepqWjqKino6WlpqmgpJ6inpeYnZ+doqKlnpiUlZ6go5d1d2t2eGJfXFVZUVVXW2Nec19oX2NTUVlUSD48PTg7OTo4NTM3MzM0Nzo4OT05Ozo5PDxBQEM9PT44Ozw9PEA/Qj86ODo+P0NAREE6Oz49QD9DQ0VDOTyCmJmenZ2alZKKiZGRl5GQh4SJgoGNj4+Sj42cnZ+hpKmlqaeorK2moqKfmKSmo6Stsa6yp6asm56em5qjp6Cfo5+foq+rq6yoqKuvqaiqqKKgoaiqrbGyrqyrqYNwX0hvdW5xdmtpZWhmZ3F2foqWoaSln6CimZWem5+fpKGblZigoZ2enJudnZuZmZWen6Oonp2iqKGaoaOmoqSoqaqoq7CxqKWlp6eopKWpqaqnoqWmqKadnqWloqClpaOlpqCjpaOjpaelqamqpKekpqKmp6SrqaenpKGlqKynpqWlo6OopJWdo5+bnaCjqaeopqGjo6mooKiioJyVkZqfn6GmopuXkpCamqCVfHdvfXlmW1tgX1pcVVxoZG9jbWlpYl5QUEA/Ozo4OTg8OzYzNDMzMzc5OTs8OTs7OT49QkBAPTs9ODw9QD08PENBPjo4PT9EP0M+Ojk/PEI/P0FEQjk6gJ6kp6Gem5+gmY+ZnaCWloqGj4iEi4qTl5SRo6Wnqq6trLOys7S4t62pqqevtLKxqq6usbKusa2lq7OssbGpq6+rq6y2sLSwq7GysaOgo6qqp6+3tbO2ur27r5RqY1dIXGtmanFnY2NlWlphYmt1en6IlJ2jppydoJqWnqScm5aZoqefoJ+joJuUlpmWl5qfoJmVnqGZmJ2dpZ2gpKeqqaiqraylqaSlqqeqqaqsp6SkpKOimZmhnpqaoaCfpaWYnqSmpKqooqelpaGqp6mnp6ejqKWmpaGkqKesoqekoaalpaOVl52Ym5mVo6elpaSfnZ2lo6Kqo5+amZiXnJyaoaGakJOTl5ibjX93cnZ4amJbX19cYllgZG5ta25hX2RgUE9BQDs7OTs4Ojk2MTQzNjQ3Nzc6PTo8Ozk9PUI/Pj89PDo/OTo7PD5CRUA9OTtAQT5DPDs5PzlAQEBAQkM7OXuao6OcoJ2dop2Zn6KioJibmJaYkpSQm5qWl7S0rrW4s7S4tre0uLm3tbm4ub28uKqLnLK4vLS9urW7uru4s7q/uLe5u7G3r6iusq2inaCrsre+xc3Qx8C1ppN3Xl1TR1x0a2pxZWBjaVpYXlleZW5wcXR4hZimrqelmKGko52goaKooaOgpaGck5mYmJmco56cmpudl5uZlqWam5+hqKmpqKuvr66pqKirrKytq6irp6WjoJyfo6Ojn6Cipammmpyip6Spn6GjoqKgpaanpqSooJ+ipKGjoqiop6OloaGopqalo5mbmJuTj6GknqKfmJiVoJuhpaCfm5udnJuamZugmo2YmZiTkYaAdnh4eGNbUllUX19hbWh2a3FoaWliWlNMQDw6Ozg5Nzk3NTU2Mjg1Njc3Ojw7Ozs7QD4/QD0+Pjk6PDk2Nz47QkZCPDg7P0NDRDw+OT43PkFCP0ZDOzhwkpqblJ6bm52Vl52doqajopaXnpaXl6GblJi+t7G4uba3t7i7l5S2vbu9vcDFtaK7mKC3v7+6wcm0nbu2sra/xcGooLa0urGqrrSxsLK0tbzQ3ODZyruvoJF5Y1xeU0FfbGpxd2diXmdeVVxcW1teZWRiY26JssnCuaGnqqynq6mlpqCnoKGmoZOWmJ2foqSjnZ6coaChnZekmpmdoKaqqqqtrq2tsLGrrK2sqamrrqimpaalpqSkpqaeo6eppKGcoKKjpqCio5+jpJ2foqWgpJyboZ6fo6GhpaSlqaOkpaKkp6ehn52elpOcoJiZko+MjJeWn5uWnJqdnJqSlpSUmJOQmp2YiouHgIB8gnhhXllTYWlgZnRvdGl0ZGlkYltMSz46OTg5ODg5NzM0NTI1NDY2OTw8Oz08P0E/QEA9Pj44OTs4Njc/OUJFQzw7PD5DREM9QDs9Nz1DQ0BFQjw3Z4yRk4qalZiblZWYm6Knq6aVl5iQlZmhnpeXvrWztLu6ubi5woeYt6u4u8DCxbOjw6e4s72/tMTHvbS7uL62wMTErqCworW2tb2+wcTHw8TAztfYzrqjj3xvXVZYWEw9XmJodHJtYmFmW1dXWFhWWFhdcZKwxcu6uLepr7Gwr6yqoqajrJ+fpquXmqifpaWfoJydoKuwsKyiq5yYm6Cor7Kys6uorre1sq2tqaalqKulpaStqaShn6Cnnp6mqKmmnp+anqGlpqmcnaObl6KmmpuanZ+cmqGcmZ2eoKijn6GfnaWioKOioZSZmpmTj4qLhI2Qk5uPjpiVm5eYkJORkomNl5iYk4uKi32AgIVwYGJfXmtjYm54dXdubVtiUlZcTUc7PDk3OTc5Ojc0NDQxNDM3Njg8Ozs8PEBAPUA/Pj8+Ojo5Ojc6Pz5FRUU8PT1AQkJCQUE7PDhAQ0NARD87NV+MjIaFlouUlZeYl5ifpqellpWVkZebn5ual7mxtrO5vLy5urWqsryxvsG0vMe5uLuuv6fGw7/KxsnIxcXJvMLHx7+xsKe8vL7FxMbJx8XGusTAx8/Sx6aFXU9LT1NMPVZXaGJgcWhhX1haV1hWVF6HscS9s7S2qrWyrbOtqa6vp6awr7Ktqq+zpKu1qaeopKCgnqmyuL61tbWqqaausre4t7apq7i8ubexr66noqOop6SfqKOfnqCZoZydoqSnp6GelJuaoKGlnqChnpajnZSQlpiboZqflpORlpSin5qenJudoZ6kn56VnJiPkpOPjImTkJefiZCWkZuUmJGRlZaDjJWXlpKLjIh8f4R/amZoYWtsZ251cnJ1cWdeYFxSSUU/Ojo6Nzg0ODw3NjU0MjMzNjU3PDo7PDs9QD4/QD48PTk5OTs6PDw+QkRFPj49QENDQkREOzo4QUJCQUNAOTJbk4iEjZGKi5GRlZCSmp2fnJOSmJSdnZqXmpW2sbm1tb6+tri1uLO8vMTEusPHwb+0s8XFxr/CzcfLzsvLx8HDxsfIysXExcO7vLzBxcHFxL/Dw8bGwbadx7OMXFNWUENWU1xhZnBlWFtaXlhZZ5Cvv7q2pqmpqaqtrKmlpZ6pr6uyu7q4u7e5t7O5uLOurLO0qrC1ub3Bur6+vL60urm4u7qysbS8u7q7s7Oyp6Smq6uioaCdmpudmpyXmpuenJygnZaclpuZnZ6io52UnJCNiY6OkZ6bnJWNh5KLmJiWmpybmJybnp6cmp6UjpiYmpSRmZeeoZWYmpKXlJWRlJqYk4+TnZaSi5F+enx/dWtsbmRvbWlxeG95amlhXWdhUUZEQTw5OTc2NDQ6ODQ2NTMzMjY1Nj05OTs7PT47Pj49Oz05OTs7Oz89QUNBQkFAPEBDQ0NFQjs4OUQ/P0BCPzsyV5uQkZCQh4WSjo2IjZCTlZGPjZSUm5STlpqRs7e4uLi+u7C1sri2tbbAw8G+w8LAvru+u7u8xMzEzNDLxsa/xcfLyNTLysjGv7u7vsS+xcjGxsPExLm0v7m7yq55XVBOV3x0kJeWVVRYV1lhgbC3qauytKyupaWjp6SgoKWZqrSxvsG+urm6uLW0srG0tLO6wL7Av769u7u9vsDCt7a3tru7sru+ubi3u7a3tKyoqamrpqijnpOampyYkZKZl5GRmJqXnpiWk5acm5+elJOJiX6GiIuWlJiZkYmVkZeWlZmbmpaYl5idnpyhmJWZmZyYl5ybn56jnJ6WmJeTl5yZmZyUlp2UlpOJdnl5e3dua2lodlpmcnhzeWZmXmRbUlhJRj87Nzg4NzYxNjk3NDQzMzM2NDY7ODo8Oz08OD0+PDo7PDs9Ozs+PkRBQURCQEBBQkNDREM9OTlCQD8/QD89MkyWmpaSk4yKmJCKi4yOkpKKiIaNkJiKj5CUl7O7tba/vb2xtrjBvby0uL/Bsbi3vsHFvbu8wsbJv8jOyMHEwcfKysbKxczIzcbIxb/DwMvNz8rGxMPEwsW+t73Dw7J9Vkxwd5elnU5RU1t0oLW3sq2suLWzrKmjoa2prKetn6y1tL/Cvrm4vbawrausr7W0ur7Fv7u8urO5u7i5ubWtsLS9u7G/vLiytrmzubu0ra2orKyqqaeXnpualY2MmJSTi5WWlJyZl5WWmZKYn5mQiop+iYqKkY6Vl5OUn5mWkJSZmJmWmJOUm6GeoZiYmp2ZmZaenpibopqdnJuYmpuZlpeXlpyZlJyYfoB4eXV1ZWZpamheam9ueXhjYmFgXlhXRkU4Ojg6OTc5NDQ5NzY2NTEyMzM0Ozo9Pzs9PTo6PTs8Pjo7Pz48QkBDQkJFQj0/Q0NDQ0RFQDk6QkFBQj5CQTVCkJeUlZmSj5qQjpKRjZSVi4qHjI2UiImPkpq2u7S8xsHEwr3BxcLAtLO9v6ywr7rDysPCvs3IxbfByMW/wcLIy8rCwsTJzM3Oz8zDx8bIycjIycfFycfIx7/Ex8PHyLCAYFiRppJITG2Xs8K8vrm8ury6vKytpqm7urm3v7K1uLLAxrq3t8Gzsa2tqau1s7u2w7a2vbWxt762s7e4sLW2v7uwvbq0q7CxsbO8urOzrqutq62xnaOjoJqQjpiXlZCclpaYlpWSnJmTm5+clpGUjpWQiYyQlZOUm56YmZKSnJedlJmSk5aZmJ2VnJ6do5yVnZ+TnKKcnKCfnaOemJSVl5ebmpmgkH99cXRxb2NhZ3Zpamp0bnlsXWRbVWBZTEhDNjw5OTg4OjUzOjY2NDQxMzUyNTs6PD47Ozw9PDs8PTw7PD49P0E/RUFCQ0M+QEFARUVERUE7Nz5DQkI+Q0I4O4+akZaalJKUjZCUlI6VlI6Pi4yJk4uIkJObt8C6xsXEw8zCwcS9vrWvt7uvr7O6wMfFxMHMy8W2ucDCwsTHytHLwsPExsnFzNDNx8zJwsLHwsvLyMfMyc3FxcXCxcXN0MeTi6iLRW25xcnNxsXBxMfBvL60sbCwwr6+wca/vri2w8K6urbAvrWyrKmvsri+tMC0tLi0t7nEua+8vrm+v8K/tbq2q6qsrq+wt768trSura2utaSlqKimmpycnZyeopydmZOQkp2VmKCdmJiVmZmZl46MlH2QkJefmZmYk5GToI6Nko+VjpCUlaKdnKSem56elpyjoKGipKOkop6amZubnJ2enIN9cnx4cGdga2p3bGlmdW90Y11iVFdVU01HOjc7OTk3Nzo3NDg3ODQ1MjM0MjU7Ojk+Oj08Pz04Oz05OTk9PEBBQEVCQUJBQT9AP0RFREVAPDk+QkNCQENBOjSAoZeUmZiVkImUk5aTiZGMlJGOiJaKi5CXnMXLw8O8wMPHwbm9vbu4tre3rrK3uLzAwsDCx8bHurzAwsTHyMbSycHDw7+/vsTLyMrLyby8yMfJzcjDyMnJxcXBwcDBxcbJzrGMXmnE0MfLz8W2v7/AwLq7vbWzs8C/ub/DucC3u8G8uri7ub27srCvsKy5wri9ube1t7q9xb24xsjCwcLGwr28tamurrCwr7O6t7m2sK+tr7OppquprqannqSlo6OjoqCblZiekZecl5GRlZeZlZmRlJiSlYyYo5qcnp2FiZ+TfJKWlZKUlJennaCipJ+en56foaGkoqKjoaOinJ2fnqOhppl5enl/cnBmZWZja2Ria21ub15ZXVZWTlBKRjk5Ozk3Njc3NjM3ODk1NjEzNTI3PDs8QDs/PDw6ODo8OTk4Pj1APz9GP0JBQz89QT5ARENDQTw5PENBQ0RBQDozbKKdlZedlo+PmJiZmIiSjZGVkI+Vjo6TlpbKy7u5urnBu7q3vsG8vLu5sa61uri4u8S6vsC+vru8wMXBxsK+xsK5u8O6uLm8vsHHwca7ucjIw8XEwMPBwcDEwcK9vMHBv8DJkz+U0szFyNHBr729uLm7u763tLC5vrO8vrG5tbi7tryztbm2uba5t7GtusG6vMG/t77Ev8bDw8fHwrvAwr/Cv7iys7O1tLGut7S3tbSxrK2xp6Wlp7CtqJ+nq6ajqKWmpqCgn5SYmZSRkZWUl5OYl5qhnZ6hnKGdoaWglpSbkZeXmJqTnpmZqaSlpKWdoqCanqCkoqOcoqGjoJ6cnp6ppaiVfXuDeG5mYWViYWNjZGpjZ2NbWlpdWVFPRT07OTo7Nzc5OTY0OTk6NTMxNDUyNzo7OkA9Pzw8OTc3Ozo5Ojw+QD8+RDxCQURAPz49QkRCQkI+OjlCP0FCPT44NVmfnJiTmZaRlZiYmpeQkZCQk5GTlJKSkpSUxce4tbq5wrm5vMPFwri7ubGxtry6tbnAu7u5tre0tLW/u72/ub66urTAuLW3sq66u7fAt7zJzsG7v8C8u8S9usDEv728uLvAxatIlczEwMDJv7DBv7q3u765tbi0uLy0vbi1tLCzvLG3tri/tr25vb65t7q+u7/Axb29y8PGw8TAw762ubq2v7i7v7y4trOyq7CwsrWzs66sq6emnqeurauiqKumpqqjp6iqo5+Ym52bmpicnJiXnJuhpZ2anqGhoKGmoJqbnJiboJ+dnJ+coKiho6SknaKfmqKgop+el6Shop+dmpieqKWhi3x5iH1xZGFiY2hqZ2dqZWpeVlZUWU9TTEY4PzY7Ojc3OTs2NTo7PDYzMTM0MTc7OTg/PT47PDs3Njk5ODo7PUA/PkA9PT9CPjxAQUNDQT9DPTo2PEBBQDw9ODdJlJibj5OUkZWYlZGWkpWRkJGUlZSTk5OYlcHCwLq8ub62uL7EwMKxvbqytLO4vLW3vMC8vbS0sbC1t7W7wbi+ub+8vLe0t6+ut7W5v7vB1I26v7vDtbrHt7a5u7y4ubW6w8mpTI/Jv7+7wb65xr3Cv7zFuLa3tLi2tru7uLa0t7q1s7i8vbm/ucPAwLu5vLu+vcjEvcfEw7rAvb62sra4srm0usLCureysaysq62yr7Kur6ijpJ6rrKyqpKakpKiqoqemraihoaGmn6Oiop6bnKKfoKOdnJuhn6KgpKCem5eZn6GdnZ6eoaWkoaKioZ6ho5yinqCZnZijn52eoJqZoKKmnYR6g4F5cW1lZWZwamVsaFhZT0tLS1JKTEhEOT44PTs2Ojs5Njc8ODk4NjA0MzE3OTk7Pz0+Ojw6ODg5PDg6Ozs7PD1BPj09Q0E8P0NDREA/Pzw6Nz5CREE/QDg4P4mYmoyMkI+Tl5WMkpCakpGXmJaUlJKQmZTDvsbBwby8uLi6v7a8scK2tLyxtLa4s7q9v768sq2vrLGwt7y3u73BxLm3t7a1ubm6u7+8z8R4qsu9x7e5uK22tLe5s7WyusXJnE2Eyr+/vr28v8jDxcW+xri1srK9uLi4vrq6uby6urS3u7q5v7zEwL+5uri/ubvFxr3Fw8Kyur27sa+2uLO3s7q+wLm2rLGrrqmqqa2qqq6mpKWnrq2ppaOio6GkpaWmoqato6Klo5+ho6Gcmpyhn6CloaCenZygnaWgnpeVmZ2fn52gn6KmpaCknpybn6Ofn5mcmZ2epJyWnKOcnqGcppZ+f4Z8a25xZ3FrdGZibmBcVEhLS0RKQ0NHPzo7OD48Nzs7OTc4Ozc8PDYyNzUxNjk8PD08QTs8Ojs6OT45Ojs9PUA+RD89PkRAPz9BRkQ/Pzw9OTc/QUNCQEI5Ojl3nJiLh4uQkpOWjY+TmpOQnZiSkY2PjpiSvbfHvsO+vbu+vL22uri9ure9s7OwuLi1uby7wLeqraSusLi7sr2+u8S2tbi1t7++xLzCxNeudYK8yM/CwLiutbW7vbe5sb7Dx5FUf83Dwr++vbzHzMfHxMe9tbW2wb27u7/CusDCv7y2t729vcHBwL+8ube8wru3v8W7wr++tbe8vK+vt7awtLO6ubq7r6mtq62rrKaqoqeuqKWqra2vp6Sgn6ajnqKjqKOjq6Oiop6dm5ublJaZnJyfpZ6fnpmYnpejoJyXmZqZmqOjop6jo6egpqCbnaCjnp2WoJmcoKCblJegn6WcmKKQgYaAcmZsam51b3hjaGJcY1FLVUhFRUNHQzw7OTg9Ojc6PTo4OTs3PD01MzY1MDY4OTo8O0A9PDo+PDk+OTk9Pjs/PkM8Pz5APz4/P0ZEQEE/Pjo3P0BDQz9APTo4ZqGYj4uNlZKVlY6PlpmVl5uVjoyMjY+bk7m2wbS/vLm8w8C+wLq1trKywLmvsry8sLe7tru8qqqjsLm9vLK8vrzFuLG4ubzGycrCx8nSmXJ0rtHRzMrEtbq/xMi+vrS+wL9/YXbLxsK+wby/w8zKx8XGwLm9vMS/v7/CyL3Hx8XFvLrEv7vBv7rAvLu7wMS9t7nCub69t7S2uLqur7WxsLCytre0t6yurKqsrKuoq6Gms6qlra+trKippaOkp5+io6Onoaeiop6cnZyamYyQlpeZnaKZnpuVkp2UoaCdmZ6fmJimpqKfoqKmoqeloqCko6GbnaCbnKKfl5WVnp6kmpafiYGDgXRvbGx0bGxuX2NfYWJOSE4/RUA/REM7Ozo6Ozo4Ozw6OTw+Ojo+NDQ1NTE5OTo5PDtAPD89PTw4PDs6PDs7Pz5DPkI+QD89Pz9FRUJBQj87Nj9CRUQ9QUE6OlmfmJOSlZqVmpOQlpeclZuZlpSVkZKTnZm2uLaxuru6vsG5uca7trWypb69tLbBv66zvbS4wbGwsbS7xdDCur68xL63vMC/yc/HyMrKwYZzdKbMzMvNysbCw8vOwby4vLqweHFpu8jEwMC/xMDKycPDxMO5w769ub+8wsbCyc7Hxr66xr26v7m3wLm5vsDCvrW0vLi2u7CvsrK1r7Cvrqyus7CzsrirsbKxqrCrq6yrrLatqKyusqarrKmpoaWgpaakrKSmoaChnqGgnaCMlJeTm5+mmZ6emZOYnZ+gnp2eopuYp62ooqSgoKKqpqmhqKGlm6CgnZ2jn5SYmKKdp6Gfm4J7eoh7bW14fGBxY1tfYF9UST5DRUlCQz5DOz42OTo7Ozs7Ozs7PT05PTU2NjIxODo5Ozs6QTs/PDw+Nzs8Ozw9PTw9Pz5BQUE/P0FCQUVDQkRAPDY+Q0RFPkJEPztTmZuZmJ6dmqCalpyZn5KdlZ2boJWWlJqYur20sLu8wcTCv8XGura5sqO7vbS3xLuwtbq2ucS4tLy3u7ur2sO+tr7Avr66ppyqsrbDwKV5d3qcxMbLyMHDwMDJysG/u7myoop/da7IxcS/wMG/y8fCwMjAusK7urO6usG+wMrOysS9tby8ub+5ubW1s7/Avre0s7S4rbeqr7CwsrGvq6+nr7ausrG5rra2uLSzsLGttrS6sa6srranrLKsraSjoaenqLKrqqWkp6elpaCml5ujn6SmraKeo6KanaWiop+foaWenrC0sKSlnp+kqaevp6mgq6CiopqipJ2anqGmp6+psZWCe32Cem5zeHRocF5cX11aUkZFRE1JQUQ9SDs7NTk7Ojw8Ojs7Oz0/Oj01NDUxMjc4ODs8O0I8Pz46OzY6PTo7Pj0/QD87QUFBPj4/QkBBQkJFPjo1OkFCST9AQkA7TJqdnZ6fnZienZmampySoJWbnp+blZGRl8W+urbDvMbCvr/Ixbe1uLe2ubu0r7e3srWzt7m8u7a7u8S3ba3Ovba5wLyqfW5obm1ygZaYdHh9mb2/xsC5wLy+xcS9vbixrqCfjI6dysLDvL2/v8PDvr/HvLy/tLSutbW8vr/OzcvCt7K4t7e9ubuxtrLIwLu2tLGwt6yzqbCtrbS3r6uuqrG1r7Gvt7O6usC/tre2sru6wLWyrbO3rLC6r7KloqWrrK+5s7KosK+xr6qiqKGkraitrLOun6inpqWmq6Sknqaqo6ayuLOrpZyfp6anrquqpbClpaWbpKOYn6exrLW4sLKOhHl/fHdtdXtxb2pcYGBaU1BBRklHS0BFQ0k8PTY7OTk8Ozo6Ozo9Pzw9NTU2MTM2OTg8QT5AOz1AOzs5PD04Oj08QD46Oj49Pj09PkBCQkJBRD03NDU9REc9Q0I/PEWUnqCgoJyXmpiYlZmdmZ2fmp2bnJaRj5LDwMK9wrzEvLy7xbu3s7e2tru7s6CWtayvsbS0tLa4ucDNsnWBs722tcGkhmlaXmBNUltbb3R4g6K4uMK6s7u3u72/uru7rqKippefgL7Ew768v7u7uLbBwrW/urWur62wvcC5z8rJw7GwtbS0vbq+urq7ysO7uravsL2xuK+ys7C3vbaur66wt7CsrLK2vbzEwrq9t7bAv8G3tbC2srGzurGxr6err6u2v7e1qbqztbmxp6uop7ausrG1uaisrK+qr7CqqKessayytr20saykqKuoqKusq6i2qaaonqadmKOuvLG7wbSmiYF7gnpzdnZ3b3FhX2ZdW1VKPT8/R0c9R0NDOTo1Ozk5Pjw8OTo8Pj4+Pjg4MzE1Nzg5Pj9BPzs6Pz08Oz09OTs8OTs6Nzs+PT1DQT8/QUJEQkE8ODU4PUNGPUREPzw/iZ2en52Xl5WUk5aZnpubmpuYlJ2Uio6Owb7Dwr6+vrm2usCxtbGzt7fCtbOrrbOoqa61r620trnCyaaEeIqgr7WcamZnVllgSUlNUFRteIinsLe+ubK1sry5vLa5vrWVpbWlrXatycTAvb+5s66yvLquu7Szpquorbq+uMvCv76sq7Cvs7q3ub67wMXBu7y3sLXEtb+0uLu0u8PCs7a2sbisqaWrsr23v7+7u7exvL28trGvq6uprbOvsLCrsLSpuMC2sqm0tbC3tq2spqu7s660uMKwsbG1sbK1saywsri4ubi+tLGzrqyxramvrqqyuK6trainoZ6ptr+4ur+wlol9gHxxdHd0d3JsX2NhXF5PSUI/PUlERk1EQDc3NTs6OT48PDk4PT47PT86ODMyNTc2OD8/Qj86OD4+PTw5PDk7Ozo8Ozs6PEA+QkI9QEE/QkI/PDs3OjxBRD5CQz8+QYqgm6GdlJiVlZKYmpyWm5WalY2bj4SIhru0vb+7vLm3s7y8rLOytLS2wLXAr7Kzqqqxt62pubO3v8apiHx2jKGYX1NDWFVHYWpWT0VKYY6ira+2urW0sqy8ubi1uMG9i565q651psvCv7m6ta6lrLOxprCtqJ2gn6WttrXCt7a0paiqqLC2s7K6tbu7u7W4trC1xLK+vL+8ubrFybq9vraxp6SeoamxrrW5trKxq7S2trGopp6gmaWmpKynq6y2qa+6sa2kpq2lq7GrrKmtuLawsrjBtrGxtbGvu7ayt7W1sry1urKwsbKutLKqrq2nuLWyta2uqqiosrq9wLa0qY6Ce393cHxvdnNuY15nWV1dU09OQT5KQkBKSkA2NjU7Nzg+Ojs4Nz4+PDs/OjkzMjc1NzU8PD48PDg+Pjw8OTk5Ozs7Pjs7OTw+P0E9PEJAPz9CQD47Njc6QERBQ0E/QUKJoJ2loJSWmJiVnqCcl5uYmZGMmYmDhoS1r7S7u7S1sLG2uq6wtLOvtbq1urC1s7KttrqvrbyzuLi/tJCCeYiQbk5LP2RZQk53gJRpTUFdg7C1s7WytK+su7q4trm/xnaHsKScZqm/uLWysa2tn6Smp52kpZyWmZmZn6muuayrq5+lqKSrrq+nsKuvsbGtsa6usLmwtLy+uLm4x8W8vLu4qaKcmJufp6assq6zqaapqq6popqXl5GcmpijnqKir6ekrKaompqemqGnp6anqa+2squ0trCqsK+xqbm2sbWxrqy3s7avrquuq7S1ra+rq7GtsbKoraurs7W3ur2wq6GLeoJ5cnZzbXVqbF1ca1VeXFBOSERHTUJGTkY4NjY1OjU6Pjg7OTc8PTo7PTo5MjM2Nzc3Pjs9Pjo6Pz48PDw6Ojs5Oz47PTk8Pj1CPDtAP0A/QT8+OjU1OkBFQkRBQEJBiJ+ipqGYm56dmqWpmJudmpmUjJmHhoeGrq2uuLmxsqiur7iyq7CwqrK1ubm+tbK4tLm6trm7tbWzt7aVjIiEfFhGQU+HWUpKWHeNgWJAU6O5s7SysLGtsLm4tru3u7yRo7OtpHSssKmrraujqKGdnZ6Xl6CVkpaXj5ifqK6ko6Sgoqaio6mpoaanpaqtp6ynqKesq6yyu7SztLm6trK2ramgmpaWm52fq6yqr6Oko6GpoJuTjo+QlJKSmZaanaSloJ+ep5iVkpSZnqSjoaWqrK2iqaqppKmtrqW0sa6xraqprq+wraWmqqSos66trKmmpqmrpqqnq7Ksr7Oxq6mWgX+Bd3J5aHV0bmVVYWRXXVJPTUlASVJETkM9ODg3NTo3PD46Ozw4OTw7Ozw7ODI0ODk3ODs7PDs4PD0+Oz08Ojk8Ojs9PTw6OkA9PDw7QD5CQEE/Pjk1ODs8RkFDRD9BQYijpqKjnqCfp6Coqpufm5yZmI6Xi42PjKqpqLGvsK2lp6ayr6mmq6CvsLu1vby4wMG+vLy8ua6sr7K8qZiZlGhNP1J4cVBJSUtonIBaRVKuu7Gss6+urK22trK0ta6pp5+am52fpqieoKipn6GnlpuWl46dlI+Qlo2Xm6SooKCioqGlpZyjo6CepaCkrKWmqKSio6OrrLOuqa6urqeqraisoZyamJmYm6qoq6ufpqKbo5yVkIyPkJCTkJeVlpifnp6amaaXk4+Slp2ioKWipqSnoKKko6Ghq6uksq2qrKyno6yuraufoaKkpK+srKmmo6KqpKqqpKmrpqmsq6ahiHiDfHZ/emN4bW5dUWlVUE9HUE1NQ1BRQD47PjQ5OjU7OT07Ojk9OTk8Ozw8OzkzNjk5Njo7Pz06ODs6Pjw6PDs5Oz07PDw9PjxAPT88ODtAQEE/Pz45NDk8N0FDQkQ9QEOOqqSjoqGinaulpqimoZ6dmZ2PmJWTkJWnpKGmqKmlpKChp6uhnKKbp6u1sry9wMLCwL7AuLSnpKyovcKqpb1oRFKdglFXSUpgSlWNYWRjga61qrK0rqqrr7Cys62lnZGXk4+XoJ+ioJyjpJ+eqJSblpaMl5GNkJeTmJ2iqp+fn6Cjpaicn6ChnKKfo6ionKehoKSfrKisrKCpq6agpKimrKOenp6al5qrpqqxo6WonqCclZOQj5GRmZCWlZiXn5icmZukmZeUlZqdoJ2nqKWgo6Kho56doKmqpa6upqipoaKqrqqnoaCio6msq6eppqShqaKlqaalpKKmpKijkn58f3V2fW1re2RoVlJkTkpIR09TTktOSDxFQDwyPzg1OTs+Ozk5Ozg6PDs7Ozk5NDg7ODc7Oz48Ojk8Oj07Ozw9OTw8PD49PUE+QEJAPTc6P0FCQEA/ODU1PDpAQ0BEPkFGlq6koqWeo6KpqKipqqWmnp2imJiZmZWbop6bnqOioKOgoZqgmJeXlqGorK62t7q5ure3u66ooKGpoKrGv8qgUEFznXZPbUpLY2Z0c2BcYHKQsa+us7WqpqyropuZlI2RlZaYmJyfoqKcnaSemqSXl5eWkJKRkZOal5ugpKqeoaGepqerop+gp5+dn6SnqZ6jpp+qnaqtqq6nqLClo6Smp6ymoqWimpmer6iusqumq6qgm5iYmJWTlpqTlZWalpuXl5ihnpyclpuhm56ao6eln6GioqOdm6Gmp6aoraOppZ6kp6mkpaWhpaSsrKmmq6eioKSjpKenoaCgpaKmoIl7gH13eXxleXpgYlNVYUhJSktTVEpTUU05P0E2Nz02NTs6PDw5Ozs4Ojw9Ojs4NjU3OjY5Pj0+PDk5PTk9PTw+PTs7PDo+PTw/Pz9APT03Oj5AQEA/Pzg2NT08PkFCRkBAR6CupKaroaOqrK6tp6ypqKCipp6bm56aoJyalZmfn5uen56WlJOXk5KcnqSorq2sq6uvqq+pnpeepZykxsaMV1NKZaRaZX1vcltRa2NbZWFea4+0sLC4rKahnJ2alJeamZCOkZWRjI6Nk5minJejmZqXmJmUmZiWnZufpaapoKajnqeurqumorGjmqSmpqqioaqiqaSosquxsqu5qKarp6urqaysp6Ggo7GusrG0qrKuo5mcnZ6hmJubmpeZm5SWm5aZnKWhoJqjoZqcmZ+kop6gn6KmnZulpqWkpaijp6OepqOinqaloqWlqKykpq2noJ2eoJ6gpaGenqWgppmBe4F8dnZzaYJsZltTWlpNUUtPT1ZNU01CNz5DNzg9NzY6PDw9Ojw5ODo7PDo7OTc2Oj01OTw7QD03ODs3PTs9PT06Ozw4Pj09QD5BPj4+ODg8P0BAPT43NTg9Pj1BQEZAQUihqqCrq6GkqquwramtqaelpaWkoKGfnqWXl5SYmZ6YnJ2blo+VmZKRnJihnaqip6Cep6Gln5ySm6Kan6qjjHlVaXF2dXBjdnZYV2NgY2haWVdnra6sr6efnqKglpCTm6CbmZeSk5+coaObnpuWn5qfl5uinqWhnqSfpKitraisqaSstLe2sKe0rKKtraOvpaSmoamorrWzsr22vrCssa6tqaq0sbCoq6iztrizuK2ytKSgnaWgrKGhoqGgmpiWlZ+bm5iloaCeo6GgnpucpaCfnZyhqJ+fp6meoaOkoKagnqehn5ymo5+ipaOooKmrpZ+dnZudmqainpyjnqeQgYKAfXh2anh1XW1bUmFJUlVIRlVXSkNNRz1LSThFPDc3Oz49PDo8OTg6Ojs6PDk2Njo8Nzs+PT8+OTc9OT47PEA8OkA6OkA/O0A+QUA9PDk3Oj5APzo+NzU4PT0/QUBEQEJGnKueqamipamprqimqqWmp6aoqqGlpKOmkpOVmJacmpqcmpWTmZuNk5+ZqJ2un6eenKGdnpqZkpiem6GhoKOAb4JwYGNYTFtSWkxLUFhSSE1NR5isqqmkn5+ZkpKUmJiWlpaMiIuOlZ2cnZ2el56Zpp+gqKWxqqeuo6uutrC1srGutri9v7qttbSwt7CutKmmpKWsqbmztbvDvMPBtrq2q66xubi8r7OwtcK8t76zs7WirKKpqbKpq6inqJqZnpqqp6CZp6Cfn6iopaSenaqiop6bn6igpKetmZ+jnp6nnqCmnpycoqGbo6KhnZympaWkn6KZnJukn6CboJyjiYWFfnZybWl3bWltXFhcQ1dOSkdNSENGTj0+TD40PDk2Oj0/PDs6Ojg4PDk6Ozs8NTQ6PDg5Pj4/Pjg4Pzk8Oz0/Oz1BPTo/PjxAPj8+Pz08Njs/QT07Pzg1ODw8QERCREFCQ5WqoKapo6mqqKmjoamgpqinrK6lqaWpqpSSl5mUmpqanJiYmZyamJmqoLGit6Swpp+enZ2XmJWZnpqco56dimJXXmVgV01RRz0+P0NDPz5CUXipramqpZ+en6KjnZ6dmp2blJOVlJ6dmJSFnZqgmqukq7KwubKysbKxur28vLm2uMO+v8K/trq7wMS5vbusr6exrbHCtrjCxsDIysDJv7C5ub25wr64tLvGxL3DvLezqrOtqrO0r7Ouqq+jnayotrGto7CmoaOwsa6wpKWvo6GgmqGnoaSqqpmdoJmao6CmqKGcnqKemaSenpiYo6OhpJ6mmpuipJ6fm5ubnIeGgXx0cmtsdXJxaFdcUUZVSERKUEk/RUI0Rkg5NTw+Nzs8Pjw8Ojo4OTw4OTs4Ojo4Ozw3Oz49Pj02OEA5Ozs9QDw9QDk3PD07Pj0+PUI+Pjc6QUA+PD45NTg9Oz1DQEFDQkGRqqGlqqelqqimn6KnnKasp7Gyq62jqayVkpWalJecoqGbnqCinJ+psqu7sr+rr6ylnqCgnJyYmp+gmqCflXxfXmVgUUZEO0M+Rjw/OTZOfqqzp6OjoqCepaumnpeclJGanpmVjIqGiIZ4bYigpKKrrLS8tsO9vrO7wcPCxcC/wsbFxcPIwsDFx83QyMvDsre1vrK+xbu+zM3FzMzM0se+v8DDvsfGwrfDysnDwce/urS6u7W7t7C2sqq6sq68uL+7uqu4rauquLu1vK6uuKOmo56mpaKjqaaZm5+Zmp2nqqegoaGkmJSjlpSZkZydn6Sep5+en6KdmJmUmJSIhX56cmtkaW94amVaW0ZMTUVEVE1FQ0U3Oj87NTQ5OTc5Pj87PDs7OD48Njo9OTw9OTw9Ojs9Pj4+NztBOj45PT45PT44Nzs6Ojs/Pz1CPj83OkFAPTw9ODY2PDo8QT9BQUE+kqugp66ooqulpKKipaGlqquwsq2upKmmlJWWmpaUm6SmnaGqp6KrrLy8v8PBsrK4p6Ghq6qhnJ6hoZ2bmn1zamFXTkU+SVl8b2FCPVyOrqygmZubnp6Zl5eXko2Pl5eUj42QjIKDgndycW1wj6atrrS5xbvNx8u+wczNzczIyNDMzMzHysXGzNDS1c7Tyb3Av8O7xsXIxdHTzdPQ09PMysHGxsbKyM/AydHNx8bIxsK8xMG+v7+2vrOtv8DDw8fEx8Svv7myuL3EwsK6vLy1rqenraigoqmlmpagmpmdqKupo6SknpePm4uQmYmVmJugn6OdnZeempOTi5WPhYF5dHNlYmdyb2ZeWlpET01ERVBJRENBNTU1ODlCPTY4OkE+Ozs+PDk+PTc6PTk6PDg8PDw7Pz8+PD0+Qzw7OkA9Ojs6Ojg4ODk7QT48QD8+OTtBQTs7Pjc4Njo8PkI+Q0FAPpOvn6ivpqiro6KloKampKuoq62qrqKqo5Kcl5ebmJuirJ2frqalsarFxszOzb+wwaikqKytqqCdo56cnZVqZl1USURAP0qFnqSZg6CyraOenJ+amJeUkpSWkZCPjIeEhIiGg4CBgYB5cXJvbHmktrq5vsvB09HTyM3O0dPR0tDQ0dHNzs/Qxc3U1djR183Gx8nMw8XKz8rT19HX0tXW09TIzMbMzcnTzc7TzcbJysrCxszHycnGv8Ozs8jFy8vLz8fKv76/vcHHxczMycnAw8Cur7OonqKqo5qTnpyYnqaprKSlppaXipWFkZSHkpKSmZualpiQm5aQjIaRi4B7cnV2Z2NndmpkVldSRE5GQElRQz5CPToyMkE8RTw3OTxCPTs9Pzs7Pj05Oj48Oz44Ojk5Oj86Pj1APkA8Pjs+Ozk9PTw5Njo6Pj08PEA/Pjk6QEE6OT44Ojo6Oz4+PEE/QT6QrKKiqaanqKSfop2qqKOso6OnpqyiqZ+To5iWn56dpK6bn7CrqKyxyc3U18/Gu8esrbO3rK6jnqOinaGbYlRMSkRDP0NSr9G9sq+mnJycoKShnZqUk5WUiX14cWtlYmhycHJ7hYqAdXBucXNwhbPDvsXR0NfW1dLWzdTW1tTT0dLT1NLP0sPQ09bY1dXSy8rO0cvGzdHK0tXW2dbY09bYzdLKz9HMz9HM09DAycjKxMzMzM/PxcfItsDLwNLNzNDGysnAxMPIzs3Q0c/NysjNuLe7qJ+lq6efmJ6jnp2qpa2pqKiSlYiQhIyRho2MiJOVmZCWjJiSj4aHjIR9eHN2cGNgZXJjXVJcSUtHQUVJSj47QTg+NTU4Njs4Njo8QD07Pjw7OUA7OTo8Ozs8Nz09Ozo+Oz08Pjw/Ojo8Ozs5Oz89OTU7PD48PD0/Pz46O0BCOzk/OTg7PT0+PzxBQEQ8hqugnKegp6Oim6CbqaSlqaCfoaGmn6ifmKSimqmmoqarmqOwsamotdDU19rSx8bLtLXBxbG1qKGkpaCioVpJQEFEQUZRdrGvppqUl5+cmqCgnpucmpWJd2ljYV9fX19eX19dYWx1c3Bwb2xxcXWSxMjH1NbX19bT1tDV1NnU1M7P1dTU0dHM0c3T19bT1dDP0tPRydPRyNDY19jR2NLX2dTWzM/Pyc3Sy87RwMbDyMbPztHR0sjMzcDLzcbUz8zPyMTLx8fIzMvU1NHVz9LM08K5xbGlqLWup5uoq6Wdsqiws62sk4+TjoiLjoOPi4SQjpmNk4+Zj4+ChYx8enFzdG1iY2ltX1ZRYEpKQ0VDUk1APD40Mzo9NTI4NTU8PEA8Ozw6OTpAOjg7Oj46PTg+Ojo8QD08OTs9Pzk6Pz07PTw9PTo2PD0/QD08PT0+OjxAQjs5PDc0Oj48P0A9RkFEPYKknKClnaWlo5mcnaSeo6OfnZ+doJqnnpyhqZ+vraqqq52lrreoq7fX1NXZ2dHO0L+8zMm2vq6mqqiho6tmQzg9PkRYgqqon5eVl5manJ+dmJyckn1xZWNiX19hX15hYF5hYF9gZW1wcG5rb3J2d5zMwdPV09jY1tnR0tLXz9POy9LN1dTRys/M09bS0dbNz9XV0cXR1MrQ1NXWztPR2NfX18vIzsTJz8zKzMDKwMnKzs7Py9DOzszPz8jM0NDLzsvDysfJzcvM0tPO1NLR0NDKvci5sK67ubWrtrCtqLits767sZqPoJSRjo2IjpCFkY2ZjJGRlY6RgIWJenZvcG9rYWRucGFYXFpKRkZETVhFO0A9MzM8PDg3ODU1Oz5APTk8PDg8Pjk8QDtAOj04Pjk4Oj88PTg7PkI6Oj08OkE9PTw6Nj08P0A9PDs9Pjg7QEE9Ojw4ODs+PD4+OkVCRT6Bn5mlp6Cfo6eam5+cl56eoZqdmpyappufpKefuLa1taykrK6+tLDA2NLX2tzWzs3Kw9LPwcGxqaytqaSxe0hGQjtXjaGblZOWm56enpyTlpeUiGteXl5hZGJgYGFhYGFgXl9fXlxibXJvb3N0dXZ5pL/M1dHW1NPY1s7O08vOzsXOytLSz8fOzc3Uy87SzcvX1tDM0dTLy9DS08rO0dXS1dXKwMrBxs3CyMrDzMTGyMvLz8rOzdDO1MzGyc/NycfLxcfCxsrMzdDSx9DPzs7M0MXHwbi5vcPDvcO5s7K+sbvDxLWqmKWhmJaSlZWSi5SNmpGUlI+PlYKJhnlxcmttaGBgcWhZWGhWTUdMSVBRQjtDPjs2ODo4Ojs1Nz09QTs6PD05PD05PT06Pjo8ODs9OTtAPD47Pj5BPDk9Pj1CPTs3NzU/PDw/PDw7PDw4O0FAPDo8OTs7Ozw9QTpFQUU+hJ6bqK2epKSqnJ6fmJKXm5+am56ZmaKVoamppcTCwb+7tbKxx8K4ytXW2drb2MzMz8jW1cTCta+0qKCtl3hsb3B3j5qNjJeVkJORkZWWlZCLfGVhYmJgXV5hY2FgYGBgYWFfX11bXWdycnByc3Btcnmlx9PPy9DQ09TJxMjJxca/w8XPzsfFx83K0cjLzs3G0dLQzszUysfKzs/Hx8/Sy9DPxbrEv8bKvcPIyc7Fw8fAx83IxMzKzM/IxMTQycbCxsnFv8HHzMvMz8LLzMnHy9DFxce7x8PJycLPwb28v7DByce5vKqwsqelnaKcmJCbkKOZl5mRlZiJj4J4b3Vka2BeZnFhW1dgR0hIR0lNVEc/Sj02NDM1NT09NDg9PT06Oz08OTo7OT89OTw7PDg6PDo6QD1APD09Pjw6Qz48Pz04ODk6QD4/Pjw7Ozs7ODo+Pzw7Ojc5PD49Oz49RkFDPYOgm6qupa6qq5qdoJeUjpedmpmgmpqcm6WysazJzcrIxL68uczMxtDV1dja29jQyc/P0dPIwre7u62ktn5ngoWiqpONjZaPhYODg4F9hIR+c19bXl1eYF5gY2RjX11dXl9gYF9bWlxgbHJxbm9rbG9vfbnRyMnKz8vNxLq/w7q7urm9yMbCw8DDyMrIyMrIwcXMxsjKzcnEwcrJwcHL0MXLyL+5wbzGx77Axs/LxMDDu8nHybzJx8XKwb7Cy8bFxL7Gvb3Bw8XMxca8wMnDxcfSxMHJv8rKxsjG0cPDxsOuxMvHxMq3v7y6tKmspKWYn5iso6Gmm6Ogm5V8d3N1ZmpbYW5tWlxYUkRMR0JHRUxERlNANTQzMzVAPTM6PDw7OTw8PDg7PTtBPTo8Ojs3Oz05Oz07PTs6OD4+PEI+Oz88OTk7Pz07QD48Ozk5OTk6Oz06PDo2OTw+PDs+O0NCRD5/pZypsqm0rrCdnp6YnImUm5man6Kfmp2ov7i8ys/RzMfCw8bNzs7M1c/V2djZz8vSzc3OyMG1w76ysLZsXnl8n5GKkpaGeoCFhX91eHVycF9aW11gYGJjZGRlZGBcXF5dXl5gW1laXGJvcm5raWtwb3OPx73JxcvAxsGwtrmxsbOyscK8vLy6uMDBwcS+vbm9v7nEysXGwr3GwLe7w8m/wcm7tru6xsO/vMLOw8a+vrXBvcO7vce8w7q0vcbEwsO3wLa2vr+7zMO9trrIu7++y8PBxsPGycfJxtDGwszHssfJw87MwcXDv72yt7Cyp6ioubClrbCqrayUenZ4a2VoYGhvZFZeWUpGSkZIS0FGQkZJQDk6NjU4ODUzOzo7PDk8PDs5Ozk6QD46Ojw6Nzo7Nzo7Oz88OjxAPUA/PT8/Oz07O0A8Pj4+Ojk5ODk3ODo8PDw7OTo8Pjs7PjpAQEU+fqygrLWqt7SyoZ6fl5qNlJaan52mop2et8XCxMjO0srKysfNzc7RyNDG1dTV183KzsXJxcfBusW9rK6mYGN1gZKLiIuEeH+Ghn99g3t0dGNcXF1eYGBiY2JiZGViXVxbXF5cXl1aW1xeaHNxbWdnbm9yeZ29y8HDusC4rbCwpqmtq6a4tLa0s7Ozu7a9sbewtK6yu8K8wcS8v7q0srq+wLjIuLS8tsHCvbi9x8HEu7WvsrW6v7TFuLu1rLm9vsC9sbu2sLe6s8a8t6+7v7W3tcW8v8PGwMTFxsfLxcDGxrvHy8DOycfDxsHDt8O9vba5vse/rLW7tbe2jnl0eGdnZWJrbl5WXmBGS0hISkZCREFFRT89OjU2NjYzMzs6Oz06Ozs6Oz44PEE9PDo7ODc5OTk7PDo+Ozk+Pz1APz5CQD1AOjo+Oz89PTk6Ojo4NTY7PT48PDo7OT49OT86PEBAPIi3pauzsby8sa2foJmUlJiXnqujr6qnpMbLzcjFyM3M0MvNyMnIysnKxNDN0s/NxcfBxcG/urjJt6uwmVtnb4mOhoiJenh+hoZ2d4F8c2hdXV1dX2BfYGRhXmNlY19eXFteW11eWltbXV9scG5pZmptbnJ8pMa/uLi0r6qrp56hqaaeqqyyraqsqbSttrGzqa6nrLO7urbDubq5sKu0ubu0wrmvwLG+vLu2vMe5w7etqqiwssC2uL2wsaixs7W7vKyutqautq67srGqubCuu668uLzAwL66w7/Gw8XAvMbCyMu4xcfFv8fEw7rExsK7xsnMy7O5wr27s4l0dndraWBibGlZV1dbQUxLTUpFQUNARkE6Ojo5OTY4NTQ6Ojk7PD07Ojs+ODtAPD05Ojc5Pjk7PDo4Ozs6Pj45QT0/QD87Pjo7PDo9PDw4OTg5NzY4PDw9Ozw6Ojs+PTs/Ozs+QDyKwKuouLe5w62zqZ2ZlJaZoZymsLWxt6bFztLLw8XBxM/HzcHCxr/ExMPDysLJyr/AvMG6s7W1w66qsJJbaX6SiI6Pe3h9iYV6e4SAd25eXVxcXV9gX19kY2JjZGJgX15aW1paXVpaWVpcZW5vaGZnaWtucoGturC1raWjpqaZn6SfmZukqq6kqKKrqqyqsKOmn6qttbaxvLivt6+orri0tLy4s7yvuLm1srzBssGvpamjq7Gys6i9qquoq62utbSmqK2hpK+psqaoqK6lqLessbO3urq7sry+vr7Ev7XBwcfIt77AxbfFw8C7v8TCvsTIzMq/v8TAwKmHc3RzamlcYW9kV1ZYUEhaUlNLRkZFPj9AOjc4OTc3NjQzNzo5OTo8Ozs8PDc7PTs7Ozw4OT44PTs8Njo9Oz89N0E+P0A/Ojw8Oj05Ojs6Nzc3ODg3OTw7PDs5Ozo8OTc5Pjw+P0E7jMKvrry3ucSwtrCbmZWcmKqpsLGztb2vxdDPzcPHubnLwsu+u8m2vcO+usq3wcPBtLa8trGvtbytqauSY22Ig4eLgHp9f354dH58c3dlX11cXF5fYF5fY2NhYmBgX15dXFpYWVtbWVhaXF9ma2ZkZmVoa29yhamlq6Sdm6Cjk5yjmpeQoKKpo6Kfpaanpq2gnZukpqyyr7e3p7CsqKq0q7S6sba2rra5srC6urG3pKCkoKaxqKypuqqlp6eop7OtoKinn5ykpqyfn6ekoKGxra2ssrWztLG1vba7wcCyu77DwbG5ucKzwb3Atbi8vb68wsfEw8S/wMSghHhxbGJmYGtvYFRZX0hOaE9USEZLRjw9QD06Ozs4MjY1MzY5OTk7OTo6PDo3PD88PDs8ODg8OTw6Ozc4Ojo8OTg+Oj89OTg8Ojs+OTc3NzY3ODg2NjY7Ojo7OTo7PDg1OTw6Pj5AO43Itba9uLrAur21oJ6UnaGmurars7O7s8TPycvCxri3x8DMv7jKt7vFuLPFuLO/wKy1vLKspq+0raGjkmlyhoWGgHx4dXNvbWppaXBpX2BdXFxcXl9fYWNiYGBgYF1cW1xcWFlYWFhWWFtdX2RjY2ZnZ2drbW6HnaielJSZn5SZoZeVi52goaacn5+kpaKnnpuim5+rsK2xtaSpqqqsrKS0uK23sKyztq+zta+wqp+en6SisqWmqrmtoqamoKitq5mgoJ6ZnZ+lmpqjnJyesKmsqKqsra2ws7mvuLm6sLa8u7qrs7O5s720t7GxtrW/tb3AvcPCu7u9l4R7c2xfZV5kZFhUV15JV11LUEdKSkdBPD8/QTs/PDA1NTM1Ojs5Ozg5OTw8Nz4/Oz07Ozg4PDg5ODw3ODo7Ozo7Pzo9Ozc4PDo9PDc0Nzc2NzU3NDY2Ozc5Ojs6ODo5ODo7OTo8PzuJyba4vru4wcHBtKSkmZqkpsCyr7astLfFz8jIwMa7u8PDz765x7i3v7eywrSxu7usubqxop+pq6eYnpBtfoWGf3hybW9ta2JeYWZmXV1eXV1dXF1fYWFiY2NiYV9cW1taWllYWFdXV1hYWFpdYmRkZmZmaGlrcoynm5GSkpmVmZ+UlY+boaGonpudpaaipZugoZqZr66tr7KhpaOuq6iitbCysqypr7OnurOmtqGjn5yjoa2joqq2q6Ojpp6mpqOWmZ2XmZudoJqXnZydnK2hrKijpKatq7O0qrWwsquzubSvq6+ysrO4s66pra6yt7C6trq9wLizsZSGeXVmX2ZfW1lWU1pVS1tRTEpFSEtJQj0/QUFAQToyNDUyNDk5ODk7OTo9PDY9Pzs8Pjs3Ozs3Nzc+Njo+Ozo4Oj07PD06Ozw6PTs4Nzk3NDY1NTQ2Nzg1Ojo4Ojk5PDg3Ojg5PkA6gci9uL2/tr68v7OdpaOYpbHCtba9rbS4wczIxr/FtsHAx862wMO9s7m5sr+2sbm7rbK0r5+ao6qglJqPeH+DhH94b3F0cWhlY2hkY1xcW1tdXVxbXmBhXl9fYF5cW1pcWllYVldXVlhXWFdWV2FkZWNkZWRkaGp2oJqRkY6SlJWdlZeTlp+doJyWoaGopJ+fqZ2bm6umr7CrnKOkuKmgoK+ot6unp62wpLewpLego5yZmaqmoZutubCjoaScoqCfk5ShlJaWm5mYlpeclZ+pnqqkop2jqqqxrai0rKqnrbOwpauus7GwsK+vp6iosq6xtLC8tLq4rqOVgnp2ZV9hV1lYU1JUS01eTFBMR0hMS0U9QD49Qjw6NzY1MzQ5ODg5OTo5Pjo4Pj47PTw8Nz49Njc2PTc7PTs5Nzk7Ozw+OTk6Ozo4Njc2NTQ1MzEwNDU2Nzk6ODo5Ojo3Ojs5OT1AOnbAvLS6wrG+t72unaenoqq7wL3Aua60uMHMx8XCw73FuMjMssHCwa68u7W7vLW5ubCvsKqcmqGplZGKi4CAfHdxaWxydHBoaGVkZmFcXFpZWlxcXF1eXVxbXF5cW1xZW1taWFZXV1ZXWFdXV1ZbYmNjYmNiYmNmaYCTj5KKj5GSmJabk5San5uelZ+fp6akp6ignZ+moKuvpqCio7eooaGiqbOipailsKaxrqy1nqGdlpWpoaKUrbGxn6Ojnp6Ym5OLoZSRk5iYk5eYmJeep5uooaKapKWlq6SlsKelo6usraaprq+vq6iqqrOmpquvtLGuvLaxsK+gknt4c2ViXFtdWE5MUUhSYU1WUE9KTU9FQkQ/OT02OTo3NjQ1OTk7OTg4Nzs4OT0+Oz47PDY5Ojc7Njs3Ozs6ODU6Ozo7OzY8Ozg4NDc3NjMzMjEuLzI1NTY7Ojg7Nzg3Njw7Ojs7QTh4u7uxtr2wu7G3rJ6lpqy3u7zBxbqxubXEycnAw8bFx7bGxLPBv8Wrt7e9tr26u7WyrK2omZmfo4uKdImIfnZuY2FmaWhmZ2lmaWxgXVxbWlpaWlxdXFtcXl9cWllbWVlaW1dVWFdUVFZVUlRSVWBhX2BhX2BgYmRpf4+Ph46LkY+RmpKTlaOZoJacoKWhraalpaSko52qq6Wan6WxqqGhnqWqnqiin66sqqmtraKiopWXopqckKupsJyfop+fl5iTiZ6RjZKTlpCYmJOcoaOcpKGilaCipKWbo6uloqOrpKutpa6yqqalpqa0pqqorbO1tLm6sKusnoxzcXBgW1dWVlJGUE9IWlxPUkpUS1NMRUdKRDg7Oz48OTY2Nzo5Ozo5NzY5Nzc6Ozo9PDw2Ozw4PjU5ODo4ODY1OTo7PDk3Pzw5Njc4NDUyMTIxLi4xNDI2Ojg2OTg1OTg5ODk7OUA5e7W0rLS7srCrsq2dqKevubmzwMi6tcCvxcjMusHJzMi1ybyxvcPJrbG4wbW8wLy0taqsppaanJyJgXKIg3t0aWlqbGdqbG1ramxlXVxcW1tcWlhaXVtbXmBgXFhYWllYV1hXVFZWVVRVVVJSTlFZXVxdXV5eX19iZG2KjIGOg42NjJeRkpGcmqGcm6CoqauorKeppqSZpa+klZmlr6mgnJmboJ6umpyrtKCmpp+jpKGUk5uWlpKpqq2bnaChoZuUkIyZjoyRjJKNlpWQnaGgo52co5WboaOhmKKoo6Koq6CrsKSuuKajpKOsramoq6+0t7K9tbOrr5iFdXRpW1hZUlVSRVhMUVtYTVVPUUxRUklOSkI9Pz9BPz03NTc5OTw8OTc3Ojc5Ojs8PT47Nzs7Oj02Nzo7ODk3Njk4OTo2Oj05OTU3NzU3MTE0MS0rLzQzNDk4ODo6ODo6NzQ4PTg/OX6zraeztq6oqK+um6morLe2rLzKu7a/rMvGxbjBzs/Hs8S6t7vCyLGtuL+3vL67s7amqaCWmJmXiHp0gHZ3bm1obW1tcGdnaWZkXVpbW1tbXFtZWltcXF5fX1xYWFlYV1hXVlVUU1VWVVVTU05PUVlaWlpdXFxdX2BkfIl/iHyJjYeQi5WPlpihn5qgq6qmr6yosKWpmp+toZWWpKinnZiQj5qer5eZp6qZoJ2UpaGfkpGSkZOVqKulmpmZnp6WjoyLk4aJjYOPi5KVkaCeoaSZlp+VmqGinpSbpaWnqaigsLCmsb2ooKOstKqup7C0sLm1wLGusauQfnJ0Y1ZUVk5SSkdWUFJSTExYTkpMT1JHTUtBQ0ZERD5BNzU4ODk7OTo3Ojo3PD06O0A+Ojk7OTo/NzU5Ojk4NzY5NTg3Nzk7ODU1NzY2NjEzMjAtKi4xMDI4Nzc7OTk7ODk0ODs4QDh/tKymsbeqpaKxq52pp6mysKS2xrS5urPKxbm6wcvQyrK2uLy9wMOxsLG3rrS0u7O0o6OdnZiXlYSAdmtnbG5xbnJqb2tkZWdlXlpZWllaWlpaWlpaXFxdXFpYWFhZWVdYV1VVVFJTVVNWVFJOTk5SV1haWVlYXFxdYWp9d3xyhYuEjoeViJOSl5qYnqibn6umpqyeqJmgppyTj5+jmpeXhoWSm6SQlaOdlpaWiKKbm5OMjoqQmqWnnJWVl5uRkoeUjouBjI2AkIuSkpKhmqCilpSYmJWippqNmaSnqaehoLSyqLO4oZyjt6ypraSzsqa1u7WrrLGjinpzbl5OUVFNT0ROTk5QS0ZOTkpKTk5RSU1KQUhMSEhDPjk1ODg4OTo7Njk6Njg7OTk+PDg6Pjk7Pzg3ODk6ODg2ODU3Njg4OTc0NTc3ODIwMzAxKyktLzEyODc2Ojk5OTk4NDk4OEE3d7ampLexpaekqqWgqaaks6qissO1tbKzxsa2usPKzMazrLm9tLjAr66psJ6mrruvraCam56VlYh8hG5fX2ZycHZxaW5pZWdoal9YWFhYWFlZWVpaWVtbXFxZWFhXWVlYVVZSU1JQUVRRU1VRTU1LTFNXV1ZYWFhYWl1hbm9zbYGFf4V+j4KNiZOQkp2hjpqco6KkmKWWopyVjYiZmoxzjYN+jpeWhpKakJSOjnuZj52MgomAipigo56Qk5iWhY6DlH5+dIqOepCIk5CQnZuampKWkJ2Oo6OOiZqgoaSkm6K0r6ywrZ+YprimpbChsa6csbyqqa+qmYN4dGRWTVJQUE1DU05MUE1CUFFISU5TTUhKSkRLTUZLSz03NDk4ODg7OzY5Ozc6PDk6Ojs3OT85PkA3OTo8ODk3NjQ0NDU4NzQzMTI1ODUvMDEwMikoLC0wMjc2NDc4OTo6NjU6ODdBN3i3oaO0qKalqKOlpaamprKnprTBuK+0sMnEt7nBzsa+s6y6waytxK2ooqaSnaa3raOgkJaXkpB+eH9mV1ZfZ2ZpZ2huY2lpZ2JcWFdYWFhZWVlZWVlaW1tbWVlZVldXV1NUUE5QTk9PUFNUUU1NSkhOVFNTVFVVV1lbXWlpb2p8gnpyTVdxjoGWhYycl4uTkZ+YnZWUlpSPloqAlIlfO1ZvfIyUioCMkoyQhoZzi4WXgXmBe4aUnZWDlY6RkIOGfZN4cXCGjX2JgZCOkJeamZOLkIqciJ+YiIiWnpqhoJenrqmtqKielq2zoqaumaysmKi0o6mto5N/dG5gW05TUldMRFRKUE1MRk5PSUVMUU1LT0pJTVBGSUo9NzU5OTk5OTo3Ojs6Pj44Oj09Nzo/OD4/NTg5Ozc5Njc1MzMzNzYwLi0vMzQ0MTEwLy8oKSsrLTM4NTQ3Nzk8Ojc5Ozg2QTl5t6CjraGmpqmgpqmno6qwqKe0wbmwtbDHwrezvc+/ua+utcKnqsSqop2Yg5ScsaOamIeUkIuHfnN2XVBMUVVZWlddXmJnY19ZV1dXWFhYWVpZWFlYWVpaWllYWFZXV1VTUk5MS0hHYlxNTlFNS0lGSE5RUU1PUlRWWFpga2xmeH9yT0E/f5WRkHyIlIyEio2bjpaViZKIhpWHeYl/YEpRbniLkoR+hI2LhYB/bX9/lHd1dniEjZpwUY2IioZ8fniUdmh3hoh+ioiVi46Rk5eMhIqIlISbjYOEkpuWnp2UpKKoqaWknpuwqqGkpJKmqpaiqpyhpqiJdm5nXlxIUVFTTUlVTVNJTEtPSUhGSk5MTVRLUVFPR0pEPTc2OTo4Ojs7ODo7OD4/OTk+PTg7PDY7OzQ3ODs2Nzc1MzQ0Njk2LzMvLjEyNTIyMS8sJykrKiw0ODMzOTg5Ojk5Ojo6Oj85d7aco6edn6Guoaeopaeor6yqtry2uLezwbu2qLnIuLaoqLW2qrK8p56VjX+JlKmWlYt/joOCfnhxb1hNS01OT0xNUVdbXFpYWlVVVlZWV1lZWFhZWFhZWVlaWFhWVldVU1BNSkVAQJtrc3NJTUtERENJTk9oWU5RU1RWWm6CcXR8aGdbU4+JlIhzfoaBfIWMk4KSmYuPe4aPgHaAeHNvdXF0jo6Ben6Kq4V6emh2e45wcm14gYuNknh7gHuAd3NzknhndYWEhIV8lYqIio2LgH+Ei42AlIR8gI+YlJyWkZ+dqZ6foZ2gqaWenZiNp6SToJ+Wnp+kgXNpYl1dSldQUkdLWFJPSk1MUkpKSkxQSExRTFJUTUZJQjw3ODs5OT49Ojs8OThAPzo6Pj03PT03OTkzNzc4NTY3NTI1MTQ3Mi8yLiwvLzIwMC8tKygoKS4xMjcyMTk4Nzo4Nzc1Ojw7N3aumaOhmJ2ftKmvqqWtq7Cxqr20sru4trq0sZ+3urKqnZ2sqaiyr6KakY2UgY6cjpF/doZ3fHZvb2pZS0hISEdFSEhQVFRUV1dTVFVVVVZXV1dYWFhYWFhYWVlXV1VWVVNQS0Y+OTNOPH6eTUhKREA9QURqlH5MT1FRU1ZedIJ7d2V1i5WYjY58Z3iAdnh/iZB9hJiSgHGHj3x3e29rfq19dJCLf3qGkoB8f3RmdnyGbG9oc3yKjYeAbXlxfXFtdo9xaHGBfo5wRIuFgoOFf3d3eoyGfYx7dX2Oko+Yi5Kam6OWmZ2anZ6hnJaNi6Wbjp2XjpaYkHhvbmdjW1hYVVFKU1VUT1BOUFZLTktPT0pST0hOUExGRDw7Nzk7Ojo/PTk8Ojk5Pz87ODs9Nzw5OTk5MjY2ODU2NjMzNjExMjI0LiwsLS4uLTAtKyonJyouMTM2Mi84NzY5NjY1Mjc5OTV5ppegnpagprCsrquoqbGvsau8uKy7vrizrKebsKesm4+WnaWppKGYmY+FknmJj4uLdnF8bXVwam1qWEtGR0VBQENESExMTVFSUFFTVFRUVVZWV1dYV1hZWVlZWVlWVlRTUUtENzhmNzA/qGlOSEM9OzpEioV6WkpOT1FUWF1lcHFrh6aqwH50eGJ7d257eYiQeXyLhm9tjJJ5dHlqaoCCcZaRjIF9lX9JkpluaHd+gm1qZGx5hZCShmtybHxucnyGaW1wf3ONiYWGe35/e3dwdHSGgnmBeXB8jouKk4OWl5iakJOWlpmXnZaMg4mfkouSjYaQl4Bvam9vb1lWWFRSUVlPUlRUUlhVTU5ITUtNT0tDSU5HRkA6OTk7OTk6Pjw5PDs6Oj0+Ojg6PDk/ODY4NzI3NTY1NTQxNDMyLzAyNCorKiotListKigqKCcsLTEyNTAsNTU2NzQ4NUhBODk1d5mRm5ibn6Str6Ktqqi1r66stL+rvMO/paKalaSYno2Ei5ShoZiZkZOLc456gIaMhnRvdGtwbGRsallOREZDQDw+PkFGRkdLS0tNUFJSUlRUVFRWVldXWFlaWVlaV1ZUU1BMRTFAmjMganNDmW87PDk1PICChl9JTU9PUlZaUVlcX6eHYZlocnlkfm9sf3qLiXaCiIZ0bJqSdHR8amqdjk15hZOJhI5mMXaHc2x+foN0ZmV1f4SEhYBmaWx1a3CAfGhxcXxuk42Pe3R+fXFxbnVtgn93eXVqeYiCiImDlpKSkIuNkZSUjpeNgHmIl4iHioaAkIh4bGtwaGVYUlpYWVlbTVBVVllYTklIRUpKSEdDQEdFQ0c9OTk4Ozk6OTw6OTs6OjpAPDk6PDk4Pjc4NzcxNTIzNDUzMzY0NTAzMS4qKispLCwrKykoKycpLCwyMjYsLDQ3NzU0NzhpTzg7NW6SiJqQmZajqK2esZ6nuq+rsrDCsbvDx5qWj5SZi46FeoSQmJSNkIyPhnGHgnSHjIZ5cHJwb29kcWdfVEZJQz48Ozk6P0BBRENFR0lMT1FRUVFSU1RVVlZYWlpZWFZVVFNQS0U4MC9cYLNHOVhQOzk0NDGWuotITE1PT1FVTEFJUUlir7KfcXp3a3xscYKBhYF6hIaGeXKglXR4gHN1lIc1cZ2onY6hoYSihXZwh3yHfHOLrY2JgWhnYmpucm1wg3Vpb1h1cI6bkXZtf3t9bXJucIB7c3ZuYnWDf4aAhZCQioqJkYuRi4uOg3V4io6AfoOAfY57c3FxbWBbXV5cWllhX1JOW1pYV0tISkZJRz9DQUJHP0NEPTs5Nz07Ojs7OTo5OTs6Pzw4OD06ODs2NjY1MTEyMTI1MzQ3NDUzMS4vLCwrKSopKSoqKikoKikrLzNETTIxNjY2NDM8dlI3PTdikoGSiJWRnaSnnq+VpbSprrCuwbK7wcWWkIyUj4CIfG6BkJKJg4qHj4Z1goRslYiIe3R4eG13bndkal5JUEc9Pzc0NDk7Ozs9PkBCRUhMTExMTlBRUlRVVldYWlhWVVRTUExFPDUqnUtbQC1nSTk0Lz+Sg6muX0dMTU5QTDdDTVFTREuGdX98e3V+bHaIiHx9hIN/jH51opp6foaBhJmEmpxhhqqfnYqDkI56d4l+iYiOc4qXj4R7XWRxdHp8d4ptaGpieW+FkIJ6b4F4dYV6cHR6eGtuaV12hn2HfIeGjn+KkpeDjYWMhn1xhH+EfXZ3e3yJeHF0dWZnYFtbXlNcZ15XUFRYW1VHSkpFS0c/RkBEQz5BQT07OTc8Ozs9PDo6OTk7Oz0+Nzk+OTk4NTY1MzI0NDAwNDY0NTU1NC0sKSsoJycnJigoKSkoKCsrKy8wMFVxPTIzMzMxRX5XND05XIx4in+TjJGcnZ+mkaCqoLGor8Cyu8W6lo6RlId7hnZrf4yRgn2Kg46MeIOAc6CEinx8gX9wgX16aHZsUlhMQEUyMTEzNjY2ODg6PD5BRUdGR0pLTU9RUVNUVVdWVlZUU1BNRkA6Mj0gI5ZjjFs1MzExaT9Hb0lGSUxNT1FMS1RdWVJLaIOIe4l5e3F8j4x6fImHfpeHdqGaiIePkpSlja2pSIaur66LgYCTioKLgoSSqYeAmJiKnHRtfIGGh36OaGdoeX9uhYeChXGEhkhsgHdyeXZobWtfdn2CiH+HhIt5lJybiYuIkX96dYp2fHhtb3d+gHV1c21cXl5bY2NYZ2ZcVFBQV1lQRExLRk9JQ0ZDQ0BAQ0E9OTc4Ojo6Ozs6ODg4Ojo/PjY7Pjc1ODU3NzMzNDQyMzY2NTY3Njg7REZMTU1MQzcrIiUnKykrKywvMDArbnUyMjQyMEyBXDU9PF6EdHx9iYWHkY6Wl5KWoJ6soKa4r7O9s5eNkouYi310cH6Jkn59jIOSlH2Gfoakh4h/goiFeIeIfnOEeF9jV0tCNjAuLzIzMTI0NjY4Oj0+P0JFR0hKTU5RU1RVVFRWVVNRT0dDPzgwLCOHWz8/ODQuXZZwc6NVRklLTU1QV2BYcFlcXmmMk4aUgISBhZGSfoWIkYCalYKhoZiVm5qmrZOZu7Gnu8fDqIuMoaWPlImBkXxxg56fkZ1/d4WFi5CHkGlocISBdIyHhIpyhoJ3h397doR8bnZ1Zn+UjoeIiIeIh6CqopaJjpd/eoGIenlwZ2t4f3t/dWxlXltbXmpeYmdgWk9MTldSUUlQSkROR0NKRENBRERBPDo4Nz08Ojw6ODg3Nzg6PT04PD02ODY1NjYyMzQ0NDU3Njg2NzxCQj88ODo+Q1FeZVxHMicmLCwtLS4xKD+LWy4zMTBPg180PztudXBmd4N6f4x/gZCOipqbpJ2hrKarr7CXkZGEoZSEeHd/jJR8fpKGkpV/ioCSm46DgIGMioKJjYN/ioBtcGpdQkA0LS0vLy4uMDIyMzQ3Nzg7PT9CREhJTlFSU1JTU1RSUE9IREI8ODcvOUM+PDw2My5sk5dNUEhJTExLTlZgY39mZ210m5qOmZKSio2OmYiSj52LoKCSo6qlpKyTqbaiqMHCrseveLqUmnyNoZ6ZhJOFgo6hn5SZkYWKhY+ZkZZscHWKjIKWjI2Od4+EcW2FgYqWkYOFiHGIoJWGkomNj5aktKmbjJSig4eSg31/a2pqfIGCg3VjXmRgW2dsXWxsXldLSE5SUU1MTEZJUENETUZCQ0VGQj05OTc9PDo7Ojk4Nzc2Nzs6Nj06Nzg1NDU2MzQ0NTY2NjY4NTU2MzEwLiosLCkoKS46UGFcQCwoLSsrMCwncog3MjQwT4RiM0A8dW5nWW+Cb3WGcXaShn6XlpqUnp6cp6CplpOYnmdlpJp+hJKReX+SiJGSfYqEmJKQgoCAi4yJhpCHhYmFeHh+Z01SPi8uLiwvLi0vMDAwMjEyNDY3Oz9DRU5PUlRQUFFTUU5QSUVEPjs8OkRGPz48NzUyPD9SNUhISExMTU5SXm6KfHOBfZ+cm6eloZmhl6KUnJ6onqirn6isqaq2l6u/q7bIyLfI0M++m6Bwaaupn4STkoWcoJqbmaaSkYiVopubeHp+lJiTopOXl4GUnnt3lZKrsomNl598lJ2bjZKVmKOhprWvnJCYqIeWj42AiGxzc32BfXNpYF5iYGJoZGBnZlxSRUpLUE9JSUxGRk1DSExGR0NCR0VBOjg1PDw4OTk5NzU2NTg+NzU9ODQ3NDU3NTQ1MzY5NTg6NjE2ODYzLzAuLSosLy4tJyMqO1hiQigqLDEtKEuXXjA2M1GFZjJBQGlhXlBwdGBtfGF3jn17lI6Oip+Sl56Wm6qYnqpCRH2HiYeYjXiCjYqOjHyKho+QjoGCgImLioSShYOGiYGAhnZeYlA0NjAtMS8sLjAvLy8uLjAwMTU+QUFNUVJUUVJTVFJOU0xFRUA8Pj1GR0BBQDg2NjI8OTtGSEdJSk5PUVlthY93lIqipqm0vLikrayspqi0q7C2srGtu7Gzvpyzw6u6ycu3w7+4paKws6ytqqOLlpiFpqago5eBppmNoquopYiFlKShoKuhpKiPnLGLlaOmt7qboKKwkqKdop2Qo6Grr6yytaKUpKqImYiSiZV5en6GgGliaV1mY15kZF5nZ19bT0NJSFNORkhMRkpHRkZIQUtGQ0ZGQTs4Nz08ODg6OTc0NjU4PDU0PDc2OjQ0NjQ0NzM5PDM4PDIwMjU1MS8xLi0qKi8sLSooKiYlNVhYLywwLCwwhIE4NzFQhWg1QUNbWFRMaGJXaW9YeoV2gZOFiIKbg5KQjJLayJ2Wc1aXiI+InI98hoyOiop6h4KHkI6DhIGLhYaIkoaChImHiIeHcW5hQEU2NDwzLzExMC0sKy0xLi00P0NBTVVRUlNVVVZVTltQR0hFPD4+RkhDRUE3Ozw1Qzs9RktJR0hRT1BXgZKfhK2jsqmxwMbCqrPFtquzv7O4vra/tMG2u7qjuMWotsnHtb65tKijtK2wsZuZkpqfiKevq6WUdp+kl6GssrSZlqquqa62u7K6rLC1orGrsbW7t7WutKCnqKOnmqmvrLK5t7imm7apjKSOkZOfhniBhXdaY2VXZ2NiZGBhZ2BbVEpERExVUUhJSkRJR0VBQEBLREJNRzw4Njc7PDk3Ojk4NjU1NTcxMTw4ODk1NDY2NDk3Pj0zODkxLjAxMjExMzAsKiwuLCsrKyooJyopRVowMCovK2iSTzYwUodqNkFGV1FKTFtZUWJjV3l1cIGUfYSGk3WFf4CMe7+7o7yCtJSTjZuPhIiPkomIeYaAjJKMh4SBjn+BiY+HgIaIhYqHkXp4bl1WQEVOPDY6NTZBQjc2NC8vNkNIQlFcUFFVV1VcVlBfVUlLS0E/PkdLRkZEOz5AN0Q3P0JKSkVGVlNQXo+kraOxtMK1t8HLyLW7xL2zs8C2uMG1v6+3dLGzpbrEpLDGubGzsbSopLW2qrGgopebopKlsK6mraunpJigrLS7oqiyurW8v8y/xcW9vbPBt7m3vre6t7msrLClsKmtvbC8usLBq5i5p5StjpeXqoh+g35sWGRiWWtmamZXXGNZVlNJR0ZMUUdDSElBSEQ+P0JCTEBATUQ5OTY2OTo/Njo5OTY2MjQ2LzE5NTk5MzY0NjI3Oz0/NjoxLi81ODo5NjUwKigsLS0tLCwqKCgrKyhFUy8qMDBKj2s1MlCHbTY/RlJMQUxRVlNZVVp2am9+joSAjYRuenN4h2K5oZmjiZSUlpKUk42PlpKHhnuGgY2VioCEgYp6fIuHhn2KgoGLhJV9d3p1ZVBcZEdFTDtRY2FbXlNGPztIUEVaY1JSWVhaZ1lUYGBMU1BFQT9JSkhFRUFARDxFNkI+SEdKTFNaVF2Trri0urjIv7m9ycy7u8C7t7W7ura9tLqxxmB1sqSxmp6rvamlqKuqpKKytaCrqJ6Vlp+Zn66lp6aln6SToqextKeysr22wb7TycnTxsPFzMLKw8C+vb67vLe0r7i3tsO5xb3Cx6+euamhq46kqLWIgYFzYGNjX1hjYGpnUlhgVlJVSUVFTktAPkdEPUtBPUJAPUY+O0hBNzk2Mzc5PjQ4OTo1NzA0NS8yNjM4OTM3NDQyNj84QD5HS1JUU1FQT1FRUEpBOS8sLCwqKygoLC0sL1A+KC40OIB9PDJLiHE5PkNLRUBJTVBSS1FdZ2xrcI+MhI9zbHJyc4fVwLWZoI2VmJmRjpeSlpaOhod9hoOMlop+g3+DeHuLg4d8i3mBioKXfnR9emtmcHVZXVxQZWRiYGVkXVtYV1xNZG1VUm1tX25fWGdkVVlVSkRCS0tIRkhISEhCSTpEP0hLVFRWXFpbkrnAuL22xb+6uMnKura5tbe5sre1s662tphkdaicrXBeoqycmKCim6SeqqWUn6CQk46WmZennqagnpqZg6SerKWqsK24sL251NHP1tDKzNLMz87Kxr++wsq9wbzBwMTExcq+yM6zpLuwtK+aq7i7mH97bV5hXVpfYlpkY1BbYFNQS0NBRUZFPEBFPkFIQUBEPTpFPj1KPzM3NTM1Oz00Njg5NzcwMjIvMjQxNjk3NzU1NTVEM0VMTT41MS8wMDY6NDc3QElPSTstJioqKC0uLyxATSsvNTRtiUkwSIl0Pz5CREBDREZLT0RRXFloX2+WkZCUbmxvdHWHs6ugoZ+LmZyZjIyVkZuShYqKfoiHjJCLiXyBg3N7ioOFe4l0goqGlX9ze3lsbXV7aHJlaWxpZ2ppaGBmaWlsWm1zlq2kvIiGZ1tvaF1aWlRIS05PSktQS1NRSExBSkZKT19eYmdpYZe3x7C4srq9tbHExrWvuLCwu6uysaert6uMtqedmqeaTpqdjI6flpGmmKWVipOTiJCJj5GRnZuhl5qVloeemqebrK+osKi0tNTV1dbTzNDT1c3Tz83FwsnQvsnJysnRx8zNwtDRt6/DvMS5pbW6wqKDcGVeXl9ZYVhaZlpRXVhPUEJCSEVCSDtBQz5BRz8/QTc7RD5ASD00NjY1NTs6Njg3NjU0LzEwMTQ2Mjc4ODc1MzY3QzVCOD8tMC0xMzQ5PTk3LC4sMTtGSz0pLCguMDAwN0s/LTQ2VIhXMESHd0M7Qj5FQkFDSk0/VVlSZVZzkJCYgmhxb3l5g6CpnqaXjJqbl4uNlZGajn2Ji4SNioqLkId8hIJwf4eBhnuHcoOSi459cXh1bHF4fnF6bnhzbGmBcG1jam1weGl3fH7Lv8Hfp21jeG5jW2FgSlBSVU5ZXlBdXE5QTlRRVVRcbm12gnGWrbistKawtaqsvL+wq7SmpLimq66gq7SjjrGumpeYjJGTkYSOm4GNppGciYOLhIqJhIuElJWXl5ObkJyYmZqfnquspaiirK3P0tXSzszS1NTQ1NHOyMPU0cfN0tPT18zR0cXS1sXAzsfHwqi+t86ee3BnX2ReWGFTXlpQUVRRT0g+QEZBQkU8QEE+RUQ+Pz86PT08PEpBNDU0NjU8ODg4NjY0NDEyLzAzNTI2NzY4NTMzOz08RT1AMTErLzI0OT41OTAxMDIyLTJETjMpLzMuMzI9TjIzOEN9XzJBhnREOj09ST5AQ0ZIPFZSTU5adYaFindsd299fn+hnp6hjIyYk5OLjJKPloR5hY+QjYqJh5GGfoF7cn5/gYd6hHWFk5CIf292cmtzfXt2e3OBeHJqgHNyaW9xenlxer7Lmn6MsoR2coR2aGFrXUNaWltWZWNZZGpUWFxdYGReY3d6fouBmKmjpKGfoKilqrC4qqWzo6GtoqOtoaexn4immpOSkYmRjoiBk4lqlKKMmYSBhn6Rg4OTl62LlY2Umo6Gk5Gel6ewoaGhpaSpyM3PyMLM0dTS1NLO083G1tLM1NjW1tjU19XJ1NrNydfX0cqsw8LLjHRwZWJhWVVaVFxQS0dJSkpAOzo7REFEPEJDPkdCPkJCOzw5PDpHQjQ2NTQ0PDU2ODc1NDMyNTAvMjU0Njc0NTU0NDw+PUU/QTYyLy0xNjs9MDgxLzI1NC8tLTtSMDE3LzUzMkZEMjg+bmI1PYF0TTk5QEk8QUQ/QTtQTEZLWXCAdX1oc3hygomAnJSdlIWLlYmPioiNh45/eIOTmIqMiIiLiH6CeHN7fYOHd396hpGVf4Nud3BtdX92eH10hXx5bId2dG59doR0eHudtYw7QYvFpX6MfGllV0lDZmNlY2dqY253W15maGtuaW6Ag4iQi5ydoJ2Ql5ieo6OlsaOjsp+hpZ2gqKCjsZyFnpKSkpCKjouGg4+EfpybjI2ChIV6lH+CqZWjjJGKl5KLfpiLmpKrs5ibnKicp73Dxrm2xs7S0NLQy9LLydTO0NXa19fY1NnYzdjbzsnZ2tHWvsvLtXp4cGZeW1NXUltWRkdKSUVFPTo3OkBAQjpGRD9EQ0FEQjs/Ozs3REM3NTY1NTswNjg5NDQzMzQxMDE0NTU4NzQ0NDQ5QD5EQkM8MzMuNkZUV09RSkFKRj8xKiguQlMzOTI1NC83Szc1PGBiQTxzdlY4N0FIOj9DPjw5UUVDSlRrbm5wYnBxc4WNfJeQnYt/h5KDiYaFiYGHfHiFlpaIjoOHhYZ6hHlxenuDhnV6hY6NnHmLcHxvb3p/cXuBcYOHgG6OenR3fXyCdX57hoevc1ipwraNkYJwbmI9XmhycHFwbnh2gWVob3J1eHF6i4aOk5GblZ+Vh4yTm6CanqmeoKyboZqZn6Wen6uZi5qMkJGNhH2Ih4OFi46gmZOIg4d+bJl6hJmGiJOMjZSMhnyciZSPrqqUlpifmaevtr2prb7Hy8nJzMvPycTSytTX2dfY19Xb19PZ29XQ29rR1sjUy5Z7fWpqXFtRVFRfSENGSUg+QT49Nzo9Pzs9Rz0/QUFBREE+Pjo4NkRCNzU1NDc5LjU2NjQzNTUzMjMyMzY0NzU1MzQ1OEVCRENFQjU2PEZOU01bbmZjbnNrYVY+LDRMRzg2NTQzNEJGND1XX2hMdXheODs/Rjw8Qjw5OUQ/Q0dSal5tZGJma3aAiHGRj5qAeoCNfoKCgYN+g3t8hJiNh4t+hYaAdoJ5bnt7hoF0epKejaB2jnWCdHWBfXOAhG+BkIJvkoR1fIGFenaGe4i3xaTBybiBlpqPd3BlTmZjgXqBd4aikIp4eXZ7g397hHZtk5aUlY+XkYSJj5aZl5alnJeflp6TkpeinZmrlZCQiYyRgoyFiIiBhpCRnpuZiIWMgYWXeoiJn5eQiI2Ki4J9oYqRi7ygmJOXmZ2ppqaun6i2v8DAucfJzc7FzcrR1tXV2dXX29TX2drb19va2tjO28aIfXtpa2diVVhWVk5MRE1COz09PDg6PD44PUA2PT9APT8+PDk4NjdEQTY0NTU9ODA2NjU1NDc3NDU2MTM4NTQ1NjQ1NTdISD1ESkU3OTI1O0g+Ozo6N0lQXVpSVVhLOVQ+Ozk1MzI3STg9TllNSHh4ZDU9PkM9PUA6Njo+PkBFUV9YZWFdW2h0enlsiYySd3Z6int+gH5/fIR6fYKRiYSFeoSHenV9dG18fYZ+dH+SnpGeg5F8hn54j354iopugpqAdJmGfoGJhXx9kHqPqY6Pw6G9i5yjnH2JhH2JcouKfnOmmpyYk4V7jpCIhGhHcaCknYyLkJKFiYuQkpSOnJmSlJCWjYyVn5yUoJSRjY2Pi36Qjo6LhImSlpqen4mMlJGdkYKLf6WZiISNgoWEgKWHiou4mJ2RlZaiqKGenp2kr7e6tazAxsrQyMfMz9PT0tjT1dfA19jZ29ja2tnZ19u5e3t6bWtnWWJcVFBPSUNMQTw8Pjk5Ojo5OTs9Nj8+Pjw9OTo7OzM3REA4Mzc4PjcwNjg4MzU3PDM3ODA0OTc2NzU1NTQ2RlA1RE5JODkzOEFLPTszQ0BJPDlEV048TVRITj85NjMzMz5DO1tYPjVZeXBaPDxBPD0+ODY4OT89RFJTUlheVVhmbW1taYGOinFzeYp7en98f3uHenx7i4aCfXSDhXlyenNtgH6EfneFnKGanZSSgIyIf5iHgJyRboeohXqgi3yRjYOIhJt9mpCKjKOioJCkrp+KkIuFi4GThldyrYufq5uPg5ibj4+OXIKikYKMn5OVjIeIjJKTi5SUk46Lj4qHlpucj5SWkIqSk4aAi4iSjYqKnJaZoqKGk52WoIqJiI2ckIOIjn+Dh4WkhoyQs5idkpWXoaGfmZKcnaiyuaymvcHHzcjGz83QzM/X0dHVrtbV2NrY2trX1dnZoHJ/d2loX15ZVFhZQ0FIQz8+Pjo0OTo7Nzo7OzM7Oz89Pjc7OToxOkg+OjM3PUA1MDY3NzI1NT82NTs1NTg1ODo1NzczNUhSN0dPSzk5ND1FSkI+MUZDTEI5ODpHWEA1SFdJNjYyMjM6RUNlWD8mX3lpX3o+Pjk8Ozk4OjtAO0JRS0tTWVBUY2J5bWF+kYNvbXeLeHl/eoF8hXt7doWEf3NwhIF6dXZ2dISDhX5/kqakn6WiloqdkJSXi4qol3OKsY2Ep5KEmZOFmYyilZ+Yk4ianqOSqa+fkZSQjY6IloxujbeFmsTIsZuhpZucmJaQspFkpM3Ilo+Gh4iPko2NkpOJhYqJhZaZmo+PlJOGlJeDf4+LmYiNkKqWl6OjiJmflpqIjoaWl4qEjo2Bf4iPpImNk6ial5OXmaGZn5mTnZujs7Smo7zBvsfFxcnIycLL083N1KnS0dbW1tja1NPazoR1gmtmYGBfUEtWXEJCRkM7QT04Mzc7PDo4PTY0OTo8OjgyPzk5MjpJOj02N0JDMzI6OTYyNjQ+PTQ7PjY5NDk7NTc5NDRKUTxKUUs5QTdCR0lANjRKRUxGPjw4OEVUQTc+XDg2MjE0OjtFYFhBRmF0aExjWj41Ozo6NTs6PTpFTUZIUldTUkJkg0d1go59fG19iHh6fnqBgYJ+dnaAgntsbop+eXx3eHyEh4t+i6OzqKSrsqGWp6ClpJaVr6KDkLiVkrOZjaGgjKSbr6KknZiQp5epma2vpJeUlZSQi5ialqDAjqPJuKuaoqWtmZGbnLKdhoWoop2YhYiIjpWMi5OPh4GGh4iSmJSMipOThpSYhoORkJx0kZmylZakoYicmpOPipCKl5qJipaNhn2MmJ6KkI+cmpmTmZiflKCdlZ+bobGuo6S3vrPFx8S9w8O/xs7KydKnz83T0dDW2NLP2Lx1fHhfYldiWFJJS09FQkNENT46NzY6Pzs8Nz00MjY2OTc3ND01OzU8TDw+OzxCQTc1PDs0Mjc3P0A2P0A3ODQ5ODc7PDU1T01EUFJMOEA9RUFHQTU6SkVORUQ6NkFAQlM+OURPMzIzNTc1PXZcPFJcdGlaTV1TPD04OTU2Nz06SkZER01bXFlJaGE7SISKentthYZ5fIR4gIWAfXB4fH18b3OMen2Ce3iFi4mGg5KovK2psr2vpa6zs6mjorCsipq1naK4pZWtpJeprbempKOfmamYqqSvsKmamZuUlZGYoJeZu7utyaFptreqsJWYnqKrkpe9o16psoKJioyUh5F8jo59g4aNj5SUiIeSlouPlY2LjJeZkp2atJaVq56LnJSSjZCSi5iaipKdj4uJlZ+hjZWNl5mdk5yYnpWioJScnaWvqKGls7irwsjEtru9vMXIyMLQocbJzc3E19bQytOjc31rX1xVYVNRR0Q+PENBQjg/ODc0PkY8PDY8MzUzNTU0NTRCMzk6Qk06QTtBSEI7OkA8NzQ2PEI5P0BCODc0Ojo2Pjw0N1RLQ1VRSjc8OklBREA0QUpITkJBPzZEQTxKTkQvVD0yNTQ6RUpcWEpaUW1ncHBEaWBLSTY3NTc6PkpAQ0lQZkhhYGJwSUCLiX+AcoaHfIGJdYKKgn5tfX18fnB3h3eNgYd7jY+Mhoyaq8PAsL3Gu7O0wby0rKuzt4yosq2tvaubuqSorbm3qqamoaKjo6qvsrGqnZyjmJuYl56ipaWSo7muqMC7rK2yuaWkp32Ihpytva+Ci4uKkIOOg5GOeoGHkI2OnIiIj5eNipSXlJCal52nmrCakaudjpqPko6VkI+Vl46RoJCIlJujrJWWj5ScnpSgnpuYoKGUmp6np6SipLCzpsHGw7Cwu7bFxMO/zafHw8fDvNbQzMTKinZ1ZF9cYl1PS0NMQEVGPkE/QTw6ND5BPT01PTY+MzMzMjQyQTE3QEJOPkdAQ05DQT1DPTs4NkNDNUJJQjo4Nzg7NUI+NzlWS0RXT0Y4PTRLQEM+NEVLSE4+QUE2QkI/QlNFNThQMTQ1Ozw4O0Q+OUxqal07V1JkS2daVU83OUdFP0NGXGhGX2lnWl1ck4yMiHuHi4aDjHWGkIqBbn57gX5xfoF6lXqSlJSYkZOVqLTHycDCzMHDuse8uq+rubuXsra6s8CupcCkq7C8vKquq6Kinqesr7WwqpugqpyinJafsLSni6K6urXBu6uonLKkpKiUhI6pxMOkgouOh4iEhpWUjHmDjJGPkqGMjJSRj4iXoJeSmZWXpqCunIyqnI6Wj5KRlZWOkJWRj6GThpefoLKflJuUoKGZpJ+aoJyglJiepqSmp6SvraW/xMKuqbe1ycO+ts6yxL7Du7PRycfBtXd7b19aXmxUTklETUtLSUBBPUJEPDVBRDs6Mz04QjMzMjI2MkEwNUlFTT5JQEhSQEg+Q0A7Pj1GQTVBVUA7OTk4PDdFPjg+VkpDV09HOD80TEBCOzVKS0NMP0I/PEJGPUFITDkrRzwzNjc0NjRBPzdPYU9hRS89PjZrbGpgQDpIPj9FQmdcTWVcZlRjapmNl4mLiJKPhol5hpOQgXJ/e41+d4eBgpB6jaGWqJqamLu+ycjKwtLJysLNvMGzrbu/p7q/vrzEuKzBqayzu72qsKqkpaOsrrSttrWgoK6fpaKYo7S8qZuovMGjtbavq5KvrKqrloaaqaelkYKMk6SVioB1iZJ5hY2RkJ6gko6Ui4+MlKOZlpuUlKOeqZ+RpZqMj4+QlZaIfY+VkpKjmpWgopy1ppCfl6Wko6WfnqaYnpWXnKWjqKiisq2ou8DEr6Wzt8zAua7Ds7u+wbitwsLCv5lwe2NbWF5cTU1OSkdEREhCQkFDSzo0REg6OzQ8N0UuMTIzNTJCMjZTSE48SkJKUUVLQ0RFOkVMQjw3RVY9Oz04OT88ST86RVVJQVdRRjdBOks6Qjc5Sk1CSUBDPjxERzxCQ089MjBIMzY2MTcwPUI6PWpqSks1UVMzU3BwZE47RD1ARj5sSV9YYVpkZFeekJ2Nl46ekomKf4ifkoR4hX+Vfn+QiIqQgJWgma6no5jDvsnEyMbSzc7Ny7zCt7C6vbS8y7vDwba3vK2zwLm8rq+ooamotq2uqbK3mp6soqehnau3t6mlr77Esb25s6eps7OtrpaVpa2ooJGOkrHFp5WNfZGVfYeRmI+qmZiTk46TlZOlnpOdmZOhoqGcmJ+Yi4yPj56IWpCWl5KWpZllmKOes6WWoparraunnJ+nl5iWmJWhpKinn7asqbq8w7WmtLXLwbiqtqyzu7iuqLi6vLeEbnBcWlZXUEdLU01LP0FIRERIRkY4NUZNOz43PkFKLjMyMDI1QjU1UFdOO0xGS1JMT0dHST5JUT86OElTOzs/Nzk+RExCQEhTS0BXUEY6QT9HNkE3O0hNQ0U7Qz00RkU6QkFCRzkvOkEzNjAzPkdEOTQ9dGRNRztFKzpmfGhWPD5AQkZCc0ZpSVJlY0xGpZSclaGXqJaMkIOHpZKIgYeCm4SDlZCRlI6aop+vvq6hx77GxcjHzs7O0sq+u7axuru8v8+1xL23ubeysrazt7Ospp2rq7irqaivsJejrqSnpKW0wbCrrLO+wrnAubOnuLS3s6+VpK2wrqSLk5WhjXPBmX2WmYSOlpmLsZWampWSkpmZpqOVoJuWmqmcm6GgmYqMj5WcYEqWnJqUmqWXVJawn6+cn6WUr6+tppuhppSTmZmOnaCnopm0qaqzvby7q7Cyx8C4pqyrrbKxo6GysrSlc3FnXlxQUk1FUVFQUTtIS0lGR0FDPTlLVD9BOj1FTTA3NTQ0OkIzNE5XTzxKS05VTlFKUEhISk9CPD5NUjs+PTg6PENSPkRIUklCV05JQENBRjM+NThKS0NBPUM7NEVBOkE/PkhANSpCNTIsPmNdZzozNXRkZUBSNyYjM31oWDw6QkNAPVJFV1NzYlZGSKuXmZ+hqK6YkJeHiqeWjoiShZ+IhJyXj56gm6Oltcm0qca8w8TIy8nIzM7Hvrqzrrm5wMHNtci7wbm1urGvr7K0p6ObqrS0q6mmrayZpK6lpaisusCoq7a2v8HAv7iyssOwt72ro660rbmliJuXppt2vp+EmJyOkpiai66WoZybl5San6GpnqigmpuqmaGnnpeQjZCdg211k6KalZyin5CusqOrlamqmKuvpaWgpaqTkpmciZWcop6Wsaapq7q3vbOyrr65tqCjp6mlppycrKmpjWZoYmBTTE1HSE5KVUw9TURNSUpBQ0Q8UVU8QUFCRE8xOD03Nz9CNzVVWE4/SE5RWFJQUVRKUUpKRUFFTVE/Pz04PTtHUjxFRFFCR1lNS0FIREU6OjM5S0lCPkNCOTlDPjxAPjs7RzctMj4tMYJoTnpcLzBraGA8PUJCODZ6Zlc8Oj0uLlNhTVZIfmVeSEaslZyhn7uumJSei5Oqm5GRk4mqjYahnoyjrJSkpLbHvbTBu8LDyMnFws7Iwr25sq+5tMDCyrbGscG8tburqa2ssKOjmaq0uqaqp6yqnaivp6Srq768qK28tLi+xry2tbjAsL2/s6m1tqu+pI+il5Ghn7ueiZqgmZednY+2nqmcpaObnKGap6WzopuepZyoqp2YlY+Um4uWiYykoZScop6hta+lppOxq5qrrZ+fpaSqkZaVoISQnp+clqmkoaG0tLq1rai1srKenKOmmpeVmaqhnnhjX2FfTElHSE1RSU1ERkZBUUtJQURHQVZSREg8QUdRMTtCNzpCRjc5XVlLQUxQVFVTTVdSTlVKREBKSk5POUM/NT08TlFDPz9QP0VaTUpBS0RHQDUzPUlHPz1FQTk3QTs8QDw8M0A8Lyc7KkiRQjpTSjAsW29XNzE8Kh1CgGRUNDktMTpoXUZEQ5xwYkdFqJeknp7DrJuXpJeZqJuVmpqPqpaVqKaVrayZoqq2xcG8v7jBw8HIxL/Nxru+ubKwuLS/w8i1v7C8t7q3p6Srq6yhoZurqsSipamspp6rr6yiqqi/uKasvbC3t8a2tLm4vrC+wba0srSvvaOWo5WSm5Otn5ChoaSio56QvqSpnamsnZ2gm6afvaKYo56iqaugnZaNlZ6TnoeOhI2TnqShnbWsppyWsqaZsKmgm6ufoY2alZ+EjqGam5KlpJqYq7G1saqlqq2snJigoZKOkJWon5RpZVtiXlBKSEtPTEhFQ0lAPU9IQDtHSUhbUk9LPUhOVTRCRTg+SEc1Q2JbS0NOUlVXVlFYVFJVSEA4UVFQTTpHQDRDSFFTSUM7Qz5HVktDQE8+SzwwNjtHRj47RkE1Nj85Oj85OzE1RDAtLDBNdlw0S1o1LE1uVzwtPSkeI3piUTVDS1E5b1JGPEt4ZmNXTaKbpJuexauhn6udnK2fkqKelqWgpqmsl7axo6qztsXCvcC2wMK8ycK/ysi2uLW1sbS0t8LGt76xuLW6tqCnraqrnZ6fpaTBpaCprqCkqa2voqaovbWlsbu3trXDsrO3ur6xw8C4uK60tLSjnKSUkZOgrJ+YoZ2oqKqimsKtqZ2srZubnpimoL2hnaSYq6urpqCZjZmfkp6Ijlh/lp6moaC4qqaUmLajnrKioZywmKCPmpSego+gl5aOoqOVkKWus6upoqKlpZWVnJmLj5GTpJ+JY2dcZWFNSktLT0ZFQUZLPj1JQTk5SkpOXVFRST1MVlw4Rkk9RE1JOEhjXEtDTFBTWVlWV09aXklBPVdRSUs/SEA1SE1YU0hBOkBBRFBIPz5RPks3MDk5RkU7OEc/LjY+Nzg+NzcvMT85MSUxUVVtW0pPMTA9Z1dEMTc9LSt3YVM2U1prV3NIRTY9dWVcTE+eoKGYnsOnpaKzoJyyp5Oqo5+jn6yprJ27samstbHIw8HDs8LEvsfEvcTKvbCwtq6xta/AxbW6sbC6tq2aqbCpqZuepqGowq2brLGcqqKusKmkp723pra6va+3w62zs8K/scazurertLauqqKmlZWUoquhn5+Zp6uvr6+7sqafqamZmZeToqS4oaGjkq6vq6SlnpKhnpSdjpCNlJ2ao5+ntKenjZi0nKOvm5+cr5GglJiUmoCSopaPjqCgk4umrLClp6KdoJ6SkpqUhYuSjZyfgGRoXWhmS0pMS1NCQ0BJRzs7Rj44OU5NVV5SU0o+T15dPUhQQk1MSThOZF1MRUxSVFlbU1VPXGJIQT9aUUFIQUtCN0ZFTEtOPjtCSEROQj07TkBBMy85N0NCOTdGOys2PDQ2PDM1LS80QDErJ1Z0U2VPPzEwNGJbTTIzPjA8d11eP1tVX2ZyQDg8SJZ3ZUE0n6Sfm5/CqKOpsaCjtKmVsqumoqSyrK2pu7KtsLS0xr/ExLW/xL7KxbbAycK1q7WpsbiswMW0uK6ttrqlmauyq6qYoaeXrbu1m6iwm62frrSyp6q6s6e5s7iyuMCquLLCvbTFp76urbe1qaesoZaWkaWkoaGXl6Sut62ytbafnqikmZSVk6Ogt6OkpZWusbKlqaShnpqZmpWYqJ+emKKfr7Kip42Xr5ilq5ibn6aSnY+VmJqGlqCVjJCdnpSLqamqoqehmZ2WjI+ZkIGGlomVn3plal1sa09RTk5UPUJBTkM7Okk/NzdRTl1fUlZRQVdgXEJKU0hWS0g6VGRdTkZPTltXW1JQUVhdR0FCW1BCRz5OQzlIR0hOUD8/Q0lCTEI8MklBOTQxNzdCPjs3RTcrNjkxNDgwMi0vLjw2LSNCcWdzazIzLzFcY1ozMzkwNnBbYkgwNUpxalZDV0aMeWZDO6SknKGlv6aorq6gqLWqnbivq6SqtLexsLi3sLe4t8W9w8e9vMTCx8G5wcbBuqq2pa27rcHDt7iqrbK8o5WtsK2yl6aokaq5qqGnsJ2rn6+0s6qqt7Wsu6uzsrm3rLiwwbq9v6bDqrC2rqmqq6admJiqoaGgkZegsK6zq7C5mZupn5mWkpemoLeppaKir7Gzq7Gnq6CcoJ+bnqWdoJedpLSwm5+QlKaaoKmblqSgl5mLlpmUlpedlImSm5mUjqmpp6CjnJibk4ePmYt+jJeGj5psam1ibm5YUVFaVEFDRVVAOztIQDc6WFBkXlBXV0RZXl5OTFJPX0xKPlpkXk5JUU5bVVlQS1NXWkk/RFhQREY+Tj89SUdHUVBCPUNGQk0/OjJEPzc3NTQ3Pz05NUU0Kzc1LzI1MS4tLiwxPionKz1ccD0+MS4xZVtkQDE3NDdnWWFGKEA4bX1oXFY6iXtjQz2on5yhqbyhqq+qorG3qKW0squhrbW9r7O4vLu9t7bBw7/JxLnFw8DAucW+wbivtqirt7K8v7+0qa+yuJ+XrK2orpioqY6nu5+lrbOfq6KxsLOsqraztbytr7G1rLC1sb+6xbarvK+xt6ysqaKxpZ6kqJ+jlo+Yn7Kqs6mqs5mdp5ualI2gpqS0rqehrKytsaeyq7Gpo5ueqKSelKCZm6m2qZeakpKfmZ6hn5KtoJqZh5aZjJ2anZSLj5aXmpempqOgnpaWl5SBkJWFe4+Tg4yXZ21zaHBzX0dZZlZEQ05YRFo5SEI1Pl1RaFxOWl1HW15dT01SWGRKS0NdY2BQTE1OWFdYUEpWVldMPUVVSkVEQU0/QUZISFFQQTtGREZLPTg3Qj02ODcxOT48NjVEMCs4MC8wNS8qLC8tKj0sKyUyKyo1SzEuJ19eYVYxNTE9YFZfOClDM1lVXGdLNYx6ZkxApJqfpKy2o6yopK6ttamus7imprC4xrawt7/CwrW0usW+zMW5w8G6wLrEuMG5srWsqrq3u7q+tauusbeZmKirq6ucrauPq76eq6+xo6qfsa2yrq61sbi2qq2usae1r7S6vMmyqrW0sbSvrqags5+aqKygpJWVmpmxoq2gpa+WoaSZmZKNoqWmsqmhprGrqrWkrrC0rqOZna2nm5edmZmsuKKXk5CPmJyhmZiUraCelYKUmY6enZqWkYqUk56apaOjoZmXk5KWe4yRhXuNi4OLk2xveW91fGFGYGpaSUhaWz17SkdFNkFiVWlbTVxhSltcWlJTU2JhTEtFYGFgUExJUFdWVU9HV1ZVTjpJVklIP0NLP0VESEhRTkE/SEhIRTw3PT46NzU2MDk/ODY2QiwtOCwvMDQsKCwvLSo3NikoOS4kOks1LiJUYFZhLjUoQ15RXC4rQS9KR1BbRzNjWFRLRZqWn6+osamspaOurrWpt7O3o6y0t8q6tLu7wL+1s7fEwMzHvMS9t7/AwLjAvbK9rqi6ube3wresrrK5lZenrqynpLKqlK+7pKyysqanorGzsLKxtLC3sqmuq7KmuK+1s8TFtqm1tauwramnorafn6axoKSUm5iUsJ6nm5+pjaminZuVl6WlpLanorCzq6exp62vtaykmaGsqJycnZuUqrmclY6Oi5icopiRmKijoJiFk5eRnpyYl5eIlo+Xm6icpKGSlpKQlneEkYZ8hoKEjI1ucXh2fH9dS2VsXEpPZFw/YntHSThHZ1dmW0xeYk1YWVdVWFRpXVBPSGFdX1BKSFFWVVJLSFdVVk04TVpORUBGSz9IQkNLU00/P0xPSEA7Oj47NjswNDE8PTQ1OD8pMDcpMS4yKSksLC0rLTkkMDQyJTlCNy4jQU5JZzI3J0ZhTFYlLUIuPUVMUTwzcmtMRESRmaStpKytq6ajsLKyqrewtZ+rtbrJuK7BvMO3s7G1wsPPxMDCvrS9wcC7v7y0xKirurG2t7+9r6y0tJ2hp7GtpaaxpZ6ytayqsrGrqKi0uay0srWss6yqq6isqbmtsbDHv7ikua+pra2mp6ywpaSjrqOpnJ2bmq+ZoqKio5Csn6Ogn6GppqW4pKuztKSqq6isrrauop2jqKqcoJmakqS0mY+JjYeRo6CWjpWfopaVhpCUlJ6bmZaVh5eSlZmnnKCgjZOSjpF4fo6EfX19h4qKcnRzf35+XFJkbl5OWmddRkSWW0c6Tm1YYlpNYWJOVlZWV1RZaF5RUkxkWltUS0dPVFNOR0lWU1xOO1BeSkJESEpBRT8/S1NPPjpOTUM8PD45OjU9KzMyPTYyNDk6KDQ1KS8sMSgpKywtKiY1Ki8mMCkzODoxJiozQ2U7NipIZEhKKzpJPzNDSVMsPo9rP0hJkJqpqqGpr6Sno7O0sLS1sbCgq629zLquwbzHsbSutMLD0cTFv8GyvsPCvL+4vcWorbettLm8wLCssq6ho6euqqelsaOrsaquqrCurqyrsrqnt7GyqbKpqqWlo626rKqwwrm0rLmoqaitqaewpamkoq6qqKKenKKslaWdl56Yq52hp6ihrKairKy3sLGgqaKfqq2wq52epqepmqOXmJCgqJiGg46Ki5+gkIyOl56SkYeIkZWhnZaYloaWk5OXpZydnYySkI2Kf3+IhH13gIeFh3V0col2bF9ZYG5jUXNyXEs8hHxGP1d1WGBZT2NcTVVWVVdRXGJfVE9PaFhXVktHTE5SSEVJVlJdYzxQXUQ8RkhIQkc/PUpQTDo+T0o9OT89Mjo3OyozNT4xMDQ4NSg1LyosLjMwOyksLCclMjM0JCwyLTg2MCkoMTxeSzAuSWdERjg8QjA1RUtYMUCUXUBNRpWWrKehqbGcqKivtay4ta6ppKurvcm7sL64w6+wrbLExM7Ow7+/tMHExLrBtMnErK+4rrO5wL+0rq6spqepsammqLKmtK2qsK2tsa+yrLO6pLizrKytp6ufo56wt6uqrbm2pLW1o6morKyqrKCopqexsaOmpaGhq5aqoZSboKWeo6Kqo6yinqaxt6ysoqWimqmqramdoaWkpJmfmZWPmJ2TgYKQiYWdoI2Lj42bkJKMhY6ZpJuSkZuLk5GRlKOam5qLj4uLfIeBgoJ7dYGEgX51eIujh3hrXmBuZ1dmh2ROQGeSTERieldiWFJlVU1WVVVUT1xdYlZLTmlXVlZJSkhJT0JHSVNRWW9BTVhAOkpHRkVHPj5FUUg4Q0tFODdDNzI6OjoqNDk/Li80NjMpNCsqLCsuIzQuLSsmKCs3OSomNis8LTIsJjA2WFouMEpnQUE8PEMrOkpPXjREhkJJSESWkK+koqmvmKmorbWqtrCqpKupqbzBwLi5tLy1prKvxMrL0b/Bu7jAwMK6wbrCxK6xtrK0u8G+s7KvraysqLeqpq2wq7iup7CwrrGrtaq1tqe1t6uspKmqnKOes7OoqKSztJ+1raGpqKuoq6afq6uoubapqqmpoamfrZuRqaGdoKOipqKqnZumtK6npamio5elpqapnKKjo5+ZmJ+Rjo+YjX6HjIeFnp6IhYuLj5CSjYWHlqOajo2akZKQjpKfl5mWjYuEf3SHgX9+eHWDgHp4foCInY9wcmdncXhcYXSIaU9dmFZIbXlVZFZSYk9MVlRVUU9YW2JWSFBqVFZUR1BZVUk+SUhPUVB4TU5WPTxLRD9AQTxAQ1VDOUFLPTU7RTEzOzk3KjQ6PSstMzQxKjgqKisqLCkqKC8qJiklMzssJDIpMjAyMSUvMlJjMDI/Zj1OWD9DLD9MVF8vSWs3UkY7lY2voKWprJmqpK2usrSvqqWvqam7vrvBsbC5raK2r8nHyNDAv726vMO9u8PBwL+vsrOytr28wbGys6uzqaW1qKSss7K4r6KttLGvsbmquK6qr7erqp6pq6CjobWtqaGer7KhtaqeqKeqo6qhoaytqL2vq66soaenn6uZj6+imKKgqKaep5uYqbCoop+soaGSoaKippiZqKWYmJidj4qHlIh8jYaEhaSWhoOCjIeQj5GFhpShlomRnZCTkI2RnJSXj4qGhnh0gX99dHh6gXt0dHtqgoijdmleZWyBdWeIi3xSV3BeS3hzVGRTUV9NTVNaZ05NV1llWUdTalJRPkJOUWFROklITFNJcVFMUzs8ST87PD07QEBXPDw+SDczQ0IxNTo5My01OjopLTMxLS02KSgrLSw1MiMyKScsJS47LiYxLjAtMTQlLDBNaDozOF89YWQ/RjFDUFtbK0hQO1lDNI+OsZ+kpaqjpaOsprSzsKmksKequL7BvLCouaqnrrDJxsjQwr3Avrm/v73JvMK5sbC1srq8ucCztLytuayjtaanrLG2uLKmp7q1rbS8r7ulra21qq2cqa+kn6WsqqecnaqypLSpmqqnqqSpnaKoqKm9q7OwrZ2po6CunJqyopakm6Skn6SamaeqpZ6aqaGbkZugpJ2YlqipkZmZkpCLgo+FfY+Cf4iej4eAfoyIkpCQhYGUm5SGk6KMk5GLkZqSlYeJfoByenh+fGh3fHt1cXJ+aYZ6hIhkYGhjcoV7bWd5XV5WQ1h7bVRhUFJZS0tNcHRdSVpbZ1pFVmdPQz5LTkRDQTlIR0tTP2phSVE4PUg8PDw+Ojw/VDY6P0M0NUg+Mjs1OTAyNzw1KC41Ly0xMSYvPktJMSUaOTAlLCwwOS8sLCs2JzE3Iy0vR2pJMTRYPWZiQUo3R1NgVSo9PEZcQCqOkrCZn56ppKOhqqS2srGkqbGnrbnBvbawpLmsqKiww8nIzMG3vb+1uMG6yLbEtrSztbK9ubq9tq65tr+torOmqquutbe0qZy6u6ixv7K6oK60taisnq6xo5ylp6mjnZykr6avoZ+rqaehqZyjqKCtu6eusa6hqqKjrZ6erKaYn5uhopufmpmiqqKamqOjlZaTnqGWm5WlrIuekY+RjIKKf3+PgHqalIyJfX+Mh5CPjIqGk5iRh5SjiZGRh5CZkJOBiHx5bH12eXhie3pycHFzeGqCdWqDZ2NoYW5zjm1iaXBgb0JdeWtWXk5RUUtJTVNZVk1cXm1XRVhhT15QSE1ERjs3SEVLTzxyaEpLOUFFOzs9PTs7PUo0OUI8MztHPDQ/MTgtNzg7MigwOS8sNS4uPS0qTD4qHTQ5JicuMzQuMCsvNCYsOiQ0MEFoWjEzUz1lX0RMNktWZE4pPTNSXT0jkZesmJ+XpqOhn6ejt6+toq+wqau5wrqzraC5r6uns7rHysi/t8G+r7S+t8S2w7KwurGywLa7vrequbi9qqS0pqiqr624sKiYuLyjrb60s6Gut7Smpqews6CepKWnoaSZnqyoqJ6gqq+noKaXoqifsLifo7GvoauhraSbpqapmpqbnqKVnJuZnammlpueqJCXkpidk5mWoamQmomNj4d9h36CjXx7oYyNiHmEjYWKjY2FiZOajomVn4iQlYKMlo2RfYR7c3B8cXN0YHl4am9wcXBqf3NkemxoZWRiZoeAYFtyanFNToBpWFpNUUxLSFBSUUhNXF9vVEVZWlJnT0hLRUY1NkhCTEk1WmVKQDZFQjk6Pj0+OjpDNTk+OjNARjwyQDIzLzo7ODMmMjwwLDg1QiopLUMqLDQ7Tk5AOzczLS4rLTcqKjwlNTM9ZmQyNE0/ZV1GTz1SWmdIKj8wXVs1KJWbpZiclayfnqGkobersKOztKmpusW2sq6guK2urLC1xcfAtr/CubC0vbe/u76wrL6ws7+yvcK5qru6uKeotainq6+rs6+lmLu2pKu6ta6esLiuqaWnr7KcoaSgpKShlpuvpqGfo6ivoaCik6Okobewoaawq5+ro6+Xm6qlqJ+Ymp2jk5qbmZylqZmbm6SUlJeVnI6Tl6KooZCJio+GeoN9g4p5jpeKjYd6goiEiY2PhY+TmIyOlpmKjpZ+hZeMj3qAenBxdm5vdF94d2VtbGxqaoRvZnJpa2ZoXmR0gWBba3ZpWkp/XlxYT09LSEhSVUczOV1ebFFFWVVZZU1ISUVFMDdGP0tCNklKSDs2Rjk0OT49PDk4QDg7ODo3QEk+ODw0LTM8PDc1KDU+MSw7QTEoKzY8IjhSPSoxMTM+RDUsLSc0Mio7KzEzOWNtNzRHQWZbSFREVV1oRC48MmRXLDKUoaGXlJuqnKShoqC3qq6gu7ilrL3Fs7Cuo7WwrKyutMPDvLO/urexs7m4uri7r67As7S5sL/AuK29urWlorKpp6myqq2xn5m/taSntbWonbK8qKelqa+smaOnnKSllJihsaWZn6OoqZyin5Kkn6O4qKSnraadpaGokp+ooqGhmZucn5Gam5afoambmpiglJCTlpmNk5Ojp6SQiYmOhnmEeoSFfJ2NiYqHeoGEh4mJkoWWk5KLkJWTjI2Ue4KXjot3fntsdHFsbHNhd3VpaWpnZ2+GaGhpY2ZpaWBqY2poXGZ7Y2BTdFRcW1NMSkdJT1NAISpoXmpNRFdVXmBLSUdFQy46QjxGPDZLUEQ4OkQzNTc9PTg5NT86OzQ+OEBLPT45Myk4Pjw6OSo2QDMuRTQoKyw/MC1OPy4rLTcsMTE5NSwmLjUtODA1NzZgdEEzQ0RnW0tXR1VgaEIzNzlnUCcynaKkkI2kppqdnp2jtKynqrq3p6zEwbawrKO2rqeurre/v7yywbewrrK2tri2tq6qvbOusrG9v7euvLuxpJ+2qqWls6iqrZ2cwKqnpa+yqay1u56oqauxpZieqZ2mpJGZpq2imJ6kqaGboZyWn52ntaavqq6hoZ2doZSgpp+hoJqbmZuSmJyTpZyroZeWnJSSjJWXi4+YmqifkYiJioh4hXaBgoGdh4qCiX2AhYiHhpCElpSQjpCRkJGMknuDlY6Gc319Znhva2prZnVza2NnZGR2gWNlZmZmampja3NaX1pdbWRhTmlYWmBWSkdIS01TWD45X2xpSENVVF1bSUhGRkEuPD85QTg5UkZANzpCMDM3PTc2OTI6PDk3OjlETT1CPDAqPEA7QT0tNUIzNz0rKiwwQipKSy4vKiszNzIyKDU3JCs3LjcyNjg1XXlOMj5IaVpMWkpWYmZAOjNCaEglNZqjoI+LrKGYl6CWpLOxorK9tqGxxry6sbGktqyqrqm5vLu6rcCyrq6utq6yuLOprLmxr66ztrq2sLi9rKaetaqgn6+jqa6cor+gsaOusK63rbWera6traKanaappZ+Vmqeln5mloqidmp+blJyerK+luqeuoqGamp2ZnqSapJ2Xnpebk5ifkqiVqaeak5qakYuVmY2UlJqopo6NiomOe4F0gYGKmIWHfImJhYWKjIqShJSbk5KPkJGWjpB/gIyOgnCAfmZ5bWhraWZxcmtcaGNjdIFiZmdqbmxnampobl1sbHRwYVRjaWRlWklGTE1PWVFQVmFlgVVBVlNZVEZIRkVALzw9Nz82PEZOYTg6PzI0OUAzNzgyOD83PTg+RkpARDkyLT1BPUE9MDVAOUAxLSsuMzw7SzYvLissLTI0OzYjMyopNi41NTQ2NVp8XTE5S2pbTVtLWGRkQEExSmZDJzSRoZuNjrCempOhmamxr5+5v7WgtMK7vbqxpravqK2lt7i3t627rqyqq7aqs7itprO1sq6psLa2sbO1uqapn7WonZ2ooaismqe9mKyjrq+1taysn7Gtr6mim5yiq6iclJympJ2aqqKklpqfnJCbpKqqqbufp6SgmJmZnaGPa6KWmZxwgpWao391kamnnpSUnpCIl5mAloqhkHiGlIyDbWl+doNxbIaLhn2FjIdwXmNhZ4SYhWuLj5SSdHeLhH6Dj39nhoBndWhlV1xoc25OUGpjZ3OFaF9lZm5tal1gYYqPhIRmTktEOUdUZ15KR1BQVVVMSFJhb3RmRltRVVBGSEVDPjE7PTY9NjwzZlw1Ojw3NTtENDg2MDpCNz86PkZMQ0IzNDM9QEBAPTI4QEU9MSwrMDg9RzYwMS4qLiovNTY4LCMxJzIxNDoxNzVYgWwxNk9rW05cS1tmYj5HMVFkPSoui6OZhZWwm5uSoJuqraqjvcWvqbjCuL28rae2sKWro7ezsrOxua2ppqy0pq+1oqm4traop6y2sq60rbOhqZ+zqp6ho5ulppiruZSlpa+zt62upamtqqyloZ6coKemm5egpaWbm6ennZOfn5iQnqepo7Wvo6KinZaXl5ejiKCOkpmGoIeTnKB/pX+lqp6SkZqRiIRyeI2OhYihdoiMaZeIZn1yeKBviIeEfo59f6GgoJmAfIeedIeOdZuKbIeBg2xoZWN6bHFhU4VtYmxpmHFYanFwiFleaVtsbFuIcW56coVnhoRaXkdOP0dfTUVSVlZRUVJXVWdeTVdJUlJQRkdHPjw0OT05PDc7MDw8Nzk5OjY9RjU4NjA8Qjs8OT1GUUc9LjU8O0A9QD41OUdBODIpLjE8STkvMDEuKi8oLTQ1ODMlJjIxMTU+MTw4WIN1MjVSa1tOXExcZ189SzFXYTcwKIqmloOcq5yZmJ2fqqqnqr/Dr7G6vbfAvqqlt7CprKWytK6vs7eqqaWwraW0s5yttba1pqeos7CtsqeunaqgsqifoqKZoaGarbOTo6SltbymrKerqqyopaGgmJ+mo5mZpaOkmJykqZaUo5yTk6OkpqG3o6Sgo5iVkpeTnIivkJeUiamLlqGbhbGAo6ydk5mdlHmC1KiAh5XBm8d5eLGlt5dkf8Ccv3mEhHmRhHyQkJHKcZe8nMV6crWmu5B7gGyWsauweGhrWLGubmVpvJK8bmd6b3KP2H5Ta2O2sn+BcpV0mqGqkFdPV2JQVk5GVVtYUVBSjVxXXFBBXURRTkVHSTw8NTc9Ozo5Oi49Ozg3ODs5PkY2Ojc0PkA+Njk/RVJJOi41PjtCPD9BODpKPjUyKjIyQkUvLjMyLisvKS0vMTg2LSAvNDE2QTE9OleDdzIxVGtcT1tNXmdcPkwxW100MSGMppKAp6qfl5ydpayyqLHCvbK1v7W3vsGqp7OsrKmnrrOpr7a0p6eltKWnuK+cs7K2q6Wkp7GurrCmqp2npLCjoZ+dlpqenK2rk56in7O6oqqpoa2upaGdmpqhp5+Xm6egn5iep6eRnKealJ2hpqGhsKKfn6OWlpKXkpmFr2tqio2qfmaDlYatZHCcnZSZpZRxrqGkfni7fWuhj3axX2q0W6WAZZyRYGaCe2Z/anhrqWS+cmemjHWxanyxeHSSk2NtbaduW4SgRWhmh5ZFdZxgfmh8pKeCWV+Lq2mAlXh5aqc3Sq9cWFNsZFtLTlhfXFdWO06JUFdXL0lUU0pERUY9PzQ2Pzs4OjkwPTg5OTk6PTxEODs6Nj1BQDY8QEhRRzkwNzxBQz5ARDhARz0xMy0zM0UzLi41My8rLyguMC46NS8nJDIwM0IvPTtVgnYyLVZqXE9ZTF9nWTpNNV9ZMzAbkKKVgqyopZ2jpKqxt6y1vb+wtsSyt7rBpqmwq66oqbCuo7C6r6OkrbKjqLionrOzsKOloKqtr6yvpqefo6Kwm6KalpWWmpqrpZWboZ6zs6GrnKKtraCdmpegoaicmJ2jn5yZoaakj52imZehn6qepqafmp+hlZWRlpCahbWbtXiFqZm1mXaGs5u3fpOWlqiUfmuBpnuChoiSlJJ3q2drsVureo2GlHSJco+GgH+IkJd4goKLmIuDoI+EsHZ3n3Fra2x8i06kWEhiYpl+Y2imYHlzdlOSh15QqW1jcX6HgGKcLlGhb1tTa2hgTEtbZFhcWkI/snlYWEEjTWhGQ0RBQEExOT44ODo4NDs6OTw5OkE6RTo6OzY6Q0I4PT9LTkc6NTpBRkJAQUQ8RkQ7MDIwMTtGLDAuOTQwLC4oLzMsPjgzMR8vMi1EMTw8U31uMytYalxPWE1fZ1g3SjhhVTUwG5WflYizpqagr6mnsqyqu7bCsLvCrbi2v6qsra2tpq2xqaGuvKqgp7Sso6u1paays6ekop2nqrKosKelnp+frpafmJSVlZedrKCZmaSotK6hqY+pqKqbnZWYoKSnmp6cop+boKOko5WbnpeZnaKom6WZnJyioJaTkZOTnYPVk5m5cLDBfsWGfNaUm7t8mpWkj42cjaR7joejgqWCeqx5j51Wr3qIfp9quVu6d4eEfaaCk3yYeql4jZ2Pe7FujoR0kbyFb5RQr6fFilGgemNgqWJzc4htl4hgU7W0yIaAiXxjpDNCnXZdUGppZFBAWGdaZGFKSE5uTlxST1lmWUNEP0U/MD08NTk7NzQ8Ozg9OjxDOkY6Oz42OkBDOzZAT0xIPDo7REhDQkNEPEVGODEyMTFEQy4vMDQ4MystKS4zMjM5NzEjJTUqPjM9PVF3ajYqWWlbS11PX2ZUN0c6YVE3MSWbopSZsqiopbSqpbSppLy3wrC5wLG1tLqztaexsKKwsqafrbaomqe5raOvsaCztLChpJ6fp6mwqLSopJudnaqWmJeVl5WWoKmcmZanrbCoop+PrKKolp2Wm6GloZihoaGhmqGippueoZ6UmZumn5unlZubn6CYkJGUkZ2Ism5otXGrh26OpnK0c3K2e5qXo4uPnY2jf5GhpX6wdoOR0tJ2XK57hX+kb5uqpmuHhX2tfZeZjnuwcpKdjnizZZZ0hJ5vnmaUUsiLWsJcn3liX61gdnSHYpeIXlnKnW+/gXVNS7VTVcZkVFFqY2ZYQU9rYGxoUFVISTk9VlJaV1hJQz9KPDI/OzU9PDQ2Pjs3Pjw9QztHOTtANzs+RDsuQ1JKRz4/PElKRkNFRD5ISTkxNzQ2QD4vLjI0MjUyLSkuMjYsNzQyJh82MDs1Oj1QcWg5J1dpXEJPVF9lUDVHPWFNNjIwoZ2SpbCto6q8raa0pqe2u7yyur+3trO5ubKltLOhsbGin6uwpJemua2ksbCctLiqoKadoamksaisqaSZm5monpWTl5iSkqGmn5aSpaqwpqGVk62fpZKToJukpp+VmqWmoZqin62ZoJ6dkJWboZ2cpZSdlZminpWYlZGbhax7d6h2o42IhqlvrYqCp4OYmKCJkpqKon+TmYmuhX+Cs1xys1KufYKCpH9y2H54hn6PnYaZmXavhomRnId3tGGaZZqCgpRsklqwWEuadZh5ZmCtXnZ3h2iYiGtdr3eVno94bDV5yK6yX0JUb15nYEVQbV9wbVZWTi5lZGlTWFE7QURATDo1PzkxPTwxNj85OEA9OkM6Rzs8Pzo+PkU5LUVVSkVAQzpNS0pCSEc+R0s5Nzw0Njo+LzA0MzMzLjIuLjE4Ki4zMiUhMDM3Njc9UGtlPiZWZ1xAPlZfY042R0NgSTo5OZ+elKC5sJa0wq2os6ipsrq3s7i+ubextLu1pLiynrSsn56orJ+Up7WrqLGxq620pJupoJ+oobWmpqmimZ2UpKGTkpuYkZSipJqSj6atr6aglZmpn6KOkaGaqKSglZmlqJ2cpJ6snKGdoI2TnpqdoJiZm5aXoaCTl5CmnoapfX2leKGOjYKqcK2LgaeGlp+giZeXiKOCkYiUqnyAi514b7FaqIKCiKB5dNmAd4h0qIGOm42SpHyWkJ+Ee7JenGSgfoOVbJJcq1tak4CRf2hnqmRye4FrmIdzXaxaiaCOa29lT0pDoVxbTHRdYmdNW2FfcnNfS1Y2SpuUWEdFPUdGQU0zNUE4Ljs+MDVBNzhAPDY9PEY/Ojw2Pz1CNy5IVkpFQUg2S0lOQElLQEVOOjpANC47PjEwMjE0NCsqMDUvNywmMjEoJCQ2NjcxPFBlZUEmVWZbPzJVX2JMN0ZJX0MyPziinpqav6uYtMKuq62ppbSwt7G1vrm5srC2uqi7tJ+wpJ6kp6eek6qwqa+ptayqr6GYoaCmpKS5oqOroJabkKGflJOemZOXnp+PjIuosK+mnZabqKafjJKjl6iqppSWqaeenqCjraOhnqKNlKGYn5+SnpeclZ2hlZaOq5yPrm1ytHOpi3WKp3O0eHOzgJGko5KcjYmkh5B3uG+Me4uiamu2WqGFZZeXaaCip26UcrR0k5h/smqFkoita3WzYZ1mom+Hk2qXXK1fTaF8h5FSc6NseX9+b5iHcVyvVjycd2ZUb24uXKdPY1NrZWJtWmNdYXB7Y1RaUT4+bW8zQ0JAP0w5ITdANi47QDM3QzU4Pz8zOzxDREJKRk1JRjYySlRLRUJJNklKUD9ITkNGUD08RTUwOzswMTAvNzUsKyw0MjYvIzAwLCwdMjg5LzlOYGVEJ1VkWT4vVV5hTDVGTV44MUM4ppubnbuhm7LArq2rrKe3qbivtcC0u6+ut7arwLWoqaCbpaShnJGqqae1o7Knrqqgl5ynoKSruZ2jrZuWmY6kopWMnaCbmJyekZKUqrawp5iUnKypl4yTpZmlrKKRlqqyo5+epquwmaGjkJmilqCblpyXoZKcqZyUkKuZh9SSmrtzsMOAw4Z+1ZabuHiIkJiMl4qMp4h6o7Z1fXd2woKasmCDunnAfHW4Y7WBjIepfZWBrKlxe390vIinoGmdYaaOr6J+jHSHqn2+b3O8dLKDdXiBi26aiHFujaR0vV53fVphebxrWlZcanleamFlZ2JteG9ZW1lEQUBzQENGKzVHIic7PzEwPD83OkI5OT1DNDxATlpeYGBfX19aUFBSS0VGSjRITFJASk5FRk9CPEU4ND05MDIwLjg3LSouLzE4MCItMSwzHiw8OjA4TFhhRidUY1g8L1ReYEs1O0xbLTdBOaeanqK8oZeyw7Csqqursae4r7bEsLmwrbmurcCxq6OinqOhm5uQqaOqsqS1pq2lnpaaqpmmrLmdo62YlKCQpZ+SjJyinZidmpGVkq65sqyVl6Onp5SQlqScpKyekKCoq5+bn6ijs5+jpY6noZSimpyXlaOXj6+gkpSpnoSQmLZ/j5GMt5V4gpOatXdta25zb3mQhY+KdJ7Bu72ae4GxqHCAc5G5g3yGhoyHjXyKh42XfKS7ub2cdXq0o3R2l3Z0sHWZnmaGao21dHJxd7aMXn96fYlog3lueWKLrHB1hX9YW6dqRWVaVGZgY15jUWhncW11Qk5QTUQ7Wk0/SjM7MCA4PjsuMz1BOTk/PTs8QzZCVFlaWltbWlteYGJgXVNHR0g0RElUQktOR0VPRj9HPDc/NzA3MC85Oi4sLy0qOC8lJjIoNCQoPjcvN0xUX0cnU2JXOCpPXl09KzpWVic+OzynnqCiv6WWtMO0rKuorKupuq6wxa60sq22prS4rKmhoaWeoJ2Zk6ukraqmtaenn5uWoKOdrKS+pqGqlpOckKGakY+hp6GTnJeTl5SxtbetmJ2kpKKKkpKlm6Wqm5aopaWcmqGopaekqaGSrZ6Wo56Xl5edno+vqJSbpqGNan1pm6Z4h3J9mY50eWSHe72+wLpvk4NylYdhc2paXpuJYWOIjpVrYICVY22dd2KVa4CalZRlXmBjcJqKaHKLfYWVZ2p+cnR4fX5iW3d0gWhQXG6DfXyLa1hseoJySkpvhnBOdExFV11nYUxaWGdjX09bbnVpclJQREVOO0hJPU0/MiwyQT84LzU/Qzw5O0A7PUM+UlZWV1laW1xcXWBhYWFgXFVHNURGVUVKT0hGUElJSDs4PTUxOi4wOzouMC03Nj01JiIvKjIsJTs4LTdKUl9JJ1NgVjQpUF9MKDM+W08nPzI+qaCoosGim7W6taOspa6np7WxrMirr7KqtKK9sbGmoKKonKKbmZmspq+kpLWppZuXlaGbpq2ovqeopZSTm5WfmZKXpKiokJ2RkJicr7K/rJunnqeiiJORqZqoo5qarKCjmpujp6yjoKujmrGblKeglpSdn52XsKWXoaeZm5CcnKKjmKWhmZuZmZmPlYFnbX1xd5KXlJKFi7WqjYaYlY6KjJiWh5SVioSTlJGJjpKUmJOYlpqgoZqclKCdjYJ6pYZsanyQfIB1ioqBcYJ4eXZ2ioB8impzgXWDdWV3fXdrb3ptYGNdcGhNWFpmamBXWnB6bm1mVE9GUzlPWk1STygrOktCNjM1PUBBOTpDPjxFTlNTVFZXWFlaXF1gYmJhX15eW1RLQ1NHS05ER1BMT0k8OjszODksMjs4MjApNklSTzgiKSsvMiM0Oyo3Rk9bSiZSXlMxMFReOis9OFxLLDwtQLOhs6LAoaSysregqqayp6WwtKrIqqywpLSlwKezoJ2kpJyjlZWgqqeso6O2q5+Zlpafl62qpcGeq6OVkZuXnZeSk6GenaGnk5KZqKeyxK+aq52qn5CXlqedqpucn62ZoZudoqSvp6KlqJ+umJennJmaoJ6dnK+gnKGmlZeSl5OfoJWinZegjpaTioqNjpeukHyWm4OSgouqqYWAmZeJg4+eiHqEkIeGmpKIhoqVj5uXjZGYnaOWmpORnY1/jmahs6+FioR2e5KKfXZ5em9meZCBgIlrdYF5iHJpc397doOGgmt1ZHlmYGplY2Rma1lse3BpalxTTFBEXlRGQD8+LDRARjs0NTs+QTs8Pz4+SE5OT1BTVVZWWFpcX2FjYV9eXl1eXVhWSktMQklPTVJKOzw6Nzg2LzI5NjQuKCYkLTEuLykrKjclKzwoNkNNTUQvVF1RMDVNWzE3RTRbRzU8LEC0oLqvv62rrrKyoKumsa2irLOvxK+qq6Kyrbyjs5ufpqKhnJmXqKWppqSlsrSelZSdmZmwpa6+oKyikJGdmZmUkZShnJeonISfqquis8izn6qkqpaWl5qmnaianqOrlJ6fnqCpr6qmpKyirpufoKCYpJ6cn5yvo5iep5KXlpyRo5iXp5yal2WCknxlfo2akGN5jm1pa3uSpKpqZJqXfWeGimVlaWh7jqGPbGiMl5Gjd2tqi5mjnplzbG56g42HelhlXoaCXm2LiYF2XGhzd3eSgIeCbneCeH9zbXmEdHaIiI6DfGqHWV5sdWRec4lpa3xxa2NeUk5YSWRYQUo0Pkc3P0ZENzE8PT9BRDs7REdISElMTlBSUlRXW15gYWFgXV1dXV5fXVpVT0RIT0tTTj0+PT02NTM1NTU0KiYmJSwqJS8qKyc2KiQ7Jy9BSltKLzdaTzYpRVkvRE8yWUM7Py49pZ+6vLqvrLSxqqWora2wpq2tsLywqaajra6wnqyWoKOdopmZpqqcraOlqKmyrZ6Vo4+ir6W2uaWto46OmqGZk5Kan5mZpJV7pa2iqLTEuKWip6+enZSeop6jm6KpqZKeoZ6gqrCrrKSroKqbp5+noKuVoZulsKSXm6qVoJyakaOWnamXnX29g4hytHKEnYataHi5xLhxk6KjeqWZmHOrgnzLwMC7cYyiiIOffZaYiZ3AvYKXnZ2NncLBfIJ7ko2aw8B9a6WyboyBb8p6f5t3kYOOgXZ5gYB5cXp/h3B3hYyTeW54lGNmX3lkYGWCY150aGxkY1hMV0lRWkhPRDJJRT9EQj4vPD8+QEE6OERDQkNFSElLTU5QU1ZZXl9fYF9eXl5eX19fXVxTTVBHVU5BPz89NjQ2ODI3NiomJSMpKiYuKyopMTAfOSojPklbTCojQlAuI0ZbM1BZL1ZBQjsvOJajucO1sLDAqaiUo6+psK6tprO0r6mlpaawq5+rmJqin5yaqqeinayipaikpLSknaKSpq2rt7OnrqKRkZmcpZKQn6CYm5+ch6aspKutwMCxoKmvqZeRnp2hmaGjqqSToKGenq2vqq2npKSnoaalna2okaSaqK2pmpypm6uglZWklaCilpx+zpR4eqSBeZWWm1+uj16Op4GioHynlptzq4OAr15jjap7p4eFoHWXk4izY4KrhqGNjbNqhK50fZeIt2GDrVmjzW2QdXvae3+ZcH6IknZ+ZXuHdnZrfIhufYWQkX9tg5BhcmxwaGBgeWRccWhqZGdgUlRTV11LT0M1QUhERDg+NjtAP0E7PThAPj8/QkRERklKTE5QUk9TXF5fX15dXV9gYF9fXVpXT1VKPT8+PDU1NzgxNjQoJyQhJywmJi8oJiszHTYwJDc7U0wrLC1LMCc7XDtMLSFQQEY0LjGtwsC/tbSwuJedkaOqqK2zq6ayrKyqoqqnr6mgp5uZpJecoq+foJ6op6OloZ+wrJqdlaeurLCqqKyflJKbn6SSj56kl52no56upauwqL/Hs6ipsa6Wkp2bopefqaqflaCfnZ2tsKisqpyoqKSiq5KsspaloqqqnaOmpKGvn5GYppifmZOTkZegcYWMl3WFqIZxsX2ecqx+oZ6BpY+ed6qCfa1/nHOtfqqGhp92mJJ7fJd+qoiijJGMnX6reoiUkJ+Ae61WnMR6j2+SwX2BlW11b4xtZXZlhm9hd25yb4mKko+EbpKRZnB1dXFhZ21lX29paW5nZFhTXWFaUlNDOUlJQEQ8PjxARkRDRUE9PDw8PkBAQUJFRkdFQENJU1dZWlxdXl5cXl9hX15eXVtaUkM+OzkxNDc4NDUyJiMfHCAxJyAxJyAnNB41LSY3PVdKLTwnPjEpM1ZARiEcRzpDMS4rsNPGxrK0oJ2jjqOjoqyvtq6osKaoqqatq6umoaSdmaGVoKWrn6KloKioop6dsKyXmpapp66sqKeonpeUmqOhkZOgrJudpqKvrKSstaq5zbKtpq2sl5WcnaKYnq2snZegmZ6eqbKqq6qcrKuko6ybr7GiqKuupZilqqipsKGRlaKkmZORhKRqpHWJeql0erJwgqaKmYxxiKCah6RgYFKrhH+ug5t2rYGnhoafepmXhntmgKOJpJmGgqN9qX6ClYeuX32pVZ2ikoF6op+Ae8OvxYtyr7OzuXFiqa/CdGiMjJiOgm2blXFuenh5cG1nZWVycGZ8aWNdV2BqWFlVTExRTENDQUI7Q0BAQkk8PTo5Ojw9Pj4/QT04NjtETFBSVFZYW15eXVxeYGFgX15dXF1bU0lCNjc5OTY2NCwmJCIgKCciKy0iJC4hMy0mQERXSCxHKzU2KjFQS0wjIEE5RDQsJ8PJ1dW/oZmrp6Cvop6wtLCuqayip6aoqquppKafm6Senaanp6OcrJqirKGjn6+inJuTq6S1r66gqJqdlpSmopCaoqifoKWcsKakqLGstsiytaqrqZaRnZyhmJ+ks52aoZSdnqesrKWvm62qo6KqobOtoaqzsKGaqKeurrSikpWippiakXuqbJ6Eh3WreXywb4Kki4mflpaflIHSuLS4yYCBsl9glKmDpIiHoHqYlpp4qsl0maOVqKmRk5qMgJyJmsbHeGahgqVzgZ+Ogn2vXXC0YrB1S6OGbadHgpNkjpCeknxxmJWBcXx1fnxuXGZqc3FmgWteYVlkbVxfWUlOTEtFREFCPkE8Qj9KOzc5Nzk5Ojs7OzMuNjxBRklMTU9RU1daW1tbXV5fXl9fXlxcXFxcWE1CNzU2ODUvKSglJiUkJiksNEVOUFBNRktKVkYqTDAvPS01T1RRHRw7PEYyLCSnpMDGuK2osq2spaKcsrisqqClmqilqquppp+mppiqo5+uq52moKyanqmlnae1n6KXk6mqtrKtm6WcoJSPpayRmZynoqCppq6hpKepsLXDsrKprKiTiZecpZqho66ll6GVmZylpqybsJ6uqaeerKO3rKGxuK+dmq6msrKyo5OWpqKZno6CnU54moF/n3qEo32DpISHpp6cnpOEuHt7ebmCf8zGwrZ4m6GQi59+mpaXinaemIqlmKSof7CFnIWfhKx9mpRipWykcI+EkIF9loJyrGCjc3GAmmC8fVJVdI6So5Z7fpOTjHZ8c4aAcVxubnhyaoFvW2RfaW5iZF5MTFFUQUlIRkk6OUs+QjEwODg2Njg3Ny0qNT09P0JER0lMTlBUVlhZWltcX19eXV9fXFpaWllVU09IQDg4Mi4sKi4rKicmP1FUVldXV1lYWFdVT1VGPEUzOlBbVBwbNj9ILC0gi4eZqaukq7mqr6Cboayys6WeoJWlrq2uq6ecpqaao6ehs6+iqaeyoJippJSitaKilZehqbS4pJuinaOSj6GxmJ6bpqShoq+unKWoorayxLGtqa2pkYeQnKecoqScpZeemZmapqSqm7Cir6WmmK+ku6yhtratnZy0sbewsaWXnK6fop2Fj9G1w7d5h46FkZOQgKZ4lKF3jKCRhKWBinGqhoW0bnJqmaOclYqefJiZhoePc6+CpZuijaaLk52KlZCbbXCyXaVzk3qba5l/e5l8balho3Fxf59ic7K4aHePlKaYfY2OlY15fnmQg25qeWl5cm+AdV5lZW9tZmdgSltYWDxISEBVNEBGPjwqKDYzLjAxMykmNDo7PD0+QENFSUtOUFJUVldXWV1fX15eX19dW1paWFVSUlFGOjIyMzAvKysoQFFSVFVUU1RWV1dYWFdVVVZUUU9RW1UlITJBSCQpJZNzjYqtv7+8urSelqelrbWhopmVo6imrqusmaain6agoLano6mnsaOUrKOOpK2jnZCamqqzs6ScpJypkZSXrZ+fnaajnKectZmiqqS2q8OwqaqpoYyEjpuioKajlZqanJmbmaelp5mtqK+jpZutpr2slL2wrJ6hr7K5qrKlmqiwoqaXeaiQfXywd4qApKWInG2yb6CHrXyhj4OnlZiArImFroWflKqgoZeGn4CZlYB7kn6rgJ2aloureJ2fkYmUkoB5r16jgX2mp2OdgHyXc2qvXaVrcIWZXWBbjKBtlZGmmYOVjpmNfHyEmIBrbn9jf3RugHpgZ2VxbmhnaENaYVs+S1UzVThCQkM3JCQzKycnMywgLzY2NzQzNTlAQ0ZJS01OUVNTU1ZaXV9hYGFhYV1dW1pYU1BPTkk4MDUyLiosQVRWVlZUVFVVVVVUVFVUU1RWV1dYVlVVUUhGSUojKCi9k5qDqcbCtsG0n5qsoK24paOOm6Sjn7Cwqp+kn52tmZ+5oKOroK+pmq6hkKuopJaJmpCusKymnqabrJeXj6yhoJ2loZmknK6YoaimtqnAr6Wpo56LgI2bmp+mnpKVmpuUm5qmpaWbqqytpKWfqqi+pJbCq6mioKuyuKmtpZ+yraeol3avfpCLnIWHfbqtipllsY1lla19oI+DppWagayKhLCFppqkoaGQhaBbbGqBs2B/rXt7g4GxbWdvmZiMiLFbfbRcpINryKJkn4B7vFh2tVmyfVKugHqsWIChbZiPp5uMl5GYmHx6kJ5/ZXV/Y4V4dIB8YWpncW1nZWZPVmRcQVVfPkkoPjo9NCEiLCUfMi4gKjEvMDQ1Nzk6PEFDRkhKTE5QUVJUV1peYGBgYWJeX1xbWFVQTkpGQzU1My4vQFVaWFdYV1hYV1dYV1ZXV1dXWFdXWFlaWltcWFdXR0I70p+zsbe9urPBs6OcrKaktqigipqgn5yztKmfo6CetZmgtKiqrJ6vrZ6sm5WvqaKOiJuOr6yop6Gmma6SmI+omaGdpJ+Zo6OmmaCiqbKpva+lqJ6dj32Mm5agoJmQkpqckpqYqaCimqmuqKamoqWpu56gxqakqKCqtLSrraWeuqyrq5SAqZKjr46bf4ekl5mQgoC4w7qDjpyShKeXnIKsioKviKecm6aqkH7VvcKqYqO/vX1+o4KD17q4tYWUk4Oevb6Ea6KBb6uEbJx/erKwx4Npq7C9rHh3or68c4CWjqackZuRmZ57gpKce2R+fGWOZ3mCe2FsZWtqY1BhW1NqXD9VYkNOKT06NC8fHyQfJTIgHSQoMDQ5NjY3ODo+QUNGR0pLTU5OUVRXXWFcX19hXmBbXFlUUU1IQz89QT81PVNZWVhZWVpZWlpZWFdXWFlaWllZWFlbW11dXFpWWFRXWryVs7Oxv7myvbKhnK6mpbKmnYyYpb+quLKoor+np7KcnrGcuqifra+mp5SUsKyXjIObka6loqygo5yqoJeKopKmnaecmqGoopmfoaytqbmtqKOal5N8h5mRppqSj5GYmI+YlKmboZmqqaGqp6CjqrudqMWioK6jqbOzqa6on7mmra2Zc3WqpLeGZImgcGiukYqQbm53pJCZn4F1rpiUcI+LcZWoo5uXrqRybWxsZot4b26CmXGBempxaWeJlpaYcWlphIdmcIZkXYhiam9ZXGZ9dqZfYXGOkW5lZX+Nk4+hmJmZkpihfoiQlndniHhpjmt6f3llbGNmbGJLZFhKbFo6UGVFUidLOisjHCAbIiwpGBsYLTIuNTo0NTc5PD9BQkRFSEtMTU9RU1ZcV1pcYGBhXV1bVFBMSEQ9OkFCN01YWlpZWVpZWFhZWFdXVldZXF5eXVxcXF1eXV5dW1tVV16plKyzqbm4srOqqaGunqOyqZeSvrLEyb63qp/ArK2koaesoLqjpK6srqeOl66pj4uFlpetnaaqoJ2jo6CRi6SSppmomZajqqCWnaamp7C6q6yam5OSe4SWjaWYjZGRmZSOmJaolaCYqaObsaadoqu5n6/Bp6OypauvsKmsqqa2oqy2lYqgqKW2nYmWo5mHqpuRlZ2SqbKZmqOqoLKWoqGdn6KcoaWhlaunjZKSjIeTnJyUkJmTmZGOlYWBpJqXlo6Lk5OLj4aEfWeJfnSCdXOGinCnbHqUkZOSgYGNj5CPnJShlpqYo4OJlo9zapF3cYx4d3x6am1kY29kVWFZQGpcSGNhT1krRj0rJyE3NTAuHxwhJTIoKjY5OTQ2OTs+P0FCREVKS0tNUFBRWFVWWV5gYWNdXlVRSkVEPjk9QEFTWFtcWVdYWFhYWFlYWFpbXFxeX19gXl5eX19gYGBfWVlgppaoqqW0tq6uoa+jrZ+gtbGQjqzHvsa7uaujpZ6cpp+xqaS3p52ptaeokZitoouHiY+cp5WspJ+Yp56ekpSjlqeaqJmUpqGkkJunmaG2u6irmZqQjHyBlIuhlIqVkZaQkJSYppCfm6qfnLajnqert6euwa2jtqWur6+rqKiyt6Ctu5iRpaSmtqKSnqegjqqgjpKfo6yvmqCjr6ivmKOgnKOqnZ6dnJarnZOZoZuUkJaqmY2YmZeQlp6RiKCdlZWFkoyQjZSKgH1mi4V1hnV4h4JznGqFj5STkIl8i5WSkpeUopOemKOFipqJfHOXc3qLgHN8f2pvZF5wamBbYFluZFBgZVBaOkdHRT4yPT45LyomKykmHSY0MTY2Njg6PT0/QUFDSUpHSktMTVNTU1VaYGBpYGVWUEpBQ0I6OUVNVlteXltaXFtbW1xdXV9fXV5fYGFhYmFhYWBiYmJkYlxbY5eVo6ejr7KsrqOppq2fp7WqkJCdpbW8sK2toqOae56jsqSlsamXm7mmo5OZqpyOhoqJnKKPrp6ilaifoJKWmJqti6mWj6iZqY2ZqY+eurakpZmbjYh5gZSMmpOKlZKUkY2Sl6ONnp+pnp+4o4CEr7Wir690o72jsZ93eZ+psLmUdayjnomAqn9kXGJ2oI+ln4SXfW2Ss5yjp62qomWen5JzeZmXcICYqJdtf6KoimWcpZyRl5iWjJKckYadmo+Vg5KHjo6SiYR3ao6GdoZwe4V/f2Boh4qUkotadZSQZ2iQj3N7p5ubZnqaiYR5mWqEi4RveYBrcmVfdnBsa2hbZ2ZiYnBTXD5OTk5TRz5AVUQ5MS8eHyY0OjMwNjY3ODw7PkBBQUZIQkdGSUtNU1RVWV1gaGZnV1FKPERHPDhVUltgYWJgXl9fYGFhX1xdX19gYWFiY2RhYmFhZWRjaGReXWablaajoK6wrKuppaiuoqatpJKWq7axsqebq6esl3SMnbCfqKunlJe5oKCPnKSdkX+JiJuejayaopSnoZ2OlpGehHWtj4imm6mRl6SJnLu0p6CZmIuJdHeTjZaTipORkZSNkJSgj5uhp5mcspaAjJu1nLOMko67pqB+p6J6oa21gI6NpZ6Di4aQsaqvjIqXpJt6gIushpydoaeop4eVhZh3pZt6h5uBmKeCgnucsnqKhqCXmZSYloKRl5eEmplieYeQhI2PkYqDbXCOhnmAcH+AhH6Fc4WElZF4lmeSdKCadX2ZhKKfiJh/lIyFhZprjo2GbHh7cXFnZHhvamxrW2VsamV0XF5JVExSQEU1LlpVVTcpITA5PT43NDM1Njg7Oj0+PkBEST9JRUpLR1NYW1lbYWFoZllRSDlFTDw+YlZeYmRmZGBhYWBiYl9dYGFhYmJiY2ZnY2JhYGVkY2djYWFonJijn6asrauorJ+osKamqaWZlK/Iv7Gil6iptZ6QhJ2snKeioI2Qvp6ajZ+aoJB8ho+ZmIisnKKVn6GRjJKJhoCRp42Hop2klJieh5+6sqedm5KOhXB1kImVkIqUkI+bjJCSn5KXoaWWnquHn7SJtJqtisqHqa2It4WNsIGvrIKojKaYjZ19qI9ye3ecj6eXaJWkebSMn56mp5KYwoF/q4iYoXKegJqlfZeFlbKBoX2hk6CQmJeBjpObipiRi3yFk4aNlZKJg21yj4V+eXGGgIN7g3SEgJaAj8Vmf6mHj6NrnoSjnISagY6Ph4uacY+ThWh3dHx4aGh2cWhobF5kcG1nbVhnR11STTJENDZOYmQ3JjM8RUdEOjY0NjU4Ozg+PT0/Qk0/TklKTENQWl1cV2FeaWxcUUU9TE1ASmRYXWNmaGdiYmJiY2NgX2JhYmNjY2VpaWNiYmJlY2FmY2JiaZSWoqCwp6iopaufo7ewqaqmmpSgo6SrpJemq7ijsIChqJ2lnp2JlLyalI2hkp6PeYSWlpGIq5mbm5mihY6Ld5qcj5+QiJ6lnJaamIejua2kmpyMjH5ibY+Lk5CNkI2NmIyRkqCPlKGhmaGnfqGnh62doJatj56cnZGFgKCMqq2Fo42pmYyaf6N1gJmUa4Ktdk2reIeNnJGaqKeAqat9g6F7eqdpnn+Sa2eXhZe3iZ5+bmBkWYOXf4x7ZGiLcpl9eZVsXXyWbV9TcINcX2t4gl9YZIF8g3+XcKeqa4OjbnKlcJ+FoGpmoG1bb4x9Z1pghIBiV1Bvd2ZtdHNram9ea3Fta2lYaU9eWEY5QTRIRF9rNCxJQ1JNTj04NDg1OTs2QDs7PkJPPlFSTE1CSlxdX1deXmJ1YE1EOk1PTlRiXFxmZmlpYmJkYmRkYmFiYGJkY2FjaWtkYmRkZ2RiZ2VhY2iXlZ2guKCpo6askaC2u6utopmYoaKlra6hnq+1o6iToaCgp5yajpm0mpCLn4yVi3WBlJKNiqeWlZien3+ShYWrpIeakIqZqZmam5KIprGnoZWaiImAaW6IiIuOjoqLjZKMkJKjjJSfoJyhpH+TgY+joZSgd5yVj6eDoaZ/hqirg6V4iXyEmn6icHOUiJZ8n415bYebjJmPm6iaj4ede4Kic3amZp5+d6RfmHp9k3Sibpi3tLp0k4eCf7WoZIHGuHtwlbaMcX+apGJzrKtgfGmds35tfIaBjYKLmHF/o2xyo3SfhYGkYJ2Zs5ZxfZifs3VzW56yg2pjb3R2cWhvWGttc3JmXGleY0xEPUQ2UUJacjM9U0dfSlI9PDM5NTo6NkQ7O0BKUD9VTU5RQEVfXltaWGBgfGRIQzhMV1VXY2BaZWZra2JiZWFkY2BhYmBkZF9gY2tuY2NkZGhkYmdmY2hok5aUo7eZq5uToI2kt7StraCaop2ko6aunZyyrqyTmKGZoaSZmpSfq5uLiJJ4i4VxgJaOipChj5KUnZh9kImNp6CHl46JkqOUnJuNi6mopZ6Pl4eEfmp7h399kI2Di5CRiZCUoIOXnqCdoJ6LiXecmKKMn3Khi4epiJulj5WmqX2tjH56oJl6o5N4gXSWiI2cfZafhpuOmJulhqJkoXyIlpCbjWyeaJqNbpqZeoCLp31yaHSrg56DdKpolZpdm4V2hJ1nqmqAuGZcqHCBnGCVjF6ndnWHiH6eaJp0hZOSl46An2+akW6nml2ofni7a36qXI6EXbRnXG5yenhraVxxa3l5Y19mWGJCUUZPN1dDUm81S1taX09aREAxNTE7OzZIPzpDSFU+WVJZXT5EYl5WYFFhY31qRUI5TlteWWVmWGZnbm1iYmVfYWFfX2BgZWNeYmRvcWBkZWVrZWNpaGdraZWbiam1m6eIY5Saq7mxr6yeppycqaCfr5yesamtnZekm6GgmZaWoaSZhomNaoiAcnuXiIuWloSRlZiQeoqDlaOcipSPhoyekp2diZCpo6CajJGKgIBpgId5f5eMe4mOjoiPlpt/lKKfoKGTmHJon4qfj4xwkoyBqYeYnqGlnqZ7sK2joriXd6OzoqSAiJR5nXuqmn+ijpyaloiXcaF8hY2vtX1rmpGheH6YtKKjq6iEmXybfZ2af3SqWl1ve5aLeJ5iTH57eoVjeZdCTJ9Yompxe45sgIiEmXWbeIaJsbN/gJuTp3eDnW5zfZVwmnRrpF2VdkhlZGB0cX5+bmZgbGl2e2RkYVFfV11VV0BZRlFoRFNXXGJYXklEPUI4P0I6SUY4TEVYQVdSW1ZERmJcWmBLYG1+ckVDPFVfYlpmalZnaG1vYmZnXmFhXF1eYWhiX2Vjdm1dZWdma2RmbGloa2mTnICwrZmEU16gprO5srKpmqKMnKycnKqUoqykoqiPoJ6dm5mWmKGdloiHiXeGgW95lYWRm4t8kZOWiHKAiJKgm3ORkIGJmpWhm4WPqZyblYuLinyDbISGcYGhjHiGjYiIk5mWfJOjoJ6iiK2GfbWEjp6ce6WWeqmBlZuPiZ+bfKdod21+mXShc3F8noaZcJODrn2kg6admYCkb16oZ3WiY2+lYZzTkHx7mXhyc2OihpB+o3Okj3VrkLOMYIKYiXOqsqe8f3eDbX6+pqm0XZtufHCWbX9yonJdpGdzpmBopm2b1Jp9hptwenuYbJx8eJdzbqmkZ2BlenGAhGtnZmRvdXdnYGNTXGZRUWJJV0pUYVdTW2VqW2VRRkNLTUpLQktFOE9AUU5YU1lPU1FhZWVqUmN3eXdJRkVjXWVaaGpUaWhqb2NqZ2BjYFxdXV9oYmFoZXxkXmRnZGtkam1naGxol5qAsKtUXEt+qa+xtK+zo5uZhZmpoKGkjqWpoJmqipqYmJOZk5KhmI+IhntwfYRofY+DlJqBd5CNj4lvf4WPkpJsl5N8iZKTpZaDj6qblJKLhYl5g3aIgG6Cn4Z3gJOGiJmil3qUo6San4mzoaK2i3qsp6SupXCpgJqOhYCakHukgKGZhphynoSjrq+Kl4yAjaSNlYOtoJR2tLW1yaFzlIuBn2Cdl6lteZWHoJt0ood3oH6Sl4uBb0xmo5Jwm4dzpHt6dGGDgWt+oGtxZF+ccX1zlmh5abO1tMamc5h9ep1rnJurdoWbbXZ4mGqae3WYclBFfbRfanZreYdmamdjdXVwblZeVFlpUFJoSVZNWVRWXWhrblZnV05LQUpNS0hKT0FRS1BlY2ptZXRzc355fG51iXt7VFBPbF5pXGtpUmpoaWxnbGZjZWBcXV1eaWJkaWt7X11kaGNqZm5tZWlsZaGbiK6mhGU/k6Gyqq6vtaKikICXqqKjpYylp56dpoObl5aOl5CPnJOOiIN6anmHZYONf5igeXWPiIyBaYSFkYOMhZ2Neo2LlqaTg5ipmI2Ri4GIen99i3lwkKGGeoGVh4mWoJZ/lKWonJaWhGZueJxsomR8caV3m5hwZ6aAlYp6pHqfloOXcp52gYqVl4+5bpGKomJ9maCViG1yaaprdaBtb6ZfmmmLkGmWh5uVdKKAfZpgjIaNdW+IYmigZZ5+aZt1b2NmiIJtcaJaX1tioW1diItuen1zcmSlbXiiZGenaJlzjJlwom9ViZBvoF9mqFSLXlSYbm1za3KCbXBpbHlza29SWVdXZ1pTbUlZT11JWGlpc2pZa1ZRUkVWXExYU2FVaWtfd3R7fXB9fHKDe4Bzdo2AhHZeUXJiZ2NwZ1BqaGhrbG5oZGdfXV5dYGpjaml2dV1cY2ljampzbWZrbWOcpJilemR0bYunrqOpsLGmn4yAmKudn6aMo6Kbo6KBlpiTjpqQi5iQjop7hnGAiGiLi3yYnHN0iX2QfGSCh5SJiZWZgnyIh5eokYGirJGGkIqCin6AgI9zaZCmhH2GlI2JmaCPiJOppp2IpniVm36liJaMspiekIKvl5+ldpSGeKlzpY+Emm6kooyShI2Du259pa+DhoWGk5Wcn3ylenKolaCWZp5+b6xjlYqWk3epbKmigYl2iIN3qpGmh2qRsGt2s4ypa4qGbW2fnpKVYH6ri6p2fn6LpZ52n3yDpJWdoGqbiHisaJ6tjLZ0d76NpJNZg6aNq2F1cnRxfHVxY2t/b2hsU1dbVmFiXWtNXVJdSl5tbndfW3FZXGBbZnRlbm9yYnF0YHd6fnlyeYNzg3+Be3uMgYKAdmJ4ZGNucmRSa2dob2xyamZpYWBeXGJrYm1sem9cXGJpYmxqeG1nbG5ilaWqnIB/naOWqaqdqKaupJmKgpismp+lipulnamdhYyaj4eckYWSjYyNdIZ6iIRwjYV+mJR0dIVykoNtf4uRh4aTjn17goaZpo5/pqaOgY6JhZR2goeTb2yLqYGDjJSOiZ2fioyUq6Ogj4B1lJeIfoF5lK6jf4GbcY+Gd46Jgn17cqeMcX19epiWm4SPeXt/foeTlZOKdpCYnqCDe32Ja4yFW3l5cnpxaW5+kolxgHWBj5STcYaEgmWMf16Af4t3dHKUdW55bm2GbISFXnVnd45lgICFjaiafXR7lWqJiHCBdn2Hd25tZ4xzeXyYeIVca1h5j2lueHJyb3h4cF1rh25qZ1ZbYFdcZmtkVmJVX1FfcHh5bGt2Zmpra3Z9cXJ1c2FvdWJ0e4F4dXqDdX+Af4B4ioWDfXttf2xkeW5eV25naHVreGppamVcYFpjamVtcXRuW1tibGRsbHluaGxvYY2UuKimiaCimqakmKWcq6KhhISYrZKeoYmbp5qpmIOBm4t/lpSHjoqJjXKDfI99fo+Fe5iPdHKDcJWFe3ySi4aGj4V5foCHmqWOfKehi4aQkIWVg4aOmHdyhKqGjZKdkImfnoiMm6ifoKqDiI6Vmn5+iZatqI+Rpo93b5uPgXiQbn6ohXB9lXFrcH2BoI2Ak46MaG1dg4uLm5qejnOVi4hxdGuBdnSBWXJuhpGBfn6Mal1qZHuFhImAYGl3epp7goqBdYGFgmd3iYVqYXBxgXVecYqAiI6llIVli42DbneLhHGGkHpxZ2hlfIR6lltcamdudlt7eXh1bnNzgmdcbYtra2JaWl9aWWxxXF9hWl9dZnR+e3VwdGNra2t8fXN8eHVkbXVobXx+dnp8e3l6gIB+b4aKhHt9c355c39oVFxxaWx1b3Vna2hkXWFYa2hsa3FybVdbZW5sZ3N6b2hqbWCLi6qwoI+ioZqenZeemKijon6Dma6OoJWInKKRpZV/e5iFfZKZiYmGh4pzfYGMdoWLgoWXinFvgHKYhoN9koOEhoqBeoGFjJyhkYOmooh4jpeJlYqLnJiEg3qtgpGXmpWKnp2IiKGrn6Gio4uHk5uco5mWqqGnpp+SmoaUjHp2jY2Dp35/kpCTlJyyppuVn5CNspOXg6WMjJWan4mQm4KIkYprfI53eGWChpCLfImdhIeLkIiIgISEkHd8eXSZoIiGiZ2JhJN+fYp/f3VvcoSBfXeGhoqPpZCChYyGgoyQjH2HjIqRhHltg4V9eplrcmhhdIpxfnp3d3B3dIFdXm+HaG5fXlpdXVRoclZkXFxibGh1e3xzb3Bka2tpgHxueYByanBwbGeBe3KCgHh/fX+Ee22CjYZ8eXh7fXqDeE5kdmpybXB6ZWtlY2JgW3RmcGZycW1VXWx0bWl5enFnaWtkjIecuZ6WoqCYlJiYlJikoJ58f5qsj5+OhqCdi56WfXiUg3uOmYmGg4SHbnmBgHKBiH6JlIRta356l4eEg5B/gIaEhn2HhY6cnpOHq5+EcouQhpKRi52SfY57qoSOk5iWj5yWh4abpZ+imp2FgpKamZmQmqafpZ2dj5V/j4h1e4aNg6R6fI6QkYaYq6GelJ2QjqqNkH+djIiTmZ6Cjpd+ho6Db3eGcXVgfoOPhnWMmICDj4KGhH6FhJRueHV0kaGKi4Wag4SMc3+Ie3xycXqHgnp3io2DkaaOhYOOgIOKiYp3homKjH5wbH+CfG5obG1oX3p/aX18dnV2dXt3XF9wfm51YGNbXV5SZ25UZVteYmtpdnp+cWxtZGtqZ4GAbHOBbGx1b3lwhXluh4B2goB+hXZxgo2Ifnt6fH97gopgaXxqdWhpgmRqY2BpXGN1aG9idW1sVWNxeWVwentzZWptbYqJnreaoaOfkZGVl4uanp+ee3ifp5Gci4ellIuYmXl6jYV8iZGDjYKCg258f3lzgYV+i5F9amh9gpiJgYiOfH2GhIZ9j4KQnJ2SiaidgHCMi4ySh6ChioWMfaiRiZCSl5OWk3iMo6CgnZaZf4CQmpiSjJujoaSZl5GafYyDd3+Cjoaff36MjI98mKWhopOakZCmjI+BmpGJkpebfpOSfoeOgXR0gnB3YX2AjYZxi5V8iIxxjH+ChYaOaHdxeIuXkY9/ln2HinGBhnp8cHd6ioN5eY+LgpSlkouEj3qGhoeFdoKEiYl8Z3N9gHl7cWxrZ19+c2h8dXZ0fXOAal5gdHZwd2RjWV9eUmtpVWVZX2FoanZ5gXFna2RtaGaAgWtufWhvcWx+eId6bIyBc4GBfoF0doKNhn98en+BfX+PaXKDbnNpYYdobGJfcVZ0b21tYHhobVdqdHZjdXp7cmJqb3qIjJ6ykqWlnI6Pl4+GnKCbnXx2paGOmICNo4uImpZ5e4aHfoOKf4mCgX9yf3t0doOFfoqReGdjfYaXioGKjHh9gI2DeZeClpmXjZegnH5wjIKRlIamm4iMiYOmlYWTi5aXk5J3kZ2goZeTlnl/jpiXjpaanKSdmJKUmniOhIJ3g5WNnH2BiY2Mc5ejn6KTmY+PooyLg5aYg5KWmX6YjHyIjYB2cX1ue2SAfIqFcIeTf5GCbIeCgYCJhGV1bnuFkZeLfJJ3i4h7f4V7enF9d4iEeIOPiIqXoZSBgop2iISCgnd8g4qGeGF6eX50f3hnbWVhf2pqd3N0dX1xfGJjYHRudXJtYVphXltsZVJjWWBhaGt2eYZxYmpjbWVofYNsaHRobnBpgH2CeW2QhnGAhIN/dHyDjIGAfXqCg358j212iXR0bWWKbGpiYnZWhGlwbmB4Z2xianZwZnl8enFgcmyGhY+crpemqJ6NjJeHhp+Tl5l+eKqdi5l6l52Li5iQeXyBi318hHyBg4F4dHl6c32AhICJi4BkX32LlYd+hIZ0fX6Kf32ZhZeVmI2kopl/c4d7k5KKpo+MjoqToZKDkZCVl5GLgY+Xn5qSj5Bzf42SlImdnZ6ml5eMlJVyi42Ja4SXj5h6h4iPiW+XnZqklJWLjJ6MhoKSnH+SkpWHmYh8iomBenF5a3Vse36Lfm2FkoKUeHCBg31+in9kcWl7f5aXhH6Mc4+HgniFfHV3f3yEf3uCi4OLkqOPeIOBdImHfYB0doKJhXBhfHZ6cX1vYm9jZHxjbm92c3h3c3RhdmBvbHVtb1xcX15eal5QXVljYWhudHuIa2BpZmpjaXeIbmZsaWptaIF9e3dvkIhzgISEfXSBhol7g316gYR9fI5yeot4eG5sh2poX2lyY4dncW9ld2dubGF5aWt9e3hwYXhti4CYmaqgo6idioqRhoqdi5WYfnivmY2XfZ+UkZaTiHd+e4p8e4B3eICAcHV0fG+GfYGBin98YVx+j5KGf4ODc3qAh3qPkomTkp2Tpp2Vgn2BfY2KkqSJjoqNmJuNhpGYlJaPioiMkpySj4uMbYOPj5GJnpmioZeViJaQbYeYg2aFmI6TeoiEkIpwlpqUo5OSiYuZjIJ/kJ19ko+SjJmOe4qFh3NydWtwbnV8inRuhpCOknF1gHuBgYd7ZHBseXyZk32DiHOQiYBzh3huf3x/hXuEi4eDi5SnjHqHe32LhXd+cXCBhoRlaHl1dXB8Yl9wYWt0XnFqe3l5bHNwZXhdbmxzbXJYWl9fYWtaUFdYZWNncXF/h2ZdamlnYmdxjW9kaWdlaWiBend1b46FdIGCg3t1gomFeIV8eISFen+Jd3+Le3tyeINqa2BwaHSAa3JvbXJnb2xlfGNugHp3cWx3d4p+opehqKCmm4eMioGQnIeTnXaCq5WTjoehjZaTj390fHaFeHl/c3N7hmtzcHptinaAgYhvcVtZfpGNh4B/f3Z1gICAoIaRi5OdmKGVmHiKf4CMiZydio+GkpiWhYmVmZCXi4uMjYyciY2Pgm2Ji5CRip2WoZyXlIWXh2mDooJlhJyJkH6Lg4uBd5OYkp+TkYmJlY1/fo+XfJGNj42akXyKgINudXBsbW9we4Vpc4OOmItxd4B1goiCeGZybnWAmY57h4N5k5B5dYdzb4h6hIt5ioWCh42aood7g3WBi393eW5sgoSCXnN1c3FweVpfcWFwa15wan17cW1tamx2YG9vanFtWVhhYGFuWFFUWmZnY3VwhIJiXWtuZGJma5JuYGdmYGdrgXVyc3CLgHV/g4B4dYCLgHmFf3eHhneDhXyHjH97d4p/anFjfGOGfG5xbXRqaG9sdnhfcX95fHV1dICDfqSVmq2eppaFjYN/l5SDkKB2jKCUk4aLm42Wjot6cnh0gnByhXRxdohscG12bYh2g36Abm1VUYGrlIeCeIB3coN6gqGCk4KVlJmck5t4knuDjJKkmpOOiZWZkoSHl5mMlIuJj4+HnYSPinxyi4WJjoicmp+blZR/k31ohJuGZ4Wfh5GDkYKJcYORmJCcj5CMjI+Nd3uSkXqOi4ySlox8iHyAa3ZqbmtsbHt/YXp+jpaCdnqAeIOMfHlmc2tzhpWLfoeFepOOcHmDb3WLeYiLeYd8gIuPnZ2EfHp2gYt8d3BqbIKEe2B5cW5tc3RWXnBicmFgbG56cWhwZmZzdGhxa2F3ZV1WZmBgclNRTlxmZV15cIh8X1xpcmJiZWaRal9oZVtncH1wbHF0in12fIWAdXV+i3p7hYB4iINzhoV+jI2EfHmVeGZyaoNgiH1vb2t6YGpudH91X3R9eYZ4dHOFfXigj5mwnKWOgop/g5qIgIyegIualI+FiJiPj4+Ed3R3dIBwcIV0cHKEb2tpd26Dbn19bnVzUk2C38iS1pN7cHWDdYSgg5R3lpKZnJGZe5RzhZCfoZOTkYmTnJSGfpaWiY2NiJKNiJx/joB3eox+iYyKnJucm5WSeYx2ZoeQhmuHooSRiJeDhmOMkZmPlYuXjI2Ki3F6lIh7joiKk5GJeYV8fmx7ZXJva2t6eVuAeY+PgXp9fn+Gjnp6Z3JqcoqOiYGFhHyUimt9fm1/in2KhXyDeYCOlJmZinx1d4OQeHJtZ3GAhW5rdXBoanVuVF9wZXBaYGxyeGdra2JmeHJwcGNfd2BgVmtfXnZQTkthZ2NdenCJdFxcZXZgYWVlj2RhZ2JYaXNzbmtyd4x9dHqGgnV2fotzgIZ/eol/comHgZGLiHx+mHZlc259ZYh+b3BsgFlsbnl5c2F2e3uNdnJ3ind5n4ubrpufkIKFd4iVfn2KnYiGoJGPhYyYhJOOh4F0d3B5cW+Eb21vf3NlZXlxfW16fWpoa2OkmsHcrvChcmx2hHaFo4aSb5eRlqGWnIGScoWLo5eJjpWKkZ2Wg4CVkIWJkICRiomWfod6dX+JeIeEjpyamJmOj3aJdW2FiIp8iaKDkImchIVei5OXi4+Jj4uLhYlte5aBfYiFiZGPhnaFfX1rfWR4dWpueXNXiHqSh4V5foCAhYx+eGVyaX+JjomBgn6LloRrgXVtho+BjoN9gXh+j5SSmI90cneHjHVzcWd2eoRjdW5xYmp3aFJhcWdrVl9vdHphcmRfaH1wcm5aY3JgYlZuWVx4Tk1MZGdhXndziW5cXGR5Xl9kZYVgY2NfWWpya25rc3eMfnR3hIF4d3uJcYOEfH6Ie3SLiYeWhox/fpdzZ3VxeW2Le250cYFXcXp2eXJkd3mHjGl2gIlyf5yHmKeco5KFfXGMlHh5jJ6EhaGNjnyWjYCZh4R7cndwdGpwgWxqbXx1X2F4d3txdXxoYGR869q1ycPch3JsdIF2i5uJjmqZkJCdlpSBiXGFiaCOhYuVioyYlHyNkoiDiZB7kIuFj4F/dniDhHKIgpOclpSXhox1hn1ug4GIhpihgpOLnoOJYYOVj4eKhomNiIGHan2UgH2DhImOjYJxhn5/cXdodnJpdHdrWox8koKFfX+DgISKgnVhcmqHgI+KgX5+kZB8bYFrd4SNhZGCe4B8fo+Rj5WIbnB5jIZ1a3Fsc3mCYHVqb11rd2BSZXJoZlNgcHZ0YXBgXWiDcXNqV2doYmlYbVZbdUxLTGZnXmJyc4VqW1xleV5eZGd7YWRfXVlrbmVvanR4in5zc4F+e3Z6h3OFg3x/h3Z2ioaOmYGMgnuTdWx3dXl4k3RueHp9WHqGcYBvZ3l3koJkdoaFcIqWhZmhmqKKh3Rvk4tyd4+cfouaiYl8oH+EmX+BeHJ0bm9kcn9pZm14eFxfeXt7cXGAamFmYX/Vto6RpnhucXd8cZORjYdrmo+JnJOMhntph4uZhoGSkYaHmI58jYyAgYqNfI+MfYmEenR6g3txhoCWmo6Tk4GIdYOFdYJ/iZGcnYWUjp9+iGKAk4iFiISKjoCAg2d9kYB+f4KMj5B+bYJ8gnRrbXd1dHd2a2ONgY6AhX58hX+EiH5vX3FvhHuOi4F7fpCHeXCDZXmBiYWKgXqDfH6SjY+ShG5ueYt+dW1ua2x7fmRpbGpZbndaUmpzaWJRY3N4bGJlXlpqg25zYVtnX2RsX25VW3BOSE9nZVxnbnGAbFpbY3NgXGNsd2RlXV1abGxjbWpzd4d/cXCAe310eIZ4hYJ8gId1eYmBkpZ8iYZ2iYFweHl7hJNvbnyBd16Df3SBbWl6c5RzZ3OIfHKSkYOan5ughoh2dpV/bXeVmH6IkISKjZp9jJp2fnZxcGxqYXV8Z2JqdXpaYHh8em1xf2VjZ2dXnY9fcXOWvMSEd3GUipB/c5iMh52UjYh0a4iPlYB7lIyBhJuMfIqGfXyJjH+TiHWJhXZ2fYFxdYaBnpWGlI+CgnF/h3ODeoiWm5aGk42cgIhmfZOCgIaEiolygn5nfYt7eX9/h4uPfWmAfYN2Zm95eHN3c2xqjoWKgYp/eIKAhIN/al1wd3p9i4iFe4COf31xgGh4gYaJhIJ3gnp/louPjH1ta3qJfHZ0b2lofXdlXXFjWHB0U1Rvc2hiTmh0eGZhXl1Yb4Bvc1llYl1qbWBwT1lsUkRUZ2FabG5te29ZW15sY1pjcHZkZ1xdYGxqY2xpc3eBgnFufnt/dHWDeoSCfIKFdn6JgZaReIOKdIGIc3l5fo2Qb297gXFpgXl6fm5tfHaWa2p4hHRrlI2FnpigmYWIb36Mdmp5mY9/goqClZeKeo+Wb3pzcGxqZGB0e2lgZXJ7W2FzfXpncHphZWSOsbJ3S2JapdrRl3J7koyReX+WjIWako2Gb2yGkpF6eZOHgYSZinyGf3h4iYqElYBviodxdH17anmGg6WRhZOMg35ufoJ1gneFmZiTipKPlIWHcHuSg32DhIqEb4F4aICFeHJ/f4OKh3xlfH6EdmNwc4BoeXFvdZmMhoOKe3Z4gIR5gWpbb3xyf4eDiH2FiHqIcYBtcIKFjYKDcYN3f5iLjIR3bW19hH92emVoan5yYVp4W1lybk5YcnNmYEttd3ViXltbWXV9cm9XZ11manBfb05XaVI/WWdfWnBrZ3lxW1tZa2VZY3F5X2hdXmVsaGZsaXF4f4dvbX99gXVwgXuAgX+Cf3aBhYmXinGCjXF7hnx6eYSUjHVren9rb350gH1vcnx7lHBvgH95ZpKKgqGYnZKDhWeHg3BnepeKfn+FgpmKgXyNjWl4cmtrZl9hb3ltX2JveV1kbIN6YHF2X2Rl1eu+izI6PouOgHJ5homPjXeFmI1/k46Nf25shY2MdX2Pf4WClYl8gnhudoeFg5Z3boeEa3V7dWV5g4SnjIOPjIN9bX9zdYJ4hJqPi4+RkoyLhn57kod4gIWNg2yAcmmAfnhtfHuBioN4YnmEgXFkcWh+bXVxdYGbi4F/hX5zdX2AcoBuWmt8c3iIgYp7hn98h3d5cGuGgo6CiXGAd36Viop+dG1qdoCAdXVcaWl4cVpXflNacmVMW3NyZltKcXhwXltbWVx1f3VpWWJbZ2VuYmlMV2ZRPV5mXV12Zl91cVtZVW9kWmVxeVtoXmBnbWdqa2lweH2ObWqBhH95boB7fYB/gnp1goGMk4VwgItud36Be3uIk4l/aXt9a3R8coZ7c3d9f4x6eIR+fGuMjISbnZaMgoBsjX5raH+Pjnt+f4OUgn99iohrdXFnaWNbY2dzb2BhbHRhaHCJemFzdF5iY5ugkG5cNVqvtXVqgIp+k4Z3h5iHdY+MindwbIWDh3R5iXiJfZOIeX5yZ3aIfn2Xb3CGfWh2eW5leomFpYeAh42JfW19dX5/e4qXhoGTkJeIi4SJfI+JcXx+hXxpfm1rgXt6anp2goeAcmB3gn5xZHJndYJtdXuGlJGBfYF/b3d5e3R9bFdtfXVzioCGd4Z1gYl6d3JtiH+Of4NxfXt8kYeIem5taW2CgXRuXWhmdHJSXHxOXHFcT1xzb2RWS3N5a1hZWVpgcYB1YV1dYWdkaGhmTlpoTkFhZFxgdmFcdW1YWFN0YVtlb3NXal9iaGtnbWxpcHd8k2xohIl9fHB+fnyBf4J6d4CAiYuEcnuHb3F3hH97iY2Pg2p+e254eXeKd314gIKHf4R+fnpthIyImKONhYR7dot5a22FiZJ5fXuCkoCAfYqDcHJwYmZeWWdfcHBgYWhwZmpviXRhdG9bYGRqdnt/vpynpMi4coWEc5N9eYiUhHSRjYhyc3CEe4NzdYZ0iHeUiXl5cGN3hnmAkmlyhHVmd3ZjanyEiJ6CgH+Oj31xfnODeH6QjoJ3lY2Uj4iCiHuJiWx5eX92aHppbH95c2l6doCDfWhgeIh9ampzaHuAanaBjJGUfnp9fnF7dntzfWFVdXtxc4iCgXuCcIaJd3dvb4KBi318d3x7dI2EgXVocWhsiIJycF1oY3RvS2Z2TF5vVVRZc25iUU90eWJTWFhcYXCCc1thXGhlZGNqZFFbcUlEZGJcY3FeXHhoVVdWd15cZm5pVmxeYWpnZW5uaHB3epNuaYiMeX1ye355goCCfHZ9g4iGg3B2g3Ntd4KCfomLlH9xgHx4eXqBi3SDeH+BgYKEeoB1b32Ji5ueiH6Ge3eHfGh1ho2Ren+AfImGhHaPgGdwbl9kXFhmWW1zYWFhcWxsaIluYHNpWF5jbYB3qdmpx4aHs3KKeXCOdn2IkIF6lIqAdXR1fneAb3B/boV0lIZ4dGxgeoF5iI5lcYJvZ3VuW219gZCTgIF5kZJ9d3pshXR+j4qDcpWKkI6HhYV7f4ZtdXZ/bmh3ZW18dm1qd3Z/f3xgYniGemh1dWN+e2d1ho6NlXx0f3VxgHp8bH5ZVnJ8b3SChn5/d2uIhnN4anR/goJ8eXt3enGKf3xyZ3RkbYuEbXRba2B2Zklvb0xbY1hXVnhtYlBTdXZZUVZYXWByhG9cYGNtZGNdbmJUXXJHQmZfXmZpXVp7Y1JWXHVbW2drYVZrYGBuZmZscWhwdniPdGuOjHV/dnh9d4GDgXt0fYOIiINvcYB1cXV+hoKJjYt7d394hHx9hYd4h3x9gX6EgHt+c3Z4i46fjYl7ind1g3pefoeajXmHhHSGh4R3iXpibmxbYltbYVVqdGRgW2hvcGaHcmFxZldcY2t/fMrOhrmia25ui21yhXJ+hYt/e5KFenl0eXV1e2psdmOEdpKCdm9nX3yBeYuIZXGAampxY1hse4aciYOCcpeUdn17bYdwgImKhnCWjpCIhYuEe3l/cnJwfmdocmNueHFqbHF3fXx6XWV6gHdpdXlmgnZndIeLjZR9coZqb36AeG17XFhwfWxzfol7gW1uiX9wdmZ2foB+gHV6cHlzhXt4cWVyYG2LgWtzWGtfeV1JcGxOV1ZfVFV8a2JPVHZzUVJUVl1idIZpXGBramZiWW5hWGNwR0FoXWBmX1xWfF5PVmVwWVtqaF1YZ2FfcmZraHFncXN3h3lulYp0f3t3fnmDh4B1c3+GhY6DcHB7eHd1eYeGh4yGenx/dYt+fYaEhId/fn59h398eHZ5dpGTn36NfYtudYB5ZISIl4ZzkopvhYWCeoN1ZG5qWV9bXV1VaHNlYFlkcnJngXJha2RXWl9pf3i+rnqft25idIdpdHxyeoSHe36NgHd3c3dve3Zlam9gh3WOgXNqYl5+eHiKgmVwfWhra1pWb3iLpIGFf3GZknF/d3SBbH+Bj4Zyk4eMh4SJhX15dXNvaXlham1hbXZqZ2treXd6d1tnfnx4ZXN+boR0ZnaGjYaVf2+LZmt6gnRsdGJbbXpqc3qKeoFldIZ9bXBndH53fH5wemp5eoB4d29lbGFsiX1sblZrYXhWTGtsT1JPaU5ZfWdiT1V2bE1RVFVeZnaEZ15hcGhnYVdpXVxraUpEa1piZFZYVXlaTldualldbGVdWmVjXnVmbWRyZnNwdIF4cJmFdn9/eH98hYd9dXSCh4CVgm5zeXt7c3OFh4iIhHmBfXaPf32EiY6DgYN7fouDe3d8d3aanZd6ioOHanZ+fGyEhpSAco+CcYWCfoKAcGZsZ1ddW1xbVGVwZV9YY3J1aXVwZGViV1tbaH9wb3J/c4lkZXl/anR2dHSEhXiBhHp3c3Vua3pwYWhrZ4Z0jYNtZl5ffG96iX1obXdmamRWV3Jwjqd9hHx2lpBze3J7eWx6eo+DdpZ7h4aDh4R9dXFzbWh1XW1pX211ZGdmaXpve3JZZ4F2dWhwgHiCdmJ3hYt8lIFui2pte4BwZXJlX2t4ZnF1iXp9YXWDdmlrcXR6b3h3cXtlfX5+d3VuY2VhbIZ8bWtWamNyVExqa1BMTnBIXntmYk5WdWVLT1NXYGt3fmZdZ3NpZV9WYldicF1LS2tYZGFVVFVzVk1ZdmVaX2xgXFtjZV93Z21icGl0b3F+dXSZgXd/gHiAf4aEen12goN+mIVucnR8enRxhYWPgoB6i3V0kIB9gZSOgIWEfH6Mhnp+gXZ7o6WKeYmGhWx1fXt1hIONem+Fc3qFfYKEdW5qaWVWXVtbWlNjbmVbWGJ0e2pobWhgYVdfWml/aWxvf2dsYWl6emt0dXRvhoJ7gX12dW56aGp5al9lbmmBd5CEZ2VYYndpfoZ5bmlvZmZdVVhvaI+od4F6fJCOeHVvfW5ydHiOfneUdIWCgIaIdmpzdmhpb1xtZV5uc19nYmp4aHttW22Dc3Rqb4B+eXdhdoWEeI+Fc4hxb3l/cWJwaFttdmNwcod6d2FygG9naXhzcWt3dnN1YoJ6fXZ1b2NjYm18fGtrVWliZ1RMbWhQR1JsRWF4ZmJNVHNeSk1VWWVseHtmX21xamNcVl9Vbm9XSlNoWGdeWE1VbFRLXHpfXF9rXV1bYmVgemhsYW9vdm5vd3V6l313gIF5gICHhnp5eoN9gZOEcXR0fnp2dIWIkH2BfJBsc5WBe4KfhX+HfYB+hoKAint2hKyff3qIiIRscoJ6doGBgnRuh299gHSKgGpvbmRkWF9aWlpVYmpnXFpfdYJpXm1sXGFWW1xrgWVydHxpal1seHdodXdybod8fn56dnNsemhpeGddZHNoeneSgWNjVGRvZ4GEdnZmaGlhV1ZZaGSQqG9/eICLjnpwb3tmeG55inp2jnGDfX9/hm5kd3NkaWldbGJecG9bZ19tdWV6aF10gG9ya3F7fnV2YnWFi3uHh4B/d3J1fnNgcGxYcHJhcHCDe3NjcYBrYGx6b2loeXdzcGSDdHl5dHFkYWRtcn5qbFRpXl9VTHRjUUdXYkdjd2ZhTFRxWUtMWFhnbHZ6ZWVtcWZjWlhdWHZmVEpcY1hpWFhIV2VRSWJ4W11fbVteXWJjXoBpamBudHhtb252g5d5coGAfX+JjIZ+dnaGeIaMfXR1dYF5enqCjI59f4SJanSWgXuKnX1+hXmAe358holzcY+ujHt7h5B+ZnGIenR+fXZyb4Zse35tkHpjcG9iZV1lVlpZV2Nma2BdXXOGaVhwbVteV1pcbHtjcXd1bGJbbnR1aHV2cW2FeX+BeXdub3RlaHRlW2d1ZnZ2knpgXVNlZmqCgXN8YWNpXFRYXmJkkKVpeXSChZB4bG54Zndse4N5dIhygHh8eIBpZndtYGhhX2tgXnVrWWZdb29iemVbd3xrbm5weHl0dGVzg5J/h4KIenZvcXxxYXdjWW5vYG9wgHtyZXGAZF5tdWljZnd5cmttgHRye3JxYV5lbW59ZWlUaFlaVU55YFJLWllIYnVkYUpVblRKTFpWaWxye2NsbHNjYVlaW2F3XFRLY11ZalNWR1lhTkhqdlhfYW1bW19iY12FaWhhbnd5bG9qdoGQeG2CfoCBkoiEgXZ1iXSLhnRxdnaBd3x9foyPgX+TfnB4loN9mZJ5gIB4eX5/c4iEc3CZont7f4mWeGR1iXlzeXZrdHB/bHl8cJFyXnBvYGdibFRbWldpZG1mXFxyiWZScm1bWVhXYGt2Y2p1amlfW210cm10dHRrhn1/gHx3b25sZGlxY1trcmR0do5zXFdTZGBxf35xgVxiY15TWmFcZJOfZXJxhIOQc2tqeGxub3l5enGAdn9yenp7ZGZ2aF5jW2FoXF53aVdiXnBoYXdhW3t2ampyb3h0c3RocYKVg4Z+hHVyanB7bGV2V1tpbGFwcX95c2Vvflpgb3FiXmlvfGtqcn1xb3Zpb2BbZGtse2FnVGdVWFJRd1xTUFlSSGNzYmFHVmxRSVBaVmtsa3xlbW9xYVtaWFlscFdTT2ZXV2lTVEZaXE9JcnVYYGRtY1hgYWJdjGpkZG15eGtvaXV5hXtrhH2AhJl9goR5fYhtj4Zxb3Z6fXSBgn2Lj4OCl3R4gpOGgZ+JdYF/gXR/gnCHgnVvopdze4aMh3tmd4tvbnxwZ3hxe2xzdnONa150bmFnZmtTXlxWaGJsbFtccYxkTm9tXFZXVWZpc2hjdGVlXVpvdm9xdXV6bIh9gH2Id5BzY2Vrb2Fdbm1kc3iIa1pUVmJjd3x8cIRcY19jVFpgWmOXlWNucIOEiXJqZ3luZXJ1cXpreXN1b3p+dl9nc2RcX1diZFlhdWZWX2BtZGFxXV1+b2hpc3F0cXV2a22Fk4GJe4VxcWZue29wblJaZWlkcHJ/dXNibHVVYnFrW15uZHtka3R8cXFxaWxfWGRpanheZlRlVVZQVW9YUVdUUEhlcl9hRlhrT0lYVFZuaWR8aWt4a2FXXFVbdGRTUlZoUVlnVFNIWltQTnh3W19mbWpaYmBfXo9uYmdreXZubml2dn5+bYSAfoaXe3+HgYl+a5OIcmd0gHt1f4N+iY5/i5NzfYqRhYefhnt/hoxzgIZzfYJ1bqSMc4GNjHd4bnqNYGV9cWd6dHlsbXF3g2dkfG1jZmdoU2BfVWdgbG9cXm6OaE1pbGBVVlNuZnNrZnhkZV1acXVuc3t4c26Je4F3nHt6bGJlbG1eYG9qZXF5f2daVlhfbHh7em+DX2JeaFZZYFhknIhia3GBhnx3a2p2bFt1cGp5aXVybW97gHNYa29fWV5XY2RYZXFjVF9iaWFibFpgfmtma3N1b214dmtohYx/iXqHbXBlb3tscWxiWF9nZ25yf3NyXmlsU2VwZFVibWF4YW90enRqbmtqX1hgZmh1XWRWYlZTT1lnU09dT09IZW9dY0daak5KX0tYbWVfeGhufmRgVV5UXXRbVFNgZk5dYlVTSlxaUVl1dl1fZm1oWGNhW16OcWNoanhyc21ndnN5g3OCg3uIjn58ioiOeW6QinRsc4J0f3+IhYeRhJWPen2Mj4iRm4SAfIyEcn+Bc3R3cW6Tk5OTk5OTk5OTkpKSkpKSkpKSkpKSk5OTkpKSkpKSkpKSkpKSkZGRkJCPj4+Pj4+Ojo6Pj46OjY2Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2NjYyMjI2NjY2Njo6Ojo6OjY6OjY2Ojo6Oj4+Pjo2NjY2Oj4+Pj4+PjoKAfnp6fX5+fX1/fn59fn5+fn5+fn+Af4CAgIGAgIB/gIGBgYOHjI6Ojo6NjY2NjY2NjY2NjZKSkpOTkpKSkpKSkpKSkpGRkZGSkpKSkpKSkpKSkpKSkpKSkpGRkZCQkI+Pjo6Ojo6NjY6Ojo2NjY2Njo6Njo6OjY2NjY2Njo6Ojo6Ojo6NjYyMjY2MjIyNjY2Njo6Ojo6NjY2NjY2Njo6Ojo6OjY2NjY2Ojo6Ojo+Ogn99ent8fX59fX5+fn5+fn5+fn5+f4B/gICAgICAgH+BgYCBg4aMjY6NjY2NjY2NjIyMjIyMkpGRkZGRkZGSkpKSkpKSkZKSkpKSk5KSkpKRkZGRkZKSkpGRkZGQkJCQj4+Ojo6OjY2NjY2Njo6Ojo6NjY2NjY2NjY2NjY2NjY6Ojo6Ojo2NjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Njo6Ojo2NjY2NjY2NjY6Ojo6Cf3x6fHx9fn19fn19fX59fn5+fn5+gH9/gICBgYGAf4CAgICDhouOjo2NjY2NjIyMjIyMjIySkZCQkJCQkJKSkpKSkZGSkpKSkpKSkpGRkZGRkZGRkJCQkJGRkZCQkJCPj46Pjo6Ojo6Ojo6Ojo6NjY2NjY2NjY2NjY2NjY2NjY6Ojo6OjY2MjIyMjIyMjIyMjY2NjY2NjY2NjY2NjY2Njo6NjY2MjIyNjY2Njo6OjoN/fHp8e31+fH1+fXx9fn59fn5+fn5/f3+BgYGAgICAgYCAgIOGi42NjY2NjIyMjIyMjIyMjJTO2tjY2NjamoGEhISEiF0tMDAwMC1GoaGhoaGhoJqZmpqampqKg4SEhIOEd2VnZmZmaFxDREREREJLkpqZmZmZmZ6goKCgoKOAZGdnZ2dmb4SDg4ODg4OLjIyMjIyMjY2NjYyMjY2NjY2NjY2NjIyMjIyNjY2NjY2OhX19e3t6fX58fH59fX1+fX1+fn5+fn9/f4GBgYCAgICBgICAgoWKjI2MjIyMjIyMjIyMjIyMlNvp5+fn5+qcfoKCgoKGUxgdHR0dGTekpKSkpKSjnJycnJycnImBgoKBgYJyXV9fX19hUjQ1NTU1Mz+TnpycnJuboqSkpKSkp3xdX19fX15qgoGBgYGAgYqLi4yMjIyMjIyMjIyMjIyMjY2NjY2MjIyMjIyMjY2NjY2GfH16enp8fXt8fn19fX59fX5+fn5/f3+AgYCBgYGAgIGBgYGChYqNjYyMjIyMjIyMjIuLi4uSl5iYmJiZmZKPkJCQkJCMh4eHh4eHiZOTkpKSkpKRkZGRkZGRj46Ojo2NjYuJiYmJiYmIhYaFhYWFho2Ojo6Ojo6Pj4+Pj4+Pi4iIiIiIiImKioqKioqKi4uLi4uLi4uLjIyLi4yMjIyMjI2NjIyMjIyMjIyMjY2Njoh8f3l7enx8e319fX18fX19fX5+fn9/f4CBgYGBgYGAgYCAgYKFioyMjIyMjIyMjIuLi4uLi5GQj5CQkIuOkZGJh46KkJKTkYuRjI6Ph4+RkZGRkJCQkJCPj4+Pj4+Ojo6Njo6Ojo2Njo2Njo6Ojo6NjIyMjY2NjYyMjIyMjIyMjY2MjIyMjIuLi4uLiouLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyNjY2NiX59eHh5fH18fX19fHx9fX59fn5+f3+AgICBgYGBgYCBgIGCgoSKjIyMjIyMjIyLi4uLi4qLkJCRkZGPhI6QkIaKj4WNkJCOhY6Kho2GiZCQkJCQkJCQkI+Pj4+Ojo6NjY2NjYyMjIyMjIyMjIyMjIyMjIyMjI2NjIyMjIyMjIyMi4uLi4uLi4uLi4qKiouLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjI2Lfnx3dnh7fXx7fX18fH19fn5+fn5/f4CAgIGBgYGBgIGAgIGChIqMjIyMjIuLi4uLioqKioqQkJCQkIqFjoiOhoaPiY2QkJCIjoqFjoaLj4+Pj4+Qj5CPj4+Ojo6OjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLi4uLi4qKioqKi4qKi4qKi4uKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIt+e3d2eHt8fHx9fX19fX1+fn5/fn9/f3+AgIGAgYGAgYCBgYGEiYyMi4uLi4uLioqKioqKipCQkJCPhYOMjpCOiYyKjpCQkIiNjIaMiIiPj4+Pj4+Pj4+Pjo6OjY2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKioqKioqLi4uKioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMin18dnZ4fHx7fHx9fX19fn5+fn5+fn9/f4CAgYCBgYGBgIGAgYSJi4yLi4uLi4qKiomJiYmJkJCQkJCMhoyJjoeFjYmOi4yQiIuHhoiFiY+Pjo+Pj4+Pjo6OjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKioqKioqKioqKi4uLioqKioqKioqLi4uLi4uLjIyMjIyMi4uMjIyKf353eHp7enp8fHx7fX1+fn5+fn9+fn9/gICAgICBgICAgYCBhIqMi4uLioqKioqJiYmJiYmPj4+Pj5CMjouPjIqPjI6MjY+LjYqLjYqOj46Ojo6Ojo6Ojo6NjYyMjIyLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLjIiAfXh5enl5e318e3t9fn5+fn5/f35+f39/gICBgICAgIGBgIGEiouLioqKioqJiYmJiYmIiI+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Oj46Oj46Ojo6Ojo6Ojo2NjYyMjIyLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLioqKi4uLh4B8eHp6eXt8fHt8fH1+fn5+fn9/fn9/f39/gIB/gYGAgIB/gYSJi4qKioqJiYmJiYmJiIiIj4+Pj4+Pj4+Pj46Pj4+Oj4+Ojo6Ojo6Ojo6OjY2NjY2NjY2MjIyMjIuLi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKiYmKioqKioqKioqKioqKioqKioqKi4uHgHt5eXh6fHx6e3t9fX5+fn5+f39+f39/f39/f3+BgYCAgH+BhIiLiomJiYmJiYmJiIiIiIiOjo6Ojo6Pj46MjI+Sj5COjo6Ojo6NjY2NjY2NjY2NjIyMjIyMjIuLi4uLioqKioqLi4uLi4uLi4uLi4uMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKiomKiomJiYqKioqKioqJiYmJioqKioqKioqKioqKioqKioqKi4aBe3h5eHp8ent7fH19fn5+fn5/f35/f39+fn9/f4CAgYCAgIGEiIqJiYmJiYmJiIiIiIeHh46Ojo6Ojo6Ojo+MkJOQkI+Ojo6NjY2NjY2NjYyMjIyMjIyMjIuLi4uLi4qKioqKioqKi4uLi4uLi4uLi4uLi4uMjIyLi4uLi4uLioqKioqKioqKiYmJiYmJiYmJiYmKioqKiomJiYmJiYmJiYqKioqKiomJioqKioqKhYB6eHl5fHt6ent8fH1+fn1+fn9/fX9/f35/f39/gICBgICAgYSIiomJiYiIiIiIiIeHh4eHjY2Ojo6Ojo6Pj4+PjoyNkI2NjY2NjY2MjIyMjIyMjIyMi4uLi4uLioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYmJiYmJiYmKioqJiYmJiYmJiYmJiYmKioqJiYmJiYmJioqFf3l6eXh7e3p7fHx7fn5+fX5+f39+f35/fn+Af3+AgICBgYCChIeKiYmIiIiIh4eHh4eHh4eNjY2Njo6Oi42Nj5WPiYyPjYyNjYyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYR+eXt5ent7ent9fHt+fn59fn1+f35/fn9+f3+AgICAf4CAgICEh4mIiIiHh4eHh4eHh4aGhoyNjY2NjY+MjImKj42IjJGPjY2NjIyMjIyMjIyLi4uLi4uKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uKioqJiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJg355e3p8e3p7fX17fH9+fn5+fX5/fn9+f3+Af4CAgH+AgH9/f4OGiIiHh4eHh4aGhoaGhoaGjIyMjIyLiYyKiIeJhoyOjJCMjZGOjIyMi4uLi4uLi4uLi4qKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiImJiYmJiYmJiYmJiYmJiYmJiYmIiImJiYmJiYmJiYmJiYiIiIiIiYmCf3h7e3t6enx9fHx9f39+fn19fn9/f39/f4F/gIB/gICAgICAg4aIh4eHhoaGhoaGhoaGhoWMjIyMi4yOjoyKioeEiIuKjIuNjo+Li4uLi4uLi4uLi4uLioqKiomJiYmKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiomJiYmJiYiIiIiIiIiIiImJiYmJiYmJiYmJiIiIiIiIiYmIiIiIiIiIiIiIiIiIiIJ/eHp7enp6e3x8fX1+f35+fX1+f39/fn+AgICAf3+Af4CAgYCDhYiHh4aGhoaGhoaFhYWFhYyMjI2NjJCSjI2Ii4mJi4uLi4mLjIqMi4uLi4uLioqLi4qKiomJiYmJiYmJiYqKioqKioqKioqKioqKioqKioqKioqKiYqJioqJiYmJiYmIiIiIiIiIiIiIiImJiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIiIiIiIiIiHgXx4e3x5enp8fHx9fX9/fn59fX9/f39+fn+Af4B/f3+Af4CAgIKEh4eGhoaGhYWFhYWFhYWFjIyNkY+PjZGJjIaJjIuIiImMiYeNjo+NioqKioqKioqKiomJiYmJiYmJiYmJioqKioqKioqKioqKioqJioqKioqKiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4WAenl9e3t7enx8fHx9f39+fn19f39/f35+f4B/gH9/f4B/gH+AgoSHhoaGhYWFhYWFhYWFhISLi46PjoyLj4iHiYmMjYWFjo2KiYyNi46KioqKiomJiYmJiYmJiYmJiYmJiYmJiYmKioqKioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHhoaHh4eHhH55eX16enp7fXt8fX5+f35+fX5/f39/fX5/f3+Af39/f39/f4CChIaFhoWFhYWFhYWFhISEhIuLjI6MjI2Lh4mIiomGgoiNjoiKi5GTj4uJiYmJiYmJiYmJiYmIiYmJiYmJiYmJiYmKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIeHh4eHh4eIiIiIiIiIiIiIh4eHh4eHhoaGh4aGhoaGhoaGh4eDfXp5e3p5enx8e31+fn5/fn59fn9/fn9+fn+AgICAf35/f39/gIKEhoWFhYWFhISEhISEhISEioqOjYmIiIqKh4iHiomIioiIh4qGi5GPiomJiYmJiYiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHh4iIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGh4J8eXl6eXp7e3t7fX5+fn5+fn59gH9/f39/f4CAgH9/fn9/gICAgoSGhYWFhISEhISEhISEhISKi5CPiYmJi4qHh4WHiYuKiYSLjYmOjYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiIiIiImJiYmJiYiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGgXt4enp4e3x7e3x+fn9+fn5+fX1/f39/f3+Af4B/f39/f3+Af4CChIaFhYSEhISEhISEhISEhI+Qj4+IiYuIhoeIiYuLjIuJioqNio6Oj4iJiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoaAe3h5eXh4enp8fX1+f35+fn59fn9/f39/gIB/gICAf39/gIB/gYKDhoiGiIaDhISEhIODg4ODkpKOioeKi4qLh4uNiYqJi4iHiouIio+SioiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhn96eXh4eHl5eXx9fn5/fn5/fn1+f35/f3+Af39/f4CAgH+AgH+BgoOHjo+PjoiHhIWFhoaFhYWSkI6KiYmIiImKioiIh4aKjIiHiYmOkJGNh4iIiIiIiIiIiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4aGh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWGf3l4d3d3eXp5e3x9fn9+f35+fn5+f35+fn+Af4CAgICAf3+Af4GBg4eOjo6Ojo6Mjo2OjY2MjZCQjomHhoiJiYeIiouIiYyJiYaKjY6PkYuIiIiIiIeHh4eIiIiIiIiHh4eHh4iIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhYZ+eXd5d3d6eXl8e31/fn5/fn5+fn5+fn9+f4B/fn+Af39/f39+gIGEiI6Ojo6Ojo6Ojo6Ojo2NkJGOi42JjIiIiYaHiYaIioiHi4yLjpCQiIeIiYmJiIeHh4iIiYmIh4eHh4iIiYiIiIiIh4iIiIiHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhoaFhYaGhoWGhYSEhIWFhoaFhIWFhX55d3l2eHl4e3x7fn5+fn5+fn5+fn5+f39+f39+f39/f35/f3+AgYOGjY2Ojo6OjY6NjY6OjY2Qj42Ni46KhoiKhISLiYeDhYSDi4mLj42JjI6QkI+NjYyLjY6Pj42NjI2Nj4+Pjo6MjYyMjY2KiYiHiImHh4aHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoeHiYqKiIeJi4yNjo2LiImLi42OjYyJiImMgHl3d3Z6eXh7e3t+fn5+fn5+fn5+fn5/f39+fn5/f4B/f4B/f4CBg4aMjY2NjY2NjY2Qj4+Pj46NjI6KiYuMjIeFiY2Lh4aIh4aHh4uNjo6Pj4+Pjo+Pj4+Pj4+Pj4+Pj4+Ojo+Pj4+Pj4+Pj4+Oj46Oj46Mi4uJh4eHh4aIhoaGhoaGhoaGhoeLiYeHiIiLjY2Mi4yLjY2Ojo+Ojo6Pj46Ojo6Ojo6Ojo6Njo6NjY2AeHZ4eHp4enx6fH5+fn5+fn5+fn5+f39/fn59fn9/f39/gH9/gIGDhoyMjIyMjY+QkpOTk5KSjYyMjIqHioyKh4eJiYWCiouIiYWJjpCNjo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjI2NjI2LiYaHh4eHiYqLjY6NjYyNjY6OjY2OjY2NjY2NjY2NjY2NjY2OjIyNj4+OjY2MjIyLi313dXd5enp7e3p+fn5+fn5+f35+fn5/f39+fn1+f39/gICAf3+AgYOFj5KRkJGSk5OTk5OTkpKLi4uLiomMiouLiYuKhoeOjYiIjI6OjIuMjIyNj46Njo6Ojo2NjY2MjY2NjIyMjIyMjIyMjY2NjYyMjI2NjYyMjI2NjIyNjIyMi4yMi4yMjI2MjIyMjIyMjIyMjIyLi4uLi4yNjY6Sk5OSkpSRkJOVlZSTk5COjo6Oe3Z2d3h6ent7e31+fn5+fn5/fn5+fn5/f35+fn9/f39/gIB/f4CBgoSNkpKTkpOSkpOTkZKSkoqJioyJi4qJjIuKioiHiYqKi4mKjY2Mj46Nj5KUlJOUlJOTkpGSkI+Ojo2NjY2Pko+OkZGOjIuKioqLi4qKi5CPjoyMjIqKioqKioqKiouKioqKi4yLi4uMjIyKiouLi46RkpOTk5SUk5STk5SUlJOTk5KSkpKSk5F6dXZ2eHt7e3p6fX5+fn5+fn5+fn5+fX5/fn5+f39/f3+Af39/gIGChIuRkZGRkZKSkpGRkpGRiYmIiIqMiYiJiYuJhoSJhoyKh4ySkpKTk5OUlZWWlZWUk5OUlJSUlJSUlJSVlZWVlZWUlJOTkY+QkZKQjoyRlZWVk5KSjo+QjYqKi4qKi42OjY6RkpCRkpKSkpGRkpKSk5OTk5OTk5OTk5OTkpOSkpKSkpKSkpKSj3h1d3l6e3t7ent9fX19fn5/f35+fX5+fn5+f39/fn9/f4B/f3+AgYKEi5GQkJCSkpKRkZGRkZGIiIiIi4uJg4eLi4yMiIeHjYyNkpSSkpOTlJWWlpaVlZSSkpOTlJSUlJWVlZaXlpaWlpWUk5SUlJSVlJSUk5OVlZWUk5KTk5OTkJGSkZGSk5OTk5KSkpOSkpKSkpKSkpKSkpKSk5OTk5SUk5OSkpOTkpKSkpGRkZGPdnJ3enp7e3t8fX59fX1+fn9+fn9+fn5+fn6Af39/f3+Af3+Af4CBgoSKkJCRkZGRkZCQkJCQkIeHh4eIiIiFi4+KjI6Njo+OkJWUk5OTk5SUlZWVlJSUk5KSk5KTlZSUlZaWlpaWlpaWlpSTk5OTk5OUlJOSk5SVlZSTkpKSkpOTk5OTk5OTk5KSkpKSkpKSkpGSkpGRkZGRkZKTlJSUlJSTkpGRkZGRkZGRkZGRkYx0c3d6ent7e3x9fX1+fX5+f35+fn5+fn5+fn9/f39/fn9/f39/f4GDhIqQkJGRkJCQj4+Pj4+Ph4iKi4yNjYuOj42Mjo6RkpGSk5OSkpKSk5SUlJOSk5OTkpKSkpOTk5OTk5WVlZWUlZWUk5OTk5KSk5OUk5KTlJSUk5KSkpKSk5OTkpKSkpKRkZKSkpKSkpKSkpKSkZKRkZGSkpOTlJSUk5OSkZGRkZGQkJCQkZCRinN0dnp8fHp7fXx9fn59f35/f35+fn9+f31+f39+fn59f39/gH+AgYKDipCQkZGQj5CPjo+Pjo+Oj4+Pj4+Pj4+PkI2OjpCRkpKSkpKRkpKTk5OTkpGSkpKSkZGSkpOKh5SSk5STk5OTlJOSk5OTk5OTk5OSk5OTkpKSkpKSkpKSkpGRkZGSkZCRkZGRkpKRkZGRkpGRkZGRkpKSkpKSkpKSkpKRkJCQkJCQkJCQkJGGc3V2e3x8e3x9fX1+fn1/f35/fn5/gH9+fX5/fX5/fn5/f3+Af3+BgYGKkI+PkI+Pj4+Pj4+Pj4+Oj46Oj4+Pj5CQiI2PkJGRkpKSkpOTk5OTkpKSk5KSjIuSkZGSkXeGk5GRkpKSkZKSkpKSkpKTk5KRkZKTkpGRkpKSkpKRkJCQkJGRkZGQkJGSkZGRkZGSkZGRkZGRkZGSkpKSkpKSkZCRkZCPj4+Pj4+Pj4+PkX9ydHh8fHx7fHx9fX5+fn9+fn5/f3+AgH99fn5+f39+f39/f4CAf4GBgYqPj4+Pjo6Ojo+Pj46Ojo6Ojo+PkI+Pj4+GjpCQkJCRkZGRkZGRkZGQkJCQkJGJcoqSkJKAc4mRkJCRkZCQkJGRkZGRkZGRkJCQkZGQkJGRkZGRkI+PkJCQkJGRkJCQkJCRkJCQkJCQkZCQkJCQkJCQkZCQkJCPj4+Pjo+Pj46Ojo+Pj4+PeHJ2eXx9fHp9fH19fn5+f35+f39/f4CAf39/fn5/f35/f39/gIB/gYGAio6Ojo6NjY2Ojo6Ojo6NjY2Oj4+Pj4+PjoiQkZCPj4+QkJCQkJCQkI+PkJCQj49zcIyQjHR3iJCPj4+PkI+PkJCQkJCQj4+Oj4+QkI+PkJCQkJCPjo+QkJCPj4+Pj4+PkJCQkI+PkI+Qj4+PkI+PkJCQkI+OkI+Pj46OjoyMjY2NjIqDiYhzc3Z4fX58eX18fX1+fn5/fX5/fn9/f39/f4B/f39/f4CAgH+AgH+BgYCJjY2Ojo6Ojo6OjY2OjoyNjY6Ojo6Ojo2NiJCRkI6Njo6Ojo6Ojo6Pjo6Ojo6Oj3drepCGdHeHj46OjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Pj46Oj4+Pj4+Pj4+Pjo+PjY2MjYyNjoyLi4mJiYiFhYSDgoKEgnR5fXp4dXJrZWltb2xmZmdncHNzd3l9fnl6e3x9fX1+fn59fn9/fn9/f39/gIB/f3+AgIGAgIB/f4CBgImNjY2NjY2MjYyMjIyMi4uLjYyMjIyMjIyGj5GRjIyMjIyMjIyMjIyMjIyMjIyOe2Vrhn5xdYaNjY2MjIyNjY2NjYyMjI2MiomKi4uJh4KAh4iEgXt6gH57fXx8fXlzcnJycnV1cG1ramppZ2NkYV9bXF1eWFVXWFlTS0VJSkpLTE1PT0tgdHR3eX19eHp5e3x8fX5+fn1+f39+f35/f4CAgH+AgICBgYCAgICAgIGAf4OEhYSFiIuLjYyMjIuLi4yGiYqKioqKh4OOkJGNiouLi4uMiYmKioqKiouKi4doXmhlZ2NugoWDhIeJiYWCg397fHl6e3pzcHFxcW1samdsbWdlZmVmZGNlZGVkZWVlZWRkZGNhYV5dXFpYWFdUUFFSU1JTTU1KSUZESEpHR0hHR0xOSWdzdXh6fXp4d3l8fHx8fn5+fn9/fn9/f39+f4CAgIB/gICBgICAgICBgYFnXmBjYWNucX17ent/fXd8fHZ4ent4eHpvcXt4eXt8e3h3e394dXd0dHZ1dXZ3b15ybFxpbWdlaGtsbm9tamlpaGhlZWRkZF9gYWJgYF5dWVhaWltdXV9gX2BfX19gYmFeXl5eWVldXF1bV1dWUlRSU1NOUUpISUZERUhMTEhGR0lLSklNbXJ0eHp7end3eXt6e3x+fn1+f39+f35/f35+gIGAf3+AgIGAgICAgICCgWdYW1pZXFtcY1xaXF5ga3FtcHBvbm5vbmtpbmxrbG9qaWtraWpraWZmZ2dnaGheaHVsXW11bmZiY2JhYmBgXVhbW1dYV1RWUVBUU1NNSkxLTExOTk9UWFhXVVVUUlBQTU1QT05LTE1QUU9MTEpHSUlHSEhJSEhIR0ZHSEpKSEhISUlISVZwc3V5ent5dnZ5enp7fH59fX5/f35/fn5+f3+AgX9+f4B/gICAgICAgIGBbFtYVlZWWVlaWVlYVVZoamxubmxra2poaGloZGVkYlxiZl9fYWNfXF9dYF1eWl1nb21fa3N1bFlZX1tYV1NOTUtLS0tMSUtNTktKS0tMSktQTEtLRkdHSUlGR0lISUZFSEdGRkVERUVEREVJSUlHSEdIRkZLTUtJSUlIR0hLTU1LTExMVXFzdnl6e3h2d3h3ent8fn1+fn9/f39+f3+AgIGAfn5/f4CAf4CAgIB/gYJoUlRVVlNVV1lZWVdXV1tbYWNfXlxbWFZWWVZSVFJRUVVUU1NUUE1KTU5QUk9NVmJobXNwcHNuUlFUUFBOTk9NSk1MS0xKSktLRklJSkxJR0pISUlFR0dGRkVFSElKR0ZHRkZHR0hKR0dISEpMSkpLSUlISktLSkhKS0pISUtMTU9QUEtUdHN1eHp6eHZ2d3d6enx+fX5+fn5/f35+fn+AgYB/f3+AgYB/gICAgH+AgmlQUlRXVVRWWVdYWFpbVFRTUlBRU1FRUU9OTlBQUU9MTlBPTk5NTEtNTk5QTU5UYWVlbm1taWhUTU5PUFBPTk5PTk5QTk1NS0lISEpJSUlJR0ZHR0dJSkhJSEhJSEhHSEdISElISUxLSklISkpJSkpIR0pMS0pJSUhKSktMTk1NTU9RTFVzcnN3enl3dnR2eHp7fX19fn5+fn9+fn5+gICBgICAf4GBgH+AgICAgICBbE9PTlRZVVVdW1lXV1hOTUpKSUZKT0xKSkdJSk1NS0pMTUpHSUlJSktLRENGTFpobGhtbG1pZ2NbVVJPTk9NTk9MTk5OUFBPTE1MTk1MTEpJSEdJSElISElJS0xLS0pJS0pJSklJSUlJR0dKSUdJSUpKTk1OTEhJSklJSk1PT01MT1JOWXBwcnd4d3d0c3R3enx+fX5+fn5+fn5+fn9/gICAgICAgYCAf39/gICAgIFvS0pNTlFOTlVXVlZSU0lFQ0VFUkREQT5CP0RAQD5CREFAQURHRkVIRUVQVFVaZGttZ2xsa2pqaWhpZ1tMSklKSUlLSkxQTk1MTU1MTU1NTElIREZGR0ZGRklKSUlLSkhMSklKSkpJSEhKS0tIRkdJSklLTU5OSktPTUxLTU1PUE5QT1BgcG9yd3h2dHJzdXd6fX19fn5+fn9+fn1/gICAgICAf4CAgIB/f3+AgICAgXNQUE5OUE1KS1BSUE5RQ0RCQUZRRT1DPT9FSDk6Oz0/PTxBRkA+Ojs+QkpZY2hsa29sbWxqaWpraV9USUVFRUZFR0dHR0pHSEpLR0NER0pHQ0RFQUFDR0hHSEdISktKSElMS0lISktLTU5MTUxMSkpMS0lLTU9PUFNRT1BQTk9QUlFNUGdwb3N2dXRycXR4eX19fX1+fn5+f4B+foCAgH9/gIB/f4CAgH+Af4B/gICCdlRVUVFQT0xNUFBOT09BQkFAQkE/Oz48Pj8/Ozg5ODs7OkA6Oz48Ozs7OkZOTWFtcHB0cGpraVhLQkVFREdJSEM/QEBAQUFCQUE/Pjw9PkFAQD8+P0BFR0dHSUtMTk1OTUxNTUpLTVBVU05MTlFOTk1OTE1NTk9OTk1LS05OTk1OTkxUbnBwc3R0c3Fydnl5fX19fn1+fn5/gH5+gICAgICAgH9/gICAgH9/gH+BgIJ4UVFSVFJTUVNTUVFST0BAPT4/PD8+QEE/PT45Ozo7Ozk5Ojg4Ozw5Nzk7Oz07O0tgbXtzaltHPUBAQ0ZEQ0NDPzs+PkBDQ0E/Pj9BPkBAQj9APD9CQEFDRUVFSktQT1BPTU1OTExMT1JRUFJOTExPTUtOT0xMTEtMS0tKS0tKTU1LS1xxcXF0c3VycXR4eHp9fn1+fn5+f39/fn5/gIGAgH+Af4CAgICAf4CAf4CAgXxSTU9RUFFSUlRSU1NOPDs8Ozs7P0BBQkA9PDk8PTw6Nzk6Ojk3OTo6Nzg6OTk6OThCam1IOTc8PD1AQUA9Ozs+PD08QEJDQT9BQkE9Pj09Oz0/Q0RCQD9BREJFR0pKSkpKTE1MTExNTExOVVNLTE1USVBKSU1KSUpLS0pJSEdKS0lKZnJxc3RzdXJydnl5e31+fn5+fX9+f39/f36AgICAf4CAgICAgIF/gIF/gYCBgFZMTlBQTlJRUFBRUU44PT88PDo9PkFAQT8+PkA/Pj48PT0/QD09PT9DOz09PTw9PDtHXDk8PD49Pj9AQUA+P0E/QEBBQEBAPT8/PTw6Oz09PD9AQUJCQUBCREZGRkdGR0dISUtMTExLTEtKS0lKSk1MTEpMS0lISUxMSklJSElLR01tcHF1dXR1c3V4eXl8fX5+fn5+fn5/gH9+gIB/f39/gH+AgYCAgYCBgICBgYCCYUtPT05OT1BPT1BQTzo8Pjw9Oz8+PkFBPz0/Q0NEQT89PkBBP0A8XG5APkRFPz5BPEVePT49Ozo9PkFBPz5AQD9BPz89PD48PTs7PD0+QUA/QD5AQ0NEQkRFSEVFR0hISEdGSUpJSUlJSUhKSkpKTEtKSklJSEhKSktMS0lLSkpIVnBwcXNzdHR1eXp7e3x+f35+fn5+f39/f39/f3+Af4CAgICAf4GBgICAgIGBgIJtTFBRTk9QTk5PUFBPPjw8PT4/P0A+QEA/Pz9CRkQ+PDw9QD04Ojttd0g4Ozo9PUE8S2M9PD08ODo7Pz49PD07PEA9PTw8Pjs9PD0+QUBCQUBAP0JEQ0RFRkZGQ0VHSElJSEhJS0tMTUpKSUpNTUpLSktJSEhISEpJSktKSk5MSUlfcHBycnJ0dXZ6e319fH5+fn5+fn5/f35/f36AgIB/gICAgICAgYGAgICAgIGAgnZNTk5NTk5MTE5QT0w+QTw8PT8+QkM/PkFBQUJBQFlSPD09SUxGRnV3TTc4ODo7Pj5XakE7PDw6Ojs+Pz89PDg6Pjw9Pj89Oz4/QEJDQkJDQ0FCQkFCQkRCQkRCRENGSUdGRkhJSUtNSklKSktMSkpJSkVESUlGRkhISUpKTEpGRmdwb3FxdHZ1d3t8fH18fn59fX1+fn9/foB+fn+AgH+AgICAgICBgYCAgICAgICBek5JS0tMTExFSUxOTTw/PDw9PkBAQUE7QkNCQ0BDc3lJO11/g4B6fHdWPD0/PT0+Rml0TDo9Pj89PT5BQ0A8OTtBPz4+QT07P0JAQkNCQENDQUNBPT0+QD0/QUFBQENFRUBAQ0JDR0dFRENGRUZGR0VEQEFHR0ZDRkRHSEpHQz5IbG9wcHF0dXZ5fHx8fHx+fn1+fn5+fn5+f36Af3+AgICAgICAgIGAf4CAf4CBgIF+UUhLTU1NS0pLTE9RQD8+PkFBQEBBR0FCRENFQUhyeWtigoSDgoOAfF0+QENAQD1KcntZOj1BRUFCQkZIQz08QEREQUA/Pj1AQT4+Pj88PkBER0VAPkBBP0BDRkVDQkNDQEJEREJERUFCPkFCQkFCQEA9QUJDRENDQUNFR0E/PVZwcHFwcnV1d3p8e3t7fX9+fX19fX1+fX5+fn9/foB/f4CAgICAgYCAgIB/gIGAgX5SSEtNTUxLS05OUlVEQkBDQ0FBQkBCQ0BAQUFARm90fYKCgYN+fYR1TEFDRUA/Pll7gF0/Q0VJSklJTU1LRUNGR0dFR0VFRUREQ0E/QD4+QkZKSkdFRUdGRkpOTktKSUdHSEtMSUdHQ0REREVEQUJCQ0BDREVEREVERUZDQkFEZW9wcXF0dnV4e3x6fHx+f319fX19fn59f4B/f39/f39+gIGBf4CBgICAgH+AgICAfVJJSUpKSEpKTE9SU0dGRUdIREdIREA+PDs+QEVFaHN9gXx/hH55hXJDREVEQ1d1hoeHflhHSEpNTE5PT0xIR0hHSElJSEhHR0hIRUNFRUVFRkhKSkZFR0lKTU9PTU1LSktKTU5LSUhHSEhIR0ZFRkZGREZIR0VFSEhGSEdIRlFubnBxcnV2eXt7e3p9fX5/fX19fX1+fn1/f39/fn5/gH+BgYGAgICAgICAf4GBgIB8UEhHSElGR0lKTU5OSkxJSUpLTE5KRkNBQkNGSkdge4B/d3+EhYOEiWxBQVZ0h4mHh4eIg1dITE1MTU5MSUdHR0dER0dHR0ZIRkhFQ0RERkVEREhIQ0NDRklLS0xMTExMTElKS0pKSUlJSEpISEdISUhHR0hGRkZISklJSUlIXW9vcXJ0d3d6e3t6e319fn59fX19fX5+fYB/f39+fn+BgIGAgYCAgICAgIB/gYCAgHxNR0ZIRkVGR0dKS0pMTUxLTU5NT0tJSEhKS0tMTE5bfIKCg4OFhoaIg1ZshIeGhoaHiIiHfFBLTEtIR0ZGREVDQ0BAQ0NDQ0ZGRUJAPj5AQUFAQkQ/Pj9ERkhERUdJSklKSEhIR0lJSkpJSEZKSkpKSUpJSkpKRklMTEpKS0tmb3BzcnR2eHl7e3t8fH1+fn19fX19fn59f39/f35/f4CAgICAgYCAgIGAgICAgICAfU9GRkdGR0hHRUZHR01NTUtMS0lHQ0NDRElLS0xMSlSBg4SEgoKFhoaDgoaFhISGhoaHh4aKdUlJRkI/P0A/Pz88PDw+Ozo8QUFAPjw5OTg8PD07Pjs4Oz9BQkBBQ0NCQEFBRERCQ0ZISUhISExNTEdJSk1NTk1KSktLSkxNU2xwcXRzc3d5e3t7fH19fn9+fX19fX1+fn5/foB/fn9/gICBgIGBgICAgYCAgIB/f39+UUZFRkdJSUdEQ0VGTk1MSklIRT85Oj5ARUhISkpJZYWEhIR/gYKDgoODhIWFhoeIiIiIiYyOZkJCPTg4Ojo5ODc4ODk2NDc5Ozw6ODU1Nzc4OTc4NzU4ODs7Oz1AOzk5OT08Pjs8PUFDRUhKTUxMR0lIT1JRUFBOTE1NT1Fdb3BydHN1eHp7e3x8fn5+f359fX59fX5+f39/gH9/f4CAgICAgYCAgICAgICAgIB/f39RR0ZHSEpIRkVGR0hMTEpJSUdDQjU2OjxDQENHSUlohoSEgX6Bg4ODgoOEhomKjIyLi4mKi4yJVDo4NjU2NzY2NjU2NzczNTY4Ojg3NjU2NTY3Njc2ODo2Nzg4OTs3NTc4OTc5Nzc2OjxAR0ZJRklGRUZPU1JTU1JPUFBSVGVwcXN0dHZ5e3t7fH1+fn5/fn19fX19f39/f3+Afn+AgICAgICBgICAgICAgICAgH9/flJISEhJS0lHSUpJSkpLREVIRUJANTc4OD06PUVDQmWFg4GAgoODg4ODhYmLiomJioqKiouJioqBRzY3NjQ2ODg3NDU3ODU2NzY5OTc3Njc2NTo5Ojo6Ozc5ODk4Nzc3OTo5ODg3ODU4OTtBPT4+QkE/QUtMT1FQUU9PT1JXa3FydHR1dnp7e3t9fX5/fn9+fX19fX5/f4B+fn9/f4CAgH9/gICAgICAgH+AgICAf39+VEhHSUlMTUtKS0tMSUg/QEFAPDo1Nzk4OTc7Qjo9cYSAgYOEhISEhYaJioqIh4iIiIqKjIqJiYx6Pjk4ODs8Pj45Ojo7ODk7OTo7Ojo5Ozo5PT09Pjs7PD06PTs5Ozs8Ozw8OTk8ODo6Ojo5OTk8Pzw8QUJESUpNS0lLTFdvcnN1c3Z4e3t8fHt9f39+f359fX19fn9/f35/f39/f3+Bf4CAgICAgICAf4CAgH+Af35URkVGSUxOTkxKSk1CPzo7PDo4OTk4OTo6Ojs/Pkh+hIKChIWFhYaIiYiHhoaGiImIiYuMi4mKioxsPDs+QkNFRUJBQEI+QEJBQD49Pj5APz8/QD8/PT0/Qj9BQT9APz1AQEA+P0E9Pjw7Ojs5OTs/PTs8PT1BQUNBQkNBWHBxdHR0dnp7e3x9e31/fn9/fn19fX5+f35+fn9+f4B/f4CAgIB/gIGAf39/gICAf39/flJFQ0FHSk5PTElHSzo4Ojs5Ojo8PTo7Oz09P0BCUoKCgoSFhIWEhomJiIiGhoaHiImKi4uKioqLiotePkRHSUxKSkZHR0RGR0dFQkFAQ0VDQ0FCQ0I/QERIRENFQ0VFQUZFRkRFRkRAQj48QD49P0A+Pz4/Pj8+Pjo7PTxgcXJ0dHV3enp7fX19fn5+f39+fX19fX5/fn5+fn5/gH9/gICAgICAgICAf4CAgIB/f4B+UERAPUNIT01HRkJEOTc6Pjo8Oz4/Pz89QUBDQ0ZXhIKDhIWFhoaIiYmIh4aGhoeJiYqLjI2MjIuKiohWSE1MTkxOSklLSUlKSklFQ0RGR0ZEQ0VGREJISUtIR0dGSEdFSklLSUpLSkNGQ0NEQkFBQ0JEQ0NERENBPTs9QGhwc3R0d3d5eHt8fH19fn5/f359fX1+fn9+fn59fn+Af3+AgH9/gICAgICAgICAgH+AgH9PQT49P0RMS0BCQkE5ODw+Ozw7PkA/QT5CQkdHSlmEgoOFhYaHiImJiIiHhoaGiIiIiYqMjY2NjIuKjH9QTlBOTE9MSkxKSUlISkZERkhISUVFSEZGRUxMTUlKR0ZISUpOTU5MTE5LSEZHR0VFQ0ZGRkZERUhIRkNBP0BMbHB0dXZ4eXl5fHx8fX1+fn9+fn19fX1/f35+fn5+f39/f39/f3+AgICAgIB/gICAgICAf1FBPz4/RUdHPTxAQDg3PDs8PTo+QD4/QENGSUpRX4GDhYSFhoaHiIiIiIiIh4eIiIiJioyNjYyMi4uKjXJOUlBOTU1MTEpIR0VJSUVKSEdKSklKR0dHS0xOTExISElKTVBOUE5NT0tJR0lKSElESUhIRkZHR0hHQ0JBQ1VucHV3d3l6eHl6enx8fX5+f39+fn1+fX5+fn5/f36Af4B/f3+Af4CAgICAgICAgICAf39/VERBQUJHSEI/OD9AODo8OD0+Oz1BPj9BREhKTFVxg4SEhISFhoeIiIiIiIeGiIiIiImJjIyLjIyMi4uLi19TU1FOT01LSkdFQkdKR0xKRktOS0tKSktNTE9QTkhJS0xPUVFQUU9PSkhKSkxKS0ZHSEdGRklGRUVCQUJCXG9yd3h5enl5eXp6e3t+fn5/fn59fX19fn9+fn9+f4CAgIB/f39/gICAgICAgICAgH9/f39VRUNFRUdHRUQ7P0E7PTw5QD4+QEJHR0FHS0xQVnmFg4ODhISGiIiIiIiIh4eIiIiIiIqLi4qMjIyMi4uNfFhXU1NVU05MS0pERUZLT05PV1VRUE9RU1JNU1RPTVNMUFNVVlJTUVBMSk1NTUtOR0dKRkZISkRERUVCRUNjcHV5eXp6ent6e3p6fH59fX9+fX19fXx9fn5/gH9/gICAf39/f3+BgYCAf39/gIB/f39/f1VGRkdHR0dIRj5AQj0/PT1CP0JCR1ZORk5QUFRYe4aDhYWEhIeIiIiIiIiIiIiIiIiJiouKioyMjIyOi4uLaFhXa2FFUlFRUEk7O1JTUmB1XFVWVFZZWVJYWFJaZlBVV1pdUlRXUU9NUlFQUFFLS0tISEpIRUZJSUlISWlydnl4eXl6e3t8ent8fXx9gH59fX19fX1+f39/f3+AgIB/f39/f4CAgIB/f3+AgH9/f35+U0hKSUhHRkZFPz9BQUVBQ0dFREVMWFJNVFVWWFt8hoWHhoWGh4iIiIiIiIiIiIiIiIiIlJyMioqMfWGKi4uHbVxkVTpYWFhTUT9AVlVZXGRgVllicl1dV11aVkVRWVpbWV9UWWdSVlZYVFRWVE9PTUpMSklJTE1LT01Tb3N2eHl4d3p5ent6enx9e35/fn1+fX19fn1/f39+f4CAgH9/f3+AgICAgH9/gH+Af39+fn5WSkpJSEdFRERCQT9ITUlNUEtJS1BUU1NYWlpcXHiFhIWFhYWGh4eHiIiIiIiIiIiIiImcnaCPiY5nO36LiYqLeW5wWVpbW1JTUlZWVFtadYNZVX2QYFxYXV5XSVZdXVtbX1lIWVhZW11YWFlXUlFNUFFNTU9TUVFVUmFzc3Z3d3Z4eHh6e3p8fX19f39+fX59fX1+fn9/gH9/gIB/f3+Af3+AgICAf39/gIB/gHh5fVlOS0lJSEZCREBBOlBRUVdYUFBPUVNUVFhYWVpbboGCg4WEhYaHh4eHh4iIiIiIiIiIiJaanJeIioFuhomIh4SKfmZZWVxZU1ZUV1JRV1ZjloBRZXJYWldfaFBgZltbWFxnYUdPWmhnXFtcXV1XUk9TUFBRVlZWVllabnJ0d3Z2dXh4eHt7fH19fX5/fn59fn18fn9/f3+Af39/gH+AgH9/gICBgYB/gH1yfX9/b3R8XVNQT01LSkVDP0A7UFBaWltSU1FPUlJSVVNWVFdfdXiAhYSEhYaGhoaHh4eHiIiIh4eIh4ORjomJiIaFiIiGfYB7XFBVWFRSVFJRUUxPTUtmeVtdVFlVVl1aTFRaVVNUXlpYV1dXemtYW1tcXlRRUVBJTk9XVlhbWmRwcnZ2dHR2eHl5e3t8fH19fn99fX1+fX1+f39/gIB/f3+Afn56eHd2c3V7f3+AgHRrfn5rcnleW1ZVVFJPS0ZDREFNXoNsVlJTTk9RT1FVUlNSUlVjZHaAgoKDhISEhIWFhISDhoaGhoeIhn6JiYiHhoOHh4d5bXFWSUtNTktNS0hKREVJRUM+VGRVf1JRUU5LUVRRTU9ZUk1OUVNVVU1RU1JQT01MSENJSFJUVVpcbHF1dXVzc3d6ent7e317fX19fn19fX59fn9/f4B/f399fX5+f39/f4B+e3Zzd31+fmR1fWlxdF9kXV5bWVZQTElMSWFsknRQUVNOUVJRUltSU1JRUlVUYnN7fH+AgYKBgX99e3uAf4OChYaHgoaGhoGEgYaFhnVfXUxEP0NDQ0NCP0RQQkNAQz1DSUdWQEhOTEddaVBIRk5GREVGSUdIQ0RIR0hLR0RCQURAT1FNUmRydHZ1c3R1enx7e3t7fHx9fHt+fX19fn5/f3+AgIB/f3x8fX+Af39/f4CBgH12dHt/bWh8Z25xZmllZGJcWFNRUFVSc1dlW09PTkxRU1FVWVNVUVFUU09WYGtscnZ7e3h5dHJuc3RzeXh+f4OAg4OCgIKAgoGCa01HP0A7Oz5AQD8/PmtQS2FFRkhJRUI/R0xNR01SVUlCRT8/PD08PT0/PT9BQ0NAPzw9Qj5KTkdVbnR0dXN0dnh6fHt9e3x9fX19fH59fXx+fn9/f4B/f39/enl3eHd2dnh7foB+fXt4dnx1YXhnbHBqbGppZmBbUVJaXFleSkpQUU5LTFFSUVRVVVdRUVdWUFhbYl1hZ21tbG9rZ2BucmptbHF1e3p9e3h6fHx4d3hlQ0BAQj06QkNCQkRCXF1Pe05PTk5LTE1PT1BMS01XTUhHQEI8OTc3NTk5PTs7Ozg5ODk/PEJIP1xzdHV2dXZ3eXx8fH18fH19fn58fX19fX9/f39/fn9/f314dXZ6e3p3eXh1d3t8eXh1eXdjcWhpcG1ubW1oZl5PUF5cWklIUFJRT01QUU5RUlRWWFNSWVROWVpbV1ldXl5fZWBdXnF2a15gZ2t3b29sam9ubmxmYllIRkdIQkFHSUVFRkRNUlBhV1JXUVBTU1JVW09PUVZQTUlERj46OTY1ODc5Nzk6MzY1Nzk1PEM+ZXNzdnd3eXl7fX18fHt8fX5+fnt9fn19f39/fn5+fn9/e3d1eX18enh8fHx8dHd2d3Z1d2tuaWhxbm9vb2prYFVXXlpYTUtUVFNQUVVPTFJTVFdYVFRYUUxXWVpWWFhWWFldV1dYaHNrXVZhc2tiYV9eZGFfXllUUU5OTkxJSEpLSUlGQ1FQU1tXVFROUVNZU1xlVU9TU1FOS0lIQz9BOTk5ODk3ODg1NzU3ODU5OkducXR3eHl7e3x+fX18e318fn5+en1+fH1/f359fn59f358dHR1e3hycW9vbnR4cXJzeHZ1cWZkZ3JucHBwbm1kXV9fWVdPUFhWVlNUVk9PVFZYWFlTVVRMS1RWVVVVV1BTVVdUVVJdbl5STllfW1ZZO0RWWFRbZkpMT1JST01NTk5OTEpGUVBVWVNUT0pOT1VTVFxWUlVTUk9NTElISEY/Pj06Nzg3NjU5OTY3Njc1V3Bwc3d5ent8fX59fnx8fXx+fX15fX18fn5+fXx8fX1+fXxydnF4eHJ2dXFxbnBwb3B1dnRuamRkanBwcXJwbmZlZGNcXVJUWlZXVVRXVFJYWFlZWVJVT0lHT1BPT01SSlBQT1BOTk9UTE1JUE9TVFUyPVhNSUBRPWNhUVNRUE5QUVBOTk1RTlRSUFJNSUxKT1JQUlJTVFFST0xMS0xMSENCQT06Ojg3NjtCNTU2Njpkb3F0d3h7fHx9fnx9fH19fX18e3h8ent9fX58e3l9fH18e3B1b3d1cHV0b3N2cHFxcHR1dmNqZ2VXaHRycnFuaWlocFZWVFVYVVdVUldWVVpZWFdVUVNGRUFGR0dIRkpESEpJR0VITEhLSUZMTVBNRy9FX1I+Mz8+am9hUlJRQEdVUVBRUFFOUU9QT0xKTExPUE5OUFFRTlBPSkxNTUtHRUVEQjs9PDw5PUc2Njc3RG1wdHV5e3t8fX18enx8fX5+fXt5dnh3eXl8fXp6dn17fHp6b3Fud3JwdnFtcHNwb3Bzc3N0ZmdgaFpXa3JzcmxtbWtuYWVQU1RSU1RPV1ZWWVlWUVFRT0A9Oz0/QUJBQ0BCRURBQEdIR0hFRkhKTUxFR0NPUkM4RU5TXWdTUFNBR1VQT1FRUE1NTk1LTEtMTk9PUU1PT01ITExJS0tMS0dGRkVEPEFBPjtARTs8ODlTcHJ0eHt6e318fHt5fHp6fn58e3V0dXJ2dnp6eHpyfHt8eXltcW94cnF1bm5xcm9vb3Rzc3J1dGtnZ15lam1wa29xbWltY0xPT01RU0xUVVRYV1VNTEtJPDk4Nzs+QD48PUFAQj0+RUhHQ0ZGSUdKSkBGQUFARkhFSk9IUVJhXFFQUk9TTk9QTExPTUtNTE1PTltXS01RT0dJSENISkxMSkZGRkQ/QkM+PEJHP0I/QWRwc3d6enp7fHt6end7d3l+fnt7cXN0cHJzd3R4eHN6e3l2d2xxb3ZxdHRsb3Fybm5vc3ZydHNycmtsZW5zaG1ubWxtbGprSUxISE9RSlFTUVRTT0tIREQ9OTc3OT9CPjs/QkBAPkFESkVDR0dJR0lFQkI/Pj1DQkFHSUVOT2JlUU1PTldLS01LTE1NTUxLT05TZE5KTFJJSUlFQUhKTE1OSkdJRkJBQkA/RUZFSERLbm92eXl5e3t6fHp3c3h0eHx8eXpucXJtbm9ycnZyc3h8eHZ2bXBtc3B1dGxwcHJvb29ydnVyVlZucWdseYRqbXFybm5qaG9ISkNHTU1KTVBNUE9ISkQ/QT05ODo6P0I/PEBCQUFERUdLRkNISUdHSENDP0I/P0BBPkRFQ0xOUlRMSklNVEZJSUpMSktMSUpMTU9QUlBLR0NMR0NCSkpMTU9OSUpJR0NDQ0RJSk1MSVlybXd5eHp7e3l8dnJwdXJ0eHl2eGpxbmpsbG50dG10dXtzdHhyb25xb3ZzbnBvcnBvcHN0eWpOYGdzanR8eWdvc3FpcWhkcUdLREdISEdKS0lKS0RHQj0+PTo5OjtBQj89QkJDQ0dGSUtKRElJRkdHQ0M7QUBCPkBAQ0VESU1QSEhLR0hLREhJTE1ISkxISUpMS01dUkhIRE5GQURKSk1NUE1LTUpLRkdHSk1OUU5MYm1pdnZ3enl8en1xbWxza3B0dHR1aHBtamlra3RwbnR0eXByeXRvcnFvd3NvcXB0cnBydXR5a05WbXVscXt2aW5vaWt0Z2RvRktDRkVHRUZGR0VHQkNAPjw9OTo6O0BDQD5CQ0VFSUVJSkxGSUlHRkZEQjtBQ0M+QENDQ0RHTE5IS05IREhFSUxOTUdJTEdGR0lJTE5LSUdFTkhDR01LTUxPTU1OTUtISElPUlFSTlJmZmZxb3N4dXt6fGxoam9la3Fsc3BmbWxoaWtsdG1wdXR3cW94dG90c3J2c3BxcnRzcnR1dXZ2WFZ1dWtvdHJrb3ZsaG1lX3BHSkRGRkVDQ0JFQERCPkA+Ojs7PTo9PkNBPkFDRUZKRklITEhHR0dGRUNAPURFQj5BQ0NDREdISUdNUEpGRkdLTk9LRkhJRkVERUlKSEpJRkhQS0RJTUtPTU9OT1BOSkpJTFJVVVJPV2RgYW1ncHJvcnl6Z2VoaGRpbGdxbGZsbWdpa2xzbHB2dXRwbnZyb3Nyc3V0cXNzdXRzdXZ2dnl2dXR3bGp1dW1ydnFsbmxlckxIRUVIQ0JBQkQ9QkE+QT05Oj0/Oj0+QEI+QEJER0pFSUZJSEZGR0VDQkFBRkZDQkJCREVFR0dJRkxRTElPSkpMTElHSEVGRURDSUlIS0pHS1JNQk5PTVFOT09NTk9LS0tPVVdWVVNYX15caWFtaW5ocnNiZWZmZGloZm5pZm1taGtrbXJpcXZ1c3Ftdm5vcXJzd3Nyc3R1dnZ2dnd2d3Z2dHd1anN1bnV0c3FyamtzTUdIRkhCQkFERDxBQEBDPDg6PT45Pzw/QkBAQERGSEVJRkZIR0ZGRENFQ0RJRUNHRUJFR0VGR0dFSk1LSFFNSktISElFRkhIRUNJSUlLTUtPU05EUVJQUVFOUE1OUE1MTVNXVlhXVVhdWl1kYGhiamlna19lZWZjZ2dna2dna21rbWxwcmh0dHVyc252b3FwcnR4cXNzdXZ1gpF5dnZ0eHV1d3htb3VvcnN1cXFpbnlNSEdISEJCQkZEPD9CQkQ8Nzo+Pjo+OkBCPj8/QkVGREdERUhGREVDREVGR0pFRUpHQ0dIRkhHRUNGSkpHTUtMS0hKTEZJSUtIRUtLTE1OT1JUUEhTVVNQU09RTU5RTk1QV1pWWllWWl1aWGFgYGBeaGVjYGRmaGdpaGhpZmhubGxubXFwaXV1eHJycHVwcHBydXZwdXN1dnV7fn14dnR3dnZ2eHBsdXBtc3RucHJyeE5JSEdJQ0FDSEU8QEVCRTw4Oj4+PTw8QUI8Pz5BQkZDRUNDSEVDRUVGR0dHSUZHS0hESEhHSUdGREhLSUdLSE1LSktMSExLTUtKTkxPTk9SVVZPS1VXU1FTUVJMT1FQT1RZWllcWllbXl5eYGNeXGFja2JgZGdocoVoZ2lmam1ucG9uc3JqdHV4cnNzdHJucHF2cnF1cnV1c355jn11dXZ2dnZ4cmh1cWtydGxxdnB0TUlLSEpGQkVHRTxAR0NEQDo8PkA/Pj9CQTxAPkFBRkNFRURJRUZFR0VISEZISElLSkZKSEhLSEZGTElISEpHTExNTExJTUtNTU1PTFBQUVVWV09LVlZVU1NRUUxPUlJQVltbXV5bXF5fX2FgYWRdY2BlZmBlaGpjc3NmamdnbHBycW9zc25zd3dxdXZ0c21vcnVvcnNwdXJ2cnSBdnV1dXd2dXd0Z3Rya3Fya3J2bnZKSkxKTEdCRURFPEBGRERDOz8/QUBAQENBP0I/QUNIQ0ZFRklGSUZGRElJR0lISkxISEpKSUxKRkpLSElKSkdLS01NSkpNTE5OTlBMT1BSVFhWTU5UVlRSUlFQTE5UU1JXW15eX11dYF9gYWFgYWNlYmRoYmRpamd2i2xqaWdtb3NxcHFwcHJ5dnJ1dXRzbW1zc21xcm90dXRycHN3dHV1d3Z1dXRlcXNrcHFqcnZud0tNTEtNR0RDQUQ8P0VFRUM9QUFDQkJDREFDREFBRUdDSEdISEdKR0RISUdISkZJTEhJSk1LTUxHS0lIS0tOUUtSUU1TTUtOTk9QUE9UT1dYWFtOU1BXXFpSV1BOVFVUVFhaX2JiX2RhXmBiXmBlYWFjaW5nYmloaG54dmxoaW1vc3JwcXJycnZ0c3Vzc3Nua3NxbXByb3R2cnFxdXZ1c3d5d3V0dWNtdGtvcGpxdG93TE5MTExHRUFARD4+REVGQ0BDQUVEREZCQ0VHQ0NJRUNJSkpJSUtHRUtKR0hKSUlLSEpKTkxOS0lMSEpMS1pmSmRcS2xTSE9OX25Va3NbcXBid2NTUGF2dWh1Y2F2YFhucWJkdmluemZbbHRgbGpUX3d2aWpnaWZnbG1qbW9qbW5zcnBycnFyc3Jzc3J0cm5sdG9ucHFxdXVxcXN0dnZ1dXl3dXR0YGt0a3Bwa3FycXlMTkpKSkZDP0BCPz1ERUZEQ0RCRUVERkJGRkdERUpFRUpNTUtMTEdHTUlHSktIS0tJS0tOTE5MTExJTE1MW3NiZHBebG1VTU5mc11nZXFsbnRncGlfYVlubmJwcGJrampnb3F0ZXRub1xvdWdwTUpxeXZrYmBrZWVteGxrdm1ucHNycHJxcHFycXJycnRybW1zbm5vcHJ1dHFzc3R1dXV0d3h2dXRibXVrcHBscnJxektMSUhHRURAQkJAPkNGR0JGQ0ZFRkVEQ0hIR0RFS0hHTE1OTE1NRkpOSEpLSklMSkpKS0xNTk5NTUpNTU1bcm9vbnBwbGtNUFFsV05pYnRycGFtbnVcWWxRXG1tWnFta29teHh0c2lwXV9ya3FqVXV5eHBjXmtmYmdwcGpqb3BwcnNwcXBxcXJycXFycnRsbXJtbm5vcnV0cXRydHV1dHV1enZ1dGVudWtwb2xzcnJ5SUtHR0VFRUJCQj5AQEZHQkdESUVFRUJGSUhIRUdLSkdNTU5LTU5HTE5JTEtJSk1JSklKS09QT05NS05OTFxoZHVdbHFXbE5QUW1VWmtea2x2YWxkc1NlY05tWWxcdHBraWx4and1aHBdXnJraFdiY3d8b2NgZ2dhZGl0eWtubnFzc3BxcHFwcnFwcHBydWttcW1tbW9xc3Rxc3J0dnZzd3Z6dnV0aG91bHNvbXNydHZITEZJREVFQ0FCPUJBQ0dESEdMSEVDQ0hLSEhGSkxMRk5MTFNSTEdMTUhOSkhITkhKSklITk9NTkxKTk1KWnNwcG9xcW1sT1FSbllxa2dvb3Fxb210XW5YYXRfbm9wb3Fyb251c3R0altddGN3eHJqbnpoYWFjZmJiam10dXBzdXZzcXBwcW9ydHt/fn13bGtxbmxtbnByc3F0dHN1dXR4eHl4dHVrb3VtdG9uc3N2c0hLSElCRUVFQUA+RERCR0RISU1JRkNGSkxJR0ZKTUxFT0pLV1JLR0tLSk5JSEpMSUtKSUhKTU1NTUlLS0tTa2NbaV5faWNyclpfWWpvX2VlVWtfY1thYVFgbGhdalxuaWlkW3BmZHBdWlxrW21xY3BzbGRnY2RnYGBrbXBwb3R5cnVxb3BxbnmFiIeHhoWAdnNua21tb25xcnR0cnR1dXZ5eHhzdW5xdW53cXJ2dHdyR0dGSURFREZBQEJGRURHQkhKTEhGREdLTElFRkpPTElQSUxbUUpFSEhLTUlISkpLS0lISUdLS0tMR0hLS0xNTUxKS01OVFtcVFBUTFBPTk9PVlFPT1FOT1FKSU5QUWRxaVRZV1xbXFVZW11YXVxcY2ZhYWViY2VfX2ZrbWhtdHlydHJvcHB0hoeGhoaFhYaHg3pwbW1sa3FzdHRydHZ0dXl4eHV2cXJ1b3ZydHN1dXNHQ0VHRkZBRUNAQ0hERkdDSUtMSEZER0tMSERHSVBLTE9LTFdMSUVFSElKSElLSUxKSEZHR0lHSElFRkxJSkxPTElQXFdeUFxbYF5NWFlTXFxiXk1YWk1YYVJKWWFaUl9kXGFYW2RkVlZYXFlaWFxWWVxdYl5kYGFfZWhrZ210dHFxdHBxcoGGhoaFhoWFhYaGhoR9cmtpb3Jzc3N0d3l5eHl4d3h0cXhyeHNxcnVydE9CQ0VMTUJEQ0JFSUVHR0ZLSktIRUVKSktGRUhIUEpNTUpNUklHRUFIRkpJS0xKTEpIRkRJRkRGR0VFSkhDSk1LTFVfWWBYYGFbYFRYWVReXlpfUllcUF5cWU5eXF5TWl5jXlpdYGNgWV9jW2BeW1RYV1leXWNiY2FjZWhla3Jwb3Bwbm93hoaFhYaCe4CFhYaGhYaFf3VxcHJyc3Z5eXp5eXh4eHdyeXZ4cnF4dnR2YVNKSk1JREJCQ0dIRkhHSEtJSUlERktLS0VGSUpOS05MSExOR0hFPkdHTElLTEtLS0lHRElEQ0RFQkZKREBKTEpPW2NZX15hX1JUUldfYFxdWV5RWVxNVl9XS1FZW1BaX2FhXV5jYWBiYmJjY2VaUVlVVVxZXWNgX19jZGJob21ubGxsbHWFf4SDeXV8hIWFhYaGhYWGhoN9d3JydHd5eXl5f359eXV5dnZybnp3dnhYUUtGQ0dFQkVHSUZHSEhGRkpHSEdIS0lMRERLSk1NTExISkpISkY/R0dOS0tLTUtLS0lGR0NEQERBSElCP0lKSFBdYVpbZF1fVFFSWF1cXFxfWktXXExSXFlJTV5RT1xfYWNjY2NiXGRjYmRjZlhRVVRSW1daYF9eXmFhX2Rsa21qamxudn51gXp8hIWFhYWFhYaGhYaFhoaGgnpyc3V1e4WHh4eGhYSBfnhwend2eFxSTUNASUZERktKRkZGSEdGSUZGRklMSk5GREtLTE5KTElLSkhJRkJISFFNS0tPTEpLSUdHRUQ/RUNISEFCR0dFVF1ZXlhfWV9bXVVYWE9dXVFLSlZeWF5bXVVZYFJRX19iYmBgYmJgY2JhZGRiWE9RUVFaUltdXV1dXl9fZGhnbGpubnB7e3x+e4CCg4SFhYWFhYWEhIWDhISHh4FzcneFh4eHh4eHh4eHh4WDgHx4XFNLQ0FIRkRHTVJIQ1FKRkhISEVGS0pNUEVGSUpLTkxMSUxMSElHREhLUU5NTVBMTEpLSElDREFFREhHQkFHRURXVUVcVF1TVl9YT1RVTlpaTUlKVGBhW19YXl5hXU9ZYVxgYF9iY2JdYWJXX19UUE5PT1dRXFtbXFxeX2JmZmVsZm9vd3x7gHt9f4CEhISEhIWFhYODhYKDgoWFhnpvgYaGhoeHiIeGhoaFhYSFg35JTkZERkZIRElSYlBDVl5JR0dIREZNS1BQRUlJSktOTExMTUtKSkdFSk5RUU5PT01OTE1IS0FEQUNERkRDQkVGQk1IQktLT09OTEZNRkdJSkhHTEtNT1BJTE9QT1NPTFBTUlVaWVdZWFhkV09TVFBQTk1PVFJaWFhaXVxgYWRlY2dja2xwc3J6eX97en+EhISEhISEhIKEgH57gYOBfXuFhIaGh4eHhYWFhISEgoGAfUtJRUVIRkdES01dTEdHWExHSEpIR01MUVFITEtLS05NVU5PS0tLR0dLUFNTTlBPTk9OTkdLRmBFRF9MRWZkRU1bSV5bcm1PTVVtWUxEUGBVa1dnSl1XVV5ETFFVTExTVlFSVFhXVFhVVFxVUGZaaGhkWFJqUlZVVFtcW2BgYWJiYmBmaGZua2hyenx9foGEhISEg4ODgX18enJ7gXp7f4KAg4SEhYWBhIWBg4N/fnp7TElGR0ZIRUVLT1NJSkZgU0hKT0pJT01SUUtNTExPUlVST09JS01HSE1RW1lPUFBOT09PSUpRf1FJfFlZcXRZUW1IcW5vYVZQcXFzUENrc21xc3BTb19bblhdVlxYVWtoVV1WY1pgWVtgVlZYf2p0dXVfX3ZfWGFbW2ZbX2BhYWFdYGJnbXBsYHB3dHiBgYKDg4J/fX+Adnh6bHZ+dHh9gHx+gIGChHyAg3p/gX9+d3dOSkVITU5CRExMRklMRVFWTEtOSUtSWFdRTU9PTVFUTk9RUEtLTkdNUFNbWlNRUk9QUFBKSFp4XVR4ZWhaU1RSdmd0bHBibmZqUXJPTXdtanJwc3JxcnBvb4BdZXp1eHFxenF+c31rdX1iUmh8ZXNzb3Nye3xvfnhugHJfYGBiYVpgYGdrbmtibGZnbXd+gYCDfnt4d4B0dnppcn5uc3x+d3h7foCDeHyAdXx/fHxzc05LRmBdR0FFTU1ISktHSlBPTU1KTlZeWVVMUVNOWVpNU1NSTktPSFFSVFlXVlBUUFBQUUtIZ3hsY3hybVtLTVV5cHVtdWJudlBkZUpmdnFtd2+AamZ4eGlXclFoem1panp6fWx4en9vaG9ZdnZqdXVwgWByZn1pbHh8b15fX2JhW11iZGdpaWRnYmNkbGxwcHN0c3NzeXFyeGJsdWdxeXtzcnZ5foFzdXpufH15d3JuTktTdU5DQkZQUEhKS0lLUE9PT01PWmBaV0tUV1BhXlJWUVlSTE9JU1RVWFdXUFVQT05SSktyb3V1cXVxZGliV25McXBeRmh5V3ZUTGl5fXhgeXtzbmFdbW9jUmhxdW5teXB3bHZ0dHJsbl10fnprbXl8a3RsfGtwdnV4Xl9fYl5dX2RkaWdoZWVeYWJpaWlqa25va3FubWpwYWNmY293eG9tcHN5fm5xcGp7enRzb21MTFtWSEdFR1JQSUxNSktQUVBQUFBXXFhVTVVZVWVYUlJZXlNMTklUVFZXWVdPU05OTlFIUm1IaXdLYGR2dlZYbE9ubHtzYWpnf3ZVTFdraH1sbWx4X1twenteYHpzY3JveHFoZH1pcnxeVExsYHZ1a2l1e3ttfnhrfHBcXl9iW15iZGRnZWVlYlpjY2lra3JzcndnbGloZGdgYWthZ3NybGdtbXJ8a21oa3t0bW1rbU9IS0tJSUhIUVBMTk9MS1JSUk9TUldSVlRQV1tWVlRUVGFfUE5NS1RTVFFVVk5OTE1PUEpIUU5QVUxLTFNUU1NUUFZVUVFOUVFYWVJOUFVUWFhYW1pVUlNXW1dYV1pPU1VXWFhSXllXXlZUUFlSVldXV1heW2dyXltbWVxdX2NaX2NjZGZkY2NiWmNjZmZlbW5tdWVlZ2NhZl9dZ2BkbGhmZ2tocHpoZ2drdWpoZ2lsUUlLTE1NS0pTUU1RUE9MVlVUUFRVWFVZVVFaXVZVVFdVWVdPT0tNVlRRTlVTTk9NTFFQS0pSUUtRTUtLUFJVU1FSU1NJSExOT1FSUVFRVFZSWFdcV1NTUFJUVVZTWlFOU1JYVlRZVlRaVlRSVVRUVVdYVl1ZXmBdXFpaXFxfY1tdYmNkZmRkZGFZYGFjYWJoaGltYmFkXl9jXVpkXGJtYV5mZWZtc2RpaGtrZWRjZmhQSktLT09MTVNQTlNRUU1YV1VUVVdXV1pVU1xgVldWWVVYU1BQSk5XU1BOVVBOUU5MU1BMT1VTTlFOTU5RVVFVUVJUVU5LTU9RVFRSUlFWV1RZWltZU1VSVFdXV1lbVFBUVVhVVVpVV1pWU1JXVlVXW1haX1xVWF5cXl1bXWBhXltiYmNnZmVkYlhfYWJdYGdkZmVhXl9dXV5aWl9aX2dgXl1dYmhrYWdmaGZkYGJjYVBLTUxQUUxPVE9PU1FPUVtaWFdYW1lYWVZcamRWWFlaV1ZTU09KTlZUUE9UUFBQTkxRUVBSWFRRUU9NT1NWT1dSVFVVT05NUVNVVVRUUlRXVlpdXFpWVlFRVlhWW1tXUVRXVlZWWVRYWFZTUllXVlpdWV1fXlVeXV5gXFtfX19fWmJiZGhnZGRiWGFgYl5eZmNjYGJdXFxcXFlaW1hbYVteXVxfYl9fYmRlYmRfX2BcUE1OTlJRTVJST1NUUU9VXFpaV1tbXFhaW2RxbWhkX1tZVlVXUUxNVlNNTlJPUVJPTFBTUlVaVVNQUE1QWFdSV1NTU1hNT09RVFhWVVVTVVlYW15dW1tWUk9VVlZbW1dSVFdWV1hWVFhbVFNSWlhXXF5aXl9gVWFcYWFdYGJfXWBdY2BjZ2hkZmBZY2BhX19lZF9gY1taXFtcWVpZWFdcWVxbYF5fW15eYWBeYlxZYFpRTk9OVlFQVFJPVVRTUFdcXFxYXlxeVlxeanF3eYBjXFtVVVhRTU9WU05RUVBSVFJLUVRUWVpXVU9ST1NYV1RTVVJSWk9QU1JWW1ZWV1NWWlhdXltbXlZTTlRVVlxcVlJUVlZYWVNUWVxVU1NdWFpdXlxgYGBWYVtjYl1hY19cYmFiX2NmaWRmXltkYGFgYWNkX2JfWVpeW1xbWVhZV1daWlphXF1bXVxcWl1gV1tbWlBPT09ZUFVUUlFXUlRQW15eXVtgXGBVXF1oanJ9c2xnXFRXV1FOUlpTUlFUUlRVVEtSVlZbWlpTT1NRVlZWVE9XUlNaUlRUVFhdV1hYU1hcWF5dWVpdVFVOVldXXltYUlVVWVlZVVdZXFVUV15ZXV1gXWJiXllfW2VhX2RkXl5jY2FeZWZpZGZdXWRhYGBhYmRgYl5YWl9bXFtYWFhYV1taXGBcW1tcW1haW15WXlldUE9PUlpQW1RVVlZUVFReXmBeXmJcYFVdXmJreXRsfWtaVVlVUVFTXFRVVFVUVllXTFJbV11bXVJPVVNYV1dUUFhSU1dTVlVVW11YW1lVWl5YX15ZXFlSV1JZWFlfW1pUVVZaWVpXWFpcVlVaXlxeYGFfZGNcXl1dZWFhZmReXmRjYFxnZGhlZGJfZGFfYWBiYl9gXldYXlpcXFpZWVdWXVpdXlpZW1xbV1lcXVZYV11TT1BXWVFcVVZZV1dVWF9fYWFgY11fVF1fYmVldYF6aFhZWVNVU1ZcWFdXVlZXXVhPVV1aXl1cVFJXU1dWVVNUWFJTVlRYV1hdXlhdW1ZdX1hfX1hcVlFZVFlaWmFZXFZXWFtaW1lZWltYVl1fYF9jYmFkZFxiXGBmYWRmZF5fZGJiW2ZjaGVjZmBmX19hYWFhYF9eVlVdWVtcW1lbWVldW1tbWFhZW1laWl1fXVRZXVVOVFlWU1xUVldZVlZcYGFiY2FjXl9WW2BkYV96dW9oWVxaVVdUV1taWVxZWFlgV1BWXlxgYFxUVFhQVVdWVFZXUlNVV1paW19eWl9cVl9fWV1eWV5VU1lXWVldYlpeVldbXFtcW1taW1lZX19gYGRiY2RlYmRZYWZjZmZlXmFiYGNeYmNpZGNnX2deYWJjYWFgXl9YVFtaWltbWFtYWFxbWltXV1lYV1xbXGBdVl1dU09WWlZWWlVYVVhXWF1fYmFkYWRgXllZYWRiYGxmaF5bXVtWV1hZXFxcX1tZW2JWVFheXWFjXFJWWVBXVldXV1ZTVVRYXFxeYGBdYFxXYV5bXlxbXlhWWFhbW19gXF9YWVxcXV5eXFtdWFtgYV5gZGNkZWVmYlhjZWRoZ2ReY2BgZWNdZWlkZWlfZl1jYmNhYWBfX1tYWVtZWlpYWVhXW1taW1dYWlRZXVxaYFxVXmJOU1dZVldaWFtcWFdZXmBiYWRhZGFdXllhY2JfYWBgXlxcXFdXW1tdXV9fXFpdY1haWF1gY2RfUlhZUFdXWFlZV1ZXVl1dXmBhYF9iXllhXV1eWV1eWVhVV1tcYF5dX1paXl1eXmFdXFtaXGBiX2JkY2VmZWZiWmRmZmlnY19jXmFmZFppaWNmamNlXmJiY2FgYF9dXVpYXFlZWFhaWFdaW1pZV1hVVVtdXV1gYGJieEtYV1tZV11bXF1aV1xdX2BiZGFiYV1gWGJjYmFjYWJdW1xbWFdbXF9dYF9dW2BkXFxYWmJlY2FSXFpPWFhaW1taV1pZYF1gYmJgYWNfXGJdX11bXl5ZWVRYXV5fYF9gXFteXmBiY11cWFxeYGJiY2VkZmRlZmRcZWZnaWZjYWJcY2dgXGlpYmhqZWRgYmFjYV9gX11dXFlcWVhXWFlYV1xaWldXWE9YWl1hY2Zmcmt/SllXXFpaX1xbXlxYXVteX2FjYmFhXWJbYmRiYGJjYlxbW1pXWGlxYFxgX11cYWNfXllZY2VkYVNfWlJZWFxdXVtaW1tjYGJiY2BiZGFgY15gXF5eXlpYVltfXl1hYWBeW2BhYmVjX11UXWBgY2RkZmVnZWZmZV5lZmhoZ2RkYFtlZ15haGhiaGhmY2BiYGNiX19fXV1bWltZWFhYVlpWXFtbVlZVTVhXXGdpa2h1eIF2dnZ2dnZ2dnZ2dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6e3p6ent7e3t7e3t7e3t7e3t7e3x7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHt7e3t8fHx8fHx8fHx8e3t7fHx8fHx7e3t7e3t7fYmIhoqHhYKBgoOCg4OCgoKCgoKCgoKCgoGAgYCBgICAgYCBgYGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t6e3t7e3t7fHx8fHx8fHx8fHx7e3t7e3t7e3t7e3x7e3t7e3t7fHx8fHt7e3t7e3t8iYmHiYaFgoGCgoGCgoKCgYKCgoKCgoKBgYGAgICAgICAgIGBgYB9fHx8e3x8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eHh5eXl5eXl5eXl5eXt7e3t7e3t7e3t7e3t7e3x8fHx7fHt6enp6ent7fHx8fHx8fHx8fHx7e3t7e3t7fHx8e3t7e3t7e3t7fHx8fHx7fHt7e3uHiYiJhYSDgYKCgoODgoKCgoKCgoKCgYGBgICAgICAgICAgYKBgH58fHx8fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3h4eHh4eHh4eHh4eHh4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3x8fHx8fHx9fX19fXx9fHt6enp6e3t8fHx8fHx8fHx8fHx8fHx8e3x8fHx8e3t7e3t7e3x8fHx8fHt7e3t7e4aJiYiFhYOBgoKCgoOCgYKCgoKCgoKBgYGAgICAgICAgIGBgYCAfnx8fHx8fHx8fHx9fX18fHVwb29vb29veX59fX19fYSMi4uLi454KSkqKiopKz0/Pj4+Pj5tgH5+f397pdfT09PT1r2GiYmJiYqCRT4/Pz8/QDAqKysrKiKM29LS0tLWun1+f39/f359fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx8fHx8fHt7e3t7hIuHh4aHgoGDg4GCgoKCgoKCgoKCgoGBgYCAgICAgICAgYCBgIB+fHx8fHx8fHx9fXx8fH19dXBub29vb255gH9/f39+hpCPj4+Pk3kZGhoaGhocMTMzMzMzMmqCf4CAgHut6eTk5OToyomMjIyMjYM6MjMzMzM0IRobGxsbEI/v5eXl5enHfX5/f39/f319fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e3uCjYeIh4eDgoSCgYKCgoKCgoOCgoKCgYGBgICAgICAgICAgICAgH58fHx8fHx8fXx8fH19fX12dXV1dXV1dXZ3d3d3d3d4eXl5enl6eG9wcHBwcHBycnJycnJyd3p5eXp6en6Dg4ODg4SBfHx8fHx8fHZ1dXV1dXV0c3Nzc3NzfYWEhISEhYJ8fX19fX19fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e4CMhomHh4SDhIKCgoKDgYKCg4KCgoGBgYGBgYCAf4CAgICAgICAfnx8fHx8fHx8fX19fX19fXZ2dnZ2dnl3dnZ6e3h7eHd2d3p4enl5fXp5eXh4eHh5eXl5enp5eXl5enp6eXh4eXl5eXl7e3t7e3t7fHx8fHx8fHx9fX19fX17enp6enp6e3x8fHx9fX19fX19fX18fH19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8f4uHi4qIhIODgoKCg4KBgoKDgoKCgYGBgYGAgIGAf4CAgH+AgYF+fX18fHx8fHx9fX19fX19d3d3dnZ3fXh3d316eH14d3d4fXl7fXp8e3h3d3d3eHh4eHh5eXl5eXp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fHx8fHx8fHx7e3x8fHx8fHx8fHx+iomMjImFg4SEgoKDgoGBgoKCgoKBgYGBgYCAgICAgICAf4CAgH19fXx8fH19fX19fX19fX13d3d3d3p9eHt4fHx3e3h3d3d8eXt+eXx6eHh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fX19fXx9fX19fX19fX19fX19fHx8fHx8fHt7fHx8fHx8fHx8fH2Kio2NioWDg4SCgoKCgYGCgoKBgoGBgYKBgIGBgICAgIB/gIGAfXx9fX18fX19fX19fX19fXd3d3d3fX55d3d4e3p7eHd3d3x5eXx6fHt3eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt8fHx8fHx8fHx8fHx8fH19fX18fH18fH18fHx8fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8foqJjo2JhISEg4KCgoKBgYKBgoKCgYGBgoGAgYKAgICAgH+BgIB8fH19fX18fX19fX19fn5+d3d3d3d5fHl7eHx9eXt5enp4fHp7fHt9e3h4eHh4eHh4eXl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt7fHx7fHx8fHx8fHx8fXx8fX19fX19fXx8fHx8fHx8fXx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx/iIeNioeFhoaDg4ODgoGBgoGCgoGBgYGCgYCAgoF/gICAf4CAgHx8fX19fX19fX19fX5+fn53d3d3d3Z4eHl3eXp4enh5eXh6eXp6eXt5eHh5eXh4eHh5eXl5enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX18fH18fH19fX19fH19fX19fHx8fHx8fHx8fHx8fX+HiIyIhoeHhIKDhISCgYKBgYKCgoGBgYKBgIGBgYGAgIB/gIGAfHx9fX19fX19fX1+fn5+fnd3d3d3d3d3d3d3eHh4eHh4eHh4eHl5eHl5eXl5eXl5eXl6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fHx8fX19fHx8gIeIi4eHiYaDg4SDg4KBgYGCgoGBgYKCgYGBgIGBgYCAgICBgX97fH19fX19fX19fn5+fn5+d3d3d3d3d3d4eHd4dnl5eHh4eHh5eXl5eXl5eXl5eXl5enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fH19fXx9fXyBhoqKiYmIhIOFhISCgoGBgYGCgYGCgoGBgYCAgYGAgIGAgIGBf3x8fX19fX1+fn5+fn5+f394eHd4eHh4eHZxZGpeam15eXl4eHl5eXl5eXl5enp6enp6enp6enp7e3t8e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIGFiYqJioeEhYWEg4KBgYGBgoKBgYKBgYGBgYCBgYCAgYCBgIF+fH1+fn5+fn5+fn5+fn9/f3h4eHh4eHh5bWRiZV9fXm95eXl5eXl5eXl5eXp6enp6enp6enp6e3t7e3t7fHx8fHx8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goWKiomJhISGhYSDg4KBgYKCgoGBgoGBgYKBgIGBgICAgICBgH58fX5+fn5+fn5+fn9/f39/eHh4eHh4eW5kZWdlZGJeZnh5eXl5enp6enp6enp6enp6enp6e3t7e3t7e3x8fHx8fHt8fHt7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChouJiIqEhYaEg4OEgoGBgYGCgYKCgYGBgYCAgYGBgIB/gIGBf3x8fn5+fn5+fn9/f39/f394eHh4eHl3Z2VkZWZkZWFfaXl6enp6enp6enp6enp6ent7e3t7e3t7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHt8fHx8fHx8fHx9fX19fX19fX19fX19fXx9fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4eJh4SEhoSDg4WBgYGBgYKCgYGBgYKBgICAgYGAgYCAgYF+fHx/f35/f39/f39/f39/gHl5eXl5eWtlYWJlZWFlZV5ieHdze3p6enp6enp6enp6e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fH18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19g4aLhoiFhYaEgoOEhIKBgYGBgoKBgYKBgYGAgYGBgYGAgIGBgn98fH9/f39/f39/f3+AgICAeXl5eXl0Y2NlZGNmY2doZGZsZF5ze3p6enp6enp6enp6ent7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn6DhouGhoaGhYODg4SDgYGBgYGCgoGBgYKBgYCAgYGBgYCAgYGBfnx8f39/f39/gICAgICAgIB5eXl6d2RhY2diYmRdW2VfYV1eYGFoeHp6enp6enp6enp6e3t7e3t7fHx8e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+foSFi4eGhoaGhIODg4KBgYGBgoKCgYKBgoGAgIGBgYGAgYGBgYF+fX1/gH+AgICAgICAgICAgHl5eW9vYmJiZF5jZ19dYWFgXF9kYlttfHp6enp6enp6enp7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7fHx7e3x7fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5/hIiLhoSHhoaEhIODgoGBgYGCgYGBgYKCgYCAgYGBgYGBgYGBgX5+fYCAgICAgICAgICAgICBeXpwXWJlZGJkXmZnZ2BZYmJhY2VfXF1ze3t6enp7e3t7e3t8fHx8fHx8fHt7e3t7e3t7e3t7e3t7fHx8fHx8e3x8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fn19fn5+fn5+fn5+fn5+foCFjIqEhYaGhYODg4SCgYGBgYKBgYGBgoKCgYCBgYGCgICAgIGBf35+gICAgICAgICAgIGBgYF5emxiZGdjYmdmYWBgZGFiZWRjZGNeXGJ1fHt7e3t7e3t7e3x8fHx7e3x8fHx7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/gYeMiYWGhoeFg4SDgoGBgYGBgYKBgoKCg4KBgIGBgYKBgYGCgoF/f36AgICAgICAgIGBgYGBgXp7dGdnZmZkZGZmYF5fYWNlaGRlXmJkYHR8e3t7e3t7fHx8fHx8fHx8fHt7fHt8fHt7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f3+CiYqIhoaIhoWDhIOCgYGBgYGBgoGBgoKCgoGAgYGBgoKBgYKCgX9/f4GBgYGAgYGBgYGBgYGBenptaGNjZ2ZnZWdmZmdiZWRlYmdbYmVgdnx8e3x8fHx8fHx8fHx8e3t8fHx8e3x8fHt7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f39/f4SJioiGiYeFhYSEg4KBgYGBgYGCgYKCgYGBgYGBgYKBgoGBgICBgH9/gYGBgYGBgYGBgYGBgYF7emlpZGNqZmFgZmVjY2NnaWRjYmBiZGJ0fXx8fHx8fHt8fHx8fHx8e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f39+fn9/f39/f39/f3+AhIqMiIeJhoSFhYOCgYGBgYGBgYKBgoGBgYGBgYGBgoKBgYGBgYGAgH+BgYGBgYGBgYGBgYGBgXZzZWRnY2RmZWJlZmdkZmhmZWNgYGNkYHF9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fXx8fHx8fHx9fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/fn5+f35+f39/f39/f3+AgICFioyJiIqJhoaDgoKCgYGBgYGBgoGBgoGBgYGBgIGBgYGBgYGCgX+Af35/foCCgoKCgoKCgoKCc3NnZWRkZWlqaGZnZ2NhZmZlZmdmZWVjdX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fH19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gICAgICAgIWLioqJioeHhoSCgoGBgYGBgYKCgYKBgYGBgIGBgoKBgYGBgYGAf4B+dHRzdX1/goCAfn5/gYB0cmdkZWNmaWppZWNlY2BmZGRnZ2JiZWFwfXx8fHx8fHx8fHx8fHx8fHx9fX18fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f39/f39/f4CAgICAgIB/houLiouLh4eHhIOCgYGBgYGBgYKBgoKBgYGBgYKCgYCBgYGBgoCAgH5zc3NzdHV4dXV0dHV2dXVwZmNmZWhoaWdoZ2VmZWJfZGVmY2BiZ3d8fHx8fX19fX18fHx8fH19fX19fX19fXx9fXx8fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gIB/f3+AgICAgICAgICHjIyIi4qHh4eEhIKBgYGBgYGBgoGCgoGBgICBgoGBgYKBgoKCgYCAfnNzc3Nzc3NzdHR0dHNzdW9jY2FnZWhoZ2pmZGVnZmhmY2JlYl5ieX18e3t8fX19fX18fHx9fX19fX19e3x9fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn9/fn5+fn5+fn5/f39/f4CAgH9/gICBgICAgICAgYCAf4CAgYGAgIeLi4iNiYiJhoSFgYGBgYGBgYKCgYKCgYGBgIGCgoGBgYKBgoKBgIB+dHNzc3Nzc3Nzc3Nzc3N1cmdlZWRlamhoZ2ZpaGdjZWViZGNoZGd7eHVzc3R2dnl4dnR0dHZ3d3d2dHR0dXV4d3h4d3d6e3x9fXx9fn5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f35/f39/gH9+fHt7fX58eXl2dnZ5fHx6end2d3l7fXt4hIyMioyHh4iEhYSBgYGBgYGBgoGBgoGBgYGAgYKCgYGBgoGBgoGAgH51c3Nzc3Nzc3Nzc3Nzc3VzaGVnaGVrbGhqZ2lqZ2dnZmRkYmVkbnV0dHNzdHNzc3Nzc3Nzc3Nzc3NzdHNzc3Nzc3Nzc3N0dHV1c3V3eHl7fn59fn98f39/f39/f39/f314fH5+fXx4dXZ3eXd4dnRzc3N0dXRzc3Nzc3NzdHNzc3R0c3R0dHODjI2KiYeIhoOGg4GBgYGBgYGBgYGCgYGAgYGDgoKBgYCBgYGBgICAf3VzdHRzc3Nzc3Nyc3NzdnZpY2hqaGpsZWZpbGhgZmVkY2BkZGZ0dXV1dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHRzdHRzc3Nzc3R2dnV1d3V4fH9+fX9+fHp4dXN0dXV1dHNzc3Nzc3N0dHR0dHR0dHR1dXR0dHV1dHR1dXR1dXV1dIaMjYuIhoeEhIWCgYGBgYGBgYGCgoGAgYCBgYKCgoGBgIGBgYGAgIB/dnNzc3Nzc3Nzc3Nzc3N2dnNnZ2pmaGdmaGhmZGlnY2NnZWVmcHZ1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dHR1dHR0dHR0dHRzdHR0dnV1d3Z0c3R0dHR0dHR0dXV1dXV0dXV1dXV1dXV0dHNzc3N0dHNzdHR0dHR1dXR1iY6MjIqHh4SEhYKBgYGBgYGBgYKCgoGBgICAgoKCgoGBgYGBgYCAgH93c3Nzc3NycnJyc3NzcnZ2dW5kXWNnZWlraGVoZ2dqamlnZXB2dXV1dXV0dHRzdHR0dHR0dHV1dXV1dXV0dHV1dHR1dXV1dXV1dXV1dXR0dHV1dXV1dXV0dHV0dHV1dXV1dXV1dXV1dXV1dXV1dXV0dHNzc3Nzc3N0dHNzc3Nzc3R0dHR0dHWKjoyMiYaGhIeFgoGBgYGBgYGBgoKBgYGAgYGCgYKBgYGBgYKBgYCAf3hzc3Nzc3JycnJyc3NzdnZ3d2liaGhnamtpaGZkZGVmaWhwdXR0dHRzc3JxcnJ0dXV0dHR0dHR0c3NycXFxcXNzdHR0dHR0dHR0dHV0cnJyc3R0dHR0dXV1dXV1dXR0dXR0dHR0dHR0dHR0dHR0c3Nzc3Nzc3Nzc3Nzc3N0dHN0dHR0dHR0dYuOjImGhYWFh4SCgYGBgYGBgYGBgoKCgYGAgIKCgoGBgYGBgYGBgIB/eXNzc3NycXJycnJzc3N3d3d3bGpoZGhpa3Z6a2VmZWhnbXJzdHN0c3JwcHBxcnN1dXR0c3Nzc3JycXBvb29vcHFzc3NycnJyc3R0dHNxcHFyc3R0dHR0dHRzc3Rzc3NzdHR0dHRzdHR0dHR0dHRzdHR0c3NycnFxcnJzc3Nyc3NzdHR0dHN2jZCMh4eFhYSEgoGCgoGBgYGBgYGCgoKBgYGAgYGCgoGBgoKBgYGAf395c3NycnFxcnJycnNzc3d3d3dzc2pnaWloeX99cW51bG5wcXJycnFxcG9wcXFxc3R0c3NycXFxcG9ubm1ubW5ubnBxcnJycnJycnJzcXBvb3BxcnJzc3JxcnJycnJycnJycnJzc3Jzc3Nzc3Nzc3Nzc3Jxb29ubm9vcXJzc3Jyc3NycnNzcnaPj4uHhoWFhYOCgoKBgYGBgYGBgYGBgoGBgYGCgoKBgoGCgYGCgX9/f3hxcHBwcXFycnJyc3Nzd3d2dnd2cnF0c252f352c3hwcHBycnJycXFwcHFxcXJzc3Nzc3JxcHBwb25ubm5ub25vcHBxcXFxcXBwcXJwb25vcHFxcXFxcHBxcXFxcXJycnJycnJycnFxcnFxcnJycnFwb29ubm1ubW5vcXJycnJycnJyc3JxeI+OjYaDg4aEgoOCgoGCgYGBgYKBgYGCgYGBgYKCgoKCgoKBgYKBf4B/d29wb3BxcnJyc3Nzc3J2dnZ2dnZ3dnZ1c3l/fnd3d29wcXFxcXFxcHBwcXJycnJyc3NycW96f29wb29vb29vb29wb3Bvb29vcHBxb29vcHBwcHBvcG9wcHFycXFxcnJycnFxcXFxcXFxcHBwcHBxb29ubm5tbW5tbm9wcXFxcXFxcXFxcXB7j42NhoODhYOCgoKCgYKBgYGBgoGCgYGCgoGCg4KBg4KBgYGAgYF/f392bm9wcHBxcXFxcXBwcHZ2dnZ2dXR0c3NxfYB9fX9zb3BxcXFwcHBwcXFwcXFxeXtwcnFwcZeDbnBwb29wcG9vb29vb29vb3BxcXBub3Bwb29wb29wcnJycnFxcXBxcnFwcXFxcHBwcHBwcHBwb29ubm1ubm5ubm9ub3BwcHFxcXFxcXFxcIKRjoqEhIOFhIOCgoGBgoKBgYKBgYGBgYGCgoKCgoKCgYGBgYCBgX9/gHVvb29wcXFxcXBwcHBwdnZ2dXRzcnJycnGAgoCBeXBwcHBvcHBwcHFxcXFwcnF9nnpwcW+GoHxvcHBwb3BxcHBvb29wb29vcXFwcG9wcG9vb25vcHFxcHBwb3Bvb3BwcHBwcHBwcHBvb29vb29vbm5tbW1ubm5ub25vb3BvcHBwcHBwcHBwiZCMiISDhIaDg4KCgYGCgoKCgYGBgYCAgYGBgoKBgYGBgYGBgIGBgH+AdG5vb3BxcXFwcG9vcG92dnVzcnFxcXFxcICDg39ycHBwcHBwcHBwcHFxcHBxcXKdn3ZwdJyffW9wcHFwcHBwcHBwcHBvcHBxcXBwcHFxb29vbm9wcHBvb29vcHBvb3BwcHBwcHBwcHBvb29vbm5ubm5ubW5ubm1ubm9wcG9vb29vb3BzcXWPj4uJg4KFh4ODgoKBgoGCgoKBgYKBgYGBgYGBgYGBgYCAgYGAgYGAf4B0b29vbm9vb29vb29vb3Z1dHNxcXFxcXJygIKCgXRxcXFxcXFxcXFxcXFxcXFycJeskG5/o59+cHFxcXFwcHBwcHFxcXBxcHBwcXBwcHBwcHBwcHBwcHBwcHFxcXBxcHBwcHFwcHFxcHFxcXFxcXJxcnFwcnRycnR0dHR1dnRzdHR0dXd3gpCPi4iDgoaHhISCg4GBgYKCgoGBgoGBgYKBgYGBgYGAgICBgYCBgYB/gHVvb29vb29vb25vb29vdXRzcnJycnJycnKDg4OCdnFycnFxcXJxcnJxcXJycnJwjrGoeoimoH1wcXFycXFxcXFxcXFxcXFwcXFxcXFxcnNzcnJyc3V1dHR0dHR0dHV2d3d3d3d3eHh4eHd3eHh4d3Z3dnV2dnZ2d3h6e3x7e3t6enp6enyGkI2LiIODiIeHhYODgoGCgYKBgYGBgYKCgoGBgYGAgYCAgYGAgIGBgH+Ad3FxcXFxcG5ucG9wcG92dHV1c3Nzc3NzdYiDgoN5cnNzcnJyc3Jyc3Nzc3Nzc3Ocs6akp7GidnNzc3Nyc3N0dHV1dXV1dHV3eHd3d3d4eHh3eHh4eXl5eXl4eHl5eXp6e3t7e3t6enp5eXh3d3d1dnV2dnd5enp7fn5+fX1+fn5/f35+gIyQi4qHg4WIi4iEg4SDgYGCgYGBgoGBgoKCgoKAgYGBgYCBgYGAgIGAf4B8enp5eXx5eHh2dXZ2dHl2d3h3d3Z3dnZ6fnx+fnx2dnd3dnV4enh4eHh4eHd3gaudobamoqeEenl5eXh4eXl6enl5eXh4enp5eXh4eHh3dnd3eHh3eHh5eXp7e3p8fH1+fX9/f359e3t7e3p5enl5e3t/foB/fn5/fn19fX5+f35+fn6AjpCNioeEhoqLiIaGhIOBgoKBgYGCgYGCgoKCgoCBgoKBgYGCgYCBgIF/f4B/fn19fX9/f318e3t7eXh4eHh5eXl4eXh5eXl4enp6enp6e3t7fH1+fHx8fHuSppmjsaGbpJR6e3p4eXh4ent6enp5eXp8fHt6enx8fHp6ent9fHx+fn+AgoGAgYKAgH9/gYGBgIB/f35+fn5/fX1+f4CAf35+f39+fn9/f39/gH+Af4OQjoyHhoWIi4yIh4aFg4GCgYGBgYKBgoKCgoKBgYKDgoGBgYGBgIGBgIB/goOCgoGBgX99f39/f4F6enh4d3h4eHh5eHh5enp5e358enx9fXt8fX19fX19fZWeipSsnp6fmoB/f319fYCDgoCAf318fXx9fXt9fXx8fH19fX1+gYGChISDgoB/gYGBgH9/f4B/f39/f39+fn9/f39/f35+f3+Af39/gICAf4CAgICAhJCPi4eGhoiLi4mKhYaDgoKCgYGBgoGCgYKBgYGBgoOCgYCAgYGAgIGBgH+ChIKCgICAgH9+fn+AgH9/fn18fX19fYB/fX+Af35/gH9/fn9/gICBgICBgIGAlKOclJybl46bg3+BgH5/f39+f4B/fn5+f39/gYB/f4CBgYCAgYOEgoGCgoGCgH+AgYCBgYGAgH+BgICAf39/gICAgYGBgIGBgYCAgICBgoGBgYCAgYGFjo6MiYaHiYyLi4qGhoOCgoKBgYGCgoOCgoKBgIGBgYKCgICBgYCAgYGAf4KFg4KBgYCAf39+fn+AfX5+fn19fX5/fn9/f35+fn+AgYCAgICAfn9/f4CBgH6asqmjm5+fpaeRfXx9foB/fn5/f35/gIGBgoKDg4KCg4KBgYKDg4OCgYGBgYKBgoKCgYKBgoGBgYGBgoKCgYGCgYKCgoGBgoKBgYKCgoKCgYGBgoKCgoaPkY+KiImKjY6NiYaFgoKCgoKBgYKCg4KCgoGBgYGBgYF/gIGBgYCBgIF/gYWEg4KCgoGCgYCAgIB8fHx7fH18fH9+fn9+fn5+f35+f39/f39/gH5/gIGEla+mnqWfn56kqK2fkYeBf4B/gIF/f39/f3+BgYGCgoCAgYKDg4SDg4ODgoKCgoKCgoKCgoKCgoGCgoKDg4OCg4ODgoKCgYKCgoODg4ODgoKCgoODg4KCh5KTkIuKi4uPj42Lh4SCgoKCgYGBgoKDgoKBgYGBgIGBgICAgYGBgIGAgYCAg4SDg4OEg4ODgoKCgXx9fHx9gn1+f4GCiIGCgoSCgYGDg4GBgYKDgoaJlqaxqZ6bpZ+en6Cfo6ioo5eHgYCAgICAgH9/f3+AgICAgH9/gYODhYSEg4SDgoKCg4OCgoOCgoODg4ODg4SDg4KEhYWDg4SEgoKDhIOCg4ODg4OCgoODgoCKlJOPioqMj5GPjYuGg4KCgoKBgYGBgoOCgYGBgIGBgoGBgICBgYGAgYCAgH+BgoODg4SEhIOCgoKCfXx8fn6AgYOAg4OChIaFhoaFhIWFg4ODg4ODhYqZo5+ZmJidnZ6hn5ucnZmTjIWDg4KDg4ODgoGAgIKCgYOCgYKCg4OEhYWEg4OChISEhIOEhISDg4OEg4ODg4OEg4SDhIWEhISDg4ODgoKCgoKCgoKBgYKCgo+UlI+Njo6RkY6KiISCgoKCgYGBgYGCg4GBgIGBgYGBgYCBgIGBgYCBgICAgIKChIKChIOCg4ODgoJ9fX2AgH+AgoGDg4ODhIaEhIOEhYWDg4GBg4OBgIGHjJGVmJmNlZ2bmJSNh4aGh4eGhoeHhoaEgoGCg4SDg4ODg4ODhISFhYWDhYSFhISEg4KBg4OCg4SEg4KCg4SCg4ODg4OCgoKCgoKCg4OEhIOFhYWFhoaIk5OTkI+Pj5KRjIqIgoKCgoKBgYGBgYKDgoKBgIGBgYGBgICAgYGBgICAgICAhISEgoKCgoGBgoKBgX+AgYOCgICAf4CCgoGDg4KCgYODg4SDg4GDhYSCgYGBg4uWnIeOm5qMh4aIiIiHh4eIiIiFhIOBgIGBgoKCg4GCg4SEhYSDg4OEg4OEhIOBgYGCg4OEhISDg4ODg4OEhIODgoSDg4ODhIWFhoeHh4eIiIiJiY6TkpKOj46Rko+LiYeCgoKCgoKBgYGBgoKCgoGBgIGBgYGAgICAgYGAgIGAgICDg4KCgYKCgYGAf4CBhYWFhoOCgYB+fn+BgoSCgYKDhIOCg4ODg4KChISDhISCgYSLipKOhYSDg4WFhYOEhIWFg4GCgH9/gIB/gIGEg4OEhYWEgoKCgoOCg4OFhIKDhISEhYaGhoaGhoWFhoeHhYaIh4aHiIeGhoaIiYeGhYaGhoeIkZKSj46QjpGRjImHhYGBgoKCgoGBgYGBgoOBgYGBgYGBgICAgICBgYCAgICAgISEg4KBgoGAgYGAgYKIh4aHhYSCgH99fX6AgH+AgYGBgYGBgoGAgYKDgYKCgoGBgYCIkYKCg4GCgICAf4GAgIB/gH9+gIGBgYKCg4OEg4OEg4OCgoGBgoODg4SEg4SEhIOFhYaFh4eIh4eHh4eHh4eGhoaGh4WFhYaGhISEhIWEhYaSk5GOjo+OkI6JiIeEgoKCgoKCgoGBgIGCgoKCgoKCgYGBgYGAgYGBgICAgYGAgoSDg4KDgoGCgYKDg4iHh4iHhYSCgX5+gICAfn5/f4CBgYGCgoCBhI2DgH+AgICAgImRgIGCg4OAf39/gICAgICAgICDg4KDg4ODgoOBgYKCgoOCgYKCgoOCgoSDhISDg4SEhYWFhYaGhoaFhISEhYWEhIWFhYSEhISDhISEhISEipSTkZCQj46NiIaFhIOBgYKCgoKCgYGAgYKCgoKBgoKBgYCBgYCBgYGAgICAgYGAg4OCgoOCgoKBgoOCiImJiYiHhYSDgYKEhIOBgoKCg4SCgoSEgoOJloiEgoSCgn+AjJWCgoGChIOBgYGCgoODgoGDg4SDg4SEg4OCg4KDg4ODg4KCgoKCgoGDhISEhYSFhYWFhIWEhIWFhYWDg4OEhISEhYWFhISEhISEg4ODg4OOlZKQkZGPjYyHhYODg4GBgoKCgoKBgYCBgoOCgYCCgYGBgICAgIGBgYCAgICBgICDhYSEhIODg4SDhIOGh4mIhoWDhIODg4WDgYCDgoWFhISDg4OChI6YioOFhISEgoCSmoaCgoKEg4OCg4GBhIWEg4ODgoKDhISDg4ODg4SFhISDg4KCgoKCgoSEhYSFhYWFhYODhYWFhYaFhoWEhIWEhYWGhYWFhIWEhISDhIODhJGUk5KSj4yMioWEhIODgYGCg4KCgoKBgYGCg4KBgYKBgYGBgICBgIGBgH+AgIGAgYaGhoaGhoaHh4aGhYSDhYaCgIGBgYGHgoB+f4GBj4yDgX9+fXx9jJyNgIKBgYKChZSTjIGCgYKDg4GBgYKDhYODg4KDg4OEgoKEhIOEhIWEg4OCgoKCgYKCg4ODg4SFhYWFhIOEhYWGhYWEhISEhIOEhIWFhYWFhIODhIOEg4KGlJSSlJKPjYyIg4SEg4KBgoODgoKDg4GBgoKBgoKCgYGCgYGBgYCAgYGAgICAgICAhYWFhYaGh4aGhoWGg4ODg4GAgoKCgYKAf35/f4GVl4mAfX19fXuBl4yAg4GBgYCPk4yQgYKBgoKBgYKDgoODgoOCgoKCg4OBg4SDg4ODg4OEhIKCgoKDgoKDg4ODhIWEhISEg4OEhIODg4OEhIODg4ODg4SDg4ODg4KDg4KDgouUk5KTko2NioaDhIOEgYGCg4ODg4ODgoGBgoGCgoKCgoKBgYGBgICBgYCAf4CAgICDhISFhYSFhYWEhIWCg4KDgoKDg4OBgICAgICAgJWfin5+gH2Hi36EhIOEgoODgo6JhYyCgoOCgoKCg4ODgoODg4KCgoODgoKDg4KCg4KDg4WEg4ODg4SDg4SEhISEhYWEhIWEg4SEg4OEhISEhISEg4SEhYSDg4SEhIODgoKDkJSSkpKPi4yIhoSFg4OBgYKDg4ODg4OCgYGCgoKCgoKDgoCBgoGAgICAgIB/gICAgISDhYWEhYWFhYSFhYOEhIWDg4SEhIKCgoOCgoSBkaGKf4yFfYaJgH6FhYWEhYJ/fn19f4KEg4ODg4OEg4ODhISEg4OEhISEg4SEhIOEg4OFhoWFhYSFhYWFhYSFhoWGhoWFhYWFhYWFhYWGhoWGhoaFhoaGh4aFhYWFg4SEhIeTk5ORkoyKiIWGhYWCgoGBgoODg4OCg4KBgYKDg4ODgoKBgIGAgICAgICAgH+AgICAhYWFhYWGh4eGhYWFhISFhYSEhISEg4ODg4OEhYOJkYOEi4WCgYF+fYGHhoOAfn5/f39+f4OEg4OEhISEhISEhISEhISFhYWEhYSGhYWFhYaGhoWGhYWGhYWHhoaGhoaFhIWFhYWFhIWGhoaHhoaGhoaHh4iIiIaFhYaEhYWGjZSTkpGQi4qHhoeGhIGCgYKDg4ODg4KDgoGBgoODg4KAgYGBgICAgICAgICAf4CAgICHh4eGhoeHiIeHhoaEg4ODhIODg4OEg4ODg4OEhISEgYKCgYmBf359foWBf39/f39/f36AgISFhIWGhoaFhYWGhoeHhoaFhoWFhoeHh4iGh4eGhoaHh4eGhoeHhoaGhYSDhIWFhYSFhYaGhoeHhoaGhoeHh4eIiIeGhoaHh4eRlJORkZCLiYiFhoSDgoKBgoODg4ODgoKDgoKCgoOCgYCBgICBgICAgIGAgIB/gICAf4aHiIeHh4eIiYmIiIODgoKDgoSEhIWEg4KCg4SEhIOBgICAhIR/fn5/gH9/f39/gIB/f4B/f4WFhoiIiIeHh4eIh4iHiIiIhoaHiImJiYmIh4aHh4eJiIaHh4eHhoeFhIOEhYaFhYWFhoaGh4eFhoeGh4aGh4eHh4eHh4eFh5OTkY+RkIuHhoWFhIKCgYGCg4ODg4ODgoKCgoGCg4KCgIGBgYCAgICAgICAf3+AgYB/hoiIiIiHh4iJiYmIg4KCg4ODhIWHh4aFg4OFhISDg4GAgIGMiYGAgYKCgYGBgYB/gH9/fnt6gIaHiIqKiYmJiImJiYmKi4qIiIiJiYuLioqIh4eIiImHh4iIh4iGh4aEg4OFh4eHhoWFhISDhYWEhYWGhISEhYWFhoWGhYOJlJOQj5GOioaFhoWDgYGCgoKDg4ODgoKCgoKCgoKCgYGBgYGBgYCAgICAgIB/gICBgH+GiYiIiYeIiImJiIiEgoKDg4KDhImKh4aEhIWEg4OCgICAhISCgoKCgoKCgH9+fX19fX5+fHt8g4eJi4uKiomIiIqJiImLiomJiIiIioqJi4mHhoaGh4WGiIiJiIaGh4SDgoSIiIiIh4WCgoGDg4KDg4SCgYKDgoGEg4SDgY6TkpCPj4uJhYWGhIKBgYGBgoODg4OCgoKCgoKCgoGBgYGBgIGAgICAgICAgH+AgIGAf4WIh4eHhoeIiIiHh4SCg4OCgoOFiYqJh4WHhYSFhYKAgYOEgoOCgoKDgX59fX5+fn5+fn1+fX19g4eJioqHh4WGh4eHh4iHh4mHh4aIh4aJiYODhIOFhISFhYeIiIaFg4KCg4WHhoeGhoSCgoOEgoOEhIKBgoGBgYODhIOEkZKQjo+Oi4eEhoaEgoGAgYGDg4ODg4KCgoKCgoKCgYGBgIGBgYCAgIB/gIGAf39/gIB/hYaGhYaGhoeHiIeGgYKEhIOChYeIi4qGhIaEgoaGgoKEhIODg4OCgoF9fH1/gH9+fn59fH19fHl8g4aGhoSDgYKDhIWFhYODhYSEhISEhIWEgoKCgoSEgYKDg4WGhYSCgYGCgoODhYSEhIWEhIaEg4SFg4KDgYKDg4SFhIeSkY+Nj4yJhYSFhIWCgYCBgYODg4ODgoKCgoKCgoKBgYGBgYGAgICAf4CAgYB/gICAgICDhIWEhIWFh4eHh4aAgYGFg4OEhYSHiIWCgICAgX9/gIODg4ODgoKAfX1/gICBf31+fn19fX17enp+hISEgoGBgIGBgoKBf36BgYGCgYOBgoGCgoKBg4OAf4CAgYKCgICAgICBgYGDgYGChIODhYSCg4SDgoKBgoSDhYWGi5ORj4+Pi4iFhYODhIGAgYGBgoODg4KCgoKCgoKCgoGBgYCBgYCBgH9/gIGBgICAgH+AgIKCg4OChIOEhYWGhn+BfoCBgICAf4GDgn9+fn5+fX+Cg4OCg4KDgn19fn+AgIGAfn19fX1+fXx6enqAgoKBf39/f35/gIB+fYB/foCAgX+AgIF/f4CAgX59fX+AgX9/fn+AgICAgICAf4CCf4CCgYGDgYGAgYGBgYKEg4aPkpCOj42Kh4eGg4ODgYGBgYGCg4ODgoKCgoKCgoOCgYGCgYGBgICAgH+AgICAgICAf39/gYKDhIGCgoOCg4SFgIB/fH19fn19foCAf31/fn1+gIODg4KCgYF/fX1+f4CAgH9+fX19fHt7e3p6enqAgH9/f39+fnx/f35/gH9+f3+Af4GAf359fn9/fn18fn+Afn5+f3+Af39/f4B/f39+f4CBf4B+f39/gH9+f4B/hZKSj46Pi4uHiYWEg4KBgYGBgYKDg4ODg4OCgoKDg4KAgYKBgYGAgICAf3+AgIB/gIF/f36BgYSEgYKBg4OCg4OBgH98fn9+fX6Af4B/foF/f4CBhIOCgYB/f359fn5/gICAfn19fXx7e3x6enl5eXuAgH+AgH9/fn5/foCAf35/f4B/goB/fH5+f35+fXx/f4B/fn5/f4B/f35/f4CAfn2Af39+f35/f35+fn19fX2Fk5KOjIuKiImIhISEgoKCgYGBgoOCgoOCgoODg4ODgYCBgYGBgYCAf39/f4CAgICAgIB/foCBhIOCgYGDhISDhICBgICBgIGAgYKCgoGBgoCBg4ODgYGBgYCAfn19fn5+f359fX19fXx8fHt6eXl5eH2BgICBgYF/f4B/f4F/gICAgYGCgoB+gH5/fn5/foGAgYF/f39/gICAf39/gYB+f3+Afn9/fn+Af31+fn17fIaTkYyLioeHioiGhoSDgoGBgYGCg4ODg4OCg4OCgoKBgICBgYGAgH9/f39/gICAgICAgH9+fn+BgYGAgISGh4aHgoODhYOBg4ODhYSEhISEg4ODhIKCgoKCgX9+fX19fn6AfX19fX19fX19e3p6eXl5eYCCgoKEg4CCg4GAgoCCgYGDgoODgYGCgIGAf4CBg4GEgoCAgYCBgYCAgYCCgn+BgIF/gIB/gICAfn9/fnx8ipSQiomIiIiJiIaGhoSCgoGBgoKDg4ODg4KDg4KCgYCAgICBgYGAf39/f4CAgICAgIGBf359fn5/f39+g4aHh4iChoSFg4SFhIWGhYaGhoWGhYGBg4ODgoKAfX19fX19fn59fX19fX18fX18e3l5eXh4fIKDhIWCgYSDgoKDhYeCg4SDgYKCg4OCgoKCgYKFg4iFgoGCgYKDgYGBgYSDgoOCgYKCgICBgIF/gIGAf36Ok4yHiIaIh4aGhYaGhIKDgoGCgoODg4ODg4OCgYGBgH+AgYCBgYB/gH9/gICBgH+AgYB/fn19fX5+f36Ag4SHh4SGhoaFhoaHh4aHh4iHh4eGf32AgICCgX59fX19fX19fX19fX18fH5+fnx7eXh3eHl5gIODf4ONhIOEhISXl4ODhIF9foGCgoGBgYKBg4aIjIWDgoKBhIKEg4KDhYSEhYODg4OCg4OCgoKCg4OCgpGQi4iIh4mHhoaEhoWFhISDgYKCg4ODg4ODgoGBgYCAgICBgIGBgH9/fn+AgICAf4CAgH9/fn1+fn+Bf4CCgYWFhYeGh4eGh4eIhoeHh4eGh4V+fX18fX9+fX19fX19fX19fX19fXx7iJKCe3x6fIZ5eXl8gYF+iJaEg4OEhJSTgIGBf39/fn6Fi4B/gICEhpCJhYSCgoGFhYuDgYKFhYaGhIOFhIOEhIODhIOEhISIko+MiYiIiYeHh4WGhYSFhIKBgoKDg4ODg4OCgYGBgYB/gIGAgICAf39/f4CAgICAgYGBf39/f4CAgIGBgYGBg4OGh4aGh4aGiIeGhoaFhIOFhH59fHx8fX18fH19fX19fX19fX18fH+RlZaDe3qElHx5enp7fH+Bg4GCgYOCgH59fn57iJF8fI6Wf31/f4KGioWDg4SDgYONiX9+f4OEhYWDhYWFhIWFg4SFhYaEhI6Rj4yKioyJiImHhYWFg4ODgYGCgoKDhIODgoGBgICBgICAgYGAgIB/f3+AgIB/gICAgX5+f4GBgoKCgoODgoOCgoWGhISFhYSGhIOEg4KBgIKAfn19fHx9fXx8fH18fH18fX19fHx8e4uRl4x6e3yBenl6e3x5eX19foB/gH98e3t+fn2ClZF/hIh9fH5/goR8fIGChIKAf4eDfYKBf4KCgIODhISEhISChIOEhYGEkZGOi4yMjoqJiYWFhYODg4KBgoODgoKDg4KCgYGAgIGAgICAgICAgH+Af3+Af357gICBenyAgYKDhYODhYWFhYODg4SCgYKDgoOCgoGBgIB/gX5+fX19fHx8fHx8fHx8fHx8fHx9fHx8fn6Kgnt6e3p4ent7fH17fn1+f319fX19fH+BgH2Gj4F+fYJ+f36Agnx8gH+CgIKAfnx7ioJ9gH9+gYCAgYKBgoCAgIGAf4uUkIyMjo6NiIiHhYWFhIOCgoKCg4OCgoODgYGBgICAgICAgH9+fXx7fHx9f3+AgHx6gYF4e4CCgYOFhIOFhIaGhISAhpSIgIKBgYGBgH9/f39/fn5+gHx8fHx8fHx8fHx8fHx9fHx8fHx9fHl6e3t4eHl7e3p8goCBfn+AfH5+f359gIKCgICAgX+CkYF/f4CAfoB+fn9+gIGBfX19e319fXx9fHx9gH+AgH6Afn6ClJKNjI2Oj4qFhoaFhISFg4KDgoODg4OCgoGBgYGAgICBgICAf4CAf39/fXt6fICAgHh+gXd7gIF/goKCgoKEhoeGhn6IlYp+gYGAgIB/foB+f39/fn+Bfnx7e3x8fHx8fHx8fH59fHt9fHx8e3x8fHp6eXt8en2Fg4N/gYF+f35/gH6FgoF+gH9+foCFhoKAfn6Dhn99fH5/gIGAf39+fX19fX57fH1/f3+AfX9+f4yRjo2Njo2Nh4SGhoWEhIODg4OCg4ODg4KBgYGBgYCAgYGAgYGBgYGAgH9/f397en9/e3mAd3p/f31/f3+Af4KEhoaFf3+FgX5/gIB/gH5+f31/gIB/f4B/f319fHx9fn18fH19fX19fH58fXx7fXx8ent6fH19f4aEg4CAgX1+fX5/fouEgYd+fXx8f36CgX99fX19gXx7fXx+gYSDgYB+fn5+fXx+f399foB+f36Eko2NjI+NjIqGhIWEhIODg4OCg4KDgoOCgYGBgYGAgYGBgYB/fXx8fH1+f39/f397e399d352eH59fH18fX5+gYGCg4B6fn58fn6Af35/f35/fn+AgH+AgH9/fn9+fn5+fn1+fn99fH59fn19fXt8fHx7e3p9f4CAg4OCf35/fHx8fXx8gYN+jH58e3t9fn1+fn17e3t9fHt7e3uAhoSChIOCf4B+f4KCgn9/goJ/gIuQjY2MjYuKiISEhIODg4ODgoKCgoKCgoKBgYGAgoGBgYKCf3+AgIB/fn18fH5/fn55fX52e3Z4fXx8fHt9fX6BgICAf31/f31+f39/foB/f39/f3+Af4GBgH99gH9/fn9+fn5/f3yCfX59fX17e319fHp8fH6AgoGAgIB9fX18fHx8fH18fnt/fnt7e3x8fH18e3t7e3x8enp9en6CfoKEhIOBgoGFhoWFhoaHhYGEkY+Ni4qLh4eFgoOEhISEg4KCgYGCgoKBgoGBgYGBgoGBgoKAgYKBgYCAgH9+e3x+fnx6fnh5dnd8fHx7e318f4GAf35/foB/f35/f35/gH9/f3+Af39/gYKAfn6BgIB/f39/f39+fYN8fH19fH99fX19e3x+fn9/fn5/fnx8fXx8fXx9fnt8e3x8fHx9fH18fnx9fHt7e3x5e3x7e316fX5+f4CAg4eJiYmKiYqJhYiSj4yJioeFhYOCgoOEhIOCgoKBgYKBgYKBgYGBgYKCgoGCgoCAgX98e3p6eXt9enx+fnl8eXh4dHx8fHt8fHx+gH9/f39/gIB/fn5+fYCAgH9/f3+Af4CDgoB/gIGAgIB/f4CAgH58enx9fX59fX5+jIZ9fX57e4ODfX5+fX18fX19fX19fH18fXx9fX58fn19fX18e3t6fHt8fHt6e3t6enp7fn6DhYiHiIqLi4uJjJGQjoqIhoWEgoKCgoODg4OBgYGBgYGBgYGBgYGCgoOCgYKBgIGBf3+Af356eHl5en5+e3l6eH5zfHx8e3x8fH5+fn5/gH+AgIB/fn9+gIF/f4B/gIGAgoSEgYCAgYGAgX+AgYKBf39+f31+gH57foGSjHx9f4qAjYx+fn19fX5+fX59fHx8fn18fXx9fX1+fX1+fnx7e3t8fH18e3p7e3l6eXl5e35/g4OEh4mKiImOkI6MiYmFhISCgYKCgoKCgoGCgoKBgYGCgYKCgoGCgoKBgoKAgYGAfoCAf39+e3p5e319eHx6f3KBfXt7fXx8fn59fYGCf4GBgX9/gH+AgX+AgIGCgYGFg4SCgYGCgYKCgICBg4KAf4F/fX6Afnx/f4mCf36DkYSEg4F/fn18jYd9fX59fXx+fnx9fXx9fX5+fX5/fX19e3x9fnx8e3x9enp5eXl5e3t+foCBg4eEiI+Oi4uHhYSEg4KBgoKCgoGBgYGCgoKBgoKCgoKCgoKCgoGCgn+AgIB+f39/fn5/ent5fX16enp9cX6Cent9fX19fXp4f4KAgYKCgICBgIGBgICBgoKCgoaFhIKBgYGBg4F/gIKEgX9+gYB9foF+fX5/gIB9fn+EgH5+f31+fX2KhX1+f31+foB+fX18fH5+fn99f4B9fX18fX9/fHx7fH17e3t6enp7e3x9fX2Ag4CJjouMiIWFhYSDgoKCgoKCgYGBgoKBgoKCgoKCgoGBgoKBgYKCf4CAgH9/f39+fn59eXp6fXx5d3t0e4d8dHd9fn17e3Z2fYCBg4KBgYKCgoKBgYGDg4OChYaEg4GAgICCgX+AgYSBfn6Af35+gH59fn6AgH+Bfn+Af39/gH99f39/f3+Afn9/gH58fX18fn5+foF/gH2CgHx9gIB9e319fXx8fHt8e3t7fHt8fHx9fIqLiYiGhoWFhISDgYKBg4KAgIGCg4KCgoOCgoKCgoGCgoGBg4J/gIGAf39/fn5+fn57enp8fHt2e3R3f352cnt+fnt4dnd8gIGCgoKBgoODg4OCgoSDhIOFhoOCgX9/gIKBgICAg4F+foB/fX+AfX1+foCAf4J/gYGAgICBgH1/f3+AgICAgIB/fnx9fX19fn59g32AfoKAfX6AgX98fn59fX17fH58fXx8fHt8e3t+ioeHhYaIhYSFhIKCgoGDgYCAgoKDgoKCg4ODg4KBgYGBgYGCgH6AgYB/fn5+fn5+fn56e3p9goN9dXF6fHpxen59eXh0dICAgoKCg4KDhYOEg4KDhISEhIWEgYGAgH6Agn9+f36Bf35+f4B9foB9fX1+gH9/gYCBgYCAgIGBfn6Af4GAf4CAgH9+fX19fnx+fn19gYR/gH9+f4GBf31/f319fn1+fn1+fHt8enx7eoCIg4SEhYSEhIWDgYKBgYKBgICCgoOBgoOEg4SDg4KBgYKBgYOAfoCBf35+fn5+fX5+fnt7en6Jh354cnl9f3F6eHt4eXV1fYKDgYODg4OFhIWDg4OEg4OEhIOBgH+Af4CBfn19fn9+fn5+gH19f3x9fX6Af4CAgIKAgIGAg4KAf4B+gIF+gIGAgH9+fn5+fn1/fn6FhYGBgH+Ag4F/foGAf35/f4B/fn17ent6fHt6goWAg4KCgoKCg4GBgYCAgoGAgIKCg4KBg4SDhIKEgoGBgoGCgn9+gIF/fn1+fn5+fX59fXp7fIWEe3tzeXp8cHd1dnd5dXR6hISBhISDhIWFhoSDg4SEgoODgoCBf39/f4B9fX1+f31+f39/fn1+fH19foF/f4B/gIB/gICDgoGAf36AgH+AgYCBgH9/f39/f4B/gIGCgoKBf4CDgn9/g4J/f4B/gX+Af3x6fHp8e3yCgH+Cf3+BgIKCgYF/f3+BgH6BgoKDgYGDg4KEgoSCgYGBf4GCgH6AgH9/fX5+fX19fn19e3t6gH94fHZ5eXtxdHh3dnh1cnmFhYKEhIKEhYWGhISChIOBg4GAgIF/f4B/f3x9fX6AfX5/f39+fX98fn5+gX+BgH9+f4B/gYOCg4B/f4GBgIKBgYGAgIGAgIB/gIGAgIKDgYF/gISAfYGChICAgX+BgYKBfXp7e3x8fH9+f4B8f399fYGAgH59fX9/foKBgYKBgIKCgoKBg4KCgYB/gYKAfn9/fn99fX1+fX19fX19ent7fHZ9eXh5enJ1eXl2d3dzdYaFg4WEgoSEhYSEhIGDgoGDgX+AgX5/gH6AfX19foB+f4B+fn99f3x/f3+BgIF/f3x+gH6AgYKDgYCAgYOEgoGAgYB/gYCAgYGAgYGBg4OBgX+Ag4B+goKEgICCgYKChIJ+e3t8fHx8fX1+fXp+fX14fn9/fHx8fn5+gYCBgYCAgoGBgYGDgoGBf4CAgoB9fn19f319fX59fH19fX16e3p8dnx6d3t4cnZ5e3Z2dnN0hoSEhYSChISFg4ODgYOBgYOBgIGBfX+BfoF9fX1/f39/gH5+f359fYB/gIGBgX9+fH5/fn5/gYJ/gYGCg4eFgX9/fn6Af4CAgYGAgIKCgYCAfoCCf3+BgoOBgYOCg4OFg399fX18e3x8eXp7en55e3l4f357fHt+fX1/f4F/gH6BgICAgoOCgYF/gIGBf31+fH1+fX19fX18fn58fXx5e3x4enx3endzeHd6c3Z2c3SGhISGg4KDhISDgoKCg4GCgoGAgYF9gIB+gH1+fX5/gIB/f39/f3x/f3+BgIGAf359f39+fn+BgH2AgIGDg4N/f359fn5/f4CAgX9/gYKBgH9+f4F+f4CCgYCBg4KEhIaEgH5+fHx8fHp5dnl5enl2eXZ+fHt7e359e399gH99fX9/f3+BgoGBgX5/gYF+fX18fX19fX19fXx+jYF8fXl7e3p5fHd4eHR1dXhyd3d0doaEhIWEg4ODg4OCgYKDgoGDgn+Bf35/fn+AfX19fH6AgIB/f39/fIB/f4GAgYCAf3yAf35+fn9/fX5+gYGCgn5/fn1+fn5+f3+Af32AgIB+fn5/gX5+gIKCf4KDgoOEh4SAgH58fXx8e3x1eXl4eHh5d3t8e3t7foV9fn1/ent+fn59foGAgIGAfX6BgH59fXx9fX19fX18e32Dgnx8ent7e3p7d3Z4dXJzdnB4eXJ4hYWFhYOEhIOChIKBgYKBgIKBgIF/fn5+foB+fX58foCAgH+AgIB8gH6AgH+BgIB/fYF/fn5/f359fX6AgYKBfn9+fn59fX5/fn9+fH6Af35+fn+Cfn6AgIF+gYOCg4OGhICBfnx9fHx7fHh3e3h1eXd3eXx6e3t9kod9fH13en1+fn19f35+gH98foB/fn19fH19fX19fHt8ent9enp4e3x6ent4dHh1cXJ0cHh4cXmEhYWFg4SDgoODgoGBgoKAgYGAgIB9fn5/gH18fn1/gIGAgICAgHx/f4B+f4GAf39+gX9+f39+fX18f4CAgIB+f35+f318fn9/f358fYB/fn1+gIJ/foCAf36ChIKCg4WFgoJ+fXx7e3x8eXd8eXd4d3d4e3t7e3yFiX17end6fH19fHx9fX1/fnx9fn59fXx8fX5+fX18fHt6enx7e3p5enp7enhzd3VxcXNveHdxe4WGhYWDhYKBg4OBgoGBgoCBgICBgH5/fn9/fXx+fYCBgoGAgIGBfX6Af35/gX+Af3+BgH9/f319fH1/gICAgH9/f35/fXx+f39/f319f39+fn6CgYF/gIB/foGDgoKEg4SCgn5+fHx6fHt7eXt6d3N2d3h5e3p7eXp/fnt7d3p8fXx8fH59fH19fH19fXx8fX19fX99fXx9e3l7fHx7enp6enp6eHN2dXBwcm93dnJ7hYaEhYOEgoGDgoKBgYGCgYKBgYGAf4B/f399fX9+f4CBgYJ/goF9foF+fn+Bf4B/gIJ/gIB+fH58f3+BgICAf4B/f4B+fX5+f4B/f39/gH9/f4J/gICAgIB/gYGAgISBgoKAf39+f3x9fn56fYV+dHx9enp6enx5eXp6hoV3eXx8fHx8fXt8fHx8fX19fHx9fX19fn19fX16eX18fH16enp6enp5c3V1b29xb3d0c3yFhoOEgoOCgYKBgoKCgYKBgoCCgYCAgICAgH59gH+Af4GCgn+CgX+AgX5/gYB/f4CAgn+Bf319f35/f4KAgICAgIB/gIB+fn1/gH9/gIB/f39/gH+AgICAgH+AgYCBgYGCgYCAf39/fn1/fnuBk416fH18e315e3p6eHqBgXh5e3x8fXx8e3x8fHx9fX18fH18fn1+fn59fHp8fHt8fXt5enp6eXl0dXVvb3Fwd3N0fYWGg4OCg4KAgYCCg4KAgYGCgYKBgYCAgIGAfn6Af4GAgYKCgIKCgICCfoCBgX9/gX+BgIF/fH6Af3+AgoCAgICAf3+AgH9+fX6Afn2AgIB/f3+AgICAgYCAf4CAgYCBgYKCgICAf39/fX5+fIGGiXx8fnt7fnl6e3p7j393d3l7fHt9fHx8fHt9fH19fX18fXx+fn5/f358enx9e3x9e3l6e3p5eXN0dW5zcXB4cnV6hYaDg4KDgoCAgIKCgX+CgYKBgoGBgYKAgYF/fn9/gYGCgYKBg4OAgYJ/gYGBf4CAgIB/gX99f4F/gICBgICAf4B+gICAf359foB+fn+Af39/gH9/gICBf4CBgH+BgIGCgoKAgICAgIB9foB9gIOCe35+e3x9e3p8fHuHenh4eXx8fH17fHx9fX18fH19fn19fX5+f3+Af317fH18fHx7enl7e3l5c3J1bnZycHhxdXaFhYOEg4KCgICBgoF/gIKCgoKDgYGDgoCCgYB/gICCgoKBg4KEhICBgX6BgoF/gICAgH+Cf36AgYCCf4B/gIB/gH+AgIB/fn2Af35/f4CAgH+AgH+AgYF/gICAgIGAgYGBgYGAgYCAgH9/gH5/fX59fn57fXx9e3x8d3h1eHh5e3x8fXx8fHx8fX5/f39/fn19fn9/gIGAf3x9fHx9e3p7eXp8eHpzcnVud3FxenF2d4WFg4SDg4KBgoKDgICCgYSDg4SBgYOBgoOCgYCAgIKDgoCCgoSDf4GAfoKDgICBgICAf4CAf4GBgIKAf4CBgH9/gICAgIB/f4CAgH+AgICAgIB/f4CBgYCAgICAgYGAgoOCgoCCgYGCgYB/f4B/gId+fnx7fXx7fX94d3Z5eXp8fHx8fXt8fH19fn5/gIGAfn1+gICAgoGAfH59fX58d3t6ent5eXNxdW53cHV6cXZ5hYWCg4KDg4KChISAgIOBhoODg4GChICEg4KCgICCgoSBgYKBg4J/gIB/gYOCgYCBgYCAf4GBgYGAg4B/gIOCf35/goGAgH9+gYCBf4CAgYCBgYCAgIKBgYKBgX+BgYGBgoOCgoOBg4OCgYCBgH9/hH19fXx/fXp9f3t5dnp4eXt7fH19e3x9fX19fn+AgYGAgH+AgICDg4B9f35+fn15eXt6enp5c3J0b3dxd3lzd3uFgoKDg4OEgoOEg4CAg4OGg4ODgoKEgYSDgYOAgIKBhIGCgoGCgX6AgICCgYKBgYOCgIGAgICCgoGEgH6Bg4F/f4CDgoCBf4CCg4KAgYKBg4KDgoGBg4KChIGAgYOBgYKEg4KEhIODhIODgYGBgoCCf4B/fYB8enx/e3t3fHl5eXt6fX59fHx8fH1+foCBgYCAgIGBgYSEgH2Af39/f357e3t6e3p0cHhxeXR2eHR3e4SCg4KDg4SChIODgYKDhIaEgoODgoSChIOBg4CBg4KCgoKCgIKAf4GAgIKBgoGCgoKBgIGBgYKCgoOAfoGDgX9/gYSEgYN/goKBg4KCgoGEg4OEgIKEgoOCgoGCgoOBg4SDhISEhISFg4SCgYOCgYOBgYGAgH58fIB9fHh8eXp5enx9f3x7fHx9fX18fICAgICAgYGBgYKBfoGAgICAf3t7e3p6enVweHd5dnV8dXZ8gICDgoODg4OEhISAgoOGhYWDg4KDhIKEhYKCgYKDg4GCgYKAgYB+gYCBgYKDgoKCgoGAgYKCg4KCg4B/gYOCgICChIODgoGCgoGDgoKDg4ODg4SAgoSDg4OBgX+Bg4KDhYKEhISEhISDhISChIOEhIKBgoGBgHt9gX58eXx6enp9fHyBfXp8fH19fHp7fn5+gIB/gYGAgICAgIKBgIB/fX18fX18dnJ2eHh2dH92dX2Hh4OChIWDg4SFhICChYWEhIOCg4SEgYSFg4KCgoODgYOBgoCCgH2AgIGCg4KCgoKEgoCCgoOEgoKBgICBg4KAgYOFhIOCg4CCgoOCg4ODg4OEg4CCg4KEg4KCf4OBgoSEgoODhISEhIOEhIOEg4WEg4ODgoKAe4CBf3x8fXp6fH2AfX9/fHx6fH59fH19fn5/f39/gICAgH9+foCBgICAfnx9fX5/fn18fHh2f3Z3f4SHg4KDhoODhIaEgYKFhoWEhIODhISChIWFgoKDg4SCg4KDgoKBfoCAgoKDgoODg4SDgYKCg4OCg4GCgYGDgn+ChISDg4KEf4KEg4ODgoSDg4SCgIOEg4SDg4KCg4KChIOCg4OEhISEhIWEg4OEhYSFhIOBgoB9gYKAfXx8e3x8gH19foB+fn1/fnx8fH19fn5/fn+BgYGBgH99fX6BgYB+fn19fX59fX5+f3+AfH2AgYKCg4OGg4SDhoSBgoiHhYSDg4SEhYGFhYWDg4SDhIODgoOCg4F+gYGCg4SCg4OEhIOCg4KEg4ODgoKDgYOCf4KDg4ODgoOAgoWDg4ODhIODhIOBgoSEhYODgoODg4GEg4GDg4SEg4SEhYSEhIWFhYWEg4ODf36BhIB9fXx8fHx/gX5/f39/fX99e3x9fX19fX5+f4CBgIGBgH59fH6Cf39+fn5+fX1/f39/gICAf4CEhIODg4WDhIOFf36CiouFhYSDgoOFgYaGhoOEhISEhIODg4OEgn+BgYODhYSFhIWEg4KEhISFhIODgoSDhYKBhISFhYaEgoCDh4SDg4OFhIWFhIGEg4OHgoOCg4GCgYSDgoODhIODhIWEhYWHh4aHhYSEhYSBf4GDf35+fH5+fX+BgH9+fHx/f358enx9fX19fX5+fn9/gIGBf319fIB/gH5+fn5+f3+BgYGBgYKAgYWFhIOEhIKEg4aAgoWFiomEhISEhYWCh4aGhISEhIWEhISEg4SDgYKDg4OEhIaEhYSDg4SEg3yDhHuBhHd5g4F9hH5+cnWDgoF2foOEgH2BdYF5g39/f36EhIKDgoOBg4SDhISFg4SFhoSFhn2EeXx+f4N7hYOBhIOAf31+f31+gYOBfXt/fX6Afn18fHx9fX19fH19f4B/gYJ/fX18f4GBgICAgH+BgYGBgYKDg4KChoSEhIWEgYOEhYOEhYSKiIWFhYOFhYSGhoaDhISFhYWEhYWEhIWCgoOEhYWFhoSFhIOEhYWCaICFanx7cXF8gXOGc3R0fYKDdXNxg4ZzcHVyc3SDdnt9dYF/goOBgnZ5hYCDgIR/hYSChYWCaHpyc3N8gHKBg3+Dg32BfX5/fX6Cg4J8f4F9f4B9fXx8fHx9fHx8fn1+gX+BgX99fX2AgYKBgYGBgIGBgYKBgoKCgoSHhIWEhYSBgoSGhoOFg4aIhoaFg4aGhoeGh4OFhYaFg4KFhoSFhYODg4SEhoaGhIaEg4SFhn1xe4FweXZ+g3+CbnlwdXN8dnl5hnKEg3B2eHF2dHR1cnN0dml/gG5yb3R2bnVsd216c26Ah3ltfXJzdnN2bW53bHB5bHV+f398foGAgX2Af32Af4B/fX18fHx9fH1+f32Af4CAfnx/foCBgYCBgICAgYCAgIKDgoKEhYeGhoCChYODhYeGg4WFhYaHh4SDhoaIiYaHhIWGiIeEg4WGhYWEhIOFhIKFhoaFhoWEhoWHdnB0e3BydX+HhYNtdW92b3x1coR5eYd4cXR3bndod3pucHaCcoN+b3p5eW1vbnpvb2x3fXiGcHF6cHJ0ZoF1fm57eXNveX+Af31+gYB/e39+fIB+gIB+foCAgYB+fn9/foF/gH9+fYB9f4CBgIB+fn+BgH9+goOCgoSFh4eEfoeEg4OFh4aEhoWFhoaIhISGh4iIhoeEhoaLioWEhoeHhYOFhIWEgoWFhYWGhYWGhYZxdXByc29zenl+hHSIdHV+iHZugnKEhnluanJ/cW1zd3x/dXR8hH54cXV3bnl1enF2eHV6eYRyaW95eHBreXN6b3p3dnZwgYB/fn5/f356fn18f31/f359gIGDg4CCg4GBhIKBf4GCgH1/f4F+f35+f4GAfn6BgoCAgoSHhoODhoSFhYaHhoWFhYWGhoiFhYaFh4eFhoSGhomIhYSJi4iGhIaFhoWDhYWEhoaGhoaFg3iLeXKIentwcIWEeIV4eWtzfnl7a3KDh4N6fG16eXl0fYB2bm+AgG90fHV3cXl9fW1+dW+DhYZ6gHJye3x1cG96a3N8bnaCgYF+fn99fXp9e3x9fH9/fn1/f4KCf4GDgYGDgYB/gICAfn9+f31/fn1/gH58fYGAfn6Ag4iFhoOFhYWFhoeFhYWFhYeHiIaEhoWHhoaFhIWFhIWFhomKh4WEhoWGhoWGhoSGhoaGhoWGh4eHhoaEhoWGh4iHhYeGhoOHhoWFg4SFhoWGhIaEg4SEhoSEgYODhIOFhIWEhYSGg4WGhYWEhIWHhoSEhYaFhX13hYOEhIOCgX5/fnt8e357fHx9f399fH9+gYB9f4F/f4GAfn5+gH5+f35+fX99fX5/fHt8f358fH+BiYaFhIaGhoWGhoWFhYWGhoeIhoSGhYeFhYWDhIWGhYSGhoaGhYSGhIWGhoaGhIeGh4eGhYeIiIiIhoSHhYaGiIaFiIeIhYeGhoiFhYaHhYaGhYOChYWGhYWDhYSEhIWEhoWEhYWDhoaFhoWEhoeGhISFhoOFhIKEg4OFg4OBfYB/e3t8fnt8fH1+fnx8fn2Afn1/gH5+gH99fXyAfX5/fn5+f3x8fX57fHx/fHt7fn+Ih4SEiIaGhYeGhYWEhoaGhoiHhIWGh4aFhIODhIaFhIeFhoaFhYaEhYaGh4eFh4aJiIaGiIeIiYiFhYiFhoeGh4aHhoeFh4eGh4WFhoeFhoaFgoOFhoaEhIOEhIOEhoSGhYWFhYOGhoWGhYSGh4WEhIWFg4SHhoOCg4SDhIJ+gYB8e31+e3x7fn59fHx+fX5+fX9+fX1+fnx9fH98fn58fYF/fHx8fXx8fH56e3t8foiHgoWIh4eGhoaGhISGhoeGiIaEhYSHhoSFh4OEhYSFh4SFhoaFhoSGhoeHhoaHh4mIhoaIh4iKiIWHiIWGh4WHhoeGh4WIiIeHhYaGh4WGhoSBhISFhoWFhISEg4SFhIaGhoWGhIaFhoaFhYaGhYSDhISDhIeDhIGChIWDgYCAgHt7fn18fHx+fXx8fH19fH18fn18fX18fHx8fXx+fXt8gX99fH18fnx8fHp6fHx9iIeChoiHhoeGhoaDhYaFhoaGhYOFhIaFhIiJg4GEg4SGhIaGhoaGhIeHiIiHh4eIioiGh4iHiImIhYiHhIaGhoeHh4WHhoiIh4eFh4eHhYaHhIKEg4SGhYeFhISEhISFhoaGhoaFh4WFh4WGhYaFhIOEg4OEh4GDgIKDhIKCgn+Ae31/fXx8fH59fH19fH17fHx7fHx9fXt7e318e359e3x/fX18fX1+fXx6ent7fHyIh4KGhoaGh4aGhYOFhoWFhYWEg4WChoSDiId/enqChYaEhoaFh4aEh4eIiIiHhoiKh4aHh4eIiYeFiIeFh4eGhoeHhYeGiIiHhoWHhoiGhoeDg4SEg4aGh4WFhISEhYaGhoaGhYaHhoaIhoaEhoWDg4ODgoOGgYN+goKDgIOCf398f39+fHx9f318fX18fnt7e3p7fHx8e3t7fnt8fXt6e358fHx8fX5/fXt6fHp8fImHg4aFhoWGhoWEhIWFhYWFhIOBhIGGhIKEhHyAhn+ChYWGhYWGhYSHh4iHiIaFiYqHhYeGh4eIh4WIhYaHiIaGh4eGh4aIiIeFhoeGh4WFiIOEhoWDhoaHhoWEg4WFhoaGhoaFhoaHhoeHhYOFhYOBgoKBg4WCg36BgoF/g4F/fn5/fn98fH1/fXt9fXx+enp7eXt8fXt7e3t+fHx8fHp7fXx8fHx+fYF8e3t7e3x8iYeEhoSGhIaGhYSFhoWEhIOEgoCDgYaDgYJ/eoSMe4CEhYeGhoaEhIeIh4aHhYWHiYeEh4WGhoiGhYeEhoeIhoaIh4eHhoeIhoSGhoaHhYWHg4SFhIaGhoeFhYSDhYWGhoeGhoWGhoaFhoaEg4SFgoGCgYCEg4OCfYGBf36DgX5/f4B8f3x9fX59e319fH15enp5e3x9enp7e318fXx8enp9fHx9fH5+gHt7e3x+fXyIh4WGhYeEhoSFhYWFhYODgYOBgIKBhYJ/gH9/fXx7gYSFhoaEhYSEh4eGhoaFhIaJhoKGhIaGhoWFh4WHiImGhYiHiYeGhoeFhIaFhYeFhIeDhIWEiIaGh4WFhIKFhYaFhoaHhIWGhoWFhoKDg4WAgIGAgIOAg4B8gYB+foKAfYB/gXx/fH1+fX57fn18fHl6enl6fX15enp7fHt8e3t6e319fH18f35+fHt7fX59fIiGhYaGhoSFhYSFhYSDgoKAgoGAgICDgX5+foB5en2Ag4OFh4WEg4OHhoOEhYSChYiFgoSDg4WFhYWHh4aIiIaFiIeJh4aFhYWDhoSFh4OEhoSEhYSHhoWGhYaEgoWFhoaGhoaEhYaGhIWFgoKDhH9+gICAgYCDgHuBf31+gn5+gH6Afn99fX59f3t/fXt6eXp6eXp8fXl6ent7enx7e3t7fH19fXx/fn18fHx/fnx7h4WFhoaGhoSFhIWDhYKBgICAgYB+f4KCfX1/f3t/f4KDg4WGhYSDg4aDgYOEgoCFh4WCg4GBg4SEhYaGh4eHhYWIhomHhYSEhIKFg4SGgoOFhISGhIeGhYWFhoOEhYSFhoWGhISFhIWDhYSAgIKDf35/f39/gIN/fIB9fX+CfYCBfn6Bfn5+fX1/e398e3p5enp5ent8eXp6e3t7fHp7e3t8fX19fYB9fXx8fYB/fXyGg4aGhYaGg4SDhoKFgYGAf3+AgH5/gYJ8fn9/foCAgoKChISDgoGChIGAg4KBgISFhIKBf4CCg4OEhYWHhoaEhYeFh4WGgoOCgoOBgoWBg4WEhYaEhoaHhoaFgoSEg4SGhYWDhIODhIKEhIB/goJ/fX5/fn5/hH57f3x8gIF9gYB9foN9fn59fX57fnt7enl7enl6ent5enp6e3t8enx8fHx+fn1/gXx9fHx9f4B+gIaEhYWEh4SEg4KGgoOAgYB+fn+AfX5/gnx9f39+fn+BgYKEg4KBgYKCf4CBgoCAgoWEgoB/gIGCgYOFhYeFhISGhoOFg4WBgoGBgoGCg4GChISEhYWGh4eGhYWDg4ODhIWFhIGDgYOChIODgH+AgX59fX5+fH6Dfnx+fHyBgH6Cf35/gnx/fn19fHx8e3t6enp6eXt5enp5enp6e3x5e317e35/f4GAfX59fX1/gICAhoSEhYSFgoSCgoSCgoCBgH59fn9+fn6AfX2Af35+foGBgoODgoSHgYF+gICBf3+ChIOBf35/gIJ/goWEhYOCg4WFgoSBg4CBgIGBgYKBgIGEg4OGhYWHh4WEhIWCgoKDhYSCgYGBgYCFg4F/foB/fnx9fn18foN9e358fYF/gIN9fYCBf35/fXx8fH17e3p5enl5e3l6enl6ent7e3p7fXx8f3+BgoB+gH+AgH+AgIDKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzNzc3Nzc3Nzc3NzczMzMvLy8vLy8vLy8vLy8vLzMvLy8vLy8vLy8vLy8vMzMzMzM3Nzc7Oz8/Pz9DQ0NHR0dLS0tLS0tLT09PT0tLS0tLS0tPT09TU1NTU09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tLS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1dXV1NTU1NTT09PT09PT09PT09TU09PU1NTU1NTU1NTU09PT09PS0tLS0tPT09TU1NTU1NPT09LS0tLS0tLR0dHR0dPHhnNlYFtLWWdVTUZIQD03Nzg5Nzw8PDo8Oz42Oj04PDs6OTg3ODs7Oj87PTs8PD47P0E/QkJBQ0RFREE+PTw7QENDQUBDQ0FBR0hHSUtSwtXS09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXVysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMy8vLy8vLy8vLy8vLzMzMy8vLy8vLy8vLy8vLzMzMzc3Nzc3Oz8/P0NDQ0NHR0tLS0tLS09PT09PT09PT09PS09PT09TU1NTU1NTU09PT09PT09PT09PT09PT1NTU1NTU1NTT09PT09LS0tLS0tLT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1NTU1NPT09PT09PT09PU1NPT09TU1NTU1NTU1NPT09PS0tLS0tPT09PU1NTU1NTU09PT09PS0tLS0tLR0dHSzIxyZ2BcTVllUktHSz87Mzc4Ozg5Pj05PDpBOjs9Nzs8PDo6Nzg6Oz0/Oz88PTw/Pj9BPUFBPkNDREJAQT46Oz9DREFDRERCQklHSEhJTr7V0tPT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1crKy8vKysrKysrKy8vLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzMzMzMzMy8vLy8vMzMzMzMzMzMzLy8zMzMzLy8vLzMzMzc3Nzc3Ozs/P0NDQ0NDR0dLS0tLS09PT09PT09PU09PT09PT09TU1NXV1dTU1NTT09PU1NPT09PT09PT1NTU1NTU1NTU1NPT09PS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1tbV1dXV1dTU1NTT09PT09PT09PU1NTU09TU1NTU1NTU1NTT09PT0tLS0tLT09PU1NTU1NTU1NTU09PT09PT0tLS0tHR0s+Sd2hfXk9XZ01LRks9ODc2NTk5OTw+OT88Qzk7PDc5PD07OTc5Ojw9QDs+PT47PD48PT5BQD5EQ0NDP0E9Ojs9QkNFQ0NEQT9FSEpJSky61dPT09TU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8rKysvLy8vLy8vLy8zLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMzMzMzMzMzMzMzMzMzczMzMzMzMzMzMzMzMzMzc3Nzc3Ozs/Pz9DQ0NDQ0dHS0tPT09PT09PT09TU1NTT1NTU1NTU1NTV1dXU1NTU1NPU1NTU09PT09TU1NTU1dTU1NTV1dTU09PT09LS0tLS0tLS09PT09TU1dXV1dbW1dXV1dXV1tbW1tXV1dXV1NTU1NTT09PT09PT1NTU1NTU1NTU1NTU1NTU09PT09LS0tLT09PU1NTU1dXV1dTU1NTT09PT09PT0tLS0dHRmn5nYWJOVWpKSElLPzw6OTM3Njc2PTs+Oj06Ojo4ODo7Ozg4Ojs7PD46PT09Ojw/PD0/QkA/Q0RDRD5APT08QENEQ0JEQkQ+REhJSUtMttfT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3MzMzMzMzMzMzMzMzNzc3NzczMzMzMzMzMzMzMzc3Nzc3Ozs7Pz8/Q0NDQ0NHS0tLT09PT09PT1NTU1NTU1NTU1NTU1NTV1dXV1NTU1NPT1NTU1NTU1NTU1NTU1dXV1NXV1dXV1NTU09PT09PS0tLT09PT09PU1NXV1dbW1tXV1dbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1NTU1NTU1NXU1NTU1NTT09PT09PT09PU1NTU1dXV1dXV1dTU1NTU09PT09PS0tLR0p+DaV9kU1hsSEhIS0A9Nzg0NzY6Oj87RDw8Ojw8OTg6OTo6Ojs8Ojo7OT49Pjk9QDs/QUFCP0JCQUM9Pz8+PEBCRUNDQkBBO0ZJR01MSbLY09TU1NTU1NXV1dXV1dXV1dXW1tbW1tbV1dXW1svLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzM3Nzc3Nzc3Nzc3Ozc3NzczMzMzMzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc3Mzc3Nzs7Ozs7Pz8/P0NDQ0NHS0tLS09PT09PT09TU1NTU1NTU1NTU1NTV1NXV1dTU1NTU1NTU1NTU1NTV1NTU1dXV1dXV1dXV1dTU1NTU1NPT09PT09PT09PU1NXV1dbW1tbW1tbW1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTV1NTU1NXV1dXU1NTU1NTT09PT09PT1NTU1dXV1dXV1dXU1NTU1NTT09PT09LS0tSjiGxfZlJWakdIR0lBPjM2Njo7PDhDPEJBPjtBPDg5Ojw6Ojw8PDk8PTo7PD09PD89QD9AQT9AQUBCPD4+PzxCQ0NDRkBBQT1ISklOTUeu2NPU1NTV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbMzMvLy8rKysvLy8vLy8vLy8vMzMzNzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzs7Ozs7Oz8/P0NDQ0NHR0dLS0tPT09PT09TU1NTU1NTU1NTU1NTU1NTV1dXV1dTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dXU1NTU1NTT0tPU1NTU1NTU1NTV1dbW1tbW1tbW1tbW1tbX19bW1tXV1dXV1dXV1dXV1dTU1NTU1dXV1dXV1dXU1NTU1NTU09PT09PT1NTU1NXV1dXV1dXV1dXV1NTU1NPT09PT0tLWroprY2VSWGhMSkdJQjg0OTQ6Ozo5QDk+Q0U/PDw5OTk9Oj07PDw6PTw7OTw9Ozs/PUA9PT5AQD9CQT5APD05QERDQkFBQj48SEpLTU5IqNnU1NXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbWzMzQ0dDQ0NDQ0dHR0dHR0c3Ky8vLzMzMzMzMzMzMzM3Nzc3Nzc7Ozs3Nzc3Nzc/Pz8/Pz8/Pz8/Pz9DQ0dHR0dHR0dHR0dHS0tHV2djY2NnZ2dra2tvb29vZ2dnZ2dna2tra2tra2tjW19fX19fX19jX19fX19jZ2NjY2NjY2NjZ2dnZ2NfX19fX19fX1tbW1tbW09LT09PT09TU1NTU1NbW1dXV1dXV1dXV1dXW1tbX1tbW1tbV1dXV1dXV1dXV1dTU1dXV1dXV1dXU1NTU1NTU1NTU09PU1NTU1NXV1dXW1dXV1dXV1dTU1NTT09PT09PS1bqKa2hoUlhlSUlMTkA5OTo0O0E8Nz05QUM9QD89ODo6Ozk9Oz4/Ojs8PDo7PDo7Pj1APT8/P0FAQUE/QTw8Oz5BRENBREA9PElJSk1ORqPa09TV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbW1szNloSGhoaGhoeHh4eHh4Ky4t3d3t7e3t7e3t7e3t3S0NDQ0NDQ0NDQ0NDQ0ci5ubm5ubm5ubm5ubq6t6WkpKSkpKSkpKSkpKSnhmBjY2NjY2NjY2NkZGRlhIuKioqKioqKioqKioemuri4uLi4uLi4uLi4uLepp6enp6enp6enp6enprG+vb29vb29vby8vLy7v9LS0tLS0tLT09PS09PT3OPi4uLi4uLi4uLj4+Pi2NfX1tbW1tbW1tbV1dXV1dXV1dXV1dbW1dXV1dXV1dTU1NTU1NTU1NTV1dXV1dXW1dXV1dXV1dXV1NTU1NTT09PT09XDkXFrak5TYkxMVk08Ojo3Nz5DPjg+Oj8/QTw/QDc7Ojs7PTs+Pjo7PD48Oz07PT8+QDw/Pz1AQEBBPj88PjxAQUVCQkZAQD9HSEpLT0ae2tXV1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19fMzm5QU1NTU1NUVFRUVFNMoPPr6+rq6urq6urq6uvp1dLS0tLS0tLS0tLS0tTEqaqqqqqqqqqqqqqqq6aGhIWFhYWFhYWFhYWFik4MEhISEhISEhISEhIRE0pUU1NTU1NTU1NTU1NPg6ejo6Ojo6Ojo6Ojo6OghoSEhISEhISEhISEhIKVrKqqqqqqqqqpqampqLDS0tLS0tLS0tLS0tLS0eDs6+vr6+vr6+vr6+vr6dnX19fX1tbW1tbW1tbW1dXV1dXV1dbW1tbV1dXV1dXV1dXV1dTU1NTV1dXV1dXW1tXV1dXV1dXV1dXU1NTU1NTU1NPUy5h2bGlKTl9NUlVNPjw8Nzs/Qz42Ojc+Pzs8QkA4PDk9Ozw6PD07PTs9Ozs9PD0+PT07QT08QUBBQT08Pzw7QEJDQURFPUFAQ0ZLS09GmNzV1dXV1dbW1tbW1tbW1tbW1tfX19fX19fX19fXzM5xVFhXV1dYWFhYWFhXUKHx6enp6enp6enq6unq6dXS0tLS0tLS0tLS0tLUxaqrq6urq6urq6urq6yoiIeHh4eHh4eHh4eHh41SEhgYGBgYGBgYGBgYFxpOWVdXV1dXV1dXV1dXU4WopKSkpKSkpKSkpKSloomHh4eHh4eHh4eHh4eFl62rq6urq6urq6qqqqmy0tLS0tLS0tLS0tLS0tHf6+rq6urq6urq6urq6unZ19jX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dXV1dXV1dXU1NTU1NTU1NGcenFpSlRdT1JVTkQ+Pzs/QEA4Ojs4PDw8PD46Ojs4Ozk5Ozw7Ojw5Ozs8Ozo9PT0+PUE/Pj8/Pj08PT88PEFBQ0FERTw+QEVGSktNRpPc1dXV1tbW1tbW1tbW1tbW1tfX19fX19fX19fX183OeF5hYGBgYGFhYWFgYFqk7ufn5+fn5+fn5+fn5+bV0dLS0tLS0tLS0tLS08Wtrq6urq6urq6urq6vq46NjY2NjY2NjY2NjY2SXSInJycnJycoKCgoKCcpWmNiYWJhYmJiYmJiYl6MrKmpqampqampqampqaeQjo6Ojo6NjY2NjY2Ni5yxr6+vr6+vr6+vr6+uttLS0tLS0tLS0tLS0tLS3+np6enp6enp6enp6enn2djY2NjY19fX19fX19fX19fX19bW1tfX19fW1tbW1tbV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbV1dXV1dXU1NTU1NTWo3txZElbYE5OVU9AQT89REI+Oz06OTs6PTw7PDs6OTg5OTs8Ozw8Ojo7PDo7QD08PTxAQTxBQTs7PEA/PD1CP0RDQ0U8PkJERkpMTEWN3NXV1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjNzcfFxcXFxcXFxcXFxcXEy9DPz8/Pz8/Pz9DQ0NDQz87Ozs7Ozs7Ozs/Oz8/NzMzMzMzMzMzMzMzMzMvJycrKysrKysrKysrKysfCw8PExMTExcXFxsbGxsvMy8zLzMzNzMzMzMzLz9HR0tLS0tLS0tLS0tLS0NDQ0NDPz8/Pz8/Pz87Q09LS0tLS0tLS0tLT09LV1NTV1dXV1dXW1dbW1tjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NfX19fX19fX1tfX19fX19bW1tbW1tbW1tXV1dXV1dXV1dbV1dbW1tbW1tbW1tXV1dXV1dTU1NTU169/cF5GXmJQUVdOR0ZDQ0lBPz07PDo8N0BBPD04Ojo4OTg7Pzs8PDs7PDw8PD87PD46Pj44PkI8Pj1BPjw+QkBERUNAPD5APkNJSUtEh9zV1tbW1tbW1tbW1tbX19fX19fX19jY2NjY2NjYzs3Pz8/Pz8/Pz8/Pz9PPz87MzczP09LSzs3P0s7Ozs7Ozs7O0dTPz9HU1NPOztPTz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0NDR0dHR0dHS09PU1NTU1dXV1tbW1tfW1tbX1tfX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXW1tbW1tbW1tbW19bW1tbW1tbX19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjX19fX19jY19fX1tbW1tbW1tbW1tbW1tbW1dbW1dbW1tbW1tbW1tbW1tXV1dXV1NTV1di4gm9XSl9jUlFaS0hBQTxCPT07Oj4+PD4/PT0/ODk6OTk3OD48PD47Ozw7PDs/PT0+OTs7OT0+P0A+QD07OkI/QkNCPz0+QD5CRUdKQoDc1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2M7Ozs7Ozs7Nzc3Nzsqfys3Nzc3QuYOEi8fTwJrLz87Ozs7O07udz9Ktg4OVz9KkodDOzs7Ozs7Ozs7Ozs7Oz8/Pz8/P0NDQ0NDQ0NDR0dHR0tLT09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbV1dXV1dbW1tbV1dXV1dXV1NTU1NXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NfX19fX1tbW1tbW1tbW1tbW1tXV1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXYwIBuVU9gY1dZW0xMQ0A9PTs9Ojw9Qj5CQkA8Ojg5ODo6Ojc7Pz4/PDw7PDo5Pzw8PTg5PD9BPj09PUFAPTtBQkBCQz47QD9BQUlHSkF629bW1tbW1tbX19fX19fX19jY2NjY2NnZ2djY2dnOzs7Ozs7Ozs7OzdKpj63Rzs7Ozpu3tqSiwJOerNPOzs7O0rWVm7XKmry4mbWzn6Gp0s7Ozs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0dHS0tLT09TU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dbW1tbW1tXV1dXV1dXU1dXV1dXV1dXW1tbW1tbW1tbW1tfX19fX19jX19fY2NjY2NjY2djY2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2dnY2NjZ2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV18h/b1pTYWVeXVxPSkQ9QD8+PDc6Pjk/RD5AOTg3ODk7Ozw4OT89PTw9PD47OkE7OTs5OzxDQDw7PT5AQT49QkQ/QkM9PT8+Pz5ISUg/ddrW1tbX19fX19fX19fX2NjY2NjZ2dnZ2dnZ2dnZzs7Ozs7Ozs7Ozs/Inrym0tDQzsqgl36Cw6abr6fUz8/Pz9GfoKqwxKKMgI3FnZeVnMjQzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dLS0tPT09TU1dXV1dXV1dXV1dXV1dbV1dXV1dXV1tbW1tbW1tbV1dXV1dXW1tbV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2djY2NjY2NnZ2dnZ2dnY2NjY2NfX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dbV1dXV1dfNiHNdWGloXl9gT0lGOkFAPj88PDk2P0I/Qjo2NDc6Ozo8Ojk+PD49PTs/PTxBPjw8Ojw8PTw6PEA9QEI+PkFCPUNDPT0+Oz9BRUtIQHDZ1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2c/Pz8/Pz87Ozs7SrKWnqdXAvNLHnY+ey9PJipmq1M/Pz8/RxYeas8CeiKzWupehnbCy08/Pz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0dHS0tLS09PT1NTU1dXV1dXV1dbW1tbW1dbW1tbW1tbV1tbW1tbW1tbW1dXV1dXV1dXW1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnY2NjY19fX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0JB1W1tqaWFeXVNOSTxDQEE+QD46OEVAP0M6NzQ5Ojo5Ozs4Oz0/Pj49QT08P0A9Pjw8PDw8Oj1AQD8/PT5CQD9AQkA8QD0+QUVLRz9r19fX19fX19fX2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnPz8/Pz8/Pz8/QzJ2Nl6zQmpfKxZ6ynpbN1q2ZqtTPz8/Pz9anmbW7p6ubpbKZlq+zqtXQ0M/Pz8/Pz8/Pz8/Pz8/P0NDQ0dHS0tLT09PT1NTU1NXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX19fX19fY19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tKUcl5ea2tqZV1PTEc/RENDQDo9OzxCPD09OTY0Ojk5Ojo5Nzs/QDs8PUA8PEE+PD07PTw/PDo8Q0A+PTs9QD5CPkBBPkA9QD9GSUQ/ZtXX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2traz8/Pz8/Pz8/P07GigJuvyaCjv8qcpYynrdiqmarUz8/Pz8/VpZm0waCdlqeQmoSdk6TV0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1NXV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dbW1tXW1tbW1tbV1tbW1tbX19fX19fX19fX19fX2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbSk3BgXnBoZmVaUUhHQkVDQEA3Ojo8Pjo8OTc2NTk6Njo8Ozc8QEA8Ojo9Ojw/Pj08OUA8PDo6OT9APT08PUBBQz9APz5BOz9ARkpCP2LS2NfX2NjY2NjY2NjY2dnZ2dnZ2tra29vb29vb28/Pz8/Pz8/P0M6fkGyclteqo9PSrqa1mJ/Vqpmq1M/Q0NDQ1qWZstajtKuff6CphZmk1dHR0NDQ0dHQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1dXV1dbW1tbX19bW1tbW1tbW1tbX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfW1tfX19jY2NfX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX1tbW1tbW1tbW1tbW1tbX19fX19fW1tbW1tbX0pNuYFxxZGdkWlVKQENGQ0FBODs/PD07PDw3NTU4OTY4Ozo5PDo+Pzw9PTk8Pz49Ojo+OTw6Ojg+Pzw9PTw+QEFDQT48PDpCRERKRkJd0NnX19jY2NjY2NjY2dnZ2dna2trb29vb29vb29vPz8/Pz8/Pz9G9n8O31pfA09HQ0srSzZeb1KqZq9XRz9DQ0NWlmrPWydjBnIC8raaYr9bR0dHR0dHR0dHR0NDR0dHR0dHR0tLT09PU1NTV1dXV1tbW1tfX19fX19bW1tbW1tfX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19fY2NjY2NjY2NjY2NjY2djZ2dnZ2dnZ2dnZ2dnZ2drZ2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fX19fX19fW1tfX1tbX19fX19fX19fX19bW19GRbF1cb2doYl1PRj9ISEdFQDw8Pj48PT08NzU2Ojk2OTs6Ojs4QD86PDw5PD49Ozs6Pzk/Ojs5PT49Pjw7PTxAQ0I/Pz47Q0ZGR0hEWc3a2NjY2NjZ2dnZ2dnZ2dna2trb29vb29vb29vb0NDQz8/Pz8/Pz5V+e6WS1KKa08ySl6ObodirmavV0pem09DVpZm0yY2hn5+ZqJaYm7vV0dHR0dHR0dHR0dHR0dHR0tLS0tLS09PU1NTV1dXV1tbW19fX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tbX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2tnZ2dnZ2dnZ2djY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX1tfPjGRWXnBrXGBgTkVITUlJT0M+OkI9PUBDOzU1Nzw6Nzo7Ojo7OT09OTo6OT0+Pz07OT47PDo8Ozk+PD47PD0+QENCPz5BPEFDR0ZGRVXJ29jY2NnZ2dnZ2dnZ2dra2tvb29vb29zc3Nzc3NDQ0NDQ0M/Pz9DR1aeZrcmjqL7KnbGdo7XZqZup2LirocfS1qOas8KkqqOhw6CrpJzR09LS0tLS0tLS0tLR0dHS0tLT0tPT09PU1NTV1dbW1tbX19fX19fX19fX19fX19fX19fX19bW1tbW1tfX19fX19fW1tbW1tbW1tbX19fW1tbW1tbW1tbX19fX2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2djY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fX19fX19fX19fY2NfX19fX19fYzYZdV2JvZE9dVEtIRlNRS0xAPj1EPD9DRj01NTc7OTY6Ozo8PTo7Pzo6OTg6PT0/Pjs/Oz49Ojs5Pjs9PD0+QURCQD8+PzxAQUVHRURSxdvY2dnZ2dnZ2dnZ2tra2tvb29vb3Nzc3Nzc3NzQ0NDQ0NDQ0NDQ0NO5gL3Tm5bP1LWLkZ/T1LyBu9TOlKDT0dW1gsPYqY+QrNfCj4281dLS0tLS0tLS0tLS0tLS0tLT09PT09PU1NXV1dbW1tfX19fX19fY2NjY19fX19fX19fX19fX19fW1tbX19fX19fW1tbW1tbW1tbW19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2tnZ2tra2tra2tra29ra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2NfX2ct+WlVqaltMX01KTEpVTEZCPDw/R0VHS0g9NjU3Ojk3OTo7Ojw9OT45OTo4Oz0+PkE+PTk8PDo9Pj46PTk5Oj9FQUA+PT8/QkBHRURFUMHc2dnZ2dnZ2dna2trb29vb29vb3Nzc3Nzc3dzc0NDQ0NDQ0NDQ0NDQ0cHR0crI0tDUxLjS0tHSwtLQ08fM0tHR0cLU0tXBv9bS1cXE1dLS0tLS09PT09PT09LS0tPT09PU1NTU1NXV1dbW1tfX19fX19fX2NjY2NjX19fX2NfX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29va2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2djY2NjX19fX19fY2NjY2NjY2NjY2NjY19rHd1xSZ2laTlpOTFBRV0VKPz89P0FFTExBPjc3NTs4ODk5Ojs8Pjw+ODo6OTs+P0A9Pj46NTo6Oz0/Ojs5Ojw+QkJAPz8/P0FCR0RDRE683dnZ2dnZ2dna2tvb29vb29vb3Nzc3Nzc3d3d3dDR0dDQ0NDQ0NDQ0NDS0NDR0dDQ0dPU0dHR0dPR0dHS0tHR0tLU0tLS1NXT09PU1NLS0tPT09PT09PT09PT09PT09PU1NTU1dXV1dbW1tfX19fX2NjY2NjY2NjY2NfX19jY19fX19fX19fX19fX19fX19fX1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tvb2tra2tra2trZ2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2trZ2tra29ra2trZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjbwXNYVWlrU0xSTlBSWVRGSTw+Qz9BQkVKPT43ODY5Nzc4OTk7Oz0/QDw9ODk7Ozs/Pjw8OTU6PT47OTk7PD8/P0JCQT1BPUBBQkZCQkJLtd7Z2dra2tra2tvb29vb29vc3Nzc3Nzd3d3d3d3R0dHR0dHR0dHR0dDQ0NDQ0NDQ0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tPT09PT09PT09PT09PT09TU1NPT1NTU1NTU1NXV1dXV1dXW1tbX19fX2NjY2NjY2NjY2NjY19fY2NjX19fX19fX19fX19fX19fX19fX19fW1tbX19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2NjY2NjY3LxvVFRsbExLUkpUUlVLRkQ6PkdEREFERjw/ODk6OTY5OTo3PD07PkA9PTc5Ojs5Pjs5OTY2Oj1AQT47PDk6Pj9DQT4/Qj0+QkNFQkFCSrDe2dra2tvb29vb29vb29vc3Nzc3Nzd3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0tLS0tLS0tLS0tLS0tLS0tPT09PT09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1tbW1tbW19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19fW1tbW1tfW19fX19jY2NjY2NjZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2dnZ2dnY2Ny2a1NbcGtLVVdSXFFXSEQ+PEJKRT1ISj89PDc4ODo2OTg5Njs+PD1APDw1OTk8Oj87OTk0ODw9PUFBPD47Ojw+QD89PkE9PUNGR0I/Qkmq39ra29vb29vb29vb3Nzc3Nzc3N3d3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHS0M/U0M7P0tLT0tLS0tLS0tLS0tPT09TU1NTU1NTU1NTU1NTU1NTU1NTU1NTV1dXV1dXV1dbW1tbW19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19jY2NfX19fX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dndsGRTYXJfT1pUV19RUkdCPUVJS0FBTEQ/Pzs5ODg5Mzg2ODY5Pj0+Pz06Njo7Pjs9PTo5Njg6PTtAQDxAPz0/P0I+PD48PEJFSElCPkNJpODa29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3t7S0tLS0tLS0tLS0dHR0dHR0dPT0bm7zLqbnLrQyNPT0tLS09PT09PT09PU1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2NjZ2dra2tra2tra2tra2tra2tra2tra2tra29va2tra29va2tvb2tra2tra2tra2tra2trb29vb29va2tra2tra2tra2tra2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ3qpfVWBuW1VZUVpeT0xHQ0ZNSUZEREk7QUE7PDg4NjU4Njk4Nzw/QT89Ojc8Pz48Pz87OjY4OD09QEE9QD5BQD1AOjs6Pj1BRUdKQkBDR57h29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e0tLS0tLS0tLS0tLS0tLS0tO+wMqaoKKViJGeqpOpz9TT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fY2NjY2NnZ2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dna2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2tvb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2d6iXFVeblheXU5aUFROQ0NMSUlJRkpEPEJBPDs4NzY3OTc3OTk9P0E/PDo5QD88PkI/Ojg3NzY9P0BAPUBBPz88PTs7OD48P0VJSEE/Q0aX4dvb29zc3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3tPT09PT0tLS0tLS0tLS0tTIlZyum5m1iX2TjIKBhMTV09PT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tvb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dndmlpYYW5ZYVdPV01QRUJETElNS0ZJRT5CRDk4ODY3OTc1Njk4PT1BPjo4OT4+PD9APzw1Njc2PD4/PjtAQEA/Pj4/Pjs/PkFCRkdCQENIkeLb29zc3Nzc3d3d3d3d3d3d3d7e3t7e3t7f39/U09PT09PT09PT09LS0tLTz6h+kayPko6MhoCIiYSQo8rU09PT09PU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY19jY2NjY2NjY2NjY2NjX19fX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2tra29vb29ra2tra2tra2tna3JJaWWNuWlpSVV5QTDxAR05IUklIRT48SEY4OTc1Nzg3NTg5ODs+Pj07ODlBPj1AP0E+NzU5Njs+QUI/P0BAQUI/Pj8+QUBEQUZIQj9FSozi3Nzc3Nzc3d3d3d3d3d3e3t7e3t7f39/f39/f1NTU09PT09PT09PT09PWtaWaiIuQhYCFi4iBg4qLf4bC1tTU1NTU1NTV1dXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2dnZ2dna2dra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29ra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb2tra29uIWltnalxYTFpfVkg6TEhMSkpDRUVDQExINzo3Njc4ODU4Nzg5PDw7Ozk4QD89Pj8/PDY3PDQ3P0JCQUBAPz8/QT09P0A+QEBGRT09REuI4tzc3Nzd3d3d3d7e3t7e3t7e3t/f39/f39/f39TU1NTU1NPT09PT09PUxZKCg4WGfYGCfXx5foGCg36k29bU1NTU1NTV1dXV1dXV1tbV1tbW1tbW1tfX19fX19fX19fX19fX19jY2NjY2NjZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vc3Nzc3Nvb29vb29vb29vb29vb2tra2tra29vb29zb29zb29vb29vb29vb29vb29vb29va2tvb29vb29vb29vb29vb29vb2tvZgFpebWhaU0ldW1hKRE1ISlNMR0ZBQD9KQjg7NjY5OTc1ODY4Ozo7Ojw5OD09O0A9Ozo2NTw3Oz1CQEFBPD49QEE9PEA/Pz5CREU+PERLg+Lc3d3d3d3d3t7e3t7e3t7f39/f39/f39/f39/V1dTU1NTU1NPT09PT2LKEkKh9g3l2hIh/e3d5gn5+i67A1dTU1NXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dna2trZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2trb2tra2tvb29vb29vb29vc3Nzc3Nzc29vb29vb29vb29vb29va2trb29vb29zc3Nzc3Nvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc1nlcWmxmWFJPYFFSQUhHSkZYTEZAQENDSz87Ozc4ODc2NTc2ODo5PDw6PTs/PTs9Pjw7ODg8OT0/QkFCQzw8P0FCPj1BQkNCREVDQDtDTH3h3d3d3d3e3t7e3t7e39/f39/f39/f39/g4ODg1dXV1NXU1NTU1NPU0ruen3WKeXuIgICChYGDcnOAhYOMrNfV1NXV1dXW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NnZ2dna2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra29vb29ra2trb3Nzc3Nzc29zc3Nzc3Nzc3Nzb29vb29vb29vb29rb29vb29vb29zc3Nzc3Nzc3Nvb29zc3Nzc3Nvb29vb29vb29vb29vc3Nzc3Nzc3Nvb29vb3dByXV9wZVdLUGNPS0JHQ0pIS0ZBPEE9SFBBOjo3Nzg3Njc4Nzw6OD09PD47QD88Pz07Ojs5Ojk8QEJAQkNAPUFAPz1AQkNDQUBAP0A7RU144N3d3d7e3t/f39/f39/f39/f3+Dg4ODg4ODg4NXV1dXV1dXV1NXU18h4i4V8goh6g4SBfoKCc2l0hYuGkJ3U1tXU1dbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tvb2tvb3Nzc3Nzc3Nvc3Nzc3Nzc3Nzc29zb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb297KalxjcWVST1heSz9HTElPS0VAPkFCP0lPPjk6NzY7NzY6Ozc7Ojg6PDw+Oz09Oz48Ojs4OTo4OUFCQkFAQDtAQj06PkFCQz8+PT4/PUZOdN/e3t7e3t7f39/f39/f4ODg4ODg4ODg4ODg4OHV1dXV1dXV1dXV1s6dhpl+f5OTin+CgXx9gnNxm4mAgoOJwNnat7TQ19bW1tbX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tra2tra2tra2tra29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NvfwGNaW21gVlBTU0pETEhNSEk8PkFEQ0ZORDw8OTc5OjY4Ozk3PDk4OTw9OzlAPjpBPzw3NTc7ODpAQUVBPz45PUI/Oz1CQkI6Pj07PT5GTnHe3t7e3t/f39/f39/g4ODg4ODg4ODg4OHh4eHh1tbW1tbW1tbV1tjLioCHhYOXjHh7e3lvfYF1a3ebdHZ7eInHxpiMrdjZ19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2drZ2dna2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tra29vb3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29zb29vb3Nzc3Nzc3Nzd3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3Nzc3Nzc4LdjV1lrYlJNVVFMSktGS0ZDQD5CQT9FTT4+PTg5OTo3OTo3NT03Nzo+PDs7Qjw5Pz05NjY4PTk6QEJGQD49PEBCREA9QD9DO0A9PD4/Rk9t3N/e3t/f3+Dg4ODg4ODg4ODg4OHh4eHh4eHh4dbW1tbW1tbW1tfVrYZ6d32rn3l4entzdH+Dfm9xe3l6c3t2k4qFgImkzdnY19fX2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tna2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29vb29vc3Nzc3N3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vc3Nzb3Nzc3Nzc3N3d3d3d3d3d3dzc3Nzc3Nzd3d3c3Nzc3Nzc3N3d3d3d3d3d3d3d3dzc3OGtYVtebGJSTVZMTUdLS0RGQkI7QT08RUxCQT44Ojk6Nzc5NjY6NTs+QDs9Oz89PD89Ojk5Ojw5PEVDRkA/PkBDQkQ9OT0/QT1CPz1APkdPadvf3t/f3+Dg4ODg4ODh4eHh4eHh4eHh4eHi4uLW1tbW1tbW1tfQmH+Qh4N9eoN2e3Vzenl6kKqmd3JyfoeHh4CAfoKEhJHJzNnX19jY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra29va2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2djY2NnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vb3Nzc3N3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzb29vb3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3dzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3NzhpV9UYm1iUE9TSUhHRkpJSUJBPkJCPEVFREA+ODo4Ozc3Ojc4ODY+Pz07PDk9PDo+PTs6Njc7NjpEQUY+Pz8/PkNBPzs9PT47REM/PjxIT2fZ4N/f3+Dg4ODg4eHh4eHh4eHh4eLi4uLi4uLi1tbW1tbW19jYyH52doN+fnR2eIaCenl1d5yhu6GEgoCAfoeKinx/gYaMnKjO2NjY2NjY2NjY2djY2NjZ2djY2NjY2dnZ2dra2tra2trb29rb29rb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3d3d3d3c35pbT2drXFBRUElDT0pLR0xHSkJAP0JHREBBPDg8ODg1ODk3Njc3QEA/Ozw5Pj04PTw8Ojc4PTk/RENGPkE/QkBDPzw6Pj0/PkVEPz07S1Fj1+Hf4ODg4ODh4eHh4eHh4uLi4uLi4uLi4uLj49bW1tbW19XB3LRueHJze3B6eXaFiIR7eH2AgZiljH98fnuRhZaLhoGDgY6Rvd3Z2NjY2NjZ2dnZ2dnZ2dnZ2dnY2dnZ2dna2tra2trb29va2tva2tra2trb29ra2tra2tnZ2dnZ2dnZ2dnZ2dna2trZ2dnZ2dra2tra2tnZ2dnZ2dna2tra2tra2tra2tra2tra2trb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t3d3d6NWFdobllQUUtISlNJTUhNSUtBQz9DRkJBRDo6PDg2NDg4NzY2Nj8+Pjo8OTw7Oj09PDw4Ozw8RERERT4/PkI+Qj84PT8/Q0NCQEE+O0xUY9Xh3+Dg4OHh4eHh4eLi4uLi4uLi4uLi4uPj4+PW1tbW1teslLZ6eHJvd5V7dHuLgHh1bn6Fg3t/hYhyfH2bnI6JioJ+g32Hk5rH1NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2trb29vb29vb29vb2tra2tra2tra2tra2tnZ2dnZ2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2trb2tra2tra2tra2trb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d7Zf1lgaGxcUUtHR09LTk5PTURGQkg/Q0hEREA6Ozs4NzU3Nzc4NThAPkA7PDk8Ozw+Ojk7OTk7OUZERUI8QD4/PEBDOz5AP0A/Qj8+OjtKVWPV4eDg4eHh4eHi4uLi4uLi4uLi4uPj4+Pj4+Pj1tbX19vKhYR3cXJubniVhHt4hH95dnB4c3eLkY6CdnN9ioaId3d1d4ODfIiIk8Pb2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2trb2tvb29vb29vb29vb29rb2tra2tra2tra2tra2tnZ2dnZ2dna2tra2tra2tra2trb2tra2tra2tra2tra2trb29vb29ra2trb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f0nVZaGlqVk5KSE1OR01EUElGSD9FPUZMREM+Ozs8OTc3OTY2OTU4Pj4/PTs8QDs9PDo3Ozc5OThHREVCPUE9Qj8+QDw/QUE/QEJAPjs8S1Ri1OLg4eHh4eLi4uLi4uLi4+Pj4+Pj4+Pj4+Pj49fX19fEknuJf29sbnV2foSBg4qGfnVybWVtiIaKjoR7c4OHint4e4OPj4GEioqxztrZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29zc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tvb2tvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3dzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f3t7e4clsW2pqalNOR0hOT0VIRk1JSUA7RD5ISUA9PDo6Ojg2ODo3Nzk0OD08PT07ODw8PDw4Njc4OTo6RUJFQT9APEI/Q0M+PkNEQUBAP0A8PUtRYdPj4OHh4uLi4uLi4uPj4+Pj4+Pj4+Pj4+Pj5OTX19fZqXaFfnx3bHB3eXh8jH2KhYB3anN0d3p9bot7fnl6foR/gIGDfnh8foeGlrbT2tnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra29ra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/e3uO9amFpa2lRTkZNTEtKWE1OR0FAQE9BRD9AOzw4OTk5Njg2NjY4NDs+PD07OTY6Ojk6OTU4OTg5OkJERj8+Pj5AQEBCPzxBQD88Pj9BOT5KT17S4+Hh4eLi4uLi4+Pj4+Pj4+Pj4+Pj4+Tk5OTk19fX2sqKhIB5c29tcXN1d4CUeHaAfHWHhXd1cnWgmXp7d3Z5doR0bWxue3iAmouTu9za2tra2tra2trb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc29vb29vb2tra2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f397js2lpbmloUFBPTExPUk9LU0Y/RURERD48PDg7ODc5OTU2ODY2NzM6Pjs+PTc6Pjk5OTk2Ojo4NzxDRUc/Pzs/PkA9PkE9Oz0+OUFAQDhBTlFc0OTh4eLi4uLj4+Pj4+Pj4+Pj4+Pk5OTk5OTk5NjY2NjauY6AenZ1bmpveHCBfWt0cnZ3hIV5h4d5lY55eXp1d3pza298gHx2fYh8gLLe2tra29vb29vb29vb29vc3Nzc3Nzc3Nzc3dzc3Nzc3Nzc3Nzb29vb29rb29vb29ra2tra2tra2tra29va29vb29vb29vb29zc3Nzb29vb29vb29vb29vc3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3t7e3t7e3d7e3t3d3t7e3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/f39/f4qpqa2hrZFNQT0ZQVFJOSFJLPkREQ0I7Ozk6Ojg2Nzg1NjY4ODg0Oz88Pzw5PDw3Ozo6Nzo6Nzo9Q0JDPUE+Pzw5PT5BQDs8PDtFQD47Q05TXNDk4eLi4uLj4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTY2NjZ1p5vdntveHh2cG50d3BwdHBzb36Jc3qGhY2EenNtcoB6hn1vg5OBdnx9g4a13drb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29ra2tra2tvb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4N/f3+KgbWhma2ZVVlJHUFFOS0xMRUJIRUc9OD08Ojo3Nzg2Nzc2NTY3NDg+PD09Ojg6OD46Ozc4Nzc6Oj5DRDtDQj49OD1AQUM/Pjw+RTw+PUJNUF/S4+Hi4uLj4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk2NjY3MB2doCCfnp4eHBsdXlya399bHNvdGdoaYB/aWl4c2d+iYl4cIKGe3d9foWKvd3b3Nzc3Nzc3Nzc3Nzc3Nzc3d3c3Nzc3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODflGttZm5mU1NJUFlUTEhGTkZGRUJGPTs+PDs5Nzc4NTc5NjQ1NzU4PDs9Pjo6OztAOTs7ODc6OTlAQkE8QUE/Pzk/QEJFQ0FAQEM7Oz1ES01g1uTi4uLi4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk5NnZ2tmYc3uqhJaCcnR1dn14aGx8d2h4d25rcHR5gIJ3dHyBhIJ9c3CAin94gn95g8je3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f4N/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh24tubWdzY1lRTVVbV0hDSUZOS0dCRD8/Qjo7OjY2NzU2NzY0ODc2Ozw7Pj86PDk8Qjg3OTo6Ojk6QUFCQUJDQEE+PT9CQ0NEQUJGOTg9REpOYtjk4uLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXZ2drcqHGCtXiRfnNsem6EgXaCfWtoan+DeHZ8dX2FhXRmcHl9d316gIqFe318foC03tzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3dzc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3Nzd3d3d3d3d3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e397e3t7e39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4ODg4ODg4tiFb3FrdWFWT1VVXE9ETUY+SkdKRUQ8P0I6PDk4Njg0NTY3NDc2NDk7Ozw7OD47PEE4ODo9OD04Oj09QEBAP0FCP0A+QENCQ0FBRTc2O0RMTmPa5OLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXl29ra3Z5sbnNxhY1ybXBuf391hH5rcnZ2enN4gXhzbnVwbWt2fHmFiIB/f392coODsd/c3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eDg4eHh4eHh4eHh4OLXhW1xb3ZeUldTWlpRSkhDQFFAQkQ8OT9BOjw5NzU3NDU2NjQ3NTY9PDo9PTk+OjxAODo6PDY7OTs+PUJCQjtBQkBDQEBEREM8PUA3OjxFS01l3OPi4uPj4+Pj5OTk5OTk5OTk5OTk5OXl5eXl5dPOxsB+cWxveHt2b3VuanNzbZKGeG50dG5vdIZ/b2twboJ0bXZyfY2DdnF/d3mKgabf3Nzc3d3d3d3d3d3e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3dzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t/f3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi1oZucG1xYFJZUFdfWUpMTElSP0Q9OTtCRjs6OTc0NTY1NzU0NjY2Pj07Pz45PTk7Pjg9Ozo0ODtAQENCQ0FCRkE/Q0BBQkREOz0+OTs8QkxNZODl4+Pk5OTj4+Tk5OTk5OTk5OTk5eXl5eXl5eW5t7Woc3JscHd6dHd4bXFydXd/hHRyc2xsa3F8bnBudGuBf3GAd32Eg355gHNygYqg2d3c3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh49WHcWxqbF5YWlVXYFZWUE9QTD1BOjs8RkE4Ojg3MzY1Njk2NTg1Nz89Oz8+OT04Ozw5PTs7NTo9Q0JCPENDREREQUE/PkJDQzw9Pjg5PENLS2PN0dnh1sjY4+Tk5OTk5OTk5OTk5eXl5eXl5eXltbW2q3J5cm59f3Z1d2hqaGlwb3Zta2tnZWZxdG15gG5teXd2iHhxa2podXV5dHV/wd/c3d3d3d3d3d3e3t7e3d3d3d7d3d3d3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHi4uHh4ePVhnFwY2lhV1NZV19MUk9STUtAPjg5O0E+ODc5NjQ3Njc6NjY2NDk+Pzo8Pzo/OTo6Nzo9PDk5PEFBPTtBQ0VDRkA+Pj5BRUQ+QEE3OD5GSEpesrW4wbm1u8jg5eXl5OTl5OXl5+fn5+fm5ebm5ra2tbWOfX5weoR1cnZnYmNlbGtyb2ZpbHZtd4Z9hXlsbHd4a3ZwfH14c3V5fHd2h7ng3d3d3d3d3d7e3t7e3t7d3t7e3t7d3d3d3d3d3t7e3t7d3t7e3t7e3t3d3d3d3d3d3d7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4eHj1Yd1bl5uY1pUU1hXS1NLSk1SR0E4Ozs+PDk4NzU2NTY2OTY4NjY5Pzw6PT07Pzo7Ozk8PDs5Oj4+Pjs8PUFEQkNBQEBBP0JDPDw9Nzs+REVKXrG1tLW2t7e2y9rJ3uXl3eDi3tXU1tPU4OPg39+2treuh3t/bnmNenJ1bWNobGxtaXR4enF5enqIh4N6aWh9cWRvcXyGgX55e318e4an2t7d3d3d3d7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4uHh49aGdmxhb19dV1lcWlJQSEpXTEVHPUA9Ozs9OTY0NjU1NTg2NzY3OD87OT09PDw5OTw6Pjw6OTg+Qjs7Pj5AREBDRUFAQD0/QDw9PTU5PEJHRl2xtbW2uLm5ubq9uMPT0r3BwcC6u7y6u8TMxb/Dt7e3hGl1gX1ndYd5Z3Vxa2t5eHB3fH15bWl3e3h3bml1j4FwbHl4d3d9gXuGgnmAoNze3d3d3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODh4OHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4ePXhXJrZ3RhW1hYX15TVVVRVUpMRj9JRDs5PTY2NDc3NTc4Nzc3ODk8PDo+PDg8Oj0+OTs8OTs5P0E8PT9DP0FARUJCQTw9Q0A6Pjw1NDlER0dasbW1tre5ubm5ubm3ubm4uLm5urq6urm5urm6u7e3uX9ucHN6b3B/eXNuc3Vsc3Z4cXFwb2tvcX6Bc2mHhIF9dHOHdW11hYmBgHJ2hafd3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uHj14lxa2xyW1dXXWBUUVVUUFJPSkNATUE9Ozk2NTM0NjQ2ODc3Nzk6Pjs8Pjs5PDo8PDk8PTw7PT0+PUNEREBDQkE/QD48PkE8OD06NjY6QkpIWLG1tLa2uLm5uLi5uLe3uLi5urq5ubi4uLi6uru3uKx7cnhxf3ZzfnBsbXpyZ29sbW50cHt3d3Jyd3pvhpJ2f3x8enZ5fH9zfYdyda3T393d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4eHh4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi49eHb2pxalVWV2FbT1FSUE5XSURESUo/Ojk6NzUzNDk1NzY2Nzg4Ojw7PD46PDo6PTw5PDw9Oz09PDs9REdEQ0E8PDw8Pj5AOzg8ODE1OkFGRVautbW1tre4uLm4uLi4uLe4ubq5uLi3t7i4ubq7t7mqcnB4d3x7e4J3aG5xam9qY2lyf21zcn54dHFsanaAeX2AgH91doB1a4qLgHaR1d/d3d7e39/f3t/f3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f4N/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLi4uPYhm1sdGVWUFxnWE1YU1JRWUVDS1BOOzk4ODc1NTM5NTY2NzY4Nzk+OT0+OTw5OTw7Njg5OTo8QEA9PkBGQEJCQDo+PEE9Pzs7OzYxNjxCR0RQqLa1tba2tre4t7i4uLi4uLm6ubi4t7e3t7e5ure2tIlyd3h9iXxwem99c2hqbGdnbHRscXd0cWx2c3Fxd3FyfHl4g3Z7d2mLkYp9kM7f3d7e3tvY2drZ297f39/e3+De39/f3Nvc3N3e3uDg3+Dg4ODf3t7e39jS397f397e3t/f3t7f3t/f3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLi4eLi4uLi4uLi4uLi4uLj4+Lj4+Li4uPj4+Pi4uLi4+Lk14NoZ3VkVlVkZVdKWllXW1Q9RU1LSD04NzU3NjQzOTQ0Nzc1Njc5PTo9Pjw9PDk7PDk5Oj45PD4/PkFBQ0FFRUQ+OzxBPjw5PDs3Mzc+REhFSqG2tbW1tbW2tre4uLi4t7e4uLi3tra2tra3uLm2traLfXpsbHp/cGx5dm5qaGdlcXp4b2lvb3B1c21zd4Fnb32CgYNyf3lqcHJ6f6ng393Zy8a/vL2/vsLN0tDW3tnc4NfQzcPCw8PH1dfT2dzX1NjX0MfExce9vM/Kz87Y3djO3N3c2t3T0dze39/e397e3t7e4N/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eLi4uLi4uLf4uPi4eLg4d7W29/Sw8rJx9Hb3OLk4eHg2dre1sbExcTN2trf5OHi4trX3st9aWZxYVleZWFNTFRLUlpMO0hNSEZBPTc2NjUzNDY2NDg3NjU2OTw7Pj46Pjk5PDk3OTs7Oj49PEBAQ0RCR0ZCQT08Q0A9OTw7Nzc3P0RGRkaZtrS1tbW2tra4uLi4uLi3uLi3s7W2t7a3t7i5tba3opdxb29waW50dnFmZWNrbmdvcm1mZ2tygWVvdnyAeGRzj39zaHFyaWVlbm+w39HFv7u5ubm5ubq6uru6vc3Gw8e/urq6uru7u8HCvcHFvby/vry7urq5ubq6ubm6w8XDucDDwby/ube/z8/U3tjc3t/g3tLa4N/f4ODg39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eDg4ODg4ODg4ODh4eHh4uLi4eDh4uLi4uHa2t3RwsPCu8XT1uDdydPDrrnAsaqrq6uwtLbJ0sXRxLG4v7Srq6usr7S0vMzE1c60tLureGxtbWBdYl9ZS1NVVFFQREBRTUhEPzo3ODU3MzE1NjQ5ODU2Njo8Oz08ODw5Njo6ODg5NzU8PDw/QEFAQkRDQkE8PkI/Pz09PTc1OD5DRUNAj7a0tLW1t7i4uLi4uLm5uLe1sautr7Oxs7OztLS0tqaei2tue3ZxeXhnY2hfcXdha25vaG99b25ja2lseHdsa4Z+bHB6dm1scG95sca8uru7urm5ubq6urq6urq6urq6urq6urq7u7q7u7y7urq6ubq7u7q6urq6urq6ubi3t7i4t7e2tbW1tbi3u8e+w8XHzcS4wMnH0tzZ2d/e3uDf39/f4ODh4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh3Nji4uLi4eHh4OHg3tfGxtHQztTe3tPO0t/SuLi8sq2trKysrrG+ua63rKipqamqq6urqqqqq6ysuKyqqqqrq6urra6urq6urryzrayrpHlub21fXl1dVE1SU1xUSkE/UElIPjg5NjgzNzMwNTczNzg1NzY2Ojw/PDg5Ozo6Ojg5OjY1OTs8Pj9EP0NFQkNCP0BAQT9APjw3ODc6QUVEP4W4tLS1tbe4uLm5uLi3t7SurKuqqq2urq6vsLGzs7WjcG5ucm1wg311aWFlaGZkY2Rxc21td25naW1tZXBzb29zcXN8h4F6dX11n7u6uru7urq5ubm6urq6urq6ubq6urq5uLm5ubm6urq6u7q5ubm5ubq6ubm6ubm4uLi3t7e4uLe3t7a2tbW2tra1tbW1tba1t7e3t7rBvrzGycrb3+Dg3tvd3d7h4tDW4uHg4ODg4ODg4ODg4ODg4OHg4OHi0768zNjd3OLg0dnbxL23sLCxsa+zu7uzsLS9s66urq2tra2sq6qqqqmpqKmpqampqqurqqqqqamoqampqampqaqqqqytrq6urq6urq6sraR4aWJxZmFZWlZRUk5cU0Y9QlJEQTc8OzY5NTY1NDU2NTk3NTY1Nzg7Pjw7OTk5Ojg3Nzk3Njg8Oz47RD8/Q0BBREE+P0M9Pjw+Ojo3Nz9DRj54srCztLW2t7i3trKurq2sq6uqqaqtraysrq+xs7S1t4xucnRqaIB5ZmpmZWxdaG5waGxxYmNmcoJ+dmhobGpueoaBhXx4cXF5gK+6ubq6urm5uLm5ubm5ubm5ubm5ubm4uLe3t7e3uLm5ubm5uLe3t7i5ubi4uLi3t7a2tre3t7e3tra2trW0tLW1tbW2trW1tre3t7e3t7e3tre4v8bP0MS+v8DE19e8ydra4OHg4ODh4eDg4ODh4eDb3t7Uzby3tre6wMDJxLfIvrKwsLCwr7Cvrq6ur7Cwr66urq6uraytrKurq6qpqampqampqampqKmpqKmpqampqKmpqKmpqqqrraytra2ur66trK2heWpjbWdiXFhRUFFLVEpCOklRP0E3PDk0OjU2NTQ1NTU4ODY4Njs6OTw9PTs6ODY2ODg6ODY3Pj09PT5BQUVCQkNBQUBBOj09Pz05Ojc9QUc8bKqmqKutsLGwrqupqKqrq6mpqamrrKytra2usLO0tbilgIdvaWdzdGZrcG1qZGxvcm5rbWNrcHyJhG5qbHx4Y3uKfnNqc25rcY+7ubm5ubm5ubi4ubm5ubm5ubq5uLi4t7e3t7e3t7i5ubi4uLe2tra3t7e3t7a2t7a2tra3tra2tbW1tba1tLS0tbW1tra2tra3t7e3t7i4uLe2t7a2uLm4uLe3uL6+uLq9vcfb4OHg2Nnd4eHg3dfKwcPCurm5uLe4uLi3tbS0tLKysbGxsLCvr6+vr6+vr6+vr66ura2srKyrq6yqqqmoqKmppqepqaehpaipqamoop+hoZyip6inqausrK2ur7Cwrq2unXdwbGphY2BZUU1RTFJGQzlNUEU+ODs3Mjc5Njc0NDM1ODg3OTc7OTo9PTw6Ojk3NDo5ODY1OD8/QEI9RENDQ0FDQEJBQDtAP0A/PDw6O0NIPWOopaWlpqioqKenp6ipqqmoqKipqqqsra6wsLCztLW1taWYdn5xZmt4cW9tZmVsaGNsZ2ZpaX11bWlvfXZ5hWZod294b3Fvcninu7m5ubm5ubm4uLm6ubm5ubm5ubi3t7W1tba2tre3t7e3t7a2tba2tre2tbW1tra3t7e2tbS0tLS0tLS1tLS0tLW1tba2tra2t7e3t7e3t7a2tre2tre3uLe2t7i4t7i4uLi4wMXTyry8w83PyMC9urm5ubq6ubi4uLi4t7W0tLSzs7KysrGwr6+vr66urq+vr6+uraysrKurrKysq6ehoJ6gn5udoaGdlpmkpKaon5mZmZmanZ+gn56fpKqtrq+ura2srJl1cGlrY2FeXVVOU0tSREQ4TktHQTo4NTI2OTY1NDczNzc3ODk3OTo7PT0+ODg4NzU6OTk1OD9AQEFEPkZBQkNAQkNCQT88QEJCQD0+OjpERj5cpqWmpqampqanqKenqKioqKenqaurrKytra2ttLS0tbekc311bnONf3JmanFjaW1jaGZobG51aV9jZ3VzdnpuZ3Bwcn56cYihu7m5ubm6urq6urm2s7a1uLm2trW1tra1tbW1tbW3tra3tra2tbW2tbW1tbS0tLa2t7e3tbS0s7O0tLW1tLS0tbW1tra2tra2t7e3uLe3tra2trW2tbW2tra2tra2tra3tra3uLi3uri4uLe3t7i5ubm5urq6urm4t7e3t7W1tLS0s7OysrKxsbCwr66urq6urq+vra2srKuppaSmpqScmZubmpmampmXl5eXl5aZm5iZmJmZm52en5+dnJ6gpKWko6OioqKQdG5jcGFeXltUU1RIVEo/PFFCRkM7ODYzNzo1NTQ4Mzg5OTc4OTc7OTs9Ozc6NzU2OTk4NTg+Pz9ART5CPz9DPzxBQUI/PT9EQT8+PTk9Q0Y/VaSlpqanqKeoqamop6ioqKioqKiqrKuqqaipq7W1tba5o3eKcXKHhnd0cGh5a2JjYWVsaW5zal9jZWNjZWprYmRqbHaXjX6ovbm3tre5u7u6uLWxrKurqq6wrKyrq62tq6uvsLGvr7CytbW2t7W1trW1tbW1tbW2trSvr7O0tLSvra6vsrW0tbW1tbW2t7e3t7e3t7e3t7e3t7Owsra1tLa2tre3tra2tbW1tra3t7e5uLi4t7e3uLi4ubq6urq5uLi3t7e1tbS0tLS0tLS0s7OysbCvr6+vr66vr62oo6KgnJqampqZmZqbm5qampqbmpmZmZiXl5aYmZmZmpycnZ+foJ+goKChoaCgoJ+fi3RuaXRdYGZeUlRLRFRJPUVTSEVCOzo0NDY5NDQ1NzM4ODg3ODk5Ojo7Pz04OjkzNTg5NjM5PT5AP0A6QEJCQkA/QEJCPz0+QUFCPz06PkVDQFGjpqWlp6inqauqqKaoqKipp6ioqKinp6ioqaq1tbe3t7KZtH99kIx1Z2lqbGZjYGNoZW94cGlicXx5cGpmZmRma3NqhYystrKwra2ttLeysLCtrKuqqaiop6ipqampqKinqKipqaeoqqurra2sqqysraysrq6traunpaSnqqyopKOkpamwsbGztbW2t7i3t7W1tre4t7e3t7Kppaasq6ivtLa1s7W3t7a1tbW2tra3t7e4t7a2t7e3t7m6urq5uLi3t7Wxs7S0tLKxsK6sq6yurrCxsK2rqqmqqKijnJqZmJmYmJiYmZmZmZmZmpqZm5ubnJybmZeYmpqcnJydnJ2foKGhoqKioKGgoKCfnop1amtuWVxhVktPREdVRz5PV0hEPTw4MzQ0ODQ1NDgyODk4ODk6Ojw5OUA8Njk6MzY3OTE0PD8/QEBBOkNGRUJBREJDQTo7P0FCQz9APUBEQ0BPo6empaemqKqqqqakpqenqKioqKimpqaoq6uttba3t7e4rbJ1cHuDdmBiaWtiZWZhZGdmfYh5bHKAfXFvcXhjbW5xZo+srKurq6ysra6urK2trKyqp6WmpaWlpqioqKiopaeoqKioqKeoqamqp6Wko6KioqOioKKioaKhoKChoaKjpKOjpaWlqLC0s7OzsKuqqaqztLa3trGopaOioaGipKiqqairs7Sxrq6xs7W2tra3uLi3tre3t7e3t7a2uLe0sa6ppqerrKmnpqWkpKSkpKWnqaajoJ+enZycm5uampmZmJeXmZmZmJiZmpqampqampqbm5mYmpydnZ2dnZucoKGgoaOjoqCgoKCfnp2FdGtsaFdYU0pHTUVITUdAU1dGRz09OTM2Mzc0NTU3Mzg6Ojk6OTw9OjpBPDY9ODM3ODgzNztAPz9AQDpCRUNAQkRDQT87PEBDQkNBQDxBQ0A9TqKnpqanp6mqq6mkpaWlpaaoqKippqanqKmpqrW2tre3t7izc2h7c2JnamtpaWJhZGloXV1tfHJma3J/fHR8bm1zc36gqamrq6uqq62trKusq6mpqKWjpKampqWmp6eqqaamp6enqKinp6iop6WkpKKhoaGhn56en5+fn56foKGho6Wko6OkpKSmp6enpqWkpaampqeqraumpKKhoaChpKWlpaempaeoqKalpaivtLa3trW0tra1tbOwrKupqa6rqKWlpqampaSkpaWlpqWkpKSkpaKhoaGgnp2bm5ucm5qamZiXmJiYmJiZmpmZmZmYmZmZmZqZmZydnJycnJybnJ+fn6ChoaKgoKCfnZ2cgHNrbmReU0pITUZETEtFRFFTQ0c9PDgzNjI4NDY0NjQ4OTg6Ozk7Pjw5PTs5PTczNTk2NTY8QD0/QD88P0JDPkJCQj89Pj5CQ0FFQD86PkVAO0+jpqWkpqeoqaelpKWlpKWnp6eoqKanp6alpqa1tba2trW2uYptcW1vfHxxZ2pmYGFsYFROW2hqbm9tgYJ9cWdxdn6aqKeoqqmpq6urrKqqqqimpaWkoqOlpqalpaWmqaqppqWjpKWmpqSko6Kio6Khn5+fnp6cnJycnJ2dnJ2en6CioaKjo6KhoqKkpaSioqOjpKSjpKSko6Ggn6GipKanp6ipqaelpaSipKSlqK2wsKyrqqusqqmnpaWmpaWlpaalpqioqailpaWkpKSlpKOjpKOioaGhoqKgnp2cnJubm5qZmJiYmJmam5mXl5eWlpeXmJiZmpqcm5qampubm5ucnJ6goKGgnp6enpycm356bnJiXlNNSlBFRk5NQkBPRT5JOz01MzYzODM2Njc1Ojs4OTs5Oj49Ozo5OT03NjY5NjU2PkI+PkE/PT5DQT5DQ0BAO0BAQkJCRUA+Oz5FPzxQoKSjpKOjo6SkoqSlpaSlpqamp6empqalpqaltLW1tbS0tbiBaHx9ZXOCemxwdWFfY1ROT1FbaGxpbGxxbW5xbnScoqSnqKioqauqqqqqqaempaSjo6OjpKSlpqalp6ytqaShnp2eo6Shn56foKCdnJ2dnJycmpqam5ucnJubm5ydnp6foKChoJ+goaOioKGjpKSjoqSlpaWkop+go6SkpKapqainpaGdnJ+jpaipqainqKioqaempaWkpKSlpqampqampqenpaWko6Ojo6KioqGhoqKhoqOkop+enZ2cmpubmpqZmJeXmJaWlZSUlJWVl5iYmpubnJuampqam5ucm5ucnp+fnpucnJyam5p/fnF0YFtUTUdNSEZMSj8/TkM8QDs8NDM4Mzc0NzY3ODs9ODo6OTk7PTs7ODk9Njc4OTU4OD9APT9BPjs9RD89REA/PzpAQUE/QUVAPjw8Qz88Tp2ioaKioKCipaSkpKWlpqenp6empqampaampbW1tbS0tLS3jHalsXdmc3Jvc2xjZGlYT1JRT09dgG1kYFptkZGSoqKjpaampqenqKiop6alpaOioaGhoaKjpaempqesq6imoJ2cm6Ghnpubmp2cmZiam5qampmZmZubm5uampqampucnZ6goaCfnp+hoJ6foqOko6Omp6inqKWioKGhoaGkpaWlpKCcmZmbnqOmpqampqanpqempaOlpKWlpqiop6enpaWlpaWkpKOjo6KhoqKioqKhoaKjo6Kgn56enZybnJubmZaUlJSTk5OTk5SUlJWWl5qam5ubm5qZmZqanJ2dnZ2dnZuampqamZqXf3dvc11aTkhKTkdFRklERU5APD09PDQ1OzQ2NDY1Njc5Ozg5OTg5OTw7PDc6Ozc4ODg1ODg/Qj9BQTw+P0A8PEJAQT49QT4/Pz1CQUA6OkA8PE+doqGfoJ+dn6OkpKSlpqeoqKenp6ampqampqW1tLS0tLS0tbSXtqd1Znh2Y2xjY2VjW1JTU1JNXqCMeFhodpajnp6hoaOjo6OjpKSlpqalpKSioaGko6OjoqOlpqamp6enp5+bmpuioJqWl5Wam5qXl5iZmpqYmJqampqbm5qZmZmenZ2goqOjo6KkpKWinqGhoaKjpaampaSjoaCgn5+hoZ+goJ2amJiZmpygpKOjpKWmp6alpaOjpKSkpKWnp6ampqampaWmpKOjo6SjoqKjpKGfoKGhoKGgoaCfn56dnZyamJeVk5KSkpKSkpOTkpOUlZaZmpqbm5qampqbnZ6enp2cnJybm5qamZmZlH10bHReWk9IRUdGQkVORT9GOzo+Pzs0Njo2OTM2NDY4ODo4OTc4ODo8Ozw5Ozs6OjY3ODk5Pj9APjw9QD5AOjlAQT89QT8/QUE+QUE/Ojk9PjpQnaCfnZucnJufoqOlpaWlp6iop6ampqanpqantLS0tLOysrGwsK2rkHiGj36bmn93Yl1TUlFRTGKgootaiKCgn52YmZycnZ2eoaGgpKenpqWkoqGjp6alpaOipaampaanpqagm5mboaCXk5KRl5qcmpaXl5iampmampqam5qYmJmaoKCgoKGfoaKipKamop6gn5+goaOko6Khn56enpyanZuZmpqZmJeZnqChoaKioqKkpaWmpKSkpKKioqKkpaWlpaWlpaalpaOko6KioqGgoKGgnp+fn5+fnp+foJ+cm5qZl5WUlJSTkZCRkpKSkpKSk5SVl5iZmpmZmpqam5+fnp2cnJycmpmZmpiXl5F8cmdxXl1QRj9BRD9KT0JCRjhDRT4+OTg7Nzc0ODQ1OTo6Ozk3OTo8Ozo8PT48PDo2NzY5OD4/QT47Pz49PDg6PkFAQUE/P0FCP0RBPjo4PkE8U5ycm5uampycnaGio6KjoqSmp6alpaampqSjo7KysK2rp6amp6alpqiln6iop6qnoXmEXFFST0xcnKCAYpmgnp2clZOVlpeZmp2dnqGmpqampKOioqanp6ajpaampaWnp6amop6cn6GgmZGSmpaXmp2YlpeWmJuZmpqampqZl5iam6Ghn56fnpybnJ6goJ6dn56fn6Cio6SjoqCfnp2ZlpeXl5iYmZubnqKioqKioqGio6WlpKOio6SioaGhoqOkpKSko6SkpKSioqKhoqGgn5+gnp2enp2dnZ2dnp6em5mYl5WTk5SUk5KQj5GSkZKSkZKTlJaXl5iYmZqampyenZ2dnJubmpiYmpmXlZaNempmamBiTkY+P0A9SkVAQ0A7QEE8Ozs5Ojc2NTg0Njc4OT04ODs6Oz87Ojs8Ojk6Nzc2ODs8Oz08Ojo8PTw3Oz5DQkRDPz1BQ0FEQT88OkBCO1eZmJqamZmam5ucnp2foqKhoqSlpKSlpqSioJ6op6alpqWlpaemp6ampqakpaanqKehqXJOUU1KVJahenKanJyenJeVlJWWmJiXl5qeoqKhoqOkpKOjpqalpaanpqWlp6empaOgoKGgn5qTpq+bmpmenJaXl5eZm5ycnJqamZeZm5uen52cnZyZmZqcnZydnp6fn5+hoaCgoaKgn56bl5WVlZeanZ2fn6GhoqKio6OhoaCgoJ2cnaGioqOkpKOioaSlpKOko6SjoqKioqKhoaGfn52cnZ2cnJ2dnJ2enpqXlpaVlJOTkpKSkpCRkpKSkpGSlJWWl5iYmJiam5ycnJycnJ2cm5mYmZiWlJWXi3hsY2RiZFFHQT1DO0tIRDo7Ozw+OTo6OTo3Mzc5NTo4ODg8OTg7OT09Ozo7Ojk8PDc2NDc/PDo9Ozw/Pjw7ODxBQ0FDQkI+P0NAQkFAOj9APztZmZiampqam5ubm5ydoKGhoaGhoqKioqKhn5+dpKWmpqenpaWmp6ampqWkpKalpKSkpaaGUFJQT0+PmHB6mpubnJ6cnJycm5ubmZiYm56dnp6foKOkoqGhoqKipKWkpqampKSjoqKhnp2ao4qHm5yam56amJiYmJqcnpyam5iWmZybnJycnJydmpqbnJ2dnp6dnp6fn52cnJyhoaCblpWVlZacn6Ggn5+hoKKjoqOhnZuZlpaWlpicnqCip6ikoaCgoqOjoqKioKCgoJ+fnp+gnp2cm5ucnZydnJmanJuWk5KSkpKUk5KSkpKSkpOSkpKRkpSVlpeYmJiYmZqcm5qbm5ucnJqZmJiXlZWWl4d3ZGdoZGJNQ0U8RDlJSkU5Ojs9PTo6Nzg6NjQ3OTU8OTY4OTc5PDs7PDo6PDs6PDw4Nzg3Pj07Pj46Qj86Ojo/QURCQ0FBQD9EQUFAPjpAPj06W5qYmZqbmpubm5uen6CgoaKioKCgn5+enp2dnKWkpaanpqWlpqakoqKio6Oko6Kjo6KnllRYVVJOZ21rgZ6am5udn6Cgn56enp6dnJ2dnJ6enp+goaCfn6CgoKGipq6kpKSkoqGhnpubn6BbhpyZmZienpiYmZmam5qWlZeWlZicnJ2cm52dnpybnJ2cnZ6bmJqeoaGdm5udoKKhmpWVlpaZoKKfnZueoaKjop+em5eXlJKSlJeYmZ2goqenpaGgn56goaGioaCfnp2cnJubnJubmpqZmpydnJmXmZaVk5GQkJCPkZKSkpKSkZKTk5OTk5OTlJWWlpeXl5manJubnJucnJqamZeXlpaVlZSEcmZsYmRbREJMPT84RktCPEA+Pj05Ozk6PTg1ODg2Ozg1Njo4PDw7Ozw8Ozk8Oj09OTU4Nzw5PD88OkE/Ojo6QEBDQkRBQ0A/Q0FAPj08QD09Ol+al5mamJeYmpycn5+foaGhoJ+fn56foKCenZ2lpKSko6OioqOjoZ+foaGipKOio6SiradXXl1UV19ua42dmpqbnJ2dm5ucnZ+enZycnJydnZ+goKChoaGgoKGgoKq0sKKjoqCenJuamqlwUIubm5yZnJ6ZlpaWl5eTjo6QlJabnJuam5udn52cnJycnJ6dlpSZnJ+in5ycnZ+hoJuXl5mZmpycnJubnZ6fnZqXlpaWlJOTlJiampqfoKGmpqWgn56fnqChoaCenJubnJybm5ybm5qZmJmZmZmXl5iVlJKQkJCQj5CSkpKSkZGTk5aYl5STkpSVlJWWlZaZmZmam52cnJyampmXlpaWlpaQgG9vZV5gV0BKSDg/N0lFP0VBPD07Ojo8Ozs3NTs4Njs3NDY6Oj47Oj0+Pj07Ozs+Ozo4Ojk5NkBBPTo8PTo6OT9BQ0JERUM+P0FBPz8+Pj89PDtgl5WXl5aVl5mbnqGhoKGioqCenp6enqCgn52bpaWkpKSioKCfoJ+dnZ+hoqOjo6OkobCjXWVkYGFua4GenJubm5ubmZianJ2enJubm5ycnJ6ipKGeoKGioqKhoaCrk5yuoKCenZqZmqKZU1qPnJ2em5manJiXlZWWkY6Nj5KYnZycm5ycnqCdnJucnJyempWVm56foZ+dnJyenp2cmpqampqampqbm5qXl5aTkpWVlpWTlZaam5qanZ6foqWjnp6fn5+en5+enZ6fnZycm5qbmpqbmpiZmJiYmJiYlZSTkZCRkJCQkZKTk5CRk5SYmZiVk5SVlZWWlZaXmZmXmZqenpyamJiXl5aWl5eYjX1ubV9lVlRFSzw3PjdSRUM+QkE4Ozw7OTg6ODY7Nzc6Njc5Oj0+Ojw8PT49PD06Pz06ODw9OTtAPj4/PT45OTs/QkNAQ0VDPT9DQj5AQD5APTw8YZWSlJWWlpeanJ6goKCgoaCgnp6enp6gn56em6WlpKSioJ+fnp2dm5mbnJydnp+gn56rmGNpbW5pZm2enZybm5ybmpmZmZqam5ucm5uam5ygo6SgnZ+en6ChoKCgo6Fol6yfnZuam5yqc1Zfj56enpyZmJqamJiYmJKOj5OXnJ2bnJ2cnJycnZycnp6dnpqVl5ygoaGfnp2eoJ+cnJuampqbmpqYmpmVk5OTkpOWl5eVlJiYmZucnJydoJ+gnp6enp+fn56en6KjpKKgnp6cm5qam5uamJmZmJeXlpWUlJORkZCQkZKTk5OSkpOUmJmYlpWUlZaWlpaWl5iYmJiXmZqamZeXl5aXlpeWl4l4dmddX1dURUU5OTs8WT5AOEI/OTw8Pjk4Ozg6Ozc5OjU4OTs9PDk9Oz0+PD0+Oz8/Ozk+PDw+Pz5AQUE9ODc7QkNFP0FFQz1AREJBQEQ7Oz47PGKWk5SUlpWUlpiYmZubnJycnZ2cnJ2en56dnJqkpKSkoJ+enpybm5qZmJiYmZucnZ6cpolla3R4bVuFop2dnJydnJqbmpqampydnZ2bmpuboKKinpucnZycnJ2enp2odGiko5ubm5yfoWtiYpGenZ6cm5qanZqam5yVkZOXm52dnJ2fnZycnJycnZ6fnp+cl5idn6GhoJ6cn6CfnJubm5qbmpmZmZmZl5WWlZaYl5eXlpaYmZuenp2dn6GhoJ+fnp6fn5+dn5+hoqKhoZ+fn5yZm5qcnZuampmXlpaYl5eXlpWTkpGTlJSTlJSUlJaZmJaVlZeZmJeYl5eXl5eYl5iXl5eXlpaYl5eVl5eDeHZfW11eUT1GOjk4P1VDQTtDQzo8Pz86Ojk3Ozg4ODc0ODk8Ozw4Ozs8PTo8Pjk/QT06PTw+PkA/PUBBPjk2PERDRUBBRUU9PkVERD9COzo8OTpkl5SVlZaUlJSUlJWXmJiamZqcnJydnp6dnZybo6Oko6CenJuamZqZmJiYmZiam5ubm6WJa3F2em9lmp+enp2dnJybnZ6dnJ2enp2dnJydm5ygoJuampubm5udnJuap4Jsgaebm5ycopJsZGONn5ydnpybmp+fm5ydm5mZmZudnZ2dn52dn5+dnJydn5+fn5uanZ+goJ+dnJ6gnpubm5ubm5yampuamZudnJqZmJeYmJiYmp2foKCgoJ+hoaGgoJ+en5+fnp6foaKhoJ+enp+enJqam5ubmpqZlpaXmZmYmJiWlJOUlJWVk5OVlZSVlpWVlZSYmZuamZaWl5WWmJiWl5OUlJGRk4yRkJOWfXhqYWJiXFA8QDw2OENWSERCOjg7Oj47Nzc5Nj06OTk2NDc6Ozw9OTo6Oz87PT08QD47Oz46PT89PkBBP0A8NztBQ0U/P0REPj9EREM+Qj07PDs6Z5aTk5OTk5OTlJSVlpeWl5aWl5mbm5ybm5uamaOjoqCfnpuamJeYl5eXmJmYmZybm5qkgGpqb3lzcZegnp2dnJydnp6enp+enp2cnJydnp2bnJuampqam5ubmZmZmqaEdnCTmpucnZ2CamVljKCcnJ2cm5qdn5ucnJubnJubnZ2dnJydnp2enZydnZ2cnJ2dm5uenp6dnZybnpubnJycnJydnJubmpmbmpmYmZmYmpmZmpyfn5+jpaKfoaKioaGfnqCgn5+fnqCioaGhn5+fn52ZmpucnZqZmJWWl5aVlZaTkpOUk5STkJCSk5GUkY+OkJGOlZabmJWYlJmXlJiRjJCPk5yTkoyFjIeDhndxZ2pkW1xRQT44NkJHYEJFR0A+Ozw7Ojg4NjU8ODo4MzQ6Njk9PTk5Ojs9Ozw6PD48Oj5AOj5APjw/QD8+PDg6Q0FEPz5CRD8+Q0VCPUJAPDw8OmeYk5KSk5OSk5SVlJWXl5aWlZaXmZmZmpqampqkoqCfn52bmpmYmJiXl5iZmJmcnZ2cqH1nZXN7enOJop+enp2dnp6enZ2enZ6enp2dnZ6cm5ybmpubm5ycnJmYmZmmjXV8fI6anZ+WeGZfZY2hnZ6dnZybm52bnJybnJ2dnZ2dnJ2dnp+fn52cnZ2dm5qbnJmZnJ2dnZ2dm5uanJ2dnJycnp2dnZybmZeVlZeXmJqam5ubnZ6foqOhoKGhnJucm5ubnZqcmZycn6CfnZiZmZmUkpKUl5SPj4+OkYyNiYuQi4mLjpGRj4mQmJiQkoyNi5KQj5iYoqiqpqWlrKOmoZqep6eyqKKVo6Cfl39wcWlsXFtcTUY8NzdHR1g+SE5URjk+Ojg5ODc1PTk4NzMzOTY6Pjw6Nzo8Ozo6Ojo8PDs/PjtAQD47PT5BPDw2N0A+QkA+QUY+PEFEQT1DQj49PDlmmJSTk5OTkpOUlZOVl5iYmJaXl5iZmZqampqaoqGfnp2cm5mYmJiYmJiYmZmZm5ybnKx/am16f3lxh6Genp2cnZ6enp6enp6dnp2dnZ6enJubnJubm5ubm5yZmJmZnJWUnXt/nKKghox/YGaRoJ6fnp2dnp6dnJydnJ2dnZ6fnZ2fn56goJ+enZ2dnZybnJ2em5qbm52enZ6dm5ubnJ2cnp2cnZqYl5SRjo+QkJGVmJSWlJiZmpudmJuYlY2Mjo6TkpKRj4mQjpGRjo+Ki42NjYiIi4+Lg42NkY+MkI2Qk5WVnJihoJySn6SipKmam5eanKOprb3Bwbq8uL26ucC8ubq3uru7tL2zwbV/bnVmZ1peWUxJRTo7TElTPFZSSUM6QTo7Ozc3NTo6OjgyNTY4Oz08OTk7Ozw5Nzo4Ojw6PT85PD8+PDw9QTs5NTg8O0A/QT9EPTxBQkA8REM9PT06YZOTkZCUlJOTk5OTlJeYlpeZmJmYmZqbmpqamp+gnp+fnJqZmpqampmYl5iZmZmZmZmphXB1e4B3b4mhnp6enp6fn56en56fn56dnp6fnp2dnJ2cm5ubm5ucmpiZmZ+pnIprba6qoWd/i3pnl5+goJ+enZ6hoJ6dnp2enZ6fn56en6CenZ6enJydnZ2cm5qYnJuVmJqamJiYmJmSjJCXlKCXk4+MjYqKiImMiJORh5CPjYqKkJCLjoqMi4+IiImJjpGOjYaFiYaKhoWLiI+SkJCNkJKXlpKamJ2TlJ6kpqaqq7Gsr6+rpquqsbm5tbS0rqyvtMDIxcXBvsbDxMTDurW+t7a0s7C2tb6qcHRyXGZfXl1JRj8/RUtMVklcTEQ/PUI6Qzk5Nzc7OTk3MTc5ODo+ODg6PDw7OTc5OTs9Oj4/OT5BPDs+PD46OTY5PDpBPkNBQT08QkBAPkJEPj8+OVyHhIOHi42KiYaFgYqMkZOVmJiHlZaWkpiampmenZ+gn52ampubm5ycm5iWmJiXl5ibqo56dXZ7f3mCoJ+fnp+goKCfn5+foKCfnp2dnp+enp2dnJqbm5ybm5uYmZempYhwX2qklJhWZ3t9fJ2cm56dnZycoaGfnZ6dnZ2dnp2dnJiWlpaYlZWSlpmWk5GKjI+PjI+NkIuLj4+WiYiEi5GZjn2Fi42PjYyHioyQm4yRj4+Lio6TjIyNjIiSi4yFiYyPhouIh42KhYyEj4qXkJOYmpWbnKOqoaKknKKrsbe0ubWxtK2vsrKlp7O6sbq6vLa3tsDDw729vLa/urq8wbW4wL60r66mqa+3mm58Z1tjWl1fSEU+QUtJU1hZXkFGOTk9OkY/Pzo3Ozs7NjM6Nzo5Pjg6Ojw9OTk4Ozk7PDo+PTtAQDs8QjxAOjg0Nzw7Qj9BQj4+O0NEREBDQz0+PjlhmZWLkYWNj5aSiHl9e3+Fi4OKgoqJhmuAeJCLlpqRnZ2UlJGTlpeampiWk42Sk5KQm5uIdndzcX1/cpGgnZubm5yenZ2eoKGgm5uWlpucmpubnJuYmZqYmJmbmpqXqZlnRUh0mYOFT0VgdYCUkY2SkY+Uk5KXm5mYm5ePjpCLjo2Ch4uLi4qLiI2RjIeHhoqIiZGKh4yEhYqNi4qNhI+UkIyDkJOUmZWQi5OTkZWRlpWOj5GMlI2Oj4qIj4ePhoeJiYmNiomJioWNh46JmJKUmpuXmKChp6Cko5qqqbO2sbWwqKqiqK6tn6qvsK21ubi8wr/BxLixtbCutrOwuL68ury+urOzp7G3wpB1gGNiXlpXUk1IRkVQSVlXX1tDUDpCQz1HRj84Nzo6NzU1OTc8OTw5ODo9Pjo6Nzs7Pjs7PTs9P0E7Pz48Pzo4NDM3OkFBQEI+PjpDREM/QUM7PT45Z6mloqKZn6CippeUiI2CiIJ1h4iKiIp7e3Z7enmPeoiSfn18en6CkYWBgH1zfH99fISHfnRweHZzfHaBj4iIiYeIioyMkZicl4iOhIuNi4iNkZCPi5GPi4yPkJGQlq2EPTo8eIx2blE5NV52goeCjYuGiYp/iYqGiJiRiIOIg4KFfIuLjIaJi4iKkIyIi42PjI+Wh4mLio6NjY2Wk5OdnJyalpycm56bmpuYnpeTkZWWkJKRi4+LlpSMjYqDi4SEiYyQkIqOio2LipGJjZOTk5SVk5KcmZ6Xn6CfpaKvsamupKSfmKStpqa4t6ysu729wsPAv7+vpa2wsLS3uLO0uLa0ta6stK+4tLaBeXpjZmBeVlFRQUVMT0lcXl9UR0dCS0xCREA9ODg7OTU3Nzk3Ozc9PDk9Pj05Ozg6O0A8Oj06PkJBOD88Oj84NjQyOTtCQD9CPj04QEI/PkBEO0A+N2CloJqXnaGaoaCPl5efl5WCjaCfo6GdmpKOjIxycXBvdnFucG1ucHZub29waHBxcHR+c3FycXd7cnl2d3Jyd3Z6e3l8fXt/iIGEi3+PkYaNi4yGiouLiYeEgYaDfpijWl5sUHmhloNTY2pGZ3iBgpKQhoSEhY2DhIyPj4+IjY+Hi4iRkJWRjpCKk5eOj5WYp6SfnZWYlpaln5udq6aqt7W4srGnr6qnpqGfmp2WkpWVkYqPjImTjZuVjYuLhoaJjJWQkJCLmZKVlZSbkJiTlIyNkYyWl5WilZ6mqauno6OqsJucpp+mq6G0vb6zs7+5u7u6uby9rqiusa6wuLyztLGxqrCpqLGxsqild3J0X2hhYFRWUUlKSFZNXl5eVExKRVFKRUdDPTo5OTc0ODY4Mzg4PTo9PD47OTs4Ojs/PDw+OT9DPzg7Ojg8Nzc2Mzc5RT4/Qz89N0BAQT0/RDw+PThUj4yGh4eUjJWZl5yWmZaNlZyWlZydoKCdmpiWeHFubXJ4cXFsbnJwa3FvcG1yc3t1dnd5fnVxeHZ0d3tybn98gX15eH1/eYOGg4WCg5CLkIuLi46Pi4mJhYKCfn6djFmYo2+2vLG8gnmafU51foWOjYuGjZSSi5CXj5SXkpihlp6WlZunpp+goKawq6GjpbW0sqqmqq+isba5vcK7ucO+vLi9uLWxrLCsppuSk5mfm5SPk5WOmp2doJqfn5edo6qsoZ+em62hp6qwqaampJiRkZWUo6SirKSss7Szs6i3tru4sLKvra2yt7a6srW6s7e5u7i8urayr6yxsbKztLOxsa2us7Gzs6yhl3Zxc19jXlJRVE1PSUdYT1pcZFROR1VPRURKRD44Ojg3NTg4ODU5Nzo6PTw/Ojg8ODk5PTs9PTpCPj84Ozo5Ojk4NjI1N0I+P0RAQDY+P0I/PEM8PT46Tn98go6MjJOTl5eaj5SWjZaRkZSXk5qanqGdnHJvcnFxcXFxcG5zcW91dHJxdneAdXd8eYV+d3t8eX1/fICJiYmDfXp/h4GIiYGAgIGGiIKGi4eIhYSIiIqEf4J9oHiM3Myz1rGeuLxlYnJhYIiLjouNkJmclJSUoJqan6Ktsa6ppKWtr6ysrLWuvrmtrqm1sLexq7G2rK+9wsLAvrq8trKutraxtK66u7OurKepp6unoqmtoKmooq+wuLSxvLq6urK0ta+8tLezt7e7t7mtrbCprLW5sbeytLe2sLu7vLu6ury1vLi0wbWsqqqrtLG3uLm1trSzsKymrrCqq7Cxq6yusLKxtK6qo5N4dnJlZ1tMUlBFTUlTV1JlXmdUUExcUUhMUkNBOTk3OTU4ODY2Ozc5Ojs6Pjk4Ozo6Ojw8Pj08RD45Njs7ODg+OTUxNTZCRkREP0A3Pj5DPjpBP0BAO0t/gomXmJSdlpabmIuSlo6XkZGVl5SZl5+bmZx8dHV2dXl1c3RudnJzdHV2d319gX56gXyDfoJ/fYB/hIKFj52RiYF/go+Xjo6HgoCBiIuFfoqRjH+IjYyLi4iSippos8m0yNSvrrqndIupaliIi4qQj42PlJSYkJWcmp2eqK6ysLC1tLOtsrW4sLy1tbGqsKqztbS7t7SztrS1r7i4t62noqassLCvtre3vrW5vLOysa61u7C0r6+yu7axuMC9tLS0s7izvLq2tLrAvbm6ubq+ubm5vrWysa+yr6q1tLGzsbSzrri4tb+vpKaoo6ussa+zrq6wsKytq6qroqKmqKKnrauqpaynoqeYeHlxZmVZT09NSVJNV01PX15cTlVVYlFEVE07Pzk8ODk1ODc1Nzk1Ojo6OTs4Ojw8Oj08Pj4/P0I9ODY6Ojk6QDs1MjY2QUZDQz4/Nz49Q0I5P0I/PjtLjpGTmJmVmZGTopiTkpKLk4uOkI+Vl5ablZSbhoJ9enh2dHRzdH53end2gIKDhouMhISFioaQiYeRk5aRjZaalY+IjI+emJaVkpCTl5qamZGeoZ2Tl5uhmp6co6OTb6mbkcK+trGYjXddyppVgo+LmJqPj4yUmpecnZugnaSstLm6vK+2tLi0tLK3uLmzq6+qqKy1srK1rrGrrqa3s7OxpaGotbCvrayrtbqyu7q6tLK3ur67ubG4sLmtqLK4u66ttLS3tbu2trm5vLe0r7G0t7a5s7e1pq2pq6ior6yprq2up6KxtLG0q6aop6Cjq66oqq6orLKwr6+pqKGeoaGjpqOgopqlo56ol3J3bmdiVUpUT09KRFBLX2JYWlFcVGBNSFJJQUA5Ojg2Njc3NTg5NDs5Ozk8Nzs+Ojg8PD0/QkBBPTs2OTk5Oj87NjM3OD5GQkJAQjk+PUBDPkBGQj44R5OWkZWTkpSQkZ+ZnZmVkI+Sko6Mk5aWko6RlZGSkIaBeXJzdXuBhI6HhZGTkpicnJiVkJWYo5yaoaeqqZ+clpeVnaKioZyZnpmlqKyvramnqqqpp6KlqKmrqqmzoIeQeZSslIyPfXlyZ52cY3idoqSem5qkp6Spq66spaSoq6+xtK6qrK6zr6ystLO0ua6urayqrLKwsK2wqKqmsrS0uK6qtrqwr6qurLC3s7i0t7W0u7y4tbWxtauyrKiys7uvrbGytLa1sbG0s7OvrKuvs7a0sayutKqqpqWnrauoqKupqqifqbOwqqeppaOio7CtqaatpairrayppaSioKWipaOYmZyVnqKippdudWVnZFdPWUtLSktTVHBiWWRXX1tcUlpQTEM8ODk6Njk4NzQ3NzQ4Ojw6PDg6PTk3PDw7PkM/QT47OTo5Ojs+PTg0NThBREVEQkM5PjtAPkI/R0Q+N0KSm5SVlZaVj46Wl5qZlZGKk5SSjo+SkYqKiY2Ul5qTjYmCho6VkZSfmpuin5+jnqGhn5ijpKelpaapqa2rqaKmpKilpKGfnqOjra2srairrq6rq6ykoaKlqaenqaqOeFeDjXt6gHBua3N2fH12oKmnoKKirqyrqqetrqilpKmpqqmmo6iqqaekp66wr7Ovq7Crqq+yr7Czua+rqLCxrrCyubO0r62vtbCss7GurLW1tLSzs7CvrKyqrKusr7G0s7CwrrCwsKyqrauqq6alrrCysKumqbCvqaOkqaunqKaopquwq6mvqaaoqaalo6iwraqpqKKpo6WnpKGhoKKloZ2el5aYlJugpKmUbnNeamlfVlpOUk5RT1NlXGVjW11ZXFBZT0tAPDs5Ojc6ODczNTMzODo9OTo4OTo5Oj08PEBEPkA9OTo8PDw+Oz45NTo8QkFFQUNBOT47P0BEQENCQDdAkZ6YlJeZlpGHi5SSl5GIg4mLk4+OkI2Hh4SFlZmWmJeZlpqeop2ZnKKkoaCdn5qfoKGgpqGgoKCjo6KlqKmrramqpqOmpaCloKaop6aoqaepqaSoppqdpKaioamefGhLaXRucHhqaGRqa256hJako6Chn6GhqKCcn6GloaCmo6KfpKGspp6foaGkrKqnrKivq6e0sa6ur7WyrKqwq6mtrbWwrq6srreup6yqpKivsq+sq7Kvqqqpq6utqa6urrGxraqtqaunp6uoqauinaapqKilqKisqKilpKWop6iopqmsr6+oq6mhoqKlo6Opq6ymqKWjqKKhoKSdnZ+hoZ2bnZ+amZWcnKOqlG9zZm5yZF1dUFVPWE9eZGRsaGJiWlpSVE9NQTo9Ojo4Ozk1MTYzMjg4Ozk5OTk7OTk8Oz0/Qz5APTk7Ojs8QD0+PDk5PEFBRUFGQTo9Oz9BQUJBRUI4PYqWlJOYmpaPiISNjpGSjIiIiI+JiZCRjoqKiJubmZygpaKlnqKjoZqeoZyanZ6bnKOop6ugoKOYoJ2XnKGjo6WjoqKkrKilqaCepqmnq6mkn6Kho6ehpq6mp6evhGxiS11zbm93Z2JjZV9eanR+jpuioZ+doKOZlpqYo6KipJ+ZnKGhoqCbmp6goaSgnaejqrGorqusqaSqqquorKalrKqws6+rq6mwq6appaWoq6ynpqevq6Wnq6upq6irqqqrrailqKOmpaesqayoopykoaOmo6qpqKano6SnqKanqKepqKupoaKoo5yepqWjqKino6WlpqmgpJ6inpeYnZ+doqKlnpiUlZ6go5d1d2t2eGJfXFVZUVVXW2Nfc19oX2NTUVlUSD48PTg7OTo4NTM3MzM0Nzo4OT05Ozo5PDxBQEM9PT44Ozw9PEA/Qj86ODo+P0NAREE6Oz49QD9DQ0VDOTyCmJmenZ2alZKKiZGRl5GQh4SJgoGNj4+Sj42cnZ+hpKmlqaeorK2moqKfmKSmo6Stsa6yp6asm56em5qjp6Cfo5+foq+rq6yoqKuvqaiqqaKgoaiprbCztbyylm9lXEdWdnJzfGdhZGpaWmBjbXh/ipmioqGimZaem5+fpKGblZigoZ2enJudnZuZmZWen6Oonp2iqKGaoaOmoqSoqaqoq7CxqKWlp6eopKWpqaqnoqWmqKadnqWloqClpaOlpqCjpaOjpaelqamqpKekpqKmp6SrqaenpKGlqKynpqWlo6OopJWdo5+bnaCjqaeopqGjo6mooKiioJyVkZqfn6GmopuXkpCamqCVfHdvfXlmW1tgX1pcVlxoZG9jbWlpYl5QUEA/Ozo4OTg8OzYzNDMzMzc5OTs8OTs7OT49QkBAPTs9ODw9QD08PENBPjo4PT9EP0M+Ojk/PEI/P0FEQjk6gJ6kp6Kem5+gmY+ZnaCWloqGj4iEi4qTl5SRo6Wnqq6trLOys7S4t62pqqevtLKxqq6usbKusa2lq7OssbGpq6+rq6y2sLSwq7GysaOgo6uqqK62uLzBw72vmXtlZFtAXWxueHtrYV9nW1hgXmFmcHN5gZOiqJ2eoZqWnqScm5aZoqefoJ+joJuUlpmWl5qfoJmVnqGZmJ2dpZ2gpKeqqaiqraylqaSlqqeqqaqsp6SkpKOimZmhnpqaoaCfpaWYnqSmpKqooqelpaGqp6mnp6ejqKWmpaGkqKesoqekoaalpaOVl52Ym5mVo6elpaSfnZ2lo6Kqo5+amZiXnJyaoaGakJOTl5ibjX93cnZ4amJbX19cYllgZG5ta25hX2RgUE9BQDs7OTs4Ojk2MTQzNjQ3Nzc6PTo8Ozk9PUI/Pj89PDo/OTo7PD5CRUA9OTtAQT5DPDs5PzlAQEBAQkM7OXuao6OcoJ2dop2Zn6KioJibmJaYkpSQm5qWl7S0rrW4s7S4tre0uLm3tbm4ub28uKqLnLK4vLS9urW7uru4s7q/uLe5u7G3r6iusq2inaCrs7rG0NrVxrioln1nYmNVPV5qbHZxcmRiY1lXXF9dXWFoamtue5KlrqelmaGko52goaKooaOgpaGck5mYmJmco56cmpudl5uZlqWam5+hqKmpqKuvr66pqKirrKytq6irp6WjoJyfo6Ojn6Cipammmpyip6Spn6GjoqKgpaanpqSooJ+ipKGjoqiop6OloaGopqalo5mbmJuTj6GknqKfmJiVoJuhpaCfm5udnJuamZugmo2YmZiTkYaAdnh4eGNbUllUX19hbWl2a3BoaWliWlNMQDw6Ozg5Nzk3NTU2Mjg1Njc3Ojw7Ozs7QD4/QD0+Pjk6PDk2Nz47QkZCPDg7P0NDRDw+OT43PkFCP0ZDOzhwkpqblJ6bm52Vl52doqajopaXnpaXl6GblJi+t7G4uba3t7i7l5S2vbu9vcDFtaK7mKC3v7+6wcm0nbu2sra/xcGooLa0urGqrrSxsLK0tb3S4OHQuqWSg3JhWVtbTz9XcmleW25sXl1XWVhaWlhZWVtkcoadusi+t6Gnqqynq6mlpqCnoKGmoZOWmJ2foqSjnZ6coaChnZekmpmdoKaqqqqtrq2tsLGrrK2sqamrrqimpaalpqSkpqaeo6eppKGcoKKjpqCio5+jpJ2foqWgpJyboZ6fo6GhpaSlqaOkpaKkp6ehn52elpOcoJiZko+MjJeWn5uWnJqdnJqSlpSUmJOQmp2YiouHgIB8gnhhXllUYWlgZnRvdGl0ZGlkYltMSz46OTg5ODg5NzM0NTI1NDY2OTw8Oz08P0E/QEA9Pj44OTs4Njc/OUJFQzw7PD5DREM9QDs9Nz1DQ0BFQjw3Z4yRk4qalZiblZWYm6Knq6aVl5iQlZmhnpeXvrWztLu6ubi5woeYt6u4u8DCxbOjw6e4s72/tMTHvbS7uL62wMTErqCworW2tb2+wcTHw8O8w8jO1NDAo35hVVNVWFFGSYJueoN/XlZYV1xbXVpXYHycsrzAxse3t7epr7Gwr6yqoqajrJ+fpquXmqifpaWfoJydoKuwsKyiq5yYm6Cor7Kys6uorre1sq2tqaalqKulpaStqaShn6Cnnp6mqKmmnp+anqGlpqmcnaObl6KmmpuanZ+cmqGcmZ2eoKijn6GfnaWioKOioZSZmpmTj4qLhI2Qk5uPjpiVm5eYkJORkomNl5iYk4uKi32AgIVwYGJfXmtjYm54dXdubVtiUlZcTUc7PDk3OTc5Ojc0NDQxNDM3Njg8Ozs8PEBAPUA/Pj8+Ojo5Ojc6Pz5FRUU8PT1AQkJCQUE7PDhAQ0NARD87NV+MjIaFlouUlZeYl5ifpqellpWVkZebn5ual7mxtrO5vLy5urWqsryxvsG0vMe5uLuuv6fGw7/KxsnIxcXJvMLHx7+xsKe8vL7FxMbJx8XGu8TBxcjIxb/FrYplVlhVUUlrdaOso09VXF9hXF1skLHEvL2uqbK3q7WyrbOtqa6vp6awr7Ktqq+zpKu1qaeopKCgnqmyuL61tbWqqaausre4t7apq7i8ubexr66noqOop6SfqKOfnqCZoZydoqSnp6GelJuaoKGlnqChnpajnZSQlpiboZqflpORlpSin5qenJudoZ6kn56VnJiPkpOPjImTkJefiZCWkZuUmJGRlZaDjJWXlpKLjIh8foR/amZoYWtsZ251cnJ1cWdeYFxSSUU/Ojo6Nzg0ODw3NjU0MjMzNjU3PDo7PDs9QD4/QD48PTk5OTs6PDw+QkRFPj49QENDQkREOzo4QkJCQUNAOTJbk4iEjZGKi5GRlZCSmp2fnJOSmJSdnZqXmpW2sbm1tb6+tri1uLO8vMTEusPHwb+0s8XFxr/CzcfLzsvLx8HDxsfIysXExcO7vLzBxcHFxL/Ew8bGwLGUxMjSu4tmVVZRVmairp1OVldYW2eHs7eusK2ypqqqqqutrKmlpZ6pr6uyu7q4u7e5t7O5uLOurLO0qrC1ub3Bur6+vL60urm4u7qysbS8u7q7s7Oyp6Smq6uioaCdmpudmpyXmpuenJygnZaclpuZnZ6io52UnJCNiY6OkZ6bnJWNh5KLmJiWmpybmJybnp6cmp6UjpiYmpSRmZeeoZWYmpKXlJWRlJqYk4+TnZaSi5F+enx/dWtsbmRvbWlxeG96amlhXWdhUUZEQTw5OTc2NDQ6ODQ2NTMzMjY1Nj05OTs7PT47Pj49Oz05OTs7Oz89QUNBQkFAPEBDQ0NFQjs4OUQ/P0BCPzsyV5uQkZCQh4WSjo2IjZCTlZGPjZSUm5STlpqRs7e4uLi+u7C1sri2tbbAw8G+w8LAvru+u7u8xMzEzNDLxsa/xcfLyNTLysjGv7u7vsS+xcjGxsTExLm0wLazvsbIsIBaVFNQmbGRR09WWXGOprywpa20tayvpaWjp6SgoKWZqrSxvsG+urm6uLW0srG0tLO6wL7Av769u7u9vsDCt7a3tru7sru+ubi3u7a3tKyoqamrpqijnpOampyYkZKZl5GRmJqXnpiWk5acm5+elJOJiX6GiIuWlJiZkYmVkZeWlZmbmpaYl5idnpyhmJWZmZyYl5ybn56jnJ6WmJeTl5yZmZyUlp2UlpOJdnl5e3dua2lodlpncnhzeWZmXmRbUlhJRj87Nzg4NzYxNjk3NDQzMzM2NDY7ODo8Oz08OD0+PDo7PDs9Ozs+PkRBQURCQEBBQkNDREM9OTlCQD8/QD89MkyWmpaSk4yKmJCKi4yOkpKKiIaNkJiKj5CUl7O7tba/vb2xtrjBvby0uL/Bsbi3vsHFvbu8wsbJv8jOyMHEwcfKysbKxczIzcbIxb/DwMvNz8rGxMPEwsW+uL3AwsLDoW5VSo22hUVLWn6hoqe0sq2suLWzrKmjoa2prKetn6y1tL/Cvrm4vbawrausr7W0ur7Fv7u8urO5u7i5ubWtsLS9u7G/vLiytrmzubu0ra2orKyqqaeXnpualY2MmJSTi5WWlJyZl5WWmZKYn5mQiop+iYqKkY6Vl5OUn5mWkJSZmJmWmJOUm6GeoZiYmp2ZmZaenpibopqdnJuYmpuZlpeXlpyZlJyYfoB4eXV1ZWZpamheam9ueXhjYmFgXlhXRkU4Ojg6OTc5NDQ5NzY2NTEyMzM0Ozo9Pzs9PTo6PTs8Pjo7Pz48QkBDQkJFQj0/Q0NDQ0RFQDk6QkFBQj5CQTVCkJeUlZmSj5qQjpKRjZSVi4qHjI2UiImPkpq2u7S8xsHEwr3BxcLAtLO9v6ywr7rDysPCvs3IxbfByMW/wcLIy8rCwsTJzM3Oz8zDx8bIycjIycfFycfIx7/Ex8TEyMvGrHNfdl9LV5a3ucC9vrm8ury6vKytpqm7urm3v7K1uLLAxrq3t8Gzsa2tqau1s7u2w7a2vbWxt762s7e4sLW2v7uwvbq0q7CxsbO8urOzrqutq62xnaOjoJqQjpiXlZCclpaYlpWSnJmTm5+clpGUjpWQiYyQlZOUm56YmZKSnJedlJmSk5aZmJ2VnJ6do5yVnZ+TnKKcnKCfnaOemJSVl5ebmpmgkH99cXRxb2NhZ3Zpamp0bnlsXWRbVWBZTEhDNjw5OTg4OjUzOjY2NDQxMzUyNTs6PD47Ozw9PDs8PTw7PD49P0E/RUFCQ0M+QEFARUVERUE7Nz5DQkI+Q0I4O4+akZaalJKUjZCUlI6VlI6Pi4yJk4uIkJObt8C6xsXEw8zCwcS9vrWvt7uvr7O6wMfFxMHMy8W2ucDCwsTHytHLwsPExsnFzNDNx8zJwsLHwsvLyMfMyc3FxcXDxsXIzNTMhklMV6DJwcjNxsTBxMfBvL60sbCwwr6+wca/vri2w8K6urbAvrWyrKmvsri+tMC0tLi0t7nEua+8vrm+v8K/tbq2q6qsrq+wt768trSura2utaSlqKimmpycnZyeopydmZOQkp2VmKCdmJiVmZmZl46MlH2QkJefmZmYk5GToI6Nko+VjpCUlaKdnKSem56elpyjoKGipKOkop6amZubnJ2enIN9cnx4cGdga2p3bGlmdW90Y11iVFdVU01HOjc7OTk3Nzo3NDg3ODQ1MjM0MjU7Ojk+Oj08Pz04Oz05OTk9PEBBQEVCQUJBQT9AP0RFREVAPDk+QkNCQENBOjSAoZeUmZiVkImUk5aTiZGMlJGOiJaKi5CXnMXLw8O8wMPHwbm9vbu4tre3rrK3uLzAwsDCx8bHurzAwsTHyMbSycHDw7+/vsTLyMrLyby8yMfJzcjDyMnJxcXCw8HCxsbGysx7R4XOzcfM0MW2v7/AwLq7vbWzs8C/ub/DucC3u8G8uri7ub27srCvsKy5wri9ube1t7q9xb24xsjCwcLGwr28tamurrCwr7O6t7m2sK+tr7OppquprqannqSlo6OjoqCblZiekZecl5GRlZeZlZmRlJiSlYyYo5qcnp2FiZ+TfJKWlZKUlJennaCipJ+en56foaGkoqKjoaOinJ2fnqOhppl5enl/cnBmZWdjamRia21ub15ZXVZWTlBKRjk5Ozk3Njc3NjM3ODk1NjEzNTI3PDs8QDs/PDw6ODo8OTk4Pj1APz9GP0JBQz89QT5ARENDQTw5PENBQ0RBQDozbKKdlZedlo+PmJiZmIiSjZGVkI+Vjo6TlpbKy7u5urnBu7q3vsG8vLu5sa61uri4u8S6vsC+vru8wMXBxsK+xsK5u8O6uLm8vsHHwca7ucjIw8XEwMPBwcDEwcK+vcHAv8DHpUqf0szFydHBr729uLm7u763tLG5vrO8vrG5tbi7try0tbm2uba5t7GtusG6vMG/t77Ev8bDw8fHwrvAwr/Cv7iys7O1tLGut7S3tbSxrK2xp6Wlp7CtqJ+nq6ajqKWmpqCgn5SYmZSRkZWUl5OYl5qhnZ6hnKGdoaWglpSbkZeXmJqTnpmZqaSlpKWdoqCanqCkoqOcoqGjoJ6cnp6ppaiVfXuDeG5mYWRiYWNjZGpjZ2NbWlpdWVFPRT07OTo7Nzc5OTY0OTk6NTMxNDUyNzo7OkA9Pzw8OTc3Ozo5Ojw+QD8+RDxCQURAPz49QkRCQkI+OjlCP0FCPT44NVmfnJiTmZaRlZiYmpeQkZCQk5GTlJKSkpSUxce4tbq5wrm5vMPFwri7ubGxtry6tbnAu7u5tre0tLW/u72/ub66urTAuLW3sq66u7fAt7zKz8G7v8C8u8S9usDEv728uLzAxa9Pmc3EwMHJv7DBv7q3u765tbi0uLy0vbi1tLCzvLG3t7i/tr25vb65t7q+u7/Axb29y8PGw8TAw762ubq2v7i7v7y4trOyq7CwsrWzs66sq6emnqeurauiqKumpqqjp6iqo5+Ym52bmpicnJiXnJuhpZ2anqGhoKGmoJqbnJiboJ+dnJ+coKiho6SknaKfmqKgop+el6Shop+dmpieqKWhi3x5iH1xZGFiY2hqZ2dpZWleVlZUWU9TTEY4PzY7Ojc3OTs2NTo7PDYzMTM0MTc7OTg/PT47PDs3Njk5ODo7PUA/PkA9PT9CPjxAQUNDQT9DPTo2PEBBQDw9ODdJlJibj5OUkZWYlZGWkpWRkJGUlZSTk5OYlcHCwLq8ub62uL7EwMKxvbqytLO4vLW3vMC8vbS0sbC1t7W7wbi+ub+8vLe0t6+ut7W5v7vB1Y67v7vDtbrHt7a5u7y4ubW6xMiqUJHJv7+7wb65xr3Cv7zFuLa3tLi2tru7uba0t7q1s7i8vbm/ucPAwLu5vLu+vcjEvcfEw7rAvb62sra4srm0usLCureysaysq62yr7Kur6ijpJ6rrKyqpKakpKiqoqemraihoaGmn6Oiop6bnKKfoKOdnJuhn6KgpKCem5eZn6GdnZ6eoaWkoaKioZ6ho5yinqCZnZijn52eoJqZoKKmnYR6g4F5cW1mZWZwamVraFhZT0tLS1JKTEhEOT44PTs2Ojs5Njc8ODk4NjA0MzE3OTk7Pz0+Ojw6ODg5PDg6Ozs7PD1BPj09Q0E8P0NDREA/Pzw6Nz5CREE/QDg4P4mYmoyMkI+Tl5WMkpCakpGXmJaUlJKQmZTDvsbBwby8uLi6v7a8scK2tLyxtLa4s7q9v768sq2vrLGwt7y3u73BxLm3t7a1ubm6u7+8z8V5rMy9x7e5uK22tLe5s7WyusXKnlKIyr+/vr28v8jDxcW+xri1srK9uLi4vrq6uby6urS3u7q5v7zEwL+5uri/ubvFxr3Fw8Kyur27sa+2uLO3s7q+wLm2rLGrrqmqqa2qqq6mpKWnrq2ppaOio6GkpaWmoqato6Klo5+ho6Gcmpyhn6CloaCenZygnaWgnpeVmZ2fn52gn6KmpaCknpybn6Ofn5mcmZ2epJyWnKOcnqGcppZ+f4d9a25xZ3FrdGZibmBcVEhLS0RKQ0NHPzo7OD48Nzs7OTc4Ozc8PDYyNzUxNjk8PD08QTs8Ojs6OT45Ojs9PUA+RD89PkRAPz9BRkQ/Pzw9OTc/QUNCQEI5Ojl3nJiLh4uQkpOWjY+TmpOQnZiSkY2PjpiSvbfHvsO+vbu+vL22uri9ure9s7OwuLi1uby7wLeqraSusLi7sr2+u8S2tbi1t7++xLzCxNeudoS9yM/CwLiutbW7vbe5sb7Dx5NYg87Dwr++vbzHzMfHxMe9tbW2wb27u7/CusDCv7y2t729vcHBwL+8ube8wru3v8W7wr++tbe8vK+vt7awtLO6ubq7r6mtq62rrKaqoqeuqKWqra2vp6Sgn6ajnqKjqKOjq6Oiop6dm5ublJaZnJyfpZ6fnpmYnpejoJyXmZqZmqOjop6jo6egpqCbnaCjnp2WoJmcoKCblJegn6WcmKKQgYaAcmZsam51b3hjZ2JcY1FLVUhFRUNHQzw7OTg9Ojc6PTo4OTs3PD01MzY1MDY4OTo8O0A9PDo+PDk+OTk9Pjs/PkM8Pz5APz4/P0ZEQEE/Pjo3P0BDQz9APTo4ZqGYj4uNlZKVlY6PlpmVl5uVjoyMjY+bk7m2wbS/vLm8w8C+wLq1trKywLmvsry8sLe7tru8qqqjsLm9vLK8vrzFuLG4ubzGycrCx8nRmXN2sNHRzMrEtbq/xMi+vrS+wL+CZnjLxsK+wby/w8zKx8XGwLm9vMS/v7/CyL3Hx8XFvLrEv7vBv7rAvLu7wMS9t7nCub69t7S2uLqur7WxsLCytre0t6yurKqsrKuoq6Gms6qlra+trKippaOkp5+io6Onoaeiop6cnZyamYyQlpeZnaKZnpuVkp2UoaCdmZ6fmJimpqKfoqKmoqeloqCko6GbnaCbnKKfl5WVnp6kmpafiYGDgnRvbGx0bGxuX2NeYWJOSE4/RUA/REM7Ozo6Ozo4Ozw6OTw+Ojo+NDQ1NTE5OTo5PDtAPD89PTw4PDs6PDs7Pz5DPkI+QD89Pz9FRUJBQj87Nj9CRUQ9QUE6OlmfmJOSlZqVmpOQlpeclZuZlpSVkZKTnZm2uLaxuru6vsG5uca7trWypb69tLbBv66zvbS4wbGwsbS7xdDCur68xL63vMC/yc/HyMrKwod1dqfMzMvNysbCw8vOwby4vLqwfXdrvMjEwMC/xMDKycPDxMO5w769ub+8wsbCyc7Hxr66xr26v7m3wLm5vsDCvrW0vLi2u7CvsrK1r7Cvrqyus7CzsrirsbKxqrCrq6yrrLatqKyusqarrKmpoaWgpaakrKSmoaChnqGgnaCMlJeTm5+mmZ6emZOYnZ+gnp2eopuYp62ooqSgoKKqpqmhqKGlm6CgnZ2jn5SYmKKdp6Gfm4J7eoh7bW14fGBxZFteX19UST5DRUlCQz5DOz42OTo7Ozs7Ozs7PT05PTU2NjIxODo5Ozs6QTs/PDw+Nzs8Ozw9PTw9Pz5BQUE/P0FCQUVDQkRAPDY+Q0RFPkJEPztTmZuZmJ6dmqCalpyZn5KdlZ2boJWWlJqYur20sLu8wcTCv8XGura5sqO7vbS3xLuwtbq2ucS4tLy3u7us28O+tr7Avr66ppyqs7fDwKZ7eXuexMbLyMHDwMDJysG/u7mxo5GFeq/IxcS/wMG/y8fCwMjAusK7urO6usG+wMrOysS9tby8ub+5ubW1s7/Avre0s7S4rbeqr7CwsrGvq6+nr7ausrG5rra2uLSzsLGttrS6sa6srranrLKsraSjoaenqLKrqqWkp6elpaCml5ujn6SmraKeo6KanaWiop+foaWenrC0sKSlnp+kqaevp6mgq6CiopqipJ2anqGmp6+psZWCe32Cem5zeHRocF5cX1xaUUVFRE1JQUQ9SDs7NTk7Ojw8Ojs7Oz0/Oj01NDUxMjc4ODs8O0I8Pz46OzY6PTo7Pj0/QD87QUFBPj4/QkBBQkJFPjo1OkFCST9AQkA7TJqdnZ6fnZienZmampySoJWbnp+blZGRl8W+urbDvMbCvr/Ixbe1uLe2ubu0r7e3srWzt7m8u7a7u8W3ba7Ovba5wLyqfW5obm10gpeZdHp+mr6/xsC5wLy+xcS9vbiyrqSnkpKdysPDvL2/v8PDvr/HvLy/tLSutbW8vr/OzcvCt7K4t7e9ubuxtrLIwLu2tLGwt6yzqbCtrbS3r6uuqrG1r7Gvt7O6usC/tre2sru6wLWyrbO3rLC6r7KloqWrrK+5s7KosK+xr6qiqKGkraitrLOun6inpqWmq6Sknqaqo6ayuLOrpZyfp6anrquqpbClpaWbpKOYn6exrLW4sLKOhHl/fHdtdntxb2pcYGBZU1BBRklHS0BFQ0g8PTY7OTk8Ozo6Ozo9Pzw9NTU2MTM2OTg8QT5AOz1AOzs5PD04Oj08QD46Oj49Pj09PkBCQkJBRD03NDU9REc9Q0I/PEWUnqCgoJyXmpiYlZmdmZ2fmp2bnJaRj5LDwMK9wrzEvLy7xbu3s7e2tru7s6CWtayvsbS0tLa4ucDNsnaCs722tcGkhmlaXmBOU1tccHV5hKO4t8K6s7u3u72/uru7r6KorZ6kgb7Fw768v7u7uLbBwrW/urWur62wvcC5z8rJw7GwtbS0vbq+urq7ysO7uravsL2xuK+ys7C3vbaur66wt7CsrLK2vbzEwrq9t7bAv8G3tbC2srGzurGxr6err6u2v7e1qbqztbmxp6uop7ausrG1uaisrK+qr7CqqKessayytr20saykqKuoqKusq6i2qaaonqadmKOuvLG7wbSmiYF7gnpzdnZ3b3JhX2ZdW1VKPT8/R0c9R0NDOTo1Ozk5Pjw8Ojo8Pj4+Pjg4MzE1Nzg5Pj9BPzs6Pz08Oz09OTs8OTs6Nzs+PT1DQT8/QUJEQkE8ODU4PUNGPUREPzw/iZ2en52Xl5WUk5aZnpubmpuYlJ2Uio6Owb7Dwr6+vrm2usCxtbGzt7fCtbOrrbOoqa61r620trnCyaeEeIuhsLWcamZnVllfSUlNUFRueYmpsLe+ubK1sry5vLa5vrWWqryrsXesysTAvb+5s66yvLquu7Szpquorbq+uMvCv76sq7Cvs7q3ub67wMXBu7y3sLXEtb+0uLu0u8PCs7a2sbisqaWrsr23v7+7u7exvL28trGvq6uprbOvsLCrsLSpuMC2sqm0tbC3tq2spqu7s660uMKwsbG1sbK1saywsri4ubi+tLGzrqyxramvrqqyuK6trainoZ6ptr+4ur+wlol9gHxxdXd0d3JsYGNhXF5PSUI/PUlERk1EQDc3NTs6OT48PDk4PT47PT86ODMyNTc2OD8/Qj86OD4+PTw5PDk7Ozo8Ozs6PEA+QkI9QEE/QkI/PDs3OjxBRD5CQz8+QYqgm6GdlJiVlZKYmpyWm5WalY2bj4SIhru0vb+7vLm3s7y8rLOytLS2wLXAr7Kzqqqxt62pubO3v8aph3t2jKGYX1NDWVVIYmpVT0VKY5Ckrq+2urW0sqy8ubi1uMG9jaK+r7B2p8vCv7m6ta6lrLOxprCtqJ2gn6WttrXCt7a0paiqqLC2s7K6tbu7u7W4trC1xLK+vL+8ubrFybq9vraxp6SeoamxrrW5trKxq7S2trGopp6gmaWmpKynq6y2qa+6sa2kpq2lq7GrrKmtuLawsrjBtrGxtbGvu7ayt7W1sry1urKwsbKutLKqrq2nuLWyta2uqqiosrq9wLa0qY6Ce393cHxvdnNuY15nWV1dU09OQT5KQkBKSkA2NjU7Nzg+Ojs4Nz4+PDs/OjkzMjc1NzU8PD48PDg+Pjw8OTk5Ozs7Pjs7OTw+P0E9PEJAPz9CQD47Njc6QERBQ0E/QUKJoJ2loJSWmJiVnqCcl5uYmZGMmYmDhoS1r7S7u7S1sLG2uq6wtLOvtbq1urC1s7KttrqvrbyzuLi/tJCBeYiQbk5LP2VZQk94gZNoTUJehLG1s7WytK+su7q4trm/xXeKtKeeZqq/uLWysa2tn6Smp52kpZyWmZmZn6muuayrq5+lqKSrrq+nsKuvsbGtsa6usLmwtLy+uLm4x8W8vLu4qaKcmJufp6assq6zqaapqq6popqXl5GcmpijnqKir6ekrKaompqemqGnp6anqa+2squ0tq+qsK+xqbm2sbWxrqy3s7avrquuq7S1ra+rq7GtsbKoraurs7W3ur2wq6GLeoJ5cnZzbXVqbF1ca1VdW1BOSERHTUJGTkY4NjY1OjU6Pjg7OTc8PTo7PTo5MjM2Nzc3Pjs9Pjo6Pz48PDw6Ojs5Oz47PTk8Pj1CPDtAP0A/QT8+OjU1OkBFQkRBQEJBiJ+ipqGYm56dmqWpmJudmpmUjJmHhoeGrq2uuLmxsqiur7iyq7CwqrK1ubm+tbK4tLm6trm7tbWzt7aVjIiEfFhGQU+HWEpKWXiOg2NBVKO5s7SysLGtsLm4tru3u72So7OupHSssKmrraujqKGdnZ6Xl6CVkpaXj5ifqK6ko6Sgoqaio6mpoaanpaqtp6ynqKesq6yyu7SztLm6trK2ramgmpaWm52fq6yqr6Oko6GpoJuTjo+QlJKSmZaanaSloJ+ep5iVkpSZnqSjoaWqrK2iqaqppKmtrqW0sa6xraqprq+wraWmqqSos66trKmmpqmrpqqnq7Ksr7Oxq6mWgX+Bd3J4aHV0b2VVYWRXXVFPTUhASVJETUM9ODg3NTo3PD46Oz04OTw7Ozw7ODI0ODk3ODs7PDs4PD0+Oz08Ojk8Ojs9PTw6OkA9PDw7QD5CQEE/Pjk1ODs8RkFDRD9BQYijpqKjnqCfp6Coqpufm5yZmI6Xi42PjKqpqLGvsK2lp6ayr6mmq6CvsLu1vby4wMG+vLy8ua6sr7K8qZiZlWhNQFN5cVBJSUtonIBaRVSvu7Gss6+urK22trK0ta6pp5+am56fpqieoKipn6GnlpuWl46dlI+Qlo2Xm6SooKCioqGlpZ2jo6CepaCkrKWmqKSio6OrrLOuqa6urqeqraisoZyamJmYm6qoq6ufpqKbo5yVkIyPkJCTkJeVlpifnp6bmaaXk4+Slp2ioKWipqSnoKKko6Ghq6uksq2qrKyno6yuraufoaKkpK+srKmmo6KqpKqqpKmrpqmsq6ahiHiDfHZ/emN3bG5dUWlVUE9HUE1MQ1BRQD47PjQ5OjU7OT07Ojk8OTk8Ozw8OzkzNjk5Njo7Pz06ODs6Pjw6PDs5Oz07PDw9PjxAPT88ODtAQEE/Pz45NDk8N0FDQkQ9QEOOqqSjoqGinaulpqimoZ6dmZ2PmJWTkJWnpKGmqKmlpKChp6uhnKKbp6u1sry9wMLCwL7AuLSnpKyovcKqpbxnRFObf1FYSUthSlaOYmVkgq+1qrK0rqqrr7Cys62lnZGXk46XoJ+ioJyjpJ+eqJSblpeMl5GNkJeTmJ2jqp+fn6Cjpaicn6ChnKKfo6ionKehoKSfrKisrKCpq6agpKimrKOenp6al5qrpqqxo6WonqCclZOQj5GRmZCWlZiXn5icmZukmZeUlZqdoJ2nqKWgo6Kho56doKmqpa6upqipoaKqrqqnoaCio6msq6eppqShqaKlqaalpKKmpKijkn58f3V2fW5re2RoVlJkTkpIR09TTktOSDxFQDwyPzg1OTs+Ozk5Ozg6PDs7Ozk5NDg7ODc7Oz48Ojk8Oj07Ozw9OTw8PD49PUE+QEJAPTc6P0FCQEA/ODU1PDpAQ0BEPkFGlq6koqWeo6KpqKipqqWmnp2imJiZmZWbop6bnqOioKOgoZqgmJeXlqGorK62t7q5ure3u66ooKGpoKrGv8qfT0FzmHNQbkpMY2Z1dGBcYnORsq+us7WqpqyropuZlI2RlZaYmJyfoqKcnaSemqSXl5eWkJKRkZOal5ugpKqeoaGepqeqop+gp5+dn6SnqZ6jpp+qnaqtqq6nqLClo6Smp6ymoqWimpmer6iusqulqqqgm5iYmJWTlpqTlZWalpuXl5ihnpyclpuhm56ao6eln6GioqOdm6Gmp6aoraOppZ6kp6mkpaWhpaSsrKmmq6eioKSjpKenoaCgpaKmoIl7gH13eXxleXlgYlNWYUhJSktTVElTUU05P0I2Nz02NTs6PDw5Ozs4Ojw9Ojs4NjU3OjY5Pj0+PDk5PTk9PTw+PTs7PDo+PTw/Pz9APT03Oj5AQEA/Pzg2NT08PkFCRkBAR6CupKaroaOqrK6tp6ypqKCipp6bm56aoJyalZmfn5uen56WlJOXk5KcnqSorq2sq6uvqq+pnpeepZylxsaMV1NKZqRaZn1vcltRa2NcZmJgbJG0sLC4rKahnJ2alJeamZCOkZWRjI6Nk5minJejmZqXmJmUmZiWnZufpaapoKajnqeurqumorGjmqSmpqqioaqiqaSosquxsqu5qKarp6urqaysp6Ggo7GusrG0qrKuo5mcnZ6hmJubmpiZm5SWm5aZnKWhoJqjoZqcmZ+kop6gn6KmnZulpqWkpaijp6OepqOinqaloqWlqKykpq2noJ2eoJ6gpaGenqWgppmBe4F8dnZzaIJsZVtTWlpNUUpPT1ZNU01CNz5DNzg9NzY6PDw9Ojw5ODo7PDo7OTc2Oj01OTw7QD03ODs3PTs9PT06Ozw4Pj09QD5BPj4+ODg8P0BAPT43NTg9Pj1BQEZAQUihqqCrq6GkqquwramtqaelpaWkoKGfnqWXl5SYmZ6YnJ2blo+VmZKRnJihnaqip6Cep6Gln5ySm6Kan6qjjHlVaXJ3dXBjd3ZYV2NgZGlaWldnra6sr6efnqKglpCTm6CbmZeSk5+coaObnpuWn5qfl5uinqWhnqSfpKitraisqaSstLe2sKe0rKKtraOvpaSmoamorrWzsr22vrCssa6tqaq0sbCoq6iztrizuK2ytKSgnaWgrKGhoqGgmpiWlZ+bm5iloaCeo6GgnpucpaCfnZyhqJ+fp6meoaOkoKagnqehn5ymo5+ipaOooKmrpZ+dnZudmqainpyjnqeQgYKAfXh2and1Xm1bUmFJUlVIRlVXSkNNRz1LSDhGPDc3Oz49PDo8OTg6Ojs6PDk2Njo8Nzs+PT8+OTc9OT47PEA8OkA6OkA/O0A+QUA9PDk3Oj5APzo+NzU4PT0/QUBEQEJGnKueqamipamprqimqqWmp6aoqqGlpKOmkpOVmJacmpqcmpWTmZuNk5+ZqJ2un6eenKGdnpqZkpiem6GhoKR/b4JwYGNYTFtSWkxMUVlSSE5OSJmsqqmkn5+ZkpKUmJiWlpWMiIuOlZ2cnZ2el56Zpp+gqKWxqqeuo6uutrC0srGutri9v7qttbSwt7CutKmmpKWsqbmztbvDvMPBtrq2q66xubi8r7OwtcK8t76zs7WirKKpqLKpq6inqJqZnpqqp6CZp6Cfn6iopaSenaqiop6bn6igpKetmZ+jnp6nnqCmnpycoqGbo6KhnZympaWkn6KZnJukn6CboJyjiYWFfnZybWl3bWhtXFhcQ1dOSkdNR0NGTTw+TD40PDk2Oj0/PDs6Ojg4PDk6Ozs8NTQ6PDg5Pj4/Pjg4Pzk8Oz0/Oz1BPTo/PjxAPj8+Pz08Njs/QT07Pzg1ODw8QERCREFCQ5WqoKapo6mqqKmjoamgpqinrK6lqaWpqpSSl5mUmpqanJiYmZyamJmqoLGit6Swpp+enZ2XmJWZnpuco56ciWJXXmVgV01RRz0+QENEPz5CUnipramqpZ+en6KjnZ6dmpyblJOVlJ6dmJSFnZqgmqukq7KwubKysbKxur28vLm2uMO+v8K/tru7wMS5vbusr6exrbHCtrjCxsDIysDKv7C5ub25wr64s7vGxL3DvLezqrOtqrO0r7Ouqq+jnayotrGto7CmoKOwsa6wpKWvo6GgmqGmoaSqqpmdoJmao6CmqKGcnqKemaSenpiYo6OhpJ6mmpuipJ6fm5ubnIeGgXx0cmtrdXJxaFZcUUZVSERKUEk/RUE0Rkg5NTw+Nzs8Pjw8Ojo4OTw4OTs4Ojo4Ozw3Oz49Pj02OEA5Ozs9QDw9QDk3PD07Pj0+PUI+Pjc6QUA+PD45NTg9Oz1DQEFDQkGRqqGlqqelqqimn6KnnKasp7Gyq62jqayVkpWalJecoqGbnqCinJ+psqu7sr+rr6ylnqCgnJyYmp+gmqCflXxfXmVgUUZEO0M/Rjw+OTZOfqqzp6OjoqCepaumnpiclJGZnZmVjIqGiIZ4bYigpKKrrLS8tsO9vrO7wcPCxcC/wsbGxcPIwsDFyM3QyMvDsre1vrK+xbu+zM3FzMzM0se+v8DCvsfGwrfDysrDwce/urS6u7W7t7C2sqq6sq67uL+7uqu4rauquLu1vK6uuKOmo56mpaKjqaaZm5+Zmp2nqqegoaGkmJSjlpSZkZydn6Sep5+en6KdmJmUmJSIhX56cmtkaW94a2VZW0ZLTEVEVE1FQ0U3Oj86NTQ5OTc5Pj87PDs7OD48Njo9OTw9OTw9Ojs9Pj4+NztBOj45PT45PT44Nzs6Ojs/Pj1CPj83OkFAPTw9ODY2PDo8QT9BQUE+kqugp66ooqulpKKipaGlqquwsq2upKmmlJWWmpaUm6SmnaGqp6KrrLy8v8PBsrK4p6Ghq6qhnJ6hoZ2bmn1yaWFXTkU+SVp8b2FBPVyOrqygmZubnp6Zl5eYko2Pl5eTjo2QjIKDgndycW1wj6atrrS5xbvNx8u+wczNzczHydHMzMzHycXGzNDS1c7Tyb3Av8O7xsXIxdHTzdTQ09PMysLFxsbKyM/AydHMx8bIxsK8w8G/v7+2vrOtv8DDw8fFx8Svv7myuLzEwsK6vLy1rqenraigoqmlmpagmpmdqKupo6SknpePm4uQmYmVmJugn6OdnZeempOTi5WPhYF5dHNlYmdyb2ZeWlpDTkxERlBJRENANTU1ODlCPTY4OkE+Ozs+PDk+PTc6PTk6PDg8PDw7Pz8+PD0+Qzw7OkA9Ojs6Ojg4ODk7QT88QD8+OTtBQTs7Pjc4Njo8PkI+Q0FAPpOvn6ivpqiro6KloKampKuoq62qrqKqo5Kcl5ebmJuirJ2frqalsarFxszOzb+wwaikqKytqqCdo56cnpVpZlxUSURAP0uGnqSYg6CyraOenJ+amJeUkpSWkZCPjIiEg4iHg4CBgYB5cXJvbHmktrq5vsvB09HTyM3O0dPR0tHQ0dHNzs7Qxc7U1djS183Gx8nMw8XKz8rT19LX0tXW09TIzMfMzcrTzc7TzcbJysrCxszHycnGv8Ozs8jFy8vLz8fKv76/vcHGxc3MycnAw8Cur7OonqKqo5qTnpyYnqaprKSlppaXipWFkZSHkpKSmZualpiQm5aQjIaRi4B7cnV2Z2NndmpkVldRRE5GQElRQz5CPDoyMkE8RTw3OTxCPTs9Pzs7Pj05Oj48Oz44Ojk5Oj86Pj1APkA8Pjs+Ozk9PTw5Njo6Pj08PEA/Pjk6QEE6OT44Ojo6Oz4+PEE/QT6QrKKiqaanqKSfop2qqKOso6OnpqyiqZ+To5iWn56dpK6bn7CrqKyxyc3U18/Gu8esrbO3rK6jnqOinaGbYVNMSkRDP0NSsNK9sq+mnJycoKShnZqUk5WUiX14cWtlYmhyb3F7hYqAdXBucXRwhbPDvsXR0NfW1dLWzdTW19TT0dPU1NPP0sTQ09bY1dbSy8nO0cvGzdHK0tXW2dbX09fYztLKz9HMz9DM09DAycjKxMzMzM/PxcfItsDLwNLNzNDGysnAxMPIzs3Q0c/Ny8jNuLe7qJ+lq6efmJ6jnp2qpa2pqKiSlYiQhIyRho2MiJOVmZCWjJiSj4aHjIR9eHN2cGNgZXJjXVJcSUpHQUVJSj47QTg9NTU4Njs4Njo8QD07Pjw7OUA7OTo8Ozs8Nz09Ozo+Oz08Pjw/Ojo8Ozs5Oz89OTU7PD48PD0/Pz46O0BCOzk/OTg7PT0+PzxBQEQ8hqugnKegp6Oim6CbqaSlqaCfoaGmn6ifmKSimqmmoqarmqOwsamotdDU19rSx8bLtLXBxbG1qKGkpaCioVlJQEFEQUZRdrKvppqUl5+cmqCgnpucmpWJd2ljYV9fYF9eX19dYWx1c3Bwb2xycXWSxMjH1NbX19bT1tDV1NrU1M7P1dTU0dHM0c7T19bT1dDP0tPRydPRyNDY19jR2NLX2dTVzM/Pys3Sy8/RwMbDyMbPztHR0sjMzcDLzcbTz8zOyMTLx8fJzMrU1NHVz9LM08K5xbGlqLWup5uoq6Wdsqiws62sk4+TjoiLjoOPi4SQjpmNk4+Zj4+ChYx8enFzdG1iY2ltX1ZQX0pKQ0ZDUk1APD40Mzo9NTI4NTU8PEA8Ozw6OTpAOjg7Oj46PTg+Ojo8QD08OTs9Pzk6Pz07PTw9PTo2PD0/QD08PT0+OjxAQjs5PDc0Oj48P0A9RkFEPYKknKClnaWlo5mcnaSeo6OfnZ+doJqnnpyhqZ+vraqqq52lrreoq7fY1NXZ2dHO0L+8zMm2vq6mqqiho6tlQzg9PkRYgqqon5eVl5manJ+dmJyckn1xZWNiX19hX15hYF9gYF9gZW1wcG5rb3J3d5zMwdPV09jY1tnR0tLXz9POy9LN1dTRy8/N09bS0dXNz9XV0cXR1MrQ1NXWztPR2NfX2MvIzsTJz8zKzMDKwMnKzs7Py9DOzszPz8jM0NDLzsvDysfJzcrM0tPN09LR0NDKvci5sK67ubWrtrCtqLits767sZqPoJSRjo2IjpCFkY2ZjJGRlY6RgIWJenZvcG9rYWRucGFXXFpJRkZETVhFO0A9MzM8PDg3ODU1Oz5APTk8PDg8Pjk8QDtAOj04Pjk4Oj88PTg7PkI6Oj08OkE9PTw6Nj08P0A9PDs9Pjg7QEE9Ojw4ODs+PD4+OkVCRT6Bn5mlp6Cfo6eam5+cl56eoZqdmpyappufpKefuLa1taykrK6+tLDA2NLX2tzWzs3Kw9LPwcGxqaytqaSxekhGQjtXjaGblZOWm56enpyTlpeUiGteXl5hZGJgYGFhYGBhXl9fXlxibXJvb3N0dnZ5pL/M1dHW1NPY1s7O08vOzsXOytLSz8fOzc7UzM7SzcvX1tDM0dTLzNDS08rO0dXS1dXKwMrCxc3CyMrDzMTGycrLz8vOzdDO08zGydDNyMfLxcfCxsrMzdDSx9DPzs7M0MXHwbi5vcPDvcO4srK+sbvDw7WqmKWhmJaSlZWSi5SNmpGUlI+PlYKJhnlxcmttZ2BgcWhZWGhWTUdMSVBRQjtDPjs2ODo4Ojo1Nz09QDs6PD05PD05PT06Pjo8ODs9OTtAPD47Pj5BPDk9Pj1CPTs3NzU/PDw/Ozw7PDw4O0FAPDo8OTs7Ozw9QTpFQUU+hJ6bqK2epKSqnJ6fmJKXm5+am56ZmaKVoamppcTCwb+7tbKxx8O4ytXW2drb2MzMz8jW1cTCta+0qJ+tl3hscHF5j5qNjJeVkJORkZWWlZCLfGVhYmJgXV5hY2FgX19gYWFgX11bXWdycnByc3Ftcnmlx9PPy9DQ09TKxcnJxsa/w8XPzsfFx83K0sjLzs3G0dLQzszUysfLzs/Hx8/Sy9DPxrrEv8bKvcPIyc7Fw8fAx83IxMzLzM/IxMTQycbCxsnFv8HHzMvMz8LLzMnHy9DExce7x8PIycLPwb28v7DByca5vaqwsqelnaKcmJCbkKOZl5mRlZiJj4J4b3Rka2BeZnFhW1dgR0hIR0lNVEc/Sj02NDM1NT09NDg9PT06Oz08OTo7OT89OTw7PDg6PDo6QD1APD09Pjw6Qz48Pz04ODk6QD4/Pjw7Ozs7ODo+Pzw7Ojc5PD49Oz49RkFDPYOgm6qupa6qq5qdoJeUjpedmpmgmpqcm6WysazJzcrIxL68uczMxtDV1dja29jQyc/P0dPIwre7u62jtn5og4Wkq5ONjZaPhYODg4F9hIR+c19bXl5eYF5gY2RjX11dXl9gYF9bWlxgbHJxb29rbG9vfbnRyMnKz8vNxLrAw7u7urq+ycbCw8DDyMrJyMrIwcXMxsjKzcnEwsvJwcHL0MXLyL+5wrvGx77Axs/LxMDDu8nHybzJx8XKwL7Cy8bFxL7Gvb3Bw8XMxca8wMnDxcfSxcHJv8rJxsjG0cPDxsOvxMvHw8q3v7y6tKmspKWYn5iso6Gmm6Ogm5V8d3N0ZmlaYW5tWlxYUkRMRkJHRUxERlNANTQzMzU/PDM6PDw7OTw8PDg7PTtBPTo8Ojs3Oz05Oz07PTs6OD4+PEI+Oz88OTk7Pz07QD48Ozk5OTk6Oz06PDo2OTw+PDs+O0NCRD5/pZypsqm0rrCdnp6YnImUm5man6Kfmp2ov7i8ys/RzMfCw8bNzs7M1c/V2tjZz8vSzc3OyMG1w76xr7ZsXnp9oZGKkpaGeoCFhX92eHVycF9bW11gYGJjZGRlZGBcXF1dX15gW1laXGJvcm9raWtwb3OPx73KxcvAxsKwtrqysrOyscK8vLy6uMHBwcS+vbm9v7nEysXGwr3GwLi7xMm/wcm7t7u6xsO/vMLOw8a+vrXBvcS7vce7w7q0vcbEwsO3wLa2vr+7zMO9trrIu7++y8PBxsLFycfJxtDGwszIssfJw87MwMXDv72yt7Cyp6ioubClrbCqrayUenZ3amRnYGhvZFZeWUpGSkZIS0FGQkZKQDk6NjU4ODU0Ozo7PDk8PDs5Ozk6QD46Ojw6Nzo7Nzo7Oz88OjxAPUA/PT8/Oz07O0A8Pj4+Ojk5ODk3ODo8PDw7OTo8Pjs7PjpAQEU+fqygrLWqt7SyoZ6fl5qNlJaan52mop2et8XCxMjO0srKycbNzc7RyNDG1dTV183KzsXJxcfBucW9q66mYGR1g5OLiIuEeH+Ghn9+hHt0dGNcXF1eYGBiY2JiZGViXVxbXF5cXl1aW1xeaHNxbWdnbnByeZ29zMDDusC4rbCxp6qtrKe4tLa0s7O0u7a9sbewta+yu8K8wcS8v7u1srq+wLjIubS7t8HCvbi9x8HEvLWvsra7v7TFt7u1q7m9vsC9sbu2sLe6s8a8t6+7v7W3tcW8vsPFwMTFxsfLxcDGxrvHy8DPycfDxsHDt8O9vba5vse/rLW7tbe2jnl0eGdnZWJrbl5WXmBGS0hISkZCREFFRT88OjU2NjYzMzs6Oz06Ozs6Oz44PEE9PDo7ODc5OTk7PDo+Ozk+Pz1APz5CQD1AOjo+Oz89PTk6Ojo4NTY7PT48PDo7OT49OT86PEBAPIi3pauzsby8sa2foJmUlJiXnqujr6qnpMbLzcjFyM3M0MzNyMnIysjKxNDN0s/NxcfBxsC/urfJtqqwmVtncIqPhYiJenh+hoZ2d4F8c2hdXV1dX2BfYGRhXmNlY19fXFteXF1eWltbXV9scG5pZmptbnJ8pMfAuLi1sKusp56iqaeeqqyzraqsqrSttrGzqa6nrLO7urbDubq6sau1ubu0wrqwwLG+vLu2vMe5w7atqqiwssC2uL2wsaexs7W7vKyutqautq67srGqubCuu667uLvAwL66w7/Gw8XAvMbBx8u4xcfFv8fDw7rExsK7xsnMy7O5wr27s4lzdnZraWBibGlZV1dbQUxLTUpFQUNARkE6OTo5OTY4NTQ6Ojk7PD07Ojs+ODtAPD05Ojc5Pjk7PDo4Ozs6Pj45QT0/QD87Pjo7PDo9PDw4OTg5NzY4PDw9Ozw6Ojs+PTs/Ozs+QDyKwKuouLe5w62zqZ2ZlJaZoZymsLWxt6bFztLLw8XBxNDHzcHDxr/ExMPDysLJyr/AvMK6s7W1w66qsJJban+Sh46Pe3h9iYV6e4SBd25eXVxcXV9gX19kY2JjZGJgX11aW1paXVpaWlpcZW5vaGZoaWtucoGturC1rqWkpqaaoKSgmZylq66kqKKrqqyrsKOmn6qttLaxvbmvt7Corri0s7y4tLyvuLm2srzBssGupaijq7Gys6i9qquoq62utbSmqK2hpK+psqaoqK6mqLessbO3urq7sry+vr7Ev7XCwcfIt77AxLfEw7+7v8TCvsTIzMq/v8PAwKmHc3RzamlcYW9kV1ZYUEhZUlNLRkZFPj9AOjc4OTc3NjQzNzo5OTo8Ozs8PDc7PTs7Ozw4OT44PTs8Njo9Oz89N0E+P0A/Ojw8Oj05Ojs6Nzc3ODg3OTw7PDs5Ozo8OTc5Pjw+P0E7jMKvrry3ucSwtrCbmZWcmKqpsLGztb2vxdDPzcPHubnLwcu+u8m2vcO+usq3wcPBtLa8trGvtbutqKuSZG2Ig4eLgHp9f354dH58c3dlX11cXF5fYF5fY2NhYmBhX15dXFpYWVtbWVhaXF9ma2ZkZ2Voa29yhaqlq6WenKCklJ2kmpeRoaKpo6Ofpaanpq2gnZykpq2ysLa3p7GtqKq0q7S6sba2rra5s7C6urG3paCkn6axqKypuqqkp6eop7KtoKinn5ykpqyfn6ekoKGxra2ssrSztLC1vLa7wcCyu77DwbG5ucKzwb7Atbi8vb68wsfFw8S/wMSghHhxbGJmYGtvYFRZX0hOZ09USEZLRjw9QD06Ozs4MjY1MzY5OTk7OTo6PDo3PD88PDs8ODg8OTw6Ozc4Ojo8OTg+Oj89OTg8Ojs+OTc3NzY3ODg2NjY7Ojo7OTo7PDg1OTw6Pj5AO43ItLa9uLrAur22oJ6UnaGmurars7O7s8TPycvDxri3x8DMv7jJt7vFuLPFuLO/wKy1vLKspa+zraGjkWlyhoWGgHx4dXNvbWppaXBpX2BdXFxcXl9fYWNiYGBgYV5cW1xcWFlYWFhWWFteX2RjYmVnZ2drbW+InamflZWaoJWaopiVjJ2hoqecoJ+kpaKnnpujnKCrsK2xtaSpqqqsrKS0uK23sKyztq+zta+wqp+en6OisqWmqrmtoqamoKitq5mgoJ6ZnZ+lmpqjnJyer6mrqKqsra2wsrivuLm6sLa8u7qrs7K5s720trGxtrW/tr3AvsPCu7q9l4R7c2tfZV5kZFhUV15JV1xLUEdKSkdBPD8/QDs/PDA1NTM1Ojs5Ozg5OTw8Nz4/Oz07Ozg4PDg5ODw3ODo7Ozo7Pzo9Ozc4PDo9PDc0Nzc2NzU3NDY2Ozc5Ojs6ODo5ODo7OTo8PzuJyba4vru3wcHBtKSkmZqkpsCyr7astLfFz8jIwMa7u8PDz765x7i3vreywrSxu7usubqxop6pq6eYno9tfoWGf3hybW9ta2JeYWZmXV1eXV1dXF1fYGFiY2NiYV9cW1taWllYWFdXV1hYWFpeYmRkZmZmaGlrco2nnJKTk5qWmqCVlZCboqGonpydpaeipZygoZuZr66ur7KhpaOuq6eitbCysqypr7OnurOmtqGjn5ujoa2joqq2q6Ojpp6lpqOWmZ2XmZudoJqXnp2dnK2hq6ijpKatq7KzqrWwsquyubSvqq+ysrO3s66pra6yuLG6trq9wLizsZSGenVmX2ZeW1lWU1pVS1tRTEpFSEtJQj0/QUFAQToyNDUyNDk5ODk7OTo9PDY9Pzs8Pjs3Ozs3Nzc+Njo+Ozo4Oj07PD06Ozw6PTs4Nzk3NDY1NTQ2Nzg1Ojo4Ojk5PDg3Ojg5PkA6gci9uL2/tr68v7OdpaOYpbHCtba9rbS4wczIxr/FtsHAx863wMS9s7m5sr+2sbm7rbK0r5+apKqglJqPeH+DhH94b3F0cWhlY2hkY1xcW1tdXVxbXmBhXl9fYF5cW1pcWllYVldXVlhXWFdWV2FkZWNkZWRkaGp2oJuSk4+TlZaelpiTl5+doZyWoaGppJ+fqZ2cm6unr7CrnKOkuKqhoK6otqqnqK2xpLiwpLego5yZmaqnoZutubCjoaScoqCgk5ShlJaWm5mYlpeclZ+pnqmkop2jqqqxrai0rKqnrbOwpauus7GwsK+vp6iosq6ytbC8tLq4rqOVgnp3ZV9hVllYU1JUS01eTFBMR0hMS0U9QD49Qjw7NzY1MzQ5ODg5OTo5Pjo4Pj47PTw8Nz49Njc2PTc7PTs5Nzk7Ozw+OTk6Ozo4Njc2NTQ1MzEwNDU2Nzk6ODo5Ojo3Ojs5OT1AOnbAvLS5wrG+t72unaenoqq7wL3Aua60uMHMx8XCw73FuMjMssHCwa68u7W7vLW5ubCvsKqcmaGplJGKi4CAfHdxaWxydHBoaGVkZmFcXFpZWlxcXF1eXVxbXF5cW1xZW1taWFZXV1ZXWFdXV1ZbYmNiYmNiYmNmaYCUkZOLkJKTmZeclZWbn5yflqCgp6akp6ignaCmoKqvpp+io7eooaGiqLOipailsKaxray1nqGdlpWpoqKUrbKxn6Ojnp6Ym5OLoZSRk5iYk5eYmJeep5unoqKapKWlq6SlsKelo6usraaorq+vq6iqqrOmpquvtLGvvLaxr6+gknt4c2VhXFtdWE5MUUhSYU1WUE9KTU9FQkQ/OT02OTo3NjQ1OTk7OTg4Nzs4OT0+Oz47PDY5Ojc7Njs3Ozs6ODU6Ozo7OzY8Ozg4NDc3NjMzMjEuLzI1NTY7Ojg7Nzg3Njw7Ojs7QTh4u7uxtb2wu7G3rJ6lpqy3u7zBxbqxubXEycnAw8bFx7bFxLPBv8Wrt7e9tr26u7Wyq62omZifo4uJdImIfnZuY2FmaWhmZ2lmaWxgXVxbWlpaWlxdXFtcXl9cWlpbWVlaW1dVWFdUVFZVUlRSVWBhX2BhX2BhY2RpgJGRh4+NkpCSnJOVlqSZoJecoKWiraalpaSko52qq6Wan6WxqqChnqWrnqiin66tqamuraKiopWYopuckKupsZyfop+fl5iTiZ6RjZKTlpCYmJScoaOdpKGilaCipaabo6uloqSqo6uupa6yqaalpqa0pqqorbO1tLm6sKqsnoxzcXBgW1dWVlJGUE9IWlxPUkpUTFNMRUdKRDg7Oz08ODY2Nzo5Ozo5NzY5Nzc6Ozo9PDw2Ozw4PjU5ODo4ODY1OTo7PDk3Pzw5Njc4NDUyMTIxLi4xNDI2Ojg2OTg1OTg5ODk7OUA5e7W0rLS7srCrsq2dqKevubmzwMm6tcCvxcjMusHKzMi1ybyxvcPJrbG4wbW8wLy0taqsppWZm5uIgXKIg3t0aWlqbGdqbG1ramxlXVxcW1tcWlhaXVtbXmBgXFhYWllYV1hXVFZWVVRVVVJTT1FZXVxcXV5eX19iZG2MjYKPhI6PjZiSk5KcmqKcm6GpqauprKeppqSZpa+llZqlr6mgnJmboZ6vmpyrtKCmpp+jpKGUk5uWlpKpqq2anaChoZuUkIyZjoyRjJKNlpWQnqKgo52co5WboKOhl6Koo6Ooq6Crr6SuuKajpKOsraqoq6+zt7K9tbOrr5iFdHNoW1hZU1VSRVhMUVtYTVVPUUxRUklOSkM9Pz9BPz03NTc5OTw8OTc3Ojc5Ojs8PT47Nzs7Oj02Nzo7ODk3Njk4OTo2Oj05OTU3NzU3MDE0MS0rLzQzNDk4ODo6ODo6NzQ4PTg/OX6zraezt6+op6+um6morLe2q7zKu7a/rMvGxbjBzs/Is8S6t7vCyLGtuL+3vL27s7WmqaCWl5iWh3p0gHZ3bm1obW1tcGdnaWZkXVpbW1tbXFtZWltcXF5fX1xYWFlYV1hXVlVUU1VWVVVTU05PUVlaWlpdXFxeX2BlfYqAiX2Kj4iQjJaRl5mioJugq6qmr6yosaWpmqCtoZWWpKinnZiQj5qerpeZp6qZoJ2UpaGfkpGSkZOVqKulmpmZnp6WjoyLk4aJjYOPi5KVkaCeoaSZlp+VmqGinpSbpaaoqKigsbCmsb2ooKOstKuup7C1sLm1wLGusauRfnJzYlZUVk5SSkdWUFJSTExYTkpMT1JHTUtBQ0ZERD5BNzU4ODk7OTo3Ojo3PD06O0A+Ojk7OTo/NzU5Ojk4NzY5NTg3Nzk7ODU1NzY3NjEzMjEtKi4xMDI4Nzc7OTk7ODk0ODs4QDh/tKymsbeqpaKxq52qp6mysKS2xrS5urPKxbm6wcvQyrG2t7y9wcOxsLG3rbS0u7O0oqOdnZeXlIOAdmtnbG5xbnJrcGtkZWdlXlpZWllaWlpaWlpaXFxdXFpYWFhZWVdYV1VVVFJTVVNWVFJOTk5SV1haWVlZXFxdYWp+eH1zh4yFjoiXiZSTmJuYnqmboKumpqyeqJqhppyTj5+jmpeXhYSSm6SQlaOdlpaWiKKbm5SMjoqQmqWnnJWVl5uRkoeUjouBjI2AkIuSkpKgmqCilpSZmZWippmNmaSmqaahoLSyqLO4oZyjt6yqrqSysqa1vLWrrLGjiXlzbl1OUVFMT0ROTk5QS0ZOTkpKTk5RSU1KQUhMSEhDPjk1ODg4OTo7Njk6Njg7OTk+PDg6Pjk7Pzg3ODk6ODg2ODU3Njg4OTc0NTc3ODIwMzAxKiktLzEyODc2Ojk5OTk4NDk4OEE3d7ampLexpaekqqWgqaaks6qissO1tbKzxsa2usPKzMazrLm9tLjAr62psJ6mrrqvrZ+Zmp2VlId7g25fX2ZycHZxaW5pZWdoal9YWFhYWFlZWVpaWVtbXFxZWFhXWVlYVVZSU1JQUVRRU1VRTU1LTFNXV1ZYWFhYW11hbnB0boKGgYd/kIOOipORk52hj5qco6KkmaWXopyVjYiZmoxzjYN+jpeWhpKakJSOjnuZj52Mgol/ipigo56Qk5iWhY6DlH5+dIqOepCHk5CQnZuampKWkJ2Oo6OOiZqgoaSkm6K0r6ywrZ+ZprimprGhsK6csLyqqa+qmYN3c2NWTVJPUE1DU05MUE1CUFFISU5TTUhKSkRLTUZLSz03NDk4ODg7OzY5Ozc6PDk6Ojs3OT85PkA3OTo8ODk3NjQ0NDU4NzQzMTI1ODUvMDEwMikoLC0wMjc2NDc4OTo6NjU6ODdBN3i3oaO0qaalqKOmpaamprOnpbTBuLC0sMnEt7nBzsa9s6y6waytw62ooqaSnaa2raOgj5WWkpB9d35mV1ZfZ2ZpZ2huY2lpZ2JcWFdYWFhZWVlZWVlaW1tbWVlZVldXV1NUUE5QTk9PUFNUUU1NSkhOVFNTVFVVVllbXWpqcGt9g3tzTlhyj4KXho2cl4uUkaCZnZWUlpWPl4qAlIlfO1ZvfIyUiYCMkoyQhoZzi4WXgXmBe4aTnZSDlY6RkIOGfZN4cXCGjX2KgZGNj5eamZOLkIqdiJ+Yh4iWnpqhoJenrqmtqKiel66zoqaumayrmKi0o6mto5N/c25fW05TUldMRFRKUE1MRk5PSUVMUU1LT0pJTVBGSUo9NzU5OTk5OTo3Ojs6Pj44Oj09Nzo/OD4/NTg5Ozc5Njc1MzMzNzYwLi0vMzQ0MTEwLy8oKCsrLTM4NTQ3Nzk8Ojc5Ozg2QTl5t6CjrqGmpqqgpqmno6mvqKe0wrmwtbDHwrezvc+/ua+utcKnqsWqo52Yg5ScsaKamIaUj4uHfXN1XVBMUVVZWlddXmJnY19ZV1dXWFhYWVpZWFlYWVpaWllYWFZXV1VTUk5MS0hHYlxNTlFNS0lGSE5RUU1PUlRWWFpgbG1neYBzUEI/f5WSkX2IlYyEio2bjpaVipKIhpWHeYl/YEpRbniLkoR+hI2LhYB/bX9/lHd1dniEjZpwUY2IioZ8fniUdmh3hoh+iomWi46Rk5eMhIqIlYSbjYKEkpqWnp2UpKOoqaWknpyxqqGkpJGmqZaiqpyipqiJdm1mXltIUVFTTUlVTVNJTEtPSUhGSk5MTVRLUVFPR0pEPTc2ODo4Ojs7ODo7OD4/OTk+PTg7PDY7OzQ3ODs2Nzc1MzQ0Njk2LzMvLjEyNTIyMS8sJykqKiw0ODMzOTg5Ojk5Ojo6Oj85d7aco6edn6Gvoaeopaeor6yqtby2uLazwbu2qLnIuLaoqLW2qrK8p56WjX+KlKiWlYp+joOCfXdwb1hNS01NTkxNUVdbXFpYWlVVVlZWV1lZWFhZWFhZWVlaWFhWVldVU1BNSkVAQJtrc3NJTUpFRENJTk9oWU9RU1RVWm6CcnV9aWhcVJCJlIh0foaBfIWMk4KSmouPe4aPgHaAeHNvdnF0jo6Ben6Kq4R6emh2e45wcm14gYuNknh7gHuAdnNyknhndYWEhIV8lYqIio2LgH+Ei42AlIR8gI+YlZyWkZ+dqZ6foJ2gqaWenZiNp6SSoKCWnp+kgXNoYV1dSldQUkdLWFJPSkxNUkpKSkxQSExRTFJUTUZJQjw3ODs5OT49Ojs8OThAPzo6Pj03PT03OTkzNzc4NTY3NTI1MTQ3Mi8yLiwuLzIwMC8tKygoKS4xMjcyMTk4Nzo4Nzc1Ojw7N3aumaOhmJ2ftKmvqqWtq7Cxqr20sry4trq0sZ+3urKqnZ2sqaiyr6KakY2UgY6cjpF+doZ4fHZvb2lYS0hJSEdFSEhQVFRUV1dTVFVVVVZXV1dYWFhYWFhYWVlXV1VWVVNQS0Y+OTNOPH6eTUhKREA9QURqlH5MT1FRU1ZedIJ7eGZ2jJaYjY58Z3mBdniAiZB9hJiSgXGHj3x3e29rfq19dJCLf3uGkoB8f3RmdnyGbG9oc3yJjIeAbXlxfXFtdo9xaHGBfo5wRIuFgoOFf3d4eoyGfYx7dX2Oko+Yi5Kam6OWmZyanZ6hnJaNi6Wajp2XjpaYkHhvbmdjW1hYVVFKU1VUT1BOUVZLTktPT0pST0lOUExGRDw7Nzk7Ojo/PTk8Ojk5Pz87ODs9Nzw5OTk5MjY2ODU2NjMzNTExMjI0LiwsLS4uLTAtKyonJyouMTM2Mi84NzY5NjY1Mjc5OTV5ppegnpahprCsrquoqbGvsau8uKy7vrizrKebsKesm4+WnaWppKGYmY+FknmJjouKdXF7bXVwam1qWEtGR0VBQENESExMTVFSUFFTVFRUVVZWV1dYV1hZWVlZWVlWVlRTUUtENzhmNzA/qGlOSEM9OzpEioV6WkpOUFFUWF1lcHJsiKeqwH50eWJ7eG98eYmQen2Lhm9tjJJ5dHlqaoCCcZaRi4F+loBJkpluaHd+gm1qZGx5hZCShmxybHxucnyGaW5wf3ONiYWGe35/e3dwdHSGgnmBeXB8joyKlIOWl5iakJKWl5mXnZaMg4mekouSjYaQloBvam9vb1lWWFRSUVlPUlRUUlhVTU5ITUpNT0tDSU5HRkA6OTk7OTk6Pjw5PDs6Oj0+Ojg6PDk/ODY4NzI3NTY1NTQxNDMyLzAyNCorKiotListKigqKCcsLTEyNTAsNTU2NzQ4NUhBODk1d5mRm5man6WssKOtqqi1r66stL+rvMO/paKalaSYno2Ei5ShoZiZkZOLc456gIaMhnRvdGtwbGRsallOREZDQDw+PkFGRkdLS0tNUFJSUlRUVFRWVldXWFlaWVlaV1ZUU1BMRTFAmjMganNDmW87PDk1PICChl9JTU9PUldaUVlcX6eHYZppc3llfm9tf3qLiXaCiIZ0bJqSdHR8amqdj015hZOJhI5nMXaHc2x+foN0ZmV1f4SEhYBnaWx1a3GAfGhxcXxuk42PfHR+fXFxbnZtgn93eXVqeYmCiImDlpKSkIuNkZSUjpeNgHmIl4iGioaAkIh3a2twaGZYUlpXWVlbTVBVVllYTklIRUpKSEdDQEdFQ0c9OTk4Ozk6OTw6OTs6OjpAPDk6PDk4Pjc4NzcxNTIzNDUzMzY0NTAzMS4qKispLCwrKykoKycpLCwyMjYsLDQ3NzU0NzhpTzg7NW6SiJqRmZajqK2esZ6nuq+rsrDCsbvDx5qWj5SZi46FeoSQmJSNkIyPhnGHgnSHjIZ5cHJwb29kcGZfVEZJQz88Ozk6P0BBRENFR0lMT1FRUVFSU1RVVlZYWlpZWFZVVFNQS0U4MC9cYLNHOVhQOzk0NDGWuotITE1PUFFWTEFJUUlir7KgcXt4bH1scYKChYF6hIaGeXKhlXR4gXN1lIc1cZ2onY6hoYSihXZwh3yHfHSMro2JgWhnYmpucm1wgnVpb1h1cI6bkndtf3t9bXJucIB7c3ZuYnaDf4aAhZCQioqJkYuRi4uOg3V4io6AfoOAfY57c3FxbWBcXV5bWVhgX1JOW1pYV0xISkZKRz9DQUJIP0NEPTs5Nz07Ojs7OTo5OTs6Pzw4OD06ODs2NjY1MTEyMTI1MzQ3NDUzMS4vLCwrKSopKSoqKikoKikrLzNETTIxNjY2NDM8dlI3PTdikoGSiJaRnaSnn6+VpbSprrGuwbK7wcWWkIyUj4CIfG6BkJKJg4qHj4Z1goRslYiIe3R4eGx3bndjaV5KUEc+PzY0NDk7Ozs9PkBCRUhMTExMTlBRUlRVVldYWlhWVVRTUExFPDUqnUtbQC1nSTk0Lz+Sg6muX0dMTU5QTDdDTVJTREqGdoB8fHZ+bHaIiHx+hYN/jH51opp6foaBhJmEm5xhhqqfnYuDkI56d4l+iYiOc4uXj4R7XWVxdHp8d4ptaGpieW+FkIJ6b4F4dYV6cHR5eGtuaV12hnyHfIeHjn+KkpeDjYWMhn1xhH+EfXV3e3yJd3BzdGZnYFtbXlNbZ15XUFRYW1VHSkpES0c/RkBEQz5BQT07OTc8Ozs9PDo6OTk7Oz0+Nzk+OTk4NTY1MzI0NDAwNDY0NTU1NC0sKSsoJycnJigoKSkoKCsrKy8wMFVxPTIzMzMxRX5XND05XIx4ioCUjJGcnZ+mkaCqoLGor8Cyu8W6lo6RlId7hnZrf4yRgn2KhI+MeIOAc6CEin18gX9wgH56Z3ZrUldMQEUyMTEzNjY2ODg6PD5BRUdGR0pLTU9RUVNUVVdWVlZUU1BNRkA6Mj0gI5ZjjFs1MzExaT9Hb0lGSUxNT1JMS1RdWVJKaISIe4l5fHF8j4x6fYmHfpeHdqGaiIePkpSlja2qSIaur6+LgYCTioKLgoSSqYeAmJiKnHRtfIGGh32OaGdoeX9uhYeChXGEhkdsgHdyeXZobWtfdn2CiH+HhIt5lJ2ciYuIkX96dYt2fHhtcHd+gHR0cmxbXl5cY2NYZ2VcVE9QVllQRExLRk5JQ0ZDQ0BAQ0E9OTg4Ojo6Ozs6ODg4Ojo/PjY7Pjc1OTU3NzMzNDQyMzY2NTY3Njg7REZMTU1MQzcrIiUnKykrKywvMDArbnUyMjQyMEyBXDU9PF6EdHx9iYWHkY6Wl5KXoJ6toaa4r7O9s5eNkouYi310cH6Jkn59jIKSlH2Gfoakh4h/goiFeIeIfnOEeF9jV0tCNjAuLzIzMTIzNjY4Oj0+P0JFR0hKTU5RU1RVVFRWVVNRT0dDPzgwLCOHWz4/ODQuXZZwc6NVRklLTU1QV2BYcFlcXmmNk4eVgISChZGTfoWIkYGalYKhoZiVm5umrZOau7Gnu8fDqIuMoaWPlIqBkXxxg56fkZx/doaFi5CHkGlocISBdI2HhIpxhoJ3h397doV9bnZ1Zn+UjoeIiIeIh6CropaJjpd/eoKIeXlvZ2t4f3t/dGxlXltbXmpeYmdgWk9LTldSUUlQSkROR0NKRENARERBPDo4Nz08Ojw6ODg3Nzg6PT04PD02ODc1NjYyMzQ0NDU3Njg2NzxCQj88ODo+Q1FeZVxHMicmLCwtLS4xKD+LWy4zMTBPg180PztudXBmd4N7gIx/gZCOipqbpJ2hrKarr7CXkZGEoZSEeHd/jJR8fpKFkpV/ioCSm46DgIGMioKJjYN/ioBtcGpdQkA0LS0vLy4uMDIyMzQ3Nzg7PT9CREhJTlFSU1JTU1RSUE9IREI8ODcvOUQ+PDw2My5sk5dNUEhJTExLTlZgY39nZ211nZuPmpKTi42OmoiTj52LoKCSo6qlo6yTqbaiqMHCrseveLqUmnyNoZ6ZhJOFgo6in5OYkoSKhY+ZkZZscHWKjIKWjI2Od4+EcW2FgYqWkYOFiHGIoJaGkomOj5aktambjZSig4eTg31/a2prfYGCg3VjXmRgW2dsXWxsXldLR05SUU1MTEZJUENETUZCQ0VGQj05OTc9PDo7Ojk4Nzc2Nzs6Nj06Nzg1NDU2MzQ0NTY2NjY4NTU2MzEwLiosLCkoKS46UGFcQCwoLSsrMCwncog3MjQwT4RiM0A8dW5nWW+Cb3WGcXaShn6XlpqUnp6cp6CplpOYnmdlpJp+hJKReX+SiJGSfYqEmJKQgoCAi4yJhpCHhYmFeHh+Z01SPi8uLiwvLi0vMDAwMjEyNDY3Oz9DRU5QUlRQUFFTUU5QSUVEPjs8OkNGPz48NzUyPD9SNUhISExMTU5SXm+KfHOBfaCdm6elopmhl6KUnJ6onqirn6isqaq2l6u/q7bIyLfJ0c++m6Bwaaupn4STkoWcoZqbmaeRkYiVopubeHp+lJiSoZOXl4GUnnt3lZKrsomNl598lJ2bjZKVmKOipravnZGZqIeWj42BiGxzc32BfXNpYF5iYGJoZGBnZlxSRUpLUE9JSUxGRk1DSExGR0RCR0VBOjg1PDw4OTk5NzU2NTg+NzU9ODQ3NDU3NTQ1MzY5NTg6NjE2ODYzLzAuLSosLy4tJyMqO1hiQigqLDEtKEuXXjA2M1GFZjJBQGlhXlBwdGBtfWF3jn17lI6Oip+Sl56Wm6qYnqpCRH2HiYeYjXiCjYqOjXyKho+QjoGCgImLioSShYOGiYGAhnZeYlA0NjAtMS8sLjAwLy8uLjAwMTU+QUJNUVJTUVJTVFJOU0xFRUA8Pj1HR0BBQDg2NjI8OTtGSEdJSk5PUVlthZB3lYqjp6q0vbikraysp6i0q7C2srKtu7GzvZyzw6u6ycu3w7+4paKws6ytqqOLlpiFpqago5eBppmNoquopYiFlKShoKuhpKmPm7CLlaOmt7uboaOwkqKdop2Qo6Grr6yytaKUpKqImYmSiZV6en6GgGliaV1mY15kZF5nZ19bT0NJSFNORkhMRkpHRkZIQUtGQ0ZGQTs4Nz08ODg6OTc0NjU4PDU0PDc2OjQ0NjQ0NzM5PDM4PDIwMjU1MS8xLi0qKi8sLSooKiYlNVhYLywwLCwwhIE4NzFQhWg1QUNbWFRMaGNXaW9YeoV2gZOFh4Kbg5KQjJLayJ2Wc1aXiI+InI98hoyOiop6h4KHkI6DhIGLhYaIkoaChImGiIeHcW5hQEU2NDwzLzExMC0sKy0xLi00P0NBTVVRUlNVVVZVTltQR0hEPD4+RkhDRUE4Ozw1Qzs9RktJR0hRT1BXgZKghK6js6qywMfDqrPFtqyzv7O4vra/tMG2u7qjuMWotsnHtb65taijtK2wsZuZkpqfiKevq6WUdp+kl6GssrSZlqquqK62u7K6rK+1orGrsbW7t7WutKCnqKOnmqmvrbK5t7inm7aojKSOkZOfhniChHdaY2VXZ2JiZGBhZmBbVUpERExVUUhJSkRJR0VBQEBLREJNRzw4Njc7PDk3Ojk4NjU1NTcxMTw4ODk1NDY2NDk3Pj0zODkxLjAxMjExMzAsKiwuLCsrKyooJyopRVowMCovK2iSTzYwUodqNkFGV1FKTFtaUWJjV3l1cIGUfYSGk3WFf4CMe7+7o7yCtJSTjZuPhIiPkomIeYaAjJKMh4SBjn+BiY+HgIaIhYmHkXp4bl1WQEVNPDY6NDZBQjc2NC8vNkNIQ1FbT1FVV1VcVlBfVUlLS0FAP0dLRkVEOz5AN0Q3P0JKSkVGVlNQXo+kraOxtMO2uMHMyba7xL2zs8C2uMG1vq+3dLGzpbrEpLDGubGzsbSopLW2qrGgopabopKlsK6mraynpJigrLS7oqiyurW8v8y/xcW9vbPCt7m3v7e6t7msrLClsKmtvbC8usLCrJm6qJOtj5eXqoh9g35sWGRiWWtmamZXXGNZVlNJR0ZMUUdDSElBSEQ+P0JCTEBATUQ5OTY2OTo/Njo5OTY2MjQ2LzE5NTk5MzY0NjI3Oz0/NjoxLi81ODo5NjUwKigsLS0tLCwqKCgrKyhFUy8qMDBKj2s1MlCHbTY/RlJMQUxSV1NZVVp2am9+joSAjYRuenN4h2K5oZmiiJSUlpKUk42QlpKHhnuGgY2VioCEgYp6fIuHhn2KgoGKg5V9d3p1ZVBcZEdFTDtRY2FbXlNGPztIUEVaY1FSWFhaZ1lUYGBMU1BFQT9JSkhFRUFAQzxFNkI+SEdKTFNaVF2Trri1urjIv7q9ycy7vMC8t7W7ura9tLqxxmB1sqSxmp6rvaqlqKurpKKytaCrp5+Vlp+Yn66lp6aln6OUo6extKeys722wb7TycnTx8PFzMLKw8C+vb67vLe0r7i3tsO5xb3Cx6+euaqhq46kqLaIgYFzYGNjX1hiYGpnUlhgVlFVSUVFTktAPkdEPUpBPUJAPUY+PEhANzk2Mzc5PjQ4OTo1NzA0NS8yNjM4OTM3MzQyNj84QD5HS1JUU1FQT1FRUEpBOS8sLCwqKygoLC0sL1A+KC40OIB9PDJLiHE5PkNLRUBJTVBSS1FdZ2xrcI+NhY9zbHJzc4fVwLWZoI2VmJmRjpeSlpaOhod9hoOMlop+g3+DeHuLg4d8i3mBioKXfnN9emtmcHVZXVxQZWRiYGVkXVtYV1xNZG1VUm1tX25fWGdkVVlVSkRCS0pIRkhISEdBSTlEP0hLVFRWXFpbk7nAuL23xsC7ucrKura5tbi5sre1tK62tplkdaicrXBeoqycmKCim6Seq6WUn5+QlI6WmJenn6WfnpqZg6SdrKWqsK24sL251NHO1s/JzNLMz87Kxr++wsq9wbzBwMTExcq+yM6zpLuwtK+aq7i7mH97bV5hXVpfYVpkY1BbYFNQS0NBRUZFPEBFPkFIQUBEPTpFPj1KPzM3NTM1Oz00Njg5NzcwMjIvMjQxNjk3NzU1NTREM0VMTT41MS8wMDY6NDc3QElPSTstJioqKC0uLyxATSsvNTRtiUkwSIl0Pz5CREBDREZLT0RRXFloX2+WkpCUbmxvdXWHs6yhoJ+LmZyZjIyVkZuShYqKfoiHjJCLiXyBhHN7ioOFe4l0goqGlX9ze3lsbXV7aHJlaWxpZ2ppaGBmaWlsWm1zlq2kvIiHZ1tvaF1aWlRIS05PSktQS1NRSExBSkdKT19eYmZpYZe3x7C4sru9tbHExrWwuLCvu6uysaert6uNtaedmqeaTpqdjI6flpGmmKWVipOTiZCJkJGRnZuhl5qVloeemqebrK+osKe0tNTU1NbSy9DT1c3Tz83FwsnQvsnJysnRx8zNwtDRt6/DvMS5pbW6wqKDcGVeXl5ZYVhaZlpRXVdPUEJCSEVCSDtBQz5BRz8/QTg7RD5ASD00NjY1NTs6Njg3NjU0LzEwMTQ2Mjc4ODc1MzY3QzVCOD8tMC0xMzQ5PTk3LC4sMTtGSz0pLCguMDAwN0s/LTQ2VIhXMESHd0M7Qj5FQkFDSk0/VVlTZVZzkJCYgmhxb3l5g6CqnqWWjJqbl4uNlZGajn2Ji4SNioqLkId8hIJwf4iBhnuHcoOSi459cXh1bHF4fnF7bnhzbGmBcG1jam1weGl3fH7Lv8Hfp25jeG5jW2FgSlBSVU5ZXlBdXE5QTlRRVVRcbm12gnGWrbistKavtqqsvMCwq7SmpLimq66gq7SjjrGtmpeYjJGTkYSOm4GNppGciYOLhIqJhIuDlJWXl5OckZyYmZmfnquspKeirK3P0tXRzczS1NTQ1NHOyMPU0cfN0tPT18zR0cXS1sXAzsfHwqi+t86ee3BnX2ReWGFTXlpQUVRQT0g+QEZBQkU8QEI+RUQ+Pz86PT08PEpBNDU0NjU8ODg4NjY0NDEyLzAzNTI2NzY4NTMzOz08RT1AMTErLzI0OT41OTAxMDIyLTJETjMpLzMuMzI9TjIzOEN9XzJBhnREOj09ST5AQ0ZIPFZSTU5adYaFindsd3B9fn+hnp6hi4yYk5OLjJKPloR5hZCQjYqJh5GGfoF7cn6AgYd6hHWFk5CIf292cmtzfXt2e3OBeHJqgHNyaXBxenlyer7Lmn6MsoR2coR2aGFrXUNaWltWZWNYZGpTWF1dYGReY3h6fouBmKmjpKGfoKilqrC4qqWzo6GtoaOtoaexn4mmmpOSkYmRj4iBlIlqlKKMmYSAhX6Rg4OTlq2LlY2Vmo6GkpGel6ewoaChpaSoyM7PyMLL0dTS1NLO083G1tLM1NjW1tjU19XJ1NrNydfX0cqsw8LLjHRwZWJhWVVaVFxQS0dJSkpAOzo7REFEPEJDPkdCPkJCOzw5PDpHQjQ2NTQ0PDU2ODc1NDMyNTAvMjU0Njc0NTU0NDw+PUU/QTYyLy0xNjs9MDgxLzI1NC8tLTtSMDE3LzUzMkZEMjg+bmI1PYF0TTk5QEk8QUQ/QTtQTEZLWXCAdX1oc3hygomAnZWdlIWLlYmPioiNh4+AeISUmIqMiIiLiH6CeHN7fYOHd396hpGVf4Nud3BtdX91eH10hXx5bId2dG59doR1eHydtYw7QYvFpX6MfGllV0lDZmNlY2dqZG54W15maGtuaW6Ag4iRi5ydoJ2Ql5ieo6OmsaOjs5+hpZ2gqaCjsZyGnpKSkpCKjouGg4+EfpybjI2ChIV6lH6CqZWjjJGKl5KLfZeKmpKrs5ianKicp73Dxrm2xs7S0NLQy9LLydTO0NXa19fY1NnYzdjbzsnZ2tHWvsvLtXp4cGZeW1NXUltWRkdKSUVFPTo3OkBAQjpHRD9EQ0FEQjs/Ozs3REM3NTY1NTswNjg5NDQzMzQxMDE0NTU4NzU0NDQ5QD5EQkM8MzMuNkZUV09RSkFKRj8xKiguQlMzOTI1NC83Szc1PGBiQTxzdlY4N0FIOj9DPjw5UUVDSlRrbm5wYnBxdIaNfZeRnYt+h5KDiYaFiYGHfHiFlpaIjoOHhYZ6hHlxenuEhnV6hY6NnHmLcHxvb3p/cXuBcYOHgG6OenV3fXyCdX57hoevc1ipwraNkYJwbmI9XmhycHFwbnh2gWVob3J1eHF6jIeOk5GblZ+Vh4yTm6CbnqqfoKycoZqYn6Wen6uZi5qMkJGNhH2Ih4OFi46gmZOIhId+bZl5hJiGiJOMjZSMhnyciZSPrqqUlZifmaevtb2prb7Hy8nJzMvQycPSytTX2NfY19Xb19PZ29XQ2trR1sjUy5Z7fWppXFtRVFRfSENGSUg+QT09Nzo9Pzs9Rz0/QUFBREE+Pzo4NkRCNzU1NDc5LjU2NjQzNTUzMjMyMzY0NjU1MzQ1N0VCRENFQjU2PEZOU01bbmZjbnNrYVY+LDRMRzg2NTQzNEJGND1XX2hMdXheODs/Rjw8Qjw6OkQ/Q0dSal5tZGJma3aAiHKRj5qAeoCNfoKCgYN+g3t8hJiNh4t+hYaAdoJ5bnt7h4J0epKejaB2jnWCdHWBfXSAhG+Bj4FvkoV0fICEenaGe4i3xaTBybiBlpqPd3BlTmZjgXqBd4aikIp4eXZ7g397hHZtk5aUlY+XkIOJjpaZl5alnJeflp6TkZejnZmrlZCQiYyRgoyFiIiBhpCRnpuZiYWMgYaXeoiIn5ePiI2Ki4J9oYqRjLyhmJOXmZ2ppqaun6i2v8DAucfKzs7FzcnR1tXV2dXX29TW2drb19va2tjO3MaHfXtpa2dhVVhWVk5MRE1COz09PDg6PD45PUA2PT9APT8+PDk4NjdEQTY0NTU9ODA2NjU1NDc3NDU2MTM4NTU1NjQ1NTdISD1ESkU3OTI1O0g+Ozo6N0lQXVpSVVhLOVQ+Ozk1MzI3STg9TllNSHh4ZDU9PkM9PUA6Njo+PkBFUV9ZZWFdW2h0enlsiYySd3Z6inx+gH5/fIR6fYKRiYSFeoSHenV+dW18fYZ+c36SnpGeg5F8hn54jn14iopugpqAdJmGfYGIhHt9kHqPqY6Pw6G9i5yjnX2JhH2JcouKfnOmmpyYk4V7jpCIhGhHcaCknYyLkJKFiYqQkpWPnZqTlJCWjYyVn5yUoJSRjY2Pin6Qjo6LhImSlpqen4mMlJKdkYKLf6WZiISNgoWEgaWHi4u4mJ2RlZaiqKGdnp2jr7e6tazAxsrQyMfMz9PT0tjT1dfA19jZ29ja2tnZ19u4ent6bWtnWGJcVFBPSUNMQTw8Pjk5Ojo5OTs9Nj8+Pjw9OTo7OzM3REA4Mzc4PjcwNjg4MzU3PDM3ODA0OTc2NzU1NTQ2RlA1RE5JODkzOEFLPTszQ0BJPDlEV048TVRITj85NjMzMz5DO1tYPjVZeXBaPDxBPD0+ODY4OT89RFJTUlhfVlhmbW1taYGOinFzeYp7en98f3uHenx7i4aCfXSDhXlyenNtgH6EfneFnKGanZSSgIyIf5iHgJuSboeohXqgi3yRjYKIhJt9mpCKjKOioJCkrqCLkYuFi4GThldyrYufq5uPg5ibj4+OXIKikYKMn5OUjIaIjJKTjJSUlI+Lj4qHlpudj5WWkIqSk4WAi4iSjYqKnJaZoqOHk52WoIqJiI2ckIOIjn+Dh4akhoyQs5idkpWXoaGfmZKcnaiyuaymvcLHzcjGz8zQzM/X0NHUrtbV2NrY2trX1tnZn3F/dmloX15ZVFhZQ0FIQz8+Pjo0OTo7Nzo7OzM7Oz89Pjc7OToxOkg+OjM3PUA1MDY3NzI1NT82NTs1NTg1ODo1NzczNUhSN0dPSzk5ND1FSkI+MUZDTEI5ODpHWEA1SFdJNjYyMjM6RUNlWD8mX3lpX3o+Pjk8Ozk4OjtAO0JRS0tTWVBUY2J5bWJ+kYNvbXiLeHp/eoF8hXt7doWEf3NwhIF6dXZ2dISDhX1+kqakn6WiloqdkJSXi4qol3KKsY2Ep5KEmZOEmYyilZ+Yk4ianqOSqa+fkJWQjY6IloxujbeFmsTIspuhpZucmJaQspFkpM3HlY6Gh4mQko2Nk5SJhYqJhZaZm4+QlJOGlJeEf4+LmYiNkKqXl6OjiJmflpqIjoeXl4qEjo2Bf4iPpYmNk6mal5OXmaGZn5mTnZujs7Smo7zBvsfFxcnIycLL083N1KnS0dbW1tja1NPazoNzgWllYF9fUEtWXEJCRkM7QT04Mzc7PDo4PTY0OTo8OjgyPzk6MjpJOj02N0JDMzI6OTYyNjQ+PTQ7PjY5NDk7NTc5NDRLUTxKUUs5QTdCR0lANjRKRUxGPjw4OEVUQTc+XDg2MjE0OjtFYFhBRmF0aExjWj41Ozo6NTs6PTpFTUZIUldTUkJjgUZ1go59fG1+iHh6fnqBgYJ+dnaAgntsbop+eXx3eHyEh4t+i6OzqKSrsqGWp6ClpJaVrqKDkLeVkrOZjaGgi6Sbr6KknZiQp5epma2vpJeVlZSQi5ialqDAjqPJuKuaoqWtmZGbnLKdhoWoopyYhYiJjpWNi5OPh4GGh4iTmJSMi5OThpSYhoORkJx0kZmylpekoYicmpOPipCLl5qJipaOhn2MmZ+KkJCcmpmTmZiflKCdlZ+bobKuo6W3vrPFx8S9w8O/xs7KydKnzs3T0tDW2NLP2Ltze3deYldiWFFJSk9FQkNENT46NzY6Pzs8Nz00MjY2OTc3ND01PDU8TDw+OzxCQTc1PDs0Mjc3P0A2P0A3ODQ5ODc7PDU1T01EUFJMOEA9RUFHQTU6SkVORUQ6NkFAQlM+OURPMzIzNTc1PXZcPFJcdGlaTV1TPD04OTU2Nz06SkZER05bXFlKZ2E7SISKentthYZ5fIR4gIWAfXB4fH18b3OMen2Ce3iGi4mFhJKnvK2psr2vpa6zs6ijorCsipq1nqK4pZWtpJeprbempKOfmamYqqSvsKmamZyUlZGYoJeZu7utyaBptrirsJWYn6Krkpe9o16qsoKJio2Vh5F8j459g4aOj5SUiIeSlouPlY2LjZeZkp2ZtJaVq56LnJSSjZCSjJibipKej4uJlZ+ijpWOmJqdk5yYnpWioJScnKWvqKKls7irwsjEtbu9vMXIyMLRocbJzc3E1tbQy9OicXxqXlxVYFNRR0Q/PUNBQjg/ODc0PkY8PDY8MzUzNDU0NTRCMzo6Qk06QTtBSEI7OkA8NzQ2PEI5P0BCODc0Ojk2Pj00N1RLQ1VRSjc8OklBREA0QUpITkJBPzZEQTxKTkQvVD0yNTQ6RUpcWEpaUW1ncHBEaWBLSTY3NTc6PkpAQ0lQZUhiYGNwSkCLin6AcoaHfIGJdYKKgn5tfX18f3B3h3eNgYd7jY+Mhoyaq8LAsL7Gu7O0wby0rKuztoyosq6uvaubuqSorbm3q6amoqGjo6qvsrGqnZyjmJuYl56ipaWSo7muqMC7rK2yuaWkp32IhpytvbCDi4yLkIOPg5GPeoGHkI2OnIiIj5eNi5WXlJCalpynm7GakaudjpmPko6VkJCWl4+RoJGIlZukrJWWj5ScnpShnpuZoKGUmp6op6ShpLCzpsHGw7Cwu7bFxMO+zafHw8fDvNbQzcTKiXZ1ZF9cYl1PS0NMQEVGPkE/Qjs6ND5BPT01PTY+MzMzMjQxQTE3QEJOPkdAQ05DQT1DPTs4NkNDNUJJQjo4Nzg7NUI+NzlWS0RXT0Y4PTRLQEM+NEVLSE4+QUE2QkI/QlNFNThQMTQ1Ozw4O0Q+OUxqal07V1JkS2daVU83OUdFP0NGXGdHYGlnWl1bk4yMiHuHi4aDjHWGkIqBbn57gn9xfoF6lXqSlJSYkZOVqLTHycDCzMHDuse8uq+rubuXsra6s8CupcCkq7C7u6quq6Kinqesr7WwqpugqpyinJafsLSni6O6urXBu6uonLKkpKiUhI6pw8SkgouOh4iEhpWUjXqDjJGPkaGMjJSRj4mYoJeTmZSXpqCunYyqnI6Vj5KRlZWOkJWRj6GUhpefoLOflJuUoKGZpJ+aoJyglJiep6Smp6SvraW/xMKuqbe1ycO+ts6yxb7Du7PRycjBtXd7b19aXmxUTklETUtLSUBBPUNEPDVBRDs6Mz04QjMzMjI2M0EwNUlFTT5JQEhSQEg+Q0A7Pj1GQTVBVUA7OTk4PDdFPjg+VkpDV09HOD80TEBCOzVKS0NMP0I/PEJGPUFITDkrRzwzNjc0NjRBPzdPYU9hRS89PjZrbGpgQDpIPj9FQmdcTWVcZlRjapmNlomLiJKPhol5hpOQgXJ/e41+d4eBgpB6jaGWqJqamLu+ycjKwtLJysLNvMGzrbu+p7q/vrzDuKzBqayzu72qsKmkpaOsrrSttrWgoK6fpaKYo7S9qZuovMGjtravq5KvrKqrloaaqaalkYKMk6WViYB1ipJ5hY2RkJ6gko6Ui4+NlKOZl5uUlKOeqZ+RpZqMj4+PlZaIfY+VkpKjmpWgopy1ppCfl6Wko6WfnqaYnpWXnKWjqaiisq2ou8DEr6Wzt8zAua7Ds7u+wbmtwsLBwJlwe2NbWV5cTU1OSkdEQ0hCQkFDSzo0REg6OzQ8N0UuMTIzNTJCMjZTSE48SkJKUUVLQ0RFOkVMQjw3RVY9Oz04OT88ST86RVVJQVdRRjdBOks6Qjc5Sk1CSUBDPjxERzxCQ089MjBIMzY2MTcwPUI6PWpqSks1UVMzU3BwZE47RD1ARj5rSV9YYVpkZVaej52Ol46ekomKf4mfkoR4hX+Vfn+QiIqQgJWgma6no5jDvsnEyMbTzc7Ny7zCt7C6vLS8yrzDwba3vK20wLm8ra+ooKmntq2uqbK3mp6soqehnau3uKmlr77Esb25s6eps7OtrpaVpaynoJGOkrHFp5WNfJGVfYeRmY+qmZiTk4+TlZOlnpOdmZOho6KcmJ+Zi4yPj56IWpCXl5KWpZlmmaOfs6WWo5asraunnJ+nl5iWmJWhpKimnrasqbq8w7WmtLbLwbiqtqyzu7iuqLi6vbiDbnBcWlZXUEdLU01LP0FIRURHRkc4NUZNOz43PkFKLjMyMDI1QjU1UFdOO0xGS1JMT0dHST5JUT86OElTOzs/Nzk+RExCQEhTS0BXUEY6QT9HNkE3O0hNQ0U7Qz00RkU6QkFCRzkvOkEzNjAzPkdEOTQ9dGRNRztFKzpmfGhXOz1AQkZCckZpSVJlYkxGppSclqGXqJaMkIOHpZKIgYeCnISDlZCRlI6aop+vvq6hx77GxcjHzs7O0sq+u7axuru8vs62xL23ubeysrWzuLKrppyrq7irqaiwsJejrqSnpKW0wLCqrLO+wrrAubOnuLO3s66Vpa2urqSLk5WhjXPBmX2WmYSOlpqLsZWampWSk5mZpqOVoJuWmqicm6GgmYuMj5adYEqWnJqUmqWXVJawn6+cn6WUr6+tppuhppSTmZmOnaCnopm0qaqzvby7q7Cyx8C4pqurrbGxo6GysrSkcnFnXlxQUk1FUVFQUTtIS0lGSEFDPjlLVD9BOj1FTTA3NTQ0OkIzNE5XTzxKS05VTlFKUEhISk9CPD5NUjs+PTg6PENSPkRIUklCV05JQENBRjM+NThKS0NBPUM7NEVBOkE/PkhANSpCNTIsPmNdZzozNXRkZUBSNyYjM31pWDs6QkNAPVJFV1JzYldGSKuXmZ+hqK6YkJeHi6eWjoiShZ+IhJyXj56gm6Oltcm0qca8w8TIysnIzM7Hvrqzr7m4wMHNtci6wLi1urGvr7K0pqObqrS0q6mmrqyZpK6lpaisur+oq7a2v8HAv7izssKvt72ro660rLiliJuXppt2vqCEmJyOk5mai66WoZybl5WboKGpnqigmpqqmaGnnpeQjZGdg252k6KalZ2in5CusqOrlamqmKuupaWgpaqTkpmciZWcop6Wsaeqq7q3vbOyrr65tp+jp6ilppycrKmpjWVoYmBTTE1HSE5KVUw9TURNSUpBQ0Q8UVU8QUFCRE8xOD03Nz9CNzVVWE4/SE5RWFJQUVRKUUpKRUFFTVE/Pz04PTtHUjxFRFFCR1lNS0FIREU6OjM5S0lCPkNCOTlDPjxAPjs7RzctMj4tMYJoTnpcLzBraGA8PUJCODZ6Zlc7Oj0uLlNhTVZIf2VeSEaslJyhn7uumJSei5Oqm5GSk4mrjYeinoykrJSjo7bHvbTBu8PDyMnFws7Iwr25sq+5tMDCyrbGscG8tburqa2sr6OimKq0uqaqp6yqnaivp6Srq768qKy8s7i+xry3tbjAsL2/s6m1tqu+pI+il5Gin7yfiZqgmZeenY63n6mcpaObnKGap6WzopudpZyoqp6ZlY+UmouXiY2kopScop+gta+lppOxq5qrrZ+fpaSqkpaVoISQnp+clamloqG0tbq1rai1srKenKKmmpeVmaqhnnhiX2FfTElHSE1RSU1FRkZCUkpIQURHQVZTREg8QUdRMTtCNzpCRjc5XFlLQUxQVFVTTVdSTlVKREBKSk5POUM/NT08TlFDPz9QP0VaTUpBS0RHQDUzPUlHPz1FQTk3QTs8QDw8M0A8Lyc7KkiRQjpTSjAsW29XNzE8Kh1CgGRUNDktMTpoXUZEQ5xwYkdFqJeknp7DrJuXpZeZqZyWmpqPqpaVqKaVrayZoaq2xMK8v7jBw8HIxL/Nxru+ubKwuLO/w8i1wLC8t7m3p6Srq6yhoJqqqsSipamspp6sr6yiqqi/uKasvbC3t8a2tbm4vrC+wba0srSvvqOWo5aTm5Stn5ChoaWjo5+QvqWpnaisnZ2hm6afvaKYpJ6iqauhnZaNlZ6Tn4ePhY2TnqSgnbWsppyWsqeZsKmgm6ufoY2alZ+EjqGam5KlpJqYrLG2saqlqq2snJigoZKOkJWon5RpZVtiXlBKSEtPTEhFQ0lAPU9IQDtHSUhbUk9LPUhOVTRCRjk+SEc1Q2JbS0NOUlVXVlFYVFJVSEA4UVFQTTpHQDRDSFFTSUM7Qz5HVktDQE8+SzwwNjtHRj47RkE1Nj85Oj85OzE1RDAtLDBNdlw0S1o1LE1uVzwtPSkeI3piUTVDS1E5b1JGPEt4ZmNYTaKao5uexauhn6ydna2fkqKelqSgp6qsl7awo6qztsXCvcC2wMK8ycK/ysi2uLW1sbS0t8HGt76xuLW6tqCnraqsnZ6fpaTBpaCprqCkqa2voqanvbalsbu3trXDsrO3ur6xw8C4uK60tLSinKSVkZOgrZ+YoZ2oqKuimsOtqZ6srpubnpimoL2hnaSYq6urpqGZjZqfkp6Jjlh/lp6moaC4qqeTmbejn7OioZywmKCPmpSego+gl5aNoqSVkKaus6upoqKlpZWVnJmLj5GTpJ+JY2dcZWFNSktLT0ZFQUZLPj1JQTk5SkpOXVFRST1MV1w5Rkk9RE1JOEhjXExDTFBTWVlWV09aXklBPVdRSUs/SEA1SE1YU0hBOkBBRFBIPz5RPks3MDk5RkU7OEc/LjY+Nzg+NzcvMT85MSUxUVVtW0pPMTA9Z1dEMTc9LSt3YFM2U1prV3NIRTY9dWVcTE+en6GYnsOnpaKzoZyyp5OqpJ+jn62prJ27sKistbLIw8HDs8LEvsfEvcXKvbCwtq6xta+/xbW6sbC6tq2aqbGpqpqepqGnwq2brLGcqqKusKmkp723pra6va+3w62zs8K/scazurertLatqqKllZWUo6uhn5+Zp6uvr6+7sqagqamZmZeSoqS4oaGkkq6vrKSmn5KhnpWej5GNlZ2ao5+ntKenjZi0nKOvm5+cr5GglJiUmoCSopaPjqChk4umrLClp6KdoJ6SkpqUhYuSjZyfgGRoXGhmS0pMS1NCQ0BJRzs7Rj44OU5NVV5SU0o+T15ePUhQQk1MSTlOZF1MRUxSVFlbU1VPXGJIQT9aUUFIQUtCN0ZFTEtOPjtCSEROQj07TkBBMy85N0NCOTdGOys2PDQ2PDM1LS80QDErJ1Z0U2VPPzEwNGJbTTIzPjA8dl1eP1tVXmZyQDg8SJZ3ZUE0n6Sfm6DCqKOqsaGjtKmWsqumoqSyrK6pu7KtsLS0xr/ExLbAxb7KxbbAycK1q7WpsbiswMS0t66tt7qlmauyq6qYn6aXrbu1m6iwm62frrSyp6q6s6e6s7iyuMCqt7LCvLTFp72urbe1qaesoZeWkaWkoaGXl6SvuK2ytbagn6ikmZSVk6Ogt6OkpZWusbKlqaWinpqampWYqJ+emKKerrKipo2Yr5mlrJibn6aSnY+VmJqGlp+UjJCcnpSLqamroqehmZ2WjI+ZkIGGlomVn3plal1sa09RTk5UPUJBTkM7Okk/NzdRT11eUlZRQVdgXEJKU0hXS0g6VWRdTkZPTltXW1JQUVhdR0FCW1BCRz5OQzlIR0hOUD8/Q0lCTEI8MklBOTQxNzdCPjs3RTcrNjkxNDgwMi0vLjw2LSNCcWdzazIzLzFcY1ozMzkwNnBbYkgwNUpwaVZDV0aMeWZDO6SknKGlv6anr6+hqbWqnbmvq6SqtLexsLm2sLe4uMW9w8e9vMTCx8G5wcfBuqq2pa27rcHDt7iqrbK8o5WtsK2yl6Wokaq5qqCnsJ2qn7C0s6qptrasu6yzsrm3rLmwwbm9vqbCq7C2rqmqq6admJiqoaGgkZegsK6zq7C5mpupn5mWkpemoLeppaKir7Gzq7Gnq5+boKCbnqWdoZedo7Owm5+QlKaaoamblqSgl5mLlpmUlpedk4iQm5mUjqmpp6CjnJibk4ePmYt+jJeGj5psam1ibm5YUlFaVEFDRVVAOztIQDc6WFBkXlBXV0RZXl5NTFJPX0tKPlpkXk5JUU5bVVlQS1NXWkk/RFhQREY+Tj89SUdHUVBCPUNGQk0/OjJEPzc3NTQ3Pz05NUU0Kzc1LzI1MS4tLiwxPionKz1ccD0+MS4xZVtkQDE3NDdnWWBGKEA4bH1oXFY6iXtjQz2on5yhqbyhqrCqo7G4qaW1squhrLW9r7O4vLq9t7bBwr/JxLnFw8HAucW+wbivtqert7K8v7+1qq6yuJ+XrK2orZeoqY6nu5+lrbOeq6KxsLOsqraztb2tr7G1rLC1scC5xLarvK+xt6ysqaKxpZ6kqJ+jlo+Yn7Kqs6mqs5mdp5uZlI2gpqS0rqeirKyusaeyrLKpo5ufqKSelaCZm6i1qZeZkpKfmZ+hn5KtoJqZh5aZjJ2anZOKjZaXmpenpqOgnpaWl5SBkJWFe4+ThIyXZ21zaHBzX0dZZlZEQ05YRFo5SEI1Pl1SaFxOWV1HW15dT01SWGRKSkNcY2BQTE1OWFdYUEpWVldMPUVVSkVEQU0/QUZISFFQQTtGREZLPTg3Qj02ODcxOT48NjVEMCs4MC8wNS8qLC8tKj0sKyUyKyo1SzEuJ19eYVYxNTE9YFZeOClDM1lVXGdLNYx6ZkxApJmgpKy2o6yppa6utqqutLmmprC4xrext77BwrW0u8W+zMW5w8G6wLrEuMG5s7Wsqrq3u7q+tauusbaYmKirqqubrauPq72eq66xo6qfsa2zrq62srm3qq2usqe1r7S6vMmyqrW0sbSvrqags5+ZqKygpZWVmpmxoq2gpa+WoaSZmZKNoqWmsqmhprGrqrWkrrC1r6OYnq2nm5eemZmsuKKXk5CPmJyhmZiUraCelYKUmY6enZqXkYuUkp6apaOjoZmWk5KWe4yRhXuNi4OLlGxueW91fGFGYGpaSUhaWz17SkdFNkFiVGlaTVxhSltcWlJSU2JhTEtFYGFgUExJUFdWVU9HV1ZVTjpJVklIP0NLP0VESEhRTkE/SEhIRTw3PT46NzU2MDk/ODY2QiwtOCwvMDQsKCwvLSo3NikoOS4kOks1LiJUYFZhLjUoQ15RXC4qQS9KR1BbRzNjWVRLRJmXn6+osamspaOurrWptrS3o6u0t8q6tLu6v761tLfDwc3HvMS9t7/AwLjAvbK9rqe6ure3wresrrK4lZemrquno7OqlK+6pK2ysaanorKzsbKxtbG3sqmuq7KnuK+1s8TEtqm0tauwramnorafnqaxoKSUm5iUsZ2nm5+pjaminZuVl6WlpLanorCzq6exp62wtaykmaGsqJycnZuUqrmclY6Oi5icopiRmKijoJeEk5eRnpyYl5aIlo+XmqidpKGTlpKQlneFkYd8hoKEjY1ucXh2fH9dS2VsXEpPZFw/YntHSThHZ1dlW01eYk1YWVdVWFRpXVBPSGFdX1BKSFFWVVJLSFdVVk04TVpORUBGSz9IQkNLU00/P0xPSEA7Oj47NjswNDE8PTQ1OD8pMDcpMS4yKSksLC0rLTkkMDQyJTlCNy4jQU5JZzI3J0ZhTFYlLUIuPUVMUTwzcmtLREORmKStpKytq6ajsLKzqrawtp+rtbrIua7Bu8O3s7K1wsPPxMDCvrS9wcC6v72zxKiqubG2t8C9sKyzs52gp7CtpaaxpZ6ytayrsrCsqai0uqy0s7WstKypq6isqbmtsbDHvrikua+pra2mp6ywpaOjrqOpnJ2bmq+ZoqOio5Csn6Ogn6GppqW4pKu0tKSqq6isrrauop2jqKqcoJmakqS0mY+JjYeRo6CWjpWfoZaUhpCUlJ6bmZaVh5iSlZmnnaCgjZORjpF4fo6FfX19h4qKcnRzf35+XFJkbl5OWmddRkSWW0c6Tm1YYltNYWJOVlZWV1RZZ15RUkxkWltUS0dPVFNOR0lWU1xOO1BeSkJESEpBRT8/S1NPPjpOTUM8PD45OjU9KzMyPTYyNDk6KDQ1KS8sMSgpKywtKiY1Ki8mMCkzODoxJiozQ2U7NipIZEhKKzpJPzNDSVMsPo9rPkhJj5qpqqGpr6Sno7O0sbS1sbGhq629zLquwbvGsbSttMLD0cTGv8GzvsPCvMC4vMWorbess7i8wbGssq2hpKetqaiksaOrsaqvq7Gurq2rs7unt7GyqbKpq6alo626rKqwwrm0rLmoqaitqaewpamkoq6qqKKenKKslaSdl56Yq52hp6ihrKairKu3sbGgqaKfqq2wrJ2epqepmqOYmY+gqJiGg46Ki5+gkIyOl56RkIeIkZWhnZaYloaWk5OXpZ2dnYySkI6KgH+IhX13gIeFh3Vzcol2bF9ZYG5jUXNyXEs8hHxGP1d1WGBZT2NcTlVWVVdQXGFfVE9PaFhXVktHTE5SSEVJVlJdYzxQXUQ8RkhIQkc/PUpQTDo+T0o9OT89Mjo3OyozNT4xMDQ4NSg1LyosLjMwOyksLCclMjM0JCwyLTg2MCkoMTxeSzAuSWdERjg8QjA1RUtYMUCUXEBNRpWWrKehqbGcqKmwtqy4tK6qpKurvcm7sb63w6+wrbPExM7Ow7+/tMHExLrBtMnErK+3rrK6wL+0rq6rpaiqsKmmqLKmtK2qsK6tsa+zrLO6pLizrKytp6ugop6wt6uqrbq2pLW1o6morKyqrKCopqaxsqOmpaGhq5apoJOaoKaeo6KqpKyinqaxt6ysoqWimqmqramcoaWkpJmgmpWPmJ2TgYKQiYWdoI2Lj42bkJKMhY6ZpJyTkZuMk5GRlKObm5qLjouLfIeBgoJ7dYGEgn51d4ukh3lrXmBuZ1dmh2ROQGeSTERieldiWFJlVU1WVVVUT1xdYVZLTmlXVlZJSkhJT0JHSVNRWW9BTVhAOkpHRkVHPj5FUUg4Q0tFODdDNzI6OjoqNDk/Li80NjMpNCsqLCsuIzQuLSsmKCs3OSomNis8LTIsJjA2WFouMEpnQUE8PEMrOkpPXjREhkFJSESWka+koqmvmKmorbWrtrCrpKuqqbzBwLi5s7y1prKvxMnL0b/Bu7nAwMK6wbrCxK6xtbK0u8G+s7KvrausqLaqpa2wq7muqLCwrrGrtaq2taa0tquspKmqnKOds7OoqKSztKC2rqGpqKuoq6afq6uoubapqampoamfrZuRqKGdoKOipqKqnZumtK6npamio5elpqeqnKKjo6CZmJ+Rjo+YjX6HjYeFnp6IhYuLj4+RjYWHlqOajo2akZKRjpOfmJmWjYuEf3SHgYB/eHWEgHt4foCInY9wcmdncXhcYXSIaU9dmFZIbXlVZFZSY09MVlRVUU9YWmJWSFBqVFZTR1BZVUk+SUhPUVB4TU5WPTxLRD9AQTxAQ1VDOUFLPTU7RTEzOzk3KjQ6PSstMzQxKjgqKisqLCkqKC8qJiklMzssJDIpMjAyMSUvMlJjMDI/Zj1OWD9DLD9MVF8vSWs3UUU7lY2voKWqrJmqpK2us7SuqqWvqam7vrvBsa+4raK1r8nHyNDAv727vMO9usPBwL+vsbOytr28wbKys6u0qaW1qKSts7K4r6KttbGvsbmquK6qrrarqp6pq6CjobWtqaGer7KhtaqeqKiqo6qhoaytqL2vrK6soaenn6yZj6+imKKgqKeep5uYqbCoop+soqGSoaKippiaqKWYmJidj4qHlIh8jYaEhaSWhoOCjIeQj5GFhpShl4mRnZCTkI2RnZWXj4qFhnhzgX99dHh6gXt0dHtqgoikdmleZWyBdWeIi3xSV3BeS3hzVGRTUV9NTVNaZ05NV1llWUdTalJRPkJOUWFROklITFNJcVFMUzs8ST87PD07QEBXPDw+SDczQ0IxNTo5My01OjopLTMxLS02KSgrLSw1MiMyKScsJS47LiYxLjAtMTQlLDBNaTozOF89YWQ/RjFDUFtbK0hQO1lDNI+OsZ+kpaqjpaOsprSzsKmksKequL7BvLCouaqnrrDJxsjQwr3Avrm+vrzJvMK5sbC1srq8ucCztLutuayjtaanrLG2uLKmp7q1rbS8r7ulra21q62cqa+kn6WsqqecnaqypLSpmqqnqqSpnaKoqKm9q7SvrZ2po6Cum5qyopakm6Sln6SamaeqpZ6aqaGbkZugpJ2YlqmpkZmZkpCLgo+FfY+CgIiej4eAfoyIkpCQhYGUm5SGk6KMk5GLkZuTlYeJfoByenl+fGh3fHt1cXJ+aYZ6hIhkYGhjcoV7bWh5XV5WQ1h7bVRhUFJZS0tNcHRdSVpbaFpFVmdPQz5LTkRDQTlIR0tTP2phSVE4PUg8PDw+Ojw/VDY6P0M0NUg+Mjs1OTAyNzw1KC41Ly0xMSYvPktJMSUaOTAlLCwwOS8sLCs2JzE3Iy0vR2pJMTRYPWZiQUo3R1NgVSo9PEZcQCqOkrCZn5+ppaOhqqS2srGkqbGnrbnBvbWwo7mtqKiww8nIzMG3vcC1t7+6yLbDtbSztbK9ubq9tq25tr+torOmqquutbe0qp26u6ixv7K6oK+0tqmsnq6xo5ylp6mjnZykr6avoZ+qqaehqZyjqKCtu6eusa6gq6KjrZ6erKaYn5uhopyfmpmiqqKamaOjlZaTnqGWm5amrIuekY+RjIKKf3+PgXualIyJfX+Mh5CPjIqGk5iRh5SjiZGRh5CakJOBiHx5bH12eXhie3pycHFzeGqCdWqDZ2NoYW5zjm1ianBgb0JdeWtWXk5RUUtJTVNZVk1cXm1XRFhhT15QSE1ERjs3SEVLTzxyaEpLOUFFOzs9PTs7PUo0OUI8MztHPDQ/MTgtNzg7MigwOS8sNS4uPS0qTD4qHTQ5JicuMzQuMCsvNCYsOiQ0MEFoWjEzUz1lX0RMNktWZE4pPTNSXT0jkZesmJ+Xp6Ohn6ejt6+toq+vqau5wrqzrZ+5r6uotLrHysi/t8K+r7S+tsS2w7KwurGywLa7vripubi9qqS0pqiqr624sKmZubyjrb60s6Gut7Wnpqews6CepKWnoaSZnqyoqJ6gqq6noKaXoqifsLifo7GvoauhraSbpqapmpqbn6OVnJuZnammlpqeqJGYkpidk5mWoaqQmomNj4d9h36CjXx8oYyMiHmEjYWKjY2FiZOajomVn4iQlYKMl42RfYR7c3B8cXN0YHl4am9wcXBqf3NkemxoZmRiZoeAYFtyanFNToBpWFpNUUxLSFBSUUhNXF9vVEVYWlJnT0hLRUY1NkhCTEk1WmVKQDZFQjk6Pj0+OjpDNTk+OjNARjwyQDIzLzo7ODMmMjwwLDg1QiopLUMqLDQ7Tk5AOzczLS4rLTcqKjwlNTM9ZmQyNE0/ZV1GTz1SWmdIKj8wXVs1KJWbpZiclaygnqGkobeqsKO0tKmpusW2sq6gt6ytrbC1xcfAtr/CubC1vLa+u7+vrL6ws7+yvcO5qbu6uKeotainq6+rs6+lmby2pKu6ta6fsbivqaWnr7KcoaSgpKShlpuvpqGfo6ivoaCik6Okorawoaawq5+ro6+Xm6qlqJ+Ymp2kk5qbmZylqZmbm6SUlJeVnI6Tl6KpoZCJio+GeoN9g4p5j5eKjYd6goiEiY2PhY+TmIyOlpmKjpZ+hZeMj3qAenBxdm5vdF94d2VtbGxqaoRvZnJpa2ZpXmR0gWBba3ZpWkp/XlxYT09LSEhSVUczOV5ebVFFWFZZZU1ISUVFMDdGP0tCNklKSDs2Rjk0OT49PDk4QDg7ODo3QEk+ODw0LTM8PDc1KDU+MSw7QTEoKzY8IjhSPSoxMTM+RDUsLSc0Mio7KzEzOWNtNzRHQWZbSFREVV1oRC48MmRXLDKUoaGXlJuqnaShoqG3qa6gurilrL3Fs7Cuo7Wvra2utMPDvLO/urexs7m3ube6r67As7S5r7/BuKy9urWmorKpp6myqq2xoJrAtaSntbWonrK8qaelqa+smaOnnKSllJihsaWZn6SoqZyin5Kkn6O4qKSnraadpaGokp+ooqGhmZucoJKam5afoaqbmpiglJCTlpmNk5OjqKSQiYmOhnmEeoOFfZ2NiYqHeoGEh4mJkoWWk5KLkJWTjI2Ue4KXjot3fntsdHFsbHNhd3VpaWpnZ2+GaGhpY2ZpamBrY2poXGV7Y2BTdFRcW1NMSkdJT1NAISppXmpNRFdVXmBLSUdFQy46QjxGPDZLUEQ4OkQzNTc9PTg5NT86OzQ+OEBLPT45Myk4Pjw6OSo2QDMuRTQoKyw/MC1OPy4rLTcsMTE5NSwmLjUtODA1NzZgdEEzQ0RnW0tXR1VgaEIzNzlnUCcynaKjkY2kp5uenp2jtaynqrq3p6zEwbawrKO1rqeur7e/v7yywbewrrK2tbi2tq2qvbOusrG9v7iuvLuxpZ+2qqWls6iqrZ6dwKuopa+yqay1u56oqauxpZieqZ2mpJGZpq2imJ6kqaGboZyWn52ntqWvqq6hoZ2doZSgpp+hoJqbmZyRmJyTpZ2roZeWnJSSjJWXi4+YmqmgkYiJioh5hXaBgoKdiIuCiX1/hYiHhpCElpWQjpCRkJGMknuDlY6Gc319Znhva2prZ3Vza2NnZGR2gWNlZmZmampja3NaX1ldbWRhTmlYWmBWSkdJS01SWD45X2xpSENVU1xbSUhGRkEuPD85QTg5UkZANzpCMDM3PTc2OTI6PDk3OjlETT1CPDAqPEA7QT0tNUIzNz0rKiwwQipKSy4vKiszNzIyKDU3JCs3LjcyNjg1XXlOMj5IaVpMWkpWYmZAOjNCaEglNZqjn5CMraGYmJ+WpLOxorG9tqGxxry6sbGkt6yqrqm5vLu6rcCyrq6utq6yuLOoq7mxr66ztrq2sLi9rKaetaqgoK+jqa6cosCgsaOur623rrWera6traKanaeppZ+Vmqeln5mloqidmp+blJydrK+luqeuoqGamp2ZnqSapJ6XnpiblJmgkqiVqaeak5qakYuVmY6UlJmpp46NiomPfIJ0gYGKmIWHfImJhYWKjIqShJSck5KPkJGWjpB/gIyNgnCAfmZ5bWhraWdxcmtcaGNjdIFiZmhqbmxnampobl1sbHRwYVVjaWRlWklGTE1PWFFRVmFlgVRAVlNZVUZIRkVALzw9Nz82PEZOYTg6PzI0OUAzNzgyOD83PTg+RkpARDkyLT1BPUE9MDVAOUAxLSsuMzw7SzYvLissLTI0OzYjMyopNi41NTQ2NVp8XTE5S2pbTVtLWGRkQEExSmZDJzSRoZqNjrCempOhmaiyr5+4v7agtMK7vbmxprawqK6lt7i3t627rqyqq7aqs7itpbO1sq6psLe2sbO1uqapn7WonZ6ooaismqe+mK2jrq60ta2sn7Gtr6minJ2jq6iclJympJ2aqqKklpqfnJCbo6uqqbufp6SgmJmZnaGPa6KWmZxwgpWao391kamnnpSUnpCIl5mAloqhkHiGlIyDbml+doNxbIaLhn2EjIdwXmNhZ4SYhmyLj5SSdHeLhH6Dj39nhoBndWhlV1xoc25OUGpjZ3OFZ19kZm5tal1gYYqPg4RlTktEOUZUZ15KR1BQVFVLSFJgb3RlRlpRVVBGSEZDPjE7PTY9NjwzZlw1Ojw3NTtENDg2MDpCNz86PkZMQ0IzNDM9QEBAPTI4QEU9MSwrMDg+RzYwMS4qLiovNTY4LCMxJzIxNDoxNzVYgWwxNk9rW05cS1tmYj5HMVFkPSoui6OZhpWwm5yToJuqraqjvcWvqbjCuL28rae2sKWro7ezsrOxua2ppqy0pq+1oqi4traop6y3s660rbOhqZ6zqp6ho5ulppirupWlpa+ytq2upKmuq6yloZ+coKenm5egpaWbm6ennZOfn5iQnqeqo7Wvo6KinZaXl5ejiKCOkpqHoYeTnKB/pH+lqp6SkZqRiIRyeI2OhYihdoiMaZeIZn1yeKFviIeEfo59f6GgoJmAfIeedIeOdpuKbIeBg2xoZWN6a3FhU4VtY2xpmHFZanBviFheaVtsbFuIcW56coVnhoRaXkdOP0dfTUVSVlZRUVJXVGdeTVdJUlNQRkdHPjw0OT05PDc7MDw8Nzk5OjY9RjU4NjA8Qjs8OT1GUUc9LjU8O0A9QD41OUdBODIpLjE8STkvMDEuKi8oLTQ1ODMlJjIxMTU+MTw4WIN1MjVSa1tOXExcZ189SzFXYTcwKIumloOcq5yZmJ2fqqqnqr/Dr7G6vbfAv6qlt7CpraWytK6vs7eqqaWwraW0s5yttba0pqeos7Gtsqiunaqgsqigo6KZoaGarbOUo6SltbymrKerqqyopaGgmKCmo5mZpaOkmJykqZaUo5yUk6SlpqG3o6Ogo5iVk5eSnIivkJiUiamLl6GbhbGAo6ydk5mdlHmD1KiAh5XBm8d5eLGlt5dkgMCcv3mEhHmQhHyQkJHKcZe8nMV6crWmu5B7gGyWsauweGhrWLGubmVpvJK8bmh6b3KQ2H5Ta2O2sn+BcpV0mqGqkFdPV2JQVk5GVVtYUVBSjFxXXFBAXERRTkVHSjw8NTc9Ozo5Oi49Ozg3ODs5PkY2Ojc0PkA+Njk/RVJJOi41PjtCPD9BODpKPjUyKjIyQkUvLjMyLisvKS0vMTg2LSAvNDE2QTE9OleDdzIxVGtcT1tNXmdcPkwxW100MSGNppKAp6qfl5ydpa2yqLHCvbK1wLW3vsKrprOtrKmnrrOpr7a0p6eltKWnt66cs7K2qqWkp7KurrGmqp2npLGjop+dlpqena6rlJ6in7O5o6qpoq2upaGdm5qip5+Xm6egn5iep6eRnKeak52hpqKgsKKfn6OWlpKXkpmFr2tqio2qfmeDlYatZHCdnZSZpZRxrqGkfni7fWuhj3axX2q0W6WAZpyRYGaCemZ/anhrqWS+cmemjHWxanyxeHSSk2NtbaduW4SgRWhmh5ZFdZxgfmh8pKeCWV+Lq2mAlnh5aqc3Sq9cWFNsZFtLTlhfXFdWO06JT1hXL0lUVEpERkY9PzQ2Pzs4OjkwPTg5OTk6PTxEODs6Nj1BQDY8QEhRRzkwNzxBQz5ARDhARz0xMy0zM0UzLi41My8rLyguMC46NS8nJDIwM0IvPTtVgnYyLVZqXE9ZTF9nWTpNNV9ZMzAbkKKVgqynpZ6jpKqyt6y0vb6wtsSyt7rCp6mwq66pqbCuo7C6r6OkrbKjqLionrOysKOloKqtr6yvpqefo6Kwm6KblpWWmpqspZaboZ6zsqKrnKKtraCdmpegoaicmJ2jn5yZoaakj52impegn6qepqagm5+hlZWRlpGahbWbtXiFqZm1mXaGs5u3fpOWlqiUfmyCpnuChoiSlJJ3q2drsVure4+HlHSJcY+GgH+IkJd4goKLmIyDoI+EsHZ3n3Fra2x8i06kWEhjY5l+Y2imYHlzdVOTh15QqW1jcX6HgGKcLlGhb1tTa2hgTEtbZFhcWkI+sXlYWEEjTWhGQ0VBQEExOT44ODo4NDs6OTw5OkE6RTo6OzY6Q0I4PT9LTkc6NTpBRkJAQUQ8RkQ7MDIwMTtGLDAuOTQwLC4oLzMsPjgzMR8vMi1EMTw8U31uMytYalxPWE1fZ1g3SjhhVTUwG5WflYezpqagrqmnsqypu7bCsLvCrbi2v6qsra2upq2xqaGuu6qgp7Sso6u1paazs6ejop2nqrKosKilnp+fr5afmJSVlZedrKGZmaSotK6hqY+pqKqbnZWYoKWnmp6cop+boKOko5WbnpeZnaKpm6WZnJyioJaTkZOTnYPVk5m5cLDCfsWGfNaUm7t8mpWkj42cjaR7joekgqWCeqx5j51Wr3qIfp9quVq5doeEfaaCk3yYeqp5jZ2Qe7FujoR0kLyFb5RQr6fFilGgemNgqWJzc4htl4hgU7W0yIaAiXxjpDNCnXZdUGppZFBAWGdaZGFKSE5tTVtST1lmWUNEP0U/MD08NTk7NzQ8Ozg9OjxDOkY6Oz42OkBDOzZAT0xIPDo8REhDQkNEPEVGODEyMTFEQy4vMDQ4MystKS4zMjM5NzEjJTUqPjM9PVF3ajYqWWlbS11PX2ZUN0c6YVE3MSWbopOYsaiopbOqpbSppLy3wbC5wLG1s7qztaexsKOwsqafrbWnmqe5raOvsaCztLCgpJ6fp6mwqbSopJudnquXmJeVl5WVoKmcmZanrbCoop+PrKKolp2Wm6GloZihoaGhmqGippueoZ6UmZumoJunlZubn6CYkJGUkZ2Ism5otXGrh26OpnK0c3K2e5qXpIuPnY2jf5GhpX6wdoOR0tJ2XK57hX+kb5uqpmuHhX2tfZeZj3uxc5Kdj3mzZZZ0hJ5vnmaUUsiLWsJcn3liX61gdnSHYpeIXlnKnW+/gXVNS7VTVcZkVFFqY2ZYQU9rYGxoUFVHSTg9VlFaV1hJQz9KPDI/OzU9PDQ2Pjs3Pjw9QztHOTtANzs+RDsuQ1JKRz4/PElKRkNFRD5ISTkxNzQ2QD4vLjI0MjUyLSkuMjYsNzQyJh82MDs1Oj1QcWg5J1dpXEJPVF9lUDVHPWFNNjIwoZ2Spa+tpKq8raa1pae2u7yyur+3tbO5urOltLShsbGin6uvpJemua2ksbCctLiqoKadoamksqisqaSZm5qonpWUl5iSkqKnn5aSpaqwpqGVk62fpZKToJukpp+VmqWmoZqin62ZoJ6dkJWboZ2cpZSdlZminpWYlZGbhax7d6h2o46IhqlvrYqCp4OYmKGJkpqKon+TmYmuhX+Cs1xys1KufYOCpH9x1314hX6PnYaZmnevhoqRnIh4s2GaZZqBgpRsklqwWEuadZh5ZmCtXnZ3h2iYiGtdr3eVno94bDV5yK6yX0JUb15nYEVQbV9wbVZVTS5lY2hSWFE7QURATDo1PzkxPTwxNj85OEA9OkM6Rzs8Pzo+PkU5LUVVSkVAQzpNS0pCSEc+R0s5Nzw0Njo+LzA0MzMzLjIuLjE4Ki4zMiUhMDM3Njc9UGtlPiZWZ1xAPlZfY042R0NgSTo5OZ+dlJ+4sJe0wa2os6ipsrq3s7i/ubextLu0pLiznrOsn56oq56Up7WrqLGxq620pJupoKCoobanpqmimZ2UpKGTkpuYkZSipZqSj6atr6aglZmpn6KOkaGaqKSglZmlqJ2cpJ6snKGdoI2UnpqdoJiZm5aXoaCTl5CmnoapfX2leKGPjoKqcK2LgaeGlp+hiZeXiKOCkYiUqnyAi514b7FaqIKCiKB5dNh/doh0qIGOm42So3yWkJ+Ee7JenGSgfoOVbJJcq1tak3+Rf2hnqmRye4FrmIdzXaxaiaCOa29lT0pDoVxbTHRdYmdNW2FfcnNfSlY2SpuTWEhFPUdGQU0zNUE4Ljs+MDVBNzhAPDY9PEY/Ojw2Pz1CNy5IVkpFQUg2S0lOQElLQEVOOjpANC47PjEwMjE0NCsqMDUvNywmMjEoJCQ2NjcxPFBlZUEmVWZbPzJVX2JMN0ZJX0MyPzihnZmZv6uXtMKurK2pprSwt7G1v7m5sbC1uqm6tJ6vpJ6kp6edk6qwqa+ptayqr6GYoaCmpaS6oqOroJabkaKglJOemZOXnp+PjYuosK+mnZabqKafjJKjl6iqppSWqaeenqCjraOhnqKNlaGYn5+SnpeclZ2hlZaOq5yPrm1ytHKpjHaKp3O0eHOzgJGko5KcjYmkh5B3uG+Me4uiamu2WqCFZZeXaaGip22TcrR0k5h/smqFkoita3WzYZ1mom+HkmqXXK1fTaF8h5FSc6NseX9+b5iHcVyvVjycd2VUb24uXKdPY1NrZWJtWmNdYXB7Y1RaUT4+bW8zQ0JAP0w5ITdANi47QDM3QzU4Pz8zOzxDREJKRk1JRjYySlRLRUJJNklKUD9ITkNGUD08RTUwOzswMTAvNzUsKyw0MjYvIzAwLCwdMjg5LzlOYGVEJ1VkWT4vVV5hTDVGTV44MUM4pZqbnbuhnLLArq6rq6e3qbivtcC1u7CuuLaqwbWoqKCbpaShnJGqqae1o7Kor6qgl5ynoKSruJ2jrZuWmY+lo5WMnaCamJyfkZOUqrawp5iUnKypl4yTpZmlrKKRlqqyo5+epquwmaGjj5milp+blpyXoZKcqZyUkKuZh9SSmrtzsMOAw4Z+1ZabuHiIkJiMmIqMp4h6o7Z1fXd2woKasmCDunnAfHW4YrWBjIepfZWBrKlxe391vIinoGmdYaaOr6F+jHSHqn2+bnO8dLKDdXiBi26aiHFujaR0vV53fVthebxrWlZcanleamFlZ2JteG9ZW1lDQUByQENGKzVHIic7PzEwPD83OkI5OT1DNDxATlpeYGBfX19aUFBSS0VGSjRITFJASk5FRk9CPEU4ND05MDIwLjg3LSouLzE4MCItMSwzHiw8OjA4TFhhRidUY1g8L1ReYEs1O0xbLTdCOaebnqG8opexw7Ctqqussae4r7bEsbmwrbmurcCxq6OinqOhnJuQqaOqsqS1pq2lnpaZqpmmrLmdo66YlKCQpZ+SjJyjnZedm5GVkq65sqyVl6Onp5SQlqScpKyekKCoq5+anqijs56jpY6nopSimpyXlaOYkK+gkpSpnoWQmbV/j5GMt5V4gpOatXdta25zb3mPhI6JdJ7Bu72ae4GyqHCAdJG5g3yGhoyGjXuKh42XfKS7ub2cdXq0o3R2l3V0sHWZnmaGao21dHJxd7aMXoB6fYpog3lteWOLrHB1hX9ZW6dqRWVaVGZgY15jUWhncW11Qk1QTEQ6Wk0/SjM7MCA4PjsuMz1BOTk/PTs8QzZCVFlaWltbWlteYGJgXVNHR0g0RElUQktOR0VPRj9HPDc/NzA3MC85Oi4sLy0qOC8lJjIoNCQoPjcvN0xUX0cnU2JXOCpPXl09KzpWVic+OzynnqChv6WWtMK0rKuorKupuq6wxa60sq22prS4rKmhoaWeoJ2Zk6ukraqmtaenn5uWoKOdrKS+pqGql5SckKGakY+hqKGTnZiTl5SxtbetmJ2kpKKKkpKlm6Wqm5WopaWbmaCopqajqaGRrZ6Wo56Xl5edno+wqJSbp6GOan5pm6V4h3J9mo50emSHe72+wLpvkoJxlYdhc2paXpuKYWOIjpVrYICVZG2dd2KVa4CalZRlXmBjcZqKaXKMfYWVZ2p+cnR4fX5iW3d0gWhQXG6EfXyLa1hseoJzSkpvhnBOdExFV11nYUxaWGdjX09bbnVpclJPREVOO0hIPU0/MiwyQT84LzU/Qzw5O0A7PUM+UlZWV1laW1xcXWBhYWFgXFVHNURGVUVKT0hGUElJSDs4PTUxOi4wOzouMC03Nj01JiIvKjIsJTs4LTdKUl9JJ1NgVjQpUF9MKDM9W08nPzI+qKCoocKjmrS5taOspa6np7Wxq8irsLKqtKK9sbGmoKKonKKbmZmspq+kpLWppZuXlaGbpq2ovqeoppWTm5WfmZKXpKmokJ2Rj5icr7K/rJunnqeiiJORqZqoo5qbrKCjmZmip6yin6uimrGblKeglpSdn52XsaSXoaiZnJGdnKKjmKWhmpyampmPlYFnbn1xd5KXlJGFi7WqjYaYlY6KjJiXh5SVioSSlJGJjpKUmJSYlpqgoZqclKGejYJ6pIZsanyQfIB1ioqBcYJ4eXZ2i4B8imtzgXSDdWV2fXdrb3ptYGNdcGhNWFpmamBXWnB6bm1mU09GUzlPWU5STygrOktCNjM1PUBBOTpDPjxFTlNTVFZXWFlaXF1gYmJhX15eW1RLQ1NHS05ER1BMT0k8OjszODksMjs4MjApNklSTzgiKSsvMiM0Oyo3Rk9bSiZSXlMxMFReOis9OFxLLDwtQLOhs6G/oaSxsregqqayp6WwtKrIq62wpLSlwKezoJ2kpJyjlZWgqqeso6O2q5+Zlpafl62qpcGeq6SVkpyXnZeSk6KfnqKnk5GZqKeyxK+aq52qn5CXlqedqpucoKyYoZqboaSvpqGlqJ+umJennJmaoJ6enK+gnKGmlZeSmJOfoJWinZigjpaTioqNjpeukHyVm4KSgouqqIaBmZeKhI+fiHuEkIeGmpKIhoqVj5uXjZGYnaOWmpORno1/jmahs6+FioR2e5KKfXZ5em9mepGBgIlrdYF5iHNpc397doOGgmt1ZHlmYGplY2Rma1lse3BpalxTTFBEX1RGQD8+LDRARjs0NTs+QTs8Pz4+SE5OT1BTVVZWWFpcX2FjYV9eXl1eXVhWSktMQklPTVJKOzw6Nzg2LzI5NjQuKCYkLTEuLykrKjclKzwoNkNNTUQvVF1RMDVNWzE3RTRcRzU8LEC0oLmvv6yrrrKxoKumsa2irLOwxLCqq6Kyrbyjs5ufpqKhnJmXp6WppqSlsrSelZSdmZmwpa6+oKuikJGdmpmUkZSinJeonISeqquis8izn6qkqpaWl5qmnaian6Oqk56fnaCpr6mlo6uirpufoKCYpJ6cn52vo5ieqJOXlpuQo5iXp5yal2WCknxlfo2akGR5jWxoa3uSpKpqZZqYfmeGimVlaWh7jqGPa2iNl5Gjd2tqi5mjnplzbG57hI2HelhlXoaCXm2LiYF2XGhzd3eSgIeCbniCeIBzbXmEdHaIiI6DfGqHWV5sdWRdc4lpa3xxa2NeUk5XSmRYQUo0Pkc3P0ZENzE8PT9BRDs7REdISElMTlBSUlRXW15gYWFgXV1dXV5fXVpVT0RIT0tTTj0+PT02NTM1NTU0KiYmJSwqJS8qKyc2KiQ7Jy9BSltKLzdaTzYpRVkvRE8xWUM7Py49pZ+6vLmvrLOxqqWora2wpq2tsLyxqaajra6wnqyWoKOdopmZpqucraOlqKmyrZ6Vo4+ir6W2uaWuo46OmqGZk5KaoJmZpZV7pa2iqLTEuKSip6+enZSeop6jnKOpqJGeoZ2gqrCqq6SqoKqbp5+noKuVoZulsKSXm6qVoJ2akaSWnamXnn69g4hytHKEnYataHi5xLhxk6KjeqaZmXOqgnzLwMC7cYyiiIKffZaYiZ3AvYKXnZ2NncLBfIJ8ko2aw8B9a6WyboyBb8p6f5t3kYOOgXZ6gYB5cXp/h3B3hYyTeW54lGNmX3lkYGWCY150aGxkYlhMVklRWkhPRDJJRT9EQj4vPD8+QEE6OERDQkNFSElLTU5QU1ZZXl9fYF9eXl5eX19fXVxTTVBHVU5BPz89NjQ2ODI3NiomJSMpKiYuKyopMTAfOSojPklbTCojQlEvI0ZbM1BZL1VBQjsvOJajucO0sLDAqaiUo6+psK6tprO0r6mlpqawq5+rmJqin5yaqqeinayjpaikpLSknaKSpq2ruLOnr6KRkZmdpZKQn6GYm5+dh6espKutwMCxoKmvqZeRnp2hmaKjqaOSoKGdna2uqayno6Onoaalna2okaSaqK2pm5ypm6yglZWklaCilpx/zpR4eqSBeZWWm1+uj16Op4GioH2nlpt0q4OAr15jjap7p4eFoHWXk4izY4KrhqGOjbNqha90fZeIt2GDrVmjzW2QdXvae3+ZcH6IknZ+ZXuIdnZrfIhufYWQkX5tg5BhcmxwaGBfeWRccWhqZGZgUlRSV11LT0M1QUhERDg+NjtAP0E7PThAPj8/QkRERklKTE5QUk9TXF5fX15dXV9gYF9fXVpXT1VKPT8+PDU1NzgxNjQoJyQhJywmJi8oJiszHTYwJDc7U0wrLC1LMCc7XDtMLSFQQEY0LjGtwsC/tbSwuJedkaSqqK2zq6ayrKyqo6qmr6qgp5uZpJacoq+foJ6op6OloZ+wrJqdlaeurLGqqKyglJKbn6SSj56lmJ2no56upKuwqL/Hs6ipsa6Wkp2boZefqaqflKCfnJ2tr6erqZynqKSiq5KsspaloqqqnaOmpKGwoJKZppifmZOUkZegcYWMl3SEqIdxsXydcax+oZ6BpY+ed6qCfa1/nHOtfquHhp92mJJ7fJd+qoiijJGMnX6re4mUkJ+Ae61WnMR6j2+SwX2BlW11b4xtZXZlhm9hd25yb4mKko+DbZKQZnB1dXFhZ21lX29paW5nZFhTXGFZUVNDOUlJQEM8PjxARkRDRUE9PDw8PkBAQUJFRkdFQENJU1dZWlxdXl5cXl9hX15eXVtaUkM+OzkxNDc4NDUyJiMfHCAxJyAxJyAnNB41LSY3PVdKLTwnPjEpM1ZARiEcRzpDMS4rsNTGxrK0oJyjjqOjoqyvtq6osKaoqqasq6unoqOdmaGUoKWrn6KloKioop6dsKyXmpapp66sqKapnpeUmqOhkZOgrZudpqOvrKOstaq5zbKtpq2slpWcnaKYnq6snZagmZ2fqbKpqqqbrKuko6ybr7GiqKuupZilqqipsaKSlqOkmZORhKRqpHWJeql0erJwgqaKmYxxiKCah6RgYVKrhH+ug5t2rYGmhoafepmXhntmgKOJpJmGgqN9qX+ClYeuX32pVZ2ikoF6op+Ae8OvxYtyr7OzuXFiqa/CdGiMjJiOgW2alHBueXh5cG1mZWVxcGZ8amNdV2BpWFhVTExRTENDQUI7Q0FAQkk8PTo5Ojw9Pj4/QT04NjtETFBSVFZYW15eXVxeYGFgX15dXF1bU0lCNjc5OTY2NCwmJCIgKCciKy0iJC4hMy0mQERXSCxHKzU2KjFQS0wjIEE5RDQsJ8PJ1tW/oZmrp6Gvop6wtLCuqayip6apqquppKagm6SdnKanp6OcrJqirKGjn6+inJuTq6S1sK+gqZudlpSmopCaoqigoKWcsKakqLGstsiytaqrqZWRnZyimJ+ls52aoJScn6esrKSumq2qo6KqobOtoaqzsaGaqKeurraikpaippiakXyqbJ6Eh3WreXywb4Kki4mflpaflIHSuLS4yYCBsl9glKmDo4iHoHqYlpp4qsl0maSVqKmRk5qMgJyKmsbHeGahgqVzgZ+Ogn2vXXC0YrB1S6OGbadHgpNkjpCeknxxl5OAcXt1fnxvW2ZqcnBlgWteYVljbVxeWUlOTEtFREFCPkE8Qj9KOzc5Nzk5Ojs7OzMuNjxBRklMTU9RU1daW1tbXV5fXl9fXlxcXFxcWE1CNzU2ODUvKSglJiUkJiksNEVOUFBNRktKVkYqTDAvPS01T1RRHRw7PEYyLCSnpMDGuK2ps62spaKcsrisqqClmqilqquqp6CmpZiqo5+uq52moKyanqmlnae1n6KXk6mqtbKsnKWcoJSPpayRmZuno6Cppq6hpKepsLXDsrOqraiTiJacpJqho66mmKGVmJylpqubsJ2uqKafrKO3rKGxua+dmq6msrKypJOXp6KZno6CnU54moF/n3qDo32DpISGpp6cnpOEuHt8ebmCfszGwrZ4m6GQi59+mpaXinaemIqlmKSof7CFnYWfhKx9mpRipWykcI+FkIF9loJyrGCjc3GAmmC8fVJVdI6So5Z7fpOSi3V7c4V/cV1ubnhyaoFvW2RfaG5iZF1MTFFUQUlIRkk6OUs+QjEwODg2Njg3Ny0qNT09P0JER0lMTlBUVlhZWltcX19eXV9fXFpaWllVU09IQDg4Mi4sKi4rKicmP1FUVldXV1lYWFdVT1VGPEUzOlBbVBwbNj9ILC0gi4eZqaukq7mqr6Cboayys6WeoJWlrq2uqqedpqaao6ehs66iqaeyoJippJSitaKilZehqbS5o5uinaKTj6GxmJ6bp6Whoq+unaSoorayxLGtqa2pkYePm6ecoqScpZeemJmapqSpmq+irqWmmK+ku6yhtretnZ20sbewsqaXna6fop2Fj9G1w7d5h46FkZOQgaZ4lKF3jKCRhKWBinGqhoS0bnJqmaOclYqefJiZhoePc6+CpZuijaaLk52KlZCbbXCyXKVzk3qcbJl/e5l8balho3Fxf59ic7K4aHePlKaYfYyNlI14fXmPgm5qeWl5cm6AdV5lZG5tZmdgSltYWDxIR0BVM0BGPjwqKDYzLjAxMykmNDo7PD0+QENFSUtOUFJUVldXWV1fX15eX19dW1paWFVSUlFGOjIyMzAvKysoQFFSVFVUU1RWV1dYWFdVVVZUUU9RW1UlITJBSCQpJZNzjYqtv7+8urSelqelrbWhopmVo6inrqusmaain6agoLWno6mnsaOUrKOOpK2jnZCamqq0tKSdpJypkZSXrZ+fnaeknaectZqhqqS2q8OwqaupoYyEjZuhoKailZqanJibmaakppisqK6jpZutpr2slL2wrJ+ir7K5qrOmmqixoqaXeaiQfXywd4qApKWInG2yb6CHrXyhjoOolZmArImFroWflKqhoZeGn4CZlYB7kn6rgJ2aloureJ2fkYqUkoF6r12jgX2mp2SdgHyXc2qvXaVrcIWZXWBbjKBtlZGmmYKVjpiNe3uEmH9sbn9jfnRugHpgZ2VxbmhnaEJaYVs+S1QzVThCQkM3JCQzKycnMywgLzY2NzQzNTlAQ0ZJS01OUVNTU1ZaXV9hYGFhYV1dW1pYU1BPTkk4MDUyLiosQVRWVlZUVFVVVVVUVFVUVFRWV1dYVlVVUUhGSUojKCi9kpqDqcbCtsG0n5qsoK24paOOm6Sjn7Cvqp+kn52tmZ65oKOroK+pmq6hkKuopJaJmpCusaymnqaarJeXj6yhoZ2loZqknK2YoKimtqnAr6WppJ+LgI2bmp+mnpKUmpqUmpqlpKSaqayspKWfqqi+pJbDrKqioauyuaqupp+yraeol3avfpCLnIWHfbquiphlsIxlla19oY+DppWagayKhLCFppmkoaGRhaBbbGqBs2B/rXt7goGxbWdvmZiMiLBbfbRcpINryKJkn4B7vFh2tVqyfVKugHqsWIChbpiQqJuLl5GXmHx6j55+ZXV+YoR4dIB8YWpmcW1mZWZPVmRcQlVfPkooPjo9NCEiLCUfMi4gKjEvMDQ1Nzk6PEFDRkhKTE5QUVJUV1peYF9gYWJeX1xbWFVQTkpGQzU1My4vQFVaWFdYV1hYV1dYV1ZXV1dXWFdXWFlaWlxcWFdXR0I70p+zsre9urPBs6ObrKaktqigi5qgn5yzs6mfo6CetZigtKiqrJ6vrZ6sm5WvqaKOiJuOr6yop6Gmma6SmI+omqGepJ+Zo6OlmZ+jqbKpva+kqJ6cjn2LmpWgoJmPkZqbkpqXqJ+hmqiuqKamo6Wpu56gxqakqKGrtLWsrqaeuqyrq5SAqZKjr46bgIekl5iQgYC4w7qDjpyThKeWnIKsioKviKabm6WqkX7VvcKqYqO/vX1+o4KD17q4tYWUk4Oevb6Ea6OBb6uEbJx/erKwx4Nqq7C9rHh3or68c4GWjqeckJuRmJ57gpKce2R+e2SOZ3mCe2BrZWtqYlBhW1NqXEBVYUNOKT06NC8eHyQeJTIgHSQoMDQ5NjY3ODo+QUNGR0pLTU5OUVRXXWFcX19hXmBbXFlUUU1IQz88QT81PVNZWFhZWVpZWlpZWFdXWFlaWllZWFlbW11dXFpWWFRXWruVs7Sxv7myvbKina6lpbKmnYyYpb+quLKoob+mp7KcnrGcuqifra+lppSUsKyXjIKbka6loqygo5yqoJeKo5KmnqecmqGoopmeoaytqbmtqKOal5J7h5mRppuTjpGYmI+Yk6iaoJipqaGqp6GjqrueqMSioK6jqrO0qq+pn7mmra2Zc3WqpLeGZImgcGetj4qPbW93pJCZn4F1rpiUcI+LcZWoo5uXrqRybW1sZot4b26CmXGBempxaWeJlpWYcWlphIdncIZkXYhiam9ZXWd+d6ZfYXGOkW5lZX+Nk4+imJmZkZigfoiQlndniHhpjmt5f3lkbGNmbGJLZFhKa1o6UWVFUidLOisjHCAbIiwpGBsYLTIuNTo0NTc5PD9BQkRFSEtMTU9RU1ZdV1pcYGBhXV1bVFBMSEQ9OkFCN01YWlpZWVpZWFhZWFdXVldZXV5eXVxcXF1eXV5dW1tVV16ola2zqbm4srOqqaGunqOyqZiSvrLEyb62qp7ArKyjoaisoLqjpK6sraeNl66pj4uFlZatnqaqoJ2jo6CRi6SSp5momZajqqCWnKamp7C6q6yam5OSe4SXjaWYjZGRmJSNl5WolZ+YqaObsaaeoqu5n6/Ap6Sypaywsaqtqqa2oqy2lYqgqKW2nYmWo5mHqZqQlJ2SqbOZm6OroLGWoqCdoKKcoKWhlaunjZOSjIeTnJyVkJqTmJGOlYWBpJqXlY2Lk5OLj4aEfWeJfnSCdnSHi3GnbHqUkZOSgYGNkJCPnZWhlpqYo4OJlo5zapF3cYt4d3x6amxkY29kVWFZQGpbSGNhT1krRj0rJyE3NDAuHxwhJTIoKjY5OTQ2OTs+P0FCREVKS0tNUFBRWFRWWV5gYWNdXlVRSkVEPjk9QEFTWFtcWldYWFhYWFlYWFpbW1xeX19gXl5eX19gYGBfWVlgpZapqqW0tq6uorCjrZ+gtbGQjqzHvcW7uauipp6bpp+xqKO2p52ptaepkZitoouHiY+bqJWspJ+Yp56ekpSjl6iaqJmUpqGjkJqnmaG2u6irmZqQjXuBlIuglIqVkZWQkJOXpZCfmqqgnLajnqert6euwa6jtqavr7CsqKiyt5+tu5iRpaSmtqKSnqefjamfjZKfo6yvm6GjsKivl6OgnKOqnp6dnJarnZKZoZuUkJaqmY2ZmZaQlp6RiaCdlZSFkoyQjZSLgH1mi4V1hnV5iINznGqFkJSTkIl8i5aSkpeUopOemKOFiZqIe3OXc3qLf3J8f2pvZF5wamFbYFluY1BgZFBaOkdHRT4yPT04LysmKykmHSY0MTY2Njg6PT0/QUFDSUpHSktMTVNTU1VaYGBpYGVWUEpBQ0I6OUVNVlteXltaXFtbW1xdXV9fXV5fX2FhYmFhYWBiYmJkYlxbY5eVpKiir7KsrqOppq2fp7WqkJCdpbS8r62toqOaep2isaSlsamXm7mno5SZqpyOhoqJnKOPrp6ilaefoJKWmJuui6mWj6iZqIyYqY+furakpZmbjYh5gpOLmpOKlZKUkI2Sl6KNnZ6onp+4o4CEr7Wir691pL2jsp93eZ+psLmUdaujnomAqn9kXGJ2oI6knoSXfW6Ts52jp62qo2Wdn5JzeZmWcICYqJdsf6KoimWcpZyRl5iWjJKckYadmpCVg5KHj4+SiYR3ao6GdoZwe4aAgGFph4qUkotadZSQaGiPj3N7ppqaZnqaiIR5mWqEi4NveYBrcWVfdnBsa2hbZ2ViYnBTXD5OTk5TRz5AVEQ5MS8eHyY0OjMwNjY3ODw7PkBBQUZIQkdGSUtNVFRVWV1gaGZnV1FKPERHPDhVUltgYWJgXmBfYGFhX1xdX19gYWFiY2RhYmFhZWRjaGReXWablaajoK+wrKuppaiuo6atpJKWq7awsqebq6asl3SMnbCfqKunlJe5oKCPnKSdkX+JiJuejayaopWnoZ2OlpGehHWtjoimmqmRl6SJnLq0p6CZmIuJdXeTjZaTipSRkJSMkJOgjpuhp5mcspaAjJu1nbOMko+7p6B+p6J6oq21gI6NpZ6Di4aQsaqvjIqWo5p5gIushpydoqepp4eVhZh3pZt6h5uBl6eCgnucsnqKhqCXmZSYloKRl5eEmpljeYeQhI6PkYuDbXCOh3mAcICBhX+GdIaElZF4lmeSdKCadH2ZhKKeiJh/lIuFhZprjo6FbHh7cXFnZHhvamxqW2VramV0XF5JVExRQEU1LlpUVTcpITA5PT43NDM1Njg7Oj0+PkBEST9KRUpLR1NYW1lbYWFoZllRSDlFSzw+YVZeYmRmZGBhYWBiYl9dYGFhYmJiY2ZnY2JhYGVkY2djYWFonJejn6atrquorJ+osKamqaWZlK7IvrGil6eptp6QhJ2snKeioI2Qvp6ZjZ+aoJB8ho6ZmIisnKGVn6CRjZOJhoCRp4yGop2klJiehp+6sqedm5KOhXB1kImVkIqUkI+bi4+Rn5KXoaWWnquHn7SJtJqtisqHqq2It4WMr4KwrIKpjaWYjZ19qI9ye3ecj6eWaJWkebSMn56mqJKYwoF/q4iYoXKegJqlfZeFlbGAoX2hk6CQmJeBjpObipiRi3yFk4aNlZKJg21ykIV/eXGGgYR8hHWEgZaAj8Vmf6mHj6NrnoOjnIOagY6Ph4uacY6ThWh3dHx3aGh2cWhoa15kcG1nbVhnR11STTJENDZOYWM3JjM8RUdEOjY0NjU4Ozg+PT0/Qk0/TklKTENQWl1cV2Feam1cUUU9TE1ASmRYXWNmaGdiYmJiY2NgX2JhYmNjY2VpaWNiYmJlY2FmY2JiaZSXop+wp6mppqufo7ewqaqmmpSgo6SrpJelq7ijsIChqJ2lnp2JlL2Zk42hkp6PeYSWlpGIq5mbm5mhhY+Md5ucj56Ph56knJaamIejua6kmpyMjH5ibY+Lk5CNkI2NmIyPkZ+PlKGhmaGnfqGnh62doJatj56cnZGFgKCNqq2Fo42pmYyaf6N1gJmUa4KsdU2reIeNnJGbqKeAqat9g6F7eqdpnn+Sa2eXhpe2iZ5+bmBkWYOXf4x7ZGiLcpl9eZVsXXyWbV9TcINcX2t5g2BZZYJ9g4CXcKeqa4OjbnKlcJ+FoGpmoG1bb4x9Z1pgg39iV1Bvd2ZtdHNram9ea3BtbGlYaU9eWEY5QTRHRF5rNCxJQ1JNTj04NDg1OTs2QDs7PkJPPlFSTE1CSlxdX1deXmN2YE1EOk1PTVRiXFxmZmlpYmJkYmRkYmFiYGJkY2FjaWtkYmRkZ2RiZ2VhY2iXlp2guKCqpKaskaC2u6utopmYoKKlra6hna62o6iToaCgp5yajpm0mZCLn4yVi3WBlJKNiqaWlZienn+ShYaspIeaj4qYqZmam5KIprGnopWaiImAaW6IiIuPjoqLjZKMkJGijJSfoJyhpH+TgY+joZSgd5yWj6eDoad/hqirg6V4inyEmn6icHOUiJZ7nox5bYebjJmQm6iaj4ede4Kic3amZp5+d6RfmHp9knOibpi3tLp0k4eCf7WoZIHGuHtwlbeLcYCapGJzrKtgfWmds35ufIaCjYKLmHF/o2xyo3SfhYGkYJ2Zs5ZxfZiftHRzW56yg2pib3R2cWlvWGtscnJmXWleY0xEPUQ2UUFZcTM9U0dfSlI9PDM5NTo6NkQ7O0BKUD9VTU5RQEVfXltaWGBgfGRIQzhMV1VWY2FaZWZra2JiZWFkY2BhYmBkZF9gY2tuY2NkZGhkYmdmY2holJaVo7iZq5yToI2kt7StraCaop2jo6aunZyyrqyTmKCYoaSZmpSfq5uLiJJ4i4VxgJaOio+hkJKUnZd9kImOqKCHmI6KkaOUnJuNi6mopZ6Pl4eEfmt7h359j42Di5CRiY+UoIOXnqCdoJ6LiXecmKKMn3Khi4eoiJulj5WmqX2tjH56oJl6o5N4gXSWiI2cfZWfhpuOmZumhqJkoXyIlpCbjWyeaJqNbpqZe4CLp31yaHSrg56DdKpolZpdm4V2hJ1oqmqAuGZcqHCBnGCVjF6ndnWHiX6eaJp1hpOSl46An2+akG2nml2ofni7a36qW46EXbNnXG5yenhraVxxanh5Y2BmWGJCUUZPN1ZDUm81S1taX09aREAxNTE7OzZIPzpDSFU+WVJZXT5EYl5WYFFhY31qRUI5TltdWWVmWGZnbm1iYmVfYWFfX2BgZWNeYmRvcV9kZWVrZWNpaGdraZWciaq1m6eIY5Saq7mxr6yeppycqZ+fr5yesamtnZejmqGgmZaWoaSZhomNaoiAcnuXiIuWloSRlJiPeoqElqOdipSPhouekp2diZCpo6CajJGKgIBpgIZ4f5eMe4mOjoiPlpp/lKKfoKGTmHJon4qfj4xwkoyBqYeYnqGmnqZ7sK2joriXd6OzoqSAiJR5nXuqmn+ijp2bl4iXcaF8hY2vtX1rmpGheH6YtKOjq6iEmXybfZ2af3SqWl1ve5aLeJ5iTH56eoVjeZdCTJ5ZompyfI5tgIiEmXWbeIaJsbN/gJuTp3eCnW5zfZVwmnRrpF2VdkhlZGF0cX5+bmZgbGl2e2RlYlJfV11VV0BaRlFoRFNXXGJYXklEPUI4P0I6SUY4TEVYQVdSW1ZERmJcWmBLYG1+ckVDPFVfYlpmalZnaG1vYmZnXmFhXF1eYWhiX2VjdmxeZWdma2RmbGloa2mTnIGwrpmEVF6gprO5srKpmqKMnKucnKqUoqykoqiPnp2dm5mWmKGdloiHiXeGgW95lYWRm4t8kZOWiHJ/iJKhm3ORkIGImZWhm4WOqZyalYuLinyDbISFcYGhjHiGjYiIk5iVfJOjoJ6jiK2GfbWEjp6ce6WWeqmBlZyPiZ+bfKdod21+mXShc3F8noaZcJODrn2kg6aemYCjb16oZ3WjY2+lYZzTkHx7mXhyc2OihpB+o3Okj3ZrkLOMYIKYiXOqsqi8f3eDbX6+pqm0XpxufXGXbn9yonJdpGdzpmFopm2b1Jp9hZtwenuYbJx8eJdzbqmkZ2FlenGAhGtnZmRudXdnYGNTXGZRUWJJV0pUYVdTW2VqXGVRRkNLTUpLQktFOE9AUU5YU1lPU1FhZmVqUmN3eXdJRkVjXWVaaGpUaWhqb2NqZ2BjYFxdXV9oYmFoZXxkXmRnZGtkam1naGxol5t/sKtUXEt+qa+xtK+zo5uZhZmpoKGkjqWooJipipqYmJOZk5KgmI6HhntwfYRofY+DlJqBd5CNj4lvf4aPkpJslpN8iZKTpZaDj6ublJKLhYl6g3aHgG6Bn4Z3gJKGh5mil3uUo6San4mzoaK2i3qsp6SupXCogJqQhYCakHukgKGZhphynoSjrq+Kl4x/jKSNlYOtoZR2tLW1yaFzlIqBn2Cdl6lteZWGoJt1oYd3oH6Sl4uBb0xmo5Jwm4dzpHt6dGGDgWt+oGtxZF+ccX10l2l6abO1tMamc5h+ep1rnJurdoWbbXZ4mGqZe3WYclBFfbReanZreYhmamhidHVwblZeVFlpUFNpSlZNWVRWXWhrblZoV05LQUpNS0hKT0FRS1BlY2ptZXVzc395fG51iXt7VFBPbF5oW2tpUmpoaWxnbGZjZWBcXVxeaWJkaWt7X11kaGNqZm9tZWlsZaGciK+mhGY/k6Gyqq6vtaKikICYqqKjpYymp52dpoKbl5aOl5CPnJOOiIN5anmHZYONf5igeXWPiIyBaYSFkoKMhZ2Neo2LlqaTg5ipmI2Ri4GJeoB9i3lwkKGGeYGVh4mWoJV/lKWnnJaWhGZueJxsomR8caV3m5hwZ6aAlYp6pHqfloOXcp52gYqUlo+5bpCKomJ9maGViG1yaaprdaBtbqZfmmmLkGiWh5qVdaKAfZpgjIaNdW+IYmigZZ5+aZt1b2NmiIJtcqJaX1tioW1diYxue35zcmSlbXeiZGenaJlzjJlwom9ViZBvoF9mqFSLXlSYbm1za3KCbXBpa3lza29SWVdXZ1pUbUpZT11JWGlpc2pZa1ZRUkVWXExYU2FVaWtfd3R7fXB9fHKDe39zdo2AhHZeUXJiZ2JwZ1BqaGhrbG5oZGdfXV5dYGtjaml2dV1cY2ljampzbGZrbWOcpJimemV0bYunrqOpsLGmn4uAmKudn6aNo6GboqKAlpmTjpqPi5iQjop7hnGAiGiLi3yYnHN0iX2Qe2SCh5WKiZaZgnyIh5eokYGirJGGkIqCin6AgI5zaY+lhH2GlI2ImKCOiJOqpp2JpniVm36liJaMspiekIKvl5+ld5SGeKlzpY+Emm6kooyShIyDu259pa+DhoaGk5Wcn3ylenKolaCWZp5+b6tjloqVkniobKmigYl2iIN3qpGmh2qRsGt2s4ypa4qGbW2fnpKVYH6ri6p2fn+MpZ52n32EpJWdoGqbiHesZ56tjLZ0d76NpJNZg6aNq2F1cnRxfHRxY2p+bmhsU1dbVmFiXWtNXVJdSl5tbnZgW3FZXGBbZnRlbm9yYnF0YHd6fnlyeYNzhH+Be3uMgYKAdmJ4ZGNtc2RSa2dob2xyamZpYWBeXGJrYm1sem9cXGJpYmxqd21nbG5ilaWqnYGAnqSWqaqdqKaupJmJg5irmp+lipulnamdhYyaj4eckYWSjYyNdIZ6iIRwjYV+mJR0dIVykoNtf4uSh4aTjn17goaZpo5/pqaOgY6KhZR2goeSb2yLqYCDi5SOiZyfiYyUqqKfj4B1lJeIfoF5lK6jf4GbcY+FeI+Kg357cqeMcX19epeWm4SOeHt+foeUlZOKdpCYn6CDe32Ja4yFW3l5cnpwaG5+kolxf3WBj5STcYaEgmWMf16Bf4t3dHKUdW95bm6HbYSFXnZoeI5lgICFjambfXR8lmqJiHCBdn2Gdm5tZ4xzeXuYeIVca1h5j2lueHJyb3h4cF1shm5pZ1ZbYFdcZmtkVmJVX1FfcHh4bGt2Zmpra3Z9cXJ1c2FvdWJ0e4F4dXqDdYCBf4F5i4WDfXttf2xkeG5eV25naHVreGppamVcYFpjamVtcXRuW1tibGRsbHluaGxvYY2UuKimi6GimqakmKWcq6KhhISYrJKeoYmbp5qpmIOBm4t/lpOHjoqJjXKDfI99fo+Fe5iPdHKDcJaFe32Si4aGkIV5foCHmqWOfKehi4aQkIWUg4aOmHdyhamFjpGdkIienoiMm6ifn6qDiY6Vmn5+iZatqI+Spo93b5yQgnmRbn6ohXB9lXFrcH2Bn4x/k46MaG1dg4uMnJuejnOVi4hxdGuCdnSBWXJuhpGBfX6Mal1qZHuFhImAYGl4epp7goqBdYGFgmd3ioZrYXBxgXZecoqBiI+mlYVljI+DbneLhHGGj3pxZ2hle4N6lltcamdudlt7eXh1bnNzgmZcbYpra2JaWl9aWWxxXF9hWl9dZnR+enRwdGNra2t8fXN8eHVkbXVobXx+dnp8e3p6gIB+b4aKhHt9c355c39pVFxxaWx1b3Vna2hkXWFYa2hsa3FybVdbZW5sZ3N5b2hqbWCLi6qwoZCjoZqenZeemKijon6Dma2NoJWInKKRpZV/e5iFfZKZiYiGh4pzfYCMdoWLgoWXinFvgHKYhoR+k4SDhoqBeoGFjJyhkYKmooh4jpiIlIuLnJeFg3qsgpGXmZSKnp2HiKGrnqGho4uIk5uco5mWqqGnpqCSm4eVjXt3jY2Dp35/kpGSk5yyppuVnpCNspKXhKWMjJWbn4mQm4KIkYprfI53eGWChpCLfImdhIeLkIiIgISEkHd8eXSZoIiGiZ6KhJR+fYqAgHVvc4SCfneGhoqPppCDhY2Hg42QjH2IjIqRhHltg4R9eplqcmhhdIpwfXp3d3B3dIFdXm+GaG5fXlpdXVRoclZjXFxibGh1fHxzb3Bka2tpgHxueYByanBwbGeBe3KCgHh/fn+Fe22CjIZ8eXh7fXqDeU5kdmpybXB6ZWtlY2JgW3RmcGZycW1VXWx0bWl5enFnaWtkjIeduZ6WoqGYlJiYlJikoJ57gJqrjp+NhqCci56WfXmUg3uOmYmGhISGbniBgHOBiH6JlIRta356l4eEg5B/gIaEhn2HhY6cnpOHrJ+EcouQhpKRi52RfY17qoSNkpiWj5yWh4abpp+hmp2GgpGamZiQmqafpZ2dkJZ/j4l1e4aNg6R6fI6QkYaYqqGdk52PjaqOkYCdjImTmp6Cjpd+ho6Db3iGcnVhfoOPhnWLmIGDj4KGhX6FhJRueXV0kqGKi4Wag4SMc3+JfHxycnuHg3p4io6DkqaOhYOOgIOKiYp3homKjH5xbX+BfG5obG1oX3p/aH18dnV2dXt3XF9wfW51YGNbXV5RZ25UZVteYmtpdnp+cWxtZGtqaIGAbHOBbG11bnlwhXluh4B2goB+hXZxgo2Ifnt6fH97gopgaXxqdWhpgmVqY2BpXGR1aG9idW1sVWNxeWVwentzZWptbIuJnreaoaOfkZGVl4uan5+ee3iep5GcioeklIuYmXl6jYV8iZGDjIKCgm58f3lzgYV9i5B9a2h9gpiJgIeNfH6GhIZ9j4KQnJ2SiamdgHCMi4yTh6GiioWMfaiRiJCSl5OWk3iMo5+gnZaZf4CQmpiSjJqjoaOal5GafYyDd3+Cjoagf36MjI98mKSgoZOZkI+mjY+BmpGJk5ebfpOSfoeOgXR0gnB2YH2AjYZxipV8iIxxjH+ChYaOaHdxeIuYkY9+ln2HinKBhnt8cXh6ioR6eZCLgpWlk4uEj3qGhoeFdoKEiYh8Z3N9f3l7cWxrZ19+c2h8dXZ0fXOAal5gc3Zwd2RjWV9eUmtpVWVZX2FoanZ5gXFna2RtaGWAgWttfmhwcWt9eYd6a4yBc4GBfoF0doKNhn98en+BfX+PanKDbnNpYodobGJfcVZ0b21uYHhobVdqdHZjdXp7cmJqb3mJjZ6ykqWlnI6Pl4+GnaCbnXx2paGOmICMooqImpZ4e4aHfoOJf4iCgX9xf3t0doOFfoqReGdjfYaXioGJjHl9gI2DeZeClpmXjZehnH5wjIKRlIamm4eMiYOmlYWTi5aXk5J3kZ2goZeTlnl+jpiXjpaanaSdmJKUmniNhIJ3g5aNnX6BiY2McpejnqGTmY6PooyLg5aYg5KWmX6YjHyIjYB2cX1uemSAfIqFcIaTf5CCbIeCgYCJhGV1b3uGkpeMfJJ3i4h7f4V8e3F+d4iFeYSPiYqXopWBgop2iISCgnd8goqGeGF6eX10f3hnbWVhf2pqd3N0dX1xfGJjYXNudXJtYVphXltsZVJjWWBhaGt2eYZxYmpjbWVofYNsaHVpbm9nf32CeW2QhnGAhIN/dHyDjIGAfnqCg358kG12iXR0bWWKbGpiY3VWhGlxbmB4Z2xianZwZnl8enFfcWyGhY+crpemqJ6NjJeHhp+Tl5l9eKqcipl6l52LjJiQeXyBjH58g3yAgoF4dHl6dH2AhH+Ji4BkXn2LlYd+hIZ1fX6Kf32ZhZeVmI2ko5l/c4d7lJKKp4+MjoqToZKDkZCUl5GLgY+Xn5qSj5Bzf42SlImdnZ6ml5eNlZVzjI2Ja4WXj5l6h4iQiW+XnZqjk5WKjZ6MhoKSnH+SkpWHmYh8iomBeXF6a3Vse36Lfm2FkoKUeHCCg31+in9kcml7gJaXhH6Mc4+Hg3iGfXZ3f3yFgHyCjIOLk6SPeIOBdImHfYB0doGJhXBifHZ6cX1vYm9jZHxjbm92c3h3c3RhdWBvbHVtb1xcX15fal5QXVljYWhtdHuIa19pZmpjaHeIbmZsaWpsZ4B9e3dukIhzgISEfXSBhol7g316gYR9fY5yeot4eG5sh2poX2lyYodocW9ldmdubGF5aWt9e3hwYXdti4CZmaqgo6idioqRhoqei5WYfneumY2XfZ+TkZaUiHd+e4p9e4B2eH+AcHR0fG+GfYGAin98YVt+j5KGf4ODc3qAh3qPkomTkp2TppyVgn2CfI6LkqSJjoqNmJuNhpGYk5aPioiMkpySj4uMboOPj5GInpmioZeWiZaRboeYg2aFmI6TeoiEkIpwlZqUopKSiYuZjIJ/kJ59ko+SjJmOe4qEh3NydWtwbnV8inRuhpCOknF1gHuBgYd7ZHBseH2Zk32DiHOQiYBzh3luf32AhXuFi4iDi5WojHqHe32LhXd+cXCBhoRkaXl1dXB8Yl9wYWt0XnFqe3l5bHNwZXhdbmxzbXJZWl9fYWtaUFdYZWNncXF+h2ZdamlnYmdxjW5kaWdkaWmBend1b46FdIGCg3t1goiFeIV8eIOFeoCJd3+Le3pyeINqa19waHSAanJvbXFnb2xlfGNugHp3cWx3d4p+opehqKCmm4eMioGPnYeTnXWBqpWTjoehjJWTkIB0fHaFeHl/cnN7hWtycHptinaAgYducVtYfpGNiH9/f3d1gYGAoIaRi5OdmKGVmHiKgIGNiZyeio+GkpiWhYmVmY+Wi4uMjYyciY2Pg22Ji5CQip2WoZyXlIWYh2qDooJlhZ2KkH6Lg4uBd5OYkZ6RkImJlY1/fo+YfJGNj42akXyKgIJudXBsbW9we4Vpc4OOmIpxd4B1goiCeGZybnWBmY57iIN5k5B5dodzb4h7hYt6ioWCh42bo4d7g3WBi393eW5sgYSCXnN1c3FweFpecWFwa15wan17cW1tamx2YHBvanFtWlhhYWJuWFFUWmZnY3ZvhIJiXWtuZGJma5JuYGZmX2drgXVyc3CLgHV/g4B4dYCLgHmFf3eHhneDhXyHjH97dop/anFjfGOGfG5xbHRqaG9sdnhfcX95fHR1dICCfqSVmq2ep5aFjYN/l5SDkKB1i6CUkoaLm4yVjot6cnh0gnByhXNxdYhrb212bYh2g36AbW5VUYGrlYeCd393c4J6gqGCk4KVlJmck5p4knuDjZOkmpOOiZWZkoWHl5mMlIuJj4+HnYSPinxzi4WJjoicmp+blZR/k35ohJuGZ4Wgh5GDkYKJcYORl4+bjo+MjI+NeHuSkHqOi4ySlox8iHyAa3ZqbmtsbHt/YXp+jpaCdnqAeIOMfHlnc2xzh5WKfoeFepOOcXmDb3aMeomLeYh9gYuPnp2EfHp2gYt9d3BqbIKDemF5cW5tcnRWXnBicmFgbG56cWhwZmZzdGhwa2F3ZV1WZmBgclNRTlxmZV15cIh8X1xpcmJiZWaSal9oZFtncH5wa3F0in12fIWAdHV+jHl7hoB4iINzhoV+jY2EfHmVeGZyaoNgiH1vb2t6YGpudH91X3R9eYZ4dHOFfHigj5mwnKWOgop/g5qHgIyef4ualI+FiJiOjo+Ed3R2c4Bwb4V0cHKEcGtqd26Dbn19bXVzUk2C38iS1pN8cHWDdoSgg5R3lZKZnJGZe5RzhZCfoZOTkYmSm5SGfpaWiI2NiJKNiJx/joB3eox+iYyKnJudm5WTeYx1ZoeQhmuHooSRiJeChWOMkZmOlYqXi42Ki3F6lIh7jYiKk5GJeYV8fmx7ZXJva2t6eVuAeZCOgHp9fn+Gjnp6aHJqc4qOiYGFhHyUimt9fm5/i36LhnyDeYCOlJqainx1d4OQeHJtZ3GAhW5rdXBoanVuU19wZXBaYGxyeGdra2JmeHJwcGNfd2BgVmtfXnZQTkthZ2NdenCJdFxcZXZgYWVlj2NhZmJYaXNzbWpxdox9dHmGgXV2fotzgIZ/eol+comHgZGLiHx+mHZlc259ZYh+b3BrgFpsbnl5c2F2e3uNdnJ3ind5n4ubrpugkIKFd4iVfn2KnYeGoJGPhYyYhJOOh4F0d3B5cW6Eb21vf3NlZXlxfW15fWpoa2OkmsHcru+hc2x2hHaFo4aSb5eRlqGWnIGScoWLo5eJjpWKkJ2Wg4GVkIWJkICRiomWfod6dX+JeIeEjpybmJmOj3aJdW2FiIp8iaKDkImchIVei5OXio6JjoqKhIlte5aBfYiFiZGPhnaFfX1rfWR4dWpueXNXiHqSh4V5foCAhYx+eGVyaX+JjomBgn6LloRrgXVth5CBj4R9gXh+kJWTmJB0cneHjHVzcWd2eoRjdW5xYmp3aFJhcWdrVl9vdHphcmRfaH1wcm1aY3JhYlZuWVx4Tk1MZGdiXndziW1cXGR5XmBkZYVgY2NeWWpya25rcneMfnR3hIF4d3uJcYOEfH6Ie3SLiYeWhox/fpdzaHVxeW2Lem50cIBXcXp2eXFleHmHjGl2gIlyf5yHmaeco5KFfXCMlHh5i52EhaGNjnyWjYCaiIR7c3dwc2pwgWxqbXx1X2F4d3txdXtnYGR869q1ycPciHNsdIF2i5uJjmqZkJCelpSBiXGFiaCOhYuVioyYlHyOk4iDiZB7kIuFj4F/dniDhHKIgpOcl5SXhox1hn1ug4GIhpihgpOLnoOJYYOUj4aJhomNh4GHan2UgH2DhImOjYJxhn5/cXdodnJpdHdrWox8koOFfX+DgISKgnVhc2uIgI+KgX5+kZB8bYFreIWOhZGCe4B8fpGSkJaIbnB5jIZ1a3Fsc3mCYHVqb11rd2BSZXJoZlNgcHZ0YXBgXWiDcXNqV2doYmlYbVZbdUxLTGZnX2Jyc4VpW1xleV5eZGd7YWRfXVlrbmZvaXN4in5zc4F+enZ6iHOFg3x/h3Z3ioaOmYGMgnuTdWx3dXl4k3RueHt8WHqGcYBvZ3l3koJkdoaFcYqWhZmhmqKKh3Nvk4tyd46cfouaiYl8n3+Emn+BeHJzbm9kcn9pZm14eFxfeXt7cXGAamFnYX/Vto6QpnhucXd8cZORjYdrmo+JnZOMhntph4uZhoGSkYaHmI58jY2BgYqNfI+MfYmEenR6g3txhoCWmo6TlIGIdIOFdYJ/iZGcnYWUjp9+iGF/k4eEiISJjX+Ag2d9kYB+f4KMjpB+bYJ8gnRrbXd1dHd2a2ONgY9/hX58hH+EiH5vXnFwhHuOi4F7fpCHeXCDZnmCioaLgnqDfX+Tjo+ShG5ueYt+dW1ubGx7fmNpbGpZbndaUmpzaWJRY3N4bGJlXlpqg25zYVtnX2RsX25VW3BOSE9nZVxnbnGAbFtbY3NgXGNsd2RlXV1aa2xibWp0d4Z/cXB/fH10eIZ4hYJ8gId1eYmBkpZ8iYZ2iYFwd3l7hJNvbXyBd16Df3SBbWl6dJRzZ3OHfHKSkYOan5ughoh2dpV+bXaUl36IkYSKjpp9jJp2fXZxb2xqYXV8Z2JqdXpaYHh8em1xf2VkaGdXnY9ecXOWvMSEdnGUipB/c5iMh5yUjYh0a4iPlYB7lIyBhJuMfIuGfXyJjH+TiHWJhXZ2fYFxdYaBnpWGlY+CgnF/h3ODeoiWm5aGk42cgIhlfZKCf4WDiYlygn5nfYt7eX9/h4uPfWmAfYN2Zm95eHN3c2xqjYWKgYp/eYKAhIN/al1wd3p8i4iFe4COf31ygGh4goaKhYJ3gnuAl4yPjH1ta3qJfHZ0b2lofXdlXXFjWHB0U1Rvc2hiTmh0eGZhXl1Yb4Bvc1llYl1qbWBwT1lsUkRUaGFaa25te29aW15sY1pjcHZkZ1xdYGtqY2xpc3aBg3Fufnt/dHWDeoSCfIKFdn6JgZaReIOKdIGIcnl5f46Qb298gXFpgXl6fm1tfHaWa2p4hHRrlI2Fn5igmoWIbn2Mdmp4mI9/goqClZiKeo+Wb3pzcWxqZGB0e2lgZnJ7W2FzfXpncHphZWWOsbJ3SmJapNnQl3J7koyReX+WjIWako2Gb2yGkpF6eZOHgYSZinyHf3h4iYqElYBviodxdH17anmGg6WRhJONg35ufoJ1gneFmZiTipKPlIWHb3qSg32Dg4mDb4J4aICFeHJ/f4OKh3xlfX6EdWNwc4BoeXFvdZiNhYKKe3Z4gIR5gWpab3xyf4eDiH2FiHqIcoBtcIOGjYODcYN4gJiMjYR3bW19g392emVoan5yYVp4W1lybk5YcnNmYEttd3ViXltbWXV9cm9XZ11manBfb05XaVI/WWdfW3BqZ3lxW1tZa2VZY3F5X2hdXmVsaGZsaXF3f4dvbX99gHVwgXuAgX+Cf3aBhYmXinGCjXF7hn16eoSUjHVqen9sb350f31vcnx7lHBvgH94ZpKKgqGYnJKChWeHhHBoepeJfoCFgpmKgXyNjWl4cmtsZl9hb3ltX2JveV1kbIN6YXF2X2Vl1eu+izI6PouOgHJ5homPjXeFmI1/k46Nf25shY2MdX2Pf4WClYl8g3hudoeFg5d3boiEbHV7dWZ5goOojIOPjIN9bX90doF4hJuPi4+RkoyLhn57kod4gISNg2yAc2l/fnhtfHuBioN4YXmEgXFkcWl+bXRxdIGbi4B/hH5zdX2Ac4BuWmt9dHiJgop7hn98iHh5cGuHgo6CiXGBeH+Wiop+dG1qdoCAdXVcaWl4cVlXfVNacmVMW3NyZVtKcXhwXltbWVx1f3VoWWJbZ2VuYmlNV2ZRPV5mXV12Zl90cFtZVW9kWmVxeVpoXmBnbWdpbGhweH6ObGqChH95boB7fYB/gnp1goGMk4VwgItud36Be3uIk4mAaXt+a3R8coZ7c3d9f4x6eIR+fGuMjIObnZaMgYBsjX5raX+PjXt+f4OUgn99iohrdXFnaGNbYmdzb2BhbHRhaHCJemFzdF5jZJugkG5cNVmvtXVqgIp+k4Z3h5iHdY+MindwbIWDh3R5iXiJfZOIen9zZ3aIfn2Yb3CGfWh3eW5leoiEpYeBh42Kfm5+dn5/e4qYhoGTkJeIi4SJfI+IcXt9hXxpfm1rgHt6anp2goeAcmB3gX5xZHJndYJtdXuFlZGBfIF+b3d5e3R9bFdtfXVzioGGd4d1gYl6d3JtiH+Of4Nyfnx9koiIem5taW2CgXVuXWhmdHJSW3tOXHFcT1xyb2RWS3N5a1hZWVpgcYF1YF1dYWdkaGhmTlpoTkFhZFxgdmJcdW1YWFN0YVpkbnJXal5iaGtnbWxpcHd8k2xphIp9fXB+fnuBf4J6d4CAiYuEcnuHb3F3g397io2Pg2p+e254eXeKd314gIKHf4N/fnpthYyImKONhIN7dox5a22EiZJ5fXuCkYCAfYqDcHJwY2ZeWWdfcHBgYWhwZmpvinVhdG9bYWRpdnt/vpymo8i4coWEc5N9eYiUhHSRjYhyc3CEe4NzdYZ0iHeUiXl5cWN3hnmAk2lyhHVmd3ZjanyDiJ6CgH+Ojn1yfnODd36Qj4J3lY2Uj4eCiHqJiWt4eX51aHppbH95c2l6doCDfWhgd4d+ampzaHuAaXaBjJCUfnp9fXF7dntzfWFVdXtxc4mDgnyCcIaKd3dvb4KBi318eH18dY2FgnZocWhsiIJycF1oY3RvS2V2TF5vVVRZc21iUU90eWJTWFhcYXCCdFtgXGhlZGNqZFBbcUlEZGJcY3FfXHdoVVdWd15cZW5oVmxeYWpnZW9vaHB3epNuaYiLeX5ze355goGCfHZ9g4iGg3B2g3Ntd4ODfomLlH9xgHx4eXqBi3SDeH+BgYKEeYB2b36Ji5ueiH2GeneHfGh0ho2Ren9/fImGhHaQgGdwbl9kXFhlWW1zYWFhcWxsaIluYHNpWV5kbYB3qdqqx4aHs3KKeXCOdn2IkIF6lIqAdXR1fneAcHF+bYV0lIV4dGxgeoF5iI5mcYNvZ3VuW219gZCTgIF5kpJ9eHtthnR/kIuDcpWKkI6HhYV7f4VtdXZ/bmh3Zm18dm1qd3Z/f3xgYniGemh1dWN+e2d0ho6MlXt0gHVxgHp8bH5ZVnJ8b3SDhn9/eGuIhnN4anR/goJ8eXx3e3KKgHxzZ3RkbYuEbXRba2B2Zkhub0xbY1hXVnhtYlBTdXdZUVZYXWByhG9cYGNtZGNdbmJUXXJHQ2ZfXmZpXVp7YlJWXHVbW2drYVZrX2FuZmZscWhwdniPdGuOjXV/dnh9d4GDgXt0fYOIiINvcYB1cXV+hoKJjYp7d394hHx9hYd4h3x9gX6EgHt+c3Z5jI6fjIl6iXd1g3lefoaajXmHg3SGhoR3iXtibmxbYltbYVVqdGRgW2hvcGeHcmFxZlddY2t/fMrOh7mia25ui21yhXJ+hYt/e5KFenl0eXV1e2ptdWOEdpKBdm9nX3yBeYuJZXGBampxY1hte4aciYOCc5eUd357bYdwgImKhnCWjpCIhYuDenl+cXFvfWdocmNueHJqbHF3fXx6XWV5gHdpdXlmgnZndIeMjZR8codqbn6AeG17XFhwfWxzf4p8gW5uiX9wdmZ2foB+gHV7cXpzhnt5cWVyYG2MgmxzWGtfeF1Jb2xNV1ZfVFV8a2FPVHZzUVJUVl1idIVoXGBramZiWW5hWGNwR0FoXWBmX1xWe15PVmVwWltqaF1XZ2BfcmZqaHJocXN3h3hulYp0f3t3fnmDh4B1c3+GhY6CcHB7eHd1eYeFh4yGenx/dYt+fYaEhId/fn59h398eHV5d5GTn36MfYtudYB5ZIOIl4Z0kopvhYWCeoN1Y25qWV9bXV1VaHNlYFlkcnJngXNia2RXW2Bpf3i+rnuft21idIdpdHxyeoSHe36NgHh4c3dve3dlam5gh3WOgHJpYl9+eHmKg2ZwfWhqa1tXb3iKo4GFf3GZk3GAeHSBbX+BkIdyk4eMh4OIhX15dHJvaHlham1hbXZrZ2tsend6d1tnfXx4ZXN+boR0ZXWGjYaVfnCLZmt6gnRsdGJbbXpqdHuLeoFmdIZ9bXBndH53fH5xe2t5e4F5d3BlbGFsiX5tblZrYHhWS2tsT1JPaU5ZfWdiTlV2bE1RVFVeZnaDZl1hcGhnYVdpXVxsaUpFa1piZFZYVXlaTldualldbGVcWWVjXnRmbGRyZ3NwdIF4cJmFdoB/eH98hYd9dXOCh4CVgm5zeXt7c3KFh4iIhHmBfXaPf32EiY6DgYN7fouDe3d8d3eanZd6ioOHaXZ+fGyEhZSAco+CcYaCfoJ/b2ZsZ1ddW1xbU2VwZV9YY3N1aXVwZGViV1xcaIBwb3KAc4llZXl/anR2dHSEhXiChHp3dHVua3pwYWdrZ4Z0jYNtZl5ffG97iX1obXdmaWRWV3Jwjad8hHx2lpBzfHJ7eW16epCEdpZ7h4aChoN9dXBybWd1XW1pX2x1ZGdmaXpve3JZZ4F2dWdwgHiCdmJ3hYt8lIBui2pteoBwZXJlYGt4ZnJ2iXp9YXWDdmlrcXR6b3h4cnxlfX5+eHZuY2VhbIZ8bWtWamJyVExpa1BMTnBIXntmYU5VdWVLT1NXYGt3fmVdZ3NpZV9WY1dicF1LS2tYZGFVVFVzV01ZdmVaX2tgXFpjZV93Z21icGl0b3F+dXSZgXiAgHiAfoaEen12goN+mIVucnR8enRxhYWPgoB6i3V0kIB9gZSOgIWEfH6Mhnp+gHZ7o6WKeYiGhWx1fHt1hIKMem+Fc3qFfYKDdW5qaWVWXVtbWlNjbmVbWGF0e2pobWhgYldfW2mAaWtvgGdsYWl6eWp0dXRvhoJ7gX12dW56aGp5al9lbmmBd5CEaGZYYndpfod6b2lvZ2ZdVVhvaI+ndoF6fJCOeHVufW1xdHiOfneUdIWCf4WIdmpydmdob1xtZV5uc19nYmp4aHttW22Dc3Rqb4B+eXdid4SEeI+Fc4hxcHl/cWJwaFtud2Rwc4d7eGFygHBnaXhzcWt3dnN1YoJ6fnd1cGNjY218fWtrVWliZ1RMbWlQR1JsRWF4ZmJNVHNeSk1VWWVseHtmX21xamNcVl9Vb29XSlNoWGdeWE1VbFRLXHpfW19rXV1bYmVgemhsYW9vdW5vd3V6l313gIF5gICHhnp5eoN9gZOEcXR0f3p2dIWIkH2AfZBsc5WBe4KfhX+HfYB+hoKAint2hKyff3qIh4RscoJ5doGAgnRuh299gHSKgGpvbmRkWF9aWlpVYmpnXFpfdYJpXm1sXGFWXFxrgWVydH1pal1sd3ZodXdybod8fn56dnNsemdpd2ddZHNoeneSgWNjVGRvZ4KEd3ZmaGphV1ZZaGSQp25+eICLjnpwb3tmeG55inp2jnGDfX5/hm5kdnNkaGhdbGJecG9bZ15tdWV6aV10gG9ya3F7fnV2Y3WFinuHh4B/d3J1fnNgcGxZcHJicXGEe3VkcoBsYGx6b2poend0cGSDdHl5dXFkYWRtc35qbFRpXl9VTHRjUUdXYkdjd2ZhTFRxWUtMWFhnbHZ6ZWVtcWZjWlhdWHZmVEpcY1hpWFhIV2VRSWN5W11gbFteXGJkXoBpal9vdHhub252g5d5coGAfYCJjIZ+dnaGeIaMfXR1dYJ5enqCjI59foSJanSWgXuKnX1+hXmAe358hohzcY+ujHt7hpB+ZnGIenR9fXZyb4Zte35tj3picG9iZV1lVlpZV2Nma2BdXXOGaVhwbVteWFpcbHtjcXd2bWNbbnR0aHV2cW2FeX+BeXdub3RlaHRlW2d1ZnZ2knpgXVNlZmqCgXN9YWNpXFVYXmJkkKVoeXSChZB4bG54Zndse4N5dIhygHh7eH9oZXZtYGZhX2pgXnVrWWVdb25iemZbeHxrbm5wd3l0dWVyg5J/h4OIenZvcXxxYXdjWm5vYXBxgXtzZXGAZF5tdmljZnh6c2ttgHRzfHJxYl5lbW99ZWlUaFlaVU55YFJLWllIYnVkYUpVblRKTFpWaWxye2NsbHNjYVlaW2F3XFRLY11ZalNWR1lhTkhqdlhfYm1bW19iY12FaWhhbnh5bG9qdoGQeG2CfoCCkoiEgXZ1iXSLhnRxdnaCeHx9foyQgH6TfnB4loN9mZJ5gIB4eX5/c4iDc3CZont7gImVeWR1iHlzeXZrc3B/bHl8cJFyXnBvYWdibFRbWldpZG1mXFxyiWZScm1bWVhYYGx2ZGp1ampfW210cm10dHRrhn1/gHx3b25sZGlwY1trcmR0do5zXFdTZGBxf35xglxhY15TWmFcZJOfZXJxhIOQc2tqeGxub3l5enGAdn9yeXp6ZGZ1Z15iW2FoXF53aVdiXnBoYXhhW3t2ampyb3d0c3RpcIGUg4Z+hHZyanB7bGV2V1tqbWJwcoB6c2Vvfltgb3FiXmlvfWxqcn1xcHdrcGBbZWtte2FnVGdVWFJRd1xTUFlSSGNzYmFHVmxRSVBaVmtsa3xlbW9xYVtaWFlscFdTT2ZXV2lTVEZaXE9JcnVZYGRtY1hhYGFejGpjZG15eGtvaXV5hXtrhH2AhZl9goR5fYhtj4Zxb3d6fHSCgn2Lj4OClnR4gpOGgZ+JdYF/gXR/gnCHgnVvopdze4aLh3tmd4tvbnxwZnhxe2xzdnONa150bmFnZmtTXlxWaGJsbFtccYxkTm9tXFZYVWdpdGhjdGVlXVpvdm9xdXV6bIh9gH2Id5BzY2Rrb2Fdbm1kc3iIa1pUVmJjd3x8cIVcY19jVFpgWmOWlWNucIOEiXJqZ3luZXJ1cXpreXN1bnp+dV9mc2NbXldiZFlhdWZWX2FtY2FxXV1+b2hpc3FzcHV1a2yEk4GJe4VxcmZue29wblJaZWplcXOAdnNibHZVYnFrW15uZHxla3R8cXJyam1gWWNpanheZlRlVVZQVW9YUVdUUEhlcl9hRlhrT0lYVFZuaWR8aWt4a2FXXFVbdGRTUlZoUVlnVFNIWltQTnh3W2BmbGlaYmBeXo9uYmZreXVubml2dn5+bYSAfoaXe3+HgYl+a5OIcmd0gHp1gIN+iY9/i5NyfYqRhYefhnt/hoxzgIZzfYJ1bqSMc4GNi3d4bnuNYGR8cWd5c3ltbXF2g2dkfG1jZmdoU2BfVWdgbG9cXm6OaE1pbGBVVlNvZnNsZXhkZV1acXVuc3t4c26Je4F3nHt6bGJlbG1eYG9qZXF5f2daVlhfbHh7e2+DX2JeaFZZYFhknIhia3GBhnx3a2p2bFt1cGp5aXVybW57gHJYam5eWV1WYmRYZXFkVF9iaWJibVpgfmtma3N1bm13dmtohYx/iXqHbXFmb3tscWxiWF9oaG9zgHNzXmltU2VwZFVibmF5Ym90enRqb2xqX1hgZmh1XWVWYlZTT1lnU09dT09IZW9dY0daak5KX0tYbWVfeGhufmRgVV5UXXRbVFNgZk5dYlVTSlxaUVl1dl1fZm1oWGJhW16OcWNnandxc21ndnN5g3OCg3uIjn58ioiOeW6QinRsc4Fzf3+IhYeShJWPen2Mj4iRm4SAfIyEcn+Bc3R3cW6Tk5OTk5OTk5OTkpKSkpKSkpKSkpKSk5OTkpKSkpKSkpKSkpKSkZGRkJCPj4+Pj4+Ojo6Pj46OjY2Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2NjYyMjI2NjY2Njo6Ojo6OjY6OjY2Ojo6Oj4+Pjo2NjY2Oj4+Pj4+PjoKAfnp6fX5+fX1/fn59fn5+fn5+fn+Af4CAgIGAgIB/gIGBgYOHjI6Ojo6NjY2NjY2NjY2NjZKSkpOTkpKSkpKSkpKSkpGRkZGSkpKSkpKSkpKSkpKSkpKSkpGRkZCQkI+Pjo6Ojo6NjY6Ojo2NjY2Njo6Njo6OjY2NjY2Njo6Ojo6Ojo6NjYyMjY2MjIyNjY2Njo6Ojo6NjY2NjY2Njo6Ojo6OjY2NjY2Ojo6Ojo+Ogn99ent8fX59fX5+fn5+fn5+fn5+f4B/gICAgICAgH+BgYCBg4aMjY6NjY2NjY2NjIyMjIyMkpKSkpKSkpKSkpKSkpKSkZKSkpKSk5KSkpKRkZGRkZKSkpGRkZGQkJCQj4+Ojo6OjY2NjY2Njo6Ojo6NjY2NjY2NjY2NjY2NjY6Pj4+Pjo6NjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Njo6Ojo2NjY2NjY2NjY6Ojo6Cf3x6fHx9fn19fn19fX59fn5+fn5+gH9/gICBgYGAf4CAgICDhouOjo2NjY2NjIyMjIyMjIySkpOTk5KTk5KSkpKSkZGSkpKSkpKSkpGRkZGRkZGRkJCQkJGRkZCQkJCPj46Pjo6Ojo6Ojo6Ojo6NjY2NjY2NjY2NjY2NjY2NjY+Pjo6OjY6MjIyMjIyMjIyMjY2NjY2NjY2NjY2NjY2Njo6NjY2MjIyNjY2Njo6OjoN/fHp8e31+fH1+fXx9fn59fn5+fn5/f3+BgYGAgICAgYCAgIOGi42NjY2NjIyMjIyMjIyMjJFtZmdnZ2dnfYWEhISEiF0tMDAwMC1GoaGhoaGhoJqZmpqampqKg4SEhIOEd2VnZmZmaFxDREREREJLkpqZmZmZmZ6goKCgoKVeKi8vLzAsSIWDg4ODg4OLjIyMjIyMjY2NjYyMjY2NjY2NjY2NjIyMjIyNjY2NjY2OhX19e3t6fX58fH59fX1+fX1+fn5+fn9/f4GBgYCAgICBgICAgoWKjI2MjIyMjIyMjIyMjIyMkWdfYGBgX155g4KCgoKGUxgdHR0dGTekpKSkpKSjnJycnJycnImBgoKBgYJyXV9fX19hUjQ1NTU1Mz+TnpycnJuboqSkpKSkqlYVHBwcHBc6g4GBgYGAgYqLi4yMjIyMjIyMjIyMjIyMjY2NjY2MjIyMjIyMjY2NjY2GfH16enp8fXt8fn19fX59fX5+fn5/f3+AgYCBgYGAgIGBgYGChYqNjYyMjIyMjIyMjIuLi4uRjo2NjY2NjY+QkJCQkJCMh4eHh4eHiZOTkpKSkpKRkZGRkZGRj46Ojo2NjYuJiYmJiYmIhYaFhYWFho2Ojo6Ojo6Pj4+Pj4+PiIKDg4KCgoWKioqKioqKi4uLi4uLi4uLjIyLi4yMjIyMjI2NjIyMjIyMjIyMjY2Njoh8f3l7ent8e319fX18fX19fX5+fn9/f4CBgYGBgYGAgYCAgYKFioyMjIyMjIyMjIuLi4uLi5GSkpKSko2QkpGJh46KkJKTkYuQi4qQiY+RkZGRkJCQkJCPj4+Pj4+Ojo6Njo6Ojo2Njo2Njo6Ojo6NjIyMjY2NjYyMjIyMjIyNjo6NjY2NjIuLi4uLiouLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyNjY2NiX59eHh5fH18fX19fHx9fX59fn5+f3+AgICBgYGBgYCBgIGCgoSKjIyMjIyMjIyLi4uLi4qLkJCRkZGPhI6QkIaKj4WNkJCOhoyFioqGiJCQkJCQkJCQkI+Pj4+Ojo6NjY2NjYyMjIyMjIyMjIyMjIyMjIyMjI2NjIyMjIyMjIyMi4uLi4uLi4uLi4qKiouLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjI2Lfnx3dnh7fXx7fX18fH19fn5+fn5/f4CAgIGBgYGBgIGAgIGChIqMjIyMjIuLi4uLioqKioqQkJCQkIqFjoiOhoaPiY2QkJCIjIaIh4WHj4+Pj4+Qj5CPj4+Ojo6OjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLi4uLi4qKioqKi4qKi4qKi4uKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIt+e3d2eHt8fHx9fX19fX1+fn5/fn9/f3+AgIGAgYGAgYCBgYGEiYyMi4uLi4uLioqKioqKipCQkJCPhYOMjpCOiYyKjpCQkIiNjYmEhoiPj4+Pj4+Pj4+Pjo6OjY2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKioqKioqLi4uKioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMin18dnZ4fHx7fH19fX19fn5+fn5+fn9/f4CAgYCBgYGBgIGAgYSJi4yLi4uLi4qKiomJiYmJkJCQkJCMhoyJjoeFjYmOi4yQiIyHhYiDio+Pjo+Pj4+Pjo6OjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKioqKioqKioqKi4uLioqKioqKioqLi4uLi4uLjIyMjIyMi4uMjIyKf353eHp7enp8fHx7fX1+fn5+fn9+fn9/gICAgICBgICAgYCBhIqMi4uLioqKioqJiYmJiYmPj4+Pj5CMjouPjIqPjI6MjY+MjoqKjomOj46Ojo6Ojo6Ojo6NjYyMjIyLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLjIiAfXh5enl6e318e3t9fn5+fn5/f35+f39/gICBgICAgIGBgIGEiouLioqKioqJiYmJiYmIiI+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Oj4+Oj46Ojo6Ojo6Ojo2NjYyMjIyLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLioqKi4uLh4B8eHp6eXt8fHt8fH1+fn5+fn9/fn9/f39/gIB/gYGAgIB/gYSJi4qKioqJiYmJiYmJiIiIj4+Pj4+Pj4+Pj46Pj4+Oj4+Ojo6Ojo6Ojo6OjY2NjY2NjY2MjIyMjIuLi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKiYmKioqKioqKioqKioqKioqKioqKi4uHgHt5eXh6fHx6e3t9fX5+fn5+f39+f39/f39/f3+BgYCAgH+BhIiLiomJiYmJiYmJiIiIiIiOjo6Ojo6Pj46MjI+Sj5COjo6Ojo6NjY2NjY2NjY2NjIyMjIyMjIuLi4uLioqKioqLi4uLi4uLi4uLi4uMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKiomKiomJiYqKioqKioqJiYmJioqKioqKioqKioqKioqKioqKi4aBe3h5eHp8ent7fH19fn5+fn5/f35/f39+fn9/f4CAgYCAgIGEiIqJiYmJiYmJiIiIiIeHh46Ojo6Ojo6Ojo+MkJOQkI+Ojo6NjY2NjY2NjYyMjIyMjIyMjIuLi4uLi4qKioqKioqKi4uLi4uLi4uLi4uLi4uMjIyLi4uLi4uLioqKioqKioqKiYmJiYmJiYmJiYmKioqKiomJiYmJiYmJiYqKioqKiomJioqKioqKhYB6eHl5fHt6ent8fH1+fn1+fn9/fX9/f35/f39/gICBgICAgYSIiomJiYiIiIiIiIeHh4eHjY2Ojo6Ojo6Pj4+PjoyNkI2NjY2NjY2MjIyMjIyMjIyMi4uLi4uLioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYmJiYmJiYmKioqJiYmJiYmJiYmJiYmKioqJiYmJiYmJioqFf3l6eXh7e3p7fHx7fn5+fX5+f39+f35/fn+Af3+AgICBgYCChIeKiYmIiIiIh4eHh4eHh4eNjY2Njo6Oi42Nj5WPiYyPjYyNjYyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYR+eXt5ent7ent9fHt+fn59fn1+f35/fn9+f3+AgICAf4CAgICEh4mIiIiHh4eHh4eHh4aGhoyNjY2NjY+MjImKj42IjJGPjY2NjIyMjIyMjIyLi4uLi4uKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uKioqJiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJg355e3p8e3p7fX17fH9+fn5+fX5/fn9+f3+Af4CAgH+AgH9/f4OGiIiHh4eHh4aGhoaGhoaGjIyMjIyLiYyKiIeJhoyOjJCMjZGOjIyMi4uLi4uLi4uLi4qKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiImJiYmJiYmJiYmJiYmJiYmJiYmIiImJiYmJiYmJiYmJiYiIiIiIiYmCf3h7e3t6enx9fHx9f39+fn19fn9/f39/f4F/gIB/gICAgICAg4aIh4eHhoaGhoaGhoaGhoWMjIyMi4yOjoyKioeEiIuKjIuNjo+Li4uLi4uLi4uLi4uLioqKiomJiYmKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiomJiYmJiYiIiIiIiIiIiImJiYmJiYmJiYmJiIiIiIiIiYmIiIiIiIiIiIiIiIiIiIJ/eHp7enp6e3x8fX1+f35+fX1+f39/fn+AgICAf3+Af4CAgYCDhYiHh4aGhoaGhoaFhYWFhYyMjI2NjJCSjI2Ii4mJi4uLi4mLjIqMi4uLi4uLioqLi4qKiomJiYmJiYmJiYqKioqKioqKioqKioqKioqKioqKioqKiYqJioqJiYmJiYmIiIiIiIiIiIiIiImJiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIiIiIiIiIiHgXx4e3x5enp8fHx9fX9/fn59fX9/f39+fn+Af4B/f3+Af4CAgIKEh4eGhoaGhYWFhYWFhYWFjIyNkY+PjZGJjIaJjIuIiImMiYeNjo+NioqKioqKioqKiomJiYmJiYmJiYmJioqKioqKioqKioqKioqJioqKioqKiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4WAenl9e3t7enx8fHx9f39+fn19f39/f35+f4B/gH9/f4B/gH+AgoSHhoaGhYWFhYWFhYWFhISLi46PjoyLj4iHiYmMjYWFjo2KiYyNi46KioqKiomJiYmJiYmJiYmJiYmJiYmJiYmKioqKioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHhoaHh4eHhH55eX16enp7fXt8fX5+f35+fX5/f39/fX5/f3+Af39/f39/f4CChIaFhoWFhYWFhYWFhISEhIuLjI6MjI2Lh4mIiomGgoiNjoiKi5GTj4uJiYmJiYmJiYmJiYmIiYmJiYmJiYmJiYmKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIeHh4eHh4eIiIiIiIiIiIiIh4eHh4eHhoaGh4aGhoaGhoaGh4eDfXp5e3p5enx8e31+fn5/fn59fn9/fn9+fn+AgICAf35/f39/gIKEhoWFhYWFhYWEhISEhISEioqOjYmIiIqKh4iHiomIioiIh4qGi5GPiomJiYmJiYiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHh4iIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGh4J8eXl6eXp7e3t7fX5+fn5+fn59gH9/f39/f4CAgH9/fn9/gICAgoSGhYWFhISEhISEhISEhISKi5CPiYmJi4qHh4WHiYuKiYSLjYmOjYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiIiIiImJiYmJiYiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGgXt4enp4e3x7e3x+fn9+fn5+fX1/f39/f3+Af4B/f39/f3+Af4CChIaFhYSEhISEhISEhISEhI+Qj4+IiYuIhoeIiYuLjIuJioqNio6Oj4mJiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoaAe3h5eXh4enp8fX1+f35+fn59fn9/f39/gIB/gICAf39/gIB/gYKDhoiGiIaDhISEhIODg4ODkpKOioeKi4qLh4uNiYqJi4iHiouIio+SioiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhn96eXh4eHl5eXx9fn5/fn5/fn1+f35/f3+Af39/f4CAgH+AgH+BgoOHjo+PjoiHhIWFhoaFhYWSkI6KiYmIiImKioiIh4aKjIiHiYmOkJGNh4iIiIiIiIiIiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4aGh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWGf3l4d3d3eXp5e3x9fn9+f35+fn5+f35+fn+Af4CAgICAf3+Af4GBg4eOjo6Ojo6Mjo2OjY2MjZCQjomHhoiJiYeIiouIiYyJiYaKjY6PkYuIiIiIiIeHh4eIiIiIiIiHh4eHh4iIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhYZ+eXd5d3d6eXl8e31/fn5/fn5+fn5+fn9+f4B/fn+Af39/f39+gIGEiI6Ojo6Ojo6Ojo6Ojo2NkJGOi42JjIiIiYaHiYaIioiHi4yLjpCQiIeIiYmJiIeHh4iIiYmIh4eHh4iIiYiIiIiIh4iIiIiHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhoaFhYaGhoWGhYSEhIWFhoaFhIWFhX55d3l2eHl4e3x7fn5+fn5+fn5+fn5+f39+f39+f39/f35/f3+AgYOGjY2Ojo6OjY6NjY6OjY2Qj42Ni46KhoiKhISLiYeDhYSDi4mLj42JjI6QkI+NjYyLjY6Pj42NjI2Nj4+Pjo6MjYyMjY2KiYiHiImHh4aHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoeHiYqKiIeJi4yNjo2LiImLi42OjYyJiImMgHl3d3Z6eXh7e3t+fn5+fn5+fn5+fn5/f39+fn5/f4B/f4B/f4CBg4aMjY2NjY2NjY2Qj4+Pj46NjI6KiYuMjIeFiY2Lh4aIh4aHh4uNjo6Pj4+Pjo+Pj4+Pj4+Pj4+Pj4+Ojo+Pj4+Pj4+Pj4+Oj46Oj46Mi4uJh4eHh4aIhoaGhoaGhoaGhoeLiYeHiIiLjY2Mi4yLjY2Ojo+Ojo6Pj46Ojo6Ojo6Ojo6Njo6NjY2AeHZ4eHp4enx6fH5+fn5+fn5+fn5+f39/fn59fn9/f39/gH9/gIGDhoyMjIyMjY+QkpOTk5KSjYyMjIqHioyKh4eJiYWCiouIiYWJjpCNjo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjI2NjI2LiYaHh4eHiYqLjY6NjYyNjY6OjY2OjY2NjY2NjY2NjY2NjY2OjIyNj4+OjY2MjIyLi313dXd5enp7e3p+fn5+fn5+f35+fn5/f39+fn1+f39/gICAf3+AgYOFj5KRkJGSk5OTk5OTkpKLi4uLiomMiouLiYuKhoeOjYiIjI6OjIuMjIyNj46Njo6Ojo2NjY2MjY2NjIyMjIyMjIyMjY2NjYyMjI2NjYyMjI2NjIyNjIyMi4yMi4yMjI2MjIyMjIyMjIyMjIyLi4uLi4yNjY6Sk5OSkpSRkJOVlZSTk5COjo6Oe3Z2d3h6ent7e31+fn5+fn5/fn5+fn5/f35+fn9/f39/gIB/f4CBgoSNkpKTkpOSkpOTkZKSkoqJioyJi4qJjIuKioiHiYqKi4mKjY2Mj46Nj5KUlJOUlJOTkpGSkI+Ojo2NjY2Pko+OkZGOjIuKioqLi4qKi5CPjoyMjIqKioqKioqKiouKioqKi4yLi4uMjIyKiouLi46RkpOTk5SUk5STk5SUlJOTk5KSkpKSk5F6dXZ2eHt7e3p6fX5+fn5+fn5+fn5+fX5/fn5+f39/f3+Af39/gIGChIuRkZGRkZKSkpGRkpGRiYmIiIqMiYiJiYuJhoSJhoyKh4ySkpKTk5OUlZWWlZWUk5OUlJSUlJSUlJSVlZWVlZWUlJOTkY+QkZKQjoyRlZWVk5KSjo+QjYqKi4qKi42OjY6RkpCRkpKSkpGRkpKSk5OTk5OTk5OTk5OTkpOSkpKSkpKSkpKSj3h1d3l6e3t7ent9fX19fn5/f35+fX5+fn5+f39/fn9/f4B/f3+AgYKEi5GQkJCSkpKRkZGRkZGIiIiIi4uJg4eLi4yMiIeHjYyNkpSSkpOTlJWWlpaVlZSSkpOTk5SUlJWVlZaXlpaWlpWUk5SUlJSVlJSUk5OVlZWUk5KTk5OTkJGSkZGSk5OTk5KSkpOSkpKSkpKSkpKSkpKSk5OTk5SUk5OSkpOTkpKSkpGRkZGPdnJ3enp7e3t8fX59fX1+fn9+fn9+fn5+fn6Af39/f3+Af3+Af4CBgoSKkJCRkZGRkZCQkJCQkIeHh4eIiIiFi4+KjI6Njo+OkJWUk5OTk5SUlZWVlJSVk5KSk5KTlZSUlZaWlpaWlpaWlpSTk5OTk5OUlJOSk5SVlZSTkpKSkpOTk5OTk5OTk5KSkpKSkpKSkpGSkpGRkZGRkZKTlJSUlJSTkpGRkZGRkZGRkZGRkYx0c3d6ent7e3x9fX1+fX5+f35+fn5+fn5+fn9/f39/fn9/f39/f4GDhIqQkJGRkJCQj4+Pj4+Ph4iKi4yNjYuOj42Mjo6RkpGSk5OSkpKSk5SUlJOSkpOTkpKSkpKUkpGUk5WVlZWUlZWUk5OTk5KSk5OUk5KTlJSUk5KSkpKSk5OTkpKSkpKRkZKSkpKSkpKSkpKSkZKRkZGSkpOTlJSUk5OSkZGRkZGQkJCQkZCRinN0dnp8fHp7fXx9fn59f35/f35+fn9+f31+f39+fn59f39/gH+AgYKDipCQkZGQj5CPjo+Pjo+Oj4+Pj4+Pj4+PkI2OjpCRkpKSkpKRkpKTk5OTkpGSkpKSkZGSk5SDhZSSk5STk5OTlJOSk5OTk5OTk5OSk5OTkpKSkpKSkpKSkpGRkZGSkZCRkZGRkpKRkZGRkpGRkZGRkpKSkpKSkpKSkpKRkJCQkJCQkJCQkJGGc3V2e3x8e3x9fX1+fn1/f35/fn5/gH9+fX5/fX5/fn5/f3+Af3+BgYGKkI+PkI+Pj4+Pj4+Pj4+Oj46Oj4+Pj5CQiI2PkJGRkpKSkpOTk5OTkpKSk5KSjoOSkZGTjXWJk5GRkpKSkZKSkpKSkpKTk5KRkZKTkpGRkpKSkpKRkJCQkJGRkZGQkJGSkZGRkZGSkZGRkZGRkZGSkpKSkpKSkZCRkZCPj4+Pj4+Pj4+PkX9ydHh8fHx7fHx9fX5+fn9+fn5/f3+AgH99fn5+f39+f39/f4CAf4GBgYqPj4+Pjo6Ojo+Pj46Ojo6Ojo+PkI+Pj4+GjpCQkJCRkZGRkZGRkZGQkJCQkJGOb3+SkZF8dImRkJCRkZCQkJGRkZGRkZGRkJCQkZGQkJGRkZGRkI+PkJCQkJGRkJCQkJCRkJCQkJCQkZCQkJCQkJCQkZCQkJCPj4+Pjo+Pj46Ojo+Pj4+PeHJ2eXx9fHp9fH19fn5+f35+f39/f4CAf39/fn5/f35/f39/gIB/gYGAio6Ojo6NjY2Ojo6Ojo6NjY2Oj4+Pj4+PjoiQkZCPj4+QkJCQkJCQkI+PkJCQj5B4aoSRinN2iJCPj4+PkI+PkJCQkJCQj4+Oj4+QkI+PkJCQkJCPjo+QkJCPj4+Pj4+PkJCQkI+PkI+Qj4+PkI+PkJCQkI+OkI+Pj46OjoyMjY2NjIqDiYhzc3Z4fX58eX18fX1+fn5/fX5/fn9/f39/f4B/f39/f4CAgH+AgH+BgYCJjY2Ojo6Ojo6OjY2OjoyNjY6Ojo6Ojo2NiJCRkI6Njo6Ojo6Ojo6Pjo6Ojo6Oj3tncY6EcnWHj46OjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Pj46Oj4+Pj4+Pj4+Pjo+PjY2MjYyNjoyLi4mJiYiFhYSDgoKEgnR5fXp4dXJrZWltb2xmZmdncHNzd3l9fnl6e3x9fX1+fn59fn9/fn9/f39/gIB/f3+AgIGAgIB/f4CBgImNjY2NjY2MjYyMjIyMi4uLjYyMjIyMjIyGj5GRjIyMjIyMjIyMjIyMjIyMjIyOeVxodXBkb4iOjY2MjIyNjY2NjYyMjI2MiomKi4uJh4KAh4iEgXt6gH57fXx8fXlzcnJycnV1cG1ramppZ2NkYV9bXF1eWFVXWFlTS0VJSkpLTE1PT0tgdHR3eX19eHp5e3x8fX5+fn1+f39+f35/f4CAgH+AgICBgYCAgICAgIGAf4OEhYSFiIuLjYyMjIuLi4yGiYqKioqKh4OOkJGNiouLi4uMiYmKioqKiouKioZkaWtcZ2prg4WDhIeJiYWCg397fHl6e3pzcHFxcW1samdsbWdlZmVmZGNlZGVkZWVlZWRkZGNhYV5dXFpYWFdUUFFSU1JTTU1KSUZESEpHR0hHR0xOSWdzdXh6fXp4d3l8fHx8fn5+fn9/fn9/f39+f4CAgIB/gICBgICAgICBgYFnXmBjYWNucX17ent/fXd8fHZ4ent4eHpvcXt4eXt8e3h3e394dXd0dHZ1dXZ3bmN1bFtqdW5laGtsbm9tamlpaGhlZWRkZF9gYWJgYF5dWVhaWltdXV9gX2BfX19gYmFeXl5eWVldXF1bV1dWUlRSU1NOUUpISUZERUhMTEhGR0lLSklNbXJ0eHp7end3eXt6e3x+fn1+f39+f35/f35+gIGAf3+AgIGAgICAgICCgWdYW1pZXFtcY1xaXF5ga3FtcHBvbm5vbmtpbmxrbG9qaWtraWpraWZmZ2dnaGdgZ29vZmxydGpiY2JhYmBgXVhbW1dYV1RWUVBUU1NNSkxLTExOTk9UWFhXVVVUUlBQTU1QT05LTE1QUU9MTEpHSUlHSEhJSEhIR0ZHSEpKSEhISUlISVZwc3V5ent5dnZ5enp7fH59fX5/f35/fn5+f3+AgX9+f4B/gICAgICAgIGBbFtYVlZWWVlaWVlYVVZoamxubmxra2poaGloZGVkYlxiZl9fYWNfXF9dYF1eWVxiZ2pyb3FzbVpZX1tYV1NOTUtLS0tMSUtNTktKS0tMSktQTEtLRkdHSUlGR0lISUZFSEdGRkVERUVEREVJSUlHSEdIRkZLTUtJSUlIR0hLTU1LTExMVXFzdnl6e3l2d3h3ent8fn1+fn9/f39+f3+AgIGAfn5/f4CAf4CAgIB/gYJoUlRVVlNVV1lZWVdXV1tbYWNfXlxbWFZWWVZSVFJRUVVUU1NUUE1KTU5QUk9NUl9jZW1ubmpoUlFUUFBOTk9NSk1MS0xKSktLRklJSkxJR0pISUlFR0dGRkVFSElKR0ZHRkZHR0hKR0dISEpMSkpLSUlISktLSkhKS0pISUtMTU9QUEtUdHN1eHp6eHZ2d3d6enx+fX5+fn5/f35+fn+AgYB/f3+AgYB/gICAgH+AgmlQUlRXVVRWWVdYWFpbVFRTUlBRU1FRUU9OTlBQUU9MTlBPTk5NTEtNTk5PTU1VY2tnbG1tZ2VZUU9PUFFPTk5PTk9QTk1NS0lISEpJSUlJR0ZHR0dJSkhJSEhJSEhHSEdISElISUxLSklISkpJSkpIR0pMS0pJSUhKSktMTk1NTU9RTFVzcnN3enl3dnR2eHp7fX19fn5+fn9+fn5+gICBgICAf4GBgH+AgICAgICBbE9PTlRZVVVdW1lXV1hOTUpKSUZKT0xKSkdJSk1NS0pMTUpHSUlJSktLRUVLUl5obWdsbWxqamZiXFVQT09NTk9MTk5OUFBPTE1MTk1MTEpJSEdJSElISElJS0xLS0pJS0pJSklJSUlJR0dKSUdJSUpKTk1OTEhJSklJSk1PT01MT1JOWXBwcnd4d3d0c3R3enx+fX5+fn5+fn5+fn9/gICAgICAgYCAf39/gICAgIFvS0pNTlFOTlVXVlZSU0lFQ0VFUkREQT5CP0RAQD5CREFAQURHRkVIRkZTW11hZmpuam9ta2pra2pqZlpLSklKSUlLSkxQTk1MTU1MTU1NTElIREZGR0ZGRklKSUlLSkhMSklKSkpJSEhKS0tIRkdJSklLTU5OSktPTUxLTU1PUE5QT1BgcG9yd3h2dHJzdXd6fX19fn5+fn9+fn1/gICAgICAf4CAgIB/f3+AgICAgXNQUE5OUE1KS1BSUE5RQ0RCQUZRRT1DPT9FSDk6Oz0/PTxBRkA+Ojs/QENTXmNtbGxud3JqaWtoX1RNRkVFRUZFR0dHR0pHSEpLR0NER0pHQ0RFQUFDR0hHSEdISktKSElMS0lISktLTU5MTUxMSkpMS0lLTU9PUFNRT1BQTk9QUlFNUGdwb3N2dXRycXR4eX19fX1+fn5+f4B+foCAgH9/gIB/f4CAgH+Af4B/gICCdlRVUVFQT0xNUFBOT09BQkFAQkE/Oz48Pj8/Ozg5ODs7OkA6Oz48Ozs8O0dLQk5ibXB6c2tqYEtGQkVGREdJSEM/QEBAQUFCQUE/Pjw9PkFAQD8+P0BFR0dHSUtMTk1OTUxNTUpLTVBVU05MTlFOTk1OTE1NTk9OTk1LS05OTk1OTkxUbnBwc3R0c3Fydnl5fX19fn1+fn5/gH5+gICAgICAgH9/gICAgH9/gH+BgIJ4UVFSVFJTUVNTUVFST0BAPT4/PD8+QEE/PT45Ozo7Ozk5Ojg4Ozw5Nzk7Oz08Oj5NYHRwY05DP0BAQ0ZEQ0NDPzs+PkBDQ0E/Pj9BPkBAQj9APD9CQEFDRUVFSktQT1BPTU1OTExMT1JRUFJOTExPTUtOT0xMTEtMS0tKS0tKTU1LS1xxcXF0c3VycXR4eHp9fn1+fn5+f39/fn5/gIGAgH+Af4CAgICAf4CAf4CAgXxSTU9RUFFSUlRSU1NOPDs8Ozs7P0BBQkA9PDk8PTw6Nzk6Ojk3OTo6Nzg6OTk7OjY4V2ZBODg7PD1AQUA9Ozs+PD09QEJDQT9BQkE9Pj09Oz0/Q0RCQD9BREJFR0pKSkpKTE1MTExNTExOVVNLTE1USVBKSU1KSUpLS0pJSEdKS0lKZnJxc3RzdXJydnl5e31+fn5+fX9+f39/f36AgICAf4CAgICAgIF/gIF/gYCBgFZMTlBQTlJRUFBRUU44PT88PDo9PkFAQT8+PkA/Pj48PT0/QD09PT9DOz09PTw8PDpEWTk8PD09Pj9AQUA+P0E/QEBBQEBAPT8/PTw6Oz09PD9AQUJCQUBCREZGRkdGR0dISUtMTExLTEtKS0lKSk1MTEpMS0lISUxMSklJSElLR01tcHF1dXR1c3V4eXl8fX5+fn5+fn5/gH9+gIB/f39/gH+AgYCAgYCBgICBgYCCYUtPT05OT1BPT1BQTzo8Pjw9Oz8+PkFBPz0/Q0NEQT89PkBBP0A8XW5APkRFPz9BPEZdPT49Ozo9PkFBPz5AQD9BPz89PD48PTs7PD0+QUA/QD5AQ0NEQkRFSEVFR0hISEdGSUpJSUlJSUhKSkpKTEtKSklJSEhKSktMS0lLSkpIVnBwcXNzdHR1eXp7e3x+f35+fn5+f39/f39/f3+Af4CAgICAf4GBgICAgIGBgIJtTFBRTk9QTk5PUFBPPjw8PT4/P0A+QEA/Pz9CRkQ+PDw9QD04Ojttd0k4Ozo9PUE8S2I9PD08ODo7Pz49PD07PEA9PTw8Pjs9PD0+QUBCQUBAP0JEQ0RFRkZGQ0VHSElJSEhJS0tMTUpKSUpNTUpLSktJSEhISEpJSktKSk5MSUlfcHBycnJ0dXZ6e319fH5+fn5+fn5/f35/f36AgIB/gICAgICAgYGAgICAgIGAgnZNTk5NTk5MTE5QT0w+QTw8PT8+QkM/PkFBQUJBQFlSPD09SUxGRnZ3Tjc4ODo7Pj5XaUE7PDw6Ojs+Pz89PDg6Pjw9Pj89Oz4/QEJDQkJDQ0FCQkFCQkRCQkRCRENGSUdGRkhJSUtNSklKSktMSkpJSkVESUlGRkhISUpKTEpGRmdwb3FxdHZ2d3t8fH18fn59fX1+fn9/foB+fn+AgH+AgICAgICBgYCAgICAgICBek5JS0tMTExFSUxOTTw/PDw9PkBAQUE7QkNCQ0BDc3lJO11/g395fHdWPD0/PT0+RWl0TTo9Pj89PT5BQ0A8OTtBPz4+QT07P0JAQkNCQENDQUNBPT0+QD0/QUFBQENFRUBAQ0JDR0dFRENGRUZGR0VEQEFHR0ZDRkRHSEpHQz5IbG9wcHF0dXZ5fHx8fHx+fn1+fn5+fn5+f36Af3+AgICAgICAgIGAf4CAf4CBgIF+UUhLTU1NS0pLTE9RQD8+PkFBQEBBR0FCRENFQUhyeWtigoSDg4OAfV0+QENAQD1JcntaOj1BRUFCQkZIQz08QEREQUA/Pj1AQT4+Pj88PkBER0VAPkBBP0BDRkVDQkNDQEJEREJERUFCPkFCQkFCQEA9QUJDRENDQUNFR0E/PVZwcHFwcnV1d3p8e3t7fX9+fX19fX1+fX5+fn9/foB/f4CAgICAgYCAgIB/gIGAgX5SSEtNTUxLS05OUlVEQkBDQ0FBQkBCQ0BAQUFARm90fYKCgYN+fYR1TEFDRUA/Plh7gF0/Q0VJSklJTU1LRUNGR0dFR0VFRUREQ0E/QD4+QkZKSkdFRUdGRkpOTktKSUdHSEtMSUdHQ0REREVEQUJCQ0BDREVEREVERUZDQkFEZW9wcXF0dnV4e3x6fHx+f319fX19fn59f4B/f39/f39+gIGBf4CBgICAgH+AgICAfVJJSUpKSEpKTE9SU0dGRUdIREdIREA+PDs+QEVFaHN9gXx/hH55hXFDREVEQ1d1hoeHflhHSEpNTE5PT0xIR0hISElJSEhHR0hIRUNFRUVFRkhKSkZFR0lKTU9PTU1LSktKTU5LSUhHSEhIR0ZFRkZGREZIR0VFSEhGSEdIRlFubnBxcnZ2eXt7e3p8fX5+fX19fX1+fn1/f39/fn5/gH+BgYGAgICAgICAf4GBgIB8UEhHSElGR0lKTU5OSkxJSUpLTE5KRkNBQkNGSkdge4B/d3+EhYOEim1BQVZ0h4mHh4eIg1dITE1MTU5MSUdHR0dER0dHR0ZIRkhFQ0RERkVEREhIQ0NDRklKS0xMTExMTElKS0pKSUlJSEpISEdISUhHR0hGRkZISklJSUlIXW9vcXJzdnd6e3t6e319fn59fX19fX5+fYB/f39+fn+BgIGAgYCAgICAgIB/gYCAgHxNR0ZIRkVGR0dKS0pMTUxLTU5NT0tJSEhKS0tMTE5bfIKCg4OFhoaIg1ZshYeGhoaHiIiHfFBLTEtIR0ZGREVDQ0BBQ0NDQ0ZGRUJAPj5AQUFAQkQ/Pj9ERkhERUdJSklKSEhIR0lJSUpJSEZKSkpKSUpJSkpKRklMTEtKS0tmb3BzcnR2eHl7e3t8fH1+fn19fX19fn59f39/f35/f4CAgICAgYCAgIGAgICAgICAfU9GRkdGR0hHRUZHR01NTUtMS0lHQ0NDRElLS0xMSlWBg4SEgoKFhoaEgoaFhISGhoaHh4aKdUlJRkI/P0A/Pz88PDw+Ozo8QUFAPjw5OTg8PD07Pjs5Oz9BQkBBQ0NCQEFCRERCQ0ZISUhISExNTEdJSk1NTk1KSktLSkxNU2xwcXRzc3d5e3t7fH19fn9+fX19fX1+fn5/foB/fn9/gICBgIGBgICAgYCAgIB/f39+UUZFRkdJSUdEQ0VGTk1MSklIRT85Oj5ARUhISkpJZYWEhIR/gYKDgoODhIWFhoeIiIiIiYyOZkJCPTg4Ojo5ODc4ODk2NDc5Ozw6ODU2Nzc4OTc4NzY4ODs7Oz1AOzk5OT08Pjs7PUFDRUhKTUxMR0lIT1JRUFBOTE1NT1Fdb3BydHN1eHp7e3x8fn5+f359fX59fX5+f39/gH9/f4CAgICAgYCAgICAgICAgIB/f39RR0ZHSEpIRkVGR0hMTEpJSUdDQjU2OjxDQENHSUlqhoSEgX6Bg4ODgoOEhomKjIyLiomKi4yJVDo4NjY2NzY2NjQ1NzczNTY4Ojg3NjU2NTY3Njc3ODo2Nzc4OTs3NTc4OTc5ODc2OjxAR0ZJRklGRUZPU1JTU1JPUFBSVGVwcXN0dHd5e3x7fH1+fn5/fn19fX19f39/f3+Afn+AgICAgICBgICAgICAgICAgH9/flJISEhJS0lHSUpJSkpLREVIRUJANTc4OD06PUVDQmaFg4GAgoODg4ODhYmKiomJioqKiouJioqBRzY3NjQ2ODg3NDU3ODU2NzY5OTc2Njc2NTo5Ojs6Ozg5ODk4Nzc3OTo5ODg3ODY4OTtBPT4+QkE/QUtMT1FQUU9PT1JXa3FydHR1d3p7e3t9fX5/fn9+fX19fX5/f4B+fn9/f4CAgH9/gICAgICAgH+AgICAf39+VEhHSUlMTUtKS0tMSUg/QEFAPDo1Nzk4OTc7Qjo9cYSAgYOEhISEhIaJioqIh4iIiYqKi4qJiYx6Pjk4ODs8PT45Ojo8OTo7OTo7Ojk5Ozo5PT09Pjs7PD06Pjs5Ozs8Ozw8OTo8ODo6Ozo5OTk8Pzw9QUJESUpNS0lLTFdvcnN1c3Z4e3t8fHt9f39+f359fX19fn9/f35/f39/f3+Bf4CAgICAgICAf4CAgH+Af35URkVGSUxOTkxKSk1CPzo7PDs4OTk4OTo6Ojs/Pkh+hIKChIWFhYaIiYiHhoaGiImIiYuMi4mKioxsPDs+QkNFRUFBQEI+QEJAQD49PT5APz4/QD9APT0/Qj9AQT9BPz1AQEA+P0E9Pjw7Ojs5OTs/PTs8PT1BQUNBQkNBWHBxdHR0dnp7e319e31/fn9/fn19fX5+f35+fn9+f4B/f4CAgIB/gIGAf39/gICAf39/flJFQkFHSk5PTElHSzo4Ojs5Ojo8PTo7Oz09P0BCUoKCgoSFhIWEhomJiIiGhoaHiImKi4uLioqLiotePkRHSUtKSUZHR0RGSEdFQkBAQ0VDQkBCQ0I/QERIRUNFQ0VFQUZFRkRFRkRAQj88QD49P0A+Pz4/Pj8+Pjo7PTxgcXJ0dHV3enp7fX19fn5+f39+fX19fX5/fn5+fn5/gH9/gICAgICAgICAf4CAgIB/f4B+UERAPUNIT01HRkJEOTc6Pjo8Oz4/Pz89QUBDREZXhIKDhIWFhoaIiYmIh4aGhoeJiYqLjI2MjIuKiohWSE1MTUxPSUlLSUlKSklFQ0RGR0ZEQ0VGREJISUtIR0dGSEdFS0lLSUpLSkNGQ0NEQkFBQ0JEQ0NERENBPTs9QGhwc3R0d3d5eHt8fH19fn5/f359fX1+fn9+fn59fn+Af3+AgH9/gICAgICAgICAgH+AgH9PQT49P0RMS0BCQkE5ODw+Ozw7PkA/QT5CQkdHSVmEgoOFhYaHiImJiIiHhoaGiIiIiYqMjYyMi4uKjH9QTlBOTE5MSkxKSUlISkZERkhISUVFSEZGRUxMTUlKR0dISUpOTU5MTE5LSEdHR0VFQ0ZGRkZERUhIRkNBP0BMbHB0dXZ4eXl5fHx8fX1+fn9+fn19fX1/f35+fn5+f39/f39/f3+AgICAgIB/gICAgICAf1FBPz4/RUdHPTxAQDg4PDs8PTo+QD4/QENGSUlQX4GDhYSFhoaHiIiIiIiIh4eIiIiJioyNjIyMi4uKjXJOUlBOTU1MTEpIR0VJSURKSEdLSkhKR0dHS0xOTExISElKTVFOUE5NT0tJR0lKSElESUhIRkZHR0hHQ0JBQ1VucHV3d3l6eHl6enx8fX5+f39+fn1+fX5+fn5/f36Af4B/f3+Af4CAgICAgICAgICAf39/VERBQUJHR0I/OD9AODo8OD0+Oz1BPj9BREhKTFVxg4SEhISFhoeIiIiIiIeGiIiIiImJjIyLjIyMi4uLi19SUlBNTk1LSkdFQkdKR0xLRktOS0tKSkxNTE9QTkhJS0xPUVBQUU9PSklKSkxKTEZHSEdGRklGRUVCQUJCXG9yd3h5enp5eXp6e3t+fn5/fn59fX19fn9+fn9+f4CAgIB/f39/gICAgICAgICAgH9/f39VRUNFRUdHRUQ7P0E7PTw5QD4+QEJHR0FHS0xQVnmFg4ODhISGiIiIiIiIh4eIiIiIiIqLi4uMjIyMi4uNfFhWUlJUU09MS0pERUZLT05PV1VRUE9RU1NNU1RPTVNMUFNVVlJTUVBMSk1NTUtOR0dKRkZJSkRERUVCRENjcHV5eXp6ent6e3p6fH59fX9+fX19fXx9fn5/gH9/gICAf39/f3+BgYCAf39/gIB/f39/f1VGRkdHR0dIRj5AQj0/PT1CP0JCR1ZORk5QUFRYe4aDhYWEhIeIiIiIiIiIiIiIiIiJiouKioyMjIyOi4uLaFdVa2FFUlFRUEk7O1JUUmB1XVVWVFZZWVJYWFJaZlBVV1pdUlRXUU9OUlBQUFFLS0tISEpIRUZJSUlISWlydnl4eXl6e3t8ent8fXx9gH59fX19fX1+f39/f3+AgIB/f39/f4CAgIB/f3+AgH9/f35+U0hKSUhHR0ZFPz9BQUVCQ0dFREVMWFJNVFVWWFt8hoWHhoWGh4iIiIiIiIiIiIiIiIiIlJyMiouMfWGKi4uHbFtkVTpYWFhTUT9AVlVZXGRgVllicl1dV11aVUVRWVpbWV9UWWdSVlZYVFRWVE9PTUpMSklJTE1LT01Tb3N2eHl4d3l5ent6e3x9e35/fn1+fX19fn1/f39+f4CAgH9/f3+AgICAgH9/gH+Af39+fn5WSkpJSEdFRERCQT9ITUlNUEtJS1BUU1NYWlpcXHiFhIWFhYWGh4eHiIiIiIiIiIiIiImcnaCPiY5nO36LiYqLeW5wWFpcW1JTUlZWVFtadYNZVX2QYFxYXV5XSVZdXVtbX1lIWVhZW11YWFlXUlFOUFFNTU9TUVFVUmFzc3Z3d3Z4eHh6e3p8fX19f39+fX59fX1+fn9/gH9/gIB/f3+Af3+AgICAf39/gIB/gHh5fVlOS0lJSEZCREBBOlBRUVdYUFBPUVNUVFhYWVpbboGCg4WEhYaHh4eHh4iIiIiIiIiIiJaanJeIioFuhomIh4OKfmZZWVxZVFVUV1JRV1ZjloBRZXJYWldfaFBgZltbWFxnYUdPWmhnXFtcXV1XUk9TUFBRVlZWVllabnJ0d3Z2dXh4eHt7fH19fX5/fn59fn18fn9/f3+Af39/gH+AgH9/gICBgYB/gH1yfX9/b3R8XVNQT01LSkVDP0A7UFBaWltSU1FPUlJSVVNWVFdfdXiAhYSEhYaGhoaHh4eHiIiIh4eIh4ORjomJiIaFiIiGfYB7XFBVWFRSVFJRUUxPTUtmeVtdVFlVVl1aS1RaVVNUXlpYV1dXemtYW1tcXlRRUVBJTk9XVlhbWmRwcnZ2dHR2eHl5e3t8fH19fn99fX1+fX1+f39/gIB/f3+Afn56eHd2c3V7f3+AgHRrfn5rcnleW1ZVVFJPS0ZDREFNXoNsVlJTTk9RT1FVUlNSU1VjZHaAgoKDhISEhIWFhISDhoaGhoeIhn6JiYiHhoOHh4d5bXFWSUtNTktNS0hKREZIRUM+VGRVf1JRUU5LUlRRTU9ZUk1OUVNVVU1RU1JQT01MSENJSFJUVVpcbHF1dnVzc3d6ent7e317fX19fn19fX59fn9/f4B/f399fX5+f39/f4B+e3Zzd31+fmR1fWlxdF9kXV5bWVZQTElMSWFsknRQUVNOUVJRUltSU1JRUlZUYnN7fH+AgYKBgX99e3uAf4OChYaHgoaGhoGEgYaFhnVfXUtDP0NDQ0NCP0RQQkNAQz1DSUdWQEhOTEddaVBIRk9GREVGSUdIQ0RIR0hLR0RCQURATlFNUmRydHZ1c3R1enx7e3t7fHx9fHt+fX19fn5/f3+AgIB/f3x8fX+Af39/f4CBgH12dHt/bWh8Z25xZmllZGJcWFNRUFVSc1dlW09PTkxRU1FVWVNVUVFUUk9WYGtscnZ7e3h5dHJuc3RzeXh+foOAg4OCgIKAgoGCa01HP0A6Oz5AQD8/PmpRS2FFRkhJRUI/R0xOR01RVUlCRT8/PD08PT0/PT9BQ0NAPzw9Qj5KTUdVbnR0dXN0dnh6fHp9e3x9fX19fH59fXx+fn9/f4B/f39/enl3eHd2dnh7foB+fXt4dnx1YXhnbHBqbGpqZmBbUVJaXFleSkpQUU5LTFFSUVRWVFdRUVdWUFhbYl1hZ21tbG9rZ2BucmptbHF1e3p9e3h6fHx4d3hlQ0BAQj06QkNBQURCXF1Pe05PTk5LTE1PT1FMS0xXTkhHQEE8OTc3Njk5PTs7Ozg5ODk/PEJIP1xzdHV2dXZ4enx8fH18fH19fn58fn19fX9/f39/fn9/f314dXZ6e3p3eXh1d3t8eXh1eXdjcWhpcG1ubW1oZl5PUF5cWklIUFJRT01QUU5RUlRWWFNSWVROWVpbV1ldXl5fZWBdXnF2a15gZ2t3b29sam9ubmxmYllIRkZIQkFHSUVFRkRNUlBhV1JXUVBTU1JVW09PUVdQTUlERj46OTY1ODc5Nzk6MzY1Nzk1PEM+ZXNzdnd3eXl7fX18fHt8fX1+fnt+fn19f39/fn5+fn9/e3d1eX18enh8fHx8dHd2d3Z1d2tuaWhxbm9vb2prYFVXXlpYTUxUVFNQUVVPTFJTVFdYVFRYUUxXWVpWWFhWWFldV1hYaHNrXVZhc2thYV9eZGFfXllUUU5OTkxJSEpLSUlGQ1FQU1tXVFROUVNZU1xlVU9TVFFOS0lIQz9BOTk5ODk3ODg1NzU3ODU5OUducXR3eHl7e31+fX18e318fn5+en1+fH1/f359fn5+f358dHR1e3hycW9vbnR4cXJzeHZ1cWZkZ3JucHBxbm1kXV9fWVdPUFhWVlNUVk9PVFZYWFlTVVRMS1RWVVVVV1BUVVdUVVJdbl5STllfW1ZZO0RWWFRbZkpMT1JST01NTk5OTEpGUVBVWVNUT0pOT1VTVFxWUlVTUk9NTElISEY/Pzw6Nzg3NjU5OTY3NjY1V3Bwc3d5ent8fX59fnx9fXx9fX15fX18fn5+fXx8fX1+fXxydnF4eHJ2dXFxbnBwb3B1dnRuamRkanBwcXJwb2ZlZGNcXVJUWlZXVVRXVFJYWFlZWVJVT0lHT1BPT01SSk9QT1BOTk9UTE1JUE9TVFUyPVhNSUBRPWNhUVNRUE5QUVBOTk1RTlRSUFJNSUxKT1JQUlJTVFFST0xMS0xMSENCQT06Ojg3NjtCNTU2Njpkb3F0d3h7fHx9fnx9fH19fX18e3h8ent9fX58e3l9fH18e3B1b3d1cHV0b3N2cHFxcHR1dmNqZ2VXaHRycnFuaWlocFZWVFVYVVdVUldWVVpZWFdVUVNGRUFGR0dIRkpESEpIR0VITEhLSUZMTVBNRy9FX1I+Mz8+am9hUlJRQEdVUVBRUFFOUU9QT0xKTExPUE5OUFFRTlBPSkxNTUtHRUVEQjs9PDw5PUc2Njc3RG1wdHZ6e3t8fX18enx8fX5+fXt5dnh3eXl8fXp6dn17fHp6b3Fud3JwdnFtcHNwb3Bzc3N0ZmdgaFpXa3JzcmxtbWtuYWVQU1RSU1RPV1ZWWVlWUVFRT0A9Oz0/QUJBQ0BCRURBQEdIR0hFRkhKTUxFR0NPUkM4RU5TXWZTUVNBR1VQT1FRUE1NTk1LTEtMTk9PUU1PT01ITExJS0tMS0dGRkVEPEFBPjtARTs8ODlTcHJ1eXt6e318fHt5fHp6fn58e3V0dnJ2dnp6eHpyfHt8eXltcW94cnF1bm5xcm9vb3Rzc3J1dGtnZ15lam1wa29xbWltY0xPT01RU0xUVVRYV1VNTEtJPDk4Nzs+QD48PUFAQj0+RUhHQ0ZGSUdKSkBGQUFARkhFSk9IUFJhXFFQUk5TTk9QTExPTUtNTE1PTltXS01RT0dJSENISkxMSkZGRkU/QkM+PEJHP0I/QWRwdHd7ent7fHt6end7d3l+fnt7cXN0cHJzd3R4eHN6e3l2d2xxb3ZxdHRsb3Fybm5vc3ZydHNycmtsZW5zaG1ubWxtbGprSUxISE9RSlFTUVRTT0tIREQ9OTc3OT9CPjs/QkBAPkFESUVDR0dJR0lFQkI/Pj1DQkFHSURNT2JlUU1OTldLS01LTE1NTUxLTk5TZE1KTFJJSUlFQUhKTE1OSkdJRkJBQkA/RUZFSERLbm92eXl5e3t6e3p3dHh1eHx8eXpucXJtbm9ycnZyc3h8eHZ2bXBtc3B1dGxwcHJvb29ydnVyVlZucWdseYRqbXFybm5qaG9ISkNHTE1JTVBNUE9ISkQ/QT05OTk6P0I/PEBCQkFERUdLRkNISUdHSENDP0I/P0BBPkRFREtNUlRMSklNVEdJSUpMSktMSUpMTU9QUVBLR0NLR0NCSkpMTU9OSUpJR0NDQ0RJSk1MSVlybXd5eHp7e3l8dnJwdXJ0eHl2eGpxbmpsbG50dG10dXtzdHhyb25xb3ZzbnBvcnBvcHN0eWpOYGdzanR8eWdvc3FpcWhkcUdLREdISEdKS0lKS0RHQj0+PTo6OjtBQj89QkJDQ0hGSUxKRElJRkdHQ0M7QUBCPkBAQkVESU1QSEhLR0hLREhJS01ISkxISUpLSk1cUkhIRE5GQURLSk1NUE1LTUpLRkdHSk1OUU5MYm1pdnZ3e3h8en1xbWxza3B0dHR1aHBtamlra3RwbnR0eXByeXRvcnFvd3NvcXB0cnBydXR5a05WbXVscXt2aW5vaWt0Z2RvRktDRkVHRUZGR0VHQkNAPTw9OTo6OkFDQD5CQ0VFSUVJSkxGSUlHRkZDQjtBQ0M+QENDQ0RHTE5IS05IREhFSUxOTUdJTEdGR0lJTE5LSUhFTklCRk1MTkxPTU5OTUtISElPUlFTTlJmZmZxb3N4dXt5fGxoam5la3Fsc3FmbWxoaWtsdG1wdXR3cW94dG90c3J2c3BxcnRzcnR1dXZ2WFZ1dWtvdHJrb3ZsaG1lX3BHSkRGRkVDQ0NFQERCPkA/Ojs7PTo9PkNBPkFDRUZKRklITEhHR0dGRUNAPUVFQj5CQ0NDREdISUdNUEpGRkdLTk9LRkhKRkVERUlKSEtJRkhQS0NJTUxQTU9OT09OSkpJTFJVVVJPV2RgYW1ncHJvcnl6Z2VoaGRpbGZxbGZsbWdpa2xzbHB2dXRwbnZyb3Nyc3V0cXNzdXRzdXZ2dnl2dXR3bGp1dW1ydnFsbmxlckxHRUVIQ0JBQkQ9Q0I+QD05Oj0/Oj0+QEI+QEJER0pGSUZJSEZGR0VDQ0FBRkZDQkNCREVFR0dJRkxRTElPSkpMTElHSEVGRURDSUlIS0pHS1JNQk5PTVFOT09NTk9LS0tQVVdWVVRYX15caWFtaW5ocnNiZWZmZGloZm5pZm1taGtrbXJpcXZ1c3Ftdm5vcXJzd3Nyc3R1dnZ2dnd2d3Z2dHd1anN1bnV0c3FyamtzTUdIRkhCQkBERDxCQUFDPDg6PT45Pzw/QkBAQERGSEVIRkZIR0ZGRENFQ0RJRUNGRUJFR0VGR0dFSk1LSFFNSktISElFRkhIRUNJSklLTUtPU05EUVJQUVFOUE1OUE1MTVNXVlhYVlhdWl1kYGhiamlna19lZWZjZ2dna2dna21rbWxwcmh0dHVyc252b3FwcnR4cXNzdXZ1gpF5dnZ0eHV1d3htb3VvcnN1cXFpb3lNSEdISEJCQkZFPEBDQkQ8Nzo+PTo+OkBCPj8/Q0VGREZERUhGREVEREVGR0pFRUpHQ0dIRkhHRUNGSkpHTUpMS0hKTEZJSUtIRUtLTE1OT1JUT0hTVVNQU09RTU5RTk1QV1pWWllWWl1aWGFgYGBfaGVjYGRmaGdqaGhpZmhubGxubXFwaXV1eHJycHVwcHBydXZwdXN1dnV7fn14dnR3dnZ2eHBsdXBtc3RucHJyeE5JSEdJQ0FDSEU8QEVCRTw4Oj4+PTw8QUI8Pz5BQkZDRUNDSEVDRUVGR0dHSUZHS0hESUhHSUdGREhLSUdLSE1LSktMSExLTUtKTkxPTk9SVVZPS1VXU1FTUVJMT1FQT1RZWllcWllbXl5eYGNeXGFja2JgZGdocoVoZ2lmam1ucG9uc3JqdHV4cnNzdHJucHF2cnF1cnV1c355jn11dXZ2dnZ4cmh1cWtydGxxdnB0TUlLSEpGQkVHRTxAR0NEQDo8PkA/Pj9CQTxAPkFBRkNFRURJRUZFR0VISEZISElLSkZKSEhLSEZGTElISEpHTExMTExJTUtNTU1PTFBQUVVWV09LVlZVU1NRUUxPUlJRVltbXV5bXF5fX2FgYWRdZGBlZmBlaGpjc3NmamdnbHBycW9zc25zd3dxdXZ0c21vcnVvcnNwdXJ2cnSBdnV1dXd2dXd0Z3Rya3Fya3J2bnZKS0xKTEdCRURFPEBGRERDOz8/QUBAQENBP0I/QUNIQ0ZFRklGSUZGRElJR0lISkxISEpKSUxKRkpLSElKSkdLS01NSkpNTE5OTlBMT1BSVFhWTU5UVlRSUlFQTE5UU1JXW15eX11dYF9gYWFfYWNlYmRoYmRpamd2i2xraWdtb3NxcHFwcHJ5dnJ1dXRzbW1zc21xcm90dXRycHN3dHV1d3Z1dXRlcXNrcHFqcnZud0tNTEtNR0RDQUQ8P0VFRUM9QUFDQkJDREFDREFBRUdDSEdISEdKR0RHSUdISkZJTEhJSk1LTUxHS0lIS0tOUUtSUU1TTUtOTk9QUE9UT1dYWFtOU1FXXFpSV1BOVFVUVFhaX2JiX2RhXmBiXmBlYWFjaW5nYmloaG54dmxoaW1vc3JwcXJycnZ0c3Vzc3Nua3NxbXByb3R2cnFxdXZ1c3d5d3V0dWNtdGtvcGpxdG93TE5MTExHRUFARD4+REVGQ0BDQUVEREZCQ0VHQ0NJRUNJSkpJSUtHREtKR0hKSUlLSEpKTkxOTElMSEpMS1pmSmRcS2xTSE9OX25Va3NbcXBid2NTUGJ2dWh1Y2F2YFhucWJkdmluemZbbHRgbGtUX3d2aWpnaWZnbG1qbW9qbW5zcnBycnFyc3Jzc3J0cm5sdG9ucHFxdXVxcXN0dnZ1dXl3dXR0YGt0a3Bwa3FycXlMTkpKSkZDP0BCPz1ERUZEQ0RCRUVERkJGRkdERUpFRUpNTUtMTEdHTUlHSktIS0tJS0tOTE1NTExJTE1MW3NiZHBebG1VTU5mc11mZXFsbnRncGlfYVlubmJwcGJrampnb3F0ZXRublxvdWdwTUpyeXZrYmBrZWVteGxrdm1ucHNycHJxcHFycXJycnRybW1zbm5vcHJ1dHFzc3R1dXV0d3h2dXRibXVrcHBscnJxektMSUhHRURAQUJAPkNGR0JGQ0ZFRUVEQ0hIR0RFS0hHTE1OTE1NRkpOSEpLSklMSkpKS0xNTk5NTUpNTU1bcm9vbnBwbGtNUFFsV05pYnRycGFtbnVcWWxRXG1tWnFta29teHh0c2lwXV9ya3FqVXV5eHBjXmtmYmdwcGpqb3BwcnNwcXBxcXJycXFycnRsbXJtbm5vcnV0cXRydHV1dHV1enZ1dGVudWtwb2xzcnJ5SUtHSEVFRUJCQj5AQEZHQkdESUVFRUJGSUhIRUdLSkdNTU5MTU5HTE5JTEtJSk1JSklKS09QT05NS05OTFxoZHVdbHFXbE5QUW1VWmtea2x2YWxkc1NlY05tWWxcdHBraWx4and1aHBdXnJraFdiY3d8b2NgZ2dhZGl0eWtubnFzc3BxcHFwcnFwcHBydWttcW1tbW9xc3Rxc3J0dnZzd3Z6dnV0aG91bHNvbXNydHZITUdJREVEQ0FCPUJBQkZER0ZMSEVDQ0hLSEhGSkxMRk5MTFNSTEdMTUhOSklITkhKSklITk9NTkxKTk1KWnNwcG9xcW1sT1FSbllxa2dvb3Fxb210XW5YYXRfbm9wb3Fyb251c3R0altddGN3eHJqbnpoYWFjZmJiam10dXBzdXZzcXBwcW9ydHt/fn13bGtxbmxtbnByc3F0dHN1dXR4eHl4dHVrb3VtdG9udHN2c0hLSElCRUVFQUA+RERCR0RISU1JRkNGSkxJR0ZKTUxGT0pLV1JLR0tLSk5JSEpMSUtKSUhKTU1NTUlLS0tTa2JbaV5faWNyclpfWWpvX2VlVWtfY1thYVFgbWhdalxuaWlkW3BmZHBdWlxrW21xY3BzbGRnY2RnYGBrbXBwb3R5cnVxb3BxbnmFiIeHhoWAdnNua21tb25xcnR0cnR1dXZ5eHhzdW5xdW53cXJ2dHdyR0dGSURFREZBQEJGRURHQkhKTEhGREdLTElFRkpPTElQSUxbUUpFSEhLTUlISkpLS0lISUdLS0tMR0hLS0xMTExKS01OVFtcVFBUTFBPTk9PVlFPT1FOT1FKSU5QUWRxaVRZV1xbXFVZWl1YXVxcY2ZhYWViY2VfX2ZrbWhtdHlydHJvcHB0hoeGhoaFhYaHg3pwbW1sa3FzdHRydHZ0dXl4eHV2cXJ1b3ZydHN1dXNHQ0VHRkZBRUNAQ0hERkdDSUtMSEZER0tMSERHSVBLTE9LTFdMSUVFSElKSElLSUxKSEZHR0lHSElFRktJSktOTElQXFdeUFxbYF5NWFlTXFxiXk1ZWk1YYVJKWWFaUl9kXGFYW2RkVlZYXFlaWFxWWVxdYl5kYGFfZWhrZ210dHFxdHBxcoGGhoaFhoWFhYaGhoR9cmtpb3Jzc3N0d3l5eHl4d3h0cXhyeHNxcnVydE9CQ0VMTUJEQ0JFSUVHR0ZLSktIRUVKSktGRUhIUEpNTUpNU0hHRUFIRkpJS0tJTEpIRkVJRkRGR0VFSkhDSk1LTFVfWWBYYGFbYFRYWVReXlpfUllcUF5cWU5eXF5TWl5jXlpdYGNgWV9iW2BeW1RYV1leXWNiY2FjZWhla3Jwb3Bwbm53hoaFhYaCe4CFhYaGhYaFf3VxcHJyc3Z5eXp5eXh4eHdyeXZ4cnF4dnR2YVNKSk1JREJCQ0dIRUhHSEtJSUlERktLS0VGSUpOS05MSExOR0hFPkdHTElLS0pMS0lHRUlEQ0RFQkZKREBKTEpPW2NZX15hX1JUUldfYFxdWV5RWVxNVl9XS1FZW1BaX2FhXV5jYWBiYmJjY2VaUVlWVVxZXWNgX19jZGJob21ubGxsbHWFf4SDeXV8hIWFhYaGhYWGhoN9d3JydHd5eXl5f359eXV5dnZybnp3dnhYUUtGQ0dFQkVHSUZHSEhGRkpHSEdIS0lMRERLSk1NTExISkpISkY/R0ZOS0tLTUtLS0lHR0NEQERBSElCP0lKSFBdYVpbZF1fVFFSWF1cXFxfWktXXExSXFlJTV5RT1xfYWNjY2NiXGRjYmRjZlhRVVRSW1daYF9eXmFhX2Rsa21qamxudn51gXp8hIWFhYWFhYaGhYaFhoaGgnpyc3V1e4WHh4eGhYSBfnhwend2eFxSTUNASUZDRktKRkZGSEdGSUZGRklMSk5GREtKTE5KTElLSkhJRkJISVFNS0tPTUtLSUhHRUQ/RUNISEJCR0dFVF1ZXlhfWV9bXVVYWFBdXVFLSlZeWF5bXVVZYFJRX19iYmBgYmJgY2JhZGRiWE9RUVFaUltdXV1dXl9fZGhnbGpubnB7e3x+e4CCg4SFhYWFhYWEhIWDhISHh4FzcneFh4eHh4eHh4eHh4WDgHx4XFNLQ0FHRkRHTVJIQ1FKRkhISEVGS0pNUEVGSUpLTkxMSUxMSUlHREhLUU9NTVBMTUtLSElDREFFREhHQkFHRURXVUVcVV5TVl9YTlRVTlpaTUpLVGBhW19YXl5hXU5ZYlxgYF9iY2JdYWJXX19UUE5PT1dRXVtbXFxeYGJmZmVsZm9vd3x7gHt9f4CEhISEhIWFhYODhYKDgoWFhnpvgYaGhoeHiIeGhoaFhYSFg35JTkZERkZIRElSYlBDVl5JR0dIREZNS1BQRUlJS0tOTExMTUtKSkdFSk1RUU5PUE1OTE5IS0FEQUNERkRDQkVGQk1IQktMUE9OTEZNRkdJSkhHTEtNT1BJTE9QT1NPTFFTUlVaWVdZWFhkV09TVFBQTk1PVFNbWVhaXVxgYWRlY2dja2xwc3J6eX97en+EhISEhISEhIKEgH57gYOBfXuFhIaGh4eHhYWFhISEgoGAfUtJRUVHRkdES01dTEdHWExHSEpIR01MUVFJTEtMS05NVU5PS0tMR0dLUFNTTlBPTk9OT0hLRmBFRF9MRGZkRU1bSV5bcm1PTVVtWUxDUWBVa1dnSl1YVV5ETVFVTExTVlFSVFhXVFhVVFxVUGZaaGhkWFJqU1dWVFtcW2BgYWFhYmBmaGZua2hyenx9foGEhISEg4ODgX18enJ7gXp7f4KAg4SEhYWBhIWBg4N/fnp7TEhFR0ZIRUVLT1NJSkZgU0dKT0pJT01SUUtNTExPUlVST09KTE5HSE1RW1lPUFBOT1BPSUpRf1FJfFlZcXNYUG1IcW5vYVZQcXFzUENrc21xc3BTb19bblhdVlxYVWtoVV1WY1pgWVtgVlZYf2p0dXVfX3ZfWGFbXGZbX2FhYWFeYGJnbXBsYHB3dHiBgYKDg4J/fX6Adnh6bHZ+dHh+gHx+gIGChHyAg3p/gX9+d3dOSUVITU5CRExMR0lMRVFWTEtOSUtSWFdRTU9PTVFUTk9RUEtLTkdNUFNbWlRRUk9QUFBKSFp4XVR4ZWhaUlRRdmd0bHBibmZqUXJPTXdtanJwc3JxcnBvb4BdZXp1eHFxenF+c31rdX1iUmh8ZXNzb3Nye3xvfnlvf3JfYGBiYVpgYGdrbmtibGZnbXd+gYCDfnt4d4B0dnppcn5udHx+d3h7foCDeHyAdXx/fHxzc05LRmBdR0FFTU1ISktHSlBPTU1KTlZeWVVMUVNOWFpMU1NSTkxQSVFSVFlXV1BUUFBQUUtIZ3hsY3hybVtLTVV5cHVtdWJudlBkZUpmdnFtd2+AamZ4eGlXclFoem1panp6fmx4en9vaG9ZdnZqdXVwgWByZ3xpbHh8b15fX2JhW11iZGdpaWRnYmNkbGxwcHN0c3NzeXFyeGJsdWdyeXtzc3V5foFzdXpufH15d3JuTktTdE5DQkZQUEhKS0pMUU9PT01QWmBaV0tUV1BhXlJWUVlSTE9JU1RWWFdXUFVQT05SSktyb3V1cXVxZGliV25McXBeRmh5V3ZUTGl5fXhgeXtzbmFdbW9jUmhxdW5teXB3bHZ0dHJtbl10fnprbXl8a3RsfGtwdnV4Xl9fYl5dX2RkaWdoZmVeYWJpaWlqa25va3FubWpwYWNmZG93eG9tcHN5fm5xcGp7enRyb21MTFtWSEdFR1JQSUxNS0xRUVBQUFFXXFhVTVVZVWZYUlJZXlNMTklUVFZXWVdPU05OTlFIUm1IaXdLYGR2dlZYbE9ubHtzYWpnf3ZVTFdraH1sbWx4X1twenteYHpzY3JveHFoZHxpcnxeVExsYHZ1a2l1fHttfnhrfHBdXl9iW15iZGRnZWVlYlpjY2lra3JzcndnbGloZGdhYWthZ3NybGdtbXJ8a21oa3t0bW1rbU9ISktISUhIUVBMTk9NTVNSUk9TUldSVlRQV1tWVlRUVGFfUE5NS1RTU1FVVk5OTE1PUEpIUU5QVUxLS1NUU1JUUFZVUVBOUVFYWVJOUFVUWFhYW1pVUlNXW1dYV1pPU1VXWFhSXVlXXldUUFlSVldXV1hfW2dyXltbWV1dX2NaX2NjZGZkY2NiWmNjZmZlbW5tdWVlZ2NhZl9dZ2BkbGhmZ2tocHpoZ2drdWpoZ2lsUUlLS0xNS0pTUU1RUE9MVlVUUFRVWFVZVVFaXVZVVFdVWVdPT0xNVlRQTlVTTk9NTFFQS0pSUUtRTUtLT1JVUlFSU1JJSExOT1FSUVFRVFZSWFdcV1NTUFFVVVZTWlFPU1JYVlRZVlRaVVRSVVNUVVdYV11aXmFdW1paXFxgY1tdYmNkZmRkZGFZYGFjYWJoaGltY2FkXl9jXVpkXGJtYV5mZWdtc2RpaGtrZWRjZmhQSktMT09MTVNQTlNRUU1YV1VUVVdXV1pVU1xgVldWWVVYU1BQS09XU1BOVVBOUU5LU1BMT1VTTlJOTU5RVFFVUVNUVU5LTU9RVFRSUlFWV1RZWltZU1VSVFdXV1lbVE9UVVhVVVpVV1lVUlJXVlVXW1laX11VWF5cXl1bXWFhXltiYmNnZmRkYlhfYGJeYGhlZmVhXl9dXV5aWl9aX2dgXl1dYmhrYWdmaGZkYGJjYVBLTUxQUUxPVE9PU1FPUVtaWFdYWlpYWVZcamRWWFlaV1ZTU09KTlZUUE9UUFBQTk1RUVBSWFRRUU9NT1NWT1hSVFVVT05NUVNVVVRUUlRXVlpdXFpWV1FSV1hWW1tXUVRXVlZWWVRYWFVSUllXVlpdWV1fXlZeXV5gXFtfX19fWmJiZGhnZGRiWWJgYV5eZmNjYGJdXFxcXFlaW1hbYVteXVxfYl9fYmRlYmRfX2BcUE1OTlJRTVJST1NUUU9VXFtaV1tbXFlaW2RxbWhkXltZVlVXUUxNVlJNTlJPUVJPTFBTUlVaVVNQUExQWFdSV1NTU1hNT1BSVFhWVVVTVVlYW15dW1tWUk9VVlZbW1dSVFdWV1hWVFhbVFNSWlhXXF5aXl9gVWFcYWFdYGJfXWBdY2BjZ2hkZmBaY2BhX19lZF9gY1taXFtcWVpZWVdcWVxbYF5fW15eYWBeYlxZYFpRTk9OVlFQVFJPVVRTUFdcXVxYXlxeVlxeanF3eYBiXFtWVlhRTU9WU05RUVBSVFJLUVRUWVpXVU9RTlNYV1RTVVJSWk9QU1NWW1ZWV1RWWlhdXltbXlZTTlRVVlxcVlJUVlZYWVNUWVxVU1NdWFpdXlxgYGBWYVtjYl1hY19cYmFiX2NmaWRmXltkYGFgYWNkX2JfWVpeW1xbWVhZV1daWlphXF1bXVxcWl1gV1tbWlBPT09ZUFVVUlFXUlRQW11eXltgXGBVXF1panJ9c2xnXFVZV1BOUlpTUlFTUlRVVEtSVlZbWlpTT1NSVlZWVE9XUlNaUlRUVFhdV1hYU1hcWF5dWVpdVFVOVldXXltYUlVVWVlZVVdZXFVUV15ZXV1gXWJiXllfW2VhX2RkXl5jY2FeZWZpZGZeXmRhYGBhYmRgYl5YWl9bXFtYWFhYV1taXGBcW1tcW1hZW15WXlldUE9PUlpQWlRVVlZTVFReXmBfXmJcYFVdXmJreXRsfWtaVVlVUVBTXFRVVFVUVllXTFJbV11bXVJPVVNYV1dUUFhSU1dTVlVVW11YW1lVWl5YX15ZXFlSV1JZWFlfWlpUVVZaWVpXWFpcVlVaXlxeYGFfZGNcXl1dZWFhZmReXmRjYFxnZGhlZGJfZGFgYWBiYl9gXldYXlpcXFpZWVdWXVpdXlpZW1xbV1lcXVZYV11TT1FXWVFdVVZZV1dVWF9fYWFgY11gVF1fYmVldYF6aFhZWVNWU1ZcWFdXVlZXXVhPVV1aXl1dVFJXU1dWVVNUWFJTVlRYWFhdXlhdW1ZdX1hfX1hdVlFZVFlaWmFZXFZXWFtaW1lZWltYVl1fYF5jYmJlZFxiXGBmYWRmZF9gZGJiW2ZjaGVjZmFmX2BhYWFhYF9eVlVdWVtcW1lbWVldW1tbWFhZW1laWl1fXVRZXVVOVFpWU1xUVldZVlZcYGFiY2FjX19WW2BkYV96dW9oWVxaVVhUV1taWVxZWFlgV1BWXlxgYVxUVFhQVVdWVFZXUlNVV1paXF9eWl9cVl9fWV5eWV5WU1lXWVldYlpeVldbXFtcW1taW1lZX19gYGRiY2RlYmRZYmZjZmZlXmFiYGNeYmNpZGNnX2deYmJjYWFgXl9YVFtaWltbWFtYWFxbWltXV1lYV1xbXGBdVl1dU1BWWlZWWlVYVVhXWF1fYmFkYWRgXllZYWRiYGxmaF5cXVtWV1hZXFxcX1tZW2JWVFheXWFjXFJWWFBXVldXV1ZTVVRYXFxeYGBdYF1XYV5bXlxbXlhWWFhbW19gXF9YWV1cXV5eXFtdWFtgYV5gZGNkZWVmYlhjZWRoZ2ReY2BfZWNdZWlkZWlfZl5jYmNhYWBfX1tYWVpZWlpYWVhXW1taW1dYWlRZXVxaYFxVXmJOU1dZVldaWFtcWFdZXmBiYWRhZGFdXllhY2JfYWBgXlxcXFdXW1tdXV9fXFpdY1haWF1gY2RfUlhZUFdXWFlZV1ZXVl1dXmBhYF9iXllhXV1eWV1eWVhWV1tcYF5dYFpaXl1eXmFcW1taXF9iXmJkY2VmZWZiWmRmZmlnY19jXmFmZVppaWNmaWNlXmJiY2FgYF9dXVpYXFlZWFhaWFdaW1pZV1hWVVtdXV1gYGJieEtYV1xZV1xbXF1aV1xdX2BiZGFiYV1gWGJjYmFjYWJdW1xbWFdbXF9dYF9dW2BkXFxYWmJlY2FSXFpPWFhaW1taV1pZYF1gYmJgYWNfXGJdX11bXl5ZWVVYXV5fYF9gXFteXmBiY1xcWFxeYGJiY2VkZmRlZmRcZWZnaWZjYWJcY2dgXGlpYmhqZWRgYmFjYV9gX11dW1lcWVhXWFlYV1xbWldXWE9YWl1hY2Zmcmt/SllXXVpaX1xbXlxYXVteX2FjYmFhXWJbYmRiYGJiYlxbW1pXWGlxYFxgX11cYWNfXllZY2VkYVNfWlJZWFxdXVtaW1tjYGJiY2BiZGFgY15gXF1eX1pYVltfXl1hYWBeW2BhYmViX11UXWBgY2RkZmVnZWZmZV5lZmhoZ2RkYFtlZ15haGhiaGhmY2BiYGNiX19fXV1cWltZWFhYVlpWXFpaVlZVTVhXXGdpa2h1eIF2dnZ2dnZ2dnZ2dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6e3p6ent7e3t7e3t7e3t7e3t7e3x7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHt7e3t8fHx8fHx8fHx8e3t7fHx8fHx7e3t7e3t7fYmIhoqHhYKBgoOCg4OCgoKCgoKCgoKCgoGAgYCBgICAgYCBgYGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t6e3t7e3t7fHx8fHx8fHx8fHx7e3t7e3t7e3t7e3x7e3t7e3t7fHx8fHt7e3t7e3t8iYmHiYaFgoGCgoGCgoKCgYKCgoKCgoKBgYGAgICAgICAgIGBgYB9fHx8e3x8fHx8fHx8fHx8dnV1dXV1dXV2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eHh5eXl5eXl5eXl5eXt7e3t7e3t7e3t7e3t7e3x8fHx8fHt7e3t7e3t8fHx8fHx8fHx8fHx7e3t7e3t7fHx8e3t7e3t7e3t7fHx8fHx7fHt7e3uHiYiJhYSDgYKCgoODgoKCgoKCgoKCgYGBgICAgICAgICAgYKBgH58fHx8fHx8fHx8fHx8fHx2dXR1dXV1dHV2d3d3d3d3d3d3d3d3d3h4eHh4eHh4eHh4eHh4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3x8fHx8fHx9fX19fXx8fHt7e3t7fHx8fHx8fHx8fHx8fHx8fHx8e3x8fHx8e3t7e3t7e3x8fHx8fHt7e3t7e4aJiYiFhYOBgoKCgoOCgYKCgoKCgoKBgYGAgICAgICAgIGBgYCAfnx8fHx8fHx8fHx9fX18fHjF1NLS0tLUk3t9fX19fYSMi4uLi454KSkqKiopKz0/Pj4+Pj5tgH5+f397pdfT09PT1r2GiYmJiYqCRT4/Pz8/QDAqKysrKiVikoyMjY2OiX5/f39/f359fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx8fHx8fHt7e3t7hIuHh4aHgoGDg4GCgoKCgoKCgoKCgoGBgYCAgICAgICAgYCBgIB+fHx8fHx8fHx9fXx8fH19eNXn5OTk5OeZe39/f39+hpCPj4+Pk3kZGhoaGhocMTMzMzMzMmqCf4CAgHut6eTk5OToyomMjIyMjYM6MjMzMzM0IRobGxsbFF2Wj4+QkJCLf39/f39/f319fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e3uCjYeIh4eDgoSCgYKCgoKCgoOCgoKCgYGBgICAgICAgICAgICAgH58fHx8fHx8fXx8fH19fX12fn9/f39/f3l3d3d3d3d4eXl5enl7eG5vb29wcHBycnJycnJyd3p5eXp6en6Dg4ODg4SBfHx8fHx8fHZ1dXV1dXV0c3Nzc3NzeX19fX19fX18fX19fX19fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e4CMhomHh4SDhIKCgoKDgYKCg4KCgoGBgYGBgYCAf4CAgICAgICAfnx8fHx8fHx8fX19fX19fXZ0dHR0dHd0dnd6e3h7eHd2d3p4e3p5fXl4eHl4eHh5eXl5enp5eXl5enp6eXh4eXl5eXl7e3t7e3t7fHx8fHx8fHx9fX19fX18e3t7e3t8fHx8fHx9fX19fX19fX18fH19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8f4uHi4qIhIODgoKCg4KBgoKDgoKCgYGBgYGAgIGAf4CAgH+AgYF+fX18fHx8fHx9fX19fX19d3d3dnZ3fXh3d316eH14d3d4fXp9ent9e3d3d3d3eHh4eHh5eXl5eXp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fHx8fHx8fHx7e3x8fHx8fHx8fHx+iomMjImFg4SEgoKDgoGCgoKCgoKBgYGBgYCAgICAgICAf4CAgH19fXx8fH19fX19fX19fX13d3d3d3p9eHt4fHx3e3h3d3d8en18fX58d3h4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fX19fXx9fX19fX19fX19fX19fHx8fHx8fHt7fHx8fHx8fHx8fH2Kio2NioWDg4SCgoKCgYGCgoKBgoGBgYKBgIGBgICAgIB/gIGAfXx9fX18fX19fX19fX19fXd3d3d3fX55d3d4e3p7eHd3d3x6ent9fnx4eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt8fHx8fHx8fHx8fHx8fH19fX18fH18fH18fHx8fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8foqJjo2JhISEg4KCgoKBgYKBgoKCgYGBgoGAgYKAgICAgH+BgIB8fH19fX18fX19fX19fn5+d3d3d3d5fHl7eHx9eXt5enp4e3l8fXx+e3h4eHh4eHh4eXl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt7fHx7fHx8fHx8fHx8fXx8fX19fX19fXx8fHx8fHx8fXx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx/iIeNioeFhoaDg4ODgoGBgoGCgoGBgYGCgYCAgoF/gICAf4CAgHx8fX19fX19fX19fX5+fn53d3d3d3Z4eHl3eXp4enh5eXh5eHp7eXx4eHh5eXh4eHh5eXl5enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX18fH18fH19fX19fH19fX19fHx8fHx8fHx8fHx8fX+HiIyIhoeHhIKDhISCgYKBgYKCgoGBgYKBgIGBgYGAgIB/gIGAfHx9fX19fX19fX1+fn5+fnd3d3d3d3d3d3d3eHh4eHh4eHh4eHl5eHl5eXl5eXl5eXl6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fHx8fX19fHx8gIeIi4eHiYaDg4SDg4KBgYGCgoGBgYKCgYGBgIGBgYCAgICBgX97fH19fX19fX19fn5+fn5+d3d3d3d3d3d4eHd4dnl5eHh4eHh5eXl5eXl5eXl5eXl5enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fH19fXx9fXyBhoqKiYmIhIOFhISCgoGBgYGCgYGCgoGBgYCAgYGAgIGAgIGBf3x8fX19fX1+fn5+fn5+f394eHd4eHh4eHZxZGpeam15eXl4eHl5eXl5eXl5enp6enp6enp6enp7e3t8e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIGFiYqJioeEhYWEg4KCgYGBgoKBgYKBgYGBgYCBgYCAgYCBgIF+fH1+fn5+fn5+fn5+fn9/f3h4eHh4eHh5bWRiZV9fXm95eXl5eXl5eXl5eXp6enp6enp6enp6e3t7e3t7fHx8fHx8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goWKiomJhISGhYSDg4KBgYKCgoGBgoGBgYKBgIGBgICAgICBgH58fX5+fn5+fn5+fn9/f39/eHh4eHh4eW5kZWdlZGJeZnh5eXl5enp6enp6enp6enp6enp6e3t7e3t7e3x8fHx8fHt8fHt7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChouJiIqEhYaEg4OEgoGBgYGCgYKCgYGBgYCAgYGBgIB/gIGBf3x8fn5+fn5+fn9/f39/f394eHh4eHl3Z2VkZWZkZWFfaXl6enp6enp6enp6enp6ent7e3t7e3t7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHt8fHx8fHx8fHx9fX19fX19fX19fX19fXx9fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4eJh4SEhoSDg4WBgYGBgYKCgYGBgYKBgICAgYGAgYCAgYF+fHx/f35/f39/f39/f39/gHl5eXl5eWtlYWJlZWFlZV5ieHdze3p6enp6enp6enp6e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fH18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19g4aLhoiFhYaEgoOEhIKBgYGBgoKBgYKBgYGAgYGBgYGAgIGBgn98fH9/f39/f39/f3+AgICAeXl5eXl0Y2NlZGNmY2doZGZsZF5ze3p6enp6enp6enp6ent7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn6DhouGhoaGhYODg4SDgYGBgYGCgoGBgYKBgYCAgYGBgYCAgYGBfnx8f39/f39/gICAgICAgIB5eXl6d2RhY2diYmRdW2VfYV1eYGFoeHp6enp6enp6enp6e3t7e3t7fHx8e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+foSFi4eGhoaGhIODg4KBgYGBgoKCgYKBgoGAgIGBgYGAgYGBgYF+fX1/gH+AgICAgICAgICAgHl5eW9vYmJiZF5jZ19dYWFgXF9kYlttfHp6enp6enp6enp7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7fHx7e3x7fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5/hIiLhoSHhoaEhIODgoGBgYGCgYGBgYKCgYCAgYGBgYGBgYGBgX5+fYCAgICAgICAgICAgICBeXpwXWJlZGJkXmZnZ2BZYmJhY2VfXF1ze3t6enp7e3t7e3t8fHx8fHx8fHt7e3t7e3t7e3t7e3t7fHx8fHx8e3x8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fn19fn5+fn5+fn5+fn5+foCFjIqEhYaGhYODg4SCgYGBgYKBgYGBgoKCgYCBgYGCgICAgIGBf35+gICAgICAgICAgIGBgYF5emxiZGdjYmdmYWBgZGFiZWRjZGNeXGJ1fHt7e3t7e3t7e3x8fHx7e3x8fHx7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/gYeMiYWGhoeFg4SDgoGBgYGBgYKBgoKCg4KBgIGBgYKBgYGCgoF/f36AgICAgICAgIGBgYGBgXp7dGdnZmZkZGZmYF5fYWNlaGRlXmJkYHR8e3t7e3t7fHx8fHx8fHx8fHt7fHt8fHt7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f3+CiYqIhoaIhoWDhIOCgYGBgYGBgoGBgoKCgoGAgYGBgoKBgYKCgX9/f4GBgYGAgYGBgYGBgYGBenptaGNjZ2ZnZWdmZmdiZWRlYmdbYmVgdnx8e3t8fHx8fHx8fHx8e3t8fHx8e3x8fHt7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f39/f4SJioiGiYeFhYSEg4KBgYGBgYGCgYKCgYGBgYGBgYKBgoGBgICBgH9/gYGBgYGBgYGBgYGBgYF7emlpZGNqZmFgZmVjY2NnaWRjYmBiZGJ0fXx8fHx8fHt8fHx8fHx8e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f39+fn9/f39/f39/f3+AhIqMiIeJhoSFhYOCgYGBgYGBgYKBgoGBgYGBgYGBgoKBgYGBgYGAgH+BgYGBgYGBgYGBgYGBgXZzZWRnY2RmZWJlZmdkZmhmZWNgYGNkYHF9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fXx8fX18fHx9fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/fn5+f35+f39/f39/f3+AgICFioyJiIqJhoaDgoKCgYGBgYGBgoGBgoGBgYGBgIGBgYGBgYGCgX+Af35/foCCgoKCgoKCgoKCc3NnZWRkZWlqaGZnZ2NhZmZlZmdmZWVjdX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fH19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gICAgICAgIWLioqJioeHhoSCgoGBgYGBgYKCgYKBgYGBgIGBgoKBgYGBgYGAf4B+dHRzdX1/goCAfn5/gYB0cmdkZWNmaWppZWNlY2BmZGRnZ2JiZWFwfXx8fHx8fHx8fHx8fHx8fHx9fX18fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f39/f39/f4CAgICAgIB/houLiouLh4eHhIOCgYGBgYGBgYKBgoKBgYGBgYKCgYCBgYGBgoCAgH5zc3NzdHV4dXV0dHV2dXVwZmNmZWhoaWdoZ2VmZWJfZGVmY2BiZ3d8fHx8fX19fX18fHx8fH19fX19fX19fXx9fXx8fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gIB/f3+AgICAgICAgICHjIyIi4qHh4eEhIKBgYGBgYGBgoGCgoGBgICBgoGBgYKBgoKCgYCAfnNzc3Nzc3NzdHR0dHNzdW9jY2FnZWhoZ2pmZGVnZmhmY2JlYl5ieX18e3t8fX19fX18fHx9fX19fX19e3x9fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn9/fn5+fn5+fn5/f39/f4CAgH9/gICBgICAgICAgYCAf4CAgYGAgIeLi4iNiYiJhoSFgYGBgYGBgYKCgYKCgYGBgIGCgoGBgYKBgoKBgIB+dHNzc3Nzc3Nzc3Nzc3N1cmdlZWRlamhoZ2ZpaGdjZWViZGNoZGd7eHVzc3R2dnl4dnR0dHZ3d3d2dHR0dXV4d3h4d3d6e3x9fXx9fn5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f35/f39/gH9+fHt7fX58eXl2dnZ5fHx6end2d3l7fXt4hIyMioyHh4iEhYSBgYGBgYGBgoGBgoGBgYGAgYKCgYGBgoGBgoGAgH51c3Nzc3Nzc3Nzc3Nzc3VzaGVnaGVrbGhqZ2lqZ2dnZmRkYmVkbnV0dHNzdHNzc3Nzc3Nzc3Nzc3NzdHNzc3Nzc3Nzc3N0dHV1c3V3eHl7fn59fn98f39/f39/f39/f314fH5+fXx4dXZ3eXd4dnRzc3N0dXRzc3Nzc3NzdHNzc3R0c3R0dHODjI2KiYeIhoOGg4GBgYGBgYGBgYGCgYGAgYGDgoKBgYCBgYGBgICAf3VzdHRzc3Nzc3Nyc3NzdnZpY2hqaGpsZWZpbGhgZmVkY2BkZGZ0dXV1dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHRzdHRzc3Nzc3R2dnV1d3V4fH9+fX9+fHp4dXN0dXV1dHNzc3Nzc3N0dHR0dHR0dHR1dXR0dHV1dHR1dXR1dXV1dIaMjYuIhoeEhIWCgYGBgYGBgYGCgoGAgYCBgYKCgoGBgIGBgYGAgIB/dnNzc3Nzc3Nzc3Nzc3N2dnNnZ2pmaGdmaGhmZGlnY2NnZWVmcHZ1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dHR1dHR0dHR0dHRzdHR0dnV1d3Z0c3R0dHR0dHR0dXV1dXV0dXV1dXV1dXV0dHNzc3N0dHNzdHR0dHR1dXR1iY6MjIqHh4SEhYKBgYGBgYGBgYKCgoGBgICAgoKCgoGBgYGBgYCAgH93c3Nzc3NycnJyc3NzcnZ2dW5kXWNnZWlraGVoZ2dqamlnZXB2dXV1dXV0dHRzdHR0dHR0dHV1dXV1dXV0dHV1dHR1dXV1dXV1dXV1dXR0dHV1dXV1dXV0dHV0dHV1dXV1dXV1dXV1dXV1dXV1dXV0dHNzc3Nzc3N0dHNzc3Nzc3R0dHR0dHWKjoyMiYaGhIeFgoGBgYGBgYGBgoKBgYGAgYGCgYKBgYGBgYKBgYCAf3hzc3Nzc3JycnJyc3NzdnZ3d2liaGhnamtpaGZkZGVmaWhwdXR0dHRzc3JxcnJ0dXV0dHR0dHR0c3NycXFxcXNzdHR0dHR0dHR0dHV0cnJyc3R0dHR0dXV1dXV1dXR0dXR0dHR0dHR0dHR0dHR0c3Nzc3Nzc3Nzc3Nzc3N0dHN0dHR0dHR0dYuOjImGhYWFh4SCgYGBgYGBgYGBgoKCgYGAgIKCgoGBgYGBgYGBgIB/eXNzc3NycXJycnJzc3N3d3d3bGpoZGhpa3Z6a2VmZWhnbXJzdHN0c3JwcHBxcnN1dXR0c3Nzc3JycXBvb29vcHFzc3NycnJyc3R0dHNxcHFyc3R0dHR0dHRzc3Rzc3NzdHR0dHRzdHR0dHR0dHRzdHR0c3NycnFxcnJzc3Nyc3NzdHR0dHN2jZCMh4eFhYSEgoGCgoGBgYGBgYGCgoKBgYGAgYGCgoGBgoKBgYGAf395c3NycnFxcnJycnNzc3d3d3dzc2pnaWloeX99cW51bG5wcXJycnFxcG9wcXFxc3Rzc3RycXFwcG9ubm1ubW5ubnBxcnJycnJycnJzcXBvb3BxcnJzc3JxcnJycnJycnJycnJzc3Jzc3Nzc3Nzc3Nzc3Jxb29ubm9vcXJzc3Jyc3NycnNzcnaPj4uHhoWFhYOCgoKBgYGBgYGBgYGBgoGBgYGCgoKBgoGCgYGCgX9/f3hxcHBwcXFycnJyc3Nzd3d2dnd2cnF0c252f352c3hwcHBycnJycXFwcHFxcXJzc3Nzc3JwcXNwb25ubm5ub25vcHBxcXFxcXBwcXJwb25vcHFxcXFxcHBxcXFxcXJycnJycnJycnFxcnFxcnJycnFwb29ubm1ubW5vcXJycnJycnJyc3JxeI+OjYaDg4aEgoOCgoGCgYGBgYKBgYGCgYGBgYKCgoKCgoKBgYKBf4B/d29wb3BxcnJyc3Nzc3J2dnZ2dnZ3dnZ1c3l/fnd3d29wcXFxcXFxcHBwcXJycnNxdHNycW+GhG5wb29vb29vb29wb3Bvb29vcHBxb29vcHBwcHBvcG9wcHFycXFxcnJycnFxcXFxcXFxcHBwcHBxb29ubm5tbW5tbm9wcXFxcXFxcXFxcXB7j42NhoODhYOCgoKCgYKBgYGBgoGCgYGCgoGCg4KBg4KBgYGAgYF/f392bm9wcHBxcXFxcXBwcHZ2dnZ2dXR0c3NxfYB9fX9zb3BxcXFwcHBwcXFwcXFxeINxcnJwd51/bnBwb29wcG9vb29vb29vb3BxcXBub3Bwb29wb29wcnJycnFxcXBxcnFwcXFxcHBwcHBwcHBwb29ubm1ubm5ubm9ub3BwcHFxcXFxcXFxcIKRjoqEhIOFhIOCgoGBgoKBgYKBgYGBgYGCgoKCgoKCgYGBgYCBgX9/gHVvb29wcXFxcXBwcHBwdnZ2dXRzcnJycnGAgoCBeXBwcHBvcHBwcHFxcXFxcXF2oYhwcnCPoX1vcHBwb3BxcHBvb29wb29vcXFwcG9wcG9vb25vcHFxcHBwb3Bvb3BwcHBwcHBwcHBvb29vb29vbm5tbW1ubm5ub25vb3BvcHBwcHBwcHBwiZCMiISDhIaDg4KCgYGCgoKCgYGBgYCAgYGBgoKBgYGBgYGBgIGBgH+AdG5vb3BxcXFwcG9vcG92dnVzcnFxcXFxcICDg39ycHBwcHBwcHBwcHFxcHBxcm+Vqn9wd6ChfW9wcHFwcHBwcHBwcHBvcHBxcXBwcHFxb29vbm9wcHBvb29vcHBvb3BwcHBwcHBwcHBvb29vbm5ubm5ubW5ubm1ubm9wcG9vb29vb3BzcXWPj4uJg4KFh4ODgoKBgoGCgoKBgYKBgYGBgYGBgYGBgYCAgYGAgYGAf4B0b29vbm9vb29vb29vb3Z1dHNxcXFxcXJygIKCgXRxcXFxcXFxcXFxcXFxcXFycI+xnnCBpaF9cHFxcXFwcHBwcHFxcXBxcHBwcXBwcHBwcHBwcHBwcHBwcHFxcXBxcHBwcHFwcHFxcHFxcXFxcXJxcnFwcnRycnR0dHR1dnRzdHR0dXd3gpCPi4iDgoaHhISCg4GBgYKCgoGBgoGBgYKBgYGBgYGAgICBgYCBgYB/gHVvb29vb29vb25vb29vdXRzcnJycnJycnKDg4OCdnFycnFxcXJxcnJxcXJycnJwjLaqkZuypnpxcXFycXFxcXFxcXFxcXFwcXFxcXFxcnNzcnJyc3V1dHR0dHR0dHV2d3d3d3d3eHh4eHd3eHh4d3Z3dnV2dnZ2d3h6e3x7e3t6enp6enyGkI2LiIODiIeHhYODgoGCgYKBgYGBgYKCgoGBgYGAgYCAgYGAgIGBgH+Ad3FxcXFxcG5ucG9wcG92dHV1c3Nzc3NzdYiDgoN5cnNzcnJyc3Jyc3Nzc3Nzc3Wgp6OzqKaleHRzc3Nyc3N0dHV1dXV1dHV3eHd3d3d4eHh3eHh4eXl5eXl4eHl5eXp6e3t7e3t6enp5eXh3d3d1dnV2dnd5enp7fn5+fX1+fn5/f35+gIyQi4qHg4WIi4iEg4SDgYGCgYGBgoGBgoKCgoKAgYGBgYCBgYGAgIGAf4B8enp5eXx5eHh2dXZ2dHl2d3h3d3Z3dnZ6fnx+fnx2dnd3dnV4enh4eHh4d3h4gqifo7Gjm6SPenl6eXh4eXl6enl5eXh4enp5eXh4eHh3dnd3eHh3eHh5eXp7e3p8fH1+fX9/f359e3t7e3p5enl5e3t/foB/fn5/fn19fX5+f35+fn6AjpCNioeEhoqLiIaGhIOBgoKBgYGCgYGCgoKCgoCBgoKBgYGCgYCBgIF/f4B/fn19fX9/f318e3t7eXh4eHh5eXl4eXh5eXl4enp6enp6e3t7fH1+fXx7fHyPo5GTpZygoZZ7e3l4eXh4ent6enp5eXp8fHt6enx8fHp6ent9fHx+fn+AgoGAgYKAgH9/gYGBgIB/f35+fn5/fX1+f4CAf35+f39+fn9/f39/gH+Af4OQjoyHhoWIi4yIh4aFg4GCgYGBgYKBgoKCgoKBgYKDgoGBgYGBgIGBgIB/goOCgoGBgX99f39/f4F6enh4d3h4eHh5eHh5enp5e358enx9fXt8fX19fX19fY6gmJaZnJaQmYJ/f319fYCDgoCAf318fXx9fXt9fXx8fH19fX1+gYGChISDgoB/gYGBgH9/f4B/f39/f39+fn9/f39/f35+f3+Af39/gICAf4CAgICAhJCPi4eGhoiLi4mKhYaDgoKCgYGBgoGCgYKBgYGBgoOCgYCAgYGAgIGBgH+ChIKCgICAgH9+fn+AgH9/fn18fX19fYB/fX+Af35/gH9/fn9/gICBgICBgIGAj7GqpZ+hn6Ghg36BgH5/f39+f4B/fn5+f39/gYB/f4CBgYCAgYOEgoGCgoGCgH+AgYCBgYGAgH+BgICAf39/gICAgYGBgIGBgYCAgICBgoGBgYCAgYGFjo6MiYaHiYyLi4qGhoOCgoKBgYGCgoOCgoKBgIGBgYKCgICBgYCAgYGAf4KFg4KBgYCAf39+fn+AfX5+fn19fX5/fn9/f35+fn+AgYCAgICAfn9/f4CBgIOkrqGnoaCgqKyehX59foB/fn5/f35/gIGBgoKDg4KCg4KBgYKDg4OCgYGBgYKBgoKCgYKBgoGBgYGBgoKCgYGCgYKCgoGBgoKBgYKCgoKCgYGBgoKCgoaPkY+KiImKjY6MiYaFgoKCgoKBgYKCg4KCgoGBgYGBgYF/gIGBgYCBgIF/gYWEg4KCgoGCgYCAgIB8fHx7fH18fH9+fn9+fn5+f35+f39/f39/gH5/gIWPp7GknKehoKCio6upnIyCgIB/gIF/f39/f3+BgYGCgoCAgYKDg4SDg4ODgoKCgoKCgoKCgoKCgoGCgoKDg4OCg4ODgoKCgYKCgoODg4ODgoKCgoODg4KCh5KTkIuKi4uPj42Lh4SCgoKCgYGBgoKDgoKBgYGBgIGBgICAgYGBgIGAgYCAg4SDg4OEg4ODgoKCgXx9fHx9gn1+f4GCiIGCgoSCgYGDg4GBgYKDgoaLm6mqo52aop2foaCen6KloZWGgYCAgICAgH9/f3+AgICAgH9/gYODhYSEg4SDgoKCg4OCgoOCgoODg4ODg4SDg4KEhYWDg4SEgoKDhIOCg4ODg4OCgoODgoCKlJOPioqMjpGPjYuGg4KCgoKBgYGBgoOCgYGBgIGBgoGBgICBgYGAgYCAgH+BgoODg4SEhIOCgoKCfXx8fn6AgYOAg4OChIaFhoaFhIWFg4ODg4OChIeQmJiWl5mcjJSfnZucmpSMiISDg4KDg4ODgoGAgIKCgYOCgYKCg4OEhYWEg4OChISEhIOEhISDg4OEg4ODg4OEg4SDhIWEhISDg4ODgoKCgoKCgoKBgYKCgo+UlI+Njo6RkY6KiISCgoKCgYGBgYGCg4GBgIGBgYGBgYCBgIGBgYCBgICAgIKChIKChIOCg4ODgoJ9fX2AgH+AgoGDg4ODhIaEhIOEhYWDg4GBg4OCgYGEho6Wl5WHj5qclo6Jh4aHh4eGhoeHhoaEgoGCg4SDg4ODg4ODhISFhYWDhYSFhISEg4KBg4OCg4SEg4KCg4SCg4ODg4OCgoKCgoKCg4OEhIOFhYWFhoaIk5OTkI+PkJKRjIqIgoKCgoKBgYGBgYKDgoKBgIGBgYGBgICAgYGBgICAgICAhISEgoKCgoGBgoKBgX+AgYOCgICAf4CCgoGDg4KCgYODg4SDg4GDhYSCgYKBgYiSl46UmpOGh4eIiIiHh4eIiIiFhIOBgIGBgoKCg4GCg4SEhYSDg4OEg4OEhIOBgYGCg4OEhISDg4ODg4OEhIODgoSDg4ODhIWFhoeHh4eIiIiJiY6TkpKOj46Rko+LiYeCgoKCgoKBgYGBgoKCgoGBgIGBgYGAgICAgYGAgIGAgICDg4KCgYKCgYGAf4CBhYWFhoOCgYB+fn+BgoSCgYKDhIOCg4ODg4KChISDhISCgoKHkpaKhISDg4WFhYOEhIWFg4KBgH9/gIB/gIGEg4OEhYWEgoKCgoOCg4OFhIKDhISEhYaGhoaGhoWFhoeHhYaIh4aHiIeGhoaIiYeGhYaGhoeIkZKSkI6QjpGRjImHhYGBgoKCgoGBgYGBgoOBgYGBgYGBgICAgICBgYCAgICAgISEg4KBgoGAgYGAgYKIh4aHhYSCgH99fX6AgH+AgYGBgYGBgoGAgYKDgYKCgoKCgoGIkYKDg4GCgICAf4GAgICAgH9+gIGBgYKCg4OEg4OEg4OCgoGBgoODg4SEg4SEhIOFhYaFh4eIh4eHh4eHh4eGhoaGh4WFhYaGhISEhIWEhYaSk5GOjo+OkI6JiIeEgoKCgoKCgoGBgIGCgoKCgoKCgYGBgYGAgYGBgICAgYGAgoSDg4KDgoGCgYKDg4iHh4iHhYSCgX5+gICAfn5/f4CBgYGCgoCBhI2DgH+AgICAgIiRgIGCg4OAf39/gICAgICAgICDg4KDg4ODgoOBgYKCgoOCgYKCgoOCgoSDhISDg4SEhYWFhYaGhoaFhISEhYWEhIWFhYSEhISDhISEhISEipSTkpCQj46NiIaFhIOBgYKCgoKCgYGAgYKCgoKBgoKBgYCBgYCBgYGAgICAgYGAg4OCgoOCgoKBgoOCiImJiYiHhYSDgYKEhIOBgoKCg4SCgoSEgoOJloiEgoSCgn+AjJaCgoGChIOBgYGCgoODgoGDg4SDg4SEg4OCg4KDg4ODg4KCgoKCgoGDhISEhYSFhYWFhIWEhIWFhYWDg4OEhISEhYWFhISEhISEg4ODg4OOlZKQkZGPjYyHhYODg4GBgoKCgoKBgYCBgoOCgYCCgYGBgICAgIGBgYCAgICBgICDhYSEhIODg4SDhIOGh4mIhoWDhIODg4WDgYCDgoWFhISDg4OChI6YioOFhISEgoCSmoaCgoKEg4OCg4GBhIWEg4ODgoKDhISDg4ODg4SFhISDg4KCgoKCgoSEhYSFhYWFhYODhYWFhYaFhoWEhIWEhYWGhYWFhIWEhISDhIODhJGUk5KTj4yMioWEg4ODgYGCg4KCgoKBgYGCg4KBgYKBgYGBgICBgIGBgH+AgIGAgYaGhoaGhoaHh4aGhYSDhYaCgIGBgYGHgoB+f4GBj4yDgX9+fXx9i5yNgIKBgYKChpSTjIGCgYKDg4GBgYKDhYODg4KDg4OEgoKEhIOEhIWEg4OCgoKCgYKCg4ODg4SFhYWFhIOEhYWGhYWEhISEhIOEhIWFhYWFhIODhIOEg4KGlJSSlJKPjYyIg4SEg4KBgoODgoKDg4GBgoKBgoKCgYGCgYGBgYCAgYGAgICAgICAhYWFhYaGh4aGhoWGg4ODg4GAgoKCgYKAf35/f4GVl4mAfX19fXuBl4uAg4GBgYCPk4yQgYKBgoKBgYKDgoODgoOCgoKCg4OBg4SDg4ODg4OEhIKCgoKDgoKDg4ODhIWEhISEg4OEhIODg4OEhIODg4ODg4SDg4ODg4KDg4KDgouUk5KTko2NioaDhIOEgYGCg4ODg4ODgoGBgoGCgoKCgoKBgYGBgICBgYCAf4CAgICDhISFhYSFhYWEhIWCg4KDgoKDg4OBgICAgICAgJWfin5+gH2Hin2EhYOEgoODgo6JhYyCgoOCgoKCg4ODgoODg4KCgoODgoKDg4KCg4KDg4WEg4ODg4SDg4SEhISEhYWEhIWEg4SEg4OEhISEhISEg4SEhYSDg4SEhIODgoKDkJSTkpKPi4yIhoSFg4OBgYKDg4ODg4OCgYGCgoKCgoKDgoCBgoGAgICAgIB/gICAgISDhYWEhYWFhYSFhYOEhIWDg4SEhIKCgoOCgoSBkaGKf4yFfYaJgH6FhYWEhYJ/fn19f4KEg4ODg4OEg4ODhISEg4OEhISEg4SEhIOEg4OFhoWFhYSFhYWFhYSFhoWGhoWFhYWFhYWFhYWGhoWGhoaFhoaGh4aFhYWFg4SEhIeTk5OSkoyLiIWGhYWCgoGBgoODg4OCg4KBgYKDg4ODgoKBgIGAgICAgICAgH+AgICAhYWFhYWGh4eGhYWFhISFhYSEhISEg4ODg4OEhYOKkYOEi4WCgYF+fYGHhoOAfn5/fn9+f4OEg4OEhISEhISEhISEhISFhYWEhYSGhYWGhYaGhoWGhYWGhYWHhoaGhoaFhIWFhYWFhIWGhoaHhoaGhoaHh4iIiIaFhYaEhYWGjZSTkpGQi4qHhoeGhIGCgYKDg4ODg4KDgoGBgoODg4KAgYGBgICAgICAgICAf4CAgICHh4eGhoeHiIeHhoaEg4ODhIODg4OEg4ODg4OEhISEgYKCgYmBf359foWCf39/f39/f36AgISFhIWGhoaFhYWFhoeHhoaFhoWFhoeHh4iHh4eGhoaHhoeGhoeHh4aGhYSDhIWFhoSFhYaGhoeHhoaGhoeHh4eIiIeGh4aHh4eRlJORkZCLiYiFhoSDgoKBgoODg4ODgoKDgoKCgoOCgYCBgICBgICAgIGAgIB/gICAf4aHiIeHh4eIiYmIiIODgoKDgoSEhIWEg4KCg4OEhIOBgICAhIR/fn5/gH9/f39/gIB/f4B/f4WFhoiIiIeHh4eIh4iHiIiIhoaHiImJiYmIh4aHh4eJiIeHh4eHhoeFhIOEhYaFhYWFhoaGh4eFhoeGh4aGh4eHh4eHh4eFh5OTkY+RkIuHhoWGg4KCgYGCg4ODg4ODgoKCgoGCg4KCgIGBgYCAgICAgICAf3+AgYB/hoiIiIiHh4iJiYmIg4KCg4ODhIWHh4aFg4OFhISDg4GAgIGMiYGAgYKCgYGBgYB/gH9/fnt6gIaHiIqKiYmJiImJiYmKi4qIiIiJiYqLioqIiIeIiIiHiIiIh4iGh4aEg4OFh4eHhoWFhISDhYWEhYWGhISEhYWFhoaGhYOJlJOQj5COioaEhoWDgYGCgoKDg4ODgoKCgoKCgoKCgYGBgYGBgYCAgICAgIB/gICBgH+GiYiIiYeIiImJiIiEgoKDg4KDhImKh4aEhIWEg4OCgICBhISCgoKCgoKCgH9+fX19fX59fHt8g4eJi4uKioqIiIqJiImLiomJiImIioqJi4mHhoaHh4WGiIiJiIaGh4SDgoSIiIiIh4WCgoGDg4KDg4SCgoKDgoGEg4SEgY6TkpCPj4uIhYSGhIKBgYGBgoODg4OCgoKCgoKCgoGBgYGBgIGAgICAgICAgH+AgIGAf4WIh4eHhoeIiIiHh4SCg4OCg4OFiYqJh4WHhYSFhYKAgYOEgoOCgoKDgX59fn5+fn5+fn1+fX19g4eJioqHh4WGh4eHh4iHiImHiIaIh4aJiYODhIOFhISFhYeIiIaFg4KCg4WHhoeGhoSCgoOEgoOEhIKBgoGBgYODhIOEkZKQjo+Oi4eFhoaEgoGAgYGDg4ODg4KCgoKCgoKCgYGBgIGBgYCAgIB/gIGAf39/gIB/hYaGhYaGhoeHiIeGgYKEhIOChYeIi4qGhIaEgoaGgoKEhIODg4OCgoF9fH1/gH9+fn59fH19fHl8g4aHh4SDgYODhIWFhYODhYSEhISEhIWEgoKCgoSEgYKDg4WGhYSCgYGCgoODhYSEhIWEhIaEg4SFg4KDgYKDg4SFhIeSkY+Nj4yJhoSFhIWCgYCBgYODg4ODgoKCgoKCgoKBgYGBgYGAgICAf4CAgYB/gICAgICDhIWEhIWFh4eHh4aAgYGFg4OEhYSHiIWCgIB/gX9/gYODg4ODgoJ/fX1/gICBf31+fn18fX17enp+hISEgoGBgIGBgoKBf36BgYGCgYOBgoGCgoKBg4OAf4CAgoOCgICAgICBgYGDgYGChIODhYSCg4SDgoKBgoSDhYWGi5ORj4+Pi4iFhYODhIGBgYGBgoODg4KCgoKCgoKCgoGBgYCBgYCBgH9/gIGBgICAgH+AgIKCg4OChIOEhYWGhn+BfoCBgICAgIGDgn9+fn5+fX+Cg4OCg4KDgn19fn+AgIGAfn19fX1+fXx6enqAgoKBf39/f35/f4B+fYB/f4CAgX+AgIF/f4CBgX59fX+AgX9/foCAgH+AgICAf4CCgICCgYGCgYGAgYGBgYKEg4aPkpCOj42Kh4eGg4ODgYGBgYGCg4ODgoKCgoKCgoOCgYGCgYGBgICAgH+AgICAgICAf39/gYKDhIGCgoOCg4SFgIB/fH19fn19foCAf31/fn1+gYODg4KCgYF/fX1+f4CAgH9+fX19fHt7e3p6enqAgH9/gH9+fn1+f35/gH9+f3+Af4CAf35+fn9/fn18fn+Af35+f3+Af39/f4B/f4B/f4CBf4B+f39/gH9+f4B/hZKSj46Pi4uHiYWEg4KCgYGBgYKDg4ODg4OCgoKDg4KAgYKBgYGAgICAf3+AgIB/gIF/f36BgYSEgYKBg4OCg4OBgH98fn9/fX6Af4B/foF/f4CBhIOCgYB/f359fn5/gICAfn19fXx7e3x6enl5eXuAgH+AgH9/fn5/foCAf35/f4CAgoB/fH5+f35+fXx/f4B/fn5/f4B/f35/f4CAfn5/f39+f35/f35+fn19fX2Fk5KOjIuKiImIhISEgoKCgYGBgoOCgoOCgoODg4ODgYCBgYGBgYCAf39/f4CAgICAgIB/foCBhIOCgYGDhISDhICBgICBgIGAgYKCgoGBgoCBg4ODgYGBgYCAfn19fn5+f359fX19fXx8fHt6eXl5eH6BgICBgYF/f4B/f4F/gICAgYGCgoB+gH5/fn5+foGAgoF/f39/gICAf4B/gYB+f3+Afn9/fn+Af31+fX17fIaTkoyLioeHioiGhoSDgoGBgYGCg4ODg4OCg4OCgoKBgICBgYGAgH9/f39/gICAgICAgH9+fn+BgYGAgISGh4aHgoODhYOBg4ODhYSEhISEg4ODhIKCgoKCgX9+fX19fn6AfX19fX19fX18e3p6eXl5eYCCgoKEg4CCg4GAgoGCgYGDgoODgYGCgIGAf4CBg4GEgoCAgYCBgYCAgYCCgn+BgIF/gIB/gICAfn9/fnx8ipOPiYmIiIiJiIaGhoSCgoGBgoKDg4ODg4KDg4KCgYCAgICBgYGAf39/f4CAgICAgIGBf359fn5/f39+g4aHh4iChYSFg4SFhIWGhoaGhoWGhYGBg4ODgoKAfX19fX19fn59fX19fX19fX18e3l5eXl4fIKDhIWCgYSDgoKDhYeCg4SDgYKCg4OCgoKCgYKFg4iFgoGCgYKDgYGBgYSDgoOCgoKCgYGBgIF/gIGAf36Ok4yHiIaIh4aGhYaGhIKDgoGCgoODg4ODg4OCgYGBgH+AgYCBgYB/f39/gICAgH+AgYB/fn19fX5+f36Ag4SHiISGhoaFhoaHh4aGh4iHh4eGf32AgIGCgX59fX19fX19fX19fX18fH5+fnx7eXh3eHl5gIKDf4ONhISEhISXl4ODhIF9foGCgoGCgYKBg4aIjIWDgoKBhIKDg4KDhYSEhYOCg4OCg4OCgoKCg4KCgpKQi4iIh4mHhoaEhoWFhISDgYKCg4ODg4ODgoGBgYCAgICBgIGBgH9/fn+AgYCAf4CAgH9/fn1+fn+Bf4CCgYWFhYeGh4eGh4eIhoeHh4eGh4V/fX18fX9+fX19fX19fX19fX19fXx7iJKCe3x6fIZ5eHl8gYF+iZaEg4OEhJSTgIGBf39/fn6Fi4B/gICEhpCJhYSCgoGFhYuDgYKFhYaGhIOFhYOEhIODhIOFhISIko+MiYiIiYeHh4WGhYSFhIKBgoKDg4ODg4OCgYGBgYB/gIGAgICAf39/f4CAgICAgYGBf39/f4CAgIGBgYGBg4OGh4aGh4aGiIeGhoaFhIOFhH59fHx8fX18fH19fX19fX19fX18fH+RlZaDe3qElHx4eXp7fICCg4GCgYOCgH59fn57iJF8fI6Wf31/f4KGioWDg4SCgYONiX99f4OEhYWDhYaFhIWFg4SFhYaEhI6Rj4yKioyJiImHhYWFg4ODgYGCgoKDhIODgoGBgICBgICAgYGAgIB/f3+AgIB/gICAgX5+f4GBgoKCgoODgoOCgoWGhISFhYSGhIOEg4KBgIKAfn19fHx9fHx8fH18fH18fX19fHx8e4uRl4x6e3yBenp6e3x5eX19foB/gH98e3t+fn2ClZF/hIh9fH5/goR8fIGChIKAf4eDfYKBf4KCgIODhISEhISChIOEhYGEkZGOi4yLjoqJiYWFhYODg4KBgoODgoKDg4KCgYGAgIGAgICAgICAgH+Af3+Af357gICBenyAgoKDhYODhIWFhYODg4SCgYKDgoOCgoGBgIB/gX5+fX19fHx8fHx8fHx8fHx8fHx9fHx8fn6Kgnt6e3p4ent7fH17fn1+f319fX19fICBgH2Gj4F9fYJ+f36Agnx8gH+CgIKAfn17ioJ9gH9+gYCAgYKAgoCAgIGAf4uUkIyMjo6NiIiHhYWEhIOCgoKCg4OCgoODgYGBgICAgICAgH9+fXx7fHx9f3+AgHx6gYF4e4CCgYOFhIOFhYaHhISAhpSIgIKBgYGBgH9/f39/fn5+gHx8fHx8fHx8fHx8fHx9fHx8fHx8fHl7e3t4eHl7enp8goCBfn+BfH5+f359gIKCgICAgX+CkYF/f4CAfoB+fn9+gIGBfXx9e319fXx9fHx9gH+AgH6Afn6BlJKNjY2Oj4qFhoaFhISFg4KDgoODg4OCgoGBgYGAgICBgICAf4CAf39/fXt6fICAgHh+gXd7gIF/goKCgoKEhoeGhn6IlYp+gIGAf4B/foB+f39/fn+Bfnx7e3x8fHx8fHx8fH59fHt8fHx8e3x8fHp6eXt8en2Fg4N/gYF+f35/gH6FgoF+gH9+foCFhoKAfn6Dhn99fX6AgIGAf39+fX19fX57fH1/f3+AfX9+f4yRjo2Nj46Nh4SGhoWEhISDg4OCg4ODg4KBgYGBgYCAgYGAgYGBgYGAgH9/f397en9/e3mAd3p/f31/f3+Af4KEhoaFf3+FgX5/gIB/gH5+f31/gIB/f4B/f319fHx9fn18fH19fX19fH58fXx7fXx8ent6fH19f4aEg4CAgX1+fX5/fYuEgYZ+fXx8f36CgX99fX19gXx7fXx+gYSDgYB+fn5+fXx+f399foB+f36Eko2NjI+Ni4qGhIaEhISDg4OCg4KDgoOCgYGBgYGAgYGBgYB/fXx8fH1+f39/f397e399d352eH59fH18fX5+gYGCg4B6fX18fn6Af35/f35/fn+AgH+AgH9/fn9+fn5+fn1+fn99fH59fn1+fHt8fHx6e3p9f4CAhIOCf35/fHx8fXx9gYN+jH58e3t9fn1+fn17e3t9fHt7e3uAhoSChIOCf4B+f4KCgn9/goJ/gIuQjY2MjYuKiISEhIOEg4ODgoKCgoKCgoKBgYGAgoGBgYKCf3+AgIB/fn18fH5/fn55fX52e3Z4fXx8fHt9fX6BgICAf31/f31+f39/foB/f39/f3+Af4GBgH99gH9/fn9+fn5/f3yCfn59fX17fH19fHp8fH6AgoGAgIB9fH18fHx8fH18fnt/fnt7e3x8fH18e3t7e3x8enp9en6CfoKEhIOBgoGFhoWFhoaHhYGEkY+Ni4qLh4iFgoOEhISEg4KCgYGCgoKBgoGBgYGBgoGBgoKAgYKBgYCAgH9+e3x+fnx6fnh5dnd8fHx7e318f4GAf35/foB/f35/f35/gH9/f3+Af39/gYKAfn6BgIB/f39/f39+fYN8fH19fH99fX19e3x+fn9/fn5/fnx9fXx8fHt+fnt8e3x8fXx9fH18fnx9fHt7e3x5e3x7e316fX5+f4CAg4eJiYmKiIuJhYiSj4yJioeFhYOCgoOEhIOCgoKBgYKBgYKBgYGBgYKCgoGCgoCAgX98e3p6eXt9enx+fnl8eXh4dHx8fHt8fHx/gH9/f39/gIB/fn5+fYCAgH9/f3+Af4CDgoB/gIGAgIB/f4CBf358enx9fX59fX5+jIZ9fX57e4ODfX5+fX18fX19fX19fH17fXx9fX58fn19fX18e3t7fHt7fHt6e3t6enp7fn6DhYiHiIqLi4qJjJGQjoqIhoWEgoKCgoODg4OBgYGBgYGBgYGBgYGCgoOCgYKBgIGBf3+Af356eHl5en5+e3l6eH5zfHx8e3x8fH5+fn5/gH+AgIB/fn9+gIF/f4B/gIGAgoSEgYCAgYGAgX+AgYKBf39+f31+f357foGSjHx9f4qAjYx+fn19fX5+fX59fHx8fn18fXx9fX1+fX1+fnx7e3t8fH18e3t7e3l6eXh5e35/g4OEh4mKh4mOkI6MiYmFhISCgYKCgoKCgoGCgoKBgYGCgYKCgoGCgoKBgoKAgYGAfoCAf39+e3p5e319eHx6f3KBfXt7fXx8fn59fYGCf4GBgX9/gH+AgX+AgIGCgYGFg4SCgYGCgYKCgICBg4KAf4F/fX6Afnx/f4mCf36DkYSEg4F/fn18jYd9fX59fXx+fnx9fXx9fX5+fX5/fX19e3x9fnx8e3x9enp5eXl5e3t+foCBg4eEiI+Oi4uHhYSEg4KBgoKCgoGBgYGCgoKBgoKCgoKCgoKCgoGCgn+AgIB+f39/fn5/ent5fX16enp9cX6Cent9fX19fXp4f4KAgYKCgICBgIGBgICBgoKCgoWFhIKCgYGBg4F/gIKEgX9+gYB9foF+fX5/gIB9fn+EgH5+f31+fX2KhX1+f31+fn9/fX19fH5+fn99f4B9fX18fX9/fHx7fH17e3t6enp7e3x9fn6Ag4CJjouMiIWFhYSDg4GCgoKCgYGBgoKBgoKCgoKCgoGBgoKBgYKCf4CAgH9/f39+fn59eXp6fXx5d3t0e4d8dHd9fn17e3Z2fYCBgoKBgYKCgoKBgYGDg4OChYaEg4GAgICDgX+AgYSBfn6Af35+gH59fn6AgH+Bf3+Af39/gH99f39/f3+Afn9/gH58fX18fn5+foF/gH2CgHx9gIB9e319fXx8fHx8e3t7fHt8fHx9fIqLiYiGhoWEhISDgYKBg4KAgIGCg4KCgoOCgoKCgoGCgoGBg4J/gIGAf39/fn5+fn57enp8fHt2e3R3f352cnt+fnt4dnd8gIGCgoKBgoODg4OCgoSDhIOFhoOCgX9/gIKAgICAg4F+foB/fX+AfX1+foCAf4J/gYGAgICBgH1/f3+AgICAgIB/fnx9fX19fn59g32AfoKAfX6AgX98fn59fX17fH58fXx8fHt8e3x9iYeHhYaIhYSFhIKCgoGDgYCAgoKDgoKCg4ODg4KBgYGBgYGCgH6AgYB/fn5+fn5+fn56e3p9goN9dXF6fHpxen59eXh0dICAgoKCg4KDhYOEg4KDhISEhISEgYGAgH6AgoB+fn6Bf35+f4B9foB9fX1+gH9/gYCBgYCAgIGBfn6Af4GAf4CAgH9+fX19fnx+fn19gYR/gH9+f4GBf31/f319fn1+fn1+fHt8enx7eoCIg4SEhYSEhISDgYKBgYKBgICCgoOCgoOEg4SDg4KBgYKBgYOAfoCBf35+fn5+fX5+fnt7en6Jh354cnl9f3F6eHt4eXV1fYKDgYODg4OFhIWDg4OEhIODhIOBgH+Af4CBfn1+fn9+fn5+gH19f3x9fX6Af4CAgIKAgIGAg4KAf4B+gIF+gIGAgH9+fn5+fX1/fn6FhYGBgH+Ag4F/foGAf35/foB/fn17ent6fHt6goWAg4KCgoKCg4GBgYCAgoGAgIKCg4KBg4SDhIKEgoGBgoGCgn9+gIF/fn1+fn5+fX59fXp7fIWEe3tzeXp8cHd1dnd5dXR6hISBhISDhIWFhoSDg4WEgoODgoCBf39/f4B9fX1+f31+f39/fn1/fH19foF/f4B/gIB/gICDgoGAf36AgH+AgYCBgH9/f39/f4CAgIGCgoKBf4GDgX9/g4J/f4B/gX+Af3x6e3p8e3yCgH+Cf3+AgIKCgYF/f3+CgH6BgoKDgYGDg4KEgoSCgYGBf4GCgH6AgH9/fX5+fX19fn19e3t6gH94fHZ5eXtxdHh3dnh1cnmFhYKEhIKEhYWGhISChIOBg4GAgIF/f4B/gHx9fX6AfX5/f39+fX98fn5+gX+Bf39+f4B/gYODg4B/f4GBgIKBgYGAgICAgICAgIGAgIKDgYF/gISAfYGDhICAgX+BgYKAfXp7e3x8fH9+f4B8f399fYGAgH59fX9/foKBgYKBgIKCgoKBg4KCgYB/gYKAfn9/fn99fX1+fX19fX19ent7fHZ9eXh5enJ1eXl2d3dzdYaFg4WEgoSEhYSEhIGDgoGDgX+AgX5/gH6AfX19foB+f4B+fn99f3x/f3+BgIF/f3x+gH6AgYKDgYCAgoOEgoGAgYB/gYCAgYGAgYGBg4OBgX+Ag4B+goOEgICCgYKChIJ+e3x8fHx8fX1+fXp+fX14fn9/fHx8fn5+gYCBgYCAgoGBgYGDgoGBf4CAgoB9fn19f319fX59fH19fX16e3p8dnx6d3t4cnZ5e3Z2dnN0hoSEhYSChISFg4ODgYOBgYOBgIGBfX+BfoF9fX1/f39/gH5+f359fYB/gIGBgX9+fH5/fn5/gYJ/gYGCg4eFgX9/fn6Af4CAgICAgIKCgYCAfoCCf3+BgoOBgYOCg4OFgn99fX18e3x8eXp7en55e3l4f357fHt+fX1/f4F/gH6BgICAgoOCgYF/gIGBf31+fH1+fX19fX18fn58fXx5e3x4enx3endzeHd6c3Z2c3SGhISGg4KDhISDgoKCg4GCgoGAgYF9gIB+gH1+fX5/gIB/f39/f3x+gH+BgIGAf359f39+fn+BgH2AgIGDg4N/f359fn5/f4B/gIB/gYKAgH9+gIF+f4CCgYCBg4KEhIaEgH59fHx8fHp5dnl5enl2eXZ+fHt7e358e399gH99fX9/f3+BgoGBgX5/gYF+fX18fX19fX19fXx+jYF8fXl7e3p5fHd4eHR1dXhyd3d0doaEhIWEg4ODg4OCgYKDgoGDgn+Bf35/fn+AfX19fH+AgIB/f39/fIB/f4GAgYCAf3yAf35+fn9/fX5+gYGCgn5/fn1+fn5+f3+Af32AgIB+fn1/gX5+gIKCf4KDgoOEh4SAgH58fXx8e3x1eHl4eHh5d3t8e3t7foV9fn1/ent+fn59foGAgIGAfX6BgH59fXx9fX19fX18e32Dgnx8ent7e3p7d3Z4dXJzdnB4eXJ4hYWFhYOEhIOChIKBgYKBgIKBgIF/fn5+foB+fX58foCAgH+AgIB8gH6AgH+BgIB/fYF/fn5/f319fX6AgYKBfn9+fn59fX5/fn9+fH6Af35+fn+Cfn6AgIF+gYOCg4OGhICBfnx9fHx7fHh3e3h1eXd3eXx6e3t9kod9fH13en1+fn19f35+gH98foB/fn19fH19fX19fHt8ent9enp4e3x6ent4dHh1cXJ0cHh4cXmEhYWFg4SDgoODgoGBgoKAgYGAgIB9fn5/gH18fn2AgIGAgICAgHx/f4B+f4GAf39+gX9+f39/fX18f4CAgIB+f35+f318fn9/f358fYB/fn1+gIJ/foCAf36ChIKCg4WFgoJ+fXx7e3x8eXd8eXd4d3d4e3t7e3yFiX17end6fH19fHx9fX1/fnx9fn59fXx8fX5+fX18fHt6enx7e3p5enp7enhzd3VxcXNveHdxe4WGhYWDhYKBg4OBgoGBgoCBgICBgH5/fn9/fXx+fYCBgoGAgIGBfX6Af35/gX+Af3+BgH+Af319fH1/gICAgH9/f35/fXx+f39/f319f39+fn6CgYF/gIB/foGDgoGEg4SCgn5+fHx6fHt7eXt6d3N2d3h5e3p7eXp/fnt7d3p8fXx8fH59fH19fH19fXx8fX19fX99fXx9e3l7fHx7enp6enp6eHN2dXBwcm93dnJ7hYaEhYOEgoGDgoKBgYGCgYKBgYGAf4B/f399fX9+f4CBgYJ/goF9foF+fn+Bf4B/gIJ/gIB+fH58f3+BgICAf4B/f4B+fX5+f4B/f39/gH9/f4J/gICAgIB/gYGAgISBgoKAf39+f3x9fn56fYV+dHx9enp6enx5eXp6hoV3eXx8fHx8fXx8fHx8fX19fHx9fX19fn19fX16eX18fH16enp6enp5c3V1b29xb3d0c3yFhoOEgoOCgYKBgoKCgYKBgYGCgYCAgICAgH59gH+Af4GCgn+CgX+AgX5/gYB/f4CAgn+Bf319f35/f4KAgICAgIB/gIB+fn1/gH9+f4B/f39/gH+AgICAgH+AgYCBgYGCgYCAf39/fn1/fnqBk416fH18e315e3p6eHmBgXh5e3x8fXx8fHx8fHx9fX18fH18fn1+fn59fHp8fHt8fXt5enp6eXl0dXVvb3Fwd3N0fYWGg4OCg4KAgYCCgoGAgYGCgYKBgYCAgIGAfn6Af4GAgYKCgIKCgICCfoCBgX9/gX+BgIF/fH6Af3+AgoCAgICAf3+AgH9+fX6Afn2AgH9/f3+AgICAgYCAf4CAgYCBgYKCgICAf39/fX5/fIGGiXx8fnt7fnl6e3p7jn53d3l7fHt9fHx8fHt9fH19fX18fXx+fn5/f358enx9e3x9e3l6e3p5eXN0dW5zcXB4cnV6hYaDg4KDgoCAgIKBgX+CgYKBgoGBgYKAgYF/fn9/gYGCgYKBg4OAgYJ/gYGBf4CAgIB/gX99f4F/gICBgICAf4B+f4CAf359foB+fn+Af39/gH9/gIGBf4CBgH+BgIGBg4KBgICAgIB9foB9gIOCe35+e3x9e3p8fHyHeXh4eXx8fH17fHx9fX18fH19fn19fX5+f3+Af317fH18fHx7enl7e3l5c3J1bnZycHhxdXaFhYOEg4KCgYCBgoF/gIKCgoKDgYGDgoCCgYB/f4CCgoKBg4KEhICBgX6BgoF/gICAgH+Cf36AgYCCf4B/gIB/gH+AgIB/fn2Af39/f4CAgH+AgH+AgYGAgICAgIGAgIGBgYGAgYCAgH9/gH5/fX59fn57fXx9e3x8eHh1eHh5e3x8fXx7fHx8fX5/f39/fn19fn9/gIGAf3x9fHx9e3p7eXp8eHpzcnVud3FxenF2d4WFg4ODg4KCgoKDgICCgYSDg4SBgYOBgoKCgYCAgIKDgoCCgoSDf4GAfoKDgICBgICAf4CAf4GBgIKAgICBgH9/gICAgIB/f4CAgH+AgICAgIB/f4CBgYCAgICAgYGAgoKCgoCCgYGCgYB/gIB/gId+fnx7fXx7fX94d3Z5eXp8fXx8fXt8fH19fn5/gIGAfn1+gICAgoGAfH59fX58d3t6ent5eXNxdW53cHV6cXZ5hYWCg4KDg4KChISAgIOBhoODg4GChICEg4KCgICCgoSBgYKBg4J/gIB/gYOCgYCBgYCAf4GBgYGAg4B/gIOCf35/goGAgH9+gYCBf4CAgYGBgYCAgIKBgYKBgX+BgYGBgoOCgoOBg4OCgYCBgH9/hH19fXx/fXt9f3t5dnp4eXt7fH19e3x9fX19fn+AgYGAgH+AgICDg4B9f35+fn15eXt6enp5c3J1b3dxd3lzd3uFgoKCgoOEgoOEg4CBg4OGg4ODgoKEgYSDgYOAgIKBhIGCgoGCgX6AgICCgYKBgYKCgIGAgICCgoGEgH6Bg4J/f4CDgoCBf4CCg4KAgYKBgoKDgoGBg4KChIGAgYOBgYKEg4KEhIODhIODgYGBgoCCf4B/fYB8enx/e3t3fHl5eXt6fX59fHx8fH1+foCBgYCAgIGBgYSEgH2Af39/f357e3t6e3p0cHhyeXR2eHR3e4SCg4KDg4SChIODgYKDhIaEgoOCgoSBhIOBg4CBg4KCgoKCgYKAf4GAgIKBgoGCgoKBgIGBgYKCgoOAfoGDgX9/gYSEgYN/goKBg4GCgoGDg4OEgYKEgoOCgoGCgoOBg4SDhIOEhYSFg4SCgYOCgYOBgYGAgH58fIB9fHh8eXp5enx9f3x7fHx9fX18fICAgICAgYGBgYKBfoGAgICAf3t7e3p6enVweHd5dnV8dXZ8gICDgoODg4OEhISAgoOGhYWDg4KDhIKEhYKCgYKDg4GCgoKAgYB+gYCBgYKDgoKCgoGAgYKCg4KCg4B/gYKCgICChIODgoGCgoGDgoKDg4SDg4SAgoSDhIOBgX+Bg4KDhYKEhISEhISDhISChIOEhIKBgoGBgHt9gX58eXx6enp9fHyBfnp8fH19fHp7fn5+gIB/gYGAgICAgIKBgIB/fX18fX18dnJ2eHh2dH92dX2Hh4OChIWDg4SFhICChYWEhIOCg4SEgYSFg4KCgoODgYOCgoCCgH2AgIGCg4KCgoKEgoGCgoOEgoKBgICBg4KAgYOFhIOCg4CCgoOCg4ODhIOEg4CCg4KEg4KCfoOBgoSEgoODg4SEhIOEhIOEg4WEg4ODgoKAfICBf3x8fXp6fH2AfX9/fHx6fH59fX19fn5/f39/gICAgH9+foCBgICAfnx9fX5/fn18fHh2f3Z3f4SHg4KDhoODhIaEgYKFhoWEhIODhISChIWFgoKDg4SCg4KDgoOBfoCAgoKDgoODg4SDgYKCg4OCg4KCgYGDgn+ChISDg4KEf4KEg4ODgoSDg4SCgIOEg4SDg4KCg4KChIOCg4OEhISEhIWEg4OEhYSFhIKBgoB9gYKAfXx8e3x8gH19foB+fn1/fnx8fX19fn5/fn+BgYGBgH99fX6BgYB+fn19fX59fX5+f3+AfH2AgYKCg4OFg4SDhoSBgoiHhYSDg4SEhYGFhYWDg4SDhIODgoOCg4F+gYGDg4SCg4OEhIOCg4KEg4ODgoKDgYOCf4KDg4ODgoOAgoWDg4ODhIODhIOBgoSEhYOCgoODgoGEg4GDg4SDg4SEhYSEhIWFhYWEg4ODf36BhIB9fXx8fHx/gX5+fn9/fX99e3x9fX19fX5+f4CBgIGBgH59fH6Cf39+fn5+fX1/f39/gICAf4CEhIODg4WDhIOFf36CiouFhYSDgoSFgYaGhoOEhISEhIODg4OEgn+BgYODhYSFhIWEg4KEhISFhIODgoSDhYKBhISFhYaEgoCDh4SDhIOFhIWFhIGEg4OGgoOCg4GCgYSDgoODhYODhIWEhYWHh4aHhYSEhYSBf4GDf35+fH5+fX+BgH9+fHx/f358enx9fX19fX5+fn9/gIGBf319fIB/gH5+fn5+f3+BgYGBgYKAgYWFhIOEhIKEg4aAgoWFiomEhISEhYWCh4aGhISEhIWEhYSEg4SEgYKDg4OEhIaEhYSDg4SEg3yDhHuBhHd5g4F9hH5+cnWDgoF2foOEgH2BdYF6hH9/f3+EhIKDg4KBg4SDhISFg4SFhoSFhn2EeXx+f4N7hYOBhIOAf31+f31+gYOBfXt/fX6Afn18fHx9fX19fH19f4B/gYJ/fX18f4GBgICAgH+BgYGBgYKDg4KChoSEhIWEgYOEhYOEhYSKiIWFhYOFhYSGhoaDhIWFhYWEhYWEhIWCgoOEhYWFhoSFhIOEhYWCaICFanx7cXF8gXOGc3R0fYKDdXNxg4ZzcHVyc3SDdnt9dYF/goOBgnZ5hYCDgIR/hYSChYWCaHpyc3N8gHKBg36Dg32BfX5/fX6Cg4J8f4F9f4B9fXx8fHx9fHx8fn1+gX+BgX99fX2AgYKBgYGBgIGBgYKBgoKCgoSHhIWEhYSBgoSGhoOFg4aIhoaFgoaGhoeGh4OFhYaFg4KFhoSFhYODg4SEhoaGhIaEg4SFhn1xe4FweXZ+g3+CbnlwdXN8dnl5hnKEg3B2eHF2dHR1cnN0dml/gG5yb3R2bnVsd217c26Ah3ltfXJzdnN2bW53bHB5bHV9f398foGAgX2Af32Af4B/fX18fHx9fH1+f32Af4CAfnx/foCBgoCBgICAgYCAgIKDgoKEhYeGhoCChYODhYeGg4WFhYaHh4SDhoeIiYaHhIWGiIeEg4WGhYWEhIOFhIKFhoaFhoWEhoWHdnB0e3BydX+HhYNtdW92b3x1coR5eYd4cXR3bndod3pucHaCcoN+b3p5eW1vbnpvb213fXiGcHF6cHJ0ZoF1fm57eXNveX+Af31+gYB/e39+fIB+gIB+foCAgYB+fn9+foF/gH9+fYB9f4CBf4B+fn+BgH9+goOCgoSFh4eEfoaEg4OFh4aEhoWFhoaIhISGh4iIhoeEhoaLioWEhoeHhYOFhIWEgoWFhYWGhYWGhYZxdXByc29zenl+hHSIdHV+iHZugnKEhnluanJ/cW1zd3x/dXR8hH54cXV3bnl1enF2eHV6eYRyaW95eHBreXN6b3p3dnZwgYB/fn5/f356fn18f31/f359gIGDg4CCg4GBhIGBf4GBgH1/f4F+f35+f4GAfn6BgoCAgoSHhoODhoSFhYaHhoWFhYWGhoiFhYaFh4eFhoSGhomIhYSJi4iGhIaFhoWDhYWEhoaGhoaFg3iLeXKIentwcIWFeIV4eWtzfnl7a3KDh4N6fG16eXl0fYB2bm+AgG90fHV3cXl9fW19dW+DhYZ6gHJye3x1cG96a3N8bnaCgYF+fn99fXp9e3x9fX9/fX1/f4KCf4GDgYGDgYB/gICAfn9+f31/fn1/gH58fYGAfn6Ag4iEhoSFhYWFhoeFhYWFhYeHiIaEhoWHhoaFhIWFhIWFhomKh4WEhoWGhoWGhoSGhoaGhoWGh4eHhoaEhoWGh4iHhYeGhoOHhoWFg4SFhoWGhIaEg4SEhoSDgYODg4SFhIWEhYSGg4WGhYWEhIWHhoSEhYaFhn13hYSEhIOCgX1/fnt8e357fHx9f359fX9+gYB9f4F/f4GAfn5+gH5+f35+fX99fX5/fHt8f358fH+BiYaFhIaGhoWGh4WFhYWGhoeIhoSGhYeGhYWDhIWGhYSGhoaGhYWGhIWGhoaGhIeGh4eGhYeIiIiIhoSHhYaGiIaFiIeIhYeGhoiFhYaHhYaGhYOChYWGhYWDhYSEhIWEhoWEhYWDhoaFhYWEhoaGhISFhoOFhIKEg4OFg4OBfYB/fHt8fnt8fH1/fnx8fn2Afn1/gH5+gH99fXyAfX5/fn5+f3x9fX57fHx/fHt7fn+Ih4SEiIaGhoeGhYWEhoaGhoiHhIWGh4aFhIODhIaFhIeFhoaFhYaEhYaGh4eFh4aJiIaGiIeIiYiFhYiFhoeGh4aHhoeFh4eGh4WFhoeFh4aFgoSFhoaEhIOEhIOEhoSFhYWGhYOGhoWGhYSGh4WFhIWFg4SHhoOCg4SDhIJ+gYB8e31+e3x7fn59e3x+fX5+fX9+fX1+fnx9fH98fn58fYGAfHx8fXx8fH56e3t8foiHgoWIh4eGhoaGhISGhoeGiIaEhYSHhoSFh4OEhYSFh4SFhoaFhoSGhoeHhoaIh4mIhoaIh4iKiIWHiIWHh4WHhoeGh4WIiIeHhYaGh4WGhoSBhISFhoWFhISEg4SFhIaGhoWGhIaFhoaFhYaHhYSDhISDhIeDhIGChIWDgYCAgHt7fn58fHx+fXx8fH19fH18fn18fX19fHx8fXx+fXt8gX99fH18fnx8fHp6fHx9iIeChoiHhoeGhoaEhYaFhoWGhYOFhIaFhIiJg4GEg4SGhIaGhoaGhIeHiIiHh4eIioiGh4iHiImIhYiHhYaGhoeHh4WHhoiIh4eFh4eHhoaHhIKEg4SGhYeFhISEhISFhoaGhoaFh4WFh4WGhYaFhIOEg4OEh4GDgIKDhIKCgn+Ae31+fnx8fH59fH19fH17fHx7fHx9fXt7e318e359e3x/fX18fX1+fXx6ent7fHyIh4KGhoaGh4aGhYOFhoWFhYWEg4WChoSDiId/enqChYaEhoaFh4aEh4eIiIiHhoiKh4aHh4eIiYeFiIeFh4eGhoeHhYeGiIiHhoWHh4iGhoiEg4SEg4aGh4WFhISEhYaGhoaGhYaHhoaHhoaEhoWDg4ODgoOGgYN+goKDgIOCf398f35+fHx9f318fX18fnt7e3p7fHx8e3t7fnt8fXt6e358fHx8fX5/fXt6fHp8fImHg4aFhoWGhoWEhIWFhYWFhIOBhIGGhIKEhHyAhn+ChYWGhYWGhYSHh4iHiIaFiYqHhYeGh4eIh4WIhYaHiIaGh4eGh4aIiIeFhoeGh4WFiIOEhoWDhoaHhoWEg4WFhoaGhoaFhoaHhYeHhYOFhYOBgoKBg4WCg36BgoF/g4F/fn5/fn98fH1/fXt9fXx+enp7eXt8fXt7e3t+fHx8fHp7fXx8fHx+fYF8e3t7e3x7iYeEhoSGhIaGhYSFhYWEhIOEgoCDgYaCgYJ/eoSMe4CEhYeGhoaFhIeIh4eHhYWHioeDh4WGhoiGhYeEhoeJhoaIiIeHhoeIhoSGhoaHhYWIg4SFhIeGhoeFhYSDhYWGhoeGhoWGhoaFhoaEg4SFgoGCgYCEg4OCfYGBf36DgX5/f4B8f3x9fX59e319fH15enp5e319enp7e318fXx8enp9fHx9fH5+gHt7e3x+fXyIh4WGhYeEhoSFhYWFhYODgYOBgIKBhYKAgH9/fXx7gYSFhoaEhYSEh4eGhoaFhIaJhoKGhIaGhoWFh4aHiImGhYiHiYeGhoeFhIaFhYeFhIeDhIWEiIaGiIWFhIKFhYaFhoaHhIWGhoaFhoKDg4WBgIGAgIOBg4B8gYB+foKAfYB/gXx/fH1+fX57fn18fHl6enl6fX15ent7fHt8e3t6e319fH18f35+fHt7fX59fIiGhYaGhoSFhYSFhYSDgoKAgoGAgIGDgX5+foB5en2Ag4OFh4WEg4OHhoOEhYSChYiFgoSDg4WFhYWHh4aIiIWFiIeJh4aFhYWDhoSFh4OEhoSEhYSHhoWGhYaEgoWFhoaGhoaEhYaGhYWFgoKDg39+gICAgYCDgHuBf31+gn5+gH6Afn99fX59f3t/fXt6eXp6eXp8fXl6ent7enx7e3t7fH19fXx/fn18fHx/fnx7h4WFhoaGhoSFhIWDhYKBgICAgYB+f4KCfX5/f3t/f4KDg4WGhYSDg4aDgYOEgoCFh4WCg4GBg4SEhIaGh4eHhYWIhomHhYSEhIKFg4SGgoOFhIWGhIeGhYWFhoOEhYSFhoWGhISFhIWDhYSAgIKDf35/f39/gIN/e4B9fX+Cfn+Bfn6Bfn5+fX1/e398e3p5enp5ent8eXp6ent7fHp7e3t8fX59fYB9fXx8fYB/fXyGg4aGhoaFg4SDhYKFgYGAf3+AgH5/gYJ8fn9/foCAgoKChISDgoGChIGAg4KBgISFhIKBf4CCg4OEhYWHhoaEhYeFh4WGgoOCgoOCgoWBg4WEhIaEhoaHhoaFgoSEg4SFhYWDhIODhIKEhIB/goJ+fX5/fn5/hH57f3x8gIF9gYB9foN8fn59fX57fnt7enl7enl6ent5enp6e3t8enx8fHx+fn1/gXx9fHx9f4B+gIaEhYWEh4SEg4KGgoOAgYB+fn+AfX5/gnx9f39+fn+BgYKEg4KBgYKCf4CBgoCAgoWEgoB/gIGCgYOFhYeFhISGhoOFg4WBgoGBgoGCg4GChISEhYWGh4eGhYWDg4ODhIWFhIGDgYOChIODgH+AgX59fX5+fH6Dfnx+fHyBgH6Cf35/gnx/fn19fHx8e3t6enp6eXt5enp5enp6e3x5e317e35/f4GAfX59fX1/gICAhoSEhYSFgoSCgoSCgoCBgH59fn9+fn6AfX2Af35+foGBgoODgoSHgYF+gICBf3+ChIOBf35/gIJ/goWEhYOCg4WFgoSBg4CBgIGBgYKBgIGEg4OGhYWHh4WEhIWCgoKDhYSCgYGBgYCFg4F/foB/fnx9fn18foN9e358fYF/gIN9fYCBf35/fXx8fH17e3p5enl5e3l6enl6ent7e3p7fXx8f3+BgoB+gH+AgH+AgIDKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzNzc3Nzc3Nzc3NzczMzMvLy8vLy8vLy8vLy8vLzMvLy8vLy8vLy8vLy8vMzMzMzM3Nzc7Oz8/Pz9DQ0NHR0dLS0tLS0tLT09PT0tLS0tLS0tPT09TU1NTU09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tLS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1dXV1NTU1NTT09PT09PT09PT09TU09PU1NTU1NTU1NTU09PT09PS0tLS0tPT09TU1NTU1NPT09LS0tLS0tLR0dHR0dPHhnNlYFtLWWdVTUZIQD03Nzg5Nzw8PDo8Oz42Oj04PDs6OTg3ODs7Oj87PTs8PD47P0E/QkJBQ0RFREE+PTw7QENDQUBDQ0FBR0hHSUtSwtXS09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXVysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMy8vLy8vLy8vLy8vLzMzMy8vLy8vLy8vLy8vLzMzMzc3Nzc3Oz8/P0NDQ0NHR0tLS0tLS09PT09PT09PT09PS09PT09TU1NTU1NTU09PT09PT09PT09PT09PT1NTU1NTU1NTT09PT09LS0tLS0tLT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1NTU1NPT09PT09PT09PU1NPT09TU1NTU1NTU1NPT09PS0tLS0tPT09PU1NTU1NTU09PT09PS0tLS0tLR0dHSzIxyZ2BcTVllUktHSz87Mzc4Ozg5Pj05PDpBOjs9Nzs8PDo6Nzg6Oz0/Oz88PTw/Pj9BPUFBPkNDREJAQT46Oz9DREFDRERCQklHSEhJTr7V0tPT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1crKy8vKysrKysrKy8vLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzMzMzMzMy8vLy8vMzMzMzMzMzMzLy8zMzMzLy8vLzMzMzc3Nzc3Ozs/P0NDQ0NDR0dLS0tLS09PT09PT09PU09PT09PT09TU1NXV1dTU1NTT09PU1NPT09PT09PT1NTU1NTU1NTU1NPT09PS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1tbV1dXV1dTU1NTT09PT09PT09PU1NTU09TU1NTU1NTU1NTT09PT0tLS0tLT09PU1NTU1NTU1NTU09PT09PT0tLS0tHR0s+Sd2hfXk9XZ01LRks9ODc2NTk5OTw+OT88Qzk7PDc5PD07OTc5Ojw9QDs+PT47PD48PT5BQD5EQ0NDP0E9Ojs9QkNFQ0NEQT9FSEpJSky61dPT09TU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8rKysvLy8vLy8vLy8zLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMzMzMzMzMzMzMzMzMzczMzMzMzMzMzMzMzMzMzc3Nzc3Ozs/Pz9DQ0NDQ0dHS0tPT09PT09PT09TU1NTT1NTU1NTU1NTV1dXU1NTU1NPU1NTU09PT09TU1NTU1dTU1NTV1dTU09PT09LS0tLS0tLS09PT09TU1dXV1dbW1dXV1dXV1tbW1tXV1dXV1NTU1NTT09PT09PT1NTU1NTU1NTU1NTU1NTU09PT09LS0tLT09PU1NTU1dXV1dTU1NTT09PT09PT0tLS0dHRmn5nYWJOVWpKSElLPzw6OTM3Njc2PTs+Oj06Ojo4ODo7Ozg4Ojs7PD46PT09Ojw/PD0/QkA/Q0RDRD5APT08QENEQ0JEQkQ+REhJSUtMttfT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3MzMzMzMzMzMzMzMzNzc3NzczMzMzMzMzMzMzMzc3Nzc3Ozs7Pz8/Q0NDQ0NHS0tLT09PT09PT1NTU1NTU1NTU1NTU1NTV1dXV1NTU1NPT1NTU1NTU1NTU1NTU1dXV1NXV1dXV1NTU09PT09PS0tLT09PT09PU1NXV1dbW1tXV1dbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1NTU1NTU1NXU1NTU1NTT09PT09PT09PU1NTU1dXV1dXV1dTU1NTU09PT09PS0tLR0p+DaV9kU1hsSEhIS0A9Nzg0NzY6Oj87RDw8Ojw8OTg6OTo6Ojs8Ojo7OT49Pjk9QDs/QUFCP0JCQUM9Pz8+PEBCRUNDQkBBO0ZJR01MSbLY09TU1NTU1NXV1dXV1dXV1dXW1tbW1tbV1dXW1svLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzM3Nzc3Nzc3Nzc3Ozc3NzczMzMzMzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc3Mzc3Nzs7Ozs7Pz8/P0NDQ0NHS0tLS09PT09PT09TU1NTU1NTU1NTU1NTV1NXV1dTU1NTU1NTU1NTU1NTV1NTU1dXV1dXV1dXV1dTU1NTU1NPT09PT09PT09PU1NXV1dbW1tbW1tbW1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTV1NTU1NXV1dXU1NTU1NTT09PT09PT1NTU1dXV1dXV1dXU1NTU1NTT09PT09LS0tSjiGxfZlJWakdIR0lBPjM2Njo7PDhDPEJBPjtBPDg5Ojw6Ojw8PDk8PTo7PD09PD89QD9AQT9AQUBCPD4+PzxCQ0NDRkBBQT1ISklOTUeu2NPU1NTV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbMzMvLy8vLy8vLy8vLy8vLy8vMzMzNzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzs7Ozs7Oz8/P0NDQ0NHR0dLS0tPT09PT09TU1NTU1NTU1NTU1NTU1NTV1dXV1dTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dXU1NTU1NTU09PT09TU1NTU1NXV1dbW1tbW1tbW1tbW1tbX19bW1tXV1dXV1dXV1dXV1dTU1NTU1dXV1dXV1dXU1NTU1NTU09PT09PT1NTU1NXV1dXV1dXV1dXV1NTU1NPT09PT0tLWroprY2VSWGhMSkdJQjg0OTQ6Ozo5QDk+Q0U/PDw5OTk9Oj07PDw6PTw7OTw9Ozs/PUA9PT5AQD9CQT5APD05QERDQkFBQj48SEpLTU5IqNnU1NXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbWzMzLy8vLy8vLy8vLy8vLy8rKy8vLzMzMzMzMzMzMzM3Nzc3Nzc7Ozs3Nzc3Nzc/Pz8/Pz8/Pz8/Pz9DQ0dHR0dHR0dHR0dHS0tHV2djY2NnZ2dra2tvb29vZ2dnZ2dna2tra2tra2tjW19fX19fX19jX19fX19jZ2NjY2NjY2NjZ2dnZ2NfX19fX19jX19fX19bX2tra2tra2tra2trb3NzX1dXV1dXV1dXV1dXW1tbX1tbW1tbV1dXV1dXV1dXV1dTU1dXV1dXV1dXU1NTU1NTU1NTU09PU1NTU1NXV1dXW1dXV1dXV1dTU1NTT09PT09PS1bqKa2hoUlhlSUlMTkA5OTo0O0E8Nz05QUM9QD89ODo6Ozk9Oz4/Ojs8PDo7PDo7Pj1APT8/P0FAQUE/QTw8Oz5BRENBREA9PElJSk1ORqPa09TV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbW1szMz9DPz8/Pz8/Pz8/Pz8/W3t3d3t7e3t7e3t7e3t3S0NDQ0NDQ0NDQ0NDQ0ci5ubm5ubm5ubm5ubq6t6WkpKSkpKSkpKSkpKSnhmBjY2NjY2NjY2NkZGRlhIuKioqKioqKioqKioemuri4uLi4uLi4uLi4uLepp6enp6enp6enp6enpq65uLi4uLi4uLi4uLi5sIqKioqKioqKioqKiouHvebh4uLi4uLi4uLj4+Pi2NfX1tbW1tbW1tbV1dXV1dXV1dXV1dbW1dXV1dXV1dTU1NTU1NTU1NTV1dXV1dXW1dXV1dXV1dXV1NTU1NTT09PT09XDkXFrak5TYkxMVk08Ojo3Nz5DPjg+Oj8/QTw/QDc7Ojs7PTs+Pjo7PD48Oz07PT8+QDw/Pz1AQEBBPj88PjxAQUVCQkZAQD9HSEpLT0ae2tXV1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19fMzNDS0tLS0tLS0tLS0tLR3uzr6+rq6urq6urq6uvp1dLS0tLS0tLS0tLS0tTEqaqqqqqqqqqqqqqqq6aGhIWFhYWFhYWFhYWFik4MEhISEhISEhISEhIRE0pUU1NTU1NTU1NTU1NPg6ejo6Ojo6Ojo6Ojo6OghoSEhISEhISEhISEhIKSpaOjo6Ojo6Ojo6OjpZVTUlNTU1NTU1NTU1NTS6ry6+vr6+vr6+vr6+vr6dnX19fX1tbW1tbW1tbW1dXV1dXV1dbW1tbV1dXV1dXV1dXV1dTU1NTV1dXV1dXW1tXV1dXV1dXV1dXU1NTU1NTU1NPUy5h2bGlKTl9NUlVNPjw8Nzs/Qz42Ojc+Pzs8QkA4PDk9Ozw6PD07PTs9Ozs9PD0+PT07QT08QUBBQT08Pzw7QEJDQURFPUFAQ0ZLS09GmNzV1dXV1dbW1tbW1tbW1tbW1tfX19fX19fX19fXzMzR0tLS0tLS0tLS0tLS0d3q6enp6enp6enq6unq6dXS0tLS0tLS0tLS0tLUxaqrq6urq6urq6urq6yoiIeHh4eHh4eHh4eHh41SEhgYGBgYGBgYGBgYFxpOWVdXV1dXV1dXV1dXU4WopKSkpKSkpKSkpKSloomHh4eHh4eHh4eHh4eFlaakpKSkpKSkpKSkpKaXV1dXV1dXV1dXV1dXV0+r8erq6urq6urq6urq6unZ19jX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dXV1dXV1dXU1NTU1NTU1NGcenFpSlRdT1JVTkQ+Pzs/QEA4Ojs4PDw8PD46Ojs4Ozk5Ozw7Ojw5Ozs8Ozo9PT0+PUE/Pj8/Pj08PT88PEFBQ0FERTw+QEVGSktNRpPc1dXV1tbW1tbW1tbW1tbW1tfX19fX19fX19fX183N0NLS0tLS0tLS0dHR0dDc6Ofn5+fn5+fn5+fn5+bV0dLS0tLS0tLS0tLS08Wtrq6urq6urq6urq6vq46NjY2NjY2NjY2NjY2SXSInJycnJycoKCgoKCcpWmNiYWJhYmJiYmJiYl6MrKmpqampqampqampqaeQjo6Ojo6NjY2NjY2NjJqqqampqampqampqamrnmJhYmJiYmJiYmJiYmJbr+/p6enp6enp6enp6enn2djY2NjY19fX19fX19fX19fX19bW1tfX19fW1tbW1tbV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbV1dXV1dXU1NTU1NTWo3txZElbYE5OVU9AQT89REI+Oz06OTs6PTw7PDs6OTg5OTs8Ozw8Ojo7PDo7QD08PTxAQTxBQTs7PEA/PD1CP0RDQ0U8PkJERkpMTEWN3NXV1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjNzc7Ozs7Ozs7Ozc3Nzc3Nzs/Pz8/Pz8/Pz9DQ0NDQz87Ozs7Ozs7Oz87Oz87NzMzMzMzMzMzMzMzMzMvJycrKysrKysrKysrKysfCw8PExMTExcXFxsbGxsvMy8zLzMzNzMzMzMzLz9HR0tLS0tLS0tLS0tLS0NDQ0NDPz8/Pz8/Pz87Q0dLS0tLS0tLS0tLS0tHNzc3Nzc3Nzc3Nzc3NzdTY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NfX19fX19fX1tfX19fX19bW1tbW1tbW1tXV1dXV1dXV1dbV1dbW1tbW1tbW1tXV1dXV1dTU1NTU169/cF5GXmJQUVdOR0ZDQ0lBPz07PDo8N0BBPD04Ojo4OTg7Pzs8PDs7PDw8PD87PD46Pj44PkI8Pj1BPjw+QkBERUNAPD5APkNJSUtEh9zV1tbW1tbW1tbW1tbX19fX19fX19jY2NjY2NjYzs3Nzc3Nzc3Nzc3NzdHNzc3NzczP09LSzs3P0s7Ozs7Ozs7O0dTPz87Q09DO0tTV1NDPz8/Pz8/Pz8/Pz8/P0NDQ0NDR0dHR0dHS09PU1NTU1dXV1tbW1tfW1tbX1tfX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dbW1tbW1tbW1tbW19fW2NjY2NjZ2dnZ2dnZ2dnY19jY2NjY2NjY2NnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjX19fX19jY19fX1tbW1tbW1tbW1tbW1tbW1dbW1dbW1tbW1tbW1tbW1tXV1dXV1NTV1di4gm9XSl9jUlFaS0hBQTxCPT07Oj4+PD4/PT0/ODk6OTk3OD48PD47Ozw7PDs/PT0+OTs7OT0+P0A+QD07OkI/QkNCPz0+QD5CRUdKQoDc1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2M7Ozs7Ozs7Nzc3Nzsqfys3Nzc3QuYOEi8fTwJrLz87Ozs7O07udz8/SuY++1JyChIrGz87Ozs7Ozs7Ozs7Oz8/Pz8/P0NDQ0NDQ0NDR0dHR0tLT09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbV1dXV1dbW1tbV1dXV1dXV1NTU1NXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NfX19fX1tbW1tbW1tbW1tbW1tXV1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXYwIBuVU9gY1dZW0xMQ0A9PTs9Ojw9Qj5CQkA8Ojg5ODo6Ojc7Pz4/PDw7PDo5Pzw8PTg5PD9BPj09PUFAPTtBQkBCQz47QD9BQUlHSkF629bW1tbW1tbX19fX19fX19jY2NjY2NnZ2djY2dnOzs7Ozs7Ozs7OzdKpj63Rzs7Ozpu3tqSiwJOerNPOzs7O0rWVm7PUwJSwnLGWuLmvodLOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0dHS0tLT09TU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dbW1tbW1tXV1dXV1dXU1dXV1dXV1dXW1tbW1tbW1tbW1tfX19fX19jX19fY2NjY2NjY2djY2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2dnY2NjZ2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV18h/b1pTYWVeXVxPSkQ9QD8+PDc6Pjk/RD5AOTg3ODk7Ozw4OT89PTw9PD47OkE7OTs5OzxDQDw7PT5AQT49QkQ/QkM9PT8+Pz5ISUg/ddrW1tbX19fX19fX19fX2NjY2NjZ2dnZ2dnZ2dnZzs7Ozs7Ozs7Ozs/Inrym0tDQzsqgl36Cw6abr6fUz8/Pz9GfoKqu1qKgi5HDk31+r7DRzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dLS0tPT09TU1dXV1dXV1dXV1dXV1dbV1dXV1dXV1tbW1tbW1tbV1dXV1dXW1tbV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2djY2NjY2NnZ2dnZ2dnY2NjY2NfX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dbV1dXV1dfNiHNdWGloXl9gT0lGOkFAPj88PDk2P0I/Qjo2NDc6Ozo8Ojk+PD49PTs/PTxBPjw8Ojw8PTw6PEA9QEI+PkFCPUNDPT0+Oz9BRUtIQHDZ1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2c/Pz8/Pz87Ozs7SrKWnqdXAvNLHnY+ey9PJipmq1M/Pz8/RxYeasc+Yh5261NLNnp7D0M/Pz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0dHS0tLS09PT1NTU1dXV1dXV1dbW1tbW1dbW1tbW1tbV1tbW1tbW1tbW1dXV1dXV1dXW1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnY2NjY19fX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0JB1W1tqaWFeXVNOSTxDQEE+QD46OEVAP0M6NzQ5Ojo5Ozs4Oz0/Pj49QT08P0A9Pjw8PDw8Oj1AQD8/PT5CQD9AQkA8QD0+QUVLRz9r19fX19fX19fX2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnPz8/Pz8/Pz8/QzJ2Nl6zQmpfKxZ6ynpbN1q2ZqtTPz8/Pz9anmbPImZCfoNLTwKCg0M/Pz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0dHS0tLT09PT1NTU1NXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX19fX19fY19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tKUcl5ea2tqZV1PTEc/RENDQDo9OzxCPD09OTY0Ojk5Ojo5Nzs/QDs8PUA8PEE+PD07PTw/PDo8Q0A+PTs9QD5CPkBBPkA9QD9GSUQ/ZtXX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2traz8/Pz8/Pz8/P07GigJuvyaCjv8qcpYynrdiqmarUz8/Pz8/VpZm0vqmvkaG516+iqdTQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1NXV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dbW1tXW1tbW1tbV1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbSk3BgXnBoZmVaUUhHQkVDQEA3Ojo8Pjo8OTc2NTk6Njo8Ozc8QEA8Ojo9Ojw/Pj08OUA8PDo6OT9APT08PUBBQz9APz5BOz9ARkpCP2LS2NfX2NjY2NjY2NjY2dnZ2dnZ2tra29vb29vb28/Pz8/Pz8/P0M6fkGyclteqo9PSrqa1mJ/Vqpmq1M/Q0NDQ1qWZtb+emq2bqdijobrU0dHR0NDQ0dHQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1dXV1dbW1tbX19bW1tbW1tbW1tbX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfW1tfX19jY2NfX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX1tbW1tbW1tbW1tbW1tbX19fX19fW1tbW1tbX0pNuYFxxZGdkWlVKQENGQ0FBODs/PD07PDw3NTU4OTY4Ozo5PDo+Pzw9PTk8Pz49Ojo+OTw6Ojg+Pzw9PTw+QEFDQT48PDpCRERKRkJd0NnX19jY2NjY2NjY2dnZ2dna2trb29vb29vb29vPz8/Pz8/Pz9G9n8O31pfA09HQ0srSzZeb1KqZq9XRz9DQ0NWlmrXGlqbFmKLRnp/J0tHR0dHR0dHR0dHR0NDR0dHR0dHR0tLT09PU1NTV1dXV1tbW1tfX19fX19bW1tbW1tfX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19fY2NjY2NjY2NjY2NjY2djZ2dnZ2dnZ2dnZ2dnZ2drZ2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fX19fX19fW1tfX1tbX19fX19fX19fX19bW19GRbF1cb2doYl1PRj9ISEdFQDw8Pj48PT08NzU2Ojk2OTs6Ojs4QD86PDw5PD49Ozs6Pzk/Ojs5PT49Pjw7PTxAQ0I/Pz47Q0ZGR0hEWc3a2NjY2NjZ2dnZ2dnZ2dna2trb29vb29vb29vb0NDQz8/Pz8/Pz5V+e6WS1KKa08ySl6ObodirmavV0pem09DVpZmz0Zqcm5utx5+h0tHR0dHR0dHR0dHR0dHR0dHR0tLS0tLS09PU1NTV1dXV1tbW19fX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tbX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2tnZ2dnZ2dnZ2djY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX1tfPjGRWXnBrXGBgTkVITUlJT0M+OkI9PUBDOzU1Nzw6Nzo7Ojo7OT09OTo6OT0+Pz07OT47PDo8Ozk+PD47PD0+QENCPz5BPEFDR0ZGRVXJ29jY2NnZ2dnZ2dnZ2dra2tvb29vb29zc3Nzc3NDQ0NDQ0M/Pz9DR1aeZrcmjqL7KnbGdo7XZqZup2LirocfS1qOasNmlq6SexbSkptbS0tLS0tLS0tLS0tLR0dHS0tLT0tPT09PU1NTV1dbW1tbX19fX19fX19fX19fX19fX19fX19bW1tbW1tfX19fX19fW1tbW1tbW1tbX19fW1tbW1tbW1tbX19fX2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2djY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fX19fX19fX19fY2NfX19fX19fYzYZdV2JvZE9dVEtIRlNRS0xAPj1EPD9DRj01NTc7OTY6Ozo8PTo7Pzo6OTg6PT0/Pjs/Oz49Ojs5Pjs9PD0+QURCQD8+PzxAQUVHRURSxdvY2dnZ2dnZ2dnZ2tra2tvb29vb3Nzc3Nzc3NzQ0NDQ0NDQ0NDQ0NO5gL3Tm5bP1LWLkZ/T1LyBu9TOlKDT0dW1gsPVzJOQp9e5g7/V0tLS0tLS0tLS0tLS0tLS0tLT09PT09PU1NXV1dbW1tfX19fX19fY2NjY19fX19fX19fX19fX19fW1tbX19fX19fW1tbW1tbW1tbW19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2tnZ2tra2tra2tra29ra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2NfX2ct+WlVqaltMX01KTEpVTEZCPDw/R0VHS0g9NjU3Ojk3OTo7Ojw9OT45OTo4Oz0+PkE+PTk8PDo9Pj46PTk5Oj9FQUA+PT8/QkBHRURFUMHc2dnZ2dnZ2dna2trb29vb29vb3Nzc3Nzc3dzc0NDQ0NDQ0NDQ0NDQ0cHR0crI0tDUxLjS0tHSwtLQ08fM0tHR0cLU0tTLvdXS0cLT0tLS0tLS09PT09PT09LS0tPT09PU1NTU1NXV1dbW1tfX19fX19fX2NjY2NjX19fX2NfX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29va2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2djY2NjX19fX19fY2NjY2NjY2NjY2NjY19rHd1xSZ2laTlpOTFBRV0VKPz89P0FFTExBPTc3NTs4ODk5Ojs8Pjw+ODo6OTs+P0A9Pj46NTo6Oz0/Ojs5Ojw+QkJAPz8/P0FCR0RDRE683dnZ2dnZ2dna2tvb29vb29vb3Nzc3Nzc3d3d3dDR0dDQ0NDQ0NDQ0NDS0NDR0dDQ0dPU0dHR0dPR0dHS0tHR0tLU0tLS09XT09PV0tLS0tPT09PT09PT09PT09PT09PU1NTU1dXV1dbW1tfX19fX2NjY2NjY2NjY2NfX19jY19fX19fX19fX19fX19fX19fX1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tvb2tra2tra2trZ2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2trZ2tra29ra2trZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjbwXNYVWlrU0xSTlBSWVRGSTw+Qz9BQkVKPT43ODY5Nzc4OTk7Oz0/QDw9ODk7Ozs/Pjw8OTU6PT47OTk7PD8/P0JCQT1BPUBBQkZCQkJLtd7Z2dra2tra2tvb29vb29vc3Nzc3Nzd3d3d3d3R0dHR0dHR0dHR0dDQ0NDQ0NDQ0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tPT09PT09PT09PT09PT09TU1NPT1NTU1NTU1NXV1dXV1dXW1tbX19fX2NjY2NjY2NjY2NjY19fY2NjX19fX19fX19fX19fX19fX19fX19fW1tbX19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2NjY2NjY3LxvVFRsbExLUkpUUlVLRkQ6PkdEREFERjw/ODk6OTY5OTo3PD07PkA9PTc5Ojs5Pjs5OTY2Oj1AQT47PDk6Pj9DQT4/Qj0+QkNFQkFCSrDe2dra2tvb29vb29vb29vc3Nzc3Nzd3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0tLS0tLS0tLS0tLS0tLS0tPT09PT09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1tbW1tbW19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19fW1tbW1tfW19fX19jY2NjY2NjZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2dnZ2dnY2Ny2a1NbcGtLVVdSXFFXSEQ+PEJKRT1ISj89PDc4ODo2OTg5Njs+PD1APDw1OTk8Oj87OTk0ODw9PUFBPD47Ojw+QD89PkE9PUNGR0I/Qkmq39ra29vb29vb29vb3Nzc3Nzc3N3d3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHS0M/U0M7P0tLT0tLS0tLS0tLS0tPT09TU1NTU1NTU1NTU1NTU1NTU1NTU1NTV1dXV1dXV1dbW1tbW19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19jY2NfX19fX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dndsGRTYXJfT1pUV19RUkdCPUVJS0FBTEQ/Pzs5ODg5Mzg2ODY5Pj0+Pz06Njo7Pjs9PTo5Njg6PTtAQDxAPz0/P0I+PD48PEJFSElCPkNJpODa29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3t7S0tLS0tLS0tLS0dHR0dHR0dPT0bm7zLqbnLrQyNPT0tLS09PT09PT09PU1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2NjZ2dra2tra2tra2tra2tra2tra2tra2tra29va2tra29va2tvb2tra2tra2tra2tra2trb29vb29va2tra2tra2tra2tra2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ3qpfVWBuW1VZUVpeT0xHQ0ZNSUZEREk7QUE7PDg4NjU4Njk4Nzw/QT89Ojc8Pz48Pz87OjY4OD09QEE9QD5BQD1AOjs6Pj1BRUdKQkBDR57h29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e0tLS0tLS0tLS0tLS0tLS0tO+wMqaoKKViJGeqpOpz9TT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fY2NjY2NnZ2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dna2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2tvb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2d6iXFVeblheXU5aUFROQ0NMSUlJRkpEPEJBPDs4NzY3OTc3OTk9P0E/PDo5QD88PkI/Ojg3NzY9P0BAPUBBPz88PTs7OD48P0VJSEE/Q0aX4dvb29zc3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3tPT09PT0tLS0tLS0tLS0tTIlZyum5m1iX2TjIKBhMTV09PT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tvb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dndmlpYYW5ZYVdPV01QRUJETElNS0ZJRT5CRDg4ODY3OTc1Njk4PT1BPjo4OT4+PD9APzw1Njc2PD4/PjtAQEA/Pj4/Pjs/PkFCRkdCQENIkeLb29zc3Nzc3d3d3d3d3d3d3d7e3t7e3t7f39/U09PT09PT09PT09LS0tLTz6h+kayPko6MhoCIiYSQo8rU09PT09PU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY19jY2NjY2NjY2NjY2NjX19fX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2tra29vb29ra2tra2tra2tna3JJaWWNuWlpSVV5QTDxAR05IUklIRT48SEY4OTc1Nzg3NTg5ODs+Pj07ODlBPj1AP0E+NzU5Njs+QUI/P0BAQUI/Pj8+QUBEQUZIQj9FSozi3Nzc3Nzc3d3d3d3d3d3e3t7e3t7f39/f39/f1NTU09PT09PT09PT09PWtaWaiIuQhYCFi4iBg4qLf4bC1tTU1NTU1NTV1dXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2dnZ2dna2dra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29ra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb2tra29uIWltnalxYTFpfVkg6TEhMSkpDRUVDQExINzo3Njc4ODU4Nzg5PDw7Ozk4QD89Pj8/PDY3PDQ3P0JCQUBAPz8/QT09P0A+QEBGRT09REuI4tzc3Nzd3d3d3d7e3t7e3t7e3t/f39/f39/f39TU1NTU1NPT09PT09PUxZKCg4WGfYGCfXx5foGCg36k29bU1NTU1NTV1dXV1dXV1tbV1tbW1tbW1tfX19fX19fX19fX19fX19jY2NjY2NjZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vc3Nzc3Nvb29vb29vb29vb29vb2tra2tra29vb29zb29zb29vb29vb29vb29vb29vb29va2tvb29vb29vb29vb29vb29vb2tvZgFpebWhaU0ldW1hKRE1ISlNMR0ZBQD9KQjg7NjY5OTc1ODY4Ozo7Ojw5OD09O0A9Ozo2NTw3Oz1CQEFBPD49QEE9PEA/Pz5CREU+PERLg+Lc3d3d3d3d3t7e3t7e3t7f39/f39/f39/f39/V1dTU1NTU1NPT09PT2LKEkKh9g3l2hIh/e3d5gn5+i67A1dTU1NXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dna2trZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2trb2tra2tvb29vb29vb29vc3Nzc3Nzc29vb29vb29vb29vb29va2trb29vb29zc3Nzc3Nvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc1nlcWmxmWFJPYFFSQUhHSkZYTEZAQENDSz87Ozc4ODc2NTc2ODo5PDw6PTs/PTs9Pjw7ODg8OT0/QkFCQzw8P0FCPj1BQkNCREVDQDtDTH3h3d3d3d3e3t7e3t7e39/f39/f39/f39/g4ODg1dXV1NXU1NTU1NPU0ruen3WKeXuIgICChYGDcnOAhYOMrNfV1NXV1dXW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NnZ2dna2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra29vb29ra2trb3Nzc3Nzc29zc3Nzc3Nzc3Nzb29vb29vb29vb29rb29vb29vb29zc3Nzc3Nzc3Nvb29zc3Nzc3Nvb29vb29vb29vb29vc3Nzc3Nzc3Nvb29vb3dByXV9wZVdLUGNPS0JHQ0pIS0ZBPEE9SFBBOjo3Nzg3Njc4Nzw6OD09PD47QD88Pz07Ojs5Ojk8QEJAQkNAPUFAPz1AQkNDQUBAP0A7RU144N3d3d7e3t/f39/f39/f39/f3+Dg4ODg4ODg4NXV1dXV1dXV1NXU18h4i4V8goh6g4SBfoKCc2l0hYuGkJ3U1tXU1dbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tvb2tvb3Nzc3Nzc3Nvc3Nzc3Nzc3Nzc29zb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb297KalxjcWVST1heSz9HTElPS0VAPkFCP0lPPjk6NzY7NzY6Ozc7Ojg6PDw+Oz09Oz48Ojs4OTo4OUFCQkFAQDtAQj06PkFCQz8+PT4/PUZOdN/e3t7e3t7f39/f39/f4ODg4ODg4ODg4ODg4OHV1dXV1dXV1dXV1s6dhpl+f5OTin+CgXx9gnNxm4mAgoOJwNnat7TQ19bW1tbX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tra2tra2tra2tra29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NvfwGNaW21gVlBTU0pETEhNSEk8PkFEQ0ZORDw8OTc5OjY4Ozk3PDk4OTw9OzlAPjpBPzw3NTc7ODpAQUVBPz45PUI/Oz1CQkI6Pj07PT5GTnHe3t7e3t/f39/f39/g4ODg4ODg4ODg4OHh4eHh1tbW1tbW1tbV1tjLioCHhYOXjHh7e3lvfYF1a3ebdHZ7eInHxpiMrdjZ19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2drZ2dna2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tra29vb3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29zb29vb3Nzc3Nzc3Nzd3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3Nzc3Nzc4LdjV1lrYlJNVVFMSktGS0ZDQD5CQT9FTT4+PTg5OTo3OTo3NT03Nzo+PDs7Qjw5Pz05NjY4PTk6QEJGQD49PEBCREA9QD9DO0A9PD4/Rk9t3N/e3t/f3+Dg4ODg4ODg4ODg4OHh4eHh4eHh4dbW1tbW1tbW1tfVrYZ6d32rn3l4entzdH+Dfm9xe3l6c3t2k4qFgImkzdnY19fX2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tna2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29vb29vc3Nzc3N3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vc3Nzb3Nzc3Nzc3N3d3d3d3d3d3dzc3Nzc3Nzd3d3c3Nzc3Nzc3N3d3d3d3d3d3d3d3dzc3OGtYVtebGJSTVZMTUdLS0RGQkI7QT08RUxCQT44Ojk6Nzc5NjY6NTs+QDs9Oz89PD89Ojk5Ojw5PEVDRkA/PkBDQkQ9OT0/QT1CPz1APkdPadvf3t/f3+Dg4ODg4ODh4eHh4eHh4eHh4eHi4uLW1tbW1tbW1tfQmH+Qh4N9eoN2e3Vzenl6kKqmd3JyfoeHh4CAfoKEhJHJzNnX19jY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra29va2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2djY2NnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vb3Nzc3N3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzb29vb3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3dzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3NzhpV9UYm1iUE9TSUhHRkpJSUJBPkJCPEVFREA+ODo4Ozc3Ojc4ODY+Pz07PDk9PDo+PTs6Njc7NjpEQUY+Pz8/PkNBPzs9PT47REM/PjxIT2fZ4N/f3+Dg4ODg4eHh4eHh4eHh4eLi4uLi4uLi1tbW1tbW19jYyH52doN+fnR2eIaCenl1d5yhu6GEgoCAfoeKinx/gYaMnKjO2NjY2NjY2NjY2djY2NjZ2djY2NjY2dnZ2dra2tra2trb29rb29rb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3d3d3d3c35pbT2drXFBRUElDT0pLR0xHSkJAP0JHREBBPDg8ODg1ODk3Njc3QEA/Ozw5Pj04PTw8Ojc4PTk/RENGPkE/QkBDPzw6Pj0/PkVEPz07S1Fj1+Hf4ODg4ODh4eHh4eHh4uLi4uLi4uLi4uLj49bW1tbW19XB3LRueHJze3B6eXaFiIR7eH2AgZiljH98fnuRhZaLhoGDgY6Rvd3Z2NjY2NjZ2dnZ2dnZ2dnZ2dnY2dnZ2dna2tra2trb29va2tva2tra2trb29ra2tra2tnZ2dnZ2dnZ2dnZ2dna2trZ2dnZ2dra2tra2tnZ2dnZ2dna2tra2tra2tra2tra2tra2trb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t3d3d6NWFdobllQUUtISlNJTUhNSUtBQz9DRkJBRDo6PDg2NDg4NzY2Nj8+Pjo8OTw7Oj09PDw4Ozw8RERERT4/PkI+Qj84PT8/Q0NCQEE+O0xUY9Xh3+Dg4OHh4eHh4eLi4uLi4uLi4uLi4uPj4+PW1tbW1teslLZ6eHJvd5V7dHuLgHh1bn6Fg3t/hYhyfH2bnI6JioJ+g32Hk5rH1NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2trb29vb29vb29vb2tra2tra2tra2tra2tnZ2dnZ2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2trb2tra2tra2tra2trb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d7Zf1lgaGxcUUtHR09LTk5PTURGQkg/Q0hEREA6Ozs4NzU3Nzc4NThAPkA7PDk8Ozw+Ojk7OTk7OUZERUI8QD4/PEBDOz5AP0A/Qj8+OjtKVWPV4eDg4eHh4eHi4uLi4uLi4uLi4uPj4+Pj4+Pj1tbX19vKhYR3cXJubniVhHt4hH95dnB4c3eLkY6CdnN9ioaId3d1d4ODfIiIk8Pb2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2trb2tvb29vb29vb29vb29rb2tra2tra2tra2tra2tnZ2dnZ2dna2tra2tra2tra2trb2tra2tra2tra2tra2trb29vb29ra2trb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f0nVZaGlqVk5KSE1OR01EUElGSD9FPUZMREM+Ozs8OTc3OTY2OTU4Pj4/PTs8QDs9PDo3Ozc5OThHREVCPUE9Qj8+QDw/QUE/QEJAPjs8S1Ri1OLg4eHh4eLi4uLi4uLi4+Pj4+Pj4+Pj4+Pj49fX19fEknuJf29sbnV2foSBg4qGfnVybWVtiIaKjoR7c4OHint4e4OPj4GEioqxztrZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29zc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tvb2tvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3dzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f3t7e4clsW2pqalNOR0hOT0VIRk1JSUA7RD5ISUA9PDo6Ojg2ODo3Nzk0OD08PT07ODw8PDw4Njc4OTo6RUJFQT9APEI/Q0M+PkNEQUBAP0A8PUtRYdPj4OHh4uLi4uLi4uPj4+Pj4+Pj4+Pj4+Pj5OTX19fZqXaFfnx3bHB3eXh8jH2KhYB3anN0d3p9bot7fnl6foR/gIGDfnh8foeGlrbT2tnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra29ra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/e3uO9amFpa2lRTkZNTEtKWE1OR0FAQE9BRD9AOzw4OTk5Njg2NjY4NDs+PD07OTY6Ojk6OTU4OTg5OkJERj8+Pj5AQEBCPzxBQD88Pj9BOT5KT17S4+Hh4eLi4uLi4+Pj4+Pj4+Pj4+Pj4+Tk5OTk19fX2sqKhIB5c29tcXN1d4CUeHaAfHWHhXd1cnWgmXp7d3Z5doR0bWxue3iAmouTu9za2tra2tra2trb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc29vb29vb2tra2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f397js2lpbmloUFBPTExPUk9LU0Y/RURERD48PDg7ODc5OTU2ODY2NzM6Pjs+PTc6Pjk5OTk2Ojo4NzxDRUc/Pzs/PkA9PkE9Oz0+OUFAQDhBTlFc0OTh4eLi4uLj4+Pj4+Pj4+Pj4+Pk5OTk5OTk5NjY2NjauY6AenZ1bmpveHCBfWt0cnZ3hIV5h4d5lY55eXp1d3pza298gHx2fYh8gLLe2tra29vb29vb29vb29vc3Nzc3Nzc3Nzc3dzc3Nzc3Nzc3Nzb29vb29rb29vb29ra2tra2tra2tra29va29vb29vb29vb29zc3Nzb29vb29vb29vb29vc3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3t7e3t7e3d7e3t3d3t7e3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/f39/f4qpqa2hrZFNQT0ZQVFJOSFJLPkREQ0I7Ozk6Ojg2Nzg1NjY4ODg0Oz88Pzw5PDw3Ozo6Nzo6Nzo9Q0JDPUE+Pzw5PT5BQDs8PDtFQD47Q05TXNDk4eLi4uLj4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTY2NjZ1p5vdntveHh2cG50d3BwdHBzb36Jc3qGhY2EenNtcoB6hn1vg5OBdnx9g4a13drb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29ra2tra2tvb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4N/f3+KgbWhma2ZVVlJHUFFOS0xMRUJIRUc9OD08Ojo3Nzg2Nzc2NTY3NDg+PD09Ojg6OD46Ozc4Nzc6Oj5DRDtDQj49OD1AQUM/Pjw+RTw+PUJNUF/S4+Hi4uLj4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk2NjY3MB2doCCfnp4eHBsdXlya399bHNvdGdoaYB/aWl4c2d+iYl4cIKGe3d9foWKvd3b3Nzc3Nzc3Nzc3Nzc3Nzc3d3c3Nzc3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODflGttZm5mU1NJUFlUTEhGTkZGRUJGPTs+PDs5Nzc4NTc5NjQ1NzU4PDs9Pjo6OztAOTs7ODc6OTlAQkE8QUE/Pzk/QEJFQ0FAQEM7Oz1ES01g1uTi4uLi4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk5NnZ2tmYc3uqhJaCcnR1dn14aGx8d2h4d25rcHR5gIJ3dHyBhIJ9c3CAin94gn95g8je3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f4N/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh24tubWdzY1lRTVVbV0hDSUZOS0dCRD8/Qjo7OjY2NzU2NzY0ODc2Ozw7Pj86PDk8Qjg3OTo6Ojk6QUFCQUJDQEE+PT9CQ0NEQUJGOTg9REpOYtjk4uLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXZ2drcqHGCtXiRfnNsem6EgXaCfWtoan+DeHZ8dX2FhXRmcHl9d316gIqFe318foC03tzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3dzc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3Nzd3d3d3d3d3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e397e3t7e39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4ODg4ODg4tiFb3FrdWFWT1VVXE9ETUY+SkdKRUQ8P0I6PDk4Njg0NTY3NDc2NDk7Ozw7OD47PEE4ODo9OD04Oj09QEBAP0FCP0A+QENCQ0FBRTc2O0RMTmPa5OLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXl29ra3Z5sbnNxhY1ybXBuf391hH5rcnZ2enN4gXhzbnVwbWt2fHmFiIB/f392coODsd/c3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eDg4eHh4eHh4eHh4OLXhW1xb3ZeUldTWlpRSkhDQFFAQkQ8OT9BOjw5NzU3NDU2NjQ3NTY9PDo9PTk+OjxAODo6PDY7OTs+PUJCQjtBQkBDQEBEREM8PUA3OjxFS01l3OPi4uPj4+Pj5OTk5OTk5OTk5OTk5OXl5eXl5dPOxsB+cWxveHt2b3VuanNzbZKGeG50dG5vdIZ/b2twboJ0bXZyfY2DdnF/d3mKgabf3Nzc3d3d3d3d3d3e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3dzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t/f3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi1oZucG1xYFJZUFdfWUpMTElSP0Q9OTtCRjs6OTc0NTY1NzU0NjY2Pj07Pz45PTk7Pjg9Ozo0ODtAQENCQ0FCRkE/Q0BBQkREOz0+OTs8QkxNZODl4+Pk5OTj4+Tk5OTk5OTk5OTk5eXl5eXl5eW5t7Woc3JscHd6dHd4bXFydXd/hHRyc2xsa3F8bnBudGuBf3GAd32Eg355gHNygYqg2d3c3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh49WHcWxqbF5YWlVXYFZWUE9QTD1BOjs8RkE4Ojg3MzY1Njk2NTg1Nz89Oz8+OT04Ozw5PTs7NTo9Q0JCPENDREREQUE/PkJDQzw9Pjg5PENLS2PN0dnh1sjY4+Tk5OTk5OTk5OTk5eXl5eXl5eXltbW2q3J5cm59f3Z1d2hqaGlwb3Zta2tnZWZxdG15gG5teXd2iHhxa2podXV5dHV/wd/c3d3d3d3d3d3e3t7e3d3d3d7d3d3d3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHi4uHh4ePVhnFwY2lhV1NZV19MUk9STUtAPjg5O0E+ODc5NjQ3Njc6NjY2NDk+Pzo8Pzo/OTo6Nzo9PDk5PEFBPTtBQ0VDRkA+Pj5BRUQ+QEE3OD5GSEpesrW4wbm1u8jg5eXl5OTl5OXl5+fn5+fm5ebm5ra2tbWOfX5weoR1cnZnYmNlbGtyb2ZpbHZtd4Z9hXlsbHd4a3ZwfH14c3V5fHd2h7ng3d3d3d3d3d7e3t7e3t7d3t7e3t7d3d3d3d3d3t7e3t7d3t7e3t7e3t3d3d3d3d3d3d7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4eHj1Yd1bl5uY1pUU1hXS1NLSk1SR0E4Ozs+PDk4NzU2NTY2OTY4NjY5Pzw6PT07Pzo7Ozk8PDs5Oj4+Pjs8PUFEQkNBQEBBP0JDPDw9Nzs+REVKXrG1tLW2t7e2y9rJ3uXl3eDi3tXU1tPU4OPg39+2treuh3t/bnmNenJ1bWNobGxtaXR4enF5enqIh4N6aWh9cWRvcXyGgX55e318e4an2t7d3d3d3d7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4uHh49aGdmxhb19dV1lcWlJQSEpXTEVHPUA9Ozs9OTY0NjU1NTg2NzY3OD87OT09PDw5OTw6Pjw6OTg+Qjs7Pj5AREBDRUFAQD0/QDw9PTU5PEJHRl2xtbW2uLm5ubq9uMPT0r3BwcC6u7y6u8TMxb/Dt7e3hGl1gX1ndYd5Z3Vxa2t5eHB3fH15bWl3e3h3bml1j4FwbHl4d3d9gXuGgnmAoNze3d3d3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODh4OHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4ePXhXJrZ3RhW1hYX15TVVVRVUpMRj9JRDs5PTY2NDc3NTc4Nzc3ODk8PDo+PDg8Oj0+OTs8OTs5P0E8PT9DP0FARUJCQTw9Q0A6Pjw1NDlER0dasbW1tre5ubm5ubm3ubm4uLm5urq6urm5urm6u7e3uX9ucHN6b3B/eXNuc3Vsc3Z4cXFwb2tvcX6Bc2mHhIF9dHOHdW11hYmBgHJ2hafd3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uHj14lxa2xyW1dXXWBUUVVUUFJPSkNATUE9Ozk2NTM0NjQ2ODc3Nzk6Pjs8Pjs5PDo8PDk8PTw7PT0+PUNEREBDQkE/QD48PkE8OD06NjY6QkpIWLG1tLa2uLm5uLi5uLe3uLi5urq5ubi4uLi6uru3uKx7cnhxf3ZzfnBsbXpyZ29sbW50cHt3d3Jyd3pvhpJ2f3x8enZ5fH9zfYdyda3T393d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4eHh4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi49eHb2pxalVWV2FbT1FSUE5XSURESUo/Ojk6NzUzNDk1NzY2Nzg4Ojw7PD46PDo6PTw5PDw9Oz09PDs9REdEQ0E8PDw8Pj5AOzg8ODE1OkFGRVautbW1tre4uLm4uLi4uLe4ubq5uLi3t7i4ubq7t7mqcnB4d3x7e4J3aG5xam9qY2lyf21zcn54dHFsanaAeX2AgH91doB1a4qLgHaR1d/d3d7e39/f3t/f3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f4N/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLi4uPYhm1sdGVWUFxnWE1YU1JRWUVDS1BOOzk4ODc1NTM5NTY2NzY4Nzk+OT0+OTw5OTw7Njg5OTo8QEA9PkBGQEJCQDo+PEE9Pzs7OzYxNjxCR0RQqLa1tba2tre4t7i4uLi4uLm6ubi4t7e3t7e5ure2tIlyd3h9iXxwem99c2hqbGdnbHRscXd0cWx2c3Fxd3FyfHl4g3Z7d2mLkYp9kM7f3d7e3tvY2drZ297f39/e3+De39/f3Nvc3N3e3uDg3+Dg4ODf3t7e39jS397f397e3t/f3t7f3t/f3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLi4eLi4uLi4uLi4uLi4uLj4+Lj4+Li4uPj4+Pi4uLi4+Lk14NoZ3VkVlVkZVdKWllXW1Q9RU1LSD04NzU3NjQzOTQ0Nzc1Njc5PTo9Pjw9PDk7PDk5Oj45PD4/PkFBQ0FFRUQ+OzxBPjw5PDs3Mzc+REhFSqG2tbW1tbW2tre4uLi4t7e4uLi3tra2tra3uLm2traLfXpsbHp/cGx5dm5qaGdlcXp4b2lvb3B1c21zd4Fnb32CgYNyf3lqcHJ6f6ng393Zy8a/vL2/vsLN0tDW3tnc4NfQzcPCw8PH1dfT2dzX1NjX0MfExce9vM/Kz87Y3djO3N3c2t3T0dze39/e397e3t7e4N/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eLi4uLi4uLf4uPi4eLg4d7W29/Sw8rJx9Hb3OLk4eHg2dre1sbExcTN2trf5OHi4trX3st9aWZxYVleZWFNTFRLUlpMO0hNSEZBPTc2NjUzNDY2NDg3NjU2OTw7Pj46Pjk5PDk3OTs7Oj49PEBAQ0RCR0ZCQT08Q0A9OTw7Nzc3P0RGRkaZtrS1tbW2tra4uLi4uLi3uLi3s7W2t7a3t7i5tba3opdxb29waW50dnFmZWNrbmdvcm1mZ2tygWVvdnyAeGRzj39zaHFyaWVlbm+w39HFv7u5ubm5ubq6uru6vc3Gw8e/urq6uru7u8HCvcHFvby/vry7urq5ubq6ubm6w8XDucDDwby/ube/z8/U3tjc3t/g3tLa4N/f4ODg39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eDg4ODg4ODg4ODh4eHh4uLi4eDh4uLi4uHa2t3RwsPCu8XT1uDdydPDrrnAsaqrq6uwtLbJ0sXRxLG4v7Srq6usr7S0vMzE1c60tLureGxtbWBdYl9ZS1NVVFFQREBRTUhEPzo3ODU3MzE1NjQ5ODQ2Njo8Oz08ODw5Njo6ODg5NzU8PDw/QEFAQkRDQkE8PkI/Pz09PTc1OD5DRUNAj7a0tLW1t7i4uLi4uLm5uLe1sautr7Oxs7OztLS0tqaei2tue3ZxeXhnY2hfcXdha25vaG99b25ja2lseHdsa4Z+bHB6dm1scG95sca8uru7urm5ubq6urq6urq6urq6urq6urq7u7q7u7y7urq6ubq7u7q6urq6urq6ubi3t7i4t7e2tbW1tbi3u8e+w8XHzcS4wMnH0tzZ2d/e3uDf39/f4ODh4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh3Nji4uLi4eHh4OHg3tfGxtHQztTe3tPO0t/SuLi8sq2trKysrrG+ua63rKipqamqq6urqqqqq6ysuKyqqqqrq6urra6urq6urryzrayrpHlub21fXl1dVE1SU1xUSkE/UElIPjg5NjgzNzMwNTczNzg1NzY2Ojw/PDg5Ozo6Ojg5OjY1OTs8Pj9EP0NFQkNCP0BAQT9APjw3ODc6QUVEP4W4tLS1tbe4uLm5uLi3t7SurKuqqq2urq6vsLGzs7WjcG5ucm1wg311aWFlaGZkY2Rxc21td25naW1tZXBzb29zcXN8h4F6dX11n7u6uru7urq5ubm6urq6urq6ubq6urq5uLm5ubm6urq6u7q5ubm5ubq6ubm6ubm4uLi3t7e4uLe3t7a2tbW2tra1tbW1tba1t7e3t7rBvrzGycrb3+Dg3tvd3d7h4tDW4uHg4ODg4ODg4ODg4ODg4OHg4OHi0768zNjd3OLg0dnbxL23sLCxsa+zu7uzsLS9s66urq2tra2sq6qqqqmpqKmpqampqqurqqqqqamoqampqampqaqqqqytrq6urq6urq6sraR4aWJxZmFZWlZRUk5cU0Y9QlJEQTc8OzY5NTY1NDU2NTk3NTY1Nzg7Pjw7OTk5Ojg3Nzk3Njg8Oz47RD8/Q0BBREE+P0M9Pjw+Ojo3Nz9DRj54srCztLW2t7i3trKurq2sq6uqqaqtraysrq+xs7S1t4xucnRqaIB5ZmpmZWxdaG5waGxxYmNmcoJ+dmhobGpueoaBhXx4cXF5gK+6ubq6urm4uLm5ubm5ubm5ubm5ubm4uLe3t7e3uLm5ubm5uLe3t7i5ubi4uLi3t7a2tre3t7e3tra2trW0tLW1tbW2trW1tre3t7e3t7e3tre4v8bP0MS+v8DE19e8ydra4OHg4ODh4eDg4ODh4eDb3t7Uzby3tre6wMDJxLfIvrKwsLCwr7Cvrq6ur7Cwr66urq6uraytrKurq6qpqampqampqampqKmpqKmpqampqKmpqKmpqqqrraytra2ur66trK2heWpjbWdiXFhRUFFLVEpCOklRP0E3PDk0OjU2NTQ1NTU4ODY4Njs6OTw9PTs6ODY2ODg6ODY3Pj09PT5BQUVCQkNBQUBBOj09Pz05Ojc9QUc8bKqmqKutsLGwrqupqKqrq6mpqamrrKytra2usLO0tbilgIdvaWdzdGZrcG1qZGxvcm5rbWNrcHyJhG5qbHx4Y3uKfnNqc25rcY+7ubm5ubm5uLi4ubm5ubm5ubq5uLi4t7e3t7e3t7i5ubi4uLe2tra3t7e3t7a2t7a2tra3tra2tbW1tba1tLS0tbW1tra2tra3t7e3t7i4uLe2t7a2uLm4uLe3uL6+uLq9vcfb4OHg2Nnd4eHg3dfKwcPCurm5uLe4uLi3tbS0tLKysbGxsLCvr6+vr6+vr6+vr66ura2srKyrq6yqqqmoqKmppqepqaehpaipqamoop+hoZyip6inqausrK2ur7Cwrq2unXdwbGphY2BZUU1RTFJGQzlNUEU+ODs3Mjc5Njc0NDM1ODg3OTc7OTo9PTw6Ojk3NDo5ODY1OD8/QEI9RENDQ0FDQEJBQDtAP0A/PDw6O0NIPWOopaWlpqioqKenp6ipqqmoqKipqqqsra6wsLCztLW1taWYdn5xZmt4cW9tZmVsaGNsZ2ZpaX11bWlvfXZ5hWZod294b3Fvcninu7m5ubm5ubm4uLm6ubm5ubm5ubi3t7W1tba2tre3t7e3t7a2tba2tre2tbW1tra3t7e2tbS0tLS0tLS1tLS0tLW1tba2tra2t7e3t7e3t7a2tre2tre3uLe2t7i4t7i4uLi4wMXTyry8w83PyMC9urm5ubq6ubi4uLi4t7W0tLSzs7KysrGwr6+vr66urq+vr6+uraysrKurrKysq6ehoJ6gn5udoaGdlpmkpKaon5mZmZmanZ+gn56fpKqtrq+ura2srJl1cGlrY2FeXVVOU0tSREQ4TktHQTo4NTI2OTY1NDczNzc3ODk3OTo7PT0+ODg4NzU6OTk1OD9AQEFEPkZBQkNAQkNCQT88QEJCQD0+OjpERj5cpqWmpqampqanqKenqKioqKenqaurrKytra2ttLS0tbekc311bnONf3JmanFjaW1jaGZobG51aV9jZ3VzdnpuZ3Bwcn56cYihu7m5ubm6urq6urm2s7a1uLm2trW1tra1tbW1tbW3tra3tra2tbW2tbW1tbS0tLa2t7e3tbS0s7O0tLW1tLS0tbW1tra2tra2t7e3uLe3tra2trW2tbW2tra2tra2tra3tra3uLi3uri4uLi3uLi5ubm5urq6urm4t7e3t7W1tLS0s7OysrKxsbCwr66urq6urq+vra2srKuppaSmpqScmZubmpmampmXl5eXl5aZm5iZmJmZm52en5+dnJ6gpKWko6OioqKQdG5jcGFeXltUU1RIVEo/PFFCRkM7ODYzNzo1NTQ4Mzg5OTc4OTc7OTs9Ozc6NzU2OTk4NTg+Pz9ART5CPz9DPzxBQUI/PT9EQT8+PTk9Q0Y/VaSlpqanqKeoqamop6ioqKioqKiqrKuqqaipq7W1tba5o3eKcXKHhnd0cGh5a2JjYWVsaW5zal9jZWNjZWprYmRqbHaXjX6ovbm3tre5u7u6uLWxrKurqq6wrKyrq62tq6uvsLGvr7CytbW2t7W1trW1tbW1tbW2trSvr7O0tLSvra6vsrW0tbW1tbW2t7e3t7e3t7e3t7e3t7Owsra1tLa2tre3tra2tbW1tra3t7e5uLi4t7e3uLi4ubq6urq5uLi3t7e1tbS0tLS0tLS0s7OysbCvr6+vr66vr62oo6KgnJqampqZmZqbm5qampqbmpmZmZiXl5aYmZmZmpycnZ+foJ+goKChoaCgoJ+fi3RuaXRdYGZeUlRLRFRJPUVTSEVCOzo0NDY5NDQ1NzM4ODg3ODk5Ojs7Pz04OjkzNTg5NjM5PT5AP0A6QEJCQkA/QEJCPz0+QUFCPz06PkVDQFGjpqWlp6inqauqqKaoqKipp6ioqKinp6ioqaq1tbe3t7KZtH99kIx1Z2lqbGZjYGNoZW94cGlicXx5cGpmZmRma3NqhYystrKwra2ttLeysLCtrKuqqaiop6ipqampqKinqKipqaeoqqurra2sqqytraysrq6traunpaSnqqyopKOkpamwsbGztbW2t7i3t7W1tre4t7e3t7Kppaasq6ivtLa1s7W3t7a1tbW2tra3t7e3t7a2t7e3t7m6urq5uLi3t7Wxs7S0tLKxsK6sq6yurrCxsK2rqqmqqKijnJqZmJmYmJiYmZmZmZmZmpqZm5ubnJybmZeYmpqcnJydnJ2foKGhoqKioKGgoKCfnop1amtuWVxhVktPREdVRz5PV0hEPTw4MzQ0ODQ1NDgyODk4ODk6Ojw5OUA8Njk6MzY3OTE0PD8/QEBBOkNGRUJBREJDQTo7P0FCQz9APUBEQ0BPo6empaemqKqqqqakpqenqKioqKimpqaoq6uttba3t7e4rbJ1cHuDdmBiaWtiZWZhZGdmfYh5bHKAfXFvcXhjbW5xZo+srKurq6ysra6urK2trKyqp6WmpaWlpqioqKiopaeoqKioqKeoqamqp6Wko6KioqOioKKioaKhoKChoaKjpKOjpaWlqLC0s7OzsKuqqaqztLa3trGopaOioaGipKiqqairs7Sxrq6xs7W2tra3uLi3t7e3t7e3t7a2uLe0sa6ppqerrKmnpqWkpKSkpKWnqaajoJ+enZycm5uampmZmJeXmZmZmJiZmpqampqampqbm5mYmpydnZ2dnZucoKGgoaOjoqCgoKCfnp2FdGtsaFdYU0pHTUVITUdAU1dGRz09OTM2Mzc0NTU3Mzg6Ojk6OTw9OjpBPDY9ODM3ODgzNztAPz9AQDpCRUNAQkRDQT87PEBDQkNBQDxBQ0A9TqKnpqanp6mqq6mkpaWlpaaoqKippqanqKmpqrW2tre3t7izc2h7c2JnamtpaWJhZGloXV1tfHJma3J/fHR8bm1zc36gqamrq6uqq62trKusq6mpqKWjpKampqWmp6eqqaamp6enqKinp6iop6WkpKKhoaGhn56en5+fn56foKGho6Wko6OkpKSmp6enpqWkpaampqeqraumpKKhoaChpKWlpaempaeoqKalpaivtLa3trW0tra1tbOwrKupqa6rqKWlpqampaSkpaWlpqWkpKSkpaKhoaGgnp2bm5ucm5qamZiXmJiYmJiZmpmZmZmYmZmZmZqZmZydnJycnJybnJ+fn6ChoaKgoKCfnZ2cgHNrbmReU0pITUZETEtFRFFTQ0c9PDgzNjI4NDY0NjQ4OTg6Ozk7Pjw5PTs5PTczNTk2NTY8QD0/QD88P0JDPkJCQj89Pj5CQ0FFQD86PkVAO0+jpqWkpqeoqaelpKWlpKWnp6eoqKanp6alpqa1tba2trW2uYptcW1vfHxxZ2pmYGFsYFROW2hqbm9tgYJ9cWdxdn6aqKeoqqmpq6urrKqqqqimpaWkoqOlpqalpaWmqaqppqWjpKWmpqSko6Kio6Khn5+fnp6cnJycnJ2dnJ2en6CioaKjo6KhoqKkpaSioqOjpKSjpKSko6Ggn6GipKanp6ipqaelpaSipKSlqK2wsKyrqqusqqmnpaWmpaWlpaalpqioqailpaWkpKSlpKOjpKOioaGhoqKgnp2cnJubm5qZmJiYmJmam5mXl5eWlpeXmJiZmpqcm5qampubm5ucnJ6goKGgnp6enpycm356bnJiXlNNSlBFRk5NQkBPRT5JOz01MzYzODM2Njc1Ojs4OTs5Oj49Ozo5OT03NjY5NjU2PkI+PkE/PT5DQT5DQ0BAO0BAQkJCRUA+Oz5FPzxQoKSjpKOjo6SkoqSlpaSlpqamp6empqalpqaltLW1tbS0tbiBaHx9ZXOCemxwdWFfY1ROT1FbaGxpbGxxbW5xbnScoqSnqKioqauqqqqqqaempaSjo6OjpKSlpqalp6ytqaShnp2epKShn56foKCdnJ2dnJycmpqam5ucnJubm5ydnp6foKChoJ+goaOioKGjpKSjoqSlpaWkop+go6SkpKapqainpaGdnJ+jpaipqainqKioqaempaWkpKSlpqampqampqenpaWko6Ojo6KioqGhoqKhoqOkop+enZ2cmpubmpqZmJeXmJaWlZSUlJWVl5iYmpubnJuampqam5ucm5ucnp+fnpucnJyam5p/fnF0YFtUTUdNSEZMSj8/TkM8QDs8NDM4Mzc0NzY3ODs9ODo6OTk7PTs7ODk9Njc4OTU4OD9APT9BPjs9RD89REA/PzpAQUE/QUVAPjw8Qz88Tp2ioaKioKCipaSkpKWlpqenp6empqampaampbW1tbS0tLS3jHalsXdmc3Jvc2xjZGlYT1JRT09dgG1kYFptkZGSoqKjpaampqenqKiop6alpaOioaGhoaKjpaempqesq6imoJ2cm6Ghnpubmp2cmZiam5qampmZmZubm5uampqampucnZ6goaCfnp+hoJ6foqOko6Omp6inqKWioKGhoaGkpaWlpKCcmZmbnqOmpqampqanpqempaOlpKWlpqiop6enpaWlpaWkpKOjo6KhoqKioqKhoaKjo6Kgn56enZybnJubmZaUlJSTk5OTk5SUlJWWl5qam5ubm5qZmZqanJ2dnZ2dnZuampqamZqXf3dvc11aTkhKTkdFRklERU5APD09PDQ1OzQ2NDY1Njc5Ozg5OTg5OTw7PDc6Ozc4ODg1ODg/Qj9BQTw+P0A8PEJAQT49QT4/Pz1CQUA6OkA8PE+doqGfoJ+dn6OkpKSlpqeoqKenp6ampqampqW1tLS0tLS0tbSXtqd1Znh2Y2xjY2VjW1JTU1JNXqCMeFhodpajnp6hoaOjo6OjpKSlpqalpKSioaGko6OjoqOlpqamp6enp5+bmpuioJqWl5Sam5qXl5iZmpqYmJqampqbm5qZmZmenZ2goqOjo6KkpKWinqGhoaKjpaampaSjoaCgn5+hoZ+goJ2amJiZmpygpKOjpKWmp6alpaOjpKSkpKWnp6ampqampaWmpKOjo6SjoqKjpKGfoKGhoKGgoaCfn56dnZyamJeVk5KSkpKSkpOTkpOUlZaZmpqbm5qampqbnZ6enp2cnJybm5qamZmZlH10bHReWk9IRUdGQkVORT9GOzo+Pzs0Njo2OTM2NDY4ODo4OTc4ODo8Ozw5Ozs6OjY3ODk5Pj9APjw9QD5AOjlAQT89QT8/QUE+QUE/Ojk9PjpQnaCfnZucnJufoqOlpaWlp6iop6ampqanpqantLS0tLOysrGwsK2rkHiGj36bmn93Yl1TUlFRTGKgootaiKCgn52YmZycnZ2eoaGgpKenpqWkoqGjp6alpaOipaampaanpqagm5mboaCXk5KUmZqcmpeXl5iampmampqam5qYmJmaoKCgoKGfoaKipKamop6gn5+goaOko6Khn56enpyanZuZmpqZmJeZnqChoaKioqKkpaWmpKSkpKKioqKkpaWlpaWlpaalpaOko6KioqGgoKGgnp+fn5+fnp+foJ+cm5qZl5WUlJSTkZCRkpKSkpKSk5SVl5iZmpmZmpqam5+fnp2cnJycmpmZmpiXl5F8cmdxXl1QRj9BRD9KT0JCRjhDRT4+OTg7Nzc0ODQ1OTo6Ozk3OTo8Ozo8PT48PDo2NzY5OD4/QT47Pz49PDg6PkFAQUE/P0FCP0RBPjo4PkE8U5ycm5uampycnaGio6KjoqSmp6alpaampqSjo7KysK2rp6amp6alpqiln6iop6qnoXmEXFFST0xcnKCAYpmgnp2clZOVlpeZmp2dnqGmpqampKOioqanp6ajpaampaWmp6amop6cn6GgmJChrJeXm52YlpeWmJuZmpqampqZl5iam6Ghn56fnpybnJ6goJ6dn56fn6Cio6SjoqCfnp2ZlpeXl5iYmZubnqKioqKioqGio6WlpKOio6SioaGhoqOkpKSko6SkpKSioqKhoqGgn5+gnp2enp2dnZ2dnp6em5mYl5WTk5SUk5KQj5GSkZKSkZKTlJaXl5iYmZqampyenZ2dnJubmpiYmpmXlZaNempmamBiTkY+P0A9SkVAQ0A7QEE8Ozs5Ojc2NTg0Njc4OT04ODs6Oz87Ojs8Ojk6Nzc2ODs8Oz08Ojo8PTw3Oz5DQkRDPz1BQ0FEQT88OkBCO1eZmJqamZmam5ucnp2foqKhoqSlpKSlpqSioJ6op6alpqWlpaemp6ampqakpaanqKehqXJOUU1KVJahenKanJyenJeVlJWWmJiXl5qeoqKhoqOkpKOjpqalpaanpqWlpqelpaOgoKGhn5mZmpaYm5qenJaXl5eZm5ycnJqamZeZm5uen52cnZyZmZqcnZydnp6fn5+hoaCgoaKgn56bl5WVlZeanZ2fn6GhoqKio6OhoaCgoJ2cnaGioqOkpKOioaSlpKOko6SjoqKioqKhoaGfn52cnZ2cnJ2dnJ2enpqXlpaVlJOTkpKSkpCRkpKSkpGSlJWWl5iYmJiam5ycnJycnJ2cm5mYmZiWlJWXi3hsY2RiZFFHQT1DO0tIRDo7Ozw+OTo6OTo3Mzc5NTo4ODg8OTg7OT09Ozo7Ojk8PDc2NDc/PDo9Ozw/Pjw7ODxBQ0FDQkI+P0NAQkFAOj9APztZmZiampqam5ubm5ydoKGhoaGhoqKioqKhn5+dpKWmpqenpaWmp6ampqWkpKalpKSkpaaGUFJQT0+PmHB6mpubnJ6cnJycm5ubmZiYm56dnp6foKOkoqGhoqKipKWkpqWlpKSjoqKhnZycomqJm5yam56amJiYmJqcnpyam5iWmZybnJycnJydmpqbnJ2dnp6dnp6fn52cnJyhoaCblpWVlZacn6Ggn5+hoKKjoqOhnZuZlpaWlpicnqCip6ikoaCgoqOjoqKioKCgoJ+fnp+gnp2cm5ucnZydnJmanJuWk5KSkpKUk5KSkpKSkpOSkpKRkpSVlpeYmJiYmZqcm5qbm5ucnJqZmJiXlZWWl4d3ZGdoZGJNQ0U8RDlJSkU5Ojs9PTo6Nzg6NjQ3OTU8OTY4OTc5PDs7PDo6PDs6PDw4Nzg3Pj07Pj46Qj86Ojo/QURCQ0FBQD9EQUFAPjpAPj06W5qYmZqbmpubm5uen6CgoaKioKCgn5+enp2dnKWkpaanpqWlpqakoqKio6Oko6Kjo6KnllRYVVJOZ21rgZ6am5udn6Cgn56enp6dnJ2dnJ6enp+goaCfn6CgoKGipbapo6SkoqGhnpqZpYFWjpuampienpiYmZmam5qWlZeWlZicnJ2cm52dnpybnJ2cnZ6bmJqeoaGdm5udoKKhmpWVlpaZoKKfnZueoaKjop+em5eXlJKSlJeYmZ2goqenpaGgn56goaGioaCfnp2cnJubnJubmpqZmpydnJmXmZaVk5GQkJCPkZKSkpKSkZKTk5OTk5OTlJWWlpeXl5manJubnJucnJqamZeXlpaVlZSEcmZsYmRbREJMPT84RktCPEA+Pj05Ozk6PTg1ODg2Ozg1Njo4PDw7Ozw8Ozk8Oj09OTU4Nzw5PD88OkE/Ojo6QEBDQkRBQ0A/Q0FAPj08QD09Ol+al5mamJeYmpycn5+foaGhoJ+fn56foKCenZ2lpKSko6OioqOjoZ+foaGipKOio6SiradXXl1UV19ua42dmpqbnJ2dm5ucnZ+enZycnJydnZ+goKChoaGgoKGgoKeqsKigoaCenJuanaJZXZSam5yZnJ6ZlpaWl5eTjo6QlJabnJuam5udn52cnJycnJ6dlpSZnJ+in5ycnZ+hoJuXl5mZmpycnJubnZ6fnZqXlpaWlJOTlJiampqfoKGmpqWgn56fnqChoaCenJubnJybm5ybm5qZmJmZmZmXl5iVlJKQkJCQj5CSkpKSkZGTk5aYl5STkpSVlJWWlZaZmZmam52cnJyampmXlpaWlpaQgG9vZV5gV0BKSDg/N0lFP0VBPD07Ojo8Ozs3NTs4Njs3NDY6Oj47Oj0+Pj07Ozs+Ozo4Ojk5NkBBPTo8PTo6OT9BQ0JERUM+P0FBPz8+Pj89PDtgl5WXl5aVl5mbnqGhoKGioqCenp6enqCgn52bpaWkpKSioKCfoJ+dnZ+hoqOjo6OkobCjXWVkYGFua4GenJubm5ubmZianJ2enJubm5ycnJ6ipKGeoKGioqKhoaCmooCrpZ+enZqZmad/VWaVnJ2em5manJiXlZWWkY6Nj5KYnZycm5ycnqCdnJucnJyempWVm56foZ+dnJyenp2cmpqampqampqbm5qXl5aTkpWVlpWTlZaam5qanZ6foqWjnp6fn5+en5+enZ6fnZycm5qbmpqbmpiZmJiYmJiYlZSTkZCRkJCQkZKTk5CRk5SYmZiVk5SVlZWWlZaXmZmXmZqenpyamJiXl5aWl5eYjX1ubV9lVlRFSzw3PjdSRUM+QkE4Ozw7OTg6ODY7Nzc6Njc5Oj0+Ojw8PT49PD06Pz06ODw9OTtAPj4/PT45OTs/QkNAQ0VDPT9DQj5AQD5APTw8YZWSlJWWlpeanJ6goKCgoaCgnp6enp6gn56em6WlpKSioJ+fnp2dm5mbnJydnp+gn56rmGNpbW5pZm2enZybm5ybmpmZmZqam5ucm5uam5ygo6SgnZ+en6CgoKCgn6p3dq2inpyampyka2FplZyfnpyZmJqamJiYmJKOj5OXnJ2bnJ2cnJycnZycnp6dnpqVl5ygoaGfnp2eoJ+cnJuampqbmpqYmpmVk5OTkpOWl5eVlJiYmZucnJydoJ+gnp6enp+fn56en6KjpKKgnp6cm5qam5uamJmZmJeXlpWUlJORkZCQkZKTk5OSkpOUmJmYlpWUlZaWlpaWl5iYmJiXmZqamZeXl5aXlpeWl4l4dmddX1dURUU5OTs8WT5AOEI/OTw8Pjk4Ozg6Ozc5OjU4OTs9PDk9Oz0+PD0+Oz8/Ozk+PDw+Pz5AQUE9ODc7QkNFP0FFQz1AREJBQEQ7Oz47PGKWk5SUlpWUlpiYmZubnJycnZ2cnJ2en56dnJqkpKSkoJ+enpybm5qZmJiYmZucnZ6cpolla3R4bVuFop2dnJydnJqbmpqampydnZ2bmpuboKKinpucnZycnJ6fnp2ojGmMq5ybm5ygl25pa5adnZ6cm5qanZqam5yVkZOXm52dnJ2fnZycnJycnZ6fnp+cl5idn6GhoJ6cn6CfnJubm5qbmpmZmZmZl5WWlZaYl5eXlpaYmZuenp2dn6GhoJ+fnp6fn5+dn5+hoqKhoZ+fn5yZm5qcnZuampmXlpaYl5eXlpWTkpGTlJSTlJSUlJaZmJaVlZeZmJeYl5eXl5eYl5iXl5eXlpaYl5eVl5eDeHZfW11eUT1GOjk4P1VDQTtDQzo8Pz86Ojk3Ozg4ODc0ODk8Ozw4Ozs8PTo8Pjk/QT06PTw+PkA/PUBBPjk2PERDRUBBRUU9PkVERD9COzo8OTpkl5SVlZaUlJSUlJWXmJiamZqcnJydnp6dnZybo6Oko6CenJuamZqZmJiYmZiam5ubm6WJa3F2em9lmp+enp2dnJybnZ6dnJ2enp2dnJydm5ygoJuampubm5udnJuao5F5dZ+cmpydoIhraWuSn5ydnpybmp+fm5ydm5mZmZudnZ2dn52dn5+dnJydn5+fn5uanZ+goJ+dnJ6gnpubm5ubm5yampuamZudnJqZmJeYmJiYmp2foKCgoJ+hoaGgoJ+en5+fnp6foaKhoJ+enp+enJqam5ubmpqZlpaXmZmYmJiWlJOUlJWVk5OVlZSVlpWVlZSYmZuamZaWl5WWmJiWl5OUlJGRk4yRkJOWfXhqYWJiXFA8QDw2OENWSERCOjg7Oj47Nzc5Nj06OTk2NDc6Ozw9OTo6Oz87PT08QD47Oz46PT89PkBBP0A8NztBQ0U/P0REPj9EREM+Qj07PDs6Z5aTk5OTk5OTlJSVlpeWl5aWl5mbm5ybm5uamaOjoqCfnpuamJeYl5eXmJmYmZybm5qkgGpqb3lzcZegnp2dnJydnp6enp+enp2cnJydnp2bnJuampqam5ubmZmamqOUeHyFmJqcnpl9amdskp+cnJ2cm5qdn5ucnJubnJubnZ2dnJydnp2enZydnZ2cnJ2dm5uenp6dnZybnpubnJycnJydnJubmpmbmpmYmZmYmpmZmpyfn5+jpaKfoaKioaGfnqCgn5+fnqCioaGhn5+fn52ZmpucnZqZmJWWl5aVlZaTkpOUk5STkJCSk5GUkY+OkJGOlZabmJWYlJmXlJiRjJCPk5yTkoyFjIeDhndxZ2pkW1xRQT44NkJHYEJFR0A+Ozw7Ojg4NjU8ODo4MzQ6Njk9PTk5Ojs9Ozw6PD48Oj5AOj5APjw/QD8+PDg6Q0FEPz5CRD8+Q0VCPUJAPDw8OmeYk5KSk5OSk5SVlJWXl5aWlZaXmZmZmpqampqkoqCfn52bmpmYmJiXl5iZmJmcnZ2cqH1nZXN7enOJop+enp2dnp6enZ2enZ6enp2dnZ6cm5ybmpubm5ycm5mZmZqgnIuegH6YoJyFjYFmbZSgnZ6dnZybm52bnJybnJ2dnZ2dnJ2dnp+fn52cnZ2dm5qbnJmZnJ2dnZ2dm5uanJ2dnJycnp2dnZybmZeVlZeXmJqam5ubnZ6foqOhoKGhnJucm5ubnZqcmZycn6CfnZiZmZmUkpKUl5SPj4+OkYyNiYuQi4mLjpGRj4mQmJiQkoyNi5KQj5iYoqiqpqWlrKOmoZqep6eyqKKVo6Cfl39wcWlsXFtcTUY8NzdHR1g+SE5URjk+Ojg5ODc1PTk4NzMzOTY6Pjw6Nzo8Ozo6Ojo8PDs/PjtAQD47PT5BPDw2N0A+QkA+QUY+PEFEQT1DQj49PDlmmJSTk5OTkpOUlZOVl5iYmJaXl5iZmZqampqaoqGfnp2cm5mYmJiYmJiYmZmZm5ybnKx/am16f3lxh6Genp2cnZ6enp6enp6dnp2dnZ6enJubnJubm5ubm5yZmZmanKehkXFlpqyhaIGNeWuXn56fnp2dnp6dnJydnJ2dnZ6fnZ2fn56goJ+enZ2dnZybnJ2em5qbm52enZ6dm5ubnJ2cnp2cnZqYl5SRjo+QkJGVmJSWlJiZmpudmJuYlY2Mjo6TkpKRj4mQjpGRjo+Ki42NjYiIi4+Lg42NkY+MkI2Qk5WVnJihoJySn6SipKmam5eanKOprb3Bwbq8uL26ucC8ubq3uru7tL2zwbV/bnVmZ1peWUxJRTo7TElTPFZSSUM6QTo7Ozc3NTo6OjgyNTY4Oz08OTk7Ozw5Nzo4Ojw6PT85PD8+PDw9QTs5NTg8O0A/QT9EPTxBQkA8REM9PT06YZOTkZCUlJOTk5OTlJeYlpeZmJmYmZqbmpqamp+gnp+fnJqZmpqampmYl5iZmZmZmZmphXB1e4B3b4mhnp6enp6fn56en56fn56dnp6fnp2dnJ2cm5ubm5ucmpiZmKGtkndlZqaXmlhnfX94nZ6goJ+enZ6hoJ6dnp2enZ6fn56en6CenZ6enJydnZ2cm5qYnJuVmJqamJiYmJmSjJCXlKCXk4+MjYqKiImMiJORh5CPjYqKkJCLjoqMi4+IiImJjpGOjYaFiYaKhoWLiI+SkJCNkJKXlpKamJ2TlJ6kpqaqq7Gsr6+rpquqsbm5tbS0rqyvtMDIxcXBvsbDxMTDurW+t7a0s7C2tb6qcHRyXGZfXl1JRj8/RUtMVklcTEQ/PUI6Qzk5Nzc7OTk3MTc5ODo+ODg6PDw7OTc5OTs9Oj4/OT5BPDs+PD46OTY5PDpBPkNBQT08QkBAPkJEPj8+OVyHhIOHi42KiYaFgYqMkZOVmJiHlZaWkpiampmenZ+gn52ampubm5ycm5iWmJiXl5ibqo56dXZ7f3mCoJ+fnp+goKCfn5+foKCfnp2dnp+enp2dnJqbm5ybm5uYmZenpXhOSnCbhIRSRGF4gp2bm56dnZycoaGfnZ6dnZ2dnp2dnJiWlpaYlZWSlpmWk5GKjI+PjI+NkIuLj4+WiYiEi5GZjn2Fi42PjYyHioyQm4yRj4+Lio6TjIyNjIiSi4yFiYyPhouIh42KhYyEj4qXkJOYmpWbnKOqoaKknKKrsbe0ubWxtK2vsrKlp7O6sbq6vLa3tsDDw729vLa/urq8wbW4wL60r66mqa+3mm58Z1tjWl1fSEU+QUtJU1hZXkFGOTk9OkY/Pzo3Ozs7NjM6Nzo5Pjg6Ojw9OTk4Ozk7PDo+PTtAQDs8QjxAOjg0Nzw7Qj9BQj4+O0NEREBDQz0+PjlhmZWLkYWNj5aSiHl9e3+Fi4OKgoqJhmuAeJCLlpqRnZ2UlJGTlpeampiWk42Sk5KQm5uIdndzcX1/cpGgnZubm5yenZ2eoKGgm5uWlpucmpubnJuYmZqYmJmbmpqXq5lONzx0kn1wUz82YXqOko2SkY+Uk5KXm5mYm5ePjpCLjo2Ch4uLi4qLiI2RjIeHhoqIiZGKh4yEhYqNi4qNhI+UkIyDkJOUmZWQi5OTkZWRlpWOj5GMlI2Oj4qIj4ePhoeJiYmNiomJioWNh46JmJKUmpuXmKChp6Cko5qqqbO2sbWwqKqiqK6tn6qvsK21ubi8wr/BxLixtbCutrOwuL68ury+urOzp7G3wpB1gGNiXlpXUk1IRkVQSVlXX1tDUDpCQz1HRj84Nzo6NzU1OTc8OTw5ODo9Pjo6Nzs7Pjs7PTs9P0E7Pz48Pzo4NDM3OkFBQEI+PjpDREM/QUM7PT45Z6mloqKZn6CippeUiI2CiIJ1h4iKiIp7e3Z7enmPeoiSfn18en6CkYWBgH1zfH99fISHfnRweHZzfHaBj4iIiYeIioyMkZicl4iOhIuNi4iNkZCPi5GPi4yPkJGQlq1zVHBXfLCpmVpnbkhrfYiCjYuGiYp/iYqGiJiRiIOIg4KFfIuLjIaJi4iKkIyIi42PjI+Wh4mLio6NjY2Wk5OdnJyalpycm56bmpuYnpeTkZWWkJKRi4+LlpSMjYqDi4SEiYyQkIqOio2LipGJjZOTk5SVk5KcmZ6Xn6CfpaKvsamupKSfmKStpqa4t6ysu729wsPAv7+vpa2wsLS3uLO0uLa0ta6stK+4tLaBeXpjZmBeVlFRQUVMT0lcXl9UR0dCS0xCREA9ODg7OTU3Nzk3Ozc9PDk9Pj05Ozg6O0A8Oj06PkJBOD88Oj84NjQyOTtCQD9CPj04QEI/PkBEO0A+N2CloJqXnaGaoaCPl5efl5WCjaCfo6GdmpKOjIxycXBvdnFucG1ucHZub29waHBxcHR+c3FycXd7cnl2d3Jyd3Z6e3l8fXt/iIGEi3+PkYaNi4yGiouLiYeEgYaDfpakXIWbfMrFscWdfp16UHiCgpKQhoSEhY2DhIyPj4+IjY+Hi4iRkJWRjpCKk5eOj5WYp6SfnZWYlpaln5udq6aqt7W4srGnr6qnpqGfmp2WkpWVkYqPjImTjZuVjYuLhoaJjJWQkJCLmZKVlZSbkJiTlIyNkYyWl5WilZ6mqauno6OqsJucpp+mq6G0vb6zs7+5u7u6uby9rqiusa6wuLyztLGxqrCpqLGxsqild3J0X2hhYFRWUUlKSFZNXl5eVExKRVFKRUdDPTo5OTc0ODY4Mzg4PTo9PD47OTs4Ojs/PDw+OT9DPzg7Ojg8Nzc2Mzc5RT4/Qz89N0BAQT0/RDw+PThUj4yGh4eUjJWZl5yWmZaNlZyWlZydoKCdmpiWeHFubXJ4cXFsbnJwa3FvcG1yc3t1dnd5fnVxeHZ0d3tybn98gX15eH1/eYOGg4WCg5CLkIuLi46Pi4mJhYKCfn6SkXLP183Vppy5vGtdcl1ngIWOjYuGjZSSi5CXj5SXkpihlp6WlZunpp+goKawq6GjpbW0sqqmqq+isba5vcK7ucO+vLi9uLWxrLCsppuSk5mfm5SPk5WOmp2doJqfn5edo6qsoZ+em62hp6qwqaampJiRkZWUo6SirKSss7Szs6i3tru4sLKvra2yt7a6srW6s7e5u7i8urayr6yxsbKztLOxsa2us7Gzs6yhl3Zxc19jXlJRVE1PSUdYT1pcZFROR1VPRURKRD44Ojg3NTg4ODU5Nzo6PTw/Ojg8ODk5PTs9PTpCPj84Ozo5Ojk4NjI1N0I+P0RAQDY+P0I/PEM8PT46Tn98go6MjJOTl5eaj5SWjZaRkZSXk5qanqGdnHJvcnFxcXFxcG5zcW91dHJxdneAdXd8eYV+d3t8eX1/fICJiYmDfXp/h4GIiYGAgIGGiIKGi4eIhYSIiIqEf4J8mXea0b3H08fBtJx3pahjYoqKjouNkJmclJSUoJqan6Ktsa6ppKWtr6ysrLWuvrmtrqm1sLexq7G2rK+9wsLAvrq8trKutraxtK66u7OurKepp6unoqmtoKmooq+wuLSxvLq6urK0ta+8tLezt7e7t7mtrbCprLW5sbeytLe2sLu7vLu6ury1vLi0wbWsqqqrtLG3uLm1trSzsKymrrCqq7Cxq6yusLKxtK6qo5N4dnJlZ1tMUlBFTUlTV1JlXmdUUExcUUhMUkNBOTk3OTU4ODY2Ozc5Ojs6Pjk4Ozo6Ojw8Pj08RD45Njs7ODg+OTUxNTZCRkREP0A3Pj5DPjpBP0BAO0t/gomXmJSdlpabmIuSlo6XkZGVl5SZl5+bmZx8dHV2dXl1c3RudnJzdHV2d319gX56gXyDfoJ/fYB/hIKFj52RiYF/go+Xjo6HgoCBiIuFfoqRjH+IjY2Li4iSjJtvoqaVuayioYmFdmHIi1qIiomQj42PlJSYkJWcmp2eqK6ysLC1tLOtsrW4sLy1tbGqsKqztbS7t7SztrS1r7i4t62noqassLCvtre3vrW5vLOysa61u7C0r6+yu7axuMC9tLS0s7izvLq2tLrAvbm6ubq+ubm5vrWysa+yr6q1tLGzsbSzrri4tb+vpKaoo6ussa+zrq6wsKytq6qroqKmqKKnrauqpaynoqeYeHlxZmVZT09NSVJNV01PX15cTlVVYlFEVE07Pzk8ODk1ODc1Nzk1Ojo6OTs4Ojw8Oj08Pj4/P0I9ODY6Ojk6QDs1MjY2QUZDQz4/Nz49Q0I5P0I/PjtLjpGTmJmVmZGTopiTkpKLk4uOkI+Vl5ablZSbhoJ9enh2dHRzdH53end2gIKDhouMhISFioaQiYeRk5aRjZaalY+IjI+emJaVkpCTl5qamZGeoZ2Tl5uhmp6co6CdhJN8j6WNhYt3dXBsppdhgY+LmJqPj4yUmpecnZugnaSstLm6vK+2tLi0tLK3uLmzq6+qqKy1srK1rrGrrqa3s7OxpaGotbCvrayrtbqyu7q6tLK3ur67ubG4sLmtqLK4u66ttLS3tbu2trm5vLe0r7G0t7a5s7e1pq2pq6ior6yprq2up6KxtLG0q6aop6Cjq66oqq6orLKwr6+pqKGeoaGjpqOgopqlo56ol3J3bmdiVUpUT09KRFBLX2JYWlFcVGBNSFJJQUA5Ojg2Njc3NTg5NDs5Ozk8Nzs+Ojg8PD0/QkBBPTs2OTk5Oj87NjM3OD5GQkJAQjk+PUBDPkBGQj44R5OWkZWTkpSQkZ+ZnZmVkI+Sko6Mk5aWko6RlZGSkIaBeXJzdXuBhI6HhZGTkpicnJiVkJWYo5yaoaeqqZ+clpeVnaKioZyZnpmlqKyvramnqqqpp6KlqKmsqqqvp5Z+WHKGeXmAbWtpdXh/eHqgoaSem5qkp6Spq66spaSoq6+xtK6qrK6zr6ystLO0ua6urayqrLKwsK2wqKqmsrS0uK6qtrqwr6qurLC3s7i0t7W0u7y4tbWxtauyrKiys7uvrbGytLa1sbG0s7OvrKuvs7a0sayutKqqpqWnrauoqKupqqifqbOwqqeppaOio7CtqaatpairrayppaSioKWipaOYmZyVnqKippdudWVnZFdPWUtLSktTVHBiWWRXX1tcUlpQTEM8ODk6Njk4NzQ3NzQ4Ojw6PDg6PTk3PDw7PkM/QT47OTo5Ojs+PTg0NThBREVEQkM5PjtAPkI/R0Q+N0KSm5SVlZaVj46Wl5qZlZGKk5SSjo+SkYqKiY2Ul5qTjYmCho6VkZSfmpuin5+jnqGhn5ijpKelpaapqa2rqaKmpKilpKGfnqOjra2srairrq6rq6ykoaKlqainq6mFcFJgdHFyemlmYmlrcHyFoqmnoKKhrqyrqqetrqilpKmpqqmmo6iqqaekp66wr7Ovq7Crqq+yr7Czua+rqLCxrrCyubO0r62vtbCss7GurLW1tLSzs7CvrKyqrKusr7G0s7CwrrCwsKyqrauqq6alrrCysKumqbCvqaOkqaunqKaopquwq6mvqaaoqaalo6iwraqpqKKpo6WnpKGhoKKloZ2el5aYlJugpKmUbnNeamlfVlpOUk5RT1NlXGVjW11ZXFBZT0tAPDs5Ojc6ODczNTMzODo9OTo4OTo5Oj08PEBEPkA9OTo8PDw+Oz45NTo8QkFFQUNBOT47P0BEQENCQDdAkZ6YlJeZlpGHi5SSl5GIg4mLk4+OkI2Hh4SFlZmWmJeZlpqeop2ZnKKkoaCdn5qfoKGgpqGgoKCjo6KlqKmrramqpqOmpaCloKaop6aoqaepqaSoppqdpKaio7CYcGlPVnh2dHxoYWRmX19ufYqgpKCgn6GhqKCcn6GloaCmo6KfpKGspp6foaGkrKqnrKivq6e0sa6ur7WyrKqwq6mtrbWwrq6srreup6yqpKivsq+sq7Kvqqqpq6utqa6urrGxraqtqaunp6uoqauinaapqKilqKisqKilpKWop6iopqmsr6+oq6mhoqKlo6Opq6ymqKWjqKKhoKSdnZ+hoZ2bnZ+amZWcnKOqlG9zZm5yZF1dUFVPWE9eZGRsaGJiWlpSVE9NQTo9Ojo4Ozk1MTYzMjg4Ozk5OTk7OTk8Oz0/Qz5APTk7Ojs8QD0+PDk5PEFBRUFGQTo9Oz9BQUJBRUI4PYqWlJOYmpaPiISNjpGSjIiIiI+JiZCRjoqKiJubmZygpaKlnqKjoZqeoZyanZ6bnKOop6ugoKOYoJ2XnKGjo6WjoqKkrKilqaCepqmnq6mkn6Kgo6eipq2nsLKpfGljSVJzdXiBaGBjalpbYmt1g5GdoaCdoKOZlpqYo6KipJ+ZnKGhoqCbmp6goaSgnaejqrGorqusqaSqqquorKalrKqws6+rq6mwq6appaWoq6ynpqevq6Wnq6upq6irqqqrrailqKOmpaesqayoopykoaOmo6qpqKano6SnqKanqKepqKupoaKoo5yepqWjqKino6WlpqmgpJ6inpeYnZ+doqKlnpiUlZ6go5d1d2t2eGJfXFVZUVVXW2Nfc19oX2NTUVlUSD48PTg7OTo4NTM3MzM0Nzo4OT05Ozo5PDxBQEM9PT44Ozw9PEA/Qj86ODo+P0NAREE6Oz49QD9DQ0VDOTyCmJmenZ2alZKKiZGRl5GQh4SJgoGNj4+Sj42cnZ+hpKmlqaeorK2moqKfmKSmo6Stsa6yp6asm56em5qjp6Cfo5+foq+rq6yoqKuvqaiqqaKgoaiprbW6vL2sim1nYUJabnB9fm5hX2ZbWWFhaHB4f42aoKGimZaem5+fpKGblZigoZ2enJudnZuZmZWen6Oonp2iqKGaoaOmoqSoqaqoq7CxqKWlp6eopKWpqaqnoqWmqKadnqWloqClpaOlpqCjpaOjpaelqamqpKekpqKmp6SrqaenpKGlqKynpqWlo6OopJWdo5+bnaCjqaeopqGjo6mooKiioJyVkZqfn6GmopuXkpCamqCVfHdvfXlmW1tgX1pcVlxoZG9jbWlpYl5QUEA/Ozo4OTg8OzYzNDMzMzc5OTs8OTs7OT49QkBAPTs9ODw9QD08PENBPjo4PT9EP0M+Ojk/PEI/P0FEQjk6gJ6kp6Kem5+gmY+ZnaCWloqGj4iEi4qTl5SRo6Wnqq6trLOys7S4t62pqqevtLKxqq6usbKusa2lq7OssbGpq6+rq6y2sLSwq7GysaOgo6uqp665wcbMxbeljnJoaVo/U3BvcWx0aGFhWlhfY2FianF2e4yfp52eoZqWnqScm5aZoqefoJ+joJuUlpmWl5qfoJmVnqGZmJ2dpZ2gpKeqqaiqraylqaSlqqeqqaqsp6SkpKOimZmhnpqaoaCfpaWYnqSmpKqooqelpaGqp6mnp6ejqKWmpaGkqKesoqekoaalpaOVl52Ym5mVo6elpaSfnZ2lo6Kqo5+amZiXnJyaoaGakJOTl5ibjX93cnZ4amJbX19cYllgZG5ta25hX2RgUE9BQDs7OTs4Ojk2MTQzNjQ3Nzc6PTo8Ozk9PUI/Pj89PDo/OTo7PD5CRUA9OTtAQT5DPDs5PzlAQEBAQkM7OXuao6OcoJ2dop2Zn6KioJibmJaYkpSQm5qWl7S0rrW4s7S4tre0uLm3tbm4ub28uKqLnLK4vLS9urW7uru4s7q/uLe5u7G3r6iusq2inaCqtL/O2dvOuquciG9gYWJTQ0p5a2BibWxbW1daWV1bWl5jZmZod4+lr6elmaGko52goaKooaOgpaGck5mYmJmco56cmpudl5uZlqWam5+hqKmpqKuvr66pqKirrKytq6irp6WjoJyfo6Ojn6Cipammmpyip6Spn6GjoqKgpaanpqSooJ+ipKGjoqiop6OloaGopqalo5mbmJuTj6GknqKfmJiVoJuhpaCfm5udnJuamZugmo2YmZiTkYaAdnh4eGNbUllUX19hbWl2a3BoaWliWlNMQDw6Ozg5Nzk3NTU2Mjg1Njc3Ojw7Ozs7QD4/QD0+Pjk6PDk2Nz47QkZCPDg7P0NDRDw+OT43PkFCP0ZDOzhwkpqblJ6bm52Vl52doqajopaXnpaXl6GblJi+t7G4uba3t7i7l5S2vbu9vcDFtaK7mKC3v7+6wcm0nbu2sra/xcGooLa0urGqrrSxsLK0tbzO2t3UwKSKdmVdWVpcU0pDbWqUnpRWVFhXXVxdXVhVV1tpfpWqwce6tqGnqqynq6mlpqCnoKGmoZOWmJ2foqSjnZ6coaChnZekmpmdoKaqqqqtrq2tsLGrrK2sqamrrqimpaalpqSkpqaeo6eppKGcoKKjpqCio5+jpJ2foqWgpJyboZ6fo6GhpaSlqaOkpaKkp6ehn52elpOcoJiZko+MjJeWn5uWnJqdnJqSlpSUmJOQmp2YiouHgIB8gnhhXllUYWlgZnRvdGl0ZGlkYltMSz46OTg5ODg5NzM0NTI1NDY2OTw8Oz08P0E/QEA9Pj44OTs4Njc/OUJFQzw7PD5DREM9QDs9Nz1DQ0BFQjw3Z4yRk4qalZiblZWYm6Knq6aVl5iQlZmhnpeXvrWztLu6ubi5woeYt6u4u8DCxbOjw6e4s72/tMTHvbS7uL62wMTErqCworW2tb2+wcTHw8O5vcDGztHNt5J1ZFtZWldTSVVvqrOmTlVeYWJfX19md5Cnur7BxcW0trapr7Gwr6yqoqajrJ+fpquXmqifpaWfoJydoKuwsKyiq5yYm6Cor7Kys6uorre1sq2tqaalqKulpaStqaShn6Cnnp6mqKmmnp+anqGlpqmcnaObl6KmmpuanZ+cmqGcmZ2eoKijn6GfnaWioKOioZSZmpmTj4qLhI2Qk5uPjpiVm5eYkJORkomNl5iYk4uKi32AgIVwYGJfXmtjYm54dXdubVtiUlZcTUc7PDk3OTc5Ojc0NDQxNDM3Njg8Ozs8PEBAPUA/Pj8+Ojo5Ojc6Pz5FRUU8PT1AQkJCQUE7PDhAQ0NARD87NV+MjIaFlouUlZeYl5ifpqellpWVkZebn5ual7mxtrO5vLy5urWqsryxvsG0vMe5uLuuv6fGw7/KxsnIxcXJvMLHx7+xsKe8vL7FxMbJx8XGu8XBxcbBvrzMxLCRb1xVWFNQU6G1m05ZW11dYG2OqrrBtbmpp7G1q7WyrbOtqa6vp6awr7Ktqq+zpKu1qaeopKCgnqmyuL61tbWqqaausre4t7apq7i8ubexr66noqOop6SfqKOfnqCZoZydoqSnp6GelJuaoKGlnqChnpajnZSQlpiboZqflpORlpSin5qenJudoZ6kn56VnJiPkpOPjImTkJefiZCWkZuUmJGRlZaDjJWXlpKLjIh8foR/amZoYWtsZ251cnJ1cWdeYFxSSUU/Ojo6Nzg0ODw3NjU0MjMzNjU3PDo7PDs9QD4/QD48PTk5OTs6PDw+QkRFPj49QENDQkREOzo4QkJCQUNAOTJbk4iEjZGKi5GRlZCSmp2fnJOSmJSdnZqXmpW2sbm1tb6+tri1uLO8vMTEusPHwb+0s8XFxr/CzcfLzsvLx8HDxsfIysXExcO7vLzBxcHFxL/Dw8bGwbGSv7/OzryVaVhXWkyZuZNMVFlXYH+mvLCmq6yypqqpqautrKmlpZ6pr6uyu7q4u7e5t7O5uLOurLO0qrC1ub3Bur6+vL60urm4u7qysbS8u7q7s7Oyp6Smq6uioaCdmpudmpyXmpuenJygnZaclpuZnZ6io52UnJCNiY6OkZ6bnJWNh5KLmJiWmpybmJybnp6cmp6UjpiYmpSRmZeeoZWYmpKXlJWRlJqYk4+TnZaSi5F+enx/dWtsbmRvbWlxeG96amlhXWdhUUZEQTw5OTc2NDQ6ODQ2NTMzMjY1Nj05OTs7PT47Pj49Oz05OTs7Oz89QUNBQkFAPEBDQ0NFQjs4OUQ/P0BCPzsyV5uQkZCQh4WSjo2IjZCTlZGPjZSUm5STlpqRs7e4uLi+u7C1sri2tbbAw8G+w8LAvru+u7u8xMzEzNDLxsa/xcfLyNTLysjGv7u7vsS+xcjGxsTExLm1wLezvMHGvql5WFVRireGTFNVXYSgprevpa20tK2upaSjp6SgoKWZqrSxvsG+urm6uLW0srG0tLO6wL7Av769u7u9vsDCt7a3tru7sru+ubi3u7a3tKyoqamrpqijnpOampyYkZKZl5GRmJqXnpiWk5acm5+elJOJiX6GiIuWlJiZkYmVkZeWlZmbmpaYl5idnpyhmJWZmZyYl5ybn56jnJ6WmJeTl5yZmZyUlp2UlpOJdnl5e3dua2lodlpncnhzeWZmXmRbUlhJRj87Nzg4NzYxNjk3NDQzMzM2NDY7ODo8Oz08OD0+PDo7PDs9Ozs+PkRBQURCQEBBQkNDREM9OTlCQD8/QD89MkyWmpaSk4yKmJCKi4yOkpKKiIaNkJiKj5CUl7O7tba/vb2xtrjBvby0uL/Bsbi3vsHFvbu8wsbJv8jOyMHEwcfKysbKxczIzcbIxb/DwMvNz8rGxMPEwsW+uL3Bw7/HvZZsUlppWlFSZJSrn6a0sq2suLWyrKmjoa2prKetn6y1tL/Cvrm4vbawrausr7W0ur7Fv7u8urO5u7i5ubWtsLS9u7G/vLiytrmzubu0ra2orKyqqaeXnpualY2MmJSTi5WWlJyZl5WWmZKYn5mQiop+iYqKkY6Vl5OUn5mWkJSZmJmWmJOUm6GeoZiYmp2ZmZaenpibopqdnJuYmpuZlpeXlpyZlJyYfoB4eXV1ZWZpamheam9ueXhjYmFgXlhXRkU4Ojg6OTc5NDQ5NzY2NTEyMzM0Ozo9Pzs9PTo6PTs8Pjo7Pz48QkBDQkJFQj0/Q0NDQ0RFQDk6QkFBQj5CQTVCkJeUlZmSj5qQjpKRjZSVi4qHjI2UiImPkpq2u7S8xsHEwr3BxcLAtLO9v6ywr7rDysPCvs3IxbfByMW/wcLIy8rCwsTJzM3Oz8zDx8bIycjIycfFycfIx7/Ex8TExsnOypxWSE9Qa627t8C9vrm8ury6vKytpqm7urm3v7K1uLLAxrq3t8Gzsa2tqau1s7u2w7a2vbWxt762s7e4sLW2v7uwvbq0q7CxsbO8urOzrqutq62xnaOjoJqQjpiXlZCclpaYlpWSnJmTm5+clpGUjpWQiYyQlZOUm56YmZKSnJedlJmSk5aZmJ2VnJ6do5yVnZ+TnKKcnKCfnaOemJSVl5ebmpmgkH99cXRxb2NhZ3Zpamp0bnlsXWRbVWBZTEhDNjw5OTg4OjUzOjY2NDQxMzUyNTs6PD47Ozw9PDs8PTw7PD49P0E/RUFCQ0M+QEFARUVERUE7Nz5DQkI+Q0I4O4+akZaalJKUjZCUlI6VlI6Pi4yJk4uIkJObt8C6xsXEw8zCwcS9vrWvt7uvr7O6wMfFxMHMy8W2ucDCwsTHytHLwsPExsnFzNDNx8zJwsLHwsvLyMfMyc3FxcXDxcTJy9HTpFJMYLDHwMnNxsTBxMfBvL60sbCwwr6+wca/vri2w8K6urbAvrWyrKmvsri+tMC0tLi0t7nEua+8vrm+v8K/tbq2q6qsrq+wt768trSura2utaSlqKimmpycnZyeopydmZOQkp2VmKCdmJiVmZmZl46MlH2QkJefmZmYk5GToI6Nko+VjpCUlaKdnKSem56elpyjoKGipKOkop6amZubnJ2enIN9cnx4cGdga2p3bGlmdW90Y11iVFdVU01HOjc7OTk3Nzo3NDg3ODQ1MjM0MjU7Ojk+Oj08Pz04Oz05OTk9PEBBQEVCQUJBQT9AP0RFREVAPDk+QkNCQENBOjSAoZeUmZiVkImUk5aTiZGMlJGOiJaKi5CXnMXLw8O8wMPHwbm9vbu4tre3rrK3uLzAwsDCx8bHurzAwsTHyMbSycHDw7+/vsTLyMrLyby8yMfJzcjDyMnJxcXCw8HCxsbGyM6KSZPOzMfM0MW2v7/AwLq7vbWzs8C/ub/DucC3u8G8uri7ub27srCvsKy5wri9ube1t7q9xb24xsjCwcLGwr28tamurrCwr7O6t7m2sK+tr7OppquprqannqSlo6OjoqCblZiekZecl5GRlZeZlZmRlJiSlYyYo5qcnp2FiZ+TfJKWlZKUlJennaCipJ+en56foaGkoqKjoaOinJ2fnqOhppl5enl/cnBmZWdjamRia21ub15ZXVZWTlBKRjk5Ozk3Njc3NjM3ODk1NjEzNTI3PDs8QDs/PDw6ODo8OTk4Pj1APz9GP0JBQz89QT5ARENDQTw5PENBQ0RBQDozbKKdlZedlo+PmJiZmIiSjZGVkI+Vjo6TlpbKy7u5urnBu7q3vsG8vLu5sa61uri4u8S6vsC+vru8wMXBxsK+xsK5u8O6uLm8vsHHwca7ucjIw8XEwMPBwcDEwcK+vcHAwMDFqk6k0czFydHBr729uLm7u763tLG5vrO8vrG5tbi7try0tbm2uba5t7GtusG6vMG/t77Ev8bDw8fHwrvAwr/Cv7iys7O1tLGut7S3tbSxrK2xp6Wlp7CtqJ+nq6ajqKWmpqCgn5SYmZSRkZWUl5OYl5qhnZ6hnKGdoaWglpSbkZeXmJqTnpmZqaSlpKWdoqCanqCkoqOcoqGjoJ6cnp6ppaiVfXuDeG5mYWRiYWNjZGpjZ2NbWlpdWVFPRT07OTo7Nzc5OTY0OTk6NTMxNDUyNzo7OkA9Pzw8OTc3Ozo5Ojw+QD8+RDxCQURAPz49QkRCQkI+OjlCP0FCPT44NVmfnJiTmZaRlZiYmpeQkZCQk5GTlJKSkpSUxce4tbq5wrm5vMPFwri7ubGxtry6tbnAu7u5tre0tLW/u72/ub66urTAuLW3sq66u7fAt7zKz8G7v8C8u8S9usDEv729uLzAxK9TnMzEwMHJv7DBv7q3u765tbi0uLy0vbi1tLCzvLG3t7i/tr25vb65t7q+u7/Axb29y8PGw8TAw762ubq2v7i7v7y4trOyq7CwsrWzs66sq6emnqeurauiqKumpqqjp6iqo5+Ym52bmpicnJiXnJuhpZ2anqGhoKGmoJqbnJiboJ+dnJ+coKiho6SknaKfmqKgop+el6Shop+dmpieqKWhi3x5iH1xZGFiY2hqZ2dpZWleVlZUWU9TTEY4PzY7Ojc3OTs2NTo7PDYzMTM0MTc7OTg/PT47PDs3Njk5ODo7PUA/PkA9PT9CPjxAQUNDQT9DPTo2PEBBQDw9ODdJlJibj5OUkZWYlZGWkpWRkJGUlZSTk5OYlcHCwLq8ub62uL7EwMKxvbqytLO4vLW3vMC8vbS0sbC1t7W7wbi+ub+8vLe0t6+ut7W5v7vB1Y68vrvDtbrHt7a5u7y4ubW6xMmqVJPIv7+7wb65xr3Cv7zFuLa3tLi2tru7uba0t7q1s7i8vbm/ucPAwLu5vLu+vcjEvcfEw7rAvb62sra4srm0usLCureysaysq62yr7Kur6ijpJ6rrKyqpKakpKiqoqemraihoaGmn6Oiop6bnKKfoKOdnJuhn6KgpKCem5eZn6GdnZ6eoaWkoaKioZ6ho5yinqCZnZijn52eoJqZoKKmnYR6g4F5cW1mZWZwamVraFhZT0tLS1JKTEhEOT44PTs2Ojs5Njc8ODk4NjA0MzE3OTk7Pz0+Ojw6ODg5PDg6Ozs7PD1BPj09Q0E8P0NDREA/Pzw6Nz5CREE/QDg4P4mYmoyMkI+Tl5WMkpCakpGXmJaUlJKQmZTDvsbBwby8uLi6v7a8scK2tLyxtLa4s7q9v768sq2vrLGwt7y3u73BxLm3t7a1ubm6u7+8z8V5rcu9x7e5uK22tLe5s7Wyu8XKn1WLyr+/vr28v8jDxcW+xri1srK9uLi4vrq6uby6urS3u7q5v7zEwL+5uri/ubvFxr3Fw8Kyur27sa+2uLO3s7q+wLm2rLGrrqmqqa2qqq6mpKWnrq2ppaOio6GkpaWmoqato6Klo5+ho6Gcmpyhn6CloaCenZygnaWgnpeVmZ2fn52gn6KmpaCknpybn6Ofn5mcmZ2epJyWnKOcnqGcppZ+f4d9a25xZ3FrdGZibmBcVEhLS0RKQ0NHPzo7OD48Nzs7OTc4Ozc8PDYyNzUxNjk8PD08QTs8Ojs6OT45Ojs9PUA+RD89PkRAPz9BRkQ/Pzw9OTc/QUNCQEI5Ojl3nJiLh4uQkpOWjY+TmpOQnZiSkY2PjpiSvbfHvsO+vbu+vL22uri9ure9s7OwuLi1uby7wLeqraSusLi7sr2+u8S2tbi1t7++xLzCxNevdoS+yM/CwLiutbW7vbe5sb7Dx5Rchs7Dwr++vbzHzMfHxMe9tbW2wb27u7/CusDCv7y2t729vcHBwL+8ube8wru3v8W7wr++tbe8vK+vt7awtLO6ubq7r6mtq62rrKaqoqeuqKWqra2vp6Sgn6ajnqKjqKOjq6Oiop6dm5ublJaZnJyfpZ6fnpmYnpejoJyXmZqZmqOjop6jo6egpqCbnaCjnp2WoJmcoKCblJegn6WcmKKQgYaAcmZsam50b3hjZ2JcY1FLVUhFRUNHQzw7OTg9Ojc6PTo4OTs3PD01MzY1MDY4OTo8O0A9PDo+PDk+OTk9Pjs/PkM8Pz5APz4/P0ZEQEE/Pjo3P0BDQz9APTo4ZqGYj4uNlZKVlY6PlpmVl5uVjoyMjY+bk7m2wbS/vLm8w8C+wLq1trKywLmvsry8sLe7tru8qqqjsLm9vLK8vrzFuLG4ubzGycrCx8nRm3R3sdHRzMrEtbq/xMi+vrS+v7+FanrLxsK+wby/w8zKx8XGwLm9vMS/v7/CyL3Hx8XFvLrEv7vBv7rAvLu7wMS9t7nCub69t7S2uLqur7WxsLCytre0t6yurKqsrKuoq6Gms6qlra+trKippaOkp5+io6Onoaeiop6cnZyamYyQlpeZnaKZnpuVkp2UoaCdmZ6fmJimpqKfoqKmoqeloqCko6GbnaCbnKKfl5WVnp6kmpafiYGDgnRvbGx0bGxuX2NeYWJOSE4/RUA/REM7Ozo6Ozo4Ozw6OTw+Ojo+NDQ1NTE5OTo5PDtAPD89PTw4PDs6PDs7Pz5DPkI+QD89Pz9FRUJBQj87Nj9CRUQ9QUE6OlmfmJOSlZqVmpOQlpeclZuZlpSVkZKTnZm2uLaxuru6vsG5uca7trWypb69tLbBv66zvbS4wbGwsbS7xdDCur68xL63vMC/yc/HyMrKwoh2d6jMzMvNysbCw8vOwby4vLmvgnxtvMjEwMC/xMDKycPDxMO5w769ub+8wsbCyc7Hxr66xr26v7m3wLm5vsDCvrW0vLi2u7CvsrK1r7Cvrqyus7CzsrirsbKxqrCrq6yrrLatqKyusqarrKmpoaWgpaakrKSmoaChnqGgnaCMlJeTm5+mmZ6emZOYnZ+gnp2eopuYp62ooqSgoKKqpqmhqKGlm6CgnZ2jn5SYmKKdp6Gfm4J7eoh7bW14fGBxZFteX19UST5DRUlCQz5DOz42OTo7Ozs7Ozs7PT05PTU2NjIxODo5Ozs6QTs/PDw+Nzs8Ozw9PTw9Pz5BQUE/P0FCQUVDQkRAPDY+Q0RFPkJEPztTmZuZmJ6dmqCalpyZn5KdlZ2boJWWlJqYur20sLu8wcTCv8XGura5sqO7vbS3xLuwtbq2ucS4tLy3u7qs28O+tr7Avr66ppyqs7fDwKZ8enyfxMbLyMHDwMDJysG/u7mxo5iKfrDIxcS/wMG/y8fCwMjAusK7urO6usG+wMrOysS9tby8ub+5ubW1s7/Avre0s7S4rbeqr7CwsrGvq6+nr7ausrG5rra2uLSzsLGttrS6sa6srranrLKsraSjoaenqLKrqqWkp6elpaCml5ujn6SmraKeo6KanaWiop+foaWenrC0sKSlnp+kqaevp6mgq6CiopqipJ2anqGmp6+psZWCe32Cem5zeHRocF5cX1xaUUVFRE1JQUQ9SDs7NTk7Ojw8Ojs7Oz0/Oj01NDUxMjc4ODs8O0I8Pz46OzY6PTo7Pj0/QD87QUFBPj4/QkBBQkJFPjo1OkFCST9AQkA7TJqdnZ6fnZienZmampySoJWbnp+blZGRl8W+urbDvMbCvr/Ixbe1uLe2ubu0r7e3srWzt7m8u7a7u8W2ba7Ovba5wLyqfW5obm10gpeZdXt/nL6/xsC5wLy+xcS9vbixr6esl5edysPDvL2/v8PDvr/HvLy/tLSutbW8vr/OzcvCt7K4t7e9ubuxtrLIwLu2tLGwt6yzqbCtrbS3r6uuqrG1r7Gvt7O6usC/tre2sru6wLWyrbO3rLC6r7KloqWrrK+5s7KosK+xr6qiqKGkraitrLOun6inpqWmq6Sknqaqo6ayuLOrpZyfp6anrquqpbClpaWbpKOYn6exrLW4sLKOhHl/fHdsdntxbmlcYGBZU1BBRklHS0BFQ0g8PTY7OTk8Ozo6Ozo9Pzw9NTU2MTM2OTg8QT5AOz1AOzs5PD04Oj08QD46Oj49Pj09PkBCQkJBRD03NDU9REc9Q0I/PEWUnqCgoJyXmpiYlZmdmZ2fmp2bnJaRj5LDwMK9wrzEvLy7xbu3s7e2tru7s6CWtayvsbS0tLa4ucDNsXaCs722tcGkhmlaXmBOU1tccHZ6haS4t8K6s7u3u72/uru7r6KssqKogr7Fw768v7u7uLbBwrW/urWur62wvcC5z8rJw7GwtbS0vbq+urq7ysO7uravsL2xuK+ys7C3vbaur66wt7CsrLK2vbzEwrq9t7bAv8G3tbC2srGzurGxr6err6u2v7e1qbqztbmxp6uop7ausrG1uaisrK+qr7CqqKessayytr20saykqKuoqKusq6i2qaaonqadmKOuvLG7wbSmiYF7gnpzdnZ3b3FhX2ZdW1VKPT8/R0Y9R0NDOTo1Ozk5Pjw8Ojo8Pj4+Pjg4MzE1Nzg5Pj9BPzs6Pz08Oz09OTs8OTs6Nzs+PT1DQT8/QUJEQkE8ODU4PUNGPUREPzw/iZ2en52Xl5WUk5aZnpubmpuYlJ2Uio6Owb7Dwr6+vrm2usCxtbGzt7fCtbOrrbOoqa61r620trnCyaaEeIuhr7WcamZnVllfSUlNUFRve4upsLe+ubK1sry5vLa5vrWWr8CwtXisysPAvb+5s66yvLquu7Szpquorbq+uMvCv76sq7Cvs7q3ub67wMXBu7y3sLXEtb+0uLu0u8PCs7a2sbisqaWrsr23v7+7u7exvL28trGvq6uprbOvsLCrsLSpuMC2sqm0tbC3tq2spqu7s660uMKwsbG1sbK1saywsri4ubi+tLGzrqyxramvrqqyuK6trainoZ6ptr+4ur+wlol9gHxxdXd0d3JsX2NhXF5PSUI/PUlERk1EQDc3NTs6OT48PDk4PT47PT86ODMyNTc2OD8/Qj86OD4+PTw5PDk7Ozo8Ozs6PEA+QkI9QEE/QkI/PDs3OjxBRD5CQz8+QYqgm6GdlJiVlZKYmpyWm5WalY2bj4SIhru0vb+7vLm3s7y8rLOytLS2wLXAr7Kzqqqxt62pubO3v8aoh3t2jKGYX1NDWVVIYmpVT0VKZZGlr6+2urW0sqy8ubi1uMG9jafCsrJ2p8rCv7m6ta6lrLOxprCtqJ2gn6WttrXCt7a0paiqqLC2s7K6tbu7u7W4trC1xLK+vL+8ubrFybq9vraxp6SeoamxrrW5trKxq7S2trGopp6gmaWmpKynq6y2qa+6sa2kpq2lq7GrrKmtuLawsrjBtrGxtbGvu7ayt7W1sry1urKwsbKutLKqrq2nuLWyta2uqqiosrq9wLa0qY6Ce393cHxvdnNuY15nWV1dU09OQT5KQkBLSkA2NjU7Nzg+Ojs4Nz4+PDs/OjkzMjc1NzU8PD48PDg+Pjw8OTk5Ozs7Pjs7OTw+P0E9PEJAPz9CQD47Njc6QERBQ0E/QUKJoJ2loJSWmJiVnqCcl5uYmZGMmYmDhoS1r7S7u7S1sLG2uq6wtLOvtbq1urC1s7KttrqvrbyzuLi/tJCBeYiQbk5LP2VZQk94gZNoTUNehbG1s7WytK+su7q4trm/xXiOuKmfZqu/uLWysa2tn6Smp52kpZyWmZmZn6muuayrq5+lqKSrrq+nsKuvsbGtsa6usLmwtLy+uLm4x8W8vLu4qaKcmJufp6assq6zqaapqq6popqXl5GcmpijnqKir6ekrKaompqemqGnp6anqa+2squ0trCqsK+xqbm2sbWxrqy3s7avrquuq7S1ra+rq7GtsbKoraurs7W3ur2wq6GLeoJ5cnZzbXVqbF1ca1VdW1BOSERHTUJGTkY4NjY1OjU6Pjg7OTc8PTo7PTo5MjM2Nzc3Pjs9Pjo6Pz48PDw6Ojs5Oz47PTk8Pj1CPDtAP0A/QT8+OjU1OkBFQkRBQEJBiJ+ipqGYm56dmqWpmJudmpmUjJmHhoeGrq2uuLmxsqiur7iyq7CwqrK1ubm+tbK4tLm6trm7tbWzt7aVjIiFfFhGQU+HWEpKWXiOg2NBVaO5s7SysLGtsLm4tru3u7ySpLOupHSssKmrraujqKGdnZ6Xl6CVkpaXj5ifqK6ko6Sgoqaio6mpoaanpaqtp6ynqKesq6yyu7SztLm6trK2ramgmpaWm52fq6yqr6Oko6GpoJuTjo+QlJKSmZaanaSloJ+ep5iVkpSZnqSjoaWqrK2iqaqppKmtrqW0sa6xraqprq+wraWmqqSos66trKmmpqmrpqqnq7Ksr7Oxq6mWgX+Bd3J4aHV0b2VVYWRXXVFPTUhASVJETUM9ODg3NTo3PD45Ozw4OTw7Ozw7ODI0ODk3ODs7PDs4PD0+Oz08Ojk8Ojs9PTw6OkA9PDw7QD5CQEE/Pjk1ODs8RkFDRD9BQYijpqKjnqCfp6Coqpufm5yZmI6Xi42PjKqpqLGvsK2lp6ayr6mmq6CvsLu1vby4wMG+vLy8ua6sr7K8qZiZlWhNP1N4cVBJSUtonYBaRVWwurGss6+urK22trK0ta6pp56Zm56fpqieoKipn6GnlpuWl46dlI+Qlo2Xm6SooKCioqKlpZ2jo6CepaCkrKWmqKSio6OrrLOuqa6urqeqraisoZyamJmYm6qoq6ufpqKbo5yVkIyPkJCTkJeVlpifnp6bmaaXk4+Slp2ioKWipqSnoKKko6Ghq6uksq2qrKyno6yuraufoaKkpK+srKmmo6KqpKqqpKmrpqmsq6ahiHiDfHZ/emN3bG5dUWlVUE9HUE1MQ1BRQD47PjQ5OjU7OT07Ojk9OTk8Ozw8OzkzNjk5Njo7Pz06ODs6Pjw6PDs5Oz07PDw9PjxAPT88ODtAQEE/Pz45NDk8N0FDQkQ9QEOOqqSjoqGinaulpqimoZ6dmZ2PmJWTkJWnpKGmqKmlpKChp6uhnKKbp6u1sry9wMLCwL7AuLSnpKyovcKqpbxnRFObfVFYSUthSlaNYmVlg6+1qrK0rqqrr7Cys62lnZGXk4+XoJ+ioJyjpJ+eqJSblpeMl5GNkJeTmJ2iqp+fn6Cjpaicn6ChnKKfo6ionKehoKSfrKisrKCpq6agpKimrKOenp6al5qrpqqxo6WonqCclZOQj5GRmZCWlZiXn5icmZukmZeUlZqdoJ2nqKWgo6Kho56doKmqpa6upqipoaKqrqqnoaCio6msq6eppqShqaKlqaalpKKmpKijkn58f3V2fW5re2RoVlJkTkpIR09TTktOSDxFQDwyPzg1OTs+Ozk5Ozg6PDs7Ozk5NDg7ODc7Oz48Ojk8Oj07Ozw9OTw8PD49PUE+QEJAPTc6P0FCQEA/ODU1PDpAQ0BEPkFGlq6koqWeo6KpqKipqqWmnp2imJiZmZWbop6bnqOioKOgoZqgmJeXlqGorK62t7q5ure3u66ooKGpoKvGv8qfT0F0mHFQbkpMY2Z1dGBdYnSSsq+us7WqpqyropuZlI2RlZaYmJyfoqKcnaSemqSXl5eWkJKRkZOal5ugpKqeoaGepqeqop+gp5+dn6SnqZ6jpp+qnaqtqq6nqLClo6Smp6ymoqWimpmer6iusqulqqqgm5iYmJWTlpqTlZWalpuXl5ihnpyclpuhm56ao6eln6GioqOdm6Gmp6aoraOppZ6kp6mkpaWhpaSsrKmmq6eioKSjpKenoaCgpaKmoIl7gH13eXxleXlgYlNWYUhJSktTVElTUU05P0I2Nz02NTs6PDw5Ozs4Ojw9Ojs4NjU3OjY5Pj0+PDk5PTk9PTw+PTs7PDo+PTw/Pz9APT03Oj5AQEA/Pzg2NT08PkFCRkBAR6CupKaroaOqrK6tp6ypqKCipp6bm56aoJyalZmfn5uen56WlJOXk5KcnqSorq2sq6uvqq+pnpeepZylxsaMV1NKZqRZZn1vcltSa2NcZ2JgbZG0sLC4rKahnJ2alJeamZCOkZWRjI6Nk5minJejmZqXmJmUmZiWnZufpaapoKajnqeurqumorGjmqSmpqqioaqiqaSosquxsqu5qKarp6urqaysp6Ggo7GusrG0qrKuo5mcnZ6hmJubmpiZm5SWm5aZnKWhoJqjoZqcmZ+kop6gn6KmnZulpqWkpaijp6OepqOinqaloqWlqKykpq2noJ2eoJ6gpaGenqWgppmBe4F8dnZzaIJsZVtTWlpNUUpPT1ZNU01CNz5DNzg9NzY6PDw9Ojw5ODo7PDo7OTc2Oj01OTw7QD03ODs3PTs9PT06Ozw4Pj09QD5BPj4+ODg8P0BAPT43NTg9Pj1BQEZAQUihqqCrq6GkqquwramtqaelpaWkoKGfnqWXl5SYmZ6YnJ2blo+VmZKRnJihnaqip6Cep6Gln5ySm6Kan6qjjHlVaXJ3dXBjd3ZYV2JgZGlbWldora6sr6efnqKglpCTm6CbmZeSk5+coaObnpuWn5qfl5uinqWhnqSfpKitraisqaSstLe2sKe0rKKtraOvpaSmoamorrWzsr22vrCssa6tqaq0sbCoq6iztrizuK2ytKSgnaWgrKGhoqGgmpiWlZ+bm5iloaCeo6GgnpucpaCfnZyhqJ+fp6meoaOkoKagnqehn5ymo5+ipaOooKmrpZ+dnZudmqainpyjnqeQgYKAfXh2and1Xm1bUmFJUlVIRlVXSkNNRz1LSDhGPDc3Oz49PDo8OTg6Ojs6PDk2Njo8Nzs+PT8+OTc9OT47PEA8OkA6OkA/O0A+QUA9PDk3Oj5APzo+NzU4PT0/QUBEQEJGnKueqamipamprqimqqWmp6aoqqGlpKOmkpOVmJacmpqcmpWTmZuNk5+ZqJ2un6eenKGdnpqZkpiem6GhoKR/b4JwYGNYTFtSWkxMUVlSSE9OSJmsqqmkn5+ZkpKUmJiWlpWMiIuOlZ2cnZ2el56Zpp+gqKWxqqeuo6uutrC0srGutri9v7qttbSwt7CutKmmpKWsqbmztbvDvMPBtrq2q66xubi8r7OwtcK8t76zs7WirKKpqLKpq6inqJqZnpqqp6CZp6Cfn6iopaSenaqiop6bn6igpKetmZ+jnp6nnqCmnpycoqGbo6KhnZympaWkn6KZnJukn6CboJyjiYWFfnZybWl3bWhtXFhcQ1dOSkdNR0NGTTw+TD40PDk2Oj0/PDs6Ojg4PDk6Ozs8NTQ6PDg5Pj4/Pjg4Pzk8Oz0/Oz1BPTo/PjxAPj8+Pz08Njs/QT07Pzg1ODw8QERCREFCQ5WqoKapo6mqqKmjoamgpqinrK6lqaWpqpSSl5mUmpqanJiYmZyamJmqoLGit6Swpp+enZ2XmJWZnpqco56ciWJXXmVgV01RRz0+QENEPz5CUnipramqpZ+en6KjnZ6dmpyblJOVlJ6dmJSFnZqgmqukq7KwubKysbKxur28vLm2uMO+v8K/tru7wMS5vbusr6exrbHCtrjCxsDIysDKv7C5ub25wr64s7vGxL3DvLezqrOtqrO0r7Ouqq+jnayotrGto7CmoKOwsa6wpKWvo6GgmqGmoaSqqpmdoJmao6CmqKGcnqKemaSenpiYo6OhpJ6mmpuipJ6fm5ubnIeGgXx0cmtrdXJxaFZcUUZVSERKUEk/RUE0Rkg5NTw+Nzs8Pjw8Ojo4OTw4OTs4Ojo4Ozw3Oz49Pj02OEA5Ozs9QDw9QDk3PD07Pj0+PUI+Pjc6QUA+PD45NTg9Oz1DQEFDQkGRqqGlqqelqqimn6KnnKasp7Gyq62jqayVkpWalJecoqGbnqCinJ+psqu7sr+rr6ylnqCgnJyYmp+gmqCflXxfXmVgUUZEO0M+Rjw+OTZOfqqzp6OjoqCepaumnpiclJGZnZmVjIqGiIZ4bYigpKKrrLS8tsO+vrO7wcPCxcC/wsbGxcPIwsDFyM3QyMvDsre1vrK+xbu+zM3FzMzM0se+v8DCvsfGwrfDysrDwce/urS6u7W7t7C2sqq6sq67uL+7uqu4rauquLu1vK6uuaOmo56mpaKjqaaZm5+Zmp2nqqegoaGkmJSjlpSZkZydn6Sep5+en6KdmJmUmJSIhX56cmtjaW94a2VZW0ZLTEVEVE1FQ0U3Oj86NTQ5OTc5Pj87PDs7OD48Njo9OTw9OTw9Ojs9Pj4+NztBOj45PT45PT44Nzs6Ojs/Pz1CPj83OkFAPTw9ODY2PDo8QT9BQUE+kqugp66ooqulpKKipaGlqquwsq2upKmmlJWWmpaUm6SmnaGqp6KrrLy8v8PBsrK4p6Ghq6qhnJ6hoZ2bmn1yaWFXTkU+SVl8b2FBPVyOrqygmZubnp6Zl5eXko2Pl5eTjo2QjIKDgndycW1wj6atrrS5xbvNx8u/wszNzczHydHMzMzHycXGzNDS1c7Tyb3Av8O7xsXIxdHTzdTQ09PMysLFxsbKyM/AydHMx8bIxsK8w8G/v7+2vrOtv8DDw8fFx8Svv7myuLzEwsK6vLy1rqenraigoqmlmpagmpmdqKupo6SknpePm4uQmYmVmJugn6OdnZeempOTi5WPhYF5dHNlYmdyb2ZeWlpDTkxERlBJRENANTU1ODlCPTY4OkE+Ozs+PDk+PTc6PTk6PDg8PDw7Pz8+PD0+Qzw7OkA9Ojs6Ojg4ODk7QT48QD8+OTtBQTs7Pjc4Njo8PkI+Q0FAPpOvn6ivpqiro6KloKampKuoq62qrqKqo5Kcl5ebmJuirJ2frqalsarFxszOzb+wwaikqKytqqCdo56cnpVpZlxUSURAP0qGnqSYg6CyraOenJ+amJeUkpSWkZCPjIeEg4iHg4CBgYB5cXJvbHmktrq5vsvB09LTyM3O0dPR0tHQ0dHNzs7Qxc7U1djS183Gx8nMw8XKz8rT19LX0tXW09TIzMfMzcrTzc7TzcbJysrCx8zHycnGv8Ozs8jFy8vLz8fKv76/vcHGxc3MycnAw8Cur7OonqKqo5qTnpyYnqaprKSlppaXipWFkZSHkpKSmZualpiQm5WQjIaRi4B7cnV2Z2NndmpkVldRRE5GQElRQz5CPDoyMkE8RTw3OTxCPTs9Pzs7Pj05Oj48Oz44Ojk5Oj86Pj1APkA8Pjs+Ozk9PTw5Njo6Pj08PEA/Pjk6QEE6OT44Ojo6Oz4+PEE/QT6QrKKiqaanqKSfop2qqKOso6OnpqyiqZ+To5iWn56dpK6bn7CrqKyxyc3U18/Gu8esrbO3rK6jnqOinaGbYVNMSkRDP0NSsNG9sq+mnJycoKShnZqUk5WUiX14cWtlYmhyb3F7hYqAdXBucXRwhbPDvsXR0NfW1tLWztTW19TT0dPU1NPP0cTQ09bY1dbSy8nO0cvGzdHK0tXW2dbX09fYztLKz9HMz9DM09DAycjKxMzMzM/PxcfItsDLwNLNzNDHysnAxMPIzs3Q0c/NysjNuLe7qJ+lq6efmJ6jnp2qpa2pqKiSlYiQhIyRho2MiJOVmZCWjJiSj4aHjIR9eHN2cGNgZXJiXVJcSUpHQUVJSj47QTg9NTU4Njs4Njo8QD07Pjw7OUA7OTo8Ozs8Nz09Ozo+Oz08Pjw/Ojo8Ozs5Oz89OTU7PD48PD0/Pz46O0BCOzk/OTg7PT0+PzxBQEQ8hqugnKegp6Oim6CbqaSlqaCfoaGmn6ifmKSimqmmoqarmqOwsamotdDU19rSx8bLtLXBxbG1qKGkpaCioVlJQEFEQUZRdrKvppqUl5+cmqCgnpucmpWJd2ljYV9fYF9eX19dYWx1c3Bwb2xycXWSxMjH1NXX19fT19DV1NrU1M7P1dTU0dHM0c7T19bT1dDP0tPRydPRyNDY19jR2NLX2dTVzM/Pys3Sy8/RwMbDyMbPztHR0sjMzcDLzcbTz8zPyMXLx8fJzMrU1NHVz9LM08K5xbGlqLWup5uoq6Wdsqiws62sk4+TjoiLjoOPi4SQjpmNk4+Zj4+ChYx8enFzdG1hY2ltX1ZQX0pKQ0ZDUk1APD40Mzo9NTI4NTU8PEA8Ozw6OTpAOjg7Oj46PTg+Ojo8QD08OTs9Pzk6Pz07PTw9PTo2PD0/QD08PT0+OjxAQjs5PDc0Oj48P0A9RkFEPYKknKClnaWlo5mcnaSeo6OfnZ+doJqnnpyhqZ+vraqqq52lrreoq7fY1NXZ2dHO0L+8zMm2vq6mqqiho6tlQzg9PkRYgqqon5eVl5manJ+dmJyckn1xZWNiX19hX15hYF9gYF9gZW1wcG5rb3J3d5zMwdPV09jY1tnR0tLXz9POy9LN1dTRys/N09bS0dbNz9XV0cXR1MrQ1NXWztPR2NfX2MvIzsTJz8zKzcDKwMnKzs7Py9DOzszPz8jM0NDLzsvDysfJzcvM0tPN09LR0NDKvci5sK67ubWrtrCtqLits767sZqPoJSRjo2IjpCFkY2ZjJGRlY6RgIWJenZvcG9rYWRucGFXXFpJRkZETVhFO0A9MzM8PDg3ODU1Oz5APTk8PDg8Pjk8QDtAOj04Pjk4Oj88PTg7PkI6Oj08OkE9PTw6Nj08P0A9PDs9Pjg7QEE9Ojw4ODs+PD4+OkVCRT6Bn5mlp6Cfo6eam5+cl56eoZqdmpyappufpKefuLa1taykrK6+tLDA2NLX2tzWzs3Kw9LPwcGxqaytqaSxekhGQjtXjaGblZOWm56enpyTlpeUiGteXl5hZGJgYGFhYGBhXl9fXlxibXJvb3N0dnZ5pL/M1dHW1NPY1s7O08vOzsXOytLSz8fOzc7UzM7SzcvX1tDM0dTLzNDS08rO0dXS1dXKwMrCxc3CyMrDzMTGycrLz8vOzdDO08zGydDNycfLxcfBxsrMzdDSx9DPzs7M0MXHwbi5vcPDvcO4srK+sbvDw7WqmKWhmJaSlZWSi5SNmpGUlI+PlYKJhnlxcmttZ2BgcWhZWGhWTUdMSVBRQjtDPjs2ODo4Ojo1Nz09QTs6PD05PD05PT06Pjo8ODs9OTtAPD47Pj5BPDk9Pj1CPTs3NzU/PDw/PDw7PDw4O0FAPDo8OTs7Ozw9QTpFQUU+hJ6bqK2epKSqnJ6fmJKXm5+am56ZmaKVoamppcTCwb+7tbKxx8O4ytXW2drb2MzMz8jW1cTCta+0qJ+tl3hscHF5j5qNjJeVkJORkZWWlZCLfGVhYmJgXV5hY2FgYF9gYWFgX11bXWdycnByc3Ftcnmlx9PPy9DQ09TKxcnJxsa/w8XPzsfFx83K0sjLzs3G0dLQzszUysfLzs/Hx8/Sy9DPxrrEv8bKvcLHyc7Fw8fAx83IxMzLzM/IxMTQycbCxsjEv8HHzMvMz8LLzMnHy9DExce7x8PIycLPwb28v7DByca5vaqwsqelnaKcmJCbkKOZl5mRlZiJj4J4b3Rka2BeZnFhW1dgR0hIR0lNVEc/Sj02NDM1NT09NDg9PT06Oz08OTo7OT89OTw7PDg6PDo6QD1APD09Pjw6Qz48Pz04ODk6QD4/Pjw7Ozs7ODo+Pzw7Ojc5PD49Oz49RkFDPYOgm6qupa6qq5qdoJeUjpedmpmgmpqcm6WysazJzcrIxL68uczMxtDV1dja29jQyc/P0dPIwre7u62jtn5og4Wkq5ONjZaPhYODg4F9hIR+c19bXl5eYF5gY2RjX11dXl9gYF9bWlxgbHJxb29rbG9vfbnRyMnKz8vNxLrAw7u7urq+ycbCw8DDyMrJyMrIwcXMxsjKzcnEwsvJwcHL0MXLyL+5wrvGx77Axs/LxMDDu8nHybzJx8XKwL7Cy8bFxL7GvbzBw8XMxca8wMnDxcfSxcHJv8rJxsjG0cPDxsOvxMvHw8q3v7y6tKmspKWYn5iso6Gmm6Ogm5V8d3N0ZmlaYW5tWlxYUkRMRkJHRUxERlNANTQzMzU/PDM6PDw7OTw8PDg7PTtBPTo8Ojs3Oz05Oz07PTs6OD4+PEI+Oz88OTk7Pz07QD48Ozk5OTk6Oz06PDo2OTw+PDs+O0NCRD5/pZypsqm0rrCdnp6YnImUm5man6Kfmp2ov7i8ys/RzMfCw8bNzs7M1c/V2tjZz8vSzc3OyMG1w76xr7ZsXnp9oZGKkpaGeoCFhX92eHVycF9bW11gYGJjZGRlZGBcXF1dX15gW1laXGJvcm9raWtwb3OPx73KxcvAxsKwtrqysrOyscK8vLy6uMHBwcS+vbm9v7nEysXGwr3GwLi7xMm/wcm7t7u6xsO/vMHOw8a+vrXBvcO7vce7w7q0vcbEwsK3v7a2vr+7zMO9trrIu7++y8PBxsLFycfJxtDGwszIssfJw87MwMXDv72yt7Cyp6ioubClrbCqrayUenZ3amRnYGhvZFZeWUpGSkZIS0FGQkZKQDk6NjU4ODU0Ozo7PDk8PDs5Ozk6QD46Ojw6Nzo7Nzo7Oz88OjxAPUA/PT8/Oz07O0A8Pj4+Ojk5ODk3ODo8PDw7OTo8Pjs7PjpAQEU+fqygrLWqt7SyoZ6fl5qNlJaan52mop2et8XCxMjO0srKycbNzc7RyNDF1dTV183KzsXJxcfBucW9q66mYGR1g5OLiIuEeH+Ghn9+hHt0dGNcXF1eYGBiY2JiZGViXVxbXF5cXl1aW1xeaHNxbWdnbm9yeZ29zMDDusC4rbCxp6qtrKe4tLa0s7O0u7a9sbewta+yu8K8wcS8v7u1srq+wLjIubS7t8HCvbi9x8HEvLWvsra7v7TFt7u1q7m9vsC9sbq2sLe6s8a8t6+7v7W3tcW8vsPFwMTFxsfLxcDGxrvHy8DPycfDxsHDt8O9vba5vse/rLW7tbe2jnl0eGdnZWJrbl5WXmBGS0hISkZCREFFRT88OjU2NjYzMzs6Oz06Ozs6Oz44PEE9PDo7ODc5OTk7PDo+Ozk+Pz1APz5CQD1AOjo+Oz89PTk6Ojo4NTY7PT48PDo7OT49OT86PEBAPIi3pauzsby8sa2foJmUlJiXnqujr6qnpMbLzcjFyM3M0MzNyMnIysjKxNDN0s/NxcfBxsC/urfJtqqwmVtncIqPhYiJenh+hoZ2d4F8c2hdXV1dX2BfYGRhXmNlY19fXFteXF1eWltbXV9scG5pZmptbnJ8pMfAuLi1sKusp56iqaeeqqyzraqsqrSttrGzqa6nrLO7urbDubq6sau1ubu0wrqwwLG+vLu2vMi5w7atqqiwssC2uL2wsaexs7W7vKuutaautq67srGqubCuu667uLvAwL66w7/Gw8XAvMbBx8u4xcfFv8fDw7rExsK7xsnMy7O5wr27s4lzdnZraWBibGlZWFdbQUxLTUpFQUM/RkE6OTo5OTY4NTQ6Ojk7PD07Ojs+ODtAPD05Ojc5Pjk7PDo4Ozs6Pj45QT0/QD87Pjo7PDo9PDw4OTg5NzY4PDw9Ozw6Ojs+PTs/Ozs+QDyKwKuouLe5w62zqZ2ZlJaZoZymsLWxt6bFztLLw8XBxNDHzcHDxr/ExMPDysLJyr/AvMK6s7W1w66qsJJban+Sh46Pe3h9iYV6e4SBd25eXVxcXV9gX19kY2JjZGJgX11aW1paXVpaWVpcZW5vaGZoaWtucoGturC1rqWkp6eaoKSgmpylq66kqKKrqqyrsKSmn6qttLaxvbmvt7Corri0s7y4tLyvuLm1srzBssGupaijq7Gys6i9qquoq6yutbOlqK6hpK+psqaoqK6mqLessbK3urq7sry+vr7Ev7XCwcfIt77AxLfEw7+7v8TCvsTIzMq/v8PAwKmHc3RzamlcYW9kV1dYUEhZUlNLRkZFPj9AOjc4OTc3NjQzNzo5OTo8Ozs8PDc7PTs7Ozw4OT44PTs8Njo9Oz89N0E+P0A/Ojw8Oj05Ojs6Nzc3ODg3OTw7PDs5Ozo8OTc5Pjw+P0E7jMKvrry3ucSwtrCbmZWcmKqpsLGztb2vxdDPzcPHubnLwcu+u8m2vcO+usq3wcPBtLa8trGvtbutqKuSZG2Ig4eLgHp9f354dH58c3dlX11cXF5fYF5fY2NhYmBhX15dXFpYWVtbWVhaXF9ma2ZkZ2Voam9yhaqlrKWenKGklJ2kmpeRoaOpo6Ofpaanpq2gnZykpq2ysLa3p7GtqKq0q7S6sba2rra5srC6urG3paCkn6axqKypuqqkp6eop7KtoKemn5ukpqyfn6ekoKGxra2ssrSztLC1vLa7wcCyu77DwbG5ucKzwb7Atbi8vb68wsfFw8S/wMSghHhxbGJmYGtvYFVZX0hOZ09USEZLRjw9QD06Ozs4MjY1MzY5OTk7OTo6PDo3PD88PDs8ODg8OTw6Ozc4Ojo8OTg+Oj89OTg8Ojs+OTc3NzY3ODg2NjY7Ojo7OTo7PDg1OTw6Pj5AO43ItLa9uLrAur22oJ6UnaGmurars7O7s8TPycvDxri3x8DMv7jJt7vFuLPFuLO/wKy1vLKspa+zraGjkWlyhoWGgHx4dXNvbWppaXBpX2BdXFxcXl9fYWNiYGBgYV5cW1xcWFlYWFhWWFteX2RjYmVnZ2drbW+InamflpWaoZabopiVjJ6hoqecoJ+kpaKnnpujnKCrsK2xtaSpqqqsrKS0uK23sKyztq+zta+wqp+en6OisqWmqrmtoqamoKitq5mgn56ZnZ+lmpqjnJyer6mrqKqsra2wsrivuLm6sLa8u7qrs7K5s720trGxtrW/tr3AvsPCu7q9l4R7c2tfZV5kZFhUV11JV1xLUEdKSkdBPD8/QDs/PDA1NTM1Ojs5Ozg5OTw8Nz4/Oz07Ozg4PDg5ODw3ODo7Ozo7Pzo9Ozc4PDo9PDc0Nzc2NzU3NDY2Ozc5Ojs6ODo5ODo7OTo8PzuJyba4vru3wcHBtKSkmZqkpsCyr7astLfFz8jIwMa7u8PDz765x7i3vreywrSxu7usubqxop6pq6eYno9tfoWGf3hybW9ta2JeYWZmXV1eXV1dXF1fYWFiY2NiYV9cW1taWllYWFdXV1hYWFpeYmRkZWZmaGlrco2nnJOUlJqXmqGWlpCboqGonpydpaeipZygoZuZr66ur7KhpaOuq6eitbCysqypr7OnurOmtqGjn5ujoa2joqq2q6Ojpp6lpqOWmZ2XmZudoJqXnp2dnK2hq6ijpKatq7KzqrWwsquyubSvqq+ysrO3s66pra6yuLG6trq9wLizsZSGenVmX2ZeW1lWU1pVS1tRTEpFSEtJQj0/QUFAQToyNDUyNDk5ODk7OTo9PDY9Pzs8Pjs3Ozs3Nzc+Njo+Ozo4Oj07PD06Ozw6PTs4Nzk3NDY1NTQ2Nzg1Ojo4Ojk5PDg3Ojg5PkA6gci9uL2/tr68v7OdpaOYpbHCtba9rbS4wczIxr/FtsHAx863wMS9s7m5sr+2sbm7rbK0r5+apKqglJqPeH+DhH94b3F0cWhlY2hkY1xcW1tdXVxbXmBhXl9fYF5cW1pcWllYVldXVlhXWFdWV2FkZWNkZWRkaGp2oJuTk4+TlpaelpiTl6CdoZyWoaGppJ+fqZ2cm6unr7CrnKOkuKqhoK6otqqnqK2xpLiwpLego5yZmaqnoZutubCjoaScoqCgk5ShlJaWm5iYlpeclZ+pnqmkop2jqqqxrai0rKqnrbOwpauus7GwsK+vp6iosq6ytbC8tLq4rqOVgnp3ZV9hVllYU1JTS01eTFBMR0hMS0U9QD49Qjw7NzY1MzQ5ODg5OTo5Pjo4Pj47PTw8Nz49Njc2PTc7PTs5Nzk7Ozw+OTk6Ozo4Njc2NTQ1MzEwNDU2Nzk6ODo5Ojo3Ojs5OT1AOnbAvLS5wrG+t72unaenoqq7wL3Aua60uMHMx8XCw73FuMjMssHCwa68u7W7vLW5ubCvsKqcmaGplJGKi4CAfHdxaWxydHBoaGVkZmFcXFpZWlxcXF1eXVxbXF5cW1xZW1taWFZXV1ZXWFdXV1ZbYmNiYmNiYmNmaYGVkpSLkZOTmpiclZacn5yflqCgp6akp6ignaCmoKqvpp+io7eooaGiqLOipailsKaxray1nqGdlpWpoqKUrbKxn6Ojnp6Ym5OLoZSRk5iYk5eYmJeep5unoqKapKWlq6SlsKelo6usraaorq+vq6iqqrOmpquvtLGvvLaxr6+gknt4c2VhXFtdWE5MUUhSYU1WUE9KTU9FQkQ/OT02OTo3NjQ1OTk7OTg4Nzs4OT0+Oz47PDY5Ojc7Njs3Ozs6ODU6Ozo7OzY8Ozg4NDc3NjMzMjEuLzI1NTY7Ojg7Nzg3Njw7Ojs7QTh4u7uxtb2wu7G3rJ6lpqy3u7zBxbqxubXEycnAw8bFx7bFxLPBv8Wrt7e9tr26u7Wyq62omZifo4uJdImIfnZuY2FmaWhmZ2lmaWxgXVxbWlpaWlxdXFtcXl9cWlpbWVlaW1dVWFdUVFZVUlRSVWBgX2BhX2FhY2RpgJKSiI+Nk5GSnJSVlqSZoJecoKWiraalpaSko52qq6Wan6WxqqChnqWrnqiin66tqamuraKiopWYopuckKupsZygop+fl5iTip6RjZKTlpCYmJScoaOdpKGilaCipaabo6uloqSqo6uupa6yqaalpqa0pqqorbO1tLm6sKqsnoxzcW9gW1dWVVJGUE5IWlxPUkpUS1NMRUdKRDg7Oz08OTY2Nzo5Ozo5NzY5Nzc6Ozo9PDw2Ozw4PjU5ODo4ODY1OTo8PDk3Pzw5Njc4NDUyMTIxLi4xNDI2Ojg2OTg1OTg5ODk7OUA5e7W0rLS7srCrsq2dqKevubmzwMi6tcCvxcjMusHKzMi1ybyxvcPJrbG4wbW8wLy0taqsppaanJyJgXKIg3t0aWlqbGdqbG1ramxlXVxcW1tcWlhaXVtbXmBgXFhYWllYV1hXVFZWVVRVVVJSTlFZXVxdXV5fX19iZG2MjYKQhY6QjZiSlJKcmqKcm6GpqauprKeppqSZpa+llZmlr6mgnJmboZ6vmpyrtKCmpp+jpKGUk5uWlpKpqq2anaChoZuUkIyZjoyRjJKNlpWQnqKgo52co5WboKOhl6Koo6Ooq6Crr6Sut6ajpKOsraqoq6+zt7K9tbOrr5iFdHNoW1hZU1VSRVhMUVtYTVVPUExRUklOSkM9Pz9BPz03NTc5OTw8OTc3Ojc5Ojs8PT47Nzs7Oj02Nzo7ODk3Njk4OTo2Oj05OTU3NjU3MDE0MS0rLzQzNDk4ODo6ODo6NzQ4PTg/OX6zraezt6+oqK+um6morLe2q7zKu7a/rMvGxbjBzs/Is8S6t7vCyLGtuL+3vL27s7WmqaCWmJmXiHp0gHZ3bm1obW1tcGdnaWZkXVpbW1tbXFtZWltcXF5fX1xYWFlYV1hXVlVUU1VWVVVTU05QUVlaWlpdXVxeX2BlfYqAiX2Kj4iQjJaRl5mioJugq6qmr6yosaWpmqCtoZWWpainnZiQj5qerpeZqKuZoJ2UpaGfkpGSkZOVqKulmpmZnp6WjoyLk4aJjYOPi5KVkaCeoaSZlp+VmqGinpSbpaaoqKigsbCmsb2ooKOstKuup7C1sLm1wLGusauRfnJzYlZUVk5SSkdWUFJSTExYTkpMT1JHTUtBQ0ZERD5BNzU4ODk7OTo3Ojo3PD06O0A+Ojk7OTo/NzU5Ojk4NzY5NTg3Nzk7ODU1NzY2NjEzMjAtKi4xMDI4Nzc7OTk7ODk0ODs4QDh/tKymsbeqpaKxq52qp6mysKS2xrS5urPKxbm6wcvQyrG2t7y9wcOxsLG3rbS0u7O0oqOdnZiXlYSAdmtnbG5xbnJrcGtkZWdlXlpZWllaWlpaWlpaXFxdXFpYWFhZWVdYV1VVVFJTVVNWVVJOTk5SV1hZWVlZXFxdYWp+eH50h4yFjoiXiZSTmJuYnqmboKumpqyeqJqhppyTj5+jmpeXhYSSm6SQlaOdlpaWiKKbm5SMjoqQmqWnnJWVl5uRkoeUjouBjI2AkIuSkpKgmqCilpSYmZWippmNmaSmqaahoLSyqLO4oZyjt6yqrqSysqa1vLWrrLGjiXlzbl1OUVFMT0ROTk5QS0ZOTkpKTk5RSU1KQUhMSEhDPjg1ODg4OTo7Njk6Njg7OTk+PDg6Pjk7Pzg3ODk6ODg2ODU3Njg4OTc0NTc3ODIwMzAxKiktLzEyODc2Ojk5OTk4NDk4OEE3d7ampLexpaekqqWgqaaks6qissO1tbKzxsa2usPKzMazrLm9tLjAr62psJ6mrrqvrZ+Zmp2VlYh8g25fX2ZycHZxaW5pZWdoal9YWFhYWFlZWVpaWVtbXFxZWFhXWVlYVVZSU1JQUVRRU1VRTU1LTFNXV1ZYWFhYW11hbnB1b4OHgYd/kIOOipORk52hj5qco6KkmaWXopyVjYiZmoxzjYN+jpeWhpGakJSOjnuZj52Mgol/ipigo56Qk5iWhY6DlH5+dIqOepCHk5CQnZuampKWkJ2Oo6OOiZqgoaSkm6K0r6ywrZ+ZprimprGhsK6csLyqqa+qmYN4dGRXTVJPUE1DU05MUE1CUFFISU5TTUhKSkRLTUZLSz03NDk4ODg7OzY5Ozc6PDk6Ojs3OT85PkA3OTo8ODk3NjQ0NDU4NzQzMTI1ODUvMDEwMikoLC0wMjc2NDc4OTo6NjU6ODdBN3i3oaO0qaalqKOmpaamprOnpbTBuLC0sMnEt7nBzsa9s6y6waytw62ooqaSnaa2raOgj5WWkpB+eH5mV1ZfZ2ZpZ2huY2lpZ2JcWFdYWFhZWVlZWVlaW1tbWVlZVldXV1NUUE5QTk9PUFNUUU1NSkhOU1NTVFVVVllbXWpqcGt+hHtzTlhyj4KXho2cl4uUkaCZnZWUlpWPloqAlIlfO1ZvfIyUioGMkoyQhoZzi4WXgXmBe4aTnZSDlY6RkIOGfZN4cXCGjX2KgZGNj5eamZOLkIqdiJ+Yh4iWnpqhoJenrqmtqKiel66zoqaumayrmKi0o6mto5N/dG9gXE9TUldMRFRKUE1MRk5PSUVMUU1LT0pJTVBGSUk9NzU5OTk5OTo3Ojs6Pj44Oj09Nzo/OD4/NTg5Ozc5Njc1MzMzNzYwLi0vMzQ0MTEwLy8oKSsrLTM4NTQ3Nzk8Ojc5Ozg2QTl5t6CjrqGmpqqgpqmno6mvqKe0wrmwtbDHwrezvc+/ua+utcKnqsWqo52Yg5ScsaKamIaUj4uHfnN1XVBMUVVZWlddXmJnY19ZV1dXWFhYWVpZWFlYWVpaWllYWFZXV1VTUk5MS0hHYlxNT1JNS0hGSE5RUU1PUlRWWFpgbG5neoFzUEI/f5WSkX2IlYyEio2bjpaVipKIhpWHeYl/YEpRbniLkoR+hI2LhX9/bX9/lHd1dniEjZpwUY2IioZ8fniUdmh3hoh+iomWi46Rk5eMhIqIlYSbjYKEkpqWnp2UpKOoqaWknpyxqqGkpJGmqZaiqpyipqiJdm5nX11IUVFTTUlVTVNJTEtPSUhGSk5MTVRLUVBPRklDPTc2OTo4Ojs7ODo7OD4/OTk+PTg7PDY7OzQ3ODs2Nzc1MzQ0Njk2LzMvLjEyNTIyMS8sJykrKiw0ODMzOTg5Ojk5Ojo6Oj85d7aco6edn6Gvoaeopaeor6yqtby2uLazwbu2qLnIuLaoqLW2qrK8p56WjX+KlKiWlYp+joOCfXhxb1hNS01NTkxNUVdbXFpYWlVVVlZWV1lZWFhZWFhZWVlaWFhWVldVU1BNSkVAQJtrc3NJTUtERERJTk9oWU5RU1RVWm6DcnV9aWhcVJCJlIh0foaBfIWMk4KSmouPe4aPgHaAeHNvdnF0jo6Ben6Kq4V5e2h2e45wcm14gYuNknh7gHuAdnNyknhndYWEhIV8lYqIio2LgH+Ei42AlIR8gI+YlZyWkZ+dqZ6foJ2gqaWenZiNp6SSoKCWnp+kgXNoYl1dSldQUkdLWFJPSkxNUkpKSkxQSExRTFJUTUVIQT03Nzs5OT49Ojs8OThAPzo6Pj03PT03OTkzNzc4NTY3NTI1MTQ3Mi8yLiwvLzIwMC8tKygoKS4xMjcyMTk4Nzo4Nzc1Ojw7N3aumaOhmJ2ftKmvqqWtq7Cxqr20sry4trq0sZ+3urKqnZ2sqaiyr6KakY2UgY6cjpF+doZ4fHZvb2lYS0hJSEdFSEhQVFRUV1dTVFVVVVZXV1dYWFhYWFhYWVlXV1VWVVNQS0Y+OTNOPH6eTUhKREA9QURqlH5MT1FRU1ZedIJ7eGZ2jJaYjY58Z3mBdniAiZB9hJiSgXGHj3x3e29rfq19dJCLf3uGkoF8f3VmdnyGbG9nc3yJjIeAbXlxfXFtdo9xaHGBfo5wRIuFgoOFf3d4eoyGfYx7dX2Oko+Yi5Kam6OWmZyanZ6hnJaNi6Wajp2XjpaYkHhvbWdjW1hYVVFKU1VUT1BOUVZLTktPT0pST0lOUExGRDw8Nzk7Ojo/PTk8Ojk5Pz87ODs9Nzw5OTk5MjY2ODU2NjMzNjExMjI0LiwsLS4uLTAtKyonJyouMTM2Mi84NzY5NjY1Mjc5OTV5ppegnpahprCsrquoqbGvsau8uKy7vrizrKebsKesm4+WnaWppKGYmY+FknmJjouKdXF7bXVwam1qWEtGR0VBQENESExMTVFSUFFTVFRUVVZWV1dYV1hZWVlZWVlWVlRTUUtENzhmNzA/qGlOSEM9OzpEioV6WkpOUFFUWF1lcHJsiKeqwH50eWJ7eG98eYmQen2Lhm9tjJJ5dHlqaoCCcZaRi4F+loBJkphuaHh+gm1pZGx5hZCShmxybHxucnyGaW5wf3ONiYWGe35/e3dwdHSGgnmBeXB8joyKlIOWl5iakJKWl5mXnZaMg4mekouSjYaQloBvam9vb1lWWFRSUVlPUlRUUlhVTU5ITUpNT0tDSU5HRkA6OTk7OTk6Pjw5PDs6Oj0+Ojg6PDk/ODY4NzI3NTY1NTQxNDMyLzAyNCorKiotListKigqKCcsLTEyNTAsNTU2NzQ4NUhBODk1d5mRm5man6WssKOtqqi1r66stL+rvMO/paKalaSYno2Ei5ShoZiZkZOLc456gIaMhnRvdGtwbGRsallOREZDQDw+PkFGRkdLS0tNUFJSUlRUVFRWVldXWFlaWVlaV1ZUU1BMRTFAmjMganNDmW87PDk1PICChl9JTU9PUldaUVlcX6eHYZppc3llfm9tf3qLiXaCiIZ0bJqSdHR8amqdj015hZOJhI5nMXaGc2x+fYN0ZmV1f4SEhYBnaWx1a3GAfGhxcXxuk42PfHR+fXFxbnZtgn93eXVqeYmCiImDlpKSkIuNkZSUjpeNgHmIl4iGioaAkIh3a2twaGZYUlpXWVlbTVBVVllYTklIRUpKSEdDQEdFQ0c9OTk4Ozk6OTw6OTs6OjpAPDk6PDk4Pjc4NzcxNTIzNDUzMzY0NTAzMS4qKispLCwrKykoKycpLCwyMjYsLDQ3NzU0NzhpTzg7NW6SiJqRmZajqK2esZ6nuq+rsrDCsbvDx5qWj5SZi46FeoSQmJSNkIyPhnGHgnSHjIZ5cHJwb29kcGZfVEZJQz88Ozk6P0BBRENFR0lMT1FRUVFSU1RVVlZYWlpZWFZVVFNQS0U4MC9cYLNHOVhQOzk0NDGWuotITE1PUFFWTEFJUUlir7KgcXt4bH1scYKChYF6hIaGeXKhlXR4gXN1lIc1cZ2onY6hoYSihXZwh3yHfHSMro2JgWhnYmpucm1wgnVpb1h1cI6bkndtf3t9bXJucIB7c3ZuYnaDf4aAhZCQioqJkYuRi4uOg3V4io6AfoOAfY57c3FxbWBcXV5bWVhgX1JOW1pYV0xISkZKRz9DQUJIP0NEPTs5Nz07Ojs7OTo5OTs6Pzw4OD06ODs2NjY1MTEyMTI1MzQ3NDUzMS4vLCwrKSopKSoqKikoKikrLzNETTIxNjY2NDM8dlI3PTdikoGSiJaRnaSnn6+VpbSprrGuwbK7wcWWkIyUj4CIfG6BkJKJg4qHj4Z1goRslYiIe3R4eGx3bndjaV5KUEc+PzY0NDk7Ozs9PkBCRUhMTExMTlBRUlRVVldYWlhWVVRTUExFPDUqnUtbQC1nSTk0Lz+Sg6muX0dMTU5QTDdDTVJTREqGdoB8fHZ+bHaIiHx+hYN/jH51opp6foaBhJmEm5xhhqqfnYuDkI16d4h+iYmOc4uXj4R7XWVxdHp8d4ptaGpieW+FkIJ6b4F4dYV6cHR5eGtuaV12hnyHfIeHjn+KkpeDjYWMhn1xhH+EfXV3e3yJd3BzdGZnYFtbXlNbZ15XUFRYW1VHSkpES0c/RkBEQz5BQT07OTc8Ozs9PDo6OTk7Oz0+Nzk+OTk4NTY1MzI0NDAwNDY0NTU1NC0sKSsoJycnJigoKSkoKCsrKy8wMFVxPTIzMzMxRX5XND05XIx4ioCUjJGcnZ+mkaCqoLGor8Cyu8W6lo6RlId7hnZrf4yRgn2KhI+MeIOAc6CEinx8gX9wgH56Z3ZrUldMQEUyMTEzNjY2ODg6PD5BRUdGR0pLTU9RUVNUVVdWVlZUU1BNRkA6Mj0gI5ZjjFs1MzExaT9Hb0lGSUxNT1JMS1RdWVJKaISIe4l5fHF8j4x6fYmHfpeHdqGaiIePkpSlja2qSIaur6+LgYCTi4KLgoSSqYeAmJiKnHRtfIGGh32OaGdoeX9uhYeChXGEhkdsgHdyeXZobWtfdn2CiH+HhIt5lJ2ciYuIkX96dYt2fHhtcHd+gHR0cmxbXl5cY2NYZ2VcVE9QVllQRExLRk5JQ0ZDQ0BAQ0E9Ojg4Ojo6Ozs6ODg4Ojo/PjY7Pjc1OTU3NzMzNDQyMzY2NTY3Njg7REZMTU1MQzcrIiUnKykrKywvMDArbnUyMjQyMEyBXDU9PF6EdHx9iYWHkY6Wl5KXoJ6toaa4r7O9s5eNkouYi310cH6Jkn59jIKSlH2Gfoakh4h/goiFeIeIfnOEeF9jV0tCNjAuLzIzMTI0NjY4Oj0+P0JFR0hKTU5RU1RVVFRWVVNRT0dDPzgwLCOHWz4/ODQuXZZwc6NVRklLTU5QV2BYcFlcXmmNk4eVgISChZGTfoWIkYGalYKhoZiVm5umrZOau7Gnu8fDqIuMoaWPlIqBkXxxg56fkZx/doaFi5CHkGlocISBdI2HhIpxhYJ3h397doV9bnZ1Zn+UjoaJiIeIh6CropaJjpd/eoKIenlvZ2t4f3t/dGxlXltbXmpeYmdgWk9LTldSUUlQSkROR0NKRENBRERBPDo4Nz08Ojw6ODg3Nzg6PT04PD02ODc1NjYyMzQ0NDU3Njg2NzxCQj88ODo+Q1FeZVxHMicmLCwtLS4xKD+LWy4zMTBPg180PztudXBmd4N7gIx/gZCOipqbpJ2hrKarr7CXkZGEoZSEeHd/jJR8fpKFkpV/ioCSm46DgIGMioKJjYN/ioBtcGpdQkA0LS0vLy4uMDIyMzQ3Nzg7PT9CREhJTlFSU1JTU1RSUE9IREI8ODcvOUQ+PDw2My5sk5dNUEhJS0tLTlZfY39nZ211nZuPmpKTi42OmoiTj52LoKCSo6qlo6yTqbaiqMHCrseveLqUmnyNoZ6ZhJOFgo6in5OYkoSKhY+ZkZZscHWKjIKWjI2Od4+EcW2FgYqWkYOFiHGIoJWGkomOj5aktambjZSig4eTg31/a2prfYGCg3VjXmRgW2dsXWxsXldLR05SUU1MTEZJUENETUZCQ0VGQj05OTc9PDo7Ojk4Nzc2Nzs6Nj06Nzg1NDU2MzQ0NTY2NjY4NTU2MzEwLiosLCkoKS46UGFcQCwoLSsrMCwncog3MjQwT4RiM0A8dW5nWW+Cb3WGcXaShn6XlpqUnp6cp6CplpOYnmdlpJp+hJKReX+SiJGSfYqEmJKQgoCAi4yJhpCHhYmFeHh+Z01SPi8uLiwvLi0vMDAwMjEyNDY3Oz9DRU5QUlRQUFFTUU5QSUVEPjs8OkNGPz48NzUyPD9SNUhISExMTU5SXm+KfHOBfaCdm6elopmhl6KUnJ6onqirn6isqaq2l6u/q7bIyLfJ0c++m6Bwaaupn4STkoWcoZqbmaeRkYiVopubeHp+lJiSoZOXl4GUnnt3lZKrsomNl598lJ6bjZKVmKOipravnZGZqIeWj42BiGxzc32BfXNpYF5iYGJoZGBnZlxSRUpLUE9JSUxGRk1DSExGR0RCR0VBOjg1PDw4OTk5NzU2NTg+NzU9ODQ3NDU3NTQ1MzY5NTg6NjE2ODYzLzAuLSosLy4tJyMqO1hiQigqLDEtKEuXXjA2M1GFZjJBQGlhXlBwdGBtfWF3jn17lI6Oip+Sl56Wm6qYnqpCRH2HiYeYjXiCjYqOjXyKho+QjoGCgImLioSShYOGiYGAhnZeYlA0NjAtMS8sLjAwLy8uLjAwMTU+QUJNUVJTUVJTVFJOU0xFRUA8Pj1HR0BBQDg2NjI8OTtGSEdJSk5PUVlthZB3lYqjp6q0vbikraysp6i0q7C2srKtu7GzvZyzw6u6ycu3w7+4paKws6ytqqOLlpiFpqago5eBppmNoquopYiFlKShoKuhpKmPm7CLlaOmt7uboaOwkqKdoZ2Qo6Grr6yytaKUpKqImYmSiZV6en6GgGliaV1mY15kZF5nZ19bT0NJSFNORkhMRkpHRkZIQUtGQ0ZGQTs4Nz08ODg6OTc0NjU4PDU0PDc2OjQ0NjQ0NzM5PDM4PDIwMjU1MS8xLi0qKi8sLSooKiYlNVhYLywwLCwwhIE4NzFQhWg1QUNbWFRMaGNXaW9YeoV2gZOFh4Kbg5KQjJLayJ2Wc1aXiI+InI98hoyOiop6h4KHkI6DhYGMhYaIkoaChImGiIeHcG5hQEU2NDwyLzExMC0sKy0xLi00P0NBTVVRUlNVVVZVTltQR0hFPD4+RkhDRUE3Ozw1Qzs9RktJR0hST1BXgZKghK6js6qywMfDqrPFtqyzv7O4vra/tMG2u7qjuMWotsnHtb65taijtK2wsZuZkpqfiKevq6WUdp+kl6GssrSZlqquqK62u7K6rK+1orGrsbW7t7WutKCnp6KnmqmvrbK5t7inm7aojKSOkZOfhniChHdaY2VXZ2JiZGBhZmBbVUpERExVUUhJSkRJR0VBQEBLREJNRzw4Njc7PDk3Ojk4NjU1NTcxMTw4ODk1NDY2NDk3Pj0zODkxLjAxMjExMzAsKiwuLCsrKyooJyopRVowMCovK2iSTzYwUodqNkFGV1FKTFtaUWJjV3l1cYGUfYSGk3WFf4CMe7+7o7yCtJSTjZuPhIiPkomIeYaAjJKMh4WBjn+BiY+HgIaIhYmHkXp4bl1WQEVNPDY6NDZBQjc2NC8vNkNIQ1FbT1FVV1VcVk9eVUlLS0FAP0dLRkZEOz5AN0Q3P0JKSkVGV1RQXo+kraOxtMO2uMHMyba7xL2zs8C2uMG1vq+3dLGzpbrEpLDGubGzsbSopLW2qrGgopabopKlsK6mraynpJigrLS7oqiyurW8v8y/xcW9vbPCt7m4v7e6t7msrLClsKqtvbC8usLCrJm6qJOtj5eXqol9g35sWGRiWWtmamZXXGNZVlNJR0ZMUUdDSElBSEQ+P0JCTEBATUQ5OTY2OTo/Njo5OTY2MjQ2LzE5NTk5MzY0NjI3Oz0/NjoxLi81ODo5NjUwKigsLS0tLCwqKCgrKyhFUy8qMDBKj2s1MlCHbTY/RlJMQUxSV1NZVVp2anB+joSAjYRuenN4h2K5oZmjiZSUlpKUk42QlpKHhnuGgY2VioCEgYp6fIuHhn2KgoGKg5Z9d3p1ZVBcZEdFTDtRY2FbXlNGPztIUEVaY1FSWVhaZ1lUYGBMU1BFQT9JSkhFRUFAQzxFNkI+SEdKTFNaVF2Trri1urjIv7q9ycy7vMC7t7W7ura9tLqxxmB1sqSxmp6rvaqlqKurpKKytaCrp5+Vlp+Yn66lp6aln6OUo6extKeys722wb7TycnTx8LFzMLKw8C+vb+7vLe0r7i3tsO5xb3Cx6+euaqhq46kp7aIgYFzYGNjX1hiYGlnUlhgVlFVSUVFTktAPkdEPUtBPUJAPUY+O0hANzk2Mzc5PjQ4OTo1NzA0NS8yNjM4OTM3NDQyNj84QD5HS1JUU1FQT1FRUEpBOS8sLCwqKygoLC0sL1A+KC40OIB9PDJLiHE5PkNLRUBJTVBSS1FdZ2xrcI+NhY9zbHJzc4fVwLWZoI2VmJmRjpeRlpaOhod9hoOMlot+g3+DeHuLg4d8i3mBioKXfnR9emtmcHVZXVxQZWRiYGVkXVtYV1xNZG1VUm1tX25fWGdkVVlVSkRCS0tIRkhISEdBSTlEP0hLVFRWXFpbk7nAuL23xsC7ucrKura5tbi5sre1tK62tplkdaicrXBeoqycmKCim6Seq6WUn5+QlI6WmJenn6WfnpqZg6SdrKWqsK24sL251NHO1tDJzNLMz87Kxr+/wsq9wbzBwMTExcq+yM6zpLuwtK+aq7i7mYB7bV5hXVpfYVpjY1BbYFNQS0NBRUZFPEBFPkFIQUBEPTpFPj1KPzQ3NTM1Oz00Njg5NzcwMjIvMjQxNjk3NzU1NTVEM0VMTT41MS8wMDY6NDc3QElPSTstJioqKC0uLyxATSsvNTRtiUkwSIl0Pz5CREBDREZLT0RRXFloX2+WkpCUbmxvdXWHs6yhoJ+LmZyZjI2VkZuShYqKfoiHi5CMiXyBhHN7ioOFe4l0gYqHlX9ze3lsbXV7aHJlaWxpZmppaGBmaWlsWm1zlq2kvIiHZ1tvaF1aWlRIS05PSktQS1NRSExBSkdKT19eYmZpYZe3x7C4sru9tbHExrWwuLCvu6uysaert6uNtaedmqeaTpqdjI6flpGmmKWVipOTiZCJkJGRnZuhl5qVloeemqebrK+osKe0tNTU1NbSy8/U1c3Tz83FwsnQv8rJysnRx8zNwtDRt6/DvMS5pba6w6KDcGVeXl5ZYVhaZlpRXVdPUEJCSEVCSDtBQz5BRz8/QTg7RD5ASD00NjY1NTs6Njg3NjU0LzEwMTQ2Mjc4ODc1MzY3QzVCOD8tMC0xMzQ5PTk3LC4sMTtGSz0pLCguMDAwN0s/LTQ2VIhXMESHd0M7Qj5FQkFDSk0/VVlTZVZzkJCYgmhxb3l5g6CqnqWWjJqbl4uNlZGajn2Ji4WNioqLkId8hIJwf4iBhnuHcoOSi499cXh1bHF4fnF7bnhzbGiBcG1jam1weGl3fH7Lv8Hfp25jeG5jW2FgSlBSVU5ZXlBdXE5QTlRRVVRcbm12gnGWrbistKavtqqsvMCwq7SmpLimq66gq7SjjrGtmpeYjJGTkYSOm4GNppGciYOLhIqJhIuDlJWXl5OckZyYmZmfnquspKeirK3P0tXRzcvS09TQ1NHOyMPU0cfN0tPT18zR0cXS1sXAzsfHwqi+t8+eenBmX2ReWGFTXVpQUVRQT0g+QEZBQkU8QEI+RUQ+Pz86PT08PEpBNDU0NjU8ODg4NjY0NDEyLzAzNTI2NzY4NTMzOz08RT1AMTErLzI0OT41OTAxMDIyLTJETjMpLzMuMzI9TjIzOEN9XzJBhnREOj09ST5AQ0ZIPFZSTU5adYaFindsd3B9fn+hnp6hi4yYk5OMi5OPloR5hZCQjYuKh5GHf4J7cn6AgYd6hHWFk5GIf292cmtzfXt2e3OBd3FqgHNyaXBxenlyer7Lmn6MsoR2coR2aGFrXUNaWltWZWNYZGpTWF1dYGReY3h6fouBmKmjpKGfoKilqrC4qqWzo6GtoaOtoaexn4mmmpOSkYmRj4iBlIlqlKKMmYSAhX6Rg4OTlq2LlY2Vmo6GkpGel6ewoaChpaSoyM7PyMLL0dTR1NPO083G1tLM1NjW1tjU19XJ1NrNydfX0cqsw8PMjHRwZGFgWVVaVFxQS0dKSkpAOzo7REFEPEJDPkdCPkJCOzw5PDpHQjQ2NTQ0PDU2ODc1NDMyNTAvMjU0Njc0NTU0NDw+PUU/QTYyLy0xNjs9MDgxLzI1NC8tLTtSMDE3LzUzMkZEMjg+bmI1PYF0TTk5QEk8QUQ/QTtQTEZLWXCAdX1oc3hygomAnZWdlIWLlYmPioiOh49/eIOUmIqNiIiLiX6CeHN7fYOHd396h5GWgINud3BtdX91eH10hXx5bId2dG59doR1eHydtYw7QYvFpX6MfGllV0lDZmNlY2dqZG54W15maGtuaW6Ag4iRi5ydoJ2Ql5ieo6OmsaOjs5+hpZ2gqaCjsZyGnpKSkpCKjouGg4+EfpybjI2ChIV6lH6CqZWjjJGKl5KLfZeKmpKrs5ianKicp73Dxrm2xs3S0NLQzNLLydTO0NXa19fY1NnYzdjbzsnZ2tHWvsvMtHl3cGZeW1NXUltWRkdKSUVFPTo3OkBAQjpHRD9EQ0FEQjs/Ozs3REM3NTY1NTswNjg5NDQzMzQxMDE0NTU4NzU0NDQ5QD5EQkM8MzMuNkZUV09RSkFKRj8xKiguQlMzOTI1NC83Szc1PGBiQTxzdlY4N0FIOj9DPjw5UUVDSlRrbm5wYnBxdIaNfZeRnYt+h5KDiYaFiYGHfHiFlpaIjoOHhYZ6hHlxenuEhnV6hY6NnXmLcHxvb3p/cXuBcYOHgG6OenV3fXyCdX57hoevc1ipwraNkYJwbmI9XmhycHFwbnh2gWVob3J1eHF6jIeOk5GblZ+Vh4yTm6CbnqqfoKycoZqYn6Wen6uZi5qMkJGNhH2Ih4OFi46gmZOIhId+bZl5hJiGiJOMjZSMhnyciZSPrqqUlZifmaavtb2prb7Hy8nJzMvQycPSytTX2NfY19Xb19PZ29XQ2trR1sjUy5V7fWppXFtRVFRfSENGSUg+QT49Nzo9Pzs9Rz0/QUFBREE+Pzo4NkRCNzU1NDc5LjU2NjQzNTUzMjMyMzY0NjU1MzQ1N0VCRENFQjU2PEZOU01bbmZjbnNrYVY+LDRMRzg2NTQzNEJGND1XX2hMdXheODs/Rjw8Qjw6OkQ/Q0dSal5tZGJma3aAiHKRj5qAeoCNfoKCgYN+g3x8hJiOh4t+hoaAd4J5bnt7h4J0epKejaB2jnWCdHWBfXSAhG+Bj4FvkoV0fICEenaGe4i3xaTBybiClpuPd3BlTmZjgXqBd4aikIp4eXZ7g397hHZtk5aUlY+XkYSJj5aZl5alnJeflp6TkpejnZmrlZCQiYyRgoyFiIiBhpCRnpuZiYWMgYaXeoiIn5ePiI2Ki4J9oYqRjLyhmJOXmZ2ppqaun6i2v8DAucfJzc7FzcnR1tXV2dXX29TX2drb19va2tjO3MaHfXtpa2dhVVhWVk5MRE1COz09PDg6PD45PUA2PT9APT8+PDk4NjdEQTY0NTU9ODA2NjU1NDc3NDU2MTM4NTU1NjQ1NTdISD1ESkU3OTI1O0g+Ozo6N0lQXVpSVVhLOVQ+Ozk1MzI3STg9TllNSHh4ZDU9PkM9PUA6Njo+PkBFUV9ZZWFdW2h0enlsiYySd3Z6inx+gH5/fIR7foKRiYSFeoSHenV9dW18fYZ+c36SnZGeg5F8hn54jn14iopugpqAdJmGfYGIhHt9kHqPqI6Pw6G9jJyjnX2JhH2JcouKfnOmmpyYk4V7jpCIhGhHcaCknYyLkJKFiYuQkpWPnZqTlJCWjYyVn5yUoJSRjY2Pin6Qjo6LhImSlpqen4mMlJKdkYKLf6WZiISNgoWEgaWHi4u4mJ2RlZaiqKGdnp2jr7e6tazAxcrQyMfMz9PS0tjS1dfA19jZ29ja2tnZ19u4ent6bWtnWGJcVFBPSUNMQTw8Pjk5Ojo5OTs9Nj8+Pjw9OTo7OzM3REA4Mzc4PjcwNjg4MzU3PDM3ODA0OTc2NzU1NTQ2RlA1RE5JODkzOEFLPTszQ0BJPDlEV048TVRITj85NjMzMz5DO1tYPjVZeXBaPDxBPD0+ODU4OT89RFJTUlhfVlhmbW1taYGOinFzeYp7en98f3uHe3x7i4eBfnWDhXlyenNtgH6EfneFm6GanpSSgIyIf5iHgJuSboeohXqgi3yRjYKIhJt9mpCKjKOioJCkrqCLkYuFi4GThldyrYufq5uPg5ibj4+OXIKikYKMn5OVjIeIjJKTjJSUlI+Lj4mHlpudj5WWkIqSk4WAi4iSjYqKnZaZoqOHk52WoIqJiI2ckIOIjn+Dh4akhoyQs5idkpWXoaGfmZKcnaiyuaymvcLHzcjGz8zQzM7X0NHUrtbV2NrY2trX1tnZn3F/dmloX15ZVFhZQ0FIQz8+Pjo0OTo7Nzo7OzM7Oz89Pjc7OToxOkg+OjM3PUA1MDY3NzI1NT82NTs1NTg1ODo1NzczNUhSN0dPSzk5ND1FSkI+MUZDTEI5ODpHWEA1SFdJNjYyMjM6RUNlWD8mX3lpX3o+Pjk8Ozk4OjtAO0JRS0tTWVBUY2J5bWJ+kYNvbXiLeHp/eoF8hnx7d4aEf3NwhYJ6dXZ2dISDhX1+kqajn6WiloqdkJSXi4qol3KKsY2Ep5KEmZOEmYyilZ+Yk4manqOSqa+fkJWQjY6IloxujbeFmsTIspuhpZucmJaQspFkpM3Ilo+Gh4mQko2Nk5SJhYqJhZaZm4+QlJOGlJeEf4+LmYiNkKqXl6OjiJmflpqIjoeXl4qEjo2Bf4iPpYmNk6mal5OXmaGZn5mTnZujs7Smo7zBvsjFxcnIycLK083N1KnS0dbW1tja1NPazoNzgWllYF9fUEtWXEJCRkM7QT04Mzc7PDo4PTY0OTo8OjgyPzk6MjpJOj02N0JDMzI6OTYyNjQ+PTQ7PjY5NDk7NTc5NDRLUTxKUUs5QTdCR0lANjRKRUxGPjw4OEVUQTc+XDg2MjE0OjtFYFhBRmF0aExjWj41Ozo6NTs6PTpFTUZIUldTUkJjgUZ1go59fG1+iHh6fnqBgYJ+dnaAgntsbot/eXx4eHyEh4t+i6OzqKOrsqGWp6ClpJaVrqKDkLeVkrOZjaGgi6Sbr6KknZiQp5apma2vpJeVlZSQi5ialqDAjqPJuKuaoqWtmZGbnLKdhoWoop2YhYiJjpWNi5OPh4GGh4iTmJSMi5OThpSYhoORkJx0kZmylpekoYicmpOPipCLl5qJipaOhn2MmZ+KkJCcmpmTmZiflKCdlZ+bobKuo6W3vrTFx8S9w8O/xs7KydKnzs3T0tDW2NLP2Ltze3deYldiWFFJSk9FQkNENT46NzY6Pzs8Nz00MjY2OTc3ND01PDU8TDw+OzxCQTc1PDs0Mjc3P0A2P0A3ODQ5ODc7PDU1T01EUFJMOEA9RUFHQTU6SkVORUQ6NkFAQlM+OURPMzIzNTc1PXZcPFJcdGlaTV1TPD04OTU2Nz06SkZER05bXFlKZ2E7SISKentthYZ5fIR4gIWBfXB4fX18b3ONen2Be3iGi4mFhJKou62osr2vpa6zs6ijorCsipq1nqK4pZWspJeprbempKOfmamYqqSvsKmamZyUlZGYoJeZu7utyaBptrirsJWYn6Krkpe9o16psoKJio2Vh5F8j459g4aNj5SUiIeSlouPlY2LjZeZkp2as5aVq56LnJSSjZCSjJibipKej4uJlZ+ijpWOmJqdk5yYnpWioJScnKWvqKKls7irwsjEtbu9u8XIyMLRocbJzc3E1tbQy9OicXxqXlxVYFJRR0Q+PUNBQjg/ODc0PkY8PDY8MzUzNTU0NTRCMzo6Qk06QTtBSEI7OkA8NzQ2PEI5P0BCODc0Ojo2Pj00N1RLQ1VRSjc8OklBREA0QUpITkJBPzZEQTxKTkQvVD0yNTQ6RUpcWEpaUW1ncHBEaWBLSTY3NTc6PkpAQ0lQZUhiYGNwSkCLin6AcoaHfIGJdYKKgn5tfX18f3B3h3eNgYd7jY+Mhoyaq8LAsL7Gu7O0wby0rauztoyosq6uvaqbu6Sorbm3q6amoqGjo6qvsrGqnZykmJuYl56ipaWSo7muqMC7rK2yuaWkp32IhpytvbCDi4yLkIOPg5GPeoGHkI2OnIiIj5eNi5WXlJCalpynmrGakaudjpmPko6VkJCWl4+RoJGIlZukrJWWj5ScnpShnpuZoKGUmp6op6ShpLCzpsHGw7Cwu7bFxMO+zafHw8fDvNXQzcTKiXZ1ZF5cYVxPS0NMQEVGPkE/Qjs6ND5BPT01PDY+MzMzMjQyQTE3QEJOPkdAQ05DQT1DPTs4NkNDNUJJQjo4Nzg7NUI+NzlWS0RXT0Y4PTRLQEM+NEVLSE4+QUE2QkI/QlNFNThQMTQ1Ozw4O0Q+OUxqal07V1JkS2daVU83OUdFP0NGXGdHYGlnWl1bk4yMiHuHi4aDjHWGkIqBbn58gn9xfoF6lXqSlJSYkZOVp7TGycDCzMHDuse7uq+rubuXsra6s8CupcCkqrC7u6quq6Kinqesr7WwqpugqpyinJafsLSni6O6urXBu6uonLKkpKiUhI6pw8SkgouOh4iEhpWUjXqDjJGPkaGMjJSRj4mYoJeTmZSXpqCunYyqnI6Vj5KRlZWOkJWRj6GUhpefoLOflJuUoKGZpJ+aoJyglJiepqSmp6SvraW/xMKuqbe1ycO+ts6yxb7DvLPRysjBtXZ7bl5aXWxUTklDTEtKSUBBPUNEPDVBRDs6Mz04QjMzMjI2MkEwNUlFTT5JQEhSQEg+Q0A7Pj1GQTVBVUA7OTk4PDdFPjg+VkpDV09HOD80TEBCOzVKS0NMP0I/PEJGPUFITDkrRzwzNjc0NjRBPzdPYU9hRS89PjZrbGpgQDpIPj9FQmdcTWVcZlRjapmNlomLiJKPhol5hpOQgXKAfI1+d4eBgpB6jaGWqJqamLq+yMnKwtLJysLNvMGzrbu+p7q/vrzDt6zBqayzu72qsKmkpaOsrrSttragoK+fpaKYo7S9qZuovMGjtravq5KvrKqrloaaqaalkYKMk6WViYB1ipJ5hY2RkJ6gko6Ui4+NlKOZl5uUlKOeqZ+RpZqMj4+PlZaIfY+VkpKjmpWgopy1ppCfl6Wko6WfnqaYnpWXm6Wjqaiisq2ou8DEr6Wzt8zAua7Ds7u+wbitwsLBwJlwe2NaWF1cTUxNSUdEQ0hCQkFDSzo0REg6OzQ8N0UuMTIzNTJCMjZTSE48SkJKUUVLQ0RFOkVMQjw3RVY9Oz04OT88ST86RVVJQVdRRjdBOks6Qjc5Sk1CSUBDPjxERzxCQ089MjBIMzY2MTcwPUI6PWpqSks1UVMzU3BwZE47RD1ARj5rSV9YYVpkZVaej52Ol46ekomKf4mfkoR4hX+Vfn+QiIqQgJWgma6no5jCvcnEyMbTzc7Ny7zCt7C6vLS8yrzDwba2u62zv7m8ra+ooKmntq2uqbK3mp6toqehnau3uKmlr77Esb25s6eps7OtrpaVpaynoJGOkrHFp5WNfJGVfYeRmY+qmZiTk4+TlZOlnpOdmZOho6KcmJ+Zi4yPj56IWpCXl5KWpZpmmaOfs6WWo5asraunnJ+nmJmWmZWhpKimnrasqbq8w7WmtLbLwbiqtqyzuriuqLi6vbiDbnBcWlZXT0dLU01LP0FIRURHRkc4NUZNOz43PkFKLjMyMDI1QjU1UFdOO0xGS1JMT0dHST5JUT86OElTOzs/Nzk+RExCQEhTS0BXUEY6QT9HNkE3O0hNQ0U7Qz00RkU6QkFCRzkvOkEzNjAzPkdEOTQ9dGRNRztFKzpmfGhXOz1AQkZCckZpSVJlYkxGppSclqGXqJaMkIOHpZKIgYeCnISDlZCRlI6aop+vvq6hx73GxcjHzs7O0sq+u7axuru8vs62xL23uLeysrWzuLKrppyrq7irqaiwsJejrqSnpKW0wLCqrLO+wrrAubOnuLO3s66Vpa2urqSLk5WhjXPBmX2WmYSOlpqLsZWampWSk5mapqOVoJuWmqicm6GgmYuMj5adYEqWnJqUmqWXVJawn6+cn6WUr6+tppuhppSTmZmOnaCnopm0qaqzvby7q7Cyx8C4pqurrbGxo6GysrSkcnBnXlxQUk1FUFBQUTtIS0lGSEFDPjlLVD9BOj1FTTA3NTQ0OkIzNE5XTzxKS05VTlFKUEhISk9CPD5NUjs+PTg6PENSPkRIUklCV05JQENBRjM+NThKS0NBPUM7NEVBOkE/PkhANSpCNTIsPmNdZzozNXRkZUBSNyYjM31pWDs6QkNAPVJFV1JzYldGSKuXmZ+hqK6YkJeHi6eWjoiShZ+IhJyXj56gm6Oltcm0qca7w8TIysnIzM7Hvrqzr7m4wMHNtci6wLm1urGvr7K0pqObqrS0q6mmrqyZpK6lpaisur+oq7a2v8HAvrizssKvt72ro660rLiliJuXppt2vqCEmJyOk5mai66WoZybl5WboKGpnqigmpqqmaGnnpeQjZGdg252k6KalZ2in5CusqOrlamqmKuvpaWgpaqTkpmbiJScop6Wsaeqq7q3vbOyrr65tp+jp6ilp5ycrKmpjWVoYmBTTE1HSE5KVkw9TURNSUpBQ0Q8UVU8QUFCRE8xOD03Nz9CNzVVWE4/SE5RWFJQUVRKUUpKRUFFTVE/Pz04PTtHUjxFRFFCR1lNS0FIREU6OjM5S0lCPkNCOTlDPjxAPjs7RzctMj4tMYJoTnpcLzBraGA8PUJCODZ6Zlc7Oj0uLlNhTVZIf2VeSEaslJyhn7uumJSei5Oqm5GSk4mrjYeinoykrJSjo7bHvbTBusPDyMnFws7Iwr25sq+5tMDCyrbGscG8tbqrqK2sr6Oimaq0uqappqyqnaivp6Srqr68qKy8s7e9xry2tbjAsL2/s6m0tqu+pI+il5Gin7yfiZqgmZeenY63n6mcpaObnKGap6WzopudpZyoqp6ZlY+UmouXiY2kopScop+gta+lppOxq5qrrZ+epaSqkZWVoIOQnp+clamloqG0tbq1rai1srOenKKmmpeVmaqhnnhiX2FfTElHSE1RSU1FRkZCUkpIQURHQVZTREg8QUdRMTtCNzpCRjc5XFlLQUxQVFVTTVdSTlVKREBKSk5POUM/NT08TlFDPz9QP0VaTUpBS0RHQDUzPUlHPz1FQTk3QTs8QDw8M0A8Lyc7KkiRQjpTSjAsW29XNzE8Kh1CgGRUNDktMTpoXUZEQ5xwYkdFqJeknp7CrJuXpZeZqZyWmpqPqpaVqKaVrayZoaq2xMG8v7jBw8HIxL/Nxru+ubKwuLO/w8i1v7C8t7m3p6Srq6yhoZurq8Sipaispp6sr6yiqqi/uKasvbC3tse2tLm4vrC+wba0srSvvqOWo5aTm5Stn5ChoqWjo5+QvqWpnaisnZ2hm6afvaKYpJ6iqauhnZaNlZ6Tn4ePhY2TnqSgnbWsppyWsqeZsKigm6ufoY2ZlZ+FjqGam5KlpJqYrLG2saqlqa2snJigoZKOkJWpn5RqZVtiXlBKSUtPTUhGQ0lAPU9IQDtHSUhbUk9LPUhOVTRCRjk+SEc1Q2JbS0NOUlVXVlFYVFJVSEA4UVFQTTpHQDRDSFFTSUM7Qz5HVktDQE8+SzwwNjtHRj47RkE1Nj85Oj85OzE1RDAtLDBNdlw0S1o1LE1uVzwtPSkeI3piUTVDS1E5b1JGPEt4ZmNYTaKao5udxKuhn6ydna2fkqKelqSgp6qsl7awo6qztsXCvcC2wMK8ycK/ysi2uLW1sbS0t8HGt76xuLW6tqCnraqsnZ6fpaTBpaCqrqCkqa2voqanvbalsbu3trXDsrO3ur6xw8C4uK2ztLWinKSVkZOgraCZoZ2pqKuimsOtqZ6srpubnpimoL2hnaSYq6urpqGZjZqfkp6Jjlh/lp6moaC4qqeTmLejn7OioZyvmKCPmZSdgo+gl5aNoqSVkKaus6upoqKlpZWVnZmLj5GTpJ+JY2ZcZWFNSktLT0ZFQUZLPj1KQTk5SkpOXVFRSj1MV1w5Rkk9RE1JOEhjXExDTFBTWVlWV09aXklBPVdRSUs/SEA1SE1YU0hBOkBBRFBIPz5RPks3MDk5RkU7OEc/LjY+Nzg+NzcvMT85MSUxUVVtW0pPMTA9Z1dEMTc9LSt3YFM2U1prV3NIRTY9dWVcTE+en6GYnsOnpaKzoZyyp5OqpJ+jn62prJ27sKistbLIw8HDs8LEvsfEvcXKvbCxt66xta+/xbW6sbC6tq2aqbGpqpuepqGowq2brLGcqqKusKmkp723pra6vK+3xK2zs8K/scazurertLatqqKllZWUo6uhn5+ap6uvr6+7sqagqamZmZeSoqS4oaGkkq6vrKSmn5KhnpWej5GNlZ2ao5+ntKenjZi0nKOvm5+cr5GglJeUmoCSoZaPjqChk4umrLClp6KcoJ6SkpuUhYuSjZyegGNnXGhmS0pMS1NCQ0BJRzs7Rj85OU5NVV5SU0o+T15ePUhQQk1MSTlOZF1MRUxSVFlbU1VPXGJIQT9aUUFIQUtCN0ZFTEtOPjtCSEROQj07TkBBMy85N0NCOTdGOys2PDQ2PDM1LS80QDErJ1Z0U2VPPzEwNGJbTTIzPjA8dl1eP1tVXmZyQDg8SJZ3ZUE0n6Sfm6DCqKOqsaGjtKmWsqumoqSyrK6pu7KtsLS0xr/ExLXAxb7KxbbAycK2q7WpsbiswMS0t66ttrqlmauyq6qYoKeXrbu1m6iwm62frrSyp6q6s6e6s7eyuMCqt7LCvLTFp76urbe1qaesoZeWkaWkoqKXl6SvuK2ytbagn6ikmZSVk6Ogt6OkpZWusrKlqaWinpqampWYqJ+fmKKerrKipo2Xr5mlrJibn6aSnY6VmZuGl5+UjJCcnpSLqamroqehmZ6WjI+ZkIGGlomUn3plal1sa09RTk5UPUJBTkM7OklANzdRT11eUlZRQVdgXEJKU0hXS0g6VWRdTkZPTltXW1JQUVhdR0FCW1BCRz5OQzlIR0hOUD8/Q0lCTEI8MklBOTQxNzdCPjs3RTcrNjkxNDgwMi0vLjw2LSNCcWdzazIzLzFcY1ozMzkwNnBbYkgwNUpwaVZDV0aMeWZDO6SknKGlv6aor6+hqbWqnbmvq6SqtLexsLm2sLe4uMW9w8e9vMTCx8G5wcfBuqq3pa27rcHDt7iqrbK8o5WtsK2yl6aokaq5qqCnsJ2qn7C0s6qptrasu6yysrm3rLmwwbm9vqbDq7C3rqiqq6admJiqoaKgkZegsK6zq7C5mpupn5mWkpemoLeppaKir7Gzq7Gnq5+boKCbnqWdoZedo7Owm5+QlKaaoamblqOgl5mKlpmUl5idk4iQm5mUjqmpp6Ckm5ibk4ePmYt+jJaGjptram5ibm5YUlFaVEFDRVVAOzpJQTc6WFBkXlBXV0RZXl5NTFJPX0tKPlpkXk5JUU5bVVlQS1NXWkk/RFhQREY+Tj89SUdHUVBCPUNGQk0/OjJEPzc3NTQ3Pz05NUU0Kzc1LzI1MS4tLiwxPionKz1ccD0+MS4xZVtkQDE3NDdnWWBGKEA4bH1oXFY6iXtjQz2on5yhqb2hqrCqo7G4qaW1squhrbW9r7O4vLq9t7bBw7/JxLnFw8HAucW+wbivtqirt7K8v7+1qq6yuJ+XrK2orZeoqY+nu5+lrbOeq6KxsLOsqraztb2tr7G1rLC1scC5xLarvK+xuKysqaKxpZ6kqJ6kl5CYn7Kqs6qqs5mdp5uZlI2gpqS0rqeirKyusaeyrLKpo5ufqKSelaCZm6i1qZeZkpKfmZ+hn5Gsn5mZhpaYjJ6anZOKjZaXmpenpqOgnpaVlpSBkJWFe4+ShIyXZm1zaHBzX0dZZlZEQ05YRFo5SEI2Pl1SaFxOWl1HW15dT01SWGRKSkNcY2BQTE1OWFdYUEpWVldMPUVVSkVEQU0/QUZISFFQQTtGREZLPTg3Qj02ODcxOT48NjVEMCs4MC8wNS8qLC8tKj0sKyUyKyo1SzEuJ19eYVYxNTE9YFZeOClDM1lVXGdLNYx6ZkxApJmgpKy3o6yppa6utqqutLmmp7C4xbext77BwrW0u8W+zMW5w8G6v7rEt8G5s7Wsqrq3u7q+tauusbeZmKirqqubrauPq72eq66xo6qfsa2zrq62srm3qq2usae1r7S6vMmyqrW0sbSvrqahs5+aqKygpZWVmpmxoq2gpa+WoaSZmZKNoqWmsqmhprGrqrWkrrC1r6OZna2nm5eemZmsuKKXk5CPmJyhmZiUraCelYKTmY2enJqXkYuUkp6apaOioZmWk5KWe4yQhXuNi4OLlGxueW91fGFGYGpaSUhaWz17SkdFNkFiVGlaTVxhSltcWlJSU2JhTEtFYGFgUExJUFdWVU9HV1ZVTjpJVklIP0NLP0VESEhRTkE/SEhIRTw3PT46NzU2MDk/ODY2QiwtOCwvMDQsKCwvLSo3NikoOS4kOks1LiJUYFZhLjUoQ15RXC4qQS9KR1BbRzNjWVRLRJmXn6+osamspaOurrWptrS3o6y0t8m6tLu6v761tLfDwc3HvMS9t76/wLe/vbK9rqe6ure3wresrrK5lZenrquno7OqlK+6pK2ysaanorKzsbKxtbG4sqmuq7KnuK+1s8TEtqm0tauwramnorafnqaxoKSUm5mUsZ6nm5+pjaminZuVl6WlpLenorCzq6exp62wtaykmaGsqJucnZuUqrmclY+Oi5mdopiRmKijoJeEkpaQnZyYl5aIlo+XmqidpKGSlpKQlneEkId8hoKEjY1ucXh2fH9dS2VsXEpPZFw/YntHSThHZ1dlW01eYk1YWVdVWFRpXVBPSGFdX1BKSFFWVVJLSFdVVk04TVpORUBGSz9IQkNLU00/P0xPSEA7Oj47NjswNDE8PTQ1OD8pMDcpMS4yKSksLC0rLTkkMDQyJTlCNy4jQU5JZzI3J0ZhTFYlLUIuPUVMUTwzcmtLREORmKStpK2tq6ajsLKzqrawtp+rtbnJua7Bu8O3s7K1wsPPxMDCvrW9wL+6v72zxKiqubG2t8C9sKy0tJ2hp7CtpaaxpZ6ytayrsrCsqai0uqy0s7WstKypq6isqbmtsbDHvrikua+pra2mqK2wpaOjrqOpnJ2bmq+ZoqOio5Csn6Ogn6GppaW4pKu0tKSqq6isrrauop2jqKqcoJmakqS0mY+JjYeRo6CWjpWfoZaUho6Uk52bmZaVh5iSlZmnnaCgjZORjpF4fo6FfX19h4qKcnRzf35+XFJkbl5OWmddRkSWW0c6Tm1YYltNYWJOVlZWV1RZZ15RUkxkWltUS0dPVFNOR0lWU1xOO1BeSkJESEpBRT8/S1NPPjpOTUM8PD45OjU9KzMyPTYyNDk6KDQ1KS8sMSgpKywtKiY1Ki8mMCkzODoxJiozQ2U7NipIZEhKKzpJPzNDSVMsPo9rPkhJj5qpqqGpsKSoo7O0sbS1sbGhrK29y7quwbvGsbSttMLD0cTGv8GzvsLCvL+4vMWorbess7i8wbGssq6hpKetqaiksaOrsaqvq7Gurq2rs7unt7GyqbKpq6alo626rKqwwrm0rLmoqKitqaexpamkoq6qqKKem6KslaWdl56Yq52hp6ihrKWjray3sbGgqaKfqq2wrJ2epqepmqOYmY+gqJiGg46Ki5+gkIyNl56RkIeIkZWhnZaYloaWk5OXpZ2dnYySkI6KgH+IhX13gIeFh3Vzcol2bF9ZYG5jUXNyXEs8hHxGP1d1WGBZT2NcTlVWVVdQXGFfVE9PaFhXVktHTE5SSEVJVlJdYzxQXUQ8RkhIQkc/PUpQTDo+T0o9OT89Mjo3OyozNT4xMDQ4NSg1LyosLjMwOyksLCclMjM0JCwyLTg2MCkoMTxeSzAuSWdERjg8QjA1RUtYMUCUXEBNRpWWrKehqrKcqamwtqy4tK6qpKurvcm7sb63w6+wrbPExM7Ow7+/tMHDxLrAtMnErK+3rrK6wL+0rq6spqiqsKmmqLKmtK2qsK6tsa+zrLO6pLizrKytp6ugop6wt6uqrbq2pLW1pKmnrKyqrKGopqaxsqSmpaGhq5aqoZOaoKaeo6KqpKyinqaxt6ysoqWimqmqramcoaWkpJmgmpWPmJ2TgYKQiIWdoI2Lj42bkJKMhI2ZpZyTkZuMk5GRlKObm5qLjouLfIeBgoJ7dYGEgn51d4ukh3lrXmBuZ1dmh2ROQGeSTERieldiWFJlVU1WVVVUT1xdYVZLTmlXVlZJSkhJT0JHSVNRWW9BTVhAOkpHRkVHPj5FUUg4Q0tFODdDNzI6OjoqNDk/Li80NjMpNCsqLCsuIzQuLSsmKCs3OSomNis8LTIsJjA2WFouMEpnQUE8PEMrOkpPXjREhkFJSESWka+koqqwmKqorbWrtrCrpKuqqbzBwLi5s7y1prKvxMnL0b/Bu7nAwMK5wbrCxK6xtbK0u8G+s7KvraysqLaqpa2wq7muqLCwrrGrtaq2taa0tquspKmqnKOds7OoqKSztKC2rqGpqKuoq6egqquoubapqqqpoamfrZuRqKGdoKOipqKpnZymtK6npamio5elpqapnKKjo5+ZmJ+Rjo+YjX6HjYeFnp6IhYuLj4+RjYSGlqOajo2akZKRjpOfmJmWjYuEf3SHgYB/eHWEgHt4foCInY9wcmdncXhcYXSIaU9dmFZIbXlVZFZSY09MVlRVUU9YWmJWSFBqVFZTR1BZVUk+SUhPUVB4TU5WPTxLRD9AQTxAQ1VDOUFLPTU7RTEzOzk3KjQ6PSstMzQxKjgqKisqLCkqKC8qJiklMzssJDIpMjAyMSUvMlJjMDI/Zj1OWD9DLD9MVF8vSWs3UkU7lY2voKWqrJmrpK2us7SuqqWvqam7vrvBsa+4raK1r8nHyNHAv727vMO9usPBwL+vsbOytr28wbKys6u0qaW1qaSts7O4r6KttbGvsbmquK6qrrarqp6qq6CjobatqKGer7KhtKqeqKeqo6qhoaytqL2vrK6soaenn6yZj6+imKKgqKeep5uYqbCoop+soqGSoaKippiaqKWYmJidj4qHlYh9jYaEhaSWhoOCjIeQj5GFhpWhl4mSnZGTkI2RnZWXj4qFhnhzgX99dHh6gXt0dHtqgoikdmleZWyBdWeIi3xSV3BeS3hzVGRTUV9NTVJaZ05MVlllWEdTalJRPkJOUWFROklITFNJcVFMUzs8ST87PD07QEBXPDw+SDczQ0IxNTo5My01OjopLTMxLS02KSgrLSw1MiMyKScsJS47LiYxLjAtMTQlLDBNaTozOF89YWQ/RjFDUFtbK0hPO1hCNI+OsaCkpaqjpaOsprSzsKmksKequL7BvLCouaqnrrDJx8jQwr3Avrm+vrzJvMK5sbC1srq8ucCztLutuayjtaenrLK2ubKmp7q1rbS8r7ylra21q62cqa+kn6WsqqecnaqypLOomqqnqqSpnqKpqKm9q7SvrZ6po6CunJqyopakm6Sln6SamaeqpZ6aqaGbkZugpJ2YlqmpkZmak5CKgo+FfY+CgIiej4eAfoyHko+QhYGUm5SGk6KNlJGLkZuTlYeJfoByenl+fGh3fHt1cXJ+aYZ6hIhkYGhjcoV7bWh5XV5WQ1h7bVRhUFJZS0tNcHRdSFpbZ1lFVmdPQz5LTkRDQTlIR0tTP2phSVE4PUg8PDw+Ojw/VDY6P0M0NUg+Mjs1OTAyNzw1KC41Ly0xMSYvPktJMSUaOTAlLCwwOS8sLCs2JzE3Iy0vR2pJMTRYPWZiQUo3R1NgVSo9PEZcQCqOk7GZn5+ppaOhqqS2srGkqbGnrbnBvbWwo7mtqKiww8nJzMG3vcC1t7+6yLbDtbSztbK9ubq9tq25tr+torOnqquvtbe0qp26u6ixv7K5oK+0tqmsnq2xo5ylqKqjnZyksKavoJ+rqaehqZyjqKCtu6eusa6hqqKjrZ6erKaXn5uhopyfmpmiqqKamaOjlZaTnqGWm5amrIuekZCRjIKLgH+PgXualIyJfX+Mh5CQjIqGkpiRh5SkipKSh5CakJOBiHx5bH12eXhie3pycHFzeGqCdWqDZ2NoYW5zjm1ianBgb0JdeWtWXk5RUUtJTFNZVk1cXm1XRFhhT15QSE1ERjs3SEVLTzxyaEpLOUFFOzs9PTs7PUo0OUI8MztHPDQ/MTgtNzg7MigwOS8sNS4uPS0qTD4qHTQ5JicuMzQuMCsvNCYsOiQ0MEFoWjEzUz1lX0RMNktWZE4pPTNRXT0jkpesmZ+Xp6Ohn6ejt6+toq+vqau5wrqzrZ+5r6uotLrHyse/t8K+r7S+t8S2w7KwurGywLa7vripubi9qqS1p6iqsK25sKmZubyjrb+0tKGut7Wmpqews6CfpaaooaSZnqyoqZ6gqq6noKaXoqifsLifpLGuoKyhraSbpqapmpqbn6OVnJuZnammlpqeqJGYkpidk5mWoaqQmomNkId9iH+Cjnx8oYyMiHmEjYWKjY2FiZOajomVn4mRlYOMl42RfYR7c3B8cXN0YHl4am9xcXBrf3NkemxoZmRiZoeAYFtyanFNToBpWFpNUUxLSFBSUUhNW19vVERYWlJnT0hLRUY1NkhCTEk1WmVKQDZFQjk6Pj0+OjpDNTk+OjNARjwyQDIzLzo7ODMmMjwwLDg1QiopLUMqLDQ7Tk5AOzczLS4rLTcqKjwlNTM9ZmQyNE0/ZV1GTz1SWmdIKj8wXFs1KJabpZiclaygnqGkobeqsKO0tKmpusW2sq6gt6ytrbC2xcfAt7/CubC1vLe/u7+vrL6ws7+yvcO5qbu6uKeotqinq7Css7CmmLy2o6q6ta6fsbivqaWnr7KboaSgpKOhlpuvpqGfo6ivoaCik6Okorawoaaxq5+so6+Xm6qlqJ+Ymp2kk5qbmZylqZmbm6SUlJeVnI6Tl6KpoZCJio+GeoR+hIp6j5eKjYd6goiEiY2PhY6TmIyOlpmKj5d+hpeMj3qAenBxdm5vdF94d2VtbGxraoRvZnJpa2ZpXmR0gWBba3ZpWkp/XltYT09LSEhSVUYyOV1ebVBEWFZZZU1ISUVFMDdGP0tCNklKSDs2Rjk0OT49PDk4QDg7ODo3QEk+ODw0LTM8PDc1KDU+MSw7QTEoKzY8IjhSPSoxMTM+RDUsLSc0Mio7KzEzOWNtNzRHQWZbSFREVV1oRC48MmNWLDKVoqGXlJuqnaShoqG3qa6gurilrL3Fs7Cuo7Wvra2vtMPDvLO/urexs7m4uri6r67As7S5r7/BuKy9urWmorOqp6myq62xoJrAtaSmtLWonrK8qailqa+smaOnnKSllJihsqWZn6SoqZyioJOkn6O4qKSnrqadpaGokp+ooqGhmZucoJKam5afoaqbmpiglJCTlpmNk5OjqKSQiYmPhnmEe4SGfZ2NiYqHeoGEh4mJkoWWk5OMkJWUjY6Ue4OXjot3fntsdHFsbHNhd3VpaWpnZ2+GaGhpY2ZpamBrY2poXGV7Y2BTdFRcW1NMSkdJT1NAISpoXmpMQ1ZVXmBLSUdFQy46QjxGPDZLUEQ4OkQzNTc9PTg5NT86OzQ+OEBLPT45Myk4Pjw6OSo2QDMuRTQoKyw/MC1OPy4rLTcsMTE5NSwmLjUtODA1NzZgdEEzQ0RnW0tXR1VgaEIzNzlnTycynqKjkY6kp5uenp2jtaynqrq3p6zEwbawrKO1rqeur7fAv7yywbewrrK2tri2tq2qvbOusrG9v7iuvLuxpZ+2q6WltKmqrp6dwKuopK+yqay1u56oqauxpZieqZ2mpJGZpq2imJ6kqaGboZyWn52ntqWvqq6hoZ2doZSgpp+hoZqbmZyRmJyTpZ2roZeWnJSSjJWXi4+YmqmgkYiJi4h5hXeCgoKdiIuCiX2AhYiHhpGEl5WQjpCRkZGMknuDlY6Gc319Znhva2prZ3Vza2NnZGR2gWNlZmZmampka3JaX1ldbWRhTmlYW2BWSkdJS01SWD45X2xpSEJUU1xbSUhGRkEuPD85QTg5UkZANzpCMDM3PTc2OTI6PDk3OjlETT1CPDAqPEA7QT0tNUIzNz0rKiwwQipKSy4vKiszNzIyKDU3JCs3LjcyNjg1XXlOMj5IaVpMWkpWYmZAOjNCaEglNZqjn5CMraGYmJ+WpLOxorG9tqGxxry6sbGkt6yqrqm5vLu7rsGyrq6utq6yuLOoq7mxr66ztrq2sLi9raaetaqgoLCkqq6cosCgsaSusK63rrWera6traKanaeppZ+Vmqeln5mloqidmp+blJydrK+luqiuoqGamp2ZnqSapJ6XnpiblJmgkqiVqaeak5qakYuVmY6UlJmpp46NiomPfIJzgYGKmIWHfImJhYWKjIqShJSck5KPkJCWjpB/gIyNgnCAfmZ5bWhraWdxcmtcaGNjdIFiZmhqbmxnampobl1sbHRwYVVjaWRlWklGTE1PWFFRVmFlgVVAVlNZVUZIRkVALzw9Nz82PEZOYTg6PzI0OUAzNzgyOD83PTg+RkpARDkyLT1BPUE9MDVAOUAxLSsuMzw7SzYvLissLTI0OzYjMyopNi41NTQ2NVp8XTE5S2pbTVtLWGRkQEExSmZDJzSRoZqNjrCempOhmaiyr5+4v7agtMK7vbqxprawqK6lt7i3t627r6yqq7aqs7itpbO1sq6psLe2sbO1uqepn7WonZ6ooqmtmqe+mK2jrq+1ta2sn7Gtr6minJ2jq6iclJympJ2aqqKklpqfnJCbo6uqqbufp6SgmJmZnaGPa6KWmZxwgpWao391kamnnpSUnpCIl5mAloqhkHiGlIyDbml+doNxbIaLhn2EjIdwXmNhZ4SYhmyLj5SSdHeLhH6Dj39nhoBndWhlV1xoc25OUGpjZ3OFZ19kZm5tal5fYYqPg4RlTktEOUZUZ15KR1BQVFVLSFJgb3RlRlpRVVBGSEZDPjE7PTY9NjwzZlw1Ojw3NTtENDg2MDpCNz86PkZMQ0IzNDM9QEBAPTI4QEU9MSwrMDg+RzYwMS4qLiovNTY4LCMxJzIxNDoxNzVYgWwxNk9rW05cS1tmYj5HMVFkPSoui6OZhpWwm5yToJuqraqjvcWvqbjCuL29rae3sKWrpLezsrOxua2ppqy0pq+1oqi4traop6y3s660rbOiqZ+zqp6hpJymp5irupWmpa+zt62upKmuq6yloZ+coKenm5egpaWbm6ennZOfn5iQnqeqo7Wvo6OjnJaXl5ejiKCOkpqHoYeTnKB/pH+lqp6SkZqRiIRyeI2OhYihdoiMaZeIZn1yeKFviIeEfo59f6GgoJmAfIeedIeOdpuKbIeBg2xoZWN6a3FhU4VtY2xpmHFZanBviFheaVtra1uIcW56coVnhoRaXkdOP0dfTUZSVlZRUVJXVGdeTVdJUlNQRkdHPjw0OT05PDc7MDw8Nzk5OjY9RjU4NjA8Qjs8OT1GUUc9LjU8O0A9QD41OUdBODIpLjE8STkvMDEuKi8oLTQ1ODMlJjIxMTU+MTw4WIN1MjVSa1tOXExcZ189SzFXYTcwKIumloOcq5yZmJ2fqqqnqb7Dr7G6vbfAv6qlt7CpraaztK6vs7erqaWxraW0s5yttba0pqeos7Gtsqiunqugsqigo6KaoaKarbOUo6WltbynrKerqqyopaGgmKCmo5mZpaOkmJykqZaUo5yUk6SlpqG3o6OgpJiUk5eSnIivkJiUiamLl6GbhbGAo6ydk5mdlHmC1KiAh5XBm8d5eLGlt5dkgMCcv3mEhHmQhHyQkJHKcZe8nMV6crWmu5B7gGyWsauweGhrWLGubmVpvJK8bmh6b3KQ2H5TamK2sn+BcpV0mqGqkFdPV2JQVk5GVFtYUVBSjFxXXFBAXERRTkVHSjw8NTc9Ozo5Oi49Ozg3ODs5PkY2Ojc0PkA+Njk/RVJJOi41PjtCPD9BODpKPjUyKjIyQkUvLjMyLisvKS0vMTg2LSAvNDE2QTE9OleDdzIxVGtcT1tNXmdcPkwxW100MSGNppKAp6qfl5ydpa2yp7DCvbK1wLW3vsKrp7OtrKmnrrOpr7a0p6emtKWnuK6cs7K2qqWkp7KurrGmqp6npLGjop+el5ufna6rlJ2in7O6o6qpoq2upaGdm5qhp5+Xm6egn5iep6eRnKeak52hpqKgsKKfn6OWlZKYkpmFr2tqio2qfmeDlYatZHCdnZSZpZRxrqGkfni7fWuhj3axX2q0W6WAZpyRYGaCemZ/anhrqWS+cmemjHWxanyxeHSSk2NtbaduW4SgRWhmh5ZFdZxgfmh8pKeCWV+Lq2mAlnh5aqc3Sq9cWFNsZFtLTldfXFdWO06JT1hXL0lUVEpERkY9PzQ2Pzs4OjkwPTg5OTk6PTxEODs6Nj1BQDY8QEhRRzkwNzxBQz5ARDhARz0xMy0zM0UzLi41My8rLyguMC46NS8nJDIwM0IvPTtVgnYyLVZqXE9ZTF9nWTpNNV9ZMzAbkKKVgqynpZ6jpKqyt6uzvb6wtsSyt7rBp6mwq66oqbCuo7C6r6SkrrKjqbionrOysKOloKqtr6yvpqefo6Kwm6Kbl5WXm5uspZaboZ6zs6KrnKKtraCdmZegoaicmJ2jn5yZoaakj52impegn6qepqagm5+hlZWRlpGahbWbtXiFqZm1mXaGs5u3fpOWlqiUfmyCpnuChoiSlJJ3q2drsVure4+HlHSJcY+GgH+IkJd4goKLmIyDoI+EsHZ3n3Fra2x8i06kWEhjY5l+Y2imYHlzdVOTh15QqW1jcX6HgGKcLlGhb1tTa2hgTEtbZFhcWkI+sXlYWEEjTWhGQ0VBQEExOT44ODo4NDs6OTw5OkE6RTo6OzY6Q0I4PT9LTkc6NTpBRkJAQUQ8RkQ7MDIwMTtGLDAuOTQwLC4oLzMsPjgzMR8vMi1EMTw8U31uMytYalxPWE1fZ1g3SjhhVTUwG5WflYezpqagrqmnsqypu7bCsLvCrbi2v6mrra2upq2xqaGvvKqhp7Sso6u1paazs6ejop2nqrKosKilnp+fr5afmJSVlZedrKGZmaSotK6hqY+pqKmanZWYoKWnm5+dop+boKOko5Wbn5eZnaKpm6WZnJyioJeTkZOTnYPVk5m5cLDCfsWGfNaUm7t8mpWkj42cjaR7joekgqWCeqx5j51Wr3qIfp9quVq5doeEfaaCk3yYeqp5jZ2Qe7FujoR0kLyFb5RQr6fFilGgemNgqWJzc4htl4hgU7W0yIaAiXxjpDNCnXZdUGppZFBAWGdaZGFKSE5tTVtST1lmWUNEP0U/MD08NTk7NzQ8Ozg9OjxDOkY6Oz42OkBDOzZAT0xIPDo8REhDQkNEPEVGODEyMTFEQy4vMDQ4MystKS4zMjM5NzEjJTUqPjM9PVF3ajYqWWlbS11PX2ZUN0c6YVE3MSWbopOYsaiopbOqpbSppLy3wbC5wLG1s7qytKaxsKOwsqafrraomqe5raOvsaCztLCgpJ6fp6mwqbSppJydnquXmJeVl5WVoKmcmZanrbCoo56PraKmlZ6XnKGloZmioaGhmqGippueoZ6UmZumoJynlZubn6GZj5GUkZ2Ism5otXGrh26OpnK0c3K2e5qXpIuPnY2jf5GhpX6wdoOR0tF2XK57hX+kb5uqpmuHhX2tfZeZj3uxc5Kdj3mzZZZ0hJ5vnmaUUsiLWsJcn3liX61gdnSHYpeIXlnKnW+/gXVNS7VTVcZkVFFqY2ZYQU9rYGxoUFVHSTg9VlFaV1hJQz9KPDI/OzU9PDQ2Pjs3Pjw9QztHOTtANzs+RDsuQ1JKRz4/PElKRkNFRD5ISTkxNzQ2QD4vLjI0MjUyLSkuMjYsNzQyJh82MDs1Oj1QcWg5J1dpXEJPVF9lUDVHPWFNNjIwoZ2Spa+tpKq8raa1pae2u7yyur+3tbO5ubKktLShsbGin6ywpJemua2ksbCctLiqoKadoamksqisqaSanJqonpWUl5iSkqKnn5aSpaqwpqKWk62fpJGUoJukpp+Vm6amoZqin62aoJ6dkJWboZ6cppWdlpmin5WYlZGbhax7d6h2o46IhqlvrYqCp4OYmKGJkpqKon+TmYmuhX+Cs1xys1KufYOCpH9x1314hX6PnYaZmnevhoqRnIh4s2GaZZqBgpRsklqwWEuadZh5ZmCtXnZ3h2iYiGtdr3eVno94bDV5yK6yX0JTb15nYEVQbV9wbVZVTS5lY2hSWFE7QURATDo1PzkxPTwxNj85OEA9OkM6Rzs8Pzo+PkU5LUVVSkVAQzpNS0pCSEc+R0s5Nzw0Njo+LzA0MzMzLjIuLjE4Ki4zMiUhMDM3Njc9UGtlPiZWZ1xAPlZfY042R0NgSTo5OZ+dlaC5sJe0wa2os6ipsrq3s7i/ubextLu0pLezn7Ssn5+orJ+Up7WrqLGxq620pJupoKCoobanpqmimZ2VpKGTkpuYkZSipZqSj6atr6aglZmpn6GNkaKZqKWglJmlqJ2cpJ6snaGdoI2UnpqdoZiZnJaXoaCTmJCmnoapfX2leKGPjoKqcK2LgaeGlp+hiZeXiKOCkYiUqnyAi515b7FaqIKCiKB5dNh/doh0qIGOm42So3yWkJ+Ee7JenGSgfoOVbJJcq1tak3+Rf2hnqmRye4FrmIdzXaxaiaCOa29lT0pDoVxbTHRdYmdNW2FecXNeSlY2SpuTWEhFPUdGQU0zNUE4Ljs+MDVBNzhAPDY9PEY/Ojw2Pz1CNy5IVkpFQUg2S0lOQElLQEVOOjpANC47PjEwMjE0NCsqMDUvNywmMjEoJCQ2NjcxPFBlZUEmVWZbPzJVX2JMN0ZJX0MyPzihnZqav6uXtMKurK2pprSwt7G1v7m5sbC1uqm6tJ+wpJ6lp6eek6qwqa+ptayqr6GYoaCmpaS6oqOroJebkaKglJOemZOXnp+PjYuosK+mnZabqKaei5Kkl6irp5SWqaeenqCjraShnqGNlaGYn6CSnZeclZ2hlZaPq5yPrm1ytHKpjHaKpnO0eHOzgJGko5KcjYmkh5B3uG+Me4uia2u2WqCFZZeXaaGip22TcrR0k5h/smqFkoita3WzYZ1mom+HkmqXXK1fTaF8h5FSc6NseX9+b5iHcVyvVjycd2VUb24uXKdPY1JrZWJtWmNcX296YlRaUT4+bW8zQ0JAP0w5ITdANi47QDM3QzU4Pz8zOzxDREJKRk1JRjYySlRLRUJJNklKUD9ITkNGUD08RTUwOzswMTAvNzUsKyw0MjYvIzAwLCwdMjg5LzlOYGVEJ1VkWT4vVV5hTDVGTV44MUM4pZqcnruhnLLArq6rq6e3qbivtcC1u6+uuLaqwbapqaCbpqSinZGqqae1o7Knr6qgl5ynoKSruJ2jrZuWmY+lo5WMnaCamJyfkZOUqrawp5mUnKyplYuTpZmlraKQlqqyo5+epquwmKGjj5milp+blpyXoZKcqZyUkKuZh9SSmrtzsMOAw4Z+1ZabuHiIkJiMmIqMp4h6o7Z1fXd2woKasmCDunnAfHW4YrWBjIepfZWBrKlxe391vIinoGmdYaaOr6F+jHSHqn2+bnO8dLKDdXiBi26aiHFujaR0vV53fVthebxrWlZbanpeamFlZ2Fsd25ZW1lDQUByQENHKzVHIic7PzEwPD83OkI5OT1DNDxATlpeYGBfX19aUFBSS0VGSjRITFJASk5FRk9CPEU4ND05MDIwLjg3LSouLzE4MCItMSwzHiw8OjA4TFhhRidUY1g8L1ReYEs1O0xbLTdBOaebnqK8oZexw7Ctqqussae4r7bEsbmxrbqvrsCxq6SinqOhnJuQqaOqsqS1pq2lnpaZqpmmrLmdo66YlKCQpZ+SjJyjnZedm5GVkq65sqyVl6Onp5OQlqScpKyekKCoq5+bn6ijs56jpY6nopSimpyYlaOYj7CgkpSpnoWQmbWAkJGMt5V4gpOatXdta25zb3mPhI6JdJ7Bu72ae4GyqHCAdJG5g3yGhoyGjXuKh42XfKS7ub2cdXq0o3R2l3V0sHWZnmaGaY21dHJwd7aMXoB6fYpog3lteWOLrHB1hX9aW6dqRWRZU2ZgY15jUWdmcGx1Qk1QTEQ6Wk0/SjM8MCA4PjsuMz1BOTk/PTs8QzZCVFlaWltbWlteYGJgXVNHR0g0RElUQktOR0VPRj9HPDc/NzA3MC85Oi4sLy0qOC8lJjIoNCQoPjcvN0xUX0cnU2JXOCpPXl09KzpWVic+OzynnqChv6WWtMK0rKuorKupuq6wxa60sq63p7S4ramioaWeoJ2Zk6ukraqmtainn5uWoKOdrKS+pqGql5SckKGakY+hqKGTnZiTl5SxtbetmJ2kpKKKkpKmm6Wqm5appaWcmqGopqajqaGRrZ6Wo56Xl5edno+wqJSbp6GOan5pnKZ4h3J9mo50emSHe72+wLpvkoJxlYdhc2paXpuKYWOIjpVrYICVZG2dd2KVa4CalZRlXmFjcZqKaXKMfYWVZ2p+cnR4fX5iW3d0gWhQXG6EfXyLa1hseoJzSkpvhnBNdU1FV15mYEtaV2djX09bbXVpclJPREVOO0hIPUw/Mi0yQT84LzU/Qzw5O0A7PUM+UlZWV1laW1xcXWBhYWFgXFVHNURGVUVKT0hGUElJSDs4PTUxOi4wOzouMC03Nj01JiIvKjIsJTs4LTdKUl9JJ1NgVjQpUF9MKDM9W08nPzI+qKCoocKjmrS5taOspa6np7Wxq8irsLKrtKO+sbKmoKKonKKbmZmspq+kpLWppZuXlaGbpq2ovqeoppWTm5WfmZKXpKmokJ2Rj5icr7K/rJunnqeiiJORqZqoo5qbrKCjmpqjp6yin6uimrGblaegl5Wdn52XsaSXoaiZnJGdnKKkmKaimpyampmPlYFnbn1xd5KXlJGFi7WqjYaYlY6KjJiXh5SVioSSlJGJjpKUmJSYl5qgopqclKGejYJ6pIZsanyQfIB1iYqBcYJ4eXZ2i4B8imtzgXSDdWV2fXdrcHttYGNdcGdMWFpmamBXWm95bW1mU09GUzlPWU1STygrOktCNjM1PUBBOTpDPjxFTlNTVFZXWFlaXF1gYmJhX15eW1RLQ1NHS05ER1BMT0k8OjszODksMjs4MjApNklSTzgiKSsvMiM0Oyo3Rk9bSiZSXlMxMFReOis9OFxLLDwtQLOhs6G/oaSxsregqqayp6WwtKrIq6ywpbWmwKe0oJ2kpJyjlZWgqqeso6O2q5+Zlpafl62qpcGeq6SVkpyXnZeSk6KfnqKnk5GZqKeyxK+aq52qn5CWlqidqpucoKyYoZucoqSvpqGlqJ+umJennZmaoJ6enK+gnKGmlZeSmJOgoZWjnpegjpaTioqNjpeukHyVm4KSgouqqIaBmZeKhI+fiHuEkIeGmpKIhoqVj5uXjZGYnqOWmpORno1/jmahs6+FioR2e5CKfHZ5em9mepGBgIlrdYF5iHNpc396dYOHgmt1ZHlmYGllY2Rma1lse29palxSTFBEX1RFQD8/LDRARjs0NTs+QTs8Pz4+SE5OT1BTVVZWWFpcX2FjYV9eXl1eXVhWSktMQklPTVJKOzw6Nzg2LzI5NjQuKCYkLTEuLykrKjclKzwoNkNNTUQvVF1RMDVNWzE3RTRcRzU8LEC0oLmvv6yrrrKxoKumsa2irLOwxLCqq6OzrryjtJufpqKhnJmXp6WppqSlsrSelZSdmZmwpa6+oKuikJGdmpmUkZSinJeonISeqquis8izn6qkqpaWl5qnnaian6Srk56fnaCpr6mlo6uirpufoKGYpJ6cn52vo5ieqJOXlpyRpJiXqJ2al2WCknxlfo2akGR5jWxoa3uSpKpqZZqYfmeGimVlaWh7jqGPa2iNl5Gjd2tqi5mjnplzbG57hI2HelhlXoaCXmyLiYB2XGhzd3eSgIeCbniCeIBzbXmEdHeJiI6EfGqGWV5rdGRdc4lpa3xxa2NeUU1XSmRYQUo0PUY3P0ZENzE8PT9BRDs7REdISElMTlBSUlRXW15gYWFgXV1dXV5fXVpVT0RIT0tTTj0+PT02NTM1NTU0KiYmJSwqJS8qKyc2KiQ7Jy9BSltKLzdaTzYpRVkvRE8xWUM7Py49pZ+6vLmvrLOxqqWora2wpq2tsbyxqaekra+wn62XoKOdopmZpqucraOlqKmyrZ6Vo4+ir6a2uaWuo46OmqGZk5KaoJmZpZV7pa2iqLTEuKSip6+enZSeop6jnKOpqJKeoZ2gqrCqq6SqoKqbp5+ooKyWoZulsKSXm6qVoJ2akqWXnqqYnn69g4hytHKEnYataHi5xLhxk6KjeqaZmXOqgnzLwMC7cYyiiIKffZaYiZ3AvYKXnZ2NncLBfIJ8ko2aw8B9a6Wyb4yBb8p6f5t3kYOOgXZ6gYB5cXp/h3F4hY2TeW54lGNmX3lkYGWCY150Z2xkYldLVUlRWkhPRDJJRT9EQj4vPD8+QEE6OERDQkNFSElLTU5QU1ZZXl9fYF9eXl5eX19fXVxTTVBHVU5BPz89NjQ2ODI3NiomJSMpKiYuKyopMTAfOSojPklbTCojQlEvI0ZbM1BZL1VBQjsvOJajucO0sLDAqaiUo6+psK6tprO0r6mlpqaxq5+rmJqin5yaqqeinayjpaikpLSknaKSpq2ruLOnr6KRkZmdpZKQn6GYm5+dh6espKutwMCxoKmvqZeRnp2hmaKjqqOToKGdnq2uqayno6Onoaalna2pkqSaqK2pm5ypnKyglpallaGil5x/zpR4eqSBeZWWm1+uj16Op4GioHynlpt0q4OAr15jjap7p4eFoHSXk4izY4KrhqGNjbNqha90fZeIt2GDrVmizW6QdXvae3+ZcH6IknZ+ZXuIdnZrfIhvfYWRkX5tg5BgcmxwaGBfeWRccWhqY2ZfUVRSV11LT0M1QUhFRDg+NjtAP0E7PThAPj8/QkRERklKTE5QUk9TXF5fX15dXV9gYF9fXVpXT1VKPT8+PDU1NzgxNjQoJyQhJywmJi8oJiszHTYwJDc7U0wrLC1LMCc7XDtMLSFQQEY0LjGtwsC/tbSwuJedkaSqqK20q6ayrKyrpKumsKqgp5uZpZecoq+foJ6op6OmoZ+wrJqdlaatrLGqqKyglJKbn6SSj56lmJ2no56upKuwqL/Hs6ipsa6Wkp2boZefqaqflaCfnZ2usKerqZynqKSiq5Oss5eloqqqnaOmpaGwoJKZppmgmpSUkZegcYWMl3SEqIdxsXydcax+oZ6BpY+ed6qCfa1/nHOtfquHhp92mJJ7fJd+qoiijJGMnX6re4mUkJ+Ae61WnMR6j2+SwX2BlW11b4xtZXZlhm9hd25yb4mKko+DbZKQZnB1dXFhZ21lX29paW5nY1dTXGFZUlNDOElJQEQ8PjxARkRDRUE9PDw8PkBAQUJFRkdFQENJU1dZWlxdXl5cXl9hX15eXVtaUkM+OzkxNDc4NDUyJiMfHCAxJyAxJyAnNB41LSY3PVdKLTwnPjEpM1ZARiEcRzpDMS4rsNTGxrK0oJyjjqOjoqyvtq+osaaoqqetq6unoqOdmaKVoKWrn6KloKioop+dsKyXmpeopq6sqKapnpeUmqOhkZOgrZudpqOvrKOstaq5zbKtpq2slpWcnaKYnq6snZagmZ6fqrKpqqqbrKuko6ybr7GiqKuupZimqqmpsaKSlqOkmpSShaRqpHWJeql0erJwgqaKmYxxiKCah6RgYVKrhH+ug5t2rYGmhoafepmXhntmgKOJpJmGgqR9qX+ClYeuX32pVZ2ikoF6op+Ae8OvxYtyr7OzuXFiqa/CdGiMjJiOgW2alHBueXh5cG1mZWVxcGZ8aWJdV2BpWFhVTExRTENDQUI7Q0BAQkk8PTo5Ojw9Pj4/QT04NjtETFBSVFZYW15eXVxeYGFgX15dXF1bU0lCNjc5OTY2NCwmJCIgKCciKy0iJC4hMy0mQERXSCxHKzU2KjFQS0wjIEE5RDQsJ8PJ1tW/oZmrp6Gvop6wtLCvqa2ip6aqq6uppKagm6Senaanp6OcrJqirKGkn6+inJuTqqO1sK+gqZudlpSmopCaoqigoKWcsKakqLGstsiytaqrqZWRnZyimJ+ls52aoJSdn6esrKSumq2ro6OqorOuoqqzsaGaqaiur7aikpWip5ibkXyqbJ6Eh3WreXywb4Kki4mflpaflIHSuLS4yYCBsl9glKmDo4iHoHqYlpp4qsl0maSVqKqRk5qMgJyKmsbHeGahgqVzgZ+Ogn2vXXC0YrB1S6OGbadHgpNkjpCeknxxl5OAcXt1fnxuW2ZqcnBlgWpfYVhkbVxeWUlOTEtFREFCPkE8Qj9KOzc5Nzk5Ojs7OzMuNjxBRklMTU9RU1daW1tbXV5fXl9fXlxcXFxcWE1CNzU2ODUvKSglJiUkJiksNEVOUFBNRktKVkYqTDAvPS01T1RRHRw7PEYyLCSnpMDGuK2ps62spaKcsrmsqqGmmqilqquqp6CmpZiqo5+vq52moKyanqmlnae1n6KXk6iptbKsnKWcoJSPpayRmZuno6Cppq6hpKepsLTCsbOqraiTiZedpJqho66mmKGVmZympqybsJ2uqaeerKS3rKCxua+dm66nsrOzpJOXp6KZn46CnU54moF/n3qDo32DpISGpp6cnpOEuHt8ebmCfszGwrZ4m6GQi59+mpaXinaemIqlmKSpf7CFnYWfhKx9mpRipWykcI+FkIF9loJyrGCjc3GAmmC8fVJVdI6So5Z7fpOSjHZ7c4V/cVxtbnhyaoFvW2RfaG5iZF1LTFFUQUlIRkk6OUs+QjEwODg2Njg3Ny0qNT09P0JER0lMTlBUVlhZWltcX19eXV9fXFpaWllVU09IQDg4Mi4sKi4rKicmP1FUVldXV1lYWFdVT1VGPEUzOlBbVBwbNj9ILC0gi4eZqaukq7mqr6Cboayzs6WfoJWlrq2uqqedpqaao6ehs66iqaeyoJmppJSitaKilZehqLS5o5uinaKTj6GxmJ6bp6Whoq+unaSooraww7Gtqa2pkYeQnKecoqScpZeemJmapqSpmq+hr6WmmK+lvK2htretnZ21sriws6aXna+go52Fj9G1w7d5h46FkZOQgaZ4lKF3jKCRhKWBinGqhoS0bnJqmaOclYqefJiZhoePc6+CpZuijqaLk52KlZCbbXCyXKVzk3qcbJl/e5l8balho3Fxf59ic7K4aHePlKaYfYyNlI55fXmPgm1peGl5cm6AdV1lZG5tZmdgSltYWDxIR0BVM0BGPjwqKDYzLjAxMykmNDo7PD0+QENFSUtOUFJUVldXWV1fX15eX19dW1paWFVSUlFGOjIyMzAvKysoQFFSVFVUU1RWV1dYWFdVVVZUUU9RW1UlITJBSCQpJZNzjYqtv7+8urSelqelrbWhopmVo6inrqusmaain6agoLWno6mnsaOUrKOOpK2jnZCamqiztKSdpJypkZSXrZ+fnaeknaectZqhqqS2qsKwqaupoYyEjpyhoKajlZqanJibmaelppisqK6jpZutpr6slL2wrJ+isLK5q7Smmqixo6eXeqiQfXywd4qApKWInG2yb6CHrXyhjoOolZiArImEroWflKqhoZeGn4CZlYB7kn6rgJ2al4ureJ2fkYqUkoF6r12jgX2mp2SdgHyXc2qvXaVrcIWZXWBbjKBtlZGmmYKVjpiOfHuEmH9rbX9jfnRugHpgZ2VxbmhnZ0NaYVs+S1QzVThCQkM3JCQzKycnMywgLzY2NzQzNTlAQ0ZJS01OUVNTU1ZaXV9hYGFhYV1dW1pYU1BPTkk4MDUyLiosQVRWVlZUVFVVVVVUVFVUU1RWV1dYVlVVUUhGSUojKCi9k5qDqcbCtsG0n5qsoK64paOOm6Sjn7Cvqp+kn52tmZ65oKOroK+pmq6hkKuopJaJmo+usaymnqaaq5aXjqyhoZ2loZqknK2YoKimtqi/r6WppJ+LgI2bmp+mnpKUmpqUmpqmpaWbqqyspKWfqqi+pJbDrKqioauyuaqupp+zrqipmHavfpCLnIWHfbquiphlsIxlla19oY+DppWagayKhLCFppmkoaGRhaBbbGqBs2B/rXt7goGxbWdvmZiMiLFbfbRcpINryKJkn4B7vFh2tVqyfVKugHqsWIChbpiQqJuLl5GYmHx6j51+ZHR+YoR4dIB8YWpncW1mZWVPVWRcQlVfPkooPjk9NCEiLCUfMi4gKjEvMDQ1Nzk6PEFDRkhKTE5QUVJUV1peYF9gYWJeX1xbWFVQTkpGQzU1My4vQFVaWFdYV1hYV1dYV1ZXV1dXWFdXWFlaWlxcWFdXR0I70p+zsre9urPBs6ObrKaltqigi5qgn5yzs6mfo6CetZigtKiqrJ6vrZ6sm5WvqKKOiJuOr6yop6GmmK2RmI6omqGepJ+Zo6OlmZ+jqrKou6+kqJ6cjn2Lm5ahoJmPkZqbkpqYqaCimqmuqKamo6Wpu56gxqakqKGrtLWsrqaeu6ysrJWAqZKjr46bgIekl5iQgYC4w7qDjpyThKeWnIKsioKviKabm6WqkX7VvcKqYqO/vX1+o4KD17q4tYWUk4Oevb6Ea6OBb6uEbJx/erKwx4Nqq7C9rHh3or68c4GWjqeckJuRmJ57gpKbemN9e2SOZ3mCe2BsZWtqYlBhWlNqXEBVYUJOKj06NC8eHyQeJTIgHSQoMDQ5NjY3ODo+QUNGR0pLTU5OUVRXXWFcX19hXmBbXFlUUU1IQz88QT81PVNZWFhZWVpZWlpZWFdXWFlaWllZWFlbW11dXFpWWFRXWryVtLSxv7myvbKina6mpbKmnYyYpb+quLKoob+mp7KcnrGcuqifra+mppSUsKyXjIObka6loqygo5uonpeKo5KmnqecmqGoopmeoaytqLitqKObl5J7h5mSppuTjpGYmI+Yk6mboZmqqaGqp6GjqrueqMSioK6jqrO0qq+on7qnrq6ac3WqpLeGZImgcGetj4qPbW93pJCZn4F1rpiUcI+LcZWoo5uXrqRybW1sZot4b26CmXGBempxaWeJlpaYcmlphIdncIZkXYhiam9ZXWd+d6ZfYXGOkW5lZX+Nk4+imJmZkZigfoiQlXZmh3hpjmt5f3lkbGNmbGJLZFhKbFo6UWVFUidLOisjHCAbIiwpGBsYLTIuNTo0NTc5PD9BQkRFSEtMTU9RU1ZdV1pcYGBhXV1bVFBMSEQ9OkFCN01YWlpZWVpZWFhZWFdXVldZXV5eXVxcXF1eXV5dW1tVV16pla2zqbm4srOqqaGunqOyqZiSvrLEyb62qp7ArKyjoaisoLqjpK6sraaNl66pkIyFlZatnqaqoJ2jop6QiqSSp5momZajqqCWnKamp6+6q6yam5KSe4SWjaWYjZGRmJSNl5WolZ+YqqSbsaaeoqu5n6/Ap6Sypaywsaqtq6a3oq23loqgqKW2nYmWo5mHqZqQlJ2SqbKZmqOroLGWoqCdoKKcoKWhlaunjZOSjIeTnJyVkJqTmJGOlYWBpJmXlo6Lk5OLj4aEfWeJfnSCdnSHi3GnbHqUkZOSgYGNkJCPnZWhlpqYo4OJlo1yaZB3cYt4d3x6amxkY29kVWBYQGlbSGNhT1orRj0rJyE3NDAuHxwhJTIoKjY5OTQ2OTs+P0FCREVKS0tNUFBRWFVWWV5gYWNdXlVRSkVEPjk9QEFTWFtcWVdYWFhYWFlYWFpbW1xeX19gXl5eX19gYGBfWVlgppapqqS0tq6uorCjrZ+gtbGQjqzHvcW7uauipp6bpp+xqKO2p52ptKeokZisoouHiY+bqJWspJ+Ypp2dkZSjl6iaqJmUpqGjkJqnmaG1u6irmJmPjXuBlIyhlIqVkZWQkJOXpZCfm6qgnLajnqert6euwa6jtqavr7CsqamyuKCuvJmRpaSmtqKSnqefjamfjZKfo6yvmqCjsKivl6OgnKOqnp6dnJarnZKZoZuUkJaqmY2ZmZaQlp6RiaCdlZSFkoyQjZSLgH1mi4V1hnV5iINznGqFkJSTkIl8i5aSkpeUopOemKOFiZmIe3KWc3qLf3J8f2pvZF5wamFbX1htY1BgZFBaOkdHRT4yPT04LysmKykmHSY0MTY2Njg6PT0/QUFDSUpHSktMTVNTU1VaYGBpYGVVUEpBQ0I6OUVNVlteXltaXFtbW1xdXV9fXV5fX2FhYmFhYWBiYmJkYlxbY5eVpKijr7KsrqOppq2gp7WqkJCdpbS8r62toqOaep2isaSlsamXnLimo5SZqpyOhoqJnKOQrp6ilaeeoJGWmJuui6mWj6iZqIyYqY+fubakpZiajIh5gpSMm5OKlZKUkI2Sl6KNnp+pnp+4o4CEr7Wir691pL2jsp93eaCqsbqUdayknomAqn9kXGJ2oI6knoSXfW6Ts5yjp62qo2Wdn5JzeZmWcICYqJdsf6KoimWcpZyRl5iWjJKckYadmpCVg5KHj4+SiYR3ao6GdoZwe4aBgGFph4qUkotadZSQaGiPj3N7ppqaZnuah4N4mGqEi4NveYBrcWVfdnBsa2hbZmViYnBTXD5OTk5TRz5AVEQ5MS8eHyY0OjMxNjY3ODw7PkBBQUZIQkdGSUtNVFRVWV1gaGZnV1FKPERHPDhVUltgYWJgXmBfYGFhX1xdX19gYWFiY2RhYmFhZWRjaGReXWablaajoK+wrKuppamuo6atpJKWq7awsqebq6asl3SMna+fqKunlJe5n6CPnKSdkX+JiZuejKuZopSmoJyNlpGehHWtjoimmqmRl6SIm7qzp6CZl4qJdXeTjZaTipSRkJSMkJOgj5uhp5mcspaAjJu1nbOMko+7p6B+p6J6oq62gI6Opp6Di4aQsaqvjIqWo5p5gIushpydoaepp4eVhZh3pZt6h5uBl6eCgnucsnqKhqCXmZSYloKRl5aEmplieYeQhI6PkYqDbXCOh3mAcICBhX+GdIaElZF4lmeSdKCadH2ZhKKeiJh/k4qEhJlrjo6FbHh7cXFnZHhvamxqWmVramV0XF9JVExRQEU1LlpUVTcpITA5PT43NDM1Njg7Oj0+PkBEST9KRUpLR1NYW1lbYWFpZllRSDlFSzw+YVZeYmRmZGBhYWBiYl9dYGFhYmJiY2ZnY2JhYGVkY2djYWFonJejn6atrquorKCosaamqaWZlK7IvrGil6eptZ6PhJ2snKeioI2Qvp6ajZ+aoJB8ho6Yl4eqm6CUnp+RjZOJhn+Qp4yGop2klJiehp65sKedm5OOhXB1kImVkIqUkI+bjJCSn5KXoaWWnquHn7SJtJqtisqHqq2It4WMr4KvrIKpjaWYjZ19qI9ye3ecj6eWaJWkebSMn56mqJKYwoF/q4iYoXKegJqlfZeFlbGAoX2hk6CQmJeBjpObipiRi3yFkoaNlZKJg21ykIV/eXGGgYR8hHWEgZaAj8Vmf6mHj6NrnoOjnISagI2OhoqZcY6ThWh3dHx3aGh1cWhoa11jcG1nbVhnR11STTJENDZOYWM3JjM8RUdEOjY0NjU4Ozg+PT0/Qk0/TklKTENQWl1cV2Feam1cUUU9TE1ASmRYXWNmaGdiYmJiY2NgX2JhYmNjY2VpaWNiYmJlY2FmY2JiaZSXop+wp6mppqugpLiwqaqmmpSgo6SrpJelqrejr4Chp5ylnp2JlL2Zk42hkp6PeYSWlpCGqpiZmpmghI+Md5qbjp6Ph56knJaamIaiuKykmpyMjH5ibY+Lk5CNkI2NmIyRkqCPlKGhmaGnfqGnh62doJatj56cnZGFgKCNqq2Fo42pmYyaf6N1gJmUa4KsdU2reIeNnJGbqKeAqat9g6F7eqdpnn+Sa2eXhpe2iZ5+bmBkWYOXf4x7ZGiLcpl9eZVsXXyWbV9TcINcX2t5g2BZZYJ9g4CXcKeqa4OjbnKlcJ+FoGpmoGxbbot8Zlpgg39iV1Bvd2ZtdHJram9danBtbGlYaU9eWEY5QTRHRF5rNCxJQ1JNTj04NDg1OTs2QDs7PkJPPlFSTE1CSlxdX1deXmN2YE1EOk1PTVRiXFxmZmlpYmJkYmRkYmFiYGJkY2FjaWtkYmRkZ2RiZ2VhY2iXlp2guKCqpKaskaG1vKuuopmYoKKlrK6hna61o6iSoaCfppuajpm0mZCLn4yVi3WBlJKMiqaVk5ednX6ShYWro4eaj4qYqZmam5GHpbCmoZWaiImAaW6IiIuPjoqLjZKMkJKjjJSfoJyhpH+TgY+joZSgd5yWj6eDoad/hqirg6V4inyEmn6icHOUiJZ7nox5bYebjJmQm6iaj4ede4Kic3amZp5+d6RfmHp9knOibpi3tLp0k4eCf7WoZIHGuHtwlbeLcYCapGJzrKtgfWmds35ufIaCjYKLmHF/o2xyo3SfhYGkYJ2YspVxfJefs3RzW56yg2pib3R2cWlvWGpscnJmXWleY0xEPUQ2UUFZcTM9U0dfSlI9PDM5NTo6NkQ7O0BKUD9VTU5RQEVfXltaWGBgfGRIQzhMV1VWY2FaZWZra2JiZWFkY2BhYmBkZF9gY2tuY2NkZGhkYmdmY2holJaVo7iZq5yToI2kt7WuraCaop2jo6aunJuyrq2TmKGZoaSZmpSfq5uLiJJ4i4VxgJaNio+hj5GTnZh9kImNqKCHmI6KkaOUnJuMi6iopZ6Pl4eEfmt7h359j42Di5CRiZCUoIOXnqCdoJ6LiXecmKKMn3Khi4eoiJulj5WmqX2tjH56oJl6o5N4gXSWiI2cfZWfhpuOmZumhqJkoXyIlpCbjWyeaJqNbpqZe4CLp31yaHSrg56DdKpolZpdm4V2hJ1oqmqAuGZcqHCBnGCVjF6ndnWHiX6eaJp1hpOSl46An2+akG2nmVyofni7an2pW46EXbNnXG5yenhraVxwanh5Y2BmWGJCUUZPN1ZDUm81S1paX09aREAxNTE7OzZIPzpDSFU+WVJZXT5EYl5WYFFhY31qRUI5TltdWWVmWGZnbm1iYmVfYWFfX2BgZWNeYmRvcV9kZWVrZWNpaGdraZWciaq1m6eIY5Sbq7qysayeppycqZ+erpuesamsnZekmqGfmJaWoaSZhomNaoiAcnuXiIuWloSQk5iPeoqElaOcipSPhouekp2diY6oo6CajJGKgIBpgIZ4f5eMe4mOjoiPlpt/lKKfoKGTmHJon4qfj4xwkoyBqYeYnqGmnqZ7sK2joriXd6OzoqSAiJR5nXuqmn+ijp2bl4iXcaF8hY2vtX1rmpGheH6YtKOjq6iEmXybfZ2af3SqWl1ve5aLeJ5iTH56eoVjeZdCTJ5ZompyfI5tgIiEmXWbeIaJsbN/gJuTp3eCnW1yfZRvmXJqo12VdkhlZGFzcX5+bmZgbGl2e2RlYlJfV11VV0BaRVFoRFNXXGJYXklEPUI4P0I6SUY4TEVYQVdSW1ZERmJcWmBLYG1+ckVDPFVfYlpmalZnaG1vYmZnXmFhXF1eYWhiX2VjdmxeZWdma2RmbGloa2mTnIGwrZmEU16gprO5s7OpmqKMnKucnKmUoayloqiPn56dmpmWmKGdloiHiXeGgW95lYWQm4t8kJGWiHJ/iJKgm3ORkIGImZWhm4WNqJyalYuLinyDbISFcYGhjHiGjYiHk5mWfJOjoJ6jiK2GfbWEjp6ce6WWeqmBlZyPiZ+bfKdod21+mXShc3F8noaZcJODrn2kg6aemYCjb16oZ3WiY2+lYZzTkHx7mXhyc2OihpB+o3Okj3ZrkLOMYIKYiXOqsqi8f3eDbX6+pqm0XpxufXGXbn9yonJdpGdzpmFopm2b1Jp9hZtveHqXa5t7d5dzbqmkZ2FleXGAhGtnZmRudXdnYGNTXGZRUWJJV0pUYVdTW2VqXGVRRkNLTUpLQktFOE9AUU5YU1lPU1FhZmVqUmN3eXdJRkVjXWVaaGpUaWhqb2NqZ2BjYFxdXV9oYmFoZXxkXmRnZGtkam1naGxol5t/sKtUXEt+qa+xtLCzo5uZhZmpoKGkjqWooJipipqYmJOZk5KgmI6HhntwfYRofY+DlJqBd4+MjohvfoWPkpJsl5N8iZGSpJaDjqqak5KLhYl6g3aHgG6Bn4Z3gJOHiJmil3uUo6San4mzoaK2i3qsp6SupXCogJqQhYCbkXukgKKZhphynoSjrq+Kl4x/jKSNlYOtoZR2tLW1yaFzlIqBnmCdl6lteZWGoJt1oYd3oH6Sl4uBb0xmo5Jwm4dzpHt6dGGDgWt+oGtxZF+ccX10l2l6abO1tMamc5h+ep1rnJurdYSbbXV4mGmae3WYclBFfbReanZreYhmamhidHVwblZeVFlpUFNpSlZMWVRWXWhrblZoV05LQUpNS0hKT0FRS1BlY2ptZXVzc395fG51iXt7VFBObF5oW2tpUmpoaWxnbGZjZWBcXVxeaWJkaWt7X11kaGNqZm9sZWlsZaGciK+mhGY/lKGzq6+vtqKikICYqqKjpYymp52dpoKbl5aOl5CPnJOOiIN5anmHZYOMf5egeXWNh4uAZ4OFkYOMhZ2NeoyLlaaTg5epmIyRi4GJeoB9i3lwkKGGeYGWiImWoJV/lKWnnJaWhGZueJxsomR8caV3m5hwZ6aAlot7pHqfloOXcp52gYqUlo+5bpCKomJ9maGViG1yaaprdaBtbqZfmmmLkGiWh5qVdaKAfZpgjIaNdW+IYmigZZ5+aZt1b2NmiIJtcqJaX1tioW1diYxue35zcmSlbXeiZGenaJlzjJlvom9TiZBvoF9mqFSLXlSYbm1za3KCbXBpa3lza29SWVdXZ1pUbUpZT11JWGlpc2pZa1ZRUkVWXExYU2FVaWtfd3R7fXB9fHKDe39zdo2AhHZeUXJiZ2JwZ1BqaGhrbG5oZGdfXV5dYGtjaml2dV1cY2ljampzbGZrbWOcpJimemV0bYunrqSpsLGmn4uAmKudn6aNo6GboqKAlpmTjpqPi5iQjop7hnGAiGiLi3yYm3N0iHyPemOBhpSJiZWZgnyIh5aokYGirJGGkIqCin6AgI5zaY+lhH2GlI6JmKCOiJOqpp2JpniVm36liJaMspiekIKvl5+ld5SHeal0pY+Emm6kooyShIyDu259pa+DhoaGk5Wcn3ylenKolaCWZp5+b6tjloqVkniobKmigYl2iIN3qpGmh2qRsGt2s4ypa4qGbW2fnpKVYH6ri6p2fn+MpZ52n32EpJWdoGqbiHesZ5+tjLZ0d76NpJNZg6aNq2F1cnRxfHRxY2p+bmhsU1dbVmFiXWtNXVJdSl5tbnZgW3FZXGBbZnRlbm9xYnF0YHd6fnlyeYNzhH+Be3uMgYKAdmJ4ZGNtc2RSa2dob2xyamZpYWBeXGJrYm1sem9cXGJpYmxqd21nbG5ilaWqnYGAnqSWqaqdqKeupJmJg5irmp+lipulnamdhYyaj4eckYWSjYyNdIZ6iIRwjYR+mJN0dIVykoNsf4uRh4aTj317goWYpo5/paaOgY6JhZV2goeSb2yLqYCDi5SOiZyfiYyUqqOgj4B1lJeIfoF5lK6jf4GbcY+FeI+Kg357cqeMcX19epeWm4SOeHt+foeUlZOKdpCYn6CDe32Ja4yFW3l5cnpwaG5+kolxf3WBj5STcYaEgmWMf16Bf4t3dXOUdW95bm6HbYSFXnZoeI5lgICFjambfXR8lmqJiHCBdn2Gdm1tZ4xzeXuYeIVca1h5j2lueHJyb3h4cF1shm5pZlZbYFdcZmtkVmJVX1FfcHh4bGt2Zmpra3Z9cXJ0c2FvdWJ0e4F4dXqDdYCBf4F5i4WDfXttf2xkeG5eV25naHVreGppamVcYFpjamZscXVuWltibGRsbHluaGxvYY2UuKimi6GimqakmaWcq6OhhISYrJKeoYmbp5qpmIOBm4t/lpOHjoqJjXKDfI99fo+Fe5eOc3KDcJWFe32Si4aGkIV4fYCGmaSOfKehi4aQkIWWg4aOmHdyhamFjpGdkIienoiMm6ifoKqDiY6Vmn5+iZatqI+Spo93b5yQgnmRb36ohXB9lXFrcH2Bn4x/k46MaG1dg4uMnJuejnOVi4hxdGuCdnSBWXJuhpGBfX6Mal1qZHuFhImAYGl4ept7gouCdYGFgmd3ioZrYXBxgXZecoqBiI+mlYVljI+DbneLhHGGj3pwZmdle4N6lltcamdudlt7eXh1bnNzgmZcbYpra2FZWl9aWWxxXF9hWl9dZnR+enRwdGNra2t8fXN7eHRkbXVobXx+dnp8e3p6gIB+b4aKhHt9c355c39pVFxxaWx1b3Vna2hkXWFYa2hsa3FybVdbZW5sZ3N5b2hqbWCLi6qwoZCjoZqenpiemaijo36Dma2NoJWInKKRpZV/e5iFfZKZiYiGh4pzfYGMdoWLgYSWinFvgHKYhoR+koOEhoqBeoCDi5ugkIKnoYd4jpiJlYuLnJeEg3qsgpGXmZSKnp2HiKGrn6Kio4uIk5uco5mWqqGnpqCSm4eVjXt3jY6Ep35/kpGSk5yyppuVnpCNspOXhKWMjJWbn4mQm4KIkYprfI53eGWChpCLfImdhIeLkIiIgISEkHd8eXSZoYiGiZ6KhJR+fYqAgHVvc4SCfneGhoqPppCDhY2Hg42QjH2IjIqRg3dsgoR9eplqcmhhdIpwfXp3d3B3dIFdXm+GaG5eXlpdXVRoclZjXFxibGh1fHxzb3Bka2tpgHxueX9xanBwbGeBe3KCgHh/fX+Ee22CjIZ8enh8fXqDeU5kd2pybXB6ZWtlY2JgW3RmcGZycW1VXWx0bWl5enFnaWtkjIeduZ6WoqGYlZiZlZmkoZ58gJqrjp6Nhp+ci56WfXmUg3uOmYmGhISGbniAgHKBiH6JlIRta356l4eEg5B/gIaEhn2HhI6bnZKHq5+EcouQhpORi52RfY17qoSNkpiWj5yWh4abpp+imp2GgpKamZiQmqagpZ2dkJZ/j4l1fIeOhKV7fI6QkYaYqqKek52PjaqNkYCdjImTmp6Cjpd+ho6Db3iGcnVhf4OPhnWLmIGDj4KGhX6FhJRueXV0kqKKi4WahISMc3+IfHxycnuHg3p4io6DkqaPhYOOgYOKiYp3homKjH1vbH6BfG5obG1oX3p/aH17dnV2dXt3XF9wfW50X2NbXV5RZ25UZVteYmtpdnp+cWxtZGtqZ4GAbHOBbGx1b3lwhXluh4B2goB+hXZxgo2Ifnt7fH97gopgaXtqdWhpgmRqY2BpXGR1aG9idG1sVWNxeWVwentzZWptbIuJnreaoaOfkpGWmIuan5+ee3iep5Gbioakk4uYmXl6jYV8iZGDjIKCgm57f3hzgYV9i5F9a2h9gpiJgIeNfH6GhId9j4GQm5uRiaicgHCMi4yTh6GiioWMfaiRiJCSmJSWk3iMo5+gnZaZf4CQmpiSjJqjoaSal5GafYyEeICDjoagf36MjI98mKSiopOZkI+mjI6AmpGJk5ebfpOSfoeOgXR0gnB2YH6AjYZxipV8iIxxjH+ChYaOaHdxeIuYkY9+l32HinKBhnt8cXh6ioR6eZCLgpWlk4uFkHuGhoeFdoKEiYh7ZnJ8f3l7cWxqZl9+c2h8dXZ0fXOAal5gc3Zwd2RjWV9eUmtpVGRZX2FoanZ5gXFma2RsaGWAgWttfmhvcWx+eId6a4yBc4GBfoF0doKNhn98en+BfX+PanKCbXNpYodobGJfcVZ0b21uYHhobVdqdHZjdXp7cmJqb3mJjZ6ykqWlnI6QmI+GnaCbnXx2paGOl3+MooqImpZ4e4aHfoOJf4iCgX9xf3t0doKFfoqReGdjfYaXioGJjHl9gI2DeZaBlZiWjZagm35wjIKRlIamm4eMiYOmlYWTi5eYk5J3kZ2goJeTlnl+jpiXjpaanaSdmJKUmniOhIJ3hJaNnX6BiY2Mcpejn6KTmY6PoYuKgpaYg5KWmX6YjHyIjYB2cX1uemSAfIqFcIaTf5CCbIeCgYCJhGV1b3uGkpeMfJN3ioh7f4V8e3F+d4iFeYSPiYqXopWBg4t2iISCgnd8goqGd2B5eH10f3hnbGVhf2lqd3N0dn1xfGJjYXNudXJtYVphXltsZVJjWGFhaWx2eYZxY2pjbWVofYNsaHVobHBpgH2CeW2QhnGAhIN/dHyDjIGAfnqCg358kG12iHN0bmWKbGpiY3VWhGlxbmB4Z2xianZwZnl8enFfcWyGhY+crpemqJ6NjZeHhp+Tl5l9eKqcipl6lpyLjJiQeXyBjH58g3yAgoF4dHl6dH2AhH+Ji4BkXn2LlYd+hIZ1fX6Kf32YhJeUl4ykoph/c4d7lJKKp4+MjoqToZKDkZCVmJGLgY+Yn5qSj5Bzf42SlImdnZ6mmJiNlZVyjI2Ja4WXj5l6h4iQiW+Xnpukk5WKjZ6LhoGSnH+SkpWHmYh8iomBeXF6a3VsfH6Lfm2FkoKUeHCCg31+in9kcml7gJaXhH6Nc4+Ig3iGfXZ3f3yFgHyCjISMlKSPeISCdImHfYB0doGJhG9he3V6cX1vYm9jZHtibm92c3h3c3RhdWBvbHVtb1xcX15ea15QXVhjYmltdHuIa19qZmpjaHeIbmZsaGpsaIF9e3dukIhzgYSEfXSBhol7g316gYR9fY5yeop4eG5sh2poX2lyYodocW9ldmdubGF5aWt9e3hwYXdti4CZmaqgo6idioqRhouei5WYfneumY2XfZ6TkJaUiHd+e4p9e4B2eH+AcHR0e2+FfYGAin98YVt+j5KGf4ODc3qAh3qPkoiSkZyTpZyVgn2CfY6LkqSJjoqNmJuNhpGYk5aPioiMkp2Tj4uMboOPj5GInpmioZeWiZaQbYeYg2aFmI6TeoiEkIpwlZqUo5KSiYuZjIJ/kJ59ko+SjJmOe4qEh3NydWtwbnV7i3RuhpCOknF1gHuAgId7ZHBseH2Zk32EiHSQioBzh3luf32AhXuFi4iEjJWojHqHfH6LhXd+cXCBhoRkaXl0dXB8Yl9wYWt0XnBqe3l5bHNwZXhdbmxzbXJZWl9fYmtaUFdYZWNncXF+h2ZdaWhnYmdxjW5kaWdkaWiBend1b46FdIGCg3t1goiFeIV8eIOFeoCJd3+Le3pyeINqa19waHSAanJvbXFnb2xlfGNugHp3cWx3d4p+opehqKCmm4eMioKQnYeTnXWBqpWTjoegjJWTkIB0fHaFeHl/cnN7hWtycHptinaAgYducVtYfpGNiH9/f3d1gYB/oIaRi5KdmKGVmHiKgIGNiZyeio+GkpiWhYmVmY+Wi4uNjY2dio2Pg22Ji5CQip2WoZyYlYWYh2mDooJmhZ2KkH6Lg4uBd5OYkp+RkImJlY1/fo+YfJGNj42akXyKgIJudXBsbW9we4Vpc4OOmIpxd4B0gYeCeGZybnWBmY57iIR6k5F5dodzb4h7hYt6ioWCiI6bo4d7g3WCi393eW5sgYSCXnN0cnBweVpecGBwal5vanx7cW1tamx2YHBvanFtWlhhYWJuWFFUWmZnY3ZvhIJiXWttZGJma5JuYGZmX2drgXVyc3CLgHV/g4B4dYCLgHmFf3eHhneDhXyHjH97dop/anFjfGOGfG5xbHRqaG9sdnhfcX95fHR1dICCfqSVmq2eppaFjYR/l5SDkKB1i6CUk4aLmoyVjot6cnh0gnByhXNxdYhrb211bYh2g36AbW5VUYGrlYeCd393c4N6gqCCkoKTk5ick5p4knuDjZOkmpOOiZWZkoWHl5mMlIuJj4+InoSPinxyi4WJjoicmp+blpR/k31nhJuGZ4Wgh5GDkYKJcYORmJCbjo+MjI+NeHuSkHqOi4ySlox8iHyAa3ZqbmtsbHt+YXp+jpaCd3qAd4KMfHlnc2xzh5WKfoiGe5OPcXmDb3aMeomLeoh9gYuQnp2EfHt3got9dnBqbIKDemF4cG5scnRWXm9icmBfbG55cWhwZmdzdGhwa2F3ZV1WZmBgclNRTlxmZV55cIh8X1xocmJiZWaSal9oZFtncH5wa3F0in12fIWAdHV+jHl7hoF4iINzhoV+jY2EfHmVeGZyaoNgiH1vb2t6YGpudH91X3R9eYZ4dHOFfHigj5mwnKWOgop/g5qHgIyef4ualI+FiJiOjo+Ed3R2c4Bwb4VzcHGDb2ppdm6Dbn19bXVzUk2C38iS1pN8cHWDdoSgg5N3lZKZnJGZe5RzhZCfoZOTkoqSm5SGfpaWiY2NiJGMiJx+joB3eox+iIyKnJydm5WTeYx1ZoiRhmyIooSRiJeChWOMkZmPlYqXi42Ki3F6lIh7joiKk5GJeYV8fmx7ZXJva2t5eVyAeZCOgHt9fn6FjXp6aHJqc4qPiYKFhHyUimt9fm5/i36LhnyEeYGOlJqainx2eIOQeHJsZ3GAhW5rdW9oanRtUl5vZHBZX2txd2dra2JmeHJvcGNfd2BgVmtfXnZQTkthZ2NdenCJdFxcZXZgYWVlj2NhZmJYaXNzbWpxdox9dHmGgnV2fotzgIZ/eol+comHgZGLiHx+mHZlc259ZYh+b3BrgFpsbnl5c2F2e3uNdnJ3ind5n4ubr5ugkIKFd4iVfn2KnYeGoJGPhYyYhJOOh4F0d3B5cW6Eb21ufnJkZXhwfW16fWpoa2OkmsHcru+hc2x2hHaFo4aSb5eRlqGWnIGScoWLo5eJjpaLkJ2Wg4GVkIWJj4CRiomWfod7dX+JeIaEjZybmJmOj3WJdW2FiIp9iqKDkImchIVei5OYjI+JjoqKhIlte5aBfYiFiZGPhnaFfX1rfWR4dWlueHNYiHqSh4V5foB/hIt+eGVyaX+JjomCgn+LloVrgXVth5CBj4R/gnl/j5WTmJB1c3eIjXVzcGd2eoRjdW5wYml2Z1FgcWdsVV9udHlhcmRfaH1wcm5aY3JhYlZuWVx4Tk1MZGdiXndziW1cXGR5XmBkZYVgY2NeWWpya25rcneMfnR3hIF4d3uJcYOEfX6Ie3SLiYeWhox/fpdzaHVxeW2Lem50cIBXcXp2eXFleHmHjGl2gIlyf5yHmaeco5KFfXCMlHh5i52EhaGNjnyWjYCaiIR7c3dwc2pvgWtpbXx1XmF4d3txdXtnYGR869q1ycPciHNsdIF3i5uJjmqZkJCelpSBiXGFiaCOhYuWi4yYlHyOk4iDiY97kIuFj4F/dniDhHKHgpObl5SXhox1hn5vhIGJhpihgpOLnoOJYYOUj4eKhomNh4GHan2UgH2DhImOjYJxhn5/cXdodnJpc3ZrWox8koOFfH+DgIOJgnVhc2uIgY+KgX5+kZB9bYFreIWOhZGDfIF8f5CSkJaIbnF5jIZ1bHBrc3mCYHVqbl1rdl9RZHFpZlNgcHZ0YHBgXWiCcXNpV2doYmlYbVZbdUxLTGZnX2Jyc4VpW1xleV5eZGd7YWRfXVlrbmZvaXN4in5zc4F+enZ6h3OFg3yAh3Z3ioaOmYGMgnuTdWx3dXl4k3RueHt8WHqGcYBvZ3l3koJkdoaFcYqWhZmhmaKKh3Nvk4tyd46cfouaiYl8n3+Emn+BeHJzbm9kcn5oZmx3eFtfeXt7cXGAaWBmYX/Vto6QpnhucXd8cZORjYdrmo+JnJOMhntph4uZhoGSkYaHmI58jY2BgYqNe4+NfYiEenR6g3txh4GWmo6TlIGIdIKFdYJ/ipKcnYWUjp9+iGF/k4iFiYSJjX+Ag2d9kYB+f4KMjpB+bYJ8gnRrbXd1dHZ1amKNgY9/hH18hH+EiH5vX3JwhHuOjIF8fpCIeXCDZnmCioaLgnuEfX+Tjo+ShG5veYx+dW1va2x7fmRpbGpZbnZaUmlyaWJRYnJ3bGJlXlpqg21zYltnX2RsX25VW3BOSE9nZVxnbnGAbFtbY3NgXGNsd2RlXV1aa2xibWp0d4Z/cXB/e310eIZ4hYJ9gId1eYmBkpZ8iYZ2iYFwd3l7hJNvbXyBd16Df3SBbWl6dJRzZ3OHfHKSkYOanpqfhoh2dpV+bXaUl36IkYSKjpp9jJp2fXZxb2xqYXV8ZmJpdXpaX3d8em1xf2VjZ2dXnY9ecXOWvMSEdnGUiZB+c5iMh5yUjYh0a4iPlYB7lIyBhJuMfIuGfXyJjH+UiHWJhXV2fYFxdYeCnpWGlY+CgnF+h3SDe4mXnJaGk42cgIhlfZKDgIaDiYlygn5nfYt7eX9/h4uPfWmAfYN2Zm95eHN2cmtqjYWKgYl+eIKAhIN/al5xd3p9jImFe4CPf35ygGh4goaKhIN4g3uAl4yPjH1ubHqJfXd0b2lofXdlXnJjWHBzU1Ruc2liTmd0eGZgXl1YboBvc1llYl1qbWBwT1lsUkRUaGFaa25te29aW15sY1pjcHZkZ1xdYGtqY2xpc3aBg3Fufnt/dHWDeoSCfIGFdn6JgZaReIOKdIGIc3l5f46Qb298gXFpgXl6fm1tfHaWa2p4hHRrlI2Fn5efmYWIbn2Mdmp4mI9/goqClZiKeo+Wb3pzcWxqZGB0emhfZXJ7WmFyfHlmcHphZGSOsbJ3SmJapNnQl3J7kYuReH+WjIWako2Gb2yGkpF6eZOHgYSZinyHf3h4iYqEloBviodxdH17anmGhKaRhJONg35tfYJ2gniFmpiTi5KPlIWHb3qShH6Dg4mDb4F4aICFeHJ/f4OKh3xlfX6DdWNwc4BoeHBudJiNhYKJenZ4gIR5gWpbcHxygIeEiX2FiHqIcoBtcIOGjYODcoN4gJiMjYR3bW5+hH93emVoan5yYVp4WllybU5YcnNmYEptdnRhXltbWXV9cm9XZ11manBfb05XaVI/WWdfW3BqZ3lxXFpZa2VZY3F5X2hdXmVsaGZsaXF3f4dvbX99gHVwgXuAgX+Cf3aBhYmXinGCjXF7hn16eoSUjHVqen9rb350f31vcnx7lHBvgH94ZpKKgqGYnJKChWeHhHBoepeJfn+FgpmKgXyNjWl4cmtsZl9hb3ltX2JveVxkbIN5YHB2X2Vl1eu+izI6PouOgHJ5hYiOjXaEmI1/k46Nf25shY2MdX2Pf4WClYl8g3hudoeFg5d3boiEbHV7dGZ5g4OojIOPjIN9bX90dYN5hZqPi4+RkoyLhn57kod5gISNg2yAc2l/fnhtfHuBioN4YnmEgXFkcWl+bXRxdIGbi4B/hH1zdX6Ac4BvW2t9dHiJgop7hn98iHh6cWyIgo6CiXGBeH+Viop+dG1qdoCAdXVcaWl4cVlXfVNacWVMW3NyZVtKcHdvXVtaWV10fnRoWWJbZ2VuYmlNV2ZRPV5mXV12Zl90cFtZVW9kWmVxeVpoXmBnbWdpbGlweH2ObGqChH95boB7fYB/gnp1goGMk4VwgItud36Be3uIk4l/aHt+a3R8coZ7c3d9f4x6eIR+fGuMjIObnZaMgYBsjX5raX+PjXt+f4OUgn99iohrdXFnaGNbYmdzb19hbHRhaHCJeWBzdF5jZJugkG5cNVmvtXVqgIl9koZ2hpiHdY+MindwbIWDh3R5iXiJfZOIen9zZ3aIfn2Xb3CGfWh3eW5leoiEpYeBh42Kfm5+dn6AfIuXhoGTkJeIi4SJfI+Jcnx9hXxpfm1rgHt6anp2goeAcmB3gX5xZHJndYJtdXuFlZGBfIF+b3d5fHR+bVdtfnZzioGGd4d1gYl6d3NuiYCOf4Nyfnx9koiIem5taW2CgXVuXWhmdHJSW3tOXHFcT1xyb2RWS3N4aldZWVphcYB0YF1dYGZkaGhmTlpoTkFhZFtgdmFcdW1YWFN0YVpkbnJXal5iaGtnbWxpcHd8k2xphIp9fXB+fnuBf4J6d4CAiYuEcnuHb3F3hH97io2Pg2p+e254eXeKd314gIKHf4N/fnpthYyImKONhIN7dox5a22EiZJ5fXuCkYCAfYqDcHFwY2ZeWWdfcHBgYGhwZmpvinRgc29bYWRpdnt/vpymo8i4coWDc5R9eIeUhHSRjYhyc3CEe4NzdYZ0iHeUiXl5cWN3hnmAk2lyhHVmd3ZjanyDiJ6CgH+Ojn1yfnODeX+QjoJ3lY2Uj4eCiHqJiW15eX51aHppbH95c2l6doCDfWhgd4d+ampzaHuAaXaBjJCUfnp9fXF7dnt0fWFVdXxyc4mDgnyCcIaKd3hwcIOCi318eH18dY2FgnZocWhsiIJycF1oY3RvS2V2TF5vVVRac21iUU90eGFSV1hcYXCCc1tgXGhlZGNqZFBbcUlEZGFcZHFeXHdoVVdWd15cZW5oVmxeYWpnZW9vaHB3e5NuaYiLeX5ze355goGCfHZ9g4iGg3B2g3Ntd4ODfomLlH9wgHx4eXqBi3SDeH+BgYKEeYB2b36Ji5ueiH2GeneHfGh0ho2Ren9/fImGhHaPgGdvbV9kXFhlWW1zYWBhcWxsaIltX3NpWV5kbYB3qdqqx4aHsnKKeHCNdXuHkIF6lIqAdXR1fneAcHF+bYV0lIZ4dWxgeoF5iI5mcYNvZ3VuW219gZCTgIF5kpJ9eHtthnV/j4qDc5WKkI6HhYV7f4VtdXZ/bmh3Zm18dm1qd3Z/f3xhYniGemh1dWN+e2d0ho6MlXt0gHVxgHp8bH9ZVnJ9b3SDhn9/eGuIhnN4a3V/g4J8eXx3e3KKgHxzZ3RlbYuEbXRba2B2Zkhub0xbY1hXVnhtYlBTdHZYUFVYXmBxhG9cYGJsZGNebmJUXXJHQ2ZfXWZoXlp7YlJWXHVbW2drYVZrX2FuZmZscWhwdniPdGuOjXV/dnh9d4GDgXt0fYOIiINvcYB1cXV+hoKJjYp7d394hHx9hYd4h3x9gX6EgHt+c3Z5jI6fjIl6iXd1g3lefoaajXmHg3SGhoR3iXtibmxbYltbYVZqdGNgW2hvcGeHcWBxZlddY2t/fMrOh7mia21ui21yhXJ9hYt/e5KFenl0eXV1e2ptdWOEdpKCd29nX3yBeYuJZXGBampxY1hte4aciYOCc5eUd357bYdwgImKhnCWjpCIhYuDenl+cXFvfWdocmNueHJqbHF3fXx6XWV5gHdpdXlmgnZndIeMjZR8codqbn6AeW18XVhwfW1zf4p8gW5uiX9wdmd3foB+f3V7cXpzhnt5cWVyYW6MgmxzWGtfeF1Jb2xNV1ZfVFV8a2FPVHVyUVFUVl5idIVoXGBqaWViWW5hWGNwR0FoXWBmXl1We15PVmVwWltqaF1XZ2BfcmZqaHJocXN2h3hulYp0f3t3fnmDh4B1c3+GhY6CcHB7eHd1eYeFh4yGenx/dYt+fYaEhId/fn59h398eHV5d5GTn36MfYtudYB5ZIOIl4Z0kopvhYWCeoN0Y25qWV9bXV1UZ3NlYFlkcnJngXJha2RXW2Bpf3i+rnuft25ic4dodHxyeoOHe36NgHh4c3dve3Zlam5hh3WOgXNqYl9+eHmKg2ZwfWhqa1tXb3iKo4GFf3GZk3GAeHSBbH+Bj4ZylIeMh4OIhX15dHJvaHlham1hbXZrZ2tsend6d1tnfXx4ZXN+boR0ZXWGjYaVfnCLZmt6g3RsdGJbbntrdHyLeoFmdIZ9bXBodX53fH1xe2t5e4F5d3BlbGFtiX5tblZrYHhWS2tsT1JPaU5ZfGdiTlV1a01QVFVeZ3aDZl1hb2dmYVdpXVxsaUpFalpiZFdZVXlaTldualldbGVcWWVjXnRmbGRyZ3NwdIF4cJmFdoB/eH98hYd9dXOCh4CVgm5zeXt7c3KFh4iIhHmBfXaPf32EiY6DgYN7fouDe3d8d3eanZd6ioOHaXZ+fGyEhZSAco+CcYaCfoJ/b2ZsZlddW1xbVGRwZV9YY3J1aXZvZGViV1xcaIBwb3KAc4llZXl/anR2c3ODhXiBhHp3dHVua3pwYmdrZ4Z0jYRuZl5ffG97iX1obXdmaWRWV3Jwjad8hHx2lpBzfHJ7eWx6eo+Edpd7h4aChoN9dXBybWd1XW1pX211ZGdmaXpve3JZZ4F2dWdwgHiCdWF3hYt8lIFui2pteoFxZXJlYGx5Z3J2iXp9YXWDdmlrcXV6cHl3cnxmfX5+eHZuY2VhbYZ8bWtWamJxVExqa1BMTnBIXntlYU1VdGRLTlNXYWp3fmVdZ3JoZV9WY1dicF1LS2tYY2FUU1RzVkxZdmVaX2tgXFpjZV93Z21icGlzb3F+dXSZgXiAgHiAfoWEen12goN+mIVucnR8enRxhYWPgoB6i3V0kIB9gZSOgIWEfH6Mhnp+gHZ7o6aKeYiGhWx1fHt1hIKMem+Fc3qFfYKDdW5qaWVWXVtbWlNjbmVbWGF0e2ppbWhgYldfWmmAaWtvgGdsYWh6eWt0dHRvhoJ7gH12dW56aWt6al9lbmiBd5CEZ2VYYndpfod6b2lvZ2ZdVVhvaI+ndoF6fJGOeHVvfm5ydHiOfneUdIWCf4WIdmpydmdob1xtZV5uc19nYmp4aHttW22Dc3Rqb4B+eXdgdoSEeI+Fc4hxcHl/cWNwaFtudmRwc4d7eGFygHBnaXhzcWt3dnR2Y4N7fnd1cGNjY2x7fGtrVWliZ1RLbWlQR1JsRWF4ZWFNVHJdS01VWWRrd3plX21waWRcVl9Vb25WSVNoWGZeV0xUa1RLXHpfW19rXV1bYmVgemhsYW9vdW5vd3V6l312gIF5gH+Hhnp5eoN9gZOEcXR0fnl2dIWIkH2AfZBsc5WBe4KfhX+HfYB+hoKAint2hKyfgHqIh4RscoJ5doGAgnRuh299gHSKgGpvbmRkWF9aWltVYmpnW1pfdYJpXm5sXGFWXFxrgWVydH1pal1sd3ZndHdybod8fn56dnNsemhqeGZdZHJneneSgWNjVGRvZ4KEd3ZmaGphV1ZZaGSQp25+eICLjnpwcHxmeG55inp2jnGDfX5/hm5kdnNkaGhdbGJecG9bZ15tdWV6aV10gG9ya3F7fnV1YXSFinuHh4B/d3J1fnRhcGxZcHJicXGEe3VkcoBsYGx6b2poend0cWWEdHl5dXFkYWRscn1qbFRpXl5VTHRjUUdXYkdjdmVgS1RwWEpNWFhna3Z6ZGVtcGZjWlhdWHZmU0lcY1hoWFhIVmRQSGJ5W11gbFteXGJkXoBpal9vdHhub252g5d5coGAfX+Ji4Z+dXaGeIaMfXR1dYF5enqCjI59foSJanSWgXuKnX1+hXmAe358hohzcY+ujHx7hpB+ZnGIenR9fXZyb4Zte35tj3picG9iZV1lVlpZV2Nma2BdXXOGaVlxblteWFpcbHtjcXd2bWNbbXN0aHV2cW2FeX+BeXdub3RlaXVlW2d0ZnZ2kXpfXVNlZmqCgXN9YWNpXFVYXmJkkKVoeXSDhpB4bG55Z3dse4N5dIhygHh7eH9oZXZtYGZhX2pgXnVrWWVdb25iemZbeHxrbm5wd3l0dGRyg5J/h4KIenZvcXxyYXdjWm5vYXBxgXtzZXGAZF5tdmljZnh6c2xtgXRzfHJxYl5lbW59ZWlUaFlaVU55YFJLWllIY3RjYElUbVRKTVpWaWxye2NsbHNjYVlaW2F3XFNKY11YaVNWR1hgTkdqdlhfYm1bW19iY12FaWhhbnh5bG9qdoGQeG2CfoCCkoiEgXZ1iXSLhnRxdnaBd3x9foyQgH6TfnB4loN9mZJ5gIB4eX5/c4iDc3Caont7gImVeWR1iHlzeXZrc3B/bHl8cJFyXnBvYWdibFRbWldoY21mXFxyiWZTcm5bWVhYYGx2ZGp1ampfW210cW10dHRrhn1/gHx3b29sZWlxY1trcmR0do9zXFZTZGBxf35xglxhY15TWmFcZJOfZXJxhIOQdGtqeWxub3l5enGAdn9yeXp6ZGZ1Z15iW2FoXF53aVdiXnBoYXhhW3t2ampyb3d0c3RpcIGUg4Z+hHZyanB8bWV2V1tqbWJwcoB6c2Vvfltgb3FiXmlve2trc31ycHdrcGBbZWtte2FnVGdVWFJRd1xTUFlSSGNzYmBHVmxSSVBaVWtra3xlbW9xYVtaWFlscFdST2ZXVmhTVEZZXE9JcnVZYGRtY1hhYGFejGpjZG15eGtvaXV5hntrhH2AhZl8goR5fYhtj4Zxb3d6fHSCgn2Lj4OClnR4gpOGgZ+JdYF/gXR/gnCHgnVvopd0e4aLh3tmd4tvbnxwZnhxe2xzdnONa150bmFnZmtTXlxWaGJsbFtccYxkTm9uXVZYVWdpdGhjdGVlXVpudW5wdXV6a4h9gH2Id5BzY2VrbmFcbm1jc3iHa1pUVmJjd3x8cIVcY19jVFpgWmOWlWNucIOEinNqZ3luZXJ1cXpreXR1bnp+dV9mc2NbXldiZFlhdWZWX2FtY2FxXV1+b2hpc3FzcHV1a2yEk4GJe4VxcmZue29xblNaZWplcXOAdnNibHZVYnFrW15uZHtka3V8cnJyam1gWWNpanheZlRlVVZQVW9YUVdUUEhlcl9hRlhrT0lYVFZtaGR8aWt3amFXXFVbdGRTUlZoUVhlU1NIWVpQTnh3W2BmbGlaYmBeXo9uYmZreXVubml2dn9+bYSAfoaXe3+HgYl+a5OIcmd0gHt1gIN+iY9/i5NyfYqRhYefhnt/hoxzgIZzfYJ1bqSMc4GNi3d4bnuNYGR8cWd5c3ltbXF2g2dkfG1jZmdoU2BfVWdgbG9cXm6OaE1pbWBVVlNvZnNsZXhkZV1ZcXVtcnt4c22JfIF3nHt6bGJlbG1eYG5qZXB5fmdaVlhfbHh7e2+DX2JeaFZZYFhknIhia3GBhnx3a2p2bFt1cGp5aXVybW57gHJYam5eWV1WYmRYZXFkVF9iaWJibVpgfmtma3N1bm13dmtohYx/iXqHbXFmb3tscWxiWF9oaG9zgHNzXmltU2VwZFVibmF4Ym91e3Vqb2xqX1hgZmh1XWVWYlZTT1lnU09dT09IZW9dY0daak5KYEtYbWRfeGhufWRgVV5UXXRbVFJfZk5cYVRTSltZUVp2dl1fZm1oWGJhW16OcWNnandxc21ndnN5g3OCg3uIjn58ioiOeW6QinRsc4Fzf3+IhYeShJWPen2Mj4iRm4SAfIyEcn+Bc3R3cW6Tk5OTk5OTk5OTkpKSkpKSkpKSkpKSk5OTkpKSkpKSkpKSkpKSkZGRkJCPj4+Pj4+Ojo6Pj46OjY2Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2NjYyMjI2NjY2Njo6Ojo6OjY6OjY2Ojo6Oj4+Pjo2NjY2Oj4+Pj4+PjoKAfnp6fX5+fX1/fn59fn5+fn5+fn+Af4CAgIGAgIB/gIGBgYOHjI6Ojo6NjY2NjY2NjY2NjZKSkpOTkpKSkpKSkpKSkpGRkZGSkpKSkpKSkpKSkpKSkpKSkpGRkZCQkI+Pjo6Ojo6NjY6Ojo2NjY2Njo6Njo6OjY2NjY2Njo6Ojo6Ojo6NjYyMjY2MjIyNjY2Njo6Ojo6NjY2NjY2Njo6Ojo6OjY2NjY2Ojo6Ojo+Ogn99ent8fX59fX5+fn5+fn5+fn5+f4B/gICAgICAgH+BgYCBg4aMjY6NjY2NjY2NjIyMjIyMkpKSkpKSkpKSkpKSkpKSkZKSkpKSk5KSkpKRkZGRkZKSkpGRkZGQkJCQj4+Ojo6OjY2NjY2Njo6Ojo6NjY2NjY2NjY6Ojo2Ojo6Ojo6Ojo2NjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Njo6Ojo2NjY2NjY2NjY6Ojo6Cf3x6fHx9fn19fn19fX59fn5+fn5+gH9/gICBgYGAf4CAgICDhouOjo2NjY2NjIyMjIyMjIySk5OTk5OTk5OSkpKSkZGSkpKSkpKSkpGRkZGRkZGRkJCQkJGRkZCQkJCPj46Pjo6Ojo6Ojo6Ojo6NjY2NjY2NjY2Njo6Ojo6Ojo6Ojo6OjY2MjIyMjIyMjIyMjY2NjY2NjY2NjY2NjY2Njo6NjY2MjIyNjY2Njo6OjoN/fHp8e31+fH1+fXx9fn59fn5+fn5/f3+BgYGAgICAgYCAgIOGi42NjY2NjIyMjIyMjIyMjJA+LjExMTEvb4eEhISEiF0tMDAwMC1GoaGhoaGhoJqZmpqampqKg4SEhIOEd2VnZmZmaFxDREREREJLkpqZmZmZnFtBRERERENYaGdnZ2dmb4SDg4ODg4OLjIyMjIyMjY2NjYyMjY2NjY2NjY2NjIyMjIyNjY2NjY2OhX19e3t6fX58fH59fX1+fX1+fn5+fn9/f4GBgYCAgICBgICAgoWKjI2MjIyMjIyMjIyMjIyMjy0aHR0dHBpohoKCgoKGUxgdHR0dGTekpKSkpKSjnJycnJycnImBgoKBgYJyXV9fX19hUjQ1NTU1Mz+TnpycnJyfUjE1NTU1NE1hX19fX15qgoGBgYGAgYqLi4yMjIyMjIyMjIyMjIyMjY2NjY2MjIyMjIyMjY2NjY2GfH16enp8fXt8fn19fX59fX5+fn5/f3+AgYCBgYGAgIGBgYGChYqNjYyMjIyMjIyMjIuLi4uRiYeHiIiIh46QkJCQkJCMh4eHh4eHiZKTkpKSkpKRkZGRkZGRj46Ojo2NjYuJiYmJiYmIhYaFhYWFho2Ojo6Ojo6IhoaGhYWFh4mIiIiIiImKioqKioqKi4uLi4uLi4uLjIyLi4yMjIyMjI2NjIyMjIyMjIyMjY2Njoh8f3l7ent8e319fX18fX19fX5+fn9/f4CBgYGBgYGAgYCAgYKFioyMjIyMjIyMjIuLi4uLi5GTk5OTk46RkpGJh46KkJKTkYuSj4yOhYqRkZGRkJCQkJCPj4+Pj4+Ojo6Njo6Ojo2Njo2Njo6Ojo6NjIyMjY2NjY6Ojo6Ojo6NjY2MjIyMjIuLi4uLiouLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyNjY2NiX59eHh5fH18fX19fHx9fX59fn5+f3+AgICBgYGBgYCBgIGCgoSKjIyMjIyMjIyLi4uLi4qLkJCRkZGPhI6QkIaKj4WNkJCOhY6HiI2IiZCQkJCQkJCQkI+Pj4+Ojo6NjY2NjYyMjIyMjIyMjIyMjIyMjIyMjI2NjIyMjIyMjIyMi4uLi4uLi4uLi4qKiouLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjI2Lfnx3dnh7fXx7fX18fH19fn5+fn5/f4CAgIGBgYGBgIGAgIGChIqMjIyMjIuLi4uLioqKioqQkJCQkIqFjoiOhoaPiY2QkJCIjIWGj4mMkI+Pj4+Qj5CPj4+Ojo6OjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLi4uLi4qKioqKi4qKi4qKi4uKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIt+e3d2eHt8fHx9fX19fX1+fn5/fn9/f3+AgIGAgYGAgYCBgYGEiYyMi4uLi4uLioqKioqKipCQkJCPhYOMjpCOiYyKjpCQkIiMh4iMiI6Pj4+Pj4+Pj4+Pjo6OjY2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKioqKioqLi4uKioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMin18dnZ4fHx7fH19fX19fn5+fn5+fn9/f4CAgYCBgYGBgIGAgYSJi4yLi4uLi4qKiomJiYmJkJCQkJCMhoyJjoeFjYmOi4yQiI2HhYyIj4+Pjo+Pj4+Pjo6OjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKioqKioqKioqKi4uLioqKioqKioqLi4uLi4uLjIyMjIyMi4uMjIyKf353eHp7enp8fHx7fX1+fn5+fn9+fn9/gICAgICBgICAgYCBhIqMi4uLioqKioqJiYmJiYmPj4+Pj5CMjouPjIqPjI6MjY+Mj4yLjYyOj46Ojo6Ojo6Ojo6NjYyMjIyLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLjIiAfXh5enl6e318e3t9fn5+fn5/f35+f39/gICBgICAgIGBgIGEiouLioqKioqJiYmJiYmIiI+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Ojo+Ojo6Ojo6Ojo6Ojo2NjYyMjIyLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLioqKi4uLh4B8eHp6eXt8fHt8fH1+fn5+fn9/fn9/f39/gIB/gYGAgIB/gYSJi4qKioqJiYmJiYmJiIiIj4+Pj4+Pj4+Pj46Pj4+Oj4+Ojo6Ojo6Ojo6OjY2NjY2NjY2MjIyMjIuLi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKiYmKioqKioqKioqKioqKioqKioqKi4uHgHt5eXh6fHx6e3t9fX5+fn5+f39+f39/f39/f3+BgYCAgH+BhIiLiomJiYmJiYmJiIiIiIiOjo6Ojo6Pj46MjI+Sj5COjo6Ojo6NjY2NjY2NjY2NjIyMjIyMjIuLi4uLioqKioqLi4uLi4uLi4uLi4uMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKiomKiomJiYqKioqKioqJiYmJioqKioqKioqKioqKioqKioqKi4aBe3h5eHp8ent7fH19fn5+fn5/f35/f39+fn9/f4CAgYCAgIGEiIqJiYmJiYmJiIiIiIeHh46Ojo6Ojo6Ojo+MkJOQkI+Ojo6NjY2NjY2NjYyMjIyMjIyMjIuLi4uLi4qKioqKioqKi4uLi4uLi4uLi4uLi4uMjIyLi4uLi4uLioqKioqKioqKiYmJiYmJiYmJiYmKioqKiomJiYmJiYmJiYqKioqKiomJioqKioqKhYB6eHl5fHt6ent8fH1+fn1+fn9/fX9/f35/f39/gICBgICAgYSIiomJiYiIiIiIiIeHh4eHjY2Ojo6Ojo6Pj4+PjoyNkI2NjY2NjY2MjIyMjIyMjIyMi4uLi4uLioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYmJiYmJiYmKioqJiYmJiYmJiYmJiYmKioqJiYmJiYmJioqFf3l6eXh7e3p7fHx7fn5+fX5+f39+f35/fn+Af3+AgICBgYCChIeKiYmIiIiIh4eHh4eHh4eNjY2Njo6Oi42Nj5WPiYyPjYyNjYyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYR+eXt5ent7ent9fHt+fn59fn1+f35/fn9+f3+AgICAf4CAgICEh4mIiIiHh4eHh4eHh4aGhoyNjY2NjY+MjImKj42IjJGPjY2NjIyMjIyMjIyLi4uLi4uKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uKioqJiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJg355e3p8e3p7fX17fH9+fn5+fX5/fn9+f3+Af4CAgH+AgH9/f4OGiIiHh4eHh4aGhoaGhoaGjIyMjIyLiYyKiIeJhoyOjJCMjZGOjIyMi4uLi4uLi4uLi4qKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiImJiYmJiYmJiYmJiYmJiYmJiYmIiImJiYmJiYmJiYmJiYiIiIiIiYmCf3h7e3t6enx9fHx9f39+fn19fn9/f39/f4F/gIB/gICAgICAg4aIh4eHhoaGhoaGhoaGhoWMjIyMi4yOjoyKioeEiIuKjIuNjo+Li4uLi4uLi4uLi4uLioqKiomJiYmKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiomJiYmJiYiIiIiIiIiIiImJiYmJiYmJiYmJiIiIiIiIiYmIiIiIiIiIiIiIiIiIiIJ/eHp7enp6e3x8fX1+f35+fX1+f39/fn+AgICAf3+Af4CAgYCDhYiHh4aGhoaGhoaFhYWFhYyMjI2NjJCSjI2Ii4mJi4uLi4mLjIqMi4uLi4uLioqLi4qKiomJiYmJiYmJiYqKioqKioqKioqKioqKioqKioqKioqKiYqJioqJiYmJiYmIiIiIiIiIiIiIiImJiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIiIiIiIiIiHgXx4e3x5enp8fHx9fX9/fn59fX9/f39+fn+Af4B/f3+Af4CAgIKEh4eGhoaGhYWFhYWFhYWFjIyNkY+PjZGJjIaJjIuIiImMiYeNjo+NioqKioqKioqKiomJiYmJiYmJiYmJioqKioqKioqKioqKioqJioqKioqKiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4WAenl9e3t7enx8fHx9f39+fn19f39/f35+f4B/gH9/f4B/gH+AgoSHhoaGhYWFhYWFhYWFhISLi46PjoyLj4iHiYmMjYWFjo2KiYyNi46KioqKiomJiYmJiYmJiYmJiYmJiYmJiYmKioqKioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHhoaHh4eHhH55eX16enp7fXt8fX5+f35+fX5/f39/fX5/f3+Af39/f39/f4CChIaFhoWFhYWFhYWFhISEhIuLjI6MjI2Lh4mIiomGgoiNjoiKi5GTj4uJiYmJiYmJiYmJiYmIiYmJiYmJiYmJiYmKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIeHh4eHh4eIiIiIiIiIiIiIh4eHh4eHhoaGh4aGhoaGhoaGh4eDfXp5e3p5enx8e31+fn5/fn59fn9/fn9+fn+AgICAf35/f39/gIKEhoWFhYWFhYSEhISEhISEioqOjYmIiIqKh4iHiomIioiIh4qGi5GPiomJiYmJiYiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHh4iIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGh4J8eXl6eXp7e3t7fX5+fn5+fn59gH9/f39/f4CAgH9/fn9/gICAgoSGhYWFhISEhISEhISEhISKi5CPiYmJi4qHh4WHiYuKiYSLjYmOjYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiIiIiImJiYmJiYiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGgXt4enp4e3x7e3x+fn9+fn5+fX1/f39/f3+Af4B/f39/f3+Af4CChIaFhYSEhISEhISEhISEhI+Qj4+IiYuIhoeIiYuLjIuJioqNio6Oj4iJiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoaAe3h5eXh4enp8fX1+f35+fn59fn9/f39/gIB/gICAf39/gIB/gYKDhoiGiIaDhISEhIODg4ODkpKOioeKi4qLh4uNiYqJi4iHiouIio+SioiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhn96eXh4eHl5eXx9fn5/fn5/fn1+f35/f3+Af39/f4CAgH+AgH+BgoOHjo+PjoiHhIWFhoaFhYWSkI6KiYmIiImKioiIh4aKjIiHiYmOkJGNh4iIiIiIiIiIiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4aGh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWGf3l4d3d3eXp5e3x9fn9+f35+fn5+f35+fn+Af4CAgICAf3+Af4GBg4eOjo6Ojo6Mjo2OjY2MjZCQjomHhoiJiYeIiouIiYyJiYaKjY6PkYuIiIiIiIeHh4eIiIiIiIiHh4eHh4iIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhYZ+eXd5d3d6eXl8e31/fn5/fn5+fn5+fn9+f4B/fn+Af39/f39+gIGEiI6Ojo6Ojo6Ojo6Ojo2NkJGOi42JjIiIiYaHiYaIioiHi4yLjpCQiIeIiYmJiIeHh4iIiYmIh4eHh4iIiYiIiIiIh4iIiIiHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhoaFhYaGhoWGhYSEhIWFhoaFhIWFhX55d3l2eHl4e3x7fn5+fn5+fn5+fn5+f39+f39+f39/f35/f3+AgYOGjY2Ojo6OjY6NjY6OjY2Qj42Ni46KhoiKhISLiYeDhYSDi4mLj42JjI6QkI+NjYyLjY6Pj42NjI2Nj4+Pjo6MjYyMjY2KiYiHiImHh4aHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoeHiYqKiIeJi4yNjo2LiImLi42OjYyJiImMgHl3d3Z6eXh7e3t+fn5+fn5+fn5+fn5/f39+fn5/f4B/f4B/f4CBg4aMjY2NjY2NjY2Qj4+Pj46NjI6KiYuMjIeFiY2Lh4aIh4aHh4uNjo6Pj4+Pjo+Pj4+Pj4+Pj4+Pj4+Ojo+Pj4+Pj4+Pj4+Oj46Oj46Mi4uJh4eHh4aIhoaGhoaGhoaGhoeLiYeHiIiLjY2Mi4yLjY2Ojo+Ojo6Pj46Ojo6Ojo6Ojo6Njo6NjY2AeHZ4eHp4enx6fH5+fn5+fn5+fn5+f39/fn59fn9/f39/gH9/gIGDhoyMjIyMjY+QkpOTk5KSjYyMjIqHioyKh4eJiYWCiouIiYWJjpCNjo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjI2NjI2LiYaHh4eHiYqLjY6NjYyNjY6OjY2OjY2NjY2NjY2NjY2NjY2OjIyNj4+OjY2MjIyLi313dXd5enp7e3p+fn5+fn5+f35+fn5/f39+fn1+f39/gICAf3+AgYOFj5KRkJGSk5OTk5OTkpKLi4uLiomMiouLiYuKhoeOjYiIjI6OjIuMjIyNj46Njo6Ojo2NjY2MjY2NjIyMjIyMjIyMjY2NjYyMjI2NjYyMjI2NjIyNjIyMi4yMi4yMjI2MjIyMjIyMjIyMjIyLi4uLi4yNjY6Sk5OSkpSRkJOVlZSTk5COjo6Oe3Z2d3h6ent7e31+fn5+fn5/fn5+fn5/f35+fn9/f39/gIB/f4CBgoSNkpKTkpOSkpOTkZKSkoqJioyJi4qJjIuKioiHiYqKi4mKjY2Mj46Nj5KUlJOUlJOTkpGSkI+Ojo2NjY2Pko+OkZGOjIuKioqLi4qKi5CPjoyMjIqKioqKioqKiouKioqKi4yLi4uMjIyKiouLi46RkpOTk5SUk5STk5SUlJOTk5KSkpKSk5F6dXZ2eHt7e3p6fX5+fn5+fn5+fn5+fX5/fn5+f39/f3+Af39/gIGChIuRkZGRkZKSkpGRkpGRiYmIiIqMiYiJiYuJhoSJhoyKh4ySkpKTk5OUlZWWlZWUk5OUlJSUlJSUlJSVlZWVlZWUlJOTkY+QkZKQjoyRlZWVk5KSjo+QjYqKi4qKi42OjY6RkpCRkpKSkpGRkpKSk5OTk5OTk5OTk5OTkpOSkpKSkpKSkpKSj3h1d3l6e3t7ent9fX19fn5/f35+fX5+fn5+f39/fn9/f4B/f3+AgYKEi5GQkJCSkpKRkZGRkZGIiIiIi4uJg4eLi4yMiIeHjYyNkpSSkpOTlJWWlpaVlZSSkpOTk5SUlJWVlZaXlpaWlpWUk5SUlJSVlJSUk5OVlZWUk5KTk5OTkJGSkZGSk5OTk5KSkpOSkpKSkpKSkpKSkpKSk5OTk5SUk5OSkpOTkpKSkpGRkZGPdnJ3enp7e3t8fX59fX1+fn9+fn9+fn5+fn6Af39/f3+Af3+Af4CBgoSKkJCRkZGRkZCQkJCQkIeHh4eIiIiFi4+KjI6Njo+OkJWUk5OTk5SUlZWVlJSVk5KSk5KTlZSVlZaWlpaWlpaWlpSTk5OTk5OUlJOSk5SVlZSTkpKSkpOTk5OTk5OTk5KSkpKSkpKSkpGSkpGRkZGRkZKTlJSUlJSTkpGRkZGRkZGRkZGRkYx0c3d6ent7e3x9fX1+fX5+f35+fn5+fn5+fn9/f39/fn9/f39/f4GDhIqQkJGRkJCQj4+Pj4+Ph4iKi4yNjYuOj42Mjo6RkpGSk5OSkpKSk5SUlJOSk5OTkpKSkpKUj46Uk5WVlZWUlZWUk5OTk5KSk5OUk5KTlJSUk5KSkpKSk5OTkpKSkpKRkZKSkpKSkpKSkpKSkZKRkZGSkpOTlJSUk5OSkZGRkZGQkJCQkZCRinN0dnp8fHp7fXx9fn59f35/f35+fn9+f31+f39+fn59f39/gH+AgYKDipCQkZGQj5CPjo+Pjo+Oj4+Pj4+Pj4+PkI2OjpCRkpKSkpKRkpKTk5OTkpGSkpKSkZGSkpN8hpSSk5STk5OTlJOSk5OTk5OTk5OSk5OTkpKSkpKSkpKSkpGRkZGSkZCRkZGRkpKRkZGRkpGRkZGRkpKSkpKSkpKSkpKRkJCQkJCQkJCQkJGGc3V2e3x8e3x9fX1+fn1/f35/fn5/gH9+fX5/fX5/fn5/f3+Af3+BgYGKkI+PkI+Pj4+Pj4+Pj4+Oj46Oj4+Pj5CQiI2PkJGRkpKSkpOTk5OTkpKSk5KSj36PkpGTiHOMk5GRkpKSkZKSkpKSkpKTk5KRkZKTkpGRkpKSkpKRkJCQkJGRkZGQkJGSkZGRkZGSkZGRkZGRkZGSkpKSkpKSkZCRkZCPj4+Pj4+Pj4+PkX9ydHh8fHx7fHx9fX5+fn9+fn5/f3+AgH99fn5+f39+f39/f4CAf4GBgYqPj4+Pjo6Ojo+Pj46Ojo6Ojo+PkI+Pj4+GjpCQkJCRkZGRkZGRkZGQkJCQkJCQdHaQkZB4dIqRkJCRkZCQkJGRkZGRkZGRkJCQkZGQkJGRkZGRkI+PkJCQkJGRkJCQkJCRkJCQkJCQkZCQkJCQkJCQkZCQkJCPj4+Pjo+Pj46Ojo+Pj4+PeHJ2eXx9fHp9fH19fn5+f35+f39/f4CAf39/fn5/f35/f39/gIB/gYGAio6Ojo6NjY2Ojo6Ojo6NjY2Oj4+Pj4+PjoiQkZCPj4+QkJCQkJCQkI+PkJCQj5F8aH2RiXV2iZCPj4+PkI+PkJCQkJCQj4+Oj4+QkI+PkJCQkJCPjo+QkJCPj4+Pj4+PkJCQkI+PkI+Qj4+PkI+PkJCQkI+OkI+Pj46OjoyMjY2NjIqDiYhzc3Z4fX58eX18fX1+fn5/fX5/fn9/f39/f4B/f39/f4CAgH+AgH+BgYCJjY2Ojo6Ojo6OjY2OjoyNjY6Ojo6Ojo2NiJCRkI6Njo6Ojo6Ojo6Pjo6Ojo6OkIBiaop+bHSIj46OjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Pj46Oj4+Pj4+Pj4+Pjo+PjY2MjYyNjoyLi4mJiYiFhYSDgoKEgnR5fXp4dXJrZWltb2xmZmdncHNzd3l9fnl6e3x9fX1+fn59fn9/fn9/f39/gIB/f3+AgIGAgIB/f4CBgImNjY2NjY2MjYyMjIyMi4uLjYyMjIyMjIyGj5GRjIyMjIyMjIyMjIyMjIyMjIyOd15qZmljbIqOjY2MjIyNjY2NjYyMjI2MiomKi4uJh4KAh4iEgXt6gH57fXx8fXlzcnJycnV1cG1ramppZ2NkYV9bXF1eWFVXWFlTS0VJSkpLTE1PT0tgdHR3eX19eHp5e3x8fX5+fn1+f39+f35/f4CAgH+AgICBgYCAgICAgIGAf4OEhYSFiIuLjYyMjIuLi4yGiYqKioqKh4OOkJGNiouLi4uMiYmKioqKiouKi4Zkb21baXJrgYaDhIeJiYWCg397fHl6e3pzcHFxcW1samdsbWdlZmVmZGNlZGVkZWVlZWRkZGNhYV5dXFpYWFdUUFFSU1JTTU1KSUZESEpHR0hHR0xOSWdzdXh6fXp4d3l8fHx8fn5+fn9/fn9/f39+f4CAgIB/gICBgICAgICBgYFnXmBjYWNucX17ent/fXd8fHZ4ent4eHpvcXt4eXt8e3h3e394dXd0dHZ1dXZ3b2Nxb2Fqc3FlaGtsbm9tamlpaGhlZWRkZF9gYWJgYF5dWVhaWltdXV9gX2BfX19gYmFeXl5eWVldXF1bV1dWUlRSU1NOUUpISUZERUhMTEhGR0lLSklNbXJ0eHp7end3eXt6e3x+fn1+f39+f35/f35+gIGAf3+AgIGAgICAgICCgWdYW1pZXFtcY1xaXF5ga3FtcHBvbm5vbmtpbmxrbG9qaWtraWpraWZmZ2dnaGhjZWtuc3BydWxjY2JhYmBgXVhbW1dYV1RWUVBUU1NNSkxLTExOTk9UWFhXVVVUUlBQTU1QT05LTE1QUU9MTEpHSUlHSEhJSEhIR0ZHSEpKSEhISUlISVZwc3V5ent5dnZ5enp7fH59fX5/f35/fn5+f3+AgX9+f4B/gICAgICAgIGBbFtYVlZWWVlaWVlYVVZoamxubmxra2poaGloZGVkYlxiZl9fYWNfXF9dYF1eWVxgYmNtb3BwbVpZX1tYV1NOTUtLS0tMSUtNTktKS0tMSktQTEtLRkdHSUlGR0lISUZFSEdGRkVERUVEREVJSUlHSEdIRkZLTUtJSUlIR0hLTU1LTExMVXFzdnl6e3h2d3h3ent8fn1+fn9/f39+f3+AgIGAfn5/f4CAf4CAgIB/gYJoUlRVVlNVV1lZWVdXV1tbYWNfXlxbWFZWWVZSVFJRUVVUU1NUUE1KTU5QUk9NT19oZmxubWdlUVBTUFBOTk9NSk1MS0xKSktLRklJSkxJR0pISUlFR0dGRkVFSElKR0ZHRkZHR0hKR0dISEpMSkpLSUlISktLSkhKS0pISUtMTU9QUEtUdHN1eHp6eHZ2d3d6enx+fX5+fn5/f35+fn+AgYB/f3+AgYB/gICAgH+AgmlQUlRXVVRWWVdYWFpbVFRTUlBRU1FRUU9OTlBQUU9MTlBPTk5NTEtNTk5PTExWZG1mam1tamdcU09PUFFPTk5PTk9QTk1NS0lISEpJSUlJR0ZHR0dJSkhJSEhJSEhHSEdISElISUxLSklISkpJSkpIR0pMS0pJSUhKSktMTk1NTU9RTFVzcnN3enl3dnR2eHp7fX19fn5+fn9+fn5+gICBgICAf4GBgH+AgICAgICBbE9PTlRZVVVdW1lXV1hOTUpKSUZKT0xKSkdJSk1NS0pMTUpHSUlJSktLR0dPVWBobmhsbGtqamhkX1ZPT09NTk9MTk5OUFBPTE1MTk1MTEpJSEdJSElISElJS0xLS0pJS0pJSklJSUlJR0dKSUdJSUpKTk1OTEhJSklJSk1PT01MT1JOWXBwcnd4d3d0c3R3enx+fX5+fn5+fn5+fn9/gICAgICAgYCAf39/gICAgIFvS0pNTlFOTlVXVlZSU0lFQ0VFUkREQT5CP0RAQD5CREFAQURHRkVIRUVTXmJmaGptbHNwamlqbGtqZlhKSklKSUlLSkxQTk1MTU1MTU1NTElIREZGR0ZGRklKSUlLSkhMSklKSkpJSEhKS0tIRkdJSklLTU5OSktPTUxLTU1PUE5QT1BgcG9yd3h2dHJzdXd6fX19fn5+fn9+fn1/gICAgICAf4CAgIB/f3+AgICAgXNQUE5OUE1KS1BSUE5RQ0RCQUZRRT1DPT9FSDk6Oz0/PTxBRkA+Ojs+Pz9NWV5qbWxueXNqamxmXFJMRUVFRUZFR0dHR0pHSEpLR0NER0pHQ0RFQUFDR0hHSEdISktKSElMS0lISktLTU5MTUxMSkpMS0lLTU9PUFNRT1BQTk9QUlFNUGdwb3N2dXRycXR4eX19fX1+fn5+f4B+foCAgH9/gIB/f4CAgH+Af4B/gICCdlRVUVFQT0xNUFBOT09BQkFAQkE/Oz48Pj8/Ozg5ODs7OkA6Oz48Ozs7O0dKPkdZam93cGtpWUdEQUVGREdJSEM/QEBAQUFCQUE/Pjw9PkFAQD8+P0BFR0dHSUtMTk1OTUxNTUpLTVBVU05MTlFOTk1OTE1NTk9OTk1LS05OTk1OTkxUbnBwcnR0c3Fydnl5fX19fn1+fn5/gH5+gICAgICAgH9/gICAgH9/gH+BgIJ4UVFSVFJTUVNTUVFST0BAPT4/PD8+QEE/PT45Ozo7Ozk5Ojg4Ozw5Nzk7Oz49OjtEWG1sX0hBPkFAQ0ZEQ0NDPzs+PkBDQ0E/Pj9BPkBAQj9APD9CQEFDRUVFSktQT1BPTU1OTExMT1JRUFJOTExPTUtOT0xMTEtMS0tKS0tKTU1LS1xxcXF0c3VycXR4eHp9fn1+fn5+f39/fn5/gIGAgH+Af4CAgICAf4CAf4CAgXxSTU9RUFFSUlRSU1NOPDs8Ozs7P0BBQkA9PDk8PTw6Nzk6Ojk3OTo6Nzg6OTo7Ojc3U2M9Nzg8PD1AQUA9Ozs+PD09QEJDQT9BQkE9Pj09Oz0/Q0RCQD9BREJFR0pKSkpKTE1MTExNTExOVVNLTE1USVBKSU1KSUpLS0pJSEdKS0lKZnJxc3RzdXJydnl5e31+fn5+fX9+f39/f36AgICAf4CAgICAgIF/gIF/gYCBgFZMTlBQTlJRUFBRUU44PT88PDo9PkFAQT8+PkA/Pj48PT0/QD09PT9DOz09Pj09PTtFWTk7PD49Pj9AQUA+P0E/QEBBQEBAPT8/PTw6Oz09PD9AQUJCQUBCREZGRkdGR0dISUtMTExLTEtKS0lKSk1MTEpMS0lISUxMSklJSElLR01tcHF1dXR1c3V4eXl8fX5+fn5+fn5/gH9+gIB/f39/gH+AgYCAgYCBgICBgYCCYUtPT05OT1BPT1BQTzo8Pjw9Oz8+PkFBPz0/Q0NEQT89PkBBP0A8XW5APkRFPz9BPEVcPT09Ozo9PkFBPz5AQD9BPz89PD48PTs7PD0+QUA/QD5AQ0NEQkRFSEVFR0hISEdGSUpJSUlJSUhKSkpKTEtKSklJSEhKSktMS0lLSkpIVnBwcXNzdHR1eXp7e3x+f35+fn5+f39/f39/f3+Af4CAgICAf4GBgICAgIGBgIJtTFBRTk9QTk5PUFBPPjw8PT4/P0A+QEA/Pz9CRkQ+PDw9QD04Ojttdkg4Ozo9PUE8SmE8PD08ODo7Pz49PD07PEA9PTw8Pjs9PD0+QUBCQUBAP0JEQ0RFRkZGQ0VHSElJSEhJS0tMTUpKSUpNTUpLSktJSEhISEpJSktKSk5MSUlfcHBycnJ0dXZ6e319fH5+fn5+fn5/f35/f36AgIB/gICAgICAgYGAgICAgIGAgnZNTk5NTk5MTE5QT0w+QTw8PT8+QkM/PkFBQUJBQFlSPD09SUxGRnZ3TTc4ODo7Pj9XaUE7PDw6Ojs+Pz89PDg6Pjw9Pj89Oz4/QEJDQkJDQ0FCQkFCQkRCQkRCRENGSUdGRkhJSUtNSklKSktMSkpJSkVESUlGRkhISUpKTEpGRmdwb3FxdHZ1d3t8fH18fn59fX1+fn9/foB+fn+AgH+AgICAgICBgYCAgICAgICBek5JS0tMTExFSUxOTTw/PDw9PkBAQUE7QkNCQ0BDc3lJO11/g395fHdWPD0/PT0+Rmp1TTo9Pj89PT5BQ0A8OTtBPz4+QT07P0JAQkNCQENDQUNBPT0+QD0/QUFBQENFRUBAQ0JDR0dFRENGRUZGR0VEQEFHR0ZDRkRHSEpHQz5IbG9wcHF0dXZ5fHx8fHx+fn1+fn5+fn5+f36Af3+AgICAgICAgIGAf4CAf4CBgIF+UUhLTU1NS0pLTE9RQD8+PkFBQEBBR0FCRENFQUhyeWtigoSDg4OAfV0+QENAQD1Kc3xZOj1BRUFCQkZIQz08QEREQUA/Pj1AQT4+Pj88PkBER0VAPkBBP0BDRkVDQkNDQEJEREJERUFCPkFCQkFCQEA9QUJDRENDQUNFR0E/PVZwcHFwcnV1d3p8e3t7fX9+fX19fX1+fX5+fn9/foB/f4CAgICAgYCAgIB/gIGAgX5SSEtNTUxLS05OUlVEQkBDQ0FBQkBCQ0BAQUFARm90fYKCgYN+fYR1TEFDRUA/Pll8gF0/Q0VJSklJTU1LRUNGRkdFR0VFRUREQ0E/QD4+QkZKSkdFRUdGRkpOTktKSUdHSEtMSUdHQ0REREVEQUJCQ0BDREVEREVERUZDQkFEZW9wcXF0dnV4e3x6fHx+f319fX19fn59f4B/f39/f39+gIGBf4CBgICAgH+AgICAfVJJSUpKSEpKTE9SU0dGRUdIREdIREA+PDs+QEVFaHN9gXx/hH55hXFCREVEQ1d1hoeHflhHSEpNTE5PT0xIR0hHSElJSEhHR0hIRUNFRUVFRkhKSkZFR0lKTU9PTU1LSktKTU5LSUhHSEhIR0ZFRkZGREZIR0VFSEhGSEZIRlFubnBxcnZ2eXt7e3p9fX5/fX19fX1+fn1/f39/fn5/gH+BgYGAgICAgICAf4GBgIB8UEhHSElGR0lKTU5OSkxJSUpLTE5KRkNBQkNGSkdge4B/d3+EhYOEimxBQVZ0h4mHh4eIg1dITE1MTU5MSkdHR0dER0dHR0ZIRkhFQ0RERkVEREhIQ0NDRklKS0xMTExMTElKS0pKSUlJSEpISEdISUhHR0hGRkZISklJSUlIXW9vcXJzdnd6e3t6e319fn59fX19fX5+fYB/f39+fn+BgIGAgYCAgICAgIB/gYCAgHxNR0ZIRkVGR0dKS0pMTUxLTU5NT0tJSEhKS0tMTE5bfIKCg4OFhoaIg1ZshIeGhoaHiIiHfFBLTEtIR0ZGREVDQ0BBQ0NDQ0ZGRUJAPj5AQUFAQkQ/Pj9ERkhERUdJSklKSEhIR0lJSUpJSEZKSkpKSUpJSkpKRklMTEpKS0tmb3BzcnR2eHl7e3t8fH1+fn19fX19fn59f39/f35/f4CAgICAgYCAgIGAgICAgICAfU9GRkdGR0hHRUZHR01NTUtMS0lHQ0NDRElLS0xMSlWBg4SEgoKFhoaEgoaFhISGhoaHh4aKdUlJRkI/P0A/Pz88PDw+Ozo8QUFAPjw5OTg8PD07Pjs5Oz9BQkBBQ0NCQEFCRERCQ0ZISUhISExNTEdJSk1NTk1KSktLSkxNU2xwcXRzc3d5e3t7fH19fn9+fX19fX1+fn5/foB/fn9/gICBgIGBgICAgYCAgIB/f39+UUZFRkdJSUdEQ0VGTk1MSklIRT85Oj5ARUhISkpJZYWEhIR/gYKDgoODhIWFhoiIiIiIiYyOZkJCPTg4Ojo5ODc4ODk2NDc5Ozw6ODU2Nzc4OTc4NzY4ODs7Oz1AOzk5OT08Pjs7PUFDRUhKTUxMR0lIT1JRUFBOTE1NT1Fdb3BydHN1eHp7e3x8fn5+f359fX59fX5+f39/gH9/f4CAgICAgYCAgICAgICAgIB/f39RR0ZHSEpIRkVGR0hMTEpJSUdDQjU2OjxDQENHSUlqhoSEgX6Bg4ODgoOEhomKjIyLiomKi4yJVDo4NjU2NzY2NjQ1NzczNTY4Ojg3NjU2NTY3Njc3ODo2Nzc4OTs3NTc4OTc5ODc2OjxAR0ZJRklGRUZPU1JTU1JPUE9SVGVwcXN0dHd5e3x7fH1+fn5/fn19fX19f39/f3+Afn+AgICAgICBgICAgICAgICAgH9/flJISEhJS0lHSUpJSkpLREVIRUJANTc4OD06PUVDQmaFg4GAgoODg4ODhYmLiomJioqKiouJioqBRzY3NjQ2ODg3NDU3ODU2NzY5OTc2Njc2NTo5Ojs6Ozg5ODk4Nzc3OTo5ODg2ODY4OTtBPT4+QkE/QUtMT1FQUU9PT1JXa3FydHR1d3p7e3t9fX5/fn9+fX19fX5/f4B+fn9/f4CAgH9/gICAgICAgH+AgICAf39+VEhHSUlMTUtKS0tMSUg/QEFAPDo1Nzk4OTc7Qjo9cYSAgYOEhISEhIaJioqIh4iIiIqKi4qJiYx6Pjk4ODs8PT45Ojo8OTo7OTo7Ojk5Ozo5PT09Pjs7PD06Pjs5Ozs8Ozw8OTo8ODo6Ozo5OTk8Pzw9QUJESUpNS0lLTFdvcnN1c3V4e3t7fHt9f39+f359fX19fn9/f35/f39/f3+Bf4CAgICAgICAf4CAgH+Af35URkVGSUxOTkxKSk1CPzo7PDs4OTk4OTo6Ojs/Pkh+hIKChIWFhYaIiYiHhoaGiImIiYuMi4mKioxsPDs+QkNFRUFBQEI+QEJAQD49PT5APz4/QD9APT0/Qj9AQT9BPz1AQEA+P0E9Pjw7Ojs5OTs/PTs8PT1BQUNBQkNBWHBxdHR0dnp7e319e31/fn9/fn19fX5+f35+fn9+f4B/f4CAgIB/gIGAf39/gICAf39/flJFQ0FHSk5PTElHSzo4Ojs5Ojo8PTo7Oz09P0BCUoKCgoSFhIWEhomJiIiGhoaHiImKi4uKioqLiotePkRHSUtKSUZHR0RGSEdFQkBAQ0VDQkBCQ0I/QERIRUNFQ0VFQUZFRkRFRkRAQj88QD49P0A+Pz4/Pj8+Pjo7PTxgcXJ0dHV3enp7fX19fn5+f39+fX19fX5/fn5+fn5/gH9/gICAgICAgICAf4CAgIB/f4B+UERAPUNIT01HRkJEOTc6Pjo8Oz4/Pz89QUBDREZXhIKDhIWFhoaIiYmIh4aGhoeJiYqLjI2MjIuKiohWSE1MTUtOSklLSUlKSklFQ0RGR0ZEQ0VGREJISUtIR0dGSEdFS0lLSUpLSkNGQ0NEQkFBQ0JEQ0NERENBPTs9QGhwc3R0d3d5eHt8fH19fn5/f359fX1+fn9+fn59fn+Af3+AgH9/gICAgICAgICAgH+AgH9PQT49P0RMS0BCQkE5ODw+Ozw7PkA/QT5CQkdHSVmEgoOFhYaHiImJiIiHhoaGiIiIiYqMjYyMi4uKjH9QTlBOTE5LSkxKSUlISkZERkhISUVFSEZGRUxMTUlKR0dISUpOTU5MTE5LSEdHR0VFQ0ZGRkZERUhIRkNBP0BMbHB0dXZ4eXl5fHx8fX1+fn9+fn19fX1/f35+fn5+f39/f39/f3+AgICAgIB/gICAgICAf1FBPz4/RUdHPTxAQDg3PDs8PTo+QD4/QENGSUlQX4GDhYSFhoaHiIiIiIiIh4eIiIiJioyNjIyMjIuKjXJOUk9OTExMTEpIR0VJSURKSEdLSkhKR0dHS0xOTExISElKTVBOUE5NT0tJR0lKSElESUhIRkZHR0hGQ0JBQ1VucHV3d3l7eHl6enx8fX5+f39+fn1+fX5+fn5/f36Af4B/f3+Af4CAgICAgICAgICAf39/VERBQUJHSEI/OD9AODo8OD0+Oz1BPj9BREhKTFVxg4SEhISFhoeIiIiIiIeGiIiIiImJjIyLjIyLi4uLi19SUlBNTk1LSkdFQkdKR0xKRktOS0tKSkxNTE9QTkhJS0xPUVBQUU9PSklKSkxKTEZHSEdGR0lGRUVCQUJCXG9yd3h5enp5eXp6e3t+fn5/fn59fX19fn9+fn9+f4CAgIB/f39/gICAgICAgICAgH9/f39VRUNFRUdHRUQ7P0E7PTw5QD4+QEJHR0FHS0xQVnmFg4ODhISGiIiIiIiIh4eIiIiIiIqLi4uMjIyMi4uNfFhWUlJUU09MS0pERUZLT05PV1VRUE9SU1NNU1RPTVNMUFNVVlJTUVBMSk1NTUtOR0dKRkZJSkRERUVCRENjcHV5eXp6ent6e3p6fH59fX9+fX19fXx9fn5/gH9/gICAf39/f3+BgYCAf39/gIB/f39/f1VGRkdHR0dIRj5AQj0/PT1CP0JCR1ZORk5QUFRYe4aDhYWEhIeIiIiIiIiIiIiIiIiJiouKioyMjIyOi4uLaFdVa2FFUlFRUEk7O1JUUmB1XVVWVFZZWVJYWFJaZlBVV1pdUlRXUU9OUlBQUFFLS0tISEpIRUZJSUlISWlydnl4eXl6e3t8ent8fXx9gH59fX19fX1+f39/f3+AgIB/f39/f4CAgIB/f3+AgH9/f35+U0hKSUhHRkZFPz9BQUVBQ0dFREVMWFJNVFVWWFt8hoWHhoWGh4iIiIiIiIiIiIiIiIiIlJyMioqMfWGKi4uHbFtkVTpYWFhTUT9AVlVZXGRgVllicl1dV11aVkVRWVpbWV9UWWdSVlZYVFRWVE9PTUpMSklJTE1LT01Tb3N2eHl4d3p5ent6enx9e35/fn1+fX19fn1/f39+f4CAgH9/f3+AgICAgH9/gH+Af39+fn5WSkpJSEdFRERCQT9ITUlNUEtJS1BUU1NYWlpcXHiFhIWFhYWGh4eHiIiIiIiIiIiIiImcnaCPiY5nO36LiYqLem5wWFpcW1JTUlZWVFtadYNZVX2QYFxYXV5XSVZdXVtbX1lIWVhZW11YWFlXUlFOUFFNTU9TUVFVUmFzc3Z3d3Z4eHh6e3p8fX19f39+fX59fX1+fn9/gH9/gIB/f3+Af3+AgICAf39/gIB/gHh5fVlOS0lJSEZCREBBOlBRUVdYUFBPUVNUVFhYWVpbboGCg4WEhYaHh4eHh4iIiIiIiIiIiJaanJeIioFuhomIh4OKfmZZWVxZVFVUV1JRV1ZjloBRZXJYWldfaFBgZltbWFxnYUdPWmhnXFtcXV1XUk9TUFBRVlZWVllabnJ0d3Z2dXh4eHt7fH19fX5/fn59fn18fn9/f3+Af39/gH+AgH9/gICBgYB/gH1yfX9/b3R8XVNQT01LSkVDP0A7UFBaWltSU1FPUlJSVVNWVFdfdXiAhYSEhYaGhoaHh4eHiIiIh4eIh4ORjomJiIaFiIiGfYB7XFBVWFRSVFJRUUxPTUtmeVtdVFlVVl1aTFRaVVNUXlpYV1dXemtYW1tcXlRRUVBJTk9XVlhbWmRwcnZ2dHR2eHl5e3t8fH19fn99fX1+fX1+f39/gIB/f3+Afn56eHd2c3V7f3+AgHRrfn5rcnleW1ZVVFJPS0ZDREFNXoNsVlJTTk9RT1FVUlNSU1VjZHaAgoKDhISEhIWFhISDhoaGhoeIhn6JiYiHhoOHh4d5bXFWSUtNTktNS0hKREZIRUM+VGRVf1JRUU5LUlRRTU9ZUk1OUVNVVU1RU1JQT01MSENJSFJUVVpcbHF1dnVzc3d6ent7e317fX19fn19fX59fn9/f4B/f399fX5+f39/f4B+e3Zzd31+fmR1fWlxdF9kXV5bWVZQTElMSWFsknRQUVNOUVJRUltSU1JRUlZUYnN7fH+AgYKBgX99e3uAf4OChYaHgoaGhoGEgYaFhnVfXUtDP0NDQ0NCP0RQQkNAQz1DSUdWQEhOTEddaVBIRk9GREVGSUdIQ0RIR0hLR0RCQURATlFNUmRydHZ1c3R1enx7e3t7fHx9fHt+fX19fn5/f3+AgIB/f3x8fX+Af39/f4CBgH12dHt/bWh8Z25xZmllZGJcWFNRUFVSc1dlW09PTkxRU1FVWVNVUVFUUk9WYGtscnZ7e3h5dHJuc3RzeXh+foOAg4OCgIKAgoGCa01HP0A6Oz5AQD8/PmpRS2FFRkhJRUI/R0xOR01RVUlCRT8/PD08PT0/PT9BQ0NAPzw9Qj5KTUdVbnR0dXN0dnh6fHp9e3x9fX19fH59fXx+fn9/f4B/f39/enl3eHd2dnh7foB+fXt4dnx1YXhnbHBqbGppZmBbUVJaXFleSkpQUU5LTFFSUVRVVVdRUVdWUFhbYl1hZ21tbG9rZ2BucmptbHF1e3p9e3h6fHx4d3hlQ0BAQj06QkNBQURCXF1Pe05PTk5LTE1PT1FMS0xXTUhHQEI8OTc3NTk5PTs7Ozg5ODk/PEJIP1xzdHV2dXZ4enx8fH18fH19fX58fn19fX9/f39/fn9/f314dXZ6e3p3eXh1d3t8eXh1eXdjcWhpcG1ubW1oZl5PUF5cWklIUFJRT01QUU5RUlRWWFNSWVROWVpbV1ldXl5fZWBdXnF2a15gZ2t3b29sam9ubmxmYllIRkZIQkFHSUVFRkRNUlBhV1JXUVBTU1JVW09PUVdQTUlERj46OTY1ODc5Nzk6MzY1Nzk1PEI9ZXNzdnd3eXp7fX18fHt8fX1+fnt+fn19f39/fn5+fn9/e3d1eX18enh8fHx8dHd2d3Z1d2tuaWhxbm9vb2prYFVXXlpYTUxUVFNQUVVPTFJTVFdYVFRYUUxXWVpWWFhWWFldV1dYaHNrXVZhc2thYV9eZGFfXllUUU5OTkxJSEpLSUlGQ1FQU1tXVFROUVNZU1xlVU9TVFFOS0lIQz9BOTk4ODk3ODg1NzU3ODU5OUdtcnR4eHl7e31+fX18e318fn5+en1+fH1/f359fn59f358dHR1e3hycW9vbnR4cXJzeHZ1cWZkZ3JucHBxbm1kXV9fWVdPUFhWVlNUVk9PVFZYWFlTVVRMS1RWVVVVV1BUVVdUVVJdbl5STllfW1ZZO0RWWFRbZkpMT1JST01NTk5OTEpGUVBVWVNUT0pOT1VTVFxWUlVTUk9NTElISEY/Pzw6Nzg3NjU5OTY3Njc1V3BwdHd5ent8fX19fnx9fXx9fX15fX18fn5+fXx8fX1+fXxydnF4eHJ2dXFxbnBwb3B1dnRuamRkanBwcXJwb2ZlZGNcXVJUWlZXVVRXVFJYWFlZWVJVT0lHT1BPT01SSk9QT1BOTk9UTE1JUE9TVFUyPVhNSUBRPWNhUVNRUE5QUVBOTk1RTlRSUFJNSUxKT1JQUlJTVFFST0xMS0xMSENCQT06Ojg3NjtCNTU2Njpkb3J1eHh7fHx9fnx9fH19fX18e3h8ent9fX58e3l9fH18e3B1b3d1cHV0b3N2cHFxcHR1dmNqZ2VXaHRycnFuaWlocFZWVFVYVVdVUldWVVpZWFdVUVNGRUFGR0dIRkpESEpJR0VITEhLSUZMTVBNRy9FX1I+Mz8+am9hUlJRQEdVUVBRUFFOUU9QT0xKTExPUE5OUFFRTlBPSkxNTUtHRUVEQjs9PDw5PUc2Njc3RG1wdHZ6e3t8fX18enx8fX5+fXt5dnh3eXl8fXp6dn17fHp6b3Fud3JwdnFtcHNwb3Bzc3N0ZmdgaFpXa3JzcmxtbWtuYWVQU1RSU1RPV1ZWWVlWUVFRT0A9Oz0/QUJBQ0BCRURBQEdIR0hFRkhKTUxFR0NPUkM4RU5TXWdTUVNBR1VQT1FRUE1NTk1LTEtMTk9PUU1PT01ITExJS0tMS0dGRkVEPEFBPjtARTs8ODlTcHJ1eXt6e318fHt5fHp6fn58e3V0dXJ2dnp6eHpyfHt8eXltcW94cnF1bm5xcm9vb3Rzc3J1dGtnZ15lam1wa29xbWltY0xPT01RU0xUVVRYV1VNTEtJPDk4Nzs/QD48PUFAQj0+RUhHQ0ZGSUdKSUBGQUFARkhFSk9IUVJhXFFQUk5TTk9QTExPTUtNTE1PTltXS01RT0dJSENISkxMSkZGRkU/QkM+PEJHP0I/QWRwdHd7enp7fHt6end7d3l+fnt7cXN0cHJzd3R4eHN6e3l2d2xxb3ZxdHRsb3Fybm5vc3ZydHNycmtsZW5zaG1ubWxtbGprSUxISE9RSlFTUVRTT0tIREQ9OTc3OT9CPjs/QUBAPkFESUVDR0dJRklFQkI/Pj1DQkFHSUVNT2JlUU1OTldLS01LTE1NTUxLTk5TZE1KTFJJSUlFQUhKTE1OSkdJRkJBQkA/RUZFSERLbm92eXl5e3t6fHp3c3h1eHx8eXpucXJtbm9ycnZyc3h8eHZ2bXBtc3B1dGxwcHJvb29ydnVyVlZucWdseYRqbXFybm5qaG9ISkNHTE1JTVBNUE9ISkQ/QT05OTk6P0I/PEBCQUFERUdLRkNISUdHSENDP0I/P0BBPkRFRExNUlRMSklNVEdJSUpMSktMSUpMTU9QUVBLR0NLR0NCSkpMTU9OSUpJR0NDQ0RJSk1MSVlybXd5eHp7e3l8dnJwdXJ0eHl2eGpxbmpsbG50dG10dXtzdHhyb25xb3ZzbnBvcnBvcHN0eWpOYGdzanR8eWdvc3FpcWhkcUhLREdISEdKS0lKS0RHQj0+PTo6OjtBQj89QkJDQ0hGSUtKRElJRkdHQ0M7QUBCPkBAQkVDSU1QSEhLR0hLREhJS01ISkxISUpLSk1cUkhIRE5GQURLSk1NUE1LTUpLRkdHSk1OUU5MYm1pdnZ3e3l7en1xbWxza3B0dHR1aHBtamlra3RwbnR0eXByeXRvcnFvd3NvcXB0cnBydXR5a05WbXVscXt2aW5vaWt0Z2RvRktDRkVHRUZGR0VHQkNAPTw9OTo6OkBDQD5CQ0RFSUVJSkxGSUlHRkZEQjtCQ0M+QENDQ0VHTE5IS05IREhFSUxOTUdJTEdGR0lJTE5LSUhFTklCRk1MTk1PTU5OTUtJSElPUlFSTlJmZmZxb3N4dXt6fGxoam5la3Fsc3FmbWxoaWtsdG1wdXR3cW94dG90c3J2c3BxcnRzcnR1dXZ2WFZ1dWtvdHJrb3ZsaG1lX3BHSkRGRkVDQ0NFQERCPkA/Ojs7PTo9PkNBPkFDRUZKRklITEhHR0dGRUNAPUVFQj5CRENDRUdISUdNUEpGRkdLTk9LRkhKRkVERUlKSEtJRkhQS0NJTUxQTU9OT09OSkpITVJVVVJPV2RgYW1ncHJvcnl6Z2VoaGRpbGZxbGZsbWdpa2xzbHB2dXRwbnZyb3Nyc3V0cXNzdXRzdXZ2dnl2dXR3bGp1dW1ydnFsbmxlckxHRUVIQ0JBQkQ9QkE+QT05Oj0/Oj0+QEI+QEJER0pGSUZJSEZGR0VDQkFBRkZDQkNCREVFR0dIRkxRTElPSkpMTElHSEVGRkRDSUlIS0pHS1JNQk5PTVFPT09NTk9LS0tQVVdWVVRYX15caWFtaW5ocnNiZWZmZGloZm5pZm1taGtrbXJpcXZ1c3Ftdm5vcXJzd3Nyc3R1dnZ2dnd2d3Z2dHd1anN1bnV0c3FyamtzTUdIRkhCQkBERDxBQEBDPDg5PT45Pzw/QkBAQERGSEVIRkZIR0ZGRENFQ0RJRUNGRUJFR0VGR0dFSk1LSFFNSktISElFRkhJRkNJSklLTUtPU05EUVJQUVJOUE1OUE1MTVNXVlhYVlhdWl1kYGhiamlna19lZWZjZ2dna2dna21rbWxwcmh0dHVyc252b3FwcnR4cXNzdXZ1gpF5dnZ0eHV1d3htb3VvcnN1cXFpb3lNSEdISEJCQkZEPD9CQkQ8Nzo+Pjo+OkBCPj8/Q0VGREZERUhGREVEREVGR0pFRUpHQ0dIRkhHRUNGSkpHTUpMS0hKTEZJSUtIRUtLTE1OT1JUT0hTVVNQU09RTU5RTk1QV1pWWllWWl1aWGFgYGBfaGVjYGRmaGdqaWhpZmhubGxubXFwaXV1eHJycHVwcHBydXZwdXN1dnV7fn14dnR3dnZ2eHBsdXBtc3RucHJyeE5JSEdJQ0FDSEU8QEVCRD05Oj4+PTw8QUI8Pz5BQkZDRUNDSEVDRUVGR0dHSUZHS0hDSUhHSUdGREhLSUdLSE1LSktMSExLTUtKTkxPTk9SVVZPS1VXU1FTUVJMT1FQT1RZWllcWllcX19eYGNeXGFja2JgZGdocoVoZ2lmam1ucG9uc3JqdHV4cnNzdHJucHF2cnF1cnV1c355jn11dXZ2dnZ4cmh1cWtydGxxdm90TUlLSEpGQkVHRTxAR0NEQDo8PkA/Pj9CQTxAPkFBRkNFRURJRUZFR0VISEZISElLSUVKSEhLSEZGTElISEpHTExMTExJTUtNTU1PTFBQUVVWV09LVlZVU1NRUUxPU1JQVltbXV5bXF5fX2FgYWRdZGBlZmBlaGpjc3NmamdnbHBycW9zc25zd3dxdXZ0c21vcnVvcnNwdXJ2cnSBdnV1dXd2dXd0Z3Rya3Fya3J2bnZKS0xKTEdCRURFPEBGRERDOz8/QUBAQENBP0I/QUNIQ0ZFRklGSUZGRElIR0lISk1ISEpKSUxKRkpLSElKSkdLS01NSkpNTE5OTlBMT1BSVFhWTU5UVlRSUlFQTE5UU1JXW15eX11dYF9gYWFfYWNlYmRoYmRpamd2i2xqaWdtb3NxcHFwcHJ5dnJ1dXRzbW1zc21xcm90dXRycHN3dHV1d3Z1dXRlcXNrcHFqcnZvd0tNTEtNR0RDQUQ8P0VFRUM9QUFDQkJDREFDREFBRUdDSEdISEdKR0RHSUdISkZJTEhJSk1LTUxHS0lIS0tOUUtSUU1TTUtOTk9QUE9UT1dYWFtOU1FXXFpSV1BOVFVUVFhaX2JiX2RhXmBiXmBlYWFjaW5nYmloaG54dmxoaW1vc3JwcXJycnZ0c3Vzc3Nua3NxbXByb3R2cnFxdXZ1c3d5d3V0dWNtdGtvcGpxdG93TE5MTExHRUFARD4+REVGQ0BDQUVEREZCQ0VHQ0NJRkNJSkpJSUtHREtKR0hKSUlLSEpKTkxOTElMSEpMS1pmSmRcS2xTSE9OX25Va3NbcXBid2NTUGJ2dWh1Y2F2YFhucWJkdmluemZbbHRgbGtUX3d2aWpnaWZnbG1qbW9qbW5zcnBycnFyc3Jzc3J0cm5sdG9ucHFxdXVxcXN0dnZ1dXl3dXR0YGt0a3Bwa3FycXlMTkpKSkZDP0BCPz1ERUZEQ0RCRUVERkJGRkdERUtFRUpNTUtMTEdHTUlHSktIS0tJS0tOTE1NTExJTE1MW3NiZHBebG1VTU5mc11nZXFsbnRncGlfYVlubmJwcGJrampnb3F0ZXRub1xvdWdwTUpyeXZrYmBrZWVteGxrdm1ucHNycHJxcHFycXJycnRybW1zbm5vcHJ1dHFzc3R1dXV0d3h2dXRibXVrcHBscnJxektMSUhHRURAQkJAPkNGR0JGQ0ZFRkVEQ0hIR0RFS0hHTE1OTE1NRkpOSEpLSklMSkpKS0xNTk5NTUpNTU1bcm9vbnBwbGtNUFFsV05pYnRycGFtbnVcWWxRXG1tWnFta29teHh0c2lwXV9ya3FqVXV5eHBjXmtmYmdwcGpqb3BwcnNwcXBxcXJycXFycnRsbXJtbm5vcnV0cXRydHV1dHV1enZ1dGVudWtwb2xzcnJ5SUtHSEVFRUJCQj5AQEZHQkdESUVFRUJGSUhIRUdLSkdNTU5MTU5HTE1JTEtJSk1JSklKS09QT05NS05NTFxoZHVdbHFXbE5QUW1VWmtea2x2YWxkc1NlY05tWWxcdHBraWx4and1aHBdXnJraFdiY3d8b2NgZ2dhZGl0eWtubnFzc3BxcHFwcnFwcHBydWttcW1tbW9xc3Rxc3J0dnZzd3Z6dnV0aG91bHNvbXNydHZITUdJREVFQ0FCPUJBQkZESEdMSEVDQ0hLSEhGSkxMRk5MTFNSTEdMTEhOSkhITkhKSklITk9NTkxKTk1KWnNwcG9xcW1sT1FSbllxa2dvb3Fxb210XW5YYXRfbm9wb3Fyb251c3R0altddGN3eHJqbnpoYWFjZmJiam10dXBzdXZzcXBwcW9ydHt/fn13bGtxbmxtbnByc3F0dHN1dXR4eHl4dHVrb3VtdG9udHN2c0hLSElCRUVFQUA+RERCR0NISU1JRkNGSkxJR0ZKTUxGT0pLV1JLR0tKSk5JSEpMSUtKSUhKTU1NTUlLS0tTa2JbaV5faWNyclpfWWpvX2VlVWtfY1thYVFgbGhdalxuaWlkW3BmZHBdWlxrW21xY3BzbGRnY2RnYGBrbXBwb3R5cnVxb3BxbnmFiIeHhoWAdnNua21tb25xcnR0cnR1dXZ5eHhzdW5xdW53cXJ2dHdyR0dGSURFREZBQEJGRURHQkhKTEhGREdLTElFRkpPTElQSUxbUUpFSEhLTUlISkpKS0lISUdLS0tMR0hLS0xMTExKS01OVFtcVFBUTFBPTk9PVlFPT1FOT1FKSU5QUWRxaVRZV1xbXFVZWl1YXVxcY2ZhYWViY2ZfX2ZrbWhtdHlydHJvcHB0hoeGhoaFhYaHg3pwbW1sa3FzdHRydHZ0dXl4eHV2cXJ1b3ZydHN1dXNHQ0VHRkZBRUNAQ0hERkdDSUtMSEZER0tMSERHSVBLTE9LTFdMSUVFSElKSElLSExKSEZHR0lHSElFRkxJSktOTElQXFdeUFxbYF5NWFlTXFxiXk1ZWk1YYVJKWWFaUl9kXGFYW2RkVlZYXFlaWFxWWVxdYl5kYGFfZWhrZ210dHFxdHBxcoGGhoaFhoWFhYaGhoR9cmtpb3Jzc3N0d3l5eHl4d3h0cXhyeHNxcnVydE9CQ0VMTUJEREJFSUVHR0ZLSktIRUVKSktGRUhIUEpNTUpNU0hHRUFIRkpJS0tJTEpIRkVJRkRGR0VFSkhDSk1LTFVfWWBYYGFbYFRYWVReXlpfUllcUF5cWU5eXF5TWl5jXlpdYGNgWV9iW2BeW1RYV1leXWNiY2FjZmhla3Jwb3Bwbm93hoaFhYaCe4CFhYaGhYaFf3VxcHJyc3Z5eXp5eXh4eHdyeXZ4cnF4dnV2YVNKSk1JREJCQ0dIRUhHSEtJSUlERktLS0VGSUpOS05MSExOR0hFPkdHTElLS0pMS0lHRUlEQ0REQkZKREBKTEpPW2NZX15hX1JUUldfYFxdWV5RWVxNVl9XS1FZW1BaX2FhXV5jYWBiYmJjY2VaUVlWVVxZXWNgX19jZGJob21ubGxsbHWFf4SDeXV8hIWFhYaGhYWGhoN9d3JydHd5eXl5f359eXV5dnZybnp3dnhYUUtGQ0dFQkVISUZHSEhGRkpHSEZIS0lMRERLSk1NTExISkpISkY/R0ZOSktLTUtLS0lHR0NEQERBSElCP0lKSFBdYVpbZF1fVFFSWF1cXFxfWktXXExSXFlJTV5RT1xfYWNjY2NiXGRjYmRjZlhRVVRSW1daYF9eXmFhX2Rsa21qamxudn51gXp8hIWFhYWFhYaGhYaFhoaGgnpyc3V1e4WHh4eGhYSBfnhwend2eFxSTUNASUZDRktKRkZGSEdGSUZGRklMSk5GREtKTE5KTElLSkhJRkJISFFNS0tPTUtLSUhHRUQ/RUNISEFBR0dFVF1ZXlhfWV9bXVVYWFBdXVFLSlZeWF5bXVVZYFJRX19iYmBgYmJgY2JhZGRiWE9RUVFaUltdXV1dXl9fZGhnbGpubnB7e3x+e4CCg4SFhYWFhYWEhIWDhISHh4FzcneFh4eHh4eHh4eHh4WDgHx4XFNLQ0FHRkRHTVJIQ1FKRkhISEVGS0pNUEVGSUpLTkxMSUxMSUlHREhLUU9NTVBMTUtLSElDREFFREhHQkFHRURXVUVcVV5TVl9YTlRVTlpaTUpLVGBhW19YXl5hXU9ZYlxgYF9iY2JdYWJXX19UUE5PT1dRXVtbXFxeYGJmZmVsZm9vd3x7gHt9f4CEhISEhIWFhYODhYKDgoWFhnpvgYaGhoeHiIeGhoaFhYSFg35JTkZERUZHRElSYlBDVl5JR0dIREZNSlBQRUlJS0tOTExMTUtKSkdFSk1RUU5PUE1OTE5IS0FEQUNERkRDQkVGQk1IQktMUE9OTEZNRkdJSkhHTEtNT1BJTE9QT1NPTFFTUlVaWVdZWFhkV09TVFBQTk1PVFNbWFhaXVxgYWRlY2dja2xwc3J6eX97en+EhISEhISEhIKEgH57gYOBfXuFhIaGh4eHhYWFhISEgoGAfUtJRUVHRkdES01dTEdHWExHSEpIR01MUVFJTEtMS05NVU5PS0tMR0dLUFNTTlBPTk9OT0hLRmBFRF9MRGZkRU1bSV5bcm1PTVVtWUxDUGBVa1dnSl1YVV5ETVFVTExTVlFSVFhXVFhVVFxVUGZaaGhkWFJqU1dWVFtcW2BgYWFhYmBmaGZua2hyenx9foGEhISEg4ODgX18enJ7gXp7f4KAg4SEhYWBhIWBg4N/fnp7TEhFR0ZIRUVLT1NJSkZgU0hKT0pJT01SUUtNTExPUlVST09KTE5HSE1RW1lPUFBOT1BPSUpRf1FJfFlZcXNYUG1IcW5vYVZQcXFzUEJrc21xc3BTb19bblhdVlxYVWtoVV1WY1pgWVtgVlZYf2p0dXVfX3ZfWGFbXGZbX2FhYWFeYGJnbXBsYHB3dHiBgYKDg4J/fX6Adnh6bHZ+dHh+gHx+gIGChHyAg3p/gX9+d3dOSUVITU5CRExMRklLRVFWTEtOSUtSWFdRTk9PTVFUTk9RUEtLTkdNUFNbWlRRUk9QUFBKSFp4XVR4ZWhaUlRRdmd0bHBibmZqUXJPTXdtanJwc3JxcnBvb4BdZXp1eHFxenF+c31rdX1iUmh8ZXNzb3Nye3xvfXlvf3JfYGBiYVpgYGdrbmtibGZnbXd+gYCDfnt4d4B0dnppcn5udHx+d3h7foCDeHyAdXx/fHxzc05LRmBdR0FFTU1ISkpHSlBPTU1KTlZeWVVMUVNOWFpNU1NSTktPSVFSVFlXV1FUUFBQUUtIZ3hsY3hybVtLTVV5cHVtdWJudlBkZUpmdnFtd2+AamZ4eGlXclFoem1panp6fWx4en9vaG9ZdnZqdXVwgWByZ3xpbHh8b15fX2JhW11iZGdpaWRnYmNkbGxwcHN0c3NzeXFyeGJsdWdyeXtzc3V5foFzdXpufH15d3JuTktTdE5DQ0ZQUEhKS0pLUE9PT01QWmBaWEtUV1BhXlJWUVlSTE9JU1RVWFdXUFVQT05SSktyb3V1cXVxZGliV25McXBeRmh5V3ZUTGl5fXhgeXtzbmFdbW9jUmhxdW5teXB3bHZ0dHJsbl10fnprbXl8a3RsfGtwdnV4Xl9fYl5dX2RkaWdoZmVeYWJpaWlqa25va3FubWpwYWNmZG93eG9tcHN5fm5xcGp7enRyb21MTFtWSEdFR1JQSUxNSktQUVBQUFFXXFhVTVVZVWZYUlJZXlNMTklUVFZXWVdPU05OTlFIUm1IaXdLYGR2dlZYbE9ubHtzYWpnf3ZVTFdraH1sbWx4X1twenteYHpzY3JveHFoZHxpcnxeVExsYHZ1a2l1fHttfnhrfHBdXl9iW19iZGRnZWVlYlpjY2lra3JzcndnbGloZGdgYWthZ3NybGdtbXJ8a21oa3t0bW1rbU9ISktISUhIUlBMTk9MS1JSUk9TUldSVlRQV1tWVlRUVGFgUE5NS1RTU1FVVk5OTE1PUEpIUU5QVUxLS1NUU1JUUFZVUVFOUVFYWVJOUFVUWFhYW1pVUlNXW1dYV1pPU1VXWFhSXVlXXlZUUFlSVldXV1heW2dyXltbWVxdX2NaX2NjZGZkY2NiWmNjZmZlbW5tdWVlZ2NhZl9dZ2BkbGhmZ2tocHpoZ2drdWpoZ2lsUUlLTExNS0pTUU1RUE9MVlVUUFRVWFVZVVFaXVZVVFdVWVhQT0xNVlRQTlVTTk9NTFFQS0pSUUtRTUtLT1JVUlFRU1NJSExOT1FSUVFRVFZSWFdcV1NTUFFVVVZTWlFPU1JYVlRZVlRZVVRSVVRUVVdYV11aXmFdXFpaXFxgY1tdYmNkZmRlZGFZYGFjYWJoaGltY2FkXl9jXVpkXGJtYV5mZWZtc2RpaGtrZWRjZmhQSktMT09MTVNQTlNRUU1YV1VUVVdXV1pVU1xgVldWWVVYU1FQS09XU1BOVVBOUU5LU1BMT1VTTlJOTU5RVFBUUVNUVU5LTU9RVFRSUlFWV1RZWltZU1VSVFdXV1lbVE9UVVhVVVpVV1lVUlJYVlVXW1laYF1VWF5cXl1cXWFhXltiYmNnZmVkYlhfYWJeYGhlZmVhXl9dXV5aWl9aX2dgXl1dYmhrYWdmaGZkYGJjYVBLTUxQUUxPVE9PU1FPUVtaWFdYWlpYWVZcamRWWFlaV1ZTVE9KTlZUUE9UUFBQTk1RUVBSWFRRUU9NT1NWTldSVFVVT05NUVNVVVRUUlRXVlpdXFpWV1FSV1hWW1tXUVRWVlZWWVRYWFVSUlhWVlpdWV1fXlZeXV5gXFxgX19fWmJiZGhnZGRiWWJgYl5eZmNjYGJdXFxcXFlaW1hbYVteXVxfYl9fYmRlYmRfX2BcUE1OTlJRTVJST1NUUVBVXFpaV1tbXFlaW2RxbWhkXltZVlVXUUxNVlNNTlJPUVJPTFBTUlVaVVNQUExQV1dSV1NTU1hNT1BSVFhWVVVTVVlYW15dW1tWUk9VVlZbW1dSVFdWV1hWVFhbVFNSWldXXF5aXl9gVWFcYWFeYGJfXWBdY2BjZ2hkZmBaY2BhX19lZF9gY1taXFtcWVpYWVdcWVxbYF5fW15eYWBeYlxZYFpRTk9OVlFQVFJPVVRTUFdcXVxYXlxfV1xeanF3eYBiXFtWVlhRTU9WU05RUVBSVFJLUVRUWVpXVU9STlNYV1RTVVJSWk9QU1NWW1ZWV1RWWlhdXltbXlZTTlRVVlxcVlJUVlZYWVNUWVxVU1NdWFpdXlxgYGBWYltjYl5hY19cYmFiX2NmaWRmXltkYGFgYWNkX2JfWVpeW1xbWVhZV1daWlphXF1bXVxcWl1gV1tbWlBPT09ZUFVVUlFXUlRQW11eXltgXGBVXF1panJ9c2xnXFVYV1BOUlpTUlFUUlRVVEtRV1ZbWlpTT1NSVlZWVE9XUlNaUlRUVFhdV1hYU1hcWF5dWVpdVFVOVldXXltYUlVVWVlZVVdZXFZUV15ZXV1gXWJiXllfW2ViX2RkXl5jY2FeZWZpZGZeXmRhYGFiYmRgYl5YWl9bXFtYWFhYV1taXGBcW1tcW1haW15WXlldUE9PUlpQWlRVVlZUVFReXmBfXmJcYFVdXmJreXRsfWxaVVlVUVBTXFRVVFVUVllXTFJaV11bXVJPVVNYV1ZUUFhSU1dTVlVVW11YW1lVWl5YX15ZXFlSV1JZWFlfWlpUVVZaWVpXWFpcVlVaXlxeYGFfZGNcXl1dZWFhZmReXmRjYFxnZGhlZGJfZGFgYWBiYl9gXldYXlpcXFpZWVdWXVpdXlpZW1xbV1lcXVZYV11TT1BXWVFdVVZZV1dVWF9fYWFgY11gVF1fYmVldYF6aFhZWVNWU1ZcWFdXVlZXXVhPVV1aXl1dVFJXU1dWVVNUWFJTVlRYWFhdXlhdW1ZdX1hfX1hdVlFZVFlaWmFZXFZXWFtaW1lZWltYVl1fYF5jYmJlZFxiXGBmYWRmZF9gZGJiW2ZjaGVjZmFmX2BhYWFhYF9eVlVdWVtcW1lbWVldW1tbWFhZW1laWl1fXVRZXVVOVFpWU1xUVldZVlZcYGFiY2FjX19WW2BkYV96dW9oWVxaVVhUV1taWVxZWFlgV1BWXlxgYVxUVFhQVVdWVFZXUlNVV1paXF9eWl9cVl9fWV5eWV5WU1lXWVpdYlpeVldbXFtcW1taW1lZX19gYGRiY2RlYmRaYmZjZ2ZlXmFiYGNeYmNpZGNnX2deYmJjYWFgXl9YVFtaWltbWFtYWFxbWltXV1lYV1xbXGBdVl1dU1BWWlZWWlVYVVhXWF1fYmFkYWRgXllZYWRiYGxmaF5cXVtWV1hZXFxcX1tZW2JWVFheXWFjXFJWWVBXVldXV1ZUVlRYXFxeYGBdYFxXYV5bXlxbXlhWWFhbW19gXF9YWV1cXV5eXFtdWFtgYV5gZGNkZWVmYlljZWVoZ2ReY2FgZWNdZWlkZWlfZl5jYmNhYWBfX1tYWVtZWlpYWVhXW1taW1dYWlRZXVxaYFxVXmJOU1dZVldaWFtcWFdZXmBiYWVhZGFdXllhY2JfYWBgXlxcXFdXW1tdXV9fXFpdY1haWF1gY2RfUlhZUFdXWFlZV1ZXVl1dXmBhYV9iXllhXV1eWV1eWVhWV1tcYF5dX1paXl1eXmFcW1taXGBiXmJkY2VmZWZiWmRmZmlnY19jX2FmZVppaWNmaWNlXmJiY2FgYF9dXVpXW1lZWFhaWFdaW1pZV1hWVVtdXV1gYGJieExYV1xZV1xbXF1aV1xdX2BiZGJiYV1gWGJjYmFjYWJdW1xbWFdbXF9dYF9dW2BkXFxYWmJlY2FSXFpPWFhaW1taV1pZYF1gYmJgYWNfXGJdX11bXl5ZWVVYXV5fYF9gXFteXmBiY1xcWFxeYGJiY2VkZmRlZmRcZWZnaWZjYWJcZGdgXGlpYmhpZmVgYmFjYV9gX11dW1lcWVhXWFlYV1xbWldXWE9YWl1hY2Zmcmt/SllXXVpaX1xbXlxYXVteX2FjYmFhXWJbYmRiYGJiYlxbW1pXWGlxYFxgX11cYWNfXllZY2VkYVNfWlJZWFxdXVtaW1tjYGJiY2BiZGFgY15gXF1eX1pYVltfXl1hYWBeW2BhYmViX11UXWBgY2RkZmVnZWZmZV5lZmhoZ2RkYFtlZ15haGhiaGhmY2BiYGNiX19fXV1cWltZWFhYVlpWXFpaVlZVTVhXXGdpa2h1eIF2dnZ2dnZ2dnZ2dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6e3p6ent7e3t7e3t7e3t7e3t7e3x7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHt7e3t8fHx8fHx8fHx8e3t7fHx8fHx7e3t7e3t7fYmIhoqHhYKBgoOCg4OCgoKCgoKCgoKCgoGAgYCBgICAgYCBgYGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t6e3t7e3t7fHx8fHx8fHx8fHx7e3t7e3t7e3t7e3x7e3t7e3t7fHx8fHt7e3t7e3t8iYmHiYaFgoGCgoGCgoKCgYKCgoKCgoKBgYGAgICAgICAgIGBgYB9fHx8e3x8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eHh5eXl5eXl5eXl5eXt7e3t7e3t7e3t7e3t7e3t7fHt7e3t6enp6ent7fHx8fHx8fHx8fHx7e3t7e3t7fHx8e3t7e3t7e3t7fHx8fHx7fHt7e3uHiYiJhYSDgYKCgoODgoKCgoKCgoKCgYGBgICAgICAgICAgYKBgH58fHx8fHx8fHx8fHx8fHx2dnV2dnZ2dXZ2d3d3d3d3d3d3d3d3d3h4eHh4eHh4eHh4eHh4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3x8fHx8fHx8fHx7e3t7e3p6enp6e3t8fHx8fHx8fHx8fHx8fHx8e3x8fHx8e3t7e3t7e3x8fHx8fHt7e3t7e4aJiYiFhYOBgoKCgoOCgYKCgoKCgoKBgYGAgICAgICAgIGBgYCAfnx8fHx8fHx8fHx9fX18fHaIi4uLi4uLgX19fX19fYSMi4uLi454KSkqKiopKz0/Pj4+Pj5tgH5+f397pdfT09PT1r2GiYmJiYqCRT4/Pz8/PXWNiYmJiYaz1tLS0tLWun1+f39/f359fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx8fHx8fHt7e3t7hIuHh4aHgoGDg4GCgoKCgoKCgoKCgoGBgYCAgICAgICAgYCBgIB+fHx8fHx8fHx9fXx8fH19doyQj4+Pj5CDfn9/f39+hpCPj4+Pk3kZGhoaGhocMTMzMzMzMmqCf4CAgHut6eTk5OToyomMjIyMjYM6MjMzMzMwc5CMjIyMiL/p5eXl5enHfX5/f39/f319fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e3uCjYeIh4eDgoSCgYKCgoKCgoOCgoKCgYGBgICAgICAgICAgICAgH58fHx8fHx8fXx8fH19fX12eHh4eHh3eHd3d3d3d3d4eXl5enl5d29wcHBwcHBycnJycnJyd3p5eXp6en6Dg4ODg4SBfHx8fHx8fHZ1dXV1dXV6fX19fHx7gYSEhISEhYJ8fX19fX19fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e4CMhomHh4SDhIKCgoKDgYKCg4KCgoGBgYGBgYCAf4CAgICAgICAfnx8fHx8fHx8fX19fX19fXZ2dnV1dXl2dnZ6e3h7eHd2d3p3eXp6fnx5eXh4eHh5eXl5enp5eXl5enp6eXh4eXl5eXl7e3t7e3t7fHx8fHx8fHt7e3t7e3t6enp6enp6e3x8fHx9fX19fX19fX18fH19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8f4uHi4qIhIODgoKCg4KBgoKDgoKCgYGBgYGAgIGAf4CAgH+AgYF+fX18fHx8fHx9fX19fX19d3d3dnZ3fXh3d316eH14d3d4fXl9enl8e3h3d3d3eHh4eHh5eXl5eXp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fHx8fHx8fHx7e3x8fHx8fHx8fHx+iomMjImFg4SEgoKDgoGCgoKCgoKBgYGBgYCAgICAgICAf4CAgH19fXx8fH19fX19fX19fX13d3d3d3p9eHt4fHx3e3h3d3d8en59eXt6eHh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fX19fXx9fX19fX19fX19fX19fHx8fHx8fHt7fHx8fHx8fHx8fH2Kio2NioWDg4SCgoKCgYGCgoKBgoGBgYKBgIGBgICAgIB/gIGAfXx9fX18fX19fX19fX19fXd3d3d3fX55d3d4e3p7eHd3d3x6fHx6fHl4eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt8fHx8fHx8fHx8fHx8fH19fX18fH18fH18fHx8fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8foqJjo2JhISEg4KCgoKBgYKBgoKCgYGBgoGAgYKAgICAgH+BgIB8fH19fX18fX19fX19fn5+d3d3d3d5fHl7eHx9eXt5enp4fHl8fXp8eHh4eHh4eHh4eXl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt7fHx7fHx8fHx8fHx8fXx8fX19fX19fXx8fHx8fHx8fXx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx/iIeNioeFhoaDg4ODgoGBgoGCgoGBgYGCgYCAgoF/gICAf4CAgHx8fX19fX19fX19fX5+fn53d3d3d3Z4eHl3eXp4enh5eXh5eHp7eXl4eHh5eXh4eHh5eXl5enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX18fH18fH19fX19fH19fX19fHx8fHx8fHx8fHx8fX+HiIyIhoeHhIKDhISCgYKBgYKCgoGBgYKBgIGBgYGAgIB/gIGAfHx9fX19fX19fX1+fn5+fnd3d3d3d3d3d3d3eHh4eHh4eHh4eHh5eXl5eXl5eXl5eXl6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fHx8fX19fHx8gIeIi4eHiYaDg4SDg4KBgYGCgoGBgYKCgYGBgIGBgYCAgICBgX97fH19fX19fX19fn5+fn5+d3d3d3d3d3d4eHd4dnl5eHh4eHh5eXl5eXl5eXl5eXl5enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fH19fXx9fXyBhoqKiYmIhIOFhISCgoGBgYGCgYGCgoGBgYCAgYGAgIGAgIGBf3x8fX19fX1+fn5+fn5+f394eHd4eHh4eHZxZGpeam15eXl4eHl5eXl5eXl5enp6enp6enp6enp7e3t8e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIGFiYqJioeEhYWEg4KCgYGBgoKBgYKBgYGBgYCBgYCAgYCBgIF+fH1+fn5+fn5+fn5+fn9/f3h4eHh4eHh5bWRiZV9fXm95eXl5eXl5eXl5eXp6enp6enp6enp6e3t7e3t7fHx8fHx8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goWKiomJhISGhYSDg4KBgYKCgoGBgoGBgYKBgIGBgICAgICBgH58fX5+fn5+fn5+fn9/f39/eHh4eHh4eW5kZWdlZGJeZnh5eXl5enp6enp6enp6enp6enp6e3t7e3t7e3x8fHx8fHt8fHt7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChouJiIqEhYaEg4OEgoGBgYGCgYKCgYGBgYCAgYGBgIB/gIGBf3x8fn5+fn5+fn9/f39/f394eHh4eHl3Z2VkZWZkZWFfaXl6enp6enp6enp6enp6ent7e3t7e3t7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHt8fHx8fHx8fHx9fX19fX19fX19fX19fXx9fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4eJh4SEhoSDg4WBgYGBgYKCgYGBgYKBgICAgYGAgYCAgYF+fHx/f35/f39/f39/f39/gHl5eXl5eWtlYWJlZWFlZV5ieHdze3p6enp6enp6enp6e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fH18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19g4aLhoiFhYaEgoOEhIKBgYGBgoKBgYKBgYGAgYGBgYGAgIGBgn98fH9/f39/f39/f3+AgICAeXl5eXl0Y2NlZGNmY2doZGZsZF5ze3p6enp6enp6enp6ent7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn6DhouGhoaGhYODg4SDgYGBgYGCgoGBgYKBgYCAgYGBgYCAgYGBfnx8f39/f39/gICAgICAgIB5eXl6d2RhY2diYmRdW2VfYV1eYGFoeHp6enp6enp6enp6e3t7e3t7fHx8e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+foSFi4eGhoaGhIODg4KBgYGBgoKCgYKBgoGAgIGBgYGAgYGBgYF+fX1/gH+AgICAgICAgICAgHl5eW9vYmJiZF5jZ19dYWFgXF9kYlttfHp6enp6enp6enp7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7fHx7e3x7fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5/hIiLhoSHhoaEhIODgoGBgYGCgYGBgYKCgYCAgYGBgYGBgYGBgX5+fYCAgICAgICAgICAgICBeXpwXWJlZGJkXmZnZ2BZYmJhY2VfXF1ze3t6enp7e3t7e3t8fHx8fHx8fHt7e3t7e3t7e3t7e3t7fHx8fHx8e3x8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fn19fn5+fn5+fn5+fn5+foCFjIqEhYaGhYODg4SCgYGBgYKBgYGBgoKCgYCBgYGCgICAgIGBf35+gICAgICAgICAgIGBgYF5emxiZGdjYmdmYWBgZGFiZWRjZGNeXGJ1fHt7e3t7e3t7e3x8fHx7e3x8fHx7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/gYeMiYWGhoeFg4SDgoGBgYGBgYKBgoKCg4KBgIGBgYKBgYGCgoF/f36AgICAgICAgIGBgYGBgXp7dGdnZmZkZGZmYF5fYWNlaGRlXmJkYHR8e3t7e3t7fHx8fHx8fHx8fHt7fHt8fHt7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f3+CiYqIhoaIhoWDhIOCgYGBgYGBgoGBgoKCgoGAgYGBgoKBgYKCgX9/f4GBgYGAgYGBgYGBgYGBenptaGNjZ2ZnZWdmZmdiZWRlYmdbYmVgdnx8e3t8fHx8fHx8fHx8e3t8fHx8e3x8fHt7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f39/f4SJioiGiYeFhYSEg4KBgYGBgYGCgYKCgYGBgYGBgYKBgoGBgICBgH9/gYGBgYGBgYGBgYGBgYF7emlpZGNqZmFgZmVjY2NnaWRjYmBiZGJ0fXx8fHx8fHt8fHx8fHx8e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f39+fn9/f39/f39/f3+AhIqMiIeJhoSFhYOCgYGBgYGBgYKBgoGBgYGBgYGBgoKBgYGBgYGAgH+BgYGBgYGBgYGBgYGBgXZzZWRnY2RmZWJlZmdkZmhmZWNgYGNkYHF9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fXx8fX18fHx9fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/fn5+f35+f39/f39/f3+AgICFioyJiIqJhoaDgoKCgYGBgYGBgoGBgoGBgYGBgIGBgYGBgYGCgX+Af35/foCCgoKCgoKCgoKCc3NnZWRkZWlqaGZnZ2NhZmZlZmdmZWVjdX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fH19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gICAgICAgIWLioqJioeHhoSCgoGBgYGBgYKCgYKBgYGBgIGBgoKBgYGBgYGAf4B+dHRzdX1/goCAfn5/gYB0cmdkZWNmaWppZWNlY2BmZGRnZ2JiZWFwfXx8fHx8fHx8fHx8fHx8fHx9fX18fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f39/f39/f4CAgICAgIB/houLiouLh4eHhIOCgYGBgYGBgYKBgoKBgYGBgYKCgYCBgYGBgoCAgH5zc3NzdHV4dXV0dHV2dXVwZmNmZWhoaWdoZ2VmZWJfZGVmY2BiZ3d8fHx8fX19fX18fHx8fH19fX19fX19fXx9fXx8fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gIB/f3+AgICAgICAgICHjIyIi4qHh4eEhIKBgYGBgYGBgoGCgoGBgICBgoGBgYKBgoKCgYCAfnNzc3Nzc3NzdHR0dHNzdW9jY2FnZWhoZ2pmZGVnZmhmY2JlYl5ieX18e3t8fX19fX18fHx9fX19fX19e3x9fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn9/fn5+fn5+fn5/f39/f4CAgH9/gICBgICAgICAgYCAf4CAgYGAgIeLi4iNiYiJhoSFgYGBgYGBgYKCgYKCgYGBgIGCgoGBgYKBgoKBgIB+dHNzc3Nzc3Nzc3Nzc3N1cmdlZWRlamhoZ2ZpaGdjZWViZGNoZGd7eHVzc3R2dnl4dnR0dHZ3d3d2dHR0dXV4d3h4d3d6e3x9fXx9fn5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f35/f39/gH9+fHt7fX58eXl2dnZ5fHx6end2d3l7fXt4hIyMioyHh4iEhYSBgYGBgYGBgoGBgoGBgYGAgYKCgYGBgoGBgoGAgH51c3Nzc3Nzc3Nzc3Nzc3VzaGVnaGVrbGhqZ2lqZ2dnZmRkYmVkbnV0dHNzdHNzc3Nzc3Nzc3Nzc3NzdHNzc3Nzc3Nzc3N0dHV1c3V3eHl7fn59fn98f39/f39/f39/f314fH5+fXx4dXZ3eXd4dnRzc3N0dXRzc3Nzc3NzdHNzc3R0c3R0dHODjI2KiYeIhoOGg4GBgYGBgYGBgYGCgYGAgYGDgoKBgYCBgYGBgICAf3VzdHRzc3Nzc3Nyc3NzdnZpY2hqaGpsZWZpbGhgZmVkY2BkZGZ0dXV1dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHRzdHRzc3Nzc3R2dnV1d3V4fH9+fX9+fHp4dXN0dXV1dHNzc3Nzc3N0dHR0dHR0dHR1dXR0dHV1dHR1dXR1dXV1dIaMjYuIhoeEhIWCgYGBgYGBgYGCgoGAgYCBgYKCgoGBgIGBgYGAgIB/dnNzc3Nzc3Nzc3Nzc3N2dnNnZ2pmaGdmaGhmZGlnY2NnZWVmcHZ1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dHR1dHR0dHR0dHRzdHR0dnV1d3Z0c3R0dHR0dHR0dXV1dXV0dXV1dXV1dXV0dHNzc3N0dHNzdHR0dHR1dXR1iY6MjIqHh4SEhYKBgYGBgYGBgYKCgoGBgICAgoKCgoGBgYGBgYCAgH93c3Nzc3NycnJyc3NzcnZ2dW5kXWNnZWlraGVoZ2dqamlnZXB2dXV1dXV0dHRzdHR0dHR0dHV1dXV1dXV0dHV1dHR1dXV1dXV1dXV1dXR0dHV1dXV1dXV0dHV0dHV1dXV1dXV1dXV1dXV1dXV1dXV0dHNzc3Nzc3N0dHNzc3Nzc3R0dHR0dHWKjoyMiYaGhIeFgoGBgYGBgYGBgoKBgYGAgYGCgYKBgYGBgYKBgYCAf3hzc3Nzc3JycnJyc3NzdnZ3d2liaGhnamtpaGZkZGVmaWhwdXR0dHRzc3JxcnJ0dXV0dHR0dHR0c3NycXFxcXNzdHR0dHR0dHR0dHV0cnJyc3R0dHR0dXV1dXV1dXR0dXR0dHR0dHR0dHR0dHR0c3Nzc3Nzc3Nzc3Nzc3N0dHN0dHR0dHR0dYuOjImGhYWFh4SCgYGBgYGBgYGBgoKCgYGAgIKCgoGBgYGBgYGBgIB/eXNzc3NycXJycnJzc3N3d3d3bGpoZGhpa3Z6a2VmZWhnbXJzdHN0c3JwcHBxcnN1dXR0c3Nzc3JycXBvb29vcHFzc3NycnJyc3R0dHNxcHFyc3R0dHR0dHRzc3Rzc3NzdHR0dHRzdHR0dHR0dHRzdHR0c3NycnFxcnJzc3Nyc3NzdHR0dHN2jZCMh4eFhYSEgoGCgoGBgYGBgYGCgoKBgYGAgYGCgoGBgoKBgYGAf395c3NycnFxcnJycnNzc3d3d3dzc2pnaWloeX99cW51bG5wcXJycnFxcG9wcXFxc3R0c3RycXBwcG9ubm1ubW5ubnBxcnJycnJycnJzcXBvb3BxcnJzc3JxcnJycnJycnJycnJzc3Jzc3Nzc3Nzc3Nzc3Jxb29ubm9vcXJzc3Jyc3NycnNzcnaPj4uHhoWFhYOCgoKBgYGBgYGBgYGBgoGBgYGCgoKBgoGCgYGCgX9/f3hxcHBwcXFycnJyc3Nzd3d2dnd2cnF0c252f352c3hwcHBycnJycXFwcHFxcXJzc3Rzc3FwdXdvb25ubm5ub25vcHBxcXFxcXBwcXJwb25vcHFxcXFxcHBxcXFxcXJycnJycnJycnFxcnFxcnJycnFwb29ubm1ubW5vcXJycnJycnJyc3JxeI+OjYaDg4aEgoOCgoGCgYGBgYKBgYGCgYGBgYKCgoKCgoKBgYKBf4B/d29wb3BxcnJyc3Nzc3J2dnZ2dnZ3dnZ1c3l/fnd3d29wcXFxcXFxcHBwcXJycnNyc3NycW+Qg25wb29vb29vb29wb3Bvb29vcHBxb29vcHBwcHBvcG9wcHFycXFxcnJycnFxcXFxcXFxcHBwcHBxb29ubm5tbW5tbm9wcXFxcXFxcXFxcXB7j42NhoODhYOCgoKCgYKBgYGBgoGCgYGCgoGCg4KBg4KBgYGAgYF/f392bm9wcHBxcXFxcXBwcHZ2dnZ2dXR0c3NxfYB9fX9zb3BxcXFwcHBwcXFwcXFxdox1cnJvfaB7bnBwb29wcG9vb29vb29vb3BxcXBub3Bwb29wb29wcnJycnFxcXBxcnFwcXFxcHBwcHBwcHBwb29ubm1ubm5ubm9ub3BwcHFxcXFxcXFxcIKRjoqEhIOFhIOCgoGBgoKBgYKBgYGBgYGCgoKCgoKCgYGBgYCBgX9/gHVvb29wcXFxcXBwcHBwdnZ2dXRzcnJycnGAgoCBeXBwcHBvcHBwcHFxcXFwcXFynZVxcXGVontvcHBwb3BxcHBvb29wb29vcXFwcG9wcG9vb25vcHFxcHBwb3Bvb3BwcHBwcHBwcHBvb29vb29vbm5tbW1ubm5ub25vb3BvcHBwcHBwcHBwiZCMiISDhIaDg4KCgYGCgoKCgYGBgYCAgYGBgoKBgYGBgYGBgIGBgH+AdG5vb3BxcXFwcG9vcG92dnVzcnFxcXFxcICDg39ycHBwcHBwcHBwcHFxcHBxcm+Pr4lveaKiem9wcHFwcHBwcHBwcHBvcHBxcXBwcHFxb29vbm9wcHBvb29vcHBvb3BwcHBwcHBwcHBvb29vbm5ubm5ubW5ubm1ubm9wcG9vb29vb3BzcXWPj4uJg4KFh4ODgoKBgoGCgoKBgYKBgYGBgYGBgYGBgYCAgYGAgYGAf4B0b29vbm9vb29vb29vb3Z1dHNxcXFxcXJygIKCgXRxcXFxcXFxcXFxcXFxcXFycIiypnaKrKR7cHFxcXFwcHBwcHFxcXBxcHBwcXBwcHBwcHBwcHBwcHBwcHFxcXBxcHBwcHFwcHFxcHFxcXFxcXJxcnFwcnRycnR0dHR1dnRzdHR0dXd3gpCPi4iDgoaHhISCg4GBgYKCgoGBgoGBgYKBgYGBgYGAgICBgYCBgYB/gHVvb29vb29vb25vb29vdXRzcnJycnJycnKDg4OCdnFycnFxcXJxcnJxcXJycnJwjbOopKaxqHZxcXFycXFxcXFxcXFxcXFwcXFxcXFxcnNzcnJyc3V1dHR0dHR0dHV2d3d3d3d3eHh4eHd3eHh4d3Z3dnV2dnZ2d3h6e3x7e3t6enp6enyGkI2LiIODiIeHhYODgoGCgYKBgYGBgYKCgoGBgYGAgYCAgYGAgIGBgH+Ad3FxcXFxcG5ucG9wcG92dHV1c3Nzc3NzdYiDgoN5cnNzcnJyc3Jyc3Nzc3Nzc3ahoaO0ppukfHNzc3Nyc3N0dHV1dXV1dHV3eHd3d3d4eHh3eHh4eXl5eXl4eHl5eXp6e3t7e3t6enp5eXh3d3d1dnV2dnd5enp7fn5+fX1+fn5/f35+gIyQi4qHg4WIi4iEg4SDgYGCgYGBgoGBgoKCgoKAgYGBgYCBgYGAgIGAf4B8enp5eXx5eHh2dXZ2dHl2d3h3d3Z3dnZ6fnx+fnx2dnd3dnV4enh4eHh4d3h4gqefnKefo6OSenl6eXh4eXl6enl5eXh4enp5eXh4eHh3dnd3eHh3eHh5eXp7e3p8fH1+fX9/f359e3t7e3p5enl5e3t/foB/fn5/fn19fX5+f35+fn6AjpCNioeEhoqLiIaGhIOBgoKBgYGCgYGCgoKCgoCBgoKBgYGCgYCBgIF/f4B/fn19fX9/f318e3t7eXh4eHh5eXl4eXh5eXl4enp6enp6e3t7fH1+fXx8fHyLoY6PmJqZm5V7e3l4eXh4ent6enp5eXp8fHt6enx8fHp6ent9fHx+fn+AgoGAgYKAgH9/gYGBgIB/f35+fn5/fX1+f4CAf35+f39+fn9/f39/gH+Af4OQjoyHhoWIi4yIh4aFg4GCgYGBgYKBgoKCgoKBgYKDgoGBgYGBgIGBgIB/goOCgoGBgX99f39/f4F6enh4d3h4eHh5eHh5enp5e358enx9fXt8fX19fX59f4inp6OdoJqTmIF/f319fYCDgoCAf318fXx9fXt9fXx8fH19fX1+gYGChISDgoB/gYGBgH9/f4B/f39/f39+fn9/f39/f35+f3+Af39/gICAf4CAgICAhJCPi4eGhoiLi4mKhYaDgoKCgYGBgoGCgYKBgYGBgoOCgYCAgYGAgIGBgH+ChIKCgICAgH9+fn+AgH9/fn18fX19fYB/fX+Af35/gH9/fn9/gICBgICBgYGAjbKnqaKgoaumhH6AgH5/f39+f4B/fn5+f39/gYB/f4CBgYCAgYOEgoGCgoGCgH+AgYCBgYGAgH+BgICAf39/gICAgYGBgIGBgYCAgICBgoGBgYCAgYGFjo6MiYaHiYyLi4qGhoOCgoKBgYGCgoOCgoKBgIGBgYKCgICBgYCAgYGAf4KFg4KBgYCAf39+fn+AfX5+fn19fX5/fn9/f35+fn+AgYCAgICAfn9/f4CAf4qprp+po6ChpamkjH58foB/fn5/f35/gIGBgoKDg4KCg4KBgYKDg4OCgYGBgYKBgoKCgYKBgoGBgYGBgoKCgYGCgYKCgoGBgoKBgYKCgoKCgYGBgoKCgoaPkY+KiImKjY6NiYaFgoKCgoKBgYKCg4KCgoGBgYGBgYF/gIGBgYCBgIF/gYWEg4KCgoGCgYCAgIB8fHx7fH18fH9+fn9+fn5+f35+f39/f39/gH5/gYiVqq+knKShoKGhoamroI2BgIB/gIF/f39/f3+BgYGCgoCAgYKDg4SDg4ODgoKCgoKCgoKCgoKCgoGCgoKDg4OCg4ODgoKCgYKCgoODg4ODgoKCgoODg4KCh5KTkIuKi4uPj42Lh4SCgoKCgYGBgoKDgoKBgYGBgIGBgICAgYGBgIGAgYCAg4SDg4OEg4ODgoKCgXx9fHx9gn1+f4GCiIGCgoSCgYGDg4GBgYKDg4aMm6ajnZyan5OYoaCenZ6hoJSFgYCAgICAgH9/f3+AgICAgH9/gYODhYSEg4SDgoKCg4OCgoOCgoODg4ODg4SDg4KEhYWDg4SEgoKDhIOCg4ODg4OCgoODgoCKlJOPioqMj5GPjYuGg4KCgoKBgYGBgoOCgYGBgIGBgoGBgICBgYGAgYCAgH+BgoODg4SEhIOCgoKCfXx8fn6AgYOAg4OChIaFhoaFhIWFg4ODg4SBgoSMlJaXl5mYh5Cdm5ucmJGLh4ODg4KDg4ODgoGAgIKCgYOCgYKCg4OEhYWEg4OChISEhIOEhISDg4OEg4ODg4OEg4SDhIWEhISDg4ODgoKCgoKCgoKBgYKCgo+UlI+Njo6RkY6KiISCgoKCgYGBgYGCg4GBgIGBgYGBgYCBgIGBgYCBgICAgIKChIKChIOCg4ODgoJ9fX2AgH+AgoGDg4ODhIaEhIOEhYWDg4GBg4OCgIKDhIyWmZWJkpmckouHhYaHh4eGhoeHhoaEgoGCg4SDg4ODg4ODhISFhYWDhYSFhISEg4KBg4OCg4SEg4KCg4SCg4ODg4OCgoKCgoKCg4OEhIOFhYWFhoaIk5OTkI+PkJKRjIqIgoKCgoKBgYGBgYKDgoKBgIGBgYGBgICAgYGBgICAgICAhISEgoKCgoGBgoKBgX+AgYOCgICAf4CCgoGDg4KCgYODg4SDg4GDhYSCgYKBgYSPl5SWmZCFh4eIiIiHh4eIiIiFhIOBgIGBgoKCg4GCg4SEhYSDg4OEg4OEhIOBgYGCg4OEhISDg4ODg4OEhIODgoSDg4ODhIWFhoeHh4eIiIiJiY6TkpKOj46Rko+LiYeCgoKCgoKBgYGBgoKCgoGBgIGBgYGAgICAgYGAgIGAgICDg4KCgYKCgYGAf4CBhYWFhoOCgYB+fn+BgoSCgYKDhIOCg4ODg4KChISDhISCg4OEkZaIhIWDg4WFhYOEhIWFg4KBgH9/gIB/gIGEg4OEhYWEgoKCgoOCg4OFhIKDhISEhYaGhoaGhoWFhoeHhYaIh4aHiIeGhoaIiYeGhYaGhoeIkZKSj46QjpCRjImHhYGBgoKCgoGBgYGBgoOBgYGBgYGBgICAgICBgYCAgICAgISEg4KBgoGAgYGAgYKIh4aHhYSCgH99fX6AgH+AgYGBgYGBgoGAgYKDgYKCgoKCgoGHkYKDg4GCgICAf4GAgICAgH9+gIGBgYKCg4OEg4OEg4OCgoGBgoODg4SEg4SEhIOFhYaFh4eIh4eHh4eHh4eGhoaGh4WFhYaGhISEhIWEhYaSk5GOjo+OkI6JiIeEgoKCgoKCgoGBgIGCgoKCgoKCgYGBgYGAgYGBgICAgYGAgoSDg4KDgoGCgYKDg4iHh4iHhYSCgX5+gICAfn5/f4CBgYGCgoCBhI2DgH+AgICAgIiSgIGCg4OAf39/gICAgICAgICDg4KDg4ODgoOBgYKCgoOCgYKCgoOCgoSDhISDg4SEhYWFhYaGhoaFhISEhYWEhIWFhYSEhISDhISEhISEipSTkpCQj46NiIaFhIOBgYKCgoKCgYGAgYKCgoKBgoKBgYCBgYCBgYGAgICAgYGAg4OCgoOCgoKBgoOCiImJiYiHhYSDgYKEhIOBgoKCg4SCgoSEgoOKloiEgoSCgn+AjJaCgoGChIOBgYGCgoODgoGDg4SDg4SEg4OCg4KDg4ODg4KCgoKCgoGDhISEhYSFhYWFhIWEhIWFhYWDg4OEhISEhYWFhISEhISEg4ODg4OOlZKQkZGPjYyHhYODg4GBgoKCgoKBgYCBgoOCgYCCgYGBgICAgIGBgYCAgICBgICDhYSEhIODg4SDhIOGh4mIhoWDhIODg4WDgYCDgoWFhISDg4OChI6YioOFhISEgoCSmoaCgoKEg4OCg4GBhIWEg4ODgoKDhISDg4ODg4SFhISDg4KCgoKCgoSEhYSFhYWFhYODhYWFhYaFhoWEhIWEhYWGhYWFhIWEhISDhIODhJGUk5KTj4yMioWEg4ODgYGCg4KCgoKBgYGCg4KBgYKBgYGBgICBgIGBgH+AgIGAgYaGhoaGhoaHh4aGhYSDhYaCgIGBgYGHgoB+f4GBj4yDgX9+fXx9i5yNgIKBgYOChZSTjIGCgYKDg4GBgYKDhYODg4KDg4OEgoKEhIOEhIWEg4OCgoKCgYKCg4ODg4SFhYWFhIOEhYWGhYWEhISEhIOEhIWFhYWFhIODhIOEg4KGlJSSlJKPjYyIhISEg4KBgoODgoKDg4GBgoKBgoKCgYGCgYGBgYCAgYGAgICAgICAhYWFhYaGh4aGhoWGg4ODg4GAgoKCgYKAf35/f4GVl4mAfX19fXuBl4yAg4GBgYCPk4uQgYKBgoKBgYKDgoODgoOCgoKCg4OBg4SDg4ODg4OEhIKCgoKDgoKDg4ODhIWEhISEg4OEhIODg4OEhIODg4ODg4SDg4ODg4KDg4KDgouUk5KTko2NioaDhIOEgYGCg4ODg4ODgoGBgoGCgoKCgoKBgYGBgICBgYCAf4CAgICDhISFhYSFhYWEhIWCg4KDgoKDg4OBgICAgICAgJWfin5+gH2Hin2EhIOEgoODgo6JhYyCgoOCgoKCg4ODgoODg4KCgoODgoKDg4KCg4KDg4WEg4ODg4SDg4SEhISEhYWEhIWEg4SEg4OEhISEhISEg4SEhYSDg4SEhIODgoKDkJSTkpKPi4yIhoSFg4OBgYKDg4ODg4OCgYGCgoKCgoKDgoCBgoGAgICAgIB/gICAgISDhYWEhYWFhYSFhYOEhIWDg4SEhIKCgoOCgoSBkaGKf4yFfYaJgH6FhYWEhYJ/fn19f4KEg4ODg4OEg4ODhISEg4OEhISEg4SEhIOEg4OFhoWFhYSFhYWFhYSFhoWGhoWFhYWFhYWFhYWGhoWGhoaFhoaGh4aFhYWFg4SEhIeTk5OSko2KiIWGhYWCgoGBgoODg4OCg4KBgYKDg4ODgoKBgIGAgICAgICAgH+AgICAhYWFhYWGh4eGhYWFhISFhYSEhISEg4ODg4OEhYOKkYOEi4WCgYF+fYGHhoOAfn5/fn9+f4OEg4OEhISEhISEhISEhISFhYWEhYSGhYWGhYaGhoWGhYWHhYWHhoaGhoaFhIWFhYWFhIWGhoaHhoaGhoaHh4iIiIaFhYaFhYWGjZSTkpGQi4qHhoeGhIGCgYKDg4ODg4KDgoGBgoODg4KAgYGBgICAgICAgICAf4CAgICHh4eGhoeHiIeHhoaEg4ODhIODg4OEg4ODg4OEhISEgYKCgYmBf359foWBf39/f39/f36AgISFhIWGhoaFhYWFhoeHhoaFhoWFhoeHh4iHh4eGhoaHhoeGhoeHh4aGhYSDhIWFhoSFhYaGhoeHhoaGhoeHh4eIiIeGhoaHh4eRlJORkZCLiYiFhoSDgoKBgoODg4ODgoKDgoKCgoOCgYCBgICBgICAgIGAgIB/gICAf4aHiIeHh4eIiYmIiIODgoKDgoSEhIWEg4KCg4SEhIOBgICAhIR/fn5/gH9/f39/gIB/f4B/f4WFhoiIiIeHh4eIh4iHiIiIhoaHiImJiYmIh4aHh4eJiIaHh4eHhoeFhIOEhYaFhYWFhoaGh4eFhoeGh4aGh4eHh4eHh4eFh5OTkY+RkIuHhoWGg4KCgYGCg4ODg4ODgoKCgoGCg4KCgIGBgYCAgICAgICAf3+AgYB/hoiIiIiHh4iJiYmIg4KCg4ODhIWHh4aFg4OFhISEg4GAgIGMiYGAgYKCgYGBgYB/gH9/fnt6gIaHiIqKiYmJiImJiYmKi4qIiIiJiYqLioqIiIeIiIiHiIiIh4iGh4aEg4OFh4eHhoWFhISEhYWEhYWGhISEhYWFhoaGhYOJlJOQj5COioaEhoWDgYGCgYKDg4ODgoKCgoKCgoKCgYGBgYGBgYCAgICAgIB/gICBgH+GiYiIiYeIiImJiIiEgoKDg4KDhImKh4aEhIWEg4OCgICBhISCgoKCgoKCgH9+fX19fX59fHt8g4eJi4uKioqIiIqJiImLiomJiImIioqJi4mHhoaGh4WGiIiJiIaGh4SDgoSIiIiIh4WCgoGDg4KDg4SCgoKDgoGEg4SEgY6TkpCPj4uIhYSGhIKBgYGBgoODg4OCgoKCgoKCgoGBgYGBgIGAgICAgICAgH+AgIGAf4WIh4eHhoeIiIiHh4SCg4OCgoOFiYqJh4WHhYSFhYKAgYOEgoOCgoKDgX59fX5+fn5+fn1+fH19g4eJioqHh4WGh4eHh4iHh4mHiIaIh4aJiYODhIOFhISFhYeIiIaFg4KCg4WHhoeGhoSCgoOEgoOEhIKBgoGBgYODhIOEkZKQjo+Oi4eEhoaEgoGAgYGDg4ODg4KCgoKCgoKCgYGBgIGBgYCAgIB/gIGAf39/gIB/hYaGhYaGhoeHiIeGgYKEhIOChYeIi4qGhIaEgoaGgoKEhIODg4OCgoF9fH1/gH9+fn59fH19fHl8g4aGh4SDgYODhIWFhYODhYSEhISEhIWEgoKCgoSEgYKDg4WGhYSCgYGCgoODhYSEhIWEhIaEg4SFg4KDgYKDg4SFhIeSkY+NkIyJhoSFhIWCgYCBgYODg4ODgoKCgoKCgoKBgYGBgYGAgICAf4CAgYB/gICAgICDhIWEhIWFh4eHh4aAgYGFg4OEhYSHiIWCgIB/gX9/gYODg4ODgoJ/fX1/gICBf31+fn19fX17enp+hISEgoGBgIGBgoKBf36BgYGCgYOBgoGCgoKBg4OAf4CAgoOCgICAgICBgYGDgYGChIODhYSCg4SDgoKBgoSDhYWGi5ORj4+Pi4iFhYODhIGBgYGBgoODg4KCgoKCgoKCgoGBgYCBgYCBgH9/gIGBgICAgH+AgIKCg4OChIOEhYWGhn+BfoCBgICAf4GDgn9+fn5+fX+Cg4OCg4KDgn19fn+AgIGAfn19fX1+fXx6enqAgoKBf39/f35/f4B+fYB/foCAgX+AgIF/f4CAgX59fX+AgX9/foCAgH+AgICAf4CCgICCgYGCgYGAgYGBgYKEg4aPkpCOj42Kh4eGg4ODgYGBgYGCg4ODgoKCgoKCgoOCgYGCgYGBgICAgH+AgICAgICAf39/gYKDhIGCgoOCg4SFgIB/fH19fn19foCAf31/fn1+gYODg4KCgYF/fX1+f4CAgH9+fX19fHt7e3p6enqAgH9/f39+fn1+f35/gH9+f3+Af4GAf359fn9/fn18fn+Af35+f3+Af39/f4B/f4B/f4CBf4B+f39/gH9+f4B/hZKSj46Pi4uHiYWEg4KCgYGBgYKDg4ODg4OCgoKDg4KAgYKBgYGAgICAf3+AgIB/gIF/f36BgYSEgYKBg4OCg4OBgH98fn9/fX6Af4B/foF/f4CBhIOCgYB/f359fn5/gICAfn19fXx7e3x6enl5eXuAgH+Af39/fn5/foCAf35/f4CAgoB/fH5+f35+fXx/f4B/fn9/f4B/f35/f4CAfn5/f39+f35/f35+fn19fX2Fk5KOjIuKiImIhISEgoKCgYGBgoOCgoOCgoODg4ODgYCBgYGBgYCAf39/f4CAgICAgIB/foCBhIOCgYGDhISDhICBgICBgIGAgYKCgoGBgoCBg4ODgYGBgYCAfn19fn5+f359fX19fXx8fHt6eXl5eH2BgICBgYF/f4B/f4F/gYCAgYGCgoB+gH5/fn5/foGAgoF/f39/gIB/f4B/gYB+f3+Afn9/fn+Af31+fn17fIaTkoyLioeHioiGhoSDgoGBgYGCg4ODg4OCg4OCgoKBgICBgYGAgH9/f39/gICAgICAgH9+fn+BgYGAgISGh4aHgoODhYOBg4ODhYSEhISEg4ODhIKCgoKCgX9+fX19fn6AfX19fX19fX19e3p5eXl5eYCCgoKEg4CCgoGAgoCCgYGDgoKDgYGCgIGAf4CBg4GEgoCAgYCBgYCAgYCCgn+BgIF/gIB/gICAfn9/fnx8ipOPiYmIiIiJiIaGhoSCgoGBgoKDg4ODg4KDg4KCgYCAgICBgYGAf39/f4CAgICAgIGBf359fn5/f39+g4aHh4iChYSFg4SFhIWGhYaGhoWGhYGBg4ODgoKAfX19fX19fn59fX19fX19fX58e3l5eXl4fIKDhIWCgYSDgoKDhYeCg4SDgYKCg4OCgoKCgYKFg4iFgoGCgYKDgYGBgYSDgoOCgoKCgYGBgIF/gIGAf36Ok4yHiIaIh4aGhYaGhIKDgoGCgoODg4ODg4OCgYGBgH+AgYCBgYB/gH9/gICAgH+AgYB/fn19fX5+f36Ag4SHiISGhoaFhoaHh4aHh4iHh4eGf32AgIGCgX59fX19fX19fX19fX18fH5+fnx7eXh3eHl5gIODf4ONhISEhISXl4ODhIF9foGCgoGCgYKBhIaIjIWDgoKBhIKDg4KDhYSEhYOCg4OCg4OCgoKCg4KCgpKQi4iIh4mHhoaEhoWFhISCgYKCg4ODg4ODgoGBgYCAgICBgIGBgH9/fn+AgYCAf4CAgH9/fn1+fn+Bf4CCgYWFhYeGh4eGh4eIhoeHh4eGh4V+fX18fX9+fX19fX19fX19fX19fXx7iJKCe3x6fIZ5eHl8gYF+iZaEg4OEhJSTgIGBf39/fn6Fi4B/gICEhpCJhYSCgoGFhYuDgYKFhYaGhIOFhYOEhIODhIOFhISIko+MiYiIiYeHh4WGhYSFhIKBgoKDg4ODg4OCgYGBgYB/gIGAgICAf39/f4CAgICAgYGBf39/f4CAgIGBgYGBg4OGh4aGh4aGiIeGhoaFhIOFhH59fHx8fX18fH19fX19fX19fX18fH+RlZaDe3qElHx4eXp7fICCg4GCgYOCgH59fn57iJF8fI6Wf31/f4KGioWDg4SDgYONiX9+f4OEhYWDhYaFhIWFg4SFhYaEhI6Rj4yKioyJiImHhYWFg4ODgYGCgoKDhIODgoGBgICBgICAgYGAgIB/f3+AgIB/gICAgX5+f4GBgoKCgoODgoOCgoWGhISFhYSGhIOEg4KBgIKAfn19fHx9fXx8fH18fH18fX19fHx8e4uRl4x6e3yBenp6e3x5eX19foB/gH98e3t+fn2ClZF/hIh9fH5/goR8fIGChIKAf4eDfYKBf4KCgIODhISEhISChIOEhYGEkZGOi4yMjoqJiYWFhYODg4KBgoODgoKDg4KCgYGAgIGAgICAgICAgH+Af3+Af357gICBenyAgYKDhYODhYWFhYODg4SCgYKDgoOCgoGBgIB/gX5+fX59fHx8fHx8fHx8fHx8fHx9fHx8fn6Kgnt6e3p4ent7fH17fn1+f319fX19fH+BgX2Gj4F+fYJ+f36Agnx8gH+CgIKAfnx7ioJ9gH9+gYCAgYKBgoCAgIGAf4uUkIyLjo6MiIiHhYWFhIOCgoKCg4OCgoODgYGBgICAgICAgH9+fXx7fHx9f3+AgHx6gYF4e4CCgYOFhIOFhIaHhISAhpSIgIKBgYGBgH9/f39/fn5+gHx8fHx8fHx8fHx8fHx9fHx8fHx8fHl7e3t4eHl7e3p8goCBfn+BfH5+f359gIKCgICAgX+CkYF/f4CAfoB+fn9+gIGBfX19e319fXx9fHx9gH+AgH6Afn6ClJKNjY2Oj4qFhoaFhISFg4KDgoODg4OCgoGBgYGAgICBgICAf4CAf39/fXt6fICAgHh+gXd7gIF/goKCgoKEhoeGhn6IlYp+gYGAf4B/foB+f39/fn+Bfnx7e3x8fHx8fHx8fH59fHt9fHx8e3x8fHp6eXt8en2Fg4N/gYF+f35/gH6FgoF+gH9+foCFhoKAfn6Dhn99fX6AgIGAf39+fX19fX57fH1/f3+AfX9+f4yRjo2Oj46Nh4SGhoWEhISDg4OCg4ODg4KBgYGBgYCAgYGAgYGBgYGAgH9/f397en9/e3mAd3p/f31/f3+Af4KEhoaFf3+FgX5/gIB/gH5+f31/gIB/f4B/f319fHx9fn18fH19fX19fH58fXx7fXx8ent6fH19f4aEg4CAgX1+fX5/fouEgYZ+fXx8f36CgX99fX19gXx7fXx+gYSDgYB+fn5+fXx+f399foB+f36Eko2OjI+Ni4qGhIaEhISDg4OCg4KDgoOCgYGBgYGAgYGBgYB/fXx8fH1+f39/f397e399d352eH59fH18fX5+gYGCg4B6fX18fn6Af35/f35/fn+AgH+AgH9/fn9+fn5+fn1+fn99fH59fn1+fHt8fHx6e3p9f4CAhIOCf35/fHx8fXx8gYN+jH58e3t9fn1+fn17e3t9fHt7e3uAhoSChIOBf4B+f4KCgn9/goJ/gIuQjY2MjYuKiISEhIODg4ODgoKCgoKCgoKBgYGAgoGBgYKCf3+AgIB/fn18fH5/fn55fX52e3Z4fXx8fHt9fX6BgICAf31/f31+f39/foB/f39/f3+Af4GBgH99gH9/fn9+fn5/f3yCfn59fX17e319fHp8fH6AgoGAgIB9fH18fHx8fH18fnt/fnt7e3x8fH18e3t7e3x8enp9en6CfoKEhIKBgoGFhoWFhoaHhYGEkY+Ni4qLh4eFgoOEhISEg4KCgYGCgoKBgoGBgYGBgoGBgoKAgYKBgYCAgH9+e3x+fnx6fnh5dnd8fHx7e318f4GAf35/foB/f35/f35/gH9/f3+Af39/gYKAfn6BgIB/f39/f39+fYN8fH19fH99fX19e3x+fn9/fn5/fnx9fXx8fHt+fnt8e3x8fHx9fH18fnx9fHt7e3x5e3x7e316fX5+f4CAg4eJiYmKiIqJhYiSj4yJioeFhYOCgoOEhIOCgoKBgYKBgYKBgYGBgYKCgoGCgoCAgX98e3p6eXt9enx+fnl8eXh4dHx8fHx8fHx+gH9/f39/gIB/fn5+fX+AgH9/f3+Af4CDgoB/gIGAgIB/f4CAgH58enx9fX59fX5+jIZ9fX57e4ODfX5+fX18fX19fX19fH17fXx9fX58fn19fX18e3t6fHt8fHt6e3t6enp7fn6DhYiHiIqLi4qJjJGQjoqIhoWEgoKCgoODg4OBgYGBgYGBgYGBgYGCgoOCgYKBgIGBf3+Af356eHl5en5+e3l6eH5zfHx8e3x8fH5+fn5/gH+AgIB/fn9+gIF/f4B/gIGAgoSEgYCAgYGAgX+AgYKBf39+f31+gH57foGSjHx9f4qAjYx+fn19fX5+fX59fHx8fn18fXx9fX1+fX1+fnx7e3t8fH18e3p7e3l6enh5e35/g4OEh4mKh4mOkI6MiYmFhISCgYKCgoKCgoGCgoKBgYGCgYKCgoGCgoKBgoKAgYGAfoCAf39+e3p5e319eHx6f3KBfXt7fXx8fn59fYGCf4GBgX9/gH+AgX9/gIGCgYGFg4SCgYGCgYKCgICBg4KAf4F/fX6Afnx/f4mCf36DkYSEg4F/fn18jYd9fX59fXx/fnx9fXx9fX5+fX5/fX19e3x9fnx8e3x9enp5eXl5e3t+foCBg4eEiI+Oi4uHhYSEg4KBgoKCgoGBgYGCgoKBgoKCgoKCgoKCgoGCgn+AgIB+f39/fn5/ent5fX16enp9cX6Cent9fX19fXp4f4KAgYKCgICBgYGBgICBgoKCgoaFhIKBgYGBg4F/gIKEgX9+gYB9foF+fX5/gIB9fn+EgH5+f31+fX2KhX1+f31+fn9/fX19fH5+fn99f4B9fX18fX9/fHx7fH17e3t6enp7e3x9fn2Ag4CJjouMiISFhYSDg4GCgoKCgYGBgoKBgoKCgoKCgoGBgoKBgYKCf4CAgH9/f39+fn59eXp6fXx5d3t0e4d8dHd9fn17e3Z2fYCBgoKBgYKCgoKBgYGDg4OChYaEg4GAgICDgX+AgYSBfn6Af35+gH59fn6AgX+Bf3+Af35/gH99f39/f3+Afn9/gH58fX18fn5+foF/gH2CgHx9gIB9e319fXx8fHx8e3t7fHt8fHx9fIqLiYiGhoWFhISDgYKBg4KAgIGCg4KCgoOCgoKCgoGCgoGBg4J/gIGAf39/fn5+fn57enp8fHt2e3R3f352cnt+fnt4dnd8gIGCgoKBgoODg4OCgoODhIOFhoOCgX9/gIKAgICAg4F+foB/fX+AfX1+foCAf4J/gYGAgICBgH1/f3+AgICAgIB/fnx9fX19fn59g32AfoKAfX6AgX98fn59fX17fH58fXx8fHt8e3x9iYeHhYWHhYSFhIKCgoGDgYCAgoKDgoKCg4ODg4KBgYGBgYGCgH6AgYB/fn5+fn5+fn56e3p9goN9dXF6fHpxen59eXd0dICAgoKCgoKDhYOEg4KDhISEhISEgYGAgH6AgoB+f36Bf35+f4B9foB9fX1+gH9/gYCBgYCAgIKBfn6Af4GAf4CAgH9+fX19fnx+fn19gYR/gH9+f4GBf31/f319fn1+fn1+fHt8enx7eoCHg4SEhYSEhISDgYKBgYKBgICCgoOCgoOEg4SDg4KBgYKBgYOAfoCBf35+fn5+fX5+fnt7en6Jh354cnl9f3F6eHt4eXV1fYKDgoODg4OFhIWDg4OEhIODhIOBgH+Af4CBfn1+fn9+fn5+gH19f3x9fX6Af4CAgIKAgIGAg4KAf4B+gIF+gIGAgH9+fn5+fn1/fn6FhYGBgH+Ag4F/foGAf35/f4B/fn17ent6fHt6goWAg4KCgoKCg4GBgYCAgoGAgIKCg4KBg4SDhIKEgoGBgoGCgn9+gIF/fn1+fn5+fX59fXp7fIWEe3tzeXp8cHd1dnd5dXR6hISBhISDhIWFhoSDg4WEgoODgoCBf39/f4B9fX1+f31+f39/fn1+fH19foF/gIB/gIB/gIGDgoGAf36AgH+AgYCBgH9/f39/f4B/gIGCgoKBf4CDgn9/g4J/f4B/gX+Af3x7e3p8e3yCgH+Cf3+BgIKCgYF/f3+BgH6BgoKDgYGDg4KEgoSCgYGBf4GCgH6AgH9/fX5+fX19fn19e3t6gH94fHZ5eXtxdHh3dnh1cnmFhYKEhIKEhYWGhISChIOBg4GAgIF+f4B/gHx9fX6AfX5/f39+fX98fn5+gX+Bf39+f4B/gIODg4B/f4GBgIKBgYGAgIGAgIB/gIGAgIKDgYF/gISAfYGDhICAgX+BgYKBfXp7e3x8fH99f4B9f399fYGAgH59fX9/foKBgYKBgIKCgoKBg4KCgYB/gYKAfn9/fn99fX1+fX19fX19ent7fHZ9eXh5enJ1eXl2d3dzdYaFg4WEgoSEhYSEhIGDgoGDgX+AgX5/gH6AfX19foB+f4B+fn99f3x/f3+BgIF/f3x+gH6AgYKDgYCAgYOEgoGAgYB/gYCAgYGAgYGBg4OBgX+Ag4B+goOEgICCgYKChIJ+e3x8fHx8fX1+fXp+fX14fn9/fHx8fn5+gYCBgYCAgoGBgYGDgoGBf4CAgoB9fn19f319fX59fH19fX16e3p8dnx6d3t4cnZ5e3Z2dnN0hoSEhYSChISFg4ODgYOBgYOBgIGBfX+BfoF9fX1/f39/gH5+f359fYB/gIGBgX9+fH5/fn5/gYJ/gYGCg4eFgX9/fn6Af4CAgICAgIKCgYCAfoCCf3+BgoOBgYOCg4OFg399fX18e3x8eXp7en55e3l4f357fHt+fX1/f4F/gH6BgICAgoOCgYF/gIGBf31+fH1+fX19fX18fn58fXx5e3x4enx3endzeHd6c3Z2c3SGhISGg4KDhISDgoKCg4GCgoGAgYF9gIB+gH1+fX5/gICAf39/f3x/f3+BgIGAf359f39+fn+BgH2AgIGDg4N/f359fn5/f4CAgIB/gYKBgH9+f4F+f4CCgoCBg4KEhIaEgH59fHx8fHp5dnl5enl2eXZ+fHt7e359e399gH99fX9/f3+BgoGBgX5/gYF+fX18fX19fX19fXx+jYF8fXl7e3p5fHd4eHR1dXhyd3d0doaEhIWEg4ODg4OCgYKDgoGDgn+Bf35/fn+AfX19fH+AgIB/f39/fIB/f4GAgYCAf3yAf35+fn9/fX5+gYGCgn5/fn1+fn5+f3+Af32AgIB+fn5/gX5+gIKCf4KDgoOEh4SAgH58fXx8e3x1eXl4eHh5d3t8e3t7foV9fn1/ent+fn59foGAgIGAfX6BgH59fXx9fX19fX18e32Dgnx8ent7e3p7d3Z4dXJzdnB4eXJ4hYWFhYOEhIOChIKBgYKBgIKBgIF/fn5+foB+fX58foCAgH+AgIB7gH6AgH+BgIB/fYF/fn5/f319fX6AgYKBfn9+fn59fX5/fn9+fH6Af35+fn+Cfn6AgIF+gYODg4OGhICBfnx9fHx7fHh3e3h1eXd3eXx6e3t9kod9fH13en1+fn19f35+gH98foB/fn19fH19fX19fHt8ent9enp4e3x6ent4dHh1cXJ0cHh4cXmEhYWFg4SDgoODgoGBgoKAgYGAgIB9fn5/gH18fn1/gIGAgICAgHyAf4B+f4GAf39+gX9+f39+fX18f4CAgIB+f35+f318fn9/f358fYB/fn1+gIJ/foCAf36ChIKCg4WFgoJ+fXx7e3x8eXd8eXd4d3d4e3t7e3yFin17end6fH19fHx9fX1/fnx9fn59fXx8fX5+fX18fHt6enx7e3p5enp7enhzd3VxcXNveHdxe4WGhYWDhYKBg4OBgoGBgoCBgICBgH5/fn9/fXx+fYCBgoGAgIGBfX6Af35/gX+Af3+BgH9/f319fH1/gICAgH9/f35/fXx+f39/f319f39+fn6CgYF/gIB/foGDgoKEg4SCgn5+fHx6fHt7eXt6d3N2d3h5e3p7eXp/fnt7d3p8fXx8fH59fH19fH19fXx8fX19fX99fXx9e3l7fHx7enp6enp6eHN2dXBwcm93dnJ7hYaEhYOEgoGDgoKBgYGCgYKBgYGAf4B/f399fX9+f4CBgYJ/goF9foF+fn+Bf4B/gIJ/gIB+fH58f3+BgICAf4B/f4B+fX5+f4B/f39/gH9/f4J/gICAgIB/gYGAgISBgoKAf39+f3x9fn56fYV+dHx9enp6enx5eXp6hoV3eXx8fHx8fXx8fHx8fX19fHx9fX19fn19fX16eX18fH16enp6enp5c3V1b29xb3d0c3yFhoOEgoOCgYKBgoKCgYKBgoCCgYCAgICAgH59gH+Af4GCgn+CgX+AgX5/gYB/f4CAgn+Bf319f35/f4KAgICAgIB/gIB+fn1/gH9/gIB/f39/gH+AgICAgH+AgYCBgYGCgYCAf39/fn1/fnuBk416fH18e315e3p6eHmBgXh5e3x8fXx8fHx8fHx9fX18fH18fn1+fn59fHp8fHt8fXt5enp6eXl0dXVvb3Fwd3N0fYWGg4OCg4KAgYCCg4KAgYGCgYKBgYCAgIGAfn6Af4GAgYKCgIKCgICCfoCBgX9/gX+BgIF/fH6Af3+AgoCAgICAf3+AgH9+fX6Afn2AgIB/f3+AgICAgYCAf4CAgYCBgYKCgICAf39/fX5+fIGGiXx8fnt7fnl6e3p7jn53d3l7fHt9fHx8fHt9fH19fX18fXx+fn5/f358enx9e3x9e3l6e3p5eXN0dW5zcXB4cnV6hYaDg4KDgoCAgIKCgX+CgYKBgoGBgYKAgYF/fn9/gYGCgYKBg4OAgYJ/gYGBf4CAgIB/gX99f4F/gICBgICAf4B+gICAf359foB+fn+Af39/gH9/gICBf4CBgH+BgIGCgoKAgICAgIB9foB9gIOCe35+e3t9e3p8fHyHeXh4eXx8fH17fHx9fX18fH19fn19fX5+f3+Af317fH18fHx7enl7e3l5c3J1bnZycHhxdXaFhYOEg4KCgYCBgoF/gIKCgoKDgYGDgoCCgYB/f4CCgoKBg4KEhICBgX6BgoF/gICAgH+Cf36AgYCCgICAgIB/gH+AgIB/fn2Af39/f4CAgH+AgH+AgYGAgICAgIGAgYGBgYGAgYCAgH9/gH5/fX59fn57fXx9fHx8d3h1eHh5e3x8fXx8fHx8fX5/f39/fn19fn9/gIGAf3x9fHx9e3p7eXp8eHpzcnVud3FxenF2d4WFg4SDg4KCgoKDgICCgYSDg4SBgYOBgoOCgYCAgIKDgoCCgoSDf4GAfoKDgICBgICAf4CAf4GBgIKAf4CBgH9/gICAgIB/f4CAgH+AgICAgIB/f4CBgYCAgICAgYGAgoOCgoCCgYGBgYB/gIB/gId+fnx6fXx7fX94d3Z5eXp8fHx8fXt8fH19fn5/gIGAfn1+gICAgoGAfH59fX58d3t6ent5eXNxdW53cHV6cXZ5hYWCg4KDg4KChISAgIOBhoODg4GChICEg4KCgICCgoSBgYKBg4J/gIB/gYOCgYCBgYCAf4GBgYGAg4B/gIOCf35/goGAgH9+gYCBf4CAgYGBgYCAgIKBgYKBgX+BgYGBgoOCgoOBg4OCgYCBgH+AhH19fXt/fXp9f3t6dnp4eXt7fH19e3x9fX19fn+AgYGAgH+AgICDg4B9f35+fn15eXt6enp5c3J1b3dxd3lzd3uFgoKCgoOEgoOEg4CAg4OGg4ODgoKEgYSDgYOAgIKBhIGCgoGCgX6AgICCgYKBgYKCgIGAgICCgoGEgH6Bg4J/foCDgoCBf4CCg4KAgYKBg4KDgoGBg4KChIGAgYOBgYKEg4KEhIODhIODgYGBgoCCf4B/fYB8enx/e3t3fHl5eXt6fX59fHx8fH1+foCBgYCAgIGBgYSEgH2Af39/f357e3t6e3p0cHhyeXR2eHR3e4SCg4KDg4SChIODgYKDhIaEgoODgoSChIOBg4CBg4KCgoKCgIKAf4GAgIKBgoGCgoKBgIGBgYOCgoOAfoGDgX9/gYSEgYN/goKBg4KCgoGEg4OEgYKEgoOCgoGCgoOBg4SDhISEhISFg4SCgYOCgoOBgYGAgH58fIB9fHh8eXp5enx9f3x7fHx9fX18fICAgICAgYGBgYKBfoGAgICAf3t7e3p6enVweHd5dnV8dXZ8gICDgoODg4OEhISAgoOGhYWDg4KDhIKEhYKCgYKDg4GCgoKAgYB+gYCBgYKDgoKCgoGAgYKChIKCg4B/gYOCgICChIODgoGCgoGDgoKDg4ODg4SAgoSDg4OBgX+Bg4KDhYKEhISEhISDhISChIOEhIKBgoGBgHt9gX59eXx6enp9fHyBfXp8fH19fHp7fn5+gIB/gYGAgICAgIKBgIB/fX18fX18dnJ2eHh2dH92dX2Hh4OChIWDg4SFhICChYWEhIOCg4SEgYSFg4KCgoODgYOCgoCCgH2AgIGCg4KCgoKEgoGCgoOEgoKBgICBg4KAgYOFhIOCg4CCgoOCg4ODg4OEg4CCg4KEg4KCfoOBgoSEgoODhISEhIOEhIOEg4WEg4ODgoKAe4CBf3x8fXp6fH2AfX9/fHx6fH59fH19fn5/f39/gICAgH9+foCBgICAfnx9fX5/fn18fHh2f3Z3f4SHg4KDhoODhIaEgYKFhoWEhIODhISChIWFgoKDg4SCg4KDgoKBfoCAgoKDgoODg4SDgYKCg4OCg4GCgYGDgn+ChISDg4KEf4KEg4ODgoSDg4SCgIOEg4SDg4KCg4KChIOCg4OEhISEhIWEg4OEhYSFhIOBgoB9gYKAfXx8e3x8gH19foB+fn1/fnx8fH19fn5/fn+BgYGBgH99fX6BgYB+fn19fX59fX5+f3+AfH2AgYKCg4OFg4SDhoSBgoiHhYSDg4SEhYGFhYWDg4SDhIODgoOCg4F+gYGDg4SCg4OEhIOCg4KEg4ODgoKDgYOCf4KDg4ODgoOAgoWDg4ODhIODhIOBgoSEhYOCgoODg4GEhIGDg4SDg4SEhYSEhIWFhYWEg4ODf32BhIB9fXx8fHx/gX5/f39/fX99e3x9fX19fX5+f4CBgIGBgH59fH6Cf39+fn5+fX1/f39/gICAf4CEhIODg4WDhIOFf36CiouFhYSDgoOFgYaGhoOEhISEhIODg4OEgn+BgYODhYSFhIWEg4KEhISFhIODgoSDhYKBhISFhYaEgoCDh4SDg4OFhIWFhIGEg4OHgoOCg4GCgYSDgoODhYODhIWEhYWHh4aHhYSEhYSBf4GDf35+fH5+fX+BgH9+fHx/f358enx9fX19fX5+fn9/gIGBf319fIB/gH5+fn5+f3+BgYGBgYKAgYWFhIOEhIKEg4aAgoWFiomEhISEhYWCh4aGhISEhIWEhISEg4SDgYKDg4OEhIaEhYSDg4SEg3yDhHuBhHd5g4F9hH5+cnWDgoF2foOEgH2BdYF6hH9/f3+EhIKDg4KBg4SDhISFg4SFhoSFhn2EeXx+f4N7hYOBhIOAf31+f31+gYOBfXt/fX6Afn18fHx9fX19fH19f4B/gYJ/fX18f4GBgICAgH+BgYGBgYKDg4KChoSEhIWEgYOEhYOEhYSKiIWFhYOFhYSGhoaDhISFhYWEhYWEhIWCgoOEhYWFhoSFhIOEhYWCaICFanx7cXF8gXOGc3R0fYKDdXNxg4ZzcHVyc3SDdnt9dYF/goOAgnZ5hYCDgIR/hYSChYWCaHpyc3N8gHKBg3+Dg32BfX5+fX6Cg4J8f4F9f4B9fXx8fHx9fHx8fn1+gX+BgX99fX2AgYKBgYGBgIGBgYKBgoKCgoSHhIWEhYSBgoSGhoOFg4aIhoaFg4aGhoeGh4OFhYaFg4KFhoSFhYODg4SEhoaGhIaEg4SFhn1xe4FweXZ+g3+CbnlwdXN8dnl5hnKEg3B2eHF2dHR1cnN0dml/gG5yb3R2bnVsd217c26Ah3ltfXJzdnN2bW53bHB5bHV9f398foGAgX2Af32Af4B/fX18fHx9fH1+f32Af4CAfnx/foCBgoCBgICAgYCAgIKDgoKEhYeGhoCChYODhYeGg4WFhYaHh4SDhoaIiYaHhIWGiIeEg4WGhYWEhIOFhIKFhoaFhoWEhoWHdnB0e3BydX+HhYNtdW92b3x1coR5eYd4cXR3bndod3pucHaCcoN+b3p5eW1vbnpvb213fXiGcHF6cHJ0ZoF1fm57eXNveX+Af31+gYB/e39+fIB+gIB+foCAgYB+fn9/foF/gH9+fYB9f4CBgIB+fn+BgH9+goOCgoSFh4eEfoaEg4OFh4aEhoWFhoaIhISGh4iIhoeEhoaLioWEhoeHhYOFhYWEgoWFhYWGhYWGhYZxdXByc29zenl+g3SIdHV+iHZugnKEhnluanJ/cW1zd3x/dXR8hH54cXV3bnl1enF2eHV6eYRyaW95eHBreXN6b3p3dnZwgYB/fn5/f356fn18f31/f359gIGDg4CCg4GBhIKBf4GBgH1/f4F+f35+f4GAfn6BgoCAgoSHhoODhoSFhYaHhoWFhYWGhoiFhYaFh4eFhoSGhomIhYSJi4iGhIaFhYWDhYWEhoaGhoaFg3iLeXKIentwcIWFeIV4eWtzfnl7a3KDh4N6fG16eXl0fYB2bm+AgG90fHV3cXl9fW1+dW+DhYZ6gHJye3x1cG96a3N8bnaCgYF+fn99fXp9e3x9fX9/fn1/f4KCf4GDgYGDgYB/gICAfn9+f31/fn1/gH58fYGAfn6Ag4iEhoSFhYWFhoeFhYWFhYeHiIaEhoWHhoaFhIWFhIWFhomKh4WEhoWGhoWGhoSGhoaGhoWGh4eHhoaEhoWGh4iHhYeGhoOHhoWFg4SFhoWGhIaEg4SEhoSEgYODhISFhIWEhYSGg4WGhYWEhIWHhoSEhYaFhX13hoOEhIOCgX1/fnt8e357fHx9f359fH9+gYB9f4F/f4GAfn5+gH5+f35+fX99fX5/fHt8f358fH+BiYaFhIaGhoWGhoWFhYWGhoeIhoSGhYeFhYWDhIWGhYSGhoaGhYSGhIWGhoaGhIeGh4eGhYeIiIiIhoSHhYaGiIaFiIeIhYeGhoiFhYaHhYaGhYOChYWGhYWDhYSEhIWEhoWEhYWDhoaFhoWEhoeGhISFhoOFhIKEg4OFg4OBfYB/e3t8fnt8fH1/fnx8fn2Afn1/gH5+gH99fXyAfX5+fn5+f3x8fX57fHx/fHt7fn+Ih4SEiIaGhYeGhYWEhoaGhoiHhIWGh4aFhIODhIaFhIeFhoaFhYaEhYaGh4eFh4aJiIaGiIeIiYiFhYiFhoeGh4aHhoeFh4eGh4WFhoeFh4aFgoOFhoaEhIOEhIOEhoSGhYWFhYOGhoWGhYSGhoWEhIWFg4SHhYOCg4SDhIJ+gYB8e31+e3x7fn59fHx+fX5+fX9+fX1+fnx9fH98fn58fYGAfHx8fXx8fH56e3t8foiHgoWIh4eGhoaGhISGhoeGiIaEhYSHhoSFh4OEhYSFh4SFhoaFhoSGhoeHhoaHh4mIhoaIh4iKiIWHiIWHh4WHhoeGh4WIiIeHhYaGh4WGhoSBhISFhoWFhISEg4SFhIaGhoWGhIaFhoaFhYaGhYSDhISDg4eDhIGChIWDgYCAgHt7fn18fHx+fXx8fH19fH18fn18fX18fHx8fXx+fXt8gX99fH18fnx8fHp6fHx9iIeChoiHhoeGhoaDhYaFhoaGhYOFhIaFhIiJg4GEg4SGhIaGhoaGhIeHiIiHh4eIioiGh4iHiImIhYiHhYaGhoeHh4WHhoiIh4eFh4eHhYaHhIKEg4SGhYeFhISEhISFhoaGhoaFh4WFh4WGhYaFhIOEg4OEh4GDgIKDhIKCgn+Ae31/fXx8fH59fH19fH57fHx7fHx9fXt7e318e359e3x/fX18fX1+fXx6ent7fHyIh4KGhoaGh4aGhYOFhoWFhYWEg4WChoSDiId/enqChYaEhoaFh4aEh4eIiIiHhoiKh4aHh4eIiYeFiIeFh4eGhoeHhYeGiIiHhoWHh4iGhoeDg4SEg4aGh4WFhISEhYaGhoaGhYaHhoaIhoaEhoWDg4ODgoOGgYN+goKDgIOCf398f39+fHx9f318fX18fnt7e3p7fHx8e3t7fnt7fXt6e358fHx8fX5/fXt6fHp8fImHg4aFhoWGhoWEhIWFhYWFhIOBhIGGhIKEhHyAhn+ChYWGhYWGhYSHh4iHiIaFiYqHhYeGh4eIh4WIhYaHiIaGh4eGh4aIiIeFhoeGh4WFiIOEhoWDhoaHhoWEg4WFhoaGhoaFhoaHhoeHhYOFhYOBgoKBhIWCg36BgoF/g4F/fn5/fn98fH1/fXt9fXx+enp7eXt8fXt7e3t+fHx8fHp7fXx8fHx+fYF8e3t7e3x7iYeEhoSGhIaGhYSFhoWEhIOEgoCDgYaDgYJ/eoSMe4CEhYeGhoaFhIeIh4aHhYWHiYeEh4WGhoiGhYeEhoeIhoaIh4eHhoeIhoSGhoaHhYWHg4SFhIeGhoeFhYSDhYWGhoeGhoWGhoaFhoaEg4SFgoGCgYCEg4OCfYGBf36DgX5/f4B8f3x9fX59e319fH15enp5e319enp7e318fXx8enp9fHx9fH5+gHt7e3x+fXyIh4WGhYeEhoSFhYWFhYODgYOBgIKBhYJ/gH9/fXx7gYSFhoaEhYSEh4eGhoaFhIaJhoKGhIaGhoWFh4WHiImGhYiHiYeGhoeFhIaFhYeFhIeDhIWEiIaGh4WFhYKFhYaFhoaHhIaGhoaFhoKDg4WAgIGAgIOBg4B8gYB+foKAfYB/gXx/fH1+fX57fn18fHl6enl6fX15enp7fHt8e3t6e319fH18f35+fHt7fX59fIiGhYaGhoSFhYSFhYSDgoKAgoGAgIGDgX5+foB5en2Ag4OFh4WEg4OHhoOEhYSChYiFgoSDg4WFhYWHh4aIiIaFiIeJh4aFhYWDhoSFh4OEhoSEhYSHhoWGhYaEgoWFhoaGhoaEhYaGhYWFgoKDhH9+gICAgYCDgHuBf31+gn5+gH6Afn99fX59f3t/fXt6eXp6eXp8fXl6ent7enx7e3t7fH19fXyAfn18fHx/fnx7h4WFhoaGhoSFhIWDhYKBgICAgYB+f4KCfX1/f3t/f4KDg4WGhYSDg4aDgYOEgoCFh4WCg4GBg4SEhIaGh4eHhYWIhomHhYSEhIKFg4SGgoOFhISGhIeGhYWFhoOEhYSFhoWGhISFhIWDhYSAgIKDf35/f39/gIN/fIB9fX+CfYCBfn6Bfn5+fX1/e398e3p5enp5ent8eXp6e3t7fHp7e3t8fX19fYB9fXx8fYB/fXyGg4aGhoaFg4SDhoKFgYGAf3+AgH5/gYJ8fn9/foCAgoKChISDg4GChIGAg4KBgISFhIKBf4CCg4OEhYWHhoaEhYeFh4WGgoOCgoOCgoWBg4WEhYaEhoaHhoaFgoSEg4SFhYWDhIODhIKEhIB/goJ/fX5/fn5/hH57f3x8gIF9gYB9foN9fn59fX57fnt7enl7enl6ent5enp6e3t8enx8fHx+fn1/gXx9fHx9f4B+gIaEhYWEh4SEg4KGgoOAgYB+fn+AfX9/gnx9f39+fn+BgYKEg4KBgYKCf4CBgoCAgoWEgoB/gIGCgYOFhYeFhISGhoOFg4WBgoGBgoGCg4GChISEhYWGh4eGhYWEg4ODhIWFhIGDgYOChIODgH+AgX59fX5+fH6Dfnx+fHyBgH6Cf35/gnx/fn19fHx8e3t6enp6eXt5enp5enp6e3x5e317e35/f4GAfX59fX1/gICAhoSEhYSFgoSCgoSCgoCBgH59fn9+fn6AfX2Af35+foGBgoODgoSHgYF+gICBf3+ChIOBf35/gIJ/goWEhYOCg4WFgoSBg4CBgIGBgYKBgIGEg4OGhYWHh4WEhIWCgoKDhYSCgYGBgYCFg4F/foB/fnx9fn18foN9e358fYF/gIN9fYCBf35/fXx8fH17e3p5enl5e3l6enl6ent7e3p7fXx8f3+BgoB+gH+AgH+AgIDKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzNzc3Nzc3Nzc3NzczMzMvLy8vLy8vLy8vLy8vLzMvLy8vLy8vLy8vLy8vMzMzMzM3Nzc7Oz8/Pz9DQ0NHR0dLS0tLS0tLT09PT0tLS0tLS0tPT09TU1NTU09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tLS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1dXV1NTU1NTT09PT09PT09PT09TU09PU1NTU1NTU1NTU09PT09PS0tLS0tPT09TU1NTU1NPT09LS0tLS0tLR0dHR0dPHhnNlYFtLWWdVTUZIQD03Nzg5Nzw8PDo8Oz42Oj04PDs6OTg3ODs7Oj87PTs8PD47P0E/QkJBQ0RFREE+PTw7QENDQUBDQ0FBR0hHSUtSwtXS09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXVysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMy8vLy8vLy8vLy8vLzMzMy8vLy8vLy8vLy8vLzMzMzc3Nzc3Oz8/P0NDQ0NHR0tLS0tLS09PT09PT09PT09PS09PT09TU1NTU1NTU09PT09PT09PT09PT09PT1NTU1NTU1NTT09PT09LS0tLS0tLT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1NTU1NPT09PT09PT09PU1NPT09TU1NTU1NTU1NPT09PS0tLS0tPT09PU1NTU1NTU09PT09PS0tLS0tLR0dHSzIxyZ2BcTVllUktHSz87Mzc4Ozg5Pj05PDpBOjs9Nzs8PDo6Nzg6Oz0/Oz88PTw/Pj9BPUFBPkNDREJAQT46Oz9DREFDRERCQklHSEhJTr7V0tPT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1crKy8vKysrKysrKy8vLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzMzMzMzMy8vLy8vMzMzMzMzMzMzLy8zMzMzLy8vLzMzMzc3Nzc3Ozs/P0NDQ0NDR0dLS0tLS09PT09PT09PU09PT09PT09TU1NXV1dTU1NTT09PU1NPT09PT09PT1NTU1NTU1NTU1NPT09PS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1tbV1dXV1dTU1NTT09PT09PT09PU1NTU09TU1NTU1NTU1NTT09PT0tLS0tLT09PU1NTU1NTU1NTU09PT09PT0tLS0tHR0s+Sd2hfXk9XZ01LRks9ODc2NTk5OTw+OT88Qzo7PDc5PD07OTc5Ojw9QDs+PT47PD48PT5BQD5EQ0NDP0E9Ojs9QkNFQ0NEQT9FSEpJSky61dPT09TU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8rKysvLy8vLy8vLy8zLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMzMzMzMzMzMzMzMzMzczMzMzMzMzMzMzMzMzMzc3Nzc3Ozs/Pz9DQ0NDQ0dHS0tPT09PT09PT09TU1NTT1NTU1NTU1NTV1dXU1NTU1NPU1NTU09PT09TU1NTU1dTU1NTV1dTU09PT09LS0tLS0tLS09PT09TU1dXV1dbW1dXV1dXV1tbW1tXV1dXV1NTU1NTT09PT09PT1NTU1NTU1NTU1NTU1NTU09PT09LS0tLT09PU1NTU1dXV1dTU1NTT09PT09PT0tLS0dHRmn5nYWJOVWpKSElLPzw6OTM3Njc2PTs+Oj06Ojo4ODo7Ozg4Ojs7PD46PT09Ojw/PD0/QkA/Q0RDRD5APT08QENEQ0JEQkQ+REhJSUtMttfT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3MzMzMzMzMzMzMzMzNzc3NzczMzMzMzMzMzMzMzc3Nzc3Ozs7Pz8/Q0NDQ0NHS0tLT09PT09PT1NTU1NTU1NTU1NTU1NTV1dXV1NTU1NPT1NTU1NTU1NTU1NTU1dXV1NXV1dXV1NTU09PT09PS0tLT09PT09PU1NXV1dbW1tXV1dbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1NTU1NTU1NXU1NTU1NTT09PT09PT09PU1NTU1dXV1dXV1dTU1NTU09PT09PS0tLR0p+DaV9kU1hsSEhIS0A9Nzg0NzY6Oj87RDw8Ojw8OTg6OTo6Ojs8Ojo7OT49Pjk9QDs/QUFCP0JCQUM9Pz8+PEBCRUNDQkBBO0ZJR01MSbLY09TU1NTU1NXV1dXV1dXV1dXW1tbW1tbV1dXW1svLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzM3Nzc3Nzc3Nzc3Ozc3NzczMzMzMzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc3Mzc3Nzs7Ozs7Pz8/P0NDQ0NHS0tLS09PT09PT09TU1NTU1NTU1NTU1NTV1NXV1dTU1NTU1NTU1NTU1NTV1NTU1dXV1dXV1dXV1dTU1NTU1NPT09PT09PT09PU1NXV1dbW1tbW1tbW1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTV1NTU1NXV1dXU1NTU1NTT09PT09PT1NTU1dXV1dXV1dXU1NTU1NTT09PT09LS0tSjiGxfZlJWakdIR0lBPjM2Njo7PDhDPEJBPjtBPDg5Ojw6Ojw8PDk8PTo7PD09PD89QD9AQT9AQUBCPD4+PzxCQ0NDRkBBQT1ISklOTUeu2NPU1NTV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbMzMvLy8vLy8vLy8vLy8vLy8vMzMzNzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzs7Ozs7Oz8/P0NDQ0NHR0dLS0tPT09PT09TU1NTU1NTU1NTU1NTU1NTV1dXV1dTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dXU1NTU1NTT09PT09PT1NTU1NTV1dbW1tbW1tbW1tbW1tbX19bW1tXV1dXV1dXV1dXV1dTU1NTU1dXV1dXV1dXU1NTU1NTU09PT09PT1NTU1NXV1dXV1dXV1dXV1NTU1NPT09PT0tLWroprY2VSWGhMSkdJQjg0OTQ6Ozo5QDk+Q0U/PDw5OTk9Oj07PDw6PTw7OTw9Ozs/PUA9PT5AQD9CQT5APD05QERDQkFBQj48SEpLTU5IqNnU1NXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbWzMzR09PT09PT09PT09PT087Ky8vLzMzMzMzMzMzMzM3Nzc3Nzc7Ozs3Nzc3Nzc/Pz8/Pz8/Pz8/Pz9DQ0dHR0dHR0dHR0dHS0tHV2djY2NnZ2dra2tvb29vZ2dnZ2dna2tra2tra2tjW19fX19fX19jX19fX19jZ2NjY2NjY2NjZ2dnZ2NfX19fX19jX19fX19fW1NPT09PT09TU1NTU1NXV1dXV1dXV1dXV1dXW1tbX1tbW1tbV1dXV1dXV1dXV1dTU1dXV1dXV1dXU1NTU1NTU1NTU09PU1NTU1NXV1dXW1dXV1dXV1dTU1NTT09PT09PS1bqKa2hoUlhlSUlMTkA5OTo0O0E8Nz05QUM9QD89ODo6Ozk9Oz4/Ojs8PDo7PDo7Pj1APT8/P0FAQUE/QTw8Oz5BRENBREA9PElJSk1ORqPa09TV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbW1szNhG1wcHBwcHBwcHBwcGqn493d3t7e3t7e3t7e3t3S0NDQ0NDQ0NDQ0NDQ0ci5ubm5ubm5ubm5ubq6t6WkpKSkpKSkpKSkpKSnhmBjY2NjY2NjY2NkZGRlhIuKioqKioqKioqKioemuri4uLi4uLi4uLi4uLepp6enp6enp6enp6enpq65uLi4uLi4uLi4uLi3vdPT09PT09PT09PT09PT2+Li4uLi4uLi4uLj4+Pi2NfX1tbW1tbW1tbV1dXV1dXV1dXV1dbW1dXV1dXV1dTU1NTU1NTU1NTV1dXV1dXW1dXV1dXV1dXV1NTU1NTT09PT09XDkXFrak5TYkxMVk08Ojo3Nz5DPjg+Oj8/QTw/QDc7Ojs7PTs+Pjo7PD48Oz07PT8+QDw/Pz1AQEBBPj88PjxAQUVCQkZAQD9HSEpLT0ae2tXV1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19fMzk4mKysrKysrKysrKysiivTr6+rq6urq6urq6uvp1dLS0tLS0tLS0tLS0tTEqaqqqqqqqqqqqqqqq6aGhIWFhYWFhYWFhYWFik4MEhISEhISEhISEhIRE0pUU1NTU1NTU1NTU1NPg6ejo6Ojo6Ojo6Ojo6OghoSEhISEhISEhISEhIKSpaOjo6Ojo6Ojo6OjoqvT0tLS0tLS0tLS0tLT0d/q6uvr6+vr6+vr6+vr6dnX19fX1tbW1tbW1tbW1dXV1dXV1dbW1tbV1dXV1dXV1dXV1dTU1NTV1dXV1dXW1tXV1dXV1dXV1dXU1NTU1NTU1NPUy5h2bGlKTl9NUlVNPjw8Nzs/Qz42Ojc+Pzs8QkA4PDk9Ozw6PD07PTs9Ozs9PD0+PT07QT08QUBBQT08Pzw7QEJDQURFPUFAQ0ZLS09GmNzV1dXV1dbW1tbW1tbW1tbW1tfX19fX19fX19fXzc5SKzExMTExMTExMTExJ43z6enp6enp6enq6unq6dXS0tLS0tLS0tLS0tLUxaqrq6urq6urq6urq6yoiIeHh4eHh4eHh4eHh41SEhgYGBgYGBgYGBgYFxpOWVdXV1dXV1dXV1dXU4WopKSkpKSkpKSkpKSloomHh4eHh4eHh4eHh4eFlaakpKSkpKSkpKSkpKOs0tLS0tLS0tLS0tLT09Hf6urq6urq6urq6urq6unZ19jX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dXV1dXV1dXU1NTU1NTU1NGcenFpSlRdT1JVTkQ+Pzs/QEA4Ojs4PDw8PD46Ojs4Ozk5Ozw7Ojw5Ozs8Ozo9PT0+PUE/Pj8/Pj08PT88PEFBQ0FERTw+QEVGSktNRpPc1dXV1tbW1tbW1tbW1tbW1tfX19fX19fX19fX183PXDk9PT09PT09PT09PTWT8Ofn5+fn5+fn5+fn5+bV0dLS0tLS0tLS0tLS08Wtrq6urq6urq6urq6vq46NjY2NjY2NjY2NjY2SXSInJycnJycoKCgoKCcpWmNiYWJhYmJiYmJiYl6MrKmpqampqampqampqaeQjo6Ojo6NjY2NjY2NjJqqqampqampqampqamosNLS0tLS0tLS0tLS09LS4Onp6enp6enp6enp6enn2djY2NjY19fX19fX19fX19fX19bW1tfX19fW1tbW1tbV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbV1dXV1dXU1NTU1NTWo3txZElbYE5OVU9AQT89REI+Oz06OTs6PTw7PDs6OTg5OTs8Ozw8Ojo7PDo7QD08PTxAQTxBQTs7PEA/PD1CP0RDQ0U8PkJERkpMTEWN3NXV1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjNzcXCw8PDw8PDw8PDw8PCydDPz8/Pz8/Pz9DQ0NDQz87Ozs7Ozs7Ozs7Oz87NzMzMzMzMzMzMzMzMzMvJycrKysrKysrKysrKysfCw8PExMTExcXFxsbGxsvMy8zLzMzNzMzMzMzLz9HR0tLS0tLS0tLS0tLS0NDQ0NDPz8/Pz8/Pz87Q0dLS0tLS0tLS0tLS0tLU1NTV1dXV1tbW1tbW19nZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NfX19fX19fX1tfX19fX19bW1tbW1tbW1tXV1dXV1dXV1dbV1dbW1tbW1tbW1tXV1dXV1dTU1NTU169/cF5GXmJQUVdOR0ZDQ0lBPz07PDo8N0BBPD04Ojo4OTg7Pzs8PDs7PDw8PD87PD46Pj44PkI8Pj1BPjw+QkBERUNAPD5APkNJSUtEh9zV1tbW1tbW1tbW1tbX19fX19fX19jY2NjY2NjYzs3P0NDPz8/Pz8/P0NTQ0M7MzczP09LSzs3P0s7Ozs7Ozs7O0dTPz8/T08/Pz9PSz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0NDR0dHR0dHS09PU1NTU1dXV1tbW1tfW1tbX1tfX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dbW1tbW1tbW1tbW19fW1dbW1tbX19fX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjX19fX19jY19fX1tbW1tbW1tbW1tbW1tbW1dbW1dbW1tbW1tbW1tbW1tXV1dXV1NTV1di4gm9XSl9jUlFaS0hBQTxCPT07Oj4+PD4/PT0/ODk6OTk3OD48PD47Ozw7PDs/PT0+OTs7OT0+P0A+QD07OkI/QkNCPz0+QD5CRUdKQoDc1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2M7Ozs7Ozs7Nzc3Nzsqfys3Nzc3QuYOEi8fTwJrLz87Ozs7O07udz9DQoZbL0seSq9HOzs7Ozs7Ozs7Ozs7Oz8/Pz8/P0NDQ0NDQ0NDR0dHR0tLT09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbV1dXV1dbW1tbV1dXV1dXV1NTU1NXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NfX19fX1tbW1tbW1tbW1tbW1tXV1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXYwIBuVU9gY1dZW0xMQ0A9PTs9Ojw9Qj5CQkA8Ojg5ODo6Ojc7Pz4/PDw7PDo5Pzw8PTg5PD9BPj09PUFAPTtBQkBCQz47QD9BQUlHSkF629bW1tbW1tbX19fX19fX19jY2NjY2NnZ2djY2dnOzs7Ozs7Ozs7OzdKpj63Rzs7Ozpu3tqSiwJOerNPOzs7O0rWVm7PWp6Crn8+ZrJqy0s7Ozs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0dHS0tLT09TU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dbW1tbW1tXV1dXV1dXU1dXV1dXV1dXW1tbW1tbW1tbW1tfX19fX19jX19fY2NjY2NjY2djY2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2dnY2NjZ2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV18h/b1pTYWVeXVxPSkQ9QD8+PDc6Pjk/RD5AOTg3ODk7Ozw4OT89PTw9PD47OkE7OTs5OzxDQDw7PT5AQT49QkQ/QkM9PT8+Pz5ISUg/ddrW1tbX19fX19fX19fX2NjY2NjZ2dnZ2dnZ2dnZzs7Ozs7Ozs7Ozs/Inrym0tDQzsqgl36Cw6abr6fUz8/Pz9GfoKqvypyWkKG0lYadnM3Pzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dLS0tPT09TU1dXV1dXV1dXV1dXV1dbV1dXV1dXV1tbW1tbW1tbV1dXV1dXW1tbV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2djY2NjY2NnZ2dnZ2dnY2NjY2NfX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dbV1dXV1dfNiHNdWGloXl9gT0lGOkFAPj88PDk2P0I/Qjo2NDc6Ozo8Ojk+PD49PTs/PTxBPjw8Ojw8PTw6PEA9QEI+PkFCPUNDPT0+Oz9BRUtIQHDZ1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2c/Pz8/Pz87Ozs7SrKWnqdXAvNLHnY+ey9PJipmq1M/Pz8/RxYeas7+boKiZtb/Jl5nF0M/Pz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0dHS0tLS09PT1NTU1dXV1dXV1dbW1tbW1dbW1tbW1tbV1tbW1tbW1tbW1dXV1dXV1dXW1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnY2NjY19fX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0JB1W1tqaWFeXVNOSTxDQEE+QD46OEVAP0M6NzQ5Ojo5Ozs4Oz0/Pj49QT08P0A9Pjw8PDw8Oj1AQD8/PT5CQD9AQkA8QD0+QUVLRz9r19fX19fX19fX2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnPz8/Pz8/Pz8/QzJ2Nl6zQmpfKxZ6ynpbN1q2ZqtTPz8/Pz9anmbLMo6CLn8TTkZmhz9DQ0M/Pz8/Pz8/Pz8/Pz8/P0NDQ0dHS0tLT09PT1NTU1NXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX19fX19fY19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tKUcl5ea2tqZV1PTEc/RENDQDo9OzxCPD09OTY0Ojk5Ojo5Nzs/QDs8PUA8PEE+PD07PTw/PDo8Q0A+PTs9QD5CPkBBPkA9QD9GSUQ/ZtXX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2traz8/Pz8/Pz8/P07GigJuvyaCjv8qcpYynrdiqmarUz8/Pz8/VpZmx2ZjHyZTYraO/ntXR0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1NXV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dbW1tXW1tbW1tbV1tbW1tbX19fX19fX19fX19fX2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbSk3BgXnBoZmVaUUhHQkVDQEA3Ojo8Pjo8OTc2NTk6Njo8Ozc8QEA8Ojo9Ojw/Pj08OUA8PDo6OT9APT08PUBBQz9APz5BOz9ARkpCP2LS2NfX2NjY2NjY2NjY2dnZ2dnZ2tra29vb29vb28/Pz8/Pz8/P0M6fkGyclteqo9PSrqa1mJ/Vqpmq1M/Q0NDQ1qWZs8iclZWku82IlZ7I0tHR0NDQ0dHQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1dXV1dbW1tbX19bW1tbW1tbW1tbX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfW1tfX19jY2NfX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX1tbW1tbW1tbW1tbW1tbX19fX19fW1tbW1tbX0pNuYFxxZGdkWlVKQENGQ0FBODs/PD07PDw3NTU4OTY4Ozo5PDo+Pzw9PTk8Pz49Ojo+OTw6Ojg+Pzw9PTw+QEFDQT48PDpCRERKRkJd0NnX19jY2NjY2NjY2dnZ2dna2trb29vb29vb29vPz8/Pz8/Pz9G9n8O31pfA09HQ0srSzZeb1KqZq9XRz9DQ0NWlmrexmq+znaXQ26OZtdXR0dHR0dHR0dHR0NDR0dHR0dHR0tLT09PU1NTV1dXV1tbW1tfX19fX19bW1tbW1tfX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19fY2NjY2NjY2NjY2NjY2djZ2dnZ2dnZ2dnZ2dnZ2drZ2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fX19fX19fW1tfX1tbX19fX19fX19fX19bW19GRbF1cb2doYl1PRj9ISEdFQDw8Pj48PT08NzU2Ojk2OTs6Ojs4QD86PDw5PD49Ozs6Pzk/Ojs5PT49Pjw7PTxAQ0I/Pz47Q0ZGR0hEWc3a2NjY2NjZ2dnZ2dnZ2dna2trb29vb29vb29vb0NDQz8/Pz8/Pz5V+e6WS1KKa08ySl6ObodirmavV0pem09DVpZm3sZ6bopyckaeYnrvV0dHR0dHR0dHR0dHR0dHR0tLS0tLS09PU1NTV1dXV1tbW19fX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tbX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2tnZ2dnZ2dnZ2djY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX1tfPjGRWXnBrXGBgTkVITUlJT0M+OkI9PUBDOzU1Nzw6Nzo7Ojo7OT09OTo6OT0+Pz07OT47PDo8Ozk+PD47PD0+QENCPz5BPEFDR0ZGRVXJ29jY2NnZ2dnZ2dnZ2dra2tvb29vb29zc3Nzc3NDQ0NDQ0M/Pz9DR1aeZrcmjqL7KnbGdo7XZqZup2LirocfS1qOassmdqKGjnqiiqZ3Q09LS0tLS0tLS0tLR0dHS0tLT0tPT09PU1NTV1dbW1tbX19fX19fX19fX19fX19fX19fX19bW1tbW1tfX19fX19fW1tbW1tbW1tbX19fW1tbW1tbW1tbX19fX2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2djY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fX19fX19fX19fY2NfX19fX19fYzYZdV2JvZE9dVEtIRlNRS0xAPj1EPD9DRj01NTc7OTY6Ozo8PTo7Pzo6OTg6PT0/Pjs/Oz49Ojs5Pjs9PD0+QURCQD8+PzxAQUVHRURSxdvY2dnZ2dnZ2dnZ2tra2tvb29vb3Nzc3Nzc3NzQ0NDQ0NDQ0NDQ0NO5gL3Tm5bP1LWLkZ/T1LyBu9TOlKDT0dW1gsPXr42RpdSako6+1tLS0tLS0tLS0tLS0tLS0tLT09PT09PU1NXV1dbW1tfX19fX19fY2NjY19fX19fX19fX19fX19fW1tbX19fX19fW1tbW1tbW1tbW19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2tnZ2tra2tra2tra29ra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2NfX2ct+WlVqaltMX01KTEpVTEZCPDw/R0VHS0g9NTU3Ojk3OTo7Ojw9OT45OTo4Oz0+PkE+PTk8PDo9Pj46PTk5Oj9FQUA+PT8/QkBHRURFUMHc2dnZ2dnZ2dna2trb29vb29vb3Nzc3Nzc3dzc0NDQ0NDQ0NDQ0NDQ0cHR0crI0tDUxLjS0tHSwtLQ08fM0tHR0cLU0tXAvdbU07nI1dLS0tLS09PT09PT09LS0tPT09PU1NTU1NXV1dbW1tfX19fX19fX2NjY2NjX19fX2NfX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29va2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2djY2NjX19fX19fY2NjY2NjY2NjY2NjY19rHd1xSZ2laTlpOTFBRV0VKPz89P0FFTExBPjY3NTs4ODk5Ojs8Pjw+ODo6OTs+P0A9Pj46NTo6Oz0/Ojs5Ojw+QkJAPz8/P0FCR0RDRE683dnZ2dnZ2dna2tvb29vb29vb3Nzc3Nzc3d3d3dDR0dDQ0NDQ0NDQ0NDS0NDR0dDQ0dPU0dHR0dPR0dHS0tHR0tLU0tLS1NXT09PW1NLS0tPT09PT09PT09PT09PT09PU1NTU1dXV1dbW1tfX19fX2NjY2NjY2NjY2NfX19jY19fX19fX19fX19fX19fX19fX1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tvb2tra2tra2trZ2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2trZ2tra29ra2trZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjbwXNYVWlrU0xSTlBSWVRGSTw+Qz9BQkVKPj43ODY5Nzc4OTk7Oz0/QDw9ODk7Ozs/Pjw8OTU6PT47OTk7PD8/P0JCQT1BPUBBQkZCQkJLtd7Z2dra2tra2tvb29vb29vc3Nzc3Nzd3d3d3d3R0dHR0dHR0dHR0dDQ0NDQ0NDQ0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tPT09PT09PT09PT09PT09TU1NPT1NTU1NTU1NXV1dXV1dXW1tbX19fX2NjY2NjY2NjY2NjY19fY2NjX19fX19fX19fX19fX19fX19fX19fW1tbX19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2NjY2NjY3LxvVFRsbExLUkpUUlVLRkQ6PkdEREFERjw/ODk6OTY5OTo3PD07PkA9PTc5Ojs5Pjs5OTY2Oj1AQT47PDk6Pj9DQT4/Qj0+QkNFQkFCSrDe2dra2tvb29vb29vb29vc3Nzc3Nzd3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0tLS0tLS0tLS0tLS0tLS0tPT09PT09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1tbW1tbW19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19fW1tbW1tfW19fX19jY2NjY2NjZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2dnZ2dnY2Ny2a1NbcGtLVVdSXFFXSEQ+PEJKRT1ISj89PDc4ODo2OTg5Njs+PD1APDw1OTk8Oj87OTk0ODw9PUFBPD47Ojw+QD89PkE9PUNGR0I/Qkmq39ra29vb29vb29vb3Nzc3Nzc3N3d3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHS0M/U0M7P0tLT0tLS0tLS0tLS0tPT09TU1NTU1NTU1NTU1NTU1NTU1NTU1NTV1dXV1dXV1dbW1tbW19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19jY2NfX19fX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dndsGRTYXJfT1pUV19RUkdCPUVJS0FBTEQ/Pzs5ODg5Mzg2ODY5Pj0+Pz06Njo7Pjs9PTo5Njg6PTtAQDxAPz0/P0I+PD48PEJFSElCPkNJpODa29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3t7S0tLS0tLS0tLS0dHR0dHR0dPT0bm7zLqbnLrQyNPT0tLS09PT09PT09PU1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2NjZ2dra2tra2tra2tra2tra2tra2tra2tra29va2tra29va2tvb2tra2tra2tra2tra2trb29vb29va2tra2tra2tra2tra2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ3qpfVWBuW1VZUVpeT0xHQ0ZNSUZEREk7QUE7PDg4NjU4Njk4Nzw/QT89Ojc8Pz48Pz87OjY4OD09QEE9QD5BQD1AOjs6Pj1BRUdKQkBDR57h29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e0tLS0tLS0tLS0tLS0tLS0tO+wMqaoKKViJGeqpOpz9TT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fY2NjY2NnZ2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dna2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2tvb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2d6iXFVeblheXU5aUFROQ0NMSUlJRklEPEJBPDs4NzY3OTc3OTk9P0E/PDo5QD88PkI/Ojg3NzY9P0BAPUBBPz88PTs7OD48P0VJSEE/Q0aX4dvb29zc3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3tPT09PS0tLS0tLS0tLS0tTIlZyum5m1iX2TjIKBhMTV09PT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tvb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dndmlpYYW5ZYVdPV01QRUJETElNS0ZJRT5CRDk4ODY3OTc1Njk4PT1BPjo4OT4+PD9APzw1Njc2PD4/PjtAQEA/Pj4/Pjs/PkFCRkdCQENIkeLb29zc3Nzc3d3d3d3d3d3d3d7e3t7e3t7f39/U09PT09PT09PT09LS0tLTz6h+kayPko6MhoCIiYSQo8rU09PT09PU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY19jY2NjY2NjY2NjY2NjX19fX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2tra29vb29ra2tra2tra2tna3JJaWWNuWlpSVV5QTDxAR05IUklIRT48SEY4OTc1Nzg3NTg5ODs+Pj07ODlBPj1AP0E+NzU5Njs+QUI/P0BAQUI/Pj8+QUBEQUZIQj9FSozi3Nzc3Nzc3d3d3d3d3d3e3t7e3t7f39/f39/f1NTU09PT09PT09PT09PWtaWaiIuQhYCFi4iBg4qLf4bC1tTU1NTU1NTV1dXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2dnZ2dna2dra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29ra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb2tra29uIWltnalxYTFpfVkg6TEhMSkpDRUVDQExINzo3Njc4ODU4Nzg5PDw7Ozk4QD89Pj8/PDY3PDQ3P0JCQUBAPz8/QT09P0A+QEBGRT09REuI4tzc3Nzd3d3d3d7e3t7e3t7e3t/f39/f39/f39TU1NTU1NPT09PT09PUxZKCg4WGfYGCfXx5foGCg36k29bU1NTU1NTV1dXV1dXV1tbV1tbW1tbW1tfX19fX19fX19fX19fX19jY2NjY2NjZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vc3Nzc3Nvb29vb29vb29vb29vb2tra2tra29vb29zb29zb29vb29vb29vb29vb29vb29va2tvb29vb29vb29vb29vb29vb2tvZgFpebWhaU0ldW1hKRE1ISlNMR0ZBQD9KQjg7NjY5OTc1ODY4Ozo7Ojw5OD09O0A9Ozo2NTw3Oz1CQEFBPD49QEE9PEA/Pz5CREU+PERLg+Lc3d3d3d3d3t7e3t7e3t7f39/f39/f39/f39/V1dTU1NTU1NPT09PT2LKEkKh9g3l2hIh/e3d5gn5+i67A1dTU1NXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dna2trZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2trb2tra2tvb29vb29vb29vc3Nzc3Nzc29vb29vb29vb29vb29va2trb29vb29zc3Nzc3Nvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc1nlcWmxmWFJPYFFSQUhHSkZYTEZAQENDS0A7Ozc4ODc2NTc2ODo5PDw6PTs/PTs9Pjw7ODg8OT0/QkFCQzw8P0FCPj1BQkNCREVDQDtDTH3h3d3d3d3e3t7e3t7e39/f39/f39/f39/g4ODg1dXV1NXU1NTU1NPU0ruen3WKeXuIgICChYGDcnOAhYOMrNfV1NXV1dXW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NnZ2dna2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra29vb29ra2trb3Nzc3Nzc29zc3Nzc3Nzc3Nzb29vb29vb29vb29rb29vb29vb29zc3Nzc3Nzc3Nvb29zc3Nzc3Nvb29vb29vb29vb29vc3Nzc3Nzc3Nvb29vb3dByXV9wZVdLUGNPS0JHQ0pIS0ZBPEE+SFBBOjo3Nzg3Njc4Nzw6OD09PD47QD88Pz07Ojs5Ojk8QEJAQkNAPUFAPz1AQkNDQUBAP0A7RU144N3d3d7e3t/f39/f39/f39/f3+Dg4ODg4ODg4NXV1dXV1dXV1NXU18h4i4V8goh6g4SBfoKCc2l0hYuGkJ3U1tXU1dbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tvb2tvb3Nzc3Nzc3Nvc3Nzc3Nzc3Nzc29zb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb297KalxjcWVST1heSz9HTElPS0VAPkFBP0pPPjk6NzY7NzY6Ozc7Ojg6PDw+Oz09Oz48Ojs4OTo4OUFCQkFAQDtAQj06PkFCQz8+PT4/PUZOdN/e3t7e3t7f39/f39/f4ODg4ODg4ODg4ODg4OHV1dXV1dXV1dXV1s6dhpl+f5OTin+CgXx9gnNxm4mAgoOJwNnat7TQ19bW1tbX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tra2tra2tra2tra29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NvfwGNaW21gVlBTU0pETEhNSEk8PkFDQ0ZORDw8OTc5OjY4Ozk3PDk4OTw9OzlAPjpBPzw3NTc7ODpAQUVBPz45PUI/Oz1CQkI6Pj07PT5GTnHe3t7e3t/f39/f39/g4ODg4ODg4ODg4OHh4eHh1tbW1tbW1tbV1tjLioCHhYOXjHh7e3lvfYF1a3ebdHZ7eInHxpiMrdjZ19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2drZ2dna2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tra29vb3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29zb29vb3Nzc3Nzc3Nzd3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3Nzc3Nzc4LdjV1lrYlJNVVFMSktGS0ZDQD5CQT9FTT4+PTg5OTo3OTo3NT03Nzo+PDs7Qjw5Pz05NjY4PTk6QEJGQD49PEBCREA9QD9DO0A9PD4/Rk9t3N/e3t/f3+Dg4ODg4ODg4ODg4OHh4eHh4eHh4dbW1tbW1tbW1tfVrYZ6d32rn3l4entzdH+Dfm9xe3l6c3t2k4qFgImkzdnY19fX2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tna2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29vb29vc3Nzc3N3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vc3Nzb3Nzc3Nzc3N3d3d3d3d3d3dzc3Nzc3Nzd3d3c3Nzc3Nzc3N3d3d3d3d3d3d3d3dzc3OGtYVtebGJSTVZMTUdLS0RGQkI7QT08RUxCQT44Ojk6Nzc5NjY6NTs+QDs9Oz89PD89Ojk5Ojw5PEVDRkA/PkBDQkQ9OT0/QT1CPz1APkdPadvf3t/f3+Dg4ODg4ODh4eHh4eHh4eHh4eHi4uLW1tbW1tbW1tfQmH+Qh4N9eoN2e3Vzenl6kKqmd3JyfoeHh4CAfoKEhJHJzNnX19jY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra29va2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2djY2NnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vb3Nzc3N3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzb29vb3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3dzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3NzhpV9UYm1iUE9TSUhHRkpJSUJBPkJCPEVFREA+ODo4Ozc3Ojc4ODY+Pz07PDk9PDo+PTs6Njc7NjpEQUY+Pz8/PkNBPzs9PT47REM/PjxIT2fZ4N/f3+Dg4ODg4eHh4eHh4eHh4eLi4uLi4uLi1tbW1tbW19jYyH52doN+fnR2eIaCenl1d5yhu6GEgoCAfoeKinx/gYaMnKjO2NjY2NjY2NjY2djY2NjZ2djY2NjY2dnZ2dra2tra2trb29rb29rb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3d3d3d3c35pbT2drXFBRUElDT0pLR0xHSkJAP0JHREBBPDg8ODg1ODk3Njc3QEA/Ozw5Pj04PTw8Ojc4PTk/RENGPkE/QkBDPzw6Pj0/PkVEPz07S1Fj1+Hf4ODg4ODh4eHh4eHh4uLi4uLi4uLi4uLj49bW1tbW19XB3LRueHJze3B6eXaFiIR7eH2AgZiljH98fnuRhZaLhoGDgY6Rvd3Z2NjY2NjZ2dnZ2dnZ2dnZ2dnY2dnZ2dna2tra2trb29va2tva2tra2trb29ra2tra2tnZ2dnZ2dnZ2dnZ2dna2trZ2dnZ2dra2tra2tnZ2dnZ2dna2tra2tra2tra2tra2tra2trb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t3d3d6NWFdobllQUUtISlNJTUhNSUtBQz9DRkJBRDo6PDg2NDg4NzY2Nj8+Pjo8OTw7Oj09PDw4Ozw8RERERT4/PkI+Qj84PT8/Q0NCQEE+O0xUY9Xh3+Dg4OHh4eHh4eLi4uLi4uLi4uLi4uPj4+PW1tbW1teslLZ6eHJvd5V7dHuLgHh1bn6Fg3t/hYhyfH2bnI6JioJ+g32Hk5rH1NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2trb29vb29vb29vb2tra2tra2tra2tra2tnZ2dnZ2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2trb2tra2tra2tra2trb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d7Zf1lgaGxcUUtHR09LTk5PTURGQkg/Q0hEREA6Ozs4NzU3Nzc4NThAPkA7PDk8Ozw+Ojk7OTk7OUZERUI8QD4/PEBDOz5AP0A/Qj8+OjtKVWPV4eDg4eHh4eHi4uLi4uLi4uLi4uPj4+Pj4+Pj1tbX19vKhYR3cXJubniVhHt4hH95dnB4c3eLkY6CdnN9ioaId3d1d4ODfIiIk8Pb2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2trb2tvb29vb29vb29vb29rb2tra2tra2tra2tra2tnZ2dnZ2dna2tra2tra2tra2trb2tra2tra2tra2tra2trb29vb29ra2trb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f0nVZaGlqVk5KSE1OR01EUElGSD9FPUZMREM+Ozs8OTc3OTY2OTU4Pj4/PTs8QDs9PDo3Ozc5OThHREVCPUE9Qj8+QDw/QUE/QEJAPjs8S1Ri1OLg4eHh4eLi4uLi4uLi4+Pj4+Pj4+Pj4+Pj49fX19fEknuJf29sbnV2foSBg4qGfnVybWVtiIaKjoR7c4OHint4e4OPj4GEioqxztrZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29zc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tvb2tvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3dzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f3t7e4clsW2pqalNOR0hOT0VIRk1JSUA7RD5ISUA9PDo6Ojg2ODo3Nzk0OD08PT07ODw8PDw4Njc4OTo6RUJFQT9APEI/Q0M+PkNEQUBAP0A8PUtRYdPj4OHh4uLi4uLi4uPj4+Pj4+Pj4+Pj4+Pj5OTX19fZqXaFfnx3bHB3eXh8jH2KhYB3anN0d3p9bot7fnl6foR/gIGDfnh8foeGlrbT2tnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra29ra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/e3uO9amFpa2lRTkZNTEtKWE1OR0FAQE9BRD9AOzw4OTk5Njg2NjY4NDs+PD07OTY6Ojk6OTU4OTg5OkJERj8+Pj5AQEBCPzxBQD88Pj9BOT5KT17S4+Hh4eLi4uLi4+Pj4+Pj4+Pj4+Pj4+Tk5OTk19fX2sqKhIB5c29tcXN1d4CUeHaAfHWHhXd1cnWgmXp7d3Z5doR0bWxue3iAmouTu9za2tra2tra2trb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc29vb29vb2tra2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f397js2lpbmloUFBPTExPUk9LU0Y/RURERD48PDg7ODc5OTU2ODY2NzM6Pjs+PTc6Pjk5OTk2Ojo4NzxDRUc/Pzs/PkA9PkE9Oz0+OUFAQDhBTlFc0OTh4eLi4uLj4+Pj4+Pj4+Pj4+Pk5OTk5OTk5NjY2NjauY6AenZ1bmpveHCBfWt0cnZ3hIV5h4d5lY55eXp1d3pza298gHx2fYh8gLLe2tra29vb29vb29vb29vc3Nzc3Nzc3Nzc3dzc3Nzc3Nzc3Nzb29vb29rb29vb29ra2tra2tra2tra29va29vb29vb29vb29zc3Nzb29vb29vb29vb29vc3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3t7e3t7e3d7e3t3d3t7e3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/f39/f4qpqa2hrZFNQT0ZQVFJOSFJLPkREQ0I7Ozk6Ojg2Nzg1NjY4ODg0Oz88Pzw5PDw3Ozo6Nzo6Nzo9Q0JDPUE+Pzw5PT5BQDs8PDtFQD47Q05TXNDk4eLi4uLj4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTY2NjZ1p5vdntveHh2cG50d3BwdHBzb36Jc3qGhY2EenNtcoB6hn1vg5OBdnx9g4a13drb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29ra2tra2tvb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4N/f3+KgbWhma2ZVVlJHUFFOS0xMRUJIRUc9OD08Ojo3Nzg2Nzc2NTY3NDg+PD09Ojg6OD46Ozc4Nzc6Oj5DRDtDQj49OD1AQUM/Pjw+RTw+PUJNUF/S4+Hi4uLj4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk2NjY3MB2doCCfnp4eHBsdXlya399bHNvdGdoaYB/aWl4c2d+iYl4cIKGe3d9foWKvd3b3Nzc3Nzc3Nzc3Nzc3Nzc3d3c3Nzc3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODflGttZm5mU1NJUFlUTEhGTkZGRUJGPTs+PDs5Nzc4NTc5NjQ1NzU4PDs9Pjo6OztAOTs7ODc6OTlAQkE8QUE/Pzk/QEJFQ0FAQEM7Oz1ES01g1uTi4uLi4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk5NnZ2tmYc3uqhJaCcnR1dn14aGx8d2h4d25rcHR5gIJ3dHyBhIJ9c3CAin94gn95g8je3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f4N/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh24tubWdzY1lRTVVbV0hDSUZOS0dCRD8/Qjo7OjY2NzU2NzY0ODc2Ozw7Pj86PDk8Qjg3OTo6Ojk6QUFCQUJDQEE+PT9CQ0NEQUJGOTg9REpOYtjk4uLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXZ2drcqHGCtXiRfnNsem6EgXaCfWtoan+DeHZ8dX2FhXRmcHl9d316gIqFe318foC03tzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3dzc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3Nzd3d3d3d3d3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e397e3t7e39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4ODg4ODg4tiFb3FrdWFWT1VVXE9ETUY+SkdKRUQ8P0I6PDk4Njg0NTY3NDc2NDk7Ozw7OD47PEE4ODo9OD04Oj09QEBAP0FCP0A+QENCQ0FBRTc2O0RMTmPa5OLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXl29ra3Z5sbnNxhY1ybXBuf391hH5rcnZ2enN4gXhzbnVwbWt2fHmFiIB/f392coODsd/c3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eDg4eHh4eHh4eHh4OLXhW1xb3ZeUldTWlpRSkhDQFFAQkQ8OT9BOjw5NzU3NDU2NjQ3NTY9PDo9PTk+OjxAODo6PDY7OTs+PUJCQjtBQkBDQEBEREM8PUA3OjxFS01l3OPi4uPj4+Pj5OTk5OTk5OTk5OTk5OXl5eXl5dPOxsB+cWxveHt2b3VuanNzbZKGeG50dG5vdIZ/b2twboJ0bXZyfY2DdnF/d3mKgabf3Nzc3d3d3d3d3d3e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3dzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t/f3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi1oZucG1xYFJZUFdfWUpMTElSP0Q9OTtCRjs6OTc0NTY1NzU0NjY2Pj07Pz45PTk7Pjg9Ozo0ODtAQENCQ0FCRkE/Q0BBQkREOz0+OTs8QkxNZODl4+Pk5OTj4+Tk5OTk5OTk5OTk5eXl5eXl5eW5t7Woc3JscHd6dHd4bXFydXd/hHRyc2xsa3F8bnBudGuBf3GAd32Eg355gHNygYqg2d3c3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh49WHcWxqbF5YWlVXYFZWUE9QTD1BOjs8RkE4Ojg3MzY1Njk2NTg1Nz89Oz8+OT04Ozw5PTs7NTo9Q0JCPENDREREQUE/PkJDQzw9Pjg5PENLS2PN0dnh1sjY4+Tk5OTk5OTk5OTk5eXl5eXl5eXltbW2q3J5cm59f3Z1d2hqaGlwb3Zta2tnZWZxdG15gG5teXd2iHhxa2podXV5dHV/wd/c3d3d3d3d3d3e3t7e3d3d3d7d3d3d3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHi4uHh4ePVhnFwY2lhV1NZV19MUk9STUtAPjg5O0E+ODc5NjQ3Njc6NjY2NDk+Pzo8Pzo/OTo6Nzo9PDk5PEFBPTtBQ0VDRkA+Pj5BRUQ+QEE3OD5GSEpesrW4wbm1u8jg5eXl5OTl5OXl5+fn5+fm5ebm5ra2tbWOfX5weoR1cnZnYmNlbGtyb2ZpbHZtd4Z9hXlsbHd4a3ZwfH14c3V5fHd2h7ng3d3d3d3d3d7e3t7e3t7d3t7e3t7d3d3d3d3d3t7e3t7d3t7e3t7e3t3d3d3d3d3d3d7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4eHj1Yd1bl5uY1pUU1hXS1NLSk1SR0E4Ozs+PDk4NzU2NTY2OTY4NjY5Pzw6PT07Pzo7Ozk8PDs5Oj4+Pjs8PUFEQkNBQEBBP0JDPDw9Nzs+REVKXrG1tLW2t7e2y9rJ3uXl3eDi3tXU1tPU4OPg39+2treuh3t/bnmNenJ1bWNobGxtaXR4enF5enqIh4N6aWh9cWRvcXyGgX55e318e4an2t7d3d3d3d7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4uHh49aGdmxhb19dV1lcWlJQSEpXTEVHPUA9Ozs9OTY0NjU1NTg2NzY3OD87OT09PDw5OTw6Pjw6OTg+Qjs7Pj5AREBDRUFAQD0/QDw9PTU5PEJHRl2xtbW2uLm5ubq9uMPT0r3BwcC6u7y6u8TMxb/Dt7e3hGl1gX1ndYd5Z3Vxa2t5eHB3fH15bWl3e3h3bml1j4FwbHl4d3d9gXuGgnmAoNze3d3d3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODh4OHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4ePXhXJrZ3RhW1hYX15TVVVRVUpMRj9JRDs5PTY2NDc3NTc4Nzc3ODk8PDo+PDg8Oj0+OTs8OTs5P0E8PT9DP0FARUJCQTw9Q0A6Pjw1NDlER0dasbW1tre5ubm5ubm3ubm4uLm5urq6urm5urm6u7e3uX9ucHN6b3B/eXNuc3Vsc3Z4cXFwb2tvcX6Bc2mHhIF9dHOHdW11hYmBgHJ2hafd3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uHj14lxa2xyW1dXXWBUUVVUUFJPSkNATUE9Ozk2NTM0NjQ2ODc3Nzk6Pjs8Pjs5PDo8PDk8PTw7PT0+PUNEREBDQkE/QD48PkE8OD06NjY6QkpIWLG1tLa2uLm5uLi5uLe3uLi5urq5ubi4uLi6uru3uKx7cnhxf3ZzfnBsbXpyZ29sbW50cHt3d3Jyd3pvhpJ2f3x8enZ5fH9zfYdyda3T393d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4eHh4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi49eHb2pxalVWV2FbT1FSUE5XSURESUo/Ojk6NzUzNDk1NjY2Nzg4Ojw7PD46PDo6PTw5PDw9Oz09PDs9REdEQ0E8PDw8Pj5AOzg8ODE1OkFGRVautbW1tre4uLm4uLi4uLe4ubq5uLi3t7i4ubq7t7mqcnB4d3x7e4J3aG5xam9qY2lyf21zcn54dHFsanaAeX2AgH91doB1a4qLgHaR1d/d3d7e39/f3t/f3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f4N/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLi4uPYhm1sdGVWUFxnWE1YU1JRWUVDS1BOOzk4ODc1NTM5NTY2NzY4Nzk+OT0+OTw5OTw7Njg5OTo8QEA9PkBGQEJCQDo+PEE9Pzs7OzYxNjxCR0RQqLa1tba2tre4t7i4uLi4uLm6ubi4t7e3t7e5ure2tIlyd3h9iXxwem99c2hqbGdnbHRscXd0cWx2c3Fxd3FyfHl4g3Z7d2mLkYp9kM7f3d7e3tvY2drZ297f39/e3+De39/f3Nvc3N3e3uDg3+Dg4ODf3t7e39jS397f397e3t/f3t7f3t/f3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLi4eLi4uLi4uLi4uLi4uLj4+Lj4+Li4uPj4+Pi4uLi4+Lk14NoZ3VkVlVkZVdKWllXW1Q9RU1LSD04NzU3NjQzOTU0Nzc1Njc5PTo9Pjw9PDk7PDk5Oj45PD4/PkFBQ0FFRUQ+OzxBPjw5PDs3Mzc+REhFSqG2tbW1tbW2tre4uLi4t7e4uLi3tra2tra3uLm2traLfXpsbHp/cGx5dm5qaGdlcXp4b2lvb3B1c21zd4Fnb32CgYNyf3lqcHJ6f6ng393Zy8a/vL2/vsLN0tDW3tnc4NfQzcPCw8PH1dfT2dzX1NjX0MfExce9vM/Kz87Y3djO3N3c2t3T0dze39/e397e3t7e4N/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eLi4uLi4uLf4uPi4eLg4d7W29/Sw8rJx9Hb3OLk4eHg2dre1sbExcTN2trf5OHi4trX3st9aWZxYVleZWFNTFRLUlpMO0hNSEZBPTc2NjUzNDY2NDg3NjU2OTw7Pj46Pjk5PDk3OTs7Oj49PEBAQ0RCR0ZCQT08Q0A9OTw7Nzc3P0RGRkaZtrS1tbW2tra4uLi4uLi3uLi3s7W2t7a3t7i5tba3opdxb29waW50dnFmZWNrbmdvcm1mZ2tygWVvdnyAeGRzj39zaHFyaWVlbm+w39HFv7u5ubm5ubq6uru6vc3Gw8e/urq6uru7u8HCvcHFvby/vry7urq5ubq6ubm6w8XDucDDwby/ube/z8/U3tjc3t/g3tLa4N/f4ODg39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eDg4ODg4ODg4ODh4eHh4uLi4eDh4uLi4uHa2t3RwsPCu8XT1uDdydPDrrnAsaqrq6uwtLbJ0sXRxLG4v7Srq6usr7S0vMzE1c60tLureGxtbWBdYl9ZS1NVVFFQREBRTUhEPzo3ODU3MzE0NjQ5ODU2Njo8Oz08ODw5Njo6ODg5NzU8PDw/QEFAQkRDQkE8PkI/Pz09PTc1OD5DRUNAj7a0tLW1t7i4uLi4uLm5uLe1sautr7Oxs7OztLS0tqaei2tue3ZxeXhnY2hfcXdha25vaG99b25ja2lseHdsa4Z+bHB6dm1scG95sca8uru7urm5ubq6urq6urq6urq6urq6urq7u7q7u7y7urq6ubq7u7q6urq6urq6ubi3t7i4t7e2tbW1tbi3u8e+w8XHzcS4wMnH0tzZ2d/e3uDf39/f4ODh4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh3Nji4uLi4eHh4OHg3tfGxtHQztTe3tPO0t/SuLi8sq2trKysrrG+ua63rKipqamqq6urqqqqq6ysuKyqqqqrq6urra6urq6urryzrayrpHlub21fXl1dVE1SU1xUSkE/UElIPjg5NjgzNzMwNDczNzg2NzY2Ojw/PDg5Ozo6Ojg5OjY1OTs8Pj9EP0NFQkNCP0BAQT9APjw3ODc6QUVEP4W4tLS1tbe4uLm5uLi3t7SurKuqqq2urq6vsLGzs7WjcG5ucm1wg311aWFlaGZkY2Rxc21td25naW1tZXBzb29zcXN8h4F6dX11n7u6uru7urq5ubm6urq6urq6ubq6urq5uLm5ubm6urq6u7q5ubm5ubq6ubm6ubm4uLi3t7e4uLe3t7a2tbW2tra1tbW1tba1t7e3t7rBvrzGycrb3+Dg3tvd3d7h4tDW4uHg4ODg4ODg4ODg4ODg4OHg4OHi0768zNjd3OLg0dnbxL23sLCxsa+zu7uzsLS9s66urq2tra2sq6qqqqmpqKmpqampqqurqqqqqamoqampqampqaqqqqytrq6urq6urq6sraR4aWJxZmFZWlZRUk5cU0Y9QlJEQTc8OzY5NTY1NDU2NTg3NTY1Nzg7Pjw7OTk5Ojg3Nzk3Njg8Oz47RD8/Q0BBREE+P0M9Pjw+Ojo3Nz9DRj54srCztLW2t7i3trKurq2sq6uqqaqtraysrq+xs7S1t4xucnRqaIB5ZmpmZWxdaG5waGxxYmNmcoJ+dmhobGpueoaBhXx4cXF5gK+6ubq6urm5uLm5ubm5ubm5ubm5ubm4uLe3t7e3uLm5ubm5uLe3t7i5ubi4uLi3t7a2tre3t7e3tra2trW0tLW1tbW2trW1tre3t7e3t7e3tre4v8bP0MS+v8DE19e8ydra4OHg4ODh4eDg4ODh4eDb3t7Uzby3tre6wMDJxLfIvrKwsLCwr7Cvrq6ur7Cwr66urq6uraytrKurq6qpqampqampqampqKmpqKmpqampqKmpqKmpqqqrraytra2ur66trK2heWpjbWdiXFhRUFFLVEpCOklRP0E3PDk0OjU2NTQ1NTU4ODY4Njs6OTw9PTs6ODY2ODg6ODY3Pj09PT5BQUVCQkNBQUBBOj09Pz05Ojc9QUc8bKqmqKutsLGwrqupqKqrq6mpqamrrKytra2usLO0tbilgIdvaWdzdGZrcG1qZGxvcm5rbWNrcHyJhG5qbHx4Y3uKfnNqc25rcY+7ubm5ubm5ubi4ubm5ubm5ubq5uLi4t7e3t7e3t7i5ubi4uLe2t7a3t7e3t7a2t7a2tra3tra2tbW1tba1tLS0tbW1tra2tra3t7e3t7i4uLe2t7a2uLm4uLe3uL6+uLq9vcfb4OHg2Nnd4eHg3dfKwcPCurm5uLe4uLi3tbS0tLKysbGxsLCvr6+vr6+vr6+vr66ura2srKyrq6yqqqmoqKmppqepqaehpaipqamoop+hoZyip6inqausrK2ur7Cwrq2unXdwbGphY2BZUU1RTFJGQzlNUEU+ODs3Mjc5Njc0NDM1ODg3OTc7OTo9PTw6Ojk3NDo5ODY1OD8/QEI9RENDQ0FDQEJBQDtAP0A/PDw6O0NIPWOopaWlpqioqKenp6ipqqmoqKipqqqsra6wsLCztLW1taWYdn5xZmt4cW9tZmVsaGNsZ2ZpaX11bWlvfXZ5hWZod294b3Fvcninu7m5ubm5ubm4uLm6ubm5ubm5ubi3t7W1tba2tre3t7e3t7a1tba2tre2tbW1tra3t7e2tbS0tLS0tLS1tLS0tLW1tba2tra2t7e3t7e3t7a2tre2tre3uLe2t7i4t7i4uLi4wMXTyry8w83PyMC9urm5ubq6ubi4uLi4t7W0tLSzs7KysrGwr6+vr66urq+vr6+uraysrKurrKysq6ehoJ6gn5udoaGdlpmkpKaon5mZmZmanZ+gn56fpKqtrq+ura2srJl1cGlrY2FeXVVOU0tSREQ4TktHQTo4NTI2OTY1NDczNzc3ODk3OTo7PT0+ODg4NzU6OTk1OD9AQEFEPkZBQkNAQkNCQT88QEJCQD0+OjpERj5cpqWmpqampqanqKenqKioqKenqaurrKytra2ttLS0tbekc311bnONf3JmanFjaW1jaGZobG51aV9jZ3VzdnpuZ3Bwcn56cYihu7m5ubm6urq6urm2s7a1uLm2trW1tra1tbW1tbW3tra3tra2tbW2tbW1tbS0tLa2t7e3tbS0s7O0tLW1tLS0tbW1tra2tra2t7e3uLe3tra2trW2tbW2tra2tra2tra3tra3uLi3uri4uLi3uLi5ubm5urq6urm4t7e3t7W1tLS0s7OysrKxsbCwr66urq6urq+vra2srKuppaSmpqScmZubmpmampmXl5eXl5aZm5iZmJmZm52en5+dnJ6gpKWko6OioqKQdG5jcGFeXltUU1RIVEo/PFFCRkM7ODYzNzo1NTQ4Mzg5OTc4OTc7OTs9Ozc6NzU2OTk4NTg+Pz9ART5CPz9DPzxBQUI/PT9EQT8+PTk9Q0Y/VaSlpqanqKeoqamop6ioqKioqKiqrKuqqaipq7W1tba5o3eKcXKHhnd0cGh5a2JjYWVsaW5zal9jZWNjZWprYmRqbHaXjX6ovbm3tre5u7u6uLWxrKurqq6wrKyrq62tq6uvsLGvr7CytbW2t7W1trW1tbW1tbW2trSvr7O0tLSvra6vsrW0tbW1tbW2t7e3t7e3t7e3t7e3t7Owsra1tLa2tre3tra2tbW1tra3t7e5uLi4t7e3uLi4ubq6urq5uLi3t7e1tbS0tLS0tLS0s7OysbCvr6+vr66vr62oo6KgnJqampqZmZqbm5qampqbmpmZmZiXl5aYmZmZmpycnZ+foJ+goKChoaCgoJ+fi3RuaXRdYGZeUlRLRFRJPUVTSEVCOzo0NDY5NDQ0NzM4ODg3ODk5Ojs7Pz04OjkzNTg5NjM5PT5AP0A6QEJCQkA/QEJCPz0+QUFCPz06PkVDQFGjpqWlp6inqauqqKaoqKipp6ioqKinp6ioqaq1tbe3t7KZtH99kIx1Z2lqbGZjYGNoZW94cGlicXx5cGpmZmRma3NqhYystrKwra2ttLeysLCtrKuqqaiop6ipqampqKinqKipqaeoqqurra2sqqysraysrq6traunpaSnqqyopKOkpamwsbGztbW2t7i3t7W1tre4t7e3t7Kppaasq6ivtLa1s7W3t7a1tbW2tra3t7e3t7a2t7e3t7m6urq5uLi3t7Wxs7S0tLKxsK6sq6yurrCxsK2rqqmqqKijnJqZmJmYmJiYmZmZmZmZmpqZm5ubnJybmZeYmpqcnJydnJ2foKGhoqKioKGgoKCfnop1amtuWVxhVktPREdVRz5PV0hEPTw4MzQ0ODQ1NDgyODk4ODk6Ojw5OUA8Njk6MzY3OTE0PD8/QEBBOkNGRUJBREJDQTo7P0FCQz9APUBEQ0BPo6empaemqKqqqqakpqenqKioqKimpqaoq6uttba3t7e4rbJ1cHuDdmBiaWtiZWZhZGdmfYh5bHKAfXFvcXhjbW5xZo+srKurq6ysra6urK2trKyqp6WmpaWlpqiop6iopaaoqKinqKeoqamqp6Wko6KioqOioKKioaKhoKChoaKjpKOjpaWlqLC0s7OzsKuqqaqztLa3trGopaOioaGipKiqqairs7Sxrq6xs7W2tra3uLi3t7e3t7e3t7a2uLe0sa6ppqerrKmnpqWkpKSkpKWnqaajoJ+enZycm5uampmZmJeXmZmZmJiZmpqampqampqbm5mYmpydnZ2dnZucoKGgoaOjoqCgoKCfnp2FdGtsaFdYU0pHTUVITUdAU1dGRz09OTM2Mzc0NTU3Mzg6Ojk6OTw9OjpBPDY9ODM3ODgzNztAPz9AQDpCRUNAQkRDQT87PEBDQkNBQDxBQ0A9TqKnpqanp6mqq6mkpaWlpaaoqKippqanqKmpqrW2tre3t7izc2h7c2JnamtpaWJhZGloXV1tfHJma3J/fHR8bm1zc36gqamrq6uqq62trKusq6mpqKWjpKampqWmp6eqqKWmp6enqKinp6iop6WkpKKhoaGhn56en5+fn56foKGho6Wko6OkpKSmp6enpqWkpaampqeqraumpKKhoaChpKWlpaempaeoqKalpaivtLa3trW1tra1tbOwrKupqa6rqKWlpqampaSkpaWlpqWkpKSkpaKhoaGgnp2bm5ucm5qamZiXmJiYmJiZmpmZmZmYmZmZmZqZmZydnJycnJybnJ+fn6ChoaKgoKCfnZ2cgHNrbmReU0pITUZETEtFRFFTQ0c9PDgzNjI4NDY0NjQ4OTg6Ozk7Pjw5PTs5PTczNTk2NTY8QD0/QD88P0JDPkJCQj89Pj5CQ0FFQD86PkVAO0+jpqWkpqeoqaelpKWlpKWnp6eoqKanp6alpqa1tba2trW2uYptcW1vfHxxZ2pmYGFsYFROW2hqbm9tgYJ9cWdxdn6aqKeoqqmpq6urrKqqqqimpaWkoqOlpqalpaWmqaqppqWjpKWmpqSko6Kio6Khn5+fnp6cnJycnJ2dnJ2en6CioaKjo6KhoqKkpaSioqOjpKSjpKSko6Ggn6GipKanp6ipqaelpaSipKSlqK2wsKyrqqusqqmnpaWmpaWlpaalpqioqailpaWkpKSlpKOjpKOioaGhoqKgnp2cnJubm5qZmJiYmJmam5mXl5eWlpeXmJiZmpqcm5qampubm5ucnJ6goKGgnp6enpycm356bnJiXlNNSlBFRk5NQkBPRT5JOz01MzYzODM2Njc1Ojs4OTs5Oj49Ozo5OT03NjY5NjU2PkI+PkE/PT5DQT5DQ0BAO0BAQkJCRUA+Oz5FPzxQoKSjpKOjo6SkoqSlpaSlpqamp6empqalpqaltLW1tbS0tbiBaHx9ZXOCemxwdWFfY1ROT1FbaGxpbGxxbW5xbnScoqSnqKioqauqqqqqqaempaSjo6OjpKSlpqalp6ytqaShnp6eo6Shn56foKCdnJ2dnJycmpqam5ucnJubm5ydnp6foKChoJ+goaOioKGjpKSjoqSlpaWkop+go6SkpKapqainpaGdnJ+jpaipqainqKioqaempaWkpKSlpqampqampqenpaWko6Ojo6KioqGhoqKhoqOkop+enZ2cmpubmpqZmJeXmJaWlZSUlJWVl5iYmpubnJuampqam5ucm5ucnp+fnpucnJyam5p/fnF0YFtUTUdNSEZMSj8/TkM8QDs8NDM4Mzc0NzY3ODs9ODo6OTk7PTs7ODk9Njc4OTU4OD9APT9BPjs9RD89REA/PzpAQUE/QUVAPjw8Qz88Tp2ioaKioKCipaSkpKWlpqenp6empqampaampbW1tbS0tLS3jHalsXdmc3Jvc2xjZGlYT1JRT09dgG1kYFptkZGSoqKjpaampqenqKiop6alpaOioaGhoaKjpaempqesq6emoJ2cm6Ghnpubmp2cmZiam5qampmZmZubm5uampqampucnZ6goaCfnp+hoJ6foqOko6Omp6inqKWioKGhoaGkpaWlpKCcmZmbnqOmpqampqanpqempaOlpKWlpqiop6enpaWlpaWkpKOjo6KhoqKioqKhoaKjo6Kgn56enZybnJubmZaUlJSTk5OTk5SUlJWWl5qam5ubm5qZmZqanJ2dnZ2dnZuampqamZqXf3dvc11aTkhKTkdFRklERU5APD09PDQ1OzQ2NDY1Njc5Ozg5OTg5OTw7PDc6Ozc4ODg1ODg/Qj9BQTw+P0A8PEJAQT49QT4/Pz1CQUA6OkA8PE+doqGfoJ+dn6OkpKSlpqeoqKenp6ampqampqW1tLS0tLS0tbSXtqd1Znh2Y2xjY2VjW1JTU1JNXqCMeFhodpajnp6hoaOjo6OjpKSlpqalpKSioaGko6OjoqOlpqamp6enp5+bmpyioJqWlZWam5qXl5iZmpqYmJqampqbm5qZmZmenZ2goqOjo6KkpKWinqGhoaKjpaampaSjoaCgn5+hoZ+goJ2amJiZmpygpKOjpKWmp6alpaOjpKSkpKWnp6ampqampaWmpKOjo6SjoqKjpKGfoKGhoKGgoaCfn56dnZyamJeVk5KSkpKSkpOTkpOUlZaZmpqbm5qampqbnZ6enp2cnJybm5qamZmZlH10bHReWk9IRUdGQkVORT9GOzo+Pzs0Njo2OTM2NDY4ODo4OTc4ODo8Ozw5Ozs6OjY3ODk5Pj9APjw9QD5AOjlAQT89QT8/QUE+QUE/Ojk9PjpQnaCfnZucnJufoqOlpaWlp6iop6ampqanpqantLS0tLOysrGwsK2rkHiGj36bmn93Yl1TUlFRTGKgootaiKCgn52YmZycnZ2eoaGgpKenpqWkoqGjp6alpaOipaampqanpqagm5mboaCXkp2gl5qcmpeXl5iampmampqam5qYmJmaoKCgoKGfoaKipKamop6gn5+goaOko6Khn56enpyanZuZmpqZmJeZnqChoaKioqKkpaWmpKSkpKKioqKkpaWlpaWlpaalpaOko6KioqGgoKGgnp+fn5+fnp+foJ+cm5qZl5WUlJSTkZCRkpKSkpKSk5SVl5iZmpmZmpqam5+fnp2cnJycmpmZmpiXl5F8cmdxXl1QRj9BRD9KT0JCRjhDRT4+OTg7Nzc0ODQ1OTo6Ozk3OTo8Ozo8PT48PDo2NzY5OD4/QT47Pz49PDg6PkFAQUE/P0FCP0RBPjo4PkE8U5ycm5uampycnaGio6KjoqSmp6alpaampqSjo7KysK2rp6amp6alpqiln6iop6qnoXmEXFFST0xcnKCAYpmgnp2clZOVlpeZmp2dnqGmpqampKOioqanp6ajpaampaWmp6emop6dn6Ggl5ioopSXm52YlpeWmJuZmpqampqZl5iam6Ghn56fnpybnJ6goJ6dn56fn6Cio6SjoqCfnp2ZlpeXl5iYmZubnqKioqKioqGio6WlpKOio6SioaGhoqOkpKSko6SkpKSioqKhoqGgn5+gnp2enp2dnZ2dnp6em5mYl5WTk5SUk5KQj5GSkZKSkZKTlJaXl5iYmZqampyenZ2dnJubmpiYmpmXlZaNempmamBiTkY+P0A9SkVAQ0A7QEE8Ozs5Ojc2NTg0Njc4OT04ODs6Oz87Ojs8Ojk6Nzc2ODs8Oz08Ojo8PTw3Oz5DQkRDPz1BQ0FEQT88OkBCO1eZmJqamZmam5ucnp2foqKhoqSlpKSlpqSioJ6op6alpqWlpaemp6ampqakpaanqKehqXJOUU1KVJahenKanJyenJeVlJWWmJiXl5qeoqKhoqOkpKOjpqalpaanpqWlpqampaOgoKGhn5qgdI+WmpmenJaXl5eZm5ycnJqamZeZm5uen52cnZyZmZqcnZydnp6fn5+hoaCgoaKgn56bl5WVlZeanZ2fn6GhoqKio6OhoaCgoJ2cnaGioqOkpKOioaSlpKOko6SjoqKioqKhoaGfn52cnZ2cnJ2dnJ2enpqXlpaVlJOTkpKSkpCRkpKSkpGSlJWWl5iYmJiam5ycnJycnJ2cm5mYmZiWlJWXi3hsY2RiZFFHQT1DO0tIRDo7Ozw+OTo6OTo3Mzc5NTo4ODg8OTg7OT09Ozo7Ojk8PDc2NDc/PDo9Ozw/Pjw7ODxBQ0FDQkI+P0NAQkFAOj9APztZmZiampqam5ubm5ydoKGhoaGhoqKioqKhn5+dpKWmpqenpaWmp6ampqWkpKalpKSkpaaGUFJQT0+PmHB6mpubnJ6cnJycm5ubmZiYm56dnp6foKOkoqGhoqKipKWlrKakpaSjoqGhnZumgmGUmZuZm56amJiYmJqcnpyam5iWmZybnJycnJydmpqbnJ2dnp6dnp6fn52cnJyhoaCblpWVlZacn6Ggn5+hoKKjoqOhnZuZlpaWlpicnqCip6ikoaCgoqOjoqKioKCgoJ+fnp+gnp2cm5ucnZydnJmanJuWk5KSkpKUk5KSkpKSkpOSkpKRkpSVlpeYmJiYmZqcm5qbm5ucnJqZmJiXlZWWl4d3ZGdoZGJNQ0U8RDlJSkU5Ojs9PTo6Nzg6NjQ3OTU8OTY4OTc5PDs7PDo6PDs6PDw4Nzg3Pj07Pj46Qj86Ojo/QURCQ0FBQD9EQUFAPjpAPj06W5qYmZqbmpubm5uen6CgoaKioKCgn5+enp2dnKWkpaanpqWlpqakoqKio6Oko6Kjo6KnllRYVVJOZ21rgZ6am5udn6Cgn56enp6dnJ2dnJ6enp+goaCfn6CgoKGipLa1paOkoqGhnpuco11mmpmamZienpiYmZmam5qWlZeWlZicnJ2cm52dnpybnJ2cnZ6bmJqeoaGdm5udoKKhmpWVlpaZoKKfnZueoaKjop+em5eXlJKSlJeYmZ2goqenpaGgn56goaGioaCfnp2cnJubnJubmpqZmpydnJmXmZaVk5GQkJCPkZKSkpKSkZKTk5OTk5OTlJWWlpeXl5manJubnJucnJqamZeXlpaVlZSEcmZsYmRbREJMPT84RktCPEA+Pj05Ozk6PTg1ODg2Ozg1Njo4PDw7Ozw8Ozk8Oj09OTU4Nzw5PD88OkE/Ojo6QEBDQkRBQ0A/Q0FAPj08QD09Ol+al5mamJeYmpycn5+foaGhoJ+fn56foKCenZ2lpKSko6OioqOjoZ+foaGipKOio6SiradXXl1UV19ua42dmpqbnJ2dm5ucnZ+enZycnJydnZ+goKChoaGgoKGgoKalk7GioaCenJuap4VVbpyZmpyZnJ6ZlpaWl5eTjo6QlJabnJuam5udn52cnJycnJ6dlpSZnJ+in5ycnZ+hoJuXl5mZmpycnJubnZ6fnZqXlpaWlJOTlJiampqfoKGmpqWgn56fnqChoaCenJubnJybm5ybm5qZmJmZmZmXl5iVlJKQkJCQj5CSkpKSkZGTk5aYl5STkpSVlJWWlZaZmZmam52cnJyampmXlpaWlpaQgG9vZV5gV0BKSDg/N0lFP0VBPD07Ojo8Ozs3NTs4Njs3NDY6Oj47Oj0+Pj07Ozs+Ozo4Ojk5NkBBPTo8PTo6OT9BQ0JERUM+P0FBPz8+Pj89PDtgl5WXl5aVl5mbnqGhoKGioqCenp6enqCgn52bpaWkpKSioKCfoJ+dnZ+hoqOjo6OkobCjXWVkYGFua4GenJubm5ubmZianJ2enJubm5ycnJ6ipKGeoKGioqKhoaCgrXqMrZ+enZqanKZnXXGcmp2em5manJiXlZWWkY6Nj5KYnZycm5ycnqCdnJucnJyempWVm56foZ+dnJyenp2cmpqampqampqbm5qXl5aTkpWVlpWTlZaam5qanZ6foqWjnp6fn5+en5+enZ6fnZycm5qbmpqbmpiZmJiYmJiYlZSTkZCRkJCQkZKTk5CRk5SYmZiVk5SVlZWWlZaXmZmXmZqenpyamJiXl5aWl5eYjX1ubV9lVlRFSzw3PjdSRUM+QkE4Ozw7OTg6ODY7Nzc6Njc5Oj0+Ojw8PT49PD06Pz06ODw9OTtAPj4/PT45OTs/QkNAQ0VDPT9DQj5AQD5APTw8YZWSlJWWlpeanJ6goKCgoaCgnp6enp6gn56em6WlpKSioJ+fnp2dm5mbnJydnp+gn56rmGNpbW5pZm2enZybm5ybmpmZmZqam5ucm5uam5ygo6SgnZ+en6ChoKCgn6mNaZynnZyamp+XamdynZuenpyZmJqamJiYmJKOj5OXnJ2bnJ2cnJycnZycnp6dnpqVl5ygoaGfnp2eoJ+cnJuampqbmpqYmpmVk5OTkpOWl5eVlJiYmZucnJydoJ+gnp6enp+fn56en6KjpKKgnp6cm5qam5uamJmZmJeXlpWUlJORkZCQkZKTk5OSkpOUmJmYlpWUlZaWlpaWl5iYmJiXmZqamZeXl5aXlpeWl4l4dmddX1dURUU5OTs8WT5AOEI/OTw8Pjk4Ozg6Ozc5OjU4OTs9PDk9Oz0+PD0+Oz8/Ozk+PDw+Pz5AQUE9ODc7QkNFP0FFQz1AREJBQEQ7Oz47PGKWk5SUlpWUlpiYmZubnJycnZ2cnJ2en56dnJqkpKSkoJ+enpybm5qZmJiYmZucnZ6cpolla3R4bVuFop2dnJydnJqbmpqampydnZ2bmpuboKKinpucnZycnJ6fnp2klnR9qZyam5yii2tpcJudnZ6cm5qanZqam5yVkZOXm52dnJ2fnZycnJycnZ6fnp+cl5idn6GhoJ6cn6CfnJubm5qbmpmZmZmZl5WWlZaYl5eXlpaYmZuenp2dn6GhoJ+fnp6fn5+dn5+hoqKhoZ+fn5yZm5qcnZuampmXlpaYl5eXlpWTkpGTlJSTlJSUlJaZmJaVlZeZmJeYl5eXl5eYl5iXl5eXlpaYl5eVl5eDeHZfW11eUT1GOjk4P1VDQTtDQzo8Pz86Ojk3Ozg4ODc0ODk8Ozw4Ozs8PTo8Pjk/QT06PTw+PkA/PUBBPjk2PERDRUBBRUU9PkVERD9COzo8OTpkl5SVlZaUlJSUlJWXmJiamZqcnJydnp6dnZybo6Oko6CenJuamZqZmJiYmZiam5ubm6WJa3F2em9lmp+enp2dnJybnZ6dnJ2enp2dnJydm5ygoJuampubm5udnJuaoJZ7d5GdmpyenH1qaXKbnpydnpybmp+fm5ydm5mZmZudnZ2dn52dn5+dnJydn5+fn5uanZ+goJ+dnJ6gnpubm5ubm5yampuamZudnJqZmJeYmJiYmp2foKCgoJ+hoaGgoJ+en5+fnp6foaKhoJ+enp+enJqam5ubmpqZlpaXmZmYmJiWlJOUlJWVk5OVlZSVlpWVlZSYmZuamZaWl5WWmJiWl5OUlJGRk4yRkJOWfXhqYWJiXFA8QDw2OENWSERCOjg7Oj47Nzc5Nj06OTk2NDc6Ozw9OTo6Oz87PT08QD47Oz46PT89PkBBP0A8NztBQ0U/P0REPj9EREM+Qj07PDs6Z5aTk5OTk5OTlJSVlpeWl5aWl5mbm5ybm5uamaOjoqCfnpuamJeYl5eXmJmYmZybm5qkgGpqb3lzcZegnp2dnJydnp6enp+enp2cnJydnp2bnJuampqam5ubmZmZmqCgeoqFkJmdnpKAa2Zzmp+cnJ2cm5qdn5ucnJubnJubnZ2dnJydnp2enZydnZ2cnJ2dm5uenp6dnZybnpubnJycnJydnJubmpmbmpmYmZmYmpmZmpyfn5+jpaKfoaKioaGfnqCgn5+fnqCioaGhn5+fn52ZmpucnZqZmJWWl5aVlZaTkpOUk5STkJCSk5GUkY+OkJGOlZabmJWYlJmXlJiRjJCPk5yTkoyFjIeDhndxZ2pkW1xRQT44NkJHYEJFR0A+Ozw7Ojg4NjU8ODo4MzQ6Njk9PTk5Ojs9Ozw6PD48Oj5AOj5APjw/QD8+PDg6Q0FEPz5CRD8+Q0VCPUJAPDw8OmeYk5KSk5OSk5SVlJWXl5aWlZaXmZmZmpqampqkoqCfn52bmpmYmJiXl5iZmJmcnZ2cqH1nZXN7enOJop+enp2dnp6enZ2enZ6enp2dnZ6cm5ybmpubm5ycm5mZmZqboJegfXKZpZt4joZpcpufnZ6dnZybm52bnJybnJ2dnZ2dnJ2dnp+fn52cnZ2dm5qbnJmZnJ2dnZ2dm5uanJ2dnJycnp2dnZybmZeVlZeXmJqam5ubnZ6foqOhoKGhnJucm5ubnZqcmZycn6CfnZiZmZmUkpKUl5SPj4+OkYyNiYuQi4mLjpGRj4mQmJiQkoyNi5KQj5iYoqiqpqWlrKOmoZqep6eyqKKVo6Cfl39wcWlsXFtcTUY8NzdHR1g+SE5URjk+Ojg5ODc1PTk4NzMzOTY6Pjw6Nzo8Ozo6Ojo8PDs/PjtAQD47PT5BPDw2N0A+QkA+QUY+PEFEQT1DQj49PDlmmJSTk5OTkpOUlZOVl5iYmJaXl5iZmZqampqaoqGfnp2cm5mYmJiYmJiYmZmZm5ybnKx/am16f3lxh6Genp2cnZ6enp6enp6dnp2dnZ6enJubnJubm5ubm5yZmZmZnKufinFgp6mdYXqJeXSenp6fnp2dnp6dnJydnJ2dnZ6fnZ2fn56goJ+enZ2dnZybnJ2em5qbm52enZ6dm5ubnJ2cnp2cnZqYl5SRjo+QkJGVmJSWlJiZmpudmJuYlY2Mjo6TkpKRj4mQjpGRjo+Ki42NjYiIi4+Lg42NkY+MkI2Qk5WVnJihoJySn6SipKmam5eanKOprb3Bwbq8uL26ucC8ubq3uru7tL2zwbV/bnVmZ1peWUxJRTo7TElTPFZSSUM6QTo7Ozc3NTo6OjgyNTY4Oz08OTk7Ozw5Nzo4Ojw6PT85PD8+PDw9QTs5NTg8O0A/QT9EPTxBQkA8REM9PT06YZOTkZCUlJOTk5OTlJeYlpeZmJmYmZqbmpqamp+gnp+fnJqZmpqampmYl5iZmZmZmZmphXB1e4B3b4mhnp6enp6fn56en56fn56dnp6fnp2dnJ2cm5ubm5ucmpiZmJ+tjXBgaaKQk1RfeXuFoJ6goJ+enZ+hoJ6dnp2enZ6fn56en6CenZ6enJydnZ2cm5qYnJuVmJqamJiYmJmSjJCXlKCXk4+MjYqKiImMiJORh5CPjYqKkJCLjoqMi4+IiImJjpGOjYaFiYaKhoWLiI+SkJCNkJKXlpKamJ2TlJ6kpqaqq7Gsr6+rpquqsbm5tbS0rqyvtMDIxcXBvsbDxMTDurW+t7a0s7C2tb6qcHRyXGZfXl1JRj8/RUtMVklcTEQ/PUI6Qzk5Nzc7OTk3MTc5ODo+ODg6PDw7OTc5OTs9Oj4/OT5BPDs+PD46OTY5PDpBPkNBQT08QkBAPkJEPj8+OVyHhIOHi42KiYaFgYqMkZOVmJiHlZaWkpiampmenZ+gn52ampubm5ycm5iWmJiXl5ibqo56dXZ7f3mCoJ+fnp+goKCfn5+foKCfnp2dnp+enp2dnJqbm5ybm5uYmZenp3RFRm6XgHtQPlt2hJ2bm56dnZycoaGfnZ6dnZ2dnp2dnJiWlpaYlZWSlpmWk5GKjI+PjI+NkIuLj4+WiYiEi5GZjn2Fi42PjYyHioyQm4yRj4+Lio6TjIyNjIiSi4yFiYyPhouIh42KhYyEj4qXkJOYmpWbnKOqoaKknKKrsbe0ubWxtK2vsrKlp7O6sbq6vLa3tsDDw729vLa/urq8wbW4wL60r66mqa+3mm58Z1tjWl1fSEU+QUtJU1hZXkFGOTk9OkY/Pzo3Ozs7NjM6Nzo5Pjg6Ojw9OTk4Ozk7PDo+PTtAQDs8QjxAOjg0Nzw7Qj9BQj4+O0NEREBDQz0+PjlhmZWLkYWNj5aSiHl9e3+Fi4OKgoqJhmuAeJCLlpqRnZ2UlJGTlpeampiWk42Sk5KQm5uIdndzcX1/cpGgnZubm5yenZ2eoKGgm5uWlpucmpubnJuYmZqYmJmbmpuWqZpMREZwlYJxUkc4YHiOko2SkY+Uk5KXm5mYm5ePjpCLjo2Ch4uLi4qLiI2RjIeHhoqIiZGKh4yEhYqNi4qNhI+UkIyDkJOUmZWQi5OTkZWRlpWOj5GMlI2Oj4qIj4ePhoeJiYmNiomJioWNh46JmJKUmpuXmKChp6Cko5qqqbO2sbWwqKqiqK6tn6qvsK21ubi8wr/BxLixtbCutrOwuL68ury+urOzp7G3wpB1gGNiXlpXUk1IRkVQSVlXX1tDUDpCQz1HRj84Nzo6NzU1OTc8OTw5ODo9Pjo6Nzs7Pjs7PTs9P0E7Pz48Pzo4NDM3OkFBQEI+PjpDREM/QUM7PT45Z6mloqKZn6CippeUiI2CiIJ1h4iKiIp7e3Z7enmPeoiSfn18en6CkYWBgH1zfH99fISHfnRweHZzfHaBj4iIiYeIioyMkZicl4iOhIuNi4iNkZCPi5GPi4yPkJGQlax1XXhfg7avpWJ2fktqfoiCjYuGiYp/iYqGiJiRiIOIg4KFfIuLjIaJi4iKkIyIi42PjI+Wh4mLio6NjY2Wk5OdnJyalpycm56bmpuYnpeTkZWWkJKRi4+LlpSMjYqDi4SEiYyQkIqOio2LipGJjZOTk5SVk5KcmZ6Xn6CfpaKvsamupKSfmKStpqa4t6ysu729wsPAv7+vpa2wsLS3uLO0uLa0ta6stK+4tLaBeXpjZmBeVlFRQUVMT0lcXl9UR0dCS0xCREA9ODg7OTU3Nzk3Ozc9PDk9Pj05Ozg6O0A8Oj06PkJBOD88Oj84NjQyOTtCQD9CPj04QEI/PkBEO0A+N2CloJqXnaGaoaCPl5efl5WCjaCfo6GdmpKOjIxycXBvdnFucG1ucHZub29waHBxcHR+c3FycXd7cnl2d3Jyd3Z6e3l8fXt/iIGEi3+PkYaNi4yGiouLiYeEgYaDf5KoYI6zjM7DrMClgJV6UnqCgZKQhoSEhY2DhIyPj4+IjY+Hi4iRkJWRjpCKk5eOj5WYp6SfnZWYlpaln5udq6aqt7W4srGnr6qnpqGfmp2WkpWVkYqPjImTjZuVjYuLhoaJjJWQkJCLmZKVlZSbkJiTlIyNkYyWl5WilZ6mqauno6OqsJucpp+mq6G0vb6zs7+5u7u6uby9rqiusa6wuLyztLGxqrCpqLGxsqild3J0X2hhYFRWUUlKSFZNXl5eVExKRVFKRUdDPTo5OTc0ODY4Mzg4PTo9PD47OTs4Ojs/PDw+OT9DPzg7Ojg8Nzc2Mzc5RT4/Qz89N0BAQT0/RDw+PThUj4yGh4eUjJWZl5yWmZaNlZyWlZydoKCdmpiWeHFubXJ4cXFsbnJwa3FvcG1yc3t1dnd5fnVxeHZ0d3tybn98gX15eH1/eYOGg4WCg5CLkIuLi46Pi4mJhYKCfn6Kl3LQ1snXrZ+6s2NkcFpugYaNjYuGjZSSi5CXj5SXkpihlp6WlZunpp+goKawq6GjpbW0sqqmqq+isba5vcK7ucO+vLi9uLWxrLCsppuSk5mfm5SPk5WOmp2doJqfn5edo6qsoZ+em62hp6qwqaampJiRkZWUo6SirKSss7Szs6i3tru4sLKvra2yt7a6srW6s7e5u7i8urayr6yxsbKztLOxsa2us7Gzs6yhl3Zxc19jXlJRVE1PSUdYT1pcZFROR1VPRURKRD44Ojg3NTg4ODU5Nzo6PTw/Ojg8ODk5PTs9PTpCPj84Ozo5Ojk4NjI1N0I+P0RAQDY+P0I/PEM8PT46Tn98go6MjJOTl5eaj5SWjZaRkZSXk5qanqGdnHJvcnFxcXFxcG5zcW91dHJxdneAdXd8eYV+d3t8eX1/fICJiYmDfXp/h4GIiYGAgIGGiIKGi4eIhYSIiIqEf4J9kX+QzbXCzsi/rJR8qqxfaImMjouNkJmclJSUoJqan6Ktsa6ppKWtr6ysrLWuvrmtrqm1sLexq7G2rK+9wsLAvrq8trKutraxtK66u7OurKepp6unoqmtoKmooq+wuLSxvLq6urK0ta+8tLezt7e7t7mtrbCprLW5sbeytLe2sLu7vLu6ury1vLi0wbWsqqqrtLG3uLm1trSzsKymrrCqq7Cxq6yusLKxtK6qo5N4dnJlZ1tMUlBFTUlTV1JlXmdUUExcUUhMUkNBOTk3OTU4ODY2Ozc5Ojs6Pjk4Ozo6Ojw8Pj08RD45Njs7ODg+OTUxNTZCRkREP0A3Pj5DPjpBP0BAO0t/gomXmJSdlpabmIuSlo6XkZGVl5SZl5+bmZx8dHV2dXl1c3RudnJzdHV2d319gX56gXyDfoJ/fYB/hIKFj52RiYF/go+Xjo6HgoCBiIuFfoqRjH+IjY2Mi4iSi5h1mKKNtKqdnoeCcGjNgGCLi4qQj42PlJSYkJWcmp2eqK6ysLC1tLOtsrW4sLy1tbGqsKqztbS7t7SztrS1r7i4t62noqassLCvtre3vrW5vLOysa61u7C0r6+yu7axuMC9tLS0s7izvLq2tLrAvbm6ubq+ubm5vrWysa+yr6q1tLGzsbSzrri4tb+vpKaoo6ussa+zrq6wsKytq6qroqKmqKKnrauqpaynoqeYeHlxZmVZT09NSVJNV01PX15cTlVVYlFEVE07Pzk8ODk1ODc1Nzk1Ojo6OTs4Ojw8Oj08Pj4/P0I9ODY6Ojk6QDs1MjY2QUZDQz4/Nz49Q0I5P0I/PjtLjpGTmJmVmZGTopiTkpKLk4uOkI+Vl5ablZSbhoJ9enh2dHRzdH53end2gIKDhouMhISFioaQiYeRk5aRjZaalY+IjI+emJaVkpCTl5qamZGeoZ2Tl5uhmp6co6GdipB6hqOMhIl3dG12o4tmho+MmJqPj4yUmpecnZugnaSstLm6vK+2tLi0tLK3uLmzq6+qqKy1srK1rrGrrqa3s7OxpaGotbCvrayrtbqyu7q6tLK3ur67ubG4sLmtqLK4u66ttLS3tbu2trm5vLe0r7G0t7a5s7e1pq2pq6ior6yprq2up6KxtLG0q6aop6Cjq66oqq6orLKwr6+pqKGeoaGjpqOgopqlo56ol3J3bmdiVUpUT09KRFBLX2JYWlFcVGBNSFJJQUA5Ojg2Njc3NTg5NDs5Ozk8Nzs+Ojg8PD0/QkBBPTs2OTk5Oj87NjM3OD5GQkJAQjk+PUBDPkBGQj44R5OWkZWTkpSQkZ+ZnZmVkI+Sko6Mk5aWko6RlZGSkIaBeXJzdXuBhI6HhZGTkpicnJiVkJWYo5yaoaeqqZ+clpeVnaKioZyZnpmlqKyvramnqqqpp6KlqKmsqqqvp5l+W2aGeHh/bWpodXZ9d4SjoaSem5qkp6Spq66spaSoq6+xtK6qrK6zr6ystLO0ua6urayqrLKwsK2wqKqmsrS0uK6qtrqwr6qurLC3s7i0t7W0u7y4tbWxtauyrKiys7uvrbGytLa1sbG0s7OvrKuvs7a0sayutKqqpqWnrauoqKupqqifqbOwqqeppaOio7CtqaatpairrayppaSioKWipaOYmZyVnqKippdudWVnZFdPWUtLSktTVHBiWWRXX1tcUlpQTEM8ODk6Njk4NzQ3NzQ4Ojw6PDg6PTk3PDw7PkM/QT47OTo5Ojs+PTg0NThBREVEQkM5PjtAPkI/R0Q+N0KSm5SVlZaVj46Wl5qZlZGKk5SSjo+SkYqKiY2Ul5qTjYmCho6VkZSfmpuin5+jnqGhn5ijpKelpaapqa2rqaKmpKilpKGfnqOjra2srairrq6rq6ykoaKlqqinqqyHcVZbdHFyeWllYmlpcHyLo6mnoKKhrqyrqqetrqilpKmpqqmmo6iqqaekp66wr7Ovq7Crqq+yr7Czua+rqLCxrrCyubO0r62vtbCss7GurLW1tLSzs7CvrKyqrKusr7G0s7CwrrCwsKyqrauqq6alrrCysKumqbCvqaOkqaunqKaopquwq6mvqaaoqaalo6iwraqpqKKpo6WnpKGhoKKloZ2el5aYlJugpKmUbnNeamlfVlpOUk5RT1NlXGVjW11ZXFBZT0tAPDs5Ojc6ODczNTMzODo9OTo4OTo5Oj08PEBEPkA9OTo8PDw+Oz45NTo8QkFFQUNBOT47P0BEQENCQDdAkZ6YlJeZlpGHi5SSl5GIg4mLk4+OkI2Hh4SFlZmWmJeZlpqeop2ZnKKkoaCdn5qfoKGgpqGgoKCjo6KlqKmrramqpqOmpaCloKaop6aoqaepqaSoppmepaWiorCecWtSUnZ3dHtoYWVmXl9vfIugpKCgn6GhqKCcn6GloaCmo6KfpKGspp6foaGkrKqnrKivq6e0sa6ur7WyrKqwq6mtrbWwrq6srreup6yqpKivsq+sq7Kvqqqpq6utqa6urrGxraqtqaunp6uoqauinaapqKilqKisqKilpKWop6iopqmsr6+oq6mhoqKlo6Opq6ymqKWjqKKhoKSdnZ+hoZ2bnZ+amZWcnKOqlG9zZm5yZF1dUFVPWE9eZGRsaGJiWlpSVE9NQTo9Ojo4Ozk1MTYzMjg4Ozk5OTk7OTk8Oz0/Qz5APTk7Ojs8QD0+PDk5PEFBRUFGQTo9Oz9BQUJBRUI4PYqWlJOYmpaPiISNjpGSjIiIiI+JiZCRjoqKiJubmZygpaKlnqKjoZqeoZyanZ6bnKOop6ugoKOYoJ2XnKGjo6WjoqKkrKilqaCepqmnq6mkoKKgo6ehpq6osLKsgGhmS05wdXeAaWBiaVpdYmt1g5GdoaCdoKOalpqYo6KipJ+ZnKGhoqCbmp6goaSgnaejqrGorqusqaSqqquorKalrKqws6+rq6mwq6appaWoq6ynpqevq6Wnq6upq6irqqqrrailqKOmpaesqayoopykoaOmo6qpqKano6SnqKanqKepqKupoaKoo5yepqWjqKino6WlpqmgpJ6inpeYnZ+doqKlnpiUlZ6go5d1d2t2eGJfXFVZUVVXW2Nfc19oX2NTUVlUSD48PTg7OTo4NTM3MzM0Nzo4OT05Ozo5PDxBQEM9PT44Ozw9PEA/Qj86ODo+P0NAREE6Oz49QD9DQ0VDOTyCmJmenZ2alZKKiZGRl5GQh4SJgoGNj4+Sj42cnZ+hpKmlqaeorK2moqKfmKSmo6Stsa6yp6asm56em5qjp6Cfo5+foq+rq6yoqKuvqaiqqKKgoaeprba8vr2sjW5oY0ZVbm98fG5gXmZaWmFiZ3B4f46aoKGimJaem5+fpKGblZigoZ2enJudnZuZmZWen6Oonp2iqKGaoaOmoqSoqaqoq7CxqKWlp6eopKWpqaqnoqWmqKadnqWloqClpaOlpqCjpaOjpaelqamqpKekpqKmp6SrqaenpKGlqKynpqWlo6OopJWdo5+bnaCjqaeopqGjo6mooKiioJyVkZqfn6GmopuXkpCamqCVfHdvfXlmW1tgX1pcVlxoZG9jbWppYl5QUEA/Ozo4OTg8OzYzNDMzMzc5OTs8OTs7OT49QkBAPTs9ODw9QD08PENBPjo4PT9EP0M+Ojk/PEI/P0FEQjk6gJ6kp6Kem5+gmY+ZnaCWloqGj4iEi4qTl5SRo6Wnqq6trLOys7S4t62pqqevtLKxqq6usbKusa2lq7OssbGpq6+rq6y2sLSwq7GysaOgo6qqp6+8xsvNxremj3NoalxCTnBudG5zZ2JhWVhfY2FianF1eo6hqJydoZqWnqScm5aZoqefoJ+joJuUlpmWl5qfoJmVnqGZmJ2dpZ2gpKeqqaiqraylqaSlqqeqqaqsp6SkpKOimZmhnpqaoaCfpaWYnqSmpKqooqelpaGqp6mnp6ejqKWmpaGkqKesoqekoaalpaOVl52Ym5mVo6elpaSfnZ2lo6Kqo5+amZiXnJyaoaGakJOTl5ibjX93cnZ4amJbX19cYllgZG5ta25hX2RgUE9BQDs7OTs4Ojk2MTQzNjQ3Nzc6PTo8Ozk9PUI/Pj89PDo/OTo7PD5CRUA9OTtAQT5DPDs5PzlAQEBAQkM7OXuao6OcoJ2dop2Zn6KioJibmJaYkpSQm5qWl7S0rrW4s7S4tre0uLm3tbm4ub28uKqLnLK4vLS9urW7uru4s7q/uLe5u7G3r6iusq2inaCrtMDU3dvLuaubh3BgYGJVRkV1bmBfbW1cW1daWV1bW15iZGVoeJKnr6almKGko52goaKooaOgpaGck5mYmJmco56cmpudl5uZlqWam5+hqKmpqKuvr66pqKirrKytq6irp6WjoJyfo6Ojn6Cipammmpyip6Spn6GjoqKgpaanpqSooJ+ipKGjoqiop6OloaGopqalo5mbmJuTj6GknqKfmJiVoJuhpaCfm5udnJuamZugmo2YmZiTkYaAdnh4eGNbUllUX19hbWl2a3BoaWliWlNMQDw6Ozg5Nzk3NTU2Mjg1Njc3Ojw7Ozs7QD4/QD0+Pjk6PDk2Nz47QkZCPDg7P0NDRDw+OT43PkFCP0ZDOzhwkpqblJ6bm52Vl52doqajopaXnpaXl6GblJi+t7G4uba3t7i7l5S2vbu9vcDFtaK7mKC3v7+6wcm0nbu2sra/xcGooLa0urGqrrSxsLK0tLfF0tnWya6ReGZdWltcVExBa2qMmI9ZVFhXXFxdXVhVWGByiaGyxcO0sqCnqqynq6mlpqCnoKGmoZOWmJ2foqSjnZ6coaChnZekmpmdoKaqqqqtrq2tsLGrrK2sqamrrqimpaalpqSkpqaeo6eppKGcoKKjpqCio5+jpJ2foqWgpJyboZ6fo6GhpaSlqaOkpaKkp6ehn52elpOcoJiZko+MjJeWn5uWnJqdnJqSlpSUmJOQmp2YiouHgIB8gnhhXllUYWlgZnRvdGl0ZGlkYltMSz46OTg5ODg5NzM0NTI1NDY2OTw8Oz08P0E/QEA9Pj44OTs4Njc/OUJFQzw7PD5DREM9QDs9Nz1DQ0BFQjw3Z4yRk4qalZiblZWYm6Knq6aVl5iQlZmhnpeXvrWztLu6ubi5woeYt6u4u8DCxbOjw6e4s72/tMTHvbS7uL62wMTErqCworW2tb2+wcTHw8O5vb7Bx83QxKB+aV1ZWFdTSVRsp7OoTlVeYWJfX19mepavv76+wMKytbaor7Gwr6yqoqajrJ+fpquXmqifpaWfoJydoKuwsKyiq5yYm6Cor7Kys6uorre1sq2tqaalqKulpaStqaShn6Cnnp6mqKmmnp+anqGlpqmcnaObl6KmmpuanZ+cmqGcmZ2eoKijn6GfnaWioKOioZSZmpmTj4qLhI2Qk5uPjpiVm5eYkJORkomNl5iYk4uKi32AgIVwYGJfXmtjYm54dXdubVtiUlZcTUc7PDk3OTc5Ojc0NDQxNDM3Njg8Ozs8PEBAPUA/Pj8+Ojo5Ojc6Pz5FRUU8PT1AQkJCQUE7PDhAQ0NARD87NV+MjIaFlouUlZeYl5ifpqellpWVkZebn5ual7mxtrO5vLy5urWqsryxvsG0vMe5uLuuv6fGw7/KxsnIxcXJvMLHx7+xsKe8vL7FxMbJx8XGu8XBxcbAvLnMybmXc1xVWFRRUpyzn05ZXF5dYG2OqrvBsranprG1q7WyrbOtqa6vp6awr7Ktqq+zpKu1qaeopKCgnqmyuL61tbWqqaausre4t7apq7i8ubexr66noqOop6SfqKOfnqCZoZydoqSnp6GelJuaoKGlnqChnpajnZSQlpiboZqflpORlpSin5qenJudoZ6kn56VnJiPkpOPjImTkJefiZCWkZuUmJGRlZaDjJWXlpKLjIh8foR/amZoYWtsZ251cnJ1cWdeYFxSSUU/Ojo6Nzg0ODw3NjU0MjMzNjU3PDo7PDs9QD4/QD48PTk5OTs6PDw+QkRFPj49QENDQkREOzo4QkJCQUNAOTJbk4iEjZGKi5GRlZCSmp2fnJOSmJSdnZqXmpW2sbm1tb6+tri1uLO8vMTEusPHwb+0s8XFxr/CzcfLzsvLx8HDxsfIysXExcO7vLzBxcHFxL/Dw8bGwbGTv7zL0L+YalhXWUySt5ZNVVlYYH+mvLCmq66zp6qpqautrKmlpZ6pr6uyu7q4u7e5t7O5uLOurLO0qrC1ub3Bur6+vL60urm4u7qysbS8u7q7s7Oyp6Smq6uioaCdmpudmpyXmpuenJygnZaclpuZnZ6io52UnJCNiY6OkZ6bnJWNh5KLmJiWmpybmJybnp6cmp6UjpiYmpSRmZeeoZWYmpKXlJWRlJqYk4+TnZaSi5F+enx/dGtsbmRvbWlxeG96amlhXWdhUUZEQTw5OTc2NDQ6ODQ2NTMzMjY1Nj05OTs7PT47Pj49Oz05OTs7Oz89QUNBQkFAPEBDQ0NFQjs4OUQ/P0BCPzsyV5uQkZCQh4WSjo2IjZCTlZGPjZSUm5STlpqRs7e4uLi+u7C1sri2tbbAw8G+w8LAvru+u7u8xMzEzNDLxsa/xcfLyNTLysjGv7u7vsS+xcjGxsTExLm1wLizvMHFv6l3V1VRir2PTVNWW4Ogprevpa20tK2vpaSjqKSgoKWZqrSxvsG+urm6uLW0srG0tLO6wL7Av769u7u9vsDCt7a3tru7sru+ubi3u7a3tKyoqamrpqijnpOampyYkZKZl5GRmJqXnpiWk5acm5+elJOJiX6GiIuWlJiZkYmVkZeWlZmbmpaYl5idnpyhmJWZmZyYl5ybn56jnJ6WmJeTl5yZmZyUlp2UlpOJdnl5e3dua2lodVpmcnhzeWZmXmRbUlhJRj87Nzg4NzYxNjk3NDQzMzM2NDY7ODo8Oz08OD0+PDo7PDs9Ozs+PkRBQURCQEBBQkNDREM9OTlCQD8/QD89MkyWmpaSk4yKmJCKi4yOkpKKiIaNkJiKj5CUl7O7tba/vb2xtrjBvby0uL/Bsbi3vsHFvbu8wsbJv8jOyMHEwcfKysbKxczIzcbIxb/DwMvNz8rGxMPEwsW+uL3Bw7/Hu41jUWF/ZVBTYI2qn6a0sq2suLWzq6mjoa2prKetn6y1tL/Cvrm4vbawrausr7W0ur7Fv7u8urO5u7i5ubWtsLS9u7G/vLiytrmzubu0ra2orKyqqaeXnpualY2MmJSTi5WWlJyZl5WWmZKYn5mQiop+iYqKkY6Vl5OUn5mWkJSZmJmWmJOUm6GeoZiYmp2ZmZaenpibopqdnJuYmpuZlpeXlpyZlJyYfoB4eXV1ZWZpamhdam9ueXhjYmFgXlhXRkU4Ojg6OTc5NDQ5NzY2NTEyMzM0Ozo9Pzs9PTo6PTs8Pjo7Pz48QkBDQkJFQj0/Q0NDQ0RFQDk6QkFBQj5CQTVCkJeUlZmSj5qQjpKRjZSVi4qHjI2UiImPkpq2u7S8xsHEwr3BxcLAtLO9v6ywr7rDysPCvs3IxbfByMW/wcLIy8rCwsTJzM3Oz8zDx8bIycjIycfFycfIx7/Ex8TExsrOwo1SSVBRZqe6t8C9vrm8ury6vKytpqm7urm3v7K1uLLAxrq3t8Gzsa2tqau1s7u2w7a2vbWxt762s7e4sLW2v7uwvbq0q7CxsbO8urOzrqutq62xnaOjoJqQjpiXlZCclpaYlpWSnJmTm5+clpGUjpWQiYyQlZOUm56YmZKSnJedlJmSk5aZmJ2VnJ6do5yVnZ+TnKKcnKCfnaOemJSVl5ebmpmgkH99cXRxb2NhZ3ZoaWl0bXlsXWRbVWBZTEhDNjw5OTg4OjUzOjY2NDQxMzUyNTs6PD47Ozw9PDs8PTw7PD49P0E/RUFCQ0M+QEFARUVERUE7Nz5DQkI+Q0I4O4+akZaalJKUjZCUlI6VlI6Pi4yJk4uIkJObt8C6xsXEw8zCwcS9vrWvt7uvr7O6wMfFxMHMy8W2ucDCwsTHytHLwsPExsnFzNDNx8zJwsLHwsvLyMfMyc3FxcXDxcTJzNPTlk1NXKrHwMjNxsTBxMfBvL60sbCwwr6+wca/vri2w8K6urbAvrWyrKmvsri+tMC0tLi0t7nEua+8vrm+v8K/tbq2q6qsrq+wt768trSura2utaSlqKimmpycnZyeopydmZOQkp2VmKCdmJiVmZmZl46MlH2QkJefmZmYk5GToI6Nko+VjpCUlaKdnKSem56elpyjoKGipKOkop6amZubnJ2enIN9cnx4cGdga2p3bGlldW50Y11iVFdVU01HOjc7OTk3Nzo3NDg3ODQ1MjM0MjU7Ojk+Oj08Pz04Oz05OTk9PEBBQEVCQUJBQT9AP0RFREVAPDk+QkNCQENBOjSAoZeUmZiVkImUk5aTiZGMlJGOiJaKi5CXnMXLw8O8wMPHwbm9vbu4tre3rrK3uLzAwsDCx8bHurzAwsTHyMbSycHDw7+/vsTLyMrLyby8yMfJzcjDyMnJxcXCw8HCxsbHys1/SY/NzcfM0MW2v7/AwLq7vbWzs8C/ub/DucC3u8G8uri7ub27srCvsKy5wri9ube1t7q9xb24xsjCwcLGwr28tamurrCwr7O6t7m2sK+tr7OppquprqannqSlo6OjoqCblZiekZecl5GRlZeZlZmRlJiSlYyYo5qcnp2FiZ+TfJKWlZKUlJennaCipJ+en56foaGkoqKjoaOinJ2fnqOhppl5enl/cnBmZWdjamRiam1ub15ZXVZWTlBKRjk5Ozk3Njc3NjM3ODk1NjEzNTI3PDs8QDs/PDw6ODo8OTk4Pj1APz9GP0JBQz89QT5ARENDQTw5PENBQ0RBQDozbKKdlZedlo+PmJiZmIiSjZGVkI+Vjo6TlpbKy7u5urnBu7q3vsG8vLu5sa61uri4u8S6vsC+vru8wMXBxsK+xsK5u8O6uLm8vsHHwca7ucjIw8XEwMPBwcDEwcK+vcHBwMDHpk2k0czFydHBr729uLm7u763tLG5vrO8vrG5tbi7try0tbm2uba5t7GtusG6vMG/t77Ev8bDw8fHwrvAwr/Cv7iys7O1tLGut7S3tbSxrK2xp6Wlp7CtqJ+nq6ajqKWmpqCgn5SYmZSRkZWUl5OYl5qhnZ6hnKGdoaWglpSbkZeXmJqTnpmZqaSlpKWdoqCanqCkoqOcoqGjoJ6cnp6ppaiVfXuDeG5mYWRiYWNjY2piZ2NbWlpdWVFPRT07OTo7Nzc5OTY0OTk6NTMxNDUyNzo7OkA9Pzw8OTc3Ozo5Ojw+QD8+RDxCQURAPz49QkRCQkI+OjlCP0FCPT44NVmfnJiTmZaRlZiYmpeQkZCQk5GTlJKSkpSUxce4tbq5wrm5vMPFwri7ubGxtry6tbnAu7u5tre0tLW/u72/ub66urTAuLW3sq66u7fAt7zKz8G7v8C8u8S9usDEv729uLvAxLBTns3EwMHJv7DBv7q3u765tbi0uLy0vbi1tLCzvLG3t7i/tr25vb65t7q+u7/Axb29y8PGw8TAw762ubq2v7i7v7y4trOyq7CwsrWzs66sq6emnqeurauiqKumpqqjp6iqo5+Ym52bmpicnJiXnJuhpZ2anqGhoKGmoJqbnJiboJ+dnJ+coKiho6SknaKfmqKgop+el6Shop+dmpieqKWhi3x5iH1xZGFiY2hqZ2dpZWleVlZUWU9TTEY4PzY7Ojc3OTs2NTo7PDYzMTM0MTc7OTg/PT47PDs3Njk5ODo7PUA/PkA9PT9CPjxAQUNDQT9DPTo2PEBBQDw9ODdJlJibj5OUkZWYlZGWkpWRkJGUlZSTk5OYlcHCwLq8ub62uL7EwMKxvbqytLO4vLW3vMC8vbS0sbC1t7W7wbi+ub+8vLe0t6+ut7W5v7vB1Y68vrvDtbrHt7a4u725ubW6w8irVJfIv7+7wb65xr3Cv7zFuLa3tLi2tru7uba0t7q1s7i8vbm/ucPAwLu5vLu+vcjEvcfEw7rAvb62sra4srm0usLCureysaysq62yr7Kur6ijpJ6rrKyqpKakpKiqoqemraihoaGmn6Oiop6bnKKfoKOdnJuhn6KgpKCem5eZn6GdnZ6eoaWkoaKioZ6ho5yinqCZnZijn52eoJqZoKKmnYR6g4F5cW1lZWZwamVraFhZT0tLS1JKTEhEOT44PTs2Ojs5Njc8ODk4NjA0MzE3OTk7Pz0+Ojw6ODg5PDg6Ozs7PD1BPj09Q0E8P0NDREA/Pzw6Nz5CREE/QDg4P4mYmoyMkI+Tl5WMkpCakpGXmJaUlJKQmZTDvsbBwby8uLi6v7a8scK2tLyxtLa4s7q9v768sq2vrLGwt7y3u73BxLm3t7a1ubm6u7+80MV5rcu9x7e5uK22tLe6tLezu8XKoFWOyb+/vr28v8jDxcW+xri1srK9uLi4vrq6uby6urS3u7q5v7zEwL+5uri/ubvFxr3Fw8Kyur27sa+2uLO3s7q+wLm2rLGrrqmqqa2qqq6mpKWnrq2ppaOio6GkpaWmoqato6Klo5+ho6Gcmpyhn6CloaCenZygnaWgnpeVmZ2fn52gn6KmpaCknpybn6Ofn5mcmZ2epJyWnKOcnqGcppZ+f4d9a25xZ3Brc2ZibmBcVEhLS0RKQ0NHPzo7OD48Nzs7OTc4Ozc8PDYyNzUxNjk8PD08QTs8Ojs6OT45Ojs9PUA+RD89PkRAPz9BRkQ/Pzw9OTc/QUNCQEI5Ojl3nJiLh4uQkpOWjY+TmpOQnZiSkY2PjpiSvbfHvsO+vbu+vL22uri9ure9s7OwuLi1uby7wLeqraSusLi7sr2+u8S2tbi1t7++xLzCxNivdoS+yM/CwLiutbW7vre6sr7CyJZbiM3Cwr++vbzHzMfHxMe9tbW2wb27u7/CusDCv7y2t729vcHBwL+8ube8wru3v8W7wr++tbe8vK+vt7awtLO6ubq7r6mtq62rrKaqoqeuqKWqra2vp6Sgn6ajnqKjqKOjq6Oiop6dm5ublJaZnJyfpZ6fnpmYnpejoJyXmZqZmqOjop6jo6egpqCbnaCjnp2WoJmcoKCblJegn6WcmKKQgYaAcmZsam50bndjZ2JcY1FLVUhFRUNHQzw7OTg9Ojc6PTo4OTs3PD01MzY1MDY4OTo8O0A9PDo+PDk+OTk9Pjs/PkM8Pz5APz4/P0ZEQEE/Pjo3P0BDQz9APTo4ZqGYj4uNlZKVlY6PlpmVl5uVjoyMjY+bk7m2wbS/vLm8w8C+wLq1trKywLmvsry8sLe7tru8qqqjsLm9vLK8vrzFuLG4ubzGycrCx8nRm3R3sdHRzMrEtbq/xMi+vrW/wMCHaH3NxsK+wby/w8zKx8XGwLm9vMS/v7/CyL3Hx8XFvLrEv7vBv7rAvLu7wMS9t7nCub69t7S2uLqur7WxsLCytre0t6yurKqsrKuoq6Gms6qlra+trKippaOkp5+io6Onoaeiop6cnZyamYyQlpeZnaKZnpuVkp2UoaCdmZ6fmJimpqKfoqKmoqeloqCko6GbnaCbnKKfl5WVnp6kmpafiYGDgnRvbGx0bGxuX2NeYWJOSE4/RUA/REM7Ozo6Ozo4Ozw6OTw+Ojo+NDQ1NTE5OTo5PDtAPD89PTw4PDs6PDs7Pz5DPkI+QD89Pz9FRUJBQj87Nj9CRUQ9QUE6OlmfmJOSlZqVmpOQlpeclZuZlpSVkZKTnZm2uLaxuru6vsG5uca7trWypb69tLbBv66zvbS4wbGwsbS7xdDCur68xL63vMC/yc/HyMrKwoh2d6jMzMvNysbCw8vOwby5vbuxgXptwMfEwMC/xMDKycPDxMO5w769ub+8wsbCyc7Hxr66xr26v7m3wLm5vsDCvrW0vLi2u7CvsrK1r7Cvrqyus7CzsrirsbKxqrCrq6yrrLatqKyusqarrKmpoaWgpaakrKSmoaChnqGgnaCMlJeTm5+mmZ6emZOYnZ+gnp2eopuYp62ooqSgoKKqpqmhqKGlm6CgnZ2jn5SYmKKdp6Gfm4J7eoh7bW14fGBxY1teX19UST5DRUlCQz5DOz42OTo7Ozs7Ozs7PT05PTU2NjIxODo5Ozs6QTs/PDw+Nzs8Ozw9PTw9Pz5BQUE/P0FCQUVDQkRAPDY+Q0RFPkJEPztTmZuZmJ6dmqCalpyZn5KdlZ2boJWWlJqYur20sLu8wcTCv8XGura5sqO7vbS3xLuwtbq2ucS4tLy3u7qt28O+tr7Avr66ppyqs7fEwKZ8enyfxMbLyMHDwMDJysHAvLqypZaIebPIxcS/wMG/y8fCwMjAusK7urO6usG+wMrOysS9tby8ub+5ubW1s7/Avre0s7S4rbeqr7CwsrGvq6+nr7ausrG5rra2uLSzsLGttrS6sa6srranrLKsraSjoaenqLKrqqWkp6elpaCml5ujn6SmraKeo6KanaWiop+foaWenrC0sKSlnp+kqaevp6mgq6CiopqipJ2anqGmp6+psZWCe32Cem5zeHRocF1cX1xaUUVFRE1JQUQ9SDs7NTk7Ojw8Ojs7Oz0/Oj01NDUxMjc4ODs8O0I8Pz46OzY6PTo7Pj0/QD87QUFBPj4/QkBBQkJFPjo1OkFCST9AQkA7TJqdnZ6fnZienZmampySoJWbnp+blZGRl8W+urbDvMbCvr/Ixbe1uLe2ubu0r7e3srWzt7m8u7a7u8W2bq/Ovba5wLyqfW5obm10gpeZdXt/nL6/xsC5wLy+xcS9vbixrqarlpSiysPDvL2/v8PDvr/HvLy/tLSutbW8vr/OzcvCt7K4t7e9ubuxtrLIwLu2tLGwt6yzqbCtrbS3r6uuqrG1r7Gvt7O6usC/tre2sru6wLWyrbO3rLC6r7KloqWrrK+5s7KosK+xr6qiqKGkraitrLOun6inpqWmq6Sknqaqo6ayuLOrpZyfp6anrquqpbClpaWbpKOYn6exrLW4sLKOhHl/fHdsdXtwbmlcX19ZU1BBRklHS0BFQ0g8PTY7OTk8Ozo6Ozs9Pzw9NTU2MTM2OTg8QT5AOz1AOzs5PD04Oj08QD46Oj49Pj09PkBCQkJBRD03NDU9REc9Q0I/PEWUnqCgoJyXmpiYlZmdmZ2fmp2bnJaRj5LDwMK9wrzEvLy7xbu3s7e2tru7s6CWtayvsbS0tLa4ucDNsXaCtL22tcGkhmlaXmBOU1tccHZ6haS4t8K6s7u3u72/uru7rqWtsqGlh8HFw768v7u7uLbBwrW/urWur62wvcC5z8rJw7GwtbS0vbq+urq7ysO7uravsL2xuK+ys7C3vbaur66wt7CsrLK2vbzEwrq9t7bAv8G3tbC2srGzurGxr6err6u2v7e1qbqztbmxp6uop7ausrG1uaisrK+qr7CqqKessayytr20saykqKuoqKusq6i2qaaonqadmKOuvLG7wbSmiYF7gnpzdnZ3bnFhX2ZdW1VKPT8/R0Y9R0NDOTo1Ozk5Pjw8Ojo8Pj4+Pjg4MzE1Nzg5Pj9BPzs6Pz08Oz09OTs8OTs6Nzs+PT1DQT8/QUJEQkE8ODU4PUNGPUREPzw/iZ2en52Xl5WUk5aZnpubmpuYlJ2Uio6Owb7Dwr6+vrm2usCxtbGzt7fCtbOrrbOoqa61r620trnCyaaEeIuisLWcamZnVllfSUlNUFRve4upsLe+ubK1sry5vLa5vrWZsb6us3iwycTAvb+5s66yvLquu7Szpquorbq+uMvCv76sq7Cvs7q3ub67wMXBu7y3sLXEtb+0uLu0u8PCs7a2sbisqaWrsr23v7+7u7exvL28trGvq6uprbOvsLCrsLSpuMC2sqm0tbC3tq2spqu7s660uMKwsbG1sbK1saywsri4ubi+tLGzrqyxramvrqqyuK6trainoZ6ptr+4ur+wlol9gHxxdHd0d3JsX2NhXF5PSUI/PUlERk1EQDc3NTs6OT48PDk4PT47PT86ODMyNTc2OD8/Qj86OD4+PTw5PDk7Ozo8Ozs6PEA+QkI9QEE/QkI/PDs3OjxBRD5CQz8+QYqgm6GdlJiVlZKYmpyWm5WalY2bj4SIhru0vb+7vLm3s7y8rLOytLS2wLXAr7Kzqqqxt62pubO3v8aoh3t2jKGYX1NDWVVIYmpVT0VKZZGlr6+2urW0sqy8ubi1uMG9j6zEtLR3p8rCv7m6ta6lrLOxprCtqJ2gn6WttrXCt7a0paiqqLC2s7K6tbu7u7W4trC1xLK+vL+8ubrFybq9vraxp6SeoamxrrW5trKxq7S2trGopp6gmaWmpKynq6y2qa+6sa2kpq2lq7GrrKmtuLawsrjBtrGxtbGvu7ayt7W1sry1urKwsbKutLKqrq2nuLWyta2uqqiosrq9wLa0qY6Ce393cHxvdnJuY11mWV1dU09OQT5KQkBLSkA2NjU7Nzg+Ojs4Nz4+PDs/OjkzMjc1NzU8PD48PDg+Pjw8OTk5Ozs7Pjs7OTw+P0E9PEJAPz9CQD47Njc6QERBQ0E/QUKJoJ2loJSWmJiVnqCcl5uYmZGMmYmDhoS1r7S7u7S1sLG2uq6wtLOvtbq1urC1s7KttrqvrbyzuLi/s5CBeYiQbk5LQGVZQk94gZNoTUNehbG1s7WytK+su7q4trm/xn6TuquiaKu/uLWysa2tn6Smp52kpZyWmZmZn6muuayrq5+lqKSrrq+nsKuvsbGtsa6usLmwtLy+uLm4x8W8vLu4qaKcmJufp6assq6zqaapqq6popqXl5GcmpijnqKir6ekrKaompqemqGnp6anqa+2squ0tq+qsK+xqbm2sbWxrqy3s7avrquuq7S1ra+rq7GtsbKoraurs7W3ur2wq6GLeoJ5cnZzbXVpbF1balRdW1BOSERHTUJGTkY4NjY1OjU6Pjg7OTc8PTo7PTo5MjM2Nzc3Pjs9Pjo6Pz48PDw6Ojs5Oz47PTk8Pj1CPDtAP0A/QT8+OjU1OkBFQkRBQEJBiJ+ipqGYm56dmqWpmJudmpmUjJmHhoeGrq2uuLmxsqiur7iyq7CwqrK1ubm+tbK4tLm6trm7tbWzt7aVjIiFfFhGQU+HWElKWXiOg2NBVaO5s7SysLGtsLm4tru3ur2Up7Svp3etsKmrraujqKGdnZ6Xl6CVkpaXj5ifqK6ko6Sgoqaio6mpoaanpaqtp6ynqKesq6yyu7SztLm6trK2ramgmpaWm52fq6yqr6Oko6GpoJuTjo+QlJKSmZaanaSloJ+ep5iVkpSZnqSjoaWqrK2iqaqppKmtrqW0sa6xraqprq+wraWmqqSos66trKmmpqmrpqqnq7Ksr7Oxq6mWgX+Bd3J4aHV0bmVVYWNXXVFPTUhASVJETUM9ODg3NTo3PD46Ozw4OTw7Ozw7ODI0ODk3ODs7PDs4PD0+Oz08Ojk8Ojs9PTw6OkA9PDw7QD5CQEE/Pjk1ODs8RkFDRD9BQYijpqKjnqCfp6Coqpufm5yZmI6Xi42PjKqpqLGvsK2lp6ayr6mmq6CvsLu1vby4wMG+vLy8ua6sr7K8qZiZlWhNQFN5cU9JSUxpnYBaRVWwurGss6+urK22trK0ta6ppp+am52fpqieoKipn6GnlpuXl46dlI+Qlo2Xm6SooKCioqKlpZ2jo6CepaCkrKWmqKSio6OrrLOuqa6urqeqraisoZyamJmYm6qoq6ufpqKbo5yVkIyPkJCTkJeVlpifnp6bmaaXk4+Slp2ioKWipqSnoKKko6Ghq6uksq2qrKyno6yuraufoaKkpK+srKmmo6KqpKqqpKmrpqmsq6ahiHiDfHZ/emN3bG5dUWlUUE5HUE1MQ1BRQD47PjQ5OjU7OT07Ojk9OTk8Ozw8OzkzNjk5Njo7Pz06ODs6Pjw6PDs5Oz07PDw9PjxAPT88ODtAQEE/Pz45NDk8N0FDQkQ9QEOOqqSjoqGinaulpqimoZ6dmZ2PmJWTkJWnpKGmqKmlpKChp6uhnKKbp6u1sry9wMLCwL7AuLSnpKyovcGqpbxnRFOcflBYSUthSleOYmVlg6+1qrK0rqqrr7Cys62lnZGXk4+XoJ+ioJyjpJ+eqJSblpeMl5GNkJeTmJ2iqp+fn6Cjpaicn6ChnKKfo6ionKehoKSfrKisrKCpq6agpKimrKOenp6al5qrpqqxo6WonqCclZOQj5GRmZCWlZiXn5ibmZukmZeUlZqdoJ2nqKWgo6Kho56doKmqpa6upqipoaKqrqqnoaCio6msq6eppqShqaKlqaalpKKmpKijkn58f3V2fW5re2RoVlJkTUpIR09TTktOSDxFQDwyPzg1OTs+Ozk4Ozg6PDs7Ozk5NDg7ODc7Oz48Ojk8Oj07Ozw9OTw8PD49PUE+QEJAPTc6P0FCQEA/ODU1PDpAQ0BEPkFGlq6koqWeo6KpqKipqqWmnp2imJiZmZWbop6bnqOioKOgoZqgmJeXlqGorK62t7q5ure3u66ooKGpoKvGv8qfT0F1mXBQbUpMZGZ2dGFdYnSSsq+us7WqpqyropuZlI2RlZaYmJyfoqKcnaSemqSXl5eWkJKRkZOal5ugpKqeoaGepqeqop+gp5+dn6SnqZ6jpp+qnaqtqq6nqLClo6Smp6ymoqWimpmer6iusqulqqqgm5iYmJWTlpqTlZWalpuXl5mhnpyclpuhm56ao6eln6GioqOdm6Gmp6aoraOppZ6kp6mkpaWhpaSsrKmmq6eioKSjpKenoaCgpaKmoIl7gH13eXxleXlgYlNVYEhJSktTVElTUU05P0I2Nz02NTs6PDw5Ozs4Ojw9Ojs4NjU3OjY5Pj0+PDk5PTk9PTw+PTs7PDo+PTw/Pz9APT03Oj5AQEA/Pzg2NT08PkFCRkBAR6CupKaroaOqrK6tp6ypqKCipp6bm56aoJyalZmfn5uen56WlJOXk5KcnqSorq2sq6uvqq+pnpeepZylx8aLV1NKZqRZZn1vcltSa2RcZ2JgbZG1sLC4rKahnJ2alJeamZCOkZWRjI6Nk5minJejmZqXmJmUmZiWnZufpaapoKajnqeurqumorGjmqSmpqqioaqiqaSosquxsqu5qKarp6urqaysp6Ggo7GusrG0qrKuo5mcnZ6hmJubmpiZm5SWm5aZnaWhoJqjoZqcmZ+kop6gn6KmnZulpqWkpaijp6OepqOinqaloqWlqKykpq2noJ2eoJ6gpaGenqWgppmBe4F8dnZzaIJsZVtTW1lNUUpPT1ZNU01CNz5DNzg9NzY6PDw9Ojw5ODo7PDo7OTc2Oj01OTw7QD03ODs3PTs9PT06Ozw4Pj09QD5BPj4+ODg8P0BAPT43NTg9Pj1BQEZAQUihqqCrq6GkqquwramtqaelpaWkoKGfnqWXl5SYmZ6YnJ2blo+VmZKRnJihnaqip6Cep6Gln5ySm6Kan6qjjHlVanJ3dXBjd3ZYV2JgZGlbWldora6sr6efnqKglpCTm6CbmZeSk5+coaObnpuWn5qfl5uinqWhnqSfpKitraisqaSstLe2sKe0rKKtraOvpaSmoamorrWzsr22vrCssa6tqaq0sbCoq6iztrizuK2ytKSgnaWgrKGhoqGgmpiWlZ+bm5iloaCeo6GgnpucpaCfnZyhqJ+fp6meoaOkoKagnqehn5ymo5+ipaOooKmrpZ+dnZudmqainpyjnqeQgYKAfHh2and1Xm1bUmBIUlVIRlVXSkNNRz1LSDhGPDc3Oz49PDo7OTg6Ojs6PDk2Njo8Nzs+PT8+OTc9OT47PEA8OkA6OkA/O0A+QUA9PDk3Oj5APzo+NzU4PT0/QUBEQEJGnKueqamipamprqimqqWmp6aoqqGlpKOmkpOVmJacmpqcmpWTmZuNk5+ZqJ2un6eenKGdnpqZkpiem6GhoKR/b4JwYGNXS1tSWkxMUVlSSE9OSJmsqqmkn5+ZkpKUmJiWlpWMiIuOlZ2cnZ2el56Zpp+gqKWxqqeuo6uutrC0srGutri9v7qttbSwt7CutKmmpKWsqbmztbvDvMPBtrq2q66xubi8r7OwtcK8t76zs7WirKKpqLKpq6inqJqZnpqqp6CZp6Cfn6iopaSenaqiop6bn6igpKetmZ+jnp6nnqCmnpycoqGbo6KhnZympaWkn6KZnJukn6CboJyjiYWEfnZybWl3bWhtXFhbQ1dOSkdNR0NGTTw+TD40PDk2Oj0/PDs6Ojg4PDk6Ozs8NTQ6PDg5Pj4/Pjg4Pzk8Oz0/Oz1BPTo/PjxAPj8+Pz08Njs/QT07Pzg1ODw8QERCREFCQ5WqoKapo6mqqKmjoamgpqinrK6lqaWpqpSSl5mUmpqanJiYmZyamJmqoLGit6Swpp+enZ2XmJWZnpqco56ciWJXXmVgV01RRz0/QENEPz5CUnipramqpZ+en6KjnZ6dmpyblJOVlJ6dmJSFnZqgmqukq7KwubKysbKxur28vLm2uMO+v8K/tru7wMS5vbusr6exrbHCtrjCxsDIysDKv7C5ub25wr64s7vGxL3DvLezqrOtqrO0r7Ouqq+jnayotrGto7CmoKOwsa6wpKWvo6GgmqGmoaSqqpmdoJmao6CmqKGcnqKemaSenpiYo6OhpJ6mmpuipJ6fm5ubnIeGgXt0cmtrdXJxaFZcUUZVSERKUEk/RUE0Rkg5NTw+Nzs8Pj08Ojo4OTw4OTs4Ojo4Ozw3Oz49Pj02OEA5Ozs9QDw9QDk3PD07Pj0+PUI+Pjc6QUA+PD45NTg9Oz1DQEFDQkGRqqGlqqelqqimn6KnnKasp7Gyq62jqayVkpWalJecoqGbnqCinJ+psqu7sr+rr6ylnqCgnJyYmp+gmqCflXxfXmVgUEZEO0M+Rjw+OTZOfqqyp6OjoqCepaumnpiclJGZnZmVjIqGiIZ4bYigpKKrrLS8tsO+vrO7wcPCxcC/wsbGxcPIwsDFyM3QyMvDsre1vrK+xbu+zM3FzMzM0se+v8DCvsfGwrfDysnDwce/urS6u7W7t7C2sqq6sq67uL+7uqu4rauquLu1vK6uuaOmo56mpaKjqaaZm5+Zmp2nqqegoaGkmJSjlpSZkZydn6Sep5+en6KdmJmUmJSIhX56cmtjaW94a2VZW0ZLTEVEVExEQ0U3Oj86NTQ5OTc5Pj87PDs7OD48Njo9OTw9OTw9Ojs9Pj4+NztBOj45PT45PT44Nzs6Ojs/Pz1CPj83OkFAPTw9ODY2PDo8QT9BQUE+kqugp66ooqulpKKipaGlqquwsq2upKmmlJWWmpaUm6SmnaGqp6KrrLy8v8PBsrK4p6Ghq6qhnJ6hoZ2bmn1yaWFXTkU+SVl8b2FBPVyOrqygmZubnp6Zl5eXko2Pl5eTjo2QjIKDgndycW1wj6atrrS5xbvNx8u/wszNzczHydHMzMzHycXGzNDS1c7Tyb3Av8O7xsXIxdHTzdTQ09PMysLFxsbKyM/AydHMx8bIxsK8w8G+v7+2vrOtv8DDw8fFx8Svv7myuLzEwsK6vLy1rqenraigoqmlmpagmpmdqKupo6SknpePm4uQmYmVmJugn6OdnZeempOTi5WPhYF5dHNlYmdyb2ZeWlpDTkxERlBJRENANTU1ODlCPTY4OkE+Ozs+PDk+PTc6PTk6PDg8PDw7Pz8+PD0+Qzw7OkA9Ojs6Ojg4ODk7QT48QD8+OTtBQTs7Pjc4Njo8PkI+Q0FAPpOvn6ivpqiro6KloKampKuoq62qrqKqo5Kcl5ebmJuirJ2frqalsarFxszOzb+wwaikqKytqqCdo56cnpVpZlxUSURAP0uGnqSYg6CyraOenJ+amJeUkpSWkZCPjIeEg4iHg4CBgYB5cXJvbHmktrq5vsvB09LTyM3O0dPR0tHQ0dHNzs7Qxc7U1djS183Gx8nMw8XKz8rT19LX0tXW09TIzMfMzcrTzc7TzcXJysrCx8zHycnGv8Ozs8jFy8vLz8fKv76/vcHGxc3MycnAw8Cur7OonqKqo5qTnpyYnqaprKSlppaXipWFkZSHkpKSmZualpiQm5WQjIaRi4B7cnV2Z2NndmpkVldRRE5GQEpRQj5CPDoyMkE8RTw3OTxCPTs9Pzs7Pj05Oj48Oz44Ojk5Oj86Pj1APkA8Pjs+Ozk9PTw5Njo6Pj08PEA/Pjk6QEE6OT44Ojo6Oz4+PEE/QT6QrKKiqaanqKSfop2qqKOso6OnpqyiqZ+To5iWn56dpK6bn7CrqKyxyc3U18/Gu8esrbO3rK6jnqOinaGbYVNMSkRDP0NTsNK9sq+mnJycoKShnZqUk5WUiX14cWtlYmhyb3F7hYqAdXBucXRwhbPDvsXR0NfW1tLWztTW19TT0dPU1NPP0cTQ09bY1dbSy8nO0cvGzdHK0tXW2dbX09fYztLKz9HMz9DM09DAyMjKxMzMzM7PxcfItr/KwNLNzNDHysnAxMPIzs3Q0c/NysjNuLe7qJ+lq6efmJ6jnp2qpa2pqKiSlYiQhIyRho2MiJOVmZCWjJiSj4aHjIR9eHN2cGNgZXJiXVJcSUpHQUVJSj47QTg9NTU4Njs4Njo8QD07Pjw7OUA7OTo8Ozs8Nz09Ozo+Oz08Pjw/Ojo8Ozs5Oz89OTU7PD48PD0/Pz46O0BCOzk/OTg7PT0+PzxBQEQ8hqugnKegp6Oim6CbqaSlqaCfoaGmn6ifmKSimqmmoqarmqOwsamotdDU19rSx8bLtLXBxbG1qKGkpaCioVlJQEFEQUZRdrKvppqUl5+cmqCgnpucmpWJd2ljYV9fYF9eX19dYWx1c3Bwb2xycXWSxMjH1NbX19fT1tDV1NrU1M7P1dTU0dHM0c7T19bT1dDP0tPRydPRyNDY19jR2NLX2dTVzM/Pys3Sy87RwMbDyMbPztHR0sjMzcDLzMbTz8zPyMXLx8fJzMrU1NHVz9LM08K5xbGlqLWup5uoq6Wdsqiws62sk4+TjoiLjoOPi4SQjpmNk4+Zj4+ChYx8enFzdG1hY2ltX1ZQX0pKQ0ZDUk1APD40Mzo9NTI4NTU8PEA8Ozw6OTpAOjg7Oj46PTg+Ojo8QD08OTs9Pzk6Pz07PTw9PTo2PD0/QD08PT0+OjxAQjs5PDc0Oj48P0A9RkFEPYKknKClnaWlo5mcnaSeo6OfnZ+doJqnnpyhqZ+vraqqq52lrreoq7fY1NXZ2dHO0L+8zMm2vq6mqqiho6tlQzg9PkRYgqqon5eVl5manJ+dmJyckn1xZWNiX19hX15hYF9gYF9gZW1wcG5rb3J3d5zMwdPV09jY1tnR0tLXz9POy9LN1dTRys/N09bS0dbNz9XV0cXR1MvQ1NXWztPR2NfX2MvIzsTJz8zKzMDKwMnKzs7Qy9DOzszPz8jM0NDLzsvDysfJzcvM0tPN09LR0NDKvci5sK67ubWrtrCtqLits767sZqPoJSRjo2IjpCFkY2ZjJGRlY6RgIWJenZvcW9rYWRucGFXXFpJRkZETVhFO0A9MzM8PDg3ODU1Oz5APTk8PDg8Pjk8QDtAOj04Pjk4Oj88PTg7PkI6Oj08OkE9PTw6Nj08P0A9PDs9Pjg7QEE9Ojw4ODs+PD4+OkVCRT6Bn5mlp6Cfo6eam5+cl56eoZqdmpyappufpKefuLa1taykrK6+tLDA2NLX2tzWzs3Kw9LPwcGxqaytqaSxekhGQjtXjqGblZOWm56enpyTlpeUiGteXl5hZGJgYGFhYGBhXl9fXlxibXJvb3N0dnZ5pL/M1dHW1NPY1s7O08vOzsXOytLSz8fOzc7UzM7SzcvX1tDM0dTLzNDS08rO0dXS1dXKwMrCxc3CyMrDzMTGycvLz8vOzdDO08zGyc/NyMfLxcfBxsrMzdDSx9DPzs7M0MXHwbi5vcPDvcO4srK+sbvDw7WqmKWhmJaSlZWSi5SNmpGUlI+PlYKJhnlxcmttZ2BgcWhZWGhWTUdMSVBRQjtDPjs2ODo4Ojo1Nz09QDs6PD05PD05PT06Pjo8ODs9OTtAPD47Pj5BPDk9Pj1CPTs3NzU/PDw/PDw7PDw4O0FAPDo8OTs7Ozw9QTpFQUU+hJ6bqK2epKSqnJ6fmJKXm5+am56ZmaKVoamppcTCwb+7tbKxx8O4ytXW2drb2MzMz8jW1cTCta+0qJ+tl3hscHF5kJuNjJeVkJORkZWWlZCLfGVhYmJgXV5hY2FgYF9gYWFgX11bXWdycnByc3Ftcnmlx9PPy9DQ09TKxcnJxsa/w8XPzsfFx83K0sjLzs3G0dLQzszUysfLzs/Hx8/Sy9DPxrrEv8bKvcLHyc7Fw8fAx83IxMzLzM/IxMTQyMbCxsjEv8HHzMvMz8LLzMnHy9DExce7x8PIycLPwb28v7DByca5vaqwsqelnaKcmJCbkKOZl5mRlZiJj4J4b3Rka2BeZnFhW1dgR0hIR0lNVEc/Sj02NDM1NT09NDg9PT06Oz08OTo7OT89OTw7PDg6PDo6QD1APD09Pjw6Qz48Pz04ODk6QD4/Pjw7Ozs7ODo+Pzw7Ojc5PD49Oz49RkFDPYOgm6qupa6qq5qdoJeUjpedmpmgmpqcm6WysazJzcrIxL68uczMxtDV1dja29jQyc/P0dPIwre7u62jtn5og4Wkq5SOjZaPhYODg4F9hIR+c19bXl5eYF5gY2RjX11dXl9gYF9bWlxgbHJxb29rbG9vfbnRyMnKz8vNxLrAw7u7urq+ycbCw8DDyMrJyMrIwcXMxsjKzcnEwsvJwcHL0MXLyL+5wrvGx77Axs/LxMDDu8nHybvJx8XKwL7Cy8bFxL7GvbzBw8XMxca8wMnDxcfSxcHJv8rJxsjG0cPDxsOvxMvHw8q3v7y6tKmspKWYn5iso6Gmm6Ogm5V8d3N0ZmlaYW5tWltYUkRMRkJHRUxERlNANTQzMzU/PDM6PDw7OTw8PDg7PTtBPTo8Ojs3Oz05Oz07PTs6OD4+PEI+Oz88OTk7Pz07QD48Ozk5OTk6Oz06PDo2OTw+PDs+O0NCRD5/pZypsqm0rrCdnp6YnImUm5man6Kfmp2ov7i8ys/RzMfCw8bNzs7M1c/V2tjZz8vSzc3OyMG1w76xr7ZsX3p8oZGLkpaGeoCFhX92eHVycF9bW11gYGJjZGRlZGBcXF1dX15gW1laXGJvcm9raWtwb3OPx73KxcvAxsKwtrqysrOyscK8vLy6uMHBwcS+vbm9v7nEysXGwr3GwLi7xMm/wcm7t7u6xsO/vMHOw8a+vrXBvcO7vca7w7q0vMbEwsK3v7a2vr+7zMO9trrIu7++y8PBxsLFycfJxtDGwszIssfJw87MwMXDv72yt7Cyp6ioubClrbCqrayUenZ3amRnYGhvY1ZeWUpGSkZIS0FFQkZKQDk6NjU4ODU0Ozo7PDk8PDs5Ozk6QD46Ojw6Nzo7Nzo7Oz88OjxAPUA/PT8/Oz07O0A8Pj4+Ojk5ODk3ODo8PDw7OTo8Pjs7PjpAQEU+fqygrLWqt7SyoZ6fl5qNlJaan52mop2et8XCxMjO0srKycbNzc7RyNDF1dTV183KzsXJxcfBucW9q66mYGR2g5OLiIuEeH+Ghn9+hHt0dGNcXF1eYGBiY2JiZGViXVxbXF5cXl1aW1xeaHNxbWdnbnByeZ29zMDDusG4rbCxp6qtrKe4tLa0s7O0u7a9sbewta+yu8K8wcS8v7u1srq+wLjIubS7t8HCvbi9x8HEvLWvsra6v7TFt7u1q7i9vsC9sbq2sLe6s8a8t6+7v7W3tcW8vsPFwMTFxsfLxcDGxrvHy8DPycfDxsHDt8O9vba5vse/rLW7tbe2jnl0eGdnZWJrbl1WXmBGS0hISkZCREFFRT88OjU2NjYzMzs6Oz06Ozs6Oz44PEE9PDo7ODc5OTk7PDo+Ozk+Pz1APz5CQD1AOjo+Oz89PTk6Ojo4NTY7PT48PDo7OT49OT86PEBAPIi3pauzsby8sa2foJmUlJiXnqujr6qnpMbLzcjFyM3M0MzNyMnIysjKxNDN0s/NxcfBxsC/urfJtqqwmVtocIqPhYiJenh+hoZ2d4F8c2hdXV1dX2BfYGRhXmNlY19fXFteXF1eWltbXV9scG5pZmtubnJ8pMfAuLi1sKusp56iqaeeqqyzraqsqrSttrGzqa6nrLO7urbDubq6sau1ubu0wrqwwLG+vLu2vMi5w7atqqiwssC2uL2wsaexs7S7vKuutaautq67srGqubCuu667uLvAwL66w7/Gw8XAvMbBx8u4xcfFv8fDw7rExsK7xsnMy7O5wr27s4lzd3ZraWBibGhYWFdbQUxLTUpFQUM/RkE6OTo5OTY4NTQ6Ojk7PD07Ojs+ODtAPD05Ojc5Pjk7PDo4Ozs6Pj45QT0/QD87Pjo7PDo9PDw4OTg5NzY4PDw9Ozw6Ojs+PTs/Ozs+QDyKwKuouLe5w62zqZ2ZlJaZoZymsLWxt6bFztLLw8XBxNDHzcHDxr/ExMPDysLJyr/AvMK6s7W1w66qsJJban+Sh46Pe3h9iYV6e4SBd25eXVxcXV9gX19kY2JjZGJgX11aW1paXVpaWVpcZW5vaGZoaWtucoGturC1rqWlp6eaoKSgmpylq66kqKKrqqyrsKOmn6qttLaxvbmvt7Corri0s7y4tL2vuLm2srzBssCupaijq7Gys6i9qquoq6yttbOlqK6hpK+psqaoqK6lqLessbO3urq7sry+vr7Ev7XCwcfIt77AxLfEw7+7v8TCvsTIzMq/v8PAwKmHc3RzamlcYW9jV1ZYUEhZUlNLRkZFPj9AOjc4OTc3NjQzNzo5OTo8Ozs8PDc7PTs7Ozw4OT44PTs8Njo9Oz89N0E+P0A/Ojw8Oj05Ojs6Nzc3ODg3OTw7PDs5Ozo8OTc5Pjw+P0E7jMKvrry3ucSwtrCbmZWcmKqpsLGztb2vxdDPzMPHubnLwcu+u8m2vcO+usq3wcPBtLa8trGvtbutqKuSZG2Ig4eLgHp9f354dH58c3dlX11cXF5fYF5fY2NhYmBhX15dXFpYWVtbWVhaXF9ma2ZkZ2Voam9yhaqlrKWenKGklJ2kmpeRoaOpo6Ofpaanpq2gnZykpqyysLa3p7GtqKq0q7S6sba2rra5s7C6urG3paCkn6axqKuouaqkpqeop7KtoKemn5ukpqyfn6ejoKGxra2ssrSztLC1vLa7wcCyu77DwbG5ucKzwb7Atbi8vb68wsfFw8S/wMSgg3hwbGJmYGtvYFVZX0hOZ09UR0ZLRjw9QD06Ozs4MjY1MzY5OTk7OTo6PDo3PD88PDs8ODg8OTw6Ozc4Ojo8OTg+Oj89OTg8Ojs+OTc3NzY3ODg2NjY7Ojo7OTo7PDg1OTw6Pj5AO43ItLa9uLrAur22oJ6UnaGmurars7O7s8TPycvDxri3x8DMv7jJt7vFuLPEuLO/wKy1vLKspa+zraGjkWlyhoWGgHx4dXNvbWppaXBpX2BdXFxcXl9fYWNiYGBgYV5cW1xcWFlYWFhWWFteX2RjYmVnZ2drbW+InamflpWaoZabopiVjJ6hoqecoJ+kpaKnnpujm6CrsK2xtaSpqqqsrKS0uK23sKyztq+zta+wqp+en6OisqWmqbitoqamoKitq5mgn56ZnZ+lmpqjnJyer6mrqKqrra2wsrivuLm6sLa8u7qrs7K5s720trGxtrW/tr7AvsPCu7q9l4R6c2tfZV5kZFhUV11JV1xLT0dKSkdBPD8/QDs/PDA1NTM1Ojs5Ozg5OTw8Nz4/Oz07Ozg4PDg5ODw3ODo7Ozo7Pzo9Ozc4PDo9PDc0Nzc2NzU3NDY2Ozc5Ojs6ODo5ODo7OTo8PzuJyba4vru3wcHBtKSkmZqkpsCyr7astLfFz8jIwMa7u8PDz765x7i3vreywrSxu7usubqxop6pq6eYno9tfoWGf3hybW9ta2JeYWZmXV1eXV1dXF1fYWFiY2NiYV9cW1taWllYWFdXV1hYWFpeYmRkZWZmaGlrco2nnJOUlJqXmqGWlpCboqGonpydpaeipZygoZuZr66ur7KhpaOuq6eitbCysqypr7OnurOmtqCin5yjoa2joqq2q6Ojpp6lpqOWmZ2XmZudoJqXnZydnK2hq6ejo6atq7KzqrWwsquzubSvqq+ysrO3s66pra6yuLG6trq9wLizsZSFeXVmX2ZeW1lWU1pVS1tRTElFSEtJQj0/QUFAQToyNDUyNDk5ODk7OTo9PDY9Pzs8Pjs3Ozs3Nzc+Njo+Ozo4Oj07PD06Ozw6PTs4Nzk3NDY1NTQ2Nzg1Ojo4Ojk5PDg3Ojg5PkA6gci9uL2/tr68v7OdpaOYpbHCtba9rbS4wczIxr/FtsHAx863wMS9s7m5s7+2sbm7rbK0r5+apKqglJqPeH+DhH94b3F0cWhlY2hkY1xcW1tdXVxbXmBhXl9fYF5cW1pcWllYVldXVlhXWFdWV2FkZWNkZWRkaGp2oJuTk4+TlpaelpiTl6CdoZyWoaGppJ+fqZ2bm6unr7CrnKOkuKqhoK6otqqnp62xpLiwpLego5yZmaqnoZqsua+ioaScoqCgk5ShlJaWm5iYlpeclZ+pnqmkop2jqqqxrai0rKqnrbOwpauus7GwsK+vp6insq6xtK+8tLq4rqOUgXp2ZV9hVllYU1JTS01eTFBMR0hMS0U9QD49Qjw7NzY1MzQ5ODg5OTo5Pjo4Pj47PTw8Nz49Njc2PTc7PTs5Nzk7Ozw+OTk6Ozo4Njc2NTQ1MzEwNDU2Nzk6ODo5Ojo3Ojs5OT1AOnbAvLS5wrG+t72unaenoqq7wL3Aua60uMHMx8XCw73FuMjMssHCwa68u7W7vLW5ubCvsKqcmaGplJGKi4CAfHdxaWxydHBoaGVkZmFcXFpZWlxcXF1eXVxbXF5cW1xZW1taWFZXV1ZXWFdXV1ZbYmNiYmNiYmNmaYGVkpSLkZOTmpiclZacn5yflqCgp6akpqefnaCmoKqvpp+io7eooaGiqLOipailsKWxrqy1nqGdlpWpoaKUrbGxn6Ojnp6Ym5OLoZSRk5iYk5eYmJeep5unoqKapKWlq6SlsKelo6usraaorq+vq6iqqrOlpquvtLGuvLaxr6+gknp3cmVhXFtdWE5MUUhSYU1WUE9KTU9FQkQ/OT02OTo3NjQ1OTk7OTg4Nzs4OT0+Oz47PDY5Ojc7Njs3Ozs6ODU6Ozo7OzY8Ozg4NDc3NjMzMjEuLzI1NTY7Ojg7Nzg3Njw7Ojs7QTh4u7uxtb2wu7G3rJ6lpqy3u7zBxbqxubXEycnAw8bFx7bFxLPBv8Wrt7e9tr26u7Wyq62omZifo4uJdImIfnZuY2FmaWhmZ2lmaWxgXVxbWlpaWlxdXFtcXl9cWlpbWVlZW1dVWFdUVFZVUlRSVWBgX2BhX2FhY2RpgJKSiI+Nk5GSnJSVlqSZoJedoKWiraalpaOko52qq6Wan6WxqqChnqWrnqiin66sqamuraKiopWXopuckKupsJyfop+fl5iTip6RjZKTlpCYmJOcoaOdpKGilaCipaabo6uloqSrpKuupa6yqaalpqa0pqmorbO1tLm6sKqsnoxycG9gW1dWVVJGUE5IWlxQUklUS1NMRUdKRDg7Oz08OTY2Nzo5Ozo5NzY5Nzc6Ozo9PDw2Ozw4PjU5ODo4ODY1OTo7PDk3Pzw5NTc4NDUyMTIxLi4xNDI2Ojg2OTg1OTg5ODk7OUA5e7W0rLS7srCrsq2dqKevubmzwMi6tcCvxcjMusHKzMi1ybyxvcPJrbG4wbW8wLy0taqsppWZm5uIgXKIg3t0aWlqbGdqbG1ramxlXVxcW1tcWlhaXVtbXmBgXFhYWllYV1hXVFZWVVRVVVJSTlFZXVxdXV5fX19iZG2Nj4OQhY6QjZmTlJKcmqKcm6GpqauorKeppqSZpa+llZqlr6mgnJmboZ6vmpyrtKClpp+jpKGUk5uWlpKpqq2anaChoZuUkIyZjoyRjJKNlpWQnaKgpJ2co5WboKOhl6Koo6Ooq6Crr6Stt6ajpKKsraqoq6+zt7K9tbOrr5iFdHNoW1hZU1VSRVhMUVtYTVROUExRUklOSkM9Pz9BPz03NTc5OTw8OTc3Ojc5Ojs8PT47Nzs7Oj02Nzo7ODk3Njk4OTo2Oj05OTU3NzU3MDE0MS0rLzQzNDk4ODo6ODo6NzQ4PTg/OX6zraezt6+op6+um6morLe2q7zKu7a/rMvGxbjBzs/Is8S6t7vCyLGtuL+3vL27s7WmqaCWl5iWh3p0gHZ3bm1obW1tcGdnaWZkXVpbW1tbXFtZWltcXF5fX1xYWFlYV1hXVlVUU1VWVVVTU05QUVlaWlpdXVxeX2FlfYuAin2Kj4mSjZaRl5mioJugq6qmr6yosaWpmqCtoZWWpainnZiQj5qerpeZqKuZn52UpaGfkpGSkZOVqKulmpmZnp6WjoyLk4aJjYOPi5KVkaCeoaSZlp+VmqGinpSbpaaoqKigsbCmsb2on6OstKqup7C1sLm1wLGusauRfnJzYlZUVk5SSkdWUFJSTExXTUpNT1JHTUtBQ0ZERD5BNzU4ODk7OTo3Ojo3PD06O0A+Ojk7OTo/NzU5Ojk4NzY5NTg3Nzk7ODU1NzY3NjEzMjAtKi4xMDI4Nzc7OTk7ODk0ODs4QDh/s6ymsbeqpaKxq52qp6mysKS2xrS5urPKxbm6wcvQyrG2t7y9wcOxsLG3rbS0u7O0oqOdnZeXlIOAdmtnbG5xbnJrcGtkZWdlXlpZWllaWlpaWlpaXFxdXFpYWFhZWVdYV1VVVFJTVVNWVVJOTk5SV1hZWVlZXFxdYWp/eX50h4yGkImXiZSUmJuYnqmboKumpqyeqJqhppyTj5+jmpeXhYSSm6SQlaOdlpaWiKKbm5OLjoqQmqWnnJWVl5uRkoeUjouBjI2AkIuSkpKgmqGilpSYmZWippmNmaSmqaahoLSyp7K4oZyitqypraSysqa1vLWrrLGjiXlzbl1OUVFMT0ROTk5QS0ZOTkpKTk5RSU1KQUhMSEhDPjg1ODg4OTo7Njk6Njg7OTk+PDg6Pjk7Pzg3ODk6ODg2ODU3Njg4OTc0NTc3ODIwMzAxKyktLzEyODc2Ojk5OTk4NDk4OEE3d7ampLawpaekqqWgqaaks6qissO1tbKzxsa2usPKzMazrLm9tLjAr62psJ6mrrqvrZ+Zmp2VlId7g25fX2ZycHZxaW5pZWdoal9YWFhYWFlZWVpaWVtbXFxZWFhXWVlYVVZSU1JQUVRRU1VRTU1LTFNXV1ZYWFhYW11hbnF1b4OHgYd/kIOOipSRk52hj5qco6KkmaWXopyVjYiZmoxzjYN+jpeWhpGakJSOjnuZj52Mgol/ipigo56Qk5iWhY6DlH5+dIqNepCHk5CQnZuampKWkJ2Oo6OOiZqgoaSkm6K0r6ywrJ+YpbimprGhsK6csLyqqa+qmYN3c2NWTVJPUE1DU05MUE1CUFFISU5STUhKSkRLTUZLSz03NDk4ODg7OzY5Ozc6PDk6Ojs3OT85PkA3OTo8ODk3NjQ0NDU4NzQzMTI1ODUvMDEwMikoLC0wMjc2NDc4OTo6NjU6ODdBN3i3oaO0qaalqKOmpaamprOnpbTBuLC0sMnEt7nBzsa9s6y6waytw62ooqaSnaa2raOgj5WWkpB9d35mV1ZfZ2ZpZ2huY2lpZ2JcWFdYWFhZWVlZWVlaW1tbWVlZVldXV1NUUE5QTk9PUFNUUk1NSkhOU1NTVFVVVllbXWpqcWt+hHtzTlhyj4KXho2cl4uUkZ+YnZWUlpWPloqAlIlfO1ZvfIyUioGMkoyQhoZzioWXgXmBe4aTnZSDlY6RkIOGfZN4cXCGjH2JgZGNkJeamJOLkIqdiJ+Yh4iWnpqhoJenrqmtqKielq2zoqaumayrmKi0o6mto5N/c25fW05TUldMRFRKUE1MRk5PSUVMUU1LT0pJTVBGSUk9NzU5OTk5OTo3Ojs6Pj44Oj09Nzo/OD4/NTg5Ozc5Njc1MzMzNzYwLi0vMzQ0MTEwLy8oKSsrLTM4NTQ3Nzk8Ojc5Ozg2QTl5t6CjrqGmpqqgpqmno6mvqKe0wrmwtbDHwrezvc+/ua+utcKnqsWqo52Yg5ScsaKamIaUj4uHfXN1XVBMUVVZWlddXmJnY19ZV1dXWFhYWVpZWFlYWVpaWllYWFZXV1VTUk5MS0hHYlxNT1JNS0hGSE5RUU1PUlRWWFpgbG5neoFzUEI/f5WSkX2IlYyEio2bjpaVipKIhpWHeYl/YEpRbniLkoR+hI2LhX9/bn9/lHh1dniEjZpwUY2IioZ8fniUdmh3hoh+iomWi46RkpaMhIqIlYSbjYKEkpqWnp2UpKOoqaWknpuwqqGkpJGmqZaiqpyipqiJdm1mXltIUVFTTUlVTVJJTEtPSUhGSk5MTVRLUVBPRklDPTc2OTo4Ojs7ODo7OD4/OTk+PTg7PDY7OzQ3ODs2Nzc1MzQ0Njk2LzMvLjEyNTIyMS8sJykrKiw0ODMzOTg5Ojk5Ojo6Oj85d7aco6edn6Gvoaeopaeor6yqtby2uLazwbu2qLnIuLaoqLW2qrK9pp6VjX+Jk6iWlYp+joOCfXdwb1hNS01NTkxNUVdbXFpYWlVVVlZWV1lZWFhZWFhZWVlaWFhWVldVU1BNSkVAQJtrc3NJTUtERERJTk9oWU5RU1RVWm6DcnV9aWhcVJCJlIh0foaBfIWMk4KSmouPe4aPgHaAeHNvdnF0jo6Ben6Kq4V5e2h2e45wcm14gYuNknh6gHuAdnNyknhndYSEhIV8lYqIio2KgH+Ei42AlIR8gI+YlJyWkZ+dqZ6foJ2gqaWenZiNp6SSoKCWnp+kgXNoYV1cSldQUkdLWFJPSkxNUkpKSkxQSExRTFJUTUVIQjw3Nzs5OT49Ojs8OThAPzo6Pj03PT03OTkzNzc4NTY3NTI1MjQ3Mi8yLiwvLzIwMC8tKygoKS4xMjcyMTk4Nzo4Nzc1Ojw7N3aumaOhmJ2ftKmvqqWtq7Cxqr20sry4trq0sZ+3urKqnZ2sqaiysKGakY2UgI2cjpF+doZ4fHZvb2lYS0hJSEdFSEhQVFRUV1dTVFVVVVZXV1dYWFhYWFhYWVlXV1VWVVNQS0Y+OTNOPH6eTUhKREA9QURqlH5MT1FRU1ZedIJ7eGZ2jJaYjY58Z3mBdniAiZB9hJiSgXGHj3x3e29rfq19dJCLf3uGkoF8f3VmdnyGbG9nc3yJjIeAbHlxfXFtdo9xaHGBfo5wQ4uFgoOFfnd3eoyGfYx7dX2Oko+Yi5Kam6OWmZyanZ6hnJaNi6Wajp2XjpaYkHhvbWZjWlhYVVFKU1VUT1BOUFZLTktPT0pST0lOUExGRDw8Nzk7Ojo/PTk8Ojk5Pz87ODs9Nzw5OTk5MjY2ODU2NjMzNjExMjI0LiwsLS4uLTAtKyonJyouMTM2Mi84NzY5NjY1Mjc5OTV5ppegnpahprCsrquoqbGvsau8uKy7vrizrKebsKesm4+WnaWppKCYmY+FknmIjouKdXF7bXVwam1qWEtGR0VBQENESExMTVFSUFFTVFRUVVZWV1dYV1hZWVlZWVlWVlRTUUtENzhmNzA/qGlOSEM9OzpEioV6WkpOT1FUWF1lcHJsiKeqwH50eWJ7eG98eYmQen2Lhm9tjJJ5dHlqaoCCcZaRi4F+loBJkphuaHh+gm1pZGx5hZCShmtzbHxucnyGaW5wf3ONiYSGe35/e3ZvdHSGgnmBeXB8joyKk4OWl5iakJKWl5mXnZaMg4mekouSjYaQloBvam9ub1hWWFRSUVlPUlRUUlhVTU5ITUpNT0tDSU5HRkA6OTk7OTk6Pjw5PDs6Oj0+Ojg6PDk/ODY4NzI3NTY1NTQxNDMyLzAyNCorKiotListKigqKCcsLTEyNTAsNTU2NzQ4NUhBODk1d5mRm5man6WssKOtqqi1r66stL+rvMO/paKalaSYno2Ei5ShoZmZkZOLc456gIaMhnRvdGtwbGRsallOREZDQDw+PkFGRkdLS0tNUFJSUlRUVFRWVldXWFlaWVlaV1ZUU1BMRTFAmjMganNDmW87PDk1PICChl9JTU9PUldaUVlcX6eHYZppc3llfm9tf3qLiXaCiIZ0bJqSdHN8amqdj015hZOJhI5nMXaGc2x+fYN0ZmV1f4SEhYBmaWx1a3GAfGhxcXxuk42PfHR+fXFwbnVtgn93eXVqeYmCiImDlpKSkIuNkZSUjpeNgHmIl4iGioaAkIh3a2tvaGVYUlpXWVlbTVBVVllYTklIRUpKSEdDQEdFQ0c9OTk4Ozk6OTw6OTs6OjpAPDk6PDk4Pjc4NzcxNTIzNDUzMzY0NTAzMS4qKispLCwrKykoKycpLCwyMjYsLDQ3NzU0NzhpTzg7NW6SiJqRmZajqK2esZ6nuq+rsrDCsbvDx5qWj5SZi46FeoSQmJSNkIyPhnGHgnSHjIZ5cHJwb29kcGZfVEZJQz88Ozk6P0BBRENFR0lMT1FRUVFSU1RVVlZYWlpZWFZVVFNQS0U4MC9cYLNHOVhQOzk0NDGWuotITE1PUFFWTEFJUUlir7KgcXt4bH1scYOChYF6hIaGeXKhlXR4gHN1lIc1cZ2onY6hoYSihXZwh3yHfHSMro2JgGhnYmpucm1wgnVpb1h1cI6bkndsf3p9bXJucIB7c3ZuYnaDf4aAhZCQioqJkYuRi4uOg3V4io6AfoOAfY57c3FxbWBbXV5bWVhgX1JOW1pYV0xISkZKRz9DQUJIP0NEPTs5Nz07Ojs7OTo5OTs6Pzw4OD06ODs2NjY1MTEyMTI1MzQ3NDUzMS4vLCwrKSopKSoqKikoKikrLzNETTIxNjY2NDM8dlI3PTdikoGSiJaRnaSnn6+VpbSprrGuwbK7wcWWkIyUj4CIfG6BkJKJg4qHj4Z1goRslYiIe3R4eGx3bndjaV5KUEc+PzY0NDk7Ozs9PkBCRUhMTExMTlBRUlRVVldYWlhWVVRTUExFPDUqnUtbQC1nSTk0Lz+Sg6muX0hMTU5QTDdDTVJTREqGdoB8fHZ+bHaIiHx+hYN/jH51opl5foaBhJmEmpxhhqqfnYuDkI16d4h+iYmOc4uXj4R6XWRxdHp8d4ptaGpieW+FkIJ6boF3dIR6cHR5eGtuaV12hnyHfIeHjn+KkpeDjYWMhn1xhH+EfXV3e3yJd3BzdGZnYFtbXlNbZ15XUFRYW1VHSkpES0c/RkBEQz5BQT07OTc8Ozs9PDo6OTk7Oz0+Nzk+OTk4NTY1MzI0NDAwNDY0NTU1NC0sKSsoJycnJigoKSkoKCsrKy8wMFVxPTIzMzMxRX5XND05XIx4ioCUjJGcnZ+mkaCqoLGor8Cyu8W6lo6RlId7hnZrf4yRgn2KhI+MeIOAc6CEin18gX9wgH56Z3ZrUldMQEUyMTEzNjY2ODg6PD5BRUdGR0pLTU9RUVNUVVdWVlZUU1BNRkA6Mj0gI5ZjjFs1MzExaT9Hb0lGSUxNT1JMS1RdWVJKaISIe4l5fHF8j4x6fYmHfpeHdqGZiIePkpSljayqSIaur6+LgYCTi4KLgoSSqYeAmJiKm3RtfIGGh32OaGdoeX9uhYeChXGEhkdsgHdyeXZobWtfdn2CiH+HhIt5lJ2ciYuIkX96dYt2fHhtb3d+gHR0cmxbXl5bY2NYZ2VbVE9QVllQRExLRk5JQ0ZDQ0BAQ0E9OTc4Ojo6Ozs6ODg4Ojo/PjY7Pjc1OTU3NzMzNDQyMzY2NTY3Njg7REZMTU1MQzcrIiUnKykrKywvMDArbnUyMjQyMEyBXDU9PF6EdHx9iYWHkY6Wl5KXoJ6toaa4r7O9s5eNkouYi310cH6Jkn59jIKSlH2Gfoakh4h/goiFeIeIfnOEeF9jV0tCNjAuLzIzMTI0NjY4Oj0+P0JFR0hKTU5RU1RVVFRWVVNRT0dDPzgwLCOHWz4/ODQuXZZwc6NVRklLTU5QV2BYcFlcXmmNk4eVgISChZGTfoWIkYGalYKhoZiVm5umrZOau7Gnu8fDqIuMoaWPlIqBkXxxg56fkZx/doaFi5CHkGlocISBdI2HhIpxhoJ3h397doV9bnZ1Zn+UjoaJiIeIh6CropaJjpd/eoKIeXlvZ2t4fnt+dGxlXltbXmpdYWZgWk9LTldSUUlQSkROR0NKREJBRERBPDo4Nz08Ojw6ODg3Nzg6PT04PD02ODc1NjYyMzQ0NDU3Njg2NzxCQj88ODo+Q1FeZVxHMicmLCwtLS4xKD+LWy4zMTBPg180PztudXBmd4N7gIx/gZCOipqbpJ2hrKarr7CXkZGEoZSEeHd/jJR8fpKFkpV/ioCSm46DgIGMioKJjYN/ioBtcGpdQkA0LS0vLy4uMDIyMzQ3Nzk7PT9CREhJTlFSU1JTU1RSUE9IREI8ODcvOUQ+PDw2My5sk5dNUElJS0tLTlZfY39nZ211nZuPmpKTi42OmoiTj52LoKCSo6qlo6yTqbaiqMHCrseveLqUmnyNoZ6ZhJOFgo6in5OYkoSKhY+ZkZZscHWKjIKWjI2Od4+EcW2FgYqWkYOFiHGIoJWGkomOj5aktambjZSig4eTg31/a2pqfIGBgnRiXmRgW2drXWxrXldLR05SUU1MTEZJUENETUZBQ0VGQj05OTc9PDo7Ojk4Nzc2Nzs6Nj06Nzg1NDU2MzQ0NTY2NjY4NTU2MzEwLiosLCkoKS46UGFcQCwoLSsrMCwncog3MjQwT4RiM0A8dW5nWW+Cb3WGcXaShn6XlpqUnp6cp6CplpOYnmdlpJp+hJKReX+SiJGSfYqEmJKQgoCAi4yJhZCHhYmFeHh+Z01SPi8uLiwvLi0vMDAwMjEyNDY3Oz9DRU5QUlRQUFFTUU5QSUVEPjs8OkNGPz48NzUyPD9SNUhISExMTU5SXm+KfHOBfaCdm6elopmhl6KUnJ6onqirn6isqaq2l6u/q7bIyLfJ0c++m6Bwaaupn4STkoWcoZqbmaeRkYiVopubeHp+lJiSoZOXl4GUnnt3lZKrsoiNl598lJ6bjpKVmKOiprawnZGZqIeWj42BiGxzc32AfXJpYF1iYGJoZGBnZltSRUpLUE9JSUxGRk1DSExGR0RCR0VBOjg1PDw4OTk5NzU2NTg+NzU9ODQ3NDU3NTQ1MzY5NTg6NjE2ODYzLzAuLSosLy4tJyMqO1hiQigqLDEtKEuXXjA2M1GFZjJBQGlhXlBwdGBtfWF3jn17lI6Oip+Sl56Wm6qYnqpCRH2HiYeYjXiCjYqOjXyKho+QjoGCgImLioSShYOGiYGAhnZeYlA0NjAtMS8sLjAwLy8uLjAwMTU+QUJNUVJTUVJTVFJOU0xFRUA8Pj1HR0BBQDg2NjI8OTtGSEdJSk5PUVlthZB3lYqjp6q0vbikraysp6i0q7C2srKtu7GzvZyzw6u6ycu3w7+4paKws6ytqqOLlpiFpqago5eBppmNoquopYiFlKShoKuhpKmPm7CLlaOmt7qboKOwkqKdop6Qo6Grr6yytaKUpKqImYmSiZV6en2Ff2hhaFxlY15kZF5mZ19aT0NJSFNORkhMRkpHRkZIQUtGQ0ZGQTs4Nz08ODg6OTc0NjU4PDU0PDc2OjQ0NjQ0NzM5PDM4PDIwMjU1MS8xLi0qKi8sLSooKiYlNVhYLywwLCwwhIE4NzFQhWg1QUNbWFRMaGNXaW9YeoV2gZOFh4Kbg5KQjJLayJ2Wc1aXiI+InI98hoyOiop6h4KHkI6DhYGMhYaHkoaChImGiIeHcG5hQEU2NDwyLzExMC0sKy0xLi00P0NBTVVRUlNVVVZVTltQR0dEPD4+RkhDRUE3Ozw1Qzs9RktJR0hST1BXgZKghK6js6qywMfDqrPFtqyzv7O4vra/tMG2u7qjuMWotsnHtb65taijtK2wsZuZkpqfiKevq6WUdp+kl6GssrSZlqquqK62u7K6rK+1orGrsbW7t7SutKCnqKOnmqmvrbK5t7inm7aojKSOkZKfhniCg3ZaYmVXZmJiZGBgZmBbVElERExVUUhJSkRJR0VBQEBLREJNRzw4Njc7PDk3Ojk4NjU1NTcxMTw4ODk1NDY2NDk3Pj0zODkxLjAxMjExMzAsKiwuLCsrKyooJyopRVowMCovK2iSTzYwUodqNkFGV1FKTFtaUWJjV3l1cYGUfYSGk3WFf4CMe7+7o7yCtJSTjZuPhIiPkomIeYaAjJKMh4WBjn+BiY6GgIaIhYqHkXp4bl1WQEVOPDY6NDZBQjc2NC8vNkNIQ1FbT1FVV1VcVk9eVUlLSkFAP0dLRkZEOz5AN0Q3P0JKSkVGV1RQXo+kraOxtMO2uMHMyba7xL2zs8C2uMG1vq+3dLGzpbrEpLDGubGzsbSopLW2qrGgopabopKlsK6mraynpJigrLS7oqiyurW8v8y/xcW9vbPCt7q4vre6t7msrLCmsaqtvbC8u8LCrJm6qJOtj5eXqol9gn1rV2RiWWtlamZXXGNZVlNJR0ZMUUdDSElBSEQ+P0JCS0BATUQ5OTY2OTo/Njo5OTY2MjQ2LzE5NTk5MzY0NjI3Oz0/NjoxLi81ODo5NjUwKigsLS0tLCwqKCgrKyhFUy8qMDBKj2s1MlCHbTY/RlJMQUxSV1NZVVp2anB+joSAjYNuenN4h2K5oZmjiZSUlpKUk42QlpKHhnuGgY2VioCEgYp6fIqHhn2Kg4GKg5V9d3p1ZU9cZEdFTDtRY2FbXlNGPztIUEVaY1FSWVhaZ1lUYGBNU1BFQT9JS0hFRUFAQzxFNkI+SEdKTFNaVF2Trri1urjIv7q9ycy7vMC7t7W7ura9tLqxxmB1sqSxmp6rvaqlqKurpKKytaCrp5+Vlp+Yn66lp6aln6OUo6extKeys722wb7TycnTx8LFzMLKw8C+vb+7vLe0r7i3tsO5xb3CyLCeuamhq46kp7aIgYFzYGNiXlhiYGlnUlhgVlFVSUVFTktAPkdEPUpBPUJAPUY+O0hANzk2Mzc5PjQ4OTo1NzA0NS8yNjM4OTM3MzQyNj84QD5HS1JUU1FQT1FRUEpBOS8sLCwqKygoLC0sL1A+KC40OIB9PDJLiHE5PkNLRUBJTVBSS1FdZ2xrcI+NhY9zbHJzc4fVwLWZoI2VmJmRjpeRlpaOhod9hoOMlot+g4CDeHuLg4d8i3mBioKXfnR9emtlcHVZXVxQZWRiYGVkXVtYV1xNZG1VUm1tX25fWGdkVVlVSkRCS0tIRkhISEdBSTlEP0hLVFRWXFpbk7nAuL23xsC7ucrKura5tbi5sre1tK62tplkdaicrXBeoqycmKCim6Seq6WUn5+QlI6WmJenn6WfnpqZg6SdrKWqsK24sL251NHO1tDJzNLMz87Kxr+/wsq9wbzBwMTExcq+yM6zpLuwtK+aq7i7mYB7bV9hXVleYVpjY1BbYFNQS0NBRUZFPEBFPkFIQUBEPTpFPj1KPzQ3NTM1Oz00Njg5NzcwMjIvMjQxNjk3NzU1NTREM0VMTT41MS8wMDY6NDc3QElPSTstJioqKC0uLyxATSsvNTRtiUkwSIl0Pz5CREBDREZLT0RRXFloX2+XkpCUbmxvdXWHs6yhoJ+LmZyZjI2VkZuShYqKfoiHi5CLiHyBhHN7ioOFe4l0gYmHlX9ze3lrbXV7aHJlaWxpZmppaGBmaWlsWm1zlq2kvIiHZ1tvaF1aWlRIS05PSktQS1NRSExBSkdKT19eYmZpYZe3x7C4sru9tbHExrWwuLCvu6uysaert6uNtaedmqeaTpqdjI6flpGmmKWVipOTiZCJkJGRnZuhl5qVloeemqebrK+osKe0tNTU1NbSy8/U1c3Tz83FwsnQv8rJysnRx8zNwtDSuK/DvMS5pba6w6KDcGVeXl5ZYFdZZlpRXVdPUEJCSEVCSDtBQz5BRz8/QTg7RD5ASD00NjY1NTs6Njg3NjU0LzEwMTQ2Mjc4ODc1MzY3QzVCOD8tMC0xMzQ5PTk3LC4sMTtGSz0pLCguMDAwN0s/LTQ2VIhXMESHd0M7Qj5FQkFDSk0/VVlTZVZzkJCYgmhxb3l5g6CqnqWWjJqbl4uNlZGajn2Ji4WNioqKkId8hIJwf4iBhnuHcoORi499cXh1a3F4fnF7bnhzbGiBcG1jam1weGl3fH7Lv8Hfp25jeG5jW2FgSlBSVU5ZXlBdXE5QTlRRVVRcbm12gnGWrbistKavtqqsvMCwq7SmpLimq66gq7SjjrGtmpeYjJGTkYSOm4GNppGciYOLhIqJhIuDlJWXl5OckZyYmZmfnquspKeirK3P0tXRzcvS09TQ1NHOyMPU0cfN0tPT18zR0cXS1sXAzsfHwqi+t8+eenBmX2NdV2BTXVpQUVRQT0g+QEZBQkU8QEI+RUQ+Pz86PT08PEpBNDU0NjU8ODg4NjY0NDEyLzAzNTI2NzY4NTMzOz08RT1AMTErLzI0OT41OTAxMDIyLTJETjMpLzMuMzI9TjIzOEN9XzJBhnREOj09ST5AQ0ZIPFZSTU5bdYaFindsd3B9fn+hnp6hi4yYk5OMi5OPloR5hZCQjYuKh5GHf4J7cn6AgYd6hHWFk5CIf292cmtzfHx3e3OBd3FqgHNyaXBxenlyer7Lmn6MsoR2coR2aGFrXUNaWltWZWNYZGpTWF1dYGReY3h6fouBmKmjpKGfoKilqrC4qqWzo6GtoaOtoaexn4mmmpOSkYmRj4iBlIlqlKKMmYSAhX6Rg4OTlq2LlY2Vmo6GkpGel6ewoaChpaSoyM7PyMLL0dTR1NPO083G1tLM1NjW1tjU19XJ1NrNydfX0cqsw8PMjHRwZGFgWFRZVFxQS0dKSkpAOzo7REFEPEJDPkdCPkJCOzw5PDpHQjQ2NTQ0PDU2ODc1NDMyNTAvMjU0Njc0NTU0NDw+PUU/QTYyLy0xNjs9MDgxLzI1NC8tLTtSMDE3LzUzMkZEMjg+bmI1PYF0TTk5QEk8QUQ/QTtQTEZLWXCAdX1oc3hygomAnZWdlIWLlYmPioiOh49/eIOUmIqNiIiLiX6CeHN7fYOHd396h5GWgINud3BtdX92eH10hXx5bId2dG59doR1eHydtYw7QYrFpX6MfGllV0lDZmNlY2dqZG54W15maGtuaW6Ag4iRi5ydoJ2Ql5ieo6OmsaOjs5+hpZ2gqaCjsZyGnpKSkpCKjouGg4+EfpybjI2ChIV6lH6CqZWjjJGKl5KLfZeKmpKrs5ianKicp73Dxrm2xs3S0NLQzNLLydTO0NXa19fY1NnYzdjbzsnZ2tHWvsvMtHl3cGZeW1NWUltWRkdKSUVFPTo3OkBAQjpHRD9EQ0FEQjs/Ozs3REM3NTY1NTswNjg5NDQzMzQxMDE0NTU4NzQ0NDQ5QD5EQkM8MzMuNkZUV09RSkFKRj8xKiguQlMzOTI1NC83Szc1PGBiQTxzdlY4N0FIOj9DPjw5UUVDSlRrbm5wYnBxdIaNfJeRnYt+h5KDiYaFiYKHfHiFlpaIj4OHhYZ6hHlxenuEhnV6hY6NnXmLcHxvb3p/cXuBcYOHgG6OenV3fXyCdX57hoevc1ipwraNkYJwbmI9XmhycHFwbnh2gWVob3J1eHF6jIeOk5GblZ+Vh4yTm6CbnqqfoKycoZqYn6aen6uZi5qMkJGNhH2Ih4OFi46gmZOIg4d+bZl5hJiGiJOMjZSMhnybiJSPrqqUlZifmaeutb2prb7Hy8nJzMvQycPSytTX2NfY19Xb19PZ29XQ29rR1sjUy5V7fWppXFtQU1ReSENGSUg+QT49Nzo9Pzs9Rz0/QUFBREE+Pjo4NkRCNzU1NDc5LjU2NjQzNTU0MjMyMzY0NjU1MzQ1N0VCRENFQjU2PEZOU01bbmZjbnNrYVY+LDRMRzg2NTQzNEJGND1XX2hMdXheODs/Rjw8Qjw6OkQ/Q0dSa19tZGJma3aAiHGRkJqAeoCNfoKCgYR/g3x8hJiOh4t+hoaAd4J5b3t7h4J0epKejaB2jnWCdHWBfXSAhG+Bj4FvkoV0fICEenaGe4i3xaTBybiClpuPd3BlTmZjgXqBd4aikIp4eXZ7g397hHZtk5aUlY+XkIOJjpaZl5alnJeflp6SkpejnZmrlZCQiY2RgoyFiIiBhpCRnpuZiYWMgYaXeoiIn5ePiI2Ki4J9oYmQi7yhmJOXmpyppqWun6i2v8DAucfJzc7FzcnR1tXV2dXX29TX2drb19va2tjO3MaHfXtpa2dhVFhVVU1MRE5DOz09PDg6PD45PUA2PT9APD8+PDk4NjdEQTY0NTU9ODA2NjU1NDc3NDU2MTM4NTU1NjQ1NTdISD1ESkU3OTI1O0g+Ozo6N0lQXVpSVVhLOVQ+Ozk1MzI3STg9TllNSHh4ZDU9PkM9PUA6Njo+PkBFUV9ZZWFdW2h0enlsiY2Sd3Z6inx+gH5/fIR7foKRiYSFeoSHenV9dG18fYZ+c36SnZGeg5F8hn54jn14iopugpqAdJmGfYGIhHt9kHqPqI6Pw6G9jJyjnX2JhH2JcouKfnOmmpyYk4V7jpCIhGhHcaCknYyLkJKFiYqQkpWPnZqTlJCWjIuVn5yUoJSRjY2Pin6Qjo6LhImSlpqen4mMlJKdkYKLf6WZiISNg4aEgKWHi4u4mJ2RlJaip6Gdnp2jr7e6tazAxcrQyMfMz9PS0tjS1dfA19jZ29ja2tnZ19u4ent6bWtnWGBcU1BPSUNMQj08Pjk5Ojo5OTs9Nj8+Pjw9OTo7OzM3REA4Mzc4PjcwNjg4MzU3PDM3ODA0OTc2NzU1NTQ2RlA1RE5JODkzOEFLPTszQ0BJPDlEV048TVRITj85NjMzMz5DO1tYPjVZeXBaPDxBPD0+ODY4OT89RFJTUlhfVlhmbW1taYGPinFzeYp7en98f3uHe3x7i4eBfnWDhXlyenNtgH6EfneFm6GanpSSgIyIf5iHgJuSboeohXqgi3yRjYKIhJt9mpCKjKOioJCkrqCLkYuFjIGThldyrYufq5uPg5ibj4+OXIKikYKMn5OUjIaIjJKTjJSUlI+Lj4mHlpudj5WWkIuSk4WAi4iSjYqKnZaZoqOGk52WoIqJiI2ckIOIj4CDiIWkhoyQs5idkpSXoaGemZKcnaiyuaymvcLHzsfGz8zQzM7X0NHUrtbV2NrY2trX1tnZn3F/dmloX15YVFdYQ0BIQz4+Pjo0OTo7Nzo7OjM7Oz89Pjc7OToxOkg+OjM3PUA1MDY3NzI1NT82NTs1NTg1ODo1NzczNUhSN0dPSzk5ND1FSkI+MUZDTEI5ODpHWEA1SFdJNjYyMjM6RUNlWD8mX3lpX3o+Pjk8Ozk4OjtAO0JRS0tTWVBUY2J5bWJ+koNvbXiLeHl/eoF8hnx7d4aEf3NwhYJ6dXZ2dISDhX1+kqajn6WiloqdkJSXi4qol3KKsY2Ep5KEmZOEmYyilZ+Yk4manqOSqa+fkJWQjY6IloxujbeFmsTIspuhpZucmJaQspFkpM3HlY6Gh4mQko2Nk5SJhYqJhZaZm4+QlJOGlJeEf4+LmYiNkKqXl6OjiJmflpqIjoeXl4qEjo2Bf4iQpYmNk6mal5OWmaGZn5mTnZujs7Smo7zBvsjFxcnIycLK083N1KnS0dbW1tja1NPazoNzgWllYF9fT0pVW0JBRkM7QT04Mzc7PDo4PTY0OTo8OjgyPzk6MjpJOj02N0JDMzI6OTYyNjQ+PTQ7PjY5NDk7NTc5NDRLUTxKUUs5QTdCR0lANjRKRUxGPjw4OEVUQTc+XDg2MjE0OjtFYFhBRmF0aExjWj41Ozo6NTs6PTpFTUZIUldTUkJjgUZ1go59fG1+iHh6fnqBgYJ+dnaAgntsbot/eXx4eHyEh4t+i6OzqKOrsqGWp6ClpJaVrqKDkLeVkrOZjaGgi6Sbr6KknZiQp5apma2vpJeVlZSQi5ialqDAjqPJuKuaoqWtmZGbnLKdhoWoopyYhYiJjpWNi5OPh4GGh4iTmJSMi5OThpSYhoORkJx0kZmylpekoYicmZOPipCLl5qJipaOhn2MmZ+KkJCcmpmTmJiflKCdlZ+bobKuo6W3vrTFx8S9w8O/xs7KydKnzs3T0tDW2NLP2Ltze3deYldiWFBISk9FQkNENT46NzY6Pzs8Nz00MjY2OTc3ND01PDU8TDw+OzxCQTc1PDs0Mjc3P0A2Pz83ODQ5ODc7PDU1T01EUFJMOEA9RUFHQTU6SkVORUQ6NkFAQlM+OURPMzIzNTc1PXZcPFJcdGlaTV1TPD04OTU2Nz06SkZER05bXFlKZ2E7SISLentthYZ5fIR4gIWBfXB4fX18b3ONen2Be3iGi4mFhJKou62osr2vpa6zs6ijorCsipq1nqK4pZWspJeprbempKOfmamYqqSvsKmamZyUlZGYoJeZu7utyaBptrirsJWYn6Krkpe9o16qsoKJio2Vh5F8j459g4aNj5SUiIeSlouPlY2LjZeZkp2as5aVq56Lm5SSjZCSjJibipKekIyJlZ+ijZWOmJqdk5uYnpShoJScnKWvqKKls7irwsjEtbu9u8XIyMLRocbJzc3E1tbQy9OicXxqXlxVYFJQRkQ+PUNBQjg/ODc0PkY8PDY8MzUzNTU0NTNCMzo6Qk06QTtBSEI7OkA8NzQ2PEI5P0BCODc0Ojo2Pj00N1RLQ1VRSjc8OklBREA0QUpITkJBPzZEQTxKTkQvVD0yNTQ6RUpcWEpaUW1ncHBEaWBLSTY3NTc6PkpAQ0lQZUhiYGNwSkCLin6AcoaHfIGJdYKKgn5tfX18f3B3h3eNgYd7jY+Mhoyaq8LAsL7Gu7K0wby0rauztoyosq6uvaqbu6Sorbm3q6amoqGjo6mvsrGqnZykmJuYl56ipaWSo7muqMC7rK2yuaWkp32IhpytvbCDi4yLkIOPg5GPeoGHkI2OnIiIj5eNi5WXlJCalpynmrGakaudjpmPko6VkJCWl4+RoJGIlZukrJSWj5ScnpSgnpuYoKGUmp6op6Sho7CypsHGw7Cwu7bFxMO+zafHw8fDvNXQzcTKiXV0ZF5cYVxPS0JMQEVGPkE/Qjs6ND5BPT01PTY+MzMzMjQyQTE3QEJOPkdAQ05DQT1DPTs4NkNDNUJJQjo4Nzg7NUI+NzlWS0RXT0Y4PTRLQEM+NEVLSE4+QUE2QkI/QlNFNThQMTQ1Ozw4O0Q+OUxqal07V1JkS2daVU83OUdFP0NGXGdHYGlnWl1bk4yMiHuHi4aDjHWGkIqBbn58gn9xfoF6lXqSlJSYkZOVp7TGycDCzMHDuci8uq+rubuXsra6s8CupcCkqrC7u6quq6KinqerrrWwqpugqpyinJWesLSni6K6urXBu6uonLKkpKiUhI6pw8SkgouOh4iEhpWUjXqDjJGPkaGMjJSRj4mYoJeSmZSXpqCunYyqnI6Vj5KRlZWOkJWRj6GUhpefoLOelJuUoKGZpJ+aoJyglJiepqSmp6SvraW/xMKuqbe1ycO+ts6yxb7DvLPRysjBtXZ6bl5aXWxUTklDTEpKSUBBPUNEPDVBRDs6Mz04QjMzMjI2MkEwNUlFTT5JQEhSQEg+Q0A7Pj1GQTVBVUA7OTk4PDdFPjg+VkpDV09HOD80TEBCOzVKS0NMP0I/PEJGPUFITDkrRzwzNjc0NjRBPzdPYU9hRS89PjZrbGpgQDpIPj9FQmdcTWVcZlRjapmNlomLiJKPhol5hpOQgXKAfI1+d4eBgpB6jaGWqJqamLq+yMjKwtLJysLNvMGzrbu+p7q/vrzDt6zBqayzu72qsKmkpaOrrrSutrWgn66fpqKYo7S9qZuovMCjtravq5KvrKqrloaaqaalkYKMk6WViYB1ipJ5hY2RkJ6fk46Ui4+NlKOZl5uUlKOeqZ+RpZqMj4+PlZaIfY+VkpKjmpWgopy1ppGfl6Wko6WenqaYnpWXm6Wjqaiisqyou8DEr6Wzt8zAua7Ds7u+wbitwsLBwJlwe2NaWF1cTUxNSUdEQ0hCQkFDSzo0REg6OzQ8N0UuMTIzNTJCMjZTSE48SkJKUUVLQ0RFOkVMQjw3RVY9Oz04OT88ST86RVVJQVdRRjdBOks6Qjc5Sk1CSUBDPjxERzxCQ089MjBIMzY2MTcwPUI6PWpqSks1UVMzU3BwZE47RD1ARj5rSV9YYVpkZVaej52Ol46ekomKf4mfkoR4hX+Vfn+QiIqQgJWgma6no5jCvcjEyMbTzc7Ny7zCt7C6vLS8yrzDwba2u62zv7m8ra+ooKmntq2uqbK3mp6toqihnau3uKmlr77Esb25s6eps7OtrpaVpaynoJGOkrHFp5WNfJGVfYeRmY+qmZiTk4+TlZOlnpOdmZOho6KcmJ+Zi4yPj56IWpCXl5KWpZpmmKOfs6WWo5asraunm5+nmJmWmZWhpKimnrarqbq8w7WltLbLwbiqtqyzuriuqLi6vbiDbnBcWlZXT0dLU01LP0FIRURHRkc4NUZNOz43PkFKLjMyMDI1QjU1UFdOO0xGS1JMT0dHST5JUT86OElTOzs/Nzk+RExCQEhTS0BXUEY6QT9HNkE3O0hNQ0U7Qz00RkU6QkFCRzkvOkEzNjAzPkdEOTQ9dGRNRztFKzpmfGhXOz1AQkZCckZpSVJlYkxGppSclqGXqZaMkIOHpZKIgYeCnISDlZCRlI6aop+vvq6hx73FxMfHzs7O0sq+u7axuru8vs62xL23uLeysrWzuLKrppyrq7iqqaevsJejrqSnpKW0wLCqrLO+wrnAubOnuLO3s66Vpa2urqSLk5WhjXPBmX2WmYSOlpqLsZWamZWSk5mapqOVoJuWmqicm6GgmYuMj5adYEqWnJqUmqWXVJawn6+cn6WUr6+tpZqhppSTmZmOnaCnopm0qaqzvby7q7Cyx8C4pqurrbGxo6GysrSkcnBnXlxQUk1FUFBQUTtIS0lGSEFDPjlLVD9BOj1FTTA3NTQ0OkIzNE5XTzxKS05VTlFKUEhISk9CPD5NUjs+PTg6PENSPkRIUklCV05JQENBRjM+NThKS0NBPUM7NEVBOkE/PkhANSpCNTIsPmNdZzozNXRkZUBSNyYjM31pWDs6QkNAPVJFV1JzYldGSKuXmZ+hqa+YkJeHi6eWjoiShZ+IhJyXj56gm6Oltcm0qca7w8TIysjHzM7Hvrqzr7m4wMHNtci6wLm1urGvr7K0p6ObqrS0qqmmrqyZpK6lpamtur+oq7a2vsG/vrizssKvt72ro660rLiliJuXppt2vqCEmJyOk5mai6+WoZybl5WboKGpnqigmZqqmaGnnpeQjZGdg252k6KalZ2in5CusqOrlamqmKuupaSfpamSkpmbiJScop6WsKepq7q3vrOyrr65tp+jp6ilp5ycrKmpjWVoY2BTTE1HSE5KVkw9TURNSUpBQ0Q8UVU8QUFCRE8xOD03Nz9CNzVVWE4/SE5RWFJQUVRKUUpKRUFFTVE/Pz04PTtHUjxFRFFCR1lNS0FIREU6OjM5S0lCPkNCOTlDPjxAPjs7RzctMj4tMYJoTnpcLzBraGA8PUJCODZ6Zlc7Oj0uLlNhTVZIf2VeSEaslJyhn7uvmJSei5Oqm5GSk4mrjYeinoykrJSjo7bHvbTBusLDyMnFws7Iwb25sq+5tMDCyrbGscC8tbqrqK2sr6OimKq0uqappqyqnaivp6Srq767qKy8s7e9xry2tbjAsL2/s6m0tqu+pI+il5Gin7yfiZmgmZaenY+3n6mcpaObnKKaqKWzoZudpZyoqp6ZlY+UmouXiY2kopScop+gta+lpZOxq5qsrJ+epKOpkpWVoIOQnp+clamloqG0tbq1rai1srOenKKmmpeVmaqhnndiXmBeS0lHSE1RSU1FRkZCUkpIQURHQVZTREg8QUdRMTtCNzpCRjc5XFlLQUxQVFVTTVdSTlVKREBKSk5POUM/NT08TlFDPz9QP0VaTUpBS0RHQDUzPUlHPz1FQTk3QTs8QDw8M0A8Lyc7KkiRQjpTSjAsW29XNzE8Kh1CgGRUNDktMTpoXUZEQ5xwYkdFqJeknp7DrZuXpZeZqZyWmpqPqpaVqKaVrayZoaq2xMG8v7jBw8HIxL7Nxru+ubKwuLO/w8i1v6+8t7m3p6Sqq6ygoJqqqsSipaispp6sr6yiqqi+uKasvbC3tse2tLm4vrC+wba0srSvvqOWo5aTm5Stn5ChoqWjo5+QvqWpnamsnZ2hm6afvaKYpJ6iqauhnZaNlZ6Tn4ePhY2TnqSgnbWspZyWsqeZsKifmqqeoI2ZlZ+FjqGam5KlpJqYrLG2saqlqa2snJmgoZKOkJWpn5RpZFphXVBKSUtPTUhFQ0lAPU9IQDtHSUhbUk9LPUhOVTRCRjk+SEc1Q2JbS0NOUlVXVlFYVFJVSEA4UVFQTTpHQDRDSFFTSUM7Qz5HVktDQE8+SzwwNjtHRj47RkE1Nj85Oj85OzE1RDAtLDBNdlw0S1o1LE1uVzwtPSkeI3piUTVDS1E5b1JGPEt4ZmNYTaKao5uexayhn6ydna2fkqOelqSgp6qsl7awo6qztsXCvcC2wMK8ycK+ysi2uLW0sLO0t8HGtr6wuLS6tqCnraqrnZ6fpaTBpaCqrqCkqa2voqanvbWlsbu3trXDsrO3ur6xw8C4uK2ztLWinKSVkZOgraCYoZ2pqKuimsOtqZ6srpubnpmmoL2hnaSYq6urpqGZjZqfkp6Jjld/lZ6moaC4qqeTmLajn7OioJuvl5+PmZSdgo+gl5aNoqSVkKaus6upoqKlpZWVnZmLj5GTpJ+JY2VbZGBMSUtLT0ZFQUZLPj1KQTk5SkpOXVFRSj1MV1w5Rkk9RE1JOEhjXExDTFBTWVlWV09aXklBPVdRSUs/SEA1SE1YU0hBOkBBRFBIPz5RPks3MDk5RkU7OEc/LjY+Nzg+NzcvMT85MSUxUVVtW0pPMTA9Z1dEMTc9LSt3YFM2U1prV3NIRTY9dWVcTE+en6GYnsSnpaKzoZyyp5OqpJ+jn62prJ27sKistbLIw8HDs8LEvsfEvcTKvbCwtq6wta+/xbW5sLC6tq2aqbCpqZqepqGnwq2brLGcqqKusKmkp723pra6va+3xK2zs8K/scazurertLatqqKllZWUo6uhn5+ZqKuwrq67sqagqamZmZeToqS4oaGkkq6vrKSmn5KhnpWej5GNlJ2ao5+ntKenjJi0nKOwmp6brpGflJeUmoCSopaPjqChk4umrLClp6KcoJ6SkpuUhYuSjZyegGNmW2hmS0lNS1NCQ0BJRzs7Rj85OU5NVV5SU0o+T15ePUhQQk1MSTlOZF1MRUxSVFlbU1VPXGJIQT9aUUFIQUtCN0ZFTEtOPjtCSEROQj07TkBBMy85N0NCOTdGOys2PDQ2PDM1LS80QDErJ1Z0U2VPPzEwNGJbTTIzPjA8dl1eP1tVXmZyQDg8SJZ3ZUE0n6Sfm5/CqKOqsaGjtKmWsqumoqSyrK6pu7KtsLS0xr/ExLXAxb7KxLXAyMK1q7WosLiswMS0t66strqlmauxq6mYn6aXrbu1m6iwm62frrSyp6q6s6e6sreyuMCqt7LCvLTFp76urbe1qaesoZeWkaWkoqKXmKSvuK2ytbagn6ikmZSVk6Oft6OkpZWusbKlqaWinpqampWYqJ+fmKKerrKipo2XrpmlrJeanqWRm46UmJqFlp+UjJCcnpSLqamroqehmZ6WjI+ZkIGGlomUn3lkaV1sak5QTk5UPUJBTkM7OklANzdRT11eUlZRQVdgXEJKU0hXS0g6VWRdTkZPTltXW1JQUVhdR0FCW1BCRz5OQzlIR0hOUD8/Q0lCTEI8MklBOTQxNzdCPjs3RTcrNjkxNDgwMi0vLjw2LSNCcWdzazIzLzFcY1ozMzkwNnBbYkgwNUpwaVZDV0aMeWZDO6SjnKGlv6aor6+hqbWqnbmvq6SqtLexsLm2sLe4uMW9w8e9vMTCx8G5wcbBuqq2pa27rcHDt7eqrbK8o5WtsK2xlqWokaq5qqCnsJ2qn6+0s6qptrasu6uysrm3rLmwwbm9vqbDq7C3rqiqq6admJiqoaGgkZegsK6zq7C5mpupn5mWkpemoLappaKir7Gzq7Gnq5+boKCbnqWcoZedo7Owm5+QlKaaoamblaKflpiKlZiTlpedk4mQm5mUjqmpp6Ckm5ibk4eOmYt+jZaGjptraW1hbW5YUVFaVEFDRVVAOzpJQTc6WFBkXlBXV0RZXl5NTFJPX0tKPlpkXk5JUU5bVVlQS1NXWkk/RFhQREY+Tj89SUdHUVBCPUNGQk0/OjJEPzc3NTQ3Pz05NUU0Kzc1LzI1MS4tLiwxPionKz1ccD0+MS4xZVtkQDE3NDdnWWBGKEA4bH1oXFY6iXtjQz2on5yhqb2hqrCqo7G4qaW1squhrbW9r7O4vLq9t7bBw7/JxLnFw8HAuMW9wbivtqert7K8v761qa6yuJ+XrK2orZenqY6nu5+lrbOeq6KxsLOsqraztbytr7G1rLC1scC5xLarvK+xuKysqaKxpZ6kqJ+kl5CYn7Kqs6mqs5mdp5uZlI2gpaS0rqeirKyusaeyrLKpo5ufp6SdlaGYm6i1qZeZkZKfmZ+hnpCsn5iYhpWYi52anZOKjZaXmpenpqOgnZaVlpSBj5WFe4+ShIyWZmxzaHByX0dZZlZEQ05YRFo5SEI2Pl1SaFxOWV1HW15dTk1SWGRKSkNcY2BQTE1OWFdYUEpWVldMPUVVSkVEQU0/QUZISFFQQTtGREZLPTg3Qj02ODcxOT48NjVEMCs4MC8wNS8qLC8tKj0sKyUyKyo1SzEuJ19eYVYxNTE9YFZeOClDM1lVXGdLNYx6ZkxApJqgpKy3o6yppa6utqqutLmmp7C4xbext77BwrW0u8W+zMW5w8G6v7rEuMG5s7Wsqrq3u7q+taqtsbaYmKirqqubrKuPq72eq66xo6qfsa2zrq62srm2qa2usae1sLO6vMmyqrW0sbSvrqahs5+aqKygpZWVmpmxoq2gpa+WoaSZmZKNoqWmsqmhprGrqrWkrrC1r6OYna2nmpeemZmsuKKYk5CPmJyhmZeUrJ+dlIGTmY2enJqWkIqUkp6apaOioJmWkpKWe4uQhXuMioOLkmtueW51fGFGYGpaSUhaWz17SkdFNkFiVGlaTVxhSltdWlJSU2JhTEtFYGFgUExJUFdWVU9HV1ZVTjpJVklIP0NLP0VESEhRTkE/SEhIRTw3PT46NzU2MDk/ODY2QiwtOCwvMDQsKCwvLSo3NikoOS4kOks1LiJUYFZhLjUoQ15RXC4qQS9KR1BbRzNjWVRLRJmXn6+osamspaOurrWptrS3o6y0t8m6tLu6v761tLfDwc3HvMS9t76/wLe/vbK9rqe6ure3wresrbG5lZemrquno7KqlK+6pK2ysaenorGzsbKxtbG4sqiuq7KnuK+1s8PFtqm0tauwramnorafnqaxoKSUm5mUsZ2nm5+pjaminZuVl6WlpLenorCzq6exp62wtaykmaGsqJucnZuUqriclY6Oi5mdopiQl6ein5aDkpaQnZyYl5aIl4+XmqedpKCSlpGQlnaEkId7hYKEjIxucXh2fH9dS2VsXEpPZFw/YntHSThHZ1dlW0xeYk1YWVdUWFRpXVBPSGFdX1BKSFFWVVJLSFdVVk04TVpORUBGSz9IQkNLU00/P0xPSEA7Oj47NjswNDE8PTQ1OD8pMDcpMS4yKSksLC0rLTkkMDQyJTlCNy4jQU5JZzI3J0ZhTFYlLUIuPUVMUTwzcmtLREORmKStpK2tq6ajsLKzqrawtp+rtbnJua7Bu8O3s7K1wsPPxMDBvbS9wL+6v72zxKiqubG2t7+9r6uzs52gp7CtpaawpZ6ytayrsrCsqai0uay0s7WstKypq6isqbmtsbDHvrikua+pra2mqK2wpaOjrqOpnJ2bmq+ZoqOio5Csn6Ogn6GppaW4pKu0tKSqq6isrravop2jqKqboJmakqS0mo+JjYeRo6CWjpSeoJWThY6Uk52bmZaUh5iSlZmnnKCfjZKRjpF3fo6FfHx9h4qJcXRzfn1+XFJkbl5OWmddRkSWW0c6Tm1YYVtNYGJOVldWV1RZZ15RUkxkWltUS0dPVFNOR0lWU1xOO1BeSkJESEpBRT8/S1NPPjpOTUM8PD45OjU9KzMyPTYyNDk6KDQ1KS8sMSgpKywtKiY1Ki8mMCkzODoxJiozQ2U7NipIZEhKKzpJPzNDSVMsPo9rPkhJj5qpqqGosKSoo7O0sbS1sbGhrK29y7quwbvGsbSttMLD0cTGvsCyvsLCvL+4vMWorbess7i8wbCrsq2hpKetqaiksKOrsaqvq7Gurq2rs7unt7GyqbKpqqalo626rKmxwrm0rLmoqKitqaexpamkoq6qqKKem6KslaSdl56Yq52hp6ihrKWjray3sbGgqaKfqq2wrJ2epqepmaOYmI+gp5iGg46Ki5+hkIyNl52QkIaIkZWgnZWYlYaWk5OXpZydnIuRkI2Kf3+HhXx3f4eFh3Vzcol2bF9ZYG5jUXNyXEs8hHxGP1d1WGBZT2RcTlVWVVdQXGFfU09OaFhXVktHTE5SSEVJVlJdYzxQXUQ8RkhIQkc/PUpQTDo+T0o9OT89Mjo3OyozNT4xMDQ4NSg1LyosLjMwOyksLCclMjM0JCwyLTg2MCkoMTxeSzAuSWdERjg8QjA1RUtYMUCUXEBNRpWWrKehqrKcqaiwtay4tK6qpKurvcm7sb63w6+wrbPExM7Ow7+/tMDDxLrAtMnErK+3rrK6wL+zrq6rpaiqsKmmqLKltK2qsK6tsa+zrLO6pLi0rKyup6ugop6wt6uqrbq2pLW1pKmnrKyqrKGopqaxsqSmpaGhq5apoJOaoKaeo6KqpKyinqaxt6ysoqWimqmqramcoaWko5igmpWPmJ2UgYKQiIWdoI2Kjo2aj5GLhI2YpJySkZuMk5GRlKOam5qLjouLfIeBgoJ7dYCEgX51d4ujh3lrXmBuZ1dmh2ROQGeSTERieldiWFJlVU1WVVVUT1xdYVVLTmlXVlZJSkhJT0JHSVNRWW9BTVhAOkpHRkVHPj5FUUg4Q0tFODdDNzI6OjoqNDk/Li80NjMpNCsqLCsuIzQuLSsmKCs3OSomNis8LTIsJjA2WFouMEpnQUE8PEMrOkpPXjREhkFJSESWka+koqqwl6qorbWrtrCrpKuqqbzBwLi5s7y1prKvxMnL0b/Bu7nAwMK5wbrCxK6xtbK0vMG+s7KurausqLaqpa2wqrmvqLCwrrGrtaq2taa0tquspKmqnKOds7OoqKS0tKC2rqGpqKuoq6egqquoubapqqmpoamfrZuRqKGdoKOipqKpnZymtK6npamio5elpqeqnKKjo5+ZmJ+Rjo+Zjn6HjYeFnp6IhIqLj46RjYSGlaKajo2akZKRjpOfl5iWjYqDf3SHgX9/eHWDf3t4foCInY9wcmdncXhcYXSIaU9dmFZIbXlVZFZSY09MVVRVUU9YWmJWSFBqVFdTR1BZVUk+SUhPUVB4TU5WPTxLRD9AQTxAQ1VDOUFLPTU7RTEzOzk3KjQ6PSstMzQxKjgqKisqLCkqKC8qJiklMzssJDIpMjAyMSUvMlJjMDI/Zj1OWD9DLD9MVF8vSWs3UkU7lY2vn6WqrZmrpK2us7SuqqWvqam7vrvBsa+4raK1r8nHyNHAv726vMO9usPBwL+vsrOytr28wbKys6uzqaW1qaSts7O5r6KttbGvsbmquK6qrrarqp6qq6CjobauqKGer7KhtKqeqKeqo6qhoaytqL2vrK6soaenn6uYj6+imKKgqKefp5uZqbCoop+soaCSoaKjppiaqKWYmJidj4qHlYh9jYaEhaSXhoKCjIePjpGFhZWgl4mSnZGTkI2RnZWXj4qFhnhzgX99dXh6gHt0dHtqgoejdWleZWyBdWeIi3xSV3BeS3hzVGRTUV9NTVNaZ05MVlllWEdTalJSPkJOUWFROklITFNJcVFMUzs8ST87PD07QEBXPDw+SDczQ0IxNTo5My01OjopLTMxLS02KSgrLSw1MiMyKScsJS47LiYxLjAtMTQlLDBNaTozOF89YWQ/RjFDUFtbK0hPO1hCNI+OsJ+kpaqjpaOsprSzsKmksKequL7BvLCouaqnrrDJx8jQwr3Avrm+vrzJvMK5sbC1srq8ucCztLutuayjtaenrLK2ubKmp7q1rbS8r7ylra21q62cqa+kn6WsqqecnaqypLOomqqnqqSpnqKoqKm9q7SvrZ6po6Cum5qyopWkm6Sln6SamaiqpZ6aqaGbkZqgpJ2YlqmpkZmZk5CKgo+FfY+CgIiej4eAfoyHkY+QhYCUm5SGk6KMlJGLkZuSlYeJfoByenl+fGh3fHp1cHF+aYZ5hIhkYGhkcoV7bWd5XV5WQ1h7bVRhUFJYS0tNcHRdSFpbZ1lFVmdPQz5LTkRDQTlIR0tTP2phSVE4PUg8PDw+Ojw/VDY6P0M0NUg+Mjs1OTAyNzw1KC41Ly0xMSYvPktJMSUaOTAlLCwwOS8sLCs2JzE3Iy0vR2pJMTRYPWZiQUo3R1NgVSo9PEZcQCqOk7CZn5+ppaOhqqS2srGkqbGmrbnBvbWwo7mtqKiww8nJzMG3vcC1t7+6yLbDtbSztbK9ubq9tq25tr+torOnqquvtbe0qp26u6ixv7K5oK+0tqmsnq2xo5ylqKminZyksKavoJ+rqaehqZyjqKCtu6eusa6hqqKjrZ6erKWXn5ugopyfm5miqqKamaOjlZaTn6GWm5amrIuekZCRjIKLgH+PgXualI2JfX6Mh5CPjIqFkpiRh5SkipKSh5CakJOBiHx5bH12eXhie3pycHBzeGqCdGqCZ2NoYW5zjm1ianBgb0JdeWtWXk5QUUpJTFNZVk1cXm1XRFhhT15QSE1ERjs3SEVLTzxyaEpLOUFFOzs9PTs7PUo0OUI8MztHPDQ/MTgtNzg7MigwOS8sNS4uPS0qTD4qHTQ5JicuMzQuMCsvNCYsOiQ0MEFoWjEzUz1lX0RMNktWZE4pPTNRXT0jkpermJ+Xp6Ohn6ejt6+toq+vqau4wrqzrZ+5r6uotLrHyse/t8K+r7S+t8S2w7KwurKzwLW7vripubi9q6S1p6iqsK25sKmZubyjrr+0tKGut7Wnpqews6CfpaanoKWZnqyoqZ6gqq6noKaXoqifsLifpLGuoKyhrKSbpqaompqbnqOVnZyanammlpqeqJGXkpidk5mVoaqQmomNkId9iH+Cjnx8oYyNiXmDjYWKjY2FiJOajomVn4mRlYKMl42QfYR7c3B8cXN0YHl4am9wcXBqf3NjemxoZmRhZYeAYFtyanFNToBpWFpNUExKR1BSUUhNW19vVERYWlJnT0hLRUY1NkhCTEk1WmVKQDZFQjk6Pj0+OjpDNTk+OjNARjwyQDIzLzo7ODMmMjwwLDg1QiopLUMqLDQ7Tk5AOzczLS4rLTcqKjwlNTM9ZmQyNE0/ZV1GTz1SWmdIKj8wXFs1KJabpZiclayfn6GkobeqsKO0tKmpucW2sq6gt6ytrbC2xcfAt7/CubC1vLe/u7+vrL6ws7+xvcO5qbu6uKeotqinq7Css7Cmmby2pKu6ta6fsbivqaWnr7KboaSgo6ShlpuvpqGfo6ivoaCik6Okorawoaaxq5+soq6Xm6qkqJ6Xmp2kk5qbmp2lqZmbm6SUlJeUnI6Tl6KpoZCJio+FeoR+hIp6j5eKjYd6goiEiYyOhY6TmIyOlpmKj5Z/hpeLj3qAenBxdm5wdF94d2VtbGxraYRuZnJpa2ZpXWN0gWBba3ZpWkp/XltYT09LSEhSVUYyOV1ebVBEWFZZZU1ISUVFMDdGP0tCNklKSDs2Rjk0OT49PDk4QDg7ODo3QEk+ODw0LTM8PDc1KDU+MSw7QTEoKzY8IjhSPSoxMTM+RDUsLSc0Mio7KzEzOWNtNzRHQWZbSFREVV1oRC48MmNWLDKVoqGXlJupnKShoqG3qa6gurilrL3Fs7Cuo7Wvra2vtMPDvLO/urews7m4uri6r67As7S5sL/BuKy9urWlorOqp6myq62xoZrAtaSntbWonrK8qailqa+smaOnnKSllJehsqWZn6SoqZyioJOkn6O4qKSnrqadpaGokp+ooaGgmJqcoJKam5afoaqbmpiglJCTlpmNlJKjqKSQiYmPhnmEe4SGfZ2OiYqHeoGEh4mJkYWVk5OMkJWUjY6Ue4KXjot3fntsdHFsbHNhd3RoaGpnZ2+FZ2hoY2ZpamBqY2lnW2V7Y2BTdFRcW1NMSkdJT1NAISpoXmpMQ1ZVXmBLSUdFQy46QjxGPDZLUEQ4OkQzNTc9PTg5NT86OzQ+OEBLPT45Myk4Pjw6OSo2QDMuRTQoKyw/MC1OPy4rLTcsMTE5NSwmLjUtODA1NzZgdEEzQ0RnW0tXR1VgaEIzNzlnTycynqKjkY6jppuenp2jtaynqrq3p6zEwbawrKO1rqeur7fAv7yywbawrrK2tri2tq2qvbOusrG9v7iuvLuxpZ+2q6WltKmqrp6dwauopa+yqay1u56pqauxpZieqZ2npJGYpq2imJ6kqaGboZyWn52ntqWvqq6hoZ2doZSgpp+hoJmbmZyRmZ2UpZ2roZeWnJSSjJWXi4+YmqmgkYiJi4h5hXeCgoKdiIuCiX1/hYiGhpGElpWQjpCRkZGMknuDlY2Gc319Znhva2prZ3Vza2NnZGR2gGJlZmZlampka3JaX1ldbWRhTmlYW2BWSkdJS01SWD45X2xpSEJUU1xbSUhGRUEuPD85QTg5UkZANzpCMDM3PTc2OTI6PDk3OjlETT1CPDAqPEA7QT0tNUIzNz0rKiwwQipKSy4vKiszNzIyKDU3JCs3LjcyNjg1XXlOMj5IaVpMWkpWYmZAOjNCaEglNZqjn5CLrKGYmJ+WpLOxorG9tqGxxry6sbGkt6yqrqm5vLu7rsCyrq6utq6yuLOoq7mxr66ztrq2sLi9raaetaugoLCkqq6cosCgsaSusK63rrWera+traKanaeppZ6Vmqeln5mkoqidmp+blJydrK+luqiuoqGamp2ZnqOapJ2XnpiblJmgkqiVqaeak5qakYuUmY2UlJmpp46NiomPfIJzgYGKmIWHfImJhYWKjIqShJSck5GPkJCWjpB/gIyNgnCAfmZ5bWhraWdxcmtcaGNjc4FhZmhqbmxnampobl1sbHRwYVVjaWRlWklGTE1PWFFRVmFlgVVAVlNZVEZIRkVALzw9Nz82PEZOYTg6PzI0OUAzNzgyOD83PTg+RkpARDkyLT1BPUE9MDVAOUAxLSsuMzw7SzYvLissLTI0OzYjMyopNi41NTQ2NVp8XTE5S2pbTVtLWGRkQEExSmZDJzSRoZqNj7CdmpOhmaiyr5+4v7agtMK7vbmxprawqK6lt7i3t627r6yqq7aqs7itpbO1sq6psLe2sbO1uqepn7WonZ6ooqmtmqe+mK2jrq+0ta2sn7GtsKminJyjq6iblJymo52aqaKklpqfnJCbo6uqqbufp6SgmJmZnaGPa6GWmZxwgpWao391kamnnpSUnpCIl5mAloqhkHiGlIyDbmp+doNxbIaLhn2EjIdwXmNhZ4SYhmyLj5SSdHeLhH6Dj39nhoBndWhlV1xoc25OUGpjZ3KEZ19kZm5tal5fYYqPg4RlTktEOUZUZ15KR1BQVFVLSFJgb3RlRlpRVVBGSEZDPjE7PTY9NjwzZlw1Ojw3NTtENDg2MDpCNz86PkZMQ0IzNDM9QEBAPTI4QEU9MSwrMDg+RzYwMS4qLiovNTY4LCMxJzIxNDoxNzVYgWwxNk9rW05cS1tmYj5HMVFkPSoui6OZhpSwm5yToJuqraqjvcWvqbjCuL28rae2sKWrpLezsrOxua2ppqy0pq+1oqi4traop6y3s660rbOiqZ+zqp6hpJymppirupWmpa+ytq2upKmuq6yloZ+doKenm5egpaWbm6ennZOfn5iQnqeqo7Wvo6OjnJaXl5ejiKGOkpqHoYeTnKB/pH+lqp6SkZqRiIRyeI2OhYihdoiMaZeIZn1yeKFviIeEfo59f6GgoJmAfIeedIeOdpuKbIeBg2xoZWN6a3FhU4VtY2xpmHFZanFvh1heaVtra1uIcW56coVnhoRaXkdOP0dfTUZSVlZRUVJXVGdeTVdJUlNPRUdHPjw0OT05PDc7MDw8Nzk5OjY9RjU4NjA8Qjs8OT1GUUc9LjU8O0A9QD41OUdBODIpLjE8STkvMDEuKi8oLTQ1ODMlJjIxMTU+MTw4WIN1MjVSa1tOXExcZ189SzFXYTcwKIumloOcq52ZmJ2fqqqnqr/Dr7G6vbfAv6qlt7CpraaztK6vs7erqaWxraW0s5yttba0pqeos7Gtsqiunqugsqigo6KaoKGarbOUo6WltbynrKerqqyopaGgmKCmo5mZpaOkmJujqZaUo5yUk6SlpqG3o6OgpJiUk5eTm4iuj5iUiamLl6GbhbGAo6ydk5mdlHmC1KiAh5XBm8d5eLGlt5dkgMCcv3mEhHmQhHyQkJHKcZe8nMV6crWmu5B7gGyWsauweGhrWLGubmVpvJK8bmh6bnKP2H5TamK2sn+BcpV0mqGqkFdPV2JQVk5GVFtYUVBSjFxXXFBAXERRTkRHSTw8NTc9Ozo5Oi49Ozg3ODs5PkY2Ojc0PkA+Njk/RVJJOi41PjtCPD9BODpKPjUyKjIyQkUvLjMyLisvKS0vMTg2LSAvNDE2QTE9OleDdzIxVGtcT1tNXmdcPkwxW100MSGNppKAp6qfl5ydpa2yqLHCvbK1wLW3vsKrprOtrKmnrrOpr7a0p6emtKWnuK6cs7K2qqWkp7KurrGmqp6npLGjop+el5qenK6rlJ2in7O6o6qpoq2upaGdmpqhp5+Xm6egn5idpqeRnKeak52hpqKgsKKfn6OWlZKYkpmFr2pqio2qfmeDlYatZHCdnZSZpZRxrqGkfni7fWuhj3axX2q0W6WAZpyRYGaCemZ/anhrqWS+cmemjHWxanyxeHSSk2NtbaduW4SgRWhmh5ZFdZxgfmd8pKeCWV+Lq2mAlnh5aqc3Sq9cWFNsZFtLTldfXFdWO06JT1hXL0lUVElDRUY9PzQ2Pzs4OjkwPTg5OTk6PTxEODs6Nj1BQDY8QEhRRzkwNzxBQz5ARDhARz0xMy0zM0UzLi41My8rLyguMC46NS8nJDIwM0IvPTtVgnYyLVZqXE9ZTF9nWTpNNV9ZMzAbkKKVgqynpZ6jpKqyt6y0vb6wtsSyt7rCpqmwq66oqbCuo7C6r6OkrrKjqbionrOysKOloKqtr6yvpqefo6Kwm6Kbl5WWmpqspZaboZ6zs6KrnKKtraCdmZegoaicmZ2jn5yZoKWkj52impegn6qepqagm5+hlZWRlpGahbWbtXiFqZm1mXaGs5u3fpOWlqiUfmuBpnuChoiSlJJ3q2drsVure4+HlHSJcY+GgH+IkJd4goKLmIyDoI+EsHZ3n3Fra2x8i06kWEhjY5l+Y2imYHlydVOSh15QqW1jcX6HgGKcLlGhb1tTa2hgTEtbZFhcWkI+sXlYWEEjTWhFQkVBQEExOT44ODo4NDs6OTw5OkE6RTo6OzY6Q0I4PT9LTkc6NTpBRkJAQUQ8RkQ7MDIwMTtGLDAuOTQwLC4oLzMsPjgzMR8vMi1EMTw8U31uMytYalxPWE1fZ1g3SjhhVTUwG5WflYezpqahrqmnsqypu7bCsLvCrbi3wKqsra2upq2xqaGvvKqhp7Sto6u1pKazs6ejop2nqrKosKelnp+fr5afmJSVlZedrKGZmaSotK+iqY+pqKqbnZWYoKWnmp+cop+boKOko5Wbn5eZnaKpm6WZnJyioJeTkZOSnIPVk5m5cLDCfsWGfNaUm7t8mpWkj42cjaR7joekgqWCeqx5j51Wr3qIfp9quVq5doeEfaaCk3yYeqp5jZ2Qe7FujoR0kLyFb5RQr6fFilGgemNgqWN0cohtl4hgU7W0yIaAiXxjpDNCnXZdUGppZFBAWGdaZGFKSE5tTVtST1lmWkNEP0U/MD08NTk7NzQ8Ozg9OjxDOkY6Oz42OkBDOzZAT0xIPDo8REhDQkNEPEVGODEyMTFEQy4vMDQ4MystKS4zMjM5NzEjJTUqPjM9PVF3ajYqWWlbS11PX2ZUN0c6YVE3MSWbopOYsaiopbOqpbSppLy3wbC5wLG1tLuztaexsKOwsqafrraomqe5rqOvsaCztLCgpJ6fp6mwqbSopJudnquXmJeWl5WVoKqcmZanrbCpo56PrKKolp2XnKGloZiioaGhmqGip5ueoZ6UmZumoJynlZubn6GZj5GUkZyIsm5otXGrh26OpnK0c3K2e5qXpIuPnY2jf5GhpX6wdoOR0tF2XK57hX+kb5uqpmuHhX2tfZeZj3uxc5Kdj3mzZZZ0hJ5vnmaUUsiLWsJcn3liX61gdnOHYpeIXlnKnW+/gXVNS7VTVcZkVFFqY2ZYQU9rYGxoUFVHSTg9VlFaV1hJQz9KPDI/OzU9PDQ2Pjs3Pjw9QztHOTtANzs+RDsuQ1JKRz4/PElKRkNFRD5ISTkxNzQ2QD4vLjI0MjUyLSkuMjYsNzQyJh82MDs1Oj1QcWg5J1dpXEJPVF9lUDVHPWFNNjIwoZ2Spa+tpKq8raa1pae2u7yyur+3tbS6urOltLShsbGin6ywpJemuq6ksbCctLiqn6adoamksqisqaSZm5qonpWUmJmSkqKnn5aSpaqwpqKWk62fpZKUoJukpp+UmqWmoZqin62aoJ6dkJWboZ6cpZWdlpmin5WYlZGahax7d6h2o46IhqlvrYqCp4OYmKGJkpqKon+TmYmuhX+Cs1xys1KufYOCpH9x1314hX6PnoaZmXevhoqRnIh4s2GaZZqBgpRsklqwWEuadZh5ZmCtX3d3h2iYiGtdr3eVno94bDV5yK6yX0JTb15nYEVQbV9wbVZVTS5lY2hSWFE7QURATDo1PzkxPTwxNj85OEA9OkM6Rzs8Pzo+PkU5LUVVSkVAQzpNS0pCSEc+R0s5Nzw0Njo+LzA0MzMzLjIuLjE4Ki4zMiUhMDM3Njc9UGtlPiZWZ1xAPlZfY042R0NgSTo5OZ+dlJ+4sJe0wa2os6ipsrq3s7i/ubeytby1pLezn7Ssn5+orJ+Up7WrqLGxq620pJupoKCoobanpqmimZ2VpaGTkpuYkpSipZqSkKasr6aglZmpn6KOkaKZqKWglZqlqJ2cpJ6snaGdoI2UnpqdoZiZnJaXoaCTmJCmnoapfX2leKGPjoOqcK2LgaeGlp+hiZeXiKOCkYiUqnyAi515b7FaqIKCiKB5dNh/doh0qIKOm42So3yWkJ+Ee7JenGSgfoOVbJJcq1tak3+Rf2hnqmRye4FrmIdzXaxaiaCOa29lT0pDoVxbTHRdYmZNW2FfcnNfSlY2SpuTWEhFPUdGQU0zNUE4Ljs+MDVBNzhAPDY9PEY/Ojw2Pz1CNy5IVkpFQUg2S0lOQElLQEVOOjpANC47PjEwMjE0NCsqMDUvNywmMjEoJCQ2NjcxPFBlZUEmVWZbPzJVX2JMN0ZJX0MyPzihnZmZv6uXtMKurK2pprSwt7G1v7m5srC3u6m6tJ+wpJ6lp6eek6qwqa+qtayqr6GYoaCmpaS6oqOroJabkaKglJOempSXnp+PjYuor6+mnZabqKafjJKkl6irp5SXqaeenqCjraShnqGNlaGYn6CSnZeclZ2hlZaOq5uPrm1ytHKpjHaKpnO0eHOzgJGko5KcjYmkh5B3uG+Me4uia2u2WqCFZZeXaaGip22TcrR0k5h/smqFkoita3WzYZ1mom+HkmqXXK1fTaF8h5FSc6Nten9+b5iHcVyvVjycd2VUb24uXKdPY1JrZWJtWmNdYHB7Y1NaUT4+bW8zQ0JAP0w5ITdANi47QDM3QzU4Pz8zOzxDREJKRk1JRjYySlRLRUJJNklKUD9ITkNGUD08RTUwOzswMTAvNzUsKyw0MjYvIzAwLCwdMjg5LzlOYGVEJ1VkWT4vVV5hTDVGTV44MUM4pZqbnbuhnLLArq6rq6e3qbivtcC1vLCvubirwbapqaCbpqOinZGqqqi2o7Knr6qgl5ynoKSruJ2jrZuWmY+lopWMnaGbmJyfkZOUq7Wwp5mUnKyql4yTpZmlraKRlqqxpJ+epquwmKGjkJmilp+blpyXoZKcqZyUkKqZh9SSmrtzsMOAw4Z+1ZabuHiIkJiMmIqMp4h6o7Z1fXd2woKasmCDunnAfHW4YrWBjIepfZWBrKlxe391vIinoGmdYaaOr6F+jHSHqn2+bnO8dLKDdXiBim6aiHFujaR0vV53fVthebxrWlZbanpeamFlZ2JteG9ZW1lDQUByQENHKzVHIic7PzEwPD83OkI5OT1DNDxATlpeYGBfX19aUFBSS0VGSjRITFJASk5FRk9CPEU4ND05MDIwLjg3LSouLzE4MCItMSwzHiw8OjA4TFhhRidUY1g8L1ReYEs1O0xbLTdBOaebnqG8opexw7Ctqqqssae4r7bEsbqxrrqvrsCxq6SinqOinJuQqaSqsqS1pq2ln5aZqpmmrLicoq6YlKCQpZ+SjJyjnpedm5GVkq+5sqyVl6Onp5OQlqScpKyekaCoq5+bn6ijs56jpY6noZSimpyYlaOYj7CgkpSpnoWQmbWAkJGMt5V4gpOatXdta25zb3mPhI6JdJ7Bu72ae4GyqHCAdJG5g3yGhoyGjXuKh42XfKS7ub2cdXq0o3R2l3V0sHWZnmaGaY21dHJwd7aMXoB6fYpog3lteWOLrHB1hX9aW6dqRWVaVGZgY11jUWdncGx1Qk1QTEQ6Wk0/SjM8MCA4PjsuMz1BOTk/PTs8QzZCVFlaWltbWlteYGJgXVNHR0g0RElUQktOR0VPRj9HPDc/NzA3MC85Oi4sLy0qOC8lJjIoNCQoPjcvN0xUX0cnU2JXOCpPXl09KzpWVic+OzynnqChv6WWtMK0rKqorKupu66wxa60sq63p7S4ramioaWeoJ2Zk6ukraqmtainn5uWoKOdq6S9pqCql5SckKGakY+iqKGTnZiTl5SytbetmJ2jo6KKkpKmm6Wqm5appKWcmqGopqajqaGRrZ6Wo56Xl5edno+wqJSbp6GOan5pnKZ4h3J9mo50emSHe72+wLpvkoJxlYdhc2paXpuKYWOIjpVrYICVZG2dd2KVa4CalZRlXmFjcZqKaXKMfYWVZ2p+cnR4fX1iW3d0gWhQXG6EfXyLa1hseoJzSkpvhnBNdU1FV11nYUxaV2djX09bbXVqcVJPREVOO0hIPUw/Mi0yQT84LzU/Qzw5O0A7PUM+UlZWV1laW1xcXWBhYWFgXFVHNURGVUVKT0hGUElJSDs4PTUxOi4wOzouMC03Nj01JiIvKjIsJTs4LTdKUl9JJ1NgVjQpUF9MKDM9W08nPzI+qKCoocKjmrS5tqOspa6nqLWyq8irsLOrtKO+sbKmoKKonaObmZmspq+kpLWppZuXlaGapq2ovaeoppWTm5WfmZKXpKmokJ2Rj5icsLK/rJunnaahiJORqZqoo5qbrJ+jmZqjp6yin6uimrGblaegl5Wdn52XsaSXoaiZnJGdnKKkmKaimpyampmPlYFnbX1xd5KXlJGFi7WqjYaYlY6KjJiXh5SVioSSlJGJjpKUmJSYl5qgopqclKGejYJ6pIZsanyQfIB0iYqBcYJ4eXZ2i4B8imtzgXSDdWV2fXdrcHttYGNdcGhNWFpmamBXWm95bW1mU09GUzlPWU1STygrOktCNjM1PUBBOTpDPjxFTlNTVFZXWFlaXF1gYmJhX15eW1RLQ1NHS05ER1BMT0k8OjszODksMjs4MjApNklSTzgiKSsvMiM0Oyo3Rk9bSiZSXlMxMFReOis9OFxLLDwtQLOhs6G/oaSxsregqaWyp6WwtarIq6ywpbWmwKe0oJ2kpJyjlZWgqqeso6O2q5+ZlpWflq2ppcCeq6SVkpyXnZeSk6KfnqKnk5GZqKeyxK+aq5yqnpCWlqidqpucoKyYoZucoqSvpqGlqJ+umJennZmaoJ6enK+gnKGmlZiSmJOgoZWjnpegjpaTioqNjpatj3yVm4KSgouqqIaBmZeKhI+fiHuEkIeGmpKIhoqVj5uXjZGYnqSWmpORno1/jmahs6+FioR2epCKfHZ5em9mepGBgIlrdYF5iHNpc396dYOHgmt0ZHlmYGllY2Rma1lse3BpalxTTFBEX1RFQD8/LDRARjs0NTs+QTs8Pz4+SE5OT1BTVVZWWFpcX2FjYV9eXl1eXVhWSktMQklPTVJKOzw6Nzg2LzI5NjQuKCYkLTEuLykrKjclKzwoNkNNTUQvVF1RMDVNWzE3RTRcRzU8LEC0oLmvv6yrrrKxoKqmsa2irLOwxLCqq6OzrryjtJufpqKhnJmXp6WppqSlsrSelZSdmZmwpq2+oKuikJGdmpmUkZSinJeonISeqquis8izn6qkqpaWl5qnnaian6Srk56enaCpr6mlo6uirpufoKGYpJ6cn52vo5ieqJOYl5yRpJmYqJ2al2WCknxlfo2Zj2N5jWxoa3uSpKpqZZqYfmeGimVlaWh7jqGPa2iNl5Gjd2tqi5mjnplzbG57hI2HelhlXoaCXmyLiYB2XGhzd3eSgIeCbniCeIBzbXmEdHeJiI6De2mGWV5rdGRdc4lpa31xa2NeUk5XSmRYQUo0PUY3P0ZENzE8PT9BRDs7REdISElMTlBSUlRXW15gYWFgXV1dXV5fXVpVT0RIT0tTTj0+PT02NTM1NTU0KiYmJSwqJS8qKyc2KiQ7Jy9BSltKLzdaTzYpRVkvRE8xWUM7Py49pZ+6vLmvrLOwqqWora2wp62tsLyxqaekra+wn62XoKOdopmZpqucraOlqKmyrZ6Vo5Cir6a2uaWuo46OmqGZk5KaoJmZpZV7pa2iqLPEuKSip6+enZSeop6jnKOpqZKeoZ2gqrCqq6SqoKqbp5+ooKyWoZulsKSXm6qVoZ6bkqWXnqqYnn69g4dytHKEnYWtaHi5xLhxk6KjeqaZmXOqgnzLwMC7cYyiiIKffZaYiZ3AvYKXnZ2NncLBfIJ8ko2aw8B9a6Wyb4yBb8p6f5t3koOOgXZ6gYB5cXp/h3F4hY2TeW13lGNmX3lkYGWCY150aGxkYlhMVklRWkhPRDJJRT9EQj4vPD8+QEE6OERDQkNFSElLTU5QU1ZZXl9fYF9eXl5eX19fXVxTTVBHVU5BPz89NjQ2ODI3NiomJSMpKiYuKyopMTAfOSojPklbTCojQlEvI0ZbM1BZL1VBQjsvOJajucO0sLDAqaiUo6+psK6tprO0r6mlpqaxq5+rmJqin5yaqqeinayjpaikpLSknaKTpq2rt7OnrqKRkZmdpZKQn6GYm5+dh6espKutwMCxoKmvqZeRnp2hmaKjqqOToKGdnq2uqayno6Onoaalna2pkqSaqK2pm5ypnKyhlpallaGil5x/zpR4eqSBeZSWm1+uj16Op4GioH2nlpx0q4OAr15jjap7p4eFoHSXk4izY4KrhqGNjbNqha90fZeIuGGDrVmjzW2QdXvae3+ZcH6IknZ+ZXuIdnZrfIhvfoWRkn5tgo9gcmxwZ2BfeWRccWhqY2ZgUlRSV11LT0M1QUhFRDg+NjtAP0E7PThAPj8/QkRERklKTE5QUk9TXF5fX15dXV9gYF9fXVpXT1VKPT8+PDU1NzgxNjQoJyQhJywmJi8oJiszHTYwJDc7U0wrLC1LMCc7XDtMLSFQQEY0LjGtwsC/tbSwuJedkaSqqK20q6WyrKyrpKumsKqgp5uZpZecoq+foJ+op6OloZ+wrJqdlaeurbGrqKyglJKbn6SSj56lmJ2no56upKuwqcDHs6ipsa6Wkp2boZefqaqflKCfnZ2usKerqZynqKSiq5Oss5eloqqpnaOmpaGwoJKZppmgmpSUkZegcYWMl3SEqIdxsXydcax+oZ6BpY+ed6qCfa1/nHOtfquHhp92mJJ7fJd+qoiijJGMnX6re4mUj5+Ae61WnMR6j2+SwX2BlW11b4xtZXZlhm9hd25yb4qLkpCDbZKQZnB1dXBgZ21lX29paW5nY1dTXGFZUlNDOElJQEQ8PjxARkRDRUE9PDw8PkBAQUJFRkdFQENJU1dZWlxdXl5cXl9hX15eXVtaUkM+OzkxNDc4NDUyJiMfHCAxJyAxJyAnNB41LSY3PVdKLTwnPjEpM1ZARiEcRzpDMS4rsNTGxrK0oJyjjqOjoqyvtq+osaaoqqetq6unoqOdmaKVoKWqn6GloKioop+dsKyXmpaop6+sqKapnpeUmqOhkZOgrZudpqOvrKOstaq6zrKtpq2slpWcnaKYnq6snZagmZ6fqrKpqqqbrKuko6ybr7GiqKuupZimqqmpsaKSlqOkmpSShaRqpHWJeql0erJwgqaKmYxxiKCah6RgYVKrhH+ug5t2rYGmhoafepmXhntmgKOJpJmGgqR9qX+ClYeuXn2pVZ2ikoF6op+Ae8OvxYtyr7OzuXFiqa/CdGiNjJiPgW2alHBueXh4b2xmZWVxcGZ8aWJdV2BpWFhVTExRTENDQUI7Q0BAQkk8PTo5Ojw9Pj4/QT04NjtETFBSVFZYW15eXVxeYGFgX15dXF1bU0lCNjc5OTY2NCwmJCIgKCciKy0iJC4hMy0mQERXSCxHKzU2KjFQS0wjIEE5RDQsJ8PJ1tW/oZmrp6Gvop6wtLCvqa2ip6aqq6uppKagm6SenaanpqOcq5qirKGkn6+inJuTqqS1sK+gqZudlpSmopCaoqigoKWcsKakqLKtt8mytaqrqZWRnZyimJ+ls52aoJSdn6esrKSumq2ro6OqorOuoqqzsaGaqaiur7aikpaip5ibkXyqbJ6Eh3WreXywb4Kki4mflpaflIHSuLS4yYCBsl9glKmDo4iHoHqYlpp4qsl0maSVqKqRk5qMgJuKmcbGeGahgqVzgZ+Ogn2vXXC0YrB1S6OGbadHgpNkj5Ceknxxl5OAcXt1fntuW2ZqcnBlgWpfYVhkbVxeWUlOTEtFREFCPkE8Qj9KOzc5Nzk5Ojs7OzMuNjxBRklMTU9RU1daW1tbXV5fXl9fXlxcXFxcWE1CNzU2ODUvKSglJiUkJiksNEVOUFBNRktKVkYqTDAvPS01T1RRHRw7PEYyLCSnpMDGuK2ps62spaKcsrmsqqGmmqilqquqp6CmpZiqo5+vq52moKyanqmlnae1n6KXk6mqtrKsnKWbn5SPpayRmZuno6Cppq6hpKeqsLXCsrOqraiTiZedpJqho66mmKGVmZympqybsJ2uqaeerKS3rKCxua+dm66nsrOzpJSXp6KZn46CnU54moF/n3qDo32DpISGpp6cnpOEuHt8ebmCfszGwrZ4m6GQi59+mpaXinaemIqlmKSpf7CFnYWfhKx9mpRipWykcI+FkIF9loJyrGCjc3GAmmC8fVJVdY+SpJd7fpOSi3V7c4V/cVxtbnhyaoFvW2RfaG5iZF1LTFFUQUlIRkk6OUs+QjEwODg2Njg3Ny0qNT09P0JER0lMTlBUVlhZWltcX19eXV9fXFpaWllVU09IQDg4Mi4sKi4rKicmP1FUVldXV1lYWFdVT1VGPEUzOlBbVBwbNj9ILC0gi4eZqaukq7mqr6Cboayzs6WfoJWlrq2uqqedpqaao6ehs66iqaayoJmppJSitaKilZeiqbW5o5uinKGSj6GxmJ6bp6Whoq+unaSoorayxLGtqa2pkYeQnKecoqScpZeemJmapqSpmq+hr6WmmK+lvK2htretnZ21sriws6aXna+go52Fj9G1w7d5h46FkZOQgaZ4lKF3jKCRhKWBinGqhoS0bnJqmaOclYqefJiZhoePc6+CpZuijqaLk52KlZCabXCyXKVzk3qcbJl/e5l8balho3Fxf59ic7K4aHiQlKaYfYyNlI14fXmPgm1peGl5cm6AdV1lZG5tZmdgSltYWDxIR0BVM0BGPjwqKDYzLjAxMykmNDo7PD0+QENFSUtOUFJUVldXWV1fX15eX19dW1paWFVSUlFGOjIyMzAvKysoQFFSVFVUU1RWV1dYWFdVVVZUUU9RW1UlITJBSCQpJZNzjYqtv7+8urSelqelrbWhopmVo6inrqusmaain6agoLWnoqmnsKOUrKOOpK2jnZCamqq0tKSdpJunkZSXrZ+fnaeknaectZqhqqS2q8OwqaupoYyEjpyhoKajlZqanJibmaelppisqK6jpZutpr6slL2wrJ+isLK5q7Ommqixo6eXeqiQfXywd4qBpKWInG2yb6CHrXyhjoOolZiArImEroWflKqhoZeGn4CZlYB7kn6rgJ2al4ureJ2fkYmTkoB5r12jgX2mp2SdgHyXc2qvXaVrcIWZXWBbjKBtlZKmmYKVjpiNe3uEmH9rbX9jfnRugHpgZ2VxbmhnZ0NaYVs+S1QzVThCQkM3JCQzKycnMywgLzY2NzQzNTlAQ0ZJS01OUVNTU1ZaXV9hYGBhYV5dW1pYU1BPTkk4MDUyLiosQVRWVlZUVFVVVVVUVFVUU1RWV1dYVlVVUUhGSUojKCi9kpqDqcbCtsGzn5qsoK64paOOm6Sjn7Cvqp+kn52tmZ65oKOroK+pmq6hkKuopJaJmpCusaymn6aarJeYj6yhoZ2loZqlna2YoKimtqnAr6WppJ+LgI2bmp+mnpKUmpqUmpqlpKSaqayspKWfqqi+pJbDrKqioauyuaqup6CzrqipmHavfpCLnIWHfLquiphlsIxlla19oY+DppWagayKhLCFppmkoaGRhaBbbGqBs2B/rXt7goGxbWdvmZiMiLBbfbRcpINryKJkn4B7vFh2tVqyfVKugHqsWIChbpiQqJuLl5GYmHx5j51+ZHR+YoR4dIB8YWpncW1mZWVPVWRcQlVfPkooPjk9NCEiLCUfMi4gKjEvMDQ1Nzk6PEFDRkhKTE5QUVJUWFpeYGBgYWJeX1xbWFVQTkpGQzU1My4vQFVaWFdYV1hYV1dYV1ZXV1dXWFdXWFlaWlxcWFdXR0I70p+zsre9urTCs6ObrKaltqigi5qgn5yzs6mfo6CetZigtKiqrJ6vrZ6sm5WvqKKOiJuOr6yop6Kmma6SmY+omqGdpJ+ZpKOlmZ+jqrKpva+lqJ6djn2LmpWgoJmPkZqbkpqXqJ+hmqiuqKamo6Wpu56gxqakqKGrtLWsrqaeu62srJWAqZKjr4+bgIekl5iQgYC4w7qDjpyThKeWnIKsioKviKabm6WqkX7VvcKqYqO/vX1+o4KD17q4tYWUk4Oevb6Ea6OBb6uEbJx/erKwx4Nqq7C9rHh3or68dIGWjqeckJuRmJ16gpGbemN9e2SOZ3mCe2BsZWtqYlBhWlNqXEBVYUJOKj06NC8eHyQeJTIgHSQoMDQ5NjY3ODo+QUNGR0pLTU5OUVRXXWFcX19hXmBbXFlUUU1IQz88QT81PVNZWFhZWVpZWlpZWFdXWFlaWllZWFlbW11dXFpWWFRXWruVs7Sxv7mxvbKina6mpbKmnYyYpb+quLKoob+mp7KcnrGcuqifra+mppSUsKyXjIObka6loqyho5yqn5iLo5KmnqecmqGoopmeoaytqrmuqKObl5J7h5mRppuTjpGYmI+Yk6iaoJipqaGqp6GjqrueqMSioK6jqrO0qrCpoLqnrq6ac3WqpLeGZYmgcGetj4qPbW93pJCZn4F1rpiUcI+LcZWoo5uXrqRybW1sZot4b26CmXGBempxaWeJlpWYcWlphIdncIZkXYhiam9ZXWd+d6ZfYXGOkW5mZYCNk4+imJmZkZiffYeQlXZmh3hpjmt5f3lkbGNmbGJLZFhKbFo6UWVFUidLOisjHCAbIiwpGBsYLTIuNTo0NTc5PD9BQkRFSEtMTU9RU1ZdV1pcYGBhXV1bVFBMSEQ9OkFCN01YWlpZWVpZWFhZWFdXVldZXV5eXVxcXF1eXV5dW1tVV16ola2zqbm5srOqqaGunqOyqZiSvrLEyb62qp7ArKyjoaisoLqjpK6sraaNl66pkIyFlZatnqaroZ6jo5+Ri6SSp5momZajqqCWnKamp6+6rKyam5OSe4SXjaWYjZGRmJSNl5WolZ+YqaObsaaeoqu5n6/Ap6Sypaywsaqtq6e3o623loqgqKW2nYmWopiHqZqQlJ2SqbOZm6OroLGWoqCdoKKcoKWhlaunjZOSjIeTnJyVkJqTmJGOlYWBpJqXlY2Lk5OLj4aEfWeJfnSCdnSHi3GnbHqUkZOSgYGOkJCPnZWhlpqYooOIlY1yaZB3cYt4d3x6amxkY29kVWBYQGpbSGNhT1orRj0rJyE3NDAuHxwhJTIoKjY5OTQ2OTs+P0FCREVKS0tNUFBRWFRWWV5gYWNdXlVRSkVEPjk9QEFTWFtcWldYWFhYWFlYWFpbW1xeX19gXl5eX19gYGBfWVlgpZapqqW1tq6uorCjrZ+gtbGQjqzHvcW7uauipp6bpp+xqKO2p52ptKeokZisoouHiY+bp5aspaCZp56ekpWjl6iaqJmUpqGjkJqnmaG1u6irmJqQjXuBlIuglIqVkZWQkJOXpZCfmqqgnLajnqert6euwa6jtqavr7CsqamzuKCuvJmRpaSmtqKSnaafjamfjZKfo6yvm6GjsKivl6OgnKOqnp6dnJarnZKZoZuUkJaqmY2ZmZaQlp6RiaCdlZSFkoyQjZSLgH1mi4V1hnV5iINznGqFkJSTkIl9jJaSkpeUopOemKKEiZmHe3KWc3qLf3J8f2pvZF5wamFbX1luY1BgZFBaOkdHRT4yPT04LysmKykmHSY0MDY2Njg6PT0/QUFDSUpHSktMTVNTU1VaYGBpYGVVUEpBQ0I6OUVNVlteXltaXFtbW1xdXV9fXV5fX2FhYmFhYWBiYmJkYlxbY5eVpKijsLOsrqOppq2gp7WqkJCdpbS8r62toqOaep2isaSlsamXnLimo5SZqpyOhoqJnKOPrp+ilaefoZKXmJuui6qWj6iZqIyYqY+fubalppmbjYh5gpOLmpOKlZKUkI2Sl6KNnZ6onp+4o4CEr7Wir691pL2jsqB3eaCqsrqUdayknomAqn9kXGJ2oI6knoSXfW6Ts52jp62qo2Wdn5JzeZmWcICYqJdsf6KoimWcpZyRl5iWjJKckYadmpCVg5KHj4+SiYR3ao6GdoZwe4aBgGFph4qUkotadZWRaGiPj3N7ppqZZXmZh4N4mGqEi4NveYBrcWVfdnBsa2hcZ2ViYnBTXD5OTk5TRz5AVEQ5MS8eHyY0OjMxNjY3ODw7PkBBQUZIQkdGSUtNVFRVWV1gaGZnV1FKPERHPDhVUltgYWJgXmBfYGFhX1xdX19gYWFiY2RhYmFhZWRjaGReXWablaajoa+xrKuppamuo6atpJKWq7awsqebq6asl3SMna+fqKunlJe5n6CPnKSdkX+JiJuejauaopWnoZ2Ol5GehHWuj4immqmRl6SJnLq0qKCZmIuJdXeTjZWTipSRkJSMkJOgjpuhp5mcspaAjJu1nbOMko+8p6B+p6J6oq62gY6Opp6Di4aQsamvjIqWo5p5gIushpydoqepp4eVhZh3pZt6h5uBl6eCgnucsnqKhqCXmZSYloKRl5aEmpljeYeQhI6PkYqDbXCOh3mAcICBhX+GdIaElZF4lmiSdKCadH2ZhKKeh5h/k4uDhJlrjo6FbHh7cXFnZHhvamxqXGZramV0XF9JVExRQEU1LlpUVTcpITA5PT42NDM1Njg7Oj0+PkBEST9KRUpLR1NYW1lbYWFpZlpRSDlFSzw+YVZeYmRmZGBhYWBiYl9dYGFhYmJiY2ZnY2JhYGVkY2djYWFonJejn6atrquorKCosaamqaWZlK7IvrGil6eptZ6PhJ2snKeioI2Qvp6ajZ+aoJB8ho6ZmIisnKGWn6CRjZOJhoCRqI2Hop2klJiehp+6sqeem5KOhXB1kImUkIqUkI+bjJCSn5KXoaWWnquHn7SJtJqtisqHqq6It4WMr4KwroOpjaWYjZ19qI9ye3ecj6eWaJWkebSMn56mqJKYwoF/q4iYoXKegJqlfZeFlbGAoX2hk6CQmJeBjpObipiRi3yFk4aNlZKJg21ykIV/eXGGgYR8hHWEgZaAj8Vmf6mHj6NrnoOjm4SagY6OhoqZcY6ThWh3dHx3aGh1cWhoa15kcG1nbVhnR11STTJENDZOYWM3JjM8RUdEOjY0NjU4Ozg+PT0/Qk0/TklKTENQWl1cV2Feam1cUUU9TE1ASmRYXWNmaGdiYmJiY2NgX2JhYmNjY2VpaWNiYmJlY2FmY2JiaZSXop+wp6mopqugpLiwqaqmmpSgo6SrpJelqrejr4Chp5ylnp2JlL2Zk42hkp6PeYSWlpGIq5mbm5mhhY+Md5ucj5+QiJ6knJaamIejua6lmpyMjH5ibY+Lk5CNkI2NmIyRkp+PlKGhmaGnfqGnh62doJatj56cnZGFgKCNq66Go42pmYyaf6N1gJmUa4KsdU2reIeNnJGbqKeAqat9g6F7eqdpnn+Sa2eXhpe2iZ5+bmBkWYOXf4x7ZGiLcpl9eZVsXXyWbV9TcINcX2t5g2BZZYJ9g4CXcKeqa4OjbnKlcJ+FoGlmoG1bbop8Zlpgg39iV1Bvd2ZtdHJram9ea3BtbGlYaU9dWEY5QTRHRF5rNCxJQ1JNTj04NDg1OTs2QDs7PkJPPlFSTE1CSlxdX1deXmN2YE1EOk1PTVRiXFxmZmlpYmJkYmRkYmFiYGJkY2FjaWtkYmRkZ2RiZ2VhY2iXlp2guKCqpKaskaG1vKuuopmYoKKlrK6hna61oqiSoaCfppuajpm0mZCLn4yVi3WBlJKNiqaWlZienn+ShYaspIebkIqYqZmam5KIprGnopaaiImAaW6IiIuOjoqLjZKMkJKijJSfoJyhpH+TgY+joZSgd5yWj6eDoad/hqmshKV4inyEmn6icHOUiJZ7nox5bYebjJmQm6iaj4ede4Kic3amZp5+d6RfmHp9knOibpi3tLp0k4eCf7WoZIHGuHtwlbeLcYCapGJzrKtgfWmds35ufIaCjYKLmHF/o2xyo3SehICjYJ2Zs5ZxfJefs3RzW56yg2pib3R2cWlvWGtscnJmXWleYktFPUQ2UUFZcTM9U0dfSlI9PDM5NTo6NkQ7O0BKUD9VTU5RQERfXltZWGBgfGRIQzhMV1VWY2FaZWZra2JiZWFkY2BhYmBkZF9gY2tuY2NkZGhkYmdmY2holJaVo7iZq5yToI2kt7WuraCaop2jo6aunJuxrayTmKGZoaSZmpSfq5uLiJJ4i4VxgJaNio+hkJKUnZd9kImNqKGHmI6KkaOUnJuNi6mopZ6Ql4eFfmt7h359j42Di5CRiY+UoIOXnqCdoJ6LiXecmKKMn3Khi4eoiJulj5anqn6tjH56oJl6o5N4gXSWiI2cfZWfhpuOmZumhqJkoXyIlpCbjWyeaJqNbpqZe4CLp31yaHSrg56DdKpolZpdm4V2hJ1oqmqAuGZcqHCBnGCVjF6ndnWHiX6eaJp1hpOSl45/n26akG2nml2ofni7a36qW46EXbNnXG5yenhraVxxanh5Y2BmWGJBUUZPN1ZDUm81S1paX09aREAxNTE7OzZIPzpDSFU+WVJZXT5EYl5WYFFhY31qRUI5TltdWWVmWGZnbm1iYmVfYWFfX2BgZWNeYmRvcV9kZWVrZWNpaGdraZWciaq1m6eIY5Sbq7qysayeppycqZ+erpuesKisnZekmqGfmJaWoaSZhomNaoiAcnuXiIuWloSRlJiPeoqElqSdipSPhouekp2diZCpo6CajJKKgIBpgIZ4f5eMe4mOjoiPlpp/lKKfoKGTmHJon4qfj4xwkoyBqYeYnqKnn6d8r62joriXd6OzoqSAiJR5nXuqmn+ijp2bl4iXcaF8hY2vtX1rmpGheH6YtKOjq6iEmXybfZ2af3SqWl1ve5aLeJ5iTH56eoVjeZdCTJ5ZompyfI5tgIiEmXWbeIaJsbN/f5uTp3aCnW5zfZRvmXNrpF2VdkhlZGFzcX5+bmZgbGl2e2RlYlJeV11VV0BaRVFoRFNXXGJYXklEPUI4P0I6SUY4TEVYQVdSW1ZERmJcWmBLYG1+ckVDPFVfYlpmalZnaG1vYmZnXmFhXF1eYWhiX2VjdmxeZWdma2RmbGloa2mTnIGwrZmEVF6gprO5s7OpmqKMnKucnKmUoaukoaiPn56dmpmWmKGdloiHiXeGgW95lYWQm4t8kZOWiHJ/iJKhnHORkIGImZWhm4WOqZyalYuLi3yDbISFcYGhjHiGjYiIk5iVfJOjoJ6jiK2GfbWEjp6ce6WWeqmBlZyPiqCcfKdod21+mXShc3F8noaZcJODrn2kg6aemYCjb16oZ3WjY2+lYZzTkHx7mXhyc2OihpB+o3Okj3ZrkLOMYIKYiXOqsqi8f3eDbX6+pqm0XpxufXGXbn9yonJdpGdzpmFopm2b1Jl9hZtwenqXa5t8eJdzbqmkZ2FleXCAhGtnZmRudXdnYGNUW2ZRUWJJV0pUYVdTW2VqXGVRRkNLTUpLQktFOE9AUU5YU1lPU1FhZmVqUmN3eXdJRkVjXWVaaGpUaWhqb2NqZ2BjYFxdXV9oYmFoZXxkXmRnZGtkam1naGxol5t/sKtUXEt+qa+xtLCzo5yZhZmpoKGkjqWooJipipmYmJOZk5KgmI6HhntwfYRofY+DlJqBd5COj4lvf4aPkpJsl5N8iZGSpJaDjqqak5KLhYl6g3aHgG6Bn4Z3gZKGiJmil3uUo6San4mzoaK2i3qsp6SupXCogJqQhYCbkXukgKKZhphynoSjrq+Kl4x/jKSNlYOtoZR2tLW1yaFzlIqBn2Cdl6lteZWGoJt1oYd3oH6Sl4uBb0xmo5Jwm4dypHt6dGGDgWt+oGtxZF+ccX10l2l6abO1tMamc5h+ep1rnJurdYSbbXV4mGmaenWYclBFfbReanZreYdmamhidHVwblZeVFlpUFNpSVZNWVRWXWhrblZnV01KQkpNS0hKT0FRS1BlY2ptZXVzc395fG51iXt7VFBObF5oW2tpUmpoaWxnbGZjZWBcXVxeaWJkaWt7X11kaGNqZm9sZWltZaGciK+mhGY/lKGzq6+vtqKikICYqqKipYylp52dpoKal5aNl5CPnJOOiIN5anmGZYOMf5egeXWOiIyBaYSFkoKMhZ2NeoyLlaaTg5epmIyRi4GJeoB9i3lwkKGGeYGVh4mWoJV/lKWnnJaWhGZueJxsomR8caV3m5hwZ6aAlot7pHqfloOXcp52gYqUlo+5bpCKomJ9maGViG1yaaprdaBtbqZfmmmLkGiWh5qVdaKAfZpgjIaNdW+IYmigZZ5+aZp1b2NmiIJtcqJaX1tioW1diYxve35zcmSlbXeiZGenaZlzjJlvom9TiZBvoF9lqFSLXlSYbm1za3KCbXBpa3lza29SWVdXZ1pUbUpZT11JWGlpc2pZa1ZRUkVWXExYU2FVaWtfd3R7fXB9fHKDe39zdo2AhHZeUXJiZ2JwZ1BqaGhrbG5oZGdfXV5dYGtiaml2dV1cY2ljampzbGZrbWOcpJimemV0bYunrqSpsLGmn4uAmKudn6aMoqGboqKAlpiTjZqPi5iQjop7hnGAiGiLi3yYm3N0iX2Qe2SCh5WKiZaZgnyIh5aokYGirJGGkIqCin6AgI5zaY+lhH2GlI2ImKCOiJOqpp2JpniVm36liJaMspiekIKvl5+ld5SHeal0pY+Emm6kooyShIyDu259pa+DhoaGk5Wcn3ylenKolaCWZp5+b6tjloqVkniobKmigYl2iIN3qpGmh2qRsGt2s4ypa4qGbW2fnpKVYH6ri6p2fn+MpZ52n32EpJWdoGqbiHesZ5+tjLZ0d76NpJNZg6aNq2F1cnRwfHVxY2p+bmhsU1dbVmFiXWtNXVJdSl5tbnZgW3FZW2BbZnRlbm9xYnF0YHd6fnlyeYNzhH+Be3uMgYKAdmJ4ZGNtc2RSa2dob2xyamZpYWBeXGJrYm1sem9cXGJpYmxqd21nbG5ilaWqnYGAnqSWqaqdqKeupJmJg5irmp6kiZulnamdhYyajoackYWSjYyNdIZ6iIRvjYR+mJN0dIZykoNtf4uSh4aTj317goWYpo5/paaOgY6JhZV2goeSb2yLqYCDi5SOiZyfiYyUqqOgj4B1lJeIfoF5lK6jf4GbcY+FeI+Kg357cqeMcX19epeWm4SOeHt+foeUlZOKdpCYn6CDe32Ja4yFW3l5cnpwaG5+kolxf3WBj5STcYaEgmWMf16Bf4t3dXOUdW95bm6HbYSFXnZoeI5lgICFjambfXR8lmqJiHCBdn2Gdm1tZ4xzeXuYeIVba1h5j2lud3JxcHh4cF1shm5pZ1ZbYFdcZmtkVmJVX1FfcHh4bGt2ZWpra3Z9cXJ0c2FvdWJ0e4F4dXqDdYCBf4F5i4WDfXttf2xkeG5eV25naHVreGppamVcYFpjaWZscXVuWltia2RsbHluaGxvYY2UuKimi6GimqakmaWcq6OhhISYrJKeoYmappqpmIOBm4p+lpOHjoqJjXKDfI99fo+Fe5eOc3KDcJWFe32Si4aGkIV4fYCGmaSOfKehi4aQkIWWg4aOmHdyhamFjpGdkIienoiMm6ifoKqDiY6Vmn5+iZatqI+Spo93b5yQgnmRb36ohXB9lXFrcH2Bn4x/k46MaG1dg4uMnJuejnOVi4hxdGuCdnSBWXJuhpGBfX6Mal1qZHuFhImAYGl4ept7gouCdYGFgmd3ioZrYXBxgXZecoqBiI+mlYVljI+DbneLhHGGj3pwZmdle4N6lltcamdudlt7eXd1bnNzgmZcbYpra2JaWl9aWWxxXF9hWl9dZnR+enRvdGNra2t8fXN7eHRkbXVobXx+dnp8e3p6gIB+b4aKhHt9c355c39pVFxxaWx1b3Vna2hkXWFYa2hsa3FybVdbZW5sZ3N5b2hqbWCLi6qwoZCjoZqenpiemaijo36Dma2Nn5WInKKRpZV/e5iEfJKZiYiGh4pzfYCLdoWLgYSWinFvgHKYhoR+k4SDhoqBeoCDi5ugkIKnoYd4jpiJlYuLnJeFg3qsgpGXmZSKnp2HiKGrn6Kio4uIk5uco5mWqqGnp6CSm4eVjXt3jY6Ep35/kpGSk5yyppuVnpCNspOXhKWMjJWbn4mQm4KIkYprfI53eGWChpCLfImdhIeLkIiIgISEkHd8eXSZoYiGiZ6KhJR+fYqAgHVvc4SDf3eGhoqPppCDhY2Hg42QjH2IjIqRg3dsgoR9eplqcmhhdIpwfXp3d292dIFdXm+GaG5fXlpdXVRoclZjXFxibGh1fHxzb3Bka2ppgHxueX9xanBwbGeBe3KCgHh/fX+Ee22CjIZ8enh8fXqDeU5kdmpybXB6ZWtlY2JgW3RmcGZycW1VXWx0bWl5enFnaWtkjIeduZ6WoqGYlZiZlZmkoZ58gJqrjp6NhqCci56WfXmUg3uOmYmGhISGbniAgHKBh36JlIRta356l4eEg5B/gIaEhn2HhI6bnZKHq5+EcouQhpORi52RfY16qoSNkpiWj5yWh4abpp+imp2GgpGamZiQmqafpZ2dkJaAkIl2e4eOhKV7fI6QkYaYqqGdk52PjaqOkYCdjImTmp6Cjpd+ho6Db3iGcnVhf4OPhnWLmIGDj4KGhX6FhJRueXV0kqGKi4WahISMc3+IfH1ycnuHg3t4io6DkqaPhYOOgYSKiYp3homKjH1vbH6BfG5obG1nX3p/aH17dnR2dXt3XF9wfW51YGNbXV5RZ25UZVteYmtpdnp+cWxsZGtqaIGAbHOBbGx1b3lwhXluh4B2goB+hXZxgo2Ifnt7fH97gopgaXxqdWhpgmVqY2BpXGN1aG9idG1sVWNxeWVwenpyZWptbIuJnreaoaOfkpGWmIuan5+ee3iep5GcioellIuYmXl6jIV8iZGDjIKCgm57f3hzgYV9i5F9a2h9gpiJgYiOfH6GhId9j4GQm5uRiaicgHCMi4yTh6GiioWMfKiRiJCSl5OWk3iMo6CgnZaZf4CQmpiSjJqjoaOZl5Gbfo2FeICDjoagf36MjI98mKSgoZOZkI+mjY+BmpGJk5ebfpOSfoeOgXR0gnB2YH6AjYZxipV8iIxxjH+ChYaOaHdxeIuYkY9+l32HinKBhnt8cXh6ioR6eZCMgpWlk4uFkHuGh4eFdoKEiYh7ZnJ8f3l7cWxqZl9+c2h8dXZzfHOAal5gc3Zwd2RjWV9eUmtpVGRZX2FoanZ5gXFma2RsaGWAgWttfmhvcWx+eId6a4yBc4GBfoF0doKNhn98en+BfX+PanKDbnNpYodobGJfcVZ0b21uYHhobVdqdHZjdXp7cmJqb3mJjZ6ykqWlnI6QmI+GnaCbnXx2paGOmICMooqImpZ4e4aHfoOJf4iCgX9xf3t0doKFfoqReGdjfYaXioKKjHl9gI2DeZaBlZiWjZagm35wjIKRlIamm4eNiYOmlYWTi5aXk5J3kZ2goZiTlnl+jpiXjpaanaSdmJKUm3mPhYJ3hJaNnX6BiY2McpejnqGTmY6PooyLg5aYg5KWmX+YjHyIjYB2cX1uemSAfIqFcIaTf5CCbIeCgYCJhGV1b3uGkpeMfJN3ioh7f4V8e3F+d4iFeYSPiYqXopWBg4t3iISDgnd8goqGd2B5eH10f3hnbGVhf2lqd3N0dX1xfGJjYXNudXJtYVphXltsZVJjWGBhaGt2eYZxY2pjbWVofYNsaHVobHBpgH2CeW2QhnGAhIN/dHyDjIGAfnqCg358kG12iXR0bWWKbGpiY3VWhGlxbmB4Z2xianZwZnl8eXFfcWyGhY+crpemqJ6NjZeHhp+Tl5l9eKqcipl6l52LjJiQeXuAi318g3yAgoF4dHl6dH2AhH+Ji4BkXn2LlYd/hYd0fX6Kf32YhJeUl4ykoph/c4d7lJKKp4+MjoqSoJGDkZCUl5GLgY+YoJqSkJBzf42SlImdnZ6mmJiNlZZzjY6Ka4WXj5l6h4iQiW+XnZqjk5WKjZ6MhoKSnH+SkpWHmYh8iomBeXF6a3VsfH6Lfm2FkoKUeHCCg31+in9kcml7gJaXhH6Nc4+Ig3iGfXZ3f3yFgHyCjISMlKSPeISCdImHfYB0doGJhG9he3V6cX1vYm9jZHtibm92c3h3c3RhdWBvbHVub1xcX15ea15QXVhjYWhtdHuIa19qZmpjaHeIbmZsaGpsaIF9e3dukIhzgYSEfXSBhol7g316gYR9fY5yeot4eG5sh2poX2lyYodocW9ldmdubGF5aWt9e3hwYXdti4CZmaqgo6idioqRhouei5WYfneumY2XfZ+TkZaUiHd9e4p8e4B2eH+AcHR0e2+FfYGAin98YVt+j5KGgISEc3qAh3qPkoiSkZyTpZyVgn2CfY6LkqSJjoqNl5qNhZGYk5aPioiMkp2Tj4uMboOPj5GInpmioZeWiZaQboiZg2aFmI6TeoiEkIpwlZqUopKSiYuZjIJ/kJ59ko+SjJmOe4qEh3NydWtwbnV7i3RuhpCOknF1gHuBgYh8ZHBseH2Zk32EiHSQioBzh3luf32AhXuFi4iEjJWojHqHfH6LhXh+cXCBhoRjaHl0dXB8Yl9wYWt0XnBqe3l4bHNwZXhdbmxzbXNYWl9fYmtaUFdYZWNncXF+h2ZdaWhnYmdxjW5kaWdkaWiBend1b46FdIGCg3t1goiFeIV8eIOFeoCJd3+Le3pyeINqa19waHSAanJvbXFnb2xlfGNugHp3cWx3d4p+opehqKCmm4eMioKQnYeTnXWBqpWTjoehjJWTkIB0e3aFeHl/cnN7hWtycHptinaAgYducVtYfpGNiICAgHd1gYB/oIaRi5KdmKGVmHiKgIGNiZyeio+GkpeWhYmVmY+Wi4uNjY2dio2Pg22Ji5CQip2WoZyYlIWYh2qEo4JmhZ2KkH6Lg4uBd5OYkZ6RkImJlY1/fo+YfJGNj46aknyKgIJudXBsbW9we4Vpc4OOmIpxd4B0goiCeGZybnWBmY57iIR6k5F5dodzb4h7hYt6ioWCiI6bo4d7g3WBi394eW9sgYSCXnJ0cnBweFpecGBwal5van16cG1tamx2YHBvanFtWlhhYWJuWFFUWmZnY3ZvhIJiXWttZGJma5JuYGZmX2drgXVyc3CLgHV/g4B4dYCLgHmFf3eHhneDhXyHjH97dop/anFjfGOGfG5xbHRqaG9sdnhfcX95fHR1dICCfqSVmq2ep5aFjYR/l5SDkKB1i6CUk4aLm4yVjot6cnh0gnByhXNxdYhrb211bYh2g36AbW5VUYGrlYeCeIB3c4N6gqCCkoKTk5ick5p4knuDjZOkmpOOiZWYkoSGl5mMlIuJj4+InoSPinxzi4WJjoicmp+alpR/k35ohZyHZ4Wgh5GEkYKJcYORl4+bjo+MjI+NeHuSkHqOi4ySlox8iHyAa3ZqbmtsbHt+YXp+jpaCd3qAeIOMfHlnc2xzh5WKfoiGe5OPcXmDb3aMeomLeoh9gYuQnp2EfHt3got9d3FqbIKDemB4cG5scnRWXm9icmBfbG55cGhvZmZzdGhwa2F3ZV1WZmBgclNRTlxmZV15cIh8X1xocmJiZWaSal9oZFtncH5wa3F0in12fIWAdHV+jHl7hoF4iINzhoV+jI2Ee3mVeGZyaoNgiH1vb2t6YGpudH91X3R9eIZ4dHOFfHigj5mxnKWOgop/g5qHgIyef4uak4+FiJiOjo+Ed3R2c4Bwb4VzcHGDb2ppdm6Dbn19bXVzUk2C38iS1pN8cHWDdoSgg5N3lJGZnJCZe5RzhZCfoZOTkIqSm5OGfpaWiI2NiJGMiJx+joB4eo1+iIyKnJydm5WTeo11Z4iRhmyIooSRiJeChWOMkZmOlYqXi42Ki3F6lIh7joiKk5GJeYV8fmx7ZXJva2t5eVyAeZCOgHt9fn+Gjnp6aHJqc4qPiYKFhHyUimt9fm5/i36Lh3yEeYGPlZqZinx2eIOQeHNtZ3GAhG1qdG9oanRuU15vZHBZX2txd2ZramJmeHJvcGNfd2BgVmtfXnZQTkthZ2NdenCJdFxcZXZgYWVljmNhZmJYaXNzbWpxdox9dHmGgnV2fotzgIZ/eol+comHgZGLiHx+mHZlc259ZYh+b3BrgFpsbnl5c2F2enuNdnJ3ind5n4ubrpugkIKFd4iVfn2KnYeFoJGPhYyYhJOOh4F0d3B5cW6Eb21ufnJkZXhwfW16fWpoa2OkmsHcru+hc2x2hHaFo4aSb5aRlaCVnIGScoWLo5eJjpWKkJ2Wg4CVkIWJj4CRiomWfod7dX+JeIaEjZybmJmOj3aKdm6FiIp9iqKDkImchIVei5OXio6JjoqKhIlte5aBfYiFiZGPhnaFfX1rfWR4dWlueHNYiHqSh4V5foCAhYx+eGVyaX+JjomCgn+LloVrgXVth5CBj4R+gnp/kJWTmI91c3eIjXVzcWd1eoNidG1wYml2Z1JhcWdsVV9udHlhcmRfaH1wcm5aY3JhYlduWVx4Tk1MZGdiXndziW1cXGR5XmBkZYVgY2NeWWpya25rcneMfnR3hIF4d3uJcYOEfX6Ie3SLiYeWhox/fpdzaHVxeW2Lem50cIBXcXp2eXFld3mGjGh2gIlyf5yHmaeco5KFfXCMlHh5i52EhaGNjnyWjYCaiIR7c3dwc2pvgWtpbXx1XmF4d3txdXtnYGR869q1ycPciHNsdIF3i5uJjmqYkI+dlpOBiXGFiaCNhIuVioyYk3yNk4iDiY97kIuFj4F/dniDhHOHgpObl5SXhox1h39whIGJhpihgpOLnoOJYYOUj4aJhomNh4GHan2UgH2DhImOjYJxhn5/cXdodnJpc3dsWox8koOFfX+DgISKgnVhc2uIgY+KgX5+kZB9bYFreIWOhZGDfIF8f5GSkJaIbnF6jIZ1bHFscnmBYHRpbl1rdmBSZXFpZlNgcHZ0YG9gXWiCcXNpV2doYmlYbVZbdUxLTGZnX2Jyc4VpW1xleV5eZGd7YGRfXVlrbmZvaXN4in5zc4F+enZ6iHOFg3yAh3Z3ioaOmYGMgnuTdWx3dXl4k3RueHt8WHqGcYBvZ3h3koJjdoaFcYqWhZmhmqKKh3Nvk4tyd46cfYqaiYl8n3+Emn+BeHJzbm9kcn5oZmx3eFtfeXt7cXGAamFnYX/Vto6QpnhucXd8cZORjYdqmY6JnJKMhntph4uZhoGSkYaHmI18jY2BgYqNe4+NfYiEenR7g3txhoCWmo6TlIGIdYOFdYN/ipKcnYWUjp9+iGF/k4eEiISJjX+Ag2d9kYB+f4KMjpB+bYJ8gnRrbXd0c3Z1a2ONgY9/hX58hH+EiH5vX3JwhHuOjIF8fpCIeXCDZnmCioaLgnuEfX+Tjo+Sg25veYx+dW1va2x7fmNoa2pZbnZaUmpyaWJRYnJ3bGJlXlpqg21zYltnX2RsYG5VW3BOSE9nZVxnbnGAbFtbY3NgXGNsd2RlXV1aa2xibWp0d4Z/cXB/e311eIZ4hYJ9gId1eYmBkpZ8iYZ2iYFwd3l7hJNvbXyBd16Df3SBbWl6dJRzZ3OHfHKSkYOan5ughoh2dpV+bXaUl36IkYSKjpp9jJp2fXZxb2xqYXV8ZmJpdXpaX3d8em1xf2VkaGdXnY9ecXOWvMSEdnGUiZB+c5iMhp2TjIh0a4iPlYB7lIuBhJuMfIuGfXyJjH+UiHWJhXV2fYFxdYaBnpWGlY+CgnJ/h3SDe4mXnJaGk42cgIhlfZKCf4WDiYlygn5nfYt7eX9/h4uPfWmAfYN2Zm94eHN2c2xqjYWKgYp/eYKAhIN/al5xd3p9jImFe4CPf35ygGh4goaKhYN4g3yAl4yPjH1ubHqJfXd0b2lofXdlXXFjWHBzU1Ruc2liTmd0eGZgXVxYboBvc1llYl1qbWBwT1lsUkRUaGFaa25te29aW15sY1pjb3ZkZ1xdYGtqY2xpc3aBg3Fufnt/dHWDeoSCfIGFdn6JgZaReIOKdIGIc3l5f46Qb298gXFpgXl6fm1tfHaVa2p4hHRrlI2Fn5igmoWIbn2Mdmp4mI9/goqClZiKeo+Wb3pzcWxqZGB0emhfZXJ7WmFyfHlmcHphZWWOsbJ3SmJapNnQl3J7kYuReH6Vi4WZko2Gb2yGkpF6eZKGgYSZinyHf3h4iYqEloBviodxdH17anmFg6WRhJONg39vfoJ2gniFmpiTi5KPlIWHb3qSg32Dg4mDb4J4aICFeHJ/f4OKh3xlfX6DdWNwcoBoeHFvdZiNhYKKe3Z4gIR5gWpbcHxygIeEiX2FiHqIcoBtcIOGjoODcoN4gJmMjYR3bW5+hH93emVoan1yYFl3WllybU5YcnNmYEptdnRhXVtbWXR9cm9XZ11manBfb05XaVI/WWdfW3BqZ3lxXFpZa2VZY3B5X2hdXmVsaGZsaXF3f4dvbX99gHVwgXuAgX+Cf3aBhYmXinGCjXF7hn16eoSUjHVqen9rb350f31vcnx7lHBvgH94ZpKKgqGYnJKChWeHhHBoepeJfn+FgpmKgXyNjWl4cmtsZl9hb3ltX2JveVxkbIN6YXF2X2Vl1eu+izI6PouOgHJ5hYiOjXaEmI1/k46Nf25shY2MdX2Pf4WClYh8g3hudoeFg5d3boiEbHV7dGZ5goOojIOPjIN9bn90dYN5hZuQi4+RkoyLhn57kod4gISNg2yAcml/fnhtfHuBioN4YnmEgXFkcWh+bXRxdIGbi4B/hX5zdX6Ac4BvW2t9dHiJgop7hn98iHh5cGuIgo+DiXGBeH+Wiop+dG1qdoCAdXVcaWl4cVlXfVNacWVMW3NyZVtKcHdvXVtaWV10fnRoWWJbZ2VuYmlMV2ZRPV5mXV12Zl90cFtYVG9kWmRweVpoXmBnbWdpbGlweH2ObGqChH95boB7fYB/gnp1goGMk4VwgItud36Ae3uIk4l/aHt+a3R8coZ7c3d9f4x6eIR+fGuMjIObnZaMgYBsjX5raX+PjXt+f4OUgn99iohrdXFnaGNbYmdzb19hbHRhaHCJemFzdF5jZJugkG5cNVmvtXVqgIl9koZ2hpiHdY+MindwbIWDh3R5iXiJfZOIen5yZ3aIfn2Xb3CGfWh3eW5leoiEpYeBh42Kfm5+dX6AfIuYhoGTkJeIi4SJfI+IcXt9hXxpfm1qgHt6anp2goeAcmB3gX5xZHJndYJtdXuFlZGBfIJ/b3d5fHR+bVdtfnZzioGGd4d1gYl5eHJtiICPgIRyfnx9koiIem5taW2CgXVuXWhmdHJSW3tOXHFcT1xyb2RWS3N4aldZWVphcYB0YF1dYGZkaGhmTlpoTkFhZFtgdmFcdW1YV1J0YVpkbnJXal5iaGtnbWxpcHd8kmxphIp9fXB+fnuBf4J6d4CAiYuEcnuHb3F3g397io2Pg2p+e254eXeKd314gIKHf4N/fnpthYyImKONhIN7dox5a22EiZJ5fXuCkYCAfYqDcHFwY2ZeWWdfcHBgYGhwZmpvinVhdG9bYWRpdnt/vpymo8i4coWDc5R9eIeUhHSRjYhyc3CEe4NzdYZ0iHeUiXl5cWN3hnmAk2lyhHVmd3ZjanyDiJ6CgH+Ojn1yfnODeX+Rj4J3lY2Uj4eCiHqJiWt4eX51aHppa395c2l6doCDfWhgd4d+ampzaHuAaXaBjJCUfnp+fnF7dnt0fWFVdXxyc4mDgnyCcIaJd3hwb4KCi359eH18dY2Fg3ZocWhsiIJycF1oY3RuS2V2TF5vVVRac21iUU90eGFSV1hcYXCCc1tgXGhlZGNqZFBbcUlEZGFcZHFeXHdoVVZUd15cZW5oVmxeYWpnZW9vaHB3e5NuaYiLeX5ye355goGCfHZ9g4iGg3B2g3Jtd4KDfomLlH9wgHx4eXqBi3SDeH+BgYKEeYB2b36Ji5ueiH2GeneHfGh0ho2Ren9/fImGhHaPgGdvbV9kXFhlWW1zYWBhcWxsaIluYHNpWV5kbYB3qdqqx4aHsnKKeHCNdXuHkIF6lIqAdXR1fneAcHF+bYV0lIZ4dGxgeoF5iI5mcYNvZ3VuW219gZCTgIF5kpJ9eHtthnWAkIuDc5WKkI6HhYV7f4VtdXZ/bmh3ZW18dm1qd3Z/f3xhYniGemh1dWN+emd0ho6MlXt0gHVxgHp8bH9ZVXJ9b3SDhn9/eGuIhnN4anR/g4N9enx3e3KKgHxzZ3NlbYuEbXRbal92ZUhub0xbY1hXVnhtYlBTdHZYUFVYXmBxhG9cYGNtZGNebmJUXXJHQ2ZfXWZoXlp7YlJWXHVbW2drYVZrX2FuZmZscWhwdniOdGuOjXV/dnh9d4GDgXt0fYOIiINvcX90cXV+hoKJjYp7d394hHx9hYd4h3x9gX6EgHt+c3Z5jI6fjIl6iXd1g3lefoaajXmHg3SGhoR3iXtibmxbYltbYVZqdGNgW2hvcGeHcmFxZlddY2t/fMrOh7mia21ui21yhXJ9hYt/e5KFenl0eXV1e2ptdWOEdpKCd3BnXnyBeYuJZXGBampxY1hte4aciYOCc5eUd357bYdwgImKhnCWjpCIhYuDenl+cXFvfWdocmJteHJqbHF3fXx6XWV5gHdpdXhmgnZndIeMjZR8codpbn6AeW18XVdwfW1zf4p8gW5uiX9wdmd2foB+gXV7cXpzhnt5cWVyYW6MgmxzWGtfeFxJb2xNV1ZfVFV8a2FPVHVyUVFUVl5idIVoXGBramZiWW5hWGJwR0FoXWBmXl1We15PVmRwWltqaF1XZ2BfcmZqaHJncHN3hnhulYp0f3p3fnmDh4B1c3+GhY6CcHB7d3d1eYeFh4yGenx/dYt+fYaEhId/fn59h398eHV5d5GTn36MfYtudYB5ZIOIl4Z0kopvhYWCeoN0Y25qWV9bXV1UZ3NlYFlkcnJngXNia2RXW2Bpf3i+rnuft25ic4dodHxyeoOHe36NgHh4c3dve3Zlam5hh3WOgXNqYl5+eHmKhGZxfWhqa1tXb3iKo4GFf3GZk3GAeHSBbX+BkIZylIeMh4OIhX15dHJvaHlham1gbXZrZ2tseXd6d1tnfXx4ZXN9boR0ZXWGjYaVfnCLZmt6g3RsdGJbbntrdHyLeoFmdIZ9bXBndH53fX5ye2t5e4F5d3BlbGFtiX5tblZrYHdWS2tsT1JPaU5ZfGdiTlV1a01QVFVeZ3aDZl1hcGhnYFdpXVxraEpFalpiZFdZVXlaTldualldbGVcWWVjXnRmbGRyZ3JwdIB4cJmFdn9+eH98hYd9dXOCh4CVgm5zeHp6c3OFh4iIhHmBfXaPf32EiY6DgYN7fouDe3d8d3eanZd6ioOHaXZ+fGyEhZSAco+CcYaCfoJ/b2ZsZ1ddW1xaU2RwZV9YY3J1aXZwZWViV1xcaIBwb3KAc4llZXl/anR2c3ODhXiBhHp3dHVua3pwYmdrZ4Z0jYRuZl5ffG97iX5obHdmaWRWV3Jwjad8hHx2lpBzfHJ7eW16epCEdpd7h4aChoN9dXBybWd1XW1oX2x1ZGdmaXpve3JZZ4F2dWhwgHiCdWF3hYt8lIFui2pteoFxZXNlYGx5Z3J2iXp9YXWDdmlrcXR6cHl4cnxlfn5+eHZuY2VhbYZ8bWtWamJxVExpa1BMTnBIXntmYU1VdGRKTlNXYWp3fmVdZ3NpZV9WY1dicF1LS2tYY2JVVFVzV01YdWRaX2tgXFpjZV93Z21icGlzb3F+dXSZgXh/gHh/foWEen12goN+mIVucnR7enRxhYWPgoB6i3V1kYB9gZSOgIWEfH6Mhnp+gHZ7o6aKeYiGhWx1fHt1hIKMem+Fc3qFfYKDdW5qaGVWXVtbWlNjbmVbWGF0e2ppbWhfYldfW2mAaWtvgGdsYWh6eWt0dHRvhoJ7gH12dW56aGp5al9lbmiBd5CEZ2VYYndpfod6b2lvZmZdVVhvaI+ndoF6fJGOeHVvfm5xdHiOfneUdIWCf4WIdmpydmdob1xtZV5tc19nYWp4aHttW22Dc3Rqb4B+eXdgdoSEeI+Fc4hxcHl/cWNwaFtudmRwc4d7eGFygHBnaXhzcWt3dnR1YoN7fnd1cGNjY218fWtrVWliZ1RLbGhQR1JsRWF4ZmJNVHJdSkxUWWRrd3plX21waWRcVl9Vb29XSlNoWGZeWE1VbFRLW3lfW19rXV1bYmVgemhsYW9vdW5vd3V6l313f4F5gH+Hhnp5eoN9gZOEcXR0fnl2dIWIkH2AfZBsc5WBe4KfhX+HfYB+hoKAint2hKyfgHqIh4RscoJ5doGAgnRuh299gHSKgGpwbWRkWF9aWlpVYmpnW1pfdYJpXm5sXGFWXFxrgWVydH1pal1sd3ZndHdybod8fn56dnNsemdpeGZdZHJneneSgWNjVGVvZ4KEd3ZmaGlgV1ZZaGSQp25+eICLjnpwcHxmeG55inp2jnGDfX5/hm5kdnNkaGhdbGJdb29bZ15sdGV6aV10gG9ya3F7fnV1YXSFinuHh4B/d3J1fnRhcGxZcHJicXGEe3VkcoBsYGx6b2poend0cGSEdHl6dXFkYWRtc35qbFRpXl5VTHNjUUdXYkdjdmZhS1RwWEpLV1hna3Z6ZGVtcGZjWlhdWHZmVEpcY1hoWFlJV2VRSGJ4Wl5gbFteXGJkXoBpal9vdHhub252g5d5coGAfX+Ii4Z+dXaGeIaMfXR1dYF5enqCjI59foSJanSWgXuKnX1+hXmAe358hohzcY+ujHx7hpB+ZnGIenR9fXZyb4Zte35tj3picG9hZV5lVllZV2Nma2BdXXOGaVlxblteV1pcbHtjcXd2bWNbbXN0aHV2cW2FeX+BeXdub3RlaHRlW2d0ZnZ2kXpfXVJlZmqCgXR9YWNpXFRYXmJjkKVoeXSDhpB4bG55Z3dse4N5dIhygHh7eH9oZXZtYGZhX2pgXXRrWWVdb25iemZbeHxrbm5wd3l0dGRyg5J/h4KIenZvcXxyYXdjWm5vYXBxgXtzZXGAZF5tdmljZnh6c2xtgXRzfHNxYV5lbW99ZWlUaFlaVU55YFJLWllIYnRkYUlUbVNJS1pXaWxye2NsbHNjYVlaW2F3XFNLY11YaVNXSFlgTkdpdVheYW1bW19iY12FaWhhbnh5bG9qdoGQeG2CfoCBkoiEgXZ1iXSLhnRxdnaBd3x9foyQgH6TfnB4loN9mZJ5gIB4eX5/c4iDc3Caont7gImVeWR1iHlzeXZrc3B/bHl8cJFyXnBvYGdibFRaWVdoY21mXFxyiWZTcm5bWVhYYGx2ZGp1ampfW210cW10dHRrhn1/gHx3b29sZWlxY1trcmR0do9zXFdUZGBxf35xglxhY11TWmBcY5OfZXJxhIOQdGtqeWxub3l5enGAd39yeXp6ZGZ1Z15iW2FoXF53aFdiXXBoYXhhW3t2ampyb3d0c3RpcIGUg4Z+hHZyanB8bWV2V1tqbWJwcoB6c2Vvfltgb3FiXmlvfGxrc31ycHhrcGBbZWtte2FnVGdVWFJRd1xTUFlSSGNzYmBHVmtRSE9aVWtra3xlbW9xYVtaWFlscFdST2ZXV2lTVEZaXE9JcnRYX2NtY1hhYGFejGpjZG15eGtvaXV5hntrg32AhZl8goR5fYhtj4Zxb3d6fHSCgn2Lj4OClnR4gpOGgZ+JdYF/gXR/gnCHgnVvopd0e4aLh3tmd4tvbnxwZnhxe2xzdnONa150bmFnZWtSXVtWaGJsbFtccYxkTm9uXVZYVWdpdGhjdGVlXVpudW5wdXV6a4h9gH2Id5BzY2VrbmFcbm1jc3iHa1pUVmJjd3x8cIVcY19jVFtgWWKWlWNucIOEinNqZ3luZXJ1cXpreXR0bnp+dV9mc2NbXldiZFlhdWZVX2BtY2FxXV1+b2hpc3FzcHV1a2yEk4GJe4VxcmZue29xblNaZWplcXOAdnNibHZVYnFrW15uZHxla3V8cnJyam1fWWNpanheZlRlVVZQVW5YUldUUEhlcl9hRlhqTkhXVFZtaGR8aWt3amFXXFVbdGRTUlZoUVlmVFNIWltQTnh2Wl5lbGlaYmBeXo9uYmZreXVubml2dn9+bYOAfoaXe3+HgYl+a5OIcmd0gHt1gIN+iY9/i5NyfYqRhYefhnt/hoxzgIZzfYJ1bqSMc4GNi3d4bnuNYGR8cWd5c3ltbXF2g2dkfGxjZmdoU19fVWdgbG9cXm6OaE1pbWBVVlNvZnNsZXhkZV1ZcXVtcnt4c22JfIF3nHt6bGJlbG1eYG5qZXB5fmdaVlhga3d7em+DXmJeZ1ZZYFdjnIhia3GBhnx3a2p2bFt1cGp5aXVybW57gHJYam5eWV1WYmRYZXFjVF5iaWJibVpgfmtma3N1bm13dmtohYx/iXqHbXFmb3tscWxiWF9oaG9zgHNzXmltU2VwZFVibmF5Ym91e3Vqb2xqX1hgZmh1XWVWYlZTT1lmU09dT09IZW9dY0daaU1JX0tYbWRfeGhufWRgVV5UXXRbVFJfZk5dYlRTSlxaUVp1dVxeZW1oWGJhW16OcWNnandxc21ndnN5g3OBg3uIjX58ioiOeW6QinRsc4Fzf3+IhYeShJWPen2Mj4iRm4SAfIyEcn+Bc3R3cW6Tk5OTk5OTk5OTkpKSkpKSkpKSkpKSk5OTkpKSkpKSkpKSkpKSkZGRkJCPj4+Pj4+Ojo6Pj46OjY2Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2NjYyMjI2NjY2Njo6Ojo6OjY6OjY2Ojo6Oj4+Pjo2NjY2Oj4+Pj4+PjoKAfnp6fX5+fX1/fn59fn5+fn5+fn+Af4CAgIGAgIB/gIGBgYOHjI6Ojo6NjY2NjY2NjY2NjZKSkpOTkpKSkpKSkpKSkpGRkZGSkpKSkpKSkpKSkpKSkpKSkpGRkZCQkI+Pjo6Ojo6NjY6Ojo2NjY2Njo6Njo6OjY2NjY2Njo6Ojo6Ojo6NjYyMjY2MjIyNjY2Njo6Ojo6NjY2NjY2Njo6Ojo6OjY2NjY2Ojo6Ojo+Ogn99ent8fX59fX5+fn5+fn5+fn5+f4B/gICAgICAgH+BgYCBg4aMjY6NjY2NjY2NjIyMjIyMkpGRkZGRkZGSkpKSkpKSkZKSkpKSk5KSkpKRkZGRkZKSkpGRkZGQkJCQj4+Ojo6OjY2NjY2Njo6Ojo6NjY2NjY2NjY6Ojo2Ojo6Pj4+Pjo6NjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Njo6Ojo2NjY2NjY2NjY6Ojo6Cf3x6fHx9fn19fn19fX59fn5+fn5+gH9/gICBgYGAf4CAgICDhouOjo2NjY2NjIyMjIyMjIySkZCQkJCQkJKSkpKSkZGSkpKSkpKSkpGRkZGRkZGRkJCQkJGRkZCQkJCPj46Pjo6Ojo6Ojo6Ojo6NjY2NjY2NjY2Njo6Ojo6Ojo6Ojo6Ojo2MjIyMjIyMjIyMjY2NjY2NjY2NjY2NjY2Njo6NjY2MjIyNjY2Njo6OjoN/fHp8e31+fH1+fXx9fn59fn5+fn5/f3+BgYGAgICAgYCAgIOGi42NjY2NjIyMjIyMjIyMjJTO2tjY2NjamoGEhISEiF0tMDAwMC1GoaGhoaGhoJqZmpqampqKg4SEhIOEd2VnZmZmaFxDREREREJLkpqZmZmZnFtBREREREU5LzAwMDAsSIWDg4ODg4OLjIyMjIyMjY2NjYyMjY2NjY2NjY2NjIyMjIyNjY2NjY2OhX19e3t6fX58fH59fX1+fX1+fn5+fn9/f4GBgYCAgICBgICAgoWKjI2MjIyMjIyMjIyMjIyMlNvp5+fn5+qcfoKCgoKGUxgdHR0dGTekpKSkpKSjnJycnJycnImBgoKBgYJyXV9fX19hUjQ1NTU1Mz+TnpycnJyfUjE1NTU1NyccHR0dHRg6g4GBgYGAgYqLi4yMjIyMjIyMjIyMjIyMjY2NjY2MjIyMjIyMjY2NjY2GfH16enp8fXt8fn19fX59fX5+fn5/f3+AgYCBgYGAgIGBgYGChYqNjYyMjIyMjIyMjIuLi4uSl5iYmJiZmZKPkJCQkJCMh4eHh4eHiZOTkpKSkpKRkZGRkZGRj46Ojo2NjYuJiYmJiYmIhYaFhYWFho2Ojo6Ojo6IhoaGhYWFhIODg4KCgoSKioqKioqKi4uLi4uLi4uLjIyLi4yMjIyMjI2NjIyMjIyMjIyMjY2Njoh8f3l7ent8e319fX18fX19fX5+fn9/f4CBgYGBgYGAgYCAgYKFioyMjIyMjIyMjIuLi4uLi5GQj5CQkIuOkZGJh46KkJKTkYuRjY2Ph4+RkZGRkJCQkJCPj4+Pj4+Ojo6Njo6Ojo2Njo2Njo6Ojo6NjIyMjY2NjY6Ojo6Ojo6Ojo6NjY2NjIuLi4uLiouLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyNjY2NiX59eHh5fH18fX19fHx9fX59fn5+f3+AgICBgYGBgYCBgIGCgoSKjIyMjIyMjIyLi4uLi4qLkJCRkZGPhI6QkIaKj4WNkJCOhY2Hh4yGiZCQkJCQkJCQkI+Pj4+Ojo6NjY2NjYyMjIyMjIyMjIyMjIyMjIyMjI2NjIyMjIyMjIyMi4uLi4uLi4uLi4qKiouLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjI2Lfnx3dnh7fXx7fX18fH19fn5+fn5/f4CAgIGBgYGBgIGAgIGChIqMjIyMjIuLi4uLioqKioqQkJCQkIqFjoiOhoaPiY2QkJCIjIaFjoaLj4+Pj4+Qj5CPj4+Ojo6OjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLi4uLi4qKioqKi4qKi4qKi4uKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIt+e3d2eHt8fHx9fX19fX1+fn5/fn9/f3+AgIGAgYGAgYCBgYGEiYyMi4uLi4uLioqKioqKipCQkJCPhYOMjpCOiYyKjpCQkIiLh4eMiIiPj4+Pj4+Pj4+Pjo6OjY2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKioqKioqLi4uKioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMin18dnZ4fHx7fH19fX19fn5+fn5+fn9/f4CAgYCBgYGBgIGAgYSJi4yLi4uLi4qKiomJiYmJkJCQkJCMhoyJjoeFjYmOi4yQiIyGhoiFiY+Pjo+Pj4+Pjo6OjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKioqKioqKioqKi4uLioqKioqKioqLi4uLi4uLjIyMjIyMi4uMjIyKf353eHp7enp8fHx7fX1+fn5+fn9+fn9/gICAgICBgICAgYCBhIqMi4uLioqKioqJiYmJiYmPj4+Pj5CMjouPjIqPjI6MjY+MjoqKjIqOj46Ojo6Ojo6Ojo6NjYyMjIyLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLjIiAfXh5enl6e318e3t9fn5+fn5/f35+f39/gICBgICAgIGBgIGEiouLioqKioqJiYmJiYmIiI+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Ojo+Oj46Ojo6Ojo6Ojo2NjYyMjIyLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLioqKi4uLh4B8eHp6eXt8fHt8fH1+fn5+fn9/fn9/f39/gIB/gYGAgIB/gYSJi4qKioqJiYmJiYmJiIiIj4+Pj4+Pj4+Pj46Pj4+Oj4+Ojo6Ojo6Ojo6OjY2NjY2NjY2MjIyMjIuLi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKiYmKioqKioqKioqKioqKioqKioqKi4uHgHt5eXh6fHx6e3t9fX5+fn5+f39+f39/f39/f3+BgYCAgH+BhIiLiomJiYmJiYmJiIiIiIiOjo6Ojo6Pj46MjI+Sj5COjo6Ojo6NjY2NjY2NjY2NjIyMjIyMjIuLi4uLioqKioqLi4uLi4uLi4uLi4uMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKiomKiomJiYqKioqKioqJiYmJioqKioqKioqKioqKioqKioqKi4aBe3h5eHp8ent7fH19fn5+fn5/f35/f39+fn9/f4CAgYCAgIGEiIqJiYmJiYmJiIiIiIeHh46Ojo6Ojo6Ojo+MkJOQkI+Ojo6NjY2NjY2NjYyMjIyMjIyMjIuLi4uLi4qKioqKioqKi4uLi4uLi4uLi4uLi4uMjIyLi4uLi4uLioqKioqKioqKiYmJiYmJiYmJiYmKioqKiomJiYmJiYmJiYqKioqKiomJioqKioqKhYB6eHl5fHt6ent8fH1+fn1+fn9/fX9/f35/f39/gICBgICAgYSIiomJiYiIiIiIiIeHh4eHjY2Ojo6Ojo6Pj4+PjoyNkI2NjY2NjY2MjIyMjIyMjIyMi4uLi4uLioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYmJiYmJiYmKioqJiYmJiYmJiYmJiYmKioqJiYmJiYmJioqFf3l6eXh7e3p7fHx7fn5+fX5+f39+f35/fn+Af3+AgICBgYCChIeKiYmIiIiIh4eHh4eHh4eNjY2Njo6Oi42Nj5WPiYyPjYyNjYyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYR+eXt5ent7ent9fHt+fn59fn1+f35/fn9+f3+AgICAf4CAgICEh4mIiIiHh4eHh4eHh4aGhoyNjY2NjY+MjImKj42IjJGPjY2NjIyMjIyMjIyLi4uLi4uKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uKioqJiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJg355e3p8e3p7fX17fH9+fn5+fX5/fn9+f3+Af4CAgH+AgH9/f4OGiIiHh4eHh4aGhoaGhoaGjIyMjIyLiYyKiIeJhoyOjJCMjZGOjIyMi4uLi4uLi4uLi4qKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiImJiYmJiYmJiYmJiYmJiYmJiYmIiImJiYmJiYmJiYmJiYiIiIiIiYmCf3h7e3t6enx9fHx9f39+fn19fn9/f39/f4F/gIB/gICAgICAg4aIh4eHhoaGhoaGhoaGhoWMjIyMi4yOjoyKioeEiIuKjIuNjo+Li4uLi4uLi4uLi4uLioqKiomJiYmKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiomJiYmJiYiIiIiIiIiIiImJiYmJiYmJiYmJiIiIiIiIiYmIiIiIiIiIiIiIiIiIiIJ/eHp7enp6e3x8fX1+f35+fX1+f39/fn+AgICAf3+Af4CAgYCDhYiHh4aGhoaGhoaFhYWFhYyMjI2NjJCSjI2Ii4mJi4uLi4mLjIqMi4uLi4uLioqLi4qKiomJiYmJiYmJiYqKioqKioqKioqKioqKioqKioqKioqKiYqJioqJiYmJiYmIiIiIiIiIiIiIiImJiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIiIiIiIiIiHgXx4e3x5enp8fHx9fX9/fn59fX9/f39+fn+Af4B/f3+Af4CAgIKEh4eGhoaGhYWFhYWFhYWFjIyNkY+PjZGJjIaJjIuIiImMiYeNjo+NioqKioqKioqKiomJiYmJiYmJiYmJioqKioqKioqKioqKioqJioqKioqKiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4WAenl9e3t7enx8fHx9f39+fn19f39/f35+f4B/gH9/f4B/gH+AgoSHhoaGhYWFhYWFhYWFhISLi46PjoyLj4iHiYmMjYWFjo2KiYyNi46KioqKiomJiYmJiYmJiYmJiYmJiYmJiYmKioqKioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHhoaHh4eHhH55eX16enp7fXt8fX5+f35+fX5/f39/fX5/f3+Af39/f39/f4CChIaFhoWFhYWFhYWFhISEhIuLjI6MjI2Lh4mIiomGgoiNjoiKi5GTj4uJiYmJiYmJiYmJiYmIiYmJiYmJiYmJiYmKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIeHh4eHh4eIiIiIiIiIiIiIh4eHh4eHhoaGh4aGhoaGhoaGh4eDfXp5e3p5enx8e31+fn5/fn59fn9/fn9+fn+AgICAf35/f39/gIKEhoWFhYWFhYWEhISEhISEioqOjYmIiIqKh4iHiomIioiIh4qGi5GPiomJiYmJiYiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHh4iIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGh4J8eXl6eXp7e3t7fX5+fn5+fn59gH9/f39/f4CAgH9/fn9/gICAgoSGhYWFhISEhISEhISEhISKi5CPiYmJi4qHh4WHiYuKiYSLjYmOjYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiIiIiImJiYmJiYiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGgXt4enp4e3x7e3x+fn9+fn5+fX1/f39/f3+Af4B/f39/f3+Af4CChIaFhYSEhISEhISEhISEhI+Qj4+IiYuIhoeIiYuLjIuJioqNio6Oj4iJiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoaAe3h5eXh4enp8fX1+f35+fn59fn9/f39/gIB/gICAf39/gIB/gYKDhoiGiIaDhISEhIODg4ODkpKOioeKi4qLh4uNiYqJi4iHiouIio+SioiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhn96eXh4eHl5eXx9fn5/fn5/fn1+f35/f3+Af39/f4CAgH+AgH+BgoOHjo+PjoiHhIWFhoaFhYWSkI6KiYmIiImKioiIh4aKjIiHiYmOkJGNh4iIiIiIiIiIiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4aGh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWGf3l4d3d3eXp5e3x9fn9+f35+fn5+f35+fn+Af4CAgICAf3+Af4GBg4eOjo6Ojo6Mjo2OjY2MjZCQjomHhoiJiYeIiouIiYyJiYaKjY6PkYuIiIiIiIeHh4eIiIiIiIiHh4eHh4iIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhYZ+eXd5d3d6eXl8e31/fn5/fn5+fn5+fn9+f4B/fn+Af39/f39+gIGEiI6Ojo6Ojo6Ojo6Ojo2NkJGOi42JjIiIiYaHiYaIioiHi4yLjpCQiIeIiYmJiIeHh4iIiYmIh4eHh4iIiYiIiIiIh4iIiIiHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhoaFhYaGhoWGhYSEhIWFhoaFhIWFhX55d3l2eHl4e3x7fn5+fn5+fn5+fn5+f39+f39+f39/f35/f3+AgYOGjY2Ojo6OjY6NjY6OjY2Qj42Ni46KhoiKhISLiYeDhYSDi4mLj42JjI6QkI+NjYyLjY6Pj42NjI2Nj4+Pjo6MjYyMjY2KiYiHiImHh4aHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoeHiYqKiIeJi4yNjo2LiImLi42OjYyJiImMgHl3d3Z6eXh7e3t+fn5+fn5+fn5+fn5/f39+fn5/f4B/f4B/f4CBg4aMjY2NjY2NjY2Qj4+Pj46NjI6KiYuMjIeFiY2Lh4aIh4aHh4uNjo6Pj4+Pjo+Pj4+Pj4+Pj4+Pj4+Ojo+Pj4+Pj4+Pj4+Oj46Oj46Mi4uJh4eHh4aIhoaGhoaGhoaGhoeLiYeHiIiLjY2Mi4yLjY2Ojo+Ojo6Pj46Ojo6Ojo6Ojo6Njo6NjY2AeHZ4eHp4enx6fH5+fn5+fn5+fn5+f39/fn59fn9/f39/gH9/gIGDhoyMjIyMjY+QkpOTk5KSjYyMjIqHioyKh4eJiYWCiouIiYWJjpCNjo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjI2NjI2LiYaHh4eHiYqLjY6NjYyNjY6OjY2OjY2NjY2NjY2NjY2NjY2OjIyNj4+OjY2MjIyLi313dXd5enp7e3p+fn5+fn5+f35+fn5/f39+fn1+f39/gICAf3+AgYOFj5KRkJGSk5OTk5OTkpKLi4uLiomMiouLiYuKhoeOjYiIjI6OjIuMjIyNj46Njo6Ojo2NjY2MjY2NjIyMjIyMjIyMjY2NjYyMjI2NjYyMjI2NjIyNjIyMi4yMi4yMjI2MjIyMjIyMjIyMjIyLi4uLi4yNjY6Sk5OSkpSRkJOVlZSTk5COjo6Oe3Z2d3h6ent7e31+fn5+fn5/fn5+fn5/f35+fn9/f39/gIB/f4CBgoSNkpKTkpOSkpOTkZKSkoqJioyJi4qJjIuKioiHiYqKi4mKjY2Mj46Nj5KUlJOUlJOTkpGSkI+Ojo2NjY2Pko+OkZGOjIuKioqLi4qKi5CPjoyMjIqKioqKioqKiouKioqKi4yLi4uMjIyKiouLi46RkpOTk5SUk5STk5SUlJOTk5KSkpKSk5F6dXZ2eHt7e3p6fX5+fn5+fn5+fn5+fX5/fn5+f39/f3+Af39/gIGChIuRkZGRkZKSkpGRkpGRiYmIiIqMiYiJiYuJhoSJhoyKh4ySkpKTk5OUlZWWlZWUk5OUlJSUlJSUlJSVlZWVlZWUlJOTkY+QkZKQjoyRlZWVk5KSjo+QjYqKi4qKi42OjY6RkpCRkpKSkpGRkpKSk5OTk5OTk5OTk5OTkpOSkpKSkpKSkpKSj3h1d3l6e3t7ent9fX19fn5/f35+fX5+fn5+f39/fn9/f4B/f3+AgYKEi5GQkJCSkpKRkZGRkZGIiIiIi4uJg4eLi4yMiIeHjYyNkpSSkpOTlJWWlpaVlZSSkpOTk5SUlJWVlZaXlpaWlpWUk5SUlJSVlJSUk5OVlZWUk5KTk5OTkJGSkZGSk5OTk5KSkpOSkpKSkpKSkpKSkpKSk5OTk5SUk5OSkpOTkpKSkpGRkZGPdnJ3enp7e3t8fX59fX1+fn9+fn9+fn5+fn6Af39/f3+Af3+Af4CBgoSKkJCRkZGRkZCQkJCQkIeHh4eIiIiFi4+KjI6Njo+OkJWUk5OTk5SUlZWVlJSVk5KSk5KTlZWVlZaWlpaWlpaWlpSTk5OTk5OUlJOSk5SVlZSTkpKSkpOTk5OTk5OTk5KSkpKSkpKSkpGSkpGRkZGRkZKTlJSUlJSTkpGRkZGRkZGRkZGRkYx0c3d6ent7e3x9fX1+fX5+f35+fn5+fn5+fn9/f39/fn9/f39/f4GDhIqQkJGRkJCQj4+Pj4+Ph4iKi4yNjYuOj42Mjo6RkpGSk5OSkpKSk5SUlJOSkpOTk5KSkZKUiIyUk5WVlZWUlZWUk5OTk5KSk5OUk5KTlJSUk5KSkpKSk5OTkpKSkpKRkZKSkpKSkpKSkpKSkZKRkZGSkpOTlJSUk5OSkZGRkZGQkJCQkZCRinN0dnp8fHp7fXx9fn59f35/f35+fn9+f31+f39+fn59f39/gH+AgYKDipCQkZGQj5CPjo+Pjo+Oj4+Pj4+Pj4+PkI2OjpCRkpKSkpKRkpKTk5OTkpGSkpGQkpGSk5B3jJOSk5STk5OTlJOSk5OTk5OTk5OSk5OTkpKSkpKSkpKSkpGRkZGSkZCRkZGRkpKRkZGRkpGRkZGRkpKSkpKSkpKSkpKRkJCQkJCQkJCQkJGGc3V2e3x8e3x9fX1+fn1/f35/fn5/gH9+fX5/fX5/fn5/f3+Af3+BgYGKkI+PkI+Pj4+Pj4+Pj4+Oj46Oj4+Pj5CQiI2PkJGRkpKSkpOTk5OTkpKSk5KSkHeJkpGTgHWOkpGRkpKSkZKSkpKSkpKTk5KRkZKTkpGRkpKSkpKRkJCQkJGRkZGQkJGSkZGRkZGSkZGRkZGRkZGSkpKSkpKSkZCRkZCPj4+Pj4+Pj4+PkX9ydHh8fHx7fHx9fX5+fn9+fn5/f3+AgH99fn5+f39+f39/f4CAf4GBgYqPj4+Pjo6Ojo+Pj46Ojo6Ojo+PkI+Pj4+GjpCQkJCRkZGRkZGRkZGQkJCQkJCSeW6Nko50doyRkJCRkZCQkJGRkZGRkZGRkJCQkZGQkJGRkZGRkI+PkJCQkJGRkJCQkJCRkJCQkJCQkZCQkJCQkJCQkZCQkJCPj4+Pjo+Pj46Ojo+Pj4+PeHJ2eXx9fHp9fH19fn5+f35+f39/f4CAf39/fn5/f35/f39/gIB/gYGAio6Ojo6NjY2Ojo6Ojo6NjY2Oj4+Pj4+PjoiQkZCPj4+QkJCQkJCQkI+PkJCQj5F/Z3iSh3V3i5CPj4+PkI+PkJCQkJCQj4+Oj4+QkI+PkJCQkJCPjo+QkJCPj4+Pj4+PkJCQkI+PkI+Qj4+PkI+PkJCQkI+OkI+Pj46OjoyMjY2NjIqDiYhzc3Z4fX58eX18fX1+fn5/fX5/fn9/f39/f4B/f39/f4CAgH+AgH+BgYCJjY2Ojo6Ojo6OjY2OjoyNjY6Ojo6Ojo2NiJCRkI6Njo6Ojo6Ojo6Pjo6Ojo6Oj4JhaYZ6aHSKj46OjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Pj46Oj4+Pj4+Pj4+Pjo+PjY2MjYyNjoyLi4mJiYiFhYSDgoKEgnR5fXp4dXJrZWltb2xmZmdncHNzd3l9fnl6e3x9fX1+fn59fn9/fn9/f39/gIB/f3+AgIGAgIB/f4CBgImNjY2NjY2MjYyMjIyMi4uLjYyMjIyMjIyGj5GRjIyMjIyMjIyMjIyMjIyMjIyOd2BrYmdkbouNjY2MjIyNjY2NjYyMjI2MiomKi4uJh4KAh4iEgXt6gH57fXx8fXlzcnJycnV1cG1ramppZ2NkYV9bXF1eWFVXWFlTS0VJSkpLTE1PT0tgdHR3eX19eHp5e3x8fX5+fn1+f39+f35/f4CAgH+AgICBgYCAgICAgIGAf4OEhYSFiIuLjYyMjIuLi4yGiYqKioqKh4OOkJGNiouLi4uMiYmKioqKiouKi4dkb25banJsgYWDhIeJiYWCg397fHl6e3pzcHFxcW1samdsbWdlZmVmZGNlZGVkZWVlZWRkZGNhYV5dXFpYWFdUUFFSU1JTTU1KSUZESEpHR0hHR0xOSWdzdXh6fXp4d3l8fHx8fn5+fn9/fn9/f39+f4CAgIB/gICBgICAgICBgYFnXmBjYWNucX17ent/fXd8fHZ4ent4eHpvcXt4eXt8e3h3e394dXd0dHZ1dXZ3cGNwcGRrcnFkaGtsbm9tamlpaGhlZWRkZF9gYWJgYF5dWVhaWltdXV9gX2BfX19gYmFeXl5eWVldXF1bV1dWUlRSU1NOUUpISUZERUhMTEhGR0lLSklNbXJ0eHp7end3eXt6e3x+fn1+f39+f35/f35+gIGAf3+AgIGAgICAgICCgWdYW1pZXFtcY1xaXF5ga3FtcHBvbm5vbmtpbmxrbG9qaWtraWpraWZmZ2dnaGhkZWltc3BydWtiY2JhYmBgXVhbW1dYV1RWUVBUU1NNSkxLTExOTk9UWFhXVVVUUlBQTU1QT05LTE1QUU9MTEpHSUlHSEhJSEhIR0ZHSEpKSEhISUlISVZwc3V5ent5dnZ5enp7fH59fX5/f35/fn5+f3+AgX9+f4B/gICAgICAgIGBbFtYVlZWWVlaWVlYVVZoamxubmxra2poaGloZGVkYlxiZl9fYWNfXF9dYF1eWl1gYWNsbm9va1pZX1tYV1NOTUtLS0tMSUtNTktKS0tMSktQTEtLRkdHSUlGR0lISUZFSEdGRkVERUVEREVJSUlHSEdIRkZLTUtJSUlIR0hLTU1LTExMVXFzdnl6e3h2d3h3ent8fn1+fn9/f39+f3+AgIGAfn5/f4CAf4CAgIB/gYJoUlRVVlNVV1lZWVdXV1tbYWNfXlxbWFZWWVZSVFJRUVVUU1NUUE1KTU5QUk9OUF5pZmxua2djUVBTUFBOTk9NSk1MS0xKSktLRklJSkxJR0pISUlFR0dGRkVFSElKR0ZHRkZHR0hKR0dISEpMSkpLSUlISktLSkhKS0pISUtMTU9QUEtUdHN1eHp6eHZ2d3d6enx+fX5+fn5/f35+fn+AgYB/f3+AgYB/gICAgH+AgmlQUlRXVVRWWVdYWFpbVFRTUlBRU1FRUU9OTlBQUU9MTlBPTk5NTEtNTk5PTExVZG1mam1raWZcU09PUFFPTk5PTk9QTk1NS0lISEpJSUlJR0ZHR0dJSkhJSEhJSEhHSEdISElISUxLSklISkpJSkpIR0pMS0pJSUhKSktMTk1NTU9RTFVzcnN3enl3dnR2eHp7fX19fn5+fn9+fn5+gICBgICAf4GBgH+AgICAgICBbE9PTlRZVVVdW1lXV1hOTUpKSUZKT0xKSkdJSk1NS0pMTUpHSUlJSktLR0lPVWBobmhrbGtpamhkX1dPTk9NTk9MTk5OUFBPTE1MTk1MTEpJSEdJSElISElJS0xLS0pJS0pJSklJSUlJR0dKSUdJSUpKTk1OTEhJSklJSk1PT01MT1JOWXBwcnd4d3d0c3R3enx+fX5+fn5+fn5+fn9/gICAgICAgYCAf39/gICAgIFvS0pNTlFOTlVXVlZSU0lFQ0VFUkREQT5CP0RAQD5CREFAQURHRkVIRURSXWJmaGpubHNvamlqbGtpZVVKSklKSUlLSkxQTk1MTU1MTU1NTElIREZGR0ZGRklKSUlLSkhMSklKSkpJSEhKS0tIRkdJSklLTU5OSktPTUxLTU1PUE5QT1BgcG9yd3h2dHJzdXd6fX19fn5+fn9+fn1/gICAgICAf4CAgIB/f3+AgICAgXNQUE5OUE1KS1BSUE5RQ0RCQUZRRT1DPT9FSDk6Oz0/PTxBRkA+Ojs+Pj5LVlxpbWxueXNqamxmW1FKRERFRUZFR0dHR0pHSEpLR0NER0pHQ0RFQUFDR0hHSEdISktKSElMS0lISktLTU5MTUxMSkpMS0lLTU9PUFNRT1BQTk9QUlFNUGdwb3N2dXRycXR4eX19fX1+fn5+f4B+foCAgH9/gIB/f4CAgH+Af4B/gICCdlRVUVFQT0xNUFBOT09BQkFAQkE/Oz48Pj8/Ozg5ODs7OkA6Oz48Ozs7O0dKPUZZa253cGtpWUdEQkVFREdJSEM/QEBAQUFCQUE/Pjw9PkFAQD8+P0BFR0dHSUtMTk1OTUxNTUpLTVBVU05MTlFOTk1OTE1NTk9OTk1LS05OTk1OTkxUbnBwcnR0c3Fydnl5fX19fn1+fn5/gH5+gICAgICAgH9/gICAgH9/gH+BgIJ4UVFSVFJTUVNTUVFST0BAPT4/PD8+QEE/PT45Ozo7Ozk5Ojg4Ozw5Nzk7Oz49OjtGW25tYElBPkFAQ0ZEQ0NDPzs+PkBDQ0E/Pj9BPkBAQj9APD9CQEFDRUVFSktQT1BPTU1OTExMT1JRUFJOTExPTUtOT0xMTEtMS0tKS0tKTU1LS1xxcXF0c3VycXR4eHp9fn1+fn5+f39/fn5/gIGAgH+Af4CAgICAf4CAf4CAgXxSTU9RUFFSUlRSU1NOPDs8Ozs7P0BBQkA9PDk8PTw6Nzk6Ojk3OTo6Nzg6OTo7Ojc4VmQ/ODg8PD1AQUA9Ozs+PD09QEJDQT9BQkE9Pj09Oz0/Q0RCQD9BREJFR0pKSkpKTE1MTExNTExOVVNLTE1USVBKSU1KSUpLS0pJSEdKS0lKZnJxc3RzdXJydnl5e31+fn5+fX9+f39/f36AgICAf4CAgICAgIF/gIF/gYCBgFZMTlBQTlJRUFBRUU44PT88PDo9PkFAQT8+PkA/Pj48PT0/QD09PT9DOz09Pj09PTtFWTk7PD49Pj9AQUA+P0E/QEBBQEBAPT8/PTw6Oz09PD9AQUJCQUBCREZGRkdGR0dISUtMTExLTEtKS0lKSk1MTEpMS0lISUxMSklJSElLR01tcHF1dXR1c3V4eXl8fX5+fn5+fn5/gH9+gIB/f39/gH+AgYCAgYCBgICBgYCCYUtPT05OT1BPT1BQTzo8Pjw9Oz8+PkFBPz0/Q0NEQT89PkBBP0A7XW5APkRFPz9BPERbPT09Ozs9PkFBPz5AQD9BPz89PD48PTs7PD0+QUA/QD5AQ0NEQkRFSEVFR0hISEdGSUpJSUlJSUhKSkpKTEtKSklJSEhKSktMS0lLSkpIVnBwcXNzdHR1eXp7e3x+f35+fn5+f39/f39/f3+Af4CAgICAf4GBgICAgIGBgIJtTFBRTk9QTk5PUFBPPjw8PT4/P0A+QEA/Pz9CRkQ+PDw9QD04Ojttd0g4Ozo9PUE8SWA8PD08ODo7Pz49PD07PEA9PTw8Pjs9PD0+QUBCQUBAP0JEQ0RFRkZGQ0VHSElJSEhJS0tMTUpKSUpNTUpLSktJSEhISEpJSktKSk5MSUlfcHBycnJ0dXZ6e319fH5+fn5+fn5/f35/f36AgIB/gICAgICAgYGAgICAgIGAgnZNTk5NTk5MTE5QT0w+QTw8PT8+QkM/PkFBQUJBQFlSPD09SU1GRnZ3TTc4ODo7Pj5VZ0A7PDw6Ojs+Pz89PDg6Pjw9Pj89Oz4/QEJDQkJDQ0FCQkFCQkRCQkRCRENGSUdGRkhJSUtNSklKSktMSkpJSkVESUlGRkhISUpKTEpGRmdwb3FxdHZ2d3t8fH18fn59fX1+fn9/foB+fn+AgH+AgICAgICBgYCAgICAgICBek5JS0tMTExFSUxOTTw/PDw9PkBAQUE7QkNCQ0BDc3lJO11/g395fHdWPD0/PT0+RWl0Szo9Pj89PT5BQ0A8OTtBPz4+QT07P0JAQkNCQENDQUNBPT0+QD0/QUFBQENFRUBAQ0JDR0dFRENGRUZGR0VEQEFHR0ZDRkRHSEpHQz5IbG9wcHF0dXZ5fHx9fHx+fn1+fn5+fn5+f36Af3+AgICAgICAgIGAf4CAf4CBgIF+UUhLTU1NS0pLTE9RQD8+PkFBQEBBR0FCRENFQEhyeWtigoSDg4OAfV0+QENAQT1Jc3xZOj1BRUFCQkZIQz08QEREQUA/Pj1AQT4+Pj88PkBER0VAPkBBP0BDRkVDQkNDQEJEREJERUFCPkFCQkFCQEA9QUJDRENDQUNFR0E/PVZwcHFwcnV1d3p8e3t7fX9+fX19fX1+fX5+fn9/foB/f4CAgICAgYCAgIB/gIGAgX5SSEtNTUxLS05OUlVEQkBDQ0FBQkBCQ0BAQUFARm90fYKCgYN/fYR1TEFDRUA/Pll8gF0/Q0VJSklJTU1LRUNGR0dFR0VFRUREQ0E/QD4+QkZKSkdFRUdGRkpOTktKSUdHSEtMSUdHQ0REREVEQUJCQ0BDREVEREVERUZDQkFEZW9wcXF0dnV4e3x6fHx+f319fX19fn59f4B/f39/f39+gIGBf4CBgICAgH+AgICAfVJJSUpKSEpKTE9SU0dGRUdIREdIREA+PDs+QEVFaHN9gXx/hH55hXFCREVEQ1d1hoeHflhHSEpNTE5PT0xIR0hHSElJSEhHR0hIRUNFRUVFRkhKSkZFR0lKTU9PTU1LSktKTU5LSUhHSEhIR0ZFRkZGREZIR0VFSEhGSEdIRlFubnBxcnZ2eXt7e3p9fX5+fX19fX1+fn1/f39/fn5/gH+BgYGAgICAgICAf4GBgIB8UEhHSElGR0lKTU5OSkxJSUpLTE5KRkNBQkNGSkdge4B/d3+EhYOEimxBQVZ0h4mHh4eIg1dITE1MTU5MSUdHR0dER0dHR0ZIRkhFQ0RERkVEREhIQ0NDRklKS0xMTExMTElKS0pKSUlJSEpISEdISUhHR0hGRkZISklJSUlIXW9vcXJzdnd6e3t6e319fn59fX19fX5+fYB/f39+fn+BgIGAgYCAgICAgIB/gYCAgHxNR0ZIRkVGR0dKS0pMTUxLTU5NT0tJSEhKS0tMTE5bfIKCg4OFhoaIg1ZshIeGhoaHiIiHfFBLTEtIR0ZGREVDQ0BBQ0NDQ0ZGRUJAPj5AQUFAQkQ/Pj9ERkhERUdJSklKSEhIR0lJSkpJSEZKSkpKSUpJSkpKRklMTEtKS0tmb3BzcnR2eHl7e3t8fH1+fn19fX19fn59f39/f35/f4CAgICAgYCAgIGAgICAgICAfU9GRkdGR0hHRUZHR01NTUtMS0lHQ0NDRElLS0xMSlWBg4SEgoKFhoaEgoaFhISGhoaHh4aKdUlJRkI/P0A/Pz88PDw+Ozo8QUFAPjw5OTg8PD07Pjs5Oz9BQkBBQ0NCQEFCRERCQ0ZISUhISExNTEdJSk1NTk1KSktLSkxNU2xwcXRzc3d5e3t7fH19fn9+fX19fX1+fn5/foB/fn9/gICBgIGBgICAgYCAgIB/f39+UUZFRkdJSUdEQ0VGTk1MSklIRT85Oj5ARUhISkpJZYWEhIR/gYKDgoODhIWFhoiIiIiIiYyOZkJCPTg4Ojo5ODc4ODk2NDc5Ozw6ODU2Nzc4OTc4NzY4ODs7Oz1AOzk5OT08Pjs7PUFDRUhKTUxMR0lIT1JRUFBOTE1NT1Fdb3BydHN1eHp7e3x8fn5+f359fX59fX5+f39/gH9/f4CAgICAgYCAgICAgICAgIB/f39RR0ZHSEpIRkVGR0hMTEpJSUdDQjU2OjxDQENHSUlqhoSEgX6Bg4ODgoOEhomKjIyLiomKi4yJVDo4NjU2NzY2NjQ1NzczNTY4Ojg3NjU2NTY3Njc3ODo2Nzg4OTs3NTc4OTc5ODc2OjxAR0ZJRklGRUZPU1JTU1JPUFBSVGVwcXN0dHd5e3t7fH1+fn5/fn19fX19f39/f3+Afn+AgICAgICBgICAgICAgICAgH9/flJISEhJS0lHSUpJSkpLREVIRUJANTc4OD06PUVDQmaFg4GAgoODg4ODhYmLiomJioqKiouJiouBRzY3NjQ2ODg3NDU3ODU2NzY5OTc2Njc2NTo5Ojs6Ozg5ODk4Nzc3OTo5ODg3ODY4OTtBPT4+QkE/QUtMT1FQUU9PT1JXa3FydHR1d3p7e3t9fX5/fn9+fX19fX5/f4B+fn9/f4CAgH9/gICAgICAgH+AgICAf39+VEhHSUlMTUtKS0tMSUg/QEFAPDo1Nzk4OTc7Qjo9cYSAgYOEhISEhIaJioqIh4iIiIqKjIqJiYx6Pjk4ODs8PT45Ojo8OTo7OTo7Ojk5Ozo5PT09Pjs7PD06PTs5Ozs8Ozw8OTo8ODo6Ozo5OTk8Pzw9QUJESUpNS0lLTFdvcnN1c3Z4e3t8fHt9f39+f359fX19fn9/f35/f39/f3+Bf4CAgICAgICAf4CAgH+Af35URkVGSUxOTkxKSk1CPzo7PDs4OTk4OTo6Ojs/Pkh+hIKChIWFhYaIiYiHhoaGiImIiYuMi4mKioxsPDs+QkNFRUFBQEI+QEJAQD89PT5APz4/QD9APT0/Qj9BQT9BPz1AQEA+P0E9Pjw7Ojs5OTs/PTs8PT1BQUNBQkNBWHBxdHR0dnp7e3x9e31/fn9/fn19fX5+f35+fn9+f4B/f4CAgIB/gIGAf39/gICAf39/flJFQ0FHSk5PTElHSzo4Ojs5Ojo8PTo7Oz09P0BCUoKCgoSFhIWEhomJiIiGhoaHiImKi4uKioqLiotePkRHSUtKSUZHR0RGSEdFQ0BAQ0VDQkBCQ0I/QERIRUNFREVFQUZFRkRFRkRAQj88QD49P0A+Pz4/Pj8+Pjo7PTxgcXJ0dHV3enp7fX19fn5+f39+fX19fX5/fn5+fn5/gH9/gICAgICAgICAf4CAgIB/f4B+UERAPUNIT01HRkJEOTc6Pjo8Oz4/Pz89QUBDQ0ZXhIKDhIWFhoaHiYmIh4aGhoeJiYqLjI2MjIuKiohWSE1MTUtOSklLSUlKSklFQ0RGR0ZEQ0VGREJISUtIR0dGR0dFS0lLSUpLSkNGQ0NEQkFBQ0JEQ0NERENBPTs9QGhwc3R0dnd6eHt8fH19fn5/f359fX1+fn9+fn59fn+Af3+AgH9/f4CAgICAgICAgH+AgH9PQT49P0RMS0BCQkE5ODw+Ozw7PkA/QT5CQkdHSlmEgoOFhYaHiImJiIiHhoaGiIiIiYqMjYyMi4uKjH9QTlBOTE5LSkxKSUlISkZERkhISUVFSEZGRUxMTUlKR0dISUpOTU5MTE5LSEZHR0VFQ0ZGRkZERUhIRkNBP0BMbHB0dXZ4eXl5fHx8fX1+fn9+fn19fX1/f35+fn5+f39/f39/f3+AgICAgIB/gICAgICAf1FBPz4/RUdHPTxAQDg4PDs8PTo+QD4/QENGSUpRX4GDhYSFhoaHiIiIiIiIh4eIiIiJioyNjIyMjIuKjXJOUk9OTExMTEpIR0VJSURKSEdLSkhKR0dHS0xOTExISElKTVFOT05NT0tJR0lKSElESUhIRkZHR0hHQ0JBQ1VucHV3d3l7eHl6enx8fX5+f39+fn1+fX5+fn5/f36Af4B/f3+Af4CAgICAgICAgICAf39/VERBQUJHR0I/OD9AODo8OD0+Oz1BPj9BREhKTFVxg4SEhISFhoeIiIiIiIeGiIiIiImJjIyLjIyLi4uLi19SUlBNTk1LSkdFQkdKR0xKRktOS0tKSkxNTE9QTkhJS0xPUVFQUU9PSkhKSkxKS0ZHSEdFRklGRUVCQUJCXG9yd3h5enp5eXp6e3t+fn5/fn59fX19fn9+fn9+f4CAgIB/f39/gICAgICAgICAgH9/f39VRUNFRUdHRUQ7P0E7PTw5QD4+QEJHR0FHS0xQVnmFg4ODhISGiIiIiIiIh4eIiIiIiIqLi4uMjIyMi4uNfFhWUlJUUk9MS0pERUZLT05PV1VRUE9SU1JNU1RPTVNMUFNVVlJTUVBMSk1NTUtOR0dKRkZISkRERUVCRENjcHV5eXp6ent6e3p6fH59fX9+fX19fXx9fn5/gH9/gICAf39/f3+BgYCAf39/gIB/f39/f1VGRkdHR0dIRj5AQj0/PT1CP0JDR1ZORk5QUFRYe4aDhYWEhIeIiIiIiIiIiIiIiIiJiouKioyMjIyOi4uLaFdVa2FFUlFRUEk7O1JUUmB1XVVWVFZZWVJYWFJaZlBVV1pdUlRXUU9OUlBQUFFLTEtISEpIRUZJSUlISWlydnl4eXl6e3t8ent8fXx9gH59fX19fX1+f39/f3+AgIB/f39/f4CAgIB/f3+AgH9/f35+U0hKSUhHRkZFPz9BQUVBQ0dFREVMWFJNVFVWWFt8hoWHhoWGh4iIiIiIiIiIiIiIiIiIlJyMioqMfWGKi4uHbFtkVTpYWFhTUT9AVlVZW2NgVllicl1dVl1aVkVRWVpbWV9UWWdSVlZYVFRWVE9PTUpMSklJTE1LT01Tb3N2eHl4d3p5ent6e3x9e35/fn1+fX19fn1/f39+f4CAgH9/f3+AgICAgH9/gH+Af39+fn5WSkpJSEdFRERCQT9ITUlNUEtJS1BUU1NYWlpcXHiFhIWFhYWGh4eHiIiIiIiIiIiIiImcnaCPiY5nO36LiYqLem5wWFpcW1JTUlZWVFpadINZVX2QYFxYXV5XSVZdXVtbX1lIWVhZW11YWFlXUlFNUFFNTU9TUVFVUmFzc3Z3d3Z4eHh6e3p8fX19f39+fX59fX1+fn9/gH9/gIB/f3+Af3+AgICAf39/gIB/gHh5fVlOS0lJSEZCREBBOlBRUVdYUFBPUVNUVFhYWVpbboGCg4WEhYaHh4eHh4iIiIiIiIiIiJaanJeIioFuhomIh4OKfmZZWVxZVFVUV1JRV1ViloBRZXJYWldfaFBgZltbWFxnYUdPWmhnXFtcXV1XU05TUFBRVlZWVllabnJ0d3Z2dXh4eHt7fH19fX5/fn59fn18fn9/f3+Af39/gH+AgH9/gICBgYB/gH1yfX9/b3R8XVNQT01LSkVDP0A7UFBaWltSU1FPUlJSVVNWVFdfdXiAhYSEhYaGhoaHh4eHiIiIh4eIh4ORjomJiIaFiIiGfYB7XFBVWFRSVFJRUUxPTEtmeVtdVFlVVl1aTFRaVVNUXlpYV1dXemtYW1tcXlRRUVBJTk9XVlhbWmRwcnZ2dHR2eHl5e3t8fX19fn99fX1+fX1+f39/gIB/f3+Afn56eHd2c3V7f3+AgHRrfn5rcnleW1ZVU1JPS0ZDREFNXoNsVlJTTk9RT1FVUlNSUlRjZHaAgoKDhISEhIWFhISDhoaGhoeIhn6JiYiHhoOHh4d5bXFWSUtNTktNS0hKREZIRUM+VGRVf1JQUU5LUlRRTU9ZUk1OUVNVVU1RU1JQT01MSENJSFJUVVpcbHF1dnVzc3d6ent7e317fX19fn19fX59fn9/f39/f399fX5+f39/f4B+e3Zzd31+fmR1fWlxdF9kXV1bWVZQTElMSWFsknRQUVNOUVJRUltSU1JRUlZUYnN7fH+AgYKBgX99e3uAf4OChYaHgoaGhoGEgYaFhnVfXUtDP0NDQ0NCP0RQQkNAQz1DSUdWQEhOTEddaVBIRk9GREVGSUdIQ0RIR0hLR0RCQURATlFNUmRydHZ1c3R1enx6e3t7fH19fHt+fX19fn5/f3+AgIB/f3x8fX+Af39/f4CBgH12dHt/bWh8Z25xZmllZGJcWFNRUFVSc1dlW09PTkxRU1FVWVNVUVFUUk9WYGtscnZ7e3h5dHJuc3RzeXh+foOAg4OCgIKAgoGCa01HP0A6Oz5AQD8/PmpRS2FFRkhJRUI/R0xOR01RVUlCRT8+PD08PT0/PT9BQ0NAPzw9Qj5KTUdVbnR0dXN0dnh6fHp9e3x9fX19fH59fXx+fn9/f4CAf39/enl3eHd2dnh7foB+fXt4dnx1YXhnbHBqbGpqZmBbUVJaXFleSkpQUU5LTFFSUVRVVVdRUVdWUFhbYl1hZ21tbG9rZ2BucmptbHF1e3p9e3h6fHx4d3hlQ0BAQj06QkNBQURCXF1Pe05PTk5LTE1PT1FMS0xXTUhHQEI8OTc3NTk5PTs7Ozg5ODk/PEJIP1xzdHV2dXZ4enx8fH18fH19fn58fn19fX9/f39/fn9/f314dXZ6e3p3eXh1d3t8eXh1eXdjcWhpcG1ubW1oZl5PUF5cWklIUFFRT01QUU5RUlRWWFNSWVROWVpbV1ldXl5fZWBdXnF2a15gZ2t3b29sam9ubmxmYllIRkZIQkFHSUVFRkRNUlBhV1JXUVBTU1JVW09PUVdQTUlERj46OTY1ODc5Nzk6MzY1Nzk1PEI9ZXNzdnd3eXp7fX18fHt8fX5+fnt+fn19f39/fn5+fn9/e3d1eX18enh8fHx8dHd2d3Z1d2tuaWhxbm9vb2prYFVXXlpXTUxUVFNRUVVPTFJTVFdYVFRYUUxXWVpWWFhWWFldV1hYaHNrXVZhc2thYV9eZGFfXllUUU5OTkxJSEpLSUlGQ1FQU1tXVFROUVNZU1xlVU9TVFFOS0lIQz9BOTk5ODk3ODg1NzU3ODU5OUducnR4eHl7e31+fX18e318fn5+en1+fH1/f359fn5+f358dHR1e3hycW9vbnR4cXJzeHZ1cWZkZ3JucHBxbm1kXV9fWVdPUFhWVlNUVk9PVVZYWFlTVVRMS1RWVVVVV1BUVVdUVVJdbl5STllfW1ZZO0RWWFRbZkpMT1JST01NTk5NTEpGUVBVWVNUT0pOT1VTVFxWUlVTUk9NTElISEY/Pz06ODg3NjU5OTY3Njc1V3BwdHd5ent8fX59fnx8fXx+fX15fX18fn5+fXx8fX1+fXxydnF4eHJ2dXFxbnBwb3B1dnRuamRkanBwcXJwbmZlZGNcXlJUWlZXVVRXVFJYWFlZWVJVT0lHT1BPT01SSk9QT1BOTk9UTE1JUE9TVFUyPVhNSUBRPWNhUVNRUE5QUVBOTk1RTlRSUFJNSUxKT1JQUlJTVFFST0xMS0xMSENCQT06Ojg3NjtCNTU2Njpkb3J1eHh7fHx9fnx9fH19fX18e3h8ent9fX58e3l9fH18e3B1b3d1cHV0b3N2cHFxcHR1dmNqZ2VXaHRycnFuaWlocFZWVFVYVVdVUldWVVpZWFdVUVNGRUFGR0dIRkpESEpIR0VITEhLSUZMTVBNRy9FX1I+Mz8+am9hUlJRQEdVUVBRUFFOUU9QT0xKTExPUE5OUFFRTlBPSkxNTUtHRUVEQjs9PDw5PUc2Njc3RG1wdHZ6e3t8fX18enx8fX5+fXt5dnh3eXl8fXp6dn17fHp6b3Fud3JwdnFtcHNwb3Bzc3N0ZmdgaFpXa3JzcmxtbWtuYWVQU1RSU1RPV1ZWWVlWUVFRT0A9Oz0/QUJBQ0BCRERBQEdIR0hGRkhKTUxFR0NPUkM4RU5TXWZTUVNBR1VQT1FRUE1NTk1LTEtMTk9PUU1PT01ITExJS0tMS0dGRkVEPEFBPjtARTs8ODlTcHJ1eXt7e318fHt5fHp6fn58e3V0dXJ2dnp6eHpyfHt8eXltcW94cnF1bm5xcm9vb3Rzc3J1dGtnZ15lam1wa25xbWltY0xPT01RU0xUVVRYV1VNTEtJPDk4Nzs/QD48PUBAQj0+RUhHQ0ZGSUdKSkBGQUFARkhFSk9IUFJiXFFQUk5TT09QTExPTUtNTE1PTltXS01RT0dJSENISktMSkZGRkQ/QkM+PEJHP0I/QWRwdHd7enp7fHt6end7d3l+fnt7cXN0cHJzd3R4eHN6e3l2d2xxb3ZxdHRsb3Fybm5vc3ZydHNycmtsZW5zaG1ubWxtbGprSUxISE9RSlFTUVRTT0tIREQ9OTg3OT9CPjs/QkBAPkFESUVDR0dJRklFQkI/Pj1DQkFHSURNT2JlUU1OTldLTE1LTE1NTUxLTk5TZE5KTFJJSUlFQUhKTE1OSkdJRkJBQkA/RUZFSERLbm92eXl5e3t6fHp3dHh0eHx8eXpucXJtbm9ycnZyc3h8eHZ2bXBtc3B1dGxwcHJvb29ydnVyVlZucWdseYRqbXFybm5qaG9ISkNHTE1JTVBNUE9ISkQ/QT05OTk6P0I/PEBCQkFERUhLRkNISUdHSENDP0I/P0BBPkRFQ0tOUlRMSklNVEdJSUpMSktMSUpMTU9QUlBLR0NMR0NCSkpMTU9OSUpJR0NDQ0RJSk1MSVlybXd5eHp7e3l8dnJwdXJ0eHl2eGpxb2psbG50dG10dXtzdHhyb25xb3ZzbnBvcnBvcHN0eWpOYGdzanR8eWdvc3FpcWhkcUhLREdISEdKS0lKS0RHQj0+PTo6OjtBQj89QkJDQ0hHSkxKRElJRkdHQ0M7QUBCPkBAQkVDSU1QSEhLR0hLREhJS01ISkxISUpLSk1cUkhIRE5GQURLSk1NUE1LTUpLRkdHSk1OUU5MYm1pdnZ3e3h7en1xbWxza3B0dHR1aHBtamlra3RwbnR0eXByeXRvcnFvd3NvcXB0cnBydXR5a05WbXVscXt2aW5vaWt0Z2RvRktDRkVHRUZGR0VHQkNAPTw9OTo6OkFDQD5CQ0RFSUdLSkxGSUlHRkZEQjtCQ0M+QENDQ0VHTE5IS05IREhFSUxOTUhJTEdGR0lJTE5LSUhFTklCRk1MTk1PTU5OTUtJSElPUlFSTlJmZmZxb3N4dXt6fGxoam5la3Fsc3FmbWxoaWtsdG1wdXR3cW94dG90c3J2c3BxcnRzcnR1dXZ2WFZ1dWtvdHJrb3ZsaG1lX3BHSkRGRkVDQ0NFQERCPkA/Ojs7PTo9PkNBPkFDRUZKR0pIS0hHR0dGRUNAPUVFQj5CQ0NDRUdISUdNUEpGRkdLTk9LRkhKRkVERUlKSEtJRkhQS0NJTUxQTU9OT09OSkpITVJVVFJPV2RgYW1ncHJvcnl6Z2VoaGRpbGZxbGZsbWdpa2xzbHB2dXRwbnZyb3Nyc3V0cXNzdXRzdXZ2dnl2dXR3bGp1dW1ydnFsbmxlckxHRUVHQ0JBQkQ9QkE+QT05Oj0/Oj0+QEI+QEJER0pGSkZJSEZGR0VDQkFBRkZDQkNCREVFR0dIRkxRTElPSkpMTElHSEVHRkRDSUlIS0pHS1JNQk5PTVBPT09NTk9LS0tQVVdWVVRYX15caWFtaW5ocnNiZWZlZGloZm5pZm1taGtrbXJpcXZ1c3Ftdm5vcXJzd3Nyc3R1dnZ2dnd2d3Z2dHd1anN1bnV0c3FyamtzTUdIRkhCQkBERDxBQEBDPDg5PT45Pzw/QkBAQERGSEVIRkZIR0ZGRENFQ0RJRUNGRUJFR0VGR0dFSk1LSFFNSktISElFRkhJRkNJSklLTUtPU05EUVJQUVJOUE1OUE1MTVNXVldYVlhdWl1kYGhiamlna19lZWZjZ2dna2dna21rbWxwcmh0dHVyc252b3FwcnR4cXNzdXZ1gpF5dnZ0eHV1d3htb3VvcnN1cXFpb3lNSEdISEJCQkZFPD9CQkQ8Nzo+Pjo+OkBCPj8/QkVGREZEREhGREVDREVGR0pFRUpHQ0dIRkhHRUNGSkpHTUpMS0hKTEZJSUtIRUtLTE1OT1JUT0hTVVNQU09RTU5RTk1QV1pWWllWWl1aWGFgYGBeaGVjYGRmaGdqaWhqZmhubGxubXFwaXV1eHJycHVwcHBydXZwdXN1dnV7fn14dnR3dnZ2eHBsdXBtc3RucHJyeE5JSEdJQ0FDSEU8QEVCRD05Oj4+PTw8QUI8Pz5BQkZDRUNDSEVDRUVGR0dHSUZHS0hDSUhHSUdGREhLSUdLSE1LSktMSExLTUtKTkxPTk9SVVZPS1VXU1FTUVJMT1FQT1RZWllcWllbXl5eYGNeXGFja2JgZGdocoVoZ2pmam1ucG9uc3JqdHV4cnNzdHJucHF2cnF1cnV1c355jn11dXZ2dnZ4cmh1cWtydGxxdm90TUlLSEpGQkVHRTxAR0NEQDo8PkA/Pj9CQTxAPkFBRkNFRURJRUZFR0VISEZISElLSUVKSEhLSEZGTElISEpHTExMTUxJTUtNTU1PTFBQUVVWV09LVlZVU1NRUUxPU1JRVltbXV5bXF5fX2FgYWRdZGBlZmBlaGpjc3NmamhnbHBycW9zc25zd3dxdXZ0c21vcnVvcnNwdXJ2cnSBdnV1dXd2dXd0Z3Rya3Fya3J2bnZKS0xKTEdCRURFPEBGRERDOz8/QUBAQENBP0I/QUNIQ0ZFRkhGSUZGRElIR0lISk1ISEpKSUxKRkpLSElKSkdLS01NSkpNTE5OTlBMT1BSVFhWTU5UVlRSUlFQTE5UU1JXW15eX11dYF9gYWFfYWNlYmNoYmRpamd2i2xqaWdtb3NxcHFwcHJ5dnJ1dXRzbW1zc21xcm90dXRycHN3dHV1d3Z1dXRlcXNrcHFqcnZvd0tNTEtNR0RDQUQ8P0VFRUM9QUFDQkJDREFDREFBRUdDSEdISEdKR0RHSUdISkZJTEhJSk1LTUxHS0lIS0tOUUtSUU1TTUtOTk9QUE9UT1dYWFtOU1FXXFpSV1BOVFVUVFhaX2JiX2RhXmBiXmBlYWFjaW5nYmloaG54dmxoaW1vc3JwcXJycnZ0c3Vzc3Nua3NxbXByb3R2cnFxdXZ1c3d5d3V0dWNtdGtvcGpxdG93TE5MTExHRUFARD4+REVGQ0BDQUVEREZCQ0VHQ0NJRkNJSkpJSUtHREtKR0hKSUlLSEpKTkxOTElMSEpMS1pmSmRcS2xTSE9OX25Va3NbcXBid2NTUGJ2dWh1Y2F2YFhucWJkdmluemZbbHRgbGtUX3d2aWpnaWZnbG1qbW9qbW5zcnBycnFyc3Jzc3J0cm5sdG9ucHFxdXVxcXN0dnZ1dXl3dXR0YGt0a3Bwa3FycXlMTkpKSkZDP0BCPz1ERUZEQ0RDRUVERkJGRkdERUtFRUpNTUtMTEdHTUlHSktIS0tJS0tOTE1NTExJTE1MW3NiZHBebG1VTU5mc11mZXFsbnRncGlfYVlubmJwcGJrampnb3F0ZXRub1xvdWdwTUpyeXZrYmBrZWVteGxrdm1ucHNycHJxcHFycXJycnRybW1zbm5vcHJ1dHFzc3R1dXV0d3h2dXRibXVrcHBscnJxektMSUhHRURAQkJAPkNGR0JGQ0VFRkVEQ0hIR0RFS0hHTE1OTE1NRkpOSEpLSklMSkpKS0xNTk5NTUpNTU1bcm9vbnBwbGtNUFFsV05pYnRycGFtbnVcWWxRXG1tWnFta29teHh0c2lwXF9ya3FqVXV5eHBjXmtmYmdwcGpqb3BwcnNwcXBxcXJycXFycnRsbXJtbm5vcnV0cXRydHV1dHV1enZ1dGVudWtwb2xzcnJ5SUtHSEVFRUJCQj5AQEZHQkdESUVFRUJGSUhIRUdLSkdNTU5MTU5HTE5JTEtJSk1JSklKS09QT05NS05NTFxoZHVdbHFXbE5QUW1VWmtea2x2YWxkc1NlY05tWWxcdHBraWx4and1aHBdXnJraFdiY3d8b2NgZ2dhZGl0eWtubnFzc3BxcHFwcnFwcHBydWttcW1tbW9xc3Rxc3J0dnZzd3Z6dnV0aG91bHNvbXNydHZITUdJREVEQ0FCPUJBQkZESEdMSEVDQ0hLSEhGSkxMRk5MTFNSTEdMTEhOSkhITkhKSklITk9NTkxKTk1KWnNwcG9xcW1sT1FSbllxa2dvb3Fxb210XW5YYXRfbm9wb3Fyb251c3R0altddGN3eHJqbnpoYWFjZmJiam10dXBzdXZzcXBwcW9ydHt/fn13bGtxbmxtbnByc3F0dHN1dXR4eHl4dHVrb3VtdG9udHN2c0hLSElCRUVFQUA+RERCR0NISU1JRkNGSkxJR0ZLTUxGT0pLV1JLR0tKSk5JSEpMSUtKSUhKTU1NTUlLS0tTa2JbaV5faWNyclpfWWpvX2VlVWtfY1thYVFgbGhdalxuaWlkW3BmZHBdWlxrW21xY3BzbGRnY2RnYGBrbXBwb3R5cnVxb3BxbnmFiIeHhoWAdnNua21tb25xcnR0cnR1dXZ5eHhzdW5xdW53cXJ2dHdyR0dGSURFREZBQEJGRURHQkhKTEhGREdLTElFRkpPTElQSUxbUUpFSEhLTUlISkpKS0lISUdLS0tMR0hLS0xMTExKS01OVFtcVFBUTFBPTk9PVlFPT1FOT1FKSU5QUWRxaVRZV1xbXFVZWl1YXVxcY2ZhYWViY2ZfX2ZrbWhtdHlydHJvcHB0hoeGhoaFhYaHg3pwbW1sa3FzdHRydHZ0dXl4eHV2cXJ1b3ZydHN1dXNHQ0VHRkZBRUNAQ0hERkdDSUtMSEZER0tMSERHSFBLTE9LTFdMSUVFSElKSElLSExKSEZHR0lHSElFRkxJSktOTElQXFdeUFxbYF5NWFlTXFxiXk1ZWk1YYVJKWWFaUl9kXGFYW2RkVlZYXFlaWFxWWVxdYl5kYWFfZWhrZ210dHFxdHBxcoGGhoaFhoWFhYaGhoR9cmtpb3Jzc3N0d3l5eHl4d3h0cXhyeHNxcnVydE9CQ0VMTUJEREJFSUVHR0ZLSktIRUVKSktGRUhIUEpNTUpNU0hHRUFIRkpJS0xJTEpIRkVJRkRGR0VFSkhDSk1LTFVfWWBYYGFbYFRYWVReXlpfUllcUF5cWU5eXF5TWl5jXlpdYGNgWV9iW2BeW1RYV1leXWNiY2FjZmhla3Jwb3Bwbm93hoaFhYaCe4CFhYaGhYaFf3VxcHJyc3Z5eXp5eXh4eHdyeXZ4cnF4dnR2YVNKSk1JREJCQ0dIRUhHSEtJSUlERktLS0ZGSUpOS05MSExOR0hGPkdHTElLS0pMS0lHRUlEQ0REQkZKREBKTEpPW2NZX15hX1JUUldfYFxdWV5RWVxNVl9XS1FZW1BaX2FhXV5jYWBiYmJjY2VaUVlWVVxZXWNgX19jZGJob21ubGxsbHWFf4SDeXV8hIWFhYaGhYWGhoN9d3JydHd5eXl5f359eXV5dnZybnp3dnhYUUtGQ0dFQ0VISUZHSEhGRkpHSEZIS0lMRERLSk5NTExISkpISkc/R0ZOSktLTUtLS0lHR0NEQERBSElCP0lKSFBdYVpbZF1fVFFSWF1cXFxfWktXXExSXFlJTV5RT1xfYWNjY2NiXGRjYmRjZlhRVVRSW1daYF9eXmFhX2Rsa21qamxudn51gXp8hIWFhYWFhYaGhYaFhoaGgnpyc3V1e4WHh4eGhYSBfnhwend2eFxSTUNASUZDRktKRkZGSEdGSUdGRklMSk5GREtKTE5KTElLSkhJRkJISVFNS0tPTUtLSUhHRUQ/RUNISEFBR0ZFVF1ZXlhfWV9bXVVYWFBdXVFLSlZeWF5bXVVZYFJRX19iYmBgYmJgY2JhZGRiWE9RUVFbUltdXV1dXl9fZGhnbGpubnB7e3x+e4CCg4SFhYWFhYWEhIWDhISHh4FzcneFh4eHh4eHh4eHh4WDgHx4XFNLQ0FHRkRHTVJIQ1FKRkhISEVGS0pNUEVGSUpLTkxMSUxMSUlHREhLUU9NTVBMTUtLSElDREFFREhHQkFHRURXVUVcVF5TVl9YTlRVTlpaTUpLVGBhW19YXl5hXU5ZYlxgYF9iY2JdYWJXX19UUE5PUFhSXVtbXFxeYGJmZmVsZm9vd3x7gHt9f4CEhISEhIWFhYODhYKDgoWFhnpvgYaGhoeHiIeGhoaFhYSFg35JTkZERUZHRElSYlBDVl5JR0dIREZNSlBQRUlJS0tOTEtLTEtKSkdFSk1RUU5PUE1OTE5IS0FEQUNERkRDQUVGQk1IQktMUE9OTEZNRkdJSkhHTEtNT1BJTE9QT1NPTFFTUlVaWVdZWFhkV09TVFBQTk1PVVRbWFhaXVxgYWRlY2dja2xwc3J6eX97en+EhISEhISEhIKEgH57gYOBfXuFhIaGh4eHhYWFhISEgoGAfUtJRUVHRkdES01dTEdHWExHSEpIR01MUVFJTEtMS05NVU5PS0tMR0dLUFNTTlBPTk9OT0hLRmBFRF9MRGZjRU1bSV5bcm1PTVVtWUxDUGBVa1dnSl1YVV5ETVFVTExTVlFSVFhXVFhVVFxVUGZaaGhkWFNrU1ZWVFtcW2BgYWFhYmBmaGZua2hyenx9foGEhISEg4ODgX18enJ7gXp7f4KAg4SEhYWBhIWBg4N/fnp7TEhFR0ZIRUVLT1NJSkZgU0hKT0pJT01SUUtNTExPUlVST09KTE5HSE1RW1lPUFBOT1BPSUpRf1FJfFlZcXNYUG1IcW5vYVZQcXFzUENrc21xc3BTb19bblhdVlxYVWtoVV1WY1pgWVtgVlZYf2p0dXVfX3ZfWGFbXGZbX2FhYWFeYGJnbXBsYHB3dHiBgYKDg4J/fX6Adnh6bHZ+dHh+gHx+gIGChHyAg3p/gX9+d3dOSUVITU5CRExMRklLRVFWTEtPSUtSWFdRTk9PTVFUTk9RUEtLTkdNUFNbWlRRUk9QUFBKSFp4XVR4ZWhaUlRRdmd0bHBibmZqUXJPTXdtanJwc3JxcnBvb4BdZXp1eHFxenF+c31rdX1iUmh8ZXNzb3Nye3xvfXlvf3JfYGBiYVpgYGdrbmtibGZnbXd+gYCDfnt4d4B0dnppcn5udHx+d3h7foCDeHyAdXx/fHxzc05LRmBdR0FFTU1ISkpHSlBPTU1KTlZeWVVMUVNOWFpNU1NSTktPSVFSVFlXV1FUUFBQUUtIZ3hsY3hybVtLTVV5cHVtdWJudlBkZUpmdnFtd2+AamZ4eGlXclFoem1panp6fmx4en9vaG9ZdnZqdXVwgWByZ3xpbHh8b15fX2JhW15iZGdpaWRnYmNkbGxwcHN0c3NzeXFyeGJsdWdyeXtzc3V5foFzdXpufH15eHJuTktTdE5DQ0ZQUEhKS0pLUE9PT01QWmBaWEtUV1BhXlJWUVlSTE9JU1RVWFdXUFVQT05SSktyb3V1cXVxZGliV25McXBeRmh5V3ZUTGl5fXhgeXtzbmFdbW9jUmhxdW5teXB3bHZ0dHFsbV10fnprbXl8a3RsfGtwdnV4Xl9fYl5dX2RkaWdoZmVeYWJpaWlqa25va3FubWpwYWNmZG93eG9tcHN5fm5xcGp7enRzb21MTFtWSEdFR1JQSUxNSktQUVBQUFFXXFhVTVVZVWZYUlJZXlNMTklUVFZXWVdPU05OTlFIUm1IaXdLYGR2dlZYbE9ubHtzYWpnf3ZVTFdraH1sbWx4X1twenteYHpzY3JveHFoZHxpcntdVUxsYHZ1a2l1e3ttfnhrfHBdXl5iW19iZGRnZWVlYlpjY2lra3JzcndnbGloZGdgYWthZ3NybGdtbXJ8a21oa3t0bW1rbU9ISktISUhIUlBMTk9MS1JSUk9TUldSVlRQV1tWVlRUVGFgUE5NS1RTU1FVVk5OTE1PUEpIUU5QVUxLS1NUU1JUUFZVUVFOUVFYWVJOUFVUWFhYW1pVUlNXW1dYV1pPU1VXWFhSXVlXXVZUUFlSV1dXV1hfW2dyXltbWVxdX2NaX2NjZGZkY2NiWmNjZmZlbW5tdWVlZ2NhZl9dZ2BkbGhmZ2tocHpoZ2drdWpoZ2lsUUlLS0xNS0pTUU1RUE9MVlVUUFRVWFVZVVFaXVZVVFdVWVhQT0xNVlRQTlVTTk9NTFFQS0pSUUtRTUtLT1JVUlFRU1NJSExOT1FSUVFRVFZSWFdcV1NTUFFVVVZTWlFPU1JYVlRZVlRZVVRSVVRUVVdYV11aXmFdXFpaXFxgY1tdYmNkZmRkZGFZYGFjYWJoaGluY2FkXl9jXVpkXGJtYV5mZWZtc2RpaGtrZWRjZmhQSktMT09MTVNQTlNRUU1YV1VUVVdXV1pVU1xgVldWWVVYU1FQS09XU1BOVVBOUU5LU1BNT1VTTlJOTU5RVFBUUVNUVU5LTU9RVFRSUlFWV1RZWltZU1VSVFdXV1lbVE9UVVhVVVpVV1lVUlJYVlVXW1laX11VWF5cXl1cXWFhXltiYmNnZmRkYlhfYWJeYGhlZmRhXl9dXV5aWl9aX2dgXl1dYmhrYWdmaGZkYGJjYVBLTUxQUUxPVE9PU1FPUVpZWFdYWlpYWVZcamRWWFlaV1ZTVE9KTlZUUE9UUFBQTk1RUVBSWFRRUU9NT1NWTldSVFVVT05NUVNVVVRUUlRXVlpdXFpWV1FSV1hWW1tXUVRWVlZWWVRYWFVSUlhWVlpdWV1fXlZeXV5gXFxgX19fWmJiZGhnZGRiWWJgYV5eZmNjYGJdXFxcXFlaW1hbYVteXVxfYl9fYmRlYmRfX2BcUE1OTlJRTVJST1NUUVBVXFpaV1tbXFlaW2RxbWhkXltZVlVXUUxNVlNNTlJPUVJPTFBTUlVbVVNQUExQV1dSV1NTU1hNT1BSVFhWVVVTVVlYW15dW1tWUk9VVlZbW1dSVFdWV1hWVFhbVFNSWldXXF5aXl9gVWFcYWFeYGJfXWBdY2BjZ2hkZmBaY2BhX19lZF9gY1taXFtcWVpYWVdcWVxbYF5fW15eYWBeYlxZYFpRTk9OVlFQVFJPVVRTUFdcXVxYXlxfV1xeanF3eYBiXFtWVlhRTU9WU05RUVBSVFJLUVRUWVtXVU9STlNYV1RTVVJSWk9QU1NWW1ZWV1RWWlhdXltbXlZTTlRVVlxcVlJUVlZYWVNUWVxVU1NdWFpdXlxgYGBWYltjYl5hY19cYmFiX2NmaWRmXltkYGFgYWNkX2JfWVpeW1xbWVhZV1daWlphXF1bXVxcWl1gV1tbWlBPT09ZUFVVUlFXUlRQW15fXltgXGBVXF1panJ9c2xnXFVYV1BPUlpTUlFTUlRVVEtRV1ZbWlpTT1NSVlZWVE9XUlNaUlRUVFhdV1hYU1hcWF5dWVpdVFVOVldXXltYUlVVWVlZVVdZXFVTVl5ZXV1gXWJiXllfW2ViX2RkXl5jY2FeZWZpZGZeXmRhYGFhYmRgYl5YWl9bXFtYWFhYV1taXGBcW1tcW1haW15WXlldUE9PUlpQWlRVVlZUVFReXmBfXmJcYFVdXmJreXRsfWxaVVlVUVBTXFRVVFVUVllXTFJaV11bXVJPVVNYV1ZUUFhSU1dTVlVVW11YW1lVWl5YX15ZXFlSV1JZWFlfWlpUVVZaWVpXWFpcVlRaXlxeYGFfZGNcXl1dZWFhZmReXmRjYFxnZGhlZGJfZGFfYWBiYl9gXldYXlpcXFpZWVdWXVpdXlpZW1xbV1lcXVZYV11TT1BXWVFdVVZZV1dVWF9fYWFgY11gVF1fYmVldYF6aFhZWVNWU1ZcWFdXVlZXXVhPVV1aXl1dVFJXU1dWVVNUWFJTVlRYWFhdXlhdW1ZdX1hfX1hdVlFZVFlaWmFZXFZXWFtaW1lZWltYVl1fX15jYmFkZFxiXGBmYWRmZF9gZGJiW2ZjaGVjZmFmX19hYWFhYF9eVlVdWVtcW1lbWVldW1tbWFhZW1laWl1fXVRZXVVOVFpWU1xUVldZVlZcYGFiY2FjX19WW2BkYV96dW9oWVxaVVhUV1taWVxaWFlgV1BWXlxgYVxUVFhQVVdWVFZXUlNVV1paXF9eWl9cVl9fWl1eWV5WU1lXWVpdYlpeVldbXFtcW1taW1laX19gYGRiY2RlYmRaYmZjZ2ZlXmFiYGNeYmNpZGNnX2deYmJjYWFgXl9YVFtaWltbWFtYWFxbWltXV1lYV1xbXGBdVl1dU1BWWlZWWlVYVVhXWF1fYmFkYWRgXllZYWRiYGxmaF5cXVtWV1hZXFxcX1tZW2JWVFheXWFjXFJWWVBXVldXV1ZUVlRYXFxeYGBdYFxXYV5bXlxbXlhWWFhbW19gXF9YWV1cXV5fXFtdWFtgYV5gZGNkZWVmYlljZWVpZ2ReY2FgZWNdZWlkZWlfZl5jYmNhYWBfX1tYWVtZWlpYWVhXW1taW1dYWlRZXVxaYFxVXmJOU1dZVldaWFtcWFdZXmBiYWRhZGFdXllhY2JfYWBgXlxcXFdXW1tdXV9fXFpdY1haWF1gY2RfUlhZUFdXWFlZV1ZXVl1dXmBhYF9iXllhXV1eWV1eWVhWV1tcYF5dX1paXl1eXmFcW1taXF9iXmJkY2VmZWZiWmRmZ2pnY19jX2FmZVppaWNmaWNlXmJiY2FgYF9dXVpXW1lZWFhaWFdaW1pZV1hWVVtdXV1gYGJieExYV1xZV1xbXF1aV1xdX2BiZGJiYV1gWGJjYmFjYWJdW1xbWFdbXF9dYF9dW2BkXFxYWmJlY2BSXFpPWFhaW1taV1pZYF1gYmJgYWNfXGJdX11bXl5ZWVVYXV5fYF9fXFteXmBiY1xcV1xeYGJiY2VkZmRlZmRcZWZoamdjYWJcZGdgXGlpYmhpZmRgYmFjYV9gX11dW1lcWVhXWFlYV1xbWldXWE9YWl1hY2Zmcmt/SllXXVpaX1xbXlxYXVteX2FjYmFhXWJbYmRiYGJiYlxbW1pXWGlxYFxgX11cYWNfXllZY2VkYVNfWlJZWFxdXVtaW1tjYGJiY2BiZGFgY15gXF1eX1pYVltfXl1hYV9eW2BhYmViX11UXGBgY2RkZmVnZWZmZV5lZmhpZ2RkYFtlZ15haGhiaGhmY2BiYGNiX19fXV1cWltZWFhYVlpWXFpaVlZVTVhXXGdpa2h1eIF2dnZ2dnZ2dnZ2dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6e3p6ent7e3t7e3t7e3t7e3t7e3x7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHt7e3t8fHx8fHx8fHx8e3t7fHx8fHx7e3t7e3t7fYmIhoqHhYKBgoOCg4OCgoKCgoKCgoKCgoGAgYCBgICAgYCBgYGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t6e3t7e3t7fHx8fHx8fHx8fHx7e3t7e3t7e3t7e3x7e3t7e3t7fHx8fHt7e3t7e3t8iYmHiYaFgoGCgoGCgoKCgYKCgoKCgoKBgYGAgICAgICAgIGBgYB9fHx8e3x8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eHh5eXl5eXl5eXl5eXt7e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx7e3t7e3t7fHx8e3t7e3t7e3t7fHx8fHx7fHt7e3uHiYiJhYSDgYKCgoODgoKCgoKCgoKCgYGBgICAgICAgICAgYKBgH58fHx8fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3h4eHh4eHh4eHh4eHh4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3x8fHx8fHx8fHx7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8e3x8fHx8e3t7e3t7e3x8fHx8fHt7e3t7e4aJiYiFhYOBgoKCgoOCgYKCgoKCgoKBgYGAgICAgICAgIGBgYCAfnx8fHx8fHx8fHx9fX18fHVwb29vb29veX59fX19fYSMi4uLi454KSkqKiopKz0/Pj4+Pj5tgH5+f397pdfT09PT1r2GiYmJiYqCRT4/Pz8/PXWNiYmJiYmLjIyMjIyNiH9/f39/f359fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx8fHx8fHt7e3t7hIuHh4aHgoGDg4GCgoKCgoKCgoKCgoGBgYCAgICAgICAgYCBgIB+fHx8fHx8fHx9fXx8fH19dXBub29vb255gH9/f39+hpCPj4+Pk3kZGhoaGhocMTMzMzMzMmqCf4CAgHut6eTk5OToyomMjIyMjYM6MjMzMzMwc5CMjIyMjI+QkJCQkJCMf39/f39/f319fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e3uCjYeIh4eDgoSCgYKCgoKCgoOCgoKCgYGBgICAgICAgICAgICAgH58fHx8fHx8fXx8fH19fX12dXV1dXV1dHZ3d3d3d3d4eXl5enl6eG9wcHBwcHBycnJycnJyd3p5eXp6en6Dg4ODg4SBfHx8fHx8fHZ1dXV1dXV6fX19fHx8fH19fX19fX18fX19fX19fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e4CMhomHh4SDhIKCgoKDgYKCg4KCgoGBgYGBgYCAf4CAgICAgICAfnx8fHx8fHx8fX19fX19fXZ2dnZ2dnl3dnZ6e3h7eHd2d3p4enp5fXp5eXh4eHh5eXl5enp5eXl5enp6eXh4eXl5eXl7e3t7e3t7fHx8fHx8fHt7e3t7e3t7e3t7e3t7fHx8fHx9fX19fX19fX18fH19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8f4uHi4qIhIODgoKCg4KBgoKDgoKCgYGBgYGAgIGAf4CAgH+AgYF+fX18fHx8fHx9fX19fX19d3d3dnZ3fXh3d316eH14d3d4fXl9fXp8e3h3d3d3eHh4eHh5eXl5eXp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fHx8fHx8fHx7e3x8fHx8fHx8fHx+iomMjImFg4SEgoKDgoGCgoKCgoKBgYGBgYCAgICAgICAf4CAgH19fXx8fH19fX19fX19fX13d3d3d3p9eHt4fHx3e3h3d3d8en19eXx6eHh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fX19fXx9fX19fX19fX19fX19fHx8fHx8fHt7fHx8fHx8fHx8fH2Kio2NioWDg4SCgoKCgYGCgoKBgoGBgYKBgIGBgICAgIB/gIGAfXx9fX18fX19fX19fX19fXd3d3d3fX55d3d4e3p7eHd3d3x7fHt6fHt3eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt8fHx8fHx8fHx8fHx8fH19fX18fH18fH18fHx8fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8foqJjo2JhISEg4KCgoKBgYKBgoKCgYGBgoGAgYKAgICAgH+BgIB8fH19fX18fX19fX19fn5+d3d3d3d5fHl7eHx9eXt5enp4e3p9fHt9e3h4eHh4eHh4eXl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt7fHx7fHx8fHx8fHx8fXx8fX19fX19fXx8fHx8fHx8fXx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx/iIeNioeFhoaDg4ODgoGBgoGCgoGBgYGCgYCAgoF/gICAf4CAgHx8fX19fX19fX19fX5+fn53d3d3d3Z4eHl3eXp4enh5eXh5eHp6eXt5eHh5eXh4eHh5eXl5enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX18fH18fH19fX19fH19fX19fHx8fHx8fHx8fHx8fX+HiIyIhoeHhIKDhISCgYKBgYKCgoGBgYKBgIGBgYGAgIB/gIGAfHx9fX19fX19fX1+fn5+fnd3d3d3d3d3d3d3eHh4eHh4eHh4eHl5eHl5eXl5eXl5eXl6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fHx8fX19fHx8gIeIi4eHiYaDg4SDg4KBgYGCgoGBgYKCgYGBgIGBgYCAgICBgX97fH19fX19fX19fn5+fn5+d3d3d3d3d3d4eHd4dnl5eHh4eHh5eXl5eXl5eXl5eXl5enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fH19fXx9fXyBhoqKiYmIhIOFhISCgoGBgYGCgYGCgoGBgYCAgYGAgIGAgIGBf3x8fX19fX1+fn5+fn5+f394eHd4eHh4eHZxZGpeam15eXl4eHl5eXl5eXl5enp6enp6enp6enp7e3t8e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIGFiYqJioeEhYWEg4KCgYGBgoKBgYKBgYGBgYCBgYCAgYCBgIF+fH1+fn5+fn5+fn5+fn9/f3h4eHh4eHh5bWRiZV9fXm95eXl5eXl5eXl5eXp6enp6enp6enp6e3t7e3t7fHx8fHx8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goWKiomJhISGhYSDg4KBgYKCgoGBgoGBgYKBgIGBgICAgICBgH58fX5+fn5+fn5+fn9/f39/eHh4eHh4eW5kZWdlZGJeZnh5eXl5enp6enp6enp6enp6enp6e3t7e3t7e3x8fHx8fHt8fHt7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChouJiIqEhYaEg4OEgoGBgYGCgYKCgYGBgYCAgYGBgIB/gIGBf3x8fn5+fn5+fn9/f39/f394eHh4eHl3Z2VkZWZkZWFfaXl6enp6enp6enp6enp6ent7e3t7e3t7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHt8fHx8fHx8fHx9fX19fX19fX19fX19fXx9fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4eJh4SEhoSDg4WBgYGBgYKCgYGBgYKBgICAgYGAgYCAgYF+fHx/f35/f39/f39/f39/gHl5eXl5eWtlYWJlZWFlZV5ieHdze3p6enp6enp6enp6e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fH18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19g4aLhoiFhYaEgoOEhIKBgYGBgoKBgYKBgYGAgYGBgYGAgIGBgn98fH9/f39/f39/f3+AgICAeXl5eXl0Y2NlZGNmY2doZGZsZF5ze3p6enp6enp6enp6ent7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn6DhouGhoaGhYODg4SDgYGBgYGCgoGBgYKBgYCAgYGBgYCAgYGBfnx8f39/f39/gICAgICAgIB5eXl6d2RhY2diYmRdW2VfYV1eYGFoeHp6enp6enp6enp6e3t7e3t7fHx8e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+foSFi4eGhoaGhIODg4KBgYGBgoKCgYKBgoGAgIGBgYGAgYGBgYF+fX1/gH+AgICAgICAgICAgHl5eW9vYmJiZF5jZ19dYWFgXF9kYlttfHp6enp6enp6enp7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7fHx7e3x7fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5/hIiLhoSHhoaEhIODgoGBgYGCgYGBgYKCgYCAgYGBgYGBgYGBgX5+fYCAgICAgICAgICAgICBeXpwXWJlZGJkXmZnZ2BZYmJhY2VfXF1ze3t6enp7e3t7e3t8fHx8fHx8fHt7e3t7e3t7e3t7e3t7fHx8fHx8e3x8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fn19fn5+fn5+fn5+fn5+foCFjIqEhYaGhYODg4SCgYGBgYKBgYGBgoKCgYCBgYGCgICAgIGBf35+gICAgICAgICAgIGBgYF5emxiZGdjYmdmYWBgZGFiZWRjZGNeXGJ1fHt7e3t7e3t7e3x8fHx7e3x8fHx7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/gYeMiYWGhoeFg4SDgoGBgYGBgYKBgoKCg4KBgIGBgYKBgYGCgoF/f36AgICAgICAgIGBgYGBgXp7dGdnZmZkZGZmYF5fYWNlaGRlXmJkYHR8e3t7e3t7fHx8fHx8fHx8fHt7fHt8fHt7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f3+CiYqIhoaIhoWDhIOCgYGBgYGBgoGBgoKCgoGAgYGBgoKBgYKCgX9/f4GBgYGAgYGBgYGBgYGBenptaGNjZ2ZnZWdmZmdiZWRlYmdbYmVgdnx8e3x8fHx8fHx8fHx8e3t8fHx8e3x8fHt7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f39/f4SJioiGiYeFhYSEg4KBgYGBgYGCgYKCgYGBgYGBgYKBgoGBgICBgH9/gYGBgYGBgYGBgYGBgYF7emlpZGNqZmFgZmVjY2NnaWRjYmBiZGJ0fXx8fHx8fHt8fHx8fHx8e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f39+fn9/f39/f39/f3+AhIqMiIeJhoSFhYOCgYGBgYGBgYKBgoGBgYGBgYGBgoKBgYGBgYGAgH+BgYGBgYGBgYGBgYGBgXZzZWRnY2RmZWJlZmdkZmhmZWNgYGNkYHF9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fXx9fX18fHx9fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/fn5+f35+f39/f39/f3+AgICFioyJiIqJhoaDgoKCgYGBgYGBgoGBgoGBgYGBgIGBgYGBgYGCgX+Af35/foCCgoKCgoKCgoKCc3NnZWRkZWlqaGZnZ2NhZmZlZmdmZWVjdX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gICAgICAgIWLioqJioeHhoSCgoGBgYGBgYKCgYKBgYGBgIGBgoKBgYGBgYGAf4B+dHRzdX1/goCAfn5/gYB0cmdkZWNmaWppZWNlY2BmZGRnZ2JiZWFwfXx8fHx8fHx8fHx8fHx8fHx9fX18fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f39/f39/f4CAgICAgIB/houLiouLh4eHhIOCgYGBgYGBgYKBgoKBgYGBgYKCgYCBgYGBgoCAgH5zc3NzdHV4dXV0dHV2dXVwZmNmZWhoaWdoZ2VmZWJfZGVmY2BiZ3d8fHx8fX19fX18fHx8fH19fX19fX19fXx9fXx8fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gIB/f3+AgICAgICAgICHjIyIi4qHh4eEhIKBgYGBgYGBgoGCgoGBgICBgoGBgYKBgoKCgYCAfnNzc3Nzc3NzdHR0dHNzdW9jY2FnZWhoZ2pmZGVnZmhmY2JlYl5ieX18e3t8fX19fX18fHx9fX19fX19e3x9fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn9/fn5+fn5+fn5/f39/f4CAgH9/gICBgICAgICAgYCAf4CAgYGAgIeLi4iNiYiJhoSFgYGBgYGBgYKCgYKCgYGBgIGCgoGBgYKBgoKBgIB+dHNzc3Nzc3Nzc3Nzc3N1cmdlZWRlamhoZ2ZpaGdjZWViZGNoZGd7eHVzc3R2dnl4dnR0dHZ3d3d2dHR0dXV4d3h4d3d6e3x9fXx9fn5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f35/f39/gH9+fHt7fX58eXl2dnZ5fHx6end2d3l7fXt4hIyMioyHh4iEhYSBgYGBgYGBgoGBgoGBgYGAgYKCgYGBgoGBgoGAgH51c3Nzc3Nzc3Nzc3Nzc3VzaGVnaGVrbGhqZ2lqZ2dnZmRkYmVkbnV0dHNzdHNzc3Nzc3Nzc3Nzc3NzdHNzc3Nzc3Nzc3N0dHV1c3V3eHl7fn59fn98f39/f39/f39/f314fH5+fXx4dXZ3eXd4dnRzc3N0dXRzc3Nzc3NzdHNzc3R0c3R0dHODjI2KiYeIhoOGg4GBgYGBgYGBgYGCgYGAgYGDgoKBgYCBgYGBgICAf3VzdHRzc3Nzc3Nyc3NzdnZpY2hqaGpsZWZpbGhgZmVkY2BkZGZ0dXV1dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHRzdHRzc3Nzc3R2dnV1d3V4fH9+fX9+fHp4dXN0dXV1dHNzc3Nzc3N0dHR0dHR0dHR1dXR0dHV1dHR1dXR1dXV1dIaMjYuIhoeEhIWCgYGBgYGBgYGCgoGAgYCBgYKCgoGBgIGBgYGAgIB/dnNzc3Nzc3Nzc3Nzc3N2dnNnZ2pmaGdmaGhmZGlnY2NnZWVmcHZ1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dHR1dHR0dHR0dHRzdHR0dnV1d3Z0c3R0dHR0dHR0dXV1dXV0dXV1dXV1dXV0dHNzc3N0dHNzdHR0dHR1dXR1iY6MjIqHh4SEhYKBgYGBgYGBgYKCgoGBgICAgoKCgoGBgYGBgYCAgH93c3Nzc3NycnJyc3NzcnZ2dW5kXWNnZWlraGVoZ2dqamlnZXB2dXV1dXV0dHRzdHR0dHR0dHV1dXV1dXV0dHV1dHR1dXV1dXV1dXV1dXR0dHV1dXV1dXV0dHV0dHV1dXV1dXV1dXV1dXV1dXV1dXV0dHNzc3Nzc3N0dHNzc3Nzc3R0dHR0dHWKjoyMiYaGhIeFgoGBgYGBgYGBgoKBgYGAgYGCgYKBgYGBgYKBgYCAf3hzc3Nzc3JycnJyc3NzdnZ3d2liaGhnamtpaGZkZGVmaWhwdXR0dHRzc3JxcnJ0dXV0dHR0dHR0c3NycXFxcXNzdHR0dHR0dHR0dHV0cnJyc3R0dHR0dXV1dXV1dXR0dXR0dHR0dHR0dHR0dHR0c3Nzc3Nzc3Nzc3Nzc3N0dHN0dHR0dHR0dYuOjImGhYWFh4SCgYGBgYGBgYGBgoKCgYGAgIKCgoGBgYGBgYGBgIB/eXNzc3NycXJycnJzc3N3d3d3bGpoZGhpa3Z6a2VmZWhnbXJzdHN0c3JwcHBxcnN1dXR0c3NycnJycXBvb29vcHFzc3NycnJyc3R0dHNxcHFyc3R0dHR0dHRzc3Rzc3NzdHR0dHRzdHR0dHR0dHRzdHR0c3NycnFxcnJzc3Nyc3NzdHR0dHN2jZCMh4eFhYSEgoGCgoGBgYGBgYGCgoKBgYGAgYGCgoGBgoKBgYGAf395c3NycnFxcnJycnNzc3d3d3dzc2pnaWloeX99cW51bG5wcXJycnFxcG9wcXFxc3R0c3RycXBwcG9ubm1ubW5ubnBxcnJycnJycnJzcXBvb3BxcnJzc3JxcnJycnJycnJycnJzc3Jzc3Nzc3Nzc3Nzc3Jxb29ubm9vcXJzc3Jyc3NycnNzcnaPj4uHhoWFhYOCgoKBgYGBgYGBgYGBgoGBgYGCgoKBgoGCgYGCgX9/f3hxcHBwcXFycnJyc3Nzd3d2dnd2cnF0c252f352c3hwcHBycnJycXFwcHFxcXJzc3Nzc3Jvfntvb25ubm5ub25vcHBxcXFxcXBwcXJwb25vcHFxcXFxcHBxcXFxcXJycnJycnJycnFxcnFxcnJycnFwb29ubm1ubW5vcXJycnJycnJyc3JxeI+OjYaDg4aEgoOCgoGCgYGBgYKBgYGCgYGBgYKCgoKCgoKBgYKBf4B/d29wb3BxcnJyc3Nzc3J2dnZ2dnZ3dnZ1c3l/fnd3d29wcXFxcXFxcHBwcXJycnN1cnJycHOYe29wb29vb29vb29wb3Bvb29vcHBxb29vcHBwcHBvcG9wcHFycXFxcnJycnFxcXFxcXFxcHBwcHBxb29ubm5tbW5tbm9wcXFxcXFxcXFxcXB7j42NhoODhYOCgoKCgYKBgYGBgoGCgYGCgoGCg4KBg4KBgYGAgYF/f392bm9wcHBxcXFxcXBwcHZ2dnZ2dXR0c3NxfYB9fX9zb3BxcXFwcHBwcXFwcXFxdJV8cHJviKB2cHBwb29wcG9vb29vb29vb3BxcXBub3Bwb29wb29wcnJycnFxcXBxcnFwcXFxcHBwcHBwcHBwb29ubm1ubm5ubm9ub3BwcHFxcXFxcXFxcIKRjoqEhIOFhIOCgoGBgoKBgYKBgYGBgYGCgoKCgoKCgYGBgYCBgX9/gHVvb29wcXFxcXBwcHBwdnZ2dXRzcnJycnGAgoCBeXBwcHBvcHBwcHFxcXFwcXJwlKF1cHOdoHZwcHBwb3BxcHBvb29wb29vcXFwcG9wcG9vb25vcHFxcHBwb3Bvb3BwcHBwcHBwcHBvb29vb29vbm5tbW1ubm5ub25vb3BvcHBwcHBwcHBwiZCMiISDhIaDg4KCgYGCgoKCgYGBgYCAgYGBgoKBgYGBgYGBgIGBgH+AdG5vb3BxcXFwcG9vcG92dnVzcnFxcXFxcICDg39ycHBwcHBwcHBwcHFxcHBxcW+JsZFufqSgdnBwcHFwcHBwcHBwcHBvcHBxcXBwcHFxb29vbm9wcHBvb29vcHBvb3BwcHBwcHBwcHBvb29vbm5ubm5ubW5ubm1ubm9wcG9vb29vb3BzcXWPj4uJg4KFh4ODgoKBgoGCgoKBgYKBgYGBgYGBgYGBgYCAgYGAgYGAf4B0b29vbm9vb29vb29vb3Z1dHNxcXFxcXJygIKCgXRxcXFxcXFxcXFxcXFxcXFycIOzqXyQr6N3cHFxcXFwcHBwcHFxcXBxcHBwcXBwcHBwcHBwcHBwcHBwcHFxcXBxcHBwcHFwcHFxcHFxcXFxcXJxcnFwcnRycnR0dHR1dnRzdHR0dXd3gpCPi4iDgoaHhISCg4GBgYKCgoGBgoGBgYKBgYGBgYGAgICBgYCBgYB/gHVvb29vb29vb25vb29vdXRzcnJycnJycnKDg4OCdnFycnFxcXJxcnJxcXJycnJwjbGnq6ivpHRycXFycXFxcXFxcXFxcXFwcXFxcXFxcnNzcnJyc3V1dHR0dHR0dHV2d3d3d3d3eHh4eHd3eHh4d3Z3dnV2dnZ2d3h6e3x7e3t6enp6enyGkI2LiIODiIeHhYODgoGCgYKBgYGBgYKCgoGBgYGAgYCAgYGAgIGBgH+Ad3FxcXFxcG5ucG9wcG92dHV1c3Nzc3NzdYiDgoN5cnNzcnJyc3Jyc3Nzc3Nzc3WfoqKzpZujenNzc3Nyc3N0dHV1dXV1dHV3eHd3d3d4eHh3eHh4eXl5eXl4eHl5eXp6e3t7e3t6enp5eXh3d3d1dnV2dnd5enp7fn5+fX1+fn5/f35+gIyQi4qHg4WIi4iEg4SDgYGCgYGBgoGBgoKCgoKAgYGBgYCBgYGAgIGAf4B8enp5eXx5eHh2dXZ2dHl2d3h3d3Z3dnZ6fnx+fnx2dnd3dnV4enh4eHh4d3h4gKWemqWfpKOPenl6eXh4eXl6enl5eXh4enp5eXh4eHh3dnd3eHh3eHh5eXp7e3p8fH1+fX9/f359e3t7e3p5enl5e3t/foB/fn5/fn19fX5+f35+fn6AjpCNioeEhoqLiIaGhIOBgoKBgYGCgYGCgoKCgoCBgoKBgYGCgYCBgIF/f4B/fn19fX9/f318e3t7eXh4eHh5eXl4eXh5eXl4enp6enp6e3t7fH1+fXx7fH2KopCQl5qXmZJ7e3l4eXh4ent6enp5eXp8fHt6enx8fHp6ent9fHx+fn+AgoGAgYKAgH9/gYGBgIB/f35+fn5/fX1+f4CAf35+f39+fn9/f39/gH+Af4OQjoyHhoWIi4yIh4aFg4GCgYGBgYKBgoKCgoKBgYKDgoGBgYGBgIGBgIB/goOCgoGBgX99f39/f4F6enh4d3h4eHh5eHh5enp5e358enx9fXt8fX19fX59foamqaSeoJuVlX9/f319fYCDgoCAf318fXx9fXt9fXx8fH19fX1+gYGChISDgoB/gYGBgH9/f4B/f39/f39+fn9/f39/f35+f3+Af39/gICAf4CAgICAhJCPi4eGhoiLi4mKhYaDgoKCgYGBgoGCgYKBgYGBgoOCgYCAgYGAgIGBgH+ChIKCgICAgH9+fn+AgH9/fn18fX19fYB/fX+Af35/gH9/fn9/gICBgICBgIGAirGoqaKhoaujgn6AgH5/f39+f4B/fn5+f39/gYB/f4CBgYCAgYOEgoGCgoGCgH+AgYCBgYGAgH+BgICAf39/gICAgYGBgIGBgYCAgICBgoGBgYCAgYGFjo6MiYaHiYyLi4qGhoOCgoKBgYGCgoOCgoKBgIGBgYKCgICBgYCAgYGAf4KFg4KBgYCAf39+fn+AfX5+fn19fX5/fn9/f35+fn+AgYCAgICAfn9/f4CAgIqnrp+oo6ChpamkjH98foB/fn5/f35/gIGBgoKDg4KCg4KBgYKDg4OCgYGBgYKBgoKCgYKBgoGBgYGBgoKCgYGCgYKCgoGBgoKBgYKCgoKCgYGBgoKCgoaPkY+KiImKjY6NiYaFgoKCgoKBgYKCg4KCgoGBgYGBgYF/gIGBgYCBgIF/gYWEg4KCgoGCgYCAgIB8fHx7fH18fH9+fn9+fn5+f35+f39/f39/gH+AgYiWqq6km6ShoKGhoamqn46BgIB/gIF/f39/f3+BgYGCgoCAgYKDg4SDg4ODgoKCgoKCgoKCgoKCgoGCgoKDg4OCg4ODgoKCgYKCgoODg4ODgoKCgoODg4KCh5KTkIuKi4uPj42Lh4SCgoKCgYGBgoKDgoKBgYGBgIGBgICAgYGBgIGAgYCAg4SDg4OEg4ODgoKCgXx9fHx9gn1+f4GCiIGCgoSCgYGDg4GBgYKDgoaMmqajnZyaoJSZoaCenZ6hn5KEgYCAgICAgH9/f3+AgICAgH9/gYODhYSEg4SDgoKCg4OCgoOCgoODg4ODg4SDg4KEhYWDg4SEgoKDhIOCg4ODg4OCgoODgoCKlJOPioqMj5GPjYuGg4KCgoKBgYGBgoOCgYGBgIGBgoGBgICBgYGAgYCAgH+BgoODg4SEhIOCgoKCfXx8fn6AgYOAg4OChIaFhoaFhIWFg4ODg4SBgoOKkpWYl5mYiJCdm5ucmJCJhYODg4KDg4ODgoGAgIKCgYOCgYKCg4OEhYWEg4OChISEhIOEhISDg4OEg4ODg4OEg4SDhIWEhISDg4ODgoKCgoKCgoKBgYKCgo+UlI+Njo6RkY6KiISCgoKCgYGBgYGCg4GBgIGBgYGBgYCBgIGBgYCBgICAgIKChIKChIOCg4ODgoJ9fX2AgH+AgoGDg4ODhIaEhIOEhYWDg4GBg4OCgIGCg4yWmZWJkZmckouHhYaGh4eGhoeHhoaEgoGCg4SDg4ODg4ODhISFhYWDhYSFhISEg4KBg4OCg4SEg4KCg4SCg4ODg4OCgoKCgoKCg4OEhIOFhYWFhoaIk5OTkI+Pj5KRjIqIgoKCgoKBgYGBgYKDgoKBgIGBgYGBgICAgYGBgICAgICAhISEgoKCgoGBgoKBgX+AgYOCgICAf4CCgoGDg4KCgYODg4SDg4GDhYSDgoKBgYSQl5OWmZCFh4eIiIiHh4eIiIiFhIOBgIGBgoKCg4GCg4SEhYSDg4OEg4OEhIOBgYGCg4OEhISDg4ODg4OEhIODgoSDg4ODhIWFhoeHh4eIiIiJiY6TkpKOj46RkY+LiYeCgoKCgoKBgYGBgoKCgoGBgIGBgYGAgICAgYGAgIGAgICDg4KCgYKCgYGAf4CBhYWFhoOCgYB+fn+BgoSCgYKDhIOCg4ODg4KChISDhISCg4OFkZeJhISDg4WFhYOEhIWFg4KBgH9/gIB/gIGEg4OEhYWEgoKCgoOCg4OFhIKDhISEhYaGhoaGhoWFhoeHhYaIh4aHiIeGhoaIiYeGhYaGhoeIkZKSj46QjpCRjImHhYGBgoKCgoGBgYGBgoOBgYGBgYGBgICAgICBgYCAgICAgISEg4KBgoGAgYGAgYKIh4aHhYSCgH99fX6AgH+AgYGBgYGBgoGAgYKDgYKCgoKCgoGIkYKDg4GCgICAf4GAgICAgH9+gIGBgYKCg4OEg4OEg4OCgoGBgoODg4SEg4SEhIOFhYaFh4eIh4eHh4eHh4eGhoaGh4WFhYaGhISEhIWEhYaSk5GOjo+OkI6JiIeEgoKCgoKCgoGBgIGCgoKCgoKCgYGBgYGAgYGBgICAgYGAgoSDg4KDgoGCgYKDg4iHh4iHhYSCgX5+gICAfn5/f4CBgYGCgoCBhI2DgH+AgICAgImTgIGCg4OAf39/gICAgICAgICDg4KDg4ODgoOBgYKCgoOCgYKCgoOCgoSDhISDg4SEhYWFhYaGhoaFhISEhYWEhIWFhYSEhISDhISEhISEipSTkpCQj46NiYaFhIOBgYKCgoKCgYGAgYKCgoKBgoKBgYCBgYCBgYGAgICAgYGAg4OCgoOCgoKBgoOCiImJiYiHhYSDgYKEhIOBgoKCg4SCgoSEgoOJloiEgoSCgn9/jZeCgoGChIOBgYGCgoODgoGDg4SDg4SEg4OCg4KDg4ODg4KCgoKCgoGDhISEhYSFhYWFhIWEhIWFhYWDg4OEhISEhYWFhISEhISEg4ODg4OOlZKQkZGPjYyHhYODg4GBgoKCgoKBgYCBgoOCgYCCgYGBgICAgIGBgYCAgICBgICDhYSEhIODg4SDhIOGh4mIhoWDhIODg4WDgYCDgoWFhISDg4OChI6YioOFhISEgoCTm4WCgoKEg4OCg4GBhIWEg4ODgoKDhISDg4ODg4SFhISDg4KCgoKCgoSEhYSFhYWFhYODhYWFhYaFhoWEhIWEhYWGhYWFhIWEhISDhIODhJGUkpKTj4yMioWEg4ODgYGCg4KCgoKBgYGCg4KBgYKBgYGBgICBgIGBgH+AgIGAgYaGhoaGhoaHh4aGhYSDhYaCgIGBgYGHgoB+f4GBj4yDgX9+fXx8i5yNgIKBgYKChZSUi4GCgYKDg4GBgYKDhYODg4KDg4OEgoKEhIOEhIWEg4OCgoKCgYKCg4ODg4SFhYWFhIOEhYWGhYWEhISEhIOEhIWFhYWFhIODhIOEg4KGlJSTlJKPjYyIhISEg4KBgoODgoKDg4GBgoKBgoKCgYGCgYGBgYCAgYGAgICAgICAhYWFhYaGh4aGhoWGg4ODg4GAgoKCgYKAf35/f4GVl4mAfX19fXuBl4uAg4GBgYCPk4yPgYKBgoKBgYKDgoODgoOCgoKCg4OBg4SDg4ODg4OEhIKCgoKDgoKDg4ODhIWEhISEg4OEhIODg4OEhIODg4ODg4SDg4ODg4KDg4KDgouUk5KTko2NioaDhIOEgYGCg4ODg4ODgoGBgoGCgoKCgoKBgYGBgICBgYCAf4CAgICDhISFhYSFhYWEhIWCg4KDgoKDg4OBgICAgICAgJWfin5+gH2Hin2EhYOEgoODgo6JhYyCgoOCgoKCg4ODgoODg4KCgoODgoKDg4KCg4KDg4WEg4ODg4SDg4SEhISEhYWEhIWEg4SEg4OEhISEhISEg4SEhYSDg4SEhIODgoKDkJSTkpKPi4yIhoSFg4OBgYKDg4ODg4OCgYGCgoKCgoKDgoCBgoGAgICAgIB/gICAgISDhYWEhYWFhYSFhYOEhIWDg4SEhIKCgoOCgoSBkaGKf4yFfYaJgH6FhYWEhYJ/fn19f4KEg4ODg4OEg4ODhISEg4OEhISEg4SEhIOEg4OFhoWFhYSFhYWFhYSFhoWGhoWFhYWFhYWFhYWGhoWGhoaFhoaGh4aFhYWFg4SEhIeTk5OSkoyLiIWGhYWCgoGBgoODg4OCg4KBgYKDg4ODgoKBgIGAgICAgICAgH+AgICAhYWFhYWGh4eGhYWFhISFhYSEhISEg4ODg4OEhYOKkYOEi4WCgYF+fYGHhoOAfn5/fn9+f4OEg4OEhISEhISEhISEhISFhYWEhYSGhYWGhYaGhoWGhYWGhYWHhoaGhoaFhIWFhYWFhIWGhoaHhoaGhoaHh4iIiIaFhYaEhYaGjZSTkpGQi4qHhoeGhIGCgYKDg4ODg4KDgoGBgoODg4KAgYGBgICAgICAgICAf4CAgICHh4eGhoeHiIeHhoaEg4ODhIODg4OEg4ODg4OEhISEgYKCgYmBf359foWBf39/f39/f36AgISFhIWGhoaFhYWFhoeHhoaFhoWFhoeHh4iHh4eGhoaHhoeGhoeHh4aGhYSDhIWFhoSFhYaGhoeHhoaGhoeHh4eIiIeGh4aHh4eRlJORkZCLiYiFhoSDgoKBgoODg4ODgoKDgoKCgoOCgYCBgICBgICAgIGAgIB/gICAf4aHiIeHh4eIiYmIiIODgoKDgoSEhIWEg4KCg4SEhIOBgICAhIR/fn5/gH9/f39/gIB/f4B/f4WFhoiIiIeHh4eIh4iHiIiIhoaHiImJiYmIh4aHh4iJiIeHh4eHhoeFhIOEhYaFhYWFhoaGh4eFhoeGh4aGh4eHh4eHh4eFh5OTkY+RkIuHhoWGhIKCgYGCg4ODg4ODgoKCgoGCg4KCgIGBgYCAgICAgICAf3+AgYB/hoiIiIiHh4iJiYmIg4KCg4ODhIWHh4aFg4OFhISEg4GAgIGMiYGAgYKCgYGBgYB/gH9/fnt6gIaHiIqKiYmJiImJiYmKi4qIiIiJiYqLioqIiIeIiIiHiIiIh4iGh4aEg4OFh4eHhoWFhISDhYWEhYWGhISEhYWFhoWGhYOJlJOQj5COioaEhoWDgYGCgYKDg4ODgoKCgoKCgoKCgYGBgYGBgYCAgICAgIB/gICBgH+GiYiIiYeIiImJiIiEgoKDg4KDhImKh4aEhIWEg4OCgICAhISCgoKCgoKCgH9+fX19fX59fHt8g4eJi4uKioqIiIqJiImLiomJiImIioqJi4mHhoaHh4WGiIiJiIaGh4SDgoSIiIiIh4WCgoGDg4KDg4SCgoKDgoGEg4SEgY6TkpCPj4uIhYSGhIKBgYGBgoODg4OCgoKCgoKCgoGBgYGBgIGAgICAgICAgH+AgIGAf4WIh4eHhoeIiIiHh4SCg4ODg4OFiYqJh4WHhYSFhYKAgYSEgoOCgoKDgX59fn5+fn5+fn1+fX19g4eJioqHh4WGh4eHh4iHiImHiIaIh4aJiYODhIOFhISFhYaIiIaFg4OCg4WHhoeGhoSCgoOEgoOEhIKBgoGBgYODhIOEkZKQjo+Oi4eEhoaEgoGAgYGDg4ODg4KCgoKCgoKCgYGBgIGBgYCAgIB/gIGAf39/gIB/hYaGhYaGhoeHiIeGgYKEhIODhYeIi4qGhIaEgoaGgoKEhIODg4OCgoF9fH1/gH9+fn59fH19fHl8g4aHh4SDgYODhIWFhYODhYSEhISFhIWEgoKCgoSEgYKDg4WGhYSCgYGCgoODhYSEhIWEhIaEg4SFg4KDgYKDg4SFhIeSkY+Nj4yJhoSFhIWCgYCBgYODg4ODgoKCgoKCgoKBgYGBgYGAgICAf4CAgYB/gICAgICDhIWEhIWFh4eHh4aAgYGFg4OEhYSHiIWCgIB/gX9/gYODg4ODgoJ/fX1/gICBf31+fn19fX17enp+hISEgoGBgIGBgoKBf36BgYGCgYOBgoGCgoKBg4OAf4CAgoOCgICAgICBgYGDgYGChIODhYSCg4SDgoKBgoSDhYWGi5ORj4+Pi4iFhYODhIGBgYGBgoODg4KCgoKCgoKCgoGBgYCBgYCBgH9/gIGBgICAgH+AgIKCg4OChIOEhYWGhn+BfoCBgICAgIGDgn9+fn5+fX+Cg4OCg4ODgn19fn+AgIGAfn19fX1+fXx6enqAgoKBf39/f35/f4B+fYB/f4CAgX+AgIF/f4CAgX59fX+AgX9/foCAgH+AgICAf4CCgICCgYGCgYGAgYGBgYKEg4aPkpCOj42Kh4eGg4ODgYGBgYGCg4ODgoKCgoKCgoOCgYGCgYGBgICAgH+AgICAgICAf39/gYKDhIGCgoOCg4SFgIB/fH19fn19foCAf31/fn1+gYODg4KCgYF/fX1+f4CAgH9+fX19fHt7e3p6enqAgH9/f39+fn1+f35/gH9+f3+Af4GAf35+fn9/fn18fn+Af35+f3+Af39/f4B/f4B/f4CBf4B+f39/gH9+f4B/hZKSj46Pi4uHiYWEg4KCgYGBgYKDg4ODg4OCgoKDg4KAgYKBgYGAgICAf3+AgIB/gIF/f36BgYSEgYKBg4OCg4OBgH98fn9/fX6Af4B/foF/f4GBhIOCgYB/f359fn5/gICAfn19fXx7e3x6enl5eXuAgH+Af39/fn5/foCAf35/f4CAgoB/fH5+f35+fXx/f4B/fn9/f4B/f35+f4CAfn5/f39+f35/f35+fn19fX2Fk5KOjIuKiImIhISEgoKCgYGBgoOCgoOCgoODg4ODgYCBgYGBgYCAf39/f4CAgICAgIB/foCBhIOCgYGDhISDhICBgICBgIGAgYKCgoGBgoCBg4ODgYGBgYCAfn19fn5+f359fX19fXx8fHt6eXl5eH2BgIGBgYF/f4B/f4F/gICAgYGCgoB+gH5/fn5+foGAgYF/f39/gIB/f4B/gYB+f3+Afn9/fn+Af31+fX17fIaTkYyLioeHioiGhoSDgoGBgYGCg4ODg4OCg4OCgoKBgICBgYGAgH9/f4B/gICAgICAgH9+fn+BgYGAgISGh4aHgoODhYOBg4ODhYSEhISEg4ODhIKCgoKCgX9+fX19fn6AfX19fX19fXx9e3p5eXl5eYCCgoKEg4CCg4GAgoGCgYGDgoODgYGCgIGAf4CBg4GEgoCAgYGBgYCAgYCCgn+BgIF/gIB/gICAfn9/fnx8ipOQiYmIiIiJiIaGhoSCgoGBgoKDg4ODg4KDg4KCgYCAgIGBgYGAf39/gICAgICAgIGBf359fn5/f39+g4aHh4iChYSFg4SFhIWGhoaGhoWGhYGBg4ODgoKAfX19fX19fn59fX19fX19fX18e3l5eXl4fIKDhIWCgYSDgoKDhYeCg4SDgYKCg4OCgoKCgYKFg4iFgoGCgYKDgYGBgYSDgoOCgoKCgYGBgIF/gIGAf36Ok4yHiIaIh4aGhYaGhIKDgoGCgoODg4ODg4OCgYGBgH+AgYCBgYB/gH9/gICAgH+AgYB/fn19fX5+f36Ag4SHiISGhoaFhoaHh4aHh4iHh4eGf32AgIGCgX59fX19fX19fX19fX18fH5+fnx7eXh3eHl5gIODf4ONhISEhISXl4ODhIF9foGCgoGCgYKBhIaIjIWDgoKBhIKDg4KDhYSEhYOCg4OCg4OCgoKCg4KCgpKQi4iIh4mHhoaEhoWFhISCgYKCg4ODg4ODgoGBgYCAgICBgIGBgH9/fn+AgYCAf4CAgH9/fn1+fn+Bf4CCgYWFhYeGh4eGh4eIhoeHh4eGh4V/fX18fX9+fX19fX19fX19fX19fXx7iJKCe3x6fIZ5eHl8gYF+iZaEg4OEhJSTgIGBf39/fn6Fi4B/gICEhpCJhYSCgoGFhYuDgYOFhYaGhIOFhYOEhIODhIOEhISIko+MiYiIiYeHh4WGhYSFhIKBgoKDg4ODg4OCgYGBgYB/gIGAgICAf39/f4CAgICAgYGBf39/f4CAgIGBgYGBg4OGh4aGh4aGiIeGhoaFhIOFhH59fHx8fX18fH19fX19fX19fX18fH+RlZaDe3qElHx4eXp7fICCg4GCgYOCgH59fn57iJF8fI6Wf31/f4KGioWDg4SDgYONiX9+f4OEhYWDhYaFhIWFg4SFhYaEhI6Rj4yKioyJiImHhYWFg4ODgYGCgoKDhIODgoGBgICBgICAgYGAgIB/f3+AgIB/gICAgX5+f4GBgoKCgoODgoOCgoWGhISFhYSGhIOEg4KBgIKAfn19fHx9fXx8fH18fH18fX19fHx8e4uRl4x6e3yAenp6e3x5eX19foB/gH98e3t+fn2ClZF/hIh9fH5/goR8fIGChIKAf4eDfYOBf4KCgIODhISEhISChIOEhYGEkZGOi4yLjoqJiYWFhYODg4KBgoODgoKDg4KCgYGAgIGAgICAgICAgH+Af3+Af357gICBenyAgYKDhYODhYWFhYODg4SCgYKDgoOCgoGBgIB/gX5+fX59fHx8fHx8fHx8fHx8fHx9fHx8fn6Kgnt6e3p4ent7fH17fn1+f319fX19fICBgH2Gj4F+fYJ+f36Agnx8gH+CgIKAfn17ioJ9gH9+gYCAgYKAgoCAgIGAf4uUj4yMjo6NiIiHhYWFhIOCgoKCg4OCgoODgYGBgICAgICAgH9+fXx7fHx9f3+AgHx6gYF4e4CCgYOFhIOFhYaHhISAhpSIgIKBgYGBgH9/f39/fn5+gHx8fHx8fHx8fHx8fHx9fHx8fHx8fHl7e3t4eHl7e3p8goCBfn+BfH5+f359gIKCgICAgX+CkYF/f4CAfoB+fn9+gIGBfXx9e319fXx9fHx9gH+AgH6Afn6ClJKNjY2Oj4qFhoaFhISFg4KDgoODg4OCgoGBgYGAgICBgICAf4CAf39/fXt6fICAgHh+gXd7gIF/goKCgoKEhoeGhn6IlYp+gYGAgIB/foB+f39/fn+Bfnx7e3x8fHx8fHx8fH59fHt8fHx8e3x8fHp6eXt8en2Fg4N/gYF+f35/gH6FgoF+gH9+foCFhoKAfn6Dhn99fX6AgIGAf39+fX19fX57fH1/f3+AfX9+f4yRjYyNj46Nh4SGhoWEhIODg4OCg4ODg4KBgYGBgICBgYGAgYGBgYGAgH9/f397en9/e3mAd3p/f31/f3+Af4KDhoaFf3+FgX5/gIB/gH5+f31/gIB/f4B/f319fHx9fn18fH19fX19fH58fXx7fXx8ent6fH19f4aEg4CAgX1+fX5/fouEgYZ+fXx8f36CgX99fX19gXx7fXx+gYSDgYB+fn5+fXx+f399foB+f36Eko2NjI+Ni4qGhIaEhISDg4OCg4KDgoOCgYGBgYGAgYGBgYB/fXx8fH1+f39/f397e399d352eH59fH19fX5+gYGCg4B6fX18fn6Af35/f35/fn+AgH+AgH9/fn9+fn5+fn1+fn99fH58fn1+fHt8fHx6e3p9f4CAhIOCf35/fHx8fXx8gYN+jH58e3t9fn1+fn17e3t9fHt7e3uAhoSChIOBf4B+f4KCgn9/goJ/gIuQjYyMjYuKiISEhIODg4ODgoKCgoKCgoKBgYGAgoGBgYKCf3+AgIB/fn18fH5/fn55fX52e3Z4fXx8fHt9fX6BgICAf31/f31+f39/foB/f39/f3+Af4GBgH99gH9/fn9+fn5/f3yCfX59fX17e319fHp8fH6AgoGAgIB9fH18fHx8fH18fnt/fnt7e3x8fH18e3t7e3x8enp9en6CfoKEhIKBgoGFhoWFhoaHhYGEkY+NioqLh4eFgoOEhISEg4KCgYGCgoKBgoGBgYGBgoGBgoKAgYKBgYCAgH9+e3x+fnx6fnh5dnd8fHx7e318f4GAf35/foB/f35/f35/gIB/f39/f39/gYKAfn6BgIB/f39/f39+fYN8fH19fH99fX19e3x+fn9/fn5/fnx9fXx8fHt+fnt8e3x8fHx9fH18fnx9fHt7e3x5e3x7e316fX5+f4CAg4eJiYmKiYuJhYiSj4yIiYeFhYOCgoOEhIOCgoKBgYKBgYKBgYGBgYKCgoGCgoCAgX98e3p6eXt9enx+fnl8eXh4dHx8fHx8fHx+gH9/f39/gIB/fn5+fX+AgH9/f3+Af4CDgoB/gIGAgIB/f4CBf358enx9fX59fX5+jIZ9fX57e4ODfX5+fX18fX19fX19fH18fXx9fX58fn19fX18e3t6fHt8fHt6e3t6enp7fn6DhYiHiIqLi4qJjJGQjoqIhoWEgoKCgoODg4OBgYGBgYGBgYGBgYGCgoOCgYKBgIGBf3+Af356eHl5en5+e3l6eH5zfHx8e3x8fH5+fn5/gH+AgIB/fn9+gIF/f4B/gIGAgoSEgYCAgYGAgX+AgYKBf39+f31+f357foGSjHx9f4qAjYx+fn19fX5+fX59fX18fn18fXx9fX1+fX1+fnx7e3t8fH18e3t7e3l6enh5e35/g4OEh4mKh4mOkI6MiYmFhISCgYKCgoKCgoGCgoKBgYGCgYKCgoGCgoKBgoKAgYGAfoCAf39+e3p5e319eHx6f3KBfXt7fXx8fn59fYGCf4GBgX9/gH+AgX9/gIGCgYGFg4SCgYGCgYKBgICBg4KAf4F/fX6Afnx/f4mCf36DkYSEg4F/fn18jYd9fX59fXx/fnx9fXx9fX5+fX5/fX19e3x9fnx8e3x9enp6eXl5e3t+foCBg4eEiI+Oi4qGhYSEg4KBgoKCgoGBgYGCgoKBgoKCgoKCgoKCgoGCgn+AgIB+f39/fn5/ent5fX16enp9cX6Cent9fX19fXp4f4KAgYKCgICBgYGBgICBgoKCgoaFhIKBgYGBg4F/gIKEgX9+gYB9foF+fX5/gIB9fn+EgH5+f31+fX2KhX1+f31+fn9/fX19fH5+fn99f4B9fX18fX9/fHx7fH17e3t6enp7e3x9fn2Ag4CJjouMiISFhYSDg4GCgoKCgYGBgoKBgoKCgoKCgoGBgoKBgYKCf4CAgH9/f39+fn59eXp6fXx5d3t0e4d8dHd9fn17e3Z2fYCBgoKBgYKCgoKBgYGDg4OChYaEg4GAgICDgX+AgYSBfn6Af31+gH59fn6AgH+Bf3+Af35/gH99f39/f3+Afn9/gH58fX18fn5+foF/gH2CgHx9gIB9e319fXx8fHx8e3t7fHt8fHx9fIqLiYiGhoWFhISDgYKBg4KAgIGCg4KCgoOCgoKCgoGCgoGBg4J/gIGAf39/fn5+fn57enp8fHt2e3R3f352cnt+fnt4dnd8gIGCgoKBgoODg4OCgoSDhIOFhoOCgX9/gIKAgICAg4F+foB/fX+AfX1+foCAf4J/gYGAgICBgH1/f3+AgICAgIB/fnx9fX19fn59g32AfoKAfX6AgX98fn59fX17fH58fXx8fHt8e3x9iYeHhYWHhYSFhIKCgoGDgYCAgoKDgoKCg4ODg4KBgYGBgYGCgH6AgYB/fn5+fn5+fn56e3p9goN9dXF6fHpxen59eXh0dICAgoKCgoKDhYOEg4KDhISEhIWEgYGAgH6AgoB+f36Bf35/f4B9foB9fX1+gH9/gYCBgYCAgIKBfn6Af4GAf4CAgH9+fX19fnx+fn19gYR/gH9+f4GBf31/f319fn1+fn1+fHt8enx7eoCHg4SEhYSEhIWDgYKBgYKBgICCgoOCgoOEg4SDg4KBgYKBgYOAfoCBf35+fn5+fX5+fnt7en6Jh354cnl9f3F6eHt4eXV1fYKDgoODg4OFhIWDg4OEhIODhIOBgH+Af4CBfn1+fn9+fn5+gH19f3x9fX6Af4CAgIKAgIGAg4KAf4B+gIF+gIGAgH9+fn5+fX1/fn6FhYGBgH+Ag4F/foGAf35/f4B/fn17ent6fHt6goWAg4KCgoKCg4GBgYCAgoGAgIKCg4KBg4SDhIKEgoGBgoGCgn9+gIF/fn1+fn5+fX59fXp7fIWEe3tzeXp8cHd1dnd5dXR6hISBhISDhIWFhoSDg4WEgoODgoCBf39/f4B9fX1+f31+f39/fn1+fH19foF/gIB/gIB/gIGDgoGAf36AgH+AgYCBgH9/f39/f4CAgIGCgoKBf4CDgn9/g4J/f4B/gX+Af3x7e3p8e3yCgH+Cf3+AgIKCgYF/f3+BgH6BgoKDgYGDg4KEgoSCgYGBf4GCgH6AgH9/fX5+fX19fn19e3t6gH94fHZ5eXtxdHh3dnh1cnmFhYKEhIKEhYWGhISChIOBg4GAgIF+f4B/gHx9fX6AfX5/f39+fX98fn5+gX+Bf39+f4B/gIOCg4B/f4GBgIKBgYGAgICAgIB/gIGAgIKDgYF/gISAfYGDhICAgX+BgYKBfXp7e3x8fH9+f4B9f399fYGAgH59fX9/foKBgYKBgIKCgoKBg4KCgYB/gYKAfn9/fn99fX1+fX19fX19ent7fHZ9eXh5enJ1eXl2d3dzdYaFg4WEgoSEhYSEhIGDgoGDgX+AgX5/gH6AfX19foB+f4B+fn99f3x/f3+BgIF/f3x+gH6AgYKDgYCAgYOEgoGAgYB/gYCAgYGAgYGBg4KBgX+Ag4B+goOEgICCgYKChIJ+e3t8fHx8fX1+fXp+fX14fn9/fHx8fn5+gYCBgYCAgoGBgYGDgoGBf4CAgoB9fn19f319fX59fH19fX16e3p8dnx6d3t4cnZ5e3Z2dnN0hoSEhYSChISFg4ODgYOBgYOBgIGBfX+BfoF9fX1/f39/gH5+f359fYB/gIGBgX9+fH5/fn5/gYJ/gYGCg4eFgX9/fn6Af4CAgICAgIKCgYCAfoCCf3+BgoOBgYOCg4OFgn99fX18e3x8eXp7en55e3l4f357fHt+fX1/f4F/gH6BgICAgoOCgYF/gIGBf31+fH1+fX19fX18fn58fXx5e3x4enx3endzeHd6c3Z2c3SGhISGg4KDhISDgoKCg4GCgoGAgYF9gIB+gH1+fX5/gIB/f39/f3x/f3+BgIGAf359f39+fn+BgH2AgIGDg4N/f359fn5/f4B/gIB/gYKBgH9+f4F+f4CCgYCBhIKEhIaEgH59fHx8fHp5dnl5enl2eXZ+fHt7e359e399gH99fX9/f3+BgoGBgX5/gYF+fX18fX19fX19fXx+jYF8fXl7e3p5fHd4eHR1dXhyd3d0doaEhIWEg4ODg4OCgYKDgoGDgn+Bf35/fn+AfX19fH6AgIB/f39/fIB/f4GAgYCAf3yAf35+fn9/fX5+gYGCgn5/fn5+fn5+f3+Af32AgIB+fn5/gX5+gIKCf4KDgoOEh4SAgH58fXx8e3x1eXl4eHh5d3t8e3t7foV9fn1/ent+fn59foGAgIGAfX6BgH59fXx9fX19fX18e32Dgnx8ent7e3p7d3Z4dXJzdnB4eXJ4hYWFhYOEhIOChIKBgYKBgIKBgIF/fn5+foB+fX58foCAgH+AgIB7gH6AgH+BgIB/fYF/fn5/f319fX6AgYKBfn9+fn59fX5/fn9+fH6Af35+fn+Cfn6AgIF+gYOCg4OGhICBfnx9fHx7fHh3e3h1eXd3eXx6e3t9kod9fH13en1+fn19f35+gH98foB/fn19fH19fX19fHt8ent9enp4e3x6ent4dHh1cXJ0cHh4cXmEhYWFg4SDgoODgoGBgoKAgoGAgIB9fn5/gH18fnyAgIGAgICAgHyAf4B+f4GAf39+gX9+f39/fX18f4CAgIB+f35+f318fn9/f358fYB/fn1+gIJ/foCAf36ChIKCg4WFgoJ+fX17e3x8eXd8eXd4d3d4e3t7e3yFin17end6fH19fHx9fX1/fnx9fn59fXx8fX5+fX18fHt6enx7e3p5enp7enhzd3VxcXNveHdxe4WGhYWDhYKBg4OBgoGBgoCBgICBgH5/fn9/fXx+fYCBgoGAgIGBfX6Af35/gX+Af3+BgH+Af319fH1/gICAgH9/f35/fXx+f39/f319f39+fn6CgYF/gIB/foGDgoGEg4SCgn5+fHx6fHt7eXt6d3N2d3h5e3p7eXp/fnt7d3p8fXx8fH59fH19fH19fXx8fX19fX99fXx9e3l7fHx7enp6enp6eHN2dXBwcm93dnJ7hYaEhYOEgoGDgoKBgYGCgYKBgYGAf4B/f399fX9+f4CBgYJ/goF9foF+fn+Bf4B/gIJ/gIB+fH58f3+BgICAf4B/f4B+fX5+f4B/f39/gH9/f4J/gICAgIB/gYGAgISBgoKAf39+f3x9fn56fYV+dHx9enp6enx5eXp6hoV3eXx8fHx8fXx8fHx8fX19fHx9fX19fn19fX16eX18fH16enp6enp5c3V1b29xb3d0c3yFhoOEgoOCgYKBgoKCgYKBgYGCgYCAgICAgH59gH+Af4GCgn+CgX+AgX5/gYB/f4CAgn+Bf319f35/f4KAgICAgIB/gIB+fn1/gH9+f4B/f39/gH+AgICAgH+AgYCBgYGCgYCAf39/fn1/fnqBk416fH18e315e3p6eHmBgXh5e3x8fXx8fHx8fHx9fX18fH18fn1+fn59fHp8fHt8fXt5enp6eXl0dXVvb3Fwd3N0fYWGg4OCg4KAgYCCgoGAgYGCgYKBgYCAgIGAfn6Af4GAgYKCgIKCgICCfoCBgX9/gX+BgIF/fH6Af3+AgoCAgICAf3+AgH9+fX6Afn2AgH9/f3+AgICAgYCAf4CAgYCBgYKCgICAf39/fX5/fIGGiXx8fnt7fnl6e3p7jn53d3l7fHt9fHx8fHt9fH19fX18fXx+fn5/f358enx9e3x9e3l6e3p5eXN0dW5zcXB4cnV6hYaDg4KDgoCAgIKCgX+CgYKBgoGBgYKAgYF/fn9/gYGCgYKBg4OAgYJ/gYGBf4CAgIB/gX99f4F/gICBgICAf4B+gICAf359foB+fn+Af39/gH9/gICBf4CBgH+BgIGCgoKAgICAgIB9foB9gIOCe35+e3x9e3p8fHyHeXh4eXx8fH17fHx9fX18fH19fn19fX5+f3+Af317fH18fHx7enl7e3l5c3J1bnZycHhxdXaFhYOEg4KCgYCBgoF/gIKCgoKDgYGDgoCCgYB/gICCgoKBg4KEhICBgX6BgoF/gICAgH+Cf36AgYCCgICAgIB/gH+AgIB/fn2Af39/f4CAgH+AgH+AgYGAgICAgIGAgYGBgYGAgYCAgH9/gH5/fX59fn57fXx9fHx8eHh1eHh5e3x8fXx7fHx8fX5/f39/fn19fn9/gIGAf3x9fHx9e3p7eXp8eHpzcnVud3FxenF2d4WFg4SDg4KCgYKDgICCgYSDg4SBgYOBgoKCgYCAgIKDgoCCgoSDf4GAfoKDgICBgICAf4CAf4GBgIKAf4CCgH9/gICAgIB/f4CAgH+AgICAgIB/f4CBgYCAgYCAgYGAgoOCgoCCgYGCgYB/gIB/gId+fnx7fXx7fX94d3Z5eXp8fXx8fXt8fH19fn5/gIGAfn1+gICAgoGAfH59fX58d3t6ent5eXNxdW53cHV6cXZ5hYWCg4KDg4KDhISAgIOBhoODg4GChICEg4KCgICCgoSBgYKBg4J/gIB/gYOCgYCBgYCAf4GBgYGAg4B/gIOCf35/goGAgH9+gYCBf4CAgYGBgYCAgIKBgYKBgX+BgYGBgoOCgoOBg4OCgYCBgH+AhH19fXx/fXp9f3t5dnp4eXt7fH19e3x9fX19fn+AgYGAgH+AgICDg4B9f35+fn15eXt6enp5c3J1b3dxd3lzd3uFgoKCgoOEgoOEg4CAg4OGg4ODgoKEgYSDgYOAgIKBg4GCgoGCgX6AgICCgYKCgYKCgIGAgICCgoGEgH6Bg4J/f4CDgoCBf4CCg4KAgYKBg4KDgoGBg4KChIGAgYOBgYKEg4KEhIODhIODgYGBgoCCf4B/fYB8enx/e3t3fHl5eXt6fX59fHx8fH1+foCBgYCAgIGBgYSEgH2Af39/f357e3t6e3p0cHhyeXR2eHR3e4SCg4KDg4SChIODgYKDhIaEgoOCgoSBhIOBg4CBg4KCgoKCgIKAf4GAgIKBgoGCgoKBgIGBgYKCgoOAfoGDgX9/gYSEgYN/goKBg4KCgoGEg4OEgYKEgoOCgoGCgoOBg4SDhIOEhISFg4SCgYOCgoOBgYGAgH58fIB9fHh8eXp5enx9f3x7fHx9fX18fICAgICAgYGBgYKBfoGAgICAf3t7e3p6enVweHd5dnV8dXZ8gICDgoODg4OEhISAgoOGhYWDg4KDhIKEhYKCgYKDg4GCgoKAgYB+gYCBgYKDgoKCgoGAgYKChIKCg4B/gIKBgICChIODgoGCgoGDgoKDg4ODg4SAgoSDg4OBgX+Bg4KDhYKEhISEhISDhISChIOEhIKBgoGBgHt9gX59eXx6enp9fHyBfXp8fH19fHp7fn5+gIB/gYGAgICAgIKBgIB/fX18fX18dnJ2eHh2dH92dX2Hh4OChIWDg4SFhICChYWEhIOCg4SEgYSFg4KCgoODgYOCgoCCgH2AgIGCg4KCgoKEgoGCgoOEgoKBgICBgoGAgYOFhIOCg4CCgoOCg4ODg4OEg4CCg4KEg4KCfoOBgoSEgoODhISEhIOEhIOEg4WEg4ODgoKAe4CBf3x8fXp6fH2AfX9/fHx6fH59fX19fn5/f39/gICAgH9+foCBgICAfnx9fX5/fn18fHh2f3Z3f4SHg4KDhoODhIaEgYKFhoWEhIODhISChIWFgoKDg4SCg4KDgoKBfoCAgoKDgoODg4SCgoKCg4OCg4GCgYGDgn+ChISDg4KEf4KEg4ODgoSDg4SCgIOEg4SDg4KCg4KChIOCg4OEhISEhIWEg4OEhYSFhIOBgoB9gYKAfXx8e3x8gH19foB+fn1/fnx8fX19fn5/fn+BgYGBgH99fX6BgYB+fn19fX59fX5+f3+AfH2AgYKCg4OGg4SDhoSBgoiHhYSDg4SEhYGFhYWDg4SDhIODgoOCg4F+gYGDg4SCg4OEhIOCg4KEg4ODgoKDgYOCf4KDg4ODgoOAgoWDg4ODhIODhIOBgoSEhYOCgoODgoGEg4GDg4SDg4SEhYSEhIWFhYWEg4ODf32BhIB9fXx8fHx/gX5/f39/fX99e3x9fX19fX5+f4CBgIGBgH59fH6Cf39+fn5+fX1/f39/gICAf4CEhIODg4WDhIOFf36CiouFhYSDgoOFgYaGhoOEhISEhIODg4OEgn+BgYODhYSFhIWEg4KEhISFhIODgoSDhYKBhISFhYaEgoCDh4SDg4OFhIWFhIGEg4OHgoOCg4GCgYSDgoODhYODhIWEhYWHh4aHhYSEhYSBf4GDf35+fH5+fX+BgH9+fHx/f358enx9fX19fX5+fn9/gIGBf319fIB/gH5+fn5+f3+BgYGBgYKAgYWFhIOEhIKEg4aAgoWFiomEhISEhYWCh4aGhISEhIWEhYSEg4SEgYKDg4OEhIaEhYSDg4SEg3yDhHuBhHd5g4F9hH5+cnWDgoF2foOFgH2BdYF6hH9/f3+FhIKDg4KBg4SDhISFg4SFhoSFhn2EeXx+f4N7hYOBhIOAf31+f31+gYOBfXt/fX6Afn18fHx9fX19fH19f4B/gYJ/fX18f4GBgICAgH+BgYGBgYKDg4KChoSEhIWEgYOEhYOEhYSKiIWFhYOFhYSGhoaDhISFhYWEhYWEhIWCgoOEhYWFhoSFhIOEhYWCaICFanx7cXF8gXOGc3R0fYKDdXNxg4ZzcHVyc3SDdnt9dYF/goOBgnZ5hYCDgIR/hYSChYWCaHpyc3N8gHKBg3+Dg32BfX5+fX6Cg4F8f4F9f4B9fXx8fHx9fHx8fn1+gX+BgX99fX2AgYKBgYGBgIGBgYKBgoKCgoSHhIWEhYSBgoSGhoOFg4aIhoaFg4aGhoeGh4OFhYaFg4KFhoSFhYODg4SEhoaGhIaEg4SFhn1xe4FweXZ+g3+CbnlwdXN8dnl5hnKEg3B2eHF2dHR1cnN0dml/gG5yb3R2bnVsd217c26Ah3ltfXJzdnN2bW53bHB5bHV9f398foGAgX2Af32Af4B/fX18fHx9fH1+f32Af4CAfnx/foCBgoCBgICAgYCAgIKDgoKEhYeGhoCChYODhYeGg4WFhYaHh4SDhoaIiYaHhIWGiIeEg4WGhYWEhIOFhIKFhoaFhoWEhoWHdnB0e3BydX+HhYNtdW92b3x1coR5eYd4cXR3bndod3pucHaCcoN+b3p5eW1vbnpvb213fXiGcHF6cHJ0ZoF1fm57eXNveX+Af31+gYB/e39+fIB+gIB+foCAgYB+fn9+foF/gH9+fYB9f4CBf4B+fn+BgH9+goOCgoSFh4eEfoeEg4OFh4aEhoWFhoaIhISGh4iIhoeEhoaLioWEhoeHhYOFhYWEgoWFhYWGhYWGhYZxdXByc29zenl+hHSIdHV+iHZugnKEhnluanJ/cW1zd3x/dXR8hH54cXV3bnl1enF2eHV6eYRyaW95eHBreXN6b3p3dnZwgYB/fn5/f356fn18f31/f359gIGDg4CCg4GBhIGBf4GBgH1/f4F+f35+f4GAfn6BgoCAgoSHhoODhoSFhYaHhoWFhYWGhoiFhYaFh4eFhoSGhomIhYSJi4iGhIaFhYWDhYWEhoaGhoaFg3iLeXKIentwcIWEeIV4eWtzfnl7a3KDh4N6fG16eXl0fYB2bm+AgG90fHV3cXl9fW1+dW+DhYZ6gHJye3x1cG96a3N8bnaCgYF+fn99fXp9e3x9fX9/fn1/f4KCf4GDgYGDgYB/gICAfn9+f31/fn1/gH58fYGAfn6Ag4iEhoSFhYWFhoeFhYWFhYeHiIaEhoWGhoWFhIWFhIWFhomKh4WEhoWGhoWGhoSGhoaGhoWGh4eHhoaEhoWGh4iHhYeGhoOHhoWFg4SFhoWGhIaEg4SEhoSEgYODhISFhIWEhYSGg4WGhYWEhIWHhoSEhYaFhX13hoOEhIOCgX1/fnt8e357fHx9f359fH9+gYB9f4F/f4GAfn5+gH5+f35+fX99fX5/fHt8f358fH+BiYaFhIaGhoWGhoWFhYWGhoeIhoSGhYeGhYWDhIWGhYSGhoaGhYSGhIWGhoaGhIeGh4eGhYeIiIiIhoSHhYaGiIaFiIeIhYeGhoiFhYaHhYaGhYOChYWGhYWDhYSEhIWEhoWEhYWDhoaFhYWEhoeGhISFhoOFhIKEg4OFg4OBfYB/e3t8fnt8fH1/fnx8fn2Afn1/gH5+gH99fXyAfX5+fn5+f3x8fX57fHx/fHt7fn+Ih4SEiIaGhYeGhYWEhoaGhoiHhIWGh4aFhIODhIaFhIeFhoaFhYaEhYaGh4eFh4aJiIaGiIeIiYiFhYiFhoeGh4aHhoeFh4eGh4WFhoeFh4aFgoOFhoaEhIOEhIOEhoSGhYWFhYOGhoWGhYSGhoWEhIWFg4SHhYOCg4SDhIJ+gYB8e31+e3x7fn59fHx+fX5+fX9+fX1+fnx9fH98fn58fYGAfHx8fXx8fH56e3t8foiHgoWIh4eGhoaGhISGhoeGiIaEhYSHhoSFh4OEhYSFh4SFhoaFhoSGhoeHhoaIh4mIhoaIh4iKiIWHiIWHh4WHhoeGh4WIiIeHhYaGh4WGhoWBhISFhoWFhISEg4SFhIaGhoWGhIaFhoaFhYaGhYSDhISDg4eDhIGChISDgoCAgHt7fn18fHx+fXx8fH19fH18fn18fX18fHx8fXx+fXt8gX99fH18fnx8fHp6fHx9iIeChoiHhoeGhoaEhYaFhoaGhYOFhIaFhIiJg4GEg4SGhIaGhoaGhIeHiIiHh4eIioiGh4iHiImIhYiHhYaGhoeHh4WHhoiIh4eFh4eHhYaHhIKEg4SGhYeFhISEhISFhoaGhoaFh4WFh4WGhYaFhIOEg4OEh4GDgIKDg4KCgn+Ae31/fXx8fH59fH19fH57fHx7fHx9fXt7e318e359e3x/fX18fX1+fXx6ent7fHyIh4KGhoaGh4aGhYSFhoWFhYWEg4WChoSDiId/enqChYaEhoaFh4aEh4eIiIiHhoiKh4aHh4eIiYeFiIeFh4eGhoeHhYeGiIiHhoWHh4iGhoeDg4SEg4aGh4WFhISEhYaGhoaGhYaHhoaHhoaEhoWDg4ODgoOGgYN+goKDgIOCf398f39+fHx9f318fX18fXt7e3p7fHx8e3t7fnt7fXt6e358fHx8fX5/fXt6fHp8fImHg4aFhoWGhoWEhIWFhYWFhIOBhIGGhIKEhHyAhn+ChYWGhYWGhYSHh4iIiIaFiYqHhYeGh4eIh4WIhYaHiIaGh4eGh4aIiIeFhoeGh4WFiIOEhoWDhoaHhoWEg4WFhoaGhoaFhoaHhoeHhYOFhYOBgoKBhIWCg36BgoF/g4F/fn5/fn98fH1/fXt9fXx9enp7eXt8fXt7e3t+fHx8fHp7fXx8fHx+fYF8e3t7e3x7iYeEhoSGhIaGhYSFhoWEhIOEgoCDgYaDgYJ/eoSMe4CEhYeGhoaFhIeIh4aHhYWHioeEh4WGhoiGhYeFhoeIhoaIiIeHhoeIhoSGhoaHhYWHg4SFhIeGhoeFhISDhYWGhoeGhoWGhoaFhoaEg4SFgoGCgYCEg4OCfYGBf36DgX5/f4B8f3x9fX59e319fH15enp5e319enp7e318fXx8enp9fHx9fH5+gHt7e3x+fXyIh4WGhYeEhoSFhYWFhYODgYOBgIKBhYJ/gH9/fXx7gYSFhoaEhYSEh4eGhoaFhIaJhoKGhIaGhoWFh4WHiImGhYiHiYeGhoeFhIaFhYeFhIeDhIWEiIaGh4WFhIKFhYaFhoaHhIaGhoaFhoKDg4WAgIGAgIOBg4B8gYB+foKAfYB/gXx/fH1+fX57fn18fHl6enl6fX15ent7fHt8e3t6e319fH18f35+fHt7fX59fIiGhYaGhoSFhYSFhYSDgoKAgoGAgIGDgn5+foB5en2Ag4OFh4WEg4OHhoOEhYSChYiFgoSDg4WFhYWHh4aIiIWFiIeJh4aFhYWDhoSFh4OEhoSEhYSHhoWGhYaEgoWFhoaGhoaEhYaGhYWFgoKDg39+gICAgYCDgHuBf31+gn5+gH6Afn99fX59f3t/fXt6eXp6eXp8fXl6ent7enx7e3t7fH19fXyAfn18fHx/fnx7h4WFhoaGhoSFhIWDhYKBgICAgYB+f4KCfX5/f3t/f4KDg4WGhYSDg4aDgYOEgoCFh4WCg4GBhIWEhIaGh4eHhYWIhomHhYSEhIKFg4SGgoOFhIWGhIeGhYWFhoOEhYSFhoWGhISFhIWDhYSAgIKDf35/f39/gIN/fIB+fX+CfYCBfn6Bfn5+fX1/e398e3p5enp5ent8eXp6e3t7fHp7e3t8fX59fYB9fXx8fYB/fXyGg4aGhoaFg4SDhoKFgYGAf3+AgH5/gYJ9fn9/foCAgoKChISDg4GChIGAg4KBgISFhIKBf4CCg4OEhYWHhoaEhYeFh4WGgoOCgoOCgoWBg4WEhIaEhoaHhoaFgoSEg4SGhYWDhIODhIKEhIB/goJ/fX5/fn5/hH57f3x8gIF9gYB9foN9fn59fX57fnt7enl7enl6ent5enp6e3t8enx8fHx+fn1/gXx9fHx9f4B+gIaEhYWEh4SEg4KGgoOAgYB+fn+AfX9/gXx9f39+fn+BgYKEg4KBgYKCf4CBgoCAgoWEgoB/gIGCgYOFhYeFhISGhoOFg4WBgoGBgoGCg4GChISEhYWGh4eGhYWEg4ODhIWFhIGDgYOChIODgH+AgX59fX5+fH6Dfnx+fHyBgH6Cf35/gnx/fn19fHx8e3t6enp6eXt5enp5enp6e3x5e317e35/f4GAfX59fX1/gICAhoSEhYSFgoSCgoSCgoCBgH59fn9+fn6AfX2Af35+foGBgoODgoSHgYF+gICBf3+ChIOBf35/gIJ/goWEhYOCg4WFgoSBg4CBgIGBgYKBgIGEg4OGhYWHh4WEhIWCgoKDhYSCgYGBgYCFg4F/foB/fnx9fn18foN9e358fYF/gIN9fYCBf35/fXx8fH17e3p5enl5e3l6enl6ent7e3p7fXx8f3+BgoB+gH+AgH+AgIDKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzNzc3Nzc3Nzc3NzczMzMvLy8vLy8vLy8vLy8vLzMvLy8vLy8vLy8vLy8vMzMzMzM3Nzc7Oz8/Pz9DQ0NHR0dLS0tLS0tLT09PT0tLS0tLS0tPT09TU1NTU09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tLS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1dXV1NTU1NTT09PT09PT09PT09TU09PU1NTU1NTU1NTU09PT09PS0tLS0tPT09TU1NTU1NPT09LS0tLS0tLR0dHR0dPHhnNlYFtLWWdVTUZIQD03Nzg5Nzw8PDo8Oz42Oj04PDs6OTg3ODs7Oj87PTs8PD47P0E/QkJBQ0RFREE+PTw7QENDQUBDQ0FBR0hHSUtSwtXS09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXVysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMy8vLy8vLy8vLy8vLzMzMy8vLy8vLy8vLy8vLzMzMzc3Nzc3Oz8/P0NDQ0NHR0tLS0tLS09PT09PT09PT09PS09PT09TU1NTU1NTU09PT09PT09PT09PT09PT1NTU1NTU1NTT09PT09LS0tLS0tLT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1NTU1NPT09PT09PT09PU1NPT09TU1NTU1NTU1NPT09PS0tLS0tPT09PU1NTU1NTU09PT09PS0tLS0tLR0dHSzIxyZ2BcTVllUktHSz87Mzc4Ozg5Pj05PDpBOjs9Nzs8PDo6Nzg6Oz0/Oz88PTw/Pj9BPUFBPkNDREJAQT46Oz9DREFDRERCQklHSEhJTr7V0tPT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1crKy8vKysrKysrKy8vLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzMzMzMzMy8vLy8vMzMzMzMzMzMzLy8zMzMzLy8vLzMzMzc3Nzc3Ozs/P0NDQ0NDR0dLS0tLS09PT09PT09PU09PT09PT09TU1NXV1dTU1NTT09PU1NPT09PT09PT1NTU1NTU1NTU1NPT09PS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1tbV1dXV1dTU1NTT09PT09PT09PU1NTU09TU1NTU1NTU1NTT09PT0tLS0tLT09PU1NTU1NTU1NTU09PT09PT0tLS0tHR0s+Sd2hfXk9XZ01LRks9ODc2NTk5OTw+OT88Qzo7PDc5PD07OTc5Ojw9QDs+PT47PD48PT5BQD5EQ0NDP0E9Ojs9QkNFQ0NEQT9FSEpJSky61dPT09TU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8rKysvLy8vLy8vLy8zLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMzMzMzMzMzMzMzMzMzczMzMzMzMzMzMzMzMzMzc3Nzc3Ozs/Pz9DQ0NDQ0dHS0tPT09PT09PT09TU1NTU09TU1NTU1NTV1dXU1NTU1NPU1NTU09PT09TU1NTU1dTU1NTV1dTU09PT09LS0tLS0tLS09PT09TU1dXV1dbW1dXV1dXV1tbW1tXV1dXV1NTU1NTT09PT09PT1NTU1NTU1NTU1NTU1NTU09PT09LS0tLT09PU1NTU1dXV1dTU1NTT09PT09PT0tLS0dHRmn5nYWJOVWpKSElLPzw6OTM3Njc2PTs+Oj06Ojo4ODo7Ozg4Ojs7PD46PT09Ojw/PD0/QkA/Q0RDRD5APT08QENEQ0JEQkQ+REhJSUtMttfT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3MzMzMzMzMzMzMzMzNzc3NzczMzMzMzMzMzMzMzc3Nzc3Ozs7Pz8/Q0NDQ0NHS0tLT09PT09PT1NTU1NTU1NTU1NTU1NTV1dXV1NTU1NPT1NTU1NTU1NTU1NTU1dXV1NXV1dXV1NTU09PT09PS0tLT09PT09PU1NXV1dbW1tXV1dbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1NTU1NTU1NXU1NTU1NTT09PT09PT09PU1NTU1dXV1dXV1dTU1NTU09PT09PS0tLR0p+DaV9kU1hsSEhIS0A9Nzg0NzY6Oj87RDw8Ojw8OTg6OTo6Ojs8Ojo7OT49Pjk9QDs/QUFCP0JCQUM9Pz8+PEBCRUNDQkBBO0ZJR01MSbLY09TU1NTU1NXV1dXV1dXV1dXW1tbW1tbV1dXW1svLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzM3Nzc3Nzc3Nzc3Ozc3NzczMzMzMzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc3Mzc3Nzs7Ozs7Pz8/P0NDQ0NHS0tLS09PT09PT09TU1NTU1NTU1NTU1NTV1NXV1dTU1NTU1NTU1NTU1NTV1NTU1dXV1dXV1dXV1dTU1NTU1NPT09PT09PT09PU1NXV1dbW1tbW1tbW1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTV1NTU1NXV1dXU1NTU1NTT09PT09PT1NTU1dXV1dXV1dXU1NTU1NTT09PT09LS0tSjiGxfZlJWakdIR0lBPjM2Njo7PDhDPEJBPjtBPDg5Ojw6Ojw8PDk8PTo7PD09PD89QD9AQT9AQUBCPD4+PzxCQ0NDRkBBQT1ISklOTUeu2NPU1NTV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbMzMvLy8rKysvLy8vLy8vLy8vMzMzNzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzs7Ozs7Oz8/P0NDQ0NHR0dLS0tPT09PT09TU1NTU1NTU1NTU1NTU1NTV1dXV1dXU1NTU1NTU1NTU1dXV1dXU1NXV1dXV1dXU1NTU1NTU09PT09TU1NTU1NXV1dbW1tbW1tbW1tbW1tbX19bW1tXV1dXV1dXV1dXV1dTU1NTU1dXV1dXV1dXU1NTU1NTU09PT09PT1NTU1NXV1dXV1dXV1dXV1NTU1NPT09PT0tLWroprY2VSWGhMSkdJQjg0OTQ6Ozo5QDk+Q0U/PDw5OTk9Oj07PDw6PTw7OTw9Ozs/PUA9PT5AQD9CQT5APD05QERDQkFBQj48SEpLTU5IqNnU1NXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbWzMzQ0dDQ0NDQ0dHR0dHR0c3Ky8vLzMzMzMzMzMzMzM3Nzc3Nzc7Ozs3Nzc3Nzc/Pz8/Pz8/Pz8/Pz9DQ0dHR0dHR0dHR0dHS0tHV2djY2NnZ2dra2tvb29vZ2dnZ2dna2tra2tra2tjW19fX19fX19jX19fX19XV1dXV1dXV1dXV1dXV2Nvc3dzc3Nzd3Nvb29vb2tra2tra2tra2trb3NzX1dXV1dXV1dXV1dXW1tbX1tbW1tbV1dXV1dXV1dXV1dTU1dXV1dXV1dXU1NTU1NTU1NTU09PU1NTU1NXV1dXW1dXV1dXV1dTU1NTT09PT09PS1bqKa2hoUlhlSUlMTkA5OTo0O0E8Nz05QUM9QD89ODo6Ozk9Oz4/Ojs8PDo7PDo7Pj1APT8/P0FAQUE/QTw8Oz5BRENBREA9PElJSk1ORqPa09TV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbW1szNloSGhoaGhoeHh4eHh4Ky4t3d3t7e3t7e3t7e3t3S0NDQ0NDQ0NDQ0NDQ0ci5ubm5ubm5ubm5ubq6t6WkpKSkpKSkpKSkpKSnhmBjY2NjY2NjY2NkZGRlhIuKioqKioqKioqKioemuri4uLi4uLi4uLi4uLrR1NTU1NTU1NTU1NTU2K58gYKCgoKCgoGBgYGBg4uKioqKioqKioqKiouHvebh4uLi4uLi4uLj4+Pi2NfX1tbW1tbW1tbV1dXV1dXV1dXV1dbW1dXV1dXV1dTU1NTU1NTU1NTV1dXV1dXW1dXV1dXV1dXV1NTU1NTT09PT09XDkXFrak5TYkxMVk08Ojo3Nz5DPjg+Oj8/QTw/QDc7Ojs7PTs+Pjo7PD48Oz07PT8+QDw/Pz1AQEBBPj88PjxAQUVCQkZAQD9HSEpLT0ae2tXV1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19fMzm5QU1NTU1NUVFRUVFNMoPPr6+rq6urq6urq6uvp1dLS0tLS0tLS0tLS0tTEqaqqqqqqqqqqqqqqq6aGhIWFhYWFhYWFhYWFik4MEhISEhISEhISEhIRE0pUU1NTU1NTU1NTU1NPg6ejo6Ojo6Ojo6Ojo6KmztPS0tLS0tLS0tLS0tmRO0RERERERENDQ0REQ0ZTU1NTU1NTU1NTU1NTS6ry6+vr6+vr6+vr6+vr6dnX19fX1tbW1tbW1tbW1dXV1dXV1dbW1tbV1dXV1dXV1dXV1dTU1NTV1dXV1dXW1tXV1dXV1dXV1dXU1NTU1NTU1NPUy5h2bGlKTl9NUlVNPjw8Nzs/Qz42Ojc+Pzs8QkA4PDk9Ozw6PD07PTs9Ozs9PD0+PT07QT08QUBBQT08Pzw7QEJDQURFPUFAQ0ZLS09GmNzV1dXV1dbW1tbW1tbW1tbW1tfX19fX19fX19fXzM5xVFhXV1dYWFhYWFhXUKHx6enp6enp6enq6unq6dXS0tLS0tLS0tLS0tLUxaqrq6urq6urq6urq6yoiIeHh4eHh4eHh4eHh41SEhgYGBgYGBgYGBgYFxpOWVdXV1dXV1dXV1dXU4WopKSkpKSkpKSkpKSkp83T0tLS0tLS0tHR0dLZlEBISUlJSUlJSEhISEdKV1dXV1dXV1dXV1dXV0+r8erq6urq6urq6urq6unZ19jX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dXV1dXV1dXU1NTU1NTU1NGcenFpSlRdT1JVTkQ+Pzs/QEA4Ojs4PDw8PD46Ojs4Ozk5Ozw7Ojw5Ozs8Ozo9PT0+PUE/Pj8/Pj08PT88PEFBQ0FERTw+QEVGSktNRpPc1dXV1tbW1tbW1tbW1tbW1tfX19fX19fX19fX183OeF5hYGBgYGFhYWFgYFqk7ufn5+fn5+fn5+fn5+bV0dLS0tLS0tLS0tLS08Wtrq6urq6urq6urq6vq46NjY2NjY2NjY2NjY2SXSInJycnJycoKCgoKCcpWmNiYWJhYmJiYmJiYl6MrKmpqampqampqampqazO09LS0tLS0tLS0dLS2ZlNVFRUVFRUVFRUVFVUVmBiYmJiYmJiYmJiYmJbr+/p6enp6enp6enp6enn2djY2NjY19fX19fX19fX19fX19bW1tfX19fW1tbW1tbV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbV1dXV1dXU1NTU1NTWo3txZElbYE5OVU9AQT89REI+Oz06OTs6PTw7PDs6OTg5OTs8Ozw8Ojo7PDo7QD08PTxAQTxBQTs7PEA/PD1CP0RDQ0U8PkJERkpMTEWN3NXV1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjNzcfFxcXFxcXFxcXFxcXEy9DPz8/Pz8/Pz9DQ0NDQz87Ozs7Ozs7Ozs/Oz87NzMzMzMzMzMzMzMzMzMvJycrKysrKysrKysrKysfCw8PExMTExcXFxsbGxsvMy8zLzMzNzMzMzMzLz9HR0tLS0tLS0tLS0tLS1dXV1dXV1dXV1NTU1dXQy8vKysrKysvLysvLy8vNzc3Nzc3Nzc3Nzc3NzdTY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NfX19fX19fX1tfX19fX19bW1tbW1tbW1tXV1dXV1dXV1dbV1dbW1tbW1tbW1tXV1dXV1dTU1NTU169/cF5GXmJQUVdOR0ZDQ0lBPz07PDo8N0BBPD04Ojo4OTg7Pzs8PDs7PDw8PD87PD46Pj44PkI8Pj1BPjw+QkBERUNAPD5APkNJSUtEh9zV1tbW1tbW1tbW1tbX19fX19fX19jY2NjY2NjYzs3Pz8/Pz8/Pz8/Pz9PPz87MzczP09LSzs3P0s7Ozs7Ozs7O09TQz87S1M/OztPTz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0NDR0dHR0dHS09PU1NTU1dXV1tbW1tfW1tbX1tfX19fX19fX19bW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dTU1NTU1dfX19fX19fX19fX2NjX2NjY2NjZ2dnZ2dnZ2dnY19jY2NjY2NjY2NnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjX19fX19jY19fX1tbW1tbW1tbW1tbW1tbW1dbW1dbW1tbW1tbW1tbW1tXV1dXV1NTV1di4gm9XSl9jUlFaS0hBQTxCPT07Oj4+PD4/PT0/ODk6OTk3OD48PD47Ozw7PDs/PT0+OTs7OT0+P0A+QD07OkI/QkNCPz0+QD5CRUdKQoDc1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2M7Ozs7Ozs7Nzc3Nzsqfys3Nzc3QuYOEi8fTwJrLz87Ozs7O0KaSxdHSqKDQz9GkodDOzs7Ozs7Ozs7Ozs7Oz8/Pz8/P0NDQ0NDQ0NDR0dHR0tLT09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbV1dXV1dbW1tbV1dXV1dXV1NTU1NXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NfX19fX1tbW1tbW1tbW1tbW1tXV1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXYwIBuVU9gY1dZW0xMQ0A9PTs9Ojw9Qj5CQkA8Ojg5ODo6Ojc7Pz4/PDw7PDo5Pzw8PTg5PD9BPj09PUFAPTtBQkBCQz47QD9BQUlHSkF629bW1tbW1tbX19fX19fX19jY2NjY2NnZ2djY2dnOzs7Ozs7Ozs7OzdKpj63Rzs7Ozpu3tqSiwJOerNPOzs7O0qqdrJTOs56jp9avn6Gp0s7Ozs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0dHS0tLT09TU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dbW1tbW1tXV1dXV1dXU1dXV1dXV1dXW1tbW1tbW1tbW1tfX19fX19jX19fY2NjY2NjY2djY2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2dnY2NjZ2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV18h/b1pTYWVeXVxPSkQ9QD8+PDc6Pjk/RD5AOTg3ODk7Ozw4OT89PTw9PD47OkE7OTs5OzxDQDw7PT5AQT49QkQ/QkM9PT8+Pz5ISUg/ddrW1tbX19fX19fX19fX2NjY2NjZ2dnZ2dnZ2dnZzs7Ozs7Ozs7Ozs/Inrym0tDQzsqgl36Cw6abr6fUz8/P0MmXmYWlq6Gak53AnpiVnMjQzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dLS0tPT09TU1dXV1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tbV1dXV1dXW1tbV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2djY2NjY2NnZ2dnZ2dnY2NjY2NfX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dbV1dXV1dfNiHNdWGloXl9gT0lGOkFAPj88PDk2P0I/Qjo2NDc6Ozo8Ojk+PD49PTs/PTxBPjw8Ojw8PTw6PEA9QEI+PkFCPUNDPT0+Oz9BRUtIQHDZ1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2c/Pz8/Pz87Ozs7SrKWnqdXAvNLHnY+ey9PJipmq1M/Pz8/RpLC9mouboZy0mJyinbCy08/Pz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0dHS0tLS09PT1NTU1dXV1dXV1dbW1tbW1dbW1tbW1tbV1tbW1tbW1tbW1dXV1dXV1dXW1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnY2NjY19fX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0JB1W1tqaWFeXVNOSTxDQEE+QD46OEVAP0M6NzQ5Ojo5Ozs4Oz0/Pj49QT08P0A9Pjw8PDw8Oj1AQD8/PT5CQD9AQkA8QD0+QUVLRz9r19fX19fX19fX2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnPz8/Pz8/Pz8/QzJ2Nl6zQmpfKxZ6ynpbN1q2ZqtTPz8/Pz9DVuZyHnZatuYaelq+zqtXQ0M/Pz8/Pz8/Pz8/Pz8/P0NDQ0dHS0tLT09PT1NTU1NXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX19fX19fY19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tKUcl5ea2tqZV1PTEc/RENDQDo9OzxCPD09OTY0Ojk5Ojo5Nzs/QDs8PUA8PEE+PD07PTw/PDo8Q0A+PTs9QD5CPkBBPkA9QD9GSUQ/ZtXX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2traz8/Pz8/Pz8/P07GigJuvyaCjv8qcpYynrdiqmarUz8/Pz8/Q0Zqij5yBoJZ4m4Sdk6TV0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1NXV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dbW1tXW1tbW1tbV1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbSk3BgXnBoZmVaUUhHQkVDQEA3Ojo8Pjo8OTc2NTk6Njo8Ozc8QEA8Ojo9Ojw/Pj08OUA8PDo6OT9APT08PUBBQz9APz5BOz9ARkpCP2LS2NfX2NjY2NjY2NjY2dnZ2dnZ2tra29vb29vb28/Pz8/Pz8/P0M6fkGyclteqo9PSrqa1mJ/Vqpmq1M/Q0NDQ1aekpaybqIiceZ+phZmk1dHR0NDQ0dHQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1dXV1dbW1tbX19bW1tbW1tbW1tbX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfW1tfX19jY2NfX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX1tbW1tbW1tbW1tbW1tbX19fX19fW1tbW1tbX0pNuYFxxZGdkWlVKQENGQ0FBODs/PD07PDw3NTU4OTY4Ozo5PDo+Pzw9PTk8Pz49Ojo+OTw6Ojg+Pzw9PTw+QEFDQT48PDpCRERKRkJd0NnX19jY2NjY2NjY2dnZ2dna2trb29vb29vb29vPz8/Pz8/Pz9G9n8O31pfA09HQ0srSzZeb1KqZq9XRz9DQ0sCdosy2ta+mnIq9raaYr9bR0dHR0dHR0dHR0NDR0dHR0dHR0tLT09PU1NTV1dXV1tbW1tfX19fX19bW1tbW1tfX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19fY2NjY2NjY2NjY2NjY2djZ2dnZ2dnZ2dnZ2dnZ2drZ2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fX19fX19fW1tfX1tbX19fX19fX19fX19bW19GRbF1cb2doYl1PRj9ISEdFQDw8Pj48PT08NzU2Ojk2OTs6Ojs4QD86PDw5PD49Ozs6Pzk/Ojs5PT49Pjw7PTxAQ0I/Pz47Q0ZGR0hEWc3a2NjY2NjZ2dnZ2dnZ2dna2trb29vb29vb29vb0NDQz8/Pz8/Pz5V+e6WS1KKa08ySl6ObodirmavV0pem09SkoI+5wKOXl52lp5aYm7vV0dHR0dHR0dHR0dHR0dHR0tLS0tLS09PU1NTV1dXV1tbW19fX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tbX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2tnZ2dnZ2dnZ2djY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX1tfPjGRWXnBrXGBgTkVITUlJT0M+OkI9PUBDOzU1Nzw6Nzo7Ojo7OT09OTo6OT0+Pz07OT47PDo8Ozk+PD47PD0+QENCPz5BPEFDR0ZGRVXJ29jY2NnZ2dnZ2dnZ2dra2tvb29vb29zc3Nzc3NDQ0NDQ0M/Pz9DR1aeZrcmjqL7KnbGdo7XZqZup2LirocjGpr2Vkaijq6Sb0J+rpJzR09LS0tLS0tLS0tLR0dHS0tLT0tPT09PU1NTV1dbW1tbX19fX19fX19fX19fX19fX19fX19bW1tbW1tfX19fX19fW1tbW1tbW1tbX19fW1tbW1tbW1tbX19fX2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2djY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fX19fX19fX19fY2NfX19fX19fYzYZdV2JvZE9dVEtIRlNRS0xAPj1EPD9DRj01NTc7OTY6Ozo8PTo7Pzo6OTg6PT0/Pjs/Oz49Ojs5Pjs9PD0+QURCQD8+PzxAQUVHRURSxdvY2dnZ2dnZ2dnZ2tra2tvb29vb3Nzc3Nzc3NzQ0NDQ0NDQ0NDQ0NO5gL3Tm5bP1LWLkZ/T1LyBu9TOlKDUyo6Tl5CoyZCNt9fCj4281dLS0tLS0tLS0tLS0tLS0tLT09PT09PU1NXV1dbW1tfX19fX19fY2NjY19fX19fX19fX19fX19fW1tbX19fX19fW1tbW1tbW1tbW19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2tnZ2tra2tra2tra29ra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2NfX2ct+WlVqaltMX01KTEpVTEZCPDw/R0VHS0g9NjU3Ojk3OTo7Ojw9OT45OTo4Oz0+PkE+PTk8PDo9Pj46PTk5Oj9FQUA+PT8/QkBHRURFUMHc2dnZ2dnZ2dna2trb29vb29vb3Nzc3Nzc3dzc0NDQ0NDQ0NDQ0NDQ0cHR0crI0tDUxLjS0tHSwtLQ08fM0tTCr7Cz0NXHw9XR1cXE1dLS0tLS09PT09PT09LS0tPT09PU1NTU1NXV1dbW1tfX19fX19fX2NjY2NjX19fX2NfX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29va2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2djY2NjX19fX19fY2NjY2NjY2NjY2NjY19rHd1xSZ2laTlpOTFBRV0VKPz89P0FFTExBPjc3NTs4ODk5Ojs8Pjw+ODo6OTs+P0A9Pj46NTo6Oz0/Ojs5Ojw+QkJAPz8/P0FCR0RDRE683dnZ2dnZ2dna2tvb29vb29vb3Nzc3Nzc3d3d3dDR0dDQ0NDQ0NDQ0NDS0NDR0dDQ0dPU0dHR0dPR0dHS0tHR1NbW1tLS1NXT09PU1NLS0tPT09PT09PT09PT09PT09PU1NTU1dXV1dbW1tfX19fX2NjY2NjY2NjY2NfX19jY19fX19fX19fX19fX19fX19fX1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tvb2tra2tra2trZ2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2trZ2tra29ra2trZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjbwXNYVWlrU0xSTlBSWVRGSTw+Qz9BQkVKPj43ODY5Njc4OTk7Oz0/QDw9ODk7Ozs/Pjw8OTU6PT47OTk7PD8/P0JCQT1BPUBBQkZCQkJLtd7Z2dra2tra2tvb29vb29vc3Nzc3Nzd3d3d3d3R0dHR0dHR0dHR0dDQ0NDQ0NDQ0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tPT09PT09PT09PT09PT09TU1NPT1NTU1NTU1NXV1dXV1dXW1tbX19fX2NjY2NjY2NjY2NjY19fY2NjX19fX19fX19fX19fX19fX19fX19fW1tbX19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2NjY2NjY3LxvVFRsbExLUkpUUlVLRkQ6PkdEREFERjw/ODk6OTY5OTo3PD07PkA9PTc5Ojs5Pjs5OTY2Oj1AQT47PDk6Pj9DQT4/Qj0+QkNFQkFCSrDe2dra2tvb29vb29vb29vc3Nzc3Nzd3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0tLS0tLS0tLS0tLS0tLS0tPT09PT09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1tbW1tbW19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19fW1tbW1tfW19fX19jY2NjY2NjZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2dnZ2dnY2Ny2a1NbcGtLVVdSXFFXSEQ+PEJKRT1ISj89PDc4ODo1OTg5Njs+PD1APDw1OTk8Oj87OTk0ODw9PUFBPD47Ojw+QD89PkE9PUNGR0I/Qkmq39ra29vb29vb29vb3Nzc3Nzc3N3d3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHS0M/U0M7P0tLT0tLS0tLS0tLS0tPT09TU1NTU1NTU1NTU1NTU1NTU1NTU1NTV1dXV1dXV1dbW1tbW19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19jY2NfX19fX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dndsGRTYXJfT1pUV19RUkdCPUVJS0FBTEQ/Pzs5ODg5Mzg2ODY5Pj0+Pz06Njo7Pjs9PTo5Njg6PTtAQDxAPz0/P0I+PD48PEJFSElCPkNJpODa29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3t7S0tLS0tLS0tLS0dHR0dHR0dPT0bm7zLqbnLrQyNPT0tLS09PT09PT09PU1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2NjZ2dra2tra2tra2tra2tra2tra2tra2tra29va2tra29va2tvb2tra2tra2tra2tra2trb29vb29va2tra2tra2tra2tra2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ3qpfVWBuW1VZUVpeT0xHQ0ZNSUZEREk7QUE7PDg4NjU4Njk4Nzw/QT89Ojc8Pz48Pz87OjY4OD09QEE9QD5BQD1AOjs6Pj1BRUdKQkBDR57h29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e0tLS0tLS0tLS0tLS0tLS0tO+wMqaoKKViJGeqpOpz9TT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fY2NjY2NnZ2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dna2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2tvb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2d6iXFVeblheXU5aUFROQ0NMSUlJRkpEPEJBPDs4NzY3OTc3OTk9P0E/PDo5QD88PkI/Ojg3NzY9P0BAPUBBPz88PTs7OD48P0VJSEE/Q0aX4dvb29zc3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3tPT09PT0tLS0tLS0tLS0tTIlZyum5m1iX2TjIKBhMTV09PT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tvb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dndmlpYYW5ZYVdPV01QRUJETElNS0ZJRT5CRDk4ODY3OTc1Njk4PT1BPjo4OT4+PD9APzw1Njc2PD4/PjtAQEA/Pj4/Pjs/PkFCRkdCQENIkeLb29zc3Nzc3d3d3d3d3d3d3d7e3t7e3t7f39/U09PT09PT09PT09LS0tLTz6h+kayPko6MhoCIiYSQo8rU09PT09PU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY19jY2NjY2NjY2NjY2NjX19fX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2tra29vb29ra2tra2tra2tna3JJaWWNuWlpSVV5QTDxAR05IUklIRT47SEY4OTc1Nzg3NTg5ODs+Pj07ODlBPj1AP0E+NzU5Njs+QUI/P0BAQUI/Pj8+QUBEQUZIQj9FSozi3Nzc3Nzc3d3d3d3d3d3e3t7e3t7f39/f39/f1NTU09PT09PT09PT09PWtaWaiIuQhYCFi4iBg4qLf4bC1tTU1NTU1NTV1dXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2dnZ2dna2dra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29ra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb2tra29uIWltnalxYTFpfVkg6TEhMSkpDRUVDQExINzo3Njc4ODU4Nzg5PDw7Ozk4QD89Pj8/PDY3PDQ3P0JCQUBAPz8/QT09P0A+QEBGRT09REuI4tzc3Nzd3d3d3d7e3t7e3t7e3t/f39/f39/f39TU1NTU1NPT09PT09PUxZKCg4WGfYGCfXx5foGCg36k29bU1NTU1NTV1dXV1dXV1tbV1tbW1tbW1tfX19fX19fX19fX19fX19jY2NjY2NjZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vc3Nzc3Nvb29vb29vb29vb29vb2tra2tra29vb29zb29zb29vb29vb29vb29vb29vb29va2tvb29vb29vb29vb29vb29vb2tvZgFpebWhaU0ldW1hKRE1ISlNMR0ZBQD9KQjg7NjY5OTc1ODY4Ozo7Ojw5OD09O0A9Ozo2NTw3Oz1CQEFBPD49QEE9PEA/Pz5CREU+PERLg+Lc3d3d3d3d3t7e3t7e3t7f39/f39/f39/f39/V1dTU1NTU1NPT09PT2LKEkKh9g3l2hIh/e3d5gn5+i67A1dTU1NXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dna2trZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2trb2tra2tvb29vb29vb29vc3Nzc3Nzc29vb29vb29vb29vb29va2trb29vb29zc3Nzc3Nvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc1nlcWmxmWFJPYFFSQUhHSkZYTEZAQENDSz87Ozc4ODc2NTc2ODo5PDw6PTs/PTs9Pjw7ODg8OT0/QkFCQzw8P0FCPj1BQkNCREVDQDtDTH3h3d3d3d3e3t7e3t7e39/f39/f39/f39/g4ODg1dXV1NXU1NTU1NPU0ruen3WKeXuIgICChYGDcnOAhYOMrNfV1NXV1dXW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NnZ2dna2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra29vb29ra2trb3Nzc3Nzc29zc3Nzc3Nzc3Nzb29vb29vb29vb29rb29vb29vb29zc3Nzc3Nzc3Nvb29zc3Nzc3Nvb29vb29vb29vb29vc3Nzc3Nzc3Nvb29vb3dByXV9wZVdLUGNPS0JHQ0pIS0ZBPEE9SFBBOjo3Nzg3Njc4Nzw6OD09PD47QD88Pz07Ojs5Ojk8QEJAQkNAPUFAPz1AQkNDQUBAP0A7RU144N3d3d7e3t/f39/f39/f39/f3+Dg4ODg4ODg4NXV1dXV1dXV1NXU18h4i4V8goh6g4SBfoKCc2l0hYuGkJ3U1tXU1dbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tvb2tvb3Nzc3Nzc3Nvc3Nzc3Nzc3Nzc29zb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb297KalxjcWVST1heSz9HTElPS0VAPkFCP0lPPjk6NzY7NzY6Ozc7Ojg6PDw+Oz09Oz48Ojs4OTo4OUFCQkFAQDtAQj06PkFCQz8+PT4/PUZOdN/e3t7e3t7f39/f39/f4ODg4ODg4ODg4ODg4OHV1dXV1dXV1dXV1s6dhpl+f5OTin+CgXx9gnNxm4mAgoOJwNnat7TQ19bW1tbX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tra2tra2tra2tra29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NvfwGNaW21gVlBTU0pETEhNSEk8PkFEQ0ZORDw8OTc5OjY4Ozk3PDk4OTw9OzlAPjpBPzw3NTc7ODpAQUVBPz45PUI/Oz1CQkI6Pj07PT5GTnHe3t7e3t/f39/f39/g4ODg4ODg4ODg4OHh4eHh1tbW1tbW1tbV1tjLioCHhYOXjHh7e3lvfYF1a3ebdHZ7eInHxpiMrdjZ19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2drZ2dna2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tra29vb3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29zb29vb3Nzc3Nzc3Nzd3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3Nzc3Nzc4LdjV1lrYlJNVVFMSktGS0ZDQD5CQT9FTT4+PTg5OTo3OTo3NT03Nzo+PDs7Qjw5Pz05NjY4PTk6QEJGQD49PEBCREA9QD9DO0A9PD4/Rk9t3N/e3t/f3+Dg4ODg4ODg4ODg4OHh4eHh4eHh4dbW1tbW1tbW1tfVrYZ6d32rn3l4entzdH+Dfm9xe3l6c3t2k4qFgImkzdnY19fX2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tna2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29vb29vc3Nzc3N3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vc3Nzb3Nzc3Nzc3N3d3d3d3d3d3dzc3Nzc3Nzd3d3c3Nzc3Nzc3N3d3d3d3d3d3d3d3dzc3OGtYVtebGJSTVZMTUdLS0RGQkI7QT08RUxCQT44Ojk6Nzc5NjY6NTs+QDs9Oz89PD89Ojk5Ojw5PEVDRkA/PkBDQkQ9OT0/QT1CPz1APkdPadvf3t/f3+Dg4ODg4ODh4eHh4eHh4eHh4eHi4uLW1tbW1tbW1tfQmH+Qh4N9eoN2e3Vzenl6kKqmd3JyfoeHh4CAfoKEhJHJzNnX19jY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra29va2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2djY2NnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vb3Nzc3N3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzb29vb3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3dzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3NzhpV9UYm1iUE9TSUhHRkpJSUJBPkJCPEVFREA+ODo4Ozc3Ojc4ODY+Pz07PDk9PDo+PTs6Njc7NjpEQUY+Pz8/PkNBPzs9PT47REM/PjxIT2fZ4N/f3+Dg4ODg4eHh4eHh4eHh4eLi4uLi4uLi1tbW1tbW19jYyH52doN+fnR2eIaCenl1d5yhu6GEgoCAfoeKinx/gYaMnKjO2NjY2NjY2NjY2djY2NjZ2djY2NjY2dnZ2dra2tra2trb29rb29rb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3d3d3d3c35pbT2drXFBRUElDT0pLR0xHSkJAP0FHREBBPDg8ODg1ODk3Njc3QEA/Ozw5Pj04PTw8Ojc4PTk/RENGPkE/QkBDPzw6Pj0/PkVEPz07S1Fj1+Hf4ODg4ODh4eHh4eHh4uLi4uLi4uLi4uLj49bW1tbW19XB3LRueHJze3B6eXaFiIR7eH2AgZiljH98fnuRhZaLhoGDgY6Rvd3Z2NjY2NjZ2dnZ2dnZ2dnZ2dnY2dnZ2dna2tra2trb29va2tva2tra2trb29ra2tra2tnZ2dnZ2dnZ2dnZ2dna2trZ2dnZ2dra2tra2tnZ2dnZ2dna2tra2tra2tra2tra2tra2trb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t3d3d6NWFdobllQUUtISlNJTUhNSUtBQz9DRkJBRDo6PDg2NDg4NzY2Nj8+Pjo8OTw7Oj09PDw4Ozw8RERERT4/PkI+Qj84PT8/Q0NCQEE+O0xUY9Xh3+Dg4OHh4eHh4eLi4uLi4uLi4uLi4uPj4+PW1tbW1teslLZ6eHJvd5V7dHuLgHh1bn6Fg3t/hYhyfH2bnI6JioJ+g32Hk5rH1NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2trb29vb29vb29vb2tra2tra2tra2tra2tnZ2dnZ2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2trb2tra2tra2tra2trb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d7Zf1lgaGxcUUtHR09LTk5PTURGQkg/Q0hEREA6Ozs4NzU3Nzc4NThAPkA7PDk8Ozw+Ojk7OTk7OUZERUI8QD4/PEBDOz5AP0A/Qj8+OjtKVWPV4eDg4eHh4eHi4uLi4uLi4uLi4uPj4+Pj4+Pj1tbX19vKhYR3cXJubniVhHt4hH95dnB4c3eLkY6CdnN9ioaId3d1d4ODfIiIk8Pb2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2trb2tvb29vb29vb29vb29rb2tra2tra2tra2tra2tnZ2dnZ2dna2tra2tra2tra2trb2tra2tra2tra2tra2trb29vb29ra2trb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f0nVZaGlqVk5KSE1OR01EUElGSD9FPUZMREM+Ozs8OTc3OTY2OTU4Pj4/PTs8QDs9PDo3Ozc5OThHREVCPUE9Qj8+QDw/QUE/QEJAPjs8S1Ri1OLg4eHh4eLi4uLi4uLi4+Pj4+Pj4+Pj4+Pj49fX19fEknuJf29sbnV2foSBg4qGfnVybWVtiIaKjoR7c4OHint4e4OPj4GEioqxztrZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29zc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tvb2tvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3dzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f3t7e4clsW2pqalNOR0hOT0VIRk1JSUA7RD5ISUA9PDo6Ojg2ODo3Nzk0OD08PT07ODw8PDw4Njc4OTo6RUJFQT9APEI/Q0M+PkNEQUBAP0A8PUtRYdPj4OHh4uLi4uLi4uPj4+Pj4+Pj4+Pj4+Pj5OTX19fZqXaFfnx3bHB3eXh8jH2KhYB3anN0d3p9bot7fnl6foR/gIGDfnh8foeGlrbT2tnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra29ra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/e3uO9amFpa2lRTkZNTEtKWE1OR0FAQE9BRD9AOzw4OTk5Njg2NjY4NDs+PD07OTY6Ojk6OTU4OTg5OkJERj8+Pj5AQEBCPzxBQD88Pj9BOT5KT17S4+Hh4eLi4uLi4+Pj4+Pj4+Pj4+Pj4+Tk5OTk19fX2sqKhIB5c29tcXN1d4CUeHaAfHWHhXd1cnWgmXp7d3Z5doR0bWxue3iAmouTu9za2tra2tra2trb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc29vb29vb2tra2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f397js2lpbmloUFBPTExPUk9LU0Y/RURERD48PDg7ODc5OTU2ODY2NzM6Pjs+PTc6Pjk5OTk2Ojo4NzxDRUc/Pzs/PkA9PkE9Oz0+OUFAQDhBTlFc0OTh4eLi4uLj4+Pj4+Pj4+Pj4+Pk5OTk5OTk5NjY2NjauY6AenZ1bmpveHCBfWt0cnZ3hIV5h4d5lY55eXp1d3pza298gHx2fYh8gLLe2tra2tvb29vb29vb29vc3Nzc3Nzc3Nzc3dzc3Nzc3Nzc3Nzb29vb29rb29vb29ra2tra2tra2tra29va29vb29vb29vb29zc3Nzb29vb29vb29vb29vc3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3t7e3t7e3d7e3t3d3t7e3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/f39/f4qpqa2hrZFNQT0ZQVFJOSFJLPkREQ0I7Ozk6Ojg2Nzg1NjY4ODg0Oz88Pzw5PDw3Ozo6Nzo6Nzo9Q0JDPUE+Pzw5PT5BQDs8PDtFQD47Q05TXNDk4eLi4uLj4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTY2NjZ1p5vdntveHh2cG50d3BwdHBzb36Jc3qGhY2EenNtcoB6hn1vg5OBdnx9g4a13drb29vc29vc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29ra2tra2tvb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4N/f3+KgbWhma2ZVVlJHUFFOS0xMRUJIRUc9OD08Ojo3Nzg2Nzc2NTY3NDg+PD09Ojg6OD46Ozc4Nzc6Oj5DRDtDQj49OD1AQUM/Pjw+RTw+PUJNUF/S4+Hi4uLj4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk2NjY3MB2doCCfnp4eHBsdXlya399bHNvdGdoaYB/aWl4c2d+iYl4cIKGe3d9foWKvd3b3Nzc3Nzc3Nzc3Nzc3Nzc3d3c3Nzc3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODflGttZm5mU1NJUFlUTEhGTkZGRUJGPTs+PDs5Nzc4NTc5NjQ1NzU4PDs9Pjo6OztAOTs7ODc6OTlAQkE8QUE/Pzk/QEJFQ0FAQEM7Oz1ES01g1uTi4uLi4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk5NnZ2tmYc3uqhJaCcnR1dn14aGx8d2h4d25rcHR5gIJ3dHyBhIJ9c3CAin94gn95g8je3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f4N/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh24tubWdzY1lRTVVbV0hDSUZOS0dCRD8/Qjo7OjY2NzU2NzY0ODc2Ozw7Pj86PDk8Qjg3OTo6Ojk6QUFCQUJDQEE+PT9CQ0NEQUJGOTg9REpOYtjk4uLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXZ2drcqHGCtXiRfnNsem6EgXaCfWtoan+DeHZ8dX2FhXRmcHl9d316gIqFe318foC03tzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3dzc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3Nzd3d3d3d3d3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e397e3t7e39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4ODg4ODg4tiFb3FrdWFWT1VVXE9ETUY+SkdKRUQ8P0I6PDk4Njg0NTY3NDc2NDk7Ozw7OD47PEE4ODo9OD04Oj09QEBAP0FCP0A+QENCQ0FBRTc2O0RMTmPa5OLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXl29ra3Z5sbnNxhY1ybXBuf391hH5rcnZ2enN4gXhzbnVwbWt2fHmFiIB/f392coODsd/c3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eDg4eHh4eHh4eHh4OLXhW1xb3ZeUldTWlpRSkhDQFFAQkQ8OT9BOjw5NzU3NDU2NjQ3NTY9PDo9PTk+OjxAODo6PDY7OTs+PUJCQjtBQkBDQEBEREM8PUA3OjxFS01l3OPi4uPj4+Pj5OTk5OTk5OTk5OTk5OXl5eXl5dPOxsB+cWxveHt2b3VuanNzbZKGeG50dG5vdIZ/b2twboJ0bXZyfY2DdnF/d3mKgabf3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3dzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t/f3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi1oZucG1xYFJZUFdfWUpMTElSP0Q9OTtCRjs6OTc0NTY1NzU0NjY2Pj07Pz45PTk7Pjg9Ozo0ODtAQENCQ0FCRkE/Q0BBQkREOz0+OTs8QkxNZODl4+Pk5OTj4+Tk5OTk5OTk5OTk5eXl5eXl5eW5t7Woc3JscHd6dHd4bXFydXd/hHRyc2xsa3F8bnBudGuBf3GAd32Eg355gHNygYqg2d3c3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh49WHcWxqbF5YWlVXYFZWUE9QTD1BOjs8RkE4Ojg3MzY1Njk2NTg1Nz89Oz8+OT04Ozw5PTs7NTo9Q0JCPENDREREQUE/PkJDQzw9Pjg5PENLS2PN0dnh1sjY4+Tk5OTk5OTk5OTk5eXl5eXl5eXltbW2q3J5cm59f3Z1d2hqaGlwb3Zta2tnZWZxdG15gG5teXd2iHhxa2podXV5dHV/wd/c3d3d3d3d3d3e3t7e3d3d3d7d3d3d3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHi4uHh4ePVhnFwY2lhV1NZV19MUk9STUtAPjg5O0E+ODc5NjQ3Njc6NjY2NDk+Pzo8Pzo/OTo6Nzo9PDk5PEFBPTtBQ0VDRkA+Pj5BRUQ+QEE3OD5GSEpesrW4wbm1u8jg5eXl5OTl5OXl5+fn5+fm5ebm5ra2tbWOfX5weoR1cnZnYmNlbGtyb2ZpbHZtd4Z9hXlsbHd4a3ZwfH14c3V5fHd2h7ng3d3d3d3d3d7e3t7e3t7d3t7e3t7d3d3d3d3d3t7e3t7d3t7e3t7e3t3d3d3d3d3d3d7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4eHj1Yd1bl5uY1pUU1hXS1NLSk1SR0E4Ozs+PDk4NzU2NTY2OTY4NjY5Pzw6PT07Pzo7Ozk8PDs5Oj4+Pjs8PUFEQkNBQEBBP0JDPDw9Nzs+REVKXrG1tLW2t7e2y9rJ3uXl3eDi3tXU1tPU4OPg39+2treuh3t/bnmNenJ1bWNobGxtaXR4enF5enqIh4N6aWh9cWRvcXyGgX55e318e4an2t7d3d3d3d7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4uHh49aGdmxhb19dV1lcWlJQSEpXTEVHPUA9Ozs9OTY0NjU1NTg2NzY3OD87OT09PDw5OTw6Pjw6OTg+Qjs7Pj5AREBDRUFAQD0/QDw9PTU5PEJHRl2xtbW2uLm5ubq9uMPT0r3BwcC6u7y6u8TMxb/Dt7e3hGl1gX1ndYd5Z3Vxa2t5eHB3fH15bWl3e3h3bml1j4FwbHl4d3d9gXuGgnmAoNze3d3d3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODh4OHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4ePXhXJrZ3RhW1hYX15TVVVRVUpMRj9JRDs5PTY2NDc3NTc4Nzc3ODk8PDo+PDg8Oj0+OTs8OTs5P0E8PT9DP0FARUJCQTw9Q0A6Pjw1NDlER0dasbW1tre5ubm5ubm3ubm4uLm5urq6urm5urm6u7e3uX9ucHN6b3B/eXNuc3Vsc3Z4cXFwb2tvcX6Bc2mHhIF9dHOHdW11hYmBgHJ2hafd3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uHj14lxa2xyW1dXXWBUUVVUUFJPSkNATUE9Ozk2NTM0NjQ2ODc3Nzk6Pjs8Pjs5PDo8PDk8PTw7PT0+PUNEREBDQkE/QD48PkE8OD06NjY6QkpIWLG1tLa2uLm5uLi5uLe3uLi5urq5ubi4uLi6uru3uKx7cnhxf3ZzfnBsbXpyZ29sbW50cHt3d3Jyd3pvhpJ2f3x8enZ5fH9zfYdyda3T393d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4eHh4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi49eHb2pxalVWV2FbT1FSUE5XSURESUo/Ojk6NzUzNDk1NzY2Nzg4Ojw7PD46PDo6PTw5PDw9Oz09PDs9REdEQ0E8PDw8Pj5AOzg8ODE1OkFGRVautbW1tre4uLm4uLi4uLe4ubq5uLi3t7i4ubq7t7mqcnB4d3x7e4J3aG5xam9qY2lyf21zcn54dHFsanaAeX2AgH91doB1a4qLgHaR1d/d3d7e39/f3t/f3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f4N/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLi4uPYhm1sdGVWUFxnWE1YU1JRWUVDS1BOOzk4ODc1NTM5NTY2NzY4Nzk+OT0+OTw5OTw7Njg5OTo8QEA9PkBGQEJCQDo+PEE9Pzs7OzYxNjxCR0RQqLa1tba2tre4t7i4uLi4uLm6ubi4t7e3t7e5ure2tIlyd3h9iXxwem99c2hqbGdnbHRscXd0cWx2c3Fxd3FyfHl4g3Z7d2mLkYp9kM7f3d7e3tvY2drZ297f39/e3+De39/f3Nvc3N3e3uDg3+Dg4ODf3t7e39jS397f397e3t/f3t7f3t/f3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLi4eLi4uLi4uLi4uLi4uLj4+Lj4+Li4uPj4+Pi4uLi4+Lk14NoZ3VkVlVkZVdKWllXW1Q9RU1LSD04NzU3NjQzOTQ0Nzc1Njc5PTo9Pjw9PDk7PDk5Oj45PD4/PkFBQ0FFRUQ+OzxBPjw5PDs3Mzc+REhFSqG2tbW1tbW2tre4uLi4t7e4uLi3tra2tra3uLm2traLfXpsbHp/cGx5dm5qaGdlcXp4b2lvb3B1c21zd4Fnb32CgYNyf3lqcHJ6f6ng393Zy8a/vL2/vsLN0tDW3tnc4NfQzcPCw8PH1dfT2dzX1NjX0MfExce9vM/Kz87Y3djO3N3c2t3T0dze39/e397e3t7e4N/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eLi4uLi4uLf4uPi4eLg4d7W29/Sw8rJx9Hb3OLk4eHg2dre1sbExcTN2trf5OHi4trX3st9aWZxYVleZWFNTFRLUlpMO0hNSEZBPTc2NjUzNDY2NDg3NjU2OTw7Pj46Pjk5PDk3OTs7Oj49PEBAQ0RCR0ZCQT08Q0A9OTw7Nzc3P0RGRkaZtrS1tbW2tra4uLi4uLi3uLi3s7W2t7a3t7i5tba3opdxb29waW50dnFmZWNrbmdvcm1mZ2tygWVvdnyAeGRzj39zaHFyaWVlbm+w39HFv7u5ubm5ubq6uru6vc3Gw8e/urq6uru7u8HCvcHFvby/vry7urq5ubq6ubm6w8XDucDDwby/ube/z8/U3tjc3t/g3tLa4N/f4ODg39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eDg4ODg4ODg4ODh4eHh4uLi4eDh4uLi4uHa2t3RwsPCu8XT1uDdydPDrrnAsaqrq6uwtLbJ0sXRxLG4v7Srq6usr7S0vMzE1c60tLureGxtbWBdYl9ZS1NVVFFQREBRTUhEPzo3ODU3MzE1NjQ5ODQ2Njo8Oz08ODw5Njo6ODg5NzU8PDw/QEFAQkRDQkE8PkI/Pz09PTc1OD5DRUNAj7a0tLW1t7i4uLi4uLm5uLe1sautr7Oxs7OztLS0tqaei2tue3ZxeXhnY2hfcXdha25vaG99b25ja2lseHdsa4Z+bHB6dm1scG95sca8uru7urm5ubq6urq6urq6urq6urq6urq7u7q7u7y7urq6ubq7u7q6urq6urq6ubi3t7i4t7e2tbW1tbi3u8e+w8XHzcS4wMnH0tzZ2d/e3uDf39/f4ODh4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh3Nji4uLi4eHh4OHg3tfGxtHQztTe3tPO0t/SuLi8sq2trKysrrG+ua63rKipqamqq6urqqqqq6ysuKyqqqqrq6urra6urq6urryzrayrpHlub21fXl1dVE1SU1xUSkE/UElIPjg5NjgzNzMwNTczNzg1NzY2Ojw/PDg5Ozo6Ojg5OjY1OTs8Pj9EP0NFQkNCP0BAQT9APjw3ODc6QUVEP4W4tLS1tbe4uLm5uLi3t7SurKuqqq2urq6vsLGzs7WjcG5ucm1wg311aWFlaGZkY2Rxc21td25naW1tZXBzb29zcXN8h4F6dX11n7u6uru7urm5ubm6urq6urq6ubq6urq5uLm5ubm6urq6u7q5ubm5ubq6ubm6ubm4uLi3t7e4uLe3t7a2tbW2tra1tbW1tba1t7e3t7rBvrzGycrb3+Dg3tvd3d7h4tDW4uHg4ODg4ODg4ODg4ODg4OHg4OHi0768zNjd3OLg0dnbxL23sLCxsa+zu7uzsLS9s66urq2tra2sq6qqqqmpqKmpqampqqurqqqqqamoqampqampqaqqqqytrq6urq6urq6sraR4aWJxZmFZWlZRUk5cU0Y9QlJEQTc8OzY5NTY1NDU2NTg3NTY1Nzg7Pjw7OTk5Ojg3Nzk3Njg8Oz47RD8/Q0BBREE+P0M9Pjw+Ojo3Nz9DRj54srCztLW2t7i3trKurq2sq6uqqaqtraysrq+xs7S1t4xucnRqaIB5ZmpmZWxdaG5waGxxYmNmcoJ+dmhobGpueoaBhXx4cXF5gK+6ubq6urm5uLm5ubm5ubm5ubm5ubm4uLe3t7e3uLm5ubm5uLe3t7i5ubi4uLi3t7a2tre3t7e3tra2trW0tLW1tbW2trW1tre3t7e3t7e3tre4v8bP0MS+v8DE19e8ydra4OHg4ODh4eDg4ODh4eDb3t7Uzby3tre6wMDJxLfIvrKwsLCwr7Cvrq6ur7Cwr66urq6uraytrKurq6qpqampqampqampqKmpqKmpqampqKmpqKmpqqqrraytra2ur66trK2heWpjbWdiXFhRUFFLVEpCOklRP0E3PDk0OjU2NTQ1NTY4ODY4Njs6OTw9PTs6ODY2ODg6ODY3Pj09PT5BQUVCQkNBQUBBOj09Pz05Ojc9QUc8bKqmqKutsLGwrqupqKqrq6mpqamrrKytra2usLO0tbilgIdvaWdzdGZrcG1qZGxvcm5rbWNrcHyJhG5qbHx4Y3uKfnNqc25rcY+7ubm5ubm5ubi4ubm5ubm5ubq5uLi4t7e3t7e3t7i5ubi4uLe2tra3t7e3t7a2t7a2tra3tra2tbW1tba1tLS0tbW1tra2tra3t7e3t7i4uLe2t7a2uLm4uLe3uL6+uLq9vcfb4OHg2Nnd4eHg3dfKwcPCurm5uLe4uLi3tbS0tLKysbGxsLCvr6+vr6+vr6+vr66ura2srKyrq6yqqqmoqKmppqepqaehpaipqamoop+hoZyip6inqausrK2ur7Cwrq2unXdwbGphY2BZUU1RTFJGQzlNUEU+ODs3Mjc5Njc0NDM1ODg3OTc7OTo9PTw6Ojk3NDo5ODY1OD8/QEI9RENDQ0FDQEJBQDtAP0A/PDw6O0NIPWOopaWlpqioqKenp6ipqqmoqKipqqqsra6wsLCztLW1taWYdn5xZmt4cW9tZmVsaGNsZ2ZpaX11bWlvfXZ5hWZod294b3Fvcninu7m5ubm5ubm4uLm6ubm5ubm5ubi3t7W1tba2tre3t7e3t7a2tba2tre2tbW1tra3t7e2tbS0tLS0tLS1tLS0tLW1tba2tra2t7e3t7e3t7a2tre2tre3uLe2t7i4t7i4uLi4wMXTyry8w83PyMC9urm5ubq6ubi4uLi4t7W0tLSzs7KysrGwr6+vr66urq+vr6+uraysrKurrKysq6ehoJ6gn5udoaGdlpmkpKaon5mZmZmanZ+gn56fpKqtrq+ura2srJl1cGlrY2FeXVVOU0tSREQ4TktHQTo4NTI2OTY1NDczNzc3ODk3OTo7PT0+ODg4NzU6OTk1OD9AQEFEPkZBQkNAQkNCQT88QEJCQD0+OjpERj5cpqWmpqampqanqKenqKioqKenqaurrKytra2ttLS0tbekc311bnONf3JmanFjaW1jaGZobG51aV9jZ3VzdnpuZ3Bwcn56cYihu7m5ubm6urq6urm2s7a1uLm2trW1tra1tbW1tbW3tra3tra2tbW2tbW1tbS0tLa2t7e3tbS0s7O0tLW1tLS0tbW1tra2tra2t7e3uLe3tra2trW2tbW2tra2tra2tra3tra3uLi3uri4uLi3uLi5ubm5urq6urm4t7e3t7W1tLS0s7OysrKxsbCwr66urq6urq+vra2srKuppaSmpqScmZubmpmampmXl5eXl5aZm5iZmJmZm52en5+dnJ6gpKWko6OioqKQdG5jcGFeXltUU1RIVEo/PFFCRkM7ODYzNzo1NTQ4Mzg5OTc4OTc7OTs9Ozc6NzU2OTk4NTg+Pz9ART5CPz9DPzxBQUI/PT9EQT8+PTk9Q0Y/VaSlpqanqKeoqamop6ioqKioqKiqrKuqqaipq7W1tba5o3eKcXKHhnd0cGh5a2JjYWVsaW5zal9jZWNjZWprYmRqbHaXjX6ovbm3tre5u7u6uLWxrKurqq6wrKyrq62tq6uvsLGvr7CytbW2t7W1trW1tbW1tbW2trSvr7O0tLSvra6vsrW0tbW1tbW2t7e3t7e3t7e3t7e3t7Owsra1tLa2tre3tra2tbW1tra3t7e5uLi4t7e3uLi4ubq6urq5uLi3t7e1tbS0tLS0tLS0s7OysbCvr6+vr66vr62oo6KgnJqampqZmZqbm5qampqbmpmZmZiXl5aYmZmZmpycnZ+foJ+goKChoaCgoJ+fi3RuaXRdYGZeUlRLRFRJPUVTSEVCOzo0NDY5NDQ1NzM4ODg3ODk5Ojs7Pz04OjkzNTg5NjM5PT5AP0A6QEJCQkA/QEJCPz0+QUFCPz06PkVDQFGjpqWlp6inqauqqKaoqKipp6ioqKinp6ioqaq1tbe3t7KZtH99kIx1Z2lqbGZjYGNoZW94cGlicXx5cGpmZmRma3NqhYystrKwra2ttLeysLCtrKuqqaiop6ipqampqKinqKipqaeoqqurra2sqqytraysrq6traunpaSnqqyopKOkpamwsbGztbW2t7i3t7W1tre4t7e3t7Kppaasq6ivtLa1s7W3t7a1tbW2tra3t7e3t7a2t7e3t7m6urq5uLi3t7Wxs7S0tLKxsK6sq6yurrCxsK2rqqmqqKijnJqZmJmYmJiYmZmZmZmZmpqZm5ubnJybmZeYmpqcnJydnJ2foKGhoqKioKGgoKCfnop1amtuWVxhVktPREdVRz5PV0hEPTw4MzQ0ODQ1NDgyODk4ODk6Ojw5OUA8Njk6MzY3OTE0PD8/QEBBOkNGRUJBREJDQTo7P0FCQz9APUBEQ0BPo6empaemqKqqqqakpqenqKioqKimpqaoq6uttba3t7e4rbJ1cHuDdmBiaWtiZWZhZGdmfYh5bHKAfXFvcXhjbW5xZo+srKurq6ysra6urK2trKyqp6WmpaWlpqioqKiopaeoqKeoqKeoqamqp6Wko6KioqOioKKioaKhoKChoaKjpKOjpaWlqLC0s7OzsKuqqaqztLa3trGopaOioaGipKiqqairs7Sxrq6xs7W2tra3uLi3t7e3t7e3t7a2uLe0sa6ppqerrKmnpqWkpKSkpKWnqaajoJ+enZycm5uampmZmJeXmZmZmJiZmpqampqampqbm5mYmpydnZ2dnZucoKGgoaOjoqCgoKCfnp2FdGtsaFdYU0pHTUVITUdAU1dGRz09OTM2Mzc0NTU3Mzg6Ojo6OTw9OjpBPDY9ODM3ODgzNztAPz9AQDpCRUNAQkRDQT87PEBDQkNBQDxBQ0A9TqKnpqanp6mqq6mkpaWlpaaoqKippqanqKmpqrW2tre3t7izc2h7c2JnamtpaWJhZGloXV1tfHJma3J/fHR8bm1zc36gqamrq6uqq62trKusq6mpqKWjpKampqWmp6eqqaamp6enqKiop6iop6WkpKKhoaGhn56en5+fn56foKGho6Wko6OkpKSmp6enpqWkpaampqeqraumpKKhoaChpKWlpaempaeoqKalpaivtLa3trW1tra1tbOwrKupqa6rqKWlpqampaSkpaWlpqWkpKSkpaKhoaGgnp2bm5ucm5qamZiXmJiYmJiZmpmZmZmYmZmZmZqZmZydnJycnJybnJ+fn6ChoaKgoKCfnZ2cgHNrbmReU0pITUZETEtFRFFTQ0c9PDgzNjI4NDY0NjQ4OTg6Ozk7Pjw5PTs5PTczNTk2NTY8QD0/QD88P0JDPkJCQj89Pj5CQ0FFQD86PkVAO0+jpqWkpqeoqaelpKWlpKWnp6eoqKanp6alpqa1tba2trW2uYptcW1vfHxxZ2pmYGFsYFROW2hqbm9tgYJ9cWdxdn6aqKeoqqmpqqurrKqqqqimpaWkoqOlpqalpaWmqaqppqWjpKWmpqSjo6Kio6Khn5+fnp6cnJycnJ2dnJ2en6CioaKjo6KhoqKkpaSioqOjpKSjpKSko6Ggn6GipKanp6ipqaelpaSipKSlqK2wsKyrqqusqqmnpaWmpaWlpaalpqioqailpaWkpKSlpKOjpKOioaGhoqKgnp2cnJubm5qZmJiYmJmam5mXl5eWlpeXmJiZmpqcm5qampubm5ucnJ6goKGgnp6enpycm356bnJiXlNNSlBFRk5NQkBPRT5JOz01MzYzODM2Njc1Ojs4OTs5Oj49Ozo5OT03NjY5NjU2PkI+PkE/PT5DQT5DQ0BAO0BAQkJCRUA+Oz5FPzxQoKSjpKOjo6SkoqSlpaSlpqamp6empqalpqaltLW1tbS0tbiBaHx9ZXOCemxwdWFfY1ROT1FbaGxpbGxxbW5xbnScoqSnqKioqauqqqqqqaempaSjo6OjpKSlpqalp6ytqaShnp2epKShn56foKCdnJ2dnJycmpqam5ucnJubm5ydnp6foKChoJ+goaOioKGjpKSjoqSlpaWkop+go6SkpKapqainpaGdnJ+jpaipqainqKioqaempaWkpKSlpqampqampqenpaWko6Ojo6KioqGhoqKhoqOkop+enZ2cmpubmpqZmJeXmJaWlZSUlJWVl5iYmpubnJuampqam5ucm5ucnp+fnpucnJyam5p/fnF0YFtUTUdNSEZMSj8/TkM8QDs8NDM4Mzc0NzY3ODs9ODo6OTk7PTs7ODk9Njc4OTU4OD9APT9BPjs9RD89REA/PzpAQUE/QUVAPjw8Qz88Tp2ioaKioKCipaSkpKWlpqenp6empqampaampbW1tbS0tLS3jHalsXdmc3Jvc2xjZGlYT1JRT09dgG1kYFptkZGSoqKjpaampqenqKiop6alpaOioaGhoaKjpaempqesq6emoJ2cm6Ghnpqbm52cmZiam5qampmZmZubm5uampqampucnZ6goaCfnp+hoJ6foqOko6Omp6inqKWioKGhoaGkpaWlpKCcmZmbnqOmpqampqanpqempaOlpKWlpqiop6enpaWlpaWkpKOjo6KhoqKioqKhoaKjo6Kgn56enZybnJubmZaUlJSTk5OTk5SUlJWWl5qam5ubm5qZmZqanJ2dnZ2dnZuampqamZqXf3dvc11aTkhKTkdFRklERU5APD09PDQ1OzQ2NDY1Njc5Ozg5OTg5OTw7PDc6Ozc4ODg1ODg/Qj9BQTw+P0A8PEJAQT49QT4/Pz1CQUA6OkA8PE+doqGfoJ+dn6OkpKSlpqeoqKenp6ampqampqW1tLS0tLS0tbSXtqd1Znh2Y2xjY2VjW1JTU1JNXqCMeFhodpajnp6hoaOjo6OjpKSlpqalpKSioaGko6OjoqOlpqamp6enp5+bmpuioJqVl5aam5qXl5iZmpqYmJqampqbm5qZmZmenZ2goqOjo6KkpKWinqGhoaKjpaampaSjoaCgn5+hoZ+goJ2amJiZmpygpKOjpKWmp6alpaOjpKSkpKWnp6ampqampaWmpKOjo6SjoqKjpKGfoKGhoKGgoaCfn56dnZyamJeVk5KSkpKSkpOTkpOUlZaZmpqbm5qampqbnZ6enp2cnJybm5qamZmZlH10bHReWk9IRUdGQkVORT9GOzo+Pzs0Njo2OTM2NDY4ODo4OTc4ODo8Ozw5Ozs6OjY3ODk5Pj9APjw9QD5AOjlAQT89QT8/QUE+QUE/Ojk9PjpQnaCfnZucnJufoqOlpaWlp6iop6ampqanpqantLS0tLOysrGwsK2rkHiGj36bmn93Yl1TUlFRTGKgootaiKCgn52YmZycnZ2eoaGgpKenpqWkoqGjp6alpaOipaampaanpqagm5mboaCWnqKSmJqcmpeXl5iampmampqam5qYmJmaoKCgoKGfoaKipKamop6gn5+goaOko6Khn56enpyanZuZmpqZmJeZnqChoaKioqKkpaWmpKSkpKKioqKkpaWlpaWlpaalpaOko6KioqGgoKGgnp+fn5+fnp+foJ+cm5qZl5WUlJSTkZCRkpKSkpKSk5SVl5iZmpmZmpqam5+fnp2cnJycmpmZmpiXl5F8cmdxXl1QRj9BRD9KT0JCRjhDRT4+OTg7Nzc0ODQ1OTo6Ozk3OTo8Ozo8PT48PDo2NzY5OD4/QT47Pz49PDg6PkFAQUE/P0FCP0RBPjo4PkE8U5ycm5uampycnaGio6KjoqSmp6alpaampqSjo7KysK2rp6amp6alpqiln6iop6qnoXmEXFFST0xcnKCAYpmgnp2clZOVlpeZmp2dnqGmpqampKOioqanp6ajpaampaSlqKemop6dn6GfnqmfkJSXm52YlpeWmJuZmpqampqZl5iam6Ghn56fnpybnJ6goJ6dn56fn6Cio6SjoqCfnp2ZlpeXl5iYmZubnqKioqKioqGio6WlpKOio6SioaGhoqOkpKSko6SkpKSioqKhoqGgn5+gnp2enp2dnZ2dnp6em5mYl5WTk5SUk5KQj5GSkZKSkZKTlJaXl5iYmZqampyenZ2dnJubmpiYmpmXlZaNempmamBiTkY+P0A9SkVAQ0A7QEE8Ozs5Ojc2NTg0Njc4OT04ODs6Oz87Ojs8Ojk6Nzc2ODs8Oz08Ojo8PTw3Oz5DQkRDPz1BQ0FEQT88OkBCO1eZmJqamZmam5ucnp2foqKhoqSlpKSlpqSioJ6op6alpqWlpaemp6ampqakpaanqKehqXJOUU1KVJahenKanJyenJeVlJWWmJiXl5qeoqKhoqOkpKOjpqalpaanpqWkpaampaOgoKGhnqd5jo+WmpmenJaXl5eZm5ycnJqamZeZm5uen52cnZyZmZqcnZydnp6fn5+hoaCgoaKgn56bl5WVlZeanZ2fn6GhoqKio6OhoaCgoJ2cnaGioqOkpKOioaSlpKOko6SjoqKioqKhoaGfn52cnZ2cnJ2dnJ2enpqXlpaVlJOTkpKSkpCRkpKSkpGSlJWWl5iYmJiam5ycnJycnJ2cm5mYmZiWlJWXi3hsY2RiZFFHQT1DO0tIRDo7Ozw+OTo6OTo3Mzc5NTo4ODg8OTg7OT09Ozo7Ojk8PDc2NDc/PDo9Ozw/Pjw7ODxBQ0FDQkI+P0NAQkFAOj9APztZmZiampqam5ubm5ydoKGhoaGhoqKioqKhn5+dpKWmpqenpaWmp6ampqWkpKalpKSkpaaGUFJQT0+PmHB6mpubnJ6cnJycm5ubmZiYm56dnp6foKOkoqGhoqKipKWkq7CjpKSjoqGhnKKWYZGVmZuZm56amJiYmJqcnpyam5iWmZybnJycnJydmpqbnJ2dnp6dnp6fn52cnJyhoaCblpWVlZacn6Ggn5+hoKKjoqOhnZuZlpaWlpicnqCip6ikoaCgoqOjoqKioKCgoJ+fnp+gnp2cm5ucnZydnJmanJuWk5KSkpKUk5KSkpKSkpOSkpKRkpSVlpeYmJiYmZqcm5qbm5ucnJqZmJiXlZWWl4d3ZGdoZGJNQ0U8RDlJSkU5Ojs9PTo6Nzg6NjQ3OTU8OTY4OTc5PDs7PDo6PDs6PDw4Nzg3Pj07Pj46Qj86Ojo/QURCQ0FBQD9EQUFAPjpAPj06W5qYmZqbmpubm5uen6CgoaKioKCgn5+enp2dnKWkpaanpqWlpqakoqKio6Oko6Kjo6KnllRYVVJOZ21rgZ6am5udn6Cgn56enp6dnJ2dnJ6enp+goaCfn6CgoKGio6qwq6KjoqGhnpqmc1+XmpmamZienpiYmZmam5qWlZeWlZicnJ2cm52dnpybnJ2cnZ6bmJqeoaGdm5udoKKhmpWVlpaZoKKfnZueoKGjop+em5eXlJKSlJeYmZ2goqenpaGgn56goaGioaCfnp2cnJubnJubmpqZmpydnJmXmZaVk5GQkJCPkZKSkpKSkZKTk5OTk5OTlJWWlpeXl5manJubnJucnJqamZeXlpaVlZSEcmZsYmRbREJMPT84RktCPEA+Pj05Ozk6PTg1ODg2Ozg1Njo4PDw7Ozw8Ozk8Oj09OTU4Nzw5PD88OkE/Ojo6QEBDQkRBQ0A/Q0FAPj08QD09Ol+al5mamJeYmpycn5+foaGhoJ+fn56foKCenZ2lpKSko6OioqOjoZ+foaGipKOio6SiradXXl1UV19ua42dmpqbnJ2dm5ucnZ+enZycnJydnZ+goKChoaGgoKGgoKGtkqiloaCenJudn11kmpuZmpyZnJ6ZlpaWl5eTjo6QlJabnJuam5udn52cnJycnJ6dlpSZnJ+in5ycnZ+hoJuXl5mZmpycnJubnZ6fnZqXlpaWlJOTlJiampqfoKGmpqWgn56fnqChoaCenJubnJybm5ybm5qZmJmZmZmXl5iVlJKQkJCQj5CSkpKSkZGTk5aYl5STkpSVlJWWlZaZmZmam52cnJyampmXlpaWlpaQgG9vZV5gV0BKSDg/N0lFP0VBPD07Ojo8Ozs3NTs4Njs3NDY6Oj47Oj0+Pj07Ozs+Ozo4Ojk5NkBBPTo8PTo6OT9BQ0JERUM+P0FBPz8+Pj89PDtgl5WXl5aVl5mbnqGhoKGioqCenp6enqCgn52bpaWkpKSioKCfoJ+dnZ+hoqOjo6OkobCjXWVkYGFua4GenJubm5ubmZianJ2enJubm5ycnJ6ipKGeoKGioqKhoaCgqJeBrJ+enZqYpIhYZpmcmp2em5manJiXlZWWkY6Nj5KYnZycm5ycnqCdnJucnJyempWVm56foZ+dnJyenp2cmpqampqampqbm5qXl5aTkpWVlpWTlZaam5qanZ6foqWjnp6fn5+en5+enZ6fnZycm5qbmpqbmpiZmJiYmJiYlZSTkZCRkJCQkZKTk5CRk5SYmZiVk5SVlZWWlZaXmZmXmZqenpyamJiXl5aWl5eYjX1ubV9lVlRFSzw3PjdSRUM+QkE4Ozw7OTg6ODY7Nzc6Njc5Oj0+Ojw8PT49PD06Pz06ODw9OTtAPj4/PT45OTs/QkNAQ0VDPT9DQj5AQD5APTw8YZWSlJWWlpeanJ6goKCgoaCgnp6enp6gn56em6WlpKSioJ+fnp2dm5mbnJydnp+gn56rmGNpbW5pZm2enZybm5ybmpmZmZqam5ucm5uam5ygo6SgnZ+en6ChoKCgoKOkb5uknZyamqV5YmaYnJuenpyZmJqamJiYmJKOj5OXnJ2bnJ2cnJycnZycnp6dnpqVl5ygoaGfnp2eoJ+cnJuampqbmpqYmpmVk5OTkpOWl5eVlJiYmZucnJydoJ+gnp6enp+fn56en6KjpKKgnp6cm5qam5uamJmZmJeXlpWUlJORkZCQkZKTk5OSkpOUmJmYlpWUlZaWlpaWl5iYmJiXmZqamZeXl5aXlpeWl4l4dmddX1dURUU5OTs8WT5AOEI/OTw8Pjk4Ozg6Ozc5OjU4OTs9PDk9Oz0+PD0+Oz8/Ozk+PDw+Pz5AQUE9ODc7QkNFP0FFQz1AREJBQEQ7Oz47PGKWk5SUlpWUlpiYmZubnJycnZ2cnJ2en56dnJqkpKSkoJ+enpybm5qZmJiYmZucnZ6cpolla3R4bVuFop2dnJydnJqbmpqampydnZ2bmpuboKKinpucnZycnJ2enp6ep3mHpJuanJ2geGtmk52cnZ6cm5qanZqam5yVkZOXm52dnJ2fnZycnJycnZ6fnp+cl5idn6GhoJ6cn6CfnJubm5qbmpmZmZmZl5WWlZaYl5eXlpaYmZuenp2dn6GhoJ+fnp6fn5+dn5+hoqKhoZ+fn5yZm5qcnZuampmXlpaYl5eXlpWTkpGTlJSTlJSUlJaZmJaVlZeZmJeYl5eXl5eYl5iXl5eXlpaYl5eVl5eDeHZfW11eUT1GOjk4P1VDQTtDQzo8Pz86Ojk3Ozg4ODc0ODk8Ozw4Ozs8PTo8Pjk/QT06PTw+PkA/PUBBPjk2PERDRUBBRUU9PkVERD9COzo8OTpkl5SVlZaUlJSUlJWXmJiamZqcnJydnp6dnZybo6Oko6CenJuamZqZmJiYmZiam5ubm6WJa3F2em9lmp+enp2dnJybnZ6dnJ2enp2dnJydm5ygoJuampubm5udnJubnKJ+gJyZm5udlXVqZ4+fnZydnpybmp+fm5ydm5mZmZudnZ2dn52dn5+dnJydn5+fn5uanZ+goJ+dnJ6gnpubm5ubm5yampuamZudnJqZmJeYmJiYmp2foKCgoJ+hoaGgoJ+en5+fnp6foaKhoJ+enp+enJqam5ubmpqZlpaXmZmYmJiWlJOUlJWVk5OVlZSVlpWVlZSYmZuamZaWl5WWmJiWl5OUlJGRk4yRkJOWfXhqYWJiXFA8QDw2OENWSERCOjg7Oj47Nzc5Nj06OTk2NDc6Ozw9OTo6Oz87PT08QD47Oz46PT89PkBBP0A8NztBQ0U/P0REPj9EREM+Qj07PDs6Z5aTk5OTk5OTlJSVlpeWl5aWl5mbm5ybm5uamaOjoqCfnpuamJeYl5eXmJmYmZybm5qkgGpqb3lzcZegnp2dnJydnp6enp+enp2cnJydnp2bnJuampqam5ubmZmZmpqqf32Jk5ycm4hxaGiOn52cnJ2cm5qdn5ucnJubnJubnZ2dnJydnp2enZydnZ2cnJ2dm5uenp6dnZybnpubnJycnJydnJubmpmbmpmYmZmYmpmZmpyfn5+jpaKfoaKioaGfnqCgn5+fnqCioaGhn5+fn52ZmpucnZqZmJWWl5aVlZaTkpOUk5STkJCSk5GUkY+OkJGOlZabmJWYlJmXlJiRjJCPk5yTkoyFjIeDhndxZ2pkW1xRQT44NkJHYEJFR0A+Ozw7Ojg4NjU8ODo4MzQ6Njk9PTk5Ojs9Ozw6PD48Oj5AOj5APjw/QD8+PDg6Q0FEPz5CRD8+Q0VCPUJAPDw8OmeYk5KSk5OSk5SVlJWXl5aWlZaXmZmZmpqampqkoqCfn52bmpmYmJiXl5iZmJmcnZ2cqH1nZXN7enOJop+enp2dnp6enZ2enZ6enp2dnZ6cm5ybmpubm5ycnJmYmZmYon+GgoKZnpyBcGJojp+enZ6dnZybm52bnJybnJ2dnZ2dnJ2dnp+fn52cnZ2dm5qbnJmZnJ2dnZ2dm5uanJ2dnJycnp2dnZybmZeVlZeXmJqam5ubnZ6foqOhoKGhnJucm5ubnZqcmZycn6CfnZiZmZmUkpKUl5SPj4+OkYyNiYuQi4mLjpGRj4mQmJiQkoyNi5KQj5iYoqiqpqWlrKOmoZqep6eyqKKVo6Cfl39wcWlsXFtcTUY8NzdHR1g+SE5URjk+Ojg5ODc1PTk4NzMzOTY6Pjw6Nzo8Ozo6Ojo8PDs/PjtAQD47PT5BPDw2N0A+QkA+QUY+PEFEQT1DQj49PDlmmJSTk5OTkpOUlZOVl5iYmJaXl5iZmZqampqaoqGfnp2cm5mYmJiYmJiYmZmZm5ybnKx/am16f3lxh6Genp2cnZ6enp6enp6dnp2dnZ6enJubnJubm5ubm5yZmJmZl6Cbm3x6m6ObgIdrZZCfnp6fnp2dnp6dnJydnJ2dnZ6fnZ2fn56goJ+enZ2dnZybnJ2em5qbm52enZ6dm5ubnJ2cnp2cnZqYl5SRjo+QkJGVmJSWlJiZmpudmJuYlY2Mjo6TkpKRj4mQjpGRjo+Ki42NjYiIi4+Lg42NkY+MkI2Qk5WVnJihoJySn6SipKmam5eanKOprb3Bwbq8uL26ucC8ubq3uru7tL2zwbV/bnVmZ1peWUxJRTo7TElTPFZSSUM6QTo7Ozc3NTo6OjgyNTY4Oz08OTk7Ozw5Nzo4Ojw6PT85PD8+PDw9QTs5NTg8O0A/QT9EPTxBQkA8REM9PT06YZOTkZCUlJOTk5OTlJeYlpeZmJmYmZqbmpqamp+gnp+fnJqZmpqampmYl5iZmZmZmZmphXB1e4B3b4mhnp6enp6fn56en56fn56dnp6fnp2dnJ2cm5ubm5ucmpiZmZupnIhnbq2qjGiDgWyUn56goJ6enZ6hoJ6dnp2enZ6fn56en6CenZ6enJydnZ2cm5qYnJuVmJqamJiYmJmSjJCXlKCXk4+MjYqKiImMiJORh5CPjYqKkJCLjoqMi4+IiImJjpGOjYaFiYaKhoWLiI+SkJCNkJKXlpKamJ2TlJ6kpqaqq7Gsr6+rpquqsbm5tbS0rqyvtMDIxcXBvsbDxMTDurW+t7a0s7C2tb6qcHRyXGZfXl1JRj8/RUtMVklcTEQ/PUI6Qzk5Nzc7OTk3MTc5ODo+ODg6PDw7OTc5OTs9Oj4/OT5BPDs+PD46OTY5PDpBPkNBQT08QkBAPkJEPj8+OVyHhIOHi42KiYaFgYqMkZOVmJiHlZaWkpiampmenZ+gn52ampubm5ycm5iWmJiXl5ibqo56dXZ7f3mCoJ+fnp+goKCfn5+foKCfnp2dnp+enp2dnJqbm5ybm5uYmZegpoh0X2WeloJXcnt6m5ybm56dnZycoaGfnZ6dnZ2dnp2dnJiWlpaYlZWSlpmWk5GKjI+PjI+NkIuLj4+WiYiEi5GZjn2Fi42PjYyHioyQm4yRj4+Lio6TjIyNjIiSi4yFiYyPhouIh42KhYyEj4qXkJOYmpWbnKOqoaKknKKrsbe0ubWxs62vsrKlp7O6sbq6vLa3tsDDw729vLa/urq8wbW4wL60r66mqa+3mm58Z1tjWl1fSEU+QUtJU1hZXkFGOTk9OkY/Pzo3Ozs7NjM6Nzo5Pjg6Ojw9OTk4Ozk7PDo+PTtAQDs8QjxAOjg0Nzw7Qj9BQj4+O0NEREBDQz0+PjlhmZWLkYWNj5aSiHl9e3+Fi4OKgoqJhmuAeJCLlpqRnZ2UlJGTlpeampiWk42Sk5KQm5uIdndzcX1/cpGgnZubm5yenZ2eoKGgm5uWlpucmpubnJuYmZqYmJmbmpuVop50Uk1vlYR4SVlwd5GUkY6SkY+Uk5KXm5mYm5ePjpCLjo2Ch4uLi4qLiI2RjIeHhoqIiZGKh4yEhYqNi4qNhI+UkIyDkJOUmZWQi5OTkZWRlpWOj5GMlI2Oj4qIj4ePhoeJiYmNiomJioWNh46JmJKUmpuXmKChp6Cko5qqqbO2sbWwqKmiqK6tn6qvsK21ubi8wr/BxLixtbCutrOwuL68ury+urOzp7G3wpB1gGNiXlpXUk1IRkVQSVlXX1tDUDpCQz1HRj84Nzo6NzU1OTc8OTw5ODo9Pjo6Nzs7Pjs7PTs9P0E7Pz48Pzo4NDM3OkFBQEI+PjpDREM/QUM7PT45Z6mloqKZn6CippeUiI2CiIJ1h4iKiIp7e3Z7enmPeoiSfn18en6CkYWBgH1zfH99fISHfnRweHZzfHaBj4iIiYeIioyMkZicl4iOhIuNi4iNkZCPi5GPi4yPkJGRj6eVUzlAdIlxZ0U6VW+Bh4aCjYuGiYp/iYqGiJiRiIOIg4KFfIuLjIaJi4iKkIyIi42PjI+Wh4mLio6NjY2Wk5OdnJyalpycm56bmpuYnZeTkZWWkJKRi4+LlpSMjYqDi4SEiYyQkIqOio2LipGJjZOTk5SVk5KcmZ6Xn6CfpaKvsamupKSfmKStpqa4t6ysu729wsPAv7+vpa2wsLS3uLO0uLa0ta6stK+4tLaBeXpjZmBeVlFRQUVMT0lcXl9UR0dCS0xCREA9ODg7OTU3Nzk3Ozc9PDk9Pj05Ozg6O0A8Oj06PkJBOD88Oj84NjQyOTtCQD9CPj04QEI/PkBEO0A+N2CloJqXnaGaoaCPl5efl5WCjaCfo6GdmpKOjIxycXBvdnFucG1ucHZub29waHBxcHR+c3FycXd7cnl2d3Jyd3Z6e3l8fXt/iIGEi3+PkYaNi4yGiouLiYeEgYaDgIqoeU5oVHSLd2VPVUNfd36AgpKQhoSEhY2DhIyPj4+IjY+Hi4iRkJWRjpCKk5eOj5WYp6SfnZWYlpaln5udq6aqt7W4srGnr6qnpqGfmp2WkpWVkYqPjImTjZuVjYuLhoaJjJWQkJCLmZKVlZSbkJiTlIyNkYyWl5WilZ6mqauno6OqsJucpp+mq6G0vb6zs7+5u7u6uby9rqiusa6wuLyztLGxqrCpqLGxsqild3J0X2hhYFRWUUlKSFZNXl5eVExKRVFKRUdDPTo5OTc0ODY4Mzg4PTo9PD47OTs4Ojs/PDw+OT9DPzg7Ojg8Nzc2Mzc5RT4/Qz89N0BAQT0/RDw+PThUj4yGh4eUjJWZl5yWmZaNlZyWlZydoKCdmpiWeHFubXJ4cXFsbnJwa3FvcG1yc3t1dnd5fnVxeHZ0d3tybn98gX15eH1/eYOGg4WCg5CLkIuLi46Pi4mJhYKCfn6CoF91jGJ/p56IXYZ7UWt/fYWOjYuGjZSSi5CXj5SXkpihlp6WlZunpp+goKawq6GjpbW0sqqmqq+isba5vcK7ucO+vLi9uLWxrLCspZuSk5mfm5SPk5WOmp2doJqfn5edo6qsoZ+em62hp6qwqaampJiRkZWUo6SirKSss7Szs6i3tru4sLKvra2yt7a6srW6s7e5u7i8urayr6yxsbKztLOxsa2us7Gzs6yhl3Zxc19jXlJRVE1PSUdYT1pcZFROR1VPRURKRD44Ojg3NTg4ODU5Nzo6PTw/Ojg8ODk5PTs9PTpCPj84Ozo5Ojk4NjI1N0I+P0RAQDY+P0I/PEM8PT46Tn98go6MjJOTl5eaj5SWjZaRkZSXk5qanqGdnHJvcnFxcXFxcG5zcW91dHJxdneAdXd8eYV+d3t8eX1/fICJiYmDfXp/h4GIiYGAgIGGiIKGi4eIhYSIiIqFgIJ9jJZjudSPvbqpt4d0fGlZf4aKjouNkJmclJSUoJqan6Ktsa2ppKWtr6ysrLWuvrmtrqm1sLexq7G2rK+9wsLAvrq8trKutraxtK66u7OurKepp6unoqmtoKmooq+wuLSxvLq6urK0ta+8tLezt7e7t7mtrbCprLW5sbeytLe2sLu7vLu6ury1vLi0wbWsqqqrtLG3uLm1trSzsKymrrCqq7Cxq6yusLKxtK6qo5N4dnJlZ1tMUlBFTUlTV1JlXmdUUExcUUhMUkNBOTk3OTU4ODY2Ozc5Ojs6Pjk4Ozo6Ojw8Pj08RD45Njs7ODg+OTUxNTZCRkREP0A3Pj5DPjpBP0BAO0t/gomXmJSdlpabmIuSlo6XkZGVl5SZl5+bmZx8dHV2dXl1c3RudnJzdHV2d319gX56gXyDfoJ/fYB/hIKFj52RiYF/go+Xjo6HgoCBiIuFfoqRjH+IjY2Mi4eSiZWCgc/EnNWtmrCeX4JxVHqRiYmQj42PlJSYkJWcmp2eqK6yr7C1tLOtsrW4sLy1tbGqsKqztbS7t7SztrS1r7i4t62noqassLCvtre3vrW5vLOysa61u7C0r6+yu7axuMC9tLS0s7izvLq2tLrAvbm6ubq+ubm5vrWysa+yr6q1tLGzsbSzrri4tb+vpKaoo6ussa+zrq6wsKytq6qroqKmqKKnrauqpaynoqeYeHlxZmVZT09NSVJNV01PX15cTlVVYlFEVE07Pzk8ODk1ODc1Nzk1Ojo6OTs4Ojw8Oj08Pj4/P0I9ODY6Ojk6QDs1MjY2QUZDQz4/Nz49Q0I5P0I/PjtLjpGTmJmVmZGTopiTkpKLk4uOkI+Vl5ablZSbhoJ9enh2dHRzdH53end2gIKDhouMhISFioaQiYeRk5aRjZaalY+IjI+emJaVkpCTl5qamZGeoZ2Tl5uhmp2bo6Gcbo+6pLjRsaiuk2yzp1V0lI+LmJqPj4yUmpecnZugnaSstLm6vK+2tLi0tLK3uLmzq6+qqKy1srK1rrGrrqa3s7OxpaGotbCvrayrtbqyu7q6tLK3ur67ubG4sLmtqLK4u66ttLS3tbu2trm5vLe0r7G0t7a5s7e1pq2pq6ior6yprq2up6KxtLG0q6aop6Cjq66oqq6orLKwr6+pqKGeoaGjpqOgopqlo56ol3J3bmdiVUpUT09KRFBLX2JYWlFcVGBNSFJJQUA5Ojg2Njc3NTg5NDs5Ozk8Nzs+Ojg8PD0/QkBBPTs2OTk5Oj87NjM3OD5GQkJAQjk+PUBDPkBGQj44R5OWkZWTkpSQkZ+ZnZmVkI+Sko6Mk5aWko6RlZGSkIaBeXJzdXuBhI6HhZGTkpicnJiVkJWYo5yaoaeqqZ+clpeVnaKioZyZnpmlqKyvramnqqqpp6KlqKmrqamwo3SNlX6xvLOrlYddlsRsb5yioaSem5qkp6Spq66spaSoq6+xtK6qrK6zr6ystLO0ua6urayqrLKwsK2wqKqmsrS0uK6qtrqwr6qurLC3s7i0t7W0u7y4tbWxtauyrKiys7uvrbGytLa1sbG0s7OvrKuvs7a0sayutKqqpqWnrauoqKupqqifqbOwqqeppaOio7CtqaatpairrayppaSioKWipaOYmZyVnqKippdudWVnZFdPWUtLSktTVHBiWWRXX1tcUlpQTEM8ODk6Njk4NzQ3NzQ4Ojw6PDg6PTk3PDw7PkM/QT47OTo5Ojs+PTg0NThBREVEQkM5PjtAPkI/R0Q+N0KSm5SVlZaVj46Wl5qZlZGKk5SSjo+SkYqKiY2Ul5qTjYmCho6VkZSfmpuin5+jnqGhn5ijpKelpaapqa2rqaKmpKilpKGfnqOjra2srairrq6rq6ykoaKlqaeoqq+Si3Z7p5eOj396am2Rem+Wo6inoKKhrqyrqqetrqilpKmpqqmmo6iqqaekp66wr7Ovq7Crqq+yr7Czua+rqLCxrrCyubO0r62vtbCss7GurLW1tLSzs7CvrKyqrKusr7G0s7CwrrCwsKyqrauqq6alrrCysKumqbCvqaOkqaunqKaopquwq6mvqaaoqaalo6iwraqpqKKpo6WnpKGhoKKloZ2el5aYlJugpKmUbnNeamlfVlpOUk5QT1NlXGVjW11ZXFBZT0tAPDs5Ojc6ODczNTMzODo9OTo4OTo5Oj08PEBEPkA9OTo8PDw+Oz45NTo8QkFFQUNBOT47P0BEQENCQDdAkZ6YlJeZlpGHi5SSl5GIg4mLk4+OkI2Hh4SFlZmWmJeZlpqeop2ZnKKkoaCdn5qfoKGgpqGgoKCjo6KlqKmrramqpqOmpaCloKaop6aoqaepqaSoppqdpKWjoaGrlHxbaZF+e4Byb2tzcXt7lJ2ioqChn6GhqKCcnqGloaCmo6KepKGspp6foaGkrKqnrKivq6e0sa6ur7WyrKqwq6mtrbWwrq6srreup6yqpKivsq+sq7Kvqqqpq6utqa6urrGxraqtqaunp6uoqauinaapqKilqKisqKilpKWop6iopqmsr6+oq6mhoqKlo6Opq6ymqKWjqKKhoKSdnZ+hoZ2bnZ+amZWcnKOqlG9zZm5yZF1dUFVPWE9eZGRsaGJiWlpSVE9NQTo9Ojo4Ozk1MTYzMjg4Ozk5OTk7OTk8Oz0/Qz5APTk7Ojs8QD0+PDk5PEFBRUFGQTo9Oz9BQUJBRUI4PYqWlJOYmpaPiISNjpGSjIiIiI+JiZCRjoqKiJubmZygpaKlnqKjoZqeoZyanZ6bnKOop6ugoKOYoJ2XnKGjo6WjoqKkrKilqaCepqmnq6mkoKKgo6ehpq2np6Ksp31sU1t3b3F2a2dkamZueIGPnqChoJ6doKOalpqYo6KipJ+ZnKGhoqCbmp6goaSgnaejqrGorqusqaSqqquorKalrKqws6+rq6mwq6appaWoq6ynpqevq6Wnq6upq6irqqqrrailqKOmpaesqayoopykoaOmo6qpqKano6SnqKanqKepqKupoaKoo5yepqWjqKino6WlpqmgpJ6inpeYnZ+doqKlnpiUlZ6go5d1d2t2eGJfXFVZUVVXW2Nfc19oX2NTUVlUSD48PTg7OTo4NTM3MzM0Nzo4OT05Ozo5PDxBQEM9PT44Ozw9PEA/Qj86ODo+P0NAREE6Oz49QD9DQ0VDOTyCmJmenZ2alZKKiZGRl5GQh4SJgoGNj4+Sj42cnZ+hpKmlqaeorK2moqGfmKSmo6Stsa6yp6asm56em5qjp6Cfo5+foq+rq6yoqKuvqaiqqKKgoaeprrS3trm2ro9qY09Wbmtrc2hiZGJbYGZvdoCNm6OloaGimJWem5+fpKGblZigoZ2enJudnZuZmZWen6Oonp2iqKGaoaOmoqSoqaqoq7CxqKWlp6eopKWpqaqnoqWmqKadnqWloqClpaOlpqCjpaOjpaelqamqpKekpqKmp6SrqaenpKGlqKynpqWlo6OopJWdo5+bnaCjqaeopqGjo6mooKiioJyVkZqfn6GmopuXkpCamqCVfHdvfXlmW1tgX1pcVlxoZG9jbWppYl5QUEA/Ozo4OTg8OzYzNDMzMzc5OTs8OTs7OT49QkBAPTs9ODw9QD08PENBPjo4PT9EP0M+Ojk/PEI/P0FEQjk6gJ6kp6Kem5+gmY+ZnaCWloqGj4iEi4qTl5SRo6Wnqq6trLOys7S4t62pqqevtLKxqq6usbKusa2lq7OssbGpq6+rq6y2sLSwq7GysaOgo6qqqbTCxsbIx7+zppJ1YmBKT29xbXRnYGdnWF1bYGdsb3V+iZOcpJ+hoZqWnqScm5aZoqefoJ+joJuUlpmWl5qfoJmVnqGZmJ2dpZ2gpKeqqaiqraylqaSlqqeqqaqsp6SkpKOimZmhnpqaoaCfpaWYnqSmpKqooqelpaGqp6mnp6ejqKWmpaGkqKesoqekoaalpaOVl52Ym5mVo6elpaSfnZ2lo6Kqo5+amZiXnJyaoaGakJOTl5ibjX93cnZ4amJbX15cYllgZG5ta25hX2RgUE9BQDs7OTs4Ojk2MTQzNjQ3Nzc6PTo8Ozk9PUI/Pj89PDo/OTo7PD5CRUA9OTtAQT5DPDs5PzlAQEBAQkM7OXuao6OcoJ2dop2Zn6KioJibmJaYkpSQm5qWl7S0rrW4s7S4tre0uLm3tbm4ub28uKqLnLK4vLS9urW7uru4s7q/uLe5u7G3r6iusq2inaCrssDY4d7VxreqnZF8Z2JfRlJqbnF4aGBiaVlbXltcXWFiYWBmfKG9vaikmKGko52goaKooaOgpaGck5mYmJmco56cmpudl5uZlqWam5+hqKmpqKuvr66pqKirrKytq6irp6WjoJyfo6Ojn6Cipammmpyip6Spn6GjoqKgpaanpqSooJ+ipKGjoqiop6OloaGopqalo5mbmJuTj6GknqKfmJiVoJuhpaCfm5udnJuamZugmo2YmZiTkYaAdnh4eGNbUllUX19hbWh2bHBoaWliWlNMQDw6Ozg5Nzk3NTU2Mjg1Njc3Ojw7Ozs7QD4/QD0+Pjk6PDk2Nz47QkZCPDg7P0NDRDw+OT43PkFCP0ZDOzhwkpqblJ6bm52Vl52doqajopaXnpaXl6GblJi+t7G4uba3t7i7l5S2vbu9vcDFtaK7mKC3v7+6wcm0nbu2sra/xcGooLa0urGqrrSxsLK0tba/ydXWx62YjoJ1ZWBjXEFRbGh1dm1iY2RaWVpbWFlbWVdnjbXAv7aus6CnqqynqqmlpqCnoKGmoZOWmJ2foqSjnZ6coaChnZekmpmdoKaqqqqtrq2tsLGrrK2sqamrrqimpaalpqSkpqaeo6eppKGcoKKjpqCio5+jpJ2foqWgpJyboZ6fo6GhpaSlqaOkpaKkp6ehn52elpOcoJiZko+MjJeWn5uWnJqdnJqSlpSUmJOQmp2YiouHgIB8gnhhXllUYWlgZnNvdGl0ZGlkYltMSz46OTg5ODg5NzM0NTI1NDY2OTw8Oz08P0E/QEA9Pj44OTs4Njc/OUJFQzw7PD5DREM9QDs9Nz1DQ0BFQjw3Z4yRk4qalZiblZWYm6Knq6aVl5iQlZmhnpeXvrWztLu6ubi5woeYt6u4u8DCxbOjw6e4s72/tMTHvbS7uL62wMTErqCworW2tb2+wcTHw8O5vb7ByNDNrYBmXVlXXFVCSnFobWdyZ2FfWFtXWVdUU2KOvMK4t7uwtbaor7Gwr6yqoqajrJ+fpquXmqifpaWfoJydoKuwsKyiq5yYm6Cor7Kys6uorre1sq2tqaalqKulpaStqaShn6Cnnp6mqKmmnp+anqGlpqmcnaObl6KmmpuanZ+cmqGcmZ2eoKijn6GfnaWioKOioZSZmpmTj4qLhI2Qk5uPjpiVm5eYkJORkomNl5iYk4uKi32AgIVwYGJfXmtjYm54dXZubVtiUlZcTUc7PDk3OTc5Ojc0NDQxNDM3Njg8Ozs8PEBAPUA/Pj8+Ojo5Ojc6Pz5FRUU8PT1AQkJCQUE7PDhAQ0NARD87NV+MjIaFlouUlZeYl5ifpqellpWVkZebn5ual7mxtrO5vLy5urWqsryxvsG0vMe5uLuuv6fGw7/KxsnIxcXJvMLHx7+xsKe8vL7FxMbJx8XGu8XBxcXBwcC9jmZWVVdSSER0a2Jgb2dZW1ldW15YY4y6xb6lpbG2q7WyrbOtqK6vp6awr7Ktqq+zpKu1qaeopKCgnqmyuL61tbWqqaausre4t7apq7i8ubexr66noqOop6SfqKOfnqCZoZydoqSnp6GelJuaoKGlnqChnpajnZSQlpiboZqflpORlpSin5qenJudoZ6kn56VnJiPkpOPjImTkJefiZCWkZuUmJGRlZaDjJWXlpKLjIh8foR/aWZoYWtsZ252cXJ1cWdeX1xSSUU/Ojo6Nzg0ODw3NjU0MjMzNjU3PDo7PDs9QD4/QD48PTk5OTs6PDw+QkRFPj49QENDQkREOzo4QUJCQUNAOTJbk4iEjZGKi5GRlZCSmp2fnJOSmJSdnZqXmpW2sbm1tb6+tri1uLO8vMTEusPHwb+0s8XFxr/CzcfLzsvLx8HDxsfIysXExcO7vLzBxcHFxL/Dw8bGwbGUx8q2hV5WVE9HYmiAi4xWVV1gYV1ig7HBua6yp6uoqKqtrKmlpZ6pr6uyu7q4u7e5t7O5uLOurLO0qrC1ub3Bur6+vL60urm4u7qysbS8u7q7s7Oyp6Smq6uioaCdmpudmpyXmpuenJygnZaclpuZnZ6io52UnJCNiY6OkZ6bnJWNh5KLmJiWmpybmJybnp6cmp6UjpiYmpSRmZeeoZWYmpKXlJWRlJqYk4+TnZaSi5F+enx+dGtsbmRvbWlxeG55aWlhXGdhUUZEQTw5OTc2NDQ6ODQ2NTMzMjY1Nj05OTs7PT47Pj49Oz05OTs7Oz89QUNBQkFAPEBDQ0NFQjs4OUQ/P0BCPzsyV5uQkZCQh4WSjo2IjZCTlZGPjZSUm5STlpqRs7e4uLi+u7C1sri2tbbAw8G+w8LAvru+u7u8xMzEzNDLxsa/xcfLyNTLysjGv7u7vsS+xcjGxsTExLm1wLa1yc+ja1VVUVNfmKmlUVZbXl5mlcC3pquzta2upaSjp6SgoKWZqrSxvsG+urm6uLW0srG0tLO6wL7Av769u7u9vsDCt7a3tru7sru+ubi3u7a3tKyoqamrpqijnpOampyYkZKZl5GRmJqXnpiWk5acm5+elJOJiX6GiIuWlJiZkYmVkZeWlZmbmpaYl5idnpyhmJWZmZyYl5ybn56jnJ6WmJeTl5yZmZyUlp2UlpOJdnl5e3Zua2lodVpmcnhzeWZmXmRbUlhJRj87Nzg4NzYxNjk3NDQzMzM2NDY7ODo8Oz08OD0+PDo7PDs9Ozs+PkRBQURCQEBBQkNDREM9OTlCQD8/QD89MkyWmpaSk4yKmJCKi4yOkpKKiIaNkJiKj5CUl7O7tba/vb2xtrjBvby0uL/Bsbi3vsHFvbu8wsbJv8jOyMHEwcfKysbKxczIzcbIxb/DwMvNz8rGxMPEwsW+t73Dyrp9VVRUTI+tnk1UV1dolru0sa2suLWyrKmjoa2prKatn6y1tL/Cvrm4vbawrausr7W0ur7Fv7u8urO5u7i5ubWtsLS9u7G/vLiytrmzubu0ra2orKyqqaeXnpualY2MmJSTi5WWlJyZl5WWmZKYn5mQiop+iYqKkY6Vl5OUn5mWkJSZmJmWmJOUm6GeoZiYmp2ZmZaenpibopqdnJuYmpuZlpeXlpyZlJyYfoB4eXV1ZWZpamhdam9ueXhjYmFgXlhXRkU4Ojg6OTc5NDQ5NzY2NTEyMzM0Ozo9Pzs9PTo6PTs8Pjo7Pz48QkBDQkJFQj0/Q0NDQ0RFQDk6QkFBQj5CQTVCkJeUlZmSj5qQjpKRjZSVi4qHjI2UiImPkpq2u7S8xsHEwr3BxcLAtLO9v6ywr7rDysPCvs3IxbfByMW/wcLIy8rCwsTJzM3Oz8zDx8bIycjIycfFycfIx7/Fx8PHwotYUUuGsJNJT1VooMG9v7m8ury6vKytpqm7urm3v7K1uLLAxrq3t8Gzsa2tqau1s7u2w7a2vbWxt762s7e4sLW2v7uwvbq0q7CxsbO8urOzrqutq62xnaOjoJqQjpiXlZCclpaYlpWSnJmTm5+clpGUjpWQiYyQlZOUm56YmZKSnJedlJmSk5aZmJ2VnJ6do5yVnZ+TnKKcnKCfnaOemJSVl5ebmpmgkH99cXRxb2NhZ3ZoaWl0bXlsXWRbVWBZTEhDNjw5OTg4OjUzOjY2NDQxMzUyNTs6PD47Ozw9PDs8PTw7PD49P0E/RUFCQ0M+QEFARUVERUE7Nz5DQkI+Q0I4O4+akZaalJKUjZCUlI6VlI6Pi4yJk4uIkJObt8C6xsXEw8zCwcS9vrWvt7uvr7O6wMfFxMHMy8W2ucDCwsTHytHLwsPExsnFzNDNx8zJwsLHwsvLyMfMyc3FxcTDxcfJp3RNerKKR054rczNxsTBxMfBvL60sbCwwr6+wca/vri2w8K6urbAvrWyrKmvsri+tMC0tLi0t7nEua+8vrm+v8K/tbq2q6qsrq+wt768trSura2utaSlqKimmpycnZyeopydmZOQkp2VmKCdmJiVmZmZl46MlH2QkJefmZmYk5GToI6Nko+VjpCUlaKdnKSem56elpyjoKGipKOkop6amZubnJ2enIN9cnx4cGdga2p3bGlldW50Y11iVFdVU01HOjc7OTk3Nzo3NDg3ODQ1MjM0MjU7Ojk+Oj08Pz04Oz05OTk9PEBBQEVCQUJBQT9AP0RFREVAPDk+QkNCQENBOjSAoZeUmZiVkImUk5aTiZGMlJGOiJaKi5CXnMXLw8O8wMPHwbm9vbu4tre3rrK3uLzAwsDCx8bHurzAwsTHyMbSycHDw7+/vsTLyMrLyby8yMfJzcjDyMnJxcXBwcDAxsvDk2R9ZEuDycnL0MW2v7/AwLq7vbWzs8C/ub/DucC3u8G8uri7ub27srCvsKy5wri9ube1t7q9xb24xsjCwcLGwr28tamurrCwr7O6t7m2sK+tr7OppquprqannqSlo6OjoqCblZiekZecl5GRlZeZlZmRlJiSlYyYo5qcnp2FiZ+TfJKWlZKUlJennaCipJ+en56foaGkoqKjoaOinJ2fnqOhppl5enl/cnBmZWdjamRiam1ub15ZXVZWTlBKRjk5Ozk3Njc3NjM3ODk1NjEzNTI3PDs8QDs/PDw6ODo8OTk4Pj1APz9GP0JBQz89QT5ARENDQTw5PENBQ0RBQDozbKKdlZedlo+PmJiZmIiSjZGVkI+Vjo6TlpbKy7u5urnBu7q3vsG8vLu5sa61uri4u8S6vsC+vru8wMXBxsK+xsK5u8O6uLm8vsHHwca7ucjIw8XEwMPBwcDEwcK9vMHAwMSTUElzyc7EyNDBr729uLm7u763tLG5vrO8vrG5tbi7tryztbm2uba5t7GtusG6vMG/t77Ev8bDw8fHwrvAwr/Cv7iys7O1tLGut7S3tbSxrK2xp6Wlp7CtqJ+nq6ajqKWmpqCgn5SYmZSRkZWUl5OYl5qhnZ6hnKGdoaWglpSbkZeXmJqTnpmZqaSlpKWdoqCanqCkoqOcoqGjoJ6cnp6ppaiVfXuDeG5mYWRiYWNjY2piZ2NbWlpdWVFPRT07OTo7Nzc5OTY0OTk6NTMxNDUyNzo7OkA9Pzw8OTc3Ozo5Ojw+QD8+RDxCQURAPz49QkRCQkI+OjlCP0FCPT44NVmfnJiTmZaRlZiYmpeQkZCQk5GTlJKSkpSUxce4tbq5wrm5vMPFwri7ubGxtry6tbnAu7u5tre0tLW/u72/ub66urTAuLW3sq66u7fAt7zKz8G7v8C8u8S9usDEv728uLu/xXlJoM3Ev7/Jv7DBv7q3u765tbe0uLy0vbi1tLCzvLG3tri/tr25vb65t7q+u7/Axb29y8PGw8TAw762ubq2v7i7v7y4trOyq7CwsrWzs66sq6emnqeurauiqKumpqqjp6iqo5+Ym52bmpicnJiXnJuhpZ2anqGhoKGmoJqbnJiboJ+dnJ+coKiho6SknaKfmqKgop+el6Shop+dmpieqKWhi3x5iH1xZGFiY2hqZ2dpZWleVlZUWU9TTEY4PzY7Ojc3OTs2NTo7PDYzMTM0MTc7OTg/PT47PDs3Njk5ODo7PUA/PkA9PT9CPjxAQUNDQT9DPTo2PEBBQDw9ODdJlJibj5OUkZWYlZGWkpWRkJGUlZSTk5OYlcHCwLq8ub62uL7EwMKxvbqytLO4vLW3vMC8vbS0sbC1t7W7wbi+ub+8vLe0t6+ut7W5v7vB1Y68vrvDtbrHt7a5u7y4ubW6xMqXTaXIwL+7wb65xr3Cv7zFuLa3tLi2tru7uba0t7q1tLi8vbm/ucPAwLu5vLu+vcjEvcfEw7rAvb62sra4srm0usLCureysaysq62yr7Kur6ijpJ6rrKyqpKakpKiqoqemraihoaGmn6Oiop6bnKKfoKOdnJuhn6KgpKCem5eZn6GdnZ6eoaWkoaKioZ6ho5yinqCZnZijn52eoJqZoKKmnYR6g4B4cW1lZWZwamVraFhZT0tLS1JKTEhEOT44PTs2Ojs5Njc8ODk4NjA0MzE3OTk7Pz0+Ojw6ODg5PDg6Ozs7PD1BPj09Q0E8P0NDREA/Pzw6Nz5CREE/QDg4P4mYmoyMkI+Tl5WMkpCakpGXmJaUlJKQmZTDvsbBwby8uLi6v7a8scK2tLyxtLa4s7q9v768sq2vrLGwt7y3u73BxLm3t7a1ubm6u7+80MV5rcu9x7e5uK22tLe5s7Wyu8XKn1Ckyb+/vr28v8jDxcW+xri1srK9uLi4vrq6uby6urS3u7q5v7zEwL+5uri/ubvFxr3Fw8Kyur27sa+2uLO3s7q+wLm2rLGrrqmqqa2qqq6mpKWnrq2ppaOio6GkpaWmoqato6Klo5+ho6Gcmpyhn6CloaCenZygnaWgnpeVmZ2fn52gn6KmpaCknpybn6Ofn5mcmZ2epJyWnKOcnqGcppZ+f4d8a25wZ3Brc2ZibmBcVEhLS0RKQ0NHPjo7OD48Nzs7OTc4Ozc8PDYyNzUxNjk8PD08QTs8Ojs6OT45Ojs9PUA+RD89PkRAPz9BRkQ/Pzw9OTc/QUNCQEI5Ojl3nJiLh4uQkpOWjY+TmpOQnZiSkY2PjpiSvbfHvsO+vbu+vL22uri9ure9s7OwuLi1uby7wLeqraSusLi7sr2+u8S2tbi1t7++xLzCxNiudoS+yM/CwLiutbW7vbe5sb7Dx5hRos7Dwr++vbzHzMfHxMe9tbW2wb27u7/CusDCv7y2t729vcHBwL+8ube8wru3v8W7wr++tbe8vK+vt7awtLO6ubq7r6mtq62rrKaqoqeuqKWqra2vp6Sgn6ajnqKjqKOjq6Oiop6dm5ublJaZnJyfpZ6fnpmYnpejoJyXmZqZmqOjop6jo6egpqCbnaCjnp2WoJmcoKCblJegn6WcmKKQgYaAcWZsaW50bndjZ2JcY1FLVUhFRUNHQjw7OTg9Ojc6PTo4OTs3PD01MzY1MDY4OTo8O0A9PDo+PDk+OTk9Pjs/PkM8Pz5APz4/P0ZEQEE/Pjo3P0BDQz9APTo4ZqGYj4uNlZKVlY6PlpmVl5uVjoyMjY+bk7m2wbS/vLm8w8C+wLq1trKywLmvsry8sLe7tru8qqqjsLm9vLK8vrzFuLG4ubzGycrCx8nRmXN3sdHRzMrEtbq/xMi+vrS/wMONVZbPxsK+wby/w8zKx8XGwLm9vMS/v7/CyL3Hx8XFvLrEv7vBv7rAvLu7wMS9t7nCub69t7S2uLqur7WxsLCytre0t6yurKqsrKuoq6Gms6qlra+trKippaOkp5+io6Onoaeiop6cnZyamYyQlpeZnaKZnpuVkp2UoaCdmZ6fmJimpqKfoqKmoqeloqCko6GbnaCbnKKfl5WVnp6kmpafiYGDgXRvbGx0bGxuX2NeYWJOSE4/RUA/REM7Ozo6Ozo4Ozw6OTw+Ojo+NDQ1NTE5OTo5PDtAPD89PTw4PDs6PDs7Pz5DPkI+QD89Pz9FRUJBQj87Nj9CRUQ9QUE6OlmfmJOSlZqVmpOQlpeclZuZlpSVkZKTnZm2uLaxuru6vsG5uca7trWypb69tLbBv66zvbS4wbGwsbS7xdDCur68xL63vMC/yc/HyMrKwod1d6jMzMvNysbCw8vOwby4vbq7gV2LzMbEwMC/xMDKycPDw8O5w769ub+8wsbCyc7Hxr66xr26v7m3wLm5vsDCvrW0vLi2u7CvsrK1r7Cvrqyus7CzsrirsbKxqrCrq6yrrLatqKyusqarrKmpoaWgpaakrKSmoaChnqGgnaCMlJeTm5+mmZ6emZOYnZ+gnp2eopuYp62ooqSgoKKqpqmhqKGlm6CgnZ2jn5SYmKKdp6Gfm4J7eod6bW14fGBxY1teX19UST5DRUlCQz5DOz42OTo7Ozs7Ozs7PT05PTU2NjIxODo5Ozs6QTs/PDw+Nzs8Ozw9PTw9Pz5BQUE/P0FCQUVDQkRAPDY+Q0RFPkJEPztTmZuZmJ6dmqCalpyZn5KdlZ2boJWWlJqYur20sLu8wcTCv8XGura5sqO7vbS3xLuwtbq2ucS4tLy3u7qt28K+tr7Avr66ppyqs7fEwKZ7eXyfxMbLyMHDwMDJysG/u7qyrnpsesfGxcS/wMG/y8fCwMjAusK7urO6usG+wMrOysS9tby8ub+5ubW1s7/Avre0s7S4rbeqr7CwsrGvq6+nr7ausrG5rra2uLSzsLGttrS6sa6srranrLKsraSjoaenqLKrqqWkp6elpaCml5ujn6SmraKeo6KanaWiop+foaWenrC0sKSlnp+kqaevp6mgq6CiopqipJ2anqGmp6+psZWCe32Cem5zeHRocF1cX1xaUUVFRE1JQUQ9SDs7NTk7Ojw8Ojs7Oz0/Oj01NDUxMjc4ODs8O0I8Pz46OzY6PTo7Pj0/QD87QUFBPj4/QkBBQkJFPjo1OkFCST9AQkA7TJqdnZ6fnZienZmampySoJWbnp+blZGRl8W+urbDvMbCvr/Ixbe1uLe2ubu0r7e3srWzt7m8u7a7u8W2ba/Ovba5wLyqfW5obm10gpeZdXp/nL6/xsC5wLy+xcS9vbixsaCGe3G8yMPDvL2/v8PDvr/HvLy/tLSutbW8vr/OzcvCt7K4t7e9ubuxtrLIwLu2tLGwt6yzqbCtrbS3r6uuqrG1r7Gvt7O6usC/tre2sru6wLWyrbO3rLC6r7KloqWrrK+5s7KosK+xr6qiqKGkraitrLOun6inpqWmq6Sknqaqo6ayuLOrpZyfp6anrquqpbClpaWbpKOYn6exrLW4sLKOhHl/fHdsdXtwbmlcX19ZU1BBRklHS0BFQ0g8PTY7OTk8Ozo6Ozo9Pzw9NTU2MTM2OTg8QT5AOz1AOzs5PD04Oj08QD46Oj49Pj09PkBCQkJBRD03NDU9REc9Q0I/PEWUnqCgoJyXmpiYlZmdmZ2fmp2bnJaRj5LDwMK9wrzEvLy7xbu3s7e2tru7s6CWtayvsbS0tLa4ucDNsXWCtL21tcGkhmlaXmBOU1tccHZ6haS4t8K6s7u3u72/uru7ra6in4qDr8XDw768v7u7uLbBwrW/urWur62wvcC5z8rJw7GwtbS0vbq+urq7ysO7uravsL2xuK+ys7C3vbaur66wt7CsrLK2vbzEwrq9t7bAv8G3tbC2srGzurGxr6err6u2v7e1qbqztbmxp6uop7ausrG1uaisrK+qr7CqqKessayytr20saykqKuoqKusq6i2qaaonqadmKOuvLG7wbSmiYF7gnpzdnZ3bnFhX2ZdW1VKPT8/R0Y9R0NDOTo1Ozk5Pjw8Ojo8Pj4+Pjg4MzE1Nzg5Pj9BPzs6Pz08Oz09OTs8OTs6Nzs+PT1DQT8/QUJEQkE8ODU4PUNGPUREPzw/iZ2en52Xl5WUk5aZnpubmpuYlJ2Uio6Owb7Dwr6+vrm2usCxtbGzt7fCtbOrrbOoqa61r620trnCyaaEd4uisLWcamZnVllfSUlNUFRve4upsLe+ubK1sry5vLa5vrKtsKmXlJXHx8PAvb+5s66yvLquu7Szpquorbq+uMvCv76sq7Cvs7q3ub67wMXBu7y3sLXEtb+0uLu0u8PCs7a2sbisqaWrsr23v7+7u7exvL28trGvq6uprbOvsLCrsLSpuMC2sqm0tbC3tq2spqu7s660uMKwsbG1sbK1saywsri4ubi+tLGzrqyxramvrqqyuK6trainoZ6ptr+4ur+wlol9gHxxdHd0d3JsX2NhXF5PSUI/PUlERk1EQDc3NTs6OT48PDk4PT47PT86ODMyNTc2OD8/Qj86OD4+PTw5PDk7Ozo8Ozs6PEA+QkI9QEE/QkI/PDs3OjxBRD5CQz8+QYqgm6GdlJiVlZKYmpyWm5WalY2bj4SIhru0vb+7vLm3s7y8rLOytLS2wLXAr7Kzqqqxt62pubO3v8aoh3t2jKGYX1NDWVVIYmpVT0VKZZGlr6+2urW0sqy8ubi1uMG9obGwpKN6v8jCv7m6ta6lrLOxprCtqJ2gn6WttrXCt7a0paiqqLC2s7K6tbu7u7W4trC1xLK+vL+8ubrFybq9vraxp6SeoamxrrW5trKxq7S2trGopp6gmaWmpKynq6y2qa+6sa2kpq2lq7GrrKmtuLawsrjBtrGxtbGvu7ayt7W1sry1urKwsbKutLKqrq2nuLWyta2uqqiosrq9wLa0qY6Ce393cHxvdnJuY11mWV1dU09OQT5KQkBLSkA2NjU7Nzg+Ojs4Nz4+PDs/OjkzMjc1NzU8PD48PDg+Pjw8OTk5Ozs7Pjs7OTw+P0E9PEJAPz9CQD47Njc6QERBQ0E/QUKJoJ2loJSWmJiVnqCcl5uYmZGMmYmDhoS1r7S7u7S1sLG2uq6wtLOvtbq1urC1s7KttrqvrbyzuLi/s5CBeYiPbk5LQGVZQk94gZNoTUNehbG1s7WytK+su7q4trm/xYy1v66tbqy+uLWysa2tn6Smp52kpZyWmZmZn6muuayrq5+lqKSrrq+nsKuvsbGtsa6usLmwtLy+uLm4x8W8vLu4qaKcmJufp6assq6zqaapqq6popqXl5GcmpijnqKir6ekrKaompqemqGnp6anqa+2squ0trCqsK+xqbm2sbWxrqy3s7avrquuq7S1ra+rq7GtsbKoraurs7W3ur2wq6GLeoJ5cnZzbXVpbF1balRdW1BOSERHTUJGTkY4NjY1OjU6Pjg7OTc8PTo7PTo5MjM2Nzc3Pjs9Pjo6Pz48PDw6Ojs5Oz47PTk8Pj1CPDtAP0A/QT8+OjU1OkBFQkRBQEJBiJ+ipqGYm56dmqWpmJudmpmUjJmHhoeGrq2uuLmxsqiur7iyq7CwqrK1ubm+tbK4tLm6trm7tbWzt7aVjIiEe1hGQU+HWElKWXiOg2NBVaO5s7SysLGtsLm4tru3ur6esLWur36ssKmrraujqKGdnZ6Xl6CVkpaXj5ifqK6ko6Sgoqaio6mpoaanpaqtp6ynqKesq6yyu7SztLm6trK2ramgmpaWm52fq6yqr6Oko6GpoJuTjo+QlJKSmZaanaSloJ+ep5iVkpSZnqSjoaWqrK2iqaqppKmtrqW0sa6xraqprq+wraWmqqSos66trKmmpqmrpqqnq7Ksr7Oxq6mWgX+Bd3J4aHV0bmVVYWNXXVFPTUhASVJETUM9ODg3NTo3PD46Ozw4OTw7Ozw7ODI0ODk3ODs7PDs4PD0+Oz08Ojk8Ojs9PTw6OkA9PDw7QD5CQEE/Pjk1ODs8RkFDRD9BQYijpqKjnqCfp6Coqpufm5yZmI6Xi42PjKqpqLGvsK2lp6ayr6mmq6CvsLu1vby4wMG+vLy8ua6sr7K8qZiZlGhNP1N5cU9JSUxonX9aRVWwurGss6+urK22trK0ta6ppZ2Zmpyep6ieoKipn6GnlpuXl46dlI+Qlo2Xm6SooKCioqKlpZ2jo6CepaCkrKWmqKSio6OrrLOuqa6urqeqraisoZyamJmYm6qoq6ufpqKbo5yVkIyPkJCTkJeVlpifnp6bmaaXk4+Slp2ioKWipqSnoKKko6Ghq6uksq2qrKyno6yuraufoaKkpK+srKmmo6KqpKqqpKmrpqmsq6ahiHiDfHZ/emN3bG5dUWlUUE5HUE1MQ1BRQD47PjQ5OjU7OT07Ojk9OTk8Ozw8OzkzNjk5Njo7Pz06ODs6Pjw6PDs5Oz07PDw9PjxAPT88ODtAQEE/Pz45NDk8N0FDQkQ9QEOOqqSjoqGinaulpqimoZ6dmZ2PmJWTkJWnpKGmqKmlpKChp6uhnKKbp6u1sry9wMLCwL7AuLSnpKyovcGqpbxmRFOcflBYSUthSVeNYmVlg6+1qrK0rqqrr7Cys62lnZGXk4+YoJ+ioJyjpJ+eqJSblpeMl5GNkJeTmJ2iqp+fn6Cjpaicn6ChnKKfo6ionKehoKSfrKisrKCpq6agpKimrKOenp6al5qrpqqxo6WonqCclZOQj5GRmZCWlZiXn5icmZujmZeUlZqdoJ2nqKWgo6Kho56doKmqpa6upqipoaKqrqqnoaCio6msq6eppqShqaKlqaalpKKmpKijkn58f3V2fW5re2RoVlJkTUpIR09TTktOSDxFQDwyPzg1OTs+Ozk5Ozg6PDs7Ozk5NDg7ODc7Oz48Ojk8Oj07Ozw9OTw8PD49PUE+QEJAPTc6P0FCQEA/ODU1PDpAQ0BEPkFGlq6koqWeo6KpqKipqqWmnp2imJiZmZWbop6bnqOioKOgoZqgmJeXlqGorK62t7q5ure3u66ooKGpoKvGv8qeTkF2mW5PbUpMZGZ2dGFdYnSSsq+us7WqpqyropuZlI2RlZaYmJyfoqKcnaSemqSXl5eWkJKRkZOal5ugpKqeoaGepqeqop+gp5+dn6SnqZ6jpp+qnaqtqq6nqLClo6Smp6ymoqWimpmer6iusqulqqqgm5iYmJWTlpqTlZWalpuXl5ihnpyclpuhmp6ao6eln6GioqOdm6Gmp6aoraOppZ6kp6mkpaWhpaSsrKmmq6eioKSjpKenoaCgpaKmoIl7gH13eXxleXlgYlNVYEhJSktTVElTUU05P0I2Nz02NTs6PDw5Ozs4Ojw9Ojs4NjU3OjY5Pj0+PDk5PTk9PTw+PTs7PDo+PTw/Pz9APT03Oj5AQEA/Pzg2NT08PkFCRkBAR6CupKaroaOqrK6tp6ypqKCipp6bm56aoJyalZmfn5uen56WlJOXk5KcnqSorq2sq6uvqq+pnpeepZykx8aLVlNKZqNZZn1vcltSa2NcZ2JgbZG0sLC4rKahnJ2alJeamZCOkZWRjI6Nk5minJejmZqXmJmUmZiWnZufpaapoKajnqeurqumorGjmqSmpqqioaqiqaSosquxsqu5qKarp6urqaysp6Cgo7GusrG0qrKuo5mcnZ6hmJubmpiZm5SWm5aZnKWhoJqjoZqcmZ+kop6gn6KmnZulpqWkpaijp6OepqOinqaloqWlqKykpq2noJ2eoJ6gpaGenqWgppmBe4F8dnZzaIJsZVtTW1lNUUpPT1ZNU01CNz5DNzg9NzY6PDw9Ojw5ODo7PDo7OTc2Oj01OTw7QD03ODs3PTs9PT06Ozw4Pj09QD5BPj4+ODg8P0BAPT43NTg9Pj1BQEZAQUihqqCrq6GkqquwramtqaelpaWkoKGfnqWXl5SYmZ6YnJ2blo+VmZKRnJihnaqip6Cep6Gln5ySm6Kan6qjjHlVaXF3dW9jd3ZYV2JgZGlbWldora6sr6efnqKglpCTm6CbmZeSk5+coaObnpuWn5qfl5uinqWhnqSfpKitraisqaSstLe2sKe0rKKtraOvpaSmoamorrWzsr22vrCssa6tqaq0sbCoq6iztrizuK2ytKSgnaWgrKGhoqGgmpiWlZ+bm5iloaCeo6GgnpucpaCfnZyhqJ+fp6meoaOkoKagnqehn5ymo5+ipaOooKmrpZ+dnZudmqainpyjnqeQgYKAfHh2and1Xm1bUmBIUlVIRlVXSkNNRz1LSDhGPDc3Oz49PDo8OTg6Ojs6PDk2Njo8Nzs+PT8+OTc9OT47PEA8OkA6OkA/O0A+QUA9PDk3Oj5APzo+NzU4PT0/QUBEQEJGnKueqamipamprqimqqWmp6aoqqGlpKOmkpOVmJacmpqcmpWTmZuNk5+ZqJ2un6eenKGdnpqZkpiem6GhoKN/b4JwYGNXS1tSWkxMUVlSSE9OSJmsqqmkn5+ZkpKUmJiWlpWMiIuOlZ2cnZ2el56Zpp+gqKWxqqeuo6uutrC0srGutri9v7qttbSwt7CutKmmpKWsqbmztbvDvMPBtrq2q66xubi8r7OwtcK8t76zs7WirKKpqLKpq6inqJqZnpqqp6CZp6Cfn6iopaSenaqiop6bn6igpKetmZ+jnp6nnqCmnpycoqGbo6KhnZympaWkn6KZnJukn6CboJyjiYWEfnZybWl3bWhtXFhbQ1dOSkdNR0NGTTw+TD40PDk2Oj0/PDs6Ojg4PDk6Ozs8NTQ6PDg5Pj4/Pjg4Pzk8Oz0/Oz1BPTo/PjxAPj8+Pz08Njs/QT07Pzg1ODw8QERCREFCQ5WqoKapo6mqqKmjoamgpqinrK6lqaWpqpSSl5mUmpqanJiYmZyamJmqoLGit6Swpp+enZ2XmJWZnpqco56ciWJXXmVgV01RRz0/QENEPz5CUnipramqpZ+en6KjnZ6dmpyblJOVlJ6dmJSFnZqgmqukq7KwubKysbKxur28vLm2uMO+v8K/trq7wMS5vbusr6exrbHCtrjCxsDIysDKv7C5ub25wr64s7vGxL3DvLezqrOtqrO0r7Ouqq+jnayotrGto7CmoKOwsa6wpKWvo6GgmqGnoaSqqpmdoJmao6CmqKGcnqKemaSenpiYo6OhpZ6mmZuipJ6fm5ubnIeGgXt0cmtrdXJxaFZcUUZVSERKUEk/RUE0Rkg5NTw+Nzs8Pjw8Ojo4OTw4OTs4Ojo4Ozw3Oz49Pj02OEA5Ozs9QDw9QDk3PD07Pj0+PUI+Pjc6QUA+PD45NTg9Oz1DQEFDQkGRqqGlqqelqqimn6KnnKasp7Gyq62jqayVkpWalJecoqGbnqCinJ+psqu7sr+rr6ylnqCgnJyYmp+gmqCflXxfXmVgUEZFO0I+Rjw+OTZOfqqyp6OjoqCepaulnpeclJGZnZmVjIqGiIZ4bYigpKKrrLS8tsO+vrO7wcPCxcC/wsbGxcPIwsDFx83QyMvDsre1vrK+xbu+zM3FzMzM08e+v8DCvsfGwrfDysnDwca+urW6u7W7t7C2sqq6sq67uL+7uqu4rauquLu1vK6uuaOmo56mpaKjqaaZm5+Zmp2nqqegoaGkmJSjlpSZkZydn6Sep5+en6KdmJmUmJSIhH16cWtjaW94a2VZW0ZLTEVEVExEQ0U3Oj86NTQ5OTc5Pj87PDs7OD48Njo9OTw9OTw9Ojs9Pj4+NztBOj45PT45PT44Nzs6Ojs/Pz1CPj83OkFAPTw9ODY2PDo8QT9BQUE+kqugp66ooqulpKKipaGlqquwsq2upKmmlJWWmpaUm6SmnaGqp6KrrLy8v8PBsrK4p6Ghq6qhnJ6hoZ2bmn1yaWFXTkU+SVl8b2FBPVyOrqygmZubnp6Zl5eXkoyOlpeTjo2QjIKDgndycW1wj6atrrS5xbvNx8u/wszNzczHydHMzMzHycXFzNDS1c7Tyb3Av8O7xsXIxdHTzdTQ09PMysLFxsbKyM/AydHMx8bIxcK8w8G+v7+2vrOtv8DDw8fFx8Svv7myuLzEwsK6vLy1rqenraigoqmlmpagmpmdqKupo6SknpePm4uQmYmVmJugn6OdnZeempOTi5WPhYB5dHNlYmdyb2ZeWlpDTkxERlBJRENANTU1ODlCPTY4OkE+Ozs+PDk+PTc6PTk6PDg8PDw7Pz8+PD0+Qzw7OkA9Ojs6Ojg4ODk7QT48QD8+OTtBQTs7Pjc4Njo8PkI+Q0FAPpOvn6ivpqiro6KloKampKuoq62qrqKqo5Kcl5ebmJuirJ2frqalsarFxszOzb+wwaikqKytqqCdo56cnpVpZlxUSURAP0qFnqSYg6CyraOenJ+amJeUkpSWkZCPjIeDg4iHg4CBgYB5cXJvbHmktrq5vsvB09LTyM3O0dPR0tHQ0dHNzs7Qxc7U1djR183Gx8nMw8XKz8rT19LX0tXW09TIzMfMzcrTzc7TzcXJysrBx8zHycnGv8Ozs8jFy8vLz8fKv76/vcHGxc3MycnAw8Cur7OonqKqo5qTnpyYnqaprKSlppaXipWFkZSHkpKSmZualpiQm5WQjIaQi4B6cnV2Z2NndmpkVldRRE5GQEpRQj5CPDoyMkE8RTw3OTxCPTs9Pzs7Pj05Oj48Oz44Ojk5Oj86Pj1APkA8Pjs+Ozk9PTw5Njo6Pj08PEA/Pjk6QEE6OT44Ojo6Oz4+PEE/QT6QrKKiqaanqKSfop2qqKOso6OnpqyiqZ+To5iWn56dpK6bn7CrqKyxyc3U18/Gu8esrbO3rK6jnqOinaGbYVNMSkRDP0NTsNK9sq+mnJycoKShnZqUk5WUiX14cGtlYmhyb3F7hYqAdXBucXRwhbPDvsXR0NfW1tLWztTW19TT0dPU1NPP0cPQ09bY1dbSy8nO0cvGzdHK0tXW2dbX09fYztLKz9HMz9DM09DAyMfKxMzMzM7PxcfItr/KwNLNzM/Gysi/xMPIzs3Q0c/NysjNuLe7qJ+lq6efmJ6jnp2qpa2pqKiSlYiQhIyRho2MiJOVmZCWjJiSj4aHjIR8eHN2cGNgZXJiXVJcSUpHQUVJSj47QTg9NTU4Njs4Njo8QD07Pjw7OUA7OTo8Ozs8Nz09Ozo+Oz08Pjw/Ojo8Ozs5Oz89OTU7PD48PD0/Pz46O0BCOzk/OTg7PT0+PzxBQEQ8hqugnKegp6Oim6CbqaSlqaCfoaGmn6ifmKSimqmmoqarmqOwsamotdDU19rSx8bLtLXBxbG1qKGkpaCioVlJQEFEQUZRdrKvp5qUl5+cmqCgnpucmZWJd2ljYV9fYF9eX19dYWx1c3Bwb2xycXWSxMjH1NbX19fT1tDV1NrU1M7P1dTU0dHM0M7U19bT1dDP0tPRydPRyNDY19jR19HX2dTVzM/Pys3Sy87RwMbDyMbPztHR0sjMzcDLzMbTz8zOyMTLx8fJzMrU1NHVz9LM08K5xbGlqLWup5uoq6Wdsqiws62sk4+TjoiLjoOPi4SQjpmNk4+Zj4+ChYx8enFzdG1hY2ltX1ZQX0pKQ0ZDUk1APD40Mzo9NTI4NTU8PEA8Ozw6OTpAOjg7Oj46PTg+Ojo8QD08OTs9Pzk6Pz07PTw9PTo2PD0/QD08PT0+OjxAQjs5PDc0Oj48P0A9RkFEPYKknKClnaWlo5mcnaSeo6OfnZ+doJqnnpyhqZ+vraqqq52lrreoq7fX1NXZ2dHO0L+8zMm2vq6mqqiho6tlQzg9PkRYgqqon5eVl5manJ+dmJyckn1wZWNiX19hX15hYF9gYF9gZW1wcG5rb3J2d5zMwdPV09jY1tnR0tLXz9POy9LN1dTRys/M09bS0dbNz9XV0cXR1MvQ1NXWztLQ2NjX2MvIzsTJz8zKzMDKwMjKzs7Qy9DOzszPz8jM0NDLzsrDysfJzcvM0tPN09LR0NDKvci5sK67ubWrtrCtqLits767sZqPoJSRjo2IjpCFkY2ZjJGRlY6RgIWIenZvcG9rYWVucGFXXFpJRkZETVhFO0A9MzM8PDg3ODU1Oz5APTk8PDg8Pjk8QDtAOj04Pjk4Oj88PTg7PkI6Oj08OkE9PTw6Nj08P0A9PDs9Pjg7QEE9Ojw4ODs+PD4+OkVCRT6Bn5mlp6Cfo6eam5+cl56eoZqdmpyappufpKefuLa1taykrK6+tLDA2NLX2tzWzs3Kw9LPwcGxqaytqaSxeUhGQjtXjqGblZOWm56enpyTlpeUiGteXl5hZGJgYGFhYGBhXl9fXlxibXJvb3N0dnZ5pL/M1dHW1NPY1s7O08vOzsXOytLSz8fOzc7UzM7SzcvX1tDM0dTLzNDS08rO0dXS1dXKwMrCxc3CyMrDzMTGycrLz8vOzdDO08zGyc/NyMfLxcfBxsrMzc/Rx9DPzc7M0MXHwbi5vcPDvcO4srK+sbvDw7WqmKWhmJaSlZWSi5SNmpGUlI+PlYKJhnlxcmttZ2BgcWhZWGhWTUdMSVBRQjtDPjs2ODo4Ojo1Nz09QTs6PD05PD05PT06Pjo8ODs9OTtAPD47Pj5BPDk9Pj1CPTs3NzU/PDw/PDw7PDw4O0FAPDo8OTs7Ozw9QTpFQUU+hJ6bqK2epKSqnJ6fmJKXm5+am56ZmaKVoamppcTCwb+7tbKxx8O4ytXW2drb2MzMz8jW1cTCta+0qJ+tl3hscHF5kJuNjJeVkJORkZWWlZCLfGVhYmJgXV5hY2FgYF9gYWFgX11bXWdycnByc3Ftcnmlx9PPy9DQ09TKxcnJxsa/w8XPzsfFx83K0sjLzs3G0dLQzszUysfLzs/Hx8/Sy9DPxrrEv8bKvcLHyc7Fw8fAx83IxMzLzM/IxMTQyMbCxsjEv8HHzMvLzsLLzMnHy9DExce7x8PIycLPwb28v7DByca5vaqwsqelnaKcmJCbkKOZl5mRlZiJj4J4b3Rka2BeZnFhW1dgR0hIR0lNVEc/Sj02NDM1NT09NDg9PT06Oz08OTo7OT89OTw7PDg6PDo6QD1APD09Pjw6Qz48Pz04ODk6QD4/Pjw7Ozs7ODo+Pzw7Ojc5PD49Oz49RkFDPYOgm6qupa6qq5qdoJeUjpedmpmgmpqcm6WysazJzcrIxL68uczMxtDV1dja29jQyc/P0dPIwre7u62jtn1og4Wkq5SOjZaPhYODg4F9hIR+c19bXl5eYF5gY2RjX11dXl9gYF9bWlxgbHJxb29rbG9vfbnRyMnKz8vNxLrAw7u7urq+ycbCw8DDyMrJyMrIwcXMxsjKzcnEwsvJwcHL0MXLyL+5wrvGx77Axs/LxMDDu8nHybvJx8XKwL7Cy8bFxL7GvbzBw8XMxcW8wMnDxcfSxcHJv8rJxsjG0cPDxsOvxMvHw8q3v7y6tKmspKWYn5iso6Gmm6Ogm5V8d3N0ZmlaYW5tWltYUkRMRkJHRUxERlNANTQzMzU/PDM6PDw7OTw8PDg7PTtBPTo8Ojs3Oz05Oz07PTs6OD4+PEI+Oz88OTk7Pz07QD48Ozk5OTk6Oz06PDo2OTw+PDs+O0NCRD5/pZypsqm0rrCdnp6YnImUm5man6Kfmp2ov7i8ys/RzMfCw8bNzs7M1c/V2djZz8vSzc3OyMG1w76xr7VsXnp8oZGLkpaGeoCFhX91eHVycF9bW11gYGJjZGRlZGBcXF1dX15gW1laXGJvcm9raWtwb3OPx73KxcvAxsKwtrqysrOyscK8vLy6uMHBwcS+vbm9v7nEysXGwr3GwLi7w8m/wcm7t7u6xsO/vMHOw8a+vrXBvcO7vca7w7q0vMbEwsK3v7a2vr+7zMO8tbrIur++y8PBxsLFycfJxtDGwszIssfJw87MwMXDv72yt7Cyp6ioubClrbCqrayUenZ3amRnYGhvY1ZeWUpGSkZIS0FFQkZKQDk6NjU4ODU0Ozo7PDk8PDs5Ozk6QD46Ojw6Nzo7Nzo7Oz88OjxAPUA/PT8/Oz07O0A8Pj4+Ojk5ODk3ODo8PDw7OTo8Pjs7PjpAQEU+fqygrLWqt7SyoZ6fl5qNlJaan52mop2et8XCxMjO0srKycbNzc7RyNDF1dTW183KzsXJxcfBucW9q66lX2R1g5OLiIuEeH+Ghn9+hHt0dGNcXF1eYGBiY2JiZGViXVxbXF5cXl1aW1xeaHNxbWdnbm9yeZ29zMDDusG4rbCxp6qtrKe4tLa0s7O0u7a9sbewta+yu8K8wcS8v7u1srq+wLjIubS7t8HCvbi9x8HEvLWvsra6v7TFt7u1q7i9vsC9sbq2sLe6s8a8t6+7v7W3tcW8vsPFwMTFxsfLxcDGxrvHy8DPycfDxsHDt8O9vba5vse/rLW7tbe2jnl0eGdnZWJrbl1WXmBGS0hISkZCREFFRT88OjU2NjYzMzs6Oz06Ozs6Oz44PEE9PDo7ODc5OTk7PDo+Ozk+Pz1APz5CQD1AOjo+Oz89PTk6Ojo4NTY7PT48PDo7OT49OT86PEBAPIi3pauzsby8sa2foJmUlJiXnqujr6qnpMbLzcjFyM3M0MzNyMnIysjKxM/N0s/NxcfBxsC/urfJtqqwmFtob4qPhYiJenh+hoZ2d4F8c2hdXV1dX2BfYGRhXmNlY19fXFteXF1eWltbXV9scG5pZmptbnJ8pMfAuLi1sKusp56iqaeeqqyzraqsqrSttrGzqa6nrLO7urbDubq6sau1ubu0wrqwwLG+vLu2vMi5w7atqqiwssC2uL2wsaexs7S7vKuutaautq67srGqubCuu667uLvAwL66w7/Gw8XAvMbBx8u4xcfFv8fDw7rExsK7xsnMy7O5wr27s4lzd3ZraWBibGhYV1dbQUxLTUpFQUM/RkE6OTo5OTY4NTQ6Ojk7PD07Ojs+ODtAPD05Ojc5Pjk7PDo4Ozs6Pj45QT0/QD87Pjo7PDo9PDw4OTg5NzY4PDw9Ozw6Ojs+PTs/Ozs+QDyKwKuouLe5w62zqZ2ZlJaZoZymsLWxt6bFztLLw8XBxNDHzcHDxr/ExMPDysLJyr/AvMK6s7W1w66qsJFban+Sh46Pe3h9iYV6e4SBd25eXVxcXV9gX19kY2JjZGJgX11aW1paXVpaWVpcZW5vaGZoaWtucoGturC1rqWlp6eaoKSgmpylq62kqKKrqqyrsKOmn6qttLaxvbmvt7Corri0s7y4tL2vuLm1srzBssCupaijq7Gys6i9qquoq6yttbOlqK6hpK+psqaoqK6lqLessbK3urq7sry+vr7Ev7XBwcfIt77AxLfEw7+7v8TCvsTIzMq/v8PAwKmHc3RzamlcYW9jV1ZYUEhZUlNLRkZFPj9AOjc4OTc3NjQzNzo5OTo8Ozs8PDc7PTs7Ozw4OT44PTs8Njo9Oz89N0E+P0A/Ojw8Oj05Ojs6Nzc3ODg3OTw7PDs5Ozo8OTc5Pjw+P0E7jMKvrry3ucSwtrCbmZWcmKqpsLGztb2vxdDPzMPHubnLwcu+u8m2vcO+usq3wcPBtLa8trGvtbutqKuSZG2Ig4eLgHp9f354dH58c3dlX11cXF5fYF5fY2NhYmBgX15dXFpYWVtbWVhaXF9ma2ZkZ2Voam9yhaqlrKWenKGklJ2kmpeRoaOpo6Ofpaanpq2gnZykpqyysLa3p7GtqKq0q7S6sba2rra5srC6urG3paCkn6axqKuouaqkp6eop7KtoKemn5ukpqyfn6ejoKGxra2ssrSztLC1vLa7wcCyu77DwbG5ucKzwb7Atbi8vb68wsfFw8S/wMSgg3hwbGJmYGtvYFVZX0hOZ09UR0ZLRjw9QD06Ozs4MjU1MzY5OTk7OTo6PDo3PD88PDs8ODg8OTw6Ozc4Ojo8OTg+Oj89OTg8Ojs+OTc3NzY3ODg2NjY7Ojo7OTo7PDg1OTw6Pj5AO43ItLa9uLrAur22oJ6UnaGmurars7O7s8TPycvDxri3x8DMv7jJt7vFuLPEuLO/wKy1vLKspa+zraGjkWlyhoWGgHx4dXNvbWppaXBpX2BdXFxcXl9fYWNiYGBgYF1cW1xcWFlYWFhWWFteX2RjYmVnZ2drbW+InamflpWaoZabopiVjJ6hoqecoJ+kpaKnnpujm6CrsK2xtaSpqqqsrKS0uK23sKyztq+zta+wqp+en6OisqWmqbitoqamoKitq5mgn56ZnZ+lmpqjnJyer6mrqKqrra2wsrivuLm6sLa8u7qrs7K5s720trGxtrW/tr7AvsPCu7q9l4R6c2tfZV5kZFhUV11JV1xLT0dKSkdBPD8/QDs/PDA0NTM1Ojs5Ozg5OTw8Nz4/Oz07Ozg4PDg5ODw3ODo7Ozo7Pzo9Ozc4PDo9PDc0Nzc2NzU3NDY2Ozc5Ojs6ODo5ODo7OTo8PzuJyba4vru3wcHBtKSkmZqkpsCyr7astLfFz8jIwMa7u8PDz765x7i3vreywrSxu7usubqxop6pq6eYno9tfoWGf3hybW9ta2JeYWZmXV1eXV1dXF1fYWFiY2NiYV9cW1taWllYWFdXV1hYWFpeYmRkZWZmaGlrco2nnJOUlJqXmqGWlpCboqGonpydpaeipZygoZuZr66ur7KhpaOuq6eitbCysqypr7OnurOmtqCin5yjoa2joqq2q6Ojpp6lpqOWmZ2XmZudoJqXnZydnK2hq6ejo6atq7KzqrWwsquzubSvqq+ysrO3s66pra6yuLG6trq9wLizsZSFeXVmX2ZeW1lWU1pVS1tRTElFSEtJQj0/QUFAQToyNDUyNDk5ODk7OTo9PDY9Pzs8Pjs3Ozs3Nzc+Njo+Ozo4Oj07PD06Ozw6PTs4Nzk3NDY1NTQ2Nzg1Ojo4Ojk5PDg3Ojg5PkA6gci9uL2/tr68v7OdpaOYpbHCtba9rbS4wczIxr/FtsHAx863wMS9s7m5s7+2sbm7rbK0r5+apKqglJqPeH+DhH94b3F0cWhlY2hkY1xcW1tdXVxbXmBhXl9fYF5cW1pcWllYVldXVlhXWFdWV2FkZWNkZWRkaGp2oJuTk4+TlpaelpiTl6CdoZyWoKGppJ+fqZ2bm6unr7CrnKOkuKqhoK6otqqnp62xpLiwpLego5yZmaqnoZqsua+ioaScoqCgk5ShlJaWm5iYlpeclZ+pnqmkop2jqqqxrai0rKqnrbOwpaqus7GwsK+vp6insq6xtK+8tLq4rqOUgXp2ZV9hVllYU1JTS01eTFBMR0hMS0U9QD49Qjw7NzY1MzQ5ODg5OTo5Pjo4Pj47PTw8Nz49Njc2PTc7PTs5Nzk7Ozw+OTk6Ozo4Njc2NTQ1MzEwNDU2Nzk6ODo5Ojo3Ojs5OT1AOnbAvLS5wrG+t72unaenoqq7wL3Aua60uMHMx8XCw73FuMjMssHCwa68u7W7vLW5ubCvsKqcmaGplJGKi4CAfHdxaWxydHBoaGVkZmFcXFpZWlxcXF1eXVxbXF5cW1xZW1taWFZXV1ZXWFdXV1ZbYmNiYmNiYmNmaYGVkpSLkZOTmpiclZacn5yflqCfp6akpqefnaCmoKqvpp+io7eooaGiqLOipailsKWxrqy1nqGdlpWpoaKUrbGxn6Ojnp6Ym5OLoZSRk5iYk5eYmJeep5unoqKapKWlq6SlsKelo6urraaorq+vq6iqqrOlpquvtLGuvLaxr6+gknp3cmVhXFtdWE5MUUhSYU1WUE9KTU9FQkQ/OT02OTo3NjQ1OTk7OTg4Nzs4OT0+Oz47PDY5Ojc7Njs3Ozs6ODU6Ozo7OzY8Ozg4NDc3NjMzMjEuLzI1NTY7Ojg7Nzg3Njw7Ojs7QTh4u7uxtb2wu7G3rJ6lpqy3u7zBxbqxubXEycnAw8bFx7bFxLPBv8Wrt7e9tr26u7Wyq62omZifo4uJdImIfnZuY2FmaWhmZ2lmaWxgXVxbWlpaWlxdXFtcXl9cWlpbWVlaW1dVWFdUVFZVUlRSVWBgX2BhX2FhY2RpgJKSiI+Nk5GSnJSVlqSZoJedoKWiraalpaOko52qq6Wan6WxqqChnqWrnqiin66sqamuraKiopWXopuckKupsJyfop+fl5mTip6RjZKTlpCYmJOcoaOdpKGilaCipaWbo6uloqSrpKuupa6yqaalpqa0pqmorbO1tLm6sKqsnoxycG9gW1dWVVJGUE5IWlxQUklUS1NMRUdKRDg7Oz08ODY2Nzo5Ozo5NzY5Nzc6Ozo9PDw2Ozw4PjU5ODo4ODY1OTo7PDk3Pzw5Njc4NDUyMTIxLi4xNDI2Ojg2OTg1OTg5ODk7OUA5e7W0rLS7srCrsq2dqKevubmzwMi6tcCvxcjMusHKzMi1ybyxvcPIrLG4wbW8wLy0taqsppWZm5uIgXKIg3t0aWlqbGdqbG1ramxlXVxcW1tcWlhaXVtbXmBgXFhYWllYV1hXVFZWVVRVVVJSTlFZXVxdXV5fX19iZG2Nj4OQhY6QjZmTlJKcmqKcm6GpqauorKeppqSZpa+llZmlr6mgnJmboZ6vmZyrs6Clpp+jpKGUk5uWlpKpqq2anaChoZuUkIyZjoyRjJKNlpWQnaKgpJ2bo5WboKOhmKKoo6Ooq6Crr6Stt6ajpKKsraqoq6+zt7K9tbOrr5iFdHNoW1hZU1VSRVhMUVtYTVROUExRUklOSUI9Pz9BPz03NTc5OTw8OTc3Ojc5Ojs8PT47Nzs7Oj02Nzo7ODk3Njk4OTo2Oj05OTU3NzU3MTE0MS0rLzQzNDk4ODo6ODo6NzQ4PTg/OX6zraezt6+oqK+um6morLe2q7zKu7a/rMvGxbjBzs/Is8S6t7vCyLCtuL+3vL27s7WmqaCWl5iWh3p0gHZ3bm1obW1tcGdnaWZkXVpbW1tbXFtZWltcXF5fX1xYWFlYV1hXVlVUU1VWVVVTU05QUVlaWlpdXVxeX2FkfYuAin2Kj4mSjZaRl5mioJugq6qmr6yosaWpmp+toZWWpainnZiQj5qerpeZqKqZn52UpaGfkpGSkZOVqKulmpmZnp6WjYyLk4aJjYOPi5KVkaCeoaSYlZ+VmqGinpSbpaaoqKigsbCmsb2on6OstKqup7C1sLm1wLGusauRfnJzYlZUVk5SSkdWUFJSTExXTUpNT1JHTUtBQ0ZERD5BNzU4ODk7OTo3Ojo3PD06O0A+Ojk7OTo/NzU5Ojk4NzY5NTg3Nzk7ODU1NzY2NjEzMjAtKi4xMDI4Nzc7OTk7ODk0ODs4QDh/s6ymsbeqpaKxq52qp6mysKS2xrS5urPKxbm6wcvQyrG2t7y9wcOxr7G3rbS0u7O0oqOdnZeXlIOAdmtnbG5xbnJrcGtkZWdlXlpZWllaWlpaWlpaXFxdXFpYWFhZWVdYV1VVVFJTVVNWVVJOTk5SV1hZWVlZXFxdYWp/eX50h4yGkImXiZSUmJuYnqmboKumpqyeqJqgppyTj5+jmpeXhYSSm6SQlaOdlpaWiKKbm5OLjoqQmqWnnJWVl5uRkoeUjouBjI2AkIuSkpKgmqGilpSYmJWippmNmaSmqaahoLSyp7K4oZyitqypraSysqa1vLWrrLGjiXlzbl1OUVFMT0NNTk5QS0ZOTkpKTk5RSE1KQUhMSEhDPjg1ODg4OTo7Njk6Njg7OTk+PDg6Pjk7Pzg3ODk6ODg2ODU3Njg4OTc0NTc3ODIwMzAxKyktLzEyODc2Ojk5OTk4NDk4OEE3d7ampLawpaekqqWgqaaks6qissO1tbKzxsa2usPKzMazrLm9tLjAr62psJ6mrrqvrZ+Zmp2VlId7g25fX2ZycHZxaW5pZWdoal9YWFhYWFlZWVpaWVtbXFxZWFhXWVlYVVZSU1JQUVRRU1VRTU1LTFNXV1ZYWFhYW11hbnF1b4OHgYd/kIOOipSRk52hj5qco6KkmaWXopyVjYeZmoxzjYN+jpeWhpGakJSOjnuZj52Mgol/ipigo56Qk5iWhY6ClH5+dIqNepCHk5CQnZuampGWkJ2Oo6OOiZqgoaSkm6K0r6ywrJ+YpbimprGhsK6csLyqqa+qmYN3c2NWTVJPUE1DU05MUE1CUFFISU5STUhKSkRLTUZLSz03NDk4ODg7OzY5Ozc6PDk6Ojs3OT85PkA3OTo8ODk3NjQ0NDU4NzQzMTI1ODUvMDEwMikoLC0wMjc2NDc4OTo6NjU6ODdBN3i3oaO0qaalqKOmpaamprOnpbTBuLC0sMnEt7nBzsa9s6y6waytw62noqaSnaa2raOgj5WWkpB9d35mV1ZfZ2ZpZ2huY2lpZ2JcWFdYWFhZWVlZWVlaW1tbWVlZVldXV1NUUE5QTk9PUFNUUk1NSkhOU1NTVFVVVllbXWlqcWt+hHtzTlhyj4KXho2cl4uUkZ+YnZWUlpWPlomAlIlfO1ZvfIyUioCMkoyQhoZzioWXgXmBe4aTnZSDlY6RkIOGfZN4cXCGjH2JgZGNkJeamJOLkIqdiJ+Yh4iWnpqhoJenrqmtqKielq2zoqaumayrmKi0o6mto5N/c25fW05TUldMRFRKUE1MRk5PSUVMUU1LT0pJTVBGSUk9NzU5OTk5OTo3Ojs6Pj44Oj09Nzo/OD4/NTg5Ozc5Njc1MzMzNzYwLi0vMzQ0MTEwLy8oKSsrLTM4NTQ3Nzk8Ojc5Ozg2QTl5t6CjrqGmpqqgpqmno6mvqKe0wrmwtbDHwrezvc+/ua+utcKnqsWqop2Yg5ScsaKamIaUj4uHfXN1XVBMUVVZWlddXmJnY19ZV1dXWFhYWVpZWFlYWVpaWllYWFZXV1VTUk5MS0hHYlxNT1JNS0hGSE5RUU1PUlRWWFpgbG5neoFzUEI/f5WSkX2IlYyEio2bjpaViZKIhpWGeYl/YEpRbniLkoR9hI2KhX9/bn9/lHh1dniEjZpwUY2IioZ8fniUdmh3hoh+iomWi46RkpaMhIqIlYSbjYKEkpqWnp2UpKOoqaWknpuwqqGkpJGmqZaiqpyipqiJdm1mXltIUVFTTUlVTVNJTEtPSUhGSk5MTVRLUVBPRklDPTc2OTo4Ojs7ODo7OD4/OTk+PTg7PDY7OzQ3ODs2Nzc1MzQ0Njk2LzMvLjEyNTIyMS8sJykrKiw0ODMzOTg5Ojk5Ojo6Oj85d7aco6edn6Gvoaeopaeor6yqtby2uLazwbu2qLnIuLaoqLW2qrK9pp6VjX+Jk6iWlYp+joOCfXdwb1hNS01NTkxNUVdbXFpYWlVVVlZWV1lZWFhZWFhZWVlaWFhWVldVU1BNSkVAQJtrc3NJTUtERERJTk9oWU5RU1RVWm6DcnV9aWhcVJCJlIh0foaBfIWMk4KSmouPe4aPgHaAeHNvdnB0jo6Ben6Kq4R5e2h2e45wcm14gYuNknh6gHuAdnNyknhndYSEhIV8lYqIio2KgH+Ei42AlIR8gI+YlJyWkZ+dqZ6foJ2gqaWenZiNp6SSoKCWnp+kgXNoYV1cSldQUkdLWFJPSkxNUkpKSkxQSExRTFJUTUVIQT03Nzs5OT49Ojs8OThAPzo6Pj03PT03OTkzNzc4NTY3NTI1MTQ3Mi8yLiwvLzIwMC8tKygoKS4xMjcyMTk4Nzo4Nzc1Ojw7N3aumaOhmJ2ftKmvqqWtq7Cxqr20sry4trq0sZ+3urKqnZ2sqaiysKGakY2UgY6cjpF+doZ4fHZvb2lYS0hJSEdFSEhQVFRUV1dTVFVVVVZXV1dYWFhYWFhYWVlXV1VWVVNQS0Y+OTNOPH6eTUhKREA9QURqlH5MT1FRU1ZedIJ7eGZ2jJaYjY58Z3mBdniAiZB9hJiSgXGHj3x3e29rfq19dJCLf3uGkoF8f3VmdnyGbG9nc3yJjIeAbHlxfXFtdo9xaHGBfo5wQ4uFgoOFfnd3eoyGfYx7dX2Oko+Yi5Kam6OWmZyanZ6hnJaNi6Wajp2XjpaYkHhvbWZjWlhYVVFKU1VUT1BOUFZLTktPT0pST0hOUExGRDw8Nzk7Ojo/PTk8Ojk5Pz87ODs9Nzw5OTk5MjY2ODU2NjMzNjExMjI0LiwsLS4uLTAtKyonJyouMTM2Mi84NzY5NjY1Mjc5OTV5ppegnpahprCsrquoqbGvsau8uKy7vrizrKebsKesm4+WnKWppKCYmY+FknmIjouKdXF7bXVwam1qWEtGR0VBQENESExMTVFSUFFTVFRUVVZWV1dYV1hZWVlZWVlWVlRTUUtENzhmNzA/qGlOSEM9OzpEioV6WkpOT1FUWF1lcHJsiKeqwH50eWJ7eG97eYmQen2Lhm9tjJJ5dHlqaoCCcZaRi4F+loBJkphuaHh+gm1pZGx5hZCShmtzbHxucnyGaW5wf3ONiYSGe35/e3ZvdHSGgnmBeXB8joyKk4OWl5iakJKWl5mXnZaMg4mekouSjYaQloBvam9ub1hWWFRSUVlPUlRUUlhVTU5ITUpNT0tDSU5HRkA6OTk7OTk6Pjw5PDs6Oj0+Ojg6PDk/ODY4NzI3NTY1NTQxNDMyLzAyNCorKiotListKigqKCcsLTEyNTAsNTU2NzQ4NUhBODk1d5mRm5man6WssKOtqqi1r66stL+rvMO/paKalaSYno2Ei5ShoZmZkZOLc456gIaMhnRvdGtwbGRsallOREZDQDw+PkFGRkdLS0tNUFJSUlRUVFRWVldXWFlaWVlaV1ZUU1BMRTFAmjMganNDmW87PDk1PICChl9JTU9PUldaUVlcX6eHYZppc3llfm9tf3qLiXaCiIZ0bJqSdHN8amqdj015hZOJhI5nMXaGc2x+fYN0ZmV1f4SEhYBmaWx1a3F/fGhxcXxuk42PfHR+fXFwbnVtgn93eXVqeYmCiImDlpKSkIuNkZSUjpeNgHmIl4iGioaAkIh3a2tvaGVYUlpXWVlbTVBVVllYTklIRUpKSEdCQEdFQ0c9OTk4Ozk6OTw6OTs6OjpAPDk6PDk4Pjc4NzcxNTIzNDUzMzY0NTAzMS4qKispLCwrKykoKycpLCwyMjYsLDQ3NzU0NzhpTzg7NW6SiJqRmZajqK2esZ6nuq+rsrDCsbvDx5qWj5SZi46FeoSQmJSNkIyPhnGHgnSHjIZ5cHJwb29kcGZfVEZJQz88Ozk6P0BBRENFR0lMT1FRUVFSU1RVVlZYWlpZWFZVVFNQS0U4MC9cYLNHOVhQOzk0NDGWuotITE1PUFFWTEFJUUlir7KgcXt4bH1scYOChYF6hIaGeXKhlXR4gHN1lIc1cZ2onY6hoYSihXZwh3yHfHSMro2JgGhnYmpucm1wgnVpb1h1cI6bkndsf3p9bXJucIB7c3ZuYnaDf4aAhZCQioqJkYuRi4uOg3V4io6AfoOAfY57c3FxbWBbXV5bWVhgX1JOW1pYV0xISkZKRz9DQUJIP0NEPTs5Nz07Ojs7OTo5OTs6Pzw4OD06ODs2NjY1MTEyMTI1MzQ3NDUzMS4vLCwrKSopKSoqKikoKikrLzNETTIxNjY2NDM8dlI3PTdikoGSiJaRnaSnn6+VpbSprrGuwbK7wcWWkIyUj4CIfG6BkJKJg4qHj4Z1goRslYiIe3R4eGx3bndjaV5KUEc+PzY0NDk7Ozs9PkBCRUhMTExMTlBRUlRVVldYWlhWVVRTUExFPDUqnUtbQC1nSTk0Lz+Sg6muX0dMTU5QTDdDTVJTREqGdoB8fHZ+bHaIiHx+hYN/jH51opl5foaBhJmEmpxhhqqfnYuDkI16d4h+iYmOc4uXj4R6XWRxdHp8d4ptaGpieW+FkIJ6boF3dIR6cHR5eGtuaV12hnyHfIeHjn+KkpeDjYWMhn1xhH+EfXV3e3yJd3BzdGZnYFtbXlNbZ15XUFRYW1VHSkpES0c/RkBEQz5BQT07OTc8Ozs9PDo6OTk7Oz0+Nzk+OTk4NTY1MzI0NDAwNDY0NTU1NC0sKSsoJycnJigoKSkoKCsrKy8wMFVxPTIzMzMxRX5XND05XIx4ioCUjJGcnZ+mkaCqoLGor8CxusW6lo6RlId7hnZrf4yRgn2KhI+MeIOAc6CEinx8gX9wgH56Z3ZrUldMQEUyMTEzNjY2ODg6PD5BRUdGR0pLTU9RUVNUVVdWVlZUU1BNRkA6Mj0gI5ZjjFs1MzExaT9Hb0lGSUxNT1JMS1RdWVJKaISIe4l5fHF8j4x6fYmHfpeHdqGZiIePkpSljayqSIaur6+LgYCTi4KLgoSSqYeAmJiKm3RtfIGGh32OaGdoeX9uhYeChXGEhkdsgHdyeXZobWtfdn2CiH+HhIt5lJ2ciYuIkX96dYt2fHhtb3d+gHR0cmxbXl5bY2NYZ2VbVE9QVllQRExLRk5JQ0ZDQ0BAQ0E9OTc4Ojo6Ozs6ODg4Ojo/PjY7Pjc1ODU3NzMzNDQyMzY2NTY3Njg7REZMTU1MQzcrIiUnKykrKywvMDArbnUyMjQyMEyBXDU9PF6EdHx9iYWHkY6Wl5KXoJ6soaa4r7O9s5eNkouYi310cH6Jkn59jIKSlH2Gfoakh4h/goiFeIeIfnOEeF9jV0tCNjAuLzIzMTI0NjY4Oj0+P0JFR0hKTU5RU1RVVFRWVVNRT0dDPzgwLCOHWz4/ODQuXZZwc6NVRklLTU5QV2BYcFlcXmmNk4eVgISChZGTfoWIkYGalYKhoZiVm5umrZOau7Gnu8fDqIuMoaWPlIqBkXxxg56fkZx/doaFi5CHkGpob4OBdI2HhIpxhYJ3h397doV9bnZ1Zn+UjoaJiIeIh6CropWJjpd/eoKIenlvZ2t4fnt+dGxlXVpbXWpdYWZgWk9LTldSUUlQSkROR0NKREJBRERBPDo4Nz08Ojw6ODg3Nzg6PT04PD02ODY1NjYyMzQ0NDU3Njg2NzxCQj88ODo+Q1FeZVxHMicmLCwtLS4xKD+LWy4zMTBPg180PztudXBmd4N7gIx/gZCOipqbpJ2hrKarr7CXkZGEoZSEeHd/jJR8fpKFkpV/ioCSm46DgIGMioKJjYN/ioBtcGpdQkA0LS0vLy4uMDIyMzQ3Nzg7PT9CREhJTlFSU1JTU1RSUE9IREI8ODcvOUQ+PDw2My5sk5dNUEhJS0tLTlZfY39nZ211nZuPmpKTi42OmoiSj52LoKCSo6qlo6yTqbaiqMHCrseveLqUmnyNoZ6ZhJOFgo6in5OYkoSKhY+ZkZZscHWJjIKWjI2Od4+EcW2FgYqWkYOFiHGIoJWGkomOj5aktambjZSig4eTg31/a2pqfIGBgnRiXmRfW2drXWxrXldLR05SUU1MTEZJUENETUZBQ0VGQj05OTc9PDo7Ojk4Nzc2Nzs6Nj06Nzg1NDU2MzQ0NTY2NjY4NTU2MzEwLiosLCkoKS46UGFcQCwoLSsrMCwncog3MjQwT4RiM0A8dW5nWW+Cb3WGcXaShn6XlpqUnp6cp6CplpOYnmdlpJp+hJKReX+SiJGSfYqEmJKQgoCAi4yJhZCHhYmFeHh+Z01SPi8uLiwvLi0vMDAwMjEyNDY3Oz9DRU5QUlRQUFFTUU5QSUVEPjs8OkNGPz48NzUyPD9SNUhISExMTU5SXm+KfHOBfaCdm6elopmhl6KUnJ6nnqirn6isqaq2l6u/q7bIyLfJ0c++m6Bwaaupn4STkoWcoZqbmaeRkYiVopubeHp+lJiSoZOXl4GUnnt3lZKrsoiNl598lJ2bjpKVmKOipravnZGZqIeWj42BiGxzc32AfXJpYF1hX2FnZGBnZltSRUpLUE9JSUxGRk1DSExGR0RCR0VBOjg1PDw4OTk5NzU2NTg+NzU9ODQ3NDU3NTQ1MzY5NTg6NjE2ODYzLzAuLSosLy4tJyMqO1hiQigqLDEtKEuXXjA2M1GFZjJBQGlhXlBwdGBtfWF3jn17lI6Oip+Sl56Wm6qYnqpCRH2HiYeYjXiCjYqOjXyKho+QjoGCgImLioSShYOGiYGAhnZeYlA0NjAtMS8sLjAwLy8uLjAwMTU+QUJNUVJTUVJTVFJOU0xFRUA8Pj1HR0BBQDg2NjI8OTtGSEdJSk5PUVlthZB3lYqjp6q0vbikraysp6i0q7C2srKtu7GzvZyzw6u6ycu3w7+4paKws6ytqqOLlpiFpqago5eBppmNoquopIiFlKShoKuhpKmPm7CLlaOmt7qboKOwkqKdop6Qo6Grr6yytKKUpKqImYmSiZV6en2Ff2hhaFxlYl1kZF5mZ19aT0NJSFNORkhMRkpHRkZIQUtGQ0ZGQTs4Nz08ODg6OTc0NjU4PDU0PDc2OjQ0NjQ0NzM5PDM4PDIwMjU1MS8xLi0qKi8sLSooKiYlNVhYLywwLCwwhIE4NzFQhWg1QUNbWFRMaGNXaW9YeoV2gZOFh4Kbg5KQjJLayJ2Wc1aXiI+InI98hoyOiop6h4KHkI6DhYCLhYaHkoaChImGiIeHcG5hQEU2NDwyLzExMC0sKy0xLi00P0NBTVVRUlNVVVZVTltQR0dEPD4+RkhDRUA4Ozw1Qzs9RktJR0hST1BXgZKghK6js6qywMfDqrPFtqyzv7O4vra/tMG2u7qjuMWotsnHtb65taijtK2wsZuZkpqfiKevq6WUdp+kl6GssrOYlqquqK62u7K6rK+1orGrsbW7t7SutKCnqKOnmqmvrbK5t7imm7aojKSOkZKfhniCg3ZaYmVXZmFhY2BgZmBbVElERExVUUhJSkRJR0VBQEBLREJNRzw4Njc7PDk3Ojk4NjU1NTcxMTw4ODk1NDY2NDk3Pj0zODkxLjAxMjExMzAsKiwuLCsrKyooJyopRVowMCovK2iSTzYwUodqNkFGV1FKTFtaUWJjV3l1cYGUfYSGk3WFf4CMe7+7o7yCtJSTjZuPhIiPkomIeYaAjJKMh4WBjn+BiY6GgIaIhYqHkXp4bl1WQEVOPDY6NDZBQjc2NC8vNkNIQ1FbT1FVV1VcVk9eVUlLSkFAP0dLRkZDOz5AN0Q3P0JKSkVGV1RQXo+kraOxtMO2uMHMyba7xL2zs8C2uMG1vq+3dLGzpbrEpLDGubGzsbSopLW2qrGgopabopKlsK6mraynpJigrLS7oqiyurW8v8y/xcW9vbPCt7q4vre6t7msrLCmsaqtvbC8u8HBq5m6qJOtj5eXqol9gn1rV2RiWWtlamVXXGNZVlNJR0ZMUUdDSElBSEQ+P0JCS0BATUQ5OTY2OTo/Njo5OTY2MjQ2LzE5NTk5MzY0NjI3Oz0/NjoxLi81ODo5NjUwKigsLS0tLCwqKCgrKyhFUy8qMDBKj2s1MlCHbTY/RlJMQUxSV1NZVVp2anB+joSAjYNuenN4h2K5oZmjiZSUlpKUk42QlpKHhnuGgY2VioCEgYp6fIqHhn2Kg4GKg5V9d3p1ZU9cZEdFTDtRY2FbXlNGPztIUEVaY1FSWVhaZ1lUYGBNU1BFQT9JSkhFRUFAQzxFNkI+SEdKTFNaVF2Trri1urjIv7q9ycy7vMC7t7W7ura9tLqxxmB1sqSxmp6rvaqlqKurpKKytaCrp5+Vlp+Yn66lp6aln6OUo6extKeys722wb7TycnTx8LFzMLKw8C+vb+7vLe0r7i3tsO5xb3CyK+euamhq46kqLaIgYBzYGNiXlhiYGlnUlhgVlFVSUVFTktAPkdEPUtBPUJAPUY+O0hANzk2Mzc5PjQ4OTo1NzA0NS8yNjM4OTM3NDQyNj84QD5HS1JUU1FQT1FRUEpBOS8sLCwqKygoLC0sL1A+KC40OIB9PDJLiHE5PkNLRUBJTVBSS1FdZ2xrcI+NhY9zbHJyc4fVwLWZoI2VmJmRjpeRlpaOhod9hoOMlot+g3+CeHuLg4d8i3mBioKXfnR9emtlcHVZXVxQZWRiYGVkXVtYV1xNZG1VUm1tX25fWGdkVVlVSkRCS0tIRkhISEdBSTlEP0hLVFRWXFpbk7jAuL23xsC7ucrKura5tbi5sre1tK62tphkdaicrXBeoqycmKCim6Seq6WUn5+QlI6WmJenn6WfnpqZg6SdrKWqsK24sL251NHO1tDJzNLMz87Kxr+/wsq9wbzBwMTExcq+yM6zpLuwtK+aq7i7mYB7bF5hXVleYVpjY1FbYFNQS0NBRUZFPEBFPkFIQUBEPTpFPj1KPzQ3NTM1Oz00Njg5NzcwMjIvMjQxNjk3NzU1NTVEM0VMTT41MS8wMDY6NDc3QElPSTstJioqKC0uLyxATSsvNTRtiUkwSIl0Pz5CREBDREZLT0RRXFloX2+XkpCUbmxvdXWHs6yhoJ+LmZyZjI2VkZuShYqKfoiHi5CLiHyBhHN7ioOFe4l0gYmHlX9ze3lrbXV7aHJlaWxpZmppaGBmaWhsWm1zlq2kvIiHZ1tvaF1aWlRIS05PSktQS1NRSExBSkdKT19eYmZpYZe3x7C4sru9tbHExrWwuLCvu6uysaert6yMtaedmqeaTpqdjI6flpGmmKWVipOTiZCJkJGRnZuhl5qVloeemqebrK+osKe0tNTU1NbSy8/U1c3Tz83FwsnQv8rJysnRx8zNwtDSuK/DvMS5pba6w6KDb2RdXV5ZYFdZZlpRXVdPUEJCSEVCSDtBQz5BRz8/QTg7RD5ASD00NjY1NTs6Njg3NjU0LzEwMTQ2Mjc4ODc1MzY3QzVCOD8tMC0xMzQ5PTk3LC4sMTtGSz0pLCguMDAwN0s/LTQ2VIhXMESHd0M7Qj5FQkFDSk0/VVlTZVZzkJCYgmhxb3l5g6CqnqWWjJqbl4uNlZGajn2Ji4WNioqKkId8hIJwf4iBhnuHcoORi499cXh1a3F4fnF7bnhzbGiBcG1jam1weGl3fH7Lv8Hfp25jeG5jW2FgSlBSVU5ZXlBdXE5QTlRRVVRcbm12gnGWrbistKavtqqsvMCwq7SmpLimq66gq7SijrGtmpeYjJGTkYSOm4GNppGciYOLhIqJhIuDlJWXl5OckZyYmZmfnquspKeirK3P0tXRzcvS09TQ1NHOyMPU0cfN0tPT18zR0cXS1sXAzsfHwqi+t8+eem9mXmJdV2BTXVpQUVRQT0g+QEZBQkU8QEI+RUQ+Pz86PT08PEpBNDU0NjU8ODg4NjY0NDEyLzAzNTI2NzY4NTMzOz08RT1AMTErLzI0OT41OTAxMDIyLTJETjMpLzMuMzI9TjIzOEN9XzJBhnREOj09ST5AQ0ZIPFZSTU5bdYaFindsd3B9fn+hnp6hi4yYk5OMi5OPloR5hZCQjYuKh5GHf4J7cn6AgYd5hHWFk5CIf292cmtzfHx3e3OBd3FqgHNyaXBxenlyer7Lmn6MsoR2coR2aGFrXUNaWltWZWNYZGpTWF1dYGReY3d6fouBmKmjpKGfoKilqrC4qqWzo6GtoaOtoaexn4mmmpOSkYmRj4iBlIlqlKKMmYSAhX6Rg4OTlq2LlY2Vmo6GkpGel6ewoaChpaSoyM7PyMLL0dTR1NPO083G1tLM1NjW1tjU19XJ1NrNydfX0cqsw8PMjHNvZGFgWFRZVFxQS0dKSkpAOzo7REFEPEJDPkdCPkJCOzw5PDpHQjQ2NTQ0PDU2ODc1NDMyNTAvMjU0Njc0NTU0NDw+PUU/QTYyLy0xNjs9MDgxLzI1NC8tLTtSMDE3LzUzMkZEMjg+bmI1PYF0TTk5QEk8QUQ/QTtQTEZLWXCAdX1oc3hygomAnZWdlIWLlYmPioiOh49/eIOUmIqNiIiLiX6CeHN7fYOHd396h5GWgINud3BtdX92eH10hXx5bId2dG59doR1eHudtYw7QYrFpX6MfGllV0lDZmNlY2dqZG54W15maGtuaW6Ag4iRi5ydoJ2Ql5ieo6OmsaOjs5+hpZ2gqaCjsZyGnpKSkpCKjouGg4+EfpybjI2ChIV6lH6CqZWjjJGKl5KLfZeKmpKrs5ianKicp73Dxrm2xs3S0NLQzNLLydTO0NXa19fY1NnYzdjbzsnZ2tHWvsvMtHl3b2VeW1NWUltWRkdKSUVFPTo3OkBAQjpHRD9EQ0FEQjs/Ozs3REM3NTY1NTswNjg5NDQzMzQxMDE0NTU4NzQ0NDQ5QD5EQkM8MzMuNkZUV09RSkFKRj8xKiguQlMzOTI1NC83Szc1PGBiQTxzdlY4N0FIOj9DPjw5UUVDSlRrbm5wYnBxdIaNfJeRnYt+h5KDiYaFiYKHfHiFlpaIjoOHhYZ6hHlxenuEhnV6hY6NnXmLcHxvb3p/cXuBcYOHgG6OenV3fXyCdX57hoevc1ipwraNkYJwbmI9XmhycHFwbnh2gWVob3J1eHF6i4aOk5GblZ+Vh4uTm6CbnqqfoKycoZqYn6aen6uZi5qMkJGNhH2Ih4OFi46gmZOIg4d+bZl5hJiGiJOMjZSMhnubiJSPrqqUlZefmaeutb2prb3Gy8nJzMvQycPSytTX2dfY19Xb19PZ29XQ29rR1sjUy5V6fGppXFtQU1ReSENGSUg+QT49Nzo9Pzs9Rz0/QUFBREE+Pjo4NkRCNzU1NDc5LjU2NjQzNTUzMjMyMzY0NzU1MzQ1N0VCRENFQjU2PEZOU01bbmZjbnNrYVY+LDRMRzg2NTQzNEJGND1XX2hMdXheODs/Rjw8Qjw6OkQ/Q0dSa19tZGJma3aAiHGRkJqAeoCNfoKCgYR/g3x8hJiOh4t+hoaAd4J5bnt7h4J0epKejaB2jnWCdHWBfXSAhG+Bj4FvkoV0fICEenaGe4m3xaTBybiClZuPd3BlTmZjgXqBd4aikIp4eXZ7g397hHZtk5aUlY+XkIOJjpaZl5alnJeflp6SkpejnZmrlZCQiY2RgoyFiYiBhpCRnpuZiYWMgYaXeoiIn5ePiI2Ki4J9oYmQi7yhmJOXmpyppqWun6i2v8DAucfJzc7FzcnR1tXV2dXX29TX2drb19va2tjO3MaHfHtoamZgVFhVVU1MRE5DOz09PDg6PD45PUA2PT9APD8+PDk4NjdDQTY0NTU9ODA2NjU1NDc3NDU2MTM4NTQ1NjQ1NTdISD1ESkU3OTI1O0g+Ozo6N0lQXVpSVVhLOVQ+Ozk1MzI3STg9TllNSHh4ZDU9PkM9PUA6Njo+PkBFUV9ZZWFdW2h0enlsiY2Sd3Z6int+gH5/fIR7foGRiYSFeoSHenV9dG18fYZ+c36SnZGeg5F8hn54jn14iopugpqAdJmGfYGIhHt9kHqPqI6Pw6C8jJyjnH2JhH2JcouKfnOmmpyYk4V7jpCIhGhHcaCknYyLkJKFiYqQkpWPnJqTlJCWjIuVn5yUoJSRjY2Pin6Qjo6LhImSlpqen4mMlJKdkYKLf6WZiISNg4aEgKWHi4u4mJ2RlJaip6Gdnp2jr7a6tazAxcrQyMfMz9PS0tjS1dfA19jZ29ja2tnZ19u4eXl5bWtmV2BcU1BPSUNMQj08Pjk5Ojo5OTs9Nj8+Pjw9OTo7OzM3RD84Mzc4PjcwNjg4MzU3PDM3ODA0OTc2NzU1NTQ2RlA1RE5JODkzOEFLPTszQ0BJPDlEV048TVRITj85NjMzMz5DO1tYPjVZeXBaPDxBPD0+ODU4OT89RFJTUlhfVlhmbW1taYGOinFyeYp7en98f3uHe3x7i4eBfnWDhXlyenNtgH6EfneFm6GanpSSgIyIf5iHgJuSboeohXqgi3yRjYKIhJt9mpCKjKOin5CjrqCLkYuFi4GThldyrYufq5uPg5ibj4+OW4KikYKMn5OUjIaIjJKTjJSUlI+Lj4mHlpudj5WWkIuSk4WAi4iSjYqKnZaZoqOGk52WoIqJiI2ckIOIj3+Dh4WkhoyQs5idkpSXoaGemZKcnaeyuKymvcLHzsfGz8zQzM7X0NHUrtbV2NrY2trX1tnZn3F+dWlnXl1YVFdYQ0BIQz4+Pjo0OTo7Nzo7OjM7Oz89Pjc7OToxOkg+OjM3PUA1MDY3NzI1NT82NTs1NTg1ODo1NzczNUhSN0dPSzk5ND1FSkI+MUZDTEI5ODpHWEA1SFdJNjYyMjM6RUNlWD8mX3lpX3o+Pjk8Ozk4OjtAO0JRS0tTWVBUY2J5bWJ+koNvbXeLeHl/eoF8hnx7d4aEf3NwhYJ6dXZ2dISDhX1+kqajn6WiloqdkJSXi4qol3KKsY2Ep5KEmZOEmYyilZ+Yk4manaKSqa+fkJWQjY6IloxujbeFmsTIspuhpZucmJaRspFkpM3HlY6Gh4mPko2Nk5SJhYqJhZaZm4+QlJOGlJeEf4+LmYiNkKqXl6OjiJmflpqIjoeXl4qEjoyBf4ePpYmNk6mal5OWmaGZn5mTnZuis7Slo7zBvsjFxcnIycLK083N1KnS0dbW1tja1NPazoNzgWlkX15eT0pVW0JBRkM7QT04Mzc7PDo4PTY0OTo8OjgyPzk6MjpJOj02N0JDMzI6OTYyNjQ+PTQ7PjY5NDk7NTc5NDRLUTxKUUs5QTdCR0lANjRKRUxGPjw4OEVUQTc+XDg2MjE0OjtFYFhBRmF0aExjWj41Ozo6NTs6PTpFTUZIUldTUkJjgUZ1go58fGx9iHh6fnqBgYJ+dnaAgntsbot/eXx4eHyEh4t+i6OzqKOrsqGWp6ClpJaVrqKDkLeVkrOZjaGgi6Sbr6KknZiQp5aoma2vpJeVlZSQi5iZlqDAjqPJuKuaoqWtmZGanLKdhoWoopyYhYiJjpWNi5OPh4GGh4iTmJSMi5OThpSYhoORkJx0kZmylpekoYicmZOPipCLl5qJipaOhn2MmJ+KkJCcmpmTmJiflKCdlZ+bobGuo6S3vrTFx8S9w8O/xs7KydKnzs3T0tDW2NLP2Ltze3deYVZhV1BISk9FQkNENT46NzY6Pzs8Nz00MjY2OTc3ND01PDU8TDw+OzxCQTc1PDs0Mjc3P0A2P0A3ODQ5ODc7PDU1T01EUFJMOEA9RUFHQTU6SkVORUQ6NkFAQlM+OURPMzIzNTc1PXZcPFJcdGlaTV1TPD04OTU2Nz06SkZER05bXFlKZ2E7SISLenpthYZ5fIR4gIWBfXB4fH18b3ONen2Be3iGi4mFhJKou62osr2vpa6zs6ijorCsipq0nqK4pZWspJeprbempKOfmamYqqOvsKmamZyUlZGXoJeZu7utyaBptrirsJSYnqKrkpe9o16qsoKJio2Vh5F8j459g4aNj5SUiIeSlouPlY2KjJaZkp2as5aVq56Lm5SSjZCSjJibipKekIyJlZ+ijZWOmJqdk5uYnpShoJScnKWvqKKls7irwsjEtbu9u8XIx8LRocbJzc3E1tbQy9OicXxqXltVX1JQRkQ+PUNBQTg/ODc0PkY8PDY8MzUzNTU0NTRCMzo6Qk06QTtBSEI7OkA8NzQ2PEI5P0BCODc0Ojo2Pjw0N1RLQ1VRSjc8OklBREA0QUpITkJBPzZEQTxKTkQvVD0yNTQ6RUpcWEpaUW1ncHBEaWBLSTY3NTc6PkpAQ0lQZUhiYGNwSkCLin6AcoaHfIGJdYKKgn5tfX18f3B3h3eNgYd7jY+Mhoyaq8LAsL7Gu7K0wby0rauztoyosq6uvaqbu6Sorbm3q6amoqKjo6mvsrGqnZykmJuYl56ipaWSo7muqMC7rK2yuaWkp32IhpytvbCDi4uLkIOPg5GPeoGHkI2OnIiIj5eNi5WXlJCalpynmrGakaudjpmPko6VkJCWl4+RoJGIlZukrJSWj5ScnpSgnpuYoKGUmp6op6Sho7CypsHGw7CwurbFxMK+zafHw8fDvNXQzcTKiXV0Y11bYVtOS0NMQEVGPkE/Qjs6ND5BPT01PTY+MzMzMjQyQTE3QEJOPkdAQ05DQT1DPTs4NkNDNUJJQjo4Nzg7NUI+NzlWS0RXT0Y4PTRLQEM+NEVLSE4+QUE2QkI/QlNFNThQMTQ1Ozw4O0Q+OUxqal07V1JkS2daVU83OUdFP0NGXGdHYGlnWl1bk4yMiHuHi4aDjHWGkIqBbn58gn9xfoF6lXqSlJSYkZOVp7TGycDCzMHDuci8uq+rubuXsra6s8CupcCkqrC7u6quq6KinqerrrWwqpugqpyinJWesLSni6K6urXBu6uonLKkpKiUhI6pw8SkgouOh4iEhpWUjXqDjJGPkaGMjJSRj4mYn5eTmZSXpqCunYyqnI6Vj5KRlZWOkJWRj6GUhpefoLOelJuUoKGZpJ+aoJyglJiepqSmp6SvraW/xMKuqbe1ycO+ts6yxb7DvLPRysjBtXZ6bl1ZXWtTTUlDTEpKSUBBPUNEPDVBRDs6Mz04QjMzMjI2MkEwNUlFTT5JQEhSQEg+Q0A7Pj1GQTVBVUA7OTk4PDdFPjg+VkpDV09HOD80TEBCOzVKS0NMP0I/PEJGPUFITDkrRzwzNjc0NjRBPzdPYU9hRS89PjZrbGpgQDpIPj9FQmdcTWVcZlRjapmNlomLiJKPhol5hpOQgXKAfI1+d4eBgpB6jaGWqJqamLq+yMjKwtLJysLNvMGzrbu+p7q/vrzDt6zBqayzu72qsKmkpaOrrrSutrWgn66fpqKYo7S9qZuovMCjtravq5KvrKqrloaaqaalkYKMk6WViYB1ipJ5hY2RkJ6fk46Ui4+NlKOZl5uUlKOeqZ+RpZqMj4+PlZaIfY+VkpKjmpWgopy1ppGfl6Wko6WenqaYnpWXm6Wjqaiisqyou8DEr6Wzt8zAua7Ds7u+wbitwsLBwJlvemNZV1xcTExNSUdEQ0hCQkFDSzo0REg6OzQ8N0UuMTIzNTJCMjZTSE48SkJKUUVLQ0RFOkVMQjw3RVY9Oz04OT88ST86RVVJQVdRRjdBOks6Qjc5Sk1CSUBDPjxERzxCQ089MjBIMzY2MTcwPUI6PWpqSks1UVMzU3BwZE47RD1ARj5rSV9YYVpkZVaej52Ol46ekomKf4mfkoR4hX+Vfn+QiIqQgJWgma6no5jCvcjEyMbTzc7Ny7zCt7C6vLS8yrzDwba2u62zv7m8ra+ooKmntq2uqbK3mp6toqihnau3uKmlr77Esb24s6eps7OtrpaVpaynoJGOkrHFp5WNfJGVfYeRmY+qmZiTk4+TlZOlnpOdmZOho6KcmJ+Zi4yPj56IWpCXl5KWpZpmmKOfs6WWo5asraunm5+nmJmWmZWhpKimnrarqbq8w7WltLbLwbiqtqyzuriuqLi6vbiDbm9bWFVWT0ZLU01LP0FIRURHRkc4NUZNOz43PkFKLjMyMDI1QjU1UFdOO0xGS1JMT0dHST5JUT86OElTOzs/Nzk+RExCQEhTS0BXUEY6QT9HNkE3O0hNQ0U7Qz00RkU6QkFCRzkvOkEzNjAzPkdEOTQ9dGRNRztFKzpmfGhXOz1AQkZCckZpSVJlYkxGppSclqGXqZaMkIOHpZKIgYeCnISDlZCRlI6aop+vvq6hx73FxMfHzs7O0sq+u7axuru8vs62xL23uLeysrWzuLKrppyrq7iqqaevsJejrqSnpKW0wLCqrLO+wrnAuLOnuLO3s66Vpa2urqSLk5WhjXPBmX2WmYSOlpqLsZWamZWSk5mZpqOVoJuWmqicm6GgmYuMj5adYEqWnJqUmqWXVJawn6+cn6WUr6+tpZqhppSTmZmOnaCnopm0qaqzvby7q7Cyx8C5pqurrbGxo6GysrSkcnBmXVtPUUxFUFBQUTtIS0lGSEFDPjlLVD9BOj1FTTA3NTQ0OkIzNE5XTzxKS05VTlFKUEhISk9CPD5NUjs+PTg6PENSPkRIUklCV05JQENBRjM+NThKS0NBPUM7NEVBOkE/PkhANSpCNTIsPmNdZzozNXRkZUBSNyYjM31pWDs6QkNAPVJFV1JzYldGSKuXmZ+hqa+YkJeHi6eWjoiShZ+IhJyXj56gm6Oltcm0qca7w8TIysjHzM7Hvrqzr7m4wMHNtci6wLm1urGvr7K0p6ObqrS0qqmmrqyZpK6lpamtur+oq7a2vsG/vrizscKvt72ro660rLiliJuXppt2vqCEmJyOk5mai6+WoZybl5Wbn6GpnqigmZqqmaGnnpeQjZGdg252k6KalZ2in5CusqOrlamqmKuupaSfpamSkpmbiJScop6WsKepq7q3vrOyrb25tp+jp6ilp5ycrKmpjWVnYV9STE1HR05KVkw9TURNSUpBQ0Q8UVU8QUFCRE8xOD03Nz9CNzVVWE4/SE5RWFJQUVRKUUpKRUFFTVE/Pz04PTtHUjxFRFFCR1lNS0FIREU6OjM5S0lCPkNCOTlDPjxAPjs7RzctMj4tMYJoTnpcLzBraGA8PUJCODZ6Zlc7Oj0uLlNhTVZIf2VeSEaslJyhn7uvmJSei5Oqm5GSk4mrjYeinoykrJSjo7bHvbTBusLCyMnFws7Iwb25sq+5tMDCyrbGscC8tLqrqa2sr6OimKq0uqappqyqnaivp6Srq767qKy8s7e9xry3tbjAsL2/s6m0tqu+pI+il5Gin7yfiZmgmZaenY+3n6mcpaObnKGaqKWzoZudpZyoqp6ZlY+UmouXiY2kopScop+gta+lpZOxq5qsrJ+epKOpkpWVoIOQnp+clamloqG0tbq1rai1srOenKKmmpeVmaqhnndiXmBeS0lGSE1RSU1FRkZCUkpIQURHQVZTREg8QUdRMTtCNzpCRjc5XFlLQUxQVFVTTVdSTlVKREBKSk5POUM/NT08TlFDPz9QP0VaTUpBS0RHQDUzPUlHPz1FQTk3QTs8QDw8M0A8Lyc7KkiRQjpTSjAsW29XNzE8Kh1CgGRUNDktMTpoXUZERJxvYkdFqJeknp7DrZuXpZeZqZyWmpqPqpaVqKaVrayZoaq2xMK8v7fBw8DHxL/Nxru+ubKwuLO/w8i1v6+8trm3pqOrq6ygoJqqqsSipaispp6sr6yiqqi+uKasvbC3tse2tLm4vrC+wba0srSvvqOWo5aTm5Stn5ChoqWjo5+QvqWpnaisnZ2hm6afvaKYpJ6iqauhnZaNlZ6Tn4ePhY2TnqSgnbWspZyWsqeZsKifmqqeoI2ZlZ+FjqGam5KlpJqYrLG2saqlqa2snJmgoZKOkJWpn5RpZFphXVBKR0tPTEhFQ0lAPU9IQDtHSUhbUk9LPUhOVTRCRjk+SEc1Q2JbS0NOUlVXVlFYVFJVSEA4UVFQTTpHQDRDSFFTSUM7Qz5HVktDQE8+SzwwNjtHRj47RkE1Nj85Oj85OzE1RDAtLDBNdlw0S1o1LE1uVzwtPSkeI3piUTVDS1E5b1JGPEt4ZWNXTKKao5uexayhn6ydna2fkqOelqSgp6qsl7awo6qztsTDvcC2v8K8yMK+ysi2uLW0sLO0t8HGtr6wuLS5tZ+mraqrnZ6fpaTBpaCqrqCkqa2voqanvbWlsbu3trXDsrO3ur6xw8C4uK2ztLWinKSVkZOgraCYoZ2pqKuimsOtqZ6srpubnpmmoL2hnaSYq6urpqGZjZqfkp6Jjld/lZ6moaC4qqeTmLajn7OioJuvl5+PmZSdgo+gl5aNoqSVkKausqupoqKlpZWVnZmLj5GTpJ+JY2VbZGBMSUpLTkZFQUZLPj1KQTk5SkpOXVFRSj1MV1w5Rkk9RE1JOEhjXExDTFBTWVlWV09aXklBPVdRSUs/SEA1SE1YU0hBOkBBRFBIPz5RPks3MDk5RkU7OEc/LjY+Nzg+NzcvMT85MSUxUVVtW0pPMTA9Z1dEMTc9LSt3YFM2U1prV3NIRTY9dWVcS06en6GYnsSnpaKzoZyyp5OqpJ+jn62prJ27sKistbLIw8HCs8LEvcbEvcTKvbCwtq6wta+/xbW5sLC6tayaqLCpqZqepqGnwq2brLGcqqKusKmkp723pra6va+3xK2zs8K/scazurertLatqqKllZWUo6uhn5+ZqKuwrq67sqagqamZmZeToqS4oaGkkq6vrKSmn5KhnpWej5GNlJ2ao5+ntKenjJi0nKOwmp6brpGflJeUmoCSopaPjqChk4umrbClp6KcoJ6SkpuUhYuSjZyegGNmW2hmS0lMSlNCQ0BJRzs7Rj85OU5NVV5SU0o+T15ePUhQQkxMSTlOZF1MRUxSVFlbU1VPXGJIQT9aUUFIQUtCN0ZFTEtOPjtCSEROQj07TkBBMy85N0NCOTdGOys2PDQ2PDM1LS80QDErJ1Z0U2VPPzEwNGJbTTIzPjA8dl1eP1tVXmZyQDg8SJZ3ZUE0n6Sfm5/CqKOqsaGjtKmWsqumoqSyrK6pu7KtsLS0xr/ExLbAxL7KxLXAyMK1q7WosLiswMS0t66strqlmauxq6mYn6aXrbu1m6iwm62frrSyp6q6s6e6sreyuMCqt7LCvLTFp76urbe1qaesoZeWkaWkoqKXmKSvuK2ytbagn6ikmZSVk6Oft6OkpZWusbKlqaWinpqampWXqJ+fmKKerrKipo2XrpmlrJeanqWRm46UmJqFlp+UjJCcnpSLqamroqehmZ6WjI+ZkIGGlomUn3lkaV1sak5QTU5UPUJBTkM7OklANzdRT11eUlZRQVdgXEJKU0hXS0g6VWRdTkZPTltXW1JQUVhdR0FCW1BCRz5OQzlIR0hOUD8/Q0lCTEI8MklBOTQxNzdCPjs3RTcrNjkxNDgwMi0vLjw2LSNCcWdzazIzLzFcY1ozMzgwNnBbYkgwNUpwaVZDV0aMeWZDO6SjnKGlv6aor6+hqbWqnbmvq6SqtLexsLm2sLe4uMW9w8e9vMTBx8C5wcbBuqq2pa27rcHDt7eqrbK8opWtsK2xlqWokaq5qqCnsJ2qn6+0s6qptrasu6uysrm3rLmwwbm9vqbDq7C3rqiqq6admJiqoaGgkZegsK6zq7C5mpupn5mWkpemoLappaKir7Gzq7Gnq5+boKCbnqScoZedo7Owm5+QlKaaoamblaKflpiKlZiTlpedk4mQm5mUjqmpp5+km5ibk4eOmYt+jZaGjptraW1hbW5YUVFaVEFDRVVAOzpJQTc6WFBkXlBWV0RZXl5NTFJOX0tKPlpkXk5JUU5bVVlQS1NXWkk/RFhQREY+Tj89SUdHUVBCPUNGQk0/OjJEPzc3NTQ3Pz05NUU0Kzc1LzI1MS4tLiwxPionKz1ccD0+MS4xZVtkQDE2NDdnWWBGKEA4bH1oXFY6iXtjQz2on5yhqb2hqrCqo7G4qaW1squhrbW9r7O4vLq9t7bBw7/JxLnFw8DAuMW9wbivtqert7K8v761qa6xt5+Xq62orZenqY6nu5+lrbOeq6KxsLOsqraztbytr7G1rLC1scC5xLarvK+xuKysqaKxpZ6kqJ+kl5CYn7Kqs6mqs5mdp5uZlI2gpaS0rqeirKyusaeyrLKpo5ufp6SdlKGYm6i1qZeZkZKfmZ+hnpCsn5iYhpWYi52anZOKjZaXmpempqOgnZaVlpSBj5WFe4+ShIyWZmxzaHByX0dZZlZEQ05YRFo5SEI2Pl1SaFxOWV1HW15dTk1SWGRKSkNcY2BQTE1OWFdYUEpWVldMPUVVSkVEQU0/QUZISFFQQTtGREZLPTg3Qj02ODcxOT48NjVEMCs4MC8wNS8qLC8tKj0sKyUyKyo1SzEuJ19eYVYxNTA9YFZeOClDM1lVXGdLNYx6ZkxApJqgpKy3o6yppa6utqqutLmmp7C4xbext77BwrW0u8W+zMW5w8G6v7rEuMG5s7Wsqrq3u7q+taqtsbaYmKirqqubrKuPq72eq66xo6qfsa2zrq62srm2qa2usae1sLO6vMmyqrW0sbSvrqahs5+aqKygpZWVmpmxoq2gpa+WoaSZmZKNoqWmsqmhprGrqrWkrbC1r6OYna2nmpeemZmsuKKYk5CPmJyhmZeUrJ+dlIGTmY2enJqWkIqUkp6apaOioJmWkpKWe4uQhXuMioOLkmtueW51fGFGYGpaSUhaWz17SkdFNkFiVGlaTVxhSltdWlJSU2JhTEtFYGFgUExJUFdWVU9HV1ZVTjpJVklIP0NLP0VESEhRTkE/SEhIRTw3PT46NzU2MDk/ODY2QiwtOCwvMDQsKCwvLSo3NikoOS4kOks1LiJUYFZhLjUoQ15RXC4qQS9KR1BbRzNjWVRLRJmXn6+osamspaOurrWptrS3o6y0t8m6tLu6v761tLfDwc3HvMS9t76/wLe/vbK9rqe6ure3wresrbG5lZemrquno7KqlK+6pK2ysaenorGzsbKxtbG4sqiuq7KnuK+1s8PFtqm0tauwramnorafnqaxoKSUm5mUsZ2nm5+pjaminZuVl6WlpLenorCzq6exp6ywtaykmaGsqJucnZuUqriclY6Oi5mdopiQl6ein5aDkpaQnZyYl5aIl4+XmqedpKCSlpGQlnaEkId7hYKEjIxucXh2fH9dS2VsXEpPY1w/YntHSThHZ1dlW0xeYk1YWVdUWFRpXVBPSGFdX1BKSFFWVVJLSFdVVk04TVpORUBGSz9IQkNLU00/P0xPSEA7Oj47NjswNDE8PTQ1OD8pMDcpMS4yKSksLC0rLTkkMDQyJTlCNy4jQU5JZzI3J0ZhTFYlLUIuPUVMUTwzcmtLREORmKStpK2tq6ajsLKzqrawtp+rtbnJua7Bu8O3s7K1wsPPxMDBvbS9wL+6v72zxKiqubG2t7+9r6uzs52gp7CtpaawpZ6ytayrsrCsqai0uay0s7WstKypq6isqbmtsbDHvrikua+pra2mqK2wpaOjrqOpnJ2bmq+ZoqOio5CsnqOgn6GppaW4pKu0tKSqq6isrravop2jqKqboJmakqS0mo+JjYeRo6CWjpSeoJWThY6Uk52bmZaUh5iSlZmnnKCfjZKRjpF3fo6FfHx9h4qJcXRzfn1+XFJkbl5OWmZdRkSWW0c6Tm1YYVtNYGJOVldWV1RZZ15RUkxkWltUS0dPVFNOR0lWU1xOO1BeSkJESEpBRT8/S1NPPjpOTUM8PD45OjU9KzMyPTYyNDk6KDQ1KS8sMSgpKywtKiY1Ki8mMCkzODoxJiozQ2U7NipIZEhKKzpJPzNDSVMsPo9rPkhJj5qpqqGosKSoo7O0sbS1sbGhrK29y7quwbvGsbSttMLD0cTGvsCyvsLCvL+4vMWorbess7i8wbCrsq2hpKetqaiksKOrsaqvq7Gurq2rs7unt7GyqbKpqqalo626rKmxwrm0rLmoqKitqaexpamkoq6qqKKem6KslaSdl56Yq52hp6ihrKWjray3sbGgqaKfqq2wrJ2epqepmaOYmI+gp5iGg46Ki5+hkIyNl52QkIaIkZWgnZWYlYaWk5OXpZydnIuRkI2Kf3+HhXx3f4eFh3Vzcol2bF9ZYG5jUXNyXEs8hHxGP1d1WGBZT2RcTlVWVVdQXGFfU09OaFhXVktHTE5SSEVJVlJdYzxQXUQ8RkhIQkc/PUpQTDo+T0o9OT89Mjo3OyozNT4xMDQ4NSg1LyosLjMwOyksLCclMjM0JCwyLTg2MCkoMTxeSjAuSWdERjg8QjA1RUtYMUCUXEBNRpWWrKehqrKcqaiwtay4tK6qpKurvcm7sb63w6+wrbPExM7Ow7+/tMDDxLrAtMnErK+3rrK6wL+zrq6rpaiqsKmmqLKltK2qsK6tsa+zrLO6pLi0rKyup6ugop6wt6uqrbq2pLW1pKmnrKyqrKGopqaxsqSmpaGhq5apoJOaoKaeo6KqpKyinqaxt6ysoqSimqmqramcoaWko5igmpWPmJ2UgYKQiIWdoI2Kjo2aj5GLhI2YpJySkZuMk5GRlKOam5qLjouLfIeBgoJ7dYCEgX51d4ujh3lrXmBuZ1dmh2ROQGeSTERieldiWFJlVU1WVVVUT1xdYVVLTmlXVlZJSkhJT0JHSVNRWW9BTVhAOkpHRkVHPj5FUUg4Q0tFODdDNzI6OjoqNDk/Li80NjMpNCsqLCsuIzQuLSsmKCs3OSomNis8LTIsJjA2WFouMEpnQUE8PEMrOkpPXjREhkFJSESWka+koqqwl6qorbWrtrCrpKuqqbzBwLi5s7y1prKvxMnL0b/Bu7nAwMK5wbrCxK6xtbK0vMG+s7KurausqLaqpa2wqrmvqLCwrrGrtaq2taa0tquspKmqnKOds7OoqKS0tKC2rqGpqKuoq6egqquoubapqqmpoamfrZuRqKGdoKSipqKpnZymtK6npamio5ekpqepnKKjo5+ZmJ+Rjo+Zjn6HjYeFnp6IhIqLj46RjYSGlaKajo2akZKRjpOfl5iWjYqDf3SHgX9/eHWDf3t4foCInY9wcmdncXhcYXOIaU9dmFZIbXlVZFZSY09MVVRVUU9YWmJWSFBqVFdTR1BZVUk+SUhPUVB4TE5WPTxLRD9AQTxAQ1VDOUFLPTU7RTEzOzk3KjQ6PSstMzQxKjgqKisqLCkqKC8qJiklMzssJDIpMjAyMSUvMlJjMDI/Zj1OWD9DLD9MVF8vSWs3UkU7lY2vn6WqrZmrpK2us7SuqqWvqam7vrvBsa+4raK1r8nHyNHAv726vMO9usPBwL+vsrOytr28wbKys6uzqaW1qKSts7O5r6KttbGvsbmquK6qrrarqp6qq6CjobauqKGer7KhtKqeqKeqo6qhoaytqL2vrK6soaenn6uYj6+imKKgqKeep5uZqbCoop+soaCSoaKjppiaqKWYmJidj4qHlYh9jYaEhaSXhoKCjIePjpGFhZWgl4iRnZCTkI2RnZWXj4qFhnhzgX99dXh6gHt0dHtqgoejdWleZWyBdWeIi3xSV3BeSnhzVGRTUV9NTVNaZ05MVlllWEdTalJSPkJOUWFROklITFNJcVBMUzs8ST87PD07QEBXPDw+SDczQ0IxNTo5My01OjopLTMxLS02KSgrLSw1MiMyKScsJS47LiYxLjAtMTQlLDBNaDozOF89YWQ/RjFDUFtbK0hPO1hCNI+OsJ+kpaqjpaOsprSzsKmksKequL7BvLCouaqnrrDJxsjQwr3Avrm+vrzJvMK5sbC1srq8ucCztLutuayjtaanrLK2ubKmp7q1rbS8r7ylra21q62cqa+kn6WsqqecnaqypLOomqqnqqSpnqKoqKm9q7SvrZ6po6Cum5qyopWkm6Sln6SamqiqpZ6aqaGbkZqgpJ2YlqmpkZmZk5CKgo+FfY+CgIiej4eAfoyHkY+QhYCUm5SFk6KMlJGLkZuSlYeJfoByenl+fGh3fHp1cHF+aYZ5hIhkYGhkcoV7bWd5XV5WQld7bVRhUFJYS0tNcHRdSFpbZ1lFVmdPQz5LTkRDQTlIR0tTP2phSVE4PUg8PDw+Ojw/VDY6P0M0NUg+Mjs1OTAyNzw1KC41Ly0xMSYvPktJMSUaOTAlLCwwOS8sLCs2JzE3Iy0vR2pJMTRYPWZiQUo3R1NgVSo9PEZcQCqOk7CZn5+ppaOhqqW3srGkqbGmrbnBvbWwo7mtqKiww8nJzMG3vcC1t7+6yLbDtbSztbK9ubq9tq25tr+torOmq6uvtbe0qp26u6ixv7K5oK+0tqmsnq2xo5ylqKminZyksKavoJ+rqaehqZyjqKCtu6eusa6hqqKjrZ6erKWXn5ugopyfm5miqqKamaOjlZaTn6GWm5amrIuekZCRjIKLgH+PgXualI2JfX6Mh5CPjIqFkpiRh5SkiZKSh5CakJOBiHx5bH12eXhie3pycHBzeGqCdGqCZ2NoYW5zjm1ianBgb0FdeWtWXk5QUUpJTFNZVk1cXm1XRFhhT15QSE1ERjs3SEVLTzxyaEpLOUFFOzs9PTs7PUo0OUI8MztHPDQ/MTgtNzg7MigwOS8sNS4uPS0qTD4qHTQ5JicuMzQuMCsvNCYsOiQ0MEFoWjEzUz1lX0RMNktWZE4pPTNRXT0jkpermJ+Xp6Ohn6ejuK+toq+vqau4wrqzrZ+5r6uotLrHyse/t8K+r7S+t8S2w7KwurKzwLW7vripubi9q6S1p6iqsK25sKmZubyjrr+0tKGut7Wnpqews6CfpaanoKWZnqyoqZ6gqq6noKaXoqifsLifpLGuoKyhrKSbpqaompqbnqOVnJyanammlpqeqJGXkpidk5mVoaqQmomNkId9iH+Cjnx8oYyNiXmDjYWKjY2FiJOajomVn4iRlYKMl42QfYR7c3B8cXN0YHl4am9wcXBqf3NjemxoZmRhZYeAYFtyanFNToBpWFpNUExKR1BSUUhNW19vVERYWlJnT0hLRUY1NkhCTEk1WmVKQDZFQjk6Pj0+OjpDNTk+OjNARjwyQDIzLzo7ODMmMjwwLDg1QiopLUMqLDQ7Tk5AOzczLS4rLTcqKjwlNTM9ZmQyNE0/ZV1GTz1SWmdIKj8wXFs1KJabpZiclayfn6GkobeqsKO0tKmpucW2sq6gt6ytrbC1xcfAt7/CubC1vLe/u7+vrL6ws7+xvcO5qbu6uKeotainq7Css7Cmmby2pKu6ta6fsbivqaWnr7KboaSgo6ShlpuvpqGfo6ivoaCik6Okorawoaaxq5+soq6Xm6qkqJ6Xmp2kk5qcmp2lqZmbm6SUlJeUnI6Tl6KpoZCJio+FeoR+hIp6j5eKjYd6goiEiYyOhY6TmIyOlpmKj5Z/hpeLj3qAenBxdm5wdF94d2VtbGxraYRuZnJpa2ZpXWN0gWBba3VpWkp/XltYT09LSEhSVUYyOV1ebVBEWFZZZU1ISUVFMDdGP0tCNklKSDs2Rjk0OT49PDk4QDg7ODo3QEk+ODw0LTM8PDc1KDU+MSw7QTEoKzY8IjhSPSoxMTM+RDUsLSc0Mio7KzEzOWNtNzRHQWZbSFREVV1oRC48MmNWLDKVoqGXlJupnKShoqG3qa6gurilrL3Fs7Cuo7Wvra2vtMPDvLO/urews7m4uri6r67As7S5sL/BuKy9urWlorOqp6myq62xoZrAtaSntbWonrK8qailqa+smaOnnKSllJehsqWZn6SoqZyioJOkn6O4qKSnrqadpaGokp+ooaGgmJqcoJKam5afoaqbmpiglJCTlpmNlJKjqKSQiYmPhnmEe4SGfZ2OiYqHeoGEh4mJkYWVk5OMkJWUjY6Ue4KXjot3fntsdHFsbHNhd3RoaGpnZ2+FZ2hoY2ZpamBqY2lnW2V7Y2BTdFRcW1NMSkdJT1NAISpoXmpMQ1ZVXmBLSUdFQy46QjxGPDZLUEQ4OkQzNTc9PTg5NT86OzQ+OEBLPT45Myk4Pjw6OSo2QDMuRTQoKyw/MC1OPy4rLTcsMTE5NSwmLjUtODA1NzZgdEEzQ0RnW0tXR1VgaEIzNzlnTycynqKjkY6jppuenp2jtaynqrq3p6zEwbawrKO1rqeur7fAv7yywbawrrK2tri2tq2qvbOusrG9v7iuvLuxpJ+2q6WltKmqrp6dwauopa+yqay1u56pqquxpZieqZ2npJGYpq2imJ6kqaGbopyWn52ntqWvqq6hoZ2doZSgpp+hoJmbmZyRmJ2UpZ2roZeWnJSSjJWXi4+YmqmgkYiJi4h5hXeCgoKdiIuCiX1/hYiGhpGElpWPjpCRkZGMknuDlY2Gc319Znhva2prZ3Vza2NnZGR2gGJlZmZlampka3JaX1ldbWRhTmlYW2BWSkdJS01SWD45X2xpSEJUU1xbSUhGRkEuPD85QTg5UkZANzpCMDM3PTc2OTI6PDk3OjlETT1CPDAqPEA7QT0tNUIzNz0rKiwwQSpKSy4vKiszNzIyKDU3JCs3LjcyNjg1XXlOMj5IaVpMWkpWYmZAOjNCaEglNZqjn5CLrKGYmJ+WpLOxorG9tqGxxry6sbGkt6yqrqm5vLu6rsCyrq6utq6yuLOoq7mxr66ztrq2sLi9raaetaqgoLCkqq+cosCgsaSusK63rrWera+traKanaeppZ6Vmqeln5mkoqmdmp+blJydrK+luqiuoqGamp2ZnqOapJ2XnpiblJmgkqiVqaeak5qakYuUmY2UlJmpp46NiomPfIJzgYGKmIWHfImJhYWKjIqShJSck5GPkJCWjpB/gIyNgnCAfmZ5bWhraWdxcmtcaGNjc4FhZmhqbmxnampobl1sbHRwYVVjaWRlWklGTE1PWFFRVmFlgVVAVlNZVEZIRkVALzw9Nz82PEZOYTg6PzI0OUAzNzgyOD83PTg+RkpARDkyLT1BPUE9MDVAOUAxLSsuMzw7SzYvLissLTI0OzYjMyopNi41NTQ2NVp8XTE5S2pbTVtLWGRkQEExSmZDJzSRoZqNj7CdmpOhmaiyr5+4v7agtMK7vbmxprawqK6lt7i3t627r6yqq7aqs7itpbO1sq6psLe2sbO1uqepn7WonZ6ooqmtmqe+mK2jrq+0ta2sn7GtsKminJyjq6iblJymo52aqaKklpqfnJCbo6uqqbufp6SgmJmZnaGPa6GWmZxwgpWao391kamnnpSUnpCIl5mAloqhkHiGlIyDbmp+doNxbIaLhn2EjIdwXmNhZ4SYhmuLj5SSdHeLhH6Dj39nhoBndWhlV1xoc25OUGpjZ3KEZ19kZm5tal5fYYqPg4RlTktEOUZUZ15KR1BQVFVLSFJgb3RlRlpRVVBGSEZDPjE7PTY9NjwzZlw1Ojw3NTtENDg2MDpCNz86PkZMQ0IzNDM9QEBAPTI4QEU9MSwrMDg+RzYwMS4qLiovNTY4LCMxJzIxNDoxNzVYgWwxNk9rW05cS1tmYj5HMVFkPSoui6OZhpSwm5yToJuqraqjvcWvqbfCuL28rae2sKWrpLezsbOxua2ppqy0pq+1oqi4traop6y3s660rbOiqZ+zqp6hpJump5irupWmpa+ytq2upKmuq6yloZ+doKenm5egpaWbm6ennZOfn5iQnqeqo7Wvo6OjnJaXl5ejiKGOkpqHoYeTnKB/pH+lqp6SkZqRiIRyeI2OhYihdoiMaZeIZn1yeKFviIeEfo59f6GgoJmAfIeedIeOdpuKbIeBg2xoZWN6a3FhU4VtY2xpmHFZanFvh1heaVtra1uIcW56coVnhoRaXkdOP0dfTUZSVlZRUVJXVGdeTVdJUlNPRUdHPjw0OT05PDc7MDw8Nzk5OjY9RjU4NjA8Qjs8OT1GUUc9LjU8O0A9QD41OUdBODIpLjE8STkvMDEuKi8oLTQ1ODMlJjIxMTU+MTw4WIN1MjVSa1tOXExcZ189SzFXYTcwKIumloOcq52ZmJ2fqqqnqr/Dr7G6vbfAv6qlt7CprKaztK6us7erqaWxraW0s5yttba0pqeos7Gtsqiunqugsqigo6KaoaOarbOUo6WltbynrKerqq2opaGgmKCmo5mZpaOkmJykqZaUo5yUk6SlpqG3o6OgpJiUk5eTm4iuj5iUiamLl6GbhbGAo6ydk5mdlHmC1KiAh5XBm8d5eLGlt5dkgMCcv3mEhHmQhHyQkJHKcZe8nMV6crWmu5B7gGyWsauweGhrWLGubmVpvJK8bmh6bnKP2H5TamK2sn+BcpV0mqGqkFdPV2JQVk5GVFtYUVBSjFxXXFBAXERRTkRHSTw8NTc9Ozo5Oi49Ozg3ODs5PkY2Ojc0PkA+Njk/RVJJOi41PjtCPD9BODpKPjUyKjIyQkUvLjMyLisvKS0vMTg2LSAvNDE2QTE9OleDdzIxVGtcT1tNXmdcPkwxW100MSGNppKAp6qfl5ydpa2yqLHCvbK1wLW3vsKrprOsrKmnr7Opr7a0p6emtKWnuK6cs7K2qqWkp7GurrGmqp6npLGjop+el5ufna6rlJ2in7O6o6qpoq2upaGdmpqhp5+Xm6egn5iep6eRnKeak52hpqKgsKKfn6OWlZKYkpmFr2pqio2qfmeDlYatZHCdnJOZpZRxrqGkfni7fWuhj3axX2q0W6WAZpyRYGaCemZ/anhrqWS+cmemjHWxanyxeHSSk2NtbaduW4SgRWhmh5ZFdZxgfmd8pKeCWV+Lq2mAlnh5aqc3Sq9cWFNsZFtLTldfXFdWO06JT1hXL0lUVElDRUY9PzQ2Pzs4OjkwPTg5OTk6PTxEODs6Nj1BQDY8QEhRRzkwNzxBQz5ARDhARz0xMy0zM0UzLi41My8rLyguMC46NS8nJDIwM0IvPTtVgnYyLVZqXE9ZTF9nWTpNNV9ZMzAbkKKVgqynpZ6jpKqyt6y0vb6wtsSyt7rCpqmwq66pqbCuo7C6r6OkrrKjqLionrOysKOloKqtr6yvpqefo6Kwm6Kbl5WXm5uspZaaoZ6zs6KrnKKtraCdmZegoaicmZ2jn5yZoaakj52jmpegn6qepqagm5+hlZWRlpGahbWbtXiFqZm1mXaGs5u3fpOVlqiUfmuBpnuChoiSlJJ3q2drsVure4+HlHSJcY+GgH+IkJd4goKLmIyDoI+EsHZ3n3Fra2x8i06kWEhjY5l+Y2imYHlydVOSh15QqW1jcX6HgGKcLlGhb1tTa2hgTEtbZFhcWkI+sXlYWEEjTWhFQkVBQEExOT44ODo4NDs6OTw5OkE6RTo6OzY6Q0I4PT9LTkc6NTpBRkJAQUQ8RkQ7MDIwMTtGLDAuOTQwLC4oLzMsPjgzMR8vMi1EMTw8U31uMytYalxPWE1fZ1g3SjhhVTUwG5WflYezpqahrqmnsqypu7bCsLvCrbi3wKqsra2upq2xqaGvvKqhp7Sto6u1pKazs6ejop2nqrKosKelnp+fr5afmJSVlZedrKGZmaSotK+iqY+pqKqbnZWYoKWnmp+cop+boKOko5Wbn5eZnaKpm6WZnJyioJeTkZOSnIPVk5m5cLDCfsWGfNaUm7t8mZWkj42cjaR7joejgqWCeqx5j51Wr3qIfp9quVq5doeEfaaCk3yYeqp5jZ2Qe7FujoR0kLyFb5RQr6fFilGgemNgqWN0cohtl4hgU7W0yIaAiXxjpDNCnXZdUGppZFBAWGdaZGFKSE5tTVtST1lmWUNEPkU/MD08NTk7NzQ8Ozg9OjxDOkY6Oz42OkBDOzZAT0xIPDo8REhDQkNEPEVGODEyMTFEQy4vMDQ4MystKS4zMjM5NzEjJTUqPjM9PVF3ajYqWWlbS11PX2ZUN0c6YVE3MSWbopOYsaiopbOqpbSppLy3wbC5wLG1tLuztaexsKOwsqafrraomqe5rqOvsaCztLCgpJ6fp6mwqbSopJydnqqXmJeWl5WVoKqcmZanrbCpo56PrKKolp2XnKGloZiioaGhmqGippueoZ6UmZumoJynlZubn6GZj5GUkZyIsm5otXGrh26OpnK0c3K2e5mXo4uPnY2jf5GhpX6wdoOR0tF2XK57hX+kb5uqpmuHhX2tfZeZj3uxc5Kdj3mzZZZ0hJ5vnmaUUsiLWsJcn3liX61gdnOHYpeIXlnKnW+/gXVNS7VTVcZkVFFqY2ZYQU9rX2xoT1VHSTg9VlFaV1hIQz9KPDI/OzU9PDQ2Pjs3Pjw9QztHOTtANzs+RDsuQ1JKRz4/PElKRkNFRD5ISTkxNzQ2QD4vLjI0MjUyLSkuMjYsNzQyJh82MDs1Oj1QcWg5J1dpXEJPVF9lUDVHPWFNNjIwoZ2Spa+tpKq8raa1pae2u7yyur+3tbS6urOltLShsbGin6ywpJemuq6ksbCctLiqn6adoamksqisqaSanJqonpWUmJiSkqKnn5aSpaqwpqKWk62fpZKUoJukpp+UmqWmoZqin62aoJ6dkJWboZ6cpZWdlpmin5WYlZGahax7d6h2o46IhqlvrYqCp4OYmKGJkpqKon+TmYmuhX+Cs1xys1KufYOCpH9x1314hX6PnoaZmXevhoqRnIh4s2GaZZqBgpRsklqwWEuadZh5ZmCtX3d3h2iYiGtdr3eVno94bDV5yK6yX0JTb15nYEVQbV9wbVZVTS5lY2hSWFE7QURATDo1PzkxPTwxNj85OEA9OkM6Rzs8Pzo+PkU5LUVVSkVAQzpNS0pCSEc+R0s5Nzw0Njo+LzA0MzMzLjIuLjE4Ki4zMiUhMDM3Njc9UGtlPiZWZ1xAPlZfY042R0NgSTo5OZ+dlJ+4sJe0wa2os6ipsrq3s7e/ubeytby1pLezn7Ssn5+orJ+Up7WrqLGxq620pJupoKCoobanpqmimZ2VpaGTkpuZkpSipJqSkKasr6aglZmpn6KOkaKZqKWglZqlqJ2cpJ6snaGdoI2UnpqdoZiZnJaXoaCTmJCmnoapfX2leKGPjoOqcK2LgaeGlZ+hiJeXiKOCkYiUqnyAi515b7FaqIKCiKB5dNh/doh0qIKOm42So3yWkJ+Ee7JenGSgfoOVbJJcq1tak3+Rf2hnqmRye4FrmIdzXaxaiaCOa29lT0pDoVxbTHRdYmZNW2FfcnRfSlY2SpuTWEhFPUdGQU0zNUE4Ljs+MDVBNzhAPDY9PEY/Ojw2Pz1CNy5IVkpFQUg2S0lOQElLQEVOOjpANC47PjEwMjE0NCsqMDUvNywmMjEoJCQ2NjcxPFBlZUEmVWZbPzJVX2JMN0ZJX0MyPzihnZmZv6uXtMKurK2pprSwt7G1v7m5srC3u6m6tJ+wpJ2lp6eek6qwqa+ptayqr6GYoaCmpaS6oqOroJebkaKglJOempSXnp+PjYuor6+mnZabqKafjJKkl6irp5SXqaeenqCjraShnqGNlaGYn6CSnZeclZ2hlZaOq5uPrm1ytHKpjHaKpnO0eHOzgJGkopGcjYmkh5B3uG+Me4uia2u2WqCFZZeXaaGip22TcrR0k5h/smqFkoita3WzYZ1mom+HkmqXXK1fTaF8h5FSc6Nten9+b5iHcVyvVjycd2VUb24uXKdPY1JrZWJtWmNdYXB7Y1NaUT4+bW8zQ0JAP0w5ITdANi47QDM3QzU4Pz8zOzxDREJKRk1JRjYySlRLRUJJNklKUD9ITkNGUD08RTUwOzswMTAvNzUsKyw0MjYvIzAwLCwdMjg5LzlOYGVEJ1VkWT4vVV5hTDVGTV44MUM4pZqbnbuhnLLArq6rq6e3qbivtcC1vLCvubirwbapqqCbpqOinZGqqqi2o7Knr6qgl5ynoKSruJ2jrZuWmY+lopWMnaGbmJyfkZOUq7Wwp5mUnKyql4yTpZmlraKRlqqxpJ+epquwmKGjkJmilp+blpyXoZKcqZyUkKqZh9SSmrtzsMOAw4Z+1ZabuHiHkJeMmIqMp4h6o7Z1fXd2woKasmCDunnAfHW4YrWBjIepfZWBrKlxe391vIinoGmdYaaOr6F+jHSHqn2+bnO8dLKDdXiBim6aiHFujaR0vV53fVthebxrWlZbanpeamFlZ2Jtd29ZW1lDQUByQENHKzVHIic7PzEwPD83OkI5OT1DNDxATlpeYGBfX19aUFBSS0VGSjRITFJASk5FRk9CPEU4ND05MDIwLjg3LSouLzE4MCItMSwzHiw8OjA4TFhhRidUY1g8L1ReYEs1O0xbLTdBOaebnqG8opexw7Ctqqqssae4r7bEsbmxrrqvrsCxq6SinqOinJuQqaOqsqS0pq2ln5aZqpmmrLmdo66YlKCQpaCSjJyjnpedm5CVkq+5sayVl6Onp5OQlqScpK2ekaCoq5+bn6ijs56jpY6nopShmpyYlaOYj7CgkpSpnoWQmbWAkJGMt5V4gpOatXdta25zbnqPhI6JdJ7Bu72ae4GyqHCAdJG4g3yGhoyGjXuKh42XfKS7ub2cdXqzo3R2l3V0sHWZnmaGaY21dHJwd7aMXoB6fYpog3lteWOLrHB1hX9aW6dqRWVaVGZgY11jUWdncGx0Qk1QTEQ6Wk0/SjM8MCA4PjsuMz1BOTk/PTs8QzZCVFlaWltbWlteYGJgXVNHR0g0RElUQktOR0VPRj9HPDc/NzA3MC85Oi4sLy0qOC8lJjIoNCQoPjcvN0xUX0cnU2JWOCpPXV09KzpWVic+OzynnqChv6WWtMK0rKqorKupu66wxa60sq63p7S4ramioaWeoJ2Zk6ukrammtainn5uWoKOdrKS+pqGql5SckKKbkY+iqKGTnZiTl5SytbetmJ2kpKKKkpKmm6Wqm5appKWcmqGopqajqaGRrZ6Wo56Xl5edno+wqJSbp6GOan5pnKZ4h3J9mo50emSHe72+wLpvkoJxlYdgcmpaXpuKYWOIjpVrYH+VY22dd2KVa4CalZRlXmBjcZqKaHKMfYWVZ2p+cnR4fX1iW3d0gWhQXG6EfXuLa1hseoJzSUpvhnBNdU1FV11nYUxaV2djX09bbXVqcVJPREVOO0hIPUw/Mi0yQT84LzU/Qzw5O0A7PUM+UlZWV1laW1xcXWBhYWFgXFVHNURGVUVKT0hGUElJSDs4PTUxOi4wOzouMC03Nj01JiIvKjIsJTs4LTdKUl9JJ1NgVjQpUF5MKDM9W08nPzI+qKCoocKjmrS5tqOspa6nqLWyq8irsLKrtKO+sbKmoKKonaObmZmspq+kpbWppZuXlaGapq2pvqeoppWTm5WgmpKXpKmokJ2Rj5icsLK/rJunnaeiiJORqZqoo5qbrJ+jmZqjp6yin6uimrGblaegl5Wdn52XsaSXoaiZnJGdnKKkmKaimpyampmPlYFnbX1xd5KXlJGFi7WqjYaYlY6KjJiXh5SVioSSlJGJjpKUmJSYl5qgopqclKGejYJ6pIZsanyQfIB0iYqBcYJ4eXZ2i4B7imtzgXSDdWR3fXdrcHttYGNdcGhNWFpmamBXWm95bm1mU09GUzlPWU1STygrOktCNjM1PUBBOTpDPjxFTlNTVFZXWFlaXF1gYmJhX15eW1RLQ1NHS05ER1BMT0k8OjszODksMjs4MjApNklSTzgiKSsvMiM0Oyo3Rk9bSiZSXlMxMFReOis9OFxLLDwtQLOhs6G/oaSxsregqaWyp6WwtarIq6ywpbWmwKe0oJ2kpJyjlZWgqqato6O2q5+ZlpWflq2ppcGeq6OVkpyXnpiTlKKfnqKnk5GZqKeyxK+aq5yrn5CWlqidqpucoKyYoZucoqSvpqGlqJ+umJennZmaoJ6enK+gnKGmlZiSmJOgoZWjnpegjpaTioqNjpatj3yVm4KSgouqqIaBmJaKhI+fiHuEkIeFmZKIhoqVj5uXjZCXnqOWmpORno1/jmahs6+FioR2epCKfHZ5em9mepGBgIlrdYF5iHNoc396dYOHgmt0ZHlmYGllY2Rma1lre3BpalxTTFBEX1RFQD8/LDRARjs0NTs+QTs8Pz4+SE5OT1BTVVZWWFpcX2FjYV9eXl1eXVhWSktMQklPTVJKOzw6Nzg2LzI5NjQuKCYkLTEuLykrKjclKzwoNkNNTUQvVF1RMDVNWzE3RTRcRzU8LEC0oLmvv6yrrrKxoKqmsa2irLOwxLCqq6OzrryjtJufpqKhnJmXp6WppqSls7WelZSdmZmwpq6+oKuikJGdmpmTkZWhnJeonISeqquis8izn6qkq5aWl5qnnaian6Srk56enaCpr6mlo6uirpufoKGYpJ6cn52vo5ieqJOYl5yRpJmYqJ2al2WCknxlfo2Zj2N5jWxoa3uSpKpqZZqYfmeGimVlaWh7jqGPa2iNl5Gid2tqi5ijnplzbG56hI2HelhlXoaCXmyLiYB2XGhzd3eSgIeCbniCeIBzbXmEdHeJiI6De2mGWV5rdGRdc4lpan1xa2NeUk5XSmRYQUo0PUY3P0ZENzE8PT9BRDs7REdISElMTlBSUlRXW15gYWFgXV1dXV5fXVpVT0RIT0tTTj0+PT02NTM1NTU0KiYmJSwqJS8qKyc2KiQ7Jy9BSltKLzdaTzYpRVkvRE8xWUM7Py49pZ+6vLmvrLOwqqWora2wp62tsLyxqaekra+wn62Xn6OdopmZpqucraOlp6myrZ6Vo5Cir6a2uaWuo46OmqGZkpKboJmZpZV7pa2iqLPEuKShp6+enZSeop6jnKOpqZKeoZ2gqrCqq6SqoKqbpp+ooKyWoZulsKSXm6qVoZ6bkqWXnqqYnn69g4dytHKEnYWtaHi5xLhxk6KjeqaZmXOqgnzLwMC7cYuiiIKffZWYiJ3AvYKWnZ2NncLBe4J8ko2aw8B9a6Wyb4yBb8p6f5t3koOOgXZ6gYB5cXp/h3F4hY2TeW13lGNmX3lkYGWCY150aGxkYlhMVklRWkhPRDJJRT9EQj4vPD8+QEE6OERDQkNFSElLTU5QU1ZZXl9fYF9eXl5eX19fXVxTTVBHVU5BPz89NjQ2ODI3NiomJSMpKiYuKyopMTAfOSojPklbTCojQlAvI0ZbM1BZL1VBQjsvOJajucO0sK/AqaiUo6+psK6tprK0r6mlpqaxq5+rmJqin5yaqqeinayipailpLSknaKTpq2ruLOnr6KRkZmdpZKRoKGYm5+dh6espKutwMCxoamvqZeRnp2hmaKjqqOToKGdna2uqayno6OnoaWlna2pkqSaqK2pm5ypnKyhlpallaGil5x/zpR4eqSBeJSWm1+uj16Op4GioHynlpt0q4KAr15jjap6p4eFoHSXk4izY4KrhqGNjbNqhK90fZeIuGGDrVmjzW2QdXvae3+ZcH6HknZ+ZXuIdnZrfIhvfoWRkn5tgo9gcmxwZ2BfeWRccWhqY2ZgUlRSV11LT0M1QUhFRDg+NjtAP0E7PThAPj8/QkRERklKTE5QUk9TXF5fX15dXV9gYF9fXVpXT1VKPT8+PDU1NzgxNjQoJyQhJywmJi8oJiszHTYwJDc7U0wrLC1KMCc7XDtMLSFQQEY0LjGtwsC/tbSwuJedkaSqqK2zq6WyrKyrpKumsKqgp5uZpZecoq+foJ+op6OloZ6wrJudlaeurbGqqKyglJKbn6WTj5+lmJ2no56upKuwqMDGs6ipsa6Wkp2boZefqaqflaCfnJ2tr6erqZynqKSiq5Oss5eloqqpnaOmpaGwoJKZppmgmpSUkZegcYWMl3SEqIdxsXydcax+oZ6BpY+ed6qCfa1/nHKtfquHhp92mJJ6fJd+qoiijJGMnX6re4mUj5+Ae61WnMR6j2+SwX2BlW11b4xtZXZlhm9hd25yb4qLkpCDbZKQZnB1dXBgZ21lX29paW5nY1dTXGFZUlNDOElJQEQ8PjxARkRDRUE9PDw8PkBAQUJFRkdFQENJU1dZWlxdXl5cXl9hX15eXVtaUkM+OzkxNDc4NDUyJiMfHCAxJyAxJyAnNB41LSY3PVdKLTwnPjEpM1ZARiEcRzpDMS4rsNTGxrK0oJ2jjqOjoqyvtq6osaaoqqetq6unoqOdmaKVoKWqn6GloKioop+dr6yYmpaop6+sqKapnpeUmqOikZShrZudpqOvrKOstKq5zbKtpq2slpWcnaKYnq6snZagmZ2fqbKpqqqbrKuko6ybr7GiqKuupZilqqmpsaKSlqOkmpSShaRqpHWJeql0erJwgqaKmYxxiKCah6RgYFKrhH+ug5t2roGmhoafepmWhntmgKOJpJmGgqR9qX+ClYeuXn2pVZ2ikoF6op+Ae8OvxYtyr7OzuXFiqa/CdGiNjJiPgW2alHBueXh4b2xmZWVxcGZ8aWJdV2BpWFhVTExRTENDQUI7Q0BAQkk8PTo5Ojw9Pj4/QT04NjtETFBSVFZYW15eXVxeYGFgX15dXF1bU0lCNjc5OTY2NCwmJCIgKCciKy0iJC4hMy0mQERXSCxHKzU2KjFQS0wjIEE5RDQsJ8PJ1tW/oZmrp6Gvop6wtLCvqa2ip6aqq6uppKagm6SenaanpqOcq5qirKGkn6+inZuTqqS1sK+gqZudlpSmo5CaoqigoKWcsKakqLGtt8iytaqrqZWRnZyimJ+ls52aoJScn6esrKSumq2qo6KqorOuoqqzsaGaqaiur7aikpaip5ibkXyqbJ6Eh3WreXywb4Kki4mflpaflIHSuLS4yYCBsl9flKmDo4iHoHqYlZp4qsl0maSVqKqRk5qMgJuKmcbGeGahgqVzgZ+Ogn2vXXC0YrB1S6OGbadHgpNkj5Ceknxxl5OAcXt1fntuW2ZqcnBlgWpfYVhkbVxeWUlOTEtFREFCPkE8Qj9KOzc5Nzk5Ojs7OzMuNjxBRklMTU9RU1daW1tbXV5fXl9fXlxcXFxcWE1CNzU2ODUvKSglJiUkJiksNEVOUFBNRktKVkYqTDAvPS01T1RRHRw7PEYyLCSnpMDGuK2ps62spaKcsrmsqqGmmqilqquqp6CmpZiqo5+vq52moKyanqmlnae1n6KXk6mqtrKsnKWcoJWQpayRmZyno6Cppq6hpKepsLXCsrOqraiTiZedpJqho66mmKGVmJylpqubsJ2uqKafrKS3rKCxua+dm66nsrOzpJSXp6KZn46CnU54moF/n3qDo32DpISGpp6cnpOEuHt8ebmCfszGwrZ4m6GRi59+mpaWinaemIqkmKSpf7CFnYWfhKx9mpRipWykcI+FkIF9loJyrGCjc3GAmmC8fVJVdY+SpJd7fpOSi3V7c4V/cVxtbnhyaoFvW2RfaG5iZF1LTFFUQUlIRkk6OUs+QjEwODg2Njg3Ny0qNT09P0JER0lMTlBUVlhZWltcX19eXV9fXFpaWllVU09IQDg4Mi4sKi4rKicmP1FUVldXV1lYWFdVT1VGPEUzOlBbVBwbNj9ILC0gi4eZqaukq7mqr6Cboayzs6WfoJWlrq2uqqedpqaao6ehs66iqaayoJmppJSjtqKilZeiqbW5o5uinaKTkKGxmZ6cp6Whoq+unaSoorayxLGtqa2pkYeQnKecoqScpZeemJmapqSpmq+irqWmmK+lvK2htretnZ21srixs6aXna+go52Fj9G1w7d5h46FkZOQgaZ4lKF3jKCRhKWBinGqhoS0bnJqmaOblYqefJiZhoePc6+CpZuijqaLk52KlZCabXCyXKVzk3qcbJl/e5l8balho3Fxf59ic7K4aHiQlKaYfYyNlI14fXmPgm1peGl5cm6AdV1lZG5tZmdgSltYWDxIR0BVM0BGPjwqKDYzLjAxMykmNDo7PD0+QENFSUtOUFJUVldXWV1fX15eX19dW1paWFVSUlFGOjIyMzAvKysoQFFSVFVUU1RWV1dYWFdVVVZUUU9RW1UlITJBSCQpJZNzjYqtv7+7urSelqekrbWhopmVo6inrqusmaain6agoLWnoqmnsKOUrKOOpK6jnZCamqq0tKSdpJyokZSXrqCgnaeknaectZqhqqS2rMOwqaupoYyEjpyhoKailZqanJibmaakppisqK6jpZutpr6slL2wrJ+isLO5q7Smmqixo6eXeqiQfXywd4qBpKWInG2yb6CHrXyhjoOnlZiArIiFroWflKmgoZeGn4CZlYB7kn6rgJ2alouqeJ2fkImTkoB5r12jgX2mp2SdgHyXc2qvXaVrcIWZXWBbjKBtlZKmmYKVjpiNe3uEmH9rbX9jfnRugHpgZ2VxbmhnZ0NaYVs+S1QzVThCQkM3JCQzKycnMywgLzY2NzQzNTlAQ0ZJS01OUVNTU1ZaXV9hYGFhYV1dW1pYU1BPTkk4MDUyLiosQVRWVlZUVFVVVVVUVFVUU1RWV1dYVlVVUUhGSUojKCi9kpqDqcbCtsGzn5qsoK64paOOm6Sjn7Cvqp+kn52tmZ65oKOroK+pmq6hkKuppJaJmpCusaymn6aarJeYj6yhoZ2loZqlna2YoKimtqnAr6WppJ+LgI2bmp+mnpKUmpqUmpqlpKSaqayspKWfqqi+pJbDrKqioauyuaqup6CzrqipmHavfpCLnIWHfLquiphlsIxlla19oY+DppWagayKhLCFppmkoaGRhaBbbGqBs2B/rXt7goGxbGdvmZiMiLBbfbRbpINryKJkn4B7vFh2tFqyfVKugHqsWIChbpiQqJuLl5GYmHx5j51+ZHR+YoR4dIB8YWpncW1mZWVPVWRcQlVfPkooPjk9NCEiLCUfMi4gKjEvMDQ1Nzk6PEFDRkhKTE5QUVJUV1peYGBgYWJeX1xbWFVQTkpGQzU1My4vQFVaWFdYV1hYV1dYV1ZXV1dXWFdXWFlaWlxcWFdXR0I70p+zsre9urTCs6ObrKaltqigi5qgn5yzs6mfo6CetZigtKiqrJ2vrZ6sm5WvqKKOiJuOr6yop6Kmma6SmY+omqGdpJ+ZpKOlmZ+jqrKpva+lqJ6djn2LmpWgoJmPkZqbkpqXqJ+hmqiuqKamo6Wpu56gxqakqKGrtLWsrqaeu62srJWAqZKjr46bgIekl5iQgYC4w7qDjpyThKeWnIKsioKviKabm6WqkX7VvcKqYqO/vX1+o4KD17q4tYWUk4Oevb6Da6OBb6uEbJx/erKwx4Nqq7C9rHh3or68dIGWjqeckJuRmJ16gpGbemN9e2SOZ3mCe2BsZWtqYlBhWlNqXEBVYUJOKj06NC8eHyQeJTIgHSQoMDQ5NjY3ODo+QUNGR0pLTU5OUVRXXWFcX19hXmBbXFlUUU1IQz88QT81PVNZWFhZWVpZWlpZWFdXWFlaWllZWFlbW11dXFpWWFRXWruVs7Sxv7mxvbKina6mpbKmnYyYpb+quLKoob+mp7KcnrGcuaiera+mppSUsKyXjIObka6loqyho5yqn5iLo5KmnqecmqGoopmeoaytqrmuqKObl5J7h5mRppuTjpGYmI+Yk6iaoJipqaGqp6GjqrueqMSioK6jqrO0qrCpoLqnrq6ac3WqpLeGZYmgcGetj4qPbW93pJCZn4F1rpiUcI+LcZWoo5uXrqRybW1tZYp4b26CmXGBempxaWeJlpWYcWlphIdncIZkXYhiam9ZXGd+d6ZfYXGOkW5lZICNk4+imJmZkZiffYeQlXZmh3hpjmt5f3lkbGNmbGJLZFhKbFo6UWVFUidLOisjHCAbIiwpGBsYLTIuNTo0NTc5PD9BQkRFSEtMTU9RU1ZdV1pcYGBhXV1bVFBMSEQ9OkFCN01YWlpZWVpZWFhZWFdXVldZXV5eXVxcXF1eXV5dW1tVV16ola2zqbm5srOqqaGunqOyqZiSvrLEyb62qp7ArKyjoaisoLqjpK6sraaNl66pkIyFlZatnqaroZ6jo5+Ri6SSp5momZajqqCWnKamp6+6rKyam5OSe4SXjaWYjZGRmJSNl5WolZ+YqaObsaaeoqu5n6/Ap6Sypaywsaqtq6e3o623loqgqKW2nYmWopiHqZqQlJ2SqbOZm6OroLGWoqCdn6KcoKWhlaunjZOSjIeTnJyVkJqTmJGOlYWBpJqXlY2Lk5KKj4aEfWeJfnSCdnSHi3GnbHqUkZOSgYGOkJCPnZWhlpqYooOIlY1yaZB3cYt4d3x6amxkY29kVWBYQGpbSGNhT1orRj0rJyE3NDAuHxwhJTIoKjY5OTQ2OTs+P0FCREVKS0tNUFBRWFVWWV5gYWNcXlVRSkVEPjk9QEFTWFtcWVdYWFhYWFlYWFpbW1xeX19gXl5eX19gYGBfWVlgpZapqqW1tq6uorCjrZ+gtbGQjqzHvcW7uauipp6bpp+xqKO2p52ptKeokZisoouHiY+bp5aspaCZp56ekpWjl6iaqJmUpqGjkJqnmaG1u6irmZqQjXuBlIuglIqVkZWQkJOXpZCfmqqgnLajnqert6euwa6jtqavr7CsqamzuKCuvJmRpaSmtqKSnaafjamfjZKfo6yvm6GjsKivl6OgnKOpnp6dnJarnZKZoZuUkJaqmY2ZmZaQlp6RiaCdlZSFkoyQjZSKgH1mi4V1hnV5iINznGqFkJSTkIl9jJaSkpeUopOemKKEiZmHe3KWc3qLf3J8f2pvZF5wamFbX1luY1BgZFBaOkdHRT4yPT04LysmKykmHSY0MDY2Njg6PT0/QUFDSUpHSktMTVNTU1VaYGBpYGVVUEpBQ0I6OUVNVlteXltaXFtbW1xdXV9fXV5fX2FhYmFhYWBiYmJkYlxbY5eVpKijsLOsrqOppq2gp7WqkJCdpbS8r62toqOaep2isaSlsamXm7imo5SZqpyOhoqJnKOPrp+ilaefoZKXmJuui6qWj6iZqIyYqY+fubalppibjYh5gpOLmpOKlZKUkI2Sl6KNnZ6onp+4o4CEr7Wir691pL2jsqB3eaCqsrqUdayknomAqn9kXGJ2oI6knoSXfW6Ts52jp62qo2Wdn5JzeZmWcICYqJdsf6KnimWcpZyRl5iWjJKckYadmpCVg5KHj46SiYR3ao6GdoZwe4aBgGFph4qUkotadZWRaGiPj3N7ppqZZXmZh4N4mGqEi4NveYBrcWVfdnBsa2hcZ2ViYnBTXD5OTk5TRz5AVEQ5MS8eHyY0OjMxNjY3ODw7PkBBQUZIQkdGSUtNVFRVWV1gaGZnV1FKPERHPDhVUltgYWJgXmBfYGFhX1xdX19gYWFiY2RhYmFhZWRjaGReXWablaajoa+xrKuppamuo6etpJKWq7awsqebq6asl3SMna+fqKqnk5e5n6CPnKSdkX+JiJuejauaopWnoZ2OlpGehHWuj4immqiRl6SJnLq0qKCZmIuJdXeTjZWTipSRkJSMkJOgjpugppmcspaAjJu1nbOMko+8p6B+p6J6oq62gY6Opp6Di4aQsamvjIqWo5p5gIushpydoqepp4eVhZh3pZt6h5uBl6eCgnucsXqKhqCXmZSYloKRl5aEmpljeYeQhI6PkYqDbXCOh3mAcICBhX+GdIaElZF4lmiSdKCadH2ZhKKeh5h/k4uDhJlrjo6FbHh7cXFnZHhvamxqXGZramV0XF9JVExRQEU1LlpUVTcpITA5PT42NDM1Njg7Oj0+PkBEST9JRUpLR1NYW1lbYWFpZllRSDlFSzw+YVZeYmRlZGBhYWBiYl9dYGFhYmJiY2ZnY2JhYGVkY2djYWFonJejn6atrquorKCosaanqaWZlK7IvrGil6eptZ6PhJ2snKeioI2Qvp6ajZ+aoJB8ho6ZmIisnKGWn6CRjZOJhoCRqI2Hop2jk5eehp+6sqeem5KOhXB1kImUkIqUj4+bi5CSn5KXoKSWnquHn7SJtJqtisqHqq6It4WMr4KwroOpjaWYjZ19qI9ye3ecj6eWaJWkebSMn56mqJKYwoF/q4iYoXKegJqlfZeFlbGAoX2hk6CQmJeBjpObipiRi3yFk4aNlJKJg21ykIV/eXGGgYR8hHWEgZaAj8Vmf6mHj6NrnoOjm4SagY6OhoqZcY6ThWh3dHx3aGh1cWhoa15kcG1nbVhnR11STTJFNDZOYWM3JjM8RUdEOjY0NjU4Ozg+PT0/Qk0/TklKTENQWl1cV2Feam1cUUU9TE1ASmRYXWNmaGdiYmJiY2NgX2JhYmNjY2VpaWNiYmJlY2FmY2JiaZSXop+wp6mopqugpLixqqunmpSgo6SrpJelqrejr4Chp5ylnp2JlL2Zk42hkp6PeYSWlpGIq5mbm5mhhY+Md5ucj5+QiJ6km5WZmIejua6lmpyMjH5ibY+Lk5CNkIyNmIyRkp+PlKChmaGnfqGnh62doJatj56cnZGFgKCNq66Go42pmYyaf6N1gJmUa4KsdU2reIeNnJGbqKeAqat9g6F7eqdpnn+Sa2eXhpe2iZ5+bmBkWYOXf4x7ZGiLcpl9eZVsXXuWbV9TcINcX2t5g2BZZYJ9g4CXcKeqa4OjbnKlcJ+FoGlmoG1bbop8Zlpgg39iV1Bvd2ZtdHJram9ea3BtbGlYaU9dWEY5QTRHRF5rNCxJQ1JNTj04NDg1OTs2QDs7PkJPPlFSTE1CSlxdX1deXmN2YE1EOk1PTVRiXFxmZmlpYmJkYmRkYmFiYGJkY2FjaWtkYmRkZ2RiZ2VhY2iXlp2guKCqpKaskaG1vKyuopmYoKKlrK6hna61oqiSoaCfppuZjZi0mZCLn4yVi3WBlJKNiqaWlZienn+ShYaspIebkIqYqZiZmpKIprGnopaaiImAaW6IiIuOjoqLjZKLkJKijJSeoJyhpH+TgY+joZSgd5yWj6eDoad/hqmshKV4inyEmn6icHOUiJZ7nox5bYebjJmQm6iaj4ede4Kic3amZp5+d6RfmHp9knOibpi3tLp0k4eCf7WoZIHGuHtwlbeLcYCapGJzrKtgfWmds35ufIaCjYKLmHF/o2xyo3SehICjYJ2Zs5ZxfJefs3RzW56yg2pib3R2cWlvWGtscnJmXWleYktFPUQ2UUFZcTM9U0dfSlI9PDM5NTo6NkQ7O0BKUD9VTU5RQEVfXltZWGBgfGRIQzhMV1VWY2FaZWZra2JiZWFkY2BhYmBkZF9gY2tuY2NkZGhkYmdmY2holJaVo7iZq5yToI2kt7WuraCbop2jo6aunJuxrayTmKGZoaSZmpSeq5uLiJJ4i4VxgJaNiY+hkJKUnZd9kImOqKCHmI6KkaOTnJuNi6mopZ6Ql4eFfmt7h359j42Di5CQiY+UoIOXnqCdoJ6LiXecmKKMn3Khi4eoiJulj5anqn6tjH56oJl6o5N4gXSWiI2cfZWfhpuOmZumhqJkoXyIlpCbjWyeaJqNbpqZe4CLp31yaHSrg56DdKpolZpdm4V2hJ1oqmqAuGZcqHCBnGCVjF6ndnWHiX6eaJp1hpOSl45/n26akG2nml2ofni7a36qW46EXbNnXG5yenhraVxxanh5Y2BmWGJBUUVPN1ZDUm81S1paX09aREAxNTE7OzZIPzpDSFU+WVJZXT5EYl5WYFFhY31qRUI5TltdWWVmWGZnbm1iYmVfYWFfX2BgZWNeYmRvcV9kZWVrZWNpaGdraZWciaq1m6eIY5Sbq7qysKydppycqZ+erpuesKisnZekmqGfmJaWoKOZhomNaoiAcnuXiIuWloSRlJiPeoqElqOdipSPhouekp2diZCpo6CajJKKgIBpgIZ4f5eMe4iOjoiPlpp/lKKfoKGTmHJon4qfj4xwkoyBqYeYnqKnn6d8r62joriXd6OzoqSAiJR5nXuqmn+ijp2bl4iXcaF8hY2vtX1rmpGheH6YtKOjq6iEmXybfZ2af3SqWl1ve5aLeJ5iTH56eoVjeZdCTJ5ZompyfI5tgIiEmXWbeIaJsbN/f5uTp3aCnW5zfZRvmXNrpF2VdkhlZGFzcX5+bmZgbGl2e2RlYlJeV11VV0BaRlFoRFNXXGJYXklEPUI4P0I6SUY4TEVYQVdRW1ZERmJcWmBLYG1+ckVDPFVfYlpmalZnaG1vYmZnXmFhXF1eYWhiX2VjdmxeZWdma2RmbGloa2mTnIGwrZmEVF6gprO5s7OpmqKMnKucnKmUoqukoaiPn56dmpmVmKGdloiHiXeGgW95lYWQm4t8kZOWiHJ/iJKhm3ORkIGJmZWgm4WOqZyalYuLinyDbISFcYGhjHiFjYiIk5iVfJOjoJ6jiK2GfbWEjp6ce6WWeqmBlZyPiqCcfKdod21+mXShc3F8noaZcJODrn2kg6aemYCjb16oZ3WiY2+lYZzTkHx7mXhyc2OihpB+o3Okj3ZrkLOMYIKYiXOqsqi8f3eDbX6+pqm0XpxufXGXbn9yonJdpGdzpmFopm2b1Jl9hZtwenqXa5t8eJdzbqmkZ2FleXCAhGtnZmRudXdnYGNUW2ZRUWJJV0pUYFdTW2VqXGVRRkNLTUpLQktFOE9AUU5YUllPU1FhZmVqUmN3eXdJRkVjXWVaaGlUaWhqb2NqZ2BjYFxdXV9oYmFoZXxkXmRnZGtkam1naGxol5t/sKtUXEt+qa+xtLCzo5uZhZmpoKCkjqWooJipipmYmJOZk5KgmI6HhntwfYRofY+DlJqBd5COj4lvf4aPkpJsl5N8iZGSpJaDjqqak5KLhYl6g3aHgG6Bn4Z4gJKGh5mil3uUo6San4mzoaK2i3qsp6SupXCogJqQhYCbkXukgKGZhphynoSjrq+Kl4x/jKSNlYOtoZR2tLW1yaFzlIqBn2Cdl6lteZWGoJt1oYd3oH6Sl4uBb0xmo5Jwm4dypHt6dGGDgWt+oGtxZF+ccX10l2l6abO1tMamc5h+ep1rnJurdYSbbXV4mGmaenWYclBFfbReanZreYdmamhidHVwblZeVFlpUFNoSVZNWVNWXWhrblZnV01LQUlNS0hKT0FRS1BlY2ltZXVzc395fG51iXt7VFBObF5oW2tpUmpoaWxnbGZjZV9cXVxeaWJkaWt7X11kaGNqZm9tZWlsZaGciK+mhGY/lKGzq6+vtqKikICYqqKipYylp52dpoKal5aNl5CPnJOOiIN5anmGZYOMf5egeXWOiIyBaYSFkoKMhZ2NeoyLlaaTg5epmIyRi4GJeoB9i3lwkKGGeYGVh4mWoJV/lKWnnJaWhGZueJxsomR8caV3m5hwZ6aAlot7pHqfloOXcp52gYqUlo+5bpCKomJ9maGViG1yaatqdaBtbqZfmmmLkGiWh5qVdaKAfZpgjIaNdW+IYmigZZ5+aZp1b2NmiIJtcqJaX1tioW1diYxve35zcmSlbXeiZGenaJlzjJlvom9TiZBvoF9lqFSLXlSYbm1za3KCbXBpa3lza29SWVdXZ1pUbUlZT11IWGlpc2pZa1ZRUkVWXExYU2FVaWtfd3R6fXB9fHKDe39zdo2AhHZeUXJiZ2JwZ1BqaGhrbG5oZGdfXV5dYGtiaml2dV1cY2ljampzbGZrbWOcpJimemV0bYunrqSpsLGmn4uAmKudn6aMoqGboqKAlpiTjZqPi5iQjop7hnGAiGiLi3yYm3N0iX2Qe2SCh5WKiZaZgnyIh5aokYGirJGGkIqCin6AgI5zaY+lhH2GlI2ImKCOiJOqpp2JpniVm36liJaMspiekIKvl5+ld5SHeal0pI6Emm6kooyShIyDu259pa+DhoaGk5Wcn3ylenGolaCWZp5+b6tjloqVkniobKmigYl2iIN3qpGmh2qRsGt2s4ypa4qGbW2fnpKVYH6ri6p2fn+MpZ52n32EpJWdoGqbiHesZ5+tjLZ0d76NpJNZg6aNq2F1cnRwfHVxY2p+bmhsU1dbVmFiXWtNXVJdSV5ubnZgW3FZW2BaZ3Rlbm9xYnF0YHd6fnlyeYNzhH+Be3uMgYKAdmJ4ZGNtc2RSa2dob2xyamZpYV9eXGJrYm1sem9cXGJpYmxqd21nbG5ilaWqnYGAnqSWqaqdqKeupJmJg5irmp6kiZulnamdhYyajoackYWSjYyNdIZ6iIRvjYR+mJN0dIZykoNtf4uSh4aTj317goWYpo5/paaOgY6JhZV2goeSb2yLqYCDi5SOiZyfiYyUqqOgj4B1lJaIfoF5lK6jf4GbcY+FeI+Kg357cqaMcX19epeWm4SOeHt+foeUlZOKdpCYn6CDen2Ja4yFW3l4cnpwaG5+kolxf3WBj5STcYaEgmWMf16Bf4t3dXOUdW95bm6HbYSFXnZoeI5lgICFjambfXR8lmqJiHCBdn2Gdm1tZ4xzeXuYeIVba1h5j2lud3JxcHh4cF1shm5pZ1ZbYFdcZWtjVWJVX1FfcHh4bGt2ZWpra3Z9cXJ0c2FvdWJ0e4F4dXmDdYCBf4F5i4WDfXttf2xkeG5eV25naHVreGppamVcYFpjaWZscXVuWltia2RsbHluaGxvYY2UuKimi6GimqakmaWcq6OhhISYrJKeoYmappqpmIOBm4p+lpOHjoqJjXKDfI99fo+Fe5eOc3KDcJWFe32Si4aGkIV4fYCGmaSOfKehi4aQkIWWg4aOmHdyhamFjpGdkIienoiMm6ifoKqDiY2Umn5+iZatqI+Spo93b5yQgnmRb32ohXB9lXFrcH2Bn4x/k46MaG1dg4uMnJuejnOVi4hxdGuBdnSAWHJuhpGBfX6Mal1qZHuFhImAYGl4ept7gouCdYGFgmd3ioZrYXBxgXZecoqBiI+mlYVljI+DbneLhHGGj3pwZmdle4N6lltcamdudlt7eXd1bnNzgmZcbYpra2JaWl9aWWxxXF9hWl5dZnR+enRvdGNra2p7fXN7eHRkbXVobXx+dnp8e3p6gIB+b4aKhHt9c355c39pVFxxaWx1b3Vna2hkXWFYa2hsa3FybVdbZW5sZ3N5b2hqbWCLi6qwoZCjoZqenpiemaijon6Dma2Nn5WInKKRpZV/e5iEfJKZiYiGh4pzfYGLdoWLgYSWinFvgHKYhoR+k4SDhoqBeoCDi5ugkIKnoYd4jpiJlYuLnJeFg3qsgpGXmZSKnp2HiKGrn6Kio4uIk5uco5mWqqGnpqCSm4eVjXt3jY6Ep35+kpGSk5yyppuVnpCNspOXhKWMjJWbn4mQm4KIkYprfI13eGWChpCLfImdhIeLkIiIgISEkHd8eXSZoYiGiZ6KhJR+fYqAgHVvc4SDf3eGhoqPppCDhY2Hg42QjH2IjIqRg3dsgoR9eplqcmhhdIpwfXp3d292dIFdXm+GaG5fXlpdXVNoclVjXFxhbGh1fHxzb3Bka2ppf3xueYBxanBwbGeBe3KCgHh/fX+Ee22CjIZ8enh8fXqDeU5kdmpybXB6ZWtlY2JgW3RmcGZycW1VXWx0bWl5enFnaWtkjIeduZ6XoqGYlZiZlJmkoZ58gJqrjp6NhqCci56WfXmUg3uOmYmGhISGbniAgHKBh36JlIRta356l4eEg5B/gIaEhn2HhI6bnZKHq5+EcouQhpORi52RfY17qoSNkpiWj5yWh4abpp+imp2Fg5GamZiQmqafpZ2dkJaAkIl2e4eOhKV7fI6QkYaYqqGdk52PjaqOkYCdjImTmp6Cjpd+ho6Db3iFcnRgf4OPhnWLmIGDj4KGhX6Fg5RteXV0kqGKi4WahISMc3+JfHxycnuHg3p4io6DkqaPhYOOgYOKiYp3homKjH1vbH6BfG5obG1nX3p/aH17dnR2dXt3XF9wfW50YGNbXV5RZ25UZFpeYmtpdnp+cWxsZGtqZ4CAbHOBbGx0b3lvhXluh4B2goB+hXZxgo2Ifnt7fH97gopgaXxqdWhpgmVqY2BpXGN1aG9idG1sVWNxeWVwenpzZWptbIuJnreaoaSfkpGWmIuan5+ee3iep5GcioellIuYmXl6jIV8iZGDjIKCgm57f3hzgYV9i5F9a2h9gpiJgYiOfH2GhId9j4GQm5uRiaicgHCMi4yTh6GiioWMfKiRiJCSl5OWk3iMo6CgnZaZf4CQmpiSjJqjoaOZl5Gbfo2FeICDjoagf36MjI98mKSgoZOZkI+mjY+CmpGJk5ebfpOSfoeOgXR0gnB2YH6AjYZxipV8iIxxjH+ChYaOZ3dxeIuYkY9+l32HinKBhnt8cXh6ioR6eZCMgpWlk4uFkHuFhoeFdoKEiYh7ZnJ8f3l7cWxqZl9+c2h8dXZzfHOAal5gc3Zwd2RjWV9eUmtpVGRZX2FoanZ5gXFma2RsaGWAgWttfmhvcWt9eIZ6a4yBc4GBfoF0doKNhn58en+BfX+PanKDbnNpYodobGJfcVZ0b21uYHhobVdqdHZjdXp7cmJqb3mJjZ6ykaSlnY6QmI+GnaCbnXx2paGOmICMooqImpZ4e4aHfoOJf4iCgX9xf3t0doKFfoqReGdjfYaXioKKjHh9gI2DeZaBlZiWjZagm35wjIKRlIamm4eNiYOmlYWTi5aXk5J3kZ2hoZeTlnl+jpiXjpaanaSdmJKUm3mPhYJ3hJaNnX6BiY2McpejnqGTmY6PooyLg5aYg5KVmX+YjHyIjYB2cX1uemSAfIqFcIaTf5CCbIeCgYCJhGV1b3uGkpeMfJN3ioh7gIV8e3F+d4iFeYSPiYqXopWBg4t3iISDgnd8goqGd2B5eH10f3hnbGVhf2lqd3N0dX1xfGJjYXNudHJtYVphXltsZVJjWGBhaWt2eYZxY2pjbWVofYNsaHVobG9pgHyBeW2QhnGAhIN/dHyDjIGAfnqCg358kG12iXR0bWWKbGpiY3VWhGlxbmB4Z2xianZwZnl8eXFfcWyGhY+crpemqJ6NjZeHhp+Tl5l9eKqcipl6l52LjJiQeXuAi318g3yAgoF4dHl6dH2AhH+Ji4BkXn2LlYd/hYd0fX6Kf32YhJeUl4ykoph/c4d7lJKKp4+MjoqSoJGDkZCUl5GLgY+Yn5qSkJBzf42SlImdnZ6mmJiNlZZzjY6Ka4WXj5l6h4iQiW+XnZqjk5WKjZ6MhoKSnH+SkpWHmYh8iomBeXF5a3VsfH6Lfm2FkoKUeHCCg31+in9kcml7gJaXhH6Nc4+Ig3iGfXZ3f3yFgHyCjISMlKSPeISCdImHfYB0doGJhG9he3V6cX1vYm9jZHtibm92c3h3c3RhdWBvbHVub1xcX15ea15QXVhjYWhtdHuIa19qZmpjaHeIbmZsaGpsaIF8endukIhzgYSEfXSBhol6g316gYR9fY5yeot4eG5sh2poX2lyYodocW9ldmdubGF5aWt9e3hwYXdti4CZmaqgo6ieioqRhoqei5WYfneumY2XfZ+TkZaUiHd9e4p8e4B2eH+AcHR0e2+FfYGAin98YVt+j5KGgISEc3qAh3qPkoiSkZyTpZyVgn2CfY6LkqSJjoqNl5qNhZGYk5aPioiMkpyTj4uMboOPj5GInpmioZeWiZaQboiZg2aFmI6TeoiEkIpwlZqUopKSiYuZjIJ/kJ59ko+SjJmOe4qEh3NydWtwbnV7i3RuhpCOknF1gHuBgYh8ZHBseH2Zk32EiHSQioBzh3luf32AhXuFi4iEjJWojHqHfH6LhXh+cXCBhoRjaHl0dXB8Yl9wYWt0XnBqe3l4bHNwZXhdbmxzbXNYWl9fYmtaUFdYZWNncXF+h2ZdaWhnYmdxjW5kaWdkaWiAend1b46FdIGCg3t1goiFd4V8eIOFeoCJd3+Le3pyeINqa19waHSAanJvbXFnb2xlfGNugHp3cWx3d4p+opehqKCmm4eMioGQnYeTnXWBqpWTjoehjZWTkIB0e3aFeHl/cnN7hWtycHptinaAgYducVtYfpGNiICAgHZ1gIB/oIaRi5KdmKGVmHiKgIGNiZyeio+GkpeWhYmVmY+Wi4uNjYydio2Pg22Ji5CQip2WoZyYlIWYh2qEo4JmhZ2KkH6Lg4uBd5OYkZ6RkImJlY1/fo+YfJGNj46akXyKgIJudXBsbW9we4Vpc4OOmIpxd4B1goiCeGZybnWBmY57iIR6k5F5dodzb4h7hYt6ioWCiI6bo4d7g3WBi394eG9sgYSCXnJ0cnBweFpecGBwal5van16cG1tamx2YHBvanFtWlhhYWJuWFFTWmZnY3VvhIJiXWttZGJma5JuYGZmX2drgXVxc3CLgHV/g4B4dYCLgHiFf3eHhneDhXyHjH97dop/anFjfGOGfG5xbHRqaG9sdnhfcX95fHR1dICCfqSVmq2eppaFjYR/l5SDkKB1i6CUk4aLm4yVjot6cnh0gnByhXNxdYhrb211bYh2g36AbW5VUYGrlYeCeIB3coJ6gqCCkoKTk5ick5p4knuDjZOkmpOOiZWYkoSGl5mMlIuJj4+InoSPinxyi4WJjoicmp+alpR/k35ohZyHZ4Wgh5KEkYKJcYORl4+bjo+MjI+NeHuSkHqOi4yRlox8iHyAa3ZqbmtsbHt+YXp+jpaCd3qAeIOMfHlnc2xzh5WKfoiGe5OPcXmDb3aMeomLeoh9gYuQnp2EfHt3got9d3FqbIKDemB4cG5scnRWXm9icmBfbG55cGhvZmZzdGhwa2F3ZV1WZmBgclNRTlxmZV55cIh8X1xocmJiZWaSal9oZFtncH5wa3F0in12fIWAdHV+jHl7hoF4iINzhoV+jY2De3mVeGZyaoNgiH1vb2t6YGpudH91X3R9eIZ4dHOFfHigj5mxnKWOgop/g5qHgIyef4uak46FiJeOjo+EdnR2c4Bwb4VzcHGDb2ppdm6Dbn19bXVzUk2C38iS1pN8cHWDdoOfg5N3lJGZnJCZe5RzhZCfoZOTkIqSm5OGfpaWiI2NiJGMiJx+joB3eox+iIyKnJydm5WTeo11Z4iRhmyIooSRiJeChWOMkZmOlYqXi42Ki3F6lIh7joiKk5GJeYV8fmx7ZXJva2t5eVyAeZCOgHt9fn+Gjnp6aHJqc4qPiYGFhHyUimt9fm5/i36Lh3yEeYGPlZqZinx2eIOQeHNtZ3GAhG1qdG9oanRuU15vZHBZX2txd2ZramJmeHJvcGNfd2BgVmtfXnZQTkthZ2NdenCJdFxcZXZgYWVljmNhZmJYaXNzbWpxdox9dHmGgnV2fotzgIZ/eol+comHgZGLiHx+mHZlc259ZYh+b3BrgFpsbnl5c2F2enuNdnJ3ind5noubr5ugkIKFd4iVfn2KnYeFoJGPhYyYhJKOh4F0d3B5cW6Eb21ufnJkZXhwfW16fWpoa2OkmsHcru+hc2x2hHaEooWSb5aRlaCVnIGScoWLo5eJjpWKkJ2Wg4CVkIWJj4CRiomWfod6dX+JeIaEjZybmJmOj3aKdm6FiIp9iqOEkYmchIVei5OXio6JjoqKhIlte5aBfYiFiZGPhnaFfX1rfWR4dWlueHNYiHqSh4V5foCAhYx+eGVyaX+JjomCgn+LloVrgXVth5CBj4R+gnp/kJWTmI91c3eIjXVzcWd1eoNidG1wYml2Z1JhcWdsVV9udHlhcmRfaH1wcm5aY3JhYlduWVx4Tk1MZGdiXndziW1cXGR5XmBkZYVgY2NeWWpya25rcneMfnR3hIF4d3uJcYOEfX6Ie3SLiYeWhox+fpdzaHVxeW2Lem50cIBXcXp2eXFld3mGjGh2gIlyf5yHmaeco5KFfXCMlHh5i52EhaGNjnyWjX+aiIR7cndwc2pvgWtpbXx1XmF4d3txdXtnYGR869q1ycPciHNsdIF2ipqJjmqYkI+dlpOBiXGFiaCNhIuVioyYk3yNk4iDiY97kIuFj4F/dniDhHKHgpObl5SXhox1h39whIGJhpihgpOMnoKJYYOUj4aJhomNh4GHan2UgH2DhImOjYJxhn5/cXdodnJpc3dsWox8koOFfX+DgISKgnVhc2uIgY+KgX5+kZB9bYFreIWOhZGDfIF8f5GSkJaIbnF6jIZ1bHFscnmBYHRpbl1rdmBSZXFpZlNgcHZ0YG9gXWiCcXNpV2doYmlYbVZbdUxLTGZnX2Jyc4VpW1xleV5eZGd7YGRfXVlrbmZvaXN4in5zc4F+enZ6iHOFg3yAh3Z3ioaOmYGMgnuTdWx3dXl4k3RueHt8WHqGcYBvZ3h3koJjdoaFcYqWhZmhmqKKh3Nvk4tyd46cfYqaiYl8n3+DmX+BeHFzbm9kcn5oZmx3eFtfeXt7cXGAamFnYX/Vto6QpnhucXd8cZKRjYdqmY6JnJKMhntph4uZhoGSkYaHmI18jY2BgYmNe4+NfYiEenR6gnpwhoCWmo6TlIGIdYOFdYN/ipKcnoaVj59+iGF/k4eEiISJjYCAg2d9kYB+f4KMjpB+bYJ8gnRrbXd0c3Z1a2ONgY9/hX58hH+EiH5vX3JwhHuOjIF8fpCIeXCDZnmCioaLgnuEfX+Tjo+Sg25veYx+dW1va2x7fmNoa2pZbnZaU2lyaWJRYnJ3bGJlXlpqg21zYltnX2RsX25UW3BOSE9nZVxnbnGAbFtbY3NgXGNsd2RlXV1aa2xibWp0d4Z/cXB/fH10eIZ4hYJ9f4d1eYmBkpZ8iIZ2iYFwd3l7hJNvbXyBd16Df3SBbWl6dJRzZ3OHfHKSkYOan5ughoh2dpV+bXaUl36IkYSKjpp8jJp2fXZxb2xqYXV8ZmJpdXpaX3d8em1xf2VkaGdXnY9ecXOWvMSEdnGUiZB+c5iMhp2TjIh0a4iPlYB7lIuBhJuMfIqGfXyJjH+UiHWJhXV2fYFxdYaBnpWGlY+CgnJ/h3SDe4mXnJeGk42cgIhlfZKCf4WDiYlygX1nfYt7eX9/h4uPfWmAfYN2Zm94eHN2c2xqjYWKgYp/eYKAhIN/al5xd3p9jImFe4CPf35ygGh4goaKhYN4g3yAl4yPjH1ubHqJfXd0b2lofXdlXXFjWHBzU1RucmliTmd0eGZgXVxYboBvc1llYl1qbWBwT1lsUkRUaGFaa25te29aW15sY1pjb3ZkZ1xdYGtqY2xpc3aBg3Fufnt/dHWDeoOCfIGFdn6JgZaReIOKdIGIcnl5f46Qb298gXFpgXl6fm1tfHaVa2p4hHRrlI2Fn5igmoWIbn2Mdmp4mI9/goqClZiKeY+Wb3pzcGxqZGB0emhfZXJ7WmFyfHlmcHphZWWOsbJ3SmJapNnQl3J7kYuReH6Vi4WZkY2GcGyGkpF6eZKGgYSZinyHf3h4iYqEloBviodxdH16aXmFg6WRhJONg39vfoJ2gniFmpiTipOPlIWHb3qSg32Dg4mDb4F4aICFeHJ/f4OKh3xlfX6DdWNwcoBoeHFvdZiNhYKKe3Z4gIR5gWpbcHxygIeFiH2FiHqIcoBtcIOGjoODcoN4gJiMjYR3bW5+hH93emVoan1yYFl3WllybU5YcnNmYEptdnRhXVtbWXR9cm9XZ11manBfb05XaVI/WWdfW3BqZ3lxXFpZa2VZY3B5X2hdXmVsaGZsaXF3f4dvbX99gHVwgXp/gX+Cf3aBhYmXinGCjXF7hnx6eoSUjHVqen9rb350f31vcnx7lHBvgH94ZpKKgqGYnJKChWeHhHBoepeJfn+FgpmKgXyNjGl4cmtsZl9hb3ltX2JveVxkbIN6YXF2X2Vl1eu+izI6PouOgHJ5hYiOjXaEl41/k46Nf25shY2MdX2Pf4WBlYh8g3hudoeEgpZ3boiEbHV7dGZ5goOnjIOPjIN9bn90doJ5hZuPi4+RkoyLhn57kod4gISNg2yAcml/fnhtfHuBioN4YXmEgXFkcWh+bXRxdIGbi4B/hX5zdX2Ac4BvW2t9dHiJgop7hn98iHh5cGuIgo+DiXKBeH+Wiop+dG1qdoCAdXVcaWl4cVlXfVNacWVMW3JyZVtKcHdvXVtaWV10fnRoWWJbZ2VuYmlNV2ZRPV5mXV12Zl90cFtZVW9kWmRweVpoXmBnbWdpbGlweH2ObGqChH95boB7fYB/gnp1goGMk4VwgItud36Ae3uIk4l/aHt+a3R7coZ7c3d9f4x6eIR+fGuMjIObnZaMgYBsjX5raX+PjXt+f4OUgn99iohrdXFnaGNbYmdzb19hbHNhaHCJemFzdF5jZJugkG5cNVmvtXVqgIl9koZ2hpeGdI+MindwbIWDh3R5iXiJfJOIen5yZ3aIfn2Xb3CGfWh2eW1leYiEpYeBh42Kfm19dn+AfIuYhoGTkJeIi4SJfI+IcXt9hXxpfm1qgHt6anp2goeAcmB3gX5xZHJndYJtdXuFlZGBfIJ/b3d5fHR+bVdtfnZzi4GGd4d1gYl5eHJtiICPgIRyfn19koiIem5taW2CgXVuXWhmdHJSW3tOXHFcT1xyb2RWS3N4aldZWVphcYB0YF1dYGZkaGhmTlpoTkFhZFtgdmFcdW1YWFN0YVpkbnJXal5iaGtnbWxpcHd8kmxphIp9fXB+fnuBf4J6d4CAiYuEcnuHb3F3g397io2Pg2p+e254eXaKd314gIKHf4N/fnpthYyImKONhIN7dox5a22EiZJ5fXuCkYCAfYqDcHFwY2ZeWWdfcHBgYGdwZmpvinVhdG9bYWRpdnt/vpymo8i4coWDc5R9eIeUg3SQjIhycnCEe4NzdYZ0iHeUiHl5cWN3hnmAkmhyhHVmd3ZjanyDiJ6CgH+Ojn1xfnOEeH+Rj4J3lY2Uj4eCiHqJiWt4eX51aHppa395c2l6doCDfWhgd4d+ampzaHuAaXaBjJCUfnp+fnF7dnt0fWFVdXxycomDgnyCcIaJd3hwb4KCi359eH18dY2Fg3ZocWhsiIJycF1oY3RuS2V2TF5vVVRZc21iUU90eGFSV1hcYXCCc1tgXGhlZGNqZFBbcUlEZGFcZHFeXHdoVVdWd15cZW5oVmxeYWpnZW9vaHB3e5NuaYiLeX5ye355goGCfHZ9g4iGg3B2g3Jtd4KDfomLlH9wgHx4eXqBi3SDeH+BgYKEeYB2b36Ji5ueiH2GeneHfGh0ho2Ren9/fImGhHaPgGdvbV9kXFhlWW1zYWBhcWxsaIluYHNpWV5kbYB3qdqqx4aHsnKKeHCNdXuHj4B6k4qAdXR1fneAb3F+bYV0lIZ4dGxgeoF5iI5lcYNvZ3VuW219gZCTgIF5kpJ9d3pthnV/kIuDc5WKkI6HhYV7f4VtdXZ/bmh3ZW18dm1qdnZ/f3xhYniGemh1dWN+emd0ho6MlXt0gHVxgHp8bH9ZVXJ9b3SDhn5/eGuIhnN4anR/g4N9enx4e3KKgHxzZ3NlbYuEbXRbal92ZUhub0xbYldXVnhtYlBTdHZYUFVYXmBxhG9cYGNtZGNebmJUXXJHQ2ZfXWZoXlp7YlJWXHVbW2drYVZrX2FuZmZscWhwdniOdGuOjXV/dnh9d4GDgXt0fYOIiINvcX90cXV+hoKJjYp7d394hHx9hYd4h3x9gX6EgHt+c3Z5jI6fjIl6iXd1g3lefoaajXmHg3SGhoR3iXtibmxbYltbYVZqdGNgW2hvcGeHcmFxZlddY2t/fMrOh7mia21ui21yhXJ9hYp/e5KFenl0eXV0emptdWOEdpKCd3BnXnyBeYuJZXGBampxY1hse4aciYOCc5eUd357bYdwgImKhnCWjpCIhYuDenl+cXFvfWdocmJteHJqbHF3fXx6XWV5gHdpdXhmgnZndIeMjZR8codpbn6AeW18XVdwfW1zf4p7gW5uiX9wdmd2foB+gXV7cXp0hnt5cWVyYW6MgmxzWGtfeFxJb2xNV1ZeVFV7a2FPVHVyUVFUVl5idIVoXGBramZiWW5hWGJwR0FoXWBmXl1We15PVmRwWltqaF1XZ2BfcmZqaHJncHN3hnhulYp0f3p3fnmDh4B1c3+GhY6CcHB7d3d1eYeFh4yGenx/dYt+fYaEhId/fn59h398eHV5d5GTn36MfYtudYB5ZIOIl4Z0kopvhYWCeoN0Y25qWV9bXV1UZ3NlYFlkcnJngXNia2RXW2Bpf3i+rnuft25ic4dodHxyeoOGe32NgHh4c3Zve3Zlam5hh3WOgXNqYl5+eHmKg2ZxfWhqa1pWb3iKo4GFf3GZk3GAeHSBbX+BkIZylIeMh4OIhX15dHJvaHlham1gbXZrZ2trend6d1tnfXx4ZXN9boR0ZXWGjYaVfnCLZmt6g3RsdGJbbntrdHyLeoFmdIZ9bXBndH53fX5xe2t6e4F5d3BlbGFtiX5tblZrYHdWS2tsT1JPaE5ZfGdiTlV1a01QVFVeZ3aDZl1hcGhnYFdpXVxraEpFalpiZFdZVXlaTldualldbGVcWWVjXnRmbGRyZ3JwdIB4cJmFdn9+eH98hYd9dXOCh4CVgm5zeHp6c3OFh4iIhHmBfXaPf3yEiY6DgYN7fouDe3d8d3eZnZd6ioOHaXZ+fGyEhZSAco+CcYaCfoJ/b2ZsZ1ddW1xbU2RwZV9YY3J1aXZwZWViV1xcaIBwb3KAc4llZXl/anR2c3ODhXiBhHp3dHVuanpwYmdrZ4Z0jYRuZl5ffG97iX5obHdmaWRVV3Jwjad8hHx2lpBzfHJ7eW16epCEdpd7h4aChoN9dXBybWd1XW1oX2x1ZGdmaXpve3JZZ4F2dWdwgHiCdWF3hYt8lIBui2pteoBwZXJlYGx5ZnJ2iXt9YXWDdmlrcXR6cHl4cnxmfn5+eHZuY2VhbYZ8bWtWamJxVExpa1BMTnBHXntmYU1VdGRKTlNXYWp3fmVdZ3NpZV9WY1dicF1LS2tYY2JVVFVzV0xZdmRaX2tgXFpjZV93Z21icGlzb3F+dXSZgXd/gHh/foWEen12goN+mIVucnR7enRxhYWPgoB6i3V1kYB9gZSOgIWEfH6Mhnp+gHZ7o6WKeYiGhWx1fHt1hIKMem+Fc3qFfYKDdW5qaGVWXVtbWlNjbmVbWGF0e2ppbWhfYldfWmmAaWtvgGdsYWh6eWt0dHRvhYF6f312dW56aGp5al9lbmiBd5CEZ2VYYndpfod6b2lvZmZdVVhvaI+ndoF6fJGOeHVvfm5ydHiOfneUdIWCf4WIdmpydmdob1xtZV5tc19nYWp4aHttW22Dc3Npb4B+eXdgdoSEeI+Ec4hxcHl/cWNxaFtudmRwc4h7eGFygHBnaXhzcWt3dnR2Y4N7fnd1cGNjY218fWtrVWliZ1RLbGhQR1JsRWF3ZmJNVHJdSkxUWWRrd3plX21waWRcVl9Vbm5XSlNoWGZeWE1VbFRLXHpfW19rXV1bYmVgemhsYW9vdW5vd3V6l313f4F5gH+Hhnp5eoN9gZOEcXR0fnl2dIWIkH2AfZBsc5WBe4KfhX+HfYB+hoKAint2hKyef3qIh4RscoJ5doGAgnRuhm98gHSKgGpwbWRkWF9aWlpVYmpnW1pfdYJpXm5sXGFWXFxrgWVydH1pal1sd3ZndHdyboZ7fn15dnNsemdpeGZdZHJneneSgWNjVGVvZ4KEd3ZmaGlgV1ZZaGSQp25+eICLjnpwcHxmeG55i3p2jnGDfX5/hm5kdnNkaGhdbGJdb29bZ15sdGV6aV10gG9ya3F7fnV1YXSFinqHh4B/d3J1fnRhb2xZcHJicXGEe3VkcoBsYGx6b2poend0cWWEdHl6dXFkYWRtc35qbFRpXl5VTHNjUUdXYkdjdmZhS1RwWEpLV1hna3Z6ZGVtcGZjWlhdWHZmVEpcY1hoWFlJV2VRSGJ5Wl1gbFteXGJkXoBpal9vdHhub252g5d5coGAfX+Ii4Z+dXaGeIaMfXN1dYF5enqCjI59foSJanSWgXuKnX1+hXmAen58hohzcY+tjHt7hpB+ZnGIenR9fXZyb4Zse35tj3picG9hZV5lVllZV2Nma2BdXXOGaVlxblteV1pcbHtjcXd2bWNbbXN0aHV2cW2FeX+AeXdub3RlaHRlW2d0ZnZ2kXpfXVJlZmqCgXR9YWNpXFRYXmJjkKVoeXSDhpB4bG55Z3dse4R6dIhygHh7eH9oZXZtYGZhX2pgXXRrWWVdb25iemZbeHxrbm5weHl0dGRyg5J/h4KIenZvcXxyYXdjWm5vYXBxgXxzZXGAZF5tdmljZnh6c21ugXRzfHNxYV5lbW99ZWlUaFlaVU55YFJLWllIYnRkYUlUbVNJS1pXaWxye2NsbHNjYVlaW2F2XFNLY11YaVNXSFlgTkdqdlhfYW1bW19iY12FaWhhbnh5bG9qdoGQeG2CfoCBkoiEgXZ1iXOLhnNxdnaBd3x9foyQgH6TfnB4loN9mZJ5gIB4eX5/c4iDc3CZoXt7gImVeWR1iHlzeXZrc3B/a3l8cJFyXnBvYGdibFRaWVdoY21mXFxyiWZTcm5bWVhYYGx2ZGp1ampfW210cW10dHRrhnx/gHx3b25sZGlxY1trcmR0do9zXFdUZGBxf35xglxhY11TWmBcY5OfZXJxhIOQdGtqeWxub3p6enGAd39yeXp6ZGZ1Z15iW2FoXF53aFdiXXBoYXhhW3t2amlyb3d0c3RpcIGUg4Z+hHZyanB7bWV2V1tqbWJwcoB6c2Vvfltgb3FiXmlvfGxrc31ycHhrcGBbZWtte2FnVGdVWFJRd1xTUFlSSGNzYmBHVmtRSE9aVWtra3xlbW9xYVtaWFlscFdST2ZXV2lTVEZaXE9IcnVZYGRtY1hhYGFejGpjZG15eGtvaXV5hntrg32AhZl8goR5fYdtj4Zxb3d6fHSCgn2Lj4OClnR4gpSFgZ+JdYF/gXR/gnCHgnVvopd0e4aLh3tmd4tvbnxwZnhxemxzdnONa150bmFnZWtSXVtWaGJsbFtccYxkTm9uXVZYVWdpdGhjdGVlXVpudW5wdXV6bId9gHyId5BzY2VrbmFcbm1jc3iHa1pUVmJjd3x8cIVcY19jVFtgWWKWlWNucIOEinNqZ3luZXJ1cnpreXR0bnp+dV9mc2NbXldiZFlhdWZVX2BtY2FxXV1+b2hpc3FzcHV1a2yEk4GIe4VxcmZue29xblNaZWplcXOAdnNibHZVYnFrW15uZHxla3V8cnJyam1fWWNpanheZlRlVVZQVW5YUldUT0hlcl9hRlhqTkhXVFZtaGR8aWt3amFXXFVbdGRTUlZoUVlmVFNIWltQTnh3W2BmbGlaYmBeXo9uYmZreXVubml2dn9+bYOAfoaXe3+HgYl+a5KIcmd0gHt1gIN+iY9/i5NyfYqRhYefhnt/hoxzgIZzfYJ1bqSMc4GNi3d4bnuNYGR8cWd6c3lsbXF2g2dkfGxjZmdoU19fVWdgbG9cXm6OaE1pbWBVVlNvZnNsZXhkZV1ZcXVtcnt4c22Je4B3nHt6bGFlbG1eYG5qZXB5fmdaVlhga3d7em+DXmJeZ1ZZYFdjnIhia3GBhnx3a2p2bFt2cGt5aXVybW57gHJYam5eWV1WYmRYZXFjVF5iaWJibVpgfmtma3N1bm13dmtohYt+iHqHbXFmb3tscWxiWF9oaG9zgHRzXmltU2VwZFVibmF5Ym91e3Vqb2xqX1hgZmh1XWVWYlZTT1lmU09dT09IZW9dY0daaU1JX0tYbWRfeGhufWRgVV5UXXRbVFJfZk5dYlRTSlxaUVp2dl1fZm1oWGJhW16OcWNnandxc21ndnN5g3OBg3uIjX58ioeOeW6QinRsc4Fzf3+IhYeShJWPen2Mj4iRm4SAfIyEcn+Bc3R3cW6Tk5OTk5OTk5OTkpKSkpKSkpKSkpKSk5OTkpKSkpKSkpKSkpKSkZGRkJCPj4+Pj4+Ojo6Pj46OjY2Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2NjYyMjI2NjY2Njo6Ojo6OjY6OjY2Ojo6Oj4+Pjo2NjY2Oj4+Pj4+PjoKAfnp6fX5+fX1/fn59fn5+fn5+fn+Af4CAgIGAgIB/gIGBgYOHjI6Ojo6NjY2NjY2NjY2NjZKSkpOTkpKSkpKSkpKSkpGRkZGSkpKSkpKSkpKSkpKSkpKSkpGRkZCQkI+Pjo6Ojo6NjY6Ojo2NjY2Njo6Njo6OjY2NjY2Njo6Ojo6Ojo6NjYyMjY2MjIyNjY2Njo6Ojo6NjY2NjY2Njo6Ojo6OjY2NjY2Ojo6Ojo+Ogn99ent8fX59fX5+fn5+fn5+fn5+f4B/gICAgICAgH+BgYCBg4aMjY6NjY2NjY2NjIyMjIyMkpKSkpKSkpKSkpKSkpKSkZKSkpKSk5KSkpKRkZGRkZKSkpGRkZGQkJCQj4+Ojo6OjY2NjY2Njo6Ojo6Ojo6Ojo6OjY2NjY2Njo6Ojo6Ojo2NjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Njo6Ojo2NjY2NjY2NjY6Ojo6Cf3x6fHx9fn19fn19fX59fn5+fn5+gH9/gICBgYGAf4CAgICDhouOjo2NjY2NjIyMjIyMjIySkpOTk5KTk5KSkpKSkZGSkpKSkpKSkpGRkZGRkZGRkJCQkJGRkZCQkJCPj46Pjo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2MjY2Ojo6Ojo6OjY2MjIyMjIyMjIyMjY2NjY2NjY2NjY2NjY2Njo6NjY2MjIyNjY2Njo6OjoN/fHp8e31+fH1+fXx9fn59fn5+fn5/f3+BgYGAgICAgYCAgIOGi42NjY2NjIyMjIyMjIyMjJFtZmdnZ2dnfYWEhISEiF0tMDAwMC1GoaGhoaGhoJqZmpqampqKg4SEhIOEd2VnZmZmaFxDREREREVCMS8wMDAwLlxwbm1ubm9qZmdnZ2dmb4SDg4ODg4OLjIyMjIyMjY2NjYyMjY2NjY2NjY2NjIyMjIyNjY2NjY2OhX19e3t6fX58fH59fX1+fX1+fn5+fn9/f4GBgYCAgICBgICAgoWKjI2MjIyMjIyMjIyMjIyMkWdfYGBgX155g4KCgoKGUxgdHR0dGTekpKSkpKSjnJycnJycnImBgoKBgYJyXV9fX19hUjQ1NTU1NTMeHBwcHR0bU2pnZ2dnaGNfX19fX15qgoGBgYGAgYqLi4yMjIyMjIyMjIyMjIyMjY2NjY2MjIyMjIyMjY2NjY2GfH16enp8fXt8fn19fX59fX5+fn5/f3+AgYCBgYGAgIGBgYGChYqNjYyMjIyMjIyMjIuLi4uRjo2NjY2NjY+QkJCQkJCMh4eIh4eHiZOTkpKSkpKRkZGRkZGRj46Ojo2NjYuJiYmJiYmIhYaFhYWGhYODg4SEhISIioqKiomKiYiIiIiIiImKioqKioqKi4uLi4uLi4uLjIyLi4yMjIyMjI2NjIyMjIyMjIyMjY2Njoh8f3l7ent8e319fX18fX19fX5+fn9/f4CBgYGBgYGAgYCAgYKFioyMjIyMjIyMjIuLi4uLi5GSkpKSko2QkpGJh46KkJKTkImQjo2RiI+RkZGRkJCQkJCPj4+Pj4+Ojo6Njo6Ojo2Njo2Njo6Ojo6Ojo6Oj4+Pj46NjY2NjY2NjY2MjIyMjIuLi4uLiouLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyNjY2NiX59eHh5fH18fX19fHx9fX59fn5+f3+AgICBgYGBgYCBgIGCgoSKjIyMjIyMjIyLi4uLi4qLkJCRkZGPhI6QkIaKj4WNkJCMiIeHhomFiJCQkJCQkJCQkI+Pj4+Ojo6NjY2NjYyMjIyMjIyMjIyMjIyMjIyMjI2NjIyMjIyMjIyMi4uLi4uLi4uLi4qKiouLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjI2Lfnx3dnh7fXx7fX18fH19fn5+fn5/f4CAgIGBgYGBgIGAgIGChIqMjIyMjIuLi4uLioqKioqQkJCQkIqFjoiOhoaPiY2QkJGNhoaFhYWHj4+Pj4+Qj5CPj4+Ojo6OjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLi4uLi4qKioqKi4qKi4qKi4uKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIt+e3d2eHt8fHx9fX19fX1+fn5/fn9/f3+AgIGAgYGAgYCBgYGEiYyMi4uLi4uLioqKioqKipCQkJCPhYOMjpCOiYyKjpCQj4eLhIeEhoiPj4+Pj4+Pj4+Pjo6OjY2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKioqKioqLi4uKioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMin18dnZ4fHx7fHx9fX19fn5+fn5+fn9/f4CAgYCBgYGBgIGAgYSJi4yLi4uLi4qKiomJiYmJkJCQkJCMhoyJjoeFjYmOi4yMhIqGhoiDio+Pjo+Pj4+Pjo6OjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKioqKioqKioqKi4uLioqKioqKioqLi4uLi4uLjIyMjIyMi4uMjIyKf353eHp7enp8fHx7fX1+fn5+fn9+fn9/gICAgICBgICAgYCBhIqMi4uLioqKioqJiYmJiYmPj4+Pj5CMjouPjIqPjI6MjY2Ii4yLjomOj46Ojo6Ojo6Ojo6NjYyMjIyLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLjIiAfXh5enp6e318e3t9fn5+fn5/f35+f39/gICBgICAgIGBgIGEiouLioqKioqJiYmJiYmIiI+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pjo6Oj46Ojo6Ojo6Ojo2NjYyMjIyLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLioqKi4uLh4B8eHp6eXt8fHt8fH1+fn5+fn9/fn9/f39/gIB/gYGAgIB/gYSJi4qKioqJiYmJiYmJiIiIj4+Pj4+Pj4+Pj46Pj4+Oj4+Ojo6Ojo6Ojo6OjY2NjY2NjY2MjIyMjIuLi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKiYmKioqKioqKioqKioqKioqKioqKi4uHgHt5eXh6fHx6e3t9fX5+fn5+f39+f39/f39/f3+BgYCAgH+BhIiLiomJiYmJiYmJiIiIiIiOjo6Ojo6Pj46MjI+Sj5COjo6Ojo6NjY2NjY2NjY2NjIyMjIyMjIuLi4uLioqKioqLi4uLi4uLi4uLi4uMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKiomKiomJiYqKioqKioqJiYmJioqKioqKioqKioqKioqKioqKi4aBe3h5eHp8ent7fH19fn5+fn5/f35/f39+fn9/f4CAgYCAgIGEiIqJiYmJiYmJiIiIiIeHh46Ojo6Ojo6Ojo+MkJOQkI+Ojo6NjY2NjY2NjYyMjIyMjIyMjIuLi4uLi4qKioqKioqKi4uLi4uLi4uLi4uLi4uMjIyLi4uLi4uLioqKioqKioqKiYmJiYmJiYmJiYmKioqKiomJiYmJiYmJiYqKioqKiomJioqKioqKhYB6eHl5fHt6ent8fH1+fn1+fn9/fX9/f35/f39/gICBgICAgYSIiomJiYiIiIiIiIeHh4eHjY2Ojo6Ojo6Pj4+PjoyNkI2NjY2NjY2MjIyMjIyMjIyMi4uLi4uLioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYmJiYmJiYmKioqJiYmJiYmJiYmJiYmKioqJiYmJiYmJioqFf3l6eXh7e3p7fHx7fn5+fX5+f39+f35/fn+Af3+AgICBgYCChIeKiYmIiIiIh4eHh4eHh4eNjY2Njo6Oi42Nj5WPiYyPjYyNjYyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYR+eXt5ent7ent9fHt+fn59fn1+f35/fn9+f3+AgICAf4CAgICEh4mIiIiHh4eHh4eHh4aGhoyNjY2NjY+MjImKj42IjJGPjY2NjIyMjIyMjIyLi4uLi4uKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uKioqJiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJg355e3p8e3p7fX17fH9+fn5+fX5/fn9+f3+Af4CAgH+AgH9/f4OGiIiHh4eHh4aGhoaGhoaGjIyMjIyLiYyKiIeJhoyOjJCMjZGOjIyMi4uLi4uLi4uLi4qKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiImJiYmJiYmJiYmJiYmJiYmJiYmIiImJiYmJiYmJiYmJiYiIiIiIiYmCf3h7e3t6enx9fHx9f39+fn19fn9/f39/f4F/gIB/gICAgICAg4aIh4eHhoaGhoaGhoaGhoWMjIyMi4yOjoyKioeEiIuKjIuNjo+Li4uLi4uLi4uLi4uLioqKiomJiYmKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiomJiYmJiYiIiIiIiIiIiImJiYmJiYmJiYmJiIiIiIiIiYmIiIiIiIiIiIiIiIiIiIJ/eHp7enp6e3x8fX1+f35+fX1+f39/fn+AgICAf3+Af4CAgYCDhYiHh4aGhoaGhoaFhYWFhYyMjI2NjJCSjI2Ii4mJi4uLi4mLjIqMi4uLi4uLioqLi4qKiomJiYmJiYmJiYqKioqKioqKioqKioqKioqKioqKioqKiYqJioqJiYmJiYmIiIiIiIiIiIiIiImJiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIiIiIiIiIiHgXx4e3x5enp8fHx9fX9/fn59fX9/f39+fn+Af4B/f3+Af4CAgIKEh4eGhoaGhYWFhYWFhYWFjIyNkY+PjZGJjIaJjIuIiImMiYeNjo+NioqKioqKioqKiomJiYmJiYmJiYmJioqKioqKioqKioqKioqJioqKioqKiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4WAenl9e3t7enx8fHx9f39+fn19f39/f35+f4B/gH9/f4B/gH+AgoSHhoaGhYWFhYWFhYWFhISLi46PjoyLj4iHiYmMjYWFjo2KiYyNi46KioqKiomJiYmJiYmJiYmJiYmJiYmJiYmKioqKioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHhoaHh4eHhH55eX16enp7fXt8fX5+f35+fX5/f39/fX5/f3+Af39/f39/f4CChIaFhoWFhYWFhYWFhISEhIuLjI6MjI2Lh4mIiomGgoiNjoiKi5GTj4uJiYmJiYmJiYmJiYmIiYmJiYmJiYmJiYmKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIeHh4eHh4eIiIiIiIiIiIiIh4eHh4eHhoaGh4aGhoaGhoaGh4eDfXp5e3p5enx8e31+fn5/fn59fn9/fn9+fn+AgICAf35/f39/gIKEhoWFhYWFhISEhISEhISEioqOjYmIiIqKh4iHiomIioiIh4qGi5GPiomJiYmJiYiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHh4iIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGh4J8eXl6eXp7e3t7fX5+fn5+fn59gH9/f39/f4CAgH9/fn9/gICAgoSGhYWFhISEhISEhISEhISKi5CPiYmJi4qHh4WHiYuKiYSLjYmOjYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiIiIiImJiYmJiYiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGgXt4enp4e3x7e3x+fn9+fn5+fX1/f39/f3+Af4B/f39/f3+Af4CChIaFhYSEhISEhISEhISEhI+Qj4+IiYuIhoeIiYuLjIuJioqNio6Oj4iJiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoaAe3h5eXh4enp8fX1+f35+fn59fn9/f39/gIB/gICAf39/gIB/gYKDhoiGiIaDhISEhIODg4ODkpKOioeKi4qLh4uNiYqJi4iHiouIio+SioiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhn96eXh4eHl5eXx9fn5/fn5/fn1+f35/f3+Af39/f4CAgH+AgH+BgoOHjo+PjoiHhIWFhoaFhYWSkI6KiYmIiImKioiIh4aKjIiHiYmOkJGNh4iIiIiIiIiIiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4aGh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWGf3l4d3d3eXp5e3x9fn9+f35+fn5+f35+fn+Af4CAgICAf3+Af4GBg4eOjo6Ojo6Mjo2OjY2MjZCQjomHhoiJiYeIiouIiYyJiYaKjY6PkYuIiIiIiIeHh4eIiIiIiIiHh4eHh4iIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhYZ+eXd5d3d6eXl8e31/fn5/fn5+fn5+fn9+f4B/fn+Af39/f39+gIGEiI6Ojo6Ojo6Ojo6Ojo2NkJGOi42JjIiIiYaHiYaIioiHi4yLjpCQiIeIiYmJiIeHh4iIiYmIh4eHh4iIiYiIiIiIh4iIiIiHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhoaFhYaGhoWGhYSEhIWFhoaFhIWFhX55d3l2eHl4e3x7fn5+fn5+fn5+fn5+f39+f39+f39/f35/f3+AgYOGjY2Ojo6OjY6NjY6OjY2Qj42Ni46KhoiKhISLiYeDhYSDi4mLj42JjI6QkI+NjYyLjY6Pj42NjI2Nj4+Pjo6MjYyMjY2KiYiHiImHh4aHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoeHiYqKiIeJi4yNjo2LiImLi42OjYyJiImMgHl3d3Z6eXh7e3t+fn5+fn5+fn5+fn5/f39+fn5/f4B/f4B/f4CBg4aMjY2NjY2NjY2Qj4+Pj46NjI6KiYuMjIeFiY2Lh4aIh4aHh4uNjo6Pj4+Pjo+Pj4+Pj4+Pj4+Pj4+Ojo+Pj4+Pj4+Pj4+Oj46Oj46Mi4uJh4eHh4aIhoaGhoaGhoaGhoeLiYeHiIiLjY2Mi4yLjY2Ojo+Ojo6Pj46Ojo6Ojo6Ojo6Njo6NjY2AeHZ4eHp4enx6fH5+fn5+fn5+fn5+f39/fn59fn9/f39/gH9/gIGDhoyMjIyMjY+QkpOTk5KSjYyMjIqHioyKh4eJiYWCiouIiYWJjpCNjo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjI2NjI2LiYaHh4eHiYqLjY6NjYyNjY6OjY2OjY2NjY2NjY2NjY2NjY2OjIyNj4+OjY2MjIyLi313dXd5enp7e3p+fn5+fn5+f35+fn5/f39+fn1+f39/gICAf3+AgYOFj5KRkJGSk5OTk5OTkpKLi4uLiomMiouLiYuKhoeOjYiIjI6OjIuMjIyNj46Njo6Ojo2NjY2MjY2NjIyMjIyMjIyMjY2NjYyMjI2NjYyMjI2NjIyNjIyMi4yMi4yMjI2MjIyMjIyMjIyMjIyLi4uLi4yNjY6Sk5OSkpSRkJOVlZSTk5COjo6Oe3Z2d3h6ent7e31+fn5+fn5/fn5+fn5/f35+fn9/f39/gIB/f4CBgoSNkpKTkpOSkpOTkZKSkoqJioyJi4qJjIuKioiHiYqKi4mKjY2Mj46Nj5KUlJOUlJOTkpGSkI+Ojo2NjY2Pko+OkZGOjIuKioqLi4qKi5CPjoyMjIqKioqKioqKiouKioqKi4yLi4uMjIyKiouLi46RkpOTk5SUk5STk5SUlJOTk5KSkpKSk5F6dXZ2eHt7e3p6fX5+fn5+fn5+fn5+fX5/fn5+f39/f3+Af39/gIGChIuRkZGRkZKSkpGRkpGRiYmIiIqMiYiJiYuJhoSJhoyKh4ySkpKTk5OUlZWWlZWUk5OUlJSUlJSUlJSVlZWVlZWUlJOTkY+QkZKQjoyRlZWVk5KSjo+QjYqKi4qKi42OjY6RkpCRkpKSkpGRkpKSk5OTk5OTk5OTk5OTkpOSkpKSkpKSkpKSj3h1d3l6e3t7ent9fX19fn5/f35+fX5+fn5+f39/fn9/f4B/f3+AgYKEi5GQkJCSkpKRkZGRkZGIiIiIi4uJg4eLi4yMiIeHjYyNkpSSkpOTlJWWlpaVlZSSkpOTk5SUlJWVlZaXlpaWlpWUk5SUlJSVlJSUk5OVlZWUk5KTk5OTkJGSkZGSk5OTk5KSkpOSkpKSkpKSkpKSkpKSk5OTk5SUk5OSkpOTkpKSkpGRkZGPdnJ3enp7e3t8fX59fX1+fn9+fn9+fn5+fn6Af39/f3+Af3+Af4CBgoSKkJCRkZGRkZCQkJCQkIeHh4eIiIiFi4+KjI6Njo+OkJWUk5OTk5SUlZWVlJSVk5KSk5KTlZSUlZaWlpaWlpaWlpSTk5OTk5OUlJOSk5SVlZSTkpKSkpOTk5OTk5OTk5KSkpKSkpKSkpGSkpGRkZGRkZKTlJSUlJSTkpGRkZGRkZGRkZGRkYx0c3d6ent7e3x9fX1+fX5+f35+fn5+fn5+fn9/f39/fn9/f39/f4GDhIqQkJGRkJCQj4+Pj4+Ph4iKi4yNjYuOj42Mjo6RkpGSk5OSkpKSk5SUlJOSk5OTk5KSkZOShpOUk5WVlZWUlZWUk5OTk5KSk5OUk5KTlJSUk5KSkpKSk5OTkpKSkpKRkZKSkpKSkpKSkpKSkZKRkZGSkpOTlJSUk5OSkZGRkZGQkJCQkZCRinN0dnp8fHp7fXx9fn59f35/f35+fn9+f31+f39+fn59f39/gH+AgYKDipCQkZGQj5CPjo+Pjo+Oj4+Pj4+Pj4+PkI2OjpCRkpKSkpKRkpKTk5OTkpGSkpGOkZGSk4V8lJOSk5STk5OTlJOSk5OTk5OTk5OSk5OTkpKSkpKSkpKSkpGRkZGSkZCRkZGRkpKRkZGRkpGRkZGRkpKSkpKSkpKSkpKRkJCQkJCQkJCQkJGGc3V2e3x8e3x9fX1+fn1/f35/fn5/gH9+fX5/fX5/fn5/f3+Af3+BgYGKkI+PkI+Pj4+Pj4+Pj4+Oj46Oj4+Pj5CQiI2PkJGRkpKSkpOTk5OTkpKSk5KSknyEkpGSeH+Tk5GRkpKSkZKSkpKSkpKTk5KRkZKTkpGRkpKSkpKRkJCQkJGRkZGQkJGSkZGRkZGSkZGRkZGRkZGSkpKSkpKSkZCRkZCPj4+Pj4+Pj4+PkX9ydHh8fHx7fHx9fX5+fn9+fn5/f3+AgH99fn5+f39+f39/f4CAf4GBgYqPj4+Pjo6Ojo+Pj46Ojo6Ojo+PkI+Pj4+GjpCQkJCRkZGRkZGRkZGQkJCQkJCSgm2Nkolxf5GRkJCRkZCQkJGRkZGRkZGRkJCQkZGQkJGRkZGRkI+PkJCQkJGRkJCQkJCRkJCQkJCQkZCQkJCQkJCQkZCQkJCPj4+Pjo+Pj46Ojo+Pj4+PeHJ2eXx9fHp9fH19fn5+f35+f39/f4CAf39/fn5/f35/f39/gIB/gYGAio6Ojo6NjY2Ojo6Ojo6NjY2Oj4+Pj4+PjoiQkZCPj4+QkJCQkJCQkI+PkJCQj5CEZ32SgHR+kI+Pj4+PkI+PkJCQkJCQj4+Oj4+QkI+PkJCQkJCPjo+QkJCPj4+Pj4+PkJCQkI+PkI+Qj4+PkI+PkJCQkI+OkI+Pj46OjoyMjY2NjIqDiYhzc3Z4fX58eX18fX1+fn5/fX5/fn9/f39/f4B/f39/f4CAgH+AgH+BgYCJjY2Ojo6Ojo6OjY2OjoyNjY6Ojo6Ojo2NiJCRkI6Njo6Ojo6Ojo6Pjo6Ojo6Oj4ZocI98dHuOjo6OjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Pj46Oj4+Pj4+Pj4+Pjo+PjY2MjYyNjoyLi4mJiYiFhYSDgoKEgnR5fXp4dXJrZWltb2xmZmdncHNzd3l9fnl6e3x9fX1+fn59fn9/fn9/f39/gIB/f3+AgIGAgIB/f4CBgImNjY2NjY2MjYyMjIyMi4uLjYyMjIyMjIyGj5GRjIyMjIyMjIyMjIyMjIyMjIyOgV1pdm1le42MjY2MjIyNjY2NjYyMjI2MiomKi4uJh4KAh4iEgXt6gH57fXx8fXlzcnJycnV1cG1ramppZ2NkYV9bXF1eWFVXWFlTS0VJSkpLTE1PT0tgdHR3eX19eHp5e3x8fX5+fn1+f39+f35/f4CAgH+AgICBgYCAgICAgIGAf4OEhYSFiIuLjYyMjIuLi4yGiYqKioqKh4OOkJGNiouLi4uMiYmKioqKiouKi4hnZm1eaWd0hoWDhIeJiYWCg397fHl6e3pzcHFxcW1samdsbWdlZmVmZGNlZGVkZWVlZWRkZGNhYV5dXFpYWFdUUFFSU1JTTU1KSUZESEpHR0hHR0xOSWdzdXh6fXp4d3l8fHx8fn5+fn9/fn9/f39+f4CAgIB/gICBgICAgICBgYFnXmBjYWNucX17ent/fXd8fHZ4ent4eHpvcHt4eXt8e3h3e394dXd0dHZ1dXZ3cWB0bmFwdGplaGtsbm9tamlpaGhlZWRkZF9gYWJgYF5dWVhaWltdXV9gX2BfX19gYmFeXl5eWVldXF1bV1dWUlRSU1NOUUpISUZERUhMTEhGR0lLSklNbXJ0eHp7end3eXt6e3x+fn1+f39+f35/f35+gIGAf3+AgIGAgICAgICCgWdYW1pZXFtcY1xaXF5ga3FtcHBvbm5vbmtpbmxrbG9qaWtraWpraWZmZ2dnaGdjZm5tXWx1cGViY2JhYmBgXVhbW1dYV1RWUVBUU1NNSkxLTExOTk9UWFhXVVVUUlBQTU1QT05LTE1QUU9MTEpHSUlHSEhJSEhIR0ZHSEpKSEhISUlISVZwc3V5ent5dnZ5enp7fH59fX5/f35/fn5+f3+AgX9+f4B/gICAgICAgIGBbFtYVlZWWVlaWVlYVVZoamxubmxra2poaGloZGVkYlxiZl9fYWNfXF9dYF1eWl1mam9xcXN0ZVlZX1tYV1NOTUtLS0tMSUtNTktKS0tMSktQTEtLRkdHSUlGR0lISUZFSEdGRkVERUVEREVJSUlHSEdIRkZLTUtJSUlIR0hLTU1LTExMVXFzdnl6e3h2d3h3ent8fn1+fn9/f39+f3+AgIGAfn5/f4CAf4CAgIB/gYJoUlRVVlNVV1lZWVdXV1tbYWNfXlxbWFZWWVZSVFJRUVVUU1NUUE1KTU5QUk9OUV9jZW5vb25iT1FUUFBOTk9NSk1MS0xKSktLRklJSkxJR0pISUlFR0dGRkVFSElKR0ZHRkZHR0hKR0dISEpMSkpLSUlISktLSkhKS0pISUtMTU9QUEtUdHN1eHp6eHZ2d3d6enx+fX5+fn5/f35+fn+AgYB/f3+AgYB/gICAgH+AgmlQUlRXVVRWWVdYWFpbVFRTUlBRU1FRUU9OTlBQUU9MTlBPTk5NTEtNTk5PTE1QX2hnbW5sZ2FSTU5PT1BPTk5PTk5QTk1NS0lISEpJSUlJR0ZHR0dJSkhJSEhJSEhHSEdISElISUxLSklISkpJSkpIR0pMS0pJSUhKSktMTk1NTU9RTFVzcnN3enl3dnR2eHp7fX19fn5+fn9+fn5+gICBgICAf4GBgH+AgICAgICBbE9PTlRZVVVdW1lXV1hOTUpKSUZKT0xKSkdJSk1NS0pMTUpHSUlJSktLSEZJTlhmbWhsbWxqaGNcV1VRT09NTk9MTk5OUFBPTE1MTk1MTEpJSEdJSElISElJS0xLS0pJS0pJSklJSUlJR0dKSUdJSUpKTk1OTEhJSklJSk1PT01MT1JOWXBwcnd4d3d0c3R3enx+fX5+fn5+fn5+fn9/gICAgICAgYCAf39/gICAgIFvS0pNTlFOTlVXVlZSU0lFQ0VFUkREQT5CP0RAQD5CREFAQURHRkVIRUJQWltdZGlvaWtsamlqaWtrY1JISklKSUlLSkxQTk1MTU1MTU1NTElIREZGR0ZGRklKSUlLSkhMSklKSkpJSEhKS0tIRkdJSklLTU5OSktPTUxLTU1PUE5QT1BgcG9yd3h2dHJzdXd6fX19fn5+fn9+fn1/gICAgICAf4CAgIB/f3+AgICAgXNQUE5OUE1KS1BSUE5RQ0RCQUZRRT1DPT9FSDk6Oz0/PTxBRkA+Ojs+Pj1MXmdsa25rb21paWpsZVRJQ0RFRUZFR0dHR0pHSEpLR0NER0pHQ0RFQUFDR0hHSEdISktKSElMS0lISktLTU5MTUxMSkpMS0lLTU9PUFNRT1BQTk9QUlFNUGdwb3N2dXRycXR4eX19fX1+fn5+f4B+foCAgH9/gIB/f4CAgH+Af4B/gICCdlRVUVFQT0xNUFBOT09BQkFAQkE/Oz48Pj8/Ozg5ODs7OkA6Oz48Ozs8O0dLR11tbW54cWlqaFZIQUVGREdJSEM/QEBAQUFCQUE/Pjw9PkFAQD8+P0BFR0dHSUtMTk1OTUxNTUpLTVBVU05MTlFOTk1OTE1NTk9OTk1LS05OTk1OTkxUbnBwcnR0c3Fydnl5fX19fn1+fn5/gH5+gICAgICAgH9/gICAgH9/gH+BgIJ4UVFSVFJTUVNTUVFST0BAPT4/PD8+QEE/PT45Ozo7Ozk5Ojg4Ozw5Nzk7Oz47Ok9pcHpzbGNJPUBAQ0ZEQ0NDPzs+PkBDQ0E/Pj9BPkBAQj9APD9CQEFDRUVFSktQT1BPTU1OTExMT1JRUFJOTExPTUtOT0xMTEtMS0tKS0tKTU1LS1xxcXF0c3VycXR4eHp9fn1+fn5+f39/fn5/gIGAgH+Af4CAgICAf4CAf4CAgXxSTU9RUFFSUlRSU1NOPDs8Ozs7P0BBQkA9PDk8PTw6Nzk6Ojk3OTo6Nzg6OTk6OkFXdHFYPzc8PD1AQUA9Ozs+PD09QEJDQT9BQkE9Pj09Oz0/Q0RCQD9BREJFR0pKSkpKTE1MTExNTExOVVNLTE1USVBKSU1KSUpLS0pJSEdKS0lKZnJxc3RzdXJydnl5e31+fn5+fX9+f39/f36AgICAf4CAgICAgIF/gIF/gYCBgFZMTlBQTlJRUFBRUU44PT88PDo9PkFAQT8+PkA/Pj48PT0/QD09PT9DOz09PTw+OztXXzo6PD49Pj9AQUA+P0E/QEBBQEBAPT8/PTw6Oz09PD9AQUJCQUBCREZGRkdGR0dISUtMTExLTEtKS0lKSk1MTEpMS0lISUxMSklJSElLR01tcHF1dXR1c3V4eXl8fX5+fn5+fn5/gH9+gIB/f39/gH+AgYCAgYCBgICBgYCCYUtPT05OT1BPT1BQTzo8Pjw9Oz8+PkFBPz0/Q0NEQT89PkBBP0A7XW5APkRFPz9BO0ZYOz09Ozo9PkFBPz5AQD9BPz89PD48PTs7PD0+QUA/QD5AQ0NEQkRFSEVFR0hISEdGSUpJSUlJSUhKSkpKTEtKSklJSEhKSktMS0lLSkpIVnBwcXNzdHR1eXp7e3x+f35+fn5+f39/f39/f3+Af4CAgICAf4GBgICAgIGBgIJtTFBRTk9QTk5PUFBPPjw8PT4/P0A+QEA/Pz9CRkQ+PDw9QD04Ojttd0g4Ozo9PUE7SVs6PD08ODo7Pz49PD07PEA9PTw8Pjs9PD0+QUBCQUBAP0JEQ0RFRkZGQ0VHSElJSEhJS0tMTUpKSUpNTUpLSktJSEhISEpJSktKSk5MSUlfcHBycnJ0dXZ6e319fH5+fn5+fn5/f35/f36AgIB/gICAgICAgYGAgICAgIGAgnZNTk5NTk5MTE5QT0w+QTw8PT8+QkM/PkFBQUJBQFlRPD09SUxFRnV3TTc4ODo7Pj5QYDs7PTw6Ojs+Pz89PDg6Pjw9Pj89Oz4/QEJDQkJDQ0FCQkFCQkRCQkRCRENGSUdGRkhJSUtNSklKSktMSkpJSkVESUlGRkhISUpKTEpGRmdwb3FxdHZ1d3t8fH18fn59fX1+fn9/foB+fn+AgH+AgICAgICBgYCAgICAgICBek5JS0tMTExFSUxOTTw/PDw9PkBAQUE7QkNCQ0BDc3lJO11/g395fHdWPD0/PT0+Ql1qQTs9Pj89PT5BQ0A8OTtBPz4+QT07P0JAQkNCQENDQUNBPT0+QD0/QUFBQENFRUBAQ0JDR0dFRENGRUZGR0VEQEFHR0ZDRkRHSEpHQz5IbG9wcHF0dXZ5fHx8fHx+fn1+fn5+fn5+f36Af3+AgICAgICAgIGAf4CAf4CBgIF+UUhLTU1NS0pLTE9RQD8+PkFBQEBBR0FCRENFQUhyeWtigoSDgoOAfV0+QENAQD5GbnZNOj1BRUFCQkZIQz08QEREQUA/Pj1AQT4+Pj88PkBER0VAPkBBP0BDRkVDQkNDQEJEREJERUFCPkFCQkFCQEA9QUJDRENDQUNFR0E/PVZwcHFwcnV1d3p8e3t7fX9+fX19fX1+fX5+fn9/foB/f4CAgICAgYCAgIB/gIGAgX5SSEtNTUxLS05OUlVEQkBDQ0FBQkBCQ0BAQUFARm90fYKCgYN+fYR1TEFDRUA/P1d8gVw/Q0VJSklJTU1LRUNGR0dFR0VFRUREQ0E/QD4+QkZKSkdFRUdGRkpOTktKSUdHSEtMSUdHQ0REREVEQUJCQ0BDREVEREVERUZDQkFEZW9wcXF0dnV4e3x6fHx+f319fX19fn59f4B/f39/f39+gIGBf4CBgICAgH+AgICAfVJJSUpKSEpKTE9SU0dGRUdIREdIREA+PDs+QEVFaHN9gXx/hH55hXFCREVEQ1d1hoeHflhHSEpNTE5PT0xIR0hHSElJSEhHR0hIRUNFRUVFRkhKSkZFR0lKTU9PTU1LSktKTU5LSUhHSEhIR0ZFRkZGREZIR0VFSEhGSEdIRlFubnBxcnV2eXt7e3p9fX5/fX19fX1+fn1/f39/fn5/gH+BgYGAgICAgICAf4GBgIB8UEhHSElGR0lKTU5OSkxJSUpLTE5KRkNBQkNGSkdge4B/d3+EhYOEimxBQVZ0h4mHh4eIg1dITE1MTU5MSkdHR0dER0dHR0ZIRkhFQ0RERkVEREhIQ0NDRklKS0xMTExMTElKS0pKSUlJSEpISEdISUhHR0hGRkZISklJSUlIXW9vcXJzdnd6e3t6e319fn59fX19fX5+fYB/f39+fn+BgIGAgYCAgICAgIB/gYCAgHxNR0ZIRkVGR0dKS0pMTUxLTU5NT0tJSEhKS0tMTE5bfIKCg4OFhoaIg1VshIeGhoaHiIiHfFBLTEtIR0ZGREVDQ0BBQ0NDQ0ZGRUJAPj5AQUFAQkQ/Pj9ERkhERUdJSklJR0hIR0lJSkpJSEZKSkpKSUpJSkpKRklMTEpKS0tmb3BzcnR2eHl7e3t8fH1+fn19fX19fn59f39/f35/f4CAgICAgYCAgIGAgICAgICAfU9GRkdGR0hHRUZHR01NTUtMS0lHQ0NDRElLS0xMSlWBg4SEgoKFhoaDgoaFhISGhoaHh4aKdUlJRkI/P0A/Pz88PDw+Ojo8QUFAPjw5OTg8PD07Pjs5Oz9BQkBBQ0NCQEFCRERCQ0ZISUhISExNTEdJSk1NTk1KSktLSkxNU2xwcXRzc3d5e3t7fH19fn9+fX19fX1+fn5/foB/fn9/gICBgIGBgICAgYCAgIB/f39+UUZFRkdJSUdEQ0VGTk1MSklIRT85Oj5ARUhISkpJZYWEhIR/gYKDgoODhIWFhoeIiIiIiYyOZkJCPTg4Ojo5ODc4ODk2NDc5Ozw6ODU2NzY4OTc4NzY4ODs7Oz1AOzk5OT08Pjs7PUFDRUhKTUxMR0lIT1JRUFBOTE1NT1Fdb3BydHN1eHp7e3x8fn5+f359fX59fX5+f39/gH9/f4CAgICAgYCAgICAgICAgIB/f39RR0ZHSEpIRkVGR0hMTEpJSUdDQjU2OjxDQENHSUlqhoSEgX6Bg4ODgoOEhomKi4yLiomKi4yJVDo4NjU2NzY2NjQ1NzYzNDY4Ojg3NjU2NTY3Njc3ODo2Nzc4OTs3NTc4OTc5ODc2OjxAR0ZJRklGRUZPU1JTU1JPUFBSVGVwcXN0dHd5e3t7fH1+fn5/fn19fX19f39/f3+Afn+AgICAgICBgICAgICAgICAgH9/flJISEhJS0lHSUpJSkpLREVIRUJANTc4OD06PUVDQmaFg4GAgoODg4ODhYmLiomJioqKiouJioqBRzY3NjQ2ODg3NDU3ODU2NzY5OTc2Njc2NTo5Ojo6Ozg5ODk4Nzc3OTo5ODg3ODU4OTtBPT4+QkE/QUtMT1FQUU9PT1JXa3FydHR1d3p7e3t9fX5/fn9+fX19fX5/f4B+fn9/f4CAgH9/gICAgICAgH+AgICAf39+VEhHSUlMTUtKS0tMSUg/QEFAPDo1Nzk4OTc7Qjo9cYSAgYOEhISEhIaJioqIh4iIiIqKjIqJiYx6Pjk4ODs8PT45Ojo8OTo7OTo7Ojk5Ozo5PT09Pjs7PD06PTs5Ozs8Ozw8OTk8ODo6Ozo5OTk8Pzw9QUJESUpNS0lLTFdvcnN1c3Z4e3t8fHt9f39+f359fX19fn9/f35/f39/f3+Bf4CAgICAgICAf4CAgH+Af35URkVGSUxOTkxKSk1CPzo7PDs4OTk4OTo6Ojs/Pkh+hIKChIWFhYaIiYiHhoaGiImIiYuMi4mKioxsPDs+QkNFRUFBQEI+QEJAQD49PT5APz4/QD9APT0/Qj9BQT9BPz1AQEA+P0E9Pjw7Ojs5OTs/PTs8PT1BQUNBQkNBWHBxdHR0dnp7e3x9e31/fn9/fn19fX5+f35+fn9+f4B/f4CAgIB/gIGAf39/gICAf39/flJFQ0FHSk5PTElHSzo4Ojs5Ojo8PTo7Oz09P0BCUoKCgoSFhIWEhomJiIiGhoaHiImKi4uKioqLiotePkRHSUtKSUZHR0RGSEdFQ0BAQ0VDQkBCQ0I/QERIRENFQ0VFQUZFRkRFRkRAQj88QD49P0A+Pz4/Pj8+Pjo7PTxgcXJ0dHV3enp7fX19fn5+f39+fX19fX5/fn5+fn5/gH9/gICAgICAgICAf4CAgIB/f4B+UERAPUNIT01HRkJEOTc6Pjo8Oz4/Pz89QUBDQ0ZXhIKDhIWFhoaIiYmIh4aGhoeJiYqLjI2MjIuKiohWSE1MTUtOSklLSElKSklFQ0RGR0ZEQ0VGREJISUtIR0dGR0dFS0lLSUpLSkNGQ0NEQkFBQ0JEQ0NERENBPTs9QGhwc3R0d3d5eHt8fH19fn5/f359fX1+fn9+fn59fn+Af3+AgH9/gICAgICAgICAgH+AgH9PQT49P0RMS0BCQkE5ODw+Ozw7PkA/QT5CQkdHSlmEgoOFhYaHiImJiIiHhoaGiIiIiYqMjYyMi4uKjH9QTlBOTE5LSkxKSUlISkZER0hISUVFSEZGRUxMTUlKR0dISUpOTU5MTE5LSEZHR0VFQ0ZGRkZERUhIRkNBP0BMbHB0dXZ4eXl5fHx8fX1+fn9+fn19fX1/f35+fn5+f39/f39/f3+AgICAgIB/gICAgICAf1FBPz4/RUdHPTxAQDg3PDs8PTo/QD4/QENGSUpRX4GDhYSFhoaHiIiIiIiIh4eIiIiJioyNjIyMjIuKjXJOUk9OTExMTEpIR0VJSURKSEdLSkhKR0dHS0xOTExISElKTVBOUE5NT0tJR0lKSElESUhIRkZHR0hHQ0JBQ1VucHV3d3l7eHl6enx8fX5+f39+fn1+fX5+fn5/f36Af4B/f3+Af4CAgICAgICAgICAf39/VERBQUJHSEI/OD9AODo8OD0+Oz1BPj9BREhKTFVxg4SEhISFhoeIiIiIiIeGiIiIiImJjIyLjIyLi4uLi19SUlBNTk1LSkdFQkdKR0xKRktOS0tKSk1NTE9QTkhJS0xPUVFQUU9PSkhKSkxKS0ZHSEdFR0lGRUVCQUJCXG9yd3h5enl5eXp6e3t+fn5/fn59fX19fn9+fn9+f4CAgIB/f39/gICAgICAgICAgH9/f39VRUNFRUdHRUQ7P0E7PTw5QD4+QEJHR0FHS0xQVnmFg4ODhISGiIiIiIiIh4eIiIiIiIqLi4uMjIyMi4uNfFdWUlJUUk9MS0pERUZLT05PV1VRUE9RU1JNU1RPTVNMUFNVVlJTUVBMSk1NTUtOR0dKRkZISkRERUVCRENjcHV5eXp6ent6e3p6fH59fX9+fX19fXx9fn5/gH9/gICAf39/f3+BgYCAf39/gIB/f39/f1VGRkdHR0dIRj5AQj0/PT1CP0NCRlZORk5QUFRYe4aDhYWEhIeIiIiIiIiIiIiIiIiJiouKioyMjIyOi4uLaFdVa2FFUlFRUEk7O1FTUmB1XVVWVFZZWVJYWFJaZlBVV1pdUlRXUU9OUlBQUFFLS0tISEpIRUZJSUlISWlydnl4eXl6e3t8ent8fXx9gH59fX19fX1+f39/f3+AgIB/f39/f4CAgIB/f3+AgH9/f35+U0hKSUhHRkZFPz9BQUVBQ0dFREVMWFJNVFVWWFt8hoWHhoWGh4iIiIiIiIiIiIiIiIiIlJyMioqMfWGKi4uHbFtkVTpYWFhTUT9AVlVZW2NgVllicl1dVl1aVkVRWVpbWV9UWWdSVlZYVFRWVE9PTUpMSklJTE1LT01Tb3N2eHl4d3p5ent6enx9e35/fn1+fX19fn1/f39+f4CAgH9/f3+AgICAgH9/gH+Af39+fn5WSkpJSEdFRERCQT9ITUlNUEtJS1BUU1NYWlpcXHiFhIWFhYWGh4eHiIiIiIiIiIiIiImcnaCPiY5nO36LiYqLem5wWFpcW1JTUlZWVFpadINZVX2QYFxYXV5XSVZdXVtbX1lIWVhZW11YWFlXUlFNUFFNTU9TUVFVUmFzc3Z3d3Z4eHh6e3p8fX19f39+fX59fX1+fn9/gH9/gIB/f3+Af3+AgICAf39/gIB/gHh5fVlOS0lJSEZCREBBOlBRUVdYUFBPUVNUVFhYWVpbboGCg4WEhYaHh4eHh4iIiIiIiIiIiJaanJeIioFuhomIh4OKfmZZWVxZVFVUV1JRV1ViloBRZXJYWldfaFBgZltbWFxnYUdPWmhnXFtcXV1XU05TUFBRVlZWVllabnJ0d3Z2dXh4eHt7fH19fX5/fn59fn18fn9/f3+Af39/gH+AgH9/gICBgYB/gH1yfX9/b3R8XVNQT01LSkVDP0A7UFBaWltSU1FPUlJSVVNWVFdfdXiAhYSEhYaGhoaHh4eHiIiIh4eIh4ORjomJiIaFiIiGfYB7XFBVWFRSVFJRUUxPTEtmeVtdVFlVVl1aTFRaVVNUXlpYV1dXemtYW1tcXlRRUVBJTk9XVlhbWmRwcnZ2dHR2eHl5e3t8fH19fn99fX1+fX1+f39/gIB/f3+Afn56eHd2c3V7f3+AgHRrfn5rcnleW1ZVU1JPS0ZDREFNXoNsVlJTTk9RT1FVUlNSUlRjZHaAgoKDhISEhIWFhISDhoaGhoeIhn6JiYiHhoOHh4d5bXFWSUtNTktNS0hKREZIRUM+VGRVf1JRUU5LUlRRTU9ZUU1OUVNVVU1RU1JQT01MSENJSFJUVVpcbHF1dnVzc3d6ent7e317fX19fn19fX59fn9/f4B/f399fX5+f39/f4B+e3Zzd31+fmR1fWlxdF9kXV1bWVZQTElMSWFsknRQUVNOUVJRUltSU1JRUlZUYnN7fH+AgYKBgX99e3uAf4OChYaHgoaGhoGEgYaFhnVfXUtDP0NDQ0NCP0RQQkNAQz1DSUdWQEhOTEddaVBIRk5GREVGSUdIQ0RIR0hLR0RCQURATlFNUmRydHZ1c3R1enx6e3t7fHx9fHt+fX19fn5/f3+AgIB/f3x8fX+Af39/f4CBgH12dHt/bWh8Z25xZmllZGJcWFNRUFVSc1dlW09PTkxRU1FVWVNVUVFUUk9WYGtscnZ7e3h5dHJuc3RzeXh+foOAg4OCgIKAgoGCa01HP0A6Oz5AQD8/PmpRS2FFRkhJRUI/R0xOR01RVUlCRT8+PD08PT0/PT9BQ0NAPzw9Qj5KTUdVbnR0dXN0dnh6fHp9e3x9fX19fH59fXx+fn9/f4B/f39/enl3eHd2dnh7foB+fXt4dnx1YXhnbHBqbGppZmBbUVJaXFleSkpQUU5LTFFSUVRVVVdRUVdWUFhbYl1hZ21tbG9rZ2BucmptbHF1e3p9e3h6fHx4d3hlQ0BAQj06QkNBQURCXF1Pe05PTk5LTE1PT1FMS0xXTUhHQEI8OTc3NTk5PTs7Ozg5ODk/PEJIP1xzdHV2dXZ4enx8fH18fH19fn58fX19fX9/f39/fn9/f314dXZ6e3p3eXh1d3t8eXh1eXdjcWhpcG1ubW1oZl5PUF5cWklIUFJRT01QUU5RUlRWWFNSWVROWVpbV1ldXl5fZWBdXnF2a15gZ2t3b29sam9ubmxmYllIRkdIQkFHSUVFRkRNUlBhV1JXUVBTU1JVW09PUVdQTUlERj46OTY1ODc5Nzk6MzY1Nzk1PEI9ZXNzdnd3eXp7fX18fHt8fX5+fnt9fn19f39/fn5+fn9/e3d1eX18enh8fHx8dHd2d3Z1d2tuaWhxbm9vb2prYFVXXlpXTUtUVFNQUVVPTFJTVFdYVFRYUUxXWVpWWFhWWFldV1dYaHNrXVZhc2thYV9eZGFfXllUUU5OTkxJSEpLSUlGQ1FQU1tXVFROUVNZU1xlVU9TVFFOS0lIQz9BOTk4ODk3ODg1NzU3ODU5OUducnR4eHl7e31+fX18e318fn5+en1+fH1/f359fn59f358dHR1e3hycW9vbnR4cXJzeHZ1cWZkZ3JucHBxbm1kXV9fWVdPUFhWVlNUVk9PVVZYWFlTVVRMS1RWVVVVV1BUVVdUVVJdbl5STllfW1ZZO0RWWFRbZkpMT1JST01NTk5OTEpGUVBVWVNUT0pOT1VTVFxWUlVTUk9NTElISEY/Pj06Nzg3NjU5OTY3Njc1V3BwdHd5ent8fX59fnx8fXx+fX15fX18fn5+fXx8fX1+fXxydnF4eHJ2dXFxbnBwb3B1dnRuamRkanBwcXJwbmZlZGNcXlJUWlZXVVRXVFJYWFlZWVJVT0lHT1BPT01SSk9QT1BOTk9UTE1JUE9TVFUyPVhNSUBRPWNhUVNRUE5QUVBOTk1RTlRSUFJNSUxKT1JQUlJTVFFST0xMS0xMSENCQT06Ojg3NjtCNTU2Njpkb3J1eHh7fHx9fnx9fH19fX18e3h8ent9fX58e3l9fH18e3B1b3d1cHV0b3N2cHFxcHR1dmNqZ2VXaHRycnFuaWlocFZWVFVYVVdVUldWVVpZWFdVUVNGRUFGR0dIRkpESEpJR0VITEhLSUZMTVBNRy9FX1I+Mz8+am9hUlJRQEdVUVBRUFFOUU9QT0xKTExPUE5OUFFRTlBPSkxNTUtHRUVEQjs9PDw5PUc2Njc3RG1wdHZ6e3t8fX18enx8fX5+fXt5dnh3eXl8fXp6dn17fHp6b3Fud3JwdnFtcHNwb3Bzc3N0ZmdgaFpXa3JzcmxtbWtuYWVQU1RSU1RPV1ZWWVlWUVFRT0A9Oz0/QUJBQ0BCRURBQEdIR0hFRkhKTUtFR0NPUkM4RU5TXWZTUVNBR1VQT1FRUE1NTk1LTEtMTk9PUU1PT01ITExJS0tMS0dGRkVEPEFBPjtARTs8ODlTcHJ1eXt6e318fHt5fHp6fn58e3V0dXJ2dnp6eHpyfHt8eXltcW94cnF1bm5xcm9vb3Rzc3J1dGtnZ15lam1wa29xbWltY0xPT01RU0xUVVRYV1VNTEtJPDk4Nzs/QD48PUFAQj0+RUhHQ0ZGSUdKSkBGQUFARkhFSk9IUFJhXFFQUk5TT09QTExPTUtNTE1PTltXS01RT0dJSENISktMSkZGRkQ/QkM+PEJHP0I/QWRwdHd7enp7fHt6end7d3l+fnt7cXN0cHJzd3R4eHN6e3l2d2xxb3ZxdHRsb3Fybm5vc3ZydHNycmtsZW5zaG1ubWxtbGprSUxISE9RSlFTUVRTT0tIREQ9OTc3OT9CPjs/QkBAPkFESUVDR0dJRklFQkI/Pj1DQkFHSURNT2JlUU1OTldLTE1LTE1NTUxLTk5TZE5KTFJJSUlFQUhKTE1OSkdJRkJBQkA/RUZFSERLbm92eXl5e3t6fHp3c3h0eHx8eXpucXJtbm9ycnZyc3h8eHZ2bXBtc3B1dGxwcHJvb29ydnVyVlZucWdseYRqbXFybm5qaG9ISkNHTE1JTVBNUE9ISkQ/QT05OTk6P0I/PEBCQkFERUdLRkNISUdHSENDP0I/P0BBPkRFQ0tOUlRMSklNVEZJSUpMSktMSUpMTU9QUlBLR0NMR0NCSkpMTU9OSUpJR0NDQ0RJSk1MSVlybXd5eHp7e3l8dnJwdXJ0eHl2eGpxbmpsbG50dG10dXtzdHhyb25xb3ZzbnBvcnBvcHN0eWpOYGdzanR8eWdvc3FpcWhkcUhLREdISEdKS0lKS0RHQj0+PTo6OjtBQj89QkJDQ0dGSUxKRElJRkdHQ0M7QUBCPkBAQkVDSU1QSEhLR0hLREhJS01ISkxISUpLSk1cUkhIRE5GQURLSk1NUE1LTUpLRkdHSk1OUU5MYm1pdnZ3e3h7en1xbWxza3B0dHR1aHBtamlra3RwbnR0eXByeXRvcnFvd3NvcXB0cnBydXR5a05WbXVscXt2aW5vaWt0Z2RvRktDRkVHRUZGR0VHQkNAPTw9OTo6OkBDQD5CQ0RFSUVJSkxGSUlHRkZEQjtCQ0M+QENDQ0VHTE5IS05IREhFSUxOTUhJTEdGR0lJTE5LSUhFTklCRk1MTk1PTU5OTUtJSElPUlFSTlJmZmZxb3N4dXt6fGxoam5la3Fsc3FmbWxoaWtsdG1wdXR3cW94dG90c3J2c3BxcnRzcnR1dXZ2WFZ1dWtvdHJrb3ZsaG1lX3BHSkRGRkVDQ0NFQERCPkA/Ojs7PTo9PkNBPkFDRUZKRklIS0hHR0dGRUNAPUVFQj5CRENDRUdISUdNUEpGRkdLTk9LRkhKRkVERUlKSEtJRkhQS0NJTUxQTU9OT1BOSkpITVJVVFJPV2RgYW1ncHJvcnl6Z2VoaGRpbGZxbGZsbWdpa2xzbHB2dXRwbnZyb3Nyc3V0cXNzdXRzdXZ2dnl2dXR3bGp1dW1ydnFsbmxlckxHRUVHQ0JBQkQ9QkE+QT05Oj0/Oj0+QEI+QEJER0pGSkZJSEZGR0VDQkFBRkZDQkNCREVFR0dIRkxRTElPSkpMTElHSEVHRkRDSUlIS0pHS1JNQk5PTVBPT09NTk9LS0tQVVdWVVRYX15caWFtaW5ocnNiZWZlZGloZm5pZm1taGtrbXJpcXZ1c3Ftdm5vcXJzd3Nyc3R1dnZ2dnd2d3Z2dHd1anN1bnV0c3FyamtzTUdIRkhCQkBERDxBQEBDPDg5PT45Pzw/QkBAQERGSEVIRkZIR0ZGRENFQ0RJRUNGRUJFR0VGR0dFSk1LSFFNSktISElFRkhJRkNJSklLTUtPU05EUVJQUVJOUE1OUE1MTVNXVldYVlhdWl1kYGhiamlna19lZWZjZ2dna2dna21rbWxwcWd0dHVyc252b3FwcnR4cXNzdXZ1gpF5dnZ0eHV1d3htb3VvcnN1cXFpb3lNSEdISEJCQkZEPD9CQkQ8Nzo+Pjo+OkBCPj8/QkVGREZEREhGREVDREVGR0pFRUpHQ0dIRkhHRUNGSkpHTUpMS0hKTEZJSUtIRUtLTE1OT1JUT0hTVVNQU09RTU5RTk1QV1pWWllWWl1aWGFgYGBeaGVjYGRmaGdqaWhqZmhubGxubXFwaXV1eHJycHVwcHBydXZwdXN1dnV7fn14dnR3dnZ2eHBsdXBtc3RucHJyeE5JSEdJQ0FDSEU8QEVCRT04Oj4+PTw8QUI8Pz5BQkZDRUJDSEVDRUVGR0dHSUZHS0hDSUhHSUdGREhLSUdLSE1LSktMSExLTUtKTkxPTk9SVVZPS1VXU1FTUVJMT1FQT1RZWllcWllbXl5eYGNeXGFja2JgZGdocoVoZ2pmam1ucG9uc3JqdHV4cnNzdHJucHF2cnF1cnV1c355jn11dXZ2dnZ4cmh1cWtydGxxdm90TUlLSEpGQkVHRTxAR0NEQDo8PkA/Pj9CQTxAPkFBRkJFRERJRUZFR0VISEZISElLSUVKSEhLSEZGTElISEpHTExMTExJTUtNTU1PTFBQUVVWV09LVlZVU1NRUUxPU1JQVltbXV5bXF5fX2FgYWRdZGBlZmBlaGpjc3NmamhnbHBycW9zc25zd3dxdXZ0c21vcnVvcnNwdXJ2cnSBdnV1dXd2dXd0Z3Rya3Fya3J2bnZKS0xKTEdCRURFPEBGRERDOz8/QUBAQENBP0I/QUNIQkZFRkhGSUZGRElIR0lISk1ISEpKSUxKRkpLSElKSkdLS01NSkpNTE5OTlBMT1BSVFhWTU5UVlRSUlFQTE5UU1JXW15eX11dYF9gYWFfYWNlYmNoYmRpamd2i2xqaWdtb3NxcHFwcHJ5dnJ1dXRzbW1zc21xcm90dXRycHN3dHV1d3Z1dXRlcXNrcHFqcnZvd0tNTEtNR0RDQUQ8P0VFRUM9QUFDQkJDREFDREFBRUdDSEdHR0ZKR0RHSkdHSkZJTEhJSk1LTUxHS0lIS0tOUUtSUU1TTUtOTk9QUE9UT1dYWFtOU1FXXFpSV1BOVFVUVFhaX2JiX2RhXmBiXmBlYWFjaW5nYmloaG54dmxoaW1vc3JwcXJycnZ0c3Vzc3Nua3NxbXByb3R2cnFxdXZ1c3d5d3V0dWNtdGtvcGpxdG93TE5MTExHRUFARD4+REVGQ0BDQUVEREZCQ0VHQ0NIRUNISUlISUtHREtKR0hKSUlLSEpKTkxOTElMSEpMS1pmSmRcS2xTSE9OX25Va3NbcXBid2NTUGJ2dWh1Y2F2YFhucWJkdmluemZbbHRgbGtUX3d2aWpnaWZnbG1qbW9qbW5zcnBycnFyc3Jzc3J0cm5sdG9ucHFxdXVxcXN0dnZ1dXl3dXR0YGt0a3Bwa3FycXlMTkpKSkZDP0BCPz1ERUZEQ0RCRUVERkJGRkdEREpFRUpMTEpMTEdHTUlHSUtIS0tJS0tOTE1NTExJTE1MW3NiZHBebG1VTU5mc11nZXFsbnRncGlfYVlubmJwcGJrampnb3F0ZXRub1xvdWdwTUpyeXZrYmBrZWVteGxrdm1ucHNycHJxcHFycXJycnRybW1zbm5vcHJ1dHFzc3R1dXV0d3h2dXRibXVrcHBscnJxektMSUhHRURAQkJAPkNGR0JGQ0ZFRkVEQ0hIR0RFS0hHTE1OS01NRkpOSEpLSklMSkpKS0xNTk5NTUpNTU1bcm9vbnBwbGtNUFFsV05pYnRycGFtbnVcWWxRXG1tWnFta29teHh0c2lwXF9ya3FqVXV5eHBjXmtmYmdwcGpqb3BwcnNwcXBxcXJycXFycnRsbXJtbm5vcnV0cXRydHV1dHV1enZ1dGVudWtwb2xzcnJ5SUtHSEVFRUJCQj5AQEZHQkdESUVFRUJGSUhIRUdMSkdNTU5MTU5HTE1JTEtJSk1JSklKS09QT05NS05NTFxoZHVdbHFXbE5QUW1VWmtea2x2YWxkc1NlY05tWWxcdHBraWx4and1aHBdXnJraFdiY3d8b2NgZ2dhZGl0eWtubnFzc3BxcHFwcnFwcHBydWttcW1tbW9xc3Rxc3J0dnZzd3Z6dnV0aG91bHNvbXNydHZITUdJREVFQ0FCPEJBQkZESEdMSEVDQ0hLSEhGSkxMRk5LTFNSTEdMTEhOSkhITkhKSklITk9NTkxKTk1KWnNwcG9xcW1sT1FSbllxa2dvb3Fxb210XW5YYXRfbm9wb3Fyb251c3R0altddGN3eHJqbnpoYWFjZmJiam10dXBzdXZzcXBwcW9ydHt/fn13bGtxbmxtbnByc3F0dHN1dXR4eHl4dHVrb3VtdG9uc3N2c0hLSElCRUVFQUA9Q0RCR0NISU1JRkNGSkxJR0ZKTUxGT0pLV1JLR0tKSk5JSEpMSUtKSUhKTU1NTUlLS0tTa2JaaV5faWNyclpfWWpvX2VlVWtfY1thYVFgbGhdalxuaWlkW3BmZHBdWlxrW21xY3BzbGRnY2RnYGBrbXBwb3R5cnVxb3BxbnmFiIeHhoWAdnNua21tb25xcnR0cnR1dXZ5eHhzdW5xdW53cXJ2dHdyR0dGSURFREZBQEFFRURHQkhKTEhGREdLTElFRkpPTElQSUxbUUpFSEhLTUlISkpKS0lISUdLS0tMR0hLS0xMTEtJS01OVFtcVFBUTFBPTk9PVlFPT1FOT1FKSU5QUWRxaVRZV1xbXFVZWl1YXVxcY2ZhYWViY2ZfX2ZrbWhtdHlydHJvcHB0hoeGhoaFhYaHg3pwbW1sa3FzdHRydHZ0dXl4eHV2cXJ1b3ZydHN1dXNHQ0VHRkZBRUNAQ0hERkdDSUtMSEZER0tMSERHSVBLTE9LTFdMSUVFSElKSElLSExKSEZHR0lHSElFRkxJSktOTElQXFdeUFxbYF5NWFlTXFxiXk1ZWk1YYVJKWWFaUl9kXGFYW2RkVlZYXFlaWFxWWVxdYl5kYGFfZWhrZ210dHFxdHBxcoGGhoaFhoWFhYaGhoR9cmtpb3Jzc3N0d3l5eHl4d3h0cXhyeHNxcnVydE9CQ0VMTUJEREJFSUVHR0ZLSktIRUVKSktGRUhIUEpNTUpNU0hHRUFIRkpJS0tJTEpIRkVJRkRGR0VFSkhDSk1LTFVfWWBYYGFbYFRYWVReXlpfUllcUF5cWU5eXF5TWl5jXlpdYGNgWV9iW2BeW1RYV1leXWNiY2FjZmhla3Jwb3Bwbm93hoaFhYaCe4CFhYaGhYaFf3VxcHJyc3Z5eXp5eXh4eHdyeXZ4cnF4dnR2YVNKSk1JREJCQ0dIRUhHSEtJSUlERktLS0ZGSUpOS05MSExOR0hGPkdHTElLS0pMS0lHRUlEQ0REQkZKREBKTEpPW2NZX15hX1JUUldfYFxdWV5RWVxNVl9XS1FZW1BaX2FhXV5jYWBiYmJjY2VaUVlWVVxZXWNgX19jZGJob21ubGxsbHWFf4SDeXV8hIWFhYaGhYWGhoN9d3JydHd5eXl5f359eXV5dnZybnp3dnhYUUtGQ0dFQkVISUZHSEhGRkpHSEZIS0lMRERLSk1NTEtISkpISkY/R0ZOSktLTUtLS0lHR0NEQERBSElCP0lKSFBdYVpbZF1fVFFSWF1cXFxfWktXXExSXFlJTV5RT1xfYWNjY2NiXGRjYmRjZlhRVVRSW1daYF9eXmFhX2Rsa21qamxudn51gXp8hIWFhYWFhYaGhYaFhoaGgnpyc3V1e4WHh4eGhYSBfnhwend2eFxSTUNASUZDRktKRkZGSEdGSUZGRklMSk5GREtKTE5KTElLSkhJRkJISFFNS0tPTUtLSUhHRUQ/RUNISEFBR0ZFVF1ZXlhfWV9bXVVYWFBdXVFLSlZeWF5bXVVZYFJRX19iYmBgYmJgY2JhZGRiWE9RUVFaUltdXV1dXl9fZGhnbGpubnB7e3x+e4CCg4SFhYWFhYWEhIWDhISHh4FzcneFh4eHh4eHh4eHh4WDgHx4XFNLQ0FHRkRHTVJIQ1FKRkhISEVGS0pNUEVGSUpLTkxMSUxMSUlHREhLUU9NTVBMTUtLSElDREFFREhHQkFHRURXVUVcVF5TVl9YTlRVTlpaTUpLVGBhW19YXl5hXU5ZYlxgYF9iY2JdYWJXX19UUE5PT1dRXVtbXFxeYGJmZmVsZm9vd3x7gHt9f4CEhISEhIWFhYODhYKDgoWFhnpvgYaGhoeHiIeGhoaFhYSFg35JTkZERUZHRElSYlBDVl5JR0dIREZNSlBQRUlJS0tOTEtLTEtKSkdFSk1RUU5PUE1OTE5IS0FEQUNERkRDQUVGQk1IQktMUE9OTEZNRkdJSkhHTEtNT1BJTE9QT1NPTFFTUlVaWVdZWFhkV09TVFBQTk1PVFNbWFhaXVxgYWRlY2dja2xwc3J6eX97en+EhISEhISEhIKEgH57gYOBfXuFhIaGh4eHhYWFhISEgoGAfUtJRUVHRkdES01dTEdHWExHSEpIR01MUVFJTEtMS05NVU5PS0tMR0dLUFNTTlBPTk9OT0hLRmBFRF9MRGZjRU1bSV5bcm1PTVVtWUxDUGBVa1dnSl1XVV5ETFFVTExTVlFSVFhXVFhVVFxVUGZaaGhkWFJqU1dWVFtcW2BgYWFhYmBmaGZua2hyenx9foGEhISEg4ODgX18enJ7gXp7f4KAg4SEhYWBhIWBg4N/fnp7TEhFR0ZIRUVLT1NJSkZgU0hKT0pJT01SUUtNTExPUlVST09KTE5HSE1RW1lPUFBOT1BPSUpRf1FJfFlZcXNYUG1IcW5vYVZQcXFzUENrc21xc3BTb19bblhdVlxYVWtoVV1WY1pgWVtgVlZYf2p0dXVfX3ZfWGFbXGZbX2FhYWFeYGJnbXBsYHB3dHiBgYKDg4J/fX6Adnh6bHZ+dHh+gHx+gIGChHyAg3p/gX9+d3dOSUVITU5CRExMRklLRVFWTEtPSUtSWFdRTk9PTVFUTk9RUEtLTkdNUFNbWlRRUk9QUFBKSFp4XVR4ZWhaUlRRdmd0bHBibmZqUXJPTXdtanJwc3JxcnBvb4BdZXp1eHFxenF+c31rdX1iUmh8ZXNzb3Nye3xvfXlvf3JfYGBiYVpgYGdrbmtibGZnbXd+gYCDfnt4d4B0dnppcn5udHx+d3h7foCDeHyAdXx/fHxzc05LRmBdR0FFTU1ISkpHSlBPTU1KTlZeWVVMUVNOWFpNU1NSTktPSVFSU1lXV1FUUFBQUUtIZ3hsY3hybVtLTVV5cHVtdWJudlBkZUpmdnFtd2+AamZ4eGlXclFoem1panp6fWx4en9vaG9ZdnZqdXVwgWByZ3xpbHh8b15fX2JhW11iZGdpaWRnYmNkbGxwcHN0c3NzeXFyeGJsdWdyeXtzc3V5foFzdXpufH15eHJuTktTdE5DQkVQUEhKS0pLUE9PT01QWmBaWEtUV1BhXlJWUVlSTE9JU1RVWFdXUFVQT05SSktyb3V1cXVxZGliV25McXBeRmh5V3ZUTGl5fXhgeXtzbmFdbW9jUmhxdW5teXB3bHZ0dHFsbV10fnprbXl8a3RsfGtwdnV4Xl9fYl5dX2RkaWdoZWVeYWJpaWlqa25va3FubWpwYWNmZG93eG9tcHN5fm5xcGp7enRyb21MTFtWSEdFR1JQSUxNSktQUVBQUFFXXFhVTVVZVWZYUlJZXlNMTklUVFZXWVdPU05OTlFIUm1IaXdLYGR2dlZYbE9ubHtzYWpnfnZVTFdraH1sbWx4X1twenteYHpzY3JveHFoZXxpcntdVUxsYHZ1a2l1e3ttfnhrfHBdXl5iW19iZGRnZWVlYlpjY2lra3JzcndnbGloZGdgYWthZ3NybGdtbXJ8a21oa3t0bW1rbU9ISktISUlIUVBMTk9MS1JSUk9TUldSVlRQV1tWVlRUVGFgUE5NS1RTU1FVVk5OTE1PUEpIUU5QVUxLS1NUU1JUUFZVUVFOUVFYWFJOUFVUWFhYW1pVUlNXW1dYV1pPU1VXV1hSXVlXXVZUUFlSV1dXV1heW2dyXltbWVxdX2NaX2NjZGZkY2NiWmNjZmZlbW5tdWVlZ2NhZl9dZ2BkbGhmZ2tocHpoZ2drdWpoZ2lsUUlLTExNS0pTUU1RUE9MVlVUUFRVWFVZVVFaXVZVVFdVWVhQT0xNVlRQTlVTTk9NTFFQS0pSUUtRTUtLT1JVUlFRU1NJSExOT1FSUVFRVFZSWFdcV1NTUFFVVVZTWlFPU1JXVlRZVlRZVVRSVVRUVFdYV11aXmFdXFpaXFxgY1tdYmNkZmRlZGFZYGFjYWJoaGluY2FkXl9jXVpkXGJtYV5mZWZtc2RpaGtrZWRjZmhQSktMT09MTVNQTlNRUU1YV1VUVVdXV1pVU1xgVldWWVVYU1FQS09XU1BOVVBOUU5LU1BNT1VTTlJOTU5RVFBUUVNUVU5LTU9RVFRSUlFWV1RZWltZU1VSVFdXV1lbVE9UVVhVVVpVV1lVUlJYVlVXW1laX11VWF5cXl1cXWFhXltiYmNnZmRkYlhfYWJeYGhlZmRhXl9dXV5aWl9aX2dgXl1dYmhrYWdmaGZkYGJjYVBLTUxQUUxPVE9PU1FPUVpZWFdYWlpYWVZcamRWWFlaV1ZTVE9KTlZUUE9UUFBQTk1RUVBSWFRRUU9NT1NWTldSVFVVT05NUVNVVVRUUlRXVlpdXFpWV1FSV1hWW1tXUVRWVlZWWVRYWFVSUlhWVVpdWV1fXlZeXV5gXFxgX19fWmJiZGhnZGRiWWJgYl5eZmNjYGJdXFxcXFlaW1hbYVteXVxfYl9fYmRlYmRfX2BcUE1OTlJRTVJST1NUUVBVXFpaV1tbXFlaW2RxbWhkXltZVlVXUUxNVlNNTlJPUVJPTFBTUlVaVVNQUExQV1ZRV1NTU1hNT1BSVFhWVVVTVVlYW15dW1tWUk9VVlZbW1dSVFdWV1hWVFhbVFNSWldWXF5aXl9gVWFcYWFeYGJfXWBdY2BjZ2hkZmBaY2BhX19lZF9gY1taXFtcWVpYWVdcWVxbYF5fW15eYWBeYlxZYFpRTk9OVlFQVFJPVVRTUFdcXVxYXlxfV1xeanF3eYBiXFtWVlhRTU9WU05RUVBSVFJLUVRUWFpXVU9STlNYV1RTVVJSWk9QU1NWW1ZWV1RWWlhdXltbXlZTTlRVVlxcVlJUVlZYWVNUWVxUU1NdWFpdXlxgYGBWYltjYl5hY19cYmFiX2NmaWRmXltkYGFgYWNkX2JfWVpeW1xbWVhZV1daWlphXF1bXVxcWl1gV1tbWlBPT09ZUFVVUlFXUlRQW11eXltgXGBVXF1panJ9c2xnXFVYV1BOUlpTUlFTUlRVVEtRV1ZbWlpTT1NSVlZWVE9XUlNaUlRUVFhdV1hYU1hcWF5dWVpdVFVOVldXXltYUlVVWVlZVVdZXFRTVl5ZXV1gXWJiXllfW2ViX2RkXl5jY2FeZWZpZGZeXmRhYGFhYmRgYl5YWl9bXFtYWFhYV1taXGBcW1tcW1haW15WXlldUE9PUlpQWlRVVlZUVFReXmBfXmJcYFVdXmJreXRsfWxaVVlVUVBTXFRVVFVUVllXTFJaV11aXFJPVVNYVlZUUFhSU1dTVlVVW11YW1lVWl5YX15ZXFlSV1JZWFlfWlpUVVZaWVpXWFpcVlRaXlxeYGFfZGNcXl1dZWFhZmReXmRjYFxnZGhlZGJfZGFfYWBiYl9gXldYXlpcXFpZWVdWXVpdXlpZW1xbV1lcXVZYV11TT1BXWVFdVVZZV1dVWF9fYWFgY11gVF1fYmVldYF6aFhZWVNWU1ZcWFdXVlZXXVhPVV1aXl1dVFJXU1dWVFNUWFJTVlRYWFhdXlhdW1ZdX1hfX1hdVlFZVFlaWmFZXFVWWFtaW1lZWlpYVl1fX15jYmFkZFxiXGBmYWRmZF9gZGJiW2ZjaGVjZmFmX19hYWFhYF9eVlVdWVtcW1lbWVldW1tbWFhZW1laWl1fXVRZXVVOVFpWU1xUVldZVlZcYGFiY2FjXl9WW2BkYV96dW9oWVxaVVhUV1taWVxZWFlgV1BWXlxgYVxUVFhQVVdWVFZXUlNVV1paXF9eWl9cVl9fWl1eWV5WU1lXWVpdYlpeVldbXFtcW1tZWllaX19gYGRiY2RlYmRaYmZjZ2ZlXmFiYGNeYmNpZGNnX2deYmJjYWFgXl9YVFtaWltbWFtYWFxbWltXV1lYV1xbXGBdVl1dU1BWWlZWWlVYVVhXWF1fYmFkYWRgXllZYWRiYGxmaF5cXVtWV1hZXFxcX1tZW2JWVFheXWFjXFJWWVBXVldXV1ZUVlRYXFxeYGBdYVxXYV5bXlxbXlhWWFhbW19gXF9YWV1cXV5eXFpcWFtgYV5gZGNkZWVmYlljZWVoZ2ReY2FgZWNdZWlkZWlfZ15jYmNhYWBfX1tYWVtZWlpYWVhXW1taW1dYWlRZXVxaYFxVXmJOUldZVldaWFtcWFdZXmBiYWVhZGFdXllhY2JfYWBgXlxcXFdXW1tdXV9fXFpdY1haWF1gY2RfUlhZUFdXWFlZV1ZXVl1dXmBhYF9iXllhXV1eWV1eWVhWV1tcYF5dX1paXl1eXmFcW1taXF9iXmJkY2VmZWZiWmRmZmlnY19jX2FmZVppaWNmaWNlXmJiY2FgYF9dXVpXW1lZWFhaWFdaW1pZV1hWVVtdXV1gYGJieExXV1xZV1xbXF1aV1xdX2BiZGJiYV1gWGJjYmFjYWJdW1xbWFdbXF9dYF9dW2BkXFxYWmJlY2BSXFpPWFhaW1taV1pZYF1gYmJgYWNfXGJdX11bXl5ZWVVYXV5fYF9fXFpeXmBiY1xcV1xeYGJiY2VkZmRlZmRcZWZnaWZjYWJcZGdgXGlpYmhpZmVgYmFjYV9gX11dW1lcWVhXWFlYV1xbWldXWE9YWl1hY2Zmcmt/SllXXVpaX1xbXlxYXVteX2FjYmFhXWJbYmRiYGJiYlxbW1pXWGlxYFxgX11cYWNfXllZY2VkYVNfWlJZWFxdXVtaW1tjYGJiY2BiZGFgY15gXF1eX1pYVltfXl1hYV9dW2BhYmViX11UXGBgY2RkZmVnZWZmZV5lZmhoZ2RkYFtlZ15haGhiaGhmY2BiYGNiX19fXV1cWltZWFhYVlpWXFpaVlZVTVhXXGdpa2h1eIF2dnZ2dnZ2dnZ2dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6e3p6ent7e3t7e3t7e3t7e3t7e3x7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHt7e3t8fHx8fHx8fHx8e3t7fHx8fHx7e3t7e3t7fYmIhoqHhYKBgoOCg4OCgoKCgoKCgoKCgoGAgYCBgICAgYCBgYGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t6e3t7e3t7fHx8fHx8fHx8fHx7e3t7e3t7e3t7e3x7e3t7e3t7fHx8fHt7e3t7e3t8iYmHiYaFgoGCgoGCgoKCgYKCgoKCgoKBgYGAgICAgICAgIGBgYB9fHx8e3x8fHx8fHx8fHx8dnV1dXV1dXV2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eHh5eXl5eXl5eXl5eXt7e3t7e3t7e3t7e3t7e3t7e3t7e3p6enp6ent7fHx8fHx8fHx8fHx7e3t7e3t7fHx8e3t7e3t7e3t7fHx8fHx7fHt7e3uHiYiJhYSDgYKCgoODgoKCgoKCgoKCgYGBgICAgICAgICAgYKBgH58fHx8fHx8fHx8fHx8fHx2dXR1dXV1dHV2d3d3d3d3d3d3d3d3d3h4eHh4eHh4eHh4eHh4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t7e3t8e3p6enp6enp6enp6e3t8fHx8fHx8fHx8fHx8fHx8e3x8fHx8e3t7e3t7e3x8fHx8fHt7e3t7e4aJiYiFhYOBgoKCgoOCgYKCgoKCgoKBgYGAgICAgICAgIGBgYCAfnx8fHx8fHx8fHx9fX18fHjF1NLS0tLUk3t9fX19fYSMi4uLi454KSkqKiopKz0/Pj4+Pj5tgH5+f397pdfT09PT1r2GiYmJiYmJjI2NjY2Ni7DBvr6+vr3K09LS0tLWun1+f39/f359fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx8fHx8fHt7e3t7hIuHh4aHgoGDg4GCgoKCgoKCgoKCgoGBgYCAgICAgICAgYCBgIB+fHx8fHx8fHx9fXx8fH19eNXn5OTk5OeZe39/f39+hpCPj4+Pk3kZGhoaGhocMTMzMzMzMmqCf4CAgHut6eTk5OToyomMjIyMjIyPkJCQkJCOu87Ly8zMy9vm5eXl5enHfX5/f39/f319fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e3uCjYeIh4eDgoSCgYKCgoKCgoOCgoKCgYGBgICAgICAgICAgICAgH58fHx8fHx8fXx8fH19fX12fn9/f39/f3l3d3d3d3d4eXl5eXl6eG9vcHBwcHBycnJycnJyd3p5eXp6en6Dg4ODg4SBfHx8fHx8fX19fX19fH2AgoKCgoKChISEhISEhYJ8fX19fX19fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e4CMhomHh4SDhIKCgoKDgYKCg4KCgoGBgYGBgYCAf4CAgICAgICAfnx8fHx8fHx8fX19fX19fXZ0dHR0dHd0dnd6e3h7eHd2eHt4eXl5fXp5eXh4eHh5eXl5enp5eXl5enp6eXh4eXl5eXl7e3t7e3t7e3t7e3p6enp5eXl5eXp6enp6enp6e3x8fHx9fX19fX19fX18fH19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8f4uHi4qIhIODgoKCg4KBgoKDgoKCgYGBgYGAgIGAf4CAgH+AgYF+fX18fHx8fHx9fX19fX19d3d3dnZ3fXh3d316eH14d3d5fHx7fHt9fHh3d3d3eHh4eHh5eXl5eXp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fHx8fHx8fHx7e3x8fHx8fHx8fHx+iomMjImFg4SEgoKDgoGCgoKCgoKBgYGBgYCAgICAgICAf4CAgH19fXx8fH19fX19fX19fX13d3d3d3p9eHt4fHx3e3h3d3d5fX19fX59eHh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fX19fXx9fX19fX19fX19fX19fHx8fHx8fHt7fHx8fHx8fHx8fH2Kio2NioWDg4SCgoKCgYGCgoKBgoGBgYKBgIGBgICAgIB/gIGAfXx9fX18fX19fX19fX19fXd3d3d3fX55d3d4e3p7eHd3d3x6fXx9fnx4eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt8fHx8fHx8fHx8fHx8fH19fX18fH18fH18fHx8fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8foqJjo2JhISEg4KCgoKBgYKBgoKCgYGBgoGAgYKAgICAgH+BgIB8fH19fX18fX19fX19fn5+d3d3d3d5fHl7eHx9eXt5enp6fnt8fHt+e3h4eHh4eHh4eXl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt7fHx7fHx8fHx8fHx8fXx8fX19fX19fXx8fHx8fHx8fXx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx/iIeNioeFhoaDg4ODgoGBgoGCgoGBgYGCgYCAgoF/gICAf4CAgHx8fX19fX19fX19fX5+fn53d3d3d3Z4eHl3eXp4enh5eXl8enp6eXx4eHh5eXh4eHh5eXl5enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX18fH18fH19fX19fH19fX19fHx8fHx8fHx8fHx8fX+HiIyIhoeHhIKDhISCgYKBgYKCgoGBgYKBgIGBgYGAgIB/gIGAfHx9fX19fX19fX1+fn5+fnd3d3d3d3d3d3d3eHh4eHh4eHh4eHl5eXl5eXl5eXl5eXl6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fHx8fX19fHx8gIeIi4eHiYaDg4SDg4KBgYGCgoGBgYKCgYGBgIGBgYCAgICBgX97fH19fX19fX19fn5+fn5+d3d3d3d3d3d4eHd4dnl5eHh4eHh5eXl5eXl5eXl5eXl5enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fH19fXx9fXyBhoqKiYmIhIOFhISCgoGBgYGCgYGCgoGBgYCAgYGAgIGAgIGBf3x8fX19fX1+fn5+fn5+f394eHd4eHh4eHZxZGpeam15eXl4eHl5eXl5eXl5enp6enp6enp6enp7e3t8e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIGFiYqJioeEhYWEg4KCgYGBgoKBgYKBgYGBgYCBgYCAgYCBgIF+fH1+fn5+fn5+fn5+fn9/f3h4eHh4eHh5bWRiZV9fXm95eXl5eXl5eXl5eXp6enp6enp6enp6e3t7e3t7fHx8fHx8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goWKiomJhISGhYSDg4KBgYKCgoGBgoGBgYKBgIGBgICAgICBgH58fX5+fn5+fn5+fn9/f39/eHh4eHh4eW5kZWdlZGJeZnh5eXl5enp6enp6enp6enp6enp6e3t7e3t7e3x8fHx8fHt8fHt7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChouJiIqEhYaEg4OEgoGBgYGCgYKCgYGBgYCAgYGBgIB/gIGBf3x8fn5+fn5+fn9/f39/f394eHh4eHl3Z2VkZWZkZWFfaXl6enp6enp6enp6enp6ent7e3t7e3t7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHt8fHx8fHx8fHx9fX19fX19fX19fX19fXx9fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4eJh4SEhoSDg4WBgYGBgYKCgYGBgYKBgICAgYGAgYCAgYF+fHx/f35/f39/f39/f39/gHl5eXl5eWtlYWJlZWFlZV5ieHdze3p6enp6enp6enp6e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fH18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19g4aLhoiFhYaEgoOEhIKBgYGBgoKBgYKBgYGAgYGBgYGAgIGBgn98fH9/f39/f39/f3+AgICAeXl5eXl0Y2NlZGNmY2doZGZsZF5ze3p6enp6enp6enp6ent7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn6DhouGhoaGhYODg4SDgYGBgYGCgoGBgYKBgYCAgYGBgYCAgYGBfnx8f39/f39/gICAgICAgIB5eXl6d2RhY2diYmRdW2VfYV1eYGFoeHp6enp6enp6enp6e3t7e3t7fHx8e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+foSFi4eGhoaGhIODg4KBgYGBgoKCgYKBgoGAgIGBgYGAgYGBgYF+fX1/gH+AgICAgICAgICAgHl5eW9vYmJiZF5jZ19dYWFgXF9kYlttfHp6enp6enp6enp7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7fHx7e3x7fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5/hIiLhoSHhoaEhIODgoGBgYGCgYGBgYKCgYCAgYGBgYGBgYGBgX5+fYCAgICAgICAgICAgICBeXpwXWJlZGJkXmZnZ2BZYmJhY2VfXF1ze3t6enp7e3t7e3t8fHx8fHx8fHt7e3t7e3t7e3t7e3t7fHx8fHx8e3x8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fn19fn5+fn5+fn5+fn5+foCFjIqEhYaGhYODg4SCgYGBgYKBgYGBgoKCgYCBgYGCgICAgIGBf35+gICAgICAgICAgIGBgYF5emxiZGdjYmdmYWBgZGFiZWRjZGNeXGJ1fHt7e3t7e3t7e3x8fHx7e3x8fHx7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/gYeMiYWGhoeFg4SDgoGBgYGBgYKBgoKCg4KBgIGBgYKBgYGCgoF/f36AgICAgICAgIGBgYGBgXp7dGdnZmZkZGZmYF5fYWNlaGRlXmJkYHR8e3t7e3t7fHx8fHx8fHx8fHt7fHt8fHt7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f3+CiYqIhoaIhoWDhIOCgYGBgYGBgoGBgoKCgoGAgYGBgoKBgYKCgX9/f4GBgYGAgYGBgYGBgYGBenptaGNjZ2ZnZWdmZmdiZWRlYmdbYmVgdnx8e3x8fHx8fHx8fHx8e3t8fHx8e3x8fHt7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f39/f4SJioiGiYeFhYSEg4KBgYGBgYGCgYKCgYGBgYGBgYKBgoGBgICBgH9/gYGBgYGBgYGBgYGBgYF7emlpZGNqZmFgZmVjY2NnaWRjYmBiZGJ0fXx8fHx8fHt8fHx8fHx8e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f39+fn9/f39/f39/f3+AhIqMiIeJhoSFhYOCgYGBgYGBgYKBgoGBgYGBgYGBgoKBgYGBgYGAgH+BgYGBgYGBgYGBgYGBgXZzZWRnY2RmZWJlZmdkZmhmZWNgYGNkYHF9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fXx8fHx8fHx9fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/fn5+f35+f39/f39/f3+AgICFioyJiIqJhoaDgoKCgYGBgYGBgoGBgoGBgYGBgIGBgYGBgYGCgX+Af35/foCCgoKCgoKCgoKCc3NnZWRkZWlqaGZnZ2NhZmZlZmdmZWVjdX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fH19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gICAgICAgIWLioqJioeHhoSCgoGBgYGBgYKCgYKBgYGBgIGBgoKBgYGBgYGAf4B+dHRzdX1/goCAfn5/gYB0cmdkZWNmaWppZWNlY2BmZGRnZ2JiZWFwfXx8fHx8fHx8fHx8fHx8fHx9fX18fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f39/f39/f4CAgICAgIB/houLiouLh4eHhIOCgYGBgYGBgYKBgoKBgYGBgYKCgYCBgYGBgoCAgH5zc3NzdHV4dXV0dHV2dXVwZmNmZWhoaWdoZ2VmZWJfZGVmY2BiZ3d8fHx8fX19fX18fHx8fH19fX19fX19fXx9fXx8fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gIB/f3+AgICAgICAgICHjIyIi4qHh4eEhIKBgYGBgYGBgoGCgoGBgICBgoGBgYKBgoKCgYCAfnNzc3Nzc3NzdHR0dHNzdW9jY2FnZWhoZ2pmZGVnZmhmY2JlYl5ieX18e3t8fX19fX18fHx9fX19fX19e3x9fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn9/fn5+fn5+fn5/f39/f4CAgH9/gICBgICAgICAgYCAf4CAgYGAgIeLi4iNiYiJhoSFgYGBgYGBgYKCgYKCgYGBgIGCgoGBgYKBgoKBgIB+dHNzc3Nzc3Nzc3Nzc3N1cmdlZWRlamhoZ2ZpaGdjZWViZGNoZGd7eHVzc3R2dnl4dnR0dHZ3d3d2dHR0dXV4d3h4d3d6e3x9fXx9fn5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f35/f39/gH9+fHt7fX58eXl2dnZ5fHx6end2d3l7fXt4hIyMioyHh4iEhYSBgYGBgYGBgoGBgoGBgYGAgYKCgYGBgoGBgoGAgH51c3Nzc3Nzc3Nzc3Nzc3VzaGVnaGVrbGhqZ2lqZ2dnZmRkYmVkbnV0dHNzdHNzc3Nzc3Nzc3Nzc3NzdHNzc3Nzc3Nzc3N0dHV1c3V3eHl7fn59fn98f39/f39/f39/f314fH5+fXx4dXZ3eXd4dnRzc3N0dXRzc3Nzc3NzdHNzc3R0c3R0dHODjI2KiYeIhoOGg4GBgYGBgYGBgYGCgYGAgYGDgoKBgYCBgYGBgICAf3VzdHRzc3Nzc3Nyc3NzdnZpY2hqaGpsZWZpbGhgZmVkY2BkZGZ0dXV1dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHRzdHRzc3Nzc3R2dnV1d3V4fH9+fX9+fHp4dXN0dXV1dHNzc3Nzc3N0dHR0dHR0dHR1dXR0dHV1dHR1dXR1dXV1dIaMjYuIhoeEhIWCgYGBgYGBgYGCgoGAgYCBgYKCgoGBgIGBgYGAgIB/dnNzc3Nzc3Nzc3Nzc3N2dnNnZ2pmaGdmaGhmZGlnY2NnZWVmcHZ1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dHR1dHR0dHR0dHRzdHR0dnV1d3Z0c3R0dHR0dHR0dXV1dXV0dXV1dXV1dXV0dHNzc3N0dHNzdHR0dHR1dXR1iY6MjIqHh4SEhYKBgYGBgYGBgYKCgoGBgICAgoKCgoGBgYGBgYCAgH93c3Nzc3NycnJyc3NzcnZ2dW5kXWNnZWlraGVoZ2dqamlnZXB2dXV1dXV0dHRzdHR0dHR0dHV1dXV1dXV0dHV1dHR1dXV1dXV1dXV1dXR0dHV1dXV1dXV0dHV0dHV1dXV1dXV1dXV1dXV1dXV1dXV0dHNzc3Nzc3N0dHNzc3Nzc3R0dHR0dHWKjoyMiYaGhIeFgoGBgYGBgYGBgoKBgYGAgYGCgYKBgYGBgYKBgYCAf3hzc3Nzc3JycnJyc3NzdnZ3d2liaGhnamtpaGZkZGVmaWhwdXR0dHRzc3JxcnJ0dXV0dHR0dHR0c3NycXFxcXNzdHR0dHR0dHR0dHV0cnJyc3R0dHR0dXV1dXV1dXR0dXR0dHR0dHR0dHR0dHR0c3Nzc3Nzc3Nzc3Nzc3N0dHN0dHR0dHR0dYuOjImGhYWFh4SCgYGBgYGBgYGBgoKCgYGAgIKCgoGBgYGBgYGBgIB/eXNzc3NycXJycnJzc3N3d3d3bGpoZGhpa3Z6a2VmZWhnbXJzdHN0c3JwcHBxcnN1dXR0c3NycnJycXBvb29vcHFzc3NycnJyc3R0dHNxcHFyc3R0dHR0dHRzc3Rzc3NzdHR0dHRzdHR0dHR0dHRzdHR0c3NycnFxcnJzc3Nyc3NzdHR0dHN2jZCMh4eFhYSEgoGCgoGBgYGBgYGCgoKBgYGAgYGCgoGBgoKBgYGAf395c3NycnFxcnJycnNzc3d3d3dzc2pnaWloeX99cW51bG5wcXJycnFxcG9wcXFxc3R0c3RycHBxcG9ubm1ubW5ubnBxcnJycnJycnJzcXBvb3BxcnJzc3JxcnJycnJycnJycnJzc3Jzc3Nzc3Nzc3Nzc3Jxb29ubm9vcXJzc3Jyc3NycnNzcnaPj4uHhoWFhYOCgoKBgYGBgYGBgYGBgoGBgYGCgoKBgoGCgYGCgX9/f3hxcHBwcXFycnJyc3Nzd3d2dnd2cnF0c252f352c3hwcHBycnJycXFwcHFxcXJzcnN0c3Fzg3Fvb25ubm5ub25vcHBxcXFxcXBwcXJwb25vcHFxcXFxcHBxcXFxcXJycnJycnJycnFxcnFxcnJycnFwb29ubm1ubW5vcXJycnJycnJyc3JxeI+OjYaDg4aEgoOCgoGCgYGBgYKBgYGCgYGBgYKCgoKCgoKBgYKBf4B/d29wb3BxcnJyc3Nzc3J2dnZ2dnZ3dnZ1c3l/fnd3d29wcXFxcXFxcHBwcXJycnN3c3Nyb4ORb29wb29vb29vb29wb3Bvb29vcHBxb29vcHBwcHBvcG9wcHFycXFxcnJycnFxcXFxcXFxcHBwcHBxb29ubm5tbW5tbm9wcXFxcXFxcXFxcXB7j42NhoODhYOCgoKCgYKBgYGBgoGCgYGCgoGCg4KBg4KBgYGAgYF/f392bm9wcHBxcXFxcXBwcHZ2dnZ2dXR0c3NxfYB9fX9zb3BxcXFwcHBwcXFwcXFycZGEcHJwl49ucHBwb29wcG9vb29vb29vb3BxcXBub3Bwb29wb29wcnJycnFxcXBxcnFwcXFxcHBwcHBwcHBwb29ubm1ubm5ubm9ub3BwcHFxcXFxcXFxcIKRjoqEhIOFhIOCgoGBgoKBgYKBgYGBgYGCgoKCgoKCgYGBgYCBgX9/gHVvb29wcXFxcXBwcHBwdnZ2dXRzcnJycnGAgoCBeXBwcHBvcHBwcHFxcXFwcXJwiKR1b3ukkG9wcHBwb3BxcHBvb29wb29vcXFwcG9wcG9vb25vcHFxcHBwb3Bvb3BwcHBwcHBwcHBvb29vb29vbm5tbW1ubm5ub25vb3BvcHBwcHBwcHBwiZCMiISDhIaDg4KCgYGCgoKCgYGBgYCAgYGBgoKBgYGBgYGBgIGBgH+AdG5vb3BxcXFwcG9vcG92dnVzcnFxcXFxcICDg39ycHBwcHBwcHBwcHFxcHBxcXCBr4xth6eScHFwcHFwcHBwcHBwcHBvcHBxcXBwcHFxb29vbm9wcHBvb29vcHBvb3BwcHBwcHBwcHBvb29vbm5ubm5ubW5ubm1ubm9wcG9vb29vb3BzcXWPj4uJg4KFh4ODgoKBgoGCgoKBgYKBgYGBgYGBgYGBgYCAgYGAgYGAf4B0b29vbm9vb29vb29vb3Z1dHNxcXFxcXJygIKCgXRxcXFxcXFxcXFxcXFxcXFycX2uonCPppVxcXFxcXFwcHBwcHFxcXBxcHBwcXBwcHBwcHBwcHBwcHBwcHFxcXBxcHBwcHFwcHFxcHFxcXFxcXJxcnFwcnRycnR0dHR1dnRzdHR0dXd3gpCPi4iDgoaHhISCg4GBgYKCgoGBgoGBgYKBgYGBgYGAgICBgYCBgYB/gHVvb29vb29vb25vb29vdXRzcnJycnJycnKDg4OCdnFycnFxcXJxcnJxcXJycnJxgrKpkKGxknBycXFycXFxcXFxcXFxcXFwcXFxcXFxcnNzcnJyc3V1dHR0dHR0dHV2d3d3d3d3eHh4eHd3eHh4d3Z3dnV2dnZ2d3h6e3x7e3t6enp6enyGkI2LiIODiIeHhYODgoGCgYKBgYGBgYKCgoGBgYGAgYCAgYGAgIGBgH+Ad3FxcXFxcG5ucG9wcG92dHV1c3Nzc3NzdYiDgoN5cnNzcnJyc3Jyc3Nzc3NzcnObqqKzp6uVcnRzc3Nyc3N0dHV1dXV1dHV3eHd3d3d4eHh3eHh4eXl5eXl4eHl5eXp6e3t7e3t6enp5eXh3d3d1dnV2dnd5enp7fn5+fX1+fn5/f35+gIyQi4qHg4WIi4iEg4SDgYGCgYGBgoGBgoKCgoKAgYGBgYCBgYGAgIGAf4B8enp5eXx5eHh2dXZ2dHl2d3h3d3Z3dnZ6fnx+fnx2dnd3dnV4enh4eHh4eHh3faego7CfnKGBe3l6eXh4eXl6enl5eXh4enp5eXh4eHh3dnd3eHh3eHh5eXp7e3p8fH1+fX9/f359e3t7e3p5enl5e3t/foB/fn5/fn19fX5+f35+fn6AjpCNioeEhoqLiIaGhIOBgoKBgYGCgYGCgoKCgoCBgoKBgYGCgYCBgIF/f4B/fn19fX9/f318e3t7eXh4eHh5eXl4eXh5eXl4enp6enp6e3t7fH1+fXx8fHyIppebrKCjooh6enl4eXh4ent6enp5eXp8fHt6enx8fHp6ent9fHx+fn+AgoGAgYKAgH9/gYGBgIB/f35+fn5/fX1+f4CAf35+f39+fn9/f39/gH+Af4OQjoyHhoWIi4yIh4aFg4GCgYGBgYKBgoKCgoKBgYKDgoGBgYGBgIGBgIB/goOCgoGBgX99f39/f4F6enh4d3h4eHh5eHh5enp5e358enx9fXt8fX19fX59foigkZCem5WYj35/f319fYCDgoCAf318fXx9fXt9fXx8fH19fX1+gYGChISDgoB/gYGBgH9/f4B/f39/f39+fn9/f39/f35+f3+Af39/gICAf4CAgICAhJCPi4eGhoiLi4mKhYaDgoKCgYGBgoGCgYKBgYGBgoOCgYCAgYGAgIGBgH+ChIKCgICAgH9+fn+AgH9/fn18fX19fYB/fX+Af35/gH9/fn9/gICBgICBgYGBhqipoZqemZiUfICBgH5/f39+f4B/fn5+f39/gYB/f4CBgYCAgYOEgoGCgoGCgH+AgYCBgYGAgH+BgICAf39/gICAgYGBgIGBgYCAgICBgoGBgYCAgYGFjo6MiYaHiYyLi4qGhoOCgoKBgYGCgoOCgoKBgIGBgYKCgICBgYCAgYGAf4KFg4KBgYCAf39+fn+AfX5+fn19fX5/fn9/f35+fn+AgYCAgICAfn9/f3+BgIKVsKWmoZ+iqqWJfn19fn9/fn5/f35/gIGBgoKDg4KCg4KBgYKDg4OCgYGBgYKBgoKCgYKBgoGBgYGBgoKCgYGCgYKCgoGBgoKBgYKCgoKCgYGBgoKCgoaPkY+KiImKjY6NiYaFgoKCgoKBgYKCg4KCgoGBgYGBgYF/gIGBgYCBgIF/gYWEg4KCgoGCgYCAgIB8fHx7fH18fH9+fn9+fn5+f35+f39/f39/gH+AgoePobKqnqahn6CiqKuglIuEgYB/gIF/f39/f3+BgYGCgoCAgYKDg4SDg4ODgoKCgoKCgoKCgoKCgoGCgoKDg4OCg4ODgoKCgYKCgoODg4ODgoKCgoODg4KCh5KTkIuKi4uPj42Lh4SCgoKCgYGBgoKDgoKBgYGBgIGBgICAgYGBgIGAgYCAg4SDg4OEg4ODgoKCgXx9fHx9gn1+f4GCiIGCgoSCgYGDg4GBgYKDgYaLmqmuqaOcpKGfoqGgoqSjno+CgYCAgICAgH9/f3+AgICAgH9/gYODhYSEg4SDgoKCg4OCgoOCgoODg4ODg4SDg4KEhYWDg4SEgoKDhIOCg4ODg4OCgoODgoCKlJOPioqMjpCPjYuGg4KCgoKBgYGBgoOCgYGBgIGBgoGBgICBgYGAgYCAgH+BgoODg4SEhIOCgoKCfXx8fn6AgYOAg4OChIaFhoaFhIWFg4ODg4SBgoOMmZ2Zmpqhm52ioJydmpOIg4KDg4KDg4ODgoGAgIKCgYOCgYKCg4OEhYWEg4OChISEhIOEhISDg4OEg4ODg4OEg4SDhIWEhISDg4ODgoKCgoKCgoKBgYKCgo+UlI+Njo6RkY6KiISCgoKCgYGBgYGCg4GBgIGBgYGBgYCBgIGBgYCBgICAgIKChIKChIOCg4ODgoJ9fX2AgH+AgoGDg4ODhIaEhIOEhYWDg4GBg4OCgIGEi5SWmZqMkp2bmpaMhoaHh4eGhoeHhoaEgoGCg4SDg4ODg4ODhISFhYWDhYSFhISEg4KBg4OCg4SEg4KCg4SCg4ODg4OCgoKCgoKCg4OEhIOFhYWFhoaIk5OTkI+Pj5KRjIqIgoKCgoKBgYGBgYKDgoKBgIGBgYGBgICAgYGBgICAgICAhISEgoKCgoGBgoKBgX+AgYOCgICAf4CCgoGDg4KCgYODg4SDg4GDhYSDgYKBhJCYlYiOmpqOh4eIiIiHh4eIiIiFhIOBgIGBgoKCg4GCg4SEhYSDg4OEg4OEhIOBgYGCg4OEhISDg4ODg4OEhIODgoSDg4ODhIWFhoeHh4eIiIiJiY6TkpKOj46RkY+LiYeCgoKCgoKBgYGBgoKCgoGBgIGBgYGAgICAgYGAgIGAgICDg4KCgYKCgYGAf4CBhYWFhoOCgYB+fn+BgoSCgYKDhIOCg4ODg4KChISDhISCgouWjZOXjIOCg4WFhYOEhIWFg4KBgH9/gIB/gIGEg4OEhYWEgoKCgoOCg4OFhIKDhISEhYaGhoaGhoWFhoeHhYaIh4aHiIeGhoaIiYeGhYaGhoeIkZKSj46QjpCRjImHhYGBgoKCgoGBgYGBgoOBgYGBgYGBgICAgICBgYCAgICAgISEg4KBgoGAgYGAgYKIh4aHhYSCgH99fX6AgH+AgYGBgYGBgoGAgYKDgYKCgoKCgYKQk4SCg4GCgICAf4GAgICAgH9+gIGBgYKCg4OEg4OEg4OCgoGBgoODg4SEg4SEhIOFhYaFh4eIh4eHh4eHh4eGhoaGh4WFhYaGhISEhIWEhYaSk5GOjo+OkI6JiIeEgoKCgoKCgoGBgIGCgoKCgoKCgYGBgYGAgYGBgICAgYGAgoSDg4KDgoGCgYKDg4iHh4iHhYSCgX5+gICAfn5/f4CBgYGCgoCBhI2DgH+AgICAf4iPf4GCg4OAf39/gICAgICAgICDg4KDg4ODgoOBgYKCgoOCgYKCgoOCgoSDhISDg4SEhYWFhYaGhoaFhISEhYWEhIWFhYSEhISDhISEhISEipSTkpCQj46NiIaFhIOBgYKCgoKCgYGAgYKCgoKBgoKBgYCBgYCBgYGAgICAgYGAg4OCgoOCgoKBgoOCiImJiYiHhYSDgYKEhIOBgoKCg4SCgoSEgoOJloiEgoSCgn+AipKAgoGChIOBgYGCgoODgoGDg4SDg4SEg4OCg4KDg4ODg4KCgoKCgoGDhISEhYSFhYWFhIWEhIWFhYWDg4OEhISEhYWFhISEhISEg4ODg4OOlZKQkZGPjYyHhYODg4GBgoKCgoKBgYCBgoOCgYCCgYGBgICAgIGBgYCAgICBgICDhYSEhIODg4SDhIOGh4mIhoWDhIODg4WDgYCDgoWFhISDg4OChI6YioOFhISEgoCOmIOCgoKEg4OCg4GBhIWEg4ODgoKDhISDg4ODg4SFhISDg4KCgoKCgoSEhYSFhYWFhYODhYWFhYaFhoWEhIWEhYWGhYWFhIWEhISDhIODhJGUk5KSj42MioWEg4ODgYGCg4KCgoKBgYGCg4KBgYKBgYGBgICBgIGBgH+AgIGAgYaGhoaGhoaHh4aGhYSDhYaCgIGBgYGHgoB+f4GBj4yDgX9+fXx9i5yNgIKBgYOCgZWahoKCgYKDg4GBgYKDhYODg4KDg4OEgoKEhIOEhIWEg4OCgoKCgYKCg4ODg4SFhYWFhIOEhYWGhYWEhISEhIOEhIWFhYWFhIODhIOEg4KGlJSSlJKPjYyIhISEg4KBgoODgoKDg4GBgoKBgoKCgYGCgYGBgYCAgYGAgICAgICAhYWFhYaGh4aGhoWGg4ODg4GAgoKCgYKAf35/f4GVl4mAfX19fXuBl4yAg4GBgYCLlZKOgIKBgoKBgYKDgoODgoOCgoKCg4OBg4SDg4ODg4OEhIKCgoKDgoKDg4ODhIWEhISEg4OEhIODg4OEhIODg4ODg4SDg4ODg4KDg4KDgouUk5KTko2NioaDhIOEgYGCg4ODg4ODgoGBgoGCgoKCgoKBgYGBgICBgYCAf4CAgICDhISFhYSFhYWEhIWCg4KDgoKDg4OBgICAgICAgJWfin5+gH2Hin2EhIOEgoODgo2JhY2CgoOCgoKCg4ODgoODg4KCgoODgoKDg4KCg4KDg4WEg4ODg4SDg4SEhISEhYWEhIWEg4SEg4OEhISEhISEg4SEhYSDg4SEhIODgoKDkJSSkpKPi4yIhoSFg4OBgYKDg4ODg4OCgYGCgoKCgoKDgoCBgoGAgICAgIB/gICAgISDhYWEhYWFhYSFhYOEhIWDg4SEhIKCgoOCgoSBkaGKf4yFfYaJgH6FhYWEhYJ/fX19f4KEg4ODg4OEg4ODhISEg4OEhISEg4SEhIOEg4OFhoWFhYSFhYWFhYSFhoWGhoWFhYWFhYWFhYWGhoWGhoaFhoaGh4aFhYWFg4SEhIeTk5OSkoyKiIWGhYWCgoGBgoODg4OCg4KBgYKDg4ODgoKBgIGAgICAgICAgH+AgICAhYWFhYWGh4eGhYWFhISFhYSEhISEg4ODg4OEhYOKkYOEi4WCgYF+fYGHhoOAfn5/fn9+f4OEg4OEhISEhISEhISEhISFhYWEhYSGhYWGhYaGhoWGhYWGhYWHhoaGhoaFhIWFhYWFhIWGhoaHhoaGhoaHh4iIiIaFhYaEhYWGjZSTkpGQi4qHhoeGhIGCgYKDg4ODg4KDgoGBgoODg4KAgYGBgICAgICAgICAf4CAgICHh4eGhoeHiIeHhoaEg4ODhIODg4OEg4ODg4OEhISEgYKCgYmBf359foWBf39/f39/f36AgISFhIWGhoaFhYWFhoeHhoaFhoWFhoeHh4iHh4eGhoaHh4eGhoeHhoaGhYSDhIWFhYSFhYaGhoeHhoaGhoeHh4eIiIeGhoaHh4eRlJORkZCLiYiFhoSDgoKBgoODg4ODgoKDgoKCgoOCgYCBgICBgICAgIGAgIB/gICAf4aHiIeHh4eIiYmIiIODgoKDgoSEhIWEg4KCg4SEhIOBgICAhIR/fn5/gH9/f39/gIB/f4B/f4WFhoiIiIeHh4eIh4iHiIiIhoaHiIiJiYmIh4aHh4eJiIaHh4eHhoeFhIOEhYaFhYWFhoaGh4eFhoeGh4aGh4eHh4eHh4eFh5OTkY+RkIuHhoWGhIKCgYGCg4ODg4ODgoKCgoGCg4KCgIGBgYCAgICAgICAf3+AgYB/hoiIiIiHh4iJiYmIg4KCg4ODhIWHh4aFg4OFhISDg4GAgIGMiYGAgYKCgYGBgYB/gH9/fnt6gIaHiIqKiYmJiImJiYmKi4qIiIiJiYqLioqIiIeIiIiHh4iIh4iGh4aEg4OFh4eHhoWFhISDhYWEhYWGhISEhYWFhoWGhYOJlJOQj5COioaEhoWDgYGCgoKDg4ODgoKCgoKCgoKCgYGBgYGBgYCAgICAgIB/gICBgH+GiYiIiYeIiImJiIiEgoKDg4KDhImKh4aEhIWEg4OCgICAhISCgoKCgoKCgH9+fX19fX5+fHt8g4eJi4uKioqIiIqJiImLiomJiImIioqJi4mHhoaGh4WGiIiJiIaGh4SDgoSIiIiIh4WCgoGDg4KDg4SCgYKDgoGEg4SDgY6TkpCPj4uIhYSGhIKBgYGBgoODg4OCgoKCgoKCgoGBgYGBgIGAgICAgICAgH+AgIGAf4WIh4eHhoeIiIiHh4SCg4OCgoOFiYqJh4WHhYSFhYKAgYOEgoOCgoKDgX59fX5+fn5+fn1+fX19g4eJioqHh4WGh4eHh4iHh4mGh4aIh4aJiYODhIOFhISFhYaIiIaFg4KCg4WHhoeGhoSCgoOEgoOEhIKBgoGBgYODhIODkZKQjo+Oi4eEhoaEgoGAgYGDg4ODg4KCgoKCgoKCgYGBgIGBgYCAgIB/gIGAf39/gIB/hYaGhYaGhoeHiIeGgYKEhIOChYeIi4qGhIaEgoaGgoKEhIODg4OCgoF9fH1/gH9+fn59fH19fHl8g4aGhoSDgYODhIWFhYODhYSEhISEhIWEgoKCgoSEgYKDg4WGhYSCgYGCgoODhYSEhIWEhIaEg4SFg4KDgYKDg4SFhIeSkY+Nj4yJhoSFhIWCgYCBgYODg4ODgoKCgoKCgoKBgYGBgYGAgICAf4CAgYB/gICAgICDhIWEhIWFh4eHh4aAgYGFg4OEhYSHiIWCgIB/gX9/gIODg4ODgoJ/fX1/gICBf31+fn19fX17enp+hISEgoCBgIGBgoKBf36BgYGCgYOBgoGCgoKBg4OAf4CAgoOCgICAgICBgYGDgYGChIODhYSCg4SDgoKBgoSDhYWGi5ORj4+Pi4iFhYODhIGBgYGBgoODg4KCgoKCgoKCgoGBgYCBgYCBgH9/gIGBgICAgH+AgIKCg4OChIOEhYWGhn+BfoCBgICAf4GDgn9+fn5+fX+Cg4OCg4KDgn19fn+AgIGAfn19fX1+fXx6enqAgoKBf39/f35/f4B+fYB/foCAgX+AgIF/f4CAgX59fX+AgX9/foCAgH+AgICAf4CCgICCgYGCgYGAgYGBgYKEg4aPkpCOj42Kh4eGg4ODgYGBgYGCg4ODgoKCgoKCgoOCgYGCgYGBgICAgH+AgICAgICAf39/gYKDhIGCgoOCg4SFgIB/fH19fn19foCAf31/fn1+gYODg4KCgYF/fX1+f4CAgH9+fX19fHt7e3p6enqAgH9/f39+fn1+f35/gH9+f3+Af4GAf359fn9/fn18fn+Af35+f3+Af39/f4B/f4B/f4CBf4B+f39/gH9+f4B/hZKSj46Pi4uHiYWEg4KCgYGBgYKDg4ODg4OCgoKDg4KAgYKBgYGAgICAf3+AgIB/gIF/f36BgYSEgYKBg4OCg4OBgH98fn9/fX6Af4B/foF/f4CBhIOCgYB/f359fn5/gICAfn19fXx7e3x6enl5eXuAgH+Af39/fn5/foCAf35/f4CAgoB/fH5+f35+fXx/f4B/fn9/f4B/f35/f4CAfn5/f39+f35/f35+fn19fX2Fk5KOjIuKiImIhISEgoKCgYGBgoOCgoOCgoODg4ODgYCBgYGBgYCAf39/f4CAgICAgIB/foCBhIOCgYGDhISDhICBgICBgIGAgYKCgoGBgoCBg4ODgYGBgYCAfn19fn5+f359fX19fXx8fHt6eXl5eH2BgICBgYF/f4B/f4F/gICAgYGCgoB+gH5/fn5+foGAgYF/f39/gIB/f4B/gYB+f3+Afn9/fn+Af31+fn17fIaTkYyLioeHioiGhoSDgoGBgYGCg4ODg4OCg4OCgoKBgICBgYGAgH9/f39/gICAgICAgH9+fn+BgYGAgISGh4aHgoODhYOBg4ODhYSEhISEg4ODhIKCgoKCgX9+fX19fn6AfX19fX19fX19e3p5eXl5eYCCgoKEg4CCg4GAgoCCgYGDgoODgYGCgIGAf4CBg4GEgoCAgYCBgYCAgYCCgn+BgIF/gIB/gICAfn9/fnx8ipOQiYmIiIiJiIaGhoSCgoGBgoKDg4ODg4KDg4KCgYCAgICBgYGAf39/f4CAgICAgIGBf359fn5/f39+g4aHh4iChYSFg4SFhIWGhYaGhoWGhYGBg4ODgoKAfX19fX19fn59fX19fX19fX18e3l5eXl4fIKDhIWCgYSDgoKDhYeCg4SDgYKCg4OCgoKCgYKFg4iFgoGCgYKDgYGBgYSDgoOCgoKCgYGBgIF/gIGAf36Ok4yHiIaIh4aGhYaGhIKDgoGCgoODg4ODg4OCgYGBgH+AgYCBgYB/gH9/gICAgH+AgYB/fn19fX5+f36Ag4SHiISGhoaFhoaHh4aHh4iHh4eGf32BgIGCgX59fX19fX19fX19fX18fH5+fnx7eXh3eHl5gIODf4ONhIOEhISXl4ODhIF9foGCgoGCgYKBg4aIjIWDgoKBhIKDg4KDhYSEhYOCg4OCg4OCgoKCg4KCgpKQi4iIh4mHhoaEhoWFhISCgYKCg4ODg4ODgoGBgYCAgICBgIGBgH9/fn+AgYCAf4CAgH9/fn1+fn+Bf4CCgYWFhYeGh4eGh4eIhoaHh4eGh4V+fX18fX9+fX19fX19fX19fX19fXx7iJKCe3x6fIZ5eHl8gYF+iZaEg4OEhJSTgIGBf39/fn6Fi4B/gICEhpCJhYSCgoGFhYuDgYKFhYaGhIOFhYOEhIODhIOFhISIko+MiYiIiYeHh4WGhYSFhIKBgoKDg4ODg4OCgYGBgYB/gIGAgICAf39/f4CAgICAgYGBf39/f4CAgIGBgYGBg4OGh4aGh4aGiIeGhoaFhIOFhH59fHx8fX18fH19fX19fX19fX18fH+RlZaDe3qElHx4eXp7fICCg4GCgYOCgH59fn57iJF8fI6Wf31/f4KGioWDg4SDgYONiX9+f4OEhYWDhYaFhIWFg4SFhYaEhI6Rj4yKioyJiImHhYWFg4ODgYGCgoKDhIODgoGBgICBgICAgYGAgIB/f3+AgIB/gICAgX5+f4GBgoKCgoODgoOCgoWGhISFhYSGhIOEg4KBgIKAfn19fHx9fXx8fH18fH18fX19fHx8e4uRl4x6e3yBenp6e3x5eX19foB/gH98e3t+fn2ClZF/hIh9fH5/goR8fIGChIKAf4eDfYKBf4KCgIODhISEhISChIOEhYGEkZGOi4yMjoqJiYWFhYODg4KBgoODgoKDg4KCgYGAgIGAgICAgICAgH+Af3+Af357gICBenyAgYKDhYODhYWFhYODg4SCgYKDgoOCgoGBgIB/gX5+fX59fHx8fHx8fHx8fHx8fHx9fHx8fn6Kgnt6e3p4ent7fH17fn1+f319fX19fH+BgX2Gj4F+fYJ+f36Agnx8gH+CgIKAfnx7ioJ9gH9+gYCAgYKBgoCAgIGAf4uUkIyLjo6MiIiHhYWEhIOCgoKCg4OCgoODgYGBgICAgICAgH9+fXx7fHx9f3+AgHx6gYF4e4CCgYOFhIOFhIaHhISAhpSIgIKBgYGBgH9/f39/fn5+gHx8fHx8fHx8fHx8fHx9fHx8fHx8fHl7e3t4eHl7e3p8goCBfn+BfH5+f359gIKCgICAgX+CkYF/f4CAfoB+fn9+gIGBfX19e319fXx9fHx9gH+AgH6Afn6ClJKNjY2Oj4qFhoaFhISFg4KDgoODg4OCgoGBgYGAgICBgICAf4CAf39/fXt6fICAgHh+gXd7gIF/goKCgoKEhoeGhn6IlYp+gYGAf4B/foB+f39/fn+Bfnx7e3x8fHx8fHx8fH59fHt9fHx8e3x8fHp6eXt8en2Fg4N/gYF+f35/gH6FgoF+gH9+foCFhoKAfn6Dhn9+fX6AgIGAf39+fX19fX57fH1/f3+AfX9+f4yRjYyNjo2Nh4SGhoWEhIODg4OCg4ODg4KBgYGBgYCAgYGAgYGBgYGAgH9/f397en9/e3mAd3p/f31/f3+Af4KDhoaFf3+FgX5/gIB/gH5+f31/gIB/f4B/f319fHx9fn18fH19fX19fH58fXx7fXx8ent6fH18f4aEg4CAgX1+fX5/fouEgYZ+fXx8f36CgX99fX19gXx7fXx+gYSDgYB+fn5+fXx+f399fn9+f36Eko2NjI+Ni4qGhIaEhIODg4OCg4KDgoOCgYGBgYGAgYGBgYB/fXx8fH1+f39/f397e399d352eH59fH18fX5+gYGCg4B6fX18fn6Af35/f35/fn+AgH+AgH9/fn9+fn5+fn1+fn99fH58fn1+fHt8fHx7e3p9fn+AhIOCf35/fHx8fXx8gYN+jH58e3t9fn1+fn17e3t9fHt7e3uAhoSChIOBf4B+f4KCgn9/goJ/gIuQjIyMjYuKiISEhIODg4ODgoKCgoKCgoKBgYGAgoGBgYKCf3+AgIB/fn18fH5/fn55fX52e3Z4fXx8fHt9fX6BgICAf31/f31+f39/foB/f39/f3+Af4GBgH99gH9/fn9+fn5/f3yCfX59fX17e319fHp8fH6AgoGAgIB9fH18fHx8fH18fnt/fnt7e3x8fH18e3t7e3x8enp9en6CfoKEhIKBgoGFhoWFhoaHhYGEkY+MioqLh4eFgoOEhISEg4KCgYGCgoKBgoGBgYGBgoGBgoKAgYKBgYCAgH9+e3x+fnx6fnh5dnd8fHx7e318f4GAf35/foB/f35/f35/gH9/f3+Af39/gYKAfn6BgIB/f39/f39+fYN8fH19fH99fX19e3x+fn9/fn5/fnx9fXx8fHt+fnt8e3x8fHx9fH18fnx9fHt7e3x5e3x7e316fX5+f4CAg4eJiYmKiYqJhYiSjouIiYeFhYOCgoOEhIOCgoKBgYKBgYKBgYGBgYKCgoGCgoCAgX98e3p6eXt9enx+fnl8eXh4dHx8fHt8fHx+gH9/f39/gIB/fn5+fX+AgH9/f3+Af4CDgoB/gIGAgIB/f4CAgH58enx9fX59fX5+jIZ9fX57e4ODfX5+fX18fX19fX19fH18fXx9fX58fn19fX18e3t6fHt8fHt6e3t6enp7fn6DhYiHiIqLi4qJjJGPjYqIhoWEgoKCgoODg4OBgYGBgYGBgYGBgYGCgoOCgYKBgIGBf3+Af356eHl5en5+e3l6eH5zfHx8e3x8fH5+fn5/gH+AgIB/fn9+gIF/f4B/gIGAgoSEgYCAgYGAgX+AgYKBf39+f31+gH57foGSjHx9f4qAjYx+fn19fX5+fX59fX18fn18fXx9fX1+fX1+fnx7e3t8fH18e3p7e3l6eXl5e35/hIOEh4mKh4mOkI2LiYmFhISCgYKCgoKCgoGCgoKBgYGCgYKCgoGCgoKBgoKAgYGAfoCAf39+e3p5e319eHx6f3KBfXt7fXx8fn59fYGCf4GBgX9/gH+AgX9/gIGCgYGFg4SCgYGCgYKCgICBg4KAf4F/fX6Afnx/f4mCf36DkYSEg4F/fn18jYd9fX59fXx/fnx9fXx9fX5+fX5/fX19e3x9fnx8e3x9enp5eXl5e3t+foCBg4eEiI+Oi4qGhYSEg4KBgoKCgoGBgYGCgoKBgoKCgoKCgoKCgoGCgn+AgIB+f39/fn5/ent5fX16enp9cX6Cent9fX19fXp4f4KAgYKCgICBgYGBgICBgoKCgoaFhIKBgYGBg4F/gIKEgX9+gYB9foF+fX5/gIB9fn+EgH5+f31+fX2KhX1+f31+fn9/fX19fH5+fn99f4B9fX18fX9/fHx7fH17e3t6enp7e3x9fn2Ag4CJjouMh4SFhYSDg4GCgoKCgYGBgoKBgoKCgoKCgoGBgoKBgYKCf4CAgH9/f39+fn59eXp6fXx5d3t0e4d8dHd9fn17e3Z2fYCBg4KBgYKCgoKBgYGDg4OChYaEg4GAgICDgX+AgYSBfn6Af31+gH59fn6AgH+Bfn+Af39/gH99f39/f3+Afn9/gH58fX18fn5+foF/gH2CgHx9gIB9e319fXx8fHx8e3t7fHt8fHx9fIqLiYiFhoWFhISDgYKBg4KAgIGCg4KCgoOCgoKCgoGCgoGBg4J/gIGAf39/fn5+fn57enp8fHt2e3R3f352cnt+fnt4dnd8gIGCgoKBgoODg4OCgoSDhIOFhoOCgX9/gIKAgICAg4F+foB/fX+AfX1+foCAf4J/gYGAgICBgH1/f3+AgICAgIB/fnx9fX19fn59g32AfoKAfX6AgX98fn59fX17fH58fXx8fHt8e3x9iYeGhIWHhYSFhIKCgoGDgYCAgoKDgoKCg4ODg4KBgYGBgYGCgH6AgYB/fn5+fn5+fn56e3p9goN9dXF6fHpxen59eXh0dICAgoKCg4KDhYOEg4KDhISEhIWEgYGAgH6AgoB+f36Bf35+f4B9foB9fX1+gH9/gYCBgYCAgIKBfn6Af4GAf4CAgH9+fX19fnx+fn19gYR/gH9+f4GBf31/f319fn1+fn1+fHt8enx7eoCHg4SEhYSEhIWDgYKBgYKBgICCgoOCgoOEg4SDg4KBgYKBgYOAfoCBf35+fn5+fX5+fnt7en6Jh354cnl9f3F6eHt4eXV1fYKDgoODg4OFhIWDg4OEhIODhIOBgH+Af4CBfn19foB+fn5+gH19f3x9fX6Af4CAgIKAgIGAg4KAf4B+gIF+gIGAgH9+fn5+fX1/fn6FhYGBgH+Ag4F/foGAf35/f4B/fn17ent6fHt6goWAg4KCgoKCg4GBgYCAgoGAgIKCg4KBg4SDhIKEgoGBgoGCgn9+gIF/fn1+fn5+fX59fXp7fIWEe3tzeXp8cHd1dnd5dXR6hISBhISDhIWFhoSDg4WEgoODgoCBf39/f4B9fX1+gH1+f39/fn1+fH19foF/gIB/gIB/gIGDgoGAf36AgH+AgYCBgH9/f39/f4B/gIGCgoKBf4CDgn9/g4J/f4B/gX+Af3x6fHp8e3yCgH+Cf3+BgIKCgYF/f3+BgH6BgoKDgYGDg4KEgoSCgYGBf4GCgH6AgH9/fX5+fX19fn19e3t6gH94fHZ5eXtxdHh3dnh1cnmFhYKEhIKEhYWGhISChIOBg4GAgIF+f4B/gHx9fX6AfX5/f39+fX98fn5+gX+Bf39+f4B/gIODg4B/f4GBgIKBgYGAgIGAgIB/gIGAgIKDgYF/gISAfYGDhICAgX+BgYKBfXp7e3x8fH9+f4B8f399fYGAgH59fX9/foKBgYKBgIKCgoKBg4KCgYB/gYKAfn9/fn99fX1+fX19fX19ent7fHZ9eXh5enJ1eXl2d3dzdYaFg4WEgoSEhYSEhIGDgoGDgX+AgX5/gH6AfX19foB+f4B+fn99f3x/f3+BgIF/f3x+gH6AgYKDgYCAgYOEgoGAgYB/gYCAgYGAgYGBg4KBgX+Ag4B+goOEgICCgYKChIJ+e3t8fHx8fX1+fXp+fX14fn9/fHx8fn5+gYCBgYCAgoGBgYGDgoGBf4CAgoB9fn19f319fX59fH19fX16e3p8dnx6d3t4cnZ5e3Z2dnN0hoSEhYSChISFg4ODgYOBgYOBgIGBfX+BfoF9fX1/f39/gH5+f359fYB/gIGBgX9+fH5/fn5/gYJ/gYGCg4eFgX9/fn6Af4CAgICAgIKCgYCAfoCCf3+BgoOBgYOCg4OFgn99fX18e3x8eXp7en55e3l4f357fHt+fX1/f4F/gH6BgICAgoOCgYF/gIGBf31+fH1+fX19fX18fn58fXx5e3x4enx3endzeHd6c3Z2c3SGhISGg4KDhISDgoKCg4GCgoGAgYF9gIB+gH1+fX5/gICAf39/f3x/f3+BgIGAf359f39+fn+BgH2AgIGDg4N/f359fn5/f4CAgIB/gYKBgH9+f4F+f4CCgYCBg4KEhIaEgH59fHx8fHp5dnl5enl2eXZ+fHt7e359e399gH99fX9/f3+BgoGBgX5/gYF+fX18fX19fX19fXx+jYF8fXl7e3p5fHd4eHR1dXhyd3d0doaEhIWEg4ODg4OCgYKDgoGDgn+Bf35/fn+AfX19fH6AgIB/f39/fIB/f4GAgYCAf3yAf35+fn9/fX5+gYGCgn5/fn1+fn5+f3+Af32AgIB+fn5/gX5+gIKCf4KDgoOEh4SAgH58fXx8e3x1eXl4eHh5d3t8e3t7foV9fn1/ent+fn59foGAgIGAfX6BgH59fXx9fX19fX18e32Dgnx8ent7e3p7d3Z4dXJzdnB4eXJ4hYWFhYOEhIOChIKBgYKBgIKBgIF/fn5+foB+fX58foCAgH+AgIB7gH6AgH+BgIB/fYF/fn5/f319fX6AgYKBfn9+fn59fX5/fn9+fH6Af35+fn+Cfn6AgIF+gYOCg4OGhICBfnx9fHx7fHh3e3h1eXd3eXx6e3t9kod9fH13en1+fn19f35+gH98foB/fn19fH19fX19fHt8ent9enp4e3x6ent4dHh1cXJ0cHh4cXmEhYWFg4SDgoODgoGBgoKAgYGAgIB9fn5/gH18fnx/gIGAf4CAgHyAf4B+f4GAf39+gX9+f39+fX18f4CAgIB+f35+fn18fn9/f358fYB/fn1+gIJ/foCAf36ChIKCg4WFgoJ+fXx7e3x8eXd8eXd4d3d4e3t7e3yFin17end6fH19fHx9fX1/fnx9fn59fXx8fX5+fX18fHt6enx7e3p5enp7enhzd3VxcXNveHdxe4WGhYWDhYKBg4OBgoGBgoCBgICBgH5/fn9/fXx+fYCBgoGAgIGBfX6Af35/gX+Af3+BgH6Af319fH1/gICAgH9/f35/fXx+f39/f319f39+fn6CgYF/gIB/foGDgoKEg4SCgn5+fHx6fHt7eXt6d3N2d3h5e3p7eXp/fnt7d3p8fXx8fH59fH19fH19fXx8fX19fX99fXx9e3l7fHx7enp6enp6eHN2dXBwcm93dnJ7hYaEhYOEgoGDgoKBgYGCgYKBgYGAf4B/f399fX9+f4CBgYF/goF9foF+fn+Bf4B/gIJ/gIB+fH58f3+BgICAf4B/f4B+fX5+f4B/f39/gH9/f4J/gICAgIB/gYGAgISBgoKAf39+f3x9fn56fYV+dHx9enp6enx5eXp6hoV3eXx8fHx8fXx8fHx8fX19fHx9fX19fn19fX16eX18fH16enp6enp5c3V1b29xb3d0c3yFhoOEgoOCgYKBgoKCgYKBgoCCgYCAgICAgH59gH+Af4GCgn+CgX+AgX5/gYB/f4CAgn+Bf319f35/f4KAgICAgIB/gIB+fn1/gH9/gIB/f39/gH+AgICAgH+AgYCBgYGCgYCAf39/fn1/fnuBk416fH18e315e3p6eHmBgXh5e3x8fXx8fHx8fHx9fX18fH18fn1+fn59fHp8fHt8fXt5enp6eXl0dXVvb3Fwd3N0fYWGg4OCg4KAgYCCg4KAgYGCgYKBgYCAgIGAfn6Af4GAgYKCgIKCgICCfoCBgX9/gX+BgIF/fH6Af3+AgoCAgICAf3+AgH9+fX6Afn2AgIB/f3+AgICAgYCAf4CAgYCBgYKCgICAf39/fX5+fIGGiXx8fnt7fnl6e3p7jn53d3l7fHt9fHx8fHt9fH19fX18fXx+fn5/f358enx9e3x9e3l6e3p5eXN0dW5zcXB4cnV6hYaDg4KDgoCAgIKCgX+CgYKBgoGBgYKAgYF/fn9/gYGCgYKBg4OAgYJ/gYGBf4CAgIB/gX99f4F/gICBgICAf4B+gICAf359foB+fn+Af39/gH9/gICBf4CBgH+BgIGCgoKAgICAgIB9foB9gIOCe35+e3x9e3p8fHyHeXh4eXx8fH17fHx9fX18fH19fn19fX5+f3+Af317fH18fHx7enl7e3l5c3J1bnZycHhxdXaFhYOEg4KCgYCBgoF/gIKCgoKDgYGDgoCCgYB/f4CCgoKBg4KEhICBgX6BgoF/gICAgH+Cf36AgYCCgICAgIB/gH+AgIB/fn2Af35/f4CAgH+AgH+AgYF/gICAgIGAgYGBgYGAgYCAgH9/gH5/fX59fn57fXx9e3x8d3h1eHh5e3x8fXx8fHx8fX5/f39/fn19fn9/gIGAf3x9fHx9e3p7eXp8eHpzcnVud3FxenF2d4WFg4SDg4KCgYKDgICCgYSDg4SBgYOBgoOCgYCAgIKDgoCCgoSDf4GAfoKDgICBgICAf4CAf4GBgIKAf4CCgH9/gICAgIB/f4CAgH+AgICAgIB/f4CBgYCAgICAgYGAgoOCgoCCgYGCgYB/f4B/gId+fnx7fXx7fX94d3Z5eXp8fXx8fXt8fH19fn5/gIGAfn1+gICAgoGAfH59fX58d3t6ent5eXNxdW53cHV6cXZ5hYWCg4KDg4KDhISAgIOBhoODg4GChICEg4KCgICCgoSBgYKBg4J/gIB/gYOCgYCBgYCAf4GBgYGAg4B/gIOCf35/goGAgH9+gYCBf4CAgYCBgYCAgIKBgYKBgX+BgYGBgoOCgoOBg4OCgYCBgH+AhH19fXx/fXp9f3t5dnp4eXt7fH19e3x9fX19fn+AgYGAgH+AgICDg4B9f35+fn15eXt6enp5c3J1b3dxd3lzd3uFgoKCgoOEgoOEg4CAg4OGg4ODgoKEgYSDgYOAgIKBhIGCgoGCgX6AgICCgYKBgYKCgIGAgICCgoGEgH6Bg4F/f4CDgoCBf4CCg4KAgYKBg4KDgoGBg4KChIGAgYOBgYKEg4KEhIODhIODgYGBgoCCf4B/fYB8enx/e3t3fHl5eXt6fX59fHx8fH1+foCBgYCAgIGBgYSEgH2Af39/f357e3t6e3p0cHhyeXR2eHR3e4SCg4KDg4SChIODgYKDhIaEgoODgoSChIOBg4CBg4KCgoKCgIKAf4GAgIKBgoGCgoKBgIGBgYOCgoOAfoGDgX9/gYSEgYN/goKBg4KCgoGEg4OEgYKEgoOCgoGCgoOBg4SDhISEhISFg4SCgYOCgoOBgYGAgH58fIB9fHh8eXp5enx9f3x7fHx9fX18fICAgICAgYGBgYKBfoGAgICAf3t7e3p6enVweHd5dnV8dXZ8gICDgoODg4OEhISAgoOGhYWDg4KDhIKEhYKCgYKDg4GCgoKAgYB+gYCBgYKDgoKCgoGAgYKCg4KCg4B/gYOBgICChIODgoGCgoGDgoKDg4ODg4SAgoSDg4OBgX+Bg4KDhYKEhISEhISDhISChIOEhIKBgoGBgHt+gX59eXx6enp9fHyBfXp8fH19fHp7fn5+gIB/gYGAgICAgIKBgIB/fX18fX18dnJ2eHh2dH92dX2Hh4OChIWDg4SFhICChYWEhIOCg4SEgYSFg4KCgoODgYOCgoCCgH2AgIGCg4KCgoKEgoGCgoOEgoKBgICBgoGAgYOFhIOCg4CCgoOCg4ODg4OEg4CCg4KEg4KCfoOBgoSEgoODhISEhIOEhIOEg4WEg4ODgoKAe4CBf3x8fXp6fH2AfX9/fHx6fH59fH19fn5/f39/gICAgH9+foCBgICAfnx9fX5/fn18fHh2f3Z3f4SHg4KDhoODhIaEgYKFhoWEhIODhISChIWFgoKDg4SCg4KDgoKBfoCAgoKDgoODg4SDgYKCg4OCg4GBgYGDgn+ChISDg4KEf4KEg4ODgoSDg4SCgIOEg4SDg4KCg4KChIOCg4OEhISEhIWEg4OEhYSFhIOBgoB9gYKAfXx8e3x8gH19foB+fn1/fnx8fH19fn5/fn+BgYGBgH99fX6BgYB+fn19fX59fX5+f3+AfH2AgYKCg4OGg4SDhoSBgoiHhYSDg4SEhYGFhYWDg4SDhIODgoOCg4F+gYGDg4SCg4OEhIOCg4KEg4ODgoKDgYOCf4KDg4ODgoOAgoWDg4ODhIODhIOBgoSEhYOCgoODg4GEg4GDg4SDg4SEhYSEhIWFhYWEg4ODf32BhIB9fXx8fHx/gX5/f39/fX99e3x9fX19fX5+f4CBgIGBgH59fH6Cf39+fn5+fX1/f39/gICAf4CEhIODg4WDhIOFf36CiouFhYSDgoOFgYaGhoOEhISEhIODg4OEgn+BgYODhYSFhIWEg4KEhISFhIODgoSDhYKBhISFhYaEgoCDh4SDg4OFhIWFhIGEg4OHgoOCg4GCgYSDgoODhYODhIWEhYWHh4aHhYSEhYSBf4GDf35+fH5+fX+BgH9+fHx/f358enx9fX19fX5+fn9/gIGBf319fIB/gH5+fn5+f3+BgYGBgYKAgYWFhIOEhIKEg4aAgoWFiomEhISEhYWCh4aGhISEhIWEhISEg4SDgYKDg4OEhIaEhYSDg4SEg3yDhHuBhHd5g4F9hH5+cnWDgoF2foOEgH2BdYF5g39/f36EhIKDg4KBg4SDg4SFg4SFhoSFhn2EeXx+f4N7hYOBhIOAf31+f31+gYOBfXt/fX6Afn18fHx9fX19fH19f4B/gYJ/fX18f4GBgICAgH+BgYGBgYKDg4KChoSEhIWEgYOEhYOEhYSKiIWFhYOFhYSGhoaDhISFhYWEhYWEhIWCgoOEhYWFhoSFhIOEhYWCaICFanx7cXF8gXOGc3R0fYKDdXNxg4ZzcHVyc3SDdnt9dYF/goOBgnZ5hYCDgIR/hYSChYWCaHpyc3N8gHKBg3+Dg32BfX5+fX6Cg4J8f4F9f4B9fXx8fHx9fHx8fn1+gX+BgX99fX2AgYKBgYGBgIGBgYKBgoKCgoSHhIWEhYSBgoSGhoOFg4aIhoaFg4aGhoeGh4OFhYaFg4KFhoSFhYODg4SEhoaGhIaEg4SFhn1xe4FweXZ+g3+CbnlwdXN8dnl5hnKEg3B2eHF2dHR1cnN0dml/gG5yb3R2bnVsd216c26Ah3ltfXJzdnN2bW53bHB5bHV9f398foGAgX2Af32Af4B/fX18fHx9fH1+f32Af4CAfnx/foCBgoCBgICAgYCAgIKDgoKEhYeGhoCChYODhYeGg4WFhYaHh4SDhoaIiYaHhIWGiIeEg4WGhYWEhIOFhIKFhoaFhoWEhoWHdnB0e3BydX+HhYNtdW92b3x1coR5eYd4cXR3bndod3pucHaCcoN+b3p5eW1vbnpvb213fXiGcHF6cHJ0ZoF1fm57eXNveX+Af31+gYB/e39+fIB+gIB+foCAgYB+fn9/foF/gH9+fYB9f4CBgIB+fn+BgH9+goOCgoSFh4eEfoeEg4OFh4aEhoWFhoaIhISGh4iIhoeEhoaLioWEhoeHhYOFhYWEgoWFhYWGhYWGhYZxdXByc29zenl+hHSIdHV+iHZugnKEhnluanJ/cW1zd3x/dXR8hH54cXV3bnl1enF2eHV6eYRyaW95eHBreXN6b3p3dnZwgYB/fn5/f356fn18f31/f359gIGDg4CCg4GBhIKBf4GBgH1/f4F+f35+f4GAfn6BgoCAgoSHhoODhoSEhIaHhoWFhYWGhoiFhYaFh4eFhoSGhomIhYSJi4iGhIaFhYWDhYWEhoaGhoaFg3iLeXKIentwcIWEeIV4eWtzfnl7a3KDh4N6fG16eXl0fYB2bm+AgG90fHV3cXl9fW1+dW+DhYZ6gHJye3x1cG96a3N8bnaCgYF+fn99fXp9e3x9fX9/fn1/f4KCf4GDgYGDgYB/gICAfn9+f31/fn1/gH58fYGAfn6Ag4iEhoSFhYWFhoeFhYWFhYeHiIaEhoWHhoaFhIWFhIWFhomKh4WEhoWGhoWGhoSGhoaGhoWGh4eHhoaEhoWGh4iHhYeGhoOHhoWFg4SFhoWGhIaEg4SEhoSEgYODhISFhIWEhYSGg4WGhYWEhIWHhoSEhYaFhX13hoOEhIOCgX1/fnt8e357fHx9f359fH9+gYB9f4F/f4GAfn5+gH5+f35+fX99fX5/fHt8f358fH+BiYaFhIaGhoWGhoWFhYWGhoeIhoSGhYeFhYWDhIWGhYSGhoaGhYSGhIWGhoaGhIeGh4eGhYeIiIiIhoSHhYaGiIaFiIeIhYeGhoiFhYaHhYaGhYOChYWGhYWDhYSEhIWEhoWEhYWDhoaFhoWEhoeGhISFhoOFhIKEg4OFg4OBfYB/e3t8fnt8fH1/fnx8fn2Afn1/gH5+gH99fXyAfX5+fn5+f3x8fX57fHx/fHt7fn+Ih4SEiIaGhYeGhYWEhoaGhoiHhIWGh4aFhIODhIaFhIeFhoaFhYaEhYaGh4eFh4aJiIaGiIeIiYiFhYiFhoeGh4aHhoeFh4eGh4WFhoeFh4aFgoOFhoaEhIOEhIOEhoSGhYWFhYOGhoWGhYSGhoWEhIWFg4SHhYOCg4SDhIJ+gYB8e31+e3x7fn59fHx+fX5+fX9+fX1+fnx9fH98fn58fYGAfHx8fXx8fH56e3t8foiHgoWIh4eGhoaGhISGhoeGiIaEhYSHhoSFh4OEhYSFh4SFhoaFhoSGhoeHhoaHh4mIhoaIh4iKiIWHiIWHh4WHhoeGh4WIiIeHhYaGh4WGhoSBhISFhoWFhISEg4SFhIaGhoWGhIaFhoaFhYaGhYSDhISDg4eDhIGChISDgoCAgHt7fn18fHx+fXx8fH19fH18fn18fX18fHx8fXx+fXt8gX99fH18fnx8fHp6fHx9iIeChoiHhoeGhoaDhYaFhoaGhYOFhIaFhIiJg4GEg4SGhIaGhoaGhIeHiIiHh4eIioiGh4iHiImIhYiHhYaGhoeHh4WHhoiIh4eFh4eHhYaHhIKEg4SGhYeFhISEhISFhoaGhoaFh4WFh4WGhYaFhIOEg4OEh4GDgIKDg4KCgn+Ae31/fXx8fH59fH19fH57fHx7fHx9fXt7e318e359e3x/fX18fX1+fXx6ent7fHyIh4KGhoaGh4aGhYOFhoWFhYWEg4WChoSDiId/enqChYaEhoaFh4aEh4eIiIiHhoiKh4aHh4eIiYeFiIeFh4eGhoeHhYeGiIiHhoWHh4iGhoeDg4SEg4aGh4WFhISEhYaGhoaGhYaHhoaIhoaEhoWDg4ODgoOGgYN+goKDgIOCf398f39+fHx9f318fX18fXt7e3p7fHx8e3t7fnt7fXt6e358fHx8fX5/fXt6fHp8fImHg4aFhoWGhoWEhIWFhYWFhIOBhIGGhIKEhHyAhn+ChYWGhYWGhYSHh4iIiIaFiYqHhYeGh4eIh4WIhYaHiIaGh4eGh4aIiIeFhoeGh4WFiIOEhoWDhoaHhoWEg4WFhoaGhoaFhoaHhoeHhYOFhYOBgoKBhIWCg36BgoF/g4F/fn5/fn98fH1/fXt9fXx9enp7eXt8fXt7e3t+fHx8fHp7fXx8fHx+fYF8e3t7e3x7iYeEhoSGhIaGhYSFhoWEhIOEgoCDgYaDgYJ/eoSMe4CEhYeGhoaFhIeIh4aHhYWHioeEh4WGhoiGhYeEhoeIhoaIh4eHhoeIhoSGhoaHhYWHg4SFhIeGhoeFhISDhYWGhoeGhoWGhoaFhoaEg4SFgoGCgYCEg4OCfYGBf36DgX5/f4B8f3x9fX59e319fH15enp5e319enp7e318fXx8enp9fHx9fH5+gHt7e3x+fXyIh4WGhYeEhoSFhYWFhYODgYOBgIKBhYJ/gH9/fXx7gYSFhoaEhYSDh4eGhoaFhIaJhoKGhIaGhoWFh4WHiImGhYiHiYeGhoeFhIaFhYeFhIeDhIWEiIaGh4WFhIKFhYaFhoaHhIaGhoaFhoKDg4WAgIGAgIOBg4B8gYB+foKAfYB/gXx/fH1+fX57fn18fHl6enl6fX15enp7fHt8e3t6e319fH18f35+fHt7fX59fIiGhYaGhoSFhYSFhYSDgoKAgoGAgIGDgX5+foB5en2Ag4OFh4WEg4OHhoOEhYSChYiFgoSDg4WFhYWHh4aIiIaFiIeJh4aFhYWDhoSFh4OEhoSEhYSHhoWGhYaEgoWFhoaGhoaEhYaGhYWFgoKDhH9+gICAgYCDgHuBf31+gn5+gH6Afn99fX59f3t/fXt6eXp6eXp8fXl6ent7enx7e3t7fH19fXyAfn18fHx/fnx7h4WFhoaGhoSFhIWDhYKBgICAgYB+f4KCfX1/f3t/f4KDg4WGhYSDgoaDgYOEgoCFh4WCg4GBg4SEhIaGh4eHhYWIhomHhYSEhIKFg4SGgoOFhISGhIeGhYWFhoOEhYSFhoWGhISFhIWDhYSAgIKDf35/f39/gIN/fIB9fX+CfYCBfn6Bfn5+fX1/e398e3p5enp5ent8eXp6e3t7fHp7e3t8fX19fYB9fXx8fYB/fXyGg4aGhoaFg4SDhoKFgYGAf3+AgH5/gYJ8fn9/foCAgoKChISDgoGChIGAg4KBgISFhIKBf4CCg4OEhYWHhoaEhYeFh4WGgoOCgoOCgoWBg4WEhYaEhoaHhoaFgoSEg4SFhYWDhIODhIKEhIB/goJ/fX5/fn5/hH57f3x8gIF9gYB9foN9fn59fX57fnt7enl7enl6ent5enp6e3t8enx8fHx+fn1/gXx9fHx9f4B+gIaEhYWEh4SEg4KGgoOAgYB+fn+AfX9/gnx9f39+fn+BgYKEg4KBgYKCf4CBgoCAgoWEgoB/gIGCgYOFhYeFhISGhoOFg4WBgoGBgoGCg4GChISEhYWGh4eGhYWDg4ODhIWFhIGDgYOChIODgH+AgX59fX5+fH6Dfnx+fHyBgH6Cf35/gnx/fn19fHx8e3t6enp6eXt5enp5enp6e3x5e317e35/f4GAfX59fX1/gICAhoSEhYSFgoSCgoSCgoCBgH59fn9+fn6AfX2Af35+foGBgoODgoSHgYF+gICBf3+ChIOBf35/gIJ/goWEhYOCg4WFgoSBg4CBgIGBgYKBgIGEg4OGhYWHh4WEhIWCgoKDhYSCgYGBgYCFg4F/foB/fnx9fn18foN9e358fYF/gIN9fYCBf35/fXx8fH17e3p5enl5e3l6enl6ent7e3p7fXx8f3+BgoB+gH+AgH+AgIDKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzNzc3Nzc3Nzc3NzczMzMvLy8vLy8vLy8vLy8vLzMvLy8vLy8vLy8vLy8vMzMzMzM3Nzc7Oz8/Pz9DQ0NHR0dLS0tLS0tLT09PT0tLS0tLS0tPT09TU1NTU09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tLS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1dXV1NTU1NTT09PT09PT09PT09TU09PU1NTU1NTU1NTU09PT09PS0tLS0tPT09TU1NTU1NPT09LS0tLS0tLR0dHR0dPHhnNlYFtLWWdVTUZIQD03Nzg5Nzw8PDo8Oz42Oj04PDs6OTg3ODs7Oj87PTs8PD47P0E/QkJBQ0RFREE+PTw7QENDQUBDQ0FBR0hHSUtSwtXS09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXVysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMy8vLy8vLy8vLy8vLzMzMy8vLy8vLy8vLy8vLzMzMzc3Nzc3Oz8/P0NDQ0NHR0tLS0tLS09PT09PT09PT09PS09PT09TU1NTU1NTU09PT09PT09PT09PT09PT1NTU1NTU1NTT09PT09LS0tLS0tLT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1NTU1NPT09PT09PT09PU1NPT09TU1NTU1NTU1NPT09PS0tLS0tPT09PU1NTU1NTU09PT09PS0tLS0tLR0dHSzIxyZ2BcTVllUktHSz87Mzc4Ozg5Pj05PDpBOjs9Nzs8PDo6Nzg6Oz0/Oz88PTw/Pj9BPUFBPkNDREJAQT46Oz9DREFDRERCQklHSEhJTr7V0tPT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1crKy8vKysrKysrKy8vLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzMzMzMzMy8vLy8vMzMzMzMzMzMzLy8zMzMzLy8vLzMzMzc3Nzc3Ozs/P0NDQ0NDR0dLS0tLS09PT09PT09PU09PT09PT09TU1NXV1dTU1NTT09PU1NPT09PT09PT1NTU1NTU1NTU1NPT09PS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1tbV1dXV1dTU1NTT09PT09PT09PU1NTU09TU1NTU1NTU1NTT09PT0tLS0tLT09PU1NTU1NTU1NTU09PT09PT0tLS0tHR0s+Sd2hfXk9XZ01LRks9ODc2NTk5OTw+OT88Qzo7PDc5PD07OTc5Ojw9QDs+PT47PD48PT5BQD5EQ0NDP0E9Ojs9QkNFQ0NEQT9FSEpJSky61dPT09TU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8rKysvLy8vLy8vLy8zLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMzMzMzMzMzMzMzMzMzczMzMzMzMzMzMzMzMzMzc3Nzc3Ozs/Pz9DQ0NDQ0dHS0tPT09PT09PT09TU1NTT1NTU1NTU1NTV1dXU1NTU1NPU1NTU09PT09TU1NTU1dTU1NTV1dTU09PT09LS0tLS0tLS09PT09TU1dXV1dbW1dXV1dXV1tbW1tXV1dXV1NTU1NTT09PT09PT1NTU1NTU1NTU1NTU1NTU09PT09LS0tLT09PU1NTU1dXV1dTU1NTT09PT09PT0tLS0dHRmn5nYWJOVWpKSElLPzw6OTM3Njc3PTs+Oj06Ojo4ODo7Ozg4Ojs7PD46PT09Ojw/PD0/QkA/Q0RDRD5APT08QENEQ0JEQkQ+REhJSUtMttfT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3MzMzMzMzMzMzMzMzNzc3NzczMzMzMzMzMzMzMzc3Nzc3Ozs7Pz8/Q0NDQ0NHS0tLT09PT09PT1NTU1NTU1NTU1NTU1NTV1dXV1NTU1NPT1NTU1NTU1NTU1NTU1dXV1NXV1dXV1NTU09PT09PS0tLT09PT09PU1NXV1dbW1tXV1dbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1NTU1NTU1NXU1NTU1NTT09PT09PT09PU1NTU1dXV1dXV1dTU1NTU09PT09PS0tLR0p+DaV9kU1hsSEhIS0A9Nzg0NzY6Oj87RDw8Ojw8OTg6OTo6Ojs8Ojo7OT49Pjk9QDs/QUFCP0JCQUM9Pz8+PEBCRUNDQkBBO0ZJR01MSbLY09TU1NTU1NXV1dXV1dXV1dXW1tbW1tbV1dXW1svLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzM3Nzc3Nzc3Nzc3Ozc3NzczMzMzMzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc3Mzc3Nzs7Ozs7Pz8/P0NDQ0NHS0tLS09PT09PT09TU1NTU1NTU1NTU1NTV1NXV1dTU1NTU1NTU1NTU1NTV1NTU1dXV1dXV1dXV1dTU1NTU1NPT09PT09PT09PU1NXV1dbW1tbW1tbW1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTV1NTU1NXV1dXU1NTU1NTT09PT09PT1NTU1dXV1dXV1dXU1NTU1NTT09PT09LS0tSjiGxfZlJWakdIR0lBPjM2Njo7PDhDPEJBPjtBPDg5Ojw6Ojw8PDk8PTo7PD09PD89QD9AQT9AQUBCPD4+PzxCQ0NDRkBBQT1ISklOTUeu2NPU1NTV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbMzMvLy8vLy8vLy8vLy8vLy8vMzMzNzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzs7Ozs7Oz8/P0NDQ0NHR0dLS0tPT09PT09TU1NTU1NTU1NTU1NTU1NTV1dXV1dXU1NTU1NTU1NTU1dXV1dXU1NXV1dXV1dXU1NTU1dXU0tPU1NTU1NTU1NTV1dbW1tbW1tbW1tbW1tbX19bW1tXV1dXV1dXV1dXV1dTU1NTU1dXV1dXV1dXU1NTU1NTU09PT09PT1NTU1NXV1dXV1dXV1dXV1NTU1NPT09PT0tLWroprY2VSWGhMSkdJQjg0OTQ6Ozo5QDk+Q0U/PDw5OTk9Oj07PDw6PTw7OTw9Ozs/PUA9PT5AQD9CQT5APD05QERDQkFBQj48SEpLTU5IqNnU1NXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbWzMzLy8vLy8vLy8vLy8vLy8rKy8vLzMzMzMzMzMzMzM3Nzc3Nzc7Ozs3Nzc3Nzc/Pz8/Pz8/Pz8/Pz9DQ0dHR0dHR0dHR0dHS0tHV2djY2NnZ2dra2tvb29vZ2dnZ2dna2tra2tra2tjW19fX19fX19jX19fX19XV1dXV1dXV1dXV1dXV2Nvc3dzc3Nzd3Nvb29za09LT09PT09TU1NTU1NbW1dXV1dXV1dXV1dXW1tbX1tbW1tbV1dXV1dXV1dXV1dTU1dXV1dXV1dXU1NTU1NTU1NTU09PU1NTU1NXV1dXW1dXV1dXV1dTU1NTT09PT09PS1bqKa2hoUlhlSUlMTkA5OTo0O0E8Nz05QUM+QD89ODo6Ozk9Oz4/Ojs8PDo7PDo7Pj1APT8/P0FAQUE/QTw8Oz5BRENBREA9PElJSk1ORqPa09TV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbW1szMz9DPz8/Pz8/Pz8/Pz8/W3t3d3t7e3t7e3t7e3t3S0NDQ0NDQ0NDQ0NDQ0ci5ubm5ubm5ubm5ubq6t6WkpKSkpKSkpKSkpKSnhmBjY2NjY2NjY2NkZGRlhIuKioqKioqKioqKioemuri4uLi4uLi4uLi4uLrR1NTU1NTU1NTU1NTU2K58gYKCgoKCgoGBgYGAj9LS0tLS0tLT09PS09PT3OPi4uLi4uLi4uLj4+Pi2NfX1tbW1tbW1tbV1dXV1dXV1dXV1dbW1dXV1dXV1dTU1NTU1NTU1NTV1dXV1dXW1dXV1dXV1dXV1NTU1NTT09PT09XDkXFrak5TYkxMVk08Ojo3Nz5DPjg+Oj8/QT0/QDc7Ojs7PTs+Pjo7PD48Oz07PT8+QDw/Pz1AQEBBPj88PjxAQUVCQkZAQD9HSEpLT0ae2tXV1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19fMzNDS0tLS0tLS0tLS0tLR3uzr6+rq6urq6urq6uvp1dLS0tLS0tLS0tLS0tTEqaqqqqqqqqqqqqqqq6aGhIWFhYWFhYWFhYWFik4MEhISEhISEhISEhIRE0pUU1NTU1NTU1NTU1NPg6ejo6Ojo6Ojo6Ojo6Knz9PS0tLS0tLS0tLS0tmRO0RERERERENDQ0RDP1zT09LS0tLS0tLS0tLS0eDs6+vr6+vr6+vr6+vr6dnX19fX1tbW1tbW1tbW1dXV1dXV1dbW1tbV1dXV1dXV1dXV1dTU1NTV1dXV1dXW1tXV1dXV1dXV1dXU1NTU1NTU1NPUy5h2bGlKTl9NUlVNPjw8Nzs/Qz42Ojc+Pzs9Qj85PDk9Ozw6PD07PTs9Ozs9PD0+PT07QT08QUBBQT08Pzw7QEJDQURFPUFAQ0ZLS09GmNzV1dXV1dbW1tbW1tbW1tbW1tfX19fX19fX19fXzMzR0tLS0tLS0tLS0tLS0d3q6enp6enp6enq6unq6dXS0tLS0tLS0tLS0tLUxaqrq6urq6urq6urq6yoiIeHh4eHh4eHh4eHh41SEhgYGBgYGBgYGBgYFxpOWVdXV1dXV1dXV1dXU4WopKSkpKSkpKSkpKSjqM/T0tLS0tLS0tLS0tLZlEBISUlJSUlJSEhISENg0tPS0tLS0tLS0tLS0tHf6+rq6urq6urq6urq6unZ19jX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dXV1dXV1dXU1NTU1NTU1NGcenFpSlRdT1JVTkQ+Pzs/QEA4Ojs4PDs7PD86Ozs4Ozk5Ozw7Ojw5Ozs8Ozo9PT0+PUE/Pj8/Pj08PT88PEFBQ0FERTw+QEVGSktNRpPc1dXV1tbW1tbW1tbW1tbW1tfX19fX19fX19fX183N0NLS0tLS0tLS0dHR0dDc6Ofn5+fn5+fn5+fn5+bV0dLS0tLS0tLS0tLS08Wtrq6urq6urq6urq6vq46NjY2NjY2NjY2NjY2SXSInJycnJycoKCgoKCcpWmNiYWJhYmJiYmJiYl6MrKmpqampqampqampqazP09LS0tLS0tLS0tLT2ZlNVFRUVFRUVFRUVFVRatLT0tLS0tLS0tLS0tLS3+np6enp6enp6enp6enn2djY2NjY19fX19fX19fX19fX19bW1tfX19fW1tbW1tbV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbV1dXV1dXU1NTU1NTWo3txZElbYE5OVU9AQT89REI+Oz06OTs6PT07PDs6OTg5OTs8Ozw8Ojo7PDo7QD08PTxAQTxBQTs7PEA/PD1CP0RDQ0U8PkJERkpMTEWN3NXV1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjNzc7Ozs7Ozs7Ozc3Nzc3Nzs/Pz8/Pz8/Pz9DQ0NDQz87Ozs7Ozs7Ozs7Oz87NzMzMzMzMzMzMzMzMzMvJycrKysrKysrKysrKysfCw8PExMTExcXFxsbGxsvMy8zLzMzNzMzMzMzLz9HR0tLS0tLS0tLS0tLS1NXV1dXV1dXV1NTU1NXQy8vKysrKysvLysvMzMzT1NTV1dXV1dXW1dbW1tjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NfX19fX19fX1tfX19fX19bW1tbW1tbW1tXV1dXV1dXV1dbV1dbW1tbW1tbW1tXV1dXV1dTU1NTU169/cF5GXmJQUVdOR0ZDQ0lBPz07PDo8N0BBPD04Ojo4OTg7Pzs8PDs7PDw8PD87PD46Pj44PkI8Pj1BPjw+QkBERUNAPD5APkNJSUtEh9zV1tbW1tbW1tbW1tbX19fX19fX19jY2NjY2NjYzs3Nzc3Nzc3Nzc3NzdHNzc3NzczP09LSzs3P0s7Ozs7Ozs7O09TQzs7S1M/P0tTV1NDPz8/Pz8/Pz8/Pz8/P0NDQ0NDR0dHR0dHS09PU1NTU1dXV1tbW1tfW1tbX1tfX19fX19fX19bW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dTU1NTU1dfX19fX19fX19fX2NjX1tbW1tbX19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjX19fX19jY19fX1tbW1tbW1tbW1tbW1tbW1dbW1dbW1tbW1tbW1tbW1tXV1dXV1NTV1di4gm9XSl9jUlFaS0hBQTxCPT07Oj4+PD4/PT0/ODk6OTk3OD48PD47Ozw7PDs/PT0+OTs7OT0+P0A+QD07OkI/QkNCPz0+QD5CRUdKQoDc1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2M7Ozs7Ozs7Nzc3Nzsqfys3Nzc3QuYOEi8fTwJrLz87Ozs7O0KaSxdHTuZ/Q0ZyChIrGz87Ozs7Ozs7Ozs7Oz8/Pz8/P0NDQ0NDQ0NDR0dHR0tLT09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbV1dXV1dbW1tbV1dXV1dXV1NTU1NXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NfX19fX1tbW1tbW1tbW1tbW1tXV1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXYwIBuVU9gY1dZW0xMQ0A9PTs9Ojw+Qj5CQ0A8Ojg5ODo6Ojc7Pz4/PDw7PDo5Pzw8PTg5PD9BPj09PUFAPTtBQkBCQz47QD9BQUlHSkF629bW1tbW1tbX19fX19fX19jY2NjY2NnZ2djY2dnOzs7Ozs7Ozs7OzdKpj63Rzs7Ozpu3tqSiwJOerNPOzs7O0qqdrJTNs5eaurqVuLmvodLOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0dHS0tLT09TU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dbW1tbW1tXV1dXV1dXU1dXV1dXV1dXW1tbW1tbW1tbW1tfX19fX19jX19fY2NjY2NjY2djY2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2dnY2NjZ2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV18h/b1pTYWVeXVxPSkQ9QD8+PDc6Pjk/RD5AOTg3ODk7Ozw4OT89PTw9PD47OkE7OTs5OzxDQDw7PT5AQT49QkQ/QkM9PT8+Pz5ISUg/ddrW1tbX19fX19fX19fX2NjY2NjZ2dnZ2dnZ2dnZzs7Ozs7Ozs7Ozs/Inrym0tDQzsqgl36Cw6abr6fUz8/P0MmXmYWlr6Cip7LRkn1+r7DRzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dLS0tPT09TU1dXV1dXV1dXV1dXV1dbV1dXV1dXV1tbW1tbW1tbV1dXV1dXW1tbV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2djY2NjY2NnZ2dnZ2dnY2NjY2NfX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dbV1dXV1dfNiHNdWGloXl9gT0lGOkFAPj88PDo2P0JAQjk2NDc6Ozo8Ojk+PD49PTs/PTxBPjw8Ojw8PTw6PEA9QEI+PkFCPUNDPT0+Oz9BRUtIQHDZ1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2c/Pz8/Pz87Ozs7SrKWnqdXAvNLHnY+ey9PJipmq1M/Pz8/RpLC9l6HHhpq11dPNnp7D0M/Pz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0dHS0tLS09PT1NTU1dXV1dXV1dbW1tbW1dbW1tbW1tbV1tbW1tbW1tbW1dXV1dXV1dXW1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnY2NjY19fX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0JB1W1tqaWFeXVNOSTxDQEE+QD46OEVAP0M6NzQ5Ojo5Ozs4Oz0/Pj49QT08P0A9Pjw8PDw8Oj1AQD8/PT5CQD9AQkA8QD0+QUVLRz9r19fX19fX19fX2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnPz8/Pz8/Pz8/QzJ2Nl6zQmpfKxZ6ynpbN1q2ZqtTPz8/Pz9DVuZik2qSZtdTTwKCg0M/Pz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0dHS0tLT09PT1NTU1NXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX19fX19fY19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tKUcl5ea2tqZV1PTEc/RENDQDo9OzxCPD49OTY0Ojk5Ojo5Nzs/QDs8PUA8PEE+PD07PTw/PDo8Q0A+PTs9QD5CPkBBPkA9QD9GSUQ/ZtXX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2traz8/Pz8/Pz8/P07GigJuvyaCjv8qcpYynrdiqmarUz8/Pz8/Q0Zqdt9iimbXU1K+iqdTQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1NXV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dbW1tXW1tbW1tbV1tbW1tbX19fX19fX19fX19fX2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbSk3BgXnBoZmVaUUhHQkVDQEA3Ojo8Pjo8OTc2NTk6Njo8Ozc8QEA8Ojo9Ojw/Pj08OUA8PDo6OT9APj08PUBBQz9APz5BOz9ARkpCP2LS2NfX2NjY2NjY2NjY2dnZ2dnZ2tra29vb29vb28/Pz8/Pz8/P0M6fkGyclteqo9PSrqa1mJ/Vqpmq1M/Q0NDQ1aekoNLWopm11NSjobrU0dHR0NDQ0dHQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1dXV1dbW1tbX19bW1tbW1tbW1tbX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfW1tfX19jY2NfX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX1tbW1tbW1tbW1tbW1tbX19fX19fW1tbW1tbX0pNuYFxxZGdkWlVKQUNGREFCODs/PD07PDw4NTU4OTY4Ozo5PDo+Pzw9PTk8Pz49Ojo+OTw6Ojg+Pzw9PTw+QEFDQT48PDpCRERKRkJd0NnX19jY2NjY2NjY2dnZ2dna2trb29vb29vb29vPz8/Pz8/Pz9G9n8O31pfA09HQ0srSzZeb1KqZq9XRz9DQ0sCdosnU1aKattTOnp/J0tHR0dHR0dHR0dHR0NDR0dHR0dHR0tLT09PU1NTV1dXV1tbW1tfX19fX19bW1tbW1tfX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19fY2NjY2NjY2NjY2NjY2djZ2dnZ2dnZ2dnZ2dnZ2drZ2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fX19fX19fW1tfX1tbX19fX19fX19fX19bW19GRbF1cb2doYl1PRkBISUdFQDw8Pj48PT48NzU2Ojk2OTs6Ojs4QD86PDw5PD49Ozs6Pzk/Ojs5PT49Pjw7PTxAQ0I/Pz47Q0ZGR0hEWc3a2NjY2NjZ2dnZ2dnZ2dna2trb29vb29vb29vb0NDQz8/Pz8/Pz5V+e6WS1KKa08ySl6ObodirmavV0pem09SkoI+30NajmbbXw5+g0tHR0dHR0dHR0dHR0dHR0dHR0tLS0tLS09PU1NTV1dXV1tbW19fX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tbX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2tnZ2dnZ2dnZ2djY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX1tfPjGRWXnBrXGBgTkVITUlJT0M+OkI9PUBCOzU1Nzw6Nzo7Ojo7OT09Ojo6OT0+Pz07OT47PDo8Ozk+PD47PD0+QENCPz5BPEFDR0ZGRVXJ29jY2NnZ2dnZ2dnZ2dra2tvb29vb29zc3Nzc3NDQ0NDQ0M/Pz9DR1aeZrcmjqL7KnbGdo7XZqZup2LirocjGpr2Vkabaopq02bGkp9bS0tLS0tLS0tLS0tLR0dHS0tLT0tPT09PU1NTV1dbW1tbX19fX19fX19fX19fX19fX19fX19bW1tbW1tfX19fX19fW1tbW1tbW1tbX19fW1tbW1tbW1tbX19fX2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2djY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fX19fX19fX19fY2NfX19fX19fYzYZdV2JvZE9dVEtIRlNRS0xAPj1EPD9DRj01NTc7OTY6Ozo8PTo7Pzo6OTg6PT0/Pjs/Oz49Ojs5Pjs9PD0+QURCQD8+PzxAQUVHRURSxdvY2dnZ2dnZ2dnZ2tra2tvb29vb3Nzc3Nzc3NzQ0NDQ0NDQ0NDQ0NO5gL3Tm5bP1LWLkZ/T1LyBu9TOlKDUyo6Tl5Cm2rGDxta5g7/V0tLS0tLS0tLS0tLS0tLS0tLT09PT09PU1NXV1dbW1tfX19fX19fY2NjY19fX19fX19fX19fX19fW1tbX19fX19fW1tbW1tbW1tbW19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2tnZ2tra2tra2tra29ra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2NfX2ct+WlVqaltMX01KTEpVTEZCPD0/R0ZHS0g9NjU3Ojk3OTo7Ojw9OT45OTo4Oz0+PkE+PTk8PDo9Pj46PTk5Oj9FQUA+PT8/QkBHRURFUMHc2dnZ2dnZ2dna2trb29vb29vb3Nzc3Nzc3dzc0NDQ0NDQ0NDQ0NDQ0cHR0crI0tDUxLjS0tHSwtLQ08fM0tTCr7Cz0dPRw9TS0sLT0tLS0tLS09PT09PT09LS0tPT09PU1NTU1NXV1dbW1tfX19fX19fX2NjY2NjX19fX2NfX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29va2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2djY2NjX19fX19fY2NjY2NjY2NjY2NjY19rHd1xSZ2laTlpOTFBRV0VKPz89PkFFTExBPTc3NTs4ODk5Ojs8Pjw+ODo6OTs+P0A9Pj46NTo6Oz0/Ojs5Ojw+QkJAPz8/P0FCR0RDRE683dnZ2dnZ2dna2tvb29vb29vb3Nzc3Nzc3d3d3dDR0dDQ0NDQ0NDQ0NDS0NDR0dDQ0dPU0dHR0dPR0dHS0tHR1NbW1tPS0tXT09PV0tLS0tPT09PT09PT09PT09PT09PU1NTU1dXV1dbW1tfX19fX2NjY2NjY2NjY2NfX19jY19fX19fX19fX19fX19fX19fX1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tvb2tra2tra2trZ2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2trZ2tra29ra2trZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjbwXNYVWlrU0xSTlBSWVRGSTw+Qz9BQkVKPT43ODY5Njc4OTk7Oz0/QDw8ODk7Ozs/Pjw8OTU6PT47OTk7PD8/P0JCQT1BPUBBQkZCQkJLtd7Z2dra2tra2tvb29vb29vc3Nzc3Nzd3d3d3d3R0dHR0dHR0dHR0dDQ0NDQ0NDQ0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tPT09PT09PT09PT09PT09TU1NPT1NTU1NTU1NXV1dXV1dXW1tbX19fX2NjY2NjY2NjY2NjY19fY2NjX19fX19fX19fX19fX19fX19fX19fW1tbX19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2NjY2NjY3LxvVFRsbExLUkpUUlVLRkQ6PkdEREFERjw/ODk6OTU5OTo3PD07PkA9PTc5Ojs5Pjs5OTY2Oj1AQT47PDk6Pj9DQT4/Qj0+QkNFQkFCSrDe2dra2tvb29vb29vb29vc3Nzc3Nzd3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0tLS0tLS0tLS0tLS0tLS0tPT09PT09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1tbW1tbW19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19fW1tbW1tfW19fX19jY2NjY2NjZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2dnZ2dnY2Ny2a1NbcGtLVVdSXFFXSEQ+PEJKRT1ISj89PDc4ODo1OTg5Njs+PD1APDw1OTk8Oj87OTk0ODw9PUFBPD47Ojw+QD89PkE9PUNGR0I/Qkmq39ra29vb29vb29vb3Nzc3Nzc3N3d3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHS0M/U0M7P0tLT0tLS0tLS0tLS0tPT09TU1NTU1NTU1NTU1NTU1NTU1NTU1NTV1dXV1dXV1dbW1tbW19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19jY2NfX19fX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dndsGRTYXJfT1pUV19RUkdCPUVJS0FBTEQ/Pzs5ODg5Mzg2ODY5Pj0+Pz06Njo7Pjs9PTo5Njg6PTtAQDxAPz0/P0I+PD48PEJFSElCPkNJpODa29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3t7S0tLS0tLS0tLS0dHR0dHR0dPT0bm7zLqbnLrQyNPT0tLS09PT09PT09PU1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2NjZ2dra2tra2tra2tra2tra2tra2tra2tra29va2tra29va2tvb2tra2tra2tra2tra2trb29vb29va2tra2tra2tra2tra2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ3qpfVWBuW1VZUVpeT0xHQ0ZNSUZEREk7QUE7PDg4NjQ4Njk4Nzw/QT89Ojc8Pz48Pz87OjY4OD09QEE9QD5BQD1AOjs6Pj1BRUdKQkBDR57h29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e0tLS0tLS0tLS0tLS0tLS0tO+wMqaoKKViJGeqpOpz9TT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fY2NjY2NnZ2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dna2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2tvb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2d6iXFVeblheXU5aUFROQ0NMSUlJRkpEPEJBPDs4Nzc3OTc3OTk9P0E/PDo5QD88PkI/Ojg3NzY9P0BAPUBBPz88PTs7OD48P0VJSEE/Q0aX4dvb29zc3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3tPT09PT0tLS0tLS0tLS0tTIlZyum5m1iX2TjIKBhMTV09PT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tvb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dndmlpYYW5ZYVdPV01QRUJETElNS0ZJRT5CRDk4ODY4OTc1Njk4PT1BPjo4OT4+PD9APzw1Njc2PD4/PjtAQEA/Pj4/Pjs/PkFCRkdCQENIkeLb29zc3Nzc3d3d3d3d3d3d3d7e3t7e3t7f39/U09PT09PT09PT09LS0tLTz6h+kayPko6MhoCIiYSQo8rU09PT09PU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY19jY2NjY2NjY2NjY2NjX19fX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2tra29vb29ra2tra2tra2tna3JJaWWNuWlpSVV5QTDxAR05IUklIRT47SEY4OTc1Nzg3NTg5ODs+Pj07ODlBPj1AP0E+NzU5Njs+QUI/P0BAQUI/Pj8+QUBEQUZIQj9FSozi3Nzc3Nzc3d3d3d3d3d3e3t7e3t7f39/f39/f1NTU09PT09PT09PT09PWtaWaiIuQhYCFi4iBg4qLf4bC1tTU1NTU1NTV1dXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2dnZ2dna2dra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29ra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb2tra29uIWltnalxYTFpfVkg6TEhMSkpDRUVDQExINzo3Njc4ODU4Nzg5PDw7Ozk4QD89Pj8/PDY3PDQ3P0JCQUBAPz8/QT09P0A+QEBGRT09REuI4tzc3Nzd3d3d3d7e3t7e3t7e3t/f39/f39/f39TU1NTU1NPT09PT09PUxZKCg4WGfYGCfXx5foGCg36k29bU1NTU1NTV1dXV1dXV1tbV1tbW1tbW1tfX19fX19fX19fX19fX19jY2NjY2NjZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vc3Nzc3Nvb29vb29vb29vb29vb2tra2tra29vb29zb29zb29vb29vb29vb29vb29vb29va2tvb29vb29vb29vb29vb29vb2tvZgFpebWhaU0ldW1hKRE1ISlNMR0ZBQD9KQjg7NjY5OTc1ODY4Ozo7Ojw5OD09O0A9Ozo2NTw3Oz1CQEFBPD49QEE9PEA/Pz5CREU+PERLg+Lc3d3d3d3d3t7e3t7e3t7f39/f39/f39/f39/V1dTU1NTU1NPT09PT2LKEkKh9g3l2hIh/e3d5gn5+i67A1dTU1NXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dna2trZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2tra2tra2trb2tra2tvb29vb29vb29vc3Nzc3Nzc29vb29vb29vb29vb29va2trb29vb29zc3Nzc3Nvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc1nlcWmxmWFJPYFFSQUhHSkZYTEZAQENDSz87Ozc4ODc2NTc2ODo5PDw6PTs/PTs9Pjw7ODg8OT0/QkFCQzw8P0FCPj1BQkNCREVDQDtDTH3h3d3d3d3e3t7e3t7e39/f39/f39/f39/g4ODg1dXV1NXU1NTU1NPU0ruen3WKeXuIgICChYGDcnOAhYOMrNfV1NXV1dXW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NnZ2dna2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra29vb29ra2trb3Nzc3Nzc29zc3Nzc3Nzc3Nzb29vb29vb29vb29rb29vb29vb29zc3Nzc3Nzc3Nvb29zc3Nzc3Nvb29vb29vb29vb29vc3Nzc3Nzc3Nvb29vb3dByXV9wZVdLUGNPS0JHQ0pIS0ZBPEE9SFBBOjo3Nzg3Njc4Nzw6OD09PD47QD88Pz07Ojs5Ojk8QEJAQkNAPUFAPz1AQkNDQUBAP0A7RU144N3d3d7e3t/f39/f39/f39/f3+Dg4ODg4ODg4NXV1dXV1dXV1NXU18h4i4V8goh6g4SBfoKCc2l0hYuGkJ3U1tXU1dbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tvb2tvb3Nzc3Nzc3Nvc3Nzc3Nzc3Nzc29zb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb297KalxjcWVST1heSz9HTElPS0VAPkFCP0lPPjk6NzY7NzY6Ozc7Ojg6PDw+Oz09Oz48Ojs4OTo4OUFCQkFAQDtAQj06PkFCQz8+PT4/PUZOdN/e3t7e3t7f39/f39/f4ODg4ODg4ODg4ODg4OHV1dXV1dXV1dXV1s6dhpl+f5OTin+CgXx9gnNxm4mAgoOJwNnat7TQ19bW1tbX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tra2tra2tra2tra29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NvfwGNaW21gVlBTU0pETEhNSEk8PkFEQ0ZORDw8OTc5OjY4Ozk3PDk4OTw9OzlAPjpBPzw3NTc7ODpAQUVBPz45PUI/Oz1CQkI6Pj07PT5GTnHe3t7e3t/f39/f39/g4ODg4ODg4ODg4OHh4eHh1tbW1tbW1tbV1tjLioCHhYOXjHh7e3lvfYF1a3ebdHZ7eInHxpiMrdjZ19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2drZ2dna2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tra29vb3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29zb29vb3Nzc3Nzc3Nzd3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3Nzc3Nzc4LdjV1lrYlJNVVFMSktGS0ZDQD5CQT9FTT4+PTg5OTo3OTo3NT03Nzo+PDs7Qjw5Pz05NjY4PTk6QEJGQD49PEBCREA9QD9DO0A9PD4/Rk9t3N/e3t/f3+Dg4ODg4ODg4ODg4OHh4eHh4eHh4dbW1tbW1tbW1tfVrYZ6d32rn3l4entzdH+Dfm9xe3l6c3t2k4qFgImkzdnY19fX2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tna2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29vb29vc3Nzc3N3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vc3Nzb3Nzc3Nzc3N3d3d3d3d3d3dzc3Nzc3Nzd3d3c3Nzc3Nzc3N3d3d3d3d3d3d3d3dzc3OGtYVtebGJSTVZMTUdLS0RGQkI7QT08RUxCQT44Ojk6Nzc5NjY6NTs+QDs9Oz89PD89Ojk5Ojw5PEVDRkA/PkBDQkQ9OT0/QT1CPz1APkdPadvf3t/f3+Dg4ODg4ODh4eHh4eHh4eHh4eHi4uLW1tbW1tbW1tfQmH+Qh4N9eoN2e3Vzenl6kKqmd3JyfoeHh4CAfoKEhJHJzNnX19jY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra29va2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2djY2NnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vb3Nzc3N3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzb29vb3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3dzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3NzhpV9UYm1iUE9TSUhHRkpJSUJBPkJCPEVFREA+ODo4Ozc3Ojc4ODY+Pz07PDk9PDo+PTs6Njc7NjpEQUY+Pz8/PkNBPzs9PT47REM/PjxIT2fZ4N/f3+Dg4ODg4eHh4eHh4eHh4eLi4uLi4uLi1tbW1tbW19jYyH52doN+fnR2eIaCenl1d5yhu6GEgoCAfoeKinx/gYaMnKjO2NjY2NjY2NjY2djY2NjZ2djY2NjY2dnZ2dra2tra2trb29rb29rb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3d3d3d3c35pbT2drXFBRUElDT0pLR0xHSkJAP0FHREBBPDg8ODg1ODk3Njc3QEA/Ozw5Pj04PTw8Ojc4PTk/RENGPkE/QkBDPzw6Pj0/PkVEPz07S1Fj1+Hf4ODg4ODh4eHh4eHh4uLi4uLi4uLi4uLj49bW1tbW19XB3LRueHJze3B6eXaFiIR7eH2AgZiljH98fnuRhZaLhoGDgY6Rvd3Z2NjY2NjZ2dnZ2dnZ2dnZ2dnY2dnZ2dna2tra2trb29va2tva2tra2trb29ra2tra2tnZ2dnZ2dnZ2dnZ2dna2trZ2dnZ2dra2tra2tnZ2dnZ2dna2tra2tra2tra2tra2tra2trb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t3d3d6NWFdobllQUUtISlNJTUhNSUtBQz9DRkJBRDo6PDg2NDg4NzY2Nj8+Pjo8OTw7Oj09PDw4Ozw8RERERT4/PkI+Qj84PT8/Q0NCQEE+O0xUY9Xh3+Dg4OHh4eHh4eLi4uLi4uLi4uLi4uPj4+PW1tbW1teslLZ6eHJvd5V7dHuLgHh1bn6Fg3t/hYhyfH2bnI6JioJ+g32Hk5rH1NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2trb29vb29vb29vb2tra2tra2tra2tra2tnZ2dnZ2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2trb2tra2tra2tra2trb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d7Zf1lgaGxcUUtHR09LTk5PTURGQkg/Q0hEREA6Ozs4NzU3Nzc4NThAPkA7PDk8Ozw+Ojk7OTk7OUZERUI8QD4/PEBDOz5AP0A/Qj8+OjtKVWPV4eDg4eHh4eHi4uLi4uLi4uLi4uPj4+Pj4+Pj1tbX19vKhYR3cXJubniVhHt4hH95dnB4c3eLkY6CdnN9ioaId3d1d4ODfIiIk8Pb2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2trb2tvb29vb29vb29vb29rb2tra2tra2tra2tra2tnZ2dnZ2dna2tra2tra2tra2trb2tra2tra2tra2tra2trb29vb29ra2trb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f0nVZaGlqVk5KSE1OR01EUElGSEBFPUZMREM+Ozs8OTc3OTY2OTU4Pj4/PTs8QDs9PDo3Ozc5OThHREVCPUE9Qj8+QDw/QUE/QEJAPjs8S1Ri1OLg4eHh4eLi4uLi4uLi4+Pj4+Pj4+Pj4+Pj49fX19fEknuJf29sbnV2foSBg4qGfnVybWVtiIaKjoR7c4OHint4e4OPj4GEioqxztrZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29zc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tvb2tvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3dzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f3t7e4clsW2pqalNOR0hOT0VIRk1JSUA8RD5ISUA9PDo6Ojg2ODo3Nzk0OD08PT07ODw8PDw4Njc4OTo6RUJFQT9APEI/Q0M+PkNEQUBAP0A8PUtRYdPj4OHh4uLi4uLi4uPj4+Pj4+Pj4+Pj4+Pj5OTX19fZqXaFfnx3bHB3eXh8jH2KhYB3anN0d3p9bot7fnl6foR/gIGDfnh8foeGlrbT2tnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra29ra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/e3uO9amFpa2lRTkZNTEtKWE1OR0FAQE9BQz9AOzw4OTk5Njg2NjY4NDs+PD07OTY6Ojk6OTU4OTg5OkJERj8+Pj5AQEBCPzxBQD88Pj9BOT5KT17S4+Hh4eLi4uLi4+Pj4+Pj4+Pj4+Pj4+Tk5OTk19fX2sqKhIB5c29tcXN1d4CUeHaAfHWHhXd1cnWgmXp7d3Z5doR0bWxue3iAmouTu9za2tra2tra2trb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc29vb29vb2tra2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f397js2lpbmloUFBPTExPUk9LU0Y/RURERD48PDg7ODc5OTU2ODY2NzM6Pjs+PTc6Pjk5OTk2Ojo4NzxDRUc/Pzs/PkA9PkE9Oz0+OUFAQDhBTlFc0OTh4eLi4uLj4+Pj4+Pj4+Pj4+Pk5OTk5OTk5NjY2NjauY6AenZ1bmpveHCBfWt0cnZ3hIV5h4d5lY55eXp1d3pza298gHx2fYh8gLLe2tra2tvb29vb29vb29vc3Nzc3Nzc3Nzc3dzc3Nzc3Nzc3Nzb29vb29rb29vb29ra2tra2tra2tra29va29vb29vb29vb29zc3Nzb29vb29vb29vb29vc3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3t7e3t7e3d7e3t3d3t7e3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/f39/f4qpqa2hrZFNQT0ZQVFJOSFJLPkREQ0I7Ozk6Ojg2Nzg1NjY4ODg0Oz88Pzw5PDw3Ozo6Nzo6Nzo9Q0JDPUE+Pzw5PT5BQDs8PDtFQD47Q05TXNDk4eLi4uLj4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTY2NjZ1p5vdntveHh2cG50d3BwdHBzb36Jc3qGhY2EenNtcoB6hn1vg5OBdnx9g4a13drb29vc29vc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29ra2tra2tvb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4N/f3+KgbWhma2ZVVlJHUFFOS0xMRUJIRUc9OD08Ojo3Nzg2Nzc2NTY3NDg+PD09Ojg6OD46Ozc4Nzc6Oj5DRDtDQj49OD1AQUM/Pjw+RTw+PUJNUF/S4+Hi4uLj4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk2NjY3MB2doCCfnp4eHBsdXlya399bHNvdGdoaYB/aWl4c2d+iYl4cIKGe3d9foWKvd3b3Nzc3Nzc3Nzc3Nzc3Nzc3d3c3Nzc3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODflGttZm5mU1NJUFlUTEhGTkZGRUJGPTs+PDs5Nzc4NTc5NjQ1NzU4PDs9Pjo6OztAOTs7ODc6OTlAQkE8QUE/Pzk/QEJFQ0FAQEM7Oz1ES01g1uTi4uLi4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk5NnZ2tmYc3uqhJaCcnR1dn14aGx8d2h4d25rcHR5gIJ3dHyBhIJ9c3CAin94gn95g8je3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f4N/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh24tubWdzY1lRTVVbV0hDSUZOS0dCRD8/Qjo7OjY2NzU2NzY0ODc2Ozw7Pj86PDk8Qjg3OTo6Ojk6QUFCQUJDQEE+PT9CQ0NEQUJGOTg9REpOYtjk4uLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXZ2drcqHGCtXiRfnNsem6EgXaCfWtoan+DeHZ8dX2FhXRmcHl9d316gIqFe318foC03tzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3dzc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3Nzd3d3d3d3d3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e397e3t7e39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4ODg4ODg4tiFb3FrdWFWT1VVXE9ETUY+SkdKRUQ8P0I6PDk4Njg0NTY3NDc2NDk7Ozw7OD47PEE4ODo9OD04Oj09QEBAP0FCP0A+QENCQ0FBRTc2O0RMTmPa5OLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXl29ra3Z5sbnNxhY1ybXBuf391hH5rcnZ2enN4gXhzbnVwbWt2fHmFiIB/f392coODsd/c3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eDg4eHh4eHh4eHh4OLXhW1xb3ZeUldTWlpRSkhDQFFAQkQ8OT9BOjw5NzU3NDU2NjQ3NTY9PDo9PTk+OjxAODo6PDY7OTs+PUJCQjtBQkBDQEBEREM8PUA3OjxFS01l3OPi4uPj4+Pj5OTk5OTk5OTk5OTk5OXl5eXl5dPOxsB+cWxveHt2b3VuanNzbZKGeG50dG5vdIZ/b2twboJ0bXZyfY2DdnF/d3mKgabf3Nzc3d3d3d3d3d3e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3dzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t/f3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi1oZucG1xYFJZUFdfWUpMTElSP0Q9OTtCRjs6OTc0NTY1NzU0NjY2Pj07Pz45PTk7Pjg9Ozo0ODtAQENCQ0FCRkE/Q0BBQkREOz0+OTs8QkxNZODl4+Pk5OTj4+Tk5OTk5OTk5OTk5eXl5eXl5eW5t7Woc3JscHd6dHd4bXFydXd/hHRyc2xsa3F8bnBudGuBf3GAd32Eg355gHNygYqg2d3c3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh49WHcWxqbF5YWlVXYFZWUE9QTD1BOjs8RkE4Ojg3MzY1Njk2NTg1Nz89Oz8+OT04Ozw5PTs7NTo9Q0JCPENDREREQUE/PkJDQzw9Pjg5PENLS2PN0dnh1sjY4+Tk5OTk5OTk5OTk5eXl5eXl5eXltbW2q3J5cm59f3Z1d2hqaGlwb3Zta2tnZWZxdG15gG5teXd2iHhxa2podXV5dHV/wd/c3d3d3d3d3d3e3t7e3d3d3d7d3d3d3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHi4uHh4ePVhnFwY2lhV1NZV19MUk9STUtAPjg5O0E+ODc5NjQ3Njc6NjY2NDk+Pzo8Pzo/OTo6Nzo9PDk5PEFBPTtBQ0VDRkA+Pj5BRUQ+QEE3OD5GSEpesrW4wbm1u8jg5eXl5OTl5OXl5+fn5+fm5ebm5ra2tbWOfX5weoR1cnZnYmNlbGtyb2ZpbHZtd4Z9hXlsbHd4a3ZwfH14c3V5fHd2h7ng3d3d3d3d3d7e3t7e3t7d3t7e3t7d3d3d3d3d3t7e3t7d3t7e3t7e3t3d3d3d3d3d3d7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4eHj1Yd1bl5uY1pUU1hXS1NLSk1SR0E4Ozs+PDk4NzU2NTY2OTY4NjY5Pzw6PT07Pzo7Ozk8PDs5Oj4+Pjs8PUFEQkNBQEBBP0JDPDw9Nzs+REVKXrG1tLW2t7e2y9rJ3uXl3eDi3tXU1tPU4OPg39+2treuh3t/bnmNenJ1bWNobGxtaXR4enF5enqIh4N6aWh9cWRvcXyGgX55e318e4an2t7d3d3d3d7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4uHh49aGdmxhb19dV1lcWlJQSEpXTEVHPUA9Ozs9OTY0NjU1NTg2NzY3OD87OT09PDw5OTw6Pjw6OTg+Qjs7Pj5AREBDRUFAQD0/QDw9PTU5PEJHRl2xtbW2uLm5ubq9uMPT0r3BwcC6u7y6u8TMxb/Dt7e3hGl1gX1ndYd5Z3Vxa2t5eHB3fH15bWl3e3h3bml1j4FwbHl4d3d9gXuGgnmAoNze3d3d3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODh4OHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4ePXhXJrZ3RhW1hYX15TVVVRVUpMRj9JRDs5PTY2NDc3NTc4Nzc3ODk8PDo+PDg8Oj0+OTs8OTs5P0E8PT9DP0FARUJCQTw9Q0A6Pjw1NDlER0dasbW1tre5ubm5ubm3ubm4uLm5urq6urm5urm6u7e3uX9ucHN6b3B/eXNuc3Vsc3Z4cXFwb2tvcX6Bc2mHhIF9dHOHdW11hYmBgHJ2hafd3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uHj14lxa2xyW1dXXWBUUVVUUFJPSkNATUE9Ozk2NTM0NjQ2ODc3Nzk6Pjs8Pjs5PDo8PDk8PTw7PT0+PUNEREBDQkE/QD48PkE8OD06NjY6QkpIWLG1tLa2uLm5uLi5uLe3uLi5urq5ubi4uLi6uru3uKx7cnhxf3ZzfnBsbXpyZ29sbW50cHt3d3Jyd3pvhpJ2f3x8enZ5fH9zfYdyda3T393d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4eHh4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi49eHb2pxalVWV2FbT1FSUE5XSURESUo/Ojk6NzUzNDk1NzY2Nzg4Ojw7PD46PDo6PTw5PDw9Oz09PDs9REdEQ0E8PDw8Pj5AOzg8ODE1OkFGRVautbW1tre4uLm4uLi4uLe4ubq5uLi3t7i4ubq7t7mqcnB4d3x7e4J3aG5xam9qY2lyf21zcn54dHFsanaAeX2AgH91doB1a4qLgHaR1d/d3d7e39/f3t/f3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f4N/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLi4uPYhm1sdGVWUFxnWE1YU1JRWUVDS1BOOzk4ODc1NTM5NTY2NzY4Nzk+OT0+OTw5OTw7Njg5OTo8QEA9PkBGQEJCQDo+PEE9Pzs7OzYxNjxCR0RQqLa1tba2tre4t7i4uLi4uLm6ubi4t7e3t7e5ure2tIlyd3h9iXxwem99c2hqbGdnbHRscXd0cWx2c3Fxd3FyfHl4g3Z7d2mLkYp9kM7f3d7e3tvY2drZ297f39/e3+De39/f3Nvc3N3e3uDg3+Dg4ODf3t7e39jS397f397e3t/f3t7f3t/f3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLi4eLi4uLi4uLi4uLi4uLj4+Lj4+Li4uPj4+Pi4uLi4+Lk14NoZ3VkVlVkZVdKWllXW1Q9RU1LSD04NzU3NjQzOTQ0Nzc1Njc5PTo9Pjw9PDk7PDk5Oj45PD4/PkFBQ0FFRUQ+OzxBPjw5PDs3Mzc+REhFSqG2tbW1tbW2tre4uLi4t7e4uLi3tra2tra3uLm2traLfXpsbHp/cGx5dm5qaGdlcXp4b2lvb3B1c21zd4Fnb32CgYNyf3lqcHJ6f6ng393Zy8a/vL2/vsLN0tDW3tnc4NfQzcPCw8PH1dfT2dzX1NjX0MfExce9vM/Kz87Y3djO3N3c2t3T0dze39/e397e3t7e4N/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eLi4uLi4uLf4uPi4eLg4d7W29/Sw8rJx9Hb3OLk4eHg2dre1sbExcTN2trf5OHi4trX3st9aWZxYVleZWFNTFRLUlpMO0hNSEZBPTc2NjUzNDY2NDg3NjU2OTw7Pj46Pjk5PDk3OTs7Oj49PEBAQ0RCR0ZCQT08Q0A9OTw7Nzc3P0RGRkaZtrS1tbW2tra4uLi4uLi3uLi3s7W2t7a3t7i5tba3opdxb29waW50dnFmZWNrbmdvcm1mZ2tygWVvdnyAeGRzj39zaHFyaWVlbm+w39HFv7u5ubm5ubq6uru6vc3Gw8e/urq6uru7u8HCvcHFvby/vry7urq5ubq6ubm6w8XDucDDwby/ube/z8/U3tjc3t/g3tLa4N/f4ODg39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eDg4ODg4ODg4ODh4eHh4uLi4eDh4uLi4uHa2t3RwsPCu8XT1uDdydPDrrnAsaqrq6uwtLbJ0sXRxLG4v7Srq6usr7S0vMzE1c60tLureGxtbWBdYl9ZS1NVVFFQREBRTUhEPzo3ODU3MzE1NjQ5ODQ2Njo8Oz08ODw5Njo6ODg5NzU8PDw/QEFAQkRDQkE8PkI/Pz09PTc1OD5DRUNAj7a0tLW1t7i4uLi4uLm5uLe1sautr7Oxs7OztLS0tqaei2tue3ZxeXhnY2hfcXdha25vaG99b25ja2lseHdsa4Z+bHB6dm1scG95sca8uru7urm5ubq6urq6urq6urq6urq6urq7u7q7u7y7urq6ubq7u7q6urq6urq6ubi3t7i4t7e2tbW1tbi3u8e+w8XHzcS4wMnH0tzZ2d/e3uDf39/f4ODh4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh3Nji4uLi4eHh4OHg3tfGxtHQztTe3tPO0t/SuLi8sq2trKysrrG+ua63rKipqamqq6urqqqqq6ysuKyqqqqrq6urra6urq6urryzrayrpHlub21fXl1dVE1SU1xUSkE/UElIPjg5NjgzNzMwNTczNzg1NzY2Ojw/PDg5Ozo6Ojg5OjY1OTs8Pj9EP0NFQkNCP0BAQT9APjw3ODc6QUVEP4W4tLS1tbe4uLm5uLi3t7SurKuqqq2urq6vsLGzs7WjcG5ucm1wg311aWFlaGZkY2Rxc21td25naW1tZXBzb29zcXN8h4F6dX11n7u6uru7urm5ubm6urq6urq6ubq6urq5uLm5ubm6urq6u7q5ubm5ubq6ubm6ubm4uLi3t7e4uLe3t7a2tbW2tra1tbW1tba1t7e3t7rBvrzGycrb3+Dg3tvd3d7h4tDW4uHg4ODg4ODg4ODg4ODg4OHg4OHi0768zNjd3OLg0dnbxL23sLCxsa+zu7uzsLS9s66urq2tra2sq6qqqqmpqKmpqampqqurqqqqqamoqampqampqaqqqqytrq6urq6urq6sraR4aWJxZmFZWlZRUk5cU0Y9QlJEQTc8OzY5NTY1NDU2NTg3NTY1Nzg7Pjw7OTk5Ojg3Nzk3Njg8Oz47RD8/Q0BBREE+P0M9Pjw+Ojo3Nz9DRj54srCztLW2t7i3trKurq2sq6uqqaqtraysrq+xs7S1t4xucnRqaIB5ZmpmZWxdaG5waGxxYmNmcoJ+dmhobGpueoaBhXx4cXF5gK+6ubq6urm5uLm5ubm5ubm5ubm5ubm4uLe3t7e3uLm5ubm5uLe3t7i5ubi4uLi3t7a2tre3t7e3tra2trW0tLW1tbW2trW1tre3t7e3t7e3tre4v8bP0MS+v8DE19e8ydra4OHg4ODh4eDg4ODh4eDb3t7Uzby3tre6wMDJxLfIvrKwsLCwr7Cvrq6ur7Cwr66urq6uraytrKurq6qpqampqampqampqKmpqKmpqampqKmpqKmpqqqrraytra2ur66trK2heWpjbWdiXFhRUFFLVEpCOklRP0E3PDk0OjU2NTQ1NTY4ODY4Njs6OTw9PTs6ODY2ODg6ODY3Pj09PT5BQUVCQkNBQUBBOj09Pz05Ojc9QUc8bKqmqKutsLGwrqupqKqrq6mpqamrrKytra2usLO0tbilgIdvaWdzdGZrcG1qZGxvcm5rbWNrcHyJhG5qbHx4Y3uKfnNqc25rcY+7ubm5ubm5ubi4ubm5ubm5ubq5uLi4t7e3t7e3t7i5ubi4uLe2tra3t7e3t7a2t7a2tra3tra2tbW1tba1tLS0tbW1tra2tra3t7e3t7i4uLe2t7a2uLm4uLe3uL6+uLq9vcfb4OHg2Nnd4eHg3dfKwcPCurm5uLe4uLi3tbS0tLKysbGxsLCvr6+vr6+vr6+vr66ura2srKyrq6yqqqmoqKmppqepqaehpaipqamoop+hoZyip6inqausrK2ur7Cwrq2unXdwbGphY2BZUU1RTFJGQzlNUEU+ODs3Mjc5Njc0NDM1ODg3OTc7OTo9PTw6Ojk3NDo5ODY1OD8/QEI9RENDQ0FDQEJBQDtAP0A/PDw6O0NIPWOopaWlpqioqKenp6ipqqmoqKipqqqsra6wsLCztLW1taWYdn5xZmt4cW9tZmVsaGNsZ2ZpaX11bWlvfXZ5hWZod294b3Fvcninu7m5ubm5ubm4uLm6ubm5ubm5ubi3t7W1tba2tre3t7e3t7a2tba2tre2tbW1tra3t7e2tbS0tLS0tLS1tLS0tLW1tba2tra2t7e3t7e3t7a2tre2tre3uLe2t7i4t7i4uLi4wMXTyry8w83PyMC9urm5ubq6ubi4uLi4t7W0tLSzs7KysrGwr6+vr66urq+vr6+uraysrKurrKysq6ehoJ6gn5udoaGdlpmkpKaon5mZmZmanZ+gn56fpKqtrq+ura2srJl1cGlrY2FeXVVOU0tSREQ4TktHQTo4NTI2OTY1NDczNzc3ODk3OTo7PT0+ODg4NzU6OTk1OD9AQEFEPkZBQkNAQkNCQT88QEJCQD0+OjpERj5cpqWmpqampqanqKenqKioqKenqaurrKytra2ttLS0tbekc311bnONf3JmanFjaW1jaGZobG51aV9jZ3VzdnpuZ3Bwcn56cYihu7m5ubm6urq6urm2s7a1uLm2trW1tra1tbW1tbW3tra3tra2tbW2tbW1tbS0tLa2t7e3tbS0s7O0tLW1tLS0tbW1tra2tra2t7e3uLe3tra2trW2tbW2tra2tra2tra3tra3uLi3uri4uLi3uLi5ubm5urq6urm4t7e3t7W1tLS0s7OysrKxsbCwr66urq6urq+vra2srKuppaSmpqScmZubmpmampmXl5eXl5aZm5iZmJmZm52en5+dnJ6gpKWko6OioqKQdG5jcGFeXltUU1RIVEo/PFFCRkM7ODYzNzo1NTQ4Mzg5OTc4OTc7OTs9Ozc6NzU2OTk4NTg+Pz9ART5CPz9DPzxBQUI/PT9EQT8+PTk9Q0Y/VaSlpqanqKeoqamop6ioqKioqKiqrKuqqaipq7W1tba5o3eKcXKHhnd0cGh5a2JjYWVsaW5zal9jZWNjZWprYmRqbHaXjX6ovbm3tre5u7u6uLWxrKurqq6wrKyrq62tq6uvsLGvr7CytbW2t7W1trW1tbW1tbW2trSvr7O0tLSvra6vsrW0tbW1tbW2t7e3t7e3t7e3t7e3t7Owsra1tLa2tre3tra2tbW1tra3t7e5uLi4t7e3uLi4ubq6urq5uLi3t7e1tbS0tLS0tLS0s7OysbCvr6+vr66vr62oo6KgnJqampqZmZqbm5qampqbmpmZmZiXl5aYmZmZmpycnZ+foJ+goKChoaCgoJ+fi3RuaXRdYGZeUlRLRFRJPUVTSEVCOzo0NDY5NDQ1NzM4ODg3ODk5Ojs7Pz04OjkzNTg5NjM5PT5AP0A6QEJCQkA/QEJCPz0+QUFCPz06PkVDQFGjpqWlp6inqauqqKaoqKipp6ioqKinp6ioqaq1tbe3t7KZtH99kIx1Z2lqbGZjYGNoZW94cGlicXx5cGpmZmRma3NqhYystrKwra2ttLeysLCtrKuqqaiop6ipqampqKinqKipqaeoqqurra2sqqytraysrq6traunpaSnqqyopKOkpamwsbGztbW2t7i3t7W1tre4t7e3t7Kppaasq6ivtLa1s7W3t7a1tbW2tra3t7e3t7a2t7e3t7m6urq5uLi3t7Wxs7S0tLKxsK6sq6yurrCxsK2rqqmqqKijnJqZmJmYmJiYmZmZmZmZmpqZm5ubnJybmZeYmpqcnJydnJ2foKGhoqKioKGgoKCfnop1amtuWVxhVktPREdVRz5PV0hEPTw4MzQ0ODQ1NDgyODk4ODk6Ojw5OUA8Njk6MzY3OTE0PD8/QEBBOkNGRUJBREJDQTo7P0FCQz9APUBEQ0BPo6empaemqKqqqqakpqenqKioqKimpqaoq6uttba3t7e4rbJ1cHuDdmBiaWtiZWZhZGdmfYh5bHKAfXFvcXhjbW5xZo+srKurq6ysra6urK2trKyqp6WmpaWlpqioqKiopaeoqKioqKeoqampp6Wko6KioqOioKKioaKhoKChoaKjpKOjpaWlqLC0s7OzsKuqqaqztLa3trGopaOioaGipKiqqairs7Sxrq6xs7W2tra3uLi3t7e3t7e3t7a2uLe0sa6ppqerrKmnpqWkpKSkpKWnqaajoJ+enZycm5uampmZmJeXmZmZmJiZmpqampqampqbm5mYmpydnZ2dnZucoKGgoaOjoqCgoKCfnp2FdGtsaFdYU0pHTUVITUdAU1dGRz09OTM2Mzc0NTU3Mzg6Ojo6OTw9OjpBPDY9ODM3ODgzNztAPz9AQDpCRUNAQkRDQT87PEBDQkNBQDxBQ0A9TqKnpqanp6mqq6mkpaWlpaaoqKippqanqKmpqrW2tre3t7izc2h7c2JnamtpaWJhZGloXV1tfHJma3J/fHR8bm1zc36gqamrq6uqq62trKusq6mpqKWjpKWmpqWmp6eqqaamp6enqKinp6iop6WjpKKhoaGhn56en5+fn56foKGho6Wko6OkpKSmp6enpqWkpaampqeqraumpKKhoaChpKWlpaenpaeoqKalpaivtLa3trW1tra1tbOwrKupqa6rqKWlpqampaSkpaWlpqWkpKSkpaKhoaGgnp2bm5ucm5qamZiXmJiYmJiZmpmZmZmYmZmZmZqZmZydnJycnJybnJ+fn6ChoaKgoKCfnZ2cgHNrbmReU0pITUZETEtFRFFTQ0c9PDgzNjI4NDY0NjQ4OTg6Ozk7Pjw5PTs5PTczNTk2NTY8QD0/QD88P0JDPkJCQj89Pj5CQ0FFQD86PkVAO0+jpqWkpqeoqaelpKWlpKWnp6eoqKanp6alpqa1tba2trW2uYptcW1vfHxxZ2pmYGFsYFROW2hqbm9tgYJ9cWdxdn6aqKeoqqmpqqurrKqqqqimpaWkoqOlpqalpaWmqaqppqWjpKWmpqWjo6KioqKhoJ+fnp6cnJycnJ2dnJ2en6CioaKjo6KhoqKkpaSioqOjpKSjpKSko6Ggn6GipKanp6ipqaelpaSipKSlqK2wsKyrqqusqqmnpaWmpaWlpaalpqioqailpaWkpKSlpKOjpKOioaGhoqKgnp2cnJubm5qZmJiYmJmam5mXl5eWlpeXmJiZmpqcm5qampubm5ucnJ6goKGgnp6enpycm356bnJiXlNNSlBFRk5NQkBPRT5JOz01MzYzODM2Njc1Ojs4OTs5Oj49Ozo5OT03NjY5NjU2PkI+PkE/PT5DQT5DQ0BAO0BAQkJCRUA+Oz5FPzxQoKSjpKOjo6SkoqSlpaSlpqamp6empqalpqaltLW1tbS0tbiBaHx9ZXOCemxwdWFfY1ROT1FbaGxpbGxxbW5xbnScoqSnqKioqauqqqqqqaempaSjo6OjpKSlpqalp6ytqaShnp2eo6Shnp6foKCenJ6dnJycmpqam5ucnJubm5ydnp6foKChoJ+goaOioKGjpKSjoqSlpaWkop+go6SkpKapqainpaGdnJ+jpaipqainqKioqaempaWkpKSlpqampqampqenpaWko6Ojo6KioqGhoqKhoqOkop+enZ2cmpubmpqZmJeXmJaWlZSUlJWVl5iYmpubnJuampqam5ucm5ucnp+fnpucnJyam5p/fnF0YFtUTUdNSEZMSj8/TkM8QDs8NDM4Mzc0NzY3ODs9ODo6OTk7PTs7ODk9Njc4OTU4OD9APT9BPjs9RD89REA/PzpAQUE/QUVAPjw8Qz88Tp2ioaKioKCipaSkpKWlpqenp6empqampaampbW1tbS0tLS3jHalsXdmc3Jvc2xjZGlYT1JRT09dgG1kYFptkZGSoqKjpaampqenqKiop6alpaSjoqGhoaKjpaempqesrKimoJ2cm6Ghnpuamp2cmZiam5qampmZmZubm5uampqampucnZ6goaCfnp+hoJ6foqOko6Omp6inqKWioKGhoaGkpaWlpKCcmZmbnqOmpqampqanpqempaOlpKWlpqiop6enpaWlpaWkpKOjo6KhoqKioqKhoaKjo6Kgn56enZybnJubmZaUlJSTk5OTk5SUlJWWl5qam5ubm5qZmZqanJ2dnZ2dnZuampqamZqXf3dvc11aTkhKTkdFRklERU5APD09PDQ1OzQ2NDY1Njc5Ozg5OTg5OTw7PDc6Ozc4ODg1ODg/Qj9BQTw+P0A8PEJAQT49QT4/Pz1CQUA6OkA8PE+doqGfoJ+dn6OkpKSlpqeoqKenp6ampqampqW1tLS0tLS0tbSXtqd1Znh2Y2xjY2VjW1JTU1JNXqCMeFhodpajnp6hoaOjo6OjpKSlpqalpKSioaGko6OjoqOlpqampqenpp+bmpuioJqWlpWam5qXl5iZmpqYmJqampqbm5qZmZmenZ2goqOjo6KkpKWinqGhoaKjpaampaSjoaCgn5+hoZ+goJ2amJeZmpygpKOjpKWmp6alpaOjpKSkpKWnp6ampqampaWmpKOjo6SjoqKjpKGfoKGhoKGgoaCfn56dnZyamJeVk5KSkpKSkpOTkpOUlZaZmpqbm5qampqbnZ6enp2cnJybm5qamZmZlH10bHReWk9IRUdGQkVORT9GOzo+Pzs0Njo2OTM2NDY4ODo4OTc4ODo8Ozw5Ozs6OjY3ODk5Pj9APjw9QD5AOjlAQT89QT8/QUE+QUE/Ojk9PjpQnaCfnZucnJufoqOlpaWlp6iop6ampqanpqantLS0tLOysrGwsK2rkHiGj36bmn93Yl1TUlFRTGKgootaiKCgn52YmZycnZ2eoaGgpKenpqWkoqGjp6alpaOipaampaanpqagm5mboZ+Wk5OSl5qcmpeXl5iampmampqam5qYmJmaoKCgoKGfoaKipKamop6gn5+goaOko6Khn56enpyanZuZmpqZmJeZnqChoaKioqKkpaWmpKSkpKKioqKkpaWlpaWlpaalpaOko6KioqGgoKGgnp+fn5+fnp+foJ+cm5qZl5WUlJSTkZCRkpKSkpKSk5SVl5iZmpmZmpqam5+fnp2cnJycmpmZmpiXl5F8cmdxXl1QRj9BRD9KT0JCRjhDRT4+OTg7Nzc0ODQ1OTo6Ozk3OTo8Ozo8PT48PDo2NzY5OD4/QT47Pz49PDg6PkFAQUE/P0FCQERBPjo4PkE8U5ycm5uampycnaGio6KjoqSmp6alpaampqSjo7KysK2rp6amp6alpqiln6iop6qnoXmEXFFST0xcnKCAYpmgnp2clZOVlpeZmp2dnqGmpqampKOioqanp6ajpaampaWmp6amop6cn6Cem5ORkJSXm52YlpeWmJuZmpqampqZl5iam6Ghn56fnpybnJ6goJ6dn56fn6Cio6SjoqCfnp2ZlpeXl5iYmZubnqKioqKioqGio6WlpKOio6SioaGhoqOkpKSko6SkpKSioqKhoqGgn5+gnp2enp2dnZ2dnp6em5mYl5WTk5SUk5KQj5GSkZKSkZKTlJaXl5iYmZqampyenZ2dnJubmpiYmpmXlZaNempmamBiTkY+P0A9SkVAQ0A7QEE8Ozs5Ojc2NTg0Njc4OT04ODs6Oz87Ojs8Ojk6Nzc2ODs8Oz08Ojo8PTw3Oz5DQkRDPz1BQ0BEQT88OkBCO1eZmJqamZmam5ucnp2foqKhoqSlpKSlpqSioJ6op6alpqWlpaemp6ampqakpaanqKehqXJOUU1KVJahenKanJyenJeVlJWWmJiXl5qeoqKhoqOkpKOjpaalpaanpqSlpqalpaOgoKGeqbWTkI+WmpmenJaXl5eZm5ycnJqamZeZm5uen52cnZyZmZqcnZydnp6fn5+hoaCgoaKgn56bl5WVlZeanZ6fn6GhoqKio6OhoaCgoJ2cnaGioqOkpKOioaSlpKOko6SjoqKioqKhoaGfn52cnZ2cnJ2dnJ2enpqXlpaVlJOTkpKSkpCRkpKSkpGSlJWWl5iYmJiam5ycnJycnJ2cm5mYmZiWlJWXi3hsY2RiZFFHQT1DO0tIRDo7Ozw+OTo6OTo3Mzc5NTo4ODg8OTg7OT09Ozo7Ojk8PDc2NDc/PDo9Ozw/Pjw7ODxBQ0FDQkI+P0JAQkFAOj9APztZmZiampqam5ubm5ydoKGhoaGhoqKioqKhn5+dpKWmpqenpaWmp6ampqWkpKalpKSkpaaGUFJQT0+PmHB6mpubnJ6cnJycm5ubmZiYm56dnp6foKOkoqGhoqKio6SkpaakpKSjoqGgna2jlpOUmJuam56amJiYmJqcnpyam5iWmZybnJycnJydmpqbnJ2dnp6dnp6fn52cnJyhoaCblpWVlZacoKGgn5+hoKKjoqOhnZuZlpaWlpicnqCip6ikoaCgoqOjoqKioKCgoJ+fnp+gnp2cm5ucnZydnJmanJuWk5KSkpKUk5KSkpKSkpOSkpKRkpSVlpeYmJiYmZqcm5qbm5ucnJqZmJiXlZWWl4d3ZGdoZGJNQ0U8RDlJSkU5Ojs9PTo6Nzg6NjQ3OTU8OTY4OTc5PDs7PDo6PDs6PDw4Nzg3Pj07Pj46Qj86Ojo/QURCQ0FBQD9EQUFAPjpAPj06W5qYmZqbmpubm5uen6CgoaKioKCgn5+enp2dnKWkpaanpqWlpqakoqKio6Oko6Kjo6KnllRYVVJOZ21rgZ6am5udn6Cgn56enp6dnJ2dnJ6enp+goaCfn6CgoKGio6OqqaOkoqGhnaONipuZmZiZmZienpiYmZmam5qWlZeWlZicnJ2cm52dnpybnJ2cnZ6bmJqeoaGdm5udoKKhmpWVlpaZoKKgnZueoKGjop+em5eXlJKSlJeYmZ2goqenpaGgn56goaGioaCfnp2cnJubnJubmpqZmpydnJmXmZaVk5GQkJCPkZKSkpKSkZKTk5OTk5OTlJWWlpeXl5manJubnJucnJqamZeXlpaVlZSEcmZsYmRbREJMPT84RktCPEA+Pj05Ozk6PTg1ODg2Ozg1Njo4PDw7Ozw8Ozk8Oj09OTU4Nzw5PD88OkE/Ojo6QEBDQkRBQ0A/Q0FAPj08QD09Ol+al5mamJeYmpycn5+foaGhoJ+fn56foKCenZ2lpKSko6OioqOjoZ+foaGipKOio6SiradXXl1UV19ua42dmpqbnJ6dm5ucnZ+enZycnJydnZ+goKChoaGgoKGgoKKirK+hoaCenJqnc4KenJqZmpuZnJ6ZlpaWl5eTjo6QlJabnJuam5udn52cnJycnJ6dlpSZnJ+in5ycnZ+hoJuXl5mZmpycnJubnZ6fnZqXlpaWlJOTlJiampqfoKGmpqWgn56fnqChoaCenJubnJybm5ybm5qZmJmZmZmXl5iVlJKQkJCQj5CSkpKSkZGTk5aYl5STkpSVlJWWlZaZmZmam52cnJyampmXlpaWlpaQgG9vZV5gV0BKSDg/N0lFP0VBPD07Ojo8Ozs3NTs4Njs3NDY6Oj47Oj0+Pj07Ozs+Ozo4Ojk5NkBBPTo8PTo6OT9BQ0JERUM+P0FBPz8+Pj89PDtgl5WXl5aVl5mbnqGhoKGioqCenp6enqCgn52bpaWkpKSioKCfoJ+dnZ+hoqOjo6OkobCjXWVkYGFua4GenJubm5ubmZianJ2enJubm5ycnJ6ipKGeoKGhoqKhoaChoaeipJ+enJmaoGF8n5ubmp2dm5manJiXlZWWkY6Nj5KYnZycm5ycnqCdnJucnJyempWVm56foZ+dnJyenp2cmpqampqampqbm5qXl5aTkpWVlpWTlZaam5qanZ6foqWjnp6fn5+en5+enZ6fnZycm5qcmpqbmpiZmJiYmJiYlZSTkZCRkJCQkZKTk5CRk5SYmZiVk5SVlZWWlZaXmZmXmZqenpyamJiXl5aWl5eYjX1ubV9lVlRFSzw3PjdSRUM+QkE4Ozw7OTg6ODY7Nzc6Njc5Oj0+Ojw8PT49PD06Pz06ODw9OTtAPj4/PT45OTs/QkNAQ0VDPT9DQj5AQD5APTw8YZWSlJWWlpeanJ6goKCgoaCgnp6enp6gn56em6WlpKSioJ+fnp2dm5mbnJydnp+gn56rmGNpbW5pZm2enZybm5ybmpmZmZqam5ucm5uam5ygo6SgnZ6en6CgoKCgoJ+nlqWfnZuanpNZeaCbm5ufnpyZmJqamJiYmJKOj5OXnJ2bnJ2cnJycnZycnp6dnpqVl5ygoaGfnp2eoJ+cnJuampqbmpqYmpmVk5OTkpOWl5eVlJiYmZucnJydoJ+gnp6enp+fn56en6KjpKKgnp6cm5qam5uamJmZmJeXlpWUlJORkZCQkZKTk5OSkpOUmJmYlpWUlZaWlpaWl5iYmJiXmZqamZeXl5aXlpeWl4l4dmddX1dURUU5OTs8WT5AOEI/OTw8Pjk4Ozg6Ozc5OjU4OTs9PDk9Oz0+PD0+Oz8/Ozk+PDw+Pz5AQUE9ODc7QkNFP0FFQz1AREJBQEQ7Oz47PGKWk5SUlpWUlpiYmZubnJycnZ2cnJ2en56dnJqkpKSkoJ+enpybm5qZmJiYmZucnZ6cpolla3R4bVuFop2dnJydnJqbmpqampydnZ2bmpuboKKinpucnZycnJ2enp2dpI6bnpyamqSGWHShm5ycnp6cm5qanZqam5yVkZOXm52dnJ2fnZycnJycnZ6fnp+cl5idn6GhoJ6cn6CfnJubm5qbmpmZmZmZl5WWlZaYl5eXlpaYmZuenp2dn6GhoJ+fnp6fn5+dn5+hoqKhoZ+fn5yZm5qcnZuampmXlpaYl5eXlpWTkpGTlJSTlJSUlJaZmJaVlZeZmJeYl5eXl5eYl5iXl5eXlpaYl5eVl5eDeHZfW11eUT1GOjk4P1VDQTtDQzo8Pz86Ojk3Ozg4ODc0ODk8Ozw4Ozs8PTo9Pjo/QT06PTw+PkA/PUBBPjk2PERDRUBBRUU9PkVERD9COzo8OTpkl5SVlZaUlJSUlJWXmJiamZqcnJydnp6dnZybo6Oko6CenJuamZqZmJiYmZiam5ubm6WJa3F2em9lmp+enp2dnJybnZ6dnJ2enp2dnJydm5ygoJuampubm5udnJqamaSPkJqbm5ykeV9vop2cnZydnpybmp+fm5ydm5mZmZudnZ2dn52dn5+dnJydn5+fn5uanZ+goJ+dnJ6gnpubm5ubm5yampuamZudnJqZmJeYmJiYmp2foKCgoJ+hoaGgoJ+en5+fnp6foaKhoJ+enp+enJqam5ybmpqZlpaXmZmYmJiWlJOUlJWVk5OVlZSVlpWVlZSYmZuamZaWl5WWmJiWl5OUlJGRk4yRkJOWfXhqYWJiXFA8QDw2OENWSERCOjg7Oj47Nzc5Nj06OTk2NDc6Ozw9OTo6Oz87PT08QD47Oz46PT89PkBBP0A8NztBQ0U/P0REPj9EREM+Qj07PDs6Z5aTk5OTk5OTlJSVlpeWl5aWl5mbm5ybm5uamaOjoqCfnpuamJeYl5eXmJmYmZybm5qkgGpqb3lzcZegnp2dnJydnp6enp+enp2cnJydnp2bnJuampqam5ubmZiYmZqjjo2VmZudoHhpaZyenJ2cnJ2cm5qdn5ucnJubnJubnZ2dnJydnp2enZydnZ2cnJ2dm5uenp6dnZybnpubnJycnJydnJubmpmbmpmYmZmYmpmZmpyfn5+jpaKfoaKioaGfnqCgn5+fnqCioaGhn5+fn52ZmpudnZqZmJWWl5aVlZaTkpOUk5STkJCSk5GUkY+OkJGOlZabmJWYlJmXlJiRjJCPk5yTkoyFjIeDhndxZ2pkW1xRQT44NkJHYEJFR0A+Ozw7Ojg4NjU8ODo4MzQ6Njk9PTk5Ojs9Ozw6PD48Oj5AOj5APjw/QD8+PDg6Q0FEPz5CRD8+Q0VCPUJAPDw8OmeYk5KSk5OSk5SVlJWXl5aWlZaXmZmZmpqampqkoqCfn52bmpmYmJiXl5iZmJmcnZ2cqH1nZXN7enOJop+enp2dnp6enZ2enZ6enp2dnZ6cm5ybmpubm5ycnJiYmZmYpY2Kj5abnZx4amWUn56enZ6dnZybm52bnJybnJ2dnZ2dnJ2dnp+fn52cnZ2dm5qbnJmZnJ2dnZ2dm5uanJ2dnJycnp2dnZybmZeVlZeXmJqam5ubnZ6foqOhoKGhnJucm5ubnZqcmZycn6CfnZiZmZmUkpKUl5SPj4+OkYyNiYuQi4mLjpGRj4mQmJiQkoyNi5KQj5iYoqiqpqWlrKOmoZqep6eyqKKVo6Cfl39wcWlsXFtcTUY8NzdHR1g+SE5URjk+Ojg5ODc1PTk4NzMzOTY6Pjw6Nzo8Ozo6Ojo8PDs/PjtAQD47PT5BPDw2N0A+QkA+QUY+PEFEQT1DQj49PDlmmJSTk5OTkpOUlZOVl5iYmJaXl5iZmZqampqaoqGfnp2cm5mYmJiYmJiYmZmZm5ybnKx/am16f3lxh6Genp2cnZ6enp6enp6dnp2dnZ6enJubnJubm5ubm5yZmZmYlqWPhImSnZ2Ud2pkj6Cenp+fnp2dnp6dnJydnJ2dnZ6fnZ2fn56goJ+enZ2dnZybnJ2em5qbm52enZ6dm5ubnJ2cnp2cnZqYl5SRjo+QkJGVmJSWlJiZmpudmJuYlY2Mjo6TkpKRj4mQjpGRjo+Ki42NjYiIi4+Lg42NkY+MkI2Qk5WVnJihoJySn6SipKmam5eanKOprb3Bwbq8uL26ucC8ubq3uru7tL2zwbV/bnVmZ1peWUxJRTo7TElTPFZSSUM6QTo7Ozc3NTo6OjgyNTY4Oz08OTk7Ozw5Nzo4Ojw6PT85PD8+PDw9QTs5NTg8O0A/QT9EPTxBQkA8REM9PT06YZOTkZCUlJOTk5OTlJeYlpeZmJmYmZqbmpqamp+gnp+fnJqZmpqampmYl5iZmZmZmZmphXB1e4B3b4mhnp6enp6fn56en56fn56dnp6fnp2dnJ2cm5ubm5ubmpiYmJafjICCip6eiXRoYoufnp6foJ+enZ6hoJ6dnp2enZ6fn56en6CenZ6enJydnZ2cm5qYnJuVmJqamJiYmJmSjJCXlKCXk4+MjYqKiImMiJORh5CPjYqKkJCLjoqMi4+IiImJjpGOjYaFiYaKhoWLiI+SkJCNkJKXlpKamJ2TlJ6kpqaqq7Gsr6+rpquqsbm5tbS0rqyvtMDIxcXBvsbDxMTDurW+t7a0s7C2tb6qcHRyXGZfXl1JRj8/RUtMVklcTEQ/PUI6Qzk5Nzc7OTk3MTc5ODo+ODg6PDw7OTc5OTs9Oj4/OT5BPDs+PD46OTY5PDpBPkNBQT08QkBAPkJEPj8+OVyHhIOHi42KiYaFgYqMkZOVmJiHlZaWkpiampmenZ+gn52ampubm5ycm5iWmJiXl5ibqo56dXZ7f3mCoJ+fnp+goKCfn5+foKCfnp2dnp+enp2dnJqbm5ybm5uYmJiXnop5enmcnIRsYl6NoJybm56dnZ2doaGfnZ6dnZ2dnp2dnJiWlpaYlZWSlpmWk5GKjI+PjI+NkIuLj4+WiYiEi5GZjn2Fi42PjYyHioyQm4yRj4+Lio6TjIyNjIiSi4yFiYyPhouIh42KhYyEj4qXkJOYmpWbnKOqoaKknKKrsbe0ubWxs62vsrKlp7O6sbq6vLa3tsDDw729vLa/urq8wbW4wL60r66mqa+3mm58Z1tjWl1fSEU+QUtJU1hZXkFGOTk9OkY/Pzo3Ozs7NjM6Nzo5Pjg6Ojw9OTk4Ozk7PDo+PTtAQDs8QjxAOjg0Nzw7Qj9BQj4+O0NEREBDQz0+PjlhmZWLkYWNj5aSiHl9e3+Fi4OKgoqJhmuAeJCLlpqRnZ2UlJGTlpeampiWk42Sk5KQm5uIdndzcX1/cpGgnZubm5yenZ2eoKGgm5uWlpucmpubnJuYmZqYmJmbmpqWi5mThHd3mJ6HbWFdipeSkY2SkY+Uk5KXm5mYm5ePjpCLjo2Ch4uLi4qLiI2RjIeHhoqIiZGKh4yEhYqNi4qNhI+UkIyDkJOUmZWQi5OTkZWRlpWOj5GMlI2Oj4qIj4ePhoeJiYmNiomJioWNh46JmJKUmpuXmKChp6Cko5qqqbO2sbWwqKmiqK6tn6qvsK21ubi8wr/BxLixtbCutrOwuL68ury+urOzp7G3wpB1gGNiXlpXUk1IRkVQSVlXX1tDUDpCQz1HRj84Nzo6NzU1OTc8OTw5ODo9Pjo6Nzs7Pjs7PTs9P0E7Pz48Pzo4NDM3OkFBQEI+PjpDREM/QUM7PT45Z6mloqKZn6CippeUiI2CiIJ1h4iKiIp7e3Z7enmPeoiSfn18en6CkYWBgH1zfH99fISHfnRweHZzfHaBj4iIiYeIioyMkZicl4iOhIuNi4iNkZCPi5GPi4yPkJCRjo2Zm4lykJychHt0ZIONhYeBjYuGiop/iYqGiJiRiIOIg4KFfIuLjIaJi4iKkIyIi42PjI+Wh4mLio6NjY2Wk5OdnJyalpycm56bmpuYnZeTkZWWkJKRi4+LlpSMjYqDi4SEiYyQkIqOio2LipGJjZOTk5SVk5KcmZ6Xn6CfpaKvsamupKSfmKStpqa4t6ysu729wsPAv7+vpa2wsLS3uLO0uLa0ta6stK+4tLaBeXpjZmBeVlFRQUVMT0lcXl9UR0dCS0xCREA9ODg7OTU3Nzk3Ozc9PDk9Pj05Ozg6O0A8Oj06PkJBOD88Oj84NjQyOTtCQD9CPj04QEI/PkBEO0A+N2CloJqXnaGaoaCPl5efl5WCjaCfo6GdmpKOjIxycXBvdnFucG1ucHZub29waHBxcHR+c3FycXd7cnl2d3Jyd3Z6e3l8fXt/iIGEi3+PkYaNi4yGiouLiYeEgYaCgIGSnYh4WoeTlmxue3OBh32AgZKQhoSEhY2DhIyPj4+IjY+Hi4iRkJWRjpCKk5eOj5WYp6SfnZWYlpaln5udq6aqt7W4srGnr6qnpqGfmp2WkpWVkYqPjImTjZuVjYuLhoaJjJWQkJCLmZKVlZSbkJiTlIyNkYyWl5WilZ6mqauno6OqsJucpp+mq6G0vb6zs7+5u7u6uby9rqiusa6wuLyztLGxqrCpqLGxsqild3J0X2hhYFRWUUlKSFZNXl5eVExKRVFKRUdDPTo5OTc0ODY4Mzg4PTo9PD47OTs4Ojs/PDw+OT9DPzg7Ojg8Nzc2Mzc5RT4/Qz89N0BAQT0/RDw+PThUj4yGh4eUjJWZl5yWmZaNlZyWlZydoKCdmpiWeHFubXJ4cXFsbnJwa3FvcG1yc3t1dnd5fnVxeHZ0d3tybn98gX15eH1/eYOGg4WCg5CLkIuLi46Pi4mJhYKBfX9ymJR0ZE91i4xgXHFzg3t9fIaOjYuGjZSSi5CXj5SXkpihlp6XlZunpp+goKawq6GjpbW0sqqmqq+isba5vcK7ucO+vLi9uLWxrLCspZuSk5mfm5SPk5WOmp2doJqfn5edo6qsoZ+em62hp6qwqaampJiRkZWUo6SirKSss7Szs6i3tru4sLKvra2yt7a6srW6s7e5u7i8urayr6yxsbKztLOxsa2us7Gzs6yhl3Zxc19jXlJRVE1PSUdYT1pcZFROR1VPRURKRD44Ojg3NTg4ODU5Nzo6PTw/Ojg8ODk5PTs9PTpCPj84Ozo5Ojk4NjI1N0I+P0RAQDY+P0I/PEM8PT46Tn98go6MjJOTl5eaj5SWjZaRkZSXk5qanqGdnHJvcnFxcXFxcG5zcW91dHJxdneAdXd8eYV+d3t8eX1/fICJiYmDfXp/h4GIiYGAgIGGiIKGi4eIhYSIiImEf4J+faCHX0tJdIN8Wkpha3qEhIWKj4yNkZmdlJSUoJqan6Ktsa2ppKWtr6ysrLWuvrmtrqm1sLexq7G2rK+9wsLAvrq8trKutraxtK66u7OurKepp6unoqmtoKmooq+wuLSxvLq6urK0ta+8tLezt7e7t7mtrbCprLW5sbeytLe2sLu7vLu6ury1vLi0wbWsqqqrtLG3uLm1trSzsKymrrCqq7Cxq6yusLKxtK6qo5N4dnJlZ1tMUlBFTUlTV1JlXmdUUExcUUhMUkNBOTk3OTU4ODY2Ozc5Ojs6Pjk4Ozo6Ojw8Pj08RD45Njs7ODg+OTUxNTZCRkREP0A3Pj5DPjpBP0BAO0t/gomXmJSdlpabmIuSlo6XkZGVl5SZl5+bmZx8dHV2dXl1c3RudnJzdHV2d319gX56gXyDfoJ/fYB/hIKFj52RiYF/go+Xjo6HgoCBiIuFfoqRjH+IjY2Li4eSiY+eeElCRXR4bVU+TGRzi4uNiYmQj46PlJSYkJWcmp2eqK6yr7C1tLOtsrW4sLy1tbGqsKqztbS7t7SztrS1r7i4t62noqassLCvtre3vrW5vLOysa61u7C0r6+yu7axuMC9tLS0s7izvLq2tLrAvbm6ubq+ubm5vrWysa+yr6q1tLGzsbSzrri4tb+vpKaoo6ussa+zrq6wsKytq6qroqKmqKKnrauqpaynoqeYeHlxZmVZT09NSVJNV01PX15cTlVVYlFEVE07Pzk8ODk1Nzc1Nzk1Ojo6OTs4Ojw8Oj08Pj4/P0I9ODY6Ojk6QDs1MjY2QUZDQz4/Nz49Q0I5P0I/PjtLjpGTmJmVmZGTopiTkpKLk4uOkI+Vl5ablZSbhoJ9enh2dHRzdH53end2gIKDhouMhISFioaQiYeRk5aRjZaalY+IjI+emJaVkpCTl5qamZGeoZ2Tl5uhmp2cop+glGFTW0p0cmNXRkVTbH+QkY6LmJqPj4yUmpecnZugnaSstLm6vK+2tLi0tLK3uLmzq6+qqKy1srK1rrGrrqa3s7OxpaGotbCvrayrtbqyu7q6tLK3ur67ubG4sLmtqLK4u66ttLS3tbu2trm5vLe0r7G0t7a5s7e1pq2pq6ior6yprq2up6KxtLG0q6aop6Cjq66oqq6orLKwr6+pqKGeoaGjpqOgopqlo56ol3J3bmdiVUtUT09KRFBLX2JYWlFcVGBNSFJJQUA5Ojg2Njc3NTg5NDs5Ozk8Nzs+Ojg8PD0/QkBBPTs2OTk5Oj87NjM3OD5GQkJAQjk+PUBDPkBGQj44R5OWkZWTkpSQkZ+ZnZmVkI+Sko6Mk5aWko6RlZGSkIaBeXJzdXuBhI6HhZGTkpicnJiVkJWYo5yaoaeqqZ+clpeVnaKioZyZnpmlqKyvramnqqqpp6KlqKmrqqmvpIRWgo1UdHxsXFltVV93lp+foaSem5qkp6Spq66spaSoq6+xtK6qrK6zr6ystLO0ua6urayqrLKwsK2wqKqmsrS0uK6qtrqwr6qurLC3s7i0t7W0u7y4tbWxtauyrKiys7uvrbGytLa1sbG0s7OvrKuvs7a0sayutKqqpqWnrauoqKupqqifqbOwqqeppaOio7CtqaatpairrayppaSioKWipaOYmZyVnqKippdudWVnZFdPWEtLSktTVHBiWWRXX1tcUlpQTEM8ODk6Njk4NzQ3NzQ4Ojw6PDg6PTk3PDw7PkM/QT47OTo5Ojs+PTg0NThBREVEQkM5PjtAPkI/R0Q+N0KSm5SVlZaVj46Wl5qZlZGKk5SSjo+SkYqKiY2Ul5qTjYmCho6VkZSfmpuin5+jnqGhn5ijpKelpaapqa2rqaKmpKilpKGfnqOjra2srairrq6rq6ykoaKlqaenqaN0asC9UH+Th29fe2tWbpuhoainoKKirqurqqetrqilpKmpqqmmo6iqqaekp66wr7Ovq7Crqq+yr7Czua+rqLCxrrCyubO0r62vtbCss7GurLW1tLSzs7CvrKyqrKusr7G0s7CwrrCwsKyqrauqq6alrrCysKumqbCvqaOkqaunqKaopquwq6mvqaaoqaalo6iwraqpqKKpo6WnpKGhoKKloZ2el5aYlJugpKmUbnNeamlfVVpOUk5QT1NlXGVjW11ZXFBZT0tAPDs5Ojc6ODczNTMzODo9OTo4OTo5Oj08PEBEPkA9OTo8PDw+Oz45NTo8QkFFQUNBOT47P0BEQENCQDdAkZ6YlJeZlpGHi5SSl5GIg4mLk4+OkI2Hh4SFlZmWmJeZlpqeop2anKKkoaCdn5qfoKGgpqGgoKCjo6KlqKmrramqpqOmpaCloKaop6aoqaepqaSoppqdpKaioaGbZYfGvWWpoZOXXnGDXWCXnJmioqCgn6ChqKCcnqGloaCmo6KfpKGspp6foaGkrKqnrKivq6e0sa6ur7WyrKqwq6mtrbWwrq6srreup6yqpKivsq+sq7Kvqqqpq6utqa6urrGxraqtqaunp6uoqauinaapqKilqKisqKilpKWop6iopqmsr6+oq6mhoqKlo6Opq6ymqKWjqKKhoKSdnZ+hoZ2bnZ+amZWcnKOqlG9zZm5yZF1cUFVPWE9eZGRsaGJiWlpSVE9NQTo9Ojo4Ozk1MTYzMjg4Ozk5OTk7OTk8Oz0/Qz5APTk7Ojs8QD0+PDk5PEFBRUFGQTo9Oz9BQUJBRUI4PYqWlJOYmpaPiISNjpGSjIiIiI+JiZCRjoqKiJubmZygpaKlnqKjoZqeoZyanZ6bnKOop6ugoKOYoJ2XnKGjo6WjoqKkrKilqaCepqmnq6mkoKKhoqehpq6mppyfmV+Ntb6byqSTqXVor3JXjZubn56gn56eoKOdl5qYo6KipJ+ZnKGhoqCbmp6goaSgnaejqrGorqusqaSqqquorKalrKqws6+rq6mwq6appaWoq6ynpqevq6Wnq6upq6irqqqrrailqKOmpaesqayoopykoaOmo6qpqKano6SnqKanqKepqKupoaKoo5yepqWjqKino6WlpqmgpJ6inpeYnZ+doqKlnpiUlZ6go5d1d2t2eGJfW1VZUVVXW2Nec19oX2NTUVlUSD48PTg7OTo4NTM3MzM0Nzo4OT05Ozo5PDxBQEM9PT44Ozw9PEA/Qj86ODo+P0NAREE6Oz49QD9DQ0VDOTyCmJmenZ2alZKKiZGRl5GQh4SJgoGNj4+Sj42cnZ+hpKmlqaeorK2moqKfmKSmo6Stsa6yp6asm56em5qjp6Cfo5+foq+rq6yoqKuvqaiqqKKgoaeprbGyr6ujo6RtgpWVqMadkqGERqyNWIahn52epaSloKSzpZWem5+fpKGblZigoZ2enJudnZuZmZWen6Oonp2iqKGaoaOmoqSoqaqoq7CxqKWlp6eopKWpqaqnoqWmqKadnqWloqClpaOlpqCjpaOjpaelqamqpKekpqKmp6SrqaenpKGlqKynpqWlo6OopJWdo5+bnaCjqaeopqGjo6mooKiioJyVkZqfoKGmopuXkpCamqCVfHdvfXlmW1tgX1pcVlxoZG9jbWppYl5QUEA/Ozo4OTg8OzYzNDMzMzc5OTs8OTs7OT49QkBAPTs9ODw9QD08PENBPjo4PT9EP0M+Ojk/PEI/P0FEQjk6gJ6kp6Kem5+gmY+ZnaCWloqGj4iEi4qTl5SRo6Wnqq6trLOys7S4t62pqqevtLKxqq6usbKusa2lq7OssbGpq6+rq6y2sLSwq7GysaOgo6qqp7jBvrm2t7OurK2vhH17bK27oJyagFeDgWeDqKGXnqWimZawvqCdoZqWnqScm5aZoqefoJ+joJuUlpmWl5qfoJmVnqGZmJ2dpZ2gpKeqqaiqraylqaSlqqeqqaqsp6SkpKOimZmhnpqaoaCfpaWYnqSmpKqooqelpaGqp6mnp6ejqKWmpaGkqKesoqekoaalpaOVl52Ym5mVo6elpaSfnZ2lo6Kqo5+amZiXnJyaoaGakJOTl5ibjX93cnZ4amJbX15cYllgZG5ta25hX2RgUE9BQDs7OTs4Ojk2MTQzNjQ3Nzc6PTo8Ozk9PUI/Pj89PDo/OTo7PD5CRUA9OTtAQT5DPDs5PzlAQEBAQkM7OXuao6OcoJ2dop2Zn6KioJibmJaYkpSQm5qWl7S0rrW4s7S4tre0uLm3tbm4ub28uKqLnLK4vLS9urW7uru4s7q/uLe5u7G3r6iusq2inaCrsrfP3t7Yzcm8t7m6r4l4ZGqno5qWintoa3J2eoeLhYWEdm+NuKmjq6almKGko52goaKooaOgpaGck5mYmJmco56cmpudl5uZlqWam5+hqKmpqKuvr66pqKirrKytq6irp6WjoJyfo6Ojn6Cipammmpyip6Spn6GjoqKgpaanpqSooJ+ipKGjoqiop6OloaGopqalo5mbmJuTj6GknqKfmJiVoJuhpaCfm5udnJuamZugmo2YmZiTkYaAdnh4eGNbUllUX19hbWh2bHBoaWliWlNMQDw6Ozg5Nzk3NTU2Mjg1Njc3Ojw7Ozs7QD4/QD0+Pjk6PDk2Nz47QkZCPDg7P0NDRDw+OT43PkFCP0ZDOzhwkpqblJ6bm52Vl52doqajopaXnpaXl6GblJi+t7G4uba3t7i7l5S2vbu9vcDFtaK7mKC3v7+6wcm0nbu2sra/xcGooLa0urGqrrSxsLK0tba7w9fg2M7Gvbq2rpp4alBjlISDhHpybWhobmtsbGtmX1p3srSqtbWus6CnqqynqqmlpqCnoKGmoZOWmJ2foqSjnZ6coaChnZekmpmdoKaqqqqtrq2tsLGrrK2sqamrrqimpaalpqSkpqaeo6eppKGcoKKjpqCio5+jpJ2foqWgpJyboZ6fo6GhpaSlqaOkpaKkp6ehn52elpOcoJiZko+MjJeWn5uWnJqdnJqSlpSUmJOQmp2YiouHgIB8gnhhXllUYWlgZnNvdGl0ZGlkYltMSz46OTg5ODg5NzM0NTI1NDY2OTw8Oz08P0E/QEA9Pj44OTs4Njc/OUJFQzw7PD5DREM9QDs9Nz1DQ0BFQjw3Z4yRk4qalZiblZWYm6Knq6aVl5iQlZmhnpeXvrWztLu6ubi5woeYt6u4u8DCxbOjw6e4s72/tMTHvbS7uL62wMTErqCworW2tb2+wcTHw8O5vb/E1M+5rqmknpSAZF9KXHxucHdvaWhiXV9eYWBeWlRut7KqtLywtbaor7Gwr6yqoqajrJ+fpquXmqifpaWfoJydoKuwsKyiq5yYm6Cor7Kys6uorre1sq2tqaalqKulpaStqaShn6Cnnp6mqKmmnp+anqGlpqmcnaObl6KmmpuanZ+cmqGcmZ2eoKijn6GfnaWioKOioZSZmpmTj4qLhI2Qk5uPjpiVm5eYkJORkomNl5iYk4uKi32AgIVwYGJfXmtjYm54dXZubVtiUlZcTUc7PDk3OTc5Ojc0NDQxNDM3Njg8Ozs8PEBAPUA/Pj8+Ojo5Ojc6Pz5FRUU8PT1AQkJCQUE7PDhAQ0NARD87NV+MjIaFlouUlZeYl5ifpqellpWVkZebn5ual7mxtrO5vLy5urWqsryxvsG0vMe5uLuuv6fGw7/KxsnIxcXJvMLHx7+xsKe8vL7FxMbJx8XGu8XBxcnMxqGRjoh8aFdYSVNrZWZuaGJlYFlbWFpaWVVss7miprG2q7WyrbOtqK6vp6awr7Ktqq+zpKu1qaeopKCgnqmyuL61tbWqqaausre4t7apq7i8ubexr66noqOop6SfqKOfnqCZoZydoqSnp6GelJuaoKGlnqChnpajnZSQlpiboZqflpORlpSin5qenJudoZ6kn56VnJiPkpOPjImTkJefiZCWkZuUmJGRlZaDjJWXlpKLjIh8foR/aWZoYWtsZ252cXJ1cWdeX1xSSUU/Ojo6Nzg0ODw3NjU0MjMzNjU3PDo7PDs9QD4/QD48PTk5OTs6PDw+QkRFPj49QENDQkREOzo4QUJCQUNAOTJbk4iEjZGKi5GRlZCSmp2fnJOSmJSdnZqXmpW2sbm1tb6+tri1uLO8vMTEusPHwb+0s8XFxr/CzcfLzsvLx8HDxsfIysXExcO7vLzBxcHFxL/Dw8bGwMKvlHRtZFpWV0VOZ2JhamRgZ2ZZWllYWFRms7yypqqpqKqtrKmlpZ6pr6uyu7q4u7e5t7O5uLOurLO0qrC1ub3Bur6+vL60urm4u7qysbS8u7q7s7Oyp6Smq6uioaCdmpudmpyXmpuenJygnZaclpuZnZ6io52UnJCNiY6OkZ6bnJWNh5KLmJiWmpybmJybnp6cmp6UjpiYmpSRmZeeoZWYmpKXlJWRlJqYk4+TnZaSi5F+enx+dGtsbmRvbWlxeG55aWlhXGdhUUZEQTw5OTc2NDQ6ODQ2NTMzMjY1Nj05OTs7PT47Pj49Oz05OTs7Oz89QUNBQkFAPEBDQ0NFQjs4OUQ/P0BCPzsyV5uQkZCQh4WSjo2IjZCTlZGPjZSUm5STlpqRs7e4uLi+u7C1sri2tbbAw8G+w8LAvru+u7u8xMzEzNDLxsa/xcfLyNTLysjGv7u7vsS+xcjGxsTExLm0x7qAWVNTV1VAT2ZkYWlkYGZpW1hXWFNiqbiztayupaSjqKSgn6WZqrSxvsG+urm6uLW0srG0tLO6wL7Av769u7u9vsDCt7a3tru7sru+ubi3u7a3tKyoqamrpqijnpOampyYkZKZl5GRmJqXnpiWk5acm5+elJOJiX6GiIuWlJiZkYmVkZeWlZmbmpaYl5idnpyhmJWZmZyYl5ybn56jnJ6WmJeTl5yZmZyUlp2UlpOJdnl5e3dua2lodVpmcnhzeWZmXWRbUlhJRj87Nzg4NzYxNjk3NDQzMzM2NDY7ODo8Oz08OD0+PDo7PDs9Ozs+PkRBQURCQEBBQkNDREM9OTlCQD8/QD89MkyWmpaSk4yKmJCKi4yOkpKKiIaNkJiKj5CUl7O7tba/vb2xtrjBvby0uL/Bsbi3vsHFvbu8wsbJv8jOyMHEwcfKysbKxczIzcbIxb/DwMvNz8rGxMPEwsTCsnlRS05PPVFjYmVtZl9kaF5ZV1dkqruquLWzrKmjoa2prKatn6y1tL/Cvrm4vbawrausr7W0ur7Fv7u8urO5u7i5ubWtsLS9u7G/vLiytrmzubu0ra2orKyqqaeXnpualY2MmJSTi5WWlJyZl5WWmZKYn5mQiop+iYqKkY6Vl5OUn5mWkJSZmJmWmJOUm6GeoZiYmp2ZmZaenpibopqdnJuYmpuZlpeXlpyZlJyYfoB4eXV1ZWZpamhdam9ueXhjYmBgXlhXRkU4Ojg6OTc5NDQ5NzY2NTEyMzM0Ozo9Pzs9PTo6PTs8Pjo7Pz48QkBDQkJFQj0/Q0NDQ0RFQDk6QkFBQj5CQTVCkJeUlZmSj5qQjpKRjZSVi4qHjI2UiImPkpq2u7S8xsHEwr3BxcLAtLO9v6ywr7rDysPCvs3IxbfByMW/wcLIy8rCwsTJzM3Oz8zDx8bIycjIycfFycfIx8K9gk9NTUBNZ15na2pgYmFeXFlkpcG7ury6vKytpqq7urm3wLK1uLLAxrq3t8Gzsa2tqau1s7u2w7a2vbWxt762s7e4sLW2v7uwvbq0q7CxsbO8urOzrqutq62xnaOjoJqQjpiXlZCclpaYlpWSnJmTm5+clpGUjpWQiYyQlZOUm56YmZKSnJedlJmSk5aZmJ2VnJ6do5yVnZ+TnKKcnKCfnaOemJSVl5ebmpmgkH99cXRxb2NhZ3ZoaWl0bXlsXWRbVWBZTEhDNjw5OTg4OjUzOjY2NDQxMzUyNTs6PD47Ozw9PDs8PTw7PD49P0E/RUFCQ0M+QEFARUVERUE7Nz5DQkI+Q0I4O4+akZaalJKUjZCUlI6VlI6Pi4yJk4uIkJObt8C6xsXEw8zCwcS9vrWvt7uvr7O6wMfFxMHMy8W2ucDCwsTHytHLwsPExsnFzNDNx8zJwsLHwsvLyMfMyc7FyL98U05FR29gYWFsYlxdXltdm8fCxMfBvL60sbCwwb6+wca/vri2w8K6urbAvrWyrKmvsri+tMC0tLi0t7nEua+8vrm+v8K/tbq2q6qsrq+wt768trSura2utaSlqKimmpycnZyeopydmZOQkp2VmKCdmJiVmZmZl46MlH2QkJefmZmYk5GToI6Nko+VjpCUlaKdnKSem56elpyjoKGipKOkop6amZubnJ2enIN9cnx4cGdga2p3bGlldW50Yl1iVFdVU01HOjc7OTk3Nzo3NDg3ODQ1MjM0MjU7Ojk+Oj08Pz04Oz05OTk9PEBBQEVCQUJBQT9AP0RFREVAPDk+QkNCQENBOjSAoZeUmZiVkImUk5aTiZGMlJGOiJaKi5CXnMXLw8O8wMPHwbm9vbu4tre3rrK3uLzAwsDCx8bHurzAwsTHyMbSycHDw7+/vsTLyMrLyby8yMfJzcjDyMnJxcXDrn9UTUhqY1xfbl1UWllbksi3v7/AwLq7vbWzs7+/ub/DucC3u8G8uri7ub27srCvsKy5wri9ube1t7q9xb24xsjCwcLGwr28tamurrCwr7O6t7m2sK+tr7OppquprqannqSlo6OjoqCblZiekZecl5GRlZeZlZmRlJiSlYyYo5qcnp2FiZ+TfJKWlZKUlJennaCipJ+en56foaGkoqKjoaOinJ2fnqOhppl5enl/cnBmZWdjamRiam1ub15ZXVZWTlBKRjk5Ozk3Njc3NjM3ODk1NjEzNTI3PDs8QDs/PDw6ODo8OTk4Pj1APz9GP0JBQz89QT5ARENDQTw5PENBQ0RBQDozbKKdlZedlo+PmJiZmIiSjZGVkI+Vjo6TlpbKy7u5urnBu7q3vsG8vLu5sa61uri4u8S6vsC+vru8wMXBxsK+xsK5u8O6uLm8vsHHwca7ucjIw8XEwMPBwcDEwcO7hlRJWV5teYFQUFNWhsjDr729uLm7u763tLC5vrO8vrG5tbi7tryztbm2uba5t7GtusG6vMG/t77Ev8bDw8fHwrvAwr/Cv7iys7O1tLGut7S3tbSxrK2xp6Wlp7CtqJ+nq6ajqKWmpqCgn5SYmZSRkZWUl5OYl5qhnZ6hnKGdoaWglpSbkZeXmJqTnpmZqaSlpKWdoqCanqCkoqOcoqGjoJ6cnp6ppaiVfXuDeG5mYWRiYWNkY2pjZ2NbWlpcWVFPRT07OTo7Nzc5OTY0OTk6NTMxNDUyNzo7OkA9Pzw8OTc3Ozo5Ojw+QD8+RDxCQURAPz49QkRCQkI+OjlCP0FCPT44NVmfnJiTmZaRlZiYmpeQkZCQk5GTlJKSkpSUxce4tbq5wrm5vMPFwri7ubGxtry6tbnAu7u5tre0tLW/u72/ub66urTAuLW3sq66u7fAt7zKz8G7v8C8u8S9usDEwbqLV0dOf5WSRUtafrjLvrDBv7q3u766tbe0uLy0vbi1tLCzvLG3tri/tr25vb65t7q+u7/Axb29y8PGw8TAw762ubq2v7i7v7y4trOyq7CwsrWzs66sq6emnqeurauiqKumpqqjp6iqo5+Ym52bmpicnJiXnJuhpZ2anqGhoKGmoJqbnJiboJ+dnJ+coKiho6SknaKfmqKgop+el6Shop+dmpieqKWhi3x5iH1xZGFiY2hqZ2dqZmldVlZUWU9TTEY4PzY7Ojc3OTs2NTo7PDYzMTM0MTc7OTg/PT47PDs3Njk5ODo7PUA/PkA9PT9CPjxAQUNDQT9DPTo2PEBBQDw9ODdJlJibj5OUkZWYlZGWkpWRkJGUlZSTk5OYlcHCwLq8ub62uL7EwMKxvbqytLO4vLW3vMC8vbS0sbC1t7W7wbi+ub+8vLe0t6+ut7W5v7vB1o67vrvDtrnHt7W3ury6uZZuSnidkUBakLa8wb65xrzCv7zFuLa3tLi2tru7uba0t7q1tLi8vbm/ucPAwLu5vLu+vcjEvcfEw7rAvb62sra4srm0usLCureysaysq62yr7Kur6ijpJ6rrKyqpKakpKiqoqemraihoaGmn6Oiop6bnKKfoKOdnJuhn6KgpKCem5eZn6GdnZ6eoaWkoaKioZ6ho5yinqCZnZijn52eoJqZoKKmnYR6g4F5cW1lZWZvaWVsaFhYTktLS1JKTEhEOT44PTs2Ojs5Njc8ODk4NjA0MzE3OTk7Pz0+Ojw6ODg5PDg6Ozs7PD1BPj09Q0E8P0NDREA/Pzw6Nz5CREE/QDg4P4mYmoyMkI+Tl5WMkpCakpGXmJaUlJKQmZTDvsbBwby8uLi6v7a8scK2tLyxtLa4s7q9v768sq2vrLGwt7y3u73BxLm3t7a1ubm6u7+80MV4rMu9x7i5uK22s7a5s7a0tIZ8m4lWoL/Avr28v8jDxcW+xri1srK9uLi4vrq6uby6urS3u7q5v7zEwL+5uri/ubvFxr3Fw8Kyur27sa+2uLO3s7q+wLm2rLGrrqmqqa2qqq6mpKWnrq2ppaOio6GkpaWmoqato6Klo5+ho6Gcmpyhn6CloaCenZygnaWgnpeVmZ2fn52gn6KmpaCknpybn6Ofn5mcmZ2epJyWnKOcnqGcppZ+f4d8a25wZ3Brc2ZibWBcVElLSkRKQ0NHPjo7OD48Nzs7OTc4Ozc8PDYyNzUxNjk8PD08QTs8Ojs6OT45Ojs9PUA+RD89PkRAPz9BRkQ/Pzw9OTc/QUNCQEI5Ojl3nJiLh4uQkpOWjY+TmpOQnZiSkY2PjpiSvbfHvsO+vbu+vL22uri9ure9s7OwuLi1uby7wLeqraSusLi7sr2+u8S2tbi1t7++xLzCxNetdYK9yM/CwLiutbS6vbe4sb+/m5WBl83Dwr++vbzHzMfHxMe9tbW2wb27u7/CusDCv7y2t729vcHBwL+8ube8wru3v8W7wr++tbe8vK+vt7awtLO6ubq7r6mtq62rrKaqoqeuqKWqra2vp6Sgn6ajnqKjqKOjq6Oiop6dm5ublJaZnJyfpZ6fnpmYnpejoJyXmZqZmqOjop6jo6egpqCbnaCjnp2WoJmcoKCblJegn6WcmKKQgYaAcWZsaW50bnhjZ2JcY1FLVEhFRUNHQjw7OTg9Ojc6PTo4OTs3PD01MzY1MDY4OTo8O0A9PDo+PDk+OTk9Pjs/PkM8Pz5APz4/P0ZEQEE/Pjo3P0BDQz9APTo4ZqGYj4uNlZKVlY6PlpmVl5uVjoyMjY+bk7m2wbS/vLm8w8C+wLq1trKywLmvsry8sLe7tru8qqqjsLm9vLK8vrzFuLG4ubzGycrCx8nRmHF1sNHRzMrEtbq/w8i+vrS/w698abXMxcK+wby/w8zKx8XGwLm+vMS/v7/CyL3Hx8XFvLrEv7vBv7rAvLu7wMS9t7nCub69t7S2uLqur7WxsLCytre0t6yurKqsrKuoq6Gms6qlra+trKippaOkp5+io6Onoaeiop6cnZyamYyQlpeZnaKZnpuVkp2UoaCdmZ6fmJimpqKfoqKmoqeloqCko6GbnaCbnKKfl5WVnp6kmpafiYGDgXRvbGx0a2xuX2NeYGFOSU0/RUA/REM7Ozo6Ozo4Ozw6OTw+Ojo+NDQ1NTE5OTo5PDtAPD89PTw4PDs6PDs7Pz5DPkI+QD89Pz9FRUJBQj87Nj9CRUQ9QUE6OlmfmJOSlZqVmpOQlpeclZuZlpSVkZKTnZm2uLaxuru6vsG5uca7trWypb69tLbBv66zvbS4wbGwsbS7xdDCur68xL63vMC/yc/HyMrKwYVzdKjMzMvNysbCw8vOwby4vLq5dVi2yMbEwMC/xMDKysPDw8O5w769ub+8wsbCyc7Hxr66xr26v7m3wLm5vsDCvrW0vLi2u7CvsrK1r7Cvrqyus7CzsrirsbKxqrCrq6yrrLatqKyusqarrKmpoaWgpaakrKSmoaChnqGgnaCMlJeTm5+mmZ6emZOYnZ+gnp2eopuYp62ooqSgoKKqpqmhqKGlm6CgnZ2jn5SYmKKdp6Gfm4J7eod6bW14fGBxY1teX19UST5DRUlCQz5DOz42OTo7Ozs7Ozs7PT05PTU2NjIxODo5Ozs6QTs/PDw+Nzs8Ozw9PTw9Pz5BQUE/P0FCQUVDQkRAPDY+Q0RFPkJEPztTmZuZmJ6dmqCalpyZn5KdlZ2boJWWlJqYur20sLu8wcTCv8XGura5sqO7vbS3xLuwtbq2ucS4tLy3u7qt28K+tr7Avr66ppyqs7fEwKV5d3qexMbLyMHDwMDJysG/u7qwtnZWtcbFxcS/wMG/y8fCwMjAusK7urO6usG+wMrOysS9tby8ub+5ubW1s7/Avre0s7S4rbeqr7CwsrGvq6+nr7ausrG5rra2uLSzsLGttrS6sa6srranrLKsraSjoaenqLKrqqWkp6elpaCml5ujn6SmraKeo6KanaWiop+foaWenrC0sKSlnp+kqaevp6mgq6CiopqipJ2anqGmp6+psZWCe32Cem5zeHNocF1bXl1ZUkZEQ01JQUQ9SDs7NTk7Ojw8Ojs7Oz0/Oj01NDUxMjc4ODs8O0I8Pz46OzY6PTo7Pj0/QD87QUFBPj4/QkBBQkJFPjo1OkFCST9AQkA7TJqdnZ6fnZienZmampySoJWbnp+blZGRl8W+urbDvMbCvr/Ixbe1uLe2ubu0r7e3srWzt7m8u7a7u8W0ba/Ovba5wLyqfW5obm10gpeYc3l+mr6/x8C5wLy+xcS9vbiyr65uVKnFxsPDvL2/v8PDvr/HvLy/tLSutbW8vr/OzcvCt7K4t7e9ubuxtrLIwLu2tLGwt6yzqbCtrbS3r6uuqrG1r7Gvt7O6usC/tre2sru6wLWyrbO3rLC6r7KloqWrrK+5s7KosK+xr6qiqKGkraitrLOun6inpqWmq6Sknqaqo6ayuLOrpZyfp6anrquqpbClpaWbpKOYn6exrLW4sLKOhHl/fHdsdXtwbmlbX19ZU1BBRkhHS0BFQ0g8PTY7OTk8Ozo6Ozo9Pzw9NTU2MTM2OTg8QT5AOz1AOzs5PD04Oj08QD46Oj49Pj09PkBCQkJBRD03NDU9REc9Q0I/PEWUnqCgoJyXmpiYlZmdmZ2fmp2bnJaRj5LDwMK9wrzEvLy7xbu3s7e2tru7s6CWtayvsbS0tLa4ucDNsHWCtL21tcGkhmlaXmBOU1tccHR4hKO4t8K6s7u3u72/uru7ra+sbFecxcPDw768v7u7uLXBwrW/urWur62wvcC5z8rJw7GwtbS0vbq+urq7ysO7uravsL2xuK+ys7C3vbaur66wt7CsrLK2vbzEwrq9t7bAv8G3tbC2srGzurGxr6err6u2v7e1qbqztbmxp6uop7ausrG1uaisrK+qr7CqqKessayytr20saykqKuoqKusq6i2qaaonqadmKOuvLG7wbSmiYF8gnpzdnZ3bnFgX2ZdW1RKPT8/R0Y9R0NDOTo1Ozk5Pjw8Ojo8Pj4+Pjg4MzE1Nzg5Pj9BPzs6Pz08Oz09OTs8OTs6Nzs+PT1DQT8/QUJEQkE8ODU4PUNGPUREPzw/iZ2en52Xl5WUk5aZnpubmpuYlJ2Uio6Owb7Dwr6+vrm2usCxtbGzt7fCtbOrrbOoqa61r620trnCyaWEeIyisLWcamZnVVlfSUlNUVRueYmosLe+ubK1sry5vLa5vrG0qG9fisHDx8PAvb+5s6+yvbquu7Szpquorbq+uMvCv76sq7Cvs7q3ub67wMXBu7y3sLXEtb+0uLu0u8PCs7a2sbisqaWrsr23v7+7u7exvL28trGvq6uprbOvsLCrsLSpuMC2sqm0tbC3tq2spqu7s660uMKwsbG1sbK1saywsri4ubi+tLGzrqyxramvrqqyuK6trainoZ6ptr+4ur+wlol9gHxxdHd0d3JsX2NiXF5PSUI/PUlERk1DQDc3NTs6OT48PDk4PT47PT86ODMyNTc2OD8/Qj86OD4+PTw5PDk7Ozo8Ozs6PEA+QkI9QEE/QkI/PDs3OjxBRD5CQz8+QYqgm6GdlJiVlZKYmpyWm5WalY2bj4SIhru0vb+7vLm3s7y8rLOytLS2wLXAr7Kzqqqxt62pubO3v8anh3t2jaKXYFNDWVVIYmpVT0VKZZCjrq+2urW0sqy8ubi1uMG6upx/bHq8wsfCv7m6ta6lrLOxprCtqJ6goKWttrXCt7a0pairqLC2s7K6tru7u7W4trC1xLK+vL+8ubrFybq9vraxp6SeoamxrrW5trKxq7S3trGopp6gmaWmpKynq6y2qa+6sa2kpq2lq7GrrKmtuLawsrjBtrGxtbGvu7ayt7W1sry1urKwsbKutLKqrq2nuLWyta2uqqiosrq9wLa0qY6Ce393cHxvdnJuY11nWF1dU09NQT5KQkFKSUA2NjU7Nzg+Ojs4Nz4+PDs/OjkzMjc1NzU8PD48PDg+Pjw8OTk5Ozs7Pjs7OTw+P0E9PEJAPz9CQD47Njc6QERBQ0E/QUKJoJ2loJSWmJiVnqCcl5uYmZGMmYmDhoS1r7S7u7S1sLG2uq6wtLOvtbq1urC1s7KttrqvrbyzuLi/s5CBeYiPbk5KQGVZQlB4gJNoTENeg7G1s7WytK+su7q4trm/xLOfloJ6qLy7uLWysa2tn6Smp52kpZ2WmZman6muuayrq5+lqKSrrq+nsKyvsbGtsa6usLmwtLy+uLm4x8W8vLu4qaKcmJufp6assq6zqaapqq6popqXl5GcmpijnqKir6ekrKaompqemqGnp6anqa+2squ0trCqsK+xqbm2sbWxrqy3s7avrquuq7S1ra+rq7GtsbKoraurs7W3ur2wq6GLeoJ5cnZzbXVpbF1balRdXFBOSERGTEJGTkY4NjY1OjU6Pjg7OTc8PTo7PTo5MjM2Nzc3Pjs9Pjo6Pz48PDw6Ojs5Oz47PTk8Pj1CPDtAP0A/QT8+OjU1OkBFQkRBQEJBiJ+ipqGYm56dmqWpmJudmpmUjJmHhoeGrq2uuLmxsqiur7iyq7CwqrK1ubm+tbK4tLm6trm7tbWzuLWVjIiEe1hGQlGIWElKWXiOgmJBVaS5s7SysLGtsLm4tru3ur+tsbKqn6C5rqmrraujqKGdnZ6XmKGVkpaXkJifqK6ko6Sgoqeio6mpoaanpaqtp6ynqKesq6yyu7SztLm6trK2ramgmpaWm52fq6yqr6Oko6GpoJuTjo+QlJKSmZaanaSloJ+ep5iVkpSZnqSjoaWqrK2iqaqppKmtrqW0sa6xraqprq+wraWmqqSos66trKmmpqmrpqqnq7Ksr7Oxq6mWgX+Bd3J5aXV0bmRVYWNXXFFOTEhASFFETUM9ODg3NTo3PD46Ozw4OTw7Ozw7ODI0ODk3ODs7PDs4PD0+Oz08Ojk8Ojs9PTw6OkA9PDw7QD5CQEE/Pjk1ODs8RkFDRD9BQYijpqKjnqCfp6Coqpufm5yZmI6Xi42PjKqpqLGvsK2lp6ayr6mmq6CvsLu1vby4wMG+vLy8ua6sr7K7qZiZlGhNQFR5cU9JSUtonX9aRVaxu7Gss6+urK22trK0ta6pop6bm52ep6eeoKipn6GnlpuXl4+dlI+Qlo6Xm6SooKCioqGlpZ2jo6CepaCkrKWmqKSio6OrrLOuqa6urqeqraisoZyamJmYm6moq6ufpqKbo5yVkIyPkJCTkJeVlpifnp6bmaaXk4+Slp2ioKWipqSnoKKko6Ghq6uksq2qrKyno6yuraufoaKkpK+srKmmo6KqpKqqpKmrpqmsq6agiHiDfHZ/emN3bG5dUWhUUE5HUE1MQlBRQD47PjQ5OjU7OT07Ojk9OTk8Ozw8OzkzNjk5Njo7Pz06ODs6Pjw6PDs5Oz07PDw9PjxAPT88ODtAQEE/Pz45NDk8N0FDQkQ9QEOOqqSjoqGinaulpqimoZ6dmZ2PmJWTkJWnpKGmqKmlpKChp6uhnKKbp6u1sry9wMLCwL7AuLSnpKyovcGqpb1mRFOhhFBYSUtgSViNYWVlhK+1qrK0rqqrr7Cys62lnZGXk4+YoJ6ioJyjpJ+dqJSblpeMl5GNkJeTmJ2iqp+fn6Cjpaicn6ChnKKfo6ionKehoKSfrKisrKCpq6agpKimrKOdnp6al5qrpqqxo6WonqCclZOQj5GRmZCWlZiXn5icmZukmZeUlpqdoJ2nqKWgo6Kho56doKmqpa6upqipoaKqrqqnoaCio6msq6eppqShqaKlqaalpKKmpKijkn18gHV2fW1re2RoVlJkTUpIR09STkpOSDxFQDwyQDg1OTs+Ozk5Ozg6PDs7Ozk5NDg7ODc7Oz48Ojk8Oj07Ozw9OTw8PD49PUE+QEJAPTc6P0FCQEA/ODU1PDpAQ0BEPkFGlq6koqWeo6KpqKipqqWmnp2imJiZmZWbop6bnqOioKOgoZqgmJeXlqGorK62t7q5ure3u66ooKGpoKvGv8ueTkF1nG9QbkpMY2Z2dWFdYnOSsq+us7WqpqyropuZlI2RlZaYmJyfoqKcnaSemqSXl5eWkJKRkZOal5ugpKqeoaGepqeqop+gp5+dn6SnqZ6jpp+qnaqtqq6nqLClo6Smp6ymoaWim5ier6iusqulqqqgm5iYmJWTlpqTlZWalpuXl5ihnpycl5uhmp6ao6eln6GioqOdm6Gmp6aoraOppZ6kp6mkpaWhpaSsrKmmq6eioKSjpKenoaCgpaKmoIl7gH13eHxkeXlgYlNVYEhJSktTVElSUU05P0I2Nzw2NTs6PDw5Ozs4Ojw9Ojs4NjU3OjY5Pj0+PDk5PTk9PTw+PTs7PDo+PTw/Pz9APT03Oj5AQEA/Pzg2NT08PkFCRkBAR6CupKaroaOqrK6tp6ypqKCipp6bm56aoJyalZmfn5uen56WlJOXk5KcnqSorq2sq6uvqq+pnpeepZykx8aLVlJLZqNYZ31vcltSa2NcZ2JhbZG0sLC4rKahnJ2alJeamZCOkZWRjI6Nk5minJejmZqXmJmUmZiWnZufpaapoKaknqeurqumorGjmqSmpqqioaqiqaSosquxsqu6qKarp6urqaysp6Cgo7GusrG0qrKuo5mcnZ6hmZubmpiZm5SWm5aZnKWhoJqjoZqcmZ+kop6gn6KmnZulpqWkpaijp6OepqOinqaloqWlqKykpq2noJ2dn56gpaGenqWgppmBe4F8dnZzaIJsZltTWlpNUUpPT1VMU01CNz5CNzg9NzY6PDw9Ojw5ODo7PDo7OTc2Oj01OTw7QD03ODs3PTs9PT06Ozw4Pj09QD5BPj4+ODg8P0BAPT43NTg9Pj1BQEZAQUihqqCrq6GkqquwramtqaelpaWkoKGfnqWXl5SYmZ6YnJ2blo+VmZKRnJihnaqip6Cep6Gln5ySm6Kan6qjjHlVaXF3dW9kd3ZYV2JgZGlbWldora6sr6efnqKglpCTm6CbmZeSk5+coaObnpuWn5qfl5uinqWhnqSfpKitraisqaSstLe2sKe0rKKtraOvpaSmoamorrWzsr23v7Cssa6tqaq0sbCoq6iytrizuK2ytKSgnaWfrKGhoqGgmpiWlp+bm5iloaCeo6GgnpucpaCfnZyhqJ+fp6meoaOkoKagnqehn5ymo5+ipaOooKmrpZ+dnZudmqainpyjnqeQgYJ/fHh1and1Xm1bUmBIUlVIRlVWSkNNRz1LSDhGPDc3Oz49PDo8OTg6Ojs6PDk2Njo8Nzs+PT8+OTc9OT47PEA8OkA6OkA/O0A+QUA9PDk3Oj5APzo+NzU4PT0/QUBEQEJGnKueqamipamprqimqqWmp6aoqqGlpKOmkpOVmJacmpqcmpWTmZuNk5+ZqJ2un6eenKGdnpqZkpiem6GhoKN/b4JwYGNXTFtTWkxMUVlSSE9OSJmsqqmkn5+ZkpGTmJiWlpWMiIuOlZ2cnZ2el56Zp6CgqKWxqqeuo6uutrC0srGutri9wLqttbSwt7CutKmmpKWsqbmztbvDvMPBtrq2q6+xube8r7OwtcK8t76zs7WirKKpqLKpqqinqJqZnpqqp6CZp6Cfn6eopaSfnaqiop6bn6igpKetmZ+jnp6nnqCmnpycoqGbo6KhnZympaWkn6KZnJukn6CboJyjiYWEfnZybWl2bWhtXFhcQ1dOSkdNR0NGTTw+TD40PDk2Oj0/PDs6Ojg4PDk6Ozs8NTQ6PDg5Pj4/Pjg4Pzk8Oz0/Oz1BPTo/PjxAPj8+Pz08Njs/QT07Pzg1ODw8QERCREFCQ5WqoKapo6mqqKmjoamgpqinrK6lqaWpqpSSl5mUmpqanJiYmZyamJmqoLGit6Swpp+enZ2XmJWZnpqco56ciWJXXmVgV01RRz0/QENEPz5DUnipramqpZ+enqKjnZ6dmpyblJOVlJ2dmJSFnZqhm6ukq7KwubKysbKxur28vLm2uMO+v8K/trq7wMS5vbusr6exrbHCtrjCxsDIysDKv7C5ub25wr64s7vGxL3DvLezqrOtqrO1r7Ouqq+jnayotrGto7CmoKOvsa6wpKWvo6GgmqGnoaSqqpmdoJmao6CmqKGcnqKemaSenpiYo6OhpZ6mmZuipJ6fm5ubnIeGgXt0cmtrdHJxaFZcUUZUSURKUEk/RUE0Rkg5NTw+Nzs8Pjw8Ojo4OTw4OTs4Ojo4Ozw3Oz49Pj02OEA5Ozs9QDw9QDk3PD07Pj0+PUI+Pjc6QUA+PD45NTg9Oz1DQEFDQkGRqqGlqqelqqimn6KnnKasp7Gyq62jqayVkpWalJecoqGbnqCinJ+psqu7sr+rr6ylnqCgnJyYmp+gmqCflXxfXmVgUEZFO0I+Rjw+OTZOfqqzp6OjoqCepaulnpeclJGZnZiUjIqGiIZ4bYigpKKrrLS8tsO+vrO7wcPCxcC/wsbGxcPIwsDFx83QyMvDsre1vrK+xbu+zM3FzMzM0se+v8DCvsfGwrfEysnDwca+urW6u7W7t7C2sqq6sq67t7+7uqu4rauquLu1vK6uuaOmo56mpaKjqaaZm5+Zmp2nqqegoaGkmJSjlpSZkZydn6Sep5+en6KdmJmUmJSIhH16cWtjaG94a2VaW0ZLTEVEVE1EQ0U3Oj87NTQ5OTc5Pj87PDs7OD48Njo9OTw9OTw9Ojs9Pj4+NztBOj45PT45PT44Nzs6Ojs/Pj1CPj83OkFAPTw9ODY2PDo8QT9BQUE+kqugp66ooqulpKKipaGlqquwsq2upKmmlJWWmpaUm6SmnaGqp6KrrLy8v8PBsrK4p6Ghq6qhnJ6hoZ2bmn1yaWFXTkU+SVp8b2FBPVyOrqygmZubnp6Zl5eXkoyOlpaTjo2Qi4KDgndycW1wj6atrrS5xbvNx8u/wszNzczHydHMzczHycXFzNDS1c7Tyb3Av8O7xsXIxdHTzdPQ09PMysLFxsbKyM6/yNHMx8XHxcK8w8G/v7+2vrOuv8DDw8fEx8Suv7iyuLzEwsK6vLy1rqenraigoqmlmpagmpmdqKupo6SknpePm4yQmYmVmJugn6OdnZeempOTi5WPhYB5dHNlYmdyb2ZeWllDTkxERlBJRENANTU1ODlCPTY4OkE+Ozs+PDk+PTc6PTk6PDg8PDw7Pz8+PD0+Qzw7OkA9Ojs6Ojg4ODk7QT88QD8+ODtBQTs7Pjc4Njo8PkI+Q0FAPpOvn6ivpqiro6KloKampKuoq62qrqKqo5Kcl5ebmJuirJ2frqalsarFxszOzb+wwaikqKytqqCdo56cnpVpZlxUSURAP0qGnqSYg6CyraOenJ+amJeUkpSWkZCPjIeDg4iHg4CBgYB5cXJvbHmktrq5vsvB09LTyM3O0dPR0tHQ0dHNzs7Qxc7U1dfR183Gx8nMw8XKz8rT19LX0tXW09TIzMbMzcnSzc7TzcXIysrBx8zHycjGv8Ozs8jEy8vLz8fKv76/vcHHxc3MycnAw8Cur7OonqKqo5qTnpyYnqaprKSlppaXipWFkZSHkpKSmZualpiQm5WQjIaRi4B6cnV2Z2NndmlkVldRRE5GQEpRQj5CPDoyMkE8RTw3OTxCPTs9Pzs7Pj05Oj48Oz44Ojk5Oj86Pj1APkA8Pjs+Ozk9PTw5Njo6Pj08PEE/Pjk6QEE6OT45Ojo6Oz4+PEE/QT6QrKKiqaanqKSfop2qqKOso6OnpqyiqZ+To5iWn56dpK6bn7CrqKyxyc3U18/Gu8esrbO3rK6jnqOinaGbYVNMSkRDP0NUsdG9sq+mnJycoKShnZqUk5WUiX14cGtlYmhxb3F7hYqAdXBucXRwhbPDvsXR0NfW1tLWztTW19TT0dPU1NPP0cPQ09bY1dbSy8nO0cvGzdLK0tXW2dbX09bYztLKz9HMz9DM09C/yMfKxMzMzM7PxcbHtr/Kv9LNzNDGycjAxMPIzs3Q0c/NysjNuLe7qJ+lq6efmJ6jnp2qpa2pqKiSlYiQhIyRho2MiJOVmZCWjJiSj4aHjIR8eHN2cGNgZHJiXVJcSUpHQUVJSj47QTg9NTU4Njs4NTo8QD07Pjw7OUA7OTo8Ozs8Nz09Ozo+Oz08Pjw/Ojo8Ozs5Oz89OTU7PD48PD0/Pz46O0BCOzk/OTg7PT0+PzxBQEQ8hqugnKegp6Oim6CbqaSlqaCfoaGmn6ifmKSimqmmoqarmqOwsamotdDU19rSx8bLtLXBxbG1qKGkpaCioVlJQEFEQUZRdrKvp5qUl5+cmqCgnpucmZWJd2ljYV9fYF9eX19dYmx1dHBwb2xycXWSxMjG1NbX19fT1tDV1NrU1M7P1dTU0dHM0M3T19bT1dDP0tPRydPRyNDX19jR19LY2dTWzM/Pys3Sy87QwMbCyMbOztHR0sjLzcDKzMbTz8zOyMXKx8fIzMrU1NHVz9LM08K5xbGlqLWup5uorKWdsqiws6ysk4+TjoiKj4OPi4SQjpmNk4+Zj4+ChYx8enFzdG1hY2ltX1ZQX0pKQ0ZDUk0/PD40Mzo9NTI4NTU8PEA8Ozw6OTpAOjg7Oj46PTg+Ojo8QD08OTs9Pzk6Pz07PTw9PTo2PD0/QD08PT0+OjxAQjs5PDc0Oj48Pz89RkFEPYKknKClnaWlo5mcnaSeo6OfnZ+doJqnnpyhqZ+vraqqq52lrreoq7fY1NXZ2dHO0L+8zMm2vq6mqqiho6tlQzg9PkRYgqqon5eVl5manJ+dmJyckn1wZWNiX19hX19hYV9gYF9gZm5wcG5rb3J3d5zMwdLV09jY1tnR0tLXz9POy9LN1dTSys/M09bS0dXNz9XV0cXR1MrQ1NXWztLQ2NjY18vIzsTJz8zKzMDJwMjKzc7Qy9DNzsvOz8jL0NDLzsrCycfJzMvM0tPN09LR0NDKvci5sK67ubWrtrCtqLits767sZqPoJSRjo2IjpCFkY2ZjJGRlY6RgIWIenZvcG9rYWRucGFXXFpJRkZETVhFO0A9MzM8PDg3ODU1Oz5APTk8PDg8Pjk8QDtAOj04Pjk4Oj88PTg7PkI6Oj08OkE9PTw6Nj08P0A9PDs9Pjg7QEE9Ojw4ODs+PD4+OkVCRT6Bn5mlp6Cfo6eam5+cl56eoZqdmpyappufpKefuLa1taylrK6+tLDA2NLX2tzWzs3Kw9LPwcGxqaytqaSxeUhGQjtXjqGblZOWm56enpyTlpeUiGteXl5hZGJgYGBgYGBhXl9fXlxibXJvb3N0dnZ5pL/M1dHW1NPY1s7O08vOzsXOytLSz8fOzc3UzM7TzcvX1tDM0dTLzNDS08rO0dXS1dXKwMrCxc3CyMnDzMPFyMrLz8rNzdDO08zGyc/NyMfLxcfBxsrMzdDRx9DPzs3M0MXHwbi5vcPCvcO5srK+sbvDw7WqmKWhmJaSlZWSi5SNmpGUlI+PlYKJhnlxcmttZ2BgcWhZWGhWTUdMSVBRQjtDPjs2ODk4Ojo1Nz09QTs6PD05PD05PT06Pjo8ODs9OTtAPD47Pj5BPDk9Pj1CPTs3NzU/PDw/Ozw7PD04O0FAPDo8OTs7Ozw9QTpFQUU+hJ6bqK2epKSqnJ6fmJKXm5+am56ZmaKVoamppcTCwb+7tbKxx8K4y9XV2drb2MzMz8jW1cTCta+0qJ+tl3hscHJ7kZqNjJeVkJORkZWWlZCLfGVhYmJgXV5hY2JgX19gYWFgX11bXWdycXFyc3Btcnmlx9PPy9DQ09TKxcnJxse/w8XPzsfFx83K0sjLzs7G0dLQzczUysfLzs/Hx8/Sy9DPxrrEv8bKvcLHyc7EwsfAx83IxMzKzM/IxMTQyMbCxsjFv8HHzMzMz8LLzMnHy9DExce7x8PJycLPwb28v7DByca5vaqwsqelnaKcmJCbkKOZl5mRlZiJj4J4b3Rka2BeZnFhW1dgR0hIR0lNVEc/Sj02NDM1NT09NDg9PT06Oz08OTo7OT89OTw7PDg6PDo6QD1APD09Pjw6Qz48Pz04ODk6QD4/Pjw7Ozs7ODo+Pzw7Ojc5PD49Oz49RkFDPYOgm6qupa6qq5qdoJeUjpedmpmgmpqcm6WysazJzcrIxL69uc3MxtDV1dna29jQyc/P0dPIwre7u62jtn1og4Wkq5SOjZaPhYODg4F9hIR+c19bXl5eYF5gY2RjX1xdXl9gYF9bWlxga3Jyb29rbG9vfbnRyMnKz8vNxLrAw7u7u7q+ycbCw8DDyMrJyMrIwcXMxsjLzcnEwsrJwcHL0MXLyL+5wrvGx76/xs/Lw7/Du8nHybvIx8XKwL7Cy8bFxL7GvbzAw8XMxcW8wMrDxcfSxcHJv8rJxsjG0MPDxsOvxMvHw8q3v7y6tKmspKWYn5iso6Gmm6Ogm5V8d3N0ZmlaYW5tWltYUkRMRkJHRExERlNANTQzMzU/PDM6PDw7OTw8PDg7PTtBPTo8Ojs3Oz05Oz07PTs6OD4+PEI+Oz88OTk7Pz07QD48Ozk5OTk6Oz06PDo2OTw+PDs+O0NCRD5/pZypsqm0rrCdnp6YnImUm5man6Kfmp2ov7i8ys/RzMfCw8bNzs7M1c/V2djZz8vSzc3OyMG1w76yr7ZsXnl9opGLkpaGeoCFhX92eHVycF9aW11gYGJjZGRlZGBbXF1dX15gW1laXGJvcm9raWxwb3OPx73KxcvAxsKwtrqysrOyscK8vLy6uMHBwcS+vbm9v7nEysXGwr3GwLi7w8m/wcm7t7u6xsO/vMHNw8a+vrXBvcO7vca8w7q0vMbEwsO3wLa2vr+7zMO8trrIur++y8PBxsLFycfJxtDGwszIssfJw87MwcXDv72yt7Cyp6ioubClrbCqrayUenZ3amRnYGhvZFZeWUpGSkVHS0FFQkZKQDk6NjQ4ODU0Ozo7PDk8PDs5Ozk6QD46Ojw6Nzo7Nzo7Oz88OjxAPUA/PT8/Oz07O0A8Pj4+Ojk5ODk3ODo8PDw7OTo8Pjs7PjpAQEU+fqygrLWqt7SyoZ6fl5qNlJaan52mop2et8XCxMjO0srKysfNzc7RyNDG1dTW183KzsXJxcfBucW9rK6lX2R1hJOLiIuEeH+Ghn9+hHt0dGNcXF1eYGBiY2JhZGViXVxbXF5cXl1aW1xeaHNxbWdnbm9yeZ29zMDDusC4rbCxp6qtrKe4tLa0s7O0u7W+sbawta+yvMK8wcS8wLu1srq+wLjIubS7t8HCvbe8xsHDvLWusrW6v7TFt7u1q7i9vsC9sbu2sLa6s8W8t6+7v7W3tMW8vsLFwMPFxsfLxcDGxrvHy8DPycfDxsHDt8O9vba5vse/rLW7tbe2jnl0eGdnZWJrbl5WXmBGS0hISkZCREFFRT88OjU2NTYzMzs6Oz06Ozs6Oz44PEE9PDo7ODc5OTk7PDo+Ozk+Pz1APz5CQD1AOjo+Oz89PTk6Ojo4NTY7PT48PDo7OT49OT86PEBAPIi3pauzsby8sa2foJmUlJiXnqujr6qnpMbLzcjFyM3M0MzNyMrIysnKxNDN0s/NxcfBxsC/urjJtqqwmFtob4qPhYiJenh+hoZ2d4F8c2hdXV1dX2BfYGRhXmNlY19fXFteXF1eWltbXV9scG5oZmtubnJ8pMfAuLi1sKutp56iqaeeqqyzraqsqbSut7Gzqa6mrLO8urbDubq6sau1ubu0wrqwwLG+vLu2vMe5wretqqiwssC2uL2wsaixs7W7vKyutaautq67srGqubCtu667uLvAwL65w7/Gw8XBvMbCyMu4xcfFv8fDw7rExsK7xsnMy7O5w727s4lzd3ZraWFibGhZV1dbQUxLTUpFQUM/RkE6OTo5OTU4NTQ6Ojk7PD07Ojs+ODtAPD05Ojc5PTk7PDo4Ozs6Pj45QT0/QD87Pjo7PDo9PDw4OTg5NzY4PDw9Ozw6Ojs+PTs/Ozs+QDyKwKuouLe5w62zqZ2ZlJaZoZymsLWxt6bFztLLw8XBxc/HzcHDxr/ExMPDysLJyr/AvMK6s7W1w66qsJFban+Sh46Pe3h9iYV6e4SAd25eXVxcXV9gX19kY2FkY2JgX11aW1paXVpaWlpcZW5vaGZnaWtucoGturC1rqWkp6eaoKSgmpylq62kqKKrqqyrsKOmn6qttbaxvbmvt7Corri0tLy4tL2vuLm1srzAssCvpaijq7Gys6i9qquoq6yttbSmqK6hpK+psqaoqK6mqLetsbK3urq7sry+vr7Ev7XCwcfIt76/xbfEw7+7v8TCvsTIzMq/v8TAwKmHc3RzamldYW9kV1ZYUEhZUlNLRkZFPj5AOjc4OTc3NjQzNzo5OTo8Ozs8PDc7PTs7Ozw4OT44PTs8Njo9Oz89N0E+P0A/Ojw8Oj05Ojs6Nzc3ODg3OTw7PDs5Ozo8OTc5Pjw+P0E7jMKvrry3ucSwtrCbmZWcmKqpsLGztb2vxdDPzMPIurrLwcq+u8m2vcO+usq3wcPBtLa8trGvtbutqKuSZG2Ig4eLgHp9f354dH58c3dlX11cXF5fYF5fY2NhYmBgX11dXFpYWVtbWVhaXF9ma2ZkZ2Voam9yhaqlrKWenKGklJ2km5eRoaOpo6Ofpaanpq2gnZykpqyysLa3p7GtqKq1q7S5sba2rra5srC6urG3paCkn6axqKuouaqkpqeop7KtoKemn5ukpqyen6ejoKGxra2ssrSztLC1vba7wcCyur7DwbG5ucKzwb7Atbi8vb68wsfEw8S/wMSgg3hwbGJmYGtvYFVZXkhOZ09UR0ZLRjw9Pz06Ozs4MjU1MzY5OTk7OTo6PDo3PD88PDs8ODg8OTs6Ozc4Ojo8OTg+Oj89OTg8Ojs9Ojc3NzY3ODg2NjY7Ojo7OTo7PDg1OTw6Pj5AO43ItbW9uLrAur22oJ6UnaGmurars7O7s8TPycvCxri2x8DMv7jJt7vFuLPEuLO/wKy2vLKspa+zraGjkWlyhoWGgHx4dXNvbWpqaXBpXmBdXFxcXl9fYWNiYGBgYV1cW1xcWFlYWFhWWFteX2RjYmVnZ2drbW+HnamflZWaoZabo5iVjZ6hoqecoJ+kpaKnnpujm6CrsK2xtaSpqqqsrKS0uK23sKyztq+zta+wqp+en6OisqWmqbitoqamoKisq5mgn56ZnZ+lmpmjm5yesKmrp6urrK2wsrivuLm6sLa8u7qrs7K5s760trKxtrW/tr7AvcPCu7q9l4R6c2tfZV5kZFhUV11JV1xLUEdKSkdBPD8/QDs/PDA0NTM1Ojs5Ozg5OTw8Nz4/Oz07Ozg4PDg5ODw3ODo7Ozo7Pzo9Ozc4PDo9PDc0Nzc2NzU3NDY2Ozc5Ojs6ODo5ODo7OTo8PzuJyba4vru3wcHBtKSkmZqkpsCyr7astLfGz8jIwMa7u8PDz766x7i4v7eywrSxu7usurqxop6pq6eYnpBtfoWGf3hybW9ta2JeYmZmXV1eXV1dXF1fYGFiY2NiYV9cW1taWllYWFdXV1hYWFpeYmRkZWZmaGlrcYyonJOUlJqXmqGWlpCboqGonpydpaeipZygoZuZr66ur7KhpaOuq6eitbCysqypr7OnurOmtqCinpyjoa2joqq2q6Ojpp6lpqOWmZ2XmZudoJqXnZydnK2iq6eko6atq7KzqrWwsquyubSvqq+ysrO4s66prK6yuLC6trq9wLizsZSFeXVmX2ZeW1lWU1pVS1tRS0lFSEtJQj0/QUFAQToyNDUyNDk5ODk7OTo9PDY9Pzs8Pjs3Ozs3Nzc+Njo+Ozo4Oj07PD06Ozw6PTs4Nzk3NDY1NTQ2Nzg1Ojo4Ojk5PDg3Ojg5PkA6gci9t72/tr68v7KdpaOYpbHCtba9rbS4wszIxr/FtsHAx863wMS9s7m5s7+2sbm7rbK0r5+apKqglJqPeH+DhH94b3F0cWhlZGhkY1xcW1tdXVxbXmBhXl9fYF5cW1pcWllYVldXVlhXWFdWV2FkZWNkZWRkaGp2oZuTk4+Ulpafl5mUl6CeoZyWoKGppJ+fqZ2bm6unr7Crm6OkuKqhoK6otqqnp62xpLiwpLegopuZmaqnoZqsua+ioaScop+gk5ShlJaWm5iXlpeclZ+qnqmkop2jqqqwrai0rKqnrbOwpauus7GwsK6vp6iosq2xtLC8tLq4rqOUgXp2ZV9hVllYU1JTS01eTE9LR0dMTEU9QT48Qjw7NzY1MzQ5ODg5OTo5Pjo4Pj47PTw8Nz49Njc2PTc7PTs5Nzk7Ozw+OTk6Ozo4Njc2NTQ1MzEwNDU2Nzk6ODo5Ojo3Ojs5OT1AOnbAvLS5wrG+uLyunaenoqq7wL3Aua60uMHMx8XCw73FuMjMssHCwa28u7W7vLW5ubCvsKqcmaGplJGKi4CAfHdxaWxydHBoaGVkZmJcXFpZWlxcXF1eXVxbXF5cW1xZW1taWFZXV1ZXWFdXV1ZbYmNiYmNiY2RmaYGVkpSLkZOUmpiclZacoJyflqCfp6akpqefnaCmoKqvpp+io7eooaGiqLOipailsKWxrqy1nqGdlZWpoaKUrbGxn6OjnZ6Ym5OLoZSRk5iYk5eXmZeep5ynoaKapKWlq6SlsKelo6urraaprq+vq6iqqrOmpqyvtLGuvLWxr6+gknp3c2VhXFtdWE5MUUdRYU1WUE9KTU9FQkQ/OT02OTo3NjQ1OTk7OTg4Nzs4OT0+Oz47PDY5Ojc7Njs3Ozs6ODU6Ozo7OzY8Ozg4NDc3NjMzMjEuLzI1NTY7Ojg7Nzg3Njw7Ojs7QTh4u7uxtb2wu7G3rJ6lpqy4u7zBxbqxubXEycnAw8bFx7bFxLPCv8Wrt7e9tr26urWyq62omZifo4uJdImIfnZuY2FmaWhmZ2lmam1gXVxbWlpaWlxdXFtcXl9cWllbWVlaW1dVWFdVVFZVUlRSVWBgX2BhX2FhYmVpgJKSiJCOk5KTnJSVlqOZoJedoKWiraalpaOko5yqq6Wan6WxqqChnqWqnqiin66sqamuraKiopWXopuckKupsJyfop+el5mTip6RjZKTlpCYmJOcoaOdpKGilaChpKWbo6uloqSqo6uupa6yqaalpqa0pqmorbO1tLm6sKqsnoxycHBgW1dWVlJGUU5IWVtPUklUS1NMRUZJRDg7Oz08ODY2Nzo5Ozo5NzY5Nzc6Ozo9PDw2Ozw4PjY5ODo4ODY1OTo7PDk3Pzw5NTc4NDUyMTIxLi4xNDI2Ojg2OTg1OTg5ODk7OUA5e7W0rbS7srCrsq2dqKevubmzwMm6tcCvxcjMusHKzMi1ybyxvsPIrLG4wbW8wLu0tKqsppWam5uIgXKIg3t0aWlpbGdqbG1ramxlXVxcW1tcWlhaXVtbXmBgXFhYWllYV1hXVFVWVVRVVVJSTlFZXVxdXV5fX19iZG2NjoOQho+QjpmTlJKcmqOcm6GoqauorKeppqSZpa+llZmlr6mgnJmboJ6vmZyrs6Clpp+jpKGUk5uWlpKpqq2anaChoJuUkIyZjoyRjJKNlpWQnqKhpJ2bo5WboKOhl6Koo6Ooq6CrsKStt6ajpKKsraqoq6+zt7O+tbOrr5iFdHNoW1hZU1VSRVhMUVtYTVROUExRUklOSUI9Pz9BPz03NTc5OTw8OTc3Ojc5Ojs8PT47Nzs7Oj01ODo7ODk3Njk4OTo2Oj05OTU3NzU3MDE0MS0rLzQzNDk4ODo6ODo6NzQ4PTg/OX6zraezt66pqK+um6morLe2rLzKu7a/rMvGxbjBzs/Is8S6t7vCyLCtuL+3vL27s7WmqaCWl5iWh3p0gHZ3bm1obW1tcGdnaWZkXVpbW1tbXFtZWltcXF5fX1xYWFlYV1hXVlVUU1VWVVVTU05QUVlaWlpdXVxeX2FkfYuAin6Kj4mSjZeRl5mioJugq6qmr6yosKWpmp+toJWWpamnnZiQj5qerpeYqKqZn52UpaGfkpGSkZOVqKulmpmZnp6WjYyLk4aIjYOPi5KVkaCeoaSYlZ+VmqGinpSbpaaoqKigsbCmsb2on6OstKqup7C1sLm1wLGusauRfnJzYlZUVk5SSkdWUFNRTExXTUpNT1JHTUtBQ0ZEQz5BNzU4ODk7OTo3Ojo3PD06O0A+Ojk7OTo/NzU5Ojk4NzY5NTg3Nzk7ODU1NzY3NjEzMjAtKi4xMDI4Nzc7OTk7ODk0ODs4QDh/s6ylsbeqpqOxq52qp6mysaS2xrS5urPKxbm6wcvQyrG2t7y9wcOxr7G3rbS0u7O0oqOdnZeXlIOAdmtnbG5xbnFqcGtkZWdlXlpZWllaWlpaWlpaXFxdXFpYWFhZWVdYV1VVVFJTVVNWVVJOTk5SV1hZWVlZXF1dYWp/eX90iIyGkImXiZSTmJuYnqmboKumpqyeqJqgppyTj5+jmpeXhYSSm6OQlaOdlpaWiKKbm5OLjoqQmqSnnJWVl5uRkoeUjouBi46AkIuSkpKgmqGilpSYmJWippmNmaSmqaahoLSyp7K3oZyitqypraSysqa1vLWrrLGjiXlzbl1OUVFMT0NNTk5QS0ZOTkpKTk5RSE1KQUdLSEhDPjg1ODg4OTo7Njk6Njg7OTk+PDg6Pjk7Pzg3ODk6ODg2ODU3Njg4OTc0NTc3ODIwMzAxKyktLzEyODc2Ojk5OTk4NDk4OEE3d7anpLawpaekqqWgqKals6qissO1tbKzxsa2usPKzMazrLm9tLjAr62psJ6mrrqvrp+Zmp2VlId7g25fX2ZycHVxaW5pZWdoal9YWFhYWFlZWVpaWVtbXFxZWFhXWVlYVVZSU1JQUVRRU1VRTU1LTFNXV1ZYWFhYW11hbnJ1b4OHgYiAkYSOipSRk56hj5uco6KkmaWXopyVjYeZmoxzjYN+jpeWhpGakJSOjnuZj52Mgol/ipigo56Qk5iWhY2ClH5+c4mOepCHk5CQnZuampGWkJ2Oo6OOiZqgoaSkm6K0r6yvrZ+YpbimprGhsK6csLyqqa+qmYN3c2NWTVJPUE5DU05MUExCUFFISU5STUhKSkRKTEZKSz03NDk4ODg7OzY5Ozc6PDk6Ojs3OT85PkA3OTo8ODk3NjQ0NDU4NzQzMTI1ODUvMDEwMikoLC0wMjc2NDc4OTo6NjU6ODdBN3i3oaO0qaamqKOmpaamprOnpbTBuLC0sMnEt7nBzsa9s6y6waytw62noqaSnaa2rKOgj5WWkpB9d35mV1ZfZ2ZpZ2huY2poZ2JcWFdYWFhZWVlZWVlaW1tbWVlZVldXV1NUUE5QTk9PUFNUUk1NSkhOU1NTVFVVVllbXWlrcWt+hHtzTlhyj4KXho2cl4uUkZ+YnZWUlpWPlomAlIlfO1ZvfIyUiYCMkoyQhoZzioWXgXmBe4aTnZSDlY6RkIOGfZN4cXCFjH2JgZGNkJeamJOLkImdiJ+Yh4iWnpqioJenrqmtqKiel62zoqaumayrmKi0oqmto5N/c25fW05TUldMRFRKUExMRk5PSUVMUU1LT0pJTFBGSUk9NzU5OTk5OTo3Ojs6Pj44Oj09Nzo/OD4/NTg5Ozc5Njc1MzMzNzYwLi0vMzQ0MTEwLy8oKSsrLTM4NTQ3Nzk8Ojc5Ozg2QTl5t6CjrqGmpqqgp6mno6mwqKe0wrmwtbDHwrezvc+/ua+utcKnqsWqo52Yg5ScsaKamIaUj4uHfXN1XVBMUVVZWlddXmJnY19ZV1dXWFhYWVpZWFlYWVpaWllYWFZXV1VTUk5MS0hHYlxNT1JNS0hGSE5RUU1QUlRWWFpgbG5oeoF0T0I/f5WSkX2IlI2Eio2bjpaViZKIhpWGeYl/YEpRbniLkoR9hI2KhX9/bn9/lHh1dniEjZpwUY2IioZ7fniUdmd3hoh+iomWi46RkpaMhImIlYSbjYKEkpqWn52UpKOoqaWknpuwqqGkpJGmqpaiqpyipqiJdm1mXltIUVFTTUlVTVJJTEtPSUhGSk5MTVRLUVBPRklDPDc2ODo4Ojs7ODo7OD4/OTk+PTg7PDY7OzQ3ODs3Nzc1MzQ0Njk2LzMvLjEyNTIyMS8sJykqKiw0ODMzOTg5Ojk5Ojo6Oj85d7aco6edn6Gvoqeopaeor62qtby2t7ezwbu2qLrIuLaoqLW2qrK9p56VjX+Jk6iWlYp+joOCfXdwb1hNS01NTkxNUVdbXFpYWlVVVlZWV1lZWFhZWFhZWVlaWFhWVldVU1BNSkVAQJtrc3NJTUtERERJTk9oWU5RU1RVWm6DcnV+aWhcVI+JlIl0f4aBfIWMk4KSmouPe4aPgHaAeHNvdnF0jo6Ben6Kq4R5e2h2e45wcm14gYuNknh6gHuAdnNykndodYSEhIV8lYqIio2KgH+Ei42AlIR8gI+YlJyWkZ+dqZ6foJ2gqaWenZiMp6SSoKCWnp+kgHNoYV1dSldQUkdLWFJPSkxNUkpKSkxQSExRTFJUTUVIQTw3ODs5OT49Ojs8OThAPzo6Pj03PT03OTkzNzc4NTY3NTI1MjQ3Mi8yLiwvLzIwMC8tKygoKS4xMjcyMTk4Nzo4Nzc1Ojw7N3aumaOhmJ2ftKmvqaWtrLCxqr20sru4trq0sZ+3urKqnZ2sqaiysKGakY2UgY6cjpF/doZ4fHZvb2lYS0hJSEdFSEhQVFRUV1dTVFVVVVZXV1dYWFhYWFhYWVlXV1VWVVNQS0Y+OTNOPH6eTUhKREA9QURqlH5MT1FRU1ZedIJ7eGZ2jZaYjY59Z3mBdniAiZB9hJiSgXGHj3x3e29rfq19dJCLf3uGkoF8f3VmdnyFbG9nc3yJjIeAbHlxfXFtdo9xaHGBfo5wQ4uFgoOFf3d3eoyGfYx7dX2Oko+Yi5Kam6OWmZ2anZ6hnJaNiqSbjp6XjpaYkHdvbWZiWlhYVVFKU1VUT1BOUFZLTktPT0pRT0hOUExGRDw7Nzk7Ojo/PTk8Ojk5Pz87ODw9Nzw5OTk5MjY2ODU2NjMzNjIxMjI0LiwsLS4uLTAtKyonJyouMTM2Mi84NzY5NjY1Mjc5OTV5ppegnpahprCtrquoqbGvsau8uKy7vrizrKebsKesm4+WnKWppKCXmY+FknmIjouKdXF7bXVwam1qWEtGR0VBQENESExMTVFSUFFTVFRUVVZWV1dYV1hZWVlZWVlWVlRTUUtENzhmNzA/qGlOSEM9OzpEioV6WkpOUFFUWF1lcHJsiKeqwH50eWJ7eG98eYmQen2Lhm9tjJJ5dHlqaoCCcZaRi4F+loBJkphuaHh+gm1pZGx5hZCShmtzbHxucnyGaW5wf3OMiYSGe35/e3ZvdHSGgnmBeXB8joyKk4OWl5iakJKWl5mXnZaMg4mekYuSjYaQloBuaW9vb1hWWFRSUVlPUlRUUlhVTU5ITkpNTktDSE1HRUA6ODk7OTk6Pjw5PDs6Oj0+Ojg6PDk/ODY4NzI3NTY1NTQxNDMyLzAyNCorKiotListKigqKCcsLTEyNTAsNTU2NzQ4NUhBODk1d5mRm5man6WtsKKtqqi1r66stL+rvMO/paKalaSXno2Ei5ShoZmYkZOLc456gIaMhnRvdGtwbGRsallOREZDQDw+PkFGRkdLS0tNUFJSUlRUVFRWVldXWFlaWVlaV1ZUU1BMRTFAmjMganNDmW87PDk1PICChl9JTU9PUldaUVlcX6eIYpppc3llfnBtf3qLiXaCiIZ0bJqSdHN8amqdj015hZOJhI5nMXaGc2x+foN0ZmV1f4SEhYBmaWx1a3F/fGhxcXxuko2PfHR+fXFwbnVtgn93eXVqeYmCiImDlpKSkIuNkZSUjpeNgHmIl4iGioaAkIh3a2tvaGVYUVpXWVlbTVBVVllYTklIRUpKSEdCQEdEQ0c9OTk4Ozk6OTw6OTs6OjpAPDk6PDk4Pjc4NzcxNTIzNDUzMzY0NTAzMS8qKispLCwrKykoKycpLCwyMjYsLDQ3NzU0NzhpTzg7NW6SiJqRmZakqK6fsp6nuq+rsrDCsbvDx5qWj5SZi46GeYSQmJSNkIyPhnGHgnSHjIZ5cHJwb29kcGZfVEZJQz88Ozk6P0BBRENFR0lMT1FRUVFSU1RVVlZYWlpZWFZVVFNQS0U4MC9cYLNHOVhQOzk0NDGWuotITE1PT1FWTEFJUUlir7OgcXt4bH1scYOChYF6hIaGeXKhlXR4gHN1lIc1cZ2onY6hoYSihXZxh3yHfHSMro6JgGhnYmpucm1wg3VpcFh1cI6bkndsf3t9bXJucIB7c3ZuYnaDf4aAhZCQioqJkYuRjIuOg3V4io6AfoOAfY97cnBwbGBbXV5cWVhgX1JOW1pYV0xISkZJRz9CQUJIP0NEPTs5Nz07Ojs7OTo5OTs6Pzw4OD06ODs2NjY1MTEyMTI1MzQ3NDUzMS4vLCwrKSopKSoqKikoKikrLzNETTIxNjY2NDM8dlI3PTdikoGSiJaRnqWnn6+VpbSprrGuwbK7wcaWkIyUj4CIfW6BkJKJg4qHj4Z1goRslYiIe3R4eGx3bndjaV5KUEc+QDc0NDk7Ozs9PkBCRUhMTExMTlBRUlRVVldYWlhWVVRTUExFPDUqnUtbQC1nSTk0Lz+Sg6muX0dMTU5QTDdDTVJTREqGdoB8fHZ+bHeIiHx+hYN/jH51opl5foaBhZmEmpxhhqqfnYuDkI56d4l+iYiOc4uXkIR6XWRydHp8d4ptaGpieW+GkIJ6b4F3dIR6cHR5eGtuaV12h32HfIeHjn+KkpeDjYWMhn1xhH+DfXV3e3yJd3BzdGZnYFtbXlRcZl5XUFRYW1VHSktES0c/RkBEQz5BQT07OTc8Ozs9PDo6OTk7Oz0+Nzk+OTk4NTY1MzI0NDAwNDY0NTU1NC0sKSsoJycnJigoKSkoKCsrKy8wMFVxPTIzMzMxRX5XND05XIx4ioCUjJGdnZ+mkaCqoLGor8CxusW6lo6RlId6hXZrf4yRgn2KhI+MeIOAc6CEin18gX9wgH56Z3ZrUldMQEUyMTEzNjc2ODg6PD5BRUdGR0pLTU9RUVNUVVdWVlZUU1BNRkA6Mj0gI5ZjjFs1MzExaT9Hb0lGSUxNT1JMS1RdWVJKaISJe4l5fHF8j4x6fYmHfpeHdqGZiIePkpSljayqSIaur6+LgYCTioKLgoSSqYeAmJiKm3RtfYGGh32OaGdoeX9uhoeChXGEhkdsgHdyeXZobWtfdn2DiH+IhIt5lJ2ciYuIkX96dYt2fHhtb3d9f3R0cmxbXl1bY2NYZ2VcVVBQVllQRExLRk5JQ0ZDQ0BAQ0E9OTg4Ojo6Ozs6ODg4Ojo/PjY7Pjc1OTU3NzMzNDQyMzY2NTY3Njg7REZMTU1MQzcrIiUnKykrKysvMDArbnUyMjQyMEyBXDU9PF6EdHx+iYWIkY6Wl5KXoJ2soaa4r7O9s5eNkouYi310cH+Jkn59jIKSlH2Gfoakh4h/goiFeIeIfnOEeF9jV0tCNjAuLzIzMTIzNjY4Oj0+P0JFR0hKTU5RU1RVVFRWVVNRT0dDPzgwLCOHWz4/OTQuXZZwc6NVRklLTU5QV2BYcFlcXmmNk4eVgISChZGTfoWIkYGalYKhoZiVm5umrZOau7Gnu8fDqIuMoaWPlImBkXxxg56fkZx/doWFi5CIkGlob4OAdY2HhItxhoJ3h397doV9bnZ1ZoCUjoaJiIeIh6CropaJjph/eoKJenlvZ2t4fnp/c2xlXlpbXWpdYWZgWU9LTldSUUlQSkROR0NKREJBRERBPDo4Nz08Ojw6ODg3Nzg6PT04PD02ODc1NjYyMzQ0NDU3Njg2NzxCQj88ODo+Q1FeZVxHMicmLCwtLS4xKD+LWy4zMTBPg180PztudXBmeIN7gIx/gZCOipqbpJ2hrKarr7GXkZGEoZSEeHd/jJR8fpKFkpV/ioCSm46DgIGMioKJjYN/iX9tcGpdQkA0LS0vLy4vMDIyMzQ3Nzg7PT9CREhKTlFSU1JTU1RSUE9IREI8ODcvOUQ+PDw2My5sk5dNUEhKS0tLTlZfY39nZ211nZuPmpKTi42OmoiSj52LoKCSo6qlo6yTqbaiqMHDrseveLqUmnyNoZ6ZhJOFgo+in5OYkoSLhY+akZZscHWJi4KWjI2Pd4+EcW2FgYqWkYOFiHKIoJWGkomOj5aktambjZWig4eTg36Aa2prfICBgnRiXmRfW2drXWxrXldLR09SUU5MTEZJUENETUZBQ0VGQj06OTc9PDo7Ojk4Nzc2Nzs6Nj06Nzg1NDU2MzQ0NTY2NjY4NTU2MzEwLiosLCkoKS46UGFcQCwoLSsrMCwncog3MjQwT4RiM0A8dW5nWXCCcHWGcXaShn6XlpqVnp6cp6CqlpOYnmdlpJp+hJKReX+SiJGSfYqEmJKRgoCAi4yJhpCGhIiFeHh+Z01SPi8uLiwvLi0vMDAwMjEyNDY3Oz9DRU5QUlRQUFFTUU5QSUVEPjs8OkNGPz48NzUyPD9SNUhISExMTU5SXm+KfHOBfaCdnKelopmhl6KUnJ6nnqirn6isqaq2l6u/q7bIyLfJ0c++m6Bwaaupn4STkoWcoZqbmaeRkYmWopqad3p+lJiSoZKWmIGUnnt3lZKrsoiNl599lJ2bjpKVmKOiprawnZGZqIiWj42BiWxzcnx/fXJpYF1hX2FnZGBnZltSRUpLUE9JSUxGRk1DSExGR0RCR0VBOjg1PDw4OTk5NzU2NTg+NzU9ODQ3NDU3NTQ1MzY5NTg6NjE2ODYzLzAuLSosLy4tJyMqO1hiQigqLDEtKEuXXjA2M1GFZjJBQGlhXlBwdWBufWF3jn17lI6Oip+Sl56Wm6qYnqpCRH2HiYeYjXiCjYqOjXyKho+QjoGCgImLioSShYOGiYGAhnZeYlA0NjAtMS8sLjAwLy8uLjAwMTU+QUJNUVJTUVJTVFJOU0xFRUA8Pj1HR0BBQDg2NjI8OTtGSEdJSk5PUVlthZB3lYqjp6q0vbikrqysp6i0q7C2srKtu7GzvZyzw6y7ycu3w7+4paOwsqytqqOLlpiFpqago5eBppmNoquopIiFlKShoKqgpKmPnLGLlaOnt7qboKOwkqKdop6Qo6Grr6yytaKUpKqImYmSipZ6en2Ff2hhaFxlYl1kY15mZ19aT0RJSFNORkhMRkpHRkZIQUtGQ0ZGQTs4Nz08ODg6OTc0NjU4PDU0PDc2OjQ0NjQ0NzM5PDM4PDIwMjU1MS8xLi0qKi8sLSooKiYlNVhYLywwLCwwhIE4NzFQhWg1QUNbWFRMaWNXam9YeoV2gZOFiIKbg5KRjJLayJ2Wc1aXiI+InI98hoyOiop6h4KHkI6DhYGMhYaHkoaChImGiIeHcG5hQEU2NDwyLzExMC0sKy0xLi0zP0RBTVVRUlNVVVZVTltQR0dEPD4+RkhDREA4Ozw1Qzs9RktJR0hST1BXgZKghK6js6qywMfDqrPFtqyzv7O4vra/tMG2u7qjuMWotsnHtb65tKijtK2xsZuakpqfiaevq6WUdp+kl6GssrOYlqqtqK62u7K6rK+1orGssbW7t7WutaCnp6OnmqmvrbK5t7inm7apjKWOkZOghniCg3ZaYmVXZmFhY19gZmBbVElERExVUUhJSkRJR0VBQEBLREJNRzw4Njc7PDk3Ojk4NjU1NTcxMTw4ODk1NDY2NDk3Pj0zODkxLjAxMjExMzAsKiwuLCsrKyooJyopRVowMCovK2iSTzYwUodqNkFGV1FKTFtaUWJjV3l1cYGUfYSGknWFf4GMe7+7o7yCtJSTjZuPhIiPkomIeYaAjJKMh4WBjn+BiY6Gf4aJhYqHkXp4bl1WQEVOPDY6NDZBQjc2NC8vNkNIQ1FcT1FVV1VcVk9eVUlLSkFAPkdLRkVEOz5AN0Q3P0JKSkVGV1RQXo+kraOxtMK2uMHMyba7xL2zs8C3uMG1vq+3dLGzpbrFpLDGubGzsbSopLW2qrGgopaaopKlsK2mraynpJigrLS6oqmyurW7vsy/xcW9vbPCt7q4vre6t7msrLCmsaqtvbC8usLCrJm6qJSuj5eYq4l+gn1rV2RiWWtlamVXW2NZVlNJR0ZMUUdDSElBSEQ+P0JCS0BATUQ5OTY2OTo/Njo5OTY2MjQ2LzE5NTk5MzY0NjI3Oz0/NjoxLi81ODo5NjUwKigsLS0tLCwqKCgrKyhFUy8qMDBKj2s1MlCHbTY/RlJMQUxSV1NZVVp2anB+joSBjYNuenN4h2K5oZmjiZWUlpOUk42QlpKHhnuGgY2VioGEgYp6fIuHhn2Kg4GKg5V9d3l1ZU9cZEdFTDtRY2FbXlNGPztIUEVbY1FSWVhaZ1lUYGBNU1BFQT9JSkhFRkFAQzxFNkI+SEdLTFNaVF6Tr7i1urjJv7q9ycy7vMC8t7W7u7e9tLqxxmB1sqWxmp6rvaqlqKuqo6KytaGrqJ6Vlp+Zn66lp6aln6SUoqextKeys722wb7TycnTx8LFzMLKw8C+vb+7vLe0r7i3tsO5xb3DyLCeuaqhq46kp7aJgYBzYGJiXlhiYGlmUlhgVlJVSUVFTktBPkdEPUtCPUJAPUY+O0hANzk2Mzc5PjQ4OTo1NzA0NS8yNjM4OTM3NDQyNj84QD5HS1JUU1FQT1FRUEpBOS8sLCwqKygoLC0sL1A+KC40OIB9PDJLiHE5PkNLRUBJTVBSS1FdZ2xrcI+NhY9zbHJyc4fVwLWZoI2VmZmRjpeSlpaOhod9hoOMlot/g3+CeHuLg4d8i3mBioKXf3N9emtlcHVZXVxQZWViYGVkXVtYV1xNZW1VUm1tX25fWGdlVVlVSkRCS0pIRkhISEdCSTlEP0hLVFRWXFpbk7nAuL23xsC7ucrKura6tri5sre1tK62tplkdaidrXBeoqycmKCjm6SeqqWUoJ+QlI6WmJeon6WfnpqZg6SdrKWqsK23sL251NHO19DJzNLMz87Kx8C/wsq9wbzBwMTExcq/yM6zpLuwtK+bq7i8mYB6bF5hXVleYVpjY1FcYFNQS0NBRUZFPEBFPkFIQUBEPTpFPj1KPzQ3NTM1Oz00Njg5NzcwMjIvMjQxNjk3NzU1NTVEM0VMTT41MS8wMDY6NDc3QElPSTstJioqKC0uLyxATSsvNTRtiUkwSIl0Pz5CREBDREZLT0RRXFloX2+XkpCUbmxvdXWHs6yhoJ+LmZyZjI2VkZuShYqKfoiHi5CLiHyBhHN7ioOFe4l0gYmGlX9ze3hrbXV7aHJlaWxpZmppaGBmaWhsWm50lq2kvIiHZ1tvaF1aWlRIS05PSktQS1NRSExBSkZLUF9eYmZqYpi3x7C4s7u9tbHExrWwubCwu6uysaeqt6yNtaedm6eaT5qdjI6flpGmmKWVipOTiZCJj5GRnpuhl5qVloaemqebrK+osKi0tNTU1NbSy9DU1c3Tz83FwsnQvsrJysnRx8zNw9DSuLDDvMS5pba6w6KDcGRdXV5ZYFhZZlpRXVdPUEJCR0RCSDtBQz5BRz8/QTg7RD5ASD00NjY1NTs6Njg3NjU0LzEwMTQ2Mjc4ODc1MzY3QzVCOD8tMC0xMzQ5PTk3LC4sMTtGSz0pLCguMDAwN0s/LTQ2VIhXMESHd0M7Qj5FQkFDSk0/VVlTZVZzkJCYgmhxb3l5g6CqnqWWjJubl4uNlZGajn2Ji4WNioqKkId8hIJwf4iBhnuHcoORi499cXh1a3F4fnF7bnhzbGmBcG1jaW1weGl3fH7Lv8Lfp25jd29jW2FgSlBSVU5ZXlBdXE5QTlRRVVRbbm12gnGWrbiss6ewtqqsvMCwq7WmpLimq66gq7SjjrGtmpiYjJGTkYSOm4GNppGciYOLhIqJhIuDk5WXlpOckZyYmZmfnquspKeirK3P0tXRzczS09PQ1NHOyMPU0cfN0tPT183R0cXS1sXAzsfHw6i+t8+eem9mXmNeV2BTXVpQUVVQTkg+QEZBQkU8QEI/RUQ+Pz86PT08PEpBNDU0NjU8ODg4NjY0NDEyLzAzNTI2NzY4NTMzOz08RT1AMTErLzI0OT41OTAxMDIyLTJETjMpLzMuMzI9TjIzOEN9XzJBhnREOj09ST5AQ0ZIPFZSTU5bdYaFindsd3B9fn+hnp6hi4yZk5OMi5OPloR5hZCQjYuKiJGHf4J7cn6AgYd5hHWFkpGJf292cmtzfHx3e3OBd3FrgHNyaXBxenlyer7Lmn6MsoR2coR3aGFqXUNaWltWZWNYZGpTWF1cYGReY3d6fouBmamkpKGfoKilqrC4qqW0o6GtoaOtoaexn4mmmpOSkYmRj4iBlIlqlaKMmYSAhX2Rg4OTlq2LlY2Vmo6GkpGel6ewoaChpaSoyM7PyMLL0dTR1NPO083G1tPM1NjW1tjV19XJ1NrNydfX0cqsw8PMjHNwY2FgWFRaVFxQS0dKSkpAOzo7REFEPEJDPkhCPkJCOzw5PDpHQjQ2NTQ0PDU2ODc1NDMyNTAvMjU0Njc0NTU0NDw+PUU/QTYyLy0xNjs9MDgxLzI1NC8tLTtSMDE3LzUzMkZEMjg+bmI1PYF0TTk5QEk8QUQ/QTtQTEZLWXCAdX1oc3hygomAnZWdlIWLlomPioiOh49/d4OUmIqNiIiLiX6CeHN7fYOId396h5GWgINueHBtdX92eH10hXx5bYd2dG59doR1eHydtYw7QYvFpX6MfGllVklDZmNlY2dqZG54W19maGtuaW6Ag4iRi52eoJ2Ql5ifo6SmsqOks6ChpZ2gqaCisZyGnpKSkpCLj4uGg4+EfpybjI2DhIV6lH6CqZWjjJKKl5KLfZeKm5Krs5ianKicp73Dxrm2xs3S0NLQzNLLydTO0dXa19fY1NnYzdjbzsna2tLVvsvMtHl3b2VeWlNWUltXRkdKSUVFPTo3OkBBQjpHREBFQ0FEQjs/Ozs3REM3NTY1NTswNjg5NDQzMzQxMDE0NTU4NzQ0NDQ5QD5EQkM8MzMuNkZUV09RSkFKRj8xKiguQlMzOTI1NC83Szc1PGBiQTxzdlY4N0FIOj9DPjw5UUVDSlRrbm5wYnBxdIaNfJeRnYt+h5KDiYaFiYKHfHiFl5eJj4OHhYd6hHlxenuEhnV6hY6NnHqMcHxvb3p/cXyBcYOHgG6OenV3fXyCdX97hoewdFipwraNkYJwbmI9XmhycHFwbnh2gWVpb3J1eHF6i4eOk5GblaCVh4yTm6Cbn6qfoK2coZqZn6Wen6uZi5qMkJGNhH2Ih4OFi46gmZOIhId+bZl5hJiGiJOMjZSMhnubiJSPrqqUlZefmaeutb2prb3Gy8jJzMvPycPRytTX2dfY19Xb19PZ29bP29rR1snUy5V6fGppXFtQU1ReSENFSUg+QT09Nzo9Pzs9Rz0/QUFBREE+Pjo4NkRCNzU1NDc5LjU2NjQzNTUzMjMyMzY0NzU1MzQ1N0VCRENFQjU2PEZOU01bbmZjbnNrYVY+LDRMRzg2NTQzNEJGND1XX2hMdXheODs/Rjw8Qjw6OkQ/Q0dSa19tZGJma3aAiHGRkJqAeoCNfoKCgYR/hHx8hJiOh4t+hoaAd4J5b3t7hoF1epKejaB2jnWCdHWBfXSAhG+Bj4FvkoR0fICFenaGe4m3xqXCybiClpuPd3BlTmZjgXqBd4aikIp4eXZ7g397hHVtk5aUlY+XkIOJj5eal5alnJegl5+SkpejnZmrlZCRio2RgoyFiYiBhpCRnpyZiYaMgYaYeoiIn5ePiI2KjIJ8oYmQi7yhmJOXmpyppqWun6i2v8DAucfJzc7FzcrR1tXV2dXX29TW2drb19va2tjO3MaHfHpoaWVgVFhWVU1MRE5DOz09PDk6PD45PUA2PT9APD8+PDk4NjdDQTY0NTU9ODA2NjU1NDc3NDU2MTM4NTQ1NjQ1NjdISD1ESkU3OTI1O0g+Ozo6N0lQXVpSVVhLOVQ+Ozk1MzI3STg9TllNSHh4ZDU9PkM9PUA6Njo+PkBFUV9ZZWFdW2h0enlsiY2Sd3Z6int+gH6AfIV7foGRiYWFeoSHe3V9dG18fYZ+c36SnZGeg5F8hn54jn15iopugpqAdJiFfYGIhXt9kHqPqY6Pw6C8jJyknH2JhH2JcoyKfnOmmpyYk4V7j5CIhGhHcKCknYyLkJKFiYuQkpWPnJqSlJGWjYuVn52UoJSRjo2Qi36Qjo6LhImSlpqfn4mMlJKdkYKLf6WZiISNg4WEgaWHi4u4mJ2RlJaip6Gdnp2jr7a6tazAxcrQyMfMz9PS0tjS1dfA19jZ29ja2tnZ19u4eXl5bWpmV2BcVFBPSENMQj09Pjk5Ojo5OTs9Nj8+Pjw9OTo7OzM3RD84Mzc4PjcwNjg4MzU3PDM3ODA0OTc2NzU1NTQ2RlA1RE5JODkzOEFLPTszQ0BJPDlEV048TVRITj85NjMzMz5DO1tYPjVZeXBaPDxBPD0+ODU4OT89RFJTUlheVVhmbW1taYGOinFyeYp7en98f3uIenx7i4eCfnWDhXlzenNtgH6EfXeFm6GanZSSgIyIf5iHgJuSboeohXqgi3yRjoKIg5x9mpGKjKOin5Ckr6CLkYuFi4GShldyrYufq5uPg5ibj4+OW4KikYKMn5OVjIeIjJKSjJSUlI+Mj4qHlpudj5WWkYuSk4WAi4iSjYqKnZaZoqKGk52WoIqJiI2ckIOIj3+Dh4WkhoyQs5idkpSXoaGemZKcnaeyuKymvcLHzsfGz8zQzM7X0NHUrtbV2NrY2trX1tnZn3F+dWhnXl1YVFdYQ0BIQz4+Pjo0OTo7Nzo7OjM7Oz88Pjc7OToxOkg+OjM3PUA1MDY3NzI1NT82NTs1NTg1ODo1NzczNUhSN0dPSzk5ND1FSkI+MUZDTEI5ODpHWEA1SFdJNjYyMjM6RUNlWD8mX3lpX3o+Pjk8Ozk4OjtAO0JRS0tTWVBUY2J5bWJ+koNvbXeLeHl/eoF9hnt7d4aEf3NwhYJ6dXZ2dISDhX1/kqajn6WiloqdkJSXi4qol3KKsYyEp5GEmZOFmYyilqCYk4mbnqKSqa+gkZWQjY6IlYtujbeFmsTIspuhpZucmJaQspBkpM3Hlo+Gh4mPko6Nk5SJhYqJhZaam4+QlJOGlJeDf4+LmYiNkKqXl6OjiJmfl5uIj4eXl4qEjoyBf4ePpYmNk6mal5OWmaGZn5mTnZuis7Slo7zBvsjFxcnIycLK083N1KnS0dbW1tja1NPazoN0gWlkX15eTktUWkJBR0M7QT04Mzc7PDo4PjY0OTo8OjgyPzk6MjpJOj02N0JDMzI6OTYyNjQ+PTQ7PjY5NDk7NTc5NDRLUTxKUUs5QTdCR0lANjRKRUxGPjw4OEVUQTc+XDg2MjE0OjtFYFhBRmF0aExjWj41Ozo6NTs6PTpFTUZIUldTUkJjgUZ1go58fGx9iHh6fnqBgYJ+dnaAg3xsb4t/eXx4eHyEh4t9iqOzqKOrs6GWp6ClpJaVrqKDkLeVkrOZjaGgjKSbr6KknZiQp5aoma2vpJeVlpSQi5iZlqDAjqPJuKuboqatmZGanLKdhoWoopyYhYiJjpWNi5OOiIGGh4iSmJSMi5OThpSYhoORkJx0kZmylpekoYicmpSPipCLl5qJipaOhn2MmJ+KkJCcmpmTmJiflKCdlZ+bobGuo6S3vrTFx8S9w8O/xs7KydKnzs3T0tDW2NLP2Ltze3deYVZhV1FJSU9FQUJFNT46NzY6Pzs8Nz00MjY2OTc3ND01PDU8TDw+OzxCQTc1PDs0Mjc3P0A2P0A3ODQ5ODc7PDU1T01EUFJMOEA9RUFHQTU6SkVORUQ6NkFAQlM+OURPMzIzNTc1PXZcPFJcdGlaTV1TPD04OTU2Nz06SkZER05bXFlKZ2A7SISLenpthYZ6fIR4gIWAfXB4fH18b3ONen2Be3iGi4mFg5Knu62osr2vpa6zs6ijorCsipq0naO4pJWspJaprbempKOfmamYqqOvsKqamZyUlZGXn5eZu7utyaBptrirsJSYnqOrkpe9o16qsoKJio2Uh5F8jo59g4aNj5SViIeSlouQlY2KjJeYkp2Zs5aVqp6Lm5SSjZCSjJmbipKekIuJlZ+ijZWNmJqdk5yZnpShoJScnKWvqKKls7irwsjEtbu9u8XIx8LRocbJzc3E1tbQy9SicXxqXltUX1JQR0Q+PENBQjg/ODc0PkY8PDY8MzUzNDU0NTNCMzo6Qk06QTtBSEI7OkA8NzQ2PEI5P0BCODc0Ojk2Pj00N1RLQ1VRSjc8OklBREA0QUpITkJBPzZEQTxKTkQvVD0yNTQ6RUpcWEpaUW1ncHBEaWBLSTY3NTc6PkpAQ0lQZUdiYGNwSkCLin+BcoaHfYGJdYKKg39tfX18f3B3h3eOgoZ7jY+Mhoyaq8LAr73Gu7K0wby0rauztoyosq6uvaqbu6Sorbm3q6amoqKjo6mvsrGrnZykmJuYl56ipaWSo7muqL+7rK2yuaWjpn2IhpytvbCDi4yLkIOPg5GPeoGHkI2OnIiIj5eNi5WXlJGalp2nmrGakaudjpqPko6VkJCWl4+RoJGJlZujrJSWj5ScnpSgnpuYoKGVmp6np6ShpLCypsHGw7CwurbFxMK+zafHw8fDvNXQzcTKiHRzY11bYVtOS0JMQEVGPkE/Qjs6ND5BPT01PDY+MzMzMjQyQTE3QEJOPkdAQ05DQT1DPTs4NkNDNUJJQjo4Nzg7NUI+NzlWS0RXT0Y4PTRLQEM+NEVLSE4+QUE2QkI/QlNFNThQMTQ1Ozw4O0Q+OUxqal07V1JkS2daVU83OUdFP0NGXGZGYGlnWl1bk4yMiHuHi4eDjHWGkIqBb358gn9xfoF6lXqRlJSYkJOWp7TGyb/CzMHDuci8uq+rubuXsra6ssCupcCkqq+7u6qtq6Kinqerr7WwqpugqpyinJWesLSni6K6ubXBu6uonLKko6iThY2pw8SkgouPh4iEhpWUjXqDjJGPkaGMjJSRj4mXn5iTmZSXpqCunYyqnI6Wj5KRlZWOkJWRj6GUhpefoLOelJqUoKGZpJ+aoJuglJiepqSmp6SvraXAxMKuqbe1ycO+ts6yxb7EvLPRycjBtXV5bV1ZXWtTTUlDTEtLSUBBPUNEPDVBRDs6Mz04QjMzMjI2MkEwNUlFTT5JQEhSQEg+Q0A7Pj1GQTVBVUA7OTk4PDdFPjg+VkpDV09HOD80TEBCOzVKS0NMP0I/PEJGPUFITDkrRzwzNjc0NjRBPzdPYU9hRS89PjZrbGpgQDpIPj9FQmZbTWVcZlRjapmNl4qLiJOQhol5hpOQgXKAfI1/eIeCgpB6jaGWqJmamLq+x8jKwtLJysLNvcGzrLu+p7q/vbvDuKzBqayzu72qsKqjpaOrrrSttrWgn66fpqKYo7S9qZuovMGjtravq5KvrKqrloaZqaalkYKMk6WViYF1ipJ5hY2RkJ6fk4+Ui5CNlKOZl5uUlKOeqZ+RpZqMj4+QlZaIfY+VkpKjm5Wgopy1ppCflqWko6WenqaYnpWXm6WjqaiisqyovMDEr6Wzt8zAua7Ds7u+wriswsLBwJluemJZWF1cTExNSkdEQ0hCQkFDSzo0REg5OzQ8N0UuMTIzNTJCMjZTSE48SkJKUUVLQ0RFOkVMQjw3RVY9Oz04OT88ST86RVVJQVdRRjdBOks6Qjc5Sk1CSUBDPjxERzxCQ089MjBIMzY2MTcwPUI6PWpqSks1UVMzU3BwZE47RD1ARj5rSV9YYVpkZFaekJ2Ol46ekomKf4ifk4R4hX+Vfn+QiIqRgJWhmq6mpJjDvsjDyMXTzc7Ny7vCt6+6vbS8yrzDwba2vK2zv7m8rq+ooKmntq2uqbK3mp6toqihnau3uKmlr77Dsb25s6eps7OsrZaWpKunoJGOkrHFp5WOfJGVfYeRmY+qmZiTk4+TlZOlnpOdmZOho6KcmJ+Zi42Pj56IWpCXl5KWpZpmmKOfs6WWopasraunm5+ml5mWmZWhpKimnrarqbq8xLWltLbLwbiptqyzu7iuqLi6vbiDbm9bWFVWT0ZLU05LP0FIRURIRkc5NUZNOz43PkFKLjMyMDI1QjU1T1ZOO0xGS1JMT0dHST5JUT86OElTOzs/Nzk+RExCQEhTS0BXUEY6QT9HNkE3O0hNQ0U7Qz00RkU6QkFCRzkvOkEzNjAzPkdEOTQ9dGRNRztFKzpmfGhXOz1AQkZCckZpSVJlYkxGppSclqGXqZaNkIOHpZKIgYeCnISDlZCRlI6aop+vvq6hx73FxMfGzs7O0sq+u7axuru8vs62xL23uLeysrWzt7Osppyrq7irqaevsJejr6SopKW0wLCqrLO+wrnAubOnt7O3sq6VpKyurqSLk5WhjXTBmn2WmYSOlpqLsZWamZWSk5mZpqOVoJuWmqicm6GgmYuNj5adYEqWnJqUmqWXVJawn6+cn6WUr6+spZqhpZSTmZmOnaCnopm0qaqzvLy7q7Cyx8C5paurrbGxo6GysrSkcW9mXFtPUUxFUFBRUTtIS0lGSEJDPjlLVD9BOj1FTTA3NTQ0OkIzNE5XTzxKS05VTlFKUEhISk9CPD5NUjs+PTg6PENSPkRIUklCV05JQENBRjM+NThKS0NBPUM7NEVBOkE/PkhANSpCNTIsPmNdZzozNXRkZUBSNyYjM31pWDs6QkNAPVFFV1JzYldGSKuXmaCiqK+ZkJeHi6eWjoiShZ+IhJ2Xj56gmqOktci0qca7w8PIysnHzM7Hvrqyrrm4wMHNtci6wLm1ubGvr7K0p6ObqrS0q6mmrqyZpK6lpamsur+oq7a2vsG/vriyssKwuLyro660rLiliJuXppt2vqCEmJyOk5mai6+WoZybl5Wbn6GpnqigmZqpmaGnnpeQjZGdg252kqKalZ2in5CtsqOrlamqmKuupaSgpKiSkpmciJScop6Xsaepq7q3vrOyrb25tqCjp6ilp5ycrKmpjGVmYV9STE1HR05KVkw9TURNSUpBQ0Q8UFU8QUFCRE8xOD03Nz9CNzVVWE4/SE5RWFJQUVRKUUpKRUFFTVE/Pz04PTtHUjxFRFFCR1lNS0FIREU6OjM5S0lCPkNCOTlDPjxAPjs7RzctMj4tMYJoTnpcLzBraGA8PUJCODZ6Zlc7Oj0uLlNhTVVIf2VeSEWslZyhn7uumZSejJOqm5GSk4mrjYeinoykrZSjo7bGvbTBusLCyMjFws7Iwr25sq+4tMDCyrbGscG8tLqrqK2sr6Oimaq0u6appquqnaivp6Srqr28qK28s7e9xry2tbfAr72/s6i0tqu+pI+jl5Gin7yfiZmgmZaenY+3n6mcpaObnKGaqKWzoZudpZyoqZ6ZlY+Um4uXiY2koZSco56gtK+lpZOwq5mrrJ6epKOpkZWVoIOQnp+clamloqG0tLq1rai1srOfnKKmmpeVmaqhnndhXmBeSklGSE1RSU5FRkZCUktJQURHQVZSREg9QUdRMTtCNzpCRjc5XFlLQUxQVFVTTVdSTlVKREBKSk5POUM/NT08TlFDPz9QP0VaTUpBS0RHQDUzPUlHPz1FQTk3QTs8QDw8M0A8Lyc7KkiRQjpTSjAsW29XNzE8Kh1CgGRUNDktMTpnXEZDQ5xvYkdFp5ekn5/DrJyXpJeZqZyWmpqPqpaWqKaVra2Zoau2xMK7vrfBw8DHxL7Nx7u+ubKwuLO/w8i1v6+8trq3pqSqq6ygoJqqq8Sipairpp6rr6uiqai+uKatvbC3tse2tbm4vrC+wba0srSvvaOXo5aTm5Sun5ChoqWjo5+QvqWpnaisnZ2hm6afvaKZo56iqauhnZeNlZ6Tn4ePhY2SnqSgnbWsppyVsqeZsKefmqqeoI2ZlZ+EjqGam5OlpJqYrLG2sqqlqa2snJmgoZKOkJapn5RpZFphXU9KSEtPTUhFRElBPU9IQTtHSUhbUk9LPUhPVTRCRjk+SEc1Q2JbS0NOUlVXVlFYVFJVSEA4UVFQTTpHQDRDSFFTSUM7Qz5HVktDQE8+SzwwNjtHRj47RkE1Nj85Oj85OzE1RDAtLDBNdlw0S1o1LE1uVzwtPSkeI3piUTVDS1E5b1JGPEt4ZWNXTKKao5uexayhn6ydnK6fkqOelqSgp6qsl7awo6qztsTCvb+2wMK8yMK+ysi2uLW0sLO0t8HGtr6wuLS5tZ+mrKqrnZ6fpaTBpaCpraCkqa2voqanvbWlsby3tbXDsrO3ub6xw8C3t62ztLWinKSVkZOgraCYoZ2oqauimsOtqZ6srpubnpmmoL6hnaSYq6urpqGZjZqfkp6Jjlh/lZ6loaC4qqeTmLajn7OhoJuvl56OmZSdgo+fl5aOoqSVkKausqupoqKlpZaVnZmLj5GTpJ+JY2VbZGBMSUpLT0ZFQUZKPz1KQjk5SktOXVFRST1MV1w5Rkk9RE1JOEhjXExDTFBTWVlWV09aXklBPVdRSUs/SEA1SE1YU0hBOkBBRFBIPz5RPks3MDk5RkU7OEc/LjY+Nzg+NzcvMT85MSUxUVVtW0pPMTA9Z1dEMTc9LSt3YFM2U1prV3NIRTY9dWVcS06en6GYnsOnpaKzoJyyp5OqpJ+jn62prJ27sKmstbLHw8HCs8LEvcbEvMXKvLCwtq6wta+/xbW5sLC6tayaqLCpqZqepqGnwq2brLCcqqKusKmkp723pra6vK62w62zs8K/scazurartLWtqqKllZWUo6uhnp+aqKuwrq+7sqagqamZmZeToqS5oKGkkq6vrKWmn5KhnpWej5GOlZ2Zo5+ntKanjZi0nKOvmp6brpGelJeUmoCSoZWPjqChk4umrLClp6KcoJ6TkpuUhYuSjZyegGNmW2hlS0lMSlNCQ0BIRzs7Rj85OU5NVV5SU0o+T15ePUhQQkxMSTlOZF1MRUxSVFlbU1VPXGJIQT9aUUFIQUtCN0ZFTEtOPjtCSEROQj07TkBBMy85N0NCOTdGOys2PDQ2PDM1LS80QDErJ1Z0U2VPPzEwNGJbTTIzPjA8dl1eP1tVXmZyQDg8SJZ3ZUE0n6Sfm6DCqKOqsqGjtamWsqumoqWyrK6pu7KtsLW0xr/ExLXAxb7KxLbAyMK1q7WosLiswMS0t66strmlmauyq6qXn6aXrbu1m6iwm62frrSxp6q6sqe5s7eyuMCqt7LCvLPFp76urbe0qaesoZeWkaWkoqKXmKSuuK2xtbagn6ikmZSVk6Sgt6KkpZatsbKlqqahnpqam5aYqJ+fmKKer7Kipo2XrpmlrJeZnqWRm46UmJqFlp+UjJCcnpSLqamqoqehmZ6WjI+ZkIGGlomUn3llaV1saU5QTU5UPUNBTUM6OklANzdRT11eUlZRQVdgXEJKU0hWS0g6VWRdTkZPTltXW1JQUVhdR0FCW1BCRz5OQzlIR0hOUD8/Q0lCTEI8MklBOTQxNzdCPjs3RTcrNjkxNDgwMi0vLjw2LSNCcWdzazIzLzFbYlozMzgwNnBbYkgwNUpwaVZDV0aMeWZDO6SjnaGmv6anr6+gqbWrnbmvq6SqtLexsLm3sLe4uMW9w8e9vMTBx8C5wcbBuqq2pa27rcHDt7iqrbK7opWtsK2ylqWnkau5qqCnsJ2qn7C0sqqptrWsu6yysrm3rLmwwrq9vqbCqrC3r6mqq6admJiqoaGgkZigsK6zq7C5mpupn5mWkpemoLappaKir7Gzq7Gnq5+boKCbnqWcoZedo7Owmp+Qk6WaoamalaKflpiJlJiTlpedk4iQm5mUjqmop5+jnJibk4eOmYt+jZaFj5traW1hbW5YUVFaVUFDRVRAOztIQTc6WFBkXlBWV0RZXl5NTFJOXktKPlpkXk5IUE5bVVlQS1NXWkk/RFhQREY+Tj89SUdHUVBCPUNGQk0/OjJEPzc3NTQ3Pz05NUU0Kzc1LzI1MS4tLiwxPionKz1ccD0+MS4xZVtkQDE2NDdnWWBGKD84bH1oW1Y6iXtjQz2on5yhqb2hqrCqo7G4qaW1squhrbW9r7O4vLq9t7bBwr/JxLnFw8DAuMS+wbivtqirt7K8v7+0qa6xt5+Xq62orZenqY+nu5+lrbOeq6KxsLOsqbaztbytr7G1rLC1scC6xLarvK6xuKusqaKxpZ6kqZ+jl5CZn7Kqs6mqs5mdp5uZlI2gpqS0rqehrKytsaeyrLKppJufqKSelKGYm6i1qZeZkpKfmZ6hnpCsn5iYhpWYi52anJOKjZaXmpempaOgnZaVlpSBj5WFe4+Sg4yXZmxzaHByX0dZZlZEQ05YRFo5SEI2Pl1RaFxOWV1HW15dTk1SWGRKSkNcY2BQS01OWFdYUEpWVldMPUVVSkVEQU0/QUZISFFQQTtGREZLPTg3Qj02ODcxOT48NjVEMCs4MC8wNS8qLC8tKj0sKyUyKyo1SzEuJ19eYVUxNTA9YFZeOClDM1lVXGdLNYx6ZkxApJqgpKy3pKyppa6utqmus7mmp7G4xrext77BwrW0usW+zMW5w8C6v7rEuMG5srWsqrq3urq+taqtsbaZmKerqqubrKuPq72eq66xo6qfsK2zrq62sbm2qa2usKe2sLO7vMmyqrW0sbSvrqahs5+aqK2gpZWVmpmxo62gpa+WoaSZmZKNoqWnsqmhprGrqbWlrrC1r6OZna2nmpeemZmsuKOYlJGPmJyhmJeUrJ+dlIGTmY2enZqWkIqUk56apaOioJmWkpKWe4uQhXuMi4OMk2tueG51fGFGYGpZSUhaWz17SkdFNkFiVGlaTVxhSltdWlJSUmJgTEtFX2FgUExJUFdWVU9HV1ZVTjpJVklIP0NLP0VESEhRTkE/SEhIRTw3PT46NzU2MDk/ODY2QiwtOCwvMDQsKCwvLSo3NikoOS4kOks1LiJUYFZhLjUoQ15RXC4qQi9KR1BbSDNjWVVLRJmXoLCosamspaOurrWpt7S4o6y0t8q7tLu6v760tLfDwc3Hu8O9t76/wLi/vbG9rqe6ube3wresrbG5lZemrquno7KplK+6pK2ysaenorKzsLKwtLG3sqiuq7GmuK+1s8PFtqm0tauwramnorafnqaxoKSUm5mUsZ6nm5+pjaminZuVl6WlpbenorGzq6exp6ywtaykmaGsqJucnZuUqrmclY6Oi5mdopiQl6ahn5aEkpeQnZyYlpaIl5CXm6idpKCSlpGQlnaEkId8hYKEjYxucXh2fH9dS2VsXEtPY1w/YntHSThHZ1dlW0xeYk1YWVdUWFRpXVBPSGFeX1BKSFFWVVJLSFdVVk04TVpORUBGSz9IQkNLU00/P0xPSEA7Oj47NjswNDE8PTQ1OD8pMDcpMS4yKSksLC0rLTkkMDQyJTlCNy4jQU5JZzI3J0ZhTFYlLUIuPUVNUTwzcmtKREORmaStpK2tq6eksLKzqrewtp+rtbnJua7Bu8K3s7K1wsPPxMDBvrW9wL+6v72zxKiqubC2t8C9r6yzs5ygp7CtpaawpZ6ytayrsrCsqai0uay0srWss6yprKisqbmusbDHvrilua+pra2mqK2wpaOjrqOpnJ2cmq+ZoqOio5CsnqOfn6Gqpqa4pau0tKSpq6irr7auop2jqKqboJqakqS0mo+JjYiSo6CVjZSdoJSThY6Uk52bmJaVh5iSlZmnnKCfjZKRjpF3fo6FfXx9h4qKcXRyfn1+XFJkb15OWmZdRkSWW0c6Tm1YYVtNYGFOVldWV1RZZ15RUkxjWltUS0dPVFNOR0lWU1xOO1BeSkJESEpBRT8/S1NPPjpOTUM8PD45OjU9KzMyPTYyNDk6KDQ1KS8sMSgpKywtKiY1Ki8mMCkzODoxJiozQ2Q7NipIZEhKKzpJPzNCSVMsPo9rPUdIj5upqqKpr6SopLO0sbS1sbGhrK29zLquwbzHsbSttMLD0cXGvsCyvsHCvL+4vMWorbess7i8wbCssq2gpKetqaiksKOqsaqvq7Gur62rs7unt7GyqbKpq6Wlo626rKqxwrm0rLqoqKitqaixpamkoq6qqKKem6KslaSdl56Yq52hp6mhrKWirKu3sbGgqKKfqq6wrJ2epqepmaOYmY+gp5iGg46Ki5+gj4uMlpyPj4aIkZWgnZaYlYaWk5OXpZydnIyRkI2Kf3+IhX13f4eFh3Rzcol2bF9ZYG5jUXNyXEs8hHxGP1d1WGBZTmNcTlVWVVdQXGJeU09OZ1hXVktHTE5SSEVJVlJdYzxQXUQ8RkhIQkc/PUpQTDo+T0o9OT89Mjo3OyozNT4xMDQ4NSg1LyosLjMwOyksLCclMjM0JCwyLTg2MCkoMTxeSjAuSWdERjg8QjA1RUtYMUCUWz9NRpWXrKeiqrKcqamwtqy4ta6qpaurvcm8sb63w6+xrbPExM7Ow7+/tMDDxLrAtMnErK+3rrK5wL+zrq6rpaeqsKmnqLGltK2qsK6tsa+zrLO7pLi0rKyup6ufo56wt6uqrbq2pLa1pKmnrKyqraGopqaxsqSmpaGhq5apoJSaoKaepKKqpKyinqaxt6ytoqSimqiqramcoaWkpJmgmZWPmJ2UgYKQiIWdoI2LjoyZj5CLhI2YpJySkZuMk5KSlKOam5qLjouLfIeBgoN7dICEgn50eIykh3lrXmBuZ1dmh2ROQGeSTERieVdiWFJlVU1WVVZUT1xdYVVLTmlXVlZJSkhJT0JHSVNRWW9BTVhAOkpHRkVHPj5FUUg4Q0tFODdDNzI6OjoqNDk/Li80NjMpNCsqLCsuIzQuLSsmKCs3OSomNis8LTIsJjA2V1ouMEpnQUE8PEMrOkpPXjREhkBISESXkq+ko6qwl6qprbWrtrGrpKuqqbzBwLi5s7y1prOvxMnL0b7Bu7nAv8K5wbrCxK6xtbKzu8G+s7Kurausp7aqpa2vq7mvqLCwrrGrtaq2tae1tquspKmqnKOds7OoqKS0tKC2rqGpqKuorKegq6youbapqqmpoamfrZuRqKGdoKSipqKpnZymtK6npamio5ekpqapnKKko5+ZmZ+Rjo+Zjn6HjYeFnp6IhYqLj46QjYSGlaOajo2bkZKRj5Kfl5mWjYqDf3SHgX9/eHWDf3t4foCJno9vcWdncXhcYXSIaU9dmFZIbXhVZFZRYk9MVVRVUU9YW2JWSFBqVFdUR1BZVUk+SUhPUVB4TE5WPTxLRD9AQTxAQ1VDOUFLPTU7RTEzOzk3KjQ6PSstMzQxKjgqKisqLCkqKC8qJiklMzssJDIpMjAyMSYvMlJjMDI/Zj1OWD9DLD5MVF8vSWs2UUU7lY2voKWqrZmrpK2vs7SuqqWvqam6vrvBsa+4rqK2r8nHyNHAv726vMO+usPBwL+vsrOytb28wbKys6uzqaW1qKSts7O5r6OttbGvsbmquK6qrrarqp6qq5+joLatqaGfr7OhtKqeqKeqo6qhoaytqL2vrK6soaenn6uYj6+imKKgqKeep5uZqrCoop+soaGSoaKjppiaqKaXl5idj4qHlYh9jYaFhKSXhYKCjIePjpGEhZShl4iRnZCTkY2RnZWXj4qFhnh0gX99dXl6gHt0dHtqgoejdWleZWyCdWeIi3xSV3BeSnhzU2RTUV5NTVJaZ05MVlllWEdTaVJRPkJOUWFROklITFNJcVBMUzs8ST87PD07QEBXPDw+SDczQ0IxNTo5My01OjopLTMxLS02KSgrLSw1MiMyKScsJS47LiYxLjAtMTQlLDBMaDozOF89YWQ/RjFDUFtbK0hPOldCNJCOsZ+kpqujpqSsprSzsKmjsKequL7AvLCouaqnrrDJxsjQwr3Avrm+v7zJvMK5sLC1srq8ucCztLutua2jtaanrLG2ubKnp7q1rbW8r7ylra21q62cqa+jn6Wsq6ecnqqzpLOomqqnqaSpnaOpqKm9rLSvrp2po6Cum5qyo5akm6Sln6SamqiqpZ6aqaGbkZqgpZ2YlqmpkZiZk5CKgo+FfY+CgIiej4Z/foyHkY+QhICTm5SFk6KMlJGLkZuTlYeJfoByenl+fGl3fHp1cHF+aYZ5hIhkYGhjc4V6bWd5XV5VQld6bFRhUFJZS0tNcHRdSFpbZ1lFVmZQQz5LTkRDQTlIR0tTP2phSVE4PUg8PDw+Ojw/VDY6P0M0NUg+Mjs1OTAyNzw1KC41Ly0xMSYvPktJMSUaOTAlLCwwOS8sLCs2JzE3Iy0vR2pJMTRYPWZiQUo3R1NgVSo9PEZbQCqPk7GZn5+opaShq6S3srKkqLCnrLjBvbWwo7msqKiww8nJzMG3vcC1t7+6yLbDtbSztbK9ubq9tq25tr+torOmq6uvtbi0qp26u6iyv7K6oK+0tqmsnq2wopylqKmjnpyksaawoJ+qqaeiqpujqKCtvKiusK6hq6Kjrp6erKaXn5uho5yfm5qjqaKamaOjlZaTn6GWm5amrIuekZCRjIKLgH+OgXualI2JfH+LhpCPjImFkpiRh5SjipKSh5CakJOBiHx5bH12eXhie3pycHBzeGqCdGqDZ2RoYW9zjm1ianBgb0FceGtVXk5QUUpJTFNaV01cXm1XRFdgT15QSE1ERjs3SEVLTzxyaEpLOUFFOzs9PTs7PUo0OUI8MztHPDQ/MTgtNzg7MigwOS8sNS4uPS0qTD4qHTQ5JicuMzQuMCsvNCYsOiQ0MEFoWjEzUz1lX0RMNktWZE8pPTNRXD0jkpirmJ+Xp6Sin6ikuK+uoq+vqau4wrqyrZ+4r6uotLrHyse/t8K+sLS+t8S2w7KvurKzwLW7vripubi+q6S1p6iqsK25sKmZubyjrr+0tKGuuLWnpqews6CfpKanoaWZn62oqZ6gqq+noKaXo6mgsLifpLGvoauhrKSbpqapmpqbnqOVnJyanammlpqep5GXkpidk5mVoaqQmomNkId9h36CjXx8oYyNiXmDjIWKjI2FiJOajomVn4iRlYKLl42QfYV7c3B8cXN0YHl4am9wcXBqf3NjemxpZmRhZoaAYFtyanFMTX9pWFpNUExKSFBSUUlNW19vVERYWlJnT0hLRUY1NkhCTEk1WmVKQDZFQjk6Pj0+OjpDNTk+OjNARjwyQDIzLzo7ODMmMjwwLDg1QiopLUMqLDQ7Tk5AOzczLS4rLTcqKjwlNTM9ZmQyNE0/ZV1GTz1SWmdIKj8wXFo1KJacpZiclq2gn6GkobersKO0tKmoucW2sq6gt6ytrLC1xcfAt7/CurG1vbe/u7+vrL6wtL+yvcO5qbu7uKeotainq7Css7Cmmby2pKu7ta6fsbiwqaWnr7KboaSgo6ShlpywpqGfoqevoqCik6Olorewoaaxq5+soq6YnKqkqJ6Xmp2kk5qcmp2lqZmcm6SUlJeUnI6Tl6KpoZCJi4+GeoR9hIp5jpeKjYd6goiEiIyOhY2UmYyOlpmKj5d+hpeLj3qAenBxdm9vdF94d2VtbGxqaYRuZnJpbGZpXWRzgWBba3VpWkl9XVtYT09LSEdSVUYyOV1ebVBEV1ZZZU1ISUVFMDdGP0tCNklKSDs2Rjk0OT49PDk4QDg7ODo3QEk+ODw0LTM8PDc1KDU+MSw7QTEoKzY8IjhSPSoxMTM+RDUsLSc0Mio7KzEzOWRtODRHQWZbSFREVV1oRC48MmNWLDKVoqGXlJuqnaShoqC4qq6gurimrL3Fs7Cvo7Wwra2vtMPDvLO/urixs7m4uri6r67As7S5sL/BuKy9u7WmorOqp6myq62xoZrAtaSntbWonrK8qaimqa+smaOnnKOmlJihsqWZn6OoqZyioJOkoKS4qKSnrqaepaCokp+ooqGgmJudoJKam5agoaqbm5ihlJGUlpmNlJKjqKSQiYqPhnmEe4SGfZ2NioqHeoGEiIiIkYWVk5OMkJWUjY6Ue4OXjot3fntsdHFsbHNheHRoaGpnZ3CGZ2hpZGZpamBqYmpnW2V7Y2BTc1RcW1NMSkdJT1NAISpoXWpMQ1ZVXmBLSUdFQy46QjxGPDZLUEQ4OkQzNTc9PTg5NT86OzQ+OEBLPT45Myk4Pjw6OSo2QDMuRTQoKyw/MC1OPy4rLTcsMTE5NSwmLjUtODA1NzZgdEIzQ0RnW0tXR1VgaEIzNzlnTycynqOjkY6jp5udnp2jta2mqrm3p6zDwbawrKO1rqeur7fAv7yxwbaxrrK2tri3tq2qvbSvsrG9v7iuvLyxpZ+2q6WltKmqrp+dwauopbCyqay1u56pqquxpZieqp2mpJGZp62imJ6kqaGbop2XoJ2ntqWvqq+hoZ2doZSgpp+hoJmbmZySmZ2UpZ2roZeWnZSTjZWXi4+YmqigkoiKi4h5hXeCgoKciIuCiXx/hIiGhZGElpWPjpCRkZGMk3uDlY2Fc319Znhva2psZ3Vza2NnZGR2gGJlZmZlampka3FaXlldbWRhTmhXWmBWSkdIS01SWD45X2xpSEJUU1xbSUhGRUEuPD85QTg5UkZANzpCMDM3PTc2OTI6PDk3OjlETT1CPDAqPEA7QT0tNUIzNz0rKiwwQSpKSy4vKiszNzIyKDU3JCs3LjcyNjg1XXlOMj5IaVpMWkpWYmZAOjNCaEglNZujn5CLrKGYmKCWpbSxobG9t6Gxxry6sbGkt6yrrqm5vLu6rb+xr66utq+zuLOorLqxr660trq2r7m+raaetaugoLCkq6+dosCgsaOusK63rrWera+sraKanaeppZ6Vm6iln5mkoqmdmqCblJyerK+luqiuoqGamp2ZnqOapJ2XnpiblJmgkqiWqqeak5qakYuUmY2UlJmpp46OiomPfIJzgYGLmIWHfImJhIWKjIqThJOckpKQkJGWjpB/gIyNg3CAfmZ5bWhramdxcmtcaGRjc4FhZmhqbmxna2pobVxsa3RxYVRiaGRlWklGTE1PWFFRVmFlgVRAVlNZVEZIRkVALzw9Nz82PEZOYTg6PzI0OUAzNzgyOD83PTg+RkpARDkyLT1BPUE9MDVAOUAxLSsuMzw7SzYvLissLTI0OzYjMyopNi41NTQ2NVp8XTE5S2pbTVtLWGRkQEExSmZDJzSSoZqNjrCdmpOhmqmyr5+4v7agtMK7vbmxprawqK6lt7i3t6y6rq2qq7eqtLmuprO1sq6psbe2sbO1uqepn7apnZ6poqmtmqe+mK2jrq+1ta2sn7Gtr6minJyjq6iblZyno52aqaKklpqgnJGcpKuqqbufp6SgmJmZnaGPa6GWmZxxgpWao4B1kqmnnpSUnpCIl5mAloqhkHiGlIyDbmp+doNxbIaLhn2Ei4ZvXmNhZ4SXhmuLj5STdXeLhH6DkH9nhoBodWlmV1xoc25OUGpkZ3KEZ19kZm5tal5gYYqQhIVlTktEOEZUZ15KR1BQVFVLSFNhb3RlRlpRVVBGSEZDPjE7PTY9NjwzZlw1Ojw3NTtENDg2MDpCNz86PkZMQ0IzNDM9QEBAPTI4QEU9MSwrMDg+RzYwMS4qLiovNTY4LCMxJzIxNDoxNzZZgWwxNk9rW05cS1tmYj5HMVFkPSsujKSZhpWwm5yToZuqraqjvcSvqbfCuL28rae2sKWrpLezsbOwuK2qp6y0prC1o6i4trWop6y3s660rbOiqp+0q56hpJymp5irupWmpa+yt62upKmuq6yloZ+coKenm5ehpaWbm6ennZOfn5iQnqiqo7Wvo6OjnJaXl5ejiKGOkpqHoYeTnaB/pX+mqp6SkZqRiIRyeI2OhYihdomNaZeIZn1yeKFwiIeEfo18f6GgoJmAe4eedIiOdpuKbIeBg21oZWN6bHFiVIZtY2xpmHFZanFvh1heaVtra1uIcW56coZnhoRaXkZNP0dfTUZSVlZRUVJXVWdeTVdJUlNPRUdHPjw0OT05PDc7MDw8Nzk5OjY9RjU4NjA8Qjs8OT1GUUc9LjU8O0A9QD41OUdBODIpLjE8STkvMDEuKi8oLTQ1ODMlJjIxMTU+MTw4WIN1MjVSa1tOXExcZ189SzFXYTcwKIuml4Ocq52ZmZ2fqqqnqb7DrrK6vLfAv6qkt7CprKaztK6us7arqaWxraW1tJyutra0paeps7Gtsqivn6uhsqmgo6OaoaOarbOUo6SltrynrKerqqyopaGgmKCmo5mZpqOkmJykqZaUo5yUk6SlpqG3o6OgpJiUk5eTm4iuj5iUiamLl6KbhbGAo6ydk5mdlHmC1KiAh5XBm8d5eLGlt5dkgMCcv3mEhHmQhHyQkJHKcZa8nMV7cramu5B7gGyWsauweGhrWLGubmVpvJK8bmh6bnKP2H5TamK2sn6BcpR0mqGqkFdPV2FPVk5GVFtYUVBSjFxXXFBAXERRTkVHSTw8NTc9Ozo5Oi49Ozg3ODs5PkY2Ojc0PkA+Njk/RVJJOi41PjtCPD9BODpKPjUyKjIyQkUvLjMyLisvKS0vMTg2LSAvNDE2QTE9OleDdzIxVGtcT1tNXmdcPkwxW100MSGNppKBpqmfl5yepa2yqLDCvbK1wLW3v8KrprOsrKmnr7Opr7azqKimtaanuK+cs7K2qqWkqLGurrGmqp6npLGkoaCel5ugna6rlJ2hn7S6o6qpoq2upaKdmpqhp5+Xm6ign5iep6eRnKeblJ2hpqKgsKKfn6OWlZKYkpmFr2pqio2qfmeElYatZHCdnJOZpZRxrqGkfni7fWuhkHaxX2q0W6WAZpyRYGaCemZ/anhrqWS+cmemjHaxanyxeHSSk2NtbaduW4SgRWhnh5ZFdZxgfmd8pKeCWV+Lq2mAlXh5aqc3Sq9cV1NtY1tLTldfXFdWO06JT1dXL0lUU0lERUY9PzQ2Pzs4OjkwPTg5OTk6PTxEODs6Nj1BQDY8QEhRRzkwNzxBQz5ARDhARz0xMy0zM0UzLi41My8rLyguMC46NS8nJDIwM0IvPTtVgnYyLVZqXE9ZTF9nWTpNNV9ZMzEbkaGVg6ynpZ6jpaqyuKy0vb6vtsSyt7rCpqiwq66pqbCuo7G6r6SlrrOjqbmonrOysKOloKqtr6yvpqefo6Kwm6Kbl5WXm5uspZaboZ60s6KrnKKtraCempegoqidmZ6kn5yaoaekj52jmpegn6qepqagm5+hlZWRlpGahbWbtXiFqZm1mXeHs5u3fpOVlqiUfmuBpnuChoiSlJJ4q2drsVure4+HlHSIcY+GgH+IkJd4g4KLmIyDoI+EsHZ3n3Fra2x8i06kWEhjY5l+Y2imYHlydVOSh15QqW1jcX6HgGKcLlGib1tTa2hgTEtbZFhcWkI+sXhXWEEjTWhFQ0RBQEExOT44ODo4NDs6OTw5OkE6RTo6OzY6Q0I4PT9LTkc6NTpBRkJAQUQ8RkQ7MDIwMTtGLDAuOTQwLC4oLzMsPjgzMR8vMi1EMTw8U31uMytYalxPWE1fZ1g3SjhhVTUwG5WflIizpqahrqmns6yqu7bCsLvCrbi3waqsra6upq6yqaGvvKqhp7StpKu1pKays6ejoZ2oqrKosKilnp+fr5afmZSVlpidrKKamaSotK+iqY+pqKqbnpWYoKWnmp+cop+boKOlo5WbnpianaKqm6WZnJuioJaTkZOSnIPVk5m5cLDCfsaGfNaUm7t8mZWkj42cjaR7joejgqWCeqx5j51Wr3qIfp9quVq5d4aDfKaCk3yYeqp5jZ2Qe7FujoR0kLyFb5RQr6fFilGgemNgqWN0cohtl4hgU7W0yIaAiXxjpDNCnXZdUGppZFBAWGdaZGFKSE1sS1tST1lmWUNEPkU/MDw8NTk7NzQ8Ozg9OjxDOkY6Oz42OkBDOzZAT0xIPDo8REhDQkNEPEVGODEyMTFEQy4vMDQ4MystKS4zMjM5NzEjJTUqPjM9PVF3ajYqWWlbS11PX2ZUN0c6YVE3MiWboZOYsaiopbOqpbWopLy3wbC5wLG1tLuztaexsKOwsqafrraom6i5rqOvsaCztLCgpJ6fqKqxqbSppJydnqqXmJeWl5WWoKmdmpaorbCpo56PrKKolp6XnKGloZiioaGhmqKip5ueoZ6VmZumoJynlZubn6GYj5KUkZyIsm5otXGrh2+OpnK0c3K2e5mXo4uOnI2ifpGhpX6wdoOR0tF2XK57hX+kb5uqpmuHhHytfZeZj3uxc5Kdj3mzZZZ0hJ5vnmaUUsiLWsJcn3liX61gdnOHYpeIXlnKnW+/gXVNS7VTVcZkVFFqZGZYQU9rX2xoT1VHSTk9VlJbWFhJQz9KPDI/OzU9PDQ2Pjs3Pjw9QztHOTtANzs+RDsuQ1JKRz4/PElKRkNFRD5ISTkxNzQ2QT4vLjI0MjUyLSkuMjYsNzQyJh82MDs1Oj1QcWg5J1dpXEJPVF9lUDVHPWFNNjIwoZyRpbCtpKq8raa1pae2u7yyur+3trS6urOltLOhsbGin6yvpJimuq6ksbGctLiqn6adoqqksqisqqSanJqonpWUmJiSkqKnn5aSpauwpqKWk62fpZKUoZukpp+UmqWmoZqjn62aoJ6dkJaboZ2cpZWdlpmin5WYlpKahax7d6h2o46Jh6lvrYqCp4OYmKGJkpqKon+TmYmuhX+Cs1xys1KufYOCpH9x1314hX2OnoaZmnevhoqRnIh4s2GaZZqBgpRsklqwWEuadZh5ZmCtX3d3h2iYiGter3eVno94bDV5yK6yX0JUb15nYEVQbV9wbVZVTS5lY2lTWVE7QkRBTDo1PzkxPTwxNj85OEA9OkM6Rzs8Pzo+PkU5LUVVSkVAQzpNS0pCSEc+R0s5Nzw0Njo+LzA0MzMzLjIuLjE4Ki4zMiUhMDM3Njc9UGtlPiZWZ1xAPlZfY042R0NgSTk4OJ+dlKC4sJe0wa2os6ipsrq3s7i/ubeytby1pbezn7Ssn5+oq5+Vp7arqLGxq620pJupoKCoobanpqqjmZ6VpaGUk5uZkpSipZqSkKasr6aglZmpn6KPkaKZqKWglZqlqJ2cpJ6tnaGdoI2UnpudoZiZnJaWoqCTmJCmnYapfX2leKGPjoOqcK2LgaeGlZ+hiJeXiKOCkYiUqnyAi515b7FaqIKCiKB5dNh/dodzp4GOm42SpHyWkJ+Ee7JenGSgfoOVbJJcq1tak3+Rf2hnqmRye4FrmIdzXaxaiaCOa29lT0pDoVxbTHRdYmZNW2FfcnRfSlY2SpuTWEhFPUhGQU0zNUE4Ljs+MDVBNzhAPDY9PEY/Ojw2Pz1CNy5IVkpFQUg2S0lOQElLQEVOOjpANC47PjAwMjE0NCsqMDUvNywmMjEoJCQ2NjcxPFBlZUEmVWZbPzJVX2JMN0ZJX0MxPzihnZmZv6uXtMKuq62pprSwt7C1v7m5srC3vKm6tJ+wpJ6lp6eek6qwqbCptayrr6GYoaCmpaS6oqOroJebkaKglZSempSYnqCPjYuor6+mnZabqKafjJKkl6irp5SXqaeen6CjraShnqGNlaGZn6CSnZeclZ6hlZaOq5uPrm1ytHKpjHaKpnO0eHOzgJGkopGcjYmkh5B3uG+Me4uia2u2WqCFZZeXaaGip22TcrR0k5h/smqFkoita3WzYZ1mom+HkmqXXK1gTaF8h5FSc6Nten9+b5iHcVyvVjycd2VUb24uXKdPY1JrZWJtWmNdYHB7Y1RaUT4+bW8zQkJAP005ITdANi47QDM3QzU4Pz8zOzxDREJKRk1JRjYySlRLRUJJNklKUD9ITkNGUD08RTUwOzwwMTAvNzUsKyw0MjYvIzAwLCwdMjg5LzlOYGVEJ1VkWT4vVV5hTDVGTV44MUM4pZqbnbqhnLLArq2rq6e3qbivtcC1vLCvubirwbapqqCbpqShnZGqqqi2o7Kor6qgl5ynoKSruJ2jrZuWmY+lo5WNnaGbmJyfkJOUq7Wwp5mUnKyql4yTpZmlraKRlqqxo6Cep6uwmKGjkJmil5+blpyXoZOcqpyUkKuZh9SSmrtzsMOAw4Z+1ZabuHiHkJeMmIqMp4h6o7Z1fXd2woKasmCDunnAfHW4YrWBjIepfZaBrKlxe391vIinoGmdYaaOr6F+jHSHqn2+bnO8dLKDdXiBi26aiHFujaR0vV53fVthebxrWlZbanpeamFmZ2Jtd29ZW1lDQUByP0NHKzVIIic7PzEwPD83OkI5OT1DNDxATlpeYGBfX19aUFBSS0VGSjRITFJASk5FRk9CPEU4ND05MDIwLjg3LSouLzE4MCItMSwzHiw8OjA4TFhhRidUY1g8L1ReYEs1O0xbLTZBOaeanqG8opexw7Ctqqqssae4r7bFsbqxrruwrsGyrKSinqOhnJuRqaSqsqS1pq2kn5aaqpmmrLido66YlaGQpaCSjJyjnpedmpCVkq+5sayVl6Onp5SRlqSdpK2dkKCoq5+bn6mjs56jpY6nopWimpyXlaOYj7CgkpSqnoWQmbWAkJGMt5V4gpOatXdta25zbnmPhI6JdJ7Bu72ae4GyqHCAdJG4g3yGhoyGjXuLho2XfKS7ub2cdXq0o3R2l3V0sHWZnmaGaY22dHJwd7aMXoB6fYpog3lueWOLrHB1hX9ZW6dqRWRZU2ZgY11jUWdmcW11Qk1QTUQ7Wk0+SjM8MCA4PjsuMz1BOTk/PTs8QzZCVFlaWltbWlteYGJgXVNHR0g0RElUQktOR0VPRj9HPDc/NzA3MC85Oi4sLy0qOC8lJjIoNCQoPjcvN0xUX0cnU2JWOCpPXV09KzpWVic+OzynnqCgv6WWtMO0rKunrKupu66wxq+1s663p7S4ramioaWeoJ2ZlKukraqmtainn5uWoKOerKS+p6Gql5SdkKKbkY+iqKGTnZeTl5SytbetmJ2jpKKLkpGmnKarm5aopKWcmqGopqejqaGRrZ6XpJ6Xl5edno+wqJScp6KOan5pnKZ4h3N9mo90emWHer2+wLpvkoJxlYdfcmpaXpqJYWOIjpVrYH+VY22dd2KVa4CalZRlXmBjcZuKaXKMfYaVZ2p+cnR4fX1iW3d0gWhQXG6EfXuLa1hse4JzSUpvhnBOdU1FV11mYExbWGdjX09bbXVpcVJQREVOPEhJPUw/MiwyQT84LzU/Qzw5O0A7PUM+UlZWV1laW1xcXWBhYWFgXFVHNURGVUVKT0hGUElJSDs4PTUxOi4wOzouMC03Nj01JiIvKjIsJTs4LTdKUl9JJ1NgVjQpUF5MKDM9W08nPzI+qJ+oocGjm7S6tqOspa6nqLWxrMisr7OrtaO+sbKnoKKpnaKbmpmspq6kpbWppZuYlaGbp62pvqipppWUnJWgmpKXpKmokJ2Rj5ecsLK/rJunnaeiiZORqZuppJubq6CjmZqjp6yjn6uimrCblaeglpWdn52XsaSYoaiZnJGdnKOjmaaimpyampmPloFnbX1xd5KXlJGFirWqjYaYlY+KjJiXh5SVioSSlJGJjpKUmJSYl5qgopqclKGdjYJ6pYZsanyQfIB0iYqBcYJ4eXZ2i4B7imtzgXSDdWR3fXdrcHttYGNdcGdNWVlmamBXWnB6bmxmU09GUzlPWk1STygrOktCNjM1PUBBOTpDPjxFTlNTVFZXWFlaXF1gYmJhX15eW1RLQ1NHS05ER1BMT0k8OjszODksMjs4MjApNklSTzgiKSsvMiM0Oyo3Rk9bSiZSXlMxMFReOis9OFxLLDwuQLOgs6K/oaOxsregqaWyp6WwtarJq6yxpbWmwKi0oZ2kpZyjlZagqqaso6O3q5+Zlpafl62qpsGfrKSVkpyXnpiTlKKfnqKmk5GZqKeyxK+aq5yqn4+Wlqmeq5ycoKyYoZucoqSvp6KlqJ6umJennZmaoZ6enLCgnKKmlZiTmJOgoZWjnpegjpaTioqNjpatj3yVm4KSgouqqIaBmJaKhI+fiHuEkIeFmZKIhoqVj5uXjZCXnqOWmpORnY1+jmahs6+FioR2epCKfHZ5em9mepGBgIlrdYF5iHJoc396doOIgmt0ZHlmYGplY2Rma1lre3BpalxTTFBEX1VFQD8/LDRARjs0NTs+QTs8Pz4+SE5OT1BTVVZWWFpcX2FjYV9eXl1eXVhWSktMQklPTVJKOzw6Nzg2LzI5NjQuKCYkLTEuLykrKjclKzwoNkNNTUQvVF1RMDVNWzE3RTRcRzU8LEC0oLmvvqyrrrKyoKqmsa2irLOwxbCqrKOzrryktJyfpaKhnZmXqKWppqSls7WelZSdmZmwpq6+oKyikJGempmTkZWhnJeonISeqauis8izn6qjqpeWl5qnnaibnqSrk56fnaCpr6qmo6uirZufoKGZpJ6cnp2vo5ieqJOYl5yRpJmYqJ2al2WCknxlfo2Zj2N5jWxoa3qRpKtrZZqYfmeFimVlaWh7jqGPa2iNl5GjeGtqi5ijnphzbG56hI2HelhlXoWCXmyLioB2XGhzd3eSgIeCbniCeIBzbXmEdHeJiI6De2mGWV5rdGRdc4lpanxxbGNeUk5XSmRYQUo0PUY3P0ZENzE8PT9BRDs7REdISElMTlBSUlRXW15gYWFgXV1dXV5fXVpVT0RIT0tTTj0+PT02NTM1NTU0KiYmJSwqJS8qKyc2KiQ7Jy9BSltKLzdaTzYpRVkvRE8xWUM7Py49pZ+6vLmvrLOwqqWora2wp66tsL2xqaekra+wn62Xn6OdoZqZp6ucraOlqKmyrp6Vo5Cir6a3uaWuo46OmqGZkpKboJmZpZV7payiqLTEuKShp66fnpWeo56jnKOqqJKeoZ2gqrCqq6OqoKmbpp+ooayWoZulsKSXnKuVoZ6bkqWXnqqYnn69g4dytHKEnYataHi5xLhxk6Kje6aYmXOqgnzLwMC7cYuiiIKffZWYiZ7AvYKWnZ2NncLBe4J7ko2aw8B9aqWxb4yBb8p6f5t3koOOgXZ6gYB5cXp/h3F4hY2TeW13lGNmX3hkYGWCY150Z21kYlhMVklRWkhPRDJJRT9EQj4vPD8+QEE6OERDQkNFSElLTU5QU1ZZXl9fYF9eXl5eX19fXVxTTVBHVU5BPz89NjQ2ODI3NiomJSMpKiYuKyopMTAfOSojPklbTCojQlAvI0ZbM1BZL1VBQjsvOJajuMO1sK/AqaiUo6+psK6tprK1r6mlpqawq6CrmJqin5ybqqeinKyjpailpLSknaKSpq6ruLOnr6KRkZqdpZKRoKGXm5+dh6arpKutwMCwoKmvqZeSn52imaGjqqOToKGdna2uqaymo6OnoaWmnq2pkqSbqa2pm52qnKyhlpellqGjl5x/zpR4eqSBeZWWm1+uj16Op4GioHynlZt0q4OAr15jjap6p4eFoHSXk4izY4KrhqCOjbNqhK50fZeHuGGDrVmjzW6QdXvae3+ZcH6IknZ+ZXuIdnZrfYhufoWRkn5tgo9gcWtwZ2BfeWRccWhqY2ZgUlRSV15LT0M1QUhFRDk+NjtAP0E7PThAPj8/QkRERklKTE5QUk9TXF5fX15dXV9gYF9fXVpXT1VKPT8+PDU1NzgxNjQoJyQhJywmJi8oJiszHTYwJDc7U0wrLC1KMCc7XDtMLSFQQEY0LjGtwr+/tbSwt5edkaSqqK2zq6WyrKyrpKunr6qgp5uZpJecoq+foJ6op6OloZ6wrJuelaeurbGqqKyglJKbn6WTj5+ll52no56tpKqwqMDGs6ipsa6Wkp2copefqaqflKGfnJ2tr6erqZynqKSiq5KttJemoqqpnaOmpaGwoJKap5qgmpSUkZegcYWMl3SEqIdxsXydcax+oZ6BpY+ed6qCfa1/nHKtfquHhp92mJJ6fJd+qoiijJGMnX6re4mUj5+Ae61WnMR6j2+SwX2BlW11cIxtZXZlhm9hd25yb4qLkpCDbZGRZXB0dXBgZ21lYG9paW5mY1dTXWFZUlNDOUpJQEQ8PjxARkRDRUE9PDw8PkBAQUJFRkdFQENJU1dZWlxdXl5cXl9hX15eXVtaUkM+OzkxNDc4NDUyJiMfHCAxJyAxJyAnNB41LSY3PVdKLTwnPjEpM1ZARiEcRzpDMS4rsNTGxrK0n52jjqOjoayvtq6psaeoqqetq6unoqOdmaKVoKarn6GloKioop+dsKyYmpaop6+sqKepnpeUmqOikZShrZudpqOvrKOrtKq6zbKtpq6slpScnaKZn66snZagmZ2fqbKpqqqbrKuko6ybsLGiqKyupZimqqmpsaKSlqOlmpSShKRqpHWJeql0erJwgqWJmYxxiKCah6RgYFKrhH+ug5t2roGmhoafepmWhntmgKOJpJmFgqN9qX6BlYeuX3yoVZ2ikoF6op+Ae8OvxYxzr7OzuXFiqa/CdGiNjZiPgW2ak3BueXh3b2xmZWVycGZ8aWJdV2BpWFhVTE1RTENDQUI7Q0BAQkk8PTo5Ojw9Pj4/QT04NjtETFBSVFZYW15eXVxeYGFgX15dXF1bU0lCNjc5OTY3NCwmJCIgKCciKy0iJC4hMy0mQERXSCxHKzU2KjFQS0wjIEE5RDQsJ8PJ1tW/oZmrp6Gvop6wtLCvqa2ip6aqq6uppKagm6WfnKanpqOcrJqirKGkn6+inZqSqqS1sK6gqZudlpSnpJCaoqigoKWcsaajp7GstsiytaqsqpWRnZyimaCls52aoJScn6esq6Sumq2qo6KrorOuoqqzsaGaqaiur7ajk5ajp5ibkXyqbJ6Eh3WreXywb4KkiomflpWflIHSuLS4yYCBsl9flKmDpIiHoHmYlZp4qsl0maOVp6mQk5qMf5uKmsbGeGWhgqVzgZ+Ogn2vXnC1Y7F1S6OGbadHgpNkj5Ceknxwl5OAcXt1fXtuW2Zqc3FmgWpfYVlkbVxeWUlOTUtFREFCPkE8Qj9KOzc5Nzk5Ojs7OzMuNjxBRklMTU9RU1daW1tbXV5fXl9fXlxcXFxcWE1CNzU3ODUvKSglJiUkJiksNEVOUFBNRktKVkYqTDAvPi01T1RRHRw7PEYyLCSnpMHGuK2psq2spaKcsrmsqqGmm6ilqquqp6CmpZiqo5+uq52moKyanqmlnae2n6KXk6iqtrKsm6acoJWQpayRmZyno5+ppq6ho6epsLTCsrOqraiTiZedpJqho6+ml6GUmJylpqubsJ6uqKafrKO3raGyua+dm66nsrOzpJSXp6OZn46CnU54moF/n3qDo32DpISHp5+cnpOEuHt8ebmCfszGwrZ4m6GRi599mpaWinaemIqkmKOofrCFnYWfhKx9mpRhpWyjcI+FkIF9l4NyrGCkc3GAmmC8fVJVdY6SpJd8fZOSi3V6c4V/cVxtb3hyaoJvWmRfaG5jZF1LTVFUQklIRkk6OUs+QjEwODg2Njg3Ny0qNT09P0JER0lMTlBUVlhZWltcX19eXV9fXFpaWllVU09IQDg4Mi4sKi4rKicmP1FUVldXV1lYWFdVT1VGPEUzOlBbVBwbNj9ILC0gi4eZqaukq7irr6Cboayzs6afoJWmrq2uqqedpqabo6egsq6iqaayoJmqpJSjtqKilZeiqbS4pJyinaKTkKGxmZ6cp6Whoq+unaSoobayw7Gtqa2pkYeQnKecoqScpZadmJmapqSpmq+irqWmmK+lvK2ht7etnp21sriws6aYna+ho56Fj9G1w7d5h46FkZOQgaZ4lKJ3jKCRhKWBinGqhoS0bnJqmaOblYqffJiZhoePc6+CpZuijaaLk52JlZCabXCyXKVzk3qcbJl/e5l9bqlho3Fxf59ic7K4aHiPlKaZfoyNk4x4fXmOgm1peGp5c26AdF1kZG5tZmdgSltZWDxIR0BVM0BGPjwqKDYzLjAxMykmNDo7PD0+QENFSUtOUFJUVldXWV1fX15eYGBdW1paWFVSUlFGOjIyMzAvKysoQFFSVFVUU1RWV1dYWFdVVlZUUU9RW1UlITJBSCQpJZNzjYqtv7+7urWelqekrbWho5mVo6mnrqqrmaain6ahoLWno6mnsKOUrKOOpK2jnZCamqq0tKSdpJyokZSXrqCgnqajnKectJqhqqO2q8OwqaupoYyEjpyhoKailZqam5ibmaakppisqK6jpZutp76slL2wrJ+isLK5q7OnmqixpKeYeqiQfXywd4qBpKWInG2yb6GHrXyhjoOolZiArIiFroWflKmgoZaGn4CZlYB7kn6rgJ2alouqeJ2gj4mUkoB5r12jgXymp2SdgHyXdGuvXaVrcIWZXWBbjKBtlZKnmYOUjZeMe3uDl39rbH9jfnVtgHpgZ2VxbmhnaENaYVs9S1QzVThCQkM3JCQzKycnMywgLzY2NzQzNTlAQ0ZJS01OUVNTU1ZaXV9hYGFhYV1dW1pYU1BPTkk4MDUyLiosQVRWVlZUVFVVVVVUVFVUU1RWVldYVlVVUUhGSUojKCi9kpqEqcbCtsG0n5qsoK64paOOm6Sin7Cvqp+kn52tmZ64oKOroK+pmq6hkKuppJaJmo+usKynn6earJeYj6yioZ2loZqknK2Yn6imtqnAr6WppJ+LgI6bmp+mnpKVmpqUmpqmpKSaqayspKWgqqi/pZfDrKqioauyuaqup6CzrqipmHavfpCLnIWHfLquiphlsIxlla19oY+DppWagayKhLCFpZmkoaGRhaBbbGqBs2B/rXt7goGxbGdvmZeMiLFbfbRbpINryKJln4B7u1l2tVqyfVKvgHqsWIChbpiQqJuLl5GXl3x5j51+ZHN+YoR4dIB8YWpncW1mZWVPVWRcQlVfPkooPjk9NCEiLCUfMi4gKjEvMDQ1Nzk5PEFDRkhKTE5QUFJUV1peYF9gYWJeX1xbWFVQTkpGQzU1My4vQFVaWFdYV1hYV1dYV1ZXV1dXWFdXWFlaWltcWFdXR0I70p+zsre9u7TBs6ObrKaltqigi5qgn5yzs6mfo5+dtZigs6iqq56vrZ6sm5WvqaKOiJuOr6yop6Knma6SmY+omaKdpZ+Zo6KlmZ+jqrKpva+lqJ6djn2Lm5WgoJmQkpqbkZqYqaChmaiup6amo6Wpu5+gxqelqaGrtLWsrqaeu62srJWAqZKjr46bgIekl5iQgYC4w7qDjpyThKeWnIKsioKviKabm6WqkX7VvcKqYqO/vX1+o4KD17q4tYWUk4Oevb6EaqOBb6uEbZ1/erKwx4Nqq7C9rHh3or68dIGWjqeckJuRmJ16gpGbemN9e2SNZ3mCe2BrZWtqYlBhW1NqXEBVYUNOKj06NC8eHyQeJTIgHSQoMDQ5NjY3Nzs+QUNGR0pLTU5OUVRXXWFcX19hXmBbXFlUUU1IQz88QT81PVNZWFhZWVpZWlpZWFdXWFlaWllZWFlbW11dXFpWWFRXWruVs7Sxv7mxvbKina6mpbKmnYyYpb+quLGoob+mprKcnrGcuaiera+lp5SUsKyXjIObka6mo6yhpJypn5iLo5KmnqecmqCoopieoKytqrmuqKObl5J7h5mRppuTj5GYmI+YlKmaoJipqaGqp6Giq7ueqcWjoK+jqrO0qq+poLqnrq6ac3WqpLeGZYmgcGetj4qPbW94pI+Zn4F1rpmVcI+LcZWoo5uXrqRybW1tZYp4b22CmXGBempxaWeJlpWYcWlphIZncIZkXYljam9ZXWd+d6ZgYnGOkW9mZICNk4+imJiZkpeffYePlXZmh3hojmt5f3lkbGNmbGJLZFdKbFk6UWVFUidLOisjHCAaIywpGBsYLTIuNTo0NTc6PD9BQkRFSEtMTU9RU1ZdV1pcYGBhXV1bVFBMSEQ9OkFCN01YWlpZWVpZWFhZWFdXVldZXV5eXVxcXF1eXV5dW1tVV16pla2zqbm5srOqqaGunqOyqZiSvrLDyL62qp7Aq6yjoKesn7qjpK2sraaNl66pkIyFlZatnqaroZ+jo6CRi6SSp5momZajqaCWnKamqK+6rKyam5OSe4SWjaWYjZGSmJSOmJWolZ+YqaObsaeeo6y6n7DBp6Szpqywsaqtq6e4o623loqgqKW2nYmWopiHqZqQlJ2TqrOZm6OroLGWoaGdn6KcoKShlaunjZOSjIeSnJyUkJqTmJGOlYWBpJmXlY2Lk5KKj4aEfWeKf3SCdnSHjHGnbXuUkZSSgYGOkJCPnZShlpmXooOIlY1yaZB3cIt4d3x6amxkY29kVWBYQGlbSGNhT1orRj0rJyE3NDAuHxwhJTIoKjY5OTQ2OTs+P0FCREZKS0tNUFBRWFVWWV5gYWNcXlVRSkVEPjk9QEFTWFtcWVdYWFhYWFlYWFpbW1xeX19gXl5eX19gYGBfWVlgpZapqqW1tq6uorCkrZ+gtbGQjqzGvcS7uKqipZ6bpp6wqKO2p52ptaaokZisoouIiY+cp5aspaCZp56ek5WjlqiaqJmUpqGjkJuomaG1u6irmZqQjXyBlIuhlIqVkpWQkJSXpZCfmqqgnLajnqist6euwa6jt6evr7CsqamyuKCuvJmRpaSmtqKSnaafjamfjZKfo6yvm6GjsKivl6OgnKOpnp6dnJarnZKZoZuUkJaqmY2ZmZaQlp6RiaCdlZSFkoyQjZSKgH1mi4Z1hnZ5iINznGqGkJSUkIl9jJaSkpeToZOdl6KEiZmHenKWc3qKf3J8f2pvZF5wamFbX1luY1BgZVBaOkdHRT4yPT43LysmKykmHSY0MDY2NTg6PT0/QUFDSUpHSktMTVNTU1VaYGBpYGVVUEpBQ0I6OUVNVlteXltaXFtbW1xdXV9fXV5fYGFhYmFhYWBiYmJkYlxbY5eVpKijsLOsrqOpp62gp7WqkJCdpbO7r6ysoqOaep2isaSlsKmWm7imo5OZqpyOhoqJnKOQrp+jlaefoJKWmJuuiqqWj6iZp4yZqI+fubalppmcjYl5gpOLmpOKlZKUkI2Sl6KNnp6pnp+4pICEr7WisK91pL6jsqB3eaCqsbuUdayknomAqn9kXGJ2oI6knoSXfm6Ts52jp62qo2Wdn5JzeZmXcICYqJdsf6KoimWcpZyRl5iWjJKckIadmpCVg5KGj46SiYR3ao6HdoZxfIaAgGFpiIqUkotadpWRaGiPjnJ6ppqZZXmZh4J4mGqDioNveYBrcWVfdnBsa2hcZmViYnBTXD5OTk5TRz5AVEM6MS8eHyY0OjMxNjY3ODw7PkBBQkZIQkdGSUtNVFRVWV1gaGZnV1FKPERHOzhVUltgYWJgXmBfYGFhX1xdX19fYWFiY2RhYmFhZWRjaGReXWablaajoa+xrKuppamuo6etpZKWq7awsqaaqqerl3OMnbCfqKunk5e5oKCPnKSdkX+IiJuejauaopSnoZ6Ol5GehXWuj4immqiRl6SJnLq0qKCZmIuJdXeTjZaTipSRkJSMkJOgjpugp5mcspaAjJy1nbOMko+8p6B+p6J6oq63gY6Opp6Di4aQsamvjIqWo5p5gYushpydoqepp4eVhZh3pZt6h5uBl6aCgnucsXqKhaCXmZSYlYKRl5aEmpljeYeQhI6PkYqDbXCPh3mAcYCBhX+GdIaElZJ4lmiSdKCadH2ZhKGeh5h/k4qDg5lrjo2FbHh7cXFnZHhvamxqW2VramZ0XF9JVExRQEU1LllVVTcpITA5PT42NDM1Njg7Oj0+PkBESUBKRUpLR1NYWllbYWBoZllRSDlFTDs+YlZeYmRlZGBhYWBiYl9dYGFhYmJiY2ZnY2JhYGVkY2djYWFonJejn6aurquorKCosaanqqWZlK7IvrChlqaptZ6QhJ2snKeioI2Qvp6ajZ+aoJB9ho+Zl4isnKGWn6CRjZOIhoCRqI2Hopyjk5eehp+6sqeem5KOhXB1kImVkIqUj4+bi4+Sn5KXoKSWnqyIn7SJtJqtisqHqq6It4WMr4KwroOpjaWYjZ18qI9ye3ecj6eWaJWkebSLn56mqJKYwoF/q4iYoXGegJmkfZeFlbGAoXyhlKCQmJaAjpObipiRi3yFkoaNlJKJg21zkIV/enKGgYR8hHWEgZeAj8Vmf6mHj6NrnoOim4SagY2OhYqZcY6ThWh3dHx3aGh1cWdoa15kcG1nbVhoR11STTJFNDZOYWM3JjM8REdEOTY0NjU4Ozg+PT0+Qkw/TklKTENQWl1cV2FdamxcUUU9S01ASmRZXWNmaGdiYmJiY2NgX2JhYmNjY2VpaWNiYmJlY2FmY2JiaZSXop+wqKmopaugpLmxqqummpSgo6Sqo5alqrejr4Chp5ylnp2JlL2ak42hkZ2QeYSWlpGIq5mbm5mhhY+Mdpucj5+QiJ6km5WZmIejua6kmZyMjH5ibY+Lk5CNkIyNmIuQkp+PlKChmaGofqGnh62doJatj56cnZGFgKCNqq6Go42pmYyafqJ1gJmUa4KsdU2reIeNnZGbqKeAqat9g6F7eqdpnn+Sa2eXhpe2iZ59bmBkWYOWf4x7ZGiLcpl9eZVsXXuWbV9TcINcX2t5g2BZZYJ9g4CXcKeqa4OjbnKlcJ+En2lmoG1bbop8Zlpgg39iV1Bvd2ZtdHJram9eanBtbGpYaU9dWEY5QTRHRF9rNCxJQ1FNTj04NDg1OTs2QDs7PUFPPlFSTE1CSlxdX1deXmJ2YE1EOk1PTVRiXFxmZmlpYmJkYmRkYmFiYGNkY2FjaWtkYmRkZ2RiZ2VhY2iXlp2guaGqo6askaG2vKyuo5mXoKKlrK2hna61o6iSoaCgppuZjZi0mZCLn4yVjHWBlJKMiqaWlZienn+ShYWspIebkIqYqZiZmpKIprGnopWaiImAaW6IiIuOjoqLjZKLkJKijJSeoJyipX+TgY+joZSgd5yWj6eDoad/hqmshKV4inyEmn2icHOUiJZ7nox5bYecjJmQm6iaj4ede4Kic3amZp5+dqRfmHp9knOibpi3tLp0koeCf7WoZIHGuHtwlbeLcYCapGNzrKtgfWqds35ufIaCjoKLmHF/o2xyo3OehICkYJ2Zs5ZxfJeftHRzW56yg2pib3R2cmhvWGtsc3NmXWleYktFPUQ1UUFacjI9U0dfSlI9PDM5NTo6NkQ7O0BJUT9VTU5RQEVfXltZWGBgfGRIQzhMV1VWYmFaZmZra2JiZWFkY2BhYmBkZF9gY2tuY2NkZGhkYmdmY2holJaVo7iZq5yToI2kt7WuraCbopyjo6atnJuxrayTl6GZoaSZmpSeq5uLiZJ4i4ZwgJaNiY+hkJKUnZd9kImOqKCHmI6KkaOTnJuNjKmopZ6QloeEfmt7h399kI2Di5CQiY+UoIOXnqCdoJ+LiXecmKKMn3Khi4eoiJulj5anqn6tjH56oJl6o5N4gXSWiI2cfZagh5uOmZumhqJkoXyIlpCbjWyeaJuNbpqZe4CKp31yaHSrg52DdKpolZpdm4V2hJ1oqmqAuGZcqHCBnGGVjF6ndnaIiX+eaJp1hpOSl45/n26akG2nml2pfni7a36qW46EXbRnXG5yeXhraVxxanl5Y2BmWGJBUUVPN1ZDUm40S1paX05aREAxNTE7OzdIPzpDSFU/WVJZXT5EYl5WYFFhY31pRUI5TltdWGRmWGZnbm1iYmVfYmFfX2BgZWNeYmRvcV9kZWVrZWNpaGdraZWciaq1m6eJY5Sbq7qysKydppycqJ+erpuesKisnZekmqGfmJaWoKOZhomNaoiAcnuXiIuWloSRlJiPeoqElqOdipSPhouekp2ciZCpo6CajJGKgIBpgIZ5f5eMe4iOjoiPlpp/k6KfoKGTmHJon4qfj4xwkoyBqYeYnqKnn6d8r62joriXd6OzoqSAiJR5nXurmn+ijp2bl4iXcaF8hY2vtX1rmpGheH6YtKOjq6iEmXybfZ2ZfnSqWl1ve5aLeJ5iTH56eoVjeZdCTJ5ZompxfI5tgYmEmXWbeIaJsbN/f5uTp3aCnW5zfZRvmXNrpF2VdkhlY2BzcX5/bmZgbGl2e2RlYlJeV11VV0BZRlFnRFNXW2JYXklEPUI4P0E6SUU4TEVXQVZRW1ZERmJcWmBLYG1+cUVDPFVfYlplalZnaG1vYmZnXmFhXF1eYWhiX2VjdmxeZWdma2RmbGloa2mTnYGxrZmEVF6gprO5s7OpmqKMnKucnKmUoaukoqiPn56dmpmVmKCdloiHiXeFgW55lYWQm4t8kZOWiHJ/iJKhm3ORkIGJmZWgm4WOqZyalYuLinyEbISFcYKhjHiFjYiIkpiVfJOjoZ6iiK6GfbWEjp6ce6WWeqmBlZyPiqCcfKdod21+mXShc3F8noaZcJODrn2kg6aemoCjb16oZ3WjY2+lYZzTkHx7mXhyc2OihZB+o3Ojj3VrkLOMYIKYiXOqsqi8f3eDbX6+pqm0XpxufXGXboBzonJdpGdzpmFopm2b1Jl9hZtweXqXa5t7eJdzbqmkZ2BleXCAhGtnZmRudndnYGNTW2ZRUWJJV0lUYFdTW2VqXGVRRkNLTUpLQkpFOFBAUU5XUllPU1FgZmVpU2N3eXdJRkVjXmVaaGlUaWhqb2NqZ2BjYFxdXV9oYmFoZXxkXmRnZGtkam1naGxol5t/satUXEt+qa+xtLCzo5uZhZmooKCkjqSooJipipmYmJOZk5KgmI6IhntwfYRofY+DlJqBd5GOj4lvf4aPk5Jsl5N8iJGSpJaDjqqalJKLhYl5g3eIgG6Cn4d3gJOGiJmil3uUoqSan4mzoaK2i3qsp6SupXCogJqQhYCbkXukgKGZhphynoSjrq+Kl4yAjKSNloOuoZR2tbW1yaFzlIqBn2Cdl6lteZWGoJt1oYd3oH6Sl4qAb0xmo5Jwm4dypHt5dGGDgmt+oGtxZGCccn50l2l6abO1tMamc5h+ep1rnJurdYSbbXV3mGmaenWYclBFfbReanZreYhmamhidHVwblZeVFlpUFNoSVVMWVNVXWhrblZnV01LQUpNS0hKTkFRS1BlY2ltZXVzc395fG51iXt7VFBObF5oW2tpUmpoaWxnbGZjZV9cXVxeaWJkaWt7X11kaGNqZm9tZWlsZaGciK+mhGY/lKGzq6+vtqKikICXqaKipYylp52dpoKal5aNl5CPnJOOiIN5anmGZYOMf5egeXWPiYyBaYSFkoOMhZ2NeoyKlaaTg5epmIyRi4GJeoB9i3lwkKGGeYGVh4mWoJZ/lKWonJaWhGZueJxsomR8caV3m5hwZ6aAlot7pHqfloOXcp52gYqUlo+5bpCKomJ9maGViG1yaatqdaBtbqZfmmmLkGiWh5qVdaKAfZpgjIaMdG+IYmigZZ5+aZp1b2NmiIJtcqJaX1tjoW1diYxve35zcmSlbXeiZGenaJlzjJlvom9TiZBvoF9lqFSLXlSYbm1za3KCbXBpa3lza29SWVdXZlpTbUlYT11JWGloc2pZa1ZRUkVWXExYUmFVaGpfd3R6fXB8fHKDe39zdo2AhHZeUXJiZ2JwZ1BqaGhrbG5oZGdfXV5dYGtjaml2dV1cY2ljampzbGZrbWOcpJimemV0bYunrqSpsLGmn4uAl6udn6WMoqGaoqKAlpiTjZqPi5iQjop7hnGAiGiLi3yYm3N0iX2Qe2SCh5WKiZWZgnyIhpaokIGirJGGkIqCin6AgI5zaI+lhH2GlI2JmKCOiJOqp52JpniWm3+kiJaMspiekIKvl5+ld5SHeal0pI6Emm6kooyShIyDu259pa+ChoaGk5acn3ylenGolaCWZp5+b6tjloqVkneobKmigYl1h4J3q5Gmh2qRsGt2s4ypa4qGbW2fnpKVYX+ri6p2f3+MpZ52n32EpJWdoGqbiHesZ5+tjbZ0d76NpJNZg6aNq2F1cnRwfHRxY2p+bmhsU1ZbVmFiXWtNXVJdSV1tbXZgW3FZXGBaZ3Rlbm9xY3F0YHh6fnlyeYNzhH6Ae3uMgYKAdmJ4ZGNtc2RSa2dob2xyamZpYV9eXGJrYm1se29cXGJpYmxqd21nbG5ilaWqnYGAnqSWqaqdqKeupJmJg5irmp6kiZqlnamdhYyajoackYWSjYyNdIZ6iIRvjYR+mJN0dIZykoNtf4uSh4aTj3x7gYWYpo5/paaOgY6JhZV2goeSb2yLqYGDi5SOiZyfiY2Uq6Ogj4B1lJaIfoF5lK6jf4GbcY+FeI+Kg357cqaMcX19epeWm4SOeHt+foeUlZOKdpCYn6CDen2Ja4yFW3l4cnpwaG5+kolxf3SCj5STcYWDgmWMf16Bf4t3dXOUdW95bm6HbYSFXnZoeI5lgIGFjqmbfXR8lmqJiG+Adn2Gdm1tZ4xzeXuYeIVba1h5j2lud3Jxb3h4cF1shm5qZ1ZaYFddZWtjVmFVX1FfcHh5bGt2ZWpranZ8cXJ0c2FvdWJ0e4F4dXqDdoCAf4B4i4WDfXttf2xkeG5eV25naHVreGppamRcYFpjamVscXVuWltia2RsbHltaGxvYY6UuKimi6GimqakmaWcq6KhhISYrJKeoYmappupmIOBm4p+lpOHjoqJjXKDfI99fo+Fe5eOc3KEcJWFe32Si4aGkIV4fn+GmaSOfKehi4aQkIWWg4aOmHdyhamGjpKdkIienoiMm6ifoKqDiY2Umn5+iZatqI+Spo93b52RgnmRb32ohXB9lXFrcH2Bn4x/k46MaG1dg4uMnJuejnOVi4hxdGuBdnSBWXJuh5GBfX6Mal1qZHqFg4iAX2l4ept7gouCdYGGgmd3ioZrYXBygnZfcouBiY+mlYVmjI+DbneLhHGGj3pwZmdke4N6lltcamdudlt7eXd1bnNzgmZcbYprbGNZWV5bWWxxXF9hWl5dZnR+e3VvdGNra2p7fXJ7eHRkbXRobXx+dnp8fHp6gIB+b4aKhHt9c355c39pVFxxaWx1b3Vna2hkXWFYa2hsa3FybVdbZW1sZ3N5b2hqbWCLi6mwoZCjoZqenpiemaijon6DmK2Nn5WIm6KRpZV/e5iEfJKZiYiGh4pzfYCLdoWLgYSWinFvgHKYhoR+k4SDhoqBeoCDi5ugkIKnooh4jpiJlYuLnZeFg3qtgpGYmZSKnp2HiKGrn6Kio4uHk5uco5mWqqGnpqCSm4eVjXt3jY6Ep35/kpGSk5yyppuVnpCNspOYhKWMjJWbn4mQm4KIkYprfI13eGWChpCKfImdhIeLkIiIgIWEkHd8eXSaoYiGiZ6KhJR+fYuBgXVwc4WDf3eHh4qQppGEhY2Hg42QjH2Ii4mQgndsgoR9eplqcmhhdIpwfXp3dm92dIFdXm+HaG9gXlpcXVNoclVjXFxhbGh1fHxzb3Bka2ppf3xueX9xaXBwbGaAe3KCgHh/fX+Fe22CjIZ8enh8fXqDeU5kdmpybXB6ZGtlYmJgW3RmcGZycW1VXWx0bWl5enFnaWtljIeduZ6XoqGYlZmYlJmkoZ58f5qrjp6NhqCci56WfXmUg3uOmYmGhISGbniAgHKBh36JlIRta356l4eEg5B/gIaEhn2Gg46bnZKHq5+DcoqQhpORjJ2RfY16qoSNkpiWj5yXh4abpp+imp2Gg5GamZmQmqagpZ2dkJaAkIp2e4eOhKV7fI6QkYaYqqGdk52PjaqOkYCejImTmp6Cjpd+ho6Db3eFcXVhfoKPhnWLmICDj4KGhX6Fg5RteHV0kqKKjIWZhYSNdICJfH1ycnuHhHt4i46EkqaPhoOPgYSKiop3hoiKjHxva36BfG5obG1nXnp/aH17dnR2dXt3XGBwfW51YGNbXV5RZ25UZVteYWtpdnp+cWxsZGtqaICAbHOBbGx0b3lvhXlth4B2goB+hXZxgo2Ifnt7fH97gopgaXtqdWhpgmVqY2BpXGR1aG9idG1sVWNxeWVwenpyZWptbYuJnreaoaSfkpGWl4uan5+ee3iep5GcioellIuYmXl6jIV8iZGDjIKCgm58f3hzgYV9i5F9a2h9gpiJgYiOfH6GhId9j4GQm5uRiKedf3CLi4yTh6GhioWNfKiRiJCSl5OWk3iMo6ChnZaaf4GQmpiSjJqjoaOal5Gbfo2FeICDjoegf32MjZB8mKSgoZOZkI+mjZCBm5GJk5ebfZKSfoeOgXRzgnB2YH1/jYZyipV8iIxxjH+ChYaOaHdxeIyYkY9/ln6HinKBhnx8cXl7i4R6epGMg5alk4uGkHyGhoeFdoKEiYh6ZXJ8f3h6cWxqZl5+c2h8dXZ0fHOAal5gdHZweGRjWV9eUmtoVGVZX2FoanZ4gXFma2RsaGaAgWtufmhvcWt+eIZ6a4yBc4GBfoF0doKNhn58en+BfX+PanKDbnNpYodobGJfcVZ0b21uYHhobVdqdHZjdXt6cmJrb3mJjZ6ykaSlnY6QmI+GnaGbnXx2paGOmICMooqImpZ4e4aHfoOJf4mCgX9xf3t0doKFfoqReGdjfYaXioKKjXh9gIyDeZaBlZiWjZagm35vjIKRlIamm4eNiYSmlYWTi5aXk5J3kZ2hoZeUl3p+jpiXjpaanaSdmJKUm3mPhYJ3hJaNnX6BiY2Mc5ejnqGTmY6PooyMg5eYg5KWmX6YjXyIjYF2cX1uemSAfIqFcIaSf5CCbIeCgYCJhGV1b3uHkpeMfJN4i4l7f4Z8e3F+d4mFeYSQiouXopWChIx3iISDgnd8goqGdmB4eH10fnhnbGRhf2lqd3N0dX1xfGJjYXNudXNtYVphXltsZVJjWGBhaWt2eYZxYmpjbWVpfYNsaHVobG9pgH2BeW2QhnGAg4N/dHyDjIGAfnqCg358kG12iXR0bWWKbGpiY3VWhGlxbmB4Z2xianZwZnl7eXFfcmyGhY+crpemqJ6NjZeHhp+Tl5l9eKqdipl6l52LjJiQeXuBi318g3uAg4F4dHl6c32AhH+Ji4BkXn2LlYd/hYd1fX6Kf32YhJeUl4ykoZh/cod7lJKKp4+MjoqToJKDkpCUl5GLgY+YoJqSkJFzf42SlImdnZ6ml5eNlZZzjY6Ka4WXj5l6h4iQiW+XnZqjk5WKjZ+Mh4KSnH+TkpWGmYh8iomBenF5a3Vse32Lfm2FkoKUd3CCg31+in9kcml7gJaXhH6Nc5CIg3iHfnZ4gH2GgHyDjYSMlKSPeYSCdImHfYB0doGJhG5he3V6cX1vYW9jZHtibm92c3h3c3RhdV9vbHVub1xbX15ea15QXVhjYWhtdHuIa19qZmpjaXeIbmZsaGpsaIF9e3dvkIhzgYOEfXSBhol6g316gYR9fY5yeot4eG5sh2toX2lyYodocm9mdmdubGF5aWt9e3hwYXhti4CZmaqgo6ieiouShoqei5WYfXeumY2XfZ+UkZaUiHd+e4p8e4B2d3+AcHR0e2+FfYGAin58YVx+kJKGgISEc3qAhnqPkoiSkZyTpZyVgn6BfY6LkqSJjoqNmJqNhpGYk5aPioiMkpyTkIyNboOPj5GJnpmioZeWiZaRboiZhGaFmI6UeomFkItwlZqUopKSiYuajIJ/kZ59ko+Si5mOe4qEh3NydWtxbnR7i3RuhZCNknF0gHuBgYh8ZHBseH2Zk32EiHSQioBziHlvgH2AhnyFjImEjJWojHuIfH6LhXh+cXCBhoRjaHl0dXB8Yl5wYGt0XnBqe3l4bHNwZXhdbWxzbXNYWl5fYmtaUFdYZWNncXF/h2ZdaWhnYmdxjm5kaWdkaWiBend1b46FdIGCg3t1g4mFd4V8eISFeoCKd3+Le3tyeINqa19waHSAa3JvbXFnb2xlfGNugHl2cWx3d4p+opehqKCmm4eMi4GQnIeTnHWBqpWTjoehjZaTkIB0e3aFeHl/cnN7hWtycHptinaAgYducVtZfpKNiICAgHZ1gICAoIaQi5KdmKGUmHiKf4GNiZyeio+GkpiWhYmVmY+Wi4uNjY2dio6Qg22Ji5CRiZyWoZyYlYWXiGmEo4JmhZ2KkX6Lg4uBd5OYkZ6RkImJlY5/fpCYfJGNj42aknyKgIJudXBsbW9we4Vpc4OOmIpwd390goiCeGZyb3WBmY58iIR6lJF5doh0cIl7hYx6i4aDiY6bo4h8hHaCi394eG9sgYSCXnJzcnFweFpecGBwal5van16cG1tamx2YHBvanJtWlhhYWJuWFFUWmZnY3VwhIJiXWttZGJma5NuYGZmX2drgXVyc3CLgHV/g4B4dYCLgHiFf3eHhneDhXyGjH97dop/anFjfGOGfG9xbXRqaG9sdnhfcX95e3R1dICCfqSVmq2eppaFjIR/l5SDkJ91i6CUk4aLm4yVjYt6cnh0gnByhXRxdYhrb211bYh2g36AbW5VUYGrlYeCeIB3c4J6gqCCkoKTk5ickpp4knuDjZOkmpOOiZWZkoSHl5mMlIuJj4+InoSQinxzi4WJjoicmp+alpSAk39ohZyHZ4Wgh5KDkYOJcYORl4+bjo+MjJCNeHuSkHqOi4yRlox8iHyAa3ZqbmtrbHp/YXp+jpaCdnqAeIOMfHlnc2x0h5WLfoiGe5OQcXqEcHaMeomMeol9goyQnp2FfHx3gox9d3FqbIKDemB4b21scnRWXm9icmBfbG55cGhvZmZzdGhwa2F3ZV1WZmBgclNRTlxmZV15cIh8X1xocmJiZWaSal9oZFtncH5wa3B0in12fIWAdHV/jHl7hoF4iINzhoV+jIyEe3mVeGZyaoNgiH5vb2t7YGpudH91X3R9eIZ4dHOFfHigj5mwnKWPgop/g5qIgIyff4uak46FiJeOjo+EdnR3c4Bwb4V0cHGDcGppdm6Dbn18bXVzUk2C38iS1pN8cHWDdoOfgpN3lJGZnJCZe5RzhZCfoZOTkIqTm5SGfpaWiI2NiJGMiJx/joB3eox+iIuKnJydm5WTeo12Z4mSh2yIo4SSh5eDhmOMkZmOlYqXjI2Ki3F7lIh7joiKk5GKeoV8fmx7ZXJvamt5eVyAeZCOgXp9fn+Gjnp6aHNqc4qOiYGFhX2Vi2t+f26Ai36Lh3yEeoKPlZqainx2eIOQeXNtZ3GAhG1qdG9oanRuU15vZHBZX2tyeGZramJmeHJvcGNfd2BgVmtfXndQTkthZ2NdenGJdFxcZXZgYWVlj2RgZWJYaXNzbmtxdox9dHmGgXV2fotzgIZ/e4l+comHgZGKiHx+mHZlc258ZYd+b3Brf1psbnl5c2F2enuNdnN3ind5n4ubr5ugkIKFd4iVfn2KnYeFn5GOhYyXhJOOh4F0d3B5cW6Eb21ufnJkZHhxfW15fWpobGOkmsHcru+hc2x1hHaEooWSb5aQlaCVnIGScYaLo5eJjpWKkJ2Wg4CVkIWJj4CRiomWfod6dX+JeIaEjZybmJmOj3aKdm6GiYt9iqOEkYmdhYVei5OXio+JjouLhIptfJaBfYiFiZGPhnaFfX1rfWR4dWlueHNYiHqShoZ5foCAhYt+eGZzan+JjomCgoCMloVrgXZuiJCCj4R+gXp/kJWTmZB0c3iIjXVzcWd1eoNidG1wYmp2Z1JgcWdsVV9udHlhcmNfaH1wcm5bY3JgYlduWlx4Tk1MZGdhXnZziW1cXGR5XmBkZoVgY2JeWWpya25rcneMfnR3hIF4d3uJcYOEfX6Ie3SLiYiWh4x+fphzaHVxeWyLem50cYFXcXp2eXFld3mGjGl3gIlyf5yHmaeco5KEfXCMlHh5i52EhaGNjXuWjX+ZiIR7cndwc2pvgWtpbXx0XmB4d3txdXtnYWV869q1ycPciHNsdIF3ipqIjWmYkI+dlpOBiXGFiaCNhIuVioyYlHyNk4iDiY97kIuFj4J/dniDhHKHgpOblpSYhox1h39whIKJh5ihg5SMn4OJYYOUj4eKhoqNh4GHaX2Uf32DhImOjoJxhn5/cXdodnJpc3dsWox8koKGfX+DgISJgnVhc2uIgY+KgX5/kpB9bYJseIaPhpKDfIB9gJGTkJaIb3F6jIZ1bHFscnmBYHRpbl1rdmBSZXJpZlNfcHZ0YG9gXWiCcHJqV2doYmlYbVZcdU1LTGVnXmJyc4VpW1xleV5eZGd7YGRfXFlrbmZvaXN4in5zc4F+enZ6iHOFg32Ah3Z3ioaOmIGMgXuTdmx3dXl4k3RueHt9WXqGcYBvZ3h3koJkdoaFcYqVhZmhmqKKh3Rvk4tyd46cfYqaiYl8n3+DmX+BeHFzbm9kcn5pZmx3eFteeXt7cXGAamFnYX/Vto6Qp3hvcXd8cZKQjIdqmY6JnJKMhntpiIuah4GSkYaHmI18jY2BgYmNe4+NfomFenR7gnpwhoCWmY6TlIKJdYOGdoN/ipOcn4aVj59+iGGAk4eFiISKjoB/g2d9kYB+f4KMj5B+bYJ8gnRrbXZ0c3Z1a2KNgY9/hX58hH6Dh35vX3JwhXuOjIF8fpGIenCDZnmDioaLg3yEfoCUj5CShG5veox+dW5va2x7fmNoa2pZbnZaUmlyamJRYnJ4bGJlXVpqg21zYVtnX2RsX25UW3BOSE9nZVxnbnGAbFtbY3NgXGNsd2RlXV1abGxibWp0d4Z/cW9/fHx0eIZ4hYJ9gId1eYmBkpZ8iIZ2iYFwd3l7g5NvbXyBd16Df3SBbWl6dJRzZ3OHfHKRkYOan5ughoh2dpV+bXaUl36IkIOKjZp8i5p2fXZxb2xqYXV8Z2JpdXpaX3h8em1xf2VkaGdXnY9ecXOXvMWEdnGUiZB+cpeMhp2TjIh0a4mPloF7lIuBhJuMfIuGfXyJjH+UiHWJhXZ2fYFxdYaBnpSGlY+Dg3F/iHSDe4mYnJeGk46dgIhlfZOCgIaEiYlygX1nfYt7eX9/h4yPfWmAfYN2Zm94eHN2c2xqjYWKgYp/eIKAg4J/al5xeHp9jImFe4GPgH5ygWl4goeLhYR5g3yBmIyPjH1ubHuJfXd0b2lofXdlXXFjWG9zU1Nuc2lhTmZ0eGZgXVxYboBuc1llYl1qbWBwT1lsUkRUaGFaa25te29aW15tY1pib3djZlxdYGtqY2xpc3aBg3Fufnt/dHWDeoOCfIGFdn6JgZaReIOKdIGIcnl5fo2Qb298gXFpgXl6fm1tfHaVa2p4hHRsk42Fn5igmYWIbn2Mdmp4mI9/goqClZeKeY+Wb3pzcGxqZGBzemlgZXJ7WmByfHlncHphZWWOsbJ3SmJapNrQl3J7kYuQeH6Vi4WZkY2Gb2yGkpJ6eZKGgYSYinyHf3h4iYqEloBviodxdH56aXmFg6WRhJONg39vfoN2g3iFm5iTipKQlIWHcHuSg32Dg4mDb4F4aICFeHJ/f4OLh3xlfX6DdmNwc4BoeHBvdJiMhYKKe3Z4f4N5gWpccH1ygIeFiH2GiXqIcoFucYOGjoSEc4R4gJmMjYR4bm5+hH93e2Voan1yYFl3Wllxbk5YcnNnYEpsdnRhXVtbWXR9cm9XZ11manBfb05XaVI/WWZfWnBrZ3lxW1tYa2VZY3B5X2hcXmVsaGZsaXF3f4dvbH99gHVwgXqAgX+Cf3aBhYmXinGCjXF7hnx6eYSTjHRqen9rb350f31vcnx7lG9ugH94Z5KKgqGZnJKChmeHhHBoepaJfn+FgpmKgXyNjGl4cmtsZl9hb3htX2JveVxkbIN6YXF2X2Vl1Oq+ijI6PouOgHJ5hYiOjXaDl41+k46Nf25shY2Mdn2Pf4WClYl8g3hudoaEg5d3boiEa3V7dGZ5goOnjIOPjIR9bn90doN5hZuQi5CRkoyLhn57kod4gISNg2yAcml/fnhtfHuBioR4YXmEgXFkcWh+bXRxdYGbi4B/hX5zdn2AcoBvW2x+dHiJgop7hn98iHh6cWyIg4+DinKBeX+Wi4p+dG1rdoCAdXZdaWl4cVlXfFNacWVMW3JyZVtKcHdvXFtaWV10fnRoWWJbZ2VuY2lNV2ZRPV5mXF12ZV90cFtZVW9kWWVweVpoXl9nbWdqbGlweH2ObGmChH95boB7fYF/gnp1goGMk4VwgItud36Ae3uIk4l/aHt+anR7coZ7c3d9f4x5eIR+fGuMjIObnZaMgYBsjn5raX+OjXt+f4OUgn99iohrdXFnaGNbYmdyb19hbHNhaHCJemFzdF5jZJugj25cNVmvtXVqgIl9koZ2hpeGdI+LindwbYWDh3V5iniJfZOIen9zZ3aIfn6Yb3CGfWh2eW1leYiFpYeBh42Kfm5+dX+AfIuZh4KTkJiIi4SJfI+JcXt9hXxpfm1rgHt6anp2goeAcmB3gX5xZHJndYJtdXuFlJGBfIF/b3d5fHR+bFdvfnZzi4GGd4d1gYl6eHJuiYCPgIVyfn1+koiJem5uaW2CgnVuXWhmdHJSW3tOXHFcT1xycGNWS3N4aldZWVphcYB0YF1dYGdkaGlmTlpoTkFhZFtgdmFcdG1YWFN0YVpkbnJXal5haGtnbWxpcHd8kmtohIl8fXB+fnuBf4J6d4CAiYuEcnuHb3F3g397io2Pg2p+e253eXaKd314gIKHf4N/fnpthIyImKONhIN7dox6a22EiZF5fXuCkYCAfoqDcHJwY2ZeWWdfcHBgYGdwZmpvinVhdG9bYWRqdnt/vpymo8i4cYWEc5R9eIaUgnSQjYhycnCEe4N0dYd0iHeUiHl5cWN3hnqAk2lyhHVmd3ZjanyDiJ6CgH+Pj31yf3OEeH+RkIJ4lo2Uj4eCiHuJiWx4eX51aHppa395c2l6doCDfWhgd4d9amt0aHt/aXaBi5CUfnp+fnB7dntzfmJVdnxycomDgnyCcIaJd3hwcIOCjH59eX58dY6FgnVpcWlsiIJycF5oY3NuS2V1TF5vVVRZc25iUE9zeGFSV1hcYXCCc1thXGhlZGNqZFBbcUlEZGFcZHFeXXdoVVdWd15cZW5oVmteYWpnZW9vaXB3e5NuaYiMeX5ze354goGCfHZ9g4iGg3B2g3Jud4KDfomLk39wgHx4eXqBjHSDeH+BgYKEeYB2b36Ji5qeiH2FeneHfGh0ho2Ren9/fImGhHaPgGdvbV9kXFhlWW1yYWBhcWxraIluYHNpWV5kbYB3qdqpx4aHsnGJeHCNdXuHj4B6k4qAdXR1fneAcHF/bYV0lIZ4dWxgeoJ5iI5mcYNvZ3VuW219gZCTgIF5kpN9eHtth3WAkIuDc5aKkY6HhYV7gIVtdXZ/bmh3ZW17dm1qdnZ/f3xhYniGemh0dWN9emd1ho6MlXt0gHVxgHp8bH9ZVnN9b3SDhn5/eGuIhnN5a3R/g4N9en14e3KLgHxyZ3RlbYuDbXRba191ZUhubkxbYldXVnhtYk9TdHZYUFVYXmFxhG9cYGNtZGNdbmJUXXJHQ2ZfXWZoXVp6Y1JWXHVbW2drYVZqX2BuZmZrcWhwdniOdGuOjHV/dnh+d4GDgXt0foOIiINvcX90cXV+hoKJjYp7d394hHx8hYd4h3x9gX6FgHt+c3Z5jI6fjYl6inZ1g3lefoaajHmHg3SFhoV3iXpibmxbYltbYVZqc2NgW2dub2eHcmFxZlddY2t/fMrOh7miam1timxxhHF8hIp+e5KFenl0eXV1e2ptdWOEdpKCd3BnXn2CeYuJZXGBa2pxY1hse4aciYOCc5eUd357bodxgYmLh3GWjpCIhYuDe3l+cXFvfWdocmJueHFqbHF4fXx6XWV5gHdpdXhmgnZndIeLjZR8codpb36AeG18XVhxfm1zf4p7gW5uiX9xdmd3f4F/gXZ8cXp0hnx5cmZzYW6LgmxzWGtfd1xJb2tOV1ZeVFV7a2FPVHVyUVFUVl5idIVoXGBramZiWW5hWGJwR0FoXWBmXl1Ve15PVmRwWVtqaF1XZ2BfcmZrZ3JncHN3hnhulYp0f3p4fnmCh4B1c4CGhY6CcHB7d3d1eoeGh4yGenx/dYt+fYWEhId/fn59h398eHV5d5GTn3+MfYttdYB5ZIOIl4ZzkopvhYWBeoN0Y25qWV9bXV1UZ3NlYFlkcnJngXNia2VXWmBpf3e+rnuft25ic4ZodHxyeoOGen2Mf3h4c3Zve3Zlam5hh3WOgXNqYl5+eHmKg2ZxfWhqa1pWb3iKo4GFf3GZk3GAeHWBbYCBkIdylIiMh4OIhX15dXJvaHlham1gbXZqZ2tsend6d1tnfXx4ZXJ9boR0ZXWFjIaVf2+LZmt6g3RsdGJcb3xrdHyLeoFmdIZ9bXFodX54fX9yfGx6eoF6d3BlbGJtiX5tblZrYHdWS2prT1JPaE5ZfGhiTlV1akxQVFVeZnaDZl1hcGhnYFdpXVtraEpFalpiZFdZVXlaTldualldbGVcWWVjXnRmbWRxZnJwdIB3cJqEdn9+eH98hYd9dXOCiH+Vgm5zeHp6c3OFh4mIhHiAfXaPf32EiY6EgoR7fouDe3d8d3eanZd6ioOHaXd+fGyEhZSAco+CcYaCfoJ/b2ZsZ1ddW1xbVGRwZV9YY3N1aXVwZGVjV1xcaIBwb3KAc4lkZXh+aXR2c3ODhXiBhHl3dHVua3twYmhrZ4Z0jYRuZl1ffW97iX1obHdmaWRVV3Jwjad8hHx2lpBzfHN7eW17epCEdpd8h4aChoN9dXBybWd1XW1oX2x1ZGdmaXpve3JZZ4F3dGdwgHiCdWJ3hYp8lIBui2pteoBwZXJlYGx5ZnJ2iXt9YXWDdmlrcXR6cHl4cn1mfn9/eHZuY2VhbYZ8bWtWa2NxU0xpa1BMTnBHXntmYU1VdGNKTlNXYGp3fWVdZ3NpZV9WY1dhcF1MS2tYY2FVVFVzV01YdWRaX2tgXFpjZV93Zm1icGlzb3J+dHSZgXd/gHh/foaEen12goR+mIVucnR7enRxhYWPgoB6i3V0kX99gZSOgIWEfH6Mhnp+gHZ7o6WKeYiGhWx1fHt1hIKMem6Fc3qFfYGDdW5qaGVWXVtbWlNibmVbWGF0e2pobWhfYldfW2mAamtvgGdsYWh5eWt0dHRvhYF6f312dW56aGp5al9lbmiBd4+EZ2VYYndpfoZ6b2lvZmZdVVhvaI+ndoF6fJCOeXVvfm9ydXmOf3eUdIWCf4WIdWpydmdob1xtZV5tc19nYWp4aHttW22Dc3Npb4B+eXdhd4SEeI+Ec4hxb3l/cWJwaFtudmRwc4h7eGFygHBnanhzcWt3dnR3Y4N7fnd2cGRjY258fWtrVWpjZ1NLbGhQR1JsRWF4ZWFNU3JdSk1UWWVrd3plXm1waWRdVl9Vbm5XS1NoWGZeWE1VbFVLXHlfW19rXV1bYmVgemhsYW9vdW5vd3V6l313gIF6gH+Hhnp5eoN+gZOEcXR0fnp3dIWIkH2AfZBsc5WBe4KfhX+HfYB+hoKAint2hKyff3qIh4RscoJ6doGAgXVuh298gHOJgGpvbWRkWF9aWlpVYmpnW1pfdYJpXm1sXGFWXFxrgWZydH1pal1rdnZodHdyboZ7fn15dnJtemhpd2ZdZHJneneSgWNjVGVvZoKEd3ZmaGlgV1ZZaGSQp25+eICLjnpwcHxmeG55i3p2jnGDfX5/hm5kdnNkaGhdbGJdb29bZ19tdWV6aF10gG9ya3F7fnV1YnSFinqHhoB/d3J1fnRhcGxZcHJicXGEe3VkcoBsYWx6b2poeXd0cmaFdXp6dXFkYWRuc35qbFRpX15UTHNjUUdXYkdidmVgS1RwWEpMWFhna3Z6ZGVucGZjWlhdWHZlVEpcY1hoWFlJV2VRSGJ4Wl1fbFteXGJkXoBpal9vdHltb252g5d5coGAfX+Ii4Z9dnaGeIeMfXN1dYF5enqCjI59foSJanSWgXuKnX1+hXmAen58hohzcY+ujHt7hpB+ZnKIenR9fXZyb4Zse35sj3picG9hZV5lVllZV2Nma2BdXXOGaVhwbVtfV1tcbHtjcHd2bGJbbXN0Z3V2cW2FeX+AeXdub3RlaXRlW2d0ZnZ2kXpfXVJmZmqCgXR9YWNpXFRYXmJjkKVoeXSChZB4bW55Z3dte4R6dIhygHh8eH9oZXZtYGZhX2pgXXRrWWVdb29iemVbd3xrbm5weHh0dGRyg5J+h4KIenZvcX1yYXdkWm5vYXBxgXxzZXGAZF5udmljZnl6dG1ugXVzfXNxYl5mbm99ZWlUaVlZVE54X1JKWllIYnRjYElUbVRJTFpWaWxye2JsbHNiYVlaW2F2W1NLZF1YaVNXSFlgTkdpdVheYW1bW19iY12FaWhhbnh5bG9rdoGQeG2DfoCBkoiEgXZ1iXSMhnNxdnaBd3x9foyPgH6TfnB4loN9mZJ5gIB4eX5/c4iDc3CZont6f4mVeWR1iHlzeHZsdG9+bHl8cJFyXnBuYGdibFRaWldoY21lXFxyiWZScm1bWlhYYGx2ZGl1ampeWm1zcWx0dHRrhnx+gHx3b25sZGlxY1trcmR0do9zW1dUZGByf35yglxhY11TWmBcZJOfZXJxhYSRdGxqeWxvb3p7e3GAdn9yenp6ZGV1Z15iW2FoXF53aFdiXW9oYXdhW3x2amlyb3d0c3RocIGUgoZ+hHZyanB7bGZ2V1xqbWJwcoB6c2VvfltgcHFiXmlwfGxsdH5ycXhrcGBcZWxte2FnVGdVV1JQdltTUFpSSGNzYmBHVmtRSVBaVWtra3xlbW9xYFtaWFlscFdSUGZXV2hTVEZaXE9IcnVYX2NtY1hhYGFejGpjZG15eGtvaXV5hntrg32AhZl8goR5fYhuj4Zxb3d6fHSCgnyLj4OClnR4gpSFgZ+JdYGAgXR/gnCHgnVvopd0e4aLh3tmeItvbntvZnhwemxzdnONa150bmFnZWtTXVtVZ2JsbFtccYxkTm9tXFZYVWdpdGhidGVlXVpudW5wdXV6bId8f3yId5BzY2Vrb2Fcbm1jc3iHa1pUVmNjd3x8cIVcY19jVFtgWmOWlWNucIOFinNqaHpuZXJ2c3treXR1b3p+dV9mcmNbXldiZFlhdWZVX2BtZGFxXV1+cGhpc3FzcHV1a22Ek4GIe4VxcmZufG9xblNaZWplcXOAdnNibHZVYnFrW15uZXxlbHV8cnJyam1gWWRqanheZlRlVVZQVW5YUVdUUEhlcl9hRldqT0hYVFZtaWR8aWt3a2FXXFVbdGNTUldpUVlmVFNIWltQTnh3W19mbGlaYmBeXo9uYmZreXVub2l2dn9+bYOAfoeXe3+HgYp/a5OIcmd0gHt1gIN9iY9/i5NyfYqRhYefhnt/hoxzgIZzfYJ1bqWMc4GNjHd4bnuNYGR8cWZ6c3lsbXF2g2dkfGxjZmdoU19fVGdgbG9cXm6OaE1pbGBVVlNvZnNrZXhkZV1ZcHRtcnt4c22Ie4B3nHt6bGFlbG1eYG5qZXB5fmdaVlhga3h7e2+DXmJeZ1ZZYFhknIhia3GBh313a2p3bFt2cWt5aXVybW97gHJYam1fWV1WYmRYZXFjVF5haWJibFpgfmxma3N1bm13dmtohYx/iHqHbXFlb3tscWxiWF9oaG9zgHRzXmltU2VwZVVibmF5YnB1e3Vrb2xqX1hhZ2h1XWVWYlZTTllmU09dT09IZW9dY0dZaU1JX0tYbWRfeGhufWRgVV5UXXRbVFJgZk5dYVRTSlxaUVp1dV1fZm1oWGJhW16OcWNnandxc25odnN5g3OCg3uIjX58ioeOem6QinRsc4J0f3+IhYeShJWPen2Mj4iRm4SAfIyEcn+Bc3R3cW6Tk5OTk5OTk5OTkpKSkpKSkpKSkpKSk5OTkpKSkpKSkpKSkpKSkZGRkJCPj4+Pj4+Ojo6Pj46OjY2Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2NjYyMjI2NjY2Njo6Ojo6OjY6OjY2Ojo6Oj4+Pjo2NjY2Oj4+Pj4+PjoKAfnp6fX5+fX1/fn59fn5+fn5+fn+Af4CAgIGAgIB/gIGBgYOHjI6Ojo6NjY2NjY2NjY2NjZKSkpOTkpKSkpKSkpKSkpGRkZGSkpKSkpKSkpKSkpKSkpKSkpGRkZCQkI+Pjo6Ojo6NjY6Ojo2NjY2Njo6Njo6OjY2NjY2Njo6Ojo6Ojo6NjYyMjY2MjIyNjY2Njo6Ojo6NjY2NjY2Njo6Ojo6OjY2NjY2Ojo6Ojo+Ogn99ent8fX59fX5+fn5+fn5+fn5+f4B/gICAgICAgH+BgYCBg4aMjY6NjY2NjY2NjIyMjIyMkpKSkpKSkpKSkpKSkpKSkZKSkpKSk5KSkpKRkZGRkZKSkpGRkZGQkJCQj4+Ojo6OjY2NjY2Njo6Ojo6Ojo6Ojo6OjY2NjY2Njo6Pj4+Pjo6NjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Njo6Ojo2NjY2NjY2NjY6Ojo6Cf3x6fHx9fn19fn19fX59fn5+fn5+gH9/gICBgYGAf4CAgICDhouOjo2NjY2NjIyMjIyMjIySk5OTk5OTk5OSkpKSkZGSkpKSkpKSkpGRkZGRkZGRkJCQkJGRkZCQkJCPj46Pjo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2MjY2Njo+Pj46Ojo2MjIyMjIyMjIyMjY2NjY2NjY2NjY2NjY2Njo6NjY2MjIyNjY2Njo6OjoN/fHp8e31+fH1+fXx9fn59fn5+fn5/f3+BgYGAgICAgYCAgIOGi42NjY2NjIyMjIyMjIyMjJA+LjExMTEvb4eEhISEiF0tMDAwMC1GoaGhoaGhoJqZmpqampqKg4SEhIOEd2VnZmZmaFxDREREREVCMS8wMDAwLlxwbm1ubnFJLDAwLy8sSYWDg4ODg4OLjIyMjIyMjY2NjYyMjY2NjY2NjY2NjIyMjIyNjY2NjY2OhX19e3t6fX58fH59fX1+fX1+fn5+fn9/f4GBgYCAgICBgICAgoWKjI2MjIyMjIyMjIyMjIyMjy0aHR0dHBpohoKCgoKGUxgdHR0dGTekpKSkpKSjnJycnJycnImBgoKBgYJyXV9fX19hUjQ1NTU1NTMeHBwcHR0bU2pnZ2dnazwYHBwdHRg7g4GBgYGAgYqLi4yMjIyMjIyMjIyMjIyMjY2NjY2MjIyMjIyMjY2NjY2GfH16enp8fXt8fn19fX59fX5+fn5/f3+AgYCBgYGAgIGBgYGChYqNjYyMjIyMjIyMjIuLi4uRiYeIiIiIho2QkJCQkJCMh4eIh4eHiZKTkpKSkpKRkZGRkZGRj46Ojo2NjYuJiYmJiYmIhYaFhYWGhYODg4SEhISIioqKiomJhoKCgoKCgoSKioqKioqKi4uLi4uLi4uLjIyLi4yMjIyMjI2NjIyMjIyMjIyMjY2Njoh8f3l7ent8e319fX18fX19fX5+fn9/f4CBgYGBgYGAgYCAgYKFioyMjIyMjIyMjIuLi4uLi5GTk5OTk46SkpGJh46KkJKTkIqQjY6OhYqRkZGRkJCQkJCPj4+Pj4+Ojo6Njo6Ojo2Njo2Njo6Ojo6Ojo6Oj4+Pj46NjY2NjY2Njo6NjY2NjIuLi4uLiouLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyNjY2NiX59eHh5fH18fX19fHx9fX59fn5+f3+AgICBgYGBgYCBgIGCgoSKjIyMjIyMjIyLi4uLi4qLkJCRkZGPhI6QkIaKj4WNkJCMiIiIiY6IiZCQkJCQkJCQkI+Pj4+Ojo6NjY2NjYyMjIyMjIyMjIyMjIyMjIyMjI2NjIyMjIyMjIyMi4uLi4uLi4uLi4qKiouLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjI2Lfnx3dnh7fXx7fX18fH19fn5+fn5/f4CAgIGBgYGBgIGAgIGChIqMjIyMjIuLi4uLioqKioqQkJCQkIqFjoiOhoaPiY2QkJGNiI2JkImLkI+Pj4+Qj5CPj4+Ojo6OjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLi4uLi4qKioqKi4qKi4qKi4uKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIt+e3d2eHt8fHx9fX19fX1+fn5/fn9/f3+AgIGAgYGAgYCBgYGEiYyMi4uLi4uLioqKioqKipCQkJCPhYOMjpCOiYyKjpCQj4eNjImPho2Pj4+Pj4+Pj4+Pjo6OjY2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKioqKioqLi4uKioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMin18dnZ4fHx7fH19fH19fn5+fn5/fn9/f4CAgYCBgYGBgIGAgYSJi4yLi4uLi4qKiomJiYmJkJCQkJCMhoyJjoeFjYmOi4yMhIuMiY2Gj4+Pjo+Pj4+Pjo6OjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKioqKioqKioqKi4uLioqKioqKioqLi4uLi4uLjIyMjIyMi4uMjIyKf353eHp7enp8fHx7fX1+fn5+fn9+fn9/gICAgICBgICAgYCBhIqMi4uLioqKioqJiYmJiYmPj4+Pj5CMjouPjIqPjI6MjY2Ii46MjYuOj46Ojo6Ojo6Ojo6NjYyMjIyLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLjIiAfXh5enp6e318e3t9fn5+fn5/f35+f39/gICBgICAgIGBgIGEiouLioqKioqJiYmJiYmIiI+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pjo6Ojo6Ojo6Ojo6Ojo2NjYyMjIyLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLioqKi4uLh4B8eHp6eXt8fHt7fH1+fn5+fn9/fn9/f39/gIB/gYGAgIB/gYSJi4qKioqJiYmJiYmJiIiIj4+Pj4+Pj4+Pj46Pj4+Oj4+Ojo6Ojo6Ojo6OjY2NjY2NjY2MjIyMjIuLi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKiYmKioqKioqKioqKioqKioqKioqKi4uHgHt5eXh6fHx6e3t9fX5+fn5+f39+f39/f39/f3+BgYCAgH+BhIiLiomJiYmJiYmJiIiIiIiOjo6Ojo6Pj46MjI+Sj5COjo6Ojo6NjY2NjY2NjY2NjIyMjIyMjIuLi4uLioqKioqLi4uLi4uLi4uLi4uMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKiomKiomJiYqKioqKioqJiYmJioqKioqKioqKioqKioqKioqKi4aBe3h5eHp8ent7fH19fn5+fn5/f35/f39+fn9/f4CAgYCAgIGEiIqJiYmJiYmJiIiIiIeHh46Ojo6Ojo6Ojo+MkJOQkI+Ojo6NjY2NjY2NjYyMjIyMjIyMjIuLi4uLi4qKioqKioqKi4uLi4uLi4uLi4uLi4uMjIyLi4uLi4uLioqKioqKioqKiYmJiYmJiYmJiYmKioqKiomJiYmJiYmJiYqKioqKiomJioqKioqKhYB6eHl5fHt6ent8fH1+fn1+fn9/fX9/f35/f39/gICBgICAgYSIiomJiYiIiIiIiIeHh4eHjY2Ojo6Ojo6Pj4+PjoyNkI2NjY2NjY2MjIyMjIyMjIyMi4uLi4uLioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYmJiYmJiYmKioqJiYmJiYmJiYmJiYmKioqJiYmJiYmJioqFf3l6eXh7e3p7fHx7fn5+fX5+f39+f35/fn+Af3+AgICBgYCChIeKiYmIiIiIh4eHh4eHh4eNjY2Njo6Oi42Nj5WPiYyPjYyNjYyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYR+eXt5ent7ent9fHt+fn59fn1+f35/fn9+f3+AgICAf4CAgICEh4mIiIiHh4eHh4eHh4aGhoyNjY2NjY+MjImKj42IjJGPjY2NjIyMjIyMjIyLi4uLi4uKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uKioqJiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJg355e3p8e3p7fX17fH9+fn5+fX5/fn9+f3+Af4CAgH+AgH9/f4OGiIiHh4eHh4aGhoaGhoaGjIyMjIyLiYyKiIeJhoyOjJCMjZGOjIyMi4uLi4uLi4uLi4qKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiImJiYmJiYmJiYmJiYmJiYmJiYmIiImJiYmJiYmJiYmJiYiIiIiIiYmCf3h7e3t6enx9fHx9f39+fn19fn9/f39/f4F/gIB/gICAgICAg4aIh4eHhoaGhoaGhoaGhoWMjIyMi4yOjoyKioeEiIuKjIuNjo+Li4uLi4uLi4uLi4uLioqKiomJiYmKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiomJiYmJiYiIiIiIiIiIiImJiYmJiYmJiYmJiIiIiIiIiYmIiIiIiIiIiIiIiIiIiIJ/eHp7enp6e3x8fX1+f35+fX1+f39/fn+AgICAf3+Af4CAgYCDhYiHh4aGhoaGhoaFhYWFhYyMjI2NjJCSjI2Ii4mJi4uLi4mLjIqMi4uLi4uLioqLi4qKiomJiYmJiYmJiYqKioqKioqKioqKioqKioqKioqKioqKiYqJioqJiYmJiYmIiIiIiIiIiIiIiImJiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIiIiIiIiIiHgXx4e3x5enp7e3x9fX9/fn59fX9/f39+fn+Af4B/f3+Af4CAgIKEh4eGhoaGhYWFhYWFhYWFjIyNkY+PjZGJjIaJjIuIiImMiYeNjo+NioqKioqKioqKiomJiYmJiYmJiYmJioqKioqKioqKioqKioqJioqKioqKiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4WAenl9e3t7enx8fHx9f39+fn19f39/f35+f4B/gH9/f4B/gH+AgoSHhoaGhYWFhYWFhYWFhISLi46PjoyLj4iHiYmMjYWFjo2KiYyNi46KioqKiomJiYmJiYmJiYmJiYmJiYmJiYmKioqKioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHhoaHh4eHhH55eX16enp7fXx8fX5+f35+fX5/f39/fX5/f3+Af39/f39/f4CChIaFhoWFhYWFhYWFhISEhIuLjI6MjI2Lh4mIiomGgoiNjoiKi5GTj4uJiYmJiYmJiYmJiYmIiYmJiYmJiYmJiYmKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIeHh4eHh4eIiIiIiIiIiIiIh4eHh4eHhoaGh4aGhoaGhoaGh4eDfXp5e3p5enx8e31+fn5/fn59fn9/fn9+fn+AgICAf35/f39/gIKEhoWFhYWFhYSEhISEhISEioqOjYmIiIqKh4iHiomIioiIh4qGi5GPiomJiYmJiYiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHh4iIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGh4J8eXl6eXp7e3t8fX5+fn5+fn59gH9/f39/f4CAgH9/fn9/gICAgoSGhYWFhISEhISEhISEhISKi5CPiYmJi4qHh4WHiYuKiYSLjYmOjYqJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiIiIiImJiYmJiYiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGgXt4enp4e3x7e3x+fn9+fn5+fX1/f39/f3+Af4B/f39/f3+Af4CChIaFhYSEhISEhISEhISEhI+Qj4+IiYuIhoeIiYuLjIuJioqNio6Oj4iJiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoaAe3h5eXh4enp8fX1+f35+fn59fn9/f39/gIB/gICAf39/gIB/gYKDhoiGiIaDhISEhIODg4ODkpKOioeKi4qLh4uNiYqJi4iHiouIio+SioiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhn96eXh4eHl5eXx9fn5/fn5/fn1+f35/f3+Af39/f4CAgH+AgH+BgoOHjo+PjoiHhIWFhoaFhYWSkI6KiYmIiImKioiIh4aKjIiHiYmOkJGNh4iIiIiIiIiIiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4aGh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWGf3l4d3d3eXp5e3x9fn9+f35+fn5+f35+fn+Af4CAgICAf3+Af4GBg4eOjo6Ojo6Mjo2OjY2MjZCQjomHhoiJiYeIiouIiYyJiYaKjY6PkYuIiIiIiIeHh4eIiIiIiIiHh4eHh4iIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhYZ+eXd5d3d6eXl8e31/fn5/fn5+fn5+fn9+f4B/fn+Af39/f39+gIGEiI6Ojo6Ojo6Ojo6Ojo2NkJGOi42JjIiIiYaHiYaIioiHi4yLjpCQiIeIiYmJiIeHh4iIiYmIh4eHh4iIiYiIiIiIh4iIiIiHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhoaFhYaGhoWGhYSEhIWFhoaFhIWFhX55d3l2eHl4e3x7fn5+fn5+fn5+fn5+f39+f39+f39/f35/f3+AgYOGjY2Ojo6OjY6NjY6OjY2Qj42Ni46KhoiKhISLiYeDhYSDi4mLj42JjI6QkI+NjYyLjY6Pj42NjI2Nj4+Pjo6MjYyMjY2KiYiHiImHh4aHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoeHiYqKiIeJi4yNjo2LiImLi42OjYyJiImMgHl3d3Z6eXh7e3t+fn5+fn5+fn5+fn5/f39+fn5/f4B/f4B/f4CBg4aMjY2NjY2NjY2Qj4+Pj46NjI6KiYuMjIeFiY2Lh4aIh4aHh4uNjo6Pj4+Pjo+Pj4+Pj4+Pj4+Pj4+Ojo+Pj4+Pj4+Pj4+Oj46Oj46Mi4uJh4eHh4aIhoaGhoaGhoaGhoeLiYeHiIiLjY2Mi4yLjY2Ojo+Ojo6Pj46Ojo6Ojo6Ojo6Njo6NjY2AeHZ4eHp4enx6fH5+fn5+fn5+fn5+f39/fn59fn9/f39/gH9/gIGDhoyMjIyMjY+QkpOTk5KSjYyMjIqHioyKh4eJiYWCiouIiYWJjpCNjo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjI2NjI2LiYaHh4eHiYqLjY6NjYyNjY6OjY2OjY2NjY2NjY2NjY2NjY2OjIyNj4+OjY2MjIyLi313dXd5enp7e3p+fn5+fn5+f35+fn5/f39+fn1+f39/gICAf3+AgYOFj5KRkJGSk5OTk5OTkpKLi4uLiomMiouLiYuKhoeOjYiIjI6OjIuMjIyNj46Njo6Ojo2NjY2MjY2NjIyMjIyMjIyMjY2NjYyMjI2NjYyMjI2NjIyNjIyMi4yMi4yMjI2MjIyMjIyMjIyMjIyLi4uLi4yNjY6Sk5OSkpSRkJOVlZSTk5COjo6Oe3Z2d3h6ent7e31+fn5+fn5/fn5+fn5/f35+fn9/f39/gIB/f4CBgoSNkpKTkpOSkpOTkZKSkoqJioyJi4qJjIuKioiHiYqKi4mKjY2Mj46Nj5KUlJOUlJOTkpGSkI+Ojo2NjY2Pko+OkZGOjIuKioqLi4qKi5CPjoyMjIqKioqKioqKiouKioqKi4yLi4uMjIyKiouLi46RkpOTk5SUk5STk5SUlJOTk5KSkpKSk5F6dXZ2eHt7e3p6fX5+fn5+fn5+fn5+fX5/fn5+f39/f3+Af39/gIGChIuRkZGRkZKSkpGRkpGRiYmIiIqMiYiJiYuJhoSJhoyKh4ySkpKTk5OUlZWWlZWUk5OUlJSUlJSUlJSVlZWVlZWUlJOTkY+QkZKQjoyRlZWVk5KSjpCPjYqKi4qKi42OjY6RkpCRkpKSkpGRkpKSk5OTk5OTk5OTk5OTkpOSkpKSkpKSkpKSj3h1d3l6e3t7ent9fX19fn5/f35+fX5+fn5+f39/fn9/f4B/f3+AgYKEi5GQkJCSkpKRkZGRkZGIiIiIi4uJg4eLi4yMiIeHjYyNkpSSkpOTlJWWlpaVlZSSkpOTlJSUlZWVlZaXlpaWlpWUk5SUlJSVlJSUk5OVlZWUk5KTk5OTkJGSkZGSk5OTk5KSkpOSkpKSkpKSkpKSkpKSk5OTk5SUk5OSkpOTkpKSkpGRkZGPdnJ3enp7e3t8fX59fX1+fn9+fn9+fn5+fn6Af39/f3+Af3+Af4CBgoSKkJCRkZGRkZCQkJCQkIeHh4eIiIiFi4+KjI6Njo+OkJWUk5OTk5SUlZWVlJSUk5KSk5KTlZSUlZaWlpaWlpaWlpSTk5OTk5OUlJOSk5SVlZSTkpKSkpOTk5OTk5OTk5KSkpKSkpKSkpGSkpGRkZGRkZKTlJSUlJSTkpGRkZGRkZGRkZGRkYx0c3d6ent7e3x9fX1+fX5+f35+fn5+fn5+fn9/f39/fn9/f39/f4GDhIqQkJGRkJCQj4+Pj4+Ph4iKi4yNjYuOj42Mjo6RkpGSk5OSkpKSk5SUlJOSk5OTkpKSkpOUkpOTk5WVlZWUlZWUk5OTk5KSk5OUk5KTlJSUk5KSkpKSk5OTkpKSkpKRkZKSkpKSkpKSkpKSkZKRkZGSkpOTlJSUk5OSkZGRkZGQkJCQkZCRinN0dnp8fHp7fXx9fn59f35/f35+fn9+f31+f39+fn59f39/gH+AgYKDipCQkZGQj5CPjo+Pjo+Oj4+Pj4+Pj4+PkI2OjpCRkpKSkpKRkpKTk5OTkpGSkpKSkpGSkoOQk5OSk5STk5OTlJOSk5OTk5OTk5OSk5OTkpKSkpKSkpKSkpGRkZGSkZCRkZGRkpKRkZGRkpGRkZGRkpKSkpKSkpKSkpKRkJCQkJCQkJCQkJGGc3V2e3x8e3x9fX1+fn1/f35/fn5/gH9+fX5/fX5/fn5/f3+Af3+BgYGKkI+PkI+Pj4+Pj4+Pj4+Oj46Oj4+Pj5CQiI2PkJGRkpKSkpOTk5OTkpKSkpKSkouKkpKNepGSkpGRkpKSkZKSkpKSkpKTk5KRkZKTkpGRkpKSkpKRkJCQkJGRkZGQkJGSkZGRkZGSkZGRkZGRkZGSkpKSkpKSkZCRkZCPj4+Pj4+Pj4+PkX9ydHh8fHx7fHx9fX5+fn9+fn5/f3+AgH99fn5+f39+f39/f4CAf4GBgYqPj4+Pjo6Ojo+Pj46Ojo6Ojo+PkI+Pj4+GjpCQkJCRkZGRkZGRkZGQkJCQkJGSiHeRkoR3j5GRkJCRkZCQkJGRkZGRkZGRkJCQkZGQkJGRkZGRkI+PkJCQkJGRkJCQkJCRkJCQkJCQkZCQkJCQkJCQkZCQkJCPj4+Pjo+Pj46Ojo+Pj4+PeHJ2eXx9fHp9fH19fn5+f35+f39/f4CAf39/fn5/f35/f39/gIB/gYGAio6Ojo6NjY2Ojo6Ojo6NjY2Oj4+Pj4+PjoiQkZCPj4+QkJCQkJCQkI+PkJCQj4+LboqRenWMkI+Pj4+PkI+PkJCQkJCQj4+Oj4+QkI+PkJCQkJCPjo+QkJCPj4+Pj4+PkJCQkI+PkI+Qj4+PkI+PkJCQkI+OkI+Pj46OjoyMjY2NjIqDiYhzc3Z4fX58eX18fX1+fn5/fX5/fn9/f39/f4B/f39/f4CAgH+AgH+BgYCJjY2Ojo6Ojo6OjY2OjoyNjY6Ojo6Ojo2NiJCRkI6Njo6Ojo6Ojo6Pjo6Ojo6Pj4pogI92dYmPjo6OjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Pj46Oj4+Pj4+Pj4+Pjo+PjY2MjYyNjoyLi4mJiYiFhYSDgoKEgnR5fXp4dXJrZWltb2xmZmdncHNzd3l9fnl6e3x9fX1+fn59fn9/fn9/f39/gIB/f3+AgIGAgIB/f4CBgImNjY2NjY2MjYyMjIyMi4uLjYyMjIyMjIyGj5GRjIyMjIyMjIyMjIyMjIyMjIyNiWl3jHV1ho2NjY2MjIyNjY2NjYyMjI2MiomKi4uJh4KAh4iEgXt6gH57fXx8fXlzcnJycnV1cG1ramppZ2NkYV9bXF1eWFVXWFlTS0VJSkpLTE1PT0tgdHR3eX19eHp5e3x8fX5+fn1+f39+f35/f4CAgH+AgICBgYCAgICAgIGAf4OEhYSFiIuLjYyMjIuLi4yGiYqKioqKh4OOkJGNiouLi4uMiYmKioqKiouLi4eAaG2BcXOBhYWEhIeJiYWCg397fHl6e3pzcHFxcW1samdsbWdlZmVmZGNlZGVkZWVlZWRkZGNhYV5dXFpYWFdUUFFSU1JTTU1KSUZESEpHR0hHR0xOSWdzdXh6fXp4d3l8fHx8fn5+fn9/fn9/f39+f4CAgIB/gICBgICAgICBgYFnXmBjYWNucX17ent/fXd8fHZ4ent4eHpvcHt4eXt8e3h3e394dXd0dHZ1dXZ3dWhgZ2BkaW5naGtsbm9tamlpaGhlZWRkZF9gYWJgYF5dWVhaWltdXV9gX2BfX19gYmFeXl5eWVldXF1bV1dWUlRSU1NOUUpISUZERUhMTEhGR0lLSklNbXJ0eHp7end3eXt6e3x+fn1+f39+f35/f35+gIGAf3+AgIGAgICAgICCgWdYW1pZXFtcY1xaXF5ga3FtcHBvbm5vbmtpbmxrbG9qaWtraWpraWZmZ2dnaGhmX2tsYGpoaWdjY2JhYmBgXVhbW1dYV1RWUVBUU1NNSkxLTExOTk9UWFhXVVVUUlBQTU1QT05LTE1QUU9MTEpHSUlHSEhJSEhIR0ZHSEpKSEhISUlISVZwc3Z5ent5dnZ5enp7fH59fX5/f35/fn5+f3+AgX9+f4B/gICAgICAgIGBbFtYVlZWWVlaWVlYVVZoamxubmxra2poaGloZGVkYlxiZl9fYWNfXF9dYF1eWlxjdG1lcXBlXVpZX1tYV1NOTUxLS0tMSUtNTktKS0tMSktQTEtLRkdHSUlGR0lISUZFSEdGRkVERUVEREVJSUlHSEdIRkZLTUtJSUlIR0hLTU1LTExMVXFzdnl6e3l2d3h3ent8fn1+fn9/f39+f3+AgIGAfn5/f4CAf4CAgIB/gYJoUlRVVlNVV1lZWVdXV1tbYWNfXlxbWFZWWVZSVFJRUVVUU1NUUE1KTU5QUk9NUmhwbGFwdWtUUFFUUFBOTk9NS01MS0xKSktLRklJSkxJR0pISUlFR0dGRkVFSElKR0ZHRkZHR0hKR0dISEpMSkpLSUlISktLSkhKS0pISUtMTU9QUEtUdHN1eHp6eHZ2d3d6enx+fX5+fn5/f35+fn+AgYB/f3+AgYB/gICAgH+AgmlQUlRXVVRWWVdYWFpbVFRTUlBRU1FRUU9OTlBQUU9MTlBPTk5NTEtNTk5QTU5UZmxuY29zcldOTk5PUFFPTk5PTk5QTk1NS0lISEpJSUlJR0ZHR0dJSkhJSEhJSEhHSEdISElISUxLSklISkpJSkpIR0pMS0pJSUhKSktMTk1NTU9RTFVzcnN3enl3dnR2eHp7fX19fn5+fn9+fn5+gICBgICAf4GBgH+AgICAgICBbE9PTlRZVVVdW1lXV1hOTUpKSUZKT0xKSkdJSk1NS0pMTUpHSUlJSktLRkJFSU1haGtxcW9uWUxOUlZQT09NTk9MTk5OUFBPTE1MTk1MTEpJSEdJSElISElJS0xLS0pJS0pJSklJSUlJR0dKSUdJSUpKTk1OTEhJSklJSk1PT01MT1JOWXBwcnd4d3d0c3R3enx+fX5+fn5+fn5+fn9/gICAgICAgYCAf39/gICAgIFvS0pNTlFOTlVXVlZSU0lFQ0VFUkREQT5CP0RAQD5CREFAQURHRkVIRUFLT0dITmFoZnBva2hjXmNoV0hISklKSUlLSkxQTk1MTU1MTU1NTElIREZGR0ZGRklKSUlLSkhMSklKSkpJSEhKS0tIRkdJSklLTU5OSktPTUxLTU1PUE5QT1BgcG9yd3h2dHJzdXd6fX19fn5+fn9+fn1/gICAgICAf4CAgIB/f3+AgICAgXNQUE5OUE1KS1BSUE5RQ0RCQUZRRT1DPT9FSDk6Oz0/PTxBRkA+Ojs+PkBUXlldaG1pbm1sampsbFZGQkRFRUZFR0dHR0pHSEpLR0NER0pHQ0RFQUFDR0hHSEdISktKSElMS0lISktLTU5MTUxMSkpMS0lLTU9PUFNRT1BQTk9QUlFNUGdwb3N2dXRycXR4eX19fX1+fn5+f4B+foCAgH9/gIB/f4CAgH+Af4B/gICCdlRVUVFQT0xNUFBOT09BQkFAQkE/Oz48Pj8/Ozg5ODs7OkA6Oz48Ozs8PEVZZmlrb2ptbWpqa2xXQkZGREdJSEM/QEBAQUFCQUE/Pjw9PkFAQD8+P0BFR0dHSUtMTk1OTUxNTUpLTVBVU05MTlFOTk1OTE1NTk9OTk1LS05OTk1OTkxUbnBwcnR1c3Fydnh5fX19fn1+fn5/gH5+gICAgICAgH9/gICAgH9/gH+BgIJ4UVFSVFJTUVNTUVFST0BAPT4/PD8+QEE/PT45Ozo7Ozk5Ojg4Ozw5Nzk7OzxOaW5va21saWlsVUA/Q0ZEQ0NDPzs+PkBDQ0E/Pj9BPkBAQj9APD9CQEFDRUVFSktQT1BPTU1OTExMT1JRUFJOTExPTUtOT0xMTEtMS0tKS0tKTU1LS1xxcXF0c3VycXR4eHp9fn1+fn5+f39/fn5/gIGAgH+Af4CAgICAf4CAf4CAgXxSTU9RUFFSUlRSU1NOPDs8Ozs7P0BBQkA9PDk8PTw6Nzk6Ojk3OTo6Nzg6ODdJaW9tcG5ra1c8Oz1AQUA9Ozs+PD09QEJDQT9BQkE9Pj09Oz0/Q0RCQD9BREJFR0pKSkpKTE1MTExNTExOVVNLTE1USVBKSU1KSUpLS0pJSEdKS0lKZnJxc3RzdXJydnl5e31+fn5+fX9+f39/f36AgICAf4CAgICAgIF/gIF/gYCBgFZMTlBQTlJRUFBRUU44PT88PDo9PkFAQT8+PkA/Pj48PT0/QD09PT9DOz09PTxKZ3J3c2xcPz09Pj9AQUA/P0E/QEBBQEBAPT8/PTw6Oz09PD9AQUJCQUBCREZGRkdGR0dISUtMTExLTEtKS0lKSk1MTEpMS0lISUxMSklJSElLR01tcHF1dHR1c3V4eXl8fX5+fn5+fn5/gH9+gIB/f39/gH+AgYCAgYCBgICBgYCCYUtPT05OT1BPT1BQTzo8Pjw9Oz8+PkFBPz0/Q0NEQT89PkBBP0A7XW5APkRFPz5HW3lyVEA8Ozo9PkFBPz5AQD9BPz89PD48PTs7PD0+QUA/QD5AQ0NEQkRFSEVFR0hISEdGSUpJSUlJSUhKSkpKTEtKSklJSEhKSktMS0lLSkpIVnBwcXNzdHR1eXp7e3x+f35+fn5+f39/f39/f3+Af4CAgICAf4GBgICAgIGBgIJtTFBRTk9QTk5PUFBPPjw8PT4/P0A+QEA/Pz9CRkQ+PDw9QD04Ojttdkg4Ozo9PkA9Z1w5PD08ODo7Pz49PD07PEA9PTw8Pjs9PD0+QUBCQUBAP0JEQ0RFRkZGQ0VHSElJSEhJS0tMTUpKSUpNTUpLSktJSEhISEpJSktKSk5MSUlfcHBycnJ0dXZ6e319fH5+fn5+fn5/f35/f36AgIB/gICAgICAgYGAgICAgIGAgnZNTk5NTk5MTE5QT0w+QTw8PT8+QkM/PkFBQUJBQFlRPD09SUxFRnZ2TTc4ODo8Pz9TVTk7PTw6Ojs+Pz89PDg6Pjw9Pj89Oz4/QEJDQkJDQ0FCQkFCQkRCQkRCRENGSUdGRkhJSUtNSklKSktMSkpJSkVESUlGRkhISUpKTEpGRmdwb3FxdHZ1d3t8fH18fn59fX1+fn9/foB+fn+AgH+AgICAgICBgYCAgICAgICBek5JS0tMTExFSUxOTTw/PDw9PkBAQUE7QkNCQ0BDc3lJO11/g395fHdWPD0/PT4/QlVbOjs9Pj89PT5BQ0A8OTtBPz4+QT07P0JAQkNCQENDQUNBPT0+QD0/QUFBQENFRUBAQ0JDR0dFRENGRUZGR0VEQEFHR0ZDRkRHSEpHQz5IbG9wcHF0dXZ5fHx9fHx+fn1+fn5+fn5+f36Af3+AgICAgICAgIGAf4CAf4CBgIF+UUhLTU1NS0pLTE9RQD8+PkFBQEBBR0FCRENFQUhyeWtigoSDgoOAfV0+QENAQD8+WmM+Oz1BRUFCQkZIQz08QERDQUE/Pj1AQT4+Pj88PkBER0VAPkBBP0BDRkVDQkNDQEJEREJERUFCPkFCQkFCQEA9QUJDRENDQUNFR0E/PVZwcHFwcnV1d3p8e3t7fX9+fX19fX1+fX5+fn9/foB/f4CAgICAgYCAgIB/gIGAgX5SSEtNTUxLS05OUlVEQkBDQ0FBQkBCQ0BAQUFARm90fYKCgYN+fYV1TEFDRUA/P1Bydkw/Q0VJSklJTU1LRURGR0hGR0VFRUREQ0E/QD4+QkZKSkdFRUdGRkpOTktKSUdHSEtMSUdHQ0REREVEQUJCQ0BDREVEREVERUZDQkFFZW9wcXF0dnV4e3x6fHx+f319fX19fn59f4B/f39/f39+gIGBf4CBgICAgH+AgICAfVJJSUpKSEpKTE9SU0dGRUdIREdIREA+PDs+QEVFaHN9gXx/hH55hXFCREVEQ1d1h4iIf1hHSEpNTE5PT0xIR0hHSElJSEhHR0hIRUNFRUVFRkhKSkZFR0lKTU9PTU1LSktKTU5LSUhHSElIR0ZFRkZGREZIR0VFSEhGSEdIRlFubnBxcnZ2eXt7e3p9fX5+fX19fX1+fn1/f39/fn5/gH+BgYGAgICAgICAf4GBgIB8UEhHSElGR0lKTU5OSkxJSUpLTE5KRkNBQkNGSkdge4B/d3+EhYOEimxBQVV0h4mHh4eIg1dITE1MTU5MSkdHR0dER0dHR0ZIRkhFQ0RERkVEREhIQ0NDR0pKS0xMTExMTElKS0pKSUlJSEpISEdISUhIR0hGRkZISklJSUlIXW9vcXJ0dnd6e3t6e319fn59fX19fX5+fYB/f39+fn+BgIGAgYCAgICAgIB/gYCAgHxNR0ZIRkVGR0dKS0pMTUxLTU5NT0tJSEhKS0tMTE5bfIKCg4OFhoaIg1VshYeGhoaHiIiHfFBLTEtIR0ZGREVDQ0BBQ0NDQ0ZGRUJAPT5AQUFAQkQ/Pj9ERkhERUdJSklJSEhJR0lJSkpJSEZKSkpKSUpJSkpKRklMTEpKS0tmb3BzcnR2eHl7e3t8fH1+fn19fX19fn59f39/f35/f4CAgICAgYCAgIGAgICAgICAfU9GRkdGR0hHRUZHR01NTUtMS0lHQ0NDRElLS0xMSlWBg4SEgoKFhoaDgoaFhIWGhoaHiIaKdUlJRkI/P0A/Pz48PDw+Ojo8QUFAPjw5OTg8PD07Pjs5Oj9BQkBBQ0NCQEFCRERCQ0ZISUhISExNTEdJSk1NTk1KSktLSkxMU2xwcXRzc3d5e3t7fH19fn9+fX19fX1+fn5/foB/fn9/gICBgIGBgICAgYCAgIB/f4B+UUZFRkdJSUdEQ0VGTk1MSklIRT85Oj5ARUhISkpJZYWEhIR/gYKDgoOEhIWFhoeIiIiJiYyOZkJCPjg4Ojo5ODc4ODk2NDc5Ozw6ODU2Nzc4OTc4NzY4ODs7Oz1AOzk5OT08Pjs7PUFDRUhKTUxMR0lIT1JRUFBOTE1NT1Fdb3BydHN1eHp7e3x8fn5+f359fX59fX5+f39/gH9/f4CAgICAgYCAgICAgICAgIB/f39RR0ZHSEpIRkVGR0hMTEpJSUdDQjU2OjxDQENHSUlqhoSEgX6Bg4ODgoOEhomKi4yLiomKi4yJVDo4NjU2NzY2NjQ2NzYzNTY4Ojg3NjU2NTY3Njc3ODo3Nzc4OTs3NTc4OTc5ODc2OjxAR0ZJRklGRUZPU1JTU1JPUFBSVGVwcXN0dHd5e3x7fH1+fn5/fn19fX19f39/f3+Afn+AgICAgICBgICAgICAgICAgH9/flJISEhJS0lHSUpJSkpLREVIRUJANTc4OD06PUVDQmaFg4GAgYODg4ODhYmKiomJioqKiouJiYqBSDY3NjQ2ODg3NDU3ODQ2NzY6OTc2Njc2NTo5Ojs6Ozg5ODk4Nzc3OTo5ODg3ODU4OTtBPT4+QkE/QUtMT1FQUU9PT1JXa3FydHR1d3l7ent9fX5/fn9+fX19fX5/f4B+fn9/f4CAgH9/gICAgICAgH+AgICAf39+VEhHSUlMTUtKS0tMSUg/QEFAPDo1Nzk4OTc7Qjo9cYSAgYOEhISEhIaJioqIh4iIiYqKjIqJiYx6Pjk4ODs8PT45Ojs7ODk7OTo7Ojk5Ozo5PT09Pjs7PD06Pjs5Ozs8Ozw8OTk8ODo6Ozo5OTk8Pzw8QUJESUpNS0lLTFdvcnN1dHZ4e3t8fHt9f39+f359fX19fn9/f35/f39/f3+Af4CAgICAgICAf4CAgH+Af35URkVGSUxOTkxKSk1CPzo7PDo4OTk4OTo6Ojs/Pkh+hIKChIWFhYaIiYiHhoaGiImIiYuMi4mKioxsPDs+QUNFRUFBQUI+QEJAQD49PT5APz8/QD9APT0/Qj9BQT9BQD1AQEA+P0E9Pjw7Ojs5OTs/PTs7PT1BQUNBQkNBWHBxdHR0dnl7e3x9e31/fn9/fn19fX5+f35+fn9+f4B/f4CAgIB/gIGAf39/gICAf39/flJFQ0FHSk5PTElHSzo4Ojs5Ojo8PTo7Oz09P0BCUoKCgoSFhIWEhomJiIiGhoaHiImKi4uLioqLiotePkNHSUtKSUZHR0RGSEdFQkBAQ0VDQkFCQ0I/QERIRENFREVFQkZFRkRFRkRAQj88QD49P0A+Pz8/Pj8+Pjo7PTxgcXF0dHV3enp6fX19fn5+f39+fX19fX5/fn5+fn5/gH9/gICAgICAgICAf4CAgIB/f4B+UERAPUNIT01HRkJEOTc6Pjo8Oz4/Pz89QUBDREZYhYKDhIWFhoaHiYmIh4aGhoeJiYqLjI2MjIuKiohXR0xNTUtOSUlLSUlKSklFQ0RGR0ZEQ0VGREJISUtIR0dGR0dFS0lLSUpLSkNGQ0NEQkBBQ0JEQ0NERENAPTs9QGhwc3R0d3d6eHt8fH19fn5/f359fX1+fn9+fn59fn+Af3+AgH9/f4CAgICAgICAgH+AgH9PQT49P0RMS0BCQkE5ODw+Ozw7PkA/QT9CQkdHSVmFgoOFhYaHiImJiIiHhoaGiIiIiYqMjYyMi4uKjH9QTU9OTE5LSkxKSUlISkZER0hISUVFSEZGRUxMTUlKR0dISUpOTU5MTE5LSEZHR0VFQ0ZGRkZERUhIRkNBP0BMbHB0dXZ4eXl5fHx8fX1+fn9+fn19fX1/f35+fn5+f39/f39/f3+AgICAgIB/gICAgICAf1FBPz4/RUdHPTxAQDk4PDs7PTo/QD4/QENGSUlQX4KDhYSFhoaHiIiIiIiIh4eIiIiJioyNjIyMjIuKjXJOUU9OTExLTEpIR0VKSURKSEdLSkhKR0dHS0xOTExISElKTVBOUE5NT0tJR0lKSElESUhIRkZHR0lHQ0JBQ1VucHV3d3l7eHl6enx8fX5+f39+fn1+fX5+fn5/f36Af4B/f3+Af4CAgICAgICAgICAf39/VERBQUJHSEI/OD9AOTo8OD0+Oz1BPj9BREhKTFVxg4SEhIWFhoeIiIiIiIeGiIiIiImJjIyLjIyLi4uLi19SUlBNTk1LSkdGQkdKR0xKRktOS0pKSk1NTE9QTkhJS0xPUVFQUU9PSkhKSk1KTEZHSEdGR0hGRUVCQUJCXG9yd3h5enl5eXp6e3x+fn5/fn59fX19fn9+fn9+f4CAgIB/f39/gICAgICAgICAgH9/f39VRUNFRUdHRUQ7P0E7PTw5QD4+QEJHR0FHS0xQVnmFg4ODhISGiIiIiIiIh4eIiIiIiIqLi4uMjIyMi4uNfFhWUlJUUk9MS0pERUZLT05PV1VRUE9RU1JNU1RPTVJMUFNVVlJTUVBMSk1NTUtOR0dKRkZJSkRERUVCRENjcHV5eXp6ent6e3p7fH59fX9+fX19fXx9fn5/gH9/gICAf39/f3+BgYCAf39/gIB/f39/f1VGRkdIR0dIRj5AQj0/PT1CP0NDRlZORk5PUFRYe4aDhYWEhIeIiIiIiIiIiIiIiIiJiouKioyMjIyOi4uLaFdWa2FFUlFRUEk7O1FTUmB1XVVWVFZZWVJZWFJaZlBVV1pdUlRXUVBOUlFQUFFLTEtISEpIRUZJSUlISWlydnl5enl6e3t8ent8fXx9gH59fX19fX1+f39/f3+AgIB/f39/f4CAgIB/f3+AgH9/f35+U0hKSUlHRkZFPz9BQUVCQ0dFREVMWFJNVFVWWFt8hoWHhoWGh4iIiIiIiIiIiIiIiIiIlJyMioqMfWGKi4uHbFtkVTpYWFhTUT9AVlVZXGRgVllicl1dVl1aVkVRWVpbWV9UWmdSVlZYVVRWVE9PTUpMS0lJTE1LT01Tb3N2eHl4d3p5ent6e3x9fH5/fn1+fX19fn1/f39+f4CAgH9/f3+AgICAgH9/gH+Af39+fn5WSkpJSEdFRERCQT9ITUlNUEtJS1BUU1NYWlpcXHiFhIWFhYWGh4eHiIiIiIiIiIiIiImcnaCPiY5nO36MiYqLeW5wWFpbWlJUUlZWVFpadYNZVX2QYFxYXV9XSVZdXVtbX1lJWVhZW11YWFlXUlFNUFFNTU9TUVFVUmFzc3Z3d3Z4eHh6e3t8fX19f39+fX59fX1+fn9/gH9/gIB/f3+Af3+AgICAf39/gIB/gHh5fVlOS0lJSEZCREBBOlBRUVdYUFBPUVNUVFhYWVpbboGCg4WEhYaHh4eHh4iIiIiIiIiIiJaanJeIioFuhomIh4OKf2ZZWVxZU1VUV1JRV1ZjloBRZXJYWldfZ1BgZltbWFxnYUdPWmhnXFtcXV1XU05TUFBRVlZWVllabnJ0d3Z2dXh4eHt7fH19fX5/fn59fn18fn9/f3+Af39/gH+AgH9/gICBgYB/gH1yfX9/b3R8XVNQT01LSkVDP0A7UFBaWltSU1FPUlJSVVNWVFdfdXiAhYSEhYaGhoaHh4eHiIiIh4eIh4ORjomJiIaFiIiGfYB7XFBVWFRSVFJRUUxPTUtmeVtdVFlVVl1aTFRaVFNUXlpYV1dXemtYW1tcXlRRUVBJTk9XVlhbWmRxc3Z2dHR2eHl5e3t8fX19fn99fX1+fX1+f39/gIB/f3+Afn57eHd2c3V7f3+AgHRrfn5rcnleW1ZVVFJPS0ZDREFNXoNsVlJTTk9RT1FVUlNSUlRjZHaAgoKDhISEhIWFhISDhoaGhoeIhn6JiYmHhoOHh4d5bXFWSUtNTktNS0hKREZIRUM+VGNVf1JRUU5LUlRRTU9ZUU1OUVNVVU1RU1JQT01MSENJSFJUVVpcbXJ1dnV0dHd7enp7e317fX19fn19fX59fn9/f39/f399fX5+f39/f4B+e3Zzd31+fmR1fWlxdF9kXV5bWVZQTElMSWFsknRQUVNOUVJRUltSU1JRUlZUYnN7fH+AgYKBgX99e3uAf4OChYaHgoaGhoGEgYaFhnVfXUtDP0NDQ0NCP0RQQkNAQz5CSEdWQEhOTUddaVFIRk9GREVGSEdIQ0RIR0hLR0RCQURBT1FNU2RzdHZ1c3R2enx6e3t7fHx9fHt+fX19fn5/f3+AgIB/f3x8fX+Af39/f4CBgH12dHt/bWh8Z25xZmllZGJcWFNRUFVSc1dlW09PT0xRU1FVWVNVUVFUUk9WYGtscnZ7e3h5dHJuc3RzeXh+foOAg4OCgIKAgoGCbE1HPj87Oz5AQD8/PmpRS2FFRkhJRUI/R0xNR01RVUlCRT8/PD08PT0/PT9BQ0NAPzw9Qj5KTUdVbnV1dXN0dnh6fHt9fHx9fX19fH59fXx+fn9/f4B/f39/enl3eHd2dnh7foB+fXt4dnx1YXhnbHBqbGppZmBbUVJaXFleSkpQUU5LTFFSUVRVVFdRUVdVUFhbYl1hZ21tbG9rZ2BucmptbHF1e3p9e3h6fHx4d3hlQ0BAQj06QkNBQURCXF1Pe05PTk5LTE1PT1FMS0xXTUhHQEE8OTc3NTk5PTs7Ozg5ODk/O0JIP1xzdHV2dXZ4enx8fH18fH19fX58fX19fX9/f39/fn9/f314dXZ6e3p3eXh1d3t8eXh1eXdjcWhpcG1ubW1oZl5PUF5cWklIUFJRT01QUU5RUlRWWFNSWVROWVpbV1ldXl5fZWBdXnF2a15gZ2t3b29sam9ubmxmYllIRkZIQkFHSUVFRkRNUk9hV1JXUVBTU1JVW09PUVdQTUlERj46OTY1ODc5Nzk6MzY2Nzk1PEI9ZXN0dnh3eXp7fX18fHt8fX1+fnt9fn19f39/fn5+fn9/e3d1eX18enh8fHx8dHd2d3Z1d2tuaWhxbm9vb2prYFVXXlpXTUxUVFNRUVVPTFJTVFdYVFRYUkxYWVpWWFhWWFldV1hYaHNrXVZhc2thYV9eZGFfXllVUU1PTkxJSEpLSUhGQ1FQU1tXVFROUVNZU1xlVU9TVFFOS0lIQz9BOTk4ODk3ODg1NzU3ODU5OUdtcXR4eHp7e31+fX18e318fn5+en1+fH1/f359fn59f358dHR1e3hycW9vbnR4cXJzeHZ1cWZkZ3JucHBxbm1kXV9fWVdPUFhWVlNUVk9PVFZYWFlTVlRMS1RVVVVVV1BUVVdUVVJdbl5STllfW1ZZO0RWWFRbZkpMUFJST01NTk5OTEpGUVBVWVNUTkpPT1VTVFxWUlVTUk9NTElISEY/Pj06Nzg3NjU5OTY3Njc1V3Bwc3d5ent8fX19fXx9fXx9fX15fX18fn5+fXx8fX1+fXxydnF4eHJ2dXFxbnBwb3B1dnRuamRkanBwcXJwb2ZlZGNcXlJUWlZXVVRXVFJYWFlZWVJVT0lHT1BPT01SSk9QUFBOTk9UTE1JUE9TVFUyPVhNSUFRPWNhUVNRUE5QUVBOTk1RTlRSUFJNSUxLT1FQUlJTVFFST0xMS0xMSENCQT06Ojg3NjtCNDU2Njpkb3F1d3h7fHx9fnx9fH19fX18e3h8ent9fX58e3l9fH18e3B1b3d1cHV0b3N2cHFxcHR1dmNqZ2VXaHRycnFuaWlocFZWVFVYVVZVUldWVVpZWFdVUVNGRkFGR0dIRkpESEpIR0VITEhLSUZMTVBNRy9FX1I+M0A+am9hUlJRQEZVUVBRUFFOUU9QT0xKTExPUE5OUFFRTlBPSkxNTUtHRUVEQjs9PTw5PUc2Njc3RG1wdHZ5e3t8fH18enx8fX5+fXt5dnh3eXl8fXp6dn17fHp6b3Fud3JwdnFtcHNwb3Bzc3N0ZmdgaFpXa3JzcmxtbWtuYWVQU1RSU1RPV1dWWVlWUVFRT0A+Oz0/QUJBQ0BCRURBQEdIR0hGRkhKTUtFR0NPUkM4RU5TXWZTUVNBR1VQT1FRUE1NTk1LTEtMTk9PUU1PT01ITExJS0tMS0dGRkVEPEFBPjtARTs8ODlTcHJ1eXt7e318fHt5fHp6fn58e3V0dXJ2dnp6eHpyfHt8eXltcW94cnF1bm5xcm9vb3Rzc3J1dGtnZ15lam1wa25xbWltY0xPT01RU0xUVlRXV1VMTEtJPTk4Nzs/QD48PUFAQj0+RUhHQ0ZGSUdKSkBGQUFARkhFSk9IUFJiXFFQUk5TT09QTExPTUtNTE1PTltXS01RT0dJSENJSkxMSkZGRkU/QkM+PEJGP0I/QWRwdHd7ent7fHt6end8d3l9fnt7cXN0cHJzd3R4eHN6e3l2d2xxb3ZxdHRsb3Fybm5vc3ZydHNycmtsZW5zaG1ubWxtbGprSUxISE9RSlFTUVRTT0tIQ0U9OTg3OT9CPjs/QkBAPkFESUVDSEdJRklFQkI/Pj1DQkFHSkVNT2JlUU1OTldLTE1LTE1NTUxLTk5TZE1KTFJJSUlFQUhKTE1OSkdJRkJBQkA/RUZFSERLbm92eXl5e3t6e3p3dHh0eHx8eXpucXJtbm9ycnZyc3h8eHZ2bXBtc3B1dGxwcHJvb29ydnVyVlZucWdseYRqbXFybm5qaG9ISkNHTE1JTVBNUE9IS0U/Qj05OTk6P0I/PEBCQkFERUdLRkNISUdHSENDP0I/P0BBPkRFQ0tOUVRMSklNVEdJSUpMSktMSUpMTU9QUlBLR0NMR0NCSkpMTU9NSUpJR0NDQ0RISk1MSVlybXd5eHp7e3l8dnJwdXJ0eXl2eGpxbmtsbG50dG10dXtzdHhyb25xb3ZzbnBvcnBvcHN0eWpOYGdzanR8eWdvc3FpcWhlcUhKQ0dISEdKS0lKS0RHQj0+PTo6OjtAQj89QkJCQ0hGSkxKRElJRkdHQ0M7QUBCPkBAQ0RDSU1QR0lLR0hLREhJS01ISkxISUpLSk1dUkhIRE5GQUNLS01NUE5LTUpLRkdHSk1OUU5MYm1pdnZ3e3l7en1xbWxza3B0dHR1aHBtamlra3RwbnR0eXByeXRvcnFvd3NvcXB0cnBydXR5a05WbXVscXt2aW5vaWp0aGRvRktERkVHRUZGR0VHQkNAPTw9OTo6OkBDQD5CQ0RFSUZKSkxGSElHRkZEQjtCQ0M+QEREQ0VHTE5IS05IREhFSUxOTUhJTEdGR0lJTE5LSkhFTklCRk1MT01PTU5OTUtJSElPUlFSTlJmZmZxb3N4dXt6fGxoam5ma3Btc3FmbWxoaWtsdG1wdXR3cW94dG90c3J2c3BxcnRzcnR1dXZ2WFZ1dWtvdHJrb3ZsaG1lX3BHSkNFRkVCQ0JFQERCPkA/Ojs7PTo9PkNBPkFDRUdKRklIS0hHR0dGRUNAPUVFQj5CRENDRUdISUdNUEpGRkdLTk9LRkhJRkVERUlKSEtJR0hQS0RJTUxQTU9OT09OS0pITVJVVVJPV2RgYW1ncHJvcnl6Z2VoaGRpbGdxbGZsbWdpa2xzbHB2dXRwbnZyb3Nyc3V0cXNzdXRzdXZ2dnl2dXR3bGp1dW1ydnFsbmxlckxIREVHQ0JAQkQ9QkE+QD06Oj0/Oz4+QEI+QUJER0tGSUZJSEZGR0VDQ0FBRkZDQkNCREVFR0dIRkxRTElPSkpMTElHSEVGRURDSUlIS0pHS1JNQk5PTVBPT09OT09LS0tPVVdWVVRYX15caWFtaW5ocnNiZWZlZGloZm5pZm1taGtrbXJpcXZ1c3Ftdm5vcXJzd3Nyc3R1dnZ2dnd2d3Z2dHd1anN1bnV0c3FyamtzTUdHRkhCQkBERTxBQEBDPDg5PT45Pzw/QkBAQERGSEVIRkZIR0VFRENFQ0RJRkNGRUJFR0VGR0dFSk1LSFFNSktISElFRkhJRkNJSklLTUtQU05EUVJQUVJOT01OUE1MTVNXVldYVlhdWl1kYGhiamlna19lZWZjZ2dna2dna21rbWxwcWd0dHVyc252b3FwcnR4cXNzdXZ1gpF5dnZ0eHV1d3htb3VvcnN1cXFpb3pNSEdISEJCQkZFPEBCQkQ8Nzo+PTo+OkBCPj8/Q0VGREZEREhGREVDREVFR0pFRUpHQ0dIRkhHRUNGSkpHTUpMS0hKTEZJSUtIRUtLTExPT1JUT0lTVVNRU1BRTU5RTk1QV1pWWllWWl1aWGFgYGBeaGVjYGRmaGdpaWhqZmhubGxubXFwaXV1eHJycHVwcHBydXZwdXN1dnV7fn14dnR3dnZ2eHBsdXBtc3VucHJzeU5JSUdJREFDSEU8QEVCRT04Oj4+PTw8QUI9Pz5BQkZDRUJDSEVDRUVGR0dHSUZIS0hDSUhHSUhGREhLSUdLSE1MSktMSExLTUtKTkxPTlBSVVZPS1VXVFFUUVJMT1FQT1RZWlpcWllcXl5eYGNeXGFja2JgZGdocoVoZ2pmam1ucG9uc3JqdHV4cnNzdHJucHF2cnF1cnV1c355jn11dXZ2dnZ4cmh1cWtydGxxdnB1TUlLSEpGQkVHRTxAR0NEQDo8PkA/Pj9CQjxAPkFBRkNFRERJRUZFR0VISEZIR0lLSkZKSEhLSEZGTEhISEpHTExMTExJTUtNTU1PTFBQUVVWV09LVlZVU1NSUUxPUlJRVltbXV5bXF5fX2FgYWRdZGBlZmBlaGpjc3NmamhnbHBycW9zc25zd3dxdXZ0c21vcnVvcnNwdXJ2cnSBdnV1dXd2dXd0Z3Rya3Fya3J3b3ZKS0xKTEdCRURFPEBGRERDOz8/QUBAQERBP0I/QUNIQkZFRkhGSUZGRElIR0lISk1ISEpKSUxKRkpLSElKSkdLS01NSkpNTE5OTlBLT1BSVVhWTU5UVlRTUlFQTE5UU1JXW15eX11dYF9gYWFfYWNlYmNoYmRpamd2i2xraWdtb3NxcHFwcHJ5dnJ1dXRzbW1zc21xcm90dXRycHN3dHV1d3Z1dXRlcXNrcHFqcnZvd0tNTExNR0NDQUQ8P0VFRUM9QUFDQkJDRUFCREFBRUdDR0hHR0ZKR0NHSkdHSkZJTEhJSk1LTUxHS0lIS0tOUUtSUU1TTUtOTk9QUE9UT1dYWFtOU1FXXFpTVlBOVFVUVFhaX2JiX2RhXmBiXmBlYWFjaW5nYmloaG54dmxoaW1vc3JwcXJycnZ0c3Vzc3Nua3NxbXByb3R2cnFxdXZ1c3d5d3V0dWNtdGtvcGpxdG93TE5MTExHRUFARD4+REVGQ0BDQUVEREZCQkVHQ0NJRkNISkpJSUtHREtKR0hKSUlLSEpKTkxOTElMSEpMS1pmSmRcS2xTSE9OX25Va3NbcXBid2NSUGF2dWh1Y2F2YFhucWJkdmluemZbbHRgbGpUX3d2aWpnaWZnbG1qbW9qbW5zcnBycnFyc3Jzc3J0cm5sdG9ucHFxdXVxcXN0dnZ1dXl3dXR0YGt0a3Bwa3FycXlMTkpLSkZCP0BCPz1ERUZEQ0NCRUVERkJFRkhDREpFRUpMTUtMTEdHTUlHSUtIS0tJS0pOTE1NTExJTE1MW3NiZHBebG1VTU5mc11nZXFsbnRncGlfYVlubmJwcGJrampnb3F0ZXRub1xvdWdwTUpyeXZrYmBrZWVteG1rdm1ucHNycHJxcHFycXJycnRybW1zbm5vcHJ1dHFzc3R1dXV0d3h2dXRibXVrcHBscnJxektMSUlHRURAQUI/PkJGR0JGQ0VERUVEQ0hIR0RFS0dHTE1OS01NR0pOSEpLSklMS0pKS0xNTk5NTUpNTU1bcm9vbnBwbGtNUFFsV05pYnRycGFtb3ZcWWxRXG1tWnFta29teHh0c2lwXF9ya3FqVXV5eHBjXmtmYmdwcGppb3BwcnNwcXBxcXJycXFycnRsbXJtbm5vcnV0cXRydHV1dHV1enZ1dGVudWtwb2xzcnJ5SktHSEVFRUJCQj1AQEZHQkdESUVFREJGSUhIRUdLSkdNTU5LTU5HTE1JTEtJSk1JSkpKS09QT05NS05NTFxoZHVdbHFXbE5QUW1VWmtea2x2YWxkdFRlY05tWWxcdHBraWx4and1aHBdXnJraFdiY3d8b2NgZ2dhZGl0eWtubnFzc3BxcHFwcnFwcHBydWttcW1tbW9xc3Rxc3J0dnZzd3Z6dnV0aG91bHNvbXNydHZJTUdJREVFQ0FCPEJAQkZER0ZMSEVDQ0hLSEhGSkxMRk5LTFNSTEdMTEhOSkhITkhKSklITk9NTkxKTk1KWnNwcG9xcW1sT1FSbllxa2dvb3Fxb210Xm5YYXRfbm9wb3Fyb251c3R0altddGN3eHJqbnpoYWFjZmJiam10dXBzdXZzcXBwcW9ydHt/fn13bGtxbmxtbnByc3F0dHN1dXR4eHl4dHVrb3VtdG9uc3N2c0hLSElCRUVFQUA+Q0RCR0NISU1JRkNGSkxJR0ZKTUxGT0pLV1JLR0tKSk5JSEpMSUtKSUhKTU1NTElLS0tTa2JaaV5faWNyclpfWWpvX2VlVWtfY1thYVFgbGhdalxvamlkW3BmZHBdWlxrW21xY3BzbGRnY2RnYGBrbXBwb3R5cnVxb3BxbnmFiIeHhoWAdnNua21tb25xcnR0cnR1dXZ5eHhzdW5xdW53cXJ1dHdySEhGSURFREZBQEFFRURHQkhKTEhGREdLTElFRkpPTElQSUxbUUpGSEhLTUlISklLS0lISUdLS0xMRkhLS0xMTEtJS0xOVFtcVFBUTFBPTk9PVlFPT1FOT1FKSU5QUWVyaVRZV1xbXFVZWl1YXVxcY2ZhYWViY2VfX2ZrbWhtdHlydHJvcHB0hoeGhoaFhYaHg3pwbW1sa3FzdHRydHZ0dXl4eHV2cXJ1b3ZydHN1dXNIQ0VHRkZBRUM/Q0hERkdESUtMSEZER0tMSERHSFBLTE9LTFdMSUZFSElKSElLSUxKSEZHR0lHSElFRkxJSktOTElPXFdeUFxbYF5PWFlTXFxiXk1ZWk1YYVJKWWFaU2BkXGFYW2RkVlZYXFlaWFxWWVxdYl5kYGFfZWhrZ210dHFxdHBxcoGGhoaFhoWFhYaGhoR9cmtpb3Jzc3N0d3l5eHl4d3h0cXhyeHNxcnVydE9CQ0RMTUJDREJFSUVHR0ZLSktIRUVKSkpHRUhIUEpNTUpNU0lIRkFIRkpJS0xJTEpIRkVJR0RGR0VFSkhDSk1KS1RfWWBYYGFbYFVYWVReXlpfUllcUF5cWU5eXF5TW15jXlpdYGNgWV9iW2BeW1RYV1leXWNiY2FjZmlla3Jwb3Bwbm93hoaFhYaCe4CFhYaGhYaFf3VxcHJyc3Z5eXp5eXh4eHdyeXZ4cnF4dnR2YVNKSk1JRUNCQ0dHRUhHSEtJSUlERktLS0ZGSUpOS05MSExOSEhGPkdHTElLTEpLS0lHRUlEQ0REQkdKREBKTEpPW2NZX15hX1JUUldfYFxdWV5RWVxNVl9XS1FZW1BaX2FhXl5jYWBiYmJjY2VaUVlWVVxaXWNgX19jZWJob21ubGxsbHWFf4SDeXV8hIWFhYaGhYWGhoN9d3JydHd5eXl5f359eXV5dnZybnp3dnhYUUtGQ0dFQkVISUZHSEhGRkpHSEZIS0lMRERLSk1NTExISkpISkc/R0ZOSktLTUtLS0lHR0NEQERBSElCP0lKSE9dYVpbZF1fVFFSWF1cXFxfWktXXExSXFlJTl5RT1xfYWNkY2NiXGRjYmRjZlhRVVRSW1haYV9eXmFhX2Rsa21qamxudn51gXp8hIWFhYWFhYaGhYaFhoaGgnpyc3V1e4WHh4eGhYSBfnhwend2eFxSTUNASUZDRUtKRkZGSEdHSUZGRklMSk5FREtKTE5KTElLSkhJRkJISFFNS0tPTUtLSUhHRUQ/RUNJSEFBR0ZFVF1ZXlhfWV9bXVVYWFBdXVFLSlZeWF5bXVZZYFJRX19hYmFgYmJgY2JhZGRiWE9RUVFbU1tdXV1dXl9fZGhnbGpubnB7e3x+e4CCg4SFhYWFhYWEhIWDhISHh4FzcneFh4eHh4eHh4eHh4WDgHx4XFNLQ0FHRkRHTVJIQ1FKRkhISEVGS0pNUEVHSUpLTkxMSUxLSUlHREhLUU9NTVBMTUtLSElDREFFREhHQkFHRUNXVUVcVF5TVl9YTlRVTlpbTUpLVGBhW19YXl5hXU9ZYlxgYF9iY2JdYWJXX19UUE5PUFhSXVtbXFxeYGJmZmVsZm9vd3x7gHt9f4CEhISEhIWFhYODhYKDgoWFhnpvgYaGhoeHiIeGhoaFhYSFg35JTkZERUZHRElSYlBDVl5JR0dIREZNSlBQRUlJS0tOTEtLTUxKSkdFSk1RUU5PUE1OTE5IS0FEQUNERkRDQUVGQk1IQktMUE9OTEZNRkdJSkhHTExNT1BJTE9QT1NQTFFTUlVaWVdZWFhkV09TVFBQTk1PVVRbWVlbXVxgYWRlY2dja2xwc3N6eX97en+EhISEhISEhIKEgH57gYOBfXuFhIaGh4eHhYWFhISEgoGAfUtJRUVHRkdES01dTEdHWE1HSEpIR01MUVFJTEtMS05OVU5PS0tMR0dLUFRTTlBPTk9OT0hLRmBFRF9MRGZjRU1bSV5bcm1PTVVtWUxDUGBVbFdnSl1XVV5ETFFVTE1UVlFSVFhXVFhVVFxVUGZaaGhkWFNrU1ZWVVtcW2BgYWFhYmBmaGZubGhyenx9foGEhISEg4ODgX18enJ7gXp7f4KAg4SEhYWBhIWBg4N/fnp7TElFRkZIRUVLT1NJS0ZgVEhKT0pJT01SUUtNTExPUlVST09KTE5HSE1RW1lPUFBOT1BPSUpRf1FJfFlZcnNYUG1IcW5vYVZQcXFzUENrc21xdHBTb19bblhdVlxYVWtoVV1WY1pgWVtgVlVXf2p0dXVfX3ZfWGFcXGZbX2FhYWFeYGJnbXBsYHB3dHiBgYKDg4J/fX6Adnh6bHZ+dHh+gHx+gIGChHyAg3p/gX9+d3dOSUVITU5CRExMRkpMRlJWTEtOSUtSWFdRTk9PTVFUTk9RUEtLTkdNUFNbWlRRUk9QUFBKSFp4XVR4ZWhZUlRRdmd0bHBibmZqUXJPTXdtanJwc3JxcnBvb4BdZnp1eHFxenF+c31rdX1iUmd8ZXNzb3Nye3xvfXlvf3JfYGBiYVpgYGdrbmtibGZnbXd+gYCDfnt4d4B0dnppcn5udHx+d3h7foCDeHyAdXx/fHxzc05LRmBdR0FFTU1IS0tISlBOTU1KTlZeWVVMUVNOWVpNU1NSTkxPSVFSVFlXV1BUUFBQUUtIZ3hsY3hybVpLTVV5cHVtdWJudlBkZUpmdnFtd2+AamZ4eGlXclJpe2xpanp6fWx4en9waG9YdnZqdXVwgGByZ31pbHh8b15fX2JhW11iZGdpamRnYmNkbGxwcHN0c3NzeXFyeGJsdWdyeXtzc3V5foFzdXpufH15eHJuTktTdE5DQkVQUEhKS0pMUU9PT01QWmBaWEtUV1BhXlJWUVlTTE9JU1RVWFdXUFVQT05SSktyb3V1cXVxZGliV25McXBeRmh5V3ZUS2h4fXhgeXtzbmFebW9jUmdxdW5teXB3bHZ0dHFsbVx0fnprbXl8a3RtfGtwdnV4Xl9fYl5dX2RkaWdoZWVeYWJpaWlqa25va3FubWpwYWNmZG93eG9tcHN5fm5xcGp7enRyb21MTFtWSEdFR1JQSUxNS0xRUVFQUFFXXFlVTVVZVWZYUlJZXlRNTklUVFZXWVdPU05OTlFIUm1IaXdLYGR2dlZYbE9ubHtzYWpnf3ZVS1draH1sbWx4YFtwenteYHpzY3JveHFoZXxpcnxdVEtsYHZ1a2l2fHttfnhrfHBdXl5iW19iZGRnZWVlYlpjY2lra3JzcndnbWloZGdgYWxhZ3NybGdtbXJ8a21oa3t0bW1rbU9ISktISUlIUVBMTk9MS1NTU09TUldSVlRQV1tWVlRUVGFgUE5OS1RTU1FVVk5OTE1PUEpIUU5QVUxLS1NUU1JUUFZVUVFOUVFYWFFOUFVUWFhYW1tVUlNXW1dYV1pPU1VXV1hSXVlXXVZUT1lSV1dXWFleW2dyXltbWVxdX2NaX2NjZGZkY2NiWmNjZmZmbW5tdWZmZ2NgZl9dZ2BkbGhmZ2tocHpoZ2drdWpoZ2lsUUlLTExNS0pTUU1RUE9MVlVUUFRVWFVZVVFaXVZVVFdVWVhQT0xNVlRRTlVTTk9NTFFQS0pSUktRTUtLT1JVUlFRU1NJSExOT1FSUVFRVFZSWFdcV1NTUFFVVlZTWlFPU1JXVlRZVlRZVVRSVVRUVFdYV11aXmFdXFpaXFxgY1xdYmNkZmRlZGFZYGFjYWJoaGluY2FkXl9jXVpkXGJtYV5mZWZtc2RpaGtrZWRjZmhQSktMT09MTVNQTlNRUU1YV1VUVVdXV1pVU1xgVldWWVVYVFFQS09XU1BOVVBOUU5LU1BNT1ZUTlFOTU5RVFBVUVNUVU5LTU9RVFRSUlFWV1VZWltZU1VSVFdXV1lbVE9UVVhVVVpVV1lVUlJYVlVXW1laX11VWV5cXl1cXWBhXltiYmNnZmRkYlhfYWJeYGhlZmRhXl9dXV5aWl9aX2dgXl1dYmhrYWdmaGZkYGJjYVBLTUxQUUxPVE9PU1FPUVpZWFdYWlpYWVZcamRWWFlaV1ZUVFBLT1ZUUE9UUFBQTk1RUVBSWFRRUU9NT1NWTldSVFVVT05NUVNVVVRUUlRYVlpdXFpWV1FSV1hWW1tXUVRWVlZWWVRXWFVTUlhWVVpdWV1fXlZeXV5gXFxgX19fWmJiZGhnZGRhWWJgYl5eZmNjYGJdXFxcXFlaW1hbYVteXVxfYl9fYmRlYmRfX2BcUE1OTlJRTVJST1NUUVBVXFpaV1tbXFlaW2RxbWhkX1tZVlZYUkxNVlNNTlJPUVJPTFBTUlVaVVNQUExQV1ZSV1NTU1hNT1BSVFhVVVVTVVlYW15dW1tWUk9VVlZbW1dSVFdWV1hWVFhbVFNSWldWXF5aXl9gVWFcYWFdYGJgXWBdY2FjZ2hkZmBZY2BhX19lZF9gY1taXFtcWVpYWVdcWVxbYF5fW15eYWBfYlxZYFpRTk9OVlFQVFJPVVRTUFdcXVxYXlxfV1xeanF3eYBjXFtWVllRTk9WU05RUVBSVFJLUVRUWVpXVU9STlNYV1RTVFJSWk9RU1NWW1ZWV1RWWlhdXlxcXlZTTlRVVlxcVlJUVlZYWVNUWVxUU1NdWFpdXlxgYGBWYltjYl5hY19dYmFiX2RmaWRmXltkYGFgYWNlX2JfWVpeW1xbWVhZV1daWlphXF1bXVxcWl1gV1tbWlBPT09ZUFVVUlFXUlRQW11eXltgXGBVXF1panJ9c2xnXFVYV1FPUlpTUlFUUlRVVEtRV1ZbWlpTT1NSVlZWVE9WUlNaUlRVVFhdV1hYU1hcWF5dWVpdVFVOVldXX1tYUlVVWVlZVVdZW1RTVl5ZXV1gXWJiXllgW2ViX2RkX15jY2FdZWZpZGZdXmRhYGFiY2RfYl5YWl9bXFtYWFhYV1taXGBcW1tcW1haW15WXlldUE9PUlpQWlRVVlZUVFReXmBfXmJcYFVdXmJreXVtfWxaVVlVUVFTXFRVVFVUVllXTFJaV11aXFJPVVNYVlZUUFhSU1dTVlVVW11YW1lVWl5YX15ZXFlSV1JZWFlfWlpUVVZaWVpXWFlcVlRaXlxeYGFfZGNcXl1dZWFiZmReX2RjYFxnZGhlZGJfZGFfYWBiYl9gXldYXlpcXFpZWVdWXVpdXlpZW1xbV1lcXVZYV11TT1BXWVFdVVZZV1dVWF9gYWFgY11fVF1fYmVldoJ7aFhZWVNWU1ZcV1dXVlZXXVhQVV1aXl1dVFNYU1dWVFNUWFJTVlRYWFhdXlhdW1ZdX1hfX1hdVlFZVFlaWmFZXFVWWFtaW1lZWlpYVl1eX15jYmFkZFxiXGBmYWRmZF9gZGJiW2ZjaGVjZmFmX19hYWFhYF9eVlVdWVtcW1lbWVldW1tbWFhZW1laWl1fXVRZXVVOVFpWU1xUVldZV1ZcYGFiY2FjXl9WW2BkYV96dW9oWVxaVVdVV1taWVxZWFlgV1BWXlxgYVxUVVhQVVdVU1dWUlNVV1paXF9eWl9cVl9fWl1eWV5WU1lXWVpdYlpeVldbXFtcW1tZWllZXl9gYGRiY2VlYmRaYmZjZ2ZlXmFiYGNeY2NpZGRnX2deYmJjYWFgXl9YVFpaWltbWFtYWFxbWltXV1lYV1xbXGBdVl1dU1BWWlZWWlVYVVhXWF1fYmFkYWRgXllZYWRiYGtmaF5cXVtWV1hZXFxcX1tZW2JWVFheXWFjXFJWWVFXVldWV1ZUVlRYXVxeYGBdYVxXYV5bXlxbXlhWWFhbW19gXF9YWV1cXV1eXFpcWFtfYV5gZGNkZmZmYlljZWVoZ2ReY2BgZWNdZmlkZWlfZ15jYmNhYWBfX1tYWVtZWlpYWVhXW1taW1dYWlRZXVxaYFxVXmJOUldZVldaWFtcWFdZXmBiYWVhZGFdXlliY2JfYWBhXlxcXFdXW1tdXV9fXFpdY1haWF1gY2RfUlhZUFhXWFlZV1ZYVl1dXmBhYF9iXllhXV1eWV1eWVhWV1tcYF5dX1paXl1eXmFcW1taXGBiXmJkY2VmZWZiWmRmZ2lnY19jXmFmZFppaWJmaWNlXmJiY2FgYF9dXVpXW1lZWFhaWFdaW1pZV1hWVVtdXV1gYGJieExXV1xZV1xbXF1aV1xdX2BiZGJiYV1gWGJjYmBjYWJdW1xbWFdbXF9dYF9dW2BkXFxYWmNlY2BSXFlPWFhaW1paV1pZYF1gYmJgYWNfXGJdX11bXl5ZWVVYXV5fYF9fXFpeXmBiY1xcV1xeYGJiY2VkZ2VlZmRcZWZoaWZjYmJcY2dgXGlpYmhpZmVgYmFjYV9gX11dW1lcWVhXWFlYV1xbWldXWFBYWl1hY2Zmcmt/SllXXVtaX1xbXlxYXVteX2FjYmFhXWJbYmRiYGNjYlxbW1pXWGlxYFxgX11cYWNfXllZZGVkYVNfWlFZWFxdXFtaW1tjYGNiY2BiZGFgY15gXF5eX1pYVltfXl1hYV9dW2BhYmViX11UXGBgY2RkZmRnZmVmZV5lZmhoZ2RkYFtmZ15haGhjaGhmY2BiYGNiX19fXV1cWltZWFhYVlpWXFpaVlZVTVhXXGdpa2h1eIF2dnZ2dnZ2dnZ2dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6e3p6ent7e3t7e3t7e3t7e3t7e3x7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHt7e3t8fHx8fHx8fHx8e3t7fHx8fHx7e3t7e3t7fYmIhoqHhYKBgoOCg4OCgoKCgoKCgoKCgoGAgYCBgICAgYCBgYGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t6e3t7e3t7fHx8fHx8fHx8fHx7e3t7e3t7e3t7e3x7e3t7e3t7fHx8fHt7e3t7e3t8iYmHiYaFgoGCgoGCgoKCgYKCgoKCgoKBgYGAgICAgICAgIGBgYB9fHx8e3x8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eHh5eXl5eXl5eXl5eXt7e3t7e3t7e3t7e3t7e3t7e3t7ent7e3t7e3t8fHx8fHx8fHx8fHx7e3t7e3t7fHx8e3t7e3t7e3t7fHx8fHx7fHt7e3uHiYiJhYSDgYKCgoODgoKCgoKCgoKCgYGBgICAgICAgICAgYKBgH58fHx8fHx8fHx8fHx8fHx2dnV2dnZ2dXZ2d3d3d3d3d3d3d3d3d3h4eHh4eHh4eHh4eHh4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t7e3t8e3p6enp6ent7e3t7fHx8fHx8fHx8fHx8fHx8fHx8e3x8fHx8e3t7e3t7e3x8fHx8fHt7e3t7e4aJiYiFhYOBgoKCgoOCgYKCgoKCgoKBgYGAgICAgICAgIGBgYCAfnx8fHx8fHx8fHx9fX18fHaIi4uLi4uLgX19fX19fYSMi4uLi454KSkqKiopKz0/Pj4+Pj5tgH5+f397pdfT09PT1r2GiYmJiYmJjI2NjY2Ni7DBvr6+vsGiioyMjIyNiX5/f39/f359fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx8fHx8fHt7e3t7hIuHh4aHgoGDg4GCgoKCgoKCgoKCgoGBgYCAgICAgICAgYCBgIB+fHx8fHx8fHx9fXx8fH19doyQj4+Pj5CDfn9/f39+hpCPj4+Pk3kZGhoaGhocMTMzMzMzMmqCf4CAgHut6eTk5OToyomMjIyMjI2PkJCQkJCOu87Ly8zMz6qNkJCQkJKLf39/f39/f319fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e3uCjYeIh4eDgoSCgYKCgoKCgoOCgoKCgYGBgICAgICAgICAgICAgH58fHx8fHx8fXx8fH19fX12eHh5eHh4eHd3d3d3d3d4eXl5eXl6d29wcHBwcHBycnJycnJyd3p5eXp6en6Dg4ODg4SBfHx8fHx8fX19fX19fHyAg4KCgoKCgHx9fX19fX18fX19fX19fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e4CMhomHh4SDhIKCgoKDgYKCg4KCgoGBgYGBgYCAf4CAgICAgICAfnx8fHx8fHx8fX19fX19fXZ2dnZ1dXl2dnZ6e3h7eHd2eHt4eXl6fnx5eXh4eHh5eXl5enp5eXl5enp6eXh4eXl5eXl7e3t7e3t7e3t7e3p6enp6eXl5eXp6fHt8fHx7fHx8fHx9fX19fX19fX18fH19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8f4uHi4qIhIODgoKCg4KBgoKDgoKCgYGBgYGAgIGAf4CAgH+AgYF+fX18fHx8fHx9fX19fX19d3d3dnZ3fXh3d316eH14d3d5fHt7e3l8e3h3d3d3eHh4eHh5eXl5eXp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fHx8fHx8fHx7e3x8fHx8fHx8fHx+iomMjImFg4SEgoKDgoGCgoKCgoKBgYGBgYCAgICAgICAf4CAgH19fXx8fH19fX19fX19fX13d3d3d3p9eHt4fHx3e3h3d3d5fHp7eHt6eHh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fX19fXx9fX19fX19fX19fX19fHx8fHx8fHt7fHx8fHx8fHx8fH2Kio2NioWDg4OCgoKCgYGCgoKBgoGBgYKBgIGBgICAgIB/gIGAfXx9fX18fX19fX19fX19fXd3d3d3fX55d3d4e3p7eHd3d3x5eXt3fHl4eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt8fHx8fHx8fHx8fHx8fH19fX18fH18fH18fHx8fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8foqJjo2JhISEg4KDgoKBgYKBgoKCgYGBgoGAgYKAgICAgH+BgIB8fH19fX18fX19fX19fn5+d3d3d3d5fHl7eHx9eXt5enp6f3t5e3l8eHh4eHh4eHh4eXl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt7fHx7fHx8fHx8fHx8fXx8fX19fX19fXx8fHx8fHx8fXx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx/iIeNioeFhoaDg4ODgoGBgoGCgoGBgYGCgYCAgoF/gICAf4CAgHx8fX19fX19fX19fX5+fn53d3d3d3Z4eHl3eXp4enh5eXl8e3l5eXl4eHh5eXh4eHh5eXl5enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX18fH18fH19fX19fH19fX19fHx8fHx8fHx8fHx8fX+HiIyIhoeHhIKDhISCgYKBgYKCgoKBgYKBgIGBgYGAgIB/gIGAfHx9fX19fX19fX1+fn5+fnd3d3d3d3d3d3d3eHh4eHh4eHh4eHl5eXl5eXl5eXl5eXl6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fHx8fX19fHx8gIeIi4eHiYaDg4SDg4KBgYGCgoGBgYKCgYGBgIGBgYCAgICBgX97fH19fX19fX19fn5+fn5+d3d3d3d3d3d4eHd4dnl5eHh4eHh5eXl5eXl5eXl5eXl5enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fH19fXx9fXyBhoqKiYmIhIOFhISCgoGBgYGCgYGCgoGBgYCAgYGAgIGAgIGBf3x8fX19fX1+fn5+fn5+f394eHd4eHh4eHZxZGpeam15eXl4eHl5eXl5eXl5enp6enp6enp6enp7e3t8e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIGFiYqJioeEhYWEg4KCgYGBgoKBgYKBgYGBgYCBgYCAgYCBgIF+fH1+fn5+fn5+fn5+fn9/f3h4eHh4eHh5bWRiZV9fXm95eXl5eXl5eXl5eXp6enp6enp6enp6e3t7e3t7fHx8fHx8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goWKiomJhISGhYSDg4KBgYKCgoGBgoGBgYKBgIGBgICAgICBgH58fX5+fn5+fn5+fn9/f39/eHh4eHh4eW5kZWdlZGJeZnh5eXl5enp6enp6enp6enp6enp6e3t7e3t7e3x8fHx8fHt8fHt7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChouJiIqEhYaEg4OEgoGBgYGCgYKCgYGBgYCAgYGBgIB/gIGBf3x8fn5+fn5+fn9/f39/f394eHh4eHl3Z2VkZWZkZWFfaXl6enp6enp6enp6enp6ent7e3t7e3t7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHt8fHx8fHx8fHx9fX19fX19fX19fX19fXx9fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4eJh4SEhoSDg4WBgYGBgYKCgYGBgYKBgICAgYGAgYCAgYF+fHx/f35/f39/f39/f39/gHl5eXl5eWtlYWJlZWFlZV5ieHdze3p6enp6enp6enp6e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fH18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19g4aLhoiFhYaEgoOEhIKBgYGBgoKBgYKBgYGAgYGBgYGAgIGBgn98fH9/f39/f39/f3+AgICAeXl5eXl0Y2NlZGNmY2doZGZsZF5ze3p6enp6enp6enp6ent7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn6DhouGhoaGhYODg4SDgYGBgYGCgoGBgYKBgYCAgYGBgYCAgYGBfnx8f39/f39/gICAgICAgIB5eXl6d2RhY2diYmRdW2VfYV1eYGFoeHp6enp6enp6enp6e3t7e3t7fHx8e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+foSFi4eGhoaGhIODg4KBgYGBgoKCgYKBgoGAgIGBgYGAgYGBgYF+fX1/gH+AgICAgICAgICAgHl5eW9vYmJiZF5jZ19dYWFgXF9kYlttfHp6enp6enp6enp7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7fHx7e3x7fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5/hIiLhoSHhoaEhIODgoGBgYGCgYGBgYKCgYCAgYGBgYGBgYGBgX5+fYCAgICAgICAgICAgICBeXpwXWJlZGJkXmZnZ2BZYmJhY2VfXF1ze3t6enp7e3t7e3t8fHx8fHx8fHt7e3t7e3t7e3t7e3t7fHx8fHx8e3x8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fn19fn5+fn5+fn5+fn5+foCFjIqEhYaGhYODhISCgYGBgYKBgYGBgoKCgYCBgYGCgICAgIGBf35+gICAgICAgICAgIGBgYF5emxiZGdjYmdmYWBgZGFiZWRjZGNeXGJ1fHt7e3t7e3t7e3x8fHx7e3x8fHx7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/gYeMiYWGhoeFg4SDgoGBgYGBgYKBgoKCg4KBgIGBgYKBgYGCgoF/f36AgICAgICAgIGBgYGBgXp7dGdnZmZkZGZmYF5fYWNlaGRlXmJkX3R8e3t7e3t7fHx8fHx8fHx8fHt7fHt8fHt7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f3+CiYqIhoaIhoWDhIOCgYGBgYGBgoGBgoKCgoGAgYGBgoKBgYKCgX9/f4GBgYGAgYGBgYGBgYGBenptaGNjZ2ZnZWdmZmdiZWRlYmdbYmVgd3x7e3t8fHx8fHx8fHx8e3t8fHx8e3x8fHt7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f39/f4SJioiGiYeFhYSEg4KBgYGBgYGCgYKCgYGBgYGBgYKBgoGBgICBgH9/gYGBgYGBgYGBgYGBgYF7emlpZGNqZmFgZmVjY2NnaWRjYmBiZGJ1fXx8fHx8fHt8fHx8fHx8e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f39+fn9/f39/f39/f3+AhIqMiIeJhoSFhYOCgYGBgYGBgYKBgoGBgYGBgYGBgoKBgYGBgYGAgH+BgYGBgYGBgYGBgYGBgXZzZWRnY2RmZWJlZmdkZmhmZWNgYGNkYHF9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fXx8fX18fHx9fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/fn5+f35+f39/f39/f3+AgICFioyJiIqJhoaDgoKCgYGBgYGBgoGBgoGBgYGBgIGBgYGBgYGCgX+Af35/foCCgoKCgoKCgoKCc3NnZWRkZWlqaGZnZ2NhZmZlZmdmZWVjdX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fH19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gICAgICAgIWLioqJioeHhoSCgoGBgYGBgYKCgYKBgYGBgIGBgoKBgYGBgYGAf4B+dHRzdX1/goCAfn5/gYB0cmdkZWNmaWppZWNlY2BmZGRnZ2JiZWFwfXx8fHx8fHx8fHx8fHx8fHx9fX18fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f39/f39/f4CAgICAgIB/houLiouLh4eHhIOCgYGBgYGBgYKBgoKBgYGBgYKCgYCBgYGBgoCAgH5zc3NzdHV4dXV0dHV2dXVwZmNmZWhoaWdoZ2VmZWJfZGVmY2BiZ3d8fHx8fX19fX18fHx8fH19fX19fX19fXx9fXx8fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gIB/f3+AgICAgICAgICHjIyIi4qHh4eEhIKBgYGBgYGBgoGCgoGBgICBgoGBgYKBgoKCgYCAfnNzc3Nzc3NzdHR0dHNzdW9jY2FnZWhoZ2pmZGVnZmhmY2JlYl5ieX18e3t8fX19fX18fHx9fX19fX19e3x9fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn9/fn5+fn5+fn5/f39/f4CAgH9/gICBgICAgICAgYCAf4CAgYGAgIeLi4iNiYiJhoSFgYGBgYGBgYKCgYKCgYGBgIGCgoGBgYKBgoKBgIB+dHNzc3Nzc3Nzc3Nzc3N1cmdlZWRlamhoZ2ZpaGdjZWViZGNoZGd7eHVzc3R2dnl4dnR0dHZ3d3d2dHR0dXV4d3h4d3d6e3x9fXx9fn5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f35/f39/gH9+fHt7fX58eXl2dnZ5fHx6end2d3l7fXt4hIyMioyHh4iEhYSBgYGBgYGBgoGBgoGBgYGAgYKCgYGBgoGBgoGAgH51c3Nzc3Nzc3Nzc3Nzc3VzaGVnaGVrbGhqZ2lqZ2dnZmRkYmVkbnV0dHNzdHNzc3Nzc3Nzc3Nzc3NzdHNzc3Nzc3Nzc3N0dHV1c3V3eHl7fn59fn98f39/f39/f39/f314fH5+fXx4dXZ3eXd4dnRzc3N0dXRzc3Nzc3NzdHNzc3R0c3R0dHODjI2KiYeIhoOGg4GBgYGBgYGBgYGCgYGAgYGDgoKBgYCBgYGBgICAf3VzdHRzc3Nzc3Nyc3NzdnZpY2hqaGpsZWZpbGhgZmVkY2BkZGZ0dXV1dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHRzdHRzc3Nzc3R2dnV1d3V4fH9+fX9+fHp4dXN0dXV1dHNzc3Nzc3N0dHR0dHR0dHR1dXR0dHV1dHR1dXR1dXV1dIaMjYuIhoeEhIWCgYGBgYGBgYGCgoGAgYCBgYKCgoGBgIGBgYGAgIB/dnNzc3Nzc3Nzc3Nzc3N2dnNnZ2pmaGdmaGhmZGlnY2NnZWVmcHZ1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dHR1dHR0dHR0dHRzdHR0dnV1d3Z0c3R0dHR0dHR0dXV1dXV0dXV1dXV1dXV0dHNzc3N0dHNzdHR0dHR1dXR1iY6MjIqHh4SEhYKBgYGBgYGBgYKCgoGBgICAgoKCgoGBgYGBgYCAgH93c3Nzc3NycnJyc3NzcnZ2dW5kXWNnZWlraGVoZ2dqamlnZXB2dXV1dXV0dHRzdHR0dHR0dHV1dXV1dXV0dHV1dHR1dXV1dXV1dXV1dXR0dHV1dXV1dXV0dHV0dHV1dXV1dXV1dXV1dXV1dXV1dXV0dHNzc3Nzc3N0dHNzc3Nzc3R0dHR0dHWKjoyMiYaGhIeFgoGBgYGBgYGBgoKBgYGAgYGCgYKBgYGBgYKBgYCAf3hzc3Nzc3JycnJyc3NzdnZ3d2liaGhnamtpaGZkZGVmaWhwdXR0dHRzc3JxcnJ0dXV0dHR0dHR0c3NycXFxcXNzdHR0dHR0dHR0dHV0cnJyc3R0dHR0dXV1dXV1dXR0dXR0dHR0dHR0dHR0dHR0c3Nzc3Nzc3Nzc3Nzc3N0dHN0dHR0dHR0dYuOjImGhYWFh4SCgYGBgYGBgYGBgoKCgYGAgIKCgoGBgYGBgYGBgIB/eXNzc3NycXJycnJzc3N3d3d3bGpoZGhpa3Z6a2VmZWhnbXJzdHN0c3JwcHBxcnN0dXR0c3NycnNycXBvb29vcHFzc3NycnJyc3R0dHNxcHFyc3R0dHR0dHRzc3Rzc3NzdHR0dHRzdHR0dHR0dHRzdHR0c3NycnFxcnJzc3Nyc3NzdHR0dHN2jZCMh4eFhYSEgoGCgoGBgYGBgYGCgoKBgYGAgYGCgoGBgoKBgYGAf395c3NycnFxcnJycnNzc3d3d3dzc2pnaWloeX99cW51bG5wcXJycnJxcG9wcXFxc3Rzc3NycXFwcG9ubm1ubW5ubnBxcnJycnJycnJzcXBvb3BxcnJzc3JxcnJycnJycnJycnJzc3Jzc3Nzc3Nzc3Nzc3Jxb29ubm9vcXJzc3Jyc3NycnNzcnaPj4uHhoWFhYOCgoKBgYGBgYGBgYGBgoGBgYGCgoKBgoGCgoGCgX9/f3hxcHBwcXFycnJyc3Nzd3d2dnd2cnF0c252f352c3hvcHBycnJycXFwcHFxcXJyc3Nzc3FxcnBvb25ubm5ub25vcHBxcXFxcXBwcXJwb25vcHFxcXFxcHBxcXFxcXJycnJycnJycnFxcnFxcnJycnFwb29ubm1ubm5vcXJycnJycnJyc3JxeI+OjYaDg4aEgoOCgoGCgYGBgYKBgYGCgYGBgYKCgoKCgoKBgYKBf4B/d29wb3BxcnJyc3Nzc3J2dnZ2dnZ3dnZ1c3l/fnd3d29wcXFxcXFxcHBwcXJxcnJzcnJycYVzb29wb29vb29vb29wb3Bvb29vcHBxb29vcHBwcHBvcG9wcHFycXFxcnJycnFxcXFxcXFxcHBwcHBxb29ubm5tbW5tbm9wcXFxcXFxcXFxcXB7j42NhoODhYOCgoKCgYKBgYGBgoGCgYGCgoGCg4KBg4KBgYGAgYF/f392bm9wcHBxcXFxcXBwcHZ2dnZ2dXR0c3NxfYB9fX9zb3BxcXFwcHBwcXFwcHFycnp7cXF4lnFvb3Bwb29wcG9vb29vb29vb3BxcXBub3Bwb29wb29wcnJycnFxcXBxcnFwcXFxcHBwcHBwcHBwb29ubm1ubm5ubm9ub3BwcHFxcXFxcXFxcIKRjoqEhIOFhIOCgoGBgoKBgYKBgYGBgYGCgoKCgoKCgYGBgYCBgX9/gHVvb29wcXFxcXBwcHBwdnZ2dXRzcnJycnGAgoCBeXBwcHBvcHBwcHFxcXFwcXJwfpZxb4Occm9wcHBwb3BxcHBvb29wb29vcXFwcG9wcG9vb25vcHFxcHBwb3Bvb3BwcHBwcHBwcHBvb29vb29vbm5tbW1ubm5ub25vb3BvcHBwcHBwcHBwiZCMiISDhIaDg4KCgYGCgoKCgYGBgYCAgYGBgoKBgYGBgYGBgIGBgH+AdG5vb3BxcXFwcG9vcG92dnVzcnFxcXFxcICDg39ycHBwcHBwcHBwcHFxcHBxcXB2pHtukJ92b3BwcHFwcHBwcHBwcHBvcHBxcXBwcHFxb29vbm9wcHBvb29vcHBvb3BwcHBwcHBwcHBvb29vbm5ubm5ubW5ubm1ubm9wcG9vb29vb3BzcXWPj4uJg4KFh4ODgoKBgoGCgoKBgYKBgYGBgYGBgYGBgYCAgYGAgYGAf4B0b29vbm9vb29vb29vb3Z1dHNxcXFxcXJygIKCgXRxcXFxcXFxcXFxcXFxcXFxcHaqiG+ZoXpvcXBxcXFwcHBwcHFxcXBxcHBwcXBwcHBwcHBwcHBwcHBwcHFxcXBxcHBwcHFwcHFxcHFxcXFxcXJxcnFwcnRycnR0dHR1dnRzdHR0dXd3gpCPi4iDgoaHhISCg4GBgYKCgoGBgoGBgYKBgYGBgYGAgICBgYCBgYB/gHVvb29vb29vb25vb29vdXRzcnJycnJycnKDg4OCdnFycnFxcXJxcnJxcXJycnJwdquVcZ2ifXBycXFycXFxcXFxcXFxcXFwcXFxcXFxcnNzcnJyc3V1dHR0dHR0dHV2d3d3d3d3eHh4eHd3eHh4d3Z3dnV2dnZ2d3h6e3x7e3t6enp6enyGkI2LiIODiIeHhYODgoGCgYKBgYGBgYKCgoGBgYGAgYCAgYGAgIGBgH+Ad3FxcXFxcG5ucG9wcG92dHV1c3Nzc3NzdYiDgoN5cnNzcnJyc3Jyc3Nzc3Nzc3R6q6J7nqJ9cnRzc3Nyc3N0dHV1dXV1dHV3eHd3d3d4eHh3eHh4eXl5eXl4eHl5eXp6e3t7e3t6enp5eXh3d3d1dnV2dnd5enp7fn5+fX1+fn5/f35+gIyQi4qHg4WIi4iEg4SDgYGCgYGBgoGBgoKCgoKAgYGBgYCBgYGAgIGAf4B8enp5eXx5eHh2dXZ2dHl2d3h3d3Z3dnZ6fnx+fnx2dnd3dnV4enh4eHh4eHh4eJSypaSrp357e3l6eXh4eXl6enl5eXh4enp5eXh4eHh3dnd3eHh3eHh5eXp7e3p8fH1+fX9/f359e3t7e3p5enl5e3t/foB/fn5/fn19fX5+f35+fn6AjpCNioeEhoqLiIaGhIOBgoKBgYGCgYGCgoKCgoCBgoKBgYGCgYCBgIF/f4B/fn19fX9/f318e3t7eXh4eHh5eXl4eXh5eXl4enp6enp6e3t7fH1+fXx8fH1/pqaisqSoi3p7e3p4eXh4ent6enp5eXp8fHt6enx8fHp6ent9fHx+fn+AgoGAgYKAgH9/gYGBgIB/f35+fn5/fX1+f4CAf35+f39+fn9/f39/gH+Af4OQjoyHhoWIi4yIh4aFg4GCgYGBgYKBgoKCgoKBgYKDgoGBgYGBgIGBgIB/goOCgoGBgX99f39/f4F6enh4d3h4eHh5eHh5enp5e358enx9fXt8fX19fX19foaonKOrmp6bfn9/f3x8fYCDgoCAf319fXx9fXt9fXx8fH19fX1+gYGChISDgoB/gYGBgH9/f4B/f39/f39+fn9/f39/f35+f3+Af39/gICAf4CAgICAhJCPi4eGhoiLi4mKhYaDgoKCgYGBgoGCgYKBgYGBgoOCgYCAgYGAgIGBgH+ChIKCgICAgH9+fn+AgH9/fn18fX19fYB/fX+Af35/gH9/fn9/gICBgICBgIGBjaOToK2foZ+Ef4CBgH5+f39+f39/fn5+f39/gYB/f4CBgYCAgYOEgoGCgoGCgH+AgYCBgYGAgH+BgICAf39/gICAgYGBgIGBgYCAgICBgoGBgYCAgYGFjo6MiYaHiYyLi4qGhoOCgoKBgYGCgoOCgoKBgIGBgYKCgICBgYCAgYGAf4KFg4KBgYCAf39+fn+AfX5+fn19fX5/fn9/f35+fn+AgYCAgICAfn9/f3+BgYCKnoyUrpyWm4d9fn1+f39+fn9/f35/gIGBgoKDg4KCg4KBgYKDg4OCgYGBgYKBgoKCgYKBgoGBgYGBgoKCgYGCgYKCgoGBgoKBgYKCgoKCgYGBgoKCgoaPkY+KiImKjY6NiYaFgoKCgoKBgYKCg4KCgoGBgYGBgYF/gIGBgYCBgIF/gYWEg4KCgoGCgYCAgIB8fHx7fH18fH9+fn9+fn5+f35+f39/f39/gH5/g4OAfoilopmfm5aclIOFiY2Ff4B/gIF/f39/f3+BgYGCgoCAgYKDg4SDg4ODgoKCgoKCgoKCgoKCgoGCgoKDg4OCg4ODgoKCgYKCgoODg4ODgoKCgoODg4KCh5KSkIuKi4uPj42Lh4SCgoKCgYGBgoKDgoKBgYGBgIGBgICAgYGBgIGAgYCAg4SDg4OEg4ODgoKCgXx9fHx9gn1+f4GCiIGCgoSCgYGDg4GBgYKDgYSLkJaYpK6mopudoKepoaGgkoF/gYCAgICAgH9/f3+AgICAgH9/gYODhYSEg4SDgoKCg4OCgoOCgoODg4ODg4SDg4KEhYWDg4SEgoKDhIOCg4ODg4OCgoODgoCKlJOPioqMjpCPjYuGg4KCgoKBgYGBgoOCgYGBgIGBgoGBgICBgYGAgYCAgH+BgoODg4SEhIOCgoKCfXx8fn6AgYOAg4OChIaFhoaFhIWFg4ODg4SBgoSUqbCwpJ2inZ6foaKjn5KCg4KDg4KDg4ODgoGAgIKCgYOCgYKCg4OEhYWEg4OChISEhIOEhISDg4OEg4ODg4OEg4SDhIWEhISDg4ODgoKCgoKCgoKBgYKCgo+UlI+Njo6RkY6KiISCgoKCgYGBgYGCg4GBgIGBgYGBgYCBgIGBgYCBgICAgIKChIKChIOCg4ODgoJ9fX2AgH+AgoGDg4ODhIaEhIOEhYWDg4GBg4OCgIKUn5+dmaGdnaCfnZ2Th4eHh4eGhoeHhoaEgoGCg4SDg4ODg4ODhISFhYWDhYSFhISEg4KBg4OCg4SEg4KCg4SCg4ODg4OCgoKCgoKCg4OEhIOFhYWFhoaIk5OTkI+Pj5KRjIqHgoKCgoKBgYGBgYKDgoKBgIGBgYGBgICAgYGBgICAgICAhISEgoKCgoGBgoKBgX+AgYOCgICAf4CCgoGDg4KCgYODg4SDg4GDhYSCgYKNlJWXn52eoZ6blYiHiYiHh4eIiIiFhIOBgIGBgoKCg4GCg4SEhYSDg4OEg4OEhIOBgYGCg4OEhISDg4ODg4OEhIODgoSDg4ODhIWFhoeHh4eIiIiJiY6TkpKOj46RkY+LiYeCgoKCgoKBgYGBgoKCgoGBgIGBgYGAgICAgYGAgIGAgICDg4KCgYKCgYGAf4CBhYWFhoOCgYB+fn+BgoSCgYKDhIOCg4ODg4KChISEhISIk5adl5qenJKEg4WFhYKEhIWFg4KBgH9/gIB/gIGEg4OEhYWEgoKCgoOCg4OFhIKDhISEhYaGhoaGhoWFhoeHhYaIh4aHiIeGhoaIiYeGhYaGhoeIkZKSj46QjpCRjImHhYGBgoKCgoGBgYGBgoOBgYGBgYGBgICAgICBgYCAgICAgISEg4KBgoGAgYGAgYKIh4aHhYSCgH99fX6AgH+AgYGBgYGBgoGAgYKDgoKCgoKLlZeLkZyWhIGCgICAf4GAgICAgH9+gIGBgYKCg4OEg4OEg4OCgoGBgoODg4SEg4SEhIOFhYaFh4eIh4eHh4eHh4eGhoaGh4WFhYaGhISEhIWEhYaSk5GOjo+OkI6JiIeEgoKCgoKCgoGBgIGCgoKCgoKCgYGBgYGAgYGBgICAgYGAgoSDg4KDgoGCgYKDg4iHh4iHhYSCgX5+gICAfn5/f4CBgYGCgoCBhI2DgX+AgH+HkoqPkoWBg4OAf39/gICAgICAgICDg4KDg4ODgoOBgYKCgoOCgYKCgoOCgoSDhISDg4SEhYWFhYaGhoaFhISEhYWEhIWFhYSEhISDhISEhISEipSTkpCQj46NiIaFhIOBgYKCgoKCgYGAgYKCgoKBgoKBgYCBgYCBgYGAgICAgYGAg4OCgoOCgoKBgoOCiImJiYiHhYSDgYKEhIOBgoKCg4SCgoSEgoOKloiEgoSCgX6CiYyCgoKChIOBgYGCgoODgoGDg4SDg4SEg4OCg4KDg4ODg4KCgoKCgoGDhISEhYSFhYWFhIWEhIWFhYWDg4OEhISEhYWFhISEhISEg4ODg4OOlZKQkZGPjYyHhYODg4GBgoKCgoKBgYCBgoOCgYCCgYGBgICAgIGBgYCAgICBgICDhYSEhIODg4SDhIOGh4mIhoWDhIODg4WDgYCDgoWFhISDg4OChI6Zi4OFhISEgoCKjoCCgoKEg4OCg4GBhIWEg4ODgoKDhISDg4ODg4SFhISDg4KCgoKCgoSEhYSFhYWFhYODhYWFhYaFhoWEhIWEhYWGhYWFhIWEhISDhIODhJGUk5KSj4yMioSEg4ODgYGCg4KCgoKBgYGCg4KBgYKBgYGBgICBgIGBgH+AgIGAgYaGhoaGhoaHh4aGhYSDhYaCgIGBgYGHgoB+f4GAj4yDgX9+fXx9jJyNgIKBgoKDgI+TgYKCgoKDg4GBgYKDhYODg4ODg4SEgoKEhIOEhIWEg4OCgoKCgYKCg4ODg4SFhYWFhIOEhYWGhYWEhISEhIOEhIWFhYWFhIODhIOEg4KGlJSSlJKPjYyIhISEg4KBgoODgoKDg4GBgoKBgoKCgYGCgYGBgYCAgYGAgICAgICAhYWFhYaGh4aGhoWGg4ODg4GAgoKCgYKAf35/f4GVl4mAfX19fXuBl4yAg4GBgYGCmZmEgYKBgoKBgYKDgoODgoOCgoKCg4OBg4SDg4ODg4OEhIKCgoKDgoKDg4ODhIWEhISEg4OEhIODg4OEhIODg4ODg4SDg4ODg4KDg4KDgouUk5KTko2NioeDg4OEgYGCg4ODg4ODgoGBgoGCgoKCgoKBgYGBgICBgYCAf4CAgICDhISFhYSFhYWEhIWCg4KDgoKDg4OBgICAgICAgJWfin5+gH2Hin6EhIOEgoODg4WNjYWCgoODgoODg4ODgoODhIKCgoODgoKDg4KCg4KDg4WEg4ODg4SDg4SEhISEhYWEhIWEg4SEg4OEhISEhISEg4SEhYSDg4SEhIODgoKDkJSTkpKPi4yIhoSFg4OBgYKDg4ODg4OCgYGCgoKCgoKDgoCBgoGAgICAgIB/gICAgISDhYWEhYWFhYSFhYOEhIWDg4SEhIKCgoOCgoSBkaGKf4yFfYaJgH6FhYWFhYKAfn19f4KEg4ODg4OEg4ODhISEg4OEhISEg4SEhIOEg4OFhoWFhYSFhYWFhYSGhoWGhoWFhYWFhYWFhYWGhoWGhoaFhoaGh4aFhYWFg4SEhIeTk5OSkoyLiIWFhYWCgoGBgoODg4OCg4KBgYKDg4ODgoKBgIGAgICAgICAgH+AgICAhYWFhYWGh4eGhYWFhISFhYSEhISEg4ODg4OEhYOKkYOEi4WCgYF+fYGHhoSAfn5/f39/f4OEg4OEhISEhISEhISEhISFhYWEhYSGhYWGhYaGhoWGhYaGhYWGhYaGhoaFhIWFhYWFhIWGhoaHhoaGhoaHh4iIiIaFhYaFhYWGjZSTkpGQi4qHhoeGhIGCgYKDg4ODg4KDgoGBgoODg4KAgYGBgICAgICAgICAf4CAgICHh4eGhoeHiIeHhoaEg4ODhIODg4OEg4ODg4OEhISEgYKCgYmBf359foWCf39/f39/f36AgISFhIWGhoaFhYWFhoaHhoaFhoWFhoeHh4iHh4eGhoaHhoeGhoaGh4aGhYSDhIWFhYSFhYaGhoeHhoaGhoeHh4eIiIeGhoaHh4eRlJORkZCLiYiFhoSDgoKBgoODg4ODgoKDgoKCgoOCgYCBgICBgICAgIGAgIB/gIGAf4aHiIeHh4eIiYmIiIODgoKDgoSEhIWEg4KCg4SEhISBgICAhIR/fn5/gH9/f39/gIB/f4B/f4WFhoeIiIeHh4eIh4iHiIiIhoaHiIiJiYmIh4aHh4eJiIaHhoeHhoeFhIOEhYaFhYWFhoaGh4eFhoeGh4aGh4eHh4eHh4eFh5OTkY+RkIyHhoWGhIKCgYGCg4ODg4ODgoKCgoGCg4KCgIGBgYCAgICAgICAf3+AgYB/hoiIiIiHh4iJiYmIg4KCg4ODhIWHh4aFg4OFhISEg4GAgIGMiYGAgYKCgYGBgYB/gH9/fnt6gIaIiIqKiYmJiImJiYmKi4qIiIiJiYuLioqIh4eIiIiHh4iIh4iGh4aEg4OFh4eHhoWFhISDhYWEhYWGhISEhYWFhoWGhYOJlJOQjpCOioaEhoWDgYGCgYKDg4ODgoKCgoKCgoKCgYGBgYGBgYCAgICAgIB/gICBgH+GiYiIiYeIiImJiIiEgoKDg4KDhImKh4aEhIWEg4OCgICBhISCgoKCgoKCgH9+fX19fX59fHt8g4eJi4uKioqIiIqJiImLiomJiImIioqJiomHhoaGh4WGiIiJiIeGh4SDgoSIiIiIh4WCgoGDg4KDg4SCgoKDgoGEg4SDgY6TkpCPj4uIhYSGhIKBgYGBgoODg4OCgoKCgoKCgoGBgYGBgIGAgICAgICAgH+AgIGAf4WIh4eHhoeIiIiHh4SCg4OCg4OFiYqJh4WHhYSFhYKAgYOEgoOCgoKDgX59fn5+fn5+fn1+fX19g4eJioqHh4WGh4eHh4iHh4mGiIaIh4eJiIODhIOFhISFhYaIiIaFg4KCg4WHhoeGhoSCgoOEgoOEhIKBgYGBgYODhIODkZKQjo+Oi4eEhoaDgoGAgYGDg4ODg4KCgoKCgoKCgYGBgIGBgYCAgIB/gIGAf39/gIB/hYaGhYaGhoeHiIeGgYKEhIOChYeJi4qGhIaEgoaGgoKEhIODg4OCgoF+fX1/gH5+fn59fH19fHl8g4aGh4SDgYODhIWFhYODhYSEhISEhIWEgoKCgoSEgYKDg4WGhYSCgoGCgoODhYOEhIWEhIaEhISFg4KDgYKDg4SFhIeSkY+Nj4yKhYSFhIWCgYCBgYODg4ODgoKCgoKCgoKBgYGBgYGAgICAf4CAgYB/gICAgICDhIWEhYWFh4eHh4aAgYGFg4OEhYSHiIWCgIB/gX9/gYODg4ODgoJ/fX5/gICBf31+fn19fX17enp+hISEgoGBgIGBgoKBf36BgYGCgYOBgoGCgoKBg4OAf4CAgoOCgICAgYCBgYGCgYGChIODhYSCg4SDgoKBgoSDhYWGi5ORj4+Pi4iFhYODhIGBgYGBgoODg4KCgoKCgoKCgoGBgYCBgYCBgH9/gIGBgICAgH+AgIKCg4OChIOEhYWGhn+BfoCBgICAf4GDgn9+fn5+fn+Cg4OCg4ODgn19fn+AgIGAfn19fX1+fXx6enp/goKBf39/f35/f4B+fYB/f4CAgX+AgIF/f3+AgX59fX+AgYB/foCAgH+AgICAf4CCgICCgYGCgYGAgYGBgYKEg4aPkpCOj42Kh4eGg4ODgYGBgYGCg4ODgoKCgoKCgoOCgYGCgYGBgICAgH+AgICAgICAf39/gYKDhIGCgoOCg4SFgIB/fH19fn19fn+Af31/fn1+gYODg4KCgYF/fX1+f4CAgH9+fX19fHt7e3p6enqAgIB/f39+fn1+f35/gH9+f3+Af4GAf35+fn9/fn18fn+Af35+f3+Af39/f4CAf4B+f4CBf4B+f39/gH9+f4B/hZKSj46Pi4uHiYWEhIKCgYGBgYKDg4ODg4OCgoKDg4KAgYKBgYGAgICAf3+AgIB/gIF/f36BgoSEgYKBg4OCg4OBgH98fn9/fX6Af4B/foF/f4GBhIOCgYB/f359fn5/gICAfn19fXx7e3x6enl5eXuAgH+Af39/fn5/foCAf35/f4CAgoB/fH5+f35+fXx/f4B/fn5/f4B/f35/f4CAf36Af39+fn5/f35+fn18fH2Fk5KOjIuKiImIhISEgoKCgYGBgoOCgoOCgoODg4ODgYCBgYGBgYCAf39/f4CAgICAgIB/foCBhIOCgYGDhISDhICBgICBgIGAgYKCgoGBgoCBg4ODgYGBgYCAfX19fn5+f359fX19fXx8fHt6eXl5eX2BgIGBgYF/f4B/f4F/gICAgYGCgoB+gH5/fn5+foGAgYF/f39/gIB/f4B/gYB+f3+Afn9/fn+Af31+fn17fIaTkYyLioeHioiGhoSDgoGBgYGCg4ODg4OCg4OCgoKBgICBgYGAgH9/f39/gICAgICAgH9+fn+BgYGAgISGh4aHgoODhYOBg4ODhYSEhISEg4ODhIKCgoKCgX5+fX19fn6AfX19fX19fX19e3p5eXl5eYCCgoKEg4GCgoF/gYCBgYGDgoKDgYGCgIGAf4CBg4GEgoCAgYCBgYCAgX+Cgn+BgIF/gH9/gICAfn9/fnx8ipOQiomIiIiJiIaGhoSCgoGBgoKDg4ODg4KDgoKCgYCAgICBgYGAf39/f4CAgICAgIGBf359fn5/f39+g4aHh4iChYSFg4SFhIWGhYaGhoWGhYGBg4ODgoKAfX19fX19fn59fX19fX19fX18e3l5eXl4fIKDhIWCgYSDgoKDhYaCg4SDgYKCg4OCgoKCgYKFg4iFgoGCgYKDgYGBgYSDgoOCgoKCgYGBgIF/gIGAf36Ok4yHiIaIh4aGhYaGhIKDgoGCgoODg4ODg4OCgYGBgH+AgYCBgYB/gH9/gICAgH+AgYB/fn19fX5+f36Ag4SHiISGhoaFhoaHh4aGh4iHh4eGf32AgIGCgX59fX19fX19fX19fX18fH5+fnx7eXh3eHl5gIODf4OMhIOEhISXl4ODhIF9foGCgoGBgYKBg4aIjIWDgoKBhIKEg4KDhYSEhYOChIOCg4OCgoKCg4KCgpKQi4iJh4mHhoaEhoWFhISCgYKCg4ODg4ODgoGBgYCAgICBgIGBgH9/fn+AgYCAf4CAgH9/fn1+fn+Bf4CCgYWFhYeGh4eGh4iIhoaHh4eGh4V/fX18fX9+fX19fX19fX19fX19fXx7iJKCe3x6fIZ5eHl9gYF+iZaEg4OEhJSTgIGBf39/fn6Fi4B/gICEhpCJhYSCgoGFhYuDgYKFhYaGhIOFhYOEhIODhIOEhISIko+MiYiIiYeHh4WGhYSFhIKBgoKDg4ODg4OCgYGBgYB/gICAgICAf39/f4CAgICAgYGBf39/f4CAgIGBgYGBg4OGh4aGh4aGiIeGhoaFhIOFhH59fHx8fX18fH19fX19fX19fX18fH+RlZaDe3qElHx4eXp7fICCg4GCgYOCgH59fn57iJF8fI6WgH1+f4KGioWDg4SCgYONiX9+f4OEhYWDhYaFhIWFg4SFhYaEhI6Rj4yKioyJiImHhYWFg4ODgYGCgoKDhIODgoGBgICBgICAgYGAgIB/f3+AgIB/gICAgX5+f4GBgoKCgoODgoOCgoWGhISFhYSGhIOEg4KBgIKAfn19fHx9fXx8fH18fH18fX19fHx8e4uRl4x6e3yBenp6e3x5eX19foB/gH98e3t+fn2ClZF/hIh9fH5/g4R8fIGChIKAf4eDfYOBf4KCgYODhISEhISChIOEhYGEkZGOi4yMjoqJiYWFhYODgoKBgoODgoKDg4KCgYGAgIGAgICAgICAgH+Af3+Af357gICBenyAgoKDhYODhIWFhYODg4SCgYKDgoOCgoGBgIB/gX5+fX59fHx8fHx8fHx8fHx8fHx9fHx8fn6Kgnt6e3p4ent7fH18fn1+f319fX18fH+BgX2Gj4F+fYJ+fn6Agnx8gH+CgIKAfn17ioJ9gH9+gYCAgYKBgoCAgYGAf4uUkIyLjo6NiIeHhYWEhIOCgoKCg4OCgoODgYGBgICAgICAgH9+fXx7fHx9f39/gHx6gYF4e4CCgYOFhIOFhYaHhIWAhpSIgIKBgYGBgH9/f39/fn5+gHx8fHx8fHx8fHx8fHx9fHx8fHx8fHl7e3t4eHl7enp8goCBfn+BfH5+f399gIKCgICAgX+CkYF/f4CAfoB+fn9+gIGBfX19e319fXx9fHx9gH+AgH6Afn6BlJKNjI2Oj4qFhoaFhISFg4KDgoODg4OCgoGBgYGAgICBgICAgICAf39/fXt6fYCAgHh+gXd7gIF/gYKCgoKEhoeGhn6IlYp+gIGAgIB/foB+f39/fn+Bfnx7e3x8fHx8fHx8fH59fHt9fHx8e3x8fHp6eXt8en2Fg4OAgYF+f35/gH6FgoF+gH9+foCFhoKAfn6Dhn9+fH6AgIGAf39+fX19fX57fH1/f3+AfX9+gIyRjo2Njo2Nh4SGhoWEhIODg4OCg4ODg4KBgYGBgYCAgYGAgYGBgYGAgH9/f397en9/e3mAd3p/f31+f3+Af4KEhoaFf3+FgX5/gIB/gH5+f31/gIB/f4B/f319fHx9fn18fH19fX19fH58fXx7fXx8ent6fH19f4aEg4CAgX1+fX5/foyEgYZ+fXx8f36CgX99fX19gXx7fXx+gYSDgYB+fn5+fXx+f399foB+f36Eko2MjI+Ni4qGhIaEhISDg4OCg4KDgoOCgYGBgYGAgYGBgYB/fXx8fH1+f39/f397e399d352eH59fH18fX5+gYGCg4B6fX18fn+Af35/f35/fn+AgH+AgH9/fn9+fn5+fn1+fn99fH59fn1+fHt8fHx7e3p9f4CAhIOCf35/fH18fXx8gYN+jH58e3t9fn1+fn17e3t9fHp7e3uAhoSChIOBf4B+f4KCgn9/goJ/gIuQjYyMjYuKiISEhIOEhIODgoKCgoKCgoKBgYGAgoGBgYKCf3+AgIB/fn18fH5/fn55fX52e3Z4fXx8fHt9fX6BgICAf31/f31+f39/foB/f39/f3+Af4GBgH99gH9/fn9+fn5/f3yCfn59fX17e319fHp8fH6AgoGAgIB8fH17fHx8fH18fnt/fnt7e3x8fH18e3t7e3x8enp9en6CfoKEhIKBgoGFhoWGhoaHhYGEkY+NioqLh4iFgoOEhISEg4KCgYGCgoKBgoGBgYGBgoGBgoKAgYKBgYCAgH9+e3x+fnx6fnh5dnd8fHx7e318f4GAf35/foB/f35/f35/gH9/f39/f39/gYKAfn6BgIB/f39/f39+fYN8fH19fH99fX19e3x+fn9/fn5+fnx8fHx8fXx+fnt8e3x8fHx9fH18fnx9fHt7e3x6e3x7e316fX5+f4CAg4eJiYmKiYqJhYiRjoyIiYeFhYOCgoOEhIOCgoKBgYKBgYKBgYGBgYKCgoGCgoCAgX98e3p6eXt9enx+fnl8eXh4dHx8fHt8fHx+gH9/f39/gIB/fn5+fYCAgH9/f3+Af4CDgoB/gIGAgIB/f4CAgH58enx9fX59fX5+jIZ9fX57e4ODfX5+fX18fX19fH1+fH17fXx9fX58fn19fX18e3t6fHt8fHt6e3t6enp7fn6DhYiHh4uLi4qJjJGPjYqIhoWEgoKCgoODg4OBgYGBgYGBgYGBgYGCgoOCgYKBgIGBf3+Af356eHl5en5+e3l6eH5zfHx8e3x8fH5+fn5/gH+AgIB/fn9+gIF/f4B/gIGAgoSDgYCAgYGAgX+AgYKCf39+f31+gH57foGSjHx9f4qAjYx+fn19fX59fX59fHx8fX18fXx9fX1+fX1+fnx7e3t8fH18e3p7e3l6eXh5e35/g4OEh4mKh4mOkI2LiYmFhISCgYKCgoKCgoGCgoKBgYGCgYKCgoGCgoKBgoKAgYGAfoCAf39+e3p5e319eHx6f3KBfXt7fXx8fn59fYGCf4GBgX9/gH+AgX9/gIGCgYGFg4SCgYGCgYKCgICBg4KAf4F/fX2Afnx/f4mDf36DkISEg4F/fn18jYd9fX59fXx/fnx9fXx9fX5+fX5/fX19e3x9fnx8e3x9enp5eXl5e3t+foCBg4eEiI6OioqGhYSEg4KBgoKCgoGBgYGCgoKBgoKCgoKCgoKCgoGCgn+AgIB+f39/fn5/ent5fX16enp9cX6Cent9fX19fXp4f4KAgYKCgICBgYGBgICBgoKCgoWFhIKBgYGBg4F/gIKEgX9+gYB9foF+fX5/gIB9fn+EgH5+f31+fX2KhX1+f31+foB/fX19fH5+fn99f4B9fX18fX9/fHx7fH17e3t6enp7e3x9fn2AgoCJjYqLh4WFhYSDg4KCgoKCgYGBgoKBgoKCgoKCgoGBgoKBgYKCf4CAgH9/f39+fn59eXp6fXx5d3t0e4d8dHd9fn17e3Z2fYCBg4KBgYKCgoKBgYGDg4OChYaEg4GAgICDgX+AgYSBfn6Af35+gH59fn6AgX+Bfn+Af35/gH99f39/f3+Afn9/gH58fXx8fn5+foF/gH2CgHx9gIB9e319fXx8fHx8e3t7fHt8fHx9fIqKiIiFhoWFhISDgYKBg4KAgIGCg4KCgoOCgoKCgoGCgoGBg4J/gIGAf39/fn5+fn57enp8fHt2e3R3f352cnt+fnt4dnd8gIGCgoKBgoSDg4OCgoSDhIOFhoOCgX9/gIOAgICAg4F+foB/fX+AfX1+foCAf4J/gYGAgICBgH1/f3+AgIGAgIB/fnx9fX19fn59gn2AfoKAfX6AgX98fn59fX17fH58fXx8fHp8e3x9iYeHhYWHhYSFhIKCgoGDgYCAgoKDgoKCg4ODg4KBgYGBgYGCgH6AgYB/fn5+fn5+fn56e3p9goN9dXF6fHpxen59eXh0dICAgoKCg4KDhYOEg4KDhISEhIWEgYGAgH6AgoB+f36Bf35/f4B9foB9fX1+gH9/gYCCgYCAgIKBfn5/f4GAf4CAgH9+fX19fnx+fn19gYR/gH9+f4GBf31/f319fn1+fn1+fHt8enx7eoCHg4SEhYSEg4WDgYKBgYKBgICCgoOCgoOEg4SDg4KBgYKBgYOAfoCBf35+fn5+fX5+fnt7en6Jh354cnl9f3F5eHt4eXV1fYKDgoODg4OFhIWDg4OEhIODhIOBgH+Af4CBfn19foB+fn5+gH19f3x9fX6Af4CAgIKAgIGAg4KAf4B+gIF+gIGAgH9+fn5+fX1/fn6FhYGBgH+Ag4F/foGAf35/foB/fn17ent6fHt6goWAg4KCgoOCg4GBgYCAgoGAgIKCg4KBg4SDhIKEgoGBgoGCgn9+gIF/fn1+fn5+fX59fXp7fIWEe3tzeXp8cHd1dnd5dXR6hISBhISDhIWFhoSDg4WEgoODgoCBf39/f4B9fX1+gH1+f39/fn1+fH19foF/gIB/gIB/gIGDgoGAf36AgH+AgYCAgH9/f39/f4B/gIGCgoKBf4CDgn9/g4J/f4B/gX+Af3x6fHp8e3yCgH+Cf3+BgIKCgYF/f3+BgH6BgoKDgYGDg4KEgoSCgYGBf4GCgH6AgH9/fX5+fX19fn19e3t6gH94fHZ5eXtxdHh3dnh1cnmFhYKEhIKEhYWGhISChIOBg4GAgIF+f4B/gHx9fX6AfX5/f39+fX98fn5+gX+Bf39+f4B/gIODg4B/f4GBgIKBgYGAgIGAgICAgIGBgYKDgYF/gISAfYGDhICAgX+BgYKBfXp7e3x8fH9+f4B9f399fYGAgH59fX9/foKBgYKBgIKCgoKBg4KCgYB/gYKAfn9/fn99fX1+fX19fX19ent7fHZ9eXh5enJ1eXl2d3dzdYaFg4WFgYSEhYSEhIGDgoGDgX+AgX5/gH6AfX19fn9+f4B+fn99f3x/f3+BgIF/f3x+gH6AgYKDgYCAgoOEgoGAgYB/gYCAgYGAgYGCg4KBgX+Ag4B+goKEgICCgYKChIJ+e3t8fHx8fX1+fXp+fX14fn9/fHx8fn5+gYCBgYCAgoGBgYGDgoGBf4CAgoB9fn19f319fX59fH19fX16e3p8dnx6d3t4cnZ5e3Z3dnN0hoSEhYSChISFg4ODgYOBgYOBgIGBfX+BfoF9fX1/f39/gH5+f359fYB/gIGBgX5+fH5/fn5/gYJ/gYGCg4eFgX9/fn6AgIGBgICAgIGCgYCAfoCCf36BgoOBgYOCg4OFg399fX18e3x8eXp7en55e3l4f357e3t+fX1/f4F/gH6BgICAgoOCgYF/gIGBf31+fH1+fX19fX18fn58fXx5e3x4enx3endzeHd6c3Z2c3SGhISGg4KDhISDgoKCg4GCgoGAgYF9gIB+gH1+fX5/gIB/f39/f3x/f3+BgIGAf359f39+fn+BgH2AgIGDg4N/f359fn5/f4CAgH9/gYKAgH99gIF+f4CCgoCBg4KEhYaEgH59fHx8fHp5dnl5enl2eXZ+fHt7e358e399gH99fX9/f3+BgoGBgX5/gYF+fX18fX19fX19fXx+jYF8fXl7e3p5fHd4eHR1dXhyd3d0doaEhIWEg4ODg4OCgYKDgoGDgn+Bf35/fn+AfX19fX+AgIB/f39/fIB/f4GAgYCAf3yAf35+fn9/fX5+gYGCgn5/fn1+fn5+f3+Af32AgIB+fn1/gX5+gIKBf4KDgoOEh4SAgH58fXx8e3x1eHl4eHh5d3t8e3t7foV9fn1/ent+fn59foGAgIGAfX6BgH59fXx9fX19fX18e32Dgnx8ent7e3p7d3Z4dXJzdnB4eXJ4hYWFhYOEhIOChIKBgYKBgIKBgIF/fn5+foB+fX58foCAgICAgIB7gH6AgH+BgIB/fYF/fn5/f319fX6AgYKBfn9+fn59fX5/fn9+fH+Af35+fn+Cfn6AgIF/gYODg4OGhICBfnx9fHx7fHh3e3h1eXd3eXx6e3t9kod9fH13en1+fn19f35+gH98foB/fn19fH19fX19fHt8ent9enp4e3x6ent4dHh1cXJ0cHh4cXmEhYaFg4SDgoODgoGBgoKAgYGAgIB9fn5/gH18fn1/gIGAf4CAgHyAf4B+f4GAf39+gX9+f39+fX18gICAgIB+f35+fn18fn9/f358fYB/fX1+gIJ/foCAf36ChIKCg4WFgoJ+fX17e3x8end8eXd4d3d4e3t6e3yFin17end6fH19fHx9fX1/fnx9fn59fXx8fX5+fX18fHt6enx7e3p5enp7enhzd3VxcXNveHdxe4WGhIWDhYKBg4OBgYGBgoCBgICBgH5/fn9/fXx+fYCAgoGAgIGBfX6Af35/gX+Af3+BgH6Af319fH1/gICAgH9/f35/fXx+f39/f319f39+fn6CgYF/gIB/foGDgoGEg4SCgn5+fHx6fHt7eXt6d3N2d3h5e3p7eXp/fnt7d3p8fXx8fH59fH19fH19fXx8fX19fX99fXx9e3l7fHx7enp6enp6eHN2dXBwcm93dnJ7hYaDhYOEgoGDgoKCgYGCgYKBgYGAf4B/f399fX9+f4CBgYJ/goF9foF+fn+Bf4B/gIJ/gIB+fH58f3+BgICAf4B/f4B+fX5+f4B/f39/gH9/f4J/gICAgIB/gYGAgISBgoKAf39+f3x9fn56fYV+dHx9enp6enx5eXp6hoV3eXx8fHx8fXx8fHx8fX19fHx9fX19fn19fX16eX18fH16enp6enp5c3V1b29xb3d0c3yFhoOEgoOCgYKBgoKCgYKBgoGBgYCAgICAgH59gH+Af4GCgn+CgX+AgX5/gYB/f4CAgn+Bf319f35/f4KAgICAgIB/gIB+fn1/gH9/gIB/f39/gH+AgICAgH+AgYCBgYGCgYCAf39/fn1/fnuBk416fH18e315e3p6eHmBgXh5e3x8fXx8fHx8fHx9fX18fH18fn1+fn59fHp8fHt8fXt5enp6eXl0dXVvb3Fwd3N0fYWGg4OCg4KAgYCCg4KAgYGCgYKBgYCAgIGAfn6Af4GAgYKCgIKCgICCfoCBgX9/gX+BgIF/fH6Af3+AgoCAgICAf3+AgH9+fX6Afn2AgIB/f3+AgICAgYCAf4CAgYCBgYKCgICAf39/fX5+fIGGiXx8fnt7fnl6e3p7jn53d3l7fHt9fHx8fHt9fH19fX18fXx+fn5/f358enx9e3x9e3l6e3p5eXN0dW5zcXB4cnV6hYaDg4KDgoCAgIKCgX+CgYKBgoGBgYKAgYF/fn9/gYGCgYKBg4OAgYJ/gYGBf4CAgIB/gX99f4F/gICBgICAf4B+gICAf359foB+fn+Af39/gH9/gICBf4CBgH+BgIGCgoKAgICAgIB9foB9gIOCe35+e3x9e3p8fHyHeXh4eXx8fH17fHx9fX18fH19fn19fX5+f3+Af317fH18fHx7enl7e3l5c3J1bnZycHhxdXaFhYOEg4KCgYCBgoF/gIKCgoKDgYGDgoCCgYB/gICCgoKBg4KEhICBgX6BgoF/gICAgH+Cf36AgYCCgICAgIB/gH+AgIB/fn2Af39/f4CAgH+AgH+AgYF/gICAgIGBgYGBgYGAgYCAgH9/gH5/fX59fn57fXx9e3x8d3h1eHh5e3x8fXx8fHx8fX5/f39/fn19fn9/gIGAf3x9fHx9e3p7eXp8eHpzcnVud3FxenF2d4WFg4ODg4KCgYKDgH+CgYSDg4SBgYOBgoOBgYCAgIKDgoCCgoSDf4GAfoKDgICBgICAf4CAf4GBgIKAf4CCgH9/gICAgICAf4CAgH+AgICAgIB/f4CBgYCAgICAgYKAgoOCgoCCgYGCgYB/f4B/gId+fnx6fXx7fX94d3Z5eXp8fXx8fXt8fH19fn5/gIGAfn1+gICAgoGAfH59fX58d3t6ent5eXNxdW53cHV6cXZ5hYWCg4KDg4KDhISAgIOBhoOEg4GChICEg4KCgICCgoSBgYKChIJ/gIB/gYOCgYCBgYCAf4GBgYGAg4F+gIOCf35/goGAgIB+gYCBf4CAgYGBgYCAgIKBgYKBgYCBgYGBgoOCgoOBg4OCgYCBgH+AhH19fXx/fXp9f3t5dnp4eXt7fH19e3x9fX19fn+AgYGAgH+AgICDg4B9f35+fn15eXt6enp5c3J1b3dxd3lzd3uFgoKDgoOEgoOEg4CAg4OGg4ODgoKEgYSDgYKAgIKBhIGCgoGCgX+BgICCgYKBgYKCgIGAgICBgoGEgH6Bg4F/f4CDgoCBfoCCg4KAgYGBg4KDgoGBg4KChIGAgYOBgYKEg4KEhIODhIODgYGBgYCCf4B/fYB8enx/e3t3fHl5eXt6fX59fHx8fH1+foCBgYCAgIGBgYSEgH2Af39/f357e3t6e3p0cHhyeXR2eHR3e4SCg4KDg4SChIODgYKDhYaEgoODg4SChIOBg4CBg4KCgoKCgIKAf4GAgIKBgoGCgoKBgIGBgYOCgoOAfoGDgX9/gYSEgYN/goKBg4KCgoGEg4OEgYKEgoOCgoGCgoOBg4SDhISEhISFg4SCgYOCgoOBgYGAgH58fIB9fHh8eXp5enx9f3x7fHx9fX18fICAgICAgYGBgYKBfoGAgICAf3t7e3p6enVweHd5dnV8dXZ8gICDgoODg4OEhISAgoOGhYWDg4KDhIKEhYKCgYKDg4GCgoKAgYB+gYCBgYKDgoKCgoGAgYKCg4KCg4B/gYOBgICChIODgoGCgoGDgoKDg4ODg4SAgoSDg4OBgX+Bg4KDhYKEhISEhISDhISChIOEhIKBgoGBgHt+gX59eXx6enp9fHyBfXp8fH19fHp7fn5+gIB/gYGAgICAgIGBgIB/fX18fX18dnJ2eHh2dH92dX2Hh4OChIWDg4SFhICChYWEhIOCg4SEgYSFg4KCgoODgYOCgoCCgH2AgIGCg4KCgoKEgoGCgoOEgoKBgICBgoGAgYOFhIOCg4CCgoOCg4ODg4OEg4CCg4KEg4KCfoOBgoSEgoODhISEhIOEhIOEg4WEg4ODgoKAfICBf3x8fXp6fH6AfX9/fHx6fH59fH19fn5/f39/gICAgH9+foCBgICAfnx9fX5/fn18e3h2f3Z3f4SHg4KDhYODhIaEgYKFhoWEhIODhISChIWFgoKDg4SCg4KDgoKBfoCAgoKDgoODg4SDgYKCg4OCg4GBgYGDgn+ChISDg4KEf4KEg4ODgoSDg4SCgIOEg4SDg4KCg4KChIOCg4OEhISEhIWEg4OEhYSFhIOBgoB9gYKAfXx8e3x8gH19foB+fn1/fnx8fH19fn5/fn+BgYGBgH99fX6BgYB+fn19fX59fX5+f3+AfH2AgYKCg4OGg4SDhoSBgoiHhYSDg4SEhYGFhYWDg4SDhIODgoOCg4F+gYGDg4SCg4OEhIOCg4KEg4ODgoKDgYOCf4KDg4ODgoOAgoWDg4ODhIODhIOBgoSEhYOCgoODg4GEg4GDg4SDg4SEhYSEhIWFhYWEg4ODf32BhIB9fXx8fHx/gX5/f39/fX99e3x9fX19fX5+f4CBgIGBgH59fH6Cf39+fn5+fX1/f39/gICAf4CEhIODhIWDhIOFf36CiouFhISDgoOFgoaGhoOEhISEhIODg4OEgn+BgYODhYSFhIWEg4KEhISFhIODgoSDhYKBhISFhYaEgoCDh4SDg4OFhIWFhIGEg4OHgoOCg4GCgYSDgoODhYODhIWEhYWHh4aHhYSEhYSBf4GDf35+fH5+fX+BgH9+fHx/f358enx9fX19fX5+fn9/gIGBf319fIB/gH5+fn5+f3+AgYGBgYKAgYWFhIOEhIKEg4aAgoWFiomEhISEhYWDh4aGhISEhIWEhISEg4SDgYKDg4OEhIaEhYSDg4SEg3yDhHuBhHd5g4F9hH5+cnWDgoF2foOEgH2BdYF5g39/f36EhIKDg4KBg4SDg4SFg4SFhoSFhn2EeXx+f4N7hYOBhIOAf31+f31+gYOBfXt/fX6Afn18fHx9fX19fH19f4B/gYJ/fX18f4GBgICAgH+BgYGCgYKDg4KChoSEhIWEgYOEhYOEhoSKiIWFhYOFhYSGhoaDhISFhYWEhYWEhIWCgoOEhYWFhoSFhIOEhYWCaICFanx7cXF8gXOGc3R0fYKDdXNxg4ZzcHVyc3SDdnt9dYF/goOBgnZ5hYCDgIR/hYSChYWCaHpyc3N8gHKBg3+Dg32BfX5+fX6Cg4J8f4F9f4B9fXx8fHx9fHx8fn1+gH+BgX99fX2AgYKBgYGBgIGBgYKCgoKCgoSHhIWEhYSBgoSGhoOFg4aIhoaFg4aGhoeGh4OFhYaFg4KFhoSFhYODg4SEhoaGhIaEg4SFhn1xe4FweXZ+g3+CbnlwdXN8dnl5hnKEg3B2eHF2dHR1cnN0dml/gG5yb3R2bnVsd217c26Ah3ltfXJzdnN2bW53bHB5bHV9f398foGAgX2Af32Af4B/fX18fHx9fH1+f32Af4CAfnx/foCBgoCBgICAgYCAgIKDgoKEhYeGhoCChYODhYeGg4WFhYaHh4SDhoaIiYaHhIWGiIeEg4WGhYWEhIOFhIKFhoaFhoWEhoWHdnB0e3BydX+HhYNtdW92b3x1coR5eYd4cXR3bndod3pucHaCcoN+b3p5eW1vbnpvb213fXiGcHF6cHJ0ZoF1fm57eXNveX+Af31+gYB/e39+fIB+gIB+foCAgYB+fn9/foF/gH9+fYB9f4CBgIB+fn+BgH9+goOCgoSFh4eEfoeEg4OFh4aEhoWFhoaIhISGh4iIhoeEhoaLioWEhoeHhYOFhYWEgoWFhYWGhYWGhYZxdXByc29zenl+hHSIdHV+iHZugnKEhnluanJ/cW1zd3x/dXR8hH54cXV3bnl1enF2eHV6eYRyaW95eHBreXN6b3p3dnZwgYB/fn5/f356fn18f31/f359gIGDg4CCg4GBhIKBf4GBgH1/f4F+f35+f4GAfn6BgoCAgYSHhoODhoSEhIaHhoWFhYWGhoiFhYaFh4eFhoSGhomIhYSJi4iGhIaFhYWDhYWEhoaGhoaFg3iLeXKIentwcIWEeIV4eWtzfnl7a3KDh4N6fG16eXl0fYB2bm+AgG90fHV3cXl9fW1+dW+DhYZ6gHJye3x1cG96a3N8bnaCgYF+fn99fXp9e3x9fX9/fn1/f4KCf4GDgYGDgYB/gICAfn9+f31/fn1/gH58fYGAfn6Ag4iFhoOFhYWFhoeFhYWFhYeHiIaEhoWHhoaFhIWFhIWFhomKh4WEhoWGhoWGhoSGhoaGhoWGh4eHhoaEhoWGh4iHhYeGhoOHhoWFg4SFhoWGhIaEg4SEhoSEgYODhISFhIWEhYSGg4aHhYWEhIWHhoSEhYaFhX13hoOEhIKBgX1/fnt8e357fHx9f359fH5+gYB9f4F/f4GAfn5+gH5+f35+fX99fX5/fHt8f358fH+BiYaFhIaGhoWGhoWFhYWGhoeIhoSGhYaGhYWDhIWGhYSGhoaGhYSGhIWGhoaGhIeGh4eGhYeIiIiIhoSHhYaGiIaFiIeIhYeGhoiFhYaHhYaGhYOChYWGhYWDhYSEhIWEhoWEhYWDhoaFhoWEhoeGhISFhoOFhIKEg4OFg4OCfYB/e3t8fnt8fH1/fnx8fn2Af31/gH5+gH99fXyAfX5+fn5+f3x8fX57fHx/fHt7fn+Ih4SEiIaGhoeGhYWEhoaGhoiHhIWGh4aFhIODhIaFhIeFhoaFhYaEhYaGh4eFh4aJiIaGiIeIiYiFhYiFhoeGh4aHhoeFh4eGh4WFhoeFh4aFgoOFhoaEhIOEhIOEhoSGhYWFhYOGhoWGhYWGhoWEhIWFg4SHhYOCg4SDhIF+gIB8e31+e3x7fn59fHx+fX5+fX9+fX1+fnx9fH98fn58fYGAfHx8fXx8fH56e3t8foiHgoWIh4eGhoaGhISGhoeGiIaEhYSGhoSFh4OEhYSFh4SFhoaFhoSGhoeHhoaHh4mIhoaIh4iKiIWHiIWHh4WHhoeGh4WIiIeHhYaGh4WGhoSBhISFhoWFhISEg4SFhIaGhoWGhIaFhoaFhYaGhYSDhISDg4eDhIGChISDgoCAgHt7fn18fHx+fXx8fH19fH18fn18fX18fHx8fXx+fXt8gX99fH18fnx8fHp6fHx9iIeChoiHhoeGhoaDhYaFhoaGhYOFhIaFhIiJg4GEg4SGhIaGhoaGhIeHiIiHh4eIioiGh4iHiImIhYiHhYaGhoeHh4WHhoiIh4eFh4eHhYaHhIKEg4SGhYeFhISEhISFhoaGhoaFh4WFh4WGhYaFhIOEg4OEh4GDgIKDg4KCgn+Ae31+fXx8fH59fH19fH57fHx7fHx9fXt7e318e359e3x/fX18fX1+fXx6ent7fHyIh4KGhoaGh4aGhYOFhoWFhYWEg4WChoSDiId/enqChYaEhoaFh4aEh4eIiIiHhoiKh4aHh4eIiYeFiIeFh4eGhoeHhYeGiIiHhoWHhoiGhoeDg4SEg4aGh4WFhISEhYaGhoaGhYaHhoaIhoaEhoWDg4ODgoOGgYN+goKDgIOCf398f35+fHx9f318fX18fXt7e3p7fHx8e3t7fnt7fXt6e358fHx8fX5/fXt6fHp8fImHg4aFhoWGhoWEhIWFhYWFhIOBhIGGhIKEhHyAhn+ChYWGhYWGhYSHh4iIiIaFiYqHhYeGh4eIh4WIhYaHiIaGh4eGh4aIiIeFhoeGh4WFiIOEhoWEhoaHhoWEg4WFhoaGhoaFhoaHhoeHhYOFhYOBg4KBhIWCg36BgYF/g4F/fn5/fX98fH1/fXt9fXx+enl6eXt8fXt7e3t+fHx8fHp7fXx8fHx+fYF8e3t7e3x7iYeEhoSGhIaGhYSFhoWEhIOEgoCDgYaDgYJ/eoSMe4CEhYeGhoaFhIeIh4aHhYWHiYeEh4WGhoiGhYeEhoeIhoaIh4eHhoeIhoSGhoaHhYWHg4SFhIaGhoeFhISDhYWGhoeGhoWGhoaFhoeEg4SFgoGCgYCEg4OCfYGBgH6DgX5/f4B8f3x9fX59e359fH15eXp5e319enp7e318fXx8ent9fHx9fH5+gHt7e3x+fXyIh4WGhYeEhoSFhYWFhYODgYOBgIKBhYJ/gH9/fXx7gYSFhoaEhYSDh4eGhoaFhIaJhoKGhIaGhoWFh4WHiImGhYiHiYeGhoeFhIaFhYeFhIeDhIWEiIaGh4WFhIKFhYaFhoaHhIaGhoaFhoODg4WAgIGAgIOBg4B8gYB+foKAfYB/gXx/fH1+fX57fn18fHl6enl6fX15enp7fHt8e3t7e319fH18f35+fHt7fX59fIiGhYaGhoSFhYSFhYSDgoKAgoGAgICDgX5+foB5en2Ag4OFh4WEg4OHhoOEhYSChYiFgoSDg4WFhYWHh4aIiIaFiIeJh4aFhYWDhoSFh4OEhoSEhYSHhoWGhYaEgoWFhoaGhoaEhYaGhYWFgoKDhH9+gICAgYCDgHuBf31+gn5+gH6Afn99fX59f3t/fXt6eXp6eXp8fXl6ent7enx6e3t7fH19fXyAfn18fH1/fnx7h4WFhoaGhoSFhIWDhYKBgICAgYB+f4KCfX1/f3t/f4KDg4WGhYSDg4aDgYOEgoCFh4WCg4GBg4SEhIaGh4iHhYWIhomHhYSEhIKFg4SGgoOFhISGhIeGhYWFhoOEhYSFhoWGhIOEhYWDhYSBgYODf35/gH9/gIN/fIB9fX+CfYCBfn6Bfn5+fX1/e398e3p5enp5ent8eXp6e3t7fHp7e3t8fX19fYB9fXx8fYB/fXyGg4aGhoaFg4SDhoKFgYGAf3+AgH5/gYJ8fn9/foCAgoKChIWDgoGChIGAg4KBgISFhYKBf4CCg4OEhYWHhoaEhYeFh4WGgoOCgoOCgoWBg4WEhYaEhoaHhoaFgoSEg4SFhYWDhIODhIKEhIB/goJ/fX5/fn5/hH57f318gIF9gYB9foN9fn59fX57fnt7enl7enl6ent5enp6e3t8ent8fHx+fn1/gXx9fHx9f4B+gIaEhYWEh4SEg4KGgoOAgYB+fn+AfX5/gnx9f39+fn+BgYKEg4KBgYKCf4CBgoCAgoWEgoB/gIGCgYOFhYeFhISGhoOFg4WBgoGBgoGCg4GChISEhYWGh4eGhYSDg4ODhIWFhIGDgoOChIODgH+AgX59fX5+fH6Dfnx+fHyBgH6Cf35/gnx/fn19fHx8e3t6enp6eXt6enp5enp6e3x5e317e35/f4GAfX59fX1/gICAhoSEhYSFgoSCgoSCgoCBgH59fn9+fn6AfX2Af35+foGBgoODgoSHgYF+gICBf3+ChIOBf35/gIJ/goWEhYOCg4WFgoSBg4CBgIGBgYKBgIGEg4OGhYWHh4WEhIWCgoKDhYSCgYGBgYCFg4F/foB/fnx9fn18foN9e318fYF/gIN9fYCBf35/fXx8fH17e3p5enl5e3l6enl6ent7e3p7fXx8f3+BgoB+gH+AgH+AgIDKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzNzc3Nzc3Nzc3NzczMzMvLy8vLy8vLy8vLy8vLzMvLy8vLy8vLy8vLy8vMzMzMzM3Nzc7Oz8/Pz9DQ0NHR0dLS0tLS0tLT09PT0tLS0tLS0tPT09TU1NTU09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tLS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1dXV1NTU1NTT09PT09PT09PT09TU09PU1NTU1NTU1NTU09PT09PS0tLS0tPT09TU1NTU1NPT09LS0tLS0tLR0dHR0dPHhnNlYFtLWWdVTUZIQD03Nzg5Nzw8PDo8Oz42Oj04PDs6OTg3ODs7Oj87PTs8PD47P0E/QkJBQ0RFREE+PTw7QENDQUBDQ0FBR0hHSUtSwtXS09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXVysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMy8vLy8vLy8vLy8vLzMzMy8vLy8vLy8vLy8vLzMzMzc3Nzc3Oz8/P0NDQ0NHR0tLS0tLS09PT09PT09PT09PS09PT09TU1NTU1NTU09PT09PT09PT09PT09PT1NTU1NTU1NTT09PT09LS0tLS0tLT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1NTU1NPT09PT09PT09PU1NPT09TU1NTU1NTU1NPT09PS0tLS0tPT09PU1NTU1NTU09PT09PS0tLS0tLR0dHSzIxyZ2BcTVllUktHSz87Mzc4Ozg5Pj05PDpBOjs9Nzs8PDo6Nzg6Oz0/Oz88PTw/Pj9BPUFBPkNDREJAQT46Oz9DREFDRERCQklHSEhJTr7V0tPT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1crKy8vKysrKysrKy8vLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzMzMzMzMy8vLy8vMzMzMzMzMzMzLy8zMzMzLy8vLzMzMzc3Nzc3Ozs/P0NDQ0NDR0dLS0tLS09PT09PT09PU09PT09PT09TU1NXV1dTU1NTT09PU1NPT09PT09PT1NTU1NTU1NTU1NPT09PS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1tbV1dXV1dTU1NTT09PT09PT09PU1NTU09TU1NTU1NTU1NTT09PT0tLS0tLT09PU1NTU1NTU1NTU09PT09PT0tLS0tHR0s+Sd2hfXk9XZ01LRks9ODc2NTk5OTw+OT88Qzo7PDc5PD07OTc5Ojw9QDs+PT47PD48PT5BQD5EQ0NDP0E9Ojs9QkNFQ0NEQT9FSEpJSky61dPT09TU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8rKysvLy8vLy8vLy8zLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMzMzMzMzMzMzMzMzMzczMzMzMzMzMzMzMzMzMzc3Nzc3Ozs/Pz9DQ0NDQ0dHS0tPT09PT09PT09TU1NTU09TU1NTU1NTV1dXU1NTU1NPU1NTU09PT09TU1NTU1dTU1NTV1dTU09PT09LS0tLS0tLS09PT09TU1dXV1dbW1dXV1dXV1tbW1tXV1dXV1NTU1NTT09PT09PT1NTU1NTU1NTU1NTU1NTU09PT09LS0tLT09PU1NTU1dXV1dTU1NTT09PT09PT0tLS0dHRmn5nYWJOVWpKSElLPzw6OTM3Njc3PTs+Oj06Ojo4ODo7Ozg4Ojs7PD46PT09Ojw/PD0/QkA/Q0RDRD5APT08QENEQ0JEQkQ+REhJSUtMttfT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3MzMzMzMzMzMzMzMzNzc3NzczMzMzMzMzMzMzMzc3Nzc3Ozs7Pz8/Q0NDQ0NHS0tLT09PT09PT1NTU1NTU1NTU1NTU1NTV1dXV1NTU1NPT1NTU1NTU1NTU1NTU1dXV1NXV1dXV1NTU09PT09PS0tLT09PT09PU1NXV1dbW1tXV1dbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1NTU1NTU1NXU1NTU1NTT09PT09PT09PU1NTU1dXV1dXV1dTU1NTU09PT09PS0tLR0p+DaV9kU1hsSEhIS0A9Nzg0NzY6Oj87RDw8Ojw8OTg6OTo6Ojs8Ojo7OT49Pjk9QDs/QUFCP0JCQUM9Pz8+PEBCRUNDQkBBO0ZJR01MSbLY09TU1NTU1NXV1dXV1dXV1dXW1tbW1tbV1dXW1svLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzM3Nzc3Nzc3Nzc3Ozc3NzczMzMzMzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc3Mzc3Nzs7Ozs7Pz8/P0NDQ0NHS0tLS09PT09PT09TU1NTU1NTU1NTU1NTV1NXV1dTU1NTU1NTU1NTU1NTV1NTU1dXV1dXV1dXV1dTU1NTU1NPT09PT09PT09PU1NXV1dbW1tbW1tbW1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTV1NTU1NXV1dXU1NTU1NTT09PT09PT1NTU1dXV1dXV1dXU1NTU1NTT09PT09LS0tSjiGxfZlJWakdIR0lBPjM2Njo7PDhDPEJBPjtBPDg5Ojw6Ojw8PDk8PTo7PD09PD89QD9AQT9AQUBCPD4+PzxCQ0NDRkBBQT1ISklOTUeu2NPU1NTV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbMzMvLy8vLy8vLy8vLy8vLy8vMzMzNzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzs7Ozs7Oz8/P0NDQ0NHR0dLS0tPT09PT09TU1NTU1NTU1NTU1NTU1NTV1dXV1dXU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dXU1NTU1NTU09PT09TU1NTU1NXV1dbW1tbW1tbW1tbW1tbX19bW1tXV1dXV1dXV1dXV1dTU1NTU1dXV1dXV1dXU1NTU1NTU09PT09PT1NTU1NXV1dXV1dXV1dXV1NTU1NPT09PT0tLWroprY2VSWGhMSkdJQjg0OTQ6Ozo5QDk+Q0U/PDw5OTk9Oj07PDw6PTw7OTw9Ozs/PUA9PT5AQD9CQT5APD05QERDQkFBQj48SEpLTU5IqNnU1NXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbWzMzR09PT09PT09PT09PT087Ky8vLzMzMzMzMzMzMzM3Nzc3Nzc7Ozs3Nzc3Nzc/Pz8/Pz8/Pz8/Pz9DQ0dHR0dHR0dHR0dHS0tHV2djY2NnZ2dra2tvb29vZ2dnZ2dna2tra2tra2tjW19fX19fX19jX19fX19XV1dXV1dXV1dXV1dXV1tfX19fX19fX1tbW1tbX2tra2tra2tra2trb3NzX1dXV1dXV1dXV1dXW1tbX1tbW1tbV1dXV1dXV1dXV1dTU1dXV1dXV1dXU1NTU1NTU1NTU09PU1NTU1NXV1dXW1dXV1dXV1dTU1NTT09PT09PS1bqKa2hoUlhlSUlMTkA5OTo0O0E8Nz05QUM+QD89ODo6Ozk9Oz4/Ojs8PDo7PDo7Pj1APT8/P0FAQUE/QTw8Oz5BRENBREA9PElJSk1ORqPa09TV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbW1szNhG1wcHBwcHBwcHBwcGqn493d3t7e3t7e3t7e3t3S0NDQ0NDQ0NDQ0NDQ0ci5ubm5ubm5ubm5ubq6t6WkpKSkpKSkpKSkpKSnhmBjY2NjY2NjY2NkZGRlhIuKioqKioqKioqKioemuri4uLi4uLi4uLi4uLrR1NTU1NTU1NTU1NTU1cm7vb29vb29vb29vb2+tIqKioqKioqKioqKiouHvebh4uLi4uLi4uLj4+Pi2NfX1tbW1tbW1tbV1dXV1dXV1dXV1dbW1dXV1dXV1dTU1NTU1NTU1NTV1dXV1dXW1dXV1dXV1dXV1NTU1NTT09PT09XDkXFrak5TYkxMVk08Ojo3Nz5DPjg+Oj8/QT0/QDc7Ojs7PTs+Pjo7PD48Oz07PT8+QDw/Pz1AQEBBPj88PjxAQUVCQkZAQD9HSEpLT0ae2tXV1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19fMzk4mKysrKysrKysrKysiivTr6+rq6urq6urq6uvp1dLS0tLS0tLS0tLS0tTEqaqqqqqqqqqqqqqqq6aGhIWFhYWFhYWFhYWFik4MEhISEhISEhISEhIRE0pUU1NTU1NTU1NTU1NPg6ejo6Ojo6Ojo6Ojo6Knz9PS0tLS0tLS0tLS0tS/qKqqqqqqqqqqqqqqrJtTUlNTU1NTU1NTU1NTS6ry6+vr6+vr6+vr6+vr6dnX19fX1tbW1tbW1tbW1dXV1dXV1dbW1tbV1dXV1dXV1dXV1dTU1NTV1dXV1dXW1tXV1dXV1dXV1dXU1NTU1NTU1NPUy5h2bGlKTl9NUlVNPjw8Nzs/Qz42Ojc+Pzs9Qj85PDk9Ozw6PD07PTs9Ozs9PD0+PT07QT08QUBBQT08Pzw7QEJDQURFPUFAQ0ZLS09GmNzV1dXV1dbW1tbW1tbW1tbW1tfX19fX19fX19fXzc5SKzExMTExMTExMTExJ43z6enp6enp6enq6unq6dXS0tLS0tLS0tLS0tLUxaqrq6urq6urq6urq6yoiIeHh4eHh4eHh4eHh41SEhgYGBgYGBgYGBgYFxpOWVdXV1dXV1dXV1dXU4WopKSkpKSkpKSkpKSjqM/T0tLS0tLS0tLS0tLUwamrq6urq6urq6urq66dWFdXV1dXV1dXV1dXV0+r8erq6urq6urq6urq6unZ19jX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dXV1dXV1dXU1NTU1NTU1NGcenFpSlRdT1JVTkQ+Pzs/QEA4Ojs4PDs7PD86Ozs4Ozk5Ozw7Ojw5Ozs8Ozo9PT0+PUE/Pj8/Pj08PT88PEFBQ0FERTw+QEVGSktNRpPc1dXV1tbW1tbW1tbW1tbW1tfX19fX19fX19fX183PXDk9PT09PT09PT09PTWT8Ofn5+fn5+fn5+fn5+bV0dLS0tLS0tLS0tLS08Wtrq6urq6urq6urq6vq46NjY2NjY2NjY2NjY2SXSInJycnJycoKCgoKCcpWmNiYWJhYmJiYmJiYl6MrKmpqampqampqampqazP09LS0tLS0tLT09PT1cKtr6+vr6+vr6+vr6+xoWJhYmJiYmJiYmJiYmJbr+/p6enp6enp6enp6enn2djY2NjY19fX19fX19fX19fX19bW1tfX19fW1tbW1tbV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbV1dXV1dXU1NTU1NTWo3txZElbYE5OVU9AQT89REI+Oz06OTs6PT07PDs6OTg5OTs8Ozw8Ojo7PDo7QD08PTxAQTxBQTs7PEA/PD1CP0RDQ0U8PkJERkpMTEWN3NXV1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjNzcXCw8PDw8PDw8PDw8PCydDPz8/Pz8/Pz9DQ0NDQz87Ozs7Ozs7Ozs7Oz87NzMzMzMzMzMzMzMzMzMvJycrKysrKysrKysrKysfCw8PExMTExcXFxsbGxsvMy8zLzMzNzMzMzMzLz9HR0tLS0tLS0tLS0tLS1NXV1dXV1dXV1NPT09TT0tLS0tLS0tLS0tLT09HNzc3Nzc3Nzc3Nzc3NzdTY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NfX19fX19fX1tfX19fX19bW1tbW1tbW1tXV1dXV1dXV1dbV1dbW1tbW1tbW1tXV1dXV1dTU1NTU169/cF5GXmJQUVdOR0ZDQ0lBPz07PDo8N0BBPD04Ojo4OTg7Pzs8PDs7PDw8PD87PD46Pj44PkI8Pj1BPjw+QkBERUNAPD5APkNJSUtEh9zV1tbW1tbW1tbW1tbX19fX19fX19jY2NjY2NjYzs3P0NDPz8/Pz8/P0NTQ0M7MzczP09LSzs3P0s7Ozs7Ozs7O09TQz9DU0s/Pz9PSz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0NDR0dHR0dHS09PU1NTU1dXV1tbW1tfW1tbX1tfX19fX19fX19bW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dTU1NTU1NbV1tbW1tbW1tbW19bW2NjY2NjZ2dnZ2dnZ2dnY19jY2NjY2NjY2NnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjX19fX19jY19fX1tbW1tbW1tbW1tbW1tbW1dbW1dbW1tbW1tbW1tbW1tXV1dXV1NTV1di4gm9XSl9jUlFaS0hBQTxCPT07Oj4+PD4/PT0/Nzk6OTk3OD48PD47Ozw7PDs/PT0+OTs7OT0+P0A+QD07OkI/QkNCPz0+QD5CRUdKQoDc1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2M7Ozs7Ozs7Nzc3Nzsqfys3Nzc3QuYOEi8fTwJrLz87Ozs7O0KaSxdPIlKfS0ceSq9HOzs7Ozs7Ozs7Ozs7Oz8/Pz8/P0NDQ0NDQ0NDR0dHR0tLT09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbV1dXV1dbW1tbV1dXV1dXV1NTU1NXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NfX19fX1tbW1tbW1tbW1tbW1tXV1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXYwIBuVU9gY1dZW0xMQ0A9PTs9Ojw+Qj5CQ0A8Ojg5ODo6Ojc7Pz4/PDw7PDo5Pzw8PTg5PD9BPj09PUFAPTtBQkBCQz47QD9BQUlHSkF629bW1tbW1tbX19fX19fX19jY2NjY2NnZ2djY2dnOzs7Ozs7Ozs7OzdKpj63Rzs7Ozpu3tqSiwJOerNPOzs7O0qqdrJTJmqycsNGZrJqy0s7Ozs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0dHS0tLT09TU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dbW1tbW1tXV1dXV1dXU1dXV1dXV1dXW1tbW1tbW1tbW1tfX19fX19jX19fY2NjY2NjY2djY2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2dnY2NjZ2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV18h/b1pTYWVeXVxPSkQ9QD8+Ozc6Pjk/RD5AOTg3ODk7Ozw4OT89PTw9PD47OkE7OTs5OzxDQDw7PT5AQT49QkQ/QkM9PT8+Pz5ISUg/ddrW1tbX19fX19fX19fX2NjY2NjZ2dnZ2dnZ2dnZzs7Ozs7Ozs7Ozs/Inrym0tDQzsqgl36Cw6abr6fUz8/P0MmXmYWmp5eInJ7EkoadnM7Pzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dLS0tPT09TU1dXV1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tbV1dXV1dXW1tbV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2djY2NjY2NnZ2dnZ2dnY2NjY2NfX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dbV1dXV1dfNiHNdWGloXl9gT0lGOkFAPj88PDo2P0JAQjk2NDc6Ozo8Ojk+PD49PTs/PTxBPjw8Ojw8PTw6PEA9QEI+PkFCPUNDPT0+Oz9BRUtIQHDZ1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2c/Pz8/Pz87Ozs7SrKWnqdXAvNLHnY+ey9PJipmq1M/Pz8/RpLC9l6LAyZiYxbzJl5nG0M/Pz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0dHS0tLS09PT1NTU1dXV1dXV1dbW1tbW1dbW1tbW1tbV1tbW1tbW1tbW1dXV1dXV1dXW1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnY2NjY19fX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0JB1W1tqaWFeXVNOSTxDQEE+QD46OEVAP0M6NzQ5Ojo5Ozs4Oz0/Pj49QT08P0A9Pjw8PDw8Oj1AQD8/PT5CQD9AQkA8QD0+QUVLRz9r19fX19fX19fX2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnPz8/Pz8/Pz8/QzJ2Nl6zQmpfKxZ6ynpbN1q2ZqtTPz8/Pz9DVuZim1pSWn87RkpmgztDQ0M/Pz8/Pz8/Pz8/Pz8/P0NDQ0dHS0tLT09PT1NTU1NXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX19fX19fY19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tKUcl5ea2tqZV1PTEc/RENDQDo9OzxCPD49OTY0Ojk5Ojo5Nzs/QDs8PUA8PEE+PD07PTw/PDo8Q0A+PTs9QD5CPkBBPkA9QD9GSUQ/ZtXX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2traz8/Pz8/Pz8/P07GigJuvyaCjv8qcpYynrdiqmarUz8/Pz8/Q0Zqdu7Ofw5varaO/ntXQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1NXV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dbW1tXW1tbW1tbV1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbSk3BgXnBoZmVaUUhHQkVDQEA3Ojo8Pjo8OTc2NTk6Njo8Ozc8QEA8Ojo9Ojw/Pj08OUA8PDo6OT9APj08PUBBQz9APz5BOz9ARkpCP2LS2NfX2NjY2NjY2NjY2dnZ2dnZ2tra29vb29vb28/Pz8/Pz8/P0M6fkGyclteqo9PSrqa1mJ/Vqpmq1M/Q0NDQ1aekoNPNipKex8uIlZ7I0tHR0NDQ0dHQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1dXV1dbW1tbX19bW1tbW1tbW1tbX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfW1tfX19jY2NfX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX1tbW1tbW1tbW1tbW1tbX19fX19fW1tbW1tbX0pNuYFxxZGdkWlVKQENGQ0FCODs/PD07PDw4NTU4OTY4Ozo5PDo+Pzw9PTk8Pz49Ojo+OTw6Ojg+Pzw9PTw+QEFDQT48PDpCRERKRkJd0NnX19jY2NjY2NjY2dnZ2dna2trb29vb29vb29vPz8/Pz8/Pz9G9n8O31pfA09HQ0srSzZeb1KqZq9XRz9DQ0sCdosjVzdulmbPQ26OZtdXR0dHR0dHR0dHR0NDR0dHR0dHR0tLT09PU1NTV1dXV1tbW1tfX19fX19bW1tbW1tfX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19fY2NjY2NjY2NjY2NjY2djZ2dnZ2dnZ2dnZ2dnZ2drZ2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fX19fX19fW1tfX1tbX19fX19fX19fX19bW19GRbF1cb2doYl1PRkBISUdFQDw8Pj48PT48NzU2Ojk2OTs6Ojs4QD86PDw5PD49Ozs6Pzk/Ojs5PT49Pjw7PTxAQ0I/Pz47Q0ZGR0hEWc3a2NjY2NjZ2dnZ2dnZ2dna2trb29vb29vb29vb0NDQz8/Pz8/Pz5V+e6WS1KKa08ySl6ObodirmavV0pem09SkoI+4yI+nmqCtkKeYnrvV0dHR0dHR0dHR0dHR0dHR0tLS0tLS09PU1NTV1dXV1tbW19fX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tbX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2tnZ2dnZ2dnZ2djY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX1tfPjGRWXnBrXGBgTkVITUlJT0M+OkI9PUBCOzU1Nzw6Nzo7Ojo7OT09OTo6OT0+Pz07OT47PDo8Ozk+PD47PD0+QENCPz5BPEFDR0ZGRVXJ29jY2NnZ2dnZ2dnZ2dra2tvb29vb29zc3Nzc3NDQ0NDQ0M/Pz9DR1aeZrcmjqL7KnbGdo7XZqZup2LirocjGpr2VlIynpaigr6eiqZ3Q09LS0tLS0tLS0tLR0dHS0tLT0tPT09PU1NTV1dbW1tbX19fX19fX19fX19fX19fX19fX19bW1tbW1tfX19fX19fW1tbW1tbW1tbX19fW1tbW1tbW1tbX19fX2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2djY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fX19fX19fX19fY2NfX19fX19fYzYZdV2JvZE9dVEtIRlNRS0xAPj1EPD9DRj01NTc7OTY6Ozo8PTo7Pzo6OTg6PT0/Pjs/Oz49Ojs5Pjs9PD0+QURCQD8+PzxAQUVHRURSxdvY2dnZ2dnZ2dnZ2tra2tvb29vb3Nzc3Nzc3NzQ0NDQ0NDQ0NDQ0NO5gL3Tm5bP1LWLkZ/T1LyBu9TOlKDUyo6Tl5CooZKNutWako6+1tLS0tLS0tLS0tLS0tLS0tLT09PT09PU1NXV1dbW1tfX19fX19fY2NjY19fX19fX19fX19fX19fW1tbX19fX19fW1tbW1tbW1tbW19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2tnZ2tra2tra2tra29ra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2NfX2ct+WlVqaltMX01KTEpVTEZCPD0/R0ZHS0g9NjU3Ojk3OTo7Ojw9OT45OTo4Oz0+PkE+PTk8PDo9Pj46PTk5Oj9FQUA+PT8/QkBHRURFUMHc2dnZ2dnZ2dna2trb29vb29vb3Nzc3Nzc3dzc0NDQ0NDQ0NDQ0NDQ0cHR0crI0tDUxLjS0tHSwtLQ08fM0tTCr7Cz0tS5x9XT07nI1dLS0tLS09PT09PT09LS0tPT09PU1NTU1NXV1dbW1tfX19fX19fX2NjY2NjX19fX2NfX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29va2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2djY2NjX19fX19fY2NjY2NjY2NjY2NjY19rHd1xSZ2laTlpOTFBRV0VKPz89P0FFTExBPjc3NTs4ODk5Ojs8Pjw+ODo6OTs+P0A9Pj46NTo6Oz0/Ojs5Ojw+QkJAPz8/P0FCR0RDRE683dnZ2dnZ2dna2tvb29vb29vb3Nzc3Nzc3d3d3dDR0dDQ0NDQ0NDQ0NDS0NDR0dDQ0dPU0dHR0dPR0dHS0tHR1NbW1tLS1dTT09PW1NLS0tPT09PT09PT09PT09PT09PU1NTU1dXV1dbW1tfX19fX2NjY2NjY2NjY2NfX19jY19fX19fX19fX19fX19fX19fX1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tvb2tra2tra2trZ2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2trZ2tra29ra2trZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjbwXNYVWlrU0xSTlBSWVRGSTw+Qz9BQkVKPj43ODY5Njc4OTk7Oz0/QDw9ODk7Ozs/Pjw8OTU6PT47OTk7PD8/P0JCQT1BPUBBQkZCQkJLtd7Z2dra2tra2tvb29vb29vc3Nzc3Nzd3d3d3d3R0dHR0dHR0dHR0dDQ0NDQ0NDQ0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tPT09PT09PT09PT09PT09TU1NPT1NTU1NTU1NXV1dXV1dXW1tbX19fX2NjY2NjY2NjY2NjY19fY2NjX19fX19fX19fX19fX19fX19fX19fW1tbX19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2NjY2NjY3LxvVFRsbExLUkpUUlVLRkQ6PkdEREFERjw/ODk6OTY5OTo3PD07PkA9PTc5Ojs5Pjs5OTY2Oj1AQT47PDk6Pj9DQT4/Qj0+QkNFQkFCSrDe2dra2tvb29vb29vb29vc3Nzc3Nzd3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0tLS0tLS0tLS0tLS0tLS0tPT09PT09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1tbW1tbW19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19fW1tbW1tfW19fX19jY2NjY2NjZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2dnZ2dnY2Ny2a1NbcGtLVVdSXFFXSEQ+PEJKRT1ISj89PDc4ODo1OTg5Njs+PD1APDw1OTk8Oj87OTk0ODw9PUFBPD47Ojw+QD89PkE9PUNGR0I/Qkmq39ra29vb29vb29vb3Nzc3Nzc3N3d3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHS0M/U0M7P0tLT0tLS0tLS0tLS0tPT09TU1NTU1NTU1NTU1NTU1NTU1NTU1NTV1dXV1dXV1dbW1tbW19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19jY2NfX19fX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dndsGRTYXJfT1pUV19RUkdCPUVJS0FBTEQ/Pzs5ODg5Mzg2ODY5Pj0+Pz06Njo7Pjs9PTo5Njg6PTtAQDxAPz0/P0I+PD48PEJFSElCPkNJpODa29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3t7S0tLS0tLS0tLS0dHR0dHR0dPT0bm7zLqbnLrQyNPT0tLS09PT09PT09PU1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2NjZ2dra2tra2tra2tra2tra2tra2tra2tra29va2tra29va2tvb2tra2tra2tra2tra2trb29vb29va2tra2tra2tra2tra2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ3qpfVWBuW1VZUVpeT0xHQ0ZNSUZEREk7QUE7PDg4NjQ4Njk4Nzw/QT89Ojc8Pz48Pz87OjY4OD09QEE9QD5BQD1AOjs6Pj1BRUdKQkBDR57h29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e0tLS0tLS0tLS0tLS0tLS0tO+wMqaoKKViJGeqpOpz9TT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fY2NjY2NnZ2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dna2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2tvb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2d6iXFVeblheXU5aUFROQ0NMSUlJRkpEPEJBPDs4NzY3OTc3OTk9P0E/PDo5QD88PkI/Ojg3NzY9Pz9APUBBPz88PTs7OD48P0VJSEE/Q0aX4dvb29zc3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3tPT09PT0tLS0tLS0tLS0tTIlZyum5m1iX2TjIKBhMTV09PT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tvb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dndmlpYYW5ZYVdPV01QRUJETElNS0ZJRT5CRDk4ODY3OTc1Njk4PT1BPjo4OT4+PD9APzw1Njc2PD4/PjtAQEA/Pj4/Pjs/PkFCRkdCQENIkeLb29zc3Nzc3d3d3d3d3d3d3d7e3t7e3t7f39/U09PT09PT09PT09LS0tLTz6h+kayPko6MhoCIiYSQo8rU09PT09PU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY19jY2NjY2NjY2NjY2NjX19fX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2tra29vb29ra2tra2tra2tna3JJaWWNuWlpSVV5QTDxAR05IUklIRT47SEY4OTc1Nzg3NTg5ODs+Pj07ODlBPj1AP0E+NzU5Njs+QUI/P0BAQUI/Pj8+QUBEQUZIQj9FSozi3Nzc3Nzc3d3d3d3d3d3e3t7e3t7f39/f39/f1NTU09PT09PT09PT09PWtaWaiIuQhYCFi4iBg4qLf4bC1tTU1NTU1NTV1dXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2dnZ2dna2dra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29ra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb2tra29uIWltnalxYTFpfVkg6TEhMSkpDRUVDQExINzo3Njc4ODU4Nzg5PDw7Ozk4QD89Pj8/PDY3PDQ3P0JCQUBAPz8/QT09P0A+QEBGRT09REuI4tzc3Nzd3d3d3d7e3t7e3t7e3t/f39/f39/f39TU1NTU1NPT09PT09PUxZKCg4WGfYGCfXx5foGCg36k29bU1NTU1NTV1dXV1dXV1tbV1tbW1tbW1tfX19fX19fX19fX19fX19jY2NjY2NjZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vc3Nzc3Nvb29vb29vb29vb29vb2tra2tra29vb29zb29zb29vb29vb29vb29vb29vb29va2tvb29vb29vb29vb29vb29vb2tvZgFpebWhaU0ldW1hKRE1ISlNMR0ZBQD9KQjg7NjY5OTc1ODY4Ozo7Ojw5OD09O0A9Ozo2NTw3Oz1CQEFBPD49QEE9PEA/Pz5CREU+PERLg+Lc3d3d3d3d3t7e3t7e3t7f39/f39/f39/f39/V1dTU1NTU1NPT09PT2LKEkKh9g3l2hIh/e3d5gn5+i67A1dTU1NXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dna2trZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2tra2tra2trb2tra2tvb29vb29vb29vc3Nzc3Nzc29vb29vb29vb29vb29va2trb29vb29zc3Nzc3Nvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc1nlcWmxmWFJPYFFSQUhHSkZYTEZAQENDSz87Ozc4ODc2NTc2ODo5PDw6PTs/PTs9Pjw7ODg8OT0/QkFCQzw8P0FCPj1BQkNCREVDQDtDTH3h3d3d3d3e3t7e3t7e39/f39/f39/f39/g4ODg1dXV1NXU1NTU1NPU0ruen3WKeXuIgICChYGDcnOAhYOMrNfV1NXV1dXW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NnZ2dna2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra29vb29ra2trb3Nzc3Nzc29zc3Nzc3Nzc3Nzb29vb29vb29vb29rb29vb29vb29zc3Nzc3Nzc3Nvb29zc3Nzc3Nvb29vb29vb29vb29vc3Nzc3Nzc3Nvb29vb3dByXV9wZVdLUGNPS0JHQ0pIS0ZBPEE9SFBBOjo3Nzg3Njc4Nzw6OD09PD47QD88Pz07Ojs5Ojk8QEJAQkNAPUFAPz1AQkNDQUBAP0A7RU144N3d3d7e3t/f39/f39/f39/f3+Dg4ODg4ODg4NXV1dXV1dXV1NXU18h4i4V8goh6g4SBfoKCc2l0hYuGkJ3U1tXU1dbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tvb2tvb3Nzc3Nzc3Nvc3Nzc3Nzc3Nzc29zb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb297KalxjcWVST1heSz9HTElPS0VAPkFCP0lPPjk6NzY7NzY6Ozc7Ojg6PDw+Oz09Oz48Ojs4OTo4OUFCQkFAQDtAQj06PkFCQz8+PT4/PUZOdN/e3t7e3t7f39/f39/f4ODg4ODg4ODg4ODg4OHV1dXV1dXV1dXV1s6dhpl+f5OTin+CgXx9gnNxm4mAgoOJwNnat7TQ19bW1tbX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tra2tra2tra2tra29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NvfwGNaW21gVlBTU0pETEhNSEk8PkFEQ0ZORDw8OTc5OjY4Ozk3PDk4OTw9OzlAPjpBPzw3NTc7ODpAQUVBPz45PUI/Oz1CQkI6Pj07PT5GTnHe3t7e3t/f39/f39/g4ODg4ODg4ODg4OHh4eHh1tbW1tbW1tbV1tjLioCHhYOXjHh7e3lvfYF1a3ebdHZ7eInHxpiMrdjZ19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2drZ2dna2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tra29vb3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29zb29vb3Nzc3Nzc3Nzd3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3Nzc3Nzc4LdjV1lrYlJNVVFMSktGS0ZDQD5CQT9FTT4+PTg5OTo3OTo3NT03Nzo+PDs7Qjw5Pz05NjY4PTk6QEJGQD49PEBCREA9QD9DO0A9PD4/Rk9t3N/e3t/f3+Dg4ODg4ODg4ODg4OHh4eHh4eHh4dbW1tbW1tbW1tfVrYZ6d32rn3l4entzdH+Dfm9xe3l6c3t2k4qFgImkzdnY19fX2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tna2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29vb29vc3Nzc3N3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vc3Nzb3Nzc3Nzc3N3d3d3d3d3d3dzc3Nzc3Nzd3d3c3Nzc3Nzc3N3d3d3d3d3d3d3d3dzc3OGtYVtebGJSTVZMTUdLS0RGQkI7QT08RUxDQT44Ojk6Nzc5NjY6NTs+QDs9Oz89PD89Ojk5Ojw5PEVDRkA/PkBDQkQ9OT0/QT1CPz1APkdPadvf3t/f3+Dg4ODg4ODh4eHh4eHh4eHh4eHi4uLW1tbW1tbW1tfQmH+Qh4N9eoN2e3Vzenl6kKqmd3JyfoeHh4CAfoKEhJHJzNnX19jY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra29va2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2djY2NnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vb3Nzc3N3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzb29vb3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3dzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3NzhpV9UYm1iUE9TSUhHRkpJSUJBPkJCPEVFREA+ODo4Ozc3Ojc4ODY+Pz07PDk9PDo+PTs6Njc7NjpEQUY+Pz8/PkNBPzs9PT47REM/PjxIT2fZ4N/f3+Dg4ODg4eHh4eHh4eHh4eLi4uLi4uLi1tbW1tbW19jYyH52doN+fnR2eIaCenl1d5yhu6GEgoCAfoeKinx/gYaMnKjO2NjY2NjY2NjY2djY2NjZ2djY2NjY2dnZ2dra2tra2trb29rb29rb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3d3d3d3c35pbT2drXFBRUElDT0pLR0xHSkJAP0FHREBBPDg8ODg1ODk3Njc3QEA/Ozw5Pj04PTw8Ojc4PTk/RENGPkE/QkBDPzw6Pj0/PkVEPz07S1Fj1+Hf4ODg4ODh4eHh4eHh4uLi4uLi4uLi4uLj49bW1tbW19XB3LRueHJze3B6eXaFiIR7eH2AgZiljH98fnuRhZaLhoGDgY6Rvd3Z2NjY2NjZ2dnZ2dnZ2dnZ2dnY2dnZ2dna2tra2trb29va2tva2tra2trb29ra2tra2tnZ2dnZ2dnZ2dnZ2dna2trZ2dnZ2dra2tra2tnZ2dnZ2dna2tra2tra2tra2tra2tra2trb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t3d3d6NWFdobllQUUtISlNJTUhNSUtBQz9DRkJBRDo6PDg2NDg4NzY2Nj8+Pjo8OTw7Oj09PDw4Ozw8RERERT4/PkI+Qj84PT8/Q0NCQEE+O0xUY9Xh3+Dg4OHh4eHh4eLi4uLi4uLi4uLi4uPj4+PW1tbW1teslLZ6eHJvd5V7dHuLgHh1bn6Fg3t/hYhyfH2bnI6JioJ+g32Hk5rH1NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2trb29vb29vb29vb2tra2tra2tra2tra2tnZ2dnZ2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2trb2tra2tra2tra2trb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d7Zf1lgaGxcUUtHR09LTk5PTURGQkg/Q0hEREA6Ozs4NzU3Nzc4NThAPkA7PDk8Ozw+Ojk7OTk7OUZERUI8QD4/PEBDOz5AP0A/Qj8+OjtKVWPV4eDg4eHh4eHi4uLi4uLi4uLi4uPj4+Pj4+Pj1tbX19vKhYR3cXJubniVhHt4hH95dnB4c3eLkY6CdnN9ioaId3d1d4ODfIiIk8Pb2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2trb2tvb29vb29vb29vb29rb2tra2tra2tra2tra2tnZ2dnZ2dna2tra2tra2tra2trb2tra2tra2tra2tra2trb29vb29ra2trb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f0nVZaGlqVk5KSE1OR01EUElGSD9FPUZMREM+Ozs8OTc3OTY2OTU4Pj4/PTs8QDs9PDo3Ozc5OThHREVCPUE9Qj8+QDw/QUE/QEJAPjs8S1Ri1OLg4eHh4eLi4uLi4uLi4+Pj4+Pj4+Pj4+Pj49fX19fEknuJf29sbnV2foSBg4qGfnVybWVtiIaKjoR7c4OHint4e4OPj4GEioqxztrZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29zc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tvb2tvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3dzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f3t7e4clsW2pqalNOR0hOT0VIRk1JSUA7RD5ISUA9PDo6Ojg2ODo3Nzk0OD08PT07ODw8PDw4Njc4OTo6RUJFQT9APEI/Q0M+PkNEQUBAP0A8PUtRYdPj4OHh4uLi4uLi4uPj4+Pj4+Pj4+Pj4+Pj5OTX19fZqXaFfnx3bHB3eXh8jH2KhYB3anN0d3p9bot7fnl6foR/gIGDfnh8foeGlrbT2tnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra29ra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/e3uO9amFpa2lRTkZNTEtKWE1OR0FAQE9BQz9AOzw4OTk5Njg2NjY4NDs+PD07OTY6Ojk6OTU4OTg5OkJERj8+Pj5AQEBCPzxBQD88Pj9BOT5KT17S4+Hh4eLi4uLi4+Pj4+Pj4+Pj4+Pj4+Tk5OTk19fX2sqKhIB5c29tcXN1d4CUeHaAfHWHhXd1cnWgmXp7d3Z5doR0bWxue3iAmouTu9za2tra2tra2trb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc29vb29vb2tra2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f397js2lpbmloUFBPTExPUk9LU0Y/RURERD48PDg7ODc5OTU2ODY2NzM6Pjs+PTc6Pjk5OTk2Ojo4NzxDRUc/Pzs/PkA9PkE9Oz0+OUFAQDhBTlFc0OTh4eLi4uLj4+Pj4+Pj4+Pj4+Pk5OTk5OTk5NjY2NjauY6AenZ1bmpveHCBfWt0cnZ3hIV5h4d5lY55eXp1d3pza298gHx2fYh8gLLe2tra2tvb29vb29vb29vc3Nzc3Nzc3Nzc3dzc3Nzc3Nzc3Nzb29vb29rb29vb29ra2tra2tra2tra29va29vb29vb29vb29zc3Nzb29vb29vb29vb29vc3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3t7e3t7e3d7e3t3d3t7e3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/f39/f4qpqa2hrZFNQT0ZQVFJOSFJLPkREQ0I7Ozk6Ojg2Nzg1NjY4ODg0Oz88Pzw5PDw3Ozo6Nzo6Nzo9Q0JDPUE+Pzw5PT5BQDs8PDtFQD47Q05TXNDk4eLi4uLj4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTY2NjZ1p5vdntveHh2cG50d3BwdHBzb36Jc3qGhY2EenNtcoB6hn1vg5OBdnx9g4a13drb29vc29vc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29ra2tra2tvb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4N/f3+KgbWhma2ZVVlJHUFFOS0xMRUJIRUc9OD08Ojo3Nzg2Nzc2NTY3NDg+PD09Ojg6OD46Ozc4Nzc6Oj5DRDtDQj49OD1AQUM/Pjw+RTw+PUJNUF/S4+Hi4uLj4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk2NjY3MB2doCCfnp4eHBsdXlya399bHNvdGdoaYB/aWl4c2d+iYl4cIKGe3d9foWKvd3b3Nzc3Nzc3Nzc3Nzc3Nzc3d3c3Nzc3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODflGttZm5mU1NJUFlUTEhGTkZGRUJGPTs+PDs5Nzc4NTc5NjQ1NzU4PDs9Pjo6OztAOTs7ODc6OTlAQkE8QUE/Pzk/QEJFQ0FAQEM7Oz1ES01g1uTi4uLi4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk5NnZ2tmYc3uqhJaCcnR1dn14aGx8d2h4d25rcHR5gIJ3dHyBhIJ9c3CAin94gn95g8je3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f4N/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh24tubWdzY1lRTVVbV0hDSUZOS0dCRD8/Qjo7OjY2NzU2NzY0ODc2Ozw7Pj86PDk8Qjg3OTo6Ojk6QUFCQUJDQEE+PT9CQ0NEQUJGOTg9REpOYtjk4uLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXZ2drcqHGCtXiRfnNsem6EgXaCfWtoan+DeHZ8dX2FhXRmcHl9d316gIqFe318foC03tzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3dzc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3Nzd3d3d3d3d3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e397e3t7e39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4ODg4ODg4tiFb3FrdWFWT1VVXE9ETUY+SkdKRUQ8P0I6PDk4Njg0NTY3NDc2NDk7Ozw7OD47PEE4ODo9OD04Oj09QEBAP0FCP0A+QENCQ0FBRTc2O0RMTmPa5OLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXl29ra3Z5sbnNxhY1ybXBuf391hH5rcnZ2enN4gXhzbnVwbWt2fHmFiIB/f392coODsd/c3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eDg4eHh4eHh4eHh4OLXhW1xb3ZeUldTWlpRSkhDQFFAQkQ8OT9BOjw5NzU3NDU2NjQ3NTY9PDo9PTk+OjxAODo6PDY7OTs+PUJCQjtBQkBDQEBEREM8PUA3OjxFS01l3OPi4uPj4+Pj5OTk5OTk5OTk5OTk5OXl5eXl5dPOxsB+cWxveHt2b3VuanNzbZKGeG50dG5vdIZ/b2twboJ0bXZyfY2DdnF/d3mKgabf3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3dzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t/f3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi1oZucG1xYFJZUFdfWUpMTElSP0Q9OTtCRjs6OTc0NTY1NzU0NjY2Pj07Pz45PTk7Pjg9Ozo0ODtAQENCQ0FCRkE/Q0BBQkREOz0+OTs8QkxNZODl4+Pk5OTj4+Tk5OTk5OTk5OTk5eXl5eXl5eW5t7Woc3JscHd6dHd4bXFydXd/hHRyc2xsa3F8bnBudGuBf3GAd32Eg355gHNygYqg2d3c3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh49WHcWxqbF5YWlVXYFZWUE9QTD1BOjs8RkE4Ojg3MzY1Njk2NTg1Nz89Oz8+OT04Ozw5PTs7NTo9Q0JCPENDREREQUE/PkJDQzw9Pjg5PENLS2PN0dnh1sjY4+Tk5OTk5OTk5OTk5eXl5eXl5eXltbW2q3J5cm59f3Z1d2hqaGlwb3Zta2tnZWZxdG15gG5teXd2iHhxa2podXV5dHV/wd/c3d3d3d3d3d3e3t7e3d3d3d7d3d3d3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHi4uHh4ePVhnFwY2lhV1NZV19MUk9STUtAPjg5O0E+ODc5NjQ3Njc6NjY2NDk+Pzo8Pzo/OTo6Nzo9PDk5PEFBPTtBQ0VDRkA+Pj5BRUQ+QEE3OD5GSEpesrW4wbm1u8jg5eXl5OTl5OXl5+fn5+fm5ebm5ra2tbWOfX5weoR1cnZnYmNlbGtyb2ZpbHZtd4Z9hXlsbHd4a3ZwfH14c3V5fHd2h7ng3d3d3d3d3d7e3t7e3t7d3t7e3t7d3d3d3d3d3t7e3t7d3t7e3t7e3t3d3d3d3d3d3d7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4eHj1Yd1bl5uY1pUU1hXS1NLSk1SR0E4Ozs+PDk4NzU2NTY2OTY4NjY5Pzw6PT07Pzo7Ozk8PDs5Oj4+Pjs8PUFEQkNBQEBBP0JDPDw9Nzs+REVKXrG1tLW2t7e2y9rJ3uXl3eDi3tXU1tPU4OPg39+2treuh3t/bnmNenJ1bWNobGxtaXR4enF5enqIh4N6aWh9cWRvcXyGgX55e318e4an2t7d3d3d3d7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4uHh49aGdmxhb19dV1lcWlJQSEpXTEVHPUA9Ozs9OTY0NjU1NTg2NzY3OD87OT09PDw5OTw6Pjw6OTg+Qjs7Pj5AREBDRUFAQD0/QDw9PTU5PEJHRl2xtbW2uLm5ubq9uMPT0r3BwcC6u7y6u8TMxb/Dt7e3hGl1gX1ndYd5Z3Vxa2t5eHB3fH15bWl3e3h3bml1j4FwbHl4d3d9gXuGgnmAoNze3d3d3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODh4OHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4ePXhXJrZ3RhW1hYX15TVVVRVUpMRj9JRDs5PTY2NDc3NTc4Nzc3ODk8PDo+PDg8Oj0+OTs8OTs5P0E8PT9DP0FARUJCQTw9Q0A6Pjw1NDlER0dasbW1tre5ubm5ubm3ubm4uLm5urq6urm5urm6u7e3uX9ucHN6b3B/eXNuc3Vsc3Z4cXFwb2tvcX6Bc2mHhIF9dHOHdW11hYmBgHJ2hafd3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uHj14lxa2xyW1dXXWBUUVVUUFJPSkNATUE9Ozk2NTM0NjQ2ODc3Nzk6Pjs8Pjs5PDo8PDk8PTw7PT0+PUNEREBDQkE/QD48PkE8OD06NjY6QkpIWLG1tLa2uLm5uLi5uLe3uLi5urq5ubi4uLi6uru3uKx7cnhxf3ZzfnBsbXpyZ29sbW50cHt3d3Jyd3pvhpJ2f3x8enZ5fH9zfYdyda3T393d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4eHh4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi49eHb2pxalVWV2FbT1FSUE5XSURESUo/Ojk6NzUzNDk1NzY2Nzg4Ojw7PD46PDo6PTw5PDw9Oz09PDs9REdEQ0E8PDw8Pj5AOzg8ODE1OkFGRVautbW1tre4uLm4uLi4uLe4ubq5uLi3t7i4ubq7t7mqcnB4d3x7e4J3aG5xam9qY2lyf21zcn54dHFsanaAeX2AgH91doB1a4qLgHaR1d/d3d7e39/f3t/f3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f4N/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLi4uPYhm1sdGVWUFxnWE1YU1JRWUVDS1BOOzk4ODc1NTM5NTY2NzY4Nzk+OT0+OTw5OTw7Njg5OTo8QEA9PkBGQEJCQDo+PEE9Pzs7OzYxNjxCR0RQqLa1tba2tre4t7i4uLi4uLm6ubi4t7e3t7e5ure2tIlyd3h9iXxwem99c2hqbGdnbHRscXd0cWx2c3Fxd3FyfHl4g3Z7d2mLkYp9kM7f3d7e3tvY2drZ297f39/e3+De39/f3Nvc3N3e3uDg3+Dg4ODf3t7e39jS397f397e3t/f3t7f3t/f3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLi4eLi4uLi4uLi4uLi4uLj4+Lj4+Li4uPj4+Pi4uLi4+Lk14NoZ3VkVlVkZVdKWllXW1Q9RU1LSD04NzU3NjQzOTQ0Nzc1Njc5PTo9Pjw9PDk7PDk5Oj45PD4/PkFBQ0FFRUQ+OzxBPjw5PDs3Mzc+REhFSqG2tbW1tbW2tre4uLi4t7e4uLi3tra2tra3uLm2traLfXpsbHp/cGx5dm5qaGdlcXp4b2lvb3B1c21zd4Fnb32CgYNyf3lqcHJ6f6ng393Zy8a/vL2/vsLN0tDW3tnc4NfQzcPCw8PH1dfT2dzX1NjX0MfExce9vM/Kz87Y3djO3N3c2t3T0dze39/e397e3t7e4N/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eLi4uLi4uLf4uPi4eLg4d7W29/Sw8rJx9Hb3OLk4eHg2dre1sbExcTN2trf5OHi4trX3st9aWZxYVleZWFNTFRLUlpMO0hNSEZBPTc2NjUzNDY2NDg3NjU2OTw7Pj46Pjk5PDk3OTs7Oj49PEBAQ0RCR0ZCQT08Q0A9OTw7Nzc3P0RGRkaZtrS1tbW2tra4uLi4uLi3uLi3s7W2t7a3t7i5tba3opdxb29waW50dnFmZWNrbmdvcm1mZ2tygWVvdnyAeGRzj39zaHFyaWVlbm+w39HFv7u5ubm5ubq6uru6vc3Gw8e/urq6uru7u8HCvcHFvby/vry7urq5ubq6ubm6w8XDucDDwby/ube/z8/U3tjc3t/g3tLa4N/f4ODg39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eDg4ODg4ODg4ODh4eHh4uLi4eDh4uLi4uHa2t3RwsPCu8XT1uDdydPDrrnAsaqrq6uwtLbJ0sXRxLG4v7Srq6usr7S0vMzE1c60tLureGxtbWBdYl9ZS1NVVFFQREBRTUhEPzo3ODU3MzE1NjQ5ODQ2Njo8Oz08ODw5Njo6ODg5NzU8PDw/QEFAQkRDQkE8PkI/Pz09PTc1OD5DRUNAj7a0tLW1t7i4uLi4uLm5uLe1sautr7Oxs7OztLS0tqaei2tue3ZxeXhnY2hfcXdha25vaG99b25ja2lseHdsa4Z+bHB6dm1scG95sca8uru7urm5ubq6urq6urq6urq6urq6urq7u7q7u7y7urq6ubq7u7q6urq6urq6ubi3t7i4t7e2tbW1tbi3u8e+w8XHzcS4wMnH0tzZ2d/e3uDf39/f4ODh4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh3Nji4uLi4eHh4OHg3tfGxtHQztTe3tPO0t/SuLi8sq2trKysrrG+ua63rKipqamqq6urqqqqq6ysuKyqqqqrq6urra6urq6urryzrayrpHlub21fXl1dVE1SU1xUSkE/UElIPjg5NjgzNzMwNTczNzg1NzY2Ojw/PDg5Ozo6Ojg5OjY1OTs8Pj9EP0NFQkNCP0BAQT9APjw3ODc6QUVEP4W4tLS1tbe4uLm5uLi3t7SurKuqqq2urq6vsLGzs7WjcG5ucm1wg311aWFlaGZkY2Rxc21td25naW1tZXBzb29zcXN8h4F6dX11n7u6uru7urm5ubm6urq6urq6ubq6urq5uLm5ubm6urq6u7q5ubm5ubq6ubm6ubm4uLi3t7e4uLe3t7a2tbW2tra1tbW1tba1t7e3t7rBvrzGycrb3+Dg3tvd3d7h4tDW4uHg4ODg4ODg4ODg4ODg4OHg4OHi0768zNjd3OLg0dnbxL23sLCxsa+zu7uzsLS9s66urq2tra2sq6qqqqmpqKmpqampqqurqqqqqamoqampqampqaqqqqytrq6urq6urq6sraR4aWJxZmFZWlZRUk5cU0Y9QlJEQTc8OzY5NTY1NDU2NTg3NTY1Nzg7Pjw7OTk5Ojg3Nzk3Njg8Oz47RD8/Q0BBREE+P0M9Pjw+Ojo3Nz9DRj54srCztLW2t7i3trKurq2sq6uqqaqtraysrq+xs7S1t4xucnRqaIB5ZmpmZWxdaG5waGxxYmNmcoJ+dmhobGpueoaBhXx4cXF5gK+6ubq6urm5uLm5ubm5ubm5ubm5ubm4uLe3t7e3uLm5ubm5uLe3t7i5ubi4uLi3t7a2tre3t7e3tra2trW0tLW1tbW2trW1tre3t7e3t7e3tre4v8bP0MS+v8DE19e8ydra4OHg4ODh4eDg4ODh4eDb3t7Uzby3tre6wMDJxLfIvrKwsLCwr7Cvrq6ur7Cwr66urq6uraytrKurq6qpqampqampqampqKmpqKmpqampqKmpqKmpqqqrraytra2ur66trK2heWpjbWdiXFhRUFFLVEpCOklRP0E3PDk0OjU2NTQ1NTY4ODY4Njs6OTw9PTs6ODY2ODg6ODY3Pj09PT5BQUVCQkNBQUBBOj09Pz05Ojc9QUc8bKqmqKutsLGwrqupqKqrq6mpqamrrKytra2usLO0tbilgIdvaWdzdGZrcG1qZGxvcm5rbWNrcHyJhG5qbHx4Y3uKfnNqc25rcY+7ubm5ubm5ubi4ubm5ubm5ubq5uLi4t7e3t7e3t7i5ubi4uLe2tra3t7e3t7a2t7a2tra3tra2tbW1tba1tLS0tbW1tra2tra3t7e3t7i4uLe2t7a2uLm4uLe3uL6+uLq9vcfb4OHg2Nnd4eHg3dfKwcPCurm5uLe4uLi3tbS0tLKysbGxsLCvr6+vr6+vr6+vr66ura2srKyrq6yqqqmoqKmppqepqaehpaipqamoop+hoZyip6inqausrK2ur7Cwrq2unXdwbGphY2BZUU1RTFJGQzlNUEU+ODs3Mjc5Njc0NDM1ODg3OTc7OTo9PTw6Ojk3NDo5ODY1OD8/QEI9RENDQ0FDQEJBQDtAP0A/PDw6O0NIPWOopaWlpqioqKenp6ipqqmoqKipqqqsra6wsLCztLW1taWYdn5xZmt4cW9tZmVsaGNsZ2ZpaX11bWlvfXZ5hWZod294b3Fvcninu7m5ubm5ubm4uLm6ubm5ubm5ubi3t7W1tba2tre3t7e3t7a2tba2tre2tbW1tra3t7e2tbS0tLS0tLS1tLS0tLW1tba2tra2t7e3t7e3t7a2tre2tre3uLe2t7i4t7i4uLi4wMXTyry8w83PyMC9urm5ubq6ubi4uLi4t7W0tLSzs7KysrGwr6+vr66urq+vr6+uraysrKurrKysq6ehoJ6gn5udoaGdlpmkpKaon5mZmZmanZ+gn56fpKqtrq+ura2srJl1cGlrY2FeXVVOU0tSREQ4TktHQTo4NTI2OTY1NDczNzc3ODk3OTo7PT0+ODg4NzU6OTk1OD9AQEFEPkZBQkNAQkNCQT88QEJCQD0+OjpERj5cpqWmpqampqanqKenqKioqKenqaurrKytra2ttLS0tbekc311bnONf3JmanFjaW1jaGZobG51aV9jZ3VzdnpuZ3Bwcn56cYihu7m5ubm6urq6urm2s7a1uLm2trW1tra1tbW1tbW3tra3tra2tbW2tbW1tbS0tLa2t7e3tbS0s7O0tLW1tLS0tbW1tra2tra2t7e3uLe3tra2trW2tbW2tra2tra2tra3tra3uLi3uri4uLi3uLi5ubm5urq6urm4t7e3t7W1tLS0s7OysrKxsbCwr66urq6urq+vra2srKuppaSmpqScmZubmpmampmXl5eXl5aZm5iZmJmZm52en5+dnJ6gpKWko6OioqKQdG5jcGFeXltUU1RIVEo/PFFCRkM7ODYzNzo1NTQ4Mzg5OTc4OTc7OTs9Ozc6NzU2OTk4NTg+Pz9ART5CPz9DPzxBQUI/PT9EQT8+PTk9Q0Y/VaSlpqanqKeoqamop6ioqKioqKiqrKuqqaipq7W1tba5o3eKcXKHhnd0cGh5a2JjYWVsaW5zal9jZWNjZWprYmRqbHaXjX6ovbm3tre5u7u6uLWxrKurqq6wrKyrq62tq6uvsLGvr7CytbW2t7W1trW1tbW1tbW2trSvr7O0tLSvra6vsrW0tbW1tbW2t7e3t7e3t7e3t7e3t7Owsra1tLa2tre3tra2tbW1tra3t7e5uLi4t7e3uLi4ubq6urq5uLi3t7e1tbS0tLS0tLS0s7OysbCvr6+vr66vr62oo6KgnJqampqZmZqbm5qampqbmpmZmZiXl5aYmZmZmpycnZ+foJ+goKChoaCgoJ+fi3RuaXRdYGZeUlRLRFRJPUVTSEVCOzo0NDY5NDQ1NzM4ODg3ODk5Ojs7Pz04OjkzNTg5NjM5PT5AP0A6QEJCQkA/QEJCPz0+QUFCPz06PkVDQFGjpqWlp6inqauqqKaoqKipp6ioqKinp6ioqaq1tbe3t7KZtH99kIx1Z2lqbGZjYGNoZW94cGlicXx5cGpmZmRma3NqhYystrKwra2ttLeysLCtrKuqqaiop6ipqampqKinqKipqaeoqqurra2sqqytraysrq6traunpaSnqqyopKOkpamwsbGztbW2t7i3t7W1tre4t7e3t7Kppaasq6ivtLa1s7W3t7a1tbW2tra3t7e3t7a2t7e3t7m6urq5uLi3t7Wxs7S0tLKxsK6sq6yurrCxsK2rqqmqqKijnJqZmJmYmJiYmZmZmZmZmpqZm5ubnJybmZeYmpqcnJydnJ2foKGhoqKioKGgoKCfnop1amtuWVxhVktPREdVRz5PV0hEPTw4MzQ0ODQ1NDgyODk4ODk6Ojw5OUA8Njk6MzY3OTE0PD8/QEBBOkNGRUJBREJDQTo7P0FCQz9APUBEQ0BPo6empaemqKqqqqakpqenqKioqKimpqaoq6uttba3t7e4rbJ1cHuDdmBiaWtiZWZhZGdmfYh5bHKAfXFvcXhjbW5xZo+srKurq6ysra6urK2trKyqp6WmpaWlpqioqKiopaeoqKeoqKeoqampp6Wko6KioqOioKKioaKhoKChoaKjpKOjpaWlqLC0s7OzsKuqqaqztLa3trGopaOioaGipKiqqairs7Sxrq6xs7W2tra3uLi3t7e3t7e3t7a2uLe0sa6ppqerrKmnpqWkpKSkpKWnqaajoJ+enZycm5uampmZmJeXmZmZmJiZmpqampqampqbm5mYmpydnZ2dnZucoKGgoaOjoqCgoKCfnp2FdGtsaFdYU0pHTUVITUdAU1dGRz09OTM2Mzc0NTU3Mzg6Ojo6OTw9OjpBPDY9ODM3ODgzNztAPz9AQDpCRUNAQkRDQT87PEBDQkNBQDxBQ0A9TqKnpqanp6mqq6mkpaWlpaaoqKippqanqKmpqrW2tre3t7izc2h7c2JnamtpaWJhZGloXV1tfHJma3J/fHR8bm1zc36gqamrq6uqq62trKusq6mpqKWjpKampqWmp6eqqaamp6enqKinp6iop6WjpKKhoaGhn56en5+fn56foKGho6Wko6OkpKSmp6enpqWkpaampqeqraumpKKhoaChpKWlpaenpaeoqKalpaivtLa3trW1tra1tbOwrKupqa6rqKWlpqampaSkpaWlpqWkpKSkpaKhoaGgnp2bm5ucm5qamZiXmJiYmJiZmpmZmZmYmZmZmZqZmZydnJycnJybnJ+fn6ChoaKgoKCfnZ2cgHNrbmReU0pITUZETEtFRFFTQ0c9PDgzNjI4NDY0NjQ4OTg6Ozk7Pjw5PTs5PTczNTk2NTY8QD0/QD88P0JDPkJCQj89Pj5CQ0FFQD86PkVAO0+jpqWkpqeoqaelpKWlpKWnp6eoqKanp6alpqa1tba2trW2uYptcW1vfHxxZ2pmYGFsYFROW2hqbm9tgYJ9cWdxdn6aqKeoqqmpqqurrKqqqqimpaWkoqOlpqalpaWmqaqppqWjpKWmpqWjo6KioqKhoJ+fnp6cnJycnJ2dnJ2en6CioaKjo6KhoqKkpaSioqOjpKSjpKSko6Ggn6GipKanp6ipqaelpaSipKSlqK2wsKyrqqusqqmnpaWmpaWlpaalpqioqailpaWkpKSlpKOjpKOioaGhoqKgnp2cnJubm5qZmJiYmJmam5mXl5eWlpeXmJiZmpqcm5qampubm5ucnJ6goKGgnp6enpycm356bnJiXlNNSlBFRk5NQkBPRT5JOz01MzYzODM2Njc1Ojs4OTs5Oj49Ozo5OT03NjY5NjU2PkI+PkE/PT5DQT5DQ0BAO0BAQkJCRUA+Oz5FPzxQoKSjpKOjo6SkoqSlpaSlpqamp6empqalpqaltLW1tbS0tbiBaHx9ZXOCemxwdWFfY1ROT1FbaGxpbGxxbW5xbnScoqSnqKioqauqqqqqqaempaSjo6OjpKSlpqalp6ytqaShnp2eo6Shnp6foKCenJ6dnJycmpqam5ucnJubm5ydnp6foKChoJ+goaOioKGjpKSjoqSlpaWkop+go6SkpKapqainpaGdnJ+jpaipqainqKioqaempaWkpKSlpqampqampqenpaWko6Ojo6KioqGhoqKhoqOkop+enZ2cmpubmpqZmJeXmJaWlZSUlJWVl5iYmpubnJuampqam5ucm5ucnp+fnpucnJyam5p/fnF0YFtUTUdNSEZMSj8/TkM8QDs8NDM4Mzc0NzY3ODs9ODo6OTk7PTs7ODk9Nzc4OTU4OD9APT9BPjs9RD89REA/PzpAQUE/QUVAPjw8Qz88Tp2ioaKioKCipaSkpKWlpqenp6empqampaampbW1tbS0tLS3jHalsXdmc3Jvc2xjZGlYT1JRT09dgG1kYFptkZGSoqKjpaampqenqKiop6alpaSjoqGhoaKjpaempqesrKemoJ2cm6Ghnpuamp2cmZiam5qampmZmZubm5uampqampucnZ6goaCfnp+hoJ6foqOko6Omp6inqKWioKGhoaGkpaWlpKCcmZmbnqOmpqampqanpqempaOlpKWlpqiop6enpaWlpaWkpKOjo6KhoqKioqKhoaKjo6Kgn56enZybnJubmZaUlJSTk5OTk5SUlJWWl5qam5ubm5qZmZqanJ2dnZ2dnZuampqamZqXf3dvc11aTkhKTkdFRklERU5APD09PDQ1OzQ2NDY1Njc5Ozg5OTg5OTw7PDc6Ozc4ODg1ODg/Qj9BQTw+P0A8PEJAQT49QT4/Pz1CQUA6OkA8PE+doqGfoJ+dn6OkpKSlpqeoqKenp6ampqampqW1tLS0tLS0tbSXtqd1Znh2Y2xjY2VjW1JTU1JNXqCMeFhodpajnp6hoaOjo6OjpKSlpqalpKSioaGko6OjoqOlpqampqenpp+bmpuioJqWlpWam5qXl5iZmpqYmJqampqbm5qZmZmenZ2goqOjo6KkpKWinqGhoaKjpaampaSjoaCgn5+hoZ+goJ2amJeZmpygpKOjpKWmp6alpaOjpKSkpKWnp6ampqampaWmpKOjo6SjoqKjpKGfoKGhoKGgoaCfn56dnZyamJeVk5KSkpKSkpOTkpOUlZaZmpqbm5qampqbnZ6enp2cnJybm5qamZmZlH10bHReWk9IRUdGQkVORT9GOzo+Pzs0Njo2OTM2NDY4ODo4OTc4ODo8Ozw5Ozs6OjY3ODk5Pj9APjw9QD5AOjlAQT89QT8/QUE+QUE/Ojk9PjpQnaCfnZucnJufoqOlpaWlp6iop6ampqanpqantLS0tLOysrGwsK2rkHiGj36bmn93Yl1TUlFRTGKgootaiKCgn52YmZycnZ2eoaGgpKenpqWkoqGjp6alpaKipaampaanpqagm5mboZ+XkpOSl5qcmpeXl5ibmpmampqam5qYmJmaoKCgoKGfoaKipKamop6gn5+goaOko6Khn56enpyanZuZmpqZmJeZnqChoaKioqKkpaWmpKSkpKKioqKkpaWlpaWlpaalpaOko6KioqGgoKGgnp+fn5+fnp+foJ+cm5qZl5WUlJSTkZCRkpKSkpKSk5SVl5iZmpmZmpqam5+fnp2cnJycmpmZmpiXl5F8cmdxXl1QRj9BRD9KT0JCRjhDRT4+OTg7Nzc0ODQ1OTo6Ozk3OTo8Ozo8PT48PDo2NzY5OD4/QT47Pz49PDg6PkFAQUE/P0FCQERBPjo4PkE8U5ycm5uampycnaGio6KjoqSmp6alpaampqSjo7KysK2rp6amp6alpqiln6iop6qnoXmEXFFST0xcnKCAYpmgnp2clZOVlpeZmp2dnqGmpqampKOioqanp6ajpaampaWmp6amop2cn6Gfl5GRkJSXmp2YlpaWmJuZmpqampqZl5iam6Ghn56fnpybnJ6goJ6dn56fn6Cio6SjoqCfnp2ZlpeXl5iYmZubnqKioqKioqGio6WlpKOio6SioaGhoqOkpKSko6SkpKSioqKhoqGgn5+gnp2enp2dnZ2dnp6em5mYl5WTk5SUk5KQj5GSkZKSkZKTlJaXl5iYmZqampyenZ2dnJubmpiYmpmXlZaNempmamBiTkY+P0A9SkVAQ0A7QEE8Ozs5Ojc2NTg0Njc4OT04ODs6Oz87Ojs8Ojk6Nzc2ODs8Oz08Ojo8PTw3Oz5DQkRDPz1BQ0FEQT88OkBCO1eZmJqamZmam5ucnp2foqKhoqSlpKSlpqSioJ6op6alpqWlpaemp6ampqakpaanqKehqXJOUU1KVJahenKanJyenJeVlJWWmJiXl5qeoqKhoqOkpKOjpaalpaanpqSlpqalpaOgoKGhoJmSkI+WmpmenJaXl5eZm5ycnJqamZeZm5uen52cnZyZmZqcnZydnp6fn5+hoaCgoaKgn56bl5WVlZeanZ6fn6GhoqKio6OhoaCgoJ2cnaGioqOkpKOioaSlpKOko6SjoqKioqKhoKGfn52cnZ2cnJ2dnJ2enpqXlpaVlJOTkpKSkpCRkpKSkpGSlJWWl5iYmJiam5ycnJycnJ2cm5mYmZiWlJWXi3hsY2RiZFFHQT1DO0tIRDo7Ozw+OTo6OTo3Mzc5NTo4ODg8OTg7OT09Ozo7Ojk8PDc2NDc/PDo9Ozw/Pjw7ODxBQ0FDQkI+P0NAQkFAOj9APztZmZiampqam5ubm5ydoKGhoaGhoqKioqKhn5+dpKWmpqenpaWmp6ampqWkpKalpKSkpaaGUFJQT0+PmHB6mpubnJ6cnJycm5ubmZiYm56dnp6foKOkoqGhoqKio6SkpaalpKSjoqGhnpyblZOUmJuam56amJiYmJqcnpyam5iWmZybnJycnJydmpqbnJ2dnp6dnp6fn52cnJyhoaCblpWVlZacoKGgn5+hoKKjoqOhnZuZlpaWlpicnqCip6ikoaCgoqOjoqKioKCgoJ+fn5+gnp2cm5ucnZydnJmanJuWk5KSkpKUk5KSkpKSkpOSkpKRkpSVlpeYmJiYmZqcm5qbm5ucnJqZmJiXlZWWl4d3ZGdoZGJNQ0U8RDlJSkU5Ojs9PTo6Nzg6NjQ3OTU8OTY4OTc5PDs7PDo6PDs6PDw4Nzg3Pj07Pj46Qj86Ojo/QURCQ0FBQD9EQUFAPjpAPj06W5qYmZqbmpubm5uen6CgoaKioKCgn5+enp2dnKWkpaanpqWlpqakoqKio6Oko6Kjo6KnllRYVVJOZ21rgZ6am5udn6Cgn56enp6dnJ2dnJ6enp+goaCfn6CgoKGio6OjpKSkoqGhnpuamZiZmZiZmZienpiYmZmam5qWlZeWlZicnJ2cm52dnpybnJ2cnZ6bmJqeoaGdm5udoKKhmpWVlpaZoKKgnZueoKGjop+em5eXlJKSlJeYmZ2goqenpaGgn56goaGioaCfnp2cnJubnJubmpqZmpydnJmXmZaVk5GQkJCPkZKSkpKSkZKTk5OTk5OTlJWWlpeXl5manJubnJucnJqamZeXlpaVlZSEcmZsYmRbREJMPT84RktCPEA+Pj05Ozk6PTg1ODg2Ozg1Njo4PDw7Ozw8Ozk8Oj09OTU4Nzw5PD88OkE/Ojo6QEBDQkRBQ0A/Q0FAPj08QD09Ol+al5mamJeYmpycn5+foaGhoJ+fn56foKCenZ2lpKSko6OioqOjoZ+foaGipKOio6SiradXXl1UV19ua42dmpqbnJ6dm5ucnZ+enZycnJydnZ+goKChoaGgoKGgoKGioaGhoZ+enJubmpubnJqZmpuZnJ6ZlpaWl5eTjo6QlJabnJuam5udn52cnJycnJ6dlpSZnJ+in5ycnZ+hoJuXl5mZmpycnJubnZ6fnZqXlpaWlJOTlJiampqfoKGmpqWgn56fnqChoaCenJubnJybm5ybm5qZmJmZmZmXl5iVlJKQkJCQj5CSkpKSkZGTk5aYl5STkpSVlJWWlZaZmZmam52cnJyampmXlpaWlpaQgG9vZV5gV0BKSDg/N0lFP0VBPD07Ojo8Ozs3NTs4Njs3NDY6Oj47Oj0+Pj07Ozs+Ozo4Ojk5NkBBPTo8PTo6OT9BQ0JERUM+P0FBPz8+Pj89PDtgl5WXl5aVl5mbnqGhoKGioqCenp6enqCgn52bpaWkpKSioKCfoJ+dnZ+hoqOjo6OkobCjXWVkYGFua4GenJubm5ubmZianJ2enJubm5ycnJ6ipKGeoKGhoqKhoKCgoaGfn5+enJmZop2bm5ybmp2dm5manJiXlZWWkY6Nj5KYnZycm5ycnqCdnJucnJyempWVm56foZ+dnJyenp2cmpqampqampqbm5qXl5aTkpWVlpWTlZaam5qanZ6foqWjnp6fn5+en5+enZ6fnZycm5qcmpqbmpiZmJiYmJiYlZSTkZCRkJCQkZKTk5CRk5SYmZiVk5SVlZWWlZaXmZmXmZqenpyamJiXl5aWl5eYjX1ubV9lVlRFSzw3PjdSRUM+QkE4Ozw7OTg6ODY7Nzc6Njc5Oj0+Ojw8PT49PD06Pz06ODw9OTtAPj4/PT45OTs/QkNAQ0VDPT9DQj5AQD5APTw8YZWSlJWWlpeanJ6goKCgoaCgnp6enp6gn56em6WlpKSioJ+fnp2dm5mbnJydnp+gn56rmGNpbW5pZm2enZybm5ybmpmZmZqam5ucm5uam5ygo6SgnZ6en6CgoJ+gn5+goKCgnpuZnLGempucm5ufnpyZmJqamJiYmJKOj5OXnJ2bnJ2cnJycnZycnp6dnpqVl5ygoaGfnp2eoJ+cnJuampqbmpqYmpmVk5OTkpOWl5eVlJiYmZucnJydoJ+gnp6enp+fn56en6KjpKKgnp6cm5qampuZmJmZmJeXlpWUlJORkZCQkZKTk5OSkpOUmJmYlpWUlZaWlpaWl5iYmJiXmZqamZeXl5aXlpeWl4l4dmddX1dURUU5OTs8WT5AOEI/OTw8Pjk4Ozg6Ozc5OjU4OTs9PDk9Oz0+PD0+Oz8/Ozk+PDw+Pz5AQUE9ODc7QkNFP0FFQz1AREJBQEQ7Oz47PGKWk5SUlpWUlpiYmZubnJycnZ2cnJ2en56dnJqkpKSkoJ+enpybm5qZmJiYmZucnZ6cpolla3R4bVuFop2dnJydnJqbmpqampydnZ2bmpuboKKinpucnZycnJ2enp2cnaSin5yamaOsnpycnJycnp6cm5qanZqam5yVkZOXm52dnJ2fnZycnJycnZ6fnp+cl5idn6GhoJ6cn6CfnJubm5qbmpmZmZmZl5WWlZaYl5eXlpaYmZuenp2dn6GhoJ+fnp6fn5+dn5+hoqKhoZ+fn5yZm5qcnZuampmXlpaYl5eXlpWTkpGTlJSTlJSUlJaZmJaVlZeZmJeYl5eXl5eYl5iXl5eXlpaYl5eVl5eDeHZfW11eUT1GOjk4P1VDQTtDQzo8Pz86Ojk3Ozg4ODc0ODk8Ozw4Ozs8PTo9Pjo/QT06PTw+PkA/PUBBPjk2PERDRUBBRUU9PkVERD9COzo8OTpkl5SVlZaUlJSUlJWXmJiamZqcnJydnp6dnZybo6Oko6CenJuamZqZmJiYmZiam5ubm6WJa3F2em9lmp+enp2dnJybnZ6dnJ2enp2dnJydm5ygoJuampubm5udnJqam5upo5uampyji56dnZ2cnZydnpybmp+fm5ydm5mZmZudnZ2dn52dn5+dnJydn5+fn5uanZ+goJ+dnJ6gnpubm5ubm5yampuamZudnJqZmJeYmJiYmp2foKCgoJ+hoaGgoJ+en5+fnp6foaKhoJ+enp+enJqam5ubmpqZlpaXmZmYmJiWlJOUlJWVk5OVlZSVlpWVlZSYmZuamZaWl5WWmJiWl5OUlJGRk4yRkJOWfXhqYWJiXFA8QDw2OENWSERCOjg7Oj47Nzc5Nj06OTk2NDc6Ozw9OTo6Oz87PT08QD47Oz46PT89PkBBP0A8NztBQ0U/P0REPj9EREM+Qj07PDs6Z5aTk5OTk5OTlJSVlpeWl5aWl5mbm5ybm5uamaOjoqCfnpuamJeYl5eXmJmYmZybm5qkgGpqb3lzcZegnp2dnJydnp6enp+enp2cnJydnp2bnJuampqam5ubmZiYmZuapqKamZuel3SenJ2enJ2cnJ2cm5qdn5ucnJubnJubnZ2dnJydnp2enZydnZ2cnJ2dm5uenp6dnZybnpubnJycnJydnJubmpmbmpmYmZmYmpmZmpyfn5+jpaKfoaKioaGfnqCgn5+fnqCioaGhn5+fn52ZmpudnZqZmJWWl5aVlZaTkpOUk5STkJCSk5GUkY+OkJGOlZabmJWYlJmXlJiRjJCPk5yTkoyFjIeDhndxZ2pkW1xRQT44NkJHYEJFR0A+Ozw7Ojg4NjU8ODo4MzQ6Njk9PTk5Ojs9Ozw6PD48Oj5AOj5APjw/QD8+PDg6Q0FEPz5CRD8+Q0VCPUJAPDw8OmeYk5KSk5OSk5SVlJWXl5aWlZaXmZmZmpqampqkoqCfn52bmpmYmJiXl5iZmJmcnZ2cqH1nZXN7enOJop+enp2dnp6enZ2enZ6enp2dnZ6cm5ybmpubm5ycnJiYmZmamaOemZmboY5km52dn56enZ6dnZybm52bnJybnJ2dnZ2dnJ2dnp+fn52cnZ2dm5qbnJmZnJ2dnZ2dm5uanJ2dnJycnp2dnZybmZeVlZeXmJqam5ubnZ6foqOhoKGhnJucm5ubnZqcmZycn6CfnZiZmZmUkpKUl5SPj4+OkYyNiYuQi4mLjpGRj4mQmJiQkoyNi5KQj5iYoqiqpqWlrKOmoZqep6eyqKKVo6Cfl39wcWlsXFtcTUY8NzdHR1g+SE5URjk+Ojg5ODc1PTk4NzMzOTY6Pjw6Nzo8Ozo6Ojo8PDs/PjtAQD47PT5BPDw2N0A+QkA+QUY+PEFEQT1DQj49PDlmmJSTk5OTkpOUlZOVl5iYmJaXl5iZmZqampqaoqGfnp2cm5mYmJiYmJiYmZmZm5ybnKx/am16f3lxh6Genp2cnZ6enp6enp6dnp2dnZ6enJubnJubm5ubm5uZmZmYmJihmpeanKOCXJignZ6enp+fnp2dnp6dnJydnJ2dnZ6fnZ2fn56goJ+enZ2dnZybnJ2em5qbm52enZ6dm5ubnJ2cnp2cnZqYl5SRjo+QkJGVmJSWlJiZmpudmJuYlY2Mjo6TkpKRj4mQjpGRjo+Ki42NjYiIi4+Lg42NkY+MkI2Qk5WVnJihoJySn6SipKmam5eanKOprb3Bwbq8uL26ucC8ubq3uru7tL2zwbV/bnVmZ1peWUxJRTo7TElTPFZSSUM6QTo7Ozc3NTo6OjgyNTY4Oz08OTk7Ozw5Nzo4Ojw6PT85PD8+PDw9QTs5NTg8O0A/QT9EPTxBQkA8REM9PT06YZOTkZCUlJOTk5OTlJeYlpeZmJmYmZqbmpqamp+gnp+fnJqZmpqampmYl5iZmZmZmZmphXB1e4B3b4mhnp6enp6fn56en56fn56dnp6fnp2dnJ2cm5ubm5ubmpiYmJiYopWUm5yjeFqQop2dnp6foJ+enZ6hoJ6dnp2enZ6fn56en6CenZ6enJydnZ2cm5qYnJuVmJqamJiYmJmSjJCXlKCXk4+MjYqKiImMiJORh5CPjYqKkJCLjoqMi4+IiImJjpGOjYaFiYaKhoWLiI+SkJCNkJKXlpKamJ2TlJ6kpqaqq7Gsr6+rpquqsbm5tbS0rqyvtMDIxcXBvsbDxMTDurW+t7a0s7C2tb6qcHRyXGZfXl1JRj8/RUtMVklcTEQ/PUI6Qzk5Nzc7OTk3MTc5ODo+ODg6PDw7OTc5OTs9Oj4/OT5BPDs+PD46OTY5PDpBPkNBQT08QkBAPkJEPj8+OVyHhIOHi42KiYaFgYqMkZOVmJiHlZaWkpiampmenZ+gn52ampubm5ycm5iWmJiXl5ibqo56dXZ7f3mCoJ+fnp+goKCfn5+foKCfnp2dnp+enp2dnJqbm5ybm5uYmJiXl6KRjp2boXFbhaWenpybm56dnZycoaGfnZ6dnZ2dnp2dnJiWlpaYlZWSlpmWk5GKjI+PjI+NkIuLj4+WiYiEi5GZjn2Fi42PjYyHioyQm4yRj4+Lio6TjIyNjIiSi4yFiYyPhouIh42KhYyEj4qXkJOYmpWbnKOqoaKknKKrsbe0ubWxs62vsrKlp7O6sbq6vLa3tsDDw729vLa/urq8wbW4wL60r66mqa+3mm58Z1tjWl1fSEU+QUtJU1hZXkFGOTk9OkY/Pzo3Ozs7NjM6Nzo5Pjg6Ojw9OTk4Ozk7PDo+PTtAQDs8QjxAOjg0Nzw7Qj9BQj4+O0NEREBDQz0+PjlhmZWLkYWNj5aSiHl9e3+Fi4OKgoqJhmuAeJCLlpqRnZ2UlJGTlpeampiWk42Sk5KQm5uIdndzcX1/cpGgnZubm5yenZ2eoKGgm5uWlpucmpubnJuYmZqYmJmbmpqWjJKdjoiZlZxvYnaelpWSkY2SkY+Uk5KXm5mYm5ePjpCLjo2Ch4uLi4qLiI2RjIeHhoqIiZGKh4yEhYqNi4qNhI+UkIyDkJOUmZWQi5OTkZWRlpWOj5GMlI2Oj4qIj4ePhoeJiYmNiomJioWNh46JmJKUmpuXmKChp6Cko5qqqbO2sbWwqKmiqK6tn6qvsK21ubi8wr/BxLixtbCutrOwuL68ury+urOzp7G3wpB1gGNiXlpXUk1IRkVQSVlXX1tDUDpCQz1HRj84Nzo6NzU1OTc8OTw5ODo9Pjo6Nzs7Pjs7PTs9P0E7Pz48Pzo4NDM3OkFBQEI+PjpDREM/QUM7PT45Z6mloqKZn6CippeUiI2CiIJ1h4iKiIp7e3Z7enmPeoiSfn18en6CkYWBgH1zfH99fISHfnRweHZzfHaBj4iIiYeIioyMkZicl4iOhIuNi4iNkJCPi5GPi4yPkJCRjoqIlo1+i4qOdGhpi4iMhYeBjYuGiop/iYqGiJiRiIOIg4KFfIuLjIaJi4iKkIyIi42PjI+Wh4mLio6NjY2Wk5OdnJyalpycm56bmpuYnZeTkZWWkJKRi4+LlpSMjYqDi4SEiYyQkIqOio2LipGJjZOTk5SVk5KcmZ6Xn6CfpaKvsamupKSfmKStpqa4t6ysu729wsPAv7+vpa2wsLS3uLO0uLa0ta6stK+4tLaBeXpjZmBeVlFRQUVMT0lcXl9UR0dCS0xCREA9ODg7OTU3Nzk3Ozc9PDk9Pj05Ozg6O0A8Oj06PkJBOD88Oj84NjQyOTtCQD9CPj04QEI/PkBEO0A+N2CloJqXnaGaoaCPl5efl5WCjaCfo6GdmpKOjIxycXBvdnFucG1ucHZub29waHBxcHR+c3FycXd7cnl2d3Jyd3Z6e3l8fXt/iIGEi3+PkYaNi4uGiouLiYeEgYaCgIKJlZCJeop/hXZqZIKAh32AgZKQhoSEhY2DhIyPj4+IjY+Hi4iRkJWRjpCKk5eOj5WYp6SfnZWYlpaln5udq6aqt7W4srGnr6qnpqGfmp2WkpWVkYqPjImTjZuVjYuLhoaJjJWQkJCLmZKVlZSbkJiTlIyNkYyWl5WilZ6mqauno6OqsJucpp+mq6G0vb6zs7+5u7u6uby9rqiusa6wuLyztLGxqrCpqLGxsqild3J0X2hhYFRWUUlKSFZNXl5eVExKRVFKRUdDPTo5OTc0ODY4Mzg4PTo9PD47OTs4Ojs/PDw+OT9DPzg7Ojg8Nzc2Mzc5RT4/Qz89N0BAQT0/RDw+PThUj4yGh4eUjJWZl5yWmZaNlZyWlZydoKCdmpiWeHFubXJ4cXFsbnJwa3FvcG1yc3t1dnd5fnVxeHZ0d3tybn98gX15eH1/eYOGg4WCg5CLkIuLi46Pi4mJhYKBfX9zfI2MhHqLhIVzamCGinl9fIaNjYuGjZSSi5CXj5SXkpihlp6XlZunpp+goKawq6GjpbW0sqqmqq+isba5vcK7ucO+vLi9uLWxrLCspZuSk5mfm5SPk5WOmp2doJqfn5edo6qsoZ+em62hp6qwqaampJiRkZWUo6SirKSss7Szs6i3tru4sLKvra2yt7a6srW6s7e5u7i8urayr6yxsbKztLOxsa2us7Gzs6yhl3Zxc19jXlJRVE1PSUdYT1pcZFROR1VPRURKRD44Ojg3NTg4ODU5Nzo6PTw/Ojg8ODk5PTs9PTpCPj84Ozo5Ojk4NjI1N0I+P0RAQDY+P0I/PEM8PT46Tn98go6MjJOTl5eaj5SWjZaRkZSXk5qanqGdnHJvcnFxcXFxcG5zcW91dHJxdneAdXd8eYV+d3t8eX1/fICJiYmDfXp/h4GIiYGAgIGGiIKGi4aIhoSIiIqEf4J/enuGh353h4CCb2dbgouChIWKj4uNkZmdlJSUoJqan6Ktsa2ppKWtr6ysrLWuvrmtrqm1sLexq7G2rK+9wsLAvrq8trKutraxtK66u7OurKepp6unoqmtoKmooq+wuLSxvLq6urK0ta+8tLezt7e7t7mtrbCprLW5sbeytLe2sLu7vLu6ury1vLi0wbWsqqqrtLG3uLm1trSzsKymrrCqq7Cxq6yusLKxtK6qo5N4dnJlZ1tMUlBFTUlTV1JlXmdUUExcUUhMUkNBOTk3OTU4ODY2Ozc5Ojs6Pjk4Ozo6Ojw8Pj08RD45Njs7ODg+OTUxNTZCRkREP0A3Pj5DPjpBP0BAO0t/gomXmJSdlpabmIuSlo6XkZGVl5SZl5+bmZx8dHV2dXl1c3RudnJzdHV2d319gX56gXyDfoJ/fYB/hIKFj52RiYF/go+Xjo6HgoCBiIuFfoqQi3+HjY2Li4eSioeGloh2bIGFfmhjWH+OjoqNiYmQj46PlJSYkJWcmp2eqK6yr7C1tLOtsrW4sLy1tbGqsKqztbS7t7SztrS1r7i4t62noqassLCvtre3vrW5vLOysa61u7C0r6+yu7axuMC9tLS0s7izvLq2tLrAvbm6ubq+ubm5vrWysa+yr6q1tLGzsbSzrri4tb+vpKaoo6ussa+zrq6wsKytq6qroqKmqKKnrauqpaynoqeYeHlxZmVZT09NSVJNV01PX15cTlVVYlFEVE07Pzk8ODk1Nzc1Nzk1Ojo6OTs4Ojw8Oj08Pj4/P0I9ODY6Ojk6QDs1MjY2QUZDQz4/Nz49Q0I5P0I/PjtLjpGTmJmVmZGTopiTkpKLk4uOkI+Vl5ablZSbhoJ9enh2dHRzdH53end2gIKDhouMhISFioaQiYeRk5aRjZaalY+IjI+emJaVkpCTl5qamZCdoJ2Tl5qhmp2coqGVj6GLc2x+mIhlYFmBkZGOkY6LmJqPj4yUmpecnZugnaSstLm6vK+2tLi0tLK3uLmzq6+qqKy1srK1rrGrrqa3s7OxpaGotbCvrayrtbqyu7q6tLK3ur67ubG4sLmtqLK4u66ttLS3tbu2trm5vLe0r7G0t7a5s7e1pq2pq6ior6yprq2up6KxtLG0q6aop6Cjq66oqq6orLKwr6+pqKGeoaGjpqOgopqlo56ol3J3bmdiVUtUT09KRFBLX2JYWlFcVGBNSFJJQUA5Ojg2Njc3NTg5NDs5Ozk8Nzs+Ojg8PD0/QkBBPTs2OTk5Oj87NjM3OD5GQkJAQjk+PUBDPkBGQj44R5OWkZWTkpSQkZ+ZnZmVkI+Sko6Mk5aWko6RlZGSkIaBeXJzdXuBhI6HhZGTkpicnJiVkJWYo5yaoaeqqZ+clpeVnaKioZyZnpmlqKyvramnqqmpp6KlqKmsqqmvoJ2mkXx7i52acmJfh5eUl5+foaSem5qkp6Spq66spaSoq6+xtK6qrK6zr6ystLO0ua6urayqrLKwsK2wqKqmsrS0uK6qtrqwr6qurLC3s7i0t7W0u7y4tbWxtauyrKiys7uvrbGytLa1sbG0s7OvrKuvs7a0sayutKqqpqWnrauoqKupqqifqbOwqqeppaOio7CtqaatpairrayppaSioKWipaOYmZyVnqKippdudWVnZFdPWEtLSktTVHBiWWRXX1tcUlpQTEM8ODk6Njk4NzQ3NzQ4Ojw6PDg6PTk3PDw7PkM/QT47OTo5Ojs+PTg0NThBREVEQkM5PjtAPkI/R0Q+N0KSm5SVlZaVj46Wl5qZlZGKk5SSjo+SkYqKiY2Ul5qTjYmCho6VkZSfmpuin5+jnqGhn5ijpKelpaapqa2rqaKmpKilpKGfnqOjra2srairrq6rqqykoaKlqaenqKipnI14e5aOlnhwbZOdl56hoainoKKirqurqqetrqilpKmpqqmmo6iqqaekp66wr7Ovq7Crqq+yr7Czua+rqLCxrrCyubO0r62vtbCss7GurLW1tLSzs7CvrKyqrKusr7G0s7CwrrCwsKyqrauqq6alrrCysKumqbCvqaOkqaunqKaopquwq6mvqaaoqaalo6iwraqpqKKpo6WnpKGhoKKloZ2el5aYlJugpKmUbnNeamlfVVpOUk5QT1NlXGVjW11ZXFBZT0tAPDs5Ojc6ODczNTMzODo9OTo4OTo5Oj08PEBEPkA9OTo8PDw+Oz45NTo8QkFFQUNBOT47P0BEQENCQDdAkZ6YlJeZlpGHi5SSl5GIg4mLk4+OkI2Hh4SFlZmWmJeZlpqeop2anKKkoaCdn5qfoKGgpqGgoKCjo6KlqKmrramqpqOmpaCloKaop6aoqaepqKSnppmdpKaioaCkpop6ZmGNg4VjcHOLnZafmpmioqCgn6ChqKCcnqGloaCmo6KfpKGspp6foaGkrKqnrKivq6e0sa6ur7WyrKqwq6mtrbWwrq6srreup6yqpKivsq+sq7Kvqqqpq6utqa6urrGxraqtqaunp6uoqauinaapqKilqKisqKilpKWop6iopqmsr6+oq6mhoqKlo6Opq6ymqKWjqKKhoKSdnZ+hoZ2bnZ+amZWcnKOqlG9zZm5yZF1cUFVPWE9eZGRsaGJiWlpSVE9NQTo9Ojo4Ozk1MTYzMjg4Ozk5OTk7OTk8Oz0/Qz5APTk7Ojs8QD0+PDk5PEFBRUFGQTo9Oz9BQUJBRUI4PYqWlJOYmpaPiISNjpGSjIiIiI+JiZCRjoqKiJubmZygpaKlnqKjoZqeoZyanZ6bnKOop6ugoKOYoJ2XnKGjo6WjoqKkrKilqaCepqmnq6mkn6Kgoqahpq2nppydppx6ZlZOfnt5Tl9qeJqbnJmbn56gn56eoKOZlpqYo6KipJ+ZnKGhoqCbmp6goaSgnaejqrGorqusqaSqqquorKalrKqws6+rq6mwq6appaWoq6ynpqevq6Wnq6upq6irqqqrrailqKOmpaesqayoopykoaOmo6qpqKano6SnqKanqKepqKupoaKoo5yepqWjqKino6WlpqmgpJ6inpeYnZ+doqKlnpiUlZ6go5d1d2t2eGJfW1VZUVVXW2Nec19oX2NTUVlUSD48PTg7OTo4NTM3MzM0Nzo4OT05Ozo5PDxBQEM9PT44Ozw9PEA/Qz86ODo+P0NAREE6Oz49QD9DQ0VDOTyCmJmenZ2alZKKiZGRl5GQh4SJgoGNj4+Sj42cnZ+hpKmlqaeorK2moqKfmKSmo6Stsa6yp6asm56em5qjp6Cfo5+foq+rq6yoqKuvqaiqqKKgoaiqrrGzrquioaySa1FKSXd0b0VRYWuQo52dn52epKKioaCimJWem5+fpKGblZigoZ2enJudnZuZmZWen6Oonp2iqKGaoaOmoqSoqaqoq7CxqKWlp6eopKWpqaqnoqWmqKadnqWloqClpaOlpqCjpaOjpaelqamqpKekpqKmp6SrqaenpKGlqKynpqWlo6OopJWdo5+bnaCjqaeopqGjo6mooKiioJyVkZqfoKGmopuXkpCamqCVfHdvfXlmW1tgX1pcVlxoZG9jbWppYl5QUEA/Ozo4OTg8OzYzNDMzMzc5OTs8OTs7OT49QkBAPTs9ODw9QD08PENBPjo4PT9EP0M+Ojk/PEI/P0FEQjk6gJ6kp6Kem5+gmY+ZnaCWloqGj4iEi4qTl5SRo6Wnqq6trLOys7S4t62pqqevtLKxqq6usbKusa2lq7OssbGpq6+rq6y2sLSwq7GysaOgoqqqp6+3trW1trOuq6+rglxIQ0dyaWZDRlhmfp+anJuWoqelp6mfo5ueoZqWnqScm5aZoqefoJ+joJuUlpmWl5qfoJmVnqGZmJ2dpZ2gpKeqqaiqraylqaSlqqeqqaqsp6SkpKOimZmhnpqaoaCfpaWYnqSmpKqooqelpaGqp6mnp6ejqKWmpaGkqKesoqekoaalpaOVl52Ym5mVo6elpaSfnZ2lo6Kqo5+amZiXnJyaoaGakJOTl5ibjX93cnZ4aWJbX15cYllgZG5ta25hX2RgUE9BQDs7OTs4Ojk2MTQzNjQ3Nzc6PTo8Ozk9PUI/Pj89PDo/OTo7PD5BRUA9OTtAQT5DPDs5PzlAQEBAQkM7OXuao6OcoJ2dop2Zn6KioJibmJaYkpSQm5qWl7S0rrW4s7S4tre0uLm3tbm4ub28uKqLnLK4vLS9urW7uru4s7q/uLe5u7G3r6iusq2inaCqsri9vby7ur+0rrG8nnFQV01Eb2FfSERPYG+VlpOalqOrqLatoqOkq6almKGko52goaKooaOgpaGck5mYmJmco56cmpudl5uZlqWam5+hqKmpqKuvr66pqKirrKytq6irp6WjoJyfo6Ojn6Cipammmpyip6Spn6GjoqKgpaanpqSooJ+ipKGjoqiop6OloaGopqalo5mbmJuTj6GknqKfmJiVoJuhpaCfm5udnJuamZugmo2YmZiTkYaAdnh4eGNbUllUX19hbWh2bHBoaWliWlNMQDw6Ozg5Nzk3NTU2Mjg1Njc3Ojw7Ozs7QD4/QD0+Pjk6PDk2Nz47QkZCPDg7P0NDRDw+OT43PkFCP0ZDOzhwkpqblJ6bm52Vl52doqajopaXnpaXl6GblJi+t7G4uba3t7i7l5S2vbu9vcDFtaK7mKC3v7+6wcm0nbu2sra/xcGooLa0urGqrrSxsLG0tba8wcjAu73Gurm4vI1hWY5yQ2xgX05SV1pmkZ+WoqSop6C6pqqrtbWus6CnqqynqqmlpqCnoKGmoZOWmJ2foqSjnZ6coaChnZekmpmdoKaqqqqtrq2tsLGrrK2sqamrrqimpaalpqSkpqaeo6eppKGcoKKjpqCio5+jpJ2foqWgpJyboZ6fo6GhpaSlqaOkpaKkp6ehn52elpOcoJiZko+MjJeWn5uWnJqdnJqSlpSUmJOQmp2YiouHgIB8gnhhXllUYWlgZnRvdGl0ZGlkYltMSz46OTg5ODg5NzM0NTI1NDY2OTw8Oz08P0E/QEA9Pj44OTs4Njc/OUJFQzw7PD5DREM9QDs9Nz1DQ0BFQjw3Z4yRk4qalZiblZWYm6Knq6aVl5iQlZmhnpeXvrWztLu6ubi5woeYt6u4u8DCxbOjw6e4s72/tMTHvbS7uL62wMTErqCworW2tb2+wcTHw8O5vcPU1sfAwry7urqIVnvCqk5ubmdRW2RdXIisqKesoouUtaartLywtbaor7Gwr6yqoqajrJ+fpquXmqifpaWfoJydoKuwsKyiq5yYm6Cor7Kys6uorre1sq2tqaalqKulpaStqaShn6Cnnp6mqKmmnp+anqGlpqmcnaObl6KmmpuanZ+cmqGcmZ2eoKijn6GfnaWioKOioZSZmpmTj4qLhI2Qk5uPjpiVm5eYkJORkomNl5iYk4uKi32AgIVwYGJfXmtjYm54dXZubVtiUlZcTUc7PDk3OTc5Ojc0NDQxNDM3Njg8Ozs8PEBAPUA/Pj8+Ojo5Ojc6Pz5FRUU8PT1AQkJCQUE7PDhAQ0NARD87NV+MjIaFlouUlZeYl5ifpqellpWVkZebn5ual7mxtrO5vLy5urWqsryxvsG0vMe5uLuuv6fGw7/KxsnIxcXJvMLHx7+xsKe8vL7FxMbJx8XGu8TC1eDayrW8vMDAklCLwL9hfYJ5XUppcFN6s7ionIJvlrCjprG2q7WyrbOtqK6vp6awr7Ktqq+zpKu1qaeopKCgnqmyuL61tbWqqaausre4t7apq7i8ubexr66noqOop6SfqKOfnqCZoZydoqSnp6GelJuaoKGlnqChnpajnZSQlpiboZqflpORlpSin5qenJudoZ6kn56VnJiPkpOPjImTkJefiZCWkZuUmJGRlZaDjJWXlpKLjIh8foR/aWZoYWtsZ251cXJ1cWdeX1xSSUU/Ojo6Nzg0ODw3NjU0MjMzNjU3PDo7PDs9QD4/QD48PTk5OTs6PDw+QkRFPj49QENDQkREOzo4QUJCQUNAOTJbk4iEjZGKi5GRlZCSmp2fnJOSmJSdnZqXmpW2sbm1tb6+tri1uLO8vMTEusPHwb+0s8XFxr/CzcfLzsvLx8HDxsfIysXExcO7vLzBxcHFxL/Dwsvb2cqzwbzAxqVVgqKicJyPhXxFd45Va6uwlHpjcau0pqqpqKqtrKmlpZ6pr6uyu7q4u7e5t7O5uLOurLO0qrC1ub3Bur6+vL60urm4u7qysbS8u7q7s7Oyp6Smq6uioaCdmpudmpyXmpuenJygnZaclpuZnZ6io52UnJCNiY6OkZ6bnJWNh5KLmJiWmpybmJybnp6cmp6UjpiYmpSRmZeeoZWYmpKXlJWRlJqYk4+TnZaSi5F+enx+dGtsbmRvbWlxeG55aWlhXGdhUUZEQTw5OTc2NDQ6ODQ2NTMzMjY1Nj05OTs7PT47Pj49Oz05OTs7Oz89QUNBQkFAPEBDQ0NFQjs4OUQ/P0BCPzsyV5uQkZCQh4WSjo2IjZCTlZGPjZSUm5STlpqRs7e4uLi+u7C1sri2tbbAw8G+w8LAvru+u7u8xMzEzNDLxsa/xcfLyNTLysjGv7u7vsS+xcjGxsTEzc/Dvbi4vsWvY3R7a4u3koiZV3uPXWuQhXJhWo23tayupaSjqKSgn6WZqrSxvsG+urm6uLW0srG0tLO6wL7Av769u7u9vsDCt7a3tru7sru+ubi3u7a3tKyoqamrpqijnpOampyYkZKZl5GRmJqXnpiWk5acm5+elJOJiX6GiIuWlJiZkYmVkZeWlZmbmpaYl5idnpyhmJWZmZyYl5ybn56jnJ6WmJeTl5yZmZyUlp2UlpOJdnl5e3dua2lndVpmcnhzeWZmXWRbUlhJRj87Nzg4NzYxNjk3NDQzMzM2NDY7ODo8Oz08OD0+PDo7PDs9Ozs+PkRBQURCQEBBQkNDREM9OTlCQD8/QD89MkyWmpaSk4yKmJCKi4yOkpKKiIaNkJiKj5CUl7O7tba/vb2xtrjBvby0uL/Bsbi3vsHFvbu8wsbJv8jOyMHEwcfKysbKxczIzcbIxb/DwMvNz8rGxMXLwquprbK3nnBxbVykuJCInWhncmhoamVeV2ikurWzrKmioa2prKatn6y1tL/Cvrm4vbawrausr7W0ur7Fv7u8urO5u7i5ubWtsLS9u7G/vLiytrmzubu0ra2orKyqqaeXnpualY2MmJSTi5WWlJyZl5WWmZKYn5mQiop+iYqKkY6Vl5OUn5mWkJSZmJmWmJOUm6GeoZiYmp2ZmZaenpibopqdnJuYmpuZlpeXlpyZlJyYfoB4eXV1ZWVpamddam9ueHdjYmBgXlhXRkU4Ojg6OTc5NDQ5NzY2NTEyMzM0Ozo9Pzs9PTo6PTs8Pjo7Pz48QkBDQkJFQj0/Q0NDQ0RFQDk6QkFBQj5CQTVCkJeUlZmSj5qQjpKRjZSVi4qHjI2UiImPkpq2u7S8xsHEwr3BxcLAtLO9v6ywr7rDysPCvs3IxbfByMW/wcLIy8rCwsTJzM3Oz8zDx8bIycjIycfFy8uvl5mcnY52cGNgqqqMi5RwYGRnYV1cWFWLu7y6vKytpqq7urm3wLK1uLLAxrq3t8Gzsa2tqau1s7u2w7a2vbWxt762s7e4sLW2v7uwvbq0q7CxsbO8urOzrqutq62xnaOjoJqQjpiXlZCclpaYlpWSnJmTm5+clpGUjpWQiYyQlZOUm56YmZKSnJedlJmSk5aZmJ2VnJ6do5yVnZ+TnKKcnKCfnaOemJSVl5ebmpmgkH99cXRxb2NhZ3ZoaWl0bXhsXWRbVWBZTEhDNjw5OTg4OjUzOjY2NDQxMzUyNTs6PD47Ozw9PDs8PTw7PD49P0E/RUFCQ0M+QEFARUVERUE7Nz5DQkI+Q0I4O4+akZaalJKUjZCUlI6VlI6Pi4yJk4uIkJObt8C6xsXEw8zCwcS9vrWvt7uvr7O6wMfFxMHMy8W2ucDCwsTHytHLwsPExsnFzNDNx8zJwsLHwsvLyMfOw5uGiIN5Z19NYKGZh4yLc2VgXlhXWFVntMnAvL60sLCwwb6+wca/vri2w8K6urbAvrWyrKmvsri+tMC0tLi0t7nEua+8vrm+v8K/tbq2q6qsrq+wt768trSura2utaSlqKimmpycnZyeopydmZOQkp2VmKCdmJiVmZmZl46MlH2QkJefmZmYk5GToI6Nko+VjpCUlaKdnKSem56elpyjoKGipKOkop6amZubnJ2enIN9cnx4cGdgamp2bGlldW50Yl1iVFdVU01HOjc7OTk3Nzo3NDg3ODQ1MjM0MjU7Ojk+Oj08Pz04Oz05OTk9PEBBQEVCQUJBQT9AP0RFREVAPDk+QkNCQENBOjSAoZeUmZiVkImUk5aTiZGMlJGOiJaKi5CXnMXLw8O8wMPHwbm9vbu4tre3rrK3uLzAwsDCx8bHurzAwsTHyMbSycHDw7+/vsTLyMrLyby8yMfJzcjDyMq0fnFqXVFQQlyMgn+CfW9mW1hUVVVUicLAwLq6vbWzs7+/ub/DucC3u8G8uri7ub27srCvsKy5wri9ube1t7q9xb24xsjCwcLGwr28tamurrCwr7O6t7m2sK+tr7OppquprqannqSlo6OjoqCblZiekZecl5GRlZeZlZmRlJiSlYyYo5qcnp2FiZ+TfJKWlZKUlJennaCipJ+en56foaGkoqKjoaOinJ2fnqOhppl5enl/cnBmZWZjamRiam1ub15ZXVZWTlBKRjk5Ozk3Njc3NjM3ODk1NjEzNTI3PDs8QDs/PDw6ODo8OTk4Pj1APz9GP0JBQz89QT5ARENDQTw5PENBQ0RBQDozbKKdlZedlo+PmJiZmIiSjZGVkI+Vjo6TlpbKy7u5urnBu7q3vsG8vLu5sa61uri4u8S6vsC+vru8wMXBxsK+xsK5u8O6uLm8vsHHwca7ucjIw8XEwMPCwZJeUk1IS0FVdmluc29oZ11YVFZTYKnAuLm7u763tLC5vrO8vrG5tbi7tryztbm2uba5t7GtusG6vMG/t77Ev8bDw8fHwrvAwr/Cv7iys7O1tLGut7S3tbSxrK2xp6Wlp7CtqJ+nq6ajqKWmpqCgn5SYmZSRkZWUl5OYl5qhnZ6hnKGdoaWglpSbkZeXmJqTnpmZqaSlpKWdoqCanqCkoqOcoqGjoJ6cnp6ppaiVfXuDeG5mYWRiYWNjY2piZ2NbWlpcWVFPRT07OTo7Nzc5OTY0OTk6NTMxNDUyNzo7OkA9Pzw8OTc3Ozo5Ojw+QD8+RDxCQURAPz49QkRCQkI+OjlCP0FCPT44NVmfnJiTmZaRlZiYmpeQkZCQk5GTlJKSkpSUxce4tbq5wrm5vMPFwri7ubGxtry6tbnAu7u5tre0tLW/u72/ub66urTAuLW3sq66u7fAt7zKz8G7v8C8u8avbklGREhATWRZYGdmYmhkWVNSW4y/v7q3u765tbi0uLy0vbi1tLCzvLG3tri/tr25vb65t7q+u7/Axb29y8PGw8TAw762ubq2v7i7v7y4trOyq7CwsrWzs66sq6emnqeurauiqKumpqqjp6iqo5+Ym52bmpicnJiXnJuhpZ2anqGhoKGmoJqbnJiboJ+dnJ+coKiho6SknaKfmqKgop+el6Shop+dmpieqKWhi3x5iH1xZGFiY2hqZmdpZWleVlZUWU9TTEY4PzY7Ojc3OTs2NTo7PDYzMTM0MTc7OTg/PT47PDs3Njk5ODo7PUA/PkA9PT9CPjxAQUNDQT9DPTo2PEBBQDw9ODdJlJibj5OUkZWYlZGWkpWRkJGUlZSTk5OYlcHCwLq8ub62uL7EwMKxvbqytLO4vLW3vMC8vbS0sbC1t7W7wbi+ub+8vLe0t6+ut7W5v7vC1426vrrDtbnHt5xgQUBFO0pcU1hhYWBnaFxSU360xbzBv7zEt7a3tLi2tru7uLa0t7q1tLi8vbm/ucPAwLu5vLu+vcjEvcfEw7rAvb62sra4srm0usLCureysaysq62yr7Kur6ijpJ6rrKyqpKakpKiqoqemraihoaGmn6Oiop6bnKKfoKOdnJuhn6KgpKCem5eZn6GdnZ6eoaWkoaKioZ6ho5yinqCZnZijn52eoJqZoKKmnYR6g4F5cW1lZWZvaWVsaFhYTktLS1JKTEhEOT44PTs2Ojs5Njc8ODk4NjA0MzE3OTk7Pz0+Ojw6ODg5PDg6Ozs7PD1BPj09Q0E8P0NDREA/Pzw6Nz5CREE/QDg4P4mYmoyMkI+Tl5WMkpCakpGXmJaUlJKQmZTDvsbBwby8uLi6v7a8scK2tLyxtLa4s7q9v768sq2vrLGwt7y3u73BxLm3t7a1ubm6u7+80MR1qsu9x7i5t623j1BAQThMWFNTXV9eZWhdU2GhwcjDxMW+xri1srK9uLi4vrq6uby6urS3u7q5v7zEwL+5uri/ubvFxr3Fw8Kyur27sa+2uLO3s7q+wLm2rLGrrqmqqa2qqq6mpKWnrq2ppaOio6GkpaWmoqato6Klo5+ho6Gcmpyhn6CloaCenZygnaWgnpeVmZ2fn52gn6KmpaCknpybn6Ofn5mcmZ2epJyWnKOcnqGcppZ+f4d8a25wZ3Frc2ZibWBcVElLSkRKQ0NHPjk7OD48Nzs7OTc4Ozc8PDYyNzUxNjk8PD08QTs8Ojs6OT45Ojs9PUA+RD89PkRAPz9BRkQ/Pzw9OTc/QUNCQEI5Ojl3nJiLh4uQkpOWjY+TmpOQnZiSkY2PjpiSvbfHvsO+vbu+vL22uri9ure9s7OwuLi1uby7wLeqraSusLi7sr2+u8S2tbi1t7++xLzCxNescoC9yM/CwLetta19Tz84TVVSU15gW2FiXlWMuL3Hy8fHxMe9tbW2wb27u7/CusDCv7y2t729vcHBwL+8ube8wru3v8W7wr++tbe8vK+vt7awtLO6ubq7r6mtq62rrKaqoqeuqKWqra2vp6Sgn6ajnqKjqKOjq6Oiop6dm5ublJaZnJyfpZ6fnpmYnpejoJyXmZqZmqOjop6jo6egpqCbnaCjnp2WoJmcoKCblJegn6WcmKKQgYaAcWZsaW50bnhjZ2JcY1FLVEhFRUNHQjw7OTg9Ojc6PTo4OTs3PD01MzY1MDY4OTo8O0A9PDo+PDk+OTk9Pjs/PkM8Pz5APz4/P0ZEQEE/Pjo3P0BDQz9APTo4ZqGYj4uNlZKVlY6PlpmVl5uVjoyMjY+bk7m2wbS/vLm8w8C+wLq1trKywLmvsry8sLe7tru8qqqjsLm9vLK8vrzFuLG4ubzGycrCx8nSlm5yrtLRzMrEtbq/roJMPExXT1RfYFlaW1Zvt73Aw8zKx8XGwLm+vMS/v7/CyL3Hx8XFvLrEv7vBv7rAvLu7wMS9t7nCub69t7S2uLqur7WxsLCytre0t6yurKqsrKuoq6Gms6qlra+trKippaOkp5+io6Onoaeiop6cnZyamYyQlpeZnaKZnpuVkp2UoaCdmZ6fmJimpqKfoqKmoqeloqCko6GbnaCbnKKfl5WVnp6kmpafiYGDgXRvbGx0a2xuX2NeYGFOSU0/RUA/REM7Ozo6Ozo4Ozw6OTw+Ojo+NDQ1NTE5OTo5PDtAPD89PTw4PDs6PDs7Pz5DPkI+QD89Pz9FRUJBQj87Nj9CRUQ9QUE6OlmfmJOSlZqVmpOQlpeclZuZlpSVkZKTnZm2uLaxuru6vsG5uca7trWypb69tLbBv66zvbS4wbGwsbS7xdDCur68xL63vMC/yc/HyMrKwYRwcqbMzMvNysbCwsm+dUdHXlBSWmJWUVJcosK/xcDKycLDw8O5w769ub+8wsbCyc7Hxr66xr26v7m3wLm5vsDCvrW0vLi2u7CvsrK1r7Cvrqyus7CzsrirsbKxqrCrq6yrrLatqKyusqarrKmpoaWgpaakrKSmoaChnqGgnaCMlJeTm5+mmZ6emZOYnZ+gnp2eopuYp62ooqSgoKKqpqmhqKGlm6CgnZ2jn5SYmKKdp6Gfm4J7eod6bW13fGBxY1teX19UST5DRUlCQz5DOz42OTo7Ozs7Ozs7PT05PTU2NjIxODo5Ozs6QTs/PDw+Nzs8Ozw9PTw9Pz5BQUE/P0FCQUVDQkRAPDY+Q0RFPkJEPztTmZuZmJ6dmqCalpyZn5KdlZ2boJWWlJqYur20sLu8wcTCv8XGura5sqO7vbS3xLuwtbq2ucS4tLy3u7mt28K+tr7Avr66ppyqs7fEwKV2dHedxMbLyMHDwL/Jy6ZsS11SUFZmTkpZj8TAwMG/ysfCwMjAusK7urO6usG+wMrOysS9tby8ub+5ubW1s7/Avre0s7S4rbeqr7CwsrGvq6+nr7ausrG5rra2uLSzsLGttrS6sa6srranrLKsraSjoaenqLKrqqWkp6elpaCml5ujn6SmraKeo6KanaWiop+foaWenrC0sKSlnp+kqaevp6mgq6CiopqipJ2anqGmp6+psZWCe32Cem5zeHNocF1bXl1ZUkZEQ01JQUQ9SDs7NTk7Ojw8Ojs7Oz0/Oj01NDUxMjc4ODs8O0I8Pz46OzY6PTo7Pj0/QD87QUFBPj4/QkBBQkJFPjo1OkFCST9AQkA7TJqdnZ6fnZienZmampySoJWbnp+blZGRl8W+urbDvMbCvr/Ixbe1uLe2ubu0r7e3srWzt7m8u7a7u8W0ba/Ovba5wLyqfW5obm10gpiXcHd8mL6/xsC4v7y9xMO8qHRmWFZjcE1bkMDEvL2/v8PCvr7HvLy/tLSutbW8vr/OzcvCt7K4t7e9ubuxtrLIwLu2tLGwt6yzqbCtrbS3r6uuqrG1r7Gvt7O6usC/tre2sru6wLWyrbO3rLC6r7KloqWrrK+5s7KosK+xr6qiqKGkraitrLOun6inpqWmq6Sknqaqo6ayuLOrpZyfp6anrquqpbClpaWbpKOYn6exrLW4sLKOhHl/fHZsdXtwbmlbX19ZU1BBRkhHS0BFQ0g8PTY7OTk8Ozo6Ozo9Pzw9NTU2MTM2OTg8QT5AOz1AOzs5PD04Oj08QD46Oj49Pj09PkBCQkJBRD03NDU9REc9Q0I/PEWUnqCgoJyXmpiYlZmdmZ2fmp2bnJaRj5LDwMK9wrzEvLy7xbu3s7e2tru7s6CWtayvsbS0tLa4ucDNsHWCtL21tcGkhmlZXmBOU1tcb3J2gqC4t8K6s7q3ury+ur2xjW5mdIRvmb/Ewr27vrq6uLXBwrW/urWur62wvcC5z8rJw7GwtbS0vbq+urq7ysO7uravsL2xuK+ys7C3vbaur66wt7CsrLK2vbzEwrq9t7bAv8G3tbC2srGzurGxr6err6u2v7e1qbqztbmxp6uop7ausrG1uaisrK+qr7CqqKessayytr20saykqKuoqKusq6i2qaaonqadmKOuvLG7wbSmiYF8gnpzdnZ3bnFgX2ZdW1RKPT8/R0Y9R0NDOTo1Ozk5Pjw8Ojo8Pj4+Pjg4MzE1Nzg5Pj9BPzs6Pz08Oz09OTs8OTs6Nzs+PT1DQT8/QUJEQkE8ODU4PUNGPUREPzw/iZ2en52Xl5WUk5aZnpubmpuYlJ2Uio6Owb7Dwr6+vrm2usCxtbGzt7fCtbOrrbOoqa61r620trnCyaWEeIyisLWcamZnVVlfSUlNUVRsdYemsLe+ubK1sbu4u7W5wK+fdnmarb3DxcPAvL+5s66yvLquu7Szpquorbq+uMvCv76sq7Cvs7q3ub67wMXBu7y3sLXEtb+0uLu0u8PCs7a2sbisqaWrsr23v7+7u7exvL28trGvq6uprbOvsLCrsLSpuMC2sqm0tbC3tq2spqu7s660uMKwsbG1sbK1saywsri4ubi+tLGzrqyxramvrqqyuK6trainoZ6ptr+4ur+wlol9gHxxdHd0d3JsX2NiXF5PSUI/PUlERk1DQDc3NTs6OT48PDk4PT47PT86ODMyNTc2OD8/Qj86OD4+PTw5PDk7Ozo8Ozs6PEA+QkI9QEE/QkI/PDs3OjxBRD5CQz8+QYqgm6GdlJiVlZKYmpyWm5WalY2bj4SIhru0vb+7vLm3s7y8rLOytLS2wLXAr7Kzqqqxt62pubO3v8anh3t2jaGXX1NDWVVIYmpVTkRJZI6hrK+2urWzsau7uLi0uMG7u4J1m7e8wcbCvrm5ta2lrLOxprCtqJ6gn6WttrXCt7a0pairqLC2s7K6tru7u7W4trC1xLK+vL+8ubrFybq9vraxp6SeoamxrrW5trKxq7S3trGopp6gmaWmpKynq6y2qa+6sa2kpq2lq7GrrKmtuLawsrjBtrGxtbGvu7ayt7W1sry1urKwsbKutLKqrq2nuLWyta2uqqiosrq9wLa0qY6Ce393b3tvdnJuY11nWF1dU09NQT5KQkFKSUA2NjU7Nzg+Ojs4Nz4+PDs/OjkzMjc1NzU8PD48PDg+Pjw8OTk5Ozs7Pjs7OTw+P0E9PEJAPz9CQD47Njc6QERBQ0E/QUKJoJ2loJSWmJiVnqCcl5uYmZGMmYmDhoS1r7S7u7S1sLG2uq6wtLOvtbq1urC1s7KttrqvrbyzuLi/s5CBeYiPbU1KQGVZQlB4gZNnTEJdgrC1s7WytK+su7m4trm/wreNdYSutbq7uLWysa2sn6Smp52jpZ2WmZman6muuayrq5+lqKSrrq+nsKyvsbGtsa6usLmwtLy+uLm4x8W8vLu4qaKcmJufp6assq6zqaapqq6popqXl5GcmpijnqKir6ekrKaompqemqGnp6anqa+2squ0trCqsK+xqbm2sbWxrqy3s7avrquuq7S1ra+rq7GtsbKoraurs7W3ur2wq6GLeoJ5cnZzbXVpbF1balRdXFBOSERGTEJGTkY4NjY1OjU6Pjg7OTc8PTo7PTo5MjM2Nzc3Pjs9Pjo6Pz48PDw6Ojs5Oz47PTk8Pj1CPDtAP0A/QT8+OjU1OkBFQkRBQEJBiJ+ipqGYm56dmqWpmJudmpmUjJmHhoeGrq2uuLmxsqiur7iyq7CwqrK1ubm+tbK4tLm6trm7tbWzuLWVjIiFe1dFQlGIWElKWHiNgWFAVqS5s7SzsLGtsLm4tru3ur6xrKqkrq24rqmqrKujqKGdnZ2Xl6GVkpWXkJifqK6ko6Sgoqeio6mpoaanpaqtp6ynqKesq6yyu7SztLm6trK2ramgmpaWm52fq6yqr6Oko6GpoJuTjo+Qk5KSmZaanaSloJ+ep5iVkpSZnqSjoaWqrK2iqaqppKmtrqW0sa6xraqprq+wraWmqqSos66trKmmpqmrpqqnq7Ksr7Oxq6mWgX+Bd3J4aHRzbmRVYWNXXFFOTEhASFFETUM9ODg3NTo3PD46Ozw4OTw7Ozw7ODI0ODk3ODs7PDs4PD0+Oz08Ojk8Ojs9PTw6OkA9PDw7QD5CQEE/Pjk1ODs8RkFDRD9BQYijpqKjnqCfp6Coqpufm5yZmI6Xi42PjKqpqLGvsK2lp6ayr6mmq6CvsLu1vby4wMG+vLy8ua6sr7K7qZiZlGdMP1R5cU5JSUtonX5YRVizu7Gss6+urK22trK0ta6oop2bm5ucp6een6ipn6GnlpuXl4+dk4+Qlo6Xm6SooKCioqKlpZ2jo6CepaCkrKSmqKSio6OrrLOuqa6urqeqraisoZyamJmYm6moq6ufpqKbo5yVkIyPj5CTkJeVlpifnp6amaaXk4+Slp2ioKWipqSnoKKko6Ghq6uksq2qrKyno6yuraufoaKkpK+srKmmo6KqpKqqpKmrpqmsq6agiHiDfHZ/emN3bG5dUWhUUE5HUE1MQlBRQD47PjQ5OjU7OT07Ojk9OTk8Ozw8OzkzNjk5Njo7Pz06ODs6Pjw6PDs5Oz07PDw9PjxAPT88ODtAQEE/Pz45NDk8N0FDQkQ9QEOOqqSjoqGinaulpqimoZ6dmZ2PmJWTkJWnpKGmqKmlpKChp6uhnKKbp6u1sry9wMLCwL7AuLSnpKyovcGqpb1mRVOhhFBXSUtfSViLYGVmhK+1qrK0rqqrr7Cys62lnJCWko6Xn56hoJyjpJ+eqJSblpeMl5GNkJeTmJ2iqp+fn6Cjpaicn6ChnKKfo6innKehoKSfrKisrKCpq6agpKimrKOdnp6al5qrpqqxo6WonqCclZOQj5GQmJCWlZiXn5icmZukmZeUlpqdoJ2nqKWgo6Kho56doKmqpa6upqipoaKqrqqnoaCio6msq6eppqShqaKlqaalpKKmpKijkn18gHV2fW1re2RoVVJkTUpIR09STkpOSDxFQDwyPzg1OTs+Ozk5Ozg6PDs7Ozk5NDg7ODc7Oz48Ojk8Oj07Ozw9OTw8PD49PUE+QEJAPTc6P0FCQEA/ODU1PDpAQ0BEPkFGlq6koqWeo6KpqKipqqWmnp2imJiZmZWbop6bnqOioKOgoZqgmJeXlqGorK62t7q5ure3u66ooKGpoKzGv8ueTkF1nG5PbUpNY2Z2dGBdYnORsq+us7WqpqyropuZlI2QlZaYl5ufoaGbnaSemqSXl5eWkJKRkZOal5ugpKqeoaGepqeqop+gp5+dn6SnqZ6jpp+qnaqtqq6nqLClo6Smp6ymoaWim5ier6iusqulqqqgm5iYmJWTlpqTlZWalpuXl5ihnpycl5uhmp6ao6eln6GioqOdm6Gmp6aoraOppZ6kp6mkpaWhpaSsrKmmq6eioKSjpKenoaCgpaKmoIl7gH13eHxkeXlgYlNVYEhJSktTVElSUU05P0I2Nzw2NTs6PDw5Ozs4Ojw9Ojs4NjU3OjY5Pj0+PDk5PTk9PTw+PTs7PDo+PTw/Pz9APT03Oj5AQEA/Pzg2NT08PkFCRkBAR6CupKaroaOqrK6tp6ypqKCipp6bm56aoJyalZmfn5uen56WlJOXk5KcnqSorq2sq6uvqq+pnpeepZylx8aLVlJLZqNYZn1vcltRa2NcZ2JgbJG0sLC4rKahnJ2alJeamY+NkJWRi42Nk5minJejmZqXmJmUmZiWnZufpaapoKajnqeurqumorGjmqSmpqqioaqiqaSosquxsqu5qKarp6urqaysp6Cgo7GusrC0qrKuo5mcnZ6hmZubmpiZm5SWm5aZnKWhoJqjoZqcmZ+kop6gn6KmnZulpqWkpaijp6OepqOinqaloqWlqKykpq2noJ2dn56gpaGenqWgppmBe4F8dnZzaIJsZVtTWlpNUUpPT1VMU01CNz5CNzg9NzY6PDw9Ojw5ODo7PDo7OTc2Oj01OTw7QD03ODs3PTs9PT06Ozw4Pj09QD5BPj4+ODg8P0BAPT43NTg9Pj1BQEZAQUihqqCrq6GkqquwramtqaelpaWkoKGfnqWXl5SYmZ6YnJ2blo+VmZKRnJihnaqip6Cep6Gln5ySm6Kan6qji3hUanF3dm9kd3ZYV2JgZGlbW1Znra6sr6efnqKglpCTm6CbmJeRkp+coaObnpuWn5qfl5uinqWhnqSfpKitraisqKSstLe2sKe0rKKtraOvpaSmoamorrWzsr23vrCssa6tqaq0sbCoq6iytbezuK2ytKSgnaWfrKGhoqCgmpiWlp+bm5ikoaCeo6GgnpqcpaCfnZyhqJ+fp6meoaOkoKagnqehn5ymo5+ipaOooKmrpZ+dnZudmqainpyjnqeQgYJ/fHh1and1XW1aUWBIUlVIRlVWSkNNRz1LSDhGPDc3Oz49PDo8OTg6Ojs6PDk2Njo8Nzs+PT8+OTc9OT47PEA8OkA6OkA/O0A+QUA9PDk3Oj5APzo+NzU4PT0/QUBEQEJGnKueqamipamprqimqqWmp6aoqqGlpKOmkpOVmJacmpqcmpWTmZuNk5+ZqJ2un6eenKGdnpqZkpiem6GhoKN+boJwYGNXTFtSWkxMUVlSSE9NR5qsqqmkn5+ZkpGTmJiWlZWMiIqOlZ2cnZ2elp6apqCgqKWxqqeuo6uutrC0srGutri9wLqttbSwt7CutKmmpKWsqbmztbvDvMPBtrq2q6+xube8r7OwtcG8t72zs7WirKKpqLKpq6inqJqZnpqqp6CZp6Cfn6enpaSfnaqiop6bn6igpKetmZ+jnp6nnqCmnpycoqGbo6KhnZympaWkn6KZnJukn6CboJyjiYWEfnZybWl2bWhtXFhcQ1dOSkdNR0NGTTw+TD40PDk2Oj0/PDs6Ojg4PDk6Ozs8NTQ6PDg5Pj4/Pjg4Pzk8Oz0/Oz1BPTo/PjxAPj8+Pz08Njs/QT07Pzg1ODw8QERCREFCQ5WqoKapo6mqqKmjoamgpqinrK6lqaWpqpSSl5mUmpqanJiYmZyamJmqoLGit6Swpp+enZ2XmJWZnpqco56biGFXXmVgV01RRj0/QENEPz5CUXepramqpZ+enqKjnZ6dmpyblJOUlJ2dmJSFnZqhm6ukq7KwubKysbKxur28vLm2uMO+v8K/trq7wMS5vbusr6exrbHCtrjCxsDIysDKv7C5ub25wr64s7vGxL3DvLezqrOtqrO1r7Ouqq+jnauntrKtorCmoKOvsa6wpKWvo6GgmqGnoaSqqpmdoJmao6CmqKGcnqKemaSenpiYo6OhpZ6mmZuipJ6fm5ubnIeGgXt0cmtrdHJxaFZcUUZUSURKUEk/RUE0Rkg5NTw+Nzs8Pjw8Ojo4OTw4OTs4Ojo4Ozw3Oz49Pj02OEA5Ozs9QDw9QDk3PD07Pj0+PUI+Pjc6QUA+PD45NTg9Oz1DQEFDQkGRqqGlqqelqqimn6KnnKasp7Gyq62jqayVkpWalJecoqGbnqCinJ+psqu7sr+rr6ylnqCgnJyYmp+gmqCflXxfXmVgUEZFO0I+Rjw+OTZOfqqzp6OjoaCepaulnpeclJGZnZiUjIqGiIZ4bYigpKKrrLS8tsO+vrO7wcPCxcC/wsbGxcPIwsDFx83QyMvDsre1vrK+xbu+zM3FzMzM0se+v8DCvsfGwrfEysnDwca+urW6u7W7t7C1sqq6sq67t7+7uqu4rauquLq1vK6uuaOmo56mpaKjqaaZm5+Ymp2nqqegoaGkmJSjlpSZkZydn6Sep5+en6KdmJmUmJSIhH16cWtjaG94a2VaW0ZLTEVEU01EQkU3Oj87NTQ5OTc5Pj87PDs7OD48Njo9OTw9OTw9Ojs9Pj4+NztBOj45PT45PT44Nzs6Ojs/Pz1CPj83OkFAPTw9ODY2PDo8QT9BQUE+kqugp66ooqulpKKipaGlqquwsq2upKmmlJWWmpaUm6SmnaGqp6KrrLy8v8PBsrK4p6Ghq6qhnJ6hoZ2bmn1yaWFXTkU+SVp8b2FBPVyOrqygmZubnp6Zl5eXkoyOlpeTjo2Qi4KDgndycW1wj6atrrS5xbvNx8u/wszNzczHydHMzczHycXFzNDS1c7Tyb3Av8O7xsXIxdHTzdPQ09PMysLFxsbKyM6/yNHMx8XHxcK8w8G/v7+2vrOuv8DDw8fEx8Suv7iyuLzEwsK6vLy1rqenraigoqmlmpagmpmdqKupo6SknpePm4yQmYmVmJugn6OdnZeempOTi5WPhYB5dHNlYmdyb2ZeWllDTkxERVBJRENANTU1ODlCPTY4OkE+Ozs+PDk+PTc6PTk6PDg8PDw7Pz8+PD0+Qzw7OkA9Ojs6Ojg4ODk7QT48QD8+ODtBQTs7Pjc4Njo8PkI+Q0FAPpOvn6ivpqiro6KloKampKuoq62qrqKqo5Kcl5ebmJuirJ2frqalsarFxszOzb+wwaikqKytqqCdo56cnZVpZlxUSURAP0qHnqSYg6CyraOenJ+al5aUkpSWkZCPjIeDg4iHg4CBgYB5cXJvbHmktrq5vsvB09LTyM3O0dPR0tHQ0dHNzs7Qxc7U1djS183Gx8nMw8XKz8rT19LX0tXW09TIzMbMzcnSzc7TzcXIysrBx8zHycjGv8Ozs8jEy8vLz8fKv76/vcHHxc3MyMnAw7+tr7OonqKqo5qTnpyYnqaprKSlppaXipWFkZSHkpKSmZualpiQm5WQjIaRi4B6cnV2Z2NndmlkVldRRE1GQElRQj1CPDoyMkE8RTw3OTxCPTs9Pzs7Pj05Oj48Oz44Ojk5Oj86Pj1APkA8Pjs+Ozk9PTw5Njo6Pj08PEE/Pjk6QEE6OT44Ojo6Oz4+PEE/QT6QrKKiqaanqKSfop2qqKOso6OnpqyiqZ+To5iWn56dpK6bn7CrqKyxyc3U18/Gu8esrbO3rK6jnqOinaGbYVNMSkRDP0NUsdG9sq+mnJycoKShnZqUk5WUiX13cGtlYmhxb3F7hYqAdXBucXRwhbPDvsXR0NfW1tLWztTW19TT0dPU1NPP0sPQ09bY1dbSy8nO0cvGzdLK0tXW2dbX09fYztLKz9HMz9DM09C/yMfKxMzMzM7PxcbHtr/Kv9LNzNDGycjAxMPIzs3Q0c/NysjNuLe7qJ+lq6efmJ6jnp2qpa2pqKiSlYiQhIyRho2MiJOVmZCWjJiSj4aHjIR8eHN2cGNgZHJiXVJcSUpHQUVJSj47QTg9NTU4Njs4NTo8QD07Pjw7OUA7OTo8Ozs8Nz09Ozo+Oz08Pjw/Ojo8Ozs5Oz89OTU7PD48PD0/Pz46O0BCOzk/OTg7PT0+PzxBQEQ8hqugnKegp6Oim6CbqaSlqaCfoaGmn6ifmKSimqmmoqarmqOwsamotdDU19rSx8bLtLXBxbG1qKGkpaCioFlJQEFEQUZRd7Kvp5qUl5+cmqCgnpucmZWJd2ljYF9fYF9eX19dYmx1dHBwb2xycXWSxMjG1NbX19fT1tDV1NrU1M7P1dTU0dHM0M3T19bT1dDP0tPRydPRyNDX19jR19LY2dTWzM/Pys3Sy87QwMbCyMbOztHR0sjLzcDKzMbTz8zOyMXKx8fIzMrU1NHVz9LM08K5xbGlqLWup5uorKWdsqiws6ysk4+TjoiKj4OPi4SQjpmNk4+Zj4+ChYx8enFzdG1hY2ltX1ZQX0pKQ0ZDUk0/PD40Mzo9NTI4NTU8PEA8Ozw6OTpAOjg7Oj46PTg+Ojo8QD08OTs9Pzk6Pz07PTw9PTo2PD0/QD08PT0+OjxAQjs5PDc0Oj48Pz89RkFEPYKknKClnaWlo5mcnaSeo6OfnZ+doJqnnpyhqZ+vraqqq52lrreoq7fX1NXZ2dHO0L+8zMm2vq6mqqiho6plQzg9PkRYgqqon5eVl5manJ+dmJyckn1wZWNiX19hX15hYF9gYF9gZm1wcG5rb3J3d5zMwdLV09jY1tnR0tLXz9POy9LN1dTRys/M09bS0dbNz9XV0cXR1MrQ1NXWztLQ2NjX18vIzsTJz8zKzMDJwMjKzc7Qy9DNzszOz8jL0NDLzsrCycfJzMvM0tPN09HR0NDKvci5sK67ubWrtrCtqLits767sZqPoJSRjo2IjpCFkY2ZjJGRlY6RgIWIenZvcG9rYWRucGFXXFpJRkZETVhFO0A9MzM8PDg3ODY1Oz5APTk8PDg8Pjk8QDtAOj04Pjk4Oj88PTg7PkI6Oj08OkE9PTw6Nj08P0A9PDs9Pjg7QEE9Ojw4ODs+PD4+OkVCRT6Bn5mlp6Cfo6eam5+cl56eoZqdmpyappufpKefuLa1taylrK6+tLDA2NLX2tzWzs3Kw9LPwcCwqaytqaSxeUhGQjtXjqGblZOWm56enpyTlpeUiGteXl5hZGJgYGBhYGBhXl9fXlxibXJvb3N0dnZ5pL/M1dHW1NPY1s7O08vOzsXOytLSz8fOzc3UzM7TzcvX1tDM0dTLzNDS08rO0dXS1dXKwMrCxczCyMnDzMPFyMrLz8rNzdDO08zGyc/NyMfLxcbBxsrMzdDRxtDOzs3M0MXHwbi5vcPCvcO5srK+sbvDw7WqmKWhmJaSlZWSi5SNmpGUlI+PlYKJhnlxcmttZ2BgcGhZWGhWTUdMSVBRQjtDPjs2ODo4Ojo1Nz09QTs6PD05PD05PT06Pjo8ODs9OTtAPD47Pj5BPDk9Pj1CPTs3NzU/PDw/PDw7PDw4O0FAPDo8OTs7Ozw9QTpFQUU+hJ6bqK2epKSqnJ6fmJKXm5+am56ZmaKVoamppcTCwb+7tbKxx8K4y9XV2drb2MzMz8jW1cTCta+0qJ+tl3hscHJ7kZqNjJeVkJORkZWWlZCLfGVhYmJgXV5hY2JgX19gYWFgX11bXWdycXFyc3Btcnmlx9PPy9DQ09TKxcnJxsa/w8XPzsfFx83K0sjLzs7G0dLQzczUysfLzs/Hx8/Sy9DPxrrEv8bJvcLHyc7EwsfAx83IxMzKzM/IxMTQyMbCxsjEv8HHzMzMz8LKy8nHy9DExce7x8PJycLPwb28v7DByca5vaqwsqelnaKcmJCbkKOZl5mRlZiJj4J3b3Rka2BeZnBhW1dgR0hIR0lNVEc/Sj02NDM1NT09NDg9PT06Oz08OTo7OT89OTw7PDg6PDo6QD1APD09Pjw6Qz48Pz04ODk6QD4/Pjw7Ozs7ODo+Pzw7Ojc5PD49Oz49RkFDPYOgm6qupa6qq5qdoJeUjpedmpmgmpqcm6WysazJzcrIxL69uc3MxtDV1dna29jQyc/P0dPIwra7u62jtn1og4Wkq5SOjZaPhYODg4F9hIR+c19bXl5eYF5gY2RjX1xdXl9gYF9bWlxha3Jyb29rbG9vfbnRyMnKz8vNxLrAw7u7urq+ycbCw8DDyMrJyMrIwcXMxsjLzcnEwsrJwcHL0MXLyL+5wbvGx76/xs/Lw7/Du8nHybvIx8XKwL7Cy8bFxL7GvbzAw8XMxcW8wMnDxcfSxcHJv8rJxsjG0MPDxsOvxMvHw8q3v7y6tKmspKWYn5iso6Gmm6Ogm5V7d3J0ZmlaYW5tWlxYUkRMRkJHRExERlNANTQzMzQ/PDM6PDw7OTw8PDg7PTtBPTo8Ojs3Oz05Oz07PTs6OD4+PEI+Oz88OTk7Pz07QD48Ozk5OTk6Oz06PDo2OTw+PDs+O0NCRD5/pZypsqm0rrCdnp6YnImUm5man6Kfmp2ov7i8ys/RzMfCw8bNzs7M1c/V2djZz8vSzc3OyMG1w76xr7ZsXnl9opGLkpaGeoCFhX92eHVycF9aW11gYGJjZGRlZGBbXF1dX15gW1laXGJvcm9raWxwb3OPx73KxcvAxsKwtrqysrOyscK8vLy6uMHBwcS+vbm9v7nEysXGwr3GwLi7w8m/wcm7t7u7xsO/vMHNw8a+vrXBvcO7vca7w7qzvMXEwsO3v7W2vr+7zMO8tbrIur++y8PBxsLFycfJxtDGwszHssfJw87MwcXDv72yt7Cyp6ioubClrbCqrayUenZ3amRnYGhvY1ZeWUpGSkVHS0FFQkZKQDk6NjQ3ODU0Ozo7PDk8PDs5Ozk6QD46Ojw6Nzo7Nzo7Oz88OjxAPUA/PT8/Oz07O0A8Pj4+Ojk5ODk3ODo8PDw7OTo8Pjs7PjpAQEU+fqygrLWqt7SyoZ6fl5qNlJaan52mop2et8XCxMjO0srKysfNzc7RyNDG1dTW183KzsXJxcfBucW9q62lX2R1hJOLiIuEeH+Ghn9+hHt0dGNcXF1eYGBiY2FhZGViXVxbXF5cXl1aW1xeaHNxbWdnbm9yeZ29zMDDusC4rbCxp6qtrKe4tLa0s7O0u7W+sbawta+yvMK8wcS8wLu1srq+wLjHubS7tsHCvbe8xsHDvLWusrW6v7TEt7u1q7i9vsC9sbq2sLa6s8W8tq67v7W3tMW8vsLFwMPFxsfLxcDFxrvHy8DPycfDxsHDt8O9vba5vse/rLW7tbe2jnl0eGdnZWJrbl5WXmBGS0hISkZCREFFRT88OjU2NTYzMzs6Oz06Ozs6Oz44PEE9PDo7ODc5OTk7PDo+Ozk+Pz1APz5CQD1AOjo+Oz89PTk6Ojo4NTY7PT48PDo7OT49OT86PEBAPIi3pauzsby8sa2foJmUlJiXnqujr6qnpMbLzcjFyM3M0MzNyMrIysnKxNDN0s/NxcfBxsC/urfJtqqwmFtob4qPhYiJenh+hoZ3d4F8c2hdXV1dX2BfYGRhXmNlY19fXFteXF1eWltbXV9scG5oZmtubnJ8pMfAuLi1sKutp56iqaeeqqyzraqsqbSut7Gzqa6mrLO8urbDubq6sau1ubuzwrqwwLG+vLy2vMe5wretqqiwssC2uL2wsaixs7W7vKuutaautq+7srCqubCtu667uLvAwL65w7/Gw8XBvMbCyMq4xcfFv8fDw7rExsK7xsnMy7O5wr27s4lzdnZraWFibGhZV1dbQUxLTUpFQUM/RkE6OTo5OTU3NTQ6Ojk7PD07Ojs+ODtAPD05Ojc5Pjk7PDo4Ozs6Pj45QT0/QD87Pjo7PDo9PDw4OTg5NzY4PDw9Ozw6Ojs+PTs/Ozs+QDyKwKuouLe5w62zqZ2ZlJaZoZymsLWxt6bFztLLw8XBxc/HzcHDxr/ExMPDysLJyr/AvMK6s7S1w66psJFban+Sh46Pe3h9iYV6e4SAd25eXVxcXV9gX19kY2JkY2JgX11aW1paXVpaWVpcZW5vaGZnaWtucoGturC1rqWkp6eaoKSgmpylq62kqKKrqqyrsKOmn6qttbaxvbmvt7Corri0tLy4tLyvuLm1srzAssCvpaijq7Gys6i9qquoq6yttLOmqK6hpK+psqanqK6lqLetsbK3urq7sry+vr7Ev7XCwcfIt76/xbfEw7+7v8TCvsTIzMq/v8PAwKmHc3RyamldYW9jV1ZYUEhZUlNLRkZFPj5AOjc4OTc3NjQzNzo5OTo8Ozs8PDc7PTs7Ozw4OT44PTs8Njo9Oz89N0E+P0A/Ojw8Oj05Ojs6Nzc3ODg3OTw7PDs5Ozo8OTc5Pjw+P0E7jMKvrry3ucSwtrCbmZWcmKqpsLGztb2vxdDPzMPIurrLwcu+u8m2vcO+usq3wcPBtLa8trGvtbutqKuSZG2Ig4eLgHp9f354dH58c3dlX11cXF5fYF5fY2NhYmBhX15dXFpYWVtbWVhaXF9ma2ZkZ2Voam9yhaqlrKWenKGklJ2km5eRoaOpo6Ofpaanpq2gnZykpqyysLa3p7GtqKq1q7S5sba2rra5srC6urG2paCkn6axp6uouaqkp6eop7KtoKemn5ukpqyen6ejoKGxra2ssrSztLC1vba7wcCyur7DwbG5ucKzwb7Atbi8vb68wsfEw8S/wMSgg3hwbGJmX2tvYFVZXkhOZ09UR0ZLRjw9Pz06Ozs4MjU1MzY5OTk7OTo6PDo3PD88PDs8ODg8OTw6Ozc4Ojo8OTg+Oj89OTg8Ojs9Ojc3NzY3ODg2NjY7Ojo7OTo7PDg1OTw6Pj5AO43ItbW9uLrAur22oJ6UnaGmurars7O7s8TPycvCxri2x8DMv7jJt7vFuLPEuLO/wKy1vLKspa+zraGjkmlyhoWGgHx4dXNvbWpqaXBpXmBdXFxcXl9fYWNiYGBgYF1cW1xcWFlYWFhWWFteX2RjYmVnZ2drbW+HnamflZWaoZabopiVjZ6hoqecoJ+kpaKnnpujm6CrsK2xtaSpqqqsrKS0uK23sKyzta6zta6wqp+en6OisqSmqbitoqamoKisq5mgn56ZnZ+lmpmjnJuesKmrp6urrK2wsrivuLm6sLa8u7qrs7K5s760trKxtrW/tr7AvcPCu7q9l4R6c2tfZV5kZFhUV11JV1xLUEdKSkdBPD8/QDs/PDA0NTM1Ojs5Ozg5OTw8Nz4/Oz07Ozg4PDg5ODw3ODo7Ozo7Pzo9Ozc4PDo9PDc0Nzc2NzU3NDY2Ozc5Ojs6ODo5ODo7OTo8PzuJyba4vru3wcHBtKSkmZqkpsCyr7astLfGz8jIwMa7u8PDz766x7i4v7eywrSxu7yrubqxop6pq6eYnpBtfoWGf3hybW9ta2JeYWZmXV1eXV1dXF1fYGFiY2NiYV9cW1taWllYWFdXV1hYWFpeYmRkZWZmaGlrcYyonJOUlJqXmqGWlpCboqGonpydpaeipZygoZuZr66ur7KhpaOuq6eitbCysqyor7OnurOmtqCinpyjoa2joqq2q6Ojpp6lpqOWmZ2XmZudoJqXnZydnK2iq6eko6atq7KzqrWwsquyubSvqq+ysrO4s66prK6yuLC6trq9wLizsZSFenVmXmVeW1lWU1pVS1tRS0lFSEtJQj0/QUFAQToyNDUyNDk5ODk7OTo9PDY9Pzs8Pjs3Ozs3Nzc+Njo+Ozo4Oj07PD06Ozw6PTs4Nzk3NDY1NTQ2Nzg1Ojo4Ojk5PDg3Ojg5PkA6gci9t72/tr68v7KdpaOYpbHCtba9rbS4wszIxr/FtsHAxs63wMS9s7m5s7+2sbm7rLK0r5+apKqglJqPeH+DhH94b3F0cWhlY2hkY1xcW1tdXVxbXmBhXl9fYF5cW1pcWllYVldXVlhXWFdWV2FkZWNkZWRkaGp2oZuTk4+Ulpafl5mUl6CeoZyWoKGppJ+fqZ2bm6unr7Crm6OkuKqhoK6otqqnp62xpLiwpLegopuZmaqmoZqsua+ioaScop+gk5ShlJaWm5iXlpeclZ+qnqmkop2jqqqwrai0q6qnrbOwpauus7GwsK6vp6iosq2xtLC8tLq4rqOUgXp2ZF5hVllYU1JTS01eTE9LR0dMTEU9QT48Qjw7NzY1MzQ5ODg5OTo5Pjo4Pj47PTw8Nz49Njc2PTc7PTs5Nzk7Ozw+OTk6Ozo4Njc2NTQ1MzEwNDU2Nzk6ODo5Ojo3Ojs5OT1AOnbAvLS5wrG+uLyunaenoqq7wL3Aua60uMHMx8XCw73FuMjLssHCwa28u7W7vLW5ubCvsKqcmaGplJGKi4CAfHdxaWxydHBoaGVkZmJcXFpZWlxcXF1eXVxbXF5cW1xZW1taWFZXV1ZXWFdXV1ZbYmNiYmNiY2RmaYGVkpSLkZOUmpiclZacoJyflqCfp6akpqefnaCmoKqvpp+io7eooaGiqLOipailsKWwrqy0nqGdlZWpoaKUrbGxn6OjnZ6Ym5OLoZSRk5iYk5eXmZeep5ynoaKapKWlq6SlsKelo6urraaprq+vq6iqqrOmpqyvtLGuvLWxr6+gknp3cmVhXFpdWE5MUUdRYU1WUE9KTU9FQkQ/OT02OTo3NjQ1OTk7OTg4Nzs4OT0+Oz47PDY5Ojc7Njs3Ozs6ODU6Ozo7OzY8Ozg4NDc3NjMzMjEuLzI1NTY7Ojg7Nzg3Njw7Ojs7QTh4u7uxtb2wu7G3rJ6lpqy4u7zBxbqxubXEycnAw8bFx7bFxLLCv8Wrt7e9tr26urWyq62omZifo4uJdImIfnZuY2FmaWhmZ2lmam1gXVxbWlpaWlxdXFtcXl9cWllbWVlaW1dVWFdUVFZVUlRSVWBgX2BhX2FhY2VpgJKSiJCOk5KTnJSVlqOZoJedoKWiraalpaOko52qq6Wan6WxqqChnqWqnqiinq2sqamuraKiopWXopuckKupsJyfop+el5mTip6RjZKTlpCYmJOcoaOdpKGilaChpKWbo6uloqSqo6uupa6yqaalpqa0pqmorbO1tLm6sKqsnoxycG9gW1dWVVJGUU5IWVtPUklUS1NMRUZJRDg7Oz08ODY2Nzo5Ozo5NzY5Nzc6Ozo9PDw2Ozw4PjU5ODo4ODY1OTo7PDk3Pzw5Njc4NDUyMTIxLi4xNDI2Ojg2OTg1OTg5ODk7OUA5e7W0rbS7srCrsq2dqKevubmzwMi6tcCvxcjMusHKzMi1ybyxvsPIrLG4wbW8wLu0tKqsppWam5yIgXKIg3t0aWlqbGdqa21ramxlXVxcW1tcWlhaXVtbXmBgXFhYWllYV1hXVFZWVVRVVVJSTlFZXVxdXV5fX19iZG2NjoOQho+QjpmTlJKcmqOcm6GpqauorKeppqSZpa+llZmlr6mgnJmboJ6vmZyrs6Clpp+jpKGUk5uWlpKpqq2anJ+hoJuUkIyZjoyRjJKNlpWQnqKgo52bo5WboKOhl6Goo6Ooq6CrsKStt6ajpKKsraqoq6+zt7O+tbOrr5iFdHNoW1hZU1VSRVhMUVtYTVROUExQUUlOSUI9Pz9BPz03NTc5OTw8OTc3Ojc5Ojs8PT47Nzs7Oj02Nzo7ODk3Njk4OTo2Oj05OTU3NzU3MTE0MS0rLzQzNDk4ODo6ODo6NzQ4PTg/OX6zraeztq6oqK+um6morLe2rLzKu7a/rMvGxbjBzs/Is8S6t7vCyLCtuL+3vL27s7WlqaCWl5iXh3p0gHZ3bm1obW1tcGdnaWZkXVpbW1tbXFtZWltcXF5fX1xYWFlYV1hXVlVUU1VWVVVTU05QUVlaWlpdXVxeX2BkfYuAin6Kj4mSjZeRl5mioJugq6qmr6yosKWpmp+toJWWpKmnnZiQj5qerpeYqKqZn52UpaGekpGSkZOVp6qlmpmZnp6WjYyLk4aIjYOPi5KVkaCeoaSYlZ+VmqGinpSbpaWoqKigsbCmsb2on6OstKqup7C1sLm1wLGusaqRfnJzYlZUVU5SSkdWUFJRTExXTUpMTlJHTUtBQ0ZEQz5BNzU4ODk7OTo3Ojo3PD06O0A+Ojk7OTo/NzU5Ojk4NzY5NTg3Nzk7ODU1NzY2NjEzMjAtKi4xMDI4Nzc7OTk7ODk0ODs4QDh/s6ylsbeqpaKxq52qp6mysaS2xrS5urPKxbm6wcvQyrG2t7y9wcOxr7G3rbS0u7O0oqOcnZeXlIOAdmtnbG5xbnFqcGtkZWdlXlpZWllaWlpaWlpaXFxdXFpYWFhZWVdYV1VVVFJTVVNWVVJOTk5SV1hZWVlZXFxdYWp/eX90iIyGkImXiZSTmJuYnqmboKumpqyeqJqgppyTj5+jmpeXhYSSm6OQlaOdlpaWiKKbm5OLjoqQmqSnnJWVl5uRkoeUjouBi46AkIuSkpKgmqCilpSYmJWippmNmaSmqKahoLSyp7K3oZyitqypraSysqa1vLWrq7GjiXlzbl1OUVFMT0NNTk5QS0ZOTkpKTU5RSE1KQUdLSEhDPjg1ODg4OTo7Njk6Njg7OTk+PDg6Pjk7Pzg3ODk6ODg2ODU3Njg4OTc0NTc3ODIwMzAxKyktLzEyODc2Ojk5OTk4NDk4OEE3d7ampLawpaekqqWgqKals6qissO1tbKzxsa2usPKzMazrLm9tLfAr62psJ6mrrqvrp+Zmp2VlId7g25fX2ZycHVxaW5pZWdoal9YWFhYWFlZWVpaWVtbXFxZWFhXWVlYVVZSU1JQUVRRU1VRTU1LTFNXV1ZYWFhYW11hbnF1b4OHgYiAkYSOipSRk56hj5uco6KkmaWXopyVjYeZmoxzjYN+jpeWhpGakJSOjnuZj52Mgol/ipifo56Qk5iWhY2ClH5+c4mOepCHk5CQnJuampGWkJ2Oo6OOiZqgoaOkm6K0r6yvrZ+YpbimprGhsK6csLyqqa+qmYN3c2NWTVJPUE5DU05MUExCUFFISU1STUhKSkRKTEZKSz03NDk4ODg7OzY5Ozc6PDk6Ojs3OT85PkA3OTo8ODk3NjQ0NDU4NzQzMTI1ODUvMDEwMikoLC0wMjc2NDc4OTo6NjU6ODdBN3i3oaO0qaalqKOmpaamprOnpbTBuLC0sMnEt7nBzsa9s6y6waytw62noaaSnaa2rKOgj5WWko9+eH5mV1ZfZ2ZpZ2huY2poZ2JcWFdYWFhZWVlZWVlaW1tbWVlZVldXV1NUUE5QTk9PUFNUUk1NSkhOU1NTVFVVVllbXWlqcWt+hHtzTlhyj4KXho2cl4uUkZ+YnZWUlpWPlomAlIlfO1ZvfIyUiYCMkoyQhoZzioWXgXmBe4aTnZODlY6RkIOGfZN4cXCFjH2JgZGNj5eamJOLkImdiJ+Yh4iWnpqhoJenrqmtqKiel62zoqatmayrmKi0oqmto5N+dG5fW05TUldMRFRKUExMRk5PSUVMUU1LT0pJTFBGSUk9NzU5OTk5OTo3Ojs6Pj44Oj09Nzo/OD4/NTg5Ozc5Njc1MzMzNzYwLi0vMzQ0MTEwLy8oKSsrLTM4NTQ3Nzk8Ojc5Ozg2QTl5t6CjrqGmpqqgp6mno6mwqKe0wrmwtbDHwrezvc+/ua+utcKnqsWpo52Yg5ScsaKamIaUj4uHfXN1XVBMUVVZWlddXmJnY19ZV1dXWFhYWVpZWFlYWVpaWllYWFZXV1VTUk5MS0hHYlxNT1JNS0hGSE5RUU1QUlRWWFpgbG5oeoF0T0I/f5WSkX2IlI2Eio2bjpaViZKIhpWGeYl/YEpRbniLkoR9hI2KhX9/bn5/lHh1dniEjZlvUY2IioZ7fniUdmd3hoh+iomWi46RkpaMg4mIlYSbjYKEkpqWnp2UpKOoqaWknpuwqqGkpJGmqpaiqpyipqiJdW1mXltIUVFTTUlVTVNJTEtPSUhGSk5MTVRLUVBPRklDPDc2OTo4Ojs7ODo7OD4/OTk+PTg7PDY7OzQ3ODs2Nzc1MzQ0Njk2LzMvLjEyNTIyMS8sJykrKiw0ODMzOTc5Ojk5Ojo6Oj85d7aco6edn6Gvoaeopaeor62qtby2t7ezwbu2qLrIuLaoqLW2qrK9pp6VjX+Jk6iWlYp+joOCfXhwblhNS01NTkxNUVdbXFpYWlVVVlZWV1lZWFhZWFhZWVlaWFhWVldVU1BNSkVAQJtrc3NJTUtERERJTk9oWU5RU1RVWm6Dc3V+aWhcVI+JlIl0f4aBfIWMk4KSmouPe4aPgHaAeHNvdnB0jo6Ben6Kq4R5e2h2e45wcm14gYuNknh6gHuAdnNykndodYSEhIV7lYqIio2KgH+Ei42AlIR8gI+YlJyWkZ+dqZ6foJ2gqaWenZiMp6SSoKCWnp+kgHJoYV1dSldQUkhLWFJPSkxNUkpKSkxQSExRTFJUTUVIQTw3ODs5OT49Ojs8OThAPzo6Pj03PT03OTkzNzc4NTY3NTI1MTQ3Mi8yLiwvLzIwMC8tKygoKS4xMjcyMTk4Nzo4Nzc1Ojw7N3aumaOhmJyftKmvqaWtrLCxqr20sru4trq0sZ+3urKqnZ2sqaiysKGakY2UgY6cjpF/doZ4fHZvb2lYS0hJSEdFSEhQVFRUV1dTVFVVVVZXV1dYWFhYWFhYWVlXV1VWVVNQS0Y+OTNOPH6eTUhKREA9QURqlH5MT1FRU1ZedIJ7eGZ2jZaYjY59Z3mBdniAiZB9hJiSgXGHj3x3e29rfq19dJCLf3uGkoF8f3VmdnyFbG9nc3yJjIeAbHlxfXFtdo9xaHGBfo5wQ4uEgoOFf3d3eoyGfYx7dX2Oko+Yi5Kam6OWmZ2anZ6hnJaNiqSbjp6XjpaYkHdvbWZiWlhYVVFKU1VUT1BOUFZLTktOT0pRT0hOUExGRDw7Nzk7Ojo/PTk8Ojk5Pz87ODw9Nzw5OTk5MjY2ODU2NjMzNjExMjI0LiwsLS4uLTAtKyonJyouMTM2Mi84NzY5NjY1Mjc5OTV5ppegnpagpq+srquoqbGvsau8uKy7vrizrKebsKesm4+WnKWppKCXmY+FknmIjouKdXF7bXVwam1qWEtGR0VBQENESExMTVFSUFFTVFRUVVZWV1dYV1hZWVlZWVlWVlRTUUtENzhmNzA/qGlOSEM9OzpEioV6WkpOT1FUWF1lcHJsiKeqwH50eWJ7eG98eYmQen2Lhm9tjJJ5dHlqaoCCcZaRi4F+loBJkphuaHh+gm1pZGx5hZCShmtzbHxucnyGaW5wf3OMiYSGe31+e3ZvdHSFgnmBeXB8joyKk4OWl5iakJKWl5mXnZaMg4mekYuSjYaQloBuaW9vb1hWWFRSUVlPUlRUUlhVTE5ITUpNTktDSE1HRUA6ODk7OTk6Pjw5PDs6Oj0+Ojg6PDk/ODY4NzI3NTY1NTQxNDMyLzAyNCorKiotListKigqKCcsLTEyNTAsNTU2NzQ4NUhBODk1d5mRm5man6WtsKOtqqi1r66stL+rvMO/paKZlaSXno2Ei5ShoZmYkZOLc456gIaMhnRvdGtwbGRsallOREZDQDw+PkFGRkdLS0tNUFJSUlRUVFRWVldXWFlaWVlaV1ZUU1BMRTFAmjMganNDmW87PDk1PICChl9JTU9PUldaUVlcX6eIYpppc3llfnBtf3qLiXaCiIZ0bJqSdHN8amqdj015hZOJhI5nMXaGc2x+foN0ZmV1f4SEhYBmaWx1a3F/fGhxcXxuko2PfHN9fHFwbnVtgn53eXVqeYiCiImDlpKSkIuNkZSUjpeNgHmIl4iGioaAkIh3a2tvaGVYUVpXWVlbTVBVVllYTkhIRUpKSEdCQEdEQ0c9OTk4Ozk6OTw6OTs6OjpAPDk6PDk4Pjc4NzcxNTIzNDUzMzY0NTAzMS4qKispLCwrKykoKycpLCwyMjYsLDQ3NzU0NzhpTzg7NW6SiJqRmZajqK6esp6nuq+rsrDCsbvDx5qWj5SZi46GeYSQmJSNkIyPhnGHgnSHjIZ5cHJwb29kcGZfVEZJQz88Ozk6P0BBRENFR0lMT1FRUVFSU1RVVlZYWlpZWFZVVFNQS0U4MC9cYLNHOVhQOzk0NDGWuotITE1PT1FWTEFJUUlir7OgcXt4bH1scYOChYF6hIaGeXKhlXR4gHN1lIc1cZ2onY6hoYSihHZxhnyHfHSMrY6JgGdnYmpucm1wg3VpcFh1cI6bkndsf3p9bXJucIB7c3ZuYnaDf4aAhZCQioqJkYuRjIuOg3V4io6AfoOAfY97cnBwbGBbXV5cWVhgX1JOW1pYV0xISUZKRz5CQUJIP0NEPTs5Nz07Ojs7OTo5OTs6Pzw4OD06ODs2NjY1MTEyMTI1MzQ3NDUzMS4vLCwrKSopKSoqKikoKikrLzNETTIxNjY2NDM8dlI3PTdikoGSiJaRnaSnnq+VpbSprrGuwbK7wcaWkIyUj4CIfW6BkJKJg4qHj4Z1goRslYiIe3R4eGx3bndjaV5KUEc+QDc0NDk7Ozs9PkBCRUhMTExMTlBRUlRVVldYWVhWVVRTUExFPDUqnUtbQC1nSTk0Lz+Sg6muX0dMTU5QTDdDTVJTREqGdoB8fHZ+bHeIiHx+hYN/jH51opl5foaBhZmEmpxhhqqfnYuDkI16d4h+iYiOc4qXj4N6XWRydHp8d4ptaGpieW+GkIJ6boF3dIR6cHR5eGtuaV12h3yHfIeHjn+KkpeDjYWMhn1xhH+DfXV3e3yJd3BzdGZnYFtbXlRcZl5XUFRYW1VHSktES0c/RkBEQz5BQT07OTc8Ozs9PDo6OTk7Oz0+Nzk+OTk4NTY1MzI0NDAwNDY0NTU1NC0sKSsoJycnJigoKSkoKCsrKy8wMFVxPTIzMzMxRX5XND05XIx4ioCUjJGdnZ+mkaCqoLGor8CxusW6lo6RlId6hXZrf4yRgn2KhI+MeIOAc6CEinx8gX9wgH56Z3ZrUldMQEUyMTEzNjc2ODg6PD5BRUdGR0pLTU9RUVNUVVdWVlZUU1BNRkA6Mj0gI5ZjjFs1MzExaT9Hb0lGSUxNT1JMS1RdWVJKaISIe4l5fHF8j4x6fYmHfpeHdqGZiIePkpSljayqSIaur6+LgYCTioKLgoSSqYeAmJiKm3RtfYGGh32OaGdoeX9uhoeChXGEhkdsgHdyeXZobWtfdn2CiH+HhIt5lJ2ciYuIkX96dYt2fHhtb3d9f3R0cmxbXl1bY2NYZ2VcVVBQVllQRExLRk5JQ0ZDQ0BAQ0E9OTc4Ojo6Ozs6ODg4Ojo/PjY7Pjc1ODU3NzMzNDQyMzY2NTY3Njg7REZMTU1MQzcrIiUnKykrKywvMDArbnUyMjQyMEyBXDU9PF6EdHx+iYWIkY6Wl5KXoJ2soaa4r7O8s5eNkouYi310cH+Jkn59jIKSlH2Gfoakh4h/goiFeIeIfnOEeF9jV0tCNjAuLzIzMTIzNjY4Oj0+P0JFR0hKTE5RU1RVVFRWVVNRT0dDPzgwLCOHWz4/ODQuXZZwc6NVRklLTU5QV2BYcFlcXmmNk4eVgISChZGTfoWIkYGalYKhoZiVm5umrZOau7Gnu8fDqIuMoaWPlImBkXxxg56fkZx/doWFi5CIkGlob4OAdY2HhItxhYJ3h397doV9bnZ1ZoCUjoaJiIeIh6GropaJjph/eoKJenlvZ2t4fnp+c2xlXlpbXWpdYWZfWU9LTldSUUlQSkROR0NKREJBRERBOzo4Nz08Ojw6ODg3Nzg6PT04PD02ODY1NjYyMzQ0NDU3Njg2NzxCQj88ODo+Q1FeZVxHMicmLCwtLS4xKD+LWy4zMTBPg180PztudXBmeIN7gIx/gZCOipqbpJ2hrKarr7CXkZGEoZSEeHd/jJR8fpKFkpV/ioCSm46DgIGMioKJjYN/iX9tcGpdQkA0LS0vLy4vMDIyMzQ3Nzg7PT9CREhKTlFSU1JTU1RSUE9IREI8ODcvOUQ+PDw2My5sk5dNUEhJS0tLTlZfY39nZ211nZuPmpKTi42OmoiSj52LoKCSo6qlo6yTqbaiqMHDrseveLqUmnyNoZ6ZhJOFgo+hn5OYkoSLhY+akZZscHWJi4KWjI2Pd4+EcW2FgYqWkYOFiHKIoJaGkomOj5aktambjZWig4eTg31/a2prfICBgnNiXmRfW2drXGxsXldLR09SUU5MTEZJUENETUZBQ0VGQj06OTc9PDo7Ojk4Nzc2Nzs6Nj06Nzg1NDU2MzQ0NTY2NjY4NTU2MzEwLiosLCkoKS46UGFcQCwoLSsrMCwncog3MjQwT4RiM0A8dW5nWXCCcHWGcXaShn6XlpqVnp6cp6CplpOYnmdlpJp+hJKReX+SiJGSfYqEmJKRgoCAi4yJhpCGhIiFeHh+Z01SPi8uLiwvLi0vMDAwMjEyNDY3Oz9DRU5QUlRQUFFTUU5QSUVEPjs8OkNGPz48NzUyPD9SNUhISExMTU5SXm+KfHOBfaCdnKelopmhl6KUnJ6nnqirn6isqaq2l6u+q7bIyLfJ0c++m6Bwaaupn4STkoWcoZqbmaeRkYmWopqad3p+lJiSoZKWmIGUnnt3lZKrsoiNl599lJ2bjpKVmKSiprWwnZGZqIiWj42BiGxzcnx/fXFoX11hX2FnZGBnZltRRUpLUE9JSUxGRkxDSExGRkNCR0VBOjg1PDw4OTk5NzU2NTg+NzU9ODQ3NDU3NTQ1MzY5NTg6NjE2ODYzLzAuLSosLy4tJyMqO1hiQigqLDEtKEuXXjA2M1GFZjJBQGlhXlBwdWBufGF3jn17lI6Oip+Sl56Wm6qYnqpCRH2HiYeYjXiCjYqOjXyKho+QjoGCgImLioSShYOGiYGAhnZeYlA0NjAtMS8sLjAwLy8uLjAwMTU+QUFNUVJTUVJTVFJOU0xFRUA8Pj1HR0BBQDg2NjI8OTtGSEdJSk5PUVlthZB3lYqjp6q0vbikrqysp6i0q7C2srKtu7GzvZyzw6y7ycu3w7+4paOwsqytqqOLlpiFpqago5eBppmNoquopIiFlKShoKqgpKmPnLGLlaOnt7qboKOwkqKdo56Qo6Grr6yytaKUpKqImYmSipV5en2Ff2hhaFxlYl1kY15nZl9aT0RJSFNORkhMRkpHRUZIQUtGQ0ZGQTs4Nz08ODg6OTc0NjU4PDU0PDc2OjQ0NjQ0NzM5PDM4PDIwMjU1MS8xLi0qKi8sLSooKiYlNVhYLywwLCwwhIE4NzFQhWg1QUNbWFRMaWNXam9YeoV2gZOFiIKbg5KRjJLayJ2Wc1aXiI+InI98hoyOiop6h4KHkI6DhYGMhYaHkoaChImGiIeHcG5hQEU2NDwyLzExMC0sKy0xLi0zP0NBTVVRUlNVVVZVTltQR0dEPD4+RkhDREA4Ozw1Qzs9RktJR0hST1BXgZKghK6js6qywMfDqrPFtqyzv7O4vra/tMG2u7qjuMWotsnHtb65tKijtK2xsZuakpqfiaevq6WUdp+kl6GssrOYlqqtqK62u7K6rK+1orGssbW7t7WutaCnp6OomqmvrbK5t7inm7apjKWOkZOfhniCg3VaYmRWZmFhY19gZl9bVElERExVUUhJSkRJR0VBQEBKREJNRjw4Njc7PDk3Ojk4NjU1NTcxMTw4ODk1NDY2NDk3Pj0zODkxLjAxMjExMzAsKiwuLCsrKyooJyopRVowMCovK2iSTzYwUodqNkFGV1FKTFtaUWJjV3l1cYGUfYSGknWFf4CMe7+7o7yCtJSTjZuPhIiPkomIeYaAjJKMh4WBjn+BiY6GgIaJhYqHkXp4bl1WQEVNPDY6NDZBQjc2NC8vNkNIQ1FcT1FVV1VcVk9eVUlLSkFAPkdLRkVEOz5AN0Q3P0JKSkVGV1RQXo+kraOxtMK2uMHMyba7xL2zs8C3t8G1vq+3dLGzpbrFo7DGubGzsbSopLW2qrGgopaaopKlsK2mraunpJigrLS7oqmyurS7vsy/xcW9vbPCt7q4vre6t7msrLCmsKqtvbC9u8LCrJm6qJSuj5eYq4l9gn1rV2NiWWplamVXW2NZVlNJR0ZMUUdDSElBSEQ+P0JCS0BATUM5OTY2OTo/Njo5OTY2MjQ2LzE5NTk5MzY0NjI3Oz0/NjoxLi81ODo5NjUwKigsLS0tLCwqKCgrKyhFUy8qMDBKj2s1MlCHbTY/RlJMQUxSV1NZVVp2anB+joSBjYNuenN5h2K4oZmjiZWTlpOUk42QlpKHhnuGgY2VioGEgYp6fIqHhnyKg4GKg5V9d3l1ZU9cZEdFTDpRY2FbXlNGPztIUERbY1FSWVhaZ1lUYGBNU1BFQT9JSkhFRkFAQzxFNkI+SEdKTFNaVF2Tr7i1urjJv7q9ycy7vMC8t7W7u7a9tLqxxmB1sqWxmp6qvaqlqKuqo6KytaGrqJ6Vlp+Zn66lp6aln6OUoqextKeys722wb7TycnTxsLFzMLKw8C+vb+7vLe0r7i3tsO6xr3DyLCeuamhq46kp7aJgH9yYGJiXlhhX2lnUlhgVlFVSUVFTktBPkdEPUtBPUJAPUY+O0hANzk2Mzc5PjQ4OTo1NzA0NS8yNjM4OTM3NDQyNj84QD5HS1JUU1FQT1FRUEpBOS8sLCwqKygoLC0sL1A+KC40OIB9PDJLiHE5PkNLRUBJTVBSS1FdZ2xrcI+NhY9zbHJyc4fVwLWZoI2VmJmRjpeSlpaOhod9hoOMlot/g3+DeHuLg4d7i3mBioKXf3R9emtlcHVZXVxQZWViYGVkXVtYV1xNZW1VUm1tX25fWGdlVVlVSkRCS0tIRkhISEdCSTlEP0hLVFRWXFpbkrnAuL23xsC7ucrKura6tri5sre1tK62tplkdaicrXBeoa2cmKCim6SeqqWUoJ+QlI6WmJeon6Wfnpqag6SdrKWqsK23sL251NHP18/JzNLMz87KxsC/wsq9wbzBwMTExcq/yM6zpLuwtK+bq7i8mX96bF5hXFldYVpjY1FcYFNQS0NCRUZFPEBFPkFIQUBEPTpFPj1KPzQ3NTM1Oz00Njg5NzcwMjIvMjQxNjk3NzU1NTVEM0VMTT41MS8wMDY6NDc3QElPSTstJioqKC0uLyxATSsvNTRtiUkwSIl0Pz5CREBDREZLT0RRXFloX2+XkpCUbmxvdXWHs6yhoZ+LmZyZjI2VkZuShYqKfoiGjJCLiHyBhHN7ioOFe4l0gYmGlX9ze3hrbXV7aHJlaWxpZmppaGBmaWhsWm50lq2kvIiHZ1tvaF1aWlRIS05PSktQS1NRSExBSkZLUF9eYmZpYpi3x7C4s7u9tbHExrWwubCwu6uysaeqt6yNtaedm6eaT5qdjI6flZGmmKWVipOTiZCJj5GRnpuhl5qVloaemqebrK+osKeztNTU1NbSy9DU1c3Tz83FwsnQvsrJysnRx8zNwtDSuLDDvMS5pba6w6KCb2RdXV5ZYFhZZVpRXVdPT0JCR0RCSDtBQz5BRz8/QTg7RD5ASD00NjY1NTs6Njg3NjU0LzEwMTQ2Mjc4ODc1MzY3QzVCOD8tMC0xMzQ5PTk3LC4sMTtGSz0pLCguMDAwN0s/LTQ2VIhXMESHd0M7Qj5FQkFDSk0/VVlTZVZzkJCYgmhxb3l5g6CqnqWXjJubl4uNlZGajn2Ji4SOioqLkId7hIJwf4iBhnuHcoORi499cXh1a3F4fnF7bXhzbGmBcG1jaW1weGl3fH7Lv8Lfp25jd29jW2FgSlBSVU5ZXlBdXE5QTlRRVVRbbm12gnGWrbiss6ewtqqsvMCwq7WmpLimq66gq7SjjrGtmpiYjJGTkYSOm4GNppGciYOLhIqJhIuDk5WXlpObkZyYmZmfnquspKeirK3P0tXRzczS09PQ1NHOyMPU0cfN0tPT183S0cXS1sXAzsfHwqi+t8+eem9mXmJeV19TXVpPUFRQTkg+QEZBQkU8QEI+RUQ+Pz86PT08PEpBNDU0NjU8ODg4NjY0NDEyLzAzNTI2NzY4NTMzOz08RT1AMTErLzI0OT41OTAxMDIyLTJETjMpLzMuMzI9TjIzOEN9XzJBhnREOj09ST5AQ0ZIPFZSTU5bdYaFindsd3B9fn+hnp6gi4yZk5OMi5OPloR5hY+QjYuKiJGHf4J7cn6AgYd5hHWFkpGJf292cmtzfHx3e3OBd3FrgHNyaXBxenlyer7Lmn6MsoR2coR3aGFqXUNaWltWZWNYZGpTWF1cYGReY3d6fouBmamkpKGfoKilqrC4qqW0o6GtoaOtoaexn4mmmpOSkYmRj4iBlIlqlaKMmYSAhX2Rg4OTlq2LlY2Vmo6GkpGdl6ewoaChpaSoyM7PyMLL0dTR1NPO083G1tPM1NjW1tjU19XJ1NrNydfX0cqsw8PLjHNvY2BfWFRZU1xQS0dKSkpAOzo7REFEPEJDPkhCPkJCOzs5PDpHQjQ2NTQ0PDU2ODc1NDMyNTAvMjU0Njc0NTU0NDw+PUU/QTYyLy0xNjs9MDgxLzI1NC8tLTtSMDE3LzUzMkZEMjg+bmI1PYF0TTk5QEk8QUQ/QTtQTEZLWXCAdX1oc3hygomAnZWdlIWLlomPioiOh49/d4OTmYqNiIiLiX6DeHN7fYOId396h5GWgINueHBtdX92eH10hXx5bYd2dG59doR1eHydtYw8QYvFpX6MfGllVklDZmNlY2dqZG54W19maGtuaW6Ag4iRi52eoJ2Ql5ifo6SmsqOks6ChpZ2gqaCisZyGnpKSkpCLjouGg4+EfpybjI2DhIV6lH6CqZWjjJKKl5KLfZeKmpGrs5iam6ecp73Dxrm2xs3S0NLQy9LLydTO0dXa19fY1NnYzdjbzsna2tLVvsvMtHh3b2VdWlJWUVpXRkdKSUVFPTo3OUBBQjlHREBFQ0FEQjs/Ozs3REM3NTY1NTswNjg5NDQzMzQxMDE0NTU4NzQ0NDQ5QD5EQkM8MzMuNkZUV09RSkFKRj8xKiguQlMzOTI1NC83Szc1PGBiQTxzdlY4N0FIOj9DPjw5UUVDSlRrbm5wYnBxdIaNfJeRnYt+h5KCiYaFiYGHfHiFlpaIj4OHhYd6hHlxenuEhnV6hY6NnHqMcHxvb3p/cXyBcYOHgG6OenV3fXyCdX97hoewdFipwraNkYJwbmI9XmhycHFwbnh2gWVpb3J1eHF6i4eOk5GblaCVh4yTm6Cbn6qfoK2coZqZn6Wen6uZi5qMkJGNhH2Ih4OFi46fmZOIhId+bZl5hJiGiJOMjZSMhnubiJSPrqqUlZefmaeutb2prb3Gy8jJzMvPycPRytTX2dfY19Tb19PZ29bP29rR1snUy5V6e2loXFpQU1RdSENFSUg+QT09Nzo9Pzs9Rz0/QUFBREE+Pjo4NkRCNzU1NDc5LjU2NjQzNTUzMjMyMzY0NzU1MzQ1N0VCRENFQjU2PEZOU01bbmZjbnNrYVY+LDRMRzg2NTQzNEJGND1XX2hMdXheODs/Rjw8Qjw6OkQ/Q0dSa19tZGJma3aAiHGRkJqAeoCNfoKCgYR+g3x8hJiOh4t+hoaAd4J5bnt7hoF1epKejaB2jnWCdHWBfXSAhG+Bj4FvkoR0fICFenaGe4m3xqXCybiClpuPd3BlTmZjgXqBd4aikIp4eXZ7g397hHVtk5aUlY+XkIOJj5eal5alnJegl5+SkpejnZmrlZCQio2RgoyFiYiBhpCRnpyZiYWLgYaYeoiIn5ePiI2KjIJ8oYmQi7yhmJOXmpyppqWun6i2v8DAucfJzc7FzcrR1tXV2dXX29TX2drb19va2tjO3MaHfHpoaWVgVFhWVU1MRE5DOz08PDk6PD45PUA2PT9APD8+PDk4NjdDQTY0NTU9ODA2NjU1NDc3NDU2MTM4NTQ1NjQ1NjdISD1ESkU3OTI1O0g+Ozo6N0lQXVpSVVhLOVQ+Ozk1MzI3STg9TllNSHh4ZDU9PkM9PUA6Njo+PkBFUV9ZZWFdW2h0enlsiY2Sd3Z6int+gH5/fIV7foGRiYSFeoSHe3V9dG18fYZ+c36SnZGeg5F8hn54jn15iopugpqAdJiFfYGIhXt9kHqPqY6Pw6C8jJyjnH2JhH2JcoyKfnOmmpyYk4V7jpCIhGhHcKCknYyLkJKFiYqRkpWPnJqSlJGWjYuVn52UoJSRjY2Qi36Qjo6LhImSlpqfn4mMlJKdkYKLf6WZiISNg4WEgaWHi4u4mJ2RlJaip6Gdnp2jr7a6tazAxcrQyMfMz9PS0tjS1dfA19jZ29ja2tnZ19u4eXl5bWpmV2BcVFBPSENMQj09Pjk5Ojo5OTs8Nj8+Pjw9OTo7OzM3RD84Mzc4PjcwNjg4MzU3PDM3ODA0OTc2NzU1NTQ2RlA1RE5JODkzOEFLPTszQ0BJPDlEV048TVRITj85NjMzMz5DO1tYPjVZeXBaPDxBPD0+ODU4OT89RFJTUlheVVhmbW1taYGOinFyeYp7en98f3uIenx7i4eCfnWDhXlzenNtgH6EfXeFm6GbnZSSgIuIf5iHgJuSboeohXqgi3yRjoKIg5x9mpGKjKOin5CkrqCLkYuFi4GShldyrYufq5uPg5ibj4+NW4KikYKMn5OVjIeIjJKSjJSUlI+Mj4qHlpudj5WWkYuSk4WAi4iSjYqKnZaZoqKGkp2WoIqJiI2ckIOIj3+Dh4WkhoyQs5idkpSXoaGemZKcnaeyuKymvcLHzsfGz8zQzM7X0NHUrtbV2NrY2trX1tnZn3F+dWhnXl1YVFdYQ0BIQz4+Pjo0OTo7Nzo7OjM7Oz88Pjc7OToxOkg+OjM3PUA1MDY3NzI1NT82NTs1NTg1ODo1NzczNUhSN0dPSzk5ND1FSkI+MUZDTEI5ODpHWEA1SFdJNjYyMjM6RUNlWD8mX3lpX3o+Pjk8Ozk4OjtAO0JRS0tTWVBUY2J4bWJ+koNvbXeLeHl/eoF8hnt7d4aEf3NwhYJ6dXZ2dISDhX1/kqajn6Wilomdj5SXi4qol3KKsYyEp5GEmZOFmYyilqCYk4mbnaKSqa+fkZSQjY6IlYtujbeFmsTIspyhpZucmJaQspBkpM3Hlo+Gh4mPko6Nk5SJhYqJhZaam4+QlJOGlJeDf4+LmYiNkKqXl6OjiJmel5uIj4eXl4qEjoyBf4ePpYmNk6mal5OWmaGZn5mTnZuis7Slo7zAvsjFxcnIycLK083N1KnS0dbW1tja1NPaz4NzgGlkX15eTktUWkJBR0M7QT04Mzc7PDo4PTY0OTo8OjgyPzk6MjpJOj02N0JDMzI6OTYyNjQ+PTQ7PjY5NDk7NTc5NDRLUTxKUUs5QTdCR0lANjRKRUxGPjw4OEVUQTc+XDg2MjE0OjtFYFhBRmF0aExjWj41Ozo6NTs6PTpFTUZIUldTUkJjgUZ1go58fGx9iHh6fnqBgYN+dnaAg3xsbot/eXx4eHyEh4t9iqOzp6OqsqGWp5+lpJaVrqKDkLeVkrOZjaGgjKSbr6KknZiQp5aoma2vpJeUlpSQi5iZlqDAjqPJuKuaoqatmJGanLKdhoWoopyYhYiJjpWNi5OOiIGGh4iSmJSMi5OThpSYhoORkJx0kZmylpekoYicmpOPipCLl5qJipaOhn2MmJ+KkJCcmpmTmJiflKCdlZ+bobGuo6S3vbTFx8S9w8O/xs7KydKnzs3T0tDW2NLP2Ltze3deYVZhV1FJSU9FQUJFNT46NzY6Pzs8Nz00MjY2OTc3ND01PDU8TDw+OzxCQTc1PDs0Mjc3P0A2P0A3ODQ5ODc7PDU1T01EUFJMOEA9RUFHQTU6SkVORUQ6NkFAQlM+OURPMzIzNTc1PXZcPFJcdGlaTV1TPD04OTU2Nz06SkZER05bXFlJZmA7SISLenpthYZ6fIR4gIWAfXB4fH18b3KNen2Be3iGi4mFg5Knu62osr2vpK2zs6ijorCsipq0naO4pJWspJaprbempKOfmamXqaOvsKqamJyUlZGXn5eZu7utyaBptrirsJSYnqOrkpe9o16qsoKJio2Uh5F8jo59g4aNj5SViIeSlouPlY2KjJeYkp2as5aVq56Lm5SSjZCSjJmbipKekIuJlZ+ijZWNmJqdk5yZnpShoJScnKWvqKKls7erwsjEtbq9u8XIx8LRocbJzc3E1tbQy9SicXxpXltUX1JQRkQ+PENBQTg/ODc0PkY8PDY8MzUzNTU0NTRCMzo6Qk06QTtBSEI7OkA8NzQ2PEI5P0BCODc0Ojo2Pjw0N1RLQ1VRSjc8OklBREA0QUpITkJBPzZEQTxKTkQvVD0yNTQ6RUpcWEpaUW1ncHBEaWBLSTY3NTc6PkpAQ0lQZUdiYGJwSUCLin+Bc4aHfYGIdYKKg39tfX18f3B3hneNgYd7jY+MhoyZqsLAr73Gu7K0wby0rauztoyosq6uvaqbu6Sorbm3q6amoqKjo6mvsrGqnZykmJqXl56ipaWSo7muqL+7rK2yuaWjpn2IhpytvbCDi4yLkIOPg5GPeoGHkIyOnIiIj5eNi5WXlJGalp2nmrGakaudjpmPko6VkJCWl46RoJGJlZujrJSWj5ScnpSgnpuYoKGVmp6np6SipLCypsHHw7CwurbFxMK+zafHw8fDvNXQzcTKiHRzY11aYFtOS0JLQERGPkE/Qjs6ND5BPT01PTY+MzMzMjQyQTE3QEJOPkdAQ05DQT1DPTs4NkNDNUJJQjo4Nzg7NUI+NzlWS0RXT0Y4PTRLQEM+NEVLSE4+QUE2QkI/QlNFNThQMTQ1Ozw4O0Q+OUxqal07V1JkS2daVU83OUdFP0NGXGZGYGlnWl1bk4yMiHuHi4eDjHWGkIqBb358gn9xfoF6lXqRlJSYkJOVp7TGyb/CzMHDuce8uq+rubuXsra6ssCupcCkqq+7u6qtq6Kinqerr7Wwqpufqpuhm5Wer7Oni6K6ubXBu6uonLKko6iThY2pw8SkgouPh4iEhpWUjXqDjJGOkaGMjJSRj4mXn5iTmZSXpqCunYyqnI6Vj5KRlZWOkJWRj6GUhpefoLOelJqUoKGZpJ+aoJuglJiepqSmp6SvraXAxMKuqLe1ycO+ts6yxb7EvLPRycjBtXV5bV1ZXGpTTUlDTEtKSkBBPUJEPDVBRDs6Mz04QjMzMjI2MkEwNUlFTT5JQEhSQEg+Q0A7Pj1GQTVBVUA7OTk4PDdFPjg+VkpDV09HOD80TEBCOzVKS0NMP0I/PEJGPUFITDkrRzwzNjc0NjRBPzdPYU9hRS89PjZrbGpgQDpIPj9FQmZbTWVcZlRjapmNl4qLiJOQhol5hpOQgXKAfI1/eIeCgpB5jaGWqJqamLq+x8jKwtLIysLNvcGzrLu+p7q/vbvDuKzBqayzu72qsKqjpaOsrbSttrWgn66epqKYo7O8qZuovMGjtravq5KvrKqrloaZqaalkYKMk6WViYF1ipJ5hY2RkJ2fk4+Ui5CNlKOZl5uUlKOeqZ+RpZqMj4+QlZaIfY+VkpKjm5Wgopy1ppCflqWko6WenqaYnpWXm6WjqaiisqyovMDEr6Wzt8zAua7Ds7u+wriswsLBwJluemJZV11bTEtNSkdEQ0lCQkFDSzo0REg5OzQ8N0UuMTIzNTJCMjZTSE48SkJKUUVLQ0RFOkVMQjw3RVY9Oz04OT88ST86RVVJQVdRRjdBOks6Qjc5Sk1CSUBDPjxERzxCQ089MjBIMzY2MTcwPUI6PWpqSks1UVMzU3BwZE47RD1ARj5rSV9YYVpkZFaekJ2Nl46ekomKf4ifk4R3hX+Vfn+QiIqQf5Whmq6mo5jCvcjDyMXTzM7Ny7vCt6+6vbS8yrzDwba2vK2zv7m8rq+ooKmntq2uqbK3mp6toqihnaq3t6mkr77Dsb25s6eps7OsrZaWpKunoJGOkrHFp5WOfJGVfYeRmY+qmZiTk4+TlZOlnpOdmZOho6KcmJ+Zi42Pj56IWpCXl5KWpZpmmKOfs6WWopasraunm5+ml5iWmZWhpKimnrarqbq7xLWltLbLwbiptqyzu7iuqLi6vbiDbm9bWFVWT0ZLU05LP0FIRURIRkc4NUZNOz43PkFKLjMyMDI1QjU1T1ZOO0xGS1JMT0dHST5JUT86OElTOzs/Nzk+RExCQEhTS0BXUEY6QT9HNkE3O0hNQ0U7Qz00RkU6QkFCRzkvOkEzNjAzPkdEOTQ9dGRNRztFKzpmfGhXOz1AQkZCckZpSVJlYkxGpZSclqGXqZaNkIOHpZKIgYeCnISDlZCQlI6aop+vvq6hxr3FxMfGzs7O0sq+u7axuru8vs62xL23uLeysrWzt7Osppyrq7iqqKevsJejrqSnpKS0wLCqrLO+wrnAubOnt7O3sq6VpKyurqSLk5WhjXTBmn2WmYSOlpqLsZWamZWSk5mZpqOVoJuWmqicm6GgmYuNj5adYEqWnJqUmqWXVJawn6+cn6WUr6+spZqhpZSTmZmOnaCnopm0qaqzvLy7q7Cyx8C5paurrbGxo6GysrSkcW9mXFtPUUxFUFBQUTtHS0hGSEJDPjlLVD9BOj1FTTA3NTQ0OkIzNE5XTzxKS05VTlFKUEhISk9CPD5NUjs+PTg6PENSPkRIUklCV05JQENBRjM+NThKS0NBPUM7NEVBOkE/PkhANSpCNTIsPmNdZzozNXRkZUBSNyYjM31pWDs6QkNAPVFFV1JzYldGSKuXmKCiqK+ZkJeHi6eWjoiShZ+IhJ2Xjp6gmqOktci0qca6w8PIysjHzM7Gvrqyrrm4wMHNtci6wLm1ubGvr7K0p6ObqrS0qqmmrqyZpK6lpaisur+oq7a2vsG/vriyssKwuLyro660rLiliJuXppt2vqCEmJyOk5mai6+WoZybl5Wbn6GpnqigmZqpmaGnnpeQjZGdg252kqKalZ2in5CtsqOrlamqmKuupaSgpKiSkpmciJScop6Xsaepq7q2vrOyrb25tqCjp6ilp5ycrKmpjGRmYV9SS0xHR05KVkw9TURNSUtBQ0Q8UFU8QUFCRE8xOD03Nz9CNzVVWE4/SE5RWFJQUVRKUUpKRUFFTVE/Pz04PTtHUjxFRFFCR1lNS0FIREU6OjM5S0lCPkNCOTlDPjxAPjs7RzctMj4tMYJoTnpcLzBraGA8PUJCODZ6Zlc7Oj0uLlNhTVVIf2VeSEWrlZyhn7uumZSejJOqm5GSk4mqjYeinoykrZSjo7bGvbTBusHCx8jFws7Iwb25sq+5tMDCyrbGscG8tLqrqK2sr6Oimaq0u6appquqnaivp6Sqqr28p6y8s7e9xry2tbfAr72/s6i0tqu+pY+il5Gin7yfiZmgmZaenY+3n6mcpaObnKGaqKWzoZudpZyoqZ6ZlY+Um4uXiYykoZScop6gtK+lpZOwq5mrrJ6epKOpkZWVoIOQnp+clamloqG0tLq1rai0srKenKKmmpeVmaqhnndhXmBeSklGSE1RSU5FRkZCUktJQURHQFZSREg9QUdRMTtCNzpCRjc5XFlLQUxQVFVTTVdSTlVKREBKSk5POUM/NT08TlFDPz9QP0VaTUpBS0RHQDUzPUlHPz1FQTk3QTs8QDw8M0A8Lyc7KkiRQjpTSjAsW29XNzE8Kh1CgGRUNDktMTpnXEZDQ5xvYkdFp5ekn5/DrJyXpJeZqZyWm5qPqpaWp6aVrayZoqu2xMK7vrfBwsDHxL7Nx7u9ubKwuLO/w8i1v6+8trq3pqSrq6ygoJqqq8Sipairpp6rr6uiqai+uKatvbC3tse2tbm4vrC+wba0srSvvaOWo5aTm5Sun5ChoqWjo5+QvaWpnamsnZ2hm6afvaKZo56iqauhnZeNlZ6TnoePhI2TnqSgnbWsppyVsqeZsKefmqqeoI2ZlZ+EjqGam5KlpJqYrLG2sqqlqa2snJigoZKOkJapn5RpZFphXU9KR0tPTEhFRElBPU9IQTtHSUhbUk9LPUhPVTRCRjk+SEc1Q2JbS0NOUlVXVlFYVFJVSEA4UVFQTTpHQDRDSFFTSUM7Qz5HVktDQE8+SzwwNjtHRj47RkE1Nj85Oj85OzE1RDAtLDBNdlw0S1o1LE1uVzwtPSkeI3piUTVDS1E5b1JGPEt4ZWNXTKKao5uexayhn6ydnK6fkqOelqSgp6mrl7awo6qytcTCvb+2wMK7yMK+ysi2uLW0sbO0t8HGtr6wuLS5tZ+mrKqrnZ6fpaTBpaCpraCkqa2voqanvbWlsby3tbXDsrO3ub6xw8C3t62ztLWinKSVkZOgraCYoZ2oqauimsOtqZ6srZubnpmmoL2hnaSYq6urpqGZjZqfkp6Jjld/lZ6loaC4qqeTmLajn7OhoJuvl56OmZSdgo+fl5aOoqSVkKWusqupoqKlpZaVnJmLj5GTpJ+JYmVbZGBMSUpKT0ZFQUZLPj1KQjk5SktOXVFRST1MVlw5Rkk9RE1JOEhjXExDTFBTWVlWV09aXklBPVdRSUs/SEA1SE1YU0hBOkBBRFBIPz5RPks3MDk5RkU7OEc/LjY+Nzg+NzcvMT85MSUxUVVtW0pPMTA9Z1dEMTc9LSt3YFM2U1prV3NIRTY9dWVcS06en6GYnsOnpaKzoJyyp5OrpKCjn62prJ27sKistbHIw8HCs8LEvcbDvMXKvLCwtq6wta+/xbW5sLC6tayaqLCpqZqepqGnwq2brLCcqqKusKmkp723pra6vK62w62zs8K/scazurartLWtqaGllZWUo6uhnp+aqKuwrq+7sqagqamZmZeToqS4oKGkkq6vrKWmn5KhnpWej5CNlZ2Zo5+ntKanjZi0nKOvmp6brpGelJeUmoCSoZWPjp+hk4umrLClpqKcoJ6TkpqUhYuSjZyegGJmW2hlS0lMSlNCQ0BIRzs7Rj85OU5NVV5SU0o+T15ePUhQQkxMSTlOZF1MRUxSVFlbU1VPXGJIQT9aUUFIQUtCN0ZFTEtOPjtCSEROQj07TkBBMy85N0NCOTdGOys2PDQ2PDM1LS80QDErJ1Z0U2VPPzEwNGJbTTIzPjA8dl1eP1tVXmZyQDg8SJZ3ZUE0n6Sfm6DCqKOqsqGjtamVsqunoqWyrK6pu7KssLW0xr/ExLXAxL7KxLbAyMK1q7WosLiswMS0t66strmlmauyq6qXn6aXrbu1m6iwm62frrSxp6q6sqe5s7eyuMCqt7LCvLPFp76urbe0qaeroZaWkaWkoqKXmKSuuK2xtbagn6ikmZSVk6Ogt6KkpZatsbKlqqahnpqampaYqJ+fmKKer7Kipo2XrpmlrJeZnqWRm46UmJqFlp+UjJCcnpSLqamqoqegmZ6WjI+ZkIGGlomUn3lkaV1saU5QTU5UPUNBTUM6OklANzdRT11eUlZRQVdgXEJKU0hWS0g6VWRdTkZPTltXW1JQUVhdR0FCW1BCRz5OQzlIR0hOUD8/Q0lCTEI8MklBOTQxNzdCPjs3RTcrNjkxNDgwMi0vLjw2LSNCcWdzazIzLzFbYlozMzgwNnBbYkgwNUpwaVZDV0aMeWZDO6SjnaGmv6anr6+gqbWqnbmvq6OqtLexsLm3r7a4t8S9w8e9vMPBx8C5wcbBuqq2pa27rcHDt7iqrbK7opWtsK2ylqWnkau5qqCnsJ2qn7C0sqqptrWsu6yysrm3rLmwwrq9vqbCqrC3r6mqq6admJiqoaGgkZigsK+zq7C5mpupn5mWkpemoLappaKir7Gzq7Gnq5+boKCbnqWcoZedo7Owmp+Qk6WaoamalaKflpiJlJiTlpedk4iQm5mUj6mop5+jm5ebk4eOmYt+jZaFj5traW1hbW5YUVFaVEFDRVRAOztIQTc6WFBkXlBWV0RZXl5NTFJOXktKPlpkXk5IUE5bVVlQS1NXWkk/RFhQREY+Tj89SUdHUVBCPUNGQk0/OjJEPzc3NTQ3Pz05NUU0Kzc1LzI1MS4tLiwxPionKz1ccD0+MS4xZVtkQDE2NDdnWWBGKD84bH1oW1Y6iXtjQz2nn5yhqb2hqrCqo7G4qaW0s6uhrbW9r7O4vLq9trbAwr/JxLjEwsDAuMS9wbivtqirt7K8v7+0qa6xt5+Xq62orZenqY+nu5+lrbOeq6KxsLOsqbaztbytr7G1rLC1scC6xLarvK+xuKusqaKxpZ6kqZ+jl5CZn7Kqs6mqs5mdp5uZlI2gpqS0rqehrKytsaeyrLKppJufqKOdlKGYm6i1qZeZkpKemZ6hnpCsn5iYhpWYi52anJOKjZaXmpempaOgnZaVl5SAj5SFe4+Sg4yWZmxyaHByX0dZZlZEQ05YRFo5SEI2Pl1RaFxOWV1HW15dTk1SWGRKSkNcYmBQS01OWFdYUEpWVldMPUVVSkVEQU0/QUZISFFQQTtGREZLPTg3Qj02ODcxOT48NjVEMCs4MC8wNS8qLC8tKj0sKyUyKyo1SzEuJ19eYVUxNTA9YFZeOClDM1lVXGdLNYx6ZkxApJqgpKy3pKyppa6utqmvs7mmprC3xbextr7BwrW0usW+zMW5w8C6v7rEuMG5srWsqrq3urq+taqtsbaZmKerqqubrKuPq7ydrK6xo6qfsK2zrq62sbm2qa2usKe1r7O7vMmyqrW0sbSvrqags5+aqK2gpZWVmpmxo62fpa+WoaSZmZKNoqWnsqmhprGrqbWlrrC1r6OZna2nmpeemZmruKOXk5GPmJyhmJeUrJ+dlIGTmY2dnZqWkIqUk56apaOioJmWkpOWe4uQhXuMi4OLkmtueG51fGFGYGpZSUhZWj17SkdFNkFiVGlaTVxhSltdWlJSUmJgTEtFX2FgUExJUFdWVU9HV1ZVTjpJVklIP0NLP0VESEhRTkE/SEhIRTw3PT46NzU2MDk/ODY2QiwtOCwvMDQsKCwvLSo3NikoOS4kOks1LiJUYFZhLjUoQ15RXC4qQi9KR1BbSDNjWVVLRJmWoLCosamspaOurrWpt7S4o6u0t8q7tLu6v760tLfDwc3Hu8O9t76/wLi/vbG9rqe6ube3wrerrbG5lZemrquno7KplK+7pK2ysaenorKzsLKwtLG3sqiuq7GmuK+1s8PFtqi0tauwramnorafnqaxoKSUm5mUsZ6nm5+pjaminZuVl6WlpbenorGzq6exp6ywtaykmaCsqJucnZuUqriblI6Oi5icopiQl6ahn5aEkpaQnZyYlpaIl5CXm6idpKCSlpGRl3aEkId8hYKEjYxucXh2fH9dS2VsXEtPY1w/YntHSThHZ1dlW0xeYk1YWVdUWFRpXVBPSGFeX1BKSFFWVVJLSFdVVk04TVpORUBGSz9IQkNLU00/P0xPSEA7Oj47NjswNDE8PTQ1OD8pMDcpMS4yKSksLC0rLTkkMDQyJTlCNy4jQU5JZzI3J0ZhTFYlLUIuPUVNUTwzcmtKREOQmaStpK2tq6eksLKzqrewtp+rtbnJua7Bu8K3s7K1wsPPxMDBvrW9wL+6v72zxKiqubC2t7+9r6uzs5ygp7CtpaawpZ6yta2rsrCsqai0uay0srWss6yprKisqbmtsbDHvrekua+pra2lqK2wpaOjrqOpnJ2cmq+ZoqOio5CsnqOfn6Gqpqa4pau0tKSpq6irr7auop2jqKqboJmakqS0mY+JjYeRoqCVjZSdoJSThY+Ukp2bmJaVh5iSlZmnnKCfjZKRjpF3fo6FfXx9h4qKcXRyfn1+XFJkb15OWmZdRkSWW0c6Tm1YYVtNYGFOVldWV1RZZ15RUkxjWltUS0dPVFNOR0lWU1xOO1BeSkJESEpBRT8/S1NPPjpOTUM8PD45OjU9KzMyPTYyNDk6KDQ1KS8sMSgpKywtKiY1Ki8mMCkzODoxJiozQ2Q7NipIZEhKKzpJPzNCSVMsPo9rPUdIj5upqqGpr6SopLO0sbS1sbGhq628y7quwLvHsbSttMLD0cXGvsCyvsHCvL+4vMWorbess7i8wLCrsq2gpKetqaiksKOqsaqvrLCur62rs7qmtrCyqbKpq6Wlo626rKqxwrm0q7moqKitqaixpamkoq6qqKKem6KslaSdl52Yq52hp6mhrKWirKu3sbGgqKKfqq6wrJ2epqeomaOYmI+gp5iGg46Ki56hj4uMlpyPj4aHkJWfnZaYlYaWk5OXpJydnIuRj46Kf3+HhX13f4eFh3Rzcol2bF9ZYG5jUXNyXEs7hHxGP1d1WGBZTmNcTVVWVVdQXGJeU09OZ1hXVktHTE5SSEVJVlJdYzxQXUQ8RkhIQkc/PUpQTDo+T0o9OT89Mjo3OyozNT4xMDQ4NSg1LyosLjMwOyksLCclMjM0JCwyLTg2MCkoMTxeSjAuSWdERjg8QjA1RUtYMUCUWz9NRpWXrKeiqrKcqamwtqy4ta6qpauqvcm7sL63wq+xrbPEw87Ow7+/tMDDxLrAtMnErK+3rrK5wL+zra2rpaeqsKmnqLGltK2rsK6tsa+zrLO6pLizrKyup6ufo56wt6uqrbq2pLW1pKmnrKyqraGopqaxsqSmpaGhq5apoJOaoKadpKKqpKyinqaxt6ysoqSimqiqramcoaWko5igmZWPmJ2TgYKQiIWcoI2LjoyZj5CLhI2Yo5uSkZuMk5KSlKKZm5qLjYuLfIaBgYN7dICEgn50eIykh3lrXmBuZ1dmh2ROQGeSTERieVdiWFJlVU1WVVVUT1xdYVVLTmlXVlZJSkhJT0JHSVNRWW9BTVhAOkpHRkVHPj5FUUg4Q0tFODdDNzI6OjoqNDk/Li80NjMpNCsqLCsuIzQuLSsmKCs3OSomNis8LTIsJjA2WFouMEpnQUE8PEMrOkpPXjREhkBISESWkq+koqqwl6qprbWrtrGrpKuqqbzAwLi5s7y1prOvxMnL0b7Bu7nAv8K5wbrCxK6xtbKzu8G+s7Gurausp7aqpa2vq7mvqLGxrrGrtaq2tae0tquspKmqnKOds7OoqKS0tKC1raGpqKuprKegq6youbapqqmpoamfrZuRqKGdoKSipqKpnZymtK6npamio5ekpqepnKKko5+ZmJ+Rjo+ZjX6HjIeEnp6IhYqLj46QjYSGlaKajo2bkZKRj5Kfl5mWjIqDf3SGgX9/eHWDf3t4foCJno9vcWdncXhcYXSIaU9dmFZIbXhVZFZRYk9MVVRVUU9YW2JWSFBqVFZUR1BZVUk+SUhPUVB4TE5WPTxLRD9AQTxAQ1VDOUFLPTU7RTEzOzk3KjQ6PSstMzQxKjgqKisqLCkqKC8qJiklMzssJDIpMjAyMSUvMlJjMDI/Zj1OWD9DLD5MVF8vSWs2UUU7lY2voKWqrZmrpK2vs7SuqqWvqam6vrvAsa+4rqK2sMnHyNDAv727vMO+usPBwL+vsrOytb28wrKys6uzqaW1qaWts7O5r6OutrGvsbmquK6qrrasqp6qq5+joLatqKGer7OhtKqeqKeqo6qhoaytqL2vrK6soaenn6uYj6+imKGgqKeep5uZqrCoop+soaGSoaKjppiaqKWXl5idj4qHlYh8jYaFhKSXhYKCjIePjpGEhZSgl4iRnZCTkY2RnJWXj4qFhnh0gX99dXh6gHp0dHppgoejdWleZWyCdWeIi31SV3BeSnhzU2RTUV5NTVJaZ05MVlllWEdTaVJRPkJOUWFROklITFNJcVBMUzs8ST87PD07QEBXPDw+SDczQ0IxNTo5My01OjopLTMxLS02KSgrLSw1MiMyKScsJS47LiYxLjAtMTQlLDBNaDozOF89YWQ/RjFDUFtbK0hPOlZCNJCOsZ+kpqujpqSsprSzsKmjsKequL7AvLCouaqnrrDJxsjRw73Avrm+v7zJvMK5sLC1srq8ucGztLutua2jtaanrLG2ubKnp7q1rbW8r7ylra21q62cqa+jn6WsqqecnqqzpLOomqqnqaSpnaOpqKm9rLSvrp2po6Cum5qyo5Wkm6Sln6SamqiqpZ6aqaGbkZqgpJ2YlqmpkZiZk5CKgo+FfY+CgIiej4Z/foyHkY+QhICTm5SFk6KMlJGLkZuTlYeJfoByenl+fGl3fXp1cXF9aIZ5hIhkYGhjc4V6bWd5XV5VQld6bFRhUFJZS0tNcHRdSFpbZ1lFVmZQQz5LTkRDQTlIR0tTP2phSVE4PUg8PDw+Ojw/VDY6P0M0NUg+Mjs1OTAyNzw1KC41Ly0xMSYvPktJMSUaOTAlLCwwOS8sLCs2JzE3Iy0vR2pJMTRYPWZiQUo3R1NgVSo9O0VaPyqPk7CZn5+opaShq6S3srKkqLCnrLjBvbWwo7msqKiww8nJzMG3vcC1t7+6yLbDtbSztbK9ubq+t625tr+torOmqquvtbi0qp67u6iyv7K6oK+0tqmrnq2wopylqKminpyksaawoJ+qqaeiqpujqKCtvKiusK6hq6Kjrp6erKaXnpqho5yfm5qjqaKamaOjlZaTnqGWm5amrIuekZCRjIKLgH+OgXualI2JfH+LhpCPjImFkpiRh5SjipKSh5CakJOBiHx5bH12eXhie3pxcHBzeGmBdGqDZ2RoYW9zjm1ianBgb0FceGtVXk5QUUpJTFNaV01dXm1XRFdgT15QSE1ERjs3SEVLTzxyaEpLOUFFOzs9PTs7PUo0OUI8MztHPDQ/MTgtNzg7MigwOS8sNS4uPS0qTD4qHTQ5JicuMzQuMCsvNCYsOiQ0MEFoWjEzUz1lX0RMNktWZE8pPDJQWz0jkpirmJ+Xp6Sin6ikuK+uoq+vqau4wrqyrZ+4r6uotLrHy8e/t8K+sLS+t8S2w7KvurKzwLa7vripubi+q6S1p6iqsK25sKmaurykrr+0tKGut7WnpqewsqCfpKanoKWZn62oqJ6gqq+noKaXo6mfsLifpLGvoauhrKSbpqapmpqbnqOVnJyanammlpqep5GXkpidk5mVoaqQmomNkId9h36CjXx8oYyNiXmDjIWKjI2FiJOajomVn4iRlYKLl42QfYV7c3B8cXN0YHl4aW9wcW9qf3NjemxpZmRhZoaAYFtyanFMTX9pWFpNUExKSFBSUUlOXF9vVERYWlJnT0hLRUY1NkhCTEk1WmVKQDZFQjk6Pj0+OjpDNTk+OjNARjwyQDIzLzo7ODMmMjwwLDg1QiopLUMqLDQ7Tk5AOzczLS4rLTcqKjwlNTM9ZmQyNE0/ZV1GTz1SWmdIKj8wWlo1KJacpZiclq2gn6GkobersKO0tKmoucW2sq6gt6ytrLC1xsjAt7/CurG1vbe/u7+vrL2wtL+yvcO6qbu7uKeotqinq7Css7Cmmry3pKu7ta6fsLivqaWmr7GboaSgo6OhlpuwpqGeoqevoqCik6Olorewoaaxq5+soq6YnKqkqJ6Xmp2kk5qcmp2lqZmcm6SUlJeUnI6Tl6KpoZCJio+FeoR9hIp5jpeKjYd6goiEiIyOhY2UmYyOlpmKj5d+hpeLj3qAenBxdm9vdF94d2VsbGxqaYRuZnJpbGZpXWRzgWBba3VpWkl9XVtYT09LSEdSVUYyOV5ebVBEV1ZZZU1ISUVFMDdGP0tCNklKSDs2Rjk0OT49PDk4QDg7ODo3QEk+ODw0LTM8PDc1KDU+MSw7QTEoKzY8IjhSPSoxMTM+RDUsLSc0Mio7KzEzOWNsODRHQWZbSFREVV1oRC48MmJWLDKVoqGXlJuqnaShoqC3qq6gurimrL3Fs7Cvo7Wwra2vtcTEvLO/urixs7m4uri6r67As7S4sL/BuKy9urWmorOqp6myq62xoZvAtqSntbWonrK8qaimqK+smaOnnKOmlJiisqWZnqOoqZyioJOkoKS4qKSnrqaepaCokp+ooqGgmJudoJKam5agoaqbm5ihlJGUlpmNk5KjqKSQiIqOhXmEe4SGfZ2NioqHeoGEiIiIkYWVk5OMkJWUjY6Ue4OXjot3fntsdHFsbHNheHRoaWpnZm+GZ2hpZGZpamBpYmpnW2V7Y2BTc1RcW1NLSkdJT1NAISppXmpMQ1ZVXmBLSUdFQy46QjxGPDZLUEQ4OkQzNTc9PTg5NT86OzQ+OEBLPT45Myk4Pjw6OSo2QDMuRTQoKyw/MC1OPy4rLTcsMTE5NSwmLjUtODA1NzZgdEIzQ0RnW0tXR1VgaEIzNzlmTycynqOjkY6jp5udnp2jta2mqrm3p6zDwbawrKO1rqeur7fAwLyywbexrrK3tri3tq2qvbOvsrG9v7iuvLyxpZ+2q6Wls6mqrp+ewauopbCyqay1u56pqquxpZeeqp2mpJGZp62imJ6kqaGcop2XoJ2ntqavqq+hoZ2doZSgpZ+hoJmbmZySmZ2UpZ2roZeWnZSTjZWXi4+YmqigkoiKioh5hXeCgoGciIuCiXx/hIiGhZGElpWPjo+RkZGMknuDlY2Fc319Znhva2psZ3Vza2NnZWR1gGJlZmZlampka3FaXlldbWRhTmhXWmBWSkdJS01SWD45X2xpSEJUU1xbSUhGRkEuPD85QTg5UkZANzpCMDM3PTc2OTI6PDk3OjlETT1CPDAqPEA7QT0tNUIzNz0rKiwwQSpKSy4vKiszNzIyKDU3JCs3LjcyNjg1XXlOMj5IaVpMWkpWYmZAOjNBZkglNZujn5CLrKGYmKCWpbOxobG9t6Gxxry6sbGktqurrqm5vbu7rsCyr66ttq+zuLOoq7mxr660trq2sLm+raaetaugoLCkq66do8GgsaOusK63rrWera+sraKZnKeppJ6Vm6iln5mkoqidmqCblJydrLCmuaiuoqGamp2YnaOapJ2XnpiblJmgkqiWqqeak5qakYuUmY2UlJmpp46OiomPe4JzgYGKmIWHfImJhIWKjIqThJOckpKPkJGWjpCAgIyNg3CAfmZ4bWhramdxcmtcaGNjc4FhZmhqbmxna2pnbVxsa3RxYVRiaGRlWklGTE1PWFFRVmFkgVRAVlNZVEZIRkVALzw9Nz82PEZOYTg6PzI0OUAzNzgyOD83PTg+RkpARDkyLT1BPUE9MDVAOUAxLSsuMzw7SzYvLissLTI0OzYjMyopNi41NTQ2NVp8XTE5S2pbTVtLWGRkQEExSmVDJzSSoZqNjrCdmpOhmamyr5+4v7agtMK7vbmxprawqK6kt7i3t627r62qq7eqtLmuprO1sq6psbe2sbO1uqepn7apnZ6poqmsm6i/mK2jrq+1ta2tn7Gtr6mim5yjq6iblZyno52aqaKklpqgnJCbo6uqqbufp6SgmJmZnaCPa6GWmJxxgpWao4B1kqmnnpSUnpCIl5mAloqhkHiGlIyDbmp+doNxbIaLhn2Ei4ZvXmNhZ4SXhmuLj5STdXeLhH6DkIBnhoBodWlmV1xoc25OUGpjZ3KEZ19kZm5sal5gYYqQhIVlTktEOEZUZ15KR1BQVFVLSFNhb3RlRltRVVBGSEZDPjE7PTY9NjwzZlw1Ojw3NTtENDg2MDpCNz86PkZMQ0IzNDM9QEBAPTI4QEU9MSwrMDg+RzYwMS4qLiovNTY4LCMxJzIxNDoxNzZYgWwxNk9rW05cS1tmYj5HMVFkPSsvjKOZhpWwm5yToZuqraqjvcSvqbfCuL28rae2sKWrpLizsrOxua2qp6y0prC1o6i4trWop6y3s660rbOjqp+0q56hpJymp5msu5Wmpa+yt62upamtq6yloZ+coKemm5ehpaWbm6ennZOen5iQnqeqo7Wvo6OjnJaXmJejiKGOkpqHoYeTnaB/pX+mqp6SkZqRiINyeIyOhYihdomNaZeIZn1yeKFviIeEfo18f6GgoJmAe4eedIiOdpuKbIeBgm1oZWN6bHFhVIZtY2xpmHFYanBvh1heaVtra1uIcW56coZnhoRaXkZNP0dfTUZSVlZRUVJXVWdeTVhKUlJPRUdHPjw0OT05PDc7MDw8Nzk5OjY9RjU4NjA8Qjs8OT1GUUc9LjU8O0A9QD41OUdBODIpLjE8STkvMDEuKi8oLTQ1ODMlJjIxMTU+MTw4WIN1MjVSa1tOXExcZ189SzFXYTcvKIuml4Ocq52ZmZ2fqqqnqb7DrrK6vLfAv6qkt7CprKayta6vs7arqaWxraW1s5yttba0paeps7Gtsqivn6uhsqmgo6KaoaKbrrSVo6SltrymraerqqyopaGgmKCmo5mZpqKkmJykqZaUo5yUk6SlpqG3o6OgpJiUk5iTnIiuj5iUiamLl6KbhbGAo6ydk5mdlHmC1Kh/h5XBm8d5eLGlt5dkgMCcv3mEhHmQhHyQkJHKcZa8nMV7cramu5B7gGyWsauweWhrWLGubmVpvJK8bmh6bnKP2H5TamK2sn6BcpR0mqGqkFdPV2FPVk5GVFtYUVBSjFxXXFBAXERRTkVHSTw8NTc9Ozo5Oi49Ozg3ODs5PkY2Ojc0PkA+Njk/RVJJOi41PjtCPD9BODpKPjUyKjIyQkUvLjMyLisvKS0vMTg2LSAvNDE2QTE9OleDdzIxVGtcT1tNXmdcPkwxW100MSGNpZOApqmfl5yepa2yqLDCvbK1wLW3v8KrprOsrKmnr7Opr7azqKimtaanuK+cs7K2qqWkqLGurrGmqp6npLGkoaCel5ufna6slJ2hn7S6oqqooa2upaKdmpmhp5+Xm6egn5iep6eRnKealJ2hpqKgsKKfn6OWlZKYkpmFr2pqio2qfmeElYatZHCdnJOZpZRxrqGkfni7fWuhkHaxX2q0W6WAZpyRYGaCemZ/anhrqWS+cmemjHaxanyxeHSSlGNtbadtW4SgRWhnh5ZFdZxgfWd8pKeCWV+Lq2mAlXh5aqc3Sq9cV1NtY1tLTldfXFdWO06JT1dXL0lUU0lERUY9PzQ2Pzs4OjkwPTg5OTk6PTxEODs6Nj1BQDY8QEhRRzkwNzxBQz5ARDhARz0xMy0zM0UzLi41My8rLyguMC46NS8nJDIwM0IvPTtVgnYyLVZqXE9ZTF9nWTpNNV9ZMzEbkaGUgqynpZ6jpaqyt6y0vb6vtsSyt7rCpqiwq66pqbCuo7G6r6SlrrOjqbmonrOysKOloKqtr6yvpqefo6Kwm6Kbl5WXmputpZaboZ60s6Grm6KtraCemZagoaicmJ6kn5yZoaekj52impegn6qepqagm5+hlZWRlpGahbWbtXiFqZm1mXeHs5u3fpOVlqiUfmuBpnqChoiSlJJ4q2drsVure4+HlHSIcY+GgH+IkJd4g4KLl4yDoI+EsHZ3n3Fra2x8i06kWEhjY5l+Y2imYHlydVOSh15QqW1jcX6HgGKcLlGib1tTa2hgTEtbZFhcWkI+sXhXWEEjTWhFQ0RBQEExOT44ODo4NDs6OTw5OkE6RTo6OzY6Q0I4PT9LTkc6NTpBRkJAQUQ8RkQ7MDIwMTtGLDAuOTQwLC4oLzMsPjgzMR8vMi1EMTw8U31uMytYalxPWE1fZ1g3SjhhVTUwG5WflIizpqahrqmns6ypurbCsLvCrbi3waqsra6upq6yqaGvvKqhp7StpKu1pKays6ejoZ2oqrKosKilnp+fr5afmZSVlpidrKGamaOotK6iqY+pqKqbnpWXoKSnmp6cop+boKOlo5abnpiZnaKqm6WanJuioJaTkZOSnIPVk5m5cLDCfsaGfNaUm7t8mZWkj42cjaR7joekgqWCeqx5j51Wr3qIfp9quVq5d4aDfKaCk3yYeqp5jZ2Qe7FujoR0kLyFb5RQr6fFilGgemNgqmJzcohtl4hgU7W0yIaAiXxjpDNCnXZdUGloZFBAWGdaZGFKSE1sS1tST1lmWUNEPkU/MDw8NTk7NzQ8Ozg9OjxDOkY6Oz42OkBDOzZAT0xIPDo8REhDQkNEPEVGODEyMTFEQy4vMDQ4MystKS4zMjM5NzEjJTUqPjM9PVF3ajYqWWlbS11PX2ZUN0c6YVE3MiWbopOYsaiopbSqpbWopLu3wbC5wLG1tLuztaexsKOwsqafrraom6i5rqOvsaCztLCgpJ6fqKqxqbSppJydnqqXmJeWl5WWoKmdmpanrbCoo5+PrKKolp6Xm6GloZiioaGhmqKip5ueoZ6VmZumoJunlZubn6GYj5KUkZyIsm5otXGrh2+OpnK0c3K2e5mXo4uOnI2ifpGgpX6wdoOR0tF2XK57hX+kb5uqpmuGhHytfZeZj3uxc5Kdj3mzZZZ0hJ5vnmaUUsiLWsJcn3liX61gdnOHYpeIXlnKnW+/gXVNS7VTVcZkU1FqY2ZYQU9rX2xoT1VHSTk9VlJbV1hIQz9KPDI/OzU9PDQ2Pjs3Pjw9QztHOTtANzs+RDsuQ1JKRz4/PElKRkNFRD5ISTkxNzQ2QT4vLjI0MjUyLSkuMjYsNzQyJh82MDs1Oj1QcWg5J1dpXEJPVF9lUDVHPWFNNjIwoZyRpbCtpKq7raa1pae2u7yyur+3trS6urOltLOhsbGin6yvpJimuq6ksbGctLiqn6adoaqksqisqqSanJqonpWUmJiSkqKnn5aSpauvpqKWk6yfpZKUoJukpp+UmqWmoZqjn62aoZ+ekJaboZ2cpZWdlZmin5WYlpKahax7d6h2o46Jh6lvrYqCp4OYmKGJkpqKon+TmYiuhX+Cs1xys1KufYOCpH9x1313hH2OnoaZmXevhoqRnIh4s2GaZZqBgpRsklqwWEuadZh5ZmCtXnd3h2iYiGter3eVno94bDV5yK6yX0FUb15nYEVQbF9wbVZVTS5lY2lTWVE6QURATDo1PzkxPTwxNj85OEA9OkM6Rzs8Pzo+PkU5LUVVSkVAQzpNS0pCSEc+R0s5Nzw0Njo+LzA0MzMzLjIuLjE4Ki4zMiUhMDM3Njc9UGtlPiZWZ1xAPlZfY042R0NgSTk4OJ+dlKC4sJe0wa2os6ipsrq4tLi/ubeytby1pbezn7Ssn5+oq5+Vp7arqLGxq620pJupoKCoobanpqqjmZ6VpaGUk5uZkpSipZqSkKasrqahlZqpn6KPkaKZqKWglZqlqJ2cpJ6tnaGdoI2UnpudoJiZnJaXoqCTmJCmnYapfX2leKGPjoOqcK2LgaeGlZ+hiJeXiKOCkYiUqnyAi515b7FaqIKCiKB5dNh/dodzp4GOm42SpHyWkJ+Ee7JenGSgfoOVbJJcq1tak3+Rf2hnqmRye4FrmIdzXaxaiaCOa29lT0pDoVxaTHRdYmZNW2FfcnRfSlY2SpuTWEhFPUhGQUwzNUE4Ljs+MDVBNzhAPDY9PEY/Ojw2Pz1CNy5IVkpFQUg2S0lOQElLQEVOOjpANC47PjAwMjE0NCsqMDUvNywmMjEoJCQ2NjcxPFBlZUEmVWZbPzJVX2JMN0ZJX0MxPzihnZmZv6uXtMKuq62ppbSwt7G1v7m5srC3vKm6tJ+wpJ6lp6eek6qwqbCptayrr6GYoaCmpaS6oqOroJebkaKglZSempSYnqCPjYuor6+mnZebp6afjJKkl6eqp5SXqaeen6CjraShnqGNlaGZn6CSnZeclZ6hlZaOq5uPrm1ytHKpjHaKpnO0eHOzgJGkopGcjYmkh5B3uG+Me4uia2u2WqCFZZeXaaGip22TcrR0k5h/smqFkoita3WzYZ1mom+HkmqXXK1gTaF8h5FSc6Nten9+b5iHcVyvVjycd2VUb24uXKdPYlJrZWJsWmNdYHB7Y1RaUT4+bW8zQkJAP0w5ITdANi47QDM3QzU4Pz8zOzxDREJKRk1JRjYySlRLRUJJNklKUD9ITkNGUD08RTUwOzwwMTAvNzUsKyw0MjYvIzAwLCwdMjg5LzlOYGVEJ1VkWT4vVV5hTDVGTV44MUM4pZqbnbqhnLLArq2rq6e3qbivtcC1vLCvubirwbapqqCbpqShnZGqqqi2o7Kor6qgl5ynoKSruJ2jrZuWmY+lo5WNnaCbmJyfkJOUq7Wvp5mUm6ypl4yTpZikrKKRlqqxo6Cep6uxmaGjkJmil5+blpyXoZOcqpyUkKuZh9SSmrtzsMOAw4Z+1ZabuHiHkJeMmIqMp4h6o7Z1fXd2woKasmCDunnAfHW4YrWBjIepfZaBrKlxe391vIinoGmdYaaOr6F+jHSHq32+bnO8dLKDdXiBim6aiHFujaR0vV53fVthebxrWlZbanpeamFmZ2Jtd29ZW1lDQUByP0NHKzVIIic7PzEwPD83OkI5OT1DNDxATlpeYGBfX19aUFBSS0VGSjRITFJASk5FRk9CPEU4ND05MDIwLjg3LSouLzE4MCItMSwzHiw8OjA4TFhhRidUY1g8L1ReYEs1O0xbLTZBOaeanqG8opexw7Ctqqqssae4r7bFsbqxrruwrsGxq6SinqOhnJuRqaSqsqS1pq2kn5aaqpmmrLido66YlaGQpaCSjZyjnpedmpCVkq+5sayVl6Onp5SRlqSco6yekaCoq5+cn6mjs56jpY6nopWimpyXlaOYj7CgkpSpnoWQmbWAkJGMt5V4gpOatXdta25zbnmPhI6JdJ7Bu72ae4GyqHCAdJG4g3yGhoyGjXuKho2XfKS7ub2cdXq0o3R2l3V0sHWZnmaGaY21dHJwd7aMXoB6fYlog3lteWOLrHB1hX9ZW6dqRGRZU2ZgY11jUWdmcW11Qk1QTUQ7Wk0+SjM8MCA4PjsuMz1BOTk/PTs8QzZCVFlaWltbWlteYGJgXVNHR0g0RElUQktOR0VPRj9HPDc/NzA3MC85Oi4sLy0qOC8lJjIoNCQoPjcvN0xUX0cnU2JWOCpPXV09KzpWVic9OzynnqCgv6WWtMO0rKunrKupu66wxq+1s663p7S4ramioaWeoJ2ZlKukraqmtainn5uWoKOerKS9pqGql5SdkKKbko+iqKKTnZeTl5SytbatmJ2jpKKLkpGmm6Wqm5aopKWcmqGpp6ejqaGRrZ6XpJ6Xl5edno+wqJSbp6GOan5pnKZ4h3N9mo90emWHer2+wLpvkoJxlYdfcmpaXpqJYWOIjpVrYH+VY22dd2KVa3+alZRlXmBjcZuKaXKMfYaVZ2p+cnR4fX1iW3d0gWhQXG6EfXuLa1hseoJzSUpvhnBOdE1FV11mYExbWGZjX09bbXVpcVJPREVNPEhJPUw/MiwyQT84LzU/Qzw5O0A7PUM+UlZWV1laW1xcXWBhYWFgXFVHNURGVUVKT0hGUElJSDs4PTUxOi4wOzouMC03Nj01JiIvKjIsJTs4LTdKUl9JJ1NgVjQpUF5MKDM9W08nPzI+qJ+oocGjm7S6tqOspa6nqLWxrMisr7OrtaO+sbKnoKKpnaKbmpmspq6kpbWppZuYlaGbp62pvqepppWUnJWgmpOXpamokJ2Rj5ecsLK/rJunnaeiiZORqZqoo5ubq6Cjmpujp62jn6uimrCblaeglpWdn52XsaSYoaeYnJGdnKOjmaaimpyampmPloFnbX1xd5KXlJGFirWqjYaYlY+KjJiXh5SVioSSlJGJjpGTmJSYl5qgopqclKGdjYJ6pYZsanyQfIB0iYqBcYJ4eXZ2i4B8imtzgXSDdWR3fXdrcHptYGNdcGdNWVlmaWBXWnB6bmxmU09GUzlPWk1STygrOkpCNjM1PUBBOTpDPjxFTlNTVFZXWFlaXF1gYmJhX15eW1RLQ1NHS05ER1BMT0k8OjszODksMjs4MjApNklSTzgiKSsvMiM0Oyo3Rk9bSiZSXlMxMFReOis9OFxLLDwtQLOgs6K/oaOxsregqaWyp6WwtarJq6yxpbWmwKe0oZ2kpZyjlZagqqaso6O3q5+Zlpafl62ppcGeq6SVkpyXnpiTlKKfnqKnk5GZqKeyw6+aq5yqn4+WlqmdqpycoKyYoZudoqWwp6KlqJ6umJennZmaoZ6enLCgnKKmlZiTmJOgoZWjnpegjpaTioqNjpatj3yVm4KSgouqqIaBmJaKhI+fiHuEkIeFmZKIhoqVjpuXjZCXnqOWmpORnY1+jmahs6+FioR2eo+KfHZ5em9mepGBgIlrdYF5iHJoc396doOHgmt0ZHlmYGplY2Rma1lre3BpalxSTFBEX1VFQD8/LDRARjs0NTs+QTs8Pz4+SE5OT1BTVVZWWFpcX2FjYV9eXl1eXVhWSktMQklPTVJKOzw6Nzg2LzI5NjQuKCYkLTEuLykrKjclKzwoNkNNTUQvVF1RMDVNWzE3RTRcRzU8LEC0oLmvvqyrrrKyoKqmsa2irLOwxbCqrKOzrryktJyfpaKhnZmXqKWppqSls7WelZSdmZmwpq2+oKyikJGempmUkZWhnJeonISeqauis8izn6qjqpeWl5qnnaibnqSrk56fnaCqr6qmo6uirZufoKGZpJ6cnp2vo5ifqJOYl5yRpJmYqJ2al2WCknxlfo2Zj2N5jWxoa3qRpKtrZZqYfmeFimVlaWh7jqGPa2iNl5Gid2tqi5ijnphzbG56hI2HelhlXoWCXmyKiYB2XGhzd3eSgIeCbniCeIBzbXmEdHeJiI6De2mGWV5rdGRdc4lpanxxbGNdUk5YSmRYQUo0PUY3P0ZENzE8PT9BRDs7REdISElMTlBSUlRXW15gYWFgXV1dXV5fXVpVT0RIT0tTTj0+PT02NTM1NTU0KiYmJSwqJS8qKyc2KiQ7Jy9BSltKLzdaTzYpRVkvRE8xWUM7Py49pZ+6vLmvrLOwqqWora2wp66tsL2xqaekra+wn62Xn6OdoZqZp6ucraOlqKmyrp6Vo5Cir6a3uaWuo46OmqGZk5KboJmYpJV7payiqLPDt6Shp66fnpWeo56jnKOqqJKeoZ6gqrGqq6OqoKmbpp+ooayWoZulsKSXnKqVoZ6bkqWXnqqYnn69g4dytHKEnYataHi5xLhxk6Kje6aYmXOqgnzLwMC7cYuih4KffZWYiZ7AvYKWnZ2NncLBe4J7koyaw8B9aqWxb4yAb8p6f5t3koOOgXZ6gX95cXp/h3F4hY2TeW12k2NmX3hkYGWCY150Z21kYlhMVklRWkhPRDJJRT9EQj4vPD8+QEE6OERDQkNFSElLTU5QU1ZZXl9fYF9eXl5eX19fXVxTTVBHVU5BPz89NjQ2ODI3NiomJSMpKiYuKyopMTAfOSojPklbTCojQlAvI0ZbM1BZL1VBQjsvOJajuMO1sK/AqaiUo6+psK6tprK1r6mlpqawq5+rmJqin5ybqqeinKyjpailpLSknaKSpq6ruLOnr6KRkZqdpZKRoKGXm5+dh6arpKutv8CxoKmvqZeSn52imaGjqqOToKGenq2vqaymo6OnoaWmnq2pkqSbqa2pnJ2qnKyhlpellqGjl5x/zpR4eqSBeZWWm1+uj16Op4GioHynlZt0q4OAr15jjap6p4eFoHSXkoizY4KrhqCOjbNqhK50fZaHuGGDrVmjzW6PdXvae3+ZcH6IknZ+ZXuIdnZrfYhufoWRkn5tgY9gcWtwZ2BfeWRccWhqY2ZgUlRSV15LT0M1QUhFRDg+NjtAP0E7PThAPj8/QkRERklKTE5QUk9TXF5fX15dXV9gYF9fXVpXT1VKPT8+PDU1NzgxNjQoJyQhJywmJi8oJiszHTYwJDc7U0wrLC1KMCc7XDtMLSFQQEY0LjGtwr+/tbSwt5edkaSqqK2zq6WyrKyrpKunr6qgp5uZpJecoq+foJ6op6OloZ6wrJuelaeurbGqqKyglJKbn6WTj5+ll52no56tpKqwqMDGs6ipsa6Wkp2copefqaqflKGfnZ2usKirqZynp6Siq5KttJemoqqpnaOnpaGwoJKap5qgmpSUkZegcYWMl3SEqIdxsXydcax+oZ6BpY+ed6qCfa1/nHKtfquHhp92mJJ6fJd+qoiijJGMnX6re4mTj5+Ae61WnMR6j2+SwX2BlW11cIxtZXZlhm9hd25yb4qLkpCDbZGRZXB0dXBgZ21lX29paW5mY1dTXWFZUlNDOUlJQEQ8PjxARkRDRUE9PDw8PkBAQUJFRkdFQENJU1dZWlxdXl5cXl9hX15eXVtaUkM+OzkxNDc4NDUyJiMfHCAxJyAxJyAnNB41LSY3PVdKLTwnPjEpM1ZARiEcRzpDMS4rsNTGxrK0n52jjqOjoayvtq6psaeoqqetq6unoqOdmaKVoKarn6GloKioop+dsKyXmpaop6+sqKepnpeVmqOikZShrZudpqOvrKOrtKq6zbGtpq6rlpScnaKYn66snZagmZ6fqrOpqqqbq6qko6ybsLGiqKyupZimqqmpsaKSlqOlmpSShKRqpHWJeql0erJwgqWJmYxxiKCah6RgYFKrhH+ug5t2roGmhoafepmWhntmgKOJpJmFgqN9qX6BlIeuXnypVZ2ikoF6op+Ae8OvxYxzr7OzuXFiqa/CdGiNjZiPgW2ak3BueXh3b2xmZWVycGZ8aWJdV2BpWFhVTU1RTENDQUI7Q0BAQkk8PTo5Ojw9Pj4/QT04NjtETFBSVFZYW15eXVxeYGFgX15dXF1bU0lCNjc5OTY3NCwmJCIgKCciKy0iJC4hMy0mQERXSCxHKzU2KjFQS0wjIEE5RDQsJ8PJ1tW/oZmrp6Gvop6wtLCvqa2ip6aqq6uppKagm6WfnKanpqOcrJqirKGkn6+inZqSqqS1sK6gqZudlpSmo5CaoqigoKWcsaajp7GstsiytaqsqZWRnZyimaCls52aoJSdn6esrKSumqyqo6KrorOuoqqzsaGaqqiur7ajk5ajp5ibkXyqbJ6Eh3WreXywb4KkiomflpWflIHSuLS4yYCBsl9flKmDpIiHoHmYlZp4qsl0maOVp6mQk5qMf5uJmsbGeGWhgqVzgZ+Ogn2vXnC1Y7F1S6OGbadHgpNkj5Ceknxwl5OAcXt1fXtuW2Vqc3FmgWpfYVlkbVxeWUlNTEtFREFCPkE8Qj9KOzc5Nzk5Ojs7OzMuNjxBRklMTU9RU1daW1tbXV5fXl9fXlxcXFxcWE1CNzU2ODUvKSglJiUkJiksNEVOUFBNRktKVkYqTDAvPi01T1RRHRw7PEYyLCSnpMHGuK2psq2spaKcsrmsqqGmm6ilqquqp6CmpZiqo5+uq52moKyanqmlnae2n6KXk6iqtrKsm6acoJWQpayRmZyno5+ppq6ho6epsLTCsbOqraiTiZecpJqho6+mmKGVmZylpqubsJ6tqKeerKO3raGyua+dm6+ns7OzpJSXp6OZn46CnU54moF/n3qDo32DpISHp5+cnpOEuHt8ebmCfszGwrZ4m6GRi599mpaWinaemIqkmKOofrCFnYWehKx9mZRhpWyjcI+FkIF9l4NyrGCkc3GAmmC8fVJVdY6SpJd8fZOSi3V6c4V/cVxtb3hyaoJvWmRfaG5jZF1LTVFUQklIRkk6OUs+QjEwODg2Njg3Ny0qNT09P0JER0lMTlBUVlhZWltcX19eXV9fXFpaWllVU09IQDc3Mi4sKi4rKicmP1FUVldXV1lYWFdVT1VGPEUzOlBbVBwbNj9ILC0gi4eZqaukq7irr6Cboayzs6afoJWmrq2uqqedpqaao6egsq6iqaayoJmqpJSjtqKilZeiqbS4pJyinaKTkKGxmZ6cp6Whoq+unaSoobayw7Guqa2pkYeQnKecoqScpZeemZqapqSpmq+irqWmmK+lvK2ht7etnZ21sriws6aYna+ho56Fj9G1w7d5h46FkZOQgaZ4lKJ3jKCRhKWBinGqhoS0bnJqmaOblYqffJiZhoePc6+CpZuijaaLk52JlJCbbXCyXKVzk3qcbJl/e5l9bqlho3Fxf59ic7K4aHiPlKaZfoyNk4x4fXmOgm1peGl5c26AdF1kZG5tZmdgSltYWDxIR0BVM0BGPjwqKDYzLjAxMykmNDo7PD0+QENFSUtOUFJUVldXWV1fX15eYGBdW1paWFVSUlFGOjIyMzAvKysoQFFSVFVUU1RWV1dYWFdVVlZUUU9RW1UlITJBSCQpJZNzjYqtv7+7urWelqekrbWho5mVo6mnrqqrmaain6ahoLWno6mnsKOUrKOOpK2jnZCamqq0tKSdpJypkZSXraCgnqajnKectJqhqqO2q8OvqaupoYyEjpyhoKailZqanJmbmaelppisqK6jpZuup76slL2wrJ+isLO5q7SnmqixpKeYeqiQfXywd4qBpKWInG2yb6GHrXyhjoOnlZiArIiFroWflKmgoZaGn4CZlYB7kn6rgJ2alouqeJ2gj4mTkoB5r12jgXymp2SdgHyXdGuuXaVrcIWZXWBbjKBtlZKnmYOUjZeMe3uDl39rbH9ifnRtgHpgZ2VxbmhnaENaYVs9S1QyVThCQkM3JCQzKycnMywgLzY2NzQzNTlAQ0ZJS01OUVNTU1ZaXV9hYGFhYV1dW1pYU1BPTkk3MDUyLiosQVRWVlZUVFVVVVVUVFVUU1RWVldYVlVVUUhGSUojKCi9kpqEqcbCtsG0n5qsoK24paOOm6Sin7Cvqp+kn52tmZ64oKOroK+pmq6hkKuppJaJmo+usKymn6earJeYj6yioZ2loZqknK2Yn6imtqnAr6Wpo5+LgI6bmp+mnpKVmpqUmpqmpaSaqayso6Sgqqi/pJfDrKqioauyuaqup6CzrqipmHavfpCLnIWHfLquiphlsIxlla19oY+DppWagayKhLCFpZmkoaGRhaBbbGqBs2B/rXt7goGxbGdvmZeMiLBbfbRbpINryKJln4B7vFl2tVqyfVKvgHqsWIChbpiQqJuLl5GXl3x5jp1+ZHN+YoR4dIB8YWpncW1mZWVPVWRcQVRfPkooPjk9NCEiLCUfMi4gKjEvMDQ1Nzk5PEFDRkhKTE5QUFJUV1peYGBgYWJeX1xbWFVQTUpHQzU1My4vQFVaWFdYV1hYV1dYV1ZXV1dXWFdXWFlaWltcWFdXR0I70p+zsre9u7TBs6ObrKaltqigi5qgn5yzs6mfo5+dtZigs6iqq56vrZ6sm5WvqKKOiJuOr6yop6Knma6SmY+omaKdpZ+Zo6KlmZ+jqbKovK+lqJ6djn2Lm5WgoJmPkpqbkZqYqaChmaiup6Wmo6Wpu5+gxqelqaGrtLWsrqaeu62srJWAqZKjr46bgIekl5iQgYC4w7qDjpyThKeWnIKsioKviKabm6WqkX7VvcKqYqO/vX1+o4KD17q4tYWUk4Oevb6EaqOBb6uEbZ1/erKwx4Nqq7C9rHh3or68dIGWjqeckJuRmJ16gpGbemN9e2SNZ3mCe2BrZWtqYlBhW1NqXEBVYUNOKj06NC8eHyQeJTIgHSQoMDQ5NjY3Nzs+QUNGR0pLTU5OUVRXXWFcX19hXmBbXFlUUU1IQz88QT81PVNZWFhZWVpZWlpZWFdXWFlaWllZWFlbW11dXFpWWFRXWryVs7Sxv7mxvbKina6mpbKmnYyYpb+quLGoob+mprKcnrGcuaiera+lp5SUsKuXjIObka6mo6yhpJypn5iLo5KmnqecmqCoopieoKytqrmuqKOal5J7h5mRppuSjpGYmI+YlKmaoJipqaGqp6Giq7ueqcWjoK+jqrO0qq+poLqnrq6ac3WqpLeGZYmgcGetj4qPbW94pI+Zn4F1rpmVcI+LcZWoo5uXrqRybW1tZYp4b22CmXGAeWlxaWeJlpWYcWhphIZncIZkXYljam9ZXWd+d6ZgYnGOkW9lZICNk4+imJiZkpeffYeOlXZmh3hojmt5f3lkbGNmbGJLZFdKbFk6UWVFUidLOisjHCAbIywpGBsYLTIuNTo0NTc6PD9BQkRFSEtMTU9RU1ZdV1pcYGBhXV1bVFBMSEQ9OkFCN01YWlpZWVpZWFhZWFdXVldZXV5eXVxcXF1eXV5dW1tVV16ola2zqbm5srOqqaGunqOyqZiSvrLDyL62qp7Aq6yjoKesn7qjpK2sraaNl66pkIyFlZatnqaqoZ+jo6CRi6SSp5momZajqaCWnKWmp6+6q6yam5KSe4SXjaWYjZGRmJSOmJWolZ+YqaObsaeeo6y6n7DBp6Szpqywsaqtq6e4o623loqgqKW2nYmWopiHqZqQlJ2TqrOZm6OroLGWoaGdn6KcoKShlaunjZOSjIeSnJyUkJqTmJCOlYWBpJqXlY2LkpKKj4aEfWeKf3SCdnSHi3CnbXuUkZOSgYGOkJCPnZShlpmXooOIlI1yaZB3cIt4d3x6amxkZG9kVWBYQGlbSGNhT1orRj0rJyE3NDAuHxwhJTIoKjY5OTQ2OTs+P0FCREZKS0tNUFBRWFVWWV5gYWNcXlVRSkVEPjk9QEFTWFtcWVdYWFhYWFlYWFpbW1xeX19gXl5eX19gYGBfWVlgppapqqW1tq6uorCkrZ+gtbGQjqzGvcS7uKqipZ6bpp6wqKO2p52ptaaokZisoouIiY+cp5aspKCZp56ek5WjlqiaqJmUpqGjkJuomaG1uqermJqQjXyBlIuglIqUkZWQkJSXpZCfmqqgnLajnaest6euwa6jt6evr7CsqamyuKCuvJmRpaSmtqKSnaafjamfjZKfo6yvm6GjsKivl6OgnKOpnp6dnJarnZKZoZuUkJaqmY2ZmZaQlp6RiaCdlZSFkoyQjZSKgH1mi4Z1hnZ5iINznGqGkJSUkIl9jJaSkpeToZOdl6KEiJiHenKWc3qKf3J8f2pvZF5wamBbX1luY1BgZVBbOkdHRT4yPT03LysmKykmHSY0MDY2NTg6PT0/QUFDSUpHSktMTVNTU1VaYGBpYGVWUEpBQ0I6OUVNVlteXltaXFtbW1xdXV9fXV5fYGFhYmFhYWBiYmJkYlxbY5eVpKijsLOsrqOpp62gp7WqkJCdpbO7r6ysoqOaep2isaSlsKmWm7imo5OZqpyOhoqJnKOQrp+jlaefoJKWmJuuiqqWj6iZp4yZqI+eubakpZibjYl5gpOLmpOJlZKUkI2Sl6KNnp6pnp64pICEr7WisK91pL6jsqB3eaCqsbuUdayknomAqn9kXGJ2oI6knoSXfm6Ts52jp62qo2Wdn5JzeZmXcICYqJdsf6KoimWcpZyRl5iVi5GckIadmpCVg5KGj46SiYR3ao6HdoZxfIaAgGFph4qUkotadZWQaGiPjnJ6ppmZZXmZh4J4mGqDioNveYBrcWVfdnBsa2hcZmViYnBTXD5NTk5TRz5AVEM6MS8eHyY0OjMxNjY3ODw7PkBBQkZIQkdGSUtNVFRVWV1gaGZnV1BKPERHOzhVUltgYWJgXmBfYGFhX1xdX19fYWFiY2RhYmFhZWRjaGReXWablaajoa+xrKuppamuo6etpZKWq7awsqaaqqerl3OMnbCfqKunk5e5oKCPnKSdkX+IiJuejayaopSnoZ6Ol5GehHWuj4immqiRl6SIm7q0p6CZmIuJdXeTjZaTipSRkJSMkJOgjpugp5mcspaAjJy1nbOMko+8p6B+p6J6oq63gY6Opp6Di4aQsamvjIqWo5p5gYushpydoqepp4eVhZh3pZt6h5uBl6aCgnucsXqKhaCXmZSYlYGRl5aEmZljeYeQhI6PkYqDbXCPh3mAcYCBhX+GdIaElZJ4lmiSdKCadH2ZhKGeh5h+kouDg5lrjo2FbHh7cXFnZHhuamxqW2VramZ0XF9IVExRQEU1LllVVTcpITA5PT42NDM1Njg7Oj0+PkBESUBKRUpLR1NYW1lbYWBoZllRSDlFTDs+YlZeYmRlZGBhYWBiYl9dYGFhYmJiY2ZnY2JhYGVkY2djYWFonJejn6aurquorKCosaanqqWZlK7IvrChlqaptZ6Pg52snKeioI2Qvp6ajZ+aoJB9ho+Zl4isnKGWn6CRjZOIhoCRqI2Hopyjk5eehp66sqeem5KOhXB1kImVkIqUj4+bi4+Sn5KXoKSWnqyIn7SJtJqtisqHqq6It4WMr4KwroOpjaWYjZ18qI9ye3ecj6eWaJWkebSLn56mqJKYwoF/q4iYoXGegJmkfZeFlbGAoXyhlKCQmJaAjpObipeRi3yFkoaNlJKJg21zkIV/enKGgYR8hHWEgZeAj8Vmf6mHj6NrnoOim4OagIyOhYqZcI6ThWh3dHx3aGh1cWdoa15kb21nbVhoR11STTJFNDZOYWM3JjM8REdEOTY0NjU4Ozg+PT0+Qkw/TklKTENQWl1cV2FdamxcUUU9S01ASmRZXWNmaGdiYmJiY2NgX2JhYmNjY2VpaWNiYmJlY2FmY2JiaZSXop+wqKmopaugpLmxqqummpSgo6Sqo5alqrejr3+hp5ylnp2JlL2ak42hkZ2QeYSWlpGIq5mbm5mhhY+Mdpucj5+QiJ6km5WZmIaiua6kmZyMjH5ibY+Lk5CNkIyNmIuQkp+PlKChmaGofqGnh62doJatj56cnZGFgKCNqq6Go42pmYyafqJ2gJmUa4KsdU2reIeNnZGbqKeAqat9g6F7eqdpnn+Sa2eXhpe2iZ59bmBkWYOWf4x7ZGiKcpl9eZVsXXuWbV9TcINcX2t5g2BZZYJ9g4CXcKeqa4OjbnKlcJ+En2lln2xbbop8Zlpgg39iV1Bvd2ZtdHJram9eanBtbGpYaU9dWEY5QTRHRF9rNCxJQ1FNTj04NDg1OTs2QDs7PUFPPlFSTE1CSlxdX1deXmJ2YE1EOk1PTVRiXFxmZmlpYmJkYmRkYmFiYGNkY2FjaWtkYmRkZ2RiZ2VhY2iXlp2guaGqo6askaG2vKyuo5mXoKKlrK2hna61oqiSoaCfppuZjZi0mZCLn4yVjHWBlJKMiqaWlZienn+ShYWspIebkIqYqJiZmpGHpbGnopWaiImAaW6IiIuOjoqLjZKLkJKijJSeoJyipX+TgY+joZSgd5yWj6eDoad/hqmshKV4inyEmn2icHKTiJZ7nox5bYecjJmQm6iaj4ede4Kic3amZp5+dqRfmHp9knOibpi3tLp0koeCf7WoZIHGuHtwlbeLcYCapGNzrKtgfWqds35ufIaCjoKLmHF/o2xyo3OehICkYJyYs5ZxfJeftHRzW56yg2pib3R2cmhvWGtsc3NmXWleYktFPUQ1UUFacjI9U0dfSlI9PDM5NTo6NkQ7O0BJUT9VTU5RQEVfXltZWGBgfGRIQzhMV1VWYmFaZmZra2JiZWFkY2BhYmBkZF9gY2tuY2NkZGhkYmdmY2holJaVo7iZq5yToI2kt7WuraCbopyjo6atnJuxrayTl6GZoaSZmpSeq5uLiZJ4i4ZwgJaNiY+hkJKUnZd9kImOqKCHmI6KkaKTm5qMiqiopZ6PloeEfmt7h399kI2Di5CQiY+UoIOXnqCdoJ+LiXecmKKMn3Khi4eoiJulj5anqn6tjH56oJl6o5N4gXSWiI2cfZagh5uOmZumhqJkoXyIlpCbjWyeaJuNbpqZe4CKp31yaHSrg52DdKpnlJpdm4V2hJ1oqmqAuGZcqHCBnGGVjF6ndnaIiX+eaJp1hpOSl45/n26akG2nmV2ofni7a36qW46EXbRnXG5yeXhraVxxanl5Y2BmWGJBUUVON1ZDUm40S1paX05aREAxNTE7OzdIPzpDSFU/WVJZXT5EYl5WYFFhY31pRUI5TltdWGRmWGZnbm1iYmVfYWFfX2BgZWNeYmRvcV9kZWVrZWNpaGdraZWciaq1m6eJY5Sbq7qysKydppycqJ+erpuesKisnZekmqGfmJaWoKOZhomNaoiAcnuXiIuWloSRlJiPeoqElqOdipSPhYudkZyciI+oo6CZi5GKgIBpgIZ5f5eMe4iOjoiPlpp/k6KfoKGTmHJon4qfj4xwkoyBqYeYnqKnn6d8r62joriXd6OzoqSAiJR5nXurmn+ijp2bl4iXcaF8hY2vtX1rmpGheH6YtKOjq6iEmXybfZ2ZfnSqWl1ve5aLeJ5iTH56eoVjeZdCTJ5ZompxfI5tgYmEmXWbeIaJsbN/f5uTp3aBnW1yfZRvmXNqpF2VdkhlY2BzcX5/bmZgbGl2e2RlYlJeV11VVkBZRlFnRFNXW2JYXklEPUI4P0E6SUU4TEVXQVZRW1ZERmJcWmBLYG1+cUVDPFVfYlplalZnaG1vYmZnXmFhXF1eYWhiX2VjdmxeZWdma2RmbGloa2mTnYGxrZmEVF6gprO5s7OpmqKMnKucnKmUoaukoaiPn56dmpmVmKCdloiHiXeFgW55lYWQm4t8kZOWiHJ/iJKhm3ORkICImJSfmoSOqZyalIqLinyDbISFcYKhjHiFjYiIkpiVfJOjoZ6iiK6GfbWEjp6ce6WWeqmBlZyPiqCcfKdod21+mXShc3F8noaZcJODrn2kg6aemoCjb16oZ3WjY2+lYZzTkHx7mXhyc2OihZB+o3Ojj3VrkLOLYIKYiXOqsqi8f3eDbX6+pqm0XpxufXGXboBzonJdpGdzpmFopm2b1Jl9hJpveHqXa5t7d5dzbamkZ2BleXCAhGtnZmRudndnYGNTW2ZRUWFIV0lUYFdTW2VqXGVRRkNLTUpLQkpFOFBAUU5XUllPU1FgZmVpU2N3eXdJRkVjXmVaaGlUaWhqb2NqZ2BjYFxdXV9oYmFoZXxkXmRnZGtkam1naGxol5t/satUXEt+qa+xtLCzo5uZhZmooKCkjqSooJipipmYmJOZk5KgmI6IhntwfYRofY+DlJqBd5GOjolvf4aQk5Jsl5N8iJGRo5WDjqqalJKLhYl5g3aIgG6Cn4d3gJOGiJmilnqToqSan4mzoaK2i3qsp6SupXCogJqQhYCbkXukgKGZhphynoSjrq+Kl4x/jKSNloOuoZR2tLW1yaFzlIqBn2Cdl6lteZWGoJt1oYd3oH6RloqAb0xmo5Jwm4dypHt5dGGDgWt+oGtxZGCccn50l2l6abO1tMamc5h+ep1rnJurdYSbbXV3mGmaenWYcVBFfbReanZreYhmamhidHVwblZeVFlpUFNoSVVMWVNVXWhrblZnV01KQUpNS0hKTkFRS1BlY2ltZXVzc395fG51iXt7VFBObF5oW2tpUmpoaWxnbGZjZV9cXVxeaWJkaWt7X11kaGNqZm9tZWlsZaGciK+mhGY/lKGyq6+vtqKikICXqaKipYylp52dpoKal5aNl5CPnJOOiIN5anmGZYOMf5egeXWPiYyBaYSFkoOMhZ2NeoyKlaWSg5epl4yRi4GJeoB9i3lwkKGGeYGVh4mWoJV/lKWonJaWhGZueJxsomR8caV3m5hwZ6aAlot7pHqfloOXcp52gYqUlo+5bpCKomJ9maGViG1yaatqdaBtbqZfmmmLkGiWh5qVdaKAfZpgi4WMdG+IYmigZZ5+aZp1b2NmiIJtcqJaX1tjoW1diYxve35zcmSlbXeiZGenaJlzjJlvom9TiZBvoF9lp1SLXlSYbm1za3KCbXBpa3lza29SWVdXZlpTbUlYT11JWGloc2pZa1ZRUkVWXExYUmFVaGpfd3R6fXB8fHKDe39zdo2AhHZeUXJiZ2JwZ1BqaGhrbG5oZGdfXV5dYGtjaml2dV1cY2ljampzbGZrbWOcpJimemV0bYunrqSpsLGmn4uAl6udn6WMoqGaoqKAlpiTjZqPi5iQjop7hnGAiGiLi3yYm3N0iX2Qe2SCh5WKiZWZgnyIhpankIChrJCFkIqCin2AgI5zaI+lhH2GlI2ImKCOiJOqp52JpniWm3+kiJaMspiekIKvl5+ld5SHeal0pI6Emm6kooyShIyDu259pa+ChoaGk5acoHylenGolaCWZp5+b6tjloqVkneobKmigYl1h4J3q5Gmh2qRsGt2s4ypa4qGbW2fnpKVYX+ri6p2f3+MpZ52n32EpJWdoGqbiHesZ5+tjbZ0d76NpJNZg6aNq2F1cnRwfHRxY2p+bmhsU1ZbVmFiXWtNXVJdSV1tbXZgW3FZW2BaZ3Rlbm9xY3F0YHh6fnlyeYNzhH6Ae3uMgYKAdmJ4ZGNtc2RSa2dob2xyamZpYV9eXGJrYm1sem9cXGJpYmxqd21nbG5ilaWqnYGAnqSWqaqdqKeupJmJg5irmp6kiZqlnamdhYyajoackYWSjYyNdIZ6iIRvjYR+mJN0dIZykoNtf4uSh4aTj3x7gYWXpY1/paaOgY6JhZV2goeSb2yLqYGDi5SOiZyfiY2Uq6Ogj4B1lJaIfoF5lK6jf4GbcY+FeI+Kg357cqaMcX19epeWm4SOeHt+foeUlZOKdpCYn6CDen2Ja4yFW3l4cnpwaG5+kolxf3SCj5STcYWDgmWMf16Bf4t3dXOUdW95bm6HbYSFXnZoeI5lgIGFjqmbfXR8lmqJiG+Adn2Gdm1tZ4xzeXuYeIRba1h5j2lud3Jxb3h4cF1shm5qZ1ZaYFddZWtjVmFVX1FfcHh5bGt2ZWpranZ8cXJ0c2FvdWJ0e4F4dXqDdoCAf4B4i4WDfXttf2xkeG5eV25naHVreGppamRcYFpjamVscXVuWltia2RsbHltaGxvYY6UuKimi6GimqakmaScq6KhhISYrJKeoYmappupmIOBm4p+lpOHjoqJjXKDfI99fo+Fe5eOc3KEcJWFe32Si4aGkIV4fn+GmKONe6ehi4aQkIWWg4aOmHdyhamGjpKckIienoeMm6ifoKqDiY2Umn5+iZatqI+Spo93b52RgnmRb32ohXB9lXFrcH2Bn4x/k46MaG1dg4uMnJuejnOVi4hxdGuBdnSBWXJuh5GBfX6Mal1qZHqFg4iAX2l4ept7gouCdoGGgmd3ioZrYXBygnZfcouBiY+mlYVmjI+DbneLhHGGj3pwZmdke4N6lltcamdudlt7eXd1bnNzgmZcbYprbGNZWV5bWWxxXF9hWl5dZnR+e3VvdGNra2p7fXJ7eHRkbXRobXx+dnp8fHp6gIB+b4aKhHt9c355c39pVFxxaWx1b3Vna2hkXWFYa2hsa3FybVdbZW1sZ3N5b2hqbWCLi6mwoZCjoZqenpiemaijon6DmK2Nn5WIm6KRpZV/e5iEfJKZiYiGh4pzfYCLdoWLgYSWinFvgHKYhoN+k4SDhoqBeoCDi5ufj4KnoYd4jpiJlYuLnZeFg3qtgpGYmZSKnp2HiKGrn6Kio4uIk5uco5mWqqGnpqCSm4eVjXt3jY6Ep35/kpGSk5yxppuVnpCNspOYhKWMjJWbn4mQm4KIkYprfI13eGWChpCKfImdhIeLkIiIgIWEkHd8eXSaoYiGiZ6KhJR+fYuBgXVwc4WDf3eHh4qQppGEhY2Hg42QjH2Ii4mQgndsgoR9eplqcmhhdIpwfXp3dm92dIFdXm+HaG9gXlpcXVNoclVjXFxhbGh1fHxzb3Bka2ppf3xueX9xaXBwbGaBe3KCgHh/fX+Fe22CjIV8enh8fXqDeU5kdmpybXB6ZGtlYmJgW3RmcGZycW1VXWx0bWl5enFnaWtljIeduZ6WoqGYlZmYlJmkoZ58f5qrjp6NhqCci56WfXmUg3uOmYmGhISGbniAgHKBh36JlIRta356l4aDg5B/gIaEhnyGg42bnZKHqp+DcoqQhpORi52RfY16qoSNkpiWj5yXh4ebpp+imp2Gg5GamZmQmqagpZ2dkJaAkIp2e4eOhKV7fI6QkYaYqqGek52QjquOkYCejIiTmp6Cjpd+ho2Cb3eFcXVhfoKPhnWLmIGDj4KGhH6Fg5RteHV0kqKKjIWZhYSNdICJfH1ycnuHhHt4i46EkqaPhoOPgYSKiop3hoiJjHxva36BfG5obG1nXnp/aHx7dnR2dXt3XGBwfW51YGNbXV5RZ25UZVteYWtpdnp+cWxsZGtqZ4CAbHOAa2x0b3lvhHlthoB2goB9hHZxgo2Hfnt7fH97gopgaXtqdWhpgmVqY2BpXGR1aG9idG1sVWNxeWVwenpyZWltbYuJnreaoaOfkpGWl4uan5+ee3ieppGbioellIuYmXl6jIV8iZGDjIKCgm58f3hzgYV9i5F9a2h9gZeIgYiOfH2FhId8j4CPm5uRiKedf3CLi4yTh6GhioWNfKiRiJCSl5OWk3iMo6ChnZaaf4CQmpiSjJqjoaOal5Gbfo2EeICDjoegf32MjY98mKSgoZOZkJCnjZCBm5GJkpebfZKSfoaNgXRzgnB2YH1/jYZyipV8iIxxjH+ChYaOaHdxeIyYkY9/ln6HinKBhnx9cHh7i4R6epGMg5alk4uGkHyGhoeFdoKEiIh6ZXJ8f3h6cWxqZl5+c2h8dXZ0fHOAal5gdHZweGRjWV9eUmtoVGVZX2FoanZ4gXFma2NsaGV/gWttfWhvcWt9eIZ6a4uBc4GBfoF0doKNhn58en+BfX+PanKDbnNpYYdobGJfcVZ0b21uYHhobVdqdHZjdXt6cmJqbnmJjZ6ykqWlnI6QmI+GnaGbnXx2pKCOl3+NooqImpZ4e4aHfoOJf4mCgX9xf3t0doKFfoqReGdjfYaXioKKjXh9gIyDeZaAlZeWjZWgm35vjIKRlIamm4eNiYSmlYWTi5aXk5J3kZ2hoZeUl3p+jpiXjpaanaSdmJKUm3mPhYJ3hJaNnX6BiY2Mc5einqKTmY6PooyMg5eYg5KWmX6YjXyIjYF2cX1uemSAfIqFcIaSf5CCbIeCgYCJhGV1b3uHkpeMfJN4i4l7f4Z8e3F+d4mFeYSQiouXopWChIx3iISDgnd8gomFdmB4eH10fnhnbGRhf2lqd3N0dX1xfGJjYXNudXNtYVphXltsZVJjWGBhaWt2eYZxYmpjbWVofYNsaHRobG9pgHyBeW2QhnGAg4N/dHyDjIF/fnqCg358kG12iXR0bWWKbGpiY3VWg2lxbmB4Z2xianZwZnl7eXFfcmyGhY+crpemqJ6NjZeHhp+Tl5l9eKqcipl6l52LjJiQeXuAi318g3uAg4F4dHh6c32AhH+Ji4BkXn2LlYd+hYd0fX6Jf32XhJeTloyjoZh/cod7lJKKp4+MjoqToJKDkpCUl5GLgY+YoJqSkJFzf42SlImdnZ6ml5eNlZZzjY6Ka4WXj5l6h4iQiW+XnZqjk5WKjZ+Mh4KSnH+SkpWGmYh8iYmBeXF5a3Vse32Lfm2FkoKUd3CCg31+in9kcml7gJaXhH6Nc5CIg3iHfnV4gH2GgHyDjISMlKSPeYSCdImHfYB0doGIhG5he3V6cX1vYW9jZHtibm92c3h3c3RhdV9vbHVub1xbX15ea15QXVhjYWhtdHuIa19qZWpjaHeIbmZsaGpsaIF8e3dvkIdzgYOEfXOBhol6gn16gYR9fY5yeot4eG5sh2toX2lyYodocm9ldmdubGF5aGt9e3hwYXdti4CZmaqgo6idiouShoqei5WYfXeumIyXfZ6UkZaUiHd+e4p8e4B2d3+AcHRze2+FfYGAin98YVx+j5GGf4SEc3qAhnqPkYeSkZuSpZyVgn6BfY6LkqSJjoqNmJqNhpGYk5aOioiMkpyTkIyMboOPj5GJnpmioZeWiZaRboiZhGaFmI6UeomFkItwlpqUopKSiYuajIJ/kZ58ko+Si5mOe4qEh3NydWtxbnR7i3RuhZCNknF0gHuBgYh8ZHBseH2Zk32EiHSQioBziHlvgH2AhnyFjIiEjJWojHuIfH6LhXh+cXCAhYNjaHl0dXB8Yl5wYGt0XnBqe3l4a3NwZXhdbWxzbXNYWl5fYmtaUFdYZWNncXF/h2ZdaWhnYmdxjW9kaWdkaWiAend0bo6FdIGCg3t1gomFd4V8eISFeoCJd3+Le3tyeYNqa19waHSAa3JvbXFnb2xlfGNugHl2cWx3d4p+opehqKCmm4eMi4GQnIeTnHWBqpSSjoegjZaTkIB0e3aFd3h/cnN7hWtycHptinaAgYducVtYfpGNiICAgHZ1gIB/oIaQipKcl6GUmHiKf4GNiZyeio+GkpiWhYmVmY+Wi4uNjY2dio6Qg22IipCRiZyWoZyYlYWXiGqEo4JmhZ2KkX6Lg4uBd5OYkp+SkYmJlY5/fpCYe5GNj42aknyKf4JudXBsbW9we4Vpc4OOmIpwd390goiCeGZyb3WBmY58iIR6lJF5doh0cIl7hYx6i4aDiY6bo4h8hHaCi394eG9rgYOBXnJzcnFweFpecGBwal5vaXx6cG1tamx2YHBvanJtWlhhYWJuWFFUWmZnY3VwhIJiXWttZGJma5NtYGZmX2drgXVxcnCLgHV/g4B4dYCLgHiFf3eHhneDhXuGjH97doqAanFjfGOGfG9xbXRqaG9sdndfcX95e3R1dICCfqSVmq2eppaFjIN/l5SDkJ91i5+Uk4aLmoyVjYt6cnh0gnByhXRxdYhrb211bYh2g36AbW5VUYGrlIeCeIB2coJ5gaCCkYGTkpickpp4knuDjZOkmpOOiZWZkoSHl5mMlIuJj4+InoSQinxyioWJjoicmp+alpSAk35ohZyHZ4Wgh5KDkYOJcYORl4+bjpCNjJCNeHuSkHqOi4yRlox8iHyAa3ZqbmtrbHp/YXp+jpaCdnqAeIOMfHlnc2x0h5WLfoiGe5OQcXqEcHaMeomMe4l9goyQnp2FfHx3gox9d3FqbIGCeWB4b21scnRWXm9icmBfbG55cGdwZmZzdGhwa2F3ZV1WZmBgclNRTlxmZV15cIh8X1xocmJiZWaSal9oZFtncH5wa3Bzin12fIWAdHV/jHl7hoF4iINzhoV+jIyEe3mVeGdyaoNgiH5vb2t6YGpudH90X3R9eIZ4dHOFfHigj5mwnKWPgop/g5qIgIyff4uak46FiJeOjo+EdnR2c4Bwb4VzcHGDcGppdm6Dbn18bXVzUk2C38iS1pN8cHWDdYOggpN3lZGZm5CZe5RzhZCfoZOUkIqTm5SGfpaWiI2NiJGNiJx/joB3eox+iIuKnJydmpWTeo12Z4mRh2yIo4SSh5eDhmOMkZmOlYqXjI2Ki3F7lIh7joiKkpGJeYV7fmx7ZXJvamt5eVyAeZCOgXp9fn+Gjnp5aHNqc4uPiYGFhX2Vi2t+fm6Ai36Lh32EeoGPlZqainx2eIOQeXNtZnCAg21qdG9oanRuU15vZHBZX2tyeGZramJmeHJvcGNfeGBgVmtfXnZQTktgZ2NdenGJdFxcZXZgYWVlj2RgZWFYaXNzbWpxdox8dHmGgnV2fotzf4Z/e4l+comHgZGKiHx+mHZlc258ZYd+b3Brf1lsbnl5c2F2enuNdnN3ind5n4ubr5ugkIKFd4iVfn2KnYeFn5GOhYyXhJOOh4F0d3B5cW6Eb21ufnJkZHhxfW15fWpobGOkmsHcru+hc2t1g3WEooWSb5aQlaCVnIGRcYaLo5eJjpaLkJ2Wg4CVkIWJj4CSiomWfod6dX+JeIaEjZybmJiOj3aKdm6GiYt9iqOEkYmdhYVei5OXio+JjouLhIptfJaBfYiFiZCPhnaFfX1rfWR4dWlueHNYiHqShoZ5foCAhYt+eGVzan+JjomCgoCMloVrgXZuiJCCj4R/gnp/kJWTmZB0c3iHjXVzcWd1eoNidG1wYmp2Z1JgcWdsVV9udHlhcmNfaH1wcm5bY3JhYlduWlx4TU1MZGdhXnZziW1cXGR5XmBkZoVgY2JeWWpya25rc3eLfXR3hIF4d3uJcYOEfX6Ie3SLiYiWh4x+fphzaHVxeWyLem50cIBXcXp2eXFld3mGjGl3gIlyf5yHmaeco5KEfXCMlHh5i52EhaGNjXuWjX+ZiIR7cndwc2pvgWtpbXx0XmB4d3txdXtnYWV869q1ycPciHNsdIF2ipqIjWmYj4+dlZOBiXGFiaCNhIuWioyYlHyNk4iDiY97kYuFj4J/dniDg3KHgpOblpSYhox1h39whIKJhpihg5SMn4OJYYOUj4eKhoqNh4GHaX2Uf32DhImOjYJxhn5/cXdodnJpc3dsWox8koKGfX+DgISJgnVhc2uIgY+Kgn5/kpB9bYJseIaPhpGDfYF9gJKTkJaIb3F6jIZ1bHFscniBX3Rpbl1rdmBSZXJpZlNfcHZ0YG9gXWiCcHJqV2doY2lYbVZcdUxLTGVnXmJyc4VpW1xleV5eZGd7YGRfXFlrbmZuaXR3in5zc4F+enZ6iHOFgnyAh3Z3ioaOmIGMgXuTdmx3dXl4k3RueHp9WHmFcYBvZ3h3koJkdoaFcYqVhZmhmqKKh3Rvk4tyd46cfYqaiYl8n3+DmX+BeHFzbW9kcn5pZmx3eFteeXt7cXGAamFnYX/Vto6QpnhucXd7cJKQjIdqmY6InJKMhXtpiIuah4GSkYaHmI18jY2BgYmOe5CNfomFenR7gnpwhoCWmY6TlIGIdYOGdoN/ipKcn4aVj59+iGGAk4eFiISKjoB/g2d9kYB+f4KMjpB+bYJ8gnRrbXZ0c3Z1a2KNgY9/hX58hH+EiH5vX3JwhXuPjIJ8fpGIenCDZnmDioaLg3yEfoCUj5CShG5veYx+dW5va2x6fWNoa2pZbnZaUmlyamJRYnJ4bGJlXVpqg21zYVtnX2RsX25UW3BOSE9nZVxnbnGAbFtbY3NgXGNsd2RlXV1abGxibWpzdod/cW9/fHx0eIZ4hYJ9gId1eYmBkpZ8iIZ2iYFwd3l7g5NvbXyBd16Df3SBbWl6dJRzZ3OHfHKRkYOan5ughoh2dpV+bXaUl36IkIOKjZp8i5p2fXZxb2xqYXV8Z2JpdXpaX3h8em1xf2VkaGdXnY9ecXKWvMSEdnGUiZB+cpeMhpyTjIhza4mPloF7lIuBhJuMfIuGfXyJjH+UiHWJhXZ2fYFxdYaBnpSGlY+DgnF/iHSDe4mYnJeGk46dgIhlfZOCgIaEiYlygX1nfYt7eX9/h4uPfGmAfYN2Zm94eHN2c2xqjYWKgYp/eIKAhIN/al5xeHp9jImFe4GPgH5ygWl4goeLhYR4g3yBmIyPjH1ubXuJfXd0b2hofXZkXHFjWG9zU1Nuc2lhTmZ0eGZgXVxYboBuc1llYl1qbWBwT1lsUkRUaGFaa25te29aW15tY1pib3djZlxdYGtqY2xpc3aBg3Fufnt/dHWDeoOCfIGFdn6JgZaReIOKdIGIcnl5fo2Qb298gXFpgXl6fm1tfHaVa2p4hHRsk42Fn5igmYWIbn2Mdmp4mI9/goqClZeKeY+Wb3pzcGxqZGBzemhfZXJ7WmByfHlncHphZWWOsbJ3SmJapNnQl3F7kYuQeH2Vi4WZkY2Gb2yGkpJ6eZKGgYSYinyHf3h4iYqEloBviodxdH56aXmFg6WRhJONg39vfoN2g3iFm5iTipKQlIWHcHuSg32Dg4mDb4F4aICFeHJ/f4OKh3xlfX6DdmNwc4BoeHBvdJiMhYKKe3Z4gIR5gWpccH1ygIeFiX2GiXqIcoFucYOGjoSEc4R4gJmMjYR4bm5+hH93e2Voan1xYFl3Wllxbk5YcnNnYEtsdnRhXVtbWXR9cm9XZ11manBfb05XaVI/WWZfWnBrZ3lxW1tYa2VZY3B5X2hcXmVsaGZsaXB3f4dubH99gHVwgXqAgX+Cf3aBhYmXinGCjXF7hnx6eYSTjHRqen9rb350f31vcnx7lG9ugH94Z5KKgqGZnJKChmeHhHBoepaJfn+FgpmKgXyNjGh4cmtsZl9hb3htX2JveVxkbIN6YXF2X2Vl1Oq+ijI6PouOgHJ5hYiOjXaDl41+k46Nf25shY2Mdn2Pf4WClYl8g3hudoeEg5d3boiEbHV7dGZ5goOnjIOPi4R9bn90doN5hZuQi5CRkoyLhn57kod4gISNg2yAcml/fnhtfHuCioR4YXmEgXFkcWh+bXRxdYGbi4B/hX5zdn2Ac4BvW2x+dHiKgot7hoB8iHh6cWyIg4+DinKBeX+Wi4p+dG1rdoCAdXZdaWl4cFlXfFNacWVMW3JyZVtKcHdvXFtaWV10fnRoWWJbZ2VuY2lNV2ZRPV5mXF12Zl90cFtZVG9kWWVweVpoXl9nbWdqbGlvd32ObGmChH55boB7fIB/gnp1goGMk4VwgItud36Ae3uIk4l/aHt9anR7coZ7c3d9f4x5eIR9fGuMjIObnZaMgYBsjn5raX+OjXt+f4OUgn99iohrdXFnaGNbYmdyb2BhbHNhaHCJemFzdF5jZJugj25cNVmvtXVqgIl9koZ2hpeGdI+LindwbYWDh3V5iXiJfZOIen9zZ3aIfn6Yb3CGfWh2eW1leYiEpYeBh42Jfm5+dX+AfIuZh4KTkJiIi4SJfI+IcXt9hHxpfm1rgHt6anp2goeAcmB3gX5xZHJndYJtdXuFlJGBfIF/b3d5fHR+bFdvfnZ0i4GGd4d1gol6eHJuiYCOgIVyfn1+koiJem5uaW2CgnVuXWhmdHJSW3tOXHFcT1xycGNWS3N4aldZWVphcYB0YF1dYGdkaGlmTlpoTkBhZFtgdmFcdG1YV1N0YVpkbnJXal5haGtnbWxpcHd8kmtohIl8fHB+fnuBf4J6d4CAiYuEcXuHb3F3g397io2Pg2p+e253eXaKd314gIKHf4N+fnpthIyImKONhIN7dox6a22EiZF5fXuCkYCAfoqDcHJwY2ZeWWdfcHBgYGdwZmpvinVhdG9bYWRqdnt/vpymo8i4cYWEc5R9eIaUgnSQjYhycnCEe4N0dYd0iHeUiHl5cWN3hnqAk2lyhHVmd3ZjanyDiJ6CgH+Pj31yfnOEeH+RkIJ4lo2Uj4eCiHqJiWx4eX91aHtpa395c2l6doCDfWhgd4d9amt0aHt/aXaBi5CUfnp+fnB7dntzfmJVdnxyc4qEgn2DcIaKd3hwcIOCjH59eX58dY6FgnVpcWlsh4JycF5oY3NuS2V1TF5vVVRZc25iUE9zeGFSV1hcYXCCc1thXGhlZGNqZFBbcUlEZGFcY3FeXXdoVVdVd11bZW5oVmteYWpnZW9vaXB2e5NuaYiMeX1ye354goGCfHZ9g4iGg3B2g3Jud4KDfomLk39wgHx4eXqBjHSDeH+BgYKEeoB1b36Ji5qeiH2FeneHfGh0ho2Ren9/fImGhHaPgGdvbV9kXFhlWW1yYWBhcWxraIluYHNpWV5kbYB3qdqpx4aHsnGJeHCNdXuHj4B6k4qAdXR1fneAcHF/bYR0lIZ4dWxgeoJ5iI5mcYNvZ3VuW219gJCTgIF5kpJ9eHtth3WAkIuDc5aKkY6HhYV7gIVtdXZ/bmh3ZW17dm1qdnZ/f3xhYniGemh0dWN9emd1ho6MlXt0gHVxgHp8bH9ZVnN9b3SEh3+AeWuIhnN5a3R/g4N9en14e3KLgHxyZ3RlbYqDbXRba191ZUhubkxbYldXVnhtYk9TdHZYUFVYXmFxhG9cYGNtZGNdbmJUXXJHQ2ZfXWZoXVp6Y1JVXHVbW2drYVZqX2BuZmZrcWhwdXiOdGuOjHV/dnh+d4GDgXt0foOIiINvcX90cXV+hoKJjYp7d394hHx8hYd4h3x9gX6FgHt+c3Z5jI6fjYl6inZ1g3lefoaajHmHg3SFhoV3iXpibmxbYltbYVZqc2NgW2dub2eHcmFxZlddY2t/fMrOh7miam1timxxhHF8hIp+e5KFenl0eXV1e2ptdWOEdZGCd3BnXn2CeYuJZXGBa2pxY1hse4aciIKCc5eUd357bodxgYmLh3GWjpCIhYuDe3l+cXFvfmdocmJueHFqbHF3fXx6XWV5gHdpdXhmgnZndIeLjZR8codpb36AeG18XVhxfm1zgIt8gW5viX9xdmd3f4F/gXZ8cXp0hnx5cmZzYW6LgmxzWGtfd1xJb2tOV1ZeVFV7a2FPVHVyUVFUVl5idIVoXGBramZiWW5hWGJwR0FoXWBmXl1Ve15PVmRwWVtqaF1XZ2BfcmZrZ3JncHJ3hnhulYp0f3p3fnmCh4B1c4CGhY6CcHB7d3d1eoeGh4yGenx/dYt+fYWEhId/fn59h398eHZ5d5GTn3+MfYttdYB5ZIOIl4ZzkopvhYWBeoN0Y25qWV9bXV1UZ3NlYFlkcnJngXNia2VXWmBpf3e+rnuft25ic4ZodHxyeoOGen2Mf3h4c3Zve3Zlam5gh3WOgXNqYl5+eHmKg2ZxfWhqa1pWb3iKpIGFf3GZk3GAeHWBbYCBkIdylIiMh4OIhX15dHJvaHpham1gbXZqZ2treXd6d1tnfXx4ZXJ9boR0ZXWFjIaVf2+LZmt6g3RsdGJcb3xrdHuLe4JmdYd9bXFndX54fX9yfGx6eoF6d3BlbGJtiX5tblZrYHdWS2prT1JPaE5ZfGhiTlV1akxQVFVeZnaDZl1hcGhnYFdpXVtraEpFa1piZFdZVXlaTlZtalldbGVcWWVjXnRmbWRxZnJvdIB3cJqFdn9+d398hYd9dXOCiH+Ugm5zeHp6c3OFh4mIhHiAfXaPf3yEiY6EgoR7fouDe3d8d3eanZd6ioOHaXd+fGyEhZSAco+CcYaCfoJ/b2ZsZ1ddW1xbVGRwZV9YY3N1aXZwZWViV1xcaIBwb3KAc4lkZXh+aXR2c3ODhXiBhHl3dHVua3txYWdrZ4Z0jYRuZl1ffW97iX1obHdmaWRVV3JwjaZ8hHx2lpBzfHN7eW17epCEdph8h4aChoN9dXBybGd1XW1oX2x1ZGdmaXpve3JZZ4F3dWdwgHiCdWJ3hYp8lIBui2pteoBwZXJlYGx5ZnJ3int+YnWDdmlrcXR6cHl4cn1mfn9/eHZuY2VhbYZ8bWtWa2NxU0xpa1BMT3BHXntmYU1VdGNKTlNXYGp2fWVdZ3NpZV9WY1dhcF1MS2tYY2FVVFRzV0xYdWRaX2tgXFpjZV93Zm1icGlzbnF+dHSZgXd/gHd/foaEen11goR+l4VucnR7enRxhYWPgoB6i3V0kIB9gZSOgIWEfH6Mhnp+gHZ7o6WKeYiFhGx1fHt1hIKMem6Fc3qFfYGDdW5qaGVWXVtaWlNibmVbWGF0e2pobWlfYldfWmmAamtvgGdsYWh5eWt0dHRuhYF6f312dW56aGp5al9lbmmBd4+EZ2VYYndpfod6b2lvZmZdVVhvaI+ndoF6fJCOeXVvfm9ydXmOf3eUdIWCf4WIdWpydmdob1xtZV5tc19nYWl4aHttW22CcnNpb4B+eXdhd4SEeI+Ec4hxb3l/cWJwaFtud2Rwc4h8eWJzgHBnanhzcmt3dnR3Y4N7fnd2cGRjY258fWtsVmpjZ1NLbGhQR1JsRWF4ZmFNU3FdSU1UWWVrd3plXm1waWRdVl9Vbm5XS1NoWGZeWE1VbFVKXHlfW19rXV1aYmVgemhsYW9vdW5vd3V6mH13gIF6gH+Hhnp5eoN+gZOEcXR0fnp2dIWIkH2AfZBsc5SBe4KfhX+HfYB+hoKAint2hKyff3qIh4RscoJ6doGAgXVuh298gHOJgGpvbWRkWF9aWVpVYmpnW1pfdYJpXm1sXGFWXFxrgWZydH1pal1rdnZodHdxbYZ7fn15dnJsemhpd2ZdZHNoeneSgWNjVGVvZoKEd3ZmaGlgV1ZZaGSQp25+eICLjnpwcHxmeG55i3t2jnGEfX5/hm5kdnNkaGhda2Jdb29bZ19sdWV6aF10gG9ya3F7fnV1YnSFinqHhoB/d3J1fnRhcGxZcHNicXKFfHRkcoBsYWx6b2poeXd0cWaFdXp6dXBkYWRuc35qbFVqXl5UTHNjUUdXYkdidmZhS1RvV0pMWFhna3Z6ZGVucGZjWlhdWHZlVEpcY1hoWFlIV2VRSGJ4Wl1fbFteXGFkXn9pamBvdHhtb252g5d5coGAfX+Ii4Z9dnaGeIeMfXN1dYF4enqCjI59foSJanSWgXuKnX1+hXmAen58hohzcY+ujHt7hpB+ZnKIenR9fXZyb4Zse35sj3picG9hZV5lVllZV2Nma19dXXOFaFlwblpeV1pcbHtjcHd2bGJbbXN0Z3V1cG2FeX+AeXdub3RlaXRlW2d1ZnZ2kXpfXVJmZmqCgXN9YWNpXFRYXmJjkKVoeXSChZB4bW55Z3dte4R6dYhygHh8eH9oZXZtYGZhX2pgXXRrWWVdb29iemVbd3trbm5weHh0dGRyg5J+h4KIenZvcX1yYXdkWm5wYXBxgnxzZnKAZF5udmljZnl6dG1ugXVzfHNxYl5mbm99ZWpUaVlZVE54X1JKWllIYnRjYUlUbVNJTFpWaWxye2JsbHNiYVlaW2F2XFNLZF1YaVNXR1lgTkdpdVheYW1bW19iYl2FaGhhbnh5bG5qdoGQeW6DfoCBkoiEgXZ0iXSMhnNxd3aBd3x9foyPgH6TfnB4loN9mZJ5gIB4eX5/c4iDc3CZont6f4mVeWR1iHlzeHZsdG9+bHl8cJFyXnBuYGdibFRaWVdoY21lXFxxiWVTcm5bWlhYYGx2ZGl1ampeWm1zcWx0c3Rqhnx+gHx3b25sZGlxY1tqcmR0do9zW1ZTZGBxf35xgVxhY11TWmBcY5KfZXJxhYSRdGxqeWxvb3p7enGAdn5yenp6ZGV1Z15iWmFnXF53aFdiXW9oYXdhW3t2amlyb3d0c3RocIGUgoZ+hHZyanB7bGZ2V1tqbWJwc4F6c2ZvfltgcHFiXmlwfGxrc35ycXhrcGBcZWxte2FoVGdVV1JQdltTUFpSSGNzYmBHVWpQSE9aVWtra3xlbW9xYFtaWFlscFdSUGZXV2lTVEZaXE9IcnVYX2NtY1hhYGFdi2ljZG15eGtuaXV5hntrg31/hJl8goR5fYhuj4Zxb3d6fHSCgnyLj4OClnR4gpSFgZ+JdYCAgXR/gnCHgnVvopd0e4aLh3tmeItvbntvZnhwemxzdnONa150bmFnZWtSXVtVZ2JsbFtccYxkT29uXVZYVWdpdGhidGVlXVpudW5wdXV6a4d8f3yId5BzY2Vrb2Fcbm1jc3iHa1pUVmJjd3x8cIVcY19jVFtgWWOWlWNucIOFinNqaHpuZXJ2c3tsenR1b3p+dV9mcmNbXldiZFlhdWVVX2BtZGFxXV1+cGhpc3FzcHV1a22Ek4GIe4VxcmZufG9xblNaZWplcXSBdnNibXZVYnFrW15uZXxlbHV8cnJyam1gWWRqanhfZ1RlVVZQVW5YUVdUUEhlcl9hRldpTkhYVFZtaWR8aWt3a2FXXFVbdGNTUldoUVlmVFNIWlpQTnh3W19mbGlaYmBeXo9uYmZreXVub2h2dn9+bYOAfoaXe3+HgYp/a5OIcmd0gHt1gIN9iY9/i5NyfYqRhYefhnt/hoxzgIZzfYJ1bqWMc4GNi3d4bnqMYGR8cWZ6c3lsbXF2g2dkfGxjZmdoU19eVGdgbG9cXm6OaE5pbWBUVlNvZnNrZXhkZV1ZcHRtcnp4c22Ie4B3nHt6a2FlbG1eYG9qZXB5fmdaVlhga3d7e2+DXmJeZ1ZZYFdknIhia3GBh313a2p3bFt2cWt5aXVybW97gHJYam1fWV1WYmNYZXFjU15haWJibFpgfmxma3N1bm13dmtohYx/iHqHbXFlb3tscWxiWF9oaG90gXNyXmltU2VwZVVibmF5YnB2e3Vrb2xqX1hhZ2h1XWVWYlZTTllmU09dT09IZW9dY0dZaU1JX0tYbWRfeGhufWRgVV5UXXRbVFJgZk5dYVRTSlxaUVl1dV1fZm1oWGJhW16OcWNnandxc21odnR5g3OCg3qIjX58ioeOem6QinRsc4J0f3+IhYeShJWPen2Mj4iRm4SAfIyEcn+Bc3R3cW6Tk5OTk5OTk5OTkpKSkpKSkpKSkpKSk5OTkpKSkpKSkpKSkpKSkZGRkJCPj4+Pj4+Ojo6Pj46OjY2Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2NjYyMjI2NjY2Njo6Ojo6OjY6OjY2Ojo6Oj4+Pjo2NjY2Oj4+Pj4+PjoKAfnp6fX5+fX1/fn59fn5+fn5+fn+Af4CAgIGAgIB/gIGBgYOHjI6Ojo6NjY2NjY2NjY2NjZKSkpOTkpKSkpKSkpKSkpGRkZGSkpKSkpKSkpKSkpKSkpKSkpGRkZCQkI+Pjo6Ojo6NjY6Ojo2NjY2Njo6Njo6OjY2NjY2Njo6Ojo6Ojo6NjYyMjY2MjIyNjY2Njo6Ojo6NjY2NjY2Njo6Ojo6OjY2NjY2Ojo6Ojo+Ogn99ent8fX59fX5+fn5+fn5+fn5+f4B/gICAgICAgH+BgYCBg4aMjY6NjY2NjY2NjIyMjIyMkpGRkZGRkZGSkpKSkpKSkZKSkpKSk5KSkpKRkZGRkZKSkpGRkZGQkJCQj4+Ojo6OjY2NjY2Njo6Ojo6Ojo6Ojo6OjY2NjY2NjY6Ojo6Ojo2NjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Njo6Ojo2NjY2NjY2NjY6Ojo6Cf3x6fHx9fn19fn19fX59fn5+fn5+gH9/gICBgYGAf4CAgICDhouOjo2NjY2NjIyMjIyMjIySkZCQkJCQkJKSkpKSkZGSkpKSkpKSkpGRkZGRkZGRkJCQkJGRkZCQkJCPj46Pjo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6MjI2NjY2Njo6Ojo6OjY2MjIyMjIyMjIyMjY2NjY2NjY2NjY2NjY2Njo6NjY2MjIyNjY2Njo6OjoN/fHp8e31+fH1+fXx9fn59fn5+fn5/f3+BgYGAgICAgYCAgIOGi42NjY2NjIyMjIyMjIyMjJTO2tjY2NjamoGEhISEiF0tMDAwMC1GoaGhoaGhoJqZmpqampqKg4SEhIOEd2VnZmZmaFxDREREREVCMS8wMDAvLICkoKCgoKOAY2dnZ2dmb4SDg4ODg4OLjIyMjIyMjY2NjYyMjY2NjY2NjY2NjIyMjIyNjY2NjY2OhX19e3t6fX58fH59fX1+fX1+fn5+fn9/f4GBgYCAgICBgICAgoWKjI2MjIyMjIyMjIyMjIyMlNvp5+fn5+qcfoKCgoKGUxgdHR0dGTekpKSkpKSjnJycnJycnImBgoKBgYJyXV9fX19hUjQ1NTU1NTMeHBwcHBwYfqmkpKSkp3xcX19fX15qgoGBgYGAgYqLi4yMjIyMjIyMjIyMjIyMjY2NjY2MjIyMjIyMjY2NjY2GfH16enp8fXt8fn19fX59fX5+fn5/f3+AgYCBgYGAgIGBgYGChYqNjYyMjIyMjIyMjIuLi4uSl5iYmJiZmZKPkJCQkJCMh4eIh4eHiZOTkpKSkpKRkZGRkZGRj46Ojo2NjYuJiYmJiYmIhYaFhYWGhYODg4SEhIOMkI+Pj4+Pi4iIiIiIiImKioqKioqKi4uLi4uLi4uLjIyLi4yMjIyMjI2NjIyMjIyMjIyMjY2Njoh8f3l7ent8e319fX18fX19fX5+fn9/f4CBgYGBgYGAgYCAgYKFioyMjIyMjIyMjIuLi4uLi5GQj5CQkIuOkZGJh46KkJKTkIqPjI6Ph4+RkZGRkJCQkJCPj4+Pj4+Ojo6Njo6Ojo2Njo2Njo6Ojo6Ojo6Oj4+Pj42MjIyMjIyMjY2MjIyMjIuLi4uLiouLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyNjY2NiX59eHh5fH18fX19fHx9fX59fn5+f3+AgICBgYGBgYCBgIGCgoSKjIyMjIyMjIyLi4uLi4qLkJCRkZGPhI6QkIaKj4WNkJCMiIeKho2GiZCQkJCQkJCQkI+Pj4+Ojo6NjY2NjYyMjIyMjIyMjIyMjIyMjIyMjI2NjIyMjIyMjIyMi4uLi4uLi4uLi4qKiouLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjI2Lfnx3dnh7fXx7fX18fH19fn5+fn5/f4CAgIGBgYGBgIGAgIGChIqMjIyMjIuLi4uLioqKioqQkJCQkIqFjoiOhoaPiY2QkJGNiIqFjoaLj4+Pj4+Qj5CPj4+Ojo6OjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLi4uLi4qKioqKi4qKi4qKi4uKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIt+e3d2eHt8fHx9fX19fX1+fn5/fn9/f3+AgIGAgYGAgYCBgYGEiYyMi4uLi4uLioqKioqKipCQkJCPhYOMjpCOiYyKjpCQj4eNjIaMiIiPj4+Pj4+Pj4+Pjo6OjY2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKioqKioqLi4uKioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMin18dnZ4fHx7fH19fH19fn5+fn5+fn9/f4CAgYCBgYGBgIGAgYSJi4yLi4uLi4qKiomJiYmJkJCQkJCMhoyJjoeFjYmOi4yMhImHhoiFiY+Pjo+Pj4+Pjo6OjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKioqKioqKioqKi4uLioqKioqKioqLi4uLi4uLjIyMjIyMi4uMjIyKf353eHp7enp8fHx8fX1+fn5+fn9+fn9/gICAgICBgICAgYCBhIqMi4uLioqKioqJiYmJiYmPj4+Pj5CMjouPjIqPjI6MjY2IioqLjYqOj46Ojo6Ojo6Ojo6NjYyMjIyLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLjIiAfXh5enp6e318e3t9fn5+fn5/f35+f39/gICBgICAgIGBgIGEiouLioqKioqJiYmJiYmIiI+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Oj46Ojo6Ojo6Ojo2NjYyMjIyLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLioqKi4uLh4B8eHp6eXt8fHt8fH1+fn5+fn9/fn9/f39/gIB/gYGAgIB/gYSJi4qKioqJiYmJiYmJiIiIj4+Pj4+Pj4+Pj46Pj4+Oj4+Ojo6Ojo6Ojo6OjY2NjY2NjY2MjIyMjIuLi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKiYmKioqKioqKioqKioqKioqKioqKi4uHgHt5eXh6fHx6e3t9fX5+fn5+f39+f39/f39/f3+BgYCAgH+BhIiLiomJiYmJiYmJiIiIiIiOjo6Ojo6Pj46MjI+Sj5COjo6Ojo6NjY2NjY2NjY2NjIyMjIyMjIuLi4uLioqKioqLi4uLi4uLi4uLi4uMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKiomKiomJiYqKioqKioqJiYmJioqKioqKioqKioqKioqKioqKi4aBe3h5eHp8ent7fH19fn5+fn5/f35/f39+fn9/f4CAgYCAgIGEiIqJiYmJiYmJiIiIiIeHh46Ojo6Ojo6Ojo+MkJOQkI+Ojo6NjY2NjY2NjYyMjIyMjIyMjIuLi4uLi4qKioqKioqKi4uLi4uLi4uLi4uLi4uMjIyLi4uLi4uLioqKioqKioqKiYmJiYmJiYmJiYmKioqKiomJiYmJiYmJiYqKioqKiomJioqKioqKhYB6eHl5fHt6ent8fH1+fn1+fn9/fX9/f35/f39/gICBgICAgYSIiomJiYiIiIiIiIeHh4eHjY2Ojo6Ojo6Pj4+PjoyNkI2NjY2NjY2MjIyMjIyMjIyMi4uLi4uLioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYmJiYmJiYmKioqJiYmJiYmJiYmJiYmKioqJiYmJiYmJioqFf3l6eXh7e3p7fHx7fn5+fX5+f39+f35/fn+Af3+AgICBgYCChIeKiYmIiIiIh4eHh4eHh4eNjY2Njo6Oi42Nj5WPiYyPjYyNjYyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYR+eXt5ent7eXt9fHt+fn59fn1+f35/fn9+f3+AgICAf4CAgICEh4mIiIiHh4eHh4eHh4aGhoyNjY2NjY+MjImKj42IjJGPjY2NjIyMjIyMjIyLi4uLi4uKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uKioqJiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJg355e3p8e3p7fX17fH9+fn5+fX5/fn9+f3+Af4CAgH+AgH9/f4OGiIiHh4eHh4aGhoaGhoaGjIyMjIyLiYyKiIeJhoyOjJCMjZGOjIyMi4uLi4uLi4uLi4qKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiImJiYmJiYmJiYmJiYmJiYmJiYmIiImJiYmJiYmJiYmJiYiIiIiIiYmCf3h7e3t6enx9fHx9f39+fn19fn9/f39/f4F/gIB/gICAgICAg4aIh4eHhoaGhoaGhoaGhoWMjIyMi4yOjoyKioeEiIuKjIuNjo+Li4uLi4uLi4uLi4uLioqKiomJiYmKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiomJiYmJiYiIiIiIiIiIiImJiYmJiYmJiYmJiIiIiIiIiYmIiIiIiIiIiIiIiIiIiIJ/eHp7enp6e3x8fX1+f35+fX1+f39/fn+AgICAf3+Af4CAgYCDhYiHh4aGhoaGhoaFhYWFhYyMjI2NjJCSjI2Ii4mJi4uLi4mLjIqMi4uLi4uLioqLi4qKiomJiYmJiYmJiYqKioqKioqKioqKioqKioqKioqKioqKiYqJioqJiYmJiYmIiIiIiIiIiIiIiImJiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIiIiIiIiIiHgXx4e3x5enp8fHx9fX9/fn59fX9/f39+fn+Af4B/f3+Af4CAgIKEh4eGhoaGhYWFhYWFhYWFjIyNkY+PjZGJjIaJjIuIiImMiYeNjo+NioqKioqKioqKiomJiYmJiYmJiYmJioqKioqKioqKioqKioqJioqKioqKiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4WAenl9e3t7enx8fHx9f39+fn19f39/f35+f4B/gH9/f4B/gH+AgoSHhoaGhYWFhYWFhYWFhISLi46PjoyLj4iHiYmMjYWFjo2KiYyNi46KioqKiomJiYmJiYmJiYmJiYmJiYmJiYmKioqKioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHhoaHh4eHhH55eX16enp7fXt8fX5+f35+fX5/f39/fX5/f3+Af39/f39/f4CChIaFhoWFhYWFhYWFhISEhIuLjI6MjI2Lh4mIiomGgoiNjoiKi5GTj4uJiYmJiYmJiYmJiYmIiYmJiYmJiYmJiYmKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIeHh4eHh4eIiIiIiIiIiIiIh4eHh4eHhoaGh4aGhoaGhoaGh4eDfXp5e3p5enx8e31+fn5/fn59fn9/fn9+fn+AgICAf35/f39/gIKEhoWFhYWFhISEhISEhISEioqOjYmIiIqKh4iHiomIioiIh4qGi5GPiomJiYmJiYiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHh4iIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGh4J8eXl6eXp7e3t7fX5+fn5+fn59gH9/f39/f4CAgH9/fn9/gICAgoSGhYWFhISEhISEhISEhISKi5CPiYmJi4qHh4WHiYuKiYSLjYmOjYqJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiIiIiImJiYmJiYiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGgXt4enp4e3x7e3x+fn9+fn5+fX1/f39/f3+Af4B/f39/f3+Af4CChIaFhYSEhISEhISEhISEhI+Qj4+IiYuIhoeIiYuLjIuJioqNio6Oj4iJiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoaAe3h5eXh4enp8fX1+f35+fn59fn9/f39/gIB/gICAf39/gIB/gYKDhoiGiIaDhISEhIODg4ODkpKOioeKi4qLh4uNiYqJi4iHiouIio+SioiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhn96eXh4eHl5eXx9fn5/fn5/fn1+f35/f3+Af39/f4CAgH+AgH+BgoOHjo+PjoiHhIWFhoaFhYWSkI6KiYmIiImKioiIh4aKjIiHiYmOkJGNh4iIiIiIiIiIiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4aGh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWGf3l4d3d3eXp5e3x9fn9+f35+fn5+f35+fn+Af4CAgICAf3+Af4GBg4eOjo6Ojo6Mjo2OjY2MjZCQjomHhoiJiYeIiouIiYyJiYaKjY6PkYuIiIiIiIeHh4eIiIiIiIiHh4eHh4iIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhYZ+eXd5d3d6eXl8e31/fn5/fn5+fn5+fn9+f4B/fn+Af39/f39+gIGEiI6Ojo6Ojo6Ojo6Ojo2NkJGOi42JjIiIiYaHiYaIioiHi4yLjpCQiIeIiYmJiIeHh4iIiYmIh4eHh4iIiYiIiIiIh4iIiIiHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhoaFhYaGhoWGhYSEhIWFhoaFhIWFhX55d3l2eHl4e3x7fn5+fn5+fn5+fn5+f39+f39+f39/f35/f3+AgYOGjY2Ojo6OjY6NjY6OjY2Qj42Ni46KhoiKhISLiYeDhYSDi4mLj42JjI6QkI+NjYyLjY6Pj42NjI2Nj4+Pjo6MjYyMjY2KiYiHiImHh4aHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoeHiYqKiIeJi4yNjo2LiImLi42OjYyJiImMgHl3d3Z6eXh7e3t9fn5+fn5+fn5+fn5/f39+fn5/f4B/f4B/f4CBg4aMjY2NjY2NjY2Qj4+Pj46NjI6KiYuMjIeFiY2Lh4aIh4aHh4uNjo6Pj4+Pjo+Pj4+Pj4+Pj4+Pj4+Ojo+Pj4+Pj4+Pj4+Oj46Oj46Mi4uJh4eHh4aIhoaGhoaGhoaGhoeLiYeHiIiLjY2Mi4yLjY2Ojo+Ojo6Pj46Ojo6Ojo6Ojo6Njo6NjY2AeHZ4eHp4enx6fH5+fn5+fn5+fn5+f39/fn59fn9/f39/gH9/gIGDhoyMjIyMjY+QkpOTk5KSjYyMjIqHioyKh4eJiYWCiouIiYWJjpCNjo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjI2NjI2LiYaHh4eHiYqLjY6NjYyNjY6OjY2OjY2NjY2NjY2NjY2NjY2OjIyNj4+OjY2MjIyLi313dXd5enp7e3p+fn5+fn5+f35+fn5/f39+fn1+f39/gICAf3+AgYOFj5KRkJGSk5OTk5OTkpKLi4uLiomMiouLiYuKhoeOjYiIjI6OjIuMjIyNj46Njo6Ojo2NjY2MjY2NjIyMjIyMjIyMjY2NjYyMjI2NjYyMjI2NjIyNjIyMi4yMi4yMjI2MjIyMjIyMjIyMjIyLi4uLi4yNjY6Sk5OSkpSRkJOVlZSTk5COjo6Oe3Z2d3h6ent7e31+fn5+fn5/fn5+fn5/f35+fn9/f39/gIB/f4CBgoSNkpKTkpOSkpOTkZKSkoqJioyJi4qJjIuKioiHiYqKi4mKjY2Mj46Nj5KUlJOUlJOTkpGSkI+Ojo2NjY2Pko+OkZGOjIuKioqLi4qKi5CPjoyMjIqKioqKioqKiouKioqKi4yLi4uMjIyKiouLi46RkpOTk5SUk5STk5SUlJOTk5KSkpKSk5F6dXZ2eHt7e3p6fX5+fn5+fn5+fn5+fX5/fn5+f39/f3+Af39/gIGChIuRkZGRkZKSkpGRkpGRiYmIiIqMiYiJiYuJhoSJhoyKh4ySkpKTk5OUlZWWlZWUk5OUlJSUk5SUlJSVlZWVlZWUlJOTkY+QkZKQjoyRlZWVk5KSjo+QjYqKi4qKi42OjY6RkpCRkpKSkpGRkpKSk5OTk5OTk5OTk5OTkpOSkpKSkpKSkpKSj3h1d3l6e3t7ent9fX19fn5/f35+fX5+fn5+f39/fn9/f4B/f3+AgYKEi5GQkJCSkpKRkZGRkZGIiIiIi4uJg4eLi4yMiIeHjYyNkpSSkpOTlJWWlpaVlZSSkpOTlJSUlJWVlZaXlpaWlpWUk5SUlJSVlJSUk5OVlZWUk5KTk5OTkJGSkZGSk5OTk5KSkpOSkpKSkpKSkpKSkpKSk5OTk5SUk5OSkpOTkpKSkpGRkZGPdnJ3enp7e3t8fX59fX1+fn9+fn9+fn5+fn6Af39/f3+Af3+Af4CBgoSKkJCRkZGRkZCQkJCQkIeHh4eIiIiFi4+KjI6Njo+OkJWUk5OTk5SUlZWVlJSVk5KSk5KTlZSUlZaWlpaWlpaWlpSTk5OTk5OUlJOSk5SVlZSTkpKSkpOTk5OTk5OTk5KSkpKSkpKSkpGSkpGRkZGRkZKTlJSUlJSTkpGRkZGRkZGRkZGRkYx0c3d6ent7e3x9fX1+fX5+f35+fn5+fn5+fn9/f39/fn9/f39/f4GDhIqQkJGRkJCQj4+Pj4+Ph4iKi4yNjYuOj42Mjo6RkpGSk5OSkpKSk5SUlJOSk5OTkpKSkpOUk5OTk5WVlZWUlZWUk5OTk5KSk5OUk5KTlJSUk5KSkpKSk5OTkpKSkpKRkZKSkpKSkpKSkpKSkZKRkZGSkpOTlJSUk5OSkZGRkZGQkJCQkZCRinN0dnp8fHp7fXx9fn59f35/f35+fn9+f31+f39+fn59f39/gH+AgYKDipCQkZGQj5CPjo+Pjo+Oj4+Pj4+Pj4+PkI2OjpCRkpKSkpKRkpKTk5OTkpGSkpKRkZGSk5KSk5OSk5STk5OTlJOSk5OTk5OTk5OSk5OTkpKSkpKSkpKSkpGRkZGSkZCRkZGRkpKRkZGRkpGRkZGRkpKSkpKSkpKSkpKRkJCQkJCQkJCQkJGGc3V2e3x8e3x9fX1+fn1/f35/fn5/gH9+fX5/fX5/fn5/f3+Af3+BgYGKkI+PkI+Pj4+Pj4+Pj4+Oj46Oj4+Pj5CQiI2PkJGRkpKSkpOTk5OTkpKSkpKSkZGRkZKTk5KTkpGRkpKSkZKSkpKSkpKTk5KRkZKTkpGRkpKSkpKRkJCQkJGRkZGQkJGSkZGRkZGSkZGRkZGRkZGSkpKSkpKSkZCRkZCPj4+Pj4+Pj4+PkX9ydHh8fHx7fHx9fX5+fn9+fn5/f3+AgH99fn5+f39+f39/f4CAf4GBgYqPj4+Pjo6Ojo+Pj46Ojo6Ojo+PkI+Pj4+GjpCQkJCRkZGRkZGRkZGQkJCQkJGRkJGRko2QkpGRkJCRkZCQkJGRkZGRkZGRkJCQkZGQkJGRkZGRkI+PkJCQkJGRkJCQkJCRkJCQkJCQkZCQkJCQkJCQkZCQkJCPj4+Pjo+Pj46Ojo+Pj4+PeHJ2eXx9fHp9fH19fn5+f35+f39/f4CAf39/fn5/f35/f39/gIB/gYGAio6Ojo6NjY2Ojo6Ojo6NjY2Oj4+Pj4+PjoiQkZCPj4+QkJCQkJCQkI+PkJCPj4+PiI+QfYyQkI+Pj4+PkI+PkJCQkJCQj4+Oj4+QkI+PkJCQkJCPjo+QkJCPj4+Pj4+PkJCQkI+PkI+Qj4+PkI+PkJCQkI+OkI+Pj46OjoyMjY2NjIqDiYhzc3Z4fX58eX18fX1+fn5/fX5/fn9/f39/f4B/f39/f4CAgH+AgH+BgYCJjY2Ojo6Ojo6OjY2OjoyNjY6Ojo6Ojo2NiJCRkI6Njo6Ojo6Ojo6Pjo6Ojo6Pjo57jYx2io+Ojo6OjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Pj46Oj4+Pj4+Pj4+Pjo+PjY2MjYyNjoyLi4mJiYiFhYSDgoKEgnR5fXp4dXJrZWltb2xmZmdncHNzd3l9fnl6e3x9fX1+fn59fn9/fn9/f39/gIB/f3+AgIGAgIB/f4CBgImNjY2NjY2MjYyMjIyMi4uLjYyMjIyMjIyGj5GRjIyMjIyMjIyMjIyMjIyMjIyMjnOHinOFjoyNjY2MjIyNjY2NjYyMjI2MiomKi4uJh4KAh4iEgXt6gH57fXx8fXlzcnJycnV1cG1ramppZ2NkYV9bXF1eWFVXWFlTS0VJSkpLTE1PT0tgdHR3eX19eHp5e3x8fX5+fn1+f39+f35/f4CAgH+AgICBgYCAgICAgIGAf4OEhYSFiIuLjYyMjIuLi4yGiYqKioqKh4OOkJGNiouLi4uMiYmKioqKiouLi4eDboKCcH+IhYWEhIeJiYWCg397fHl6e3pzcHFxcW1samdsbWdlZmVmZGNlZGVkZWVlZWRkZGNhYV5dXFpYWFdUUFFSU1JTTU1KSUZESEpHR0hHR0xOSWdzdXh6fXp4d3l8fHx8fn5+fn9/fn9/f39+f4CAgIB/gICBgICAgICBgYFnXmBjYWNucX17ent/fXd8fHZ4ent4eHpvcHt4eXt8e3h3e394dXd0dHZ1dXZ3dXFmbWpxc29naGtsbm9tamlpaGhlZWRkZF9gYWJgYF5dWVhaWltdXV9gX2BfX19gYmFeXl5eWVldXF1bV1dWUlRSU1NOUUpISUZERUhMTEhGR0lLSklNbXJ0eHp7end3eXt6e3x+fn1+f39+f35/f35+gIGAf3+AgIGAgICAgICCgWdYW1pZXFtcY1xaXF5ga3FtcHBvbm5vbmtpbmxrbG9qaWtraWpraWZmZ2dnaGhnbGdpZnJuaGdjYmJhYmBgXVhbW1dYV1RWUVBUU1NNSkxLTExOTk9UWFhXVVVUUlBQTU1QT05LTE1QUU9MTEpHSUlHSEhJSEhIR0ZHSEpKSEhISUlISVZwc3V5ent5dnZ5enp7fH59fX5/f35/fn5+f3+AgX9+f4B/gICAgICAgIGBbFtYVlZWWVlaWVlYVVZoamxubmxra2poaGloZGVkYlxiZl9fYWNfXF9dYF1eWl5cZWZecmxdXlpZX1tYV1NOTUxLS0tMSUtNTktKS0tMSktQTEtLRkdHSUlGR0lISUZFSEdGRkVERUVEREVJSUlHSEdIRkZLTUtJSUlIR0hLTU1LTExMVXFzdnl6e3h2d3h3ent8fn1+fn9/f39+f3+AgIGAfn5/f4CAf4CAgIB/gYJoUlRVVlNVV1lZWVdXV1tbYWNfXlxbWFZWWVZSVFJRUVVUU1NUUE1KTU5QUk9OUFNhYllrZFRRUVFUUFBOTk9MSk1MS0xKSktLRklJSkxJR0pISUlFR0dGRkVFSElKR0ZHRkZHR0hKR0dISEpMSkpLSUlISktLSkhKS0pISUtMTU9QUEtUdHN1eHp6eHZ2d3d6enx+fX5+fn5/f35+fn+AgYB/f3+AgYB/gICAgH+AgmlQUlRXVVRWWVdYWFpbVFRTUlBRU1FRUU9OTlBQUU9MTlBPTk5NTEtNTk5QTU9QWWhoYmliUU9PTk9QUFFPTk5PTk5QTk1NS0lISEpJSUlJR0ZHR0dJSkhJSEhJSEhHSEdISElISUxLSklISkpJSkpIR0pMS0pJSUhKSktMTk1NTU9RTFVzcnN3enl3dnR2eHp7fX19fn5+fn9+fn5+gICBgICAf4GBgH+AgICAgICBbE9PTlRZVVVdW1lXV1hOTUpKSUZKT0xKSkdJSk1NS0pMTUpHSUlJSktLRkNGSk1jcmtncGpVTk1MTU9PT09NTk9MTk5OUFBPTE1MTk1MTEpJSEdJSElISElJS0xLS0pJS0pJSklJSUlJR0dKSUdJSUpKTk1OTEhJSklJSk1PT01MT1JOWXBwcnd4d3d0c3R3enx+fX5+fn5+fn5+fn9/gICAgICAgYCAf39/gICAgIFvS0pNTlFOTlVXVlZSU0lFQ0VFUkREQT5CP0RAQD5CREFAQURHRkVIRUJAP0BCUGxzbWlzcV9PS0tSTEhISklKSUlLSkxQTk1MTU1MTU1NTElIREZGR0ZGRklKSUlLSkhMSklKSkpJSEhKS0tIRkdJSklLTU5OSktPTUxLTU1PUE5QT1BgcG9yd3h2dHJzdXd6fX19fn5+fn9+fn1/gICAgICAf4CAgIB/f3+AgICAgXNQUE5OUE1KS1BSUE5RQ0RCQUZRRT1DPT9FSDk6Oz0/PTxBRkA+Ojs+PUJJQjxPaXBtZHJ0ZkVKXlRGQkRFRUZFR0dHR0pHSEpLR0NER0pHQ0RFQUFDR0hHSEdISktKSElMS0lISktLTU5MTUxMSkpMS0lLTU9PUFNRT1BQTk9QUlFNUGdwb3N2dXRycXR4eX19fX1+fn5+f4B+foCAgH9/gIB/f4CAgH+Af4B/gICCdlRVUVFQT0xNUFBOT09BQkFAQkE/Oz48Pj8/Ozg5ODs7OkA6Oz48Ozs7QVlRPkVmbWlgcHFpUmFmRUVGREdJSEM/QEBAQUFCQUE/Pjw9PkFAQD8+P0BFR0dHSUtMTk1OTUxNTUpLTVBVU05MTlFOTk1OTE1NTk9OTk1LS05OTk1OTkxUbnBwcnR1c3Fydnl5fX19fn1+fn5/gH5+gICAgICAgH9/gICAgH9/gH+BgIJ4UVFSVFJTUVNTUVFST0BAPT4/PD8+QEE/PT45Ozo7Ozk5Ojg4Ozw5Nzk6R1tTU2Nqam5xbWpobVQ+Q0ZEQ0NDPzs+PkBDQ0E/Pj9BPkBAQj9APD9CQEFDRUVFSktQT1BPTU1OTExMT1JRUFJOTExPTUtOT0xMTEtMS0tKS0tKTU1LS1xxcXF0c3VycXR4eHp9fn1+fn5+f39/fn5/gIGAgH+Af4CAgICAf4CAf4CAgXxSTU9RUFFSUlRSU1NOPDs8Ozs7P0BBQkA9PDk8PTw6Nzk6Ojk3OTo6Nzg6TWNjaWxqcm9ta2xjQD1AQUA9Ozs+PD09QEJDQT9BQkE9Pj09Oz0/Q0RCQD9BREJFR0pKSkpKTE1MTExNTExOVVNLTE1USVBKSU1KSUpLS0pJSEdKS0lKZnJxc3RzdXJydnl5e31+fn5+fX9+f39/f36AgICAf4CAgICAgIF/gIF/gYCBgFZMTlBQTlJRUFBRUU44PT88PDo9PkFAQT8+PkA/Pj48PT0/QD09PT9DOz0+XW1vcG1xbmxrbE87Pj8/QUA+P0E/QEBBQEBAPT8/PTw6Oz09PD9AQUJCQUBCREZGRkdGR0dISUtMTExLTEtKS0lKSk1MTEpMS0lISUxMSklJSElLR01tcHF1dXR1c3V4eXl8fX5+fn5+fn5/gH9+gIB/f39/gH+AgYCAgYCBgICBgYCCYUtPT05OT1BPT1BQTzo8Pjw9Oz8+PkFBPz0/Q0NEQT89PkBBP0A7XW0/PkNLZnJxb3BuamtdPDo9PkFBPz5AQD9BPz89PD48PTs7PD0+QUA/QD5AQ0NEQkRFSEVFR0hISEdGSUpJSUlJSUhKSkpKTEtKSklJSEhKSktMS0lLSkpIVnBwcXNzdHR1eXp7e3x+f35+fn5+f39/f39/f3+Af4CAgICAf4GBgICAgIGBgIJtTFBRTk9QTk5PUFBPPjw8PT4/P0A+QEA/Pz9CRkQ+PDw9QD04Ojttdkg4PDlLa3JvcG5rZ0c7ODo7Pz49PD07PEA9PTw8Pjs9PD0+QUBCQUBAP0JEQ0RFRkZGQ0VHSElJSEhJS0tMTUpKSUpNTUpLSktJSEhISEpJSktKSk5MSUlfcHBycnJ0dXZ6e319fH5+fn5+fn5/f35/f36AgIB/gICAgICAgYGAgICAgIGAgnZNTk5NTk5MTE5QT0w+QTw8PT8+QkM/PkFBQUJBQFlRPD09SUxFRnV2TTc4OThKbHJycG1TOzw6Ojs+Pz89PDg6Pjw9Pj89Oz4/QEJDQkJDQ0FCQkFCQkRCQkRCRENGSUdGRkhJSUtNSklKSktMSkpJSkVESUlGRkhISUpKTEpGRmdwb3FxdHZ1d3t8fH18fn59fX1+fn9/foB+fn+AgH+AgICAgICBgYCAgICAgICBek5JS0tMTExFSUxOTTw/PDw9PkBAQUE7QkNCQ0BDc3lJO11/g395e3dWPD4/PT1KZndtUj09Pj89PT5BQ0A8OTtBPz4+QT07P0JAQkNCQENDQUNBPT0+QD0/QUFBQENFRUBAQ0JDR0dFRENGRUZGR0VEQEFHR0ZDRkRHSEpHQz5IbG9wcHF0dXZ5fHx8fHx+fn1+fn5+fn5+f36Af3+AgICAgICAgIGAf4CAf4CBgIF+UUhLTU1NS0pLTE9RQD8+PkFBQEBBR0FCRENFQUhyeWtigoSDgoOAfV0+QENAQT5FdFY7PD1ARUFCQkZIQz08QERDQUE/Pj1AQT4+Pj88PkBER0VAPkBBP0BDRkVDQkNDQEJEREJERUFCPkFCQkFCQEA9QUJDRENDQUNFR0E/PVZwcHFwcnV1d3p8e3t7fX9+fX19fX1+fX5+fn9/foB/f4CAgICAgYCAgIB/gIGAgX5SSEtNTUxLS05OUlVEQkBDQ0FBQkBCQ0BAQUFARm90fYKCgYN+fYR1TUFDRUBAQU52akhAQ0VJSUlJTU1LRUNGR0hFR0VFRUREQ0E/QD4+QkZKSkdFRUdGRkpOTktKSUdHSEtMSUdHQ0REREVEQUJCQ0BDREVEREVERUZDQkFEZW9wcXF0dnV4e3x6fHx+f319fX19fn59f4B/f39/f39+gIGBf4CBgICAgH+AgICAfVJJSUpKSEpKTE9SU0dGRUdIREdIREA+PDs+QEVFaHN9gXx/hH55hXBCREVEQ1h1hoiJflhHSUpMTE5PT0xIR0hHSElJSEhHR0hIRUNFRUVFRkhKSkZFR0lKTU9PTU1LSktKTU5LSUhHSElIR0ZFRkZGREZIR0VFSEhGSEdIRlFubnBxcnV2eXt7e3p9fX5/fX19fX1+fn1/f39/fn5/gH+BgYGAgICAgICAf4GBgIB8UEhHSElGR0lKTU5OSkxJSUpLTE5KRkNBQkNGSkdge4B/d3+EhYOEiWxBQVZ0h4mHh4eIg1dITE1MTU5MSkdHR0dER0dHR0ZIRkhFQ0RERkVEREhIQ0NDR0pKS0xMTExMTElKS0pKSUlJSEpISEdISUhHR0hGRkZISklJSUlIXW9vcXJzdnd6e3t6e319fn59fX19fX5+fYB/f39+fn+BgIGAgYCAgICAgIB/gYCAgHxNR0ZIRkVGR0dKS0pMTUxLTU5NT0tJSEhKS0tMTE5bfIKCg4OFhoaIg1VshIeGhoaHh4iHfFBLTEtIR0ZGREVDQ0BBQ0NDQ0ZGRUJAPj5AQUFAQkQ/Pj9ERkhERUdJSklJSEhJR0lJSkpJSEZKSkpKSUpJSkpKRklMTEpKS0tmb3BzcnR2eHl7e3t8fH1+fn19fX19fn59f39/f35/f4CAgICAgYCAgIGAgICAgICAfU9GRkdGR0hHRUZHR01NTUtMS0lHQ0NDRElLS0xMSlWBg4SEgoKFhoaDgoaFhISGhoaHiIaKdUlJRkI/P0A/Pz88PDw+Ojo8QUFAPjw5OTg8PD07Pjs5Oz9BQkBBQ0NCQEFCRERCQ0ZISUhISExNTEdJSk1NTk1KSktLSkxNU2xvcXRzc3d5e3t7fH19fn9+fX19fX1+fn5/foB/fn9/gICBgIGBgICAgYCAgIB/f39+UUZFRkdJSUdEQ0VGTk1MSklIRT85Oj5ARUhISkpJZYWEhIR/gYKDgoOEhIWFhoeIiIiJiYyOZkJCPTg4Ojo5ODc4ODk2NDc5Ozw6ODU2Nzc4OTc4NzY4ODs7Oz1AOzk5OT08Pjs7PUFDRUhKTUxMR0lIT1JRUFBOTE1NT1Fdb3BydHN1eHp7e3x8fn5+f359fX59fX5+f39/gH9/f4CAgICAgYCAgICAgICAgIB/f39RR0ZHSEpIRkVGR0hMTEpJSUdDQjU2OjxDQENHSUlqhoSEgX6Bg4ODgoOEhomKi4yLiomKi4yJVDs4NjU2NzY2NjQ1NzYzNDY4Ojg3NjU2NTY3Njc3ODo3Nzc4OTs3NTc4OTc5ODc2OjxAR0ZJRklGRUZPU1JTU1JPUFBSVGVwcXN0dHd5e3t7fH1+fn5/fn19fX19f39/f3+Afn+AgICAgICBgICAgICAgICAgH9/flJISEhJS0lHSUpJSkpLREVIRUJANTc4OD06PUVDQmaFg4GAgoODg4ODhYmKiomJioqKiouJiYqBSDY3NjQ2ODg3NDU3ODQ2NzY5OTc2Njc2NTo5Ojs6Ozg5ODk3Nzc3OTo5ODg3ODU4OTtBPT4+QkE/QUtMT1FQUU9PT1JXa3FydHR1d3l7ent9fX5/fn9+fX19fX5/f4B+fn9/f4CAgH9/gICAgICAgH+AgICAf39+VEhHSUlMTUtKS0tMSUg/QEFAPDo1Nzk4OTc7Qjo9cYSAgYOEhISEhIaJioqIh4iIiIqKjIqJiYx6Pjk4ODs8PT45Ojs8ODk7OTo7Ojk5Ozo5PT09Pjs7PD06Pjs5Ozs8Ozw8OTk8ODo6Ozo5OTk8Pzw9QUJESUpNS0lLTFdvcnN1dHZ4e3t8fHt9f39+f359fX19fn9/f35/f39/f3+Bf4CAgICAgICAf4CAgH+Af35URkVGSUxOTkxKSk1CPzo7PDs4OTk4OTo6Ojs/Pkh+hIKChIWFhYaIiYiHhoaGiImIiYuMi4mKioxsPDs+QkNFRUFBQUI+QEJAQD49PT5APz8/QD9APT0/Qj9BQT9BQD1AQEA+P0E9Pjw7Ojs5OTs/PTs7PT1BQUNBQkNBWHBxdHR0dnl7e3x9e31/fn9/fn19fX5+f35+fn9+f4B/f4CAgIB/gIGAf39/gICAf39/flJFQ0FHSk5PTElHSzo4Ojs5Ojo8PTo7Oz09P0BCUoKCgoSFhIWEhomJiIiGhoaHiImKi4uKioqLiotePkNHSUtKSUZHR0RGSEdFQkBAQ0VDQ0FCQ0I/QERIRENFREVFQUZFRkRFRkRAQj88QD49P0A+Pz8/Pj8+Pjo7PTxgcXJ0dHV3enp6fX19fn5+f39+fX19fX5/fn5+fn5/gH9/gICAgICAgICAf4CAgIB/f4B+UERAPUNIT01HRkJEOTc6Pjo8Oz4/Pz89QUBDREZYhYKDhIWFhoaIiYmIh4aGhoeJiYqLjI2MjIuKiohXR0xNTUtOSklLSElKSklFQ0RGR0ZEQ0VGREJISUtIR0dGR0dFS0lLSUpLSkNGQ0NEQkFBQ0JEQ0NERENBPTs9QGhwc3R0d3d6eHt8fH19fn5/f359fX1+fn9+fn59fn+Af3+AgH9/gICAgICAgICAgH+AgH9PQT49P0RMS0BCQkE5ODw+Ozw7PkA/QT9CQkdHSVmFgoOFhYaHiImJiIiHhoaGiIiIiYqMjYyMi4uKjH9QTVBNS05LSkxKSUlISkZER0hISUVFSEZGRUxMTUlKR0dISUpOTU5MTE5LR0ZHR0VFQ0ZGRkZERUhIRkNBP0BMbHB0dXZ4eXl5fHx8fX1+fn9+fn19fX1/f35+fn5+f39/f39/f3+AgICAgIB/gICAgICAf1FBPz4/RUdHPTxAQDk4PDs8PTo/QD4/QENGSUlQX4KDhYSFhoaHiIiIiIiIh4eIiIiJioyNjIyMjIuKjXJOUU9NTExLTEpISEVKSURKSEdLSkhKR0dHS0xOTExISElKTVBOUE5NT0tJR0lKSElESUhIRkZHR0lGQ0JBQ1VucHV3d3l7eHl6enx8fX5+f39+fn1+fX5+fn5/f36Af4B/f3+Af4CAgICAgICAgICAf39/VERBQUJHSEI/OD9AOTo8OD0+Oz1BPj9BREhKTFVxg4SEhISFhoeIiIiIiIeGiIiIiImJjIyLjIyLi4uLi19SUlBNTk1LSkdGQkdKR0xKRktOS0tKSk1NTE9QTkhJS0xPUVFQUU9PSkhKSkxKS0ZHSEdFR0hGRUVCQUJCXG9yd3h5enl5eXp6e3t+fn5/fn59fX19fn9+fn9+f4CAgIB/f39/gICAgICAgICAgH9/f39VRUNFRUdHRUQ7P0E7PTw5QD4+QEJHR0FHS0xQVnmFg4ODhISGiIiIiIiIh4eIiIiIiIqLi4uMjIyMi4uNfFhWUlJUUk9MS0pERUZLT05PV1VRUE9RU1JNU1RPTVNMUFNVVlJTUVBMSk1NTUtOR0dKRkZJSkRERUVCRENjcHV5eXp6ent6e3p7fH59fX9+fX19fXx9fn5/gH9/gICAf39/f3+BgYCAf39/gIB/f39/f1VGRkdHR0dIRj5AQj0/PT1CP0NCRlZORk5QUFRYe4aDhYWEhIeIiIiIiIiIiIiIiIiJiouKioyMjIyOi4uLaFZVa2FFUlFRUEk7O1FTUmB1XVVWVFZZWVJZWFJaZlBVV1pdUlRXUVBOUlBQUFFLS0tISEpIRUZJSUlISWlydnl5enl6e3t8ent8fXx9gH59fX19fX1+f39/f3+AgIB/f39/f4CAgIB/f3+AgH9/f35+U0hKSUlHRkZFPz9BQUVCQ0dFREVMWFJNVFVWWFt8hoWHhoWGh4iIiIiIiIiIiIiIiIiIlJyMioqMfWGKi4uHbFtkVTpYWFhTUT9AVlVZXGRgVllicl1dVl1aVkVRWVpbWV9UWmdSVVZYVFRWVE9PTUpMSklJTE1LT01Tb3N2eHl4d3p5ent6e3x9fH5/fn1+fX19fn1/f39+f4CAgH9/f3+AgICAgH9/gH+Af39+fn5WSkpJSEdFRERCQT9ITUlNUEtJS1BUU1NYWlpcXHiFhIWFhYWGh4eHiIiIiIiIiIiIiImcnaCPiY5nO36MiYqLem5wWFpbWlJUUlZWVFpadYNZVX2QYFxYXV9XSVZdXVtbX1lJWVhZW11YWFlXUlFNUFFNTU9TUVFVUmFzc3Z3d3Z4eHh6e3p8fX19f39+fX59fX1+fn9/gH9/gIB/f3+Af3+AgICAf39/gIB/gHh5fVlOS0lJSEZCREBBOlBRUVdYUFBPUVNUVFhYWVpbboGCg4WEhYaHh4eHh4iIiIiIiIiIiJaanJeIioFuhomIh4OKfmZZWVxZU1VUV1JRV1ZjloBRZXJYWldfZ1BgZltbWFxnYUdPWmhnXFtcXV1XU05TUFBRVlZWVllabnJ0d3Z2dXh4eHt7fH19fX5/fn59fn18fn9/f3+Af39/gH+AgH9/gICBgYB/gH1yfX9/b3R8XVNQT01LSkVDP0A7UFBaWltSU1FPUlJSVVNWVFdfdXiAhYSEhYaGhoaHh4eHiIiIh4eIh4ORjomJiIaFiIiGfYB7XFBVWFRSVFJRUUxPTUtmeVpdVFlVVl1aTFRaVFNUXlpYV1dXemtYWltcXlRRUVBJTk9XVlhaWmRxc3Z2dHR2eHl5e3t8fH19fn99fX1+fX1+f39/gIB/f3+Afn56eHd2c3V7f3+AgHRrfn5rcnleW1ZVVFJPS0ZDREFNXoNsVlJTTk9RT1FVUlNSUlRjZHaAgoKDhISEhIWFhISDhoaGhoeIhn6JiYiHhoOHh4d5bXFWSUtNTktNS0hKREZIRUM+U2NVf1JRUU5LUlRRTU9ZUU1OUVNVVU1RU1JQT01MSENJSFJUVVpcbXJ1dnV0c3d7ent7e317fX19fn19fX59fn9/f4B/f399fX5+f39/f4B+e3Zzd31+fmR1fWlxdF9kXV5bWVZQTElMSWFsknRQUVNOUVJRUltSU1JRUlZUYnN7fH+AgYKBgX99e3uAf4OChYaHgoaGhoGEgYaFhnVfXUtDP0NDQ0NCP0RQQkNAQz5CSEdWQEhOTUddaVFIRk9GREVGSEdIQkNIR0hLR0RCQURBT1BNU2RzdHZ1c3R2enx6e3t7fHx9fHt+fX19fn5/f3+AgIB/f3x8fX+Af39/f4CBgH12dHt/bWh8Z25xZmllZGJcWFNRUFVSc1dlW09PTkxRU1FVWVNVUVFUUk9WYGtscnZ7e3h5dHJuc3RzeXh+foOAg4OCgIKAgoGBa0xHPz87Oz5AQD8/PmpRS2FFRkhJRUI/R0xNR01RVUlCRT8/PD08PT0/PT9BQ0NAPzw9Qj5KTUZVbnV1dXN0dnh6fHp9fHx9fX19fH59fXx+fn9/f4B/f39/enl3eHd2dnh7foB+fXt4dnx1YXhnbHBqbGppZmBbUVJaXFleSkpQUU5LTFFSUVRVVVdRUVdWUFhbYl1hZ21tbG9rZ2BucmptbHF1e3p9e3h6fHx4d3hkQkBAQj06QkNBQURCXF1Pe05PTk5LTE1PT1FMS0xXTUhHQEI8OTc3NTk5PTs7Ozg5ODk/O0JIP1xzdHV2dXZ4enx8fH18fH19fn58fX19fX9/f39/fn9/f314dXZ6e3p3eXh1d3t8eXh1eXdjcWhpcG1ubW1oZl5PUF5cWklIUFJRT01QUU5RUlRWWFNSWVROWVpbV1ldXl5gZWBdXnF2a15gZ2t3b29sam9ubmxmYlhHRkZIQkFHSUVFRkRNUlBhV1JXUVBTU1JVW09PUVdQTUlERj46OTY1ODc5Nzk6MzY2Nzk1PEI9ZXNzdnd3eXp7fX18fHt8fX5+fnt9fn19f39/fn5+fn9/e3d1eX18enh8fHx8dHd2d3Z1d2tuaWhxbm9vb2prYFVXXlpXTUtUVFNRUVVPTFJTVFdYVFRYUkxXWVpWWFhWWFldV1dYaHNrXVZhc2thYV9eZGFfXllVUE1PTkxJSEpLSUhGQ1FQU1pXVFROUVNZU1xlVU9TVFFOS0lIQz9BOTk4ODk3ODg1NzU3ODU5OUducXR3eHp7e31+fX18e318fn5+en1+fH1/f359fn59f358dHR1e3hycW9vbnR4cXJzeHZ1cWZkZ3JucHBxbm1kXV9fWVdPUFhWVlNUVk9PVVZYWFlTVVRMS1RVVVVVV1BUVVdUVVJdbl5STllfW1ZZO0RWWFRbZkpMUFJST01NTk5OTEpGUVBVWVNUTkpPT1VTVFxWUlVTUk9NS0lISEY/Pj06Nzg3NjU5OTY3Njc1V3Bwc3d5ent8fX59fnx8fXx+fX15fX18fn5+fXx8fX1+fXxydnF4eHJ2dXFxbnBwb3B1dnRuamRkanBwcXJwbmZlZGNcXlJUWlZXVVRXVFJYWFlZWVJVT0lHT1BPT01SSk9QUFBOTk9UTE1JUE9TVFUyPFhNSUFRPWNhUVNRUE5QUVBOTk1RTlRSUFJNSUxLT1JQUlJTVFFST0xMS0xMSENCQT06Ojg3NjtCNDU2Njpkb3F1d3h7fHx9fnx9fH19fX18e3h8ent9fX58e3l9fH18e3B1b3d1cHV0b3N2cHFxcHR1dmNqZ2VXaHRycnFuaWlocFZWVFVYVVdVUldWVVpZWFdVUVNGRkFGR0dIRkpESEpIR0VITEhLSEZMTVBNRy9FX1I+M0A+am9hUlJRQEZVUVBRUFFOUU9QT0xKTExPUE5OUFFRTlBPSkxNTUtHRUVEQjs9PDw5PUc2Njc3RG1wdHZ5e3t8fX18enx8fX5+fXt5dnh3eXl8fXp6dn17fHp6b3Fud3JwdnFtcHNwb3Bzc3N0ZmdgaFpXa3JzcmxtbWtuYWVQU1RSU1RPV1ZWWVlWUVFRT0A+Oz0/QEJBQ0BCRURBQEdIR0hFRkhKTUtFR0NPUkM4RU5TXWZTUVNBR1VQT1FRUE1NTk1LTEtMTk9PUU1PT01ITExJS0tMS0dGRkVEPEFBPjtARTs8ODlTcHJ0eHt6e318fHt5fHp6fn58e3V0dXJ2dnp6eHpyfHt8eXltcW94cnF1bm5xcm9vb3Rzc3J1dGtnZ15lam1wa29xbWltY0xPT01RU0xUVVRXV1VMTEtIPTk4Nzs/QD48PUFAQj0+RUhHQ0ZGSUdKSkBGQUFARkhFSk9IUFJhXFFQUk5TT09QTExPTUtNTE1PTltXS01RT0dJSENJSkxMSkZGRkQ/QkM+PEJGP0I/QWRwc3d6ent7fHt6end8d3l+fnt7cXN0cHJzd3R4eHN6e3l2d2xxb3ZxdHRsb3Fybm5vc3ZydHNycmtsZW5zaG1ubWxtbGprSUxISE9RSlFTUVRTT0tIQ0U9OTg3OT9CPjs/QkBAPkFESUVDR0dJRklFQkI/Pj1DQkFHSkVNT2JlUU1OTldLTE1LTE1NTUxLTk5TZE1KTFJJSUlFQUhKTE1OSkdJRkJBQkA/RUZFSERLbm92eXl5e3t6fHp3c3h0eHx8eXpucXJtbm9ycnZyc3h8eHZ2bXBtc3B1dGxwcHJvb29ydnVyVlZucWdseYRqbXFybm5qaG9ISkNHTE1JTVBNUE9IS0U/Qj05OTk6P0I/PEBCQkFERUdLRkNJSUdHSENDP0I/P0BBPkRFQ0tOUVRMSklNVEZJSUpMSktMSUpMTU9QUlBLR0NLR0NCSkpMTU9NSUpJR0NDQ0RJSk1MSVlybXd5eHp7e3l8dnJwdXJ0eXl2eGpxbmpsbG50dG10dXtzdHhyb25xb3ZzbnBvcnBvcHN0eWpOYGdzanR8eWdvc3FpcWhlcUhLQ0dISEdKS0lKS0RHQj0+PTo6OjtAQj89QkJCQ0hGSkxKRElJRkdHQ0M7QUBCPkBAQ0RDSU1QR0lLR0hLREhJS01ISkxISUpLSk1dUkhIRE1HQURLS01NUE5LTUpLRkdHSk1OUU5MYm1pdnZ3e3h7en1xbWxza3B0dHR1aHBtamlra3RwbnR0eXByeXRvcnFvd3NvcXB0cnBydXR5a05WbXVscXt2aW5vaWp0aGRvRktERkVHRUZGR0VHQkNAPjw9OTo6OkBDQD5CQ0RFSUZKSkxGSUlHRkZEQjtCQ0M+QEREQ0VHTE5IS05IREhFSUxOTUhJTEdGR0lJTE5LSkhFTklCRk1MT01PTU5OTUtJSElPUlFSTlJmZmZxb3N4dXt6fGxoam5la3Btc3FmbWxoaWtsdG1wdXR3cW94dG90c3J2c3BxcnRzcnR1dXZ2WFZ1dWtvdHJrb3ZsaG1lX3BHSkNFRkVCQ0JFQERCPkA+Ojs7PTo9PkNBPkFDRUdKRklIS0hHR0dGRUNAPUVFQj5CRENDRUdISUdNUEpGRkdLTk9LRkhKRkVERUlKSEtJRkhQS0RJTUxQTU9OT09OS0pITVJVVFJPV2RgYW1ncHJvcnl6Z2VoaGNpbGdxbGZsbWdpa2xzbHB2dXRwbnZyb3Nyc3V0cXNzdXRzdXZ2dnl2dXR3bGp1dW1ydnFsbmxlck1IREVHQ0JAQkQ9QkE+QT06Oj0/Oz4+QEI+QEJER0tGSUZJSEZGR0VDQkFBRkZDQkNCREVFR0dIRkxRTElPSkpMTElHSEVGRURDSUlIS0pHS1JNQk5PTVBPT09OT09LS0tPVVdWVVRYX15caWFtaW5ocnNiZWZlZGloZm5pZm1taGtrbXJpcXZ1c3Ftdm5vcXJzd3Nyc3R1dnZ2dnd2d3Z2dHd1anN1bnV0c3FyamtzTUdHRkhCQkBERTxBQEBDPDg5PT45Pzw/QkBAQERGSEVIRkZHRkVFRENFQ0RJRkNGRUJFR0VGR0dFSk1LSFFNSktISElFRkhJRkNJSklLTUtPU05EUVJQUVJOT01OUE1MTVNXVldYVlhdWl1kYGhiamlna19lZWZjZ2dna2dna21rbWxwcWd0dHVyc252b3FwcnR4cXNzdXZ1gpF5dnZ0eHV1d3htb3VvcnN1cXFpb3pNSEdISEJCQkZFPD9CQkQ8Nzo+Pjo+OkBCPj8/Q0VGREZEREdFREVDREVGR0pFRUlHQ0dIRkhHRUNGSkpHTUpMS0hKTEZJSUtIRUtLTExPT1JUT0hTVVNRU1BRTU5RTk1QV1pWWllWWl1aWGFgYGBeaGVjYGRmaGdqaWhqZmhubGxubXFwaXV1eHJycHVwcHBydXZwdXN1dnV7fn14dnR3dnZ2eHBsdXBtc3RucHJyeU5JSEdJREFDSEU8QEVCRT04Oj4+PTw8QUI8Pz5BQkZDRUJDSUVDRUVGR0dHSUZHS0hDSEhHSUdGREhLSUdLSE1LSktMSExLTUtKTkxPTlBSVVZPS1VXVFFUUVJMT1FQT1RZWllcWllbXl5eYGNeXGFja2JgZGdocoVoZ2pmam1ucG9uc3JqdHV4cnNzdHJucHF2cnF1cnV1c355jn11dXZ2dnZ4cmh1cWtydGxxdnB1TUlLSEpFQkVHRTxAR0NEQDo8PkA/Pj9DQjxAPkFBRkNFRERJRUZFR0VISEZIR0lLSUZKSEhLSEZGTEhISEpHTExMTExJTUtNTU1PTFBQUVVWV09LVlZVU1NSUUxPUlJQVltbXV5bXF5fX2FgYWRdZGBlZmBlaGpjc3NmamhnbHBycW9zc25zd3dxdXZ0c21vcnVvcnNwdXJ2cnSBdnV1dXd2dXd0Z3Rya3Fya3J3b3ZKS0xKTEdCRURFPEBGRERCOz8/QUBAQENBP0I/QUNIQkZFRkhGSUZGRElIR0lISkxISEpKSUxKRkpLSElKSkdLS01NSkpNTE5OTk9LT1BSVVhWTU5UVlRTUlFQTE5UU1JXW15eX11dYF9gYWFfYWNlYmNoYmRpamd2i2xqaWdtb3NxcHFwcHJ5dnJ1dXRzbW1zc21xcm90dXRycHN3dHV1d3Z1dXRlcXNrcHFqcnZvd0tNTExNR0NDQUQ8P0VFRUM9QUFDQkJDRUFCREFBRUdDR0hHR0ZKR0NISUdHSkZJTEhJSk1LTUxHS0lITEtOUUtSUU1TTUtOTk9QUE9UT1dYWFtOU1FXXFpTVlBOVFVUVFhaX2JiX2RhXmBiXmBlYWFjaW5nYmloaG54dmxoaW1vc3JwcXJycnZ0c3Vzc3Nua3NxbXByb3R2cnFxdXZ1c3d5d3V0dWNtdGtvcGpxdG93TE5MTExHRUFARD4+REVGQ0BDQUVEREZCQkVHQ0NJRkNISkpJSUtHREtKR0hKSUlLSEpKTkxOTElMSEpNS1pmSmRcS2xTSE9OX25Va3NbcXBid2NSUGF2dWh1Y2F2YFhucWJkdmluemZbbHRgbGpUX3d2aWpnaWZnbG1qbW9qbW5zcnBycnFyc3Jzc3J0cm5sdG9ucHFxdXVxcXN0dnZ1dXl3dXR0YGt0a3Bwa3FycXlMTkpLSkZDP0BCPz1ERUZEQ0RCRUVFRkJFRkhDREpFRUpMTUtMTEdHTUpHSUtIS0tJS0pOTE1NTExJTE1MW3NiZHBebG1VTU5mc11nZXFsbnRncGlfYVlubmJwcGJrampnb3F0ZXRub1xvdWdwTUpyeXZrYmBrZWVteG1sdmxucHNycHJxcHFycXJycnRybW1zbm5vcHJ1dHFzc3R1dXV0d3h2dXRibXVrcHBscnJxektMSUlHRUQ/QkI/PkJGR0JGQ0VERUVEQ0hIR0RFS0dHTE1OS01NR0pOSEpLSklMS0pKS01NTk5NTUpNTU1bcm9vbnBwbGtNUFFsV05pYnRycGFtb3ZcWWxRXG1tWnFta29teHh0c2lwXF9ya3FqVXV5eHBjXmtmYmdwcGppb3Bwc3NwcXBxcXJycXFycnRsbXJtbm5vcnV0cXRydHV1dHV1enZ1dGVudWtwb2xzcnJ5SktHSEVFRUJCQj1AQEZHQkdESUVFREJGSUhIRUdLSkdNTU5LTU5HTE5JTEtJSk1JSkpKS09QT05NS05NTFxoZHVdbHFXbE5QUW1VWmtea2x2YWxkdFRlY05tWWxcdHBraWx4and1aHBdXnJraFdiY3d8b2NgZ2dhZGl0eWtubnFzc3BxcHFwcnFwcHBydWttcW1tbW9xc3Rxc3J0dnZzd3Z6dnV0aG91bHNvbXNydHZJTUdJREVFQ0FCPEJAQkZER0ZMSEVDQ0hLSEhGSkxMRk5LTFNSTEdMTUhOSkhITkhKSklITk9NTkxKTk1KWnNwcG9xcW1sT1FSbllxa2dvb3Fxb210Xm5YYXRfbm5vb3Fyb251c3R0altedGN3eHJqbnpoYWFjZmJiam10dXBzdXZzcXBwcW9ydHt/fn13bGtxbmxtbnByc3F0dHN1dXR4eHl4dHVrb3VtdG9uc3N2c0hLSElCRUVFQUA+Q0RCR0NISU1JRkNGSkxJR0ZKTUxGT0pLV1JLR0tKSk5JSEpMSUtKSUhKTU1NTElLS0tTa2JaaV5faWNyclpfWWpvX2VlVWtfY1thYVFgbGhdalxvamlkW3BmZHBcWlxrW21xY3BzbGRnY2RnYGBrbXBwb3R5cnVxb3BxbnmFiIeHhoWAdnNua21tb25xcnR0cnR1dXZ5eHhzdW5xdW53cXJ1dHdySEhGSURFREZBQEFFRURHQkhKTEhGREdLTElFRkpPTElQSUxbUUpGSEhLTUlISklLS0lISUdLS0xMRkhLS0xMTEtJS0xOVFtcVFBUTFBPTk9PVlFPT1FOT1FKSU5QUWVyaVRZV1tbXFVZWl1YXVxcY2ZhYWViY2VfX2ZrbWhtdHlydHJvcHB0hoeGhoaFhYaHg3pwbW1sa3FzdHRydHZ0dXl4eHV2cXJ1b3ZydHN1dXNIQ0VHRkZBRUM/Q0hERkdDSUtMSEZER0tMSERHSFBLTE9LTFdMSUVFSElKSElLSUxKSEZHR0lHSElFRkxJSktOTElPXFdeUFxbYF5PWFlTXFxiXk1ZWk1YYVJKWWFaU2BkXGFYW2RkVlZYXFlaWFxWWVxdYl5kYGFfZWhrZ210dHFxdHBxcoGGhoaFhoWFhYaGhoR9cmtpb3Jzc3N0d3l5eHl4d3h0cXhyeHNxcnVydE9CQ0RMTUJDREJFSUVHR0ZLSktIRUVKSkpHRUhIUEpNTUpNU0lIRkFIRkpJS0xJTEpIRkVJR0RGR0VFSkhDSk1KS1RfWWBYYGFbYFVYWVReXlpfUllcUF5cWU5eXF5TW15jXlpdYGNgWV9iW2BeW1RYV1leXWNiY2FjZmlla3Jwb3Bwbm93hoaFhYaCe4CFhYaGhYaFf3VxcHJyc3Z5eXp5eXh4eHdyeXZ4cnF4dnR2YVNKSk1JRUNCQ0dHRUhHSEtJSUlERktLS0ZGSUpOS05MSExOSEhGPkdHTElLS0pLS0lHRUlEQ0REQkZKREBKTEpPW2NZX15hX1JUUldfYFxdWV5RWVxNVl9XS1FZW1BaX2FhXl5jYWBiYmJjY2VaUVlWVVxaXWNgX19jZWJob21ubGxsbHWFf4SDeXV8hIWFhYaGhYWGhoN9d3JydHd5eXl5f359eXV5dnZybnp3dnhYUUtGQ0dFQkVISUZHSEhGRkpHSEZIS0lMRERLSk5NTEtISkpISkc/R0ZOSktLTUtLS0lHR0NEQERBSElCP0lKSE9dYVpbZF1fVFFSWF1cXFxfWktXXExSXFlJTl5RT1xfYWNkY2NiXGRjYmRjZlhRVVRSW1haYV9eXmFhX2Rsa21qamxudn51gXp8hIWFhYWFhYaGhYaFhoaGgnpyc3V1e4WHh4eGhYSBfnhwend2eFxSTUNASUZDRUtKRkZGSEdHSUZGRklMSk5FREtKTE5KTElLSkhJRkJISFFNS0tPTUtLSUhHRUQ/RUNISEFBR0ZFVF1ZXlhfWV9bXVVYWFBdXVFLSlZeWF5bXVZZYFJRX19hYmFgYmJgY2JhZGRiWE9RUVFbU1tdXV1dXl9fZGhnbGpubnB7e3x+e4CCg4SFhYWFhYWEhIWDhISHh4FzcneFh4eHh4eHh4eHh4WDgHx4XFNLQ0FHRkRHTVJIQ1FKRkhISEVGS0pNUEVHSEpLTkxMSUxLSUlHREhLUU9NTVBMTUtLSElDREFFREhHQkFHRUNXVUVcVF5TVl9YTlRVTlpbTUpLVGBhW19YXl5hXU9ZYlxgYF9iY2JdYWJXX19UUE5PUFhSXVtbXFxeYGJmZmVsZm9vd3x7gHt9f4CEhISEhIWFhYODhYKDgoWFhnpvgYaGhoeHiIeGhoaFhYSFg35JTkZERUZHRElSYlBDVl5JR0dIREZNSlBQRUlJSktOTEtLTUxKSkdESk1RUU5OT01OTE5IS0FEQUNERkRDQUVGQk1IQktMUE9OTEZNRkdJSkhHTExNT1BJTE9QT1NQTFFTUlVaWVdZWFhkV09TVFBQTk1PVVRbWVlbXVxgYWRlY2dja2xwc3N6eX97en+EhISEhISEhIKEgH57gYOBfXuFhIaGh4eHhYWFhISEgoGAfUtJRUVHRkdES01dTEdHWE1HSEpIR01MUVFJTEtLS05OVU5PS0tMR0ZLUFNTTlBPTk9OT0hLRWBFRF9MRGZjRU1bSV5bcm1PTVVtWUxDUGBVbFdnSl1XVV5ETFFVTE1UVlFSVFhXVFhVVFxVUGZaaGhkWFNrU1ZWVVtcW2BgYWFhYmBmaGZubGhyenx9foGEhISEg4ODgX18enJ7gXp7f4KAg4SEhYWBhIWBg4N/fnp7TElFRkZIRUVLT1NJS0ZgVEhKT0pJT01SUUtNTExPUlVST09KTE5HSE1RW1lPUFBOT1BPSUpQf1FJfFlZcnNYUG1IcW5vYVZQcXFzUENrc21xdHBTb19bblhdVlxYVWtoVV1WY1pgWVtgVlVXf2p0dXVfX3ZfWGFcXGZbX2FhYWFeYGJnbXBsYHB3dHiBgYKDg4J/fX6Adnh6bHZ+dHh+gHx+gIGChHyAg3p/gX9+d3dOSUVITU5CRExMRkpMRlFWTEtOSUtSWFdRTk9PTVFUTk9RUEtLTkdNUFNbWlRRUk9QUFBKSFp4XVR4ZWhZUlRRdmd0bHBibmZqUXJPTXdtanJwc3JxcnBvb4BdZnp1eHFxenF+c31rdX1iUmd8ZXNzb3Nye3xvfXlvf3JfYGBiYVpgYGdrbmtibGZnbXd+gYCDfnt4d4B0dnppcn5udHx+d3h7foCDeHyAdXx/fHxzc05LRmBdR0FFTU1IS0tISlBOTU1KTlZeWVVMUVNOWVpNU1NSTkxPSVFSVFlXV1BUUFBQUUtHZnhsY3hybVpLTVV5cHVtdWJudlBkZUpmdnFtd2+AamZ4eGlXclJpe2xpanp6fWx4en9vZ29YdnZqdXVwgGByZ31pbHh8b15fX2JhW11iZGdpamRnYmNkbGxwcHN0c3NzeXFyeGJsdWdyeXtzc3V5foFzdXpufH15eHJuTktTdE5DQkVQUEhKS0pMUU9PT01QWmBaWEtUV1BhXlJWUVlTTE9JU1RVWFdXUFVQT05SSktyb3V1cXVxZGliV25McXBeRmh5V3ZUS2h4fXhgeXtzbmFebW9jUmdxdW5teXB3bHZ0dHFsbVx0fnprbXl8a3RtfGtwdnV4Xl9fYl5dX2RkaWdoZWVeYWJpaWlqa25va3FubWpwYWNmZG93eG9tcHN5fm5xcGp7enRyb21MTFtWSEdFR1JQSUxNS0xRUVFQUFFXXFlVTVVZVWZYUlJZXlRNTklUVFZXWVdPU05OTlFIUm1IaXdLYGR2dlZYbE9ubHtzYWpnf3ZVS1draH1sbWx4YFtwenteYHpzY3JveHFoZXxpcnxdVEtsYHZ1a2l2fHttfnhrfHBdXl5iW19iZGRnZWVlYlpjY2lra3JzcndnbWloZGdgYWxhZ3NybGdtbXJ8a21oa3t0bW1rbU9ISktISUlIUVBMTk9MS1NTU09TUldSVlRQV1tWVlRUVGFgUE5OS1RTU1FVVk5OTE1PUEpIUU5QVUxLS1NUU1JUUFZVUVFOUVFYWFFOUFVUWFhYW1tVUlNXW1dYV1pPU1VXV1hSXVlXXVZUT1lSV1dXWFleW2dyXltbWVxdX2NaX2NjZGZkY2NiWmNjZmZmbW5tdWZmZ2NgZl9dZ2BkbGhmZ2tocHpoZ2drdWpoZ2lsUUlLTExNS0pTUU1RUE9MVlVUUFRVWFVZVVFaXVZVVFdVWVhQT0xNVlRRTlVTTk9NTFFQS0pRUktRTUtLT1JUUlFRU1NJSExOT1FSUVFRVFZSWFdcV1NTUFFVVVZTWlFPU1JXVlRZVlRZVVRSVVRUVFdYV11aXmFdXFpaXFxgY1xdYmNkZmRlZGFZYGFjYWJoaGluY2FkXl9jXVpkXGJtYV5mZWZtc2RpaGtrZWRjZmhQSktMT09MTVNQTlNRUU1YV1VUVVdXV1pVU1xgVldWWVVYVFFQS09XU1BOVVBOUU5LU1BNT1VUTlFOTU5RU1BUUVNUVU5LTU9RVFRSUlFWV1VZWltZU1VSVFdXV1lbVE9UVVhVVVpVV1lVUlJYVlVXW1laX11VWV5cXl1cXWBhXltiYmNnZmRkYlhfYGJdYGhlZmRhXl9dXV5aWl9aX2dgXl1dYmhrYWdmaGZkYGJjYVBLTUxQUUxPVE9PU1FPUVpZWFdYWlpYWVZcamRWWFlaV1ZUVFBLT1ZUUE9UUFBQTk1RUVBSWFRRUU9NT1NWTldSVFVVT05NUVNVVVRUUlRYVlpdXFpWV1FSV1hWW1tXUVRWVlZWWVRYV1RTUlhWVVpdWV1fXlZeXV5gXFxgX19fWmJiZGhnZGRhWWJgYl5eZmNjYGJdXFxcXFlaW1hbYVteXVxfYl9fYmRlYmRfX2BcUE1OTlJRTVJST1NUUVBVXFpaV1tbXFlaW2RxbWhkX1tZVlZYUUxNVlNNTlJPUVJPTFBTUlVaVVNQUExQV1ZSV1NTU1hNT1BSVFhVVVVTVVlYW15dW1tWUk9VVlZbW1dRVFdWV1hWVFhaVFNSWldWXF5aXl9gVWFcYWFdYGJgXWBdY2FjZ2hkZmBZY2BhX19lZF9gY1taXFtcWVpYWVdcWVxbYF5fW15eYWBfYlxZYFpRTk9OVlFQVFJPVVRTUFdcXVxYXlxfV1xeanF3eYBjXFtWVlhRTk9WU05RUVBSVFJLUVRUWVpXVU9STlNYV1RTVFJSWk9RU1NWW1ZWV1RWWlhdXlxcXlZTTlRVVlxcVlJUVlZYWVNUWVxUU1NdWFpdXlxgYGBWYltjYl5hY19dYmFiX2RmaWRmXltkYGFgYWNlX2JfWVpeW1xbWVhZV1daWlphXF1bXVxcWl1gV1tbWlBPT09ZUFVVUlFXUlRQW11eXltgXGBVXF1panJ9c2xnXFVYV1FPUlpTUlFUUlRVVEtRV1ZbWVpTT1NSVlZWVE9WUlNaUlRVVFhdV1hYU1hcWF5dWVpdVFVOVldXX1tYUVRVWVlZVVdZW1RTVl5ZXV1gXWJiXllgW2ViX2RkX15jY2FdZWZpZGZdXmRhYGFiY2RfYl5YWl9bXFtYWFhYV1taXGBcW1tcW1haW15WXlldUE9PUlpQWlRVVlZUVFReXmBfXmJcYFVdXmJreXVtfWxaVVlVUVFTXFRVVFVUVllXTFJaV11bXFJPVVNYVlZUUFhSU1dTVlVVW11YW1lVWl5YX15ZXFlSV1JZWFlfWlpTVFZaWVpWWFlcVlRaXlxeYGFfZGNcXl1dZWFiZmReX2RjYFxnZGhlZGJfZGFfYWBiYl9gXldYXlpcXFpZWVdWXVpdXlpZW1xbV1lcXVZYV11TT1BXWVFdVVZZV1dVWF9gYWFgY11fVF1eYmVldoJ7aFhZWVNWU1ZcV1dXVlZXXVhQVV1aXl1dVFJYU1dWVFNUWFJTVlRYWFhdXlhdW1ZdX1hfX1hdVlFZVFlaWmFZXFVWWFtaW1hZWVpYVl1eX15jYmFkZFxiXGBmYWRmZF9gZGJiW2ZjaGVjZmFmX19hYWFhYF9eVlVdWVtcW1lbWVldW1tbWFhZW1laWl1fXVRZXVVOVFpWU1xUVldZV1ZcYGFiY2FjXl9WW2BkYV96dW9oWVxaVVdVV1taWVxZWFlgV1BWXlxgYVxUVVhQVVdVU1dWUlNVVlpaXF9eWl9cVl9fWl1eWV5WU1lXWVpdYlpeVldbXFtcW1tZWllZXl9gYGRiY2VlYmRaYmZjZ2ZlXmFiYGNeY2NpZGRnX2deYmJjYWFgXl9YVFpaWltbWFtYWFxbWltXV1lYV1xbXGBdVl1dU1BWWlZWWlVYVVhXWF1fYmFkYWRgXllZYWRiYGtmaF5cXVtWV1hZXFxcX1tZW2JWVFheXWFjXFJWWFFXVldWV1ZTVlRYXFxeYGBdYVxXYV5bXlxbXlhWWFhbW19gXF9YWV1cXV1eXFpcWFtfYV5gZGNkZmZmYlljZWVoZ2ReY2BgZWNdZmlkZWlfZ15jYmNhYWBfX1tYWVtZWlpYWVhXW1taW1dYWlRZXVxaYFxVXmJOUldZVldaWFtcWFdZXmBiYWVhZGFdXllhY2JfYWBhXlxcXFdXW1tdXV9fXFpdY1haWF1gY2RfUlhZUFhXWFlZV1ZYVl1dXmBhYF9iXllhXV1eWV1eWVhWV1tcYF9dX1paXl1eXmFcW1taXGBhXmJkY2VmZWZiWmRmZ2lnY19jXmFmZFppaWJmaWNlXmJiY2FgYF9dXVpXW1lZWFhaWFdaW1pZV1hWVVtdXV1gYGJieExXV1xZV1xbXF1aV1xdX2BiZGJiYV1gWGJjYmBjYWJdW1xbWFdbXF9dYF9dW2BkXFxYWmNlY2BSXFlPWFhaW1pZWFpZYF1gYmJgYWNfXGJdX11bXl5ZWVVYXV5fYF9fXFpeXmBiY1xcWFteYGJhY2VkZ2VlZmRcZWZoaWZjYmJcY2dgXGlpYmhpZmVgYmFjYV9gX11dW1lcWVhXWFlYV1xbWldXWFBYWl1hY2Zmcmt/SllXXVpaX1xbXlxYXVteX2FjYmFhXWJbYmRiYGNjYlxbW1pXWGlxYFxgX11cYWNfXllZY2VkYVNfWlFZWFxdXFtaW1tjYGNiY2BiZGFgY15gXF5eX1pYVltfXl1hYV9dW2BhYmViX11UXGBgY2RkZmRnZmVmZV5lZmhoZ2RkYFtmZ15haGhjaGhmY2BiYGNiX19fXV1cWltZWFhYVlpWXFpaVlZVTVhXXGdpa2h1eIF2dnZ2dnZ2dnZ2dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6e3p6ent7e3t7e3t7e3t7e3t7e3x7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHt7e3t8fHx8fHx8fHx8e3t7fHx8fHx7e3t7e3t7fYmIhoqHhYKBgoOCg4OCgoKCgoKCgoKCgoGAgYCBgICAgYCBgYGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t6e3t7e3t7fHx8fHx8fHx8fHx7e3t7e3t7e3t7e3x7e3t7e3t7fHx8fHt7e3t7e3t8iYmHiYaFgoGCgoGCgoKCgYKCgoKCgoKBgYGAgICAgICAgIGBgYB9fHx8e3x8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eHh5eXl5eXl5eXl5eXt7e3t7e3t7e3t7e3t7e3x8fHx7fHt6enp6ent7fHx8fHx8fHx8fHx7e3t7e3t7fHx8e3t7e3t7e3t7fHx8fHx7fHt7e3uHiYiJhYSDgYKCgoODgoKCgoKCgoKCgYGBgICAgICAgICAgYKBgH58fHx8fHx8fHx8fHx8fHx2dnZ2dnZ2d3d2d3d3d3d3d3d3d3d3d3h4eHh4eHh4eHh4eHh4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t7e3t8fX18fHx9fHp6enp6e3t8fHx8fHx8fHx8fHx8fHx8e3x8fHx8e3t7e3t7e3x8fHx8fHt7e3t7e4aJiYiFhYOBgoKCgoOCgYKCgoKCgoKBgYGAgICAgICAgIGBgYCAfnx8fHx8fHx8fHx9fX18fHVwb29vb3Bwen59fX19fYSMi4uLi454KSkqKiopKz0/Pj4+Pj5tgH5+f397pdfT09PT1r2GiYmJiYmJjI2NjY2NkEYoKioqKiKL29LS0tLWun1+f39/f359fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx8fHx8fHt7e3t7hIuHh4aHgoGDg4GCgoKCgoKCgoKCgoGBgYCAgICAgICAgYCBgIB+fHx8fHx8fHx9fXx8fH19dXBub29vb296gH9/f39+hpCPj4+Pk3kZGhoaGhocMTMzMzMzMmqCf4CAgHut6eTk5OToyomMjIyMjI2PkJCQkJCUOxYaGhobEI/v5eXl5enHfX5/f39/f319fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e3uCjYeIh4eDgoSCgYKCgoKCgoOCgoKCgYGBgICAgICAgICAgICAgH58fHx8fHx8fXx8fH19fX12dXV1dXV1dXZ3d3d3d3d4eXl5eXl6eG9wcHBwcHBycnJycnJyd3p5eXp6en6Dg4ODg4SBfHx8fHx8fX19fX19fX12c3Nzc3NzfYWEhISEhYJ8fX19fX19fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e4CMhomHh4SDhIKCgoKCgYKCg4KCgoGBgYGBgYCAf4CAgICAgICAfnx8fHx8fHx8fX19fX19fXZ2dnZ2dnl3dnZ6e3h7eHd2eHt4enl5fXp5eXh4eHh5eXl5enp5eXl5enp6eXh4eXl5eXl7e3t7e3t7e3t7e3p6enx9fX19fX17enp6enp6e3x8fHx9fX19fX19fX18fH19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8f4uHi4qIhIODgoKCg4KBgoKDgoKCgYGBgYGAgIGAf4CAgH+AgYF+fX18fHx8fHx9fX19fX19d3d3dnZ3fXh3d316eH14d3d5fHx7fXp8e3h3d3d3eHh4eHh5eXl5eXp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fHx8fHx8fHx7e3x8fHx8fHx8fHx+iomMjImFg4SEgoKDgoGCgoKCgoKBgYGBgYCAgICAgICAf4CAgH19fXx8fH19fX19fX19fX13d3d3d3p9eHt4fHx3e3h3d3d5fHt+eXx6eHh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fX19fXx9fX19fX19fX19fX19fHx8fHx8fHt7fHx8fHx8fHx8fH2Kio2NioWDg4OCgoKCgYGCgoKBgoGBgYKBgIGBgICAgIB/gIGAfXx9fX18fX19fX19fX19fXd3d3d3fX55d3d4e3p7eHd3d3x5eXx6fHt3eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt8fHx8fHx8fHx8fHx8fH19fX18fH18fH18fHx8fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8foqJjo2JhISEg4KDgoKBgYKBgoKCgYGBgoGAgYKAgICAgH+BgIB8fH19fX18fX19fX19fn5+d3d3d3d5fHl7eHx9eXt5enp6f3t7fHt9e3h4eHh4eHh4eXl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt7fHx7fHx8fHx8fHx8fXx8fX19fX19fXx8fHx8fHx8fXx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx/iIeNioeFhoaDg4ODgoGBgoGCgoGBgYGCgYCAgoF/gICAf4CAgHx8fX19fX19fX19fX5+fn53d3d3d3Z4eHl3eXp4enh5eXl8e3p6eXt5eHh5eXh4eHh5eXl5enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX18fH18fH19fX19fH19fX19fHx8fHx8fHx8fHx8fX+HiIyIhoeHhIKDhISCgYKBgYKCgoGBgYKBgIGBgYGAgIB/gIGAfHx9fX19fX19fX1+fn5+fnd3d3d3d3d3d3d3eHh4eHh4eHh4eHl5eHl5eXl5eXl5eXl6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fHx8fX19fHx8gIeIi4eHiYaDg4SDg4KBgYGCgoGBgYKCgYGBgIGBgYCAgICBgX97fH19fX19fX19fn5+fn5+d3d3d3d3d3d4eHd4dnl5eHh4eHh5eXl5eXl5eXl5eXl5enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fH19fXx9fXyBhoqKiYmIhIOFhISCgoGBgYGCgYGCgoGBgYCAgYGAgIGAgIGBf3x8fX19fX1+fn5+fn5+f394eHd4eHh4eHZxZGpeam15eXl4eHl5eXl5eXl5enp6enp6enp6enp7e3t8e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIGFiYqJioeEhYWEg4KCgYGBgoKBgYKBgYGBgYCBgYCAgYCBgIF+fH1+fn5+fn5+fn5+fn9/f3h4eHh4eHh5bWRiZV9fXm95eXl5eXl5eXl5eXp6enp6enp6enp6e3t7e3t7fHx8fHx8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goWKiomJhISGhYSDg4KBgYKCgoGBgoGBgYKBgIGBgICAgICBgH58fX5+fn5+fn5+fn9/f39/eHh4eHh4eW5kZWdlZGJeZnh5eXl5enp6enp6enp6enp6enp6e3t7e3t7e3x8fHx8fHt8fHt7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChouJiIqEhYaEg4OEgoGBgYGCgYKCgYGBgYCAgYGBgIB/gIGBf3x8fn5+fn5+fn9/f39/f394eHh4eHl3Z2VkZWZkZWFfaXl6enp6enp6enp6enp6ent7e3t7e3t7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHt8fHx8fHx8fHx9fX19fX19fX19fX19fXx9fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4eJh4SEhoSDg4WBgYGBgYKCgYGBgYKBgICAgYGAgYCAgYF+fHx/f35/f39/f39/f39/gHl5eXl5eWtlYWJlZWFlZV5ieHdze3p6enp6enp6enp6e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fH18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19g4aLhoiFhYaEgoOEhIKBgYGBgoKBgYKBgYGAgYGBgYGAgIGBgn98fH9/f39/f39/f3+AgICAeXl5eXl0Y2NlZGNmY2doZGZsZF5ze3p6enp6enp6enp6ent7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn6DhouGhoaGhYODg4SDgYGBgYGCgoGBgYKBgYCAgYGBgYCAgYGBfnx8f39/f39/gICAgICAgIB5eXl6d2RhY2diYmRdW2VfYV1eYGFoeHp6enp6enp6enp6e3t7e3t7fHx8e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+foSFi4eGhoaGhIODg4KBgYGBgoKCgYKBgoGAgIGBgYGAgYGBgYF+fX1/gH+AgICAgICAgICAgHl5eW9vYmJiZF5jZ19dYWFgXF9kYlttfHp6enp6enp6enp7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7fHx7e3x7fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5/hIiLhoSHhoaEhIODgoGBgYGCgYGBgYKCgYCAgYGBgYGBgYGBgX5+fYCAgICAgICAgICAgICBeXpwXWJlZGJkXmZnZ2BZYmJhY2VfXF1ze3t6enp7e3t7e3t8fHx8fHx8fHt7e3t7e3t7e3t7e3t7fHx8fHx8e3x8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fn19fn5+fn5+fn5+fn5+foCFjIqEhYaGhYODg4SCgYGBgYKBgYGBgoKCgYCBgYGCgICAgIGBf35+gICAgICAgICAgIGBgYF5emxiZGdjYmdmYWBgZGFiZWRjZGNeXGJ1fHt7e3t7e3t7e3x8fHx7e3x8fHx7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/gYeMiYWGhoeFg4SDgoGBgYGBgYKBgoKCg4KBgIGBgYKBgYGCgoF/f36AgICAgICAgIGBgYGBgXp7dGdnZmZkZGZmYF5fYWNlaGRlXmJkYHR8e3t7e3t7fHx8fHx8fHx8fHt7fHt8fHt7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f3+CiYqIhoaIhoWDhIOCgYGBgYGBgoGBgoKCgoGAgYGBgoKBgYKCgX9/f4GBgYGAgYGBgYGBgYGBenptaGNjZ2ZnZWdmZmdiZWRlYmdbYmVgdnx8e3x8fHx8fHx8fHx8e3t8fHx8e3x8fHt7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f39/f4SJioiGiYeFhYSEg4KBgYGBgYGCgYKCgYGBgYGBgYKBgoGBgICBgH9/gYGBgYGBgYGBgYGBgYF7emlpZGNqZmFgZmVjY2NnaWRjYmBiZGJ0fXx8fHx8fHt8fHx8fHx8e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f39+fn9/f39/f39/f3+AhIqMiIeJhoSFhYOCgYGBgYGBgYKBgoGBgYGBgYGBgoKBgYGBgYGAgH+BgYGBgYGBgYGBgYGBgXZzZWRnY2RmZWJlZmdkZmhmZWNgYGNkYHF9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fXx8fHx8fHx9fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/fn5+f35+f39/f39/f3+AgICFioyJiIqJhoaDgoKCgYGBgYGBgoGBgoGBgYGBgIGBgYGBgYGCgX+Af35/foCCgoKCgoKCgoKCc3NnZWRkZWlqaGZnZ2NhZmZlZmdmZWVjdX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fH19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gICAgICAgIWLioqJioeHhoSCgoGBgYGBgYKCgYKBgYGBgIGBgoKBgYGBgYGAf4B+dHRzdX1/goCAfn5/gYB0cmdkZWNmaWppZWNlY2BmZGRnZ2JiZWFwfXx8fHx8fHx8fHx8fHx8fHx9fX18fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f39/f39/f4CAgICAgIB/houLiouLh4eHhIOCgYGBgYGBgYKBgoKBgYGBgYKCgYCBgYGBgoCAgH5zc3NzdHV4dXV0dHV2dXVwZmNmZWhoaWdoZ2VmZWJfZGVmY2BiZ3d8fHx8fX19fX18fHx8fH19fX19fX19fXx9fXx8fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gIB/f3+AgICAgICAgICHjIyIi4qHh4eEhIKBgYGBgYGBgoGCgoGBgICBgoGBgYKBgoKCgYCAfnNzc3Nzc3NzdHR0dHNzdW9jY2FnZWhoZ2pmZGVnZmhmY2JlYl5ieX18e3t8fX19fX18fHx9fX19fX19e3x9fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn9/fn5+fn5+fn5/f39/f4CAgH9/gICBgICAgICAgYCAf4CAgYGAgIeLi4iNiYiJhoSFgYGBgYGBgYKCgYKCgYGBgIGCgoGBgYKBgoKBgIB+dHNzc3Nzc3Nzc3Nzc3N1cmdlZWRlamhoZ2ZpaGdjZWViZGNoZGd7eHVzc3R2dnl4dnR0dHZ3d3d2dHR0dXV4d3h4d3d6e3x9fXx9fn5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f35/f39/gH9+fHt7fX58eXl2dnZ5fHx6end2d3l7fXt4hIyMioyHh4iEhYSBgYGBgYGBgoGBgoGBgYGAgYKCgYGBgoGBgoGAgH51c3Nzc3Nzc3Nzc3Nzc3VzaGVnaGVrbGhqZ2lqZ2dnZmRkYmVkbnV0dHNzdHNzc3Nzc3Nzc3Nzc3NzdHNzc3Nzc3Nzc3N0dHV1c3V3eHl7fn59fn98f39/f39/f39/f314fH5+fXx4dXZ3eXd4dnRzc3N0dXRzc3Nzc3NzdHNzc3R0c3R0dHODjI2KiYeIhoOGg4GBgYGBgYGBgYGCgYGAgYGDgoKBgYCBgYGBgICAf3VzdHRzc3Nzc3Nyc3NzdnZpY2hqaGpsZWZpbGhgZmVkY2BkZGZ0dXV1dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHRzdHRzc3Nzc3R2dnV1d3V4fH9+fX9+fHp4dXN0dXV1dHNzc3Nzc3N0dHR0dHR0dHR1dXR0dHV1dHR1dXR1dXV1dIaMjYuIhoeEhIWCgYGBgYGBgYGCgoGAgYCBgYKCgoGBgIGBgYGAgIB/dnNzc3Nzc3Nzc3Nzc3N2dnNnZ2pmaGdmaGhmZGlnY2NnZWVmcHZ1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dHR1dHR0dHR0dHRzdHR0dnV1d3Z0c3R0dHR0dHR0dXV1dXV0dXV1dXV1dXV0dHNzc3N0dHNzdHR0dHR1dXR1iY6MjIqHh4SEhYKBgYGBgYGBgYKCgoGBgICAgoKCgoGBgYGBgYCAgH93c3Nzc3NycnJyc3NzcnZ2dW5kXWNnZWlraGVoZ2dqamlnZXB2dXV1dXV0dHRzdHR0dHR0dHV1dXV1dXV0dHV1dHR1dXV1dXV1dXV1dXR0dHV1dXV1dXV0dHV0dHV1dXV1dXV1dXV1dXV1dXV1dXV0dHNzc3Nzc3N0dHNzc3Nzc3R0dHR0dHWKjoyMiYaGhIeFgoGBgYGBgYGBgoKBgYGAgYGCgYKBgYGBgYKBgYCAf3hzc3Nzc3JycnJyc3NzdnZ3d2liaGhnamtpaGZkZGVmaWhwdXR0dHRzc3JxcnJ0dXV0dHR0dHR0c3NycXFxcXNzdHR0dHR0dHR0dHV0cnJyc3R0dHR0dXV1dXV1dXR0dXR0dHR0dHR0dHR0dHR0c3Nzc3Nzc3Nzc3Nzc3N0dHN0dHR0dHR0dYuOjImGhYWFh4SCgYGBgYGBgYGBgoKCgYGAgIKCgoGBgYGBgYGBgIB/eXNzc3NycXJycnJzc3N3d3d3bGpoZGhpa3Z6a2VmZWhnbXJzdHN0c3JwcHBxcnN0dXR0c3NycnNycXBvb29vcHFzc3NycnJyc3R0dHNxcHFyc3R0dHR0dHRzc3Rzc3NzdHR0dHRzdHR0dHR0dHRzdHR0c3NycnFxcnJzc3Nyc3NzdHR0dHN2jZCMh4eFhYSEgoGCgoGBgYGBgYGCgoKBgYGAgYGCgoGBgoKBgYGAf395c3NycnFxcnJycnNzc3d3d3dzc2pnaWloeX99cW51bG5wcXJycnFxcG9wcXFxc3Rzc3NycXFwcG9ubm1ubW5ubnBxcnJycnJycnJzcXBvb3BxcnJzc3JxcnJycnJycnJycnJzc3Jzc3Nzc3Nzc3Nzc3Jxb29ubm9vcXJzc3Jyc3NycnNzcnaPj4uHhoWFhYOCgoKBgYGBgYGBgYGBgoGBgYGCgoKBgoGCgYGCgX9/f3hxcHBwcXFycnJyc3Nzd3d2dnd2cnF0c252f352c3hwcHBycnJycXFwcHFxcXFyc3Nzc3FwcXBvb25ubm5ub25vcHBxcXFxcXBwcXJwb25vcHFxcXFxcHBxcXFxcXJycnJycnJycnFxcnFxcnJycnFwb29ubm1ubW5vcXJycnJycnJyc3JxeI+OjYaDg4aEgoOCgoGCgYGBgYKBgYGCgYGBgYKCgoKCgoKBgYKBf4B/d29wb3BxcnJyc3Nzc3J2dnZ2dnZ3dnZ1c3l/fnd3d29wcXFxcXFxcHBwcXJxcnJzc3JycHBwb29wb29vb29vb29wb3Bvb29vcHBxb29vcHBwcHBvcG9wcHFycXFxcnJycnFxcXFxcXFxcHBwcHBxb29ubm5tbW5tbm9wcXFxcXFxcXFxcXB7j42NhoODhYOCgoKCgYKBgYGBgoGCgYGCgoGCg4KBg4KBgYGAgYF/f392bm9wcHBxcXFxcXBwcHZ2dnZ2dXR0c3NxfYB9fX9zb3BxcXFwcHBwcXFwcHFxcnJxcXFwcHBvb3Bwb29wcG9vb29vb29vb3BxcXBub3Bwb29wb29wcnJycnFxcXBxcnFwcXFxcHBwcHBwcHBwb29ubm1ubm5ubm9ub3BwcHFxcXFxcXFxcIKRjoqEhIOFhIOCgoGBgoKBgYKBgYGBgYGCgoKCgoKCgYGBgYCBgX9/gHVvb29wcXFxcXBwcHBwdnZ2dXRzcnJycnGAgoCBeXBwcHBvcHBwcHFxcXFwcXFxcXFxcHVycHBwcHBwb3BxcHBvb29wb29vcXFwcG9wcG9vb25vcHFxcHBwb3Bvb3BwcHBwcHBwcHBvb29vb29vbm5tbW1ubm5ub25vb3BvcHBwcHBwcHBwiZCMiISDhIaDg4KCgYGCgoKCgYGBgYCAgYGBgoKBgYGBgYGBgIGBgH+AdG5vb3BxcXFwcG9vcG92dnVzcnFxcXFxcICDg39ycHBwcHBwcHBwcHFxcHBxcXFxenFvi3ZvcHBwcHFwcHBwcHBwcHBvcHBxcXBwcHFxb29vbm9wcHBvb29vcHBvb3BwcHBwcHBwcHBvb29vbm5ubm5ubW5ubm1ubm9wcG9vb29vb3BzcXWPj4uJg4KFh4ODgoKBgoGCgoKBgYKBgYGBgYGBgYGBgYCAgYGAgYGAf4B0b29vbm9vb29vb29vb3Z1dHNxcXFxcXJygIKCgXRxcXFxcXFxcXFxcXFxcXFxcXGNc3OYeHBxcXBxcXFwcHBwcHFxcXBxcHBwcXBwcHBwcHBwcHBwcHBwcHFxcXBxcHBwcHFwcHFxcHFxcXFxcXJxcnFwcnRycnR0dHR1dnRzdHR0dXd3gpCPi4iDgoaHhISCg4GBgYKCgoGBgoGBgYKBgYGBgYGAgICBgYCBgYB/gHVvb29vb29vb25vb29vdXRzcnJycnJycnKDg4OCdnFycnFxcXJxcnJxcXJycnJxcJd7dqB/cHJycXFycXFxcXFxcXFxcXFwcXFxcXFxcnNzcnJyc3V1dHR0dHR0dHV2d3d3d3d3eHh4eHd3eHh4d3Z3dnV2dnZ2d3h6e3x7e3t6enp6enyGkI2LiIODiIeHhYODgoGCgYKBgYGBgYKCgoGBgYGAgYCAgYGAgIGBgH+Ad3FxcXFxcG5ucG9wcG92dHV1c3Nzc3NzdYiDgoN5cnNzcnJyc3Jyc3NycnJycnN0n4J7pIdxdHRzc3Nyc3N0dHV1dXV1dHV3eHd3d3d4eHh3eHh4eXl5eXl4eHl5eXp6e3t7e3t6enp5eXh3d3d1dnV2dnd5enp7fn5+fX1+fn5/f35+gIyQi4qHg4WIi4iEg4SDgYGCgYGBgoGBgoKCgoKAgYGBgYCBgYGAgIGAf4B8enp5eXx5eHh2dXZ2dHl2d3h3d3Z3dnZ6fnx+fnx2dnd3dnV4enh4eHh3d3d3eH+njIimkHd8e3l5eXh4eXl6enl5eXh4enp5eXh4eHh3dnd3eHh3eHh5eXp7e3p8fH1+fX9/f359e3t7e3p5enl5e3t/foB/fn5/fn19fX5+f35+fn6AjpCNioeEhoqLiIaGhIOBgoKBgYGCgYGCgoKCgoCBgoKBgYGCgYCBgIF/f4B/fn19fX9/f318e3t7eXh4eHh5eXl4eXh5eXl4enp6enp6e3t7fH1+fHt7e3x9fqmShqWVent7e3l4eXh4ent6enp5eXp8fHt6enx8fHp6ent9fHx+fn+AgoGAgYKAgH9/gYGBgIB/f35+fn5/fX1+f4CAf35+f39+fn9/f39/gH+Af4OQjoyHhoWIi4yIh4aFg4GCgYGBgYKBgoKCgoKBgYKDgoGBgYGBgIGBgIB/goOCgoGBgX99f39/f4F6enh4d3h4eHh5eHh5enp5e358enx9fXt8fX19fXx8f3yCq5yKopV9fX9/f3x8fYCDgYCAf318fXx9fXt9fXx8fH19fX1+gYGChISDgoB/gYGBgH9/f4B/f39/f39+fn9/f39/f35+f3+Af39/gICAf4CAgICAhJCPi4eGhoiLi4mKhYaDgoKCgYGBgoGCgYKBgYGBgoOCgYCAgYGAgIGBgH+ChIKCgICAgH9+fn+AgH9/fn18fX19fYB/fX+Af35/gH9/fn9/gICBgICAgICCgJqvqKenlX9/f4CBgH5+f39+f39/fn5+f39/gYB/f4CBgYCAgYOEgoGCgoGCgH+AgYCBgYGAgH+BgICAf39/gICAgYGBgIGBgYCAgICBgoGBgYCAgYGFjo6MiYaHiYyLi4qGhoOCgoKBgYGCgoOCgoKBgIGBgYKCgICBgYCAgYGAf4KFg4KBgYCAf39+fn+AfX5+fn19fX5/fn9/f35+fn+AgYCAgICAfn9/f3+BgYCFrKalr6afgn9+f35+fn9/fn9/f35/gIGBgoKDg4KCg4KBgYKDg4OCgYGBgYKBgoKCgYKBgoGBgYGBgoKCgYGCgYKCgoGBgoKBgYKCgoKCgYGBgoKCgoaPkY+KiImKjY6NiYaFgoKCgoKBgYKCg4KCgoGBgYGBgYF/gIGBgYCBgIF/gYWEg4KCgoGCgYCAgIB8fHx7fH18fH9+fn9+fn5+f35+f39/f39/gH5+f4F/fo+pmaKqm6OPf4B+f4B/gIB/gIF/f39/f3+BgYGCgoCAgYKDg4SDg4ODgoKCgoKCgoKCgoKCgoGCgoKDg4OCg4ODgoKCgYKCgoODg4ODgoKCgoODg4KCh5KTkIuKi4uPj42Kh4SCgoKCgYGBgoKDgoKBgYGBgIGBgICAgYGBgIGAgYCAg4SDg4OEg4ODgoKCgXx9fHx9gn1+f4GCiIGCgoSCgYGDg4GBgYKDgYODgoGBn6GTn6SYn5iAgISOgn+AgYCAgICAgH9/f3+AgICAgH9/gYODhYSEg4SDgoKCg4OCgoOCgoODg4ODg4SDg4KEhYWDg4SEgoKDhIOCg4ODg4OCgoODgoCKlJOPioqMjpCPjYuGg4KCgoKBgYGBgoOCgYGBgIGBgoGBgICBgYGAgYCAgH+BgoODg4SEhIOCgoKCfXx8fn6AgYOAg4OChIaFhoaFhIWFg4ODg4SBg4uLhYGYnYqdqpudmoSIm5KCg4KDg4KDg4ODgoGAgIKCgYOCgYKCg4OEhYWEg4OChISEhIOEhISDg4OEg4ODg4OEg4SDhIWEhISDg4ODgoKCgoKCgoKBgYKCgo+UlI+Njo6RkY6KiISCgoKCgYGBgYGCg4GBgIGBgYGBgYCBgIGBgYCBgICAgIKChIKChIOCg4ODgoJ9fX2AgH+AgoGDg4ODhIaEhIOEhYWDg4GBg4OBhZWbjJKdk52umZOen5+aiIeHh4eGhoeHhoaEgoGCg4SDg4ODg4ODhISFhYWDhYSFhISEg4KBg4OCg4SEg4KCg4SCg4ODg4OCgoKCgoKCg4OEhIOFhYWFhoaIk5OTkI+Pj5KRjIqIgoKCgoKBgYGBgYKDgoKBgIGBgYGBgICAgYGBgICAgICAhISEgoKCgoGBgoKBgX+AgYOCgICAf4CCgoGDg4KCgYODg4SDg4GDhYSCjaWqrKmjnaWZnaSinZCHiIiHh4eIiIiFhIOBgIGBgoKCg4GCg4SEhYSDg4OEg4OEhIOBgYGCg4OEhISDg4ODg4OEhIODgoSDg4ODhIWFhoeHh4eIiIiJiY6TkpKOj46RkY+LiYeCgoKCgoKBgYGBgoKCgoGBgIGBgYGAgICAgYGAgIGAgICDg4KCgYKCgYGAf4CBhYWFhoOCgYB+fn+BgoSCgYKDhIOCg4ODg4KChISDk6aooZyfmpuen56WhISFhYKEhIWFg4KBgH9/gIB/gIGEg4OEhYWEgoKCgoOCg4OFhIKDhISEhYaGhoaGhoWFhoeHhYaIh4aHiIeGhoaIiYeGhYaGhoeIkZKSj46QjpCRjImHhYGBgoKCgoGBgYGBgoOBgYGBgYGBgICAgICBgYCAgICAgISEg4KBgoGAgYGAgYKIh4aHhYSCgH99fX6AgH+AgYGBgYGBgoGAgYKDgoKEkZeWmJ2ZnJ6cmoyAgICAfoGAgICAgH9+gIGBgYKCg4OEg4OEg4OCgoGBgoODg4SEg4SEhIOFhYaFh4eIh4eHh4eHh4eGhoaGh4WFhYaGhISEhIWEhYaSk5GOjo+OkI6JiIeEgoKCgoKCgoGBgIGCgoKCgoKCgYGBgYGAgYGBgICAgYGAgoSDg4KDgoGCgYKDg4iHh4iHhYSCgX5+gICAfn5/f4CBgYGCgoCBhI2DgX+DjZKWmpeboJ2ThIOAf39/gICAgICAgICDg4KDg4ODgoOBgYKCgoOCgYKCgoOCgoSDhISDg4SEhYWFhYaGhoaFhISEhYWEhIWFhYSEhISDhISEhISEipSTkpCQj46NiIaFhIOBgYKCgoKCgYGAgYKCgoKBgoKBgYCBgYCBgYGAgICAgYGAg4OCgoOCgoKBgoOCiImJiYiHhYSDgYKEhIOBgoKCg4SCgoSEgoOJl4iEgoWGkJaZl5yfm4iBhIOBgYCBgoOCgoGDg4SDg4SEg4OCg4KDg4ODg4KCgoKCgoGDhISEhYSFhYWFhIWEhIWFhYWDg4OEhISEhYWFhISEhISEg4ODg4OOlZKQkZGPjYyHhYODg4GBgoKCgoKBgYCBgoOCgYCCgYGBgICAgIGBgYCAgICBgICDhYSEhIODg4SDhIOGh4mIhoWDhIODg4WDgYCDgoWFhISDg4OChI6Zi4OFhISKk5mVmpyQgoKEg4OCgoGBhIWEg4ODgoKDhISDg4ODg4SFhISDg4KCgoKCgoSEhYSFhYWFhYODhYWFhYaFhoWEhIWEhYWGhYWFhIWEhISDhIODhJGUk5KSj4yMioWEg4ODgYGCg4KCgoKBgYGCg4KBgYKBgYGBgICBgIGBgH+AgIGAgYaGhoaGhoaHh4aGhYSDhYaCgIGBgYGHgoB+f4GBj4yDgX9+fXx9jJyNgIKBgoOHko2RjoOBgYKDg4GBgYKDhYODg4KDg4OEgoKEhIOEhIWEg4OCgoKCgYKCg4ODg4SFhYWFhIOEhYWGhYWEhISEhIOEhIWFhYWFhIODhIOEg4KGlJSSlJKPjYyIhISEg4KBgoODgoKDg4GBgoKBgoKCgYGCgYGBgYCAgYGAgICAgICAhYWFhYaGh4aGhoWGg4ODg4GAgoKCgYKAf35/f4GVl4mAfX19fXuBmIyAg4CBgoCEiYiBgYKBgYKBgYKDgoODgoOCgoKCg4OBg4SDg4ODg4OEhIKCgoKDgoKDg4ODhIWEhISEg4OEhIODg4OEhIODg4ODg4SDg4ODg4KDg4KDgouUk5KTko2NioeDg4OEgYGCg4ODg4ODgoGBgoGCgoKCgoKBgYGBgICBgYCAf4CAgICDhISFhYSFhYWEhIWCg4KDgoKDg4OBgICAgICAgJWfin5+gH2Hin6EhIOEgoODg4KEg4CCgoODgoKDg4ODgoODhIKCgoODgoKDg4KCg4KDg4WEg4ODg4SDg4SEhISEhYWEhIWEg4SEg4OEhISEhISEg4SEhYSDg4SEhIODgoKDkJSSkpKPi4yIhoOFg4OBgYKDg4ODg4OCgYGCgoKCgoKDgoCBgoGAgICAgIB/gICAgISDhYWEhYWFhYSFhYOEhIWDg4SEhIKCgoOCgoSBkaGKf4yFfYaJgH6FhYWEhYJ/fn59f4OEg4ODg4OEg4ODhISEg4OEhISEg4SEhIOEg4OFhoWFhYSFhYWFhYSFhoWGhoWFhYWFhYWFhYWGhoWGhoaFhoaGh4aFhYWFg4SEhIeTk5OSkoyKiIWFhYWCgoGBgoODg4OCg4KBgYKDg4ODgoKBgIGAgICAgICAgH+AgICAhYWFhYWGh4eGhYWFhISFhYSEhISEg4ODg4OEhYOKkYOEi4WCgYF+fYGHhoOAfn5/f39/f4OEg4OEhISEhISEhISEhISFhYWEhYSGhYWGhYaGhoWGhYWGhYWGhYaGhoaFhIWFhYWFhIWGhoaHhoaGhoaHh4iIiIaFhYaEhYWGjZSTkpGQi4qHhoeGhIGCgYKDg4ODg4KDgoGBgoODg4KAgYGBgICAgICAgICAf4CAgICHh4eGhoeHiIeHhoaEg4ODhIODg4OEg4ODg4OEhISEgYKCgYmBf359foWBf39/f39/f35/gISFhIWGhoaFhYWFhoaHhoaFhoWFhoeHh4iHh4eGhoaHh4eGhoaGhoaGhYSDhIWFhYSFhYaGhoeHhoaGhoeHh4eIiIeGhoaHh4eRlJORkZCLiYiFhoSDgoKBgoODg4ODgoKDgoKCgoOCgYCBgICBgICAgIGAgIB/gICAf4aHiIeHh4eIiYmIiIODgoKDgoSEhIWEg4KCg4SEhIOBgICAhIR/fn5/gH9/f39/gIB/f4B/f4WFhoeIiIeHh4eIh4iHiIiIhoaHiIiJiYmIh4aHh4eJiIaHhoeHhoaFhIOEhYaFhYWFhoaGh4eFhoeGh4aGh4eHh4eHh4eFh5OTkY+RkIuHhoWGhIKCgYGCg4ODg4ODgoKCgoGCg4KCgIGBgYCAgICAgICAf3+AgYB/hoiIiIiHh4iJiYmIg4KCg4ODhIWHh4aFg4OFhISDg4GAgIGMiYGAgYKCgYGBgYB/gH9/fnt6gIaIiIqKiYmIiImJiYmKi4qIiIiJiYuLioqIiIeIiIiHh4iIh4iGh4aEg4OFh4eHhoWFhISDhYWEhYWGhISEhYWFhoWGhYOJlJOQj5COioaFhoWDgYGCgoKDg4ODgoKCgoKCgoKCgYGBgYGBgYCAgICAgIB/gICBgH+GiYiIiYeIiImJiIiEgoKDg4KDhImKh4aEhIWEg4OCgICAhISCgoKCgoKCgH9+fX19fX5+fHt8g4eJi4uKioqIiIqJiImLiomJiImIioqJi4mHhoaGh4WGiIiJiIeGh4SDgoSIiIiIh4WCgoGDg4KDg4SCgoKDgoGEg4SDgY6TkpCPj4uIhYSGhIKBgYGBgoODg4OCgoKCgoKCgoGBgYGBgIGAgICAgICAgH+AgIGAf4WIh4eHhoeIiIiHh4SCg4OCgoOFiYqJh4WHhYSFhYKAgYOEgoOCgoKDgX59fn5+fn5+fn1+fX19g4eJioqHh4WGh4eHh4iHh4mGiIaIh4aJiYODhIOFhISFhYaIh4aFg4KCg4WHhoeGhoOCgoOEgoODhIKBgoGBgYODhIODkZKQjo+Oi4eEhoaEgoGAgYGDg4ODg4KCgoKCgoKCgYGBgIGBgYCAgIB/gIGAf39/gIB/hYaGhYaGhoeHiIeGgYKEhIOChYeIi4qGhIaEgoaGgoKEhIODg4OCgoF+fX1/gH5+fn59fH19fHl8g4aGh4SDgYODhIWFhYODhYSEhISEhIWEgoKCgYSEgYKDg4WGhYSCgYGCgoODhYOEhIWEhIaDhISFg4KDgYKDg4SFhIeSkY+Nj4yJhoSFhIWCgYCBgYODg4ODgoKCgoKCgoKBgYGBgYGAgICAf4CAgYB/gICAgICDhIWEhYWFh4eHh4aAgYGFg4OEhYSHiIWCgIB/gn9/gIODg4ODgoJ/fX5/gICBf31+fn19fX17enp+hISEgoGBgIGBgoKBf36BgYGCgYOBgoGCgoKBg4OAf4CAgoOCgICAgICBgYGCgYGChIODhYSCg4SDgoKBgoSDhYWGi5ORj4+Pi4iFhYODhIGBgYGBgoODg4KCgoKCgoKCgoGBgYCBgYCBgH9/gIGBgICAgH+AgIKCg4OChIOEhYWGhn+BfoCBgICAgIGDgn9+fn5+fYCCg4OCg4KDgn19fn+AgIGAfn19fX1+fXx6enqAgoKBf39/f35/f4B+fYB/foCAgX+AgIF/f3+AgX59fX+AgX9/foCAgH+AgICAf4CCgICCgYGCgYGAgYGBgYKEg4aPkpCOj42Kh4eGg4ODgYGBgYGCg4ODgoKCgoKCgoOCgYGCgYGBgICAgH+AgICAgICAf39/gYKDhIGCgoOCg4SFgIB/fH19fn19foCAf31/fn1+gYODg4KCgYF/fX1+f4CAgH9+fX19fHt7e3p6enqAgIB+f35+fn1+f35/gH9+f3+Af4GAf359fn9/fn18fn+Af35+f3+Af39/f4B/f4B+f4CBf4B+f39/gH9+f4B/hZKSj46Pi4uHiYWEhIKCgYGBgYKDg4ODg4OCgoKDg4KAgYKBgYGAgICAf3+AgIB/gIF/f36BgYSEgYKBg4OCg4OBgH98fn9/fX6Af4B/foF/f4CBhIOCgYB/f359fn5/gICAfn19fX17e3x6enl5eXuAgH9/f39/fn5/foCAf35/f4CAgoB/fH5+f35+fXx/f4B/fn9/f4B/f35/foCAf36Af39+fn5/f35+fn18fH2Fk5KOjIuKiImIhISEgoKCgYGBgoOCgoOCgoODg4ODgYCBgYGBgYCAf39/f4CAgICAgIB/foCBhIOCgYGDhISDhICBgICBgIGAgYKCgoGBgoCBg4ODgYGBgYCAfX19fn5+f359fX19fXx8fHt6eXl5eX2BgICBgYF/f4B/f4F/gICAgYGCgoB+gH5/fn5+foGAgYF/f39/gIB/f39/gYB+f3+Afn9/fn+Af31+fn17fIaTkYyLioeHioiGhoSDgoGBgYGCg4ODg4OCg4OCgoKBgICBgYGAgH9/f39/gICAgICAgH9+fn+BgYGAgISGh4aHgoODhYOBg4ODhYSEhISEg4ODhIKCgoKCgX5+fX19fn6AfX19fX19fX19e3p5eXl5eYCCgoKEg4GCg4F/gYCBgYGDgoODgYGCgIGAf4CBg4GDgoCAgYCBgYCAgYCCgn+BgIF/gIB/gICAfn9/fnx8iZOQiomIiIiJiIaGhoSCgoGBgoKDg4ODg4KDg4KCgYCAgICBgYGAf39/f4CAgICAgIGBf359fn5/f39+g4aHh4iChYSFg4SFhIWGhYaGhoWGhYGBg4ODgoKAfX19fX19fn59fX19fX19fX18e3l5eXl4fIKDhIWCgYSDgoKDhYaCg4SDgYKCg4OCgoKCgYKFgoiFgoGBgYKDgYGBgYSDgoOCgoKCgYGBgIF/gIGAf36Ok4yHiIaIh4aGhYaGhIKDgoGCgoODg4ODg4OCgYGBgH+AgYCBgYB/gH9/gICAgH+AgYB/fn19fX5+f36Ag4SHiISGhoaFhoaHh4aHh4iHh4eGf32BgIGCgX59fX19fX19fX19fX18fH5+fnx7eXh3eHl5gIODf4OMhIOEhISXl4ODhIF9foGCgoGCgYKBg4aIjIWDgoKBhIKEg4KDhYSEhYOCg4OCg4OCgoKCg4KCgpKQi4iJh4mHhoaEhoWFhISCgYKCg4ODg4ODgoGBgYCAgICBgIGBgH9/fn+AgYCAf4CAgH9/fn1+fn+Bf4CCgYWFhYeGh4eGh4eIhoaHh4eGh4V+fX18fX9+fX19fX19fX19fX19fXx7iJKCe3x6fIZ5eHl8gYF+iZaEg4OEhJSTgIGBf39/fn6Fi4B/gICEhpCJhYSCgoGFhYuDgYKFhYaGhIOFhYOEhIODhIOFhISIko+MiYiIiYeHh4WGhYSFhIKBgoKDg4ODg4OCgYGBgYB/gIGAgICAf39/f4CAgICAgYGBf39/f4CAgIGBgYGBg4OGh4aGh4aGiIeGhoaFhIOFhH59fHx8fX18fH19fX19fX19fX18fH+RlZaDe3qElHx4eXp7fICCg4GCgYOCgH58fn57iJF8fI6Wf31/f4KGioWDg4SDgYONiX9+f4OEhYWDhYaFhIWFg4SFhYaEhI6Rj4yKioyJiImHhYWFg4ODgYGCgoKDhIODgoGBgICBgICAgYGAgIB/f3+AgIB/gICAgX5+f4GBgoKCgoODgoOCgoWGhISFhYSGhIOEg4KBgIKAfn19fHx9fXx8fH18fH18fX19fHx8e4uRl4x6e3yBenp6e3x5eX19foB/gH98e3t+fn2ClZF/hIh+fH5/goR8fIGChIKAf4eDfYKBf4KCgIODhISEhISChIOEhYGEkZKOi4yMjoqJiYWFhYODgoKBgoODgoKDg4KCgYGAgIGAgICAgICAgH+Af3+Af357gICBenyAgYKDhYODhYWFhYODg4SCgYKDgoOCgoGBgIB/gX5+fX59fHx8fHx8fHx8fHx8fHx9fHx8fn6Kgnt6e3p4ent7fH17fn1+f319fX18fH+BgH2Gj4F+fYJ+fn6Agnx8f3+CgIKAfnx7ioJ9gH9+gYCAgIKBgoCAgYGAf4uUj4yLjo6MiIeHhYWEhIOCgoKCg4OCgoODgYGBgICAgICAgH9+fXx7fHx9f3+AgHx6gYF4e4CCgYOFhIOFhIaHhISAhpSIgIKBgYGBgH9/f39/fn5+gHx8fHx8fHx8fHx8fHx9fHx8fHx8fHl7e3t4eHl7enp8goCBfn+BfH5+f399gIKBgICAgX+CkYF/f4CAfoB+fn9+gIGBfX19e319fXx9fHx9gH+AgH6Afn6ClJKMjI2Oj4qFhoaFhISFg4KDgoODg4OCgoGBgYGAgICBgICAf4CAf39/fXt6fICAgHh+gXd7gIF/gYKCgoKEhoeGhn6IlYp+gYGAf4B/foB+f39/fn+Bfnx7e3x8fHx8fHx8fH59fHt9fHx8e3x8fHp6eXt8en2Fg4N/gYF+f35/gH6FgoF+gH9+foCFhoKAfn6Dhn9+fH6AgIGAf39+fX19fX57fH1/f3+AfX9+f4yRjoyNjo2Nh4SGhoWEhISDgoOCg4ODg4KBgYGBgYCAgYGAgYGBgYGAgH9/f397en9/e3mAd3p/f31/f3+Af4KDhoaFf3+FgX5/gIB/gH5+f31/gIB/f4B/f319fHx9fn18fH19fX19fH58fXx7fXx8ent6fH19f4aEg4CAgX1+fX5/fouEgYZ+fXx8f36CgX99fX19gHx7fXx+gYSDgYB+fn5+fX1+f399foB+f36Eko2MjI+Ni4qGhIaEhIODg4OCg4KDgoOCgYGBgYGAgYGBgYB/fXx8fH1+f39/f397e399d352eH59fH18fX5+gYGCg4B6fX18fn+Af35/f35/fn+AgH+AgH9/fn9+fn5+fn1+fn99fH59fn1+fHt8fHx7e3p9foCAg4OCf35/fH18fXx8gYN+jH58e3t9fn1+fn17e3t9fHp7e3uAhoSChIOBf4B+f4KCgn9/goJ/gIuQjYyLjYuJh4SEhIODg4ODgoKCgoKCgoKBgYGAgoGBgYKCf3+AgIB/fn18fH5/fn55fX52e3Z4fXx8fHt9fX6BgICAf31/f31+f39/foB/f39+f3+Af4GBgH99gH9/fn9+fn5/f3yCfn59fX17e319fHp8fH6AgoF/gIB8fH17fHx8fH18fnt/fnt7e3x8fH18e3t7e3x8enp9en6CfoKEhIKBgoGFhoWFhoaHhYGEkY+NiomLh4eFgoOEhISEg4KCgYGCgoKBgoGBgYGBgoGBgoKAgYKBgYCAgH9+e3x+fnx6fnh5dnd8fHx7e318f4GAf35/foB/f35/f35/gH9/f3+Af39/gYKAfn6BgIB/f39/f39+fYN8fH19fH99fX19e3x+fn9/fn1/fnx8fHx8fXx+fnt8e3x8fHx9fH18fnx9fHt7e3x5e3x7e316fX5+f4CAg4eJiYmKiYqJhYiSjoyIiYeFhYOCgoOEhIOCgoKBgYKBgYKBgYGBgYKCgoGCgoCAgX98e3p6eXt9enx+fnl8eXh4dHx8fHt8fHx+gH9/f39/gIB/fn5+fX+AgH9/f3+Af4CDgoB/gIGAgIB/f4CAgH58enx9fX59fX5+jIZ9fX57e4ODfX19fX18fX19fH1+fH18fXx9fX58fn19fX18e3t6fHt8fHt6e3t6enp7fn6DhYiHiIqLi4qJjJGPjYqIhoWEgoKCgoODg4OBgYGBgYGBgYGBgYGCgoOCgYKBgIGBf3+Af356eHl5en5+e3l6eH5zfHx8e3x8fH5+fn5/gH+AgIB/fn9+gIF/f4B/gIGAgoSDgYCAgYGAgX+AgYKBf39+f31+gH57foGSjHx9f4qAjYx+fn19fX59fX59fHx8fX18fXx9fX1+fX1+fnx7e3t8fH18e3p7e3l6eXl5e35/hIOEh4mKh4mOj42LiYmFhISCgYKCgoKCgoGCgoKBgYGCgYKCgoGCgoKBgoKAgYGAfoCAf39+e3p5e319eHx6f3KBfXt7fXx8fn59fYGCf4GBgX9/gH+AgX9/gIGCgYGFg4SCgYGCgYKCgICBg4KAf4F/fX6Afnx/f4mCf36DkISEg4F/fn18jYd9fX59fHx/fnx9fXx9fX5+fX5/fX19e3x9fnx8e3x9enp5eXl5e3t+foCBg4eEiI6NioqGhYSEg4KBgoKCgoGBgYGCgoKBgoKCgoKCgoKCgoGCgn+AgIB+f39/fn5/ent5fX16enp9cX6Cent9fX19fXp4f4KAgYKCgICBgIGBgICBgoKCgoaFhIKBgYGBg4F/gIKEgX9+gYB9foF+fX5/gIB9fn+EgH5+f31+fX2KhX1+f31+foB/fX19fH5+fn99f4B9fX18fX9/fHx7fH17e3t6enp7e3x9fn2Ag4CJjYqLh4WFhYSDg4KCgoKCgYGBgoKBgoKCgoKCgoGBgoKBgYKCf4CAgH9/f39+fn59eXp6fXx5d3t0e4d8dHd9fn17e3Z2fYCBg4KBgYKCgoKBgYGDg4OChYaEg4GAgICDgX+AgYSBfn6Af35+gH59fn6AgH+Bfn+Af39/gH99f39/f3+Afn9/gH58fX18fn5+foF/gH2CgHx9gIB9e319fXx8fHx8e3t7fHt8fHx9fIqKiIiFhYWFhISDgYKBg4KAgIGCg4KCgoOCgoKCgoGCgoGBg4J/gIGAf39/fn5+fn57enp8fHt2e3R3f352cnt+fnt4dnd8gIGCgoKBgoODg4OCgoSDhIOFhoOCgX9/gIKAgICAg4F+foB/fX+AfX1+foCAf4J/gYGAgICBgH1/f3+AgIGAgIB/fnx9fX19fn59g32AfoKAfX6AgX98fn59fX17fH58fXx8fHp8e3x9iYeHhYWHhYWFhIKCgoGDgYCAgoKDgoKCg4ODg4KBgYGBgYGCgH6AgYB/fn5+fn5+fn56e3p9goN9dXF6fHpxen59eXh0dICAgoKCg4KDhYOEg4KDhISEhIWEgYGAgH6AgoB+f36Bf35/f4B9foB9fX1+gH9/gYCCgYCAgIKBfn6Af4GAf4CAgH9+fX19fnx+fn19gYR/gH9+f4GBf31/f319fn1+fn1+fHt8enx7eoCHg4SEhYSEg4SDgYKBgYKBgICCgoOCgoOEg4SDg4KBgYKBgYOAfoCBf35+fn5+fX5+fnt7en6Jh354cnl9f3F6eHt4eXV1fYKDgoODg4OFhIWDg4OEhIODhIKBgH+Af4CBfn19foB+fn5+gH19f3x9fX6Af4CAgIKAgIGAgoGAf4B+gIF+gIGAgH9+fn5+fX1/fn6FhYGBgH+Ag4F/foGAf35/f4B/fn17ent6fHt6goWAg4KCgoOCg4GBgYCAgoGAgIKCg4KBg4SDhIKEgoGBgoGCgn9+gIF/fn1+fn5+fX59fXp7fIWEe3tzeXp8cHd1dnd5dXR6hISBhISDhIWFhoSDg4WEgoODgoCBf39/f4B9fX1+gH1+f39/fn1+fH19foF/gIB/gIB/gIGDgoGAf36AgH+AgYCBgH9/f39/f4CAgIGCgoKBf4CDgn9/g4J/f4B/gX+Af3x7e3p8e3yCgH+Cf3+BgIKCgYF/f3+BgH6BgoKDgYGDg4KEgoSCgYGBf4GCgH6AgH9/fX5+fX19fn19e3t6gH94fHZ5eXtxdHh3dnh1cnmFhYKEhIKEhYWGhISChIOBg4GAgIF+f4B/gHx9fX6AfX5/f39+fX98fn5+gX+Bf39+f4B/gIODg4B/f4GBgIKBgYGAgICAgICAgIGAgYKDgYF/gISAfYGDhICAgX+BgYKBfXp7e3x8fH9+f4B8f399fYGAgH59fX9/foKBgYKBgIKCgoKBg4KCgYB/gYKAfn9/fn99fX1+fX19fX19ent7fHZ9eXh5enJ1eXl2d3dzdYaFg4WFgYSEhYSEhIGDgoGDgX+AgX5/gH6AfX19fn9+f4B+fn99f3x/f3+BgIF/f3x+gH6AgYKDgYCAgYOEgoGAgYB/goCAgYGAgYGCg4KBgX+Ag4B+goKEgICCgYKChIJ+e3t8fHx8fX1+fXp+fX14fn9/fHx8fn5+gYCBgYCAgoGBgYGDgoGBf4CAgoB9fn19f319fX59fH19fX16e3p8dnx6d3t4cnZ5e3Z2dnN0hoSEhYSChISFg4ODgYOBgYOBgIGBfX+BfoF9fX1/f39/gH5+f359fYB/gIGBgX5+fH5/fn5/gYJ/gYGCg4eFgX9/fn6Af4CBgICAgIGCgYCAfoCCf36BgoKBgYOCg4OFgn99fX18e3x8eXp7en55e3l4f357e3t+fX1/f4F/gH6BgICAgoOCgYF/gIGBf31+fH1+fX19fX18fn58fXx5e3x4enx3endzeHd6c3Z2c3SGhISGg4KDhISDgoKCg4GCgoGAgYF9gIB+gH1+fX5/gICAf35/f3x/f3+BgIGAf359f39+fn+BgH2AgIGDg4N/f359fn5+f4CAgIB/gYKBgH9+f4F+f4CCgoCBg4KEhIaEgH59fHx8fHp5dnl5enl2eXZ+fHt7e359e399gH99fX9/f3+BgoGBgX5/gYF+fX18fX19fX19fXx+jYF8fXl7e3p5fHd4eHR1dXhyd3d0doaEhIWEg4ODg4OCgYKDgoGDgn+Bf35/fn+AfX19fX+AgIB/f39/fIB/f4GAgYCAf3yAf35+fn9/fX5+gYGCgn5/fn1+fn5+f3+Af32AgIB+fn5/gX5+gIKBf4KDgoOEh4SAgH58fXx8e3x1eXl4eHh5d3t8e3t7foV9fn1/ent+fn59foGAgIGAfX6BgH59fXx9fX19fX18e32Dgnx8ent7e3p7d3Z4dXJzdnB4eXJ4hYWFhYOEhIOChIKBgYKBgIKBgIF/fn5+foB+fX58foCAgH+AgIB7gH6AgH+BgYB/fYB+fn5/f319fX6AgYKBfn9+fn59fX5/fn9+fH+Af35+fn+Cfn6AgIF/gYODg4OGhICBfnx9fHx7fHh3e3h1eXd3eXx6e3t9kod9fH13en1+fn19f35+gH98foB/fn19fH19fX19fHt8ent9enp4e3x6ent4dHh1cXJ0cHh4cXmEhYWFg4SDgoODgoGBgoKAgYGAgIB9fn5/gH18fn1/gIGAf4CAgHyAf4B+f4GAf39+gX9+f39+fX18gICAgIB+f35+fn18fn9/f358fYB/fn1+gIJ/foCAf36ChIKCg4WFgoJ+fXx7e3x8eXd8eXd4d3d4e3t7e3yFin17end6fH19fHx9fX1/fnx9fn59fXx8fX5+fX18fHt6enx7e3p5enp7enhzd3VxcXNveHdxe4WGhIWDhYKBg4OBgYGBgoCBgICBgH5/fn9/fXx+fYCAgoGAgIGBfX6Af35/gX+Af3+BgH9/f31+fH1/gICAgH9/f35/fXx+f39/f319f39+fn6CgYF/gIB/foGDgoKEg4SCgn5+fHx6fHt7eXt6d3N2d3h5e3p7eXp/fnt7d3p8fXx8fH59fH19fH19fXx8fX19fX99fXx9e3l7fHx7enp6enp6eHN2dXBwcm93dnJ7hYaEhYOEgoGDgoKCgYGCgYKBgYGAf4B/f399fX9+f4CBgYJ/goF9foF+fn+Bf4B/gIJ/gIB+fH58f3+BgICAf4B/f4B+fX5+f4B/f39/gH9/f4J/gICAgIB/gYGAgISBgoKAf39+f3x9fn56fYV+dHx9enp6enx5eXp6hoV3eXx8fHx8fXt8fHx8fX19fHx9fX19fn19fX16eX18fH16enp6enp5c3V1b29xb3d0c3yFhoOEgoOCgYKBgoKCgYKBgoGBgYCAgICAgH59gH+Af4GCgn+CgX+AgX5/gYB/f4CAgn+Bf319f35/f4KAgICAgIB/gIB+fn1/gH9/gIB/f39/gH+AgICAgH+AgYCBgYGCgYCAf39/fn1/fnuBk416fH18e315e3p6eHmBgXh5e3x8fXx8e3x8fHx9fX18fH18fn1+fn59fHp8fHt8fXt5enp6eXl0dXVvb3Fwd3N0fYWGg4OCg4KAgYCCg4KAgYGCgYKBgYCAgIGAfn6Af4GAgYKCgIKCgICCfoCBgX9/gX+BgIF/fH6Af3+AgoCAgICAf3+AgH9+fX6Afn2AgIB/f3+AgICAgYCAf4CAgYCBgYKCgICAf39/fX5+fIGGiXx8fnt7fnl6e3p7jn53d3l7fHt9fHx8fHt9fH19fX18fXx+fn5/f358enx9e3x9e3l6e3p5eXN0dW5zcXB4cnV6hYaDg4KDgoCAgIKCgX+CgYKBgoGBgYKAgYF/fn9/gYGCgYKBg4OAgYJ/gYGBf4CAgIB/gX99f4F/gICBgICAf4B+gICAf359foB+fn+Af39/gH9/gICBf4CBgH+BgIGCgoKAgICAgIB9foB9gIOCe35+e3x9e3p8fHyHeXh4eXx8fH17fHx9fX18fH19fn19fX5+f3+Af317fH18fHx7enl7e3l5c3J1bnZycHhxdXaFhYOEg4KCgICBgoF/gIKCgoKDgYGDgoCCgYB/gICCgoKBg4KEhICBgX6BgoF/gICAgH+Cf36AgYCCgICAgIB/gH+AgIB/fn2Af39/f4CAgH+AgH+AgYF/gICAgIGBgYGBgYGAgYCAgH9/gH5/fX59fn57fXx9e3x8d3h1eHh5e3x8fXx8fHx8fX5/f39/fn19fn9/gIGAf3x9fHx9e3p7eXp8eHpzcnVud3FxenF2d4WFg4ODg4KBgYKDgH+CgYSDg4SBgYOBgoOBgYCAgIKDgoCCgoSDf4GAfoKDgICBgICAf4CAf4GBgIKAf4CCgH9/gICAgICAf4CAgH+AgICAgIB/f4CBgYCAgICAgYKAgoOCgoCCgYGCgYB/f4B/gId+fnx6fXx7fX94d3Z5eXp8fXx8fXt8fH19fn5/gIGAfn1+gICAgoGAfH59fX58d3t6ent5eXNxdW53cHV6cXZ5hYWCg4KDg4KDhISAgIOBhoOEg4GChICEg4KCgICCgoSBgYKChIJ/gIB/gYOCgYCBgYCAf4GBgYGAg4F+gIOCf35/goGAgIB+gYCBf4CAgYGBgYCAgIKBgYKBgYCBgYGBgoOCgoOBg4OCgYCBgH+AhH19fXx/fXp9f3t5dnp4eXt7fH19e3x9fX19fn+AgYGAgH+AgICDg4B9f35+fn15eXt6enp5c3J1b3dxd3lzd3uFgoKDgoOEgoOEg4CAgoOGg4ODgoKEgYSDgYKAgIKBhIGCgoGCgX6BgICCgYKBgYKCgIGAgICBgoGEgH6Bg4F/f4CDgoCBfoCCg4KAgYGBg4KDgoGBg4KChIGAgYOBgYKEg4KEhIODhIODgYGBgYCCf4B/fYB8enx/e3t3fHl5eXt6fX59fHx8fH1+foCBgYCAgIGBgYSEgH2Af39/f357e3t6e3p0cHhyeXR2eHR3e4SCg4KDg4SChIODgYKDhIaEgoODg4SChIOBg4CBg4KCgoKCgIKAf4GAgIKBgoGCgoKBgIGBgYOCgoOAfoGDgX9/gYSEgYN/goKBg4KCgoGEg4OEgYKEgoOCgoGCgoOBg4SDhISEhISFg4SCgYOCgoOBgYGAgH58fIB9fHh8eXp5enx9f3x7fHx9fX18fICAgICAgYGBgYKBfoGAgICAf3t7e3p6enVweHd5dnV8dXZ8gICDgoODg4OEhISAgoOGhYWDg4KDhIKEhYKCgYKDg4GCgoKAgYB+gYCBgYKDgoKCgoGAgYKCg4KCg4B/gYOBgICChIODgoGCgoGDgoKDg4ODg4SAgoSDg4OBgX+Bg4KDhYKEhISEhISDhISChIOEhIKBgoGBgHt+gX59eXx6enp9fHyBfXp8fH19fHp7fn5+gIB/gYGAgICAgIGBgIB/fX18fX18dnJ2eHh2dH92dX2Hh4OChIWDg4SFhICChYWEhIOCg4SEgYSFg4KCgoODgYOCgoCCgH2AgIGCg4KCgoKEgoGCgoOEgoKBgICBgoGAgYOFhIOCg4CCgoOCg4ODg4OEg4CCg4KEg4KCfoOBgoSEgoODhISEhIOEhIOEg4WEg4ODgoKAe4CBf3x8fXp6e32AfX9/fHx6fH59fH19fn5/f39/gICAgH9+foCBgICAfnx9fX5/fn18e3h2f3Z3f4SHg4KDhYODhIaEgYKFhoWEhIODhISChIWFgoKDg4SCg4KDgoKBfoCAgoKDgoODg4SDgYKCg4OCg4GBgYGDgn+ChISDg4KEf4KEg4ODgoSDg4SCgIOEg4SDg4KCg4KChIOCg4OEhISEhIWEg4OEhYSFhIOBgoB9gYKAfXx8e3x8gH19foB+fn1/fnx8fH19fn5/fn+BgYGBgH99fX6BgYB+fn19fX59fX5+f3+AfH2AgYKCg4OGg4SDhoSBgoiHhYSDg4SEhYGEhYWDg4SDhIODgoOCg4F+gYGDg4SCg4OEhIOCg4KEg4ODgoKDgYOCf4KDg4ODgoOAgoWDg4ODhIODhIOBgoSEhYOCgoODg4GEg4GDg4SDg4SEhYSEhIWFhYWEg4ODf32BhIB9fXx8fHx/gX5/f39/fX99e3x9fX19fX5+f4CBgIGBgH59fH6Cf39+fn5+fX1/f39/gICAf4CEhIODhIWDhIOFf36CiouFhISDgoOFgYaGhoOEhISEhIODg4OEgn+BgYODhYSFhIWEg4KEhISFhIODgoSDhYKBhISFhYaEgoCDh4SDg4OFhIWFhIGEg4OHgoOCg4GCgYSDgoODhYODhIWEhYWHh4aHhYSEhYSBf4GDf35+fH5+fX+BgH9+fHx/f358enx9fX19fX5+fn9/gIGBf319fIB/gH5+fn5+f3+AgYGBgYKAgYWFhIOEhIKEg4aAgoWFiomEhISEhYWCh4aGhISEhIWEhISEg4SDgYKDg4OEhIaEhYSDg4SEg3yDhHuBhHd5g4F9hH5+cnWDgoF2foOEgH2BdYF5g39/f36EhIKDg4KBg4SDg4SFg4SFhoSFhn2EeXx+f4N7hYOBhIOAf31+f31+gYOBfXt/fX6Afn18fHx9fX19fH19f4B/gYJ/fX18f4GBgICAgH+BgYGCgYKDg4KChoSEhIWEgYOEhYOEhYOKiIWFhYOFhYSGhoaDhISFhYWEhYWEhIWCgoOEhYWFhoSFhIOEhYWCaICFanx7cXF8gXOGc3R0fYKDdXNxg4ZzcHVyc3SDdnt9dYF/goOBgnZ5hYCDgIR/hYSChYWCaHpyc3N8gHKBg3+Dg32BfX5+fX6Cg4J8f4F9f4B9fXx8fHx9fHx8fn1+gH+BgX99fX2AgYKBgYGBgIGBgYKCgoKCgoSHhIWEhYSBgoSGhoOFg4aIhoaFg4aGhoeGh4OFhYaFg4KFhoSFhYODg4SEhoaGhIaEg4SFhn1xe4FweXZ+g3+CbnlwdXN8dnl5hnKEg3B2eHF2dHR1cnN0dml/gG5yb3R2bnVsd217c26Ah3ltfXJzdnN2bW53bHB5bHV9f398foGAgX2Af32Af4B/fX18fHx9fH1+f32Af4CAfnx/foCBgoCBgICAgYCAgIKDgoKEhYeGhoCChYODhYeGg4WFhYaHh4SDhoaIiYaHhIWGiIeEg4WGhYWEhIOFhIKFhoaFhoWEhoWHdnB0e3BydX+HhYNtdW92b3x1coR5eYd4cXR3bndod3pucHaCcoN+b3p5eW1vbnpvb213fXiGcHF6cHJ0ZoF1fm57eXNveX+Af31+gYB/e39+fIB+gIB+foCAgYB+fn9/foF/gH9+fYB9f4CBgIB+fn+BgH9+goOCgoSFh4eEfoeEg4OFh4aEhoWFhoaIhISGh4iIhoeEhoaLioWEhoeHhYOFhYWEgoWFhYWGhYWGhYZxdXByc29zenl+hHSIdHV+iHZugnKEhnluanJ/cW1zd3x/dXR8hH54cXV3bnl1enF2eHV6eYRyaW95eHBreXN6b3p3dnZwgYB/fn5/f356fn18f31/f359gIGDg4CCg4GBhIKBf4GBgH1/f4F+f35+f4GAfn6BgoCAgYSHhoODhoSEhIaHhoWFhYWGhoiFhYaFh4eFhoSGhomIhYSJi4iGhIaFhYWDhYWEhoaGhoaFg3iLeXKIentwcIWEeIV4eWtzfnl7a3KDh4N6fG16eXl0fYB2bm+AgG90fHV3cXl9fW1+dW+DhYZ6gHJye3x1cG96bHN8bnaCgYF+fn99fXp9e3x9fX9/fn1/f4KCf4GDgYGDgYB/gICAfn9+f31/fn1/gH58fYGAfn6Ag4iFhoOFhYWFhoeFhYWFhYeHiIaEhoWHhoaFhIWFhIWFhomKh4WEhoWGhoWGhoSGhoaGhoWGh4eHhoaEhoWGh4iHhYeGhoOHhoWFg4SFhoWGhIaEg4SEhoSEgYODhISFhIWEhYSGg4aHhYWEhIWHhoSEhYaFhX13hYOEhIKBgX1/fnt8e357fHx9f359fH5+gYB9f4F/f4GAfn5+gH5+f35+fX99fX5/fHt8f358fH+BiYaFhIaGhoWGhoWFhYWGhoeIhoSGhYaGhYWDhIWGhYSGhoaGhYSGhIWGhoaGhIeGh4eGhYeIiIiIhoSHhYaGiIaFiIeIhYeGhoiFhYaHhYaGhYOChYWGhYWDhYSEhIWEhoWEhYWDhoaFhoWEhoeGhISFhoOFhIKEg4OFg4OCfYB/e3t8fnt8fH1/fnx8fn2Af31/gH5+gH99fXyAfX5+fn5+f3x8fX57fHx/fHt7fn+Ih4SEiIaGhoeGhYWEhoaGhoiHhIWGh4aFhIODhIaFhIeFhoaFhYaEhYaGh4eFh4aJiIaGiIeIiYiFhYiFhoeGh4aHhoiFh4eGh4WFhoeFh4aFgoOFhoaEhIOEhIOEhoSGhYWFhYOGhoWGhYWGhoWEhIWFg4SHhYOCgoWDhIF+gIB8e31+e3x7fn59fHx+fX5+fX9+fX1+fnx9fH98fn58fYGAfHx8fXx8fH56e3t8foiHgoWIh4eGhoaGhISGhoeGiIaEhYSGhoSFh4OEhYSFh4SFhoaFhoSGhoeHhoaHh4mIhoaIh4iKiIWHiIWHh4WHhoeGh4WIiIeHhYaGh4WGhoSBhISFhoWFhISEg4SFhIaGhoWGhIaFhoaFhYaGhYSDhISDg4eDhIGChISDgoCAgHt7fn18fHx+fXx8fH19fH18fn18fX18fHx8fXx+fXt8gX99fH18fnx8fHp6fHx9iIeChoiHhoeGhoaDhYaFhoaGhYOFhIaFhIiJg4GEg4SGhIaGhoaGhIeHiIiHh4eIioiGh4iHiImIhYiHhYaGhoeHh4WHhoiIh4eFh4eHhYaHhIKEg4SGhYeFhISEhISFhoaGhoWFh4WFh4WGhYaFhIOEg4OEh4GDgIKDg4KCgn+Ae31+fXx8fH59fH19fH57fHx7fHx9fXt7e318e359e3x/fX18fX1+fXx6ent7fHyIh4KGhoaGh4aGhYOFhoWFhYWEg4WChoSDiId/enqChYaEhoaFh4aEh4eIiIiHhoiKh4aHh4eIiYeFiIeFh4eGhoeHhYeGiIiHhoWHhoiGhoeDg4SEg4aGh4WFhISEhYaGhoaGhYaHhoaIhoaEhoWDg4ODgoOGgYN+goKDgIOCf398f35+fHx9f318fX18fXt7e3p7fHx8e3t7fnt7fXt6e358fHx8fX5/fXt6fHp8fImHg4aFhoWGhoWEhIWFhYWFhIOBhIGGhIKEhHyAhn+ChYWGhYWGhYSHh4iIiIaFiYqHhYeGh4eIh4WIhYaHiIaGh4eGh4aIiIeFhoeGh4WFiIOEhoWEhoaHhoWEg4WFhoaGhoaFhoaHhoeHhYOFhYOBg4KAg4WCg36BgYF/g4F/fn5/fX98fH1/fXt9fXx+enl6eXt8fXt7e3t+fHx8fHp7fXx8fHx+fYF8e3t7e3x7iYeEhoSGhIaGhYSFhoWEhIOEgoCDgYaDgYJ/eoSMe4CEhYeGhoaFhIeIh4aHhYWHiYeEh4WGhoiGhYeEhoeIhoaIh4eHhoeIhoSGhoaHhYWHg4SFhIaGhoeFhISDhYWGhoeGhoWGhoaFhoaEg4SFgoGCgYCDg4OCfYGBgH6DgX5/f4B8f3x9fX59e359fH15eXp5e319enp7e318fXx8ent9fHx9fH5+gHt7e3x+fXyIh4WGhYeEhoSFhYWFhYODgYOBgIKBhYJ/gH9/fXx7gYSFhoaEhYSDh4eGhoaFhIaJhoKGhIaGhoWFh4WHiImGhYiHiYeGhoeFhIaFhYeFhIeDhIWEiIaGh4WFhIKFhYaFhoaHhIaGhoaFhoODg4WAgIGAgIOBg4B8gYB+foKAfYB/gXx/fH1+fX57fn18fHl6enl6fX15enp7fHt8e3t6e319fH18f35+fHt7fX59fIiGhYaGhoSFhYSFhYSDgoKAgoGAgICDgX5+foB5en2Ag4OFh4WEg4OHhoOEhYSChYiFgoSDg4WFhYWHh4aIiIaFiIeJh4aFhYWDhoSFh4OEhoSEhYSHhoWGhYaEgoWFhoaGhoaEhYaGhYWFgoKDhH9+gICAgYCDgHuBf31+gn5+gH6Afn99fX59f3t/fXt6eXp6eXp8fXl6ent7enx6e3t7fH19fXyAfn18fH1/fnx7h4WFhoaGhoSFhIWDhYKBgICAgYB+f4KCfX1/f3t/f4KDg4WGhYSDg4aDgYOEgoCFh4WCg4GBg4SEhIaGh4iHhYWIhomHhYSEhIKFg4SGgoOFhISGhIeGhYWFhoOEhYSFhoWGhIOEhYWDhYSAgIODf35/gH9/gIN/fIB9fX+CfYCBfn6Bfn5+fX1/e398e3p5enp5ent8eXp6e3t7fHp7e3t8fX19fYB9fXx8fYB/fXyGg4aGhoaFg4SDhoKFgYGAf3+AgH5/gYJ8fn9/foCAgoKChIWDgoGChIGAg4KBgISFhYKBf4CCg4OEhYWHhoaEhYeFh4WGgoOCgoOCgoWBg4WEhYaEhoaHhoaFgoSEg4SFhYWDhIODhIKEhIB/goJ/fX5/fn5/hH57f3x8gIF9gYB9foN9fn59fX57fnt7enl7enl6ent5enp6e3t8ent8fHx+fn1/gXx9fHx9f4B+gIaEhYWEh4SEg4KGgoOAgYB+fn+AfX9/gnx9f39+fn+BgYKEg4KBgYKCf4CBgoCAgoWEgoB/gIGCgYOFhYeFhISGhoOFg4WBgoGBgoGCg4GChISEhYWGh4eGhYSDg4ODhIWFhIGDgoOChIODgH+AgX59fX5+fH6Dfnx+fHyBgH6Cf35/gnx/fn19fHx8e3t6enp6eXt6enp5enp6e3x5e317e35/f4GAfX59fX1/gICAhoSEhYSFgoSCgoSCgoCBgH59fn9+fn6AfX2Af35+foGBgoODgoSHgYF+gICBf3+ChIOBf35/gIJ/goWEhYOCg4WFgoSBg4CBgIGBgYKBgIGEg4OGhYWHh4WEhIWCgoKDhYSCgYGBgYCFg4F/foB/fnx9fn18foN9e358fYF/gIN9fYCBf35/fXx8fH17e3p5enl5e3l6enl6ent7e3p7fXx8f3+BgoB+gH+AgH+AgIDKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzNzc3Nzc3Nzc3NzczMzMvLy8vLy8vLy8vLy8vLzMvLy8vLy8vLy8vLy8vMzMzMzM3Nzc7Oz8/Pz9DQ0NHR0dLS0tLS0tLT09PT0tLS0tLS0tPT09TU1NTU09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tLS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1dXV1NTU1NTT09PT09PT09PT09TU09PU1NTU1NTU1NTU09PT09PS0tLS0tPT09TU1NTU1NPT09LS0tLS0tLR0dHR0dPHhnNlYFtLWWdVTUZIQD03Nzg5Nzw8PDo8Oz42Oj04PDs6OTg3ODs7Oj87PTs8PD47P0E/QkJBQ0RFREE+PTw7QENDQUBDQ0FBR0hHSUtSwtXS09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXVysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMy8vLy8vLy8vLy8vLzMzMy8vLy8vLy8vLy8vLzMzMzc3Nzc3Oz8/P0NDQ0NHR0tLS0tLS09PT09PT09PT09PS09PT09TU1NTU1NTU09PT09PT09PT09PT09PT1NTU1NTU1NTT09PT09LS0tLS0tLT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1NTU1NPT09PT09PT09PU1NPT09TU1NTU1NTU1NPT09PS0tLS0tPT09PU1NTU1NTU09PT09PS0tLS0tLR0dHSzIxyZ2BcTVllUktHSz87Mzc4Ozg5Pj05PDpBOjs9Nzs8PDo6Nzg6Oz0/Oz88PTw/Pj9BPUFBPkNDREJAQT46Oz9DREFDRERCQklHSEhJTr7V0tPT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1crKy8vKysrKysrKy8vLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzMzMzMzMy8vLy8vMzMzMzMzMzMzLy8zMzMzLy8vLzMzMzc3Nzc3Ozs/P0NDQ0NDR0dLS0tLS09PT09PT09PU09PT09PT09TU1NXV1dTU1NTT09PU1NPT09PT09PT1NTU1NTU1NTU1NPT09PS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1tbV1dXV1dTU1NTT09PT09PT09PU1NTU09TU1NTU1NTU1NTT09PT0tLS0tLT09PU1NTU1NTU1NTU09PT09PT0tLS0tHR0s+Sd2hfXk9XZ01LRks9ODc2NTk5OTw+OT88RDo7PDc5PD07OTc5Ojw9QDs+PT47PD48PT5BQD5EQ0NDP0E9Ojs9QkNFQ0NEQT9FSEpJSky61dPT09TU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8rKysvLy8vLy8vLy8zLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMzMzMzMzMzMzMzMzMzczMzMzMzMzMzMzMzMzMzc3Nzc3Ozs/Pz9DQ0NDQ0dHS0tPT09PT09PT09TU1NTT1NTU1NTU1NTV1dXU1NTU1NPU1NTU09PT09TU1NTU1dTU1NTV1dTU09PT09LS0tLS0tLS09PT09TU1dXV1dbW1dXV1dXV1tbW1tXV1dXV1NTU1NTT09PT09PT1NTU1NTU1NTU1NTU1NTU09PT09LS0tLT09PU1NTU1dXV1dTU1NTT09PT09PT0tLS0dHRmn5nYWJOVWpKSElLPzw6OTM3Njc3PTs+Oj06Ojo4ODo7Ozg4Ojs7PD46PT09Ojw/PD0/QkA/Q0RDRD5APT08QENEQ0JEQkQ+REhJSUtMttfT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3MzMzMzMzMzMzMzMzNzc3NzczMzMzMzMzMzMzMzc3Nzc3Ozs7Pz8/Q0NDQ0NHS0tLT09PT09PT1NTU1NTU1NTU1NTU1NTV1dXV1NTU1NPT1NTU1NTU1NTU1NTU1dXV1NXV1dXV1NTU09PT09PS0tLT09PT09PU1NXV1dbW1tXV1dbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1NTU1NTU1NXU1NTU1NTT09PT09PT09PU1NTU1dXV1dXV1dTU1NTU09PT09PS0tLR0p+DaV9kU1hsSEhIS0A9Nzg0NzY6Oj87RDw8Ojw8OTg6OTo6Ojs8Ojo7OT49Pjk9QDs/QUFCP0JCQUM9Pz8+PEBCRUNDQkBBO0ZJR01MSbLY09TU1NTU1NXV1dXV1dXV1dXW1tbW1tbV1dXW1svLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzM3Nzc3Nzc3Nzc3Ozc3NzczMzMzMzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc3Mzc3Nzs7Ozs7Pz8/P0NDQ0NHS0tLS09PT09PT09TU1NTU1NTU1NTU1NTV1NXV1dTU1NTU1NTU1NTU1NTV1NTU1dXV1dXV1dXV1dTU1NTU1NPT09PT09PT09PU1NXV1dbW1tbW1tbW1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTV1NTU1NXV1dXU1NTU1NTT09PT09PT1NTU1dXV1dXV1dXU1NTU1NTT09PT09LS0tSjiGxfZlJWakdIR0lBPjM2Njo7PDhDPEJBPjxBPDg5Ojw6Ojw8PDk8PTo7PD09PD89QD9AQT9AQUBCPD4+PzxCQ0NDRkBBQT1ISklOTUeu2NPU1NTV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbMzMvLy8rKysvLy8vLy8vLy8vMzMzNzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzs7Ozs7Oz8/P0NDQ0NHR0dLS0tPT09PT09TU1NTU1NTU1NTU1NTU1NTV1dXV1dXU1NXV1NTU1NTV1dXV1dXV1dXV1dXV1dXU1NTU1NTT0tPU1NTU1NTU1NTV1dbW1tbW1tbW1tbW1tbX19bW1tXV1dXV1dXV1dXV1dTU1NTU1dXV1dXV1dXU1NTU1NTU09PT09PT1NTU1NXV1dXV1dXV1dXV1NTU1NPT09PT0tLWroprY2VSWGhMSkdJQjg0OTQ6Ozo5QDk+Q0U/PDw5OTk9Oj07PDw6PTw7OTw9Ozs/PUA9PT5AQD9CQT5APD05QERDQkFBQj48SEpLTU5IqNnU1NXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbWzMzQ0dDQ0NDQ0dHR0dHR0c3Ky8vLzMzMzMzMzMzMzM3Nzc3Nzc7Ozs3Nzc3Nzc/Pz8/Pz8/Pz8/Pz9DQ0dHR0dHR0dHR0dHS0tHV2djY2NnZ2dra2tvb29vZ2dnZ2dna2tra2tra2tjW19fX19fX19jX19fX19XV1dTU1NTV1dXV1dXV1tfX19fX19fX1tbW1tbW09LT09PT09TU1NTU1NbW1dXV1dXV1dXV1dXW1tbX1tbW1tbV1dXV1dXV1dXV1dTU1dXV1dXV1dXU1NTU1NTU1NTU09PU1NTU1NXV1dXW1dXV1dXV1dTU1NTT09PT09PS1bqKa2hoUlhlSUlMT0A5OTo0O0E8Nz05QUM+QD89ODo6Ozk9Oz4/Ojs8PDo7PDo7Pj1APT8/P0FAQUE/QTw8Oz5BRENBREA9PElJSk1ORqPa09TV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbW1szNloSGhoaGhoeHh4eHh4Ky4t3d3t7e3t7e3t7e3t3S0NDQ0NDQ0NDQ0NDQ0ci5ubm5ubm5ubm5ubq6t6WkpKSkpKSkpKSkpKSnhmBjY2NjY2NjY2NkZGRlhIuKioqKioqKioqKioemuri4uLi4uLi4uLi4uLrR09PT09PT09PT1NTU1cm7vb29vb29vb29vb28v9LS0tLS0tLT09PS09PT3OPi4uLi4uLi4uLj4+Pi2NfX1tbW1tbW1tbV1dXV1dXV1dXV1dbW1dXV1dXV1dTU1NTU1NTU1NTV1dXV1dXW1dXV1dXV1dXV1NTU1NTT09PT09XDkXFrak5TYkxMVk48Ojo3Nz5DPjg+Oj8/QT0+QDc7Ojs7PTs+Pjo7PD48Oz07PT8+QDw/Pz1AQEBBPj88PjxAQUVCQkZAQD9HSEpLT0ae2tXV1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19fMzm5QU1NTU1NUVFRUVFNMoPPr6+rq6urq6urq6uvp1dLS0tLS0tLS0tLS0tTEqaqqqqqqqqqqqqqqq6aGhIWFhYWFhYWFhYWFik4MEhISEhISEhISEhIRE0pUU1NTU1NTU1NTU1NPg6ejo6Ojo6Ojo6Ojo6Knz9PS0tLS0tLS0tLS0tS/qKqqqqqqqqqqqqqqqLDS0tLS0tLS0tLS0tLS0eDs6+vr6+vr6+vr6+vr6dnX19fX1tbW1tbW1tbW1dXV1dXV1dbW1tbV1dXV1dXV1dXV1dTU1NTV1dXV1dXW1tXV1dXV1dXV1dXU1NTU1NTU1NPUy5h2bGlKTl9NUlVNPjw8Nzs/Qz42Ojc+Pzs9Qj85PDk9Ozw6PD07PTs9Ozs9PD0+PT07QT08QUBBQT08Pzw7QEJDQURFPUFAQ0ZLS09GmNzV1dXV1dbW1tbW1tbW1tbW1tfX19fX19fX19fXzM5xVFhXV1dYWFhYWFhXUKHx6enp6enp6enq6unq6dXS0tLS0tLS0tLS0tLUxaqrq6urq6urq6urq6yoiIeHh4eHh4eHh4eHh41SEhgYGBgYGBgYGBgYFxpOWVdXV1dXV1dXV1dXU4WopKSkpKSkpKSkpKSjqM/T0tLS0tLS0tLS0tLUwamrq6urq6urq6urq6qx0dLS0tLS0tLS0tLS0tHf6+rq6urq6urq6urq6unZ19jX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dXV1dXV1dXU1NTU1NTU1NGcenFpSlRdT1JVTkQ+Pzs/QEA4Ojs4PDs8PD86Ozs4Ozk5Ozw7Ojw5Ozs8Ozo9PT0+PUE/Pj8/Pj08PT88PEFBQ0FERTw+QEVGSktNRpPc1dXV1tbW1tbW1tbW1tbW1tfX19fX19fX19fX183OeF5hYGBgYGFhYWFgYFqk7ufn5+fn5+fn5+fn5+bV0dLS0tLS0tLS0tLS08Wtrq6urq6urq6urq6vq46NjY2NjY2NjY2NjY2SXSInJycnJycoKCgoKCcpWmNiYWJhYmJiYmJiYl6MrKmpqampqampqampqazP09LS0tLS0tLT09PT1cKtr6+vr6+vr6+vr6+uttLS0tLS0tLS0tLS0tLS3+np6enp6enp6enp6enn2djY2NjY19fX19fX19fX19fX19bW1tfX19fW1tbW1tbV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbV1dXV1dXU1NTU1NTWo3txZElbYE5OVU9AQT89REI+Oz06OTs6PT07PDs6OTg5OTs8Ozw8Ojo7PDo7QD08PTxAQTxBQTs7PEA/PD1CP0RDQ0U8PkJERkpMTEWN3NXV1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjNzcfFxcXFxcXFxcXFxcXEy9DPz8/Pz8/Pz9DQ0NDQz87Ozs7Ozs7Ozs/Oz8/NzMzMzMzMzMzMzMzMzMvJycrKysrKysrKysrKysfCw8PExMTExcXFxsbGxsvMy8zLzMzNzMzMzMzLz9HR0tLS0tLS0tLS0tLS1NXV1dXV1dXV1NPT09TT0tLS0tLS0tLS0tLT09LV1NTV1dXV1dXW1dbW1tjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NfX19fX19fX1tfX19fX19bW1tbW1tbW1tXV1dXV1dXV1dbV1dbW1tbW1tbW1tXV1dXV1dTU1NTU169/cF5GXmJQUVdOR0ZDQ0lBPz07PDo8OEBCPD04Ojo4OTg7Pzs8PDs7PDw8PD87PD46Pj44PkI8Pj1BPjw+QkBERUNAPD5APkNJSUtEh9zV1tbW1tbW1tbW1tbX19fX19fX19jY2NjY2NjYzs3Pz8/Pz8/Pz8/Pz9PPz87MzczP09LSzs3P0s7Ozs7Ozs7O09TQztHU1NPOztPTz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0NDR0dHR0dHS09PU1NTU1dXV1tbW1tfW1tbX1tfX19fX19fX19bW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dTU1NTU1NbV1tbW1tbW1tbW19bW1tbW1tbX19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjX19fX19jY19fX1tbW1tbW1tbW1tbW1tbW1dbW1dbW1tbW1tbW1tbW1tXV1dXV1NTV1di4gm9XSl9jUlFaS0hBQTxCPT07Oj4+PD4/PT0/Nzk6OTk3OD48PD47Ozw7PDs/PT0+OTs7OT0+P0A+QD07OkI/QkNCPz0+QD5CRUdKQoDc1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2M7Ozs7Ozs7Nzc3Nzsqfys3Nzc3QuYOEi8fTwJrLz87Ozs7O0KaSxdStg4OVz9KkodDOzs7Ozs7Ozs7Ozs7Oz8/Pz8/P0NDQ0NDQ0NDR0dHR0tLT09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbV1dXV1dbW1tbV1dXV1dXV1NTU1NXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NfX19fX1tbW1tbW1tbW1tbW1tXV1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXYwIBuVU9gY1dZW0xMQ0A9PTs9Ojw+Qj5CQ0A9Ojg5ODo6Ojc7Pz4/PDw7PDo5Pzw8PTg5PD9BPj09PUFAPTtBQkBCQz47QD9BQUlHSkF629bW1tbW1tbX19fX19fX19jY2NjY2NnZ2djY2dnOzs7Ozs7Ozs7OzdKpj63Rzs7Ozpu3tqSiwJOerNPOzs7O0qqdrJXDm7y4mbSzn6Gp0s7Ozs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0dHS0tLT09TU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dbW1tbW1tXV1dXV1dXU1dXV1dXV1dXW1tbW1tbW1tbW1tfX19fX19jX19fY2NjY2NjY2djY2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2dnY2NjZ2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV18h/b1pTYWVeXVxPSkQ9QD8+Ozc6Pjk/RD5BOTg3ODk7Ozw4OT89PTw9PD47OkE7OTs5OzxDQDw7PT5AQT49QkQ/QkM9PT8+Pz5ISUg/ddrW1tbX19fX19fX19fX2NjY2NjZ2dnZ2dnZ2dnZzs7Ozs7Ozs7Ozs/Inrym0tDQzsqgl36Cw6abr6fUz8/P0MmXmYWmn6iOgI3FnZiVnMjQzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dLS0tPT09TU1dXV1dXV1dXV1dXV1dbV1dXV1dXV1tbW1tbW1tbV1dXV1dXW1tbV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2djY2NjY2NnZ2dnZ2dnY2NjY2NfX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dbV1dXV1dfNiHNdWGloXl9gT0lGOkFAPj88PTo2P0JAQzo2NDc6Ozo8Ojk+PD49PTs/PTxBPjw8Ojw8PTw6PEA9QEI+PkFCPUNDPT0+Oz9BRUtIQHDZ1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2c/Pz8/Pz87Ozs7SrKWnqdXAvNLHnY+ey9PJipmq1M/Pz8/RpLC9moyjiazWupiinbCy08/Pz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0dHS0tLS09PT1NTU1dXV1dXV1dbW1tbW1dbW1tbW1tbV1tbW1tbW1tbW1dXV1dXV1dXW1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnY2NjY19fX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0JB1W1tqaWFeXVNOSTxDQEE+QD46OEZBP0M6NzQ5Ojo5Ozs4Oz0/Pj49QT08P0A9Pjw8PDw8Oj1AQD8/PT5CQD9AQkA8QD0+QUVLRz9r19fX19fX19fX2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnPz8/Pz8/Pz8/QzJ2Nl6zQmpfKxZ6ynpbN1q2ZqtTPz8/Pz9DVuZuLq62bpbKZlq+zqtXQ0M/Pz8/Pz8/Pz8/Pz8/P0NDQ0dHS0tLT09PT1NTU1NXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX19fX19fY19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tKUcl5ea2tqZV1PTEc/RENDQDo9OzxCPD49OTY0Ojk5Ojo5Nzs/QDs8PUA8PEE+PD07PTw/PDo8Q0A+PTs9QD5CPkBBPkA9QD9GSUQ/ZtXX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2traz8/Pz8/Pz8/P07GigJuvyaCjv8qcpYynrdiqmarUz8/Pz8/Q0ZqgpaSclqeQmoSdk6TV0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1NXV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dbW1tXW1tbW1tbV1tbW1tbX19fX19fX19fX19fX2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbSk3BgXnBoZmVaUUhHQkVDQEA3Ojo8Pjo8OTc2NTk6Njo8Ozc8QEA8Ojo9Ojw/Pj08OUA8PDo6OT9APj08PUBBQz9APz5BOz9ARkpCP2LS2NfX2NjY2NjY2NjY2dnZ2dnZ2tra29vb29vb28/Pz8/Pz8/P0M6fkGyclteqo9PSrqa1mJ/Vqpmq1M/Q0NDQ1aekoNWktKuff6CphZmk1dHR0NDQ0dHQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1dXV1dbW1tbX19bW1tbW1tbW1tbX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfW1tfX19jY2NfX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX1tbW1tbW1tbW1tbW1tbX19fX19fW1tbW1tbX0pNuYFxxZGdkWlVKQENGQ0FCODs/PD07PDw4NTU4OTY4Ozo5PDo+Pzw9PTk8Pz49Ojo+OTw6Ojg+Pzw9PTw+QEFDQT48PDpCRERKRkJd0NnX19jY2NjY2NjY2dnZ2dna2trb29vb29vb29vPz8/Pz8/Pz9G9n8O31pfA09HQ0srSzZeb1KqZq9XRz9DQ0sCdosjXytnBnIC8raaYr9bR0dHR0dHR0dHR0NDR0dHR0dHR0tLT09PU1NTV1dXV1tbW1tfX19fX19bW1tbW1tfX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19fY2NjY2NjY2NjY2NjY2djZ2dnZ2dnZ2dnZ2dnZ2drZ2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fX19fX19fW1tfX1tbX19fX19fX19fX19bW19GRbF1cb2doYl1PRkBISUdFQDw8Pj48PT48NzU2Ojk2OTs6Ojs4QD86PDw5PD49Ozs6Pzk/Ojs5PT49Pjw7PTxAQ0I/Pz47Q0ZGR0hEWc3a2NjY2NjZ2dnZ2dnZ2dna2trb29vb29vb29vb0NDQz8/Pz8/Pz5V+e6WS1KKa08ySl6ObodirmavV0pem09SkoI+5w4+hn5+ZqJaYm7vV0dHR0dHR0dHR0dHR0dHR0tLS0tLS09PU1NTV1dXV1tbW19fX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tbX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2tnZ2dnZ2dnZ2djY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX1tfPjGRWXnBrXGBgTkVITUlJT0M+OkI9PUBCOzU1Nzw6Nzo7Ojo7OT09OTo6OT0+Pz07OT47PDo8Ozk+PD47PD0+QENCPz5BPEFDR0ZGRVXJ29jY2NnZ2dnZ2dnZ2dra2tvb29vb29zc3Nzc3NDQ0NDQ0M/Pz9DR1aeZrcmjqL7KnbGdo7XZqZup2LirocjGpr2Vk5Ooq6Kfw6CrpJzR09LS0tLS0tLS0tLR0dHS0tLT0tPT09PU1NTV1dbW1tbX19fX19fX19fX19fX19fX19fX19bW1tbW1tfX19fX19fW1tbW1tbW1tbX19fW1tbW1tbW1tbX19fX2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2djY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fX19fX19fX19fY2NfX19fX19fYzYZdV2JvZE9dVEtIRlNRS0xBPj1EPD9DRj01NTc7OTY6Ozo8PTo7Pzo6OTg6PT0/Pjs/Oz49Ojs5Pjs9PD0+QURCQD8+PzxAQUVHRURSxdvY2dnZ2dnZ2dnZ2tra2tvb29vb3Nzc3Nzc3NzQ0NDQ0NDQ0NDQ0NO5gL3Tm5bP1LWLkZ/T1LyBu9TOlKDUyo6Tl5Cqq42PrNjCj4281dLS0tLS0tLS0tLS0tLS0tLT09PT09PU1NXV1dbW1tfX19fX19fY2NjY19fX19fX19fX19fX19fW1tbX19fX19fW1tbW1tbW1tbW19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2tnZ2tra2tra2tra29ra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2NfX2ct+WlVqaltMX01KTEpVTEZCPD0/R0ZHS0g9NjU3Ojk3OTo7Ojw9OT45OTo4Oz0+PkE+PTk8PDo9Pj46PTk5Oj9FQUA+PT8/QkBHRURFUMHc2dnZ2dnZ2dna2trb29vb29vb3Nzc3Nzc3dzc0NDQ0NDQ0NDQ0NDQ0cHR0crI0tDUxLjS0tHSwtLQ08fM0tTCr7Cz0NbAv9bS1cXE1dLS0tLS09PT09PT09LS0tPT09PU1NTU1NXV1dbW1tfX19fX19fX2NjY2NjX19fX2NfX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29va2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2djY2NjX19fX19fY2NjY2NjY2NjY2NjY19rHd1xSZ2laTlpOTFBRV0VKPz89P0FFTExBPjc3NTs4ODk5Ojs8Pjw+ODo6OTs+P0A9Pj46NTo6Oz0/Ojs5Ojw+QkJAPz8/P0FCR0RDRE683dnZ2dnZ2dna2tvb29vb29vb3Nzc3Nzc3d3d3dDR0dDQ0NDQ0NDQ0NDS0NDR0dDQ0dPU0dHR0dPR0dHS0tHR1NbW1tLS1dXT09PU1NLS0tPT09PT09PT09PT09PT09PU1NTU1dXV1dbW1tfX19fX2NjY2NjY2NjY2NfX19jY19fX19fX19fX19fX19fX19fX1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tvb2tra2tra2trZ2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2trZ2tra29ra2trZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjbwXNYVWlrU0xSTlBSWVRGSTw+Qz9BQkVLPj43ODY5Njc4OTk7Oz0/QDw9ODk7Ozs/Pjw8OTU6PT47OTk7PD8/P0JCQT1BPUBBQkZCQkJLtd7Z2dra2tra2tvb29vb29vc3Nzc3Nzd3d3d3d3R0dHR0dHR0dHR0dDQ0NDQ0NDQ0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tPT09PT09PT09PT09PT09TU1NPT1NTU1NTU1NXV1dXV1dXW1tbX19fX2NjY2NjY2NjY2NjY19fY2NjX19fX19fX19fX19fX19fX19fX19fW1tbX19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2NjY2NjY3LxvVFRsbExLUkpUUlVLRkQ6PkdEREFERjw/ODk6OTY5OTo3PD07PkA9PTc5Ojs5Pjs5OTY2Oj1AQT47PDk6Pj9DQT4/Qj0+QkNFQkFCSrDe2dra2tvb29vb29vb29vc3Nzc3Nzd3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0tLS0tLS0tLS0tLS0tLS0tPT09PT09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1tbW1tbW19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19fW1tbW1tfW19fX19jY2NjY2NjZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2dnZ2dnY2Ny2a1NbcGtLVVdSXFFXSEQ+PEJKRT1ISj89PDc4ODo1OTg5Njs+PD1APDw1OTk8Oj87OTk0ODw9PUFBPD47Ojw+QD89PkE9PUNGR0I/Qkmq39ra29vb29vb29vb3Nzc3Nzc3N3d3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHS0M/U0M7P0tLT0tLS0tLS0tLS0tPT09TU1NTU1NPU1NTU1NTU1NTU1NTU1NTV1dXV1dXV1dbW1tbW19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19jY2NfX19fX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dndsGRTYXJfT1pUV19RUkdCPUVJTEFBTEQ/Pzs5ODg5Mzg2ODY5Pj0+Pz06Njo7Pjs9PTo5Njg6PTtAQDxAPz0/P0I+PD48PEJFSElCPkNJpODa29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3t7S0tLS0tLS0tLS0dHR0dHR0dPT0bm7zLqbnLrQyNPT0tLS09PT09PT09PU1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2NjZ2dra2tra2tra2tra2tra2tra2tra2tra29va2tra29va2tvb2tra2tra2tra2tra2trb29vb29va2tra2tra2tra2tra2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ3qpfVWBuW1VZUVpeT0xHQ0ZNSUZEREo7QUE7PDg4NjQ4Njk4Nzw/QT89Ojc8Pz48Pz87OjY4OD09QEE9QD5BQD1AOjs6Pj1BRUdKQkBDR57h29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e0tLS0tLS0tLS0tLS0tLS0tO+wMqaoKKViJGeqpOpz9TT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fY2NjY2NnZ2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dna2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2tvb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2d6iXFVeblheXU5aUFROQ0NMSUlJRkpEPEJBPDs4Nzc3OTc3OTk9P0E/PDo5QD88PkI/Ojg3NzY9Pz9APUBBPz88PTs7OD48P0VJSEE/Q0aX4dvb29zc3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3tPT09PT0tLS0tLS0tLS0tTIlZyum5m1iX2TjIKBhMTV09PT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tvb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dndmlpYYW5ZYVdPV01QRUJETElNS0ZJRT5CRDk4ODY4OTc1Njk4PT1BPjo4OT4+PD9APzw1Njc2PD4/PjtAQEA/Pj4/Pjs/PkFCRkdCQENIkeLb29zc3Nzc3d3d3d3d3d3d3d7e3t7e3t7f39/U09PT09PT09PT09LS0tLTz6h+kayPko6MhoCIiYSQo8rU09PT09PU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY19jY2NjY2NjY2NjY2NjX19fX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2tra29vb29ra2tra2tra2tna3JJaWWNuWlpSVV5QTDxAR05IUklIRT47SEY4OTc1Nzg3NTg5ODs+Pj07ODlBPj1AP0E+NzU5Njs+QUI/P0BAQUI/Pj8+QUBEQUZIQj9FSozi3Nzc3Nzc3d3d3d3d3d3e3t7e3t7f39/f39/f1NTU09PT09PT09PT09PWtaWaiIuQhYCFi4iBg4qLf4bC1tTU1NTU1NTV1dXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2dnZ2dna2dra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29ra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb2tra29uIWltnalxYTFpfVkg6TEhMSkpDRUVDQExINzo3Njc4ODU4Nzg5PDw7Ozk4QD89Pj8/PDY3PDQ3P0JCQUBAPz8/QT09P0A+QEBGRT09REuI4tzc3Nzd3d3d3d7e3t7e3t7e3t/f39/f39/f39TU1NTU1NPT09PT09PUxZKCg4WGfYGCfXx5foGCg36k29bU1NTU1NTV1dXV1dXV1tbV1tbW1tbW1tfX19fX19fX19fX19fX19jY2NjY2NjZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vc3Nzc3Nvb29vb29vb29vb29vb2tra2tra29vb29zb29zb29vb29vb29vb29vb29vb29va2tvb29vb29vb29vb29vb29vb2tvZgFpebWhaU0ldW1hKRE1ISlNMR0ZBQD9KQjg7NjY5OTc1ODY4Ozo7Ojw5OD09O0A9Ozo2NTw3Oz1CQEFBPD49QEE9PEA/Pz5CREU+PERLg+Lc3d3d3d3d3t7e3t7e3t7f39/f39/f39/f39/V1dTU1NTU1NPT09PT2LKEkKh9g3l2hIh/e3d5gn5+i67A1dTU1NXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dna2trZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2tra2tra2trb2tra2tvb29vb29vb29vc3Nzc3Nzc29vb29vb29vb29vb29va2trb29vb29zc3Nzc3Nvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc1nlcWmxmWFJPYFFSQUhHSkZYTEZAQENDSz87Ozc4ODc2NTc2ODo5PDw6PTs/PTs9Pjw7ODg8OT0/QkFCQzw8P0FCPj1BQkNCREVDQDtDTH3h3d3d3d3e3t7e3t7e39/f39/f39/f39/g4ODg1dXV1NXU1NTU1NPU0ruen3WKeXuIgICChYGDcnOAhYOMrNfV1NXV1dXW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NnZ2dna2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra29vb29ra2trb3Nzc3Nzc29zc3Nzc3Nzc3Nzb29vb29vb29vb29rb29vb29vb29zc3Nzc3Nzc3Nvb29zc3Nzc3Nvb29vb29vb29vb29vc3Nzc3Nzc3Nvb29vb3dByXV9wZVdLUGNPS0JHQ0pIS0ZBPEE9SFBBOjo3Nzg3Njc4Nzw6OD09PD47QD88Pz07Ojs5Ojk8QEJAQkNAPUFAPz1AQkNDQUBAP0A7RU144N3d3d7e3t/f39/f39/f39/f3+Dg4ODg4ODg4NXV1dXV1dXV1NXU18h4i4V8goh6g4SBfoKCc2l0hYuGkJ3U1tXU1dbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tvb2tvb3Nzc3Nzc3Nvc3Nzc3Nzc3Nzc29zb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb297KalxjcWVST1heSz9HTElPS0VAPkFCP0lPPjk6NzY7NzY6Ozc7Ojg6PDw+Oz09Oz48Ojs4OTo4OUFCQkFAQDtAQj06PkFCQz8+PT4/PUZOdN/e3t7e3t7f39/f39/f4ODg4ODg4ODg4ODg4OHV1dXV1dXV1dXV1s6dhpl+f5OTin+CgXx9gnNxm4mAgoOJwNnat7TQ19bW1tbX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tra2tra2tra2tra29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NvfwGNaW21gVlBTU0pETEhNSEk8PkFEQ0ZORDw8OTc5OjY4Ozk3PDk4OTw9OzlAPjpBPzw3NTc7ODpAQUVBPz45PUI/Oz1CQkI6Pj07PT5GTnHe3t7e3t/f39/f39/g4ODg4ODg4ODg4OHh4eHh1tbW1tbW1tbV1tjLioCHhYOXjHh7e3lvfYF1a3ebdHZ7eInHxpiMrdjZ19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2drZ2dna2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tra29vb3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29zb29vb3Nzc3Nzc3Nzd3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3Nzc3Nzc4LdjV1lrYlJNVVFMSktGS0ZDQD5CQT9FTT4+PTg5OTo3OTo3NT03Nzo+PDs7Qjw5Pz05NjY4PTk6QEJGQD49PEBCREA9QD9DO0A9PD4/Rk9t3N/e3t/f3+Dg4ODg4ODg4ODg4OHh4eHh4eHh4dbW1tbW1tbW1tfVrYZ6d32rn3l4entzdH+Dfm9xe3l6c3t2k4qFgImkzdnY19fX2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tna2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29vb29vc3Nzc3N3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vc3Nzb3Nzc3Nzc3N3d3d3d3d3d3dzc3Nzc3Nzd3d3c3Nzc3Nzc3N3d3d3d3d3d3d3d3dzc3OGtYVtebGJSTVZMTUdLS0RGQkI7QT08RUxDQT44Ojk6Nzc5NjY6NTs+QDs9Oz89PD89Ojk5Ojw5PEVDRkA/PkBDQkQ9OT0/QT1CPz1APkdPadvf3t/f3+Dg4ODg4ODh4eHh4eHh4eHh4eHi4uLW1tbW1tbW1tfQmH+Qh4N9eoN2e3Vzenl6kKqmd3JyfoeHh4CAfoKEhJHJzNnX19jY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra29va2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2djY2NnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vb3Nzc3N3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzb29vb3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3dzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3NzhpV9UYm1iUE9TSUhHRkpJSUJBPkJCPEVFREA+ODo4Ozc3Ojc4ODY+Pz07PDk9PDo+PTs6Njc7NjpEQUY+Pz8/PkNBPzs9PT47REM/PjxIT2fZ4N/f3+Dg4ODg4eHh4eHh4eHh4eLi4uLi4uLi1tbW1tbW19jYyH52doN+fnR2eIaCenl1d5yhu6GEgoCAfoeKinx/gYaMnKjO2NjY2NjY2NjY2djY2NjZ2djY2NjY2dnZ2dra2tra2trb29rb29rb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3d3d3d3c35pbT2drXFBRUElDT0pLR0xHSkJAP0FHREBBPDg8ODg1ODk3Njc3QEA/Ozw5Pj04PTw8Ojc4PTk/RENGPkE/QkBDPzw6Pj0/PkVEPz07S1Fj1+Hf4ODg4ODh4eHh4eHh4uLi4uLi4uLi4uLj49bW1tbW19XB3LRueHJze3B6eXaFiIR7eH2AgZiljH98fnuRhZaLhoGDgY6Rvd3Z2NjY2NjZ2dnZ2dnZ2dnZ2dnY2dnZ2dna2tra2trb29va2tva2tra2trb29ra2tra2tnZ2dnZ2dnZ2dnZ2dna2trZ2dnZ2dra2tra2tnZ2dnZ2dna2tra2tra2tra2tra2tra2trb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t3d3d6NWFdobllQUUtISlNJTUhNSUtBQz9DRkJBRDo6PDg2NDg4NzY2Nj8+Pjo8OTw7Oj09PDw4Ozw8RERERT4/PkI+Qj84PT8/Q0NCQEE+O0xUY9Xh3+Dg4OHh4eHh4eLi4uLi4uLi4uLi4uPj4+PW1tbW1teslLZ6eHJvd5V7dHuLgHh1bn6Fg3t/hYhyfH2bnI6JioJ+g32Hk5rH1NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2trb29vb29vb29vb2tra2tra2tra2tra2tnZ2dnZ2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2trb2tra2tra2tra2trb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d7Zf1lgaGxcUUtHR09LTk5PTURGQkg/Q0hEREA6Ozs4NzU3Nzc4NThAPkA7PDk8Ozw+Ojk7OTk7OUZERUI8QD4/PEBDOz5AP0A/Qj8+OjtKVWPV4eDg4eHh4eHi4uLi4uLi4uLi4uPj4+Pj4+Pj1tbX19vKhYR3cXJubniVhHt4hH95dnB4c3eLkY6CdnN9ioaId3d1d4ODfIiIk8Pb2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2trb2tvb29vb29vb29vb29rb2tra2tra2tra2tra2tnZ2dnZ2dna2tra2tra2tra2trb2tra2tra2tra2tra2trb29vb29ra2trb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f0nVZaGlqVk5KSE1OR01EUElGSD9FPUZMREM+Ozs8OTc3OTY2OTU4Pj4/PTs8QDs9PDo3Ozc5OThHREVCPUE9Qj8+QDw/QUE/QEJAPjs8S1Ri1OLg4eHh4eLi4uLi4uLi4+Pj4+Pj4+Pj4+Pj49fX19fEknuJf29sbnV2foSBg4qGfnVybWVtiIaKjoR7c4OHint4e4OPj4GEioqxztrZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29zc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tvb2tvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3dzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f3t7e4clsW2pqalNOR0hOT0VIRk1JSUA7RD5ISUA9PDo6Ojg2ODo3Nzk0OD08PT07ODw8PDw4Njc4OTo6RUJFQT9APEI/Q0M+PkNEQUBAP0A8PUtRYdPj4OHh4uLi4uLi4uPj4+Pj4+Pj4+Pj4+Pj5OTX19fZqXaFfnx3bHB3eXh8jH2KhYB3anN0d3p9bot7fnl6foR/gIGDfnh8foeGlrbT2tnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra29ra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/e3uO9amFpa2lRTkZNTEtKWE1OR0FAQE9BQz9AOzw4OTk5Njg2NjY4NDs+PD07OTY6Ojk6OTU4OTg5OkJERj8+Pj5AQEBCPzxBQD88Pj9BOT5KT17S4+Hh4eLi4uLi4+Pj4+Pj4+Pj4+Pj4+Tk5OTk19fX2sqKhIB5c29tcXN1d4CUeHaAfHWHhXd1cnWgmXp7d3Z5doR0bWxue3iAmouTu9za2tra2tra2trb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc29vb29vb2tra2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f397js2lpbmloUFBPTExPUk9LU0Y/RURERD48PDg7ODc5OTU2ODY2NzM6Pjs+PTc6Pjk5OTk2Ojo4NzxDRUc/Pzs/PkA9PkE9Oz0+OUFAQDhBTlFc0OTh4eLi4uLj4+Pj4+Pj4+Pj4+Pk5OTk5OTk5NjY2NjauY6AenZ1bmpveHCBfWt0cnZ3hIV5h4d5lY55eXp1d3pza298gHx2fYh8gLLe2tra2tvb29vb29vb29vc3Nzc3Nzc3Nzc3dzc3Nzc3Nzc3Nzb29vb29rb29vb29ra2tra2tra2tra29va29vb29vb29vb29zc3Nzb29vb29vb29vb29vc3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3t7e3t7e3d7e3t3d3t7e3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/f39/f4qpqa2hrZFNQT0ZQVFJOSFJLPkREQ0I7Ozk6Ojg2Nzg1NjY4ODg0Oz88Pzw5PDw3Ozo6Nzo6Nzo9Q0JDPUE+Pzw5PT5BQDs8PDtFQD47Q05TXNDk4eLi4uLj4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTY2NjZ1p5vdntveHh2cG50d3BwdHBzb36Jc3qGhY2EenNtcoB6hn1vg5OBdnx9g4a13drb29vc29vc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29ra2tra2tvb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4N/f3+KgbWhma2ZVVlJHUFFOS0xMRUJIRUc9OD08Ojo3Nzg2Nzc2NTY3NDg+PD09Ojg6OD46Ozc4Nzc6Oj5DRDtDQj49OD1AQUM/Pjw+RTw+PUJNUF/S4+Hi4uLj4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk2NjY3MB2doCCfnp4eHBsdXlya399bHNvdGdoaYB/aWl4c2d+iYl4cIKGe3d9foWKvd3b3Nzc3Nzc3Nzc3Nzc3Nzc3d3c3Nzc3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODflGttZm5mU1NJUFlUTEhGTkZGRUJGPTs+PDs5Nzc4NTc5NjQ1NzU4PDs9Pjo6OztAOTs7ODc6OTlAQkE8QUE/Pzk/QEJFQ0FAQEM7Oz1ES01g1uTi4uLi4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk5NnZ2tmYc3uqhJaCcnR1dn14aGx8d2h4d25rcHR5gIJ3dHyBhIJ9c3CAin94gn95g8je3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f4N/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh24tubWdzY1lRTVVbV0hDSUZOS0dCRD8/Qjo7OjY2NzU2NzY0ODc2Ozw7Pj86PDk8Qjg3OTo6Ojk6QUFCQUJDQEE+PT9CQ0NEQUJGOTg9REpOYtjk4uLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXZ2drcqHGCtXiRfnNsem6EgXaCfWtoan+DeHZ8dX2FhXRmcHl9d316gIqFe318foC03tzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3dzc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3Nzd3d3d3d3d3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e397e3t7e39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4ODg4ODg4tiFb3FrdWFWT1VVXE9ETUY+SkdKRUQ8P0I6PDk4Njg0NTY3NDc2NDk7Ozw7OD47PEE4ODo9OD04Oj09QEBAP0FCP0A+QENCQ0FBRTc2O0RMTmPa5OLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXl29ra3Z5sbnNxhY1ybXBuf391hH5rcnZ2enN4gXhzb3VwbWt2fHmFiIB/f392coODsd/c3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eDg4eHh4eHh4eHh4OLXhW1xb3ZeUldTWlpRSkhDQFFAQkQ8OT9BOjw5NzU3NDU2NjQ3NTY9PDo9PTk+OjxAODo6PDY7OTs+PUJCQjtBQkBDQEBEREM8PUA3OjxFS01l3OPi4uPj4+Pj5OTk5OTk5OTk5OTk5OXl5eXl5dPOxsB+cWxveHt2b3VuanNzbZKGeG50dG5vdIZ/b2twboJ0bXZyfY2DdnF/d3mKgabf3Nzc3d3d3d3d3d3e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3dzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t/f3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi1oZucG1xYFJZUFdfWUpMTElSP0Q9OTtCRjs6OTc0NTY1NzU0NjY2Pj07Pz45PTk7Pjg9Ozo0ODtAQENCQ0FCRkE/Q0BBQkREOz0+OTs8QkxNZODl4+Pk5OTj4+Tk5OTk5OTk5OTk5eXl5eXl5eW5t7Woc3JscHd6dHd4bXFydXd/hHRyc2xsa3F8bnBudGuBf3GAd32Eg355gHNygYqg2d3c3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh49WHcWxqbF5YWlVXYFZWUE9QTD1BOjs8RkE4Ojg3MzY1Njk2NTg1Nz89Oz8+OT04Ozw5PTs7NTo9Q0JCPENDREREQUE/PkJDQzw9Pjg5PENLS2PN0dnh1sjY4+Tk5OTk5OTk5OTk5eXl5eXl5eXltbW2q3J5cm59f3Z1d2hqaGlwb3Zta2tnZWZxdG15gG5teXd2iHhxa2podXV5dHV/wd/c3d3d3d3d3d3e3t7e3d3d3d7d3d3d3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHi4uHh4ePVhnFwY2lhV1NZV19MUk9STUtAPjg5O0E+ODc5NjQ3Njc6NjY2NDk+Pzo8Pzo/OTo6Nzo9PDk5PEFBPTtBQ0VDRkA+Pj5BRUQ+QEE3OD5GSEpesrW4wbm1u8jg5eXl5OTl5OXl5+fn5+fm5ebm5ra2tbWOfX5weoR1cnZnYmNlbGtyb2ZpbHZtd4Z9hXlsbHd4a3ZwfH14c3V5fHd2h7ng3d3d3d3d3d7e3t7e3t7d3t7e3t7d3d3d3d3d3t7e3t7d3t7e3t7e3t3d3d3d3d3d3d7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4eHj1Yd1bl5uY1pUU1hXS1NLSk1SR0E4Ozs+PDk4NzU2NTY2OTY4NjY5Pzw6PT07Pzo7Ozk8PDs5Oj4+Pjs8PUFEQkNBQEBBP0JDPDw9Nzs+REVKXrG1tLW2t7e2y9rJ3uXl3eDi3tXU1tPU4OPg39+2treuh3t/bnmNenJ1bWNobGxtaXR4enF5enqIh4N6aWh9cWRvcXyGgX55e318e4an2t7d3d3d3d7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4uHh49aGdmxhb19dV1lcWlJQSEpXTEVHPUA9Ozs9OTY0NjU1NTg2NzY3OD87OT09PDw5OTw6Pjw6OTg+Qjs7Pj5AREBDRUFAQD0/QDw9PTU5PEJHRl2xtbW2uLm5ubq9uMPT0r3BwcC6u7y6u8TMxb/Dt7e3hGl1gX1ndYd5Z3Vxa2t5eHB3fH15bWl3e3h3bml1j4FwbHl4d3d9gXuGgnmAoNze3d3d3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODh4OHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4ePXhXJrZ3RhW1hYX15TVVVRVUpMRj9JRDs5PTY2NDc3NTc4Nzc3ODk8PDo+PDg8Oj0+OTs8OTs5P0E8PT9DP0FARUJCQTw9Q0A6Pjw1NDlER0dasbW1tre5ubm5ubm3ubm4uLm5urq6urm5urm6u7e3uX9ucHN6b3B/eXNuc3Vsc3Z4cXFwb2tvcX6Bc2mHhIF9dHOHdW11hYmBgHJ2hafd3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uHj14lxa2xyW1dXXWBUUVVUUFJPSkNATUE9Ozk2NTM0NjQ2ODc3Nzk6Pjs8Pjs5PDo8PDk8PTw7PT0+PUNEREBDQkE/QD48PkE8OD06NjY6QkpIWLG1tLa2uLm5uLi5uLe3uLi5urq5ubi4uLi6uru3uKx7cnhxf3ZzfnBsbXpyZ29sbW50cHt3d3Jyd3pvhpJ2f3x8enZ5fH9zfYdyda3T393d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4eHh4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi49eHb2pxalVWV2FbT1FSUE5XSURESUo/Ojk6NzUzNDk1NzY2Nzg4Ojw7PD46PDo6PTw5PDw9Oz09PDs9REdEQ0E8PDw8Pj5AOzg8ODE1OkFGRVautbW1tre4uLm4uLi4uLe4ubq5uLi3t7i4ubq7t7mqcnB4d3x7e4J3aG5xam9qY2lyf21zcn54dHFsanaAeX2AgH91doB1a4qLgHaR1d/d3d7e39/f3t/f3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f4N/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLi4uPYhm1sdGVWUFxnWE1YU1JRWUVDS1BOOzk4ODc1NTM5NTY2NzY4Nzk+OT0+OTw5OTw7Njg5OTo8QEA9PkBGQEJCQDo+PEE9Pzs7OzYxNjxCR0RQqLa1tba2tre4t7i4uLi4uLm6ubi4t7e3t7e5ure2tIlyd3h9iXxwem99c2hqbGdnbHRscXd0cWx2c3Fxd3FyfHl4g3Z7d2mLkYp9kM7f3d7e3tvY2drZ297f39/e3+De39/f3Nvc3N3e3uDg3+Dg4ODf3t7e39jS397f397e3t/f3t7f3t/f3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLi4eLi4uLi4uLi4uLi4uLj4+Lj4+Li4uPj4+Pi4uLi4+Lk14NoZ3VkVlVkZVdKWllXW1Q9RU1LSD04NzU3NjQzOTQ0Nzc1Njc5PTo9Pjw9PDk7PDk5Oj45PD4/PkFBQ0FFRUQ+OzxBPjw5PDs3Mzc+REhFSqG2tbW1tbW2tre4uLi4t7e4uLi3tra2tra3uLm2traLfXpsbHp/cGx5dm5qaGdlcXp4b2lvb3B1c21zd4Fnb32CgYNyf3lqcHJ6f6ng393Zy8a/vL2/vsLN0tDW3tnc4NfQzcPCw8PH1dfT2dzX1NjX0MfExce9vM/Kz87Y3djO3N3c2t3T0dze39/e397e3t7e4N/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eLi4uLi4uLf4uPi4eLg4d7W29/Sw8rJx9Hb3OLk4eHg2dre1sbExcTN2trf5OHi4trX3st9aWZxYVleZWFNTFRLUlpMO0hNSEZBPTc2NjUzNDY2NDg3NjU2OTw7Pj46Pjk5PDk3OTs7Oj49PEBAQ0RCR0ZCQT08Q0A9OTw7Nzc3P0RGRkaZtrS1tbW2tra4uLi4uLi3uLi3s7W2t7a3t7i5tba3opdxb29waW50dnFmZWNrbmdvcm1mZ2tygWVvdnyAeGRzj39zaHFyaWVlbm+w39HFv7u5ubm5ubq6uru6vc3Gw8e/urq6uru7u8HCvcHFvby/vry7urq5ubq6ubm6w8XDucDDwby/ube/z8/U3tjc3t/g3tLa4N/f4ODg39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eDg4ODg4ODg4ODh4eHh4uLi4eDh4uLi4uHa2t3RwsPCu8XT1uDdydPDrrnAsaqrq6uwtLbJ0sXRxLG4v7Srq6usr7S0vMzE1c60tLureGxtbWBdYl9ZS1NVVFFQREBRTUhEPzo3ODU3MzE1NjQ5ODQ2Njo8Oz08ODw5Njo6ODg5NzU8PDw/QEFAQkRDQkE8PkI/Pz09PTc1OD5DRUNAj7a0tLW1t7i4uLi4uLm5uLe1sautr7Oxs7OztLS0tqaei2tue3ZxeXhnY2hfcXdha25vaG99b25ja2lseHdsa4Z+bHB6dm1scG95sca8uru7urm5ubq6urq6urq6urq6urq6urq7u7q7u7y7urq6ubq7u7q6urq6urq6ubi3t7i4t7e2tbW1tbi3u8e+w8XHzcS4wMnH0tzZ2d/e3uDf39/f4ODh4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh3Nji4uLi4eHh4OHg3tfGxtHQztTe3tPO0t/SuLi8sq2trKysrrG+ua63rKipqamqq6urqqqqq6ysuKyqqqqrq6urra6urq6urryzrayrpHlub21fXl1dVE1SU1xUSkE/UElIPjg5NjgzNzMwNTczNzg1NzY2Ojw/PDg5Ozo6Ojg5OjY1OTs8Pj9EP0NFQkNCP0BAQT9APjw3ODc6QUVEP4W4tLS1tbe4uLm5uLi3t7SurKuqqq2urq6vsLGzs7WjcG5ucm1wg311aWFlaGZkY2Rxc21td25naW1tZXBzb29zcXN8h4F6dX11n7u6uru7urm5ubm6urq6urq6ubq6urq5uLm5ubm6urq6u7q5ubm5ubq6ubm6ubm4uLi3t7e4uLe3t7a2tbW2tra1tbW1tba1t7e3t7rBvrzGycrb3+Dg3tvd3d7h4tDW4uHg4ODg4ODg4ODg4ODg4OHg4OHi0768zNjd3OLg0dnbxL23sLCxsa+zu7uzsLS9s66urq2tra2sq6qqqqmpqKmpqampqqurqqqqqamoqampqampqaqqqqytrq6urq6urq6sraR4aWJxZmFZWlZRUk5cU0Y9QlJEQTc8OzY5NTY1NDU2NTg3NTY1Nzg7Pjw7OTk5Ojg3Nzk3Njg8Oz47RD8/Q0BBREE+P0M9Pjw+Ojo3Nz9DRj54srCztLW2t7i3trKurq2sq6uqqaqtraysrq+xs7S1t4xucnRqaIB5ZmpmZWxdaG5waGxxYmNmcoJ+dmhobGpueoaBhXx4cXF5gK+6ubq6urm5uLm5ubm5ubm5ubm5ubm4uLe3t7e3uLm5ubm5uLe3t7i5ubi4uLi3t7a2tre3t7e3tra2trW0tLW1tbW2trW1tre3t7e3t7e3tre4v8bP0MS+v8DE19e8ydra4OHg4ODh4eDg4ODh4eDb3t7Uzby3tre6wMDJxLfIvrKwsLCwr7Cvrq6ur7Cwr66urq6uraytrKurq6qpqampqampqampqKmpqKmpqampqKmpqKmpqqqrraytra2ur66trK2heWpjbWdiXFhRUFFLVEpCOklRP0E3PDk0OjU2NTQ1NTY4ODY4Njs6OTw9PTs6ODY2ODg6ODY3Pj09PT5BQUVCQkNBQUBBOj09Pz05Ojc9QUc8bKqmqKutsLGwrqupqKqrq6mpqamrrKytra2usLO0tbilgIdvaWdzdGZrcG1qZGxvcm5rbWNrcHyJhG5qbHx4Y3uKfnNqc25rcY+7ubm5ubm5ubi4ubm5ubm5ubq5uLi3t7e3t7e3t7i5ubi4uLe2tra3t7e3t7a2t7a2tra3tra2tbW1tba1tLS0tbW1tra2tra3t7e3t7i4uLe2t7a2uLm4uLe3uL6+uLq9vcfb4OHg2Nnd4eHg3dfKwcPCurm5uLe4uLi3tbS0tLKysbGxsLCvr6+vr6+vr6+vr66ura2srKyrq6yqqqmoqKmppqepqaehpaipqamoop+hoZyip6inqausrK2ur7Cwrq2unXdwbGphY2BZUU1RTFJGQzlNUEU+ODs3Mjc5Njc0NDM1ODg3OTc7OTo9PTw6Ojk3NDo5ODY1OD8/QEI9RENDQ0FDQEJBQDtAP0A/PDw6O0NIPWOopaWlpqioqKenp6ipqqmoqKipqqqsra6wsLCztLW1taWYdn5xZmt4cW9tZmVsaGNsZ2ZpaX11bWlvfXZ5hWZod294b3Fvcninu7m5ubm5ubm4uLm6ubm5ubm5ubi3t7W1tba2tre3t7e3t7a2tba2tre2tbW1tra3t7e2tbS0tLS0tLS1tLS0tLW1tba2tra2t7e3t7e3t7a2tre2tre3uLe2t7i4t7i4uLi4wMXTyry8w83PyMC9urm5ubq6ubi4uLi4t7W0tLSzs7KysrGwr6+vr66urq+vr6+uraysrKurrKysq6ehoJ6gn5udoaGdlpmkpKaon5mZmZmanZ+gn56fpKqtrq+ura2srJl1cGlrY2FeXVVOU0tSREQ4TktHQTo4NTI2OTY1NDczNzc3ODk3OTo7PT0+ODg4NzU6OTk1OD9AQEFEPkZBQkNAQkNCQT88QEJCQD0+OjpERj5cpqWmpqampqanqKenqKioqKenqaurrKytra2ttLS0tbekc311bnONf3JmanFjaW1jaGZobG51aV9jZ3VzdnpuZ3Bwcn56cYihu7m5ubm6urq6urm2s7a1uLm2trW1tra1tbW1tbW3tra3tra2tbW2tbW1tbS0tLa2t7e3tbS0s7O0tLW1tLS0tbW1tra2tra2t7e3uLe3tra2trW2tbW2tra2tra2tra3tra3uLi3uri4uLi3uLi5ubm5urq6urm4t7e3t7W1tLS0s7OysrKxsbCwr66urq6urq+vra2srKuppaSmpqScmZubmpmampmXl5eXl5aZm5iZmJmZm52en5+dnJ6gpKWko6OioqKQdG5jcGFeXltUU1RIVEo/PFFCRkM7ODYzNzo1NTQ4Mzg5OTc4OTc7OTs9Ozc6NzU2OTk4NTg+Pz9ART5CPz9DPzxBQUI/PT9EQT8+PTk9Q0Y/VaSlpqanqKeoqamop6ioqKioqKiqrKuqqaipq7W1tba5o3eKcXKHhnd0cGh5a2JjYWVsaW5zal9jZWNjZWprYmRqbHaXjX6ovbm3tre5u7u6uLWxrKurqq6wrKyrq62tq6uvsLGvr7CytbW2t7W1trW1tbW1tbW2trSvr7O0tLSvra6vsrW0tbW1tbW2t7e3t7e3t7e3t7e3t7Owsra1tLa2tre3tra2tbW1tra3t7e5uLi4t7e3uLi4ubq6urq5uLi3t7e1tbS0tLS0tLS0s7OysbCvr6+vr66vr62oo6KgnJqampqZmZqbm5qampqbmpmZmZiXl5aYmZmZmpycnZ+foJ+goKChoaCgoJ+fi3RuaXRdYGZeUlRLRFRJPUVTSEVCOzo0NDY5NDQ1NzM4ODg3ODk5Ojs7Pz04OjkzNTg5NjM5PT5AP0A6QEJCQkA/QEJCPz0+QUFCPz06PkVDQFGjpqWlp6inqauqqKaoqKipp6ioqKinp6ioqaq1tbe3t7KZtH99kIx1Z2lqbGZjYGNoZW94cGlicXx5cGpmZmRma3NqhYystrKwra2ttLeysLCtrKuqqaiop6ipqampqKinqKipqaeoqqurra2sqqytraysrq6traunpaSnqqyopKOkpamwsbGztbW2t7i3t7W1tre4t7e3t7Kppaasq6ivtLa1s7W3t7a1tbW2tra3t7e3t7a2t7e3t7m6urq5uLi3t7Wxs7S0tLKxsK6sq6yurrCxsK2rqqmqqKijnJqZmJmYmJiYmZmZmZmZmpqZm5ubnJybmZeYmpqcnJydnJ2foKGhoqKioKGgoKCfnop1amtuWVxhVktPREdVRz5PV0hEPTw4MzQ0ODQ1NDgyODk4ODk6Ojw5OUA8Njk6MzY3OTE0PD8/QEBBOkNGRUJBREJDQTo7P0FCQz9APUBEQ0BPo6empaemqKqqqqakpqenqKioqKimpqaoq6uttba3t7e4rbJ1cHuDdmBiaWtiZWZhZGdmfYh5bHKAfXFvcXhjbW5xZo+srKurq6ysra6urK2trKyqp6WmpaWlpqioqKiopaeoqKioqKeoqampp6Wko6KioqOioKKioaKhoKChoaKjpKOjpaWlqLC0s7OzsKuqqaqztLa3trGopaOioaGipKiqqairs7Sxrq6xs7W2tra3uLi3t7e3t7e3t7a2uLe0sa6ppqerrKmnpqWkpKSkpKWnqaajoJ+enZycm5uampmZmJeXmZmZmJiZmpqampqampqbm5mYmpydnZ2dnZucoKGgoaOjoqCgoKCfnp2FdGtsaFdYU0pHTUVITUdAU1dGRz09OTM2Mzc0NTU3Mzg6Ojo6OTw9OjpBPDY9ODM3ODgzNztAPz9AQDpCRUNAQkRDQT87PEBDQkNBQDxBQ0A9TqKnpqanp6mqq6mkpaWlpaaoqKippqanqKmpqrW2tre3t7izc2h7c2JnamtpaWJhZGloXV1tfHJma3J/fHR8bm1zc36gqamrq6uqq62trKusq6mpqKWjpKWmpqWmp6eqqaamp6enqKinp6iop6WjpKKhoaGhn56en5+fn56foKGho6Wko6OkpKSmp6enpqWkpaampqeqraumpKKhoaChpKWlpaenpaeoqKalpaivtLa3trW1tra1tbOwrKupqa6rqKWlpqampaSkpaWlpqWkpKSkpaKhoaGgnp2bm5ucm5qamZiXmJiYmJiZmpmZmZmYmZmZmZqZmZydnJycnJybnJ+fn6ChoaKgoKCfnZ2cgXNrbmReU0pITUZETEtFRFFTQ0c9PDgzNjI4NDY0NjQ4OTg6Ozk7Pjw5PTs5PTczNTk2NTY8QD0/QD88P0JDPkJCQj89Pj5CQ0FFQD86PkVAO0+jpqWkpqeoqaelpKWlpKWnp6eoqKanp6alpqa1tba2trW2uYptcW1vfHxxZ2pmYGFsYFROW2hqbm9tgYJ9cWdxdn6aqKeoqqmpqqurrKqqqqimpaWkoqOlpqalpaWmqaqppqWjpKWmpqSjo6KioqKhoJ+fnp6cnJycnJ2dnJ2en6CioaKjo6KhoqKkpaSioqOjpKSjpKSko6Ggn6GipKanp6ipqaelpaSipKSlqK2wsKyrqqusqqmnpaWmpaWlpaalpqioqailpaWkpKSlpKOjpKOioaGhoqKgnp2cnJubm5qZmJiYmJmam5mXl5eWlpeXmJiZmpqcm5qampubm5ucnJ6goKGgnp6enpycm356bnJiXlNNSlBFRk5NQkBPRT5JOz01MzYzODM2Njc1Ojs4OTs5Oj49Ozo5OT03NjY5NjU2PkI+PkE/PT5DQT5DQ0BAO0BAQkJCRUA+Oz5FPzxQoKSjpKOjo6SkoqSlpaSlpqamp6empqalpqaltLW1tbS0tbiBaHx9ZXOCemxwdWFfY1ROT1FbaGxpbGxxbW5xbnScoqSnqKioqauqqqqqqaempaSjo6OjpKSlpqalp6ytqaShnp2eo6Shnp6foKCenJ6dnJycmpqam5ucnJubm5ydnp6foKChoJ+goaOioKGjpKSjoqSlpaWkop+go6SkpKapqainpaGdnJ+jpaipqainqKioqaempaWkpKSlpqampqampqenpaWko6Ojo6KioqGhoqKhoqOkop+enZ2cmpubmpqZmJeXmJaWlZSUlJWVl5iYmpubnJuampqam5ucm5ucnp+fnpucnJyam5p/fnF0YFtUTUdNSEZMSj8/TkM8QDs8NDM4Mzc0NzY3ODs9ODo6OTk7PTs7ODk9Nzc4OTU4OD9APT9BPjs9RD89REA/PzpAQUE/QUVAPjw8Qz88Tp2ioaKioKCipaSkpKWlpqenp6empqampaampbW1tbS0tLS3jHalsXdmc3Jvc2xjZGlYT1JRT09dgG1kYFptkZGSoqKjpaampqenqKiop6alpaSjoqGhoaKjpaempqesrKemoJ2cm6Ghnpuamp2cmZiam5qampmZmZubm5uampqampucnZ6goaCfnp+hoJ6foqOko6Omp6inqKWioKGhoaGkpaWlpKCcmZmbnqOmpqampqanpqempaOlpKWlpqiop6enpaWlpaWkpKOjo6KhoqKioqKhoaKjo6Kgn56enZybnJubmZaUlJSTk5OTk5SUlJWWl5qam5ubm5qZmZqanJ2dnZ2dnZuampqamZqXf3dvc11aTkhKTkdFRklERU5APD09PDQ1OzQ2NDY1Njc5Ozg5OTg5OTw7PDc6Ozc4ODg1ODg/Qj9BQTw+P0A8PEJAQT49QT4/Pz1CQUA6OkA8PE+doqGfoJ+dn6OkpKSlpqeoqKenp6ampqampqW1tLS0tLS0tbSXtqd1Znh2Y2xjY2VjW1JTU1JNXqCMeFhodpajnp6hoaOjo6OjpKSlpqalpKSioaGko6OjoqOlpqWmpqenpp+bmpuioJmWlpWam5qXl5iZmpqYmJqampqbm5qZmZmenZ2goqOjo6KkpKWinqGhoaKjpaampaSjoaCgn5+hoZ+goJ2amJeZmpygpKOjpKWmp6alpaOjpKSkpKWnp6ampqampaWmpKOjo6SjoqKjpKGfoKGhoKGgoaCfn56dnZyamJeVk5KSkpKSkpOTkpOUlZaZmpqbm5qampqbnZ6enp2cnJybm5qamZmZlH10bHReWk9IRUdGQkVORT9GOzo+Pzs0Njo2OTM2NDY4ODo4OTc4ODo8Ozw5Ozs6OjY3ODk5Pj9APjw9QD5AOjlAQT89QT8/QUE+QUE/Ojk9PjpQnaCfnZucnJufoqOlpaWlp6iop6ampqanpqantLS0tLOysrGwsK2rkHiGj36bmn93Yl1TUlFRTGKgootaiKCgn52YmZycnZ2eoaGgpKenpqWkoqGjp6alpaKipaampaanpqagm5mboaCXk5OSl5qcmpeXl5ibmpmampqam5qYmJmaoKCgoKGfoaKipKamop6gn5+goaOko6Khn56enpyanZuZmpqZmJeZnqChoaKioqKkpaWmpKSkpKKioqKkpaWlpaWlpaalpaOko6KioqGgoKGgnp+fn5+fnp+foJ+cm5qZl5WUlJSTkZCRkpKSkpKSk5SVl5iZmpmZmpqam5+fnp2cnJycmpmZmpiXl5F8cmdxXl1QRj9BRD9KT0JCRjhDRT4+OTg7Nzc0ODQ1OTo6Ozk3OTo8Ozo8PT48PDo2NzY5OD4/QT47Pz49PDg6PkFAQUE/P0FCQERBPjo4PkE8U5ycm5uampycnaGio6KjoqSmp6alpqampqSjo7KysK2rp6amp6alpqiln6iop6qnoXmEXFFST0xcnKCAYpmgnp2clZOVlpeZmp2dnqGmpqampKOioqanp6ajpaampaWmp6amop2cnqGfl5GRkJSXmp2YlpeWmJuZmpqampqZl5iam6Ghn56fnpybnJ6goJ6dn56fn6Cio6SjoqCfnp2ZlpeXl5iYmZubnqKioqKioqGio6WlpKOio6SioaGhoqOkpKSko6SkpKSioqKhoqGgn5+gnp2enp2dnZ2dnp6em5mYl5WTk5SUk5KQj5GSkZKSkZKTlJaXl5iYmZqampyenZ2dnJubmpiYmpmXlZaOe2pmamBiTkY+P0A9SkVAQ0A7QEE8Ozs5Ojc2NTg0Njc4OT04ODs6Oz87Ojs8Ojk6Nzc2ODs8Oz08Ojs8PTw3Oz5DQkRDPz1BQ0FEQT88OkBCO1eZmJqamZmam5ucnp2foqKhoqSlpKSlpqSioJ6op6alpqWlpaemp6ampqakpaanqKehqXJOUU1KVJahenKanJyenJeVlJWWmJiXl5qeoqKhoqOkpKOjpaalpaanpqSlpqalpaOgoKGhn5mSkI+WmpmenJaXl5eZm5ycnJqamZeZm5uen52cnZyZmZqcnZydnp6fn5+hoaCgoaKgn56bl5WVlZeanZ6fn6GhoqKio6OhoaCgoJ2cnaGioqOkpKOioaSlpKOko6SjoqKioqKhoKGfn52cnZ2cnJ2dnJ2enpqXlpaVlJOTkpKSkpCRkpKSkpGSlJWWl5iYmJiam5ycnJycnJ2cm5mYmZiWlJWXi3hsY2RiZFFHQT1DO0tIRDo7Ozw+OTo6OTo3Mzc5NTo4ODg8OTg7OT09Ozo7Ojk8PDc2NDc/PDo9Ozw/Pjw7ODxBQ0FDQkI+P0NAQkFAOj9APztZmZiampqam5ubm5ydoKGhoaGhoqKioqKhn5+dpKWmpqenpaWmp6ampqWkpKalpKSkpaaGUFJQT0+PmHB6mpubnJ6cnJycm5ubmZiYm56dnp6foKOkoqGhoqKio6SkpaalpKOjoaGhnpyalZOUmJuam56amJiYmJqcnpyam5iWmZybnJycnJydmpqbnJ2dnp6dnp6fn52cnJyhoaCblpWVlZacoKGgn5+hoKKjoqOhnZuZlpaWlpicnqCip6ikoaCgoqOjoqKioKCgoJ+fn5+gnp2cm5ucnZydnJmanJuWk5KSkpKUk5KSkpKSkpOSkpKRkpSVlpeYmJiYmZqcm5qbm5ucnJqZmJiXlZWWl4d3ZGdoZGJNQ0U8RDlJSkU5Ojs9PTo6ODg6NjQ3OTU8OTY4OTc5PDs7PDo6PDs6PDw4Nzg3Pj07Pj46Qj86Ojo/QURCQ0FBQD9EQUFAPjpAPj06W5qYmZqbmpubm5uen6CgoaKioKCgn5+enp2dnKWkpaanpqWlpqakoqKio6Oko6Kjo6KnllRYVVJOZ21rgZ6am5udn6Cgn56enp6dnJ2dnJ6enp+goaCfn6CgoKGio6Ojo6OkoqGgnpuZmZiZmZmZmZienpiYmZmam5qWlZeWlZicnJ2cm52dnpybnJ2cnZ6bmJqeoaGdm5udoKKhmpWVlpaZoKKgnZueoKGjop+em5eXlJKSlJeYmZ2goqenpaGgn56goaGioaCfnp2cnJubnJubmpqZmpydnJmXmZaVk5GQkJCPkZKSkpKSkZKTk5OTk5OTlJWWlpeXl5manJubnJucnJqamZeXlpaVlZSEcmZsYmRbREJMPT84RktCPEA+Pj05Ozk6PTg1ODg2Ozg1Njo4PDw7Ozw8Ozk8Oj09OTU4Nzw5PD87OkE/Ojo6QEBDQkRBQ0A/Q0FAPj08QD09Ol+al5mamJeYmpycn5+foaGhoJ+fn56foKCenZ2lpKSko6OioqOjoZ+foaGipKOio6SiradXXl1UV19ua42dmpqbnJ6dm5ucnZ+enZycnJydnZ+goKChoaGgoKGgoKGioaGhoZ+enJuampqbnJqZmpuZnJ6ZlpaWl5eTjo6QlJabnJuam5udn52cnJycnJ6dlpSZnJ+in5ycnZ+hoJuXl5mZmpycnJubnZ6fnZqXlpaWlJOTlJiampqfoKGmpqWgn56fnqChoaCenJubnJybm5ybm5qZmJmZmZmXl5iVlJKQkJCQj5CSkpKSkZGTk5aYl5STkpSVlJWWlZaZmZmam52cnJyampmXlpaWlpaQgG9vZV5gV0BKSDg/N0lFP0VBPD07Ojo8Ozs3NTs4Njs3NDY6Oj47Oj0+Pj07Ozs+Ozo4Ojk5NkBBPTo8PTo6OT9BQ0JERUM+P0FBPz8+Pj89PDtgl5WXl5aVl5mbnqGhoKGioqCenp6enqCgn52bpaWkpKSioKCfoJ+dnZ+hoqOjo6OkobCjXWVkYGFua4GenJubm5ubmZianJ2enJubm5ycnJ6ipKGeoKGhoqKhoKCgoaGgn5+enJqZmpubm5ybmp2dm5manJiXlZWWkY6Nj5KYnZycm5ycnqCdnJucnJyempWVm56foZ+dnJyenp2cmpqampqampqbm5qXl5aTkpWVlpWTlZaam5qanZ6foqWjnp6fn5+en5+enZ6fnZycm5qcmpqbmpiZmJiYmJiYlZSTkZCRkJCQkZKTk5CRk5SYmZiVk5SVlZWWlZaXmZmXmZqenpyamJiXl5aWl5eYjX1ubV9lVlRFSzw3PjdSRUM+QkE4Ozw7OTg6ODY7Nzc6Njc5Oj0+Ojw8PT49PD06Pz06ODw9OTtAPj4/PT45ODs/QkNAQ0VDPT9DQj5AQD5APTw8YZWSlJWWlpeanJ6goKCgoaCgnp6enp6gn56em6WlpKSioJ+fnp2dm5mbnJydnp+gn56rmGNpbW5pZm2enZybm5ybmpmZmZqam5ucm5uam5ygo6SgnZ6en6CgoKCgn6ChoKCfnpuamZqam5qbm5ufnpyZmJqamJiYmJKOj5OXnJ2bnJ2cnJycnZycnp6dnpqVl5ygoaGfnp2eoJ+cnJuampqbmpqYmpmVk5OTkpOWl5eVlJiYmZucnJydoJ+gnp6enp+fn56en6KjpKKgnp6cm5qampuZmJmZmJeXlpWUlJORkZCQkZKTk5OSkpOUmJmYlpWUlZaWlpaWl5iYmJiXmZqamZeXl5aXlpeWl4l4dmddX1dURUU5OTs8WT5AOEI/OTw8Pjk4Ozg6Ozc5OjU4OTs9PDk9Oz0+PD0+Oz8/Ozk+PDw+Pz5AQUE9ODc7QkNFP0FFQz1AREJBQEQ7Oz47PGKWk5SUlpWUlpiYmZubnJycnZ2cnJ2en56dnJqkpKSkoJ+enpybm5qZmJiYmZucnZ6cpolla3R4bVuFop2dnJydnJqbmpqampydnZ2bmpuboKKinpucnZybnJ2enp2dnZ2fnpuampucnZybm5ycnp6cm5qanZqam5yVkZOXm52dnJ2fnZycnJycnZ6fnp+cl5idn6GhoJ6cn6CfnJubm5qbmpmZmZmZl5WWlZaYl5eXlpaYmZuenp2dn6GhoJ+fnp6fn5+dn5+hoqKhoZ+fn5yZm5qcnZuampmXlpaYl5eXlpWTkpGTlJSTlJSUlJaZmJaVlZeZmJeYl5eXl5eYl5iXl5eXlpaYl5eVl5eDeHZfW11eUT1GOjk4P1VDQTtDQzo8Pz86Ojk3Ozg4ODc0ODk8Ozw4Ozs8PTo9Pjo/QT06PTw+PkA/PUBBPjk2PERDRUBBRUU9PkVERD9COzo8OTpkl5SVlZaUlJSUlJWXmJiamZqcnJydnp6dnZybo6Oko6CenJuamZqZmJiYmZiam5ubm6WJa3F2em9lmp+enp2dnJybnZ6dnJ2enp2dnJydm5ygoJuampubmpudnJqampucnJuamZycnJ2dnZ2dnZ2dnpybmp+fm5ydm5mZmZudnZ2dn52dn5+dnJydn5+fn5uanZ+goJ+dnJ6gnpubm5ubm5yampuamZudnJqZmJeYmJiYmp2foKCgoJ+hoaGgoJ+en5+fnp6foaKhoJ+enp+enJqam5ubmpqZlpaXmZmYmJiWlJOUlJWVk5OVlZSVlpWVlZSYmZuamZaWl5WWmJiWl5OUlJGRk4yRkJOWfXhqYWJiXFA8QDw2OENWSERCOjg7Oj47Nzc5Nj06OTk2NDc6Ozw9OTo6Oz87PT08QD47Oz46PT89PkBBP0A8NztBQ0U/P0REPj9EREM+Qj07PDs6Z5aTk5OTk5OTlJSVlpeWl5aWl5mbm5ybm5uamaOjoqCfnpuamJeYl5eXmJmYmZybm5qkgGpqb3lzcZegnp2dnJydnp6enp+enp2cnJydnp2bnJuampqam5ubmZiYmpqamZmZmZqdm5ydnZ2dnJ2cnZ2cm5qdn5ucnJubnJubnZ2dnJydnp2enZydnZ2cnJ2dm5uenp6dnZybnpubnJycnJydnJubmpmbmpmYmZmYmpmZmpyfn5+jpaKfoaKioaGfnqCgn5+fnqCioaGhn5+fn52ZmpudnZqZmJWWl5aVlZaTkpOUk5STkJCSk5GUkY+OkJGOlZabmJWYlJmXlJiRjJCPk5yTkoyFjIeDhndxZ2pkW1xRQT44NkJHYEJFR0A+Ozw7Ojg4NjU8ODo4MzQ6Njk9PTk5Ojs9Ozw6PD48Oj5AOj5APjw/QD8+PDg6Q0FEPz5CRD8+Q0VCPUJAPDw8OmeYk5KSk5OSk5SVlJWXl5aWlZaXmZmZmpqampqkoqCfn52bmpmYmJiXl5iZmJmcnZ2cqH1nZXN7enOJop+enp2dnp6enZ2enZ6enp2dnZ6cm5ybmpubm5ucm5iYmJmZmJiZmZibnZycnZ6enp6enp6dnZybm52bnJybnJ2dnZ2dnJ2dnp+fn52cnZ2dm5qbnJmZnJ2dnZ2dm5uanJ2dnJycnp2dnZybmZeVlZeXmJqam5ubnZ6foqOhoKGhnJucm5ubnZqcmZycn6CfnZiZmZmUkpKUl5SPj4+OkYyNiYuQi4mLjpGRj4mQmJiQkoyNi5KQj5iYoqiqpqWlrKOmoZqep6eyqKKVo6Cfl39wcWlsXFtcTUY8NzdHR1g+SE5URjk+Ojg5ODc1PTk4NzMzOTY6Pjw6Nzo8Ozo6Ojo8PDs/PjtAQD47PT5BPDw2N0A+QkA+QUY+PEFEQT1DQj49PDlmmJSTk5OTkpOUlZOVl5iYmJaXl5iZmZqampqaoqGfnp2cm5mYmJiYmJiYmZmZm5ybnKx/am16f3lxh6Genp2cnZ6enp6enp6dnp2dnZ6enJubnJubm5ubm5uZmJiYmJiYmJmZnJ2dnJyenp6enp+fnp6dnp6dnJydnJ2dnZ6fnZ2fn56goJ+enZ2dnZybnJ2em5qbm52enZ6dm5ubnJ2cnp2cnZqYl5SRjo+QkJGVmJSWlJiZmpudmJuYlY2Mjo6TkpKRj4mQjpGRjo+Ki42NjYiIi4+Lg42NkY+MkI2Qk5WVnJihoJySn6SipKmam5eanKOprb3Bwbq8uL26ucC8ubq3uru7tL2zwbV/bnVmZ1peWUxJRTo7TElTPFZSSUM6QTo7Ozc3NTo6OjgyNTY4Oz08OTk7Ozw5Nzo4Ojw6PT85PD8+PDw9QTs5NTg8O0A/QT9EPTxBQkA8REM9PT06YZOTkZCUlJOTk5OTlJeYlpeZmJmYmZqbmpqamp+gnp+fnJqZmpqampmYl5iZmZmZmZmphXB1e4B3b4mhnp6enp6fn56en56fn56dnp6fnp2dnJ2cm5ubm5ubmpiYmJiZmZiam52cnJ2dnp2dnp6goJ+enZ6hoJ6dnp2enZ6fn56en6CenZ6enJydnZ2cm5qYnJuVmJqamJiYmJmSjJCXlKCXk4+MjYqKiImMiJORh5CPjYqKkJCLjoqMi4+IiImJjpGOjYaFiYaKhoWLiI+SkJCNkJKXlpKamJ2TlJ6kpqaqq7Gsr6+rpquqsbm5tbS0rqyvtMDIxcXBvsbDxMTDurW+t7a0s7C2tb6qcHRyXGZfXl1JRj8/RUtMVklcTEQ/PUI6Qzk5Nzc7OTk3MTc5ODo+ODg6PDw7OTc5OTs9Oj4/OT5BPDs+PD46OTY5PDpBPkNBQT08QkBAPkJEPj8+OVyHhIOHi42KiYaFgYqMkZOVmJiHlZaWkpiampmenZ+gn52ampubm5ycm5iWmJmXl5ibqo56dXZ7f3mCoJ+fnp+goKCfn5+foKCfnp2dnp+enp2dnJqbm5ybm5uYmJiXl5iYm5ucnKGdnp6enpybm52dnZycoaGfnZ6dnZ2dnp2dnJiWlpaYlZWSlpmWk5GKjI+PjI+NkIuLj4+WiYiEi5GZjn2Fi42PjYyHioyQm4yRj4+Lio6TjIyNjIiSi4yFiYyPhouIh42KhYyEj4qXkJOYmpWbnKOqoaKknKKrsbe0ubWxs62vsrKlp7O6sbq6vLa3tsDDw729vLa/urq8wbW4wL60r66mqa+3mm58Z1tjWl1fSEU+QUtJU1hZXkFGOTk9OkY/Pzo3Ozs7NjM6Nzo5Pjg6Ojw9OTk4Ozk7PDo+PTtAQDs8QjxAOjg0Nzw7Qj9BQj4+O0NEREBDQz0+PjlhmZWLkYWNj5aSiHl9e3+Fi4OKgoqJhmuAeJCLlpqRnZ2UlJGTlpeampiWk42Sk5KQm5uIdndzcX1/cpGgnZubm5yenZ2eoKGgm5uWlpucmpybnJuYmZqYmJmampqWi5CUmZmYlZumlpucl5WSkY2SkZCUk5KXm5mYm5ePjpCLjo2Ch4uLi4qLiI2RjIeHhoqIiZGKh4yEhYqNi4qNhI+UkIyDkJOUmZWQi5OTkZWRlpWOj5GMlI2Oj4qIj4ePhoeJiYmNiomJioWNh46JmJKUmpuXmKChp6Cko5qqqbO2sbWwqKmiqK6tn6qvsK21ubi8wr/BxLixtbCutrOwuL68ury+urOzp7G3wpB1gGNiXlpXUk1IRkVQSVlXX1tDUDpCQz1HRj84Nzo6NzU1OTc8OTw5ODo9Pjo6Nzs7Pjs7PTs9P0E7Pz48Pzo4NDM3OkFBQEI+PjpDREM/QUM7PT45Z6mloqKZn6CippeUiI2CiIJ1h4iKiIp7e3Z7enmPeoiSfn18en6CkYWBgH1zfH99fISHfnRweHZzfHaBj4iIiYeIioyMkZicl4iOhIuNi4iNkI+Pi5GPi4yOj5CQjouEjJaLjIqRnIuOi4eMhYaBjYuGiop/iYqGiJiRiIOIg4KFfIuLjIaJi4iKkIyIi42PjI+Wh4mLio6NjY2Wk5OdnJyalpycm56bmpuYnZeTkZWWkJKRi4+LlpSMjYqDi4SEiYyQkIqOio2LipGJjZOTk5SVk5KcmZ6Xn6CfpaKvsamupKSfmKStpqa4t6ysu729wsPAv7+vpa2wsLS3uLO0uLa0ta6stK+4tLaBeXpjZmBeVlFRQUVMT0lcXl9UR0dCS0xCREA9ODg7OTU3Nzk3Ozc9PDk9Pj05Ozg6O0A8Oj06PkJBOD88Oj84NjQyOTtCQD9CPj04QEI/PkBEO0A+N2CloJqXnaGaoaCPl5efl5WCjaCfo6GdmpKOjIxycXBvdnFucG1ucHZub29waHBxcHR+c3FycXd7cnl2d3Jyd3Z6e3l8fXt/iIGEi3+PkYaNi4uGiouLiYaEgYaCgIKJkI6Wgox+jpKMiIWAh32AgZKQhoSEho2DhIyPj4+IjY+Hi4iRkJWRjpCKk5eOj5WYp6SfnZWYlpaln5udq6aqt7W4srGnr6qnpqGfmp2WkpWVkYqPjImTjZuVjYuLhoaJjJWQkJCLmZKVlZSbkJiTlIyNkYyWl5WilZ6mqauno6OqsJucpp+mq6G0vb6zs7+5u7u6uby9rqiusa6wuLyztLGxqrCpqLGxsqild3J0X2hhYFRWUUlKSFZNXl5eVExKRVFKRUdDPTo5OTc0ODY4Mzg4PTo9PD47OTs4Ojs/PDw+OT9DPzg7Ojg8Nzc2Mzc5RT4/Qz89N0BAQT0/RDw+PThUj4yGh4eUjJWZl5yWmZaNlZyWlZydoKCdmpiWeHFubXJ4cXFsbnJwa3FvcG1yc3t1dnd5fnVxeHZ0d3tybn98gX15eH1/eYOGg4WCg5CLkIuLi42Pi4mJhYKBfX9zfYaNmZuQhIx7jYqPinp9fYaOjYqGjZSSi5CXj5SXkpihlp6XlZunpp+goKawq6GjpbW0sqqmqq+isba5vcK7ucO+vLi9uLWxrLCspZuSk5mfm5SPk5WOmp2doJqfn5edo6qsoZ+em62hp6qwqaampJiRkZWUo6SirKSss7Szs6i3tru4sLKvra2yt7a6srW6s7e5u7i8urayr6yxsbKztLOxsa2us7Gzs6yhl3Zxc19jXlJRVE1PSUdYT1pcZFROR1VPRURKRD44Ojg3NTg4ODU5Nzo6PTw/Ojg8ODk5PTs9PTpCPj84Ozo5Ojk4NjI1N0I+P0RAQDY+P0I/PEM8PT46Tn98go6MjJOTl5eaj5SWjZaRkZSXk5qanqGdnHJvcnFxcXFxcG5zcW91dHJxdneAdXd8eYV+d3t8eX1/fICJiYmDfXp/h4GIiYGAgIGGiIKGi4aIhYSIiImEf4J/enx6iZWRkIKFaYaFi4qDhIWKj4yNkZmdlJSUoJqan6Ktsa2ppKWtr6ysrLWuvrmtrqm1sLexq7G2rK+9wsLAvrq8trKutraxtK66u7OurKepp6unoqmtoKmooq+wuLSxvLq6urK0ta+8tLezt7e7t7mtrbCprLW5sbeytLe2sLu7vLu6ury1vLi0wbWsqqqrtLG3uLm1trSzsKymrrCqq7Cxq6yusLKxtK6qo5N4dnJlZ1tMUlBFTUlTV1JlXmdUUExcUUhMUkNBOTk3OTU4ODY2Ozc5Ojs6Pjk4Ozo6Ojw8Pj08RD45Njs7ODg+OTUxNTZCRkREP0A3Pj5DPjpBP0BAO0t/gomXmJSdlpabmIuSlo6XkZGVl5SZl5+bmZx8dHV2dXl1c3RudnJzdHV2d319gX56gXyDfoJ/fYB/hIKFj52RiYF/go+Xjo6HgoCBiIuFfomQi3+HjYyLioeSioeGjZuWi5GIf1+GhYiMjouOiomQj46PlJSYkJWcmp2eqK6yr6+1tLOtsrW4sLy1tbGqsKqztbS7t7SztrS1r7i4t62noqassLCvtre3vrW5vLOysa61u7C0r6+yu7axuMC9tLS0s7izvLq2tLrAvbm6ubq+ubm5vrWysa+yr6q1tLGzsbSzrri4tb+vpKaoo6ussa+zrq6wsKytq6qroqKmqKKnrauqpaynoqeYeHlxZmVZT09NSVJNV0xPX15cTlVVYlFEVE07Pzk8ODk1Nzc1Nzk1Ojo6OTs4Ojw8Oj08Pj4/P0I9ODY6Ojk6QDs1MjY2QUZDQz4/Nz49Q0I5P0I/PjtLjpGTmJmVmZGTopiTkpKLk4uOkI+Vl5ablZSbhoJ9enh2dHRzdH53end2gIKDhouMhISFioaQiYeRk5aRjZaalY+IjI+emJaVkpCTl5qamZCdoJ2Tl5qgmZ2boqGVkJuskZObmHtZho+JkZGOko6LmJqPj4yUmpecnZugnaSstLm6vK+2tLi0tLK3uLmzq6+qqKy1srK1rrGrrqa3s7OxpaGotbCvrayrtbqyu7q6tLK3ur67ubG4sLmtqLK4u66ttLS3tbu2trm5vLe0r7G0t7a5s7e1pq2pq6ior6yprq2up6KxtLG0q6aop6Cjq66oqq6orLKwr6+pqKGeoaGjpqOgopqlo56ol3J3bmdiVUtUT09KQ1BLX2JYWlFcVGBNSFJJQUA5Ojg2Njc3NTg5NDs5Ozk8Nzs+Ojg8PD0/QkBBPTs2OTk5Oj87NjM3OD5GQkJAQjk+PUBDPkBGQj44R5OWkZWTkpSQkZ+ZnZmVkI+Sko6Mk5aWko6RlZGSkIaBeXJzdXuBhI6HhZGTkpicnJiVkJWYo5yaoaeqqZ+clpeVnaKioZyZnpmlqKyvramnqqmop6GlqKirqqmvoZqgrIqOoZ92WYOZjZiUmKCgoaSem5qlp6Spq6+spaOoq6+xtK6qrK6zr6ystLO0ua6urayqrLKwsK2wqKqmsrS0uK6qtrqwr6qurLC3s7i0t7W0u7y4tbWxtauyrKiys7uvrbGytLa1sbG0s7OvrKuvs7a0sayutKqqpqWnrauoqKupqqifqbOwqqeppaOio7CtqaatpairrayppaSioKWipaOYmZyVnqKippdudWVnZFdPWEtLSktTVHBiWWRXX1tcUlpQTEM8ODk6Njk4NzQ3NzQ4Ojw6PDg6PTk3PDw7PkM/QT47OTo5Ojs+PTg0NThBREVEQkM5PjtAPkI/R0Q+N0KSm5SVlZaVj46Wl5qZlZGKk5SSjo+SkYqKiY2Ul5qTjYmCho6VkZSfmpuin5+jnqGhn5ijpKelpaapqa2rqaKmpKilpKGfnqOjra2srairrq+qqqukoaKkqaemqaiipqSFhqejdFtzoJmdmJ+hoqmnoKKirqyrqqetr6ilpKmpqqmmo6iqqaekp66wr7Ovq7Crqq+yr7Czua+rqLCxrrCyubO0r62vtbCss7GurLW1tLSzs7CvrKyqrKusr7G0s7CwrrCwsKyqrauqq6alrrCysKumqbCvqaOkqaunqKaopquwq6mvqaaoqaalo6iwraqpqKKpo6WnpKGhoKKloZ2el5aYlJugpKmUbnNeamlfVVpOUk5QT1JkXGVjW11ZXFBZT0tAPDs5Ojc6ODczNTMzODo9OTo4OTo5Oj08PEBEPkA9OTo8PDw+Oz45NTo8QkFFQUNBOT47P0BEQENCQDdAkZ6YlJeZlpGHi5SSl5GIg4mLk4+OkI2Hh4SFlZmWmJeZlpqeop2anKKkoaCdn5qfoKGgpqGgoKCjo6KlqKmrramqpqOmpaCloKaop6WnqaepqKOnppmcpKaioaGhoaWcgoKhonJjZpmfnpafm5qioqChn6GiqKCcn6GloaCmo6KfpKGspp6foaGkrKqnrKivq6e0sa6ur7WyrKqwq6mtrbWwrq6srreup6yqpKivsq+sq7Kvqqqpq6utqa6urrGxraqtqaunp6uoqauinaapqKilqKisqKilpKWop6iopqmsr6+oq6mhoqKlo6Opq6ymqKWjqKKhoKSdnZ+hoZ2bnZ+amZWcnKOqlG9zZm5yZF1cUFVPV09eZGRsaGJiWlpSVE9NQTo9Ojo4Ozk1MTYzMjg4Ozk5OTk7OTk8Oz0/Qz5APTk7Ojs8QD0+PDk5PEFBRUFGQTo9Oz9BQUJBRUI4PYqWlJOYmpaPiISNjpGSjIiIiI+JiZCRjoqKiJubmZygpaKlnqKjoZqeoZyanZ6bnKOop6ugoKOYoJ2XnKGjo6WjoqKkrKilqaCepqmnrKmkn6Kgoqahpq6mpp2fn5+lkoB+nZ1xaF+NoqGbnJqcoJ6hn56eoKOZlpuYpKKipJ+ZnKGhoqCbmp6goaSgnaejqrGorqusqaSqqquorKalrKqws6+rq6mwq6appaWoq6ynpqevq6Wnq6upq6irqqqrrailqKOmpaesqayoopykoaOmo6qpqKano6SnqKanqKepqKupoaKoo5yepqWjqKino6WlpqmgpJ6inpeYnZ+doqKlnpiUlZ6go5d1d2t2eGJfXFVZUVVXW2Nec19oX2NTUVlUSD48PTg7OTo4NTM3MzM0Nzo4OT05Ozo5PDxBQEM9PT44Ozw9PEA/Qz86ODo+P0NAREE6Oz49QD9DQ0VDOTyCmJmenZ2alZKKiZGRl5GQh4SJgoGNj4+Sj42cnZ+hpKmlqaeorK2moqKfmKSmo6Stsa6yp6asm56em5qjp6Cfo5+foq+rq6yoqKuwqaiqqKGfoKeprbCyr6yjoqahrop8fqWeb2pchKSlop6doJ6fpaKinp+imJWem5+fpKGblZigoZ2enJudnZuZmZWen6Oonp2iqKGaoaOmoqSoqaqoq7CxqKWlp6eopKWpqaqnoqWmqKadnqWloqClpaOlpqCjpaOjpaelqamqpKekpqKmp6SrqaenpKGlqKynpqWlo6OopJWdo5+bnaCjqaeopqGjo6mooKiioJyVkZqfoKGmopuXkpCamqCVfHdvfXlmW1pgX1pcVlxoZG5jbmppYl5QUEA/Ozo4OTg8OzYzNDMzMzc5OTs8OTs7OT49QkBAPTs9ODw9QD08PENBPjo4PT9EP0M+Ojk/PEI/P0FEQjk6gJ6kp6Kem5+gmY+ZnaCWloqGj4iEi4qTl5SRo6Wnqq6trLOys7S4t62pqqevtLKxqq6usbKusa2lq7OssbGpq6+rq6y2sLSwq7GysaOfoqqpp663trS0trOvrKuuq7mDd32ypmxpWH6loqOanJyXoqiloZ+eo5udoZqWnaScm5aZoqefoJ+joJuUlpmWl5qfoJmVnqGZmJ2dpZ2gpKeqqaiqraylqaSlqqeqqaqsp6SkpKOimZmhnpqaoaCfpaWYnqSmpKqooqelpaGqp6mnp6ejqKWmpaGkqKesoqekoaalpaOVl52Ym5mVo6elpaSfnZ2lo6Kqo5+amZiXnJyaoaGakJOTl5ibjX93cnZ5amJbX15cYllgZG5ta25hX2RgUE9BQDs7OTs4Ojk2MTQzNjQ3Nzc6PTo8Ozk9PUI/Pj89PDo/OTo7PD5BRUA9OTtAQT5DPDs5PzlAQEBAQkM7OXuao6OcoJ2dop2Zn6KioJibmJaYkpSQm5qWl7S0rrW4s7S4tre0uLm3tbm4ub28uKqLnLK4vLS9urW7uru4s7q/uLe5u7G3r6iusq2inJ+qsri8vL27ur+0r7GztbS4enJxsK9nZlSBpZ6flpWal6SqpqahpKOkq6almaGko52goaKooaOgpaGck5mYmJmco56cmpudl5uZlqWam5+hqKmpqKuvr66pqKirrKytq6irp6WjoJyfo6Ojn6Cipammmpyip6Spn6GjoqKgpaanpqSooJ+ipKGjoqiop6OloaGopqalo5mbmJuTj6GknqKfmJiVoJuhpaCfm5udnJuamZugmo2YmZiTkYaAdnh4eGNbUllUX19hbWh1a3FoaWlhWVNMQDw6Ozg5Nzk3NTU2Mjg1Njc3Ojw7Ozs7QD4/QD0+Pjk6PDk2Nz47QkZCPDg7P0NDRDw+OT43PkFCP0ZDOzhwkpqblJ6bm52Vl52doqajopaXnpaXl6GblJi+t7G4uba3t7i7l5S2vbu9vcDFtaK7mKC3v7+6wcm0nbu2sra/xcGooLa0urGqrrSxsLG0tbW8vL68vL7Guri3ur20rnduZay3a2BSja2lpZ2XpKSnqKSupKurtbWvs6CnqqynqqmlpqCnoKGmoZOWmJ2foqSjnZ6coaChnZekmpmdoKaqqqqtrq2tsLGrrK2sqamrrqimpaalpqSkpqaeo6eppKGcoKKjpqCio5+jpJ2foqWgpJyboZ6fo6GhpaSlqaOkpaKkp6ehn52elpOcoJiZko+MjJeWn5uWnJqdnJqSlpSUmJOQmp2YiouHgIB8gnhhXllUYWlgZnNvc2l0ZGlkYltMSz46ODg5ODg5NzM0NTI1NDY2OTw8Oz08P0E/QEA9Pj44OTs4Njc/OUJFQzw7PD5DREM9QDs9Nz1DQ0BFQjw3Z4yRk4qalZiblZWYm6Knq6aVl5iQlZmhnpeXvrWztLu6ubi5woeYt6u4u8DCxbOjw6e4s72/tMTHvbS7uL62wMTErqCworW2tb2+wcPGwsO5vb/AwL2/xL28ur2+tql+dWmitnVgVpy1rq6qqqesp6ekr6eqtLyxtLWor7Gwr6yqoqajrJ+fpquXmqifpaWfoJydoKuwsKyiq5yYm6Cor7Kys6uorre1sq2tqaalqKulpaStqaShn6Cnnp6mqKmmnp+anqGlpqmcnaObl6KmmpuanZ+cmqGcmZ2eoKijn6GfnaWioKOioZSZmpmTj4qLhI2Qk5uPjpiVm5eYkJORkomNl5iYk4uKi32AgIVwYGFeXmtjYm53dXZubFtiUVZcTUc7PDk3OTc5Ojc0NDQxNDM3Njg8Ozs8PEBAPUA/Pj8+Ojo5Ojc6Pz5FRUU8PT1AQkJCQUE7PDhAQ0NARD87NV+MjIaFlouUlZeYl5ifpqellpWVkZebn5ual7mxtrO5vLy5urWqsryxvsG0vMe5uLuuv6fGw7/KxsnIxcXJvMLHx7+xsKe8vL7FxMbJx8XGu8TAxcbAua+9vMC+vremiX59laOEbWqqvKyvr7Spqqaqo62kp7G2q7WyrbOtqK6vp6awr7Ktqq+zpKu1qaeopKCgnqmyuL61tbWqqaausre4t7apq7i8ubexr66noqOop6SfqKOfnqCZoZydoqSnp6GelJuaoKGlnqChnpajnZSQlpiboZqflpORlpSin5qenJudoZ6kn56VnJiPkpOPjImTkJefiZCWkZuUmJGRlZaDjJWXlpKLjIh8f4N/amZoYWttZm51cXJ1cWdeX1xSSUU/Ojo6Nzg0ODw3NjU0MjMzNjU3PDo7PDs9QD4/QD48PTk5OTs6PDw+QkRFPj49QENDQkREOzo4QUJCQUNAOTJbk4iEjZGKi5GRlZCSmp2fnJOSmJSdnZqXmpW2sbm1tb6+tri1uLO8vMTEusPHwb+0s8XFxr/CzcfLzsvLx8HDxsfIysXExcO7vLzBxcHFxb/DwsbFwLGTvrq/w8mwloh7hoyRiXmAobiwn5qwrqykrbC0p6qpqKqtrKmmpZ6pr6uyu7q4u7e5t7O5uLOurLO0qrC1ub3Bur6+vL60urm4u7qysbS8u7q7s7Oyp6Smq6uioaCdmpudmpyXmpuenJygnZaclpuZnZ6io52UnJCNiY6OkZ6bnJWNh5KLmJiWmpybmJybnp6cmp6UjpiYmpSRmZeeoZWYmpKXlJWRlJqYk4+TnZaSi5F+enx/dGtsbmRvbWlxeG55aWlhXGdhUUZEQTw5OTc2NDQ6ODQ2NTMzMjY1Nj05OTs7PT47Pj49Oz05OTs7Oz89QUNBQkFAPEBDQ0NFQjs4OUQ/P0BCPzsyV5uQkZCQh4WSjo2IjZCTlZGPjZSUm5STlpqRs7e4uLi+u7C1sri2tbbAw8G+w8LAvru+u7u8xMzEzNDLxsa/xcfLyNTLysjGv7y7vsS+xcjGxsTExLm0wLe0u8XLnYJ4ZnaEhnxsfIamtqqZorewprC7tayupaSjqKSgoKWZqrSxvsG+urm6uLW0srG0tLO6wL7Av769u7u9vsDCt7a3tru7sru+ubi3u7a3tKyoqamrpqijnpOampyYkZKZl5GRmJqXnpiWk5acm5+elJOJiX6GiIuWlJiZkYmVkZeWlZmbmpaYl5idnpyhmJWZmZyYl5ybn56jnJ6WmJeTl5yZmZyUlp2UlpOJdnl6e3Zua2lndVpmcnhzeWZmXWRbUlhJRj87Nzg4NzYxNjk3NDQzMzM2NDY7ODo8Oz08OD0+PDo7PDs9Ozs+PkRBQURCQEBBQkNDREM9OTlCQD8/QD89MkyWmpaSk4yKmJCKi4yOkpKKiIaNkJiKj5CUl7O7tba/vb2xtrjBvby0uL/Bsbi3vsHFvbu8wsbJv8jOyMHEwcfKysbKxczIzcbJxb/DwMvNz8rHxMPEwsS+uL3KvYluYVNifX5pVWdwjbOqnaa0s6yywLWzrKmjoa2prKatn6y1tL/Cvrm4vbawrausr7W0ur7Fv7u8urO5u7i5ubWtsLS9u7G/vLiytrmzubu0ra2orKyqqaeXnpualY2MmJSTi5WWlJyZl5WWmZKYn5mQiop+iYqKkY6Vl5OUn5mWkJSZmJmWmJOUm6GeoZiYmp2ZmZaenpibopqdnJuYmpuZlpeXlpyZlJyYfoB4eXV1ZWZpamhda29ueHdjYmBgXlhXRkU4Ojg6OTc5NDQ5NzY2NTEyMzM0Ozo9Pzs9PTo6PTs8Pjo7Pz48QkBDQkJFQj0/Q0NDQ0RFQDk6QkFBQj5CQTVCkJeUlZmSj5qQjpKRjZSVi4qHjI2UiImPkpq2u7S8xsHEwr3BxcLAtLO9v6ywr7rDysPCvs3IxbfByMW/wcLIy8rCwsTJzM7Pz8zDx8bIycjHys7KycfIx7/Gy6R5Xk5IVHd1XkRZYnmnt8C+vrmsucG6vKytpqq7urm3wLK1uLLAxrq3t8Gzsa2tqau1s7u2w7a2vbWxt762s7e4sLW2v7uwvbq0q7CxsbO8urOzrqutq62xnaOjoJqQjpiXlZCclpaYlpWSnJmTm5+clpGUjpWQiYyQlZOUm56YmZKSnJedlJmSk5aZmJ2VnJ6do5yVnZ+TnKKcnKCfnaOemJSVl5ebmpmgkH99cXRxb2NhZ3Zoaml0bXhsXWRbVmBZTEhDNjw5OTg4OjUzOjY2NDQxMzUyNTs6PD47Ozw9PDs8PTw7PD49P0E/RUFCQ0M+QEFARUVERUE7Nz5DQkI+Q0I4O4+akZaalJKUjZCUlI6VlI6Pi4yJk4uIkJObt8C6xsXEw8zCwcS9vrWvt7uvr7O6wMfFxMHMy8W2ucDCwsTHytHLwsPExsnFzNDOx8zJwsLHwczV183Lys7FybyKa1BFP05waFg9TlxslcTMxsawmbrEu760sLCwwb6+wca/vri2w8K6urbAvrWyrKmvsri+tMC0tLi0t7nEua+8vrm+v8K/tbq2q6qsrq+wt768trSura2utaSlqKimmpycnZyeopydmZOQkp2VmKCdmJiVmZmZl46MlH2QkJefmZmYk5GToI6Nko+VjpCUlaKdnKSem56elpyjoKGipKOkop6amZubnJ2enIN9cnx4cGdgamp2bGlldW50Yl1iVFdVU01HOjc7OTk3Nzo3NDg3ODQ1MjM0MjU7Ojk+Oj08Pz04Oz05OTk9PEBBQEVCQUJBQT9AP0RFREVAPDk+QkNCQENBOjSAoZeUmZiVkImUk5aTiZGMlJGOiJaKi5CXnMXLw8O8wMPHwbm9vbu4tre3rrK3uLzAwsDCx8bHurzAwsTHyMbSycHDxL+/vsTLyMrLyby8yMbJ1dvVzcnJxcmndlpMV0VKaF1WPUlWY3u80MawkIm5wru6vbWzs7+/ub/DucC3u8G8uri7ub27srCvsKy5wri9ube1t7q9xb24xsjCwcLGwr28tamurrCwr7O6t7m2sK+tr7OppquprqannqSlo6OjoqCblZiekZecl5GRlZeZlZmRlJiSlYyYo5qcnp2FiZ+TfJKWlZKUlJennaCipJ+en56foaGkoqKjoaOinJ2fnqOhppl5enl/cnBmZWZjamRiam1ub15ZXFZWTlBKRjk5Ozk3Njc3NjM3ODk1NjEzNTI3PDs8QDs/PDw6ODo8OTk4Pj1APz9GP0JBQz89QT5ARENDQTw5PENBQ0RBQDozbKKdlZedlo+PmJiZmIiSjZGVkI+Vjo6TlpbKy7u5urnBu7q3vsG8vLu5sa61uri4u8S6vsC+vru8wMXBxsK+xsK5u8O6uLm8vsHHwca7ucjJw8vZ08jDwsHGomlMYpVqSGFWWEFNVV5pr9a9k3aFvLq7u763tLC5vrO8vrG5tbi7tryztbm2uba5t7GtusG6vMG/t77Ev8bDw8fHwrvAwr/Cv7iys7O1tLGut7S3tbSxrK2xp6Wlp7CtqJ+nq6ajqKWmpqCgn5SYmZSRkZWUl5OYl5qhnZ6hnKGdoaWglpSbkZeXmJqTnpmZqaSlpKWdoqCanqCkoqOcoqGjoJ6cnp6ppaiVfXuDeG5mYWRiYWNkZGpjZ2NbWlpcWVFPRT07OTo7Nzc5OTY0OTk6NTMxNDUyNzo7OkA9Pzw8OTc3Ozo5Ojw+QD8+RDxCQURAPz49QkRCQkI+OjlCP0FCPT44NVmfnJiTmZaRlZiYmpeQkZCQk5GTlJKSkpSUxce4tbq5wrm5vMPFwri7ubGxtry6tbnAu7u5tri0tLW/u72/ub66urTAuLW3sq66u7fAt7zK0cG9z9O8tLy9va5sRoC+j0pgV1pEVF9bX6LGo3tok8O3u765tbe0uLy0vbi1tLCzvLG3tri/tr25vb65t7q+u7/Axb29y8PGw8TAw762ubq2v7i7v7y4trOyq7CwsrWzs66sq6emnqeurauiqKumpqqjp6iqo5+Ym52bmpicnJiXnJuhpZ2anqGhoKGmoJqbnJiboJ+dnJ+coKiho6SknaKfmqKgop+el6Shop+dmpieqKWhi3x5iH1xY2BiY2hqZ2dpZmldVlZUWU9TTEY4PzY7Ojc3OTs2NTo7PDYzMTM0MTc7OTg/PT47PDs3Njk5ODo7PUA/PkA9PT9CPjxAQUNDQT9DPTo2PEBBQDw9ODdJlJibj5OUkZWYlZGWkpWRkJGUlZSTk5OYlcHCwLq8ub62uL7EwMKxvbqytLO4vLW3vMC8vbS1sbC1t7W7wbi+ub+8vLe0t6+ut7W5v7vC1ou6v8LZuaGlr7S4d0mDq45MaGVjQlVzYFeRn4JsZajGv7zFuLa3tLi2tru7uLa0t7q1tLi8vbm/ucPAwLu5vLu+vcjEvcfEw7rAvb62sra4srm0usLCureysaysq62yr7Kur6ijpJ6rrKyqpKakpKiqoqemraihoaGmn6Oiop6bnKKfoKOdnJuhn6KgpKCem5eZn6GdnZ6eoaWkoaKioZ6ho5yinqCZnZijn52eoJqZoKKmnYR6g4F4cW1lZWZvaWVsaFhYTktLS1JJTEhDOT44PTs2Ojs5Njc8ODk4NjA0MzE3OTk7Pz0+Ojw6ODg5PDg6Ozs7PD1BPj09Q0E8P0NDREA/Pzw6Nz5CREE/QDg4P4mYmoyMkI+Tl5WMkpCakpGXmJaUlJKQmZTDvsbBwby8uLi6v7a8scK2tLyxtLa4s7q9v768sq2vrLGwt7y3u73BxLm3t7a1ubm6u7+80MRzqcu+3M2aj5aisIFNcX5wV394cU5WgWVVeHZrY27BxsW+xri1srK9uLi4vrq6uby6urS3u7q5v7zEwL+5uri/ubvFxr3Fw8Kyur27sa+2uLO3s7q+wLm2rLGrrqmqqa2qqq6mpKWnrq2ppaOio6GkpaWmoqato6Klo5+ho6Gcmpyhn6CloaCenZygnaWgnpeVmZ2fn52gn6KmpaCknpybn6Ofn5mcmZ2epJyWnKOcnqGcppZ+f4d8a25wZ3Brc2ZibWBcVElLSkRKQkNHPzo7OD48Nzs7OTc4Ozc8PDYyNzUxNjk8PD08QTs8Ojs6OT45Ojs9PUA+RD89PkRAPz9BRkQ/Pzw9OTc/QUNCQEI5Ojl3nJiLh4uQkpOWjY+TmpOQnZiSkY2PjpiSvbfHvsO+vbu+vL22uri9ure9s7OwuLi1uby8wLeqraSusLi7sr2+u8S2tbi1t8C+xLzCxNircH+8yNTesoSFj5l9VWNmVnKZgn5uVXRjWmNiYVyF0sfHxMe9tbW2wb27u7/CusDCv7y2t729vcHBwL+8ube8wru3v8W7wr++tbe8vK+vt7awtLO6ubq7r6mtq62rrKaqoqeuqKWqra2vp6Sgn6ajnqKjqKOjq6Oiop6dm5ublJaZnJyfpZ6fnpmYnpejoJyXmZqZmqOjop6jo6egpqCbnaCjnp2WoJmcoKCblJegn6WcmKKQgYaAcmZsaW50bnhjZ2JcY1FLVEhFRUNIQzw7OTg9Ojc6PTo4OTs3PD01MzY1MDY4OTo8O0A9PDo+PDk+OTk9Pjs/PkM8Pz5APz4/P0ZEQEE/Pjo3P0BDQz9APTo4ZqGYj4uNlZKVlY6PlpmVl5uVjoyMjY+bk7m2wbS/vLm8w8C+wLq1trKywLmvsry8sLe7tru8qqqjsLm9vLK8vrzFuLG4ub3HysrDx8nSlGxxrdHQ29SSdnx/dF5iXU6VpYOEiVRdXVxZWVhhqtLJx8XGwLm9vMS/v7/CyL3Hx8XFvLrEv7vBv7rAvLu7wMS9t7nCub69t7S2uLqur7WxsLCytre0t6yurKqsrKuoq6Gms6qlra+trKippaOkp5+io6Onoaeiop6cnZyamYyQlpeZnaKZnpuVkp2UoaCdmZ6fmJimpqKfoqKmoqeloqCko6GbnaCbnKKfl5WVnp6kmpafiYGDgXRvbGx0a2xuX2NeYGFOSU0/RUA/REM7Ozo6Ozo4Ozw6OTw+Ojo+NDQ1NTE5OTo5PDtAPD89PTw4PDs6PDs7Pz5DPkI+QD89Pz9FRUJBQj87Nj9CRUQ9QUE6OlmfmJOSlZqVmpOQlpeclZuZlpSVkZKTnZm2uLaxuru6vsG5uca7trWypb69tLbBv66zvbS4wbGwsbS7xtPDur68xL63vMC/ydDHyMrKwIJub6PLy8/guHNqa2dgYFdVqKGAg5JeWFlWUVVSecbLycPDw8O5w769ub+8wsbCyc7Hxr66xr26v7m3wLm5vsDCvrW0vLi2u7CvsrK1r7Cvrqyus7CzsrirsbKxqrCrq6yrrLatqKyusqarrKmpoaWgpaakrKSmoaChnqGgnaCMlJeTm5+mmZ6emZOYnZ+gnp2eopuYp62ooqSgoKKqpqmhqKGlm6CgnZ2jn5SYmKKdp6Gfm4J7eoh6bW13e19wY1teX19UST5DRUlCQz5DOz42OTo7Ozs7Ozs7PT05PTU2NjIxODo5Ozs6QTs/PDw+Nzs8Ozw9PTw9Pz5BQUE/P0FCQUVDQkRAPDY+Q0RFPkJEPztTmZuZmJ6dmqCalpyZn5KdlZ2boJWWlJqYur20sLu8wcTCv8XGura5sqO7vbS3xLuwtbq2ucS4tLy2u7mq28O+tr7Avr63opimr7PCwKN0cnSZxMfK1teGV1VRT1BFW5+ReYOJZ1pUT05PVpzJy8bCwMjAusK7urO6usG+wMrOysS9tby8ub+5ubW1s7/Avre0s7S4rbeqr7CwsrGvq6+nr7ausrG5rra2uLSzsLGttrS6sa6srranrLKsraSjoaenqLKrqqWkp6elpaCml5ujn6SmraKeo6KanaWiop+foaWenrC0sKSlnp+kqaevp6mgq6CiopqipJ2anqGmp6+psZWCe32Cem5zeHNncF1bXl1ZUkVEQ01JQUU9SDs7NTk7Ojw8Ojs7Oz0/Oj01NDUxMjc4ODs8O0I8Pz46OzY6PTo7Pj0/QD87QUFBPj4/QkBBQkJFPjo1OkFCST9AQkA7TJqdnZ6fnZienZmampySoJWbnp+blZGRl8W+urbDvMbCvr/Ixbe1uLe2ubu0r7e3srWzt7m8u7a7u8a1bKvNvLW5wLynemxnbmpyf5WWbXR3lb2/xsHVqFVCQD5COVqJfXF/f2lbU0xMTna3wMHCvr/HvLy/tLSutbW8vr/OzcvCt7K4uLi9ubuxtrLIwLu2tLGwt6yzqbCtrbS3r6uuqrG1r7Gvt7O6usC/tre2sru6wLWyrbO3rLC6r7KloqWrrK+5s7KosK+xr6qiqKGkraitrLOun6inpqWmq6Sknqaqo6ayuLOrpZyfp6anrquqpbClpaWbpKOYn6exrLW4sLKOhHl/fXZsdXtwbmlbX19aU1BBRkhHS0BEQ0g8PTY7OTk8Ozo6Ozo9Pzw9NTU2MTM2OTg8QT5AOz1AOzs5PD04Oj08QD46Oj49Pj09PkBCQkJBRD03NDU9REc9Q0I/PEWUnqCgoJyXmpiYlZmdmZ2fmp2bnJaRj5LDwMK9wrzEvLy7xbu3s7e2tru7s6CWtayvsbS0tLa4ucDOsXaAsry1tsGhhWlaX19MUltbbW5yfZ24t8K4vbtzRDU1OTRScmpqc3BkX1dMS1ygwLq5t7bBwrW/urWur62wvcC5z8rJw7GwtbS0vbq+ubq7ysO7uravsL2xuK+ys7C3vbaur66wt7CsrLK2vbzEwrq9t7bAv8G3tbC2srGzurGxr6err6u2v7e1qbqztbmxp6uop7ausrG1uaisrK+qr7CqqKessayytr20saykqKuoqKusq6i2qaaonqadmKOuvLG7wbSmiYF8gnpzdXZ3bnFgX2ZdW1RKPT8/RkY9RkNDOTo1Ozk5Pjw8Ojo8Pj4+Pjg4MzE1Nzg5Pj9BPzs6Pz08Oz09OTs8OTs6Nzs+PT1DQT8/QUJEQkE8ODU4PUNGPUREPzw/iZ2en52Xl5WUk5aZnpubmpuYlJ2Uio6Owb7Dwr6+vrm2usCxtbGzt7fCtbOrrbOoqa61r620trnCyqaEd4qhr7SYaGNmVVlgSkpNUFRqc4Sjr7e+ubO2nmg3MDUzRl1VXmRiYGJdT0x2tL+4sq6yvLquu7Szpquorbq+uMvCv76sq7Cvs7u3ub67wMXBu7y3sLXEtb+0uLu0u8PCs7a2sbisqaWrsr23v7+7u7exvL28trGvq6uprbOvsLCrsLSpuMC2sqm0tbC3tq2spqu7s660uMKwsbG1sbK1saywsri4ubi+tLGzrqyxramvrqqyuK6trainoZ6ptr+4ur+wlol9gHxxdHd0d3JsX2NiW15PSEI/PUhDRk1DQDc3NTs6OT48PDk4PT47PT86ODMyNTc2OD8/Qj86OD4+PTw5PDk7Ozo8Ozs6PEA+QkI9QEE/QkI/PDs3OjxBRD5CQz8+QYqgm6GdlJiVlZKYmpyWm5WalY2bj4SIhru0vb+7vLm3s7y8rLOytLS2wLXAr7Kzqqqxt62pubO3v8aniHt2jaGUXlNCWVRIYmxXUEZJY4ufqq+2urW0sq2UUDMxMUFQRlFXWFhgYFBcmLm6tK2lrLOwprCtqJ6gn6WttrXCt7a0pairqLC2s7K6tbu7u7W4trC1xLK+vL+8ubrFybq9vraxp6SeoamxrrW5trKxq7S3trGopp6gmaWmpKynq6y2qa+6sa2kpq2lq7GrrKmtuLawsrjBtrGxtbGvu7ayt7W1sry1urKwsbKutLKqrq2nuLWyta2uqqiosrq9wLa0qY6Ce393b3tvdXJtY11nWFxdUk5OQT5KQkFKSUA2NjU7Nzg+Ojs4Nz4+PDs/OjkzMjc1NzU8PD48PDg+Pjw8OTk5Ozs7Pjs7OTw+P0E9PEJAPz9CQD47Njc6QERBQ0E/QUKJoJ2loJSWmJiVnqCcl5uYmZGMmYmDhoS1r7S7u7S1sLG2uq6wtLOvtbq1urC1s7KttrqvrbyzuLi/s5CBeYiOa05KQGhYQk93g5ZsTEJXfrC0s7WytK+urXdMMDA/RTtFVldRWF1RfLCysaysnqSnp52jpp2WmZman6muuayrq5+lqKSrrq6nr6yvsbGtsa6usLmwtLy+uLm4x8W8vLu4qaKcmJufp6assq6zqaapqq6popqXl5GcmpijnqKir6ekrKaompqemqGnp6anqa+2squ0trCqsK+xqbm2sbWxrqy3s7avrquuq7S1ra+rq7GtsbKoraurs7W3ur2wq6GLeoJ5cnZzbXRpbF1balRdXFBNSERGTEJGTkY4NjY1OjU6Pjg7OTc8PTo7PTo5MjM2Nzc3Pjs9Pjo6Pz48PDw6Ojs5Oz47PTk8Pj1CPDtAP0A/QT8+OjU1OkBFQkRBQEJBiJ+ipqGYm56dmqWpmJudmpmUjJmHhoeGrq2uuLmxsqiur7iyq7CwqrK1ubm+tbK4tLm6trm7tbWzuLWVjYmEeVZGQVKIV0pKVnaMgGE/Vae4s7SysLGtsLmke0AtPlp7l6eiknNVWpWrrKujp6CdnZ6XmKGVkpWXkJifqK6ko6Sgoqeio6mpoaanpaqtp6ynqKesq6yyu7SztLm6trK2ramgmpaWm52fq6yqr6Oko6GpoJuTjo+Qk5KSmZaanaSloJ+ep5iVkpSZnqSjoaWqrK2iqaqppKmtrqW0sa6xraqprq+wraWmqqSos66trKmmpqmrpqqnq7Ksr7Oxq6mWgX+Bd3J4aHRzbmRVYWNXXFFOTEhASFFETUM9ODg3NTo3PD46Ozw4OTw7Ozw7ODI0ODk3ODs7PDs4PD0+Oz08Ojk8Ojs9PTw6OkA9PDw7QD5CQEE/Pjk1ODs8RkFDRD9BQYijpqKjnqCfp6Coqpufm5yZmI6Xi42PjKqpqLGvsK2lp6ayr6mmq6CvsLu1vby4wMG+vLy8ua6sr7K7qZiZlWhNQFZ6bk9JSUxmmn9XRVWvu7Gss6+urK21t6BmZ5Opp5+am56gf3ednqepn6GnlpuXl4+dk4+Qlo6Xm6SooKCioqKlpZ2jo6CepaCkrKSmqKSio6OrrLOuqa6urqeqraisoZyamJmYm6moq6ufpqObo5yVkIyPj5CTkJeVlpifnp6amaaXk4+Slp2ioKWipqSnoKKko6Ghq6uksq2qrKyno6yuraufoaKkpK+srKmmo6KqpKqqpKmrpqmsq6agiHiDfHZ/emN3bG5cUWhUUE5HUE1MQk9RQD47PjQ5OjU7OT07Ojk9OTk8Ozw8OzkzNjk5Njo7Pz06ODs6Pjw6PDs5Oz07PDw9PjxAPT88ODtAQEE/Pz45NDk8N0FDQkQ9QEOOqqSjoqGinaulpqimoZ6dmZ2PmJWTkJWnpKGmqKmlpKChp6uhnKKbp6u1sry9wMLCwL7AuLSnpKyovcGqpr1kRVWig1BZSUthSliJY2Zmgay1qrK0rqqqrrCtq7CnnI+WkY2WnqCgn5qjpJ+eqJSblpeMl5GNkJeTmJ2iqp+fn6Cjpaicn6ChnKKfo6innKehoKSfrKisrKCpq6agpKimrKOdnp2Zl5qrpqqxo6WonqCclZOQj5GQmJCWlZiXn5ibmZukmZeUlpqdoJ2nqKWgo6Kho56doKmqpa6upqipoaKqrqqnoaCio6msq6eppqShqaKlqaalpKKmpKijkn18gHV2fW1re2RoVVFjTUpIR09STUpORzxFQDwyQDg1OTs+Ozk5Ozg6PDs7Ozk5NDg7ODc7Oz48Ojk8Oj07Ozw9OTw8PD49PUE+QEJAPTc6P0FCQEA/ODU1PDpAQ0BEPkFGlq6koqWeo6KpqKipqqWmnp2imJiZmZWbop6bnqOioKOgoZqgmJeXlqGorK62t7q5ure3u66ooKGpoKzGwMqaTkJ3nW5Pb0tOYmZ1cmBfZnSNsK+us7WqpquqopyYkoyPlJWWl5qeoqGbnKSemqSXl5eWkJKRkZOal5ugpKqeoaGepqeqop+gp5+dn6SnqZ6jpp+qnaqtqq6nqLClo6Smp6ymoaShm5ier6iusqulqqqgmpiYmJWTlpqTlZWalpuXl5ihnpycl5uhmp6ao6eln6GioqOdm6Gmp6aoraOppZ6kp6mkpaWhpaSsrKmmq6eioKSjpKenoaCgpaKmoIl7gH13eHxkeXlgYlJVYEhJSktTVElSUEw5P0E2Nzw2NTs6PDw5Ozs4Ojw9Ojs4NjU3OjY5Pj0+PDk5PTk9PTw+PTs7PDo+PTw/Pz9APT03Oj5AQEA/Pzg2NT08PkFCRkBAR6CupKaroaOqrK6tp6ypqKCipp6bm56aoJyalZmfn5uen56WlJOXk5KcnqSorq2sq6uvqq+pnpeepZylxsaIV1JLZqJeaX5ydllSa2NdaWZlaou0sLC4rKagm52ZlJeZmI6NkJSQio2Nk5iinJejmZqXmJmUmZiWnZufpaapoKajnqeurqumorGjmqSmpqqioaqiqaSosquxsqu5qKarp6urqaysp6Cgo7GusrC0qrKuopmcnZ6hmZubmpiZm5SWm5aZnKWhoJqjoZqcmZ+kop6gn6KmnZulpqWkpaijp6OepqOinqaloqWlqKykpq2noJ2dn56gpaGenqWgppmBe4F8dnZzaIJsZVtTWlpNUUpPT1VMU0xBNz5DNzg9NzY6PDw9Ojw5ODo7PDo7OTc2Oj01OTw7QD03ODs3PTs9PT06Ozw4Pj09QD5BPj4+ODg8P0BAPT43NTg9Pj1BQEZAQUihqqCrq6GkqquwramtqaelpaWkoKGfnqWXl5SYmZ6YnJ2blo+VmZKRnJihnaqip6Cep6Gln5ySm6Kan6qjjXlVbHJ1dW1idXJYWWBfZGldYFhirK6sr6efnaGflpCTm5+amJaRkp6boaObnpuWn5qfl5uinqWhnqSfpKitraisqKSstLe2sKe0rKKtraOvpaSmoamorrWzsr23vrCssa6tqaq0sbCoq6iytbezuK2ytKSgnaWfrKGhoqCgmpiWlqCbm5ikoaCeo6GgnpqcpaCfnZyhqJ+fp6meoaOkoKagnqehn5ymo5+ipaOooKmrpZ+dnZudmqainpyjnqeQgYJ/fHh1and1XWxaUmBIUlVIRlVWSkJMRz1LSDhGPDc3Oz49PDo8OTg6Ojs6PDk2Njo8Nzs+PT8+OTc9OT47PEA8OkA6OkA/O0A+QUA9PDk3Oj5APzo+NzU4PT0/QUBEQEJGnKueqamipamprqimqqWmp6aoqqGlpKOmkpOVmJacmpqcmpWTmZuNk5+ZqJ2un6eenKGdnpqZkpiem6GhoKN+b4FuYGRXTVtSWEtLUVdRSVJPQ5esqqmkn56YkpKTmJeVlJSLh4qNlJ2cnZ2el56Zpp+gqKWxqqeuo6uttrC0srGutri9wLqttbSwt7CutKmmpKWsqbmztbvDvMPBtrq2q6+xube8r7OwtcG8t72zs7WirKKpqLKpq6inqJqZnpqqp6CZp6Cfn6enpaSfnaqiop6bn6igpKetmZ+jnp6nnqCmnpycoqGbo6KhnZympaWkn6KZnJukn6CboJyjiYWEfnZybWl2bWhtXFhcQ1dOSkdNR0NGTTw+TD40PDk2Oj0/PDs6Ojg4PDk6Ozs8NTQ6PDg5Pj4/Pjg4Pzk8Oz0/Oz1BPTo/PjxAPj8+Pz08Njs/QT07Pzg1ODw8QERCREFCQ5WqoKapo6mqqKmjoamgpqinrK6lqaWpqpSSl5mUmpqanJiYmZyamJmqoLGit6Swpp+enZ2XmJWZnpuco5+ciGFXX2ZgVk1PRTw+P0NDPj1CUXeoramqpZ+dnaKjnZ+dmZubk5KUk52dmJSFnZqgmqukq7KwubKysbKxur28vLm2uMO+v8K/trq7wMS5vbusr6exrbHCtrjCxsDIysDKv7C5ub25wr64s7vGxL3DvLezqbOtqrO1r7Ouqq+jnauntrGtorCmoaOvsa2wpKWvo6GgmqGnoaSqqpmdoJmao6CmqKGcnqKemaSenpiYo6OhpZ6mmZuipJ6fm5ubnIeGgXt0cmtrdHJxaFZcUUZUSERKUEk/RUE0Rkg5NTs+Njs8Pj08Ojo4OTw4OTs4Ojo4Ozw3Oz49Pj02OEA5Ozs9QDw9QDk3PD07Pj0+PUI+Pjc6QUA+PD45NTg9Oz1DQEFDQkGRqqGlqqelqqimn6KnnKasp7Gyq62jqayVkpWalJecoqGbnqCinJ+psqu7sr+rr6ylnqCgnJyYmp+gmp+fk3tgXmVfUEVFOkRARjw+OTZOfqqzp6OjoaCepaulnpeclJGZnZiUjIqGiIZ4bYigo6KrrLS8tsO+vrO7wcPCxcC/wsbGxcPIwsDFx83QyMvDsre1vrK+xbu+zM3FzMzM0se+v8DCvsfGwrfEysnDwca+urS6urW7t7C1sqq6sq67t7+7uqu4rauquLq0vK6uuaOmo56mpaKjqaaZm5+Ymp2nqqegoaGkmJSjlpSZkZydn6Sep5+en6KdmJmUmJSIhH16cWtjaG94a2VaW0ZLTEVEU01EQkU3Oj87NTQ5OTc5Pj87PDs7OD48Njo9OTw9OTw9Ojs9Pj4+NztBOj45PT45PT44Nzs6Ojs/Pz1CPj83OkFAPTw9ODY2PDo8QT9BQUE+kqugp66ooqulpKKipaGlqquwsq2upKmmlJWWmpaUm6SmnaGqp6KrrLy8v8PBsrK4p6Ghq6qhnJ6hoZ2cmXtyaWBVTkQ+Slx9cGJBPVyOrqygmZubnp6Zl5eXkoyOlpeTjo2Qi4KDgndycW1wj6atrrS5xbvNx8u/wszOzczHydHMzczHycXFzNHS1c7Tyb3Av8O7xsXIxdHTzdPQ09PMysLFxsbKyM6/yNHMx8bHxcG8w8G/v7+2vrOuv8DDw8fEx8Suv7iyuLzDwsK6vLy1rqenraigoqmlmpagmpmdqKupo6SknpePm4yQmYmVmJugn6OdnZeempOTi5WPhYB5dHNlYmdyb2ZeWllDTkxERVBJRENANTU1ODpCPTY4OkE+Ozs+PDk+PTc6PTk6PDg8PDw7Pz8+PD0+Qzw7OkA9Ojs6Ojg4ODk7QT48QD8+ODtBQTs7Pjc4Njo8PkI+Q0FAPpOvn6ivpqiro6KloKampKuoq62qrqKqo5Kcl5ebmJuirJ2frqalsarFxszOzb+wwaikqKytqqCdo56cnpVoZFtTSERAP0yKoamag6CyraOenJ+al5aUkpSWkZCPjIeDg4iHg4CBgYB5cXJvbHmktrq5vsvB09LTyM3O0dPR0tHQ0dHNzs7Qxc7U1djS183Gx8nMw8XKz8rT19LX0tXW09TIzMbMzcnSzc7TzcXIysrBxsvHycjGv8Ozs8jEy8vLz8fKv76/vcHHxMzMyMnAw7+tr7OonqKqo5qTnpyYnqaprKSlppaXipWFkZSHkpKSmZualpiQm5WQjIaRi4B6cnV2Z2NndmlkVldRRE1GQElRQj1CPDoyMkE8RTw3OTxCPTs9Pzs7Pj05Oj48Oz44Ojk5Oj86Pj1APkA8Pjs+Ozk9PTw5Njo6Pj08PEE/Pjk6QEE6OT44Ojo6Oz4+PEE/QT6QrKKiqaanqKSfop2qqKOso6OnpqyiqZ+To5iWn56dpK6bn7CrqKyxyc3U18/Gu8esrbO3rK6jnqOinaGbYlNLSURCP0RWs9K9srCmnJycoKShnZqUk5WUiX13cGtlYmhxb3F7hYqAdXBucXRwhbPDvsXR0NfW1tLWzdTW19TT0dPU1NPP0cPQ09bY1dbSy8nO0cvGzdLK0tXW2dbX09fYztLKz9HMz9DN09C/yMfKxMzMzM7PxcbHtr/Kv9LNzNDGycjAxMPIzs3Q0c/NysjNuLe7qJ+lq6eemJ6jnp2qpa2pqKiSlYiQhIyRho2MiJOVmZCWjJiSj4aHjIR8eHN2cGNgZHJiXVJcSUpHQUVJSj47QTg9NDU4Njs4Njo8QD07Pjw7OUA7OTo8Ozs8Nz09Ozo+Oz08Pjw/Ojo8Ozs5Oz89OTU7PD48PD0/Pz46O0BCOzk/OTg7PT0+PzxBQEQ8hqugnKegp6Oim6CbqaSlqaCfoaGmn6ifmKSimqmmoqarmqOwsamotdDU19rSx8bLtLXBxbG1qKGkpaCioFlJQEFEQEdRebKup5qUl5+cmqCgnpucmZWJd2ljYF9fYF9eX19dYmx1dHBwb2xycXWSxMjG1NbX19fT1tDV1NrU1M7P1dTU0dHM0c3T19bT1dDP0tPRydPRyNDX19jR19LY2dTWzM/Pys3Sy87QwcbDyMbOzdHR0snMzcDKzMbTz8zOyMXKx8fIzMrU1NHVz9LM08K5xbGlqLWup5uorKWdsqiws6ysk4+TjoiKj4OPi4SQjpmNk4+Zj4+ChYx8enFzdG1hY2ltX1ZQX0pKQ0ZDUk0/PD41NDo9NTI4NTU8PEA8Ozw6OTpAOjg7Oj46PTg+Ojo8QD08OTs9Pzk6Pz07PTw9PTo2PD0/QD08PT0+OjxAQjs5PDc0Oj48Pz89RkFEPYKknKClnaWlo5mcnaSeo6OfnZ+doJqnnpyhqZ+vraqqq52mrreoq7fX1NXZ2dHO0L+8zMm2vq6mqqiho6tlQzg9PkVYgqqon5iVl5manJ+dmJyckn1wZWNiX19hX19hYF9gYF9gZm5wcG5rb3J3d5zMwdLV09jY1tnR0tLXz9POy9LN1dTSys/M09bS0dbNz9XV0cXR1MrQ1NXWztLQ2NjX18vIzsTJz83KzMDKwMjKzc7Qy9DOzszOz8jL0NDLzsrCycfJzMvM0tPN09HR0NDKvci5sK67uLWqtrCtqLits767sZqPn5SRjo2IjpCFkY2ZjJGRlY6RgIWIenZvcG9rYWRucGFXXFpJRkZETVhFO0A9MzM8PTg3ODU1Oz5APTk8PDg7Pjk8QDtAOj04Pjk4Oj88PTg7PkI6Oj08OkE9PTw6Nj08P0A9PDs9Pjg7QEE9Ojw4ODs+PD4+OkVCRT6Bn5mlp6Cfo6eam5+cl56eoZqdmpyappufpKefuLa1taykrK6+tLDA2NLX2tzWzs3Kw9LPwcCwqaytqaSxekpIQz1YjKGblZOXm56enpyTlpeUiGteXl5hZGJgYGFhYGBhXl9fXlxibXJvb3N0dnZ5pL/M1dHW1NPY1s7O1MvOzsXOytLSz8fOzc3Uy87TzcvX1tDM0dTLzNDS08rO0dTS1dXKwMrCxczCyMnDzMPFyMrKz8rNzNDO08zGyM/MyMfLxcbBxsrMzdDRxtDOzc3Mz8XHwbi5vcPDvcO5srK+sbvDw7WqmKWhmZaRlZWSi5SNmpGUlI+PlIKJhnlxcmttZ2BgcGhZWGhWTEZMSVBQQjtDPjs2Nzo4Ojo1Nz09QTw6PDw5PD05PT06Pjo8ODs9OTtAPD47Pj5BPDk9Pj1CPTs3NzU/PDw/PDw7PDw4O0FAPDo8OTs7Ozw9QTpFQUU+hJ6bqK2epKSqnJ6fmJKXm5+am56ZmaKVoamppcTCwb+7tbKxx8K4y9XV2drb2MzMz8jW1cTCta+0qJ+ulXhvc3WCkpmNjJeVkJORkZWWlZCLfGVhYmJgXV5hY2JgX19gYWFgX11bXWdycnFyc3Btcnmlx9PPy9DP09TKxcnJxsa/w8bPzsfFx83K0sjLzs7G0dLQzczUysfLzs/Ix8/Sy9HPxrrEv8bJvcLHyc7FwsjAx83IxMzKzM/IxMTQyMbCxsjEv8HHzMzMz8LKy8jHy9DExce7x8PIycLPwb28v7DByca5vaqxsqelnaKcmJCbkKOZl5mRlZiJj4J3b3Rka2BeZnBhW1dgR0hIR0lNVEc/Sj02NDM1NT09NDg9PT06Oz08OTo7OT89OTw7PDg6PDo6QD1APD09Pjw6Qz48Pz04ODk6QD4/Pjw7Ozs7ODo+Pzw7Ojc5PD49Oz49RkFDPYOgm6qupa6qq5qdoJeUjpedmpmgmpqcm6WysazJzcrIxL68us3NxtDV1dna29jQyc/P0dPIwra7u62jtn1og4Slq5ONjZaPhYODg4F9hIR+c2BbXl5eYF5gY2RjX1xdXl9gYF9bWlxga3Jyb29rbG9wfbnRyMnKz8vNxLrAw7u7urq+ycbCw8DDyMvJyMrIwcXMxsjLzcnEwsrJwcLM0MXLyL+5wbvGyL6/xs/Lw7/Du8nHyLvIxsXKwL3Cy8bFxL7GvbzAw8XMxcW8wMrCxcfSxcDJv8rJxsjG0MPDxsOvxMvHw8q3v7y6tKmspKWYn5iso6Glm6Ogm5R7d3J0ZmlaYW5sWlxYUkRMRkJHRExERlNANTQzMzQ/PTM6PDw7OTw8PDg7PTtBPTo8Ojs3Oz05Oz07PTs6OD4+PEI+Oz88OTk7Pz07QD48Ozk5OTk6Oz06PDo2OTw+PDs+O0NCRD5/pZypsqm0rrCdnp6YnImUm5man6Kfmp2ov7i8ys/RzMfCw8bNzs7M1c/V2djZz8vSzc3OyMG1w76xr7VsX3p+pJCKkpaGeoCFhX92eHVycF9bW11gYGJjZGRlZGBbXF1dX15gW1laXGJvcm9raWxwb3OPx73JxczAxsKwtrqysrOyscK8vLy6uMHBwcW+vbm9v7nEysXGwr3GwLi7xMm/wcm7t7u7xsO/vMHNw8a+vrXBvcO6vca7w7qzvMXEwsK3v7W2vr+7zMO8tbrIur++y8TBxsLFycbJxtDGwszHssfJw87MwcXDwL2zt7Cyp6ioubClrbCqrayUenZ3amRnYGhvY1deWUpGSkZISkFFQkVJQDk6NjQ4ODU0Ozo7PDk8PDs5Ozk6QD46Ojw6Nzo7Nzo7Oz88OjxAPUA/PT8/Oz07O0A8Pj4+Ojk5ODk3ODo8PDw7OTo8Pjs7PjpAQEU+fqygrLWqt7SyoZ6fl5qNlJaan52mop2et8XCxMjO0srKysfNzc7RyNDG1dTW183Kz8XJxcfBucW9q62lX2V1hpOLiIuEeH+Ghn9+hHt0dGNcXF1eYGBiY2FhZGViXVxbXF5cXl1aW1xeaHNxbWdnbnByeZ29zMDDusC4rrCxp6qtrKe4tLe0s7O0u7W+srewta+yvMK8wcS8wLu1srq+wLjHubS7tsHCvLi9xsHDu7Wvsra6v7TEt7u1q7i9vcC9sbq2sLa6s8W8tq67v7W3tMW8vsPFwMPFxsjLxcDGxrvHy8DPycfDxsLDt8O9vba5vse/rLW6tbe2jnl0eGdnZWJrbl5WXmBGS0hISkZCREFFRT88OjU2NTYzMzs6Oz06Ozs6Oz44PEE9PDo7ODc5OTk7PDo+Ozk+Pz1APz5CQD1AOjo+Oz89PTk6Ojo4NTY7PT48PDo7OT49OT86PEBAPIi3pauzsby8sa2foJmUlJiXnqujr6qnpMbLzcjFyM3M0MzNyMrIysnKxNDN0s/NxcfBxcC/urfJtqqwmVtpcYyPhYiJenh+hoZ3d4F8c2hdXV1dX2BfYGRhXmNlY19fXFteXF1eWltbXV9scG5oZmtubnJ8pMe/ubi1sKutp56iqaeeq62zraqsqbSut7Gzqa6mrLO8urbDubq6sau1ubu0wrqwwLG+vLu2u8e5wratqqiwssC2uL2wsaiys7W7vKuutaautq+7srCqubCtu667uLvAwL65wr/Hw8XAvMbCyMq4xcfFv8fEw7rExsK7xsnMy7O5wr27s4lzdnZraWFibGhZWFdbQUxLTUlFQUM/RkE6OTo5OTU4NTQ6Ojk7PD07Ojs+ODtAPD05Ojc5Pjk7PDo4Ozs6Pj05QT0/QD87Pjo7PDo9PDw4OTg5NzY4PDw9Ozw6Ojs+PTs/Ozs+QDyKwKuouLe5w62zqZ2ZlJaZoZymsLWxt6bFztLLw8XBxdDHzcHDxr/ExMPDysLJyr/AvMK6s7S1w66psJFban+Sh46Pe3h9iYV6e4SAd25eXVxcXV9gX19kY2FkY2JgX11aW1paXVpaWlpcZW5vaGZnaWtucoGtubC1rqWkp6eaoKShmpylrK6kqKKrqq2rsKOmn6qttbaxvbmvt6+orri0tLy4tLyvuLm1srzBssCupamjq7Gys6i9qquoq62ttLOmqK2hpK+psqanqK6mqLessbK3urq8sby9vr7Ev7XCwcfIt7/AxbfEw7+7v8TCvsTIzMq/v8TAwKmHc3RyamldYW9jV1ZYUEhZUlNLRkZFPj5AOjc4OTc3NjQzNzo5OTo8Ozs8PDc7PTs7Ozw4OT44PTs8Njo9Oz89N0E+P0A/Ojw8Oj05Ojs6Nzc3ODg3OTw7PDs5Ozo8OTc5Pjw+P0I7jMKvrry3ucSwtrCbmZWcmKqpsLGztb2vxdDPzMPIurrLwcq+u8m2vcO+usq3wcPBtLa8trGvtbutqKuTZW2Ig4eLgHt9f354dH58c3dlX11cXF5fYF5fY2NhYmBhX11dXFpYWVtbWVhaXF9ma2ZkZ2Voam9yhamlq6Wem6GllJ6lm5iRoaOqo6Ogpaanpq2gnZykpqyysLa3p7CsqKq0q7S6sba2rra5sq+6urG2paCkn6axp6uouaqkp6eop7KtoKemn5ukpqyen6ekoKGxra2ssrSztLC1vLa7wcCyur7DwbK5ucOzwb3Atbi8vb68wsfEw8S/wMSgg3hwbGJmX2tvYFVZXkhOZ09USEVLRjw9Pz06Ozs4MjU1MzY5Ojg7OTo6PDo3PD88PDs8ODg8OTw6Ozc4Ojo8OTg+Oj89OTg8Ojs9Ojc3NzY3ODg2NjY7Ojo7OTo7PDg1OTw6Pj5AO43ItbW9uLrAur22oJ6VnaGmurars7O7s8TPycvCxri2x8DMv7jJt7vFuLPEuLO/wKy1vLKspa+zraGjkmlxhoWGgHx5dXNvbWpqaXBpXmBdXFxcXl9fYWNiYGBgYF1cW1xcWFlYWFhWWFteX2RjYmVnZ2dqbW+HnaiflZWaoZaco5mWjZ+ho6ecoKCkpaKnnpujm6CrsK2xtqOpqqqsrKS0ua23sKyzta6zta6wqp+en6OisqSmqbitoqamoKisq5mfoJ6ZnZ+lmpmjnJudr6mrp6qsrK2xsrivuLm7sLa8vLqrs7O5s760trKxtrW/tr7AvcPCu7q9l4R6c2xfZV5kZFhUV11JV1xLUEdJSkdBPD8/QDs/PDA0NTM1Ojs5Ojg5OTw8Nz4/Oz07Ozg4PDg5ODw3ODo7Ozo7Pzo9Ozc4PDo9PDc0Nzc2NzU3NDY2Ozc5Ojs6ODo5ODo7OTo8PzuJyba4vru3wcHBtKSkmZqkpsCyr7astLfGz8jIwMa7u8PDz766x7i4v7eywrSxu7yrubqxop6pq6eXnpBtfoWGf3hybW9ta2JeYWZmXV1eXV1dXF1fYGFiY2NiYV9cW1taWllYWFdXV1hYWFpeYmRkZWZmaGlrcY2nnJOUlJuYm6KXlpGcoqKonpydpaeipZygoZuZr66urrKgpqKuq6eitbGysqyor7OnurOmtqCinpyjoa2joqq1qqKjpp6lpqOWmZ6XmZudoJqXnZ2dnK2iq6ekpKatq7O0qrWws6uyubSvqq+ysrO4s66prK6yuLC7trq9wLizsZSFeXVmXmVeW1lWU1pVS1tRS0lFSEtJQj0/QUFAQToyNDUyNDk5ODk7OTo9PDY9Pzs8Pjs3Ozs3Nzc+Njo+Ozo4Oj07PD06Ozw6PTs4Nzk3NDY1NTQ2Nzg1Ojo4Ojk5PDg3Ojg5PkA6gci9t72/tr68v7OdpaOYpbHCtba9rbS4wszIxr/FtsHAxs63wMS9s7m5s7+2sbm7rLK0r5+apKmflJqPeH+DhH94b3F0cWhlY2hkY1xcW1tdXVxbXmBhXl9fYF5cW1pcWllYVldXVlhXWFdWV2FkZWNkZWRkaGp2oZuTlI+Ul5egl5mVl6CeoZ2WoKGppJ+fqZ2bm6unr7Crm6OkuKqhoK6otqqnp62xpLiwpLegopuZmaqmoZqsuK+ioaScop+gk5ShlJaWm5iXlpeclZ+qnqmkop2jqqqwrqi0q6qnrbOwpauus7GwsK6vp6iosq2xtLC8tLq4rqOUgXl1ZF5hVllYU1JUS01eTE9LR0dMTEU9QT48Qjw7NzY1MzQ5ODg5OTo5Pjo4Pj47PTw8Nz49Njc2PTc7PTs5Nzk7Ozw+OTk6Ozo4Njc2NTQ1MzEwNDU2Nzk6ODo5Ojo3Ojs5OT1AOnbAvLS5wrG+uLyunaeoo6q7wL3Aua60uMHMx8XCw73FuMjLssHCwa28u7W7vLW5ubCvsKqcmaGolJGKi4CAfHdxaWxydHBoaGVkZmJcXFpZWlxcXF1eXVxbXF5cW1xZW1taWFZXV1ZXWFdXV1ZbYmNjYmNiY2RmaYGWk5WLkpSUnJmdlpacoJyflqCfp6akpqefnaCmoKqvpp+ipLeooaGiqLSipailsKWxrqy0nqGdlZWpoaKUrbGxn6KjnZ6Ym5OLoZSRk5iYk5eXmJeep5ynoaKapKWlq6SlsKelo6urraaprq+uq6iqqrOmpqyvtLGvvLWxr6+gknp3cmVhXFpdWE5MUkhSYU1WUE9KTU9FQkQ/OT02OTo3NjQ1OTk7OTg4Nzs4OT0+Oz47PDY5Ojc7Njs3Ozs6ODU6Ozo7OzY8Ozg4NDc3NjMzMjEuLzI1NTY7Ojg7Nzg3Njw7Ojs7QTh4u7uxtb2wu7G4rJ6lp623u7zBxbqxubXEycnAw8bFx7bFxLLCv8Wrt7e9tr26urWyq62omZifo4uJdImIfnZuY2FmaWhmZ2lmam1gXVxbWlpaWlxdXFtcXl9cWllbWVlaW1dVWFdUVFZVU1VSVWBgX2BhX2FhYmVqgJOTiZCOlJOUnZWWl6SZoJedoKWiraalpaOko5yqq6Wan6WxqqChnqWrnqiinq2sqamuraKiopWYo5uckKupsJygop+el5mTip6RjZKTlpCYmJScoaOdpKGilaCipKabo6uloqSqo6uupa6yqaalpqa0pqmorbO1tLm6r6qsnoxycW9gW1dWVlJHUU9IWltPUklUS1NMRUZJRDg7Oz08ODY2Nzo5Ozo5NzY5Nzc6Ozo9PDw2Ozw4PjU5ODo4ODY1OTo7PDk3Pzw5NTc4NDUyMTIxLi4xNDI2Ojg2OTg1OTg5ODk7OUA5e7W0rbS7srCrsq2dqKevubmzwMi6tcCvxcjMusHKzMi1ybyxvsPIrLG4wbW7wLu0tKqsppWam5yIgHKIg3t0aWlqbGdqa21ram1lXVxcW1tcWlhaXVtbXmBgXFhYWllYV1hXVFZWVVRVVVJTT1FZXVxdXl5fX19iZG2Oj4SRh4+QjpqTlZKcm6Ocm6GoqauorKeppqSZpa+llZmlr6qgnJmboJ6vmZyrs6Clpp+jpKGUk5uWlpKpqq2anKChoJuUkIyZjoyQjJGNlpWQnaKgo52co5WboKOhl6Koo6Koq6CrsKStt6WjpKKtraqoq6+zt7O+tbOrr5iFdHNoW1lZU1VSRVhMUVtYTVROUExQUUlOSUI9Pz9BPz03NTc5OTw8OTg3Ojc5Ojs8PT47Nzs7Oj02Nzo7ODk3Njk4OTo2Oj05OTU3NzU3MDE0MS0rLzQzNDk4ODo6ODo6NzQ4PTg/OX6zraeztq6oqK+um6morLe2rLzKu7a/rMvGxbjBzs/Is8S6t7vCyLCtuL+3vL27s7WlqaCWl5iXh3p0gHZ3bm1obW1tcGdnaWdkXVpbW1tbXFtZWltcXF5fX1xYWFlYV1hXVlVUU1VWVVVTU05QUVlaWlpdXVxeX2BkfoyBi3+Lj4mSjZeRl5mioJugrKqmr6yosKWpmp+toJWWpKmonZiQj5qerpeYqKqZn52UpaGekpGSkZOVp6qlmpmZnp6WjYyLk4aJjYOPi5KVkaCeoaSYlZ+VmqGinpSbpaWnqKigsbGmsbynn6Kstauup7C1sLi1wLGtsauRfnJzYlZUVU5SSkdWUFJRTExXTUpMTlJHTUtBQ0ZEQz5BNzU4ODk7OTo3Ojo3PD06O0A+Ojk7OTo/NzU5Ojk4NzY5NTg3Nzk7ODU1NzY3NjEzMjAtKi4xMDI4Nzc7OTk7ODk0ODs4QDl/s6ylsbeqpaKxq52qp6mysaS2xrS5urPKxbm6wcvQyrG2uLu9wcOxr7G3rbSzu7O0oqOcnZeXlIN/d2tnbG5xbnFqcGtkZWdlXlpZWllaWlpaWlpaXFxdXFpYWFhZWVdYV1VVVFJTVVNWVVJOTk5SV1hZWVlZXFxdYWqAen91iIyGkIqXiZSTmJuZnqmboKumpqyeqJqgppyTj5+jm5eXhYSSm6OQlaOdlpaWiKKbm5SLjoqQmqSnnJWVl5uRkoeUjouBi42AkIqSkpKgmqCilpSYmZWippmNmaSmqKahoLSyp7K3oZyit6yqrqSysqa1vLWsq7GjiXlzbV1OUVFMT0NNTk5QS0ZOTkpKTU5RSE1KQUdLSEhDPTg1ODg4OTo7Njk6Njg7OTk+PDg6Pjk7Pzg3ODk6ODg2ODU3Njg4OTc0NTc3ODIwMzAxKyktLzEyODc2Ojk5OTk4NDk4OEE3d7ampLawpKekqqWgqKals6qissO1tbKzxsa3usPKzMazrLq9tLfAr62psJ6mrbqvrp+Zmp2VlId7g25fX2ZycHVxaW5pZWdoal9YWFhYWFlZWVpaWVtbXFxZWFhXWVlYVVZSU1JQUVRRU1VRTU1LTFNXV1ZYWFhYW11hb3N2cISIgoiAkYSOipSRlJ6hj5uco6KkmKWXopyVjYeZmox0jYN+jpeWhpGakJSOjnuZj52Mgol/iZifo56Qk5iWhY2ClH5+dIqOepCHk5CQnZuampKWkJ2Oo6OOiZqgoaOkm6K0r6yvrZ+YpbimprGhsK6csLuqqa+qmYN3c2NWTVJPUE5DU05MUUxCUFFISU1STUhKSkRKTEZKSj03NDk4ODg7OzY5Ozc6PDk6Ojs3OT85PkA3OTo8ODk3NjQ0NDU4NzQzMTI1ODUvMDEwMikoLC0xMjc2NDc4OTo6NjU6ODdBN3i3oaO0qKalqKOmpaemp7OnpbTBuLC0sMnEt7nBzsa9s6y6wautw62noaaSnaa2rKOgj5WWko9+eH5lV1ZfZ2ZpZ2huY2poZ2JcWFdYWFhZWVlZWVlaW1tbWVlZVldXV1NUUE5QTk9PUFNUUU1NSkhOU1NTVFVVVllbXWlscmx/hXx0Tlhyj4KXho2dl4uUkZ+YnZWUlpWPlomAk4pfO1dvfIyUiYCMkoyQhoZzioWXgXmBe4aTnZODlY6RkIOGfZN4cXCFjX2JgZGNj5eamZOLkImdiJ+YiIeWnpqhoJenrqmtqaielq2zoqatmayrmKizoqmto5N+cm5gW05TUldMRFRKUExMRk5PSUVMUU1LT0pJTFBGSUk9NzU5OTk5OTo3Ojs6Pj44Oj09Nzo/OD4/NTg5Ozc5Njc1MzMzNzYwLi0vMzQ0MTEwLy8oKSsrLTM4NTQ3Nzk8Ojc5Ozg2QTl5t6CjraGmpqqgp6moo6qwqKe0wbmwtbDHwrezvc+/ua+utcKnqsWpo52Yg5SbsaKamIaUj4uHfXN1XVBMUlVZWlddXmJnY19ZV1dXWFhYWVpZWFlYWVpaWllYWFZXV1VTUk5MS0hHYlxNT1JNS0hGSE5RUU1QUlRWWFpgbW9pe4J0UUJAf5WSkX2JlY2Eio2bjpaViZKIhpWGeYl/YEpRbniLkoR9hI2KhX9/bn5/lHh1dniEjZlvUY2IioZ7fniUdmd3hoh9iomVi42RkpeMhIqIlYSajIKEkpqWnp2UpKOoqaWknpqwq6GkpJGmqpaiqpyipqiJdW1mXltIUVFTTUlVTVNJTEtPSUhGSk5MTVRLUVBPRklDPDc2ODo4Ojs7ODo7OD4/OTk+PTg7PDY7OzQ3ODs2Nzc1MzQ0Njk2LzMvLjEyNTIyMS8sJykrKiw0ODMzOTc5Ojk5Ojo6Oj85d7abo6edn6GvoaeopaeosK2qtry2t7ezwbu2p7rIuLaoqLW2qrK8pp6VjX+Jk6iWlYp+joOCfXhwblhNS01NTktNUVdbXFpYWlVVVlZWV1lZWFhZWVhZWVlaWFhWVldVU1BNSkVAQJtrc3NJTUpERERJTk9oWU5RU1RVWm6Dc3Z+amlcVY+JlIl0f4aBfIWMk4KSmouPe4aPgHaAeHNvdnF0jY6Ben6Kq4V5emh2e45wcm14gYuNknh6gHuAdnJykndodYSEhIV7lYmIio2LgH+Ei4yAlIN8gI+YlJyWkZ6dqZ6foJ2gqaWenZiMp6SToaCWnp+kgHJoYVxdSldQUkdKWFJPSkxNUkpKSkxQSUxRTFJUTUVIQTw3ODs5OT49Ojs8OThAPzo6Pj03PT03OTkzNzc4NTY3NTI1MTQ3Mi8yLiwvLzIwMC8tKygoKS4xMjcyMTk4Nzk4Nzc1Ojw7N3aumaOimJyftKmvqaWtrLCyqr20sru4trq0sZ+3urKqnZ2sqaiyr6GakY2UgI6cjpF/doZ4fHZvb2lYS0hJSEdFSEhQVFRUV1dTVFVVVVZXV1dYWFhYWFhYWVlXV1VWVVNQS0Y+OTNOPH6eTUhKREA9QURqlH5MT1FRU1ZedIJ7eGZ3jZeYjY99aHmBdniAiZB9hJiSgXKHj3x3e29rfq18c5CKf3uGkoF9f3RmdnyGbG9oc32JjIiAbHlxfXFtdo9xaHGBfo5wQ4uEgoOFf3d3eouFfYx7dX6Oko+YipKam6OWmZ2anZ6hnJaNiqSbjp6XjpaYkHdvbWViWlhYVVFKU1VUT1BOUFZLTktOT0pRTkhPT0xGRDw7Nzk7Ojo/PTk8Ojk5Pz87ODs9Nzw5OTk5MjY2ODU2NjMzNjExMjI0LiwsLS4uLTAtKyonJyouMTM2Mi84NzY5NjY1Mjc5OTV5ppegnpagpq+srquoqbGvsau8uKy7vrmzrKebsKesm4+WnKWppKCXmY6FknmIjouKdXF8bXVwam1qWEtGR0VBQENESUxMTVFSUFFTVFRUVVZWV1dYV1hZWVlZWVlWVlRTUUtENzhmNzA/qGlOSEM9OzpEioV6WkpOT1FUWF1lcHJsiKeqwH51eWN8eG98eYiQen2Lhm9tjJJ5dHhqaoCCcZaRi4F+loBJk5huaHd+gmxpY2x5hZCShmtzbHxucnuGaW1wf3ONiYSGe31+e3ZvdHOFgnmBeXB8joyKlIOWl5iakJKVl5mXnZaMg4mekYuSjYaQloBvam5vblhWWFRSUVlPUlRUU1hVTU5ITktNTktDSE5HRT86ODk7OTk6Pjw5PDs6Oj0+Ojg6PDk/ODY4NzI3NTY1NTQxNDMyLzAyNCorKiotListKigqKCcsLTEyNTAsNTU2NzQ4NUhBODk1d5mRm5man6WtsKOsqqi1r66stL+rvMK/pqKZlaSXno2Ei5ShoZiYkZOLc456gIaMhnRvdGtxbGRsallOREZDQDw+PkFGRkdLS0tNUFJSUlRUVFRWVldXWFlaWVlaV1ZUU1BMRTFAmjMganNDmW87PDk1PICChl9JTU9PUldaUVlcYKeIYpppdHplfnBtf3qLiXaCiIZ0bJqRdHN8amudj015hZKJhI5nMXaGc2x+foN0ZmV0foSEhYBmaWx1a3F/fGhxcXxuk46PfHN9fHFwbnZtgn93eXVqeYmCiImElpKSkIuNkZSUjpeNgHmIl4iGioaAkIh3a2tvaGVYUVpXWVlbTVBVVllYTklIRUpKSEdCQEZEQ0c9OTk4Ozk6OTw6OTs6OjpAPDk6PDk4Pjc4NzcxNTIzNDUzMzY0NTAzMS4qKispLCwrKykoKycpLCwyMjYsLDU3NzU0NzhpTzg7NW6SiJqRmZakqK6esp+nu6+rsrDCsbvDx5qWj5SZi46GeYSQmJSNkIyPhnGHgnSHjIZ6cHJwb29kcGZfVEZJQz88Ozk6P0BBRENFR0lMT1FRUVFSU1RVVlZYWlpZWFZVVFNQS0U4MC9cYLNHOVhQOzk0NDGWuotITE1PT1FWTEFJUUlir7Ogcnx4bX1scYOChYF6hIaGeXKhlXR4gHN1lIc1cZ2onY6hoYSihHZwhnyHfHOMrY2JgGdnYmpucm1wg3Vpb1h1cI6bkndsf3p9bXJucIB6c3ZuYnaDfoaAhZCQioqJkYuRjIuOg3V4io6AfoOAfY97cnBwbGBbXF5cWVhhX1JOW1pYV0xISkZKRz5CQUJHPkNEPTs5Nz07Ojs7OTo5OTs6Pzw4OD06ODs2NjY1MTEyMTI1MzQ3NDUzMS4vLCwrKSopKSoqKikoKikrLzNETTIxNjY2NDM8dlI3PTdikoGTiJaRnaSnnq+VpbWqrrGuwbK7wcaWkIyUj4CIfW6BkJKJg4qHj4V1goRslYiIe3R4eGx3bndjaV5KUEc+QDc0NDk7Ozs9PkBCRUhMTExMTlBRUlVVVldYWVhWVVRTUExFPDUqnUtbQC1nSTk0Lz+Sg6muX0dMTU5QTDdDTVJTREqGdoB8fHZ+bHeIiHx+hYN/jH52opl5foaBhZmFm5xhhqqfnYuDkI16d4h+iYiNc4qXkIN6XWRydHp8d4ptaGpieW+GkIJ6boF3dIR6cHR5d2tuaV13h3yHfIeHj3+LkpeDjYWMhn1xhH+DfXV3e3yJd3BzdGVnX1tbXlRcZ15XUVVYW1VHSkpETEc/RkBEQz5BQT06OTc8Ozs9PDo6OTk7Oz0+Nzk+OTk4NTY1MzI0NDAwNDY0NTU1NC0sKSsoJycnJigoKSkoKCsrKy8wMFVxPTIzMzMxRX5XND05XIx4ioCUjJKcnZ+mkaCroLGor8CxusW6lo6RlId6hXZrf4yRgn2KhI6MeIOAc6GEi319gX9wgH56Z3ZrUldMQEUyMTEzNjc2ODg6PD5BRUdGR0pLTU9QUVNUVVdWVlZUU1BNRkA6Mj0gI5ZjjFs1MzExaT9Hb0lGSUxNT1JMS1RdWVJKaYSIe4l5fHF8j4x6fYmHfpeHdqGZiIePkpSljaypSIaur6+LgYCTioKLgYSSqIeAmJiKm3RtfIGGh32OaGdoeH9uhYeChXGEhkdsgHdyeXZobWtfd32DiX+IhYt6lZ2biYuIkX96dYt2fHhtb3d9f3R0cmxbXV1bY2NYZ2ZcVU9QVllQRExLRk5JQ0ZDQ0FAQ0E9OTg4Ojo6Ozs6ODg4Ojo/PjY7Pjc1OTU3NzMzNDQyMzY2NTY3Njg7REZMTU1MQzcrIiUnKykrKywvMDArbnUyMjQyMEyBXDU9PF6EdHx9iYWIkY+WmJKXoZ2soaa4r7O8s5eNkouYi310cH+Jkn59jIKSlH2Gfoakh4h/goiFeIeIfnOEeF9jV0tCNjAuLzIzMTIzNjY4Oj0+P0JFR0hKTE5RU1RVVFRWVVNRT0dDPzgwLCOHWz4/ODQuXZZwc6NVRklLTU5QV2BZcFpcXmqNk4eVgISChZGTfoWIkYGalYKhoZiVm5qlrZOau7Gnu8fDqIuMoaWPlImBkXxxg56fkZx/doWFipCIkGlob4OAdIyHhItxhYJ3h397doV9bnZ1ZoCUj4aJiYeIh6GqopaJjph/eoKJenlvZ2t4fnp+cmpkXlpaXWpdYWZgWU9LTldSUUhQSkROR0NKREJARERBPDo4Nz08Ojw6ODg3Nzg6PT04PD02ODc1NjYyMzQ0NDU3Njg2NzxCQj88ODo+Q1FeZVxHMicmLCwtLS4xKD+LWy4zMjBPg180PztudXBmeIN7gIyAgZGOipqbpJ2hrKarr7CXkZGEoZSEeHd/jJR8f5KGkpV/ioCSm46DgIGMi4KJjYN/iX9tcGpdQkE0LS0vLy4vMDIyMzQ3Nzk7PT9CREhKTlFSU1JTVFRSUE9IREI8ODcvOUQ+PDw2My5sk5dNUEhJS0tLTlZgY39nZ211nZqPmpOTi42OmoiTj52LoKCSo6qlo6yTqLaiqMHDrseveLqUmnyNoZ6ZhJOFgo+hn5OYkoSLhY+ZkZZscHWJi4KWjI2Pd4+EcW2FgYqWkYOFiHKIoZaHk4mOj5altambjZWig4eTg31/a2prfICBgXNhXWNeWmZrXGxrXldLR09SUU5NTEZJUENETUZBQ0VHQj46OTc9PDo7Ojk4Nzc2Nzs6Nj06Nzg1NDU2MzQ1NTY2NjY4NTU2MzEwLiosLCkoKS46UGFcQCwoLSsrMCwncog3MjQwT4RiM0A8dW5nWXCCcHWHcXaShn6XlpqVnp6cp6CplpOYnmdlpJp+hJKReYCSiJCSfYqEmJKRgoCAi42JhZCGhIiFeHh+Z01SPi8uLiwvLi0vMDAwMjEyNDU3Oz9DRU5QUlRQUVFTUU5QSUVEPjs8OkNGPz48NzUyPD9SNUhISExMTU5SXm+KfHOBfaCdnKilopmhl6KVnZ+onqiroKisqaq1l6u/q7bIyLfJ0c++m6Bwaaupn4STkoWcoZqbmaeRkYmVopqaeHp+lJiSoZKWmIGUnnt3lZKrs4iNl599lJ6cjpOWmaSiprawnZGZqIiWj42BiGxzcnx/fHFoYFxgXmJnY2BoZ1tSRUpLUE9JSkxGRk1DSExGRkNCR0VBOjg1PDw4OTk5NzU2NTg+NzU9ODQ3NDU3NTQ1MzY5NTg6NjE2ODYzLzAuLSosLy4tJyMqO1hiQigqLDEtKEuXXjA2M1GFZjJBQGlhXlBwdWBufWF3jn17lI6Oip+Sl56Wm6qYnqpCRH2HiYeYjXiCjYqOjXyKho+QjoGCgImMioSShYOGiYGAhndfYlA0NjAtMS8sLjAwLy8uLjAwMTU+QUFNUVJTUFJTVVJOU0xFRUA8Pj1HR0BBQDg2NjI8OTtGSEdJSk5PUVlthpB3lYujp6q0vbikrqysp6i0q7C2srKtu7Gzvpyzw6y7ycu3w7+4paOwsqytqqOLlpiFpqago5eBppmNoqqopIiFlKShoKqhpKmPnLGLlaOnt7uboKOwk6Odo56RpKKrr62ztaKUpKqImYmSipV5en6FfmdgaFxlYl1kY19mZl9aT0RJSFNPRkhMRkpHRUZIQUtFQ0ZHQTs4Nz08ODg6OTc0NjU4PDU0PDc2OjQ0NjQ0NzM5PDM4PDIwMjU1MS8xLi0qKi8sLSooKiYlNVhYLywwLCwwhIE4NzFQhWg1QUNbWFRMaWNXanBYeoV2gZOFiIKbg5KRjJLayJ2Wc1aXiI+InI98hoyOiop6h4KHkY+DhYCLhYaHkoaChImGiIeHcW5hQEU2NDwyLzExMC0sKy0xLi0zP0RBTVVRUlNVVVdVTltQR0dFPD4+RkhDREA4Ozw1Qzs9RktJR0hST1BXgZOghK6js6qxwcfDqrPFtqyzv7O4vra/tMG2u7ukuMaotsnHtb65tKijtK2xsZuZkpqfiaivq6WUdp+kl6GrsbOZlqqtqK62u7K6rK+1orGssbW8t7WutaCnp6OomqmwrbK6uLinm7apjKWOkZOfhniCg3VZYWRWZWFhY2BhZl9bVElERExVUUhJSkRJR0VBQEBKREJNRjw4Njc7PDk3Ojk4NjU1NTcxMTw4ODk1NDY2NDk3Pj0zODkxLjAxMjExMzAsKiwuLCsrKyooJyopRVowMCovK2iSTzYwUodqNkFGV1FKTFtaUWNkV3l1cYGUfYWHk3aFf4CMe7+7o7yCtJSTjZuPhIiPkomJeYaAjJONh4SBjn+BiY6GgIaJhYqHkXp4bl1WQEVNPDY6NDZBQjc2NC8vNkNIQ1FbT1FVV1VcVk9eVUlLSkFAPkdLRkVEOz5AN0Q3P0JKSkVGV1RQXo+lrqOxtMO2uMHMyba7xL2zs8C3t8G1v7C3dLGzprrFpLDGubGzsbSopLW2qrGgopabopKlsK6mraunpJigrLO6oqmyurS7vsy/xcW9vbPCt7q4v7e6t7msrLCmsKqtvrC9u8LCrJm6qJSuj5eXq4l9gnxqV2JhV2plamVXW2RZVlNJR0ZMUUdDR0lBSEQ+P0JCS0BATUM5OTY2OTo/Njo5OTY2MjQ2LzE5NTk5MzY0NjI3Oz0/NjoxLi81ODo5NjUwKigsLS0tLCwqKCgrKyhFUy8qMDBKj2s1MlCHbTY/RlJMQUxSV1RZVVp2anB/j4SBjoRuenN5h2K4oZmiiJWTlpOUk42QlpKHh3uGgY2WioCEgYp6fIuHhnyKg4GKg5V9eHp1ZU9cZEdFTDpRY2FbXlNGPztIUERaY1FRWVhaZ1lUYGBNU1BFQT9JSkhFRkFAQzxFNkI+SEdKTFNaVF2Tr7i1urjJv7q9ycy7vMG8t7W7u7e9tLqxxmF1sqWxmp6qvaqlqKuqo6KytaGrqJ+Vlp+Yn66lp6aln6OUoqaxtKeysr22wb3TycrTxsLFy8HKw8C+vb+7vLe0r7i3tsO6xb3DyLCeuaqiq46lqLaJgX9yX2FiXVdhX2hmUlhhVlJVSUVFTktBPkdEPUtCPUJAPUY9O0hANzk2Mzc5PjQ4OTo1NzA0NS8yNjM4OTM3NDQyNj84QD5HS1JUU1FQT1FRUEpBOS8sLCwqKygoLC0sL1A+KC40OIB9PDJLiHE5PkNLRUBJTVBSTFFdZ2xscZCNhZBzbHJyc4jVwLWZoI2VmJmRjpeSlpaOhod9hoOMlop/g3+DeHuLg4d7i3mBioKXf3R9emtlcHVZXVxQZWViYGVkXVtYV1xNZG1VUm1tX25fWGdlVVlVS0RBS0tIRklISEdCSTlEP0hLVFRWXFpbkrnAuL23xsC7ucrKure6tri5sre1tK62tplkdaicrXBeoa2cmKCim6SeqqWUoJ+QlI6WmJeon6WfnpqahKSdrKWqsKy3sL251NHP18/JzNHMz87KxsC+wsq9wbzBwMTExcq/yM60pLuwtK+bq7m8mn96bF1gXFleYVljY1FcYFNQS0NCRUdFPEBFPkFIQUBEPTpFPj1KPzQ3NTM1Oz00Njg5NzcwMjIvMjQxNjk3NzU1NTVEM0VMTT41MS8wMDY6NDc3QElPSTstJioqKC0uLyxATSsvNTRtiUkwSIl0Pz5CREBDREZLT0RSXFlpX3CXkpCUb2xvdXWHs6yhoZ+LmZyZjI2VkZuShYqKfoiGjJCLiXyBhHN7ioOGe4l0gYmGlX9ze3hrbXV7aHJlaWxpZmppaGBmaWhsWm50l62kvIiHZ1tvaF1aWlRIS05PSktRS1RRSExBSkdLUF9eYmZpYZe3x7C4s7u9tbHEx7WwubCwu6uysaeqt6yNtqedm6eaT5qdjI6glpGmmKWVipOTiZCJj5GRnpuhl5qVloeemqabrK+or6eztNTU1NbSy8/U1c7Tz83FwsnQv8rJysnRx8zNwtDSuLDDvMS5pba6xKKCb2NcXF5YYVhZZVpRXVdPT0JCSEVCSTtBQz5BRz8/QTg7RD5ASD00NjY1NTs6Njg3NjU0LzEwMTQ2Mjc4ODc1MzY3QzVCOD8tMC0xMzQ5PTk3LC4sMTtGSz0pLCguMDAwN0s/LTQ2VIhXMESHd0M7Qj5FQkFDSk0/VVlTZVdzkJCYgmhxb3l5g6CqnqaXjJubl4uOlZGajn2Ji4SOioqLkId8hIJwf4eBhnuHcoORi49+cXh1a3F4fnF7bXhzbGmBcG1jaW5weGl3fH7Lv8Lfp21jeG5jW2FgSlBSVU5ZXlBeXU1QTlRRVVRcbm52gnKXrbiss6ewtqqsvMCxq7WmpLimq66hq7SjjrGumpiYjJGTkYSOm4GNp5KciYOLhIqJhIuDk5WYl5ObkZyYmZmenquspKehrK3P0tXRzczS09TQ1NHOyMPU0cjN0tPT183S0cXS1sXAzsfHw6i+t9Ceem9mXWJdV2BTXVtPUFRQTkg+QUZBQkU8QEI+RUQ+Pz86PT08PEpBNDU0NjU8ODg4NjY0NDEyLzAzNTI2NzY4NTMzOz08RT1AMTErLzI0OT41OTAxMDIyLTJETjMpLzMuMzI9TjIzOEN9XzJBhnREOj09ST5AQ0ZIPFZSTU9bdYaFindsd3B9fn+hnp6hi42Zk5OMjJOPloV5hY+QjYuKiJGHf4J7cn6AgYd5hHWFkpGJf292cmtzfHt3fHOBd3FrgHNyaG9xenlye77Lm36MsoN2coR2aGFqXUNaWltXZmRYZWtTWF1dYGReY3h7fouBmaqkpKGfoKilqrC4qqW0o6GtoaOtoqexn4mmmpSSkYmRjoiBlIlrlaKNmYSAhX2Rg4OTlq2LlY2VmY6FkpCdl6ewoaChpKSoyM7PyMLL0dTR1NPO083G1tLM1NjW1tjU19XJ1NrNydfX0cqsxMPLi3NvY2BfWFRaU1xQSkdJSkpAOzo7RUJEPEJDPkhCPkJCOzs5PDpHQjQ2NTQ0PDU2ODc1NDMyNTAvMjU0Njc0NTU0NDw+PUU/QTYyLy0xNjs9MDgxLzI1NC8tLTtSMDE3LzUzMkZEMjg+bmI1PYF0TTk5QEk8QUQ/QTtQTEZLWXCAdX1oc3hygomAnZWdlIWLlomPioiOh49/eISTmYqNiIiLiX6CeHN7fYOHd396h5GWgINueHBtdX92eH50hXx5bYd2dG59doR1eXudtow8QYvGpX6NfGllVklDZmNlY2hqZG94W19maWtuaW6Ag4mRi52eoJ2Ql5ifo6SmsqSks6ChpZ2gqaCisZyGnpKSkpCLjouGg5CEfpybjI2DhIV6lH6CqZWjjJKKl5KLfZeKmpGqs5iam6ecp73Dxrm2xs3S0NLQzNLLydTO0NXa19fY1NnYzdjbzsna2tLVv8vMtHh2b2VdWVJWUVpWRkdKSUVFPTo3OUBBQjlHREBFQ0FEQjs/Ozs3REM3NTY1NTswNjg5NDQzMzQxMDE0NTU4NzQ0NDQ5QD5EQkM8MzMuNkZUV09RSkFKRj8xKiguQlMzOTI1NC83Szc1PGBiQTxzdlY4N0FIOj9DPjw5UUVDSlRsbm9wYXFxc4aNfJeRnYt+h5KCiYaFioGHfHiFlpaIj4OHhYd6hHhxenuEhnV6hY6NnHqMcHxvb3p/cXyBcYOHgG6OenV3fXyCdX98h4iwdFmpwraMkoJwbmI9XmhycHFwbnh3gWVpb3J1eHJ6i4eOlJKblaCVh4yTm6Cbn6qfoK2coZqZn6Wen6yZi5qMkZGNhH2Ih4OFi46fmZOIhId+bZl5hJiGiJOMjpSMhnubiJOPrqqUlZeemKeutb2prb3Gy8jJzMvPyMPRytTW2NfY19Xb19PZ29bQ29rR1snUy5V5e2lpW1pQUlReSEJFSUk+QT09Nzo9Pzs9Rz0/QUFBREE+Pjo4NkRCNzU1NDc5LjU2NjQzNTUzMjMyMzY0NzU1MzQ1N0VCRENFQjU2PEZOU01bbmZjbnNrYVY+LDRMRzg2NTQzNEJGND1XX2hMdXheODs/Rjw8Qjw6OUQ/Q0dSa19tZGJma3aAiHGRkJqAeoCNfoKCgYR+g3x8hJeOh4t+hoaAd4J5bnt7hoF1epKejaB2j3WCdHWBfXSAhG+Bj4FvkoR0fIGFenaGe4m3xqXCybeBlpuPd3BlTmZjgXqBd4aikIt4eXd7g398hHVuk5aUlY+YkIOKj5aal5elnJegl5+TkpejnZmrlZCQio2RgoyFiYiBhZCRnpyZiYWLgYaYeomIn5ePiI6KjIJ8oYmQi7yhmJOXmpyppqWun6i1vsDAucfJzc7FzcnR1tbV2dXX29TX2drb19va2djO3MaGenpoaWRgVFdWVU1KRE5EOz08PDk6PD45PUA2PT9APD8+PDk4NjdDQTY0NTU9ODA2NjU1NDc3NDU2MTM4NTQ1NjQ1NjdISD1ESkU3OTI1O0g+Ozo6N0lQXVpSVVhLOVQ+Ozk1MzI3STg9TllNSHh4ZDU9PkM9PUA6Njo+PkBFUV9ZZWFdW2h0enlsiY2Sd3Z6i3x+gH5/fIV7foGRiYSFeoSIe3V9dG18fYZ+c36SnZGeg5J8hn54jn15iopugpqAdJiFfoGJhXx+kHqPqY+Qw6C8jJyjnH2JhH2Jc4yKfnOmmpyYlIV7j5CJhGhHcKCknYyLkJKFiYuQkpWPnJqSlJGXjYyVn52UoZSRjY2Qi36Qjo6LhIiSlZqfn4mMlJKekYKLf6WZiISOg4aEgKWGiou4mJ2RlZaip6Gdnp2jrra6tau/xsrQyMfMz9PS0tjS1dfA19jZ29ja2tnZ19y3eHh4bGpkV2BbVFBOR0NMQj09Pjk5Ojo5OTs9Nj8+Pjw9OTo7OzM3REA4Mzc4PjcwNjg4MzU3PDM3ODA0OTc2NzU1NTQ2RlA1RE5JODkzOEFLPTszQ0BJPDlEV048TVRITj85NjMzMz5DO1tYPjVZeXBaPDxBPD0+ODU4OT89RFJTUlheVVhmbW1taYGOinFyeYp7en98f3uIe3x7i4eCfnWDhnlzenNtgH6EfXeFm6GbnZSSgIuIf5iHgJySboeohXqgi3yRjoOIhJx+mpGKjaOin5CkrqCLkYuFi4GShldyrYufq5uPg5ibkJCOW4KikYKMn5OVjIeIjJKTjJSUlI+Mj4qIlpudj5WWkYuSlIaAi4iSjYmKnJaZoqKGkp2WoYuKiI2ckIOIj4CDh4WkhoyQs5idkpSXoaGemZKcnqexuKylvMLHzcfGz8zQzM7Xz9HUrtbV2NrY2trX1tnan298dWhnXF1YU1dYQ0BJRD4+Pjo0OTo7Nzo7OjM7Oz88Pjc7OToxOUc9OjM3PUA1MDY3NzI1NT82NTs1NTg1ODo1NzczNUhSN0dPSzk5ND1FSkI+MUZDTEI5ODpHWEA1SFdJNjYyMjM6RUNlWD8mX3lpX3o+Pjk8Ozk4OjxAO0JRS0tTWVBUY2J4bWJ+koNvbXeLeHl/eoF8hnx7d4aEf3NwhYJ6dXZ2dISDhX1/kqajn6Wilomdj5SXi4qol3KKsYyEp5GEmZOFmYuilqCYk4mbnaGSqa+fkZSQjY2IlYtujbeFmsTIspyhpZucmJaQspBkpM3Hlo+Fh4mQko6Nk5SJhYqKhpaam4+QlJOGlJeEf4+LmYiNkKqXl6OjiJmelpuJj4eXl4qEjo2Bf4ePpYmNk6mal5OWmaGZn5mTnZujs7Slo7zBvsfFxcnIycLK08zN1KjS0dbW1tja1NPazoJyf2hjX11eTkpUWkJBR0Q7QT04Mzc7PDo4PTY0OTo8OjgyPzk6MjlJOj42N0JDMzI6OTYyNjQ+PTQ7PjY5NDk7NTc5NDRLUTxKUUs5QTdCR0lANjRKRUxGPjw4OEVUQTc+XDg2MjE0OjtFYFhBRmF0aExjWj41Ozo6NTs6PjpFTUZIUldTUkJjgUZ1go99fG1+iHh6fnqBgYN+dnaAg3xsbot/eXx4eHyEh4t9iqOzp6OqsqGWp5+lpJaVrqKDkLiVkrOZjaGgjKWbr6OknZiQp5anma2vpJeUlpSQi5iZlqDAjqTJuKuboqatmJGanLKdhoWoopyYhYiJjpWNi5OOiIGGh4iTmJSMi5OThpSYhoSRkJx0kZmylpekoYicmZOPipCLl5qJipaOhn2MmJ6JkJCcmpmTmJiglKCdlZ+bobGuoqS3vrTFx8S9w8O/xs3KydKnzs3T0tDW2NPQ2LtyeXZcYFVfV1BISU5FQkNFNj46NzY6Pzs8Nz00MjY2OTc3ND01PDU8TDw+OzxCQTc1PDs0Mjc3P0A2P0A3ODQ5ODc7PDU1T01EUFJMOEA9RUFHQTU6SkVORUQ6NkFAQlM+OURPMzIzNTc1PXZcPFJcdGlaTV1TPD04OTU2Nj06SkZER05bXFlJZmA7SISLenpthYZ6fIR4gIWBfnB4fH18b3KNen2Be3iGi4mFg5Knu62osr2vpa2zs6ijorCsipq1naO4pJWtpJaprbempKOfmamYqaOvsKqamJyUlZGXn5eZu7utyaBptrirsJSYnqOrk5e+o16qsoKJio2Uh5F8jo59g4aOj5SViIeSlouPlY2LjJeYkp2ZtJaVq56Lm5SSjZCSjJmbipKekIuJlaChjZSNmJqdk5yZnpShoJScnaWvqKGls7irwsjEtbq9u8XHx8LRocbJzc3E19bRy9OhcHpoXVlTXlJPRkQ+PENBQjg/ODc0PkY8PDY8MzUzNTU0NTRCMzo6Qk06QTtBSEI7OkA8NzQ2PEI5P0BCODc0Ojo2Pjw0N1RLQ1VRSjc8OklBREA0QUpITkJBPzZEQTxKTkQvVD0yNTQ6RUpcWEpaUW1ncHBEaWBLSTY3NTc6PkpAQ0lQZUdiYGJwSUCLin6Bc4aHfYGIdYKKg39tfX18f3B3hneNgYd7jY+MhoyZqsLAr73Gu7O0wby0rauztoyosq6uvKqbu6Sorbm4q6amoqGjo6ivsrGrnZykmJuYl56ipaWRo7muqL+8rK2yuaWjp32IhpytvbCDi4yLkIOPg5GPeoGHkIyOnIiHj5eNi5WXlJGalp2nmrGakaydjpqPko6VkJCWl46RoJGJlZujrJSWj5ScnpSgnpuYoKGVmp6np6SipLCypsHHw7CwurbFxMK+zafHw8fDvNXRzcTKiHRzYlxaYFtNSkJMQEVHP0E/Qjs6ND5BPD01PTY+MzMzMjQxQTE3QEJOPkdAQ05DQT1DPTs4NkNDNUJJQjo4Nzg7NUI+NzlWS0RXT0Y4PTRLQEM+NEVLSE4+QUE2QkI/QlNFNThQMTQ1Ozw4O0Q+OUxqal07V1JkS2daVU83OUdFP0NGXGZGYGlnWl1bk4yMiHuHi4aDjHWGkIqBb358gn9xfoF6lXqRlJSYkJOVp7TGyb/CzMHDuce8uq+rubuXsra6ssCupcCkq6+7vKqtq6KinaeqrrSwqpufqpuhm5WfsLSni6K6ubXBu6upnLKlpKiUhY2pw8SkgouPh4iEhpWUjXqDjJGOkaGMjJSRj4mXn5eTmZWXpqCunYyqnI6Wj5KRlZWOkJWRj6GUhpefoLKelJqUoKGZpJ+aoJyglJiepqSmp6SvraXAxMOuqLe1ycO+ts6yxL7EvLPRysjCtXR5bVxYXGpTTUhETEtLSkFBPUNEPDVBRDs6Mz04QjMzMjI2M0EwNUlFTT5JQEhSQEg+Q0A7Pj1GQTVBVUA7OTk4PDdFPjg+VkpDV09HOD80TEBCOzVKS0NMP0I/PEJGPUFITDkrRzwzNjc0NjRBPzdPYU9hRS89PjZrbGpgQDpIPj9FQmZaTWVcZlRjapmNl4qMiJKQhol5hpSQgXKAfI1/eIeCgpB5jaGWqJqamLq+yMjKwdLJysLMvcGzrLu+p7q/vbzEt6zBqayyu72qsKmjpaOsrbOttrWgn6+epaKYo7S8qZuovMGjtravq5KvrKusl4aZqaalkYKMk6WViYF1ipJ5hY2RkJ6fk4+Ui5CNlKOZl5yVlKOeqZ+RpZqMj4+QlZaIfY+VkpKjm5Wgopy1ppCel6Wko6WenqaYnpWXm6WjqaiisqyovMDEr6Wzt8zAua7Es7u+wriswsPCwJhteWFYV1xbS0tNSkZERElCQkFDSzo0REg5OzQ8N0UuMTIzNTJCMjZTSE48SkJKUUVLQ0RFOkVMQjw3RVY9Oz04OT88ST86RVVJQVdRRjdBOks6Qjc5Sk1CSUBDPjxERzxCQ089MjBIMzY2MTcwPUI6PWpqSks1UVMzU3BwZE47RD1ARj5qSF9YYVpkZFaej52Nl46ekomKf4mfk4R3hX+Vf3+QiIqQf5Whmq6mo5jCvcjDx8XTzc7Ny7vCt6+6vbS8yrzDwbW2vK2zv7m8rq+ooKintq2tqbG3mp6toqehnau3t6mlr77Dsb25s6eqtLOtrpaWpKunoJGOkrHFp5WOfJGVfYeRmY+qmZiTk4+TlZOlnpOdmZOho6KcmJ+Zi42Qj56IWpCXl5KWpZllmKOesqWWopasraunm5+ml5iWmZWhpKmmn7arqbq8xLWltLbLwbiptqyyuriuqLi6vbiDbG5aV1RVTkZKU05LP0JIRURIR0c5NUZNOz43PkFKLjMyMDI1QjU1UFZOPExGS1JMT0hHST5JUT86OElTOzs/Nzk+RExCQEhTS0BXUEY6QT9HNkE3O0hNQ0U7Qz00RkU6QkFCRzkvOkEzNjAzPkdEOTQ9dGRNRztFKzpmfGhXOz1AQkZCcUZpSVJlYkxGpZSclqGXqZaNkIOHppOIgYeCnISDlZCQlI6aop+vvq6hxr3FxMbGzs7O0sq+u7axuru8vs62xL23ubeysrWzuLOsppyrq7iqqKevsJejrqSnpKS0wLCqrLO+wrnAubOnuLS4sq6VpKyurqSLk5WhjXTBmn2WmYSOlpqLsZWamZWSk5mZpqOVn5uWmqicnKGgmouNkJadYEqWnJqVmqWWVJawn6+cn6WUr6+sppqhppSTmZmOnaCnopm0qaqzvLy7q7Cyx8C4paurrbGxo6GysrSkcW5mXFpOUEtEUFBQUTtHSklHSEJDPjlLVT9BOj1FTTA3NTQ0OkIzNE5XTzxKS05VTlFKUEhISk9CPD5NUjs+PTg6PENSPkRIUklCV05JQENBRjM+NThKS0NBPUM7NEVBOkE/PkhANSpCNTIsPmNdZzozNXRkZUBSNyYjM31pWDs6QkNAPVFFV1JzYldGSKqXmaCiqK+ZkZeHi6eWjoiShZ+HhJ2Xjp6gmqOktci0qca6w8PHysjIzM3Gvrqyrrm4wMHNtsi6wbm2urGvrrK0p6ObqrO0qqimrayZpK6lpKisur+oq7a2vsG/vriyssOxub2so660rLiliJuXppt2vqCEmJyOk5mai66XoZybl5Wbn6GpnqigmZqpmaKnnpiQjZGdg252kqKalZ2inpCtsqOrlaiqmKuupaSfpamTkpmciJWcop6Xsaapq7q2vrOyrb25tqCjp6ilp5ycrKmpjGNlYV9SS01HSE5JVUw9TUROSktCQ0Q8UVU9QUFCRE8xOD03Nz9CNzVVWE4/SE5RWVNQUVRKUUpKRUFFTVE/Pz04PTtHUjxFRFFCR1lNS0FIREU6OjM5S0lCPkNCOTlDPjxAPjs7RzctMj4tMYJoTnpcLzBraGA8PUJCODZ6Zlc7Oj0uLlJgTVVIf2VeSEWrlJyhn7uvmZSejJOqm5GSk4mrjYeinoykrZSjo7bGvbTBusLCx8jFwc3Iwb25sq+5tMDCyrXGscG8tbqrqK2ssKOimaq0uqappquqnaivp6Oqqr28p6y8s7e9xry3tbjAsL3As6i0tqu+pY+il5Gin7yfiZmgmZaenY+3n6mcpaObnKGaqKWzoZudpZyoqp6ZlY+Um4uXiYylopSdop6gtK+lpZOwq5mrrJ6epKOpkZWVoIOQnp+clqmkoqG0tbu1rai1srOenKKlmpeVmaqhnndhXWBdSklGSE1RSU1FRkdCUkxJQUVHQFZSREg9QUdRMTtCNzpCRjc5XFlLQUxQVFVTTVdSTlVKREBKSk5POUM/NT08TlFDPz9QP0VaTUpBS0RHQDUzPUlHPz1FQTk3QTs8QDw8M0A8Lyc7KkiRQjpTSjAsW29XNzE8Kh1CgGRUNDktMTpnXEZDQ5xwYkdFp5ekn5/DrJuXpJeZqZyWm5qPqpaWp6aVra2Zoau2xMK7vrfBwsDHw73Nx7u9ubKvuLO/w8i1v6+8trq3pqOqrK2goJqqqsSipairpp6rr6yiqai+uKatvbC3tse2tbm4v7C+wba0srSvvaOWo5aTm5Sun5ChoqWjo5+QvaWpnamsnZ2hm6afvaKZo56iqauhnZaNlZ6TnoePhI2TnqSgnbWsppyVsqeZsKefmqqeoI2ZlZ+EjqGam5OlpJqYrLG2sqqlqq2snJigoJKOkJapn5RoY1piXU5JSEtPTEhFRElBPVBJQTxHSUhbUk9LPUhPVTRCRjk+SEc1Q2JbS0NOUlVXVlFYVFJVSEA4UVFQTTpHQDRDSFFTSUM7Qz5HVktDQE8+SzwwNjtHRj47RkE1Nj85Oj85OzE1RDAtLDBNdlw0S1o1LE1uVzwtPSkeI3piUTVDS1E5b1JGPEt4ZWNXTaKao5yexayhn6ydnK6fkqOelqWgp6mrl7awoqqytcTCvb+2wMK7yMK9ysi2uLW0sLO0t8HGtr6wuLS5tZ+mrKqrnZ2epaPBpaCpraCkqa2voqanvbWlsby3trXDsrO3ur6xw8C3t62ztLWinKSVkZOgraCYoZ2oqauimsOtqZ6srZubnpmmoL2hnaSYq6uspqGZjZqfkp6Jjld/lp6loaC4qqeTmLajn7OhoJuvl56OmZSdgo+fl5aOoqSVkKWusqupoqKmpZWVnJiLj5GTpJ+JYmVbZGBMSUpLT0ZFQUZLPj1KQjk5SktOXVFRST1MVlw5Rkk9RE1JOEhjXExDTFBTWVlWV09aXklBPVdRSUs/SEA1SE1YU0hBOkBBRFBIPz5RPks3MDk5RkU7OEc/LjY+Nzg+NzcvMT85MSUxUVVtW0pPMTA9Z1dEMTc9LSt3YFM2U1prV3NIRTY9dWVcS06en6GZnsOnpaKzoJyyp5OrpKCkn62prJ27sKistbHHw8HCs8LEvcbDvMTKvK+xtq2wta+/xbW5sbC6tayaqLCpqZqdpaGnwq2brLCcqqKusKmkp723pra6vK62w62zs8K/scazurartLWtqaGllZWUo6uhnp+aqKuwrq+7sqagqamZmZiToqS4oKGkkq6vrKWnn5KhnpWej5CNlJ2aop+ntKanjZi0nKOvmp6brpGelJeUmoCSoZaPjp+hk4umrLClp6KcoZ6SkpqThYuSjZyegGJmW2hmSklMSlNCQ0BJRzs7Rz85OU5NVV5SU0o+T15dPUhQQkxMSTlOZF1MRUxSVFlbU1VPXGJIQT9aUUFIQUtCN0ZFTEtOPjtCSEROQj07TkBBMy85N0NCOTdGOys2PDQ2PDM1LS80QDErJ1Z0U2VPPzEwNGJbTTIzPjA8dl1eP1tVXmZyQDg8SJZ3ZUE0n6Sfm6DDqKSqsqGjtamVsqunoqSyrK6pu7KssLW0xr/ExLXAxL3Iw7bAyMK1q7WosLiswMS0t66strmlmauxq6qYn6aXrbu1m6iwm62frrSxp6q6sqe5s7eyuMCqt7LCvLPFp76urbe0qaeroZaWkaWkoqKXmKSuuK2xtbagn6ikmZWVk6Sgt6KkpZausrKmqqahnpuampaYqJ6emKGer7Kipo2XrpmlrJeZnqWRm46TmJqFlp+UjJCcnpSLqamqoqegmZ6WjI6ZkIKGlomUn3lkaV1rak1QTk5UPUNBTkM6OklANzdRT11eUlZRQVdgXEJKU0hWS0g6VWVdTkZPTltXW1JQUVhdR0FCW1BCRz5OQzlIR0hOUD8/Q0lCTEI8MklBOTQxNzdCPjs3RTcrNjkxNDgwMi0vLjw2LSNCcWdzazIzLzFbYlozMzgwNnBbYkgwNUpwaVZDV0aMeWZDO6SknaGmv6aor6+gqbWqnbmvq6OqtLexsLm3r7a4uMW9w8e9vMPBxsC5wcbBuqq2pK27rcHDuLiqrbK7opWtsK2ylqWnkKq5qqCnsJ2qoLC0sqqptrWsu6yysrm3rLmwwrq9vqbCqrC3r6mqq6admJiqoaGgkZigsK+zq7C5mpupoJmWkpemobeppaKir7G0q7Koq5+boKCbnqWboZedo7Owmp+Qk6WaoamalaKflpiJlJiTlpedk4iQm5mUj6mop5+jm5ebk4eOmYt+jZaFj5traW1hbG5XUFJaVEFDRVRAOztJQTc6WFBkXlBWV0RZXl1NTFJOXktKPlpkXk5IUE5bVVlQS1NXWkk/RFhQREY+Tj89SUdHUVBCPUNGQk0/OjJEPzc3NTQ3Pz05NUU0Kzc1LzI1MS4tLiwxPionKz1ccD0+MS4xZVtkQDE2NDdnWWBGKD84bH1oW1Y7iXtjQz2nn5yiqb2hqrCqo7G4qaW0s6uhrbW9r7O4vLq9trbAwr/JxLjEwr/AuMS+wbevtairt7K8v7+1qa6xt5+Xq62orZanqI6nu5+lrbOeq6KxsLOsqbaztb2tr7G1rLC1scC6xLarvK+xuKusqaKxpZ6kqZ+jl5CZn7Kqs6mqs5mdp5ualY2gpqS0rqehrKytsaezrbKpo5yfqKOdk6CYm6i1qZeZkpKfmZ+hnpCsn5iYhpWYi52anZOKjZaXmpempaOgnZaVl5SBj5SFe4+Sg4yWZmxyZ3ByX0dZZlZEQ01YRFo5SEI2Pl1RaFxOWV1HW15dTk1SWGRKSkNcYmBQS01OWFdYUEpWVldNPUVVSkVEQU0/QUZISFFQQTtGREZLPTg3Qj02ODcxOT48NjVEMCs4MC8wNS8qLC8tKj0sKyUyKyo1SzEuJ19fYVUxNTA9YFZeOClDM1lVXGdLNYx6ZkxApJmgpKy3pKyppa6utqmvs7mmprC3xbext77BwrW0usW+zMW4wr+6v7rEuMG5srWsqrq3urq+tKqusLWYmKerqqubrKuPq7ydrK6xo6qfsK2zrq62sbm3qa2usae1r7O7vMmyqrW0sbSvrqags5+aqK2gpZWVmpmxo62fpa+WoaSZmZKNoqWnsqmhprGrqbWlr7G1r6OZna2nmpeemZmsuKOXk5CPmJyhmJeUrJ+dlIGTmY2dnZqWkIqTkp6apaGhoJmWkpOWe4uQhnuMioOLkmtueG52fGFGYWpZSUhZWz17SkdFNkFiVGlaTVxhSltdWlJSUmJgTEtFX2FgUExJUFdWVU9HV1ZVTjpJVklIP0NLP0VESEhRTkE/SEhIRTw3PT46NzU2MDk/ODY2QiwtOCwvMDQsKCwvLSo3NikoOS4kOks1LiJUYFVgLzUoQ15RXC4qQi9KR1BbSDNjWVVLRJmWoLCosamspaOurrWpt7S4o6u0t8m7tLu7v760tLfDwc3Hu8O8tr6/wLi/vLG9rqe6ube3wbarrbG4lJemrquno7KplK+7pK2ysaenorKzsLKwtLG4s6muq7KnuK+1s8PFtqi0tauwramnorafnqaxoKSUm5mUsZ6nm5+pjaminZuVl6WlpbenorGzq6exqK6wtaykmaCsqJubnJuUqbiclI6Oi5mcopiQl6ahn5aEkpaQnZyYlpaIlo+Xm6eco6CSlpGRl3aEkId7hYGEjYxucXd2fH9dTGVsXEtOY1w/YntHSThHZ1dlW0xeYk1YWVdUWFRpXU9PSGFeX1BKSFFWVVJLSFdVVk04TVpORUBGSz9IQkNLU00/P0xPSEA7Oj47NjswNDE8PTQ1OD8pMDcpMS4yKSksLC0rLTkkMDQyJTlCNy4jQU5IZjI3J0ZhTFYlLUIuPUVNUTwzcmtKREOQmaWupK2tq6eksLKzqrewtp+rtbnJua7BvMK3s7K1wsPPxL/BvbS9wL+6v7yzxKipubC2tr+8r6yzspygp7CtpaawpZ6yta2rsrCsqai0uay0srWttKypq6isqbmtsbDHvrekua+pra2lqK2wpaOjrqOpnJ2cmq+ZoqOio5CsnqOfn6Gqpaa5pau0tKSpq6msr7auop2jqKqbn5makqS0mo+JjYeRoqCWjZSeoJSThY6Ukp2bmJaVh5eSlZmmm5+fjZKRjpF3fo6FfHx9h4qKcnRyfn1+XFNkb15OWmZdRkSWW0g7Tm1YYVtNYGFOVldWV1RZZ15RUkxjWltUS0dPVFNOR0lWU1xOO1BeSUJESEpBRT8/S1NPPjpOTUM8PD45OjU9KzMyPTYyNDk6KDQ1KS8sMSgpKywtKiY1Ki8mMCkzODoxJiozQmM7NipIZEhKKzpJPzNCSVMsPo9rPUhIj5uqqqKpr6Soo7K0sbS1sbGhq628y7quwLvHsbSttMLD0cXFvsCyvsHCvL+3vMSnrbess7i8wLCrsq2gpKetqaiksKOqsaqvrLCur62rs7qmtrCyqbKpq6alo626rKqxwrm0q7moqKitqaixpamkoq6qqKKem6KslaSdl56Yq52hp6mhrKWjray3sbGgqKKgq66wrJ2fp6ipmaSYmY+gp5iGg46Ji5+hj4uMlpyPj4aHkJWgnZaYlYeWk5OXpJydnIuRj46Kf3+Ihnx3f4eFh3Rzcol2bF9ZYG5jUXNxXEs7hHxGPld1WGBZTmNcTVVWVVdQXGJeU09OZ1hXVktHTE5SSEVJVlJdYzxQXUQ8RkhIQkc/PUpQTDo+T0o9OT89Mjo3OyozNT4xMDQ4NSg1LyosLjMwOyksLCclMjM0JCwyLTg2MCkoMTxdSjAuSWdERjg8QjA1RUtYMUCUWz9NRpWYraeiqrKcqaivtqy4ta6qpauqvcm7sL64w6+xrbPEw87Ow76/tMDDxLrAtMnErK+3rrK5wL+0rq6rpaeqsKmnqLGltK2rsK6tsa+zrLO6pLizrKyup6ugop6wt6uqrbq2pLW1pKmnrKyqraGopqaxsqSmpaGhq5apoJOaoKaepKKqpKyin6ext6ysoqSim6mqramcoqWkpJigmZaPmJ2TgYKPiIWcoIyKjoyZj5CLhI2YpJuSkZuMk5KRlKKZm5mKjouLfIaBgoN6dICEgn50d4ykh3lrXmBuZ1dlh2ROQGeSTERieVdiWFJlVU1WVVVUT1xdYVVLTmlXVlZJSkhJT0JHSVNRWW9BTVhAOkpHRkVHPj5FUUg4Q0tFODdDNzI6OjoqNDk/Li80NjMpNCsqLCsuIzQuLSsmKCs3OSomNis8LTIsJjA2V1ouMEpnQUE8PEMrOkpPXjREhkBISESXkq+ko6qwl6qorLWrtrGrpKuqqbzAwLi5s7y1prOvxMnL0b/Bu7nAv8O5wbrBxK6xtbKzu8G+s7GurKurqLaqpa2vq7mvqLGxrrGrtaq2tae0tquspKmqnaOds7OoqKS0tKC1raGpqKuprKegq6youbapqqmpoamfrZuRqKGdoKSipqKpnZymtK6npamio5ikpqapnKKko5+ZmJ+Rjo+Zjn6Hi4aEnp6IhYuLjo6QjYSGlaOajo2bkZKRj5Kfl5iWjIqDf3SGgX9/eHWDf3t4f4GInY9vcWdncXhcYHOIak9dmFZIbXhVZFZRYk9MVVRVUE9YW2JVSFBqVFZUR1BZVUk+SUhPUVB4TE1WPTxLRD9AQTxAQ1VDOUFLPTU7RTEzOzk3KjQ6PSstMzQxKjgqKisqLCkqKC8qJiklMzssJDIpMjAyMSUvMlFjMDI/Zj1OWD9DLD5MVF8vSms2UEU7lY6woKWqrZmrpKyus7SuqqWvqam6vrvAsa+4rqK2sMnHyNDAvr27vMK9usPBwL+usrKytb28wrKys6qzqKS1qKSss7O5r6OutrGvsbmquK6qrrasq56qrJ+joLatqKGer7OhtKqeqKeqpKqhoaytqL2vrK6soaenn6uYj6+imKKgqKeep5uZqrCpo5+soqGToqKjppiZqaWXl5idj4qHlYh9jYaEhKSWhYKCi4aOjpGEhZSgl4iRnZCTkI2RnJSWj4qFhXh0gX99dXh5gHt0c3ppgoejdWleZWyCdWeIjH1SWHBeSnhzU2RTUV5NTVJZZk5MVlllWUZTaVJSP0JOUWFROklITFNJcVFMUzs8ST87PD07QEBXPDw+SDczQ0IxNTo5My01OjopLTMxLS02KSgrLSw1MiMyKScsJS47LiYxLjAtMTQlLDBMaDo0OF89YWQ/RjFDUFtbK0hPOlZCNJCPsaCkpqujpqSsprSzsKmjsKequL7AvLCouaqnrrDJxsjRwr2/vrm+v7zJvMK5sLC0sbq7ucGztLusuKyjtaamq7G2ubKnp7q1rbW8r7ylra21q62cqa+jn6WsqqecnqqzpLOomqqnqaSpnaOpqKm9rLSvrp2po6Cum5qyo5Wkm6Sln6SamqirpZ6bqqGbkpugpJ2YlqmpkZiZk5CKgo+FfY+CgIiej4Z/fYuGkI+QhICTm5SFk6KMlJKLkZqRlIeJfn9xenl+fGl3fHp1cXF9aIZ4hIdkYGhjcoV6bWd5XV5WQld6bVRhUFJZS0tOcXRdSFpbZ1lFVWZQRD5LTkRDQTlIR0tTP2phSVE4PUg8PDw+Ojw/VDY6P0M0NUg+Mjs1OTAyNzw1KC41Ly0xMSYvPktIMSUaOTAlLCwwOS8sLCs2JzE3Iy0vR2pJMTRYPWZiQUo3R1NgVSo9O0VaPyqPk7GZn5+opaShq6S3srKkqLCnrLjBvbWwo7msqKiww8nJzMG2vb+1t7+6yLbDtbSztbG9uLq+t625tb+tobOmqaqvtbi0qp67u6iyv7K6oK+0tqmsn66wopylqKminpyksaavoJ+qqaiiqpujqKCtvKiusK6hq6Kjrp6erKaXnpqho5yfm5qjqqKamqSklZaUn6GWm5amrIuekZCRjIKLgH+OgXualI2JfH6LhY6PjImFkpiRh5SjiZKSh5CZj5OBiHx5a312eXhie3pxcHFzeGmBc2qDZ2RoYW9zjm1ianBgcEFceGtWXk5QUUpKTVNZVk1dXm1XRFhgT15QSE1ERjs3SEVLTzxyaEpLOUFFOzs9PTs7PUo0OUI8MztHPDQ/MTgtNzg7MigwOS8sNS4uPS0qSz4qHTQ5JicuMzQuMCsvNCYsOiQ0MEJoWTEzUz1lX0RMNktXZU8pPDNQWz0jkpismZ+Xp6Sin6ikuK+uoq+vqau4wrqyrZ+4r6uotLrHy8e/t8G+r7S+t8S2w7GuubKywLW7vripube9q6S1p6epsK25sKmaurykrr+0tKGut7Wnp6ews6CfpKanoKWZnq2nqJ6gqa6noKaXo6mfsLifpLGvoauhrKSbpqapmpqbnqOVnJyanammlpufqJKYk5idk5mVoaqQmomNkId9h36CjXx8oYyMiHmDjISJjI2Eh5OajomVn4mRlYKLloyQfYR7c299cXN0YHl4aW9wcW9qf3JkemxpZmRhZoaAYFtzanJNTX9pWFpNUExKSFBSUElOXF9vVERYWlJnT0hLRUY1NkhCTEk1WmVKQDZFQjk6Pj0+OjpDNTk+OjNARjwyQDIzLzo7ODMmMjwwLDg1QiopLUMqLDQ7Tk5AOzczLS4rLTcqKjwlNTM9ZmQyNE0/ZV1GTz1SWmhIKj8wWlk1KJadpZiclq2gn6GkobersKO0tKmoucW2sq6gt6ytrLC1xsjAt7/BubC0vbe/u7+vq72wtL+xvcO6qbu6t6eotqimqrCss7Cmmry3pKu7ta6fsLivqaanr7GboaSgo6OhlpyvpqGfoqevoqCik6Olorewoaaxq5+soq6YnKqkqJ6Xmp2kk5qcmp2mqpmcnKSVlZeVnI6Tl6KpoZCJio+FeoR9hIp5jpeKjYZ5goeEiIyOhIyTmYyOlpmKj5Z+hpeLj3qAenByd29vdF94d2RsbGxqaYRuZnNpa2ZpXWRzgWBba3VpWkl9XltYT09LSEdSVUYyOV5ebVBEWFZZZU1JSUVFMDdGP0tCNklKSDs2Rjk0OT49PDk4QDg7ODo3QEk+ODw0LTM8PDc1KDU+MSw7QTEoKzY8IzhSPSoxMTM+RDUsLSc0Mio7KzEzOWNsODRHQWZbSFREVV1oRS48MmJVLDKWo6GXlJuqnaShoqC3qq6gurimrL3Fs7Cvo7Wwra2vtcTEvLO/urews7m4uri6rq2/s7S4r7/BuKy9urWmorOqpqiyq62xoZvAtaSntbWonrK8qqimqa+smaOnnKOmlJiisqSZn6SoqZyioJOkoKS4qKSnrqaepaCokp+ooqGgmJudoJKam5agoaqbm5mhlJGUlpmNlJKjqKSQiYqOhXmEe4SGfZ2NioqGeYCEiIiIkYSUk5OMkJWUjY6Ue4OXjot3fntsdHJsbHNheHRoaGpnZm+FZ2hpY2ZpamBpYmpnW2V7Y2BTc1RbW1NLSkdJT1NAISppXmpMQ1ZVXmBLSUhFQy46QjxGPDZLUEQ4OkQzNTc9PTg5NT86OzQ+OEBLPT45Myk4Pjw6OSo2QDMuRTQoKyw+MC1OPy4rLTcsMTE5NSwmLjUtODA1NzZgdEIzQ0RnW0tXR1VgaEIzNzllTycynqOjkY6jp5udnp2jta2mqrm3p6zDwbawrKO1rqeur7fAwLyywbaxrrK2tri3tqypvbOvsrG9v7iuu7yxpZ+2q6WktKmrrp+ewquopbCyqay0u56pqquxpZieqp2mpJGZpq2imJ6kqaGcop2XoJ2ntqavqq+hoJ2doZSgpZ+hoJmbmZySmZ2UpZ2sopiWnZSTjZWXi4+YmqigkYiJi4h5hXeCgoGciIuCiXx/hIiGhZGDlZWPjpCRkZGNknuDlY2Fc319Znhva2psZ3Vza2NnZGR1gGJlZmZlampka3FaXlldbWRhTmhXWmBWSkdJS01SWD45X2xpSEJUU1xbSUhGRUEuPD85QTg5UkdANzpCMDM3PTc2OTI6PDk3OjlETT1CPDAqPEA7QT0tNUIzNz0rKiwwQSpKSy4vKiszNzIyKDU3JCs3LjcyNjg1XHlOMj5IaVpMWUpWYmZBOjNBZ0glNZqjnpCLrKGYmKCWpbOxorG9t6Gxxru5sbGktqurrqm5vbu7rsCyr66ttq+zuLOoq7mxr620trq2sLm+raaetaugoLClq66epMKgsqOusK63rbWera+sraKZnKeppJ6Vm6iln5mlo6idmqCblJydrbCmuaiuoqCamp6ZnqOapJ2XnpiblJqgkqiWqqeak5qakYuVmY2UlJmpp46NiomPfIJ0goGKmIWHfImJhISKjIiShJOckpKPkJGWjpB/gIyNgnCAf2Z5bmhramdxcmtcaGNjc4FhZmhqbmxna2pnbVxsbHVxYVRiaGRlWklGTE1PWFFRVmFlgVRAVlNZVEZIRkVALzw9Nz82PEZOYTg6PzI0OUAzNzgyOD83PTg+RkpARDkyLT1BPUE9MDVAOUAxLSsuMzw7SzYvLissLTI0OzYjMyopNi41NTQ2NVp8XTE5S2pbTVtLWGRkQEExSmVDJzSSoJqOjrCdmpOhmamysJ+4wLagtMK7vbmxprawqK6kt7i3t627r62qq7eqtLmupbO1sa6psbe2sbO1uqepn7apnZ6po6qtnKnAma2jrq+1ta2tn7Gtr6mim5yjq6iblZyno52aqaKklpqgnJCbo6uqqbufqKSfl5qZnqGPa6KWmJxxgpabpIB1kqmnnpSUnpCIl5mAloqhkHiGlIyDbmp+d4NxbIaLhn2Ei4ZvXmNgZ4SXhmuLkJSTdXeLhH6Dj39nhoBodWlmV1xoc25OUGpjZ3KEZ19kZm5sal5gYIqQhIZnT0tEOEZUZ15KR1FQVVVLSFNhb3RlRltRVVBGSEZDPjE7PTY9NjwzZlw1Ojw3NTtENDg2MDpCNz86PkZMQ0IzNDM9QEBAPTI4QEU9MSwrMDg+RzYwMS4qLiovNTY4LCMxJzIxNDoxNzZYgWwxNk9rW05cS1tmYj5HMVFkPSsvjKOZh5Swm5yToZuqraujvcWvqbfCuL29rae2sKWrpLizsrOxua2qp6y0prC1o6i4trWop6y3s660rbOjqp+0q56hpJynp5msu5Wmpa+yt62upaiuq6yloZ+coKemm5ehpaWbm6ennZOen5iQnqiqo7Wvo6Ojm5aXmJejiKGOkpqHoYeUnaF/pX+mqp6SkZqRiINyeI2OhYihdomNaZeIZn1zeKFviIeEfo18f6Ggn5mAe4eedIiOdpuKbIeBg2xoZWN6bHFiVIZtY2xpmHFYanBvh1heaVtra1uIcW56coZoh4RaXkZNP0dfTUZSVlZRUVJXVGdeTVhKUlJPRUdHPjw0OT05PDc7MDw8Nzk5OjY9RjU4NjA8Qjs8OT1GUUc9LjU8O0A9QD41OUdBODIpLjE8STkvMDEuKi8oLTQ1ODMlJjIxMTU+MTw4WIN1MjVSa1tOXExcZ189SzFXYTcvKIyml4Ocq52ZmZ2fqqqnqb/DrrG6vLfAv6qlt7CprKayta6vs7arqaWxraW1s5yttba0pqeps7Gtsqivn6uhsqmgo6OaoqOcrrWVpKSltrymrKeqqqyopaGgmKCmo5mZpqOkmJykqZaUopyUk6SlpqC2o6Ogo5iUkpeTm4iuj5iUiamLl6KbhbGAo6ydk5mdlHmC1Kh/h5XBm8d5eLGlt5dkgMCcv3mEhHmQhHyQkJHKcZa8nMV7cranupB6gWyWsauweWhrWLGubmVpvJK8bmh6bnKP2H5TamK2sn+BcpR1mqGqkFdPV2FPVk5GVFtYUVBSjFxXXFBAXERRTkVHSTw8NTc9Ozo5Oi49Ozg3ODs5PkY2Ojc0PkA+Njk/RVJJOi41PjtCPD9BODpKPjUyKjIyQkUvLjMyLisvKS0vMTg2LSAvNDE2QTE9OleDdzIxVGtcT1tNXmdcPkwxW100MSGNppOBpqmfl5yepa2yqLDCvbK1wLW3v8KrprOsrKmnr7Oqr7azqKimtaanuK+ds7K2qqWkp7GurrGmqp6npLGkoaCel5ygnq+tlZ6hn7S6oqqooa2upaKdmpmhp5+Xm6egn5iep6eRnKeblJ2hpqKgr6Kfn6OWlpKXkZiFr2pqio2qfmeElYetZHCdnJOZpZRxrqGkfni7fWuhj3axX2q0W6WAZpyRYGaCemZ/anhqqWW+cmemjHayanyxeHSSk2NtbadtW4SgRWhnh5ZFdZxgfWh8pKeCWV+Lq2mAlXh6aqc3Sq9bV1NtY1tLT1hfXFdWO06IT1dXL0lUU0lERUY9PzQ2Pzs4OjkwPTg5OTk6PTxEODs6Nj1BQDY8QEhRRzkwNzxBQz5ARDhARz0xMy0zM0UzLi41My8rLyguMC46NS8nJDIwM0IvPTtVgnYyLVZqXE9ZTF9nWTpNNV9ZMzEbkaKVgqynpZ6jpaqyt6y0vb6wtsSyuLvCp6mwq66pqbCupLC6r6SlrrOjqbmpnrOysKOloKqtr6ywpqefo6Kwm6Kbl5WXmpytppeboZ60s6Grm6KtraCempagoaicmJ6koJyZoaekkJ2jmpegn6ufpqafmp+hlpWQlpCZhbWbtXiFqZm1mXeHs5u3fpOVlqiUfmuBpnqChoiSlJJ3q2drsVuse4+HlHSIcY+GgICIkJd4g4KLl4yDoI+EsHZ3n3Fra2x8i06kWEhjY5l+Y2imYHlydVOSh15QqW1jcX6HgGKdLlGibltTa2hgTEtcZFhcWkI+sHhXWEEjTWhFQ0RBQEExOT44ODo4NDs6OTw5OkE6RTo6OzY6Q0I4PT9LTkc6NTpBRkJAQUQ8RkQ7MDIwMTtGLDAuOTQwLC4oLzMsPjgzMR8vMi1EMTw8U31uMytYalxPWE1fZ1c3SjlhVTUwG5WflIizpqahrqmns6ypu7bCsLvCrbi3waqsra6upq6yqaGvvKqhp7StpKu1paays6ejop6oqrKosKilnp+fr5afmZWVlpieraKamqOotK6hqY+pqKqbnpWXoKSnmp6do5+boKOlo5Wbn5ianaKqm6aZm5uioJaSkZOTnIPVk5m5cLDCfsaGfNaUm7t8mZWkj42cjaR7joekgqWCeqx5j51Wr3uJfp9quVq5d4aDfKaCk3yYeqp5jZyQe7FtjoR0kLyFb5RQr6fFilGgemNgqmJzcohtl4hgU7W0yIaAiXxjpDNCnXZdUWpoZFBAWGdaZGFKSE1sS1tTT1lmWkNEP0U/MDw8NTk7NzQ8Ozg9OjxDOkY6Oz42OkBDOzZAT0xIPDo8REhDQkNEPEVGODEyMTFEQy4vMDQ4MystKS4zMjM5NzEjJTUqPjM9PVF3ajYqWWlbS11PX2ZUN0c6YVE3MiWbopOYsaiopbSqpbSopLy3wbC5wLG2tbyztaexsKOwsqafrraom6i5rqOvsaCztLCgpJ6fqKqxqbSppJydnqqXmJeWl5WWoaudm5anrbCoo56PrKKolp6Xm6GloZihoaKhmqKip5ueoZ6VmZumoJynlJuan6GYj5KVkZ2Ism5otXGrh2+OpnK0c3K2e5mXo4uOnI2ifpGhpX6wdoOR0tF2XK58hn+kb5uqpmuGhHytfZeZj3uxc5Odj3mzZZZ0hJ5vnmaUUsiLWsJcn3liX61gdnOHYpeIXlnKnW+/gXVNS7VTVcZkVFFqY2ZYQU9rX2xoT1VHSTk9V1JbV1hIQz9KPDI/OzU9PDQ2Pjs3Pjw9QztHOTtANzs+RDsuQ1JKRz4/PElKRkNFRD5ISTkxNzQ2QT4vLjI0MjUyLSkuMjYsNzQyJh82MDs1Oj1QcWg5J1dpXEJPVF9lUDVHPWFNNjIwoZyRpbCtpKq7raa0pae2u7yyur+3trW6urOltLShsbGin6ywpJimuq6ksbGdtLiqn6adoqqlsqitqqSanJqonpWUmJiSkqOooJeSpauvpqKWk62fpZKUoZukpp+UmqamoZqjn62aoJ6dkJaboZ2cpZSclZmin5WZlpKbhax7d6h2o46Jh6lvrYqCp4OYmKGJkpqKon+TmYmuhX+Cs1xys1KufYOCpH9x1313hH2OnYeZmXevhoqRnIh4s2GaZZqBgpRsklqwWEuadZh5ZmCtXnd3h2iYiGter3eVno94bDV5yK6yX0FUb15nYEVQbF9wbVZVTS5lY2lTWVE6QURATDo1PzkxPTwxNj85OEA9OkM6Rzs8Pzo+PkU5LUVVSkVAQzpNS0pCSEc+R0s5Nzw0Njo+LzA0MzMzLjIuLjE4Ki4zMiUhMDM3Njc9UGtlPiZWZ1xAPlZfY042R0NgSTk4OJ+dlKC4sJe0wa2osqiqsrq4tLi/ubeytry1pLezn7Ssn5+oq5+Vp7arqLGxq660pJupoKCoobanpqqjmZ6VpaGUk5uZkpSipZqTkKasrqaglZmpn6KPkaKZqKWglZmlqJ2cpJ6tnaGdoI2UnpudoJiZnJWXoqCTmJGmnYapfX2leKGPjoOqcK2LgaeGlZ+hiJeXiKOCkYiUqnyAi515b7FaqIKCiKB5dNh/dod0p4GOm42SpHyWkJ+Ee7JenGSgfoOVbJJcq1tak3+Rf2hnqmRye4FrmIdzXaxaiaCOa25lT0pDoVxaTHReYmZNWmFfcnRfSlY2SpqTWUhFPUhGQUwzNUE4Ljs+MDVBNzhAPDY9PEY/Ojw2Pz1CNy5IVkpFQUg2S0lOQElLQEVOOjpANC47PjAwMjE0NCsqMDUvNywmMjEoJCQ2NjcxPFBlZUEmVWZbPzJVX2JMN0ZJX0MxPzihnZmZv6uXtMKuq62ppbSwuLG1v7m6s7G3vKm6tJ+wpJ6lp6eelKqxqbCptayrr6GYoaCmpKS6oqOroJebkaKglZSempSYnqCPjYyor6+mnZabqKafjJKkl6eqp5SXqaeen6CjraShnqGNlaGZn6CSnZeclZ6hlZaPq5uPrm1ytHKpjHaKpnO0eHOzgJGkopGcjYmkh5B3uG+Me4uia2u2WqCFZZeXaaGip22TcrR0k5h/smqFk4ita3WzYZ1mom+HkmqXXK1gTaF8h5FSc6Nten9+b5iHcVyvVjycd2ZUb24uXKdPYlJrZWFtWWJcYXB7Y1RaUT4+bXAzQkJAP0w5ITdANi47QDM3QzU4Pz8zOzxDREJKRk1JRjYySlRLRUJJNklKUD9ITkNGUD08RTUwOzwwMTAvNzUsKyw0MjYvIzAwLCwdMjg5LzlOYGVEJ1VkWT4vVV5hTDVGTV44MUM4pZqbnbqhnLLArq2rq6e3qbivtcC1vLGvubiqwLWpqqCbpqOhnZKqqqi2o7Korqqgl5ynoKWruJ2jrZuWmY+lo5WNnaCbmJyfkJOUq7Wvp5mUnKyql4yTpZmkrKKRl6qypKCep6uwmKGjkJmil6CblpuXoZOcqpyUkauZh9SSmrtzsMOAw4Z+1ZabuHiHkJeMmIqMp4h6o7Z1fXd2woKasmCDunnAfHW4YrWBjIepfZaBrKlxe391vIinoGmdYaaOr6F+jHSHq32+bnO8dLKDdXiBim6aiHFujaR0vV13fVthebxrWlZbanpeamBkZmJtd29ZW1lDQUByP0NHKzVIIic7PzEwPD83OkI5OT1DNDxATlpeYGBfX19aUFBSS0VGSjRITFJASk5FRk9CPEU4ND05MDIwLjg3LSouLzE4MCItMSwzHiw8OjA4TFhhRidUY1g8L1ReYEs1O0xbLTdBOaeanqG8opexw7Ctqqqssae5r7bEsbqyrruwrsCxrKSinqOhnJuRqaSqsqS1pq2kn5aaqpmmrLicoq6YlaGQpaCSjZyjnpidm5CVkq+5sayVl6Onp5SRlqSco6yekaCoq5+bn6iis56ipY6nopShmpyXlqSYj7CgkpSqnoWQmbWAkJGMt5V4gpOatXdta25zbnmPhI6JdJ7Bu72ae4GyqHCAdJG4g3yGhouHjXuKho2XfKS7ub2cdXq0o3R2l3V0sHWZnmaGaY21dHJwd7aMXn96fYlog3lteWKLrHB1hX9ZW6dqRGRZU2ZgY11jUGdmcW11Qk5QTEQ7Wkw+SjM8MCA4PjsuMz1BOTk/PTs8QzZCVFlaWltbWlteYGJgXVNHR0g0RElUQktOR0VPRj9HPDc/NzA3MC85Oi4sLy0qOC8lJjIoNCQoPjcvN0xUX0cnU2JWOCpPXV09KzpWVic9OzynnqCgv6WWs8O0rKunrKupu66wxq+1s663p7S4ramioaWeoJ2ZlKukraqmtainn5uWoKOerKS+pqGrl5SdkKKbko+iqKKTnZeTl5SytbatmJ2jpKKLkpGmm6Wqm5aopKWcmqGopaajqaGSrZ+Xo56Xlpedno+wqZSbp6GOan5pnKZ4h3N+mo90emWHer2+wLpvkoJxlYdfcmpaXpqJYWOIjpVrYH+VY22cdmKUa3+alZRlXmBjcZuKaXKMfYaVZ2p+cnR4fX1iW3d0gWhQXG6DfHuLa1hseoJySUpvhXBNdE1FV11mYExbWGdjXk9bbXVpcVFPREVNO0hJPEw/MiwyQT84LzU/Qzw5O0A7PUM+UlZWV1laW1xcXWBhYWFgXFVHNURGVUVKT0hGUElJSDs4PTUxOi4wOzouMC03Nj01JiIvKjIsJTs4LTdKUl9JJ1NgVjQpUF5MKDM9W08nPzI+qJ+oocGjm7S6tqOtpa6nqLWxrMissLOrtaO+sbKnoKKpnaKbmpmspq6kpbWppZuYlaGbp62ovqepppWUnJWgmpOYpamnkZ2Rj5ecsLK/rJunnaeiiZORqZqopJubq6CjmZujpqyin6qimrCblaaglpWdn52XsaWYoaeYnJGdnKOjmaaimpyampmPloFnbX1xd5KXlJGFirWqjYaYlY+KjJiXh5SVioSSk5GJjZGTmJSYl5qgopqclKGdjoJ6pYVsanyQfIB0iYqBcYJ4eXZ2ioB7iWpzgXSDdWN3fXZrcHttYGNdcGdNWVllal9XWnB6bm1mU09GUzlPWk5STygrOkpCNjM1PUBBOTpDPjxFTlNTVFZXWFlaXF1gYmJhX15eW1RLQ1NHS05ER1BMT0k8OjszODksMjs4MjApNklSTzgiKSsvMiM0Oyo3Rk9bSiZSXlMxMFReOis9OFxLLDwtQLOgs6K/oqSxsregqqWyp6WwtarJq62xpbWmwKe0oZ2kpZyjlZagqqaso6O3q5+Zlpafl62ppcCeq6SVkpyXnpiTlKKfnaKnk5GZqKeyw6+aq5yqn4+WlqmdqpuboK2YoZucoqSvpqGkqJ6tmJemnZmaoZ6enbCgnKKmlZiSmJOgoZWjnpegjpaTioqNjpatj3yVm4KSgouqqIaBmJaKhI+fiHuEkIeFmZCHhomVjpuXjZCYnqSWmpORnY1/jWahs6+FiYR2eo+KfHZ5em9neZCBgIlrdYF5iHJoc396doOIgmt0ZHlmYGlkYmRmallre3BpalxTTFBEX1VGQD8/LDRARjs0NTs+QTs8Pz4+SE5OT1BTVVZWWFpcX2FjYV9eXl1eXVhWSktMQklPTVJKOzw6Nzg2LzI5NjQuKCYkLTEuLykrKjclKzwoNkNNTUQvVF1RMDVNWzE3RTRcRzU8LEC0oLmvvqyrrrKyoKqmsa2irLOwxbCqrKOzrryktJyfpaKhnZmXqKWppqSls7WelZSdmZmwpq6+oKujkJGempmUkZWhnJaonISeqauis8izn6qjqpeWl5qnnaianaOrk56fnaCqrqmlo6uhrZufoKGZpZ6cnp2wpJifqJOYl5yRpJmYqJ2al2aDknxlfo2Zj2N5jWxoa3qRpKtrZZqYfmeFimVlaWh7jqGOa2iMl5Gid2tqi5ijn5lzbG56hIyHelhlXoWBXmyKiYB2XGhzd3eRgIeCbniCeIBzbXmDdHeIiI6De2qGWV5rdGRdc4lpanxxbGNdUU1XSmRYQEo0PUY3P0ZENzE8PT9BRDw8REdISElMTlBSUlRXW15gYWFgXV1dXV5fXVpVT0RIT0tTTj0+PT02NTM1NTU0KiYmJSwqJS8qKyc2KiQ7Jy9BSltKLzdaTzYpRVkvRE8xWUM7Py49pZ+6vLmvrLOxqqWora6wpq6tsL2xqaekra+wn62Xn6OdoZqZp6ucraOlqKmyrp6Vo5Cir6a2uaWuo4+OmqGZk5KboJmYpJV7payiqLPDt6Shp66fnpWeo56jm6KpqZKeoZ6gqq+qq6Oqn6ibpp+ooayWoZulsKSXnKqVoZ6bkqWXnqqYnn6+g4dytHKEnYataHi5xLhxk6Kje6aYmXOqgnzLwMC7cYuih4KffJWYiZ7AvYKWnZ6NncLBe4F7ko2aw8B9a6Wxb4yAb8p6f5t3kYOOgXZ6gX95cXp/h3F4hYyTeW13k2JmX3hkX2WCY150aG1kYlhMVklRWkhPRDJJRT9EQj4vPD8+QEE6OERDQkNFSElLTU5QU1ZZXl9fYF9eXl5eX19fXVxTTVBHVU5BPz89NjQ2ODI3NiomJSMpKiYuKyopMTAfOSojPklbTCojQlAvI0ZbM1BZL1VBQjsvOJajuMO1sK/AqaiUo6+psK6tprK1r6qlpqawq5+rmJqin5ybqqeinKyjpailpLSknaKTpq2st7Onr6KSkZqdpZKRoKGXm5+ch6arpKutv8CxoKmvqZeSn52imaGiqaOToKGdnq2uqKymo6KnoKWlnq2pkaSbqa2qnJ2qnKyhlpellaGjl5x/zpR4eqSBeZWWm1+uj16Op4GioHynlZt0q4OAr15jjap6p4eFoHSXkoizY4KrhqGOjbNqhK50fZaHuGGCrVmjzW6PdXvae3+ZcH6Ik3Z+ZXuIdnZrfYhufoWRkn5tgY9gcWtwZ2BfeWRccWhqZGZgUlRSV15LT0M1QUhFRDg+NjtAP0E7PTdAPj8/QkRERklKTE5QUk9TXF5fX15dXV9gYF9fXVpXT1VKPT8+PDU1NzgxNjQoJyQhJywmJi8oJiszHTYwJDc7U0wrLC1KMCc7XDtMLSFQQEY0LjGtwsC/tbSwt5eekaSqqK2zq6ayrK2spKunsKqgp5uZpZecoq+foJ6op6OmoZ6wrJuelaeurbGqqKyglJKbn6WTj5+ll56oo56tpKqwqMDGs6ipsa6Wkp2copeeqKqflaCfnJ2ur6eqqZunp6Shq5KstJamoqqpnaOnpaGwoZOap5qgmpSUkZegcYWMl3SEqIdxsXydcax+oZ6BpY+ed6uCfa1/nHKtfquHhp92mJJ6fJd+qoiijJGLnX6re4mTj5+Ae61WnMR6j2+SwX2BlW11cIxtZXZlhm9hd25yb4qLkpCDbZGQZG90dXBgZ21lX29paW5mY1dTXWFZUlNDOUlJQEQ8PjxARkRDRUE9PDw8PkBAQUJFRkdFQENJU1dZWlxdXl5cXl9hX15eXVtaUkM+OzkxNDc4NDUyJiMfHCAxJyAxJyAnNB41LSY3PVdKLTwnPjEpM1ZARiEcRzpDMS4rsNTGxrK0n52jjqOjoayvtq6osKepqqiuq6unoqSdmaKVn6arn6GloKioop+dsKyXmpaop6+sqKepnpeUmqOikpShrZudpqOvrKOrtKq6zbGtpq6rlpScnaKZnqysnZagmZ2eqbGpqambq6mjoqybr7GiqKyupZimqqmpsaKSl6OlmpSShKRqpHWJeql0erJwgqWJmYxxiKCah6RgYFKshH+ug5t2roGmhoafepmWhntmgKOJpJmGgaN9qX6BlIeuXnypVZ2ikoF6op+Ae8OvxYxzr7OzuXFiqa/CdGiNjZiPgW2ak29teXh3b2xmZWVxcGZ8aWJdV2BpWFhVTU1RTENDQUI7Q0BAQkk8PTo5Ojw9Pj4/QT04NjtETFBSVFZYW15eXVxeYGFgX15dXF1bU0lCNjc5OTY3NCwmJCIgKCciKy0iJC4hMy0mQERXSCxHKzU2KjFQS0wjIEE5RDQsJ8PJ1tXAoZmrqKGvop6wtLCvqayjqKaqqquppKagm6SenaWnpqOcrJqirKGkn6+inZqSqqS1sK6gqZudlpSno5CaoqifoKacsaajp7GstsiytaqsqZWRnZyimZ+ks52aoJScn6erq6OumqypoqGqo7OtoqqzsaGaqqiur7ajk5ajp5ibkXyqbJ6Eh3WreXywb4Kki4mflpWflIHSuLS4yYCBsl9flKmDpIiHoHmYlZp4qsl0maOVp6mQkpuMf5uJmsbGeGWhgqVzgZ+Ogn2vXnC1Y7F1S6OGbadHgpNkj5Ceknxwl5N/cHt1fXtuW2VqcnFmgWpfYVlkbVxeWUlNTEtFREFCPkE8Qj9KOzc5Nzk5Ojs7OzMuNjxBRklMTU9RU1daW1tbXV5fXl9fXlxcXFxcWE1CNzU2ODUvKSglJiUkJiksNEVOUFBNRktKVkYqTDAvPi01T1RRHRw7PEYyLCSnpMHGua2psq2spaKcsrmsqqGmm6imqqyppqCmpZiro5+uq52moKyanqmlnae2n6KXk6iqtrKsm6acoJWQpa2RmZymoqCqpq6ho6epsLTCsbOqraiTiZecpJqgoq6mmKGVmJylpquar52tqKaerKO3rKGyua+dm6+ns7OzpZSYp6OZn46CnU54moF/n3qDo32DpISHp5+cnpOEuHt8ebmCfszGwrZ4m6GRi599mpaWinaemIqkmKOofrCFnIWehKx9mZRhpWyjcI+FkIF9l4NyrGCkc3GAmmC8fVJVdY6SpJd7fZOSi3V6c4V/cVxtbndyaoFvWmRfaG5jZF1LTVFUQklIRkk6OUs+QjEwODg2Njg3Ny0qNT09P0JER0lMTlBUVlhZWltcX19eXV9fXFpaWllVU09IQDc3Mi4sKi4rKicmP1FUVldXV1lYWFdVT1VGPEUzOlBbVBwbNj9ILC0gi4eZqaukq7irr6Ccoayzs6afoJWlrq2uqqedpqaao6ehsq6iqaayoJmppJSjtqKilZeiqbS4pJyinaOTkKGxmZ6cpqShoq+unaSoobayw7Guqa2pkYeQnKecoqKcpZeemJmZpaSomq6hrqWml7ClvK2ht7etnZ21sriws6eYnq+ho56Fj9G1w7d5h46FkZOQgaZ4lKJ3jKCShKWBinGqhoS0bnJqmaOblYqffJiZhoePc6+CpZuijaaLk52JlJCbbXCyXKVzk3qcbJl/e5l9bqlhonFxf59ic7K4aHiPlKaYfoyNk4t4fXmOgm1peGl4c25/dF1kZG5tZmdgSltYWDxIR0BVM0BGPjwqKDYzLjAxMykmNDo7PD0+QENFSUtOUFJUVldXWV1fX15eYGBdW1paWFVSUlFGOjIyMzAvKysoQFFSVFVUU1RWV1dYWFdVVlZUUU9RW1UlITJBSCQpJZNzjYqtv7+7urWel6ikrbWho5mVo6mnrqqrmaWin6WgoLWmoqmnsKOUrKOPpa2jnZCamqq0tKSdpJ2pkpSXrqCgnaajnKectJqhqqO2q8OvqaupoYyEjpyhoKWhlZqanJiamaakppirp62ipJutp76slb2wrJ+isLO5q7Snm6mxpKeYeqiQfXywd4qBpKWInG2yb6GHrXyhj4OolZiArIiFroWflKmgoZaGn4CZlYB7kn6rgJ2aloqqeJ2gj4mTkoB5r12jgXymp2SdgHyXdGuuXaVrcYWZXWBbjKBtlZKnmYKUjZeMe3uDl39rbH9ifXRtgHpgZ2VxbmhnaENaYVs9S1QyVThCQkM3JCQzKycnMywgLzY2NzQzNTlAQ0ZJS01OUVNTU1ZaXV9hYGFhYV1dW1pYU1BPTkk3MDUyLiosQVRWVlZVVFVVVVVUVFVUU1RWVldYVlVVUUhGSUojKCi9kpqEqcbCtsG0n5qsoK64paSOm6SjoK+vqp+kn52tmZ64oKOroK+qmq6hkKqppJaJm5CusKynn6ebrZiYj6yioZ2loZmknK2Yn6imtqnAr6Wpo56LgI2bmp+mnZKVmpqUmpqlo6SaqKyso6Sfqqi+pJfDrKqioayyuquup6CzrqipmHavfpCLnIWHfLquiphlsIxlla19oY+DppWagayKhLCFpZmkoaGQhaBbbGqBs2B/rXt7goCxbGdumZeMiLBbfbRbpINryKJln4B7vFl2tVqyfVKvgHqsWIChbZiPqJuLmJGWlnt5jp1+ZHN+YoN3dIB8YWpmcW1mZWVPVWRcQlRePkkoPjk9NCEiLSUfMi4gKjEvMDQ1Nzk5PEFDRkhKTE5QUFJUV1peYF9gYWJeX1xbWFVQTkpHQzU1My8vQFVaWFdXV1hYV1dYV1ZXV1dXWFdXWFlaWltcWFdXR0I70p+zsre9u7TCs6ObrKaltqihi5qgn52zs6meo6CdtZigs6iqq56vrp+rm5WvqKKOiJuOr6ypp6Knma6TmY+omqKdpZ+Zo6KlmZ+jqbKovK+lqJ2cjn2Lm5WgoJmPkpqbkpmXqJ6hmaiup6amo6Wpu5+gxqelqaGrtLatrqaeu62srJWAqZKjr4+bgIekl5iQgYC4w7qDjp2ThKeWnIKsioKviKabm6WqkH7VvcKqYqO/vX1+o4KD17q4tYWUk4Oevb6EaqOBb6uEbZ1/erKwx4Nqq7C9rHh3or67dICWjqadkJyRl5x5gpGbemN9e2SMZnmCe2BrZWtqYlBiW1NqXEBUYUJOKT06NC8eHyQeJTIgHSQoMDQ5NjY3Nzs+QURGR0pLTU5OUVRXXWFcX19hXmBbXFlUUU1JQz88QT81PVNZWFhZWVpZWlpZWFdXWFlaWllZWFlbW11dXFpWWFRXWryVs7Sxv7myvbKina6mpbOmnouYpb6pt7Goob+mprKcnrGcuaiera+mp5WUsKyXjIObka6mo62hpJyqoJiLo5KnnqecmqCoopieoKytqrmuqKOalpJ7h5mRppuSjpGYmI+Yk6iZoJipqaGqp6Gjq7ueqcWjoK+jq7O1q6+poLqnrq6ac3WqpLeGZYmgcGetj4qPbW93pJCZn4F1rpmVcI+LcZWoo5uXrqRybW1tZYp4b22CmXGAeWlxaWeJlpWYcWhphIZncIZkXYljam9ZXWd+d6ZgYnGOkW9mZICNko6imJiZkZaefIeOlXZmh3hojWp5fnlkbGNmbGJLZVhKbFk6UWVFUidLOisjHCAbIywpGBsYLTIuNTo0NTc6PD9BQkRFSEtMTU9RU1ZdV1pcYGBhXV1bVFBMSEQ9OkFCN01YWlpZWVpZWFhZWFdXVldZXV5eXVxcXF1eXV5dW1tVV16ola2zqrq5srOqqaGunqSyqZiSvbLEyL62qp7Aq6yjoaesn7qjpK2sraaOlq6pkIyFlZetnqaqop+jo6CRjKSSp5momZajqaCWnKWmp6+6q6yam5KSe4SXjaWYjZGRmJSNmJWnlJ+YqaObsaeeo6y6n7DBp6Szpqyxsqutq6e4o623loqhqKW2nYmWopiHqZqQlJ2TqrOZm6OroLGWoaGdoKKcoKShlaumjJKSjIeSnJyUkJqTmJCNlYaBpJqXlY2Lk5KKj4aEfmeKf3SCdnSHjHGnbXuUkZSTgYGPj4+PnZShlpmXooKIlI1yaZB3cIt3dnx6amxkZG9jVWBZQGlbSGNhT1orRj0rJiE3NDAuHxwhJTIoKjY5OTQ2OTs+P0FCREZKS0tNT1BRWFRWWV5fYWNdXlVRSkVEPjk9QEFTWFtcWVdYWFhYWFlYWFpaW1xeX19gXl5eX19gYGBfWVlgppapqqW1t66uorCkraCgtbGQjqvGvcS6uKqipZ2bpp6xqaO2p52ptaeokZisoouIiY+cqJaspKGZp56ek5Wjl6iaqJmUpqGjkJuomaG1uqirmZqQjXyBlIuglIqUkZWQkJOXpY+fmqqgnLajnaest6evwa6jt6avr7CtqamyuKCuvJmRpqOmtqKSnaafjamfjZKfo6yvmqGjsaivl6OgnKOpnp6dnJarnJKZoZuUkJaqmY2ZmZaQlZ6RiaCdlZSFkoyQjJSKgH5mjIZ1hnZ5iINznGqGkJSUkYp9jJaSkpiToZOel6KEiJiHenKWc3qKf3F7f2puZF9waWBbYFptY1BgZFBbOkdHRD0yPT03LiomKykmHSY0MDY2NTg6PT0/QUFDSEpHSktMTVNTU1VaYGBpYGVWUEpBQ0I6OUVNVlteXltaXFtbW1xdXV9fXV5fYGFhY2FhYWBiYmJkYlxbY5eVpKijsLOsrqOpp62gqLWqkJCdprS7r6ysoqOaep2isaSlsKmWm7mno5SZqpyOhoqJnKOQrp+jlqigoZKXmJuvi6qWj6iZp4yZqI+eubakpZmbjYl5gpOLmpOJlZKUkI2RlqKMnp6pnp+4pICEr7WisK90pL6jsqB4eqCqsbuUdayknomAqn5kXGJ2oI6knoSXfm6Ts5yjp66qo2Wdn5NzeZmXcICYqJdsf6KoimWcpZyRl5iWi5GbkYadmpCVgpKHjo6SiYV3a4+HdoZxfIaAgGFph4qUkotbdpWRZ2iQjnJ7ppmZZXmZh4J4mGqEioJueX9rcGVgdm9ra2hcZmViYm9TXD5OTk5SRz1AVEI5MS8eHyY0OjMxNjY3ODw7PkBBQkZIQkZGSUtNVFRVWVxfaGZnV1FKPERHOzhVUltgYWJgXmBfYGFhX1xdX19fYWFiY2RhYmFhZWRjaGReXWablaajobCxrKuppaito6etpJKVq7awsqaaqqerl3OMnbCfqKunk5e5oKCPnKSdkX+IiJuejauao5Wnop6Ol5GehXWukIimmqiRl6SInLq0qKCZmIuJdXeTjJWSiZORkJSMj5Ogjpugp5mcs5aAjJy1nbOMko+8p6F+p6J6oq63gY6Npp6Di4WPsamvjIqWo5p5gYushpydoqepp4eVhZh3pZt6h5uBl6aCgXucsXqKhaCXmZSYloGQlpaEmZljeYeQhI2PkoqDbXCPh3mAcYCBhX+GdIaElZJ4lmiTdKCadH2ZhKGdh5h+kouDg5lrjo2Fa3h7cXBnZHduaWxqW2VramVzXF5JVExRQEU1LllUVTYpITA5PT42NDM1Njg7Oj0+PkBESD9JRUpLR1NYWllbYWFoZllRSDlFTDs+YlZeYmRlZGBhYWBiYl9dYGFhYmJiY2ZnY2JhYGVkY2djYWFonJejn6aurquorKCosKanqaWZlK7HvrChlqaptZ6Pg52snKeioI2Qvp6ZjZ+aoJB9ho+Zl4irnaKWn6CRjZOJhoCRqI6Hopyjk5eehp66sqeem5KOhXB1kIiTj4mTj4+bi4+RnpGXoaSWnqyIn7SJtJqti8qHqq6It4WNsIKwroOpjaaZjZ18qI9ye3ecj6eWaJWkebSLn56mqJKZwoF/q4iYoXGegJmkfZeFlbGAoXyhlKCQmJaAjpObipeRi3yFk4aNlZOJg21zkYV/enKGgYR8hHSFgpeBj8VmgKmHj6NrnoOimoOagIyOhYqZcI2ThWh3dHt2Z2h1cGdnbF5jb2xnbVhoR11RTDJFNDZNYGM3JjM8REdEOjY0NjU4Ozg+PT0+Qkw/TklKTENQWl1cV2JeamxcUUU9S01ASmRZXWNmaGdiYmJiZGNgX2JhYmNjY2RpaWNiYmJlY2FmY2JiaZSXop+wqKmopaugpLmwqqummpSgpKWro5alqrejr3+hp5ylnp2JlL2ak42hkZ2QeYSWlpGHq5mbm5mhhY+Md5ucj6CRiJ6km5WZmIaiua6kmZyMjH9ibY+Kko+Mj4yNmIuQkZ6OlKChmaGofqGnh62doJauj56dnZGGgaCNqq6GpI2qmoyafqJ2gJmUa4KsdU2reIeNnZGbqKeAqqt9g6F7eqdpnn+Sa2eXhpe2iZ59bmBkWYOWf4x7ZGiKcpl9eZVsXXuXbV9TcIRcX2x5g2BZZYJ9hIGYcaeqa4OjbnKlcJ+En2pln2xbbop8Zlpfg39iV1BvdmVtdHFqam9eam9tbGpYaU9dWEU5QTRHQ15rNCxJQ1FNTj04NDg1OTs2QDs7PkJPPlFSTE1CSlxdX1deX2N2YE1EOk1PTVRiXFxmZmlpYmJkYmRkYmFiYGNkY2FiaWtkYmRkZ2RiZ2VhY2iXlp2guaGqo6askqG2vKuuopmXoKKmra2hna61oqiSoaCgppyZjpi0mZCLnoyVjHWBlJKNiqaWlZienn+ShYaspIeckYqYqZiZmpKHpbGnopWaiImAaW6Ih4qNjYmLjZKLkJKhi5SeoJyipX+TgY+joZSgd5yWj6eDoad/hqmshKV5in2Emn2icHKTiJZ7nox5bYecjJmQm6iaj4edfIKic3amZp5+dqRfmHp9knOibpi3tLp0koeCf7WoZIHGuHtwlbeLcYCbpGNzrKtgfWqds35ufYeDjoKLl3GAo2xzpHOehICkYJ2Zs5ZxfJeftHRzW56yg2pib3R1cWhvWGtscnNmXWleYktEPUQ1UUFZcTM9U0dfSlI9PDM5NTo6NkQ7O0BJUD9UTU5RQEVfXltaV2BgfGRIQzhMV1VWYmFaZmZra2JiZWFkY2BhYmBkZF9gY2tuY2NkZGhkYmdmY2holJaVo7iZq5yToI2kuLWuraCbopyjo6atnJuxrayTl6GZoaSZmpSeq5uLiZJ4i4ZwgJaNio+gkJOUnZd9kImOqKCHmI+KkaKTm5qMi6iopZ6PloeEfmt7h359j42Di5CQiY+UoIKWnqCdoJ+LiXecmKKMoHKii4ipiJymkJanqn6ujH16oJl6o5N4gXSWiI2cfZagh5uOmZumhqJkoXyIlpCbjWyeaJuNbpqZe4CKp31yaHSrg52DdKpnlJpdm4V2hJ1oqmqAuGZcqHCBnGGVjF6ndnWJin+eaJp1h5OSmI5/n26akG2nmV2ofni7a36qW46EXbRnXG5xenhraVtxanh5Y2BmWGJBUEVON1ZCUm40S1paX05aQ0AxNTE7OzdIPzpDR1Q/WVJZXT5EYl5WYFFhY31pRUI5TltdWGRmWGZnbm1iYmVfYWFfX2BgZWNeYmRvcV9kZWVrZWNpaGdraZWciaq1m6eJY5SbrLqysKydppycqJ+erpuesKisnZekmqGfmJaWoKOZhomNaoiAcnuXiIuWloSRlJiPeoqElqSdipSPhYudkZyciY+oo6CZi5GKgIBpgYd4f5aLe4iOjoiPlpp/lKOfoKKTmHJon4qfj4xxkoyBqYiZn6Onn6d8sK2joriXd6OzoqSAiJR5nXurmn+ijp2bl4mXcaF8hY2vtX1rmpGheH6YtKOjq6iEmXybfZ2afnSqWl1ve5aLeJ5iTH56eoVjeZdCTZ9ZompxfI5tgYmEmXWbeYeJsbN/f5uTp3WBnW5yfZRvmXNqpF2VdkhlY2BzcX5+bmVgbGh2fGRlYlJeV11UVkBZRVFnRFNXW2JYXklEPUI4P0I6SUU4TERXQVZRW1ZERmJcWmBLYG1+cUVDPFVfYlplalZnaG1vYmZmXmFhXF1eYWhiX2VkdmxeZWdma2RmbGloa2mTnYGxrZmEVF+gp7O5s7OpmqKMnKucnKmUoaukoaiPn56dmpmVmKCdloiHiXeFgW55lYWQm4t8kZOWiHKAiZOhnHORkIGImJSfmoSOqZyalIqLinyDbISFcYGgi3iFjYiHkpmVfJOjoZ+jiK6GfbWEjp6de6WWeqmBlp2QiqCcfKdodm1+mXShc3F8noaZcJODrn2kg6aemoGjb16oZ3WjY2+lYZzTkHx6mXhyc2OihZB+o3Ojj3VrkLOLYIKYiXOqsqi8f3eDbX6+pqm0XpxufXGXb4FzonJdo2d0pmFopm2b1Jl8hJtveHqXa5t7d5dybamkZ2BleXCAhGtnZmRtdXhnYGNUW2ZRUWJJV0lUX1dTW2VqXGRQRUNLTUpLQkpFOFA/UE1XU1hPUlJgZmVpUmN3eXdJRkVjXWRaaGlUaWhqb2NqZ2BjYFxdXV9oYmFoZXxkXmRnZGtkam1naGxol5uAsatUXEt+qa+xtLCzo5yZhZmooKCjjaSooJipipmYmJOZk5KgmI6IhntwfYRofY+DlJqBd5GNjolvf4aQk5Jsl5R9iJGRo5WDjqqalJKLhYl5g3aHgG6Cn4Z4gJOGiJmil3qToqSaoImzoaK2i3qsp6SupXCpgJqPhoGcknykgKKZhphynoSjra6Kl4yAjKSNloOuopV2tbW1yaFzlIqBn2Cdl6lteZWGn5p1oYd3oH6RloqAb0xmo5JwmodypHt5dGGDgmx+oGtxZGCccn90l2l7abO1tMamc5h+e51qm5urdYOabHR3l2maenWYclBEfbNeanZreYdmamdidHRxblZeVFloT1FoSVVMWVNVXWhrblZnV01KQUpNS0hKTkFRSlBkY2ltZXRyc355e251iXt7VFBPbF5oW2tpUmpoaWxnbGdjZV9cXVxeaWJkaGt7X11kaGNqZm9tZWlsZaGcibCnhGY/lKGyq6+vtqKikICXqaKipYylp52dpoKal5aNl5CPnJOOiIN5anmGZYOMf5egeXWPiIyBaYSFkoOMhZ2NeoyKlaWSg5epl4yRi4GJeoB9i3hwkKGHeYGVh4mWoJZ/lKWonJaWhGdueJxsomR8caV3m5hwZ6eBl4x7pXqfloOXcp52gYmUlo+5bpCKomJ9maKViG1yaatqdaBtbqZgm2mLkGiWh5qVdaKAfZpgi4WMdG+IYmigZZ5+aZp1b2NmiIJucqJaX1tjoW5diYxve39zcmSlbXeiZGenaJhzi5huoW9TiI9voF9lp1SLXVSYbW1za3KCbHBoa3hza29SWFdWZllSbUlYT11JWGloc2pZa1ZRUkVWXExYUmFUaGped3V6fHB8fHKDe39ydo2AhHZeUXJiZ2JwZ1BqaGhrbG5nZGdfXV5dYGtjaml2dV1cY2ljampzbGZrbWOcpZmmemV0bYunrqSpsLGmn4uAl6udnqWMoqGaoqKAlpiTjZqPi5iQjop7h3GAiGiLi3yYm3N0in2QfGSCh5WKipWZgnyIhpankIGirJCFkIqCin2AgI9zaI+mhH2GlI2JmKCOiJKqp52JpniWnH6liZaMspiekIKvl5+leJWIeql0pY+Emm6kooyShIyDu259pa+ChoaHk5acn3ylenGolaCWZ55+b6tjloqVkneobKmigYl1h4J3q5GmiGuRsGt2s4ypa4qGbm2fnpKVYX+ri6p2gH+Mpp93n32FpZWdoGmah3asZ56tjLdzd76NpJNZg6aNq2F1cnRwfHRxYmp+bmhtU1ZbVWFhXGtNXVJdSV1tbXZgW3FZW2BaZ3Nlbm9xY3F0YHd6fnlyeYNzhH+Ae3uMgYKAdmJ4ZGNtc2RSbGdob2xyaWZpYV9eXGJrYm1sem9cXGJpYmxqd21nbG5ilaaqnYGAnqSWqaqdqKeupJmJg5irmp6kiZqlnamdhYyajoackYWSjYyNdIZ6iIRvjYR+mJN0dIZykoNtf4uSh4aUj3x7gYWXpY1/paaOgY6JhZV2goeSb2yLqYGDjJSOiZyfiY2Tq6OgkIB1lJeIfoF5lK6jf4GbcY+FeZCLhH97cqaMcX19epeWm4SOeHt+foeUlZOKdpCYn6CDen2JbIyFW3l4cXlwaG5+kolxf3SCj5STcYWDgmWNf1+Bf4t3dXOUdW95bm6HbYSGXndpeI1mgYKGjqmbfnR8l2qJiG+Adn2Gdm1sZ4xzeXuYeIRba1h5j2hud3Jxb3h4b11shm5pZ1ZaYFdcZWtjVmFVX1FfcHh5bGt2ZWpranZ8cXJ0c2FvdWJze4F4dXmCdYCAf4B4i4WDfXttf2xkeG5eV25naHVreGppamRcYFpjamVscHVuWltia2RsbHltaGxvYY6Uuamni6GimqakmaScq6KhhISYrJKdoImappupmIOBm4p+lpOHjoqJjXKDfI99fo+Fe5eOdHKDcJaFe32Si4aGkIV4fn+GmKONe6ehi4aQkIWWg4aOl3ZyhaqGjpKckIienoiMm6igoKuDiY6Umn5+iZatqI+Tpo93b52Rg3qSb36ohXB9lXFrcHyBn4x/k46MaG1dg4uMm5uejnOVi4hxdGuCdnOAWXJuh5GBfX6Mal1qZHuFg4iAX2l4e5t7gouCdoGGgmh5i4drYXFyg3dfc4yCiZCnlYZmjI+DbneLhHGGj3pvZWdkeoN6lltcamdudlt7eHd1bnNzgmZcbYprbGJZWV5aWGxyXF9hWl5dZnR+e3VvdGNra2p7fHJ7eHRkbXRnbHt+dnp8e3p6f39+b4aKhHt9c355c39pVFxxaWx1b3Vna2hkXWFYa2hranFybVdbZW5sZ3N5b2hqbWCLjKqxopCjoZqenpeemaijon6DmK2Nn5SHm6KRpZV/e5iEfJKZiYiGh4pzfYCLdoWLgYSWinFvgHKYhoR+koSDhoqBeoCDi5ufj4KmoYd4jpiJlYuLnJeEg3qtgpGYmZSKnp2HiKGroKKio4uIk5uco5mWqqGnpqCSm4eWjnt4jo6Ep35/kpGSk5yxppuVnpCNspOYhKWMjJWbn4mQm4KJkYprfI12d2WChpCKe4mdhIeLj4iIgIWEkHd8eXWaoYiGip+LhZR/foyBgHZwdIaEf3iIh4uQppCEhY2Ig42QjH2Ii4mQgXZsgoR8eZlqcmhhdIpwfXp3dm92dIFdXm+GaG5fXlpcXVNoclZjXFxhbGh1fHxzb3Bka2ppf3tteH9xaW9wbGaAe3KCgHh/fYCEem2DjIZ8enh8fXqDeU5kdmtzbXB6ZGtlYmJgW3RmcGZycm1VXWx0bWl5enFnaWtljIidup+WoqGYlZmYlJmkoJ57f5qrjp6NhZ+di56WfXmUg3uOmYmGhISGbniAgHKBiH6JlIRta356l4aEg5B/gIaEhnyHg42bnZKHqp+DcoqQhpOSjJ2RfY17qoSNkpiWj5yXhoabp6Cimp2Gg5GamZmQmqagpp2dkJaAkIp2fIeOhKV7fI6QkYaYqqGek52QjquOkYCejImTmp6Cjpd+ho2Cb3iFcXRgf4KPhnWLl4CDj4KGhH6Fg5RueHV0kqGLjIWahYSNdICJfHxycnuIhHt5i46Ek6ePhoSPgoSKiop3hoiJi3xva36Ae25obG1nXnp/aHx7dnR2dXt3XGBwfW51YGNaXV5RZ21TZVteYWtpdnp+cWxsZGtqZ4B/bHOAbGx0b3huhHluh4B2goB9hHZxgo2Ifnt7fH97gopgaXtqdWhpgmRqY2BpXGR1aG9idW1sVGNxeWVwenpyZWltbYuKn7eaoaOfkpGWl4uan5+ee3ieppCbioaklIuYmXl6jYV8iZGDjIKBgm18f3hzgYV9i5F9a2h9gZeIgYiOfH6GhId8j4CPm5uRiKedf3CLi4yTh6GhioWNfKiRiJCSl5OWk3iMo6Ghnpaaf4CQmpiTjJujoaSal5Gbfo2EeH+Dj4eggH2MjI98mKSgoZOZkJCnjY+Bm5GJkpebfZKSfoaNgXV0gnB2YH1/jYZyipV8iItyjH+ChYaOaHdxeIyYko9/l36Ii3KBhnx9cHh7i4R6epGNg5amk4uGkXyGhoeFdoKEiYh6ZXJ7f3l6cWxqZl5+c2h8dXZ0fHOAal5gdHZweGRjWV9eU2toVGRZX2FoanZ4gXFma2NsaGV/gGptfmhucWt9d4Z6a4yBc4GBfYF0doKNhn58e3+BfX+PanKDbnNpYYdobGJfcVZ0b21uYHhobVdqdHZjdXt7cmJqbnmJjZ+ykqWlnI6QmI+GnKCbnHx2pKCNl3+MooqImpZ4e4aHfoOJf4mCgH9xf3t0doOFfoqReGdjfYaXioKKjXh9gIyDeZaAlZeWjZagm35vjIKRlIamm4iNiYSmlYWTi5aXk5J2kZ6hoZiUl3p+jpiXjpabnaSdmJKUm3mPhYJ3hJeNnX6BiY2Mc5einqKTmY6PooyMg5eYg5KWmX6YjXyIjYF2cX1uemSAfIqFcIaTf5CCbIeCgYCJhGV1b3yHkpeNfZN4i4l7f4Z8e3F+d4mFeYSQiouYopWBhI13iISDgnd8gomGdl94d310fnhnbGRhf2lqd3N0dX1xfGJjYXNudXNtYVphXltrZFJiWGBhaWt2eYZxY2pjbWVofINsaHRobG9of3yCeW2QhnGAg4N/dHyDjIF/fnqCg358kG12iXR0bWWKbGphY3VWhGlxbmB5Z2xianZwZnl8enFgcmyGhZCcrZemqJ6NjZeHhp+Tl5h9eKqcipl6l5yLjJiQeXuBi318g3uAgoB4dHh6c32AhH+Ji4BkXn2LlYd/hYd0fX6Kf32XhJeTloyjoZh/cod7k5KKp4+MjoqToZKEkpCUl5GLgY+YoJqSkJF0f42SlImdnZ6nmJiNlZZzjY6Ka4WYj5l6h4iQiW+XnZqjk5WKjZ+Mh4KSnH+SkpWGmYh8iYmBenF5a3Vse32Lfm6FkoKUd2+Cg31+in9kcmp7gJaXhH+NdJCJg3iHfnV4gH2GgHyDjIWNlKSQeYWCdImHfYB0doGIhG5ge3V6cX1vYW9jZHtibm92c3h3c3Rhdl9vbHVub1xcX15eal5PXVhjYWhtdHuIa19qZWpjaHeHbWZsaGlsaIB8endvkIdzgYOEfXOBhol6gn16gYR9fY5yeot4eG5sh2toX2lxY4docW9ld2hubGF5aGt9e3hwYXdti4GZmqqgpKidioqRhoqeipWXfXeumIyXfp6TkZaUiHd+e4p9e4B2eH+AcHRze2+GfYGAin98YVx+j5GGf4OEc3qAhnqPkYeSkZuSpZuVgn6BfI6LkqSJjoqNmJuNhpGYk5aOiYmMk52TkIyNboOQj5GJnpmioZeWipeRboiZhGaGmY6TeomFkIpwlpqUopKSiYuajIJ/kZ58ko+Si5mOe4qEh3RzdWtxbnR7i3RuhZCOknF0gHuBgoh8ZHFseX2ZlH2EiHSQi4BziHlvgH2AhnyFjIiFjZWojXuIfX6LhXh+cXCAhYNjaHh0dXB8Yl5wYGt0XnFqenh4a3NwZXhdbWxzbXNZWl5gYmpaUFdYZWNncXF/h2ZdaWhnYmdxjm9kaWdlamiAend0bo6FdIGBgnt1gomFd4V8eISFeoCJd3+Le3pyeYNqa19waHSAa3JvbXFnb2xlfGNugHl2cWx3d4p/opiiqKGmm4eMioGQnIaTnHWBqpSSjoegjJaTkIB0fHaFd3h/cnN7hWtyb3puinaAgYducVtZfpGNiH+AgHZ1gIB/oIaQipKcl6GUmHiKf4GNiZ2eio+GkpiWhYmVmY+WjIuNjo2dio6Qg22IipCRiZyWoZuYlYaYiGmEo4JmhZ2KkX6Lg4uBd5OYkp+SkYmJlY5/fpCXfJGNj42akn2Kf4JudnBsbW9we4Vpc4OOl4pwd390gomCeGZzb3aBmY58iYR6lJF5doh0cIl7hYx6i4aDiY+co4h8hHeCi394eG9rgYOBXXJzcXBweFpecGBwal5vaXx6cG1tamx2YHBvanJtWlhhYWJuWFFTWmZnY3VwhIJiXWptZGJma5JtYGZmX2hqgXVxcnCLgHV/goB4dYCLgHiFf3eHhneDhXuGjH97dop/anFjfGKGfG9xbHRqaG9sdndfcX95e3R1dICCfqSVmq2fp5aFjYN/l5SDkJ91i5+Uk4aLm4yVjYt6cnh0gnByhXRxdYhsb2x1bYh3g36AbW5VUYGrlIeCeIB2coJ5gaCCkYGTkpickpp4knuDjZOkmpOOiZWZk4WHl5mMlIyJj4+InoWQinxyioWJjoicmp+blpSAlH9ohZyHZ4agiJKEkYOJcYORl4+bjpCNjJCNeHuSkHqOi4yRlox8iHyAa3ZqbmtrbHp/YXl+jpWBdnqAd4ONfHlndGx0h5WLf4iGe5SQcXqEcHaMeomMe4l9goyRn52FfXx4gox9d3FqbIGCeV93b21scnNWXm9icmBfbG55cGdwZmZzdGhxa2F3ZV1WZmFgclNQTlxmZV15cIh8X11ocmJiZWaSaV9oZFtncH5wa3Bzin12fIWAdHV/jHl7hoB4iINzhoV+jIyEe3mVd2ZyaoNgiH5vb2t6YGpudH90X3R9eYZ4dHOFfHigj5mwnKWOgop/g5qIgIyef4uak4+EiJiOjo+EdnR2c4Bwb4VzcHGDcGtpdm6Dbn18bXVzUk6C38iS1pN8b3SEdoOggpN3lZGZm5Cae5RzhZCfoZOTkIqTm5SGfpaViI2NiJGNiZyAjoF4eox+iIyKnJydm5WTeY12Z4iRh2yIo4SSh5eDhmOMkZmOlYqXjI2Ki3F7lIh7joiKkpGJeYV7fmx7ZXJva2t5eVyAeY+OgHp9fn+Gjnp5aHNrc4uPiYKFhX2VjGt+fm6Ai36Lh32EeoGPlpqain13eIOQeXNtZ3CAhG1qdG9oanRuU15vZHBZX2tyeGZramJmeHJwcGNfeGBgVmtfXnZPTkxgZ2NdeXGJdFxcZXZgYWVlj2RgZmFYaXNzbmtxdox8dHmGgnV2fotzf4Z/e4l+comHgZGKiHx+mHZlc218ZYh+b3BsgFpsbnl5c2F2enuNdnN3ind5n4ubrpugkIKFd4iVfn2KnYeFn5GOhYyXhJOOh4F0d3B5cW6Eb21ufnJkZHhxfW16fWpobGOkmsHcru+hc2t1hHaFooWSb5aQlaCUnIGScYaLo5eJjpWKkJ2Wg4CVkIWJj4CSioqXf4d7dX+JeIaEjZybmJmPj3aKdm6GiIt9iqOEkYmdhYVei5SXio+JjouLhIptfJaBfYiFiZCPhnaFfX1rfWR4dWpueHNYiHqSh4V6fn+AhYt+eGVzan+JjomCgoCMloVrgXZuiJCCj4R/gnp/kJaTmZB1dHiIjXVzcWd1eoNidG1vYml2Z1JgcWdsVV9udHlhcmNfaH1wcm5bY3JhYlduWlx3TU1MZGdhXnZziW1cXGR5XmBkZoVgY2JeWWpya25rcnaMfXR3hIF4d3uJcYOEfX6Ie3SLiYiWh4x+fphzaHVxeW2Lem50cIFYcXp2eXFld3mGjGl3gIlyf5yHmaeco5KEfHCMlHh5i52EhaGNjnuVjX+ZiIR7cndwc2pvgWtpbHx0XmB4d3txdXtnYWV869q1ycPciHNsc4F3ipqIjWmYj4+dlZOBiXGFiaCNhIuVioyYlHyNk4iDiY97kYuGkIJ/dniDg3KHgpOblpSYhox2h39whIGJh5mhg5SMnoOJYYOVj4eJhoqNh4GHaX2Uf32DhImOjYJxhn5/cXdodnJpc3dsWox8koKFfH+DgISKgnVhdGyIgY+Kgn5/kpB9bYJseIaPhpGDfYF9gJKTkJeJb3J6jYZ1bHFscniBX3NpblxrdmBSZHJpZlNfcHZ0YG9gXWiCcXNqV2doY2lYbVZbdUxKTGVnXmJyc4VpW1xleV5eZGd7YGRfXFlrbmVvanN3in5zc4F+enZ6iHOFgnyAh3Z3ioaOmIGMgXuTdmx2dXl4k3RueHp9WHmFcYBvZ3l3koJkdoaFcYqVhZmhm6KKhnNvkotyd46cfYqaiYl8n3+DmX+BeHFzbm9kcn5oZmx3d1tfeXt7cXGAaWFnYX/Vto6QpnhucXd7cJKQjIdqmY6InJKMhXtpiIuah4GSkYaHmI18jY2BgYmOfJCNfoqFenV7gnpwhoCWmY6TlIGIdYOGdoN/ipOdnoaVj59+iGGAk4eFiISKjoB/g2d9kYB+f4KMj5B+bYJ8gnRrbXZ0c3Z1a2KNgY9/hX58hH+Eh35wX3NxhXuPjIJ8fpGIenCDZnmDioaLg3yEfoCUj5GThG5weox/dW5va2x6fWJoamlYbXZaUmlyamJRYnJ4bGJlXVlqg21zYlxnX2RsX25UW29OSE9nZVxnbnGAbFtcY3NgXGNsd2RlXV1abGxibWpzdod/cW9/fHx0eIZ4hYJ9gId1eYmBkpZ8iIZ2iYFvd3l7hJNwbXyBd16Df3SBbWl7c5RzZ3OHfHKRkYOan5ughod2dpR+bXaUl36IkYOKjZp8i5p2fXZxb2xqYXR8Z2JpdXpaX3h8em1xf2VkaGhXnY9ecXKWvMODdXGUiZB+cpeMhpyTjIhza4mPloF7lIuBhJuMfIuGfXyJjH+UiHWJhXZ3fYFxdYaBnpSGlY+DgnJ/iHWEe4mYnJeGk46dgIhlfZOCgIaEiYlygX1nfYt7eX9/h4uOfGmAfIN2Zm94eHN2c2xqjYWKgYp/eIGAhIN/a15yeHp9jImFe4GPgH5ygWl4goeLhYR4g3yBl42QjH1ubXuJfXd1b2hofXZkXHBiV3BzU1Nuc2lhTmZ0eGZgXVxYboBvc1llYl1qbWBwT1lrUURTZ2Faa25te29aW15tY1pib3djZlxdYGxqY21qc3aCg3Fufnt/dHWDeoOCfIGFdn6JgZaReIOKdIGIcnh5fo2Qb298gXFpgXl6fm1tfHaVa2p4hHRsk4yGn5igmYWIbn2Mdmp4mI9/goqDlZeJeY6Wb3pzcGxqZGB0emhgZXF6WmFyfXlncHphZWWPsbJ3SmJapNnQlnF7kIuQeH2Vi4WZkY2Gb2yGkpJ6eZKGgYSYinyHf3h4iYqEloBwjIhxdH16aXmFg6WRhJONg39vfoN2g3eFm5iTipKQlIWHcHuSg32Dg4mDb4F4aICFeHJ/f4OKhntlfX6EdWRwc4BoeHBvdZiMhYKKe3Z4gIR5gWtccX1ygIeFiX2GiXqIcoFucYOGjoSEc4R4gJmNjYR4bm9/hH93e2Voan1xYFl3Wlhxbk5XcnNnYEtsdnRhXVtbWXR9cm9XZ11manFfb05XaFE/WWZfWnBrZ3lxW1tYa2VZY3B5X2hcXmVtaGZsaXF3f4dvbH99gHVwgXqAgX+Cf3aBhYmXinGCjXF7hnx5eYOTjHVqen9rb350f31vcnx7lG9ugH94Z5KKgqGZnZGChmeHg29oepaKfoCFgpmKgXyNjGl4cmtsZl9hb3ltX2JveVxka4J6YXF2X2Vm1Oq+ijI6PouOgHJ5hYiOjXaDl41+k46Nf25shY2Mdn2Pf4WClYl8g3hudoeEg5d3b4mFbHV7dGZ5goOnjIOPi4R9bn90doN5hpyQi5CRkoyLhn57kod4gISNg2yAcml/fnhtfHuBioN3YXmEgXFkcWh+bXRxdYGbi4B/hX5ydX2AcoBvW21+dHiKgot7hn98iHh6cWyIg4+DinKBeX+Wi4t/dG5rd4CAdXVcaWl3cFlXfFNacWVMW3JyZVtKcHdvXFtaWV10fnVoWWJbZ2ZuY2lMV2ZRPV5mXF11ZV90cFtZVW9kWWRxeVpoXl9nbWdqa2lwd32ObGmChH55boB7fIB/gnp1goGMk4VwgItueH6AenuIkol/aHt+a3R7coZ7c3d9f4x5eIR9fGuMjIObnZaMgYBsjn5raH6OjXt+f4OUgn99iohrdXFnaGNbYmdyb2BhbHRhaHCJeWJzdF5jZJugj25cNVmvtXVqgIl9koZ2hpeGdI+LindwbYWDh3V5iXiJfZOIen9zZ3aIfn6Yb3GGfmh2eW1leYiEpYeAh42Jfm5+dX+AfYyZh4KTkJiIi4SJfI+IcXt9hHxpfm1rgHt6anp2gYeBcmB3gX5xZHJndYJtdHuFlJGBfIF/bnd5fHR+bFhvf3Z0i4GGd4d1gYl6eHNuiYCOgIVyfn1+k4mJem5uam6CgnVuXWdmc3FRW3tOXHFcT1xycGRWS3N4aldZWVphcYB0YF1dYGdkaGlmTlloTUBhZFtgdmFcdG1YWFN0YVpkb3JXal5haGtnbWxpcHd8kmtohIl8fHB+fnuBf4J6d4CAiYuEcXuHb3F3g397iY2Pg2p+e253eXaKd314gIKHf4N+fnpthYyImKONhIN7dYt5a2yEiZJ5fXuCkYCAfoqDcHJwY2ZeWWdfcHBgYGdwZmpvinRhdG9bYWRqdnt/vpymo8i4cYWEc5R9eIaUgnSQjYhycnCEe4N0dYd0iHeUiHl5cWN3hnqAk2lyhHZmd3ZjanyDiJ6Cf3+Ojn1yfnOEeYCRkIJ4lo2Uj4iCiHqJiWx4eX91aHtpa395c2l6doCCfWhgd4d9amt0aHt/aXaBjJCUfnp+fnB7dntzfmJWd31yc4qEgnyCcIaJd3hwcIOCjH59eX58dY6Gg3ZpcWltiIJycF1oY3NuSmV1TF5vVlRZc25iUU9zeGFSWFhdYnCCc1thXWhlZGNqZFFacElEZGFbY3BeXXdoVVdWd15cZW5oVmteYWpnZW9vaHB2epJuaYiMeX1ye354goGCfHZ9g4iGg3B2g3Jud4KCfomLk39wgHx4eXqBjHWDeH+BgYKEeoB1b36Ji5qeiH2FeneGe2d0hYyQen9/fImGhHaPgGdvbl9kXFhlWW1yYWBhcWxraIluYHNpWV5kbYB3qdqpx4aHsnGJeHCNdXuHj4B6k4qAdXR1fneAcHF/bYR0lIZ4dWxgeoJ5iI9mcYNvZ3ZuW219gJCTgIB4kpJ9eHtth3WAkIuDc5aKkY6HhYV7gIVtdXZ/bmh3ZW17dm1qdnd/f3xgYniGemh0dWN+emd0hY6MlXt0f3VxgHp8bH9ZVnR9b3SEh3+AeGuIhnN4a3V/g4N9en14e3KLgX1zZ3RlbouEbXRbal91ZEhubkxbYldXVnhtYlBTdHZYUFVYXmFxhG9cYGNtZWNebmJUXHJHQmZfXWZoXVp6Y1JWXHVbW2drYVZqX2BvZmZrcWhwdXiNdGuOjHV/dnh+d4GDgXt0foOIiINvcX90cXV+hYKJjYp7d394hHx8hYd4h3x9gX6EgHt+c3Z5jI6fjYl6iXZ0g3lefYWZjHmHg3SFhoV3iXtibmxbYltbYVZqc2NgXGdub2aHcWFxZlddY2t/fMrOiLmiam1timxxhHJ8hIp+e5KFenl0eXV1e2psdWOEdZGCd3BnXn2CeouJZXKCa2pxY1hse4aciIKBc5eUd357bodxgYqLh3GWjpCIhYuDe3l+cXFvfmdocmJueHFqa3F3fHx5XGV5gHdpdXhmgnZndIeLjZR8coZpb36AeG18XVhxfmxzgIt8gW5uiX9xdmh3f4F/gXZ8cXp0h3x6cmZzYW6MgmxzWGtfd1tJbmtNVlVeVFV7a2FPVHVyUVFUVl5idIVoXGBsamZjWW5hWGJwR0FoXWBmX11Ve15PVmRwWltqaF1XZ19ecmZrZ3JncHJ2hXhulYp0f3p4fnmCh4B1c4CGhY6CcHB7eHZ0eYaGhouGenx/dYt+fYWEhId/fn59h398eHZ5d5KTn3+MfIttdoB5Y4OHl4ZzkopvhYWBeoN0Y25qWV9bXV1UZ3NlYFlkcnJmgXNia2VXW2Bpf3e+rnugt21ic4ZodHxyeoOGen2Mf3h4c3Zve3Zlam5gh3WOgXNqYl5+eHmLhGZxfmhqa1pWb3iKpIGFf3GZk3GAeHWBbYCCkYdylIiMh4OIhX15dHJvaHpham1gbXZrZ2preXd6d1tnfXx4ZXJ9boR0ZXWFjIaVf2+LZmt6g3RsdGJcb3tqdHuLe4FldIZ9bXFndX54fX9yfGx6eoF6eHBmbGJuin5tblZrYHdVSmprT1JPaE5ZfGhiTlV2akxQVFVfZ3aDZl1gcWhnYVdpXVtraEpFa1piZFdZVXlaTldualldbGVcWmRiXnRmbWRxZ3JvdIB3cJmFdn9+d398hYd9dXOCiH+Ugm5zeHp5cnKFh4iIhHmBfXaPf3yEiY6EgoR7fouDe3d8d3eanZd6ioOGaXd9fGyDhJOAco+CcYaCfoF/b2ZsZ1ddW1xbVGRwZV9YY3N1aXZwZWViV1xcaIBwb3KAdIllZXh+aXR2c3ODhHiBhHl3dHVua3twYWdrZ4Z0jYRuZl1ffXB7iX5pbXdmaWRVV3JwjaZ8hHx2lpBzfHN7eW17e5GEdph8h4aDhoN9dXBybGd1XW1oX2x1ZGdmaXpve3JZZ4F3dWdwgHeCdWJ3hYp8lIBui2pteoBwZXJlYG15ZnJ3int+YnWCdmlrcXR6cHl4cn1mfn9/eXduY2ViboZ8bWtWamJwU0tpa09MT3BHXntmYU1VdGNKTlNXYWp2fmVcZ3NpZWBWY1dicF1MS2tYY2FVVFVzV0xZdWRaX2thXFtjZF93Zm1icGlzbnF+dHSZgXd/gHd/foaFen11goR+l4VucnR7enRwhIWPgYB6i3V0kYB9gZSOgIWEfX6Mhnt+gHZ7o6WKeYiFhGx1fHt1g4KMem6Fc3qEfYGDdW5qaGVWXVtaWlNibmVbWGJze2pobWlfYldfWmmAamtvgGhsYWh5eGt0dHRuhYF7f312dW16aGp5al9lbmiBdo+EZ2VYYndpfod7b2lvZ2ZdVVhvaI+ndoF6fJCOeXVvfm9ydXiOf3eUdIWCf4WIdmpydmdob1xtZV5tc19nYWl4aHttW22CcnNpb4B+eXdhd4SEeI+Ec4hxb3l/cWJwaFxvd2Rxc4h8eGJzgHBnanhzcmt3dnR3Y4N7f3d2b2RjY258fWtsVWliZlNLbWhPR1JsRWF4ZmFNU3JdSU1UWWVrd3plXm1waWRcVl9Vbm5XS1RoWGZeWE1VbFRKXHlfW19rXV1aYmVgemhsYW9vdW5vd3V6mH13gIF6gH+Hhnp5eoN+gZOEcXR0fnp2dIWIkH2AfZBsc5WBfIOfhX+HfYB+hoKAint2hKyff3qIh4RscoJ6doCAgXVuh298f3OJgGpvbWRkWF9aWVpVYmpnW1pedYFpXm1sXGFWXFxrgWZydH1qal1rdnZndHdxbYV7fX15dnJsemhpeGZdZHNoeneSgWNjVGVwZ4KFd3dmaGpgV1ZZaGSQp25+eICLjnpwcHxmeG55i3t2jnGEfX5/hm5kdnNkaGhda2Jdb29bZ19sdWV6aF10gG9ya3F7fXV1YnSFinqHhoB/d3J1fnRhcGxZcXRicXKFfHRkcn9sYWx6b2poeXd0cWaFdXp6dXBkYWRuc35pbFRpXl1US3NjUUdXYkdidmZhS1RvV0pMWFhnbHZ6ZGVucGZjWlddWHZlVEpcY1hoWFlJV2VRSGJ4Wl1fbFteXGFkXn9pamBvdHhtb252g5h5coGAfX+Ii4Z9dXaGeIeMfXN1dYJ4enqCjI59foSJanSXgXuLnX1+hXqBen58hohzcY+ujHt7hpB+ZnKIenR8fHZyb4Zse35sj3picG9hZV1lVllZVmNma2BdXHOFaVlwblpeV1pcbHtjcHd2bGJbbXN0Z3V1cG2EeH6AeXdubnRlaXRlW2d1ZnZ2kXpfXVJlZmqCgnR9YmNpXFRYXmJjkKVoeXSChZB4bW55Z3dte4R6dYhygHh8eH9oZXZtYGZhX2pgXXRrWWVdb29iemVbd3trbm5wd3hzdGRyg5J+h4KIenZvcn1yYXdkW29wYnBxgnxzZnGAZF5udmljZnl6dG1ugXV0fXNxYl5mbm99ZGpTaFhZVE13X1FKWllIYnRjYUlUbVNJTFpXaWxye2JsbHNiYVlaW2F2W1NLZF1YaVNXSFlgTkdpdVheYW1bW19iYl2FaGhhbnh5bG5qdoGQeW6DfoCBkoiEgXZ0iXSMhnNxd3aBd3x9foyPgH6TfnB4loN9mZJ5gIB4eX1/dIiDc3CZont6f4mVeWR1iHlzeHVsdG9+bHl8cJFyXnBuYGdibFRbWldoY21mXFxxiGVTcm5bWlhYYG13ZGl1ampeWm1zcW10c3RqhXx+f3x3bm5sZGlxY1tqcmR0do9zW1dTZGFygH9ygl1iY11TWmBbY5OfZXJxhYSRdGxqeWxvb3p7enGAdn5yenp6ZGZ2Z15iWmFnXF53aFdiXm9oYXdhW3t2amlybndzc3RocIGUgoZ+hHZzanB8bGZ2V1xrbWJwc4F6c2Zvfltgb3FiX2lwfGxrc35ycXhrcGBbZWxtemFnU2dVV1JQdltSUFpSSGNzYmBHVWpQSE9aVmtsa3xlbW9xYFtaWFlscFdSUGZXV2lTVEZaXE9IcnVYX2NtY1hhYGFdi2pjZG15eGtuaXV5hntrg31/hJl8goR5fYhuj4Zxb3d6fHSCgnyLj4OClnR4gpSFgZ+JdYCAgXN/gXCHgnVvopd0e4aLh3tmeItvbntvZnhwemxzdnKMa150bmFnZWtSXVtWZ2JsbFpccYxkT29uXVZYVWdqdWhidGVlXVpudW5xdXV6a4d8f3yId5BzZGRrbmFcbm1jc3iHa1pUVmJjeH19cYVdY19jVFtgWWOWlWNucIOFinNqaHpuZXJ2c3tsenR1b3p+dV9mcmNbXldiZFlhdWVVX2BtZGFxXV1+cGhpc3FzcHV1a22Ek4GIe4VxcmZufG9xblNbZmpmcXSBdnNibHZVYnFqW19uZXxlbHV8cnJzam1gWWRqandeZlRkVVZQVG1XUVdUUEhlcl9hRldpTkhYVFZuaWR8aWt3a2FXXFVbdGRTUldoUVlmVFNIWlpQTXh3W19lbGlaYmBeXo9uYmZreXVub2h2dn9/bYOAfoaXe3+IgYp/a5OIcmd0gHt1gIN9iY9/i5NyfYqRhYefhnt/hoxzgIZzfYN2bqWMc4GNi3d4bnqMYGR8cGZ6c3lsbXF2gmdke2xjZmdoU15eVGdgbG9bXm6NaE5pbWBUVlNvZ3RsZXhkZV1ZcHRtcnp4c22Ie4B2nHt6a2FlbG1eYG9qZXB5fmdaVlhga3h8e3CEX2JeZ1ZZYFdknIhia3GBh313a2p3bFt2cWt5aXVybW97gHJYam5fWV1WYmNYZXFjU15haWJibFpgfmxma3N1bm13dmtohYx/iHqHbXFmcHxscWxjWWBoaW90gXNyXmlsUmVxZFRibmF5YnB2e3VrcG1rX1hhZ2h0XGVWYVZTTlhlUk9cT09IZW9dY0dZaU1JX0tYbWRgeGhufWRgVV5UXXRbVFJgZk5dYVRTSlxZUFl1dl1fZm1oWGNhW16OcGNnandxc21odnR6g3OCg3qIjX58ioeOem6QinRsc4J0f3+IhYeShJWPen2Mj4iRm4SAfIyEc3+Bc3R4cW6Tk5OTk5OTk5OTkpKSkpKSkpKSkpKSk5OTkpKSkpKSkpKSkpKSkZGRkJCPj4+Pj4+Ojo6Pj46OjY2Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2NjYyMjI2NjY2Njo6Ojo6OjY6OjY2Ojo6Oj4+Pjo2NjY2Oj4+Pj4+PjoKAfnp6fX5+fX1/fn59fn5+fn5+fn+Af4CAgIGAgIB/gIGBgYOHjI6Ojo6NjY2NjY2NjY2NjZKSkpOTkpKSkpKSkpKSkpGRkZGSkpKSkpKSkpKSkpKSkpKSkpGRkZCQkI+Pjo6Ojo6NjY6Ojo2NjY2Njo6Njo6OjY2NjY2Njo6Ojo6Ojo6NjYyMjY2MjIyNjY2Njo6Ojo6NjY2NjY2Njo6Ojo6OjY2NjY2Ojo6Ojo+Ogn99ent8fn59fX5+fn5+fn5+fn5+f4B/gICAgICAgH+BgYCBg4aMjY6NjY2NjY2NjIyMjIyMkpKSkpKSkpKSkpKSkpKSkZKSkpKSk5KSkpKRkZGRkZKSkpGRkZGQkJCQj4+Ojo6OjY2NjY2Njo6Ojo6Ojo6Ojo6OjY2NjY2NjY6Pj4+Pjo6NjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Njo6Ojo2NjY2NjY2NjY6Ojo6Cf3x6fHx9fn19fn19fX59fn5+fn5+gH9/gICBgYGAf4CAgICDhouOjo2NjY2NjIyMjIyMjIySkpOTk5KTk5KSkpKSkZGSkpKSkpKSkpGRkZGRkZGRkJCQkJGRkZCQkJCPj46Pjo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6MjI2NjY2NjY+Pjo6OjY6MjIyMjIyMjIyMjY2NjY2NjY2NjY2NjY2Njo6NjY2MjIyNjY2Njo6OjoN/fHp8fH1+fH1+fXx9fn59fn5+fn5/f3+BgYGAgICAgYCAgIOGi42NjY2NjIyMjIyMjIyMjJFtZmdnZ2dnfYWEhISEiF0tMDAwMC1GoaGhoaGhoJqZmpqampqKg4SEhIOEd2VnZmZmaFxDREREREVCMS8vLy8vLICkoKCgoKVeKi8vLzAsSIWDg4ODg4OLjIyMjIyMjY2NjYyMjY2NjY2NjY2NjIyMjIyNjY2NjY2OhX19e3t6fX58fH59fX1+fX1+fn5+fn9/f4GBgYCAgICBgICAgoWKjI2MjIyMjIyMjIyMjIyMkWdfYGBgX155g4KCgoKGUxgdHR0dGTekpKSkpKSjnJycnJycnImBgoKBgYJyXV9fX19hUjQ1NTU1NTMfHR0dHRwYfqmkpKSkqlYVHBwcHBc6g4GBgYGAgYqLi4yMjIyMjIyMjIyMjIyMjY2NjY2MjIyMjIyMjY2NjY2GfH16e3p8fXt8fn19fX59fX5+fn5/f3+AgYCBgYGAgIGBgYGChYqNjYyMjIyMjIyMjIuLi4uRjo2NjY2NjY+QkJCQkJCMh4eIh4eGiZOTkpKSkpKRkZGRkZGRj46Ojo2NjYuJiYmJiYmIhYaFhYWGhYODg4SEhIOMkI+Pj4+PiIKDg4KCgoWKioqKioqKi4uLi4uLi4uLjIyLi4yMjIyMjI2NjIyMjIyMjIyMjY2Njoh8f3l7ent8e319fX18fX19fX5+fn9/f4CBgYGBgYGAgYCAgYKFioyMjIyMjIyMjIuLi4uLi5GSkpKSko2QkpGJh46KkJKTkIqPi4qQiY+RkZGRkJCQkJCPj4+Pj4+Ojo6Njo6Ojo2Njo2Njo6Ojo6Ojo6Oj4+Pj42MjIyMjIyNjo6NjY2NjIuLi4uLiouLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyNjY2NiX59eHh5fH18fX19fHx9fX59fn5+f3+AgICBgYGBgYCBgIGCgoSKjIyMjIyMjIyLi4uLi4qLkJCRkZGPhI6QkIaKj4WNkJCMiIaFiYmFiJCQkJCQkJCQkI+Pj4+Ojo6NjY2NjYyMjIyMjIyMjIyMjIyMjIyMjI2NjIyMjIyMjIyMi4uLi4uLi4uLi4qKiouLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjI2Lfnx3dnh7fXx7fX18fH19fn5+fn5/f4CAgIGBgYGBgIGAgIGChIqMjIyMjIuLi4uLioqKioqQkJCQkIqFjoiOhoaPiY2QkJGNhoaHhYWHj4+Pj4+Qj5CPj4+Ojo6OjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLi4uLi4qKioqKi4qKi4qKi4uKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIt+e3d2eHt8fHx9fX19fX1+fn5/fn9/f3+AgIGAgYGAgYCBgYGEiYyMi4uLi4uLioqKioqKipCQkJCPhYOMjpCOiYyKjpCQj4eMjYmEhoiPj4+Pj4+Pj4+Pjo6OjY2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKioqKioqLi4uKioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMin18dnZ4fHx7fH19fH19fn5+fn5+fn9/f4CAgYCBgYGBgIGAgYSJi4yLi4uLi4qKiomJiYmJkJCQkJCMhoyJjoeFjYmOi4yMhIqGhoiDio+Pjo+Pj4+Pjo6OjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKioqKioqKioqKi4uLioqKioqKioqLi4uLi4uLjIyMjIyMi4uMjIyKf353eHp7enp8fHx8fX1+fn5+fn9+fn9/gICAgICBgICAgYCBhIqMi4uLioqKioqJiYmJiYmPj4+Pj5CMjouPjIqPjI6MjY2IiomKjomOj46Ojo6Ojo6Ojo6NjYyMjIyLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLjIiAfXh5enp6e318e3t9fn5+fn5/f35+f39/gICBgICAgIGBgIGEiouLioqKioqJiYmJiYmIiI+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Oj46Ojo6Ojo6Ojo2NjYyMjIyLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLioqKi4uLh4B8eHp6eXt8fHt8fH1+fn5+fn9/fn9/f39/gIB/gYGAgIB/gYSJi4qKioqJiYmJiYmJiIiIj4+Pj4+Pj4+Pj46Pj4+Oj4+Ojo6Ojo6Ojo6OjY2NjY2NjY2MjIyMjIuLi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKiYmKioqKioqKioqKioqKioqKioqKi4uHgHt5eXh6fHx6e3t9fX5+fn5+f39+f39/f39/f3+BgYCAgH+BhIiLiomJiYmJiYmJiIiIiIiOjo6Ojo6Pj46MjI+Sj5COjo6Ojo6NjY2NjY2NjY2NjIyMjIyMjIuLi4uLioqKioqLi4uLi4uLi4uLi4uMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKiomKiomJiYqKioqKioqJiYmJioqKioqKioqKioqKioqKioqKi4aBe3h5eHp8ent7fH19fn5+fn5/f35/f39+fn9/f4CAgYCAgIGEiIqJiYmJiYmJiIiIiIeHh46Ojo6Ojo6Ojo+MkJOQkI+Ojo6NjY2NjY2NjYyMjIyMjIyMjIuLi4uLi4qKioqKioqKi4uLi4uLi4uLi4uLi4uMjIyLi4uLi4uLioqKioqKioqKiYmJiYmJiYmJiYmKioqKiomJiYmJiYmJiYqKioqKiomJioqKioqKhYB6eHl5fHt6ent8fH1+fn1+fn9/fX9/f35/f39/gICBgICAgYSIiomJiYiIiIiIiIeHh4eHjY2Ojo6Ojo6Pj4+PjoyNkI2NjY2NjY2MjIyMjIyMjIyMi4uLi4uLioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYmJiYmJiYmKioqJiYmJiYmJiYmJiYmKioqJiYmJiYmJioqFf3l6eXh7e3p7fHx7fn5+fX5+f39+f35/fn+Af3+AgICBgYCChIeKiYmIiIiIh4eHh4eHh4eNjY2Njo6Oi42Nj5WPiYyPjYyNjYyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYR+eXt5ent7eXt9fHt+fn59fn1+f35/fn9+f3+AgICAf4CAgICEh4mIiIiHh4eHh4eHh4aGhoyNjY2NjY+MjImKj42IjJGPjY2NjIyMjIyMjIyLi4uLi4uKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uKioqJiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJg355e3p8e3p7fX17fH9+fn5+fX5/fn9+f3+Af4CAgH+AgH9/f4OGiIiHh4eHh4aGhoaGhoaGjIyMjIyLiYyKiIeJhoyOjJCMjZGOjIyMi4uLi4uLi4uLi4qKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiImJiYmJiYmJiYmJiYmJiYmJiYmIiImJiYmJiYmJiYmJiYiIiIiIiYmCf3h7e3t6enx9fHx9f39+fn19fn9/f39/f4F/gIB/gICAgICAg4aIh4eHhoaGhoaGhoaGhoWMjIyMi4yOjoyKioeEiIuKjIuNjo+Li4uLi4uLi4uLi4uLioqKiomJiYmKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiomJiYmJiYiIiIiIiIiIiImJiYmJiYmJiYmJiIiIiIiIiYmIiIiIiIiIiIiIiIiIiIJ/eHp7enp6e3x8fX1+f35+fX1+f39/fn+AgICAf3+Af4CAgYCDhYiHh4aGhoaGhoaFhYWFhYyMjI2NjJCSjI2Ii4mJi4uLi4mLjIqMi4uLi4uLioqLi4qKiomJiYmJiYmJiYqKioqKioqKioqKioqKioqKioqKioqKiYqJioqJiYmJiYmIiIiIiIiIiIiIiImJiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIiIiIiIiIiHgXx4e3x5enp8fHx9fX9/fn59fX9/f39+fn+Af4B/f3+Af4CAgIKEh4eGhoaGhYWFhYWFhYWFjIyNkY+PjZGJjIaJjIuIiImMiYeNjo+NioqKioqKioqKiomJiYmJiYmJiYmJioqKioqKioqKioqKioqJioqKioqKiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4WAenl9e3t7enx8fHx9f39+fn19f39/f35+f4B/gH9/f4B/gH+AgoSHhoaGhYWFhYWFhYWFhISLi46PjoyLj4iHiYmMjYWFjo2KiYyNi46KioqKiomJiYmJiYmJiYmJiYmJiYmJiYmKioqKioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHhoaHh4eHhH55eX16enp7fXt8fX5+f35+fX5/f39/fX5/f3+Af39/f39/f4CChIaFhoWFhYWFhYWFhISEhIuLjI6MjI2Lh4mIiomGgoiNjoiKi5GTj4uJiYmJiYmJiYmJiYmIiYmJiYmJiYmJiYmKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIeHh4eHh4eIiIiIiIiIiIiIh4eHh4eHhoaGh4aGhoaGhoaGh4eDfXp5e3p5enx8e31+fn5/fn59fn9/fn9+fn+AgICAf35/f39/gIKEhoWFhYWFhYSEhISEhISEioqOjYmIiIqKh4iHiomIioiIh4qGi5GPiomJiYmJiYiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHh4iIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGh4J8eXl6eXp7e3t7fX5+fn5+fn59gH9/f39/f4CAgH9/fn9/gICAgoSGhYWFhISEhISEhISEhISKi5CPiYmJi4qHh4WHiYuKiYSLjYmOjYqJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiIiIiImJiYmJiYiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGgXt4enp4e3x7e3x+fn9+fn5+fX1/f39/f3+Af4B/f39/f3+Af4CChIaFhYSEhISEhISEhISEhI+Qj4+IiYuIhoeIiYuLjIuJioqNio6Oj4iJiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoaAe3h5eXh4enp8fX1+f35+fn59fn9/f39/gIB/gICAf39/gIB/gYKDhoiGiIaDhISEhIODg4ODkpKOioeKi4qLh4uNiYqJi4iHiouIio+SioiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhn96eXh4eHl5eXx9fn5/fn5/fn1+f35/f3+Af39/f4CAgH+AgH+BgoOHjo+PjoiHhIWFhoaFhYWSkI6KiYmIiImKioiIh4aKjIiHiYmOkJGNh4iIiIiIiIiIiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4aGh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWGf3l4d3d3eXp5e3x9fn9+f35+fn5+f35+fn+Af4CAgICAf3+Af4GBg4eOjo6Ojo6Mjo2OjY2MjZCQjomHhoiJiYeIiouIiYyJiYaKjY6PkYuIiIiIiIeHh4eIiIiIiIiHh4eHh4iIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhYZ+eXd5d3d6eXl8e31/fn5/fn5+fn5+fn9+f4B/fn+Af39/f39+gIGEiI6Ojo6Ojo6Ojo6Ojo2NkJGOi42JjIiIiYaHiYaIioiHi4yLjpCQiIeIiYmJiIeHh4iIiYmIh4eHh4iIiYiIiIiIh4iIiIiHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhoaFhYaGhoWGhYSEhIWFhoaFhIWFhX55d3l2eHl4e3x7fn5+fn5+fn5+fn5+f39+f39+f39/f35/f3+AgYOGjY2Ojo6OjY6NjY6OjY2Qj42Ni46KhoiKhISLiYeDhYSDi4mLj42JjI6QkI+NjYyLjY6Pj42NjI2Nj4+Pjo6MjYyMjY2KiYiHiImHh4aHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoeHiYqKiIeJi4yNjo2LiImLi42OjYyJiImMgHl3d3Z6eXh7e3t9fn5+fn5+fn5+fn5/f39+fn5/f4B/f4B/f4CBg4aMjY2NjY2NjY2Qj4+Pj46NjI6KiYuMjIeFiY2Lh4aIh4aHh4uNjo6Pj4+Pjo+Pj4+Pj4+Pj4+Pj4+Ojo+Pj4+Pj4+Pj4+Oj46Oj46Mi4uJh4eHh4aIhoaGhoaGhoaGhoeLiYeHiIiLjY2Mi4yLjY2Ojo+Ojo6Pj46Ojo6Ojo6Ojo6Njo6NjY2AeHZ4eHp4enx6fH5+fn5+fn5+fn5+f39/fn59fn9/f39/gH9/gIGDhoyMjIyMjY+QkpOTk5KSjYyMjIqHioyKh4eJiYWCiouIiYWJjpCNjo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjI2NjI2LiYaHh4eHiYqLjY6NjYyNjY6OjY2OjY2NjY2NjY2NjY2NjY2OjIyNj4+OjY2MjIyLi313dXd5enp7e3p+fn5+fn5+f35+fn5/f39+fn1+f39/gICAf3+AgYOFj5KRkJGSk5OTk5OTkpKLi4uLiomMiouLiYuKhoeOjYiIjI6OjIuMjIyNj46Njo6Ojo2NjY2MjY2NjIyMjIyMjIyMjY2NjYyMjI2NjYyMjI2NjIyNjIyMi4yMi4yMjI2MjIyMjIyMjIyMjIyLi4uLi4yNjY6Sk5OSkpSRkJOVlZSTk5COjo6Oe3Z2d3h6ent7e31+fn5+fn5/fn5+fn5/f35+fn9/f39/gIB/f4CBgoSNkpKTkpOSkpOTkZKSkoqJioyJi4qJjIuKioiHiYqKi4mKjY2Mj46Nj5KUlJOUlJOTkpGSkI+Ojo2NjY2Pko+OkZGOjIuKioqLi4qKi5CPjoyMjIqKioqKioqKiouKioqKi4yLi4uMjIyKiouLi46RkpOTk5SUk5STk5SUlJOTk5KSkpKSk5F6dXZ2eHt7e3p6fX5+fn5+fn5+fn5+fX5/fn5+f39/f3+Af39/gIGChIuRkZGRkZKSkpGRkpGRiYmIiIqMiYiJiYuJhoSJhoyKh4ySkpKTk5OUlZWWlZWUk5OUlJSUk5SUlJSVlZWVlZWUlJOTkY+QkZKQjoyRlZWVk5KSjo+QjYqKi4qKi42OjY6RkpCRkpKSkpGRkpKSk5OTk5OTk5OTk5OTkpOSkpKSkpKSkpKSj3h1d3l6e3t7ent9fX19fn5/f35+fX5+fn5+f39/fn9/f4B/f3+AgYKEi5GQkJCSkpKRkZGRkZGIiIiIi4uJg4eLi4yMiIeHjYyNkpSSkpOTlJWWlpaVlZSSkpOTlJSUlJWVlZaXlpaWlpWUk5SUlJSVlJSUk5OVlZWUk5KTk5OTkJGSkZGSk5OTk5KSkpOSkpKSkpKSkpKSkpKSk5OTk5SUk5OSkpOTkpKSkpGRkZGPdnJ3enp7e3t8fX59fX1+fn9+fn9+fn5+fn6Af39/f3+Af3+Af4CBgoSKkJCRkZGRkZCQkJCQkIeHh4eIiIiFi4+KjI6Njo+OkJWUk5OTk5SUlZWVlJSVk5KSkpKTlZSUlZaWlpaWlpaWlpSTk5OTk5OUlJOSk5SVlZSTkpKSkpOTk5OTk5OTk5KSkpKSkpKSkpGSkpGRkZGRkZKTlJSUlJSTkpGRkZGRkZGRkZGRkYx0c3d6ent7e3x9fX1+fX5+f35+fn5+fn5+fn9/f39/fn9/f39/f4GDhIqQkJGRkJCQj4+Pj4+Ph4iKi4yNjYuOj42Mjo6RkpGSk5OSkpKSk5SUlJKSk5OTk5OSkpOUk5OTk5WVlZWUlZWUk5OTk5KSk5OUk5KTlJSUk5KSkpKSk5OTkpKSkpKRkZKSkpKSkpKSkpKSkZKRkZGSkpOTlJSUk5OSkZGRkZGQkJCQkZCRinN0dnp8fHp7fXx9fn59f35/f35+fn9+f31+f39+fn59f39/gH+AgYKDipCQkZGQj5CPjo+Pjo+Oj4+Pj4+Pj4+PkI2OjpCRkpKSkpKRkpKTk5OTkpGSkpKRkZKSk5OSk5OSk5STk5OTlJOSk5OTk5OTk5OSk5OTkpKSkpKSkpKSkpGRkZGSkZCRkZGRkpKRkZGRkpGRkZGRkpKSkpKSkpKSkpKRkJCQkJCQkJCQkJGGc3V2e3x8e3x9fX1+fn1/f35/fn5/gH9+fX5/fn5/fn5/f3+Af3+BgYGKkI+PkI+Pj4+Pj4+Pj4+Oj46Oj4+Pj5CQiI2PkJGRkpKSkpOTk5OTkpKSkpKSkZGRkZKSk5KTkpGRkpKSkZKSkpKSkpKTk5KRkZKTkpGRkpKSkpKRkJCQkJGRkZGQkJGSkZGRkZGSkZGRkZGRkZGSkpKSkpKSkZCRkZCPj4+Pj4+Pj4+PkX9ydHh8fHx7fHx9fX5+fn9+fn5/f3+AgH99fn5+f35+f39/f4CAf4GBgYqPj4+Pjo6Ojo+Pj46Ojo6Ojo+PkI+Pj4+GjpCQkJCRkZGRkZGRkZGQkJCQkZGRkZGRkZGRkZGQkJCRkZCQkJGRkZGRkZGRkJCQkZGQkJGRkZGRkI+PkJCQkJGRkJCQkJCRkJCQkJCQkZCQkJCQkJCQkZCQkJCPj4+Pjo+Pj46Ojo+Pj4+PeHJ2eXx9fHp9fH19fn5+f35+f39/f4CAf39/fn5/f35/f39/gIB/gYGAio6Ojo6NjY2Ojo6Ojo6NjY2Oj4+Pj4+PjoiQkZCPj4+QkJCQkJCQkI+PkJCQj4+Pj5CQkJCQkJCPj4+PkI+PkJCQkJCQj4+Oj4+QkI+PkJCQkJCPjo+QkJCPj4+Pj4+PkJCQkI+PkI+Qj4+PkI+PkJCQkI+OkI+Pj46OjoyMjY2NjIqDiYhzc3Z4fX58eX18fX1+fn5/fX5/fn9/f39/f4B/f39/f4CAgH+AgH+BgYCJjY2Ojo6Ojo6OjY2OjoyNjY6Ojo6Ojo2NiJCRkI6Njo6Ojo6Ojo6Pjo6Ojo6Ojo6Pjo6Ojo6Ojo6OjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Pj46Oj4+Pj4+Pj4+Pjo+PjY2MjYyNjoyLi4mJiYiFhYSDgoKEgnR5fXp4dXJrZWltb2xmZmdncHNzd3l9fnl6e3x9fX1+fn59fn9/fn9/f39/gIB/f3+AgIGAgIB/f4CBgImNjY2NjY2MjYyMjIyMi4uLjYyMjIyMjIyGj5GRjIyMjIyMjIyMjIyMjIyMjIyNjY2MjI2MjYyMjY2MjIyNjY2NjYyMjI2MiomKi4uJh4KAh4iEgXt6gH57fXx8fXlzcnJycnV1cG1ramppZ2NkYV9bXF1eWFVXWFlTS0VJSkpLTE1PT0tgdHR3eX19eHp5e3x8fX5+fn1+f39+f35/f4CAgH+AgICBgYCAgICAgIGAf4OEhYSFiIuLjYyMjIuLi4yGiYqKioqKh4OOkJGNiouLi4uMiYmKioqKiouLi4eDioqHh4mGhYWEhIeJiYWCg397fHl6e3pzcHFxcW1samdsbWdlZmVmZGNlZGVkZWVlZWRkZGNhYV5dXFpYWFdUUFFSU1JTTU1KSUZESEpHR0hHR0xOSWdzdXh6fXp4d3l8fHx8fn5+fn9/fn9/f39+f4CAgIB/gICBgICAgICBgYFnXmBjYWNucX17ent/fXd8fHZ4ent4eHpvcHt4eXt8e3h3e394dXd0dHZ0dXZ3dXJwcWtscnBnaGtsbm9tamlpaGhlZWRkZF9gYWJgYF5dWVhaWltdXV9gX2BfX19gYmFeXl5eWVldXF1bV1dWUlRSU1NOUUpISUZERUhMTEhGR0lLSklNbXJ0eHp7end3eXt6e3x+fn1+f39+f35/f35+gIGAf3+AgIGAgICAgICCgWdYW1pZXFtcY1xaXF5ga3FtcHBvbm5vbmtpbmxrbG9qaWtraWpraWZmZ2dnaGhnbWVqZmhlaGdjYmJhYmBgXVhbW1dYV1RWUVBUU1NNSkxLTExOTk9UWFhXVVVUUlBQTU1QT05LTE1QUU9MTEpHSUlHSEhJSEhIR0ZHSEpKSEhISUlISVZwc3V5ent5dnZ5enp7fH59fX5/f35/fn5+f3+AgX9+f4B/gICAgICAgIGBbFtYVlZWWVlaWVlYVVZoamxubmxra2poaGloZGVkYlxiZl9fYWNfXF9dYF1eWl5cXV5iaWBdXlpZX1tYV1NOTUtLS0tMSUtNTktKS0tMSktQTEtLRkdHSUlGR0lISUZFSEdGRkVERUVEREVJSUlHSEdIRkZLTUtJSUlIR0hLTU1LTExMVXFzdnl6e3l2d3h3ent8fn1+fn9/f39+f3+AgIGAfn5/f4CAf4CAgIB/gYJoUlRVVlNVV1lZWVdXV1tbYWNfXlxbWFZWWVZSVFJRUVVUU1NUUE1KTU5QUk9NUFBcV15sV1VSUVFUUFBOTk9MSk1MS0xKSktLRklJSkxJR0pISUlFR0dGRkVFSElKR0ZHRkZHR0hKR0dISEpMSkpLSUlISktLSkhKS0pISUtMTU9QUEtUdHN1eHp6eHZ2d3d6enx+fX5+fn5/f35+fn+AgYB/f3+AgYB/gICAgH+AgmlQUlRXVVRWWVdYWFpbVFRTUlBRU1FRUU9OTlBQUU9MTlBPTk5NTEtNTk5QTU9QUGBXXXJVT09PTk9QUFFPTk5PTk5QTk1NS0lISEpJSUlJR0ZHR0dJSkhJSEhJSEhHSEdISElISUxLSklISkpJSkpIR0pMS0pJSUhKSktMTk1NTU9RTFVzcnN3enl3dnR2eHp7fX19fn5+fn9+fn5+gICBgICAf4GBgH+AgICAgICBbE9PTlRZVVVdW1lXV1hOTUpKSUZKT0xKSkdJSk1NS0pMTUpHSUlJSktMRkRGSktMY1RbdFZLUE1MTE5PT09NTk9MTk5OUFBPTE1MTk1MTEpJSEdJSElISElJS0xLS0pJS0pJSklJSUlJR0dKSUdJSUpKTk1OTEhJSklJSk1PT01MT1JOWXBwcnd4d3d0c3R3enx+fX5+fn5+fn5+fn9/gICAgICAgYCAf39/gICAgIFvS0pNTlFOTlVXVlZSU0lFQ0VFUkREQT5CP0RAQD5CREFAQURHRkVIRUJBQEBDQ0dmVFV1U0pQTElJSkhISklKSUlLSkxQTk1MTU1MTU1NTElIREZGR0ZGRklKSUlLSkhMSklKSkpJSEhKS0tIRkdJSklLTU5OSktPTUxLTU1PUE5QT1BgcG9yd3h2dHJzdXd6fX19fn5+fn9+fn1/gICAgICAf4CAgIB/f3+Af4CAgXNQUE5OUE1KS1BSUE5RQ0RCQUZRRT1DPT9FSDk6Oz0/PTxBRkA+Ojs+PjxFRD0/SmNbVXBLREZIR0ZHQkREREZFR0dHR0pHSEpLR0NER0pHQ0RFQUFDR0hHSEdISktKSElMS0lISktLTU5MTUxMSkpMS0lLTU9PUFNRT1BQTk9QUlFNUGdwb3N2dXRycXR4eX19fX1+fn5+f4B+foCAgH9/gIB/f4CAgH+Af4B/gICCdlRVUVFQT0xNUFBOT09BQkFAQkE/Oz48Pj8/Ozg5ODs7OkA7Oz48Ozs8PEhMPT5VZGJeZ09BRUVGREZGREZJSEM/QEBAQUFCQUE/Pjw9PkFAQD8+P0BFR0dHSUtMTk1OTUxNTUpLTVBVU05MTlFOTk1OTE1NTk9OTk1LS05OTk1OTkxUbnBwcnR1c3Fydnh5fX19fn1+fn5/gH5+gICAgICAgH9/gICAgH9/gH+BgYJ4UVFSVFJTUVNTUVFST0BAPT4/PD8+QEE/PT45Ozo7Ozk5Ojg4Ozw5Nzk7Oz48SGJtaGZsYEZDP0xDQ0ZEQ0NDPzs+PkBDQ0E/Pj9BPkBAQj9APD9CQEFDRUVFSktQT1BPTU1OTExMT1JRUFJOTExPTUtOT0xMTEtMS0tKS0tKTU1LS1xxcXF1c3VycXR4eHp9fn1+fn5+f39/fn5/gIGAgH+Af4CAgICAf4CAf4CAgXxSTU9RUFFSUlRSU1NOPDs8Ozs7P0BBQkA9PDk8PTw6Nzk6Ojk3OTo6Nz09ODlVbHJranBrTjVKWD5AQUA9Ozs+PD09QEJDQT9BQkE9Pj09Oz0/Q0RCQD9BREJFR0pKSkpKTE1MTExNTExOVVNLTE1USVBKSU1KSUpLS0pJSEdKS0lKZnJxc3VzdXJydnl5e31+fn5+fX9+f39/f36AgICAf4CAgICAgIF/gIF/gYCBgFZMTlBQTlJRUFBRUU44PT88PDo9PkFAQT8+PkA/Pj48PT0/QD09PT9DQE9CPFhucW5sc3FbQ2NVPT9AQUA+P0E/QEBBQEBAPT8/PTw6Oz09PD9AQUJCQUBCREZGRkdGR0dISUtMTExLTEtKS0lKSk1MTEpMS0lISUxMSklJSElLR01tcHF1dXR1c3V4eXl8fX5+fn5+fn5/gH9+gIB/f39/gH+AgYCAgYCBgICBgYCCYUtPT05OT1BPT1BQTzo8Pjw9Oz8+PkFBPz0/Q0NEQT89PkBBP0A7XW0/UllKUmtva2dycmZfakg7PkFBPz5AQD9BPz89PD48PTs7PD0+QUA/QD5AQ0NEQkRFSEVFR0hISEdGSUpJSUlJSUhKSkpKTEtKSklJSEhKSktMS0lLSkpIVnBwcXNzdHR1eXp7e3x+f35+fn5+f39/f39/f3+Af4CAgICAf4GBgICAgIGBgIJtTFBRTk9QTk5PUFBPPjw8PT4/P0A+QEA/Pz9DRkQ+PDw9QD04OjtudkdBYl1caW5oY3Fua2xmPjk7Pz49PD07PEA9PTw8Pjs9PD0+QUBCQUBAP0JEQ0RFRkZGQ0VHSElJSEhJS0tMTUpKSUpNTUpLSktJSEhISEpJSktKSk5MSUlfcHBycnJ0dXZ6e319fX5+fn5+fn5/f35/f36AgIB/gICAgICAgYGAgICAgIGAgnZNTk5NTk5MTE5QT0w+QTw8PT8+QkM/PkFBQUJBQFpRPDw9S05ISHZ2TThXamhrbmpvcW5tbFY6Ojs+Pz89PDg6Pjw9Pj89Oz4/QEJDQkJDQ0FCQkFCQkRCQkRCRENGSUdGRkhJSUtNSklKSktMSkpJSkVESUlGRkhISUpKTEpGRmdwb3FxdHZ1d3t8fH18fn59fX1+fn9/foB+fn+AgH+AgICAgICBgYCAgICAgICBek5JS0tMTExFSUxOTTw/PDw9PkBAQUE7QkNCQ0BDc3lIPF+Ag4B6e3dWO0Ngc3Ryb3Vxbm9gQT89PT5BQ0A8OTtBPz4+QT07P0JAQkNCQENDQUNBPT0+QD0/QUFBQENFRUBAQ0JDR0dFRENGRUZGR0VEQEFHR0ZDRkRHSEpHQz5IbG9wcHF0dXZ5fHx8fHx+fn1+fn5+fn5+f36Af3+AgICAgICAgIGAf4CAf4CBgIF+UUhLTU1NS0pLTE9RQD8+PkFBQEBBR0FCRENFQEhyeWtlg4SDg4OAfV0+P0doeHVyc3BtbEw+RUJCQkZIQz08QERDQUE/Pj1AQT4+Pj88PkBER0VAPkBBP0BDRkVDQkNDQEJEREJERUFCPkFCQkFCQEA9QUJDRENDQUNFR0E/PVZwcHFwcnV0d3p8e3x7fX9+fX19fX1+fX5+fn9/foB/f4CAgICAgYCAgIB/gIGAgX5SSEtNTUxLS05OUlVEQkBDQ0FBQkBCQ0BAQUFARm90foKCgYR+fYR1TEJDQ09sd3h7enFfRUVJSUlJTU1LRUNGR0hFR0VFRUREQ0E/QD4+QkZKSkdFRUdGRkpOTktKSUdHSEtMSUdHQ0REREVEQUJCQ0BDREVEREVERUZDQkFEZW9wcXF0dnV4e3x6fHx+f319fX19fn59f4B/f39/f39+gIGBf4CBgICAgH+AgICAfVJJSUpKSEpKTE9SU0dGRUdIREdIREA+PDs+QEVFaHN9gXx/hH55hXJDREVFQ2SCh4eIhV5GSUpMTE5PT0xIR0hHSElJSEhHR0hIRUNFRUVFRkhKSkZFR0lKTU9PTU1LSktKTU5LSUhHSElIR0ZFRkZGREZIR0VFSEhGSEdIRlFubnBxcnZ2eXt7e3p9fX5/fX19fX1+fn1/f39/fn5/gH+BgYGAgICAgICAf4GBgIB8UEhHSElGR0lKTU5OSkxJSUpLTE5KRkNBQkNGSkdge4CAeICEhYOEiW1BQVd1hYiHh4eJgldITE1MTU5MSkdHR0dER0dHR0ZIRkhFQ0RERkVEREhIQ0NDR0pKS0xMTExMTElKS0pKSUlJSEpISEdISUhHR0hGRkZISklJSUlIXW9vcXJzd3d6e3t6e319fn59fX19fX5+fYB/f39+fn+BgIGAgYCAgICAgIB/gYCAgHxNR0ZIRkVGR0dKS0pMTUxLTU5NT0tJSEhKS0tMTE5bfIKCg4OFhoaIg1VthoiGh4aHiImIfFBLTEtIR0ZGREVDQ0BBQ0NDQ0ZGRUJAPj5AQUFAQkQ/Pj9ERkhERUdJSklJSEhJR0lJSkpJSEZKSkpKSUpJSkpKRklMTEpKS0tmb3BzcnR2eHl7e3t8fH1+fn19fX19fn59f39/f35/f4CAgICAgYCAgIGAgICAgICAfU9GRkdGR0hHRUZHR01NTUtMS0lHQ0NDRElLS0xMSlaBhISEgoKGhoaEgoaFhYWGhoaHiIaKdUlJRkI/P0A/Pz88PDw+Ojo8QUFAPjw5OTg8PD07Pjs5Oz9BQkBBQ0NCQEFCRERCQ0ZISUhISExNS0dJSk1NTk1KSktLSkxNU2xvcXRzc3d5e3t7fH19fn9+fX19fX1+fn5/foB/fn9/gICBgIGBgICAgYCAgIB/f39+UUZFRkdJSUdEQ0VGTk1MSklIRT85Oj5ARUhISkpJZoWEhIR/gYODgoOEhIWFhoeIiIiIiYyOZkJCPTg4Ojo5ODc4ODk2NDc5Ozw6ODU2Nzc4OTc4NzY4ODs7Oz1AOzk5OT08Pjs7PUFDRUhKTUxMR0lIT1JRUFBOTE1NT1Fdb3BydHN1eHp7e3x8fn5+f359fX59fX5+f39/gH9/f4CAgICAgYCAgICAgICAgIB/f39RR0ZHSEpIRkVGR0hMTEpJSUdDQjU2OjxDQENHSUlphoSEgX6Bg4ODgoOEhomKi4uLiomKi4yJVDo4NjU2NzY2NjQ1NzYzNDY4Ojg3NjU2NTY3Njc3ODo3Nzc4OTs3NTc4OTc5ODc2OjxAR0ZJRklGRUZPU1JTU1JPUFBSVGVwcXN0dHd5e3x7fH1+fn5/fn19fX19f39/f3+Afn+AgICAgICBgICAgICAgICAgH9/flJISEhJS0lHSUpJSkpLREVIRUJANTc4OD06PUVDQmaFg4GAgYODg4ODhYmKiomJioqKiouJiYqBSDY3NjQ2ODg3NDU3ODQ2NzY5OTc2Njc2NTo6Ojo6Ozg5ODk4Nzc3OTo5ODg3ODU4OTtBPT4+QkE/QUtMT1FQUU9PT1JXa3FydHR1d3l7ent8fX5/fn9+fX19fX5/f4B+fn9/f4CAgH9/gICAgICAgH+AgICAf39+VEhHSUlMTUtKS0tMSUg/QEFAPDo1Nzk4OTc7Qjo9coSAgYOEhISEhIaJioqIh4iIiYqKjIqJiYx6Pjk4ODs8PT45Ojs8ODk7OTo7Ojk5Ozo5PT09Pzs7PD06Pjs5Ozs8Ozw8OTo8ODo6Ozo5OTk8Pzw9QUJESUpNS0lLTFdvcnN1dHZ4e3t7fHt9f39+f359fX19fn9/f35/f39/f3+Bf4CAgICAgICAf4CAgH+Af35URkVGSUxOTkxKSk1CPzo7PDo4OTk4OTo6Ojs/Pkh+hIKChIWFhYaIiYiHhoaGiImIiYuMi4mKioxsPDs+QkNFRUFBQUI+QEJAQD49Pj5APz8/QD9APT0/Qj9BQT9BPz1AQEA+P0E9Pjw7Ojs5OTs/PTs7PT1BQUNBQkNBWHBxdHR0dnl7e3x9e31/fn9/fn19fX5+f35+fn9+f4B/f4CAgIB/gIGAf39/gICAf39/flJFQ0FHSk5PTElHSzo4Ojs5Ojo8PTo7Oz09P0BCUoOCgoSFhIWEhomJiIiGhoaHiImKi4yLioqLiotePkRHSUtKSUZHR0RGSEdFQkBAQ0VDQ0FCQ0I/QERIRUNFREVFQUZFRkRFRkRAQj88QD49P0A+Pz8/Pj8+Pjo7PTxgcXJ0dHZ3enl6fX19fn5+f39+fX19fX5/fn5+fn5/gH9/gICAgICAgICAf4CAgIB/f4B+UERAPUNIT01HRkJEOTc6Pjo8Oz4/Pz89QUBDQ0ZYhYKDhIWGhoaIiYmIh4aGhoeJiYqLjI2MjIuKiohXSExNTUtOSklLSElKSklFQ0RGR0ZEQ0VGREJISUtIR0dGR0dFS0lLSUpLSkNGQ0NEQkFBQ0JEQ0NERENBPTs9QGhwc3R0d3d6eHt8fH19fn5/f359fX19fn9+fn59fn+Af3+AgH9/f4CAgICAgICAgH+AgH9PQT49P0RMS0BCQkE5ODw+Ozw7PkA/QT9CQkdHSlmFgoOFhYeHiImJiIiHhoaGiIiIiYqMjYyMi4uKjH9QTU9NS05LSkxKSUlISkZER0hISUVFSEZGRUxMTUlKR0dISUpPTU5MTE5LR0dHR0VFQ0ZGRkZERUhIRkNBP0BMbHB0dXZ4eXl5fHx8fX1+fn9+fn19fX1/f35+fn5+f39/f39/f3+AgICAgIB/gICAgICAf1FBPz4/RUdHPTxAQDg4PDs8PTo/QT5AQENGSUpRYIKDhYSFhoaHiIiIiIiIh4eIiIiJioyNjIyMjIuKjXFNUU9NTExLTEpIR0VKSERKSEdLSkhKR0dHS0xOTExISElKTVBOUE5NT0tJR0lKSElESUhIRkZHR0hGQ0JBQ1VucHV3d3l7eHl6enx8fX5+f39+fn1+fX5+fn5/f36Af4B/f3+Af4CAgICAgICAgICAf39/VERBQUJHR0I/OD9AODo8OD0+Oz1BPj9AREhKTFVxg4SEhISFhoeIiIiIiIeGiIiIiImJjIyLjIyLi4uLi19SUlBNTk1LSkdGQkdKR0xKRktPTEtKSk1NTE9QTkhJS0xPUVBQUU9PSklKSkxKTEZHSEdFR0lGRUVCQEJCXG9yd3h5enl5eXp6e3x+fn5/fn59fX19fn9+fn9+f4CAgIB/f39/gICAgICAgICAgH9/f39VRUNFRUdHRUQ7P0E7PTw5QD4+QEJHR0FHS0xQVnmFg4ODhISGiIiIiIiIh4eIiIiIiIqLi4uMjIyMi4uNfFdWUlJUUk9MS0pERUZLT05PV1ZRUE9RU1JNU1RPTVNMUFNVV1JTUVBMSk1NTUtOR0dKRkZISkRERUVCRENjcHV5eXp6ent6e3p7fH59fX9+fX19fXx9fn5/gH9/gICAf39/f3+BgYCAf39/gIB/f39/f1VGRkdHR0dIRj5AQj0/PT1CP0NDRlZORk5QUFRYe4aDhYWEhIeIiIiIiIiIiIiIiIiJiouKioyMjIyPi4uLZ1ZVa2FFUlFRUEk7O1FTUmB1XVVWVFZZWVJZWFJaZlBVV1pdUlRXUVBOUlBQUFFLS0tISEpIRUZJSElISWlydnl5enl6e3t8ent8fXx9f359fX19fX1+f39/f3+AgIB/f39/f4CAgIB/f3+AgH9/f35+U0hKSUlHR0ZFPz9BQUVCQ0dFREVMWFJNVFVWWFt8hoWHhoWGh4iIiIiIiIiIiIiIiIiIlJyMioqMfWGKi4uHbFtkVTpYWFhTUT9AVlVZXGRgVllicl5dVl1aVkVRWVpbWV9UWmdSVVZYVFRWVE9PTUpMSklJTE1LT01Tb3N2eHl4d3p5ent6e3x9fH5/fn1+fX19fn1/f39+f4CAgH9/f3+AgICAgH9/gH+Af39+fn5WSkpJSEdGRERCQT9ITUlNUEtJS1BUU1NYWlpcXHiFhIWFhYWGh4eHiIiIiIiIiIiIiImcnaCPiY5nO36MiYqLeW5wWFpbWlJUUlZWVFpadYNZVX2QYVxYXV5XSVZdXVtbX1lJWVhZW11YWFlXUlFOUFFNTU9TUVFVUmFzc3Z3d3Z4eHh6e3t8fX19f39+fX59fX1+fn9/gH9/gIB/f3+Af3+AgICAf39/gIB/gHh5fVlOS0lJSUZCREBBOlBRUVdYUFBPUVNUVFhYWVpbboGCg4WEhYaHh4eHh4iIiIiIiIiIiJaanJeIioFuhomIh4OKf2ZZWVxZU1VUV1JRV1ZjloBRZXJYWldfaFBgZltbWFxnYUdPWmhnXFtcXV1XUk9TUFBRVlZWVllabnJ0d3Z2dHd4eHt7fH19fX5/fn59fn18fn9/f3+Af39/gH+AgH9/gICBgYB/gH1yfX9/b3R8XVNQT01LSkVDP0A7UFBaWltTU1FPUlJSVVNWVFdfdXiAhYSEhYaGhoaHh4eHiIiIh4eIh4ORjomJiIaFiIiGfYB7XFBVWFRSVFJRUUxPTUtmeVpdVFlVVl1aTFRaVFNUXlpYV1dXemtYWltcXlRRUVBJTk9XVlhaWmRxc3Z2dHR2eHl5e3t8fX19fn99fX1+fX1+f39/gIB/f3+Afn56eHd2c3V7f3+AgHRrfn5rcnleW1ZVVFJPS0ZDREFNXoNsVlJTTk9RT1FVUlNSUlRjZHaAgoKDhISEhIWFhISDhoaGhoeIhn6JiYiHhoOHh4d5bXFWSUtNTktNS0hKREZIRUM+U2NVf1JRUU1LUlRRTU9ZUU1OUVNVVU1RU1JQT01MSENJSFJUVVpcbXJ1dnVzc3d7enp7e317fX19fn19fX59fn9/f39/f399fX5+f39/f4B+e3Zzd31+fmR1fWlxdF9kXV5bWVZQTElMSWFsknRQUVNOUVJRUltSU1JRUlZVYnN7fH+AgYKBgX99e3uAf4OChYaHgoaGhoGEgYaFhnVfXUtDP0NDQ0NCP0RQQkRAQz5CSEdWQEhOTUddaVFIR09GREVGSEdIQkNIR0hLR0RBQURAT1BNU2RzdHV1c3R1enx6e3t7fH19fHt+fX19fn5/f3+AgIB/f3x8fX+Af39/f4CBgH12dHt/bWh8Z25xZmllZGJbWFNRUFVSc1dlW09PTkxRU1FVWVNVUVFUU09WYGtscnZ7e3h5dHJuc3RzeXh+foOAg4OCgIKAgoGBa0xHPz87Oz5AQD8/PmtRS2FFRkhJRUI/R0xNR01RVUlCRT8+PD08PT0/PT9BQ0M/Pjw9Qj5KTUZVbnV1dXN0dnh6fHt9fHx9fX19fH59fXx+fn9/f4B/f39/enl3eHd2dnh7foB+fXt4dnx1YXhnbHBqbGpqZmBbUVJaXFleSUpQUU5LTFFSUVRWVFdSUVdWUFhbYl1hZ21tbG9raGBucmptbHF1e3p9e3h6fHx4d3hkQkBAQj06QkNBQURCXF1Pe05PT05LTE1PT1FMS0xXTkhHQEI8OTc3NTk5PTs7Ozg5ODk/O0JIP1x0dHV2dXZ4enx8fH18fH19fn58fn19fX9/f39/fn9/f314dXZ6e3p3eXh1d3t8eXh1eXdjcWhpcG1ubW1oZl5PUF5cWklHUFJRT01QUU5RUlRWWFNSWVROWVpbV1ldXl5gZWBdXnF2a15gZ2t3b29sam9ubmxmYlhHRkZIQkFHSUVFRkRNUlBhV1JYUVBTU1JVW09PUVdQTUpDRj46OjY0ODc5Nzk6MzY2Nzk1PEI9ZXNzdnd3eXp7fX18fHt8fX5+fnt+fn19f39/fn5+fn9/e3d1eX18enh8fHx8dHd2d3Z1d2tuaWhxbm9vb2prYFVXXlpXTUxUVFNRUVVPTFJTVFdYVFRYUUxYWVpWWFhWWFldV1dYaHNrXVZhc2thYV9dZGFfXllVUE1PTkxJSEpLSUhGQ1FQU1pXVFROUVNZU1xlVU9TVFFOTElIQz9BOTk4ODk3ODg1NzU3ODU5OUducnR4eHp7e31+fX18e318fn5+en1+fH1/f359fn59f358dHR1e3hycW9vbnR4cXJzeHZ1cWZkZ3JucHBxbm1kXV9fWVdPUFhWVlNUVk9PVVZYWFlTVVRMS1RVVVVVV1BUVVdUVVJdbl5STllfW1ZZO0RWWFRbZkpMUFJST01NTk5OTEpGUVBVWVNUTkpPT1RTVFxWUlVTUk9NS0lISEY/Pz06Nzg3NjU5OTY3NjY1V3BxdHd5ent8fX59fXx9fXx9fX15fX18fn5+fXx8fX1+fXxydnF4eHJ2dXFxbnBwb3B1dnRuamRkanBwcXJwb2ZlZGNcXlJUWlZXVVRXVFJYWFlZWVJVT0lHT1BPT01SSk9QUFBOTk9UTE1JUE9TVFUyPFhNSUFRPWNhUVNRUE5QUVBOTk1RTlRSUFJNSUxLT1FQUlJTVFFST0xNS0xMSENCQT06Ojg3NjtCNDU2NjtlcHJ2d3h7fHx9fnx9fH19fX18e3h8ent9fX58e3l9fH18e3B1b3d1cHV0b3N2cHFxcHR1dmNqZ2VXaHRycnFuaWlocFZWVFVYVVdVUldWVVpZWFdVUVNGRkFGR0dIRkpESEpIR0VITEhLSEZMTVBNRy9FX1I+M0A+am9hUlJRQEZVUVBRUFFOUU9QT0xKTExPUE5OUFFRTlBPSkxNTUtHRUVEQjs9PDw5PUc2Njc2RG5xdXd6e3t8fH18enx8fX5+fXt5dnh3eXl8fXp6dn17fHp6b3Fud3JwdnFtcHNwb3Bzc3N0ZmdgaFpXa3JzcmxtbWtuYmVQU1RSU1VPV1ZWWVlWUVFRT0A+Oz0/QEJBQ0BCRURBQEdIR0hFRkhKTktFR0NPUkM4RU5TXWZTUVNBR1VQT1FRUE1NTk1LTEtMTk9PUU1PT01ITExJS0tMS0hGRkVEPEFBPjtARTs8ODlUcXJ0eXt7e318fHt5fHp6fn58e3V0dnJ2dnp6eHpyfHt8eXltcW94cnF1bm5xcm9vb3Rzc3J1dGtnZ15lam1wa25xbWltY0xPT01RU0xUVVRXV1VMTEtIPTk4Nzs/QD48PUBAQj0+RUhHREZGSUdLSkBGQUFARkhFSk9IUFJhXFFQUk5TT09QTExPTUtNTE1PTltXS01RT0dJSENJSkxMSkZGRkU/QkM+PEJGP0I/QWRxdXd7ent7fHt6end8d3l+fnt7cXN0cHJzd3R4eHN6e3l2d2xxb3ZxdHRsb3Fybm5vc3ZydHNycmtsZW5zaG1ubWxtbGprSUxISE9RSlFTUVRTT0tIQ0U9OTg3OT9CPjs/QUBAPkFESUVDSEhJR0lFQkI/Pj1DQkFISkVNT2JlUU1OTldLTE1LTE1NTUxLTk5TZE1KTFJJSUlFQUhKTE1OSkdJRkJBQkA/RUZFSERLb3B3enl5e3t6e3p3dHh1eHx8eXpucXJtbm9ycnZyc3h8eHZ2bXBtc3B1dGxwcHJvb29ydnVyVlZucWdseYRqbXFybm5qaG9ISkNHTE1JTVBNUE9IS0U/Qj05OTk6P0I/PEBCQUFERUdLRkNJSUdHSENDP0I/P0BBPkRFQ0tOUVRMSklNVEdJSUpMSktMSUpMTU9QUlBLR0NLR0NCSkpMTU9NSUpJR0NDQ0RJSk1MSVpzbXh5eHp7e3l8dnJwdXJ0eXl2eGpxb2tsbG50dG10dXtzdHhyb25xb3ZzbnBvcnBvcHN0eWpOYGdzanR8eWdvc3FqcWhlcUhLREdISEdKS0lKS0RHQj0+PTo6OjtAQj89QkJCQ0hGSkxKRElJRkdHQ0M7QUBCPkBAQ0RDSU1QR0lLR0hLREhJS01ISkxISUpMS01dUklIRE1HQURLS05NUE5LTUpLRkdHSk1OUU5MY25pd3Z3e3h7en1xbWxza3B0dHR1aHBtamlra3RwbnR0eXByeXRvcnFvd3NvcXB0cnBydXR5a05WbXVscXt2aW5vaWp0aGRvRktERkVHRUZGR0VHQkNAPjw9OTo6OkBEQD5CQ0RFSUZKSkxGSUlHRkZEQjtCQ0M+QEREQ0VHTE5IS05IREhFSUxOTUhJTEdGR0lJTE5LSkhFTklCRk1MT01PTU5OTUtISEpPUlFSTlJmZ2Zyb3N4dXt6fGxoam5la3Btc3FmbWxoaWtsdG1wdXR3cW94dG90c3J2c3BxcnRzcnR1dXZ2WFZ1dWtvdHJrb3ZsaG1lX3BHSkNFRkVCQ0JFQERCPkA+Ojs7PTo9PkNBPkFDRUdKRklIS0hHR0dGRUNAPUVFQj5CQ0NDRUdISUdNUEpGRkdLTk9LRkhKRkVERUlJSEtJRkhQS0RJTUxQTU9OT09OSkpJTVJVVFJPV2RgYW1ncHJvcnl6Z2VoaGNpbGdxbGZsbWdpa2xzbHB2dXRwbnZyb3Nyc3V0cXNzdXRzdXZ2dnl2dXR2bGt1dW1ydnFsbmxlck1HRUVHQ0JAQkQ8QkE+QT06Oj0/Oz4+QEI+QEJER0tGSUZJSEZGR0VDQkFBRkZDQkNCREVFR0dIRkxRTElPSkpMTElHSEVGRURDSUhIS0pHS1JNQ05PTVFPT09OT09LS0tPVVdWVVRYYF5caWFtaW5ocnNiZWZlZGloZm5pZm1taGtrbXJpcXZ1c3Ftdm5vcXJzd3Nyc3R1dnZ2dnd2d3Z2dHd1a3N1bnV0c3FyamtzTUdHRkhCQkBERTxBQUBDPDg5PT45Pzw/QkBAQERGSEVIRkZHRkVFRENFQ0RJRUNGRUJFR0VGR0dFSk1LSFFNSktISElFRkhJRkNJSUpLTUtPU05EUVJQUVJOT01OUE1MTlNXVldYVlhdWl1kYGhiamlna19lZWZjZ2dna2dna21rbWxwcWd0dHVyc252b3FwcnR4cXNzdXZ1gpF5dnZ0eHV1d3hub3VvcnN1cXFpb3pNSEdISEJCQkZFPEBCQkQ8Nzo+Pjo+OkBCPj8/Q0VGREZEREdFREVDREVGR0pFRUlHQ0dIRkhHRUNGSkpHTUpMS0hKTEZJSUtIRUtLTE1PT1JUT0lTVVRRU1BRTU5RTk1RV1pWWllWWl1aWGFgYGBeaGVjYGRmaGdqaGhqZmhubGxubXFwaXV1eHJycHVwcHBydXZwdXN1dnV7fn14dnR3dnZ2eHBsdXBtc3VucHJzeU5JSEdJREFDSEU8QEVCRT04Oj4+PTw8QUI9Pz5BQkZDRUJDSUVDRUVGR0dHSUZHS0hDSEhHSUdGREhLSUdLSE1LSktMSExLTUtKTkxPTlBSVVZPS1VWVFFUUVJMT1FQT1RZWlpcWllbXl9eYGJeXGFja2JgZGdocoVoZ2lmam1ucG9uc3FqdHV4cnNzdHJucHF2cnF1cnV1c355jn11dXZ2dnZ4cmh1cWtydGxxdnF1TUlLSEpFQkVHRTxAR0NEQDo8PkA/Pj9CQjxAPkFBRkNFRERJRUZFR0VISEZIR0lLSUZKSEhLSEZGTEhISEpHTExMTExJTUtNTU1PTFBQUVVWV09LVlZVU1NSUUxPUlJRVltbXV5bXF5fX2FgYWRdZGBlZmBlaGpjc3NmamhnbHBycW9zc25zd3dxdXZ0c21vcnVvcnNwdXJ2cnSBdnV1dXd2dXd0Z3Rya3Fya3J2b3ZKS0xKTEdCRURFPEBGRERCOz8/QUBAQERBP0I/QUNIQkZFRkhGSUZGRElJR0lISkxISEpKSUxKRkpLSElKSkdLS01NSkpOTE5OTlBLT1BSVVhWTU5UVlVTUlFQTE5UU1JXW15eX11dYF9hYWFgYmRlYWNoYmRpamd2i2xraWdtb3NxcHFwcHJ5dnJ1dXRzbW1zc21xcm90dXRycHN3dHV1d3Z1dXVlcXNrcHFqcnZvd0pNTExNR0REQUQ8P0VFRUM9QUFDQkJDRUJCREFBRUdDR0hIR0ZKR0NHSUdHSkZJTEhJSk1LTUxHS0lITEtOUUtSUUxTTUtOTk9QUE9UT1dYWFtOU1FXXFpTVlBOVFVUVFhaX2JiX2RhXmBiXmBlYWFiaG1nYmloaG14dmxoaW1vc3JwcXJycnZ0c3Vzc3Nua3NxbXByb3R2cnFxdXZ1c3d5d3V0dWNtdGtvcGpxdG93TE1MTExHRUFARD4+REVGQ0BDQUVEREZDQ0VHQ0NJRkNISkpJSUtHRUtKR0hKSUlLSEpKTktOTElMSEpNS1pmSmRcS2xTSE9OX25Va3NbcXBid2NSUGJ2dWh1Y2F2YFhucWJkdmluemZbbHRgbGpUYHd1aGpnaWZnbG1qbW9qbW5zcnBycnFyc3Jzc3J0cm5sdG9ucHFxdXVxcXN0dnZ1dXl3dXR0YGt0a3Bwa3FycXlLTkpLSkZDP0BCPz1ERUZEQ0NCRUVFRkJGRkhDREpFRUpNTUtMTEdHTUlHSUtIS0tJS0pOTE1NTExJTExMW3NiZHBebG1VTU5mc11mZXFsbnRncGlfYVlubmJwcGJrampnb3F0ZXRub1xvdWdwTUpyeXZrYmBrZWVteW1rdmxucHNycHJxcHFycXJycnRybW1zbm5vcHJ1dHFzc3R1dXV0d3h2dXRibXVrcHBscnJxektMSUlHRURAQkI/PkNGR0JGQ0VERUVEQ0hIR0RFS0dHTE1OS01NR0pOSEpLSklMS0pKS01NTk5NTUpNTU1bcm9vbnBwbGtNUFFsV05pYnRycGFtb3ZcWWxRXG1tWnFta29teHh0c2lwXF9ya3FqVXV5eHBjXmtmYmdxcGppb3Bwc3NwcXBxcXJycXFycnRsbXJtbm5vcnV0cXRydHV1dHV1enZ1dGVudWtwb2xzcnJ5SktHSEVFRUJCQj1AQEZHQkdESUVFREJGSUhIRUdLSkdNTU5LTU5HTE5JTEtJSk1JS0pKS09QT05NS05NTFxoZHVdbHFXbE5QUW1VWmtea2x2YWxkdFRlY05tWWxcdHBraWx4and1aHBdXnJraFdiY3d8b2NgZ2dhZGp1eWtubnFzc3BxcHFwcnFwcHBydWttcW1tbW9xc3Rxc3J0dnZzd3Z6dnV0aG91bHNvbXNydHZJTUdJREVEQ0FCPEJBQkdER0ZMSEVDQ0hLSEhGSkxMRk5LTFNSTEdMTEhOSkhITkhKSklITk9NTkxKTk1KWnNwcG9xcW1sT1FSbllxa2dvb3Fxb210Xm5YYXRfbm5vb3Fyb251c3R0altddGN3eHJqbnpoYWFjZmJiam10dXBzdXZzcXBwcW9ydHt/fn13bGtxbmxtbnByc3F0dHN1dXR4eHl5dHVrb3VtdG9uc3N2c0hLSElCRUVFQUA+Q0RCR0NISU1JRkNGSkxJR0ZLTUxGT0pLV1JLR0tKSk5JSEpMSUtKSUhKTU1NTUlLS0tTa2JaaV5faWNyclpfWWpvX2VlVWtfY1thYlFgbGhdalxuaWlkW3BmZHBdWlxrW21xY3BzbGRnY2RnYGBrbXBwb3R5cnVxb3BxbnmFiIeHhoWAdnNua21tb25xcnR0cnR1dXZ5eHhzdW5xdW52cXJ1dHdySEhGSURFREZBQEFFRURHQkhKTEhGREdLTElFRkpPTElPSUxbUUpGSEhLTUlISklLS0lISUdLS0xLRkhLS0xMTEtJS0xOVFtcVFBUTFBPTk9PVlFPT1FPT1FKSU5QUWRxaVRZV1tbXFVZWl1YXVxcY2ZhYWZiY2VfX2ZrbWhtdHlydHJvcHB0hoeGhoaFhYaHg3pwbW1sa3FzdHRydHZ0dXl4eHV2cXJ1b3ZydHN1dXNIREVHRkZBRUM/Q0hERkdDSUtMSEZER0tMSERHSFBLTE9LTFdMSUVFSElKSElLSExKSEZIR0pHSElFRkxJSktOTElPXFdeUFxbYF5PWFlTXFxiXk1ZWk1YYVJKWWFaU2BkXGFYW2RkVlZYXFlaWFxWWVxdYl9kYGFfZWhrZ210dHFxdHBxcoGGhoaFhoWFhYaGhoR9cmtpb3Jzc3N0d3l5eHl4d3h0cXhyeHNxcnVydE9CQ0RMTUFDREJESUVHR0ZLSktIRUVKSkpHRUhIUEpNTUpNU0lIRkFIRkpJS0xJTEpIRkVKR0RGR0VGSkhDSk1KS1RfWWBYYGFbYFVYWVReXlpfUllcUF5cWU5eXF5TW15jXlpdYGNgWV9iW2BeW1RYWFleXWNiYmFjZWlla3Jwb3Bwbm93hoaFhYaCe4CFhYaGhYaFf3VxcHJyc3Z5eXp5eXh4eHdyeXZ4cnF4dnR2YVNKSk1JREJCQ0ZHRUdHSUtKSUlERktLS0ZGSUpOSk5MSExOSEhGPkdHTElLS0pMS0lHRUlEQ0NFQUZKREBKTEpPW2NZX15hX1JUU1dfYFxdWV5RWVxNVl9XS1FZW1BaX2FhXl5jYWBiYmJjY2VaUVlWVVxZXWNgX19jZWJob21tbGxsbHWFf4SDeXV8hIWFhYaGhYWGhoN9d3JydHd5eXl5f359eXV5dnZybnp3dnhYUUtHQ0dFQkVHSEZHSElGR0pHSEZIS0lMRERLS05NTExISkpISkc/R0ZOS0tLTUtLS0lHR0NEQERBSElCP0lKSE9dYVpbZF1fVFFTWF1cXFxfWktXXExSXFlJTV5QT1xfYWNkY2NiXGRjYmRjZlhRVVRTW1haYV5eXmFhX2Rsa21qamxudn51gXp8hIWFhYWFhYaGhYaFhYaGgnpyc3V1e4WHh4eGhYSBfnhwend2eFxSTUNASUZDRktJRkZHSUdHSUZGRklMSk5FREtKTE5KTElLSkhJR0JISFFNS0tPTEtLSUhHRUQ/RUNISEFBR0ZFVF1ZXlhfWV9bXVVYWFBdXVFLSldeWF5bXVZaYFJRX19iYmFgYmJgY2JhZGRiWE9RUVJbU1tdXV1dX19fZGhnbGpubnB7e3x+e4CCg4SFhYWFhYWEhIWDhISHh4FzcneFh4eHh4eHh4eHh4WDgHx4XFNLQkFHRkRHTVJIQ1JLRkhISEVGS0pNUEVHSUpLTkxMSUxLSUlIREhLUU9NTVBMTUtLSElDREFFREhHQkFHRUNXVUVcVF1TVl9YTlRVTlpbTUpLVWBhW19YX15hXU9ZYl1gYF9iY2JdYWJXX19UUE5QUVhSXVtbXFxeYGJmZmVsZm9vd3x7gHt9f4CEhISEhIWFhYODhYKDgoWFhnpvgYaGhoeHiIeGhoaFhYSFg35JTkZERUZHRElSYlBEV19JR0dIREZNSlBQRkpJSktOTEtLTUxKSkdFSk1RUU5OT01OTE5IS0FEQUNERkRDQUVGQk1IQ0xMUE9PTEZNRkdJSkhHTExNT1BJTE9QUFNQTFBUU1VaWVdZWFhkV09TVFBQT05QVVRbWFlaXVxgYWRlY2dja2xwc3N6eX97en+EhISEhISEhIKEgH57gYOBfXuFhIaGh4eHhYWFhISEgoGAfUtJRUVHRkdES01dTEdIWU1HSEpIR05MUVFJTEpLS05OVU5PS0tMR0dLUFNTTlBPTk9OT0hLRWBFRF9MRGZjRU1bSV9cc21PTVZtWUxDUGBVbFdnSl1XVV5ETVFVTE1UVlFTVFhXVFhVVFxVUGZaaGhkWFNrU1ZWVVtcW2BgYWJiYmBmaGZubGhyenx9foGEhISDg4ODgX18enJ7gXp7f4KAg4SEhYWBhIWBg4N/fnp7TElFRkZIRUVLT1NJS0ZgVEhKT0pJT01SUUtMS0xPUlVST09KTE5HSE1RW1lPUFBOT1BPSUpQf1FJfFlZcnNYUG1IcW5wYVZQcXFzUEJrc21xc3BTb19bblhdVlxYVWtoVV1WY1pgWVtgVlVXf2p0dXVfYHdgWGFcXGZbX2FhYWFeYGJnbXBsYHB3dHiBgYKDg4J/fX6Adnh6bHZ+dHh+gHx+gIGChHyAg3p/gX9+d3dOSUVITU1CRExMRkpMRlFWTEtPSUtSWFdRTk5OTFFUTk9RUEtMT0dNUFNbWlRRUU9QUFBKSFp4XVR4ZWhZUlRRdmd0bHBibmZqUXJPTXdtanJwc3JxcnBvcIFdZnp1eHFxenF+c31rdX1iUmd8ZXNzb3NzfH1vfXlvf3JfYGBiYlpgYGdrbmtibGZnbXd+gYCDfnt4d4B0dnppcn5udHx+d3h7foCDeHyAdXx/fHxzc05LRmBdR0FFTU1IS0tISlBPTU1KTlZeWVVMUVNOWFpMU1NSTkxQSVFSVFlXV1FUUFBQUUtIZnhsY3hybVpLTVV5cHVtdWJudlBkZUlmdnFtd2+AamZ4eGlYc1Jpe21panp6fmx4en9vZ29YdnZqdXVwgGBzaHxpbHh8b19fX2NiWl5jZGZpamRnYmNkbGxwcHN0c3NzeXFyeGJsdWdyeXtzc3V5foFzdXpufH15eHJuTktTdE5DQkVQUEhKS0pMUU9PT01QWmBaWEtUV1BhXlJWUVlTTVBJU1RVWFdXT1VQT05SSktyb3V1cXVxZGliV25McXBeRmh5V3ZUTGh4fXhgeXtzbmFebW9kUmdydW5teXB3bHZ0dHFsbVx0fnprbXl8bHVtfGtwdnV4Xl9fYl5dX2VkaWdoZmVeYWJpaWlqa25va3FubWpwYWNmZG93eG9tcHN5fm5xcGp7enRyb21MTFtWSEdFR1JQSkxNS0xRUVFQUFFXXFlVTlZZVWZYUlJZXlRNTklUVFZXWVdPU05OTlFIUm1IaXdLYGR2dlZYbE9ubHtzYWpnf3ZVS1draH1sbWx4YFtwenteYHpzY3JveHFoZXxpcntdVEtsYHZ1a2l1e3ttfnhrfHBdXl5iW15iZGRnZWVlYlpjY2lra3JzcndnbWloZGdgYWxhZ3Nya2htbXJ8a21oa3t0bW1rbU9ISktISUlIUlBMTk9MS1NTU09TUldSVlRQV1pWVlRUVGFgUU9OS1RTU1FVVk5OTE1PUEpIUU5QVUxLS1NUU1JUUFZVUVFOUVFYWFFOUFVUWFhYW1tVUlNXW1dYV1pPU1VXV1hSXVlXXVZUT1lSV1dXWFlfW2dyXltbWVxdX2NaX2NjZGZkY2NiWmNjZmZmbW5tdWZmZ2NgZl9dZ2BkbGhmZ2tocHpoZ2drdWpoZ2lsUUlLS0xNS0pTUU1RUE9MVlZUUFRVWFVZVVJaXVZVVFdVWVhQT0xNVlRRTlVTTk9NTFFPSklRUktRTUtLT1JUUlFRU1NJSExOT1FSUVFRVFZSWFdcV1NTUVJVVVZTWlFPU1JXVlRZVlRZVVRSVVRUVFdYV11aXmFdXFpaXFxgY1xdYmNkZ2VlZGFZYGFjYWJoaGluY2FkXl9jXVpkXGJtYV5mZmdtc2RpaGtrZWRkZmhQSktMT09MTVRQTlNRUU1YWFVUVVdXV1pWVFxgVldWWVVYVFFQS09XU1BOVVBOUU5LU1BMTlVUTlFOTU5RU1BUUVNUVU5LTU9RVFRSUlFWV1VZWltZUlVSVFdXV1lbVE9UVVhVVVpVV1lVUlJYVlVXW1laX11VWV5cXl1cXWBhXltiYmNoZmVkYlhfYGJdYGhlZmRhXl9dXV5aWl9aX2dgXl1dY2hrYWdmaGZkYGJjYVBLTUxQUUxPVE9PU1FPUVtaWFdYWlpYWFZdamRWWFlaV1ZUVE9LT1ZUUE9UUFBQTk1RUU9RWFRSUU9NT1NWTldSVFVVT05NUVNVVVRUUlRYVlpdXFpWVlFSV1hWW1tXUVRWVlZWWVRYV1RTUlhWVVpdWV1fXlZeXV5gXFxgX19fWmJiZGhoZWRhWWJgYl5eZmRjYGJdXFxcXFlaW1hbYVteXV1fYl9fYmRkYmRfX2BcUE1OTlJRTVJST1NUUVBVXFpaV1tbXFlaW2RxbWhkX1tZVlZYUk1NVlNNTlJPUVJPTFBTUVVaVVRQUExQV1ZSV1NTU1hNT1BSVFhVVVVTVVlYW15dW1tWUk9VVlZbW1dRVFdWV1hWVFhaVFNSWldWXF5aX19gVWFcYWFdYGJfXGBdY2FjZ2lkZWBZY2BhX19lZV9gY1taXFtcWVpZWVdcWVxbYF5gW15eYWBfYlxZYFpRTk9OVlFQVFFPVVRTUFdcXFxYXlxfV1xeanF3eYBjXFtWVlhSTk9XU05RUVBSVFJLUVRUWVpXVU9STlNYVlRTVFJSWk9RU1NWW1ZWV1RWWlhdXlxcXlZTTlRVVlxcVlJUVlZYWVNUWVxUUlJdWFpdXlxgYWBXYltjYl5hY19cYmFiX2RnamRmXltkYGFgYWNlX2JfWVpeW1xbWVhZV1daWlphXF1bXVxcWl1gV1tbWlBPT09ZUFVVUlJXUlRQW11eXVtgXGBVXF1panJ9c2xnXFVZV1FPUltTUlFUUlRVVEtRV1ZbWVpTT1NSVlZVU09WUlNaUlRVVFhdV1hYU1hcWF5dWVpdVVVOVldXXltYUVRVWVlZVVdZW1RTVl5ZXV1gXWJjX1lgW2ViX2RkXl5jY2FdZWdqZGZeXmRhYGFiY2RfYl5YWl9bXFtYWFhYV1taXGBdW1tcW1haW15WXlldUE9PUlpQWlRVVlZTVFReXmBeXmJcYVVdXmJreXRsfWxaVVpVUVFTXFRVVFZUVllXTFJaVl1bXFJPVVNYV1ZTUFhSU1dTVlVVW11YW1lVWl5YX15ZXFlSV1JZWFlfWlpTVFZaWVpWWFlcVlVaXlxeYGFfZGRdXl1dZWFiZmReXmRjYFxnZWhlZGJfZGFgYWBiYl9gXldYXlpcXFpZWVdWXVpdXlpZW1xbV1lcXVZYV11TT1BXWVFdVVZZV1dVWF9gYWFgY11gVV1eYmVldYF6aFhZWlRWU1ZcWFdXVlZXXVhQVVxZXl1dVFJYUldWVFJUWFJTVlRYWFhdXlhdW1VeX1hfX1hdVlFZVFlaWmFZXFVWWFtaWlhZWVpYVl1eX15jYmFlZVxiXGBmYmRmZF9fZGJiW2ZjaGVjZmFmX19hYWFhYF9eVlVdWVtcW1lbWVldW1tbWFhZW1laWl1fXVRZXVVOU1pWU1xUVldZV1ZcYGFiY2FkX19WW2BkYV96dW9oWVxaVVdVV1taWVxZWFlgV1BVXltgYVxUVVhQVVdVU1ZWUlNVVlpaXF9eWl9cVl9fWl1eWV5WU1lXWVpdYlpeVldbXFtcW1tZWllZXl9gYGRiY2VlYmRaYmZjZ2ZlXmFiYGNeY2NpZGRnX2deYmJjYWFgXl9YVFpaWltbWFtYWFxbWltXV1lYV1xbXGBdVl1dU1BWWlZWWlVYVVhXWF1fYmFkYWRhXllZYWRiYGxmaF5cXVtWV1hZXFxcX1tZW2JWVFdeXWFjXFJWWFFXVldWVlZTVlRYXFxeYGBdYV1XYV5bXlxbXlhWWFhbW19gXF9YWV1cXV5eXFpcWFtfYV5gZGNkZmZmYlljZWVoZ2ReY2BfZWNdZmlkZWlfZl5jYmNhYWBfX1tYWVtZWlpYWVhXW1taW1dYWlRZXVxaYFxVXmJOUldZVldaWVtcWVdZXmBiYWRhZGFdXllhY2JfYWBhX1xcXVhXW1tdXV9fXFpdY1haWF1gY2RfUlhZUFdWWFlZV1ZXVlxdXmBhYF9iXllhXV1eWV1dWVhWV1tcYF9dX1paXl1eXmFcW1taW19hXmJkY2VmZWZiWmRmZ2lnY19jXmFmZVppaWJmaWNlXmJiY2FgYF9dXVpXW1lZWFhaWFdaW1pZV1hWVVtdXV1gYGJieExXV1xZV11cXF1aV1xdX2BiZGJiYV1gWGJjYmBjYWJeXFxcWFdbXV9dYF9dW2BkXFxYWmNlY2BSXFlPWFdZW1pZWFpZYF1gYmJgYWNfXGJdX11bXl5ZWVVYXV5fYF9fXFpeXmBiY1xcWFtdYGJhY2VkZ2VlZmRcZWZoaWZjYmJcY2dgXGlpYmhpZmVgYmFjYV9gX11dW1lcWVhXWFlYV1xbWldXWFBYWl1hY2Zmcmt/SllXXVpaX11cXlxZXVteX2FjYmFhXWJbYmRiYGNjYl1cW1pXWGlxYFxgX11cYWNfXllZY2VkYVNfWlFYV1xdXFtaW1tjYGNiY2BiZGFgY15gXF5eX1pYVltfXl1hYV9dW2BhYmViX11UXF9gY2RkZmRnZmVmZV5lZmhoZ2RkYFtmZ15haGhjaGhmY2BiYGNiX19fXV1cWltZWFhYVlpWXFpaVlZVTVhXXGdpa2h1eIF2dnZ2dnZ2dnZ2dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6e3p6ent7e3t7e3t7e3t7e3t7e3x7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHt7e3t8fHx8fHx8fHx8e3t7fHx8fHx7e3t7e3t7fYmIhoqHhYOBg4OCg4OCgoKCgoKCgoKCgoGAgYCBgICAgYCBgYGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t6e3t7e3t7fHx8fHx8fHx8fHx7e3t7e3t7e3t7e3x7e3t7e3t7fHx8fHt7e3t7e3t8iYmHiYaFgoGCgoGCgoKCgYKCgoKCgoKBgYGAgICAgICAgIGBgYB9fHx8e3x8fHx8fHx8fHx8dnV1dXV1dXV2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eHh5eXl5eXl5eXl5eXt7e3t7e3t7e3t7e3t7e3x8fHx8fHt7e3t7e3t8fHx8fHx8fHx8fHx7e3t7e3t7fHx8e3t7e3t7e3t7fHx8fHx7fHt7e3uHiYiJhYSDgYKCgoODgoKCgoKCgoKCgYGBgICAgICAgICAgYKBgH58fHx8fHx8fHx8fHx8fHx2dXR1dXV1dHV2d3d3d3d3d3d3d3d3d3h4eHh4eHh4eHh4eHh4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t7e3t8fX19fXx8fHt7e3t7fHx8fHx8fHx8fHx8fHx8fHx8e3x8fHx8e3t7e3t7e3x8fHx8fHt7e3t7e4aJiYiFhYOBgoKCg4OCgYKCgoKCgoKBgYGAgICAgICAgIGBgYCAfnx8fHx8fHx8fHx9fX18fHjF1NLS0tLUk3t9fX19fYSMi4uLi454KSkqKiopKz0/Pj4+Pj5tgH5+f397pdfT09PT1r2GiYmJiYmJjY2NjY2NkEYoKysrKiVjkoyMjY2OiX5/f39/f359fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx8fHx8fHt7e3t7hIuHh4aHgoGDg4GCgoKCgoKCgoKCgoGBgYCAgICAgICAgYCBgIB+fHx8fHx8fHx9fXx8fH19eNXn5OTk5OeZe39/f39+hpCPj4+Pk3kZGhoaGhocMTMzMzMzMmqCf4CAgHut6eTk5OToyomMjIyMjIyPkJCQkJCUOxYbGxsbFF2Wj4+QkJCLf39/f39/f319fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e3uCjYeIh4eDgoSCgYKCgoKCgoOCgoKCgYGBgICAgICAgICAgICAgH58fHx8fHx8fXx8fH19fX12fn9/f39/f3l3d3d3d3d4eXl5eXl7eG5vb29wcHBycnJycnJyd3p5eXp6en6Dg4ODg4SBfHx8fHx8fX19fX19fX12c3Nzc3NzeX19fX19fX18fX19fX19fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e4CMhomHh4SDhIKCgoKCgYKCg4KCgoGBgYGBgYCAf4CAgICAgICAfnx8fHx8fHx8fX19fX19fXZ0dHR0dHd0dnd6e3h7eHd2eHt5e3p5fXl4eHl4eHh5eXl5enp5eXl5enp6eXh4eXl5eXl7e3t7e3t7e3t7e3p6enx9fX19fX18e3t7e3t8fHx8fHx9fX19fX19fX18fH19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8f4uHi4qIhIODgoKCg4KBgoKDgoKCgYGBgYGAgIGAf4CAgH+AgYF+fX18fHx8fHx9fX19fX19d3d3dnZ3fXh3d316eH14d3d5fH1+ent9e3d3d3d3eHh4eHh5eXl5eXp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fHx8fHx8fHx7e3x8fHx8fHx8fHx+iomMjImFg4SEgoKDgoGCgoKCgoKBgYGBgYCAgICAgICAf4CAgH19fXx8fH19fX19fX19fX13d3d3d3p9eHt4fHx3e3h3d3d5fXx8fX58d3h4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fX19fXx9fX19fX19fX19fX19fHx8fHx8fHt7fHx8fHx8fHx8fH2Kio2NioWDg4OCgoKCgYGCgoKBgoGBgYKBgIGBgICAgIB/gIGAfXx9fX18fX19fX19fX19fXd3d3d3fX55d3d4e3p8eXd3d3x5eXt9fnx4eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt8fHx8fHx8fHx8fHx8fH19fX18fH18fH18fHx8fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8foqJjo2JhISEg4KDgoKBgYKBgoKCgYGBgoGAgYKAgICAgH+BgIB8fH19fX18fX19fX19fn5+d3d3d3d5fHl7eHx9eXt5enp6f3t8fHx+e3h4eHh4eHh4eXl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt7fHx7fHx8fHx8fHx8fXx8fX19fX19fXx8fHx8fHx8fXx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx/iIeNioeFhoaDg4ODgoGBgoGCgoGBgYGCgYCAgoF/gICAf4CAgHx8fX19fX19fX19fX5+fn53d3d3d3Z4eHl3eXp4enh5eXl8e3t6eXx4eHh5eXh4eHh5eXl5enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX18fH18fH19fX19fH19fX19fHx8fHx8fHx8fHx8fX+HiIyIhoeHhIKDhISCgYKBgYKCgoGBgYKBgIGBgYGAgIB/gIGAfHx9fX19fX19fX1+fn5+fnd3d3d3d3d3d3d3eHh4eHh4eHh4eHl5eHl5eXl5eXl5eXl6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fHx8fX19fHx8gIeIi4eHiYaDg4SDg4KBgYGCgoGBgYKCgYGBgIGBgYCAgICBgX97fH19fX19fX19fn5+fn5+d3d3d3d3d3d4eHd4dnl5eHh4eHh5eXl5eXl5eXl5eXl5enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fH19fXx9fXyBhoqKiYmIhIOFhISCgoGBgYGCgYGCgoGBgYCAgYGAgIGAgIGBf3x8fX19fX1+fn5+fn5+f394eHd4eHh4eHZxZGpeam15eXl4eHl5eXl5eXl5enp6enp6enp6enp7e3t8e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIGFiYqJioeEhYWEg4KCgYGBgoKBgYKBgYGBgYCBgYCAgYCBgIF+fH1+fn5+fn5+fn5+fn9/f3h4eHh4eHh5bWRiZV9fXm95eXl5eXl5eXl5eXp6enp6enp6enp6e3t7e3t7fHx8fHx8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goWKiomJhISGhYSDg4KBgYKCgoGBgoGBgYKBgIGBgICAgICBgH58fX5+fn5+fn5+fn9/f39/eHh4eHh4eW5kZWdlZGJeZnh5eXl5enp6enp6enp6enp6enp6e3t7e3t7e3x8fHx8fHt8fHt7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChouJiIqEhYaEg4OEgoGBgYGCgYKCgYGBgYCAgYGBgIB/gIGBf3x8fn5+fn5+fn9/f39/f394eHh4eHl3Z2VkZWZkZWFfaXl6enp6enp6enp6enp6ent7e3t7e3t7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHt8fHx8fHx8fHx9fX19fX19fX19fX19fXx9fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4eJh4SEhoSDg4WBgYGBgYKCgYGBgYKBgICAgYGAgYCAgYF+fHx/f35/f39/f39/f39/gHl5eXl5eWtlYWJlZWFlZV5ieHdze3p6enp6enp6enp6e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fH18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19g4aLhoiFhYaEgoOEhIKBgYGBgoKBgYKBgYGAgYGBgYGAgIGBgn98fH9/f39/f39/f3+AgICAeXl5eXl0Y2NlZGNmY2doZGZsZF5ze3p6enp6enp6enp6ent7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn6DhouGhoaGhYODg4SDgYGBgYGCgoGBgYKBgYCAgYGBgYCAgYGBfnx8f39/f39/gICAgICAgIB5eXl6d2RhY2diYmRdW2VfYV1eYGFoeHp6enp6enp6enp6e3t7e3t7fHx8e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+foSFi4eGhoaGhIODg4KBgYGBgoKCgYKBgoGAgIGBgYGAgYGBgYF+fX1/gH+AgICAgICAgICAgHl5eW9vYmJiZF5jZ19dYWFgXF9kYlttfHp6enp6enp6enp7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7fHx7e3x7fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5/hIiLhoSHhoaEhIODgoGBgYGCgYGBgYKCgYCAgYGBgYGBgYGBgX5+fYCAgICAgICAgICAgICBeXpwXWJlZGJkXmZnZ2BZYmJhY2VfXF1ze3t6enp7e3t7e3t8fHx8fHx8fHt7e3t7e3t7e3t7e3t7fHx8fHx8e3x8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fn19fn5+fn5+fn5+fn5+foCFjIqEhYaGhYODg4SCgYGBgYKBgYGBgoKCgYCBgYGCgICAgIGBf35+gICAgICAgICAgIGBgYF5emxiZGdjYmdmYWBgZGFiZWRjZGNeXGJ1fHt7e3t7e3t7e3x8fHx7e3x8fHx7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/gYeMiYWGhoeFg4SDgoGBgYGBgYKBgoKCg4KBgIGBgYKBgYGCgoF/f36AgICAgICAgIGBgYGBgXp7dGdnZmZkZGZmYF5fYWNlaGRlXmJkYHR8e3t7e3t7fHx8fHx8fHx8fHt7fHt8fHt7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f3+CiYqIhoaIhoWDhIOCgYGBgYGBgoGBgoKCgoGAgYGBgoKBgYKCgX9/f4GBgYGAgYGBgYGBgYGBenptaGNjZ2ZnZWdmZmdiZWRlYmdbYmVgdnx8e3t8fHx8fHx8fHx8e3t8fHx8e3x8fHt7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f39/f4SJioiGiYeFhYSEg4KBgYGBgYGCgYKCgYGBgYGBgYKBgoGBgICBgH9/gYGBgYGBgYGBgYGBgYF7emlpZGNqZmFgZmVjY2NnaWRjYmBiZGJ0fXx8fHx8fHt8fHx8fHx8e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f39+fn9/f39/f39/f3+AhIqMiIeJhoSFhYOCgYGBgYGBgYKBgoGBgYGBgYGBgoKBgYGBgYGAgH+BgYGBgYGBgYGBgYGBgXZzZWRnY2RmZWJlZmdkZmhmZWNgYGNkYHF9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fXx8fX18fHx9fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/fn5+f35+f39/f39/f3+AgICFioyJiIqJhoaDgoKCgYGBgYGBgoGBgoGBgYGBgIGBgYGBgYGCgX+Af35/foCCgoKCgoKCgoKCc3NnZWRkZWlqaGZnZ2NhZmZlZmdmZWVjdX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fH19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gICAgICAgIWLioqJioeHhoSCgoGBgYGBgYKCgYKBgYGBgIGBgoKBgYGBgYGAf4B+dHRzdX1/goCAfn5/gYB0cmdkZWNmaWppZWNlY2BmZGRnZ2JiZWFwfXx8fHx8fHx8fHx8fHx8fHx9fX18fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f39/f39/f4CAgICAgIB/houLiouLh4eHhIOCgYGBgYGBgYKBgoKBgYGBgYKCgYCBgYGBgoCAgH5zc3NzdHV4dXV0dHV2dXVwZmNmZWhoaWdoZ2VmZWJfZGVmY2BiZ3d8fHx8fX19fX18fHx8fH19fX19fX19fXx9fXx8fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gIB/f3+AgICAgICAgICHjIyIi4qHh4eEhIKBgYGBgYGBgoGCgoGBgICBgoGBgYKBgoKCgYCAfnNzc3Nzc3NzdHR0dHNzdW9jY2FnZWhoZ2pmZGVnZmhmY2JlYl5ieX18e3t8fX19fX18fHx9fX19fX19e3x9fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn9/fn5+fn5+fn5/f39/f4CAgH9/gICBgICAgICAgYCAf4CAgYGAgIeLi4iNiYiJhoSFgYGBgYGBgYKCgYKCgYGBgIGCgoGBgYKBgoKBgIB+dHNzc3Nzc3Nzc3Nzc3N1cmdlZWRlamhoZ2ZpaGdjZWViZGNoZGd7eHVzc3R2dnl4dnR0dHZ3d3d2dHR0dXV4d3h4d3d6e3x9fXx9fn5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f35/f39/gH9+fHt7fX58eXl2dnZ5fHx6end2d3l7fXt4hIyMioyHh4iEhYSBgYGBgYGBgoGBgoGBgYGAgYKCgYGBgoGBgoGAgH51c3Nzc3Nzc3Nzc3Nzc3VzaGVnaGVrbGhqZ2lqZ2dnZmRkYmVkbnV0dHNzdHNzc3Nzc3Nzc3Nzc3NzdHNzc3Nzc3Nzc3N0dHV1c3V3eHl7fn59fn98f39/f39/f39/f314fH5+fXx4dXZ3eXd4dnRzc3N0dXRzc3Nzc3NzdHNzc3R0c3R0dHODjI2KiYeIhoOGg4GBgYGBgYGBgYGCgYGAgYGDgoKBgYCBgYGBgICAf3VzdHRzc3Nzc3Nyc3NzdnZpY2hqaGpsZWZpbGhgZmVkY2BkZGZ0dXV1dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHRzdHRzc3Nzc3R2dnV1d3V4fH9+fX9+fHp4dXN0dXV1dHNzc3Nzc3N0dHR0dHR0dHR1dXR0dHV1dHR1dXR1dXV1dIaMjYuIhoeEhIWCgYGBgYGBgYGCgoGAgYCBgYKCgoGBgIGBgYGAgIB/dnNzc3Nzc3Nzc3Nzc3N2dnNnZ2pmaGdmaGhmZGlnY2NnZWVmcHZ1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dHR1dHR0dHR0dHRzdHR0dnV1d3Z0c3R0dHR0dHR0dXV1dXV0dXV1dXV1dXV0dHNzc3N0dHNzdHR0dHR1dXR1iY6MjIqHh4SEhYKBgYGBgYGBgYKCgoGBgICAgoKCgoGBgYGBgYCAgH93c3Nzc3NycnJyc3NzcnZ2dW5kXWNnZWlraGVoZ2dqamlnZXB2dXV1dXV0dHRzdHR0dHR0dHV1dXV1dXV0dHV1dHR1dXV1dXV1dXV1dXR0dHV1dXV1dXV0dHV0dHV1dXV1dXV1dXV1dXV1dXV1dXV0dHNzc3Nzc3N0dHNzc3Nzc3R0dHR0dHWKjoyMiYaGhIeFgoGBgYGBgYGBgoKBgYGAgYGCgYKBgYGBgYKBgYCAf3hzc3Nzc3JycnJyc3NzdnZ3d2liaGhnamtpaGZkZGVmaWhwdXR0dHRzc3JxcnJ0dXV0dHR0dHR0c3NycXFxcXNzdHR0dHR0dHR0dHV0cnJyc3R0dHR0dXV1dXV1dXR0dXR0dHR0dHR0dHR0dHR0c3Nzc3Nzc3Nzc3Nzc3N0dHN0dHR0dHR0dYuOjImGhYWFh4SCgYGBgYGBgYGBgoKCgYGAgIKCgoGBgYGBgYGBgIB/eXNzc3NycXJycnJzc3N3d3d3bGpoZGhpa3Z6a2VmZWhnbXJzdHN0c3JwcHBxcnN0dXR0c3NycnNycXBvb29vcHFzc3NycnJyc3R0dHNxcHFyc3R0dHR0dHRzc3Rzc3NzdHR0dHRzdHR0dHR0dHRzdHR0c3NycnFxcnJzc3Nyc3NzdHR0dHN2jZCMh4eFhYSEgoGCgoGBgYGBgYGCgoKBgYGAgYGCgoGBgoKBgYGAf395c3NycnFxcnJycnNzc3d3d3dzc2pnaWloeX99cW51bG5wcXJycnFxcG9wcXFxc3Rzc3NycXFwcG9ubm1ubW5ubnBxcnJycnJycnJzcXBvb3BxcnJzc3JxcnJycnJycnJycnJzc3Jzc3Nzc3Nzc3Nzc3Jxb29ubm9vcXJzc3Jyc3NycnNzcnaPj4uHhoWFhYOCgoKBgYGBgYGBgYGBgoGBgYGCgoKBgoGCgYGCgX9/f3hxcHBwcXFycnJyc3Nzd3d2dnd2cnF0c252f352c3hwcHBycnJycXFwcHFxcXFyc3Nzc3FwcXBvb25ubm5ub25vcHBxcXFxcXBwcXJwb25vcHFxcXFxcHBxcXFxcXJycnJycnJycnFxcnFxcnJycnFwb29ubm1ubW5vcXJycnJycnJyc3JxeI+OjYaDg4aEgoOCgoGCgYGBgYKBgYGCgYGBgYKCgoKCgoKBgYKBf4B/d29wb3BxcnJyc3Nzc3J2dnZ2dnZ3dnZ1c3l/fnd3d29wcXFxcXFxcHBwcXJxcnJzc3JycXBwb29wb29vb29vb29wb3Bvb29vcHBxb29vcHBwcHBvcG9wcHFycXFxcnJycnFxcXFxcXFxcHBwcHBxb29ubm5tbW5tbm9wcXFxcXFxcXFxcXB7j42NhoODhYOCgoKCgYKBgYGBgoGCgYGCgoGCg4KBg4KBgYGAgYF/f392bm9wcHBxcXFxcXBwcHZ2dnZ2dXR0c3NxfYB9fX9zb3BxcXFwcHBwcXFwcHBxcnJxcXFwb3Bvb3Bwb29wcG9vb29vb29vb3BxcXBub3Bwb29wb29wcnJycnFxcXBxcnFwcXFxcHBwcHBwcHBwb29ubm1ubm5ubm9ub3BwcHFxcXFxcXFxcIKRjoqEhIOFhIOCgoGBgoKBgYKBgYGBgYGCgoKCgoKCgYGBgYCBgX9/gHVvb29wcXFxcXBwcHBwdnZ2dXRzcnJycnGAgoCBeXBwcHBvcHBwcHFxcXFwcXFxcXFxcG9vcHBwcHBwb3BxcHBvb29wb29vcXFwcG9wcG9vb25vcHFxcHBwb3Bvb3BwcHBwcHBwcHBvb29vb29vbm5tbW1ubm5ub25vb3BvcHBwcHBwcHBwiZCMiISDhIaDg4KCgYGCgoKCgYGBgYCAgYGBgoKBgYKBgYGBgIGBgH+AdG5vb3BxcXFwcG9vcG92dnVzcnFxcXFxcICDg39ycHBwcHBwcHBwcHFxcHBxcXFxcXBwcHBwcHBwcHFwcHBwcHBwcHBvcHBxcXBwcHFxb29vbm9wcHBvb29vcHBvb3BwcHBwcHBwcHBvb29vbm5ubm5ubW5ubm1ubm9wcG9vb29vb3BzcXWPj4uJg4KFh4ODgoKBgoGCgoKBgYKBgYGBgYGBgYGBgYCAgYGAgYGAf4B0b29vbm9vb29vb29vb3Z1dHNxcXFxcXJygIKCgXRxcXFxcXFxcXFxcXFxcXFxcXBxcXFxcHFwcXBxcXFwcHBwcHFxcXBxcHBwcXBwcHBwcHBwcHBwcHBwcHFxcXBxcHBwcHFwcHFxcHFxcXFxcXJxcnFwcnRycnR0dHR1dnRzdHR0dXd3gpCPi4iDgoaHhISCg4GBgYKCgoGBgoGBgYKBgYGBgYGAgICBgYCBgYB/gHVvb29vb29vb25vb29vdXRzcnJycnJyc3KDg4OCdnFycnFxcXJxcnJxcXJycnFxcXFxcnFxcXJycXFycXFxcXFxcXFxcXFwcXFxcXFxcnNzcnJyc3V1dHR0dHR0dHV2d3d3d3d3eHh4eHd3eHh4d3Z3dnV2dnZ2d3h6e3x7e3t6enp6enyGkI2LiIODiIeHhYODgoGCgYKBgYGBgYKCgoGBgYGAgYCAgYGAgIGBgH+Ad3FxcXFxcG5ucG9wcG92dHV1c3Nzc3NzdYiDgoN5cnNzcnJyc3Jyc3NycnJycnN1c3N0dnN0c3Nzc3Nyc3N0dHV1dXV1dHV3eHd3d3d4eHh3eHh4eXl5eXl4eHl5eXp6e3t7e3t6enp5eXh3d3d1dnV2dnd5enp7fn5+fX1+fn5/f35+gIyQi4qHg4WIi4iEg4SDgYGCgYGBgoGBgoKCgoKAgYGBgYCBgYGAgIGAf4B8enp5eXx5eHh2dXZ2dHl2d3h3d3Z3d3Z6f3x+fnx2dnd3dnV4enh4eHh3d3d2eH2DeoaIeXl8e3l5eXh4eXl6enl5eXh4enp5eXh4eHh3dnd3eHh3eHh5eXp7e3p8fH1+fX9/f359e3t7e3p5enl5e3t/foB/fn5/fn19fX5+f35+fn6AjpCNioeEhoqLiIaGhIOBgoKBgYGCgYGCgoKCgoCBgoKBgYGCgYCBgIF/f4B/fn19fX9/f318e3t7eXh4eHh5eXl4eHh5eXl4enp6enp6e3t7fH1+fHt7ent8e5J/jJJ5e3t7enl4eXh4ent6enp5eXp8fHt6enx8fHp6ent9fHx+fn+AgoGAgYKAgH9/gYGBgIB/f35+fn5/fX1+f4CAf35+f39+fn9/f39/gH+Af4OQjoyHhoWIi4yIh4aFg4GCgYGBgYKBgoKCgoKBgYKDgoGBgYGBgIGBgIB/goOCgoGBgX99f39/f4F6enh4d3h4eHh5eHh5enp5e358enx9fXt8fX19fHx7fn18moWQmn9+fX9/f3x8fYCDgYCAf318fXx9fXt9fXx8fH19fX1+gYGChISDgoB/gYGBgH9/f4B/f39/f39+fn9/f39/f35+f3+Af39/gICAf4CAgICAhJCPi4eGhoiLi4mKhYaDgoKCgYGBgoGCgYKBgYGBgoOCgYCAgYGAgIGBgH+ChIKCgICAgH9+fn+AgH9/fn18fX19fYB/fX+Af35/gH9/fn9/gICBgIB/foCCgYGih5OfhYB/f4CBf35+f39+f39/fn5+f39/gYB/f4CBgYCAgYOEgoGCgoGCgH+AgYCBgYGAgH+BgICAf39/gICAgYGBgIGBgYCAgICBgoGBgYCAgYGFjo6MiIaHiYyLi4qGhoOCgoKBgYGCgoOCgoKBgIGBgYKCgICBgYCAgYGAf4KFg4KBgYCAf39+fn+AfX5+fn19fX5/fn9/f35+fn+AgYCAgICAfn9/fn6AgICAg6aJlqKHfn9+fn59fn9/fn9/f35/gIGBgoKDg4KCg4KBgYKDg4OCgYGBgYKBgoKCgYKBgoGBgYGBgoKCgYGCgYKCgoGBgoKBgYKCgoKCgYGBgoKCgoaPkY+KiImKjY6MiYaFgoKCgoKBgYKCg4KCgoGBgYGBgYF/gIGBgYCBgIF/gYWEg4KCgoGCgYCAgIB8fHx7fH18fH9+fn9+fn5+f35+f39/f39/f35+f4B/f3+EqIyUo4l+gIB+fn5/gIB/gIF/f39/f3+BgYGCgoCAgYKDg4SDg4ODgoKCgoKCgoKCgoKCgoGCgoKDg4OCg4ODgoKCgYKCgoODg4ODgoKCgoODg4KCh5KSkIqKi4uPj42Kh4SCgoKCgYGBgoKDgoKBgYGBgIGBgICAgYGBgIGBgYCAg4SDg4OEg4ODgoKCgXx9fHx9gn1+f4GCiIGCgoSCgYGDg4GBgYKDgYGBgoKBf4WpkZCiiX6BgX9/f3+AgYCAgICAgH9/f3+AgICAgH9/gYODhYSEg4SDgoKCg4OCgoOCgoODg4ODg4SDg4KEhYWDg4SEgoKDhIOCg4ODg4OCgoODgoCKlJOPioqMjpCPjYuGg4KCgoKBgYGBgoOCgYGBgIGBgoGBgICBgYGAgYCAgH+BgoODg4SEhIOCgoKCfXx8fn6AgYOAg4OChIaFhoaFhIWFg4ODg4SBgYKFhYODlqujoaCHgYKCgoOCg4KDg4KDg4ODgoGAgIKCgYOCgYKCg4OEhYWEg4OChISEhIOEhISDg4OEg4ODg4OEg4SDhIWEhISDg4ODgoKCgoKCgoKBgYKCgo+UlI+Njo6RkY6KiISCgoKCgYGBgYGCg4GBgIGBgYGBgYCBgIGBgYCBgICAgIKChIKChIOCg4ODgoJ9fX2AgH+AgoGDg4ODhIaEhIOEhYWDg4GBg4OBgIOEgY2sqauwpZKHh4aJiIeIh4eGhoeHhoaEgoGCg4SDg4ODg4ODhISFhYWDhYSFhISEg4KBg4OCg4SEg4KCg4SCg4ODg4OCgoKCgoKCg4OEhIOFhYWFhoaIk5OTkI+Pj5KRjIqHgoKCgoKBgYGBgYKDgoKBgIGBgYGBgICAgYGBgICAgICAhISEgoKCgoGBgoKBgX+AgYOCgICAf4CCgoGDg4KCgYODg4SDg4KDhYSEgYKCm6idpaqgoIuGiZOLiIiHh4eIiIiFhIOBgIGBgoKCg4GCg4SEhYSDg4OEg4OEhIOBgYGCg4OEhISDg4ODg4OEhIODgoSDg4ODhIWFhoeHh4eIiIiJiY6TkpKOj46Rko+LiYeCgoKCgoKBgYGBgoKCgoGBgIGBgYGAgICAgYGAgIGAgICDg4KCgYKCgYGAf4CBhYWFhoOCgYB+fn+BgoSCgYKDhIOCg4ODg4KChIuKhIWknZSgopehlYORmIaFhYKEhIWFg4KBgH9/gIB/gIGEg4OEhYWEgoKCgoOCg4OFhIKDhISEhYaGhoaGhoWFhoeHhYaIh4aHiIeGhoaIiYeGhYaGhoeIkZKSkI6QjpCRjImHhYGBgoKCgoGBgYGBgoOBgYGBgYGBgICAgICBgYCAgICAgISEg4KBgoGAgYGAgYKIh4aHhYSCgH99fX6AgH+AgYGBgYGBgoGAgYKCh5eSg5mXjpyfl56ZkZ2SgIGAf4GAgICAgH9+gIGBgYKCg4OEg4OEg4OCgoGBgoODg4SEg4SEhIOFhYaFh4eIh4eHh4eHh4eGhoaGh4WFhYaGhISEhIWEhYaSk5GOjo+OkI6JiIeEgoKCgoKCgoGBgIGCgoKCgoKCgYGBgYGAgYGBgICAgYGAgoSDg4KDgoGCgYKDg4iHh4iHhYSCgX5+gICAfn5/f4CBgYGCgoCBhI2Dk6mYlJaQoKaXmJ6hnIt/gH9/gICAgICAgICDg4KDg4ODgoOBgYKCgoOCgYKCgoOCgoSDhISDg4SEhYWFhYaGhoaFhISEhYWEhIWFhYSEhISDhISEhISEipSTkpCQj46NiIaFhIOBgYKCgoKCgYGAgYKCgoKBgoKBgYCBgYCBgYGAgICAgYGAg4OCgoOCgoKBgoOCiImJiYiHhYSDgYKEhIOBgoKCg4SCgoSEgoOKl4iHnqupn5qhq5aZn52Zh4KBgYGBgoOCgoGDg4SDg4SEg4OCg4KDg4ODg4KCgoKCgoGDhISEhYSFhYWFhIWEhIWFhYWDg4OEhISEhYWFhISEhISEg4ODg4OOlZKQkZGOjYyHhYODg4GBgoKCgoKBgYCBgoOCgYCCgYGBgICAgIGBgYCAgICBgICDhYSEhIODg4SDhIOGh4mIhoWDhIODg4WDgYCDgoWGhISDg4OChI6Zi4SPoKKgnJ+jmZydnJOEg4OCgoGBhIWEg4ODgoKDhISDg4ODg4SFhISDg4KCgoKCgoSEhYSFhYWFhYODhYWFhYaFhoWEhIWEhYWGhYWFhIWEhISDhIODhJGUk5KSj4yMioWEhIODgYGCg4KCgoKBgYGCg4KBgYKBgYGBgICBgIGBgH+AgIGAgYaGhoaGhoaHh4aGhYSDhYaCgIGBgYGHgoB+f4GBj4yDgX9+fXx9jJyPgYeRkpOWnJmbnJqTg4KDg4GCgYKDhYODg4KDg4OEgoKEhIOEhIWEg4OCgoKCgYKCg4ODg4SFhYWFhIOEhYWGhYWEhISEhIOEhIWFhYWFhIODhIOEg4KGlJSSlJKPjYyIhISEg4KBgoODgoKDg4GBgoKBgoKCgYGCgYGBgYCAgYGAgICAgICAhYWFhYaGh4aGhoWGg4ODg4GAgoKCgYKAf35/f4GWl4mAfX19fXyCl4uBg4ONkJOXl5yfmYmBgYKBgYKDgoODgoOCgoKCg4OBg4SDg4ODg4OEhIKCgoKDgoKDg4ODhIWEhISEg4OEhIODg4OEhIODg4ODg4SDg4ODg4KDg4KDgouUk5KTko2NioeDg4OEgYGCg4ODg4ODgoGBgoGCgoKCgoKBgYGBgICBgYCAf4CAgICDhISFhYSFhYWEhIWCg4KDgoKDg4OBgICAgICAgJWfi35/gH2Hi36EhIOEgomOko6JjpyUg4OCgoKDg4ODgoODhIKCgoODgoKDg4KCg4KDg4WEg4ODg4SDg4SEhISEhYWEhIWEg4SEg4OEhISEhISEg4SEhYSDg4SEhIODgoKDkJSSkpKPi4yIhoOFg4OBgYKDg4ODg4OCgYGCgoKCgoKDgoCBgoGAgICAgIB/gICAgISDhYWEhYWFhYSFhYOEhIWDg4SEhIKCgoOCgoSBkaGKgIuFfYaJgX+GhYWFhoeDfn59g4eEhIODg4OEg4ODhISEg4OEhISEg4SEhIOEg4OFhoWFhYSFhYWFhYSFhoWGhoWFhYWFhYWFhYWGhoWGhoaFhoaGh4aFhYWFg4SEhIeTk5OSkoyKiIWFhYWCgoGBgoODg4OCg4KBgYKDg4ODgoKBgIGAgICAgICAgH+AgICAhYWFhYWGh4eGhYWFhISFhYSEhISEg4ODg4OEhYOKkYOEi4WDgoF/foKHhoSBf3+AgICAgISEg4OEhISEhISEhISEhISFhYWEhYSGhYWGhYaGhoWGhYWHhYWGhYaGhoaFhIWFhYWFhIWGhoaHhoaGhoaHh4iIiIaFhYaEhYWGjZSTkpGQi4qHhoeGhIGCgYKDg4ODg4KDgoGBgoODg4KAgYGBgICAgICAgICAf4CAgICHh4eGhoeHiIeHhoaEg4ODhIODg4OEg4ODg4OEhISEgYKCgYmBf39+foWCgICAgICAgH+BgYSFhIWGhoaFhYWFhoaHhoaFhoWFhoeHh4iHh4eGhoaHhoeGhoaGhoaGhYSDhIWFhoSFhYaGhoeHhoaGhoeHh4eIiIeGhoaHh4eRlJORkZCLiIiFhoSDgoKBgoODg4ODgoKDgoKCgoOCgYCBgICBgICAgIGAgIB/gICAf4aHiIeHh4eIiYmIiIODgoKDgoSEhIWEg4KCg4SEhIOBgICAhYV/f35/gH+AgICAgICAgIGAf4WFhoeIiIeHh4eIh4iHiIiIhoaHiIiJiYmIh4aHh4eJiIaHhoeHhoaFhIOEhYaFhYWFhoaGh4eFhoeGh4aGh4eHh4eHh4eFh5OTkY+RkIuHhoWGhIKCgYGCg4ODg4ODgoKCgoGCg4KCgIGBgYCAgICAgICAf3+AgYB/hoiIiIiHh4iJiYmIg4KCg4ODhIWHh4aFg4OFhISEg4GAgIGNiIGAgYKCgYGBgYB/gH9/fnt6gIaIiIqKiYmIiImJiYmKi4qIiIiJiYqLioqIiIeIiIiHh4iHh4iGh4aEg4OFh4eHhoWFhISEhYWEhYWGhISEhYWFhoWGhYOJlJOQj5COioaFhoWDgYGBgYKDg4ODgoKCgoKCgoKCgYGBgYGBgYCAgICAgIB/gICBgH+GiYiIiYeIiImJiIiEgoKDg4KDhImKh4aEhIWEg4OCgICBhISCgoKCgoKCgH9+fX19fX9+fHt8g4eJi4uKioqIiIqJiImLiomJiImIioqJi4mHhoaGh4WGiIiJiIeGh4SDgoSIiIiIh4WCgoGDg4KDg4SCgoKDgoGEg4SEgY6TkpCPj4uIhYSGhIKBgYGBgoODg4OCgoKCgoKCgoGBgYGBgIGAgICAgICAgH+AgIGAf4WIh4eHhoeIiIiHh4SCg4OCg4OFiYqJh4WHhYSFhYKAgYOEgoOCgoKDgX59fn5+fn5+fn1+fX19g4eJioqHh4WGh4eHh4iHh4mGiIaIh4aJiYODhIOFhISFhYaIiIaFg4KCg4WHhoeGhoSDgoOEgoOEhIKBgYGBgYODhIODkZKQjo+Oi4eEhoaEgoGAgYGDg4ODg4KCgoKCgoKCgYGBgIGBgYCAgIB/gIGAf39/gIB/hYaGhYaGhoeHiIeGgYKEhIOChYeIi4qGhIaEgoaGgoKEhIODg4OCgoF9fH1/gH5+fn59fH19fHl8g4aHh4SDgoODhIWFhYODhYSEhISEhIWEgoKDgoSEgYKDg4WGhYSCgYGCgoODhYOEhIWEhIaDhISFg4KDgYKDg4SFhIeSkY+Nj4yJhoSFhIWCgYCBgYODg4ODgoKCgoKCgoKBgYGBgYGAgICAf4CAgYB/gICAgICDhIWEhYWFh4eHh4aAgYGFg4OEhYSHiIWCgIB/gn9/gYODg4ODgoJ/fX1/gICBf31+fn19fX17enp+hISEgoGBgIGBgoKBf36BgYGCgYOAgoGCgoKBg4SAf4CAgoOCgICAgICBgYGCgYGChIODhYSCg4SDgoKBgoSDhYWGi5ORj4+Pi4iFhYOChIKBgYGBgoODg4KCgoKCgoKCgoGBgYCBgYCBgH9/gIGBgICAgH+AgIKCg4OChIOEhYWGhn+BfoCBgICAgIGDgn9+fn5+fYCCg4OCg4KDgn19fn+AgIGAfn19fX19fXx6enqAgoKBf39/f35/f4B+fYB/f4CAgX+AgIGAf4CBgX59fX+AgX9/foCAgH+AgICAf4CCgICCgYGCgYGAgYGBgYKEg4aPkpCOj42Kh4eGg4ODgYGBgYGCg4ODgoKCgoKCgoOCgYGCgYGBgICAgH+AgICAgICAf39/gYKDhIGCgoODg4SFgIB/fH19fn19foCAf31/fn1+gYODg4KCgYF/fX1+f4CAgH9+fX19fHt7e3p6enqAgH9+f39+fn1+f35/gH9+f3+Af4CAf35+fn9/fn18fn+Af35+f3+Af39/f4B/f4B+f4CBf4B+f39/gH9+f4B/hZKSj46Pi4uHiYWEhIKCgYGBgYKDg4ODg4OCgoKDg4KAgYKBgYGAgICAf3+AgIB/gIF/f36BgYSEgYKBg4OCg4OBgH98fn5/fX6Af4B/foF/f4CBhIOCgYB/f359fn5/gICAfn19fXx7e3x6enl5eXuAgH9/f39+fn5+foCAf35/f4CAgoB/fH5+f35+fXx/f4B/fn9/f4B/f35/foCAf36Af39+fn5/f35+fn18fH2Fk5KOjIuKiImIhISEgoKCgYGBgoOCgoODgoODg4ODgYCBgYGBgYCAf39/f4CAgICAgIB/foCBhIOCgYGDhISDhICBgICBgIGAgYKCgoGBgoCBg4ODgYGBgYCAfX19fn5+f359fX19fXx8fHt6enl5eX2BgICBgYF/f4B/f4F/gICAgYGCgoB+gH5/fn5/foGAgoF/f39/gIB/f4B/gYB+f4CAfn9/fn+Af31+fn17fIaTkYyLioeHioiGhoSDgoGBgYGCg4OCg4OCg4OCgoKBgICBgYGAgH9/f39/gICAgICAgH9+fn+BgYGAgISGh4aHgoSDhYOBg4ODhYSEhISEg4ODhIKCgoKCgX5+fX19fn6AfX19fX19fX19e3p5eXl5eYCCgoKEg4GCgoF/gYCBgYGDgoKDgYGCgIGAf4CBg4GEgoCAgYCBgYCAgYCCgn+BgIF/gIB/gICAfn9/fnx8ipOQiomIiIiJiIaGhoSCgoGBgoKDg4ODg4KDg4KCgYCAgICBgYGAf39/f4CAgICAgIGBf359fn5/f39+g4aHh4iChYSFg4SFhIWGhYaGhoWGhYGBg4ODgoKAfX19fX19fn59fX19fX19fX18e3l5eXl4fIKDhIWCgYSDgoKDhYaCg4SDgYKCg4OCgoKCgYKFg4iFgoGBgYKDgYGBgYSDgoOCgoKCgYGBgIF/gIGAf36Ok4yHiIaIh4aGhYaGhIKDgoGCgoODg4ODg4OCgYGBgH+AgYCBgYB/gH9/gICAgH+AgYB/fn19fX5+f36Ag4SHiISGhoaFhoaHh4aHh4iHh4eGf32BgIGCgX59fX19fX19fX19fX18fH5+fnx7eXh3eHl5gIKDf4OMhIOEhISXl4ODhIF9foGCgoGCgYKBg4aIjIWDgoKBhIKEg4KDhYSEhYOCg4OCg4OCgoKCg4OCgpKQi4iJh4mHhoaEhoWEhISCgYKCg4ODg4ODgoGBgYCAgICBgIGBgH9/fn+AgYCAf4CAgH9/fn1+fn+Bf4CCgYWFhYeGh4eGh4eIhoaHh4eGh4V/fX18fX9+fX19fX19fX19fX19fXx7iJKCe3x6fIZ5eHl8gYF+iZaEg4OEhJSTgIGBf39/fn6Fi4B/gICEhpCJhYSCgoGFhYuDgYOFhYaGhIOFhYOFhIODhIOEhISIko6MiYiIiYeHh4WGhYSFhIKBgoKDg4ODg4OCgYGBgYB/gIGAgICAf39/f4CAgICAgYGBf39/f4CAgIGBgYGBg4OGh4aGh4aGiIeGhoaFhIOFhH59fHx8fX18fH19fX19fX19fX18fH+RlZaDe3qElHx4eXp7fICCg4GCgYOCgH59fn57iJF8fI6Wf31/f4KGioWDg4SDgYONiX99f4OEhYWDhYaFhIWFg4SFhYaEhI6Rj4yKioyJiImHhYWFg4ODgYGCgoKDhIODgoGBgICBgICAgYGAgIB/f3+AgIB/gICAgX5+f4GBgoKCgoODgoOCgoWGhISFhYSGhIOEg4KBgIKAfn19fHx9fXx8fH18fH18fX19fHx8e4uRl4x6e3yBenp6e3x5eX19foB/gH98e3t+fn2ClZF/hIh+fH5/goR8fIGChIKAf4eDfYKBf4KCgIODhISEhISChIOEhYGEkpGOi4yMjoqJiYWFhYODgoKBgoODgoKDg4KCgYGAgIGAgICAgICAgH+Af3+Af357gICBenyAgoKDhYODhYWFhYODg4SCgYKDgoOCgoGBgIB/gX5+fX59fHx8fHx8fHx8fHx8fHx9fHx8fn6Kgnt6e3p4ent7fH17fn1+f319fX18fH+BgX2Gj4F+fYJ+fn6Agnx8f3+CgIKAfnx7ioJ9gH9+gYCAgIKBgoCBgYGAf4uUj4yLjo6NiIeHhYWFhIOCgoKCg4OCgoODgYGBgICAgICAgH9+fXx7fHx9f3+AgHx6gYF4e4CCgYOFhIOFhIaHhISAhpSIgIKBgYGBgH9/f39/fn5+gHx8fHx8fHx8fHx8fHx9fHx8fHx8fHl7e3t4eHl7enp8gn+Afn+BfH5+f399gIKCgICAgX+CkYF/f4CAfoB+fn9+gIGBfX19e319fXx9fHx9gH+AgH6Afn6BlJGMjI2OjoqFhoaFhISFg4ODgoODg4OCgoGBgYGAgICBgICAf4CAf39/fXt6fICAgHh+gXd7gIF/gYKCgoKEhoeGhn6IlYp+gYGAf4B/foB+f39/fn+Bfnx7e3x8fHx8fHx8fH59fHt9fHx8e3x8fHp6eXt8en2Fg4J/gYF+f35/gH6FgoF+gH9+foCFhoKAfn6Dhn9+fH6AgIGAf39+fX19fX57fH1/f3+AfX9+gIyRjYyNjo2Nh4SGhoWEhIODg4OCg4ODg4KBgYGBgYCAgYGAgYGBgYGAgH9/f397en9/e3mAd3p/f31+f3+Af4KDhoaFf3+FgX5/gIB/gH5+f31/gIB/f4B/f319fHx9fn18fH19fX19fH58fXx7fXx8ent6fH19f4aEg4CAgX1+fX5/foyEgYZ+fXx8f36CgX99fX19gHx7fXx+gYSDgYB+fn5+fX1/f399foB+fn6Eko2MjI+Ni4mGhIaEhISDg4OCg4KDgoOCgYGBgYGAgYGBgYB/fXx8fH1+f39/f397e399d352eH59fH18fX5+gYGCg4B6fX18fn+Af35/f35/fn+AgH+AgH9/fn9+fn5+fn1+fn99fH59fn1+fHt8fHx6e3p9f4CAg4OCf35/fH18fXx8gYN+jH58e3t9fn1+fn17e3t9fHp7e3uAhoSChIOCf4B+f4KCgn9/goJ/gIuQjYyLjYyKh4SEhIODg4ODgoKCgoKCgoKBgYGAgoGBgYKCf3+AgIB/fn18fH5/fn55fX52e3Z4fXx8fHt9fX6BgICAf31/f31+f39/foB/f39+f3+Af4GBgH99gH9/fn9+fn5/f3yCfn59fX17e319fHp8fH6AgoGAgIB8fH18fHx8fH18fnt/fnt7e3x8fH18e3t7e3x8enp9en6CfoGDhIKBgoGFhoWFhoaHhYGEkY+Ni4qLh4eFgoOEhISEg4KCgYGCgoKBgoGBgYGBgoGBgoKAgYKBgYCAgH9+e3x+fnx6fnh5dnd8fHx7e318f4GAf35/foB/f35/f35/gH9/f39/f39/gYKAfn6BgIB/f39+f39+fYN8fH19fH99fX19e3x+fn9+fn5/fnx8fHx8fXx+fnt8e3x8fHx9fH18fnx9fHt7e3x5e3x7fH16fX5+f4CAg4eJiYmKiIqJhYiRjoyIiYeFhYOCgoOEhIOCgoKBgYKBgYKBgYGBgYKCgoGCgoCAgX98e3p6eXt9enx+fnl8eXh4dHx8fHt8fHx+gH9/f39/gIB/fn9+fX+AgH9/f3+Af4CDgoB/gIGAgIB/f3+Af358enx9fX59fX5+jIZ9fX58e4OCfX19fH18fX19fH1+fH17fXx9fX58fn19fX18e3t6fHt8fHt6e3t6enp7fn6DhYiHiIqLi4uJjZGOjYmIhoWEgoKCgoODg4OBgYGBgYGBgYGBgYGCgoOCgYKBgIGBf3+Af356eHl5en5+e3l6eH5zfHx8e3x8fH5+fn5/gH+AgIB/fn9+gIF/f4B/gIGAgoSDgYCAgYGAgX+AgYKBf39+f31+gH57foGSjHx9f4qAjYx+fn19fX59fX59fHx8fn18fXx9fX1+fX1+fnx7e3t8fH18e3p7fHl6eXh5e35/g4OEh4mKiImOkI2LiIiFhISCgYKCgoKCgoGCgoKBgYGCgYKCgoGCgoKBgoKAgYGAfoCAf39+e3p5e319eHx6f3KBfXt7fHx8fn59fYGCf4GBgX9/gH+AgX9/gIGCgYGFg4SCgYGCgYKBgICBg4KAf4F/fX6Afnx/f4mCf36CkISEg4F/fn18jYd9fX59fXx/fnx9fXx9fX5+fX5/fH19e3x9fnx8e3x9enp5eXl5e3t+foCBg4eEiI6NioqGhYSEg4KBgoKCgoGBgYGCgoKBgoKCgoKCgoKCgoGCgn+AgIB+f39/fn5/ent5fX16enp9cX6Cent9fX19fXp4f4KAgYKCgICBgYGBgICBgoKCgoWFhIKBgYGBg4F/gIKEgX9+gYB9foF+fX5/gIB9fn+EgH5+f31+fX2KhX1+fn1+foB/fX19fH5+fn99f4B9fn18fX9/fHx7fH17e3t6enp7e3x9fn2Ag4CJjYqLh4WFhYSDg4KCgoKCgYGBgoKBgoKCgoKCgoGBgoKBgYKCf4CAgH9/f39+fn59eXp6fXx5d3t0e4d8dHd9fn17e3Z2fYCBg4KBgYKCgoKBgYGDg4OChYaEg4CAgICDgX+AgYSBfn6Af35+gH59fn6AgX+Bfn+Af39/gH99f39/f4CAfn9/gH58fX18fn5+foF/gH2CgHx9gIB9e319fXx8e3x8e3t7fHt8fHx9fIqKiIiFhYWFhISDgYKBg4KAgIGCg4KCgoOCgoKCgoGCgoGBg4J/gIGAf39/fn5+fn57enp8fHt2e3R3f352cnt+fnt4dnd8gIGCgoKBgoODg4OCgoSDhIOFhoOCgX9/gIKAgICAg4F+foB/fX+AfX1+foCAf4J/gYGAgICBgH1/f3+AgIGAgIB/fnx9fX19fn59g32AfoKAfX6AgX98fn59fX17fH58fXx8fHp8e3x9iYaGhYWHhYSFhIKBgoGDgYCAgoKDgoKCg4ODg4KBgYGBgYGCgH6AgYB/fn5+fn5+fn56e3p9goN9dXF6fHpxen59eXh0dICAgoKCgoKDhYOEg4KDhISEhIWEgYGAgH6AgoB+f36Bf35/f4B9foB9fX1+gH9/gYCBgYCAgIKBfn6Af4GAf4CAgH9+fX19fnx+fn19gYR/gH9+f4GBf31/f319fn1+fn1+fHt8enx7eoCHgoSEhYSEg4WDgoKBgYKBgICCgoOCgoOEg4SDg4KBgYKBgYOAfoCBf35+fn5+fX5+fnt7en6Jh354cnl9f3F6eHt4eXV1fYKDgoODg4OFhIWDg4OEhIODhIKBgH+Af4CBfn19foB+fn5/gH19f3x9fX6Af4CAgIKAgIGAgoGAf4B+gIF+gIGAgH9+fn5+fn5/fn6FhYGBgH+Ag4F/foGAf35/f4B/fn17ent6fHt6goR/g4KCgoKChIKBgYCAgoGAgIKCg4GBg4SDhIKEgoGBgoGCgn9+gIF/fn1+fn5+fX59fXp7fIWEe3tzeXp8cHd1dnd5dXR6hISBhISDhIWFhoSDg4WEgoODgoCBf39/f4B9fX1+gH1+f39/fn1+fH19foF/gIB/gIB/gIGDgoGAf36AgH+AgYCBgH9/f39/f4CAgIGCgoKBf4GDgX+Ag4J/f4B/gX+Af3x7e3p8e3yCgH+Cf3+BgIKCgYF/fn+BgH6BgoKDgYGDg4KEgoSCgYGBf4GCgH6AgH9/fX5+fX19fn19e3t6gH94fHZ5eXtxdHh3dnh1cnmFhYKEhIKEhYWGhISChIOBg4GAgIF+f4B/gHx9fX6Afn5/f39+fX98fn5+gX+Bf39+f4B/gIODg4B/f4GBgIKBgYGAgICAgICAgIGAgYKDgYF/gISBfYGDhICAgX+BgYKBfXp7e3x8fH9+f4B9f399fYGAgH59fYB/foKBgYKBgIKCgoKBg4KCgYB/gYKAfn9/fn99fX1+fX19fX19ent7fHZ9eXh5enJ1eXl2d3dzdYaFg4WFgoSEhYSEhIKDgoGDgX+AgX5/gH6AfX19fn9+f4B+fn99f3x/f3+BgIF/f3x+gH6AgYKDgYCAgoOEgoGAgYB/goCAgYGAgYGCg4KBgX+Ag4B+goKEgICCgYKChIJ+e3t8fHx8fX1+fXp+fX14fn9/fHx8fn5+gYCBgYCAgoGBgYGDgoGBf4CAgoB9fn19f319fX59fH19fX16e3p8dnx6d3t4cnZ5e3Z2dnN0hoSEhYSBhISFg4ODgYOBgYOBgIGBfX+BfoF9fX1/f39/gH5+f359fYB/gIGBgX9+fH5/fn5/gYJ/gYGCg4eFgX9/fn6Af4CBgICAgIKCgYCAfoCCf3+BgoOBgYOCg4OFg399fX18e3x8eXp7en55fHl4f357e3t+fX1/f4F/gH6BgICAgoOCgYF/gIGBf31+fH1+fX19fX18fn58fXx5e3x4enx3endzeHd6c3Z2c3SGhISGg4KDhISDgoKCg4GCgoGAgYF9gIB+gH1+fX5/gIB/f35/f3x/f3+BgIGAf359f39+fn+BgH2AgIGDg4N/f359fn5+f4CAgIB/gYKAgH9+gIF+f4CCgoCBg4KEhYaEgH59fHx8fHt5dnl5enl3eXZ+fHt7e358e399gH99fX9/f3+BgoGBgX5/gYF+fX18fX19fX19fXx+jYF8fXl7e3p5fXd4eHR1dXhyd3d0doaEhIWEg4ODg4OCgYKDgoGDgn+Bf35/fn+AfX19fX+AgIB/f39/fIB/f4GAgYCAf3yAf31+fn9/fX5+gYGCgn5/fn1+fn5+f3+Af32AgIB+fn1/gX5+gIKBf4KDgoOFh4SAgH58fXx8e3x1eXl4eHh5d3t8e3t7foV9fn1/ent+fn59foGAgIGAfX6BgH59fXx9fX19fX18e32Dgnx8ent7e3p7d3Z4dXJzdnB4eXJ4hYWFhYOEhIOChIKBgYKBgIKBgIF/fn5+foB+fX58foCAgH+AgIB7gH6AgH+BgYB/fYB+fn5/f319fX6AgYKBfn9+fn59fX5/fn9+fH+Af35+fn+Cfn6AgIF/gYOCg4OGhICBfnx9fHx7fXh3e3h1eXd3eXx6e3t9kod9fH13en1+fn19f35+gH98foB/fn19fH19fX19fHt8ent9enp4e3x6ent4dHh1cXJ0cHh4cnmEhYWFg4SDgoODgoGBgoKAgYGAgIB9fn5/gH18fn2AgIGAf3+AgHyAf4B+f4GAf39+gX9+f39+fX18gICAgIB+f35+fn18fn9/f358fYB/fn1+gIJ/foCAf36BhIKCg4WFgoJ+fX17e3x8eXd8eXd4d3d4e3t7e3yFin17end6fH19fHx9fX1/fnx9fn59fXx8fX5+fX18fHt6enx7e3p5enp7enhzd3VxcXJveHdxe4WGhIWDhYKBg4OBgYGBgoCBgICBgH5/fn9/fXx+fYCAgoGAgIGBfX6Af35/gX+Af3+BgH+Af31+fH1/gICAgH9/f35+fXx+f39/f319f39+fn6CgYF/gIB/foGDgoKEg4SCgn5+fHx6fHt7eXt6d3N2d3h5e3p7eXp/fnt7d3p8fXx8fH59fH19fH19fXx8fX19fX99fXx9e3l7fHx7enp6enp6eHN2dXBwcm93dnJ7hYaEhYOEgoGDgoKCgYGCgYKBgYGAf4B/f399fX9+f4CBgYJ/goF9foF+fn+Bf4B/gIJ/gIB+fH58f3+BgICAf4B/f4B+fX5+f4B/f39/gH9/f4J/gICAgIB/gYGAgISBgoKAf39+f3x9fn56fYV+dHx9enp6enx5eXp6hoV3eXx8fHx8fXx8fHx8fX19fHx9fX19fn19fX16eX18fH16enp6enp5c3V1b29xb3d0c3yFhoOEgoOCgYKBgoKCgYKBgoGCgYCAgICAgH59gH+Af4GCgn+CgX+AgX5/gYB/f4CAgn+Bf319f35/f4KAgICAgIB/gIB+fn1/gH9+f4B/f39/gH+AgICAgH+BgICBgYGCgYCAf39/fn1/fnuBk416fH18e315e3p6eHmBgXh5e3x8fXx8fHx8fHx9fX18fH18fn1+fn59fHp8fHt8fXt5enp6eXlzdXVvb3Fwd3N0fYWGg4OCg4KAgYCCgoGAgYGCgYKBgYCAgIGAfn6Af4GAgYKCgIKCgICCfoCBgX9/gX+BgIF/fX6Af3+AgoCAgICAf3+AgH9+fX6Afn2AgH9/f3+AgICAgYCAf4CAgYCBgYKCgICAf39/fX5/fIGGiXx8fnt7fnl6e3p7jn54d3l7fHt9fHx8fHt9fH19fX18fXx+fn5/f358enx9e3x9e3l5e3p5eXN0dW5zcXB4cnV6hYaDg4KDgoCAgIKCgX+CgYKBgoGBgYKAgYF/fn9/gYGCgYKBg4OAgYJ/gYGBf4CAgIB/gX99f4F/gICBgICAf4B+gICAf359foB+fn+Af39/gH9/gICBf4CBgH+BgIGBgoKAgICAgIB9foB9gIOCe35+e3x9e3p8fHyHeXh4eXx8fH17fHx9fX18fH19fn19fX5+f3+Af317fH18fHx7enl7e3l5c3J1bnZycHhxdXaFhYOEg4KCgICBgoF/gIKCgoKDgYGDgoCCgYB/gICCgoKBg4KEhICBgX6BgoF/gICAgH+Cf36AgYCCgICAgIB/gH+AgIB/fn2Af39/f4CAgH+AgH+AgYGAgICAgIGBgIGCgYGAgYCAgH9/gH5/fX59fn57fXx9e3x8eHh2eHh5e3x8fXx8fHx8fX5/f39/fn19fn9/gIGAf3x9fHx9e3p7eXp8eHpzcnVud3FxenF2d4WFg4ODg4KBgYKDgH+CgYSDg4SBgYOBgoKCgYCAgIKDgoCCgoSDf4GAfoKDgICBgICAf4CAf4GBgIJ/f4CCgH9/gICAgICAf4CAgH+AgICAgIB/f4CBgYCAgICAgYKAgoKCgoCCgYGBgYB/f4B/gId+fnx6fXx7fX94d3Z5eXp8fXx8fXt8fH19fn5/gIGAfn1+gICAgoGAfH59fX58d3t6ent5eXNxdW53cHV6cXZ5hYWCg4KDg4KDhISAgIOBhoOEg4GChICEg4KCgICCgoSBgYKBhIJ/gIB/gYOCgYCBgYCAf4GBgYGAg4F+gIOCf35/goGAgIB+gYCBf4CAgYGBgYCAgIKBgYKBgYCBgYCBgoOCgoOBg4OCgYCBgH+AhH19fXx/fXp9f3p5dnp4eXt7fH19e3x9fX19fn+AgYGAgH+AgICDg4B9f35+fn15eXt6enp5c3J1b3dxd3lzd3uFgoKDgoOEgoOEg4CAgoOGg4ODgoKEgYSDgYKAgIKBhIGCgoGCgX6BgICCgYKBgYKBgIGAgICBgoGEgH6Bg4J/foCDgoCBfoCCg4KAgYGBgoKDgoGBg4KChIGAgYOBgYKEg4KEhIODhIODgYGBgYCCf4B/fYB8enx/e3t3fHl5eXt6fX59fHx8fH1+foCBgYCAgIGBgYSEgH2Af39/f357e3t6e3p0cHhyeXR2eHR3e4SCg4KDg4SChIODgYKChYaEgoODgoSChIOBg4CBg4KCgoKCgIKAf4GAgIKBgoGCgoKBgIGBgoOCgoOAfoGDgX9/gYSEgYN/goKBg4KCgoGDg4OEgYKEgoOCgoGCgoOBg4SDhISEhISFg4SCgYOCgoOBgYGAgH58fIB8fHh8eXp5enx9f3x7fHx9fX18fICAgICAgYGBgYKBfoGAgICAf3t7e3p6enVweHd5dnV8dXZ8gICDgoODg4OEhISAgoOGhYWDg4KDhIKEhYKCgYKDg4GCgoKAgYB+gYCBgYKDgoKCgoGAgYKCg4KCg4B/gYKBgICChIODgoGCgoGDgoKDg4SDg4SAgoSDg4OBgX+Bg4KDhYKEhISEhISDhISChIOEhIKBgoGBgHt+gX59eXx6enp9fHyBfnp8fH19fHp7fn5+gIB/gYGAgICAgIGBgIB/fX18fX18dnJ2eHh2dH92dX2Hh4OChIWDg4SFhICChYWEhIOCg4SEgYSFg4KCgoODgYOCgoCCgH2AgIGCg4KCgoKEgoGCgoOEgoKBgICBgoGAgYOFhIOCg4CCgoOCg4ODg4OEg4CCg4KEg4KCfoOBgoSEgoODhISEhIOEhIOEg4WEg4ODgoKAe4CBf3x8fXp6e32AfX9/fHx6fH59fH19fn5/f39/gICAgH9+foCBgICAfnx9fX5/fn18e3h2f3Z3f4SHg4KDhYODhIaEgYKFhoWEhIODhISChIWFgoKDg4SCg4KDgoKBfoCAgoKDgoODg4SDgYKCg4OCg4GCgYGDgn+ChISDg4KEf4KEg4ODg4SDg4SCgIOEg4SDg4KCg4KChIOCg4SEhISEhIWEg4OEhYSFhIOBgoB9gYJ/fXx8e3x8gH19foB+fn1/fnx8fH19fn5/fn+BgYGBgH99fX6BgYB+fn19fX59fX5+f3+AfH2AgYKCg4OGg4SDhoSBgoiHhYSDg4SEhYGFhYWDg4SDhIODgoOCg4F+gYGDg4SCg4OEhIOCg4KEg4ODgoKDgYOCf4KDg4ODgoOAgoWDg4ODhIODhIOAgoSEhYOCgoODg4GEg4GDg4SDg4SEhYSEhIWFhYWEg4ODf32BhIB9fXx8fHx/gX5/f39/fX99e3x9fX19fX5+f4CBgIGBgH59fH6Cf39+fn5+fX1/f39/gICAf4CEhIODhIWDhIOFf36CiouFhISDgoOFgYaGhoOEhISEhIODg4OEgn+BgYODhYSFhIWEg4KEhISFhIODgoSDhYKBhISFhYaEgoCDh4SDg4OFhIWFhIGEg4OGgoOCg4GCgYSDgoODhYODhIWEhYWHh4aHhYWEhYSBf4GDf35+fH5+fX+BgH9+fHx/f358enx9fX19fX5+fn9/gIKBf319fIB/gH5+fn5+f3+AgYGBgYKAgYWFhIOEhIKEg4aAgoWFiomEhISEhIWCh4aGhIWEhIWEhYSEhISDgYKDg4OEhIaEhYSDg4SEg3yDhHuBhHd5g4F9hH5+cnWDgoF2foOFgH2BdYF5g39/f36EhIKDg4KBg4SDg4SFg4SFhoSFhn2EeXx+f4N7hYOAhIOAf319fn5+gYOBfXt/fX6Afn18fHx9fX19fH19f4B/gYJ/fX18f4GBgICAgH+BgYGCgYKDg4KChoSEhIWEgYOEhYOEhYSKiIWFhYOFhYSGhoaDhIWFhYWEhYWEhIWCgoOEhYWFhoSFhIOEhYWCaICFanx7cXF8gXOGc3R0fYKDdXNxg4ZzcHVyc3SDdnt9dYF/goOBgnZ5hYCDgIR/hYSChYWCaHpyc3N8gHKBg36Dg32BfX5+fX6Cg4J8f4F9f4B9fXx8fHx9fHx8fn1+gH+BgX99fX2AgYKBgYGBgIGBgYKBgoKCgoSHhIWEhYSBgoSGhoOFg4aIhoaFg4aGhoeGh4OFhYaFg4KFhoSFhYODg4SEhoaGhIaEg4SFhn1xe4FweXZ+g3+CbnlwdXN8dnl5hnOEg3B2eHF2dHR1cnN0dml/gG5yb3R2bnVsd217c26Ah3ltfXJzdnN2bW53bHB5bHV9f399foGAgX2Af32Af4B/fX18fH19fH1+f32Af4CAfnx/foCBgoCBgICAgYCAgIKDgoKEhYiGhoCChYODhIeGg4WFhYaHh4SDhoeIiYaHhIWGiIeEg4WGhYWEhIOFhIKFhoaFhoWEhoWHdnB0e3BydX+HhYNtdW92b3x1coR5eYd4cXR3bndod3pucHaCcoN+b3p5eW1vbnpvb213fXiGcHF6cHJ0ZoF1fm57eXNveX+Af319gYB/e39+fIB+gIB+foCAgYB+fn9/foF/gH9+fYB9f4CBf4B+fn+BgH9+goOCgoSFh4eEfoeEg4OFh4aEhoWFhoaIhISGh4iIhoeEhoaLiYWEhoeHhYOFhYWEgoWFhYWGhYWGhYZxdXByc29zenl+g3SIdHV+iHZugnKEhnluanJ/cW1zd3x/dXR8hH54cXV3bnl1enF2eHV6eYRxam95eHBreXN6b3p3dnZwgYB/fn5/f356fn18f31/f359gIGDg4CCg4GBhIKBgIGBgH1/f4F+f359foGAfn6BgoCAgYSHhoODhoSFhIaHhoWFhYWGhoiFhYaFh4eFhoSGhomIhYSJi4iGhIaFhYWDhYWEhoaGhoaFg3iLeXKIentwcIWFeIV4eWtzfnl7a3KDh4N6fG17eXl0foB2bm+AgG90fHV3cXl9fW1+dW+DhYZ6gHJye3x1cG96bHN8bneCgYF+fn99fXp9e3x9fX9/fX1/f4KCf4GDgYGDgYB/gICAfn9+f31/fn1/gH58fYGAfn6Ag4iFhoOFhYWFhoeFhYWFhYeHiIaEhoWHhoaFhIWFhYWFhomKh4WEhoWGhoWGhoSGhoaGhoWGh4eHhoaEhoWGh4iHhYeHhoOHhoWFg4SGhoWGhIaEg4SEhoSEgYODhISFhIWEhYSGg4aHhYaEhIaHhoSEhYaEhX13hYSEhIKBgX1/fnt8e357fHx9f359fH59gIB9f4F/f4GAfn5+gH5+f35+fX99fX5/fHt8f358fH+BiYaFhIaGhoWGhoWFhYWGhoeIhoSGhYaGhYWDhIWGhYSGhoaGhYSGhIWGhoaGhIeGh4eGhYeIiIiIhoSHhYaGiIaFiIeIhYeGhoiFhYaGhYaGhYODhYWGhYWDhYSEhIWEhYWEhYWDhoaGhoWEhoeGhISFhoOFhIKEg4OFg4OCfYB/fHt8fnt8fH1/fnx8fn2Af31/gH5+gH99fXyAfX5/fn5+fnx9fX57fHx/fHt7fn+Ih4SEiIaGhoeGhYWEhoaGhoiHhIaGh4aFhIODhIaFhIeFhoaFhYaEhYaGh4eFh4aJiIaGiIeIiYiFhYiFhoeGh4aHhoiFh4eGh4WFhoeFh4aFgoOFhoaEhIOEhIOEhoSFhYWFhYOGhoWGhYWGhoWEhIWFg4SHhYOCgoWDhIF+gIB8e31+e3x7fn59e3x+fX5+fX9+fX1+fn19fH98fn58fYGAfHx8fXx8fH56e3t8foiHgoWIh4eGh4aGhISGhoeGiIaEhYWGhoSFh4OEhYSFh4SFhoaFhoSGhoeHhoaIh4mIhoaIh4iKiIWHiIWHh4WHhoeGh4WIiIeHhYaGh4WGhoSBhISFhoWFhISEg4SFhIaGhoWGhIaFhoaFhYaGhYSDhISDg4eDhIGChISDgYCAgHt7fn18fHx+fXx8fH19fH18fn18fX18fHx8fXx+fXt8gX99fH18fnx8fHp6fHx9iIeChoiHhoeGhoaEhYaFhoWGhYOFhIaFhIiJg4GEg4SGhIaGhoaGhIeHiIiHh4eIioiGh4iHiImIhYiHhYeGhYeGh4WHhoiIh4eFh4eHhoaHhIKEg4SGhYeFhISEhISFhoaGhoaFh4WFh4WFhYeFhIOEg4ODh4GDgIKDg4KCgn+Ae31+fXt8fH59fH19fH57fHx7fHx8fXt7e318e358e3x/fX18fX1+fXx6ent7fHyIh4KGhoaGh4aGhYSFhoWFhYWEg4WChoSDiId/enqChYaEhoaFh4aEh4eIiIiHhoiKh4aHh4eIiYeFiIeGh4eGhoeHhYeGiIiHhoWHh4eGhoeDg4SEg4aGh4WFhISEhYaGhoaGhYaHhoaHhoaEhoWDg4ODgoOGgYN+goKDgIOCf398f35+fHx9f318fX18fXt7e3p7fHx8e3t7fnt8fXt6e358fHx8fX5/fXt6fHp8fImHg4aFhoWGhoWEhIWFhYWFhIOBhYGGhIKEhHyAhn+ChYWGhYWGhYSHh4iIiIaFiIqHhYeGh4eIh4WIhYaHiIaGh4eGh4eIiIeFhoeGh4WFh4OEhoWEhoaHhoWEg4WFhoaGhoaFhoaHhoeHhYOGhYOBg4KAg4WCg36BgYF/g4F/fn5/fn58fH1/fXt9fXx9enl6eXt8fXt7e3t+fHx8fHp7fXx8fHx+fYF8e3t7e3x7iYeEhoSGhIaGhYSFhYWEhIOEgoCDgYWCgYJ/eoSMe4CEhYeGhoaFhIeIh4aHhYWHioeDh4WGhoiGhYeEhoeJhoaIiIeHhoeIhoSGhoaHhYWHg4SFhIaGhoeFhISDhYWGhoeGhoWGhoaFhoaEg4SFgoGCgYCDg4KCfYGBgH6DgX5/f4B8f3x9fX59e319fH15eXp5e319enp7e318fXx8ent9fHx9fH5+gHx7e3x+fXyIh4WGhYeEhoSFhYWFhYODgYOBgIGBhYKAgH9/fXx7gYSFhoaEhYSDh4eGhoaFhIaJhoKGhIaGhoWFh4aHiImGhYiHiIeGhoeFhIaFhYeFhIeDhIWEiIaGh4WFhIKFhYaFhoaHhIaGhoaFhoODg4WBgIGAgIOBg4B8gYB+foKAfYB/gXx/fH1+fX57fn18fHl6enl6fX15enp7fHt8e3t6e319fH18f35+fHt7fX59fIiGhYaGhoSFhYSFhYSDgoKAgoGAgICDgX5+foB5en2Ag4OFh4WEg4OHhoOEhYSChYiFgoSDg4WFhYWHh4aIiIWFiIeJh4aFhYWDhoSFh4OEhoSEhYSHhoWGhYaEgoWFhoaGhoaEhYaGhYWGgoKDhH9+gICAgYCDgHuBf31+gn5+gH6Afn99fX59f3t/fXt6eXp6eXp8fXl6ent7enx6e3t7fH19fXyAfn18fH1/fnx7h4WFhoaGhoSFhIWDhYKBgICAgYB+gIKCfX5/f3t/f4KDg4WGhYSDg4aDgYOEgoCFh4WCg4GBg4SEhIWGh4iHhYWIhomHhYSEhIKFg4SGgoOFhIWGhIeGhYWFhoOEhYSFhoWGhIOEhYWDhYWBgIODf35/gH9/gIN/e4B9fX+CfoCBfX6Bfn5+fX1/e398e3p5enp5ent8eXp6ent7fHp7e3t7fX59fYB9fXx8fYB/fXyGg4WGhoaGg4SDhYKFgYGAf3+AgH5/gYJ8fn9/foCAgoKChIWDgoGChIGAg4KBgISFhYKBf4CCg4OEhYWHhoaEhYeFh4WGgoOCgoOCgoWBg4WEhYaEhoaHhoaFgoSEg4SFhYWDhIODhIKEhIB/goJ+fX5/fn5/hH57f3x8gIF9gYB9foN8fn59fX57fnx7enl6enl6ent5enp6e3t8ent8e3t+fn1/gXx9fHx9f4B+gIaEhYWEh4SDg4KGgoOAgYB+fn+AfX9/gnx9f39+fn+BgYKEg4KBgYKCf4CBgoCAgoWEgoB/gIGCgYOFhYeFhISGhoOFg4WBgoGBgoGCg4GChISEhYWGh4eGhYSDg4ODhIWFhIGDgoOChIODgH+AgX59fX5+fH6Dfnx+fHyBgH6Cf35/gnx/fn19fHx8e3t6enp6eXt6enp5enp6e3x5e317e35/f4GAfX59fX1/gICAhoSEhYSFgoSCgoSCgoCBgH59fn9+fn6AfX2Af35+foGBgoODgoSHgYF+gICBf3+ChIOBf35/gIJ/goWEhYOCg4WFgoSBg4CBgIGBgYKBgIGEg4OGhYWHh4WEhIWCgoKDhYSCgYGBgYCFg4F/foB/fnx9fn18foN9e358fYF/gIN9fYCBf35/fXx8fH17e3p6enl5e3l6enl6ent7e3p7fXx8f3+BgoB+gH+AgH+AgYDKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzNzc3Nzc3Nzc3NzczMzMvLy8vLy8vLy8vLy8vLzMvLy8vLy8vLy8vLy8vMzMzMzM3Nzc7Oz8/Pz9DQ0NHR0dLS0tLS0tLT09PT0tLS0tLS0tPT09TU1NTU09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tLS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1dXV1NTU1NTT09PT09PT09PT09TU09PU1NTU1NTU1NTU09PT09PS0tLS0tPT09TU1NTU1NPT09LS0tLS0tLR0dHR0dPHhnNlYFtLWWdVTUZIQD03Nzg5Nzw8PDo8Oz42Oj04PDs6OTg3ODs7Oj87PTs8PD47P0E/QkJBQ0RFREE+PTw7QENDQUBDQ0FBR0hHSUtSwtXS09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXVysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMy8vLy8vLy8vLy8vLzMzMy8vLy8vLy8vLy8vLzMzMzc3Nzc3Oz8/P0NDQ0NHR0tLS0tLS09PT09PT09PT09PS09PT09TU1NTU1NTU09PT09PT09PT09PT09PT1NTU1NTU1NTT09PT09LS0tLS0tLT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1NTU1NPT09PT09PT09PU1NPT09TU1NTU1NTU1NPT09PS0tLS0tPT09PU1NTU1NTU09PT09PS0tLS0tLR0dHSzIxyZ2BcTVllUktHSz87Mzc4Ozg5Pj05PDpBOjs9Nzs8PDo6Nzg6Oz0/Oz88PTw/Pj9BPUFBPkNDREJAQT46Oz9DREFDRERCQklHSEhJTr7V0tPT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1crKy8vKysrKysrKy8vLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzMzMzMzMy8vLy8vMzMzMzMzMzMzLy8zMzMzLy8vLzMzMzc3Nzc3Ozs/P0NDQ0NDR0dLS0tLS09PT09PT09PU09PT09PT09TU1NXV1dTU1NTT09PU1NPT09PT09PT1NTU1NTU1NTU1NPT09PS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1tbV1dXV1dTU1NTT09PT09PT09PU1NTU09TU1NTU1NTU1NTT09PT0tLS0tLT09PU1NTU1NTU1NTU09PT09PT0tLS0tHR0s+Sd2hfXk9XZ01LRks9ODc2NTk5OTw+OT88RDo7PDc5PD07OTc5Ojw9QDs+PT47PD48PT5BQD5EQ0NDP0E9Ojs9QkNFQ0NEQT9FSEpJSky61dPT09TU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8rKysvLy8vLy8vLy8zLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMzMzMzMzMzMzMzMzMzczMzMzMzMzMzMzMzMzMzc3Nzc3Ozs/Pz9DQ0NDQ0dHS0tPT09PT09PT09TU1NTT1NTU1NTU1NTV1dXU1NTU1NPU1NTU09PT09TU1NTU1dTU1NTV1dTU09PT09LS0tLS0tLS09PT09TU1dXV1dbW1dXV1dXV1tbW1tXV1dXV1NTU1NTT09PT09PT1NTU1NTU1NTU1NTU1NTU09PT09LS0tLT09PU1NTU1dXV1dTU1NTT09PT09PT0tLS0dHRmn5nYWJOVWpKSElLPzw6OTM3Njc3PTs+Oj06Ojo4ODo7Ozg4Ojs7PD46PT09Ojw/PD0/QkA/Q0RDRD5APT08QENEQ0JEQkQ+REhJSUtMttfT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3MzMzMzMzMzMzMzMzNzc3NzczMzMzMzMzMzMzMzc3Nzc3Ozs7Pz8/Q0NDQ0NHS0tLT09PT09PT1NTU1NTU1NTU1NTU1NTV1dXV1NTU1NPT1NTU1NTU1NTU1NTU1dXV1NXV1dXV1NTU09PT09PS0tLT09PT09PU1NXV1dbW1tXV1dbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1NTU1NTU1NXU1NTU1NTT09PT09PT09PU1NTU1dXV1dXV1dTU1NTU09PT09PS0tLR0p+DaV9kU1hsSEhIS0A9Nzg0NzY6Oj87RDw8Ojw8OTg6OTo6Ojs8Ojo7OT49Pjk9QDs/QUFCP0JCQUM9Pz8+PEBCRUNDQkBBO0ZJR01MSbLY09TU1NTU1NXV1dXV1dXV1dXW1tbW1tbV1dXW1svLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzM3Nzc3Nzc3Nzc3Ozc3NzczMzMzMzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc3Mzc3Nzs7Ozs7Pz8/P0NDQ0NHS0tLS09PT09PT09TU1NTU1NTU1NTU1NTV1NXV1dTU1NTU1NTU1NTU1NTV1NTU1dXV1dXV1dXV1dTU1NTU1NPT09PT09PT09PU1NXV1dbW1tbW1tbW1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTV1NTU1NXV1dXU1NTU1NTT09PT09PT1NTU1dXV1dXV1dXU1NTU1NTT09PT09LS0tSjiGxfZlJWakdIR0lBPjM2Njo7PDhDPEJBPjxBPDg5Ojw6Ojw8PDk8PTo7PD09PD89QD9AQT9AQUBCPD4+PzxCQ0NDRkBBQT1ISklOTUeu2NPU1NTV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbMzMvLy8vLy8vLy8vLy8vLy8vMzMzNzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzs7Ozs7Oz8/P0NDQ0NHR0dLS0tPT09PT09TU1NTU1NTU1NTU1NTU1NTV1dXV1dXU1NXV1NTU1NTV1dXV1dXV1dTU1dXV1dXU1NTU1NTU09PT09TU1NTU1NXV1dbW1tbW1tbW1tbW1tbX19bW1tXV1dXV1dXV1dXV1dTU1NTU1dXV1dXV1dXU1NTU1NTU09PT09PT1NTU1NXV1dXV1dXV1dXV1NTU1NPT09PT0tLWroprY2VSWGhMSkdJQjg0OTQ6Ozo5QDk+Q0U/PDw5OTk9Oj07PDw6PTw7OTw9Ozs/PUA9PT5AQD9CQT5APD05QERDQkFBQj48SEpLTU5IqNnU1NXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbWzMzLy8vLy8vLy8vLy8vLy8rKy8vLzMzMzMzMzMzMzM3Nzc3Nzc7Ozs3Nzc3Nzc/Pz8/Pz8/Pz8/Pz9DQ0dHR0dHR0dHR0dHS0tHV2djY2NnZ2dra2tvb29vZ2dnZ2dna2tra2tra2tjW19fX19fX19jX19fX19XV1dTU1NTV1dXV1dXV1djY19fX19jX19fX19bX2tra2tra2tra2trb3NzX1dXV1dXV1dXV1dXW1tbX1tbW1tbV1dXV1dXV1dXV1dTU1dXV1dXV1dXU1NTU1NTU1NTU09PU1NTU1NXV1dXW1dXV1dXV1dTU1NTT09PT09PS1bqKa2hoUlhlSUlMT0A5OTo0O0E8Nz05QUM+QD89ODo6Ozk9Oz4/Ojs8PDo7PDo7Pj1APT8/P0FAQUE/QTw8Oz5BRENBREA9PElJSk1ORqPa09TV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbW1szMz9DPz8/Pz8/Pz8/Pz8/W3t3d3t7e3t7e3t7e3t3S0NDQ0NDQ0NDQ0NDQ0ci5ubm5ubm5ubm5ubq6t6WkpKSkpKSkpKSkpKSnhmBjY2NjY2NjY2NkZGRlhIuKioqKioqKioqKioemuri4uLi4uLi4uLi4uLrR09PT09PT09PT1NTU1ce3ubm4uLi4uLi4uLi5sIqKioqKioqKioqKiouHvebh4uLi4uLi4uLj4+Pi2NfX1tbW1tbW1tbV1dXV1dXV1dXV1dbW1dXV1dXV1dTU1NTU1NTU1NTV1dXV1dXW1dXV1dXV1dXV1NTU1NTT09PT09XDkXFrak5TYkxMVk48Ojo3Nz5DPjg+Oj8/QT0+QDc7Ojs7PTs+Pjo7PD48Oz07PT8+QDw/Pz1AQEBBPj88PjxAQUVCQkZAQD9HSEpLT0ae2tXV1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19fMzNDS0tLS0tLS0tLS0tLR3uzr6+rq6urq6urq6uvp1dLS0tLS0tLS0tLS0tTEqaqqqqqqqqqqqqqqq6aGhIWFhYWFhYWFhYWFik4MEhISEhISEhISEhIRE0pUU1NTU1NTU1NTU1NPg6ejo6Ojo6Ojo6Ojo6Knz9PS0tLS0tLS0tLS0tS9oKOjo6Ojo6Ojo6OjpZVTUlNTU1NTU1NTU1NTS6ry6+vr6+vr6+vr6+vr6dnX19fX1tbW1tbW1tbW1dXV1dXV1dbW1tbV1dXV1dXV1dXV1dTU1NTV1dXV1dXW1tXV1dXV1dXV1dXU1NTU1NTU1NPUy5h2bGlKTl9NUlVNPjw8Nzs/Qz42Ojc+Pzs9Qj85PDk9Ozw6PD07PTs9Ozs9PD0+PT07QT08QUBBQT08Pzw7QEJDQURFPUFAQ0ZLS09GmNzV1dXV1dbW1tbW1tbW1tbW1tfX19fX19fX19fXzMzR0tLS0tLS0tLS0tLS0d3q6enp6enp6enq6unq6dXS0tLS0tLS0tLS0tLUxaqrq6urq6urq6urq6yoiIeHh4eHh4eHh4eHh41SEhgYGBgYGBgYGBgYFxpOWVdXV1dXV1dXV1dXU4WopKSkpKSkpKSkpKSjqM/T0tLS0tLS0tLS0tLVvqKlpaSkpKSkpKSkpKaXV1dXV1dXV1dXV1dXV0+r8erq6urq6urq6urq6unZ19jX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dXV1dXV1dXU1NTU1NTU1NGcenFpSlRdT1JVTkQ+Pzs/QEA4Ojs4PDs8PD86Ozs4Ozk5Ozw7Ojw5Ozs8Ozo9PT0+PUE/Pj8/Pj08PT88PEFBQ0FERTw+QEVGSktNRpPc1dXV1tbW1tbW1tbW1tbW1tfX19fX19fX19fX183N0NLS0tLS0tLS0dHR0dDc6Ofn5+fn5+fn5+fn5+bV0dLS0tLS0tLS0tLS08Wtrq6urq6urq6urq6vq46NjY2NjY2NjY2NjY2SXSInJycnJycoKCgoKCcpWmNiYWJhYmJiYmJiYl6MrKmpqampqampqampqazP09LS0tLS0tLT09PT1cCmqKipqampqampqamrnmJhYmJiYmJiYmJiYmJbr+/p6enp6enp6enp6enn2djY2NjY19fX19fX19fX19fX19bW1tfX19fW1tbW1tbV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbV1dXV1dXU1NTU1NTWo3txZElbYE5OVU9AQT89REI+Oz06OTs6PT07PDs6OTg5OTs8Ozw8Ojo7PDo7QD08PTxAQTxBQTs7PEA/PD1CP0RDQ0U8PkJERkpMTEWN3NXV1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjNzc7Ozs7Ozs7Ozc3Nzc3Nzs/Pz8/Pz8/Pz9DQ0NDQz87Ozs7Ozs7Oz87Oz87NzMzMzMzMzMzMzMzMzMvJycrKysrKysrKysrKysfCw8PExMTExcXFxsbGxsvMy8zLzMzNzMzMzMzLz9HR0tLS0tLS0tLS0tLS1NXV1dXV1dXV1NPT09TT0tLS0tLS0tLS0tLS0tHNzc3Nzc3Nzc3Nzc3NzdTY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NfX19fX19fX1tfX19fX19bW1tbW1tbW1tXV1dXV1dXV1dbV1dbW1tbW1tbW1tXV1dXV1dTU1NTU169/cF5GXmJQUVdOR0ZDQ0lBPz07PDo8OEBCPD04Ojo4OTg7Pzs8PDs7PDw8PD87PD46Pj44PkI8Pj1BPjw+QkBERUNAPD5APkNJSUtEh9zV1tbW1tbW1tbW1tbX19fX19fX19jY2NjY2NjYzs3Nzc3Nzc3Nzc3NzdHNzc3NzczP09LSzs3P0s7Ozs7Ozs7O09TQz87Q09DO0tTV1NDPz8/Pz8/Pz8/Pz8/P0NDQ0NDR0dHR0dHS09PU1NTU1dXV1tbW1tfW1tbX1tfX19fX19fX19bW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dTU1NTU1NbW1tbW1tbW1tbW19fW2NjY2NjZ2dnZ2dnZ2dnY19jY2NjY2NjY2NnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjX19fX19jY19fX1tbW1tbW1tbW1tbW1tbW1dbW1dbW1tbW1tbW1tbW1tXV1dXV1NTV1di4gm9XSl9jUlFaS0hBQTxCPT07Oj4+PD4/PT0/Nzk6OTk3OD48PD47Ozw7PDs/PT0+OTs7OT0+P0A+QD07OkI/QkNCPz0+QD5CRUdKQoDc1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2M7Ozs7Ozs7Nzc3Nzsqfys3Nzc3QuYOEi8fTwJrLz87Ozs7O0KaSxdHSuY++1JyChIrGz87Ozs7Ozs7Ozs7Oz8/Pz8/P0NDQ0NDQ0NDR0dHR0tLT09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbV1dXV1dbW1tbV1dXV1dXV1NTU1NXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NfX19fX1tbW1tbW1tbW1tbW1tXV1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXYwIBuVU9gY1dZW0xMQ0A9PTs9Ojw+Qj5CQ0A9Ojg5ODo6Ojc7Pz4/PDw7PDo5Pzw8PTg5PD9BPj09PUFAPTtBQkBCQz47QD9BQUlHSkF629bW1tbW1tbX19fX19fX19jY2NjY2NnZ2djY2dnOzs7Ozs7Ozs7OzdKpj63Rzs7Ozpu3tqSiwJOerNPOzs7O0qqdrJTNwZSwnLGWuLmvodLOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0dHS0tLT09TU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dbW1tbW1tXV1dXV1dXU1dXV1dXV1dXW1tbW1tbW1tbW1tfX19fX19jX19fY2NjY2NjY2djY2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2dnY2NjZ2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV18h/b1pTYWVeXVxPSkQ9QD8+Ozc6Pjk/RD5BOTg3ODk7Ozw4OT89PTw9PD47OkE7OTs5OzxDQDw7PT5AQT49QkQ/QkM9PT8+Pz5ISUg/ddrW1tbX19fX19fX19fX2NjY2NjZ2dnZ2dnZ2dnZzs7Ozs7Ozs7Ozs/Inrym0tDQzsqgl36Cw6abr6fUz8/P0MmXmYWlsKagi5HDk31+r7DRzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dLS0tPT09TU1dXV1dXV1dXV1dXV1dbV1dXV1dXV1tbW1tbW1tbV1dXV1dXW1tbV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2djY2NjY2NnZ2dnZ2dnY2NjY2NfX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dbV1dXV1dfNiHNdWGloXl9gT0lGOkFAPj88PTo2P0JAQzo2NDc6Ozo8Ojk+PD49PTs/PTxBPjw8Ojw8PTw6PEA9QEI+PkFCPUNDPT0+Oz9BRUtIQHDZ1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2c/Pz8/Pz87Ozs7SrKWnqdXAvNLHnY+ey9PJipmq1M/Pz8/RpLC9mJuch5261NLNnp7D0M/Pz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0dHS0tLS09PT1NTU1dXV1dXV1dbW1tbW1dbW1tbW1tbV1tbW1tbW1tbW1dXV1dXV1dXW1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnY2NjY19fX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0JB1W1tqaWFeXVNOSTxDQEE+QD46OEZBP0M6NzQ5Ojo5Ozs4Oz0/Pj49QT08P0A9Pjw8PDw8Oj1AQD8/PT5CQD9AQkA8QD0+QUVLRz9r19fX19fX19fX2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnPz8/Pz8/Pz8/QzJ2Nl6zQmpfKxZ6ynpbN1q2ZqtTPz8/Pz9DVuZqYnZCfoNLTwKCg0M/Pz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0dHS0tLT09PT1NTU1NXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX19fX19fY19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tKUcl5ea2tqZV1PTEc/RENDQDo9OzxCPD49OTY0Ojk5Ojo5Nzs/QDs8PUA8PEE+PD07PTw/PDo8Q0A+PTs9QD5CPkBBPkA9QD9GSUQ/ZtXX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2traz8/Pz8/Pz8/P07GigJuvyaCjv8qcpYynrdiqmarUz8/Pz8/Q0ZqgoayvkaG516+iqdTQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1NXV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dbW1tXW1tbW1tbV1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbSk3BgXnBoZmVaUUhHQkVDQEA3Ojo8Pjo8OTc2NTk6Njo8Ozc8QEA8Ojo9Ojw/Pj08OUA8PDo6OT9APj08PUBBQz9APz5BOz9ARkpCP2LS2NfX2NjY2NjY2NjY2dnZ2dnZ2tra29vb29vb28/Pz8/Pz8/P0M6fkGyclteqo9PSrqa1mJ/Vqpmq1M/Q0NDQ1aeko7uemq2bqdijobrU0dHR0NDQ0dHQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1dXV1dbW1tbX19bW1tbW1tbW1tbX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfW1tfX19jY2NfX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX1tbW1tbW1tbW1tbW1tbX19fX19fW1tbW1tbX0pNuYFxxZGdkWlVKQENGQ0FCODs/PD07PDw4NTU4OTY4Ozo5PDo+Pzw9PTk8Pz49Ojo+OTw6Ojg+Pzw9PTw+QEFDQT48PDpCRERKRkJd0NnX19jY2NjY2NjY2dnZ2dna2trb29vb29vb29vPz8/Pz8/Pz9G9n8O31pfA09HQ0srSzZeb1KqZq9XRz9DQ0sCdosvFlqbFmKLRnp/J0tHR0dHR0dHR0dHR0NDR0dHR0dHR0tLT09PU1NTV1dXV1tbW1tfX19fX19bW1tbW1tfX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19fY2NjY2NjY2NjY2NjY2djZ2dnZ2dnZ2dnZ2dnZ2drZ2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fX19fX19fW1tfX1tbX19fX19fX19fX19bW19GRbF1cb2doYl1PRkBISUdFQDw8Pj48PT48NzU2Ojk2OTs6Ojs4QD86PDw5PD49Ozs6Pzk/Ojs5PT49Pjw7PTxAQ0I/Pz47Q0ZGR0hEWc3a2NjY2NjZ2dnZ2dnZ2dna2trb29vb29vb29vb0NDQz8/Pz8/Pz5V+e6WS1KKa08ySl6ObodirmavV0pem09SkoI+4y5ucm5utx5+h0tHR0dHR0dHR0dHR0dHR0dHR0tLS0tLS09PU1NTV1dXV1tbW19fX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tbX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2tnZ2dnZ2dnZ2djY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX1tfPjGRWXnBrXGBgTkVITUlJT0M+OkI9PUBCOzU1Nzw6Nzo7Ojo7OT09OTo6OT0+Pz07OT47PDo8Ozk+PD47PD0+QENCPz5BPEFDR0ZGRVXJ29jY2NnZ2dnZ2dnZ2dra2tvb29vb29zc3Nzc3NDQ0NDQ0M/Pz9DR1aeZrcmjqL7KnbGdo7XZqZup2LirocjGpr2Vkaqpq6SexbSkptbS0tLS0tLS0tLS0tLR0dHS0tLT0tPT09PU1NTV1dbW1tbX19fX19fX19fX19fX19fX19fX19bW1tbW1tfX19fX19fW1tbW1tbW1tbX19fW1tbW1tbW1tbX19fX2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2djY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fX19fX19fX19fY2NfX19fX19fYzYZdV2JvZE9dVEtIRlNRS0xBPj1EPD9DRj01NTc7OTY6Ozo8PTo7Pzo6OTg6PT0/Pjs/Oz49Ojs5Pjs9PD0+QURCQD8+PzxAQUVHRURSxdvY2dnZ2dnZ2dnZ2tra2tvb29vb3Nzc3Nzc3NzQ0NDQ0NDQ0NDQ0NO5gL3Tm5bP1LWLkZ/T1LyBu9TOlKDUyo6Tl5Cnz5KQp9e5g7/V0tLS0tLS0tLS0tLS0tLS0tLT09PT09PU1NXV1dbW1tfX19fX19fY2NjY19fX19fX19fX19fX19fW1tbX19fX19fW1tbW1tbW1tbW19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2tnZ2tra2tra2tra29ra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2NfX2ct+WlVqaltMX01KTEpVTEZCPD0/R0ZHS0g9NjU3Ojk3OTo7Ojw9OT45OTo4Oz0+PkE+PTk8PDo9Pj46PTk5Oj9FQUA+PT8/QkBHRURFUMHc2dnZ2dnZ2dna2trb29vb29vb3Nzc3Nzc3dzc0NDQ0NDQ0NDQ0NDQ0cHR0crI0tDUxLjS0tHSwtLQ08fM0tTCr7Cz0NXLvdXS0cLT0tLS0tLS09PT09PT09LS0tPT09PU1NTU1NXV1dbW1tfX19fX19fX2NjY2NjX19fX2NfX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29va2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2djY2NjX19fX19fY2NjY2NjY2NjY2NjY19rHd1xSZ2laTlpOTFBRV0VKPz89P0FFTExBPjc3NTs4ODk5Ojs8Pjw+ODo6OTs+P0A9Pj46NTo6Oz0/Ojs5Ojw+QkJAPz8/P0FCR0RDRE683dnZ2dnZ2dna2tvb29vb29vb3Nzc3Nzc3d3d3dDR0dDQ0NDQ0NDQ0NDS0NDR0dDQ0dPU0dHR0dPR0dHS0tHR1NbW1tPS09XT09PV0tLS0tPT09PT09PT09PT09PT09PU1NTU1dXV1dbW1tfX19fX2NjY2NjY2NjY2NfX19jY19fX19fX19fX19fX19fX19fX1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tvb2tra2tra2trZ2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2trZ2tra29ra2trZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjbwXNYVWlrU0xSTlBSWVRGSTw+Qz9BQkVLPj43ODY5Njc4OTk7Oz0/QDw9ODk7Ozs/Pjw8OTU6PT47OTk7PD8/P0JCQT1BPUBBQkZCQkJLtd7Z2dra2tra2tvb29vb29vc3Nzc3Nzd3d3d3d3R0dHR0dHR0dHR0dDQ0NDQ0NDQ0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tPT09PT09PT09PT09PT09TU1NPT1NTU1NTU1NXV1dXV1dXW1tbX19fX2NjY2NjY2NjY2NjY19fY2NjX19fX19fX19fX19fX19fX19fX19fW1tbX19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2NjY2NjY3LxvVFRsbExLUkpUUlVLRkQ6PkdEREFERjw/ODk6OTY5OTo3PD07PkA9PTc5Ojs5Pjs5OTY2Oj1AQT47PDk6Pj9DQT4/Qj0+QkNFQkFCSrDe2dra2tvb29vb29vb29vc3Nzc3Nzd3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0tLS0tLS0tLS0tLS0tLS0tPT09PT09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1tbW1tbW19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19fW1tbW1tfW19fX19jY2NjY2NjZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2dnZ2dnY2Ny2a1NbcGtLVVdSXFFXSEQ+PEJKRT1ISj89PDc4ODo1OTg5Njs+PD1APDw1OTk8Oj87OTk0ODw9PUFBPD47Ojw+QD89PkE9PUNGR0I/Qkmq39ra29vb29vb29vb3Nzc3Nzc3N3d3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHS0M/U0M7P0tLT0tLS0tLS0tLS0tPT09TU1NTU1NPU1NTU1NTU1NTU1NTU1NTV1dXV1dXV1dbW1tbW19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19jY2NfX19fX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dndsGRTYXJfT1pUV19RUkdCPUVJTEFBTEQ/Pzs5ODg5Mzg2ODY5Pj0+Pz06Njo7Pjs9PTo5Njg6PTtAQDxAPz0/P0I+PD48PEJFSElCPkNJpODa29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3t7S0tLS0tLS0tLS0dHR0dHR0dPT0bm7zLqbnLrQyNPT0tLS09PT09PT09PU1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2NjZ2dra2tra2tra2tra2tra2tra2tra2tra29va2tra29va2tvb2tra2tra2tra2tra2trb29vb29va2tra2tra2tra2tra2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ3qpfVWBuW1VZUVpeT0xHQ0ZNSUZEREo7QUE7PDg4NjQ4Njk4Nzw/QT89Ojc8Pz48Pz87OjY4OD09QEE9QD5BQD1AOjs6Pj1BRUdKQkBDR57h29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e0tLS0tLS0tLS0tLS0tLS0tO+wMqaoKKViJGeqpOpz9TT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fY2NjY2NnZ2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dna2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2tvb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2d6iXFVeblheXU5aUFROQ0NMSUlJRkpEPEJBPDs4NzY3OTc3OTk9P0E/PDo5QD88PkI/Ojg3NzY9Pz9APUBBPz88PTs7OD48P0VJSEE/Q0aX4dvb29zc3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3tPT09PT0tLS0tLS0tLS0tTIlZyum5m1iX2TjIKBhMTV09PT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tvb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dndmlpYYW5ZYVdPV01QRUJETElNS0ZJRT5CRDk4ODY3OTc1Njk4PT1BPjo4OT4+PD9APzw1Njc2PD4/PjtAQEA/Pj4/Pjs/PkFCRkdCQENIkeLb29zc3Nzc3d3d3d3d3d3d3d7e3t7e3t7f39/U09PT09PT09PT09LS0tLTz6h+kayPko6MhoCIiYSQo8rU09PT09PU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY19jY2NjY2NjY2NjY2NjX19fX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2tra29vb29ra2tra2tra2tna3JJaWWNuWlpSVV5QTDxAR05IUklIRT47SEY4OTc1Nzg3NTg5ODs+Pj07ODlBPj1AP0E+NzU5Njs+QUI/P0BAQUI/Pj8+QUBEQUZIQj9FSozi3Nzc3Nzc3d3d3d3d3d3e3t7e3t7f39/f39/f1NTU09PT09PT09PT09PWtaWaiIuQhYCFi4iBg4qLf4bC1tTU1NTU1NTV1dXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2dnZ2dna2dra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29ra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb2tra29uIWltnalxYTFpfVkg6TEhMSkpDRUVDQExINzo3Njc4ODU4Nzg5PDw7Ozk4QD89Pj8/PDY3PDQ3P0JCQUBAPz8/QT09P0A+QEBGRT09REuI4tzc3Nzd3d3d3d7e3t7e3t7e3t/f39/f39/f39TU1NTU1NPT09PT09PUxZKCg4WGfYGCfXx5foGCg36k29bU1NTU1NTV1dXV1dXV1tbV1tbW1tbW1tfX19fX19fX19fX19fX19jY2NjY2NjZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vc3Nzc3Nvb29vb29vb29vb29vb2tra2tra29vb29zb29zb29vb29vb29vb29vb29vb29va2tvb29vb29vb29vb29vb29vb2tvZgFpebWhaU0ldW1hKRE1ISlNMR0ZBQD9KQjg7NjY5OTc1ODY4Ozo7Ojw5OD09O0A9Ozo2NTw3Oz1CQEFBPD49QEE9PEA/Pz5CREU+PERLg+Lc3d3d3d3d3t7e3t7e3t7f39/f39/f39/f39/V1dTU1NTU1NPT09PT2LKEkKh9g3l2hIh/e3d5gn5+i67A1dTU1NXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dna2trZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2tra2tra2trb2tra2tvb29vb29vb29vc3Nzc3Nzc29vb29vb29vb29vb29va2trb29vb29zc3Nzc3Nvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc1nlcWmxmWFJPYFFSQUhHSkZYTEZAQENDSz87Ozc4ODc2NTc2ODo5PDw6PTs/PTs9Pjw7ODg8OT0/QkFCQzw8P0FCPj1BQkNCREVDQDtDTH3h3d3d3d3e3t7e3t7e39/f39/f39/f39/g4ODg1dXV1NXU1NTU1NPU0ruen3WKeXuIgICChYGDcnOAhYOMrNfV1NXV1dXW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NnZ2dna2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra29vb29ra2trb3Nzc3Nzc29zc3Nzc3Nzc3Nzb29vb29vb29vb29rb29vb29vb29zc3Nzc3Nzc3Nvb29zc3Nzc3Nvb29vb29vb29vb29vc3Nzc3Nzc3Nvb29vb3dByXV9wZVdLUGNPS0JHQ0pIS0ZBPEE9SFBBOjo3Nzg3Njc4Nzw6OD09PD47QD88Pz07Ojs5Ojk8QEJAQkNAPUFAPz1AQkNDQUBAP0A7RU144N3d3d7e3t/f39/f39/f39/f3+Dg4ODg4ODg4NXV1dXV1dXV1NXU18h4i4V8goh6g4SBfoKCc2l0hYuGkJ3U1tXU1dbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tvb2tvb3Nzc3Nzc3Nvc3Nzc3Nzc3Nzc29zb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb297KalxjcWVST1heSz9HTElPS0VAPkFCP0lPPjk6NzY7NzY6Ozc7Ojg6PDw+Oz09Oz48Ojs4OTo4OUFCQkFAQDtAQj06PkFCQz8+PT4/PUZOdN/e3t7e3t7f39/f39/f4ODg4ODg4ODg4ODg4OHV1dXV1dXV1dXV1s6dhpl+f5OTin+CgXx9gnNxm4mAgoOJwNnat7TQ19bW1tbX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tra2tra2tra2tra29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NvfwGNaW21gVlBTU0pETEhNSEk8PkFEQ0ZORDw8OTc5OjY4Ozk3PDk4OTw9OzlAPjpBPzw3NTc7ODpAQUVBPz45PUI/Oz1CQkI6Pj07PT5GTnHe3t7e3t/f39/f39/g4ODg4ODg4ODg4OHh4eHh1tbW1tbW1tbV1tjLioCHhYOXjHh7e3lvfYF1a3ebdHZ7eInHxpiMrdjZ19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2drZ2dna2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tra29vb3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29zb29vb3Nzc3Nzc3Nzd3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3Nzc3Nzc4LdjV1lrYlJNVVFMSktGS0ZDQD5CQT9FTT4+PTg5OTo3OTo3NT03Nzo+PDs7Qjw5Pz05NjY4PTk6QEJGQD49PEBCREA9QD9DO0A9PD4/Rk9t3N/e3t/f3+Dg4ODg4ODg4ODg4OHh4eHh4eHh4dbW1tbW1tbW1tfVrYZ6d32rn3l4entzdH+Dfm9xe3l6c3t2k4qFgImkzdnY19fX2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tna2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29vb29vc3Nzc3N3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vc3Nzb3Nzc3Nzc3N3d3d3d3d3d3dzc3Nzc3Nzd3d3c3Nzc3Nzc3N3d3d3d3d3d3d3d3dzc3OGtYVtebGJSTVZMTUdLS0RGQkI7QT08RUxDQT44Ojk6Nzc5NjY6NTs+QDs9Oz89PD89Ojk5Ojw5PEVDRkA/PkBDQkQ9OT0/QT1CPz1APkdPadvf3t/f3+Dg4ODg4ODh4eHh4eHh4eHh4eHi4uLW1tbW1tbW1tfQmH+Qh4N9eoN2e3Vzenl6kKqmd3JyfoeHh4CAfoKEhJHJzNnX19jY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra29va2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2djY2NnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vb3Nzc3N3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzb29vb3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3dzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3NzhpV9UYm1iUE9TSUhHRkpJSUJBPkJCPEVFREA+ODo4Ozc3Ojc4ODY+Pz07PDk9PDo+PTs6Njc7NjpEQUY+Pz8/PkNBPzs9PT47REM/PjxIT2fZ4N/f3+Dg4ODg4eHh4eHh4eHh4eLi4uLi4uLi1tbW1tbW19jYyH52doN+fnR2eIaCenl1d5yhu6GEgoCAfoeKinx/gYaMnKjO2NjY2NjY2NjY2djY2NjZ2djY2NjY2dnZ2dra2tra2trb29rb29rb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3d3d3d3c35pbT2drXFBRUElDT0pLR0xHSkJAP0FHREBBPDg8ODg1ODk3Njc3QEA/Ozw5Pj04PTw8Ojc4PTk/RENGPkE/QkBDPzw6Pj0/PkVEPz07S1Fj1+Hf4ODg4ODh4eHh4eHh4uLi4uLi4uLi4uLj49bW1tbW19XB3LRueHJze3B6eXaFiIR7eH2AgZiljH98fnuRhZaLhoGDgY6Rvd3Z2NjY2NjZ2dnZ2dnZ2dnZ2dnY2dnZ2dna2tra2trb29va2tva2tra2trb29ra2tra2tnZ2dnZ2dnZ2dnZ2dna2trZ2dnZ2dra2tra2tnZ2dnZ2dna2tra2tra2tra2tra2tra2trb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t3d3d6NWFdobllQUUtISlNJTUhNSUtBQz9DRkJBRDo6PDg2NDg4NzY2Nj8+Pjo8OTw7Oj09PDw4Ozw8RERERT4/PkI+Qj84PT8/Q0NCQEE+O0xUY9Xh3+Dg4OHh4eHh4eLi4uLi4uLi4uLi4uPj4+PW1tbW1teslLZ6eHJvd5V7dHuLgHh1bn6Fg3t/hYhyfH2bnI6JioJ+g32Hk5rH1NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2trb29vb29vb29vb2tra2tra2tra2tra2tnZ2dnZ2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2trb2tra2tra2tra2trb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d7Zf1lgaGxcUUtHR09LTk5PTURGQkg/Q0hEREA6Ozs4NzU3Nzc4NThAPkA7PDk8Ozw+Ojk7OTk7OUZERUI8QD4/PEBDOz5AP0A/Qj8+OjtKVWPV4eDg4eHh4eHi4uLi4uLi4uLi4uPj4+Pj4+Pj1tbX19vKhYR3cXJubniVhHt4hH95dnB4c3eLkY6CdnN9ioaId3d1d4ODfIiIk8Pb2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2trb2tvb29vb29vb29vb29rb2tra2tra2tra2tra2tnZ2dnZ2dna2tra2tra2tra2trb2tra2tra2tra2tra2trb29vb29ra2trb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f0nVZaGlqVk5KSE1OR01EUElGSD9FPUZMREM+Ozs8OTc3OTY2OTU4Pj4/PTs8QDs9PDo3Ozc5OThHREVCPUE9Qj8+QDw/QUE/QEJAPjs8S1Ri1OLg4eHh4eLi4uLi4uLi4+Pj4+Pj4+Pj4+Pj49fX19fEknuJf29sbnV2foSBg4qGfnVybWVtiIaKjoR7c4OHint4e4OPj4GEioqxztrZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29zc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tvb2tvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3dzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f3t7e4clsW2pqalNOR0hOT0VIRk1JSUA7RD5ISUA9PDo6Ojg2ODo3Nzk0OD08PT07ODw8PDw4Njc4OTo6RUJFQT9APEI/Q0M+PkNEQUBAP0A8PUtRYdPj4OHh4uLi4uLi4uPj4+Pj4+Pj4+Pj4+Pj5OTX19fZqXaFfnx3bHB3eXh8jH2KhYB3anN0d3p9bot7fnl6foR/gIGDfnh8foeGlrbT2tnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra29ra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/e3uO9amFpa2lRTkZNTEtKWE1OR0FAQE9BQz9AOzw4OTk5Njg2NjY4NDs+PD07OTY6Ojk6OTU4OTg5OkJERj8+Pj5AQEBCPzxBQD88Pj9BOT5KT17S4+Hh4eLi4uLi4+Pj4+Pj4+Pj4+Pj4+Tk5OTk19fX2sqKhIB5c29tcXN1d4CUeHaAfHWHhXd1cnWgmXp7d3Z5doR0bWxue3iAmouTu9za2tra2tra2trb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc29vb29vb2tra2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f397js2lpbmloUFBPTExPUk9LU0Y/RURERD48PDg7ODc5OTU2ODY2NzM6Pjs+PTc6Pjk5OTk2Ojo4NzxDRUc/Pzs/PkA9PkE9Oz0+OUFAQDhBTlFc0OTh4eLi4uLj4+Pj4+Pj4+Pj4+Pk5OTk5OTk5NjY2NjauY6AenZ1bmpveHCBfWt0cnZ3hIV5h4d5lY55eXp1d3pza298gHx2fYh8gLLe2tra2tvb29vb29vb29vc3Nzc3Nzc3Nzc3dzc3Nzc3Nzc3Nzb29vb29rb29vb29ra2tra2tra2tra29va29vb29vb29vb29zc3Nzb29vb29vb29vb29vc3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3t7e3t7e3d7e3t3d3t7e3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/f39/f4qpqa2hrZFNQT0ZQVFJOSFJLPkREQ0I7Ozk6Ojg2Nzg1NjY4ODg0Oz88Pzw5PDw3Ozo6Nzo6Nzo9Q0JDPUE+Pzw5PT5BQDs8PDtFQD47Q05TXNDk4eLi4uLj4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTY2NjZ1p5vdntveHh2cG50d3BwdHBzb36Jc3qGhY2EenNtcoB6hn1vg5OBdnx9g4a13drb29vc29vc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29ra2tra2tvb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4N/f3+KgbWhma2ZVVlJHUFFOS0xMRUJIRUc9OD08Ojo3Nzg2Nzc2NTY3NDg+PD09Ojg6OD46Ozc4Nzc6Oj5DRDtDQj49OD1AQUM/Pjw+RTw+PUJNUF/S4+Hi4uLj4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk2NjY3MB2doCCfnp4eHBsdXlya399bHNvdGdoaYB/aWl4c2d+iYl4cIKGe3d9foWKvd3b3Nzc3Nzc3Nzc3Nzc3Nzc3d3c3Nzc3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODflGttZm5mU1NJUFlUTEhGTkZGRUJGPTs+PDs5Nzc4NTc5NjQ1NzU4PDs9Pjo6OztAOTs7ODc6OTlAQkE8QUE/Pzk/QEJFQ0FAQEM7Oz1ES01g1uTi4uLi4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk5NnZ2tmYc3uqhJaCcnR1dn14aGx8d2h4d25rcHR5gIJ3dHyBhIJ9c3CAin94gn95g8je3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f4N/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh24tubWdzY1lRTVVbV0hDSUZOS0dCRD8/Qjo7OjY2NzU2NzY0ODc2Ozw7Pj86PDk8Qjg3OTo6Ojk6QUFCQUJDQEE+PT9CQ0NEQUJGOTg9REpOYtjk4uLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXZ2drcqHGCtXiRfnNsem6EgXaCfWtoan+DeHZ8dX2FhXRmcHl9d316gIqFe318foC03tzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3dzc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3Nzd3d3d3d3d3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e397e3t7e39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4ODg4ODg4tiFb3FrdWFWT1VVXE9ETUY+SkdKRUQ8P0I6PDk4Njg0NTY3NDc2NDk7Ozw7OD47PEE4ODo9OD04Oj09QEBAP0FCP0A+QENCQ0FBRTc2O0RMTmPa5OLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXl29ra3Z5sbnNxhY1ybXBuf391hH5rcnZ2enN4gXhzb3VwbWt2fHmFiIB/f392coODsd/c3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eDg4eHh4eHh4eHh4OLXhW1xb3ZeUldTWlpRSkhDQFFAQkQ8OT9BOjw5NzU3NDU2NjQ3NTY9PDo9PTk+OjxAODo6PDY7OTs+PUJCQjtBQkBDQEBEREM8PUA3OjxFS01l3OPi4uPj4+Pj5OTk5OTk5OTk5OTk5OXl5eXl5dPOxsB+cWxveHt2b3VuanNzbZKGeG50dG5vdIZ/b2twboJ0bXZyfY2DdnF/d3mKgabf3Nzc3d3d3d3d3d3e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3dzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t/f3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi1oZucG1xYFJZUFdfWUpMTElSP0Q9OTtCRjs6OTc0NTY1NzU0NjY2Pj07Pz45PTk7Pjg9Ozo0ODtAQENCQ0FCRkE/Q0BBQkREOz0+OTs8QkxNZODl4+Pk5OTj4+Tk5OTk5OTk5OTk5eXl5eXl5eW5t7Woc3JscHd6dHd4bXFydXd/hHRyc2xsa3F8bnBudGuBf3GAd32Eg355gHNygYqg2d3c3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh49WHcWxqbF5YWlVXYFZWUE9QTD1BOjs8RkE4Ojg3MzY1Njk2NTg1Nz89Oz8+OT04Ozw5PTs7NTo9Q0JCPENDREREQUE/PkJDQzw9Pjg5PENLS2PN0dnh1sjY4+Tk5OTk5OTk5OTk5eXl5eXl5eXltbW2q3J5cm59f3Z1d2hqaGlwb3Zta2tnZWZxdG15gG5teXd2iHhxa2podXV5dHV/wd/c3d3d3d3d3d3e3t7e3d3d3d7d3d3d3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHi4uHh4ePVhnFwY2lhV1NZV19MUk9STUtAPjg5O0E+ODc5NjQ3Njc6NjY2NDk+Pzo8Pzo/OTo6Nzo9PDk5PEFBPTtBQ0VDRkA+Pj5BRUQ+QEE3OD5GSEpesrW4wbm1u8jg5eXl5OTl5OXl5+fn5+fm5ebm5ra2tbWOfX5weoR1cnZnYmNlbGtyb2ZpbHZtd4Z9hXlsbHd4a3ZwfH14c3V5fHd2h7ng3d3d3d3d3d7e3t7e3t7d3t7e3t7d3d3d3d3d3t7e3t7d3t7e3t7e3t3d3d3d3d3d3d7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4eHj1Yd1bl5uY1pUU1hXS1NLSk1SR0E4Ozs+PDk4NzU2NTY2OTY4NjY5Pzw6PT07Pzo7Ozk8PDs5Oj4+Pjs8PUFEQkNBQEBBP0JDPDw9Nzs+REVKXrG1tLW2t7e2y9rJ3uXl3eDi3tXU1tPU4OPg39+2treuh3t/bnmNenJ1bWNobGxtaXR4enF5enqIh4N6aWh9cWRvcXyGgX55e318e4an2t7d3d3d3d7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4uHh49aGdmxhb19dV1lcWlJQSEpXTEVHPUA9Ozs9OTY0NjU1NTg2NzY3OD87OT09PDw5OTw6Pjw6OTg+Qjs7Pj5AREBDRUFAQD0/QDw9PTU5PEJHRl2xtbW2uLm5ubq9uMPT0r3BwcC6u7y6u8TMxb/Dt7e3hGl1gX1ndYd5Z3Vxa2t5eHB3fH15bWl3e3h3bml1j4FwbHl4d3d9gXuGgnmAoNze3d3d3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODh4OHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4ePXhXJrZ3RhW1hYX15TVVVRVUpMRj9JRDs5PTY2NDc3NTc4Nzc3ODk8PDo+PDg8Oj0+OTs8OTs5P0E8PT9DP0FARUJCQTw9Q0A6Pjw1NDlER0dasbW1tre5ubm5ubm3ubm4uLm5urq6urm5urm6u7e3uX9ucHN6b3B/eXNuc3Vsc3Z4cXFwb2tvcX6Bc2mHhIF9dHOHdW11hYmBgHJ2hafd3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uHj14lxa2xyW1dXXWBUUVVUUFJPSkNATUE9Ozk2NTM0NjQ2ODc3Nzk6Pjs8Pjs5PDo8PDk8PTw7PT0+PUNEREBDQkE/QD48PkE8OD06NjY6QkpIWLG1tLa2uLm5uLi5uLe3uLi5urq5ubi4uLi6uru3uKx7cnhxf3ZzfnBsbXpyZ29sbW50cHt3d3Jyd3pvhpJ2f3x8enZ5fH9zfYdyda3T393d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4eHh4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi49eHb2pxalVWV2FbT1FSUE5XSURESUo/Ojk6NzUzNDk1NzY2Nzg4Ojw7PD46PDo6PTw5PDw9Oz09PDs9REdEQ0E8PDw8Pj5AOzg8ODE1OkFGRVautbW1tre4uLm4uLi4uLe4ubq5uLi3t7i4ubq7t7mqcnB4d3x7e4J3aG5xam9qY2lyf21zcn54dHFsanaAeX2AgH91doB1a4qLgHaR1d/d3d7e39/f3t/f3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f4N/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLi4uPYhm1sdGVWUFxnWE1YU1JRWUVDS1BOOzk4ODc1NTM5NTY2NzY4Nzk+OT0+OTw5OTw7Njg5OTo8QEA9PkBGQEJCQDo+PEE9Pzs7OzYxNjxCR0RQqLa1tba2tre4t7i4uLi4uLm6ubi4t7e3t7e5ure2tIlyd3h9iXxwem99c2hqbGdnbHRscXd0cWx2c3Fxd3FyfHl4g3Z7d2mLkYp9kM7f3d7e3tvY2drZ297f39/e3+De39/f3Nvc3N3e3uDg3+Dg4ODf3t7e39jS397f397e3t/f3t7f3t/f3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLi4eLi4uLi4uLi4uLi4uLj4+Lj4+Li4uPj4+Pi4uLi4+Lk14NoZ3VkVlVkZVdKWllXW1Q9RU1LSD04NzU3NjQzOTQ0Nzc1Njc5PTo9Pjw9PDk7PDk5Oj45PD4/PkFBQ0FFRUQ+OzxBPjw5PDs3Mzc+REhFSqG2tbW1tbW2tre4uLi4t7e4uLi3tra2tra3uLm2traLfXpsbHp/cGx5dm5qaGdlcXp4b2lvb3B1c21zd4Fnb32CgYNyf3lqcHJ6f6ng393Zy8a/vL2/vsLN0tDW3tnc4NfQzcPCw8PH1dfT2dzX1NjX0MfExce9vM/Kz87Y3djO3N3c2t3T0dze39/e397e3t7e4N/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eLi4uLi4uLf4uPi4eLg4d7W29/Sw8rJx9Hb3OLk4eHg2dre1sbExcTN2trf5OHi4trX3st9aWZxYVleZWFNTFRLUlpMO0hNSEZBPTc2NjUzNDY2NDg3NjU2OTw7Pj46Pjk5PDk3OTs7Oj49PEBAQ0RCR0ZCQT08Q0A9OTw7Nzc3P0RGRkaZtrS1tbW2tra4uLi4uLi3uLi3s7W2t7a3t7i5tba3opdxb29waW50dnFmZWNrbmdvcm1mZ2tygWVvdnyAeGRzj39zaHFyaWVlbm+w39HFv7u5ubm5ubq6uru6vc3Gw8e/urq6uru7u8HCvcHFvby/vry7urq5ubq6ubm6w8XDucDDwby/ube/z8/U3tjc3t/g3tLa4N/f4ODg39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eDg4ODg4ODg4ODh4eHh4uLi4eDh4uLi4uHa2t3RwsPCu8XT1uDdydPDrrnAsaqrq6uwtLbJ0sXRxLG4v7Srq6usr7S0vMzE1c60tLureGxtbWBdYl9ZS1NVVFFQREBRTUhEPzo3ODU3MzE1NjQ5ODQ2Njo8Oz08ODw5Njo6ODg5NzU8PDw/QEFAQkRDQkE8PkI/Pz09PTc1OD5DRUNAj7a0tLW1t7i4uLi4uLm5uLe1sautr7Oxs7OztLS0tqaei2tue3ZxeXhnY2hfcXdha25vaG99b25ja2lseHdsa4Z+bHB6dm1scG95sca8uru7urm5ubq6urq6urq6urq6urq6urq7u7q7u7y7urq6ubq7u7q6urq6urq6ubi3t7i4t7e2tbW1tbi3u8e+w8XHzcS4wMnH0tzZ2d/e3uDf39/f4ODh4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh3Nji4uLi4eHh4OHg3tfGxtHQztTe3tPO0t/SuLi8sq2trKysrrG+ua63rKipqamqq6urqqqqq6ysuKyqqqqrq6urra6urq6urryzrayrpHlub21fXl1dVE1SU1xUSkE/UElIPjg5NjgzNzMwNTczNzg1NzY2Ojw/PDg5Ozo6Ojg5OjY1OTs8Pj9EP0NFQkNCP0BAQT9APjw3ODc6QUVEP4W4tLS1tbe4uLm5uLi3t7SurKuqqq2urq6vsLGzs7WjcG5ucm1wg311aWFlaGZkY2Rxc21td25naW1tZXBzb29zcXN8h4F6dX11n7u6uru7urm5ubm6urq6urq6ubq6urq5uLm5ubm6urq6u7q5ubm5ubq6ubm6ubm4uLi3t7e4uLe3t7a2tbW2tra1tbW1tba1t7e3t7rBvrzGycrb3+Dg3tvd3d7h4tDW4uHg4ODg4ODg4ODg4ODg4OHg4OHi0768zNjd3OLg0dnbxL23sLCxsa+zu7uzsLS9s66urq2tra2sq6qqqqmpqKmpqampqqurqqqqqamoqampqampqaqqqqytrq6urq6urq6sraR4aWJxZmFZWlZRUk5cU0Y9QlJEQTc8OzY5NTY1NDU2NTg3NTY1Nzg7Pjw7OTk5Ojg3Nzk3Njg8Oz47RD8/Q0BBREE+P0M9Pjw+Ojo3Nz9DRj54srCztLW2t7i3trKurq2sq6uqqaqtraysrq+xs7S1t4xucnRqaIB5ZmpmZWxdaG5waGxxYmNmcoJ+dmhobGpueoaBhXx4cXF5gK+6ubq6urm5uLm5ubm5ubm5ubm5ubm4uLe3t7e3uLm5ubm5uLe3t7i5ubi4uLi3t7a2tre3t7e3tra2trW0tLW1tbW2trW1tre3t7e3t7e3tre4v8bP0MS+v8DE19e8ydra4OHg4ODh4eDg4ODh4eDb3t7Uzby3tre6wMDJxLfIvrKwsLCwr7Cvrq6ur7Cwr66urq6uraytrKurq6qpqampqampqampqKmpqKmpqampqKmpqKmpqqqrraytra2ur66trK2heWpjbWdiXFhRUFFLVEpCOklRP0E3PDk0OjU2NTQ1NTY4ODY4Njs6OTw9PTs6ODY2ODg6ODY3Pj09PT5BQUVCQkNBQUBBOj09Pz05Ojc9QUc8bKqmqKutsLGwrqupqKqrq6mpqamrrKytra2usLO0tbilgIdvaWdzdGZrcG1qZGxvcm5rbWNrcHyJhG5qbHx4Y3uKfnNqc25rcY+7ubm5ubm5ubi4ubm5ubm5ubq5uLi3t7e3t7e3t7i5ubi4uLe2tra3t7e3t7a2t7a2tra3tra2tbW1tba1tLS0tbW1tra2tra3t7e3t7i4uLe2t7a2uLm4uLe3uL6+uLq9vcfb4OHg2Nnd4eHg3dfKwcPCurm5uLe4uLi3tbS0tLKysbGxsLCvr6+vr6+vr6+vr66ura2srKyrq6yqqqmoqKmppqepqaehpaipqamoop+hoZyip6inqausrK2ur7Cwrq2unXdwbGphY2BZUU1RTFJGQzlNUEU+ODs3Mjc5Njc0NDM1ODg3OTc7OTo9PTw6Ojk3NDo5ODY1OD8/QEI9RENDQ0FDQEJBQDtAP0A/PDw6O0NIPWOopaWlpqioqKenp6ipqqmoqKipqqqsra6wsLCztLW1taWYdn5xZmt4cW9tZmVsaGNsZ2ZpaX11bWlvfXZ5hWZod294b3Fvcninu7m5ubm5ubm4uLm6ubm5ubm5ubi3t7W1tba2tre3t7e3t7a2tba2tre2tbW1tra3t7e2tbS0tLS0tLS1tLS0tLW1tba2tra2t7e3t7e3t7a2tre2tre3uLe2t7i4t7i4uLi4wMXTyry8w83PyMC9urm5ubq6ubi4uLi4t7W0tLSzs7KysrGwr6+vr66urq+vr6+uraysrKurrKysq6ehoJ6gn5udoaGdlpmkpKaon5mZmZmanZ+gn56fpKqtrq+ura2srJl1cGlrY2FeXVVOU0tSREQ4TktHQTo4NTI2OTY1NDczNzc3ODk3OTo7PT0+ODg4NzU6OTk1OD9AQEFEPkZBQkNAQkNCQT88QEJCQD0+OjpERj5cpqWmpqampqanqKenqKioqKenqaurrKytra2ttLS0tbekc311bnONf3JmanFjaW1jaGZobG51aV9jZ3VzdnpuZ3Bwcn56cYihu7m5ubm6urq6urm2s7a1uLm2trW1tra1tbW1tbW3tra3tra2tbW2tbW1tbS0tLa2t7e3tbS0s7O0tLW1tLS0tbW1tra2tra2t7e3uLe3tra2trW2tbW2tra2tra2tra3tra3uLi3uri4uLi3uLi5ubm5urq6urm4t7e3t7W1tLS0s7OysrKxsbCwr66urq6urq+vra2srKuppaSmpqScmZubmpmampmXl5eXl5aZm5iZmJmZm52en5+dnJ6gpKWko6OioqKQdG5jcGFeXltUU1RIVEo/PFFCRkM7ODYzNzo1NTQ4Mzg5OTc4OTc7OTs9Ozc6NzU2OTk4NTg+Pz9ART5CPz9DPzxBQUI/PT9EQT8+PTk9Q0Y/VaSlpqanqKeoqamop6ioqKioqKiqrKuqqaipq7W1tba5o3eKcXKHhnd0cGh5a2JjYWVsaW5zal9jZWNjZWprYmRqbHaXjX6ovbm3tre5u7u6uLWxrKurqq6wrKyrq62tq6uvsLGvr7CytbW2t7W1trW1tbW1tbW2trSvr7O0tLSvra6vsrW0tbW1tbW2t7e3t7e3t7e3t7e3t7Owsra1tLa2tre3tra2tbW1tra3t7e5uLi4t7e3uLi4ubq6urq5uLi3t7e1tbS0tLS0tLS0s7OysbCvr6+vr66vr62oo6KgnJqampqZmZqbm5qampqbmpmZmZiXl5aYmZmZmpycnZ+foJ+goKChoaCgoJ+fi3RuaXRdYGZeUlRLRFRJPUVTSEVCOzo0NDY5NDQ1NzM4ODg3ODk5Ojs7Pz04OjkzNTg5NjM5PT5AP0A6QEJCQkA/QEJCPz0+QUFCPz06PkVDQFGjpqWlp6inqauqqKaoqKipp6ioqKinp6ioqaq1tbe3t7KZtH99kIx1Z2lqbGZjYGNoZW94cGlicXx5cGpmZmRma3NqhYystrKwra2ttLeysLCtrKuqqaiop6ipqampqKinqKipqaeoqqurra2sqqytraysrq6traunpaSnqqyopKOkpamwsbGztbW2t7i3t7W1tre4t7e3t7Kppaasq6ivtLa1s7W3t7a1tbW2tra3t7e3t7a2t7e3t7m6urq5uLi3t7Wxs7S0tLKxsK6sq6yurrCxsK2rqqmqqKijnJqZmJmYmJiYmZmZmZmZmpqZm5ubnJybmZeYmpqcnJydnJ2foKGhoqKioKGgoKCfnop1amtuWVxhVktPREdVRz5PV0hEPTw4MzQ0ODQ1NDgyODk4ODk6Ojw5OUA8Njk6MzY3OTE0PD8/QEBBOkNGRUJBREJDQTo7P0FCQz9APUBEQ0BPo6empaemqKqqqqakpqenqKioqKimpqaoq6uttba3t7e4rbJ1cHuDdmBiaWtiZWZhZGdmfYh5bHKAfXFvcXhjbW5xZo+srKurq6ysra6urK2trKyqp6WmpaWlpqioqKiopaeoqKioqKeoqampp6Wko6KioqOioKKioaKhoKChoaKjpKOjpaWlqLC0s7OzsKuqqaqztLa3trGopaOioaGipKiqqairs7Sxrq6xs7W2tra3uLi3t7e3t7e3t7a2uLe0sa6ppqerrKmnpqWkpKSkpKWnqaajoJ+enZycm5uampmZmJeXmZmZmJiZmpqampqampqbm5mYmpydnZ2dnZucoKGgoaOjoqCgoKCfnp2FdGtsaFdYU0pHTUVITUdAU1dGRz09OTM2Mzc0NTU3Mzg6Ojo6OTw9OjpBPDY9ODM3ODgzNztAPz9AQDpCRUNAQkRDQT87PEBDQkNBQDxBQ0A9TqKnpqanp6mqq6mkpaWlpaaoqKippqanqKmpqrW2tre3t7izc2h7c2JnamtpaWJhZGloXV1tfHJma3J/fHR8bm1zc36gqamrq6uqq62trKusq6mpqKWjpKampqWmp6eqqaamp6enqKinp6iop6WjpKKhoaGhn56en5+fn56foKGho6Wko6OkpKSmp6enpqWkpaampqeqraumpKKhoaChpKWlpaenpaeoqKalpaivtLa3trW1tra1tbOwrKupqa6rqKWlpqampaSkpaWlpqWkpKSkpaKhoaGgnp2bm5ucm5qamZiXmJiYmJiZmpmZmZmYmZmZmZqZmZydnJycnJybnJ+fn6ChoaKgoKCfnZ2cgHNrbmReU0pITUZETEtFRFFTQ0c9PDgzNjI4NDY0NjQ4OTg6Ozk7Pjw5PTs5PTczNTk2NTY8QD0/QD88P0JDPkJCQj89Pj5CQ0FFQD86PkVAO0+jpqWkpqeoqaelpKWlpKWnp6eoqKanp6alpqa1tba2trW2uYptcW1vfHxxZ2pmYGFsYFROW2hqbm9tgYJ9cWdxdn6aqKeoqqmpqqurrKqqqqimpaWkoqOlpqalpaWmqaqppqWjpKWmpqSjo6KioqKhoJ+fnp6cnJycnJ2dnJ2en6CioaKjo6KhoqKkpaSioqOjpKSjpKSko6Ggn6GipKanp6ipqaelpaSipKSlqK2wsKyrqqusqqmnpaWmpaWlpaalpqioqailpaWkpKSlpKOjpKOioaGhoqKgnp2cnJubm5qZmJiYmJmam5mXl5eWlpeXmJiZmpqcm5qampubm5ucnJ6goKGgnp6enpycm356bnJiXlNNSlBFRk5NQkBPRT5JOz01MzYzODM2Njc1Ojs4OTs5Oj49Ozo5OT03NjY5NjU2PkI+PkE/PT5DQT5DQ0BAO0BAQkJCRUA+Oz5FPzxQoKSjpKOjo6SkoqSlpaSlpqamp6empqalpqaltLW1tbS0tbiBaHx9ZXOCemxwdWFfY1ROT1FbaGxpbGxxbW5xbnScoqSnqKioqauqqqqqqaempaSjo6OjpKSlpqalp6ytqaShnp2eo6Shnp6foKCenJ6dnJycmpqam5ucnJubm5ydnp6foKChoJ+goaOioKGjpKSjoqSlpaWkop+go6SkpKapqainpaGdnJ+jpaipqainqKioqaempaWkpKSlpqampqampqenpaWko6Ojo6KioqGhoqKhoqOkop+enZ2cmpubmpqZmJeXmJaWlZSUlJWVl5iYmpubnJuampqam5ucm5ucnp+fnpucnJyam5p/fnF0YFtUTUdNSEZMSj8/TkM8QDs8NDM4Mzc0NzY3ODs9ODo6OTk7PTs7ODk9Nzc4OTU4OD9APT9BPjs9RD89REA/PzpAQUE/QUVAPjw8Qz88Tp2ioaKioKCipaSkpKWlpqenp6empqampaampbW1tbS0tLS3jHalsXdmc3Jvc2xjZGlYT1JRT09dgG1kYFptkZGSoqKjpaampqenqKiop6alpaSjoqGhoaKjpaempqesrKemoJ2cm6Ghnpuamp2cmZiam5qampmZmZubm5uampqampucnZ6goaCfnp+hoJ6foqOko6Omp6inqKWioKGhoaGkpaWlpKCcmZmbnqOmpqampqanpqempaOlpKWlpqiop6enpaWlpaWkpKOjo6KhoqKioqKhoaKjo6Kgn56enZybnJubmZaUlJSTk5OTk5SUlJWWl5qam5ubm5qZmZqanJ2dnZ2dnZuampqamZqXf3dvc11aTkhKTkdFRklERU5APD09PDQ1OzQ2NDY1Njc5Ozg5OTg5OTw7PDc6Ozc4ODg1ODg/Qj9BQTw+P0A8PEJAQT49QT4/Pz1CQUA6OkA8PE+doqGfoJ+dn6OkpKSlpqeoqKenp6ampqampqW1tLS0tLS0tbSXtqd1Znh2Y2xjY2VjW1JTU1JNXqCMeFhodpajnp6hoaOjo6OjpKSlpqalpKSioaGko6OjoqOlpqWmpqenpp+bmpuioJmWlpWam5qXl5iZmpqYmJqampqbm5qZmZmenZ2goqOjo6KkpKWinqGhoaKjpaampaSjoaCgn5+hoZ+goJ2amJeZmpygpKOjpKWmp6alpaOjpKSkpKWnp6ampqampaWmpKOjo6SjoqKjpKGfoKGhoKGgoaCfn56dnZyamJeVk5KSkpKSkpOTkpOUlZaZmpqbm5qampqbnZ6enp2cnJybm5qamZmZlH10bHReWk9IRUdGQkVORT9GOzo+Pzs0Njo2OTM2NDY4ODo4OTc4ODo8Ozw5Ozs6OjY3ODk5Pj9APjw9QD5AOjlAQT89QT8/QUE+QUE/Ojk9PjpQnaCfnZucnJufoqOlpaWlp6iop6ampqanpqantLS0tLOysrGwsK2rkHiGj36bmn93Yl1TUlFRTGKgootaiKCgn52YmZycnZ2eoaGgpKenpqWkoqGjp6alpaKipaampaanpqagm5mboaCXk5OSl5qcmpeXl5ibmpmampqam5qYmJmaoKCgoKGfoaKipKamop6gn5+goaOko6Khn56enpyanZuZmpqZmJeZnqChoaKioqKkpaWmpKSkpKKioqKkpaWlpaWlpaalpaOko6KioqGgoKGgnp+fn5+fnp+foJ+cm5qZl5WUlJSTkZCRkpKSkpKSk5SVl5iZmpmZmpqam5+fnp2cnJycmpmZmpiXl5F8cmdxXl1QRj9BRD9KT0JCRjhDRT4+OTg7Nzc0ODQ1OTo6Ozk3OTo8Ozo8PT48PDo2NzY5OD4/QT47Pz49PDg6PkFAQUE/P0FCQERBPjo4PkE8U5ycm5uampycnaGio6KjoqSmp6alpaampqSjo7KysK2rp6amp6alpqiln6iop6qnoXmEXFFST0xcnKCAYpmgnp2clZOVlpeZmp2dnqGmpqampKOioqanp6ajpaampaWmp6amop2cnqGfl5GRkJSXmp2YlpeWmJuZmpqampqZl5iam6Ghn56fnpybnJ6goJ6dn56fn6Cio6SjoqCfnp2ZlpeXl5iYmZubnqKioqKioqGio6WlpKOio6SioaGhoqOkpKSko6SkpKSioqKhoqGgn5+gnp2enp2dnZ2dnp6em5mYl5WTk5SUk5KQj5GSkZKSkZKTlJaXl5iYmZqampyenZ2dnJubmpiYmpmXlZaNempmamBiTkY+P0A9SkVAQ0A7QEE8Ozs5Ojc2NTg0Njc4OT04ODs6Oz87Ojs8Ojk6Nzc2ODs8Oz08Ojo8PTw3Oz5DQkRDPz1BQ0FEQT88OkBCO1eZmJqamZmam5ucnp2foqKhoqSlpKSlpqSioJ6op6alpqWlpaemp6ampqakpaanqKehqXJOUU1KVJahenKanJyenJeVlJWWmJiXl5qeoqKhoqOkpKOjpaalpaanpqSlpqalpaOgoKGhn5mSkI+WmpmenJaXl5eZm5ycnJqamZeZm5uen52cnZyZmZqcnZydnp6fn5+hoaCgoaKgn56bl5WVlZeanZ6fn6GhoqKio6OhoaCgoJ2cnaGioqOkpKOioaSlpKOko6SjoqKioqKhoKGfn52cnZ2cnJ2dnJ2enpqXlpaVlJOTkpKSkpCRkpKSkpGSlJWWl5iYmJiam5ycnJycnJ2cm5mYmZiWlJWXi3hsY2RiZFFHQT1DO0tIRDo7Ozw+OTo6OTo3Mzc5NTo4ODg8OTg7OT09Ozo7Ojk8PDc2NDc/PDo9Ozw/Pjw7ODxBQ0FDQkI+P0NAQkFAOj9APztZmZiampqam5ubm5ydoKGhoaGhoqKioqKhn5+dpKWmpqenpaWmp6ampqWkpKalpKSkpaaGUFJQT0+PmHB6mpubnJ6cnJycm5ubmZiYm56dnp6foKOkoqGhoqKio6SkpaalpKOjoaGhnpyalZOUmJuam56amJiYmJqcnpyam5iWmZybnJycnJydmpqbnJ2dnp6dnp6fn52cnJyhoaCblpWVlZacoKGgn5+hoKKjoqOhnZuZlpaWlpicnqCip6ikoaCgoqOjoqKioKCgoJ+fn5+gnp2cm5ucnZydnJmanJuWk5KSkpKUk5KSkpKSkpOSkpKRkpSVlpeYmJiYmZqcm5qbm5ucnJqZmJiXlZWWl4d3ZGdoZGJNQ0U8RDlJSkU5Ojs9PTo6ODg6NjQ3OTU8OTY4OTc5PDs7PDo6PDs6PDw4Nzg3Pj07Pj46Qj86Ojo/QURCQ0FBQD9EQUFAPjpAPj06W5qYmZqbmpubm5uen6CgoaKioKCgn5+enp2dnKWkpaanpqWlpqakoqKio6Oko6Kjo6KnllRYVVJOZ21rgZ6am5udn6Cgn56enp6dnJ2dnJ6enp+goaCfn6CgoKGio6Ojo6OkoqGgnpuZmZiZmZmZmZienpiYmZmam5qWlZeWlZicnJ2cm52dnpybnJ2cnZ6bmJqeoaGdm5udoKKhmpWVlpaZoKKgnZueoKGjop+em5eXlJKSlJeYmZ2goqenpaGgn56goaGioaCfnp2cnJubnJubmpqZmpydnJmXmZaVk5GQkJCPkZKSkpKSkZKTk5OTk5OTlJWWlpeXl5manJubnJucnJqamZeXlpaVlZSEcmZsYmRbREJMPT84RktCPEA+Pj05Ozk6PTg1ODg2Ozg1Njo4PDw7Ozw8Ozk8Oj09OTU4Nzw5PD88OkE/Ojo6QEBDQkRBQ0A/Q0FAPj08QD09Ol+al5mamJeYmpycn5+foaGhoJ+fn56foKCenZ2lpKSko6OioqOjoZ+foaGipKOio6SiradXXl1UV19ua42dmpqbnJ6dm5ucnZ+enZycnJydnZ+goKChoaGgoKGgoKGioaGhoZ+enJuampqbnJqZmpuZnJ6ZlpaWl5eTjo6QlJabnJuam5udn52cnJycnJ6dlpSZnJ+in5ycnZ+hoJuXl5mZmpycnJubnZ6fnZqXlpaWlJOTlJiampqfoKGmpqWgn56fnqChoaCenJubnJybm5ybm5qZmJmZmZmXl5iVlJKQkJCQj5CSkpKSkZGTk5aYl5STkpSVlJWWlZaZmZmam52cnJyampmXlpaWlpaQgG9vZV5gV0BKSDg/N0lFP0VBPD07Ojo8Ozs3NTs4Njs3NDY6Oj47Oj0+Pj07Ozs+Ozo4Ojk5NkBBPTo8PTo6OT9BQ0JERUM+P0FBPz8+Pj89PDtgl5WXl5aVl5mbnqGhoKGioqCenp6enqCgn52bpaWkpKSioKCfoJ+dnZ+hoqOjo6OkobCjXWVkYGFua4GenJubm5ubmZianJ2enJubm5ycnJ6ipKGeoKGhoqKhoKCgoaGgn5+enJqZmpubm5ybmp2dm5manJiXlZWWkY6Nj5KYnZycm5ycnqCdnJucnJyempWVm56foZ+dnJyenp2cmpqampqampqbm5qXl5aTkpWVlpWTlZaam5qanZ6foqWjnp6fn5+en5+enZ6fnZycm5qcmpqbmpiZmJiYmJiYlZSTkZCRkJCQkZKTk5CRk5SYmZiVk5SVlZWWlZaXmZmXmZqenpyamJiXl5aWl5eYjX1ubV9lVlRFSzw3PjdSRUM+QkE4Ozw7OTg6ODY7Nzc6Njc5Oj0+Ojw8PT49PD06Pz06ODw9OTtAPj4/PT45ODs/QkNAQ0VDPT9DQj5AQD5APTw8YZWSlJWWlpeanJ6goKCgoaCgnp6enp6gn56em6WlpKSioJ+fnp2dm5mbnJydnp+gn56rmGNpbW5pZm2enZybm5ybmpmZmZqam5ucm5uam5ygo6SgnZ6en6CgoKCgn6ChoKCfnpuamZqam5qbm5ufnpyZmJqamJiYmJKOj5OXnJ2bnJ2cnJycnZycnp6dnpqVl5ygoaGfnp2eoJ+cnJuampqbmpqYmpmVk5OTkpOWl5eVlJiYmZucnJydoJ+gnp6enp+fn56en6KjpKKgnp6cm5qampuZmJmZmJeXlpWUlJORkZCQkZKTk5OSkpOUmJmYlpWUlZaWlpaWl5iYmJiXmZqamZeXl5aXlpeWl4l4dmddX1dURUU5OTs8WT5AOEI/OTw8Pjk4Ozg6Ozc5OjU4OTs9PDk9Oz0+PD0+Oz8/Ozk+PDw+Pz5AQUE9ODc7QkNFP0FFQz1AREJBQEQ7Oz47PGKWk5SUlpWUlpiYmZubnJycnZ2cnJ2en56dnJqkpKSkoJ+enpybm5qZmJiYmZucnZ6cpolla3R4bVuFop2dnJydnJqbmpqampydnZ2bmpuboKKinpucnZybnJ2enp2dnZ2fnpuampucnZybm5ycnp6cm5qanZqam5yVkZOXm52dnJ2fnZycnJycnZ6fnp+cl5idn6GhoJ6cn6CfnJubm5qbmpmZmZmZl5WWlZaYl5eXlpaYmZuenp2dn6GhoJ+fnp6fn5+dn5+hoqKhoZ+fn5yZm5qcnZuampmXlpaYl5eXlpWTkpGTlJSTlJSUlJaZmJaVlZeZmJeYl5eXl5eYl5iXl5eXlpaYl5eVl5eDeHZfW11eUT1GOjk4P1VDQTtDQzo8Pz86Ojk3Ozg4ODc0ODk8Ozw4Ozs8PTo9Pjo/QT06PTw+PkA/PUBBPjk2PERDRUBBRUU9PkVERD9COzo8OTpkl5SVlZaUlJSUlJWXmJiamZqcnJydnp6dnZybo6Oko6CenJuamZqZmJiYmZiam5ubm6WJa3F2em9lmp+enp2dnJybnZ6dnJ2enp2dnJydm5ygoJuampubmpudnJqampucnJuamZycnJ2dnZ2dnZ2dnpybmp+fm5ydm5mZmZudnZ2dn52dn5+dnJydn5+fn5uanZ+goJ+dnJ6gnpubm5ubm5yampuamZudnJqZmJeYmJiYmp2foKCgoJ+hoaGgoJ+en5+fnp6foaKhoJ+enp+enJqam5ubmpqZlpaXmZmYmJiWlJOUlJWVk5OVlZSVlpWVlZSYmZuamZaWl5WWmJiWl5OUlJGRk4yRkJOWfXhqYWJiXFA8QDw2OENWSERCOjg7Oj47Nzc5Nj06OTk2NDc6Ozw9OTo6Oz87PT08QD47Oz46PT89PkBBP0A8NztBQ0U/P0REPj9EREM+Qj07PDs6Z5aTk5OTk5OTlJSVlpeWl5aWl5mbm5ybm5uamaOjoqCfnpuamJeYl5eXmJmYmZybm5qkgGpqb3lzcZegnp2dnJydnp6enp+enp2cnJydnp2bnJuampqam5ubmZiYmpqamZmZmZqdm5ydnZ2dnJ2cnZ2cm5qdn5ucnJubnJubnZ2dnJydnp2enZydnZ2cnJ2dm5uenp6dnZybnpubnJycnJydnJubmpmbmpmYmZmYmpmZmpyfn5+jpaKfoaKioaGfnqCgn5+fnqCioaGhn5+fn52ZmpudnZqZmJWWl5aVlZaTkpOUk5STkJCSk5GUkY+OkJGOlZabmJWYlJmXlJiRjJCPk5yTkoyFjIeDhndxZ2pkW1xRQT44NkJHYEJFR0A+Ozw7Ojg4NjU8ODo4MzQ6Njk9PTk5Ojs9Ozw6PD48Oj5AOj5APjw/QD8+PDg6Q0FEPz5CRD8+Q0VCPUJAPDw8OmeYk5KSk5OSk5SVlJWXl5aWlZaXmZmZmpqampqkoqCfn52bmpmYmJiXl5iZmJmcnZ2cqH1nZXN7enOJop+enp2dnp6enZ2enZ6enp2dnZ6cm5ybmpubm5ucm5iYmJmZmJiZmZibnZycnZ6enp6enp6dnZybm52bnJybnJ2dnZ2dnJ2dnp+fn52cnZ2dm5qbnJmZnJ2dnZ2dm5uanJ2dnJycnp2dnZybmZeVlZeXmJqam5ubnZ6foqOhoKGhnJucm5ubnZqcmZycn6CfnZiZmZmUkpKUl5SPj4+OkYyNiYuQi4mLjpGRj4mQmJiQkoyNi5KQj5iYoqiqpqWlrKOmoZqep6eyqKKVo6Cfl39wcWlsXFtcTUY8NzdHR1g+SE5URjk+Ojg5ODc1PTk4NzMzOTY6Pjw6Nzo8Ozo6Ojo8PDs/PjtAQD47PT5BPDw2N0A+QkA+QUY+PEFEQT1DQj49PDlmmJSTk5OTkpOUlZOVl5iYmJaXl5iZmZqampqaoqGfnp2cm5mYmJiYmJiYmZmZm5ybnKx/am16f3lxh6Genp2cnZ6enp6enp6dnp2dnZ6enJubnJubm5ubm5uZmJiYmJiYmJmZnJ2dnJyenp6enp+fnp6dnp6dnJydnJ2dnZ6fnZ2fn56goJ+enZ2dnZybnJ2em5qbm52enZ6dm5ubnJ2cnp2cnZqYl5SRjo+QkJGVmJSWlJiZmpudmJuYlY2Mjo6TkpKRj4mQjpGRjo+Ki42NjYiIi4+Lg42NkY+MkI2Qk5WVnJihoJySn6SipKmam5eanKOprb3Bwbq8uL26ucC8ubq3uru7tL2zwbV/bnVmZ1peWUxJRTo7TElTPFZSSUM6QTo7Ozc3NTo6OjgyNTY4Oz08OTk7Ozw5Nzo4Ojw6PT85PD8+PDw9QTs5NTg8O0A/QT9EPTxBQkA8REM9PT06YZOTkZCUlJOTk5OTlJeYlpeZmJmYmZqbmpqamp+gnp+fnJqZmpqampmYl5iZmZmZmZmphXB1e4B3b4mhnp6enp6fn56en56fn56dnp6fnp2dnJ2cm5ubm5ubmpiYmJiZmZiam52cnJ2dnp2dnp6goJ+enZ6hoJ6dnp2enZ6fn56en6CenZ6enJydnZ2cm5qYnJuVmJqamJiYmJmSjJCXlKCXk4+MjYqKiImMiJORh5CPjYqKkJCLjoqMi4+IiImJjpGOjYaFiYaKhoWLiI+SkJCNkJKXlpKamJ2TlJ6kpqaqq7Gsr6+rpquqsbm5tbS0rqyvtMDIxcXBvsbDxMTDurW+t7a0s7C2tb6qcHRyXGZfXl1JRj8/RUtMVklcTEQ/PUI6Qzk5Nzc7OTk3MTc5ODo+ODg6PDw7OTc5OTs9Oj4/OT5BPDs+PD46OTY5PDpBPkNBQT08QkBAPkJEPj8+OVyHhIOHi42KiYaFgYqMkZOVmJiHlZaWkpiampmenZ+gn52ampubm5ycm5iWmJmXl5ibqo56dXZ7f3mCoJ+fnp+goKCfn5+foKCfnp2dnp+enp2dnJqbm5ybm5uYmJiXl5iZm5ucnJydnp6enpybm52dnZycoaGfnZ6dnZ2dnp2dnJiWlpaYlZWSlpmWk5GKjI+PjI+NkIuLj4+WiYiEi5GZjn2Fi42PjYyHioyQm4yRj4+Lio6TjIyNjIiSi4yFiYyPhouIh42KhYyEj4qXkJOYmpWbnKOqoaKknKKrsbe0ubWxs62vsrKlp7O6sbq6vLa3tsDDw729vLa/urq8wbW4wL60r66mqa+3mm58Z1tjWl1fSEU+QUtJU1hZXkFGOTk9OkY/Pzo3Ozs7NjM6Nzo5Pjg6Ojw9OTk4Ozk7PDo+PTtAQDs8QjxAOjg0Nzw7Qj9BQj4+O0NEREBDQz0+PjlhmZWLkYWNj5aSiHl9e3+Fi4OKgoqJhmuAeJCLlpqRnZ2UlJGTlpeampiWk42Sk5KQm5uIdndzcX1/cpGgnZubm5yenZ2eoKGgm5uWlpucmpybnJuYmZqYmJmampqWi5CTlpmYlZiYlpucl5WSkY2SkZCUk5KXm5mYm5ePjpCLjo2Ch4uLi4qLiI2RjIeHhoqIiZGKh4yEhYqNi4qNhI+UkIyDkJOUmZWQi5OTkZWRlpWOj5GMlI2Oj4qIj4ePhoeJiYmNiomJioWNh46JmJKUmpuXmKChp6Cko5qqqbO2sbWwqKmiqK6tn6qvsK21ubi8wr/BxLixtbCutrOwuL68ury+urOzp7G3wpB1gGNiXlpXUk1IRkVQSVlXX1tDUDpCQz1HRj84Nzo6NzU1OTc8OTw5ODo9Pjo6Nzs7Pjs7PTs9P0E7Pz48Pzo4NDM3OkFBQEI+PjpDREM/QUM7PT45Z6mloqKZn6CippeUiI2CiIJ1h4iKiIp7e3Z7enmPeoiSfn18en6CkYWBgH1zfH99fISHfnRweHZzfHaBj4iIiYeIioyMkZicl4iOhIuNi4iNkI+Pi5GPi4yOj5CQjouFhYeLjIyHiIuOi4eMhYaBjYuGiop/iYqGiJiRiIOIg4KFfIuLjIaJi4iKkIyIi42PjI+Wh4mLio6NjY2Wk5OdnJyalpycm56bmpuYnZeTkZWWkJKRi4+LlpSMjYqDi4SEiYyQkIqOio2LipGJjZOTk5SVk5KcmZ6Xn6CfpaKvsamupKSfmKStpqa4t6ysu729wsPAv7+vpa2wsLS3uLO0uLa0ta6stK+4tLaBeXpjZmBeVlFRQUVMT0lcXl9UR0dCS0xCREA9ODg7OTU3Nzk3Ozc9PDk9Pj05Ozg6O0A8Oj06PkJBOD88Oj84NjQyOTtCQD9CPj04QEI/PkBEO0A+N2CloJqXnaGaoaCPl5efl5WCjaCfo6GdmpKOjIxycXBvdnFucG1ucHZub29waHBxcHR+c3FycXd7cnl2d3Jyd3Z6e3l8fXt/iIGEi3+PkYaNi4uGiouLiYaEgYaCgIKJkYOAg4x/ho+LiYWAh32AgZKQhoSEho2DhIyPj4+IjY+Hi4iRkJWRjpCKk5eOj5WYp6SfnZWYlpaln5udq6aqt7W4srGnr6qnpqGfmp2WkpWVkYqPjImTjZuVjYuLhoaJjJWQkJCLmZKVlZSbkJiTlIyNkYyWl5WilZ6mqauno6OqsJucpp+mq6G0vb6zs7+5u7u6uby9rqiusa6wuLyztLGxqrCpqLGxsqild3J0X2hhYFRWUUlKSFZNXl5eVExKRVFKRUdDPTo5OTc0ODY4Mzg4PTo9PD47OTs4Ojs/PDw+OT9DPzg7Ojg8Nzc2Mzc5RT4/Qz89N0BAQT0/RDw+PThUj4yGh4eUjJWZl5yWmZaNlZyWlZydoKCdmpiWeHFubXJ4cXFsbnJwa3FvcG1yc3t1dnd5fnVxeHZ0d3tybn98gX15eH1/eYOGg4WCg5CLkIuLi42Pi4mJhYKBfX9zfYiAfpyQhIWFiYuPinp9fYaOjYqGjZSSi5CXj5SXkpihlp6XlZunpp+goKawq6GjpbW0sqqmqq+isba5vcK7ucO+vLi9uLWxrLCspZuSk5mfm5SPk5WOmp2doJqfn5edo6qsoZ+em62hp6qwqaampJiRkZWUo6SirKSss7Szs6i3tru4sLKvra2yt7a6srW6s7e5u7i8urayr6yxsbKztLOxsa2us7Gzs6yhl3Zxc19jXlJRVE1PSUdYT1pcZFROR1VPRURKRD44Ojg3NTg4ODU5Nzo6PTw/Ojg8ODk5PTs9PTpCPj84Ozo5Ojk4NjI1N0I+P0RAQDY+P0I/PEM8PT46Tn98go6MjJOTl5eaj5SWjZaRkZSXk5qanqGdnHJvcnFxcXFxcG5zcW91dHJxdneAdXd8eYV+d3t8eX1/fICJiYmDfXp/h4GIiYGAgIGGiIKGi4aIhYSIiImEf4J/enx8fX6SkH+IeIGFi4qDhIWKj4yNkZmdlJSUoJqan6Ktsa2ppKWtr6ysrLWuvrmtrqm1sLexq7G2rK+9wsLAvrq8trKutraxtK66u7OurKepp6unoqmtoKmooq+wuLSxvLq6urK0ta+8tLezt7e7t7mtrbCprLW5sbeytLe2sLu7vLu6ury1vLi0wbWsqqqrtLG3uLm1trSzsKymrrCqq7Cxq6yusLKxtK6qo5N4dnJlZ1tMUlBFTUlTV1JlXmdUUExcUUhMUkNBOTk3OTU4ODY2Ozc5Ojs6Pjk4Ozo6Ojw8Pj08RD45Njs7ODg+OTUxNTZCRkREP0A3Pj5DPjpBP0BAO0t/gomXmJSdlpabmIuSlo6XkZGVl5SZl5+bmZx8dHV2dXl1c3RudnJzdHV2d319gX56gXyDfoJ/fYB/hIKFj52RiYF/go+Xjo6HgoCBiIuFfomQi3+HjYyLioeSioeGjZGTkZGEh319g4iMjouOiomQj46PlJSYkJWcmp2eqK6yr6+1tLOtsrW4sLy1tbGqsKqztbS7t7SztrS1r7i4t62noqassLCvtre3vrW5vLOysa61u7C0r6+yu7axuMC9tLS0s7izvLq2tLrAvbm6ubq+ubm5vrWysa+yr6q1tLGzsbSzrri4tb+vpKaoo6ussa+zrq6wsKytq6qroqKmqKKnrauqpaynoqeYeHlxZmVZT09NSVJNV0xPX15cTlVVYlFEVE07Pzk8ODk1Nzc1Nzk1Ojo6OTs4Ojw8Oj08Pj4/P0I9ODY6Ojk6QDs1MjY2QUZDQz4/Nz49Q0I5P0I/PjtLjpGTmJmVmZGTopiTkpKLk4uOkI+Vl5ablZSbhoJ9enh2dHRzdH53end2gIKDhouMhISFioaQiYeRk5aRjZaalY+IjI+emJaVkpCTl5qamJCdoJ2Tl5qgmZ2boqGVkJugpKOak42IiIuJkZGOko6LmJqPj4yUmpecnZugnaSstLm6vK+2tLi0tLK3uLmzq6+qqKy1srK1rrGrrqa3s7OxpaGotbCvrayrtbqyu7q6tLK3ur67ubG4sLmtqLK4u66ttLS3tbu2trm5vLe0r7G0t7a5s7e1pq2pq6ior6yprq2up6KxtLG0q6aop6Cjq66oqq6orLKwr6+pqKGeoaGjpqOgopqlo56ol3J3bmdiVUtUT09KQ1BLX2JYWlFcVGBNSFJJQUA5Ojg2Njc3NTg5NDs5Ozk8Nzs+Ojg8PD0/QkBBPTs2OTk5Oj87NjM3OD5GQkJAQjk+PUBDPkBGQj44R5OWkZWTkpSQkZ+ZnZmVkI+Sko6Mk5aWko6RlZGSkIaBeXJzdXuBhI6HhZGTkpicnJiVkJWYo5yaoaeqqZ+clpeVnaKioZyZnpmlqKyvramnqqmop6GlqKirqqmvoZufoaOjoJqeoJyUjZiUmKCgoaSem5qlp6Spq6+spaOoq6+xtK6qrK6zr6ystLO0ua6urayqrLKwsK2wqKqmsrS0uK6qtrqwr6qurLC3s7i0t7W0u7y4tbWxtauyrKiys7uvrbGytLa1sbG0s7OvrKuvs7a0sayutKqqpqWnrauoqKupqqifqbOwqqeppaOio7CtqaatpairrayppaSioKWipaOYmZyVnqKippdudWVnZFdPWEtLSktTVHBiWWRXX1tcUlpQTEM8ODk6Njk4NzQ3NzQ4Ojw6PDg6PTk3PDw7PkM/QT47OTo5Ojs+PTg0NThBREVEQkM5PjtAPkI/R0Q+N0KSm5SVlZaVj46Wl5qZlZGKk5SSjo+SkYqKiY2Ul5qTjYmCho6VkZSfmpuin5+jnqGhn5ijpKelpaapqa2rqaKmpKilpKGfnqOjra2srairrq+qqqukoaKkqaemqaijop2bm6ShpaijoJidmJ+hoqmnoKKirqyrqqetr6ilpKmpqammo6iqqaekp66wr7Ovq7Crqq+yr7Czua+rqLCxrrCyubO0r62vtbCss7GurLW1tLSzs7CvrKyqrKusr7G0s7CwrrCwsKyqrauqq6alrrCysKumqbCvqaOkqaunqKaopquwq6mvqaaoqaalo6iwraqpqKKpo6WnpKGhoKKloZ2el5aYlJugpKmUbnNeamlfVVpOUk5QT1JkXGVjW11ZXFBZT0tAPDs5Ojc6ODczNTMzODo9OTo4OTo5Oj08PEBEPkA9OTo8PDw+Oz45NTo8QkFFQUNBOT47P0BEQENCQDdAkZ6YlJeZlpGHi5SSl5GIg4mLk4+OkI2Hh4SFlZmWmJeZlpqeop2anKKkoaCdn5qfoKGgpqGgoKCjo6KlqKmrramqpqOmpaCloKaop6WnqaepqKOnppmcpKaioaGhoaCemZmfoKamo6Kenpafm5qioqChn6GiqKCcn6GloaCmo6KfpKGspp6foaGkrKqnrKivq6e0sa6ur7WyrKqwq6mtrbWwrq6srreup6yqpKivsq+sq7Kvqqqpq6utqa6urrGxraqtqaunp6uoqauinaapqKilqKisqKilpKWop6iopqmsr6+oq6mhoqKlo6Opq6ymqKWjqKKhoKSdnZ+hoZ2bnZ+amZWcnKOqlG9zZm5yZF1cUFVPV09eZGRsaGJiWlpSVE9NQTo9Ojo4Ozk1MTYzMjg4Ozk5OTk7OTk8Oz0/Qz5APTk7Ojs8QD0+PDk5PEFBRUFGQTo9Oz9BQUJBRUI4PYqWlJOYmpaPiISNjpGSjIiIiI+JiZCRjoqKiJubmZygpaKlnqKjoZqeoZyanZ6bnKOop6ugoKOYoJ2XnKGjo6WjoqKkrKilqaCepqmnrKmkn6Kgoqahpq6mpp2fn5+gqp6ZnJuqpKGkn6GbnJqcoJ6hn56eoKOZlpuYpKKipJ+ZnKGhoqCbmp6goaSgnaejqrGorqusqaSqqquorKalrKqws6+rq6mwq6appaWoq6ynpqevq6Wnq6upq6irqqqrrailqKOmpaesqayoopykoaOmo6qpqKano6SnqKanqKepqKupoaKoo5yepqWjqKino6WlpqmgpJ6inpeYnZ+doqKlnpiUlZ6go5d1d2t2eGJfXFVZUVVXW2Nec19oX2NTUVlUSD48PTg7OTo4NTM3MzM0Nzo4OT05Ozo5PDxBQEM9PT44Ozw9PEA/Qz86ODo+P0NAREE6Oz49QD9DQ0VDOTyCmJmenZ2alZKKiZGRl5GQh4SJgoGNj4+Sj42cnZ+hpKmlqaeorK2moqKfmKSmo6Stsa6yp6asm56em5qjp6Cfo5+foq+rq6yoqKuwqaiqqKGfoKeprbCyr6yjoqahqrKhpKKjq6KlpKKlo56doJ6fpaKinp+imJWem5+fpKGblZigoZ2enJudnZuZmZWen6Oonp2iqKGaoaOmoqSoqaqoq7CxqKWlp6eopKWpqaqnoqWmqKadnqWloqClpaOlpqCjpaOjpaelqamqpKekpqKmp6SrqaenpKGlqKynpqWlo6OopJWdo5+bnaCjqaeopqGjo6mooKiioJyVkZqfoKGmopuXkpCamqCVfHdvfXlmW1pgX1pcVlxoZG5jbmppYl5QUEA/Ozo4OTg8OzYzNDMzMzc5OTs8OTs7OT49QkBAPTs9ODw9QD08PENBPjo4PT9EP0M+Ojk/PEI/P0FEQjk6gJ6kp6Kem5+gmY+ZnaCWloqGj4iEi4qTl5SRo6Wnqq6trLOys7S4t62pqqevtLKxqq6usbKusa2lq7OssbGpq6+rq6y2sLSwq7GysaOfoqqpp663trS0trOvrKuuq7e1pLKxsJuip56io6ObnZyXoqiloZ+eo5udoZqWnaScm5aZoqefoJ+joJuUlpmWl5qfoJmVnqGZmJ2dpZ2gpKeqqaiqraylqaSlqqeqqaqsp6SkpKOimZmhnpqaoaCfpaWYnqSmpKqooqelpaGqp6mnp6ejqKWmpaGkqKesoqekoaalpaOVl52Ym5mVo6elpaSfnZ2lo6Kqo5+amZiXnJyaoaGakJOTl5ibjX93cnZ5amJbX15cYllgZG5ta25hX2RgUE9BQDs7OTs4Ojk2MTQzNjQ3Nzc6PTo8Ozk9PUI/Pj89PDo/OTo7PD5BRUA9OTtAQT5DPDs5PzlAQEBAQkM7OXuao6OcoJ2dop2Zn6KioJibmJaYkpSQm5qWl7S0rrW4s7S4tre0uLm3tbm4ub28uKqLnLK4vLS9urW7uru4s7q/uLe5u7G3r6iusq2inJ+qsri8vL27ur+0r7GztbO4sp62tLl/naqkop+gl5Wal6SqpqahpKOkq6almaGko52goaKooaOgpaGck5mYmJmco56cmpudl5uZlqWam5+hqKmpqKuvr66pqKirrKytq6irp6WjoJyfo6Ojn6Cipammmpyip6Spn6GjoqKgpaanpqSooJ+ipKGjoqiop6OloaGopqalo5mbmJuTj6GknqKfmJiVoJuhpaCfm5udnJuamZugmo2YmZiTkYaAdnh4eGNbUllUX19hbWh1a3FoaWlhWVNMQDw6Ozg5Nzk3NTU2Mjg1Njc3Ojw7Ozs7QD4/QD0+Pjk6PDk2Nz47QkZCPDg7P0NDRDw+OT43PkFCP0ZDOzhwkpqblJ6bm52Vl52doqajopaXnpaXl6GblJi+t7G4uba3t7i7l5S2vbu9vcDFtaK7mKC3v7+6wcm0nbu2sra/xcGooLa0urGqrrSxsLG0tbW8vL68vL7Guri3ur20sKyTsbu5a4+4sqqmpp+YpKSnqKSupKurtbWvs6CnqqynqqmlpqCnoKGmoZOWmJ2foqSjnZ6coaChnZekmpmdoKaqqqqtrq2tsLGrrK2sqamrrqimpaalpqSkpqaeo6eppKGcoKKjpqCio5+jpJ2foqWgpJyboZ6fo6GhpaSlqaOkpaKkp6ehn52elpOcoJiZko+MjJeWn5uWnJqdnJqSlpSUmJOQmp2YiouHgIB8gnhhXllUYWlgZnNvc2l0ZGlkYltMSz46ODg5ODg5NzM0NTI1NDY2OTw8Oz08P0E/QEA9Pj44OTs4Njc/OUJFQzw7PD5DREM9QDs9Nz1DQ0BFQjw3Z4yRk4qalZiblZWYm6Knq6aVl5iQlZmhnpeXvrWztLu6ubi5woeYt6u4u8DCxbOjw6e4s72/tMTHvbS7uL62wMTErqCworW2tb2+wcPGwsO5vb/AwL2/xL28ur2+s6mlh67Bt2F6vsCzr6+qqqitp6ekr6eqtLyxtLWor7Gwr6yqoqajrJ+fpquXmqifpaWfoJydoKuwsKyiq5yYm6Cor7Kys6uorre1sq2tqaalqKulpaStqaShn6Cnnp6mqKmmnp+anqGlpqmcnaObl6KmmpuanZ+cmqGcmZ2eoKijn6GfnaWioKOioZSZmpmTj4qLhI2Qk5uPjpiVm5eYkJORkomNl5iYk4uKi32AgIVwYGFeXmtjYm53dXZubFtiUVZcTUc7PDk3OTc5Ojc0NDQxNDM3Njg8Ozs8PEBAPUA/Pj8+Ojo5Ojc6Pz5FRUU8PT1AQkJCQUE7PDhAQ0NARD87NV+MjIaFlouUlZeYl5ifpqellpWVkZebn5ual7mxtrO5vLy5urWqsryxvsG0vMe5uLuuv6fGw7/KxsnIxcXJvMLHx7+xsKe8vL7FxMbJx8XGu8TAxcbAua+9vMC+vrCvnoCtvLJeabbDuq2vsLWqq6aqo62kp7G2q7WyrbOtqK6vp6awr7Ktqq+zpKu1qaeopKCgnqmyuL61tbWqqaausre4t7apq7i8ubexr66noqOop6SfqKOfnqCZoZydoqSnp6GelJuaoKGlnqChnpajnZSQlpiboZqflpORlpSin5qenJudoZ6kn56VnJiPkpOPjImTkJefiZCWkZuUmJGRlZaDjJWXlpKLjIh8f4N/amZoYWttZm51cXJ1cWdeX1xSSUU/Ojo6Nzg0ODw3NjU0MjMzNjU3PDo7PDs9QD4/QD48PTk5OTs6PDw+QkRFPj49QENDQkREOzo4QUJCQUNAOTJbk4iEjZGKi5GRlZCSmp2fnJOSmJSdnZqXmpW2sbm1tb6+tri1uLO8vMTEusPHwb+0s8XFxr/CzcfLzsvLx8HDxsfIysXExcO7vLzBxcHFxb/DwsbFwLGTvrq/w8K1u5R9qrWlXmGgvLuxoJuxr6ykrK60p6qpqKqtrKmmpZ6pr6uyu7q4u7e5t7O5uLOurLO0qrC1ub3Bur6+vL60urm4u7qysbS8u7q7s7Oyp6Smq6uioaCdmpudmpyXmpuenJygnZaclpuZnZ6io52UnJCNiY6OkZ6bnJWNh5KLmJiWmpybmJybnp6cmp6UjpiYmpSRmZeeoZWYmpKXlJWRlJqYk4+TnZaSi5F+enx/dGtsbmRvbWlxeG55aWlhXGdhUUZEQTw5OTc2NDQ6ODQ2NTMzMjY1Nj05OTs7PT47Pj49Oz05OTs7Oz89QUNBQkFAPEBDQ0NFQjs4OUQ/P0BCPzsyV5uQkZCQh4WSjo2IjZCTlZGPjZSUm5STlpqRs7e4uLi+u7C1sri2tbbAw8G+w8LAvru+u7u8xMzEzNDLxsa/xcfLyNTLysjGv7y7vsS+xcjGxsTEw7i0wLe0vMHCucGHe7PFomFhhrm7tqybo7ewpqy0tayupaSjqKSgoKWZqrSxvsG+urm6uLW0srG0tLO6wL7Av769u7u9vsDCt7a3tru7sru+ubi3u7a3tKyoqamrpqijnpOampyYkZKZl5GRmJqXnpiWk5acm5+elJOJiX6GiIuWlJiZkYmVkZeWlZmbmpaYl5idnpyhmJWZmZyYl5ybn56jnJ6WmJeTl5yZmZyUlp2UlpOJdnl6e3Zua2lndVpmcnhzeWZmXWRbUlhJRj87Nzg4NzYxNjk3NDQzMzM2NDY7ODo8Oz08OD0+PDo7PDs9Ozs+PkRBQURCQEBBQkNDREM9OTlCQD8/QD89MkyWmpaSk4yKmJCKi4yOkpKKiIaNkJiKj5CUl7O7tba/vb2xtrjBvby0uL/Bsbi3vsHFvbu8wsbJv8jOyMHEwcfKysbKxczIzcbJxb/DwMvNz8rGxMPDwcS+uL7Bw8G6fXy/1aZkYnKxs7Sqn6e0sq6ruLWzrKmjoa2prKatn6y1tL/Cvrm4vbawrausr7W0ur7Fv7u8urO5u7i5ubWtsLS9u7G/vLiytrmzubu0ra2orKyqqaeXnpualY2MmJSTi5WWlJyZl5WWmZKYn5mQiop+iYqKkY6Vl5OUn5mWkJSZmJmWmJOUm6GeoZiYmp2ZmZaenpibopqdnJuYmpuZlpeXlpyZlJyYfoB4eXV1ZWZpamhda29ueHdjYmBgXlhXRkU4Ojg6OTc5NDQ5NzY2NTEyMzM0Ozo9Pzs9PTo6PTs8Pjo7Pz48QkBDQkJFQj0/Q0NDQ0RFQDk6QkFBQj5CQTVCkJeUlZmSj5qQjpKRjZSVi4qHjI2UiImPkpq2u7S8xsHEwr3BxcLAtLO9v6ywr7rDysPCvs3IxbfByMW/wcLIy8rCwsTJzM7Pz8zDx8bIycjIycfFycfIx7/Fx8THsnR2vdekZWNmrrS3t8C+vrq9ury6vKytpqq7urm3wLK1uLLAxrq3t8Gzsa2tqau1s7u2w7a2vbWxt762s7e4sLW2v7uwvbq0q7CxsbO8urOzrqutq62xnaOjoJqQjpiXlZCclpaYlpWSnJmTm5+clpGUjpWQiYyQlZOUm56YmZKSnJedlJmSk5aZmJ2VnJ6do5yVnZ+TnKKcnKCfnaOemJSVl5ebmpmgkH99cXRxb2NhZ3Zoaml0bXhsXWRbVmBZTEhDNjw5OTg4OjUzOjY2NDQxMzUyNTs6PD47Ozw9PDs8PTw7PD49P0E/RUFCQ0M+QEFARUVERUE7Nz5DQkI+Q0I4O4+akZaalJKUjZCUlI6VlI6Pi4yJk4uIkJObt8C6xsXEw8zCwcS9vrWvt7uvr7O6wMfFxMHMy8W2ucDCwsTHytHLwsPExsnFzNDOx8zJwsLHwsvLyMbMys7FxsXDyKpscLLXn2NjXrXEwcjMxsTBxMfBvL60sLCwwb6+wca/vri2w8K6urbAvrWyrKmvsri+tMC0tLi0t7nEua+8vrm+v8K/tbq2q6qsrq+wt768trSura2utaSlqKimmpycnZyeopydmZOQkp2VmKCdmJiVmZmZl46MlH2QkJefmZmYk5GToI6Nko+VjpCUlaKdnKSem56elpyjoKGipKOkop6amZubnJ2enIN9cnx4cGdgamp2bGlldW50Yl1iVFdVU01HOjc7OTk3Nzo3NDg3ODQ1MjM0MjU7Ojk+Oj08Pz04Oz05OTk9PEBBQEVCQUJBQT9AP0RFREVAPDk+QkNCQENBOjSAoZeUmZiVkImUk5aTiZGMlJGOiJaKi5CXnMXLw8O8wMPHwbm9vbu4tre3rrK3uLzAwsDCx8bHurzAwsTHyMbSycHDxL+/vsTLyMrLyby8yMfJzcjDyMnJxcXDwsKjZWmf0ppgYV6+z8fLzsS3v7/AwLu6vbWzs7+/ub/DucC3u8G8uri7ub27srCvsKy5wri9ube1t7q9xb24xsjCwcLGwr28tamurrCwr7O6t7m2sK+tr7OppquprqannqSlo6OjoqCblZiekZecl5GRlZeZlZmRlJiSlYyYo5qcnp2FiZ+TfJKWlZKUlJennaCipJ+en56foaGkoqKjoaOinJ2fnqOhppl5enl/cnBmZWZjamRiam1ub15ZXFZWTlBKRjk5Ozk3Njc3NjM3ODk1NjEzNTI3PDs8QDs/PDw6ODo8OTk4Pj1APz9GP0JBQz89QT5ARENDQTw5PENBQ0RBQDozbKKdlZedlo+PmJiZmIiSjZGVkI+Vjo6TlpbKy7u5urnBu7q3vsG8vLu5sa61uri4u8S6vsC+vru8wMXBxsK+xsK5u8O6uLm8vsHHwca7ucjJw8XEwMPBwsHDwsPBnGRjh8eeW15jxM3FyNDBrr2+uLm7u763tLC5vrO8vrG5tbi7tryztbm2uba5t7GtusG6vMG/t77Ev8bDw8fHwrvAwr/Cv7iys7O1tLGut7S3tbSxrK2xp6Wlp7CtqJ+nq6ajqKWmpqCgn5SYmZSRkZWUl5OYl5qhnZ6hnKGdoaWglpSbkZeXmJqTnpmZqaSlpKWdoqCanqCkoqOcoqGjoJ6cnp6ppaiVfXuDeG5mYWRiYWNkZGpiZ2NbWlpcWVFPRT07OTo7Nzc5OTY0OTk6NTMxNDUyNzo7OkA9Pzw8OTc3Ozo5Ojw+QD8+RDxCQURAPz49QkRCQkI+OjlCP0FCPT44NVmfnJiTmZaRlZiYmpeQkZCQk5GTlJKSkpSUxce4tbq5wrm5vMPFwri7ubGxtry6tbnAu7u5tri0tLW/u72/ub66urTAuLW3sq66u7fAt7zK0sC7wMG8u8W9u8HExKNpZHi9o1tca8bFwMDJv7DBv7u4u765tbe0uLy0vbi1tLCzvLG3tri/tr25vb65t7q+u7/Axb29y8PGw8TAw762ubq2v7i7v7y4trOyq7CwsrWzs66sq6emnqeurauiqKumpqqjp6iqo5+Ym52bmpicnJiXnJuhpZ2anqGhoKGmoJqbnJiboJ+dnJ+coKiho6SknaKfmqKgop+el6Shop+dmpieqKWhi3x5iH1xY2BiY2hqZ2dpZWleVlZUWU9TTEY4PzY7Ojc3OTs2NTo7PDYzMTM0MTc7OTg/PT47PDs3Njk5ODo7PUA/PkA9PT9CPjxAQUNDQT9DPTo2PEBBQDw9ODdJlJibj5OUkZWYlZGWkpWRkJGUlZSTk5OYlcHCwLq8ub62uL7EwMKxvbqytLO4vLW3vMC8vbS1sbC1t7W7wbi+ub+8vLe0t6+ut7W5v7vB2YqywrvDtbrHt7a5u8CmdnJ3pp1oaYDGwL+7wb65xrzCwLzFuLa3tLi2tru7uLa0t7q1tLi8vbm/ucPAwLu5vLu+vcjEvcfEw7rAvb62sra4srm0usLCureysaysq62yr7Kur6ijpJ6rrKyqpKakpKiqoqemraihoaGmn6Oiop6bnKKfoKOdnJuhn6KgpKCem5eZn6GdnZ6eoaWkoaKioZ6ho5yinqCZnZijn52eoJqZoKKmnYR6g4F4cW1lZWZvaWVsaFhYTktLS1JJTEhDOT44PTs2Ojs5Njc8ODk4NjA0MzE3OTk7Pz0+Ojw6ODg5PDg6Ozs7PD1BPj09Q0E8P0NDREA/Pzw6Nz5CREE/QDg4P4mYmoyMkI+Tl5WMkpCakpGXmJaUlJKQmZTDvsbBwby8uLi6v7a8scK2tLyxtLa4s7q9v768sq2vrLGwt7y3u73BxLm3t7a1ubm6u7+80cZ2oMy9x7e5uK63tb6xnYWEgpOVe3+ZxcC/vr28v8nCx8i+xri1srK9uLi4vrq6uby6urS3u7q5v7zEwL+5uri/ubvFxr3Fw8Kyur27sa+2uLO3s7q+wLm2rLGrrqmqqa2qqq6mpKWnrq2ppaOio6GkpaWmoqato6Klo5+ho6Gcmpyhn6CloaCenZygnaWgnpeVmZ2fn52gn6KmpaCknpybn6Ofn5mcmZ2epJyWnKOcnqGcppZ+f4d8a25wZ3Brc2ZibWBcVElLSkRKQkNHPzo7OD48Nzs7OTc4Ozc8PDYyNzUxNjk8PD08QTs8Ojs6OT45Ojs9PUA+RD89PkRAPz9BRkQ/Pzw9OTc/QUNCQEI5Ojl3nJiLh4uQkpOWjY+TmpOQnZiSkY2PjpiSvbfHvsO+vbu+vL22uri9ure9s7OwuLi1uby8wLeqraSusLi7sr2+u8S2tbi1t8C+xLzCxNitcnu2yc/CwLivtb6/oI6EfYeEj4GEmbDCwr++vbzHxsvKxMe9tbW2wb27u7/CusDCv7y2t729vcHBwL+8ube8wru3v8W7wr++tbe8vK+vt7awtLO6ubq7r6mtq62rrKaqoqeuqKWqra2vp6Sgn6ajnqKjqKOjq6Oiop6dm5ublJaZnJyfpZ6fnpmYnpejoJyXmZqZmqOjop6jo6egpqCbnaCjnp2WoJmcoKCblJegn6WcmKKQgYaAcmZsaW50bnhjZ2JcY1FLVEhFRUNIQzw7OTg9Ojc6PTo4OTs3PD01MzY1MDY4OTo8O0A9PDo+PDk+OTk9Pjs/PkM8Pz5APz4/P0ZEQEE/Pjo3P0BDQz9APTo4ZqGYj4uNlZKVlY6PlpmVl5uVjoyMjY+bk7m2wbS/vLm8w8C+wLq1trKywLmvsry8sLe7tru8qqqjsLm9vLK8vrzFuLG4ur3HysnCyMnSlm9wqdLRzMrEtbvJr4h4cGV9eYVvc4CItcS+wbzAv7fKycXGwLm9vMS/v7/CyL3Hx8XFvLrEv7vBv7rAvLu7wMS9t7nCub69t7S2uLqur7WxsLCytre0t6yurKqsrKuoq6Gms6qlra+trKippaOkp5+io6Onoaeiop6cnZyamYyQlpeZnaKZnpuVkp2UoaCdmZ6fmJimpqKfoqKmoqeloqCko6GbnaCbnKKfl5WVnp6kmpafiYGDgXRvbGx0a2xuX2NeYGFOSU0/RUA/REM7Ozo6Ozo4Ozw6OTw+Ojo+NDQ1NTE5OTo5PDtAPD89PTw4PDs6PDs7Pz5DPkI+QD89Pz9FRUJBQj87Nj9CRUQ9QUE6OlmfmJOSlZqVmpOQlpeclZuZlpSVkZKTnZm2uLaxuru6vsG5uca7trWypb69tLbBv66zvbS4wbGwsbS7x9LCub68xL63vMG/yM/GyMrKwIRwcqLNy8vNysbFwZVwYllPbHN7V1hocpm/wcC/xKikyMTDxMO5w769ub+8wsbCyc7Hxr66xr26v7m3wLm5vsDCvrW0vLi2u7CvsrK1r7Cvrqyus7CzsrirsbKxqrCrq6yrrLatqKyusqarrKmpoaWgpaakrKSmoaChnqGgnaCMlJeTm5+mmZ6emZOYnZ+gnp2eopuYp62ooqSgoKKqpqmhqKGlm6CgnZ2jn5SYmKKdp6Gfm4J7eoh6bW13e19wY1teX19UST5DRUlCQz5DOz42OTo7Ozs7Ozs7PT05PTU2NjIxODo5Ozs6QTs/PDw+Nzs8Ozw9PTw9Pz5BQUE/P0FCQUVDQkRAPDY+Q0RFPkJEPztTmZuZmJ6dmqCalpyZn5KdlZ2boJWWlJqYur20sLu8wcTCv8XGura5sqO7vbS3xLuwtbq2ucS4tLy2u7iu3MK+tr7Avr20npSiq6+/vqN2dHei0MnLyMHDw6Z4XE1GQV9vcElFWGF9qsW/wbKImcjDwMjAusK7urO6usG+wMrOysS9tby8ub+5ubW1s7/Avre0s7S4rbeqr7CwsrGvq6+nr7ausrG5rra2uLSzsLGttrS6sa6srranrLKsraSjoaenqLKrqqWkp6elpaCml5ujn6SmraKeo6KanaWiop+foaWenrC0sKSlnp+kqaevp6mgq6CiopqipJ2anqGmp6+psZWCe32Cem5zeHNncF1bXl1ZUkZEQ01JQUU9SDs7NTk7Ojw8Ojs7Oz0/Oj01NDUxMjc4ODs8O0I8Pz46OzY6PTo7Pj0/QD87QUFBPj4/QkBBQkJFPjo1OkFCST9AQkA7TJqdnZ6fnZienZmampySoJWbnp+blZGRl8W+urbDvMbCvr/Ixbe1uLe2ubu0r7e3srWzt7m8u7a7u8itbLHNvbW5wLykdmpnbGhvfJGUbnR5otHGyMG4v72HYkxCQTpUaGRFOk5YaJLDwLSQcp7Ivr/HvLy/tLSutbW8vr/OzcvCt7K4uLi9ubuxtrLIwLu2tLGwt6yzqbCtrbS3r6uuqrG1r7Gvt7O6usC/tre2sru6wLWyrbO3rLC6r7KloqWrrK+5s7KosK+xr6qiqKGkraitrLOun6inpqWmq6Sknqaqo6ayuLOrpZyfp6anrquqpbClpaWbpKOYn6exrLW4sLKOhHl/fXZsdXtwbmlbX2BZU1BBRkhHS0BEQ0g8PTY7OTk8Ozo6Ozo9Pzw9NTU2MTM2OTg8QT5AOz1AOzs5PD04Oj08QD46Oj49Pj09PkBCQkJBRD03NDU9REc9Q0I/PEWUnqCgoJyXmpiYlZmdmZ2fmp2bnJaRj5LDwMK9wrzEvLy7xbu3s7e2tru7s6CWtayvsbS0tLa4ucDQqXKDtL22tb+ehGhZX15LUVpaa29yfaPNvrq5tL20eFBAUWVAS1xZRzlHU1x7vLmccmmsvLXBwrW/urWur62wvcC5z8rJw7GwtbS0vbq+ubq7ysO7uravsL2xuK+ys7C3vbaur66wt7CsrLK2vbzEwrq9t7bAv8G3tbC2srGzurGxr6err6u2v7e1qbqztbmxp6uop7ausrG1uaisrK+qr7CqqKessayytr20saykqKuoqKusq6i2qaaonqadmKOuvLG7wbSmiYF8gnpzdXZ3bnFgX2ZdW1RKPT8/RkY9RkNDOTo1Ozk5Pjw8Ojo8Pj4+Pjg4MzE1Nzg5Pj9BPzs6Pz08Oz09OTs8OTs6Nzs+PT1DQT8/QUJEQkE8ODU4PUNGPUREPzw/iZ2en52Xl5WUk5aZnpubmpuYlJ2Uio6Owb7Dwr6+vrm2usCxtbGzt7fCtbOrrbOoqa61r620trnCy6CCdouisLORZmBlVVlfS0pNT1Nsc4Slx7uio624sIRFQHCWUUVSUUs6SlJVbKqhf2Rytq+yvLquu7Szpquorbq+uMvCv76sq7Cvs7u3ub67wMXBu7y3sLXEtb+0uLu0u8PCs7a2sbisqaWrsr23v7+7u7exvL28trGvq6uprbOvsLCrsLSpuMC2sqm0tbC3tq2spqu7s660uMKwsbG1sbK1saywsri4ubi+tLGzrqyxramvrqqyuK6trainoZ6ptr+4ur+wlol9gHxxdHd0d3JsX2NhW15PSEI/PUhDRk1DQDc3NTs6OT48PDk4PT47PT86ODMyNTc2OD8/Qj86OD4+PTw5PDk7Ozo8Ozs6PEA+QkI9QEE/QkI/PDs3OjxBRD5CQz8+QYqgm6GdlJiVlZKYmpyWm5WalY2bj4SIhru0vb+7vLm3s7y8rLOytLS2wLXAr7Kzqqqxt62pubO3v8Wihnl1jaKOW1JBWFRHYW1ZU0dJY42jqsPGmYSQo7ClQkd7ml9CUFFOOVNaUmGLf2lfibelrLOwprCtqJ6gn6WttrXCt7a0pairqLC2s7K6tbu7u7W4trC1xLK+vL+8ubrFybq9vraxp6SeoamxrrW5trKxq7S3trGopp6gmaWmpKynq6y2qa+6sa2kpq2lq7GrrKmtuLawsrjBtrGxtbGvu7ayt7W1sry1urKwsbKutLKqrq2nuLWyta2uqqiosrq9wLa0qY6Ce393b3tvdXJtY11mWFxdUk5OQT5KQkFKSUA2NjU7Nzg+Ojs4Nz4+PDs/OjkzMjc1NzU8PD48PDg+Pjw8OTk5Ozs7Pjs7OTw+P0E9PEJAPz9CQD47Njc6QERBQ0E/QUKJoJ2loJSWmJiVnqCcl5uYmZGMmYmDhoS1r7S7u7S1sLG2uq6wtLOvtbq1urC1s7KttrqvrbyzuLjCsI5/eIeOaE5JQWtXQk91hZlwTUNWfbC70a56doKhpkZIaHdYQlhYWzxWY1Jab2hgX6GznqSnp52jpp2WmZman6muuayrq5+lqKSrrq6nr6yvsbGtsa6usLmwtLy+uLm4x8W8vLu4qaKcmJufp6assq6zqaapqq6popqXl5GcmpijnqKir6ekrKaompqemqGnp6anqa+2squ0trCqsK+xqbm2sbWxrqy3s7avrquuq7S1ra+rq7GtsbKoraurs7W3ur2wq6GLeoJ5cnZzbXRpbF1balRdXFBNSERGTEJGTkY4NjY1OjU6Pjg7OTc8PTo7PTo5MjM2Nzc3Pjs9Pjo6Pz48PDw6Ojs5Oz47PTk8Pj1CPDtAP0A/QT8+OjU1OkBFQkRBQEJBiJ+ipqGYm56dmqWpmJudmpmUjJmHhoeGrq2uuLmxsqiur7iyq7CwqrK1ubm+tbK4tLm6trm7tbWzuLOSjIiDd1VFQFSJVkpKU3WLf2JAWam5ssfPkmdsg4RLRlNVSWSRn6mel3tRVl5cV3Kvp6GdnZ6XmKGVkpWXkJifqK6ko6Sgoqeio6mpoaanpaqtp6ynqKesq6yyu7SztLm6trK2ramgmpaWm52fq6yqr6Oko6GpoJuTjo+Qk5KSmZaanaSloJ+ep5iVkpSZnqSjoaWqrK2iqaqppKmtrqW0sa6xraqprq+wraWmqqSos66trKmmpqmrpqqnq7Ksr7Oxq6mWgX+Bd3J4aHRzbmRUYGNXXFFOTEhASFFETUM9ODg3NTo3PD46Ozw4OTw7Ozw7ODI0ODk3ODs7PDs4PD0+Oz08Ojk8Ojs9PTw6OkA9PDw7QD5CQEE/Pjk1ODs8RkFDRD9BQYijpqKjnqCfp6Coqpufm5yZmI6Xi42PjKqpqLGvsK2lp6ayr6mmq6CvsLu1vby4wMG+vLy8ua6sr7K6p5iZlmhMP2CAak5JSU1nmn9WR1mturGv0rpyW2FkUUVQcJWppZ6anJ6fgVRQU1OUr5+nlpuXl4+dk4+Qlo6Xm6SooKCioqKlpZ2jo6CepaCkrKSmqKSio6OrrLOuqa6urqeqraisoZyamJmYm6moq6ufpqObo5yVkIyPj5CTkJeVlpifnp6amaaXk4+Slp2ioKWipqSnoKKko6Ghq6uksq2qrKyno6yuraufoaKkpK+srKmmo6KqpKqqpKmrpqmsq6agiHiDfHZ/emN3bG5cUWhUUE5HUE1MQk9RQD47PjQ5OjU7OT07Ojk9OTk8Ozw8OzkzNjk5Njo7Pz06ODs6Pjw6PDs5Oz07PDw9PjxAPT88ODtAQEE/Pz45NDk8N0FDQkQ9QEOOqqSjoqGinaulpqimoZ6dmZ2PmJWTkJWnpKGmqKmlpKChp6uhnKKbp6u1sry9wMLCwL7AuLSnpKyovcGppr1hQlyjfU9aSUthS1uJZm1zjq+1qbzSl1VPT1BuorCnnI+VkY6XnqKOU0lcpaSdqJSblpeMl5GNkJeTmJ2iqp+fn6Cjpaicn6ChnKKfo6innKehoKSfrKisrKCpq6agpKimrKOdnp2Zl5qrpqqxo6WonqCclZOQj5GQmJCWlZiXn5ibmZukmZeUlpqdoJ2nqKWgo6Kho56doKmqpa6upqipoaKqrqqnoaCio6msq6eppqShqaKlqaalpKKmpKijkn18gHV2fW1re2RoVVFjTUpIR09STUpORzxFQDwyPzg1OTs+Ozk5Ozg6PDs7Ozk5NDg7ODc7Oz48Ojk8Oj07Ozw9OTw8PD49PUE+QEJAPTc6P0FCQEA/ODU1PDpAQ0BEPkFGlq6koqWeo6KpqKipqqWmnp2imJiZmZWbop6bnqOioKOgoZqgmJeXlqGorK62t7q5ure3u66ooKGpoKvFwMmWTkJ2nWtRcUxQYWd3cF9ga4GZsLCuxrpdPmCUpZ6YkoyPlJWXl5ufpotQcqCemqSXl5eWkJKRkZOal5ugpKqeoaGepqeqop+gp5+dn6SnqZ6jpp+qnaqtqq6nqLClo6Smp6ymoaShm5ier6iusqulqqqgmpiYmJWTlpqTlZWalpuXl5ihnpycl5uhmp6ao6eln6GioqOdm6Gmp6aoraOppZ6kp6mkpaWhpaSsrKmmq6eioKSjpKenoaCgpaKmoIl7gH13eHxkeXlgYlJVYEhJSktTVElSUEw5P0E2Nzw2NTs6PDw5Ozs4Ojw9Ojs4NjU3OjY5Pj0+PDk5PTk9PTw+PTs7PDo+PTw/Pz9APT03Oj5AQEA/Pzg2NT08PkFCRkBAR6CupKaroaOqrK6tp6ypqKCipp6bm56aoJyalZmfn5uen56WlJOXk5KcnqSorq2sq6uvqq+pnpeepZykxsaGV1JNZJ9ebn11eVdRa2NeamdseI60r7TCf4Shn52ZlJeZmI+NkJSQi42QgYqhnZejmZqXmJmUmZiWnZufpaapoKajnqeurqumorGjmqSmpqqioaqiqaSosquxsqu5qKarp6urqaysp6Cgo7GusrC0qrKuopmcnZ6hmZubmpiZm5SWm5aZnKWhoJqjoZqcmZ+kop6gn6KmnZulpqWkpaijp6OepqOinqaloqWlqKykpq2noJ2dn56gpaGenqWgppmBe4F8dnZzaIJsZVtTWlpNUUpPT1VMU0xBNz5DNzg9NzY6PDw9Ojw5ODo7PDo7OTc2Oj01OTw7QD03ODs3PTs9PT06Ozw4Pj09QD5BPj4+ODg8P0BAPT43NTg9Pj1BQEZAQUihqqCrq6GkqquwramtqaelpaWkoKGfnqWXl5SYmZ6YnJ2blo+VmZKRnJihnaqip6Cep6Gln5ySm6Kan6qjj3lXc3VydGlfcm5YWV1eZGdZYl9orK6rsKijn6KglpCTm6CamJaRkp6boaWbnpuWn5qfl5uinqWhnqSfpKitraisqKSstLe2sKe0rKKtraOvpaSmoamorrWzsr23vrCssa6tqaq0sbCoq6iytbezuK2ytKSgnaWfrKGhoqCgmpiWlqCbm5ikoaCeo6GgnpqcpaCfnZyhqJ+fp6meoaOkoKagnqehn5ymo5+ipaOooKmrpZ+dnZudmqainpyjnqeQgYJ/fHh1and1XWxaUmBIUlVIRlVWSkJMRz1LSDhGPDc3Oz49PDo8OTg6Ojs6PDk2Njo8Nzs+PT8+OTc9OT47PEA8OkA6OkA/O0A+QUA9PDk3Oj5APzo+NzU4PT0/QUBEQEJGnKueqamipamprqimqqWmp6aoqqGlpKOmkpOVmJacmpqcmpWTmZuNk5+ZqJ2un6eenKGdnpqZkpiem6GhoKJ+b3tpYGNXTVtSVUhKT1VQR1JTSpmsqqmkn5+ZkpGTmJiWlZSLh4qNlJ2cnZ2el56Zpp+gqKWxqqeuo6uttrC0srGutri9wLqttbSwt7CutKmmpKWsqbmztbvDvMPBtrq2q6+xube8r7OwtcG8t72zs7WirKKpqLKpq6inqJqZnpqqp6CZp6Cfn6enpaSfnaqiop6bn6igpKetmZ+jnp6nnqCmnpycoqGbo6KhnZympaWkn6KZnJukn6CboJyjiYWEfnZybWl2bWhtXFhcQ1dOSkdNR0NGTTw+TD40PDk2Oj0/PDs6Ojg4PDk6Ozs8NTQ6PDg5Pj4/Pjg4Pzk8Oz0/Oz1BPTo/PjxAPj8+Pz08Njs/QT07Pzg1ODw8QERCREFCQ5WqoKapo6mqqKmjoamgpqinrK6lqaWpqpSSl5mUmpqanJiYmZyamJmqoLGit6Swpp+enZ2XmJWZnpqco5+ciF9WX2ZfVUxMRDo+PkJDPj5DU3ipramqpZ+en6KjnZ6dmpybk5KUk52dmJSFnZqgmqukq7KwubKysbKxur28vLm2uMO+v8K/trq7wMS5vbusr6exrbHCtrjCxsDIysDKv7C5ub25wr64s7vGxL3DvLezqbOtqrO1r7Ouqq+jnauntrGtorCmoaOvsa2wpKWvo6GgmqGnoaSqqpmdoJmao6CmqKGcnqKemaSenpiYo6OhpZ6mmZuipJ6fm5ubnIeGgXt0cmtrdHJxaFZcUUZUSERKUEk/RUE0Rkg5NTs+Njs8Pjw8Ojo4OTw4OTs4Ojo4Ozw3Oz49Pj02OEA5Ozs9QDw9QDk3PD07Pj0+PUI+Pjc6QUA+PD45NTg9Oz1DQEFDQkGRqqGlqqelqqimn6KnnKasp7Gyq62jqayVkpWalJecoqGbnqCinJ+psqu7sr+rr6ylnqCgnJyYmp+gmp+fk3tgYGZeTkRFPEpFSDw/OjZOfqqzp6OjoaCepaulnpeclJGZnZiUjIqGiIZ4bYigpKKrrLS8tsO+vrO7wcPCxcC/wsbGxcPIwsDFx83QyMvDsre1vrK+xbu+zM3FzMzM0se+v8DCvsfGwrfEysnDwca+urS6urW7t7C1sqq6sq67t7+7uqq4rauquLq0vK6uuaOmo56mpaKjqaaZm5+Ymp2nqqegoaGkmJSjlpSZkZydn6Sep5+en6KdmJmUmJSIhH16cWtjaG94a2VaW0ZLTEVEU01EQkU3Oj87NTQ5OTc5Pj87PDs7OD48Njo9OTw9OTw9Ojs9Pj4+NztBOj45PT45PT44Nzs6Ojs/Pz1CPj83OkFAPTw9ODY2PDo8QT9BQUE+kqugp66ooqulpKKipaGlqquwsq2upKmmlJWWmpaUm6SmnaGqp6KrrLy8v8PBsrK4p6Ghq6qhnJ6hoZ2cmXtyaV9UTEQ+S2CCc2VCPVyOrqygmZubnp6Zl5eXkoyOlpeTjo2Qi4KDgndycW1wj6atrrS5xbvNx8u/wszOzczHydHMzczHycXFzNHS1c7Tyb3Av8O7xsXIxdHTzdPQ09PMysLFxsbKyM6/yNHMx8bHxcG8w8G/v7+2vrOuv8DDw8fEx8Suv7iyuLzDwsK6vLy1rqenraigoqmlmpagmpmdqKupo6SknpePm4yQmYmVmJugn6OdnZeempOTi5WPhYB5dHNlYmdyb2ZeWllDTkxERVBJRENANTU1ODlCPTY4OkE+Ozs+PDk+PTc6PTk6PDg8PDw7Pz8+PD0+Qzw7OkA9Ojs6Ojg4ODk7QT48QD8+ODtBQTs7Pjc4Njo8PkI+Q0FAPpOvn6ivpqiro6KloKampKuoq62qrqKqo5Kcl5ebmJuirJ2frqalsarFxszOzb+wwaikqKytqqCdo56cnpVoZFtTSENAQE2Qp7Ccg6CyraOenJ+al5aUkpSWkZCPjIeDg4iHg4CBgYB5cXJvbHmktrq5vsvB09LTyM3O0dPR0tHQ0dHNzs7Qxc7U1djS183Gx8nMw8XKz8rT19HX0tXW09TIzMbMzcnSzc7TzcXIysrBxsvHycjGv8Ozs8jEy8vLz8bKv76/vcHHxMzMyMnAw7+tr7OonqKqo5qTnpyYnqaprKSlppaXipWFkZSHkpKSmZualpiQm5WQjIaRi4B6cnV2Z2NndmlkVldRRE1GQElRQj1CPDoyMkE8RTw3OTxCPTs9Pzs7Pj05Oj48Oz44Ojk5Oj86Pj1APkA8Pjs+Ozk9PTw5Njo6Pj08PEE/Pjk6QEE6OT44Ojo6Oz4+PEE/QT6QrKKiqaanqKSfop2qqKOso6OnpqyiqZ+To5iWn56dpK6bn7CrqKyxyc3U18/Gu8esrbO3rK6jnqOinaGbYFJLSERDQEZYttK8sq+mnJycoKShnZqUk5WUiX13cGtlYmhxb3F7hYqAdXBucXRwhbPDvsXR0NfW1tLWzdTW19TT0dPU1NPP0cPQ09bY1dbSy8nO0cvGzdLK0tXW2dXX09fYztLKz9HMz9DN09C/yMfKxMzMzM7PxcbHtr/Kv9LNzM/Gyci/xMPIzs3Q0c/NysjNuLe7qJ+lq6eemJ6jnp2qpa2pqKiSlYiQhIyRho2MiJOVmZCWjJiSj4aHjIR8eHN2cGNgZHJiXVJcSUpHQUVJSj47QTg9NDU4Njs4Njo8QD07Pjw7OUA7OTo8Ozs8Nz09Ozo+Oz08Pjw/Ojo8Ozs5Oz89OTU7PD48PD0/Pz46O0BCOzk/OTg7PT0+PzxBQEQ8hqugnKegp6Oim6CbqaSlqaCfoaGmn6ifmKSimqmmoqarmqOwsamotdDU19rSx8bLtLXBxbG1qKGkpZ+ioVlJP0FDQUlTfLKtppmUl5+cmqCgnpucmZWJd2ljYF9fYF9eX19dYmx1dHBwb2xycXWSxMjG1NbX19fT1tDV1NrU1M7P1dTU0dHM0c3T19bT1dDP0tPRydPRyNDX19jR19LY2dTWzM/Pys3Sy87QwcbDyMbOzdHR0snMzcDKzMbTz8zOyMTKx8fIzMrU1NHVz9LM08K5xbGlqLWup5uorKWdsqiws6ysk4+TjoiKj4OPi4SQjpmNk4+Zj4+ChYx8enFzdG1hY2ltX1ZQX0pKQ0ZDUk0/PD41NDo9NTI4NTU8PEA8Ozw6OTpAOjg7Oj46PTg+Ojo8QD08OTs9Pzk6Pz07PTw9PTo2PD0/QD08PT0+OjxAQjs5PDc0Oj48Pz89RkFEPYKknKClnaWlo5mcnaSeo6OfnZ+doJqnnpyhqZ+vraqqq52mrreoq7fX1NXZ2dHO0L+8zMm2vq6mqqiho6tnQzk9Pkdag6unn5eVl5manJ+dmJyckn1wZWNiX19hX19hYF9gYF9gZm5wcG5rb3J3d5zMwdLV09jY1tnR0tLXz9POy9LN1dTSys/M09bS0dbNz9XV0cXR1MrQ1NXWztLQ2NjX18vIzsTJz83KzMDKwMjKzc7Qy9DOzszOz8jL0NDLzsrCycfJzMvM0tPN09HR0NDKvci5sK67uLWqtrCtqLits767sZqPoJSRjo2IjpCFkY2ZjJGRlY6RgIWIenZvcG9rYWRucGFXXFpJRkZETVhFO0A9MzM8PDg3ODY1Oz5APTk8PDg8Pjk8QDtAOj04Pjk4Oj88PTg7PkI6Oj08OkE9PTw6Nj08P0A9PDs9Pjg7QEE9Ojw4ODs+PD4+OkVCRT6Bn5mlp6Cfo6eam5+cl56eoZqdmpyappufpKefuLa1taykrK6+tLDA2NLX2tzWzs3Kw9LPwcCwqaytqaSwektKRT9ajaGblZOXm56enpyTlpeUiGteXl5hZGJgYGBhYGBhXl9fXlxibXJvb3N0dnZ5pL7M1dHW1NPY1s7O1MvOzsXOytLSz8fOzc3Uy87TzcvX1tDM0dTLzNDS08rO0dXS1dXKwMrCxczCyMnDzMPFyMrKz8rNzNDN08vGyM/MyMfLxcbBxsrMzdDRxtDOzc3Mz8XHwbi5vcPDvcO5srK+sbvDxLWqmKWimZaRlZWSi5SNmpGUlI+PlIKJhnlxcmttZ2BgcGhZWGhWTEZMSVBRQjtDPjs2Nzo4Ojo1Nz09QDs6PD05PD05PT06Pjo8ODs9OTtAPD47Pj5BPDk9Pj1CPTs3NzU/PDw/PDw7PDw4O0FAPDo8OTs7Ozw9QTpFQUU+hJ6bqK2epKSqnJ6fmJKXm5+am56ZmaKVoamppcTCwb+7tbKxx8K4y9XV2drb2MzMz8jW1cTCta+0qKCuk3hydnuLlZqNjJeVkJORkZWWlZCLfGVhYmJgXV5hY2JgX19gYWFgX11bXWdycnFyc3BtcnmkxtPPy9DP09TKxcnJxsa/w8bPzsfFx83K0sjLzs7G0dLQzczUysfLzs/Ix8/Sy9HPxrrEv8bJvcLHyc7FwsjAx83IxMzKy8/IxMTQyMbCxsjEv8HHzMzMz8LKy8jHy9DExce7x8PIycLPwb28v7DByca5vaqwsqelnaKcmJCbkKOZl5mRlZiJj4J3b3Rka2BeZnBhW1dgR0hIR0lNVEc/Sj02NDM1NT09NDg9PT06Oz08OTo7OT89OTw7PDg6PDo6QD1APD09Pjw6Qz48Pz04ODk6QD4/Pjw7Ozs7ODo+Pzw7Ojc5PD49Oz49RkFDPYOgm6qupa6qq5qdoJeUjpedmpmgmpqcm6WysazJzcrIxL68us3NxtDV1dna29jQyc/P0dPIwra7u62jtnxmg4OnrJOOjZaPhYODg4F9hIR+c2BbXl5eYF5gY2RjX1xdXl9gYF9bWlxha3Jyb29rbG9vfbjRyMnKz8vNxLrAw7u7urq+ycbCw8DDyMvJyMrIwcXMxsjLzcnEwsrJwcLM0MXLyL+5wbvGyL6/xs/Lw7/Du8nHyLvIxsXKwL3Cy8bFxL7GvbzAw8XMxcW8wMrCxcfSxcDJv8rJxsjG0MPDxsOvxMvHxMq3v7y6tKmspKWYn5iso6Glm6Ogm5R7d3J0ZmlaYW5sWlxYUkRMRkJHRExERlNANTQzMzQ/PTM6PDw7OTw8PDg7PTtBPTo8Ojs3Oz05Oz07PTs6OD4+PEI+Oz88OTk7Pz07QD48Ozk5OTk6Oz06PDo2OTw+PDs+O0NCRD5/pZypsqm0rrCdnp6YnImUm5man6Kfmp2ov7i8ys/RzMfCw8bNzs7M1c/V2djZz8vSzc3OyMG1w76xr7VrX3l/ppCKkpaGeoCFhX92eHVycF9bW11gYGJjZGRlZGBbXF1dX15gW1laXGJvcm9raWxwb3OPxrzJxczAxsKwtrqysrOyscK8vLy6uMHBwcW+vbm9v7nEysXGwr3GwLi7xMm/wcm7t7u7xsO/vMHNw8a+vrXBvcO6vca7wrqzvMXEwsK3v7W2vr+7zMO8tbrIur++y8TBxsLFycbJxtDGwszHssfJw87NwcXDwL2zt7Cyp6ioubClrbCqrayUenZ3amRnYGhvY1ZeWUpGSkZISkFFQkVJQDk6NjQ4ODU0Ozo7PDk8PDs5Ozk6QD46Ojw6Nzo7Nzo7Oz88OjxAPUA/PT8/Oz07O0A8Pj4+Ojk5ODk3ODo8PDw7OTo8Pjs7PjpAQEU+fqygrLWqt7SyoZ6fl5qNlJaan52mop2et8XCxMjO0srKysfNzc7RyNDG1dTW183Kz8XJxcfBucW9q62kX2V0h5OLiIuEeH+Ghn9+hHt0dGNcXF1eYGBiY2FhZGViXVxbXF5cXl1aW1xeaHNxbWdnbm9yeZ29zMDDusC4rrCxp6qtrKe4tLe0s7O0u7W+srewta+yvMK8wcS8wLu1srq+wLjHubS7tsHCvLi9xsHDu7Wvsra6v7TEt7u0q7i9vcC9sbq2sLa6s8W8tq67v7W3tMW8vsPFwMPFxsjLxcDGxrvHy8DPysfDxsLDt8O9vba5vse/rLW6tbe2jnl0eGdnZWJrbl5WXmBGS0hISkZCREFFRT88OjU2NTYzMzs6Oz06Ozs6Oz44PEE9PDo7ODc5OTk7PDo+Ozk+Pz1APz5CQD1AOjo+Oz89PTk6Ojo4NTY7PT48PDo7OT49OT86PEBAPIi3pauzsby8sa2foJmUlJiXnqujr6qnpMbLzcjFyM3M0MzNyMrIysnKxNDN0s/NxcfBxcC/urfJtqqwmFtocYyPhYiJenh+hoZ3d4F8c2hdXV1dX2BfYGRhXmNlY19fXFteXF1eWlxbXV9scG5oZmttbnJ8pMe/ubi1sKutp56jqqeeq62zraqsqbSut7Gzqa6mrLO8urbDubq6sau1ubu0wrqwwLG+vLu2u8e5wratqqiwssC2uL2wsKeys7W7vKuutaautq+7srCqubCtu667uLvAwL65wr/Hw8XAvMbCyMq4xcfGv8fEw7rExsK7xsnMy7O5wr27s4lzdnZraWFibGhZWFdbQUxLTUlFQUM/RkE6OTo5OTU4NTQ6Ojk7PD07Ojs+ODtAPD05Ojc5Pjk7PDo4Ozs6Pj45QT0/QD87Pjo7PDo9PDw4OTg5NzY4PDw9Ozw6Ojs+PTs/Ozs+QDyKwKuouLe5w62zqZ2ZlJaZoZymsLWxt6bFztLLw8XBxdDHzcHDxr/ExMPDysLJyr/AvMG6s7S1w66psJFcan6Sh46Pe3h9iYV6e4SAd25eXVxcXV9gX19kY2FkY2JgX11aW1paXVpaWlpcZW5vaGZnaWtucYGtubC1rqalqKeaoKWhmpylrK6kqKKrqq2rsKSmn6qttbaxvbmvt6+orri0tLy4tLyvuLm1srzBssCupamjq7Gys6i9qquoq62ttLOmqK2hpK+psqanqK6mqLessbK3urq8sby9vr7Ev7XCwcfIt7/AxbfEw7+7v8TCvsTIzMq/vsTAwKmHc3RyamldYW9jV1ZYUEhZUlNLRkZFPj5AOjc4OTc3NjQzNzo5OTo8Ozs8PDc7PTs7Ozw4OT44PTs8Njo9Oz89N0E+P0A/Ojw8Oj05Ojs6Nzc3ODg3OTw7PDs5Ozo8OTc5Pjw+P0E7jMKvrry3ucSwtrCbmZWcmKqpsLGztb2vxdDPzMPIurrLwcq+u8m2vcO+usq3wcPBtLa8trGvtbutqKuTZWyIg4eLgHt9f354dH58c3dlX11cXF5fYF5fY2NhYmBhX11dXFpYWVtbWVhaXF9ma2ZkZ2Voam9yhamlq6WgnKKllJ6lm5iRoaOqo6Ogpaanpq2gnZykpq2ysLa3p7CsqKq0q7S6sba2rra6sq+6urG2paCkoKaxp6uouaqkp6eop7KtoKemn5ukpqyen6ekoKGxra2ssrSztLC1vLa7wcCyur7DwbK5ucOzwb2/tbi8vb+8wsfEw8O+wMSgg3hwbGJmX2tvYFVZXkhOZ09UR0VLRjw9Pz06Ozs4MjU1MzY5OTk7OTo6PDo3PD88PDs8ODg8OTw6Ozc4Ojo8OTg+Oj89OTg8Ojs9OjY2NzY3ODg2NjY7Ojo7OTo7PDg1OTw6Pj5AO43ItbW9uLrAur22oJ6VnaGmurars7O7s8TPycvCxri2x8DMv7jJt7vFuLPEuLO/wKy1vLKspa+zraGjkmlxhoWGgHx5dXNvbWpqaXBpXmBdXFxcXl9fYWNiYGBgYF1cW1xcWFlYWFhWWFteX2RjYmVnZ2dqbW+Hnamgl5abopaco5mWjZ+ho6ecoKCkpaKnnpujm6CrsK2xtqOpqqqsrKS0ua23sKyzta6zta6wqp+en6SisqSmqbitoqamoKisq5mfoJ6ZnZ+lmpmjnJudr6mrp6qsrK2xsrivuLm7sLa8vLqrs7O5s760trKxtrW/tr7AvcPBu7u9l4R6c2xfZV5kZFhUV11JV1xLUEdJSkdBPD8/QDs/PDA0NTM1Ojs5Ozg5OTw8Nz4/Oz07Ozg4PDg5ODw3ODo7Ozo7Pzo9Ozc4PDo9PDc0Nzc2NzU3NDY2Ozc5Ojs6ODo5ODo7OTo8PzuJyba4vru3wcHBtKSkmZqkpsCyr7astLfGz8jIwMa7u8PDz766x7i4v7eywrSxu7yrubqxop6pq6eXnpBtfoWGf3hybW9ta2JeYWZmXV1eXV1dXF1fYGFiY2NiYV9cW1taWllYWFdXV1hYWFpeYmRkZWZmaGlrcY2nnZSVlZuYm6KXlpGcoqKonpydpaeipZygoZuZrq6urrKgpqKuq6eitbGysqyor7OnurOmtqCin5yjoa2joqq1qqKjpp6lpqOWmZ6XmZudoJqXnZ2dnK2iq6ekpKatq7O0qrWws6uyubSvqq+ysrO4s66prK6yuLG7trq9v7ezsZSFeXVmXmVeW1lWU1pVS1tRS0lFSEtJQj0/QUFAQToyNDUyNDk5ODk7OTo9PDY9Pzs8Pjs3Ozs3Nzc+Njo+Ozo4Oj07PD06Ozw6PTs4Nzk3NDY1NTQ2Nzg1Ojo4Ojk5PDg3Ojg5PkA6gci9t72/tr68v7OdpaOYpbHCtba9rbS4wszIxr/FtsHAxs63wMS9s7m5s7+2sbm7rLK0rZ6apKmflJqPeH+DhH94b3F0cWhlY2hkY1xcW1tdXVxbXmBhXl9fYF5cW1pcWllYVldXVlhXWFdWV2FkZWNkZWRkaGp2oZyTlZCVl5egl5mVl6CeoZ2WoKGppJ+fqZ2cmqunr7Crm6OkuKqhoK6otqqnp62xpLiwpLego5uZmaqmoZqsuK+ioaScop+gk5ShlJaWm5iXlpeclZ+qnqmkop2jqqqwrqi0q6qnrbOwpauus7Gwr66vpqiosq2xtLC8tLm3rqOUgXl1ZF5hVllYU1JUS01eTE9LR0dMTEU9QT48Qjw7NzY1MzQ5ODg5OTo5Pjo4Pj47PTw8Nz49Njc2PTc7PTs5Nzk7Ozw+OTk6Ozo4Njc2NTQ1MzEwNDU2Nzk6ODo5Ojo3Ojs5OT1AOnbAvLS5wrG+uLyunaeoo6q7wL3Aua60uMHMx8XCw73FuMjLssHCwa28u7W7vLW5ubCvsKmbmaGolJGKi4CAfHdxaWxydHBoaGVkZmJcXFpZWlxcXF1eXVxbXF5cW1xZW1taWFZXV1ZXWFdXV1ZbYmNiYmNiY2RmaYGWk5aMkpSUm5mdlpacoJyflqCfp6akpqefnZ+moKqvpp+ipLeooaGiqLSipailsKWxrqy0nqGdlZWpoaKUrbGxn6KjnZ6Ym5OLoZSRk5iYk5eXmJeep5ynoaKapKWlq6SlsKelo6urraaprq+uq6iqqbOmpqyvtLGvvLWxr6+gknp3cmVhXFpdWE5MUkhSYU1WUE9KTU9FQkQ/OT02OTo3NjQ1OTk7OTg4Nzs4OT0+Oz47PDY5Ojc7Njs3Ozs6ODU6Ozo7OzY8Ozg4NDc3NjMzMjEuLzI1NTY7Ojg7Nzg3Njw7Ojs7QTh4u7uxtb2wu7G4rJ6lp623u7zBxbqxubXEycnAw8bFx7bFxLLCv8Wrt7e9tr26urWyq6ynmJifo4uJdImIfnZuY2FmaWhmZ2lmam1gXVxbWlpaWlxdXFtcXl9cWllbWVlaW1dVWFdUVFZVU1VSVWBgX2BhX2FhY2VqgJSTipCOlJOUnZWWl6SZoJedoKWiraalpaOjopyqq6Wan6WxqqChnqWrnqiinq2sqamuraKiopWYo5uckKupsJygop+el5mTip6RjZKTlpCYmJScoaOdpKGilaCipKabo6uloqSqo6uupa6yqaalpqa0pqmorbO1tLm6r6msnoxycW9gW1dWVlJHUU9IWltPUkpUS1NMRUZJRDg7Oz08ODY2Nzo5Ozo5NzY5Nzc6Ozo9PDw2Ozw4PjU5ODo4ODY1OTo8PDk3Pzw5Njc4NDUyMTIxLi4xNDI2Ojg2OTg1OTg5ODk7OUA5e7W0rbS7srCrsq2dqKevubmzwMi6tcCvxcjMusHKzMi1ybyxvsPIrLG4wbW7wLu0tKqsppWam5yIgHKIg3t0aWlqbGdqa21ram1lXVxcW1tcWlhaXVtbXmBgXFhYWllYV1hXVFZWVVRVVVJTT1FZXVxdXV5fX19iZG2OkISRh4+Rj5qTlZOcm6Ocm6GpqauorKeppqSZpa+llZmlr6qgnJmboJ6vmZyrs6Clpp+jpKGVk5uWlpKpqq2anJ+hoJuUkIyZjoyRjJGNlpWQnaKgo52co5WboKOhl6Koo6Koq6CrsKStt6WjpKKtraqoq6+zt7O+tbKrr5iFdHNoW1lZU1VSRVhMUVtYTVROUExQUUlOSUI9Pz9BPz03NTc5OTw8OTg3Ojc5Ojs8PT47Nzs7Oj02Nzo7ODk3Njk4OTo2Oj05OTU3NjU3MDE0MS0rLzQzNDk4ODo6ODo6NzQ4PTg/OX6zraeztq6oqK+um6morLe2rLzKu7a/rMvGxbjBzs/Is8S6t7vCyLCtuL+3vL27s7WmqaCWl5iXh3p0gHZ3bm1obW1tcGdnaWdkXVpbW1tbXFtZWltcXF5fX1xYWFlYV1hXVlVUU1VWVVVTU05QUVlaWlpdXVxeX2BkfoyBi3+LkIqSjZeRl5mioJugq6qmr6yosKWpmp+toJWWpKmonZiQj5qerpeYqKqZn52UpaGekpGSkZOVp6qlmpmZnp6WjYyLk4aJjYOPi5KVkaCeoaSYlZ+VmqGinpSbpaWnqKigsbGmsbynn6Ostauup7C1sLi1wLGtsauRfnJzYlZUVU5SSkdWUFJRTExXTUpMTlJHTUtBQ0ZEQz5BNzU4ODk7OTo3Ojo3PD06O0A+Ojk7OTo/NzU5Ojk4NzY5NTg3Nzk7ODU1NzY2NjEzMjAtKi4xMDI4Nzc7OTk7ODk0ODs4QDh/s6ylsbeqpaKxq52qp6mysaS2xrS5urPKxbm6wcvQyrG2uLu9wcOxr7G3rbSzu7OzoqOcnZeXlIN/d2tnbG5xbnFqcGtkZWdlXlpZWllaWlpaWlpaXFxdXFpYWFhZWVdYV1VVVFJTVVNWVVJOTk5SV1hZWVlZXFxdYWqAen91iY2HkIqXiZSUmJuZnqmboKumpqyeqJqgppyTj5+jm5eXhYSSm6OQlaOdlpaWiKKbm5SLjoqQmqSnnJWVl5uRkoeUjouBi42AkIqSkpKgmqCilpSYmZWippmNmaSmqKahoLSyp7K3oZyit6yqraSysqa1vLWsq7GjiXlzbV1OUVFMT0NNTk5QS0ZOTkpKTk1RSE1KQUdLSEhDPTg1ODg4OTo7Njk6Njg7OTk+PDg6Pjk7Pzg3ODk6ODg2ODU3Njg4OTc0NTc3ODIwMzAxKyktLzEyODc2Ojk5OTk4NDk4OEE3d7ampLawpKekqqWgqKals6qissO1tbKzxsa3usPKzMazrLq9tLfAr62psJ6mrbqvrZ+Zmp2VlId7g25fX2ZycHVxaW5pZWdoal9YWFhYWFlZWVpaWVtbXFxZWFhXWVlYVVZSU1JQUVRRU1VRTU1LTFNXV1ZYWFhYW11hb3N2cISIgoiAkYSPi5SRlJ6hj5uco6KkmaWXopyVjYeZmoxzjYN+jpeWhpGakJSOjnuZj52Mgol/iZifo56Qk5iWhY2ClH5+dIqOepCHk5CQnZuampKWkJ2Oo6OOiZqgoaOkm6K0r6yvrZ+YpbimprGhsK6csLuqqa+qmYN3c2NWTVJPUE5DU05MUUxCUFFISU5STUhKSkRKTEZKSj03NDk4ODg7OzY5Ozc6PDk6Ojs3OT85PkA3OTo8ODk3NjQ0NDU4NzQzMTI1ODUvMDEwMikoLC0xMjc2NDc4OTo6NjU6ODdBN3i3oaO0qKalqKOmpaemp7OnpbTBuLC0sMnEt7nBzsa9s6y6wautw62noaaSnaa2rKOfj5WWko9+eH5lV1ZfZ2ZpZ2huY2poZ2JcWFdYWFhZWVlZWVlaW1tbWVlZVldXV1NUUE5QTk9PUFNUUk1NSkhOU1NTVFVVVllbXWlscmx/hXx0TlhykIOXh46dl4uUkZ+YnZWUlpWPlomAk4pfO1dvfIyUiYCMkoyQhoZzioWXgXmBe4aTnZODlY6RkIOGfZN4cXCFjX2JgZGNj5eamZOLkImdiJ+YiIeWnpqhoJenrqmtqaielq2zoqatmayrmKizoqmto5N+cm5gW05TUldMRFRKUExMRk5PSUVMUU1LT0pJTFBGSUk9NzU5OTk5OTo3Ojs6Pj44Oj09Nzo/OD4/NTg5Ozc5Njc1MzMzNzYwLi0vMzQ0MTEwLy8oKSsrLTM4NTQ3Nzk8Ojc5Ozg2QTl5t6CjraGmpqqgp6moo6qwqKe0wbmwtbDHwrezvc+/ua+utcKnqsWpo52Yg5SbsKKZl4aUj4uHfXN1XVBMUlVZWlddXmJnY19ZV1dXWFhYWVpZWFlYWVpaWllYWFZXV1VTUk5MS0hHYlxNT1JNS0hGSE5RUU1QUlRWWFpgbW9pe4J0UUJAf5WSkn2JlY2Eio2bjpaViZKIhpWGeYl/YEpRbniLkoR9hI2KhX9/bn5/lHh1dniEjZlvUY2IioZ7fniUdmd3hoh9iomVi42RkpeMhIqIlYSajIKEkpqWnp2UpKOoqaWknpqwq6GkpJGmqpaiqpyipqiJdW1mXltIUVFTTUlVTVNJTEtPSUhGSk5MTVRLUVBPRklDPDc2OTo4Ojs7ODo7OD4/OTk+PTg7PDY7OzQ3ODs2Nzc1MzQ0Njk2LzMvLjEyNTIyMS8sJykrKiw0ODMzOTc5Ojk5Ojo6Oj85d7abo6edn6GvoaeopaeosK2qtry2t7ezwbu2p7rIuLaoqLW2qrK8pp6VjX+Jk6iWlYp+joOCfXhwblhNS01OT0xNUVdbXFpYWlVVVlZWV1lZWFhZWFhZWVlaWFhWVldVU1BNSkVAQJtrc3NJTUtERERJTk9oWU5RU1RVWm6DdHd+amlcVY+JlIl0f4eBfIWMk4KSmouPe4aPgHaAeHNvdnB0jY6Ben6Kq4V5emh2e45wcm14gYuNknh6gHuAdnJykndodYSEhIV7lYqIio2LgH+Ei4yAlIN8gI+YlJyWkZ6dqZ6foJ2gqaWfnZiMp6SToaCWnp+kgHJoYVxdSldQUkhKWFJPSkxNUkpKSkxQSExRTFJUTUVIQTw3ODs5OT49Ojs8OThAPzo6Pj03PT03OTkzNzc4NTY3NTI1MTQ3Mi8yLiwvLzIwMC8tKygoKS4xMjcyMTk4Nzk4Nzc1Ojw7N3aumaOimJyftKmvqaWtrLCyqr20sru4trq0sZ+3urKqnZ2sqaiyr6GakY2UgY6cjpF/doZ4fHZvb2lYS0hJSEdFSEhQVFRUV1dTVFVVVVZXV1dYWFhYWFhYWVlXV1VWVVNQS0Y+OTNOPH6eTUhKREA9QURqlH5MT1FRU1ZedYN8eGZ3jZeYjY99aHmBdniAiZB9hJiSgXKHj3x3e29rfq18c5CKf3uGkoF9f3RmdnyGbG9oc32JjIiAbHlxfXFtdo9xaHGBfo5wQ4uEgoOFf3d3eouFfYx7dX6Oko+YipKam6OWmZ2anZ6hnJaNiqSbjp6XjpaYkHdvbWViWlhYVVFKU1VUT1BOUFZLTktOT0pRTkhPT0xGRDw7Nzk7Ojo/PTk8Ojk5Pz87ODs9Nzw5OTk5MjY2ODU2NjMzNjExMjI0LiwsLS4uLTAtKyonJyouMTM2Mi84NzY5NjY1Mjc5OTV5ppegnpagpq+srquoqbGvsau8uKy7vrmzrKebsKesm4+WnKWppKCXmY6FknmIjouKdXF8bXVwam1qWEtGR0VBQENESUxMTVFSUFFTVFRUVVZWV1dYV1hZWVlZWVlWVlRTUUtENzhmNzA/qGlOSEM9OzpEioV6WkpOT1FUWF1lcHJtiKeqwH51eWN8eG98eYiQen2Lhm9tjJJ5dHhqaoCCcZaRi4F+loBJk5huaHd+gmxpY2x5hZCShmtzbHxucnuGaW1wf3ONiYSGe31+e3ZvdHOFgnmBeXB8joyKlIOWl5iakJKVl5mXnZaMg4mekYuSjYaQloBvam5vblhWWFRSUVlPUlRUU1hVTU5ITktNTktDSE5HRT86ODk7OTk6Pjw5PDs6Oj0+Ojg6PDk/ODY4NzI3NTY1NTQxNDMyLzAyNCorKiotListKigqKCcsLTEyNTAsNTU2NzQ4NUhBODk1d5mRm5man6WtsKOsqqi1r66stL+rvMK/pqKZlaSXno2Ei5ShoZiYkZOLc456gIaMhXRvdGtxbGRsallORUZDQDw+PkFGRkdLS0tNUFJSUlRUVFRWVldXWFlaWVlaV1ZUU1BMRTFAmjMganNDmW87PDk1PICChl9JTU9PUldaUVlcYKeIYpppdHplf3Btf3qLiXaCiIZ0bJqRdHN8amudj015hZKJhI5nMXaGc2x+foN0ZmV0foSEhYBmaWx1a3F/fGhxcXxuk46PfHN9fHFwbnZtgn93eXVqeYmCiImElpKSkIuNkZSUjpeNgHmIl4iGioaAkIh3a2tvaGVYUVpXWVlbTVBVVllYTklIRUpKSEdCQEZEQ0c9OTk4Ozk6OTw6OTs6OjpAPDk6PDk4Pjc4NzcxNTIzNDUzMzY0NTAzMS4qKispLCwrKykoKycpLCwyMjYsLDU3NzU0NzhpTzg7NW6SiJqRmZakqK6esp+nu6+rsrDCsbvDx5qWj5SZi46GeYSQmJSNkIyPhnGHgnSHjIZ6cHJwb29kcGZfVEZJQz88Ozk6P0BBRENFR0lMT1FRUVFSU1RVVlZYWlpZWFZVVFNQS0U4MC9cYLNHOVhQOzk0NDGWuotITE1PT1FWTEFJUUlir7Ogcnx4bH1tcoOChYF6hIaGeXKhlXR4gHN1lIc1cZ2onY6hoYSihHZwhnyHfHOMrY2JgGdnYmpucm1wg3Vpb1h1cI6bkndsf3p9bXJucIB6c3ZuYnaDfoaAhZCQioqJkYuRjIuOg3V4io6AfoOAfY97cnBwbGBbXF5cWVhhX1JOW1pYV0xISkZKRz5CQUJHPkNEPTs5Nz07Ojs7OTo5OTs6Pzw4OD06ODs2NjY1MTEyMTI1MzQ3NDUzMS4vLCwrKSopKSoqKikoKikrLzNETTIxNjY2NDM8dlI3PTdikoGTiJaRnaSnnq+VpbWqrrGuwbK7wcaWkIyUj4CIfW6BkJKJg4qHj4V1goRslYiIe3R4eGx3bndjaV5JUEc+QDc0NDk7Ozs9PkBCRUhMTExMTlBRUlVVVldYWVhWVVRTUExFPDUqnUtbQC1nSTk0Lz+Sg6muX0dMTU5QTDdDTVJTREqGdoB8fHZ+bXeIiHx+hYN/jH52opl5foaBhZmEm5xhhqqfnYuDkI16d4h+iYiNc4qXkIN6XWRydHp8d4ptaGpieW+GkIJ6boF3dIR6cHR5d2tuaV13h3yHfIeHj3+LkpeDjYWMhn1xhH+DfXV3e3yJd3BzdGVnX1tbXlRcZ15XUVVYW1VHSkpETEc/RkBEQz5BQT06OTc8Ozs9PDo6OTk7Oz0+Nzk+OTk4NTY1MzI0NDAwNDY0NTU1NC0sKSsoJycnJigoKSkoKCsrKy8wMFVxPTIzMzMxRX5XND05XIx4ioCUjJKcnZ+mkaCroLGor8CxusW6lo6RlId6hXZrf4yRgn2KhI6MeIOAc6GEi319gX9wgH56Z3ZrUldMQEUyMTEzNjc2ODg6PD5BRUdGR0pLTU9QUVNUVVdWVlZUU1BNRkA6Mj0gI5ZjjFs1MzExaT9Hb0lGSUxNT1JMS1RdWVJKaYSIe4l5fHJ8j4x6fYmHfpeHdqGZiIePkpSljaypSIaur6+LgYCTioKLgYSSqIeAmJiKm3RtfIGGh32OaGdoeH9uhYeChXGEhkdsgHdyeXZobWtfd32DiX+IhYt6lZ2biYuIkX96dYt2fHhtb3d9f3R0cmxbXV1bY2NYZ2ZcVU9QVllQRExLRk5JQ0ZDQ0FAQ0E9OTc4Ojo6Ozs6ODg4Ojo/PjY7Pjc1ODU3NzMzNDQyMzY2NTY3Njg7REZMTU1MQzcrIiUnKykrKywvMDArbnUyMjQyMEyBXDU9PF6EdHx9iYWIkY+WmJKXoZ2soaa4r7O8s5eNkouYi310cH+Jkn59jIKSlH2Gfoakh4h/goiFeIeIfnOEeF9jV0tCNjAuLzIzMTIzNjY4Oj0+P0JFR0hKTE5RU1RVVFRWVVNRT0dDPzgwLCOHWz4/ODQuXZZwc6NVRklLTU5QV2BZcFpcXmqNk4eVgISChZGTfoWIkYGalYKhoZiVm5qlrZOau7Gnu8fDqIuMoaWPlImBkXxxg56fkZx/doWFipCIkGlob4OAdIyHhItxhYJ3h397doV9bnZ1ZoCUj4aJiYeIh6GqopaJjph/eoKJenlvZ2t4fnp+cmpkXlpaXWpdYWZgWU9LTldSUUhQSkROR0NKREJARERBPDo4Nz08Ojw6ODg3Nzg6PT04PD02ODY1NjYyMzQ0NDU3Njg2NzxCQj88ODo+Q1FeZVxHMicmLCwtLS4xKD+LWy4zMTBPg180PztudXBmeIN7gIyAgZGOipqbpJ2hrKarr7CXkZGEoZSEeHd/jJR8f5KGkpV/ioCSm46DgIGMi4KJjYN/iX9tcGpdQkE0LS0vLy4vMDIyMzQ3Nzg7PT9CREhKTlFSU1JTVFRSUE9IREI8ODcvOUQ+PDw2My5sk5dNUEhJS0tLTlZgY39nZ211nZqPmpOTi42OmoiTj52LoKCSo6qlo6yTqLaiqMHDrseveLqUmnyNoZ6ZhJOFgo+hn5OYkoSLhY+ZkZZscHWJi4KWjI2Pd4+EcW2FgYqWkYOFiHKIoZaHk4mOj5altambjZWig4eTg31/a2prfICBgXNhXWNeWmZrXGxrXldLR09TUU5NTEZJUENETUZBQ0VHQj46OTc9PDo7Ojk4Nzc2Nzs6Nj06Nzg1NDU2MzQ1NTY2NjY4NTU2MzEwLiosLCkoKS46UGFcQCwoLSsrMCwncog3MjQwT4RiM0A8dW5nWXCCcHWHcXaShn6XlpqVnp6cp6CplpOYnmdlpJp+hJKReYCSiJCSfYqEmJKRgoCAi42JhZCGhIiFeHh+Z01SPi8uLiwvLi0vMDAwMjEyNDU3Oz9DRU5QUlRQUVFTUU5QSUVEPjs8OkNGPz48NzUyPD9SNUhISExMTU5SXm+KfHOBfaCdnKilopmhl6KVnZ+onqiroKisqaq1l6u/q7bIyLfJ0c++m6Bwaaupn4STkoWcoZqbmaeRkYmVopqaeHp+lJiSoZKWmIGUnnt3lZKrs4iNl599lJ6cjpOWmaSiprawnZGZqIiWj42BiGxzcnx/fHFoYFxgXmJnY2BoZ1tSRUpLUE9JSkxGRk1DSExGRkNCR0VBOjg1PDw4OTk5NzU2NTg+NzU9ODQ3NDU3NTQ1MzY5NTg6NjE2ODYzLzAuLSosLy4tJyMqO1hiQigqLDEtKEuXXjA2M1GFZjJBQGlhXlBwdWBufWF3jn17lI6Oip+Sl56Wm6qYnqpCRH2HiYeYjXiCjYqOjXyKho+QjoGCgImMioSShYOGiYGAhndfYlA0NjAtMS8sLjAwLy8uLjAwMTU+QUFNUVJTUFJTVVJOU0xFRUA8Pj1HR0BBQDg2NjI8OTtGSEdJSk5PUVlthpB3lYujp6q0vbikrqysp6i0q7C2srKtu7Gzvpyzw6y7ycu3w7+4paOwsqytqqOLlpiFpqago5eBppmNoqqopIiFlKShoKqhpKmPnLGLlaOnt7uboKOwk6Odo56RpKKrr62ztaKUpKqImYmSipV5en6FfmdgaFxlYl1kY19mZl9aT0NJSFRPRkhMRkpHRUZIQUtGQ0ZGQTo4Nz08ODg6OTc0NjU4PDU0PDc2OjQ0NjQ0NzM5PDM4PDIwMjU1MS8xLi0qKi8sLSooKiYlNVhYLywwLCwwhIE4NzFQhWg1QUNbWFRMaWNXanBYeoV2gZOFiIKbg5KRjJLayJ2Wc1aXiI+InI98hoyOiop6h4KHkY+DhYCLhYaHkoaChImGiIeHcW5hQEU2NDwyLzExMC0sKy0xLi0zP0RBTVVRUlNVVVdVTltQR0dFPD4+RkhDREA4Ozw1Qzs9RktJR0hST1BXgZOghK6js6qxwcfDqrPFtqyzv7O4vra/tMG2u7ukuMaotsnHtb65tKijtK2xsZuZkpqfiaivq6WUdp+kl6GrsbOZlqqtqK62u7K6rK+1orGssbW8t7WutaCnp6OomqmwrbK6uLinm7apjKWOkZOfhniCg3VZYWRWZWFhY2BhZl9bVEpERUxVUUhJSkRJR0VBQEBLREJNRjw4Njc7PDk3Ojk4NjU1NTcxMTw4ODk1NDY2NDk3Pj0zODkxLjAxMjExMzAsKiwuLCsrKyooJyopRVowMCovK2iSTzYwUodqNkFGV1FKTFtaUWNkV3l1cYGUfYWHk3aFf4CMe7+7o7yCtJSTjZuPhIiPkomJeYaAjJONh4SBjn+BiY6GgIaJhYqHkXp4bl1WQEVNPDY6NDZBQjc2NC8vNkNIQ1FbT1FVV1VcVk9eVUlLSkFAPkdLRkVEOz5AN0Q3P0JKSkVGV1RQXo+lrqOxtMO2uMHMyba7xL2zs8C3t8G1v7C3dLGzprrFpLDGubGzsbSopLW2qrGgoZabopKlsK6mraunpJigrLO6oqmyurS7vsy/xcW9vbPCt7q4v7e6t7msrLCmsaqtvrC9u8LCrJm6qJSuj5eXq4l9gnxqV2JhV2plamVXW2RZVlRJR0dMUUdDSElBSEQ+P0JCS0BATUM5OTY2OTo/Njo5OTY2MjQ2LzE5NTk5MzY0NjI3Oz0/NjoxLi81ODo5NjUwKigsLS0tLCwqKCgrKyhFUy8qMDBKj2s1MlCHbTY/RlJMQUxSV1RZVVp2anB/j4SBjoRuenN5h2K4oZmjiZWTlpOUk42QlpKHhnuGgY2WioGEgYp6fIqHhnyKg4GKg5V9eHp1ZU9cZEdFTDpRY2FbXlNGPztIUERaY1FRWVhaZ1lUYGBNU1BFQT9JSkhFRkFAQzxFNkI+SEdKTFNaVF2Tr7i1urnJv7q9ycy7vMG8t7W7u7e9tLqxxmF1sqWxmp6qvaqlqKuqo6KytaGrqJ6Vlp+Yn66lp6aln6OUoqaxtKeysr22wb3TycrTxsLFy8HKw8C+vb+7vLe0sLm3tsO6xb3DyLCeuaqiq46lqLaJgH9xX2JiXVdhX2hmUlhhVlJVSUVFTktBPkdEPUtCPUJAPUY+O0hANzk2Mzc5PjQ4OTo1NzA0NS8yNjM4OTM3NDQyNj84QD5HS1JUU1FQT1FRUEpBOS8sLCwqKygoLC0sL1A+KC40OIB9PDJLiHE5PkNLRUBJTVBSTFFdZ2xscZCNhZBzbHJyc4jVwLWZoI2VmJmRjpeSlpaOhod9hoOMlop/g3+DeHuLg4d7i3mBioKXf3R9emtlcHVZXVxQZWViYGVkXVtYV1xNZG1VUm1tX25fWGdlVVlVS0RBS0tIRklISEdCSTlEP0hLVFRWXFpbkrnAub23xsC6uMrLure6tri5sre1tK62tplkdaicrXBeoa2cmKCim6SeqqWUoJ+QlI6WmJeon6WfnpqahKSdrKWqsKy3sL251NHP18/JzNHMz87KxsC+wsq9wbzBwMTExcq/yM60pLuwtK+bq7m8mn95bF1gXFleYVljY1FcYFNQS0NCRUdFPEBFPkJIQkBEPTpFPj1KPzQ3NTM1Oz00Njg5NzcwMjIvMjQxNjk3NzU1NTVEM0VMTT41MS8wMDY6NDc3QElPSTstJioqKC0uLyxATSsvNTRtiUkwSIl0Pz5CREBDREZLT0RSXFlpX3CXkpCUb2xvdXWHs6yhoZ+LmZyZjI2VkZuShYqKfoiHjJCLiXyBhHN7ioOFe4l0gYmGlX9ze3hrbXV7aHJlaWxpZmppaGBmaWhsWm50l62kvIiHZ1tvaF1aWlRIS05PSktRS1RRSExBSkdLUF9eYmZpYZe3x7C5s7u+tbHEx7WwubCwu6uysaeqt6yNtqedm6eaT5qdjI6glpGmmKWVipOTiZCJj5GRnpuhl5qVloeemqabrK+or6eztNTU1NbSy8/U1c7Tz83FwsnQv8rJysnSx8zNwtDSuLDDvMS5pba6xKKCbmNcXF5YYVhZZVpRXVdPT0JCSEVCSTtBRD5BRz8/Qjc7Qz5ASD00NjY1NTs6Njg3NjU0LzEwMTQ2Mjc4ODc1MzY3QzVCOD8tMC0xMzQ5PTk3LC4sMTtGSz0pLCguMDAwN0s/LTQ2VIhXMESHd0M7Qj5FQkFDSk0/VVlTZVdzkJCYgmhxb3l5g6CqnqaXjJubl4uOlZGajn2Ji4WOioqLkId8hIJwf4iBhnuHcoOSi49+cXh1a3F4fnF7bXhzbGmBcG1jaW5weGl3fH7Lv8Lfp21jeG5jW2FgSlBSVU5ZXlBeXU1QTlRRVVRcbm52gnKXrbistKewtqusvMCxq7WmpLimq66hq7SjjrGumpiYjJGTkYSOm4GNp5KciYOLhIqJhIuDk5WYl5ObkZyYmZmenquspKehrK3P0tXRzczS09TQ1NHOyMPU0cjN0tPT183S0cXS1sXAzsfHw6i+t9Ceem5lXWJdV2BTXVtPUFRQTkg+QUZBQkU8QEI+RUQ+QD86PT08PEpBNDU0NjU8ODg4NjY0NDEyLzAzNTI2NzY4NTMzOz08RT1AMTErLzI0OT41OTAxMDIyLTJETjMpLzMuMzI9TjIzOEN9XzJBhnREOj09ST5AQ0ZIPFZSTU9bdYaFindsd3B9fn+hnp6hi42Zk5OMjJOPloV5hY+QjYuKiJGHf4J7cn6AgYd5hHWFk5GJf292cmtzfHt3fHOBd3FrgHNyaG9xenlye77Lm36MsoN2coR2aGFqXUNaWltXZmRYZWtTWF1dYGReY3h7fouBmaqkpKGgoaimqrC4qqW0o6GtoaOtoqexn4mmmpSSkYmRjoiBlIlrlaKNmYSAhX2Rg4OTlq2LlY2VmY6FkpCdl6ewoaChpKSoyM7PyMLL0dTR1NPO083G1tLM1NjW1tjU19XJ1NrNydfX0cqsxMPLi3NvYmBfWFRaU1xQSkdJSUpAOzo7RUJEPEJEPkhCP0JDOzs5PDpHQjQ2NTQ0PDU2ODc1NDMyNTAvMjU0Njc0NTU0NDw+PUU/QTYyLy0xNjs9MDgxLzI1NC8tLTtSMDE3LzUzMkZEMjg+bmI1PYF0TTk5QEk8QUQ/QTtQTEZLWXCAdX1oc3hygomAnZWdlIWLlomPioiOh49/eISUmYqNiIiLiX6CeHN7fYOHd396h5GWgINueHBtdX92eH50hXx5bYd2dG59doR1eXudtow8QYvGpX6NfGllVklDZmNlY2hqZG94W19maWtuaW6Ag4mRi52eoJ2Ql5ifo6SmsqSks6ChpZ2gqaCisZyGnpKSkpCLjouGg5CEfpybjI2DhIV6lH6CqZWjjJKKl5KLfZeKmpGqs5iam6ecp73Dxrm2xs3S0NLQzNLLydTO0NXa19fY1NnYzdjbzsna2tLVv8vMtHh2bmRdWVJWUVpWRkdKSkVFPTo3OUBBQjpIREBFQ0FEQjs/Ozs3REM3NTY1NTswNjg5NDQzMzQxMDE0NTU4NzQ0NDQ5QD5EQkM8MzMuNkZUV09RSkFKRj8xKiguQlMzOTI1NC83Szc1PGBiQTxzdlY4N0FIOj9DPjw5UUVDSlRsbm9wYXFxc4aNfJeRnYt+h5KCiYaFioGHfHiFlpaIj4OHhYd6hHlxenuEhnV6hY6NnXqMcHxvb3p/cXyBcYOHgW6OenV3fXyCdX98h4iwdFmpwraMkoJwbmI9XmhycHFwbnh3gWVpb3J1eHJ7i4eOlJKblaCVh4yTm6Cbn6qfoK2coZqZn6Wen6yZi5qMkZGNhH2Ih4OFi46gmZOIhId+bZl5hJiGiJOMjpSMhnubiJOPrqqUlZeemKeutb2prb3Gy8jJzMvPyMPRytTW2dfY19Tb19PZ29bP29rR1snUy5V5e2hoW1lQUlReSENFSUk+QT49Nzo9Pzs+SD0/QUFBREE+Pjo4NkRCNzU1NDc5LjU2NjQzNTUzMjMyMzY0NzU1MzQ1N0VCRENFQjU2PEZOU01bbmZjbnNrYVY+LDRMRzg2NTQzNEJGND1XX2hMdXheODs/Rjw8Qjw6OUQ/Q0dSa19tZGJma3aAiHGRkJqAeoCNfoKCgYR+g3x8hJeOh4t+hoaAd4J5bnt7h4F1epKejaB2j3WCdHWBfXSAhG+Bj4JvkoR0fIGFenaGe4m3xqXCybeBlpuPd3BlTmZjgXqBd4aikIt4eXd7g398hHZulJaUlY+YkIOKj5aal5emnJegl5+TkpejnZmrlpGQio2RgoyFiYiBhZCRnpyZiYWLgYaYeomJn5ePiI6Ki4J8oYmQi7yhmJOXmpyppqWun6i1vsDAucfJzc7FzcrR1tbV2dXX29TX2drb19va2djO3MaGenlnaGVgVFdWVU1LRE5EOzw9PDk6PD45PUA2PT9APD8+PDk4NjdDQTY0NTU9ODA2NjU1NDc3NDU2MTM4NTQ1NjQ1NjdISD1ESkU3OTI1O0g+Ozo6N0lQXVpSVVhLOVQ+Ozk1MzI3STg9TllNSHh4ZDU9PkM9PUA6Njo+PkBFUV9ZZWFdW2h0enlsiY2Sd3Z6i3x+gH5/fIV7foGRiYSFeoSIe3V9dG58fYZ+dH6SnZGeg5J8hn54jn15iopugpqAdJiFfoGJhXx+kHqPqY+Qw6C8jJyjnH2JhH2Jc4yKfnOmmpyYlIV7j5CJhGhHcaGknYyLkJKFiYuQkpWPnZqTlZGXjYyVn52UoZSSjo2Qi36Qjo6LhIiSlpqfn4mMlJKekYKLgKaZiISOg4aEgKWGiou4mJ2RlZaip6Gdnp2jrra6tau/xsrQyMfMz9PS0tjS1dfA19jZ29ja2tnZ19y3eHh3a2lkV2BbVFBPSERMQj09Pjk5Ojo5OTs9Nj8+Pjw9OTo7OzM3REA4Mzc4PjcwNjg4MzU3PDM3ODA0OTc2NzU1NTQ2RlA1RE5JODkzOEFLPTszQ0BJPDlEV048TVRITj85NjMzMz5DO1tYPjVZeXBaPDxBPD0+ODU4OT89RFJTUlheVVhmbW1taYGOinFyeYp7en98f3uIe3x7i4eCfnWDhnlzenNtgX6FfXeFm6GbnZSSgIuIf5iHgJySboeohXqgi3yRjoOIhJx+mpGKjaOin5CkrqCLkYuFi4GShldyrYufq5uPg5ibkJCOXIKikYKMn5OVjIeIjJKTjJSUlI+Mj4qIlpudj5WWkYuSlIaAi4iSjYmKnJaZo6OGkp2WoYuKiI6ckIOIj4CDh4WkhoyQs5idkpSXoaGemZKcnqexuKylvMLHzcfGz8zPzM7Xz9HUrtbV2NrY2trX1tnan298dGdnXF1YU1dYQ0BJRD4+Pjo0OTo7Nzo7OjM7Oz89Pjc7OToxOUc9OjM3PUA1MDY3NzI1NT82NTs1NTg1ODo1NzczNUhSN0dPSzk5ND1FSkI+MUZDTEI5ODpHWEA1SFdJNjYyMjM6RUNlWD8mX3lpX3o+Pjk8Ozk4OjxAO0JRS0tTWVBUY2J4bWJ+koNvbXeLeHl/eoF8hnx7d4aEf3NwhYJ6dXZ2dISDhX1/kqajn6Wilomdj5SXi4qol3KKso2Ep5GEmZOFmYuilqCYk4mbnaGSqa+fkZSQjY2IlYtujbeFmsTIspyhpZucmJaRspFkpM3Hlo+Fh4mQko2Nk5SKhYqKhpaam4+QlJOGlZeEf4+LmYiNkKqXl6SjiJmelpuJj4eXl4qEj42Bf4ePpYmNk6mal5OWmaGZn5mTnZujs7Slo7zBvsfFxcnIycLK08zN1KjS0dbW1tja1NPazoJyf2hjX11eTkpUWkJBR0Q7QT04Mzc7PDo4PTY0OTo8OjgyPzk6MjlJOj42N0JDMzI6OTYyNjQ+PTQ7PjY5NDk7NTc5NDRLUTxKUUs5QTdCR0lANjRKRUxGPjw4OEVUQTc+XDg2MjE0OjtFYFhBRmF0aExjWj41Ozo6NTs6PjpFTUZIUldTUkJjgUZ1go99fG1+iHh6fnqBgYN+dnaAg3xsbot/eXx4eHyEh4t9iqOzp6OqsqGWp5+lpJaVrqKDkLiVkrOZjaGgjKWbr6OknZiQp5anma2vpJeUlpSQi5iZlqDAjqTJuKuboqatmJGbnLKdhoWoopyYhYiJjpWNi5OPiIGGh4iTmJSMi5OThpSYhoSRkJx0kZmzlpeloYicmZOPipCLl5qJipaOhn2MmJ6JkJCcmpmTmJiglKCdlZ+bobGuoqS3vrTFx8S9w8O/xs3KydKnzs3T0tDW2NPQ2LtyeXZcYFVfV1BISU5FQkNFNT46NzY6Pzs8Nz00MjY2OTc3ND01PDU8TDw+OzxCQTc1PDs0Mjc3P0A2P0A3ODQ5ODc7PDU1T01EUFJMOEA9RUFHQTU6SkVORUQ6NkFAQlM+OURPMzIzNTc1PXZcPFJcdGlaTV1TPD04OTU2Nj06SkZER05bXFlJZmA7SISLenpuhYZ6fIR4gIWBfnB4fH18b3KNen2Be3iGi4mGg5Knu62osr2vpa2zs6ijorCsipq0nqO4pJWtpJaprbempKOfmamYqaOvsKqamJyUlZGXn5eZu7utyaFptrirsJSYnqOrk5e+o16qsoKJio2Uh5F8jo59g4aOj5SViIeTl4yQlY2LjJeYkp2ZtJeWq56Lm5SSjZCSjJmbipKekIuJlaChjZSNmJqdk5yZnpShoJScnaWvqKGls7irwsjEtbq9u8XHyMLRocbJzc3E19bRy9OhcHpoXVlTXlJPRkQ+PENBQjg/ODc0PkY8PDY8MzUzNDU0NTRCMzo6Qk06QTtBSEI7OkA8NzQ2PEI5P0BCODc0Ojo2Pjw0N1RLQ1VRSjc8OklBREA0QUpITkJBPzZEQTxKTkQvVD0yNTQ6RUpcWEpaUW1ncHBEaWBLSTY3NTc6PkpAQ0lQZUdiYGJwSUCLin6Bc4aHfYGIdYKKg39tfX18f3B3h3eNgYd7jY+MhoyZqsLAr73Gu7O0wby0rauztoyosq6uvKqbu6Sorbm4q6amoqGjo6ivsrGrnZykmJuYl56ipaWSo7muqMC7rK2yuaWkp32Ih5ysvbCDjIyLkIOPg5GPeoGHkIyOnIiHj5eNi5WXlJGalp2nmrGakaydjpqPko6UkJCWl46RoJGJlZujrJSWj5ScnpSgnZuYoKGVmp6np6SipLCypsHHw6+wurbFxMK+zafHw8fDvNXRzcTKiHRzYlxZX1tNSkJMQEVHP0E/Qjs6ND5BPD01PTY+MzMzMjQxQTE3QEJOPkdAQ05DQT1DPTs4NkNDNUJJQjo4Nzg7NUI+NzlWS0RXT0Y4PTRLQEM+NEVLSE4+QUE2QkI/QlNFNThQMTQ1Ozw4O0Q+OUxqal07V1JkS2daVU83OUdFP0NGXGZGYGlnWl1bk4yMiHuHi4aDjHWGkIqBb358gn9xfoF6lXqRlJSYkJOVp7TGyb/CzMHDuce8uq+rubuXsra6ssCupcCkq6+7vKqtq6KinaeqrrSwqpufqpuhm5WfsLSni6K6urXBu6upnLKlpKiUhY6qw8SkgouPh4iEhpWUjXqDjJGOkaGMjJSRj4mXn5eTmZWYpqCunYyqnI6Wj5KRlJWOkJWRj6GUhpefoLKelJqUoKGZpJ+aoJyglJmepqSmp6SvraXAxMOuqLe1ycO+ts6yxL7EvLPRysjCtXR5bVxYXGlTTEhETEtLSkFBPUNEPDVBRDs6Mz04QjMzMjI2M0EwNUlFTT5JQEhSQEg+Q0A7Pj1GQTVBVUA7OTk4PDdFPjg+VkpDV09HOD80TEBCOzVKS0NMP0I/PEJGPUFITDkrRzwzNjc0NjRBPzdPYU9hRS89PjZrbGpgQDpIPj9FQmZaTWVcZlRjapmNl4qMiJKQhol5hpSQgXKAfI1/eIeCgpB5jaGWqJqamLq+yMjKwdLJysLMvMGzrbu+p7q/vbzEt6zBqayyu72qsKmjpaOsrbOttrWgn6+epaKYo7S8qZuovMGjtravq5Kwrausl4aaqqalkYKMk6WViYB1ipJ5hY2SkJ6fk4+Ui5CNlKOZl5yVlKOfqp+RpZqMj4+QlZaIfI+VkpKjm5Wgopy1ppCel6Wko6WenqaYnpWXm6WjqaiisqyovMDEr6Wzt8zAua7Es7u+wriswsPCwJhteWFYV1xbS0tNSkZERElCQkFDSzo0REg5OzQ8N0UuMTIzNTJCMjZTSE48SkJKUUVLQ0RFOkVMQjw3RVY9Oz04OT88ST86RVVJQVdRRjdBOks6Qjc5Sk1CSUBDPjxERzxCQ089MjBIMzY2MTcwPUI6PWpqSks1UVMzU3BwZE47RD1ARj5qSF9YYVpkZFaej52Nl46ekomKf4mfk4R3hX+Vf3+QiIqQf5Whmq6mo5jCvcjDx8XTzc7Ny7vBt6+6vbS8yrzDwbW2vK2zv7m8rq+ooKintq2tqbG3mp6toqehnau3t6mlr77Dsb25s6eqtLOtrpaWpayooJGOkrHFp5WOfJGVfYeRmI6pmZiTk4+TlZOlnpOdmZOho6KcmJ+Zi42Qj56IWpCWl5KWpZllmKOesqWWopasraunm5+ml5iXmZWhpKmmn7arqbq8xLWltLXLwbiptqyyuriuqLi6vbiDbG5aV1RVTkZKU05LP0JIRURIR0c5NUZNOz43PkFKLjMyMDI1QjU1UFZOPExGS1JMT0hHST5JUT86OElTOzs/Nzk+RExCQEhTS0BXUEY6QT9HNkE3O0hNQ0U7Qz00RkU6QkFCRzkvOkEzNjAzPkdEOTQ9dGRNRztFKzpmfGhXOz1AQkZCcUZpSVJlYkxGpZSclqGXqZaNkIOHppOIgYeCnISDlZCQlI6aop+vvq6hxr3FxMbGzs7O0sq+u7Wxuru8vs62xL23ubeysrWzuLOsppyrq7iqqKevsJejrqSnpKS0wLCqrLS+wrnAubOnuLS4sq6Vpa2vrqWLk5WhjXTBmn6XmYWOlpmKsZWamZWSk5mZpqOVn5uWmqmdnKGgmouNkJadYEqWnJqVmqWWVJawn6+cn6WUr6+sppqhppSTmZmOnaCnopm0qaqzvLy7q7Cyx8C4paurrbGxo6GysrSkcW5mXFpOUEtEUFBQUTtHSklHSEJDPjlLVT9BOj1FTTA3NTQ0OkIzNE5XTzxKS05VTlFKUEhISk9CPD5NUjs+PTg6PENSPkRIUklCV05JQENBRjM+NThKS0NBPUM7NEVBOkE/PkhANSpCNTIsPmNdZzozNXRkZUBSNyYjM31pWDs6QkNAPVFFV1JzYldGSKqXmaCiqK+ZkZeHi6eWjoiShZ+HhJ2Xj56gmqOktci0qca6w8PHysjIzM3Gvrqzrrm4wMHNtsi6wbm2urGvrrK0p6ObqrO0qqimrayZpK6lpKisur+oq7a3v8G/vriyssOxub2so661rLmmiJyYppt2v6CFmZ2Ok5mZiq6XoZybl5Wbn6GpnqigmZqqmqKnnpiQjZGdg252kqKalZ2inpCtsqOrlaiqmKuupaSfpamTkpmciJWcop6Xsaapq7q2vrOyrb65tqCjp6ilp5ycrKmpjGNlYV9SS01HSE5JVUw9TUROSktCQ0Q8UVU9QUFCRE8xOD03Nz9CNzVVWE4/SE5RWVNQUVRKUUpKRUFFTVE/Pz04PTtHUjxFRFFCR1lNS0FIREU6OjM5S0lCPkNCOTlDPjxAPjs7RzctMj4tMYJoTnpcLzBraGA8PUJCODZ6Zlc7Oj0uLlJgTVVIf2VeSEWrlJyhn7uvmZSejJOqm5GSk4mrjYeinoykrZSjo7bGvbTBusLCx8jFws3Iwr25sq+5tMDCyrXGscG8tLqrqK2ssKOimaq0uqappquqnaivp6Oqqr68p6y8s7e9xry3tbjAsb3As6m1t6u+pY+jl5Gin7yfiZqgmZaenY63n6mcpaObnKGaqKWzoZudppyoqp6ZlY+Um4uXiYylopSdop6gtK+lpZOwq5mrrJ6epKOpkZWVoIOQnp+clqmkoqG0tbu1rai1srOenKKlmpeVmaqhnndhXF9dSkhGR01RSU1FRkdCUkxJQUVHQFZSREg9QUdRMTtCNzpCRjc5XFlLQUxQVFVTTVdSTlVKREBKSk5POUM/NT08TlFDPz9QP0VaTUpBS0RHQDUzPUlHPz1FQTk3QTs8QDw8M0A8Lyc7KkiRQjpTSjAsW29XNzE8Kh1CgGRUNDktMTpnXEZDQ5xwYkdFp5ekn5/DrJuXpJeZqZyWmpqPqpaWp6aVra2Zoau2xMK7vrfBwsDHxL7Nx7u9ubKvuLO/w8i1v6+8trm3pqOqrK2goJqqqsShpKirpp6rr6yiqai/uKatvbC3tse2tbm4v7G/wba0s7SvvqOXo5aTm5StoJGhoqWjo5+QvqWpnamsnZ2hm6afvaKZo5+iqauhnZaNlZ6TnoePhY2TnqSgnbWsppyVsqeZsKifmqqeoI2ZlZ+EjqGam5OlpJqYrLG2sqqlqq2snJigoJKOkJapn5RoY1lhXU5JR0pOS0hFRElBPVBJQTxHSUhbUk9LPUhPVTRCRjk+SEc1Q2JbS0NOUlVXVlFYVFJVSEA4UVFQTTpHQDRDSFFTSUM7Qz5HVktDQE8+SzwwNjtHRj47RkE1Nj85Oj85OzE1RDAtLDBNdlw0S1o1LE1uVzwtPSkeI3piUTVDS1E5b1JGPEt4ZWNXTKKao5yexayhn6ydnK6gk6Ofl6Wgp6mrl7awoqqytcTDvcC2v8K7yMK+ysi2uLW0sLOzt8HGtr6wuLS5tZ+mrKqrnZ2epaPBpaCpraCkqa2voqanvbamsby3trXDsrO3ub6yw8C3uK6ztbWjnaSVkZOgraCZop2pqKujmsOtqZ6srZubnpmmoL2inaWYq6uspqGZjZqfkp6Jjld/lp6loaC4qqeTmLajn7OhoJuvl56OmZSdgo6fl5aOoqSVkKaus6upoqKmpZWVnJiLj5GTpJ+JYmVaY2BMSEpKTkZFQUZLPj1KQjk5SktOXVFRST1MVlw5Rkk9RE1JOEhjXExDTFBTWVlWV09aXklBPVdRSUs/SEA1SE1YU0hBOkBBRFBIPz5RPks3MDk5RkU7OEc/LjY+Nzg+NzcvMT85MSUxUVVtW0pPMTA9Z1dEMTc9LSt3YFM2U1prV3NIRTY9dWVcS06en6GZnsOnpaKzoJyyp5OqpKCkn62prJ27sKistbHHxMHCs8LDvMbDvMTKva+xtq2wtK+/xbW5sbC5tayaqLCpqZqdpaGnwqybrLGcqqKusKmkp723pre6vK62w62zs8K/ssazurestLatqqKmlpWUo6yin5+aqKuwr6+8sqagqamZmZiToqS4oKGkk6+vrKWnn5KhnpWej5CNlZ2aop+ntKanjZi0nKOvmp6brpGelJeUmoCSoZaPjp+hk4umrLClp6KcoZ6SkpqThYuSjZyegGJmW2dlSklMSlJBQ0BJRzs7Rz85OU5NVV5SU0o+T15dPUhQQkxMSTlOZF1MRUxSVFlbU1VPXGJIQT9aUUFIQUtCN0ZFTEtOPjtCSEROQj07TkBBMy85N0NCOTdGOys2PDQ2PDM1LS80QDErJ1Z0U2VPPzEwNGJbTTIzPjA8dl1eP1tVXmZyQDg8SJZ3ZUE0n6Sfm6DDqKSqsqGjtamWsqumoqSyrK6pu7KssLW0xr/ExLXAxL3JxLXAyMK1q7WosLiswMS0t66strmlmauxq6qYn6aXrbu0m6iwm62frrSyp6q6s6e6s7eyuMCqt7LCvLTFp76urbe1qqisoZeWkaaloqOYmKWvuK6ytbagn6ikmZWVk6Sgt6KlppausrKmqqahnpuampaYqJ+gmKGer7Kipo2XrpmlrJeanqWRm46Tl5mFlp+UjJCcnpSLqamqoqegmZ6WjI6ZkIKGlomUn3lkaV1rak1QTU5UPUNBTkM6OklANzdRT11eUlZRQVdgXEJKU0hWS0g6VWVdTkZPTltXW1JQUVhdR0FCW1BCRz5OQzlIR0hOUD8/Q0lCTEI8MklBOTQxNzdCPjs3RTcrNjkxNDgwMi0vLjw2LSNCcWdzazIzLzFbYlozMzgwNnBbYkgwNUpwaVZDV0aMeWZDO6SknaGmv6aor6+gqbWqnbmvqqOqtLexsLm3r7a4uMW9w8e9vMPBxsC4wcbBuqq2pK27rcHDuLiqrbG7opWtsK2ylqWnkKq5qaCnsJ2qoLC0sqqptrWsvKyysrm3rLmwwrq9vqbDq7C3r6mrq6aemJiroqKgkZihsa+zq7G6m5ypoJmWkpemobeppaOir7G0q7Koq5+boKCbnqWcopado7Owmp+Qk6WaoamalaKflpiJlJiTlpedk4iQm5mUj6mop5+jm5ebk4eOmYt+jZaFj5traW1hbG5XUFFaVEFDRVRAOztJQTc6WFBkXlBWV0RZXl1NTFJOXktKPlpkXk5IUE5bVVlQS1NXWkk/RFhQREY+Tj89SUdHUVBCPUNGQk0/OjJEPzc3NTQ3Pz05NUU0Kzc1LzI1MS4tLiwxPionKz1ccD0+MS4xZVtkQDE2NDdnWWBGKD84bH1oW1Y7iXtjQz2nn5yiqb2hqrCqo7G4qaW0squhrbW9r7O4vLq9trbAwr/JxLnEwcDAuMS9wbevtairt7K8v7+1qa6xtp6Xq62orZanqI6nu5+krbOeq6KxsLOsqba0tb2tr7G1rLC1scC6xLarvK+xuKutqqOxpp6kqqCkl5CZn7Oqs6qrs5qdp5ualY2gpqS0rqeira2usaezrbKppJyfqKSelaGYm6i1qZeZkpKfmZ6hnpGsn5iYhZWYi52anZOKjZaXmpempaOgnZaVl5SBj5SFe4+Sg4yWZmxyZ3ByX0ZZZlZEQ01YRFo5SEI2Pl1RaFxOWV1HW15dTk1SWGRKSkNcYmBQS01OWFdYUEpWVldNPUVVSkVEQU0/QUZISFFQQTtGREZLPTg3Qj02ODcxOT48NjVEMCs4MC8wNS8qLC8tKj0sKyUyKyo1SzEuJ19fYVUxNTA9YFZeOClDM1lVXGdLNYx6ZkxApJmgpKy3pKyppa6utqmvs7mmprC3xbext77AwbW0usW+zMW5wr+6v7nEuMG5srWsqrq2u7m+taqtsbaZmKerqqubrKuPq72erK6xo6qfsK2zrq62sbm3qa2usai1r7O7vMmyqrW0sbSvrqehs6CaqK2gpZWVmpmyo62gpq+WoaSampKNoqWnsqmip7Ksqralr7G1r6SZna2nmpifmZmsuKOXk5CPmJyhmJeUrJ+dlIGTmY2dnZqWkIqUk56apaKioJmVkZOVeouQhnuMioOLkmtueG52e2BFYWpZSUhZWz17SkdFNkFiVGlbTVxhSltdWlJSUmJgTEtFX2BgUExJUFdWVU9HV1ZVTjpJVklIP0NLP0VESEhRTkE/SEhIRTw3PT46NzU2MDk/ODY2QiwtOCwvMDQsKCwvLSo3NikoOS4kOks1LiJUYFVgLzUoQ15RXC4qQi9KR1BbSDNjWVVLRJmWoLCosqmtpaOurrWpt7S4o6u0t8m7tLu7v760tLfDwMzIu8O8tr6+wLi/vLG9rqe6ube2w7errbK5lZemrquno7GqlK+7pK2ysqenorKzsLGxtbG4s6muq7GnuK+1tMPFtqm0tauwraqno7afn6eyoKSUm5mUsp6nnKCqjamjnpuWmKWlpbenorK0rKexp62wtaylmaCsqJucnZuUqbiclI6Oi5mcopiQl6ahn5aDkpaQnZyYlpaIl5CXm6idpKCSlZCQlnaEkId7hYGEjYxucXd2fH5cS2VsXEtOY1w/YntHSThHZ1dlW0xeYk1YWVdUWFRpXU9PSGFdX1BKSFFWVVJLSFdVVk04TVpORUBGSz9IQkNLU00/P0xPSEA7Oj47NjswNDE8PTQ1OD8pMDcpMS4yKSksLC0rLTkkMDQyJTlCNy4jQU5IZjI3J0ZhTFYlLUIuPUVNUTwzcmtKREOQmaWupa2uq6eksLKzqrewtp+rtbnJua7BvMK3s7G1wsPOxb/BvbS9v7+6v7yzxKipubC2tsC9r6uzs5ygp7CtpaawpZ6ytq2rsrCsqai0uay0srWttKyprKisqbmusbHHv7ikua+pra2mqK2wpqSkrqOpnJ2bmrCZoqOio5CsnqSgn6Kqpqa5pay1taSpq6msr7avo56jqKqboJqakqS0mo+JjYeRoqCWjZSeoJSThY6Tkp2bmJaViJiTlZmnnKCfjJKQjZB3fo6FfHx9h4qKcnRyfn19W1Jkb15OWmZdRkSWW0g7Tm1YYVtNYGJOVldWV1RZZ15RUkxjWltUS0dPVFNOR0lWU1xOO1BeSUJESEpBRT8/S1NPPjpOTUM8PD45OjU9KzMyPTYyNDk6KDQ1KS8sMSgpKywtKiY1Ki8mMCkzODoxJiozQmM7NipIZEhKKzpJPzNCSVMsPo9rPUhIj5uqqqKqsKSopLO0sbS1sbGhq628y7quwLvHsbSttMLC0cXFvsCyvsHCvL+3vMSnrLess7i8wLCrsq2gpKetqaiksKOrsaqvrLCur66rs7qntrCyqbKpq6WlpK+6rKqxwrm1q7moqKisqqixpaqkoq6qqKKem6KslaSdmJ6ZrJ2ip6miraajray3sbKgqaKgq66wrJ6fp6ipmaSYmY+gp5iGg4+Ki5+hj4uMlpyPj4aHkJWgnZaYlYeWk5OXpJydnIuRj42Jf36Ihnx3f4eFh3Rzcol2bF9ZYG5jUXNxXEs7hHxGPld1WGBaT2NcTlVWVVdQXGJeU09OaFhXVktHTE5SSEVJVlJdYzxQXUQ8RkhIQkc/PUpQTDo+T0o9OT89Mjo3OyozNT4xMDQ4NSg1LyosLjMwOyksLCclMjM0JCwyLTg2MCkoMTxdSjAuSWdERjg8QjA1RUtYMUCUWz9NRpWXraeiqrKcqamwtqy4ta6qpauqvcm7sL63wq+wrLPEw87Ow76/tMDCxLrBtMnErK+3rbK4v76zra6rpaeqsKmnqLGltK6rsK6tsbCzrLO6pLizrKyup6ufop+xuKuqrbq3pbW1o6mnrKyqraGpp6axsqOmpaGhrJaqoZSboKaepKKrpK2jn6ext62to6Wim6mqrqmdoqWkpJigmZaPmJ2TgYKQiYWcoIyKjoyZj5CLhI2YpJuSkZuMk5KRlKKZm5qKjoqKfIaBgoN6dICEgn50d4ykh3lrXmBuZ1dlh2ROQGeSTERieVdiWFJlVU1WVVVUT1xdYVVLTWlXVlZJSkhJT0JHSVNRWW9BTVhAOkpHRkVHPj5FUUg4Q0tFODdDNzI6OjoqNDk/Li80NjMpNCsqLCsuIzQuLSsmKCs3OSomNis8LTIsJjA2V1ouMEpnQUE8PEMrOkpPXjREhkBISESXkq+ko6qwmKuprbWrtrGrpKuqqbzAwLi5s7u1pbKvxMnL0b/Bu7nAv8K5wbrBxK6ytbGzu8C+s7GurKurqLaqpa2wq7mwqbGxr7Kttqq2tae0tqyspKmqnKOftbOoqKS0tKC1raGpqKupq6egq6uoubapqqmpoqmgrZuSqaGdoKSipqOqnp2mta6opqqio5elp6eqnKKko5+ZmJ+Rjo+Zjn6HjIeEnp6IhYuLj46QjYSGlaOajo2bkZKRj5Kfl5mWjIqDf3SGgX9/eHWDf3t4f4GInY9vcWdncXhcYHOIak9dmFZIbXhVZFZSY1BNVVRVUE9YW2JVSFBpVFZUR1BZVUk+SUhPUVB4TE1WPTxLRD9AQTxAQ1VDOUFLPTU7RTEzOzk3KjQ6PSstMzQxKjgqKisqLCkqKC8qJiklMzssJDIpMjAyMSUvMlFjMDI/Zj1OWD9DLD5MVF8vSms2UEU7lY6woKWrrZqrpa2us7SvqqWvqam6vrvAsa64rqG1r8nHyNHAvr27vMK9usPBv7+usrKxtb28wrGys6qzqKS1qaWts7O5sKOttrKvsrmquK6qrrWrq56qrJ+joLatqKGfr7OhtKqeqKeqpKuhoqytqL2vrK6toaeon6uZkK+hmKKhqKefqJuZqrCpo5+soqGToqOjp5iaqKWXl5mdj4qHlYh9jYWEhKSWhYKCi4ePjpGEhJSgl4iRnZCTkY2RnZSXj4qFhXh0gX99dXh5gHt0c3ppgoekdWleZWyCdWeIjH1SWHBeSnhzU2RTUV5NTVJZZk5MVlllWUZTaVJSP0JOUWFROklITFNJcVFMUzs8ST87PD07QEBXPDw+SDczQ0IxNTo5My01OjopLTMxLS02KSgrLSw1MiMyKScsJS47LiYxLjAtMTQlLDBMaDo0OF89YWQ/RjFDUFtbK0hPOlZCNJCPsaCkpqujpqSsprSzsaqksKequL7AvK+muKqnrrDJxsjRw72/vrm+v7zJvMG4sLC0sbq7ucGztLusuKyitKanrLK2ubOnpru1rbW8r7ymray1q62cqa+koKWsqqecnqqzpLOomqqnqaSpnqOpqKm9rLSvrp2ppKCunJuyo5WknKSln6SamqirpZ6bqqGbkpuhpZ2Yl6mpkZiak5CKgo+Ffo+Cf4iej4Z/fYyHkY+QhH+Tm5SFk6KMlJGLkZuSlYeIfn9xenl+fGl3fHp1cXF9aIZ5hYhkYGhjcoV6bWd5XV5WQld6bVRhT1JYS0xOcXRdSFpbZ1lFVWZQRD5LTkRDQTlIR0tTP2phSVE4PUg8PDw+Ojw/VDY6P0M0NUg+Mjs1OTAyNzw1KC41Ly0xMSYvPktIMSUaOTAlLCwwOS8sLCs2JzE3Iy0vR2pJMTRYPWZiQUo3R1NgVSo9O0VaPyqPk7GZn5+ppaShq6S3srKlqbCnrLjBvbWvormtqKiww8nJzMG2vb+1t7+6yLbDtbSztbG9uLq+t625tb+tobOmqquwtbi0qp27vKiyv7K5oK+ztaqsn66wo5ylqKminpylsaavoJ+qqaiiqpykqaCtvKiusK6hq6Okrp6eraaXn5uho5yfm5qjqqKamqSklZaUn6KWm5amrIuekZCRjIKLgYCOgHqalI2JfH6Lho+PjIqEkpiRh5SjipKSh5Caj5OBh3x5a312eXhie3pxcHFzeGmBdGuDZ2RoYW9zjm1ianBgcEFceGtWXk5RUUpKTVNZVk1dXm1XRFhgT15QSE1ERjs3SEVLTzxyaEpLOUFFOzs9PTs7PUo0OUI8MztHPDQ/MTgtNzg7MigwOS8sNS4uPS0qSz4qHTQ5JicuMzQuMCsvNCYsOiQ0MEJoWTEzUz1lX0RMNktXZU8pPDNQWz0jkpismZ+Xp6Sin6ikuK+uoq+vqKq4wrmyrZ+5r6uotLrHysi/t8G+r7S+t8S2w7GvurKywLW7vripube9q6S0p6iqsK65saqZur2kr7+0tKCut7Wmp6ews6CepKanoaWZnq2nqJ6gqa6noaeXo6mgsLifpLGvoaygrKScpqepmpqbn6OVnZyanammlpufqJKYk5idkpmWoaqQmomOkId9iH+Cjnx7oYyMiHmDjIWKjI2Fh5KajomVn4iRlYKLl4yRfYR7c299cXN0YHl4aW9wcW9qf3Nke2xpZmRhZoaAYFtzanJNTX9pWFpNUExKSFBSUUlOXF9uU0RYWlJnT0hLRUY1NkhCTEk1WmVKQDZFQjk6Pj0+OjpDNTk+OjNARjwyQDIzLzo7ODMmMjwwLDg1QiopLUMqLDQ7Tk5AOzczLS4rLTcqKjwlNTM9ZmQyNE0/ZV1GTz1SWmhIKj8wWlk1KJadpZiclq2gn6GkobersKS0s6ioucS1sa6gt6yurbC1xsjAt7/BubC0vbe/u7+vq72wtL+xvcO6qbu6t6eotainq7Cts7Gnmby3pKu7tq+fsbewqaWnr7KboaSgo6Shl5uvpqGfoqevoqCik6Slorewoaaxq5+soq6XnKqlqZ6Xmp2lk5ucmp2mqpmcnKSVlZeVnI6Tl6KpoZCJipCGeoR+hIp5jpeKjYZ5goeEiIyOhY2TmIyOlpmKj5d+hpeLj3qAenByd25vdF94d2RsbGxqaYRuZnNpa2ZpXWRzgWBba3VpWkl9XltYT09KSEhSVUYyOV9ebFBEWFZZZU1JSUVFMDdGP0tCNklKSDs2Rjk0OT49PDk4QDg7ODo3QEk+ODw0LTM8PDc1KDU+MSw7QTEoKzY8IzhSPSoxMTM+RDUsLSc0Mio7KzEzOWNsODRHQWZbSFREVV1oRS48MmJVLDKWo6GXlJyqnaWhoqC3qq6gurilq73Fsq+uo7WvrK2vtcTEvLO/urews7m4uri7rq3As7S4r7/BuKy9urWmorOqp6qzq62yoprAtqWntLWpnrK7qaemqa+smaKnnKOmlJiisqSZn6SoqZyioJOloKS4qKSnrqeepaCnkp+poqGgmZudoJKbnJagoaubm5mhlJGUlpqOlJKjqKSQiIqPhnmEfIWGfZ2NioqGeYCEiIiIkYWVk5KMkJWUjY6Ue4OYj4t3fntsdHJsbHNheHRoaGpnZm+FZ2hpY2ZpamBpYmpnW2V7Y2BTc1RbW1NMSUdJT1NAISppXmpMQ1ZVXmBLSUhFQy46QjxGPDZLUEQ4OkQzNTc9PTg5NT86OzQ+OEBLPT45Myk4Pjw6OSo2QDMuRTQoKyw+MC1OPy4rLTcsMTE5NSwmLjUtODA1NzZgdEIzQ0RnW0tXR1VgaEIzNzllTycynqOjkY6kp5uenp2jta2mqrq3pqvDwbavrKO1rqevr7fAwLyywbaxrrK2tri3taypvbOvsrG9v7iuu7uxpZ62q6WltKmrrqCewquopa+zqqy1u52oqquxpZieqp6mpJGZpq2imJ6kqaGcop2XoJ2ntaavqq6hoZ6coZWgpp+hoJmbmZySmZ2UpZ2sopiWnpSTjZWXjI+YmqmgkYiKi4l5hXeCgoGciIuCiXx/hIiGhZGElpWPjpCRkZGMknuDlY6Gcn19Znhva2psZ3Vza2NnZWR1gGJlZmZlampka3FaXlldbWRhTmhXWmBWSkdJS01SWD45YGxpR0JUU1xbSUlHRkEuPD85QTg5UkdANzpCMDM3PTc2OTI6PDk3OjlETT1CPDAqPEA7QT0tNUIzNz0rKiwwQSpKSy4vKiszNzIyKDU3JCs3LjcyNjg1XHlOMj5IaVpMWUpWYmZBOjNBZkglNZqjnpCLrKGYmKCWpbSxorG9tqCwxru5sbGkt6yqrqm5vbu7rcCyr66ttq+zt7Kmqrmxr620trq2sLi9raadtaqfoLClq66epMKgsqSusa+3rbWera+trqKZnaiqpZ6Vm6iln5mlo6idmqCblJydrK+luaetoqGam56ZnqOapJ2XnpiblJqgkqiWqqeak5uckoyVmY2UlJmop42NiomPfIJ0goGKmIWHfImJhISKjIiShJOckpKPkJGWjpB/gIyNg2+Af2Z5bmhramdxcmtcaGNjc4FhZWhqbmxna2pnbVxsbHVxYVRiaGRlWklGTE1PWFFRVmFlgVRAVlNZVUZIRkVALzw9Nz82PEZOYTg6PzI0OUAzNzgyOD83PTg+RkpARDkyLT1BPUE9MDVAOUAxLSsuMzw7SzYvLissLTI0OzYjMyopNi41NTQ2NVp8XTE5S2pbTVtLWGRkQEExSmVDJzSSoJqOjrCdmpOhmqmysJ+4wLWfs8K7vbmxpravqK6lt7i3t6y7r62qq7eqtLitpLG1sa6psbe2sbO1uqeon7apnJ6po6qtnKnAma2krrC2ta2tn7GtsKqim5ykrKiblZyno52aqaKklpqgnJCbo6qpqbuepqSgmJqZnqGPa6KWmJxxgpabpIB1kqmnnpSVn5GJl5mAloqgj3mGlIyDbmp+d4NxbIaLhn2Ei4ZvXmNgZ4SXhmuLkJSTdXeLhH6Dj39mhoBodWlmV1xpc25OUGpjZ3KEZ19kZm5sal5gYIqQhIZnT0tEOEVUZ15KR1FQVVVLSFNhb3RlRltRVVBGSEZDPjE7PTY9NjwzZlw1Ojw3NTtENDg2MDpCNz86PkZMQ0IzNDM9QEBAPTI4QEU9MSwrMDg+RzYwMS4qLiovNTY4LCMxJzIxNDoxNzZYgWwxNk9rW05cS1tmYj5HMVFkPSsvjKOZh5Swm5yToJuqraujvcWvqLbCuL29rae2sKWrpLizsrOwua2qp6y0prC0oqe3tbWop6y3s660rbOiqZ+0q52hpJynp5msu5Wmpa+zuK2upaiuq6yloZ+coaemm5ihpqWbm6ennZOen5iQnqiporWvo6KjnZaXmJejiKGOkpqHoYeUnaF/pX+mqp2SkpuSiIRyeI2OhIihdoiNaZeIZn1zeKFviIeEfo17f6Ggn5mAe4eedIiOdpuKbIeBg21oZWN6bHFiVIZtY2xpmHFYanBvh1heaVtra1uIcW56coZoh4RaXkZOPkZfTUZSVlZRUVJXVGdeTFhKUlJQRUdHPjw0OT05PDc7MDw8Nzk5OjY9RjU4NjA8Qjs8OT1GUUc9LjU8O0A9QD41OUdBODIpLjE8STkvMDEuKi8oLTQ1ODMlJjIxMTU+MTw4WIN1MjVSa1tOXExcZ189SzFXYTcvKIyml4Ocq52ZmZ2fqqqnqb/DrrG6vLfAv6qlt7CprKayta6vs7arqaWxraW1spustLa0pqeps7Gtsqevn6qgsqmgpKOaoqOcrrWVpKWmtr2nraeqqqyopqKgmKCno5mZpqOkmJykqZaUopyUk6SlpqC2o6Sgo5iVk5iTnIiuj5iUiamLl6KbhbGAo6yck5qelXmC1Kh/h5TBm8d5eLGlt5dkgMCcv3mEhHmPg3yQkJHKcZa8nMV7cranupB6gWyWsauweWhrWLGub2VpvJK8bmh6bnKP2H5TamK2sn+BcpR1mqGqkFdPV2FPVk5GVFtYUVBSjFxXXFBAXERQTkVHSTw8NTc9Ozo5Oi49Ozg3ODs5PkY2Ojc0PkA+Njk/RVJJOi41PjtCPD9BODpKPjUyKjIyQkUvLjMyLisvKS0vMTg2LSAvNDE2QTE9OleDdzIxVGtcT1tNXmdcPkwxW100MSGNppOBpqmfl5yepa2yqbDCvbK1wLW3v8KrprStramnr7Oqr7a0qKimtaanuK2csrC1qqWkp7GurrGmqp6npLGkoqGel5ygnq+tlZ6in7S6o6upoa2upaKdm5qiqJ+Ym6ign5iep6eRnKeblJ2hpqKgr6Kfn6OWlpOYkpmFr2pqio2qfmeElYetZHCdnJSappVxrqGkfne7fGuhj3axX2q0W6WAZpyRYGaBemZ/anhqqWW+cmemjHayanyxeHSSk2NtbadtW4SgRWlnh5ZFdZxgfWd7pKeCWV+Lq2mAlXh6aqc3Sq9bV1RsY1tLT1hfXFdWO06IT1dWL0hTU0pERUY9PzQ2Pzs4OjkwPTg5OTk6PTxEODs6Nj1BQDY8QEhRRzkwNzxBQz5ARDhARz0xMy0zM0UzLi41My8rLyguMC46NS8nJDIwM0IvPTtVgnYyLVZqXE9ZTF9nWTpNNV9ZMzEbkaKVgqynpZ6jpaqyuKy0vb6wtsSyt7rCp6mwq6+pqbCupLC6sKSlrrOjqbionrKxsKOloKqtr6ywpqefo6KwnKOcmJWXm5ytppebop60s6GsnKKtraCempegoqmcmZ6koJyZoaekkJ2jmpegn6ufpqafmp+hlpWRl5GahbWbtXiFqZm1mXeHs5u3fpOWlqmUfmuBpnqChYiTlJJ3q2drsVuse4+HlHSIcI+GgH+IkJd4g4KLl4yDoI+EsHZ3n3Fra2x8i06kWEhjY5l+Y2imYHlydVOSh15QqW1jcX6HgGKdLlGhbltUa2dgTEtcZFhcWkI+sHhXWEEjTGhFQ0RBQEExOT44ODo4NDs6OTw5OkE6RTo6OzY6Q0I4PT9LTkc6NTpBRkJAQUQ8RkQ7MDIwMTtGLDAuOTQwLC4oLzMsPjgzMR8vMi1EMTw8U31uMytYalxPWE1fZ1c3SjlhVTUwHJWflIizpqahrqmns6ypu7bCsLzCrbi3waqsra6upq6yqaGvvKqhp7StpKu1paaysqejop6oqrKosKilnp+frpafmZWVlpieraKamqSota+hqY+pqKqbnpWYoKWomp+co5+boKOlo5Wbn5ianaKqm6aanZuioJeTkZOTnIPVk5m5cLDCfsaGfNaUm7t8mZWkj42cjaR7joekgqWCeqx5j51Wr3uJfp9quVq5d4eEfaaCk3yYeqp5jZyPe7FtjoR0kLyFb5RQr6fFilGgemNgqmJzcodtl4hgU7W0yIaAiXxjpDNCnXZdUWpoY1BAWGZaZGFKSE1sS1tTT1lmWkNEP0U/MDw8NTk7NzQ8Ozg9OjxDOkY6Oz42OkBDOzZAT0xIPDo8REhDQkNEPEVGODEyMTFEQy4vMDQ4MystKS4zMjM5NzEjJTUqPjM9PVF3ajYqWWlbS1xQX2ZUN0c6YVE3MiWbopOYsaeopbOqpbSopLy3wbC6wLG1tbyztaexsKOwsqafrraom6i5rqOvsaCzs6+gpJ6fp6mwqLSppJydnqqXmJeWl5WWoaqdm5eorbCpo5+PrKKnlp6XnKGloZihoaKhmqKip5ueoZ6VmZumoJynlZybn6GZkJKVkZ2Ism5otXGrh2+OpnK0c3K2e5mXo4uOnI2ifpGgpX6wdoOR0tF2XK58hn+kb5uqpmuGhX2tfZeZj3uxc5OdjnizZZZ0hJ5vnmaUUsiLWsJcn3liX61fdnOHYpeIXlnKnW+/gXVNS7VTVcZkVFFqY2ZYQU9qX2xpT1VHSTk9V1JbV1hIQz9KPDI/OzU9PDQ2Pjs3Pjw9QztHOTtANzs+RDsuQ1JKRz4/PElKRkNFRD5ISTkxNzQ2QT4vLjI0MjUyLSkuMjYsNzQyJh82MDs1Oj1QcWg5J1dpXEJOVF9lUDVHPWFNNjIvoZyRpa+spKq7raa0pae2u7yyur+3trW6urOltLShsbGin6ywpJimuq6ksbGdtLeon6adoqqksaesqaSanJqonpWUmJiSkqOooJeTpquwpqKWk62fpZKUoZukpqCUmqamoZqjn62aoJ6dkJaboZ2cpZWdlZqin5aZlpKbhax7d6h2o46Jh6lvrYqCp4OYmKGJkpqKon+TmYmuhX+Cs1xys1KufYOCpH9x1313hX+PnYaZmXevhoqRnId3tGGaZZqBgpRsklqwWEuadZh5ZmCtXnZ3h2iYiGter3eVno94bDV5yK6yX0FUb15nYEVQbF9xbVZVTS5lY2lTWVE6QURATDo1PzkxPTwxNj85OEA9OkM6Rzs8Pzo+PkU5LUVVSkVAQzpNS0pCSEc+R0s5Nzw0Njo+LzA0MzMzLjIuLjE4Ki4zMiUhMDM3Njc9UGtlPiZWZ1xAPVZfY042R0NgSTo4OJ+dlKC4sJe0wa2osqipsrq4tLi/ubeytr21pbizn7Ssn5+oq5+Vp7arqLGyq620o5upoKCoobWmpqqjmZ6VpaGUk5yZkpWipZqTkKesr6aglZmpn6KPkaKZqKaglZmlqJ2cpJ6tnaGdoI2UnpudoJiZnJaXoqCTmJGmnYapfX2leKGPjoOqcK2LgaeGlZ+hiJeXiKOCkYiUqnyAi515b7FaqIKCiKB5dNh/dod0p4GOm42SpHyWkJ+Ee7JenGSgfoOVbJJcq1tak3+Rf2hnqmNye4FrmIdyXaxaiaCOa25lT0pDoVxaTHReYmVNWmFfcnNfSlY2SpqTWUhFPUhGQUwzNUE4Ljs+MDVBNzhAPDY9PEY/Ojw2Pz1CNy5IVkpFQUg2S0lOQElLQEVOOjpANC47PjAwMjE0NCsqMDUvNywmMjEoJCQ2NjcxPFBlZUEmVWZbPzFVX2JMN0ZJX0MxPjihnZmZvquXtMKuq62ppbSwuLG1v7m6s7G3vKq7tJ+wpJ6lp6eelKqxqbCqtayrr6GYoaCmpKO5oqOroJebkaKglZSfmpSYn6CPjYypsK+mnZabqKafjJKkl6irp5SXqaeen6CjraShnqGNlaGZn6CSnZeclZ6hlZaPq5uPrm1ytHKpjHaKpnO0eHOzgJGkopGcjYmkh5B3uG+Me4uia2u2WqCFZZeXaaGip22TcrR0k5h/smqFk4ita3WzYZ1mom+HkmqXXK1gTaF8h5FSc6NseX9+b5iHcVyvVjycd2ZUb24uXKdPYlJrZWFsWWJcYHB7Y1RaUT4+bXAzQkJAP0w5ITdANi47QDM3QzU4Pz8zOzxDREJKRk1JRjYySlRLRUJJNklKUD9ITkNGUD08RTUwOzwwMTAvNzUsKyw0MjYvIzAwLCwdMjg5LzlOYGVEJ1VkWT4vVV9hTDVGTV44MUI4pZqbnbqhm7LArq2rq6e3qbivtMC1vLGvubirwbapqqCbpqShnZKqqqe2o7Korqqgl5ynoKWruZ2jrZuWmY+lo5WNnaGbmZyfkJOUq7avp5mUnKyql4yTpZmlrKORl6qypKCep6uwmKGjkJmil6CblpuXoZOcqpyUkauZh9SSmrtzsMOAw4Z+1ZabuHiHkJeMmIqMp4h6o7Z1fXd2woKasmCDunnAfHW4YrWBjIepfZaBrKlxe391vIinoGmdYaaOr6F+jHSHq32+bnO8dLKDdXiAim6aiHFujaR0vV13fVthebxrWlZbanpeamBkZmJtd29ZW1lDQUByP0NHKzVIIic7PzEwPD83OkI5OT1DNDxATlpeYGBfX19aUFBSS0VGSjRITFJASk5FRk9CPEU4ND05MDIwLjg3LSouLzE4MCItMSwzHiw8OjA4TFhhRidUY1g8L1ReYEs1O0xbLTdBOaeanqG8opexw7Ctqqqssae5r7bFsbqyrruwrsGyrKSinqOhnJuRqqSqsqS0pq2kn5aaqpmmrLicoq6YlaGQpaCSjZyjnpidmpCWk6+5sayVl6Oop5SRlqScpK2ekaCoq5+bn6mjs56ipY6nopShmpyXlaSYj7CgkpWqnoWQmbaAkJGMt5V4gpObtXdua25zbnmPhI6Jc57Bu72ae4GyqHCAdJG4g3yGhouHjXuKho2XfKS7ub2cdXq0o3R2l3V0sHWZnmaGaY21dHJwd7aMXn95fYlog3lteWKLrHB1hX9ZW6dqRGRZU2ZgY11jUWdmcWx1Qk5QTEQ7Wkw+SjM8MCA4PjsuMz1BOTk/PTs8QzZCVFlaWltbWlteYGJgXVNHR0g0RElUQktOR0VPRj9HPDc/NzA3MC85Oi4sLy0qOC8lJjIoNCQoPjcvN0xUX0cnU2JWOCpPXV09KzpWVic9OzynnqCgv6WWtMO0rKunrKupu66wxq+1s663p7W4ramjoaWeoJ2ZlKykraqmtaion5uWoKOerKS+pqGrl5SdkKKbko+iqKKTnZeSmJSytbatmJ2kpKKLkpGmm6Wrm5aopKWcmqGppqejqaGSrZ+Xo56Xlpedno+wqZScp6KOan5pnKZ4h3N+mo90emWHer6+wLpukoNxlIZfcmpaXpqJYWSIjpVrYH+VY22cdmKUa3+alZRlXmBjcZuKaXKMfYaVZ2p+cnR4fX1iW3d0gWhQXG6DfHuLa1hseoJySUpvhXBNdE1FV11mYExbWGdjXk9bbXVpcVFPREVNO0hJPEw/MiwyQT84LzU/Qzw5O0A7PUM+UlZWV1laW1xcXWBhYWFgXFVHNURGVUVKT0hGUElJSDs4PTUxOi4wOzouMC03Nj01JiIvKjIsJTs4LTdKUl9JJ1NgVjQpUF5MKDM9W08nPzI+qJ+oocGjm7S6tqOtpa6nqLWxrMissLOstaO+sbKmoKKpnaKbmpmsp66kpLWppZuXlaGbp62ovqepppWUnJWgmpOYpamnkZ6Qj5icsLK/rJumnqeiiZORqZqopJqbq5+jmZujp62in6qimrCblaaglpWdn52XsaWYoqiZnJGdnKOjmaaimpyampqQloFnbX1xd5GXlJGFirWqjYaYlY6KjJiXh5SVioOSk5GJjZGTmJSYl5qgopqclKGdjoJ6pYVsanyQfIB0iYqBcYJ4eXZ2ioB7iWpzgXSDdWN3fXZrcHttYGNdcGdNWVllal9XWm96bW1mU09GUzlPWk5STygrOkpCNjM1PUBBOTpDPjxFTlNTVFZXWFlaXF1gYmJhX15eW1RLQ1NHS05ER1BMT0k8OjszODksMjs4MjApNklSTzgiKSsvMiM0Oyo3Rk9bSiZSXlMxMFReOis9OFxLLDwtQLOgs6K/oqSxsregqqWyp6WwtarJq62xpbWmwKi0oZ6kpZyjlZagq6aso6O2rKCZlpafl62ppcCeq6SVkpyXnpiTlKKfnqKnk5GYqKeyw6+aq52rno+WlqmeqpycoKyYoZqcoqWvpqGkqJ6tmJemnZmaoZ6enbCgnaKmlZiTmJSgoZWjnpegjpaUi4qNjpatj3yVm4KSgouqqIaBmJaKhI+fiHuEkIaFmZCHhomVjpuXjZCYnqSWmpORnY1/jWahs6+FiYR2eo+KfHZ5em9neZCBgIlrdYF5iHJoc396doOIgmt0ZHlmYGlkYmRmallre3BpalxTTFBEX1VGQD8/LDRARjs0NTs+QTs8Pz4+SE5OT1BTVVZWWFpcX2FjYV9eXl1eXVhWSktMQklPTVJKOzw6Nzg2LzI5NjQuKCYkLTEuLykrKjclKzwoNkNNTUQvVF1RMDVNWzE3RTRcRzU8LEC0oLmvvqyrrrKyoKqmsa2irLOwxbCqraOzrryktJyfp6OhnZmXqKappqSms7WelZSdmZmwpq6+oKujkJGempmUkZWhnJepnISeqayis8izn6qkq5aWl5qnnaibn6SrlJ6fnaCqrqmlo6uhrZufoKGZpZ6cnp2wpJmfqJOYmJ2RpZmYqJ2al2aDknxlfo6Zj2N5jWxoa3qRpKtrZZqYfmeFimVlaWh6jaGOa2iMl5Gid2tqi5ijn5lzbG56hIyHelhlXoWBXmyKiYB2XGhzd3eRgIeCbniCeIBzbXmDdHeIiI6De2qGWV5rdGRdc4lpanxxbGNdUU1XSmRYQEo0PUY3P0ZENzE8PT9BRDw8REdISElMTlBSUlRXW15gYWFgXV1dXV5fXVpVT0RIT0tTTj0+PT02NTM1NTU0KiYmJSwqJS8qKyc2KiQ7Jy9BSltKLzdaTzYpRVkvRE8xWUM7Py49pZ+6vLmvrLOxqqWora6wpq6tsL2xqaikra+xn62Xn6SeoZqZpqucrKOmqKmyrp6Vo5Cir6a2uaWuo4+OmqGZk5KboJmZpZZ7payiqLPDt6Sip6+enpWeo56jnKOqqJGeoZ6gqq+qq6Oqn6ibpp+ooayWoZulsKSYnKqVoZ6ak6WXnqqYnn6+g4hytHKEnYataHi5xLhxk6Kje6aYmXOqgnzLwMC7cYuih4KffJWYiZ7AvYKWnZ6NncLBe4F7ko2aw8B9a6Wxb4yAb8p6f5t3kYOOgXZ6gX95cXp/h3F4hYyTeW13k2JmX3hkX2WCY150aG1kYlhMVklRWkhPRTJJRT9EQj4vPD8+QEE6OERDQkNFSElLTU5QU1ZZXl9fYF9eXl5eX19fXVxTTVBHVU5BPz89NjQ2ODI3NiomJSMpKiYuKyopMTAfOSojPklbTCojQlAvI0ZbM1BZL1VBQjsvOJajuMO1sK/AqaiUo6+psK+tprK1r6qmpqaxq5+rmJujoJybqqeinauipailpLSjnaKTpq2st7Onr6KSkZqdpZKRoKGXnJ+dh6erpKutv8CwoamvqZeSn52imaKjqqOSoKGdnq2uqKymo6OnoaWlnq2pkaSbqa2qnJ2qnKyhlpellqGjl5x/zpR5eqSBeZWWm1+uj16Op4GioHynlZt0q4OAr15jjal6p4eFoHSXkoizY4KrhqGOjbNqhK50fZaHuGGCrVmjzW6PdXvae3+ZcH6Ik3Z+ZXuHdnZrfYhufoWRkn5tgY9gcWtwZ2BfeWRbcGhqZGZgUlRSV15LT0M1QUhFRDg+NjtAP0E7PTdAPj8/QkRERklKTE5QUk9TXF5fX15dXV9gYF9fXVpXT1VKPT8+PDU1NzgxNjQoJyQhJywmJi8oJiszHTYwJDc7U0wrLC1KMCc7XDtMLSFQQEY0LjGtwsC/tbSwuJiekaSqqK20q6ayrK2spKunsKqgp5uZpZecoq+foJ6op6OmoZ6wrJuelaeurbGqqKyglJKbn6WTj5+ll56oo56upKuwqMDGs6ipsa6Wkp2copefqaqelKGfnJ2ur6eqqZunp6Siq5KstJamoquqnqOnpqGwoJOap5qgmpSUkZegcIWMl3SEqIdxsXydcax+oZ6BpY+ed6uCfa1/nHKtfquHhp92mJJ6fJd+qoiijJGLnX6re4mTj5+Ae61WnMR6j2+SwX2BlW11cIxtZXZlhm9hd25yb4qLkpCDbZCQZW90dXBgZ21kX29paW5mY1dTXGFaUVFCOUlJQEQ8PjxARkRDRUE9PDw8PkBAQUJFRkdFQENJU1dZWlxdXl5cXl9hX15eXVtaUkM+OzkxNDc4NDUyJiMfHCAxJyAxJyAnNB41LSY3PVdKLTwnPjEpM1ZARiEcRzpDMS4rsNTGxrK0n52jjqOjoa2vtq6osKepqqiuq6unoqSdmaKVn6arn6KloKioop+dsKyXmpaop6+sqKepnpeUmqOikpShrZudpqOvrKOstaq6zbGtp66slpScnaKYn66snJagmZ2eqbGpqambq6qko6ybr7GiqKyuppmmq6qqsaKSl6OkmpSShKRqpHWJeql0erJxgqWJmYxxiKCah6RgYFKshH+ug5t2roGmhoafepiWhntmgKOJpJmGgaN9qX6BlIeuXnypVZ2ikoF6op+Ae8OvxYxzr7OzuXFiqa/CdGiNjZiPgW2aknBueXd3b2xmZGVxcGZ7aGNdV2BqWFhUS01RTENDQUI7Q0BAQkk8PTo5Ojw9Pj4/QT04NjtETFBSVFZYW15eXVxeYGFgX15dXF1bU0lCNjc5OTY3NCwmJCIgKCciKy0iJC4hMy0mQERXSCxHKzY2KjFQS0wjIEE5RDQsJ8PJ1tXAoZmrqKGvop6wtbCvqayjqKaqqquppKagm6SenaWnpqOcrJqirKGkn6+inZqSqqS1sK6gqZudlpSno5CaoqifoKacsaajp7GstsiytaqsqZWRnZyimaCls52aoZScn6erq6Oumqyqo6Kro7OtoqqzsaGbqqivsLajk5ajp5ibkXyqbJ6Eh3WreXywb4Kki4mflpWflIHSuLS4yYCBsl9flKmDpIiHoHmYlZp4qsl0maOVp6mQkpuMf5uJmsbGeGWhgqVzgZ+Ogn2vXnC1Y7F1S6OGbadHgpNkj5Ceknxwl5KAcHp0fHttW2ZqcnFmgWpeYlljbVxeWEhNTEtFREFCPkE8Qj9KOzc5Nzk5Ojs7OzMuNjxBRklMTU9RU1daW1tbXV5fXl9fXlxcXFxcWE1CNzU2ODUvKSglJiUkJiksNEVOUFBNRktKVkYqTDAvPi01T1RRHRw7PEYyLCSnpMHGua2ps66spaKcsrmsqqGmm6imqqyppqCmpZiro5+uq52loKyanqmlnaa1n6KXk6iqtrKsm6acoJWQpa2RmZyno6Cqp66io6eqsLTCsrOqraiTiZedpZuho66ml6GVmZ2lpquar52tqKeerKO3rKGyua+dm6+ns7SzpJSYqKSan46CnU54moF/n3qDo3yCpISHp5+cnpOEuHt8ebmCfszGwrZ4m6GRi599mZaXinaemIqkmKOofrCFnIWehKx9mZRhpWyjcI+FkIF9l4NyrGCkc3GAmmC8fVJVdY6SpJd8fpKRinR6c4R+cFttbndyaoFvWmRfaG5jZF1LTVFUQklIRkk6OUs+QjEwODg2Njg3Ny0qNT09P0JER0lMTlBUVlhZWltcX19eXV9fXFpaWllVU09IQDc3Mi4sKi4rKicmP1FUVldXV1lYWFdVT1VGPEUzOlBbVBwbNj9ILC0gi4eZqaykq7mrr6Ccoayzs6afoJWlrq2uqqedpqaao6ehsq6iqKayoJmppJSitaKjlZeiqbS4pJyinaOTkKGxmZ6cp6ahoq+unaSoorWyw7Gtqq2qkYeQnKedo6ScpZeemZmapqSomq6hrqWmmLClvK2ht7etnp21srmxs6eYnrCipJ6Fj9G1w7d5h46FkZOPf6Z4lKJ3jKCShKWBinGqhoS0bnJqmaOblYqfe5aYhoePc6+CpZuijaaLk52JlJCbbXCyXKVzk3qcbJl/e5l9bqlhonFxf59ic7K4aHiPlKaYfoyMk4p3fHmNgW1peGl4c25/dF1kZG5tZmhgSltYWDxIR0BVM0BGPjwqKDYzLjAxMykmNDo7PD0+QENFSUtOUFJUVldXWV1fX15eYGBdW1paWFVSUlFGOjIyMzAvKysoQFFSVFVUU1RWV1dYWFdVVlZUUU9RW1UlITJBSCQpJZNzjYqtv7+7urWel6ikrbWho5mVo6mnrqqrmaWin6WgoLWmoqinsKOUq6OOpK2jnZCamqq0tKSdpJ2pkpSXrqCgnqaknKectZqgqqO1q8OwqaupooyEjpyioaailZqbnJmcmaakppirp62jpZutp76slb6wrZ+jsLO6rLSnm6mxpaeYeqiQfXywd4qBpKWIm2yxb6GHrXyhj4OolZiArIiFroWflKmgoZaGn4CYlYB7kn6rgJ2aloqqeJ2gj4mTkoB5r12jgXymp2SdgHyXdGuuXaVrcYWZXWBbjKBtlZGnmYOUjJaLenqCln5rbH9ifXRtf3pgZ2Vxb2hnaENZYFs9S1QyVThCQkM3JCQzKycnMywgLzY2NzQzNTlAQ0ZJS01OUVNTU1ZaXV9hYGFhYV1dW1pYU1BPTkk3MDUyLiosQVRWVlZUVFVVVVVUVFVUU1RWVldYVlVVUUhGSUojKCi9kpqEqcbCt8G0n5utoK64paSOm6SjoK+vqp+kn52tmZ65oKKqoK+qmq2hkKqopJaJm5CusKynn6ebrZiYj6yioZ2lopqlnK2Yn6imtqnAr6WqpJ+LgI6cmp+mnpKVmpqUm5umpKSaqKyso6Sgqqi+pJfDrKqioayyuquup6Czr6mqmHavfpCLnIWHfbqtiphksIxlla19oY+DppWagayKhLCFpZmkoaGPhKBbbGqBs2B/rXt7goCxbGdumZeMiLBbfbRbpINryKJln4B7vFl2tVqyfVKvgHqsWIChbZiPqJqKl5GWlnt4jZx+ZHN+YoN3dIB8YWpmcW5mZWVPVWNbQlRePkkoPjk9NCEiLSUfMi4gKjEvMDQ1Nzk5PEFDRkhKTE5QUFJUV1peYGBgYWJeX1xbWFVQTkpHQzU1My4vQFVaWFdYV1hYV1dYV1ZXV1dXWFdXWFlaWltcWFdXR0I70p+zsre9u7TCs6OcrKaltqihi5qgn52zs6meo6CdtZigs6iqq52vrp+rm5WvqKKOiJuOr6ypp6Knma6TmY+omqKepZ+ao6OlmZ+jqbKovK+lqJ6djn2Lm5WgoJmPkpqbkpuYqZ+hmaiup6Wmo6Wpu5+gxqelqaGrtLatrqefvK2trJWBqZKjr4+bgIakl5iQgYC4w7qDjp2ThKeWnIKsioKviKabm6Wpj37VvcKqYqO/vX1+o4KD17q4tYWUk4Oevb6EaqOBb6uEbZ1/erKwx4Nqq7C9rXh3or67dICWjqacj5uSl516gZCbemN9e2SMZnmCe2BrZWtqYlBiW1NqXEBUYUJOKT06NC8eHyQeJTIgHSQoMDQ5NjY3Nzs+QUNGR0pLTU5OUVRXXWFcX19hXmBbXFlUUU1JQz88QT81PVNZWFhZWVpZWlpZWFdXWFlaWllZWFlbW11dXFpWWFRXWryVs7Sxv7myvbOina6mpbOmnouYpb6pt7Goob+mprKcnrGcuaiera+mp5WUsKyXjIObka6mo6yhpJyqoZiLo5KnnqecmqGoopieoKytqrmuqKObl5N7h5mRppuSjpGYmI+ZlKqaoJipqaGqp6Gjq7ueqcWjoK+jq7O1q7CqoLuor6+ac3WqpLeGZYmfcGetj4qPbW93pJCZn4F1rpmVcI+LcZWoo5uXraNybW1tZYp4b22CmXGAeWlwaWeJlpWYcWhphIZncIZkXYljam9ZXWd+d6ZgYnGOkm9mZICNko6imJeZkZaffYeOlXZmh3hojWp5fnlkbGNmbGJLZFhKa1k6UWVFUidLOisjHCAbIywpGBsYLTIuNTo0NTc6PD9BQkRFSEtMTU9RU1ZdV1pcYGBhXV1bVFBMSEQ9OkFCN01YWlpZWVpZWFhZWFdXVldZXV5eXVxcXF1eXV5dW1tVV16ola2zqrq5srOrqaKunqSyqZiSvbHDyL62qp7Aq6yjoaesn7qjpK2sraaOlq6pkIyFlZetnqaqop+jo6CRjKSSp5mpmZajqqCWnKWmp6+6q6yam5OTe4SXjaWYjZGRmJSOmJaolJ+YqaObsaeeo6y6n7DBp6SzpqyxsquurKi5pK64loqhqKW2nYmWopeHqZqQlJ2TqrOZm6OroLGWoaGdoKKcoKShlaqmjJKSjIeSnJyUkJqTmJCOlYaBpJmXlY2Lk5KKj4aEfmeKf3SCdnSHjHGnbHuVkZSTgYGPj4+PnZSglpiWoYOHk41xaZB3cIp3dnx6amxkZG9jVWBYQGlbSGNhT1orRj0rJiE3NDAuHxwhJTIoKjY5OTQ2OTs+P0FCREZKS0tNT1BRWFVWWV5fYWNdXlVRSkVEPjk9QEFTWFtcWVdYWFhYWFlYWFpaW1xeX19gXl5eX19gYGBfWVlgpZapqqW1t66uorCkrZ+gtbGQjqvFvMS7uKqipZ2bpp6xqaO2p52ptaeokZisoouIiY+cp5aspKGZp56ek5Wjl6iaqZmUpqGjkJuomaG1uqirmZqQjXyBlIuglIqUkZWQkJOXpY+fmqqgnLajnaest6evwa6jt6avr7CtqqqzuaGvvZmSpqOmtqKSnaaejamfjZKfo6yvmqGjsaivl6OgnKOpnp6dnJarnZKZoZuUkJaqmY2ZmZaQlp+RiaCdlZSFkoyQjJSKgH5mjIZ1hnZ5iINznGqGkZSUkYp9jJaSkpiToZOdlqCDh5eHenKWc3mJf3F7f2puZF9waWBbYFltY1BgZFBbOkdHRD0yPT03LiomKykmHSY0MDY2NTg6PT0/QUFDSEpHSktMTVNTU1VaYGBpYGVWUEpBQ0I6OUVNVlteXltaXFtbW1xdXV9fXV5fYGFhYmFhYWBiYmJkYlxbY5eVpKijsLOsrqOpp62gqLWqkJCdpLO7r6ysoqOaep2isaSlsKiWm7ino5SZqpyOhoqJnKOQrp+jlqigoZKXmJuui6uWj6iZp4yZqI+eubakpZmbjYl5gpSLmpOJlZKUkI2RlqKMnp6pnp+4pICEr7WisK90pL6jsqB4eqCqsruVdq2kn4qAqn5kXGJ2n46knoSXfm6Ts5yjp66qo2Wdn5NzeZmXcICYqJdsf6KoimWcpZyRl5iVi5KckYadmpCVgpKHjo6SiYV3a4+HdoZxfIaAgGFpiIuVk4tbdpWRZ2iQjnJ7pZiYZHmYhoJ4mGmDioJueX9rcGVgdm9ra2hbZmViYm9TXD5OTk5SRz1AVEI5MS8eHyY0OjMxNjY3ODw7PkBBQkZIQkZGSUtNVFRVWVxfaGZnV1FKPERHOzhVUltgYWJgXmBfYGFhX1xdX19fYWFiY2RhYmFhZWRjaGReXWablqajobCxrKuppaito6etpJKWq7Wvsqaaqqarl3OMnbCfqKqmlJa5oKCPnKSdkX+IiJuejauao5Wnop6Ol5GehXWukIimmqiRl6SInLq0qKCZmIuJdXeTjJaTipSRkJSMj5Ogjpugp5mcs5aAjJy1nbOMko+8p6F+p6J6o6+3gY6Opp6Ei4WPsamvjImWo5p5gYushpydoqepp4eVhZh3pZt6h5uBl6aCgXucsXqKhaCXmZSYloKRl5aEmZljeYeQhI2PkoqDbXCPh3mAcYCBhX+GdIaElpJ4lmiTdKCadHyZg6Cchph+komCg5lqjYyFa3h7cXBnZHduaWxrW2VramVzXF5JVExRQEU1LllUVTYpITA5PT42NDM1Njg7Oj0+PkBESD9JRUpLR1NYWllbYWFoZllRSDlFTDs+YlZeYmRlZGBhYWBiYl9dYGFhYmJiY2ZnY2JhYGVkY2djYWFonJijn6aurquorKCosKanqaWZlK7GvbChlqaptZ6Pg52snKeioI2Qvp6ZjZ+aoJB9hY6Zl4irnaKWoKGSjZOJhoCRqI6Hopyjk5eehp66sqeem5KOhXB1kImVkIqUj4+bi4+Rn5KXoKSWnqyIn7SJtJqti8qHqq6It4WNsIOxroOpjaaYjZ18qI9ye3ebj6eWaJWkebSLn56mqJKZwoF/q4iYoXGegJmkfZeFlbGAoXyhlKCQmJaAjpObipeRi3yFk4aNlZOJg21zkYV/enKGgYR8hHSFgpeBj8VmgKmHj6NrnoOhmYOagIyMg4mYcI6ShWh3dHt2Z2h1cGdnbF5jb2xnbVhnR11RTDJFNDZNYGM3JjM8REdEOjY0NjU4Ozg+PT0+Qkw/TklKTENQWl1cV2JeamxcUUU9S01ASmRZXWNmaGdiYmJiZGNgX2JhYmNjY2RpaWNiYmJlY2FmY2JiaZWXop+wqKmopaugpLmwqqummpSgo6SqpJalqbajr3+hp5ylnp2JlL2ak42hkZ2QeYSWlpGHq5mbm5qihY+Md5ucj6CRiJ6km5WZmIaiua6lmpyMjH9ibY+Lk5CNkIyNmIuQkZ+PlKChmaGofqGnh62doJauj56dnZGGgaCNq6+GpI2qmoyafqJ2gJmTaoKsdU2reIeNnZGbqKeAqqt9g6F7eqdpnn+Sa2eXhpe2iZ59bmBkWYOWf4x7ZGiKcpl9eZVsXXuXbV9TcIRcX2x5g2BZZYJ9hIGYcaeqa4OjbnKlcJ+Dnmlln2xbbYl7ZVlfg39iV1BvdmVtdHJqam9eam9tbGpYaU9dV0U5QTRHQ15rNCxJQ1FNTj04NDg1OTs2QDs7PkJPPlFSTE1CSlxdX1deX2N2YE1EOk1PTVRiXFxmZmlpYmJkYmRkYmFiYGNkY2FiaWtkYmRkZ2RiZ2VhY2iYlp2guaGqo6askqG2vKuuopmXoKGlra2hna21oqiSoaCgppyZjpi0mZCLnoyVi3WBlJGNiqaWlZien3+ShYaspIeckYqYqZiZmpKHpbGnopWaiImAaW6Ih4uOjoqLjZKLkJKijJSeoJyipX+TgY+joZSgd5yWj6eDoad/hqmthaV5in2Emn2icHKTh5Z7nox5bYecjJmQm6iaj4edfIKic3amZp5+dqRfmHp9knOibpi3tLp0koeCf7WoZIHGuHtwlbeLcYCbpGNzrKtgfWqds35ufYeDjoKLl3GAo2xzpHOeg3+kYJ2Zs5VwfJeetHRzW56yg2pib3N1cWhvWGtscnNmXWleYktEPUQ1UUFZcTM9U0dfSlI9PDM5NTo6NkQ7O0BJUD9UTU5RQEVfXltaV2BgfGRIQzhMV1VWYmFaZmZra2JiZWFkY2BhYmBkZF9gY2tuY2NkZGhkYmdmY2holJaVo7mZq5yToI2kuLWuraCbopyjo6aunJuxrayTl6GZoaSZmpSeq5uLiZJ4i4VwgJaNio+gkJOUnZd9kImOqKCHmI+KkaKTm5qMi6iopZ6PloeEfmt7h399j42Di5CQiY+UoIKWnqCdoJ+LiXecmKKMoHKii4ipiJymkJaoq3+ujH16oJl6o5N4gHOWiI2cfZagh5uOmZumhqJkoXyIlpCbjWyeaJuNbpqZe4CKp31yaHSrg52DdKpnlJpdm4V2hJ1oqmqAuGZcqHCBnGGVjF6ndnWJin+eaJp1h5OSmI5/n26akG2nmV2ofne7a36qW46EXbRnXG5xeXdraVtxanh5Y2BmWGJBUEVON1ZCUm40S1paX05aQ0AxNTE7OzdIPzpDR1Q/WVJZXT5EYl5WYFFhY31pRUI5TltdWGRmWGZnbm1iYmVfYWFfX2BgZWNeYmRvcV9kZWVrZWNpaGdraZWciaq2m6iJY5SbrLqysKydppycqJ+erpuesKirnZekmqGfmJaWoKOZhomNaoiAcXuXiIuWloSRlJiPeoqElqSdipSPhYudkZyciY+oo6CZi5GKgIBpgYZ5f5eMe4iOjoiPlpp/lKOfoKKTmHJon4qfj4xxkoyBqYiZn6OooKh9sK2joriXd6OzoqN/iJR5nXurmn+ijp2bl4mXcaF8hY2vtX1rmpGheH6YtKOjq6iEmXybfZ2afnSqWl1ve5aLeJ5iTH56eoVjeZdCTZ9ZompxfI5tgYmEmXWbeYeJsbN/f5uTp3WBnW5yfJRvmXJqpF2VdkhlY2BzcH19bmVgbGh2fGRkYVFeVl1UVkBZRVFnRFNXW2JYXklEPUI4P0I6SUU4TERXQVZRW1ZERmJcWmBLYG1+cUVDPFVfYlplalZnaG1vYmZmXmFhXF1eYWhiX2VkdmxeZWdma2RmbGloa2mTnYCxrpmEU1+gp7O5s7OpmqKMnKucnKmUoaukoaiPn56dmpmVmKCdloiHiXeFgW55lYWQmot8kZOWiHKAiZOhnHORkIGImJSfmoSOqZyalIqLinyDbISFcYGhjHiFjYiHkpmVfJOkoZ+jiK6GfbWEjp6de6WWeqmClp2QiqGdfadodm1+mXShc3F8nYWZcJODrn2kg6aemoGjb16oZ3WjY2+lYZzSkHx6mXhyc2OihZB+o3Ojj3VrkLOLYIKYiXOqsqi8f3eDbX6+pqm0XpxufXGXb4FzonJdo2d0pmFopm2b1Jl8hJtveHmXa5t6d5dybamkZ2BleXB/g2tnZmRtdXdnYGJTW2VRUWFJV0lUX1dTW2VqXGRQRUNLTUpLQkpFOFA/UE1XU1hPUlJgZmVpUmN3eXdJRkVjXWRaaGlUaWhqb2NqZ2BjYFxdXV9oYmFoZXxkXmRnZGtkam1naGxol5uAsatUXEt+qa+xtLCzo5yYhZmooKCjjaSooJipiZmYmJOZk5KgmI6IhntwfYRofY+ClJqBd5GNjolvf4aQk5Jsl5R9iJGRo5WDjqqalJKLhYl5g3aIgG6Cn4Z3gJOGiJmil3qUo6Wan4mzoaK2i3qsp6SupXCpgJqQhYGcknykgKKZhphynoSira6Jl4yAjKSNloOtoZR2tbW1yaFzlIqBn2CdlqlteZWGn5p1oYd3oH6RloqAb0xmo5JwmodypHt5dGGDgmx+oGtxZGCccn90l2l7arS1tMamc5h+e51qm5urdYOabHR3l2maenWYclBEfbNeanZreIdmamdidHRxblZeVFloT1JoSVVMWVNVXWhrblZnV01KQUpNS0hKTkFRSlBkY2ltZXRyc355e251iXt7VFBPbF5oW2tpUmpoaWxnbGZjZV9cXVxeaWJkaGt7X11kaGNqZm9tZWlsZaGcibCnhGY/lKGyq6+vtaKjkICXqaKipYylp52cpYKal5aNl5CPnJOOiIN5anmGZYOMf5egeXWPiIyBaYSFkoOMhZ2NeoyKlaWSg5epl4yRi4GJeoB9i3lwkKGGeYGVh4mWoJZ/laapnJaWhGdueJxsomR8caV3nJhwZ6eBl4x7pXqfloOXcp52gYmUlo+5bpCKomJ9mKGViG1yaatqdaBtbqZgm2iKkGiWh5qVdaKAfZpgi4WMdG+IYmigZZ5+aZp1b2NmiIJucqJaX1tjoW5diYxve39zcmSlbXeiZGenaJhzi5huoW9TiI9voF9lp1SLXVSYbW1za3GBbXBoa3hza29SWFdWZllTbUlYT11IWGloc2pZa1ZRUkVWXExYUmFUaGped3V6fHB8fHKDe39ydo2AhHZeUXJiZ2JwZ1BqaGhrbG5nZGdfXV5dYGtjaml2dV1cY2ljampzbGZrbWOcpZmmemV0bYunrqSpsLGmn4uAl6udnqWMoqGaoqKAlpiTjZqPi5iQjop7h3GAiGiLi3yYm3N0in2QfGSCh5WKipWZgnyIhpankIGirJCFkIqCin2AgI5zaI+mhH2GlI2JmKCOiJOrp52JpniWnH+liZaMspiekIOvl5+leJWIeql0pY+Emm6kooyShIyDvG58pa+ChoWGkpacn3ylenGolaCWZ559bqtjloqVkneobKmigYl1h4J3q5GmiGuRsGt2s4ypa4qGbm2fnpKVYX+ri6p2gH+Mpp93n32FpZWdoGmah3asZ56tjLdzd76NpJNZg6aNq2F1cnNve3RxYmp+bmhtU1ZbVWFhXGtNXVJdSV5tbXZgW3FZW2BaZ3Nlbm9xY3F0YHd6fnlyeYNzhH+Ae3uMgYKAdmJ4ZGNtc2RSbGdob2xyaWZpYV9eXGJrYm1sem9cXGJpYmxqd21nbG5ilaaqnYGAnqSWqaqdqKeupJmKg5irmp6kiZqlnamchIyajoackYWSjYyNdIZ6iIRvjYR+mJN0dIZykoNtf4uSh4aUj3x7gYWXpY1/paaOgY6JhZV2goeSb2yLqYGDi5SOiZyfiY2Uq6SgkIB1lJeJf4F5lK6jf4GbcY+GeZCLhH97cqaMcX19epeWm4SOeHt+foiUlZOKdpCYn6CDen2JbIyFW3l4cXlxaG5+kolxf3SCj5STcYWDgmWNf1+Bf4t3dXOUdW95bm6HbYSGXndpeI1mgYKGjqmbfnR8l2qJiG+Adn2Fdm1sZ4xzeXuYeIRba1h5j2hud3Jxb3d4b11shm5pZ1ZaYFdcZWtjVWFVX1JfcHh5bGt2ZWpranZ8cXJ0c2FvdWJze4F4dXmCdYCAf4B4i4WDfXttf2xkeG5eV25naHVreGppamRcYFpjamVscHVuWltia2RsbHluaGxvYY6Uuamni6GimqakmaScq6OhhISYrJKdoImappqomIKBm4p+lpOHjoqJjXKDfI99fo+Fe5eOdHKDcJaFe32Si4aGkIV4fn+GmKONe6ehi4aQkIWWg4aOmHdyhaqGjpKckIienoiMm6igoKuDiY6Um4B+iZatqI+TppB4b52Rg3qSb36ohXB9lXFrcHyBn4t/ko6MaG1dg4uMm5uejnOVi4hxdGuCdnOAWXJuh5GBfX6Mal1qZHuFg4iAX2l4e5t7gouCdoGGgmh5i4drYXFyg3dfc4yCiZCnlYZmjI+DbneLhHGFjXlvZWdkeoN6lltcamdudlt7eHd0bXNygmZcbYprbGJZWV5aWGxxW19hWl5dZnR+e3VvdGNra2p7fHJ7eHRkbXRnbHt+dnp8e3p6f39+b4aKhHt9c355c39pVFxxaWx1b3Vna2hkXWFYa2hranFybVdbZW5sZ3N6b2hqbWCLjKqxoZCjoZqenpiemaijon6DmK2Nn5SHm6KQpZV/e5iEfJKZiYiGh4pzfYCLdoWLgYSWinFvgHKYhoR+k4SDhoqBeoCDi5ufj4KmoYd4jpiJlYuLnZeFg3qtgpGYmZSKnp2HiKGroKKio4uIk5ydo5mWqqGnpqCSm4iXjnx4jo6Ep35/kpGSk5yxppuUnpCNspOYhKWMjJWbn4mQm4KJkYprfI12d2WChpCKe4mdhIeLj4iIgIWEkHd8eXWaoYiGip+LhZR/foyBgHZwdIaEf3iIh4uQppGEhY2Ig42QjH2Ii4iPgXZsgoR8eZlqcmhhdIpwfXp3dm93dIFdXm+GaG5fXlpcXVNocVVjXFxhbGl1fHxzb3Bka2ppf3tteH9xaW9wbGaAe3KCgHh/fYCEem2DjIZ8enh8fXqDeU5kdmtzbXB6ZGtlYmJgW3RmcGZycm1VXWx0bWh5enFnaWtljYidup+XoqGYlZmYlJmkoJ57f5qrjp6NhZ+ci56WfXmUg3uOmYmGhISGbniAgHKBiH6IlIRtbH56l4aEg5B/gIaEhnyHg42bnZKHqp+DcoqQhpOSjJ2RfY17qoSNkpiVj5yXhoabp6Cimp2Gg5GampmQmqagpp2dkJaBkYp3fIiOhKV7fI6QkYaYqaGdk52PjauNkYCejImTmp6Cjpd+ho2Cb3iFcXRgf4KPhnWLl4CDj4KGhH6Fg5RueXV0kqKLjIWahYSNdICKfHxycnuIhHt5jI+Ek6ePhoSPgoSKiop3hoiJi3xva36Ae21obG1nXnl/aHx7dnR1dXt3XGBwfW51YGNaXV5RZm1TZVpeYWtpdnp+cWxsZGtqZ4B/bHOAbGx0b3huhHluh4B2goB9hHZyg42Ifnt7fH97gopgaXtqdWhpgmRqY2BpXGR1aG9idW5sVGNxeWVwenpzZWltbYuKn7eboqSfkpGWl4uan5+ee3ieppCbioaklIuYmXl6jYV8iZGDjIKBgm18f3hzgYV9ipF9a2h9gZeIgYiOfH6GhId8j4CPm5uRiKedf3CLi4yTh6GhioWNfKiRiI+Sl5OWk3iMo6Ghnpaaf4CQmpiTjJujoaSal5Gbf46FeYCDj4eggH2MjI98l6SgoJOZkI+mjY+Bm5GJkpebfpKSfoaNgXV0gnB2YH1/jYZyipV8iItyjH+ChYaOaHdxeIyYko9/l36Ii3OCh3x8cHl7jIR6e5KNg5amk4uGkXyGhoeFdoKDiId6ZXJ7fnh6cGxqZl59c2h8dXVzfHKAal5gdHZweGRjWV9eU2toVGRZX2FnanZ4gXFma2NsaGV/gGptfmhucWt9d4Z6a4yBc4GBfYF0doKNhn58e3+BfX+PanKDbnNpYYdobGJfcVZ0b21uYHhobVdqdHZjdXt7cmJqbnmJjZ+ykqalnI6QmI+GnKCbnHx2pKCNl3+MooqImpZ4e4aHfoOJfoiCgH9xf3t0doKFfoqReGdjfYaXioKKjXh9gIyDeZaAlZeWjZagm35vjIKRlIamm4iNiYSmlYWSi5aXk5J2kZ6hoZiUl3p+jpiXjpabnaSdmZOUnHqQhoN4hZeNnX6BiY2Mc5einqGTmY6PooyLg5aYg5KWmX6YjXyIjYF2cX1uemR/fIqFcIaTf5CCbIeCgYCJhGV1b3yHkpeNfZN4i4l8gId8e3F+eIqFeYWRiouYopWBhI13iISDgnd8gYmGdl94d31zfXdmbGRhfmlqd3N0dH1xfGJjYXNudXNtYVphXltrZFJiV2BhaGt2eYZxYmpjbWVofINsaHRobG9of3yCeW2QhnGAg4N/c3yDjIF/fnqCg358kG12iHR0bWWKbGphY3VWhGlxbmB5Z2xianZwZnl8enFgcmyGhZCcrpemqJ6NjZeHhp+Tl5h9eKqciph5l5yLjJiQeXuBi318g3uAgoB4dHl6c32AhH+Ji4BkXn2LlYd/hYd0fX6Kf32XhJeTloyjoZh/cod7k5KKp4+MjoqToZKDkZCUl5GLgY+YoJqSkJF0f42SlImdnZ6nmJiNlZZ0jo6LbIaYj5l6h4iQiW+XnZqjk5WKjZ+MhoGSnH+SkpWGmYh8iYmBenF5a3Vse32Lfm6FkoKUd2+Cg31+in9kcmp7gJaXhH+NdJCJg3mHfnV4gH2HgHyEjoWMlKSQeYWCdImHfYB0doGHg25ge3V6cXxvYW5jZXtibm92cnd3c3Rhdl9vbHVub1xcX15eal5PXVdjYWhtdHuJa19qZWpjaHeHbWZsaGlsaIB8endvkIdzgYOEfXOBhol6gn16gYR9fY5yeop4eG5sh2toX2lxY4docW9ld2hubGF5aGt9e3hwYXdti4GZmqqgo6idioqRhoqeipWXfXeumIyWfZ6TkZaUiHd+e4p9fIB2d3+AcHV0e2+GfYGAin98YVx+j5GGf4OEc3qAhnqPkYeSkZuSpZuVgn6BfI6LkqSJjoqNmJuNhpGYk5aOiYmMk52TkIyNboOQj5GJnpmioZeWipeRb4iZhGeGmY6UeomFkIpwlZqUoZKSiIuZjIJ/kJ58ko+Si5mOe4qEh3RzdWtxbnV7i3RuhZCOknF0gHuBgoh8ZHFseX2ZlH2EiHSQi4F0iHlvgH6Bh3yFjYqFjZWojXuIfX6LhXh+cXCAhYNjaHh0dnB7Yl5wYWt1XnFqenh4bHJwZXhdbWxzbXNZWl5gYmpaUFdXZWNncXF/h2ZdaWhnYmdxjm9kaWdlamiAend0bo6FdIGBgnt1goiFd4V8eISFeoCJd3+Le3pyeYNqa19waHSAa3JvbXFnb2xlfGNugHl2cWx3d4p/opiiqKCmm4eMioGQnIaTnHWBqpSSjYagjJaTkIB0fHaFd3h/cnN7hWtzcHpuinaAgYducVtZfpGNiH+AgHZ1gIB/oIaQipKcl6GUmHiKf4GNiZ2eio+GkpiWhYmVmY+XjIuNjo2dio6Qg22IipCRiZyWoZuYlYaYiGqFo4Nnhp2KkX6Lg4uBd5OYkZ6RkIiJlY1/fo+XfJGNj42aknyKf4JudnBsbW5we4Vpc4OOl4pwd390gomCeGZzb3aBmY58iYR6lJF6d4h0cIl7ho16i4eEiY+co4h8hHeCi394eG9rgYKBXXJzcXFxeFpecGBxa15vaXx5cG1tamx2YHBvanJtWlhhYWJuWFFTWmZnY3VwhIJiXWptZGJma5JtYGZmX2hqgXVxcnCLgHV/goB4dYCLgHiFf3eHhneDhXuGjH97dop/anFjfGKGfG9xbHRqaG9sdndfcX95e3R1dICCfqSVmq2eppaFjIN/l5SDj591i5+Uk4WKm4yVjYt6cnh0gnByhHNxdYhscG11bYh3g36AbW5VUYGrlIeCeIB2coJ5gaCCkYGTkpickpp4knuDjZOkmpOOiZWZk4WHl5mMlIyJj4+InoWQinxyioWJjoicmp+blpSBlH9php2IZ4ahiJKEkYOJcYORl4+ajY+Mi4+Nd3uSkHqOi4yRlox8iHyAa3ZqbmtrbHp+YXl+jpWBdnqAd4ONfHlndGx0h5WLf4iGe5SQcXqEcHeMeoqMeol+g4yRn52FfXx4gox9d3FqbIGCeV93b21scnNWXm9icmFfbG55cGdwZmZzdGhxa2F3ZV1XZmFgclNQTlxmZV14cIh8X1xocmJiZWaSaV9oZFtncH5wa3Bzin12fIWAdHV/jHl7hoF4iINzhoV+jIyDe3mVd2ZyaoNgiH5vb2t6YGpudH90X3R9eYZ4dHOFfHigj5mwnKWPgop/g5qIf4uef4uak4+EiJiOjo+EdnR2c4Bwb4VzcHGDb2tpdm2Cbn18bXVzUk6C38iS1pN8b3SEdoOggpN3lZGZm5Cae5RzhZCfoZOTkImTm5SGfpaViI2NiJGNiJyAjoF4eox+iIyKnJydm5WTeo52aImSh2yIo4WSh5eDhmOMkZmPlYmWjI2Ki3F7lIl6jYiKkpGJeYV7fmx7ZXJva2t5eVyAeY+NgHp9fn+Gjnp5aHNrc4uPioKFhX2VjGt+fm6AjH+Mh32Ee4OQlZqainx3eIOReXNtZnB/g2xqdG9oanRtU15vZHBZYGtxd2ZramJmeHJwcGNfeGBgVmtfXnZPTktgZmNdeXGJdFxcZXZgYWVlj2RgZmFYaXNzbmtxdox8dHmGgnV2fotzf4Z/e4l+comHgZCKiHx+mHZlc218ZYh+b3BsgFpsbnl5c2F2enuNdnN3ind5n4ubrpugkIKFd4iVfnyJnIeFn5GOhYyXhJOOh4F0d3B5cW6Eb21ufnJkZHhwfG16fWpobGOkmsHcru+hc2t1hHaFooWSb5aQlaCUnIGScYaLo5eJjZWKkJ2Wg4CVkIWJj4CSioqXf4d7dX+JeIaEjZybmJmPj3eMdm6GiYt9iqOEkYmdhYVei5SXio+IjouLhIlsfJaBfYiFiZCPhnaFfX1rfWR4dWpueHNYiHqRhoV6fn+AhYt+eGVzan+KjoqDgn+MloVrgXZuiJGCkIV/gnuAkZaTmZB1dHiIjXVzcWd1eYJidG1vYml2Z1JgcWdsVV9udHlgcmNfaH1wcm5bY3JhYlduWlx3TU1MZGZhXnZziW1cXGR5XmBkZoVgY2JeWWpya25rcnaMfXR3hIF4d3uJcYOEfX6Ie3SLiYiVhox+fphzaHVxeW2Lem50cIFYcXp2eXFld3mGjGl3gIlyf5yHmKeco5KEfHCMlHh5i52EhaGNjnuVjX+ZiIR7cndwc2pvgWtpbHx0XmB4dntwdXtnYWV869q1ycPciHNsc4F3ipqIjWmYj4+dlZOBiXGFiaCOhYqVio2YlHyNk4iDiY97kYuGkIJ/dniDg3KHgpOblpSYhox3iH9whYKJh5mig5SMnoOJYYOVj4eJhomNh4CHaX2Uf32DhImOjYJxhn5/cXdodnJpc3dsWox9koGFfH+DgISKgnVhdGyIgY+Lgn5/kpF9bYJseIaQhpOEfYF+gZKTkJeJb3J6jYZ1bHFrcniAX3NpblxrdmBSZHJpZlNfcHZ0YG9gXWiCcXNqV2doY2lYbVdbdUxKTGVnX2Jyc4VpW1xleV5eZGd7YGRfXFlrbmVvanN3in5zc4F+enZ6iHOFgnyAh3Z3ioaPmIKMgXuTdmx2dXl4k3RueHp9WHmFcYBvZ3l3koJkdoaFcYqWhZmhm6KKhnNvkotyd46cfYqaiYl8n3+DmX+BeHFzbm9kcn5oZmx3d1tfeXt6cXGAaWFnYX/Vto6QpnhucXd7cJKQjIdqmY6InJKMhXtpiIuah4GSkYaHmI18jY2BgYmOfJCNfoqFenV7gnpwhoCWmY6TlIGIdYOGdoOAi5Odn4aVj59+iGGAk4eFiISJjX9/g2d9kH9+f4KLj5B+bYJ8gnRrbXZ0c3Z1a2KNgY5/hX58hH+Eh35wX3NxhXyPjYJ8f5KJenCDZnmDioeMg3yEfoCUkJGThG5weox/dW5vamx6fWJoamlYbHVaUmlyamJRYnJ4bGFlXVpqg21zYlxnX2RsX25UW29OSE9nZVxnbnGAbFpbY3NgXGNsd2RlXV1abGxibWpzdod/cW9/fHx0eIZ4hYJ9gId1eYmBkpV8iIZ2iYFvd3l7hJNwbXyBd16Df3SBbWl7c5RzZ3OHfHKSkYOan5ughod2dpR+bXaTl36IkYOKjZp8i5p2fXZxb2xqYXR8Z2JpdXpaX3d8em1xf2VkaGhXnY9ecXKWvMODdXGUiZB+cpeMhpyTjIhza4mPloF7lIyBhJuMfIuGfXyJjH+UiHWJhXZ3fYFxdYaBnpSGlY+DgnJ/iHWEfImYnZiHk46dgIhlfZOCgIWDiYlygX1nfot7eH5/h4uOfGmAfIN2Zm94eHN2c2xqjYWKgYp/eIGAhIN/a15yeHp+jYqFe4KPgH5ygGl4g4eLhoR4g3yBl42QjH1ubXuJfXd1b2hnfHZjXHBiV29yU1Nuc2lhTmZ0eGVgXVxYboBvc1llYl1qbWBwT1lrUURTZ2Faa25te29aW15tY1pib3dkZlxdYGxqY21qc3aCg3Fufnt/dHWDeoOCfIGFdn6JgZaQeIOKdIGIcnh5fo2Qb298gXFpgXl6fm1tfHaVa2p4hHRslI2FnpigmYWIbn2Mdmp4mI5/goqClZeJeY6Wb3pzcGxqZGB0e2hgZXF6WmFyfXlncXphZWWPsbJ3SmJapNnQlnF7kIuQeH6Vi4WZkY2Gb2yGkpJ6eZKGgISYinyHf3h4iYqEloBvi4hxdH16aXmFg6WRhJONg39vfoN2hHmFm5iTi5KQlIWHcHuSg32Dg4mDboF4aICEeHJ/f4KKhntlfX6EdWRwc4BoeHBvdZiNhYKKe3Z4gIR5gWtccX1ygYiFiX2GiXqIcoBucYSHjoSFc4R4gJmNjYR4bm9/hH93e2Voan1wX1l3WlhxbU5XcnNnYEtsdnRgXVtbWXR9cm9XZ11manFfb05XaFE/WWdfW3BqZ3lxW1tYa2VZY3B5X2hcXmVtaGZsaXF3f4dvbH99gHVwgXp/gX6Cf3aBhYmXinGCjXF7hnx5eYOTjHVqen9rb350f31vcnx7lG9ugH94Z5KKgqGZnZGChmeHg29nepWJfn+FgZmKgXyNjGl4cmtsZl9hb3ltX2JveVxka4J6YXF2X2Vm1Oq+ijI6PouOgHJ5hYiOjXaDl4x+ko6Nf25shY2Mdn2Pf4WClYl8g3hudoaEg5d3b4iFa3V7dGZ5goOnjIOPi4R9bn90doN5hpyQjJCRkoyLhn57kod4gISNg2yAcml/fnhtfHuBioN3YnmEgXFkcWh+bXRxdYGbi4B/hX5ydX2AcoFwW21+dHiKg4t7h4B8iHh6cWyIg4+Ei3KBeX+Xi4t/dG5rd4CAdXVcaWh3cFlXfFNacGVMWnJyZVtKcHdvXFpaWV10fnVoWWJbZ2ZuY2lMV2ZRPV5mXF11ZV90b1pZVG9kWWRxeVpoXl9nbWdqbGlwd32ObGmChH55boB7fYF/gnp1goGNk4VwgItueH6AenuIkol/aHt9anR7coZ7c3d9f4x5eIR9fGuMjIObnZaMgYBsjn5raH6OjHt+f4OUgn99iohrdXFnaGNbYmdyb2BhbHRhaHCJeWJzdF5jZJugj25cNVmvtXVqgIl9koZ2hZaFc46LindwbYWDh3V5iXiJfZOIen9zZ3aIfn6Yb3GGfmh2eW1leYiEpYeAh42Jfm5+dn+AfIyZh4KTkJiIi4SJfI+IcXt9hHxpfm1rgHt6aXp2gYeBcmB3gX5xZHJndYJtdHuFlJGBfIF/bnd5fHR+bVhvf3Z0jIKGd4h2gol6eHNuiYGPgYVyfn1+k4mJem5uam6CgnVuXGdmc3FRW3tOXHBcT1tycGRWS3N4aldZWVphcYB0YF1dYGdkaGlmTlloTUBhZFtgdmFcdGxXV1N0YVpkb3JXal5haGtnbWxpcHd8kmtohIl8fHB+fnuBgIJ6d4CAiouDcXuHb3F3g397iY2Pg2p+e253eXaKd314gIKHf4N+fnpthYyImKONhIN7dYt5a2yEiJF4fXuBkYCAfoqDcHJwY2ZeWWdfcHBgYGdwZmpvinRhdG9bYWRqdnt/vpymo8i4cYWEc5R9eIaTgnORjYhycnCEe4N0dYd0iHeUiHl5cWN3hnqAk2lyhHZmd3ZjanyDiJ6Cf3+Ojn1yfnOEeYCRkIJ4lo2Uj4iCiHuJiWx5eX91aHtpa395c2l6doCCfWhgd4d9amt0aHt/aXaBjJCUfnp+fnB7dnt0fmJWd31yc4qEgnyDcYaKd3hwcIOCjX99eX59do6Gg3ZpcWltiIJycF1oY3NuSmV1TF5uVVRZc25iUU9zeGFSWFhdYnCCc1thXWhlZGNqZFFacElEZGFbY3BeXXdnVFZWd11bZW5oVmteYWpnZW9vaHB2epJuaYiMeX1ye354gYGBfHZ9hIiGg3B2g3Jud4KCfomLk39wgHt3eXqBjHWDeH+BgYKEeoB1b36Ji5qeiH2FeneGe2d0hYyQen9/e4mGhHaPgGdvbl9kXFhlWW1yYWBhcWxraIluYHNpWV5kbYB3qdqpx4aHsnGJeHCNdXuHj4B6k4qAdXR1fneAcHF/bYR0lIZ4dWxgeoJ5iI9mcYNvZ3ZuW219gJCTgIB4kpJ9eHtth3WAkIuEdJaKkY6HhYV7f4VsdXZ/bWh3ZW17dm1qdnd/f3xgYniGemh0dWN+emd0hY6MlXt0f3VxgHp8bX9ZVnR+b3WEh3+AeWyIhnR4a3V/g4R9e314e3KLgX1zZ3RlbouEbXRbal91ZEhubkxbYldWVXhtYlBTdHZYUFVYXmFxhG9cYGNtZWNebmJUXHJHQmZfXWZoXVp6YlFVXHVbW2drYVZqX2BuZmZrcWhwdXiOdGuOjXV/dnh+d4GDgXt0foSIh4NvcX90cXV+hYKJjYp7d394g3x8hYd4h3x9gX6EgHt+c3Z5jI6fjYl6iXZ0g3lefYWZjHmGg3SFhoV3iXtibmxbYltbYVZqc2NgXGdub2aHcWFxZlddY2t/fMrOiLmiam1timxxhHJ8hYp/e5GFenl0eXV1e2psdWOEdZGCd3BnXn2CeouJZXKCa2pxY1hse4aciIKBc5eUd357bohxgYqLh3GXjpCIhYuDe3l+cXFvfWZocmJueHFqa3F3fHx5XGV5gHdpdXhmgnZndIeLjZR8coZpb36AeW58XVhyf210gIt8gm9viX9xdmh3f4F/gXZ9cXp0h3x6cmZzYW6MgmxzWGtfd1tJbmtNVlVeVFV7a2FPVHVyUVFUVl5idIVoXGBsamZjWW5hWGJwR0FoXWBmX11Ve15PVmRwWVtqaF1XaGBfcmZraHJncHJ3hnhulYp0f3p4fnmCiIB1c4CGhY2CcHB7eHd1eYaGhouGenx/dYt+fYWEhId/fn59h398eHZ5d5KTn3+MfIttdoB5Y4OHl4ZzkotvhYWBeoN0Y25qWV9bXV1UZ3NlYFlkcnJmgXNia2VXW2Bpf3e+rnugt21ic4ZodHxyeoOGe32Mf3h4c3Zve3Zlam5gh3WOgXNqYl5+eHmLhGZxfmhqa1pWb3iKpIGFf3GZk3GAeHWCbYCCkYdzlYiMh4SIhX14dHJuaHlgam1gbXZrZ2preXd6d1tnfXx4ZXJ9boR0ZXWFjIaVf2+LZmt6g3VtdGJcb3xrdXyMfIFmdYd9bXFndX54fn9yfWx6eoF6eHBmbGJuin5tblZrYHdVSmprT1JOaE5ZfGhiTlV2akxQVFVfZ3aDZl1gcWhnYVdpXVtraEpFa1piZFdZVXlaTlZtalldbGVcWmVjXnRmbWRxZ3JvdYF3cJmFdn9+d398hYd9dXOCiH+Vgm5zeHp6c3OFh4iIhHmBfXaPf3yEiY6EgoR7fouDe3d8d3eanZd6ioOGaXd9fGyDhJOAco+CcYWCfoF/b2ZsZlddW1xbVGRxZV9YY3N1aXVwZWVjV1xcaIBwb3KAdIllZXh+aXR2c3ODhXiAhHl3dHVua3twYWdrZ4Z0jYRuZl1ffXB7iX5pbXdmaWRVV3JwjaZ8hHx2lpBze3N8em57e5CFdph8h4aDhoN8dHBybGd1XG1oX2x0ZGdmaXpve3JZZ4F3dGdwgHeCdWJ3hYp8lIBui2pteoFxZnNlYG16Z3N3inx+YnWDdmlrcXR6cHl5c31mfn9/eXduY2ZiboZ8bWtWamJwU0tpa09MTnBHXntmYU1VdGNKTlNXYWp2fmVcZ3NpZmBWY1dicF1MS2tYY2FVVFVzVkxYdWRaX2thXFtjZV93Zm1icGlzbnJ/dHSagXd/gHd/foaFen11goR+l4VucnR7enVxhIWPgYB6i3V0kYB9gZSOgIWEfX6Mhnt+gHZ7o6WKeYiFhGx1fHt1g4KMem6Fc3qEfYGDdW5qaGVWXVtaWlRibmRbWGJze2lobWlgYldfWmmAamtvgGhsYWh5eGt0dHRuhYF7f312dW16aGp5al9lbmiBdo+EZ2VYYndpfod7b2lvZ2ZdVVhvaI+ndoF6fJCOeXVvfm9zdXmPgHeVdIWCf4WIdmpydmdobltsZF1sc19nYWl4aHttWm2CcnNpb4B+eXdhd4SEeI+Ecohxb3l/cmNxaFxvd2Rxc4h8eGJzgHBnanhzcmx4d3V3ZIN7f3d2b2RkY258fWtsVWliZlNLbWhPR1JrRWF4Z2FNU3FdSU1UWWVrd3tlXm1xaWRdVl9Vbm5XS1RoWGZeWE5VbFRKXHlfW19rXV1aYmVgemhsYW9vdW5vd3V6mH13gIF6gH+Hhnp4eoN+gZOEcXR0fnp2dIWIkH2AfZBsc5WBfIOfhX+HfYB+hoKAint2hKyff3qIh4RscoJ6doCAgXVuh298f3OJgGpvbWRkWF9aWVpVYmpnW1pedYFpXm5sXGJWXFxrgWZydH1pal1rdnZndHdxbYV7fX15dnJsemhpeGZdZHNoeneSgWNjVGVwZ4KFd3dmaGpgV1ZZaGSQp25+eICLjnpwcHxmeW96jHt2jnGEfX5/hm5kdnNkaGhca2Jdb29bZ19sdWR6aF10gG9ya3F7fXV1YnSFinqHhn9/d3J1f3VhcGxZcXRicXKFfHVkcn9sYWx6b2ppenh1cmaFdXp6dXBkYWRuc35pbFRpXl1US3NjUUdWYUdidmZhS1RvV0pMWFhnbHZ6ZGVucWZjWlddWHZlVEpcY1hoWFlJV2VRSGJ4Wl1fbFteXGFkXn9pamBvdHhtb252g5h5coGAfH+Ii4Z9dXaGeIeMfXR1dYJ4enqCjI59foSJanSXgXuLnX1+hXqBen58hohzcY+ujHt7hpB+ZnKIenR8fHZyb4Zse35sj3picG9iZV1lVllZV2Rma2BdXHOFaFhxblpeV1pcbHtjcHd2bGJbbXN0Z3V1cG2EeH6AeXdubnRlaXRlW2d1ZnZ2kXpfXVJlZmqCgnR9YmNpXFRYXmJjkKVoeXSChZB4bW55Z3htfIV7dYhygHh8eH9oZXZtYGZgXmpfXXNrWWVdb29iemVbd3trbm5wd3hzdGRyg5J+h4KIenZvcn1yYnhkW29wYnFxgnxzZnGAZF5udmlkZ3l6dG5vgXV0fXNxYl9mbm99ZGpTaFhZVE13X1FKWVlIYnRkYUlUbVNJTFpXaWxye2JsbHNjYVpaW2F2W1NLZF1YaVNXR1lgTkdpdVheYW1bW19iYl2FaGhhbnh5bG5qdoGQeW6DfoCBkoiEgXZ0iXSMhnRyd3aBd3x9foyPgH6TfnB4loN9mZJ5gIB4eX1/dIiDc3CZont6f4mVeWR1iHlzeHVsdG9+bHl8cJFyXnBvYGdibFRbWldoY21mXFxxiGVScm5bWlhYYGx3ZGl1ampeWm1zcW10c3RqhXx+f3x3bm5sZGlxY1tqcmR0do9zW1dTZGFygH9ygl1iY11TWmBbY5OfZXJxhYSRdGxqeWxvcHp8e3GAd39yenp6ZGZ2Z11iWmFnW153aFdiXm9oYXdgW3t2amlybndzc3RocIGUgoZ+hHZyanB8bWZ3V1xrbWJxc4F6c2Zvfltgb3FiX2pxfWxsdH5zcXhrcGFcZWxsemFnU2dVV1JQdltSUFlSSWNzYmBHVWpQSE9aVmtsa3xmbW9xYVxaWFlscFdSUGZXV2lTVEZaXE9IcnVYX2NtY1hhYGFdi2pjZG15eGtuaXV5hntrg32AhJl8goR5fYhuj4Zxb3d6fHSCgnyLj4OClnR4gpSFgZ+JdYCAgXN/gXCHgnVvopd0e4aLh3tmeItvbntvZnhwemxzdnKMa150bmFnZWtSXVtWZ2JsbFpccYxkT29uXVZYVWdqdGhidGVlXVpudW5xdXV5a4d8f3yId5BzZGRrbmFcbm1jc3iHa1pUVmJjeH19cYVdY19jVFtgWWOWlWNucIOFinNqaHpuZXN2c3xsenR1b3p+dV9mcmNbXlZiZFhhdWVVX2BtZGFxXV1+cGhpc3FzcHV1a22Ek4GIe4RxcmZufXByb1NbZmpmcXSBd3NibHZVYnFqW19uZXxlbXZ8c3Jzam1gWmRqandeZlRkVVZQVG1XUVdTUEhlcl9hRlhpTkhYVFZuaWR8aWt4a2JXXFVbdGRTUldoUVlmVFNIWlpQTXh3W19lbGlaYmBeXo9uYmZreXVub2h2dn9/bIOAfYaXe3+IgYp/a5OIcmd0gHt1gIN9iI5/i5NyfYqRhYefhnt/hoxzgIZzfYN2bqWMc4GNi3d4bnqMYGR8cGZ6c3lsbXF2gmdke2xjZmdoU15eVGdgbG9bXm6NaE5qbWBUVlNvZ3RrZXhkZV1ZcHRtcnp4c22Ie4B2nHt6a2FlbG1eYG9qZXB5fmdaVlhga3h8e3CEX2JeZ1ZZYFdknIhia3GBh313a2t4bFt2cWx6aXZzbm97gHJYam5fWV1VYWNXZHFjU15haWJibFpgfmxma3N1bm13dmtohYx/iHqHbXFmcHxtcm1jWWBoaW90gXRyXmlsUmVxZFRibmJ6Y3F2e3VrcG1rX1hhZ2h0XGVWYVZTTlhlUk9cT09IZXBdY0ZZaU1JX0tYbWRgeGhufmRgVV5UXXRbVFJgZk5dYVRTSlxZUFl1dl1fZm1oWGNhW16OcGNnandxc21odnR6g3OBg3qIjX58ioeOem6QinRsc4J0f3+IhYaRhJWPen2Mj4iRm4SAfIyEc3+Bc3R4cW6Tk5OTk5OTk5OTkpKSkpKSkpKSkpKSk5OTkpKSkpKSkpKSkpKSkZGRkJCPj4+Pj4+Ojo6Pj46OjY2Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2NjYyMjI2NjY2Njo6Ojo6OjY6OjY2Ojo6Oj4+Pjo2NjY2Oj4+Pj4+PjoKAfnp6fX5+fX1/fn59fn5+fn5+fn+Af4CAgIGAgIB/gIGBgYOHjI6Ojo6NjY2NjY2NjY2NjZKSkpOTkpKSkpKSkpKSkpGRkZGSkpKSkpKSkpKSkpKSkpKSkpGRkZCQkI+Pjo6Ojo6NjY6Ojo2NjY2Njo6Njo6OjY2NjY2Njo6Ojo6Ojo6NjYyMjY2MjIyNjY2Njo6Ojo6NjY2NjY2Njo6Ojo6OjY2NjY2Ojo6Ojo+Ogn99ent8fn59fX5+fn5+fn5+fn5+f4B/gICAgICAgH+BgYCBg4aMjY6NjY2NjY2NjIyMjIyMkpKSkpKSkpKSkpKSkpKSkZKSkpKSk5KSkpKRkZGRkZKSkpGRkZGQkJCQj4+Ojo6OjY2NjY2Njo6Ojo6Ojo6Ojo6Ojo6Ojo2Ojo6Ojo6Ojo2NjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Njo6Ojo2NjY2NjY2NjY6Ojo6Cf3x6fHx9fn19fn19fX59fn5+fn5+gH9/gICBgYGAf4CAgICDhouOjo2NjY2NjIyMjIyMjIySk5OTk5OTk5OSkpKSkZGSkpKSkpKSkpGRkZGRkZGRkJCQkJGRkZCQkJCPj46Pjo6Ojo6Ojo6Ojo6Ojo6Oj4+Pjo6Njo6Ojo6Ojo6Ojo6OjY2MjIyMjIyMjIyMjY2NjY2NjY2NjY2NjY2Njo6NjY2MjIyNjY2Njo6OjoN/fHp8fH1+fH1+fXx9fn59fn5+fn5/f3+BgYGAgICAgYCAgIOGi42NjY2NjIyMjIyMjIyMjJA+LjExMTEvb4eEhISEiF0tMDAwMC1GoaGhoaGhoJqZmpqampqKg4SEhIOEd2VnZmZmaFxDREREREVCMS8vMDAwLz5ERERERENYaGdnZ2dmb4SDg4ODg4OLjIyMjIyMjY2NjYyMjY2NjY2NjY2NjIyMjIyNjY2NjY2OhX19e3t6fX58fH59fX1+fX1+fn5+fn9/f4GBgYCAgICBgICAgoWKjI2MjIyMjIyMjIyMjIyMjy0aHR0dHBpohYKCgoKGUxgdHR0dGTekpKSkpKSjnJycnJycnImBgoKBgYJyXV9fX19hUjQ1NTU1NTMfHR0dHBwcLjc1NTU1NE1hX19fX15qgoGBgYGAgYqLi4yMjIyMjIyMjIyMjIyMjY2NjY2MjIyMjIyMjY2NjY2GfH16e3p8fXt8fn19fX59fX5+fn5/f3+AgYCBgYGAgIGBgYGChYqNjYyMjIyMjIyMjIuLi4uRiYeHiIiIh46QkJCQkJCMh4eIh4eHiZKTkpKSkpKRkZGRkZGRj46Ojo2NjYuJiYmJiYmIhYaFhYWGhYODg4SEhISFhYaFhYWFh4mIiIiIiImKioqKioqKi4uLi4uLi4uLjIyLi4yMjIyMjI2NjIyMjIyMjIyMjY2Njoh8f3l7ent8e319fX18fX19fX5+fn9/f4CBgYGBgYGAgYCAgYKFioyMjIyMjIyMjIuLi4uLi5GTk5OTk46RkpGJh46KkJKTkImQj4yOhYqRkZGRkJCQkJCPj4+Pj4+Ojo6Njo6Ojo2Njo2Njo6Ojo6Ojo6Oj4+Pj46Ojo6Ojo6NjY2MjIyMjIuLi4uLiouLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyNjY2NiX59eHh5fH18fX19fHx9fX59fn5+f3+AgICBgYGBgYCBgIGCgoSKjIyMjIyMjIyLi4uLi4qLkJCRkZGPhI6QkIaKj4WNkJCMiIeHiI2IiZCQkJCQkJCQkI+Pj4+Ojo6NjY2NjYyMjIyMjIyMjIyMjIyMjIyMjI2NjIyMjIyMjIyMi4uLi4uLi4uLi4qKiouLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjI2Lfnx3dnh7fXx7fX18fH19fn5+fn5/f4CAgIGBgYGBgIGAgIGChIqMjIyMjIuLi4uLioqKioqQkJCQkIqFjoiOhoaPiY2QkJGNhoWGj4mMkI+Pj4+Qj5CPj4+Ojo6OjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLi4uLi4qKioqKi4qKi4qKi4uKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIt+e3d2eHt8fHx9fX19fX1+fn5/fn9/f3+AgIGAgYGAgYCBgYGEiYyMi4uLi4uLioqKioqKipCQkJCPhYOMjpCOiYyKjpCQj4eLh4iMiI6Pj4+Pj4+Pj4+Pjo6OjY2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKioqKioqLi4uKioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMin18dnZ4fHx7fH19fH19fn5+fn5+fn9/f4CAgYCBgYGBgIGAgYSJi4yLi4uLi4qKiomJiYmJkJCQkJCMhoyJjoeFjYmOi4yMhIuHhoyIj4+Pjo+Pj4+Pjo6OjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKioqKioqKioqKi4uLioqKioqKioqLi4uLi4uLjIyMjIyMi4uMjIyKf353eHp7enp8fHx8fX1+fn5+fn9+fn9/gICAgICBgICAgYCBhIqMi4uLioqKioqJiYmJiYmPj4+Pj5CMjouPjIqPjI6MjY2Ii4yLjYyOj46Ojo6Ojo6Ojo6NjYyMjIyLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLjIiAfXh5enp6e318e3t9fn5+fn5/f35+f39/gICBgICAgIGBgIGEiouLioqKioqJiYmJiYmIiI+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pjo+Ojo6Ojo6Ojo6Ojo2NjYyMjIyLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLioqKi4uLh4B8eHp6eXt8fHt8fH1+fn5+fn9/fn9/f39/gIB/gYGAgIB/gYSJi4qKioqJiYmJiYmJiIiIj4+Pj4+Pj4+Pj46Pj4+Oj4+Ojo6Ojo6Ojo6OjY2NjY2NjY2MjIyMjIuLi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKiYmKioqKioqKioqKioqKioqKioqKi4uHgHt5eXh6fHx6e3t9fX5+fn5+f39+f39/f39/f3+BgYCAgH+BhIiLiomJiYmJiYmJiIiIiIiOjo6Ojo6Pj46MjI+Sj5COjo6Ojo6NjY2NjY2NjY2NjIyMjIyMjIuLi4uLioqKioqLi4uLi4uLi4uLi4uMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKiomKiomJiYqKioqKioqJiYmJioqKioqKioqKioqKioqKioqKi4aBe3h5eHp8ent7fH19fn5+fn5/f35/f39+fn9/f4CAgYCAgIGEiIqJiYmJiYmJiIiIiIeHh46Ojo6Ojo6Ojo+MkJOQkI+Ojo6NjY2NjY2NjYyMjIyMjIyMjIuLi4uLi4qKioqKioqKi4uLi4uLi4uLi4uLi4uMjIyLi4uLi4uLioqKioqKioqKiYmJiYmJiYmJiYmKioqKiomJiYmJiYmJiYqKioqKiomJioqKioqKhYB6eHl5fHt6ent8fH1+fn1+fn9/fX9/f35/f39/gICBgICAgYSIiomJiYiIiIiIiIeHh4eHjY2Ojo6Ojo6Pj4+PjoyNkI2NjY2NjY2MjIyMjIyMjIyMi4uLi4uLioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYmJiYmJiYmKioqJiYmJiYmJiYmJiYmKioqJiYmJiYmJioqFf3l6eXh7e3p7fHx7fn5+fX5+f39+f35/fn+Af3+AgICBgYCChIeKiYmIiIiIh4eHh4eHh4eNjY2Njo6Oi42Nj5WPiYyPjYyNjYyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYR+eXt5ent7eXt9fHt+fn59fn1+f35/fn9+f3+AgICAf4CAgICEh4mIiIiHh4eHh4eHh4aGhoyNjY2NjY+MjImKj42IjJGPjY2NjIyMjIyMjIyLi4uLi4uKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uKioqJiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJg355e3p8e3p7fX17fH9+fn5+fX5/fn9+f3+Af4CAgH+AgH9/f4OGiIiHh4eHh4aGhoaGhoaGjIyMjIyLiYyKiIeJhoyOjJCMjZGOjIyMi4uLi4uLi4uLi4qKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiImJiYmJiYmJiYmJiYmJiYmJiYmIiImJiYmJiYmJiYmJiYiIiIiIiYmCf3h7e3t6enx9fHx9f39+fn19fn9/f39/f4F/gIB/gICAgICAg4aIh4eHhoaGhoaGhoaGhoWMjIyMi4yOjoyKioeEiIuKjIuNjo+Li4uLi4uLi4uLi4uLioqKiomJiYmKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiomJiYmJiYiIiIiIiIiIiImJiYmJiYmJiYmJiIiIiIiIiYmIiIiIiIiIiIiIiIiIiIJ/eHp7enp6e3x8fX1+f35+fX1+f39/fn+AgICAf3+Af4CAgYCDhYiHh4aGhoaGhoaFhYWFhYyMjI2NjJCSjI2Ii4mJi4uLi4mLjIqMi4uLi4uLioqLi4qKiomJiYmJiYmJiYqKioqKioqKioqKioqKioqKioqKioqKiYqJioqJiYmJiYmIiIiIiIiIiIiIiImJiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIiIiIiIiIiHgXx4e3x5enp8fHx9fX9/fn59fX9/f39+fn+Af4B/f3+Af4CAgIKEh4eGhoaGhYWFhYWFhYWFjIyNkY+PjZGJjIaJjIuIiImMiYeNjo+NioqKioqKioqKiomJiYmJiYmJiYmJioqKioqKioqKioqKioqJioqKioqKiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4WAenl9e3t7enx8fHx9f39+fn19f39/f35+f4B/gH9/f4B/gH+AgoSHhoaGhYWFhYWFhYWFhISLi46PjoyLj4iHiYmMjYWFjo2KiYyNi46KioqKiomJiYmJiYmJiYmJiYmJiYmJiYmKioqKioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHhoaHh4eHhH55eX16enp7fXt8fX5+f35+fX5/f39/fX5/f3+Af39/f39/f4CChIaFhoWFhYWFhYWFhISEhIuLjI6MjI2Lh4mIiomGgoiNjoiKi5GTj4uJiYmJiYmJiYmJiYmIiYmJiYmJiYmJiYmKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIeHh4eHh4eIiIiIiIiIiIiIh4eHh4eHhoaGh4aGhoaGhoaGh4eDfXp5e3p5enx8e31+fn5/fn59fn9/fn9+fn+AgICAf35/f39/gIKEhoWFhYWFhISEhISEhISEioqOjYmIiIqKh4iHiomIioiIh4qGi5GPiomJiYmJiYiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHh4iIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGh4J8eXl6eXp7e3t7fX5+fn5+fn59gH9/f39/f4CAgH9/fn9/gICAgoSGhYWFhISEhISEhISEhISKi5CPiYmJi4qHh4WHiYuKiYSLjYmOjYqJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiIiIiImJiYmJiYiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGgXt4enp4e3x7e3x+fn9+fn5+fX1/f39/f3+Af4B/f39/f3+Af4CChIaFhYSEhISEhISEhISEhI+Qj4+IiYuIhoeIiYuLjIuJioqNio6Oj4iJiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoaAe3h5eXh4enp8fX1+f35+fn59fn9/f39/gIB/gICAf39/gIB/gYKDhoiGiIaDhISEhIODg4ODkpKOioeKi4qLh4uNiYqJi4iHiouIio+SioiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhn96eXh4eHl5eXx9fn5/fn5/fn1+f35/f3+Af39/f4CAgH+AgH+BgoOHjo+PjoiHhIWFhoaFhYWSkI6KiYmIiImKioiIh4aKjIiHiYmOkJGNh4iIiIiIiIiIiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4aGh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWGf3l4d3d3eXp5e3x9fn9+f35+fn5+f35+fn+Af4CAgICAf3+Af4GBg4eOjo6Ojo6Mjo2OjY2MjZCQjomHhoiJiYeIiouIiYyJiYaKjY6PkYuIiIiIiIeHh4eIiIiIiIiHh4eHh4iIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhYZ+eXd5d3d6eXl8e31/fn5/fn5+fn5+fn9+f4B/fn+Af39/f39+gIGEiI6Ojo6Ojo6Ojo6Ojo2NkJGOi42JjIiIiYaHiYaIioiHi4yLjpCQiIeIiYmJiIeHh4iIiYmIh4eHh4iIiYiIiIiIh4iIiIiHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhoaFhYaGhoWGhYSEhIWFhoaFhIWFhX55d3l2eHl4e3x7fn5+fn5+fn5+fn5+f39+f39+f39/f35/f3+AgYOGjY2Ojo6OjY6NjY6OjY2Qj42Ni46KhoiKhISLiYeDhYSDi4mLj42JjI6QkI+NjYyLjY6Pj42NjI2Nj4+Pjo6MjYyMjY2KiYiHiImHh4aHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoeHiYqKiIeJi4yNjo2LiImLi42OjYyJiImMgHl3d3Z6eXh7e3t9fn5+fn5+fn5+fn5/f39+fn5/f4B/f4B/f4CBg4aMjY2NjY2NjY2Qj4+Pj46NjI6KiYuMjIeFiY2Lh4aIh4aHh4uNjo6Pj4+Pjo+Pj4+Pj4+Pj4+Pj4+Ojo+Pj4+Pj4+Pj4+Oj46Oj46Mi4uJh4eHh4aIhoaGhoaGhoaGhoeLiYeHiIiLjY2Mi4yLjY2Ojo+Ojo6Pj46Ojo6Ojo6Ojo6Njo6NjY2AeHZ4eHp4enx6fH5+fn5+fn5+fn5+f39/fn59fn9/f39/gH9/gIGDhoyMjIyMjY+QkpOTk5KSjYyMjIqHioyKh4eJiYWCiouIiYWJjpCNjo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjI2NjI2LiYaHh4eHiYqLjY6NjYyNjY6OjY2OjY2NjY2NjY2NjY2NjY2OjIyNj4+OjY2MjIyLi313dXd5enp7e3p+fn5+fn5+f35+fn5/f39+fn1+f39/gICAf3+AgYOFj5KRkJGSk5OTk5OTkpKLi4uLiomMiouLiYuKhoeOjYiIjI6OjIuMjIyNj46Njo6Ojo2NjY2MjY2NjIyMjIyMjIyMjY2NjYyMjI2NjYyMjI2NjIyNjIyMi4yMi4yMjI2MjIyMjIyMjIyMjIyLi4uLi4yNjY6Sk5OSkpSRkJOVlZSTk5COjo6Oe3Z2d3h6ent7e31+fn5+fn5/fn5+fn5/f35+fn9/f39/gIB/f4CBgoSNkpKTkpOSkpOTkZKSkoqJioyJi4qJjIuKioiHiYqKi4mKjY2Mj46Nj5KUlJOUlJOTkpGSkI+Ojo2NjY2Pko+OkZGOjIuKioqLi4qKi5CPjoyMjIqKioqKioqKiouKioqKi4yLi4uMjIyKiouLi46RkpOTk5SUk5STk5SUlJOTk5KSkpKSk5F6dXZ2eHt7e3p6fX5+fn5+fn5+fn5+fX5/fn5+f39/f3+Af39/gIGChIuRkZGRkZKSkpGRkpGRiYmIiIqMiYiJiYuJhoSJhoyKh4ySkpKTk5OUlZWWlZWUk5OUlJSUk5SUlJSVlZWVlZWUlJOTkY+QkZKQjoyRlZWVk5KSjo+QjYqKi4qKi42OjY6RkpCRkpKSkpGRkpKSk5OTk5OTk5OTk5OTkpOSkpKSkpKSkpKSj3h1d3l6e3t7ent9fX19fn5/f35+fX5+fn5+f39/fn9/f4B/f3+AgYKEi5GQkJCSkpKRkZGRkZGIiIiIi4uJg4eLi4yMiIeHjYyNkpSSkpOTlJWWlpaVlZSSkpOTlJSUlJWVlZaXlpaWlpWUk5SUlJSVlJSUk5OVlZWUk5KTk5OTkJGSkZGSk5OTk5KSkpOSkpKSkpKSkpKSkpKSk5OTk5SUk5OSkpOTkpKSkpGRkZGPdnJ3enp7e3t8fX59fX1+fn9+fn9+fn5+fn6Af39/f3+Af3+Af4CBgoSKkJCRkZGRkZCQkJCQkIeHh4eIiIiFi4+KjI6Njo+OkJWUk5OTk5SUlZWVlJSVk5KSkpKTlZSUlZaWlpaWlpaWlpSTk5OTk5OUlJOSk5SVlZSTkpKSkpOTk5OTk5OTk5KSkpKSkpKSkpGSkpGRkZGRkZKTlJSUlJSTkpGRkZGRkZGRkZGRkYx0c3d6ent7e3x9fX1+fX5+f35+fn5+fn5+fn9/f39/fn9/f39/f4GDhIqQkJGRkJCQj4+Pj4+Ph4iKi4yNjYuOj42Mjo6RkpGSk5OSkpKSk5SUlJKSk5OTk5OSkpOUk5OTk5WVlZWUlZWUk5OTk5KSk5OUk5KTlJSUk5KSkpKSk5OTkpKSkpKRkZKSkpKSkpKSkpKSkZKRkZGSkpOTlJSUk5OSkZGRkZGQkJCQkZCRinN0dnp8fHp7fXx9fn59f35/f35+fn9+f31+f39+fn59f39/gH+AgYKDipCQkZGQj5CPjo+Pjo+Oj4+Pj4+Pj4+PkI2OjpCRkpKSkpKRkpKTk5OTkpGSkpKRkZKSk5OSk5OSk5STk5OTlJOSk5OTk5OTk5OSk5OTkpKSkpKSkpKSkpGRkZGSkZCRkZGRkpKRkZGRkpGRkZGRkpKSkpKSkpKSkpKRkJCQkJCQkJCQkJGGc3V2e3x8e3x9fX1+fn1/f35/fn5/gH9+fX5/fX5/fn5/f3+Af3+BgYGKkI+PkI+Pj4+Pj4+Pj4+Oj46Oj4+Pj5CQiI2PkJGRkpKSkpOTk5OTkpKSk5KSkZGRkZKSk5KTkpGRkpKSkZKSkpKSkpKTk5KRkZKTkpGRkpKSkpKRkJCQkJGRkZGQkJGSkZGRkZGSkZGRkZGRkZGSkpKSkpKSkZCRkZCPj4+Pj4+Pj4+PkX9ydHh8fHx7fHx9fX5+fn9+fn5/f3+AgH99fn5+f39+f39/f4CAf4GBgYqPj4+Pjo6Ojo+Pj46Ojo6Ojo+PkI+Pj4+GjpCQkJCRkZGRkZGRkZGQkJCQkZGRkZGRkZGRkZGQkJCRkZCQkJGRkZGRkZGRkJCQkZGQkJGRkZGRkI+PkJCQkJGRkJCQkJCRkJCQkJCQkZCQkJCQkJCQkZCQkJCPj4+Pjo+Pj46Ojo+Pj4+PeHJ2eXx9fHp9fH19fn5+f35+f39/f4CAf39/fn5/f35/f39/gIB/gYGAio6Ojo6NjY2Ojo6Ojo6NjY2Oj4+Pj4+PjoiQkZCPj4+QkJCQkJCQkI+PkJCQj4+Pj5CQkJCQkJCPj4+PkI+PkJCQkJCQj4+Oj4+QkI+PkJCQkJCPjo+QkJCPj4+Pj4+PkJCQkI+PkI+Qj4+PkI+PkJCQkI+OkI+Pj46OjoyMjY2NjIqDiYhzc3Z4fX58eX18fX1+fn5/fX5/fn9/f39/f4B/f39/f4CAgH+AgH+BgYCJjY2Ojo6Ojo6OjY2OjoyNjY6Ojo6Ojo2NiJCRkI6Njo6Ojo6Ojo6Pjo6Ojo6Ojo6Pjo6Ojo6Ojo6OjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Pj46Oj4+Pj4+Pj4+Pjo+PjY2MjYyNjoyLi4mJiYiFhYSDgoKEgnR5fXp4dXJrZWltb2xmZmdncHNzd3l9fnl6e3x9fX1+fn59fn9/fn9/f39/gIB/f3+AgIGAgIB/f4CBgImNjY2NjY2MjYyMjIyMi4uLjYyMjIyMjIyGj5GRjIyMjIyMjIyMjIyMjIyMjIyNjY2MjIyMjYyMjY2MjIyNjY2NjYyMjI2MiomKi4uJh4KAh4iEgXt6gH57fXx8fXlzcnJycnV1cG1ramppZ2NkYV9bXF1eWFVXWFlTS0VJSkpLTE1PT0tgdHR3eX19eHp5e3x8fX5+fn1+f39+f35/f4CAgH+AgICBgYCAgICAgIGAf4OEhYSFiIuLjYyMjIuLi4yGiYqKioqKh4OOkJGNiouLi4uMiYmKioqKiouLi4eDi4qIiYmGhYWEhIeJiYWCg397fHl6e3pzcHFxcW1samdsbWdlZmVmZGNlZGVkZWVlZWRkZGNhYV5dXFpYWFdUUFFSU1JTTU1KSUZESEpHR0hHR0xOSWdzdXh6fXp4d3l8fHx8fn5+fn9/fn9/f39+f4CAgIB/gICBgICAgICBgYFnXmBjYWNucX17ent/fXd8fHZ4ent4eHpvcHt4eXt8e3h3e394dXd0dHZ0dXZ3dXFycW5wcnBnaGtsbm9tamlpaGhlZWRkZF9gYWJgYF5dWVhaWltdXV9gX2BfX19gYmFeXl5eWVldXF1bV1dWUlRSU1NOUUpISUZERUhMTEhGR0lLSklNbXJ0eHp7end3eXt6e3x+fn1+f39+f35/f35+gIGAf3+AgIGAgICAgICCgWdYW1pZXFtcY1xaXF5ga3FtcHBvbm5vbmtpbmxrbG9qaWtraWpraWZmZ2dnaGhnbWdqZ2hlaGdjYmJhYmBgXVhbW1dYV1RWUVBUU1NNSkxLTExOTk9UWFhXVVVUUlBQTU1QT05LTE1QUU9MTEpHSUlHSEhJSEhIR0ZHSEpKSEhISUlISVZwc3V5ent5dnZ5enp7fH59fX5/f35/fn5+f3+AgX9+f4B/gICAgICAgIGBbFtYVlZWWVlaWVlYVVZoamxubmxra2poaGloZGVkYlxiZl9fYWNfXF9dYF1eWl5dWVleYmFeXlpZX1tYV1NOTUxLS0tMSUtNTktKS0tMSktQTEtLRkdHSUlGR0lISUZFSEdGRkVERUVEREVJSUlHSEdIRkZLTUtJSUlIR0hLTU1LTExMVXFzdnl6e3h2d3h3ent8fn1+fn9/f39+f3+AgIGAfn5/f4CAf4CAgIB/gYJoUlRVVlNVV1lZWVdXV1tbYWNfXlxbWFZWWVZSVFJRUVVUU1NUUE1KTU5QUk9NUFFRUVFSVlZSUVFUUFBOTk9MSk1MS0xKSktLRklJSkxJR0pISUlFR0dGRkVFSElKR0ZHRkZHR0hKR0dISEpMSkpLSUlISktLSkhKS0pISUtMTU9QUEtUdHN1eHp6eHZ2d3d6enx+fX5+fn5/f35+fn+AgYB/f3+AgYB/gICAgH+AgmlQUlRXVVRWWVdYWFpbVFRTUlBRU1FRUU9OTlBQUU9MTlBPTk5NTEtNTk5QTU9QUFJRT05NT09PTk9QUFFPTk5PTk5QTk1NS0lISEpJSUlJR0ZHR0dJSkhJSEhJSEhHSEdISElISUxLSklISkpJSkpIR0pMS0pJSUhKSktMTk1NTU9RTFVzcnN3enl3dnR2eHp7fX19fn5+fn9+fn5+gICBgICAf4GBgH+AgICAgICBbE9PTlRZVVVdW1lXV1hOTUpKSUZKT0xKSkdJSk1NS0pMTUpHSUlJSktMRkRGSktKTklOTkxNT01MTE5PT09NTk9MTk5OUFBPTE1MTk1MTEpJSEdJSElISElJS0xLS0pJS0pJSklJSUlJR0dKSUdJSUpKTk1OTEhJSklJSk1PT01MT1JOWXBwcnd4d3d0c3R3enx+fX5+fn5+fn5+fn9/gICAgICAgYCAf39/gICAgIFvS0pNTlFOTlVXVlZSU0lFQ0VFUkREQT5CP0RAQD5CREFAQURHRkVIRUJBQEBDQ0VTQlVQSEtPS0lJSkhISklKSUlLSkxQTk1MTU1MTU1NTElIREZGR0ZGRklKSUlLSkhMSklKSkpJSEhKS0tIRkdJSklLTU5OSktPTUxLTU1PUE5QT1BgcG9yd3h2dHJzdXd6fX19fn5+fn9+fn1/gICAgICAf4CAgIB/f3+AgICAgXNQUE5OUE1KS1BSUE5RQ0RCQUZRRT1DPT9FSDk6Oz0/PTxBRkA+Ojs+PjxFRD0/RllDW1Y+RUVHR0dHQkREREZFR0dHR0pHSEpLR0NER0pHQ0RFQUFDR0hHSEdISktKSElMS0lISktLTU5MTUxMSkpMS0lLTU9PUFNRT1BQTk9QUlFNUGdwb3N2dXRycXR4eX19fX1+fn5+f4B+foCAgH9/gIB/f4CAgH+Af4B/gICCdlRVUVFQT0xNUFBOT09BQkFAQkE/Oz48Pj8/Ozg5ODs7OkA7Oz48Ozs8PEhMPT1DXUReYT5BRERGQ0ZGREZJSEM/QEBAQUFCQUE/Pjw9PkFAQD8+P0BFR0dHSUtMTk1OTUxNTUpLTVBVU05MTlFOTk1OTE1NTk9OTk1LS05OTk1OTkxUbnBwcnR1c3Fydnl5fX19fn1+fn5/gH5+gICAgICAgH9/gICAgH9/gH+BgIJ4UVFSVFJTUVNTUVFST0BAPT4/PD8+QEE/PT45Ozo7Ozk5Ojg4Ozw5Nzk7PD49OkNgPlxrQ0FCP0FAQ0ZEQ0NDPzs+PkBDQ0E/Pj9BPkBAQj9APD9CQEFDRUVFSktQT1BPTU1OTExMT1JRUFJOTExPTUtOT0xMTEtMS0tKS0tKTU1LS1xxcXF1c3VycXR4eHp9fn1+fn5+f39/fn5/gIGAgH+Af4CAgICAf4CAf4CAgXxSTU9RUFFSUlRSU1NOPDs8Ozs7P0BBQkA9PDk8PTw6Nzk6Ojk3OTo6Njk6OTk6RmdAXG0/OTg8PD1AQUA9Ozs+PD09QEJDQT9BQkE9Pj09Oz0/Q0RCQD9BREJFR0pKSkpKTE1MTExNTExOVVNLTE1USVBKSU1KSUpLS0pJSEdKS0lKZnJxc3RzdXJydnl5e31+fn5+fX9+f39/f36AgICAf4CAgICAgIF/gIF/gYCBgFZMTlBQTlJRUFBRUU44PT88PDo9PkFAQT8+PkA/Pj48PT0/QD09PT9EOz49PjtGaUtcbT46PD49Pz9AQUA+P0E/QEBBQEBAPT8/PTw6Oz09PD9AQUJCQUBCREZGRkdGR0dISUtMTExLTEtKS0lKSk1MTEpMS0lISUxMSklJSElLR01tcHF1dXR1c3V4eXl8fX5+fn5+fn5/gH9+gIB/f39/gH+AgYCAgYCBgICBgYCCYUtPT05OT1BPT1BQTzo8Pjw9Oz8+PkFBPz0/Q0NEQT89PkBBP0A7XXBCPkRGP01kWF1lPj09Ozw+PkFBPz5AQD9BPz89PD48PTs7PD0+QUA/QD5AQ0NEQkRFSEVFR0hISEdGSUpJSUlJSUhKSkpKTEtKSklJSEhKSktMS0lLSkpIVnBwcXNzdHR1eXp7e3x+f35+fn5+f39/f39/f3+Af4CAgICAf4GBgICAgIGBgIJtTFBRTk9QTk5PUFBPPjw8PT4/P0A+QEA/Pz9DRkQ+PDw9QD04Ojpud0o3PDlFWmNgYGRJOzw9RDo7Pz49PD07PEA9PTw8Pjs9PD0+QUBCQUBAP0JEQ0RFRkZGQ0VHSElJSEhJS0tMTUpKSUpNTUpLSktJSEhISEpJSktKSk5MSUlfcHBycnJ0dXZ6e319fH5+fn5+fn5/f35/f36AgIB/gICAgICAgYGAgICAgIGAgnZNTk5NTk5MTE5QT0w+QTw8PT8+QkM/PkFBQUJBQFtRPDw9TFBJSHZ3Tzc4OVRobWdobGBBO05ROTs+Pz89PDg6Pjw9Pj89Oz4/QEJDQkJDQ0FCQkFCQkRCQkRCRENGSUdGRkhJSUtNSklKSktMSkpJSkVESUlGRkhISUpKTEpGRmdwb3FxdHZ1d3t8fH18fn59fX1+fn9/foB+fn+AgH+AgICAgICBgYCAgICAgICBek5JS0tMTExFSUxOTTw/PDw9PkBAQUE7QkNCQ0BFdXlIPGGBhIB6e3dcRj1BZXJ0bG1ybU9GZk86PT5BQ0A8OTtBPz4+QT07P0JAQkNCQENDQUNBPT0+QD0/QUFBQENFRUBAQ0JDR0dFRENGRUZGR0VEQEFHR0ZDRkRHSEpHQz5IbG9wcHF0dXZ5fHx8fHx+fn1+fn5+fn5+f36Af3+AgICAgICAgIGAf4CAf4CBgIF+UUhLTU1NS0pLTE9RQD8+PkFBQEBBR0FCRENFQUlzeWtmhISDgoOAfWBYUUZicXJxb3VxYGBpSkBCQkZIQz08QERDQUE/Pj1AQT4+Pj88PkBER0VAPkBBP0BDRkVDQkNDQEJEREJERUFCPkFCQkFCQEA9QUJDRENDQUNFR0E/PVZwcHFwcnV1d3p8e3x7fX9+fX19fX1+fX5+fn9/foB/f4CAgICAgYCAgIB/gIGAgX5SSEtNTUxLS05OUlVEQkBDQ0FBQkBCQ0BAQUFAR3B0fYKCgYN+fYR0SlNmWGFxcnR2fHRrbWNJSklJTU1LRUNGR0hFR0VFRUREQ0E/QD4+QkZKSkdFRUdGRkpOTktKSUdHSEtMSUdHQ0REREVEQUJCQ0BDREVEREVERUZDQkFEZW9wcXF0dnV4e3x6fHx+f319fX19fn59f4B/f39/f39+gIGBf4CBgICAgH+AgICAfVJJSUpKSEpKTE9SU0dGRUdIREdIREA+PDs+QEVFaXN9gXx/hH55hnFCSGRtbHaBhoeHhHRrVklNTE5PT0xIR0hHSElJSEhHR0hIRUNFRUVFRkhKSkZFR0lKTU9PTU1LSktKTU5LSUhHSElIR0ZFRkZGREZIR0VFSEhGSEdIRlFubnBxcnZ2eXt7e3p9fX5/fX19fX1+fn1/f39/fn5/gH+BgYGAgICAgICAf4GBgIB8UEhHSElGR0lKTU5OSkxJSUpLTE5KRkNBQkNGSkdge4B/eICEhYOEim1AT3OBhYeHh4eIhmdKTE1MTU5MSkdHR0dER0dHR0ZIRkhFQ0RERkVEREhIQ0NDR0pKS0xMTExMTElKS0pKSUlJSEpISEdISUhHR0hGRkZISklJSUlIXW9vcXJzd3d6e3t6e319fn59fX19fX5+fYB/f39+fn+BgIGAgYCAgICAgIB/gYCAgHxNR0ZIRkVGR0dKS0pMTUxLTU5NT0tJSEhKS0tMTE5bfIKDhIOFh4WHglZshIeHh4aHiImIfFFLTEtIR0ZGREVDQ0BBQ0NDQ0ZGRUJAPj5AQUFAQkQ/Pj9ERkhERUdJSklJSEhJR0lJSkpJSEZKSkpKSUpJSkpKRklMTEpKS0tmb3BzcnR2eHl7e3t8fH1+fn19fX19fn59f39/f35/f4CAgICAgYCAgIGAgICAgICAfU9GRkdGR0hHRUZHR01NTUtMS0lHQ0NDRElLS0xMSlaChISEgoKGhoWDgoWFhYWGhoaHiIaKdUlJRkI/P0A/Pz88PDw+Ojo8QUFAPjw5OTg8PD07Pjs5Oz9BQkBBQ0NCQEFCRERCQ0ZISUhISExNTEdJSk1NTk1KSktLSkxNU2xvcXRzc3d5e3t7fH19fn9+fX19fX1+fn5/foB/fn9/gICBgIGBgICAgYCAgIB/f39+UUZFRkdJSUdEQ0VGTk1MSklIRT85Oj5ARUhISkpJZoWEhIR/gIODgoOEhIWFhoeIiIiIiYuOZkJCPTg4Ojo5ODc4ODk2NDc5Ozw6ODU2Nzc4OTc4NzY4ODs7Oz1AOzk5OT08Pjs7PUFERUhKTUxMR0lIT1JRUFBOTE1NT1Fdb3BydHN1eHp7e3x8fn5+f359fX59fX5+f39/gH9/f4CAgICAgYCAgICAgICAgIB/f39RR0ZHSEpIRkVGR0hMTEpJSUdDQjU2OjxDQENHSUlqhoSEgX6Bg4ODgoOEhomKi4uLiomKi4yJVDs4NjU2NzY2NjQ1NzYzNDY4Ojg3NjU2NTY3Njc3ODo3Nzc4OTs3NTc4OTc5ODc2OjxAR0ZJRklGRUZPU1JTU1JPUFBSVGVwcXN0dHd5e3x7fH1+fn5/fn19fX19f39/f3+Afn+AgICAgICBgICAgICAgICAgH9/flJISEhJS0lHSUpJSkpLREVIRUJANTc4OD06PUVDQmaFg4GAgYODg4ODhYmKiomJioqKiouJiYqBSDY3NjQ2ODg3NDU3ODQ2NzY5OTc2Njc2NTo5Ojo6Ozg5ODk4Nzc3OTo5ODg2ODU4OTtBPT4+QkE/QUtMT1FQUU9PT1JXa3FydHR1d3l7ent8fX5/fn9+fX19fX5/f4B+fn9/f4CAgH9/gICAgICAgH+AgICAf39+VEhHSUlMTUtKS0tMSUg/QEFAPDo1Nzk4OTc7Qjo9coSAgYOEhISEhIaJioqIh4iIiYqKjIqJiYx6Pjo4ODs8PT45Ojs8ODk7OTo7Ojk5Ozo5PT09Pzs7Oz06Pjs5Ozs8Ozw8OTo8ODo6Ozo5OTk8Pzw9QUJESUpNS0lLTFdvcnN1dHV4e3t7fHt9f39+f359fX19fn9/f35/f39/f3+Bf4CAgICAgICAf4CAgH+Af35URkVGSUxOTkxKSk1CPzo7PDs4OTk4OTo6Ojs/Pkh+hIKChIWFhYaIiYiHhoaGiImIiYuMi4mKioxsPDs+QkNFRUFBQUI+QEJAQD49Pj5APz8/QD9APT0/Qj9BQT9BPz1AQEA+P0E9Pjw7Ojs5OTs/PTs7PT1BQUNBQkNBWHBxdHR0dnl7e3x9e31/fn9/fn19fX5+f35+fn9+f4B/f4CAgIB/gIGAf39/gICAf39/flJFQ0FHSk5PTElHSzo4Ojs5Ojo8PTo7Oz09P0BCUoOCgoSFhIWEhomJiIiGhoaHiImKi4uLioqLiotePkRHSUtKSUZHR0RGSEdFQkFAQ0VDQ0FCQ0I/QERIRUNFREVFQUZFRkRFRkRAQj88QD49P0A+Pz8/Pj8+Pjo7PTxgcXJ0dHV3enp6fX19fn5+f39+fX19fX5/fn5+fn5/gH9/gICAgICAgICAf4CAgIB/f4B+UERAPUNIT01HRkJEOTc6Pjo8Oz4/Pz89QUBDQ0ZYhYKDhIWGhoaIiYmIh4aGhoeJiYqLjI2MjIuKiohXSExNTUtOSklLSElKSklFQ0RGR0ZEQ0VGREJISUtIR0dGR0dFS0lLSUpLSkNGQ0NEQkFBQ0JEQ0NERENBPTs9QGhwc3R0d3d6eHt8fH19fn5/f359fX1+fn9+fn59fn+Af3+AgH9/gICAgICAgICAgH+AgH9PQT49P0RMS0BCQkE5ODw+Ozw7PkA/QT9CQkdHSlmFgoOFhYeHiImJiIiHhoaGiIiIiYqMjYyMi4uKjH9QTVBNS05LSkxKSUlISkZER0hISUVFSEZGRUxMTUlKR0dISUpPTU5MTE5LR0dHR0VFQ0ZGRkZERUhIRkNBP0BMbHB0dXZ4eXl5fHx8fX1+fn9+fn19fX1/f35+fn5+f39/f39/f3+AgICAgIB/gICAgICAf1FBPz4/RUdHPTxAQDg4PDs8PTo/QT5AQENGSUpRYIKDhYSFhoaHiIiIiIiIh4eIiIiJioyNjIyMjIuKjXFNUU9NTExLTEpISEVKSURKSEdLSkhKR0dHS0xOTExISElKTVBOUE5NT0tJR0lKSElESUhIRkZHR0lHQ0JBQ1VucHV3d3l7eHl6enx8fX5+f39+fn1+fX5+fn5/f36Af4B/f3+Af4CAgICAgICAgICAf39/VERBQUJHSEI/OD9AODo8OD0+Oz1BPj9ARUhKTFdyg4SEhISFhoeIiIiIiIeGiIiIiImJjIyLjIyMi4uLi19SUlBNTk1LSkdGQkdKR0xKRktPTEtKSk1NTE9QTkhJS0xPUVFRUU9PSklKSkxKTEZHSEdFR0lGRUVCQEJCXG9yd3h5enl5eXp6e3t+fn5/fn59fX19fn9+fn9+f4CAgIB/f39/gICAgICAgICAgH9/f39VRUNFRUdHRUQ7P0E7PTw5QD4+QEJHR0FIS0xQV3mFg4ODhISGiIiIiIiIh4eIiIiIiIqLi4uMjIyMi4uNfFdWUlJUUk9MS0pERUZLT05PV1ZRUE9RU1JNU1RPTVNMUFNVV1JTUVBMSk1NTUtOR0dKRkZISkRERUVCRENjcHV5eXp6ent6e3p7fH59fX9+fX19fXx9fn5/gH9/gICAf39/f3+BgYCAf39/gIB/f39/f1VGRkdHR0dIRj5AQj0/PT1CP0NCRlZORk9QUFRZfIaDhYWEhIeIiIiIiIiIiIiIiIiJiouKioyMjIyPi4uLZ1ZVa2FFUlFRUEk7O1FTUmB1XVVWVFZZWVJZWFJaZlBVV1pdUlRXUVBOUlBQUFFLS0tISEpIRUZJSElISWlydnl5enl6e3t8ent8fXx9gH59fX19fX1+f39/f3+AgIB/f39/f4CAgIB/f3+AgH9/f35+U0hKSUlHR0ZFPz9BQUVCQ0dFREVMWFJNVFZWWFt8hoWHhoWGh4iIiIiIiIiIiIiIiIiIlJyMioqMfWGKi4uHbFtkVTpYWFhTUT9AVlVZXGRgVllicl5dVl1aVkVRWVpbWV9UWmdSVVZYVFRWVE9PTUpMSklJTE1LT01Tb3N2eHl4d3p6ent6e3x9fH5/fn1+fX19fn1/f39+f4CAgH9/f3+AgICAgH9/gH+Af39+fn5WSkpJSEdGRERCQT9ITUlNUEtJS1BUU1NYWlpcXHmFhIWFhYWGh4eHiIiIiIiIiIiIiImcnaCPiY5nO36MiYqLem5wWFpbWlJUUlZWVFpadYNZVX2QYVxYXV5XSVZdXVtbX1lJWVhZW11YWFlXUlFOUFFNTU9TUVFVUmFzc3Z3d3Z4eHh6e3t8fX19f39+fX59fX1+fn9/gH9/gIB/f3+Af3+AgICAf39/gIB/gHh5fVlOS0lJSUZCREBBOlBRUVdYUFBPUVNUVFhYWVpbboGCg4WEhYaHh4eHh4iIiIiIiIiIiJaanJeIioFuhomIh4OKfmZZWVxZU1VUV1JRV1ZjloBRZXJYWldfaFBgZltbWFxnYUdPWmhnXFtcXV1XUk9TUFBRVlZWVllabnJ0d3Z2dHd4eHt7fH19fX5/fn59fn18fn9/f3+Af39/gH+AgH9/gICBgYB/gH1yfX9/b3R8XVNQT01LSkVDP0A7UFBaWltSU1FPUlJSVVNWVFdfdXiAhYSEhYaGhoaHh4eHiIiIh4eIh4ORjomJiIaFiIiGfYB7XFBVWFRSVFJRUUxPTUtmeVpdVFlVVl1aTFRaVFNUXlpYV1dXemtYWltcXlRRUVBJTk9XVlhaWmRxc3Z2dHR2eHl5e3t8fH19fn99fX1+fX1+f39/gIB/f3+Afn56eHd2c3V7f3+AgHRrfn5rcnleW1ZVVFJPS0ZDREFNXoNsVlJTTk9RT1FVUlNSUlRjZHaAgoKDhISEhIWFhISDhoaGhoeIhn6JiYiHhoOHh4d5bXFWSUtNTktNS0hKREZIRUM+U2NVf1JRUU5LUlRRTU9ZUU1OUVNVVU1RU1JQT01MSENJSFJUVVpcbXJ1dnVzc3d7ent7e317fX19fn19fX59fn9/f4B/f399fX5+f39/f4B+e3Zzd31+fmR1fWlxdF9kXV5bWVZQTElMSWFsknRQUVNOUVJRUltSU1JRUlZVYnN7fH+AgYKBgX99e3uAf4OChYaHgoaGhoGEgYaFhnVfXUtDP0NDQ0NCP0RQQkRAQz5CSEdWQEhOTUddaVFIRk9GREVGSEdIQkNIR0hLR0NCQURAT1BNU2RzdHV1c3R1enx6e3t7fHx9fHt+fX19fn5/f3+AgIB/f3x8fX+Af39/f4CBgH12dHt/bWh8Z25xZmllZGJbWFNRUFVSc1dlW09PTkxRU1FVWVNVUVFUU09WYGtscnZ7e3h5dHJuc3RzeXh+foOAg4OCgIKAgoGBa0xHPz87Oz5AQD8/PmtRS2FFRkhJRUI/R0xNR01RVUlCRT8+PD08PT0/PT9BQ0M/Pjw9Qj5KTUZVbnV1dXN0dnh6fHp9fHx9fX19fH59fXx+fn9/f4B/f39/enl3eHd2dnh7foB+fXt4dnx1YXhnbHBqbGppZmBbUVJaXFleSUpQUU5LTFFSUVRVVVdRUVdWUFhbYl1hZ21tbG9raGBucmptbHF1e3p9e3h6fHx4d3hkQkBAQj06QkNBQURCXF1Pe05PT05LTE1PT1FMS0xXTUhHQEI8OTc3NTk5PTs7Ozg5ODk/O0JIP1x0dHV2dXZ4enx8fH18fH19fn58fX19fX9/f39/fn9/f314dXZ6e3p3eXh1d3t8eXh1eXdjcWhpcG1ubW1oZl5PUF5cWklHUFJRT01QUU5RUlRWWFNSWVROWVpbV1ldXl5gZWBdXnF2a15gZ2t3b29sam9ubmxmYlhHRkZIQkFHSUVFRkRNUlBhV1JYUVBTU1JVW09PUVdQTUpDRj46OjY0ODc5Nzk6MzY2Nzk1PEI9ZXNzdnd3eXp7fX18fHt8fX5+fnt9fn19f39/fn5+fn9/e3d1eX18enh8fHx8dHd2d3Z1d2tuaWhxbm9vb2prYFVXXlpXTUxUVFNRUVVPTFJTVFdYVFRYUUxYWVpWWFhWWFldV1dYaHNrXVZhc2thYV9dZGFfXllVUE1PTkxISEpLSUhGQ1FQU1pXVFROUVNZU1xlVU9TVFFOS0lIQz9BOTk4ODk3ODg0NzU3ODU5OUducXR3eHp7e31+fX18e318fn5+en1+fH1/f359fn59f358dHR1e3hycW9vbnR4cXJzeHZ1cWZkZ3JucHBxbm1kXV9fWVdPUFhWVlNUVk9PVVZYWFlTVVRMS1RVVVVVV1BUVVdUVVJdbl5STllfW1ZZO0RWWFRbZkpMUFJST01NTk5OTEpGUFBVWVNUTkpPT1RTVFxWUlVTUk9NS0lISEY/Pz06Nzg3NjU5OTY3NjY1V3Bwc3d5ent8fX59fnx8fXx+fX15fX18fn5+fXx8fX1+fXxydnF4eHJ2dXFxbnBwb3B1dnRuamRkanBwcXJwbmZlZGNcXlJUWlZXVVRXVFJYWFlZWVJVT0lHT1BPT01SSk9QUFBOTk9UTE1JUE9TVFUyPFhNSUFRPWNhUVNRUE5QUVBOTk1QTlRSUFJNSUxLT1FQUVJTVFFST0xNS0xMSENCQT06Ojg3NjtCNDU2NjtlcHF0d3h7fHx9fnx9fH19fX18e3h8ent9fX58e3l9fH18e3B1b3d1cHV0b3N2cHFxcHR1dmNqZ2VXaHRycnFuaWlocFZWVFVYVVdVUldWVVpZWFdVUVNGRkFGR0dIRkpESEpIR0VITEhLSEZMTVBNRy9FX1I+M0A+am9hUlJRQEZVUVBRUFFOUU9QT0xKTExPUE5OUFFRTlBPSkxNTUtHRUVEQjs9PDw5PUc2Njc2RG5xdHZ5e3t8fX18enx8fX5+fXt5dnh3eXl8fXp6dn17fHp6b3Fud3JwdnFtcHNwb3Bzc3N0ZmdgaFpXa3JzcmxtbWtuYmVQU1RSU1VPV1ZWWVlWUVFRT0A+Oz0/QEJBQ0BCRURBQEdIR0hFRkhKTktFR0NPUkM4RU5TXWZTUVNBR1VQT1FRUE1NTkxKTEtMTk9PUU1PT01ITExJS0tMS0dGRkVEPEFBPjtARTs8ODlUcXN1eXt7e318fHt5fHp6fn58e3V0dXJ2dnp6eHpyfHt8eXltcW94cnF1bm5xcm9vb3Rzc3J1dGtnZ15lam1wa29xbWltY0xPT01RU0xUVVRXV1VMTEtIPTk4Nzs/QD48PUFAQj0+RUhHREZGSUdKSkBGQUFARkhFSk9IUFJhXFFQUk5TT09QTExPTUtNTE1PTltXS01RT0dJSENJSkxMS0ZGRkQ/QkM+PEJGP0I/QWRxdXh7ent7fHt6end8d3l9fnt7cXN0cHJzd3R4eHN6e3l2d2xxb3ZxdHRsb3Fybm5vc3ZydHNycmtsZW5zaG1ubWxtbGprSUxISE9RSlFTUVRTT0tIQ0U9OTg3OT9CPjs/QkBAPkFESUVDSEdJR0lFQkI/Pj1DQkFHSURNT2JlUU1PTldLTE1LTE1NTExLTk5TZE1KTFJJSUlFQUhKTE1OSkdJRkJBQkA/RUZFSERLb3B3enl5e3t6fHp3c3h0eHx8eXpucXJtbm9ycnZyc3h8eHZ2bXBtc3B1dGxwcHJvb29ydnVyVlZucWdseYRqbXFybm5qaG9ISkNHTE1JTVBNUE9IS0U/Qj05OTk6P0I/PEBCQkFERUdLRkRJSUdHSENDP0I/P0BBPkNFQ0tOUVRMSklNVEZJSUpMSktLSUlMTU9QUlBLR0NLR0NCSkpMTU9NSUpJR0NDQ0RJSk1MSVpzbXh5eHp7e3l8dnJwdXJ0eXl2eGpxbmpsbG50dG10dXtzdHhyb25xb3ZzbnBvcnBvcHN0eWpOYGdzanR8eWdvc3FqcWhlcUhLREdISEdKS0lKS0RHQj0+PTo6OjtAQj89QkJDQ0dGSkxKRUlJRkdIQ0M7QUBCPkBAQ0VESU1QR0lLR0hLREhJS01ISkxISEpMS01dUklIRE1GQURLS05NUE5LTUpLRkdHSk1OUU5MY25pdnZ3e3h7en1xbWxza3B0dHR1aHBtamlra3RwbnR0eXByeXRvcnFvd3NvcXB0cnBydXR5a05WbXVscXt2aW5vaWp0aGRvRktERkVHREVFR0VHQkNAPjw9Ojs6OkBEQD5CQ0RFSUZKSkxGSUlHRkZEQjtCQ0M+QENDQ0VHTE5IS05IREhFSUxOTUhJTEdFRklJTE5LSkhFTkhDR01MT01PTU5OTUxJSEpPUlFSTlJmZ2Zyb3N4dXt6fGxoam5la3Btc3FmbWxoaWtsdG1wdXR3cW94dG90c3J2c3BxcnRzcnR1dXZ2WFZ1dWtvdHJrb3ZsaG1lX3BHSkRGRkVCQkJFQERCPj8+Ojs7PTo9PkNBP0FDRUdKRklJTEhHR0dGRUNAPUVFQj5CRENDRUdISUdNUEpGRkdLTk9LRkhKRkVERUlJSEtJRkhQS0RJTUxQTU9OT09OSkpJTVJVVFJPV2RgYW1ncHJvcnl6Z2VoaGNpbGdxbGZsbWdpa2xzbHB2dXRwbnZyb3Nyc3V0cXNzdXRzdXZ2dnl2dXR2bGt1dW1ydnFsbmxlck1HRUVHQ0JBQkQ8QkE+QT06Oj0/Oz4+QEI/QEJER0tGSUdJSEZGR0VDQkFBRkZDQkNCREVER0dIRkxRTElPSkpMS0lHSEVGRURDSUhIS0pHS1JNQk5PTVFPT09OT09LS0tQVVdWVVRYYF5caWFtaW5ocnNiZWZmZGloZm5pZm1taGtrbXJpcXZ1c3Ftdm5vcXJzd3Nyc3R1dnZ2dnd2d3Z2dHd1a3N1bnV0c3FyamtzTUdHRkhCQkBERTxBQUBDPDg5PT45Pzw/Qj9AQERGSEVIRkZHRkVFRENFQ0RJRkNGRUJFR0VFRkdFSk1LSFFNSktISElFRkhJRUNJSUpLTUtPU05EUVJQUVJOT01OUE1MTlNXVldYVlhdWl1kYGhiamlna19lZWdjZ2dna2dna21rbWxwcWd0dHVyc252b3FwcnR4cXNzdXZ1gpF5dnZ0eHV1d3hub3VvcnN1cXFpb3pNSEdISEJCQkZFPEBCQkQ8Nzo9Pjo+OkBCPj8/Q0VGREZEREdFQ0VDREVGR0pFRUlHQ0dIRkhGRUNGSkpHTUpMS0lKTEZJSUtIRUtLTE1OT1JUT0lTVVRRU1BRTU5RTk1RV1pWWllWWl1aWGFgYGBeaGVjYGRlaGdqaWhqZmhubGxubXFwaXV1eHJycHVwcHBydXZwdXN1dnV7fn14dnR3dnZ2eHBsdXBtc3RucHJzeU5JSEdJREFDSEU8QEVCRT04Oj4+PTw8QUI8Pz5BQkZDRUJDSERDRUVGR0dHSUZHS0hDSEhHSUdGREhLSUdLSE1LSktMSExLTUtJTUxPTk9SVVZPS1VWVFFUUVJMT1FQT1RZWllcWllbXl9eYGJeXGFja2JgZGdocoVoZ2lmam1ucG9uc3FqdHV4cnNzdHJucHF2cnF1cnV1c355jn11dXZ2dnZ4cmh1cWtydGxxdnF1TUlLSEpFQkVHRTxAR0REQDo8PkA/Pj9DQjxAPkFBRkNFRERIREZER0VISEZIR0lLSkZKSEhLSEZGTEhISEpHTExMTExJTUtNTU1PTFBQUVVWV09LVlZVU1NSUUxPU1JRVltbXV5bXF5fX2FgYWRdZGBlZmBlaGpjc3NmamhnbHBycW9zc25zd3dxdXZ0c21vcnVvcnNwdXJ2cnSBdnV1dXd2dXd0Z3Rya3Fya3J2b3ZKS0xKTEdCRURFPEBGRERCOz8/QUBAQERBP0I/QUNIQkZFRkdFSUVGRElJR0lISk1ISEpKSUxKRkpLSElKSkdLS01NSkpOTE5OTk9LT1BSVVhWTU5UVlVTUlFQTE5UU1JXW15eX11dYF9hYWFgYmNlYWNoYmRpamd2i2xraWdtb3NxcHFwcHJ5dnJ1dXRzbW1zc21xcm90dXRycHN3dHV1d3Z1dXRlcXNrcHFqcnZvd0pNTExNR0REQUQ8P0VFRUM9QUFDQkJDRUJCREFBRUdDSEhIR0ZKRkNHSUdHSkZJTEhKSk1LTUxHS0lITEtOUUtSUUxTTUtOTk9QUE9UT1dYWFtOU1FXXFpTVlBOVFVUVFhaX2JiX2RhXmBiXmBlYWFiZ25oYmloaG14dmxoam1vc3JwcXJycnZ0c3Vzc3Nua3NxbXByb3R2cnFxdXZ1c3d5d3V0dWNtdGtvcGpxdG93TE1MTExHRUFARD4+REVGQ0BDQUVEREZDQ0VHQ0NJRkNISkpJSUtGREtKR0hKSUlLR0pKTktOTElMSEpNS1pmSmRcS2xTSE9OX25Va3NbcXBid2NSUGJ2dWh1Y2F2YFhucWJkdmluemZbbHRgbGpUYHd1aWpnaWZnbG1qbW9qbW5zcnBycnFyc3Jzc3J0cm5sdG9ucHFxdXVxcXN0dnZ1dXl3dXR0YGt0a3Bwa3FycXlLTkpLSkZDP0BCPz1ERUZEQ0RCRUVFRkJGRkhDREpFRUpMTUtMTUdHTUlISUtIS0pJS0pOTE1NTExJTE1MW3NiZHBebG1VTU5mc11nZXFsbnRncGlfYVlubmJwcGJrampnb3F0ZXRub1xvdWdwTUpyeXZrYmBrZWVteW1rdmxucHNycHJxcHFycXJycnRybW1zbm5vcHJ1dHFzc3R1dXV0d3h2dXRibXVrcHBscnJxektMSUlHRUQ/QkI/PUNGR0JGQ0VERUVEQ0hIR0RFS0dHTE1NS01NR0pOSEpLSklMS0pKS01NTk5NTUpNTU1bcm9vbnBwbGtNUFFsV05pYnRycGFtb3ZcWWxRXG1tWnFta29teHh0c2lwXF9ya3FqVXV5eHBjXmtmYmdxcGppb3Bwc3NwcXBxcXJycXFycnRsbXJtbm5vcnV0cXRydHV1dHV1enZ1dGVudWtwb2xzcnJ5SktHSEVFRUJCQj0/QEZHQkdESUVFREJGSUhIRUdLSkdNTU5MTU5ITE1JTEtISk1JS0pKS09QT05NS05NTFxoZHVdbHFXbE5QUW1VWmtea2x2YWxkdFRlY05tWWxcdHBraWx4and1aHBdXnJraFdiY3d8b2NgZ2hhZGp1eWtubnFzc3BxcHFwcnFwcHBydWttcW1tbW9xc3Rxc3J0dnZzd3Z6dnV0aG91bHNvbXNydHdJTUdJREVFQ0FCPEJBQkZER0ZMSEVDQ0hLSEhGSkxMRk5LTFNSTEhMTEhOSklITkhKSklITk9NTkxKTk1KWnNwcG9xcW1sT1FSbllxa2dvb3Fxb210Xm5YYXRfbm9wb3Fyb251c3R0altddGN3eHJqbnpoYWFjZ2Jiam10dXBzdXZzcXBwcW9ydHt/fn13bGtxbmxtbnByc3F0dHN1dXR4eHl5dHVrb3VtdG9uc3N2dEhLSElCRUVFQUA+Q0NCR0NISU1JRkNGSkxJR0ZKTUxGT0pLV1JLR0tKSk5JSEpMSUtKSUhKTU1NTUlLS0tTa2JaaV5famNyclpfWWpvX2VlVWtfY1thYlFgbGhdalxuaWlkW3BmZHBdWlxrW21xY3BzbGRnY2RnYGBrbXBwb3R5cnVxb3BxbnmFiIeHhoWAdnNua21tb25xcnR0cnR1dXZ5eHhzdW5xdW53cXJ1dHdySEhGSURFREZBQEFFRERHQkhKTEhGREdLTElFRkpPTElPSUxbUUpGSEhLTUlISkpLS0lISUdLS0xLRkhLS0xMTEtJS0xOVFtcVFBUTFBPTk9PVlFPT1FPT1FKSU5QUWRxaVRZV1tbXFVZWl1YXVxcY2ZhYWZiY2VfX2ZrbWhtdHlydHJvcHB0hoeGhoaFhYaHg3pwbW1sa3FzdHRydHZ0dXl4eHV2cXJ1b3ZydHN1dXNIQ0VHRkZBRUM/Q0dDRUdDSUtMSEZER0tMSERHSFBLTE9LTFdMSUVFSElKSElLSUxKSEZIR0pHSElFRkxJSUtOTElPXFdeT1xbYF5PWFlTXFxiXk1ZWk1YYVJKWWFaU2BkXGFYW2RkVlZYXFlaWFxWWVxdYl9kYGFfZWhrZ210dHFxdHBxcoGGhoaFhoWFhYaGhoR9cmtpb3Jzc3N0d3l5eHl4d3h0cXhyeHNxcnVydE9CQ0RMTUJDREJESURHR0ZLSktIRUVKSkpHRUhIUEpNTUpNU0lIRkFHRkpJS0tJTEpJRkVKR0RGR0VFSkhDSk1KS1RfWWBYYGFbYFVYWVReXlpfUllcUF5cWU5eXF5TW15jXlpdYGNgWV9iW2BeW1RYWFleXWNjYmFjZWlla3Jwb3Bwbm93hoaFhYaCe4CFhYaGhYaFf3VxcHJyc3Z5eXp5eXh4eHdyeXZ4cnF4dnR2YVNKSk1JRUNCQ0ZHRUdHSUpKSUlERktLS0ZGSUpOSk5MSExOR0hGPkdHTElLS0pLS0lHRUlEQ0NFQUZKREBKTEpPW2NZXl5hX1JUU1dfYFxdWV5RWVxNVl9XS1FZW1BaX2FhXl5jYWBiYmJjY2VaUVlWVVxZXmRgX19jZWJob21tbGxsbHWFf4SDeXV8hIWFhYaGhYWGhoN9d3JydHd5eXl5f359eXV5dnZybnp3dnhYUUtHQ0dFQkVHSEZHSElGR0pHSEZIS0lMRERLS05NTExISkpISkc/R0ZOSktLTUtLS0lHR0NEQERBSElBP0lKSE9dYVpbZF1fVFFTWF1cXFxfWktXXExSXFlJTV5QT1xfYWNkY2NiXGRjYmRjZlhRVVRTW1haYV5eXmFhX2Rsa21qamxudn51gXp8hIWFhYWFhYaGhYaFhoaGgnpyc3V1e4WHh4eGhYSBfnhwend2eFxSTUNASUZDRktJRkZHSEdHSUZGRklMSk5FREtKTE5KTElLSkhJR0JISFFNS0tPTUtLSUhHRUQ/RUNISEFBR0ZFVF1ZXlhfWV9bXVVYWFBdXVFLSldeWF5bXVZaYFJRX19iYmFgYmJgY2JiZGRiWE9RUVJbU1teXV1dXl9fZGhnbGpubnB7e3x+e4CCg4SFhYWFhYWEhIWDhISHh4FzcneFh4eHh4eHh4eHh4WDgHx4XFNLQkFHRkRHTVJIQ1JLRkhISEVGS0pNUEVHSUpLTkxMSUxLSUlIREhLUU9NTVBMTUtLSElDREFFREhHQkFHRUNXVUVcVF1TVl9YTlRVTlpbTUpLVWBhW19YX15hXU9ZYl1gYF9iY2JdYmJXX19UUE5QUVhSXVxbXFxeYGJmZmVsZm9vd3x7gHt9f4CEhISEhIWFhYODhYKDgoWFhnpvgYaGhoeHiIeGhoaFhYSFg35JTkZERUZHRElSYlBEV19JR0dIREZNSlBQRkpJSktOTEtLTEtKSkdFSk1RUU5OT01OTE5IS0FEQUNERkRDQUVGQk1IQ0xMUE9PTEZNRkdJSkhHTExNT1BJTE9QUFNQTFBUU1VaWVdZWFhkVk9TVFBQT05QVVRcWVlaXVxgYWRlY2dja2xwc3N6eX97en+EhISEhISEhIKEgH57gYOBfXuFhIaGh4eHhYWFhISEgoGAfUtJRUVHRkdES01dTEdIWU1HSEpIR05MUVFJS0tLS05OVU5PS0tMR0dLUFNTTlBPTk9OT0hLRWBFRF9MRGZjRU1bSV9cc21PTVZtWUxDUGBVbFdnSl1XVV5ETFFVTE1UVlFTVFhXVFhVVFxUUGZaaGhkWFNrVFdWVVtcW2BgYWJiYmBmaGZubGhyenx9foGEhISDg4ODgX18enJ7gXp7f4KAg4SEhYWBhIWBg4N/fnp7TElFRkZIRUVLT1NJS0dgVEhKT0pJT01SUUtMS0xPUlVST09KTE5HSE1RW1lPUFBOT1BPSUpQf1FJfFlZcnNXUG1IcW5wYVZQcXFzUENrc21xc3BTb19bblhdVlxYVWtoVV1WY1pgWVtgVlVXf2p0dXVfYHdgWGFcXGZbX2FhYWFeYGJnbXBsYHB3dHiBgYKDg4J/fX6Adnh6bHZ+dHh+gHx+gIGChHyAg3p/gX9+d3dOSUVITU1CRExMRkpMRlJWTEtOSUtSWFdRTk5OTFFUTk9RUEtMT0dNUFNbWlRRUk9QUFBKSFp4XVR4ZWhZUlRRdmd0bHBibmZqUXJPTXdtanJwc3JxcnBvcIFdZnp1eHFxenF+c31rdX1iUmd8ZXNzb3NzfH1vfXlvf3JfYGBiYlpgYGdrbmtibGZnbXd+gYCDfnt4d4B0dnppcn5udHx+d3h7foCDeHyAdXx/fHxzc05LRmBdR0FFTU1IS0tISlBOTU1KTlZeWVVMUVNOWFpMU1NSTkxQSVFSVFlXV1BUUFBQUUtHZnhsY3hybVpLTFV5cHVtdWJudlBkZUlmdnFtd2+AamZ4eGlYc1Jpe21panp6fWx4en9vZ29YdnZqdXVwgGBzaHxpbHh8b15fX2NiWl1iZGdpamVnYmNkbGxwcHN0c3NzeXFyeGJsdWdyeXtzc3V5foFzdXpufH15eHJuTktTdE5DQkVQUEhKS0pMUE9PUE1QWmBaWEtUV1BhXlJWUVlTTVBJU1RVWFdXUFVQT05SSktyb3V1cXVxZGliV25McXBeRmh5V3ZUTGh4fXhgeXtzbmFebW9kUmdydW5teXB3bHZ0dHFsbVx0fnprbXl8bHVtfGtwdnV4Xl9fYl5dX2VkaWdoZmVeYWJpaWlqa25va3FubWpwYWNmZG93eG9tcHN5fm5xcGp7enRyb21MTFtWSEdFR1JQSkxNS0xRUVFRUFFXXFlVTlZZVWZYUlJZXlRNTklUVFZXWVdPU05OTlFIUm1IaXdLYGR2dlZYbE9ubHtzYWpnf3ZVS1draH1sbWx4YFtwenteYHpzY3JveHFoZXxpcntdVEtsYHZ1a2l1e3ttfnhrfHBdXl5iW15iZGRnZWVlYlpjY2lra3JzcndnbWloZGdgYWxhZ3Nya2htbXJ8a21oa3t0bW1rbU9ISktISUlIUlFMTk9NTFRTU09UUldSVlRQV1pWVlRUVGFgUU9OS1RTU1FVVk5OTE1PUEpIUU5QVUxLS1NUU1JUUFZVUVFOUVFYWFFOUFVUWFhYW1tVUlNXW1dYV1pPU1VXV1hSXVlXXVZUT1lSV1dXWFlfW2dyXltbWVxdX2NaX2NjZGZkY2NiWmNjZmZmbW5tdWZmZ2NgZl9dZ2BkbGhmZ2tocHpoZ2drdWpoZ2lsUUlLTExNS0pTUU1RUE9MVlZUUFRVWFVZVVJaXVZVVFdVWVhQT0xNVlRRTlVTTk9NTFFQS0pRUktRTUtLT1JUUlFRU1NJSExOT1FSUVFRVFZSWFdcV1NTUVJVVVZTWlFPU1JXVVRZVlRZVVRSVVRUVFdYV11aXmFdXFpaXFxgY1xdYmNkZ2VlZGFZYGFjYWJoaGluY2FkXl9jXVpkXGJtYV5mZmdtc2RpaGtrZWRjZmhQSktMT09MTVRQTlNRUU1YWFVUVVdXV1pWVFxgVldWWVVYVFFQS09XU1BOVVBOUU5LU1BNT1VUTlFOTU5RU1BUUVNUVU5LTU9RVFRSUlFWV1VZWltZU1VSVFdXV1lbVE9UVVhVVFlVV1lVUlJYVlVXW1laX11VWF9dXl1cXWFhXltiYmNoZmVkYlhfYGJdYGhlZmRhXl9dXV5aWl9aX2dgXl1dYmhrYWdmaGZkYGJjYVBLTUxQUUxPVE9PU1FPUVtaWFdYWlpYWVZdamRWWFlaV1ZUVE9LT1ZUUE9UUFBQTk1RUVBSWFRSUU9NT1NVT1dSVFVVT05NUVNVVVRUUlRYVlpdXFpWVlFSV1hWW1tXUVRWVlVWWFRXV1RTUlhWVVpdWV1fXlZeXV5gXFxgYF9fWmJiZGhoZWRhWWJgYl5eZmRjYGJdXFxcXFlaW1hbYVteXVxfYl9fYmRkYmRfX2BcUE1OTlJRTVJST1NUUVBVXFpaV1tbXFlaW2RxbWhkX1tZVlZYUk1NVlNNTlJPUVJPTFBTUlVaVVRQUExQV1ZSV1NTU1hNT1BSVFhVVVVTVVlYW15dXFtWUk9VVlZbW1dRVFdVV1hWVFhaVFNRWldWXF5aX19gVWFcYGFdYGJfXGBdY2FjZ2hkZmBZY2BhX19lZV9gY1taXFtcWlpZWVdcWVxbYF5gW15eYWBfYlxZYFpRTk9OVlFQVFJPVVRTUFdcXFxYXlxfV1xeanF3eYBjXFtWVlhSTk9XU05RUVBSVFJLUVRUWVpXVU9STlNYVlRTVFJSWk9RU1NWW1ZWV1RWWlhdXlxcXlZTTlRVVlxcVlJUVlZYWVNUWVxUUlJcV1pdXl1hYWBXYltjYl5hY19cYmFiX2RmaWRmXltkYGFgYWNlX2JfWVpeW1xbWVhZV1daWlphXF1bXVxcWl1gV1tbWlBPT09ZUFVVU1JXUlRQW11eXVtgXGBVXF1panJ9c2xnXFVZV1FPUltTUlFUUlRVVEtRV1ZbWVpTT1NSVlZVU09WUlNaUlRVVFhcV1hYU1hcWF5dWVpdVFVOVldXXltYUVRVWFlZVVdZW1RTVl1ZXV1gXWJjXllgW2ViX2RkXl5jY2FdZWZpZGZdXmRhYGFiY2RfYl5YWl9bXFtYWFhYV1taXGBdW1tcW1haW15WXlldUE9PUlpQWlVVVlZUVFReXmBeXmJcYVVdXmJreXRsfWxaVVpVUVFTXFRVVFVUVllXTFJaVl1bXFJPVVNYV1ZTUFhSU1dTV1ZVW11YW1lVWl5YX15ZXFlSV1JZWFlfWlpTVFZaWVpWWFlcVlVaXVxeYWFfZGRdXl1dZWFiZmReXmRjYFxnZGhlZGJfZGFfYWBiYl9gXldYXlpcXFpZWldWXVpdXlpZW1xbV1lcXVZYV11TT1BXWVFdVVZZV1dVWF9gYWFgY11gVV1eYmVldYF6aFhZWlRWU1ZcWFdXVlZXXVhQVVxZXl1dVFJYUldWVFJUWFJTVlRZWFldXlhdW1VeX1hfX1hdVlFZVFlaWmFZXFVWWFtaWlhZWVpYVl1eX15jYmFlZV1iXGBmYmRmZF9fZGJiW2ZjaGVjZmFmX19hYWFhYF9eVlVdWVtcW1lcWVldW1tbWFhZW1laWl1fXVRZXVVOU1pWU1xUVldZV1ZcYGFiY2FkX19WW2BkYV96dW9oWVxaVlhVV1taWVxZWFlgV1BVXltgYVxUVVhQVVZVU1ZWUlNVV1taXF9eWl9cVl9fWl1eWV5WU1lXWVpdYlpeVldbXFtcW1tZW1lZXl9gYGRiY2VlYmRaYmZjZ2ZlXmFiYGNeY2NpZGRnX2deYmJjYWFgXl9YVFpaWltbWFtYWFxbWltXV1lYV1xbXGBdVl1dU1BWWlZWWlVYVlhXWF1fYmFkYWRhXllZYWRiYGxmaF5cXVtXWFhZXFxcX1tZW2JWVFdeXWFjXFJWWFFXVlZWVlZTVlRYXFxfYGBdYF1XYV5bXlxbXlhWWFhbW19gXF9YWV1cXV1eXFpcWFtfYV5gZGNkZmZmYlljZWVoZ2ReY2BfZWNdZmlkZWlfZ15jYmNhYWBfX1tYWVtZWlpYWVhXW1taW1dYWlRZXVxaYFxVXmJOUldZVldaWVtcWVdZXmBiYWVhZGFdXllhY2JfYWBhX1xcXVhXW1tdXV9fXFpdY1haWF1gY2RfUlhZUFhXWFlZV1ZYVl1dXmBhYV9iXllhXV1eWV1eWVhWV1tcYF9dX1lZXl1eXmFcW1pZXF9iX2JkY2VmZWZiWmRmZ2lnY19jXmFmZFppaWJmaWNlXmJiY2FgYF9dXVpXW1lZWFhaWFdaW1pZV1hWVVtdXV1gYGJieExXV1xZV11cXF1aV1xdX2BiZGJiYV1gWGJjYmBjYWJeXFxcWFdbXV9dYF9dW2BkXFxYWmNlY2BSXFlPWFdZW1pZWFpZYF1gYmJgYWNfXGJdX11bXl5aWVVYXV1fYF9fW1peXmBiY1xcV1tdYGJhY2VkZ2VlZmRcZWZoaWZjYmJcY2dgXGlpYmhpZmVgYmFjYV9gX11dW1lcWVhXWFlYV1xbWldXWFBYWl1hY2Zmcmt/SllXXVpaX11cXlxZXVteX2FjYmFhXWJbYmRiYGNjYl1cW1pXWGlxYFxgX11cYWNfXllZY2VkYVNfWlFZV1xdXFtaW1tjYGNiY2BiZGFgY15gXF1eX1pYVltfXl1hYV9dW2BhYmViX11TXF9gY2RkZmRnZmVmZV5lZmhoZ2RkYFtmZ15haGhjaGhmY2BiYGNiX19fXV1cWltZWFhYVlpWXFpaVlZVTVhXXGdpa2h1eIF2dnZ2dnZ2dnZ2dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6e3p6ent7e3t7e3t7e3t7e3t7e3x7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHt7e3t8fHx8fHx8fHx8e3t7fHx8fHx7e3t7e3t7fYmIhoqHhYOBg4OCg4OCgoKCgoKCgoKCgoGAgYCBgICAgYCBgYGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t6e3t7e3t7fHx8fHx8fHx8fHx7e3t7e3t7e3t7e3x7e3t7e3t7fHx8fHt7e3t7e3t8iYmHiYaFgoGCgoGCgoKCgYKCgoKCgoKBgYGAgICAgICAgIGBgYB9fHx8e3x8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eHh5eXl5eXl5eXl5eXt7e3t7e3t7e3t7e3t7e3t7fHt7e3t6enp6ent7fHx8fHx8fHx8fHx7e3t7e3t7fHx8e3t7e3t7e3t7fHx8fHx7fHt7e3uHiYiJhYSDgYKCgoODgoKCgoKCgoKCgYGBgICAgICAgICAgYKBgH58fHx8fHx8fHx8fHx8fHx2dnV2dnZ2dXZ2d3d3d3d3d3d3d3d3d3h4eHh4eHh4eHh4eHh4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t8fHx7e3t8fHx7e3t7e3p6enp6e3t8fHx8fHx8fHx8fHx8fHx8e3x8fHx8e3t7e3t7e3x8fHx8fHt7e3t7e4aJiYiFhYOBgoKCg4OCgYKCgoKCgoKBgYGAgICAgICAgIGBgYCAfnx8fHx8fHx8fHx9fX18fHaIi4uLi4uLgX19fX19fYSMi4uLi454KSkqKiopKz0/Pj4+Pj5tgH5+f397pdfT09PT1r2GiYmJiYmJjY2NjY2NjYuJiYmJiYaz1tLS0tLWun1+f39/f359fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx8fHx8fHt7e3t7hIuHh4aHgoGDg4GCgoKCgoKCgoKCgoGBgYCAgICAgICAgYCBgIB+fHx8fHx8fHx9fXx8fH19doyQj4+Pj5CDfn9/f39+hpCPj4+Pk3kZGhoaGhocMTMzMzMzMmqCf4CAgHut6eTk5OToyomMjIyMjIyQkJCQkJCQjYyMjIyMiL/p5eXl5enHfX5/f39/f319fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e3uCjYeIh4eDgoSCgYKCgoKCgoOCgoKCgYGBgICAgICAgICAgICAgH58fHx8fHx8fXx8fH19fX12eHh4eHh3eHd3d3d3d3d4eXl5eXl5d29wcHBwcHBycnJycnJyd3p5eXp6en6Dg4ODg4SBfHx8fHx8fX19fX19fX18fHx8fHx7gYSEhISEhYJ8fX19fX19fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e4CMhomHh4SDhIKCgoKCgYKCg4KCgoGBgYGBgYCAf4CAgICAgICAfnx8fHx8fHx8fX19fX19fXZ2dnV1dXl2dnZ6e3h7eHd2eHt4eXp6fnx5eXh4eHh5eXl5enp5eXl5enp6eXh4eXl5eXl7e3t7e3t7e3t7e3p6enp7e3t7e3t6enp6enp6e3x8fHx9fX19fX19fX18fH19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8f4uHi4qIhIODgoKCg4KBgoKDgoKCgYGBgYGAgIGAf4CAgH+AgYF+fX18fHx8fHx9fX19fX19d3d3dnZ3fXh3d316eH14d3d5fHx9enl8e3h3d3d3eHh4eHh5eXl5eXp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fHx8fHx8fHx7e3x8fHx8fHx8fHx+iomMjImFg4SEgoKDgoGCgoKCgoKBgYGBgYCAgICAgICAf4CAgH19fXx8fH19fX19fX19fX13d3d3d3p9eHt4fHx3e3h3d3d5fX59eXt6eHh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fX19fXx9fX19fX19fX19fX19fHx8fHx8fHt7fHx8fHx8fHx8fH2Kio2NioWDg4OCgoKCgYGCgoKBgoGBgYKBgIGBgICAgIB/gIGAfXx9fX18fX19fX19fX19fXd3d3d3fX55d3d4e3p8eXd3d3x6fHx6fHl4eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt8fHx8fHx8fHx8fHx8fH19fX18fH18fH18fHx8fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8foqJjo2JhISEg4KDgoKBgYKBgoKCgYGBgoGAgYKAgICAgH+BgIB8fH19fX18fX19fX19fn5+d3d3d3d5fHl7eHx9eXt5enp6fnt9fXp8eHh4eHh4eHh4eXl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt7fHx7fHx8fHx8fHx8fXx8fX19fX19fXx8fHx8fHx8fXx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx/iIeNioeFhoaDg4ODgoGBgoGCgoGBgYGCgYCAgoF/gICAf4CAgHx8fX19fX19fX19fX5+fn53d3d3d3Z4eHl3eXp4enh5eXl8enp7eXl4eHh5eXh4eHh5eXl5enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX18fH18fH19fX19fH19fX19fHx8fHx8fHx8fHx8fX+HiIyIhoeHhIKDhISCgYKBgYKCgoGBgYKBgIGBgYGAgIB/gIGAfHx9fX19fX19fX1+fn5+fnd3d3d3d3d3d3d3eHh4eHh4eHh4eHh5eXl5eXl5eXl5eXl6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fHx8fX19fHx8gIeIi4eHiYaDg4SDg4KBgYGCgoGBgYKCgYGBgIGBgYCAgICBgX97fH19fX19fX19fn5+fn5+d3d3d3d3d3d4eHd4dnl5eHh4eHh5eXl5eXl5eXl5eXl5enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fH19fXx9fXyBhoqKiYmIhIOFhISCgoGBgYGCgYGCgoGBgYCAgYGAgIGAgIGBf3x8fX19fX1+fn5+fn5+f394eHd4eHh4eHZxZGpeam15eXl4eHl5eXl5eXl5enp6enp6enp6enp7e3t8e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIGFiYqJioeEhYWEg4KCgYGBgoKBgYKBgYGBgYCBgYCAgYCBgIF+fH1+fn5+fn5+fn5+fn9/f3h4eHh4eHh5bWRiZV9fXm95eXl5eXl5eXl5eXp6enp6enp6enp6e3t7e3t7fHx8fHx8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goWKiomJhISGhYSDg4KBgYKCgoGBgoGBgYKBgIGBgICAgICBgH58fX5+fn5+fn5+fn9/f39/eHh4eHh4eW5kZWdlZGJeZnh5eXl5enp6enp6enp6enp6enp6e3t7e3t7e3x8fHx8fHt8fHt7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChouJiIqEhYaEg4OEgoGBgYGCgYKCgYGBgYCAgYGBgIB/gIGBf3x8fn5+fn5+fn9/f39/f394eHh4eHl3Z2VkZWZkZWFfaXl6enp6enp6enp6enp6ent7e3t7e3t7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHt8fHx8fHx8fHx9fX19fX19fX19fX19fXx9fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4eJh4SEhoSDg4WBgYGBgYKCgYGBgYKBgICAgYGAgYCAgYF+fHx/f35/f39/f39/f39/gHl5eXl5eWtlYWJlZWFlZV5ieHdze3p6enp6enp6enp6e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fH18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19g4aLhoiFhYaEgoOEhIKBgYGBgoKBgYKBgYGAgYGBgYGAgIGBgn98fH9/f39/f39/f3+AgICAeXl5eXl0Y2NlZGNmY2doZGZsZF5ze3p6enp6enp6enp6ent7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn6DhouGhoaGhYODg4SDgYGBgYGCgoGBgYKBgYCAgYGBgYCAgYGBfnx8f39/f39/gICAgICAgIB5eXl6d2RhY2diYmRdW2VfYV1eYGFoeHp6enp6enp6enp6e3t7e3t7fHx8e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+foSFi4eGhoaGhIODg4KBgYGBgoKCgYKBgoGAgIGBgYGAgYGBgYF+fX1/gH+AgICAgICAgICAgHl5eW9vYmJiZF5jZ19dYWFgXF9kYlttfHp6enp6enp6enp7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7fHx7e3x7fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5/hIiLhoSHhoaEhIODgoGBgYGCgYGBgYKCgYCAgYGBgYGBgYGBgX5+fYCAgICAgICAgICAgICBeXpwXWJlZGJkXmZnZ2BZYmJhY2VfXF1ze3t6enp7e3t7e3t8fHx8fHx8fHt7e3t7e3t7e3t7e3t7fHx8fHx8e3x8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fn19fn5+fn5+fn5+fn5+foCFjIqEhYaGhYODg4SCgYGBgYKBgYGBgoKCgYCBgYGCgICAgIGBf35+gICAgICAgICAgIGBgYF5emxiZGdjYmdmYWBgZGFiZWRjZGNeXGJ1fHt7e3t7e3t7e3x8fHx7e3x8fHx7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/gYeMiYWGhoeFg4SDgoGBgYGBgYKBgoKCg4KBgIGBgYKBgYGCgoF/f36AgICAgICAgIGBgYGBgXp7dGdnZmZkZGZmYF5fYWNlaGRlXmJkYHR8e3t7e3t7fHx8fHx8fHx8fHt7fHt8fHt7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f3+CiYqIhoaIhoWDhIOCgYGBgYGBgoGBgoKCgoGAgYGBgoKBgYKCgX9/f4GBgYGAgYGBgYGBgYGBenptaGNjZ2ZnZWdmZmdiZWRlYmdbYmVgdnx8e3t8fHx8fHx8fHx8e3t8fHx8e3x8fHt7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f39/f4SJioiGiYeFhYSEg4KBgYGBgYGCgYKCgYGBgYGBgYKBgoGBgICBgH9/gYGBgYGBgYGBgYGBgYF7emlpZGNqZmFgZmVjY2NnaWRjYmBiZGJ0fXx8fHx8fHt8fHx8fHx8e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f39+fn9/f39/f39/f3+AhIqMiIeJhoSFhYOCgYGBgYGBgYKBgoGBgYGBgYGBgoKBgYGBgYGAgH+BgYGBgYGBgYGBgYGBgXZzZWRnY2RmZWJlZmdkZmhmZWNgYGNkYHF9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fXx8fHx8fHx9fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/fn5+f35+f39/f39/f3+AgICFioyJiIqJhoaDgoKCgYGBgYGBgoGBgoGBgYGBgIGBgYGBgYGCgX+Af35/foCCgoKCgoKCgoKCc3NnZWRkZWlqaGZnZ2NhZmZlZmdmZWVjdX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fH19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gICAgICAgIWLioqJioeHhoSCgoGBgYGBgYKCgYKBgYGBgIGBgoKBgYGBgYGAf4B+dHRzdX1/goCAfn5/gYB0cmdkZWNmaWppZWNlY2BmZGRnZ2JiZWFwfXx8fHx8fHx8fHx8fHx8fHx9fX18fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f39/f39/f4CAgICAgIB/houLiouLh4eHhIOCgYGBgYGBgYKBgoKBgYGBgYKCgYCBgYGBgoCAgH5zc3NzdHV4dXV0dHV2dXVwZmNmZWhoaWdoZ2VmZWJfZGVmY2BiZ3d8fHx8fX19fX18fHx8fH19fX19fX19fXx9fXx8fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gIB/f3+AgICAgICAgICHjIyIi4qHh4eEhIKBgYGBgYGBgoGCgoGBgICBgoGBgYKBgoKCgYCAfnNzc3Nzc3NzdHR0dHNzdW9jY2FnZWhoZ2pmZGVnZmhmY2JlYl5ieX18e3t8fX19fX18fHx9fX19fX19e3x9fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn9/fn5+fn5+fn5/f39/f4CAgH9/gICBgICAgICAgYCAf4CAgYGAgIeLi4iNiYiJhoSFgYGBgYGBgYKCgYKCgYGBgIGCgoGBgYKBgoKBgIB+dHNzc3Nzc3Nzc3Nzc3N1cmdlZWRlamhoZ2ZpaGdjZWViZGNoZGd7eHVzc3R2dnl4dnR0dHZ3d3d2dHR0dXV4d3h4d3d6e3x9fXx9fn5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f35/f39/gH9+fHt7fX58eXl2dnZ5fHx6end2d3l7fXt4hIyMioyHh4iEhYSBgYGBgYGBgoGBgoGBgYGAgYKCgYGBgoGBgoGAgH51c3Nzc3Nzc3Nzc3Nzc3VzaGVnaGVrbGhqZ2lqZ2dnZmRkYmVkbnV0dHNzdHNzc3Nzc3Nzc3Nzc3NzdHNzc3Nzc3Nzc3N0dHV1c3V3eHl7fn59fn98f39/f39/f39/f314fH5+fXx4dXZ3eXd4dnRzc3N0dXRzc3Nzc3NzdHNzc3R0c3R0dHODjI2KiYeIhoOGg4GBgYGBgYGBgYGCgYGAgYGDgoKBgYCBgYGBgICAf3VzdHRzc3Nzc3Nyc3NzdnZpY2hqaGpsZWZpbGhgZmVkY2BkZGZ0dXV1dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHRzdHRzc3Nzc3R2dnV1d3V4fH9+fX9+fHp4dXN0dXV1dHNzc3Nzc3N0dHR0dHR0dHR1dXR0dHV1dHR1dXR1dXV1dIaMjYuIhoeEhIWCgYGBgYGBgYGCgoGAgYCBgYKCgoGBgIGBgYGAgIB/dnNzc3Nzc3Nzc3Nzc3N2dnNnZ2pmaGdmaGhmZGlnY2NnZWVmcHZ1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dHR1dHR0dHR0dHRzdHR0dnV1d3Z0c3R0dHR0dHR0dXV1dXV0dXV1dXV1dXV0dHNzc3N0dHNzdHR0dHR1dXR1iY6MjIqHh4SEhYKBgYGBgYGBgYKCgoGBgICAgoKCgoGBgYGBgYCAgH93c3Nzc3NycnJyc3NzcnZ2dW5kXWNnZWlraGVoZ2dqamlnZXB2dXV1dXV0dHRzdHR0dHR0dHV1dXV1dXV0dHV1dHR1dXV1dXV1dXV1dXR0dHV1dXV1dXV0dHV0dHV1dXV1dXV1dXV1dXV1dXV1dXV0dHNzc3Nzc3N0dHNzc3Nzc3R0dHR0dHWKjoyMiYaGhIeFgoGBgYGBgYGBgoKBgYGAgYGCgYKBgYGBgYKBgYCAf3hzc3Nzc3JycnJyc3NzdnZ3d2liaGhnamtpaGZkZGVmaWhwdXR0dHRzc3JxcnJ0dXV0dHR0dHR0c3NycXFxcXNzdHR0dHR0dHR0dHV0cnJyc3R0dHR0dXV1dXV1dXR0dXR0dHR0dHR0dHR0dHR0c3Nzc3Nzc3Nzc3Nzc3N0dHN0dHR0dHR0dYuOjImGhYWFh4SCgYGBgYGBgYGBgoKCgYGAgIKCgoGBgYGBgYGBgIB/eXNzc3NycXJycnJzc3N3d3d3bGpoZGhpa3Z6a2VmZWhnbXJzdHN0c3JwcHBxcnN0dXR0c3NycnNycXBvb29vcHFzc3NycnJyc3R0dHNxcHFyc3R0dHR0dHRzc3Rzc3NzdHR0dHRzdHR0dHR0dHRzdHR0c3NycnFxcnJzc3Nyc3NzdHR0dHN2jZCMh4eFhYSEgoGCgoGBgYGBgYGCgoKBgYGAgYGCgoGBgoKBgYGAf395c3NycnFxcnJycnNzc3d3d3dzc2pnaWloeX99cW51bG5wcXJycnFxcG9wcXFxc3Rzc3NycXFwcG9ubm1ubW5ubnBxcnJycnJycnJzcXBvb3BxcnJzc3JxcnJycnJycnJycnJzc3Jzc3Nzc3Nzc3Nzc3Jxb29ubm9vcXJzc3Jyc3NycnNzcnaPj4uHhoWFhYOCgoKBgYGBgYGBgYGBgoGBgYGCgoKBgoGCgYGCgX9/f3hxcHBwcXFycnJyc3Nzd3d2dnd2cnF0c252f352c3hwcHBycnJycXFwcHFxcXFyc3Nzc3FwcXBvb25ubm5ub25vcHBxcXFxcXBwcXJwb25vcHFxcXFxcHBxcXFxcXJycnJycnJycnFxcnFxcnJycnFwb29ubm1ubW5vcXJycnJycnJyc3JxeI+OjYaDg4aEgoOCgoGCgYGBgYKBgYGCgYGBgYKCgoKCgoKBgYKBf4B/d29wb3BxcnJyc3Nzc3J2dnZ2dnZ3dnZ1c3l/fnd3d29wcXFxcXFxcHBwcXJxcnJzc3JycXBwb29wb29vb29vb29wb3Bvb29vcHBxb29vcHBwcHBvcG9wcHFycXFxcnJycnFxcXFxcXFxcHBwcHBxb29ubm5tbW5tbm9wcXFxcXFxcXFxcXB7j42NhoODhYOCgoKCgYKBgYGBgoGCgYGCgoGCg4KBg4KBgYGAgYF/f392bm9wcHBxcXFxcXBwcHZ2dnZ2dXR0c3NxfYB9fX9zb3BxcXFwcHBwcXFwcHBxcnJxcXFwb3Bvb3Bwb29wcG9vb29vb29vb3BxcXBub3Bwb29wb29wcnJycnFxcXBxcnFwcXFxcHBwcHBwcHBwb29ubm1ubm5ubm9ub3BwcHFxcXFxcXFxcIKRjoqEhIOFhIOCgoGBgoKBgYKBgYGBgYGCgoKCgoKCgYGBgYCBgX9/gHVvb29wcXFxcXBwcHBwdnZ2dXRzcnJycnGAgoCBeXBwcHBvcHBwcHFxcXFwcXFxcXFxcG9vcHBwcHBwb3BxcHBvb29wb29vcXFwcG9wcG9vb25vcHFxcHBwb3Bvb3BwcHBwcHBwcHBvb29vb29vbm5tbW1ubm5ub25vb3BvcHBwcHBwcHBwiZCMiISDhIaDg4KCgYGCgoKCgYGBgYCAgYGBgoKBgYGBgYGBgIGBgH+AdG5vb3BxcXFwcG9vcG92dnVzcnFxcXFxcICDg39ycHBwcHBwcHBwcHFxcHBxcXFxcXBwcHBwcHBwcHFwcHBwcHBwcHBvcHBxcXBwcHFxb29vbm9wcHBvb29vcHBvb3BwcHBwcHBwcHBvb29vbm5ubm5ubW5ubm1ubm9wcG9vb29vb3BzcXWPj4uJg4KFh4ODgoKBgoGCgoKBgYKBgYGBgYGBgYGBgYCAgYGAgYGAf4B0b29vbm9vb29vb29vb3Z1dHNxcXFxcXJygIKCgXRxcXFxcXFxcXFxcXFxcXFxcXBxcXFxcHFwcXBxcXFwcHBwcHFxcXBxcHBwcXBwcHBwcHBwcHBwcHBwcHFxcXBxcHBwcHFwcHFxcHFxcXFxcXJxcnFwcnRycnR0dHR1dnRzdHR0dXd3gpCPi4iDgoaHhISCg4GBgYKCgoGBgoGBgYKBgYGBgYGAgICBgYCBgYB/gHVvb29vb29vb25vb29vdXRzcnJycnJycnKDg4OCdnFycnFxcXJxcnJxcXJycnFxcXFxcnFxcXJycXFycXFxcXFxcXFxcXFwcXFxcXFxcnNzcnJyc3V1dHR0dHR0dHV2d3d3d3d3eHh4eHd3eHh4d3Z3dnV2dnZ2d3h6e3x7e3t6enp6enyGkI2LiIODiIeHhYODgoGCgYKBgYGBgYKCgoGBgYGAgYCAgYGAgIGBgH+Ad3FxcXFxcG5ucG9wcG92dHV1c3Nzc3NzdYiDgoN5cnNzcnJyc3Jyc3NycnJycnN0cnJzcnNzc3Nzc3Nyc3N0dHV1dXV1dHV3eHd3d3d4eHh3eHh4eXl5eXl4eHl5eXp6e3t7e3t6enp5eXh3d3d1dnV2dnd5enp7fn5+fX1+fn5/f35+gIyQi4qHg4WIi4iEg4SDgYGCgYGBgoGBgoKCgoKAgYGBgYCBgYGAgIGAf4B8enp5eXx5eHh2dXZ2dHl2d3h3d3Z3dnZ6f3x+fnx2dnd3dnV4enh4eHh3d3d2eHx5eXx6eXl8e3l5eXh4eXl6enl5eXh4enp5eXh4eHh3dnd3eHh3eHh5eXp7e3p8fH1+fX9/f359e3t7e3p5enl5e3t/foB/fn5/fn19fX5+f35+fn6AjpCNioeEhoqLiIaGhIOBgoKBgYGCgYGCgoKCgoCBgoKBgYGCgYCBgIF/f4B/fn19fX9/f318e3t7eXh4eHh5eXl4eXh5eXl4enp6enp6e3t7fH1+fHt7ent8e318e3t7e3t7e3l4eXh4ent6enp5eXp8fHt6enx8fHp6ent9fHx+fn+AgoGAgYKAgH9/gYGBgIB/f35+fn5/fX1+f4CAf35+f39+fn9/f39/gH+Af4OQjoyHhoWIi4yIh4aFg4GCgYGBgYKBgoKCgoKBgYKDgoGBgYGBgIGBgIB/goOCgoGBgX99f39/f4F6enh4d3h4eHh5eHh5enp5e358enx9fXt8fX19fHx7fnx9fn5+fn5+fX9/f3x8fYCDgYCAf318fXx9fXt9fXx8fH19fX1+gYGChISDgoB/gYGBgH9/f4B/f39/f39+fn9/f39/f35+f3+Af39/gICAf4CAgICAhJCPi4eGhoiLi4mKhYaDgoKCgYGBgoGCgYKBgYGBgoOCgYCAgYGAgIGBgH+ChIKCgICAgH9+fn+AgH9/fn18fX19fYB/fX+Af35/gH9/fn9/gIGBgIB/fn+BgICAf4CBgYB/f4CBf35+f39+f39/fn5+f39/gYB/f4CBgYCAgYOEgoGCgoGCgH+AgYCBgYGAgH+BgICAf39/gICAgYGBgIGBgYCAgICBgoGBgYCAgYGFjo6MiYaHiYyLi4qGhoOCgoKBgYGCgoOCgoKBgIGBgYKCgICBgYCAgYGAf4KFg4KBgYCAf39+fn+AfX5+fn19fX5/fn9/f35+fn+AgYCAgICAfn9/fn6Af3+AgIR/g4F+f39+fn59fn9/fn9/f35/gIGBgoKDg4KCg4KBgYKDg4OCgYGBgYKBgoKCgYKBgoGBgYGBgoKCgYGCgYKCgoGBgoKBgYKCgoKCgYGBgoKCgoaPkY+KiImKjY6NiYaFgoKCgoKBgYKCg4KCgoGBgYGBgYF/gIGBgYCBgIF/gYWEg4KCgoGCgYCAgIB8fHx7fH18fH9+fn9+fn5+f35+f39/f39/f35+foB+fn9/jH6NhX5/f39+fn5/gIB/gIF/f39/f3+BgYGCgoCAgYKDg4SDg4ODgoKCgoKCgoKCgoKCgoGCgoKDg4OCg4ODgoKCgYKCgoODg4ODgoKCgoODg4KCh5KTkIuKi4uPj42Kh4SCgoKCgYGBgoKDgoKBgYGBgIGBgICAgYGBgIGAgYCAg4SDg4OEg4ODgoKCgXx9fHx9gn1+f4GCiIGCgoSCgYGDg4GBgYKDgYKBgYCAf4GXgpSMfn+AgX9/f3+AgYCAgICAgH9/f3+AgICAgH9/gYODhYSEg4SDgoKCg4OCgoOCgoODg4ODg4SDg4KEhYWDg4SEgoKDhIOCg4ODg4OCgoODgoCKlJOPioqMjpCPjYuGg4KCgoKBgYGBgoOCgYGBgIGBgoGBgICBgYGAgYCAgH+BgoODg4SEhIOCgoKCfXx8fn6AgYOAg4OChIaFhoaFhIWFg4ODg4SBgYKEhIKChp6Gl5SAgoGBgoKCg4KDg4KDg4ODgoGAgIKCgYOCgYKCg4OEhYWEg4OChISEhIOEhISDg4OEg4ODg4OEg4SDhIWEhISDg4ODgoKCgoKCgoKBgYKCgo+UlI+Njo6RkY6KiISCgoKCgYGBgYGCg4GBgIGBgYGBgYCBgIGBgYCBgICAgIKChIKChIOCg4ODgoJ9fX2AgH+AgoGDg4ODhIaEhIOEhYWDg4GBg4OBgIGDgYKKoYiZmoeHhoaGhoeIh4eGhoeHhoaEgoGCg4SDg4ODg4ODhISFhYWDhYSFhISEg4KBg4OCg4SEg4KCg4SCg4ODg4OCgoKCgoKCg4OEhIOFhYWFhoaIk5OTkI+Pj5KRjIqIgoKCgoKBgYGBgYKDgoKBgIGBgYGBgICAgYGBgICAgICAhISEgoKCgoGBgoKBgX+AgYOCgICAf4CCgoGDg4KCgYODg4SDg4KDhYSDgYGBgYujipqciYaGh4eHiIiHh4eIiIiFhIOBgIGBgoKCg4GCg4SEhYSDg4OEg4OEhIOBgYGCg4OEhISDg4ODg4OEhIODgoSDg4ODhIWFhoeHh4eIiIiJiY6TkpKOj46Rko+LiYeCgoKCgoKBgYGBgoKCgoGBgIGBgYGAgICAgYGAgIGAgICDg4KCgYKCgYGAf4CBhYWFhoOCgYB+fn+BgoSCgYKDhIOCg4ODg4KChISDg4KAjaOJl5yIhISDg4SFhYKEhIWFg4KBgH9/gIB/gIGEg4OEhYWEgoKCgoOCg4OFhIKDhISEhYaGhoaGhoWFhoeHhYaIh4aHiIeGhoaIiYeGhYaGhoeIkZKSj46QjpCRjImHhYGBgoKCgoGBgYGBgoOBgYGBgYGBgICAgICBgYCAgICAgISEg4KBgoGAgYGAgYKIh4aHhYSCgH99fX6AgH+AgYGBgYGBgoGAgYKDgoKCgoGNo4+WmYSCg4GBgYGAfoGAgICAgH9+gIGBgYKCg4OEg4OEg4OCgoGBgoODg4SEg4SEhIOFhYaFh4eIh4eHh4eHh4eGhoaGh4WFhYaGhISEhIWEhYaSk5GOjo+OkI6JiIeEgoKCgoKCgoGBgIGCgoKCgoKCgYGBgYGAgYGBgICAgYGAgoSDg4KDgoGCgYKDg4iHh4iHhYSCgX5+gICAfn5/f4CBgYGCgoCBhI6EgYCAhZ+mqaiXgoKBg4aDf39/gICAgICAgICDg4KDg4ODgoOBgYKCgoOCgYKCgoOCgoSDhISDg4SEhYWFhYaGhoaFhISEhYWEhIWFhYSEhISDhISEhISEipSTkpCQj46NiIaFhIOBgYKCgoKCgYGAgYKCgoKBgoKBgYCBgYCBgYGAgICAgYGAg4OCgoOCgoKBgoOCiImJiYiHhYSDgYKEhIOBgoKCg4SCgoSEgoOKl4mEg4SYraerrKCOgYKEkISBgYCBgoOCgoGDg4SDg4SEg4OCg4KDg4ODg4KCgoKCgoGDhISEhYSFhYWFhIWEhIWFhYWDg4OEhISEhYWFhISEhISEg4ODg4OOlZKQkZGOjYyHhYODg4GBgoKCgoKBgYCBgoOCgYCCgYGBgICAgIGBgYCAgICBgICDhYSEhIODg4SDhIOGh4mIhoWDhIODg4WDgYCDgoWGhISDg4OChI6Zj4WFiaWhmaWjm56JgpSVhIOCgYGBhIWEg4ODgoKDhISDg4ODg4SFhISDg4KCgoKCgoSEhYSFhYWFhYODhYWFhYaFhoWEhIWEhYWGhYWFhIWEhISDhIODhJGUk5KSj4yMioWEhIODgYGCg4KCgoKBgYGCg4KBgYKBgYGBgICBgIGBgH+AgIGAgYaGhoaGhoaHh4aGhYSDhYaCgIGBgYGHgoB+f4GBj4yDgX9+fXx9jZ2Zk4SIn5SQn5yUnZWSno6Cg4GCgYKDhYODg4KDg4OEgoKEhIOEhIWEg4OCgoKCgYKCg4ODg4SFhYWFhIOEhYWGhYWEhISEhIOEhIWFhYWFhIODhIOEg4KGlJSSlJKPjYyIhISEg4KBgoODgoKDg4GBgoKBgoKCgYGCgYGBgYCAgYGAgICAgICAhYWFhYaGh4aGhoWGg4ODg4GAgoKCgYKAf35/f4GWl4mAfX19fnyCl5OhnYyTko2YmpSZoaGbh4GBgYKDgoODgoOCgoKCg4OBg4SDg4ODg4OEhIKCgoKDgoKDg4ODhIWEhISEg4OEhIODg4OEhIODg4ODg4SDg4ODg4KDg4KDgouUk5KTko2NioeDg4OEgYGCg4ODg4ODgoGBgoGCgoKCgoKBgYGBgICBgYCAf4CAgICDhISFhYSFhYWEhIWCg4KDgoKDg4OBgICAgICAgJafi35/gH2Hi3+EhpWopZ+SkZWPiZWgnZmEgoKDg4ODgoODhIKCgoODgoKDg4KCg4KDg4WEg4ODg4SDg4SEhISEhYWEhIWEg4SEg4OEhISEhISEg4SEhYSDg4SEhIODgoKDkJSSkpKPi4yIhoOFg4OBgYKDg4ODg4OCgYGCgoKCgoKDgoCBgoGAgICAgIB/gICAgISDhYWEhYWFhYSFhYOEhIWDg4SEhIKCgoOCgoSBkqCKgIyFfYaIgYCGiZyhopCDf35+gpadkYKDg4OEg4ODhISEg4OEhISEg4SEhIOEg4OFhoWFhYSFhYWFhYSFhoWGhoWFhYWFhYWFhYWGhoWGhoaFhoaGh4aFhYWFg4SEhIeTk5OSkoyKiIWFhYWCgoGBgoODg4OCg4KBgYKDg4ODgoKBgIGAgICAgICAgH+AgICAhYWFhYWGh4eGhYWFhISFhYSEhISEg4ODg4OEhYOKkIKEioWDgoF/f4OIj4+GgH9/gIB/go6Gg4OEhISEhISEhISEhISFhYWEhYSGhYWGhYaGhoWGhYWHhYWGhYaGhoaFhIWFhYWFhIWGhoaHhoaGhoaHh4iIiIaFhYaEhYWGjZSTkpGQi4qHhoeGhIGCgYKDg4ODg4KDgoGBgoODg4KAgYGBgICAgICAgICAf4CAgICHh4eGhoeHiIeHhoaEg4ODhIODg4OEg4ODg4OEhISEgYKCgYiBf4CAf4aCf3+AgICAgICAgIOFhIWGhoaFhYWFhoaHhoaFhoWFhoeHh4iHh4eGhoaHh4eGhoaGhoaGhYSDhIWFhYSFhYaGhoeHhoaGhoeHh4eIiIeGhoaHh4eRlJORkZCLiIiFhoSDgoKBgoODg4ODgoKDgoKCgoOCgYCBgICBgICAgIGAgIB/gICAf4aHiIeHh4eIiYmIiIODgoKDgoSEhIWEg4KCg4SEhIOBgICAhYV/f39/gICAgICAgICAgIF/f4WFhoeIiIeHh4eIh4iHiIiIhoaHiIiJiYmIh4aHh4eJiIaHhoeHhoaFhIOEhYaFhYWFhoaGh4eFhoeGh4aGh4eHh4eHh4eFh5OTkY+RkIuHhoWGhIKCgYGCg4ODg4ODgoKCgoGCg4KCgIGBgYCAgICAgICAf3+AgYB/hoiIiIiHh4iJiYmIg4KCg4ODhIWHh4aFg4OFhISDg4GAgIGMiIGAgYKCgYGBgYB/gH9/fnt6gIaIiIqKiYmIiImJiYmKi4qIiIiJiYuLioqIiIeIiIiHh4iIh4iGh4aEg4OFh4eHhoWFhISDhYWEhYWGhISEhYWFhoWGhYOJlJOQj5COioaFhoWDgYGBgoKDg4ODgoKCgoKCgoKCgYGBgYGBgYCAgICAgIB/gICBgH+GiYiIiYeIiImJiIiEgoKDg4KDhImKh4aEhIWEg4OCgICAhISCgoKCgoKCgH9+fX19fX9+fHt8g4eJi4uKioqIiIqJiImLiomJiImIioqJi4mHhoaGh4WGiIiJiIeGh4SDgoSIiIiIh4WCgoGDg4KDg4SCgoKDgoGEg4SEgY6TkpCPj4uIhYSGhIKBgYGBgoODg4OCgoKCgoKCgoGBgYGBgIGAgICAgICAgH+AgIGAf4WIh4eHhoeIiIiHh4SCg4OCgoOFiYqJh4WHhYSFhYKAgYOEgoOCgoKDgX59fn5+fn5+fn1+fX19g4eJioqHh4WGh4eHh4iHh4mGiIaIh4aJiYODhIOFhISFhYaIh4aFg4KCg4WHhoeGhoSCgoOEgoODhIKBgYGBgYODhIODkZKQjo+Oi4eEhoaDgoGAgYGDg4ODg4KCgoKCgoKCgYGBgIGBgYCAgIB/gIGAf39/gIB/hYaGhYaGhoeHiIeGgYKEhIOChYeIi4qGhIaEgoaGgoKEhIODg4OCgoF9fH1/gH5+fn59fH19fHl8g4aHh4SDgYODhIWFhYODhYSEhISEhIWEgoKDgoSEgYKDg4WGhYSCgYGCgoODhYOEhIWEhIaDhISFg4KDgYKDg4SFhIeSkY+Nj4yJhoSFhIWCgYCBgYODg4ODgoKCgoKCgoKBgYGBgYGAgICAf4CAgYB/gICAgICDhIWEhYWFh4eHh4aAgYGFg4OEhYSHiIWCgIB/gn9/gYODg4ODgoJ/fX1/gICBf31+fn18fX17enp+hISEgoGBgIGBgoKBf36BgYGCgYOAgoGCgoKBg4SAf4CAgYOCgICAgICBgYGCgYGChIODhYSCg4SDgoKBgoSDhYWGi5ORj4+Pi4iFhYOChIGBgYGBgoODg4KCgoKCgoKCgoGBgYCBgYCBgH9/gIGBgICAgH+AgIKCg4OChIOEhYWGhn+BfoCBgICAgIGDgn9+fn5+fYCCg4OCg4KDgn19fn+AgIGAfn19fX1+fXx6enqAgoKBf39/f35/f4B+fYB/f4CAgX+AgIF/f4CBgX59fX+AgX9/foCAgH+AgICAf4CCgICCgYGCgYGAgYGBgYKEg4aPkpCOj42Kh4eGg4ODgYGBgYGCg4ODgoKCgoKCgoOCgYGCgYGBgICAgH+AgICAgICAf39/gYKDhIGCgoODg4SFgIB/fH19fn19foCAf31/fn1+gYODgoKCgYF/fX1+f4CAgH9+fX19fHt7e3p6eXqAgIB+f39+fn1+f35/gH9+f3+Af4CAf35+fn9/fn18fn+Af35+f3+Af39/f4B/f4B+f4CBf4B+f39/gH9+f4B/hZKSj46Pi4uHiYWEhIKCgYGBgYKDg4ODg4OCgoKDg4KAgYKBgYGAgICAf3+AgIB/gIF/f36BgYSEgYKBg4OCg4OBgH98fn5/fX6Af4B/foF/f4CBhIOCgYB/f359fn5/gICAfn19fX17e3x6enl5eXuAgH9/f39+fn5/foCAf35/f4CAgoB/fH5+f35+fXx/f4B/fn9/f4B/f35/foCAf36Af39+fn5/f35+fn18fH2Fk5KOjIuKiImIhISEgoKCgYGBgoOCgoODgoODg4ODgYCBgYGBgYCAf39/f4CAgICAgIB/foCBhIOCgYGDhISDhICBgICBgIGAgYKCgoGBgoCBg4ODgYGBgYCAfX19fn5+f359fX19fXx8fHt6eXl5eX2BgICBgYF/f4B/f4F/gICAgYGCgoB+gH5/fn5+foGAgYF/f39/gIB/f39/gYB+f4CAfn9/fn+Af31+fn17fIaTkYyLioeHioiGhoSDgoGBgYGCg4ODg4OCg4OCgoKBgICBgYGAgH9/f39/gICAgICAgH9+fn+BgYGAgISGh4aHgoSDhYOBg4ODhYSEhISEg4ODhIKCgoKCgX5+fX19fn6AfX19fX19fX19e3p6eXl5eYCCgoKEg4GCg4F/gYCBgYGDgoODgYGCgIGAf4CBg4GEgoCAgYCBgYCAgYCCgn+BgIF/gIB/gICAfn9/fnx8ipOQiomIiIiJiIaGhoSCgoGBgoKDg4ODg4KDg4KCgYCAgICBgYGAf39/f4CAgICAgIGBf359fn5/f39+g4aHh4iChYSFg4SFhIWGhoaGhoWGhYGBg4ODgoKAfX19fX19fn59fX19fX19fX18e3l5eXl4fIKDhIWCgYSDgoKDhYaCg4SDgYKCg4OCgoKCgYKFg4iFgoGBgYKDgYGBgYSDgoOCgoKCgYGBgIF/gIGAf36Ok4yHiIaIh4aGhYaGhIKDgoGCgoODg4ODg4OCgYGBgH+AgYCBgYB/gH9/gICAgH+AgYB/fn19fX5+f36Ag4SHiISGhoaFhoaHh4aHh4iHh4eGf32BgIGCgX59fX19fX19fX19fX18fH5+fnx7eXh3eHl5gIODf4OMhIOEhISXl4ODhIF9foGCgoGCgYKBg4aIjIWDgoKBhIKEg4KDhYSEhYOCg4OCg4OCgoKCg4OCgpKQi4iJh4mHhoaEhoWEhISCgYKCg4ODg4ODgoGBgYCAgICBgIGBgH9/fn+AgYCAf4CAgH9/fn1+fn+Bf4CCgYWFhYeGh4eGh4eIhoaHh4eGh4V+fX18fX9+fX19fX19fX19fX19fXx7iJKCe3x6fIZ5eHl8gYF+iZaEg4OEhJSTgIGBf39/fn6Fi4B/gICEhpCJhYSCgoGFhYuDgYKFhYaGhIOFhYOFhIODhIOFhISIko6MiYiIiYeHh4WGhYSFhIKBgoKDg4ODg4OCgYGBgYB/gIGAgICAf39/f4CAgICAgYGBf39/f4CAgIGBgYGBg4OGh4aGh4aGiIeGhoaFhIOFhH59fHx8fX18fH19fX19fX19fX18fH+RlZaDe3qElHx4eXp7fICCg4GBgYOCgH58fn57iJF8fI6Wf31/f4KGioWDg4SDgYONiX9+f4OEhYWDhYaFhIWFg4SFhYaEhI6Rj4yKioyJiImHhYWFg4ODgYGCgoKDhIODgoGBgICBgICAgYGAgIB/f3+AgIB/gICAgX5+f4GBgoKCgoODgoOCgoWGhISFhYSGhIOEg4KBgIKAfn19fHx9fXx8fH18fH18fX19fHx8e4uRl4x6e3yBenp6e3x5eX19foB/gH98e3t+fn2ClZF/hIh+fH5/goR8fIGChIKAf4eDfYKBf4KCgIODhISEhISChIOEhYGEkpKOi4yMjoqJiYWFhYODgoKBgoODgoKDg4KCgYGAgIGAgICAgICAgH+Af3+Af357gICBenyAgYKDhYODhYWFhYODg4SCgYKDgoOCgoGBgIB/gX5+fX59fHx8fHx8fHx8fHx8fHx9fHx8fn6Kgnt6e3p4ent7fH17fn1+f319fX18fH+BgX2Gj4F+fYJ+fn6Agnx8f3+CgIKAfnx7ioJ9gH9+gYCAgIKBgoCAgYGAf4uUj4yLjo6NiIeHhYWEhIOCgoKCg4OCgoODgYGBgICAgICAgH9+fXx7fHx9f3+AgHx6gYF4e4CCgYOFhIOFhIaHhISAhpSIgIKBgYGBgH9/f39/fn5+gHx8fHx8fHx8fHx8fHx9fHx8fHx8fHl7e3t4eHl7enp8gn+Afn+BfH5+f399gIKCgICAgX+CkYF/f4CAfoB+fn9+gIGBfX19e319fXx9fHx9gH+AgH6Afn6ClJGMjI2OjoqFhoeFhISFg4ODgoODg4OCgoGBgYGAgICBgICAf4CAf39/fXt6fICAgHh+gXd7gIF/gYKCgoKEhoeGhn6IlYp+gYGAf4B/foB+f39/fn+Bfnx7e3x8fHx8fHx8fH59fHt9fHx8e3x8fHp6eXt8en2Fg4J/gYF+f35/gH6FgoF+gH9+foCFhoKAfn6Dhn9+fH6AgIGAf39+fX19fX57fH1/f3+AfX9+gIyRjYyNjo2Nh4SGhoWEhISDg4OCg4ODg4KBgYGBgYCAgYGAgYGBgYGAgH9/f397en9/e3mAd3p/f31/f3+Af4KDhoaFf3+FgX5/gIB/gH5+f31/gIB/f4B/f319fHx9fn18fH19fX19fH58fXx7fXx8ent6fH19f4aEgoCAgX1+fX5/fouEgYZ+fXx8f36CgX99fX19gHx7fXx+gYSDgYB+fn5+fX1/f399foB+fn6Eko2MjI+Ni4qGhIaEhIODg4OCg4KDgoOCgYGBgYGAgYGBgYB/fXx8fH1+f39/f397e399d352eH59fH18fX5+gYGCg4B6fX18fn+Af36Af35/fn+AgH+AgH9/fn9+fn5+fn1+fn99fH59fn19fHt8fHx6e3p9f4CAg4OCf35/fH18fXx8gYN+jH58e3t9fn1+fn17e3t9fHp7e3uAhoWChIOCf4B+f4KCgn9/goJ/gIqPjIyLjYyLiISEhIODg4ODgoKCgoKCgoKBgYGAgoGBgYKCf3+AgIB/fn18fH5/fn55fX52e3Z4fXx8fHt9fX6BgICAf31/f31+f39/foB/f39+f3+Af4GBgH99gH9/fn9+fn5/f3yCfn59fX17e319fHp8fH6AgoGAgIB8fH18fHx8fH18fnt/fnt7e3x8fH18e3t7e3x8enp9en6CfoGDhIKBgoGFhoWFhoaHhYGEkY6Mi4qLh4eFgoOEhISEg4KCgYGCgoKBgoGBgYGBgoGBgoKAgYKBgYCAgH9+e3x+fnx6fnh5dnd8fHx7e318f4GAf35/foB/f35/f35/gH9/f3+Af3+AgYKAfn6BgIB/f39/f39+fYN8fH19fH99fX19e3x+fn9+fn5+fnx8fHx8fXx+fnt8e3x8fHx9fH18fnx9fHt7e3x5e3x7e316fX5/f4CAg4eJiYmKiYqJhYiRjYuIiYeFhYOCgoOEhIOCgoKBgYKBgYKBgYGBgYKCgoGCgoCAgX98e3p6eXt9enx+fnl8eXh4dHx8fHt8fHx+gH9/f39/gIB/fn5+fX+AgH9/f3+Af4CDgoB/gIGAgIB/f4CAgH58enx9fX59fX5+jIZ9fX57e4OCfX19fX18fX19fH1+fH18fXx9fX58fn19fX18e3t6fHt8fHt6e3t6enp7fn6ChYiHiIqLi4uJjZGOjYmIhoWEgoKCgoODg4OBgYGBgYGBgYGBgYGCgoOCgYKBgIGBf3+Af356eHl5en5+e3l6eH5zfHx8e3x8fH5+fn5/gH+AgIB/fn9+gIF/f4B/gIGAgoSDgYCAgYGAgX+AgYKBf39+f31+gH57foGSjHx9f4qAjYx+fn19fX59fX59fHx8fX18fXx9fX1+fX1+fnx7e3t8fH18e3p7fHl6eXh5e35/hIOEh4mKiImOkI2LiIiFhISCgYKCgoKCgoGCgoKBgYGCgYKCgoGCgoKBgoKAgYGAfoCAf39+e3p5e319eHx6f3KBfXt7fHx8fn59fYGCf4GBgX9/gH+AgX9/gIGCgYGFg4SCgYGCgYKCgICBg4KAf4F/fX6Afnx/f4mCf36DkISEg4F/fn18jYd9fX59fHx/fnx9fXx9fX5+fX5/fX19e3x9fnx8e3x9enp5eXl5e3t+foCBg4eEiI6NioqGhYSEg4KBgoKCgoGBgYGCgoKBgoKCgoKCgoKCgoGCgn+AgIB+f39/fn5/ent5fX16enp9cX6Cent9fX19fXp4f4KAgYKCgICBgIGBgICBgoKCgoaFhIKBgYGBg4F/gIKEgX9+gYB9foF+fX5/gIB9fn+EgH5+f31+fX2KhX1+f31+foB/fX18fH5+fn99f4B9fn18fX9/fHx7fH17e3t6enp7e3x9fn2Ag4CJjYqLh4WFhYSDg4KCgoKCgYGBgoKBgoKCgoKCgoGBgoKBgYKCf4CAgH9/f39+fn59eXp6fXx5d3t0e4d8dHd9fn17e3Z2fYCBg4KBgYKCgoKBgYGDg4OChYaEg4CAgICDgX+AgYSBfn6Af35+gH59fn6AgH+Bfn+Af39/gH99f39/f3+Afn9/gH58fX18fn5+foF/gH2CgHx9gIB9e319fXx8e3x8e3t7fHt8fHx9fIqKiIiFhYWFhISDgYKBg4KAgIGCg4KCgoOCgoKCgoGCgoGBg4J/gIGAf39/fn5+fn57enp8fHt2e3R3f352cnt+fnt4dnd8gIGCgoKBgoODg4OCgoSDhIOFhoOCgX9/gIKAgICAg4F+foB/fX+AfX1+foCAf4J/gYGAgICBgH1/f3+AgIGAgIB/fnx9fX19fn59gn2AfoKAfX6AgX98fn59fX17fH58fXx8fHp8e3x9iYaGhYWHhYWFhIKBgoGDgYCAgoKDgoKCg4ODg4KBgYGBgYGCgH6AgYB/fn5+fn5+fn56e3p9goN9dXF6fHpxen59eXh0dICAgoKCg4KDhYOEg4KDhISEhIWEgYGAgH6AgoB+f36Bf35/f4B9foB9fX1+gH9/gYCCgYCAgIKBfn6Af4GAf4CAgH9+fX19fnx+fn19gYR/gH9+f4GBf31/f319fn1+fn1+fHt8enx7eoCHgoSEhYSEg4WDgoKBgYKBgICCgoOCgoOEg4SDg4KBgYKBgYOAfoCBf35+fn5+fX5+fnt7en6Jh354cnl9f3F6eHt4eXV1fYKDgoODg4OFhYWDg4OEhIODhIKBgH+Af4CBfn19fn9+fn5/gH19f3x9fX6Af4CAgIKAgIGAgoGAf4B+gIF+gIGAgH9+fn5+fn5/fn6FhYGBgH+Ag4F/foGAf35/f4B/fn17ent6fHt6goR/g4KCgoOChIKBgYCAgoGAgIKCg4KBg4SDhIKEgoGBgoGCgn9+gIF/fn1+fn5+fX59fXp7fIWEe3tzeXp8cHd1dnd5dXR6hISBhISDhIWFhoSDg4WEgoODgoCBf39/f4B9fX1+f31+f39/fn1+fH19foF/gIB/gIB/gIGDgoGAf36AgH+AgYCBgH9/f39/f4CAgIGCgoKBf4CDgX+Ag4J/f4B/gX+Af3x7e3p8e3yCgH+Cf3+BgIKCgYF/f3+BgH6BgoKDgYGDg4KEgoSCgYGBf4GCgH6AgH9/fX5+fX19fn19e3t6gH94fHZ5eXtxdHh3dnh1cnmFhYKEhIKEhYWGhISChIOBg4GAgIF+f4B/gHx9fX6AfX5/f39+fX98fn5+gX+Bf39+f4B/gIODg4B/f4GBgIKBgYGAgICAgICAgIGAgYKDgYF/gISBfYGDhICAgX+BgYKBfXp7e3x8fH9+f4B8f399fYGAgH59fYB/foKBgYKBgIKCgoKBg4KCgYB/gYKAfn9/fn99fX1+fX19fX19ent7fHZ9eXh5enJ1eXl2d3dzdYaFg4WFgoSEhYSEhIKDgoGDgX+AgX5/gH6AfX19fn9+f4B+fn99f3x/f3+BgIF/f3x+gH6AgYKDgYCAgYOEgoGAgYB/goCAgYGAgYGCg4KBgX+Ag4B+goKEgICCgYKChIJ+e3t8fHx8fX1+fXp+fX14fn9/fHx8fn5+gYCBgYCAgoGBgYGDgoGBf4CAgoB9fn19f319fX59fH19fX16e3p8dnx6d3t4cnZ5e3Z2dnN0hoSEhYSChISFg4ODgoOBgYOBgIGBfX+BfoF9fX1/f39/gH5+f359fYB/gIGBgX5+fH5/fn5/gYJ/gYGCg4eFgX9/fn6Af4CBgICAgIKCgYCAfoCCf36BgoOBgYOCg4OFgn99fX18e3x8eXp7en55e3l4f357e3t+fX1/f4F/gH6BgICAgoOCgYF/gIGBf31+fH1+fX19fX18fn58fXx5e3x4enx3endzeHd6c3Z2c3SGhISGg4KDhISDgoKCg4GCgoGAgYF9gIB+gH1+fX5/gICAf39/f3x+f3+BgIGAf359f39+fn+BgH2AgIGDg4N/f359fn5+f4CAgIB/gYKBgH9+f4F+f4CCgoCBg4KEhIaEgH59fHx8fHt5dnl5enl2eXZ+fHt7e358e399gH99fX9/f3+BgoGBgX5/gYF+fX18fX19fX19fXx+jYF8fXl7e3p5fHd4eHR1dXhyd3d0doaEhIWEg4ODg4OCgYKDgoGDgn+Bf35/fn+AfX19fX+AgIB/f39/fIB/f4GAgYCAf3yAf31+foB/fX5+gYGCgn5/fn1+fn5+f3+Af32AgIB+fn5/gX5+gIKBf4KDgoOEh4SAgH58fXx8e3x1eHl4eHh5d3t8e3t7foV9fn1/ent+fn59foGAgIGAfX6BgH59fXx9fX19fX18e32Dgnx8ent7e3p7d3Z4dXJzdnB4eXJ4hYWFhYOEhIOChIKBgYKBgIKBgIF/fn5+foB+fX58foCAgICAgX97gH6AgH+BgYB/fYB+fn5/f319fX6AgYKBfn9+fn59fX5/fn9+fH+Af35+fn+Cfn6AgIF/gYODg4OGhICBfnx9fHx7fXh3e3h1eXd3eXx6e3t9kod9fH13en1+fn19f35+gH98foB/fn19fH19fX19fHt8ent9enp4e3x6ent4dHh1cXJ0cHh4cnmEhYWFg4SDgoODgoGBgoKAgYGAgIB9fn5/gH18fn1/gIGAf3+BgHyAf4B+f4GAf39+gX9+f39+fX18gICAgIB+f35+fn18fn9/f358fYB/fn1+gIJ/foCAf36ChIKCg4WFgoJ+fXx7e3x8eXd8eXd4d3d4e3t7e3yFin17end6fH19fHx9fX1/fnx9fn59fXx8fX5+fX18fHt6enx7e3p5enp7enhzd3VxcXJveHdxe4WGhIWDhYKBg4OBgYGBgoCBgICBgH5/fn+AfXx+fYCAgoGAgIGBfX6Af35/gX+Af3+BgH9/f31+fH1/gICAgH9/f35/fXx+f39/f319f39+fn6CgYF/gIB/foGDgoKEg4SCgn5+fHx6fHt7eXt6d3N2d3h5e3p7eXp/fnt7d3p8fXx8fH59fH19fH19fXx8fX19fX99fXx9e3l7fHx7enp6enp6eHN2dXBwcm93dnJ7hYaEhYOEgoGDgoKCgYGCgYKBgYGAf4B/f399fX9+f4CBgYJ/goF9foF+fn+Bf4B/gIJ/gIB+fH58f3+BgICAf4B/f4B+fX5+f4B/f39/gH9/f4J/gICAgIB/gYGAgISBgoKAf39+f3x9fn56fYV+dHx9enp6enx5eXp6hoV3eXx8fHx8fXx8fHx8fX19fHx9fX19fn19fX16eX18fH16enp6enp5c3V1b29xb3d0c3yFhoOEgoOCgYKBgoKCgYKBgoGBgYCAgICAgH59gH+Af4GCgn+CgX+AgX5/gYB/f4CAgn+Bf319f35/f4KAgICAgIB/gIB+fn1/gH9/gIB/f39/gH+AgICAgH+BgYCBgYGCgYCAf39/fn1/fnuBk416fH18e315e3p6eHmBgXh5e3x8fXx8fHx8fHx9fX18fH18fn1+fn59fHp8fHt8fXt5enp6eXlzdXVvb3Fwd3N0fYWGg4OCg4KAgYCCg4KAgYGCgYKBgYCAgIGAfn6Af4GAgYKCgIKCgICCfoCBgX9/gX+BgIF/fH6Af3+AgoCAgICAf3+AgH9+fX6Afn2AgIB/f3+AgICAgYCAf4CAgYCBgYKCgICAf39/fX5/fIGGiXx8fnt7fnl6e3p7jn53d3l7fHt9fHx8fHt9fH19fX18fXx+fn5/f358enx9e3x9e3l6e3p5eXN0dW5zcXB4cnV6hYaDg4KDgoCAgIKCgX+CgYKBgoGBgYKAgYF/fn9/gYGCgYKBg4OAgYJ/gYGBf4CAgIB/gX99f4F/gICBgICAf4B+gICAf359foB+fn+Af39/gH9/gICBf4CBgH+BgIGBgoKAgICAgIB9foB9gIOCe35+e3x9e3p8fHyHeXh4eXx8fH17fHx9fX18fH19fn19fX5+f3+Af317fH18fHx7enl7e3l5c3J1bnZycHhxdXaFhYOEg4KCgICBgoF/gIKCgoKDgYGDgoCCgYB/gICCgoKBg4KEhICBgX6BgoF/gICAgH+Cf36AgYCCgICAgIB/gH+AgIB/fn2Af39/f4CAgH+AgH+AgYF/gICAgIGAgIGBgYGAgYCAgH9/gH5/fX59fn57fXx9e3x8eHh1eHh5e3x8fXx8fHx8fX5/f39/fn19fn9/gIGAf3x9fHx9e3p7eXp8eHpzcnVud3FxenF2d4WFg4ODg4KBgYKDf3+CgYSDg4SBgYOBgoOBgYCAgIKDgoCCgoSDf4GAfoKDgICBgICAf4CAf4GBgIKAf4CCgH9/gICAgICAf4CAgH+AgICAgIB/f4CBgYCAgICAgYGAgoOCgoCCgYGCgYB/f4B/gId+fnx6fXx7fX94d3Z5eXp8fXx8fXt8fH19fn5/gIGAfn1+gICAgoGAfH59fX58d3t6ent5eXNxdW53cHV6cXZ5hYWCg4KDg4KDhIR/gIOBhoOEg4GChICEg4KCgICCgoSBgYKChIJ/gIB/gYOCgYCBgYCAf4GBgYGAg4F+gIOCf35/goGAgIB+gYCBf4CAgYGBgYCAgIKBgYKBgYCBgYGBgoOCgoOBg4OCgYCBgH+AhH19fXx/fXp9f3p5dnp4eXt7fH19e3x9fX19fn+AgYGAgH+AgICDg4B9f35+fn15eXt6enp5c3J1b3dxd3lzd3uFgoKDgoOEgoOEg4CAgoOGg4ODgoKEgYSDgYKAgIKBhIGCgoGCgX6BgICCgYKBgYOBgIGAgICBgoGEgH6Bg4F/f4CDgoCBfoCCg4KAgYGBg4KDgoGBg4KChIGAgYOBgYKEg4KEhIODhIODgYGBgYCCf4B/fYB8enx/e3t3fHl5eXt6fX59fHx8fH1+foCBgYCAgIGBgYSEgH2Af39/f357e3t6e3p0cHhyeXR2eHR3e4SCg4KDg4SChIODgYKChYaEgoODg4SChIOBg4CBg4KCgoKCgIKAf4GAgIKBgoGCgoKBgIGBgYOCgoOAfoGDgX9/gYSEgYN/goKBg4KCgoGEg4OEgYKEgoOCgoGCgoOBg4SDhISEhISFg4SCgYOCgoOBgYGAgH58fIB8fHh8eXp5enx9f3x7fHx9fX18fICAgICAgYGBgYKBfoGAgICAf3t7e3p6enVweHd5dnV8dXZ8gICDgoODg4OEhISAgoOGhYWDg4KDhIGEhYKCgYKDg4GCgoKAgYB+gYCBgYKDgoKCgoGAgYKCg4KCg4B/gYOBgICChIODgoGCgoGDgoKDg4ODg4SAgoSDhIOBgX+Bg4KDhYKEhISEhISDhISChIOEhIKBgoGBgHt+gX59eXx6enp9fHyBfXp8fH19fHp7fn5+gIB/gYGAgICAgIGBgIB/fX18fX18dnJ2eHh2dH92dX2Hh4OChIWDg4SFhICChYWEhIOCg4SEgISFg4KCgoODgYOCgoCCgH2AgIGCg4KCgoKEgoGCgoOEgoKBgICBgoGAgYOFhIOCg4CCgoOCg4ODg4OEg4CCg4KEg4KCfoOBgoSEgoODhISEhIOEhIOEg4WEg4ODgoKAe4CBf3x8fXp6e32AfX9/fHx6fH59fH19fn5/f39/gICAgH9+foCBgICAfnx9fX5/fn18e3h2f3Z3f4SHg4KDhYODhIaEgYKFhoWEhIODhISBhIWFgoKDg4SCg4KDgoKBfoCAgoKDgoODg4SDgYKCg4OCg4GBgYGDgn+ChISDg4KEf4KEg4ODgoSDg4SCgIOEg4SDg4KCg4KChIOCg4OEhISEhIWEg4OEhYSFhIOBgoB9gYKAfXx8e3x8gH19foB+fn1/fnx8fH19fn5/fn+BgYGBgH99fX6BgYB+fn19fX59fX5+f3+AfH2AgYKCg4OGg4SDhoSBgoiHhYSDg4SEhYGFhYWDg4SDhIODgoOCg4F+gYGDg4SCg4OEhIOCg4KEg4ODgoKDgYOCf4KEg4ODgoOAgoWDg4ODhIODhIOAg4SEhYOCgoODgoGEg4GDg4SDg4SEhYSEhIWFhYWEg4ODf32BhIB9fXx8fHx/gX5+fn9/fX99e3x9fX19fX5+f4CBgIGBgH59fH6Cf39+fn5+fX1/f39/gICAf4CEhIODhIWDhIOFf36CiouFhISDgoOFgYaGhoOEhISEhIODg4OEgn+BgYODhYSFhIWEg4KEhISFhIODgoSDhYKBhISFhYaEgoCDh4SDg4OFhIWFhIGEg4OHgoOCg4GCgYSDgoODhYODhIWEhYWHh4aHhYSEhYSBf4GDf35+fH5+fX+BgH9+fHx/f358enx9fX19fX5+fn9/gIKBf319fIB/gH5+fn5+f3+AgYGBgYKAgYWFhIOEhIKEg4aAgoWFiomEhISEhIWCh4aGhISEhIWEhISEg4SDgYKDg4OEhIaEhYSDg4SEg3yDhHuBhHd5g4F9hH5+cnWDgoF2foOEgH2BdYF5g39/f36EhIKDg4KBg4SDg4SFg4SFhoSFhn2EeXx+f4N7hYOBhIOAf319fn5+gYOBfXt/fX6Afn18fHx9fX19fH19f4B/gYJ/fX18f4GBgICAgH+BgYGCgYKDg4KChoSEhIWEgYOEhYOEhYSKiIWFhYOFhYSGhoaDhIWFhYWEhYWEhIWCgoOEhYWFhoSFhIOEhYWCaICFanx7cXF8gXOGc3R0fYKDdXNxg4ZzcHVyc3SDdnt9dYF/goOBgnZ5hYCDgIR/hYSChYWCaHpyc3N8gHKBg3+Dg32BfX5+fX6Cg4J8f4F9f4B9fXx8fHx9fHx8fn1+gH+BgX99fX2AgYKBgYGBgIGBgYKBgoKCgoSHhIWEhYSBgoSGhoOFg4aIhoaFg4aGhoeGh4OFhYaFg4KFhoSFhYODg4SEhoaGhIaEg4SFhn1xe4FweXZ+g3+CbnlwdXN8dnl5hnOEg3B2eHF2dHR1cnN0dml/gG5yb3R2bnVsd217c26Ah3ltfXJzdnN2bW53bHB5bHV9f399foGAgX2Af32Af4B/fX18fH19fH1+f32Af4CAfnx/foCBgoCBgICAgYCAgIKDgoKEhYiGhoCChYODhIeGg4WFhYaHh4SDhoeIiYaHhIWGiIeEg4WGhYWEhIOFhIKFhoaFhoWEhoWHdnB0e3BydX+HhYNtdW92b3x1coR5eYd4cXR3bndod3pucHWCcoN+b3p5eW1vbnpvb213fXiGcHF6cHJ0ZoF1fm57eXNveX+Af319gYB/e399fIB+gIB+foCAgYB+fn9/foF/gH9+fYB9f4CBgIB+fn+BgH9+goOCgoSFh4eEfoeEg4OFh4aEhoWFhoaIhISGh4iIhoeEhoaLioWEhoeHhYOFhYWEgoWFhYWGhYWGhYZxdXByc29zenl+g3SIdHV+iHZugnKEhnluanJ/cW1zd3x/dXR8hH54cXV3bnl1enF2eHV6eYRyam95eHBreXN6b3p3dnZwgYB/fn5/f356fn18f31/f359gIGDg4CCg4GBhIKBgIGBgH1/f4F+f35+f4GAfn6BgoCAgYSHhoODhoSEhIaHhoWFhYWHhoiFhYaFh4eFhoSGhomIhYSJi4iGhIaFhYWDhYWEhoaGhoaFg3iLeXKIentwcIWFeIV4eWtzfnl7a3KDh4N6fG17enl0fYB2bm+AgG90fHV3cXl9fW1+dW+DhYZ6gHJye3x1cG96bHN8bneCgIF+fn99fXp9e3x9fX9/fn1/f4KCf4GDgYGDgYB/gICAfn9+f31/fn1/gH58fYGAfn6Ag4iFhoOFhYWFhoeFhYWFhYeHiIaEhoWHhoaFhIWFhIWFhomKh4WEhoWGhoWGhoSGhoaGhoWGh4eHhoaEhoWGh4iHhYeGhoOHhoWFg4SFhoWGhIaEg4SEhoSDgYODhISFhIWEhYSGg4aHhYaEhIaHhoSEhYaEhX13hYOEhIKBgX1/fnt8e357fHx9f359fH59gIB9f4F/f4GAfn5+gH5+f35+fX99fX5/fHt8f358fH+BiYaFhIaGhoWGhoWFhYWGhoeIhoSGhYaGhYWDhIWGhYSGhoaGhYSGhIWGhoaGhIeGh4eGhYeIiIiIhoSHhYaGiIaFiIeIhYeGhoiFhYaHhYaGhYOChYWGhYWDhYSEhIWEhYWEhYWDhoaGhoWEhoeGhISFhoOFhIKEg4OFg4OCfYB/e3t8fnt8fH1/fnx8fn2Af31/gH5+gH99fXyAfX5+fn5+f3x8fX57fHx/fHt7fn+Ih4SEiIaGhoeGhYWEhoaGhoiHhIWGh4aFhIODhIaFhIeFhoaFhYaEhYaGh4eFh4aJiIaGiIeIiYiFhYiFhoeGh4aHhoeFh4eGh4WFhoeFh4aGgoOFhoaEhIOEhIOEhoSFhYWFhYOGhoWGhYWGhoWEhIWFg4SHhYOCgoWDhIF+gIB8e31+e3x7fn59fHx+fX5+fX9+fX1+fnx9fH98fn58fYGAfHx8fXx8fH56e3t8foiHgoWIh4eGh4aGhISGhoeGiIaEhYSHhoSFh4OEhYSFh4SFhoaFhoSGhoeHhoaHh4mIhoaIh4iKiIWHiIWHh4WHhoeGh4WIiIeHhYaGh4WGhoSBhISFhoWFhISEg4SFhIaGhoWGhIaFhoaFhYaGhYSDhISDg4eDhIGChISDgYCAgHt7fn18fHx+fXx8fH19fH18fn18fX18fHx8fXx+fXt8gX99fH18fnx8fHp6fHx9iIeChoiHhoeGhoaDhYaFhoaGhYOFhIaFhIiJg4GEg4SGhIaGhoaGhIeHiIiHh4eIioiGh4iHiImIhYiHhYeGhoeHh4WHhoiIh4eFh4eHhYaHhIKEg4SGhYeFhISEhISFhoaGhoWFh4WFh4WGhYeFhIOEg4OEh4GDgIKDg4KCgn+Ae31+fXt8fH59fH19fH57fHx7fHx9fXt7e318e358e3x/fX18fX1/fXx6ent7fHyIh4KGhoaGh4aGhYOFhoWFhYWEg4WChoSDiId/enqChYaEhoaFh4aEh4eIiIiHhoiKh4aHh4eIiYeFiIeGiIeGhoeHhYeGiIiHhoWHhoiGhoeDg4SEg4aGh4WFhISEhYaGhoaGhYaHhoaIhoaEhoWDg4ODgoOGgYN+goKDgIOCf398f35+fHx9f318fX18fXt7e3p7fHx8e3t7fnt7fXt6e358fHx8fX5/fXt6fHp8fImHg4aFhoWGhoWEhIWFhYWFhIOBhYGGhIKEhHyAhn+ChYWGhYWGhYSHh4iIiIaFiIqHhYeGh4eIh4WIhYaHiIaGh4eGh4eIiIeFhoeGh4WFh4OEhoWEhoaHhoWEg4WFhoaGhoaFhoaHhoeHhYOGhYOBg4KAg4WCg36BgYF/g4F/fn5/fX98fH1/fXt9fXx+enl6eXt8fXt7e3t+fHx8fHp7fXx8fHx+fYF8e3t7e3x7iYeEhoSGhIaGhYSFhoWEhIOEgoCDgYWDgYJ/eoSMe4CEhYeGhoaFhIeIh4aHhYWHioeDh4WGhoiGhYeEhoeIhoaIh4eHhoeIhoSGhoaHhYWHg4SFhIaGhoeFhISDhYWGhoeGhoWGhoaFhoaEg4SFgoGCgYCDg4OCfYGBgH6DgX5/f4B8f3x9fX59e359fH15eXp5e319enp7e318fXx8ent9fHx9fH5+gHx7e3x+fXyIh4WGhYeEhoSFhYWFhYODgYOBgIKBhYJ/gH9/fXx7gYSFhoaEhYSDh4eGhoaFhIaJhoKGhIaGhoWFh4WHiImGhYiHiYeGh4eFhIaFhYeFhIeDhIWEiIaGh4WFhIKFhYaFhoaHhIaGhoaFhoODg4WAgIGAgIOBg4B8gYB+foKAfYB/gXx/fH1+fX57fn18fHl6enl6fX15enp7fHt8e3t6e319fH18f35+fHt7fX59fIiGhYaGhoSFhYSFhYSDgoKAgoGAgICDgX5+foB5en2Ag4OFh4WEg4OHhoOEhYSChYiFgoSDg4WFhYWHh4aIiIaFiIeJh4aFhoWDhoSFh4OEhoSEhYSHhoWGhYaEgoWFhoaGhoaEhYaGhYWGgoKDhH9+gICAgYCDgHuBf31+gn5+gH6Afn99fX59f3t/fXt6eXp6eXp8fXl6ent7enx6e3t7fH19fXyAfn18fH1/fnx7h4WFhoaGhoSFhIWDhYKBgICAgYB+f4KCfX1/f3t/f4KDg4WGhYSDg4aDgYOEgoCFh4WCg4GBg4SEhIaGh4iHhYWIhomHhYSEhIKFg4SGgoOFhISGhIeGhYWFhoOEhYSFhoWGhIOEhYWDhYWBgIODf35/gH9/gIN/fIB9fX+CfYCBfn6Bfn5+fX1/e398e3p5enp5enp8eXp6e3t7fHp7e3t7fX59fYB9fXx8fYB/fXyGg4aGhoaGg4SDhoKFgYGAf3+AgH5/gIJ8fn9/foCAgoKChIWDgoGChIGAg4KBgISFhYKBf4CCg4OEhYWHhoWEhoeFh4WGgoOCgoOCgoWBg4WEhYaEhoaHhoaFgoSEg4SGhYWDhIODhIOFhIB/goJ/fX5/fn5/hH57f3x8gIF9gYB9foN9fn59fX57fnt7enl7enl6ent5enp6e3t8ent8e3t+fn1/gXx9fHx9f4B+gIaEhYWEh4SDg4KGgoOAgYB+fn+AfX9/gnx9f39+fn+BgYKEg4KBgYKCf4CBgoCAgoWEgoB/gIGCgYOFhYeFhISGhoOFg4WBgoGBgoGCg4GChISEhYWGh4eGhYSDg4ODhIaFhIGDgoOChIODgH+AgX59fX5+fH6Dfnx+fHyBgH6Cf35/gnx/fn19fHx8e3t6enp6eXt6enp5eXp6e3x5e317fH5/f4GAfX59fX1/gICAhoSEhYSFgoSCgoSCgoCBgH59fn9+fn6AfX2Af35+foGBgoODgoSHgYF+gICBf3+ChIOBf35/gIJ/goWEhYOCg4WFgoSBg4CBgIGBgYKBgIGEg4OGhYWHh4WEhIWCgoKDhYSCgYGBgYCFg4F/foB/fnx9fn18foN9e358fYF/gIN9fYCBf35/fXx8fH17e3p6enl5e3l6enl6ent7e3p7fXx8f3+BgoB+gH+AgH+AgYDKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzNzc3Nzc3Nzc3NzczMzMvLy8vLy8vLy8vLy8vLzMvLy8vLy8vLy8vLy8vMzMzMzM3Nzc7Oz8/Pz9DQ0NHR0dLS0tLS0tLT09PT0tLS0tLS0tPT09TU1NTU09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tLS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1dXV1NTU1NTT09PT09PT09PT09TU09PU1NTU1NTU1NTU09PT09PS0tLS0tPT09TU1NTU1NPT09LS0tLS0tLR0dHR0dPHhnNlYFtLWWdVTUZIQD03Nzg5Nzw8PDo8Oz42Oj04PDs6OTg3ODs7Oj87PTs8PD47P0E/QkJBQ0RFREE+PTw7QENDQUBDQ0FBR0hHSUtSwtXS09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXVysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMy8vLy8vLy8vLy8vLzMzMy8vLy8vLy8vLy8vLzMzMzc3Nzc3Oz8/P0NDQ0NHR0tLS0tLS09PT09PT09PT09PS09PT09TU1NTU1NTU09PT09PT09PT09PT09PT1NTU1NTU1NTT09PT09LS0tLS0tLT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1NTU1NPT09PT09PT09PU1NPT09TU1NTU1NTU1NPT09PS0tLS0tPT09PU1NTU1NTU09PT09PS0tLS0tLR0dHSzIxyZ2BcTVllUktHSz87Mzc4Ozg5Pj05PDpBOjs9Nzs8PDo6Nzg6Oz0/Oz88PTw/Pj9BPUFBPkNDREJAQT46Oz9DREFDRERCQklHSEhJTr7V0tPT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1crKy8vKysrKysrKy8vLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzMzMzMzMy8vLy8vMzMzMzMzMzMzLy8zMzMzLy8vLzMzMzc3Nzc3Ozs/P0NDQ0NDR0dLS0tLS09PT09PT09PU09PT09PT09TU1NXV1dTU1NTT09PU1NPT09PT09PT1NTU1NTU1NTU1NPT09PS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1tbV1dXV1dTU1NTT09PT09PT09PU1NTU09TU1NTU1NTU1NTT09PT0tLS0tLT09PU1NTU1NTU1NTU09PT09PT0tLS0tHR0s+Sd2hfXk9XZ01LRks9ODc2NTk5OTw+OT88RDo7PDc5PD07OTc5Ojw9QDs+PT47PD48PT5BQD5EQ0NDP0E9Ojs9QkNFQ0NEQT9FSEpJSky61dPT09TU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8rKysvLy8vLy8vLy8zLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMzMzMzMzMzMzMzMzMzczMzMzMzMzMzMzMzMzMzc3Nzc3Ozs/Pz9DQ0NDQ0dHS0tPT09PT09PT09TU1NTT1NTU1NTU1NTV1dXU1NTU1NPU1NTU09PT09TU1NTU1dTU1NTV1dTU09PT09LS0tLS0tLS09PT09TU1dXV1dbW1dXV1dXV1tbW1tXV1dXV1NTU1NTT09PT09PT1NTU1NTU1NTU1NTU1NTU09PT09LS0tLT09PU1NTU1dXV1dTU1NTT09PT09PT0tLS0dHRmn5nYWJOVWpKSElLPzw6OTM3Njc3PTs+Oj06Ojo4ODo7Ozg4Ojs7PD46PT09Ojw/PD0/QkA/Q0RDRD5APT08QENEQ0JEQkQ+REhJSUtMttfT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3MzMzMzMzMzMzMzMzNzc3NzczMzMzMzMzMzMzMzc3Nzc3Ozs7Pz8/Q0NDQ0NHS0tLT09PT09PT1NTU1NTU1NTU1NTU1NTV1dXV1NTU1NPT1NTU1NTU1NTU1NTU1dXV1NXV1dXV1NTU09PT09PS0tLT09PT09PU1NXV1dbW1tXV1dbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1NTU1NTU1NXU1NTU1NTT09PT09PT09PU1NTU1dXV1dXV1dTU1NTU09PT09PS0tLR0p+DaV9kU1hsSEhIS0A9Nzg0NzY6Oj87RDw8Ojw8OTg6OTo6Ojs8Ojo7OT49Pjk9QDs/QUFCP0JCQUM9Pz8+PEBCRUNDQkBBO0ZJR01MSbLY09TU1NTU1NXV1dXV1dXV1dXW1tbW1tbV1dXW1svLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzM3Nzc3Nzc3Nzc3Ozc3NzczMzMzMzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc3Mzc3Nzs7Ozs7Pz8/P0NDQ0NHS0tLS09PT09PT09TU1NTU1NTU1NTU1NTV1NXV1dTU1NTU1NTU1NTU1NTV1NTU1dXV1dXV1dXV1dTU1NTU1NPT09PT09PT09PU1NXV1dbW1tbW1tbW1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTV1NTU1NXV1dXU1NTU1NTT09PT09PT1NTU1dXV1dXV1dXU1NTU1NTT09PT09LS0tSjiGxfZlJWakdIR0lBPjM2Njo7PDhDPEJBPjxBPDg5Ojw6Ojw8PDk8PTo7PD09PD89QD9AQT9AQUBCPD4+PzxCQ0NDRkBBQT1ISklOTUeu2NPU1NTV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbMzMvLy8vLy8vLy8vLy8vLy8vMzMzNzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzs7Ozs7Oz8/P0NDQ0NHR0dLS0tPT09PT09TU1NTU1NTU1NTU1NTU1NTV1dXV1dXU1NXV1NTU1NTV1dXV1dXV1dTU1dXV1dXU1NTU1NTT0tPT09TU1NTU1NTV1dbW1tbW1tbW1tbW1tbX19bW1tXV1dXV1dXV1dXV1dTU1NTU1dXV1dXV1dXU1NTU1NTU09PT09PT1NTU1NXV1dXV1dXV1dXV1NTU1NPT09PT0tLWroprY2VSWGhMSkdJQjg0OTQ6Ozo5QDk+Q0U/PDw5OTk9Oj07PDw6PTw7OTw9Ozs/PUA9PT5AQD9CQT5APD05QERDQkFBQj48SEpLTU5IqNnU1NXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbWzMzR09PT09PT09PT09PT087Ky8vLzMzMzMzMzMzMzM3Nzc3Nzc7Ozs3Nzc3Nzc/Pz8/Pz8/Pz8/Pz9DQ0dHR0dHR0dHR0dHS0tHV2djY2NnZ2dra2tvb29vZ2dnZ2dna2tra2tra2tjW19fX19fX19jX19fX19XV1dTU1NTV1dXV1dXV1djY19fX19jX19fX19fW09LS09PU1NPT09PU1NXV1dXV1dXV1dXV1dXW1tbX1tbW1tbV1dXV1dXV1dXV1dTU1dXV1dXV1dXU1NTU1NTU1NTU09PU1NTU1NXV1dXW1dXV1dXV1dTU1NTT09PT09PS1bqKa2hoUlhlSUlMT0A5OTo0O0E8Nz05QUM+QD89ODo6Ozk9Oz4/Ojs8PDo7PDo7Pj1APT8/P0FAQUE/QTw8Oz5BRENBREA9PElJSk1ORqPa09TV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbW1szNhG1wcHBwcHBwcHBwcGqn493d3t7e3t7e3t7e3t3S0NDQ0NDQ0NDQ0NDQ0ci5ubm5ubm5ubm5ubq6t6WkpKSkpKSkpKSkpKSnhmBjY2NjY2NjY2NkZGRlhIuKioqKioqKioqKioemuri4uLi4uLi4uLi4uLrR09PT09PT09PT1NTU1ce3ubm4uLi4uLi4uLi3vdPS0tPT0tLS0tLS09PT2+Lh4uLi4uLi4uLj4+Pi2NfX1tbW1tbW1tbV1dXV1dXV1dXV1dbW1dXV1dXV1dTU1NTU1NTU1NTV1dXV1dXW1dXV1dXV1dXV1NTU1NTT09PT09XDkXFrak5TYkxMVk48Ojo3Nz5DPjg+Oj8/QT0+QDc7Ojs7PTs+Pjo7PD48Oz07PT8+QDw/Pz1AQEBBPj88PjxAQUVCQkZAQD9HSEpLT0ae2tXV1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19fMzk4mKysrKysrKysrKysiivTr6+rq6urq6urq6uvp1dLS0tLS0tLS0tLS0tTEqaqqqqqqqqqqqqqqq6aGhIWFhYWFhYWFhYWFik4MEhISEhISEhISEhIRE0pUU1NTU1NTU1NTU1NPg6ejo6Ojo6Ojo6Ojo6Knz9PS0tLS0tLS0tLS0tS9oKOjo6Ojo6Ojo6OjoavS0tLT0tLS0tLS0tLS0N/r6+vr6+vr6+vr6+vr6dnX19fX1tbW1tbW1tbW1dXV1dXV1dbW1tbV1dXV1dXV1dXV1dTU1NTV1dXV1dXW1tXV1dXV1dXV1dXU1NTU1NTU1NPUy5h2bGlKTl9NUlVNPjw8Nzs/Qz42Ojc+Pzs9Qj85PDk9Ozw6PD07PTs9Ozs9PD0+PT07QT08QUBBQT08Pzw7QEJDQURFPUFAQ0ZLS09GmNzV1dXV1dbW1tbW1tbW1tbW1tfX19fX19fX19fXzc5SKzExMTExMTExMTExJ43z6enp6enp6enq6unq6dXS0tLS0tLS0tLS0tLUxaqrq6urq6urq6urq6yoiIeHh4eHh4eHh4eHh41SEhgYGBgYGBgYGBgYFxpOWVdXV1dXV1dXV1dXU4WopKSkpKSkpKSkpKSjqM/T0tLS0tLS0tLS0tLVvqKlpaSkpKSkpKSkpKOt0tLS0tLS0tLS0tLT0tDf6+rq6urq6urq6urq6unZ19jX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dXV1dXV1dXU1NTU1NTU1NGcenFpSlRdT1JVTkQ+Pzs/QEA4Ojs4PDs8PD86Ozs4Ozk5Ozw7Ojw5Ozs8Ozo9PT0+PUE/Pj8/Pj08PT88PEFBQ0FERTw+QEVGSktNRpPc1dXV1tbW1tbW1tbW1tbW1tfX19fX19fX19fX183PXDk9PT09PT09PT09PTWT8Ofn5+fn5+fn5+fn5+bV0dLS0tLS0tLS0tLS08Wtrq6urq6urq6urq6vq46NjY2NjY2NjY2NjY2SXSInJycnJycoKCgoKCcpWmNiYWJhYmJiYmJiYl6MrKmpqampqampqampqazP09LS0tLS0tLT09PT1cCmqKipqampqampqamosNLS0tLS0tLS0tLS09PR3+rp6enp6enp6enp6enn2djY2NjY19fX19fX19fX19fX19bW1tfX19fW1tbW1tbV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbV1dXV1dXU1NTU1NTWo3txZElbYE5OVU9AQT89REI+Oz06OTs6PT07PDs6OTg5OTs8Ozw8Ojo7PDo7QD08PTxAQTxBQTs7PEA/PD1CP0RDQ0U8PkJERkpMTEWN3NXV1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjNzcXCw8PDw8PDw8PDw8PCydDPz8/Pz8/Pz9DQ0NDQz87Ozs7Ozs7Ozs7Oz87NzMzMzMzMzMzMzMzMzMvJycrKysrKysrKysrKysfCw8PExMTExcXFxsbGxsvMy8zLzMzNzMzMzMzLz9HR0tLS0tLS0tLS0tLS1NXV1dXV1dXV1NPT09TT0tLS0tLS0tLS0tLS0tPU1dbW1tbW1tbW1tbW1tjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NfX19fX19fX1tfX19fX19bW1tbW1tbW1tXV1dXV1dXV1dbV1dbW1tbW1tbW1tXV1dXV1dTU1NTU169/cF5GXmJQUVdOR0ZDQ0lBPz07PDo8OEBCPD04Ojo4OTg7Pzs8PDs7PDw8PD87PD46Pj44PkI8Pj1BPjw+QkBERUNAPD5APkNJSUtEh9zV1tbW1tbW1tbW1tbX19fX19fX19jY2NjY2NjYzs3P0NDPz8/Pz8/P0NTQ0M7MzczP09LSzs3P0s7Ozs7Ozs7O09TQz8/T08/Pz9PSz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0NDR0dHR0dHS09PU1NTU1dXV1tbW1tfW1tbX1tfX19fX19fX19bW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dTU1NTU1NbW1tbW1tbW1tbW19fW1tbW1tbX19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjX19fX19jY19fX1tbW1tbW1tbW1tbW1tbW1dbW1dbW1tbW1tbW1tbW1tXV1dXV1NTV1di4gm9XSl9jUlFaS0hBQTxCPT07Oj4+PD4/PT0/Nzk6OTk3OD48PD47Ozw7PDs/PT0+OTs7OT0+P0A+QD07OkI/QkNCPz0+QD5CRUdKQoDc1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2M7Ozs7Ozs7Nzc3Nzsqfys3Nzc3QuYOEi8fTwJrLz87Ozs7O0KaSxdLQoZbL08eSq9HOzs7Ozs7Ozs7Ozs7Oz8/Pz8/P0NDQ0NDQ0NDR0dHR0tLT09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbV1dXV1dbW1tbV1dXV1dXV1NTU1NXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NfX19fX1tbW1tbW1tbW1tbW1tXV1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXYwIBuVU9gY1dZW0xMQ0A9PTs9Ojw+Qj5CQ0A9Ojg5ODo6Ojc7Pz4/PDw7PDo5Pzw8PTg5PD9BPj09PUFAPTtBQkBCQz47QD9BQUlHSkF629bW1tbW1tbX19fX19fX19jY2NjY2NnZ2djY2dnOzs7Ozs7Ozs7OzdKpj63Rzs7Ozpu3tqSiwJOerNPOzs7O0qqdrJTOqKCrn8+ZrJqy0s7Ozs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0dHS0tLT09TU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dbW1tbW1tXV1dXV1dXU1dXV1dXV1dXW1tbW1tbW1tbW1tfX19fX19jX19fY2NjY2NjY2djY2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2dnY2NjZ2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV18h/b1pTYWVeXVxPSkQ9QD8+Ozc6Pjk/RD9BOTg3ODk7Ozw4OT89PTw9PD47OkE7OTs5OzxDQDw7PT5AQT49QkQ/QkM9PT8+Pz5ISUg/ddrW1tbX19fX19fX19fX2NjY2NjZ2dnZ2dnZ2dnZzs7Ozs7Ozs7Ozs/Inrym0tDQzsqgl36Cw6abr6fUz8/P0MmXmYWmpJ+WkKG0lYadnM7Pzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dLS0tPT09TU1dXV1dXV1dXV1dXV1dbV1dXV1dXV1tbW1tbW1tbV1dXV1dXW1tbV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2djY2NjY2NnZ2dnZ2dnY2NjY2NfX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dbV1dXV1dfNiHNdWGloXl9gT0lGOkFAPj88PTo2P0JAQjo2NDc6Ozo8Ojk+PD49PTs/PTxBPjw8Ojw8PTw6PEA9QEI+PkFCPUNDPT0+Oz9BRUtIQHDZ1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2c/Pz8/Pz87Ozs7SrKWnqdXAvNLHnY+ey9PJipmq1M/Pz8/RpLC9moqdoKeZtL/Jl5nG0M/Pz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0dHS0tLS09PT1NTU1dXV1dXV1dbW1tbW1dbW1tbW1tbV1tbW1tbW1tbW1dXV1dXV1dXW1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnY2NjY19fX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0JB1W1tqaWFeXVNOSTxDQEE+QD46OEZBP0M6NzQ5Ojo5Ozs4Oz0/Pj49QT08P0A9Pjw8PDw8Oj1AQD8/PT5CQD9AQkA8QD0+QUVLRz9r19fX19fX19fX2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnPz8/Pz8/Pz8/QzJ2Nl6zQmpfKxZ6ynpbN1q2ZqtTPz8/Pz9DVuZmdpZ6MoMTSkpmgztDQ0M/Pz8/Pz8/Pz8/Pz8/P0NDQ0dHS0tLT09PT1NTU1NXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX19fX19fY19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tKUcl5ea2tqZV1PTEc/RENDQDo9OzxCPD49OTY0Ojk5Ojo5Nzs/QDs8PUA8PEE+PD07PTw/PDo8Q0A+PTs9QD5CPkBBPkA9QD9GSUQ/ZtXX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2traz8/Pz8/Pz8/P07GigJuvyaCjv8qcpYynrdiqmarUz8/Pz8/Q0ZqdvZvFyZTZraO/ntXQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1NXV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dbW1tXW1tbW1tbV1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbSk3BgXnBoZmVaUUhHQkVDQEA3Ojo8Pjo8OTc2NTk6Njo8Ozc8QEA8Ojo9Ojw/Pj08OUA8PDo6OT9APj08PUBBQz9APz5BOz9ARkpCP2LS2NfX2NjY2NjY2NjY2dnZ2dnZ2tra29vb29vb28/Pz8/Pz8/P0M6fkGyclteqo9PSrqa1mJ/Vqpmq1M/Q0NDQ1aekosadk5aju82IlZ7I0tHR0NDQ0dHQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1dXV1dbW1tbX19bW1tbW1tbW1tbX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfW1tfX19jY2NfX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX1tbW1tbW1tbW1tbW1tbX19fX19fW1tbW1tbX0pNuYFxxZGdkWlVKQENGQ0FCODs/PD07PDw4NTU4OTY4Ozo5PDo+Pzw9PTk8Pz49Ojo+OTw6Ojg+Pzw9PTw+QEFDQT48PDpCRERKRkJd0NnX19jY2NjY2NjY2dnZ2dna2trb29vb29vb29vPz8/Pz8/Pz9G9n8O31pfA09HQ0srSzZeb1KqZq9XRz9DQ0sCdos2ym66znaXQ26OZtdXR0dHR0dHR0dHR0NDR0dHR0dHR0tLT09PU1NTV1dXV1tbW1tfX19fX19bW1tbW1tfX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19fY2NjY2NjY2NjY2NjY2djZ2dnZ2dnZ2dnZ2dnZ2drZ2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fX19fX19fW1tfX1tbX19fX19fX19fX19bW19GRbF1cb2doYl1PRkBISUdFQDw8Pj48PT48NzU2Ojk2OTs6Ojs4QD86PDw5PD49Ozs6Pzk/Ojs5PT49Pjw7PTxAQ0I/Pz47Q0ZGR0hEWc3a2NjY2NjZ2dnZ2dnZ2dna2trb29vb29vb29vb0NDQz8/Pz8/Pz5V+e6WS1KKa08ySl6ObodirmavV0pem09SkoI+7rJ+aoZyckaeYnrvV0dHR0dHR0dHR0dHR0dHR0tLS0tLS09PU1NTV1dXV1tbW19fX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tbX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2tnZ2dnZ2dnZ2djY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX1tfPjGRWXnBrXGBgTkVITUlJT0M+OkI9PUBCOzU1Nzw6Nzo7Ojo7OT09OTo6OT0+Pz07OT47PDo8Ozk+PD47PD0+QENCPz5BPEFDR0ZGRVXJ29jY2NnZ2dnZ2dnZ2dra2tvb29vb29zc3Nzc3NDQ0NDQ0M/Pz9DR1aeZrcmjqL7KnbGdo7XZqZup2LirocjGpr2Vk5ihqZ+inqiiqZ3Q09LS0tLS0tLS0tLR0dHS0tLT0tPT09PU1NTV1dbW1tbX19fX19fX19fX19fX19fX19fX19bW1tbW1tfX19fX19fW1tbW1tbW1tbX19fW1tbW1tbW1tbX19fX2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2djY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fX19fX19fX19fY2NfX19fX19fYzYZdV2JvZE9dVEtIRlNRS0xBPj1EPD9DRj01NTc7OTY6Ozo8PTo7Pzo6OTg6PT0/Pjs/Oz49Ojs5Pjs9PD0+QURCQD8+PzxAQUVHRURSxdvY2dnZ2dnZ2dnZ2tra2tvb29vb3Nzc3Nzc3NzQ0NDQ0NDQ0NDQ0NO5gL3Tm5bP1LWLkZ/T1LyBu9TOlKDUyo6Tl5Cqs42QpdSako6+1tLS0tLS0tLS0tLS0tLS0tLT09PT09PU1NXV1dbW1tfX19fX19fY2NjY19fX19fX19fX19fX19fW1tbX19fX19fW1tbW1tbW1tbW19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2tnZ2tra2tra2tra29ra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2NfX2ct+WlVqaltMX01KTEpVTEZCPD0/R0ZHS0g9NjU3Ojk3OTo7Ojw9OT45OTo4Oz0+PkE+PTk8PDo9Pj46PTk5Oj9FQUA+PT8/QkBHRURFUMHc2dnZ2dnZ2dna2trb29vb29vb3Nzc3Nzc3dzc0NDQ0NDQ0NDQ0NDQ0cHR0crI0tDUxLjS0tHSwtLQ08fM0tTCr7Cz0dbAvdbU07nI1dLS0tLS09PT09PT09LS0tPT09PU1NTU1NXV1dbW1tfX19fX19fX2NjY2NjX19fX2NfX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29va2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2djY2NjX19fX19fY2NjY2NjY2NjY2NjY19rHd1xSZ2laTlpOTFBRV0VKPz89P0FFTExBPjc3NTs4ODk5Ojs8Pjw+ODo6OTs+P0A9Pj46NTo6Oz0/Ojs5Ojw+QkJAPz8/P0FCR0RDRE683dnZ2dnZ2dna2tvb29vb29vb3Nzc3Nzc3d3d3dDR0dDQ0NDQ0NDQ0NDS0NDR0dDQ0dPU0dHR0dPR0dHS0tHR1NbW1tLS1NXT09PW1NLS0tPT09PT09PT09PT09PT09PU1NTU1dXV1dbW1tfX19fX2NjY2NjY2NjY2NfX19jY19fX19fX19fX19fX19fX19fX1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tvb2tra2tra2trZ2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2trZ2tra29ra2trZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjbwXNYVWlrU0xSTlBSWVRGSTw+Qz9BQkVLPj43ODY5Njc4OTk7Oz0/QDw9ODk7Ozs/Pjw8OTU6PT47OTk7PD8/P0JCQT1BPUBBQkZCQkJLtd7Z2dra2tra2tvb29vb29vc3Nzc3Nzd3d3d3d3R0dHR0dHR0dHR0dDQ0NDQ0NDQ0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tPT09PT09PT09PT09PT09TU1NPT1NTU1NTU1NXV1dXV1dXW1tbX19fX2NjY2NjY2NjY2NjY19fY2NjX19fX19fX19fX19fX19fX19fX19fW1tbX19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2NjY2NjY3LxvVFRsbExLUkpUUlVLRkQ6PkdEREFERjw/ODk6OTY5OTo3PD07PkA9PTc5Ojs5Pjs5OTY2Oj1AQT47PDk6Pj9DQT4/Qj0+QkNFQkFCSrDe2dra2tvb29vb29vb29vc3Nzc3Nzd3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0tLS0tLS0tLS0tLS0tLS0tPT09PT09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1tbW1tbW19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19fW1tbW1tfW19fX19jY2NjY2NjZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2dnZ2dnY2Ny2a1NbcGtLVVdSXFFXSEQ+PEJKRT1ISj89PDc4ODo1OTg5Njs+PD1APDw1OTk8Oj87OTk0ODw9PUFBPD47Ojw+QD89PkE9PUNGR0I/Qkmq39ra29vb29vb29vb3Nzc3Nzc3N3d3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHS0M/U0M7P0tLT0tLS0tLS0tLS0tPT09TU1NTU1NPU1NTU1NTU1NTU1NTU1NTV1dXV1dXV1dbW1tbW19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19jY2NfX19fX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dndsGRTYXJfT1pUV19RUkdCPUVJTEFBTEQ/Pzs5ODg5Mzg2ODY5Pj0+Pz06Njo7Pjs9PTo5Njg6PTtAQDxAPz0/P0I+PD48PEJFSElCPkNJpODa29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3t7S0tLS0tLS0tLS0dHR0dHR0dPT0bm7zLqbnLrQyNPT0tLS09PT09PT09PU1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2NjZ2dra2tra2tra2tra2tra2tra2tra2tra29va2tra29va2tvb2tra2tra2tra2tra2trb29vb29va2tra2tra2tra2tra2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ3qpfVWBuW1VZUVpeT0xHQ0ZNSUZEREo7QUE7PDg4NjQ4Njk4Nzw/QT89Ojc8Pz48Pz87OjY4OD09QEE9QD5BQD1AOjs6Pj1BRUdKQkBDR57h29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e0tLS0tLS0tLS0tLS0tLS0tO+wMqaoKKViJGeqpOpz9TT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fY2NjY2NnZ2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dna2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2tvb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2d6iXFVeblheXU5aUFROQ0NMSUlJRkpEPEJBPDs4NzY3OTc3OTk9P0E/PDo5QD88PkI/Ojg3NzY9Pz9APUBBPz88PTs7OD48P0VJSEE/Q0aX4dvb29zc3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3tPT09PS0tLS0tLS0tLS0tTIlZyum5m1iX2TjIKBhMTV09PT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tvb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dndmlpYYW5ZYVdPV01QRUJETElNS0ZJRT5CRDk4ODY3OTc1Njk4PT1BPjo4OT4+PD9APzw1Njc2PD4/PjtAQEA/Pj4/Pjs/PkFCRkdCQENIkeLb29zc3Nzc3d3d3d3d3d3d3d7e3t7e3t7f39/U09PT09PT09PT09LS0tLTz6h+kayPko6MhoCIiYSQo8rU09PT09PU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY19jY2NjY2NjY2NjY2NjX19fX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2tra29vb29ra2tra2tra2tna3JJaWWNuWlpSVV5QTDxAR05IUklIRT47SEY4OTc1Nzg3NTg5ODs+Pj07ODlBPj1AP0E+NzU5Njs+QUI/P0BAQUI/Pj8+QUBEQUZIQj9FSozi3Nzc3Nzc3d3d3d3d3d3e3t7e3t7f39/f39/f1NTU09PT09PT09PT09PWtaWaiIuQhYCFi4iBg4qLf4bC1tTU1NTU1NTV1dXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2dnZ2dna2dra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29ra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb2tra29uIWltnalxYTFpfVkg6TEhMSkpDRUVDQExINzo3Njc4ODU4Nzg5PDw7Ozk4QD89Pj8/PDY3PDQ3P0JCQUBAPz8/QT09P0A+QEBGRT09REuI4tzc3Nzd3d3d3d7e3t7e3t7e3t/f39/f39/f39TU1NTU1NPT09PT09PUxZKCg4WGfYGCfXx5foGCg36k29bU1NTU1NTV1dXV1dXV1tbV1tbW1tbW1tfX19fX19fX19fX19fX19jY2NjY2NjZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vc3Nzc3Nvb29vb29vb29vb29vb2tra2tra29vb29zb29zb29vb29vb29vb29vb29vb29va2tvb29vb29vb29vb29vb29vb2tvZgFpebWhaU0ldW1hKRE1ISlNMR0ZBQD9KQjg7NjY5OTc1ODY4Ozo7Ojw5OD09O0A9Ozo2NTw3Oz1CQEFBPD49QEE9PEA/Pz5CREU+PERLg+Lc3d3d3d3d3t7e3t7e3t7f39/f39/f39/f39/V1dTU1NTU1NPT09PT2LKEkKh9g3l2hIh/e3d5gn5+i67A1dTU1NXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dna2trZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2tra2tra2trb2tra2tvb29vb29vb29vc3Nzc3Nzc29vb29vb29vb29vb29va2trb29vb29zc3Nzc3Nvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc1nlcWmxmWFJPYFFSQUhHSkZYTEZAQENDSz87Ozc4ODc2NTc2ODo5PDw6PTs/PTs9Pjw7ODg8OT0/QkFCQzw8P0FCPj1BQkNCREVDQDtDTH3h3d3d3d3e3t7e3t7e39/f39/f39/f39/g4ODg1dXV1NXU1NTU1NPU0ruen3WKeXuIgICChYGDcnOAhYOMrNfV1NXV1dXW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NnZ2dna2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra29vb29ra2trb3Nzc3Nzc29zc3Nzc3Nzc3Nzb29vb29vb29vb29rb29vb29vb29zc3Nzc3Nzc3Nvb29zc3Nzc3Nvb29vb29vb29vb29vc3Nzc3Nzc3Nvb29vb3dByXV9wZVdLUGNPS0JHQ0pIS0ZBPEE9SFBBOjo3Nzg3Njc4Nzw6OD09PD47QD88Pz07Ojs5Ojk8QEJAQkNAPUFAPz1AQkNDQUBAP0A7RU144N3d3d7e3t/f39/f39/f39/f3+Dg4ODg4ODg4NXV1dXV1dXV1NXU18h4i4V8goh6g4SBfoKCc2l0hYuGkJ3U1tXU1dbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tvb2tvb3Nzc3Nzc3Nvc3Nzc3Nzc3Nzc29zb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb297KalxjcWVST1heSz9HTElPS0VAPkFCP0lPPjk6NzY7NzY6Ozc7Ojg6PDw+Oz09Oz48Ojs4OTo4OUFCQkFAQDtAQj06PkFCQz8+PT4/PUZOdN/e3t7e3t7f39/f39/f4ODg4ODg4ODg4ODg4OHV1dXV1dXV1dXV1s6dhpl+f5OTin+CgXx9gnNxm4mAgoOJwNnat7TQ19bW1tbX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tra2tra2tra2tra29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NvfwGNaW21gVlBTU0pETEhNSEk8PkFEQ0ZORDw8OTc5OjY4Ozk3PDk4OTw9OzlAPjpBPzw3NTc7ODpAQUVBPz45PUI/Oz1CQkI6Pj07PT5GTnHe3t7e3t/f39/f39/g4ODg4ODg4ODg4OHh4eHh1tbW1tbW1tbV1tjLioCHhYOXjHh7e3lvfYF1a3ebdHZ7eInHxpiMrdjZ19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2drZ2dna2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tra29vb3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29zb29vb3Nzc3Nzc3Nzd3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3Nzc3Nzc4LdjV1lrYlJNVVFMSktGS0ZDQD5CQT9FTT4+PTg5OTo3OTo3NT03Nzo+PDs7Qjw5Pz05NjY4PTk6QEJGQD49PEBCREA9QD9DO0A9PD4/Rk9t3N/e3t/f3+Dg4ODg4ODg4ODg4OHh4eHh4eHh4dbW1tbW1tbW1tfVrYZ6d32rn3l4entzdH+Dfm9xe3l6c3t2k4qFgImkzdnY19fX2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tna2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29vb29vc3Nzc3N3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vc3Nzb3Nzc3Nzc3N3d3d3d3d3d3dzc3Nzc3Nzd3d3c3Nzc3Nzc3N3d3d3d3d3d3d3d3dzc3OGtYVtebGJSTVZMTUdLS0RGQkI7QT08RUxDQT44Ojk6Nzc5NjY6NTs+QDs9Oz89PD89Ojk5Ojw5PEVDRkA/PkBDQkQ9OT0/QT1CPz1APkdPadvf3t/f3+Dg4ODg4ODh4eHh4eHh4eHh4eHi4uLW1tbW1tbW1tfQmH+Qh4N9eoN2e3Vzenl6kKqmd3JyfoeHh4CAfoKEhJHJzNnX19jY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra29va2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2djY2NnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vb3Nzc3N3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzb29vb3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3dzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3NzhpV9UYm1iUE9TSUhHRkpJSUJBPkJCPEVFREA+ODo4Ozc3Ojc4ODY+Pz07PDk9PDo+PTs6Njc7NjpEQUY+Pz8/PkNBPzs9PT47REM/PjxIT2fZ4N/f3+Dg4ODg4eHh4eHh4eHh4eLi4uLi4uLi1tbW1tbW19jYyH52doN+fnR2eIaCenl1d5yhu6GEgoCAfoeKinx/gYaMnKjO2NjY2NjY2NjY2djY2NjZ2djY2NjY2dnZ2dra2tra2trb29rb29rb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3d3d3d3c35pbT2drXFBRUElDT0pLR0xHSkJAP0FHREBBPDg8ODg1ODk3Njc3QEA/Ozw5Pj04PTw8Ojc4PTk/RENGPkE/QkBDPzw6Pj0/PkVEPz07S1Fj1+Hf4ODg4ODh4eHh4eHh4uLi4uLi4uLi4uLj49bW1tbW19XB3LRueHJze3B6eXaFiIR7eH2AgZiljH98fnuRhZaLhoGDgY6Rvd3Z2NjY2NjZ2dnZ2dnZ2dnZ2dnY2dnZ2dna2tra2trb29va2tva2tra2trb29ra2tra2tnZ2dnZ2dnZ2dnZ2dna2trZ2dnZ2dra2tra2tnZ2dnZ2dna2tra2tra2tra2tra2tra2trb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t3d3d6NWFdobllQUUtISlNJTUhNSUtBQz9DRkJBRDo6PDg2NDg4NzY2Nj8+Pjo8OTw7Oj09PDw4Ozw8RERERT4/PkI+Qj84PT8/Q0NCQEE+O0xUY9Xh3+Dg4OHh4eHh4eLi4uLi4uLi4uLi4uPj4+PW1tbW1teslLZ6eHJvd5V7dHuLgHh1bn6Fg3t/hYhyfH2bnI6JioJ+g32Hk5rH1NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2trb29vb29vb29vb2tra2tra2tra2tra2tnZ2dnZ2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2trb2tra2tra2tra2trb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d7Zf1lgaGxcUUtHR09LTk5PTURGQkg/Q0hEREA6Ozs4NzU3Nzc4NThAPkA7PDk8Ozw+Ojk7OTk7OUZERUI8QD4/PEBDOz5AP0A/Qj8+OjtKVWPV4eDg4eHh4eHi4uLi4uLi4uLi4uPj4+Pj4+Pj1tbX19vKhYR3cXJubniVhHt4hH95dnB4c3eLkY6CdnN9ioaId3d1d4ODfIiIk8Pb2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2trb2tvb29vb29vb29vb29rb2tra2tra2tra2tra2tnZ2dnZ2dna2tra2tra2tra2trb2tra2tra2tra2tra2trb29vb29ra2trb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f0nVZaGlqVk5KSE1OR01EUElGSD9FPUZMREM+Ozs8OTc3OTY2OTU4Pj4/PTs8QDs9PDo3Ozc5OThHREVCPUE9Qj8+QDw/QUE/QEJAPjs8S1Ri1OLg4eHh4eLi4uLi4uLi4+Pj4+Pj4+Pj4+Pj49fX19fEknuJf29sbnV2foSBg4qGfnVybWVtiIaKjoR7c4OHint4e4OPj4GEioqxztrZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29zc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tvb2tvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3dzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f3t7e4clsW2pqalNOR0hOT0VIRk1JSUA7RD5ISUA9PDo6Ojg2ODo3Nzk0OD08PT07ODw8PDw4Njc4OTo6RUJFQT9APEI/Q0M+PkNEQUBAP0A8PUtRYdPj4OHh4uLi4uLi4uPj4+Pj4+Pj4+Pj4+Pj5OTX19fZqXaFfnx3bHB3eXh8jH2KhYB3anN0d3p9bot7fnl6foR/gIGDfnh8foeGlrbT2tnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra29ra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/e3uO9amFpa2lRTkZNTEtKWE1OR0FAQE9BQz9AOzw4OTk5Njg2NjY4NDs+PD07OTY6Ojk6OTU4OTg5OkJERj8+Pj5AQEBCPzxBQD88Pj9BOT5KT17S4+Hh4eLi4uLi4+Pj4+Pj4+Pj4+Pj4+Tk5OTk19fX2sqKhIB5c29tcXN1d4CUeHaAfHWHhXd1cnWgmXp7d3Z5doR0bWxue3iAmouTu9za2tra2tra2trb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc29vb29vb2tra2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f397js2lpbmloUFBPTExPUk9LU0Y/RURERD48PDg7ODc5OTU2ODY2NzM6Pjs+PTc6Pjk5OTk2Ojo4NzxDRUc/Pzs/PkA9PkE9Oz0+OUFAQDhBTlFc0OTh4eLi4uLj4+Pj4+Pj4+Pj4+Pk5OTk5OTk5NjY2NjauY6AenZ1bmpveHCBfWt0cnZ3hIV5h4d5lY55eXp1d3pza298gHx2fYh8gLLe2tra2tvb29vb29vb29vc3Nzc3Nzc3Nzc3dzc3Nzc3Nzc3Nzb29vb29rb29vb29ra2tra2tra2tra29va29vb29vb29vb29zc3Nzb29vb29vb29vb29vc3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3t7e3t7e3d7e3t3d3t7e3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/f39/f4qpqa2hrZFNQT0ZQVFJOSFJLPkREQ0I7Ozk6Ojg2Nzg1NjY4ODg0Oz88Pzw5PDw3Ozo6Nzo6Nzo9Q0JDPUE+Pzw5PT5BQDs8PDtFQD47Q05TXNDk4eLi4uLj4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTY2NjZ1p5vdntveHh2cG50d3BwdHBzb36Jc3qGhY2EenNtcoB6hn1vg5OBdnx9g4a13drb29vc29vc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29ra2tra2tvb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4N/f3+KgbWhma2ZVVlJHUFFOS0xMRUJIRUc9OD08Ojo3Nzg2Nzc2NTY3NDg+PD09Ojg6OD46Ozc4Nzc6Oj5DRDtDQj49OD1AQUM/Pjw+RTw+PUJNUF/S4+Hi4uLj4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk2NjY3MB2doCCfnp4eHBsdXlya399bHNvdGdoaYB/aWl4c2d+iYl4cIKGe3d9foWKvd3b3Nzc3Nzc3Nzc3Nzc3Nzc3d3c3Nzc3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODflGttZm5mU1NJUFlUTEhGTkZGRUJGPTs+PDs5Nzc4NTc5NjQ1NzU4PDs9Pjo6OztAOTs7ODc6OTlAQkE8QUE/Pzk/QEJFQ0FAQEM7Oz1ES01g1uTi4uLi4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk5NnZ2tmYc3uqhJaCcnR1dn14aGx8d2h4d25rcHR5gIJ3dHyBhIJ9c3CAin94gn95g8je3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f4N/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh24tubWdzY1lRTVVbV0hDSUZOS0dCRD8/Qjo7OjY2NzU2NzY0ODc2Ozw7Pj86PDk8Qjg3OTo6Ojk6QUFCQUJDQEE+PT9CQ0NEQUJGOTg9REpOYtjk4uLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXZ2drcqHGCtXiRfnNsem6EgXaCfWtoan+DeHZ8dX2FhXRmcHl9d316gIqFe318foC03tzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3dzc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3Nzd3d3d3d3d3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e397e3t7e39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4ODg4ODg4tiFb3FrdWFWT1VVXE9ETUY+SkdKRUQ8P0I6PDk4Njg0NTY3NDc2NDk7Ozw7OD47PEE4ODo9OD04Oj09QEBAP0FCP0A+QENCQ0FBRTc2O0RMTmPa5OLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXl29ra3Z5sbnNxhY1ybXBuf391hH5rcnZ2enN4gXhzb3VwbWt2fHmFiIB/f392coODsd/c3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eDg4eHh4eHh4eHh4OLXhW1xb3ZeUldTWlpRSkhDQFFAQkQ8OT9BOjw5NzU3NDU2NjQ3NTY9PDo9PTk+OjxAODo6PDY7OTs+PUJCQjtBQkBDQEBEREM8PUA3OjxFS01l3OPi4uPj4+Pj5OTk5OTk5OTk5OTk5OXl5eXl5dPOxsB+cWxveHt2b3VuanNzbZKGeG50dG5vdIZ/b2twboJ0bXZyfY2DdnF/d3mKgabf3Nzc3d3d3d3d3d3e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3dzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t/f3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi1oZucG1xYFJZUFdfWUpMTElSP0Q9OTtCRjs6OTc0NTY1NzU0NjY2Pj07Pz45PTk7Pjg9Ozo0ODtAQENCQ0FCRkE/Q0BBQkREOz0+OTs8QkxNZODl4+Pk5OTj4+Tk5OTk5OTk5OTk5eXl5eXl5eW5t7Woc3JscHd6dHd4bXFydXd/hHRyc2xsa3F8bnBudGuBf3GAd32Eg355gHNygYqg2d3c3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh49WHcWxqbF5YWlVXYFZWUE9QTD1BOjs8RkE4Ojg3MzY1Njk2NTg1Nz89Oz8+OT04Ozw5PTs7NTo9Q0JCPENDREREQUE/PkJDQzw9Pjg5PENLS2PN0dnh1sjY4+Tk5OTk5OTk5OTk5eXl5eXl5eXltbW2q3J5cm59f3Z1d2hqaGlwb3Zta2tnZWZxdG15gG5teXd2iHhxa2podXV5dHV/wd/c3d3d3d3d3d3e3t7e3d3d3d7d3d3d3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHi4uHh4ePVhnFwY2lhV1NZV19MUk9STUtAPjg5O0E+ODc5NjQ3Njc6NjY2NDk+Pzo8Pzo/OTo6Nzo9PDk5PEFBPTtBQ0VDRkA+Pj5BRUQ+QEE3OD5GSEpesrW4wbm1u8jg5eXl5OTl5OXl5+fn5+fm5ebm5ra2tbWOfX5weoR1cnZnYmNlbGtyb2ZpbHZtd4Z9hXlsbHd4a3ZwfH14c3V5fHd2h7ng3d3d3d3d3d7e3t7e3t7d3t7e3t7d3d3d3d3d3t7e3t7d3t7e3t7e3t3d3d3d3d3d3d7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4eHj1Yd1bl5uY1pUU1hXS1NLSk1SR0E4Ozs+PDk4NzU2NTY2OTY4NjY5Pzw6PT07Pzo7Ozk8PDs5Oj4+Pjs8PUFEQkNBQEBBP0JDPDw9Nzs+REVKXrG1tLW2t7e2y9rJ3uXl3eDi3tXU1tPU4OPg39+2treuh3t/bnmNenJ1bWNobGxtaXR4enF5enqIh4N6aWh9cWRvcXyGgX55e318e4an2t7d3d3d3d7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4uHh49aGdmxhb19dV1lcWlJQSEpXTEVHPUA9Ozs9OTY0NjU1NTg2NzY3OD87OT09PDw5OTw6Pjw6OTg+Qjs7Pj5AREBDRUFAQD0/QDw9PTU5PEJHRl2xtbW2uLm5ubq9uMPT0r3BwcC6u7y6u8TMxb/Dt7e3hGl1gX1ndYd5Z3Vxa2t5eHB3fH15bWl3e3h3bml1j4FwbHl4d3d9gXuGgnmAoNze3d3d3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODh4OHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4ePXhXJrZ3RhW1hYX15TVVVRVUpMRj9JRDs5PTY2NDc3NTc4Nzc3ODk8PDo+PDg8Oj0+OTs8OTs5P0E8PT9DP0FARUJCQTw9Q0A6Pjw1NDlER0dasbW1tre5ubm5ubm3ubm4uLm5urq6urm5urm6u7e3uX9ucHN6b3B/eXNuc3Vsc3Z4cXFwb2tvcX6Bc2mHhIF9dHOHdW11hYmBgHJ2hafd3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uHj14lxa2xyW1dXXWBUUVVUUFJPSkNATUE9Ozk2NTM0NjQ2ODc3Nzk6Pjs8Pjs5PDo8PDk8PTw7PT0+PUNEREBDQkE/QD48PkE8OD06NjY6QkpIWLG1tLa2uLm5uLi5uLe3uLi5urq5ubi4uLi6uru3uKx7cnhxf3ZzfnBsbXpyZ29sbW50cHt3d3Jyd3pvhpJ2f3x8enZ5fH9zfYdyda3T393d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4eHh4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi49eHb2pxalVWV2FbT1FSUE5XSURESUo/Ojk6NzUzNDk1NzY2Nzg4Ojw7PD46PDo6PTw5PDw9Oz09PDs9REdEQ0E8PDw8Pj5AOzg8ODE1OkFGRVautbW1tre4uLm4uLi4uLe4ubq5uLi3t7i4ubq7t7mqcnB4d3x7e4J3aG5xam9qY2lyf21zcn54dHFsanaAeX2AgH91doB1a4qLgHaR1d/d3d7e39/f3t/f3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f4N/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLi4uPYhm1sdGVWUFxnWE1YU1JRWUVDS1BOOzk4ODc1NTM5NTY2NzY4Nzk+OT0+OTw5OTw7Njg5OTo8QEA9PkBGQEJCQDo+PEE9Pzs7OzYxNjxCR0RQqLa1tba2tre4t7i4uLi4uLm6ubi4t7e3t7e5ure2tIlyd3h9iXxwem99c2hqbGdnbHRscXd0cWx2c3Fxd3FyfHl4g3Z7d2mLkYp9kM7f3d7e3tvY2drZ297f39/e3+De39/f3Nvc3N3e3uDg3+Dg4ODf3t7e39jS397f397e3t/f3t7f3t/f3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLi4eLi4uLi4uLi4uLi4uLj4+Lj4+Li4uPj4+Pi4uLi4+Lk14NoZ3VkVlVkZVdKWllXW1Q9RU1LSD04NzU3NjQzOTQ0Nzc1Njc5PTo9Pjw9PDk7PDk5Oj45PD4/PkFBQ0FFRUQ+OzxBPjw5PDs3Mzc+REhFSqG2tbW1tbW2tre4uLi4t7e4uLi3tra2tra3uLm2traLfXpsbHp/cGx5dm5qaGdlcXp4b2lvb3B1c21zd4Fnb32CgYNyf3lqcHJ6f6ng393Zy8a/vL2/vsLN0tDW3tnc4NfQzcPCw8PH1dfT2dzX1NjX0MfExce9vM/Kz87Y3djO3N3c2t3T0dze39/e397e3t7e4N/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eLi4uLi4uLf4uPi4eLg4d7W29/Sw8rJx9Hb3OLk4eHg2dre1sbExcTN2trf5OHi4trX3st9aWZxYVleZWFNTFRLUlpMO0hNSEZBPTc2NjUzNDY2NDg3NjU2OTw7Pj46Pjk5PDk3OTs7Oj49PEBAQ0RCR0ZCQT08Q0A9OTw7Nzc3P0RGRkaZtrS1tbW2tra4uLi4uLi3uLi3s7W2t7a3t7i5tba3opdxb29waW50dnFmZWNrbmdvcm1mZ2tygWVvdnyAeGRzj39zaHFyaWVlbm+w39HFv7u5ubm5ubq6uru6vc3Gw8e/urq6uru7u8HCvcHFvby/vry7urq5ubq6ubm6w8XDucDDwby/ube/z8/U3tjc3t/g3tLa4N/f4ODg39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eDg4ODg4ODg4ODh4eHh4uLi4eDh4uLi4uHa2t3RwsPCu8XT1uDdydPDrrnAsaqrq6uwtLbJ0sXRxLG4v7Srq6usr7S0vMzE1c60tLureGxtbWBdYl9ZS1NVVFFQREBRTUhEPzo3ODU3MzE1NjQ5ODQ2Njo8Oz08ODw5Njo6ODg5NzU8PDw/QEFAQkRDQkE8PkI/Pz09PTc1OD5DRUNAj7a0tLW1t7i4uLi4uLm5uLe1sautr7Oxs7OztLS0tqaei2tue3ZxeXhnY2hfcXdha25vaG99b25ja2lseHdsa4Z+bHB6dm1scG95sca8uru7urm5ubq6urq6urq6urq6urq6urq7u7q7u7y7urq6ubq7u7q6urq6urq6ubi3t7i4t7e2tbW1tbi3u8e+w8XHzcS4wMnH0tzZ2d/e3uDf39/f4ODh4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh3Nji4uLi4eHh4OHg3tfGxtHQztTe3tPO0t/SuLi8sq2trKysrrG+ua63rKipqamqq6urqqqqq6ysuKyqqqqrq6urra6urq6urryzrayrpHlub21fXl1dVE1SU1xUSkE/UElIPjg5NjgzNzMwNTczNzg1NzY2Ojw/PDg5Ozo6Ojg5OjY1OTs8Pj9EP0NFQkNCP0BAQT9APjw3ODc6QUVEP4W4tLS1tbe4uLm5uLi3t7SurKuqqq2urq6vsLGzs7WjcG5ucm1wg311aWFlaGZkY2Rxc21td25naW1tZXBzb29zcXN8h4F6dX11n7u6uru7urm5ubm6urq6urq6ubq6urq5uLm5ubm6urq6u7q5ubm5ubq6ubm6ubm4uLi3t7e4uLe3t7a2tbW2tra1tbW1tba1t7e3t7rBvrzGycrb3+Dg3tvd3d7h4tDW4uHg4ODg4ODg4ODg4ODg4OHg4OHi0768zNjd3OLg0dnbxL23sLCxsa+zu7uzsLS9s66urq2tra2sq6qqqqmpqKmpqampqqurqqqqqamoqampqampqaqqqqytrq6urq6urq6sraR4aWJxZmFZWlZRUk5cU0Y9QlJEQTc8OzY5NTY1NDU2NTg3NTY1Nzg7Pjw7OTk5Ojg3Nzk3Njg8Oz47RD8/Q0BBREE+P0M9Pjw+Ojo3Nz9DRj54srCztLW2t7i3trKurq2sq6uqqaqtraysrq+xs7S1t4xucnRqaIB5ZmpmZWxdaG5waGxxYmNmcoJ+dmhobGpueoaBhXx4cXF5gK+6ubq6urm5uLm5ubm5ubm5ubm5ubm4uLe3t7e3uLm5ubm5uLe3t7i5ubi4uLi3t7a2tre3t7e3tra2trW0tLW1tbW2trW1tre3t7e3t7e3tre4v8bP0MS+v8DE19e8ydra4OHg4ODh4eDg4ODh4eDb3t7Uzby3tre6wMDJxLfIvrKwsLCwr7Cvrq6ur7Cwr66urq6uraytrKurq6qpqampqampqampqKmpqKmpqampqKmpqKmpqqqrraytra2ur66trK2heWpjbWdiXFhRUFFLVEpCOklRP0E3PDk0OjU2NTQ1NTY4ODY4Njs6OTw9PTs6ODY2ODg6ODY3Pj09PT5BQUVCQkNBQUBBOj09Pz05Ojc9QUc8bKqmqKutsLGwrqupqKqrq6mpqamrrKytra2usLO0tbilgIdvaWdzdGZrcG1qZGxvcm5rbWNrcHyJhG5qbHx4Y3uKfnNqc25rcY+7ubm5ubm5ubi4ubm5ubm5ubq5uLi3t7e3t7e3t7i5ubi4uLe2tra3t7e3t7a2t7a2tra3tra2tbW1tba1tLS0tbW1tra2tra3t7e3t7i4uLe2t7a2uLm4uLe3uL6+uLq9vcfb4OHg2Nnd4eHg3dfKwcPCurm5uLe4uLi3tbS0tLKysbGxsLCvr6+vr6+vr6+vr66ura2srKyrq6yqqqmoqKmppqepqaehpaipqamoop+hoZyip6inqausrK2ur7Cwrq2unXdwbGphY2BZUU1RTFJGQzlNUEU+ODs3Mjc5Njc0NDM1ODg3OTc7OTo9PTw6Ojk3NDo5ODY1OD8/QEI9RENDQ0FDQEJBQDtAP0A/PDw6O0NIPWOopaWlpqioqKenp6ipqqmoqKipqqqsra6wsLCztLW1taWYdn5xZmt4cW9tZmVsaGNsZ2ZpaX11bWlvfXZ5hWZod294b3Fvcninu7m5ubm5ubm4uLm6ubm5ubm5ubi3t7W1tba2tre3t7e3t7a2tba2tre2tbW1tra3t7e2tbS0tLS0tLS1tLS0tLW1tba2tra2t7e3t7e3t7a2tre2tre3uLe2t7i4t7i4uLi4wMXTyry8w83PyMC9urm5ubq6ubi4uLi4t7W0tLSzs7KysrGwr6+vr66urq+vr6+uraysrKurrKysq6ehoJ6gn5udoaGdlpmkpKaon5mZmZmanZ+gn56fpKqtrq+ura2srJl1cGlrY2FeXVVOU0tSREQ4TktHQTo4NTI2OTY1NDczNzc3ODk3OTo7PT0+ODg4NzU6OTk1OD9AQEFEPkZBQkNAQkNCQT88QEJCQD0+OjpERj5cpqWmpqampqanqKenqKioqKenqaurrKytra2ttLS0tbekc311bnONf3JmanFjaW1jaGZobG51aV9jZ3VzdnpuZ3Bwcn56cYihu7m5ubm6urq6urm2s7a1uLm2trW1tra1tbW1tbW3tra3tra2tbW2tbW1tbS0tLa2t7e3tbS0s7O0tLW1tLS0tbW1tra2tra2t7e3uLe3tra2trW2tbW2tra2tra2tra3tra3uLi3uri4uLi3uLi5ubm5urq6urm4t7e3t7W1tLS0s7OysrKxsbCwr66urq6urq+vra2srKuppaSmpqScmZubmpmampmXl5eXl5aZm5iZmJmZm52en5+dnJ6gpKWko6OioqKQdG5jcGFeXltUU1RIVEo/PFFCRkM7ODYzNzo1NTQ4Mzg5OTc4OTc7OTs9Ozc6NzU2OTk4NTg+Pz9ART5CPz9DPzxBQUI/PT9EQT8+PTk9Q0Y/VaSlpqanqKeoqamop6ioqKioqKiqrKuqqaipq7W1tba5o3eKcXKHhnd0cGh5a2JjYWVsaW5zal9jZWNjZWprYmRqbHaXjX6ovbm3tre5u7u6uLWxrKurqq6wrKyrq62tq6uvsLGvr7CytbW2t7W1trW1tbW1tbW2trSvr7O0tLSvra6vsrW0tbW1tbW2t7e3t7e3t7e3t7e3t7Owsra1tLa2tre3tra2tbW1tra3t7e5uLi4t7e3uLi4ubq6urq5uLi3t7e1tbS0tLS0tLS0s7OysbCvr6+vr66vr62oo6KgnJqampqZmZqbm5qampqbmpmZmZiXl5aYmZmZmpycnZ+foJ+goKChoaCgoJ+fi3RuaXRdYGZeUlRLRFRJPUVTSEVCOzo0NDY5NDQ1NzM4ODg3ODk5Ojs7Pz04OjkzNTg5NjM5PT5AP0A6QEJCQkA/QEJCPz0+QUFCPz06PkVDQFGjpqWlp6inqauqqKaoqKipp6ioqKinp6ioqaq1tbe3t7KZtH99kIx1Z2lqbGZjYGNoZW94cGlicXx5cGpmZmRma3NqhYystrKwra2ttLeysLCtrKuqqaiop6ipqampqKinqKipqaeoqqurra2sqqytraysrq6traunpaSnqqyopKOkpamwsbGztbW2t7i3t7W1tre4t7e3t7Kppaasq6ivtLa1s7W3t7a1tbW2tra3t7e3t7a2t7e3t7m6urq5uLi3t7Wxs7S0tLKxsK6sq6yurrCxsK2rqqmqqKijnJqZmJmYmJiYmZmZmZmZmpqZm5ubnJybmZeYmpqcnJydnJ2foKGhoqKioKGgoKCfnop1amtuWVxhVktPREdVRz5PV0hEPTw4MzQ0ODQ1NDgyODk4ODk6Ojw5OUA8Njk6MzY3OTE0PD8/QEBBOkNGRUJBREJDQTo7P0FCQz9APUBEQ0BPo6empaemqKqqqqakpqenqKioqKimpqaoq6uttba3t7e4rbJ1cHuDdmBiaWtiZWZhZGdmfYh5bHKAfXFvcXhjbW5xZo+srKurq6ysra6urK2trKyqp6WmpaWlpqioqKiopaeoqKioqKeoqampp6Wko6KioqOioKKioaKhoKChoaKjpKOjpaWlqLC0s7OzsKuqqaqztLa3trGopaOioaGipKiqqairs7Sxrq6xs7W2tra3uLi3t7e3t7e3t7a2uLe0sa6ppqerrKmnpqWkpKSkpKWnqaajoJ+enZycm5uampmZmJeXmZmZmJiZmpqampqampqbm5mYmpydnZ2dnZucoKGgoaOjoqCgoKCfnp2FdGtsaFdYU0pHTUVITUdAU1dGRz09OTM2Mzc0NTU3Mzg6Ojo6OTw9OjpBPDY9ODM3ODgzNztAPz9AQDpCRUNAQkRDQT87PEBDQkNBQDxBQ0A9TqKnpqanp6mqq6mkpaWlpaaoqKippqanqKmpqrW2tre3t7izc2h7c2JnamtpaWJhZGloXV1tfHJma3J/fHR8bm1zc36gqamrq6uqq62trKusq6mpqKWjpKampqWmp6eqqaamp6enqKinp6iop6WjpKKhoaGhn56en5+fn56foKGho6Wko6OkpKSmp6enpqWkpaampqeqraumpKKhoaChpKWlpaenpaeoqKalpaivtLa3trW1tra1tbOwrKupqa6rqKWlpqampaSkpaWlpqWkpKSkpaKhoaGgnp2bm5ucm5qamZiXmJiYmJiZmpmZmZmYmZmZmZqZmZydnJycnJybnJ+fn6ChoaKgoKCfnZ2cgHNrbmReU0pITUZETEtFRFFTQ0c9PDgzNjI4NDY0NjQ4OTg6Ozk7Pjw5PTs5PTczNTk2NTY8QD0/QD88P0JDPkJCQj89Pj5CQ0FFQD86PkVAO0+jpqWkpqeoqaelpKWlpKWnp6eoqKanp6alpqa1tba2trW2uYptcW1vfHxxZ2pmYGFsYFROW2hqbm9tgYJ9cWdxdn6aqKeoqqmpqqurrKqqqqimpaWkoqOlpqalpaWmqaqppqWjpKWmpqSjo6KioqKhoJ+fnp6cnJycnJ2dnJ2en6CioaKjo6KhoqKkpaSioqOjpKSjpKSko6Ggn6GipKanp6ipqaelpaSipKSlqK2wsKyrqqusqqmnpaWmpaWlpaalpqioqailpaWkpKSlpKOjpKOioaGhoqKgnp2cnJubm5qZmJiYmJmam5mXl5eWlpeXmJiZmpqcm5qampubm5ucnJ6goKGgnp6enpycm356bnJiXlNNSlBFRk5NQkBPRT5JOz01MzYzODM2Njc1Ojs4OTs5Oj49Ozo5OT03NjY5NjU2PkI+PkE/PT5DQT5DQ0BAO0BAQkJCRUA+Oz5FPzxQoKSjpKOjo6SkoqSlpaSlpqamp6empqalpqaltLW1tbS0tbiBaHx9ZXOCemxwdWFfY1ROT1FbaGxpbGxxbW5xbnScoqSnqKioqauqqqqqqaempaSjo6OjpKSlpqalp6ytqaShnp2eo6Shnp6foKCenJ6dnJycmpqam5ucnJubm5ydnp6foKChoJ+goaOioKGjpKSjoqSlpaWkop+go6SkpKapqainpaGdnJ+jpaipqainqKioqaempaWkpKSlpqampqampqenpaWko6Ojo6KioqGhoqKhoqOkop+enZ2cmpubmpqZmJeXmJaWlZSUlJWVl5iYmpubnJuampqam5ucm5ucnp+fnpucnJyam5p/fnF0YFtUTUdNSEZMSj8/TkM8QDs8NDM4Mzc0NzY3ODs9ODo6OTk7PTs7ODk9Nzc4OTU4OD9APT9BPjs9RD89REA/PzpAQUE/QUVAPjw8Qz88Tp2ioaKioKCipaSkpKWlpqenp6empqampaampbW1tbS0tLS3jHalsXdmc3Jvc2xjZGlYT1JRT09dgG1kYFptkZGSoqKjpaampqenqKiop6alpaSjoqGhoaKjpaempqesrKemoJ2cm6Ghnpuamp2cmZiam5qampmZmZubm5uampqampucnZ6goaCfnp+hoJ6foqOko6Omp6inqKWioKGhoaGkpaWlpKCcmZmbnqOmpqampqanpqempaOlpKWlpqiop6enpaWlpaWkpKOjo6KhoqKioqKhoaKjo6Kgn56enZybnJubmZaUlJSTk5OTk5SUlJWWl5qam5ubm5qZmZqanJ2dnZ2dnZuampqamZqXf3dvc11aTkhKTkdFRklERU5APD09PDQ1OzQ2NDY1Njc5Ozg5OTg5OTw7PDc6Ozc4ODg1ODg/Qj9BQTw+P0A8PEJAQT49QT4/Pz1CQUA6OkA8PE+doqGfoJ+dn6OkpKSlpqeoqKenp6ampqampqW1tLS0tLS0tbSXtqd1Znh2Y2xjY2VjW1JTU1JNXqCMeFhodpajnp6hoaOjo6OjpKSlpqalpKSioaGko6OjoqOlpqWmpqenpp+bmpuioJmWlpWam5qXl5iZmpqYmJqampqbm5qZmZmenZ2goqOjo6KkpKWinqGhoaKjpaampaSjoaCgn5+hoZ+goJ2amJeZmpygpKOjpKWmp6alpaOjpKSkpKWnp6ampqampaWmpKOjo6SjoqKjpKGfoKGhoKGgoaCfn56dnZyamJeVk5KSkpKSkpOTkpOUlZaZmpqbm5qampqbnZ6enp2cnJybm5qamZmZlH10bHReWk9IRUdGQkVORT9GOzo+Pzs0Njo2OTM2NDY4ODo4OTc4ODo8Ozw5Ozs6OjY3ODk5Pj9APjw9QD5AOjlAQT89QT8/QUE+QUE/Ojk9PjpQnaCfnZucnJufoqOlpaWlp6iop6ampqanpqantLS0tLOysrGwsK2rkHiGj36bmn93Yl1TUlFRTGKgootaiKCgn52YmZycnZ2eoaGgpKenpqWkoqGjp6alpaKipaampaanpqagm5mboaCXk5OSl5qcmpeXl5ibmpmampqam5qYmJmaoKCgoKGfoaKipKamop6gn5+goaOko6Khn56enpyanZuZmpqZmJeZnqChoaKioqKkpaWmpKSkpKKioqKkpaWlpaWlpaalpaOko6KioqGgoKGgnp+fn5+fnp+foJ+cm5qZl5WUlJSTkZCRkpKSkpKSk5SVl5iZmpmZmpqam5+fnp2cnJycmpmZmpiXl5F8cmdxXl1QRj9BRD9KT0JCRjhDRT4+OTg7Nzc0ODQ1OTo6Ozk3OTo8Ozo8PT48PDo2NzY5OD4/QT47Pz49PDg6PkFAQUE/P0FCQERBPjo4PkE8U5ycm5uampycnaGio6KjoqSmp6alpaampqSjo7KysK2rp6amp6alpqiln6iop6qnoXmEXFFST0xcnKCAYpmgnp2clZOVlpeZmp2dnqGmpqampKOioqanp6ajpaampaWmp6amop2cnqGfl5GRkJSXmp2YlpeWmJuZmpqampqZl5iam6Ghn56fnpybnJ6goJ6dn56fn6Cio6SjoqCfnp2ZlpeXl5iYmZubnqKioqKioqGio6WlpKOio6SioaGhoqOkpKSko6SkpKSioqKhoqGgn5+gnp2enp2dnZ2dnp6em5mYl5WTk5SUk5KQj5GSkZKSkZKTlJaXl5iYmZqampyenZ2dnJubmpiYmpmXlZaNempmamBiTkY+P0A9SkVAQ0A7QEE8Ozs5Ojc2NTg0Njc4OT04ODs6Oz87Ojs8Ojk6Nzc2ODs8Oz08Ojo8PTw3Oz5DQkRDPz1BQ0FEQT88OkBCO1eZmJqamZmam5ucnp2foqKhoqSlpKSlpqSioJ6op6alpqWlpaemp6ampqakpaanqKehqXJOUU1KVJahenKanJyenJeVlJWWmJiXl5qeoqKhoqOkpKOjpaalpaanpqSlpqalpaOgoKGhn5mSkI+WmpmenJaXl5eZm5ycnJqamZeZm5uen52cnZyZmZqcnZydnp6fn5+hoaCgoaKgn56bl5WVlZeanZ6fn6GhoqKio6OhoaCgoJ2cnaGioqOkpKOioaSlpKOko6SjoqKioqKhoKGfn52cnZ2cnJ2dnJ2enpqXlpaVlJOTkpKSkpCRkpKSkpGSlJWWl5iYmJiam5ycnJycnJ2cm5mYmZiWlJWXi3hsY2RiZFFHQT1DO0tIRDo7Ozw+OTo6OTo3Mzc5NTo4ODg8OTg7OT09Ozo7Ojk8PDc2NDc/PDo9Ozw/Pjw7ODxBQ0FDQkI+P0NAQkFAOj9APztZmZiampqam5ubm5ydoKGhoaGhoqKioqKhn5+dpKWmpqenpaWmp6ampqWkpKalpKSkpaaGUFJQT0+PmHB6mpubnJ6cnJycm5ubmZiYm56dnp6foKOkoqGhoqKio6SkpaalpKOjoaGhnpyalZOUmJuam56amJiYmJqcnpyam5iWmZybnJycnJydmpqbnJ2dnp6dnp6fn52cnJyhoaCblpWVlZacoKGgn5+hoKKjoqOhnZuZlpaWlpicnqCip6ikoaCgoqOjoqKioKCgoJ+fn5+gnp2cm5ucnZydnJmanJuWk5KSkpKUk5KSkpKSkpOSkpKRkpSVlpeYmJiYmZqcm5qbm5ucnJqZmJiXlZWWl4d3ZGdoZGJNQ0U8RDlJSkU5Ojs9PTo6ODg6NjQ3OTU8OTY4OTc5PDs7PDo6PDs6PDw4Nzg3Pj07Pj46Qj86Ojo/QURCQ0FBQD9EQUFAPjpAPj06W5qYmZqbmpubm5uen6CgoaKioKCgn5+enp2dnKWkpaanpqWlpqakoqKio6Oko6Kjo6KnllRYVVJOZ21rgZ6am5udn6Cgn56enp6dnJ2dnJ6enp+goaCfn6CgoKGio6Ojo6OkoqGgnpuZmZiZmZmZmZienpiYmZmam5qWlZeWlZicnJ2cm52dnpybnJ2cnZ6bmJqeoaGdm5udoKKhmpWVlpaZoKKgnZueoKGjop+em5eXlJKSlJeYmZ2goqenpaGgn56goaGioaCfnp2cnJubnJubmpqZmpydnJmXmZaVk5GQkJCPkZKSkpKSkZKTk5OTk5OTlJWWlpeXl5manJubnJucnJqamZeXlpaVlZSEcmZsYmRbREJMPT84RktCPEA+Pj05Ozk6PTg1ODg2Ozg1Njo4PDw7Ozw8Ozk8Oj09OTU4Nzw5PD88OkE/Ojo6QEBDQkRBQ0A/Q0FAPj08QD09Ol+al5mamJeYmpycn5+foaGhoJ+fn56foKCenZ2lpKSko6OioqOjoZ+foaGipKOio6SiradXXl1UV19ua42dmpqbnJ6dm5ucnZ+enZycnJydnZ+goKChoaGgoKGgoKGioaGhoZ+enJuampqbnJqZmpuZnJ6ZlpaWl5eTjo6QlJabnJuam5udn52cnJycnJ6dlpSZnJ+in5ycnZ+hoJuXl5mZmpycnJubnZ6fnZqXlpaWlJOTlJiampqfoKGmpqWgn56fnqChoaCenJubnJybm5ybm5qZmJmZmZmXl5iVlJKQkJCQj5CSkpKSkZGTk5aYl5STkpSVlJWWlZaZmZmam52cnJyampmXlpaWlpaQgG9vZV5gV0BKSDg/N0lFP0VBPD07Ojo8Ozs3NTs4Njs3NDY6Oj47Oj0+Pj07Ozs+Ozo4Ojk5NkBBPTo8PTo6OT9BQ0JERUM+P0FBPz8+Pj89PDtgl5WXl5aVl5mbnqGhoKGioqCenp6enqCgn52bpaWkpKSioKCfoJ+dnZ+hoqOjo6OkobCjXWVkYGFua4GenJubm5ubmZianJ2enJubm5ycnJ6ipKGeoKGhoqKhoKCgoaGgn5+enJqZmpubm5ybmp2dm5manJiXlZWWkY6Nj5KYnZycm5ycnqCdnJucnJyempWVm56foZ+dnJyenp2cmpqampqampqbm5qXl5aTkpWVlpWTlZaam5qanZ6foqWjnp6fn5+en5+enZ6fnZycm5qcmpqbmpiZmJiYmJiYlZSTkZCRkJCQkZKTk5CRk5SYmZiVk5SVlZWWlZaXmZmXmZqenpyamJiXl5aWl5eYjX1ubV9lVlRFSzw3PjdSRUM+QkE4Ozw7OTg6ODY7Nzc6Njc5Oj0+Ojw8PT49PD06Pz06ODw9OTtAPj4/PT45ODs/QkNAQ0VDPT9DQj5AQD5APTw8YZWSlJWWlpeanJ6goKCgoaCgnp6enp6gn56em6WlpKSioJ+fnp2dm5mbnJydnp+gn56rmGNpbW5pZm2enZybm5ybmpmZmZqam5ucm5uam5ygo6SgnZ6en6CgoKCgn6ChoKCfnpuamZqam5qbm5ufnpyZmJqamJiYmJKOj5OXnJ2bnJ2cnJycnZycnp6dnpqVl5ygoaGfnp2eoJ+cnJuampqbmpqYmpmVk5OTkpOWl5eVlJiYmZucnJydoJ+gnp6enp+fn56en6KjpKKgnp6cm5qampuZmJmZmJeXlpWUlJORkZCQkZKTk5OSkpOUmJmYlpWUlZaWlpaWl5iYmJiXmZqamZeXl5aXlpeWl4l4dmddX1dURUU5OTs8WT5AOEI/OTw8Pjk4Ozg6Ozc5OjU4OTs9PDk9Oz0+PD0+Oz8/Ozk+PDw+Pz5AQUE9ODc7QkNFP0FFQz1AREJBQEQ7Oz47PGKWk5SUlpWUlpiYmZubnJycnZ2cnJ2en56dnJqkpKSkoJ+enpybm5qZmJiYmZucnZ6cpolla3R4bVuFop2dnJydnJqbmpqampydnZ2bmpuboKKinpucnZybnJ2enp2dnZ2fnpuampucnZybm5ycnp6cm5qanZqam5yVkZOXm52dnJ2fnZycnJycnZ6fnp+cl5idn6GhoJ6cn6CfnJubm5qbmpmZmZmZl5WWlZaYl5eXlpaYmZuenp2dn6GhoJ+fnp6fn5+dn5+hoqKhoZ+fn5yZm5qcnZuampmXlpaYl5eXlpWTkpGTlJSTlJSUlJaZmJaVlZeZmJeYl5eXl5eYl5iXl5eXlpaYl5eVl5eDeHZfW11eUT1GOjk4P1VDQTtDQzo8Pz86Ojk3Ozg4ODc0ODk8Ozw4Ozs8PTo9Pjo/QT06PTw+PkA/PUBBPjk2PERDRUBBRUU9PkVERD9COzo8OTpkl5SVlZaUlJSUlJWXmJiamZqcnJydnp6dnZybo6Oko6CenJuamZqZmJiYmZiam5ubm6WJa3F2em9lmp+enp2dnJybnZ6dnJ2enp2dnJydm5ygoJuampubmpudnJqampucnJuamZycnJ2dnZ2dnZ2dnpybmp+fm5ydm5mZmZudnZ2dn52dn5+dnJydn5+fn5uanZ+goJ+dnJ6gnpubm5ubm5yampuamZudnJqZmJeYmJiYmp2foKCgoJ+hoaGgoJ+en5+fnp6foaKhoJ+enp+enJqam5ubmpqZlpaXmZmYmJiWlJOUlJWVk5OVlZSVlpWVlZSYmZuamZaWl5WWmJiWl5OUlJGRk4yRkJOWfXhqYWJiXFA8QDw2OENWSERCOjg7Oj47Nzc5Nj06OTk2NDc6Ozw9OTo6Oz87PT08QD47Oz46PT89PkBBP0A8NztBQ0U/P0REPj9EREM+Qj07PDs6Z5aTk5OTk5OTlJSVlpeWl5aWl5mbm5ybm5uamaOjoqCfnpuamJeYl5eXmJmYmZybm5qkgGpqb3lzcZegnp2dnJydnp6enp+enp2cnJydnp2bnJuampqam5ubmZiYmpqamZmZmZqdm5ydnZ2dnJ2cnZ2cm5qdn5ucnJubnJubnZ2dnJydnp2enZydnZ2cnJ2dm5uenp6dnZybnpubnJycnJydnJubmpmbmpmYmZmYmpmZmpyfn5+jpaKfoaKioaGfnqCgn5+fnqCioaGhn5+fn52ZmpudnZqZmJWWl5aVlZaTkpOUk5STkJCSk5GUkY+OkJGOlZabmJWYlJmXlJiRjJCPk5yTkoyFjIeDhndxZ2pkW1xRQT44NkJHYEJFR0A+Ozw7Ojg4NjU8ODo4MzQ6Njk9PTk5Ojs9Ozw6PD48Oj5AOj5APjw/QD8+PDg6Q0FEPz5CRD8+Q0VCPUJAPDw8OmeYk5KSk5OSk5SVlJWXl5aWlZaXmZmZmpqampqkoqCfn52bmpmYmJiXl5iZmJmcnZ2cqH1nZXN7enOJop+enp2dnp6enZ2enZ6enp2dnZ6cm5ybmpubm5ucm5iYmJmZmJiZmZibnZycnZ6enp6enp6dnZybm52bnJybnJ2dnZ2dnJ2dnp+fn52cnZ2dm5qbnJmZnJ2dnZ2dm5uanJ2dnJycnp2dnZybmZeVlZeXmJqam5ubnZ6foqOhoKGhnJucm5ubnZqcmZycn6CfnZiZmZmUkpKUl5SPj4+OkYyNiYuQi4mLjpGRj4mQmJiQkoyNi5KQj5iYoqiqpqWlrKOmoZqep6eyqKKVo6Cfl39wcWlsXFtcTUY8NzdHR1g+SE5URjk+Ojg5ODc1PTk4NzMzOTY6Pjw6Nzo8Ozo6Ojo8PDs/PjtAQD47PT5BPDw2N0A+QkA+QUY+PEFEQT1DQj49PDlmmJSTk5OTkpOUlZOVl5iYmJaXl5iZmZqampqaoqGfnp2cm5mYmJiYmJiYmZmZm5ybnKx/am16f3lxh6Genp2cnZ6enp6enp6dnp2dnZ6enJubnJubm5ubm5uZmJiYmJiYmJmZnJ2dnJyenp6enp+fnp6dnp6dnJydnJ2dnZ6fnZ2fn56goJ+enZ2dnZybnJ2em5qbm52enZ6dm5ubnJ2cnp2cnZqYl5SRjo+QkJGVmJSWlJiZmpudmJuYlY2Mjo6TkpKRj4mQjpGRjo+Ki42NjYiIi4+Lg42NkY+MkI2Qk5WVnJihoJySn6SipKmam5eanKOprb3Bwbq8uL26ucC8ubq3uru7tL2zwbV/bnVmZ1peWUxJRTo7TElTPFZSSUM6QTo7Ozc3NTo6OjgyNTY4Oz08OTk7Ozw5Nzo4Ojw6PT85PD8+PDw9QTs5NTg8O0A/QT9EPTxBQkA8REM9PT06YZOTkZCUlJOTk5OTlJeYlpeZmJmYmZqbmpqamp+gnp+fnJqZmpqampmYl5iZmZmZmZmphXB1e4B3b4mhnp6enp6fn56en56fn56dnp6fnp2dnJ2cm5ubm5ubmpiYmJiZmZiam52cnJ2dnp2dnp6goJ+enZ6hoJ6dnp2enZ6fn56en6CenZ6enJydnZ2cm5qYnJuVmJqamJiYmJmSjJCXlKCXk4+MjYqKiImMiJORh5CPjYqKkJCLjoqMi4+IiImJjpGOjYaFiYaKhoWLiI+SkJCNkJKXlpKamJ2TlJ6kpqaqq7Gsr6+rpquqsbm5tbS0rqyvtMDIxcXBvsbDxMTDurW+t7a0s7C2tb6qcHRyXGZfXl1JRj8/RUtMVklcTEQ/PUI6Qzk5Nzc7OTk3MTc5ODo+ODg6PDw7OTc5OTs9Oj4/OT5BPDs+PD46OTY5PDpBPkNBQT08QkBAPkJEPj8+OVyHhIOHi42KiYaFgYqMkZOVmJiHlZaWkpiampmenZ+gn52ampubm5ycm5iWmJmXl5ibqo56dXZ7f3mCoJ+fnp+goKCfn5+foKCfnp2dnp+enp2dnJqbm5ybm5uYmJiXl5iZm5ucnJydnp6enpybm52dnZycoaGfnZ6dnZ2dnp2dnJiWlpaYlZWSlpmWk5GKjI+PjI+NkIuLj4+WiYiEi5GZjn2Fi42PjYyHioyQm4yRj4+Lio6TjIyNjIiSi4yFiYyPhouIh42KhYyEj4qXkJOYmpWbnKOqoaKknKKrsbe0ubWxs62vsrKlp7O6sbq6vLa3tsDDw729vLa/urq8wbW4wL60r66mqa+3mm58Z1tjWl1fSEU+QUtJU1hZXkFGOTk9OkY/Pzo3Ozs7NjM6Nzo5Pjg6Ojw9OTk4Ozk7PDo+PTtAQDs8QjxAOjg0Nzw7Qj9BQj4+O0NEREBDQz0+PjlhmZWLkYWNj5aSiHl9e3+Fi4OKgoqJhmuAeJCLlpqRnZ2UlJGTlpeampiWk42Sk5KQm5uIdndzcX1/cpGgnZubm5yenZ2eoKGgm5uWlpucmpybnJuYmZqYmJmampqWi5CTlpmYlZiYlpucl5WSkY2SkZCUk5KXm5mYm5ePjpCLjo2Ch4uLi4qLiI2RjIeHhoqIiZGKh4yEhYqNi4qNhI+UkIyDkJOUmZWQi5OTkZWRlpWOj5GMlI2Oj4qIj4ePhoeJiYmNiomJioWNh46JmJKUmpuXmKChp6Cko5qqqbO2sbWwqKmiqK6tn6qvsK21ubi8wr/BxLixtbCutrOwuL68ury+urOzp7G3wpB1gGNiXlpXUk1IRkVQSVlXX1tDUDpCQz1HRj84Nzo6NzU1OTc8OTw5ODo9Pjo6Nzs7Pjs7PTs9P0E7Pz48Pzo4NDM3OkFBQEI+PjpDREM/QUM7PT45Z6mloqKZn6CippeUiI2CiIJ1h4iKiIp7e3Z7enmPeoiSfn18en6CkYWBgH1zfH99fISHfnRweHZzfHaBj4iIiYeIioyMkZicl4iOhIuNi4iNkI+Pi5GPi4yOj5CQjouFhYeLjIyHiIuOi4eMhYaBjYuGiop/iYqGiJiRiIOIg4KFfIuLjIaJi4iKkIyIi42PjI+Wh4mLio6NjY2Wk5OdnJyalpycm56bmpuYnZeTkZWWkJKRi4+LlpSMjYqDi4SEiYyQkIqOio2LipGJjZOTk5SVk5KcmZ6Xn6CfpaKvsamupKSfmKStpqa4t6ysu729wsPAv7+vpa2wsLS3uLO0uLa0ta6stK+4tLaBeXpjZmBeVlFRQUVMT0lcXl9UR0dCS0xCREA9ODg7OTU3Nzk3Ozc9PDk9Pj05Ozg6O0A8Oj06PkJBOD88Oj84NjQyOTtCQD9CPj04QEI/PkBEO0A+N2CloJqXnaGaoaCPl5efl5WCjaCfo6GdmpKOjIxycXBvdnFucG1ucHZub29waHBxcHR+c3FycXd7cnl2d3Jyd3Z6e3l8fXt/iIGEi3+PkYaNi4uGiouLiYaEgYaCgIKJkYOAg4x/ho+LiYWAh32AgZKQhoSEho2DhIyPj4+IjY+Hi4iRkJWRjpCKk5eOj5WYp6SfnZWYlpaln5udq6aqt7W4srGnr6qnpqGfmp2WkpWVkYqPjImTjZuVjYuLhoaJjJWQkJCLmZKVlZSbkJiTlIyNkYyWl5WilZ6mqauno6OqsJucpp+mq6G0vb6zs7+5u7u6uby9rqiusa6wuLyztLGxqrCpqLGxsqild3J0X2hhYFRWUUlKSFZNXl5eVExKRVFKRUdDPTo5OTc0ODY4Mzg4PTo9PD47OTs4Ojs/PDw+OT9DPzg7Ojg8Nzc2Mzc5RT4/Qz89N0BAQT0/RDw+PThUj4yGh4eUjJWZl5yWmZaNlZyWlZydoKCdmpiWeHFubXJ4cXFsbnJwa3FvcG1yc3t1dnd5fnVxeHZ0d3tybn98gX15eH1/eYOGg4WCg5CLkIuLi42Pi4mJhYKBfX9zfYiAfpyQhIWFiYuPinp9fYaOjYqGjZSSi5CXj5SXkpihlp6XlZunpp+goKawq6GjpbW0sqqmqq+isba5vcK7ucO+vLi9uLWxrLCspZuSk5mfm5SPk5WOmp2doJqfn5edo6qsoZ+em62hp6qwqaampJiRkZWUo6SirKSss7Szs6i3tru4sLKvra2yt7a6srW6s7e5u7i8urayr6yxsbKztLOxsa2us7Gzs6yhl3Zxc19jXlJRVE1PSUdYT1pcZFROR1VPRURKRD44Ojg3NTg4ODU5Nzo6PTw/Ojg8ODk5PTs9PTpCPj84Ozo5Ojk4NjI1N0I+P0RAQDY+P0I/PEM8PT46Tn98go6MjJOTl5eaj5SWjZaRkZSXk5qanqGdnHJvcnFxcXFxcG5zcW91dHJxdneAdXd8eYV+d3t8eX1/fICJiYmDfXp/h4GIiYGAgIGGiIKGi4aIhYSIiImEf4J/enx8fX6SkH+IeIGFi4qDhIWKj4yNkZmdlJSUoJqan6Ktsa2ppKWtr6ysrLWuvrmtrqm1sLexq7G2rK+9wsLAvrq8trKutraxtK66u7OurKepp6unoqmtoKmooq+wuLSxvLq6urK0ta+8tLezt7e7t7mtrbCprLW5sbeytLe2sLu7vLu6ury1vLi0wbWsqqqrtLG3uLm1trSzsKymrrCqq7Cxq6yusLKxtK6qo5N4dnJlZ1tMUlBFTUlTV1JlXmdUUExcUUhMUkNBOTk3OTU4ODY2Ozc5Ojs6Pjk4Ozo6Ojw8Pj08RD45Njs7ODg+OTUxNTZCRkREP0A3Pj5DPjpBP0BAO0t/gomXmJSdlpabmIuSlo6XkZGVl5SZl5+bmZx8dHV2dXl1c3RudnJzdHV2d319gX56gXyDfoJ/fYB/hIKFj52RiYF/go+Xjo6HgoCBiIuFfomQi3+HjYyLioeSioeGjZGTkZGEh319g4iMjouOiYmQj46PlJSYkJWcmp2eqK6yr6+1tLOtsrW4sLy1tbGqsKqztbS7t7SztrS1r7i4t62noqassLCvtre3vrW5vLOysa61u7C0r6+yu7axuMC9tLS0s7izvLq2tLrAvbm6ubq+ubm5vrWysa+yr6q1tLGzsbSzrri4tb+vpKaoo6ussa+zrq6wsKytq6qroqKmqKKnrauqpaynoqeYeHlxZmVZT09NSVJNV0xPX15cTlVVYlFEVE07Pzk8ODk1Nzc1Nzk1Ojo6OTs4Ojw8Oj08Pj4/P0I9ODY6Ojk6QDs1MjY2QUZDQz4/Nz49Q0I5P0I/PjtLjpGTmJmVmZGTopiTkpKLk4uOkI+Vl5ablZSbhoJ9enh2dHRzdH53end2gIKDhouMhISFioaQiYeRk5aRjZaalY+IjI+emJaVkpCTl5qamJCdoJ2Tl5qgmZ2boqGVkJugpKOak42IiIuJkZGOkY6LmJqPj4yUmpecnZugnaSstLm6vK+2tLi0tLK3uLmzq6+qqKy1srK1rrGrrqa3s7OxpaGotbCvrayrtbqyu7q6tLK3ur67ubG4sLmtqLK4u66ttLS3tbu2trm5vLe0r7G0t7a5s7e1pq2pq6ior6yprq2up6KxtLG0q6aop6Cjq66oqq6orLKwr6+pqKGeoaGjpqOgopqlo56ol3J3bmdiVUtUT09KQ1BLX2JYWlFcVGBNSFJJQUA5Ojg2Njc3NTg5NDs5Ozk8Nzs+Ojg8PD0/QkBBPTs2OTk5Oj87NjM3OD5GQkJAQjk+PUBDPkBGQj44R5OWkZWTkpSQkZ+ZnZmVkI+Sko6Mk5aWko6RlZGSkIaBeXJzdXuBhI6HhZGTkpicnJiVkJWYo5yaoaeqqZ+clpeVnaKioZyZnpmlqKyvramnqqmop6GlqKirqqmvoZufoaOjoJqfoJyUjZiUmKCgoaSem5qlp6Spq6+spaOoq6+xtK6qrK6zr6ystLO0ua6urayqrLKwsK2wqKqmsrS0uK6qtrqwr6qurLC3s7i0t7W0u7y4tbWxtauyrKiys7uvrbGytLa1sbG0s7OvrKuvs7a0sayutKqqpqWnrauoqKupqqifqbOwqqeppaOio7CtqaatpairrayppaSioKWipaOYmZyVnqKippdudWVnZFdPWEtLSktTVHBiWWRXX1tcUlpQTEM8ODk6Njk4NzQ3NzQ4Ojw6PDg6PTk3PDw7PkM/QT47OTo5Ojs+PTg0NThBREVEQkM5PjtAPkI/R0Q+N0KSm5SVlZaVj46Wl5qZlZGKk5SSjo+SkYqKiY2Ul5qTjYmCho6VkZSfmpuin5+jnqGhn5ijpKelpaapqa2rqaKmpKilpKGfnqOjra2srairrq+qqqukoaKkqaemqaijopybm6SgpaijoJidmJ+hoqmnoKKirqyrqqetr6ilpKmpqammo6iqqaekp66wr7Ovq7Crqq+yr7Czua+rqLCxrrCyubO0r62vtbCss7GurLW1tLSzs7CvrKyqrKusr7G0s7CwrrCwsKyqrauqq6alrrCysKumqbCvqaOkqaunqKaopquwq6mvqaaoqaalo6iwraqpqKKpo6WnpKGhoKKloZ2el5aYlJugpKmUbnNeamlfVVpOUk5QT1JkXGVjW11ZXFBZT0tAPDs5Ojc6ODczNTMzODo9OTo4OTo5Oj08PEBEPkA9OTo8PDw+Oz45NTo8QkFFQUNBOT47P0BEQENCQDdAkZ6YlJeZlpGHi5SSl5GIg4mLk4+OkI2Hh4SFlZmWmJeZlpqeop2anKKkoaCdn5qfoKGgpqGgoKCjo6KlqKmrramqpqOmpaCloKaop6WnqaepqKOnppmcpKaioaGhoaCcmJmfoKGkpKKenpagm5qioqChn6GiqKCcn6GloaCmo6KfpKGspp6foaGkrKqnrKivq6e0sa6ur7WyrKqwq6mtrbWwrq6srreup6yqpKivsq+sq7Kvqqqpq6utqa6urrGxraqtqaunp6uoqauinaapqKilqKisqKilpKWop6iopqmsr6+oq6mhoqKlo6Opq6ymqKWjqKKhoKSdnZ+hoZ2bnZ+amZWcnKOqlG9zZm5yZF1cUFVPV09eZGRsaGJiWlpSVE9NQTo9Ojo4Ozk1MTYzMjg4Ozk5OTk7OTk8Oz0/Qz5APTk7Ojs8QD0+PDk5PEFBRUFGQTo9Oz9BQUJBRUI4PYqWlJOYmpaPiISNjpGSjIiIiI+JiZCRjoqKiJubmZygpaKlnqKjoZqeoZyanZ6bnKOop6ugoKOYoJ2XnKGjo6WjoqKkrKilqaCepqmnrKmkn6Kgoqahpq6mpp2fn5+fn5manJyhoKGkn6GbnZqcoJ6hn56eoKOZlpuYpKKipJ+ZnKGhoqCbmp6goaSgnaejqrGorqusqaSqqquorKalrKqws6+rq6mwq6appaWoq6ynpqevq6Wnq6upq6irqqqrrailqKOmpaesqayoopykoaOmo6qpqKano6SnqKanqKepqKupoaKoo5yepqWjqKino6WlpqmgpJ6inpeYnZ+doqKlnpiUlZ6go5d1d2t2eGJfXFVZUVVXW2Nec19oX2NTUVlUSD48PTg7OTo4NTM3MzM0Nzo4OT05Ozo5PDxBQEM9PT44Ozw9PEA/Qz86ODo+P0NAREE6Oz49QD9DQ0VDOTyCmJmenZ2alZKKiZGRl5GQh4SJgoGNj4+Sj42cnZ+hpKmlqaeorK2moqKfmKSmo6Stsa6yp6asm56em5qjp6Cfo5+foq+rq6yoqKuwqaiqqKGfoKeprbCyr6yjoqahqaWepKOipqClpKKlo56doJ6fpaKinp+imJWem5+fpKGblZigoZ2enJudnZuZmZWen6Oonp2iqKGaoaOmoqSoqaqoq7CxqKWlp6eopKWpqaqnoqWmqKadnqWloqClpaOlpqCjpaOjpaelqamqpKekpqKmp6SrqaenpKGlqKynpqWlo6OopJWdo5+bnaCjqaeopqGjo6mooKiioJyVkZqfoKGmopuXkpCamqCVfHdvfXlmW1pgX1pcVlxoZG5jbmppYl5QUEA/Ozo4OTg8OzYzNDMzMzc5OTs8OTs7OT49QkBAPTs9ODw9QD08PENBPjo4PT9EP0M+Ojk/PEI/P0FEQjk6gJ6kp6Kem5+gmY+ZnaCWloqGj4iEi4qTl5SRo6Wnqq6trLOys7S4t62pqqevtLKxqq6usbKusa2lq7OssbGpq6+rq6y2sLSwq7GysaOfoqqpp663trS0trOvrKuuq7awqbKxra6npp6io6ObnZyXoqiloZ+eo5udoZqWnaScm5aZoqefoJ+joJuUlpmWl5qfoJmVnqGZmJ2dpZ2gpKeqqaiqraylqaSlqqeqqaqsp6SkpKOimZmhnpqaoaCfpaWYnqSmpKqooqelpaGqp6mnp6ejqKWmpaGkqKesoqekoaalpaOVl52Ym5mVo6elpaSfnZ2lo6Kqo5+amZiXnJyaoaGakJOTl5ibjX93cnZ5amJbX15cYllgZG5ta25hX2RgUE9BQDs7OTs4Ojk2MTQzNjQ3Nzc6PTo8Ozk9PUI/Pj89PDo/OTo7PD5BRUA9OTtAQT5DPDs5PzlAQEBAQkM7OXuao6OcoJ2dop2Zn6KioJibmJaYkpSQm5qWl7S0rrW4s7S4tre0uLm3tbm4ub28uKqLnLK4vLS9urW7uru4s7q/uLe5u7G3r6iusq2inJ+qsri8vL27ur+0r7GztbS3t6+1tLWysKikop+gl5Wal6SqpqahpKOkq6almaGko52goaKooaOgpaGck5mYmJmco56cmpudl5uZlqWam5+hqKmpqKuvr66pqKirrKytq6irp6WjoJyfo6Ojn6Cipammmpyip6Spn6GjoqKgpaanpqSooJ+ipKGjoqiop6OloaGopqalo5mbmJuTj6GknqKfmJiVoJuhpaCfm5udnJuamZugmo2YmZiTkYaAdnh4eGNbUllUX19hbWh1a3FoaWlhWVNMQDw6Ozg5Nzk3NTU2Mjg1Njc3Ojw7Ozs7QD4/QD0+Pjk6PDk2Nz47QkZCPDg7P0NDRDw+OT43PkFCP0ZDOzhwkpqblJ6bm52Vl52doqajopaXnpaXl6GblJi+t7G4uba3t7i7l5S2vbu9vcDFtaK7mKC3v7+6wcm0nbu2sra/xcGooLa0urGqrrSxsLG0tbW8vL68vL7Guri3ur20r7Wxsbq4t7Kzsqqmpp+YpKSnqKSupKurtbWvs6CnqqynqqmlpqCnoKGmoZOWmJ2foqSjnZ6coaChnZekmpmdoKaqqqqtrq2tsLGrrK2sqamrrqimpaalpqSkpqaeo6eppKGcoKKjpqCio5+jpJ2foqWgpJyboZ6fo6GhpaSlqaOkpaKkp6ehn52elpOcoJiZko+MjJeWn5uWnJqdnJqSlpSUmJOQmp2YiouHgIB8gnhhXllUYWlgZnNvc2l0ZGlkYltMSz46ODg5ODg5NzM0NTI1NDY2OTw8Oz08P0E/QEA9Pj44OTs4Njc/OUJFQzw7PD5DREM9QDs9Nz1DQ0BFQjw3Z4yRk4qalZiblZWYm6Knq6aVl5iQlZmhnpeXvrWztLu6ubi5woeYt6u4u8DCxbOjw6e4s72/tMTHvbS7uL62wMTErqCworW2tb2+wcPGwsO5vb/AwL2/xL28ur2+tKeqmLHAvbi1ucCzr6+qqqitp6ekr6eqtLyxtLWor7Gwr6yqoqajrJ+fpquXmqifpaWfoJydoKuwsKyiq5yYm6Cor7Kys6uorre1sq2tqaalqKulpaStqaShn6Cnnp6mqKmmnp+anqGlpqmcnaObl6KmmpuanZ+cmqGcmZ2eoKijn6GfnaWioKOioZSZmpmTj4qLhI2Qk5uPjpiVm5eYkJORkomNl5iYk4uKi32AgIVwYGFeXmtjYm53dXZubFtiUVZcTUc7PDk3OTc5Ojc0NDQxNDM3Njg8Ozs8PEBAPUA/Pj8+Ojo5Ojc6Pz5FRUU8PT1AQkJCQUE7PDhAQ0NARD87NV+MjIaFlouUlZeYl5ifpqellpWVkZebn5ual7mxtrO5vLy5urWqsryxvsG0vMe5uLuuv6fGw7/KxsnIxcXJvMLHx7+xsKe8vL7FxMbJx8XGu8TAxcbAua+9vMC+vrOrqoyzu760tbfCuq2vsLWqq6aqo62kp7G2q7WyrbOtqK6vp6awr7Ktqq+zpKu1qaeopKCgnqmyuL61tbWqqaausre4t7apq7i8ubexr66noqOop6SfqKOfnqCZoZydoqSnp6GelJuaoKGlnqChnpajnZSQlpiboZqflpORlpSin5qenJudoZ6kn56VnJiPkpOPjImTkJefiZCWkZuUmJGRlZaDjJWXlpKLjIh8f4N/amZoYWttZm51cXJ1cWdeX1xSSUU/Ojo6Nzg0ODw3NjU0MjMzNjU3PDo7PDs9QD4/QD48PTk5OTs6PDw+QkRFPj49QENDQkREOzo4QUJCQUNAOTJbk4iEjZGKi5GRlZCSmp2fnJOSmJSdnZqXmpW2sbm1tb6+tri1uLO8vMTEusPHwb+0s8XFxr/CzcfLzsvLx8HDxsfIysXExcO7vLzBxcHFxb/DwsbFwLGTvrq/w8K2trqptLO0qauzu7uxn5uxr6ykrK60p6qpqKqtrKmmpZ6pr6uyu7q4u7e5t7O5uLOurLO0qrC1ub3Bur6+vL60urm4u7qysbS8u7q7s7Oyp6Smq6uioaCdmpudmpyXmpuenJygnZaclpuZnZ6io52UnJCNiY6OkZ6bnJWNh5KLmJiWmpybmJybnp6cmp6UjpiYmpSRmZeeoZWYmpKXlJWRlJqYk4+TnZaSi5F+enx/dGtsbmRvbWlxeG55aWlhXGdhUUZEQTw5OTc2NDQ6ODQ2NTMzMjY1Nj05OTs7PT47Pj49Oz05OTs7Oz89QUNBQkFAPEBDQ0NFQjs4OUQ/P0BCPzsyV5uQkZCQh4WSjo2IjZCTlZGPjZSUm5STlpqRs7e4uLi+u7C1sri2tbbAw8G+w8LAvru+u7u8xMzEzNDLxsa/xcfLyNTLysjGv7y7vsS+xcjGxsTEw7i0wLe0vMHCucK3t7/Au66lrre8t62co7ewpqy0tayupaSjqKSgoKWZqrSxvsG+urm6uLW0srG0tLO6wL7Av769u7u9vsDCt7a3tru7sru+ubi3u7a3tKyoqamrpqijnpOampyYkZKZl5GRmJqXnpiWk5acm5+elJOJiX6GiIuWlJiZkYmVkZeWlZmbmpaYl5idnpyhmJWZmZyYl5ybn56jnJ6WmJeTl5yZmZyUlp2UlpOJdnl6e3Zua2lndVpmcnhzeWZmXWRbUlhJRj87Nzg4NzYxNjk3NDQzMzM2NDY7ODo8Oz08OD0+PDo7PDs9Ozs+PkRBQURCQEBBQkNDREM9OTlCQD8/QD89MkyWmpaSk4yKmJCKi4yOkpKKiIaNkJiKj5CUl7O7tba/vb2xtrjBvby0uL/Bsbi3vsHFvbu8wsbJv8jOyMHEwcfKysbKxczIzcbJxb/DwMvNz8rGxMPDwcS+uL7Bw8DEv8HPz87Hq6+2tLWroKe0s66ruLWzrKmjoa2prKatn6y1tL/Cvrm4vbawrausr7W0ur7Fv7u8urO5u7i5ubWtsLS9u7G/vLiytrmzubu0ra2orKyqqaeXnpualY2MmJSTi5WWlJyZl5WWmZKYn5mQiop+iYqKkY6Vl5OUn5mWkJSZmJmWmJOUm6GeoZiYmp2ZmZaenpibopqdnJuYmpuZlpeXlpyZlJyYfoB4eXV1ZWZpamhdam9teHdjYmBgXlhXRkU4Ojg6OTc5NDQ5NzY2NTEyMzM0Ozo9Pzs9PTo6PTs8Pjo7Pz48QkBDQkJFQj0/Q0NDQ0RFQDk6QkFBQj5CQTVCkJeUlZmSj5qQjpKRjZSVi4qHjI2UiImPkpq2u7S8xsHEwr3BxcLAtLO9v6ywr7rDysPCvs3IxbfByMW/wcLIy8rCwsTJzM7Pz8zDx8bIycjIycfFycfIx7/Fx8TEyczK0s/Tzry4trS4uMG+vrq9ury6vKytpqq7urm3wLK1uLLAxrq3t8Gzsa2tqau1s7u2w7a2vbWxt762s7e4sLW2v7uwvbq0q7CxsbO8urOzrqutq62xnaOjoJqQjpiXlZCclpaYlpWSnJmTm5+clpGUjpWQiYyQlZOUm56YmZKSnJedlJmSk5aZmJ2VnJ6do5yVnZ+TnKKcnKCfnaOemJSVl5ebmpmgkH99cXRxb2NhZ3Zoaml0bXhsXWRbVmBZTEhDNjw5OTg4OjUzOjY2NDQxMzUyNTs6PD47Ozw9PDs8PTw7PD49P0E/RUFCQ0M+QEFARUVERUE7Nz5DQkI+Q0I4O4+akZaalJKUjZCUlI6VlI6Pi4yJk4uIkJObt8C6xsXEw8zCwcS9vrWvt7uvr7O6wMfFxMHMy8W2ucDCwsTHytHLwsPExsnFzNDOx8zJwsLHwsvLyMbMys7FxsXDxcrHytDN0MzHxMDDwsnNx8XBxMfBvL60sLCwwb6+wca/vri2w8K6urbAvrWyrKmvsri+tMC0tLi0t7nEua+8vrm+v8K/tbq2q6qsrq+wt768trSura2utaSlqKimmpycnZyeopydmZOQkp2VmKCdmJiVmZmZl46MlH2QkJefmZmYk5GToI6Nko+VjpCUlaKdnKSem56elpyjoKGipKOkop6amZubnJ2enIN9cnx4cGdgamp2bGlldW50Yl1iVFdVU01HOjc7OTk3Nzo3NDg3ODQ1MjM0MjU7Ojk+Oj08Pz04Oz05OTk9PEBBQEVCQUJBQT9AP0RFREVAPDk+QkNCQENBOjSAoZeUmZiVkImUk5aTiZGMlJGOiJaKi5CXnMXLw8O8wMPHwbm9vbu4tre3rrK3uLzAwsDCx8bHurzAwsTHyMbSycHDxL+/vsTLyMrLyby7yMbIzcjDyMnJxcXDwsDFtcLJysi+xcfIzcbLz8W3wMDAwLu6vbWzs7+/ub/DucC3u8G8uri7ub27srCvsKy5wri9ube1t7q9xb24xsjCwcLGwr28tamurrCwr7O6t7m2sK+tr7OppquprqannqSlo6OjoqCblZiekZecl5GRlZeZlZmRlJiSlYyYo5qcnp2FiZ+TfJKWlZKUlJennaCipJ+en56foaGkoqKjoaOinJ2fnqOhppl5enl/cnBmZWZjamRham1ub15ZXFZWTlBKRjk5Ozk3Njc3NjM3ODk1NjEzNTI3PDs8QDs/PDw6ODo8OTk4Pj1APz9GP0JBQz89QT5ARENDQTw5PENBQ0RBQDozbKKdlZedlo+PmJiZmIiSjZGVkI+Vjo6TlpbKy7u5urnBu7q3vsG8vLu5sa61uri4u8S6vsC+vru8wMXBxsK+xsK5u8O6uLm8vsHHwca7ucfQysTEwMPBwsHDwsO+v6G3wcHBoLrHzMvFyNHCsL6+uLq7u763tLC5vrO8vrG5tbi7tryztbm2uba5t7GtusG6vMG/t77Ev8bDw8fHwrvAwr/Cv7iys7O1tLGut7S3tbSxrK2xp6Wlp7CtqJ+nq6ajqKWmpqCgn5SYmZSRkZWUl5OYl5qhnZ6hnKGdoaWglpSbkZeXmJqTnpmZqaSlpKWdoqCanqCkoqOcoqGjoJ6cnp6ppaiVfXuDeG5mYWRiYWNkY2piZ2NbWlpcWVFPRT07OTo7Nzc5OTY0OTk6NTMxNDUyNzo7OkA9Pzw8OTc3Ozo5Ojw+QD8+RDxCQURAPz49QkRCQkI+OjlCP0FCPT44NVmfnJiTmZaRlZiYmpeQkZCQk5GTlJKSkpSUxce4tbq5wrm5vMPFwri7ubGxtry6tbnAu7u5tri0tLW/u72/ub66urTAuLW3sq66u7fAt7zL1Le7wMG8u8W9u8HEv7+Sp73Cu3qpwMnEwMDKwLHBv7u3u765tbe0uLy0vbi1tLCzvLG3tri/tr25vb65t7q+u7/Axb29y8PGw8TAw762ubq2v7i7v7y4trOyq7CwsrWzs66sq6emnqeurauiqKumpqqjp6iqo5+Ym52bmpicnJiXnJuhpZ2anqGhoKGmoJqbnJiboJ+dnJ+coKiho6SknaKfmqKgop+el6Shop+dmpieqKWhi3x5iH1xY2BiY2hqZ2ZpZWleVlZUWU9TTEY4PzY7Ojc3OTs2NTo7PDYzMTM0MTc7OTg/PT47PDs3Njk5ODo7PUA/PkA9PT9CPjxAQUNDQT9DPTo2PEBBQDw9ODdJlJibj5OUkZWYlZGWkpWRkJGUlZSTk5OYlcHCwLq8ub62uL7EwMKxvbqytLO4vLW3vMC8vbS1sbC1t7W7wbi+ub+8vLe0t6+ut7W5v7vB3pd+ybzDtbrHt7a5u729ipu9xrZglcDFwL+8wb64xrzCv7zFuLa3tLi2tru7uLa0t7q1tLi8vbm/ucPAwLu5vLu+vcjEvcfEw7rAvb62sra4srm0usLCureysaysq62yr7Kur6ijpJ6rrKyqpKakpKiqoqemraihoaGmn6Oiop6bnKKfoKOdnJuhn6KgpKCem5eZn6GdnZ6eoaWkoaKioZ6ho5yinqCZnZijn52eoJqZoKKmnYR6g4F4cW1lZWZvaWVraFhYTktLS1JJTEhDOT44PTs2Ojs5Njc8ODk4NjA0MzE3OTk7Pz0+Ojw6ODg5PDg6Ozs7PD1BPj09Q0E8P0NDREA/Pzw6Nz5CREE/QDg4P4mYmoyMkI+Tl5WMkpCakpGXmJaUlJKQmZTDvsbBwby8uLi6v7a8scK2tLyxtLa4s7q9v768sq2vrLGwt7y3u73BxLm3t7a1ubm6u7+80Mt9gLjEx7e5uK63tbi9tYCRvcisVnzAxsDAv728v8jDxcW+xri1srK9uLi4vrq6uby6urS3u7q5v7zEwL+5uri/ubvFxr3Fw8Kyur27sa+2uLO3s7q+wLm2rLGrrqmqqa2qqq6mpKWnrq2ppaOio6GkpaWmoqato6Klo5+ho6Gcmpyhn6CloaCenZygnaWgnpeVmZ2fn52gn6KmpaCknpybn6Ofn5mcmZ2epJyWnKOcnqGcppZ+f4d8a25wZ3Brc2ZhbWBcVElLSkRKQkNHPzo7OD48Nzs7OTc4Ozc8PDYyNzUxNjk8PD08QTs8Ojs6OT45Ojs9PUA+RD89PkRAPz9BRkQ/Pzw9OTc/QUNCQEI5Ojl3nJiLh4uQkpOWjY+TmpOQnZiSkY2PjpiSvbfHvsO+vbu+vL22uri9ure9s7OwuLi1uby8wLeqraSusLe7sr2+u8S2tbi1t8C+xLzCxNaqdHeQxs/CwLivtbW7w6p5ib/JnVVmtcvDwr+/vr3HzMfHxMe9tbW2wb27u7/CusDCv7y2t729vcHBwL+8ube8wru3v8W7wr++tbe8vK+vt7awtLO6ubq7r6mtq62rrKaqoqeuqKWqra2vp6Sgn6ajnqKjqKOjq6Oiop6dm5ublJaZnJyfpZ6fnpmYnpejoJyXmZqZmqOjop6jo6egpqCbnaCjnp2WoJmcoKCblJegn6WcmKKQgYaAcmZsaW50bnhjZ2JbY1FLVEhFRUNIQzw7OTg9Ojc6PTo4OTs3PD01MzY1MDY4OTo8O0A9PDo+PDk+OTk9Pjs/PkM8Pz5APz4/P0ZEQEE/Pjo3P0BDQz9APTo4ZqGYj4uNlZKVlY6PlpmVl5uVjoyMjY+bk7m2wbS/vLm8w8C+wLq1trKywLmvsry8sLe7tru8qqqjsbm8vbK8vrzFuLG3ub7KysjDxsvOinN0jszRzMrEtbrAxM6XcYXBx5BYWpfOxsK/wrzAw8zKx8XGwLm9vMS/v7/CyL3Hx8XFvLrEv7vBv7rAvLu7wMS9t7nCub69t7S2uLqur7WxsLCytre0t6yurKqsrKuoq6Gms6qlra+trKippaOkp5+io6Onoaeiop6cnZyamYyQlpeZnaKZnpuVkp2UoaCdmZ6fmJimpqKfoqKmoqeloqCko6GbnaCbnKKfl5WVnp6kmpafiYGDgXRvbGx0a2xuX2JeYGJOSU0/RUA/REM7Ozo6Ozo4Ozw6OTw+Ojo+NDQ1NTE5OTo5PDtAPD89PTw4PDs6PDs7Pz5DPkI+QD89Pz9FRUJBQj87Nj9CRUQ9QUE6OlmfmJOSlZqVmpOQlpeclZuZlpSVkZKTnZm2uLaxuru6vsG5uca7trWypb69tLbBv66zvbS4wbGwsbS8z8y8ur68xL63vbywr7+9wcvJsXp1eo3GzMvNysbCxMvThG2Cv76GXlh6ysbEwcG/xcDKycPDxMO5w769ub+8wsbCyc7Hxr66xr26v7m3wLm5vsDCvrW0vLi2u7CvsrK1r7Cvrqyus7CzsrirsbKxqrCrq6yrrLatqKyusqarrKmpoaWgpaakrKSmoaChnqGgnaCMlJeTm5+mmZ6emZOYnZ+gnp2eopuYp62ooqSgoKKqpqmhqKGlm6CgnZ2jn5SYmKKdp6Gfm4J7eoh6bW13e19wY1tdX19UST5DRUlCQz5DOz42OTo7Ozs7Ozs7PT05PTU2NjIxODo5Ozs6QTs/PDw+Nzs8Ozw9PTw9Pz5BQUE/P0FCQUVDQkRAPDY+Q0RFPkJEPztTmZuZmJ6dmqCalpyZn5KdlZ2boJWWlJqYur20sLu8wcTCv8XGura5sqO7vbS3xLuwtbq2ucS4tLy2wLjL2L2+tr/Av6+Fdm97doSXtJlxeXuPv8fLyMHDwcDJy3Npe7m0fGFXaMbGxcS/wMG/y8fCwMjAusK7urO6usG+wMrOysS9tby8ub+5ubW1s7/Avre0s7S4rbeqr7CwsrGvq6+nr7ausrG5rra2uLSzsLGttrS6sa6srranrLKsraSjoaenqLKrqqWkp6elpaCml5ujn6SmraKeo6KanaWiop+foaWenrC0sKSlnp+kqaevp6mgq6CiopqipJ2anqGmp6+psZWCe32Cem5zeHNncF1bXl1ZUkVEQ01JQUU9SDs7NTk7Ojw8Ojs7Oz0/Oj01NDUxMjc4ODs8O0I8Pz46OzY6PTo7Pj0/QD87QUFBPj4/QkBBQkJFPjo1OkFCST9AQkA7TJqdnZ6fnZienZmampySoJWbnp+blZGRl8W+urbDvMbCvr/Ixbe1uLe2ubu0r7e3srWzt7m8u7a7u8VyfMHMvLa5w62HZ1tjXlBbX3B/b3Z8krq/xsC5wLy+xsJlYXKts3VhVmHBx8PDvL2/v8PDvr/HvLy/tLSutbW8vr/OzcvCt7K4uLi9ubuxtrLIwLu2tLGwt6yzqbCtrbS3r6uuqrG1r7Gvt7O6usC/tre2sru6wLWyrbO3rLC6r7KloqWrrK+5s7KosK+xr6qiqKGkraitrLOun6inpqWmq6Sknqaqo6ayuLOrpZyfp6anrquqpbClpaWbpKOYn6exrLW4sLKOhHl/fXZsdXtwbmlbX2BZU1BBRkhHS0BEQ0g8PTY7OTk8Ozo6Ozo9Pzw9NTU2MTM2OTg8QT5AOz1AOzs5PD04Oj08QD46Oj49Pj09PkBCQkJBRD03NDU9REc9Q0I/PEWUnqCgoJyXmpiYlZmdmZ2fmp2bnJaRj5LDwMK9wrzEvLy7xbu3s7e2tru7s6CWtayvsbS0tLa4ucXKdGeGtb22tp5uamdVX1tJTFFTXm9zgZ64uMK6s7u3u769YVpkoLR3XVRnwsPEw768v7u6uLbBwrW/urWur62wvcC5z8rJw7GwtbS0vbq+ubq7ysO7uravsL2xuK+ys7C3vbaur66wt7CsrLK2vbzEwrq9t7bAv8G3tbC2srGzurGxr6err6u2v7e1qbqztbmxp6uop7ausrG1uaisrK+qr7CqqKessayytr20saykqKuoqKusq6i2qaaonqadmKOuvLG7wbSmiYF8gnpzdXZ3bnFgX2ZdW1RKPT8/RkY9RkNDOTo1Ozk5Pjw8Ojo8Pj4+Pjg4MzE1Nzg5Pj9BPzs6Pz08Oz09OTs8OTs6Nzs+PT1DQT8/QUJEQkE8ODU4PUNGPUREPzw/iZ2en52Xl5WUk5aZnpubmpuYlJ2Uio6Owb7Dwr6+vrm2usCxtbGzt7fCtbOrrbOoqa61r620tbfHxnx0aYWltphiU0VfUU1pZVNMSFBxeIihsLe+ubK1sry6u2dVV5i8flNQcsHExsTAvb+5s6+xvLquu7Szpquorbq+uMvCv76sq7Cvs7u3ub67wMXBu7y3sLXEtb+0uLu0u8PCs7a2sbisqaWrsr23v7+7u7exvL28trGvq6uprbOvsLCrsLSpuMC2sqm0tbC3tq2spqu7s660uMKwsbG1sbK1saywsri4ubi+tLGzrqyxramvrqqyuK6trainoZ6ptr+4ur+wlol9gHxxdHd0d3JsX2NhW15PSEI/PUhDRk1DQDc3NTs6OT48PDk4PT47PT86ODMyNTc2OD8/Qj86OD4+PTw5PDk7Ozo8Ozs6PEA+QkI9QEE/QkI/PDs3OjxBRD5CQz8+QYqgm6GdlJiVlZKYmpyWm5WalY2bj4SIhru0vb+7vLm3s7y8rLOytLS2wLXAr7Kzqqqxt62pubO3w7mFem5ujqBvT0lCa1JDXHuHh1tGV4imp7C2urW0sqy8urp0VVCFt4FMVIK/wcfDv7m6ta2lrbaxprCtqJ6gn6WttrXCt7a0pairqLC2s7K6tbu7u7W4trC1xLK+vL+8ubrFybq9vraxp6SeoamxrrW5trKxq7S3trGopp6gmaWmpKynq6y2qa+6sa2kpq2lq7GrrKmtuLawsrjBtrGxtbGvu7ayt7W1sry1urKwsbKutLKqrq2nuLWyta2uqqiosrq9wLa0qY6Ce393b3tvdXJtY11mWFxdUk5OQT5KQkFKSUA2NjU7Nzg+Ojs4Nz4+PDs/OjkzMjc1NzU8PD48PDg+Pjw8OTk5Ozs7Pjs7OTw+P0E9PEJAPz9CQD47Njc6QERBQ0E/QUKJoJ2loJSWmJiVnqCcl5uYmZGMmYmDhoS1r7S7u7S1sLG2uq6wtLOvtbq1urC1s7KttrqvrbyzuLq9kYF3coV+V0ZCV4hRS05hfYd+UUNPhrqys7WytK+su7q6hGZbeJ+BXHGXubu9uLaysa2roK2uqJ2jpp2WmZman6muuayrq5+lqKSrrq6nr6yvsbGtsa6usLmwtLy+uLm4x8W8vLu4qaKcmJufp6assq6zqaapqq6popqXl5GcmpijnqKir6ekrKaompqemqGnp6anqa+2squ0trCqsK+xqbm2sbWxrqy3s7avrquuq7S1ra+rq7GtsbKoraurs7W3ur2wq6GLeoJ5cnZzbXRpbF1balRdXFBNSERGTEJGTkY4NjY1OjU6Pjg7OTc8PTo7PTo5MjM2Nzc3Pjs9Pjo6Pz48PDw6Ojs5Oz47PTk8Pj1CPDtAP0A/QT8+OjU1OkBFQkRBQEJBiJ+ipqGYm56dmqWpmJudmpmUjJmHhoeGrq2uuLmxsqiur7iyq7CwqrK1ubm+tbK4tLm6trm7tbWyv6GHg4R9ZkxAVXpwTEpMToerb1Y/c765s7SysLGtsLq3q46DdIWlqampra64r6qrrayjqKy0p52XmKGVkpWXkJifqK6ko6Sgoqeio6mpoaanpaqtp6ynqKesq6yyu7SztLm6trK2ramgmpaWm52fq6yqr6Oko6GpoJuTjo+Qk5KSmZaanaSloJ+ep5iVkpSZnqSjoaWqrK2iqaqppKmtrqW0sa6xraqprq+wraWmqqSos66trKmmpqmrpqqnq7Ksr7Oxq6mWgX+Bd3J4aHRzbmRUYGNXXFFOTEhASFFETUM9ODg3NTo3PD46Ozw4OTw7Ozw7ODI0ODk3ODs7PDs4PD0+Oz08Ojk8Ojs9PTw6OkA9PDw7QD5CQEE/Pjk1ODs8RkFDRD9BQYijpqKjnqCfp6Coqpufm5yZmI6Xi42PjKqpqLGvsK2lp6ayr6mmq6CvsLu1vby4wMG+vLy8ua6sr7Wqk42Qm2NFVp15UldIUWFJfH9jY3euubKss6+urK23qZWNnaSppJ+cnJ2dp6ieoKiooam3sZ+Wl4+dk4+Qlo6Xm6SooKCioqKlpZ2jo6CepaCkrKSmqKSio6OrrLOuqa6urqeqraisoZyamJmYm6moq6ufpqObo5yVkIyPj5CTkJeVlpifnp6amaaXk4+Slp2ioKWipqSnoKKko6Ghq6uksq2qrKyno6yuraufoaKkpK+srKmmo6KqpKqqpKmrpqmsq6agiHiDfHZ/emN3bG5cUWhUUE5HUE1MQk9RQD47PjQ5OjU7OT07Ojk9OTk8Ozw8OzkzNjk5Njo7Pz06ODs6Pjw6PDs5Oz07PDw9PjxAPT88ODtAQEE/Pz45NDk8N0FDQkQ9QEOOqqSjoqGinaulpqimoZ6dmZ2PmJWTkJWnpKGmqKmlpKChp6uhnKKbp6u1sry9wMLCwL7AuLSnpKyqubKeorVRQXqdd1hrSlVjaXZ1ZGp6nbK0qrK0rqqrqZKUq6+nnZCXk4+YoJ6hoJykpa2nqaCalpeMl5GNkJeTmJ2iqp+fn6Cjpaicn6ChnKKfo6innKehoKSfrKisrKCpq6agpKimrKOdnp2Zl5qrpqqxo6WonqCclZOQj5GQmJCWlZiXn5ibmZukmZeUlpqdoJ2nqKWgo6Kho56doKmqpa6upqipoaKqrqqnoaCio6msq6eppqShqaKlqaalpKKmpKijkn18gHV2fW1re2RoVVFjTUpIR09STUpORzxFQDwyPzg1OTs+Ozk5Ozg6PDs7Ozk5NDg7ODc7Oz48Ojk8Oj07Ozw9OTw8PD49PUE+QEJAPTc6P0FCQEA/ODU1PDpAQ0BEPkFGlq6koqWeo6KpqKipqqWmnp2imJiZmZWbop6bnqOioKOgoZqgmJeXlqGorK62t7q5ure3u66ooKGooLDBub18T0tsqlxqfnF2U15vYWBtaICWsa+us7Wqp6Gho52ZlI2QlZeYmJyfoqKbn62qkJeXl5eWkJKRkZOal5ugpKqeoaGepqeqop+gp5+dn6SnqZ6jpp+qnaqtqq6nqLClo6Smp6ymoaShm5ier6iusqulqqqgmpiYmJWTlpqTlZWalpuXl5ihn5ycl5uhmp6ao6eln6GioqOdm6Gmp6aoraOppZ6kp6mkpaWhpaSsrKmmq6eioKSjpKenoaCgpaKmoIl7gH13eHxkeXlgYlJVYEhJSktTVElSUEw5P0E2Nzw2NTs6PDw5Ozs4Ojw9Ojs4NjU3OjY5Pj0+PDk5PTk9PTw+PTs7PDo+PTw/Pz9APT03Oj5AQEA/Pzg2NT08PkFCRkBAR6CupKaroaOqrK6tp6ypqKCipp6bm56aoJyalZmfn5uen56WlJOXk5KcnqSorq2sq6uvqq+pnpeepZ2hw8GAVVZmcH12bWZ6clRfYmRqbGJscJS0sLC4rKahnZ6alZiamZCOkZWRjI6OlJyjjHaXmpqXmJmUmZiWnZufpaapoKajnqeurqumorGjmqSmpqqioaqiqaSosquxsqu5qKarp6urqaysp6Cgo7GusrC0qrKuopmcnZ6hmZubmpiZm5SWm5aZnaWhoJqjoZqcmZ+kop6gn6KmnZulpqWkpaijp6OepqOinqaloqWlqKykpq2noJ2dn56gpaGenqWgppmBe4F8dnZzaIJsZVtTWlpNUUpOT1VMU0xBNz5DNzg9NzY6PDw9Ojw5ODo7PDo7OTc2Oj01OTw7QD03ODs3PTs9PT06Ozw4Pj09QD5BPj4+ODg8P0BAPT43NTg9Pj1BQEZAQUihqqCrq6GkqquwramtqaelpaWkoKGfnqWXl5SYmZ6YnJ2blo+VmZKRnJihnaqip6Cep6Gln5ySm6KanrGlkHtthnBiZVdRXFVXS05VWlRPX1lstLOrr6efnqKgl5GUm6CbmJeSk5+coaSYhmx1nZufl5uinqWhnqSfpKitraisqKSstLe2sKe0rKKtraOvpaSmoamorrWzsr23vrCssa6tqaq0sbCoq6iytbezuK2ytKSgnaWfrKGhoqCgmpiWlqCbm5ikoaCeo6GgnpqcpaCfnZyhqJ+fp6meoaOkoKagnqehn5ymo5+ipaOooKmrpZ+dnZudmqainpyjnqeQgYJ/fHh1and1XWxaUmBIUlVIRlVWSkJMRz1LSDhGPDc3Oz49PDo8OTg6Ojs6PDk2Njo8Nzs+PT8+OTc9OT47PEA8OkA6OkA/O0A+QUA9PDk3Oj5APzo+NzU4PT0/QUBEQEJGnKueqamipamprqimqqWmp6aoqqGlpKOmkpOVmJacmpqcmpWTmZuNk5+ZqJ2un6eenKGdnpqZkpiem6GhoaKEZFpfaWFWTlBGPz9BREVCR1JMT6i2qqmkn5+ZkpKUmJiWlZWMiIuOlZ2dnnlhhp+Zpp+gqKWxqqeuo6uttrC0srGutri9wLqttbSwt7CutKmmpKWsqbmztbvDvMPBtrq2q6+xube8r7OwtcG8t72zs7WirKKpqLKpq6inqJqZnpqqp6CZp6Cfn6enpaSfnaqiop6bn6igpKetmZ+jnp6nnqCmnpycoqGbo6KhnZympaWkn6KZnJukn6CboJyjiYWEfnZybWl2bWhtXFhcQ1dOSkdNR0JGTTw+TD40PDk2Oj0/PDs6Ojg4PDk6Ozs8NTQ6PDg5Pj4/Pjg4Pzk8Oz0/Oz1BPTo/PjxAPj8+Pz08Njs/QT07Pzg1ODw8QERCREFCQ5WqoKapo6mqqKmjoamgpqinrK6lqaWpqpSSl5mUmpqanJiYmZyamJmqoLGit6Swpp+enZ2XmJWZnpuco5+ZgV9eZmBSRUU8SzxGPEI/PkBBTXqpramqpZ+enqKjnp+dmpyblJOVlJ2emJZ9dJOimqukq7KwubKysbKxur28vLm2uMO+v8K/trq7wMS5vbusr6exrbHCtrjCxsDIysDKv7C5ub25wr64s7vGw7zDvLezqbOtqrO1r7Ouqq+jnauntrGtorCmoaOvsa2wpKWvo6GgmqGnoaSqqpmdoJmao6CmqKGcnqKemaSenpiYo6OhpZ6mmZuipJ6fm5ubnIeGgXt0cmtrdHJxaFZcUUZUSERKUEk/RUE0Rkg5NTs+Nzs8Pzw8Ojo4OTw4OTs4Ojo4Ozw3Oz49Pj02OEA5Ozs9QDw9QDk3PD07Pj0+PUI+Pjc6QUA+PD45NTg9Oz1DQEFDQkGRqqGlqqelqqimn6KnnKasp7Gyq62jqayVkpWalJecoqGbnqCinJ+psqu7sr+rr6ylnqCgnJyYmp+gmp+giXZqYVdORD9MX35sX0M8MzVLe6qyp6OjoaCepaulnpeclJGZnZiUjIqGiIZ4b4KdpKKrrLS8tsO+vrO7wcPCxcC/wsbGxcPIwsDFx83QyMvDsre1vrK+xbu+zM3FzMzM0se+v8DCvsfGwrfEycnDwca+urS6urW7t7C1sqq6sq67t7+7uqq4rauquLq0vK6uuaOmo56mpaKjqaaZm5+Ymp2nqqegoaGkmJSjlpSZkZydn6Sep5+en6KdmJmUmJSIhH16cWtjaG94a2VaW0ZLTEVEU01EQkU3Oj87NTQ5OTc5Pj87PDs7OD48Njo9OTw9OTw9Ojs9Pj4+NztBOj45PT45PT44Nzs6Ojs/Pz1CPj83OkFAPTw9ODY2PDo8QT9BQUE+kqugp66ooqulpKKipaGlqquwsq2upKmmlJWWmpaUm6SmnaGqp6KrrLy8v8PBsrK4p6Ghq6qhnJ6hoZ2cmXFqYFVJRUBBUo2epIpQR16NrqyhmZubnp6Zl5eXkoyOlpeTjo2Qi4KDgndycW1xjqatrrS5xbvNx8u/wszOzczHydHMzczHycXFzNHS1c7Tyb3Av8O7xsXIxdHTzdPQ09PMysLFxsbKyM6/yNHMx8XHxcG8w8G/v7+2vrOuv8DDw8fEx8Suv7iyuLzDwsK6vLy1rqenraigoqmlmpagmpmdqKupo6SknpePm4yQmYmVmJugn6OdnZeempOTi5WPhYB5dHNlYmdyb2ZeWllDTkxERVBJRENANTU1ODlCPTY4OkE+Ozs+PDk+PTc6PTk6PDg8PDw7Pz8+PD0+Qzw7OkA9Ojs6Ojg4ODk7QT48QD8+ODtBQTs7Pjc4Njo8PkI+Q0FAPpOvn6ivpqiro6KloKampKuoq62qrqKqo5Kcl5ebmJuirJ2frqalsarFxszOzb+wwaikqKytqqCdo56cnpRlWFBMRURBRl6+1sOjk6OzrqOenJ+al5aUkpSWkZCPjIeDg4iHg4CBgYB5cXJvbHmktrq5vcvB09LTyM3O0dPR0tHQ0dHNzs7Qxc7U1djS183Gx8nMw8XKz8rT19HX0tXW09TIzMbMzcnSzc7TzcXIycrBxsvHycjGv8Ozs8jEy8vLz8bKv76/vcHHxMzMyMnAw7+tr7OonqKqo5qTnpyYnqaprKSlppaXipWFkZSHkpKSmZualpiQm5WQjIaRi4B6cnV2Z2NndmlkVldRRE1GQElRQj1CPDoyMkE8RTw3OTxCPTs9Pzs7Pj05Oj48Oz44Ojk5Oj86Pj1APkA8Pjs+Ozk9PTw5Njo6Pj08PEE/Pjk6QEE6OT44Ojo6Oz4+PEE/QT6QrKKiqaanqKSfop2qqKOso6OnpqyiqZ+To5iWn56dpK6bn7CrqKyxyc3U18/Gu8esrbO3rK6jnqOinaGbXExDREZES1V4urirr6+mnJycoKShnZqUk5WUiX13cGtlYmhxb3F7hYqAdXBucXRwhbPCvcTR0NfW1tLWzdTW19TT0dPU1NPP0cPQ09bY1dbSy8nO0cvGzdLK0tXW2dXX09fYztLKz9HMz9DN09C/yMfKxMzMzM7PxcbHtr/Kv9LNzM/Gyci/xMPIzs3Q0c/NysjNuLe7qJ+lq6eemJ6jnp2qpa2pqKiSlYiQhIyRho2MiJOVmZCWjJiSj4aHjIR8eHN2cGNgZHJiXVJcSUpHQUVJSj47QTg9NDU4Njs4Njo8QD47Pjw7OUA7OTo8Ozs8Nz09Ozo+Oz08Pjw/Ojo8Ozs5Oz89OTU7PD48PD0/Pz46O0BCOzk/OTg7PT0+PzxBQEQ8hqugnKegp6Oim6CbqaSlqaCfoaGmn6ifmKSimqmmoqarmqOwsamotdDU19rSx8bLtLXBxbG1qKGkpZ+io15FO0FCSVpsmq6sqJuUl5+cmqCgnpucmZWJd2ljYF9fX19eX19dYmx1dHBwb2xycXWSxMfF1NbX19fT1tDV1NrU1M7P1dTU0dHM0c3T19bT1dDP0tPRydPRyNDX19jR19LY2dTWzM/Pys3Sy87QwMbDyMbOzdHR0snMzcDKzMbTz8zOyMTKx8fIzMrU1NHVz9LM08K5xbGlqLWup5uorKWdsqiws6ysk4+TjoiKj4OPi4SQjpmNk4+Zj4+ChYx8enFzdG1hY2ltX1ZQX0pKQ0ZDUk0/PD41NDo9NTI4NTU8PEA8Ozw6OTpAOjg7Oj46PTg+Ojo8QD08OTs9Pzk6Pz07PTw9PTo2PD0/QD08PT0+OjxAQjs5PDc0Oj48Pz89RkFEPYKknKClnaWlo5mcnaSeo6OfnZ+doJqnnpyhqZ+vraqqq52mrreoq7fX1NXZ2dHO0L+8zMm2vq6mqqiho7BzREBBP1NtnbCon5eVl5manJ+dmJyckn1wZWNiX19hX19hYF9gYF9gZm5wcG5rb3J3d5zLwNLV09jY1tnR0tLXz9POy9LN1dTSys/M09bS0dbNz9XV0cXR1MrQ1NXWztLQ2NjX18vIzsTJz83KzMDJwMjKzc7Qy9DOzszOz8jL0NHLzsrCycfJzMvM0tPN09HR0NDKvci5sK67uLWqtrCtqLits767sZqPoJSRjo2IjpCFkY2ZjJGRlY6RgIWIenZvcG9rYWRucGFXXFpJRkZETVhFO0A9MzM8PDg3ODY1Oz5APTk8PDg8Pjk8QDtAOj04Pjk4Oj88PTg7PkI6Oj08OkE9PTw6Nj08P0A9PDs9Pjg7QEE9Ojw4ODs+PD4+OkVCRT6Bn5mlp6Cfo6eam5+cl56eoZqdmpyappufpKefuLa1taykrK6+tLDA2NLX2tzWzs3Kw9LPwcCwqaytqaWqf2JnYmmHnZ+blZOWm56enpyTlpeUiGteXl5hZGJgYGBhYGBhXmBfXlxibXJvb3N0dnZ5pL3L1dHW1NPY1s7O1MvOzsXOytLSz8fOzc3Uy87TzcvX1tDM0dTLzNDS08rO0dXS1dXKwMrCxczCyMnDzMPFyMrKz8rNzNDN08vGyM/NyMfLxcbBxsrMzdDRxtDOzc3Mz8XHwbi5vcPDvcO5srK+sbvDxLWqmKWimZaRlZWSi5SNmpGUlI+PlIKJhnlxcmttZ2BgcGhZWGhWTEZMSVBRQjtDPjs2Nzo4Ojo1Nz09QTw6PD05PD05PT06Pjo8ODs9OTtAPD47Pj5BPDk9Pj1CPTs3NzU/PDw/PDw7PDw4O0FAPDo8OTs7Ozw9QTpFQUU+hJ6bqK2epKSqnJ6fmJKXm5+am56ZmaKVoamppcTCwb+7tbKxx8K4y9XV2drb2MzMz8jW1cTCta+0qJ+tiXOEh6HDqpaMjJeVkJORkZWWlZCLfGVhYmJgXV5hY2JgYF9gYWFgX11bXWdycnFyc3BtcnmkxtPPy9DP09TKxcnJxsa/w8bPzsfFx83K0sjLzs7G0dLQzczUysfLzs/Ix8/Sy9HPxrrEv8bJvcLHyc7FwsjAx83IxMzKy8/IxMTQyMbCxsjEv8HHzMzMz8LKy8jHy9DExce7x8PIycLPwb28v7DByca5vaqwsqelnaKcmJCbkKOZl5mRlZiJj4J3b3Rka2BeZnBhW1dgR0hIR0lNVEc/Sj02NDM1NT09NDg9PT06Oz08OTo7OT89OTw7PDg6PDo6QD1APD09Pjw6Qz48Pz04ODk6QD4/Pjw7Ozs7ODo+Pzw7Ojc5PD49Oz49RkFDPYOgm6qupa6qq5qdoJeUjpedmpmgmpqcm6WysazJzcrIxL68us3NxtDV1dna29jQyc/P0dPIwra7u62ktXNjf4C2rJCOjZaPhYODg4F9hIR+c2BbXl5eYF5gY2RjX11dXl9gYF9bWlxha3Jyb29rbG9wfbjRyMnKz8vNxLrAw7u7urq+ycbCw8DDyMvJyMrIwcXMxsjLzcnEwsrJwcLM0MXLyL+5wbvGyL6/xs/Lw7/Du8nHyLvIxsXKwL3Cy8bFxL7GvbzAw8XMxcW8wMrCxcfSxcDJv8rJxsjG0MPDxsOvxMvHxMq3v7y6tKmspKWYn5iso6Glm6Ogm5R7d3J0ZmlaYW5sWlxYUkRMRkJHRExERlNANTQzMzQ/PTM6PDw7OTw8PDg7PTtBPTo8Ojs3Oz05Oz07PTs6OD4+PEI+Oz88OTk7Pz07QD48Ozk5OTk6Oz06PDo2OTw+PDs+O0NCRD5/pZypsqm0rrCdnp6YnImUm5man6Kfmp2ov7i8ys/RzMfCw8bNzs7M1c/V2djZz8vSzc3OyMG1w76xsLFlZXqLtpCLkpaGeoCFhX92eHVycF9bW11gYGJjZGRlZGBcXF1dX15gW1laXGJvcm9raWxwb3OPxrzJxczAxsKwtrqysrOyscK8vLy6uMHBwcW+vbm9v7nEysXGwr3GwLi7xMm/wcm7t7u7xsO/vMHNw8a+vrXBvcO6vca7wrqzvMXEwsK3v7W2vr+7zMO8tbrIur++y8TBxsLFycbJxtDGwszHssfJw87NwcXDwL2zt7Cyp6ioubClrbCqrayUenZ3amRnYGhvY1deWUpGSkZISkFFQkVJQDk6NjQ4ODU0Ozo7PDk8PDs5Ozk6QD46Ojw6Nzo7Nzo7Oz88OjxAPUA/PT8/Oz07O0A8Pj4+Ojk5ODk3ODo8PDw7OTo8Pjs7PjpAQEU+fqygrLWqt7SyoZ6fl5qNlJaan52mop2et8XCxMjO0srKysfNzc7RyNDG1dTW183Kz8XJxcfAucW9q6+eXGlyl5SLiIqEeH+Ghn9+hHt0dGNcXF1eYGBiY2JiZWViXVxbXF5cXl1aW1xeaHNxbWdnbnByeZ29zMDDusC4rrCxp6qtrKe4tLe0s7O0u7W+srewta+yvMK8wcS8wLu1srq+wLjHubS7tsHCvLi9xsHDu7Wvsra6v7TEt7u0q7i9vcC9sbu2sLa6s8W8tq67v7W3tMW8vsPFwMPFxsjLxcDGxrvHy8DPysfDxsLDt8O9vba5vse/rLW6tbe2jnl0eGdnZWJrbl5WXmBGS0hISkZCREFFRT88OjU2NTYzMzs6Oz06Ozs6Oz44PEE9PDo7ODc5OTk7PDo+Ozk+Pz1APz5CQD1AOjo+Oz89PTk6Ojo4NTY7PT48PDo7OT49OT86PEBAPIi3pauzsby8sa2foJmUlJiXnqujr6qnpMbLzcjFyM3M0MzNyMrIysnKxNDN0s/NxcfBxb++ubfJtqqxklxtdZGOhomJenh+hoZ3d4F8c2hdXV1dX2BfYGRhX2RlY19fXFteXF1eWlxbXV9scG5oZmttbnJ8pMe/ubi1sKutp56jqqeeq62zraqsqbSut7Gzqa6mrLO8urbDubq6sau1ubu0wrqwwLG+vLu2u8e5wratqqiwssC2uL2wsKeys7W7vKuutaautq+7srCqubCtu667uLvAwL65wr/Hw8XAvMbCyMq4xcfGv8fEw7rExsK7xsnMy7O5wr27s4lzdnZraWFibGhZWFdbQUxLTUlFQUM/RkE6OTo5OTU4NTQ6Ojk7PD07Ojs+ODtAPD05Ojc5Pjk7PDo4Ozs6Pj45QT0/QD87Pjo7PDo9PDw4OTg5NzY4PDw9Ozw6Ojs+PTs/Ozs+QDyKwKuouLe5w62zqZ2ZlJaZoZymsLWxt6bFztLLw8XBxdDHzcHDxr/ExMPDysLJyr7AvMG6srS0w66psI5fb4CQiI6Qe3h9iYV6e4SAd25eXVxcXV9gX19kYmJjY2JgX15aW1paXVpaWlpcZW5vaGZnaWtucYGtubC1rqakp6eaoKWhmpylq66kqKKsqq2rsKSmn6qttbaxvbmvt6+prri0tLy4tLyvuLm1srzBssCupamjq7Gys6i9qquoq62ttLOmqK6hpK+psqanqK6mqLessbK3urq8sby9vr7Ev7XCwcfIt7/AxbfEw7+7v8TCvsTIzMq/vsTAwKmHc3RyamldYW9jV1ZYUEhZUlNLRkZFPj5AOjc4OTc3NjQzNzo5OTo8Ozs8PDc7PTs7Ozw4OT44PTs8Njo9Oz89N0E+P0A/Ojw8Oj05Ojs6Nzc3ODg3OTw7PDs5Ozo8OTc5Pjw+P0I7jMKvrry3ucSwtrCbmZWcmKqpsLGztb2vxdDPzMPIurrLwcq+u8m2vcO+usq3wcPBtLW7tbCutLutp6qRaWmHhIeLgHt9f354dH58c3dlX11cXF5fYF5fY2NhYmBhX15dXFpYWVtbWVhaXF9ma2ZkZ2Voam9yhamlq6Wgm6GllJ6lm5iRoaOqo6OgpqWopa2gnZykpqyysLa3p7CsqKq0q7S6sba2rra5srC6urG2paCkoKaxp6uouaqkp6eop7KtoKemn5ukpqyen6ekoKGxra2ssrSztLC1vLa7wcCyur7DwbK5ucOzwb2/tbi8vb+8wsfEw8O+wMSgg3hwbGJmX2tvYFVZXkhOZ09UR0VLRjw9Pz06Ozs4MjU1MzY5OTk7OTo6PDo3PD88PDs8ODg8OTw6Ozc4Ojo8OTg+Oj89OTg8Ojs9Ojc2NzY3ODg2NjY7Ojo7OTo7PDg1OTw6Pj5AO43ItbW9uLrAur22oJ6VnaGmurars7O7s8TPycvCxri2x8DMv7jJt7vFuLPEuLO+wKu1u7GrpK6zrZ+hkGdshoaGgHx5dXNvbWpqaXBpXmBdXFxcXl9fYWNiYGBgYF1cW1xcWFlYWFhWWFteX2RjYmVnZ2dqbW+Hnamgl5WaoZaco5mWjZ+ho6ecoKCkpqKnnpuim5+rsK2xtqOpqqqsrKS0ua23sKyzta6zta6wqp+en6SisqSmqbitoqamoKisq5mfoJ6ZnZ+lmpmjnJudr6mrp6qsrK2xsrivuLm7sLa8vLqrs7O5s760trKxtrW/tr7AvcPBu7u9l4R6c2xfZV5kZFhUV11JV1xLUEdJSkdBPD8/QDs/PDA0NTM1Ojs5Ozg5OTw8Nz4/Oz07Ozg4PDg5ODw3ODo7Ozo7Pzo9Ozc4PDo9PDc0Nzc2NzU3NDY2Ozc5Ojs6ODo5ODo7OTo8PzuJyba4vru3wcHBtKSkmZqkpsCyr7astLfGz8jIwMa7u8PDz766x7i4v7eywrSxu7uruLmwoZ6oq6eWnZBrfYaGf3hybW9ta2JeYWZmXV1eXV1dXF1fYGFiY2NiYV9cW1taWllYWFdXWFhYWFpeYmRkZWZmaGlrcY2onZOUlJuYm6KXlpGcoqKonpydpaaipZygoJuZrq6urrKgpqKuq6eitbGysqyor7KnurOmtqCin5yjoa2joqq1qqKjpp6lpqOWmZ6XmZudoJqXnZ2dnK2iq6ekpKatq7O0qrWws6uyubSvqq+ysrO4s66prK6yuLG7trq9v7ezsZSFeXVmXmVeW1lWU1pVS1tRS0lFSEtJQj0/QUFAQToyNDUyNDk5ODk7OTo9PDY9Pzs8Pjs3Ozs3Nzc+Njo+Ozo4Oj07PD06Ozw6PTs4Nzk3NDY1NTQ2Nzg1Ojo4Ojk5PDg3Ojg5PkA6gci9t72/tr68v7OdpaOYpbHCtba9rbS4wszIxr/FtsHAxs63wMS9s7m5s7+2sbi6rLG0rp6Zo6mfk5mNdICEhH94b3F0cWhlY2hkY1xcW1tdXVxbXmBhXl9fYF5cW1pcWllYVldXVlhXWFdWV2FkZWNkZWRkaGp2oZyTlZCVl5egl5mVl6CeoZ2WoaGppJ+eqJ2cmqunr7Crm6OkuKqhoK6otqqmp62wpLiwpLego5uZmaqmoZqsuK+ioaScop+gk5ShlJaWm5iXlpeclZ+qnqmkop2jqqqwrqi0q6qnrbOwpauus7Gwr66vpqiosq2xtLC8tLm3rqOUgXl1ZF5hVllYU1JUS01eTE9LR0dMTEU9QT48Qjw7NzY1MzQ5ODg5OTo5Pjo4Pj47PTw8Nz49Njc2PTc7PTs5Nzk7Ozw+OTk6Ozo4Njc2NTQ1MzEwNDU2Nzk6ODo5Ojo3Ojs5OT1AOnbAvLS5wrG+t72unaeoo6q7wL3Aua60uMHMx8XCw73FuMjLssHCwa28u7W7vLW4ua+ur6mbmKColJCJiH+BfXdxaWxydHBoaGVkZmJcXFpZWlxcXF1eXVxbXF5cW1xZW1taWFZXV1ZXWFdXV1ZbYmNjYmNiY2RmaYGWk5aMkpSUm5mdlpacoJyflqGgpqakpqefnZ+moKqvpp+ipLeooaGiqLSipailsKWxrqy0nqGdlZWpoaKUrbGxn6KjnZ6Ym5OLoZSRk5iYk5eXmJeep5ynoaKapKWlq6SlsKelo6urraaprq+uq6iqqbOmpqyvtLGvvLWxr6+gknp3cmVhXFpdWE5MUkhSYU1WUE9KTU9FQkQ/OT02OTo3NjQ1OTk7OTg4Nzs4OT0+Oz47PDY5Ojc7Njs3Ozs6ODU6Ozo7OzY8Ozg4NDc3NjMzMjEuLzI1NTY7Ojg7Nzg3Njw7Ojs7QTh4u7uxtb2wu7G4rJ6lp623u7zBxbqxubXEycnAw8bFx7bFxLLCv8Wrt7e9tr26urWyq6ynmJeeo4uIc4mIf3duY2FmaWhmZ2lmam1gXVxbWlpaWlxdXFtcXl9cWllbWVlaW1dVWFdUVFZVU1VSVWBgX2BhX2FhY2VqgJSTipGOlJOUnZWWl6SZoJedoaWhraakpKOjopyqq6Wan6WxqqChnaWrnqihnq2sqamuraKiopWYo5uckKupsJygop+el5mTip6RjZKTlpCYmJScoaOdpKGilaCipKabo6uloqSqo6uupa6yqaalpqa0pqmorbO1tLm6r6msnoxycW9gW1dWVlJHUU9IWltPUkpUS1NMRUZJRDg7Oz08ODY2Nzo5Ozo5NzY5Nzc6Ozo9PDw2Ozw4PjU5ODo4ODY1OTo7PDk3Pzw5Njc4NDUyMTIxLi4xNDI2Ojg2OTg1OTg5ODk7OUA5e7W0rbS7srCrsq2dqKevubmzwMi6tcCvxcjMusHKzMi1ybyxvsPIrLG4wbW7wLu0s6mrppWam5yIgHKIg3t0aWlqbGdqa21ram1lXVxcW1tcWlhaXVtbXmBgXFhYWllYV1hXVFZWVVRVVVJTT1FZXVxdXV5fX19iZG2OkISRh4+Rj5qTlZOcm6Ocm6GpqauorKeopqSZpa+llZmlr6qgnJmboJ6vmpyrs6Clpp+jpKGVk5uWlpKpqq2anJ+hoJuUkIyZjoyRjJGNlpWQnaKgo52co5WboKOhl6Koo6Koq6CrsKStt6WjpKKtraqoq6+zt7O+tbKrr5iFdHNoW1lZU1VSRVhMUVtYTVROUExQUUlOSUI9Pz9BPz03NTc5OTw8OTg3Ojc5Ojs8PT47Nzs7Oj02Nzo7ODk3Njk4OTo2Oj05OTU3NjU3MTE0MS0rLzQzNDk4ODo6ODo6NzQ4PTg/OX6zraeztq6oqK+um6morLe2rLzKu7a/rMvGxbjBzs/Is8S6t7vCyLCtuL+3vL26srSlqaCWl5iXh3p0gHZ3bm1obW1tcGdnaWdkXVpbW1tbXFtZWltcXF5fX1xYWFlYV1hXVlVUU1VWVVVTU05QUVlaWlpdXVxeX2BkfoyBi3+MkYqSjZeRl5mioJugq6qmrqyosKSpmp+toJWWpKmonZiQj5qerpeYqKqZn52UpaGekpGSkZOVp6qlmpmZnp6WjYyLk4aJjYOPi5KVkaCeoaSYlZ+VmqGinpSbpaWnqKigsbGmsbynn6Ostauup7C1sLi1wLGtsauRfnJzYlZUVU5SSkdWUFJRTExXTUpMTlJHTUtBQ0ZEQz5BNzU4ODk7OTo3Ojo3PD06O0A+Ojk7OTo/NzU5Ojk4NzY5NTg3Nzk7ODU1NzY2NjEzMjAtKi4xMDI4Nzc7OTk7ODk0ODs4QDh/s6ylsbeqpaKxq52qp6mysaS2xrS5urPKxbm6wcvQyrG2uLu9wcOxr7G3rbSzurKyoaKcnZeXlIN/d2tnbG5xbnFqcGtkZWdlXlpZWllaWlpaWlpaXFxdXFpYWFhZWVdYV1VVVFJTVVNWVVJOTk5SV1hZWVlZXFxdYWqAen92iY6HkIqXiZSUmJuZnqmboKqmpayeqJqgppyTj5+jm5eXhYSSm6OQlaOdlpaWiKKbm5SLjoqQmqSnnJWVl5uRkoeUjouBi42AkIqSkpKgmqCilpSYmZWippmNmaSmqKahoLSyp7K3oZyit6yqraSysqa1vLWsq7GjiXlzbV1OUVFMT0NNTk5QS0ZOTkpKTk1RSE1KQUdLSEhDPTg1ODg4OTo7Njk6Njg7OTk+PDg6Pjk7Pzg3ODk6ODg2ODU3Njg4OTc0NTc3ODIwMzAxKyktLzEyODc2Ojk5OTk4NDk4OEE3d7ampLawpKekqqWgqKals6qissO1tbKzxsa3usPKzMazrLq9tLfAr62psJ6mrbqvrJ6YmZyUk4d7g25fX2ZycHVxaW5pZWdoal9YWFhYWFlZWVpaWVtbXFxZWFhXWVlYVVZSU1JQUVRRU1VRTU1LTFNXV1ZYWFhYW11hb3N2cYWIgoiAkYSPi5SRlJ6hj5uco6KkmaWXopyVjYeZmoxzjYN+jZeWhpGakJSOjnuZj52Mgol/iZifo56Qk5iWhY2ClH5+dIqOepCHk5CQnZuampKWkJ2Oo6OOiZqgoaOkm6K0r6yvrZ+YpbimprGhsK6csLuqqa+qmYN3c2NWTVJPUE5DU05MUUxCUFFISU5STUhKSkRKTEZKSj03NDk4ODg7OzY5Ozc6PDk6Ojs3OT85PkA3OTo8ODk3NjQ0NDU4NzQzMTI1ODUvMDEwMikoLC0xMjc2NDc4OTo6NjU6ODdBN3i3oaO0qKalqKOmpaemp7OnpbTBuLC0sMnEt7nBzsa9s6y6wautw62noqaSnaa2raKejpSVkY5+eH5lV1ZfZ2ZpZ2huY2poZ2JcWFdYWFhZWVlZWVlaW1tbWVlZVldXV1NUUE5QTk9PUFNUUk1NSkhOU1NTVFVVVllbXWlscm1/hXx0TlhykIOXh46dl4uUkZ+YnZWUlpWPlomAk4pfO1dvfIuUiYCMkoyQhoZzioWXgXmBe4aTnZODlY6RkIOGfZN4cXCFjX2JgZGNj5eamZOLkImdiJ+YiIeWnpqhoJenrqmtqaielq2zoqatmayrmKizoqmto5N+cm5gW05TUldMRFRKUExMRk5PSUVMUU1LT0pJTFBGSUk9NzU5OTk5OTo3Ojs6Pj44Oj09Nzo/OD4/NTg5Ozc5Njc1MzMzNzYwLi0vMzQ0MTEwLy8oKSsrLTM4NTQ3Nzk8Ojc5Ozg2QTl5t6CjraGmpqqgp6moo6qwqKe0wbmwtbDHwrezvc+/ua+utcKnqsWpo52Yg5SbsKKZloWTjoqGfXN1XVBMUlVZWlddXmJnY19ZV1dXWFhYWVpZWFlYWVpaWllYWFZXV1VTUk5MS0hHYlxNT1JNS0hGSE5RUU1QUlRWWFpgbXBpe4J0UUJAf5WSkn2JlY2Eio2bjpaViZKIhpWGeYl/YEpRbniKkYR9hI2KhX9/bn5/lHh1dniEjZlvUY2IioZ7fniUdmd3hoh9iomVi42RkpeMhIqIlYSajIKEkpqWnp2UpKOoqaWknpqwq6GkpJGmqpaiqpyipqiJdW1mXltIUVFTTUlVTVNJTEtPSUhGSk5MTVRLUVBPRklDPDc2OTo4Ojs7ODo7OD4/OTk+PTg7PDY7OzQ3ODs2Nzc1MzQ0Njk2LzMvLjEyNTIyMS8sJykrKiw0ODMzOTc5Ojk5Ojo6Oj85d7abo6edn6GvoaeopaeosK2qtry2t7ezwbu2p7rIuLaoqLW2qrK8pp6Wjn+Jk6iVlIl9jYOBfHdwblhNS01OT0xNUVdbXFpYWlVVVlZWV1lZWFhZWVhZWVlaWFhWVldVU1BNSkVAQJtrc3NJTUtERERJTk9oWU5RU1RVWm6DdHd+amlcVY+JlIl0f4eBfIWMk4KSmouPe4aPgHaAeHNvdnF0jY2Ben6Kq4V5emh2e45wcm14gYuNknh6gHuAdnJykndodYSEhIV7lYqIio2LgH+Ei4yAlIN8gI+YlJyWkZ6dqZ6foJ2gqaWfnZiMp6SToaCWnp6kgHJoYVxdSldQUkhKWFJPSkxNUkpKSkxQSExRTFJUTUVIQTw3ODs5OT49Ojs8OThAPzo6Pj03PT03OTkzNzc4NTY3NTI1MTQ3Mi8yLiwvLzIwMC8tKygoKS4xMjcyMTk4Nzk4Nzc1Ojw7N3aumaOimJyftKmvqaWtrLCyqr20sru4trq0sZ+3urKqnZ2sqaiyr6GakY6UgY2bjZB+doV3e3VubmlZS0hJSEdFSEhQVFRUV1dTVFVVVVZXV1dYWFhYWFhYWVlXV1VWVVNQS0Y+OTNOPH6eTUhKREA9QURqlH5MT1FRU1ZedYN8eGZ3jZeYjY99aHmBdniAiY99hJiSgXKHj3x3e29rfq18c5CKf3uGkoF9f3RmdnyGbG9oc32JjIiAbHlxfXFtdo9xaHGBfo5wQ4uEgoOFf3d3eouFfYx7dX2Oko+YipKam6OWmZ2anZ6hnJaNiqSbjp6XjpaYj3dvbWViWlhYVVFKU1VUT1BOUFZLTktOT0pRTkhPT0xGRDw7Nzk7Ojo/PTk8Ojk5Pz87ODs9Nzw5OTk5MjY2ODU2NjMzNjExMjI0LiwsLS4uLTAtKyonJyouMTM2Mi84NzY5NjY1Mjc5OTV5ppegnpagpq+srquoqbGvsau8uKy7vrmzrKebsKesm4+WnKWppKCXmY+FknqIjYqJdXB7bXRwaWxqWEtGR0VBQENESUxMTVFSUFFTVFRUVVZWV1dYV1hZWVlZWVlWVlRTUUtENzhmNzA/qGlOSEM9OzpEioV6WkpOT1FUWF1lcHJtiKeqwH51eWN8eG98eYiQen2Lhm9tjJJ5dHhqaoCCcZaRi4F+loBJk5huaHd+gmxpY2x5hZCShmtzbHxucnuGaW1wf3ONiYSGe31+e3ZvdHOFgnmBeHB8joyKlIOWl5iakJKVl5mXnZaMg4mekYuSjYaQln9uaW5vblhWWFRSUVlPUlRUU1hVTU5ITktNTktDSE5HRT86ODk7OTk6Pjw5PDs6Oj0+Ojg6PDk/ODY4NzI3NTY1NTQxNDMyLzAyNCorKiotListKigqKCcsLTEyNTAsNTU2NzQ4NUhBODk1d5mRm5man6WtsKOsqqi1r66stL+rvMK/pqKZlaSXno2Ei5ShoZiYkZOLc456gIWLhXRudGtwbGRrallORUZDQDw+PkFGRkdLS0tNUFJSUlRUVFRWVldXWFlaWVlaV1ZUU1BMRTFAmjMganNDmW87PDk1PICChl9JTU9PUldaUVlcYKeIYpppdHplf3Btf3qLiXaBiIZ0bJqRdHN8amudj015hZKJhI5nMXaGc2x+foN0ZmV0foSEhYBmaWx1a3F/fGhxcXxuk46PfHN9fHFwbnVtgn93eXVqeYmCiImElpKSkIuNkZSUjpeNgHmIl4iGioaAkIh2ampvaGVYUVpXWVlbTVBVVllYTklIRUpKSEdCQEZEQ0c9OTk4Ozk6OTw6OTs6OjpAPDk6PDk4Pjc4NzcxNTIzNDUzMzY0NTAzMS4qKispLCwrKykoKycpLCwyMjYsLDU3NzU0NzhpTzg7NW6SiJqRmZakqK6esp+nu6+rsrDCsbvDx5qWj5SZi46GeYSQmJSNkIyPhnGHgnSHjIV6b3Jwbm9kcGZfVEZJQz88Ozk6P0BBRENFR0lMT1FRUVFSU1RVVlZYWlpZWFZVVFNQS0U4MC9cYLNHOVhQOzk0NDGWuotITE1PT1FWTEFJUUlir7Ogcnx4bH1tcoOChYF6hIaGeXKhlXR4gHN1lIc1cZ2onY6hoYSihHZwhnyHfHOMrY2JgGdnYmpucmxwg3Vpb1h1cI6bkndsf3t9bXFtcIB6c3VuYnaDfoaAhZCQioqJkYuRjIuOg3V4io6AfoOAfY96cXBva2BbXF5cWVhhX1JOW1pYV0xISkZKRz5CQUJHPkNEPTs5Nz07Ojs7OTo5OTs6Pzw4OD06ODs2NjY1MTEyMTI1MzQ3NDUzMS4vLCwrKSopKSoqKikoKikrLzNETTIxNjY2NDM8dlI3PTdikoGTiJaRnaSnnq+VpbWqrrGuwbK7wcaWkIyUj4CIfW6BkJKJg4qHj4V1goRslYiHe3R4eGx3bndjaV5JUEc+QDc0NDk7Ozs9PkBCRUhMTExMTlBRUlVVVldYWVhWVVRTUExFPDUqnUtbQC1nSTk0Lz+Sg6muX0dMTU5QTDdDTVJTREqGdoB8fHZ+bXeIiHx+hYN/jH52opl5foaAhJmEm5xhhqqfnYuDkI16d4h+iYiNc4qXkIN6XWRydHp7d4ptaGpieW+GkIJ6boF3dIR6cHR5d2tuaV13h3yHfIeHj3+LkpeDjYWMhn1xhH+DfXV3e3yJdnBzdGVnX1tbXlRcZ15XUVVYW1VHSkpETEc/RkBEQz5BQT06OTc8Ozs9PDo6OTk7Oz0+Nzk+OTk4NTY1MzI0NDAwNDY0NTU1NC0sKSsoJycnJigoKSkoKCsrKy8wMFVxPTIzMzMxRX5XND05XIx4ioCUjJKcnZ+mkaCroLGor8CxusW6lo6RlId6hXZrf4yRgn2KhI6MeIOAc6GEi319gX5wgH56Z3ZrUldMQEUyMTEzNjc2ODg6PD5BRUdGR0pLTU9QUVNUVVdWVlZUU1BNRkA6Mj0gI5ZjjFs1MzExaT9Hb0lGSUxNT1JMS1RdWVJKaYSIe4l5fHJ8j4x6fYmHfpeHdqGZiIePkpSljaypSIaur6+LgYCTioKLgYSSqIeAmJiKm3RtfIGGh32OaGdoeH9uhYeChXGEhUdsgHdyeXZobWtfd32DiH+IhYt6lZ2biYuIkX96dYt2fHhtb3d9f3NzcmxbXV1bY2NYZ2ZcVU9QVllQRExLRk5JQ0ZDQ0FAQ0E9OTg4Ojo6Ozs6ODg4Ojo/PjY7Pjc1ODU3NzMzNDQyMzY2NTY3Njg7REZMTU1MQzcrIiUnKykrKywvMDArbnUyMjQyMEyBXDU9PF6EdHx9iYWIkY+WmJKXoZ2soaa4r7O8s5eNkouYi310cH+Jkn59jIKSlH2Gfoakh4h/goiFeIeIfnOEeF9jV0tCNjAuLzIzMTIzNjY4Oj0+P0JFR0hKTE5RU1RVVFRWVVNRTkdDPzgwLCOHWz4/ODQuXZZwc6NVRklLTU5QV2BZcFpcXmqNk4eVgISChZGTfoWIkYGalYKhoZiVm5qlrZOau7Gnu8fDqIuMoaWPlImBkXxxg56fkZx/doWFipCIkGlob4OAdIyHhItxhYJ3h397doV9bnZ1ZoCUj4aJiYeIh6GqopaJjph/eoKJenlvZ2t4fnp+cmpkXlpaXWpdYWZgWU9LTldSUUhQSkROR0NKREJARERBPDo4Nz08Ojw6ODg3Nzg6PT04PD02ODY1NjYyMzQ0NDU3Njg2NzxCQj88ODo+Q1FeZVxHMicmLCwtLS4xKD+LWy4zMTBPg180PztudXBmeIN7gIyAgZGOipqbpJ2hrKarr7CXkZGEoZSEeHd/jJR8f5KGkpV/ioCSm46DgIGMi4KJjYN/iX9tcGpdQkE0LS0vLy4vMDIyMzQ3Nzg7PT9CREhKTlFSU1JTVFRSUE9IREI8ODcvOUQ+PDw2My5sk5dNUEhJS0tLTlZgY39nZ211nZqPmpOTi42OmoiTj52LoKCSo6qlo6yTqLaiqMHDrseveLqUmnyNoZ6ZhJOFgo+hn5OYkoSLhY+ZkZZscHWJi4KWjI2Pd4+EcW2FgYqWkYOFiHKIoZaHk4mOj5altambjZWig4eTg31/a2prfICBgXNhXWNeWmZrXGxrXldLR09TUU5NTEZJUENETUZBQ0VHQj46OTc9PDo7Ojk4Nzc2Nzs6Nj06Nzg1NDU2MzQ1NTY2NjY4NTU2MzEwLiosLCkoKS46UGFcQCwoLSsrMCwncog3MjQwT4RiM0A8dW5nWXCCcHWHcXaShn6XlpqVnp6cp6CplpOYnmdlpJp+hJKReYCSiJCSfYqEmJKRgoCAi42JhZCGhIiFeHh+Z01SPi8uLiwvLi0vMDAwMjEyNDU3Oz9DRU5QUlRQUVFTUU5QSUVEPjs8OkNGPz48NzUyPD9SNUhISExMTU5SXm+KfHOBfaCdnKilopmhl6KVnZ+onqiroKisqaq1l6u/q7bIyLfJ0c++m6Bwaaupn4STkoWcoZqbmaeRkYmVopqaeHp+lJiSoZKWmIGUnnt3lZKrs4iNl599lJ2cjpOWmaSiprawnZGZqIiWj42BiGxzcnx/fHFoYFxgXmJnY2BoZ1tSRUpLUE9JSkxGRk1DSExGRkNCR0VBOjg1PDw4OTk5NzU2NTg+NzU9ODQ3NDU3NTQ1MzY5NTg6NjE2ODYzLzAuLSosLy4tJyMqO1hiQigqLDEtKEuXXjA2M1GFZjJBQGlhXlBwdWBufWF3jn17lI6Oip+Sl56Wm6qYnqpCRH2HiYeYjXiCjYqOjXyKho+QjoGCgImMioSShYOGiYGAhndfYlA0NjAtMS8sLjAwLy8uLjAwMTU+QUFNUVJTUFJTVVJOU0xFRUA8Pj1HR0BBQDg2NjI8OTtGSEdJSk5PUVlthpB3lYujp6q0vbikrqysp6i0q7C2srKtu7Gzvpyzw6y7ycu3w7+4paOwsqytqqOLlpiFpqago5eBppmNoqqopIiFlKShoKqhpKmPnLGLlaOnt7uboKOwk6Kdo56RpKKrr62ztaKUpKqImYmSipV5en6FfmdgaFxlYl1kY19mZl9aT0NJSFRPRkhMRkpHRUZIQUtGQ0ZHQTs4Nz08ODg6OTc0NjU4PDU0PDc2OjQ0NjQ0NzM5PDM4PDIwMjU1MS8xLi0qKi8sLSooKiYlNVhYLywwLCwwhIE4NzFQhWg1QUNbWFRMaWNXanBYeoV2gZOFiIKbg5KRjJLayJ2Wc1aXiI+InI98hoyOiop6h4KHkY+DhYCLhYaHkoaChImGiIeHcW5hQEU2NDwyLzExMC0sKy0xLi0zP0RBTVVRUlNVVVdVTltQR0dFPD4+RkhDREA4Ozw1Qzs9RktJR0hST1BXgZOghK6js6qxwcfDqrPFtqyzv7O4vra/tMG2u7ukuMaotsnHtb65tKijtK2xsZuZkpqfiaivq6WUdp+kl6GrsbOZlqqtqK62u7K6rK+1orGssbW8t7WutaCnp6OomqmwrbK6uLinm7apjKWOkZOfhniCg3VZYWRWZWFhY2BhZl9bVEpERUxVUUhJSkRJR0VBQEBLREJNRjw4Njc7PDk3Ojk4NjU1NTcxMTw4ODk1NDY2NDk3Pj0zODkxLjAxMjExMzAsKiwuLCsrKyooJyopRVowMCovK2iSTzYwUodqNkFGV1FKTFtaUWNkV3l1cYGUfYWHk3aFf4CMe7+7o7yCtJSTjZuPhIiPkomJeYaAjJONh4SBjn+BiY6GgIaJhYqHkXp4bl1WQEVNPDY6NDZBQjc2NC8vNkNIQ1FbT1FVV1VcVk9eVUlLSkFAPkdLRkVEOz5AN0Q3P0JKSkVGV1RQXo+lrqOxtMO2uMHMyba7xL2zs8C3t8G1v7C3dLGzprrFpLDGubGzsbSopLW2qrGgoZabopKlsK6mraunpJigrLO6oqmyurS7vsy/xcW9vbPCt7q4v7e6t7msrLCmsaqtvrC9u8LCrJm6qJSuj5eXq4l9gnxqV2JhWGplamVXW2RZVlRJR0dMUUdDSElBSEQ+P0JCS0BATUM5OTY2OTo/Njo5OTY2MjQ2LzE5NTk5MzY0NjI3Oz0/NjoxLi81ODo5NjUwKigsLS0tLCwqKCgrKyhFUy8qMDBKj2s1MlCHbTY/RlJMQUxSV1RZVVp2anB/j4SBjoRuenN5h2K4oZmjiZWTlpOTk42QlpKHhnuGgY2WioGEgYp6fIuHhnyKg4GKg5V9eHp1ZU9cZEdFTDpRY2FbXlNGPztIUERaY1FRWVhaZ1lUYGBNU09FQT9JSkhFRkFAQzxFNkI+SEdKTFNaVF2Tr7i1urnJv7q9ycy7vMG8t7W7u7e9tLqxxmF1sqWxmp6qvaqlqKuqo6KytaGrqJ6Vlp+Yn66lp6aln6OUoqaxtKeysr22wb3TycrTxsLFy8HKw8C+vb+7vLe0sLm3tsO6xb3DyLCeuaqiq46lqLaJgH9xX2FiXVdhX2hmUlhhVlJVSUVFTktBPkdEPUtCPUJAPUY+O0hANzk2Mzc5PjQ4OTo1NzA0NS8yNjM4OTM3NDQyNj84QD5HS1JUU1FQT1FRUEpBOS8sLCwqKygoLC0sL1A+KC40OIB9PDJLiHE5PkNLRUBJTVBSTFFdZ2xscZCNhZBzbHJyc4jVwLWZoI2VmJmRjpeSlpaOhod9hoOMlop/g4CDeHuLg4d7i3mBioKXf3R9emtlcHVZXVxQZWViYGVkXVtYV1xNZG1VUm1tX25fWGdlVVlUSkRBS0tIRklISEdCSTlEP0hLVFRWXFpbkrnAub23xsC6uMrLure6tri5sri1tK62tplkdaicrXBeoa2cmKCim6Seq6WUoJ+QlI6WmJeon6WfnpqahKSdrKWqsKy3sL251NHP18/JzNHMz87KxsC/wsq9wbzBwMTExcq/yM60pLuwtK+bq7m8mn95bF1fXFhdYFljY1FcYFNQS0NCRUdFPEBFPkJIQkBEPTpFPj1KPzQ3NTM1Oz00Njg5NzcwMjIvMjQxNjk3NzU1NTVEM0VMTT41MS8wMDY6NDc3QElPSTstJioqKC0uLyxATSsvNTRtiUkwSIl0Pz5CREBDREZLT0RSXFlpX3CXkpCUb2xvdXWHs6yhoZ+LmZyZjI2VkZuShYqKfoiHjJCLiXyBhHN7ioOFe4l0gYmGlX9ze3hrbXV7aHJlaWxpZmppaGBmaWhsWm50l62kvIiHZ1tvaF1aWVRIS05PSktRS1RRSExBSkdLUF9eYmZpYZe3x7C5s7u+tbHEx7WwubCwu6uzsaeqt6yNtqedm6eaT5qdjI6glpGmmKWVipOTiZCJj5GRnpuhl5qVloeemqabrK+or6eztNTU1NbSy8/U1c7Tz83FwsnQv8rJysnSx8zNwtDSuLDDvMS5pba6xKKCbmNcXF1YYFdYZlpRXVdPT0JCSEVCSTtBRD5BRz8/Qjc7Qz5ASD00NjY1NTs6Njg3NjU0LzEwMTQ2Mjc4ODc1MzY3QzVCOD8tMC0xMzQ5PTk3LC4sMTtGSz0pLCguMDAwN0s/LTQ2VIhXMESHd0M7Qj5FQkFDSk0/VVlTZVdzkJCYgmhxb3l5g6CqnqaXjZubl4uOlZGajn2Ji4WOioqLkId8hIJwf4iBhnuHcoOSi49+cXh1a3F4fnF7bXhzbGmBcG1jaW5weGl3fH7Lv8Lfp21jeG5jW2FgSlBSVU5ZXlBeXU1QTlRRVVVcbm52gnKXrbistKewtqusvMCxq7WmpbinrK6hq7SjjrGumpiYjJGTkYSOm4GNp5KciYOLhIqJhIuDk5WYl5ObkZyYmZmenquspKehrK3P0tXRzczS09TQ1NHOyMPU0cjN0tPT183S0cXS1sXAzsfHw6i+t9Ceem5lXWJcVmBSXVtPUFRQTkg+QUZBQkU8QEI+RUQ+QD86PT08PEpBNDU0NjU8ODg4NjY0NDEyLzAzNTI2NzY4NTMzOz08RT1AMTErLzI0OT41OTAxMDIyLTJETjMpLzMuMzI9TjIzOEN9XzJBhnREOj09ST5AQ0ZIPFZSTU9bdYaFindsd3B9fn+hnp6hi42Zk5OMjJOPloV5hY+QjYuKiJGHf4J7cn6AgYd5hHWFk5GJf292cmtzfHt3fHOBd3FrgHNyaG9xenlye77Lm36MsoN2coR2aGFqXUNaWltXZmRYZWtTWF1dYGReY3h7fouBmaqkpKGgoaimqrC4qqW0o6GtoqOtoqexn4mmmpSSkYmRjoiBlIlrlaKNmYSAhX2Rg4OTlq2LlY2VmY6FkpCdl6ewoaChpKSoyM7PyMLL0dTR1NLO083G1tLM1NjW1tjU19XJ1NrNydfX0cqsxMPLi3NvYmBfWFRZUlxQSkdJSUpAOzo7RUJEPEJEPkhCP0JDOzs5PDpHQjQ2NTQ0PDU2ODc1NDMyNTAvMjU0Njc0NTU0NDw+PUU/QTYyLy0xNjs9MDgxLzI1NC8tLTtSMDE3LzUzMkZEMjg+bmI1PYF0TTk5QEk8QUQ/QTtQTEZLWXCAdX1oc3hygomAnZWdlIWLlomPioiOh49/eISUmYqNiIiLiX6DeHR7fYOHd396h5GWgINueHBtdX92eH50hXx5bYd2dG59doR1eXudto08QYvGpX6NfGllVklDZmNlY2hqZG94W19maWtuaW6Ag4mRi52eoJ2Ql5ifo6SmsqSks6ChpZ6hqaCisZyGnpKSkpCLjouGg5CEfpybjI2DhIV6lH6CqZWjjJKKl5KLfZeKmpGqs5iam6ecp73Dxrm2xs3S0NLQzNLLydTO0NXa19fY1NnYzdjbzsna2tLVv8vMtHh2bmRdWVJVUFpWRkdKSkVFPTo3OUBBQjpIREBFQ0FEQjs/Ozs3REM3NTY1NTswNjg5NDQzMzQxMDE0NTU4NzQ0NDQ5QD5EQkM8MzMuNkZUV09RSkFKRj8xKiguQlMzOTI1NC83Szc1PGBiQTxzdlY4N0FIOj9DPjw5UUVDSlRsbm9wYXFxc4aNfJeRnYt+h5KCiYaFioKHfHiFlpeIj4OHhYd6hHlxenuEhnV6hY6NnXqMcHxvb3p/cXyBcYOHgW6OenV3fXyCdX98h4iwdFmpwraMkoJwbmI9XmhycHFwbnh3gWVpb3J1eHJ7i4eOlJKblaCVh4yTm6Cbn6qfoK2copqZn6Wen6yZi5qMkZGNhH2Ih4OFi46gmZOIhId+bZl5hJiGiJOMjpSMhnubiJOPrqqUlZeemKeutb2prb3Gy8jJy8vPyMPRytTW2NfY19Tb19PZ29bP29rR1snUy5V5e2hoW1lQUlNeSENFSUk+QT49Nzo9Pzs+SD0/QUFBREA+Pjo4NkRCNzU1NDc5LjU2NjQzNTUzMjMyMzY0NzU1MzQ1N0VCRENFQjU2PEZOU01bbmZjbnNrYVY+LDRMRzg2NTQzNEJGND1XX2hMdXheODs/Rjw8Qjw6OUQ/Q0dSa19tZGJma3aAiHGRkJqAeoCNfoKCgoR+hHx8hJeOh4t+hoaAd4J5bnt7h4F1epKejaB2j3WCdHWBfXSAhG+Bj4JvkoR0fIGFenaGfIm3xqXCybeBlpuPd3BlTmZjgXqBd4aikIt4eXd7g398hHZtk5aUlY+YkIOKj5aal5emnJegl5+TkpejnZmrlpGQio2RgoyFiYiBhZCRnpyZiYWLgYaYeomJn5ePiI6Ki4J8oYmQi7yhmJOXmZyppqaun6i1vsDAucfJzc7FzcrR1tbV2dXX29TX2drb19va2djO3MaGenlnaGVgVFdWVU1LRE5DOzw9PDk6PD45PUA2PT9APD8+PDk4NjdDQTY0NTU9ODA2NjU1NDc3NDU2MTM4NTQ1NjQ1NjdISD1ESkU3OTI1O0g+Ozo6N0lQXVpSVVhLOVQ+Ozk1MzI3STg9TllNSHh4ZDU9PkM9PUA6Njo+PkBFUV9ZZWFdW2h0enlsiY2Sd3Z6i3x+gH+AfYV7foGRiYSFeoSIe3V9dG58fYZ+dH6SnpGfg5J8hn54jn15iopugpqAdJiFfoGJhXx+kHqPqY+Qw6C8jJyjnH2JhH2Jc4yKfnOmmpyYlIV7j5CJhGhHcKCknYyLkJKFiYuQkpWPnZqTlZGXjYyVn52UoZSSjo2Qi36Qjo6LhIiSlpqfn4mMlJKekYKLgKaZiISOg4aEgKWGiou4mJ2SlZaip6Gdnp2jrra6tau/xsrQyMfMz9PS0tjS1dfA19jZ29ja2tnZ19y3eHh3a2lkV2BbVFBPSERNQj09Pjk5Ojo5OTs9Nj8+Pjw9OTo7OzM3REA4Mzc4PjcwNjg4MzU3PDM3ODA0OTc2NzU1NTQ2RlA1RE5JODkzOEFLPTszQ0BJPDlEV048TVRITj85NjMzMz5DO1tYPjVZeXBaPDxBPD0+ODU4OT89RFJTUlheVVhmbW1taYCOinFyeYp7en99f3yIenx7i4eCfnWDhnlzenNtgX6FfXeFm6GbnpSSgIuIf5iHgJySboeohXqgi3yRjoOIhJx+mpGKjaOin5CkrqCLkYuFi4GShldyrYufq5yPg5ibkJCOXIKikYKMn5OVjIeIjJKTjJSUlJCMj4qIlpudj5WWkYuSlIaAi4iSjYmKnJaZo6OGkp2WoYuKiI6ckIOIj4CDh4WkhoyQs5idkpSXoaGfmZKcnqexuKylvMLHzcfGz8zPzM7Xz9HUrtbV2NrY2trX1tnan298dGdnXF1YU1dYQ0BJRD4+Pjo0OTo7Nzo7OjM7Oz89Pjc7OToxOUc9OjM3PUA1MDY3NzI1NT82NTs1NTg1ODo1NzczNUhSN0dPSzk5ND1FSkI+MUZDTEI5ODpHWEA1SFdJNjYyMjM6RUNlWD8mX3lpX3o+Pjk8Ozk4OjxAO0JRS0tTWVBUY2J4bWJ+koNubXeLeHl/eoF8hnx7d4aEf3NwhYJ6dXZ2dISDhX1/kqajn6Wilomdj5SXi4qol3KKso2Ep5GEmZOFmYuilqCYk4mbnaGSqa+fkZWQjY2IlYtujbeFmsTIspyhpZucmJaRspFkpM3Hlo+Fh4mQko2Nk5SKhYqKhpaam4+QlJOGlZeEf4+LmYiNkKqXl6SjiJmelpuJj4iXl4qEj42Bf4ePpYmNk6mal5OWmaGYn5mTnZujs7Slo7zBvsfFxcnIycLK08zN1KjS0dbW1tja1NPazoJyf2hjX11eTkpUWkJBR0Q7QT04Mzc7PDo4PTY0OTo8OjgyPzk6MjlJOj42N0JDMzI6OTYyNjQ+PTQ7PjY5NDk7NTc5NDRLUTxKUUs5QTdCR0lANjRKRUxGPjw4OEVUQTc+XDg2MjE0OjtFYFhBRmF0aExjWj41Ozo6NTs6PjpFTUZIUldTUkJjgUZ1gY59fG1+iHh6fnqBgYN+dnaAg3xsbot/eXx4eHyEh4t9iqOzp6Oqs6GWp5+lpJaVrqKDkLiVkrOZjaGgjKWbr6OknZiQp5anma2vpJeVlpSQi5iZlqDAjqTJuKuboqatmJGbnbKdhoWoopyYhYiJjpWNi5OPiIGGh4iTmJSMi5OThpSYhoSRkJx0kZmzlpeloYicmZOPipCLl5qJipaOhn2MmJ6JkJCcmpmTmJiflKCdlZ+bobGuoqS3vrTFx8S9w8O/xs3KydKnzs3T0tDW2NPQ2LtyeXZcYFVfV1BISU5FQkNFNT46NzY6Pzs8Nz00MjY2OTc3ND01PDU8TDw+OzxCQTc1PDs0Mjc3P0A2P0A3ODQ5ODc7PDU1T01EUFJMOEA9RUFHQTU6SkVORUQ6NkFAQlM+OURPMzIzNTc1PXZcPFJcdGlaTV1TPD04OTU2Nj06SkZER05bXFlJZmA7SISLentuhYZ6fIR4gIWBfnB4fH19b3ONen2Be3iGi4mGg5Knu6yosr2vpa2zs6ijorCsipq0nqO4pJWtpJaprbempKOfmamYqaOvsKqamZyUlZGXn5eZu7utyaFptrirsJSYnqOrk5e+o16qsoKJio2Uh5F8jo59g4aOj5SViIeTl4yQlY2LjJeYkp2ZtJeWq56Lm5SSjZCSjJmbipKekIuJlaChjZSNmJqdk5uYnpShoJScnaWvqKGls7irwsjEtbq9u8XHyMLRocbJzc3E19bRy9OhcHpoXVlTXlJPRkQ+PENBQTg/ODc0PkY8PDY8MzUzNTU0NTRCMzo6Qk06QTtBSEI7OkA8NzQ2PEI5P0BCODc0Ojo2Pjw0N1RLQ1VRSjc8OklBREA0QUpITkJBPzZEQTxKTkQvVD0yNTQ6RUpcWEpaUW1ncHBEaWBLSTY3NTc6PkpAQ0lQZUdiYGJwSUCLin6Bc4aHfYGIdYKKg39tfX18f3B3h3eNgYd7jY+MhoyZqsLAr73Gu7O0wby0rauzt4yosq6uvKqbu6Sorbm4q6amoqGjo6ivsrGrnZykmJuYl56ipaWSo7muqMC7rK2yuaWkp32Ih5ysvbCDjIyLkIOPg5GPeoGHkIyOnIiHj5iNi5WXlJCalp2nmrGakaydjpqPko6UkJCWl46RoJGJlZujrJSWj5ScnpSgnZuYoKGUmp6npqSipLCypsHHw6+wurbFxMK+zafHw8fDvNXRzcTKiHRzYlxZX1tNSkJMQEVHP0E/Qjs6ND5BPD01PTY+MzMzMjQxQTE3QEJOPkdAQ05DQT1DPTs4NkNDNUJJQjo4Nzg7NUI+NzlWS0RXT0Y4PTRLQEM+NEVLSE4+QUE2QkI/QlNFNThQMTQ1Ozw4O0Q+OUxqal07V1JkS2daVU83OUdFP0NGXGZGYGlnWl1bk4yMiHuHi4aDjHWGkIqBb358gn9xfoF6lXqRlJSYkJOVp7TGyb/CzMHDuce8uq+rubuXsra6ssCupcCkq6+7vKqtq6KinaeqrrSwqpufqpuhm5WfsLSni6K6urXBu6upnLKlpKiUhY6qw8SkgouPh4iEhpWUjXqDjJGOkaGMjJSSj4mXn5eTmZWYpqCvnYyqnI6Wj5KRlJWNkJWRj6GUhpefoLKelJqUoKGZpJ+aoJyglJiepqSmpqSvraXAxMOuqLe1ycO+ts6yxL7EvLPRysjCtXR5bVxYXGlTTEhETEtLSkFBPUNEPDVBRDs6Mz04QjMzMjI2M0EwNUlFTT5JQEhSQEg+Q0A7Pj1GQTVBVUA7OTk4PDdFPjg+VkpDV09HOD80TEBCOzVKS0NMP0I/PEJGPUFITDkrRzwzNjc0NjRBPzdPYU9hRS89PjZrbGpgQDpIPj9FQmZaTWVcZlRjapmNl4qMiJKQhol5hpSQgXKAfI1/eIeCgpB5jaGWqJqamLq+yMjKwdLJysLMvMGzrbu+p7q/vbzEt6zBqayyu72qsKmjpaOsrbOttrWgn6+epaKYo7S8qZuovMGjtravq5Kwrausl4aaqqalkYKMk6WViYB1ipJ6hY2RkJ6fk4+Ui5CNlKOZl5yVlKOfqp+RpZqMj4+QlZaIfI+VkpKjm5Wgopy1ppCel6Wko6WenqaYnpWXm6WjqKeisqyovMDEr6Wzt8zAua7Es7u+wriswsPCwJhteWFYV1xbS0tNSkZERElCQkFDSzo0REg5OzQ8N0UuMTIzNTJCMjZTSE48SkJKUUVLQ0RFOkVMQjw3RVY9Oz04OT88ST86RVVJQVdRRjdBOks6Qjc5Sk1CSUBDPjxERzxCQ089MjBIMzY2MTcwPUI6PWpqSks1UVMzU3BwZE47RD1ARj5qSF9YYVpkZFaej52Nl46ekomKf4mfk4R3hX+Vf3+QiIqQf5Whmq6mo5jCvcjDx8XTzc7Ny7vBt6+6vLS8y7zDwbW2vK2zv7m8rq+ooKintq2tqbG3mp6toqehnau3t6mlr77Dsb25s6eqtbOtrpaWpayooJGOkrHFp5WOfJGVfYiRmY+qmZiTk4+TlZOlnpOdmZOho6KcmJ+Zi42Qj56IWpCWl5KWpZllmKOesqWWopasrKunm56ml5iXmJWhpKimn7arqbq8xLWltLXLwbiptqyyuriuqLi6vbiDbG5aV1RVTkZKU05LP0FHRERIRkc5NUZNOz43PkFKLjMyMDI1QjU1UFZOPExGS1JMT0hHST5JUT86OElTOzs/Nzk+RExCQEhTS0BXUEY6QT9HNkE3O0hNQ0U7Qz00RkU6QkFCRzkvOkEzNjAzPkdEOTQ9dGRNRztFKzpmfGhXOz1AQkZCcUZpSVJlYkxGpZSclqGXqZaNkIOHppOIgYeCnISDlZCQlI6aop+vvq6hxr3FxMbGzs7O0sq+u7Wxuru8vs+2xL23ubeysbWzuLOsppyrq7iqqKevsJejr6SnpKS0wLCqrLS+wrnAubOnubW4sq6Vpa2vrqWLk5WhjXTBmn6XmYWPlpqMsZWamZWTk5mZpaOVn5uWmqmdnKGgmouNkJadYEqWnJqVmqWWVJawn6+cn6WUr66sppqgpZSTmZmOnJ+nopm0qaqzvLy7q7Cyx8C4paurrbGxo6GysrSkcW5mXFpOUEtEUFBQUTtHSklHSEJEPjlLVT9BOj1FTTA3NTQ0OkIzNE5XTzxKS05VTlFKUEhISk9CPD5NUjs+PTg6PENSPkRIUklCV05JQENBRjM+NThKS0NBPUM7NEVBOkE/PkhANSpCNTIsPmNdZzozNXRkZUBSNyYjM31pWDs6QkNAPVFFV1JzYldGSKqXmaCiqK+ZkZeHi6eWjoiShZ+HhJ2Xj56gmqOktci0qca6w8PHysjIzM3Gvrqzrrm4wcHNtsi6wbi1urGvrrK0p6ObqrO0qqimrayZpK6lpKisur+oq7a3v8G/vriyssOxub2so661rLqmiJyYppt2v6CFmZ2Ok5mai6+XoZybl5Wbn6GpnqigmZqqmqKnnpiQjZGdg252kqKalZ2inpCtsqOrlaiql6qupaSfpamTkpmciJScop6Wsaapq7q2vrOyrb65tqCjp6ilp5ycrKmpjGNlYV9SS01HSE5JVUw9TEROSktCQ0Q8UVU9QUFCRE8xOD03Nz9CNzVVWE4/SE5RWVNQUVRKUUpKRUFFTVE/Pz04PTtHUjxFRFFCR1lNS0FIREU6OjM5S0lCPkNCOTlDPjxAPjs7RzctMj4tMYJoTnpcLzBraGA8PUJCODZ6Zlc7Oj0uLlJgTVVIf2VeSEWrlJyhn7uvmZSfi5Oqm5GSk4mrjYein4ykrZSjo7bGvbTBusLCx8jFws3Iwr25sq+5tMHCyrXGscG8tLqrqK2ssKOimaq0uqappquqnaivp6Oqqr68p6y8s7e9xry3tbjAsb3As6m1t6u/pY+jmJGioLyfiZqgmZeeno+3n6mcpaObnKGaqKWzoZudppyoqp6ZlY+Um4uXiYylopSdop6gtK+lpZOwq5mrrJ6eo6OpkZWVoIOQnp6clamkoqG0tLq1rai1srOenKKlmpeVmaqhnndgXF9dSkhGR01RSU1FRkZCUkxKQUVHQFZSREg9QUdRMTtCNzpCRjc5XFlLQUxQVFVTTVdSTlVKREBKSk5POUM/NT08TlFDPz9QP0VaTUpBS0RHQDUzPUlHPz1FQTk3QTs8QDw8M0A8Lyc7KkiRQjpTSjAsW29XNzE8Kh1CgGRUNDktMTpnXEZDQ5xwYkdFp5ekn5/DrJuXpJeZqZyWmpqPqpaWqKaVra2Zoau2xMK7vrfBwsDHxL7Nx7u9ubKvuLO/w8i1v6+8trm3pqOqrK2goJqqqsShpKirpp6rr6yiqai/uKatvbC3tse2tbm4v7G/wba0s7SvvqOXpJeUnJSuoJGhoqWjo5+QvqWpnaisnZ2hm6afvaKZo5+iqauhnZaNlZ6TnoePhY2TnqSgnbWsppyVsqeZr6ifmqmeoI2ZlZ+EjqGam5OlpJqYrLG2saqlqq2snJigoJKOkJaonpRoYllhXU5JR0pOS0hFRElBPVBJQTxHSUhbUk9LPUhPVTRCRjk+SEc1Q2FbS0NOUlVXVlFYVFJVSEA4UVFQTTpHQDRDSFFTSUM7Qz5HVktDQE8+SzwwNjtHRj47RkE1Nj85Oj85OzE1RDAtLDBNdlw0S1o1LE1uVzwtPSkeI3piUTVDS1E5b1JGPEt4ZWNXTKKao5yexayhn6ydna6gk6Ofl6Wgp6mrl7axo6qytcTDvcC2v8K7yMK+ysi2uLW0sLOzt8HGtr6wuLS5tZ+mrKqrnZ2epaPBpaCprZ+kqa2voqanvbamsby3trXDsrO3ub6yw8C3uK6ztbWjnaWWkpShrqCZop2pqKujmsOtqZ6srZubnpmmoL2inaWYq6uspqGZjZqfkp6Jjld/lp6loaC4qqeTmLajn7KhoJuulp6OmZSdgo6fl5WOoqSVkKatsqupoaKlpZWVnJiLj5GTpJ6JYWRaY2BMSEpKTkZFQUZLPj1KQjk5SktOXVFRST1MVlw5Rkk9RE1JOEhiXExDTFBTWVlWV09aXklBPVdRSUs/SEA1SE1YU0hBOkBBRFBIPz5RPks3MDk5RkU7OEc/LjY+Nzg+NzcvMT85MSUxUVVtW0pPMTA9Z1dEMTc9LSt3YFM2U1prV3NIRTY9dWVcS06en6GZnsOnpaKzoZyzp5OqpKCkn62prJ27sKistbHHxMHCs8LDvMbDvMTKva+xtq2wtK+/xbW5sbC5tayaqLCpqZqdpaGnwqybrLGbqqKusKmkp723pre6vK62w62zs8K/ssazurestLatqqKmlpWVpKyin5+aqKuwr6+8sqagqamZmZiToqS4oKGkk6+vrKWnn5KhnpWej5CNlZ2aop+ntKanjZi0nKOvmp6brpCek5eUmoCSoZWPjp+hk4umrLClpqGcoJ6SkpqThYuSjZyef2FlW2dlSklMSlJBQ0BJRzs7Rz85OU5NVV5SU0o+T15dPUhQQkxMSTlNY11MRUxSVFlbU1VPXGJIQT9aUUFIQUtCN0ZFTEtOPjtCSEROQj07TkBBMy85N0NCOTdGOys2PDQ2PDM1LS80QDErJ1Z0U2VPPzEwNGJbTTIzPjA8dl1eP1tVXmZyQDg8SJZ3ZUE0n6Sfm6DDqKSqsqGktamVsqynoqSyrK6pu7KssLW0xr/ExLXAxL3JxLXAyMK1q7WosLiswMS0t66strmlmauxq6qYn6aXrbu0m6iwm62frrSyp6q6s6e6s7eyuMCqt7LCvLTFp76urbe1qqisoZeXkqaloqOYmKWvuK6ytbagn6ikmZWVk6Sgt6KlppausrKmqqahnpuampaYqJ+gmKGer7Kipo2Xrpmlq5eanaSRm46Tl5mFlp+UjJCcnpSLqamqoqegmJ2UjI6ZkIKGlomUn3hjaF1rak1QTU5UPUNBTkM6OklANzdRT11eUlZRQVdgXEJKU0hWS0g6VGRdTkZPTltXW1JQUVhdR0FCW1BCRz5OQzlIR0hOUD8/Q0lCTEI8MklBOTQxNzdCPjs3RTcrNjkxNDgwMi0vLjw2LSNCcWdzazIzLzFbYlozMzgwNnBbYkgwNUpwaVZDV0aMeWZDO6SknaGmv6aor6+hqbWqnbmwq6OqtLexsLm3r7a4uMW9w8e9vMPBxsC4wcbBuqq2pK27rcHDuLiqrbG7opWtsK2ylqWnkKq5qaCnsJ2qoLC0sqqptrWsvKyysrm3rLmwwrq9vqbDq7C3r6mrq6eemJmroqKgkZihsa+zq7G6m5ypoJmWkpemobeppaOir7G0q7Koq5+boKCbnqWcopado7Owmp+Qk6WaoKialaGelZiJlJiTlpeck4iQm5mUjqmop5+jm5eakoaOmYt+jZaFj5tqaGxhbG5XUFFaVEFDRVRAOztJQTc6WFBkXlBWV0RZXl1NTFJOXktKPlpkXk5IUE5bVVlQS1NXWkk/RFhQREY+Tj89SUdHUVBCPUNGQk0/OjJEPzc3NTQ3Pz05NUU0Kzc1LzI1MS4tLiwxPionKz1ccD0+MS4xZVtkQDE2NDdnWWBGKD84bH1oW1Y7iXtjQz2nn5yiqb2hqq+ro7G4qaW1s6yhrbW9rrO4vLq9trbAwr/JxLnEwcDAuMS9wbevtairt7K8v7+0qa6xtp6Xq62orZanqI6nu5+krbOeq6KxsLOsqba0tb2tr7G1rLC1scC6xLervK+xuKutqqOxpp6lqqCkl5CZn7Oqs6qrs5qdp5ualY2gpqS0rqeira2usaezrbKppJyfqKSelaGYm6i1qZeZkpKfmZ6gnpCrnpeXhZWYi52ZnJOKjZaXmpempaKgnZWVlpOAj5SFe4+Sg4yWZWxyZ3ByX0ZZZlZEQ01YRFo5SEI2Pl1RaFxOWV1HW15dTk1SWGRKSkNcYl9QTE1OWFdYUEpWVldNPUVVSkVEQU0/QUZISFFQQTtGREZLPTg3Qj02ODcxOT48NjVEMCs4MC8wNS8qLC8tKj0sKyUyKyo1SzEuJ19fYVUxNTA9YFZeOClDM1lVXGdLNYx6ZkxApJmgpKy3pKyppq6utqmvtLqnprC3xbextr7AwbW0usW+zMW5wr+6v7nEuMG5srWsqrq2u7m9tKqtsLWYmKerqqubrKuOq72eq66xo6ugsa2zrq62sbm3qa2usai1r7O7vMmyqrW0sbSvrqehs6CaqK2gpZWWmpqyo62gpq+WoaSampKNoqWnsqmip7Ksqralr7G1r6SZna2nmpifmZmsuKOXk5CPmJyhmJeUq56ck4CTmI2dnJqWkYqUk56apaGhoJiVkZOVeouQhXuMioOLkmtueG51e2BFYWpZSUhZWz17SkdFNkFiVGlbTVxgSltdWlJSUmJgTEtFX2BgUUxJUFdWVU9HV1ZVTjpJVklIP0NLP0VESEhRTkE/SEhIRTw3PT46NzU2MDk/ODY2QiwtOCwvMDQsKCwvLSo3NikoOS4kOks1LiJUYFVgLzUoQ15RXC4qQi9KR1BbSDNjWVVLRJmWoLCosqmtpaSurrWpt7S4pKu0t8m7tLq6v760tLfDwMzIu8O8tr6+wLi/vLG9rqe6ube2wbarrbG4lJemrquno7GqlK+7pKyysqeoo7KzsLGxtbG4s6iuq7GnuK+1tMPFtqm0tauwraqno7afn6eyoKSVm5qVsp6nnKCqjamjnpuWmKWlpbenorK0rKexp66wtaylmaCsqJucnZuUqbiclI6Oi5mcopeQmKWgnpWDkZWQnZyYlpWIl5CXm6eco6CSlZCQlnaEkId7hYGEjYttcXd1fH5cS2VsXEtOY1w/YntHSThHZ1dlW01eYk1YWVdUWFRpXU9PSGFdX1BKSFFWVVJLSFdVVk04TVpORUBGSz9IQkNLU00/P0xPSEA7Oj47NjswNDE8PTQ1OD8pMDcpMS4yKSksLC0rLTkkMDQyJTlCNy4jQU5IZjI3J0ZhTFYlLUIuPUVNUTwzcmtKREOQmaWupa2uq6eksLKzqrewtp+rtbnJua7BvMK3s7G1wsPOxb/BvbS9v7+6v7yzxKipubC2tr+8r6uzspygp7CtpaWwpZ6ytayrsrCsqai0uay0srWstK2prKirqbmtsbHHv7ikua+pra2mqK2wpqSkrqOpnJ6cm7CaoqOjo5GsnqSgn6Kqpqa5pay1taWqq6isr7avo56jqKqboJqakqS0mo+JjYeRoqCVjZSdn5OShI6Skp2bmJWUh5iTlZmmm5+fjJKQjZB3fo6FfHx9h4qJcXRyfn19XFNkb15OWmZdRkSWW0g7Tm1YYVtNYGJOVldWV1RZZ15RUkxjWltUS0dPVFNOR0lWU1xOO1BeSUJESEpBRT8/S1NPPjpOTUM8PD45OjU9KzMyPTYyNDk6KDQ1KS8sMSgpKywtKiY1Ki8mMCkzODoxJiozQmM7NipIZEhKKzpJPzNCSVMsPo9rPUhIj5uqqqKqsKSopLO0sbS1sbGhq629y7quwLvHsbSttMLC0cXFvsCyvsHCvL+3vMSnrLess7i7wLCrsq2gpKetqaiksKOqsaqvrLCurq2ss7untrCyqbKpq6Wlo626rKqxwrm1q7moqKisqqixpaqkoq6qqKKenKOslaSdmJ6ZrJ2ip6miraajray4sbKhqaKgq66wrJ6fp6ipmaSYmY+gp5iGg4+Ki5+gj4uMlpuOjoWHkJWgnZaXlYaWk5OXpJydnIqRj42Jf36Ihnx3f4eFhnRzcYl2bF9ZYG5jUXNxXEs7hHxGPld1WGFZTmNbTlVWVVdQXGJeU09OaFhXV0tHTE5SSEVJVlJdYzxQXUQ8RkhIQkc/PUpQTDo+T0o9OT89Mjo3OyozNT4xMDQ4NSg1LyosLjMwOyksLCclMjM0JCwyLTg2MCkoMTxdSjAuSWdERjg8QjA1RUtYMUCUWz5NRpSXraeiqrKcqamvtqy4ta6qpauqvci7sL23wq+wrLPEw87Ow76/tMDCxLrBtMnErK+3rbK4v76zra6rpaeqsKmnqLGltK6rsK6tsa+yrbO7pLizrKyup6ufop6wt6uqrbq2pbW1o6mnrKyqraGpp6axsqSmpqGhrJaqoZSboKaepKKrpK2jn6ext62to6Wim6mqrqmdoqWkpJigmZaPmJ2TgYKQiYWcoIyKjoyZjZCLg4yXo5uSkJuMk5KRlKKZm5mKjoqKfIaBgoN6dICEgn50d4ukiHlrXmBuZ1dlh2ROQGeSTERieVdiWFJlVE1WVVVUT1xdYVVLTWlXVVdJSkhJT0JHSVNRWW9BTVhAOkpHRkVHPj5FUUg4Q0tFODdDNzI6OjoqNDk/Li80NjMpNCsqLCsuIzQuLSsmKCs3OSomNis8LTIsJjA2V1ouMEpnQUE8PEMrOkpPXjREhkBISESWkq+ko6qwmKuprbWrtrGrpayqqbzAwLi4s7u1pbKvxMnL0b/Bu7nAv8K5wbrBxK6ytbGzu8C+s7GurKurqLaqpa2vq7mwqLGxr7Grtaq2tae0tqyspKmqnKOes7OoqKS0tKC1raGpqKuoq6egq6uoubapqqqqoqmgrZuSqaGdoKSipqOqnp2mta6opqqio5elp6eqnKKko5+ZmJ+Rjo+Zjn6HjIeEnp6HhIqKjo2QjISGlaKajoyakZKRj5Kfl5iWi4qDf3SGgX9/eHWDf3t4foCInY9vcWdncXhcYHOIak9dmFZIbXhVZFZSYlBNVVRVUE9YW2JVSFBpVFZTR1BZVUk+SUhPUVB4TE1WPTxLRD9AQTxAQ1VDOUFLPTU7RTEzOzk3KjQ6PSstMzQxKjgqKisqLCkqKC8qJiklMzssJDIpMjAyMSUvMlFjMDI/Zj1OWD9DLD5MVF8vSWs3UEU7lY6woKWqrZmrpayus7SvqqWvqai6vrzAsK64rqG1r8nHyNHAvr27vMK9usPBv7+usrKxtby8wrGys6qzqKS1qaWts7O5sKOutrGvsrqrua6qrrWrqp6pq5+ioLatqKGfr7OhtKqeqKeqo6qhoqytqL2urK6toaeon6uZkK+hmKKhqKefqJuZqrCpo5+soqGToqOjp5iaqKWXl5mdj4qHlYh9jYaFhKSWhYKCi4aOjZCEhJOgloiRnZCTkI2RnJSXj4mFhXh0gX99dXh5gHt0dHppgYajdWleZWyCdWeIi3xSWHBeSnhzU2RTUV5NTVJZZk5MVlllWUZTaVJRP0JOUWFROklITFNJcVFMUzs8ST87PD07QEBXPDw+SDczQ0IxNTo5My01OjopLTMxLS02KSgrLSw1MiMyKScsJS47LiYxLjAtMTQlLDBMaDo0OF89YWQ/RjFDUFtbK0hPOlZCNJCPsaCkpqujpqSsprSzsaqksKequL7Bu6+nuaqnrrDJxsjRwry/vrm+v7zJvMG4sLC0sbq7uMCys7usuKyitKanrLK2ubOnp7u1rba9sLymray1q62cqa+jn6WsqqecnqqzpLOomqqnqaSpnaOpp6m9qrOvrp2ppKCunJuyo5WknKSln6SamqirpZ6bqqGbkpuhpZ2Yl6mpkZiak5CKgo+Ffo+CgIiej4Z/fYuHkI6PhH+Tm5OFk6KMlJKLkZuSlYeIfn9xenl+fGl3fHp1cXF9aIZ4hIdkYGhjcoV6bWd5XV5WQld6bVRhT1JYS0xOcXRdSFpbZ1lFVWZQRD5KTkRDQTlIR0tTP2phSVE4PUg8PDw+Ojw/VDY6P0M0NUg+Mjs1OTAyNzw1KC41Ly0xMSYvPktIMSUaOTAlLCwwOS8sLCs2JzE3Iy0vR2pJMTRYPWZiQUo3R1NgVSo9O0VaPyqPlLGZn5+ppaShq6S3srKlqLGnrLjBvbWwo7mtqKiww8nJzMG2vb+1t7+6yLbDtbSztbG9uLq+tq25tb+tobOmqquwtbi0q568vKiywLO6oK+ztaqsnq6wo5ylqKminpylsaavoJ+qqaiiqZukqKCtu6etsK6hq6Okrp6eraaXn5uho5yfm5qjqqKamqSklZaUn6KWm5amrIuekZCRjIKLgYCPgXualY2JfH6Lho6Ni4qEkpiRh5SjiZKSh5Caj5OBh3x5a312eXhie3pxcHFzeGmBc2qDZ2RoYW9zjW1iaXBgcEFceGtWXk5RUUpKTVNZVk1dXm1XRFhgT15QSE1ERjs3SEVLTzxyaEpLOUFFOzs9PTs7PUo0OUI8MztHPDQ/MTgtNzg7MigwOS8sNS4uPS0qSz4qHTQ5JicuMzQuMCsvNCYsOiQ0MEJoWTEzUz1lX0RMNktXZU8qPDJQWz0jkpmsmZ+Xp6Sin6ejuK+uoq+vqau4wrqzrZ+5r6uotLrHysi/t8G+r7S+t8S2w7GvurKywLW7vrepube9q6S0p6iqsK65saqbu72ksMC1tKGut7Wmp6exs6CepKanoaWZnq2nqJ6gqa6noKaXo6igsLiforGvoayhrKScpqepmpqbn6OVnZyanammlpufqJKYk5idkpmWoaqQmomOkId9iH+Cjn18oY2NiHmDjIWJjIyFh5KajomVn4mRlYKLl4yRfYR7c299cXN0YHl4aW9wcW9qf3JjemxpZmRhZoZ/YFtyanJNTX9pWFpNUExKSFBSUUlOXF9uU0RYWlJnT0hLRUY1NkhCTEk1WmVKQDZFQjk6Pj0+OjpDNTk+OjNARjwyQDIzLzo7ODMmMjwwLDg1QiopLUMqLDQ7Tk5AOzczLS4rLTcqKjwlNTM9ZmQyNE0/ZV1GTz1SWmhIKj4vWlk1KJedpZiclq2gn6GkobersaS0tKmoucS1sq6gt6yurbC1xsjAt7/BubC0vbe/u7+vq72wtL+xvcO5qbu6t6eotainq7Cts7Gnmr23pK28tq+fsbewqKWnr7GboKSgo6Shl5uvpqGfoqevoqCik6Sko7ewoaaxq5+so6+YnKqlqZ6Xmp2lk5ucmp2mqpmcnKSVlZeVnI6Tl6OpoZCJipCGeoR+hIp6j5eKjYZ5goeEiIuOhY2TmIyOlpmKj5Z+hpeLj3qAenByd25vdF94d2RsbGxqaYRtZXJpa2ZpXWRzgF9aa3VpWkl9XltYT09KSEhSVUYyOV9ebFBEWFZZZU1JSUVFMDdGP0tCNklKSDs2Rjk0OT49PDk4QDg7ODo3QEk+ODw0LTM8PDc1KDU+MSw7QTEoKzY8IzhSPSoxMTM+RDUsLSc0Mio7KzEzOWNsODRHQWZbSFREVV1oRS47MmJVLDKWo6GXlJyqnaWhoqC3qq6gurimrL3Fs6+uorWvrK2vtMPEvLO/urews7m4uri7rq3As7S4r7/BuKy8urWmorOqp6mzq62yopzBtqWotbWpnrK7qqemqa+smaKnnKOmlJiisqSZn6SoqZyioJOloKS5qKSnrqeepaGokp+poqGgmZudoJKbnJagoaubm5mhlJGUlpqOlJOjqKSQiIqPhnmEfIWGfZ2NiouGeYCEh4iHkYWVk5KMkJWUjY6Ue4OYj4t3fntsdHJsbHNheHRoaGpnZm+FZ2doY2ZpamBpYmlmWmV7Y2BTc1RbW1NMSUdJT1NAISppXmpMQ1ZVXmBLSUhFQy46QjxGPDZLUEQ4OkQzNTc9PTg5NT86OzQ+OEBLPT45Myk4Pjw6OSo2QDMuRTQoKyw+MC1OPy4rLTcsMTE5NSwmLjUtODA1NzZgdEIzQ0RnW0tXR1VgaEIzNzllTycynqSjkY6kp5uenp2jtaynqrm3p6zDwbawrKK1rqevr7fAwLyywbaxrrK2tri3tqyqvbOvsrG9v7euu7uxpZ62q6WltKmrrqCfwquopbCzqqy1u52oqquxpZidqp6mpJGZpq2imJ6kqaGcop2XoJ2ntqavqq6hoZ6doZWgpp+hoJmbmZySmZ2UpZ2sopiXnpSTjZWXjI+YmqmgkYiJi4l5hXeCgoKdh4uCiXx/hIiGhJCElpWPjpCRkZGNk3uDlY6Gcn19Znhva2psZ3Vza2NnZGR1f2FkZmZlampjanFZXlhebWRhTmhXWmBWSUdIS01SWD45YGxpR0JUU1xbSUlHRUEuPD85QTg5UkdANzpCMDM3PTc2OTI6PDk3OjlETT1CPDAqPEA7QT0tNUIzNz0rKiwwQSpKSy4vKiszNzIyKDU3JCs3LjcyNjg1XHlOMj5IaVpMWkpWYmZBOjNBZkglNZukn5CMraGZmKCWpLSxorG9t6Gxxru5sLGjt6yqrqm5vbu7rcCyr66ttq+zuLOoq7mxr660tru2r7i9raadtaugobClq66epMKgsqSusa+3rbWera+trqKZnaiqpZ6Vm6iln5mlo6idmqCclJydrbCmuaiuo6Gamp6ZnqOapJ2XnpiblJqgkqiVqqebk5uckoyVmY2UlJmop42NiomPfIJ0goGLmIWHfImJhISKjIiShJOckpKPkJGWjpB/gIyNg2+Af2Z5bmhramdxcmtcaGNicn9hZWhqbmxnamlmbFxsbXVxYVRiaGRlWUlGTE1PWFFRVmFlgVRAVlNZVUZIRkVALzw9Nz82PEZOYTg6PzI0OUAzNzgyOD83PTg+RkpARDkyLT1BPUE9MDVAOUAxLSsuMzw7SzYvLissLTI0OzYjMyopNi41NTQ2NVp8XTE5S2pbTVtLWGRkQEExSWVDJzSTopqOjrCdmpOhmqmysJ+4wLagtMK7vbmxpbavqK6lt7i3t6y7r62qq7eqtLmupbO1sa6psba2sLK1uqeon7apnp6poqqtnKnAma2krrC2ta2tn7GtsKqim5yjrKiblZyno52aqaKklpqgnJGbo6uqqbufqKSgmJqZnqGPa6KWmJxxgpabpIB2kamnnpWVn5GJl5mAloqgj3mGlI2Dbmp+d4NxbIaLhn2Ei4ZvXmNgZ4SXhmuLkJSTdXeLhH6Dj39mhoBodWlmV1xpc25OUGpjZnGEZ19kZm5saV5fX4mQhIZnT0tEOEVUZ15KR1BQVVVLSFNhb3RlRltRVVBGSEZDPjE7PTY9NjwzZlw1Ojw3NTtENDg2MDpCNz86PkZMQ0IzNDM9QEBAPTI4QEU9MSwrMDg+RzYwMS4qLiovNTY4LCMxJzIxNDoxNzZYgWwxNk9rW05cS1tmYj5HMVBkPSsvjaSZh5Wwm5yToJuqrqujvcWvqbfCuL28raa2sKWrpLizsrOwua2qp6y0prC1o6i4trWop6y2sq60rbOiqZ+0q56ipJynqJqsu5Wmpa+zuK2upaiuq6yloZ6coKemm5ihpqWbm6ennZOeoJmQnqiqo7Wwo6OjnZaXmJejiKGOkpqHoYeUnaF/pX+mqp6SkpuSiIRyeI2OhIihdoiNaZeIZn1zeKFviIeEfo17f6Ggn5mAe4eedIiOdpuKbIeBg21oZWN6bHFiVIZtY2xpmHFYam9uhlheaVtraluIcG15coZoh4RaXkZOPkZeTUVSVlZRUVJXVGdeTFhKUlJQRUdHPjw0OT05PDc7MDw8Nzk5OjY9RjU4NjA8Qjs8OT1GUUc9LjU8O0A9QD41OUdBODIpLjE8STkvMDEuKi8oLTQ1ODMlJjIxMTU+MTw4WIN1MjVSa1tOXExcZ189SzFXYTcvKIyml4OcrJ2ZmZ2fqqqnqb/DrrG6vLfAvqqkt7CprKayta6vs7arqaWxraW1s5yttba0pqeps7Gtsqevn6qgsqifpKOaoaOcrrWVpKWmtr2mrKeqqqyopqKgmKCno5mZpqOkmJykqZaUopyVk6OlpqC3pKSgo5iVk5iTnIiuj5iUiamLl6KbhbGApKyck5mdlXmC1Kh/h5TBm8d5d7Glt5dkgMCcv3mEhHmPg3yQkJHKcZa8nMV7cranupB6gWyWsauweWhrWLGub2VpvJK8bmh5bXKP2H5TamO2sn+BcZR1mqGqkFdPV2FPVk5GVFtYUVBSjFxXXFBAXUVRTkVHSTw8NTc9Ozo5Oi49Ozg3ODs5PkY2Ojc0PkA+Njk/RVJJOi41PjtCPD9BODpKPjUyKjIyQkUvLjMyLisvKS0vMTg2LSAvNDE2QTE9OleDdzIxVGtcT1tNXmdcPkwxXF00MSGNppOBpqmfl5ydpayyqLDCvbK1wLW3vsKrprStramnr7Oqr7a0qKimtaanuK+ds7K2qqWkp7GurbGmqp6npLGkoqGel5ugnq+tlZ6in7S6oqqooa2upaKdm5qiqJ+Ym6ign5iep6eRnKeblJ2hp6KgsKOfn6OWlpOYkpmFr2pqio2qfmeElYetZXGdnJSZpZVxrqGkfne7fGuhj3axX2q0W6WAZpyRYGaBemZ/anhqqWW+cmemjHayanyxeHSSk2NtbadtW4SgRWlnh5ZFdZxgfWd7pKeCWV+Lq2mBlXh6aqc3Sq9bV1RsY1tLTldfXFdWO06IT1dWL0lUVEpERUY9PzQ2Pzs4OjkwPTg5OTk6PTxEODs6Nj1BQDY8QEhRRzkwNzxBQz5ARDhARz0xMy0zM0UzLi41My8rLyguMC46NS8nJDIwM0IvPTtVgnYyLVZqXE9ZTF9nWTpNNV9ZMzEbkaKVgqynpZ6jpKmxt6yzvb6wt8SyuLrCp6mwq6+pqbCvpLC6sKSlrrOjqbmpnrOysKOloKqtr6uvpqefo6KwnKOcmJWXm5ytppeboZ60s6Grm6KtraCemZegoqmcmZ6koJyZoaekkJ2jmpehn6yfpqegm5+hlpWRl5GahbWbtXiFqZm1mXeHs5u3fpOVlaiUfmuBpnqChYiSlJJ3q2drsVuse4+HlHSIcI+GgICIkJd4g4KLl4yDoI+EsHZ3n3Fra2x8i06kWEhjY5l+Y2imYHlydVOSh15QqW1jcX6HgGKdLlGhbltUa2dgTEtbZFhcWkI+sHhXWEEjTWlFQ0RBQEExOT44ODo4NDs6OTw5OkE6RTo6OzY6Q0I4PT9LTkc6NTpBRkJAQUQ8RkQ7MDIwMTtGLDAuOTQwLC4oLzMsPjgzMR8vMi1EMTw8U31uMytYalxPWE1fZ1g3SjlhVTUwHJWflIizpaahrqmns6ypu7bCsLzCrbi3waqsra6upq6yqaGvvKqhp7StpKu1paays6ejop6oqrKosKelnp+fr5afmZWVlpifraKamqSota+hqY+pqKqbnpWYoKWomp+co5+boKOlo5Wbn5ianaOrm6aanZuioJeTkpOTnIPVk5m5cLDCfsaGfNaUm7t8mZWlj42cjaR7joekgqWCeqx5j51Wr3uJfp9quVq5d4aEfaaCk3yYeqp5jpyPe7FtjoR0kLyFb5RQr6fFilGgemNgqmJzcodsl4hgU7W0yIaAiXxjpDNCnXZdUWpoY1BAWGZaZGFKSE1sS1tTT1lmWkNEP0U/MDw8NTk7NzQ8Ozg9OjxDOkY6Oz42OkBDOzZAT0xIPDo8REhDQkNEPEVGODEyMTFEQy4vMDQ4MystKS4zMjM5NzEjJTUqPjM9PVF3ajYqWWlbS1xQX2ZUN0c6YVE3MiWbopOYsaeopbOqpbSopLu3wbC6wLG1tbyztaexsKOws6afrraom6i5rqOvsaCztLCgpJ6fp6mwqLSppJydnqqXmJeWl5WWoauempeorbCpo5+PrKKnlp6XnKGloZehoaKhm6Kip5ueoZ6VmZumoJynlZybn6GZkJKVkZ2Ism5otXGrh2+OpnK0c3K2e5mYpIyPnI2ifpGgpX6wdoOR0tF2XK58hn+kb5uqpmuGhX2tfZeZj3uxc5OdjnizZZZ0hJ5vnmaUUsiLWsJcn3liX61fdnOHYpeIXlnKnW+/gXVNS7VTVcZkVFFqY2ZYQU9qX2xpT1VGSTk9V1JbV1hIQz9KPDI/OzU9PDQ2Pjs3Pjw9QztHOTtANzs+RDsuQ1JKRz4/PElKRkNFRD5ISTkxNzQ2QT4vLjI0MjUyLSkuMjYsNzQyJh82MDs1Oj1QcWg5J1dpXEJOVF9lUDVHPWFNNjIvoZyRpa+spKq7raa0pae2u7yyur+3trW6urOltLShsbKjn6ywpJimuq6ksbGdtLiqn6adoqqksaesqaSanJqonpWUmJiSkqOooJeTpqqxpqKWk62fpZKUoZukpp+UmqamoZujn62aoJ6dkJacop6cpZWdlZqin5aZlpKbhax7d6h2o46Jh6lvrYqCp4OYmaGJkpqKon+TmYmuhX+Cs1xys1KufYOCpH9x1313hX+PnYaZmXevhoqRnId3tGGaZZqBgpRsklqwWEuadZh5ZmCtXnZ3h2eYiGter3eVno94bDV5yK6yX0FUb15nYEVQbF9xbVZVTS5lY2lTWVE6QURATDo1PzkxPTwxNj85OEA9OkM6Rzs8Pzo+PkU5LUVVSkVAQzpNS0pCSEc+R0s5Nzw0Njo+LzA0MzMzLjIuLjE4Ki4zMiUhMDM3Njc9UGtlPiZWZ1xAPVZfY042R0NgSTo4OJ+dlKC4sJe0wa2os6ipsrq4s7i/ubeytr21pbizn7Ssn6Coq5+Vp7arqLGyq660pJupoKCoobWmpqqjmZ6VpaGUk5yZkpWipZqTkKesr6aglZmpn6KPkaKZqKWflJmlqJ2cpZ6snaGdoI2Un5ueoJiZnJaXoqCTmJGmnYapfX2leKGPjoOqcK2LgaeGlaChiZeXiKOCkYiUqnyAi515b7FaqIKCiKB5dNh/dod0p4GOm42SpHyWkJ+Ee7JenGSgfoOVbJJcq1tak3+Rf2hnqmNye4FrmIdxXaxaiaCOa25lT0pDoVxaTHReYmVNWmFfcnNfSlU2SpqTWUhFPUhGQUwzNUE4Ljs+MDVBNzhAPDY9PEY/Ojw2Pz1CNy5IVkpFQUg2S0lOQElLQEVOOjpANC47PjAwMjE0NCsqMDUvNywmMjEoJCQ2NjcxPFBlZUEmVWZbPzFVX2JMN0ZJX0MxPjihnZmZvquXtMKuq62ppbSwuLG1v7m6s7G3vKq7tJ+wpJ6lp6eelKqxqbCqtayrr6GYoaCmpKO5oqOroJebkaKglZSfmpSYn6CPjYypsK+mnZebqKafjJKkl6iqppOXqaeen6GjraShnqGNlKGYn6CSnZeclZ6hlZaPq5uPrm1ytHKpjHaKpnO0eHOzgJGkopKcjYmkh5B3uG+Me4uia2u2WqCFZZeXaaGip22TcrR0k5h/smqFk4itanWzYZ1mom+HkmqXXK1gTaF8h5FSc6NseX9+b5iGcFyvVjycd2ZUb24uXKdPYlJrZWFsWWJcYHB7Y1NZUT4+bXAzQkJAP0w5ITdANi47QDM3QzU4Pz8zOzxDREJKRk1JRjYySlRLRUJJNklKUD9ITkNGUD08RTUwOzwwMTAvNzUsKyw0MjYvIzAwLCwdMjg5LzlOYGVEJ1VkWT4vVV9hTDVGTV44MUI4pZqbnbqhm7LArq2rq6e3qbivtMC1vLGvubirwbapqqCbpqShnZKqqqe2o7Korqqgl5ynoKWruZ2jrZuWmY+lo5WNnaGbmZyfkZOUq7avp5mUnKyql4yTpZmlrKGRl6qypKCeqKuwmKGjkJmil6CblpuXoZOcqpyUkauZh9SSmrtzsMOAw4Z+1ZabuHiIkJeMmIqMp4h6o7Z1fXd2woKasmCDunnAfHW4YrWBjIepfZaBrKlxe391vIinoGmdYaaOr6F+jHSHq32+bnO8dLKDdXiAim6aiHFujaR0vV13fVthebxrWlZbanpeamBkZmJtd29ZW1lDQUByP0NHKzVIIic7PzEwPD83OkI5OT1DNDxATlpeYGBfX19aUFBSS0VGSjRITFJASk5FRk9CPEU4ND05MDIwLjg3LSouLzE4MCItMSwzHiw8OjA4TFhhRidUY1g8L1ReYEs1O0xbLTdBOaeanqG8opexw7Ctqqqrsae5r7bEsbqyrruwrsGyrKWinqOhnJuRqqSqsqS0p62kn5aaqpmmrLicoq6YlaGQpaCSjZyjnpidmpCWk6+5sKuVl6Oop5SQlqScpKydkaCoq5+bn6mjs56ipY6nopShmpyXlaSYj7CgkpWqnoWQmbaAkJGMuJV4gpObtXdua25zbnmPhI6Jc57Bu72ae4GyqHB/dJG4g3yGhouHjXuKho2XfKS7ub2cdXq0o3R2l3V0sHWZnmaGaY21dHJwd7aMXn95fYlog3lteWKLrHB1hX9ZW6dqRGRZU2ZgY11jUWdmcWx1Qk5QTEQ7Wkw+SjM8MCA4PjsuMz1BOTk/PTs8QzZCVFlaWltbWlteYGJgXVNHR0g0RElUQktOR0VPRj9HPDc/NzA3MC85Oi4sLy0qOC8lJjIoNCQoPjcvN0xUX0cnU2JWOCpPXV09KzpWVic9OzynnqCgv6WWtMO0rKunrKupu66wxq+1s663p7W4ramjoqaeoJ2ZlKykraqmtaion5uWoKOerKS+pqGrl5SdkKKbko+iqKKTnZeSmJSytbatmJ2kpKKLkpGmm6Wrm5aopKWcmqGppqejqaGSrZ+Xo56Yl5edno+wqZScp6KOan5pnKd4iXN+mo90emWHer6+wLpukoNxlIZfcmpaXpqJYWSHjpVrYH+VY22cdmKUa3+alZRlXmBjcZuKaXKMfYaVZ2p+cnR4fX1iW3d0gWhQXG6DfHuLa1hseoJySUpvhXBNdE1FV1xmYExbWGdjXk9bbXVpcVJPREVNO0hJPEw/MiwyQT84LzU/Qzw5O0A7PUM+UlZWV1laW1xcXWBhYWFgXFVHNURGVUVKT0hGUElJSDs4PTUxOi4wOzouMC03Nj01JiIvKjIsJTs4LTdKUl9JJ1NgVjQpUF5MKDM9W08nPzI+qJ+oocGjm7S6tqOtpa6nqLWxrMissLOstaO+sbKmoKOpnaObmpmsp66kpLWppZuXlaGbp62ovqepppWUnJWgmpOYpamnkZ6Qj5icsLK/rJumnqeiiZORqZqopJqbq5+jmZujp62in6qimrCblaagl5Wdn52XsKWYoqiZnJGdnKOkmaejmpyampqQloFnbX1xd5GXlJGFirWqjYaYlY6KjJeXh5SVioOSk5GJjZGTmJSYl5qgopqclKGdjoJ6pYVsanyQfIB0iYqBcYJ4eXZ2ioB7iWpzgXSDdWN3fXZrcHttYGNccGdNWVllal9XWm96bW1mU09GUzlPWk5STygrOkpCNjM1PUBBOTpDPjxFTlNTVFZXWFlaXF1gYmJhX15eW1RLQ1NHS05ER1BMT0k8OjszODksMjs4MjApNklSTzgiKSsvMiM0Oyo3Rk9bSiZSXlMxMFReOis9OFxLLDwtQLKgs6K/oqSxsregqqWyp6WwtarJq62xpbWmwKi0oJ6kpZyklpagq6aso6O2rKCZlpagl62ppcCeq6SVkpyXnpiTlKKfnqKnk5GYqKeyw6+aq52rno+WlqmeqpycoKyYoZqcoqWvpqGkqJ6tmJemnZmaoZ6enLCgnaKmlZiTmJSgopajnpegjpaUi4qNjpatj3yVm4KSgouqqIaBmJaKhI6fiHuEkIaFmZCHhomVjpuXjZCYnqSWmpORnY1/jWahs6+FiYR2eo+KfHZ5em9neZCBgIlrdYF5iHJoc396doOIgmt0Y3lmYGlkYmRmallre3BpalxTTFBEX1VGQD8/LDRARjs0NTs+QTs8Pz4+SE5OT1BTVVZWWFpcX2FjYV9eXl1eXVhWSktMQklPTVJKOzw6Nzg2LzI5NjQuKCYkLTEuLykrKjclKzwoNkNNTUQvVF1RMDVNWzE3RTRcRzU8LEC0oLmvvqyrrrKyoKqmsa2irLOwxbCqraOzrryktJygpqKhnZmXqKappqSms7WelZSdmZmwpq6+oKujkJGempmUkZWhnJepnISeqayis8izn6qkq5aWl5qnnaibn6SrlJ6fnaCqrqmlo6uhrZufoKGZpZ6cn52vo5mfqJOYmJ2RpZmYqZ6al2aDknxlfo6Zj2N5jWxoa3qRpKtrZZqYfmeFimVlaWh6jaGOa2iMl5Gid2tqi5ijn5lzbG56hIyHelhlXoWBXmyKiYB2XGhzd3eRgIeCbniCeIBzbXmDdHeIiI6De2qFWV5rdGRdc4hoanxxbGNdUU1XSmRYQEo0PUY3P0ZENzE8PT9BQzs7REdISElMTlBSUlRXW15gYWFgXV1dXV5fXVpVT0RIT0tTTj0+PT02NTM1NTU0KiYmJSwqJS8qKyc2KiQ7Jy9BSltKLzdaTzYpRVkvRE8xWUM7Py49pZ+6vLmvrLOxqqWora6wpq6tsL2xqaikra+xn62Xn6OeoZqZpqucrKOmqKmyrp6Vo5Cir6a2uaWuo4+OmqGZk5KboJmZpZZ7payiqLPDt6Sip6+enpWeo56jnKOpqJGeoZ6gqq+qq6Oqn6ibpp+ooayWoZulsKSYnKqVoZ6ak6WYnquZnn6+g4hytHKEnYataHi5xLhxk6Kje6aYmXOqgnzLwMC7cYuih4KffJWYiZ7AvYKWnZ6NncLBe4F7ko2aw8B9a6Wxb4yAb8p6f5t3kYOOgXd6gX95cXp/h3F4hYyTeW12kmJmX3hkX2SAYl50aG1kYlhMVklRWkhPRDJJRT9EQj4vPD8+QEE6OERDQkNFSElLTU5QU1ZZXl9fYF9eXl5eX19fXVxTTVBHVU5BPz89NjQ2ODI3NiomJSMpKiYuKyopMTAfOSojPklbTCojQlAvI0ZbM1BZL1VBQjsvOJajuMO1sK/AqaiUo6+psK+tprK1r6qmpqaxq5+rmJqioJybqqeinauipailpLSjnaKTpq2st7Onr6KSkZqdpZKRoKGXnJ+dh6erpKutv8CwoamvqZeSn52imaKjqqOSoKGdnq2uqKymo6KnoKWlnq2pkaSbqa2qnJ2qnKyhlpellqGjmJx/zpR5eqSBeZWWm1+uj16Op4GioHynlZt0q4OAr15jjal6p4eFoHSXkoizY4KrhqGOjbNqhK50fZaHuGGCrVmjzW6PdXvae3+ZcH6Ik3Z/ZXuIdnZrfYhufoWRkn5tgY5gcWtwZ2BfeGRbcGhqZGZgUlRSV15LT0M1QUhFRDg+NjtAP0E7PThAPj8/QkRERklKTE5QUk9TXF5fX15dXV9gYF9fXVpXT1VKPT8+PDU1NzgxNjQoJyQhJywmJi8oJiszHTYwJDc7U0wrLC1KMCc7XDtMLSFQQEY0LjGtwsC/tbSwuJiekaSqqK20q6ayrK2spKunsKqgp5uZpZecoq+foJ6op6OloZ+wrJuelaeurbGrqKyglJKbn6WTj5+ll56oo56upKuwqMDGs6ipsa6Wkp2copegqaqelKGfnJ2ur6eqqZunp6Shq5KttJamoquqnqOnpqGwoJKap5qhm5SUkZegcIWMl3WEqIdxsXydcax+oZ6BpY+ed6uCfa1/nHKtfquHhp92mJJ6fJd+qoiijJGLnX6re4mTj5+Ae61WnMR6j2+SwX2BlW11cIxtZXZlhm9hd25yb4mKkZCDbZCPZG90dXBgZ21kX29paW5mY1dTXGFaUlNDOUlJQEQ8PjxARkRDRUE9PDw8PkBAQUJFRkdFQENJU1dZWlxdXl5cXl9hX15eXVtaUkM+OzkxNDc4NDUyJiMfHCAxJyAxJyAnNB41LSY3PVdKLTwnPjEpM1ZARiEcRzpDMS4rsNTGxrK0n52jjqOjoa2vtq6osKepqqiuq6unoqSdmaKVn6arn6KloKioop+dsKyXmpaop6+sqKepnpeUmqOikpShrZudpqOvrKOstaq6zbGtp66slpScnaKYn66snJagmZ2eqbGpqambq6mjoqybr7GiqKyuppmmq6qqsaKSl6Olm5SShaRqpHWJeql0erJwgqWJmYxxiKCah6RgYFKshH+ug5t2roGmhoafepiWhntmgKOJpJmGgaN9qX6BlIeuXnypVZ2ikoF6op+Ae8OvxYxzr7OzuXFiqa/CdGiNjJiPgW2akm9teXd3b2xmZGVxcGZ7aGNdV2BqWFhVTU1RTENDQUI7Q0BAQkk8PTo5Ojw9Pj4/QT04NjtETFBSVFZYW15eXVxeYGFgX15dXF1bU0lCNjc5OTY3NCwmJCIgKCciKy0iJC4hMy0mQERXSCxHKzY2KjFQS0wjIEE5RDQsJ8PJ1tXAoZmrqKGvop6wtbCvqayjqKaqqquppKagm6SenaWnpqOcrJqiq6Gkn6+inZqSqqS1sK+gqZudlpSno5CaoqifoKacsaajp7GstsiytaqsqpWRnJyhmZ+ls52aoZScn6erq6OumqypoqGqo7OtoqqzsaKbqqivsLajk5akp5ibkXyqbJ6Eh3WreXywb4Kki4mflpWflIHSuLS4yYCBsl9flKmDpIiHoHmYlZp4qsl0maOVp6mQkpuMf5uJmsbGeGWhgqVzgZ+Ogn2vXnC1Y7F1S6OGbadHgpNkj5Cek3xwl5J/cHp0fHttW2ZqcnFmgWpeYlljbVxeWUlNTEtFREFCPkE8Qj9KOzc5Nzk5Ojs7OzMuNjxBRklMTU9RU1daW1tbXV5fXl9fXlxcXFxcWE1CNzU2ODUvKSglJiUkJiksNEVOUFBNRktKVkYqTDAvPi01T1RRHRw7PEYyLCSnpMHGua2ps66spaKcsrmsqqGmm6imqqyppqCmpZiro5+uq52loKyanqilnaa1n6KXk6iqtrKsm6WdoJWQpa2RmZyno6Cqp66io6eqsLTCsrOqraiTiZecpJqho66ml6GVmJylpquar52tqKaerKO3rKGyua+em6+ns7SzpZSXp6OZn46CnU54moF/n3qEo3yCpISHp5+cnpOEuHt8ebmCfszGwrZ4m6GRi599mpaXinaemIqkmKOofrCFnIWehKx9mZRhpWyjcI+FkIF9l4NyrGCkc3GAmmC8fVJVdY6Ro5d8fpKRinR6c4R+cFttbndyaoFvWmRfaG5iZF1LTVFUQklIRkk6OUs+QjEwODg2Njg3Ny0qNT09P0JER0lMTlBUVlhZWltcX19eXV9fXFpaWllVU09IQDc3Mi4sKi4rKicmP1FUVldXV1lYWFdVT1VGPEUzOlBbVBwbNj9ILC0gi4eZqaykq7mrr6Ccoayzs6afoJWlrq2uqqedpqaao6ehsq6iqKayoJmppJSitaKjlZehqbS5pJujnaOTkKGymZ6cp6ahoq+unaSoorWyw7Gtqq2qkYeQnKaco6ScpZeemZmZpaSomq6hrqWml7ClvK2ht7etnp61srmxs6eYna+ho56Gj9G1w7d5h46FkZOPgKZ4lKJ3jKCShKWBinGqhoS0bnJqmaOblYqffJiZhoePc6+CpZuijaaLk52JlJCbbXCyXKVzk3qcbJl/e5l9bqlhonFxf59ic7K4aHiPk6aYfoyMk4p3fHmNgW1peGl4c25/dF1kZG5tZmhgSlpYWDxIR0BVM0BGPjwqKDYzLjAxMykmNDo7PD0+QENFSUtOUFJUVldXWV1fX15eYGBdW1paWFVSUlFGOjIyMzAvKysoQFFSVFVUU1RWV1dYWFdVVlZUUU9RW1UlITJBSCQpJZNzjYqtv7+7urWel6ikrbWho5mVo6mnrqqrmaWin6WgoLWmoqinsKOUq6OOpK2jnZCamqq0tKSdpZ2pkpSXrqCgnqeknKectZqgqqO2q8OwqaupooyEjpyhoKailZqbnJmamaakppirp62ipZutp76slb6wrZ+jsLO6rLSnm6ixpKeYeqiQfXywd4qBpKWInG2yb6GHrXyhj4OolZiArIiFroWflKmgoZaGn4CZlYB7kn6rgJ2aloqqeJ2gj4mTkoB5r12jgXymp2SdgHyXdGuvXaVrcYWZXWBbjKBulZGmmYOUjZaLenqCln9rbH9ifXRtf3pgZ2Vxb2hnaENZYFs9S1QyVThCQkM3JCQzKycnMywgLzY2NzQzNTlAQ0ZJS01OUVNTU1ZaXV9hYGFhYV5dW1pXU1BPTkk3MDUyLiosQVRWVlZVVFVVVVVUVFVUU1RWVldYVlVVUUhGSUojKCi9kpqEqcbCt8G0n5utn664paSOm6SjoK+vqp+kn52tmJ65oKKqoK+pma2hkKqopJaJm5CusKymn6ebrZiYj6yioZ2mopqlna2Yn6imtqnAr6WqpJ+LgI2bmqCmnpKVmpqUmpqlo6OZqKuro6Sfqai+pJfDrKqioayyuquup6Czr6mqmHavfpCLnIWHfbqtiphlsIxlla19oY+DppWagayKhLCFpZmkoaGQhaBbbGqBs2B/rXt7goCxbGdumZeMiLBbfbRbpINryKJln4B7vFl2tVqyfVKvgHqsWIChbZiPqJqKl5CWlnt4jZx9ZHN9YoN3dIB8YWpmcW5mZWVPVWNbQlRePkkoPjk9NCEiLCUfMi4gKjEvMDQ1Nzk5PEFDRkhKTE5QUFJUV1peX2BgYWJeX1xbWFVQTkpHQzU1My4vQFVaWFdYV1hYV1dYV1ZXV1dXWFdXWFlaWltcWFdXR0I70p+zsre9u7TBs6Ocraaltqihi5qgn52zs6meo6CdtJigs6iqq52vrZ2rm5WvqaKOiJuOr6ypp6Knma6TmY+omqKepZ+Zo6OlmZ6jqbKovK+lqJ6djnyLmpWhoJmQkpqbkpmXqJ6gmKitp6Wlo6Wpu5+gxqelqaGrtLatrqefvK2trJWBqZKjr4+bgIakl5iQgYC4w7qDjp2ThaeXnIKsioKviKabmqWqkH7VvcKqYqO/vX1+o4KD17q4tYWUk4Oevb6EaqOBb6uEbZ1/erKwx4Nqq7C9rXh3or67dICWjqacj5qRlpx5gZCaeWN9emSMZnmCe2BrZWtqYlBiW1NqXEBUYUJOKT06NC8eHyQeJTIgHSQoMDQ5NjY3Nzs+QUNGR0pLTU5OUVRXXWFcX19hXmBbXFlUUU1JQz88QT81PVNZWFhZWVpZWlpZWFdXWFlaWllZWFlbW11dXFpWWFRXWryVs7Sxv7myvbOina6mpbOmnYuYpb6pt7Goob+mprKbnrGcuaiera6lppWUsKyXjIObka6mo6yhpJyqoZiLo5KnnqicmqGpopmeoKutqbmuqKObl5N7h5mRppuTj5GYmI+Yk6mZn5ipqKCqpqGjq7ueqcWjoK+jq7O1q7CqoLuor6+ac3WqpLeGZYmfcGetj4qPbW93pJCZn4F1rpmVcI+LcZWno5uYrqRybW1tZYp4b22CmXGAeWlxaWeJlpWYcWhphIZncIZkXYljam9ZXWd+d6ZgYnGOkm9mZICNko6imJeYkJWefIeOlHVmhndojWp5fnlkbGNmbGJLZFhKa1k6UWVFUidLOisjHCAbIywpGBsYLTIuNTo0NTc6PD9BQkRFSEtMTU9RU1ZcV1pcYGBhXV1bVFBMSEQ9OkFCN01YWlpZWVpZWFhZWFdXVldZXV5eXVxcXF1eXV5dW1tVV16ola2zqrq5srOrqaKunqOyqZiSvbHDyL62qp7Aq6yjoKesn7qjpK2srKaOlq6pkIyFlZetnqaqop+jo6CRjKSSp5mpmZajqqCWnKWlp6+6q6yam5KSe4SWjaWXjZGRmJSNmJWnlJ6XqKKasKaeoqy6n7DBp6Szpqyxsqutq6e5pK64loqhqKW2nYmWopeHqZqQlJ2TqrOZm6OroLKWoqGdoKKcoKShlaumjJKSjIeSnJyUkJqTmJCNlYaBpJmXlY2Lk5KKj4aEfmeKf3SCdnSHjHGnbHuVkZSTgYGPj4+PnZSglZiWoIKHk4xwaI92cIp3dnx6amxkZG9jVWBYQGlbSGNhT1orRj0rJiE3NDAuHxwhJTIoKjY5OTQ2OTs+P0FCREZKS0tNUFBRV1RWWV5fYWNdXlVRSkVEPjk9QEFTWFtcWVdYWFhYWFlYWFpbW1xeX19gXl5eX19gYGBfWVlgpZapqqW1t66uorCkrZ+gtbGQjqvFvMS7uKqipZ2bpZ2wqaO2p52ptKankZisoouIiY+cp5aspKGZp56ek5Wjl6iaqZmUpqGjj5qnmaG1uqirmZqQjXyBlIuhlIqVkZWQkJOXpY+emaifnLajnaest6evwa6jt6avr7CtqamzuaGvvZmSpqOmtqKSnaaejamfjZKfo6yvmqGjsaivl6SgnKOpnp6dnJernJKZoZuTkJaqmY2ZmZaQlZ6RiaCdlZSFkoyQjJSKgH5mjIZ1hnZ5iINznGqGkZSUkYp9jJaSkpiToZOdlqCDh5eGeXGVcnmJf3F7f2puZF9waWBbYFltY1BgZFBbOkdHRD0yPT03LiomKykmHSY0MDY2NTg6PT0/QUFDSEpHSktMTVNTU1VaYGBpYGVWUEpBQ0I7OUVNVlteXltaXFtbW1xdXV9fXV5fYGFhY2FhYWBiYmJkYlxbY5eVpKijsLOsrqOpp62gqLWqkJCdpLO7r6ysoqOaep2isaSlsKiWm7imopSZqpyOhoqJnKOQrp+jlqigoZKXmJuui6uWj6iaqIyYqI+eubakpZmbjYl5gZOMmpOKlZGUkI2RlqKMnZ6onp+4pH+Er7WisK90pL6jsqB4ep+psruVdq2kn4qAqn5kXGJ2n46knoSXfm6Ts5yjp66romWen5NzeZmXcICYqJdsf6KniWWcpZyRl5iWi5GbkYadmpCVgpKHjo6SiYV3a4+HdoZxfIaAgGFpiIuVk4tbdpWRZ2iQjnJ7pZiYZHmYhoF3l2mDioJueX9rcGVgdm9ra2hbZmViYm9TWz5OTk5SRz1AVEI5MS8eHyY0OjMxNjY3ODw7PkBBQkZIQkZGSUtMU1RVWVxfaGZnV1FKPERHOzhVUltgYWJgXmBfYGFhX1xdX19fYWFiY2RhYmFhZWRjaGReXWablqajobCxrKuppaito6etpJKWq7Wvsaaaqqarl3OMnK+fqKqmlJa4oKCPnKOdkX+IiJuejauao5Wnop6Ol5GehXWukIimmqeRlqOIm7q0qKCZmIuJdXeTjZaTipSRkJSMj5OgjpqfppmcspaAjJy1nbOMko+8p6F+p6J6oq63gY6Opp6Ei4WPsamvjImWo5p5gYushpydoqepqIeVhph2pZt6h5uBl6aCgXucsXqKhaCXmZSYloGQlpaEmZljeYeQhI2PkoqDbXCPh3mAcYCBhX+GdIaElpJ4lmiTdKCadH2Zg6Cchph+kYmBg5hqjYyFa3h7cXBnZHduaWxrW2VramVzW15JVExRQEU1LllUVTYpITA5PT42NDM1Njg7Oj0+PkBESD9JRUpLR1JYWllbYWFoZllRSDlFTDs+YlZeYmRlZGBhYWBiYl9dYGFhYmJiY2ZnY2JhYGVkY2djYWFonJijn6aurquorKCosKanqaWZlK7GvbChlqaotZ6Pg5yrnKahn42Qvp6ZjZ+aoJB9hY6Zl4irnaKWoKGSjZOJhoCRqI6Hopyjk5adhp+5sqeem5KOhXB1kImVkIqUj4+bi4+Rn5KWn6SWnqyIn7SJtJqtisqHqq6It4WNsIOxroOpjaaYjZ18qI9ye3ebjqaWaJWkebSLn56mqJKZwoF/q4iYoXGegJmkfZeFlbGAoXyhlKCQmJaAjpObipeRi3yFk4aNlZOJg21zkYV/enKGgYR8hHSFgpeBj8VmgKmHj6NrnoOhmYKZgIuMg4mYcI6ShWh3dHt2Z2h1cGdnbF5jb2xnbFhnR11RTDJFNDZNYGM3JjM8REdEOjY0NjU4Ozg+PT0+Qkw/TklKTENQWl1cV2JeamxcUUU9S01ASmRZXWNmaGdiYmJiZGNgX2JhYmNjY2RpaWNiYmJlY2FmY2JiaZWXop+wqKmopaugpLmwqqummpSgo6Sqo5akqbajr3+gp5ylnp2Jk7yZk42gkZ2QeYSWlpGHq5mbm5qihY+Md5ucj6CRiJ6km5WYl4aiuK2lmpyMjH9ibY+Lk5CNkIyNmIuQkZ+Pk5+hmaGofqGnh62doJauj56dnZGGgaCNq6+GpI2qmoyafqJ2gJmTaoGrdU2reIeNnZGbqKeAqqt9g6F7eqdpnn+Sa2eXhpe2iZ59bmBkWYOWfox7ZGiKcpl9eZVsXXuXbV9TcIRcX2x5g2BZZYJ9hIGYcaeqa4OjbnKlcJ+Dnmlln2xbbYl7ZVlfg39iV1BvdmVtdHJqam9eam9tbGlYaU9dV0U5QTRHQ15rNCxJQ1FNTj04NDg1OTs2QDs7PkJPPlFSTE1CSlxdX1deX2N2YE1EOk1PTVRiXFxmZmlpYmJkYmRkYmFiYGNkY2FiaWtkYmRkZ2RiZ2VhY2iYlp2guaGqo6askqG2vKuuopmXoKGlra2gnK21oqiSoJ+fppuZjpi0mZCKnoyVi3WBlJGNiqaWlZien3+ShYaspIeckYqYqJeZmpGHpbCmopWaiImAaW6Ih4uOjoqLjZKLkJKijJOeoJyipX+TgY+joZSgd5yWj6eDoad/hqmthaV5in2Emn2icHKTh5V6nYx5bYecjJmQm6iaj4edfIKic3amZp5+dqRfmHp9knOibpi3tLpzkoeBf7WoZIHGuHtwlbeLcYCbpGNzrKtgfWqds35ufYeDjoKLl3GAo2xzpHOeg3+kX52Zs5VwfJeetHRzW56yg2pib3N1cWhvWGtscnNmXGleYktEPUQ1UUFZcTM9U0dfSlI9PDM5NTo6NkQ7O0BJUD9UTU5RQEVfXltaV2BgfGRIQzhMV1VWYmFaZmZra2JiZWFkY2BhYmBkZF9gY2tuY2NkZGhkYmdmY2holJaVo7mZq5yToI2kuLWuraCbopyjo6WunJuxrayTl6CYoKSZmpOeq5uLiJF4i4VwgJaNio+gkJOUnZd9kImOqKCHmI+KkaKTm5qMi6iopJ6PloeEfmt7h399j42Di5CRiY+UoIKWnaCdoJ+LiXecmKKMoHKii4ipiJymkJaoq3+ujH16oJl6o5N4gHOWh4ycfZagh5uOmZumhqJkoXyIlpCbjWyeaJuNbpqZe4CKp31yaHOpgpyCc6pnlJpdm4V2hJ1oqmqAuGZcqHCBnGGVjF6ndnWJin+eaJp1h5OSmI5/n26akGynmVyofne7a36qW46EXbRnXG5xeXdraVtxanh5Yl9mWGJBUEVON1ZCUm40S1paX05aQ0AxNTE7OzdIPzpDR1Q/WVJZXT5EYl5WYFFhY31pRUI5TltdWGRmWGZnbm1iYmVfYWFfX2BgZWNeYmRvcV9kZWVrZWNpaGdraZWciaq2m6iJY5SbrLqysKydppycqJ+erpudsKirnZeimaGfmJaWoKOZhomMaoiAcXuXiIuWloSRlJiPeoqElqSdipSPhYudkZybiY+oo6CZi5GKgIBpgYZ5f5eMe4iOj4iPlpp/k6KfoKKTmHJon4qfj4xwkoyBqYiZn6OooKh9sK2joriXd6OzoqN/iJR4nXqrmn+ijp2bl4mXcaF8hY2vtX1rmpGheH6YtKOjq6iEmXyafJyZfnOqWl1ve5aLeJ5iTH56eoVjeZdCTZ9ZompxfI5tgYmEmXWbeYeJsbN/f5uTp3WAnW1xfJRvmXJqpF2VdkhlY2BzcH19bmVgbGh2fGNkYVFeVl1UVkBZRVFnRFNXW2JYXklEPUI4P0I6SUU4TERXQVZRW1ZERmJcWmBLYG1+cUVDPFVfYlplalZnaG1vYmZmXmFhXF1eYWhiX2VkdmxeZWdma2RmbGloa2mTnYCxrpmEU1+gp7O5s7OpmqKMnKucnKmToaukoaiPnp2cmpmVmKGdloeGiXeFgW55lYWQmot8kZOWiHKAiZOhnHORkIGImJSfmoSOqJyalIqLinyDbIWFcYGhjHiFjYiIkpmVfJKkoZ+jiK6GfbWEjp6de6WWeqmClp2QiqGdfadodm1+mXShc3F8nYWYb5OCrn2kg6aemoGjb16oZ3WjY2+lYZzTkHx6mXhyc2OjhZB+onKijnVrj7OLYIKYiXOqsqi8f3eDbX6+pqm0XpxufXGXb4FzonJdo2d0pmFopm2b1Jl8g5tvd3mXa5t6d5dzbamkZ2BleXB/g2tnZmRtdXhnYGJTW2VRUWJJV0lUX1dTW2VqXGRQRUNLTUpLQkpFOFA/UE1XU1hPUlJgZmVpUmN3eXdJRkVjXWRaaGlUaWhqb2NqZ2BjYFxdXV9oYmFoZXxkXmRnZGtkam1naGxol5t/satUXEt+qa+xtLCzo5yYhZiooKCjjaSooJipiZmXmJOZkpKgmI6HhXtwfYRofY+ClJqBd5GNjolvf4aQk5Jsl5R9iJCRo5WDjqqZlJKKhYl5g3aHgG6Cn4Z3gJOGiJmil3mToqSan4mzoaK2i3qsp6SupXCpgZqQhYGcknykgKKZhphynoSira6Jl4t/jKSNloOuopR2tba1yaFzlIqBn2Cdl6lteZWGn5p1oYd3oH6RloqAb0xmo5JwmodypHt5dGGDgmx+oGtxZGCccn90l2l7abO1tMamc5h+e51qm5urdYOabHR3l2maenWYclBEfbNeanZreIdmamdidHRxblZeVFloT1JoSVVMWVJVXWhrblZnV01KQUpNS0hKTkFRSlBkY2ltZXRyc355e251iXt7VFBPbF5oW2tpUmpoaWxnbGZjZV9cXVxeaWJkaGt7X11kaGNqZm9tZWlsZaGcibCnhGY/lKGyq6+vtaKjj4CXqaKipYylp52cpYKZl5aNl5CPm5KOiIJ5anmGZYOMfpageXWPiIyBaYSFkoOMhZ2NeoyKlKWSg5eol4yQioGJeoB9i3hwkKGGeYGVh4mWoJZ/lKWonJaWhGdueJxsomR8caV3nJhwZ6eBl4x7pXqfloOXcp52gYmUlo+5bpCKomJ9maKViG1yaatqdaBtbqZgm2mLkGiWh5qVdaKAfZpgi4WMdW+IYmigZZ5+aZp1b2NmiIJucqJaX1tjoW5diYxve39zcmSlbXeiZGenaJhzi5huoW9TiI9voF9lp1SLXVSYbW1za3GBbXBoa3hza29SWFdWZllTbUlYT11IWGloc2pZa1ZRUkVWXExYUmFUaGped3V6fHB8fHKDe39ydo2AhHZeUXJiZ2JwZ1BqaGhrbG5nZGdfXV5dYGtjaml2dV1cY2ljampzbGZrbWOcpZmmemV0bYunrqSpsLGmn4uAl6ucnqWMoqGaoqKAlZiTjZqPipeQjot7h3GAiGiLi3uXmnN0in2Qe2SCh5WKipWZgnyIhZamj4Ghq5CFj4mCin2AgI9zaI+mhH2GlI2ImKCOiJKqp52JpniWnH6liZaMspiekIOvl5+leJaIeql0pY+Emm6kooyShIyDvG58pa+ChoaHk5acn3ylenGolaCWZ55+b6tjloqVkneobKmigYl1h4J3q5GmiGuRsGt2s4ypa4qGbm2fnpKVYX+ri6p2gH+Mpp93n32FpZWdoGmah3asZ56tjLdzd76NpJNZg6aNq2F1cnNve3RxYmp+bmhtU1ZbVWFhXGtNXFJdSV1tbXdgW3FZW2BaZ3Nlbm9xY3F0YHd6fnlyeYNzhH+Ae3uMgYKAdmJ4ZGNtc2RSbGdob2xyaWZpYV9eXGJrYm1sem9cXGJpYmxqd21nbG5ilaaqnYGAnqSWqaqdqKeuo5mJgpermp6kiZqlnamchIyajoackYWSjYuMdIZ6iIRvjIR9l5N0dIZykoJtf4uSh4aUj3x7gYWXpI1/paWOgY2JhJR1goeSb2yLqYGDi5SOiZyfiY2Tq6OgkIB1lJeIfoF5lK6jf4GbcY+GeZCMhH97cqaMcX19epeWm4SOeHt+foiUlZOKdpCYn6CDen2JbIyFW3l4cXlwaG5+kolxf3SCj5STcYWEgmWNf1+Bf4t3dXOUdW95bm6HbYSGXndpeI1mgYKGjqmbfnR8l2qJiHCAdnyFdm1sZ4xzeXuYeIRba1h5j2hud3Jxb3d4b11shm5pZ1ZaYFdcZWtjVWFVX1FfcHh5bGt2ZWpranZ8cXJ0c2FvdWJze4F4dXmCdYCAf4B4i4WDfXttf2xkeG5eV25naHVreGppamRcYFpjamVscHVuWltia2RsbHluaGxvYY6Uuamni6GimqakmaScq6KghISXrJKdoImappqomIKBm4p+lpOHjomIjXKCfI99fo6EepePdHKDcJWFe32Ti4aGkIV4fn+GmKKMe6agi4WPkISVgoaOl3dyhaqGjpKckIienoiMm6igoKuDiY6Umn5+iZatqI+TppB4cJ2Rg3uSb36ohXB9lXFrcHyBn4t/ko6MaG1dg4uMm5uejnOVi4hxdGuCdnOAWXJuh5CBfX6Mal1qZHuFg4iAX2l4e5t7gouCdoGGgmh5i4drYXFyg3dfc4yCiZCnlYZmjI+DbneLhHCFjXlvZWdkeoN6lltcamdudlt7eHd0bXNygmZcbYprbGJZWV5aWGxxW19gWl5dZnR+e3VvdGNra2p7fHJ7eHRkbXRnbHt+dnp8e3p6f39+b4aKhHt9c355c39pVFxxaWx1b3Vna2hkXWFYa2hranFybVdbZW5sZ3N6b2hqbWCMjKqxopCjoZqenpiemaiioX2CmK2Nn5SHm6KQpZV/e5eEfJKYiIiGhopyfICLdoWLgYSVinFvgHKYhoR+koSDhoqBeoCDi5qej4KmoIZ4jpeIlYuLnZeEg3qtgpGYmZSKnp2HiKGroKKio4uIk5uco5mWqqGnpqCSm4iXjnx4jo6Ep35/kpGSk5yxppuUnpCNspOYhKWMjJWbn4mQm4KJkYprfI12d2WChZCKfImdhIeLj4iIgIWEkHd8eXWaoYiGip+LhZR/foyBgHZwdIaEf3iIh4uQppCEhY2Ig42QjHyHioiPgXZsgoR8eZlqcmhhdIpwfXp3dm93dIFdXm+GaG5fXlpcXVNocVVjW1xhbGh1fHxzb3Bka2ppf3tteH9xaW9wbGaAe3KCgHh/fYCEem2DjIZ8enh8fXqDeU5kdmtzbXB6ZGtlYmJgW3RmcGZycm1VXWx0bWh5enFnaWtljYidup+WoqGYlZmYlJmkoJ57f5mrjp6NhZ+cip6WfHiUgnuOmYmGhISGbXiAgHKBh36Ik4RtbH56l4aEg5B/gIaEhnyHg42anJKGqZ6DcoqPhZKRi52RfY17qoSNkpiVj5yXhoabp6Cimp2Gg5GamZmQmqagpp2dkJaBkYp3fIeOhKV7fI6QkYaYqaGdk5yPjaqOkYCejImTmp6Cjpd+ho2Cb3iFcXRgfoKPhnWLl4CDj4KGhH6Fg5RueXV0kqKLjIWahISNdICKfHxycnuIhHt5jI6Ek6ePhoSPgYSLiop3hYeJi3xva36Ae21obG1nXnl/aHx7dnR1dXt3XGBwfW51YGNaXV5RZm1TZVpdYWppdnl+cWtsZGtqZ4B/bHOAbGx0b3huhHluh4B2goB9hHZygo2Ifnt7fH97gopgaXtqdWhpgmRqY2BpXGR1aG9idW5sVGNxeWVwenpzZWltbYuKn7eaoaOfkpGWl4uan5+ee3idppCbioaklIuYmXh6jYV7iZGDjIKBgm18fnhzgIV9ipB8a2h9gZeIgYiOfH6GhId8j4CPmpuRiKacf3CLiouSh6ChioWMfKiRiI+Sl5OWk3iMo6Ghnpaaf4CQmpiTjJujoaSal5Gbfo6FeYCDj4eggH2MjI98l6SgoJKZkI+mjY+Bm5GJkpebfpKSfoaNgXV0gnB2YH1/jYZyipV8iItyjH+ChYaOaHdxeIyYko9/l36IinOCh3x8cHl7jIV6e5GNg5amk4uGkXyGh4eFdYKDiId6ZXJ7fnh6cGxqZl59c2h8dXVzfHKAal5gdHZweGRjWV9eUmtoVGRZX2FnanZ4gXFma2NsaGV/gGptfmhucWt9d4Z6a4yBc4GBfYF0doKNhn58e3+BfX+PanKDbnNpYYdobGJfcVZ0b21uYHhobVdqdHZjdXt7cmJqbnmJjZ+ykqWlnI6QmI+GnKCbnHx2pKCNl3+MooqImpZ4e4aHfoOJfoiCgH9xf3p0dYKFfomQeGdjfYaXioKKjXh9gIyDeZaAlZeVjJafmn1vi4GRk4amm4eMiYSmlYWSi5aXk5J2kZ6hoZiUl3p+jpiXjpabnaSdmZOUnHqQhYN4hJeNnX6BiY2Mc5einqGSmI6PooyLg5aYg5KWmX6YjXyIjYF2cX1uemR/fIqFcIaTf5CCbIeCgX+JhGV1b3yHkpeNfZN4i4l8gId8e3F+eIqGeYWRiouYopWBhI13iYWDgnZ7gYmGdl94d31zfXdmbGRhfmlqd3N0dH1xfGJjYXNudXNtYVpgXltrZFJiV2BhaGt1eIZwYmpjbWVofINsaHRobG9of3yCeW2QhnGAg4N/c3yDjIF/fnqCg358kG12iHR0bWWKbGphY3VWhGlxbmB5Z2xianZwZnl8enFgcmyGhZCcrZemqJ6NjZeHhp+Tl5h9d6qciph5l5yLi5iPeXuAi318g3uAgoB4dHh6c32Ag3+Ii4BkXn2LlYd/hYd0fX2Jf32XhJaTloyjoJd+cod6k5GKp4+MjoqToJGDkZCUl5GLgY+YoJqSkJF0f42SlImdnZ6nmJeNlZZ0jo+KbIaYj5l6h4iQiW+XnZqjk5WKjZ+MhoGSnH+SkpWGmYh8iYmBenF5a3Vse32Lfm6FkoKUd2+Cg31+in9kcmp7gJaXhH+NdJCJg3mHfnV4gH2HgX2DjYWNlKSQeIWCdImHfYBzdYCHg25ge3V6cXxvYW5jZHtibm92cnd3c3Rhdl9vbHVub1xbX11eal5PXVdjYWhtc3qJa19qZWpjaHeHbWZsaGlsaIB8endvkIdzgYOEfXOBhol6gn16gYR9fY5yeop4eG5sh2toX2lxY4docW9ld2hubGF5aGt9e3hwYXdti4GZmqqgpKidioqRhoqeipWXfXeumIyWfZ6TkZaTiHd9e4p8fIB2d3+AcHRzem+FfIGAin58YFx+j5GGf4OEc3p/hnqPkYeRkZuSpJuUgX2Ae42KkqSJjYqNmJqMhpGYk5aOiYmMk52TkIyNboOQj5GJnpmioZeWiZaRb4iahGeGmY6TeomFkIpwlZqUoZKSiIuZjIJ/kJ58ko+Si5mOe4qEh3RzdWtxbnV7i3RuhZCOknF0gHuBgYh8ZHFseX2ZlH2EiHSQi4F0iHlvgH6Bh3yFjImFjZWojXuIfX6LhXd+cG+AhYNjaHh0dW97Yl5wYGp0XnFqenh4bHJwZXhdbWxzbXNYWl5fYWpaUFdXZWNncXF/h2ZdaWhnYmdxjm9kaWdlamiAend0bo6FdIGBgnt1goiFd4V8eISFeoCJd3+Le3pyeYNqa19waHSAa3JvbXFnb2xlfGNugHl2cWx3d4p/opiiqKGmm4eMioGQnIaTnHSBqpSSjYagjJaTkH90e3aFd3h/cnN7hWtyb3ltinaAgIZucVtZfpGNiH+AgXZ1gH9/oIaPipGcl6CTl3eJfoCMiJ2eio+GkpiWhYmVmY+XjIuNjo2dio6Qg22IipCRiZyWoZuYlYWXiGqFo4Nnhp2KkX6Lg4uBd5OYkZ6RkIiJlY1/fo+XfJGNj42aknyKf4JudnBsbW5we4Vpc4OOl4pwd390gomCeGZzb3aBmY58iYR6lJF6d4h0cIl7ho17i4aEiY+co4h8hHeCi4B4eG5qgIKBXXJzcXBveFpecGBwal5vaXx5cG1tamx2YHBvanJtWVhhYWFuWFFTWmZnY3VwhIJiXWptZGJma5JtYGZmX2hqgXVxcnCLgHV/goB4dYCLgHiFf3eHhneDhXuGjH97dop/anFjfGKGfG9xbHRqaG9sdndfcX95e3R1dICCfqSVmq2fp5aFjIN/l5SDj591ip+UkoaKm4yVjYt6cnh0gXByhHNxdYhsb2x1bYh2g31/bW5VUYGrlIeCeIB2coJ5gaCBkYGSkpebkZp4kXqCjJKkmpOOiZWZkoSHl5mMlIyJj4+InoWQinxyioWJjoicmp+blpR/lH9php2IZ4ahiJKEkYOJcYORl4+ajY+Mi4+Nd3uSkHqOi4yRlox8iHyAa3ZqbmtrbHp+YXl+jpWBdnqAd4ONfHlndGx0h5WLf4iGe5SQcXqEcHeMeoqNe4l+g4yRn52FfXx4gox9dnBpa4GCeV93b21rcXNWXm9icWFfbG55cGdwZmZzdGhxa2F3ZV1WZmFgclNQTlxmZV14cIh8X1xocmJiZWaSaV9oZFtncH5wa3Bzin12fIWAdHV/jHl7hoF4iINzhoV+jIyDe3mVd2ZyaoJgiH5vb2t6YGpudH90X3R9eYZ4dHOFfHigj5mwnKWPgop/g5qIf4uef4qZk46EiJiOjo+EdnR2c4Bwb4VzcHGDb2tpdm2Cbn18bXRzUk6C38iS1pN8cHSCdYOfgpN3lJCYmo+Ye5NyhZCfoZOTkImTm5SGfpaViI2NiJGNiJyAjoF4eox+iIyJnJudm5WTeY12aImSh2yIo4WSh5eDhmOMkZiOlYmWjI2Ki3F7lIl6jYiKkpGJeYV7fmx7ZXJvamt5eVuAeY+NgHp9fn+Gjnp5aHNrc4uPioKFhX2VjGx+f2+AjH+Mh32EeYGPlpqainx3eIOQeXNtZnB/g2xqdG9oaXNtU15vZHBZYGtxd2ZramJmeHJwcGNfeGBgVmtfXXZQTktgZmNdeXGJdF1cZXZgYWVlj2RgZmFYaXNzbmtxdox8dHmGgnV2fotzf4Z/e4l+comHgZCKiHx+mHZlc217ZYd+b3BsgFpsbnl5c2F2enuNdnJ3ind5n4ubrpugkIKFd4iVfnyJnIeFn5COhYyXhJOOh4F1d3B5cW6Eb21ufnJkZHhwfG16fWpobGOkmsHcru+hc2t1g3WEooWRbpWPlJ+Tm4GRcIWLo5eJjZWKkJ2Wg4CVkIWJj4CSioqXf4d7dX+JeIaEjZubmJmPj3aKdm6GiYt9iqOEkYmdhYVei5SXio6IjouLhIlsfJaBfYiFiZCPhnaFfX1rfWR3dWpteHNXiHqRhoV6fn+AhYt+eGVzan+KjoqDgn+MloVrgnVuiJGCkYV/gnl/kJaTmZB1dHiIjXVzcWd1eYJidG1vYmh1Z1JgcWdsVV9udHlgcmNfaH1wcm5bY3JhYlduWVx3TU1MZGZhXnZziW1cXGR5XmBkZoVgY2JeWGpya25rcnaMfXR3hIF4d3uJcYOEfX6Ie3SLiYiVhox+fphzaHVweGyLem50cIFYcXp2eXFld3mGjGl2gIlyf5yHmKeco5KEfHCMlHh5i52EhaGNjnuVjX+ZiIR7cndwc2pvgWtpbHx0XmB4dntwdXtnYGV869q1ycPciHNsc4B2ipqIjWmXj46clJKBiHCFiKCOhYqVio2YlHyNk4iDiY97kYuGkIJ/dniDg3KHgpKblpSYhox2h39whYKJh5mig5SMnoOJYYOVj4aJhomNh4CHaX2Uf32DhImOjYJxhn5/cXdodXJpc3drWox9koGFfH+DgISKgnVhdGyIgY+Lgn5/kpF9boJseYaQhpOEfYF8f5KTkJeJb3J6jYZ1bHBrcniAX3NpblxqdmBSZHJpZlNfcHZ0YG9gXWiCcXNqV2doY2lYbVdbdUxKTGVnX2Jyc4VpW1xleV5eZGd7YGRfXFlrbmVvanN3in5zc4F+enZ6iHOFgnx/hnZ3ioaPmIKMgXuTdmx2dXh4k3RueHp9WHmFcYBvZ3l3koJkdoaFcYqWhZmhm6KKhnNvkotyd46cfYqaiIl7n3+DmX+BeHFzbm9kcn5oZmx3d1tfeXt6cXF/aWFnYX/Vto6QpnhucXd7cJKQjIdqmI2Im5GLhXtoh4uZhoGSkYaHmI18jY2BgYmOfJCMfoqFenV7gnpwhoCVmY6TlIGIdYOGdoOAi5Odn4aVj59+iGF/k4eEiISJjX9/g2d9kH9+f4KLj5B+bYJ8gnRrbXZ0c3Z1a2ONgY5/hX58hH+Eh35wX3NxhXyPjYJ8f5KJenGDZnqEioeMg3yFfX+UkJGThG5weox/dW1uamx6fWJoamlYbHVaUmlyamJRYnJ4bGFlXVpqg21zYlxnX2RsX25UWm9OSE9nZVxnbnF/a1pbY3NgXGNsd2RlXVxabGxibWpzdod/cW9/fHx0eIZ4hYJ9f4d1eYmBkpV8iIZ2iYFvd3l7hJNwbXyBd16Df3SBbWl7c5RzZ3KIfXKSkYOan5ughod2dpR+bXaTl32HkIOKjZp8i5p2fXZxb2xqYXR8Z2JpdXpaX3d8em1xfmVjaGhXnY9ecXKWvMODdXGUiJB+cpaLhpyTjIdyaoiPloB7lIyBhJuMfIuGfXyJjH+UiHWJhXZ3fYFxdYaBnpSGlY+DgnJ/iHWEfImYnZiHk46dgIhmfZOCf4WDiYlygX1nfot7eH5/h4uOfGmAfIN2ZW94eHJ2c2xqjYWKgYp/eIGAhIN/a15yeHp+jYqFe4KPgH5ygGl5g4eLhoR5hHyAl42QjH1ubXuJfXd0bmhnfHZjXHBiV29yU1Nuc2lhTmZ0eGVgXVxYboBvc1llYl1qbWBwT1lrUURTZ2Faa25te25ZW15tY1pjb3dkZlxdYGxqY2xqc3aCg3Fufnt/dHWDe4OCfIGFdn6JgZaQeIOKdIGIcnh5fo2Qb298gXFpgXl6fm1tfHaVa2p3hHRslI2FnpigmYWIbn2Mdmp4mI5+gYqClZeKeY6Wb3pzcGxqZGB0e2hfZXF6WmByfXlncXphZWWPsbJ3SmJapNnQlnF7kIqQd32Ui4SZkYuFbmuFkpJ6eZKGgISYinyHf3h4iYqEloBvjIhxdH16aXmFg6WQhJONg39vfoN2hHmFm5iTi5KQlIWHcHuSgn2Cg4mDboF4aICFeHJ/f4KKhntlfX6EdWNwcn9oeHBvdZiNhYKKe3Z4gIR5gWtccX1ygYiFiX2GiXqIcoFucYSHjoSFc4R4gJmNjYR4bm9/hH92emVoan1wX1l3WlhxbU5XcnNnYEtsdnRgXVtbWXR9cm9XZ11manFfbk5XaFE/WWdfW3BqZ3hwWlpZa2VZY3B5X2hcXmVtaGZsaXF3f4dvbH99gHVvgnt/gX6Cf3aBhYmXinGCjXF7hnx5eYOTjHVqen9sb350f31vcnx7lG9ugX94ZpKKgqGZnZGChmeHg29nepWJfn+FgZmKgXyNjGl4cmtsZl9hb3htX2JveFxka4J6YXF2X2Vl1Oq+ijI6PouOgHF5hYeOjXaDlox+ko2Mf21shY2Mdn2Pf4WClYl8g3hudoaEg5d3b4iFa3V7dGZ5goOnjIOPi4R9bn90doN5hpyQjJCRkoyLhn57koZ3f4SNg2yAcml/fnhtfHuBioN3YnmEgXFkcWh+bXRxdYGbi4B/hX5ydX2AcoFwW21+dHiKg4t7h4B8iHh6cWyIg5CEi3KBeX+Xi4t/dG5rdn+AdXVcaWh3cFlXfFNacGVMWnJyZVtKcHduXFpaWV10fnVoWWJbZ2ZuY2lMV2ZRPV5mXF11ZV90cFpZVG9kWWRxeVpoXl9nbWdqbGlwd32ObGmChH55boB8fYF/gnp1goGNk4VwgItueH6AenuIkol/aHt9anR7coZ7c3d9f4x5eIR9fGuMjIObnZaMgYBsjn5raH6OjHt+f4OUgn99iohrdXFnaGNbYmdybmBha3NhaHCJeWFzdF5jZJugj25cNVmvtXRpgIh8koZ2hZaFc46KiXdwbYWDh3V5iXiJfZOIen9zZ3aIfn6Yb3GGfmh2eW1leYiEpYeAh42Jfm5+dn+AfIyZh4KTkJiIi4SJfI+IcHt9hHtofm1rgHt6aXp2gYeBcmB3gX5xZHJndYJtdHuFlJGBfIF/bnd5fHR+bVhvf3Z0jIKGd4h2gol6eHNuiYGPgYVyfn1+k4mJem5uam2BgnVuXWdmc3FRW3tOXHBcT1tycGRWS3N4aVdZWVphcYB0YF1dYGdkaGlmTlloTUBhZFtgdmFddW1YV1N0YVpkb3JXal5haGtnbWxpcHd8kmtohIl8fHB+fnuBgIJ6d4CAiouDcXuHb3F3g397iY2Pg2p+e253eXaKd314gIKHf4N+fnpthYyImKONhIN7dYt5a2yEiJF4fXuBkYCAfoqDcHJwY2ZeWWdfb3BgYGdwZmpvinRhdG9bYWRqdnt/vpymo8i4cYWDc5N8eIaTgnORjIdycnCEe4N0dYd0iHeUiHl5cWN3hnqAk2lyhHZmd3ZjanyDiJ6Cf3+Ojn1yfnOEeYCRkIJ4lo2Uj4iCiHuIiWt4eX51Z3poa395c2l6doCCfWhgd4d9amt0aHt/aXaBjJCUfnp+fnB7dnt0fmJWd31yc4qEgnyDcYaKd3hwcIOCjX99eX59do6Gg3ZpcWlsh4JycF1oY3NuSmV1TF5uVVRZc25iUU9zeGBSWFhdYnCCc1thXWhlZGNqZFFacElEZGFbY3BeXXdoVVdVd11bZW5oVmteYWpnZW9vaHB2epJuaYiMeX1ye354gYGBfHZ9hIiGg3B2g3Jud4KCfomLk39wgHt3eXqBjHSDeH+BgYKEeoB1b36Ji5qeiH2FeneGe2d0hYyQen9/e4mGhHaPgGdvbl9kXFhlWW1yYGBgcGxraIluYHNpWV5kbYB3qdqpx4aHsnGJeG+MdXuGjoB6k4l/dXR1fneAcHF/bYR0lIZ4dWxgeoJ5iI9mcYNvZ3ZuW219gJCTgIB4kpJ9eHtth3WAkIuEdJaKkY6HhYV7f4VsdHZ/bWd3ZW17dW1qdnd/f3xgYniGemh0dWN+emd0hY6MlXt0f3VxgHp8bX9ZVnR+b3WEh3+AeWyIhnR4a3V/g4R9e314e3OLgX1zZ3RlbYqEbXRbal91ZEhubkxbYldWVXhtYlBTdHZXUFVYXmFxhG9cYGNtZWRebmJUXHJHQmZeXWZoXlt7YlFVXHVbW2drYVZqX2BuZmZrcWhwdXiOdGuOjXV/dnh+d4GDgXt0foSIh4NvcX90cXV+hYKJjYp7d394g3x8hYd4h3x9gX6EgHt+c3Z5jI6fjYl6iXZ0g3lefYWZjHmGg3SFhoV3iXtibmxbYltbYVZqc2NgW2dub2aHcWFxZlddY2t/fMrOiLmiam1timxxhHF8hIl+e5GEeXl0eXV1e2psdWOEdZGCd3BnXn2CeouJZXKCa2pxY1hse4aciIKBc5eUd357bohxgYqLh3GXjpCIhYuDe3l+cXFvfWZocWJteHFqa3F3fHx5XGV5gHdpdXhmgnZndIeLjZR8coZpb36AeW58XVhyf210gIt8gm9viX9xdmh3f4F/gXd9cXp0h3x6cmZzYW6MgmxzWGtfd1tJbmtNVlVeVFV7a2FPVHVyUFFUVl5idIVoXGBsamZjWW5hWGJwR0FoXF9lX11We15PVmRwWVtqaF1XaGBfcmZraHJncHJ3hnhulYp0f3p4fnmCiIB1c4CGhY2CcHB7eHd1eYaGhouGenx/dYt+fYWEhId/fn59h398eHZ5d5KTn3+MfIttdoB5Y4OHl4ZzkotvhYWBeoN0Y25qWV9bXV1UZ3NlYFlkcXFmgXNia2VXW2Bpf3e+rnugt21ic4Zoc3txeYKFe32Mfnd4c3Zve3Zlam5gh3WOgXNqYl5+eHmLhGZxfmhqa1pWb3iKpIGFf3GZk3GAeHWCbYCCkYdzlYiMiISIhX14dHJuaHlgam1gbXZqZ2preXd6d1tnfXx4ZXJ9boR0ZHWFjIaVf2+LZmt6g3VtdGJcb3xrdXyLfIFmdYd9bXFndX54fn9yfWt6eoF6eHBmbGJuiX5tblZrYHdVSmprT1JOaE5ZfGhiTlV1akxQVFVfZ3aDZl1gcWhnYVdpXVtraEpFa1lhY1dZVXlaTlZtalldbGVcWmVjXnRmbWRxZ3JvdYF3cJmFdn9+d398hYd9dXOCiH+Vgm5zeHp6c3OFh4iIhHmBfXaPf3yEiY6EgoR7fouDe3d8d3eanZd6ioKGaXd9fGyDhJOAco+CcYWCfoF/b2ZsZlddW1xbVGRwZF9XY3J1aXVwZWVjV1xcaIBwb3KAdIlkZHh+aXR1c3OChHiAhHl2dHVua3twYWdrZ4Z0jYRuZl1ffXB7iX5pbXdmaWRVV3JwjaZ8hHx2lpBze3N8em57e5CFdph8h4aDhoN8dHBybGd1XG1oX2x0ZGdmaXpve3JZZ4F3dWdwgHeCdWJ3hIp8lIBui2pteoFxZnNlYG16Z3N3inx+YnWDdmlrcXR6cXl5c31mfn9/eXduY2ZiboZ8bWtWamJwU0tpa09MTnBHXntmYU1VdGNKTlNXYWp2fmVcZ3NpZmBWY1dicF1MS2tYY2FVVFVzVkxYdWRaX2thXFtjZV93Zm1icGlzbnF+dHSagXd/gHd/foaFen11goR+l4VucnR7enVxhIWPgYB6i3V0kYB9gZSOgIWEfX6Mhnt+gHZ7o6WKeYmFg2t1fHt1g4KMem6Fc3mEfYGDdW5qaGVWXVtaWlRjbmVbWGJze2lobWlgYldfWmmAamtvgGhsYWh5eGpzdHRthIF7f312dW16aGp5al9lbmiBdo+EZ2VYYndpfod7b2lvZ2ZdVVhvaI+ndoF6fJCOeXVvfm9zdXmPgHeVdIWCf4WIdmpydmdobltsZF1sc19nYWl4aHttWm2CcnNpb4B+eXdgd4SEeI+Ecohxb3l/cmNxaFxvd2Rxc4h8eGJzgHBnanhzcmx4d3V3ZIN7f3d2b2RkY258fWtsVWliZlNLbWhPR1JrRWF4Z2FNU3FcSU1UWWVrd3tlXm1xaWRdVl9Vbm5XS1RoV2ZeWE5VbFRKXHlfW19rXV1aYmVgemhsYW9vdW1vdnV6mH13gIF6gH+Hhnp4eoN+gZOEcXR0fnp2dIWIkH2AfZBrc5WBfIOfhX+HfYB+hoKAint2hKyff3qIh4NrcoJ6doCAgXVuh298f3OJgGpvbWRkWF9aWVpVYmpnW1pedYFpXm5sXGFWXFxrgWZydH1pal1rdnVndHdxbIV7fX15dnJsemhpeGZdZHNoeneSgWNjVGVwZ4KFd3dmaGpgV1ZZaGSQp25+eICLjnpwcHxmeW96jHt2jnGEfX5/hm5kdnNkaGhca2Jdb29bZ19sdWR6aF10gG9ya3F7fXV1YXSFinqHhn9/d3J1f3VhcGxZcXRicXKFfHVkcn9sYWx6b2ppenh1cmaFdXp6dXBkYWRuc35pbFRpXl1US3NjUUdWYUdidmZhS1RvV0pMV1hna3Z6ZGVucWZjWlddWHZlVEpcY1doWFlJV2VRSGJ4Wl1fbFteXGFkXn9pamBvdHhtb212g5h5coGAfH+Ii4Z9dXaGeIeMfXR1dYJ4enqCjI59foSIanOXgXuLnX1+hXqBen58hohzcY+ujHt7h499ZXKIenR8fHZyb4Zse31sj3picG9iZV1lVllZV2Rma2BdXHOFaFhxblpeV1pcbHtjcHd2bGJbbHJzZ3R1cGyEeX6AeXdubnRlaXRlW2d1ZnZ2kXpfXVJlZmqCgnR9YmNpXFRYXmJjkKVoeXSChZB4bW55Z3htfIV7dYhygHh8eH9oZXZtYGZgXmpfXXNrWWVdb29iemVbd3trbm5wd3hzdGRyg5J+h4KIenZvcn1yYnhkW29wYXFxgnxzZnGAZF5udmlkZ3l6dG5vgXV0fXNxYl9mbm99ZGpTaFhZVE13X1FKWVlIYnRkYUlUbVNJTFpXaWxxe2JsbHNjYVpaW2F2W1NLZF5YaVNXR1lgTkdpdVheYW1bW19iYl2FaGhhbnh5bG9qdoGQeW2DfoCBkoiEgXZ0iXSMhnRyd3aBd3x9foyPgH6TfnB4loN9mZJ5gIB4eX1/dIiDc3CZont7f4iUeGR1iHlzeHVsdG9+bHl8cJFyXnBvYGdibFRbWldoY21mXFxxiGVScm5bWlhYYGx3ZGl1ampeWm1zcWxzc3NqhXx+f3x3bm5sZGlxY1tqcmR0do9zW1dTZGFygH9ygl1iY11TWmBbY5OfZXJxhYSRdGxqeWxvcHp8e3GAdn9yenp6ZGZ2Z11iWmFnW153aFdiXW9oYXdgW3t2amlybndzc3RocIGUgoZ+hHZyanB8bWZ3V1xrbWJxc4F6c2Zvfltgb3FiX2pxfWxsdH5zcXhrcGFcZWxsemFnU2dVV1JQdltSUFlSSWNzYmBHVWpQSFBaVWtra3xlbW9xYVxaWFlscFdSUGZWV2lTVEZaXE9IcnRYX2NtY1hhYGFdi2pjZG15eGtvaXV5hntrg32AhJl8goR5fYhuj4Zxb3d6fHSCgnyLj4OCl3R3gpSFgZ+JdYCAgXN/gXCHgnVvopd0e4aLhntleItvbntvZnhwemxzdnKMa150bmFnZWtSXVtWZ2JsbFpccYxkT29uXVZYVWdqdGhidGVlXVltdG1wdXV5aod8f3yId5BzZGRrbmFcbm1jc3iHa1pUVmJjeH19cYVdY19jVFtgWWOWlWNucIOFinNqaHpuZXN2c3xsenR1b3p+dV9mcmNbXlZiZFhhdWVVX2BtZGFxXV1+cGhpc3FzcHV1am2Ek4GIe4RxcmZufXByb1NbZmpmcXSBd3NibHZVYnFqW19uZXxlbXZ8c3Jzam1gWmRqandeZlRkVVZQVG1XUVdTUEhlcl9hRlhpTkhXVFZtaGR8aWt4a2JXXFVbdGRTUldoUVlmVFNIWlpQTXh3W19lbGlaYmBeXo9uYmZreXVub2h2dn9/bIOAfYaXe3+IgYp/a5OIcmd0gHt1gIN9iI5/jJNzfIqRhYefhnt/hoxzgIZzfYN2bqWMc4GNi3Z3bXqMYGR8cGZ6c3lsbXF2gmdke2xjZmdoU15eVGdgbG9bXm6NaE5qbWBUVlNvZ3NrZXhkZV1Yb3Rscnp3cmyIe4B2nHt6a2FlbG1eYG9qZXB5fmdaVlhga3h8e3CEX2JeZ1ZZYFdknIhia3GBh313a2t4bFt2cWx6aXVzbm97gHJYam5fWV1VYWNXZHFjU15haWFibFpgfmxma3N1bm13dmtohYx/iHqHbXFmcHxtcm1jWWFoaW90gXRyXmlsUmVxZFRibmJ6Y3F2e3VrcG1rX1hhZ2h0XGVWYVZTTlhlUk9cT09IZXBdY0ZZaU1JX0tYbWRfeGhufmRgVV5UXXRbVFJgZk5dYVRTSlxZUFl1dl1fZm1oWGNhW16OcGNnandxc25ndnR6g3KBg3qIjX58ioeOem6QinRsc4J0f3+IhYaRhJWPeX6Mj4iRm4SAfIyEc3+Bc3R4cW6Tk5OTk5OTk5OTkpKSkpKSkpKSkpKSk5OTkpKSkpKSkpKSkpKSkZGRkJCPj4+Pj4+Ojo6Pj46OjY2Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2NjYyMjI2NjY2Njo6Ojo6OjY6OjY2Ojo6Oj4+Pjo2NjY2Oj4+Pj4+PjoKAfnp6fX5+fX1/fn59fn5+fn5+fn+Af4CAgIGAgIB/gIGBgYOHjI6Ojo6NjY2NjY2NjY2NjZKSkpOTkpKSkpKSkpKSkpGRkZGSkpKSkpKSkpKSkpKSkpKSkpGRkZCQkI+Pjo6Ojo6NjY6Ojo2NjY2Njo6Njo6OjY2NjY2Njo6Ojo6Ojo6NjYyMjY2MjIyNjY2Njo6Ojo6NjY2NjY2Njo6Ojo6OjY2NjY2Ojo6Ojo+Ogn99ent8fn59fX5+fn5+fn5+fn5+f4B/gICAgICAgH+BgYCBg4aMjY6NjY2NjY2NjIyMjIyMkpGRkZGRkZGSkpKSkpKSkZKSkpKSk5KSkpKRkZGRkZKSkpGRkZGQkJCQj4+Ojo6OjY2NjY2Njo6Ojo6Ojo6Ojo6Ojo6Ojo2Ojo6Pj4+Pjo6NjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Njo6Ojo2NjY2NjY2NjY6Ojo6Cf3x6fHx9fn19fn19fX59fn5+fn5+gH9/gICBgYGAf4CAgICDhouOjo2NjY2NjIyMjIyMjIySkZCQkJCQkJKSkpKSkZGSkpKSkpKSkpGRkZGRkZGRkJCQkJGRkZCQkJCPj46Pjo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Njo6Ojo6Oj4+Ojo+Pjo6MjIyMjIyMjIyMjY2NjY2NjY2NjY2NjY2Njo6NjY2MjIyNjY2Njo6OjoN/fHp8fH1+fH1+fXx9fn59fn5+fn5/f3+BgYGAgICAgYCAgIOGi42NjY2NjIyMjIyMjIyMjJTO2tjY2NjamoGEhISEiF0tMDAwMC1GoaGhoaGhoJqZmpqampqKg4SEhIOEd2VnZmZmaFxDREREREVCMS8vLy8wLz5EREREREU4Li8vMDAsSIWDg4ODg4OLjIyMjIyMjY2NjYyMjY2NjY2NjY2NjIyMjIyNjY2NjY2OhX19e3t6fX58fH59fX1+fX1+fn5+fn9/f4GBgYCAgICBgICAgoWKjI2MjIyMjIyMjIyMjIyMlNvp5+fn5+qcfoKCgoKGUxgdHR0dGTekpKSkpKSjnJycnJycnImBgoKBgYJyXV9fX19hUjQ1NTU1NTMfHRwcHBwcLjc1NTU1NicbHBwdHRg6g4GBgYGAgYqLi4yMjIyMjIyMjIyMjIyMjY2NjY2MjIyMjIyMjY2NjY2GfH16e3p8fXt8fn19fX59fX5+fn5/f3+AgYCBgYGAgIGBgYGChYqNjYyMjIyMjIyMjIuLi4uSl5iYmJiZmZKPkJCQkJCMh4eIh4eHiZOTkpKSkpKRkZGRkZGRj46Ojo2NjYuJiYmJiYmIhYaFhYWGhYODg4ODg4OFhYaFhYWFhIOCgoKCgoSKioqKioqKi4uLi4uLi4uLjIyLi4yMjIyMjI2NjIyMjIyMjIyMjY2Njoh8f3l7ent8e319fX18fX19fX5+fn9/f4CBgYGBgYGAgYCAgYKFioyMjIyMjIyMjIuLi4uLi5GQj5CQkIuOkZGJh46KkJKTkImPjo2Ph4+RkZGRkJCQkJCPj4+Pj4+Ojo6Njo6Ojo2Njo2Njo6Ojo6Ojo6Oj4+Pj46Ojo6Ojo6Ojo6NjY2NjIuLi4uLiouLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyNjY2NiX59eHh5fH18fX19fHx9fX59fn5+f3+AgICBgYGBgYCBgIGCgoSKjIyMjIyMjIyLi4uLi4qLkJCRkZGPhI6QkIaKj4WNkJCMiIaGh4yGiZCQkJCQkJCQkI+Pj4+Ojo6NjY2NjYyMjIyMjIyMjIyMjIyMjIyMjI2NjIyMjIyMjIyMi4uLi4uLi4uLi4qKiouLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjI2Lfnx3dnh7fXx7fX18fH19fn5+fn5/f4CAgIGBgYGBgIGAgIGChIqMjIyMjIuLi4uLioqKioqQkJCQkIqFjoiOhoaPiY2QkJGNh4aFjoaLj4+Pj4+Qj5CPj4+Ojo6OjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLi4uLi4qKioqKi4qKi4qKi4uKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIt+e3d2eHt8fHx9fX19fX1+fn5/fn9/f3+AgIGAgYGAgYCBgYGEiYyMi4uLi4uLioqKioqKipCQkJCPhYOMjpCOiYyKjpCQj4eLh4eMiIiPj4+Pj4+Pj4+Pjo6OjY2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKioqKioqLi4uKioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMin18dnZ4fHx7fH19fH19fn5+fn5+fn9/f4CAgYCBgYGBgIGAgYSJi4yLi4uLi4qKiomJiYmJkJCQkJCMhoyJjoeFjYmOi4yMhIqGhoiFiY+Pjo+Pj4+Pjo6OjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKioqKioqKioqKi4uLioqKioqKioqLi4uLi4uLjIyMjIyMi4uMjIyKf353eHp7enp8fHx8fX1+fn5+fn9+fn9/gICAgICBgICAgYCBhIqMi4uLioqKioqJiYmJiYmPj4+Pj5CMjouPjIqPjI6MjY2Ii4qKjIqOj46Ojo6Ojo6Ojo6NjYyMjIyLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLjIiAfXh5enp6e318e3t9fn5+fn5/f35+f39/gICBgICAgIGBgIGEiouLioqKioqJiYmJiYmIiI+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pjo+Oj46Ojo6Ojo6Ojo2NjYyMjIyLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLioqKi4uLh4B8eHp6eXt8fHt8fH1+fn5+fn9/fn9/f39/gIB/gYGAgIB/gYSJi4qKioqJiYmJiYmJiIiIj4+Pj4+Pj4+Pj46Pj4+Oj4+Ojo6Ojo6Ojo6OjY2NjY2NjY2MjIyMjIuLi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKiYmKioqKioqKioqKioqKioqKioqKi4uHgHt5eXh6fHx6e3t9fX5+fn5+f39+f39/f39/f3+BgYCAgH+BhIiLiomJiYmJiYmJiIiIiIiOjo6Ojo6Pj46MjI+Sj5COjo6Ojo6NjY2NjY2NjY2NjIyMjIyMjIuLi4uLioqKioqLi4uLi4uLi4uLi4uMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKiomKiomJiYqKioqKioqJiYmJioqKioqKioqKioqKioqKioqKi4aBe3h5eHp8ent7fH19fn5+fn5/f35/f39+fn9/f4CAgYCAgIGEiIqJiYmJiYmJiIiIiIeHh46Ojo6Ojo6Ojo+MkJOQkI+Ojo6NjY2NjY2NjYyMjIyMjIyMjIuLi4uLi4qKioqKioqKi4uLi4uLi4uLi4uLi4uMjIyLi4uLi4uLioqKioqKioqKiYmJiYmJiYmJiYmKioqKiomJiYmJiYmJiYqKioqKiomJioqKioqKhYB6eHl5fHt6ent8fH1+fn1+fn9/fX9/f35/f39/gICBgICAgYSIiomJiYiIiIiIiIeHh4eHjY2Ojo6Ojo6Pj4+PjoyNkI2NjY2NjY2MjIyMjIyMjIyMi4uLi4uLioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYmJiYmJiYmKioqJiYmJiYmJiYmJiYmKioqJiYmJiYmJioqFf3l6eXh7e3p7fHx7fn5+fX5+f39+f35/fn+Af3+AgICBgYCChIeKiYmIiIiIh4eHh4eHh4eNjY2Njo6Oi42Nj5WPiYyPjYyNjYyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYR+eXt5ent7eXt9fHt+fn59fn1+f35/fn9+f3+AgICAf4CAgICEh4mIiIiHh4eHh4eHh4aGhoyNjY2NjY+MjImKj42IjJGPjY2NjIyMjIyMjIyLi4uLi4uKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uKioqJiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJg355e3p8e3p7fX17fH9+fn5+fX5/fn9+f3+Af4CAgH+AgH9/f4OGiIiHh4eHh4aGhoaGhoaGjIyMjIyLiYyKiIeJhoyOjJCMjZGOjIyMi4uLi4uLi4uLi4qKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiImJiYmJiYmJiYmJiYmJiYmJiYmIiImJiYmJiYmJiYmJiYiIiIiIiYmCf3h7e3t6enx9fHx9f39+fn19fn9/f39/f4F/gIB/gICAgICAg4aIh4eHhoaGhoaGhoaGhoWMjIyMi4yOjoyKioeEiIuKjIuNjo+Li4uLi4uLi4uLi4uLioqKiomJiYmKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiomJiYmJiYiIiIiIiIiIiImJiYmJiYmJiYmJiIiIiIiIiYmIiIiIiIiIiIiIiIiIiIJ/eHp7enp6e3x8fX1+f35+fX1+f39/fn+AgICAf3+Af4CAgYCDhYiHh4aGhoaGhoaFhYWFhYyMjI2NjJCSjI2Ii4mJi4uLi4mLjIqMi4uLi4uLioqLi4qKiomJiYmJiYmJiYqKioqKioqKioqKioqKioqKioqKioqKiYqJioqJiYmJiYmIiIiIiIiIiIiIiImJiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIiIiIiIiIiHgXx4e3x5enp8fHx9fX9/fn59fX9/f39+fn+Af4B/f3+Af4CAgIKEh4eGhoaGhYWFhYWFhYWFjIyNkY+PjZGJjIaJjIuIiImMiYeNjo+NioqKioqKioqKiomJiYmJiYmJiYmJioqKioqKioqKioqKioqJioqKioqKiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4WAenl9e3t7enx8fHx9f39+fn19f39/f35+f4B/gH9/f4B/gH+AgoSHhoaGhYWFhYWFhYWFhISLi46PjoyLj4iHiYmMjYWFjo2KiYyNi46KioqKiomJiYmJiYmJiYmJiYmJiYmJiYmKioqKioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHhoaHh4eHhH55eX16enp7fXt8fX5+f35+fX5/f39/fX5/f3+Af39/f39/f4CChIaFhoWFhYWFhYWFhISEhIuLjI6MjI2Lh4mIiomGgoiNjoiKi5GTj4uJiYmJiYmJiYmJiYmIiYmJiYmJiYmJiYmKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIeHh4eHh4eIiIiIiIiIiIiIh4eHh4eHhoaGh4aGhoaGhoaGh4eDfXp5e3p5enx8e31+fn5/fn59fn9/fn9+fn+AgICAf35/f39/gIKEhoWFhYWFhISEhISEhISEioqOjYmIiIqKh4iHiomIioiIh4qGi5GPiomJiYmJiYiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHh4iIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGh4J8eXl6eXp7e3t7fX5+fn5+fn59gH9/f39/f4CAgH9/fn9/gICAgoSGhYWFhISEhISEhISEhISKi5CPiYmJi4qHh4WHiYuKiYSLjYmOjYqJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiIiIiImJiYmJiYiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGgXt4enp4e3x7e3x+fn9+fn5+fX1/f39/f3+Af4B/f39/f3+Af4CChIaFhYSEhISEhISEhISEhI+Qj4+IiYuIhoeIiYuLjIuJioqNio6Oj4iJiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoaAe3h5eXh4enp8fX1+f35+fn59fn9/f39/gIB/gICAf39/gIB/gYKDhoiGiIaDhISEhIODg4ODkpKOioeKi4qLh4uNiYqJi4iHiouIio+SioiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhn96eXh4eHl5eXx9fn5/fn5/fn1+f35/f3+Af39/f4CAgH+AgH+BgoOHjo+PjoiHhIWFhoaFhYWSkI6KiYmIiImKioiIh4aKjIiHiYmOkJGNh4iIiIiIiIiIiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4aGh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWGf3l4d3d3eXp5e3x9fn9+f35+fn5+f35+fn+Af4CAgICAf3+Af4GBg4eOjo6Ojo6Mjo2OjY2MjZCQjomHhoiJiYeIiouIiYyJiYaKjY6PkYuIiIiIiIeHh4eIiIiIiIiHh4eHh4iIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhYZ+eXd5d3d6eXl8e31/fn5/fn5+fn5+fn9+f4B/fn+Af39/f39+gIGEiI6Ojo6Ojo6Ojo6Ojo2NkJGOi42JjIiIiYaHiYaIioiHi4yLjpCQiIeIiYmJiIeHh4iIiYmIh4eHh4iIiYiIiIiIh4iIiIiHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhoaFhYaGhoWGhYSEhIWFhoaFhIWFhX55d3l2eHl4e3x7fn5+fn5+fn5+fn5+f39+f39+f39/f35/f3+AgYOGjY2Ojo6OjY6NjY6OjY2Qj42Ni46KhoiKhISLiYeDhYSDi4mLj42JjI6QkI+NjYyLjY6Pj42NjI2Nj4+Pjo6MjYyMjY2KiYiHiImHh4aHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoeHiYqKiIeJi4yNjo2LiImLi42OjYyJiImMgHl3d3Z6eXh7e3t9fn5+fn5+fn5+fn5/f39+fn5/f4B/f4B/f4CBg4aMjY2NjY2NjY2Qj4+Pj46NjI6KiYuMjIeFiY2Lh4aIh4aHh4uNjo6Pj4+Pjo+Pj4+Pj4+Pj4+Pj4+Ojo+Pj4+Pj4+Pj4+Oj46Oj46Mi4uJh4eHh4aIhoaGhoaGhoaGhoeLiYeHiIiLjY2Mi4yLjY2Ojo+Ojo6Pj46Ojo6Ojo6Ojo6Njo6NjY2AeHZ4eHp4enx6fH5+fn5+fn5+fn5+f39/fn59fn9/f39/gH9/gIGDhoyMjIyMjY+QkpOTk5KSjYyMjIqHioyKh4eJiYWCiouIiYWJjpCNjo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjI2NjI2LiYaHh4eHiYqLjY6NjYyNjY6OjY2OjY2NjY2NjY2NjY2NjY2OjIyNj4+OjY2MjIyLi313dXd5enp7e3p+fn5+fn5+f35+fn5/f39+fn1+f39/gICAf3+AgYOFj5KRkJGSk5OTk5OTkpKLi4uLiomMiouLiYuKhoeOjYiIjI6OjIuMjIyNj46Njo6Ojo2NjY2MjY2NjIyMjIyMjIyMjY2NjYyMjI2NjYyMjI2NjIyNjIyMi4yMi4yMjI2MjIyMjIyMjIyMjIyLi4uLi4yNjY6Sk5OSkpSRkJOVlZSTk5COjo6Oe3Z2d3h6ent7e31+fn5+fn5/fn5+fn5/f35+fn9/f39/gIB/f4CBgoSNkpKTkpOSkpOTkZKSkoqJioyJi4qJjIuKioiHiYqKi4mKjY2Mj46Nj5KUlJOUlJOTkpGSkI+Ojo2NjY2Pko+OkZGOjIuKioqLi4qKi5CPjoyMjIqKioqKioqKiouKioqKi4yLi4uMjIyKiouLi46RkpOTk5SUk5STk5SUlJOTk5KSkpKSk5F6dXZ2eHt7e3p6fX5+fn5+fn5+fn5+fX5/fn5+f39/f3+Af39/gIGChIuRkZGRkZKSkpGRkpGRiYmIiIqMiYiJiYuJhoSJhoyKh4ySkpKTk5OUlZWWlZWUk5OUlJSUk5SUlJSVlZWVlZWUlJOTkY+QkZKQjoyRlZWVk5KSjo+QjYqKi4qKi42OjY6RkpCRkpKSkpGRkpKSk5OTk5OTk5OTk5OTkpOSkpKSkpKSkpKSj3h1d3l6e3t7ent9fX19fn5/f35+fX5+fn5+f39/fn9/f4B/f3+AgYKEi5GQkJCSkpKRkZGRkZGIiIiIi4uJg4eLi4yMiIeHjYyNkpSSkpOTlJWWlpaVlZSSkpOTlJSUlJWVlZaXlpaWlpWUk5SUlJSVlJSUk5OVlZWUk5KTk5OTkJGSkZGSk5OTk5KSkpOSkpKSkpKSkpKSkpKSk5OTk5SUk5OSkpOTkpKSkpGRkZGPdnJ3enp7e3t8fX59fX1+fn9+fn9+fn5+fn6Af39/f3+Af3+Af4CBgoSKkJCRkZGRkZCQkJCQkIeHh4eIiIiFi4+KjI6Njo+OkJWUk5OTk5SUlZWVlJSVk5KSkpKTlZSUlZaWlpaWlpaWlpSTk5OTk5OUlJOSk5SVlZSTkpKSkpOTk5OTk5OTk5KSkpKSkpKSkpGSkpGRkZGRkZKTlJSUlJSTkpGRkZGRkZGRkZGRkYx0c3d6ent7e3x9fX1+fX5+f35+fn5+fn5+fn9/f39/fn9/f39/f4GDhIqQkJGRkJCQj4+Pj4+Ph4iKi4yNjYuOj42Mjo6RkpGSk5OSkpKSk5SUlJKSk5OTk5OSkpOUk5OTk5WVlZWUlZWUk5OTk5KSk5OUk5KTlJSUk5KSkpKSk5OTkpKSkpKRkZKSkpKSkpKSkpKSkZKRkZGSkpOTlJSUk5OSkZGRkZGQkJCQkZCRinN0dnp8fHp7fXx9fn59f35/f35+fn9+f31+f39+fn59f39/gH+AgYKDipCQkZGQj5CPjo+Pjo+Oj4+Pj4+Pj4+PkI2OjpCRkpKSkpKRkpKTk5OTkpGSkpKRkZKSk5OSk5OSk5STk5OTlJOSk5OTk5OTk5OSk5OTkpKSkpKSkpKSkpGRkZGSkZCRkZGRkpKRkZGRkpGRkZGRkpKSkpKSkpKSkpKRkJCQkJCQkJCQkJGGc3V2e3x8e3x9fX1+fn1/f35/fn5/gH9+fX5/fX5/fn5/f3+Af3+BgYGKkI+PkI+Pj4+Pj4+Pj4+Oj46Oj4+Pj5CQiI2PkJGRkpKSkpOTk5OTkpKSk5KSkZGRkZKSk5KTkpGRkpKSkZKSkpKSkpKTk5KRkZKTkpGRkpKSkpKRkJCQkJGRkZGQkJGSkZGRkZGSkZGRkZGRkZGSkpKSkpKSkZCRkZCPj4+Pj4+Pj4+PkX9ydHh8fHx7fHx9fX5+fn9+fn5/f3+AgH99fn5+f39+f39/f4CAf4GBgYqPj4+Pjo6Ojo+Pj46Ojo6Ojo+PkI+Pj4+GjpCQkJCRkZGRkZGRkZGQkJCQkZGRkZGRkZGRkZGQkJCRkZCQkJGRkZGRkZGRkJCQkZGQkJGRkZGRkI+PkJCQkJGRkJCQkJCRkJCQkJCQkZCQkJCQkJCQkZCQkJCPj4+Pjo+Pj46Ojo+Pj4+PeHJ2eXx9fHp9fH19fn5+f35+f39/f4CAf39/fn5/f35/f39/gIB/gYGAio6Ojo6NjY2Ojo6Ojo6NjY2Oj4+Pj4+PjoiQkZCPj4+QkJCQkJCQkI+PkJCQj4+Pj5CQkJCQkJCPj4+PkI+PkJCQkJCQj4+Oj4+QkI+PkJCQkJCPjo+QkJCPj4+Pj4+PkJCQkI+PkI+Qj4+PkI+PkJCQkI+OkI+Pj46OjoyMjY2NjIqDiYhzc3Z4fX58eX18fX1+fn5/fX5/fn9/f39/f4B/f39/f4CAgH+AgH+BgYCJjY2Ojo6Ojo6OjY2OjoyNjY6Ojo6Ojo2NiJCRkI6Njo6Ojo6Ojo6Pjo6Ojo6Ojo6Pjo6Ojo6Ojo6OjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Pj46Oj4+Pj4+Pj4+Pjo+PjY2MjYyNjoyLi4mJiYiFhYSDgoKEgnR5fXp4dXJrZWltb2xmZmdncHNzd3l9fnl6e3x9fX1+fn59fn9/fn9/f39/gIB/f3+AgIGAgIB/f4CBgImNjY2NjY2MjYyMjIyMi4uLjYyMjIyMjIyGj5GRjIyMjIyMjIyMjIyMjIyMjIyNjY2MjIyMjYyMjY2MjIyNjY2NjYyMjI2MiomKi4uJh4KAh4iEgXt6gH57fXx8fXlzcnJycnV1cG1ramppZ2NkYV9bXF1eWFVXWFlTS0VJSkpLTE1PT0tgdHR3eX19eHp5e3x8fX5+fn1+f39+f35/f4CAgH+AgICBgYCAgICAgIGAf4OEhYSFiIuLjYyMjIuLi4yGiYqKioqKh4OOkJGNiouLi4uMiYmKioqKiouLi4eDi4qIiYmGhYWEhIeJiYWCg397fHl6e3pzcHFxcW1samdsbWdlZmVmZGNlZGVkZWVlZWRkZGNhYV5dXFpYWFdUUFFSU1JTTU1KSUZESEpHR0hHR0xOSWdzdXh6fXp4d3l8fHx8fn5+fn9/fn9/f39+f4CAgIB/gICBgICAgICBgYFnXmBjYWNucX17ent/fXd8fHZ4ent4eHpvcHt4eXt8e3h3e394dXd0dHZ0dXZ3dXFycW5wcnBnaGtsbm9tamlpaGhlZWRkZF9gYWJgYF5dWVhaWltdXV9gX2BfX19gYmFeXl5eWVldXF1bV1dWUlRSU1NOUUpISUZERUhMTEhGR0lLSklNbXJ0eHp7end3eXt6e3x+fn1+f39+f35/f35+gIGAf3+AgIGAgICAgICCgWdYW1pZXFtcY1xaXF5ga3FtcHBvbm5vbmtpbmxrbG9qaWtraWpraWZmZ2dnaGhnbWdqZ2hlaGdjYmJhYmBgXVhbW1dYV1RWUVBUU1NNSkxLTExOTk9UWFhXVVVUUlBQTU1QT05LTE1QUU9MTEpHSUlHSEhJSEhIR0ZHSEpKSEhISUlISVZwc3V5ent5dnZ5enp7fH59fX5/f35/fn5+f3+AgX9+f4B/gICAgICAgIGBbFtYVlZWWVlaWVlYVVZoamxubmxra2poaGloZGVkYlxiZl9fYWNfXF9dYF1eWl5dWVleYmFeXlpZX1tYV1NOTUxLS0tMSUtNTktKS0tMSktQTEtLRkdHSUlGR0lISUZFSEdGRkVERUVEREVJSUlHSEdIRkZLTUtJSUlIR0hLTU1LTExMVXFzdnl6e3h2d3h3ent8fn1+fn9/f39+f3+AgIGAfn5/f4CAf4CAgIB/gYJoUlRVVlNVV1lZWVdXV1tbYWNfXlxbWFZWWVZSVFJRUVVUU1NUUE1KTU5QUk9NUFFRUVFRVlZRUVFUUFBOTk9MSk1MS0xKSktLRklJSkxJR0pISUlFR0dGRkVFSElKR0ZHRkZHR0hKR0dISEpMSkpLSUlISktLSkhKS0pISUtMTU9QUEtUdHN1eHp6eHZ2d3d6enx+fX5+fn5/f35+fn+AgYB/f3+AgYB/gICAgH+AgmlQUlRXVVRWWVdYWFpbVFRTUlBRU1FRUU9OTlBQUU9MTlBPTk5NTEtNTk5QTU9QUFJRUE5OT05PTk9QUFFPTk5PTk5QTk1NS0lISEpJSUlJR0ZHR0dJSkhJSEhJSEhHSEdISElISUxLSklISkpJSkpIR0pMS0pJSUhKSktMTk1NTU9RTFVzcnN3enl3dnR2eHp7fX19fn5+fn9+fn5+gICBgICAf4GBgH+AgICAgICBbE9PTlRZVVVdW1lXV1hOTUpKSUZKT0xKSkdJSk1NS0pMTUpHSUlJSktMRkRGSktLS0hKTExMT01MTE5PT09NTk9MTk5OUFBPTE1MTk1MTEpJSEdJSElISElJS0xLS0pJS0pJSklJSUlJR0dKSUdJSUpKTk1OTEhJSklJSk1PT01MT1JOWXBwcnd4d3d0c3R3enx+fX5+fn5+fn5+fn9/gICAgICAgYCAf39/gICAgIFvS0pNTlFOTlVXVlZSU0lFQ0VFUkREQT5CP0RAQD5CREFAQURHRkVIRUJBQEBDQ0RFQUNFSEtPS0lJSkhISklKSUlLSkxQTk1MTU1MTU1NTElIREZGR0ZGRklKSUlLSkhMSklKSkpJSEhKS0tIRkdJSklLTU5OSktPTUxLTU1PUE5QT1BgcG9yd3h2dHJzdXd6fX19fn5+fn9+fn1/gICAgICAf4CAgIB/f3+AgICAgXNQUE5OUE1KS1BSUE5RQ0RCQUZRRT1DPT9FSDk6Oz0/PTxBRkA+Ojs+PjxFRD0/RUE/QEFAREVHR0dHQkREREZFR0dHR0pHSEpLR0NER0pHQ0RFQUFDR0hHSEdISktKSElMS0lISktLTU5MTUxMSkpMS0lLTU9PUFNRT1BQTk9QUlFNUGdwb3N2dXRycXR4eX19fX1+fn5+f4B+foCAgH9/gIB/f4CAgH+Af4B/gICCdlRVUVFQT0xNUFBOT09BQkFAQkE/Oz48Pj8/Ozg5ODs7OkA7Oz48Ozs8PEhMPT1BQEBDRD1BRERGQ0ZGREZJSEM/QEBAQUFCQUE/Pjw9PkFAQD8+P0BFR0dHSUtMTk1OTUxNTUpLTVBVU05MTlFOTk1OTE1NTk9OTk1LS05OTk1OTkxUbnBwcnR1c3Fydnl5fX19fn1+fn5/gH5+gICAgICAgH9/gICAgH9/gH+BgIJ4UVFSVFJTUVNTUVFST0BAPT4/PD8+QEE/PT45Ozo7Ozk5Ojg4Ozw5Nzk7PD49Ozw7ODpAQEFCP0FAQ0ZEQ0NDPzs+PkBDQ0E/Pj9BPkBAQj9APD9CQEFDRUVFSktQT1BPTU1OTExMT1JRUFJOTExPTUtOT0xMTEtMS0tKS0tKTU1LS1xxcXF1c3VycXR4eHp9fn1+fn5+f39/fn5/gIGAgH+Af4CAgICAf4CAf4CAgXxSTU9RUFFSUlRSU1NOPDs8Ozs7P0BBQkA9PDk8PTw6Nzk6Ojk3OTo6Njk6OTo7PD83PTs6Ojg8PD1AQUA9Ozs+PD09QEJDQT9BQkE9Pj09Oz0/Q0RCQD9BREJFR0pKSkpKTE1MTExNTExOVVNLTE1USVBKSU1KSUpLS0pJSEdKS0lKZnJxc3RzdXJydnl5e31+fn5+fX9+f39/f36AgICAf4CAgICAgIF/gIF/gYCBgFZMTlBQTlJRUFBRUU44PT88PDo9PkFAQT8+PkA/Pj07PD0/QD09PT9RPj09PTxBTDtMQjk7PD49Pj9AQUA+P0E/QEBBQEBAPT8/PTw6Oz09PD9AQUJCQUBCREZGRkdGR0dISUtMTExLTEtKS0lKSk1MTEpMS0lISUxMSklJSElLR01tcHF1dXR1c3V4eXl8fX5+fn5+fn5/gH9+gIB/f39/gH+AgYCAgYCBgICBgYCCYUtPT05OT1BPT1BQTzo8Pjw9Oz8+PkFBPz0/Q0NEQD08PkBBP0E7WnlPPUNFPkRYPFlOOzw8Ozo9PkFBPz5AQD9BPz89PD48PTs7PD0+QUA/QD5AQ0NEQkRFSEVFR0hISEdGSUpJSUlJSUhKSkpKTEtKSklJSEhKSktMS0lLSkpIVnBwcXNzdHR1eXp7e3x+f35+fn5+f39/f39/f3+Af4CAgICAf4GBgICAgIGBgIJtTFBRTk9QTk5PUFBPPjw8PT4/P0A+QEA/Pz9DRkQ+PDs9QD05Ojpvd1k3Ozo8R149YFw5Ozw7ODk7Pz49PD07PEA9PTw8Pjs9PD0+QUBCQUBAP0JEQ0RFRkZGQ0VHSElJSEhJS0tMTUpKSUpNTUpLSktJSEhISEpJSktKSk5MSUlfcHFycnJ0dXZ6e319fX5+fn5+fn5/f35/f36AgIB/gICAgICAgYGAgICAgIGAgnZNTk5NTk5MTE5QT0w+QTw8PT8+QkM/PkFBQUJBQ19JPDtGY2dfV3d3WDc4ODhNYkJlaDw7PDs6Ojs+Pz89PDg6Pjw9Pj89Oz4/QEJDQkJDQ0FCQkFCQkRCQkRCRENGSUdGRkhJSUtNSklKSktMSkpJSkVESUlGRkhISUpKTEpGRmdwb3FxdHZ1d3t8fH18fn59fX1+fn9/foB+fn+AgH+AgICAgICBgYCAgICAgICBek5JS0tMTExFSUxOTTw/PDw9PkBAQUE7QkNCQ0BPfHRGRnWGhoaCfHdZPD0/PFNqR2drPjs9Pj89PT5BQ0A8OTtBPz4+QT07P0JAQkNCQENDQUNBPT0+QD0/QUFBQENFRUBAQ0JDR0dFRENGRUZGR0VEQEFHR0ZDRkRHSEpHQz5IbG9wcHF0dXZ5fHx8fHx+fn1+fn5+fn5+f36Af3+AgICAgICAgIGAf4CAf4CBgIF+UUhLTU1NS0pLTE9RQD8+PkFBQEBBR0FCRENFQFV2enB2hIODgYKAfVk+QEM+U29MZGg9Oz1BRUFCQkZIQz08QERDQUE/Pj1AQT4+Pj88PkBER0VAPkBBP0BDRkVDQkNDQEJEREJERUFCPkFCQkFCQEA9QUJDRENDQUNFR0E/PVZwcHFwcnV1d3p8e3x7fX9+fX19fX1+fX5+fn9/foB/f4CAgICAgYCAgIB/gIGAgX5SSEtNTUxLS05OUlVEQkBDQ0FBQkBCQ0BAQUFAUHRzf4OAgYR8fIVtRkJDREJSaWRzcklAQ0VISUlJTU1LRUNGR0hFR0VFRUREQ0E/QD4+QkZKSkdFRUdGRkpOTktKSUdHSEtMSUdHQ0REREVEQUJCQ0BDREVEREVERUZDQkFEZW9wcXF0dnV4e3x6fHx+f319fX19fn59f4B/f39/f39+gIGBf4CBgICAgH+AgICAfVJJSUpKSEpKTE9SU0dGRUdIREdIREA+PDs+QEVHbHN9gHl/hYB9hnNGQ0RETWd9h4iIflhHSFFQTE5PT0xIR0hHSElJSEhHR0hIRUNFRUVFRkhKSkZFR0lKTU9PTU1LSktKTU5LSUhHSElIR0ZFRkZGREZIR0VFSEhGSEdIRlFubnBxcnZ2eXt7e3p9fX5/fX19fX1+fn1/f39/fn5/gH+BgYGAgICAgICAf4GBgIB8UEhHSElGR0lKTU5OSkxJSUpLTE5KRkNBQkNGSkdgen+AfIKEhoWFi2xAQFZ3hoiHh4eIglhSXk5MTU5MSkdHR0dER0dHR0ZIRkhFQ0RERkVEREhIQ0NDR0pKS0xMTExMTElKS0pKSUlJSEpISEdISUhHR0hGRkZISklJSUlIXW9vcXJzd3d6e3t6e319fn59fX19fX5+fYB/f39+fn+BgIGAgYCAgICAgIB/gYCAgHxNR0ZIRkVGR0dKS0pMTUxLTU5NT0tJSEhKS0tMS05cfIOFhISEhYaIgFZshYeGh4aHiIiHfmlWS0tIR0ZGREVDQ0BBQ0NDQ0ZGRUJAPj5AQUFAQkQ/Pj9ERkhERUdJSklJSEhJR0lJSkpJSEZKSkpKSUpJSkpKRklMTEpKS0tmb3BzcnR2eHl7e3t8fH1+fn19fX19fn59f39/f35/f4CAgICAgYCAgIGAgICAgICAfU9GRkdGR0hHRUZHR01NTUtMS0lHQ0NDRElLS0xMSlqDhISFgIGFh4aDgoWFhIWGhoaHiIaJe0tJRkI/P0A/Pz88PDw+Ojo8QUFAPjw5OTg8PD07Pjs5Oz9BQkBBQ0NCQEFCRERCQ0ZISUhISExNTEdJSk1NTk1KSktLSkxNU2xvcXRzc3d5e3t7fH19fn9+fX19fX1+fn5/foB/fn9/gICBgIGBgICAgYCAgIB/f39+UUZFRkdJSUdEQ0VGTk1MSklIRT85Oj5ARUhISkpJaIWEhYR/gIODgoOEhIWFhoeIiIiJiYyNZkJCPTg4Ojo5ODc4ODk2NDc5Ozw6ODU2Nzc4OTc4NzU4ODs7Oz1AOzk5OT08Pjs7PUFERUhKTUxMR0lIT1JRUFBOTE1NT1Fdb3BydHN1eHp7e3x8fn5+f359fX59fX5+f39/gH9/f4CAgICAgYCAgICAgICAgIB/f39RR0ZHSEpIRkVGR0hMTEpJSUdDQjU2OjxDQENHSUlphoWEgYCChIODgoOEhomKi4uLiomKi4yJVDo4NjU2NzY2NjQ1NzYzNDY4Ojg3NjU2NTY3Njc3ODo3Nzc4OTs3NTc4OTc5ODc2OjxAR0ZJRklGRUZPU1JTU1JPUFBSVGVwcXN0dHd5e3x7fH1+fn5/fn19fX19f39/f3+Afn+AgICAgICBgICAgICAgICAgH9/flJISEhJS0lHSUpJSkpLREVIRUJANTc4OD06PUVDQmiFg4GBgoODg4ODhYmKiomJioqKiouJiYqBSDY3NjQ2ODg3NDU3ODQ2NzY5OTc2Njc2NTo6Ojo6Ozg5ODk4Nzc3OTo5ODg3ODU4OTtBPT4+QkE/QUtMT1FQUU9PT1JXa3FydHR1d3l7e3t9fX5/fn9+fX19fX5/f4B+fn9/f4CAgH9/gICAgICAgH+AgICAf39+VEhHSUlMTUtKS0tMSUg/QEFAPDo1Nzk4OTc7Qjo+doSBgoODhISEhIaJioqIh4iIiYqKjIqJiYx6Pjo4ODs8PT45Ojs8ODk7OTo7Ojk5Ozo5PT09Pzs7Oz06Pjs5Ozs8Ozw8OTo8ODo6Ozo5OTk8Pzw9QUJESUpNS0lLTFdvcnN1dHZ4e3t7fHt9f39+f359fX19fn9/f35/f39/f3+Bf4CAgICAgICAf4CAgH+Af35URkVGSUxOTkxKSk1CPzo7PDs4OTk4OTo6Ojs/PUqBg4KChIWFhYaIiYiHhoaGiImIiYuMi4mKioxsPDs+QkNFRUFBQUI+QEJAQD49Pj5APz8/QD9APT0/Qj9BQT9BPz1AQEA+P0E9Pjw7Ojs5OTs/PTs7PT1BQUNBQkNBWHBxdHR0dnl7e3x9e31/fn9/fn19fX5+f35+fn9+f4B/f4CAgIB/gIGAf39/gICAf39/flJFQ0FHSk5PTElHSzo4Ojs5Ojo8PTo7Oz09P0BCVYSCgoSFhIWEhomJiIiGhoaHiImKi4uLioqLiotePkRHSUtKSUZHR0RGSEdFQkFAQ0VDQ0FCQ0I/QERIRUNFREVFQUZFRkRFRkRAQj88QD49P0A+Pz8/Pj8+Pjo7PTxgcXJ0dHV3enp6fX19fn5+f39+fX19fX5/fn5+fn5/gH9/gICAgICAgICAf4CAgIB/f4B+UERAPUNIT01HRkJEOTc6Pjo8Oz4/Pz89QUBDQ0VahYKDhIWGhoaIiYmIh4aGhoeJiYqLjI2MjIuKiohXSExNTUtOSklLSElKSklFQ0RGR0ZEQ0VGREJISUtIR0dGR0dFS0lLSUpLSkNGQ0NEQkFBQ0JEQ0NERENBPTs9QGhwc3R0dnd6eHt8fH19fn5/f359fX19fn9+fn59fn+Af3+AgH9/gICAgICAgICAgH+AgH9PQT49P0RMS0BCQkE5ODw+Ozw7PkA/QT9CQ0dHSluFgoOFhYeHiImJiIiHhoaGiIiIiYqMjYyMi4uKjH9QTU9NS05LSkxJSUlISkZER0hISUVFSEZGRUxMTUlKR0dISUpPTU5MTE5LR0dHR0VFQ0ZGRkZERUhIRkNBP0BMbHB0dXZ4eXl5fHx8fX1+fn9+fn19fX1/f35+fn5+f39/f39/f3+AgICAgIB/gICAgICAf1FBPz4/RkdHPTxAQDg4PDs8PTo/QT5AQENGSUpRYIKDhYSFhoeHiIiIiIiIh4eIiIiJioyNjIyMjIuKjXFNUU9NTExLTEpISEVKSURKSEdLSkhKR0dHS0xOTExISElKTVBOUE5NT0tJR0lKSElESUhIRkZHR0lHQ0JBQ1VucHV3d3l7eHl6enx8fX5+f39+fn1+fX5+fn5/f36Af4B/f3+Af4CAgICAgICAgICAf39/VERBQUJHSEI/OD9AODo8OD0+Oz1BPj9ARUlLTVZyg4SEhISFhoeIiIiIiIeGiIiIiImJjIyLjIyMi4uLi19SUlBNTk1LSkdGQkdKR0xKRktPTEtKSk1NTE9QTkhJS0xPUVFRUU9PSklKSkxKTEZHSEdFR0lGRUVCQEJCXG9yd3h5enl5eXp6e3x+fn5/fn59fX19fn9+fn9+f4CAgIB/f39/gICAgICAgICAgH9/f39VRUNFRUdHRUQ7P0E7PTw5QD4+QEJHR0FITE1RV3mFg4ODhISGiIiIiIiIh4eIiIiIiIqLi4uMjIyMi4uNfFdWUlJUUk9MS0pERUZLT05PV1ZRUE9RU1JNU1RPTVNMUFNVV1JTUVBMSk1NTUtOR0dKRkZISkRERUVCRENjcHV5eXp6ent6e3p7fH59fX9+fX19fXx9fn5/gH9/gICAf39/f3+BgYCAf39/gIB/f39/f1VGRkdHR0dIRj5AQj0/PT1CP0JDR1ZORk9RUVVZfIaDhYWEhIeIiIiIiIiIiIiIiIiJiouKioyMjIyPi4uLZ1ZVa2FFUlFRUEo7O1FTUmB1XVVWVFZZWVJZWFJaZlBVV1pdUlRXUVBOUlBQUFFLS0tISEpIRUZJSElISWlydnl5enl6e3t8ent8fXx9f359fX19fX1+f39/f3+AgIB/f39/f4CAgIB/f3+AgH9/f35+U0hKSUlHR0ZFPz9BQUVCQ0dFREVMWFJNVFZWWFt8hoWHhoWGh4iIiIiIiIiIiIiIiIiIlJyMioqMfWGKi4uHbFtkVTpYWFhTUD5AVlVZXGRgVllicl5dVl1aVkVRWVpbWV9UWmdSVVZYVFRWVE9PTUpMSklJTE1LT01Tb3N2eHl4d3p6ent6e3x9fH5/fn1+fX19fn1/f39+f4CAgH9/f3+AgICAgH9/gH+Af39+fn5WSkpJSEdGRERCQT9ITUlNUEtJS1BUU1NYWlpcXHiFhIWFhYWGh4eHiIiIiIiIiIiIiImcnaCPiY5nO36MiYqLem5wWFpbWlJTUlZWVFpadYNZVX2QYVxYXV5XSVZdXVtbX1lJWVhZW11YWFlXUlFOUFFNTU9TUVFVUmFzc3Z3d3Z4eHh6e3t8fX19f39+fX59fX1+fn9/gH9/gIB/f3+Af3+AgICAf39/gIB/gHh5fVlOS0lJSUZCREBBOlBRUVdYUFBPUVNUVFhYWVpbboGCg4WEhYaHh4eHh4iIiIiIiIiIiJaanJeIioFuhomIh4OKfmZZWVxZU1ZUV1JRV1ZjloBRZXJYWldfaFBgZltbWFxnYUdPWmhnXFtcXV1XUk9TUFBRVlZWVllabnJ0d3Z2dHd4eHt7fH19fX5/fn59fn18fn9/f3+Af39/gH+AgH9/gICBgYB/gH1yfX9/b3R8XVNQT01LSkVDP0A7UFBaWltSU1FPUlJSVVNWVFdfdXiAhYSEhYaGhoaHh4eHiIiIh4eIh4ORjomJiIaFiIiGfYB7XFBVWFRSVFJRUUxPTUtmeVpdVFlVVl1aTFRaVFNUXlpYV1dXemtYWltcXlRRUVBJTk9XVlhaWmRxc3Z2dHR2eHl5e3t8fH19fn99fX1+fX1+f39/gIB/f3+Afn56eHd2c3V7f3+AgHRrfn5rcnleW1ZVVFJPS0ZDREFNXoNsVlJTTk9RT1FVUlNSUlRjZHaAgoKDhISEhIWFhISDhoaGhoeIhn6JiYiHhoOHh4d5bXFWSUtNTktNS0hKREZIRUM+U2NVf1JRUU5LUlRRTU9ZUU1OUVNVVU1RU1JQT01MSENJSFJUVVpcbXJ1dnVzc3d7ent7e317fX19fn19fX59fn9/f4B/f399fX5+f39/f4B+e3Zzd31+fmR1fWlxdF9kXV5bWVZQTElMSWFsknRQUVNOUVJRUltSU1JRUlZVYnN7fH+AgYKBgX99e3uAf4OChYaHgoaGhoGEgYaFhnVfXUtDP0NDQ0NCP0RQQkRAQz5CSEdWQEhOTUddaVFIRk9GREVGSEdIQkNIR0hLR0NCQURAT1BNU2RzdHV1c3R1enx6e3t7fHx9fHt+fX19fn5/f3+AgIB/f3x8fX+Af39/f4CBgH12dHt/bWh8Z25xZmllZGJbWFNRUFVSc1dlW09PT0xRU1FVWVNVUVFUU09WYGtscnZ7e3h5dHJuc3RzeXh+foOAg4OCgIKAgoGBa0xHPz87Oz5AQD8/PmtRS2FFRkhJRUI/R0xNR01RVUlCRT8+PD08PT0/PT9BQ0M/Pjw9Qj5KTUZVbnV1dXN0dnh6fHp9fHx9fX19fH59fXx+fn9/f4B/f39/enl3eHd2dnh7foB+fXt4dnx1YXhnbHBqbGppZmBbUVJaXFleSUpQUU5LTFFSUVRVVVdRUVdWUFhbYl1hZ21tbG9raGBucmptbHF1e3p9e3h6fHx4d3hkQkBAQj06QkNBQURCXF1Pe05PT05LTE1PT1FMS0xXTUhHQEI8OTc3NTk5PTs7Ozg5ODk/O0JIP1x0dHV2dXZ4enx8fH18fH19fn58fX19fX9/f39/fn9/f314dXZ6e3p3eXh1d3t8eXh1eXdjcWhpcG1ubW1oZl5PUF5cWklHUFJRT01QUU5RUlRWWFNSWVROWVpbV1ldXl5gZWBdXnF2a15gZ2t3b29sam9ubmxmYlhHRkZIQkFGSUVFRkRNUlBhV1JYUVBTU1JVW09PUVdQTUpDRj46OjY0ODY5Nzk6MzY2Nzk1PEI9ZXNzdnd3eXp7fX18fHt8fX5+fnt9fn19f39/fn5+fn9/e3d1eX18enh8fHx8dHd2d3Z1d2tuaWhxbm9vb2prYFVXXlpXTUxUVFNRUVVPTFJTVFdYVFRYUUxYWVpWWFhWWFldV1dYaHNrXVZhc2thYV9dZGFfXllVUE1PTkxISEpLSUhGQ1FQU1pXVFROUVNZU1xlVU9TVFFOS0lIQz9BOTk4ODk3ODg1NzU3ODU5OUducXR4eHp7e31+fX18e318fn5+en1+fH1/f359fn59f358dHR1e3hycW9vbnR4cXJzeHZ1cWZkZ3JucHBxbm1kXV9fWVdPUFhWVlNUVk9PVVZYWFlTVVRMS1RVVVVVV1BUVVdUVVJdbl5STllfW1ZZO0RWWFRbZkpMUFJST01NTk5OTEpGUFBVWVNUTkpPT1RTVFxWUlVTUk9NS0lISEY/Pz06Nzg3NjU5OTY3NjY1V3Bwc3h5ent8fX19fnx8fXx+fX15fX18fn5+fXx8fX1+fXxydnF4eHJ2dXFxbnBwb3B1dnRuamRkanBwcXJwbmZlZGNcXlJUWlZXVVRXVFJYWFlZWVJVT0pIT1BPT01SSk9QUFBOTk9UTE1JUE9TVFUyPFhNSUFRPWNhUVNRUE5QUVBOTk1QTlRSUFJNSUxLT1FQUVJTVFFST0xNS0xMSENCQT06Ojg3NjtCNDU2NjtlcHF1eHh7fHx9fnx9fH19fX18e3h8ent9fX58e3l9fH18e3B1b3d1cHV0b3N2cHFxcHR1dmNqZ2VXaHRycnFuaWlocFZWVFVYVVdVUldWVVpZWFdVUVNGRkJGR0dIRkpESEpIR0VITEhLSEZMTVBNRy9FX1I+M0A+am9hUlJRQEZVUVBRUFFOUU9QT0xKTExPUE5OUFFRTlBPSkxNTUtHRUVEQjs9PDw5PUc2Njc2RG5xdHZ6e3t8fX18enx8fX5+fXt5dnh3eXl8fXp6dn17fHp6b3Fud3JwdnFtcHNwb3Bzc3N0ZmdgaFpXa3JzcmxtbWtuYmVQU1RSU1VPV1ZWWVlWUVFRT0A+Oz0/QEJBQ0BCRURBQEdIR0hFRkhKTktFR0NPUkM4RU5TXWZTUVNBR1VQT1FRUE1NTkxKTEtMTk9PUU1PT01ITExJS0tMS0hGRkVEPEFBPjtARTs8ODlUcXN1eXt7e318fHt5fHt6fn58e3V0dXJ2dnp6eHpyfHt8eXltcW94cnF1bm5xcm9vb3Rzc3J1dGtnZ15lam1wa29xbWltY0xPT01RU0xUVVRXV1VMTEtIPTk4Nzs/QD48PUBAQj0+RUhHREZGSUdKSkBGQUFARkhFSk9IUFJhXFFQUk5TT09QTExPTUtNTE1PTltXS01RT0dJSENJSkxMSkZGRkQ/QkM+PEJGP0I/QWRxdXh7ent7fHt6end8eHl9fnt7cXN0cHJzd3R4eHN6e3l2d2xxb3ZxdHRsb3Fybm5vc3ZydHNycmtsZW5zaG1ubWxtbGprSUxISE9RSlFTUVRTT0tIQ0U9OTg3OT9CPjs/QUBAPkFESUVDSEhJR0lFQkI/Pj1DQUFHSURNT2JlUU1PTldLTE1LTE1NTExLTk5TZE1KTFJJSUlFQUhKTE1OSkdJRkJBQkA/RUZFSERLb3B3enl5e3t6fHp3c3h0eHx8eXpucXJtbm9ycnZyc3h8eHZ2bXBtc3B1dGxwcHJvb29ydnVyVlZucWdseYRqbXFybm5qaG9ISkNHTE1JTVBNUE9IS0U/Qj05OTk6P0I/PEBCQUFERUdLRkRJSUdHSENDP0I/P0BBPkNFQ0tNUVRMSklNVEZJSUpMSktLSUlMTU9QUlBLR0NLR0NCSkpMTU9NSUpJR0NDQ0RJSk1MSVpzbXh5eHp7e3l8dnJwdXJ0eXl2eGpxb2psbG50dG10dXtzdHhyb25xb3ZzbnBvcnBvcHN0eWpOYGdzanR8eWdvc3FqcWhlcUhLREdISEdKS0lKS0RHQj0+PTo6OjtAQj89QkJDQ0dGSkxKRUlJRkdIQ0M7QUBCPkBAQ0VDSU1QR0lLRkhLREhJS01ISkxISEpMS01dUklIRE1GQURLSk5NUE5LTUpLRkdHSk1OUU5MY25pdnZ3e3h7en1xbWxza3B0dHR1aHBtamlra3RwbnR0eXByeXRvcnFvd3NvcXB0cnBydXR5a05WbXVscXt2aW5vaWp0aGRvRktERkVHREVFR0VHQkNAPjw9Ojs6OkBEQD5CQ0RFSUZKSkxGSUlHRkZEQjtCQ0M+P0NDQ0VHTE5IS05IREhFSUxOTUhJTEdFRklJTE5LSkhFTkhDR01MT01PTU5OTUxJSEpPUlFSTlJmZ2Zyb3N4dXt6fGxoam9la3Btc3FmbWxoaWtsdG1wdXR3cW94dG90c3J2c3BxcnRzcnR1dXZ2WFZ1dWtvdHJrb3ZsaG1lX3BHSkRGRkVCQkJFQERCPj8+Ojs7PTo9PkNBP0FDRUdKRkpJTEhHR0dGRUNAPUVFQj5BQ0NDRUdJSUdNUElGRkdLTk9LRkhKRkVERUlJSEtJRkhQS0RJTUxQTU9OT09OSkpJTVJVVFJPV2RgYW1ncHJvcnl6Z2VoaGNpbGdxbGZsbWdpa2xzbHB2dXRwbnZyb3Nyc3V0cXNzdXRzdXZ2dnl2dXR2bGt1dW1ydnFsbmxlck1HRUVHQ0JBQkQ9QkE+QT06Oj0/Oz4+QEI/QEJER0tGSUdJSEZGR0VDQkFBRkZDQkNCREVER0dIRkxRTElPSkpMS0lHSEVGRURDSUhIS0pHS1JNQ05PTVFPT09OT09LS0tQVVdWVVRYYF5caWFtaW5ocnNiZWZmZGloZm5pZm1taGtrbXJpcXZ1c3Ftdm5vcXJzd3Nyc3R1dnZ2dnd2d3Z2dHd1a3N1bnV0c3FyamtzTUdHRkhCQkFERDxBQUBDPDg5PT45Pzw/Qj9AQERGSEVIRkZHRkZFRENFQ0RJRkNGRUJFR0VFRkdFSk1LSFFNSktISElFRkhIRUNJSUpLTUtPU05EUVJQUVFOT01OUE1MTlNXVldYVlhdWl1kYGhiamlna19lZWdjZ2dna2dna21rbWxwcWd0dHVyc252b3FwcnR4cXNzdXZ1gpF5dnZ0eHV1d3hub3VvcnN1cXFpb3pNSEdISEJCQkZFPEBCQkQ8Nzo9Pjo+OkBCPj8/Q0VGREZEREdFQ0VEREVGR0pFRUlHQ0dIRkhGRUNGSkpHTUpMS0hKTEZJSUtIRUtLTE1OT1JUT0lTVVRRU1BRTU5RTk1RV1pWWllWWl1aWGFgYGBeaGVjYGRlaGdqaWhqZmhubGxubXFwaXV1eHJycHVwcHBydXZwdXN1dnV7fn14dnR3dnZ2eHBsdXBtc3Vub3JzeU5JSEdJREFDSEU8QEVCRT04Oj4+PTw8QUI8Pz5BQkZDRUJCR0RDRUVGR0dHSUZHS0hDSEhHSUdGREhLSUdLSE1LSktMSExLTUtJTUxPTk9SVVZPS1VWVFFUUVJMT1FQT1RZWllcWllbXl9eYGNeXGFja2JgZGdocoVoZ2lmam1ucG9uc3FqdHV4cnNzdHJucHF2cnF1cnV1c355jn11dXZ2dnZ4cmh1cWtydGxxdnF1TUlLSEpFQkVHRTxAR0NEQDk8PkA/Pj9DQjxAPkFBRkNFRENIREZER0VISEZIR0lLSkZKSEhLSEZGTEhISEpHTExMTExJTUtNTU1PTFBQUVVWV09LVlZVU1NSUUxPUlJRVltbXV5bXF5fX2FgYWRdZGBlZmBlaGpjc3NmamhnbHBycW9zc25zd3dxdXZ0c21vcnVvcnNwdXJ2cnSBdnV1dXd2dXd0Z3Rya3Fya3J2b3ZKS0xKTEdCRURFPEBGRERCOz8/QUBAQERBP0I/QUNIQkVERkhFSUVGRElIRklISkxISEpKSUxKRkpLSElKSkdLS01NSkpOTE5OTlBMT1BSVVhWTU5UVlVTUlFQTE5UU1JXW15eX11dYF9hYWFgYmRlYWNoYmRpamd2i2xraWdtb3NxcHFwcHJ5dnJ1dXRzbW1zc21xcm90dXRycHN3dHV1d3Z1dXRlcXNrcHFqcnZvd0pNTExMR0RDQUQ8P0VFRUM9QUFDQkJDRUJCREFBRUdDSEdIR0ZKRkNHSUdHSkZJTEhKSk1LTUxHS0lITEtOUUtSUUxTTUtOTk9QUE9UT1dYWFtOU1FXXFpTVlBOVFVUVFhaX2JiX2RhXmBiXmBlYWFiZ25oYmloaG14dmxoaW1vc3JwcXJycnZ0c3Vzc3Nua3NxbXByb3R2cnFxdXZ1c3d5d3V0dWNtdGtvcGpxdG93TE1MS0xHRUFARD4+REVGQ0BDQUVEREZDQ0VHQ0JJRkNISklISUtGREtKR0hKSUlLR0pKTktOTElMSEpNS1pmSmRcS2xTSE9OX25Va3NbcXBid2NSUGJ2dWh1Y2F2YFhucWJkdmluemZbbHRgbGpUYHd1aWpnaWZnbG1qbW9qbW5zcnBycnFyc3Jzc3J0cm5sdG9ucHFxdXVxcXN0dnZ1dXl3dXR0YGt0a3Bwa3FycXlLTkpLSkZDP0BCPz1ERUZEQ0RCRUVFRkJGRkhEREpFRUpMTEpMTUdHTUlISUtIS0pJS0pOTE1NTExJTExMW3NiZHBebG1VTU5mc11nZXFsbnRncGlfYVlubmJwcGJrampnb3F0ZXRub1xvdWdwTUpyeXZrYmBrZWVteW1rdmxucHNycHJxcHFycXJycnRybW1zbm5vcHJ1dHFzc3R1dXV0d3h2dXRibXVrcHBscnJxektMSUlHRURAQkI/PUNGR0JGQ0VERUVEQ0hIR0RFS0dHTE1NS01NR0pOSEpLSklMS0pKS01NTk5NTUpNTU1bcm9vbnBwbGtNUFFsV05pYnRycGFtb3ZcWWxRXG1tWnFta29teHh0c2lwXF9ya3FqVXV5eHBjXmtmYmdxcGppb3Bwc3NwcXBxcXJycXFycnRsbXJtbm5vcnV0cXRydHV1dHV1enZ1dGVudWtwb2xzcnJ5SktHR0VFRUJCQj0/QEZHQkdESUVFREJGSUhIRUdLSkdNTU5LTU5ITE1JTEtISk1JS0pKS09QT05NS05NTFxoZHVdbHFXbE5QUW1VWmtea2x2YWxkdFRlY05tWWxcdHBraWx4and1aHBdXnJraFdiY3d8b2NgZ2hhZGp1eWtubnFzc3BxcHFwcnFwcHBydWttcW1tbW9xc3Rxc3J0dnZzd3Z6dnV0aG91bHNvbXNydHdJTUdJREVEQ0FCPEJBQkZER0ZMSEVDQ0hLSEhGSkxMRk5LTFNSTEdMTEhOSklITkhKSklITk9NTkxKTk1KWnNwcG9xcW1sT1FSbllxa2dvb3Fxb210Xm5YYXRfbm9wb3Fyb251c3R0altddGN3eHJqbnpoYWFjZ2Jiam10dXBzdXZzcXBwcW9ydHt/fn13bGtxbmxtbnByc3F0dHN1dXR4eHl5dHVrb3VtdG9uc3N2dEhLSElCRUVFQUA+Q0NCR0NISU1JRkNGSkxJR0ZLTUxGT0pLV1JLR0tKSk5JSEpMSUtKSUhKTE1NTUlLSktTa2JaaV5famNyclpfWWpvX2VlVWtfY1thYlFgbGhdalxuaWlkW3BmZHBdWlxrW21xY3BzbGRnY2RnYGBrbXBwb3R5cnVxb3BxbnmFiIeHhoWAdnNua21tb25xcnR0cnR1dXZ5eHhzdW5xdW53cXJ1dHdySEhGSURFREZBQEFFRERHQkhKTEhGREdLTElFRkpPTElPSUxbUUpGSEhLTUlISkpLS0lISUdLS0xLRkhKSkxMTEtJS0xOVFtcVFBUTFBPTk9PVlFPT1FPT1FKSU5QUWRxaVRZV1tbXFVZW11YXVxcY2ZhYWZiY2VfX2ZrbWhtdHlydHJvcHB0hoeGhoaFhYaHg3pwbW1sa3FzdHRydHZ0dXl4eHV2cXJ1b3ZydHN1dXNIREVHRkZBRUM/Q0dDRUdDSUtMSEZER0tMSERHSFBLTE9LTFdMSUVFSElKSElLSUxKSEZIR0pHSElFRkxISUtOTElPXFdeT1xbYF5PWFlTXFxiXk1ZWk1YYVJKWWFaU2BkXGFYW2RkVlZZXFlaWFxWWVxdYl9kYGFfZWhrZ210dHFxdHBxcoGGhoaFhoWFhYaGhoR9cmtpb3Jzc3N0d3l5eHl4d3h0cXhyeHNxcnVydFBCQ0RMTUJDREJESURHR0ZLSktIRUVKSkpGRUhIUEpMTUpNU0lIRkFHRkpJS0tKTEpJRkVKR0RGR0VFSkdDSk1KS1RfWWBYYGFbYFVYWVReXlpfUllcUF5cWU5eXF5TW15jXlpdYGNgWV9iW2BeW1RYWFleXWNjYmFjZWlla3Jwb3Bwbm93hoaFhYaCe4CFhYaGhYaFf3VxcHJyc3Z5eXp5eXh4eHdyeXZ4cnF4dnR2YVNKSk1JRUNCQ0ZHRUdHSUpKSUlERktLS0VFSElOSk5MSExOR0hGPkdHTElLS0pLS0lHRUlEQ0NFQUZKREBKS0lPW2NZXl5hX1JUU1dfYFxdWV5RWVxNVl9XS1FZW1BaX2FhXl5jYWBiYmJjY2VaUVlWVVxZXmRgX19jZWJob21tbGxsbHWFf4SDeXV8hIWFhYaGhYWGhoN9d3JydHd5eXl5f359eXV5dnZybnp3dnhYUUtHQ0dFQkVHSEZHSElGR0pHSEZIS0lMRERLS05NTExISkpISkc/R0ZOS0tLTUtLS0lHR0NEQERBSElBP0lKR09dYVpbZF1fVFFTWF1cXFxfWktXXExSXFlJTV5QT1xfYWNkY2NiXGRjYmRjZlhRVVRTW1haYV5eXmFhX2Rsa21qamxudn51gXp8hIWFhYWFhYaGhYaFhYaGgnpyc3V1e4WHh4eGhYSBfnhwend2eFxSTUNASUZDRktJRkZHSEdHSkZGRklMSk5FREtKTE5KTElLSkhJR0JISFFNS0tPTUtLSUhHRUQ/RUNISEFBR0ZFVF1ZXlhfWV9bXVVYWFBdXVFLSldeWF5bXVZaYFJRX19iYmFgYmJgY2JiZGRiWE9RUVJbU1teXV1dXl9fZGhnbGpubnB7e3x+e4CCg4SFhYWFhYWEhIWDhISHh4FzcneFh4eHh4eHh4eHh4WDgHx4XFNLQkFHRkRHTVJIQ1JLRkhISEVGS0pNUEVHSUpLTkxMSUxLSUlHREhLUU9NTVBMTUtLSElDREFFREhHQkFGRURXVUVcVF1TVl9YTlRVTlpbTUpLVWBhW19YX15hXU9ZYl1gYF9iY2JdYmJXX19UUE5QUVhSXVxbXFxeYGJmZmVsZm9vd3x7gHt9f4CEhISEhIWFhYODhYKDgoWFhnpvgYaGhoeHiIeGhoaFhYSFg35JTkZERUZHRElSYlBEV19JR0dIREZNSlBQRkpJSktOTEtLTEtKSkdFSk1RUU5PUE1OTE5IS0FEQUNERkRDQURGQk1IQ0xMUE9PTEZNRkdJSkhHTExNT1BJTE9QUFNQTFBUU1VaWVdZWFhkVk9TVFBQT05QVVRcWVlaXVxgYWRlY2hja2xwc3N6eX97en+EhISEhISEhIKEgH57gYOBfXuFhIaGh4eHhYWFhISEgoGAfUtJRUVHRkdES01dTEdIWU1HSEpIR05MUVFJS0tLS05OVU5PS0tMR0dLUFNTTlBPTk9OT0hLRWBFRF9MRGZjRE1bSV9cc21PTVZtWUxDUGBVbFdnSl1XVV5ETVFVTE1UVlFTVFhXVFhVVFxUUGZaaGhkWFRrVFdWVVtcW2BgYWJiYmBmaGZubGhyenx9foGEhISEg4ODgX18enJ7gXp7f4KAg4SEhYWBhIWBg4N/fnp7TElFRkZIRUVLT1NJS0dgVEhKT0pJT01SUUtMS0xPUlVST09KTE5HSE1RW1lPUFBOT1BPSUpQf1FJfFlZcnNXUG1IcW5wYVZQcXFzUEJrc21xc3BTb19bblhdVlxYVWtoVV1WY1pgWVtgVlVXf2p0dXVfYHdgWGFcXGZbX2FhYWFeYGJnbXBsYHB3dHiBgYKDg4J/fX6Adnh6bHZ+dHh+gHx+gIGChHyAg3p/gX9+d3dOSUVITU1CRExMRkpMRlJWTEtPSUtSWFdRTk5OTFFUTk9RUEtMT0dNUFNbWlRRUk9QUFBKSFp4XVR4ZWhZUlRRdmd0bHBibmZqUXJPTXdtanJwc3JxcnBvcIFdZXp1eHFxenF+c31rdX1iUmd8ZXNzb3NzfH1vfXlvf3JfYGBiYlpgYGdrbmtibGZnbXd+gYCDfnt4d4B0dnppcn5udHx+d3h7foCDeHyAdXx/fHxzc05LRmBdR0FFTU1IS0pISlBOTU1KTlZeWVVMUVNOWFpMU1NSTkxQSVFSVFlXV1BUUFBQUUtHZnhsY3hybVpKTFV5cHVtdWJudlBkZUpmdnFtd2+AamZ4eGlYc1Foem1panp6fmx4en9vZ29YdnZqdXVwgGBzaHxpbHh8b15fX2NiW11iZGdpamRnYmNkbGxwcHN0c3NzeXFyeGJsdWdyeXtzc3V5foFzdXpufH15eHJuTktTdE5DQkVQUEhKS0pMUE9PUE1QWmBaWEtUV1BhXlJWUVlTTVBJU1RWWFdXUFVQT05SSktyb3V1cXVxZGhgVm5McXBeRmh5V3ZUTGh4fXhgeXtzbmFebW9kUmdydW5teXB3bHZ0dHFsbVx0fnprbXl8bHVtfGtwdnV4Xl9fYl5dX2VkaWdoZWVeYmJpaWlqa25va3FubWpwYWNmZG93eG9tcHN5fm5xcGp7enRyb21MTFtWSEdFR1JQSkxNS0xRUVFRUFFXXFlVTlZZVWZYUlJZXlRNTklUVFdXWVdPU05OTlFIUm1IaXdLYGR2dlVXbE9ubHtzYWpnf3ZVS1draH1sbWx4YFtwenteYHpzY3JveHFoZXxpcntdVEtsYHZ1a2l1e3ttfnhrfHBdXl5iW15iZGRnZWVlYlpjY2lra3JzcndnbWloZGdgYWxhZ3Nya2hsbXJ8a21oa3t0bW1rbU9ISktISUlIUlBMTk9NTFRTU09UUldSVlRQV1pWVlRUVGFgUU9OS1RUU1FVVk5OTE1PUEpIUU5QVUxLS1NUU1JUUFZVUVFOUVFYWFFOUFVUWFhYW1tVUlNXW1dYV1pPU1VXV1hSXVlXXVZUT1lSV1dXWFlfW2dyXltbWlxdX2NaX2NjZGZkY2NiWmNjZmZmbW5tdWZmZ2NgZl9dZ2BkbGhmZ2tob3poZ2drdWpoZ2lsUUlLS0xNS0pTUU1RUE9MVlZUUFRVWFVZVVJaXVZVVFdVWVhQT0xNVlRRTlVTTk9NTFFQS0pRUktRTUtLT1JUUlFRU1NJSExOT1FSUVFRVFZSWFdcV1NTUVJVVVZTWlFPU1JXVVRZVlRZVVNSVVNUVFhZV11aX2FdXFpaXFxgY1xdYmNkZ2VkZGFZYGFjYWJoaGluY2FkXl9jXVpkXGJtYV5mZmdtc2RpaGtrZWRjZmhQSktMT09MTVRQTlNRUU1YV1VUVVdXV1pWVFxgVldWWVVYVFFQS09XU1BOVVBOUU5LU1BNT1VUTlFOTU5RU1BUUVNUVU5LTU9RVFRSUlFWV1VZWltZU1VSVFdXV1lbVE9UVVhVVFlVV1lUUlJXVVVXXFpbX11WWV9dXl1cXWFhXltiYmNoZmVkYlhfYGJdYGhlZmRhXl9dXV5aWl9aX2dgXl1dY2hrYWdmaGZkYGJjYVBLTUxQUUxPVE9PU1FPUVpZWFdYWlpYWVZdamRWWFlaV1ZUVE9LT1ZUUE9UUFBQTk1RUVBSWFRSUU9NT1NVT1dSVFVVT05NUVNVVVRUUlRYVlpdXFpWVlFSV1hWW1tXUVRWVlZWWVRXV1RSUlhWVVpfWl1fX1dfXV5gXFxgYF9fWmJiZGhoZWRhWWJgYl5eZmRkYGJdXFxcXFlaW1hbYVteXVxfYl9fYmRkYmRfX2BcUE1OTlJRTVJST1NUUU9VXFpaV1tbXFlaW2RxbWhkX1tZVlZYUk1NVlNNTlJPUVJPTFBTUlVaVVRQUExQV1ZSV1NTU1hNT1BSVFhVVVVTVVlYW15dXFtWUk9VVlZbXFdRVFdVVlhWVFhaVFNRWldWXF5bX19gVmJcYGFdYGJfXGBdY2FjZ2lkZmBZY2BhX19lZV9gY1taXFtcWlpZWVdcWVxbYF5gW15eYWBfYlxZYFpRTk9OVlFQVFJPVVRTUFdcXFxYXlxfV1xeanF3eYBjXFtWVlhSTk9XU05RUVBSVFJLUVRTWVpXVU9STlNYVlRTVFJSWk9RU1NWW1ZWV1RWWlhdXlxcXlZTTlRVVlxcVlJUVlZYWVNUWVxUUlJcV1pdXl1hYWBXYltjYl5hY19cYmFiX2RnaWRmXltkYGFgYWNlX2JfWVpeW1xbWVhZV1daWlphXF1bXVxcWl1gV1tbWlBPT09ZUFVVU1JXUlRQW11eXVtgXGBVXF1panJ9c2xnXFVZV1FPUltTUlFUUlRVVEtSVlVbWVpTT1NSVlZVU09WUlNaUlRVVFhcV1hYU1hcWF5dWVpdVVVOVldXXltYUVRVWFhYVVdZW1RTVl1ZXV1gXWJjXllgW2ViX2RkXl5jY2FdZWZpZGZeXWRhYGFhY2RfYl5YWl9bXFtYWFhYV1taXGBdW1tcW1hZW15WXlldUE9PUlpQWlVVVlZUVFReXmBeXmJcYFVdXmJreXRsfWxaVVpVUVFTXFRVVFZUVllXTFJaVl1bXFJPVVNYV1ZTUFhSU1dTVlZVW11YW1lVWl5YX15ZXFlSV1JZWFlfWlpTVFZaWVpWWFlcVlVaXVxeYGFfZGRdXl1dZWFiZmReXmRjYFxnZGhlZGJfZGFfYWBiYl9gXldYXlpcXFpZWlhWXVpdXlpZW1xbV1lcXVZYV11TT1BXWVFdVVZZV1dVWF9gYWFgY11gVV1eYmVldYF6aFhZWlRWU1ZcV1dXVlZXXVhQVVxZXl1dVFJYUldWVFJUWFJTVlRZWFldXlhdW1VeX1hfX1hdVlFZVFlaWmFZXFVWWFtaWlhZWlpYVl1eX15jYmFlZV1iXGBmYmRmZF9fZGJiW2ZjaGVjZmFmX19hYWFhYF9eVlVdWVtcW1lcWVldW1tbWFhZW1laWl1fXVRZXVVOU1pWU1xUVldZV1ZcYGFiY2FkX19WW2BkYV96dW9oWVxaVlhVV1taWVxZWFlgV1BVXltgYVxUVVhQVVZVU1ZWUlNVV1taXF9eWl9cVl9fWl1eWV5WU1lXWVpdYlpeVldbXFtcW1tZW1lZXl9gYGRiY2VlYmRaYmZjZ2ZlXmFiYGNeY2NpZGRnX2deYmJjYWFgXl9YVFpaWltbWFtYWFxbWltXV1lYV1xbXGBdVl1dU1BWWlZWWlVYVVhXWF1fYmFkYWRhXllZYWRiYGxmaF5cXVtXWFhZXFxcX1tZW2JWVFdeXWFjXFJWWFFXVlZWVlZTVlRYXFxfYGBdYV1XYV5bXlxbXlhWWFhbW19gXF9YWV1cXV5eXFpcWFtfYV5gZGNkZmZmYlljZWVoZ2ReY2BfZWNdZmlkZWlfZ15jYmNhYWBfX1tYWVtZWlpYWVhXW1taW1dYWlRZXVxaYFxVXmJOUldZVldaWVtcWVdZXmBiYWVhZGFdXllhY2JfYWBhX1xcXVhXW1tdXV9fXFpdY1haWF1gY2RfUlhZUFhXWFlZV1ZYVl1dXmBhYV9iXllhXV1eWV1eWVhWV1tcYF9dX1lZXl1eXmFcW1pZXF9hX2JkY2VmZWZiWmRmZ2lnY19jXmFmZFppaWJmaWNlXmJiY2FgYF9dXVpXW1lZWFhaWFdaW1pZV1hWVVtdXV1gYGJieExXV1xZV11cXF1aV1xdX2BiZGJiYV1gWGJjYmBjYWJeXFxcWFdbXV9dYF9dW2BkXFxYWmNlY2BSXFlPWFdZW1pZWFpZYF1gYmJgYWNfXGJdX11bXl5aWVVYXV1fX19fW1peXmBiY1xcV1tdYGJhY2VkZ2VlZmRcZWZoaWZjYWJcY2dgXGlpYmhpZmVgYmFjYV9gX11dXFlcWVhXWFlYV1xbWldXWE9YWl1hY2Zmcmt/SllXXVpaX11cXlxYXVteX2FjYmFhXWJbYmRiYGNjYl1cW1pXWGlxYFxgX11cYWNfXllZY2VkYVNfWlFZV1xdXFtaW1tjYGNiY2BiZGFgY15gXF1eX1pYVltfXl1hYV9dW2BhYmViX11TXF9gY2RkZmRnZmVmZV5lZmhoZ2RkYFtmZ15haGhjaGhmY2BiYGNiX19fXV1bWltZWFhYVlpWXFpaVlZVTFhXXGdpa2h1eIF2dnZ2dnZ2dnZ2dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6e3p6ent7e3t7e3t7e3t7e3t7e3x7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHt7e3t8fHx8fHx8fHx8e3t7fHx8fHx7e3t7e3t7fYmIhoqHhYOBg4OCg4OCgoKCgoKCgoKCgoGAgYCBgICAgYCBgYGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t6e3t7e3t7fHx8fHx8fHx8fHx7e3t7e3t7e3t7e3x7e3t7e3t7fHx8fHt7e3t7e3t8iYmHiYaFgoGCgoGCgoKCgYKCgoKCgoKBgYGAgICAgICAgIGBgYB9fHx8e3x8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eHh5eXl5eXl5eXl5eXt7e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx7e3t7e3t7fHx8e3t7e3t7e3t7fHx8fHx7fHt7e3uHiYiJhYSDgYKCgoODgoKCgoKCgoKCgYGBgICAgICAgICAgYKBgH58fHx8fHx8fHx8fHx8fHx2dnZ2dnZ2d3d2d3d3d3d3d3d3d3d3d3h4eHh4eHh4eHh4eHh4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t7e3t8fHx7e3t7ent7e3t7e3x8fHx8fHx8fHx8fHx8fHx8e3x8fHx8e3t7e3t7e3x8fHx8fHt7e3t7e4aJiYiFhYOBgoKCg4OCgYKCgoKCgoKBgYGAgICAgICAgIGBgYCAfnx8fHx8fHx8fHx9fX18fHVwb29vb3Bwen59fX19fYSMi4uLi454KSkqKiopKz0/Pj4+Pj5tgH5+f397pdfT09PT1r2GiYmJiYmJjIyMjIyNjYuJiYmJiYmLjIyMjIyNiH5/f39/f359fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx8fHx8fHt7e3t7hIuHh4aHgoGDg4GCgoKCgoKCgoKCgoGBgYCAgICAgICAgYCBgIB+fHx8fHx8fHx9fXx8fH19dXBub29vb296gH9/f39+hpCPj4+Pk3kZGhoaGhocMTMzMzMzMmqCf4CAgHut6eTk5OToyomMjIyMjI2Pj4+Pj5CQjYyMjIyMjI+QkJCQkJGLf39/f39/f319fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e3uCjYeIh4eDgoSCgYKCgoKCgoOCgoKCgYGBgICAgICAgICAgICAgH58fHx8fHx8fXx8fH19fX12dXV1dXV1dXZ3d3d3d3d4eXl5eXl6eG9vb29wcHBycnJycnJyd3p5eXp6en6Dg4ODg4SBfHx8fHx8fX19fX19fX18fHx8fHx8fH19fX19fX18fX19fX19fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e4CMhomHh4SDhIKCgoKCgYKCg4KCgoGBgYGBgYCAf4CAgICAgICAfnx8fHx8fHx8fX19fX19fXZ2dnZ2dnl2dnZ6e3h7eHd2eHt4enp5fXl4eHl4eHh5eXl5enp5eXl5enp6eXh4eXl5eXl7e3t7e3t7e3t7e3p6enp7e3t7e3t7e3t7e3t7fHx8fHx9fX19fX19fX18fH19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8f4uHi4qIhIODgoKCg4KBgoKDgoKCgYGBgYGAgIGAf4CAgH+AgYF+fX18fHx8fHx9fX19fX19d3d3dnZ3fXh3d316eH14d3d5fHx9fXp8e3d3d3d3eHh4eHh5eXl5eXp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fHx8fHx8fHx7e3x8fHx8fHx8fHx+iomMjImFg4SEgoKDgoGCgoKCgoKBgYGBgYCAgICAgICAf4CAgH19fXx8fH19fX19fX19fX13d3d3d3p9eHt4fHx3e3h3d3d5fH19eXx6d3h4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fX19fXx9fX19fX19fX19fX19fHx8fHx8fHt7fHx8fHx8fHx8fH2Kio2NioWDg4OCgoKCgYGCgoKBgoGBgYKBgIGBgICAgIB/gIGAfXx9fX18fX19fX19fX19fXd3d3d3fX55d3d4e3p8eXd3d3x6fHx6fHt3eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt8fHx8fHx8fHx8fHx8fH19fX18fH18fH18fHx8fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8foqJjo2JhISEg4KDgoKBgYKBgoKCgYGBgoGAgYKAgICAgH+BgIB8fH19fX18fX19fX19fn5+d3d3d3d5fHl7eHx9eXt5enp6fnx9fHt9e3h4eHh4eHh4eXl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt7fHx7fHx8fHx8fHx8fXx8fX19fX19fXx8fHx8fHx8fXx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx/iIeNioeFhoaDg4ODgoGBgoGCgoGBgYGCgYCAgoF/gICAf4CAgHx8fX19fX19fX19fX5+fn53d3d3d3Z4eHl3eXp4enh5eXl8e3p6eXt5eHh5eXh4eHh5eXl5enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX18fH18fH19fX19fH19fX19fHx8fHx8fHx8fHx8fX+HiIyIhoeHhIKDhISCgYKBgYKCgoGBgYKBgIGBgYGAgIB/gIGAfHx9fX19fX19fX1+fn5+fnd3d3d3d3d3d3d3eHh4eHh4eHh4eHl5eHl5eXl5eXl5eXl6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fHx8fX19fHx8gIeIi4eHiYaDg4SDg4KBgYGCgoGBgYKCgYGBgIGBgYCAgICBgX97fH19fX19fX19fn5+fn5+d3d3d3d3d3d4eHd4dnl5eHh4eHh5eXl5eXl5eXl5eXl5enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fH19fXx9fXyBhoqKiYmIhIOFhISCgoGBgYGCgYGCgoGBgYCAgYGAgIGAgIGBf3x8fX19fX1+fn5+fn5+f394eHd4eHh4eHZxZGpeam15eXl4eHl5eXl5eXl5enp6enp6enp6enp7e3t8e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIGFiYqJioeEhYWEg4KCgYGBgoKBgYKBgYGBgYCBgYCAgYCBgIF+fH1+fn5+fn5+fn5+fn9/f3h4eHh4eHh5bWRiZV9fXm95eXl5eXl5eXl5eXp6enp6enp6enp6e3t7e3t7fHx8fHx8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goWKiomJhISGhYSDg4KBgYKCgoGBgoGBgYKBgIGBgICAgICBgH58fX5+fn5+fn5+fn9/f39/eHh4eHh4eW5kZWdlZGJeZnh5eXl5enp6enp6enp6enp6enp6e3t7e3t7e3x8fHx8fHt8fHt7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChouJiIqEhYaEg4OEgoGBgYGCgYKCgYGBgYCAgYGBgIB/gIGBf3x8fn5+fn5+fn9/f39/f394eHh4eHl3Z2VkZWZkZWFfaXl6enp6enp6enp6enp6ent7e3t7e3t7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHt8fHx8fHx8fHx9fX19fX19fX19fX19fXx9fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4eJh4SEhoSDg4WBgYGBgYKCgYGBgYKBgICAgYGAgYCAgYF+fHx/f35/f39/f39/f39/gHl5eXl5eWtlYWJlZWFlZV5ieHdze3p6enp6enp6enp6e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fH18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19g4aLhoiFhYaEgoOEhIKBgYGBgoKBgYKBgYGAgYGBgYGAgIGBgn98fH9/f39/f39/f3+AgICAeXl5eXl0Y2NlZGNmY2doZGZsZF5ze3p6enp6enp6enp6ent7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn6DhouGhoaGhYODg4SDgYGBgYGCgoGBgYKBgYCAgYGBgYCAgYGBfnx8f39/f39/gICAgICAgIB5eXl6d2RhY2diYmRdW2VfYV1eYGFoeHp6enp6enp6enp6e3t7e3t7fHx8e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+foSFi4eGhoaGhIODg4KBgYGBgoKCgYKBgoGAgIGBgYGAgYGBgYF+fX1/gH+AgICAgICAgICAgHl5eW9vYmJiZF5jZ19dYWFgXF9kYlttfHp6enp6enp6enp7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7fHx7e3x7fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5/hIiLhoSHhoaEhIODgoGBgYGCgYGBgYKCgYCAgYGBgYGBgYGBgX5+fYCAgICAgICAgICAgICBeXpwXWJlZGJkXmZnZ2BZYmJhY2VfXF1ze3t6enp7e3t7e3t8fHx8fHx8fHt7e3t7e3t7e3t7e3t7fHx8fHx8e3x8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fn19fn5+fn5+fn5+fn5+foCFjIqEhYaGhYODg4SCgYGBgYKBgYGBgoKCgYCBgYGCgICAgIGBf35+gICAgICAgICAgIGBgYF5emxiZGdjYmdmYWBgZGFiZWRjZGNeXGJ1fHt7e3t7e3t7e3x8fHx7e3x8fHx7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/gYeMiYWGhoeFg4SDgoGBgYGBgYKBgoKCg4KBgIGBgYKBgYGCgoF/f36AgICAgICAgIGBgYGBgXp7dGdnZmZkZGZmYF5fYWNlaGRlXmJkYHR8e3t7e3t7fHx8fHx8fHx8fHt7fHt8fHt7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f3+CiYqIhoaIhoWDhIOCgYGBgYGBgoGBgoKCgoGAgYGBgoKBgYKCgX9/f4GBgYGAgYGBgYGBgYGBenptaGNjZ2ZnZWdmZmdiZWRlYmdbYmVgdnx8e3x8fHx8fHx8fHx8e3t8fHx8e3x8fHt7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f39/f4SJioiGiYeFhYSEg4KBgYGBgYGCgYKCgYGBgYGBgYKBgoGBgICBgH9/gYGBgYGBgYGBgYGBgYF7emlpZGNqZmFgZmVjY2NnaWRjYmBiZGJ0fXx8fHx8fHt8fHx8fHx8e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f39+fn9/f39/f39/f3+AhIqMiIeJhoSFhYOCgYGBgYGBgYKBgoGBgYGBgYGBgoKBgYGBgYGAgH+BgYGBgYGBgYGBgYGBgXZzZWRnY2RmZWJlZmdkZmhmZWNgYGNkYHF9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fXx8fHx8fHx9fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/fn5+f35+f39/f39/f3+AgICFioyJiIqJhoaDgoKCgYGBgYGBgoGBgoGBgYGBgIGBgYGBgYGCgX+Af35/foCCgoKCgoKCgoKCc3NnZWRkZWlqaGZnZ2NhZmZlZmdmZWVjdX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fH19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gICAgICAgIWLioqJioeHhoSCgoGBgYGBgYKCgYKBgYGBgIGBgoKBgYGBgYGAf4B+dHRzdX1/goCAfn5/gYB0cmdkZWNmaWppZWNlY2BmZGRnZ2JiZWFwfXx8fHx8fHx8fHx8fHx8fHx9fX18fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f39/f39/f4CAgICAgIB/houLiouLh4eHhIOCgYGBgYGBgYKBgoKBgYGBgYKCgYCBgYGBgoCAgH5zc3NzdHV4dXV0dHV2dXVwZmNmZWhoaWdoZ2VmZWJfZGVmY2BiZ3d8fHx8fX19fX18fHx8fH19fX19fX19fXx9fXx8fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gIB/f3+AgICAgICAgICHjIyIi4qHh4eEhIKBgYGBgYGBgoGCgoGBgICBgoGBgYKBgoKCgYCAfnNzc3Nzc3NzdHR0dHNzdW9jY2FnZWhoZ2pmZGVnZmhmY2JlYl5ieX18e3t8fX19fX18fHx9fX19fX19e3x9fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn9/fn5+fn5+fn5/f39/f4CAgH9/gICBgICAgICAgYCAf4CAgYGAgIeLi4iNiYiJhoSFgYGBgYGBgYKCgYKCgYGBgIGCgoGBgYKBgoKBgIB+dHNzc3Nzc3Nzc3Nzc3N1cmdlZWRlamhoZ2ZpaGdjZWViZGNoZGd7eHVzc3R2dnl4dnR0dHZ3d3d2dHR0dXV4d3h4d3d6e3x9fXx9fn5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f35/f39/gH9+fHt7fX58eXl2dnZ5fHx6end2d3l7fXt4hIyMioyHh4iEhYSBgYGBgYGBgoGBgoGBgYGAgYKCgYGBgoGBgoGAgH51c3Nzc3Nzc3Nzc3Nzc3VzaGVnaGVrbGhqZ2lqZ2dnZmRkYmVkbnV0dHNzdHNzc3Nzc3Nzc3Nzc3NzdHNzc3Nzc3Nzc3N0dHV1c3V3eHl7fn59fn98f39/f39/f39/f314fH5+fXx4dXZ3eXd4dnRzc3N0dXRzc3Nzc3NzdHNzc3R0c3R0dHODjI2KiYeIhoOGg4GBgYGBgYGBgYGCgYGAgYGDgoKBgYCBgYGBgICAf3VzdHRzc3Nzc3Nyc3NzdnZpY2hqaGpsZWZpbGhgZmVkY2BkZGZ0dXV1dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHRzdHRzc3Nzc3R2dnV1d3V4fH9+fX9+fHp4dXN0dXV1dHNzc3Nzc3N0dHR0dHR0dHR1dXR0dHV1dHR1dXR1dXV1dIaMjYuIhoeEhIWCgYGBgYGBgYGCgoGAgYCBgYKCgoGBgIGBgYGAgIB/dnNzc3Nzc3Nzc3Nzc3N2dnNnZ2pmaGdmaGhmZGlnY2NnZWVmcHZ1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dHR1dHR0dHR0dHRzdHR0dnV1d3Z0c3R0dHR0dHR0dXV1dXV0dXV1dXV1dXV0dHNzc3N0dHNzdHR0dHR1dXR1iY6MjIqHh4SEhYKBgYGBgYGBgYKCgoGBgICAgoKCgoGBgYGBgYCAgH93c3Nzc3NycnJyc3NzcnZ2dW5kXWNnZWlraGVoZ2dqamlnZXB2dXV1dXV0dHRzdHR0dHR0dHV1dXV1dXV0dHV1dHR1dXV1dXV1dXV1dXR0dHV1dXV1dXV0dHV0dHV1dXV1dXV1dXV1dXV1dXV1dXV0dHNzc3Nzc3N0dHNzc3Nzc3R0dHR0dHWKjoyMiYaGhIeFgoGBgYGBgYGBgoKBgYGAgYGCgYKBgYGBgYKBgYCAf3hzc3Nzc3JycnJyc3NzdnZ3d2liaGhnamtpaGZkZGVmaWhwdXR0dHRzc3JxcnJ0dXV0dHR0dHR0c3NycXFxcXNzdHR0dHR0dHR0dHV0cnJyc3R0dHR0dXV1dXV1dXR0dXR0dHR0dHR0dHR0dHR0c3Nzc3Nzc3Nzc3Nzc3N0dHN0dHR0dHR0dYuOjImGhYWFh4SCgYGBgYGBgYGBgoKCgYGAgIKCgoGBgYGBgYGBgIB/eXNzc3NycXJycnJzc3N3d3d3bGpoZGhpa3Z6a2VmZWhnbXJzdHN0c3JwcHBxcnN0dXR0c3NycnNycXBvb29vcHFzc3NycnJyc3R0dHNxcHFyc3R0dHR0dHRzc3Rzc3NzdHR0dHRzdHR0dHR0dHRzdHR0c3NycnFxcnJzc3Nyc3NzdHR0dHN2jZCMh4eFhYSEgoGCgoGBgYGBgYGCgoKBgYGAgYGCgoGBgoKBgYGAf395c3NycnFxcnJycnNzc3d3d3dzc2pnaWloeX99cW51bG5wcXJycnFxcG9wcXFxc3Rzc3NycXFwcG9ubm1ubW5ubnBxcnJycnJycnJzcXBvb3BxcnJzc3JxcnJycnJycnJycnJzc3Jzc3Nzc3Nzc3Nzc3Jxb29ubm9vcXJzc3Jyc3NycnNzcnaPj4uHhoWFhYOCgoKBgYGBgYGBgYGBgoGBgYGCgoKBgoGCgYGCgX9/f3hxcHBwcXFycnJyc3Nzd3d2dnd2cnF0c252f352c3hwcHBycnJycXFwcHFxcXFyc3Nzc3FwcXBvb25ubm5ub25vcHBxcXFxcXBwcXJwb25vcHFxcXFxcHBxcXFxcXJycnJycnJycnFxcnFxcnJycnFwb29ubm1ubW5vcXJycnJycnJyc3JxeI+OjYaDg4aEgoOCgoGCgYGBgYKBgYGCgYGBgYKCgoKCgoKBgYKBf4B/d29wb3BxcnJyc3Nzc3J2dnZ2dnZ3dnZ1c3l/fnd3d29wcXFxcXFxcHBwcXJxcnJzc3JycXBwb29wb29vb29vb29wb3Bvb29vcHBxb29vcHBwcHBvcG9wcHFycXFxcnJycnFxcXFxcXFxcHBwcHBxb29ubm5tbW5tbm9wcXFxcXFxcXFxcXB7j42NhoODhYOCgoKCgYKBgYGBgoGCgYGCgoGCg4KBg4KBgYGAgYF/f392bm9wcHBxcXFxcXBwcHZ2dnZ2dXR0c3NxfYB9fX9zb3BxcXFwcHBwcXFwcHBxcnJxcXFwb3Bvb3Bwb29wcG9vb29vb29vb3BxcXBub3Bwb29wb29wcnJycnFxcXBxcnFwcXFxcHBwcHBwcHBwb29ubm1ubm5ubm9ub3BwcHFxcXFxcXFxcIKRjoqEhIOFhIOCgoGBgoKBgYKBgYGBgYGCgoKCgoKCgYGBgYCBgX9/gHVvb29wcXFxcXBwcHBwdnZ2dXRzcnJycnGAgoCBeXBwcHBvcHBwcHFxcXFwcXFxcXFxcG9vcHBwcHBwb3BxcHBvb29wb29vcXFwcG9wcG9vb25vcHFxcHBwb3Bvb3BwcHBwcHBwcHBvb29vb29vbm5tbW1ubm5ub25vb3BvcHBwcHBwcHBwiZCMiISDhIaDg4KCgYGCgoKCgYGBgYCAgYGBgoKBgYGBgYGBgIGBgH+AdG5vb3BxcXFwcG9vcG92dnVzcnFxcXFxcICDg39ycHBwcHBwcHBwcHFxcHBxcXFxcXBwcHBwcHBwcHFwcHBwcHBwcHBvcHBxcXBwcHFxb29vbm9wcHBvb29vcHBvb3BwcHBwcHBwcHBvb29vbm5ubm5ubW5ubm1ubm9wcG9vb29vb3BzcXWPj4uJg4KFh4ODgoKBgoGCgoKBgYKBgYGBgYGBgYGBgYCAgYGAgYGAf4B0b29vbm9vb29vb29vb3Z1dHNxcXFxcXJygIKCgXRxcXFxcXFxcXFxcXFxcXFxcXBxcXFxcHFwcXBxcXFwcHBwcHFxcXBxcHBwcXBwcHBwcHBwcHBwcHBwcHFxcXBxcHBwcHFwcHFxcHFxcXFxcXJxcnFwcnRycnR0dHR1dnRzdHR0dXd3gpCPi4iDgoaHhISCg4GBgYKCgoGBgoGBgYKBgYGBgYGAgICBgYCBgYB/gHVvb29vb29vb25vb29vdXRzcnJycnJycnKDg4OCdnFycnFxcXJxcnJxcXJycnFxcXFxcnFxcXJycXFycXFxcXFxcXFxcXFwcXFxcXFxcnNzcnJyc3V1dHR0dHR0dHV2d3d3d3d3eHh4eHd3eHh4d3Z3dnV2dnZ2d3h6e3x7e3t6enp6enyGkI2LiIODiIeHhYODgoGCgYKBgYGBgYKCgoGBgYGAgYCAgYGAgIGBgH+Ad3FxcXFxcG5ucG9wcG92dHV1c3Nzc3NzdYiDgoN5cnNzcnJyc3Jyc3NycnJycnN0cnJzcnNzc3Nzc3Nyc3N0dHV1dXV1dHV3eHd3d3d4eHh3eHh4eXl5eXl4eHl5eXp6e3t7e3t6enp5eXh3d3d1dnV2dnd5enp7fn5+fX1+fn5/f35+gIyQi4qHg4WIi4iEg4SDgYGCgYGBgoGBgoKCgoKAgYGBgYCBgYGAgIGAf4B8enp5eXx5eHh2dXZ2dHl2d3h3d3Z3dnZ6f3x+fnx2dnd3dnV4enh4eHh3d3d2eHx5eXx6eXl8e3l5eXh4eXl6enl5eXh4enp5eXh4eHh3dnd3eHh3eHh5eXp7e3p8fH1+fX9/f359e3t7e3p5enl5e3t/foB/fn5/fn19fX5+f35+fn6AjpCNioeEhoqLiIaGhIOBgoKBgYGCgYGCgoKCgoCBgoKBgYGCgYCBgIF/f4B/fn19fX9/f318e3t7eXh4eHh5eXl4eXh5eXl4enp6enp6e3t7fH1+fHt7ent8e318e3t7e3t7enl4eXh4ent6enp5eXp8fHt6enx8fHp6ent9fHx+fn+AgoGAgYKAgH9/gYGBgIB/f35+fn5/fX1+f4CAf35+f39+fn9/f39/gH+Af4OQjoyHhoWIi4yIh4aFg4GCgYGBgYKBgoKCgoKBgYKDgoGBgYGBgIGBgIB/goOCgoGBgX99f39/f4F6enh4d3h4eHh5eHh5enp5e358enx9fXt8fX19fHx7fnx9fn5+fn59fH9/f3x8fYCDgYCAf318fXx9fXt9fXx8fH19fX1+gYGChISDgoB/gYGBgH9/f4B/f39/f39+fn9/f39/f35+f3+Af39/gICAf4CAgICAhJCPi4eGhoiLi4mKhYaDgoKCgYGBgoGCgYKBgYGBgoOCgYCAgYGAgIGBgH+ChIKCgICAgH9+fn+AgH9/fn18fX19fYB/fX+Af35/gH9/fn9/gIGBgIB/fn+BgICAf4CBgX9+f4CBf35+f39+f39/fn5+f39/gYB/f4CBgYCAgYOEgoGCgoGCgH+AgYCBgYGAgH+BgICAf39/gICAgYGBgIGBgYCAgICBgoGBgYCAgYGFjo6MiYaHiYyLi4qGhoOCgoKBgYGCgoOCgoKBgIGBgYKCgICBgYCAgYGAf4KFg4KBgYCAf39+fn+AfX5+fn19fX5/fn9/f35+fn+AgYCAgICAfn9/fn6Af3+Af39/f35/f35+fn59fn9/fn9/f35/gIGBgoKDg4KCg4KBgYKDg4OCgYGBgYKBgoKCgYKBgoGBgYGBgoKCgYGCgYKCgoGBgoKBgYKCgoKCgYGBgoKCgoaPkY+KiImKjY6NiYaFgoKCgoKBgYKCg4KCgoGBgYGBgYF/gIGBgYCBgIF/gYWEg4KCgoGCgYCAgIB8fHx7fH18fH9+fn9+fn5+f35+f39/f39/f35+foB+fn9+fn9/fn9+f39+fn5/gIB/gIF/f39/f3+BgYGCgoCAgYKDg4SDg4ODgoKCgoKCgoKCgoKCgoGCgoKDg4OCg4ODgoKCgYKCgoODg4ODgoKCgoODg4KCh5KTkIuKi4uPj42Kh4SCgoKCgYGBgoKDgoKBgYGBgIGBgICAgYGBgIGAgYCAg4SDg4OEg4ODgoKCgXx9fHx9gn1+f4GCiIGCgoSCgYGDg4GBgYKDgYKBgYCAf39/gICAf3+AgX9/f3+AgYCAgICAgH9/f3+AgICAgH9/gYODhYSEg4SDgoKCg4OCgoOCgoODg4ODg4SDg4KEhYWDg4SEgoKDhIOCg4ODg4OCgoODgoCKlJOPioqMjpCPjYuGg4KCgoKBgYGBgoOCgYGBgIGBgoGBgICBgYGAgYCAgH+BgoODg4SEhIOCgoKCfXx8fn6AgYOAg4OChIaFhoaFhIWFg4ODg4SBgYKEhIKDgoeDg4KAgoGBgoKCg4KDg4KDg4ODgoGAgIKCgYOCgYKCg4OEhYWEg4OChISEhIOEhISDg4OEg4ODg4OEg4SDhIWEhISDg4ODgoKCgoKCgoKBgYKCgo+UlI+Njo6RkY6KiISCgoKCgYGBgYGCg4GBgIGBgYGBgYCBgIGBgYCBgICAgIKChIKChIOCg4ODgoJ9fX2AgH+AgoGDg4ODhIaEhIOEhYWDg4GBg4OBgIGDgYKEhYWFhoaHhoaGhoeIh4eGhoeHhoaEgoGCg4SDg4ODg4ODhISFhYWDhYSFhISEg4KBg4OCg4SEg4KCg4SCg4ODg4OCgoKCgoKCg4OEhIOFhYWFhoaIk5OTkI+Pj5KRjIqIgoKCgoKBgYGBgYKDgoKBgIGBgYGBgICAgYGBgICAgICAhISEgoKCgoGBgoKBgX+AgYOCgICAf4CCgoGDg4KCgYODg4SDg4KDhYSDgYGBgoWHhoeHh4aGh4eHiIiHh4eIiIiFhIOBgIGBgoKCg4GCg4SEhYSDg4OEg4OEhIOBgYGCg4OEhISDg4ODg4OEhIODgoSDg4ODhIWFhoeHh4eIiIiJiY6TkpKOj46Rko+LiYeCgoKCgoKBgYGBgoKCgoGBgIGBgYGAgICAgYGAgIGAgICDg4KCgYKCgYGAf4CBhYWFhoOCgYB+fn+BgoSCgYKDhIOCg4ODg4KChISDg4OCho2DjIeFhYSDg4SFhYKEhIWFg4KBgH9/gIB/gIGEg4OEhYWEgoKCgoOCg4OFhIKDhISEhYaGhoaGhoWFhoeHhYaIh4aHiIeGhoaIiYeGhYaGhoeIkZKSj46QjpCRjImHhYGBgoKCgoGBgYGBgoOBgYGBgYGBgICAgICBgYCAgICAgISEg4KBgoGAgYGAgYKIh4aHhYSCgH99fX6AgH+AgYGBgYGBgoGAgYKDgoGCgoGIk4CSiIGCg4GBgYGAf4GAgICAgH9+gIGBgYKCg4OEg4OEg4OCgoGBgoODg4SEg4SEhIOFhYaFh4eIh4eHh4eHh4eGhoaGh4WFhYaGhISEhIWEhYaSk5GOjo+OkI6JiIeEgoKCgoKCgoGBgIGCgoKCgoKCgYGBgYGAgYGBgICAgYGAgoSDg4KDgoGCgYKDg4iHh4iHhYSCgX5+gICAfn5/f4CBgYGCgoCCg5GHgH+Af4uagJWOf4KCg4OAgH9/gICAgICAgICDg4KDg4ODgoOBgYKCgoOCgYKCgoOCgoSDhISDg4SEhYWFhYaGhoaFhISEhYWEhIWFhYSEhISDhISEhISEipSTkpCQj46NiIaFhIOBgYKCgoKCgYGAgYKCgoKBgoKBgYCBgYCBgYGAgICAgYGAg4OCgoOCgoKBgoOCiImJiYiHhYSDgYKEhIOBgoKCg4SCgoODgoOJmYyDgoSBj5yDmJKCgoGChIOBgYGBgoOCgoGDg4SDg4SEg4OCg4KDg4ODg4KCgoKCgoGDhISEhYSFhYWFhIWEhIWFhYWDg4OEhISEhYWFhISEhISEg4ODg4OOlZKQkZGOjYyHhYODg4GBgoKCgoKBgYCBgoOCgYCCgYGBgICAgIGBgYCAgICBgICDhYSEhIODg4SDhIOGh4mIhoWDhIODg4WDgYCDg4WFhIODgYB/g4+aj4OFhIKSnISXlISCgoKEg4OCgoGBhIWEg4ODgoKDhISDg4ODg4SFhISDg4KCgoKCgoSEhYSFhYWFhYODhYWFhYaFhoWEhIWEhYWGhYWFhIWEhISDhIODhJGUk5KSj4yMioWEhIODgYGCg4KCgoKBgYGCg4KBgYKBgYGBgICBgIGBgH+AgIGAgYaGhoaGhoaHh4aGhYSDhYaCgIGBgYGHgoB+f4CEkImDgH58fHt7jJ2OgIKCgZGbhJWVhIKCgYKDg4GCgYKDhYODg4KDg4OEgoKEhIOEhIWEg4OCgoKCgYKCg4ODg4SFhYWFhIOEhYWGhYWEhISEhIOEhIWFhYWFhIODhIOEg4KGlJSSlJKPjYyIhISEg4KBgoODgoKDg4GBgoKBgoKCgYGCgYGBgYCAgYGAgICAgICAhYWFhYaGh4aGhoWGg4ODg4GAgoKCgYKAf35/f4WblIh/fX18gYCBlYiAg4J/j5ySmJSBgYKBgYKBgYKDgoODgoOCgoKCg4OBg4SDg4ODg4OEhIKCgoKDgoKDg4ODhIWEhISEg4OEhIODg4OEhIODg4ODg4SDg4ODg4KDg4KDgouUk5KTko2NioeDg4OEgYGCg4ODg4ODgoGBgoGCgoKCgoKBgYGBgICBgYCAf4CAgICDhISFhYSFhYWEhIWCg4KDgoKDg4OBgICAgICAhJueiX6DgX2JiX6Cg4OEgoifoKGTiYGCgoGEh4KDg4ODgoODhIKCgoODgoKDg4KCg4KDg4WEg4ODg4SDg4SEhISEhYWEhIWEg4SEg4OEhISEhISEg4SEhYSDg4SEhIODgoKDkJSSkpKPi4yIhoOFg4OBgYKDg4ODg4OCgYGCgoKCgoKDgoCBgoGAgICAgIB/gICAgISDhYWEhYWFhYSFhYOEhIWDg4SEhIKCgoOCgoSClaCIgo2FfoOFf3+GhoWFnJ+Gfn19f4KDh5aMg4OEg4ODhISEg4OEhISEg4SEhIOEg4OFhoWFhYSFhYWFhYSFhoWGhoWFhYWFhYWFhYWGhoWGhoaFhoaGh4aFhYWFg4SEhIeTk5OSkoyKiIWFhYWCgoGBgoODg4OCg4KBgYKDg4ODgoKBgIGAgICAgICAgH+AgICAhYWFhYWGh4eGhYWFhISFhYSEhISEg4ODg4OEhYOLkoKEhoSJgX9/foKIhoWIf3x+f39/f4idmoSEhISEhISEhISEhISFhYWEhYSGhYWGhYaGhoWGhYWHhYWGhYaGhoaFhIWFhYWFhIWGhoaHhoaGhoaHh4iIiIaFhYaEhYWGjZSTkpGQi4qHhoeGhIGCgYKDg4ODg4KDgoGBgoODg4KAgYGBgICAgICAgICAf4CAgICHh4eGhoeHiIeHhoaEg4ODhIODg4OEg4ODg4OEhISEgoGAgYSBf39+gIqCfn9/f39/f35/hZ6Ng4WGhoaFhYWFhoaHhoaFhoWFhoeHh4iHh4eGhoaHh4eGhoaGhoaGhYSDhIWFhYSFhYaGhoeHhoaGhoeHh4eIiIeGhoaHh4eRlJORkZCLiIiFhoSDgoKBgoODg4ODgoKDgoKCgoOCgYCBgICBgICAgIGAgIB/gICAf4aHiIeHh4eIiYmIiIODgoKDgoSEhIWEg4KCg4SEhISBgICBjIeAfn5/gX9/gH9/gIB/f4B+g4eFhoeIiIeHh4eIh4iHiIiIhoaHiIiJiYmIh4aHh4eJiIaHhoeHhoaFhIOEhYaFhYWFhoaGh4eFhoeGh4aGh4eHh4eHh4eFh5OTkY+RkIuHhoWGhIKCgYGCg4ODg4ODgoKCgoGCg4KCgIGBgYCAgICAgICAf3+AgYB/hoiIiIiHh4iJiYmIg4KCg4ODhIWHh4aFg4OFhISEg4GAgIOJhYKAgYKCgYGBgYB/gH9/fnt5gIaIiIqKiYmIiImJiYmKi4qIiIiJiYuLioqIiIeIiIiHh4iIh4iGh4aEg4OFh4eHhoWFhISDhYWEhYWGhISEhYWFhoWGhYOJlJOQj5COioaFhoWDgYGBgoKDg4ODgoKCgoKCgoKCgYGBgYGBgYCAgICAgIB/gICBgH+GiYiIiYeIiImJiIiEgoKDg4KDhImKh4aEhIWEg4OCf4CChYSCgoKCgoKCgH9+fX19fX9+fHt8g4eJi4uKioqIiIqJiImLiomJiImIioqJi4mHhoaGh4WGiIiJiIeHh4SDgoSIiIiIh4WCgoGDg4KDg4SCgoKDgoGEg4SDgY6TkpCPj4uIhYSGhIKBgYGBgoODg4OCgoKCgoKCgoGBgYGBgIGAgICAgICAgH+AgIGAf4WIh4eHhoeIiIiHh4SCg4OCgoOFiYqJh4WHhYSFhYOBgoSEg4OCgoKDgX59fn5+fn5+fXx+fX19g4eJioqHh4WGh4eHh4iHh4mGiIaIh4aJiYODhIOFhISFhYaIiIaFg4KCg4WHhoeGhoSDgoOEgoODhIKBgoGBgYODhIOEkZKRjo+Oi4eFhoaEgoGAgYGDg4ODg4KCgoKCgoKCgYGBgIGBgYCAgIB/gIGAf39/gIB/hYaGhYaGhoeHiIeGgYKEhIOChYeIi4qGhIaEgoaGgYKEhIODg4OCgoF9fH1/gH9+fn59fH19fHl8g4aHh4SDgYODhIWFhYODhYSEhISFhIWEgoKDgoSEgYKDg4WGhYSCgYGCgoODhYOEhIWEhIaDhISFg4KDgYKDg4SFhIeSkY+Nj4yJhoSFhIWCgYCBgYODg4ODgoKCgoKCgoKBgYGBgYGAgICAf4CAgYB/gICAgICDhIWEhYWFh4eHh4aAgYGFg4OEhYSHiIWCgIB/gX9/gYODg4ODgoJ/fX1/gICBf31+fn19fX17enp+hISEgoGBgIGBgoKBf36BgYGCgYOAgoGCgoKBg4SAf4CAgYOCgICAgICBgYGCgYGChIODhYSCg4SDgoKBgoSDhYWGi5ORjo+Pi4iFhYOChIKBgYGBgoODg4KCgoKCgoKCgoGBgYCBgYCBgH9/gIGBgICAgH+AgIKCg4OChIOEhYWGhn+BfoCBgICAgIGDgn9+fn5+foCCg4OCg4KDgn19fn+AgIGAfn19fX19fXx6enqAgoKBf39/f35/f4B+fYB/f4CAgX+AgIGAf4CBgX59fX+AgX9/foCAgH+AgICAf4CCgICCgYGCgYGAgYGBgYKEg4aPkpCOj42Kh4eGg4ODgYGBgYGCg4ODgoKCgoKCgoOCgYGCgYGBgICAgH+AgICAgICAf3+AgYKDhIGCgoODg4SFgIB/fH19fn19fn+Af31/fn1+gYODg4KCgYF/fX1+f4CAgH9+fX19fHt7e3p6eXqAgIB+f39+fn1+f35/gH9+f3+Af4GAf35+fn9/fn18fn+Af35+f3+Af39/f4B/f4B+f4CBf4B+f39/gH9+f4B/hZKSj46Pi4uHiYWEhIKCgYGBgYKDg4ODg4OCgoKDg4KAgYKBgYGAgICAf3+AgIB/gIF/f36BgYSEgYKBg4OCg4OBgH98fn5/fX6Af4B/foF/f4CBhIOCgYB/f359fn5/gICAfn19fX17e3x6enl5eXuAgH9/f39+fn5/foCAf35/f4CAgoB/fH5+f35+fXx/f4B/fn9/f4B/f35/foCAf36Af39+fn5/f35+fn18fH2Fk5KOjIuKiImIhISEgoKCgYGBgoOCgoODgoODg4ODgYCBgYGBgYCAf39/f4CAgICAgIB/foCBhIOCgYGDhISDhICBgICBgIGAgYKCgoGBgoCBg4ODgYGBgYCAfX19fn5+f359fX19fXx8fHt6eXl5eX2BgICBgYF/f4B/f4F/gICAgYGCgoB+gH5/fn5+foGAgYF/f39/gIB/f39/gYB+f4CAfn9/fn+Af31+fn17fIaTkYyLioeHioiGhoSDgoGBgYGCg4ODg4OCg4OCgoKBgICBgYGAgH9/f39/gICAgICAgH9+fn+BgYGAgISGh4aHgoSDhYOBg4ODhYSEhISEg4ODhIKCgoKCgX5+fX19fn6AfX19fX19fX19e3p6eXl5eYCCgoKEg4GCgoF/gYCBgYGDgoODgYGCgIGAf4CBg4GEgoCAgYCBgYCAgYCCgn+BgIF/gIB/gICAfn9/fnx8ipOQiomIiIiJiIaGhoSCgoGBgoKDg4ODg4KDg4KCgYCAgICBgYGAf39/f4CAgICAgIGBf359fn5/f39+g4aHh4iChYSFg4SFhIWGhYaGhoWGhYGBg4ODgoKAfX19fX19fn59fX19fX19fX18e3l5eXl4fIKDhIWCgYSDgoKDhYaCg4SDgYKCg4OCgoKCgYKFg4iFgoGBgYKDgYGBgYSDgoOCgoKCgYGBgIF/gIGAf36Ok4yHiIaIh4aGhYaGhIKDgoGCgoODg4ODg4OCgYGBgH+AgYCBgYB/gH9/gICAgH+AgYB/fn19fX5+f36Ag4SHiISGhoaFhoaHh4aHh4iHh4eGf32BgIGCgX59fX19fX19fX19fX18fH5+fnx7eXh3eHl5gIODf4OMhIOEhISXl4ODhIF9foGCgoGCgYKBg4aIjIWDgoKBhIKEg4KDhYSEhYOCg4OCg4OCgoKCg4OCgpKQi4iJh4mHhoaEhoWEhISCgYKCg4ODg4ODgoGBgYCAgICBgIGBgH9/fn+AgYCAf4CAgH9/fn1+fn+Bf4CCgYWFhYeGh4eGh4eIhoaHh4eGh4V/fX18fX9+fX19fX19fX19fX19fXx7iJKCe3x6fIZ5eHl8gYF+iZaEg4OEhJSTgIGBf39/fn6Fi4B/gICEhpCJhYSCgoGFhYuDgYOFhYaGhIOFhYOFhIODhIOFhISIko6MiYiIiYeHh4WGhYSFhIKBgoKDg4ODg4OCgYGBgYB/gIGAgICAf39/f4CAgICAgYGBf39/f4CAgIGBgYGBg4OGh4aGh4aGiIeGhoaFhIOFhH59fHx8fX18fH19fX19fX19fX18fH+RlZaDe3qElHx4eXp7fICCg4GBgYOCgH58fn57iJF8fI6Wf31/f4KGioWDg4SCgYONiX99f4OEhoWDhYaFhIWFg4SFhYaEhI6Rj4yKioyJiImHhYWFg4ODgYGCgoKDhIODgoGBgICBgICAgYGAgIB/f3+AgIB/gICAgX5+f4GBgoKCgoODgoOCgoWGhISFhYSGhIOEg4KBgIKAfn19fHx9fXx8fH18fH18fX19fHx8e4uRl4x6e3yBenp6e3x5eX19foB/gH98e3t+fn2ClZF/hIh+fH5/goR8fIGChIKAf4eDfIKBf4KCgIODhISEhISChIOEhYGEkZGOi4yMjoqJiYWFhYODgoKBgoODgoKDg4KCgYGAgIGAgICAgICAgH+Af3+Af357gICBenyAgYKDhYODhYWFhYODg4SCgYKDgoOCgoGBgIB/gX5+fX59fHx8fHx8fHx8fHx8fHx9fHx8fn6Kgnt6e3p4ent7fH17fn1+f319fX18fH+BgX2Gj4F+fYJ+fn6Agnx8f3+CgIKAfnx7ioJ9gH9+gYCAgIKBgoCAgYGAf4uUj4yLjo6NiIeIhYWEhIOCgoKCg4OCgoODgYGBgICAgICAgH9+fXx7fHx9f3+AgHx6gYF4e4CCgYOFhIOFhIaHhISAhpSIgIKBgYGBgH9/f39/fn5+gHx8fHx8fHx8fHx8fHx9fHx8fHx8fHl7e3t4eHl7enp8gn+Afn+BfH5+f399gIKCgICAgX+CkYF/f4CAfoB+fn9+gIGBfX19e319fX19fHx9gH+AgH6Afn6ClJGMjI2OjoqFhoeFhISFg4ODgoODg4OCgoGBgYGAgICBgICAf4CAf39/fXt6fICAgHh+gXd7gIF/gYKCgoKEhoeGhn6IlYp+gIGAf4B/foB+f39/fn+Bfnx7e3x8fHx8fHx8fH59fHt8fHx8e3x8fHp6eXt8en2Fg4J/gYF+f35/gH6FgoF+gH9+foCFhoKAfn6Dhn9+fH6AgIGAf39+fX19fX57fH1/f3+AfX9+gIyRjYyNjo2Nh4SGhoWEhISDg4OCg4ODg4KBgYGBgYCAgYGAgYGBgYGAgH9/f397en9/e3mAd3p/f31/f3+Af4KDhoaFf3+FgX5/gIB/gH5+f31/gIB/f4B/f319fHx9fn18fH19fX19fH58fXx7fXx8ent6fH19f4aEgoCAgX1+fX5/fouEgYZ+fXx8f36CgX99fX19gHx7fXx+gYSDgYB+fn5+fX1/f399foB+fn6Eko2MjI+Ni4qGhIaEhIODg4OCg4KDgoOCgYGBgYGAgYGBgYB/fXx8fH1+f39/f397e399d352eH59fH18fX5+gYGCg4B6fX18fn+Af36Af35/fn+AgH+AgH9/fn9+fn5+fn1+fn99fH59fn19fHt8fHx6e3p9fn+Ag4OCf35/fH18fXx8gYN+jH58e3t9fn1+fn17e3t9fHp7e3uAhoWChIOCf4B+f4KCgn9/goJ/gIuQjYyLjYyLiISEhIODg4ODgoKCgoKCgoKBgYGAgoGBgYKCf3+AgIB/fn18fH5/fn55fX52e3Z4fXx8fHt9fX6BgICAf31/f31+f39/foB/f39+f3+Af4GBf399gH9/fn9+fn5/f3yCfn59fX17e319fHp8fH6AgoGAgIB8fH18fHx8fH18fnt/fnt7e3x8fH18e3t7e3x8enp9en6CfoGDhIKBgoGFhoWFhoaHhYGEkY+Ni4qLh4eFgoOEhISEg4KCgYGCgoKBgoGBgYGBgoGBgoKAgYKBgYCAgH9+e3x+fnx6fnh5dnd8fHx7e318f4GAf35/foB/f35/f35/gH9/f3+Af3+AgYKAfn6BgIB/f39/f39+fYN8fH19fH99fX19e3x+fn9/fn5+fnx8fHx8fXx+fnt8e3x8fHx9fH18fnx9fHt7e3x5e3x7fH16fX5+f4CAg4eJiYmKiYqJhYiRjoyIiYeFhYOCgoOEhIOCgoKBgYKBgYKBgYGBgYKCgoGCgoCAgX98e3p6eXt9enx+fnl8eXh4dHx8fHt8fHx+gH9/f39/gIB/fn5+fX+AgH9/f3+Af4CDg4B/gIGAgIB/f4CBf358enx9fX59fX5+jIZ9fX57e4OCfX19fX18fX19fH1+fH18fXx9fX58fn19fX18e3t6fHt8fHt6e3t6enp7fn6DhYiHiIqLi4uJjZGOjYmIhoWEgoKCgoODg4OBgYGBgYGBgYGBgYGCgoOCgYKBgIGBf3+Af356eHl5en5+e3l6eH5zfHx8e3x8fH5+fn5/gH+AgIB/fn9+gIF/f4B/gIGAgoSDgYCAgYGAgX+AgYKBf39+f31+gH57foGSjHx9f4qAjYx+fn19fX59fX59fHx8fX18fXx9fX1+fX1+fnx7e3t8fH18e3p7fHl6eXh5e35/hIOEh4mKiImOkI2LiIiFhISCgYKCgoKCgoGCgoKBgYGCgYKCgoGCgoKBgoKAgYGAfoCAf39+e3p5e319eHx6f3KBfXt7fHx8fn59fYGCf4GBgX9/gH+AgX9/gIGCgYGFhISCgYGCgYKBgICBg4KAf4F/fX6Afnx/f4mCf36DkISEg4F/fn18jYd9fX59fHx/fnx9fXx9fX5+fX5/fX19e3x9fnx8e3x9enp5eXl5e3t+foCBg4eEiI6NioqGhYSEg4KBgoKCgoGBgYGCgoKBgoKCgoKCgoKCgoGCgn+AgIB+f39/fn5/ent5fX16enp9cX6Cent9fX19fXp4f4KAgYKCgICBgIGBgICBgoKCgoaFhIKBgYGBg4F/gIKEgX9+gYB9foF+fX5/gIB9fn+EgH5+f31+fX2KhX1+f31+foB/fX18fH5+fn99f4B9fn18fX9/fHx7fH17e3t6enp7e3x9fn2Ag4CJjYqLh4WFhYSDg4KCgoKCgYGBgoKBgoKCgoKCgoGBgoKBgYKCf4CAgH9/f39+fn59eXp6fXx5d3t0e4d8dHd9fn17e3Z2fYCBg4KBgYKCgoKBgYGDg4OChYaEg4CAgICDgX+AgYSBfn6Af35+gH59fn6AgH+Bfn+Af35/gH98f39/f3+Afn9/gH58fX18fn5+foF/gH2CgHx9gIB9e319fXx8e3x8e3t7fHt8fHx9fIqKiIiFhYWFhISDgYKBg4KAgIGCg4KCgoOCgoKCgoGCgoGBg4J/gIGAf39/fn5+fn57enp8fHt2e3R3f352cnt+fnt4dnd8gIGCgoKBgoODg4OCgoSDhIOFhoOCgX9/gIOBgICAg4F+foB/fX+AfX1+foCAf4J/gYGAgICBf31/f3+AgIGAgIB/fnx9fX19fn59g32AfoKAfX6AgX98fn59fX17fH58fXx8fHp8e3x9iYaGhYWHhYWFhIKBgoGDgYCAgoKDgoKCg4ODg4KBgYGBgYGCgH6AgYB/fn5+fn5+fn56e3p9goN9dXF6fHpxen59eXh0dICAgoKCg4KDhYOEg4ODhISEhIWEgYGAgH6AgoB+f36Bf35/f4B9foB9fX1+gH9/gYCCgYCAgIKBfn6Af4GAf4CAgH9+fX19fnx+fn19gYR/gH9+f4GBf31/f319fn1+fn1+fHt8enx7eoCHgoSEhYSEg4WDgoKBgYKBgICCgoOCgoOEg4SDg4KBgYKBgYOAfoCBf35+fn5+fX5+fnt7en6Jh354cnl9f3F6eHt4eXV1fYKDgoODg4OFhIWDg4OEhIODhIKBgH+Af4CBfn19foB+fn5/gH19f3x9fX6Af4CAgIKAgIGAgoGAf4B+gIF+gIGAgH9+fn5+fn5/fn6FhYGBgH+Ag4F/foGAf35/f4B/fn17ent6fHt6goR/g4KCgoOChIKBgYCAgoGAgIKBg4GBg4SDhIKEgoGBgoGCgn9+gIF/fn1+fn5+fX59fXp7fIWEe3tzeXp8cHd1dnd5dXR6hISBhISDhIWFhoSDg4WEgoODgoCBf39/f4B9fX1+gH1+f39/fn1+fH19foF/gIB/gIB/gIGDgoGAf36AgH+AgYCBgH9/f39/f4CAgIGCgoKBf4GDgX+Ag4J/f4B/gX+Af3x7e3p8e3yCgH+Cf3+BgIKCgYF/fn+BgH6BgoKDgYGDg4KEgoSCgYGBf4GCgH6AgH9/fX5+fX19fn19e3t6gH94fHZ5eXtxdHh3dnh1cnmFhYKEhIKEhYWGhISChIOBg4GAgIF+f4B/gHx9fX6Afn5/f39+fX98fn5+gX+Bf39+f4B/gIOCg4B/f4GBgIKBgYGAgICAgICAgIGAgYKDgYF/gISBfYGDhICAgX+BgYKBfXp7e3x8fH99f4B8f399fYGAgH59fYB/foKBgYKBgIKCgoKBg4KCgYB/gYKAfn9/fn99fX1+fX19fX19ent7fHZ9eXh5enJ1eXl2d3dzdYaFg4WFgoSEhYSEhIKDgoGDgX+AgX5/gH6AfX19fn9+f4B+fn99f3x/f3+BgIF/f3x+gH6AgYKDgYCAgoOEgoGAgYB/goCAgYGAgYGCg4KBgX+Ag4B+goKEgICCgYKChIJ+e3t8fHx8fX1+fXp+fX14fn9/fHx8fn5+gYCBgYCAgoGBgYGDgoGBf4CAgoB9fn19f319fX59fH19fX16e3p8dnx6d3t4cnZ5e3Z2dnN0hoSEhYSChISFg4OCgYOBgYOBgIGBfX+BfoF9fX1/f39/gH5+f359fYB/gIGBgX5+fH5/fn5/gYJ/gYGCg4eFgX9/fn6Af4CBgICAgIKCgYCAfoCCf36BgoKBgYOCg4OFgn99fX18e3x8eXp7en55fHl4f357e3t+fX1/f4F/gH6BgICAgoOCgYF/gIGBf31+fH1+fX19fX18fn58fXx5e3x4enx3endzeHd6c3d2c3SGhISGg4KDhISDgoKCg4GCgoGAgYF9gIB+gH1+fX5/gICAf35/f3x+f3+BgIGAf359f39+fn+BgH2AgIGDg4N/f359fn5+f4CAgIB/gYKAgH9+gIF+f4CCgoCBg4KEhYaEgH59fHx8fHp5dnl5enl3eXZ+fHt7e358e399gH99fX9/f3+BgoGBgX5/gYF+fX18fX19fX19fXx+jYF8fXl7e3p5fXd4eHR1dXhyd3d0doaEhIWEg4ODg4OCgYKDgoGDgn+Bf35/fn+AfX19fX+AgIB/f39/fIB/f4GAgYCAf3yAf31+fn9/fX5+gYGCgn5/fn1+fn5+f3+Af32AgIB+fn5/gX5+gIKBf4KDgoOEh4SAgH58fXx8e3x1eXl4eHh5d3t8e3t7foV9fn1/ent+fn59foGAgIGAfX6BgH59fXx9fX19fX18e32Dgnx8ent7e3p7d3Z4dXJzdnB4eXJ4hYWFhYOEhIOChIKBgYKBgIKBgIF/fn5+foB+fX58foCAgH+AgX97gH6AgH+BgYB/fYB+fn5/f319fX6AgYKBfn9+fn59fX5/fn9+fH+Af35+fn+Dfn6AgIF/gYOCg4OGhICBfnx9fHx7fXh3e3h1eXd3eXx6e3t9kod9fH13en1+fn19f35+gH98foB/fn19fH19fX19fHt8ent9enp4e3x6ent4dHh1cXJ0cHh4cnmEhYWFg4SDgoODgoGBgoKAgYGAgIB9fn5/gH18fn1/gIGAf4CBgHyAf4B+f4GAf39+gX9+f39+fX18gICAgIB+f35+fn18fn9/f358fYB/fX1+gIJ/foCAf36ChIKCg4WFgoJ+fXx7e3x8eXd8eXd4d3d4e3t7e3yFin17end6fH19fHx9fX1/fnx9fn59fXx8fX5+fX18fHt6enx7e3p5enp6enhzd3VxcXJweHdxe4WGhIWDhYKBg4OBgYGBgoCBgICBgH5/fn9/fXx+fYCAgoGAgIGBfX6Af35/gX+Af3+BgH9/f31+fH1/gICAgH9/f35+fXx+f39/f319f39+fn6CgYF/gIB/foGDgoKEg4SCgn5+fHx6fHt7eXt6d3N2d3h5e3p7eXp/fnt7d3p8fXx8fH59fH19fH19fXx8fX19fX99fXx9e3l7fHx7enp6enp6eHN2dXBwcm93dnJ7hYaEhYOEgoGDgoKCgYGCgYKBgYGAf4B/f399fX9+f4CBgYJ/goF9foF+fn+Bf4B/gIJ/gIB+fH58f3+BgICAf4B/f4B+fX5+f4B/f39/gH9/f4J/gICAgIB/gYGAgISBgoKAf39+f3x9fn56fYV+dHx9enp6enx5eXp6hoV3eXx8fHx8fXx8fHx8fX19fHx9fX19fn19fX16eX18fH16enp6enp5c3V1b29xb3d0c3yFhoOEgoOCgYKBgoKCgYKBgYGCgYCAgICAgH59gH+Af4GCgn+CgX+AgX5/gYB/gICAgn+Bf319f35/f4KAgICAgIB/gIB+fn1/gH9/gIB/f39/gH+AgICAgH+BgYCBgYGCgYCAf39/fn1/fnuBk416fH18e315e3p6eHmBgXh5e3x8fXx8fHx8fHx9fX18fH18fn1+fn59fHp8fHt8fXt5enp6eXlzdXVvb3Fwd3N0fYWGg4OCg4KAgYCCgoGAgYGCgYKBgYCAgIGAfn5/f4GAgYKCgIKCgICCfoCBgX9/gX+BgIF/fH6Af3+AgoCAgICAf3+AgH9/fX6Afn2AgIB/f3+AgICAgYCAf4CAgYCBgYKCgICAf39/fX5/fIGGiXx8fnt7fnl6e3p7jn53d3l7fHt9fHx8fHt9fH19fX18fXx+fn5/f358enx9e3x9e3l6e3p5eXN0dW5zcXB4cnV6hYaDg4KDgoCAgIKCgX+CgYKBgoGBgYKAgYF/fn9/gYGCgYKBg4OAgYJ/gYGBf4CAgIB/gX99f4F/gICBgICAf4B+gICAf359foB+fn+Af39/gH9/gIGBf4CBgH+BgIGCgoKAgICAgIB9foB9gIOCe35+e3x9e3p8fHyHeXh4eXx8fH17fHx9fX18fH19fn19fX5+f3+Af317fH18fHx7enl7e3l5c3J1bnZycHhxdnaFhYOEg4KCgICBgoF/gIKCgoKDgYGDgoCCgYB/gICCgoKBg4KEhICBgX6BgoB/gICAgH+Cf36AgYCCgICAgIB/gH+AgIB/fn2Af39/f4CAgH+Af3+AgYF/gICAgIGAgIGBgYGAgYCAgH9/gH5/fX59fn57fXx9e3x8eHh1eHh5e3x8fXx7fHx8fX5/f39/fn19fn9/gIGAf3x9fHx9e3p7eXp8eHpzcnVud3FxenF2d4WFg4ODg4KBgYKDf3+CgYSDg4SBgYOAgoKCgYCAgIKDgoCCgoSDf4GAfoKDgICBgICAf4CAf4GBgIJ/f4CCgH9/gICAgICAf4CAgH+AgICAgIB/f4CBgYCAgICAgYGAgoOCgoCCgYGCgYB/f4B/gId+fnx6fXx7fX94d3Z5eXp8fXx8fXt8fH19fn5/gIGAfn1+gICAgoGAfH59fX58d3t6ent5eXNxdW53cHV6cXZ5hYWCg4KDg4KDhIR/gIOBhoOEg4GChICEg4KCgICCgoSBgYKChIJ/gIB/gYOCgYCBgYCAf4GBgYGAg4F+gIOCf35/goGAgIB+gYCBf4CAgYGBgYCAgIKBgYKBgYCBgYGBgoOCgoOBg4OCgYCBgH+AhH19fXx/fXt9f3p5dnp4eXt7fH19e3x9fX19fn+AgYGAgH+AgICDg4B9f35+fn15eXt6enp5c3J1b3dxd3lzd3uFgoKDgoOEgoOEg4CAgoOGg4ODgoKEgYSDgYKAgIKBhIGCgoGCgX6BgICCgYKBgYOBgIGAgICBgoGEgH6Bg4J/foCDgoCBfoCCg4KAgYGBgoKDgoGBg4KChIGAgYOBgYKEg4KEhIODhIODgYGBgYCCf4B/fYB8enx/e3t3fHl5eXt6fX59fHx8fH1+foCBgYCAgIGBgYSEgH2Af39/f357e3t6e3p0cHhyeXR2eHR3e4SCg4KDg4SChIODgYKChYaEgoODgoSBhISBg4CBg4KCgoKCgIKAf4GAgIKBgoGCgoKBgIGBgoOCgoOAfoGDgX9/gYSEgYN/goKBg4KCgoGDg4OEgYKEgoOCgoGCgoOBg4SDhISEhISFg4SCgYOCgoOBgYGAgH58fIB8fHh8eXp5enx9f3x7fHx9fX18fICAgICAgYGBgYKBfoGAgICAf3t7e3p6enVweHd5dnV8dXZ8gICDgoODg4OEhISAgoOGhYWDg4KDhIGEhYKCgYKDg4GCgoKAgYB+gYCBgYKDgoKCgoGAgYKCg4KCg4B/gYKBgICChIODgoGCgoGDgoKDg4SDg4SAgoSDg4OBgX+Bg4KDhYKEhISEhISDhISChIOEhIKBgoGBgHt+gX59eXx6enp9fHyBfnp8fH19fHp7fn5+gIB/gYGAgICAgIGBgIB/fX18fX18dnJ2eHh2dH92dX2Hh4OChIWDg4SFhICChYWEhIOCg4SEgISFg4KCgoODgYOCgoCCgH2AgIGCg4KCgoKEgoGCgoOEgoKBgICBgoGAgYOFhIOCg4CCgoOCg4ODg4OEg4CCg4KEg4KCfoOBgoSEgoODhISEhIOEhIOEg4WEg4ODgoKAe4CBf3x8fXp6e32AfX9/fHx6fH59fH19fn5/f39/gICAgH9+foCBgICAfnx9fX5/fn18e3h2f3Z3f4SHg4KDhYODhIaEgYKFhoWEhIODhISBhIWFgoKDg4SCg4KDgoKBfoCAgoKDgoODg4SDgYKCg4OCg4GCgYGDgn+ChISDg4KEf4KEg4ODg4SDg4SCgIOEg4SDg4KCg4KChIOCg4OEhISEhIWEg4OEhYSFhIOBgoB9gYKAfXx8e3x8gH19foB+fn1/fnx8fH19fn5/fn+BgYGBgH99fX6BgYB+fn19fX59fX5+f3+AfH2AgYKCg4OGg4SDhoSBgoiHhYSDg4SEhYGFhYWDg4SDhIODgoOCg4F+gYGDg4SCg4OEhIOCg4KEg4ODgoKDgYOCf4KEg4ODgoOAgoWDg4ODhIODhIOBgoSEhYOCgoODg4GEg4GDg4SDg4SEhYSEhIWFhYWEg4ODf32BhIB9fXx8fHx/gX5/f39/fX99e3x9fX19fX5+f4CBgIGBgH59fH6Cf39+fn5+fX1/f39/gICAf4CEhIODhIWDhIOFf36CiouFhISDgoOFgYaGhoOEhISEhIODg4OEgn+BgYODhYSFhIWEg4KEhISFhIODgoSDhYKBhISFhYaEgoCDh4SDg4OFhIWFhIGEg4OGgoOCg4GCgoSDgoODhYODhYWEhYWHh4aHhYSEhYSBf4GDf35+fH5+fX+BgH9+fHx/f358enx9fX19fX5+fn9/gIGBf319fIB/gH5+fn5+f3+AgYGBgYKAgYWFhIOEhIKEg4aAgoWFiomEhISEhYWCh4aGhIWFhIWEhISEg4SDgYKDg4OEhIaEhYSDg4SEhHyDhHuBhHd5g4F9hH5+cnWDgoF2foOFgH2BdYF6hH9/f36EhIKDg4KBg4SDg4SFg4SFhoSFhn2EeXx+f4N7hYOBhIOAf319fn5+gYOBfXt/fX6Afn18fHx9fX19fH19f4B/gYJ/fX18f4GBgICAgH+BgYGCgYKDg4KChoSEhIWEgYOEhYOEhYSKiIWFhYOFhYSGhoaDhIWFhYWEhYWEhIWCgoOEhYWFhoSFhIOEhYWCaICFanx7cXF8gXOGc3R0fYKDdXNxg4ZzcHVyc3SDdnt9dYF/goOBgnZ5hYCDgIR/hYSChYWCaHpyc3N8gHKBg3+Dg32BfX5+fX6Cg4J8f4F9f4B9fXx8fHx9fHx8fn1+gH+BgX99fX2AgYKBgYGBgIGBgYKBgoKCgoSHhIWEhYSBgoSGhoOFg4aIhoaFg4aGh4eGh4OFhYaFg4KFhoSFhYODg4SEhoaGhIaEg4SFhn1xe4FweXZ+g3+CbnlwdXN8dnl5hnOEg3B2eHF2dHR1cnN0dml/gG5yb3R2bnVsd217c26Ah3ltfXJzdnN2bW53bHB5bHV9f399foGAgX2Af32Af4B/fX18fHx9fH1+f32Af4CAfnx/foCBgoCBgICAgYCAgIKDgoKEhYiGhoCChYODhIeGg4WFhYaHh4SDhoeIiYaHhIWGiIeEg4WGhYWEhIOFhIKFhoaFhoWEhoWHdnB0e3BydX+HhYNtdW92b3x1coR5eYd4cXR3bndod3pucHaCcoN+b3p5eW1vbnpvb213fXiGcHF6cHJ0ZoF1fm57eXNveX+Af319gYB/e399fIB+gIB+foCAgYB+fn9+foF/gH9+fYB9f4CBf4B+fn+BgH9+goOCgoSFh4eEfoeEg4OFh4aEhoWFhoaIhISGh4iIhoeEhoaLioWEhoeHhYOFhYWEgoWFhYWGhYWGhYZxdXByc29zenl+hHSIdHV+iHZugnKEhnluanJ/cW1zd3x/dXR8hH54cXV3bnl1enF2eHV6eYRxam95eHBreXN6b3p3dnZwgYB/fn5/f356fn18f31/f359gIGDg4CCg4GBhIGBf4GBgH1/f4F+f35+f4GAfn6BgoCAgYSHhoODhoSEhIaHhoWFhYWHhoiFhYaFh4eFhoSGhomIhYSJi4iGhIaFhYWDhYWEhoaGhoaFg3iLeXKIentwcIWEeIV4eWtzfnl7a3KDh4N6fG17enl0fYB2bm+AgG90fHV3cXl9fW1+dW+DhYZ6gHJye3x1cG96bHN8bneCgIF+fn99fXp9e3x9fX9/fn1/f4KCf4GDgYGDgYB/gICAfn9+f31/fn1/gH58fYGAfn6Ag4iFhoOFhYWFhoeFhYWFhYeHiIaEhoWHhoaFhIWFhYWFhomKh4WEhoWGhoWGhoSGhoaGhoWGh4eHhoaEhoWGh4iHhYeHhoOHhoWFg4SFhoWGhIaEg4SEhoSEgYODhISFhIWEhYSGg4aHhYaEhIWHhoSEhYaEhX13hYOEhIKBgX1/fnt8e357fHx9f359fH59gIB9f4F/f4GAfn5+gH5+f35+fX99fX5/fHt8f358fH+BiYaFhIaGhoWGhoWFhYWGhoeIhoSGhYaGhYWDhIWGhYSGhoaGhYSGhIWGhoaGhIeGh4eGhYeIiIiIhoSHhYaGiIaFiIeIhYeGhoiFhYaHhYaGhYOChYWGhYWDhYSEhIWEhYWEhYWDhoaGhoWEhoeGhISFhoOFhIKEg4OFg4OCfYB/e3t8fnt8fH1/fnx8fn2Af31/gH5+gH99fXyAfX5/fn5+f3x8fX57fHx/fHt7fn+Ih4SEiIaGhoeGhYWEhoaGhoiHhIWGh4aFhIODhIaFhIeFhoaFhYaEhYaGh4eFh4aJiIaGiIeIiYiFhYiFhoeGh4aHhoeFh4eGh4WFhoeFh4aFgoOFhoaEhIOEhIOEhoSFhYWFhYOGhoWGhYWGhoWEhIWFg4SHhYOCgoWDhIF+gIB8e31+e3x7fX59fHx+fX5+fX9+fX1+fn19fH98fn58fYGAfHx8fXx8fH56e3t8foiHgoWIh4eGh4aGhISGhoeGiIaEhYSGhoSFh4OEhYSFh4SFhoaFhoSGhoeHhoaHh4mIhoaIh4iKiIWHiIWHh4WHhoeGh4WIiIeHhYaGh4WGhoWBhISFhoWFhISEg4SFhIaGhoWGhIaFhoaFhYaGhYSDhISDg4eDhIGChISDgYCAgHt7fn18fHx9fXx8fH19fH18fn18fX18fHx8fXx+fXt8gX99fH18fnx8fHp6fHx9iIeChoiHhoeGhoaEhYaFhoaGhYOFhIaFhIiJg4GEg4SGhIaGhoaGhIeHiIiHh4eIioiGh4iHiImIhYiHhYeGhoeHh4WHhoiIh4eFh4eHhYaHhIKEg4SGhYeFhISEhISFhoaGhoaFh4WFh4WGhYeFhIOEg4OEh4GDgIKDg4KCgn+Ae31+fXt8fH59fH19fH57fHx7fHx9fXt7e318e358e3x/fX18fX1/fXx6ent7fHyIh4KGhoaGh4aGhYSFhoWFhYWEg4WChoSDiId/enqChYaEhoaFh4aEh4eIiIiHhoiKh4aHh4eIiYeFiIeGiIeGhoeHhYeGiIiHhoWHhoiGhoeDg4SEg4aGh4WFhISEhYaGhoaGhYaHhoaIhoaEhoWDg4ODgoOGgYN+goKDgIOCf398f35+fHx9f318fX18fXt7e3p7fHx8e3t7fnt7fXt6e358fHx8fX5/fXt6fHp8fYmHg4aFhoWGhoWEhIWFhYWFhIOBhYGGhIKEhHyAhn+ChYWGhYWGhYSHh4iIiIaFiYqHhYeGh4eIh4WIhYaHiIaGh4eGh4aIiIeFhoeGh4WFh4OEhoWEhoaHhoWEg4WFhoaGhoaFhoaHhoeHhYOGhYOBg4KAg4WCg36BgYF/g4F/fn5/fn58fH1/fXt9fXx9enl6eXt8fXt7e3t+fHx8fHp7fXx8fHx+fYF8e3t7e3x7iYeEhoSGhIaGhYSFhoWEhIOEgoCDgYWDgYJ/eoSMe4CEhYeGhoaFhIeIh4aHhYSHioeDh4WGhoiGhYeEhoeIhoaIh4eHhoeIhoSGhoaHhYWHg4SFhIaGhoeFhISDhYWGhoeGhoWGhoeFhoaEg4SFgoGCgYCDg4KCfYGBgH6DgX5/f4B8f3x9fX59e359fH15eXp5e319enp7e318fXx8ent9fHx9fH5+gHx7e3x+fXyIh4WGhYeEhoSFhYWFhYODgYOBgIKBhYKAgH9/fXx7gYSFhoaEhYSDh4eGhoaFhIaJhoKGhIaGhoWFh4aHiImGhYiHiYeGhoeFhIaFhYeFhIeDhIWEiIaGh4WFhIKFhYaFhoaHhIaGh4aFhoODg4WBgIGAgIOBg4B8gYB+foKAfYB/gXx/fH1+fX57fn18fHl6enl6fX15ent7fHt8e3t6e319fH18f35+fHt7fX59fIiGhYaGhoSFhYSFhYSDgoKAgoGAgICDgX5+foB5en2Ag4OFh4WEg4OHhoOEhYSChYiFgoSDg4WFhYWHh4aIiIWFiIeJh4aFhoWDhoSFh4OEhoSEhYSHhoWGhYaEgoWFhoaGhoaEhYaGhYWGgoKDg39+gICAgYCDgHuBf31+gn5+gH6Afn99fX59f3t/fXt6eXp6eXp8fXl6ent7enx6e3t7fH19fXyAfn18fH1/fnx7h4WFhoaGhoSFhIWDhYKBgICAgYB+gIKCfX5/f3t/f4KDg4WGhYSDg4aDgYOEgoCFh4WCg4GBg4SEhIaGh4iHhYWIhomHhYSEhIKFg4SGgoOFhISGhIeGhYWFhoOEhYSFhoWGhIOEhYWDhYWBgIODf35/gH9/gIN/fIB9fX+CfYCBfn6Bfn5+fX1/e398e3p5enp5ent8eXp6e3t7fHp7e3t7fX59fYB9fXx8fYB/fXyGg4WGhoaGg4SDhYKFgYGAf3+AgH5/gIF8fn9/foCAgoKChIWDgoGChIGAg4KBgISFhYKBf4CCg4OEhYWHhoWEhoeFh4WGgoOCgoOCgoWBg4WEhYaEhoaHhoaFgoSEg4SGhYWDhIODhIOFhIB/goJ/fX5/fn5/hH57f3x8gIF9gYB9foN8fn59fX57fnt7enl6enl6ent5enp6e3t8ent8e3t+fn1/gXx9fHx9f4B+gIaEhYWEh4SDg4KGgoOAgYB+fn+AfX9/gXx9f39+fn+BgYKEg4KBgYKCf4CBgoCAgoWEgoB/gIGCgYOFhYeFhISGhoOFg4WBgoGBgoGCg4GChISEhYWGh4eGhYSDg4ODhIaFhIGDgoOChIODgH+AgX59fX5+fH6Dfnx+fHyBgH6Cf35/gnx/f319fHx8e3t6enp6eXt6enp5eXp6e3x5e317fH5/f4GAfX59fX1/gICAhoSEhYSFgoSCgoSCgoCBgH59fn9+fn6AfX2Af35+foGBgoODgoSHgYF+gICBf3+ChIOBf35/gIJ/goWEhYOCg4WFgoSBg4CBgIGBgYKBgIGEg4OGhYWHh4WEhIWCgoKDhYSCgYGBgYCFg4F/foB/fnx9fn18foN9e358fYF/gIN9fYCBf35/fXx8fH17e3p6enl5e3l6enl6ent7e3p7fXx8f3+BgoB+gH+AgH+AgYDKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzNzc3Nzc3Nzc3NzczMzMvLy8vLy8vLy8vLy8vLzMvLy8vLy8vLy8vLy8vMzMzMzM3Nzc7Oz8/Pz9DQ0NHR0dLS0tLS0tLT09PT0tLS0tLS0tPT09TU1NTU09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tLS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1dXV1NTU1NTT09PT09PT09PT09TU09PU1NTU1NTU1NTU09PT09PS0tLS0tPT09TU1NTU1NPT09LS0tLS0tLR0dHR0dPHhnNlYFtLWWdVTUZIQD03Nzg5Nzw8PDo8Oz42Oj04PDs6OTg3ODs7Oj87PTs8PD47P0E/QkJBQ0RFREE+PTw7QENDQUBDQ0FBR0hHSUtSwtXS09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXVysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMy8vLy8vLy8vLy8vLzMzMy8vLy8vLy8vLy8vLzMzMzc3Nzc3Oz8/P0NDQ0NHR0tLS0tLS09PT09PT09PT09PS09PT09TU1NTU1NTU09PT09PT09PT09PT09PT1NTU1NTU1NTT09PT09LS0tLS0tLT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1NTU1NPT09PT09PT09PU1NPT09TU1NTU1NTU1NPT09PS0tLS0tPT09PU1NTU1NTU09PT09PS0tLS0tLR0dHSzIxyZ2BcTVllUktHSz87Mzc4Ozg5Pj05PDpBOjs9Nzs8PDo6Nzg6Oz0/Oz88PTw/Pj9BPUFBPkNDREJAQT46Oz9DREFDRERCQklHSEhJTr7V0tPT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1crKy8vKysrKysrKy8vLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzMzMzMzMy8vLy8vMzMzMzMzMzMzLy8zMzMzLy8vLzMzMzc3Nzc3Ozs/P0NDQ0NDR0dLS0tLS09PT09PT09PU09PT09PT09TU1NXV1dTU1NTT09PU1NPT09PT09PT1NTU1NTU1NTU1NPT09PS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1tbV1dXV1dTU1NTT09PT09PT09PU1NTU09TU1NTU1NTU1NTT09PT0tLS0tLT09PU1NTU1NTU1NTU09PT09PT0tLS0tHR0s+Sd2hfXk9XZ01LRks9ODc2NTk5OTw+OT88RDo7PDc5PD07OTc5Ojw9QDs+PT47PD48PT5BQD5EQ0NDP0E9Ojs9QkNFQ0NEQT9FSEpJSky61dPT09TU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8rKysvLy8vLy8vLy8zLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMzMzMzMzMzMzMzMzMzczMzMzMzMzMzMzMzMzMzc3Nzc3Ozs/Pz9DQ0NDQ0dHS0tPT09PT09PT09TU1NTU09TU1NTU1NTV1dXU1NTU1NPU1NTU09PT09TU1NTU1dTU1NTV1dTU09PT09LS0tLS0tLS09PT09TU1dXV1dbW1dXV1dXV1tbW1tXV1dXV1NTU1NTT09PT09PT1NTU1NTU1NTU1NTU1NTU09PT09LS0tLT09PU1NTU1dXV1dTU1NTT09PT09PT0tLS0dHRmn5nYWJOVWpKSElLPzw6OTM3Njc3PTs+OT06Ojo4ODo7Ozg4Ojs7PD46PT09Ojw/PD0/QkA/Q0RDRD5APT08QENEQ0JEQkQ+REhJSUtMttfT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3MzMzMzMzMzMzMzMzNzc3NzczMzMzMzMzMzMzMzc3Nzc3Ozs7Pz8/Q0NDQ0NHS0tLT09PT09PT1NTU1NTU1NTU1NTU1NTV1dXV1NTU1NPT1NTU1NTU1NTU1NTU1dXV1NXV1dXV1NTU09PT09PS0tLT09PT09PU1NXV1dbW1tXV1dbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1NTU1NTU1NXU1NTU1NTT09PT09PT09PU1NTU1dXV1dXV1dTU1NTU09PT09PS0tLR0p+DaV9kU1hsSEhIS0A9Nzg0NzY6Oj87RDw8OTw8OTg6OTo6Ojs8Ojo7OT49Pjk9QDs/QUFCP0JCQUM9Pz8+PEBCRUNDQkBBO0ZJR01MSbLY09TU1NTU1NXV1dXV1dXV1dXW1tbW1tbV1dXW1svLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzM3Nzc3Nzc3Nzc3Ozc3NzczMzMzMzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc3Mzc3Nzs7Ozs7Pz8/P0NDQ0NHS0tLS09PT09PT09TU1NTU1NTU1NTU1NTV1NXV1dTU1NTU1NTU1NTU1NTV1NTU1dXV1dXV1dXV1dTU1NTU1NPT09PT09PT09PU1NXV1dbW1tbW1tbW1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTV1NTU1NXV1dXU1NTU1NTT09PT09PT1NTU1dXV1dXV1dXU1NTU1NTT09PT09LS0tSjiGxfZlJWakdIR0lBPjM2Njo7PDhDPEJBPjxBPDg5Ojw6Ojw8PDk8PTo7PD09PD89QD9AQT9AQUBCPD4+PzxCQ0NDRkBBQT1ISklOTUeu2NPU1NTV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbMzMvLy8rKysvLy8vLy8vLy8vMzMzNzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzs7Ozs7Oz8/P0NDQ0NHR0dLS0tPT09PT09TU1NTU1NTU1NTU1NTU1NTV1dXV1dTU1NTU1NTU1NTU1dXV1dXV1dXU1dTU1NXU1NTU1NTU09PT09TU1NTU1NXV1dbW1tbW1tbW1tbW1tbX19bW1tXV1dXV1dXV1dXV1dTU1NTU1dXV1dXV1dXU1NTU1NTU09PT09PT1NTU1NXV1dXV1dXV1dXV1NTU1NPT09PT0tLWroprY2VSWGhMSkdJQjg0OTQ6Ozo5QDk+Q0U/PDw5OTk9Oj07PDw6PTw7OTw9Ozs/PUA9PT5AQD9CQT5APD05QERDQkFBQj48SEpLTU5IqNnU1NXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbWzMzQ0dDQ0NDQ0dHR0dHR0c3Ky8vLzMzMzMzMzMzMzM3Nzc3Nzc7Ozs3Nzc3Nzc/Pz8/Pz8/Pz8/Pz9DQ0dHR0dHR0dHR0dHS0tHV2djY2NnZ2dra2tvb29vZ2dnZ2dna2tra2tra2tjW19fX19fX19jX19fX19vb29vb29vb29vb29vb3Nzc29zb29vb3Nvb29vb2tra2tra2tra2trb3NzX1dXV1dXV1dXV1dXW1tbX1tbW1tbV1dXV1dXV1dXV1dTU1dXV1dXV1dXU1NTU1NTU1NTU09PU1NTU1NXV1dXW1dXV1dXV1dTU1NTT09PT09PS1bqKa2hoUlhlSUlMT0A5OTo0O0E8Nz05QUM+QD89ODo6Ozk9Oz4/Ojs8PDo7PDo7Pj1APT8/P0FAQUE/QTw8Oz5BRENBREA9PElJSk1ORqPa09TV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbW1szNloSGhoaGhoeHh4eHh4Ky4t3d3t7e3t7e3t7e3t3S0NDQ0NDQ0NDQ0NDQ0ci5ubm5ubm5ubm5ubq6t6WkpKSkpKSkpKSkpKSnhmBjY2NjY2NjY2NkZGRlhIuKioqKioqKioqKioemuri4uLi4uLi4uLi4ubSPjIyMjIyMjIyMjIyMjYiBgoGBgYGBgYGBgYGBg4uKioqKioqKioqKiouHvebh4uLi4uLi4uLj4+Pi2NfX1tbW1tbW1tbV1dXV1dXV1dXV1dbW1dXV1dXV1dTU1NTU1NTU1NTV1dXV1dXW1dXV1dXV1dXV1NTU1NTT09PT09XDkXFrak5TYkxMVk48Ojo3Nz5DPjg+Oj8/QT0/QDc7Ojs7PTs+Pjo7PD48Oz07PT8+QDw/Pz1AQEBBPj88PjxAQUVCQkZAQD9HSEpLT0ae2tXV1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19fMzm5QU1NTU1NUVFRUVFNMoPPr6+rq6urq6urq6uvp1dLS0tLS0tLS0tLS0tTEqaqqqqqqqqqqqqqqq6aGhIWFhYWFhYWFhYWFik4MEhISEhISEhISEhIRE0pUU1NTU1NTU1NTU1NPg6ejo6Ojo6Ojo6Ojo6ScWlVWVlZWVlZWVlZWVldOQ0NDQ0NERENDQ0REQ0ZTU1NTU1NTU1NTU1NTS6ry6+vr6+vr6+vr6+vr6dnX19fX1tbW1tbW1tbW1dXV1dXV1dbW1tbV1dXV1dXV1dXV1dTU1NTV1dXV1dXW1tXV1dXV1dXV1dXU1NTU1NTU1NPUy5h2bGlKTl9NUlVNPjw8Nzs/Qz42Ojc+Pjs9Qj85PDk9Ozw6PD07PTs9Ozs9PD0+PT07QT08QUBBQT08Pzw7QEJDQURFPUFAQ0ZLS09GmNzV1dXV1dbW1tbW1tbW1tbW1tfX19fX19fX19fXzM5xVFhXV1dYWFhYWFhXUKHx6enp6enp6enq6unq6dXS0tLS0tLS0tLS0tLUxaqrq6urq6urq6urq6yoiIeHh4eHh4eHh4eHh41SEhgYGBgYGBgYGBgYFxpOWVdXV1dXV1dXV1dXU4WopKSkpKSkpKSkpKSlnl9ZWlpaWlpaWlpaWlpbU0hISEhISEhISEhISEdKV1dXV1dXV1dXV1dXV0+r8erq6urq6urq6urq6unZ19jX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dXV1dXV1dXU1NTU1NTU1NGcenFpSlRdT1JVTkQ+Pzs/QEA4Ojs4PDs7PD86Ozs4Ozk5Ozw7Ojw5Ozs8Ozo9PT0+PUE/Pj8/Pj08PT88PEFBQ0FERTw+QEVGSktNRpPc1dXV1tbW1tbW1tbW1tbW1tfX19fX19fX19fX183OeF5hYGBgYGFhYWFgYFqk7ufn5+fn5+fn5+fn5+bV0dLS0tLS0tLS0tLS08Wtrq6urq6urq6urq6vq46NjY2NjY2NjY2NjY2SXSInJycnJycoKCgoKCcpWmNiYWJhYmJiYmJiYl6MrKmpqampqampqampqqNoZGVlZWVlZWVlZGRlZV1TVFRUVFRVVFRUVFVUVmBiYmJiYmJiYmJiYmJbr+/p6enp6enp6enp6enn2djY2NjY19fX19fX19fX19fX19bW1tfX19fW1tbW1tbV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbV1dXV1dXU1NTU1NTWo3txZElbYE5OVU9AQT89REI+Oz06OTs6PT07PDs6OTg5OTs8Ozw8Ojo7PDo7QD08PTxAQTxBQTs7PEA/PD1CP0RDQ0U8PkJERkpMTEWN3NXV1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjNzcfFxcXFxcXFxcXFxcXEy9DPz8/Pz8/Pz9DQ0NDQz87Ozs7Ozs/Ozs/Oz87NzMzMzMzMzMzMzMzMzMvJycrKysrKysrKysrKysfCw8PExMTExcXFxsbGxsvMy8zLzMzNzMzMzMzLz9HR0tLS0tLS0tLS0tLRzczMzMzMzMzMzMzMzMzMy8vLy8vLy8vLysvMy8vNzc3Nzc3Nzc3Nzc3NzdTY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NfX19fX19fX1tfX19fX19bW1tbW1tbW1tXV1dXV1dXV1dbV1dbW1tbW1tbW1tXV1dXV1dTU1NTU169/cF5GXmJQUVdOR0ZDQ0lBPz07PDo8OEBCPD04Ojo4OTg7Pzs8PDs7PDw8PD87PD46Pj44PkI8Pj1BPjw+QkBERUNAPD5APkNJSUtEh9zV1tbW1tbW1tbW1tbX19fX19fX19jY2NjY2NjYzs3Pz8/Pz8/Pz8/Pz9PPz87MzczP09LSzs3P0s7Ozs7Ozs7Q1NLPz87S1M/OztPTz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0NDR0dHR0dHS09PU1NTU1dXV1tbW1tfW1tbX1tfX19fX19fX19bW1tbW1tbW1tbW1tbW1tfX1tfX19fX1tbW1tbW1tfX19fX19fX19fX2NjX2NjY2NjZ2dnZ2dnZ2dnY19jY2NjY2NjY2NnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjX19fX19jY19fX1tbW1tbW1tbW1tbW1tbW1dbW1dbW1tbW1tbW1tbW1tXV1dXV1NTV1di4gm9XSl9jUlFaS0hBQTxCPT07Oj4+PD4/PT0/Nzk6OTk3OD48PD47Ozw7PDs/PT0+OTs7OT0+P0A+QD07OkI/QkNCPz0+QD5CRUdKQoDc1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2M7Ozs7Ozs7Nzc3Nzsqfys3Nzc3QuYOEi8fTwJrLz87Ozs7Pypal0c/SqKDQz9GkodDOzs7Ozs7Ozs7Ozs7Oz8/Pz8/P0NDQ0NDQ0NDR0dHR0tLT09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbV1dXV1dbW1tbV1dXV1dXV1NTU1NXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NfX19fX1tbW1tbW1tbW1tbW1tXV1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXYwIBuVU9gY1dZW0xMQ0A9PTs9Ojw+Qj5CQ0A8Ojg5ODo6Ojc7Pz4/PDw7PDo5Pzw8PTg5PD9BPj09PUFAPTtBQkBCQz47QD9BQUlHSkF629bW1tbW1tbX19fX19fX19jY2NjY2NnZ2djY2dnOzs7Ozs7Ozs7OzdKpj63Rzs7Ozpu3tqSiwJOerNPOzs7Pz5yqnazWsp6jp9avn6Gp0s7Ozs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0dHS0tLT09TU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dbW1tbW1tXV1dXV1dXU1dXV1dXV1dXW1tbW1tbW1tbW1tfX19fX19jX19fY2NjY2NjY2djY2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2dnY2NjZ2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV18h/b1pTYWVeXVxPSkQ9QD8+Ozc6Pjk/RD9BOTg3ODk7Ozw4OT89PTw9PD47OkE7OTs5OzxDQDw7PT5AQT49QkQ/QkM9PT8+Pz5ISUg/ddrW1tbX19fX19fX19fX2NjY2NjZ2dnZ2dnZ2dnZzs7Ozs7Ozs7Ozs/Inrym0tDQzsqgl36Cw6abr6fUz8/P0MuUiJqdyJ6ak53AnpiVnMjQzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dLS0tPT09TU1dXV1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tbV1dXV1dXW1tbV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2djY2NjY2NnZ2dnZ2dnY2NjY2NfX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dbV1dXV1dfNiHNdWGloXl9gT0lGOkFAPj88PDo2P0JAQjo2NDc6Ozo8Ojk+PD49PTs/PTxBPjw8Ojw8PTw6PEA9QEI+PkFCPUNDPT0+Oz9BRUtIQHDZ1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2c/Pz8/Pz87Ozs7SrKWnqdXAvNLHnY+ey9PJipmq1M/Pz8/RvciZm6yaoZy0mJyinbCy08/Pz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0dHS0tLS09PT1NTU1dXV1dXV1dbW1tbW1dbW1tbW1tbV1tbW1tbW1tbW1dXV1dXV1dXW1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnY2NjY19fX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0JB1W1tqaWFeXVNOSTxDQEE+QD46OEZBP0M6NzQ5Ojo5Ozs4Oz0/Pj49QT08P0A9Pjw8PDw8Oj1AQD8/PT5CQD9AQkA8QD0+QUVLRz9r19fX19fX19fX2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnPz8/Pz8/Pz8/QzJ2Nl6zQmpfKxZ6ynpbN1q2ZqtTPz8/Pz9KXlKKtmpatuYaelq+zqtXQ0M/Pz8/Pz8/Pz8/Pz8/P0NDQ0dHS0tLT09PT1NTU1NXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX19fX19fY19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tKUcl5ea2tqZV1PTEc/RENDQDo9OzxCPD49OTY0Ojk5Ojo5Nzs/QDs8PUA8PEE+PD07PTw/PDo8Q0A+PTs9QD5CPkBBPkA9QD9GSUQ/ZtXX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2traz8/Pz8/Pz8/P07GigJuvyaCjv8qcpYynrdiqmarUz8/Pz9Ozm8SdrZiBoJZ4m4Sdk6TV0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1NXV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dbW1tXW1tbW1tbV1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbSk3BgXnBoZmVaUUhHQkVDQEA3Ojo8Pjo8OTc2NTk6Njo8Ozc8QEA8Ojo9Ojw/Pj08OUA8PDo6OT9APj08PUBBQz9APz5BOz9ARkpCP2LS2NfX2NjY2NjY2NjY2dnZ2dnZ2tra29vb29vb28/Pz8/Pz8/P0M6fkGyclteqo9PSrqa1mJ/Vqpmq1M/Q0NDRzo2Qo5ydqIiceZ+phZmk1dHR0NDQ0dHQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1dXV1dbW1tbX19bW1tbW1tbW1tbX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfW1tfX19jY2NfX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX1tbW1tbW1tbW1tbW1tbX19fX19fW1tbW1tbX0pNuYFxxZGdkWlVKQENGQ0FCODs/PD07PDw4NTU4OTY4Ozo5PDo+Pzw9PTk8Pz49Ojo+OTw6Ojg+Pzw9PTw+QEFDQT48PDpCRERKRkJd0NnX19jY2NjY2NjY2dnZ2dna2trb29vb29vb29vPz8/Pz8/Pz9G9n8O31pfA09HQ0srSzZeb1KqZq9XRz9DQ0cvaqJyRua+mnIq9raaYr9bR0dHR0dHR0dHR0NDR0dHR0dHR0tLT09PU1NTV1dXV1tbW1tfX19fX19bW1tbW1tfX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19fY2NjY2NjY2NjY2NjY2djZ2dnZ2dnZ2dnZ2dnZ2drZ2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fX19fX19fW1tfX1tbX19fX19fX19fX19bW19GRbF1cb2doYl1PRkBISUdFQDw8Pj48PT48NzU2Ojk2OTs6Ojs4QD86PDw5PD49Ozs6Pzk/Ojs5PT49Pjw7PTxAQ0I/Pz47Q0ZGR0hEWc3a2NjY2NjZ2dnZ2dnZ2dna2trb29vb29vb29vb0NDQz8/Pz8/Pz5V+e6WS1KKa08ySl6ObodirmavV0pem1cmOpZqgpaaXl52lp5aYm7vV0dHR0dHR0dHR0dHR0dHR0tLS0tLS09PU1NTV1dXV1tbW19fX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tbX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2tnZ2dnZ2dnZ2djY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX1tfPjGRWXnBrXGBgTkVITUlJT0M+OkI9PUBCOzU1Nzw6Nzo7Ojo7OT09OTo6OT0+Pz07OT47PDo8Ozk+PD47PD0+QENCPz5BPEFDR0ZGRVXJ29jY2NnZ2dnZ2dnZ2dra2tvb29vb29zc3Nzc3NDQ0NDQ0M/Pz9DR1aeZrcmjqL7KnbGdo7XZqZup2Lirocq7oaannM2gq6Sb0J+rpJzR09LS0tLS0tLS0tLR0dHS0tLT0tPT09PU1NTV1dbW1tbX19fX19fX19fX19fX19fX19fX19bW1tbW1tfX19fX19fW1tbW1tbW1tbX19fW1tbW1tbW1tbX19fX2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2djY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fX19fX19fX19fY2NfX19fX19fYzYZdV2JvZE9dVEtIRlNRS0xAPj1EPD9DRj01NTc7OTY6Ozo8PTo7Pzo6OTg6PT0/Pjs/Oz49Ojs5Pjs9PD0+QURCQD8+PzxAQUVHRURSxdvY2dnZ2dnZ2dnZ2tra2tvb29vb3Nzc3Nzc3NzQ0NDQ0NDQ0NDQ0NO5gL3Tm5bP1LWLkZ/T1LyBu9TOlKDT056QjbbXxZCNt9fCj4281dLS0tLS0tLS0tLS0tLS0tLT09PT09PU1NXV1dbW1tfX19fX19fY2NjY19fX19fX19fX19fX19fW1tbX19fX19fW1tbW1tbW1tbW19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2tnZ2tra2tra2tra29ra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2NfX2ct+WlVqaltMX01KTEpVTEZCPD0/R0ZHS0g9NjU3Ojk3OTo7Ojw9OT45OTo4Oz0+PkE+PTk8PDo9Pj46PTk5Oj9FQUA+PT8/QkBHRURFUMHc2dnZ2dnZ2dna2trb29vb29vb3Nzc3Nzc3dzc0NDQ0NDQ0NDQ0NDQ0cHR0crI0tDUxLjS0tHSwtLQ08fM0tHSusTV0dTHw9XR1cXE1dLS0tLS09PT09PT09LS0tPT09PU1NTU1NXV1dbW1tfX19fX19fX2NjY2NjX19fX2NfX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29va2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2djY2NjX19fX19fY2NjY2NjY2NjY2NjY19rHd1xSZ2laTlpOTFBRV0VKPz89P0FFTExBPjc3NTs4ODk5Ojs8Pjw+ODo6OTs+P0A9Pj46NTo6Oz0/Ojs5Ojw+QkJAPz8/P0FCR0RDRE683dnZ2dnZ2dna2tvb29vb29vb3Nzc3Nzc3d3d3dDR0dDQ0NDQ0NDQ0NDS0NDR0dDQ0dPU0dHR0dPR0dHS0tHR0tXU0tLS1NXT09PU1NLS0tPT09PT09PT09PT09PT09PU1NTU1dXV1dbW1tfX19fX2NjY2NjY2NjY2NfX19jY19fX19fX19fX19fX19fX19fX1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tvb2tra2tra2trZ2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2trZ2tra29ra2trZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjbwXNYVWlrU0xSTlBSWVRGSTw+Qz9BQkVKPj43ODY5Njc4OTk7Oz0/QDw9ODk7Ozs/Pjw8OTU6PT47OTk7PD8/P0JCQT1BPUBBQkZCQkJLtd7Z2dra2tra2tvb29vb29vc3Nzc3Nzd3d3d3d3R0dHR0dHR0dHR0dDQ0NDQ0NDQ0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tPT09PT09PT09PT09PT09TU1NPT1NTU1NTU1NXV1dXV1dXW1tbX19fX2NjY2NjY2NjY2NjY19fY2NjX19fX19fX19fX19fX19fX19fX19fW1tbX19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2NjY2NjY3LxvVFRsbExLUkpUUlVLRkQ6PkdEREFERjw/ODk6OTY5OTo3PD07PkA9PTc5Ojs5Pjs5OTY2Oj1AQT47PDk6Pj9DQT4/Qj0+QkNFQkFCSrDe2dra2tvb29vb29vb29vc3Nzc3Nzd3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0tLS0tLS0tLS0tLS0tLS0tPT09PT09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1tbW1tbW19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19fW1tbW1tfW19fX19jY2NjY2NjZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2dnZ2dnY2Ny2a1NbcGtLVVdSXFFXSEQ+PEJKRT1ISj89PDc4ODo1OTg5Njs+PD1APDw1OTk8Oj87OTk0ODw9PUFBPD47Ojw+QD89PkE9PUNGR0I/Qkmq39ra29vb29vb29vb3Nzc3Nzc3N3d3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHS0M/U0M7P0tLT0tLS0tLS0tLS0tPT09TU1NTU1NTU1NTU1NTU1NTU1NTU1NTV1dXV1dXV1dbW1tbW19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19jY2NfX19fX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dndsGRTYXJfT1pUV19RUkdCPUVJTEFBTEQ/Pzs5ODg5Mzg2ODY5Pj0+Pz06Njo7Pjs9PTo5Njg6PTtAQDxAPz0/P0I+PD48PEJFSElCPkNJpODa29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3t7S0tLS0tLS0tLS0dHR0dHR0dPT0bm7zLqbnLrQyNPT0tLS09PT09PT09PU1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2NjZ2dra2tra2tra2tra2tra2tra2tra2tra29va2tra29va2tvb2tra2tra2tra2tra2trb29vb29va2tra2tra2tra2tra2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ3qpfVWBuW1VZUVpeT0xHQ0ZNSUZEREo7QUE7PDg4NjQ4Njk4Nzw/QT89Ojc8Pz48Pz87OjY4OD09QEE9QD5BQD1AOjs6Pj1BRUdKQkBDR57h29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e0tLS0tLS0tLS0tLS0tLS0tO+wMqaoKKViJGeqpOpz9TT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fY2NjY2NnZ2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dna2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2tvb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2d6iXFVeblheXU5aUFROQ0NMSUlJRkpDPEJBPDs4NzY3OTc3OTk9P0E/PDo5QD88PkI/Ojg3NzY9Pz9APUBBPz88PTs7OD48P0VJSEE/Q0aX4dvb29zc3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3tPT09PT0tLS0tLS0tLS0tTIlZyum5m1iX2TjIKBhMTV09PT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tvb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dndmlpYYW5ZYVdPV01QRUJETElNS0ZJRT5CRDk4ODY3OTc1Njk4PT1BPjo4OT4+PD9APzw1Njc2PD4/PjtAQEA/Pj4/Pjs/PkFCRkdCQENIkeLb29zc3Nzc3d3d3d3d3d3d3d7e3t7e3t7f39/U09PT09PT09PT09LS0tLTz6h+kayPko6MhoCIiYSQo8rU09PT09PU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY19jY2NjY2NjY2NjY2NjX19fX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2tra29vb29ra2tra2tra2tna3JJaWWNuWlpSVV5QTDxAR05IUklIRT47SEY4OTc1Nzg3NTg5ODs+Pj07ODlBPj1AP0E+NzU5Njs+QUI/P0BAQUI/Pj8+QUBEQUZIQj9FSozi3Nzc3Nzc3d3d3d3d3d3e3t7e3t7f39/f39/f1NTU09PT09PT09PT09PWtaWaiIuQhYCFi4iBg4qLf4bC1tTU1NTU1NTV1dXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2dnZ2dna2dra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29ra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb2tra29uIWltnalxYTFpfVkg6TEhMSkpDRUVDQExINzo3Njc4ODU4Nzg5PDw7Ozk4QD89Pj8/PDY3PDQ3P0JCQUBAPz8/QT09P0A+QEBGRT09REuI4tzc3Nzd3d3d3d7e3t7e3t7e3t/f39/f39/f39TU1NTU1NPT09PT09PUxZKCg4WGfYGCfXx5foGCg36k29bU1NTU1NTV1dXV1dXV1tbV1tbW1tbW1tfX19fX19fX19fX19fX19jY2NjY2NjZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vc3Nzc3Nvb29vb29vb29vb29vb2tra2tra29vb29zb29zb29vb29vb29vb29vb29vb29va2tvb29vb29vb29vb29vb29vb2tvZgFpebWhaU0ldW1hKRE1ISlNMR0ZBQD9KQjg7NjY5OTc1ODY4Ozo7Ojw5OD09O0A9Ozo2NTw3Oz1CQEFBPD49QEE9PEA/Pz5CREU+PERLg+Lc3d3d3d3d3t7e3t7e3t7f39/f39/f39/f39/V1dTU1NTU1NPT09PT2LKEkKh9g3l2hIh/e3d5gn5+i67A1dTU1NXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dna2trZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2tra2tra2trb2tra2tvb29vb29vb29vc3Nzc3Nzc29vb29vb29vb29vb29va2trb29vb29zc3Nzc3Nvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc1nlcWmxmWFJPYFFSQUhHSkZYTEZAQENDSz87Ozc4ODc2NTc2ODo5PDw6PTs/PTs9Pjw7ODg8OT0/QkFCQzw8P0FCPj1BQkNCREVDQDtDTH3h3d3d3d3e3t7e3t7e39/f39/f39/f39/g4ODg1dXV1NXU1NTU1NPU0ruen3WKeXuIgICChYGDcnOAhYOMrNfV1NXV1dXW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NnZ2dna2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra29vb29ra2trb3Nzc3Nzc29zc3Nzc3Nzc3Nzb29vb29vb29vb29rb29vb29vb29zc3Nzc3Nzc3Nvb29zc3Nzc3Nvb29vb29vb29vb29vc3Nzc3Nzc3Nvb29vb3dByXV9wZVdLUGNPS0JHQ0pIS0ZBPEE9SFBBOjo3Nzg3Njc4Nzw6OD09PD47QD88Pz07Ojs5Ojk8QEJAQkNAPUFAPz1AQkNDQUBAP0A7RU144N3d3d7e3t/f39/f39/f39/f3+Dg4ODg4ODg4NXV1dXV1dXV1NXU18h4i4V8goh6g4SBfoKCc2l0hYuGkJ3U1tXU1dbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tvb2tvb3Nzc3Nzc3Nvc3Nzc3Nzc3Nzc29zb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb297KalxjcWVST1heSz9HTElPS0VAPkFCP0lPPjk6NzY7NzY6Ozc7Ojg6PDw+Oz09Oz48Ojs4OTo4OUFCQkFAQDtAQj06PkFCQz8+PT4/PUZOdN/e3t7e3t7f39/f39/f4ODg4ODg4ODg4ODg4OHV1dXV1dXV1dXV1s6dhpl+f5OTin+CgXx9gnNxm4mAgoOJwNnat7TQ19bW1tbX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tra2tra2tra2tra29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NvfwGNaW21gVlBTU0pETEhNSEk8PkFEQ0ZORDw8OTc5OjY4Ozk3PDk4OTw9OzlAPjpBPzw3NTc7ODpAQUVBPz45PUI/Oz1CQkI6Pj07PT5GTnHe3t7e3t/f39/f39/g4ODg4ODg4ODg4OHh4eHh1tbW1tbW1tbV1tjLioCHhYOXjHh7e3lvfYF1a3ebdHZ7eInHxpiMrdjZ19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2drZ2dna2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tra29vb3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29zb29vb3Nzc3Nzc3Nzd3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3Nzc3Nzc4LdjV1lrYlJNVVFMSktGS0ZDQD5CQT9FTT4+PTg5OTo3OTo3NT03Nzo+PDs7Qjw5Pz05NjY4PTk6QEJGQD49PEBCREA9QD9DO0A9PD4/Rk9t3N/e3t/f3+Dg4ODg4ODg4ODg4OHh4eHh4eHh4dbW1tbW1tbW1tfVrYZ6d32rn3l4entzdH+Dfm9xe3l6c3t2k4qFgImkzdnY19fX2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tna2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29vb29vc3Nzc3N3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vc3Nzb3Nzc3Nzc3N3d3d3d3d3d3dzc3Nzc3Nzd3d3c3Nzc3Nzc3N3d3d3d3d3d3d3d3dzc3OGtYVtebGJSTVZMTUdLS0RGQkI7QT08RUxDQT44Ojk6Nzc5NjY6NTs+QDs9Oz89PD89Ojk5Ojw5PEVDRkA/PkBDQkQ9OT0/QT1CPz1APkdPadvf3t/f3+Dg4ODg4ODh4eHh4eHh4eHh4eHi4uLW1tbW1tbW1tfQmH+Qh4N9eoN2e3Vzenl6kKqmd3JyfoeHh4CAfoKEhJHJzNnX19jY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra29va2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2djY2NnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vb3Nzc3N3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzb29vb3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3dzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3NzhpV9UYm1iUE9TSUhHRkpJSUJBPkJCPEVFREA+ODo4Ozc3Ojc4ODY+Pz07PDk9PDo+PTs6Njc7NjpEQUY+Pz8/PkNBPzs9PT47REM/PjxIT2fZ4N/f3+Dg4ODg4eHh4eHh4eHh4eLi4uLi4uLi1tbW1tbW19jYyH52doN+fnR2eIaCenl1d5yhu6GEgoCAfoeKinx/gYaMnKjO2NjY2NjY2NjY2djY2NjZ2djY2NjY2dnZ2dra2tra2trb29rb29rb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3d3d3d3c35pbT2drXFBRUElDT0pLR0xHSkJAP0FHREBBPDg8ODg1ODk3Njc3QEA/Ozw5Pj04PTw8Ojc4PTk/RENGPkE/QkBDPzw6Pj0/PkVEPz07S1Fj1+Hf4ODg4ODh4eHh4eHh4uLi4uLi4uLi4uLj49bW1tbW19XB3LRueHJze3B6eXaFiIR7eH2AgZiljH98fnuRhZaLhoGDgY6Rvd3Z2NjY2NjZ2dnZ2dnZ2dnZ2dnY2dnZ2dna2tra2trb29va2tva2tra2trb29ra2tra2tnZ2dnZ2dnZ2dnZ2dna2trZ2dnZ2dra2tra2tnZ2dnZ2dna2tra2tra2tra2tra2tra2trb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t3d3d6NWFdobllQUUtISlNJTUhNSUtBQz9DRkJBRDo6PDg2NDg4NzY2Nj8+Pjo8OTw7Oj09PDw4Ozw8RERERT4/PkI+Qj84PT8/Q0NCQEE+O0xUY9Xh3+Dg4OHh4eHh4eLi4uLi4uLi4uLi4uPj4+PW1tbW1teslLZ6eHJvd5V7dHuLgHh1bn6Fg3t/hYhyfH2bnI6JioJ+g32Hk5rH1NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2trb29vb29vb29vb2tra2tra2tra2tra2tnZ2dnZ2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2trb2tra2tra2tra2trb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d7Zf1lgaGxcUUtHR09LTk5PTURGQkg/Q0hEREA6Ozs4NzU3Nzc4NThAPkA7PDk8Ozw+Ojk7OTk7OUZERUI8QD4/PEBDOz5AP0A/Qj8+OjtKVWPV4eDg4eHh4eHi4uLi4uLi4uLi4uPj4+Pj4+Pj1tbX19vKhYR3cXJubniVhHt4hH95dnB4c3eLkY6CdnN9ioaId3d1d4ODfIiIk8Pb2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2trb2tvb29vb29vb29vb29rb2tra2tra2tra2tra2tnZ2dnZ2dna2tra2tra2tra2trb2tra2tra2tra2tra2trb29vb29ra2trb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f0nVZaGlqVk5KSE1OR01EUElGSD9FPUZMREM+Ozs8OTc3OTY2OTU4Pj4/PTs8QDs9PDo3Ozc5OThHREVCPUE9Qj8+QDw/QUE/QEJAPjs8S1Ri1OLg4eHh4eLi4uLi4uLi4+Pj4+Pj4+Pj4+Pj49fX19fEknuJf29sbnV2foSBg4qGfnVybWVtiIaKjoR7c4OHint4e4OPj4GEioqxztrZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29zc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tvb2tvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3dzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f3t7e4clsW2pqalNOR0hOT0VIRk1JSUA7RD5ISUA9PDo6Ojg2ODo3Nzk0OD08PT07ODw8PDw4Njc4OTo6RUJFQT9APEI/Q0M+PkNEQUBAP0A8PUtRYdPj4OHh4uLi4uLi4uPj4+Pj4+Pj4+Pj4+Pj5OTX19fZqXaFfnx3bHB3eXh8jH2KhYB3anN0d3p9bot7fnl6foR/gIGDfnh8foeGlrbT2tnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra29ra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/e3uO9amFpa2lRTkZNTEtKWE1OR0FAQE9BQz9AOzw4OTk5Njg2NjY4NDs+PD07OTY6Ojk6OTU4OTg5OkJERj8+Pj5AQEBCPzxBQD88Pj9BOT5KT17S4+Hh4eLi4uLi4+Pj4+Pj4+Pj4+Pj4+Tk5OTk19fX2sqKhIB5c29tcXN1d4CUeHaAfHWHhXd1cnWgmXp7d3Z5doR0bWxue3iAmouTu9za2tra2tra2trb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc29vb29vb2tra2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f397js2lpbmloUFBPTExPUk9LU0Y/RURERD48PDg7ODc5OTU2ODY2NzM6Pjs+PTc6Pjk5OTk2Ojo4NzxDRUc/Pzs/PkA9PkE9Oz0+OUFAQDhBTlFc0OTh4eLi4uLj4+Pj4+Pj4+Pj4+Pk5OTk5OTk5NjY2NjauY6AenZ1bmpveHCBfWt0cnZ3hIV5h4d5lY55eXp1d3pza298gHx2fYh8gLLe2tra2tvb29vb29vb29vc3Nzc3Nzc3Nzc3dzc3Nzc3Nzc3Nzb29vb29rb29vb29ra2tra2tra2tra29va29vb29vb29vb29zc3Nzb29vb29vb29vb29vc3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3t7e3t7e3d7e3t3d3t7e3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/f39/f4qpqa2hrZFNQT0ZQVFJOSFJLPkREQ0I7Ozk6Ojg2Nzg1NjY4ODg0Oz88Pzw5PDw3Ozo6Nzo6Nzo9Q0JDPUE+Pzw5PT5BQDs8PDtFQD47Q05TXNDk4eLi4uLj4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTY2NjZ1p5vdntveHh2cG50d3BwdHBzb36Jc3qGhY2EenNtcoB6hn1vg5OBdnx9g4a13drb29vc29vc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29ra2tra2tvb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4N/f3+KgbWhma2ZVVlJHUFFOS0xMRUJIRUc9OD08Ojo3Nzg2Nzc2NTY3NDg+PD09Ojg6OD46Ozc4Nzc6Oj5DRDtDQj49OD1AQUM/Pjw+RTw+PUJNUF/S4+Hi4uLj4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk2NjY3MB2doCCfnp4eHBsdXlya399bHNvdGdoaYB/aWl4c2d+iYl4cIKGe3d9foWKvd3b3Nzc3Nzc3Nzc3Nzc3Nzc3d3c3Nzc3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODflGttZm5mU1NJUFlUTEhGTkZGRUJGPTs+PDs5Nzc4NTc5NjQ1NzU4PDs9Pjo6OztAOTs7ODc6OTlAQkE8QUE/Pzk/QEJFQ0FAQEM7Oz1ES01g1uTi4uLi4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk5NnZ2tmYc3uqhJaCcnR1dn14aGx8d2h4d25rcHR5gIJ3dHyBhIJ9c3CAin94gn95g8je3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f4N/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh24tubWdzY1lRTVVbV0hDSUZOS0dCRD8/Qjo7OjY2NzU2NzY0ODc2Ozw7Pj86PDk8Qjg3OTo6Ojk6QUFCQUJDQEE+PT9CQ0NEQUJGOTg9REpOYtjk4uLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXZ2drcqHGCtXiRfnNsem6EgXaCfWtoan+DeHZ8dX2FhXRmcHl9d316gIqFe318foC03tzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3dzc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3Nzd3d3d3d3d3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e397e3t7e39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4ODg4ODg4tiFb3FrdWFWT1VVXE9ETUY+SkdKRUQ8P0I6PDk4Njg0NTY3NDc2NDk7Ozw7OD47PEE4ODo9OD04Oj09QEBAP0FCP0A+QENCQ0FBRTc2O0RMTmPa5OLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXl29ra3Z5sbnNxhY1ybXBuf391hH5rcnZ2enN4gXhzb3VwbWt2fHmFiIB/f392coODsd/c3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eDg4eHh4eHh4eHh4OLXhW1xb3ZeUldTWlpRSkhDQFFAQkQ8OT9BOjw5NzU3NDU2NjQ3NTY9PDo9PTk+OjxAODo6PDY7OTs+PUJCQjtBQkBDQEBEREM8PUA3OjxFS01l3OPi4uPj4+Pj5OTk5OTk5OTk5OTk5OXl5eXl5dPOxsB+cWxveHt2b3VuanNzbZKGeG50dG5vdIZ/b2twboJ0bXZyfY2DdnF/d3mKgabf3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3dzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t/f3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi1oZucG1xYFJZUFdfWUpMTElSP0Q9OTtCRjs6OTc0NTY1NzU0NjY2Pj07Pz45PTk7Pjg9Ozo0ODtAQENCQ0FCRkE/Q0BBQkREOz0+OTs8QkxNZODl4+Pk5OTj4+Tk5OTk5OTk5OTk5eXl5eXl5eW5t7Woc3JscHd6dHd4bXFydXd/hHRyc2xsa3F8bnBudGuBf3GAd32Eg355gHNygYqg2d3c3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh49WHcWxqbF5YWlVXYFZWUE9QTD1BOjs8RkE4Ojg3MzY1Njk2NTg1Nz89Oz8+OT04Ozw5PTs7NTo9Q0JCPENDREREQUE/PkJDQzw9Pjg5PENLS2PN0dnh1sjY4+Tk5OTk5OTk5OTk5eXl5eXl5eXltbW2q3J5cm59f3Z1d2hqaGlwb3Zta2tnZWZxdG15gG5teXd2iHhxa2podXV5dHV/wd/c3d3d3d3d3d3e3t7e3d3d3d7d3d3d3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHi4uHh4ePVhnFwY2lhV1NZV19MUk9STUtAPjg5O0E+ODc5NjQ3Njc6NjY2NDk+Pzo8Pzo/OTo6Nzo9PDk5PEFBPTtBQ0VDRkA+Pj5BRUQ+QEE3OD5GSEpesrW4wbm1u8jg5eXl5OTl5OXl5+fn5+fm5ebm5ra2tbWOfX5weoR1cnZnYmNlbGtyb2ZpbHZtd4Z9hXlsbHd4a3ZwfH14c3V5fHd2h7ng3d3d3d3d3d7e3t7e3t7d3t7e3t7d3d3d3d3d3t7e3t7d3t7e3t7e3t3d3d3d3d3d3d7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4eHj1Yd1bl5uY1pUU1hXS1NLSk1SR0E4Ozs+PDk4NzU2NTY2OTY4NjY5Pzw6PT07Pzo7Ozk8PDs5Oj4+Pjs8PUFEQkNBQEBBP0JDPDw9Nzs+REVKXrG1tLW2t7e2y9rJ3uXl3eDi3tXU1tPU4OPg39+2treuh3t/bnmNenJ1bWNobGxtaXR4enF5enqIh4N6aWh9cWRvcXyGgX55e318e4an2t7d3d3d3d7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4uHh49aGdmxhb19dV1lcWlJQSEpXTEVHPUA9Ozs9OTY0NjU1NTg2NzY3OD87OT09PDw5OTw6Pjw6OTg+Qjs7Pj5AREBDRUFAQD0/QDw9PTU5PEJHRl2xtbW2uLm5ubq9uMPT0r3BwcC6u7y6u8TMxb/Dt7e3hGl1gX1ndYd5Z3Vxa2t5eHB3fH15bWl3e3h3bml1j4FwbHl4d3d9gXuGgnmAoNze3d3d3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODh4OHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4ePXhXJrZ3RhW1hYX15TVVVRVUpMRj9JRDs5PTY2NDc3NTc4Nzc3ODk8PDo+PDg8Oj0+OTs8OTs5P0E8PT9DP0FARUJCQTw9Q0A6Pjw1NDlER0dasbW1tre5ubm5ubm3ubm4uLm5urq6urm5urm6u7e3uX9ucHN6b3B/eXNuc3Vsc3Z4cXFwb2tvcX6Bc2mHhIF9dHOHdW11hYmBgHJ2hafd3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uHj14lxa2xyW1dXXWBUUVVUUFJPSkNATUE9Ozk2NTM0NjQ2ODc3Nzk6Pjs8Pjs5PDo8PDk8PTw7PT0+PUNEREBDQkE/QD48PkE8OD06NjY6QkpIWLG1tLa2uLm5uLi5uLe3uLi5urq5ubi4uLi6uru3uKx7cnhxf3ZzfnBsbXpyZ29sbW50cHt3d3Jyd3pvhpJ2f3x8enZ5fH9zfYdyda3T393d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4eHh4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi49eHb2pxalVWV2FbT1FSUE5XSURESUo/Ojk6NzUzNDk1NzY2Nzg4Ojw7PD46PDo6PTw5PDw9Oz09PDs9REdEQ0E8PDw8Pj5AOzg8ODE1OkFGRVautbW1tre4uLm4uLi4uLe4ubq5uLi3t7i4ubq7t7mqcnB4d3x7e4J3aG5xam9qY2lyf21zcn54dHFsanaAeX2AgH91doB1a4qLgHaR1d/d3d7e39/f3t/f3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f4N/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLi4uPYhm1sdGVWUFxnWE1YU1JRWUVDS1BOOzk4ODc1NTM5NTY2NzY4Nzk+OT0+OTw5OTw7Njg5OTo8QEA9PkBGQEJCQDo+PEE9Pzs7OzYxNjxCR0RQqLa1tba2tre4t7i4uLi4uLm6ubi4t7e3t7e5ure2tIlyd3h9iXxwem99c2hqbGdnbHRscXd0cWx2c3Fxd3FyfHl4g3Z7d2mLkYp9kM7f3d7e3tvY2drZ297f39/e3+De39/f3Nvc3N3e3uDg3+Dg4ODf3t7e39jS397f397e3t/f3t7f3t/f3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLi4eLi4uLi4uLi4uLi4uLj4+Lj4+Li4uPj4+Pi4uLi4+Lk14NoZ3VkVlVkZVdKWllXW1Q9RU1LSD04NzU3NjQzOTQ0Nzc1Njc5PTo9Pjw9PDk7PDk5Oj45PD4/PkFBQ0FFRUQ+OzxBPjw5PDs3Mzc+REhFSqG2tbW1tbW2tre4uLi4t7e4uLi3tra2tra3uLm2traLfXpsbHp/cGx5dm5qaGdlcXp4b2lvb3B1c21zd4Fnb32CgYNyf3lqcHJ6f6ng393Zy8a/vL2/vsLN0tDW3tnc4NfQzcPCw8PH1dfT2dzX1NjX0MfExce9vM/Kz87Y3djO3N3c2t3T0dze39/e397e3t7e4N/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eLi4uLi4uLf4uPi4eLg4d7W29/Sw8rJx9Hb3OLk4eHg2dre1sbExcTN2trf5OHi4trX3st9aWZxYVleZWFNTFRLUlpMO0hNSEZBPTc2NjUzNDY2NDg3NjU2OTw7Pj46Pjk5PDk3OTs7Oj49PEBAQ0RCR0ZCQT08Q0A9OTw7Nzc3P0RGRkaZtrS1tbW2tra4uLi4uLi3uLi3s7W2t7a3t7i5tba3opdxb29waW50dnFmZWNrbmdvcm1mZ2tygWVvdnyAeGRzj39zaHFyaWVlbm+w39HFv7u5ubm5ubq6uru6vc3Gw8e/urq6uru7u8HCvcHFvby/vry7urq5ubq6ubm6w8XDucDDwby/ube/z8/U3tjc3t/g3tLa4N/f4ODg39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eDg4ODg4ODg4ODh4eHh4uLi4eDh4uLi4uHa2t3RwsPCu8XT1uDdydPDrrnAsaqrq6uwtLbJ0sXRxLG4v7Srq6usr7S0vMzE1c60tLureGxtbWBdYl9ZS1NVVFFQREBRTUhEPzo3ODU3MzE1NjQ5ODQ2Njo8Oz08ODw5Njo6ODg5NzU8PDw/QEFAQkRDQkE8PkI/Pz09PTc1OD5DRUNAj7a0tLW1t7i4uLi4uLm5uLe1sautr7Oxs7OztLS0tqaei2tue3ZxeXhnY2hfcXdha25vaG99b25ja2lseHdsa4Z+bHB6dm1scG95sca8uru7urm5ubq6urq6urq6urq6urq6urq7u7q7u7y7urq6ubq7u7q6urq6urq6ubi3t7i4t7e2tbW1tbi3u8e+w8XHzcS4wMnH0tzZ2d/e3uDf39/f4ODh4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh3Nji4uLi4eHh4OHg3tfGxtHQztTe3tPO0t/SuLi8sq2trKysrrG+ua63rKipqamqq6urqqqqq6ysuKyqqqqrq6urra6urq6urryzrayrpHlub21fXl1dVE1SU1xUSkE/UElIPjg5NjgzNzMwNTczNzg1NzY2Ojw/PDg5Ozo6Ojg5OjY1OTs8Pj9EP0NFQkNCP0BAQT9APjw3ODc6QUVEP4W4tLS1tbe4uLm5uLi3t7SurKuqqq2urq6vsLGzs7WjcG5ucm1wg311aWFlaGZkY2Rxc21td25naW1tZXBzb29zcXN8h4F6dX11n7u6uru7urm5ubm6urq6urq6ubq6urq5uLm5ubm6urq6u7q5ubm5ubq6ubm6ubm4uLi3t7e4uLe3t7a2tbW2tra1tbW1tba1t7e3t7rBvrzGycrb3+Dg3tvd3d7h4tDW4uHg4ODg4ODg4ODg4ODg4OHg4OHi0768zNjd3OLg0dnbxL23sLCxsa+zu7uzsLS9s66urq2tra2sq6qqqqmpqKmpqampqqurqqqqqamoqampqampqaqqqqytrq6urq6urq6sraR4aWJxZmFZWlZRUk5cU0Y9QlJEQTc8OzY5NTY1NDU2NTg3NTY1Nzg7Pjw7OTk5Ojg3Nzk3Njg8Oz47RD8/Q0BBREE+P0M9Pjw+Ojo3Nz9DRj54srCztLW2t7i3trKurq2sq6uqqaqtraysrq+xs7S1t4xucnRqaIB5ZmpmZWxdaG5waGxxYmNmcoJ+dmhobGpueoaBhXx4cXF5gK+6ubq6urm5uLm5ubm5ubm5ubm5ubm4uLe3t7e3uLm5ubm5uLe3t7i5ubi4uLi3t7a2tre3t7e3tra2trW0tLW1tbW2trW1tre3t7e3t7e3tre4v8bP0MS+v8DE19e8ydra4OHg4ODh4eDg4ODh4eDb3t7Uzby3tre6wMDJxLfIvrKwsLCwr7Cvrq6ur7Cwr66urq6uraytrKurq6qpqampqampqampqKmpqKmpqampqKmpqKmpqqqrraytra2ur66trK2heWpjbWdiXFhRUFFLVEpCOklRP0E3PDk0OjU2NTQ1NTY4ODY4Njs6OTw9PTs6ODY2ODg6ODY3Pj09PT5BQUVCQkNBQUBBOj09Pz05Ojc9QUc8bKqmqKutsLGwrqupqKqrq6mpqamrrKytra2usLO0tbilgIdvaWdzdGZrcG1qZGxvcm5rbWNrcHyJhG5qbHx4Y3uKfnNqc25rcY+7ubm5ubm5ubi4ubm5ubm5ubq5uLi3t7e3t7e3t7i5ubi4uLe2tra3t7e3t7a2t7a2tra3tra2tbW1tba1tLS0tbW1tra2tra3t7e3t7i4uLe2t7a2uLm4uLe3uL6+uLq9vcfb4OHg2Nnd4eHg3dfKwcPCurm5uLe4uLi3tbS0tLKysbGxsLCvr6+vr6+vr6+vr66ura2srKyrq6yqqqmoqKmppqepqaehpaipqamoop+hoZyip6inqausrK2ur7Cwrq2unXdwbGphY2BZUU1RTFJGQzlNUEU+ODs3Mjc5Njc0NDM1ODg3OTc7OTo9PTw6Ojk3NDo5ODY1OD8/QEI9RENDQ0FDQEJBQDtAP0A/PDw6O0NIPWOopaWlpqioqKenp6ipqqmoqKipqqqsra6wsLCztLW1taWYdn5xZmt4cW9tZmVsaGNsZ2ZpaX11bWlvfXZ5hWZod294b3Fvcninu7m5ubm5ubm4uLm6ubm5ubm5ubi3t7W1tba2tre3t7e3t7a2tba2tre2tbW1tra3t7e2tbS0tLS0tLS1tLS0tLW1tba2tra2t7e3t7e3t7a2tre2tre3uLe2t7i4t7i4uLi4wMXTyry8w83PyMC9urm5ubq6ubi4uLi4t7W0tLSzs7KysrGwr6+vr66urq+vr6+uraysrKurrKysq6ehoJ6gn5udoaGdlpmkpKaon5mZmZmanZ+gn56fpKqtrq+ura2srJl1cGlrY2FeXVVOU0tSREQ4TktHQTo4NTI2OTY1NDczNzc3ODk3OTo7PT0+ODg4NzU6OTk1OD9AQEFEPkZBQkNAQkNCQT88QEJCQD0+OjpERj5cpqWmpqampqanqKenqKioqKenqaurrKytra2ttLS0tbekc311bnONf3JmanFjaW1jaGZobG51aV9jZ3VzdnpuZ3Bwcn56cYihu7m5ubm6urq6urm2s7a1uLm2trW1tra1tbW1tbW3tra3tra2tbW2tbW1tbS0tLa2t7e3tbS0s7O0tLW1tLS0tbW1tra2tra2t7e3uLe3tra2trW2tbW2tra2tra2tra3tra3uLi3uri4uLi3uLi5ubm5urq6urm4t7e3t7W1tLS0s7OysrKxsbCwr66urq6urq+vra2srKuppaSmpqScmZubmpmampmXl5eXl5aZm5iZmJmZm52en5+dnJ6gpKWko6OioqKQdG5jcGFeXltUU1RIVEo/PFFCRkM7ODYzNzo1NTQ4Mzg5OTc4OTc7OTs9Ozc6NzU2OTk4NTg+Pz9ART5CPz9DPzxBQUI/PT9EQT8+PTk9Q0Y/VaSlpqanqKeoqamop6ioqKioqKiqrKuqqaipq7W1tba5o3eKcXKHhnd0cGh5a2JjYWVsaW5zal9jZWNjZWprYmRqbHaXjX6ovbm3tre5u7u6uLWxrKurqq6wrKyrq62tq6uvsLGvr7CytbW2t7W1trW1tbW1tbW2trSvr7O0tLSvra6vsrW0tbW1tbW2t7e3t7e3t7e3t7e3t7Owsra1tLa2tre3tra2tbW1tra3t7e5uLi4t7e3uLi4ubq6urq5uLi3t7e1tbS0tLS0tLS0s7OysbCvr6+vr66vr62oo6KgnJqampqZmZqbm5qampqbmpmZmZiXl5aYmZmZmpycnZ+foJ+goKChoaCgoJ+fi3RuaXRdYGZeUlRLRFRJPUVTSEVCOzo0NDY5NDQ1NzM4ODg3ODk5Ojs7Pz04OjkzNTg5NjM5PT5AP0A6QEJCQkA/QEJCPz0+QUFCPz06PkVDQFGjpqWlp6inqauqqKaoqKipp6ioqKinp6ioqaq1tbe3t7KZtH99kIx1Z2lqbGZjYGNoZW94cGlicXx5cGpmZmRma3NqhYystrKwra2ttLeysLCtrKuqqaiop6ipqampqKinqKipqaeoqqurra2sqqytraysrq6traunpaSnqqyopKOkpamwsbGztbW2t7i3t7W1tre4t7e3t7Kppaasq6ivtLa1s7W3t7a1tbW2tra3t7e3t7a2t7e3t7m6urq5uLi3t7Wxs7S0tLKxsK6sq6yurrCxsK2rqqmqqKijnJqZmJmYmJiYmZmZmZmZmpqZm5ubnJybmZeYmpqcnJydnJ2foKGhoqKioKGgoKCfnop1amtuWVxhVktPREdVRz5PV0hEPTw4MzQ0ODQ1NDgyODk4ODk6Ojw5OUA8Njk6MzY3OTE0PD8/QEBBOkNGRUJBREJDQTo7P0FCQz9APUBEQ0BPo6empaemqKqqqqakpqenqKioqKimpqaoq6uttba3t7e4rbJ1cHuDdmBiaWtiZWZhZGdmfYh5bHKAfXFvcXhjbW5xZo+srKurq6ysra6urK2trKyqp6WmpaWlpqioqKiopaeoqKioqKeoqampp6Wko6KioqOioKKioaKhoKChoaKjpKOjpaWlqLC0s7OzsKuqqaqztLa3trGopaOioaGipKiqqairs7Sxrq6xs7W2tra3uLi3t7e3t7e3t7a2uLe0sa6ppqerrKmnpqWkpKSkpKWnqaajoJ+enZycm5uampmZmJeXmZmZmJiZmpqampqampqbm5mYmpydnZ2dnZucoKGgoaOjoqCgoKCfnp2FdGtsaFdYU0pHTUVITUdAU1dGRz09OTM2Mzc0NTU3Mzg6Ojo6OTw9OjpBPDY9ODM3ODgzNztAPz9AQDpCRUNAQkRDQT87PEBDQkNBQDxBQ0A9TqKnpqanp6mqq6mkpaWlpaaoqKippqanqKmpqrW2tre3t7izc2h7c2JnamtpaWJhZGloXV1tfHJma3J/fHR8bm1zc36gqamrq6uqq62trKusq6mpqKWjpKampqWmp6eqqaamp6enqKinp6iop6WjpKKhoaGhn56en5+fn56foKGho6Wko6OkpKSmp6enpqWkpaampqeqraumpKKhoaChpKWlpaenpaeoqKalpaivtLa3trW1tra1tbOwrKupqa6rqKWlpqampaSkpaWlpqWkpKSkpaKhoaGgnp2bm5ucm5qamZiXmJiYmJiZmpmZmZmYmZmZmZqZmZydnJycnJybnJ+fn6ChoaKgoKCfnZ2cgHNrbmReU0pITUZETEtFRFFTQ0c9PDgzNjI4NDY0NjQ4OTg6Ozk7Pjw5PTs5PTczNTk2NTY8QD0/QD88P0JDPkJCQj89Pj5CQ0FFQD86PkVAO0+jpqWkpqeoqaelpKWlpKWnp6eoqKanp6alpqa1tba2trW2uYptcW1vfHxxZ2pmYGFsYFROW2hqbm9tgYJ9cWdxdn6aqKeoqqmpqqurrKqqqqimpaWkoqOlpqalpaWmqaqppqWjpKWmpqSjo6KioqKhoJ+fnp6cnJycnJ2dnJ2en6CioaKjo6KhoqKkpaSioqOjpKSjpKSko6Ggn6GipKanp6ipqaelpaSipKSlqK2wsKyrqqusqqmnpaWmpaWlpaalpqioqailpaWkpKSlpKOjpKOioaGhoqKgnp2cnJubm5qZmJiYmJmam5mXl5eWlpeXmJiZmpqcm5qampubm5ucnJ6goKGgnp6enpycm356bnJiXlNNSlBFRk5NQkBPRT5JOz01MzYzODM2Njc1Ojs4OTs5Oj49Ozo5OT03NjY5NjU2PkI+PkE/PT5DQT5DQ0BAO0BAQkJCRUA+Oz5FPzxQoKSjpKOjo6SkoqSlpaSlpqamp6empqalpqaltLW1tbS0tbiBaHx9ZXOCemxwdWFfY1ROT1FbaGxpbGxxbW5xbnScoqSnqKioqauqqqqqqaempaSjo6OjpKSlpqalp6ytqaShnp2eo6Shnp6foKCenJ6dnJycmpqam5ucnJubm5ydnp6foKChoJ+goaOioKGjpKSjoqSlpaWkop+go6SkpKapqainpaGdnJ+jpaipqainqKioqaempaWkpKSlpqampqampqenpaWko6Ojo6KioqGhoqKhoqOkop+enZ2cmpubmpqZmJeXmJaWlZSUlJWVl5iYmpubnJuampqam5ucm5ucnp+fnpucnJyam5p/fnF0YFtUTUdNSEZMSj8/TkM8QDs8NDM4Mzc0NzY3ODs9ODo6OTk7PTs7ODk9Nzc4OTU4OD9APT9BPjs9RD89REA/PzpAQUE/QUVAPjw8Qz88Tp2ioaKioKCipaSkpKWlpqenp6empqampaampbW1tbS0tLS3jHalsXdmc3Jvc2xjZGlYT1JRT09dgG1kYFptkZGSoqKjpaampqenqKiop6alpaSjoqGhoaKjpaempqesrKemoJ2cm6Ghnpuamp2cmZiampqampmZmZubm5uampqampucnZ6goaCfnp+hoJ6foqOko6Omp6inqKWioKGhoaGkpaWlpKCcmZmbnqOmpqampqanpqempaOlpKWlpqiop6enpaWlpaWkpKOjo6KhoqKioqKhoaKjo6Kgn56enZybnJubmZaUlJSTk5OTk5SUlJWWl5qam5ubm5qZmZqanJ2dnZ2dnZuampqamZqXf3dvc11aTkhKTkdFRklERU5APD09PDQ1OzQ2NDY1Njc5Ozg5OTg5OTw7PDc6Ozc4ODg1ODg/Qj9BQTw+P0A8PEJAQT49QT4/Pz1CQUA6OkA8PE+doqGfoJ+dn6OkpKSlpqeoqKenp6ampqampqW1tLS0tLS0tbSXtqd1Znh2Y2xjY2VjW1JTU1JNXqCMeFhodpajnp6hoaOjo6OjpKSlpqalpKSioaGko6OjoqOlpqWmpqenpp+bmpuioJmWlpWam5qXl5iYmpqYmJqampqbm5qZmZmenZ2goqOjo6KkpKWinqGhoaKjpaampaSjoaCgn5+hoZ+goJ2amJeZmpygpKOjpKWmp6alpaOjpKSkpKWnp6ampqampaWmpKOjo6SjoqKjpKGfoKGhoKGgoaCfn56dnZyamJeVk5KSkpKSkpOTkpOUlZaZmpqbm5qampqbnZ6enp2cnJybm5qamZmZlH10bHReWk9IRUdGQkVORT9GOzo+Pzs0Njo2OTM2NDY4ODo4OTc4ODo8Ozw5Ozs6OjY3ODk5Pj9APjw9QD5AOjlAQT89QT8/QUE+QUE/Ojk9PjpQnaCfnZucnJufoqOlpaWlp6iop6ampqanpqantLS0tLOysrGwsK2rkHiGj36bmn93Yl1TUlFRTGKgootaiKCgn52YmZycnZ2eoaGgpKenpqWkoqGjp6alpaKipaampaanpqagm5mboaCXk5OSl5qcmpeXl5ibmpmampqam5qYmJmaoKCgoKGfoaKipKamop6gn5+goaOko6Khn56enpyanZuZmpqZmJeZnqChoaKioqKkpaWmpKSkpKKioqKkpaWlpaWlpaalpaOko6KioqGgoKGgnp+fn5+fnp+foJ+cm5qZl5WUlJSTkZCRkpKSkpKSk5SVl5iZmpmZmpqam5+fnp2cnJycmpmZmpiXl5F8cmdxXl1QRj9BRD9KT0JCRjhDRT4+OTg7Nzc0ODQ1OTo6Ozk3OTo8Ozo8PT48PDo2NzY5OD4/QT47Pz49PDg6PkFAQUE/P0FCQERBPjo4PkE8U5ycm5uampycnaGio6KjoqSmp6alpaampqSjo7KysK2rp6amp6alpqiln6iop6qnoXmEXFFST0xcnKCAYpmgnp2clZOVlpeZmp2dnqGmpqampKOioqanp6ajpaampaWmp6amop2cnqGfl5GRkJSXmp2YlpeWmJuZmpqampqZl5iam6Ghn56fnpybnJ6goJ6dn56fn6Cio6SjoqCfnp2ZlpeXl5iYmZubnqKioqKioqGio6WlpKOio6SioaGhoqOkpKSko6SkpKSioqKhoqGgn5+gnp2enp2dnZ2dnp6em5mYl5WTk5SUk5KQj5GSkZKSkZKTlJaXl5iYmZqampyenZ2dnJubmpiYmpmXlZaNempmamBiTkY+P0A9SkVAQ0A7QEE8Ozs5Ojc2NTg0Njc4OT04ODs6Oz87Ojs8Ojk6Nzc2ODs8Oz08Ojo8PTw3Oz5DQkRDPz1BQ0FEQT88OkBCO1eZmJqamZmam5ucnp2foqKhoqSlpKSlpqSioJ6op6alpqWlpaemp6ampqakpaanqKehqXJOUU1KVJahenKanJyenJeVlJWWmJiXl5qeoqKhoqOkpKOjpaalpaanpqSlpqalpaOgoKGhn5mSkI+WmpmenJaXl5eZm5ycnJqamZeZm5uen52cnZyZmZqcnZydnp6fn5+hoaCgoaKgn56bl5WVlZeanZ6fn6GhoqKio6OhoaCgoJ2cnaGioqOkpKOioaSlpKOko6SjoqKioqKhoKGfn52cnZ2cnJ2dnJ2enpqXlpaVlJOTkpKSkpCRkpKSkpGSlJWWl5iYmJiam5ycnJycnJ2cm5mYmZiWlJWXi3hsY2RiZFFHQT1DO0tIRDo7Ozw+OTo6OTo3Mzc5NTo4ODg8OTg7OT09Ozo7Ojk8PDc2NDc/PDo9Ozw/Pjw7ODxBQ0FDQkI+P0NAQkFAOj9APztZmZiampqam5ubm5ydoKGhoaGhoqKioqKhn5+dpKWmpqenpaWmp6ampqWkpKalpKSkpaaGUFJQT0+PmHB6mpubnJ6cnJycm5ubmZiYm56dnp6foKOkoqGhoqKio6SkpaalpKOjoaGhnpyalZOUmJuam56amJiYmJqcnpyam5iWmZybnJycnJydmpqbnJ2dnp6dnp6fn52cnJyhoaCblpWVlZacoKGgn5+hoKKjoqOhnZuZlpaWlpicnqCip6ikoaCgoqOjoqKioKCgoJ+fn5+gnp2cm5ucnZydnJmanJuWk5KSkpKUk5KSkpKSkpOSkpKRkpSVlpeYmJiYmZqcm5qbm5ucnJqZmJiXlZWWl4d3ZGdoZGJNQ0U8RDlJSkU5Ojs9PTo6ODg6NjQ3OTU8OTY4OTc5PDs7PDo6PDs6PDw4Nzg3Pj07Pj46Qj86Ojo/QURCQ0FBQD9EQUFAPjpAPj06W5qYmZqbmpubm5uen6CgoaKioKCgn5+enp2dnKWkpaanpqWlpqakoqKio6Oko6Kjo6KnllRYVVJOZ21rgZ6am5udn6Cgn56enp6dnJ2dnJ6enp+goaCfn6CgoKGio6Ojo6OkoqGgnpuZmZiZmZmZmZienpiYmZmam5qWlZeWlZicnJ2cm52dnpybnJ2cnZ6bmJqeoaGdm5udoKKhmpWVlpaZoKKgnZueoKGjop+em5eXlJKSlJeYmZ2goqenpaGgn56goaGioaCfnp2cnJubnJubmpqZmpydnJmXmZaVk5GQkJCPkZKSkpKSkZKTk5OTk5OTlJWWlpeXl5manJubnJucnJqamZeXlpaVlZSEcmZsYmRbREJMPT84RktCPEA+Pj05Ozk6PTg1ODg2Ozg1Njo4PDw7Ozw8Ozk8Oj09OTU4Nzw5PD88OkE/Ojo6QEBDQkRBQ0A/Q0FAPj08QD09Ol+al5mamJeYmpycn5+foaGhoJ+fn56foKCenZ2lpKSko6OioqOjoZ+foaGipKOio6SiradXXl1UV19ua42dmpqbnJ6dm5ucnZ+enZycnJydnZ+goKChoaGgoKGgoKGioaGhoZ+enJuampqbnJqZmpuZnJ6ZlpaWl5eTjo6QlJabnJuam5udn52cnJycnJ6dlpSZnJ+in5ycnZ+hoJuXl5mZmpycnJubnZ6fnZqXlpaWlJOTlJiampqfoKGmpqWgn56fnqChoaCenJubnJybm5ybm5qZmJmZmZmXl5iVlJKQkJCQj5CSkpKSkZGTk5aYl5STkpSVlJWWlZaZmZmam52cnJyampmXlpaWlpaQgG9vZV5gV0BKSDg/N0lFP0VBPD07Ojo8Ozs3NTs4Njs3NDY6Oj47Oj0+Pj07Ozs+Ozo4Ojk5NkBBPTo8PTo6OT9BQ0JERUM+P0FBPz8+Pj89PDtgl5WXl5aVl5mbnqGhoKGioqCenp6enqCgn52bpaWkpKSioKCfoJ+dnZ+hoqOjo6OkobCjXWVkYGFua4GenJubm5ubmZianJ2enJubm5ycnJ6ipKGeoKGhoqKhoKCgoaGgn5+enJqZmpubm5ybmp2dm5manJiXlZWWkY6Nj5KYnZycm5ycnqCdnJucnJyempWVm56foZ+dnJyenp2cmpqampqampqbm5qXl5aTkpWVlpWTlZaam5qanZ6foqWjnp6fn5+en5+enZ6fnZycm5qcmpqbmpiZmJiYmJiYlZSTkZCRkJCQkZKTk5CRk5SYmZiVk5SVlZWWlZaXmZmXmZqenpyamJiXl5aWl5eYjX1ubV9lVlRFSzw3PjdSRUM+QkE4Ozw7OTg6ODY7Nzc6Njc5Oj0+Ojw8PT49PD06Pz06ODw9OTtAPj4/PT45ODs/QkNAQ0VDPT9DQj5AQD5APTw8YZWSlJWWlpeanJ6goKCgoaCgnp6enp6gn56em6WlpKSioJ+fnp2dm5mbnJydnp+gn56rmGNpbW5pZm2enZybm5ybmpmZmZqam5ucm5uam5ygo6SgnZ6en6CgoKCgn6ChoKCfnpuamZqam5qbm5ufnpyZmJqamJiYmJKOj5OXnJ2bnJ2cnJycnZycnp6dnpqVl5ygoaGfnp2eoJ+cnJuampqbmpqYmpmVk5OTkpOWl5eVlJiYmZucnJydoJ+gnp6enp+fn56en6KjpKKgnp6cm5qampuZmJmZmJeXlpWUlJORkZCQkZKTk5OSkpOUmJmYlpWUlZaWlpaWl5iYmJiXmZqamZeXl5aXlpeWl4l4dmddX1dURUU5OTs8WT5AOEI/OTs7Pjk4Ozg6Ozc5OjU4OTs9PDk9Oz0+PD0+Oz8/Ozk+PDw+Pz5AQUE9ODc7QkNFP0FFQz1AREJBQEQ7Oz47PGKWk5SUlpWUlpiYmZubnJycnZ2cnJ2en56dnJqkpKSkoJ+enpybm5qZmJiYmZucnZ6cpolla3R4bVuFop2dnJydnJqbmpqampydnZ2bmpuboKKinpucnZybnJ2enp2dnZ2fnpuampucnZybm5ycnp6cm5qanZqam5yVkZOXm52dnJ2fnZycnJycnZ6fnp+cl5idn6GhoJ6cn6CfnJubm5qbmpmZmZmZl5WWlZaYl5eXlpaYmZuenp2dn6GhoJ+fnp6fn5+dn5+hoqKhoZ+fn5yZm5qcnZuampmXlpaYl5eXlpWTkpGTlJSTlJSUlJaZmJaVlZeZmJeYl5eXl5eYl5iXl5eXlpaYl5eVl5eDeHZfW11eUT1GOjk4P1VDQTtDQzo8Pz86Ojk3Ozg4ODc0ODk8Ozw4Ozs8PTo9Pjo/QT06PTw+PkA/PUBBPjk2PERDRUBBRUU9PkVERD9COzo8OTpkl5SVlZaUlJSUlJWXmJiamZqcnJydnp6dnZybo6Oko6CenJuamZqZmJiYmZiam5ubm6WJa3F2em9lmp+enp2dnJybnZ6dnJ2enp2dnJydm5ygoJuampubmpudnJqampucnJuamZycnJ2dnZ2dnZ2dnpybmp+fm5ydm5mZmZudnZ2dn52dn5+dnJydn5+fn5uanZ+goJ+dnJ6gnpubm5ubm5yampuamZudnJqZmJeYmJiYmp2foKCgoJ+hoaGgoJ+en5+fnp6foaKhoJ+enp+enJqam5ubmpqZlpaXmZmYmJiWlJOUlJWVk5OVlZSVlpWVlZSYmZuamZaWl5WWmJiWl5OUlJGRk4yRkJOWfXhqYWJiXFA8QDw2OENWSERCOjg7Oj47Nzc5Nj06OTk2NDc6Ozw9OTo6Oz87PT08QD47Oz46PT89PkBBP0A8NztBQ0U/P0REPj9EREM+Qj07PDs6Z5aTk5OTk5OTlJSVlpeWl5aWl5mbm5ybm5uamaOjoqCfnpuamJeYl5eXmJmYmZybm5qkgGpqb3lzcZegnp2dnJydnp6enp+enp2cnJydnp2bnJuampqam5ubmZiYmpqamZmZmZqdm5ydnZ2dnJ2cnZ2cm5qdn5ucnJubnJubnZ2dnJydnp2enZydnZ2cnJ2dm5uenp6dnZybnpubnJycnJydnJubmpmbmpmYmZmYmpmZmpyfn5+jpaKfoaKioaGfnqCgn5+fnqCioaGhn5+fn52ZmpudnZqZmJWWl5aVlZaTkpOUk5STkJCSk5GUkY+OkJGOlZabmJWYlJmXlJiRjJCPk5yTkoyFjIeDhndxZ2pkW1xRQT44NkJHYEJFR0A+Ozw7Ojg4NjU8ODo4MzQ6Njk9PTk5Ojs9Ozw6PD48Oj5AOj5APjw/QD8+PDg6Q0FEPz5CRD8+Q0VCPUJAPDw8OmeYk5KSk5OSk5SVlJWXl5aWlZaXmZmZmpqampqkoqCfn52bmpmYmJiXl5iZmJmcnZ2cqH1nZXN7enOJop+enp2dnp6enZ2enZ6enp2dnZ6cm5ybmpubm5ucm5iYmJmZmJiZmZibnZycnZ6enp6enp6dnZybm52bnJybnJ2dnZ2dnJ2dnp+fn52cnZ2dm5qbnJmZnJ2dnZ2dm5uanJ2dnJycnp2dnZybmZeVlZeXmJqam5ubnZ6foqOhoKGhnJucm5ubnZqcmZycn6CfnZiZmZmUkpKUl5SPj4+OkYyNiYuQi4mLjpGRj4mQmJiQkoyNi5KQj5iYoqiqpqWlrKOmoZqep6eyqKKVo6Cfl39wcWlsXFtcTUY8NzdHR1g+SE5URjk+Ojg5ODc1PTk4NzMzOTY6Pjw6Nzo8Ozo6Ojo8PDs/PjtAQD47PT5BPDw2N0A+QkA+QUY+PEFEQT1DQj49PDlmmJSTk5OTkpOUlZOVl5iYmJaXl5iZmZqampqaoqGfnp2cm5mYmJiYmJiYmZmZm5ybnKx/am16f3lxh6Genp2cnZ6enp6enp6dnp2dnZ6enJubnJubm5ubm5uZmJiYmJiYmJmZnJ2dnJyenp6enp+fnp6dnp6dnJydnJ2dnZ6fnZ2fn56goJ+enZ2dnZybnJ2em5qbm52enZ6dm5ubnJ2cnp2cnZqYl5SRjo+QkJGVmJSWlJiZmpudmJuYlY2Mjo6TkpKRj4mQjpGRjo+Ki42NjYiIi4+Lg42NkY+MkI2Qk5WVnJihoJySn6SipKmam5eanKOprb3Bwbq8uL26ucC8ubq3uru7tL2zwbV/bnVmZ1peWUxJRTo7TElTPFZSSUM6QTo7Ozc3NTo6OjgyNTY4Oz08OTk7Ozw5Nzo4Ojw6PT85PD8+PDw9QTs5NTg8O0A/QT9EPTxBQkA8REM9PT06YZOTkZCUlJOTk5OTlJeYlpeZmJmYmZqbmpqamp+gnp+fnJqZmpqampmYl5iZmZmZmZmphXB1e4B3b4mhnp6enp6fn56en56fn56dnp6fnp2dnJ2cm5ubm5ubmpiYmJiZmZiam52cnJ2dnp2dnp6goJ+enZ6hoJ6dnp2enZ6fn56en6CenZ6enJydnZ2cm5qYnJuVmJqamJiYmJmSjJCXlKCXk4+MjYqKiImMiJORh5CPjYqKkJCLjoqMi4+IiImJjpGOjYaFiYaKhoWLiI+SkJCNkJKXlpKamJ2TlJ6kpqaqq7Gsr6+rpquqsbm5tbS0rqyvtMDIxcXBvsbDxMTDurW+t7a0s7C2tb6qcHRyXGZfXl1JRj8/RUtMVklcTEQ/PUI6Qzk5Nzc7OTk3MTc5ODo+ODg6PDw7OTc5OTs9Oj4/OT5BPDs+PD46OTY5PDpBPkNBQT08QkBAPkJEPj8+OVyHhIOHi42KiYaFgYqMkZOVmJiHlZaWkpiampmenZ+gn52ampubm5ycm5iWmJmXl5ibqo56dXZ7f3mCoJ+fnp+goKCfn5+foKCfnp2dnp+enp2dnJqbm5ybm5uYmJiXl5iZm5ucnJydnp6enpybm52dnZycoaGfnZ6dnZ2dnp2dnJiWlpaYlZWSlpmWk5GKjI+PjI+NkIuLj4+WiYiEi5GZjn2Fi42PjYyHioyQm4yRj4+Lio6TjIyNjIiSi4yFiYyPhouIh42KhYyEj4qXkJOYmpWbnKOqoaKknKKrsbe0ubWxs62vsrKlp7O6sbq6vLa3tsDDw729vLa/urq8wbW4wL60r66mqa+3mm58Z1tjWl1fSEU+QUtJU1hZXkFGOTk9OkY/Pzo3Ozs7NjM6Nzo5Pjg6Ojw9OTk4Ozk7PDo+PTtAQDs8QjxAOjg0Nzw7Qj9BQj4+O0NEREBDQz0+PjlhmZWLkYWNj5aSiHl9e3+Fi4OKgoqJhmuAeJCLlpqRnZ2UlJGTlpeampiWk42Sk5KQm5uIdndzcX1/cpGgnZubm5yenZ2eoKGgm5uWlpucmpybnJuYmZqYmJmampqWi5CTlpmYlZiYlpucl5WSkY2SkZCUk5KXm5mYm5ePjpCLjo2Ch4uLi4qLiI2RjIeHhoqIiZGKh4yEhYqNi4qNhI+UkIyDkJOUmZWQi5OTkZWRlpWOj5GMlI2Oj4qIj4ePhoeJiYmNiomJioWNh46JmJKUmpuXmKChp6Cko5qqqbO2sbWwqKmiqK6tn6qvsK21ubi8wr/BxLixtbCutrOwuL68ury+urOzp7G3wpB1gGNiXlpXUk1IRkVQSVlXX1tDUDpCQz1HRj84Nzo6NzU1OTc8OTw5ODo9Pjo6Nzs7Pjs7PTs9P0E7Pz48Pzo4NDM3OkFBQEI+PjpDREM/QUM7PT45Z6mloqKZn6CippeUiI2CiIJ1h4iKiIp7e3Z7enmPeoiSfn18en6CkYWBgH1zfH99fISHfnRweHZzfHaBj4iIiYeIioyMkZicl4iOhIuNi4iNkI+Pi5GPi4yOj5CQjouFhYeLjIyHiIuOi4eMhYaBjYuGiop/iYqGiJiRiIOIg4KFfIuLjIaJi4iKkIyIi42PjI+Wh4mLio6NjY2Wk5OdnJyalpycm56bmpuYnZeTkZWWkJKRi4+LlpSMjYqDi4SEiYyQkIqOio2LipGJjZOTk5SVk5KcmZ6Xn6CfpaKvsamupKSfmKStpqa4t6ysu729wsPAv7+vpa2wsLS3uLO0uLa0ta6stK+4tLaBeXpjZmBeVlFRQUVMT0lcXl9UR0dCS0xCREA9ODg7OTU3Nzk3Ozc9PDk9Pj05Ozg6O0A8Oj06PkJBOD88Oj84NjQyOTtCQD9CPj04QEI/PkBEO0A+N2CloJqXnaGaoaCPl5efl5WCjaCfo6GdmpKOjIxycXBvdnFucG1ucHZub29waHBxcHR+c3FycXd7cnl2d3Jyd3Z6e3l8fXt/iIGEi3+PkYaNi4uGiouLiYaEgYaCgIKJkYOAg4x/ho+LiYWAh32AgZKQhoSEho2DhIyPj4+IjY+Hi4iRkJWRjpCKk5eOj5WYp6SfnZWYlpaln5udq6aqt7W4srGnr6qnpqGfmp2WkpWVkYqPjImTjZuVjYuLhoaJjJWQkJCLmZKVlZSbkJiTlIyNkYyWl5WilZ6mqauno6OqsJucpp+mq6G0vb6zs7+5u7u6uby9rqiusa6wuLyztLGxqrCpqLGxsqild3J0X2hhYFRWUUlKSFZNXl5eVExKRVFKRUdDPTo5OTc0ODY4Mzg4PTo9PD47OTs4Ojs/PDw+OT9DPzg7Ojg8Nzc2Mzc5RT4/Qz89N0BAQT0/RDw+PThUj4yGh4eUjJWZl5yWmZaNlZyWlZydoKCdmpiWeHFubXJ4cXFsbnJwa3FvcG1yc3t1dnd5fnVxeHZ0d3tybn98gX15eH1/eYOGg4WCg5CLkIuLi42Pi4mJhYKBfX9zfYiAfpyQhIWFiYuPinp9fYaOjYqGjZSRi5CXj5SXkpihlp6XlZunpp+goKawq6GjpbW0sqqmqq+isba5vcK7ucO+vLi9uLWxrLCspZuSk5mfm5SPk5WOmp2doJqfn5edo6qsoZ+em62hp6qwqaampJiRkZWUo6SirKSss7Szs6i3tru4sLKvra2yt7a6srW6s7e5u7i8urayr6yxsbKztLOxsa2us7Gzs6yhl3Zxc19jXlJRVE1PSUdYT1pcZFROR1VPRURKRD44Ojg3NTg4ODU5Nzo6PTw/Ojg8ODk5PTs9PTpCPj84Ozo5Ojk4NjI1N0I+P0RAQDY+P0I/PEM8PT46Tn98go6MjJOTl5eaj5SWjZaRkZSXk5qanqGdnHJvcnFxcXFxcG5zcW91dHJxdneAdXd8eYV+d3t8eX1/fICJiYmDfXp/h4GIiYGAgIGGiIGGi4aIhYSIiImEf4J/enx8fX6SkH+IeIGFi4qDhIWKj4yNkZmdlJSUoJqan6Ktsa2ppKWtr6ysrLWuvrmtrqm1sLexq7G2rK+9wsLAvrq8trKutraxtK66u7OurKepp6unoqmtoKmooq+wuLSxvLq6urK0ta+8tLezt7e7t7mtrbCprLW5sbeytLe2sLu7vLu6ury1vLi0wbWsqqqrtLG3uLm1trSzsKymrrCqq7Cxq6yusLKxtK6qo5N4dnJlZ1tMUlBFTUlTV1JlXmdUUExcUUhMUkNBOTk3OTU4ODY2Ozc5Ojs6Pjk4Ozo6Ojw8Pj08RD45Njs7ODg+OTUxNTZCRkREP0A3Pj5DPjpBP0BAO0t/gomXmJSdlpabmIuSlo6XkZGVl5SZl5+bmZx8dHV2dXl1c3RudnJzdHV2d319gX56gXyDfoJ/fYB/hIKFj52RiYF/go+Xjo6HgoCBiIuFfomQi3+HjYyLioeSioeGjZGTkZGEh319g4iMjouOiomQj46PlJSYkZWbmp2dqK6yr6+1tLOtsrW4sLy1tbGqsKqztbS7t7SztrS1r7i4t62noqassLCvtre3vrW5vLOysa61u7C0r6+yu7axuMC9tLS0s7izvLq2tLrAvbm6ubq+ubm5vrWysa+yr6q1tLGzsbSzrri4tb+vpKaoo6ussa+zrq6wsKytq6qroqKmqKKnrauqpaynoqeYeHlxZmVZT09NSVJNV0xPX15cTlVVYlFEVE07Pzk8ODk1Nzc1Nzk1Ojo6OTs4Ojw8Oj08Pj4/P0I9ODY6Ojk6QDs1MjY2QUZDQz4/Nz49Q0I5P0I/PjtLjpGTmJmVmZGTopiTkpKLk4uOkI+Vl5ablZSbhoJ9enh2dHRzdH53end2gIKDhouMhISFioaQiYeRk5aRjZaalY+IjI+emJaVkpCTl5qamJCdoJ2Tl5qgmZ2boqGVkJugpKOak42IiIuJkZGOkY6LmJqPj4yUmpecnJufnKSstLm6vK+2tLi0tLK3uLmzq6+qqKy1srK1rrGrrqa3s7OxpaGotbCvrayrtbqyu7q6tLK3ur67ubG4sLmtqLK4u66ttLS3tbu2trm5vLe0r7G0t7a5s7e1pq2pq6ior6yprq2up6KxtLG0q6aop6Cjq66oqq6orLKwr6+pqKGeoaGjpqOgopqlo56ol3J3bmdiVUtUT09KQ1BLX2JYWlFcVGBNSFJJQUA5Ojg2Njc3NTg5NDs5Ozk8Nzs+Ojg8PD0/QkBBPTs2OTk5Oj87NjM3OD5GQkJAQjk+PUBDPkBGQj44R5OWkZWTkpSQkZ+ZnZmVkI+Sko6Mk5aWko6RlZGSkIaBeXJzdXuBhI6HhZGTkpicnJiVkJWYo5yaoaeqqZ+clpeVnaKioZyZnpmlqKyvramnqqmop6GlqKirqqmvoZufoaOjoJqfoJyUjZiUmKCgoaSem5qlp6Spq66spaOoq6+xtK6qrK6zr6ystLO0ua6urayqrLKwsK2wqKqmsrS0uK6qtrqwr6qurLC3s7i0t7W0u7y4tbWxtauyrKiys7uvrbGytLa1sbG0s7OvrKuvs7a0sayutKqqpqWnrauoqKupqqifqbOwqqeppaOio7CtqaatpairrayppaSioKWipaOYmZyVnqKippdudWVnZFdPWEtLSktTVHBiWWRXX1tcUlpQTEM8ODk6Njk4NzQ3NzQ4Ojw6PDg6PTk3PDw7PkM/QT47OTo5Ojs+PTg0NThBREVEQkM5PjtAPkI/R0Q+N0KSm5SVlZaVj46Wl5qZlZGKk5SSjo+SkYqKiY2Ul5qTjYmCho6VkZSfmpuin5+jnqGhn5ijpKelpaapqa2rqaKmpKilpKGfnqOjra2srairrq+qqqukoaKkqaemqaijopybm6SgpaijoJidmJ+hoqmnoKKirqyrqqetrqilpKmpqammo6iqqaekp66wr7Ovq7Crqq+yr7Czua+rqLCxrrCyubO0r62vtbCss7GurLW1tLSzs7CvrKyqrKusr7G0s7CwrrCwsKyqrauqq6alrrCysKumqbCvqaOkqaunqKaopquwq6mvqaaoqaalo6iwraqpqKKpo6WnpKGhoKKloZ2el5aYlJugpKmUbnNeamlfVVpOUk5QT1JkXGVjW11ZXFBZT0tAPDs5Ojc6ODczNTMzODo9OTo4OTo5Oj08PEBEPkA9OTo8PDw+Oz45NTo8QkFFQUNBOT47P0BEQENCQDdAkZ6YlJeZlpGHi5SSl5GIg4mLk4+OkI2Hh4SFlZmWmJeZlpqeop2anKKkoaCdn5qfoKGgpqGgoKCjo6KlqKmrramqpqOmpaCloKaop6WnqaepqKOnppmcpKaioaGhoaCcmJmfoKGkpKKenpagm5qioqChn6GiqKCcn6GloaCmo6KfpKGspp6foaGkrKqnrKivq6e0sa6ur7WyrKqwq6mtrbWwrq6srreup6yqpKivsq+sq7Kvqqqpq6utqa6urrGxraqtqaunp6uoqauinaapqKilqKisqKilpKWop6iopqmsr6+oq6mhoqKlo6Opq6ymqKWjqKKhoKSdnZ+hoZ2bnZ+amZWcnKOqlG9zZm5yZF1cUFVPV09eZGRsaGJiWlpSVE9NQTo9Ojo4Ozk1MTYzMjg4Ozk5OTk7OTk8Oz0/Qz5APTk7Ojs8QD0+PDk5PEFBRUFGQTo9Oz9BQUJBRUI4PYqWlJOYmpaPiISNjpGSjIiIiI+JiZCRjoqKiJubmZygpaKlnqKjoZqeoZyanZ6bnKOop6ugoKOYoJ2XnKGjo6WjoqKkrKilqaCepqmnrKmkn6Kgoqahpq6mpp2fn5+fn5manJyhoKGkn6GbnZqcoJ6hn56eoKOZlpqYpKKipJ+ZnKGhoqCbmp6goaSgnaejqrGorqusqaSqqquorKalrKqws6+rq6mwq6appaWoq6ynpqevq6Wnq6upq6irqqqrrailqKOmpaesqayoopykoaOmo6qpqKano6SnqKanqKepqKupoaKoo5yepqWjqKino6WlpqmgpJ6inpeYnZ+doqKlnpiUlZ6go5d1d2t2d2JfXFVZUVVXW2Nec19oX2NTUVlUSD48PTg7OTo4NTM3MzM0Nzo4OT05Ozo5PDxBQEM9PT44Ozw9PEA/Qz86ODo+P0NAREE6Oz49QD9DQ0VDOTyCmJmenZ2alZKKiZGRl5GQh4SJgoGNj4+Sj42cnZ+hpKmlqaeorK2moqKfmKSmo6Stsa6yp6asm56em5qjp6Cfo5+foq+qqqyoqKuwqaiqqKGfoKeprbCyr6yjoqahqaWepKOipqClpKKlo56doJ6fpaKinp+imJWemp6fpKGblZigoZ2enJudnZuZmZWen6Oonp2iqKGaoaOmoqSoqaqoq7CxqKWlp6eopKWpqaqnoqWmqKadnqWloqClpaOlpqCjpaOjpaelqamqpKekpqKmp6SrqaenpKGlqKynpqWlo6OopJWdo5+bnaCjqaeopqGjo6mooKiioJyVkZqfoKGmopuXkpCamqCVfHdvfXlmW1pgX1pcVlxoZG5jbmppYl5QUEA/Ozo4OTg8OzYzNDMzMzc5OTs8OTs7OT49QkBAPTs9ODw9QD08PENBPjo4PT9EP0M+Ojk/PEI/P0FEQjk6gJ6kp6Kem5+gmY+ZnaCWloqGj4iEi4qTl5SRo6Wnqq6trLOys7S4t62pqqevtLKxqq6usbKusa2lq7OssbGpq6+rq6y2r7Owq7GysaOfoqqpp663trS0trOvrKuuq7awqbKxra6npp6io6ObnZyXoqiloZ+eo5udoZqWnaScm5aZoqefoJ+joJuUlpmWl5qfoJmVnqGZmJ2dpZ2gpKeqqaiqraylqaSlqqeqqaqsp6SkpKOimZmhnpqaoaCfpaWYnqSmpKqooqelpaGqp6mnp6ejqKWmpaGkqKesoqekoaalpaOVl52Ym5mVo6elpaSfnZ2lo6Kqo5+amZiXnJyaoaGakJOTl5ibjX93cnZ5amJbX15cYllgZG5ta25hX2RgUE9BQDs7OTs4Ojk2MTQzNjQ3Nzc6PTo8Ozk9PUI/Pj89PDo/OTo7PD5BRUA9OTtAQT5DPDs5PzlAQEBAQkM7OXuao6OcoJ2dop2Zn6KioJibmJaYkpSQm5qWl7S0rrW4s7S4tre0uLm3tbm4ub28uKqLnLK4vLS9urW7uru4s7q/uLe5u7G3r6iusq2inJ+qsri8vL27ur+0r7GztbS3t6+1tLWysKikop+gl5Wal6SqpqahpKOkq6almaGko52goaKooaOgpaGck5mYmJmco56cmpudl5uZlqWam5+hqKmpqKuvr66pqKirrKytq6irp6WjoJyfo6Ojn6Cipammmpyip6Spn6GjoqKgpaanpqSooJ+ipKGjoqiop6OloaGopqalo5mbmJuTj6GknqKfmJiVoJuhpaCfm5udnJuamZugmo2YmZiTkYaAdnh4eGNbUllUX19hbWh1a3FoaWlhWVNMQDw6Ozg5Nzk3NTU2Mjg1Njc3Ojw7Ozs7QD4/QD0+Pjk6PDk2Nz47QkZCPDg7P0NDRDw+OT43PkFCP0ZDOzhwkpqblJ6bm52Vl52doqajopaXnpaXl6GblJi+t7G4uba3t7i7l5S2vbu9vcDFtaK7mKC3v7+6wcm0nbu2sra/xcGooLa0urGqrrSxsLG0tbW8vL68vL7Guri3ur20r7Wxsbq4t7Kzsqqmpp+YpKSnqKSupKurtbWvs6CnqqynqqmlpqCnoKGmoZOWmJ2foqSjnZ6coaChnZekmpmdoKaqqqqtrq2tsLGrrK2sqamrrqimpaalpqSkpqaeo6eppKGcoKKjpqCio5+jpJ2foqWgpJyboZ6fo6GhpaSlqaOkpaKkp6ehn52elpOcoJiZko+MjJeWn5uWnJqdnJqSlpSUmJOQmp2YiouHgIB8gnhhXllUYWlgZnNvc2l0ZGlkYltMSz46ODg5ODg5NzM0NTI1NDY2OTw8Oz08P0E/QEA9Pj44OTs4Njc/OUJFQzw7PD5DREM9QDs9Nz1DQ0BFQjw3Z4yRk4qalZiblZWYm6Knq6aVl5iQlZmhnpeXvrWztLu6ubi5woeYt6u4u8DCxbOjw6e4s72/tMTHvbS7uL62wMTErqCworW2tb2+wcPGwsO5vb/AwL2/xL28ur2+tKeqmLHAvbi1ucCzr6+qqqitp6ekr6eqtLyxtLWor7Gwr6yqoqajrJ+fpquXmqifpaWfoJydoKuwsKyiq5yYm6Cor7Kys6uorre1sq2tqaalqKulpaStqaShn6Cnnp6mqKmmnp+anqGlpqmcnaObl6KmmpuanZ+cmqGcmZ2eoKijn6GfnaWioKOioZSZmpmTj4qLhI2Qk5uPjpiVm5eYkJORkomNl5iYk4uKi32AgIVwYGFeXmtjYm53dXZubFtiUVZcTUc7PDk3OTc5Ojc0NDQxNDM3Njg8Ozs8PEBAPUA/Pj8+Ojo5Ojc6Pz5FRUU8PT1AQkJCQUE7PDhAQ0NARD87NV+MjIaFlouUlZeYl5ifpqellpWVkZebn5ual7mxtrO5vLy5urWqsryxvsG0vMe5uLuuv6fGw7/KxsnIxcXJvMLHx7+xsKe8vL7FxMbJx8XGu8TAxcbAua+9vMC+vrOrqoyzu760tbfCuq2vsLWqq6aqo62kp7G2q7WyrbOtqK6vp6awr7Ktqq+zpKu1qaeopKCgnqmyuL61tbWqqaausre4t7apq7i8ubexr66noqOop6SfqKOfnqCZoZydoqSnp6GelJuaoKGlnqChnpajnZSQlpiboZqflpORlpSin5qenJudoZ6kn56VnJiPkpOPjImTkJefiZCWkZuUmJGRlZaDjJWXlpKLjIh8f4N/amZoYWttZm51cXJ1cWdeX1xSSUU/Ojo6Nzg0ODw3NjU0MjMzNjU3PDo7PDs9QD4/QD48PTk5OTs6PDw+QkRFPj49QENDQkREOzo4QUJCQUNAOTJbk4iEjZGKi5GRlZCSmp2fnJOSmJSdnZqXmpW2sbm1tb6+tri1uLO8vMTEusPHwb+0s8XFxr/CzcfLzsvLx8HDxsfIysXExcO7vLzBxcHFxb/DwsbFwLGTvrq/w8K2trqptLO0qauzu7uxn5uxr6ykrK60p6qpqKqtrKmmpZ6pr6uyu7q4u7e5t7O5uLOurLO0qrC1ub3Bur6+vL60urm4u7qysbS8u7q7s7Oyp6Smq6uioaCdmpudmpyXmpuenJygnZaclpuZnZ6io52UnJCNiY6OkZ6bnJWNh5KLmJiWmpybmJybnp6cmp6UjpiYmpSRmZeeoZWYmpKXlJWRlJqYk4+TnZaSi5F+enx/dGtsbmRvbWlxeG55aWlhXGdhUUZEQTw5OTc2NDQ6ODQ2NTMzMjY1Nj05OTs7PT47Pj49Oz05OTs7Oz89QUNBQkFAPEBDQ0NFQjs4OUQ/P0BCPzsyV5uQkZCQh4WSjo2IjZCTlZGPjZSUm5STlpqRs7e4uLi+u7C1sri2tbbAw8G+w8LAvru+u7u8xMzEzNDLxsa/xcfLyNTLysjGv7u7vsS+xcjGxsTEw7i0wLe0vMHCucK3t7/Au66lrre8t62co7ewpqy0tayupaSjqKSgoKWZqrSxvsG+urm6uLW0srG0tLO6wL7Av769u7u9vsDCt7a3tru7sru+ubi3u7a3tKyoqamrpqijnpOampyYkZKZl5GRmJqXnpiWk5acm5+elJOJiX6GiIuWlJiZkYmVkZeWlZmbmpaYl5idnpyhmJWZmZyYl5ybn56jnJ6WmJeTl5yZmZyUlp2UlpOJdnl6e3Zua2lndVpmcnhzeWZnXWRbUlhJRj87Nzg4NzYxNjk3NDQzMzM2NDY7ODo8Oz08OD0+PDo7PDs9Ozs+PkRBQURCQEBBQkNDREM9OTlCQD8/QD89MkyWmpaSk4yKmJCKi4yOkpKKiIaNkJiKj5CUl7O7tba/vb2xtrjBvby0uL/Bsbi3vsHFvbu8wsbJv8jOyMHEwcfKysbKxczIzcbIxb/DwMvNz8rGxMPDwcS+uL7Bw8DEvsHPz87Gq6+2tLWroKe0s66ruLWzrKmjoa2prKatn6y1tL/Cvrm4vbawrausr7W0ur7Fv7u8urO5u7i5ubWtsLS9u7G/vLiytrmzubu0ra2orKyqqaeXnpualY2MmJSTi5WWlJyZl5WWmZKYn5mQiop+iYqKkY6Vl5OUn5mWkJSZmJmWmJOUm6GeoZiYmp2ZmZaenpibopqdnJuYmpuZlpeXlpyZlJyYfoB4eXV1ZWVpamddam9teHdjYmBgXlhXRkU4Ojg6OTc5NDQ5NzY2NTEyMzM0Ozo9Pzs9PTo6PTs8Pjo7Pz48QkBDQkJFQj0/Q0NDQ0RFQDk6QkFBQj5CQTVCkJeUlZmSj5qQjpKRjZSVi4qHjI2UiImPkpq2u7S8xsHEwr3BxcLAtLO9v6ywr7rDysPCvs3IxbfByMW/wcLIy8rCwsTJzM3Pz8zDx8bIycjIycfFycfIx7/Fx8TEx8jK0s/SzLy4trS4uMG+vrq9ury6vKytpqq7urm3wLK1uLLAxrq3t8Gzsa2tqau1s7u2w7a2vbWxt762s7e4sLW2v7uwvbq0q7CxsbO8urOzrqutq62xnaOjoJqQjpiXlZCclpaYlpWSnJmTm5+clpGUjpWQiYyQlZOUm56YmZKSnJedlJmSk5aZmJ2VnJ6do5yVnZ+TnKKcnKCfnaOemJSVl5ebmpmgkH99cXRxb2NhZ3Voaml0bXhsXWRbVWBZTEhDNjw5OTg4OjUzOjY2NDQxMzUyNTs6PD47Ozw9PDs8PTw7PD49P0E/RUFCQ0M+QEFARUVERUE7Nz5DQkI+Q0I4O4+akZaalJKUjZCUlI6VlI6Pi4yJk4uIkJObt8C6xsXEw8zCwcS9vrWvt7uvr7O6wMfFxMHMy8W2ucDCwsTHytHLwsPExsnFzNDNx8zJwsLHwcvLyMbMys7FxsXDxsXJzdDNz8zHxMDDwsnNx8XBxMfAu760sLCwwb6+wca/vri2w8K6urbAvrWyrKmvsri+tMC0tLi0t7nEua+8vrm+v8K/tbq2q6qsrq+wt768trSura2utaSlqKimmpycnZyeopydmZOQkp2VmKCdmJiVmZmZl46MlH2QkJefmZmYk5GToI6Nko+VjpCUlaKdnKSem56elpyjoKGipKOkop6amZubnJ2enIN9cnx4cGdgamp2bGlldW50Yl1iVFdVU01HOjc7OTk3Nzo3NDg3ODQ1MjM0MjU7Ojk+Oj08Pz04Oz05OTk9PEBBQEVCQUJBQT9AP0RFREVAPDk+QkNCQENBOjSAoZeUmZiVkImUk5aTiZGMlJGOiJaKi5CXnMXLw8O8wMPHwbm9vbu4tre3rrK3uLzAwsDCx8bHurzAwsTHyMbSycHCw7+/vsTLyMrLyby8yMjJzcjDyMnJxcXDwsHCx8fJysfMyMfIzcbLz8W3wL/AwLu6vbWzs7+/ub/DucC3u8G8uri7ub27srCvsKy5wri9ube1t7q9xb24xsjCwcLGwr28tamurrCwr7O6t7m2sK+tr7OppquprqannqSlo6OjoqCblZiekZecl5GRlZeZlZmRlJiSlYyYo5qcnp2FiZ+TfJKWlZKUlJennaCipJ+en56foaGkoqKjoaOinJ2fnqOhppl5enl/cnBmZWZjamRham1ub15ZXFZWTlBKRjk5Ozk3Njc3NjM3ODk1NjEzNTI3PDs8QDs/PDw6ODo8OTk4Pj1APz9GP0JBQz89QT5ARENDQTw5PENBQ0RBQDozbKKdlZedlo+PmJiZmIiSjZGVkI+Vjo6TlpbKy7u5urnBu7q3vsG8vLu5sa61uri4u8S6vsC+vru8wMXBxsK+xsK5u8O5uLm8vcHHwca7uM7dzsPEwMPBwsHDwsO+vcLAwMHCy8PGzMvFyNHCsL6+uLq7u763tLC5vrO8vrG5tbi7tryztbm2uba5t7GtusG6vMG/t77Ev8bDw8fHwrvAwr/Cv7iys7O1tLGut7S3tbSxrK2xp6Wlp7CtqJ+nq6ajqKWmpqCgn5SYmZSRkZWUl5OYl5qhnZ6hnKGdoaWglpSbkZeXmJqTnpmZqaSlpKWdoqCanqCkoqOcoqGjoJ6cnp6ppaiVfXuDeG5mYWRiYWNkY2piZ2NbWlpcWVFPRT07OTo7Nzc5OTY0OTk6NTMxNDUyNzo7OkA9Pzw8OTc3Ozo5Ojw+QD8+RDxCQURAPz49QkRCQkI+OjlCP0FCPT44NVmfnJiTmZaRlZiYmpeQkZCQk5GTlJKSkpSUxce4tbq5wrm5vMPFwri7ubGxtry6tbnAu7u5tri0tLW/u72/ub66urTAuLW3sq66u7bAt8DenpDCv8G8u8W9u8HEwL6+uLzBwcu+vcnEwMDKwLHBv7u4u765tbe0uLy0vbi1tLCzvLG3tri/tr25vb65t7q+u7/Axb29y8PGw8TAw762ubq2v7i7v7y4trOyq7CwsrWzs66sq6emnqeurauiqKumpqqjp6iqo5+Ym52bmpicnJiXnJuhpZ2anqGhoKGmoJqbnJiboJ+dnJ+coKiho6SknaKfmqKgop+el6Shop+dmpieqKWhi3x5iH1xY2BiYmdqZ2ZpZWleVlZUWU9TTEY4PzY7Ojc3OTs2NTo7PDYzMTM0MTc7OTg/PT47PDs3Njk5ODo7PUA/PkA9PT9CPjxAQUNDQT9DPTo2PEBBQDw9ODdJlJibj5OUkZWYlZGWkpWRkJGUlZSTk5OYlcHCwLq8ub62uL7EwMKxvbqytLO4vLW3vMC8vbS1sbC1t7W7wbi+ub+8vLe0t6+ut7S3v7rQw32Gyr7DtbrHt7a5u725ura7xcXKvbnFwL+8wb64xrzCv7zFuLa3tLi2tru7uLa0t7q1tLi8vbm/ucPAwLu5vLu+vcjEvcfEw7rAvb62sra4srm0usLCureysaysq62yr7Kur6ijpJ6rrKyqpKakpKiqoqemraihoaGmn6Oiop6bnKKfoKOdnJuhn6KgpKCem5eZn6GdnZ6eoaWkoaKioZ6ho5yinqCZnZijn52eoJqZoKKmnYR6g4B4cW1lZWZvaWVraFhYTktLS1JJTEhDOT44PTs2Ojs5Njc8ODk4NjA0MzE3OTk7Pz0+Ojw6ODg5PDg6Ozs7PD1BPj09Q0E8P0NDREA/Pzw6Nz5CREE/QDg4P4mYmoyMkI+Tl5WMkpCakpGXmJaUlJKQmZTDvsbBwby8uLi6v7a8scK2tLyxtLa4s7q9v768sq2vrLGwt7y3u73BxLm3t7a1ubm5ub+/1513ganEx7e5uK63tbi6tLezu8XGy8G8xsDAv728v8jDxcW+xri1srK9uLi4vrq6uby6urS3u7q5v7zEwL+5uri/ubvFxr3Fw8Kyur27sa+2uLO3s7q+wLm2rLGrrqmqqa2qqq6mpKWnrq2ppaOio6GkpaWmoqato6Klo5+ho6Gcmpyhn6CloaCenZygnaWgnpeVmZ2fn52gn6KmpaCknpybn6Ofn5mcmZ2epJyWnKOcnqGcppZ+f4d8a25wZ3Brc2ZhbWBcVElLSkRKQkNHPzo7OD48Nzs7OTc4Ozc8PDYyNzUxNjk8PD08QTs8Ojs6OT45Ojs9PUA+RD89PkRAPz9BRkQ/Pzw9OTc/QUNCQEI5Ojl3nJiLh4uQkpOWjY+TmpOQnZiSkY2PjpiSvbfHvsO+vbu+vL22uri9ure9s7OwuLi1uby8wLeqraSusLe7s72+u8S2tbi3usO/xbzBzsSAd3mUxs/CwLivtbW8vri6sr7ExMrFwcnDwr+/vr3HzMfHxMe9tbW2wb27u7/CusDCv7y2t729vcHBwL+8ube8wru3v8W7wr++tbe8vK+vt7awtLO6ubq7r6mtq62rrKaqoqeuqKWqra2vp6Sgn6ajnqKjqKOjq6Oiop6dm5ublJaZnJyfpZ6fnpmYnpejoJyXmZqZmqOjop6jo6egpqCbnaCjnp2WoJmcoKCblJegn6WcmKKQgYaBcWZsaW50bnhjZ2JbY1FLVEhFRUNIQzw7OTg9Ojc6PTo4OTs3PD01MzY1MDY4OTo8O0A9PDo+PDk+OTk9Pjs/PkM8Pz5APz4/P0ZEQEE/Pjo3P0BDQz9APTo4ZqGYj4uNlZKVlY6PlpmVl5uVjoyMjY+bk7m2wbS/vLm8w8C+wLq1trKywLmvsry8sLe7tru8qqqjsLm+vrK8vrzEt7K6sKOnubO9x8yidHl6l8/RzMrEtbrAxMi/v7W/wb/Gxr/LxsO/wrzAw8zKx8XGwLm9vMS/v7/CyL3Hx8XFvLrEv7vBv7rAvLu7wMS9t7nCub69t7S2uLqur7WxsLCytre0t6yurKqsrKuoq6Gms6qlra+trKippaOkp5+io6Onoaeiop6cnZyamYyQlpeZnaKZnpuVkp2UoaCdmZ6fmJimpqKfoqKmoqeloqCko6GbnaCbnKKfl5WVnp6kmpafiYGDgXRvbGx0a2xuX2JeYGJOSU0/RUA/REM7Ozo6Ozo4Ozw6OTw+OTo+NDQ1NTE5OTo5PDtAPD89PTw4PDs6PDs7Pz5DPkI+QD89Pz9FRUJBQj87Nj9CRUQ9QUE6OlmfmJOSlZqVmpOQlpeclZuZlpSVkZKTnZm2uLaxuru6vsG5uca7trWypb69tLbBv66zvbS4wbGwsbPA3NvFub68xL64oHdrb3FrgJW4h3N+f5nKzMvNysbCxMvNxb+5vbm5wMO/yMbEwcG/xcDKycPDxMO5w769ub+8wsbCyc7Hxr66xr26v7m3wLm5vsDCvrW0vLi2u7CvsrK1r7Cvrqyus7CzsrirsbKxqrCrq6yrrLatqKyusqarrKmpoaWgpaakrKSmoaChnqGgnaCMlJeTm5+mmZ6emZOYnZ+gnp2eopuYp62ooqSgoKKqpqmhqKGlm6CgnZ2jn5SYmKKdp6Gfm4J7eoh6bW13e19wY1tdX19UST5DRUlCQz5DOz42OTo7Ozs7Ozs7PT05PTU2NjIxODo5Ozs6QTs/PDw+Nzs8Ozw9PTw9Pz5BQUE/P0FCQUVDQkRAPDY+Q0RFPkJEPztTmZuZmJ6dmqCalpyZn5KdlZ2boJWWlJqYur20sLu8wcTCv8XGura5sqO7vbS3xLuwtbq2ucS4tby2wYqt2MS+tsC+nX1kWmdSTlhcdnx0foKfw8bLyMHDwcDJysjBu7uws729wMXGxcS/wMG/y8fCwMjAusK7urO6usG+wMrOysS9tby8ub+5ubW1s7/Avre0s7S4rbeqr7CwsrGvq6+nr7ausrG5rra2uLSzsLGttrS6sa6srranrLKsraSjoaenqLKrqqWkp6elpaCml5ujn6SmraKeo6KanaWiop+foaWenrC0sKSlnp+kqaevp6mgq6CiopqipJ2anqGmp6+psZWCe32Bem5zeHNncF1bXl1ZUkZEQ01JQUU9SDs7NTk7Ojw8Ojs7Oz0/Oj01NDUxMjc4ODs8O0I8Pz46OzY6PTo7Pj0/QD87QUFBPj4/QkBBQkJFPjo1OkFCST9AQkA7TJqdnZ6fnZienZmampySoJWbnp+blZGRl8W+urbDvMbCvr/Ixbe1uLe2ubu0r7e3srWzt7m8u7a6wLdlbqbJwLa3hmJgZlRkXU5OUVRodHuIpL6/xsC5wLy+xcTAtbqysK2/ub/Dx8PDvb2/v8PDvr/HvLy/tLSutbW8vr/OzcvCt7K4uLi9ubuxtrLIwLu2tLGwt6yzqbCtrbS3r6uuqrG1r7Gvt7O6usC/tre2sru6wLWyrbO3rLC6r7KloqWrrK+5s7KosK+xr6qiqKGkraitrLOun6inpqWmq6Sknqaqo6ayuLOrpZyfp6anrquqpbClpaWbpKOYn6exrLW4sLKOhHl/fXZsdXtwbmlbX2BZU1BBRkhHS0BEQ0g8PTY7OTk8Ozo6Ozo9Pzw9NTU2MTM2OTg8QT5AOz1AOzs5PD04Oj08QD46Oj49Pj09PkBCQkJBRD03NDU9REc9Q0I/PEWUnqCgoJyXmpiYlZmdmZ2fmp2bnJaRj5LDwMK9wrzEvLy7xbu3s7e2tru7s6CWtayvsbS0tLa4uMu1bWdvmLW4hFlORmZMT3RqYE9NWHR6jqy4t8K6s7u3u73BtZ69rrCwtrO5wcLEw768v7u6uLbBwrW/urWur62wvcC5z8rJw7GvtbS0vbq+ubq7ysO7uravsL2xuK+ys7C3vbaur66wt7CsrLK2vbzEwrq9t7bAv8G3tbC2srGzurGxr6err6u2v7e1qbqztbmxp6uop7ausrG1uaisrK+qr7CqqKessayytr20saykqKuoqKusq6i2qaaonqadmKOuvLG7wbSmiYF8gnpzdXZ3bnFgX2ZdW1RKPT8/RkY9RkNDOTo1Ozk5Pjw8Ojo8Pj4+Pjg4MzE1Nzg5Pj9BPzs6Pz08Oz09OTs8OTs6Nzs+PT1DQT8/QUJEQkE8ODU4PUNGPUREPzw/iZ2en52Xl5WUk5aZnpubmpuYlJ2Uio6Owb7Dwr6+vrm2usCxtbGzt7fCtbOrrbOoqa61r620trjNtnl1ZXOcol5OR1V6TEhmfpSDW0N1iZmrsbe+ubK1sry5v6qIvLOzt5+ouL3DxsTAvb+5s6+yvLquu7Szpquorbq+uMvCv76sq7Cvs7q3ub67wMXBu7y3sLXEtb+0uLu0u8PCs7a2sbisqaWrsr23v7+7u7exvL28trGvq6uprbOvsLCrsLSpuMC2sqm0tbC3tq2spqu7s660uMKwsbG1sbK1saywsri4ubi+tLGzrqyxramvrqqyuK6trainoZ6ptr+4ur+wlol9gHxxdHd0d3JsX2NhW15PSEI/PUhDRk1DQDc3NTs6OT48PDk4PT47PT86ODMyNTc2OD8/Qj86OD4+PTw5PDk7Ozo8Ozs6PEA+QkI9QEE/QkI/PDs3OjxBRD5CQz8+QYqgm6GdlJiVlZKYmpyWm5WalY2bj4SIhru0vb+7vLm3s7y8rLOytLS2wLXAr7Kzqqqxt62pubO2x7OAeXFsi3ZRRUd0f01OT1+KgXBGUn6mtLC2urW0sqy8ub6fd7m8ubd2lL28wcfDv7m6ta6lrLOwprCtqJ6gn6WttrXCt7a0pairqLC2s7K6tbu7u7W4trC1xLK+vL+8ubrFybq9vraxp6SeoamxrrW5trKxq7S3trGopp6gmaWmpKynq6y2qa+6sa2kpq2lq7GrrKmtuLawsrjBtrGxtbGvu7ayt7W1sry1urKwsbKutLKqrq2nuLWyta2uqqiosrq9wLa0qY6Ce393b3tvdXJtY11mWFxdUk5OQT5KQkFKSUA2NjU7Nzg+Ojs4Nz4+PDs/OjkzMjc1NzU8PD48PDg+Pjw8OTk5Ozs7Pjs7OTw+P0E9PEJAPz9CQD47Njc6QERBQ0E/QUKJoJ2loJSWmJiVnqCcl5uYmZGMmYmDhoS1r7S7u7S1sLG2uq6wtLOvtbq1urC1s7Kttrqvrbyzt725jYJ6enlkS0d7fGFNSVFlp6VhTkpwrruws7WytK+su7jBjG+txbitXHa5try8uLaysa2tn6Snp52jpp2WmZman6muuayrq5+lqKSrrq6nr6yvsbGtsa6usLmwtLy+uLm4x8W8vLu4qaKcmJufp6assq6zqaapqq6popqXl5GcmpijnqKir6ekrKaompqemqGnp6anqa+2squ0trCqsK+xqbm2sbWxrqy3s7avrquuq7S1ra+rq7GtsbKoraurs7W3ur2wq6GLeoJ5cnZzbXRpbF1balRdXFBNSERGTEJGTkY4NjY1OjU6Pjg7OTc8PTo7PTo5MjM2Nzc3Pjs9Pjo6Pz48PDw6Ojs5Oz47PTk8Pj1CPDtAP0A/QT8+OjU1OkBFQkRBQEJBiJ+ipqGYm56dmqWpmJudmpmUjJmHhoeGrq2uuLmxsqiur7iyq7CwqrK1ubm+tbK4tLm6trm7tbWzv52Hh4uIWkR2l3JbWkleYFKRcW5toMG4s7SysLGtsLm4v3JnoMKysKelsa65rqqrrayjqKGdnZ6XmKGVkpWXkJifqK6ko6Sgoqeio6mpoaanpaqtp6ynqKesq6yyu7SztLm6trK2ramgmpaWm52fq6yqr6Oko6GpoJuTjo+Qk5KSmZaanaSloJ+ep5iVkpSZnqSjoaWqrK2iqaqppKmtrqW0sa6xraqprq+wraWmqqSos66trKmmpqmrpqqnq7Ksr7Oxq6mWgX+Bd3J4aHRzbmRUYGNXXFFOTEhASFFETUM9ODg3NTo3PD46Ozw4OTw7Ozw7ODI0ODk3ODs7PDs4PD0+Oz08Ojk8Ojs9PTw6OkA9PDw7QD5CQEE/Pjk1ODs8RkFDRD9BQYijpqKjnqCfp6Coqpufm5yZmI6Xi42PjKqpqLGvsK2lp6ayr6mmq6CvsLu1vby4wMG+vLy8ua6sr7aplo+TqE9KfbNsanFda151cWNjboexubGts6+urK22t7Rdg6WrpJ6dnZyeqKieoKipn6GnlpuXl4+dk4+Qlo6Xm6SooKCioqKlpZ2jo6CepaCkrKSmqKSio6OrrLOuqa6urqeqraisoZyamJmYm6moq6ufpqKbo5yVkIyPj5CTkJeVlpifnp6amKaXk4+Slp2ioKWipqSnoKKko6Ghq6uksq2qrKyno6yuraufoaKkpK+srKmmo6KqpKqqpKmrpqmsq6agiHiDfHZ/emN3bG5cUWhUUE5HUE1MQk9RQD47PjM5OjU7OT07Ojk9OTk8Ozw8OzkzNjk5Njo7Pz06ODs6Pjw6PDs5Oz07PDw9PjxAPT88ODtAQEE/Pz45NDk8N0FDQkQ9QEOOqqSjoqGinaulpqimoZ6dmZ2PmJWTkJWnpKGmqKmlpKChp6uhnKKbp6u1sry9wMLCwL7AuLSnpKyps7OirZVMVHKmc3R9jHNObm1lcHBuk6i2qrK0rqqrr7CwobGmnZGYlI+YoJ+ioJykpZ+eqJSblpeMl5GNkJeTmJ2iqp+fn6Cjpaicn6ChnKKfo6innKehoKSfrKisrKCpq6agpKimrKOdnp2Zl5qrpqqxo6WonqCclZOQj5GQmJCWlZiXn5ibmZqjmZeUlpqdoJ2nqKWgo6Kho56doKmqpa6upqipoaKqrqqnoaCio6msq6eppqShqaKlqaalpKKmpKijkn18gHV2fW1re2RoVVFjTUpIR09STUpORzxFQDwyPzg1OTs+Ozk5Ozg6PDs7Ozk5NDg7ODc7Oz48Ojk8Oj07Ozw9OTw8PD49PUE+QEJAPTc6P0FCQEA/ODU1PDpAQ0BEPkFGlq6koqWeo6KpqKipqqWmnp2imJiZmZWbop6bnqOioKOgoZqgmJeXlqGorK62t7q5ure3u66ooKGooK3Bv6hXWnh1bnFaX2RiXFlbaWxiZnODsq+us7Wqpqyro56ZlI2RlpeZmZygoqKcnaWem6SXl5eWkJKRkZOal5ugpKqeoaGepqeqop+gp5+dn6SnqZ6jpp+qnaqtqq6nqLClo6Smp6ymoaShm5ier6iusqulqqqgmpiYmJWTlpqTlZWalpuXl5ihnpycl5uhmp6ao6eln6GioqOdm6Gmp6aoraOppZ6kp6mkpaWhpaSsrKmmq6eioKSjpKenoaCgpaKmoIl7gH13eHxkeXlgYlJVYEhJSktTVElSUEw5P0I2Nz02NTs6PDw5Ozs4Ojw9Ojs4NjU3OjY5Pj0+PDk5PTk9PTw+PTs7PDo+PTw/Pz9APT03Oj5AQEA/Pzg2NT08PkFCRkBAR6CupKaroaOqrK6tp6ypqKCipp6bm56aoJyalZmfn5uen56WlJOXk5KcnqSorq2sq6uvqq+pnpeepZ2ev7d4Y3J8ZmdlV1paUUpHS09QTFViX5uysLC4rKahnJ2alJeampCOkZWRjI6OlJminJejmZqXmJmUmZiWnZufpaapoKajnqeurqumorGjmqSmpqqioaqiqaSosquxsqu5qKarp6urqaysp6Cgo7GusrC0qrKuopmcnZ6hmZubmpiZm5SWm5aZnKWhoJqjoZqcmZ+kop6gn6KmnZulpqWkpaijp6OepqOinqaloqWlqKykpq2noJ2dn56gpaGenqWgppmBe4F8dnZzaIJsZVtTWlpNUUpOT1VMU0xBNz5CNzg9NzY6PDw9Ojw5ODo7PDo7OTc2Oj01OTw7QD03ODs3PTs9PT06Ozw4Pj09QD5BPj4+ODg8P0BAPT43NTg9Pj1BQEZAQUihqqCrq6GkqquwramtqaelpaWkoKGfnqWXl5SYmZ6YnJ2blo+VmZKRnJihnaqip6Cep6Gln5ySm6KanqmnnYdhWGZoXE5KRkQ+QEJFQkNMVk99sa2sr6efnqKglpCTm6CbmZeSk5+coaSbnpuWn5qfl5uinqWhnqSfpKitraisqKSstLe2sKe0rKKtraOvpaSmoamorrWzsr23vrCssa6tqaq0sbCoq6iytbezuK2ytKSgnaWfrKGhoqCgmpiWlqCbm5ikoaCeo6GgnpqcpaCfnZyhqJ+fp6meoaOkoKagnqehn5ymo5+ipaOooKmrpZ+dnZudmqainpyjnqeQgYJ/fHh1aXd1XWxaUmBIUlVIRlVWSkJMRz1LSDhGPDc3Oz49PDo8OTg6Ojs6PDk2Njo8Nzs+PT8+OTc9OT47PEA8OkA6OkA/O0A+QUA9PDk3Oj5APzo+NzU4PT0/QUBEQEJGnKueqamipamprqimqqWmp6aoqqGlpKOmkpOVmJacmpqcmpWTmZuNk5+ZqJ2un6eenKGdnpqZkpiem6GhoJ5/Y2VmWEpCSU9mUktBQz5ARklIX6Oqqqmkn5+ZkpGTmJiWlpWMiIuOlZ2dnZ2el56Zpp+gqKWxqqeuo6uttrC0srGutri9wLqttbSwt7CutKmmpKWsqbmztbvDvMPBtrq2q6+xube8r7OwtcG8t72zs7WirKKpqLKpq6inqJqZnpqqp6CZp6Cfn6enpaSfnaqiop6bn6igpKetmZ+jnp6nnqCmnpycoqGbo6KhnZympaWkn6KZnJukn6CboJyjiYWEfnZybWl2bWhtXFhcQ1dOSkdNR0JGTTw+TD00PDk2Oj0/PDs6Ojg4PDk6Ozs8NTQ6PDg5Pj4/Pjg4Pzk8Oz0/Oz1BPTo/PjxAPj8+Pz08Njs/QT07Pzg1ODw8QERCREFCQ5WqoKapo6mqqKmjoamgpqinrK6lqaWpqpSSl5mUmpqanJiYmZyamJmqoLGit6Swpp+enZ2XmJWZnpqco6CLd2tfUktDRFZ/i39oRj06Ojk4UYWqramqpZ+en6KjnZ6dmpyblJOVlJ6emJSGnZqhmqukrLKwubKysbKxur28vLm2uMO+v8K/trq7wMS5vbusr6exrbHCtrjCxsDIysDKv7C5ub25wr64s7vGw7zDvLezqbOtqrO1r7Ouqq+jnauntrGtoq+moaOvsa2wpKWvo6GgmqGnoaSqqpmdoJmao6CmqKGcnqKemaSenpiYo6OhpZ6mmZuipJ6fm5ubnIeFgXt0cmtrdHJxaFZcUUZUSERKUEk/RUE0Rkc5NTs+Nzs8Pjw8Ojo4OTw4OTs4Ojo4Ozw3Oz49Pj02OEA5Ozs9QDw9QDk3PD07Pj0+PUI+Pjc6QUA+PD45NTg9Oz1DQEFDQkGRqqGlqqelqqimn6KnnKasp7Gyq62jqayVkpWalJecoqGbnqCinJ+psqu7sr+rr6ylnqCgnJyYmp+gmp+fdWleVEpGREZns8TBjV1QSUJPe6qyp6OjoaCepaulnpeclJGZnZiUjIqGiIZ4bYigpKKrq7O8tsO+vrO7wcPCxcC/wsbGxcPIwsDFx83QyMvDsre1vrK+xbu+zM3FzMzM0se+v8DCvsfGwrfEycnDwca+urS6urW7t7C1sqq6sq67t7+7uqq3rauquLq0vK6uuaOmo56mpaKjqaaZm5+Ymp2nqqegoaGkmJSjlpSZkZydn6Sep5+en6KdmJmUmJSIhH16cWtjaG94a2VaW0ZLTEVEU01EQkU3Oj87NTQ5OTc5Pj87PDs7OD48Njo9OTw9OTw9Ojs9Pj4+NztBOj45PT45PT44Nzs6Ojs/Pz1CPj83OkFAPTw9ODY2PDo8QT9BQUE+kqugp66ooqulpKKipaGlqquwsq2upKmmlJWWmpaUm6SmnaGqp6KrrLy8v8PBsrK4p6Ghq6qhnJ6hoZ2cl2pXTktJSEhTfdHLtJOcjoKWr62hmZubnp6Zl5eXkoyOlpeTjo2Qi4KDgndzcW5xjqWssLm9xbvNx8u/wszOzczHydHMzczHycXFzNHS1c7Tyb3Av8O7xsXIxdHTzdPQ09PMysLFxsbKyM6/yNHMx8XHxcG8w8G/v7+2vrOuv8DDw8fEx8Suv7iyuLzDwsK6vLy1rqenraigoqmlmpagmpmdqKupo6SknpePm4yQmYmVmJugn6OdnZeempOTi5WPhYB5dHNlYmdyb2ZeWllDTkxERVBJRENANTU1ODpCPTY4OkE+Ozs+PDk+PTc6PTk6PDg8PDw7Pz8+PD0+Qzw7OkA9Ojs6Ojg4ODk7QT48QD8+ODtBQTs7Pjc4Njo8PkI+Q0FAPpOvn6ivpqiro6KloKampKuoq62qrqKqo5Kcl5ebmJuirJ2frqalsarFxszOzb+wwaikqKytqqCdo56cnpNcTUNGSUlZZpK6rI2DtLmxrKOenJ+al5aUkpSWkZCPjIeDg4iHg4CBgYB5cnJwbHimwcrKxcrB09LTyM3O0dPR0tHQ0dHNzs7Qxc7U1djS183Gx8nMw8XKz8rT19HX0tXW09TIzMbMzcnSzc7TzcXIycrBxsvHycnGv8Ozs8jEy8vLz8bKv76/vcHHxMzMyMnAw7+tr7OonqKqo5qTnpyYnqaprKSlppaXipWFkZSHkpKSmZualpiQm5WQjIaRi4B6cnV2Z2NndmlkVldRRE1GQElRQj1CPDoyMkE8RTw3OTxCPTs9Pzs7Pj05Oj48Oz44Ojk5Oj86Pj1APkA8Pjs+Ozk9PTw5Njo6Pj08PEE/Pjk6QEE6OT44Ojo6Oz4+PEE/QT6QrKKiqaanqKSfop2qqKOso6OnpqyiqZ+To5iWn56dpK6bn7CrqKyxyc3U18/Gu8esrbO3rK6jnqOinaGeXkg+REVXZoasn56hraujnJycoKShnZqUk5WUiX13cGtlYmhxb3F7hYqAdnBucXNviMPPzcjR0NfW1tLWzdTW19TT0dPU1NPP0cPQ09bY1dbSy8nO0cvGzdLK0tXW2dXX09fYztLKz9HMz9DM09C/yMfKxMzMzM7PxcbHtr/Kv9LNy8/Gyci/xMPHzs3Q0c/NysjNuLe7qJ+lq6eemJ6jnp2qpa2pqKiSlYiQhIyRho2MiJOVmZCWjJiSj4aHjIR8eHN2cGNgZHJiXVJcSUpHQUVJSj47QTg9NDU4Njs4Njo8QD07Pjw7OUA7OTo8Ozs8Nz09Ozo+Oz08Pjw/Ojo8Ozs5Oz89OTU7PD48PD0/Pz46O0BCOzk/OTg7PT0+PzxBQEQ8hqugnKegp6Oim6CbqaSlqaCfoaGmn6ifmKSimqmmoqarmqOwsamotdDU19rSx8bLtLXBxbG1qKGkpaChqXBHRUVIYoS8xKqrqpuUl5+cmqCgnpucmZWJd2ljYF9fYF9eX19dYmx1c3Fwb2xycXWPvcnF1NbX19fT1s/V1NrU1M7P1dTU0dHM0c3T19bT1dDP0tPRydPRyNDX19jR19LY2dTWzM/Pys3Ry87QwMbDyMbOzdHR0cjMzcDKzMbTzszOyMTKx8fIzMrU1NHVz9LM08G5xbGlqLWup5uorKWdsqiws6ysk4+TjoiKj4OPi4SQjpmNk4+Zj4+ChYx8enFzdG1hY2ltX1ZQX0pKQ0ZDUk0/PD41NDo9NTI4NTU8PEA8Ozw6OTpAOjg7Oj46PTg+Ojo8QD08OTs9Pzk6Pz07PTw9PTo2PD0/QD08PT0+OjxAQjs5PDc0Oj48Pz89RkFEPYKknKClnaWlo5mcnaSeo6OfnZ+doJqnnpyhqZ+vraqqq52mrreoq7fX1NXZ2dHO0L+8zMm2vq6mqqiho6+CYmtqepzCv66on5eVl5manJ+dmJyckn1wZWNiX19hX15hYF9gYF9gZm1wcG5rb3J3d5nKv9LV09jY1tnR0tLXz9POy9LN1dTSys/M09bS0dbNz9XV0cXR1MrQ1NXWztLQ2NjX18vIzsTJz83KzMDJwMjKzc7Qy9DNzszOz8jL0NDLzsrCycfJzMrL0tPN09HR0NDKvci5sK67uLWqtrCtqLits767sZqPn5SRjo2IjpCFkY2ZjJGRlY6RgIWIenZvcG9rYWRucGFXXFpJRkZETVhFO0A9MzM8PDg3ODY1Oz5APTk8PDg8Pjk8QDtAOj04Pjk4Oj88PTg7PkI6Oj08OkE9PTw6Nj08P0A9PDs9Pjg7QEE9Ojw4ODs+PD4+OkVCRT6Bn5mlp6Cfo6eam5+cl56eoZqdmpyappufpKefuLa1taykrK6+tLDA2NLX2tzWzs3Kw9LPwcCwqaytqaeWe4iMqc3OsZualZSWm56enpyTlpeUiGteXl5hZGJgYGFhYGBhXl9fXl1ibXJvb3N0dXZ5pL3L1dDV09PY1s7O1MvNzsXOytLSz8fOzc3Uy87TzcvX1tDM0dTLzNDS08rO0dXS1dXKwMrCxczCyMnDzMPFyMrKz8rNzNDN08vGyM/NyMfLxcbBxsrMzdDRxtDOzc3Mz8XHwbi5vcPDvcO4srK+sbvDw7WqmKWimZaRlZWSi5SNmpGUlI+PlIKJhnlxcmttZ2BgcGhYWGhWTEZMSVBRQjtDPjs2Nzo4Ojo1Nz09QTs6PD05PD05PT06Pjo8ODs9OTtAPD47Pj5BPDk9Pj1CPTs3NzU/PDw/PDw7PDw4O0FAPDo8OTs7Ozw9QTpFQUU+hJ6bqK2epKSqnJ6fmJKXm5+am56ZmaKVoamppcTCwb+7tbKxx8K4y9XV2drb2MzMz8jW1cTCta+0qKCueGWDg7rOqpSNjJeVkJORkZWWlZCLfGVhYmJgXV5hY2FgYF9gYWFgX11bXWdycXFyc3FucnmjxdLOy9DP09TKxcnJxsa/w8bPzsfFx83K0sjLzs7G0dLQzczUysfLzs/Ix8/Sy9HPxrrEv8bJvcLHyc7FwsjAx83IxMzKy8/IxMTQyMbCxsjEv8HHzMzMz8LKy8jHy9DExce7x8PIycLPwL28v7DByca5vaqwsqelnaKcmJCbkKOZl5mRlZiJj4J3b3Rka2BeZnBhW1dgR0hIR0lNVEc/Sj02NDM1NT09NDg9PT06Oz08OTo7OT89OTw7PDg6PDo6QD1APD09Pjw6Qz48Pz04ODk6QD4/Pjw7Ozs7ODo+Pzw7Ojc5PD49Oz49RkFDPYOgm6qupa6qq5qdoJeUjpedmpmgmpqcm6WysazJzcrIxL68us3NxtDV1dna29jQyc/P0dPIwra7u62ksGZmfIzRq5COjZaPhoODg4F9hIR+c2BbXl5eYF5gY2RjX11dXl9gYF9bWlxha3Jyb29rbG9vfbfQx8nKzsvNxLrAw7u7urq+ycbCw8DDyMvJyMrIwcXMxsjLzcnEwsrJwcLM0MXLyL+5wbvGyL6/xs/Lw7/Du8nHyLvIxsXKwL3Cy8bFxL7GvLzAw8XMxcW8wMrCxcfSxcDJv8rJxsjG0MPDxsOvxMvHw8q3v7y6tKmspKWYn5iso6Glm6Ogm5R7d3J0ZmlaYW5sWltYUkRMRkJHRExERlNANTQzMzQ/PTM6PDw7OTw8PDg7PTtBPTo8Ojs3Oz05Oz07PTs6OD4+PEI+Oz88OTk7Pz07QD48Ozk5OTk6Oz06PDo2OTw+PDs+O0NCRD5/pZypsqm0rrCdnp6YnImUm5man6Kfmp2ov7i8ys/RzMfCw8bNzs7M1c/V2djZz8vSzc3OyMG1w76ysqRdanOmuI6KkpeGeoCFhX92eHVycF9bW11gYGJjZGRlZGBcXF1dX15gW1laXGJvcm9raWtwb3KPxbzJxMu/xsGwtrqysrOyscK8vLy6uMHBwcW+vbm9v7nEysXGwr3GwLi7xMm/wcm7t7u7xsO/vMHNw8a+vrXBvcO6vca7wrqzvMXEwsK2v7W1vr+7zMO8tbrIur++y8TBxsLFycbJxtDGwszHssfJw87NwMXDwL2zt7Cyp6ioubClrbCqrayUenZ3amRnYGhvY1ZeWUpGSkZISkFFQkVJQDk6NjQ4ODU0Ozo7PDk8PDs5Ozk6QD46Ojw6Nzo7Nzo7Oz88OjxAPUA/PT8/Oz07O0A8Pj4+Ojk5ODk3ODo8PDw7OTo8Pjs7PjpAQEU+fqygrLWqt7SyoZ6fl5qNlJaan52mop2et8XCxMjO0srKysfNzc7RyNDG1dTW183Kz8XJxcfAucW9q6+SXW52qJKLiIuFeICGhn9+hHt0dGNcXF1eYGBiY2JiZWViXVxbXF5cXl1aW1xeaHNxbWdnbm9yeJy8y7/CusC3rrCxp6qtrKe4tbe0s7O0u7W+srewta+yvMK8wcS8wLu1srq+wLjHubS7tsHCvLi9xsHDu7Wvsra6v7TEt7u0q7i9vcC9sbq2sLa6s8W8tq67v7W3tMW8vsPFwMPFxsjLxcDGxrvHy7/PycfDxsLDt8O9vba5vse/rLW6tbe2jnl0eGdnZWJrbl5WXmBGS0hISkZCREFFRT88OjU2NTYzMzs6Oz06Ozs6Oz44PEE9PDo7ODc5OTk7PDo+Ozk+Pz1APz5CQD1AOjo+Oz89PTk6Ojo4NTY7PT48PDo7OT49OT86PEBAPIi3pauzsby8sa2foJmUlJiXnqujr6qnpMbLzcjFyM3M0MzNyMrIysnKxNDN0s/NxcfBxcC+ubfJtqqwiF5xgZeNhYiJe3h+hoZ2d4F8c2hdXV1dX2BfYGRhX2NlY19fXFteXF1eWlxbXV9rcG5pZmptbnJ7pMa+uLe0r6usp56iqqeeq62zraqsqbSut7Gyqa6mrLO8urbDubq6sau1ubu0wrqwwLG+vLu2u8e5wratqqiwssC2uL2wsKeys7W7vKuutaautq+7srCqubCtu667uLvAwL65wr/Hw8XAvMbBx8q4xcfFv8fEw7rExsK7xsnMy7O5wr27s4lzdnZraWBibGhZV1dbQUxLTUlFQUM/RkE6OTo5OTU4NTQ6Ojk7PD07Ojs+ODtAPD05Ojc5Pjk7PDo4Ozs6Pj45QT0/QD87Pjo7PDo9PDw4OTg5NzY4PDw9Ozw6Ojs+PTs/Ozs+QDyKwKuouLe5w62zqZ2ZlJaZoZymsLWxt6bFztLLw8XBxdDHzcHDxr/ExMPDysHJyr6/vMC6srS0w66psIxobISSh46Pe3h+ioV6e4SAd25eXVxcXV9gX19kY2JjY2JgX11aW1paXVpaWlpcZG5vaGdoaWtucYGsuK+0raWkp6eaoKWhmpylq66kqKKsqq2qsKSmn6qttbaxvbmvt6+prri0tLy4tLyvuLm1srvBssCupamjq7Gys6i9qquoq62ttLOmqK6hpK+psqanqK6mqLessbK3urq8sby9vr7Ev7XCwcfIt7/AxbfEw7+7v8TCvsTIzMq/vsTAwKmHc3RyamlcYW9kV1ZYUEhZUlNLRkZFPj5AOjc4OTc3NjQzNzo5OTo8Ozs8PDc7PTs7Ozw4OT44PTs8Njo9Oz89N0E+P0A/Ojw8Oj05Ojs6Nzc3ODg3OTw7PDs5Ozo8OTc5Pjw+P0E7jMKvrry3ucSwtrCbmZWcmKqpsLGztb2vxdDPzMPIurrLwcq+u8m2vcO+usm3wcPBtLW7tbCutLutp6mNaWCGhIeLgHt9f354dH58c3dlX11cXF5fYF5fY2NhYmBhX15dXFpYWVtbWVhaXF9ma2ZlZ2Voam9yhamkqqWem6GllJ6km5iRoaOqo6OgpqWopa2gnZykpqyysLa3p7CsqKq0q7S6sba2rra5sq+6urG2pKCkoKaxp6uouaqkp6eop7KtoKemn5ukpqyen6ejoKGxra2ssrSztLC1vLa7wcGyur7DwbK5ucOzwb2/tbi8vb68wsfEwsO+wMSgg3hxbGFmX2tvYFRZXkhOZ09UR0VLRjw9Pz06Ozs4MjU1MzY5OTk7OTo6PDo3PD88PDs8ODg8OTw6Ozc4Ojo8OTg+Oj89OTg8Ojs9Ojc2NzY3ODg2NjY7Ojo7OTo7PDg1OTw6Pj5AO43ItbW9uLrAur21oJ6VnaGmurars7O7s8TPyMvCxri2x8DMv7jJt7vFuLPEuLO+wKu1u7GrpK6yrKChjWRvh4WGgHx5dXNvbWpqaXBpXmBdXFxcXl9fYWNiYGBgYF1cW1xcWFlYWFhWWFteX2RjYmVnZ2dqbW+HnKiflZWaoZacopmWjZ+ho6ecoKCkpqKnnpuim5+rsK2xtqOpqqqsrKS0ua23sKyzta6yta6wqp+en6SisqSmqbitoqamoKisq5mfoJ6ZnZ+lmpmjnJudr6mrp6qsrK2xsrivuLm7sLa8vLqrs7O5s760trKxtrW/tr3AvcPBu7u9l4R6c2xfZV5kZFhUV11JV1xLUEdJSkdBPD8/QDs/PDA0NTM1Ojs5Ozg5OTw8Nz4/Oz07Ozg4PDg5ODw3ODo7Ozo7Pzo9Ozc4PDo9PDc0Nzc2NzU3NDY2Ozc5Ojs6ODo5ODo7OTo8PzuJyba4vru3wcHBtKSkmZqkpsCyr7astLfGz8jIwMa7u8PDz766x7i3vreywbSxu7uruLmwoZ6oqqaXnpBmfoWGf3hybW9ta2JeYWZmXV1eXV1dXF1fYWFiY2NiYV9cW1taWllYWFdXV1hYWFpeYmRkZWZmaGlrcYynnJOUlJuYm6KXlpGcoqKpnpydpaaipZygoJuZrq6urrKgpqKuq6eitbGysqyor7KnurOmtaCin5yjoa2joqq1qqKjpp6lpqOWmZ6XmZudoJqXnZ2dnK2iq6ekpKatq7O0qrWws6uyubSvqq+ysrO4s66prK6yuLG6trq9v7ezsZSFeXVmXmVeW1lWU1pVS1tRS0lFSEtJQj0/QUFAQToyNDUyNDk5ODk7OTo9PDY9Pzs8Pjs3Ozs3Nzc+Njo+Ozo4Oj07PD06Ozw6PTs4Nzk3NDY1NTQ2Nzg1Ojo4Ojk5PDg3Ojg5PkA6gci9t72/tr68v7OdpaOYpbHCtba9rbS4wszIxr/FtsHAxs63wMS9s7m5sr+2sbi6rLG0rZ6Zo6ifkpqHbn+DhH94b3F0cWhlY2hkY1xcW1tdXVxbXmBhXl9fYF5cW1pcWllYVldXVlhXWFdWV2FkZWNkZWRkaGp2oZuTlI+Vl5egl5mVl6CeoZ2WoaGppJ+eqJ2cmqunr7Crm6OkuKqhoK6otqqmp62wpLiwpLegopyZmaqmoZqsuK+ioaScop+gk5ShlJaWm5iXlpeclZ+qnqmkop2jqqqwrqi0q6qnrbOwpauus7Gwr66vpqensq2xtLC8tLm3rqOUgXl1ZF5hVllXU1JUS01eTE9LR0dMTEU9QT48Qjw7NzY1MzQ5ODg5OTo5Pjo4Pj47PTw8Nz49Njc2PTc7PTs5Nzk7Ozw+OTk6Ozo4Njc2NTQ1MzEwNDU2Nzk6ODo5Ojo3Ojs5OT1AOnbAvLS5wrG+uLyunaeoo6q7wL3Aua60uMHMx8XCw73FuMjLssHCwa28u7S7vLS4ua+ur6ibmKCnk5CKgHyAfHdxaWxydHBoaGVkZmJcXFpZWlxcXF1eXVxbXF5cW1xZW1taWFZXV1ZXWFdXV1ZbYmNiYmNiY2RmaYGWk5WLkpSUnJmdlpacoJyflqGgpqakpqefnZ+moKqvpp+ipLeooaGiqLSipailsKWxrqy1nqCdlZWpoaKUrbGxn6KjnZ6Ym5OLoZSRk5iYkpeXmJeep5ynoaKZo6Wlq6SlsKelo6urraaprq+uq6iqqbOlpqyvtLGvvLWxr6+gknp3cmVhXFpdWE5MUkdSYU1WUE9KTU9FQkQ/OT02OTo3NjQ1OTk7OTg4Nzs4OT0+Oz47PDY5Ojc7Njs3Ozs6ODU6Ozo7OzY8Ozg4NDc3NjMzMjEuLzI1NTY7Ojg7Nzg3Njw7Ojs7QTh4u7uxtb2wu7G3rJ6lp623u7zBxbqxubXEycnAw8bFx7bFxLLCv8Wqt7e9tr26urWyq6ymmJeeoYuIc4WHfnZuY2FmaWhmZ2lmam1gXVxbWlpaWlxdXFtcXl9cWllbWVlaW1dVWFdUVFZVU1RSVWBgX2BhX2FhYmRqgJOTiZCPlJOUnZWWl6SZoJedoaWhraakpKOjopyqq6Wan6WxqqChnaWrnqihnq2sqamuraKhopWYo5uckKupsJygop+el5mTip6RjZKTlpCYmJOcoaOdpKCilaCipKabo6uloqSqo6uupa6yqaalpqa0pqmorbO1tLm6r6msnoxycW9gW1dWVVJHUU9IWVtPUklUS1NMRUZJRDg7Oz08ODY2Nzo5Ozo5NzY5Nzc6Ozo9PDw2Ozw4PjU5ODo4ODY1OTo7PDk3Pzw5Njc4NDUyMTIxLi4xNDI2Ojg2OTg1OTg5ODk7OUA5e7W0rbS7sq+rsa2dqKevubmzwMi6tcCvxcjMusHKzMi1ybyxvsPIrLG4wbW7wLu0s6mqpJSZmpuHf3GIg3t0aWlqbGdqa21ram1lXVxcW1tcWlhaXVtbXmBgXFhYWllYV1hXVFZWVVRVVVJTT1FZXVxdXV5eX19iZG2Oj4SRh4+Rj5qTlZOcm6Ocm6GpqauorKeopqSZpK+llZmlr6qfnJmboJ6vmpyrs6Clpp+io6GUk5uWlpKpqayanJ+hoJqUkIyZjoyQjJGNlpWQnaGgo52bo5WboKOhl6Koo6Koq6CrsKStt6WjpKKtraqoq6+zt7O+tbKrr5iFdHNoW1hZU1VSRVhMUVtYTVROUExQUUlOSUI8Pz9BPz03NTc5OTw8OTg3Ojc5Ojs8PT47Nzs7Oj02Nzo7ODk3Njk4OTo2Oj05OTU3NzU3MTE0MS0rLzQzNDk4ODo6ODo6NzQ4PTg/OX6zraeztq6oqK+um6morLe2q7zKu7a/rMvGxbjBzs/Is8S6t7vCyLCtuL+3vL26srSlqJ+VlpeVhnl0gHZ3bm1obW1tcGdnaWdkXVpbW1tbXFtZWltcXF5fX1xYWFlYV1hXVlVUU1VWVVVTU05QUVlaWlpdXFxeX2BkfoyBi3+MkYqSjZeRl5mioJugq6qmrqyosKSpmp+toJWWpKinnZeQj5qerpeYqKqZn52UpaCekpCSkZOVp6qlmpmZnp6VjYyLk4aJjYOPi5KVkaCeoaOYlZ+VmqGinpSbpaWnqKigsbGmsbynn6Ostauup7C1sLi1wLGtsauRfnJzYlZUVU5SSkdWUFJRTExXTUpMTlJHTUtBQ0ZEQz5ANzU4ODk7OTo3Ojo3PD06O0A+Ojk7OTo/NzU5Ojk4NzY5NTg3Nzk7ODU1NzY2NjEzMjAtKi4xMDI4Nzc7OTk7ODk0ODs4QDh/s6ylsbeqpaKxq52qp6mysaS2xrS5urPKxbm6wcvQyrG2uLu9wcOxr7G3rbSzurKyoaKbnJaWk4J+dmtnbG5xbnFqcGtkZWdlXlpZWllaWlpaWlpaXFxdXFpYWFhZWVdYV1VVVFJTVVNWVVJOTk5SV1hZWVlZXFxdYWqAen92iY6HkIqXiZSUmJuZnqmboKqmpaydqJqgppyTj5+jm5eXhYSSm6OQlaOdlpaWiKKbm5SLjoqQmqSnnJWVl5uRkYeUjouBi42AkIqSkpKgmqCilpSYmZWippmNmaSmqKahoLSyp7K3oZyit6yqraSysqa1vLWsq7GjiXlzbV1OUVFMT0NNTk5QS0ZOTkpKTk1RSE1KQUdMSEdDPTg1ODg4OTo7Njk6Njg7OTk+PDg6Pjk7Pzg3ODk6ODg2ODU3Njg4OTc0NTc3ODIwMzAxKyktLzEyODc2Ojk5OTk4NDk4OEE3d7ampLawpKekqqWgqKWls6qissO1tbKzxsa3usPKzMazrLq9tLfAr62psJ6mrbmurJ6YmZyUkoZ6gm1fX2ZycHVxaW5pZWdoal9YWFhYWFlZWVpaWVtbXFxZWFhXWVlYVVZSU1JQUVRRU1VRTU1LTFNXV1ZYWFhYW11hb3N2cYWIgoiAkYSPi5SRlJ6hj5uco6KkmaWXopyVjYeYmoxzjYN+jZeWhpGakJSOjnuZj5yMgol/iZifo56Qk5iWhY2DlH5+dIqOepCHk5CQnZqampGVkJ2OoqOOiZqgoaOkm6K0r6yvrZ+YpbimprGhsK6csLuqqa+qmYN3c2NWTVJPUE5DU05MUUxCUFFISU5STUhKSkRKTEZLSj03NDk4ODg7OzY5Ozc6PDk6Ojs3OT85PkA3OTo8ODk3NjQ0NDU4NzQzMTI1ODUvMDEwMikoLC0xMjc2NDc4OTo6NjU6ODdBN3i3oaO0qKalqKOmpaamprOnpbTBuLC0sMnEt7nBzsa9s6y6wautw62noqaSnaa1q6KejpSVkY59dn1lV1ZfZ2ZpZ2huY2poZ2JcWFdYWFhZWVlZWVlaW1tbWVlZVldXV1NUUE5QTk9PUFNUUk1NSkhOU1NTVFVVVllbXWlscm1/hXx0TlhykIOXh46dl4uUkZ+YnZWUlpWPlomAk4lfO1ZvfIuUiYCMkoyQhoZzioWWgXmBe4aTnZODlY6RkIOGfZN4cXCFjX2JgZGNj5eamZOLj4mciJ+YiIeWnpqhoJenrqmtqaielq2zoqatmayrmKizoqmto5N+cm5gW05TUldMRFRKUExMRk5PSUVMUU1LT0pJTVBGSUk9NzU5OTk5OTo3Ojs6Pj44Oj09Nzo/OD4/NTg5Ozc5Njc1MzMzNzYwLi0vMzQ0MTEwLy8oKSsrLTM4NTQ3Nzk8Ojc5Ozg2QTl5t6CjraGmpqqgp6ioo6qwqKe0wbmwtbDHwrezvc+/ua+utcKnqsWpop2Yg5Sbr6GYloWTjoqGfHJ1XVFMUlVZWlddXmJnY19ZV1dXWFhYWVpZWFlYWVpaWllYWFZXV1VTUk5MS0hHYlxNT1JNS0hGSE5RUU1QUlRWWFpgbXBpe4J0UUJAf5WSkn2JlY2Eio2bjpaViZKIhpWGeYl/YEpRbniKkYR9hI2KhX9/bn5/lHd1dniEjZlvUY2IioZ7fniUdmd3hoh9iomVi42RkpeMhIqIlYSajIKEkpqWnp2UpKOoqaWknpqwq6GkpJGmqpaiqpyipqiJdW1mXltIUVFTTUlVTVNJTEtPSUhGSk5MTVRLUVFPRklDPTc2OTo4Ojs7ODo7OD4/OTk+PTg7PDY7OzQ3ODs2Nzc1MzQ0Njk2LzMvLjEyNTIyMS8sJykrKiw0ODMzOTc5Ojk5Ojo6Oj85d7abo6edn6Gvoaeopaeor62qtby2t7ezwbu2p7nIuLaoqLW2qrK8pp2Wjn+Jk6iVlIl9jYOBfHdwblhNS01OT0xNUVdbXFpYWlVVVlZWV1lZWFhZWFhZWVlaWFhWVldVU1BNSkVAQJtrc3NJTUtERERJTk9oWU5RU1RVWm6DdHd+amlcVY+JlIl0f4eBfIWMk4KSmouPe4aPgHaAeHNudXB0jY2Ben6Kq4V5emh2e45wcm14gYuNknh6gHuAdnJykndodYSEhIV7lYqIio2LgH+Ei4yAlIN8gI+YlJyWkZ6dqZ6foJ2gqaWfnZiMp6SToaCWnp6kgHJoYVxdSlZPUkdKWFJPSkxNUkpKSkxQSExRTFJUTUVIQTw3ODs5OT49Ojs8OThAPzo6Pj03PT03OTkzNzc4NTY3NTI1MTQ3Mi8yLiwvLzIwMC8tKygoKS4xMjcyMTk4Nzk4Nzc1Ojw7N3aumaOimJyftKmvqaWsq7Cxqr20sru4trq0sZ+3urKqnZ2sqaiyr6GakY2UgI2bjZB+doV3e3VubmhYS0hJSEdFSEhQVFRUV1dTVFVVVVZXV1dYWFhYWFhYWVlXV1VWVVNQS0Y+OTNOPH6eTUhKREA9QURqlH5MT1FRU1ZedYN8eGZ3jZeYjY99aHmBdniAiY99hJiSgXGHj3x3e29rfq18c5CKf3uGkoF9f3RmdnyGbG9oc32JjIiAbHlxfXFtdo9xaHGBfo5wQ4uEgoOFf3d3eouFfYx7dX2Oko+YipKam6OWmZ2anZ6hnJaNiqSbjp6XjpaYj3dvbWViWlhYVVFKU1VUT1BOUFZLTktOT0pRTkhPT0xGRDw7Nzk7Ojo/PTk8Ojk5Pz87ODs9Nzw5OTk5MjY2ODU2NjMzNjExMjI0LiwsLS4uLTAtKyonJyouMTM2Mi84NzY5NjY1Mjc5OTV5ppegnpagpq+srquoqbGvsau8uKy7vrmzrKebsKesm4+WnKWppKCXmY6EknmIjYqJdXB7bXRwaWxpV0tGR0VBQENESUxMTVFSUFFTVFRUVVZWV1dYV1hZWVlZWVlWVlRTUUtENzhmNzA/qGlOSEM9OzpEioV6WkpOT1FUWF1lcHJtiKeqwH51eWN8eG98eYiQen2Lhm9tjJJ5dHhqaoCCcZaRi4F+loBJk5huaHd+gmxpY2x5hZCShmtzbHxucnuGaW1wf3ONiYSGe31+e3ZvdHOFgnmBeHB8joyKlIOWl5iakJKVl5mXnZaMg4mekYuSjYaQln9uaW5vblhVWFRSUVlPUlRUU1hVTU5ITktNTktDSE5HRT86ODk7OTk6Pjw5PDs6Oj0+Ojg6PDk/ODY4NzI3NTY1NTQxNDMyLzAyNCorKiotListKigqKCcsLTEyNTAsNTU2NzQ4NUhBODk1d5mRm5man6WtsKOsqqi1r66stL+rvMK/pqKZlaSXno2Ei5ShoZiYkZOLc456f4WLhXRudGtwbGRralhORUZDQDw+PkFGRkdLS0tNUFJSUlRUVFRWVldXWFlaWVlaV1ZUU1BMRTFAmjMganNDmW87PDk1PICChl9JTU9PUldaUVlcYKeIYpppdHplf3Btf3qLiXaBiIZ0bJqRdHN8amudj015hZKJhI5nMXaGc2x+foN0ZmV0foSEhYBmaWx1a3F/fGhxcXxuk42PfHN9fHFwbnVtgn93eXVqeYmCiImElpKSkIuNkZSUjpeNgHmIl4iGioaAkIh2ampvaGVYUVlXWVlbTVBVVllYTklIRUpKSEdCQEZEQ0c9OTk4Ozk6OTw6OTs6OjpAPDk6PDk4Pjc4NzcxNTIzNDUzMzY0NTAzMS4qKispLCwrKykoKycpLCwyMjYsLDU3NzU0NzhpTzg7NW6SiJqRmZakqK6esp+nu6+rsrDCsbvDx5qWj5SZi46GeYSQmJSNkIyPhnGHgnOHjIV6b3Jwbm9kcGZfVEZJQz88Ozk6P0BBRENFR0lMT1FRUVFSU1RVVlZYWlpZWFZVVFNQS0U4MC9cYLNHOVhQOzk0NDGWuotITE1PT1FWTEFJUUlir7Ogcnx4bH1tcoOBhYF6hIaGeXKhlXR4gHN1lIc1cZ2onY6hoYSihHZwhnyHfHOMrY2JgGdmYmpucmxwg3Vpb1h1cI6bkndsf3t9bXFtcIB6c3VuYnaDfoaAhZCQioqJkYuRjIuOg3V4io6AfoOAfY96cXBva2BbXF5cWVhgX1JOW1pYV0xISkZKRz5CQUJHPkNEPTs5Nz07Ojs7OTo5OTs6Pzw4OD06ODs2NjY1MTEyMTI1MzQ3NDUzMS4vLCwrKSopKSoqKikoKikrLzNETTIxNjY2NDM8dlI3PTdikoGTiJaRnaSnnq+VpbWqrrGuwbK7wcaWkIyUj4CIfW6BkJKJg4qHj4V1goNslYiHe3R4eGx3bndjaV5JUEc+QDc0NDk7Ozs9PkBCRUhMTExMTlBRUlVVVldYWVhWVVRTUExFPDUqnUtbQC1nSTk0Lz+Sg6muX0dMTU5QTDdDTVJTREqGdoB8fHZ+bXeIiHx+hYN/jH52opl5foaAhJmEm5xhhqqfnYuDkI16d4h+iYiNc4qXkIN6XWRxdHp7d4ptaGpieW+FkIJ6boF3dIR6cHR5d2tuaV13h3yHfIeHj3+LkpeDjYWMhn1xhH+DfXV3e3yJdnBzdGVnX1tbXVRcZ15XUVVYW1VHSkpETEc/RkBEQz5BQT06OTc8Ozs9PDo6OTk7Oz0+Nzk+OTk4NTY1MzI0NDAwNDY0NTU1NC0sKSsoJycnJigoKSkoKCsrKy8wMFVxPTIzMzMxRX5XND05XIx4ioCUjJKcnZ+mkaCroLGor8CxusW6lo6Rk4d6hXZrf4yRgn2KhI6MeIOAc6GEi318gX5wgH56Z3ZrUldMQEUyMTEzNjc2ODg6PD5BRUdGR0pLTU9QUVNUVVdWVlZUU1BNRkA6Mj0gI5ZjjFs1MzExaT9Hb0lGSUxNT1JMS1RdWVJKaYSIe4l5fHF8j4x6fYmHfpeHdqGZiIePkpSljaypSIaur6+LgYCTioKLgYSSqIeAmJiKnHRtfIGGh32OaGdoeH5uhYeChXGEhUdsgHdyeXZobWtfd32DiH+IhYt6lZ2biYuIkX96dYt2fHhtb3d9f3NzcmxbXV1bY2NYZ2ZcVU9QVllQRExLRk5JQ0ZDQ0FAQ0E9OTc3Ojo6Ozs6ODg4Ojo/PjY7Pjc1ODU3NzMzNDQyMzY2NTY3Njg7REZMTU1MQzcrIiUnKykrKywvMDArbnUyMjQyMEyBXDU9PF6EdHx9iYWIkY+WmJKXoZ2soaa4r7O8s5eNkouYi310cH+Jkn59jIKSlH2Gfoakh4h/goiFeIeIfnOEeF9jV0tCNjAuLzIzMTIzNjY4Oj0+P0JFR0hKTE5RU1RVVFRWVVNRT0dDPzgwLCOHWz4/ODQuXZZwc6NVRklLTU5QV2BZcFpcXmqNk4eVgISChZGTfoWIkYGalYKhoZiVm5qlrZOZu7Gnu8fDqIuMoaWPlImBkXxxg56fkZx/doWFipCIkGlob4OAdIyHhItxhYJ3h397doV9bnZ1ZoCUj4aJiYeIh6GqopaJjph/eoKJenlvZ2t4fnp+cmpkXlpaXWpdYWZgWU9LTldSUUhQSkROR0NKREJARERBPDk4Nz08Ojw6ODg3Nzg6PT04PD02ODY1NjYyMzQ0NDU3Njg2NzxCQj88ODo+Q1FeZVxHMicmLCwtLS4xKD+LWy4zMTBPg180PztudXBmeIN7gIyAgZGOipqbpJ2hrKarr7CXkZGDoZSEeHd/jJR8f5KGkpV/ioCSm46DgIGMi4KJjYN/iX9tcGpdQkE0LS0vLy4vMDIyMzQ3Nzg7PT9CREhKTlFSU1JTVFRSUE9IREI8ODcvOUQ+PDw2My5sk5dNUEhJS0tLTlZgY39nZ211nZqPmpOTi42OmoiTj52LoKCSo6qlo6yTqLaiqMHDrseveLqUmnyNoZ6ZhJOFgo+hn5OYkoSLhY+ZkZZscHWJi4KWjI2Pd4+EcWyEgYqWkYOFiHKIoZaHk4mOj5altambjZWig4eTg31/a2prfICBgXNhXWNeWmZrXGxrXldLR09TUU5NTEZJUENETUZBQ0VGQj46OTc9PDo7Ojk4Nzc2Nzs6Nj06Nzg1NDU2MzQ1NTY2NjY4NTU2MzEwLiosLCkoKS46UGFcQCwoLSsrMCwncog3MjQwT4RiM0A8dW5nWXCCcHWHcXaShn6XlpqVnp6cp6CplpOYnmdlpJp+hJKReYCSiJCSfYqEmJKRgoCAi42JhZCGhIiFeHh+Z01SPi8uLiwvLi0vMDAwMjEyNDU3Oz9DRU5QUlRQUVFTUU5QSUVEPjs8OkNGPz48NzUyPD9SNUhISExMTU5SXm+KfHOBfaCdnKilopmhl6KVnZ+onqiroKisqaq1l6u+q7bIyLfJ0c++m6Bwaaupn4STkoWcoZqbmaeRkYmVopqaeHp+lJiSoZKWmIGUnnt2lZKrsoiNl599lJ2cjpOWmaSiprawnZGZqIiWj42BiGxzcnx/fHFoYFxgXmJnY2BoZ1tSRUpLUE9JSkxGRk1DSExGRkNCR0RAOjg1PDw4OTk5NzU2NTg+NzU9ODQ3NDU3NTQ1MzY5NTg6NjE2ODYzLzAuLSosLy4tJyMqO1hiQigqLDEtKEuXXjA2M1GFZjJBQGlhXlBwdWBufWF3jn17lI6Oip+Sl56Wm6qYnqpCRH2HiYeYjXiCjYqOjXyKho+QjoGCgImMioSShYOGiYGAhndfYlA0NjAtMS8sLjAwLy8uLjAwMTU+QUFNUVJTUFJTVVJOU0xFRUA8Pj1HR0BBQDg2NjI8OTtGSEdJSk5PUVlthpB3lYujp6q0vbikrqysp6i0q7C2srKtu7Gzvpyzw6y7ycu3w7+4paOwsqytqqOLlpiFpqagopeBppmNoqqopIiFlKShoKqhpKmPnLGLlaOnt7uboKOwk6Kdo56RpKKrr62ztaKUpKqImYmSipV5en6FfmdgaFxlYl1kY19mZl9aT0NJSFRPRkhMRkpHRUZIQUtGQ0ZGQTo4Nj08ODg6OTc0NjU4PDU0PDc2OjQ0NjQ0NzM5PDM4PDIwMjU1MS8xLi0qKi8sLSooKiYlNVhYLywwLCwwhIE4NzFQhWg1QUNbWFRMaWNXanBYeoV2gZOFiIKbg5KRjJLayJ2Wc1aXiI+InI98hoyOiop6h4KHkY+DhYCLhYaHkoaChImGiIeHcW5hQEU2NDwyLzExMC0sKy0xLi0zP0RBTVVRUlNVVVdVTltQR0dEPD4+RkhDREA4Ozw1Qzs9RktJR0hST1BXgZOghK6js6qxwcfDqrPFtqyzv7O4vra/tMG2u7ujt8WotsnHtb65tKijtK2xsZuZkpqfiaevq6WUdp+kl6GrsbOYlqqtqK62u7K6rK+1orGrsbW7t7SutaCnp6OomqmwrbK6uLinm7apjKWOkZOfhniCg3VZYWRWZWFhY2BhZl9bVEpERUxVUUhJSkRJR0VBQEBLREFNRjw4Njc7PDk3Ojk4NjU1NTcxMTw4ODk1NDY2NDk3Pj0zODkxLjAxMjExMzAsKiwuLCsrKyooJyopRVowMCovK2iSTzYwUodqNkFGV1FKTFtaUWNkV3l1cYGUfYSHk3aFf4CMe7+7o7yCtJSTjZuPhIiPkomJeYaAjJONh4SBjn+BiY6GgIaJhYqHkXp4bl1WQEVNPDY6NDZBQjc2NC8vNkNIQ1FbT1FVV1VcVk9eVUlLSkFAPkdLRkVEOz5AN0Q3P0JKSkVGV1RQXo+lraOxtMO2uMHMyba7xL2zs8C3t8G1v7C3dLGzprrFpK/GubGzsbSopLW2qrGgoZabopKlsK6mraunpJigrLO6oqmyurS7vsy/xcW9vbPCt7q4vre6t7msrLCmsaqtvrC9u8LCrJm6qJSuj5eXq4l9gnxqV2JhWGplamVXW2RZVlRJR0dMUUdDSElBSEQ+P0JCS0BATUM5OTY2OTo/Njo5OTY2MjQ2LzE5NTk5MzY0NjI3Oz0/NjoxLi81ODo5NjUwKigsLS0tLCwqKCgrKyhFUy8qMDBKj2s1MlCHbTY/RlJMQUxSV1RZVVp2anB/j4SBjoRuenN5h2K4oZmjiZWTlpOTk42QlpKHhnuGgY2WioGEgIp6fIuHhnyKg4GKg5V9eHp1ZU9cZEdFTDpRY2FbXlNGPztIUERaY1FRWVhZZ1lUYGBNU09FQT9JSkhFRkFAQzxFNkI+SEdKTFNaVF2Tr7i1urnJv7q9ycy7vMC8t7W7u7e9tLqxxmB1sqWxmp6qvaqlqKuqo6KytaGrqJ6Vlp+Yn66lp6aln6OUoqaxtKeysr22wb3TycrTxsLFy8HKw8C+vb+7vLe0sLm3tsO6xb3DyLCeuaqiq46lqLaJgH9xX2JiXVdhX2hmUlhhVlJWSUVFTktBPkdEPUtCPUJAPUY+O0hANzk2Mzc5PjQ4OTo1NzA0NS8yNjM4OTM3NDQyNj84QD5HS1JUU1FQT1FRUEpBOS8sLCwqKygoLC0sL1A+KC40OIB9PDJLiHE5PkNLRUBJTVBSTFFdZ2xscZCNhZBzbHJyc4jVwLWZoI2VmJmRjpeSlpaOhod9hoOMlop/g3+CeHqLg4d7i3mBioKXf3R9emtlcHVZXVxQZWViYGVkXVtYV1xNZG1VUm1tX25fWGdlVVlUSkRBS0tIRklISEdCSTlEP0hLVFRWXFpbkrnAub23xsC6uMrLure5tri5sre1tK62tphkdaicrXBeoa2cmKCim6Seq6WUoJ+QlI6WmJeon6WfnpqahKSdrKWqsKy3sL251NHP18/JzNHMz87KxsC/wsq9wbzBwMTExcq/yM60pLuwtK+bq7m8mn95bF1fXFhdYFljY1FcYFNQS0NBRUZEPEBFPkJIQkBEPTpFPj1KPzQ3NTM1Oz00Njg5NzcwMjIvMjQxNjk3NzU1NTVEM0VMTT41MS8wMDY6NDc3QElPSTstJioqKC0uLyxATSsvNTRtiUkwSIl0Pz5CREBDREZLT0RSXFlpX3CXkpCUb2xvdXWIs6yhoZ+LmZyZjI2VkZuShYqKfoiHjJCLiXyBg3N7ioOFe4l0gYmGlX9ze3hrbXV7aHJlaWxpZmppaGBmaWhsWm50l62kvIiHZ1tvaF1aWVRIS05PSktRS1RRSExBSkdLUF9eYmZpYZe3x7C5s7u+tbHEx7WvubCwu6uysaeqt6yNtqedm6eaT5qdjI6glpGmmKWVipOTiZCJj5GRnpuhl5qVloeemqabrK+or6eztNTU1NbSy8/U1c7Tz83FwsnQv8rJysnSx8zNwtDSuLDDvMS5pba6xKKCbmNcXF1YYFdYZlpRXVdPT0JCSEVCSTtBRD5BRz8/Qjc7Qz5ASD00NjY1NTs6Njg3NjU0LzEwMTQ2Mjc4ODc1MzY3QzVCOD8tMC0xMzQ5PTk3LC4sMTtGSz0pLCguMDAwN0s/LTQ2VIhXMESHd0M7Qj5FQkFDSk0/VVlTZVdzkJCYgmhxb3l5g6CqnqaXjZubl4uOlZGajn2Ji4WOioqLkId8hIJwf4eBhnuHcoOSi49+cXh1a3F4fnF7bXhzbGmBcG1jaW5weGl3fH7Lv8Lfp21jeG5jW2FgSlBSVU5ZXlBeXU1QTlRRVVRcbm52gnKXrbistKewtqusvMCxq7WmpbinrK6hq7SjjrGumpiYjJGTkYSOm4GNppGciYOLhIqJhIuDk5WYl5ObkZyYmZmenquspKehrK3P0tXRzczS09TQ1NHOyMPU0cjN0tPT183S0cXS1sXAzsfHw6i+t9Ceem5lXWJcVmBSXVtPUFRQTkg+QUZBQkU8QEI+RUQ+QD86PT08PEpBNDU0NjU8ODg4NjY0NDEyLzAzNTI2NzY4NTMzOz08RT1AMTErLzI0OT41OTAxMDIyLTJETjMpLzMuMzI9TjIzOEN9XzJBhnREOj09ST5AQ0ZIPFZSTU9bdYaFindsd3B9fn+hnp6hi42Zk5OMjJOPloV5hY+QjYuKiJGHf4J7cn5/gYd5hHWFk5GJf292cmtzfHx2fHOBd3FrgHNyaG9xenlye77Lmn6MsoN2coR2aGFqXUNaWltXZWRYZWtTWF1cYGNdY3h7fouBmaqkpKGgoaimqrC4qqW0o6GtoqOtoqexn4mmmpSSkYmRjoiBlIlqlaKNmYSAhX2Rg4OTlq2LlY2VmY6FkpCdl6ewoaChpKSoyM3PyMLL0dTR1NLO083G1tLM1NjW1tjU19XJ1NrNydfX0cqsxMPLi3NvYmBfWFRZUlxQSkdJSUpAOzo7RUFEPEJEPkhCP0JDOzs5PDpHQjQ2NTQ0PDU2ODc1NDMyNTAvMjU0Njc0NTU0NDw+PUU/QTYyLy0xNjs9MDgxLzI1NC8tLTtSMDE3LzUzMkZEMjg+bmI1PYF0TTk5QEk8QUQ/QTtQTEZLWXCAdX1oc3hygomAnZWdlIWLlomPioiOh49/eISUmYqNiIiLiX6DeHN7fYOHd396h5GWgINueHBtdX92eH1zhXx5bYd2dG59doR1eXudtYw8QYvGpX6NfGllVklDZmNlY2hqZG94W19maGtuaW6Ag4mRi52eoJ2Ql5ifo6SmsqSks6ChpZ6hqaCjsZyGnpKSkpCLjouGg5CEfpybjI2DhIV6lH6CqZWjjJKKl5KLfZeKmpGqs5iam6ecp73Dxri2xs3S0NLQzNLLydTO0NXa19fY1NnYzdjbzsna2tLVv8vMtHh2bmRdWVJVUFpWRkdKSkVFPTo3OUBBQjpIREBFQ0FDQjs/Ozs3REM3NTY1NTswNjg5NDQzMzQxMDE0NTU4NzQ0NDQ5QD5EQkM8MzMuNkZUV09RSkFKRj8xKiguQlMzOTI1NC83Szc1PGBiQTxzdlY4N0FIOj9DPjw5UUVDSlRsbm9wYXFxc4aNfJeRnYt+h5KCiYaFioKHfHiFlpeIj4OHhYd6hHlxenuEhnV6hY6NnXqMcHxvb3p/cXuBcYOHgW6OenR3fHyCdX98h4iwdFipwraMkoJwbmI9XmhycHFwbnh3gWVpb3J1eHJ7i4eOk5KblaCVh4yTm6Cbn6qfoK2copqZn6Wen6yZi5qMkZGNhH2Ih4OFi46gmZOIhId+bZl5hJiGiJOMjZSLhnubiJOPrqqUlZeemKautb2prb3Gy8jJy8vPyMPRytTW2dfY19Tb19PZ29bP29rR1snUy5V5e2hoW1lQUlNeSENFSUk+QT49Nzo9Pzs+SD0/QUFBREE+Pjo4NkRCNzU1NDc5LjU2NjQzNTUzMjMyMzY0NzU1MzQ1N0VCRENFQjU2PEZOU01bbmZjbnNrYVY+LDRMRzg2NTQzNEJGND1XX2hMdXheODs/Rjw8Qjw6OUQ/Q0dSa19tZGJma3aAiHGRkJqAeoCNfoKCgoR+hHx8hJeOh4t+hoaAd4J5bnt7h4F0eZKejaB2j3WCdHWBfXSAhG+Bj4JvkoR0fIGFenaGfIm3xqXCybeBlpuPd3BlTmZjgXqBd4aikIt4eXd7g398hHZtk5aUlY+YkIOKj5aal5emnJegl5+TkpejnZmrlpGQio2RgoyFiYiBhZCRnpyZiYWLgYaXeoiIn5ePiI2Ki4J8oYmQi7yhl5OXmZynpaWunqi1vsDAucfJzc7FzcrR1tbV2dXX29TX2drb19va2djO3MaGenlnaGVgVFdWVU1LRE5DOzw9PDk6PD45PUA2PT9APD8+PDk4NjdDQTY0NTU9ODA2NjU1NDc3NDU2MTM4NTQ1NjQ1NjdISD1ESkU3OTI1O0g+Ozo6N0lQXVpSVVhLOVQ+Ozk1MzI3STg9TllNSHh4ZDU9PkM9PUA6Njo+PkBFUV9ZZWFdW2h0enlsiY2Sd3Z6i3x+gH+AfYV7foGRiYSFeoSIe3V9dG58fYZ+dH6SnpGfg5J8hn54jn15iopugpqAdJiFfoGJhXx+kHqPqY+QwqC8jJyjnH2JhH2Jc4yKfnOmmpyYlIV7j5CJhGhHcKCknYyLkJKFiYuQkpWPnZqTlZGXjYyVn52UoZSSjo2Qi36Qjo6LhIiSlpqfn4mMlJKekYKLf6WZiISOgoaEgKWGiou4mJ2RlZahpqCdnp2jrra6tau/xsrQyMfMz9PS0tjS1dfA19jZ29ja2tnZ19y3eHh3a2lkV2BbVFBPSERNQj09Pjk5Ojo5OTs9Nj8+Pjw9OTo7OzM3REA4Mzc4PjcwNjg4MzU3PDM3ODA0OTc2NzU1NTQ2RlA1RE5JODkzOEFLPTszQ0BJPDlEV048TVRITj85NjMzMz5DO1tYPjVZeXBaPDxBPD0+ODU4OT89RFJTUlheVVhmbW1taYCOinFyeYp7en99f3yIenx7i4eCfnSDhnlzenNtgX6FfXeFm6GbnpSSgIuIf5iHgJySboeohXqgi3yQjoOIhJx+mpGKjaOin5CkrqCLkYuFi4GShldyrYufq5uPg5ibkJCOXIKikYKMn5OVjIeIjJKTjJSUlI+Mj4qIlpudj5WWkYuSlIWAi4iSjYmKnZaZo6OGkp2WoYqKiI6ckIOIj4CDh4WkhoyQs5ickpSXoaCemZKcnaexuKylvMLHzcfGz8zPzM7Xz9HUrtbV2NrY2trX1tnan298dGdnXF1YU1dYQ0BJRD4+Pjo0OTo7Nzo7OjM7Oz89Pjc7OToxOUc9OjM3PUA1MDY3NzI1NT82NTs1NTg1ODo1NzczNUhSN0dPSzk5ND1FSkI+MUZDTEI5ODpHWEA1SFdJNjYyMjM6RUNlWD8mX3lpX3o+Pjk8Ozk4OjxAO0JRS0tTWVBUY2J4bWJ+koNubXeLeHl+eoF8hnx7d4aEf3NwhYJ6dXZ2dISChH1/kqajn6Wilomdj5SXi4qol3KKsoyEp5GEmZOEmYuilqCYk4mbnaGSqa+fkZWQjY2IlYtujbeFmsTIspyhpZucmJaRspFkpM3Hlo+Fh4mQko2Nk5SKhYqKhpaam4+QlJOGlZeEf4+LmYiNkKqXl6SjiJmelpuIj4eXl4qEj4yBf4ePpYmNk6iZlpOWmaGYn5mTnJuis7Slo7zBvsfFxcnIycLK08zN1KjS0dbW1tja1NPazoJyf2hjX11eTkpUWkJBR0Q7QT04Mzc7PDo4PTY0OTo8OjgyPzk5MjlJOj42N0JDMzI6OTYyNjQ+PTQ7PjY5NDk7NTc5NDRLUTxKUUs5QTdCR0lANjRKRUxGPjw4OEVUQTc+XDg2MjE0OjtFYFhBRmF0aExjWj41Ozo6NTs6PjpFTUZIUldTUkJjgUZ1gY59fG1+iHh6fnqBgYN+dnaAg3xsbot/eXx4eHyEh4p9iqOzp6Oqs6GWp5+lpJaVrqKDkLiVkrOZjKGgjKSbr6OknZiQp5anma2vpJeVlpSQi5iZlqDAjqTJuKuboqatmJGbnbKdhoWoopyYhYiJjpWNi5OPiIGGh4iSmJSMi5OThpSYhoSRkJx0kZmzlpeloYicmZOPipCKl5qJipaOhn2MmJ6JkJCcmpmTmJiflKCdlZ6bobGuoqS3vrTFx8S9w8O/xs3KydKnzs3T0tDW2NPQ2LtyeXZcYFVfV1BISU5FQkNFNT46NzY6Pzs8Nz00MjY2OTc3ND01OzU8TDw+OzxCQTc1PDs0Mjc3P0A2P0A3ODQ5ODc7PDU1T01EUFJMOEA9RUFHQTU6SkVORUQ6NkFAQlM+OURPMzIzNTc1PXZcPFJcdGlaTV1TPD04OTU2Nj06SkZER05bXFlJZmA7SISLentuhYZ6fIR4gIWBfnB4fH19b3ONen2Be3iGi4mGg5Knu6yosr2vpa2zs6ijorCsipm1naO4pJWtpJaprbempKKfmamYqaOvsKmamZyUlZGXn5eZu7utyaFptrirsJSYnqOrk5e+o16qsoKJio2Uh5F8jo59g4aOj5SViIeSl4yQlY2LjJeYkp2ZtJeWq52Lm5SSjZCSjJmbipKekIuJlaChjZSNmJqdk5uYnpShoJScnaWvqKGls7irwsjEtbq9u8XHyMLRocbJzc3E19bRy9OhcHpoXVlTXlJPRkQ+PENBQTg/ODc0PkY8PDY8MzUzNTU0NTRCMzk6Qk06QTtBSEI7OkA8NzQ2PEI5P0BCODc0Ojo2Pjw0N1RLQ1VRSjc8OklBREA0QUpITkJBPzZEQTxKTkQvVD0yNTQ6RUpcWEpaUW1ncHBEaWBLSTY3NTc6PkpAQ0lQZUdiYGJwSUCLin6Bc4aHfYGIdYKKg39tfX18f3B3h3eNgYd7jY+MhoyZqsLAr73Gu7O0wby0rauztoynsq6uvKqbu6Sorbm4q6amoqGjo6ivsrGqnJykmJuYl56ipaWSo7muqMC7rK2yuaWkp32Ih5ysvbCDjIyLkIOPg5GPeoGHkIyOnIiHj5eNi5WXlJCalp2nmrGakaycjpqPko6UkJCWl46RoJGJlZujrJSWj5ScnpSgnZuYoKGUmp6npqSipLCypsHHw6+wurbFxMK+zafHw8fDvNXRzcTKiHRzYlxZX1tNSkJMQEVHP0E/Qjs6ND5BPD01PTY+MzMzMjQyQTE3QEJOPkdAQ05DQT1DPTs4NkNDNUJJQjo4Nzg7NUI+NzlWS0RXT0Y4PTRLQEM+NEVLSE4+QUE2QkI/QlNFNThQMTQ1Ozw4O0Q+OUxqal07V1JkS2daVU83OUdFP0NGXGZGYGlnWl1bk4yMiHuHi4aDjHWGkIqBb358gn9xfoF6lXqRlJSYkJOVp7PGyb/CzMHDuce8uq+rubuXsra6ssCupcCkq6+7vKqtq6KinaeqrrSwqpufqpuhm5WfsLSni6K6urXBu6upnLKlpKiUhY6qw8SkgouPh4iEhpWUjXqDjJGOkaGMjJSSjoiXn5eTmZWYpqCvnYyqnI2Vj5KRlJWNkJWRj6GUhpefoLKelJqUoKGZpJ+aoJyglJiepqSmpqSvraXAxMKtqLe1ycO+ts6yxL7EvLPRysjCtXR5bVxYXGlTTEhETEtLSkFBPUNEPDVBRDs6Mz04QjMzMjI2MkEwNUlFTT5JQEhSQEg+Q0A7Pj1GQTVBVUA7OTk4PDdFPjg+VkpDV09HOD80TEBCOzVKS0NMP0I/PEJGPUFITDkrRzwzNjc0NjRBPzdPYU9hRS89PjZrbGpgQDpIPj9FQmZaTWVcZlRjapmNl4qMiJKQhol5hpSQgXKAfI1/eIeCgpB5jaGWqJqamLq9yMjKwdLJysLMvMGzrbu+p7m/vbzEt6zBqayyu72qsKmjpaOsrbOttrWgn66epaKYo7S8qZuovMGjtravq5Kwrausl4aaqqalkYKMk6WViYB1ipJ6hY2RkJ6fk4+Ui4+NlKOZl5yVlKOfqp+RpZqMj4+QlZaIfI+VkpKjm5Wgopy1ppCel6Wko6WenqaYnpWXm6WjqKeisqyovMDEr6Wzt8zAua7Es7u+wbiswsPCwJhteWFYV1xbS0tNSkZERElCQkFDSzo0REg5OzQ8N0UuMTIzNTJCMjZTSE48SkJKUUVLQ0RFOkVMQjw3RVY9Oz04OT88ST86RVVJQVdRRjdBOks6Qjc5Sk1CSUBDPjxERzxCQ089MjBIMzY2MTcwPUI6PWpqSks1UVMzU3BwZE47RD1ARj5qSF9YYVpkZFaej52Nl46ekomKf4mfk4R3hX+Vf3+QiIqQf5Whmq6mo5jCvsjDx8XTzc7Ny7vBt6+5vLS8y7zDwbW2vK2zv7m8rq+ooKintq2tqbG3mp6toqehnau3t6mlr77Dsb25s6eqtbOtrpaWpayooJGOkrHFp5WOfZGVfYiRmY+qmZiTk4+TlZOlnpOdmZOho6KcmJ+Zi4yPj56IWpCWl5KWpZllmKOesqWWopasrKunm56ml5iXmJWhpKimn7arqbq8w7Sms7XLwbiptqyyuriuqLe6vbiDbG5aV1RVTkZKU05LP0FHRERIRkc5NUZNOz43PkFKLjMyMDI1QjU1UFZOPExGS1JMT0hHST5JUT86OElTOzs/Nzk+RExCQEhTS0BXUEY6QT9HNkE3O0hNQ0U7Qz00RkU6QkFCRzkvOkEzNjAzPkdEOTQ9dGRNRztFKzpmfGhXOz1AQkZCcUZpSVJlYkxGpZSclqGXqZaNkIOHppOIgYeCnISDlZCQlI6aop+vvq6hxrzFxMbGzs7O0sq+u7Wxuru8vs+2xL23ubeysbWzuLOsppyrq7iqqKevsJejr6SnpKS0wLCqrLS+wrnAubOnubW4sq6Vpa2vrqWLk5WhjXTBmn6XmYWPlpqMsZWamZWTk5mZpaOVn5uWmqmdnKGgmouNj5adYEqWnJqVmqWWVJawn6+cn6WUr66sppqgpZSTmZmOnJ+nopm0qaqzvLy7qrCyx8C4paurrbGxo6GxsrSkcW5mXFpOUEtEUFBQUTtHSklHSEJEPjlLVT9BOj1FTTA3NTQ0OkIzNE5XTzxKS09VTlFKT0hISk9CPD5NUjs+PTg6PENSPkRIUklCV05JQENBRjM+NThKS0NBPUM7NEVBOkE/PkhANSpCNTIsPmNdZzozNXRkZUBSNyYjM31pWDs6QkNAPVFFV1JzYldGSKqXmaCiqK+ZkZeHi6eWjoiShZ+HhJ2Xj56gmqOktci0qca6w8PHysjIzM3Gvrqzrrm4wcHMtsi6wbi1urGvrrK0p6ObqrO0qqimrayZpK6lpKisur+oq7a3v8G/vriyssOxub2so661rLqmiJyYppt2v6CFmZ2Ok5mai6+XoZybl5Wbn6GpnqigmpqqmqKnnpiQjZGdg252kqKalZ2inpCtsqOrlaiql6qupaSfpamTkpmciJScop6Wsaapq7q2vrOyrr65tqCjp6ilp5ybrKmpjGNlYV9SS01HSE5JVUw9TEROSktCQ0Q8UVU9QUFCRE8xOD03Nz9CNzVVWE4/SE5RWVNQUVRKUUpKRUFFTVE/Pz04PTtHUjxFRFFCR1lNS0FIREU6OjM5S0lCPkNCOTlDPjxAPjs7RzctMj4tMYJoTnpcLzBraGA8PUJCODZ6Zlc7Oj0uLlJgTVVIf2VeSEWrlJyhn7uvmZSfi5Oqm5GSk4mrjYein4ykrZSjo7bGvbTAusLCx8jFws3Iwr25sq+5tMDCyrXGscG8tLqrqK2ssKOimaq0uqappquqnaivp6Oqqr67p6y8s7e9xry3tbjAsb3As6m1t6u/pY+jl5GioLyfiZqgmZeeno+3n6mcpaObnKGaqKWzoZudppyoqp6ZlY+Um4uXiYylopSdop6gtK+lpZOwq5mrrJ6eo6OpkZWVoIOQnp6clamkoqG0tLq1rai1srOenKKlmpeVmaqhnndgXF9dSkhGR01RSU1FRkZCUkxKQUVHQFZSREg9QUdRMTtCNzpCRjc5XFlLQUxQVFVTTVdSTlVKREBKSk5POUM/NT08TlFDPz9QP0VaTUpBS0RHQDUzPUlHPz1FQTk3QTs8QDw8M0A8Lyc7KkiRQjpTSjAsW29XNzE8Kh1CgGRUNDktMTpnXEZDQ5xwYkdEp5ekn57DrJuXpJeZqZyWmpqPqpWVqKaVra2Zoau2xMK7vrbBwsDHxL7Nx7u9ubKvuLO/w8i1v6+8trm3pqOqrK2goJqqqsShpKirpp6rr6yiqai/t6atvbC3tse2tbm4v7G/wba0s7SvvqOXo5aUnJSuoJGhoqWjo5+QvqWpnaisnZ2hm6afvaKYo5+iqauhnZaNlZ6TnoePhY2TnqSgnbWsppyVsqeZr6ifmqmeoI2ZlZ+EjqGam5OlpJqYrLG2saqlqq2snJigoJKOkJaonpRoYllhXU5JR0pOS0hFRElBPVBJQTxHSUhbUk9LPUhPVTRCRjk+SEc1Q2FbS0NOUlVXVlFYVFJVSEA4UVFQTTpHQDRDSFFTSUM7Qz5HVktDQE8+SzwwNjtHRj47RkE1Nj85Oj85OzE1RDAtLDBNdlw0S1o1LE1uVzwtPSkeI3piUTVDS1E5b1JGPEt4ZWJWTKKao5yexayhn6ydna6gk6OflqWgpqmrl7axo6qytcTDvb+1v8K7yMK+ysi2uLW0sLOzt8HGtr2wuLS5tZ+mrKqrnZ2epaPBpaCprZ+kqa2voqanvbWmsby3trXDsrO3ub6yw8C3uK6ztbWjnaSVkpShrqCZop2pqKujmsOtqZ6srZubnpmmoL2inaWYq6uspqGZjZmfkp6Jjld/lp6loaC4qqeTmLajn7KhoJuulp6OmZSdgo6fl5WOoqSVkKatsqupoaKlpZWVnJiLj5GTpJ6JYWRaY2BMSEpKTkZFQUZLPj1KQjk5SktOXVFRST1MVlw5Rkk9RE1JOEhiXExDTFBTWVlWV09aXklBPVdRSUs/SEA1SE1YU0hBOkBBRFBIPz5RPks3MDk5RkU7OEc/LjY+Nzg+NzcvMT85MSUxUVVtW0pPMTA9Z1dEMTc9LSt3YFM2U1prV3JIRTY9dWVcS02en6GYnsOnpaKzoZyyp5OqpKCkn6yprJ27sKistbHHxMHCs8LDvMbDvMTKva+xtq2wtK+/xLW5sLC5tayaqLCpqZqdpaGnwqybrLGbqqKusKmkp722pre6vK62w62zs8K/ssazurestLatqqKmlpWVpKyin5+aqKuwr6+8sqagqamZmZiToqS4oKGkk6+vrKWnn5KhnpWej5CNlZ2aop+ntKanjZi0nKOvmp6brpCek5eUmoCSoZWPjp+hk4umrLClpqGcoJ6SkpqThYuRjZyef2FlW2dlSklMSlJBQ0BJRzs7Rz85OU5NVV5SU0o+T15dPUhQQkxMSTlNY1xMRUxSVFlbU1VPXGJIQT9aUUFIQUtCN0ZFTEtOPjtCSEROQj07TkBBMy85N0NCOTdGOys2PDQ2PDM1LS80QDErJ1Z0U2VPPzEwNGJbTTIzPjA8dl1eP1tVXmZyQDg8SJZ3ZUE0n6Ofm6DDqKSqsqGjtKmVsqynoqSyq66pu7KssLW0xr/Ew7XAxL3JxLXAyMK1q7WosLiswMS0t66strmlmauxq6qYn6aXrbu0m6iwm62frrSxp6q6sqe6s7eyuMCqt7LCvLTFp76urbe1qqisoZeXkqaloqOYmKWvuK6ytbagn6ikmZWVk6Sgt6KlppausrKmqqahnpuampaYqJ+gmKGer7Kipo2Xrpmlq5eanaSRm46Tl5mFlp+UjJCcnpSLqamqoqegmJ6WjI6ZkIGFlYmUn3hjaF1rak1QTU5UPUNBTkM6OklANzdRT11eUlZRQVdgXEJKU0hWS0g6VGRcTkZPTltXW1JQUVhdR0FCW1BCRz5OQzlIR0hOUD8/Q0lCTEI8MklBOTQxNzdCPjs3RTcrNjkxNDgwMi0vLjw2LSNCcWdzazIzLzFbYlozMzgwNnBbYkgwNUpwaFZDV0aMeWZDO6SjnKGmv6aor7ChqbWqnbmwq6OqtLaxsLm3r7a4uMS9w8e9vMPBxsC4wcbBuqq2pK27rcDCt7eqrLG7opWtsK2ylqWnkKq5qaCnsJ2qoLC0sqqptrWsvKyysrm3rLmwwrq9vqbDq7C3r6mrq6eemJmroqKgkZihsa+zq7G6m5ypoJmWkpemobeppaOir7G0q7Koq5+boKCbnqWcopado7Owmp+Qk6WaoKialaGelZiJlJiTlpeck4iQm5mUjqmop5+jm5ebk4eOmYt9i5aFj5tqaGxhbG5XUFFaVEFDRVRAOztJQTc6WFBkXlBWV0RZXl1NTFJOXktKPlpjXk5IUE5bVVlQS1NXWkk/RFhQREY+Tj89SUdHUVBCPUNGQk0/OjJEPzc3NTQ3Pz05NUU0Kzc1LzI1MS4tLiwxPionKz1ccD0+MS4xZVtkQDE2NDdnWWBGKD84bH1oW1Y7iXtjQz2nn5yiqb2hqrCro7G4qaW1s6ygrLS9rrO4vLq9trbAwr/IxLnEwcDAuMS9wbevtairt7K8vr+0qa6xtp6Xq62orZanqI6nu5+krbOeq6KxsLOsqba0tb2tr7G1rLC1scC6xLervK+xuKytqqOxpp6lqqCkl5CZn7Oqs6qrs5qdp5ualY2gpqS0rqeira2usaezrbKqpJyfqKSelaGYm6i1qZeZkpKfmZ6gnpCrnpeXhZWYi52ZnJOKjZaXmpempaKgnZWVl5OAj5SFeo6Sg4yWZWxyZ3BxX0ZZZlZEQ01YRFo5SEI2Pl1RaFxOWV1HW15dTk1SWGRKSkNcYl9QTE1OWFdYUEpWVldNPUVVSkVEQU0/QUZISFFQQTtGREZLPTg3Qj02ODcxOT48NjVEMCs4MC8wNS8qLC8tKj0sKyUyKyo1SzEuJ19fYVUxNTA9YFZeOClDM1lVXGdLNYx6ZkxApJqgpKy3o6yppa6utqmvtLqnprC3xbextr7AwbW0usW+zMW5wr+6v7nEuMG5srWsqrq2u7m+tKqtsLWYmKerqqubrKuOq72eq66xo6ugsa2zrq62sbm3qa2usai1r7O7vMmyqrW0sbWwr6ehs6CaqK2gpZWWm5qyo62gpq+WoaSampKNoqWnsqmip7Ksqralr7G1r6SZna2nmpifmZmsuKKXk5CPmJyhmJeUq56ck4CTmI2dnJqWkYqUk56apaGhoJiVkZOVeouQhXuMioOLkmtueG11e2BFYWpZSUhZWz17SkdFNkFiVGlbTVxgSltdWlJSUmJgTEtFX2BgUUxJUFdWVU9HV1ZVTjpJVklIP0NLP0VESEhRTkE/SEhIRTw3PT46NzU2MDk/ODY2QiwtOCwvMDQsKCwvLSo3NikoOS4kOks1LiJUYFVgLzUoQ15RXC4qQi9KR1BbSDNjWVRKRJmWoLCosamtpaSurrWot7S4pKu0t8m7tLq6v760tLfDwMzIu8O8tr6+wLi/vLG9rqe6ube2wbarrbG4lJemrqunorGqlK+7pKyysqeoo7KzsLGxtbG4s6iuq7GnuK+1tMPFtqm0tayxrqqno7afn6eyoKSUnJqVsp6nnKCqjamjnpuWmKWlpbenorK0rKexp66wtaylmaCsqJucnZuUqbiclI6Oi5mcopeQmKWgnpWDkZWQnZyYlpWIl5CXm6eco6CSlZCQlnaEkId7hYGEjYttcXd1e35cS2VsXEtOY1w/YntHSThHZ1dlW01eYk1YWVdUWFRpXU9PSGFdX1BKSFFWVVJLSFdVVk04TVpORUBGSz9IQkNLU00/P0xPSEA7Oj47NjswNDE8PTQ1OD8pMDcpMS4yKSksLC0rLTkkMDQyJTlCNy4jQU5IZjI3J0ZhTFYlLUIuPUVNUTwzcmpKQ0OQmaWupa2uq6eksLKzqrewtqCrtbnJua7BvMK3s7G1wsPOxb/BvbS9v7+6v7yzxKipubC2tr+8r6uzspygp7CtpaWwpZ6ytayrsrCsqai0uay0srWstK2prKirqbmtsbHHv7ikubCpra2mqK2wpqSkrqOpnJ6cm6+aoqOjo5CsnqSgn6Kqpaa5pay1taWqq6isr7auo56jqKqboJqakqS0mo6JjYeRoqCVjZSdn5OShI6Skp2bmJWUh5iTlZmmm5+fjJKQjZB3fo6FfHx9h4qJcXRyfn19XFNkb15OWmZdRkSWWkc7Tm1YYVtNYGJOVldWV1RZZ15RUkxjWltUS0dPVFNOR0lWU1xOO1BeSUJESEpBRT8/S1NPPjpOTUM8PD45OjU9KzMyPTYyNDk6KDQ1KS8sMSgpKywtKiY1Ki8mMCkzODoxJiozQmM7NipIZEhKKzpJPzNCSVMsPo9rPEdIj5uqqqKpsKSopLO0sbS1sbGhq629y7quwLvHsbSttMLC0cXFvsCyvsHCvL+3vMSnrLess7i7wLCrsq2gpKetqaiksKOqsaqvrLCur66ss7untrCyqbKpq6Wlo626rKqxwrm1q7moqKitqqixpaqkoq6qqKKenKOslaSdmJ6ZrJ2ip6mirKWjray4sbKgqaKgq66wrJ6fp6ipmaSYmY+gp5iGg4+Ki5+gj4uMlpuOjoWHkJWgnZaXlYaWk5OXpJydnIqRj42Jf36Ihnx3f4eFhnRzcYh1bF9ZYG5jUXNxXEs7hHxGPld1WGFZTmNbTlVWVVdQXGJeU09OaFhXV0tHTE5SSEVJVlJdYzxQXUQ8RkhIQkc/PUpQTDo+T0o9OT89Mjo3OyozNT4xMDQ4NSg1LyosLjMwOyksLCclMjM0JCwyLTg2MCkoMTxdSjAuSWdERjg8QjA1RUtYMUCUWj5MRZSXraeiqrKcqamvtqy4ta6qpauqvci7sL23wq+wrLPEw87Ow76/tMDCxLrBtMnErK+3rbK4v76zra6rpaeqsKmnqLGltK6rsK6tsbCzrbO7pLizrKyup6ufop6wt6uqrbq2pbW1o6mnrKyqraGpp6axsqOmpaGhrJaqoZSaoKaepKKrpKyin6ext62to6Wim6mqrqmdoqWkpJigmZaPmJ2TgoKQiYWcoIyKjoyZjZCLg4yXo5uSkJuMk5KRlKKZm5mKjoqKfIaBgoN6dICEgn50d4ujh3hqXmBuZ1dlh2ROQGeSTERieVdiWFJlVE1WVVVUT1xdYVVLTWlXVVdJSkhJT0JHSVNRWW9BTVhAOkpHRkVHPj5FUUg4Q0tFODdDNzI6OjoqNDk/Li80NjMpNCsqLCsuIzQuLSsmKCs3OSomNis8LTIsJjA2V1ouMEpnQUE8PEMrOkpPXjREhj9IRkSWkq+ko6qwmKuprbWrtrGrpauqqbzAwLi4s7u1pbKvxMnL0b/Bu7nAv8K5wbrBxK6ytbGzu8C+s7GurKurqLaqpq2vq7mwqLGxr7Kstqq2tae0tqyspKmqnKOes7OoqKS0tKC1raCpqKuoq6egq6uoubapqqqpoqmgrJuSqaGdoKSipqOpnZymta6opqmio5elp6eqnKKko5+ZmJ+Rjo+Zjn6HjIeEnp6HhIqKjo2QjISGlaKajoyakZKRj5Kfl5iWi4qDf3SGgX9/eHWDf3t4foGInY9vcWdncXhcYHOIak9dmFZIbXhVZFZSYlBNVVRVUE9YW2JVSFBpVFZTR1BZVUk+SUhPUVB4TE1WPTxLRD9AQTxAQ1VDOUFLPTU7RTEzOzk3KjQ6PSstMzQxKjgqKisqLCkqKC8qJiklMzssJDIpMjAyMSUvMlFiMDI/Zj1OWD9DLD5MVF8vSmo2T0Q7lY6woKWrrZmrpayus7SvqqWvqai6vrzAsK64rqG1r8nHyNHAvr27vMK9usPBv7+usrKxtby8wrGys6qzqKS1qaWts7O5sKOutrGvsrqrua6qrrWrqp6pq5+ioLatqKGfr7OhtKqeqKeqo6qhoqytqL2vrK6toaeon6uZkK+hmKKhqKefqJqZqrCpo5+soqGToqOjp5iaqKWXl5idj4qHlYh9jYaFhKSXhYKCi4aOjZCEhJOgloiRnZCTkI2RnJSXj4mFhXh0gX99dXh5gHt0c3ppgYajdWleZWuBdWeIi3xSWHBeSnhzU2RTUV5NTVJZZk5MVlllWUZTaVJRP0JOUWFROklITFNJcVFMUzs8ST87PD07QEBXPDw+SDczQ0IxNTo5My01OjopLTMxLS02KSgrLSw0MiMyKScsJS47LiYxLjAtMTQlLDBMaDozOF89YWQ/RjFDUFtbK0hOOVVBNJCPsZ+kpqujpqSsprSysaqksKequL7Bu6+nuaqnrrDJxsjRwry/vrm+v7zJvMG4sLC0sbq7uMCys7usuKyitKanrLK2ubOnp7u1rba9sLymray1q62cqa+jn6WsqqecnqqzpLOomqqnqaSpnaOpp6m+q7Svrp2ppKCunJuyo5WknKSln6SamqirpZ6bqqGbkpuhpZ2Yl6mpkZiak5CKgo+Ffo+CgIiej4Z/fYuHkI6PhH+Tm5OFk6KMlJKLkZuSlYeIfn9xenl+fGl3fHp1cHB9aIV4hIdkYGdjcoV6bWd5XV5WQld6bVRhT1JYS0xOcXRdSFpbZ1lFVWZQRD5KTkRDQTlIR0tTP2phSVE4PUg8PDw+Ojw/VDY6P0M0NUg+Mjs1OTAyNzw1KC41Ly0xMSYvPktIMCUaOTAlLCwwOS8sLCs2JzE3Iy0vR2pJMTRYPWZiQUo3R1NgVSo9O0RYPiqPlLGZn5+ppaShq6S3srKlqLGnrLjBvbWwo7mtqKiww8nJzMG2vb+1t7+6yLbDtbSztbG9uLq+tq25tb+tobOmqquwtbi0q568vKiywLO6oK+ztaqsnq6wo5ylqKminpylsaavoJ+qqaiiqZukqKCtvKiusK6hq6Okrp6eraaXn5uho5yfm5qjqqKamqSklZeUn6KWm5amrIuekZCRjIKKgYCPgHualY2JfH6Lho6Ni4qEkpiRh5SjiZKSh5Caj5OBh3x5a312eXhie3pxcHFyeGiAc2qDZ2RoYW5zjm1iaXBgcEFceGtWXk5RUUpKTVNZVk1dXm1XRFhgT15QSE1ERjs3SEVLTzxyaEpLOUFFOzs9PTs7PUo0OUI8MztHPDQ/MTgtNzg7MigwOS8sNS4uPS0qSz4qHTQ5JicuMzQuMCsvNCYsOiQ0MEJoWTEzUz1lX0RMNktXZU8qPDJPWj0ikpmsmZ+Xp6Sin6ejuK+uoq+wqau4wrqzrZ+5r6uotLrHysi/t8G+r7S+t8S2w7GvurKywLW7vrepube9q6S0p6iqsK65saqbu72ksMC1tKGut7Wmp6exs6CepKanoaWZnq2nqJ6gqa6noKaXo6igsLifo7GvoayhrKScpqaompqbn6OVnZyanammlpufqJKYk5idkpmWoaqQmomOkId9h3+Cjnx8oY2NiHmDjIWJjIyFh5KajomVn4mRlYKLl4yRfYR7c299cXN0YHl4aW9wcG9pfnFjemxpZWNhZoZ/YFtyanJNTX9pWFpNUExKSFBSUUlOXF9uU0RYWlJnT0hLRUY1NkhCTEk1WmVKQDZFQjk6Pj0+OjpDNTk+OjNARjwyQDIzLzo7ODMmMjwwLDg1QiopLUMqLDQ7Tk5AOzczLS4rLTcqKjwlNTM9ZmQyNE0/ZV1GTz1SWmhIKj4vWVg1KJedpZiclqygn6GkobersaS0tKqoucS1sq6gt6yurbC1xsjAt7/BubC0vbe/u7+vq72wtL+xvcO5qbu6t6eotainq7Cts7Gnmr23pK28tq+fsbewqKWnr7GboKSgo6Shl5uvpqGfoqevoqCik6Sko7ewoaaxq5+so6+YnKqlqZ+Xmp2lk5ucmp2mqpmcnKWWlZeVnI6Tl6OpoZCJipCGeoR+hIp6j5eKjYZ5goeEiIuOhY2TmIyOlpmKj5Z+hpeLj3qAenByd25vdF94d2RsbGtpaINtZnJpa2VoXGNzgF9aa3VpWkl9XltYT09KSEhSVUYyOV9ebFBEWFZZZU1JSUVFMDdGP0tCNklKSDs2Rjk0OT49PDk4QDg7ODo3QEk+ODw0LTM8PDc1KDU+MSw7QTEoKzY8IzhSPSoxMTM+RDUsLSc0Mio7KzEzOWNsODRHQWZbSFREVV1oRS47MmFULDKWo6GXlJyqnaWhoqC3qq6gurmmrL3Es7CuorWvrK2vtMPEvLO/urews7m4uri7rq3As7S4r7/BuKy8urWmorOqp6mzq62yopvBtqWotbWpnrK7qqemqa+smaKnnKOmlJiisqSZn6SoqZyioJOloKS5qKSnrqeepaGokp+poqGgmZudoJKbnJagoaubm5mhlZKVlpqOlJOjqKSQiIqPhnmEfIWFfZ2NiouGeYCEh4iHkYWVk5KMkJWUjY6Ue4OYj4t3fntsdHJsbHNheHRoaGpnZW+EZ2doY2Zoal9oYmlmWmV7Y2BTc1RbW1NMSUdJT1NAISppXmpMQ1ZVXmBLSUhFQy46QjxGPDZLUEQ4OkQzNTc9PTg5NT86OzQ+OEBLPT45Myk4Pjw6OSo2QDMuRTQoKyw+MC1OPy4rLTcsMTE5NSwmLjUtODA1NzZgdEIzQ0RnW0tXR1VgaEIzNzhkTicynqSjkY6kppuenp2jtaynqrm3qKzDwLawrKK1rqevr7fAwLyywbaxrrK2tri3tqyqvbOvsrG9v7euu7uxpZ62q6WltKmrrqCfwquopbCzqqy1u52oqquxpZidqp6mpJGZpq2imJ6kqaGcop2XoJ2ntqavqq6hoZ6doZWgpp+hoJmbmZySmZ2UpZ2sopiXnpWUjpWXjI+YmqmgkYiKi4l5hXeCgoKdh4uCiXx/hIiGhJCElpWPjpCRkZGNknuDlY6Gcn19Znhva2psZ3Vza2NnZGN0f2FkZWZlaWpjanFZXlhebWRhTmhXWmBWSUdIS01SWD45YGxpR0JUU1xbSUlHRkEuPD85QTg5UkZANzpCMDM3PTc2OTI6PDk3OjlETT1CPDAqPEA7QT0tNUIzNz0rKiwwQSpKSy4vKiszNzIyKDU3JCs3LjcyNjg1XHlOMj5IaVpMWkpWYmZBOjNBZkglNZukn5CMraGZmKCWpLSxorG9t6Gxxru5sLGjt6yqrqm5vbu7rcCyr66ttq+zuLOoq7mxr660tru2r7i9raadtaugobClq66epMOgsqSusa+3rbWera+trqKZnaiqpZ6Vm6iln5mlo6idmqCclJydrbCmuaiuo6Gamp2ZnqOapJ2XnpiblJqgkqiWq6ibk5yckoyVmY2UlJmop42NiomPfIJ0goGKmIWHfImJhISKjIiShJOckpKPkJGWjpB/gIyNg2+Af2Z4bmhramdxcmtcaGNicn9gZGdqbWxnamlmbFxsbXVxYVRiaGRlWUlGTE1PWFFRVmFlgVRAVlNZVUZIRkVALzw9Nz82PEZOYTg6PzI0OUAzNzgyOD83PTg+RkpARDkyLT1BPUE9MDVAOUAxLSsuMzw7SzYvLissLTI0OzYjMyopNi41NTQ2NVp8XTE5S2pbTVtLWGRkQEExSWVDJzSTopqOjrCdmpOhmqmysJ+4wLagtMK7vbmxpbavqK6lt7i3t6y7r62qq7eqtLmupbO1sa6psba2sLK1uqeon7apnp6poqqtnKnAmK2krrC2ta2tn7GtsKqim5yjrKiblZyno52aqaKklpqgnZGbo6uqqbufqKSgmJmZnqCPa6KWmJxxgpabpIB1kqqnnpWVn5GJl5mAloqgj3mGlI2Dbmp+d4NxbIaLhn2Ei4ZvXmNgZ4SXhmuLkJSTdXeLhH6Dj39mhoBodWlmV1xpc25OUGpjZnGEZl5kZm5saV5fX4mQhIZnT0tEOEVUZ15KR1BQVVVLSFNhb3RlRltRVVBGSEZDPjE7PTY9NjwzZlw1Ojw3NTtENDg2MDpCNz86PkZMQ0IzNDM9QEBAPTI4QEU9MSwrMDg+RzYwMS4qLiovNTY4LCMxJzIxNDoxNzZYgWwxNk9rW05cS1tmYj5HMVBkPSsvjaSZh5Wwm5yToJuqrqujvcWvqbfCuL28raa2sKWrpLizsrOwua2qp6y0prC1o6i4trWop6y2sq60rbOiqZ+0q56ipJynqJqsvJWmpa+zuK2upaiuq6yloZ6coKemm5ihpqWbm6ennZOeoJiQnqiqo7Wwo6OjnZaXmJejiKGOkpqHoYeUnaF/pX+nq56TkpuSiIRyeI2OhIihdoiNaZeIZn1zeKFviIeEfo17f6Ggn5mAe4eedIiOdpuKbIeBg21oZWN6bHFiVIZtY2xpmHFYam9uhldeaVtraluIcG15coZoh4RaXkZOPkZeTUVSVlZRUVJXVGdeTFhKUlJPRUdHPjw0OT05PDc7MDw8Nzk5OjY9RjU4NjA8Qjs8OT1GUUc9LjU8O0A9QD41OUdBODIpLjE8STkvMDEuKi8oLTQ1ODMlJjIxMTU+MTw4WIN1MjVSa1tOXExcZ189SzFWYTcvKIyml4OcrJ2ZmZ2fqqqnqb/DrrG6vLfAvqqkt7CprKayta6vs7arqaWxraW1s5yttba0pqeps7Gtsqevn6qgsqifpKOaoaOcrrWVpKWmtr2mrKeqqqyopqKgmKCno5mZpqOkmJykqZaUopyVk6OlpqC3pKSgo5iVk5iTnIiuj5iUiamLl6KbhbGApK2elJqelXmC1Kh/h5TBm8d5d7Glt5dkgMCcv3mEhHmPg3yQkJHKcZa8nMV7cranupB6gWyWsauweWhrWLGub2VpvJK8bmh5bXKP2H5Sa2O2sn+BcZR1mqGqkFdPV2FPVk5GVFtYUVBSjFxXXFBAXUVRTkRHSTw8NTc9Ozo5Oi49Ozg3ODs5PkY2Ojc0PkA+Njk/RVJJOi41PjtCPD9BODpKPjUyKjIyQkUvLjMyLisvKS0vMTg2LSAvNDE2QTE9OleDdzIxVGtcT1tNXmdcPkwxW100MSGNppOBpqmfl5ydpayyqLDCvbK1wLW3vsKrprStramnr7Oqr7a0qKimtaanuK+ds7K2qqWkp7GurbGmqp6npLGkoqGel5ugn6+tlZ6in7S6oqqooa2upaKdm5qiqJ+Ym6ign5iep6eRnKeblJ2hp6KgsKOfn6OWlpKYkpmFr2pqio2qfmeElYetZXCenZSappVxrqGkfne7fGuhj3axX2q0W6WAZpyRYGaBemZ/anhqqWW+cmemjHayanyxeHSSk2NtbadtW4SgRWlmh5ZFdZxgfWd7pKeCWV+Lq2mBlXh6aqc3Sq9bV1RsY1tLTldfXFdWO06IT1dWL0lUVElDRUY9PzQ2Pzs4OjkwPTg5OTk6PTxEODs6Nj1BQDY8QEhRRzkwNzxBQz5ARDhARz0xMy0zM0UzLi41My8rLyguMC46NS8nJDIwM0IvPTtVgnYyLVZqXE9ZTF9nWTpNNV9ZMzEbkaKVgqynpZ6jpKmxt6yzvb6wt8Syt7rCp6mwq6+pqbCvpLC6sKSlrrOjqbipnrOysKOloKqtr6uvpqefo6KwnKOcmJWXm5ytppebop60s6Grm6KtraCemZegoqmcmZ6koJyZoaekkJ2jmpehn6yfpqegm5+hlpWRl5GahbWbtXiFqZm1mXeHs5u3f5SWl6mUfmuBpnqBhYiSlJJ3q2drsVuse4+HlHSIcI+GgICIkJd4g4KLl4yDoI+EsHZ3n3Fra2x8i06kWEhjY5l+Y2imYHlydVOSh15QqW1jcX6HgGKdLlGhbltUa2dgTEtcZFhcWkI+sHhXWEEjTWlFQkRBQEExOT44ODo4NDs6OTw5OkE6RTo6OzY6Q0I4PT9LTkc6NTpBRkJAQUQ8RkQ7MDIwMTtGLDAuOTQwLC4oLzMsPjgzMR8vMi1EMTw8U31uMytYalxPWE1fZ1g3SjlhVTUwHJWflIizpaahrqmns6ypu7bCsLzCrbi3waqsra6upq6yqaGvvKqhp7StpKu1paays6ejop2nqrKosKelnp+fr5afmZWVlpifraKamqSota+hqY+pqKqbnpWYoKWomZ+co5+coKOko5abn5ianaOrm6aanZuioJeTkpOTnIPVk5m5cLDCfsaGfNaUm7t8mpalkI2cjaR7joajgqWCeqx5j51Vr3uJfp9quVq5d4aDfKaCk3yYeqp5jpyPe7FtjoR0kLyFb5RQr6fFilGgemNgqmJzcodsl4hgU7W0yIaAiXxjpDNCnXZdUWpoY1BAWGZaZGFKSE1sS1tTT1lmWkNEP0U/MDw8NTk7NzQ8Ozg9OjxDOkY6Oz42OkBDOzZAT0xIPDo8REhDQkNEPEVGODEyMTFEQi4vMDQ4MystKS4zMjM5NzEjJTUqPjM9PVF3ajYqWWlbS1xQX2ZUN0c6YVE3MiWbopOYsaeopbOqpbSopLu3wbC6wLG1tbyztaexsKOws6afrraom6i5rqOvsaCztLCgpJ6ep6mwqLSppJydnquXmZeWl5WWoauempeorbCpo5+PrKKnlp6XnKGloZehoaKhm6Kip5ueoZ6VmZumoJynlZybn6GZkJKVkZ2Ism5otXGrh2+OpnK0c3K2e5qYpIyPnI2ifpCgpX6wdoOR0tF1W658hn+kb5uqpmuGhHytfZeZj3uxc5OdjnizZZZ0hJ5vnmaUUsiLWsJcn3liX61fdnOHYpeIXlnKnW+/gXVNS7VTVcZkVFFqY2ZYQU9qX2xpT1VGSTk9V1JbV1hIQz9KPDI/OzU9PDQ2Pjs3Pjw9QztHOTtANzs+RDsuQ1JKRz4/PElKRkNFRD5ISTkxNzQ2QD4vLjI0MjUyLSkuMjYsNzQyJh82MDs1Oj1QcWg5J1dpXEJOVF9lUDVHPWFNNjIvoZyRpa+spKq7raa0pae2u7yyur+3trW6urOltLShsbKjn6ywpJimuq6ksbGdtLiqn6adoaqksaesqaSanJqpnpaVmJiSkqOooJeTpqqxpqKWk62fpZKUoZukpp+UmqamoZujn6yaoZ+ekJacop6cpZWdlZqin5aZlpKbhax7d6h2o46Jh6lvrYqDqIOZmaGJkpqKon+SmImuhX+Cs1xys1KufoOCpH9x1313hH2OnYeZmXevhoqRnId3tGGaZZqBgpRsklqwWEuadZh5ZmCtXnZ3h2eYiGter3eVno94bDV5yK6yX0FUb15nYEVQbF9xbVZVTS5lY2lTWVE6QURATDo1PzkxPTwxNj85OEA9OkM6Rzs8Pzo+PkU5LUVVSkVAQzpNS0pCSEc+R0s5Nzw0Njo+LzA0MzMzLjIuLjE4Ki4zMiUhMDM3Njc9UGtlPiZWZ1xAPVZfY042R0NgSTo4OJ+dlKC4sJe0wa2os6ipsrq4s7i/ubeytr21pbizn7Ssn6Coq5+Vp7arqLGyq660pJupoKCoobWmpqqjmZ6VpaGUlJyZkpWipZqTkKesr6aglZmpn6KPkaKZqKaglZmlqJ2cpJ6snaGdoI2Un5ueoJiZnJaXoqCTmJGmnYapfX2leKGPjoOqcK2MgqeGlqChipeXiKOCkYeUqnyAi515b7Fap4OCiKB5dNh/dod0p4GOm42SpHyWkJ+Ee7JenGSgfoOVbJJcq1tak3+Rf2hnqmNye4FrmIdxXaxaiaCOa25lT0pDoVxaTHReYmVNWmFfcnNfSlU2SpqTWUhFPUhGQUwzNUE4Ljs+MDVBNzhAPDY9PEY/Ojw2Pz1CNy5IVkpFQUg2S0lOQElLQEVOOjpANC46PjEwMjE0NCsqMDUvNywmMjEoJCQ2NjcxPFBlZUEmVWZbPzFVX2JMN0ZJX0MxPjihnZmZvquXtMKuq62ppbSwuLG1v7m6s7G3vKq7tJ+wpJ6lp6eelKqxqbCqtayrr6GYoaCmpKO5oqOroJebkaKglZSfmpSYn5+PjYypsK+mnZebqKafjJKkl6irp5SXqaeen6GjrKShnqGNlKGYn6CSnZeclZ6glZaPq5uPrm1ytHKpjHaKpnO0eXSzgJKkopKcjYmkh492uG+Me4uia2u2WaGGZZeXaaGip22TcrR0k5h/smqFk4ita3WzYZ1mom+HkmqXXK1gTaF8h5FSc6NseX9+b5iGcFyvVjycd2ZUb24uXKdPYlJrZWFsWWJcYHB7Y1NZUT4+bXAzQkJAP0w5ITdANi47QDM3QzU4Pz8zOzxDREJKRk1JRjYySlRLRUJJNklKUD9ITkNGUD08RTUwOzswMTAvNzUsKyw0MjYvIzAwLCwdMjg5LzlOYGVEJ1VkWT4vVV9hTDVGTV44MUI4pZqbnbqhm7LArq2rq6e3qbivtMC1vLGvubirwbapqqCbpqShnZKqqqe2o7Korqqgl5ynoKSruZ2jrZuWmY+lo5aNnaGbmZyfkJOUq7avp5mUnKyql4yTpZmlrKORl6qyo6Cep6uwmKGjkJmil6CblpuXoZOcqZyUkauZh9SSmrtzsMOAw4Z+1ZacuHiIkJiMl4mMp4h6o7Z1fXd2woKasmCDunnAfHW4YrWBjIepfZaBrKlxe391vIinoGmdYaaOr6F+jHSHq32+bnO8dLKDdXiAim6aiHFujaR0vV13fVthebxrWlZbanpeamBkZmJtd29ZW1lDQUByP0NHKzVIIic7PzEwPD83OkI5OT1DNDxATlpeYGBfX19aUFBSS0VGSjRITFJASk5FRk9CPEU4ND05MDIwLjg3LSouLzE4MCItMSwzHiw8OjA4TFhhRidUY1g8L1ReYEs1O0xbLTdBOaeanqG8opexw7Ctqaqrsae5r7bFsbqyrruwrsGyrKWinqOhnJuRqqSqsqS0pq2kn5aaqpmmrLicoq2YlaGQpaCTjZyjnpidmpCWk6+5sauVl6Oop5SQlqScpK2ekaCoq5+bn6mjsp6jpY6nopShmpyXlaSYj7CgkpWqnoWQmbWAkJGMuJV4gpObtXdubG5zbnmPhI6Jc57Bu7yae4GyqHCAdJG4g3yGhouHjXuKho2XfKS7ub2cdXqzo3R2l3V0sHWZnmaGaY21dHJwd7aMXn95fYlng3lteWKLrHB1hX9ZW6dqRGRZU2ZgY11jUWdmcWx1Qk5QTEQ7Wkw+SjM8MCA4PjsuMz1BOTk/PTs8QzZCVFlaWltbWlteYGJgXVNHR0g0RElUQktOR0VPRj9HPDc/NzA3MC85Oi4sLy0qOC8lJjIoNCQoPjcvN0xUX0cnU2JWOCpPXV09KzpWVic9OzynnqCgv6WWtMO0rKqnrKupu66wxa+1s663p7W4ramjoqaeoJ2ZlKykraqmtaion5uWoKOeq6S+pqGql5SdkKKbko+iqKKTnZeSmJSytbatmJ2kpKKLkpGmm6Wrm5aopKWcmqGppqejqaGSrZ+Xo56Xl5edno+wqZScp6KOan5pnKd4iXN+mo90emWHer2+wLpukoNxlIZgcmpaXpqJYWSHjpVrYH+VY22cdmKUa3+alZRlXmBjcZqJaHKMfYaVZ2p+cXR4fX1iW3d0gWhQXG6DfHuLalhreoJySUpvhXBNdE1FV1xmYExbWGdjXk9bbXVpcVJPREVNO0hJPEw/MiwyQT84LzU/Qzw5O0A7PUM+UlZWV1laW1xcXWBhYWFgXFVHNURGVUVKT0hGUElJSDs4PTUxOi4wOzouMC03Nj01JiIvKjIsJTs4LTdKUl9JJ1NgVjQpUF5MKDM9W08nPzI+qKCoocGjmrS6tqKspa6nqLWxrMissLOstaO+sbKmoKOpnaObmpmsp66kpLWppZuXlaGbp6yovqepppWUm5WgmZOYpamnkZ6Qj5idsLK/rJumnqeiiZORqZqopJqbq5+jmZujp62in6qimrCblaagl5Sdn52XsKWYoqiZnJGdnKOkmaejmpyampqQloFobn1xd5GXlJGFirWqjYaYlY6KjJeXh5SVioOSk5GJjZGTmJSYl5qgopqblKCdjoJ6pYZraXyQfIB0iYqBcYJ4eXZ2ioB7impzgXSDdWN3fXZrcHttYGNccGdNWVllal9XWm96bW1mU09GUzlPWk5STygrOkpCNjM1PUBBOTpDPjxFTlNTVFZXWFlaXF1gYmJhX15eW1RLQ1NHS05ER1BMT0k8OjszODksMjs4MjApNklSTzgiKSsvMiM0Oyo3Rk9bSiZSXlMxMFReOis9OFxLLDwtQLKgs6G/oqSxsregqaWyp6WwtarJq62xpbWmwKi0oJ6kpZyklZagq6aso6O2rKCZlpagl62ppcCeq6SVkpyXnpiTlKKfnqKnk5GYqaeyw6+aq52rno+WlqmeqpycoKyYoZqcoqWvpqGkqJ6tmJemnZmaoZ6enLCgnaKmlZiTmJOgopajnpegjpaUi4qNjpetj3yVm4KSgouqqIaBmJaKhI6fiHuEkIaFmZCHhomVjpuXjZCYnqOWmZORnY1/jWahs66EiYR2eo+KfHZ5em9neZCBgIlrdYF5iHJoc396doOIgmt0Y3lmYGlkYmRmallre3BpalxTTFBEX1VGQD8/LDRARjs0NTs+QTs8Pz4+SE5OT1BTVVZWWFpcX2FjYV9eXl1eXVhWSktMQklPTVJKOzw6Nzg2LzI5NjQuKCYkLTEuLykrKjclKzwoNkNNTUQvVF1RMDVNWzE3RTRcRzU8LEC0oLmvvqyrrrKyoKqmsa2irLOwxbCqraOzrryktJygpqKhnZmXqKWppqSms7WelZSdmZmwpq6+oKujkJGempmUkZWhnJepnISeqayitMizn6qkq5aWl5qnnaibn6SrlJ6enJ+qrqmlo6uhrZufoKGYpZ6cn52vo5mfqJOYmJ2RpZmYqZ6al2aDknxlfo6aj2N5jWxoa3qRpKtrZZqYfmeFimVlaWh6jaGOa2iMl5Gid2tqi5ijn5hzbG56hI2GeVhlXYWBXmyKiYB2XGhzd3eRgIeCbneCeIBzbXmDdHeIiI6De2qFWV5rdGRdc4lpanxxbGNdUU1XSmRYQEo0PUY3P0ZENzE8PT9BQzs7REdISElMTlBSUlRXW15gYWFgXV1dXV5fXVpVT0RIT0tTTj0+PT02NTM1NTU0KiYmJSwqJS8qKyc2KiQ7Jy9BSltKLzdaTzYpRVkvRE8xWUM7Py49pZ+6vLmvq7OwqqWora6wpq6tsL2xqaikra+xn62Xn6OeoZqZpqucrKOmqKmyrp6Vo5Cir6a2uaWuo4+OmqGZk5KboJmZpZZ7payiqLPDt6Sip6+enpWeo56jnKOpqJGeoJ2fqq+qq6Oqn6ibpp+noKyWoZulsKSYnKqVoZ6ak6WYnquZnn6+g4hytHKEnYataHi5xLhxk6Kje6aYmXOqgnzLwMC7cYuih4KffJWYiZ7AvYKWnZ6NncHBe4F7kYyawr99a6Wxb4yAb8p6f5t3kYOOgHZ5gX95cXp/h3F4hYyTeW12kmJmX3hkX2WCY150aG1kYlhMVklRWkhPRDJJRT9EQj4vPD8+QEE6OERDQkNFSElLTU5QU1ZZXl9fYF9eXl5eX19fXVxTTVBHVU5BPz89NjQ2ODI3NiomJSMpKiYuKyopMTAfOSojPklbTCojQlAvI0ZbM1BZL1VBQjsvOJajuMO1sK/AqaiUo6+psK+tprK1r6qmpqaxq5+rmJqioJybqqeinKuipailpLSjnaKSpq2st7Onr6KSkZqdpZKRoKGXnJ+dh6erpKutv8CwoamvqZeSn52imaKjqqOSoKGdna2uqKymo6KnoKWlna2pkaSbqa2qnJ2qnKyhlpellqGjmJx/zpR5eqSBeZWWm1+uj16Op4GhoHynlZt0q4OAr15jjap6p4eFoHSXkoizY4KrhqGOjbNphK50fZaHuGGCrVmjzW6PdXvae3+ZcH6IknV/ZXuIdnZrfYhufoWRkn5tgY5gcWtwZ2BfeWRbcGhqZGZgUlRSV15LT0M1QUhFRDg+NjtAP0E7PThAPj8/QkRERklKTE5QUk9TXF5fX15dXV9gYF9fXVpXT1VKPT8+PDU1NzgxNjQoJyQhJywmJi8oJiszHTYwJDc7U0wrLC1KMCc7XDtMLSFQQEY0LjGtwr+/tbSwt5iekaSqqK20q6ayrK2spKunsKqgp5uZpZecoq+foJ+op6OloZ+wrJuelaeurbGrqKyglJKbn6WTj5+ll56oo56upKqwqL/Gs6ipsa6Wkp2copegqaqelKCfnJ2ur6eqqZunp6Shq5KttJalo6qqnqOnpqGwoJKap5qhm5SUkZegcIWMl3WFqIdxsHydcqx+oZ6BpY+ed6uCfa1/nHKtfquHhp92mJJ6fJd+qoiijJGLnX6re4mTj5+Ae61WnMR6j2+SwX2BlW11cIxtZXZlhm9hd25yb4mKkZCDbZCPZG90dXBgZ21kX29paW5mY1dTXGFaUlNDOUlJQEQ8PjxARkRDRUE9PDw8PkBAQUJFRkdFQENJU1dZWlxdXl5cXl9hX15eXVtaUkM+OzkxNDc4NDUyJiMfHCAxJyAxJyAnNB41LSY3PVdKLTwnPjEpM1ZARiEcRzpDMS4rr9TGxrK0n52jjqOjoayvtq6osKepqqiuq6unoqSdmaKVn6aqn6Kln6ioop+dsKyXmpaop66sqKepnpeUmqOikpShrZudpqOvrKOstKm5zbGtp66slpScnaKYn66snJagmZ2eqbGpqambq6mjoqybr7GiqKyuppmmq6qqsaKSl6Olm5SShaRqpHWJeql0erJwgqWJmYxwiKCah6RgYFKshH+ugpp2roGmhoafepiWhntmgKOJpJmGgaN9qX6BlIeuXnypVZ2ikoF6op+Ae8OvxYxzr7OzuXFiqa/CdGiNjJiPgW2akm9teXd3b2xmZGVxcGZ7aGNdV19pWFhVTU1RTENDQUI7Q0BAQkk8PTo5Ojw9Pj4/QT04NjtETFBSVFZYW15eXVxeYGFgX15dXF1bU0lCNjc5OTY3NCwmJCIgKCciKy0iJC4hMy0mQERXSCxHKzY2KjFQS0wjIEE5RDQsJ8LJ1dXAoZmrqKGvop6wtbCvqayjqKaqqquppKagm6SenaWnpqOcrJqiq6Gkn6+inZqSqqS1sK+gqZudlpSno5CaoqifoKacsaajqLGstsiytaqsqZWRnJ2imZ+ls5yaoJScn6erq6OumqypoqGqo7OtoqqzsaGbqqivsLajk5akp5ibkXyqbJ6Eh3WreXywb4Kki4mflpWelIHSuLS4yYCBsl5flKmDpIiHoHmYlZp4qsl0maOVp6mQkpuMf5uJmsbGeGWhgqVzgZ+Ogn2vXm+1Y7F1S6OGbadHgpNkj5Cek3xwl5J/cHp0fHttW2ZqcnFmgWpeYlhjbVxeWUlNTEtFREFCPkE8Qj9KOzc5Nzk5Ojs7OzMuNjxBRklMTU9RU1daW1tbXV5fXl9fXlxcXFxcWE1CNzU2ODUvKSglJiUkJiksNEVOUFBNRktKVkYqTDAvPi01T1RRHRw7PEYyLCSnpMDGua2osq6spaKcsrmsqqGmm6imqqyppqCmpZiro5+uq52loKyanqilnaa1nqKXk6iqtrKsm6WcoJWQpa2RmZyno6Cqp66io6epsLTCsbKqraiTiZidpJqho66ll6GVmJylpquar52tqKaerKO3rKGxua+dm6+ns7SzpJSYqKSan46CnU54moF/n3qEo3yCpISGpp6cnpOEuHt8ebmCfszFwrZ4mqGRi599mpaXinaemIqkmKOofrCFnIWehKx9mZRhpWyjcI+FkIF9l4NyrGCkc3GAmmC8fVJVdY6Ro5d8fpKRinR6c4R+cFttbndyaoFvWmRfaG5iZF1LTVFUQklIRkk6OUs+QjEwODg2Njg3Ny0qNT09P0JER0lMTlBUVlhZWltcX19eXV9fXFpaWllVU09IQDc3Mi4sKi4rKicmP1FUVldXV1lYWFdVT1VGPEUzOlBbVBwbNj9ILC0gi4eZqaykq7mrr6Ccoayzs6afoJWlrq2uqqedpqaao6ehsq6iqKayoJmppJSitaKjlZehqbS5pJujnaOTkKGymZ6cp6ahoq+unaSoobWxw7Gtqq2pkYeRnKaco6ScpZeemJmZpaSomq6hrqWml7ClvK2ht7etnZ21srmxs6eYnrCipJ6Gj9G1w7d5h46FkZOPgKZ4lKJ3jKCShKWBinGqhoS0bnJqmaOblYqffJiZhoePc6+CpZuijaaLk52JlJCbbXCyXKVzk3qcbJl/e5l9bqlhonFxf59ic7K4aHiPk6aYfoyMk4p3fHmNgW1peGl4c25/dF1kZG5tZWhgSlpYWDxIR0BVM0BGPjwqKDYzLjAxMykmNDo7PD0+QENFSUtOUFJUVldXWV1fX15eYGBdW1paWFVSUlFGOjIyMzAvKysoQFFSVFVUU1RWV1dYWFdVVlZUUU9RW1UlITJBSCQpJZJzjYqtv7+7urWel6ikrbWho5mVo6mnrqqrmaWin6WgoLWmoqinsKOUq6OOpK2jnZCamqq0tKSdpZ2pkZSXrqCgnqeknKectZqgqqO1q8KwqaupoYyEj5uhoKailZmanJiamaakppirp62ipZutp76slb2wrJ+jsLO6rLSnm6mypaiYeqiQfXywd4qBpKWInG2yb6GHrXyhjoOnlZiArIiFroWflKigoZaGn4CZlYB7kn6rgJ2aloqqeJ2gj4mTkoB5r12jgXymp2SdgHyXdGuuXaVrcYWZXWBbjKBulZGmmYOUjZaLenqCln9rbH9ifXRtf3pgZ2Vxb2dnaENZYFs9S1QyVThCQkM3JCQzKycnMywgLzY2NzQzNTlAQ0ZJS01OUVNTU1ZaXV9hYGFhYV1dW1pYU1BPTkk3MDUyLiosQVRWVlZUVFVVVVVUVFVUU1RWVldYVlVVUUhGSUojKCi8kpqEqcbCt8G0n5utn664paSOm6SjoK+vqp+kn52tmJ65oKKqoK+pma2hkKqppJaJmpCusKymn6ebrZiYj6yioZ2mopqlna2Yn6iltqi/r6WppJ6LgI6bmqCmnpKUmpqTmpqlo6OZqKuro6Sfqai+pJfDrKqjoayyuquup6Czr6mqmHavfpCLnIWHfbqtiphksIxlla19oI+DppWagayKhLCFpZmkoaGQhaBbbGqBs2B/rXt7goCxbGdumZeMiLBbfbRbpINryKJln4B7vFl2tVqyfVKvgHqsWIChbZiPqJqKl5CWlnt4jZx9ZHN9YoN3dIB8YWpmcW1mZWVPVWNbQlRePkkoPjk9NCEiLCUfMi4gKjEvMDQ1Nzk5PEFDRkhKTE5QUFJUV1peYGBgYWJeX1xbWFVQTUpHQzU1My4vQFVaWFdYV1hYV1dYV1ZXV1dXWFdXWFlaWltcWFdXR0I70p+zsre9u7TBs6Ocraaltqihi5qgn52zs6meo6CdtJegs6iqq52vrZ2rm5WuqKKOiJuOr6uopqKnma6TmY+omqGepZ+Zo6OlmZ6jqbKovK+kqJ6djnyLmpWhoJmPkpqbkZmXqJ6gmKitp6Wlo6Wpu5+gxqelqaGrtLatrqefvK6trJWBqZKjr46bgIakl5iPgIC4w7qDjp2ThaeXnIKsioKviKabmqWqkH7VvcKqYqO/vXx+o4KD17q4tYWUk4Oevb6EaqOBb6uEbZ1/erKwx4Nqq7C9rXh3or67dICWjqacj5qRlpx5gZCaeWN9emSMZnmCe2BrZWtqYlBiW1NqXEBUYUJOKT06NC8eHyQeJTIgHSQoMDQ5NjY3Nzs+QUNGR0pLTU5OUVRXXWFcX19hXmBbXFlUUU1JQz88QT81PVNZWFhZWVpZWlpZWFdXWFlaWllZWFlbW11dXFpWWFRXWryVs7Sxv7myvbOina6mpbOmnYuYpb6pt7Goob+mprGbnrGcuaiera6lppWUr6yXjIOaka6mo6yhpJyqoZiLo5KmnqicmqGpopmeoKutqbmtqKObl5N7h5mRppuTj5GYmI6Yk6mZn5ipqKCqpqGjq7ueqcWjoK+jq7O1q7CqoLuor6+ac3WqpLeGZYmfcGesj4qPbW93pJCZn4F1rpmVcI+LcZWno5uYrqRybW1tZYp3bm2CmXGAeWlxaWeJlZWYcWhphIZncIZkXYljam9ZXWd+d6ZgYnGOkm9mZICNko6imJeYkJWefIeOlHVmhndojWp5fnlkbGNmbGJLZFhKa1k6UWVFUidLOisjHCAbIywpGBsYLTIuNTo0NTc6PD9BQkRFSEtMTU9RU1ZcV1pcYGBhXV1bVFBMSEQ9OkFCN01YWlpZWVpZWFhZWFdXVldZXV5eXVxcXF1eXV5dW1tVV16ola2zqrq5srOrqaKunqOyqZiSvbHDyL62qp7ArKyjoKesn7qjpK2srKaOlq2pkIyFlZasnqWqoZ+jo6CRjKSSp5mpmZajqqCWnKWlp6+6q6yam5KSe4SWjaWXjZGRmJONmJWnlJ6XqKKasKaeoqy6n7DBqKSzpqyxsquurKi5o664loqhqKW2nYmWopeGqZqQlJ2TqrOZm6OroLKWoqGdoKKcoKShlaumjJKSjIeSnJyUkJmTmJCNlYaBpJmXlY2Lk5KKj4aEfmeKf3SCdnSHjHGnbHuVkZSTgYGPj4+PnZSglZiWoIKHk4xwaI92cIp3dnx6amxkZG9jVWBYQGlbSGNhT1orRj0rJiE3NDAuHxwhJTIoKjY5OTQ2OTs+P0FCREZKS0tNUFBRV1RWWV5fYWNdXlVRSkVEPjk9QEFTWFtcWVdYWFhYWFlYWFpbW1xeX19gXl5eX19gYGBfWVlgpZapqqW1t66uorCkrZ+gtbGQjqvFvMS7uKqipZ2bpZ2wqaO2p52ptKankZisoouIiY6cp5arpKGZp56ek5Wjl6ibqZmUpqGjj5qnmaG1uqiqmJqQjXyBlIuhlIqUkZWQkJOXpY+emaifnLajnaest6iuwa6jt6evr7CtqqqzuaGvvZmSpqOmtqKSnaaejamfjZKfo6yvmqGjsaivl6SgnKOpnp6dnJernJKZoZuTkJaqmY2YmJaQlZ6RiKCdlZSFkoyQjJSKgH5mjIZ1hnZ5iINznGqGkZSUkYp9jJaSkpiToZOdlqCDh5eGeXGVcnmJf3F7f2puZF9waWBbYFltY1BgZFBbOkdHRD0yPT03LiomKykmHSY0MDY2NTg6PT0/QUFDSEpHSktMTVNTU1VaYGBpYGVWUEpBQ0I7OUVNVlteXltaXFtbW1xdXV9fXV5fYGFhYmFhYWBiYmJkYlxbY5eVpKejsLOsrqOpp62gqLWqkJCdpLO7r6ysoqOaep2isaSlsKiWm7imopSYqZyOhoqJm6KQrp6jlaefoZKXmJuui6uWj6iaqIyYqI+eubakpZibjYl5gZOMmpOKlJGTkI2RlqKMnZ6onp+4pH+Er7Wir691pL6jsqB4eqCrsruVd62kn4qAqn5kXGJ2n46knYOXfm6Ts5yjp66romWen5JzeZmXcICYqJdsf6KniWWcpZyRl5iWi5GbkYWdmpCVgpKHjo6SiYV3a4+HdoZxfIaAgGFpiIuVk4tbdpWRZ2iQjnJ7pZiYZHmYhoF3l2mDioJueX9rcGVgdm9ra2hbZmViYm9TWz5OTk5SRz1AVEI5MS8eHyY0OjMxNjY3ODw7PkBBQkZIQkdGSUtMU1RVWVxfaGZnV1FKPERHOzhVUltgYWJgXmBfYGFhX1xdX19fYWFiY2RhYmFhZWRjaGReXWablqajobCxrKuppaito6etpJKWq7Wvsaaaqqarl3OLnK+fqKqmlJa4oKCPnKOdkX6IiJudjauao5Wnop6Ol5GehXWukIimmqeRlqOIm7q0p6CZmIuJdHaTjZaTipSRkJSMj5OgjpqfppmcspaAjJy1nbOMko+8p6F+p6J6o6+3gY6Op5+Ei4WPsamvjImWopp5gYushpydoqepqIeVhph2pZt6h5uBl6aCgXucsXqKhaCXmZSYloGQlpaEmZljeYeQhI2PkoqDbXCPh3mAcYCBhX+GdIaElpJ4lmiTdKCadHyZg6Cchph+kYmBg5hqjYyFa3h7cXBnZHduaWxrW2VramVzW15JVExRQEU1LllUVTYpITA5PT42NDM1Njg7Oj0+PkBESD9JRUpLR1JYWllbYWFoZllRSDlFTDs+YlZeYmRlZGBhYWBiYl9dYGFhYmJiY2ZnY2JhYGVkY2djYWFonJijn6aurauorKCosKanqaWZlK7GvbChlqaotZ6Pg5yrnKahn42Qvp6ZjZ+aoJB9hY6Zl4irnaKWn6CRjZOJhoCRqI6Hopyjk5adhp+5sqedmpKOhXB1kImVkIqUj4+bi4+Rn5KWn6SWnqyIn7SJtJqtisqHqq6It4WNsIOxroOpjaaYjZ18qI9ye3ebjqaWaJWkebSLn56mqJKZwoF/q4iYoXGegJmkfZeFlbGAoXyhlKCQmJaAjpObipeRi3yFk4aNlZOJg21zkYV/enKGgYR8hHSFgpeBj8VmgKmHj6JrnoOhmYKZgIuMg4mYcI6ShWh3dHt2Z2h1cGdnbF5jb2xnbFhnR11RTDJFNDZNYGM3JjM8REdEOjY0NjU4Ozg+PT0+Qkw/TklKTENQWl1cV2JeamxcUUU9S01ASmRZXWNmaGdiYmJiZGNgX2JhYmNjY2RpaWNiYmJlY2FmY2JiaZWXop+wqKmopaugpLmwqqummpSgo6Sqo5akqbajr3+gp5ylnp2Jk7yZk42gkZ2QeYSWlpGHq5mbm5mhhY+Md5ucj6CRiJ6km5WYl4aiuK2lmZuMjH9ibY+Lk5CNkIyMl4uQkZ+Pk5+hmaGofqGnh62doJauj56dnZGGgaCNq6+GpI2qmoyafqJ2gJmTaoGrdU2reIeNnZGbqKeAqqt9g6F7eqdpnn+Sa2eXhpe2iZ59bmBkWYOWfox7ZGiKcpl9eZVsXXuXbV9TcIRcX2x5g2BZZYJ9hIGYcaeqa4OjbnKlcJ+Dnmlln2xbbYl7ZVlfg39iV1BvdmVtdHJqam9eam9tbGlYaU9dV0U5QTRHQ15rNCxJQ1FNTj04NDg1OTs2QDs7PkJPPlFSTE1CSlxdX1deX2N2YE1EOk1PTVRiXFxmZmlpYmJkYmRkYmFiYGNkY2FiaWtkYmRkZ2RiZ2VhY2iYlp2guaGqo6askqG2vKuuopmXoKGlra2gnK21oqiSoJ+fppuZjpi0mZCKnoyVi3WBlJGNiqaWlZienn+ShYaspIeckYqYqJeZmpGHpbCmopWaiImAaG6Ih4uOjomLjZKLkJKijJOeoJyipX+TgY+joZSgd5yWj6eDoad/hqmthaV5in2Emn2icHKTh5V6nYx5bYecjJmQm6iaj4ece4Kic3amZp5+dqRfmHp9knOibpi3tLpzkoeBf7WoZIHGuHtwlbeLcYCbpGNzrKtgfWqds35ufYeDjoKLl3GAo2xzpHOeg3+kX52Zs5VwfJeetHRzW56yg2pib3N1cWhvWGtscnNmXGleYktEPUQ1UUFZcTM9U0dfSlI9PDM5NTo6NkQ7O0BJUD9UTU5RQEVfXltaV2BgfGRIQzhMV1VWYmFaZmZra2JiZWFkY2BhYmBkZF9gY2tuY2NkZGhkYmdmY2holJaVo7iZq5yToI2kuLWuraCbopyjo6WunJuxrayTl6CYoKSZmpOeq5uLiJF4i4VwgJaNio+gkJOUnZd9kImOqKCHmI+KkaKTm5qMi6iopJ6PloeEfmt6hn99j42Di5CRiY+UoIKWnaCdoJ+LiXecmKKMoHKii4ipiJymkJaoq3+ujH16oJl6o5N4gHOWh4ycfZagh5uOmZumhqJkoXyIlpCbjWyeaJuNbpqZe4CKp31yaHOpgpyCc6pnlJpdm4V2hJ1oqmqAuGZcqHCBnGGVjF6ndnWJin+eaJp1h5OSmI5/n26akGynmVyofne7a36qW46EXbRnXG5xeXdraVtxanh5Yl9mWGJBUEVON1ZCUm40S1paX05aQ0AxNTE7OzdIPzpDR1Q/WVJZXT5EYl5WYFFhY31pRUI5TltdWGRmWGZnbm1iYmVfYWFfX2BgZWNeYmRvcV9kZWVrZWNpaGdraZWciaq2m6iJY5SbrLqysKydppycqJ+erpudsKirnZeimaGfmJaWoKOZhomMaoiAcXuXiIuWloSRlJiPeoqElqOdipSPhYudkZybiY+oo6CZi5GKgIBpgYZ5f5eMe4iOjoePlpp/k6KfoKKTmHJon4qfj4xwkoyBqYiZn6OooKh9sK2joriXdqOzoqN/iJR4nXqrmn+ijp2bl4iXcaF8hY2vtX1rmpGheH6YtKOjq6iEmXyafJyZfnOqWl1ve5aLeJ5iTH56eoVjeZdCTZ9ZompxfI5tgYmEmXWbeYeJsbN/f5uTp3WAnW1xfJRvmXJqpF2VdkhlY2BzcH19bmVgbGh2fGNkYVFeVl1UVkBZRVFnRFNXW2JYXklEPUI4P0I6SUU4TERXQVZRW1ZERmJcWmBLYG1+cUVDPFVfYlplalZnaG1vYmZmXmFhXF1eYWhiX2VkdmxeZWdmbGRmbGhoa2mTnYCxrpmEU1+gp7O5s7OpmqKMnKucnKmToaukoaiPnp2cmpmVmKGdloeGiXeFgW55lYWQmot8kZOWiHKAiZOgnHORkIGImJSfmoSOqJyalIqLinyDbIWFcYGhjHiFjYiHkpmVfJKkoZ+jiK6GfbWEjp6de6WWeamClp2QiqGdfadodm1+mXOgc3F8nYWYb5OCrn2kg6aemoGjb16oZ3WjY2+lYZzTkHx6mXhyc2OihZB+onKijnVrj7OLYIKYiXOqsqi8f3eDbX6+pqm0XpxufXGXb4FzonJdo2d0pmFopm2b1Jl8g5tvd3mXa5t6d5dzbamkZ2BleXB/g2tnZmRtdXhnYGJTW2VRUWFJV0lUX1dTW2VqXGRQRUNLTUpLQkpFOFA/UE1XU1hPUlJgZmVpUmN3eXdJRkVjXWRaZ2lUaWhqb2NqZ2BjYFxdXV9oYmFoZXxkXmRnZGtkam1naGxol5t/sKtUXEt+qa+xtLCzo5yYhZiooKCjjaSooJipiZmXmJOZkpKgmI6HhXtwfYRofY+ClJqBd5GNjolvf4aQk5Jsl5R9iJCRo5WDjqqZlJKKhYl5g3aHgG6Cn4Z3gJKGiJmil3mToqSan4mzoaK2i3qsp6SupXCpgZqQhYGcknykgKKZhphynoSira6Jl4t/jKSNloOuopR2tLW1yaFzlIqAn2Cdl6lteZWGn5p1oYd3oH6RloqAb0xmo5JwmodypHt5dGGDgmx+oGtxZGCccn90l2l7abO1tMamc5h+e51qm5urdYOabHR3l2maenSYcVBEfbNeanZreIdmamdidHRxblZeVFloT1JoSVVMWVJVXGdrblZnV01KQUpNS0hKTkFRSlBkY2ltZXRyc355e251iXt7VFBPbV1oW2tpUmpoaWxnbGZjZV9cXVxeaWJkaGt7X11kaGNqZm9tZWlsZaGcia+nhGY/lKGyq6+vtaKjj4CXqaKipYylp52cpYKZl5aNl5CPm5KOiIJ5anmGZYOMfpageXWPiIyBaYSFkoOMhZ2NeoyKlKWSg5eol4yQioGJeoB9i3hwkKGGeYGVh4mWoJZ/lKWonJaWhGdueJxsomR8caV3nJdwZ6eBl4x7pXqfloOXcp52gYmUlo+5bpCKomJ9maKViG1yaatqdaBsbqZgm2mLkGiWh5qVdaKAfZpgi4WMdW+IYmigZZ5+aZp1b2NmiIJucqJaX1tjoW5diYxve39zcmSlbXeiZGenaJhzi5huoW9TiI9voF9kp1SLXVSYbW1za3GBbXBoa3hza29SWFdWZllTbUlYT11IWGloc2pZa1ZRUkVWXExYUmFUaGped3V6fHB8fHKDe39ydo2AhHZeUXNhZ2JwZ1BqaGhrbG5nZGdfXV5dYGtjaml2dV1cY2ljampzbGZrbWOcpZmmemV0bYunrqSpsLGmn4uAl6ucnqWMoqGaoqKAlZiTjZqPipeQjot7h3GAiGiLi3uXmnN0in2Qe2SCh5WKipWZgnyIhZamj4Ghq5CFj4mCin2AgI9zaI+lhH2GlI2ImKCOiJKqp52JpniWnH6liZaMspiekIOvl5+leJaIeql0pY+Emm6kooyShIyDvG58pa+ChoaHk5acn3ylenGolKCWZ55+b6tjloqVkneobKmigYl1h4J3q5GmiGuRsGt2s4ypa4qGbm2fnpKVYX+ri6p2gH+Mpp93n32FpZWdoGmah3asZ56tjLdzd76NpJNZg6aNq2F1cnNve3RxYmp+bmhtU1ZbVWFhXGtNXFJdSV1tbXZgW3FZW2BaZ3Nlbm9xY3F0YHd6fnlyeYNzhH+Ae3uMgYKAdmJ4ZGNuc2RSbGdob2xyaWZpYV9eXGJrYm1sem9cXGJpYmxqd21nbG5ilaaqnYGAnqSWqaqdqKeuo5mJgpermp6kiZqlnamchIyajoackYWSjYuMdIZ6iIRvjIR9l5N0dIZykoJtf4uSh4aUj3x7gYWXpI1/paWOgY2JhJR1goeSb2yLqYCDi5SOiZyfiY2Tq6OgkIB1lJaIfoF5lK6jf4GbcY+GeJCMhH97cqaMcX19epeWm4SOeHt+foiUlZOKdpCYn6CDen2Ja4yFW3l4cXlwaG5+kolxf3SBj5OTcYWEgmWMf1+Bf4t3dXOUdW95bm6HbYSFXndpeI1mgYKGjqmbfnR8l2qJiHCAdnyFdm1sZoxzeXuYeIRbalh5j2hud3Jxb3d4b11shm5pZ1ZaYFdcZWtjVWFVX1FfcHd5bGp2ZWpranZ8cXJ0c2FvdWJze4F4dXmCdYCAf4B4i4WDfXttf2xkeW5eV25naHVreGppamRcYFpjamVscHVuWltia2RsbHluaGxvYY6Uuamni6GimqakmaScq6KghISXrJKdoImappqomIKBm4p+lpOHjomIjXKCfI99fo6EepePdHKDcJWFe32Ti4aGkIV4fn+GmKKMe6agi4WPkISVgoaOl3dyhaqGjpKckIienoiMm6igoKuDiY2Umn5+iZatqI+TppB4cJ2Rg3uSb36ohXB9lXFrcHyBn4t/ko6MaG1dg4uMm5uejnOVi4hxdGuCdnOAWXJuh5CBfX6LaV1pZHuFg4iAX2l4e5t7gouCdoGGgmh5i4drYXFyg3dfc4yCiZCnlYZmjI+DbneLhHCFjXlvZWZjeYN6lltcaWZudlt7eHd0bXNygmZcbYprbGJZWV5aWGxxW19gWl5dZnR9e3Rvc2Nra2p7fHJ7eHRkbXRnbHt+dnp8e3p6f39+b4aKhHt9c355c39pVFxxaWx1b3Vna2hkXWFYa2hranFybVdbZW5sZ3N6b2hqbWCMjKqxopCjoZqenpiemaiioX2CmK2Nn5SHm6KQpZV/e5eEfJKYiIiGhopyfICLdoWLgYSVinFvgHKYhoR+koSDhoqBeoCDi5qej4KmoIZ4jpeIlYuLnZeEg3qtgpGYmZSKnp2HiKGroKKio4uIkpuco5mWqqGnpqCSm4iXjnx4jo6Ep35/kpGSk5yxppuUnpCNspOYhKWMjJWbn4mQm4KIkYlrfI12d2WChZCKfImdhIeLj4iIgIWEkHd8eXWaoYiGip+LhZR/foyBgHZwdIaEf3iIh4uQppCEhY2Ig42QjHyHioiPgXZrgYN8eZlqcmhgc4pwfXp3dm93dIFdXm+GaG5fXlpcXVNocVVjW1xhbGh1e3xybnBka2ppf3tteH9xaW9wbGaAe3KCgHh/fYCEem2DjIZ8enh8fnqDeE5kdmtzbXB6ZGtlYmJgW3RmcGZycm1VXWx0bWh5enFnaWtljYidup+WoqGYlZmYlJmkoJ57f5mrjp6NhZ+cip6WfHiUgnuOmYmGhISGbXiAgHKBh36Ik4Rta356l4aEg5B/gIaEhnyHg42anJKGqZ6DcoqPhZKRi52RfY17qoONkpeVj5yXhoabp6Cimp2Gg5GamZmQmqagpp2dkJaBkYp3fIeOhKV7fI6QkYaYqaGdk5yPjaqOkYCejImTmp6Cjpd+ho2Cb3iFcXRgfoKPhnWLl4CDj4KGhH6Fg5RteXV0kqKLjIWahISNdICKfHxycnuIhHt5jI6Ek6ePhoSPgYSLiop3hYeJi3xua32Ae21obG1nXnl/aHx7dnR1dXt3XGBwfW51YGNaXV5RZm1TZVpdYWppdnp+cGtsZGtqZ4B/bHOAbGx0b3huhHluh4B2goB9hHZyg42Ifnt7fH97gopgaXtqdWhpgmRqY2BpXGR1aG9idW5sVGNxeWVwenpzZWltbYuKn7eaoaOfkpGWl4uan5+ee3idppCbioaklIuYmXh6jYV7iZGDjIKBgm18fnhzgIV9ipB8a2h9gZeIgYiOfH6GhId8j4CPmpuRiKacf3CLiouSh6ChioWMfKiRiI+Sl5OWk3iMo6Ghnpaaf4CQmpiTjJujoaSal5Gbfo6FeYCDj4eggH2MjI98l6SgoJKZkI+mjY+Bm5GJkpebfpKSfoaNgXV0gnB2YH1/jYZyipV8iItyjH+ChYaOaHdxeIyYko9/l36IinOCh3x8cHl7jIV6e5GNg5amk4uGkXyGh4eFdYKDiId6ZXJ7f3h6cGxqZl59c2h8dXVzfHKAal5gdHZweGRjWV9eUmtoVGRZX2FnanZ4gXFma2NsaGV/gGptfmhucWt9d4Z6a4uBc4GBfYF0doKNhn58e3+BfX+PanKDbnNpYYdobGJfcVZ0b21uYHhobVdqdHZjdXt7cmJqbnmJjZ+ykqWlnI6QmI+GnKCbnHx2pKCNl3+MooqImpZ4e4aHfoOJfoiCgH9xf3p0dYKFfomQeGdjfYaXioKKjXh9gIyDeZaAlZeVjJafmn1vi4GRk4amm4eMiYSmlYWSi5aXk5J2kZ6hoZiUl3p+jpiXjpabnaSdmZOUnHqQhoN4hJeNnX6BiY2Mc5einqGSmI6PooyLg5aYg5KWmX6YjXyIjYF2cX1temR/fIqFcIaTf5CCbIeCgX+JhGV1b3yHkpeNfZN4i4l8gId8e3F+eIqGeYWRiouYopWBhI13iYWDgnZ7gYmGdl94d31zfXdmbGRhfmlqd3N0dH1xfGJjYXNudXNtYVpgXltrZFJiV2BhaGt1eIZwYmpjbWVofINsaHRobG9of3yCeG2QhnGAg4N/c3yDjIF/fnqCg358kG12iHR0bWWKbGphY3VWhGlxbmB5Z2xianZwZnl8enFgcmyGhZCcrZemqJ6NjZeHhp+Tl5h9d6qciph5l5yLi5iPeXuAi318g3uAgoB4dHh6c32Ag3+Ii4BkXn2LlYd/hYd0fX2Jf32XhJaTloyjoJd+cod6k5GKp4+MjoqToJGDkZCUl5GLgY+YoJqSkJF0f42SlImdnZ6nmJeNlZZ0jo6KbIaYj5l6h4iQiW+XnZqjk5WKjZ+MhoGSnH+SkpWGmYh8iYmBenF5a3Vse32Lfm6FkoKUd2+Cg31+in9kcmp7gJaXhH+NdJCJg3mHfnV4gH2HgX2DjYWNlKSQeIWCdImHfYBzdYCHg25ge3V6cXxvYW5jZHtibm92cnd3c3Rhdl9vbHVub1xbX11eal5PXVdjYWhtc3qJa19pZWpjaHeHbWZsaGlsaIB8endukIdzgYOEfXOBhol6gn16gYR9fI5yeop4eG5sh2toX2lxY4docW9ld2hubGF5aGt9e3hwYXdti4GZmqqgpKidioqRhoqeipWXfXeumIyWfZ6TkZaTiHd9e4p8fIB2d3+AcHRzem+FfIGAin58YFx+j5GGf4OEc3p/hnqPkYeRkZuSpJuUgX2Ae42KkqSJjYqNmJqMhpGYk5aOiYmMk52TkIyNboOQjpGJnpmioZeWiZaRb4iahGeGmY6TeomFkIpwlZqUoZKSiIuZjIJ/kJ58ko+Si5mOe4qEh3RzdWtxbnV7i3RuhZCOknF0gHuBgYh8ZHFseX2ZlH2EiHSQi4F0iHlvgH6Bh3yFjImFjZWojXuIfX6LhXd+cG+AhYNjaHh0dW97Yl5wYGp0XnFqenh4bHJwZXhdbWxzbXNYWl5fYWpaUFdXZWNncXF/h2ZdaWhnYmdxjm9kaWdlamiAend0bo6FdIGBgnt1goiFd4V8eISFeoCJd3+Le3pyeYNqa19waHSAa3JvbXFnb2xlfGNugHl2cWx3d4p/opiiqKGmm4eMioGQnIaTnHSBqpSSjYagjJaTkH90e3aFd3h/cnN7hWtyb3ltinaAgIZucVtZfpGNiH+AgXZ1gH9/oIaPipGcl6CTl3eJfoCMiJ2eio+GkpiWhYmVmY+XjIuNjo2dio6Qg22Iio+RipyWoZuYlYWXiGqFo4Nnhp2KkX6Lg4uBd5OYkZ6RkIiJlY1/fo+XfJGNj42aknyKf4Judm9sbW5we4Vpc4OOl4pwd390gomCeGZzb3aBmY58iYR6lJF6d4h0cIl7ho17i4aEiY+co4h8hHeCi4B4eG5qgIKBXXJzcXBveFpecGBwal5vaXx5cG1tamx2YHBva3JtWVhhYWFuWFFTWmZnY3VwhIJiXWptZGJma5JtYGZmX2hqgXVxcnCLgHV/goB4dYCLgHiFf3eHhneDhHuGjH97dop/anFjfGKGfG9xbHRqaG9sdndfcX95e3R1dICCfqSVmq2fp5aFjIN/l5SDj591ip+UkoaKm4yVjYt5cnh0gXByhHNxdYhsb2x1bYh2g31/bW5VUYGrlIeCeIB2coJ5gaCBkYGSkpebkZp4kXqCjJKkmpOOiZWZkoSHl5mMlIyJj4+InoWQinxyioWJjoicmZ+blpR/lH9php2IZ4ahiJKEkYOJcYORl4+ajY+Mi4+Nd3uSkHqOi4yRlox8iHyAa3ZqbmtrbHp+YXl+jpWBdnqAd4ONfHhndGx0h5WLf4iGe5SQcXqEcHeMeoqNe4l+g4yRn52FfXx4gox9dnBpa4GCeV93b21rcXNWXW9icWBfbG55cGdwZmZzdGhxbGF3ZV1WZmFgclNQTlxmZV14cIh8XlxocmJiZWaSaV9oZFtncH5wa3Bzin12fIWAdHV/jHl7hoF4iIJzhoR+jIyDe3mVd2ZyaoNgiH5vb2t6YGpudH90X3R9eYZ4dHOFfHigj5mwnKWPgop/g5qIf4uef4qZk46EiJiOjo6EdnR2c4Bwb4VzcHGDb2tpdm2Cbn18bXRzUk6C38iS1pN8cHSCdYOfgpN3lJCYmo+Ye5NyhZCfoZOTkImSm5SGfpaViI2NiJGNiJyAjoF4eox+iIyJnJudm5WTeY12aImSh2yIo4WSh5eDhmOMkZiOlImWjI2Ki3F7lIl6jYiKkpGJeYV7fmx7ZXJvamt5eVuAeY+NgHp9fn+Gjnp5aHNrc4uPioKFhX2VjGx+f2+AjH+Mh32EeoKPlZqainx3eIOQeXNtZnB/g2xqdG9oaXNtU15vZHBZX2txd2ZramJmeHJwcGNfd2BgVmtfXXZPTktgZmNdeXGJdFxbZXZgYWVljmNhZmFYaXNzbmtxdox8dHmGgXV2fotzf4Z/e4l+comHgZCKiHx+mHZlc218ZYh+bnBrgFpsbnl5c2F2enuNdnJ3ind5n4ubrpugkIKFd4iVfnyJnIeFn5COhYyXhJOOh4F0d3B5cW6Eb21ufnJkZHhwfG16fWpobGOkmsHcru+hc2t1g3WEooWRbpWPlJ+Tm4GRcIWLo5eJjZWKkJ2Wg4CVkIWJj4CSioqXf4d7dX+Jd4aEjZuamJmOj3aKdm6GiYt9iqOEkYmdhYVei5SXio6IjouKhIlsfJaBfYiFiZCPhnaFfX1rfWR3dWpteHNXiHqRhoV6fn+AhYt+eGVzan+KjoqDgn+MloVrgnVuiJGCkYV/gnqAkZaTmZB1dHiIjXVzcWd1eYJidG1vYmh1Z1JgcWdrVV9udHlgcmNfaH1wcm5bY3JhYlduWVx3TU1MZGZhXnZzim1bXGR4XmBkZYVfY2JeWGpya25rcnaMfXN3hIF4d3uJcYOEfX6Ie3SLiIiVhox+fphzaHVxeW2Lem50cIFYcXp2eXFld3mGjGl2gIlyf5yHmKeco5KEfHCMlHh5i52EhaGNjnuVjX+Zh4R7cndwc2pvgWtpbHx0XmB4dntwdXtnYGV869q1ycPciHNsc4B2ipqIjWmXj46clJKBiHCFiKCOhYqVio2YlHyNk4iDiY97kYuGkIJ/dniDg3KHgpKblpSYhox2h39whYKJh5mig5SMnoOJYYOVj4aJhomNh4CHaX2Uf32DhImOjYJxhn5/cXdodXJpc3drWox9koGFfH+DgISKgnVhdGyIgY+Lgn5/kpF9boJseYaPhpOEfYF9gJKTkJeJb3J6jYZ1bHBrcniAX3NpblxqdmBSZHFoZlNfcHZ0YG9gXWiCcXNqV2doY2lYbVdbdUxKTGVnX2Jyc4VoW1xleV5eZGd7YGRfXFlrbmVvanN3in5zcoF+enZ6iHOFgnx/hnZ3ioaPmIKMgXuTdmx2dXl4k3RueHp9WHmFcYBvZ3l3koJkdoaFcYqWhZmhm6KKhnNvkotyd46cfYqaiIl7n3+DmX+BeHFzbm9kcn5oZmx3d1tfeXt6cXF/aWFnYX/Vto6QpnhucXd7cJKQjIdqmI2Im5GLhXtoh4uZhoGSkYaHmI18jY2BgYmNfJCMfoqFenV7gntwhoCVmY6SlIGIdYOGdoOAi5Odn4aVj59+iGF/k4eEiISJjX9/g2d9kH9+f4KLj5B+bYJ8gnRrbXZ0c3Z1a2ONgY5/hX58hH+Eh35wX3NxhHyPjYJ8f5KJenGDZnqDioeMg3yFfoCUj5GThG5weox/dW1uamx6fWJoamlYbHVaUmlyaWJRYnJ4bGFlXVpqg21zYltnX2VsX25UWm9OSE9nZVxnbnGAbFpbY3JfXGNrd2RlXVxabGxjbWpzdod/cW9/fHx0eIZ4hYJ9f4d1eYmBkpV8iIZ2iYFvd3l7hJNwbXuBd16Df3SBbWl7c5RzZ3KIfXKSkYOan5ughod2dpR+bXaTl32HkIOKjZp8i5p2fXZxb2xqYXR8Z2JpdXpaX3d8em1xfmVjaGhXnY9ecXKWvMODdXGUiJB+cpaLhpyTjIdyaoiPloB7lIyBhJuMfIqGfXyJjH+UiHWJhXZ3fYFxdYaBnpSFlI+DgnJ/iHWEfImYnZiHk46dgIhmfZOCf4WDiYlygX1nfot7eH5/h4uOfGmAfIN2ZW94eHJ2c2xqjYWKgYp/eIGAhIN/a15yeHp9jYqFe4KPgH5ygGl5g4eLhoR5hHyBmI2QjH1ubXuJfXd0bmhnfHZjXHBiV29yU1Nuc2hhTmZ0eGVgXVxYboBvc1llYV5qbmBwT1lrUURTZ2Faa25tfG5aW15sYlpjb3ZjZlxdYGxpY2xqc3aCg3Fufnt/dHWDe4OCfIGFdn6JgZaQeIOKdIGIcnh5fo2Qb298gXFpgXl6fm1tfHaVa2p3hHRslI2FnpigmYWIbn2Mdmp4mI5+gYqClZeKeY6Wb3pzcGxqZGB0e2hfZXF6WmByfXlncXphZWWPsbJ3SmJapNnQlnF7kIqQd32Ui4SZkYuFbmuFkpJ6eZKGgISYinyHf3h4iYqEloBvjIhxdH16aXiFg6WQhJOMg39vfoN2hHmFm5iTi5KQlIWHcHuSgn2Cg4mDboF4aICFeHJ/f4KKhntlfX6EdWNwcn9oeHBvdZiNhYKKe3Z4gIR5gWtccX1ygYiFiX2GiXqIcoFucYSHjoSFc4R5gZmNjoR4bm9/hH92emVoan1wX1l3WlhxbU5XcnNnYEtsdnRgXVtbWXR9cm9XZ11manFfbk5XaFE/WWdfW3BqZ3lxWlpZa2VZY3B5X2hcXmVtaGZsaXF3f4dvbH99gHVvgnt/gX6Cf3aBhYiXinGCjXF7hnx5eYOTjHVqen9rb350f31vcnx7lG9ugX94ZpKKgqGZnZGChmeHg29nepWJfn+FgZmKgXyNjGl4cmtsZl9hb3htX2JveFxka4J6YXF2X2Vl1Oq+ijI6PouOgHF5hYeOjXaDlox+ko2Mf21shY2Mdn2Pf4WBlYl8g3hudoeEg5d3b4iFa3V7dGV5goOni4OOi4R9bn90doN5hpyQjJCRkoyLhn57koZ3f4SNg2yAcml/fnhtfHuBioN3YnmEgXFkcWh+bXRxdIGaioB/hX5ydX2AcoFwW21+dHiKg4t7h4B8iHh6cWyIg4+Ei3KBeX+Xi4t/dG5rd4CAdXVcaWh3cFlXfFNacGVMWnJyZVtKcHduXFpaWV10fnVoWWJbZ2VuY2lMV2ZRPV5mXF11ZV90cFpZVG9kWWRxeVpoXl9nbWdqbGlwd32ObGmChH55boB8fYF/gnp1goGMk4VwgItueH6AenuIkol/aHt9anR7coZ7c3d9f4x5eIR9fGuMjIObnZaMgYBsjn5raH6OjHt+f4OUgn99iohrdXFnaGNbYmdybmBha3NhaHCJeWFzdF5jZJugj25cNVmvtXRpgIh8koZ2hZaFc46LiXZwbIWDh3V5iXiJfJKIen9zZ3aJfn6Yb3GGfmh2eW1leYiEpIaAh42Jfm5+dn+AfIyZh4KTkJiIi4SJfI+IcHt9hHtofm1rgHt6aXp2gYeBcmB3gX5xZHJmdYJtdHuFlJGBfIF/bnd5fHR+bVhvf3Z0jIKGd4h2gol6eHNuiYGPgYVyfn1+k4mJem5uam6CgnVuXWdmc3FRW3tOXHBcT1tycGRVS3N4aVdZWVphcYB0YF1dYGdkaGlmTlloTUBhZFtgdmFddW1YV1N0YVpkb3JXal5haGtnbWxpcHd8kmtohIl8fHB+fnuBgIJ6d4B/iouDcXuHb3F3g397iY2Pg2p+e253eXaKd314gIKHf4N+fnpthYyImKONhIN7dYt5a2yEiJF4fXuBkYCAfoqDcHJwY2ZeWWdfb3BgYGdwZmpvinRhdG9bYWRqdnt/vpymo8i4cYWDc5N8eIaTgnORjIhycm+De4N0dYd0iHeTiHl5cWN3h3qAk2lyhHZmd3VjanyDh52Bf3+Ojn1yfnOEeYCRkIJ4lo2Uj4iCiHuIiWt4eX51Z3poa395c2l6doCCfWhgd4d9amt0Z3t/aXaBjJCUfnp+fnB7dnt0fmJWd31yc4qEgnyDcYaKd3hwcIOCjX99eX59do6Gg3ZpcWltiIJycF1oY3NuSmV1TF5uVVRZc25iUU9zeGBSWFhdYnCCc1thXWhlZGNqZFFacElEZGFbY3BeXXdoVVdVd11bZW5oVmteYWpnZW9vaHB2epJuaYiMeX1ye354gYGBfHZ9hIiGg3B2g3Jud4KCfomLk39wgHt3eXqBjHSDeH+BgYKEeoB1b36Ji5qeiH2FeneGe2d0hYyQen9/e4mGhHaPgGdvbl9kXFhlWW1yYGBgcGxraIluYHNpWV5kbYB3qdqpx4aHsnGJeG+MdXuGjoB6k4mAdXR0fneAcHF/bYR0lIZ4dGtgeoJ5iI9mcYNvZ3ZtW219gJCTf4B5kpJ9eHtth3WAkIuEdJaKkY6HhYV7f4VsdHZ/bWd3ZW17dW1qdnd/f3xgYniGemh0dWJ9emd0hY6MlXt0f3VxgHp8bX9ZVnR+b3WEh3+AeWyIhnR4a3V/g4R9e314e3OLgX1zZ3RlbouEbXNbal91ZEhubkxbYldWVXhtYlBSdHZXUFVYXmFxhG9cYGNtZGNebmJUXHJHQmZfXWZoXlt7YlFVXHVbW2drYVZqX2BuZmZrcWhwdXiOdGuOjHV+dnh+d4GDgXtzfoSIh4NvcX90cXV+hYKJjYp7d394g3x8hYd4h3x9gX6EgHt+c3Z5i46fjYl6iXZ0g3lefYWZjHmGg3SFhoV3iXtibmxbYltbYVZqc2NgW2dub2aHcWFxZlddY2t/fMrOiLmiam1timxxhHF8hIl+e5GFenlzeXV1e2psdWOEdZGCd29mXn2CeouJZXKCa2pxY1hse4WbiIKBc5eUd357bohxgYqLh3GXjpCIhYuDe3l+cXFvfWZocWJteHFqa3F3fHx5XGV5gHdpdXhmgXZndIeLjZR8cYZpb36AeW58XVhyf210gIt8gm9viX9xdmh3f4F/gXd9cXp0h3x6cmZzYW6MgmxyWGtfd1tJbmtNVlVeVFV7a2FPVHVyUFFUVl5idIVoXGBsamZjWW5hWGJwR0FoXWBmX11We15PVmRwWVtqaF1XaGBfcmZraHJncHJ3hnhulYp0f3p4fnmCiIB1cn+HhY2CcHB7eHd1eYaGhouGenx/dYt+fYWEhId/fn59h398eHZ5d5GTn3+MfIttdoB5Y4OHl4ZzkotvhYWBeYJ0Y25qWV9bXV1UZ3NlYFlkcXFmgXNia2VXW2Bpf3e+rnugt21ic4Zoc3txeYKFe32Mf3d4cnZve3Zlam5gh3WOgXNqYl5+eHmLhGZxfmhqa1pWb3iJo4GEf3GZk3GAeHWCbYCCkYdzlYiMiISIhH14dHJuaHlgam1gbXZqZ2preXd6d1tnfXx4ZXJ9bYR0ZXWFjIaVf2+LZmt6g3VtdGJcb3xrdXyLfIFmdYd9bXFndX54fn9yfWt6eoF7eHBmbGJuiX5tbVZrYHdVSmprT1JOaE5ZfGhiTlV1akxQVFVfZ3aDZl1gcWhnYVdpXVtraEpFa1piZFdZVXlaTlZtalldbGVcWmVjXnRmbWRxZ3JvdYF3cJmFdn9+d398hYd9dXOCiX+Vgm5zeHp6c3OFh4iIhHmBfXaPf3yEiY6EgoR7fouDe3d8d3eanZd6ioOGaXd9fGyDhJOAco+CcYWCfoF/b2ZsZlddW1xbVGRwZF9XY3J1aXVwZWVjV1xcaH9wb3KAdIlkZHh+aXR1c3OChHiAhHl2c3Vua3pwYWdrZ4Z0jYNuZl1ffXB7iX5pbXdmaWRVVnJvjaZ8hHt2lpBze3N8em57e5CFdph8h4aDhoN8dHBybGd1XG1oX2x0ZGdmaXpve3JZZ4F3dWdwgHeBdWJ3hIp8lIBui2lteoFxZnNlYG16Z3N3inx+YnWDdmlrcXR6cXl5c31mfn9/eHduY2ZiboZ8bWtWamJwU0tpa09MTnBHXntmYU1VdGNKTlNXYWp2fmVcZ3NpZmBWY1dicF1MS2tYY2FVVFVzVkxYdWRaX2thXFtjZV93Zm1icGlzbnJ/dHSagXd/gHd/foaEen11goR+l4VucnR7enVxhIWPgYB6i3V0kH98gZSOgIWEfX6Mhnt+gHZ7o6WKeYiFhGx1fHt1g4KMem6Fc3mEfYGDdW5qaGVWXVtaWlNibmRbWGJze2lobWlgYldfWmmAamtvgGdrYWh5eGpzdHRthIF7f312dW17aGp5al9lbmiBdo+EZ2VYYndpfod7b2lvZ2ZdVVhvaI+od4F6fJCOeXVvfm9zdXmPgHeVdIWCf4WHdWpydmdobltsZF1scl9nYWl4aHttWm2CcnNpb4B+eXdgd4SEeI+Ecodxb3l/cmNxaFxvd2Rxc4h8eGJzgHBnanhzcmx4d3V3ZIN7f3d2b2RkY258fWtsVWliZlNLbWhPR1JrRWF4Z2FNU3FcSU1UWWVrd3tlXm1xaWRdVl9Vbm5XS1RoV2ZeWE5VbFRKXHlfW19rXV1aYmVgemhsYW9vdW5wd3V6mH13gIF6gH+Hhnp4eoN+gZOEcXR0fnp2dIWIkH2AfZBrc5WAe4KfhX+HfYB+hoKAint2hKyff3qIh4RscoJ6doCAgXVuh298f3OJgGpvbWRkWF9aWVpVYmpnXFpedYFpXm5sXGFWXFxrgWZxdH1paV1rdnVndHdxbIV7fX15dnJsemhpeGZdZHNoeneSgWNjVGVwZ4KFd3dmaGpgV1ZZZ2OPp25+d4CLjnpwcHxmeW96jHt2jnGEfX5/hm5kdXNkaGhca2Jdb29bZ19sdWR6aF10gG9ya3F7fXV1YXSFinqHhn9/d3J1f3VhcGxZcXRicXKFfHVkcn9sYWx6b2ppenh1cmaFdXp6dXBkYWRuc35pbFRpXl1US3NjUUdWYUdidmZhS1RvV0pMV1hna3Z6ZGVucWZjWlddWHZlVEpcY1doWFlJV2VRSGJ4Wl1fbFteXGFkXn9pamBvdHhtcG52g5h5coGAfH+Ii4Z+dXWGeYeLfXR1dYJ4enqCjI59foSIanOXgXqKnX1+hXqBen58hohzcY+ujHt7ho9+ZnKIenR8fHZyb4Zse31sj3picG9iZV1lVllZVmNma2BdXHOFaFhxblpeV1pcbHtjcHd2bGJbbHJzZ3R1cGyEeX6AeXdubnRlaXRlW2d1ZnZ2kXpfXVJlZmqCgnR9YmNpXFRYXWJjkKVoeHSChZB4bW55Z3htfIV7dYhygHh8eH9oZXZsYGZgXmpfXXNrWWVdb29iemVbd3trbm5wd3hzdGRyg5J+h4KIenVvcn1yYnhkW29wYXFxgnxzZnGAZF5udmlkZ3l6dG5vgXV0fXNxYl9mbm99ZGpTaFhZVE13X1FKWVlIYnRkYUlUbVNJTFpXaWxxe2JsbHNjYVpaW2F2W1NLZF5YaVNXR1lgTkdpdVheYW1bW19iYl2FaGhhbnh5bG9rdoGQeW2DfoCBkoiEgHZ0iXSMhnRyd3aBd3x9foyPgH6TfnB4loN8mZJ5gIB4eX1/dIiDc3CZont7f4iVeGR1iHlzeHVsdG9+bHl8cJFyXnBvYGdibFRbWldoY21mXFxxiGVScm5bWlhYYGx3Y2l1ampeWm1zcWxzc3NqhXx+f3x3bm5sZGlxY1tqcmR0do5zW1dTZGFygH9ygl1iY11TWmBbY5KfZXJxhYSRdGxqeWxvcHp8e3GAdn9yenl5ZGV1aF1iWmFnW153aFdiXW9oYXdgW3t2amlybndzc3RocIGUgoZ+g3VyanB8bWZ3V1xrbWJxc4F6c2Zvfltgb3FiX2pxfWxsdH5zcXhrcGFcZWxsemFnU2dVV1JQdltSUFlSSWNzYmBHVWpQSFBaVWtra3xlbW9xYVxaWFlscFdSUGZWV2lTVEZaXE9IcnRYX2NtY1hhYGFdi2pjZG15eGtvaXV5hntrg32AhJl8goR5fYhuj4Zxb3d6fHSCgnyLj4OCl3R3gpSFgZ+JdYCAgXN/gXCHgnVvopd0e4aLhntleItubntvZnhwemxzdnKMa150bmFnZWtSXVtWZ2JsbFpccYxkT29uXVZYVWdqdGdidGVlXVltdG1wdXV5aod8f3yId5BzZGRrbmFcbm1jc3iHa1pUVmJjeH19cYVdY19jVFpgWWOWlWNucIOFinNqaHpuZXN2c3xsenR1b3l+dV5mcmNbXlZiZFhhdWVVX2BtZGFxXV1+cGhpc3FzcHV1am2Ek4GIe4RxcmZufXByb1NbZmpmcXSBd3NibHZVYnFqW19uZXxlbXZ8c3Jzam1gWmRqandeZlRkVVZQVG1XUVdTUEhlcl9hRlhpTkhXVFZtaGR8aWt4a2JXXFVbdGRTUldoUVlmVFNIWlpQTXh3W19lbGlaYmBeXo9uYmZreXVub2h2dn9/bIOAfYaXe3+IgYl+a5OIcmd0gHt1gIN9iI5/jJNzfIqRhYefhnt/hoxzgIZzfYN2bqWMc4GNi3Z3bXqMYGR8cGZ6c3lsbXF2gmdke2xjZmdoU15eVGdgbG9bXm6NaE5qbWBUVlNvZ3NrZXdkZV1Yb3Rscnp3cmyIe4B2nHt6a2FlbG1eYG9qZXB4fmdaVlhga3h8e3CEX2JeZ1ZYX1dknIhia3GBh313a2t4bFt2cWx6aXVzbm97gHJYam5fWV1VYWNXZHFjU15haWFibFpgfmxma3N1bm13dmtohYx/iHqHbXBmcHxtcm1jWWFoaW90gXRyXmlsUmVxZFRibmJ6Y3F2e3VrcG1rX1hhZ2h0XGVWYVZTTlhlUk9cT09IZXBdY0ZZaU1JX0tYbWRfeGhufmRgVV5UXXRbVFJgZk5dYVRTSlxZUFl1dl1fZm1oWGNhW16OcGNnandxc25ndnR6g3KBg3qIjX58ioeOeW6QinRsc4J0f3+IhYaRhJWPeX6Mj4iRm4SAfIyEc3+Bc3R3cW6Tk5OTk5OTk5OTkpKSkpKSkpKSkpKSk5OTkpKSkpKSkpKSkpKSkZGRkJCPj4+Pj4+Ojo6Pj46OjY2Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2NjYyMjI2NjY2Njo6Ojo6OjY6OjY2Ojo6Oj4+Pjo2NjY2Oj4+Pj4+PjoKAfnp6fX5+fX1/fn59fn5+fn5+fn+Af4CAgIGAgIB/gIGBgYOHjI6Ojo6NjY2NjY2NjY2NjZKSkpOTkpKSkpKSkpKSkpGRkZGSkpKSkpKSkpKSkpKSkpKSkpGRkZCQkI+Pjo6Ojo6NjY6Ojo2NjY2Njo6Njo6OjY2NjY2Njo6Ojo6Ojo6NjYyMjY2MjIyNjY2Njo6Ojo6NjY2NjY2Njo6Ojo6OjY2NjY2Ojo6Ojo+Ogn99ent8fn59fX5+fn5+fn5+fn5+f4B/gICAgICAgH+BgYCBg4aMjY6NjY2NjY2NjIyMjIyMkpKSkpKSkpKSkpKSkpKSkZKSkpKSk5KSkpKRkZGRkZKSkpGRkZGQkJCQj4+Ojo6OjY2NjY2Njo6Ojo6NjY2NjY2NjY2NjY2Njo6Ojo6Ojo2NjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Njo6Ojo2NjY2NjY2NjY6Ojo6Cf3x6fHx9fn19fn19fX59fn5+fn5+gH9/gICBgYGAf4CAgICDhouOjo2NjY2NjIyMjIyMjIySkpOTk5KTk5KSkpKSkZGSkpKSkpKSkpGRkZGRkZGRkJCQkJGRkZCQkJCPj46Pjo6Ojo6Ojo6Ojo6Ojo2MjYyMjYyNjY2NjY2Ojo6Ojo6OjY2MjIyMjIyMjIyMjY2NjY2NjY2NjY2NjY2Njo6NjY2MjIyNjY2Njo6OjoN/fHp8e31+fH1+fXx9fn59fn5+fn5/f3+BgYGAgICAgYCAgIOGi42NjY2NjIyMjIyMjIyMjJFtZmdnZ2dnfYWEhISEiF0tMDAwMC1GoaGhoaGhoJqZmpqampqKg4SEhIOEd2VnZmZmaFxDREREREJOpa+tra2usH9rbm5ubm9qZmdnZ2dmb4SDg4ODg4OLjIyMjIyMjY2NjYyMjY2NjY2NjY2NjIyMjIyNjY2NjY2OhX19e3t6fX58fH59fX1+fX1+fn5+fn9/f4GBgYCAgICBgICAgoWKjI2MjIyMjIyMjIyMjIyMkWdfYGBgX155g4KCgoKGUxgdHR0dGTekpKSkpKSjnJycnJycnImBgoKBgYJyXV9fX19hUjQ1NTU1M0GptrS0tLS3fGVoZ2dnaGNfX19fX15qgoGBgYGAgYqLi4yMjIyMjIyMjIyMjIyMjY2NjY2MjIyMjIyMjY2NjY2GfH16e3p8fXt8fn19fX59fX5+fn5/f3+AgYCBgYGAgIGBgYGChYqNjYyMjIyMjIyMjIuLi4uRjo2NjY2NjY+QkJCQkJCMh4eHh4eHiZOTkpKSkpKRkZGRkZGRj46Ojo2NjYuJiYmJiYmIhYaFhYWFho+QkJCQkJGLioqKiomKiYiIiIiIiImKioqKioqKi4uLi4uLi4uLjIyLi4yMjIyMjI2NjIyMjIyMjIyMjY2Njoh8f3l7ent8e319fX18fX19fX5+fn9/f4CBgYGBgYGAgYCAgYKFioyMjIyMjIyMjIuLi4uLi5GSkpKSko2QkpGJh46KkJKTkIqRjo2RiI+RkZGRkJCQkJCPj4+Pj4+Ojo6Njo6Ojo2Njo2Njo6Ojo6NjIuLjIyMjI2NjY2NjY2NjY2MjIyMjIuLi4uLiouLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyNjY2NiX59eHh5fH18fX19fHx9fX59fn5+f3+AgICBgYGBgYCBgIGCgoSKjIyMjIyMjIyLi4uLi4qLkJCRkZGPhI6QkIaKj4WNkJCOh4mHhomFiJCQkJCQkJCQkI+Pj4+Ojo6NjY2NjYyMjIyMjIyMjIyMjIyMjIyMjI2NjIyMjIyMjIyMi4uLi4uLi4uLi4qKiouLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjI2Lfnx3dnh7fXx7fX18fH19fn5+fn5/f4CAgIGBgYGBgIGAgIGChIqMjIyMjIuLi4uLioqKioqQkJCQkIqFjoiOhoaPiY2QkI+GiIaFhYWHj4+Pj4+Qj5CPj4+Ojo6OjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLi4uLi4qKioqKi4qKi4qKi4uKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIt+e3d2eHt8fHx9fX19fX1+fn5/fn9/f3+AgIGAgYGAgYCBgYGEiYyMi4uLi4uLioqKioqKipCQkJCPhYOMjpCOiYyJjZCQj4mGhYeEhoiPj4+Pj4+Pj4+Pjo6OjY2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKioqKioqLi4uKioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMin18dnZ4fHx7fH19fH19fn5+fn5+fn9/f4CAgYCBgYGBgIGAgYSJi4yLi4uLi4qKiomJiYmJkJCQkJCMhoyJjoeFjYmOi4yLhoiGhoiDio+Pjo+Pj4+Pjo6OjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKioqKioqKioqKi4uLioqKioqKioqLi4uLi4uLjIyMjIyMi4uMjIyKf353eHp7enp8fHx8fX1+fn5+fn9+fn9/gICAgICBgICAgYCBhIqMi4uLioqKioqJiYmJiYmPj4+Pj5CMjouPjIqPjI6MjY2JjoyLjomOj46Ojo6Ojo6Ojo6NjYyMjIyLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLjIiAfXh5enp6e318e3t9fn5+fn5/f35+f39/gICBgICAgIGBgIGEiouLioqKioqJiYmJiYmIiI+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Ojo6Oj46Ojo6Ojo6Ojo2NjYyMjIyLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLioqKi4uLh4B8eHp6eXt8fHt7fH1+fn5+fn9/fn9/f39/gIB/gYGAgIB/gYSJi4qKioqJiYmJiYmJiIiIj4+Pj4+Pj4+Pj46Pj4+Oj4+Ojo6Ojo6Ojo6OjY2NjY2NjY2MjIyMjIuLi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKiYmKioqKioqKioqKioqKioqKioqKi4uHgHt5eXh6fHx6e3t9fX5+fn5+f39+f39/f39/f3+BgYCAgH+BhIiLiomJiYmJiYmJiIiIiIiOjo6Ojo6Pj46MjI+Sj5COjo6Ojo6NjY2NjY2NjY2NjIyMjIyMjIuLi4uLioqKioqLi4uLi4uLi4uLi4uMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKiomKiomJiYqKioqKioqJiYmJioqKioqKioqKioqKioqKioqKi4aBe3h5eHp8ent7fH19fn5+fn5/f35/f39+fn9/f4CAgYCAgIGEiIqJiYmJiYmJiIiIiIeHh46Ojo6Ojo6Ojo+MkJOQkI+Ojo6NjY2NjY2NjYyMjIyMjIyMjIuLi4uLi4qKioqKioqKi4uLi4uLi4uLi4uLi4uMjIyLi4uLi4uLioqKioqKioqKiYmJiYmJiYmJiYmKioqKiomJiYmJiYmJiYqKioqKiomJioqKioqKhYB6eHl5fHt6ent8fH1+fn1+fn9/fX9/f35/f39/gICBgICAgYSIiomJiYiIiIiIiIeHh4eHjY2Ojo6Ojo6Pj4+PjoyNkI2NjY2NjY2MjIyMjIyMjIyMi4uLi4uLioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYmJiYmJiYmKioqJiYmJiYmJiYmJiYmKioqJiYmJiYmJioqFf3l6eXh7e3p7fHx7fn5+fX5+f39+f35/fn+Af3+AgICBgYCChIeKiYmIiIiIh4eHh4eHh4eNjY2Njo6Oi42Nj5WPiYyPjYyNjYyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYR+eXt5ent7eXt9fHt+fn59fn1+f35/fn9+f3+AgICAf4CAgICEh4mIiIiHh4eHh4eHh4aGhoyNjY2NjY+MjImKj42IjJGPjY2NjIyMjIyMjIyLi4uLi4uKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uKioqJiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJg355e3p8e3p7fX17fH9+fn5+fX5/fn9+f3+Af4CAgH+AgH9/f4OGiIiHh4eHh4aGhoaGhoaGjIyMjIyLiYyKiIeJhoyOjJCMjZGOjIyMi4uLi4uLi4uLi4qKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiImJiYmJiYmJiYmJiYmJiYmJiYmIiImJiYmJiYmJiYmJiYiIiIiIiYmCf3h7e3t6enx9fHx9f39+fn19fn9/f39/f4F/gIB/gICAgICAg4aIh4eHhoaGhoaGhoaGhoWMjIyMi4yOjoyKioeEiIuKjIuNjo+Li4uLi4uLi4uLi4uLioqKiomJiYmKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiomJiYmJiYiIiIiIiIiIiImJiYmJiYmJiYmJiIiIiIiIiYmIiIiIiIiIiIiIiIiIiIJ/eHp7enp6e3x8fX1+f35+fX1+f39/fn+AgICAf3+Af4CAgYCDhYiHh4aGhoaGhoaFhYWFhYyMjI2NjJCSjI2Ii4mJi4uLi4mLjIqMi4uLi4uLioqLi4qKiomJiYmJiYmJiYqKioqKioqKioqKioqKioqKioqKioqKiYqJioqJiYmJiYmIiIiIiIiIiIiIiImJiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIiIiIiIiIiHgXx4e3x5enp8fHx9fX9/fn59fX9/f39+fn+Af4B/f3+Af4CAgIKEh4eGhoaGhYWFhYWFhYWFjIyNkY+PjZGJjIaJjIuIiImMiYeNjo+NioqKioqKioqKiomJiYmJiYmJiYmJioqKioqKioqKioqKioqJioqKioqKiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4WAenl9e3t7enx8fHx9f39+fn19f39/f35+f4B/gH9/f4B/gH+AgoSHhoaGhYWFhYWFhYWFhISLi46PjoyLj4iHiYmMjYWFjo2KiYyNi46KioqKiomJiYmJiYmJiYmJiYmJiYmJiYmKioqKioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHhoaHh4eHhH55eX16enp7fXt8fX5+f35+fX5/f39/fX5/f3+Af39/f39/f4CChIaFhoWFhYWFhYWFhISEhIuLjI6MjI2Lh4mIiomGgoiNjoiKi5GTj4uJiYmJiYmJiYmJiYmIiYmJiYmJiYmJiYmKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIeHh4eHh4eIiIiIiIiIiIiIh4eHh4eHhoaGh4aGhoaGhoaGh4eDfXp5e3p5enx8e31+fn5/fn59fn9/fn9+fn+AgICAf35/f39/gIKEhoWFhYWFhISEhISEhISEioqOjYmIiIqKh4iHiomIioiIh4qGi5GPiomJiYmJiYiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHh4iIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGh4J8eXl6eXp7e3t7fX5+fn5+fn59gH9/f39/f4CAgH9/fn9/gICAgoSGhYWFhISEhISEhISEhISKi5CPiYmJi4qHh4WHiYuKiYSLjYmOjYqJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiIiIiImJiYmJiYiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGgXt4enp4e3x7e3x+fn9+fn5+fX1/f39/f3+Af4B/f39/f3+Af4CChIaFhYSEhISEhISEhISEhI+Qj4+IiYuIhoeIiYuLjIuJioqNio6Oj4iJiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoaAe3h5eXh4enp8fX1+f35+fn59fn9/f39/gIB/gICAf39/gIB/gYKDhoiGiIaDhISEhIODg4ODkpKOioeKi4qLh4uNiYqJi4iHiouIio+SioiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhn96eXh4eHl5eXx9fn5/fn5/fn1+f35/f3+Af39/f4CAgH+AgH+BgoOHjo+PjoiHhIWFhoaFhYWSkI6KiYmIiImKioiIh4aKjIiHiYmOkJGNh4iIiIiIiIiIiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4aGh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWGf3l4d3d3eXp5e3x9fn9+f35+fn5+f35+fn+Af4CAgICAf3+Af4GBg4eOjo6Ojo6Mjo2OjY2MjZCQjomHhoiJiYeIiouIiYyJiYaKjY6PkYuIiIiIiIeHh4eIiIiIiIiHh4eHh4iIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhYZ+eXd5d3d6eXl8e31/fn5/fn5+fn5+fn9+f4B/fn+Af39/f39+gIGEiI6Ojo6Ojo6Ojo6Ojo2NkJGOi42JjIiIiYaHiYaIioiHi4yLjpCQiIeIiYmJiIeHh4iIiYmIh4eHh4iIiYiIiIiIh4iIiIiHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhoaFhYaGhoWGhYSEhIWFhoaFhIWFhX55d3l2eHl4e3x7fn5+fn5+fn5+fn5+f39+f39+f39/f35/f3+AgYOGjY2Ojo6OjY6NjY6OjY2Qj42Ni46KhoiKhISLiYeDhYSDi4mLj42JjI6QkI+NjYyLjY6Pj42NjI2Nj4+Pjo6MjYyMjY2KiYiHiImHh4aHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoeHiYqKiIeJi4yNjo2LiImLi42OjYyJiImMgHl3d3Z6eXh7e3t9fn5+fn5+fn5+fn5/f39+fn5/f4B/f4B/f4CBg4aMjY2NjY2NjY2Qj4+Pj46NjI6KiYuMjIeFiY2Lh4aIh4aHh4uNjo6Pj4+Pjo+Pj4+Pj4+Pj4+Pj4+Ojo+Pj4+Pj4+Pj4+Oj46Oj46Mi4uJh4eHh4aIhoaGhoaGhoaGhoeLiYeHiIiLjY2Mi4yLjY2Ojo+Ojo6Pj46Ojo6Ojo6Ojo6Njo6NjY2AeHZ4eHp4enx6fH5+fn5+fn5+fn5+f39/fn59fn9/f39/gH9/gIGDhoyMjIyMjY+QkpOTk5KSjYyMjIqHioyKh4eJiYWCiouIiYWJjpCNjo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjI2NjI2LiYaHh4eHiYqLjY6NjYyNjY6OjY2OjY2NjY2NjY2NjY2NjY2OjIyNj4+OjY2MjIyLi313dXd5enp7e3p+fn5+fn5+f35+fn5/f39+fn1+f39/gICAf3+AgYOFj5KRkJGSk5OTk5OTkpKLi4uLiomMiouLiYuKhoeOjYiIjI6OjIuMjIyNj46Njo6Ojo2NjY2MjY2NjIyMjIyMjIyMjY2NjYyMjI2NjYyMjI2NjIyNjIyMi4yMi4yMjI2MjIyMjIyMjIyMjIyLi4uLi4yNjY6Sk5OSkpSRkJOVlZSTk5COjo6Oe3Z2d3h6ent7e31+fn5+fn5/fn5+fn5/f35+fn9/f39/gIB/f4CBgoSNkpKTkpOSkpOTkZKSkoqJioyJi4qJjIuKioiHiYqKi4mKjY2Mj46Nj5KUlJOUlJOTkpGSkI+Ojo2NjY2Pko+OkZGOjIuKioqLi4qKi5CPjoyMjIqKioqKioqKiouKioqKi4yLi4uMjIyKiouLi46RkpOTk5SUk5STk5SUlJOTk5KSkpKSk5F6dXZ2eHt7e3p6fX5+fn5+fn5+fn5+fX5/fn5+f39/f3+Af39/gIGChIuRkZGRkZKSkpGRkpGRiYmIiIqMiYiJiYuJhoSJhoyKh4ySkpKTk5OUlZWWlZWUk5OUlJSUk5SUlJSVlZWVlZWUlJOTkY+QkZKQjoyRlZWVk5KSjo+QjYqKi4qKi42OjY6RkpCRkpKSkpGRkpKSk5OTk5OTk5OTk5OTkpOSkpKSkpKSkpKSj3h1d3l6e3t7ent9fX19fn5/f35+fX5+fn5+f39/fn9/f4B/f3+AgYKEi5GQkJCSkpKRkZGRkZGIiIiIi4uJg4eLi4yMiIeHjYyNkpSSkpOTlJWWlpaVlZSSkpOTlJSUlJWVlZaXlpaWlpWUk5SUlJSVlJSUk5OVlZWUk5KTk5OTkJGSkZGSk5OTk5KSkpOSkpKSkpKSkpKSkpKSk5OTk5SUk5OSkpOTkpKSkpGRkZGPdnJ3enp7e3t8fX59fX1+fn9+fn9+fn5+fn6Af39/f3+Af3+Af4CBgoSKkJCRkZGRkZCQkJCQkIeHh4eIiIiFi4+KjI6Njo+OkJWUk5OTk5SUlZWVlJSVk5KSkpKTlZSUlZaWlpaWlpaWlpSTk5OTk5OUlJOSk5SVlZSTkpKSkpOTk5OTk5OTk5KSkpKSkpKSkpGSkpGRkZGRkZKTlJSUlJSTkpGRkZGRkZGRkZGRkYx0c3d6ent7e3x9fX1+fX5+f35+fn5+fn5+fn9/f39/fn9/f39/f4GDhIqQkJGRkJCQj4+Pj4+Ph4iKi4yNjYuOj42Mjo6RkpGSk5OSkpKSk5SUlJKSk5OTk5OSkpOUk5OTk5WVlZWUlZWUk5OTk5KSk5OUk5KTlJSUk5KSkpKSk5OTkpKSkpKRkZKSkpKSkpKSkpKSkZKRkZGSkpOTlJSUk5OSkZGRkZGQkJCQkZCRinN0dnp8fHp7fXx9fn59f35/f35+fn9+f31+f39+fn59f39/gH+AgYKDipCQkZGQj5CPjo+Pjo+Oj4+Pj4+Pj4+PkI2OjpCRkpKSkpKRkpKTk5OTkpGSkpKRkZKSk5OSk5OSk5STk5OTlJOSk5OTk5OTk5OSk5OTkpKSkpKSkpKSkpGRkZGSkZCRkZGRkpKRkZGRkpGRkZGRkpKSkpKSkpKSkpKRkJCQkJCQkJCQkJGGc3V2e3x8e3x9fX1+fn1/f35/fn5/gH9+fX5/fX5/fn5/f3+Af3+BgYGKkI+PkI+Pj4+Pj4+Pj4+Oj46Oj4+Pj5CQiI2PkJGRkpKSkpOTk5OTkpKSk5KSkZGRkZKSk5KTkpGRkpKSkZKSkpKSkpKTk5KRkZKTkpGRkpKSkpKRkJCQkJGRkZGQkJGSkZGRkZGSkZGRkZGRkZGSkpKSkpKSkZCRkZCPj4+Pj4+Pj4+PkX9ydHh8fHx7fHx9fX5+fn9+fn5/f3+AgH99fn5+f39+f39/f4CAf4GBgYqPj4+Pjo6Ojo+Pj46Ojo6Ojo+PkI+Pj4+GjpCQkJCRkZGRkZGRkZGQkJCQkZGRkZGRkZGRkZGQkJCRkZCQkJGRkZGRkZGRkJCQkZGQkJGRkZGRkI+PkJCQkJGRkJCQkJCRkJCQkJCQkZCQkJCQkJCQkZCQkJCPj4+Pjo+Pj46Ojo+Pj4+PeHJ2eXx9fHp9fH19fn5+f35+f39/f4CAf39/fn5/f35/f39/gIB/gYGAio6Ojo6NjY2Ojo6Ojo6NjY2Oj4+Pj4+PjoiQkZCPj4+QkJCQkJCQkI+PkJCQj4+Pj5CQkJCQkJCPj4+PkI+PkJCQkJCQj4+Oj4+QkI+PkJCQkJCPjo+QkJCPj4+Pj4+PkJCQkI+PkI+Qj4+PkI+PkJCQkI+OkI+Pj46OjoyMjY2NjIqDiYhzc3Z4fX58eX18fX1+fn5/fX5/fn9/f39/f4B/f39/f4CAgH+AgH+BgYCJjY2Ojo6Ojo6OjY2OjoyNjY6Ojo6Ojo2NiJCRkI6Njo6Ojo6Ojo6Pjo6Ojo6Ojo6Pjo6Ojo6Ojo6OjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Pj46Oj4+Pj4+Pj4+Pjo+PjY2MjYyNjoyLi4mJiYiFhYSDgoKEgnR5fXp4dXJrZWltb2xmZmdncHNzd3l9fnl6e3x9fX1+fn59fn9/fn9/f39/gIB/f3+AgIGAgIB/f4CBgImNjY2NjY2MjYyMjIyMi4uLjYyMjIyMjIyGj5GRjIyMjIyMjIyMjIyMjIyMjIyNjY2MjIyMjYyMjY2MjIyNjY2NjYyMjI2MiomKi4uJh4KAh4iEgXt6gH57fXx8fXlzcnJycnV1cG1ramppZ2NkYV9bXF1eWFVXWFlTS0VJSkpLTE1PT0tgdHR3eX19eHp5e3x8fX5+fn1+f39+f35/f4CAgH+AgICBgYCAgICAgIGAf4OEhYSFiIuLjYyMjIuLi4yGiYqKioqKh4OOkJGNiouLi4uMiYmKioqKiouLi4eDi4qIiYmGhYWEhIeJiYWCg397fHl6e3pzcHFxcW1samdsbWdlZmVmZGNlZGVkZWVlZWRkZGNhYV5dXFpYWFdUUFFSU1JTTU1KSUZESEpHR0hHR0xOSWdzdXh6fXp4d3l8fHx8fn5+fn9/fn9/f39+f4CAgIB/gICBgICAgICBgYFnXmBjYWNucX17ent/fXd8fHZ4ent4eHpvcHt4eXt8e3h3e394dXd0dHZ0dXZ3dXFycW5wcnBnaGtsbm9tamlpaGhlZWRkZF9gYWJgYF5dWVhaWltdXV9gX2BfX19gYmFeXl5eWVldXF1bV1dWUlRSU1NOUUpISUZERUhMTEhGR0lLSklNbXJ0eHp7end3eXt6e3x+fn1+f39+f35/f35+gIGAf3+AgIGAgICAgICCgWdYW1pZXFtcY1xaXF5ga3FtcHBvbm5vbmtpbmxrbG9qaWtraWpraWZmZ2dnaGhnbWdqZ2hlaGdjYmJhYmBgXVhbW1dYV1RWUVBUU1NNSkxLTExOTk9UWFhXVVVUUlBQTU1QT05LTE1QUU9MTEpHSUlHSEhJSEhIR0ZHSEpKSEhISUlISVZwc3V5ent5dnZ5enp7fH59fX5/f35/fn5+f3+AgX9+f4B/gICAgICAgIGBbFtYVlZWWVlaWVlYVVZoamxubmxra2poaGloZGVkYlxiZl9fYWNfXF9dYF1eWl5dWVleYmFeXlpZX1tYV1NOTUxLS0tMSUtNTktKS0tMSktQTEtLRkdHSUlGR0lISUZFSEdGRkVERUVEREVJSUlHSEdIRkZLTUtJSUlIR0hLTU1LTExMVXFzdnl6e3h2d3h3ent8fn1+fn9/f39+f3+AgIGAfn5/f4CAf4CAgIB/gYJoUlRVVlNVV1lZWVdXV1tbYWNfXlxbWFZWWVZSVFJRUVVUU1NUUE1KTU5QUk9NUFFRUVFSVlZRUVFUUFBOTk9MSk1MS0xKSktLRklJSkxJR0pISUlFR0dGRkVFSElKR0ZHRkZHR0hKR0dISEpMSkpLSUlISktLSkhKS0pISUtMTU9QUEtUdHN1eHp6eHZ2d3d6enx+fX5+fn5/f35+fn+AgYB/f3+AgYB/gICAgH+AgmlQUlRXVVRWWVdYWFpbVFRTUlBRU1FRUU9OTlBQUU9MTlBPTk5NTEtNTk5QTU9QUFJRUE5OT05PTk9QUFFPTk5PTk5QTk1NS0lISEpJSUlJR0ZHR0dJSkhJSEhJSEhHSEdISElISUxLSklISkpJSkpIR0pMS0pJSUhKSktMTk1NTU9RTFVzcnN3enl3dnR2eHp7fX19fn5+fn9+fn5+gICBgICAf4GBgH+AgICAgICBbE9PTlRZVVVdW1lXV1hOTUpKSUZKT0xKSkdJSk1NS0pMTUpHSUlJSktMRkRGSktLS0hKTExMT01MTE5PT09NTk9MTk5OUFBPTE1MTk1MTEpJSEdJSElISElJS0xLS0pJS0pJSklJSUlJR0dKSUdJSUpKTk1OTEhJSklJSk1PT01MT1JOWXBwcnd4d3d0c3R3enx+fX5+fn5+fn5+fn9/gICAgICAgYCAf39/gICAgIFvS0pNTlFOTlVXVlZSU0lFQ0VFUkREQT5CP0RAQD5CREFAQURHRkVIRUJBQEBDQ0RFQUNFSEtPS0lJSkhISklKSUlLSkxQTk1MTU1MTU1NTElIREZGR0ZGRklKSUlLSkhMSklKSkpJSEhKS0tIRkdJSklLTU5OSktPTUxLTU1PUE5QT1BgcG9yd3h2dHJzdXd6fX19fn5+fn9+fn1/gICAgICAf4CAgIB/f3+AgICAgXNQUE5OUE1KS1BSUE5RQ0RCQUZRRT1DPT9FSDk6Oz0/PTxBRUA+Ojs+PjxFRD0/RUE/QEFAREVHR0dHQkREREZFR0dHR0pHSEpLR0NER0pHQ0RFQUFDR0hHSEdISktKSElMS0lISktLTU5MTUxMSkpMS0lLTU9PUFNRT1BQTk9QUlFNUGdwb3N2dXRycXR4eX19fX1+fn5+f4B+foCAgH9/gIB/f4CAgH+Af4B/gICCdlRVUVFQT0xNUFBOT09BQkFAQkE/Oz48Pj8/Ozg5ODs7OkA7Oz48Ozw8PEhMPT1BQT9CQz1BRERGQ0ZGREZJSEM/QEBAQUFCQUE/Pjw9PkFAQD8+P0BFR0dHSUtMTk1OTUxNTUpLTVBVU05MTlFOTk1OTE1NTk9OTk1LS05OTk1OTkxUbnBwcnR1c3Fydnl5fX19fn1+fn5/gH5+gICAgICAgH9/gICAgH9/gH+BgIJ4UVFSVFJTUVNTUVFST0BAPT4/PD8+QEE/PT45Ozo7Ozk5Ojg4Ozw5ODo8PD49Ozs6ODpAQEFCP0FAQ0ZEQ0NDPzs+PkBDQ0E/Pj9BPkBAQj9APD9CQEFDRUVFSktQT1BPTU1OTExMT1JRUFJOTExPTUtOT0xMTEtMS0tKS0tKTU1LS1xxcXF1c3VycXR4eHp9fn1+fn5+f39/fn5/gIGAgH+Af4CAgICAf4CAf4CAgXxSTU9RUFFSUlRSU1NOPDs8Ozs7P0BBQkA9PDk8PTw6Nzk6Ojk3OTo6Nzg6OTo7Ozg3ODk7Ojg8PD1AQUA9Ozs+PD09QEJDQT9BQkE9Pj09Oz0/Q0RCQD9BREJFR0pKSkpKTE1MTExNTExOVVNLTE1USVBKSU1KSUpLS0pJSEdKS0lKZnJxc3RzdXJydnl5e31+fn5+fX9+f39/f36AgICAf4CAgICAgIF/gIF/gYCBgFZMTlBQTlJRUFBRUU44PT88PDo9PkFAQT8+PkA/Pj48PT0/QD09O0tlQD09Pj08PDw7Ozo7PD49Pj9AQUA+P0E/QEBBQEBAPT8/PTw6Oz09PD9AQUJCQUBCREZGRkdGR0dISUtMTExLTEtKS0lKSk1MTEpMS0lISUxMSklJSElLR01tcHF1dXR1c3V4eXl8fX5+fn5+fn5/gH9+gIB/f39/gH+AgYCAgYCBgICBgYCCYUtPT05OT1BPT1BQTzo8Pjw9Oz8+PkFBPz0/Q0NEQT89PkA/PT89a3hUPUNFPz5APTs9PT08Ozo9PkFBPz5AQD9BPz89PD48PTs7PD0+QUA/QD5AQ0NEQkRFSEVFR0hISEdGSUpJSUlJSUhKSkpKTEtKSklJSEhKSktMS0lLSkpIVnBvcXNzdHR1eXp7e3x+f35+fn5+f39/f39/f3+Af4CAgICAf4GBgICAgIGBgIJtTFBRTk9QTk5PUFBPPjw8PT4/P0A+QEA/Pz9DRkQ/PDw9QE1MRkh3dVk3PDo9PUA9Ojw7Ozw7ODk7Pz49PD07PEA9PTw8Pjs9PD0+QUBCQUBAP0JEQ0RFRkZGQ0VHSElJSEhJS0tMTUpKSUpNTUpLSktJSEhISEpJSktKSk5MSUlfcHBycnJ0dXZ6e319fH5+fn5+fn5/f35/f36AgIB/gICAgICAgYGAgICAgIGAgnZNTk5NTk5MTE5QT0w+QTw8PT8+QkM/PkFBQUJASW5QOz1kgYJ+dXp2Uzc4ODo8Pj8/PDs7PDs6Ojs+Pz89PDg6Pjw9Pj89Oz4/QEJDQkJDQ0FCQkFCQkRCQkRCRENGSUdGRkhJSUtNSklKSktMSkpJSkVESUlGRkhISUpKTEpGRmdwb3FxdHZ1d3t8fH18fn59fX1+fn9/foB+fn+AgH+AgICAgICBgYCAgICAgICBek5JS0tMTExFSUxOTTw/PDw9PkBAQUE7QkNCQz9Xe3lSZYSDg4OEfHhSPD0/PUJGQUQ/Ozw9Pj89PT5BQ0A8OTtBPz4+QT07P0JAQkNCQENDQUNBPT0+QD0/QUFBQENFRUBAQ0JDR0dFRENGRUZGR0VEQEFHR0ZDRkRHSEpHQz5IbG9wcHF0dXZ5fHx8fHx+fn1+fn5+fn5+f36Af3+AgICAgICAgIGAf4CAf4CBgIF+UUhLTU1NS0pLTE9RQD8+PkFBQEBBR0FCRENFQFl0d3uCgYGDfICDe0w/QEM/SlI9TUc8PD1BRUFCQkZIQz08QERDQUE/Pj1AQT4+Pj88PkBER0VAPkBBP0BDRkVDQkNDQEJEREJERUFCPkFCQkFCQEA9QUJDRENDQUNFR0E/PVZwcHFwcnV1d3p8e3x7fX9+fX19fX1+fX5+fn9/foB/f4CAgICAgYCAgIB/gIGAgX5SSEtNTUxLS05OUlVEQkBDQ0FBQkBCQ0BAQUE/UnVzfoB7gIR7foZiQENDRT5PW0xtaElAQ0VJSUlJTU1LRUNGR0hFR0VFRUREQ0E/QD4+QkZKSkdFRUdGRkpOTktKSUdHSEtMSUdHQ0REREVEQUJCQ0BDREVEREVERUZDQkFEZW9wcXF0dnV4e3x6fHx+f319fX19fn59f4B/f39/f39+gIGBf4CBgICAgH+AgICAfVJJSUpKSEpKTE9SU0dGRUdIREdIREA+PDs+QEVGa3V+f3mChIWFhn1KREZEQmN+hYiJflhHSEpMTE1PT0xIR0hHSElJSEhHR0hIRUNFRUVFRkhKSkZFR0lKTU9PTU1LSktKTU5LSUhHSElIR0ZFRkZGREZIR0VFSEhGSEdIRlFubnBxcnZ2eXt7e3p9fX5/fX19fX1+fn1/f39/fn5/gH+BgYGAgICAgICAf4GBgIB8UEhHSElGR0lKTU5OSkxJSUpLTE5KRkNBQkNGSkddeH+Cg4SEhoaHjWpBQlZ0hYeHh4eHgldJTE1MTU5MSkdHR0dER0dHR0ZIRkhFQ0RERkVEREhIQ0NDR0pKS0xMTExMTElKS0pKSUlJSEpISEdISUhHR0hGRkZISklJSUlIXW9vcXJzd3d6e3t6e319fn59fX19fX5+fYB/f39+fn+BgIGAgYCAgICAgIB/gYCAgHxNR0ZIRkVGR0dKS0pMTUxLTU5NT0tJSEhKS0tMTExYf4SFhYCDhoeJfVNthIeGhoaHh4eHfFBLTEtIR0ZGREVDQ0BBQ0NDQ0ZGRUJAPj5AQUFAQkQ/Pj9ERkhERUdJSklJSEhJR0lJSkpJSEZKSkpKSUpJSkpKRklMTEpKS0tmb3BzcnR2eHl7e3t8fH1+fn19fX19fn59f39/f35/f4CAgICAgYCAgIGAgICAgICAfU9GRkdGR0hHRUZHR01NTUtMS0lHQ0NDRElLS0xMSl6EhIWEf4GDhoaEgoaFhISGhoaHh4aKdUlJRkI/P0A/Pz88PDw+Ojo8QUFAPjw5OTg8PD07Pjs5Oz9BQkBBQ0NCQEFCRERCQ0ZISUhISExNTEdJSk1NTk1KSktLSkxNU2xvcXRzc3d5e3t7fH19fn9+fX19fX1+fn5/foB/fn9/gICBgIGBgICAgYCAgIB/f39+UUZFRkdJSUdEQ0VGTk1MSklIRT85Oj5ARUhISkpJaoaFhYKAg4GCgoOEhIWFhoeIiIiJiYyOZkRDPTg4Ojo5ODc4ODk2NDc5Ozw6ODU2Nzc4OTc4NzU4ODs7Oz1AOzk5OT08Pjs7PUFERUhKTUxMR0lIT1JRUFBOTE1NT1Fdb3BydHN1eHp7e3x8fn5+f359fX59fX5+f39/gH9/f4CAgICAgYCAgICAgICAgIB/f39RR0ZHSEpIRkVGR0hMTEpJSUdDQjU2OjxDQENHSUlnhoWCf4CDhIOCgoOEhomKi4yLiomKi4yJXj83NjU2NzY2NjQ1NzYzNDY4Ojg3NjU2NTY3Njc3ODo3Nzc4OTs3NTc4OTc5ODc2OjxAR0ZJRklGRUZPU1JTU1JPUFBSVGVwcXN0dHd5e3t7fH1+fn5/fn19fX19f39/f3+Afn+AgICAgICBgICAgICAgICAgH9/flJISEhJS0lHSUpJSkpLREVIRUJANTc4OD06PUVDQmqEgYCBgoODg4ODhYmKiomJioqKiouJiYqCSDY3NjQ2ODg3NDU3ODQ2NzY5OTc2Njc2NTo5Ojo6Ozg5ODk3Nzc3OTo5ODg3ODU4OTtBPT4+QkE/QUtMT1FQUU9PT1JXa3FydHR1d3l7e3t8fX5/fn9+fX19fX5/f4B+fn9/f4CAgH9/gICAgICAgH+AgICAf39+VEhHSUlMTUtKS0tMSUg/QEFAPDo1Nzk4OTc7QjlBe4SAgoOEhISEhIaJioqIh4iIiIqKjIqJiYx6Pjo4ODs8PT45Ojs8ODk7OTo7Ojk5Ozo5PT09Pzs7Oz06Pjs5Ozs8Ozw8OTk8ODo6Ozo5OTk8Pzw9QUJESUpNS0lLTFdvcnN1dHZ4e3t7fHt9f39+f359fX19fn9/f35/f39/f3+Bf4CAgICAgICAf4CAgH+Af35URkVGSUxOTkxKSk1CPzo7PDs4OTk4OTo6Ojs/PVCDgoGChIWEhYaIiYiHhoaGiImIiYuMi4mKioxsPDs+QUNFRUFBQUI+QEJAQD49Pj5APz8/QD9APT0/Qj9BQT9BPz1AQEA+P0E9Pjw7Ojs5OTs/PTs7PT1BQUNBQkNBWHBxdHR0dnl7e3x9e31/fn9/fn19fX5+f35+fn9+f4B/f4CAgIB/gIGAf39/gICAf39/flJFQ0FHSk5PTElHSzo4Ojs5Ojo8PTo7Oz09P0BCWYWCgoSFhIWEhomJiIiGhoaHiImKi4uKioqLiYtePkRHSUtKSUZHR0RGSEdFQkBAQ0VDQ0FCQ0I/QERIRUNFREVFQUZFRkRFRkRAQj88QD49P0A+Pz8/Pj8+Pjo7PTxgcXJ0dHV3enp6fX19fn5+f39+fX19fX5/fn5+fn5/gH9/gICAgICAgICAf4CAgIB/f4B+UERAPUNIT01HRkJEOTc6Pjo8Oz4/Pz89QUBEREVehoKDhIWGhoaIiYmIh4aGhoeJioqLjI2MjIuKiohXSExNTUtOSklLSElKSklFQ0RGR0ZEQ0VGREJISUtIR0dGR0dFS0lLSUpLSkNGQ0NEQkFBQ0JEQ0NERENBPTs9QGhwc3R0d3d6eHt8fH19fn5/f359fX1+fn9+fn59fn+Af3+AgH9/gICAgICAgICAgH+AgH9PQT49P0RMS0BCQkE5ODw+Ozw7PkA/QT9CQ0hISl2GgoOFhYeHiImJiIiHhoaGiIiIiYqMjYyMi4uKjH9QTVBNS05LSkxJSUlISkZER0hISUVFSEZGRUxMTUlKR0dISUpPTU5MTE1LSEZHR0VFQ0ZGRkZERUhIRkNBP0BMbHB0dXZ4eXl5fHx8fX1+fn9+fn19fX1/f35+fn5+f39/f39/f3+AgICAgIB/gICAgICAf1FBPz4/RkdHPTxAQDg3PDs8PTo/QD5AQENGSkpRY4KDhYSFhoeHiIiIiIiIh4eIiIiJioyNjIyMjIuKjXFNUU9NTExLTEpISEVKSURKSEdLSkhKR0dHS0xOTExISElKTVBOUE5NT0tJR0lKSElESUhIRkZHR0lGQ0JBQ1VucHV3d3l7eHl6enx8fX5+f39+fn1+fX5+fn5/f36Af4B/f3+Af4CAgICAgICAgICAf39/VERBQUJHSEI/OD9AODo8OD0+Oz1BPj9ARUlLTVZyg4SEhISFhoeIiIiIiIeGiIiIiImJjIyLjIyMi4uLi19RUVBNTk1LSkdGQkdKR0xKRktPTEtKSk1NTE9QTkhJS0xPUVFRUU9PSklKSkxKTEZHSEdFR0lGRUVCQEJCXG9yd3h5enl5eXp6e3t+fn5/fn59fX19fn9+fn9+f4CAgIB/f39/gICAgICAgICAgH9/f39VRUNFRUdHRUQ7P0E7PTw5QD4+QEJHR0FITE1RV3mFg4ODhISGiIiIiIiIh4eIiIiIiIqLi4uMjIyMi4uNfFdVUVJUUk9MS0pERUZLT05PV1ZRUE9RU1JNU1RPTVNMUFNVV1JTUVBMSk1NTUtOR0dKRkZISkRERUVCRENjcHV5eXp6ent6e3p7fH59fX9+fX19fXx9fn5/gH9/gICAf39/f3+BgYCAf39/gIB/f39/f1VGRkdHR0dIRj5AQj0/PT1CP0JDR1ZORk9RUVVZfIaDhYWEhIeIiIiIiIiIiIiIiIiJiouKioyMjIyOi4uLZ1ZVa2FFUlFRUEo7O1FTUmB1XVVWVFZZWVJYWFJaZlBVV1pdUlRXUVBNUlBQUFFLS0tISEpIRUZJSElISWlydnl5enl6e3t8ent8fXx9gH59fX19fX1+f39/f3+AgIB/f39/f4CAgIB/f3+AgH9/f35+U0hKSUlHR0ZFPz9BQUVCQ0dFREVMWFJNVFZWWFt8hoWHhoWGh4iIiIiIiIiIiIiIiIiIlJyMioqMfWGKi4uGbFtkVTpYWFhTUD5AVlVZW2NgVllicl5dVl1aVkVRWVpbWV9UWWdSVVZYVFRWVE9PTUpMSklJTE1LT01Tb3N2eHl4d3p6ent6enx9fH5/fn1+fX19fn1/f39+f4CAgH9/f3+AgICAgH9/gH+Af39+fn5WSkpJSEdGRERCQT9ITUlNUEtJS1BUU1NYWlpcXHiFhIWFhYWGh4eHiIiIiIiIiIiIiImcnaCPiY5nO36MiYqLem5wWFpbWlJTUlZWVFpadINZVX2QYVxYXV5XSVZdXVtbX1lIWVhZW11YWFlXUlFOUFFNTU9TUVFVUmFzc3Z3d3Z4eHh6e3t8fX19f39+fX59fX1+fn9/gH9/gIB/f3+Af3+AgICAf39/gIB/gHh5fVlOS0lJSUZCREBBOlBRUVdYUFBPUVNUVFhYWVpbboGCg4WEhYaHh4eHh4iIiIiIiIiIiJaanJeIioFuhomIh4OKfmZZWVxYU1ZUV1JRV1ViloBRZXJYWldfaFBgZltbWFxnYUdPWmhnXFtcXV1XUk9TUFBRVlZWVllabnJ0d3Z2dHd4eHt7fH19fX5/fn59fn18fn9/f3+Af39/gH+AgH9/gICBgYB/gH1yfX9/b3R8XVNQT01LSkVDP0A7UFBaWltSU1FPUlJSVVNWVFdfdXiAhYSEhYaGhoaHh4eHiIiIh4eIh4ORjomJiIaFiIiGfYB7XFBVWFRSVFJRUUxPTEtmeVpdVFlVVl1aTFRaVFNUXlpYV1dXemtYWltcXlRRUVBJTk9XVlhaWmRxc3Z2dHR2eHl5e3t8fH19fn99fX1+fX1+f39/gIB/f3+Afn56eHd2c3V7f3+AgHRrfn5rcnleW1ZVVFJPS0ZDREFNXoNsVlJTTk9RT1FVUlNSUlRjZHaAgoKDhISEhIWFhISDhoaGhoeIhn6JiYiHhoOHh4d5bXFWSUtNTktNS0hKREZIRUM+U2NVf1JRUU5LUlRRTU9ZUU1OUVNVVU1RU1JQT01MSENJSFJUVVpcbXJ1dnVzc3d7ent7e317fX19fn19fX59fn9/f4B/f399fX5+f39/f4B+e3Zzd31+fmR1fWlxdF9kXV5bWVZQTElMSWFsknRQUVNOUVJRUltSU1JRUlVVYnN7fH+AgYKBgX99e3uAf4OChYaHgoaGhoGEgYaFhnVfXUtDP0NDQ0NCP0RQQkNAQz5CSEdWQEhOTUddaVFIRk9GREVGSEdIQkNIR0hLR0NCQURAT1BNU2RzdHV1c3R1enx6e3t7fHx9fHt+fX19fn5/f3+AgIB/f3x8fX+Af39/f4CBgH12dHt/bWh8Z25xZmllZGJbWFNRUFVSc1dlW09PTkxRU1FVWVNVUVFUUk9WYGtscnZ7e3h5dHJuc3RzeXh+foOAg4OCgIKAgoGBa0xHPz87Oz5APz8/PmtRSmFFRkhJRUI/R0xNR01RVUlCRT8+PD08PT0/PT9BQ0M/Pjw9Qj5KTUZVbnV1dXN0dnh7fHp9fHx9fX19fH59fXx+fn9/f4B/f39/enl3eHd2dnh7foB+fXt4dnx1YXhnbHBqbGppZmBbUVJaXFleSUpQUU5LTFFSUVRVVVdRUVdWUFhbYl1hZ21tbG9raGBucmptbHF1e3p9e3h6fHx4d3hkQkBAQj06QkNBQURCXF1Pe05PT05LTE1PT1FMS0xXTUhHQEI8OTc3NTk5PTs7Ozg5ODk/O0JIP1x0dHV2dXZ3eXx8fH18fH19fn58fX19fX9/f39/fn9/f314dXZ6e3p3eXh1d3t8eXh1eXdjcWhpcG1ubW1oZl5PUF5cWklHUFJRT01QUU5RUlRWWFNSWVROWVpbV1ldXl5gZWBdXnF2a15gZ2t3b29sam9ubmxmYlhHRkZIQkFGSUVFRkRNUlBhV1JYUVBTU1JVW09PUVdQTUpDRj46OjY0ODY5Nzk6MzY2Nzk1PEI9ZXR0dnd3eXl7fX18fHt8fX5+fnt9fn19f39/fn5+fn9/e3d1eX18enh8fHx8dHd2d3Z1d2tuaWhxbm9vb2prYFVXXlpXTUxUVFNRUVVPTFJTVFdYVFRYUUxYWVpWWFhWWFldV1dYaHNrXVZhc2thYV9dZGBfXllVUE1PTkxISEpLSUhGQ1FQU1pXVFRNUVNZU1xlVU9TVFFOS0lIQz9BOTk4ODk3ODg0NzU3ODU5OUducnV4eHp7e31+fX18e318fn5+en1+fH1/f359fn59f358dHR1e3hycW9vbnR4cXJzeHZ1cWZkZ3JucHBxbm1kXV9fWVdPUFhWVlNUVk9PVVZYWFlTVVRMS1RVVVVVV1BUVVdUVVJdbl5STllfW1ZZO0RVV1RbZkpMUFJST01NTk5OTEpGUFBVWVNUTkpPT1RTVFxWUlVTUk9NS0lISEY/Pz06Nzg3NjU5OTY3NjY1V3Bwc3h5ent8fX59fnx8fXx+fX15fX18fn5+fXx8fX1+fXxydnF4eHJ2dXFxbnBwb3B1dnRuamRkanBwcXJwbmZlZGNcXlJUWlZXVVRXVFJYWFlZWVJVT0pIT1BPT01SSk9QUFBOTk9UTE1JUE9TVFUyPFhNSUFRPWNhUVNRUE5QUVBOTk1QTlRSUFJNSUxLT1FQUVJTVFFST0xNS0xMSENCQT06Ojg3NjtCNDU2NjtlcHF1eHh7fHx9fnx9fH19fX18e3h8ent9fX58e3l9fH18e3B1b3d1cHV0b3N2cHFxcHR1dmNqZ2VXaHRycnFuaWlocFZWVFVYVVdVUldWVVpZWFdVUVNGRUJGR0dIRkpESEpIR0VITEhLSEZMTVBNRy9FX1I+M0A+am9hUlJRQEZVUVBRUFFOUU9QT0xKTExPUE5OUFFRTlBPSkxNTUtHRUVEQjs9PDw5PUc2Njc2RG5xdHZ6e3t8fX18enx8fX5+fXt5dnh3eXl8fXp6dn17fHp6b3Fud3JwdnFtcHNwb3Bzc3N0ZmdgaFpXa3JzcmxtbWtuYmVQU1RSU1VPV1ZWWVlWUVFRT0A+Oz0/QEJBQ0BCRURBQEdIR0hFRkhKTktFR0NPUkM4RU5TXWZTUVNBR1VQT1FRUE1NTkxKTEtMTk9PUU1PT01ITExJS0tMS0dGRkVEPEFBPjtARTs8ODlUcXN1eXt7e318fHt5fXt6fn58e3V0dXJ2dnp6eHpyfHt8eXltcW94cnF1bm5xcm9vb3Rzc3J1dGtnZ15lam1wa29xbWltY0xPT01RU0xUVVRXV1VMTEtIPTk4Nzs/QD48PUFAQj0+RUhHREZGSUdKSkBGQUFARkhFSk9IUFJhXFFQUk5TT09PTExPTUtNTE1PTltXS01RT0dJSENJSkxMSkZGRkQ/QkM+PEJGP0I/QWRxdXh7ent7fHt6end8eHl+fnt7cXN0cHJzd3R4eHN6e3l2d2xxb3ZxdHRsb3Fybm5vc3ZydHNycmtsZW5zaG1ubWxtbGprSUxISE9RSlFTUVRTT0tIQ0U9OTg3OT9CPjs/QkBAPkFESUVDSEdJR0lFQkI/Pj1DQkFHSURNT2FlUU1PTldLTE1LTE1NTExLTk5TZE1KTFJJSUlFQUhKTE1OSkdJRkJBQkA/RUZFSERLb3B3enl5e3t6fHp3c3h0eHx8eXpucXJtbm9ycnZyc3h8eHZ2bXBtc3B1dGxwcHJvb29ydnVyVlZucWdseYRqbXFybm5qaG9ISkNHTE1JTVBNUE9IS0U/Qj05OTk6P0I/PEBCQkFERUdLRkRJSUdHSENDP0I/P0BBPkNFQ0tNUVRMSklNVEZJSUpMSktLSUlMTU9QUlBLR0NLR0NCSkpMTU9NSUpJR0NDQ0RJSk1MSVpzbXh5eHp7e3l8dnJwdXJ0eXl2eGpxbmpsbG50dG10dXtzdHhyb25xb3ZzbnBvcnBvcHN0eWpOYGdzanR8eWdvc3FqcWhlcUhLREdISEdKS0lKS0RHQj0+PTo6OjtAQj89QkJDQ0dGSkxKRUlJRkdHQ0M7QUBCPkBAQ0VDSU1PR0hLRkhLREhJS01ISkxISEpMSk1dUklIRE1GQURLSk5NUE5LTUpLRkdHSk1OUU5MY25pdnZ3e3h7en1xbWxza3B0dHR1aHBtamlra3RwbnR0eXByeXRvcnFvd3NvcXB0cnBydXR5a05WbXVscXt2aW5vaWp0aGRvRktERkVHREVFRkVHQkNAPjw9Ojs6OkBEQD5CQ0RFSUZKSkxGSUlHRkZEQjtCQ0M+P0NDQ0VHTE5HS05IREhESUxOTUhJTEdFRklJTE5LSkhFTkhDR01MT01PTU5OTUxJSEpPUlFSTlJmZ2Zyb3N4dXt6fGxoam9la3Btc3FmbWxoaWtsdG1wdXR3cW94dG90c3J2c3BxcnRzcnR1dXZ2WFZ1dWtvdHJrb3ZsaG1lX3BHSkRGRkVCQkJFQERCPj8+Ojs7PTo9PkNBP0FDRUdKR0lJTEhHR0dGRUNAPUVFQj5BQ0NDRUdISUdNUElGRkZLTk9LRkhKRkVERElJSEtJRkhQS0RJTUxQTU9OT09OSkpJTVJVVFJPV2RgYW1ncHJvcnl6Z2VoaGNpbGdxbGZsbWdpa2xzbHB2dXRwbnZyb3Nyc3V0cXNzdXRzdXZ2dnl2dXR2bGt1dW1ydnFsbmxlck1HRUVHQ0JBQkQ9QkE+QT06Oj0/Oz4+QEI/QEJER0pGSkdJSEZGR0VDQkFBRkZDQkNCREVER0dIRkxRS0lPSkpMS0lHSEVGRURDSUhIS0pHS1JNQ05PTVFPT09OT09LS0tQVVdWVVRYYF5caWFtaW5ocnNiZWZmZGloZm5pZm1taGtrbXJpcXZ1c3Ftdm5vcXJzd3Nyc3R1dnZ2dnd2d3Z2dHd1a3N1bnV0c3FyamtzTUdHRkhCQkFERDxBQUBDPDg5PT45Pzw/Qj9AQERGSEVIRkZHRkVFRENFQ0RJRkNGRUJFR0VFRkdFSk1LSFFNSktISElFRkhIRUNJSUpLTUtPU05EUVJQUVFOT01OUE1MTlNXVldYVlhdWl1kYGhiamlna19lZWdjZ2dna2dna21rbWxwcWd0dHVyc252b3FwcnR4cXNzdXZ1gpF5dnZ0eHV1d3hub3VvcnN1cXFpb3pNSEdISEJCQkZFPEBCQkQ8Nzo9Pjo+OkBCPj8/Q0VGREZEREdFQ0VDREVGR0pFRUlHQ0dIRkhGRUNGSkpHTUpMS0lKTEZJSUtIRUtLTE1OT1JUT0lTVVRRU1BRTU5RTk1RV1pWWllWWl1aWGFgYGBeaGVjYGRlaGdqaWhqZmhubGxubXFwaXV1eHJycHVwcHBydXZwdXN1dnV7fn14dnR3dnZ2eHBsdXBtc3RucHJzeU5ISEdJREFDSEU8QEVCRT04Oj4+PTw8QUI8Pz5BQkZDRUJCR0RDRUVGR0dHSUZHS0hDSEhHSUdGREhLSUdLSE1LSktMSExLTUtJTkxPTk9SVVZPS1VWVFFUUVJMT1FQT1RZWllcWllbXl9eYGJdXGFja2JgZGdocoVoZ2lmam1ucG9uc3FqdHV4cnNzdHJucHF2cnF1cnV1c355jn11dXZ2dnZ4cmh1cWtydGxxdnF1TUlLSEpFQkVHRTxAR0NEQDk8PkA/Pj9DQjxAPkFBRkNFRENIREZER0VISEZIR0lLSkZKSEhLSEZGTEhISEpHTExMTExJTUtOTU1PTFBQUVVWV09LVlZVU1NSUUxPUlJRVltbXV5bXF5fX2FgYWRdZGBlZmBlaGpjc3NmamhnbHBycW9zc25zd3dxdXZ0c21vcnVvcnNwdXJ2cnSBdnV1dXd2dXd0Z3Rya3Fya3J2b3ZKS0xJTEdCRURFPEBGRERCOz8/QUBAQERBP0I/QUNIQkVERkdFSUVGRElIRklISkxISEpKSUxKRkpLSElKSkdLS01NSkpNTE5OTlBLT1BSVVhWTU5UVlVTUlFQTE5UU1JXW15eX11dYF9hYWFgYmNlYWNoYmRpamd2i2xraWdtb3NxcHFwcHJ5dnJ1dXRzbW1zc21xcm90dXRycHN3dHV1d3Z1dXRlcXNrcHFqcnZvd0pNTExMR0RDQUQ8P0VFRUM9QUFDQkJDRUJCREFBRUdDSEdIR0VKRkNHSUdHSkZJTEhKSk1LTUxHS0lITEtOUUtSUUxTTUtOTk9QUE9UT1dYWFtOU1FXXFpTVlBOVFVUVFhaX2JiX2RhXmBiXmBlYWFiZ25oYmloaG14dmxoaW1vc3JwcXJycnZ0c3Vzc3Nua3NxbXByb3R2cnFxdXZ1c3d5d3V0dWNtdGtvcGpxdG93TE1MS0xHRUFARD4+REVGQ0BDQUVEREZDQ0VHQ0JJRkNISkpISUtGREtKR0hKSUlLR0pKTktOTElMSEpNS1pmSmRcS2xTSE9OX25Va3NbcXBid2NSUGJ2dWh1Y2F2YFhucWJkdmluemZbbHRgbGpUYHd1aWpnaWZnbG1qbW9qbW5zcnBycnFyc3Jzc3J0cm5sdG9ucHFxdXVxcXN0dnZ1dXl3dXR0YGt0a3Bwa3FycXlLTkpLSkZDP0BCPz1ERUZEQ0RCRUVFRkJGRkhDREpFRUpMTEpMTUdHTUlISUtIS0pJS0pOTE1NTExJTE1MW3NiZHBebG1VTU5mc11nZXFsbnRncGlfYVlubmJwcGJrampnb3F0ZXRub1xvdWdwTUpyeXZrYmBrZWVteW1rdmxucHNycHJxcHFycXJycnRybW1zbm5vcHJ1dHFzc3R1dXV0d3h2dXRibXVrcHBscnJxektMSUlHRUQ/QkI/PUNGR0JGQ0VERUVEQ0hIR0RFS0dHTE1NS01NR0pOSEpLSklMSkpKS0xNTk5NTUpNTU1bcm9vbnBwbGtNUFFsV05pYnRycGFtb3ZcWWxRXG1tWnFta29teHh0c2lwXF9ya3FqVXV5eHBjXmtmYmdxcGppb3Bwc3NwcXBxcXJycXFycnRsbXJtbm5vcnV0cXRydHV1dHV1enZ1dGVudWtwb2xzcnJ5SktHR0VFRUJCQj0/QEZHQkdESUVFREJGSUhIRUdLSkdNTU5MTU5ITE1JTEtISk1JS0pKSk9QT05NS05NTFxoZHVdbHFXbE5QUW1VWmtea2x2YWxkdFRlY05tWWxcdHBraWx4and1aHBdXnJraFdiY3d8b2NgZ2hhZGp1eWtubnFzc3BxcHFwcnFwcHBydWttcW1tbW9xc3Rxc3J0dnZzd3Z6dnV0aG91bHNvbXNydHdJTUdJREVFQ0FCPEJBQkZER0ZMSEVDQ0hLSEhGSkxMRk1LTFNSTEdNTEhOSklITkhKSklITk9NTkxKTU1KWnNwcG9xcW1sT1FSbllxa2dvb3Fxb210Xm5YYXRfbm9wb3Fyb251c3R0altddGN3eHJqbnpoYWFjZ2Jiam10dXBzdXZzcXBwcW9ydHt/fn13bGtxbmxtbnByc3F0dHN1dXR4eHl5dHVrb3VtdG9uc3N2dEhLSElCRUVFQUA+Q0NCR0NISU1JRkNGSkxJR0ZKTUxGT0pLV1JLR0tKSk5JSEpMSUtKSUhKTE1NTUlLSktTa2JaaV5famNyclpfWWpvX2VlVWtfY1thYlFgbGhdalxuaWlkW3BmZHBdWlxrW21xY3BzbGRnY2RnYGBrbXBwb3R5cnVxb3BxbnmFiIeHhoWAdnNua21tb25xcnR0cnR1dXZ5eHhzdW5xdW53cXJ1dHdySEhGSURFREZBQEFFRERHQkhKTEhGREdLTElFRkpPTElPSUxbUUpGSEhLTUlISkpLS0lISUdLS0tLRkhKSkxMTEtJS0xOVFtcVFBUTFBPTk9PVlFPT1FPT1FKSU5QUWRxaVRZV1tbXFVZW11YXVxcY2ZhYWZiY2VfX2ZrbWhtdHlydHJvcHB0hoeGhoaFhYaHg3pwbW1sa3FzdHRydHZ0dXl4eHV2cXJ1b3ZydHN1dXNIQ0VHRkZBRUM/Q0dDRUdDSUtMSEZER0tMSERHSFBLTE9LTFdMSUVFSElKSElLSUxKSEZIR0pHR0lFRkxISUtOTElPXFdeT1xbYF5PWFlTXFxiXk1ZWk1YYVJKWWFaU2BkXGFYW2RkVlZYXFlaWFxWWVxdYl9kYGFfZWhrZ210dHFxdHBxcoGGhoaFhoWFhYaGhoR9cmtpb3Jzc3N0d3l5eHl4d3h0cXhyeHNxcnVydE9CQ0RMTUJDREJESURHR0ZLSktIRUVKSkpHRUhIUEpMTUpNU0lIRUFIRkpJS0tJTEpJRkVKR0RGR0VFSkdDSk1KS1RfWWBYYGFbYFVYWVReXlpfUllcUF5cWU5eXF5TW15jXlpdYGNgWV9iW2BeW1RYWFleXWNjYmFjZWlla3Jwb3Bwbm93hoaFhYaCe4CFhYaGhYaFf3VxcHJyc3Z5eXp5eXh4eHdyeXZ4cnF4dnR2YVNKSk1JRUNCQ0ZHRUdHSUpKSUlERktLS0ZFSElOSk5MSExOR0hGPkdHTElLS0pLS0lHRUlEQ0NFQUZKREBKS0lPW2NZXl5hX1JUU1dfYFxdWV5RWVxNVl9XS1FZW1BaX2FhXV5jYWBiYmJjY2VaUVlWVVxZXmRgX19jZWJob21tbGxsbHWFf4SDeXV8hIWFhYaGhYWGhoN9d3JydHd5eXl5f359eXV5dnZybnp3dnhYUUpGREdFQkVHSEZHSElGR0pHSEZIS0lMRERLSk5NTExISkpISkc/R0ZOSktLTUtLS0lHR0NEQERBSElBP0lKR09dYVpbZF1fVFFSWF1cXFxfWktXXExSXFlJTV5QT1xfYWNjY2NiXGRjYmRjZlhRVVRTW1haYV5eXmFhX2Rsa21qamxudn51gXp8hIWFhYWFhYaGhYaFhoaGgnpyc3V1e4WHh4eGhYSBfnhwend2eFxSTUNASUZDRUtJRkZHSEdHSUZGRklMSk5FREtKTE5KTElLSkhJR0JISFFNS0tPTEtLSUhHRUQ/RUJISEFBR0ZEVF1ZXlhfWV9bXVVYWFBdXVFLSldeWF5bXVZaYFJRX19iYmBgYmJgY2JiZGRiWE9RUVJbU1teXV1dXl9fZGhnbGpubnB7e3x+e4CCg4SFhYWFhYWEhIWDhISHh4FzcneFh4eHh4eHh4eHh4WDgHx4XFNLQkFHRkRHTVJIQ1JLRkhISEVGS0pNUEVHSUpLTkxMSUxLSUlHREhLUU9NTFBMTUtLSElDREFFQ0hHQkFGRUJWVUVcVF1TVl9YTlRVTlpbTUpLVWBhW19YX15hXU9ZYl1gYF9iY2JdYmJXX19UUE5QUVhSXVxbXFxeYGJmZmVsZm9vd3x7gHt9f4CEhISEhIWFhYODhYKDgoWFhnpvgYaGhoeHiIeGhoaFhYSFg35JTkZERUZHRElSYlBEV19JR0dIREZNSlBQRUpJSktOTEtLTEtKSkdFSk1RUU5PUE1OTE5IS0FEQUNERkRDQURGQUxIQ0xMUE9PTEZNRkdJSkhHTExNT1BJTE9QUFNQTFBUU1VaWVdZWFhkVk9TVFBQT05QVVRcWVlaXVxgYWRlY2hja2xwc3N6eX97en+EhISEhISEhIKEgH57gYOBfXuFhIaGh4eHhYWFhISEgoGAfUtJRUVHRkdES01dTEdIWU1HSEpIR05MUVFJS0pLS05OVU5PS0tMR0dLUFNTTlBPTk5OT0hLRWBFRF9MRGZjRE1bSF5cc21PTVZtWUxDUGBVbFdnSl1XVV5ETFFVTE1UVlFTVFhXVFhVVFxUUGZaaGhkWFNrVFdWVVtcW2BgYWJiYmBmaGZubGhyenx9foGEhISEg4ODgX18enJ7gXp7f4KAg4SEhYWBhIWBg4N/fnp7TElFRkZIRUVLT1NJS0dgVEhKT0pJT01SUUtMS0xPUlVST09KTE5HSE1RW1lPUFBOT1BPSUpQf1FJfFlZcnNXUG1IcW5wYVZQcXFzUENrc21xc3BTb19bblhdVlxYVWtoVV1WY1pgWVtgVlVXf2p0dXVfYHdgWGFcXGZbX2FhYWFeYGJnbXBsYHB3dHiBgYKDg4J/fX6Adnh6bHZ+dHh+gHx+gIGChHyAg3p/gX9+d3dOSUVITU1CRExMRkpMRlJWTEtPSUtSWFdRTk5OTFFUTk9RUEtMT0dNUFNbWlRRUk9QUFBKSFp4XVR4ZWhZUlRRdmd0bHBibmZqUXJPTXdtanJwc3JxcnBvcIFdZXp1eHFxenF+c31rdX1iUmd8ZXNzb3NzfH1vfXlvf3JfYGBiYlpgYGdrbmtibGZnbXd+gYCDfnt4d4B0dnppcn5udHx+d3h7foCDeHyAdXx/fHxzc05LRmBdR0FFTU1IS0pISlBOTU1KTlZeWVVMUVNOWVlMU1NSTkxQSVFSVFlXV1FUUFBQUUtHZnhsY3hybVpKTFV5cHVtdWJudlBkZUpmdnFtd2+AamZ4eGlXc1Foem1panp6fWx4en9vZ29YdnZqdXVwgGBzaHxpbHh8b15fX2NiW11iZGdpamRnYmNkbGxwcHN0c3NzeXFyeGJsdWdyeXtzc3V5foFzdXpufH15eHJuTUpTdE5DQkVQUEhKS0pMUE9PUE1QWmBaWEtUV1BhXlJWUVlTTVBJU1RWWFdXUFVQT05SSktyb3V1cXVxZGhgVm5McXBeRmh5V3ZUS2h4fXhgeXtzbmFebW9kUmdydW5teXB3bHZ0dHFsbVx0fnprbXl8bHVtfGtwdnV4Xl9fYl5dX2VkaWdoZWVeYmJpaWlqa25va3FubWpwYWNmZG93eG9tcHN5fm5xcGp7enRyb21LS1tWSEdFR1JQSkxNS0xRUVFRUFFXXFlVTlZZVWZYUlJZXlRNTklUVFdXWVdPU05OTlFIUm1IaXdLYGR2dlVXbE9ubHtzYWpnf3ZVS1draH1sbWx4YFtwenteYHpzY3JveHFoZXxpcntdVEtsYHZ1a2l1e3ttfnhrfHBdXl5iW15iZGRnZWVlYlpjY2lra3JzcndnbWloZGdgYWxhZ3Nya2hsbXJ8a21oa3t0bW1rbU9ISktISUlIUlBMTk9NTFRTU09UUldSVlRQV1pWVlRUVGFgUU9OS1RUU1FVVk5OTE1PUEpIUU5QVUxLS1NUU1JUUFZVUVFOUVFYWFFOUFVUWFhYW1tVUlNXW1dYV1pPU1VXV1hSXVlXXVZUT1lSV1dXWFlfW2dyXltbWVxdX2NaX2NjZGZkY2NiWmNjZmZmbW5tdWZmZ2NgZl9dZ2BkbGhmZ2tob3poZ2drdWpoZ2lsUUlLTExNS0pTUU1RUE9MVlZUUFRVWFVZVVJaXVZVVFdVWVhQT0xNVlRRTlVTTk9NTFFQS0pRUktRTUtLT1JUUlFRU1NJSExOT1FSUVFRVFZSWFdcV1NTUVFVVVZTWlFPU1JXVVRZVlRZVVNSVVNUVFdYV11aXmFdXFpaXFxgY1xdYmNkZ2VkZGFZYGFjYWJoaGluY2FkXl9jXVpkXGJtYV5mZmdtc2RpaGtrZWRjZmhQSktMT09MTVRQTlNRUU1YV1VUVVdXV1pWVFxgVldWWVVYVFFQS09XU1BOVVBOUU5LU1BNT1VUTlFOTU5RU1BUUVNUVU5LTU9RVFRSUlFWV1VZWltZU1VSVFdXV1lbVE9UVVhVVFlVV1lUUlJXVVVXW1laX11VWF9dXl1cXWFhXltiYmNoZmVkYlhfYGJdYGhlZmRhXl9dXV5aWl9aX2dgXl1dY2hrYWdmaGZkYGJjYVBLTUxQUUxPVE9PU1FPUVpZWFdYWlpYWVZdamRWWFlaV1ZUVE9LT1ZUUE9UUFBQTk1RUVBSWFRRUU9NT1NVT1dSVFVVT05NUVNVVVRUUlRYVlpdXFpWVlFSV1hWW1tXUVRWVlVWWFRXV1RSUlhWVVpdWV1fXlZeXV5gXFxgYF9fWmJiZGhoZWRhWWJgYl5eZmRjYGJdXFxcXFlaW1hbYVteXVxfYl9fYmRkYmRfX2BcUE1OTlJRTVJST1NUUVBVXFpaV1tbXFlaW2RxbWhkX1tZVlZYUk1NVlNNTlJPUVJPTFBTUlVaVVRQUExQV1ZSV1NTU1hNT1BSVFhVVVVTVVlYW15dXFtWUk9VVlZbXFdRVFdVV1hVU1haVFNRWldWXF5aX19gVWFcYGFdYGJfXGBdY2FjZ2hkZmBZY2BhX19lZV9gY1taXFtcWlpZWVdcWVxbYF5gW15eYWBfYlxZYFpRTk9OVlFQVFJPVVRTUFdcXFxYXlxfV1xeanF3eYBjXFtWVlhSTk9XU05RUVBSVFJLUVRTWFpXVU9STlNYVlRTVFJSWk9RU1NWW1ZWV1RWWlhdXlxcXlZTTlRVVlxcVlJUVlZYWVJTWVxUUlJcV1pdXl1hYWBXYltjYl5hY19cYmFiX2RmaWRmXltkYGFgYWNlX2JfWVpeW1xbWVhZV1daWlphXF1bXVxcWl1gV1tbWlBPT09ZUFVVU1JXUlRQW11eXVtgXGBVXF1panJ9c2xnXFVZV1FPUltTUlFUUlRVVEtSVlVbWVpTT1NSVlZVU09WUlNaUlRVVFhcV1hYU1hcWF5dWVpdVFVOVldXXltYUVRVWFhYVFZYW1RTVl1ZXV1gXWJjXllgW2ViX2RkXl5jY2FdZWZpZGZdXmRhYGFhY2RfYl5YWl9bXFtYWFhYV1taXGBdW1tcW1haW15WXlldUE9PUlpQWlVVVlZUVFReXmBeXmJcYFVdXmJreXRsfWxaVVpVUVFTXFRUVFVUVllXTFJaVl1bXFJPVVNYV1ZTUFhSU1dTVlZVW11YW1lVWl5YX15ZXFlSV1JZWFlfWlpTVFZaWVpWV1lcVlVaXVxeYWFfZGRdXl1dZWFiZmReXmRjYFxnZGhlZGJfZGFfYWBiYl9gXldYXlpcXFpZWldWXVpdXlpZW1xbV1lcXVZYV11TT1BXWVFdVVZZV1dVWF9gYWFgY11gVV1eYmVldYF6aFhZWlRWU1ZcWFdXVlZXXVhQVVxZXl1dVFJYUldWVFJUWFJTVlRZWFldXlhdW1VeX1hfX1hdVlFZVFlaWmFZXFVWWFtaWlhZWVpYVl1eX15jYmFlZV1iXGBmYmRmZF9fZGJiW2ZjaGVjZmFmX19hYWFhYF9eVlVdWVtcW1lcWVldW1tbWFhZW1laWl1fXVRZXVVOU1pWU1xUVldZV1ZcYGFiY2FkX19WW2BkYV96dW9oWVxaVlhVV1taWVtZWFlgV1BVXltgYVxUVVhQVVZVU1ZWUlNVV1taXF9eWl9cVl9fWl1eWV5WU1lXWVpdYlpeVldbXFtcW1tZW1lZXl9gYGRiY2VlYmRaYmZjZ2ZlXmFiYGNeY2NpZGRnX2deYmJjYWFgXl9YVFpaWltbWFtYWFxbWltXV1lYV1xbXGBdVl1dU1BWWlZWWlVYVlhXWF1fYmFkYWRhXllZYWRiYGxmaF5cXVtXWFhZXFxcX1tZW2JWVFdeXWFjXFJWWFFXVlZWVlZUVlRYXFxfYGBdYF1XYV5bXlxbXlhWWFhbWl9gXF9YWV1cXV1eXFpcWFtfYV5gZGNkZmZmYlljZWVoZ2ReY2BfZWNdZmlkZWlfZ15jYmNhYWBfX1tYWVtZWlpYWVhXW1taW1dYWlRZXVxaYFxVXmJNUldZVldaWFtcWVdZXmBiYWVhZGFdXllhY2JfYWBhX1xcXVhXW1tdXV9fXFpdY1haWF1gY2RfUlhZUFhXWFhYV1ZYVl1dXmBhYV9iXllhXV1eWV1eWVhWV1tbYF9dX1lZXl1eXmFcW1pZXF9iX2JkY2VmZWZiWmRmZ2lnY19jXmFmZFppaWJmaWNlXmJiY2FgYF9dXVpXW1lZWFhaWFdaW1pZV1hWVVtdXV1gYGJieEtXV1xZV1xcXF1aV1xdX2BiZGJiYV1gWGJjYmBjYWJeXFxcWFdbXV9dYF9dW2BkXFxYWmNlY2BSXFlPWFdZW1pZWFpZYF1gYmJgYWNfXGJdX11bXl5aWVVYXV1fYF9fW1peXmBiY1xcV1tdYGJhY2VkZ2VlZmRcZWZoaWZjYWJcY2dgXGlpYmhpZmVgYmFjYV9gX11dXFlcWVhXWFlYV1xbWldXWE9YWl1hY2Zmcmt/SllXXVpaX1xcXltYXVteX2FjYmFhXWJbYmRhX2NjYl1cW1pXWGlxYFxgX11cYWNfXllZY2VkYVNfWlFZV1xdXFtaW1tjYGNiY2BiZGFgY15gXF1eX1pYVltfXVxhYV9dW2BhYmViX11TXF9gY2RkZmRnZmVmZV5lZmhoZ2RkYFtmZ15haGhjaGhmY2BiYGNiX19fXV1bWltZWFhYVlpWXFpaVlZVTFhXXGdpa2h1eIF2dnZ2dnZ2dnZ2dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6e3p6ent7e3t7e3t7e3t7e3t7e3x7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHt7e3t8fHx8fHx8fHx8e3t7fHx8fHx7e3t7e3t7fYmIhoqHhYKBgoOCg4OCgoKCgoKCgoKCgoGAgYCBgICAgYCBgYGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t6e3t7e3t7fHx8fHx8fHx8fHx7e3t7e3t7e3t7e3x7e3t7e3t7fHx8fHt7e3t7e3t8iYmHiYaFgoGCgoGCgoKCgYKCgoKCgoKBgYGAgICAgICAgIGBgYB9fHx8e3x8fHx8fHx8fHx8dnV1dXV1dXV2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eHh5eXl5eXl5eXl5eXt7e3t7e3t7e3t7enp6e3t7e3t7e3p6enp6ent7fHx8fHx8fHx8fHx7e3t7e3t7fHx8e3t7e3t7e3t7fHx8fHx7fHt7e3uHiYiJhYSDgYKCgoODgoKCgoKCgoKCgYGBgICAgICAgICAgYKBgH58fHx8fHx8fHx8fHx8fHx2dXR1dXV1dHV2d3d3d3d3d3d3d3d3d3h4eHh4eHh4eHh4eHh4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t7enp6e3p6enp6enp6enp6e3t8fHx8fHx8fHx8fHx8fHx8e3x8fHx8e3t7e3t7e3x8fHx8fHt7e3t7e4aJiYiFhYOBgoKCg4OCgYKCgoKCgoKBgYGAgICAgICAgIGBgYCAfnx8fHx8fHx8fHx9fX18fHjF1NLS0tLUk3t9fX19fYSMi4uLi454KSkqKiopKz0/Pj4+Pj5tgH5+f397pdfT09PT1r2GiYmJiYiNsbW0tLSzs7u+vr6+vr3K09LS0tLWun1+f39/f359fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx8fHx8fHt7e3t7hIuHh4aHgoGDg4GCgoKCgoKCgoKCgoGBgYCAgICAgICAgYCBgIB+fHx8fHx8fHx9fXx8fH19eNXn5OTk5OeZe39/f39+hpCPj4+Pk3kZGhoaGhocMTMzMzMzMmqCf4CAgHut6eTk5OToyomMjIyMi5G7wL/AwL+/yczMzMzMy9vm5eXl5enHfX5/f39/f319fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e3uCjYeIh4eDgoSCgYKCgoKCgoOCgoKCgYGBgICAgICAgICAgICAgH58fHx8fHx8fXx8fH19fX12fn9/f39/f3l3d3d3d3d4eXl5enp6eG9vcHBwcHBycnJycnJyd3p5eXp6en6Dg4ODg4SBfHx8fHx8fYCBgYGBgICBgoKCgoKChISEhISEhYJ8fX19fX19fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e4CMhomHh4SDhIKCgoKCgYKCg4KCgoGBgYGBgYCAf4CAgICAgICAfnx8fHx8fHx8fX19fX19fXZ0dHR0dHd0dnd6e3h7eHd2eHt3enp5fXp5eXh4eHh5eXl5enp5eXl5enp6eXh4eXl5eXl7e3t7e3t7enp6enp5enl5eXl5eXp6enp6enp6e3x8fHx9fX19fX19fX18fH19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8f4uHi4qIhIODgoKCg4KBgoKDgoKCgYGBgYGAgIGAf4CAgH+AgYF+fX18fHx8fHx9fX19fX19d3d3dnZ3fXh3d316eH14d3d5fHt8fXt9fHh3d3d3eHh4eHh5eXl5eXp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fHx8fHx8fHx7e3x8fHx8fHx8fHx+iomMjImFg4SEgoKDgoGCgoKCgoKBgYGBgYCAgICAgICAf4CAgH19fXx8fH19fX19fX19fX13d3d3d3p9eHt4fHx3e3h3d3d8fH19fX59eHh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fX19fXx9fX19fX19fX19fX19fHx8fHx8fHt7fHx8fHx8fHx8fH2Kio2NioWDg4OCgoKCgYGCgoKBgoGBgYKBgIGBgICAgIB/gIGAfXx9fX18fX19fX19fX19fXd3d3d3fX55d3d4e3p8eXd3d3p8fXt9fnx4eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt8fHx8fHx8fHx8fHx8fH19fX18fH18fH18fHx8fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8foqJjo2JhISEg4KDgoKBgYKBgoKCgYGBgoGAgYKAgICAgH+BgIB8fH19fX18fX19fX19fn5+d3d3d3d5fHl7eHx9eXt5enp6fXx8fHt+e3h4eHh4eHh4eXl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt7fHx7fHx8fHx8fHx8fXx8fX19fX19fXx8fHx8fHx8fXx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx/iIeNioeFhoaDg4ODgoGBgoGCgoGBgYGCgYCAgoF/gICAf4CAgHx8fX19fX19fX19fX5+fn53d3d3d3Z4eHl3eXp4enh5eXl7eHp6eXx4eHh5eXh4eHh5eXl5enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX18fH18fH19fX19fH19fX19fHx8fHx8fHx8fHx8fX+HiIyIhoeHhIKDhISCgYKBgYKCgoGBgYKBgIGBgYGAgIB/gIGAfHx9fX19fX19fX1+fn5+fnd3d3d3d3d3d3d3eHh4eHh4eHh4eHl5eXl5eXl5eXl5eXl6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fHx8fX19fHx8gIeIi4eHiYaDg4SDg4KBgYGCgoGBgYKCgYGBgIGBgYCAgICBgX97fH19fX19fX19fn5+fn5+d3d3d3d3d3d4eHd4dnl5eHh4eHh5eXl5eXl5eXl5eXl5enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fH19fXx9fXyBhoqKiYmIhIOFhISCgoGBgYGCgYGCgoGBgYCAgYGAgIGAgIGBf3x8fX19fX1+fn5+fn5+f394eHd4eHh4eHZxZGpeam15eXl4eHl5eXl5eXl5enp6enp6enp6enp7e3t8e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIGFiYqJioeEhYWEg4KCgYGBgoKBgYKBgYGBgYCBgYCAgYCBgIF+fH1+fn5+fn5+fn5+fn9/f3h4eHh4eHh5bWRiZV9fXm95eXl5eXl5eXl5eXp6enp6enp6enp6e3t7e3t7fHx8fHx8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goWKiomJhISGhYSDg4KBgYKCgoGBgoGBgYKBgIGBgICAgICBgH58fX5+fn5+fn5+fn9/f39/eHh4eHh4eW5kZWdlZGJeZnh5eXl5enp6enp6enp6enp6enp6e3t7e3t7e3x8fHx8fHt8fHt7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChouJiIqEhYaEg4OEgoGBgYGCgYKCgYGBgYCAgYGBgIB/gIGBf3x8fn5+fn5+fn9/f39/f394eHh4eHl3Z2VkZWZkZWFfaXl6enp6enp6enp6enp6ent7e3t7e3t7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHt8fHx8fHx8fHx9fX19fX19fX19fX19fXx9fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4eJh4SEhoSDg4WBgYGBgYKCgYGBgYKBgICAgYGAgYCAgYF+fHx/f35/f39/f39/f39/gHl5eXl5eWtlYWJlZWFlZV5ieHdze3p6enp6enp6enp6e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fH18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19g4aLhoiFhYaEgoOEhIKBgYGBgoKBgYKBgYGAgYGBgYGAgIGBgn98fH9/f39/f39/f3+AgICAeXl5eXl0Y2NlZGNmY2doZGZsZF5ze3p6enp6enp6enp6ent7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn6DhouGhoaGhYODg4SDgYGBgYGCgoGBgYKBgYCAgYGBgYCAgYGBfnx8f39/f39/gICAgICAgIB5eXl6d2RhY2diYmRdW2VfYV1eYGFoeHp6enp6enp6enp6e3t7e3t7fHx8e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+foSFi4eGhoaGhIODg4KBgYGBgoKCgYKBgoGAgIGBgYGAgYGBgYF+fX1/gH+AgICAgICAgICAgHl5eW9vYmJiZF5jZ19dYWFgXF9kYlttfHp6enp6enp6enp7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7fHx7e3x7fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5/hIiLhoSHhoaEhIODgoGBgYGCgYGBgYKCgYCAgYGBgYGBgYGBgX5+fYCAgICAgICAgICAgICBeXpwXWJlZGJkXmZnZ2BZYmJhY2VfXF1ze3t6enp7e3t7e3t8fHx8fHx8fHt7e3t7e3t7e3t7e3t7fHx8fHx8e3x8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fn19fn5+fn5+fn5+fn5+foCFjIqEhYaGhYODg4SCgYGBgYKBgYGBgoKCgYCBgYGCgICAgIGBf35+gICAgICAgICAgIGBgYF5emxiZGdjYmdmYWBgZGFiZWRjZGNeXGJ1fHt7e3t7e3t7e3x8fHx7e3x8fHx7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/gYeMiYWGhoeFg4SDgoGBgYGBgYKBgoKCg4KBgIGBgYKBgYGCgoF/f36AgICAgICAgIGBgYGBgXp7dGdnZmZkZGZmYF5fYWNlaGRlXmJkYHR8e3t7e3t7fHx8fHx8fHx8fHt7fHt8fHt7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f3+CiYqIhoaIhoWDhIOCgYGBgYGBgoGBgoKCgoGAgYGBgoKBgYKCgX9/f4GBgYGAgYGBgYGBgYGBenptaGNjZ2ZnZWdmZmdiZWRlYmdbYmVgdnx8e3x8fHx8fHx8fHx8e3t8fHx8e3x8fHt7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f39/f4SJioiGiYeFhYSEg4KBgYGBgYGCgYKCgYGBgYGBgYKBgoGBgICBgH9/gYGBgYGBgYGBgYGBgYF7emlpZGNqZmFgZmVjY2NnaWRjYmBiZGJ0fXx8fHx8fHt8fHx8fHx8e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f39+fn9/f39/f39/f3+AhIqMiIeJhoSFhYOCgYGBgYGBgYKBgoGBgYGBgYGBgoKBgYGBgYGAgH+BgYGBgYGBgYGBgYGBgXZzZWRnY2RmZWJlZmdkZmhmZWNgYGNkYHF9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fXx8fHx8fHx9fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/fn5+f35+f39/f39/f3+AgICFioyJiIqJhoaDgoKCgYGBgYGBgoGBgoGBgYGBgIGBgYGBgYGCgX+Af35/foCCgoKCgoKCgoKCc3NnZWRkZWlqaGZnZ2NhZmZlZmdmZWVjdX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fH19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gICAgICAgIWLioqJioeHhoSCgoGBgYGBgYKCgYKBgYGBgIGBgoKBgYGBgYGAf4B+dHRzdX1/goCAfn5/gYB0cmdkZWNmaWppZWNlY2BmZGRnZ2JiZWFwfXx8fHx8fHx8fHx8fHx8fHx9fX18fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f39/f39/f4CAgICAgIB/houLiouLh4eHhIOCgYGBgYGBgYKBgoKBgYGBgYKCgYCBgYGBgoCAgH5zc3NzdHV4dXV0dHV2dXVwZmNmZWhoaWdoZ2VmZWJfZGVmY2BiZ3d8fHx8fX19fX18fHx8fH19fX19fX19fXx9fXx8fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gIB/f3+AgICAgICAgICHjIyIi4qHh4eEhIKBgYGBgYGBgoGCgoGBgICBgoGBgYKBgoKCgYCAfnNzc3Nzc3NzdHR0dHNzdW9jY2FnZWhoZ2pmZGVnZmhmY2JlYl5ieX18e3t8fX19fX18fHx9fX19fX19e3x9fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn9/fn5+fn5+fn5/f39/f4CAgH9/gICBgICAgICAgYCAf4CAgYGAgIeLi4iNiYiJhoSFgYGBgYGBgYKCgYKCgYGBgIGCgoGBgYKBgoKBgIB+dHNzc3Nzc3Nzc3Nzc3N1cmdlZWRlamhoZ2ZpaGdjZWViZGNoZGd7eHVzc3R2dnl4dnR0dHZ3d3d2dHR0dXV4d3h4d3d6e3x9fXx9fn5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f35/f39/gH9+fHt7fX58eXl2dnZ5fHx6end2d3l7fXt4hIyMioyHh4iEhYSBgYGBgYGBgoGBgoGBgYGAgYKCgYGBgoGBgoGAgH51c3Nzc3Nzc3Nzc3Nzc3VzaGVnaGVrbGhqZ2lqZ2dnZmRkYmVkbnV0dHNzdHNzc3Nzc3Nzc3Nzc3NzdHNzc3Nzc3Nzc3N0dHV1c3V3eHl7fn59fn98f39/f39/f39/f314fH5+fXx4dXZ3eXd4dnRzc3N0dXRzc3Nzc3NzdHNzc3R0c3R0dHODjI2KiYeIhoOGg4GBgYGBgYGBgYGCgYGAgYGDgoKBgYCBgYGBgICAf3VzdHRzc3Nzc3Nyc3NzdnZpY2hqaGpsZWZpbGhgZmVkY2BkZGZ0dXV1dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHRzdHRzc3Nzc3R2dnV1d3V4fH9+fX9+fHp4dXN0dXV1dHNzc3Nzc3N0dHR0dHR0dHR1dXR0dHV1dHR1dXR1dXV1dIaMjYuIhoeEhIWCgYGBgYGBgYGCgoGAgYCBgYKCgoGBgIGBgYGAgIB/dnNzc3Nzc3Nzc3Nzc3N2dnNnZ2pmaGdmaGhmZGlnY2NnZWVmcHZ1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dHR1dHR0dHR0dHRzdHR0dnV1d3Z0c3R0dHR0dHR0dXV1dXV0dXV1dXV1dXV0dHNzc3N0dHNzdHR0dHR1dXR1iY6MjIqHh4SEhYKBgYGBgYGBgYKCgoGBgICAgoKCgoGBgYGBgYCAgH93c3Nzc3NycnJyc3NzcnZ2dW5kXWNnZWlraGVoZ2dqamlnZXB2dXV1dXV0dHRzdHR0dHR0dHV1dXV1dXV0dHV1dHR1dXV1dXV1dXV1dXR0dHV1dXV1dXV0dHV0dHV1dXV1dXV1dXV1dXV1dXV1dXV0dHNzc3Nzc3N0dHNzc3Nzc3R0dHR0dHWKjoyMiYaGhIeFgoGBgYGBgYGBgoKBgYGAgYGCgYKBgYGBgYKBgYCAf3hzc3Nzc3JycnJyc3NzdnZ3d2liaGhnamtpaGZkZGVmaWhwdXR0dHRzc3JxcnJ0dXV0dHR0dHR0c3NycXFxcXNzdHR0dHR0dHR0dHV0cnJyc3R0dHR0dXV1dXV1dXR0dXR0dHR0dHR0dHR0dHR0c3Nzc3Nzc3Nzc3Nzc3N0dHN0dHR0dHR0dYuOjImGhYWFh4SCgYGBgYGBgYGBgoKCgYGAgIKCgoGBgYGBgYGBgIB/eXNzc3NycXJycnJzc3N3d3d3bGpoZGhpa3Z6a2VmZWhnbXJzdHN0c3JwcHBxcnN0dXR0c3NycnNycXBvb29vcHFzc3NycnJyc3R0dHNxcHFyc3R0dHR0dHRzc3Rzc3NzdHR0dHRzdHR0dHR0dHRzdHR0c3NycnFxcnJzc3Nyc3NzdHR0dHN2jZCMh4eFhYSEgoGCgoGBgYGBgYGCgoKBgYGAgYGCgoGBgoKBgYGAf395c3NycnFxcnJycnNzc3d3d3dzc2pnaWloeX99cW51bG5wcXJycnFxcG9wcXFxc3Rzc3NycXFwcG9ubm1ubW5ubnBxcnJycnJycnJzcXBvb3BxcnJzc3JxcnJycnJycnJycnJzc3Jzc3Nzc3Nzc3Nzc3Jxb29ubm9vcXJzc3Jyc3NycnNzcnaPj4uHhoWFhYOCgoKBgYGBgYGBgYGBgoGBgYGCgoKBgoGCgYGCgX9/f3hxcHBwcXFycnJyc3Nzd3d2dnd2cnF0c252f352c3hwcHBycnJycXFwcHFxcXFyc3Nzc3FwcXBvb25ubm5ub25vcHBxcXFxcXBwcXJwb25vcHFxcXFxcHBxcXFxcXJycnJycnJycnFxcnFxcnJycnFwb29ubm1ubW5vcXJycnJycnJyc3JxeI+OjYaDg4aEgoOCgoGCgYGBgYKBgYGCgYGBgYKCgoKCgoKBgYKBf4B/d29wb3BxcnJyc3Nzc3J2dnZ2dnZ3dnZ1c3l/fnd3d29wcXFxcXFxcHBwcXJxcnJzc3JycXBwb29wb29vb29vb29wb3Bvb29vcHBxb29vcHBwcHBvcG9wcHFycXFxcnJycnFxcXFxcXFxcHBwcHBxb29ubm5tbW5tbm9wcXFxcXFxcXFxcXB7j42NhoODhYOCgoKCgYKBgYGBgoGCgYGCgoGCg4KBg4KBgYGAgYF/f392bm9wcHBxcXFxcXBwcHZ2dnZ2dXR0c3NxfYB9fX9zb3BxcXFwcHBwcXFwcHBxcnJxcXFwb3Bvb3Bwb29wcG9vb29vb29vb3BxcXBub3Bwb29wb29wcnJycnFxcXBxcnFwcXFxcHBwcHBwcHBwb29ubm1ubm5ubm9ub3BwcHFxcXFxcXFxcIKRjoqEhIOFhIOCgoGBgoKBgYKBgYGBgYGCgoKCgoKCgYGBgYCBgX9/gHVvb29wcXFxcXBwcHBwdnZ2dXRzcnJycnGAgoCBeXBwcHBvcHBwcHFxcXFwcXFxcXFxcG9vcHBwcHBwb3BxcHBvb29wb29vcXFwcG9wcG9vb25vcHFxcHBwb3Bvb3BwcHBwcHBwcHBvb29vb29vbm5tbW1ubm5ub25vb3BvcHBwcHBwcHBwiZCMiISDhIaDg4KCgYGCgoKCgYGBgYCAgYGBgoKBgYGBgYGBgIGBgH+AdG5vb3BxcXFwcG9vcG92dnVzcnFxcXFxcICDg39ycHBwcHBwcHBwcHFxcHBxcXFxcXBwcHBwcHBwcHFwcHBwcHBwcHBvcHBxcXBwcHFxb29vbm9wcHBvb29vcHBvb3BwcHBwcHBwcHBvb29vbm5ubm5ubW5ubm1ubm9wcG9vb29vb3BzcXWPj4uJg4KFh4ODgoKBgoGCgoKBgYKBgYGBgYGBgYGBgYCAgYGAgYGAf4B0b29vbm9vb29vb29vb3Z1dHNxcXFxcXJygIKCgXRxcXFxcXFxcXFxcXFxcXFxcXBxcXFxcHFwcXBxcXFwcHBwcHFxcXBxcHBwcXBwcHBwcHBwcHBwcHBwcHFxcXBxcHBwcHFwcHFxcHFxcXFxcXJxcnFwcnRycnR0dHR1dnRzdHR0dXd3gpCPi4iDgoaHhISCg4GBgYKCgoGBgoGBgYKBgYGBgYGAgICBgYCBgYB/gHVvb29vb29vb25vb29vdXRzcnJycnJycnKDg4OCdnFycnFxcXJxcnJxcXJycnFxcXFxcnFxcXJycXFycXFxcXFxcXFxcXFwcXFxcXFxcnNzcnJyc3V1dHR0dHR0dHV2d3d3d3d3eHh4eHd3eHh4d3Z3dnV2dnZ2d3h6e3x7e3t6enp6enyGkI2LiIODiIeHhYODgoGCgYKBgYGBgYKCgoGBgYGAgYCAgYGAgIGBgH+Ad3FxcXFxcG5ucG9wcG92dHV1c3Nzc3NzdYiDgoN5cnNzcnJyc3Jyc3NycnJycnN0cnJzcnNzc3Nzc3Nyc3N0dHV1dXV1dHV3eHd3d3d4eHh3eHh4eXl5eXl4eHl5eXp6e3t7e3t6enp5eXh3d3d1dnV2dnd5enp7fn5+fX1+fn5/f35+gIyQi4qHg4WIi4iEg4SDgYGCgYGBgoGBgoKCgoKAgYGBgYCBgYGAgIGAf4B8enp5eXx5eHh2dXZ2dHl2d3h3d3Z3dnZ6f3x+fnx2dnd3dnV4enh4eHh3d3d2eHx5eXx6eXl8e3l5eXh4eXl6enl5eXh4enp5eXh4eHh3dnd3eHh3eHh5eXp7e3p8fH1+fX9/f359e3t7e3p5enl5e3t/foB/fn5/fn19fX5+f35+fn6AjpCNioeEhoqLiIaGhIOBgoKBgYGCgYGCgoKCgoCBgoKBgYGCgYCBgIF/f4B/fn19fX9/f318e3t7eXh4eHh5eXl4eXh5eXl4enp6enp6e3t7fH1+fHt7ent8e318e3t7e3t7e3l4eXh4ent6enp5eXp8fHt6enx8fHp6ent9fHx+fn+AgoGAgYKAgH9/gYGBgIB/f35+fn5/fX1+f4CAf35+f39+fn9/f39/gH+Af4OQjoyHhoWIi4yIh4aFg4GCgYGBgYKBgoKCgoKBgYKDgoGBgYGBgIGBgIB/goOCgoGBgX99f39/f4F6enh4d3h4eHh5eHh5enp5e358enx9fXt8fX19fHx7fnx9fn5+fn59fX9/f3x8fYCDgYCAf318fXx9fXt9fXx8fH19fX1+gYGChISDgoB/gYGBgH9/f4B/f39/f39+fn9/f39/f35+f3+Af39/gICAf4CAgICAhJCPi4eGhoiLi4mKhYaDgoKCgYGBgoGCgYKBgYGBgoOCgYCAgYGAgIGBgH+ChIKCgICAgH9+fn+AgH9/fn18fX19fYB/fX+Af35/gH9/fn9/gIGBgIB/fn+BgICAf4CBgX9+f4CBf35+f39+f39/fn5+f39/gYB/f4CBgYCAgYOEgoGCgoGCgH+AgYCBgYGAgH+BgICAf39/gICAgYGBgIGBgYCAgICBgoGBgYCAgYGFjo6MiYaHiYyLi4qGhoOCgoKBgYGCgoOCgoKBgIGBgYKCgICBgYCAgYGAf4KFg4KBgYCAf39+fn+AfX5+fn19fX5/fn9/f35+fn+AgYCAgICAfn9/fn6Af3+AgH9/f35/f35+fn59fn9/fn9/f35/gIGBgoKDg4KCg4KBgYKDg4OCgYGBgYKBgoKCgYKBgoGBgYGBgoKCgYGCgYKCgoGBgoKBgYKCgoKCgYGBgoKCgoaPkY+KiImKjY6NiYaFgoKCgoKBgYKCg4KCgoGBgYGBgYF/gIGBgYCBgIF/gYWEg4KCgoGCgYCAgIB8fHx7fH18fH9+fn9+fn5+f35+f39/f39/f35+foB+fn9+fn9/f39+f39+fn5/gIB/gIF/f39/f3+BgYGCgoCAgYKDg4SDg4ODgoKCgoKCgoKCgoKCgoGCgoKDg4OCg4ODgoKCgYKCgoODg4ODgoKCgoODg4KCh5KTkIuKi4uPj42Kh4SCgoKCgYGBgoKDgoKBgYGBgIGBgICAgYGBgIGAgYCAg4SDg4OEg4ODgoKCgXx9fHx9gn1+f4GCiIGCgoSCgYGDg4GBgYKDgYKBgYCAf39/gICAf3+AgX9/f3+AgYCAgICAgH9/f3+AgICAgH9/gYODhYSEg4SDgoKCg4OCgoOCgoODg4ODg4SDg4KEhYWDg4SEgoKDhIOCg4ODg4OCgoODgoCKlJOPioqMjpCPjYuGg4KCgoKBgYGBgoOCgYGBgIGBgoGBgICBgYGAgYCAgH+BgoODg4SEhIOCgoKCfXx8fn6AgYOAg4OChIaFhoaFhIWFg4ODg4SBgYKEhIKCgoeDg4KAgoGBgoKCg4KDg4KDg4ODgoGAgIKCgYOCgYKCg4OEhYWEg4OChISEhIOEhISDg4OEg4ODg4OEg4SDhIWEhISDg4ODgoKCgoKCgoKBgYKCgo+UlI+Njo6RkY6KiISCgoKCgYGBgYGCg4GBgIGBgYGBgYCBgIGBgYCBgICAgIKChIKChIOCg4ODgoJ9fX2AgH+AgoGDg4ODhIaEhIOEhYWDg4GBg4OBgIGDgYKFhYWFhoaHhoWGhoeIh4eGhoeHhoaEgoGCg4SDg4ODg4ODhISFhYWDhYSFhISEg4KBg4OCg4SEg4KCg4SCg4ODg4OCgoKCgoKCg4OEhIOFhYWFhoaIk5OTkI+Pj5KRjIqIgoKCgoKBgYGBgYKDgoKBgIGBgYGBgICAgYGBgICAgICAhISEgoKCgoGBgoKBgX+AgYOCgICAf4CCgoGDg4KCgYODg4SDg4KDhYSCgYGBgoSFh4eHh4aGh4eHiIiHh4eIiIiFhIOBgIGBgoKCg4GCg4SEhYSDg4OEg4OEhIOBgYGCg4OEhISDg4ODg4OEhIODgoSDg4ODhIWFhoeHh4eIiIiJiY6TkpKOj46Rko+LiYeCgoKCgoKBgYGBgoKCgoGBgIGBgYGAgICAgYGAgIGAgICDg4KCgYKCgYGAf4CBhYWFhoOCgYB+fn+BgoSCgYKDhIOCg4ODg4KChIODg4OCg4SFhISFhYSDg4SFhYKEhIWFg4KBgH9/gIB/gIGEg4OEhYWEgoKCgoOCg4OFhIKDhISEhYaGhoaGhoWFhoeHhYaIh4aHiIeGhoaIiYeGhYaGhoeIkZKSj46QjpCRjImHhYGBgoKCgoGBgYGBgoOBgYGBgYGBgICAgICBgYCAgICAgISEg4KBgoGAgYGAgYKIh4aHhYSCgH99fX6AgH+AgYGBgYGBgoGAgYKHgoGCgoKBgYGCgYKCg4GBgICAfoGAgICAgH9+gIGBgYKCg4OEg4OEg4OCgoGBgoODg4SEg4SEhIOFhYaFh4eIh4eHh4eHh4eGhoaGh4WFhYaGhISEhIWEhYaSk5GOjo+OkI6JiIeEgoKCgoKCgoGBgIGCgoKCgoKCgYGBgYGAgYGBgICAgYGAgoSDg4KDgoGCgYKDg4iHh4iHhYSCgX5+gICAfn5/f4CBgYGCgoGBhpqIgH+AgIB/gIKBgIGCg4OAf39/gICAgICAgICDg4KDg4ODgoOBgYKCgoOCgYKCgoOCgoSDhISDg4SEhYWFhYaGhoaFhISEhYWEhIWFhYSEhISDhISEhISEipSTkpCQj46NiIaFhIOBgYKCgoKCgYGAgYKCgoKBgoKBgYCBgYCBgYGAgICAgYGAg4OCgoOCgoKBgoOCiImJiYiHhYSDgYKEhIOBgoKBg4SCgoKBgYWOnYyDgoSCgX+AgoGCgoGChIOBgYCBgoOCgoGDg4SDg4SEg4OCg4KDg4ODg4KCgoKCgoGDhISEhYSFhYWFhIWEhIWFhYWDg4OEhISEhYWFhISEhISEg4ODg4OOlZKQkZGOjYyHhYODg4GBgoKCgoKBgYCBgoOCgYCCgYGBgICAgIGBgYCAgICBgICDhYSEhIODg4SDhIOGh4mIhoWDhIODg4WDgYCDgoaFhIOBfn18gJOdjYOFhIOHhYGAgYKDgoKEg4OCgYGBhIWEg4ODgoKDhISDg4ODg4SFhISDg4KCgoKCgoSEhYSFhYWFhYODhYWFhYaFhoWEhIWEhYWGhYWFhIWEhISDhIODhJGUk5KSj4yMioWEhIODgYGCg4KCgoKBgYGCg4KBgYKBgYGBgICBgIGBgH+AgIGAgYaGhoaGhoaHh4aGhYSDhYaCgIGBgYGHgoB+f4CFlIuFfnx9fX57jZ+LgYKBgYuLf4aEgoKCgYKDg4GCgYKDhYODg4KDg4OEgoKEhIOEhIWEg4OCgoKCgYKCg4ODg4SFhYWFhIOEhYWGhYWEhISEhIOEhIWFhYWFhIODhIOEg4KGlJSSlJKPjYyIhISEg4KBgoODgoKDg4GBgoKBgoKCgYGCgYGBgYCAgYGAgICAgICAhYWFhYaGh4aGhoWGg4ODg4GAgoKCgYKAf35/foael4d9f4B+i4WAkYSBg4F/j5KBk4uAgYKBgYKBgYKDgoODgoOCgoKCg4OBg4SDg4ODg4OEhIKCgoKDgoKDg4ODhIWEhISEg4OEhIODg4OEhIODg4ODg4SDg4ODg4KDg4KDgouUk5KTko2NioeDg4OEgYGCg4ODg4ODgoGBgoGCgoKCgoKBgYGBgICBgYCAf4CAgICDhISFhYSFhYWEhIWCg4KDgoKDg4OBgICAgICAhJygiIGMgn2GhX2ChIOEgoGUmIKJiICCgoODgoKDg4ODgoODhIKCgoODgoKDg4KCg4KDg4WEg4ODg4SDg4SEhISEhYWEhIWEg4SEg4OEhISEhISEg4SEhYSDg4SEhIODgoKDkJSSkpKPi4yIhoOFg4OBgYKDg4ODg4OCgYGCgoKCgoKDgoCBgoGAgICAgIB/gICAgISDhYWEhYWFhYSFhYOEhIWDg4SEhIKCgoOCgoSBlJ+FhIiEh4GAfn6FhYWEhY6FfX19f4KEg4ODg4OEg4ODhISEg4OEhISEg4SEhIOEg4OFhoWFhYSFhYWFhYSFhoWGhoWFhYWFhYWFhYWGhoWGhoaFhoaGh4aFhYWFg4SEhIeTk5OSkoyKiIWFhYWCgoGBgoODg4OCg4KBgYKDg4ODgoKBgIGAgICAgICAgH+AgICAhYWFhYWGh4eGhYWFhISFhYSEhISEg4ODg4OEhYOIkIGCgYKFf39+fYKHhoOAfn5/f39/f4OEg4OEhISEhISEhISEhISFhYWEhYSGhYWGhYaGhoWGhYWHhYWGhYaGhoaFhIWFhYWFhIWGhoaHhoaGhoaHh4iIiIaFhYaEhYWGjZSTkpGQi4qHhoeGhIGCgYKDg4ODg4KDgoGBgoODg4KAgYGBgICAgICAgICAf4CAgICHh4eGhoeHiIeHhoaEg4ODhIODg4OEg4ODg4OEhIODgoCAgImEf359f4WBf3+AgH9/f36AgISFhIWGhoaFhYWFhoaHhoaFhoWFhoeHh4iHh4eGhoaHh4eGhoaGhoaGhYSDhIWFhYSFhYaGhoeHhoaGhoeHh4eIiIeGhoaHh4eRk5KRkZCLiIiFhoSDgoKBgoODg4ODgoKDgoKCgoOCgYCBgICBgICAgIGAgIB/gICAf4aHiIeHh4eIiYmIiIODgoKDgoSEhIWEg4KCg4SEhIOBgICDjYaDgH5+gH9/f4CAgIB/f4B/f4WFhoiIiIeHh4eIh4iHiIiIhoaHiIiJiYmIh4aHh4eJiIaHhoeHhoaFhIOEhYaFhYWFhoaGh4eFhoeGh4aGh4eHh4eHh4eFh5OTkY+RkIuHhoWGhIKCgYGCg4ODg4ODgoKCgoGCg4KCgIGBgYCAgICAgICAf3+AgYB/hoiIiIiHh4iJiYmIg4KCg4ODhIWHh4aFg4OFhISEg4CAgYWEgoOCgYGCgYGBgX9/gH9/fnt6gYuMiYqKiYmIiImJiYmKi4qIiIiJiYuLioqIiIeIiIiHh4iIh4iGh4aEg4OFh4eHhoWFhISDhYWEhYWGhISEhYWFhoWGhYOJlJOQj5COioaFhoWDgYGBgoKDg4ODgoKCgoKCgoKCgYGBgYGBgYCAgICAgIB/gICBgH+GiYiIiYeIiImJiIiEgoKDg4KDhImKh4aEhIWEg4OCgIGEhYSCgoKCgoKCgH9+fX19fX9+fHp8j4yJi4uKioqIiIqJiImLiomJiImIioqJi4mHhoaGh4WGiIiJiIeGh4SDgoSIiIiIh4WCgoGDg4KDg4SCgoKDgoGEg4SDgY6TkpCPj4uIhYSGhIKBgYGBgoODg4OCgoKCgoKCgoGBgYGBgIGAgICAgICAgH+AgIGAf4WIh4eHhoeIiIiHh4SCg4OCgoOFiYqJh4WHhYSFhYODhYSDhIOCgoKDgX59fn5+fn5+fX1+fX1+g4eJioqHh4WGh4eHh4iHh4mGiIaIh4aJiYODhIOFhISFhYaIh4aFg4KCg4WHhoeGhoOCgoOEgoODhIKBgoGBgYODhIODkZKRjo+Oi4eEhoaEgoGAgYGDg4ODg4KCgoKCgoKCgYGBgIGBgYCAgIB/gIGAf39/gIB/hYaGhYaGhoeHiIeGgYKEhIOChYeIi4qGhIaEgoaFgIGEg4ODg4OCgoF9fH1/gH9+fn59fH19fHl8g4aGh4SDgYODhIWFhYODhYSEhISEhIWEgoKDgYSEgYKDg4WGhYSCgYGCgoODhYOEhIWEhIaDhISFg4KDgYKDg4SFhIeSkY+Nj4yJhoSFhIWCgYCBgYODg4ODgoKCgoKCgoKBgYGBgYGAgICAf4CAgYB/gICAgICDhIWEhYWFh4eHh4aAgYGFg4OEhYSHiIWCgIB/gX9/goODg4ODgoJ/fX1/gICBf31+fn19fX17enp+hISEgoGBgIGBgoKBf36BgYGCgYOAgoGCgoKBg4SAf4CAgYOCgICAgICBgYGCgYGChIODhYSCg4SDgoKBgoSDhYWGi5ORjo+Pi4iFhYOChIGBgYGBgoODg4KCgoKCgoKCgoGBgYCBgYCBgH9/gIGBgICAgH+AgIKCg4OChIOEhYWGhn+BfoCBgICAgIGDgn9+fn5+foCDg4OCg4KDgn19fn+AgIGAfn19fX1+fXx6enp/goKBf39/f35/f4B+fYB/foCAgX+AgIF/f4CAgX59fX+AgX9/foCAgH+AgICAf4CCgICCgYGCgYGAgYGBgYKEg4aPkpCOj42Kh4eGg4ODgYGBgYGCg4ODgoKCgoKCgoOCgYGCgYGBgICAgH+AgICAgICAf39/gYKDhIGCgoOCg4SFgIB/fH19fn19foCAf31/fn1+gIODg4KCgYF/fX1+f4CAgH9+fX19fHt7e3p6eXqAgIB+f35+fn1+f35/gH9+f3+Af4GAf359fn9/fn18fn+Af35+f3+Af39/f4B/f4B+f4CBf4B+f39/gH9+f4B/hZKSj46Pi4uHiYWEhIKCgYGBgYKDg4ODg4OCgoKDg4KAgYKBgYGAgICAf3+AgIB/gIF/f36BgYSEgYKBg4OCg4OBgH98fn9/fX6Af4B/foF/f4CBhIOCgYB/f359fn5/gICAfn19fX17e3x6enl5eXuAgH9/f39+fn5/foCAf35/f4CAgoB/fH5+f35+fXx/f4B/fn9/f4B/f35/foCAf36Af39+fn5/f35+fn18fH2Fk5KOjIuKiImIhISEgoKCgYGBgoOCgoODgoODg4ODgYCBgYGBgYCAf39/f4CAgICAgIB/foCBhIOCgYGDhISDhICBgICBgIGAgYKCgoGBgoCBg4ODgYGBgYCAfX19fn5+f359fX19fXx8fHt6eXl5eX2BgICAgYF/f4B/f4F/gICAgYGCgoB+gH5/fn5+foGAgYF/f39/gIB/f39/gYB+f4CAfn9/fn+Af31+fX17fIaTkYyLioeHioiGhoSDgoGBgYGCg4ODg4OCg4OCgoKBgICBgYGAgH9/f39/gICAgICAgH9+fn+BgYGAgISGh4aHgoSDhYOBg4ODhYSEhISEg4ODhIKCgoKCgX5+fX19fn6AfX19fX19fX19e3p6eXl5eYCCgoKEg4CCg4F/gYCBgYGDgoODgYGCgIGAf4CBg4GEgoCAgYCBgYCAgYCCgn+BgIF/gIB/gICAfn9/fnx8ipOQiomIiIiJiIaGhoSCgoGBgoKDg4ODg4KDg4KCgYCAgICBgYGAf39/f4CAgICAgIGBf359fn5/f39+g4aHh4iChYSFg4SFhIWGhYaGhoWGhYGBg4ODgoKAfX19fX19fn59fX19fX19fX18e3l5eXl4fIKDhIWCgYSDgoKDhYaCg4SDgYKCg4OCgoKCgYKFg4iFgoGBgYKDgYGBgYSDgoOCgoKCgYGBgIF/gIGAf36Ok4yHiIaIh4aGhYaGhIKDgoGCgoODg4ODg4OCgYGBgH+AgYCBgYB/gH9/gICAgH+AgYB/fn19fX5+f36Ag4SHiISGhoaFhoaHh4aHh4iHh4eGf32BgIGCgX59fX19fX19fX19fX18fH5+fnx7eXh3eHl5gIODf4ONhIOEhISXl4ODhIF9foGCgoGCgYKBg4aIjIWDgoKBhIKEg4KDhYSEhYOCg4OCg4OCgoKCg4OCgpKQi4iJh4mHhoaEhoWEhISCgYKCg4ODg4ODgoGBgYCAgICBgIGBgH9/fn+AgYCAf4CAgH9/fn1+fn+Bf4CCgYWFhYeGh4eGh4eIhoaHh4eGh4V+fX18fX9+fX19fX19fX19fX19fXx7iJKCe3x6fIZ5eHl8gYF+iZaEg4OEhJSTgIGBf39/fn6Fi4B/gICEhpCJhYSCgoGFhYuDgYKFhYaGhIOFhYOFhIODhIOFhISIko6MiYiIiYeHh4WGhYSFhIKBgoKDg4ODg4OCgYGBgYB/gIGAgICAf39/f4CAgICAgYGBf39/f4CAgIGBgYGBg4OGh4aGh4aGiIeGhoaFhIOFhH59fHx8fX18fH19fX19fX19fX18fH+RlZaDe3qElHx4eXp7fICCg4GBgIOCgH58fn57iJF8fI6Wf31/f4KGioWDg4SDgYONiX9+f4OEhYWDhYaFhIWFg4SFhYaEhI6Rj4yKioyJiImHhYWFg4ODgYGCgoKDhIODgoGBgICBgICAgYGAgIB/f3+AgIB/gICAgX5+f4GBgoKCgoODgoOCgoWGhISFhYSGhIOEg4KBgIKAfn19fHx9fXx8fH18fH18fX19fHx8e4uRl4x6e3yBenp6e3x5eX19foB/gH98e3t+fn2ClZF/hIh+fH5/goR8fIGChIKAf4eDfYKBf4KCgIODhISEhISChIOEhYGEkZGOi4yMjoqJiYWFhYODgoKBgoODgoKDg4KCgYGAgIGAgICAgICAgH+Af3+Af357gICBenyAgYKDhYODhYWFhYODg4SCgYKDgoOCgoGBgIB/gX5+fX59fHx8fHx8fHx8fHx8fHx9fHx8fn6Kgnt6e3p4ent7fH17fn1+f319fX18fH+BgX2Gj4F+fYJ+fn6Agnx8f3+CgIKAfnx7ioJ9gH9+gYCAgIKBgoCAgYGAf4uUj4yLjY6NiIeHhYWEhIOCgoKCg4OCgoODgYGBgICAgICAgH9+fXx7fHx9f3+AgHx6gYF4e4CCgYOFhIOFhIaHhISAhpSIgIKBgYGBgH9/f39/fn5+gHx8fHx8fHx8fHx8fHx9fHx8fHx8fHl7e3t4eHl7enp8gX+Afn+BfH5+f399gIKCgICAgX+CkYF/f4CAfoB+fn9+gIGBfX19e319fXx9fHx9gH+AgH6Afn6ClJGMjI2OjoqFhoaFhISFg4OCgoODg4OCgoGBgYGAgICBgICAf4CAf39/fXt6fICAgHh+gXd7gIF/gYKCgoKEhoeGhn6IlYp+gYGAf4B/foB+f39/fn+Bfnx7e3x8fHx8fHx8fH59fHt9fHx8e3x8fHp6eXt8en2Fg4J/gYF+f35/gH6FgoF+gH9+foCFhoKAfn6Dhn9+fH6AgIGAf39+fX19fX57fH1/f3+AfX9+gIyRjYyNjo2Nh4SGhoWEhISDg4OCg4ODg4KBgYGBgYCAgYGAgYGBgYGAgH9/f397en9/e3mAd3p/f31/f3+Af4KDhoaFf3+FgX5/gIB/gH5+f31/gIB/f4B/f319fHx9fn18fH19fX19fH58fXx7fXx8ent6fH18f4aEgoCAgX1+fX5/fouEgYZ+fXx8f36CgX99fX19gHx7fXx+gYSDgYB+fn5+fX1/f399foB+fn6Eko2MjI+Ni4qGhIaEhIODg4OCgoKDgoOCgYGBgYGAgYGBgYB/fXx8fH1+f39/f397e399d352eH59fH18fX5+gYGCg4B6fX18fn+Af36Af35/fn+AgH+AgH9/fn9+fn5+fn1+fn99fH59fn19fHt8fHx6e3p9fn+Ag4OCf35/fH18fXx8gYN+jH58e3t9fn1+fn17e3t9fHp7e3uAhoWChIOCf4B+f4KCgn9/goJ/gIqPjIyLjYyLiISEhIODg4ODgoKCgoKCgoKBgYGAgoGBgYKCf3+AgIB/fn18fH5/fn55fX52e3Z4fXx8fHt9fX6BgICAf31/f31+f39/foB/f39+f3+Af4GBgH99gH9/fn9+fn5/f3yCfn59fX16fH19fHp8fH6AgoGAgIB8fH18fHx8fH18fnt/fnt7e3x8fH18e3t7e3x8enp9en6CfoGDhIKBgoGFhoWFhoaHhYGEkY6Mi4qLh4eFgoOEhISEg4KCgYGCgoKBgoGBgYGBgoGBgoKAgYKBgYCAgH9+e3x+fnx6fnh5dnd8fHx7e318f4GAf35/foB/f35/f35/gH9/f3+Af3+AgYKAfn6BgIB/f39/f39+fYN8fH19fH99fX19e3x+fn9/fn5+fnx8fHx8fHt+fnt8e3x8fHx9fH18fnx9fHt7e3x5e3x7e316fX5+f4CAg4eJiYmKiYqJhYiRjYuIiYeFhYOCgoOEhIOCgoKBgYKBgYKBgYGBgYKCgoGCgoCAgX98e3p6eXt9enx+fnl8eXh4dHx8fHt8fHx+gH9/f39/gIB/fn5+fX+AgH9/f3+Af4CDgoB/gIGAgIB/f4CAgH58enx9fX59fX5+jIZ9fX57e4OCfX19fX18fX19fX1+fH18fXx9fX58fn19fX18e3t6fHt8fHt6e3t6enp7fn6ChYiHiIqLi4uJjZGOjYmIhoWEgoKCgoODg4OBgYGBgYGBgYGBgYGCgoOCgYKBgIGBf3+Af356eHl5en5+e3l6eH5zfHx8e3x8fH5+fn5/gH+AgIB/fn9+gIF/f4B/gIGAgoSEgYCAgYGAgX+AgYKBf39+f31+gH57foGSjHx9f4qAjYx+fn19fX59fX59fHx8fX18fXx9fX1+fX1+fnx7e3t8fH18e3p7fHl6eXh5e35/hIOEh4mKiImOkI2LiIiFhISCgYKCgoKCgoGCgoKBgYGCgYKCgoGCgoKBgoKAgYGAfoCAf39+e3p5e319eHx6f3KBfXt7fHx8fn59fYGCf4GBgX9/gH+AgX9/gIGCgYGFg4SCgYGCgYKCgICBg4KAf4F/fX6Afnx/f4mCf36DkISEg4F/fn18jYd9fX59fHx/fnx9fXx9fX5+fX5/fX19e3x9fnx8e3x9enp5eXl5e3t+foCBg4eEiI6NioqGhYSEg4KBgoKCgoGBgYGCgoKBgoKCgoKCgoKCgoGCgn+AgIB+f39/fn5/ent5fX16enp9cX6Cent9fX19fXp4f4KAgYKCgICBgIGBgICBgoKCgoaFhIKBgYGBg4F/gIKEgX9+gYB9foF+fX5/gIB9fn+EgH5+f31+fX2KhX1+f31+foB/fX18fH5+fn99f4B9fn18fX9/fHx7fH17e3t6enp7e3x9fn2Ag4CJjYqLh4WFhYSDg4KCgoKCgYGBgoKBgoKCgoKCgoGBgoKBgYGCf4CAgH9/f39+fn59eXp6fXx5d3t0e4d8dHd9fn17e3Z2fYCBg4KBgYKCgoKBgYGDg4OChYaEg4CAgICCgX+AgYSBfn6Af35+gH59fn6AgH+Bfn+Af39/f398f39/f3+Afn9/gH58fX18fn5+foF/gH2CgHx9gIB9e319fXx8e3x8e3t7fHt8fHx9fIqKiIiFhYWFhISDgYKBg4KAgIGCg4KCgoOCgoKCgoGCgoGBgoJ/gIGAf39/fn5+fn57enp8fHt2e3R3f352cnt+fnt4dnd8gIGCgoKBgoODg4OCgoSDhIOFhoOCgX9/gIOAgICAg4F+foB/fX+AfX1+foCAf4J/gYGAgICBf31/f3+AgIGAgIB/fnx9fX19fn59g32AfoKAfX6AgX98fn59fX17fH58fXx8fHp8e3x9iYaGhYWHhYWFhIKBgoGDgYCAgoKDgoKCg4ODg4KBgYGBgYGCgH6AgYB/fn5+fn5+fn56e3p9goN9dXF6fHpxen59eXh0dICAgoKCg4KDhYOEg4KDhISEhIWEgYGAgH6Agn9+f36Bf35/f4B9foB9fX1+gH9/gYCCgYCAgIKBfn6Af4GAf4CAgH9+fX19fnx+fn19gYR/gH9+f4GBf31/f319fn1+fn1+fHt8enx7eoCHgoSEhYSEg4WDgoKBgYKBgICCgoOCgoOEg4SDg4KBgYKBgYOAfoCBf35+fn5+fX5+fnt7en6Jh354cnl9f3F6eHt4eXV1fYKDgoODg4OFhIWDg4OEhIODhIKBgH+Af4CBfn19foB+fn5/gH19f3x9fX6Af4CAgIKAgIGAgoGAf4B+gIF+gIGAgH9+fn5+fn5/fn6FhYGBgH+Ag4F/foGAf35/f4B/fn17ent6fHt6goR/g4KCgoOChIKBgYCAgoGAgIKBg4KBg4SDhIKEgoGBgoGCgn9+gIF/fn1+fn5+fX59fXp7fIWEe3tzeXp8cHd1dnd5dXR6hISBhISDhIWFhoSDg4WEgoODgoCBf39/f4B9fX1+gH1+f39/fn1+fH19foF/gIB/gIB/gIGDgoGAf36AgH+AgYCBgH9/f39/f4CAgIGCgoKBf4CDgX+Ag4J/f4B/gX+Af3x7e3p8e3yCgH+Cf3+BgIKCgYF/f3+BgH6BgoKDgYGDg4KEgoSCgYGBf4GCgH6AgH9/fX5+fX19fn19e3t6gH94fHZ5eXtxdHh3dnh1cnmFhYKEhIKEhYWGhISChIOBg4GAgIF+f4B/gHx9fX6AfX5/f39+fX98fn5+gX+Bf39+f4B/gIODg4B/f4GBgIKBgYGAgICAgICAgIGAgYKDgYF/gISBfYGDhICAgX+BgYKBfXp7e3x8fH9+f4B8f399fYGAgH59fYB/foKBgYKBgIKCgoKBg4KCgYB/gYKAfn9/fn99fX1+fX19fX19ent7fHZ9eXh5enJ1eXl2d3dzdYaFg4WFgoSEhYSEhIKDgoGDgX+AgX5/gH6AfX19fn9+f4B+fn99f3x/f3+BgIF/f3x+gH6AgYKDgYCAgoOEgoGAgYB/goCAgYGAgYGCg4KBgX+Ag4B+goKEgICCgYKChIJ+e3t8fHx8fX1+fXp+fX14fn9/fHx8fn5+gYCBgYCAgoGBgYGDgoGBf4CAgoB9fn19f319fX59fH19fX16e3p8dnx6d3t4cnZ5e3Z2dnN0hoSEhYSChISFg4OCgYOBgYOBgIGBfX+BfoF9fX1/f39/gH5+f359fYB/gIGBgX5+fH5/fn5/gYJ/gYGCg4eFgX9/fn6Af4CBgICAgIKCgYCAfoCCf36BgoKBgYOCg4OFgn99fX18e3x8eXp7en55e3l4f357e3t+fX1/f4F/gH6BgICAgoOCgYF/gIGBf31+fH1+fX19fX18fn58fXx5e3x4enx3endzeHd6c3Z2c3SGhISFg4KDhISDgoKCg4GCgoGAgYF9gIB+gH1+fX5/gICAf35/f3x+f3+BgIGAf359f39+fn+BgH2AgIGDg4N/f359fn5+f4CAgIB/gYKBgH9+gIF+f4CCgoCBg4KEhIaEgH59fHx8fHp5dnl5enl2eXZ+fHt7e359e399gH99fX9/f3+BgoGBgX5/gYF+fX18fX19fX19fXx+jYF8fXl7e3p5fHd4eHR1dXhyd3d0doaEhIWEg4ODg4OCgYKDgoGDgn+Bf35/fn+AfX19fX+AgIB/f39/fIB/f4GAgYCAf3yAf31+fn9/fX5+gYGCgn5/fn1+fn5+f3+Af32AgIB+fn1/gX5+gIKBf4KDgoOEh4SAgH58fXx8e3x1eXl4eHh5d3t8e3t7foV9fn1/ent+fn59foGAgIGAfX6BgH59fXx9fX19fX18e32Dgnx8ent7e3p7d3Z4dXJzdnB4eXJ4hYWFhYOEhIOChIKBgYKBgIKBgIF/fn5+foB+fX58foCAgH+AgX97gH6AgH+BgYB/fYB+fn5/f319fX6AgYKBfn9+fn59fX5/fn9+fH+Af35+fn+Dfn6AgIF/gYOCg4OGhICBfnx9fHx7fHh3e3h1eXd3eXx6e3t9kod9fH13en1+fn19f35+gH98foB/fn19fH19fX19fHt8ent9enp4e3x6ent4dHh1cXJ0cHh4cnmEhYWFg4SDgoODgoGBgoKAgYGAgIB9fn5/gH18fn1/gIGAf4CBgHyAf4B+f4GAf39+gX9+f39+fX18gICAgIB+f35+fn18fn9/f358fYB/fn1+gIJ/foCAf36ChIKCg4WFgoJ+fXx7e3x8eXd8eXd4d3d4e3t7e3yFin17end6fH19fHx9fX1/fnx9fn59fXx8fX5+fX18fHt6enx7e3p5enp7enhzd3VxcXJweHdxe4WGhIWDhYKBg4OBgYGBgoCBgICBgH5/fn9/fXx+fYCAgoGAgIGBfX6Af35/gX+Af3+BgH9/f31+fH1/gICAgH9/f35/fXx+f39/f319f39+fn6CgYF/gIB/foGDgoKEg4SCgn5+fHx6fHt7eXt6d3N2d3h5e3p7eXp/fnt7d3p8fXx8fH59fH19fH19fXx8fX19fX99fXx9e3l7fHx7enp6enp6eHN2dXBwcm93dnJ7hYaEhYOEgoGDgoKCgYGCgYKBgYGAf4B/f399fX9+f4CBgYJ/goF9foF+fn+Bf4B/gIJ/gIB+fH58f3+BgICAf4B/f4B+fX5+f4B/f39/gH9/f4J/gICAgIB/gYGAgISBgoKAf39+f3x9fn56fYV+dHx9enp6enx5eXp6hoV3eXx8fHx8fXx8fHx8fX19fHx9fX19fn19fX16eX18fH16enp6enp5c3V1b29xb3d0c3yFhoOEgoOCgYKBgoKCgYKBgoGBgYCAgICAgH59gH+Af4GCgn+BgX+AgX5/gYB/f4CAgn+Bf319f35/f4KAgICAgIB/gIB+fn1/gH9/gIB/f39/gH+AgICAgH+AgYCBgYGCgYCAf39/fn1/fnuBk416fH18e315e3p6eHmBgXh5e3x8fXx8fHx8fHx9fX18fH18fn1+fn59fHp8fHt8fXt5enp6eXlzdXVvb3Fwd3N0fYWGg4OCg4KAgYCCg4KAgYGCgYKBgYCAgIGAfn6Af4GAgYKCgIKCgICCfoCBgX9/gX+BgIF/fH6Af3+AgoCAgICAf3+AgH9+fX6Afn2AgIB/f3+AgICAgYCAf4CAgYCBgYKCgICAf39/fX5+fIGGiXx8fnt7fnl6e3p7jn53d3l7fHt9fHx8fHt9fH19fX18fXx+fn5/f358enx9e3x9e3l6e3p5eXN0dW5zcXB4cnV6hYaDg4KDgoCAgIKCgX+CgYKBgoGBgYKAgYF/fn9/gYGCgYKBg4OAgYJ/gYGBf4CAgIB/gX99f4F/gICBgICAf4B+gICAf359foB+fn+Af39/gH9/gICBf4CBgH+BgIGCgoKAgICAgIB9foB9gIOCe35+e3x9e3p8fHyHeXh4eXx8fH17fHx9fX18fH19fn19fX5+f3+Af317fH18fHx7enl7e3l5c3J1bnZycHhxdXaFhYOEg4KCgICBgoF/gIKCgoKDgYGDgoCCgYB/gICCgoKBg4KEhICBgX6BgoF/gICAgH+Cf36AgYCCgICAgIB/gH+AgIB/fn2Af39/f4CAgH+AgH+AgYF/gICAgIGAgYGBgYGAgYCAgH9/gH5/fX59fn57fXx9e3x8d3h1eHh5e3x8fXx8fHx8fX5/f39/fn19fn9/gIGAf3x9fHx9e3p7eXp8eHpzcnVud3FxenF2d4WFg4ODg4KBgYKDf3+CgYSDg4SBgYOAgoOBgYCAgIKDgoCCgoSDf4GAfoKDgICBgICAf4CAf4GBgIKAf4CCgH9/gICAgICAf4CAgH+AgICAgIB/f4CBgYCAgICAgYGAgoOCgoCCgYGCgYB/f4B/gId+fnx6fXx7fX94d3Z5eXp8fXx8fXt8fH19fn5/gIGAfn1+gICAgoGAfH59fX58d3t6ent5eXNxdW53cHV6cXZ5hYWCg4KDg4KDhIR/gIOBhoOEg4GChICEg4KCgICCgoSBgYKChIJ/gIB/gYOCgYCBgYCAf4GBgYGAg4F+gIOCf35/goGAgIB+gYCBf4CAgYGBgYCAgIKBgYKBgH+CgYGBgoOCgoOBg4OCgYCBgH+AhH19fXx/fXp9f3p5dnp4eXt7fH19e3x9fX19fn+AgYGAgH+AgICDg4B9f35+fn15eXt6enp5c3J1b3dxd3lzd3uFgoKDgoOEgoOEg4CAgoOGg4ODgoKEgYSDgYKAgIKBhIGCgoGCgX6BgICCgYKBgYOBgIGAgICBgoGEgH6Bg4F/f4CDgoCBfoCCg4KAgYGBg4KDgoGBg4KChIGAgYOBgYKEg4KEhIODhIODgYGBgYCCf4B/fYB8enx/e3t3fHl5eXt6fX59fHx8fH1+foCBgYCAgIGBgYSEgH2Af39/f357e3t6e3p0cHhyeXR2eHR3e4SCg4KDg4SChIODgYKChYaEgoODg4SBhISAg4CBg4KCgoKCgIKAf4GAgIKBgoGCgoKBgIGBgYOCgoOAfoGDgX9/gYSEgYN/goKBg4KCgoGEg4OEgYKEgoOCgoGCgoOBg4SDhISEhISFg4SCgYOCgoOBgYGAgH58fIB8fHh8eXp5enx9f3x7fHx9fX18fICAgICAgYGBgYKBfoGAgICAf3t7e3p6enVweHd5dnV8dXZ8gICDgoODg4OEhISAgoOGhYWDg4KDhIGEhYKCgYKDg4GCgoKAgYB+gYCBgYKDgoKCgoGAgYKCg4KCg4B/gYOBgICChIODgoGCgoGDgoKDg4ODg4SAgoSDg4OBgX+Bg4KDhYKEhISEhISDhISChIOEhIKBgoGBgHt+gX59eXx6enp9fHyBfXp8fH19fHp7fn5+gIB/gYGAgICAgIGBgIB/fX18fX18dnJ2eHh2dH92dX2Hh4OChIWDg4SFhICChYWEhIOCg4SEgIOFg4KCgoODgYOCgoCCgH2AgIGCg4KCgoKEgoGCgoOEgoKBgICBgoGAgYOFhIOCg4CCgoOCg4ODg4OEg4CCg4KEg4KCfoOBgoSEgoODhISEhIOEhIOEg4WEg4ODgoKAe4CBf3x8fXp6e32AfX9/fHx6fH59fH19fn5/f39/gICAgH9+foCBgICAfnx9fX5/fn18e3h2f3Z3f4SHg4KDhYODhIaEgYKFhoWEhIODhISBhIWFgoKDg4SCg4KDgoKBfoCAgoKDgoODg4SDgYKCg4OCg4GBgYGDgn+ChISDg4KEf4KEg4ODgoSDg4SCgIOEg4SDg4KCg4KChIOCg4OEhISEhIWEg4OEhYSFhIOBgoB9gYKAfXx8e3x8gH19foB+fn1/fnx8fH19fn5/fn+BgYGBgH99fX6BgYB+fn19fX59fX5+f3+AfH2AgYKCg4OGg4SDhoSBgoiHhYSDg4SEhYGFhYWDg4SDhIODgoOCg4F+gYGDg4SCg4OEhIOCg4KEg4ODgoKDgYOCf4KEg4ODgoOAgoWDg4ODhIODhIOBgoSEhYOCgoODg4GEg4GDg4SDg4SEhYSEhIWFhYWEg4ODf32BhIB9fXx8fHx/gX5/f39/fX99e3x9fX19fX5+f4CBgIGBgH59fH6Cf39+fn5+fX1/f39/gICAf4CEhIODhIWDhIOFf36CiouFhISDgoOFgYaGhoOEhISEhIODg4OEgn+BgYODhYSFhIWEg4KEhISFhIODgoSDhYKBhISFhYaEgoCDh4SDg4OFhIWFhIGEg4OHgoOCg4GCgYSDgoODhYODhIWEhYWHh4aHhYSEhYSBf4GDf35+fH5+fX+BgH9+fHx/f358enx9fX19fX5+fn9/gIGBf319fIB/gH5+fn5+f3+AgYGBgYKAgYWFhIOEhIKEg4aAgoWFiomEhISEhYWCh4aGhISEhIWEhISEg4SDgYKDg4OEhIaEhYSDg4SEg3yDhHuBhHd5g4F9hH5+cnWDgoF2foOEgH2BdYF5g39/f36EhIKDg4KBg4SDg4SFg4SFhoSFhn2EeXx+f4N7hYOBhIOAf319fn5+gYOBfXt/fX6Afn18fHx9fX19fH19f4B/gYJ/fX18f4GBgICAgH+BgYGCgYKDg4KChoSEhIWEgYOEhYOEhYOKiIWFhYOFhYSGhoaDhISFhYWEhYWEhIWCgoOEhYWFhoSFhIOEhYWCaICFanx7cXF8gXOGc3R0fYKDdXNxg4ZzcHVyc3SDdnt9dYF/goOBgnZ5hYCDgIR/hYSChYSCaHpyc3N8gHKBg3+Dg32BfX5+fX6Cg4J8f4F9f4B9fXx8fHx9fHx8fn1+gH+BgX99fX2AgYKBgYGBgIGBgYKBgoKCgoSHhIWEhYSBgoSGhoOFg4aIhoaFg4aGh4eGh4OFhYaFg4KFhoSFhYODg4SEhoaGhIaEg4SFhn1xe4FweXZ+g3+CbnlwdXN8dnl5hnKEg3B2eHF2dHR1cnN0dml/gG5yb3R2bnVsd217c26Ah3ptfXJzdnN2bW53bHB5bHV9f399foGAgX2Af32Af4B/fX18fHx9fH1+f32Af4CAfnx/foCBgoCBgICAgYCAgIKDgoKEhYiGhoCChYODhIeGg4WFhYaHh4SDhoeIiYaHhIWGiIeEg4WGhYWEhIOFhIKFhoaFhoWEhoWHdnB0e3BydX+HhYNtdW92b3x1coR5eYd4cXR3bndod3pucHaCcoN+b3p5eW1vbnpvb213fXiGcHF6cHJ0ZoF1fm57eXNveX+Af319gYB/e399fIB+gIB+foCAgYB+fn9/foF/gH9+fYB9f4CBgIB+fn+BgH9+goOCgoSFh4eEfoeEg4OFh4aEhoWFhoaIhISGh4iIhoeEhoaLioWEhoeHhYOFhYWEgoWFhIWGhYWGhYZxdXByc29zenl+hHSIdHV+iHZugnKEhnluanJ/cW1zd3x/dXR8hH54cXV3bnl1enF2eHV6eYRxam95eHBreXN6b3p3dnZwgYB/fn5/f356fn18f31/f359gIGDg4CCg4GBhIKBgIGBgH1/f4F+f35+f4GAfn6BgoCAgYSHhoODhoSEhIaHhoWFhYWHhoiFhYaFh4eFhoSGhomIhYSJi4iGhIaFhYWDhYWEhoaGhoaFg3iLeXKIentwcIWEeIV4eWtzfnl7a3KDh4N6fG16eXl0fYB2bm+AgG90fHV3cXl9fW1+dW+DhYZ6gHJye3x1cG96bHN8bneCgIF+fn99fXp9e3x9fX9/fn1/f4KCf4GDgYGDgYB/gICAfn9+f31/fn1/gH58fYGAfn6Ag4iFhoOFhYWFhoeFhYWFhYeHiIaEhoWHhoaFhIWFhIWFhomKh4WEhoWGhoWGhoSGhoaGhoWGh4eHhoaEhoWGh4iHhYeGhoOHhoWFg4SFhoWGhIaEg4SEhoSEgYODhISFhIWEhYSGg4aHhYaEhIWHhoSEhYaEhX13hYOEhIKBgX1/fnt8e357fHx9f359fH59gIB9f4F/f4GAfn5+gH5+f35+fX99fX5/fHt8f358fH+BiYaFhIaGhoWGhoWFhYWGhoeIhoSGhYaGhYWDhIWGhYSGhoaGhYSGhIWGhoaGhIeGh4eGhYeIiIiIhoSHhYaGiIaFiIeIhYeGhoiFhYaHhYaGhYOChYWGhYWDhYSEhIWEhYWEhYWDhoaGhoWEhoeGhISFhoOFhIKEg4OFg4OCfYB/e3t8fnt8fH1/fnx8fn2Af31/gH5+gH99fXyAfX5+fn5+f3x8fX57fHx/fHt7fn+Ih4SEiIaGhoeGhYWEhoaGhoiHhIWGh4aFhIODhIaFhIeFhoaFhYaEhYaGh4eFh4aJiIaGh4eIiYiFhYiFhoeGh4aHhoeFh4eGh4WFhoeFh4aFgoOFhoaEhIOEhIOEhoSFhYWFhYOGhoWGhYWGhoWEhIWFg4SHhYOCgoWDhIF+gIB8e31+e3x7fX59fHx+fX5+fX9+fX1+fnx9fH98fn58fYGAfHx8fXx8fH56e3t8foiHgoWIh4eGh4aGhISGhoeGiIaEhYSGhoSFh4OEhYSFh4SFhoaFhoSGhoeHhoaHh4mIhoaIh4iKiIWHiIWHh4WHhoeGh4WIiIeHhYaGh4WGhoSBhISFhoWFhISEg4SFhIaGhoWGhIaFhoaFhYaGhYSDhISDg4eDhIGChISDgYCAgHt7fn18fHx9fXx8fH19fH18fn18fX18fHx8fXx+fXt8gX99fH18fnx8fHp6fHx9iIeChoiHhoeGhoaDhYaFhoaGhYOFhIaFhIiJg4GEg4SGhIaGhoaGhIeHiIiHh4eIioiGh4iHiImIhYiHhYeGhoeHh4WHhoiIh4eFh4eHhYaHhIKEg4SGhYeFhISEhISFhoaGhoWFh4WFh4WGhYeFhIOEg4OEh4GDgIKDg4KCgn+Ae31+fXt8fH59fH19fH57fHx7fHx8fXt7e318e358e3x/fX18fX1+fXx6ent7fHyIh4KGhoaGh4aGhYOFhoWFhYWEg4WChoSDiId/enqChYaEhoaFh4aEh4eIiIiHhoiKh4aHh4eIiYeFiIeGiIeGhoeHhYeGiIiHhoWHhoiGhoeDg4SEg4aGh4WFhISEhYaGhoaGhYaHhoaIhoaEhoWDg4ODgoOGgYN+goKDgIOCf398f35+fHx9f318fX18fXt7e3p7fHx8e3t7fnt7fXt6e358fHx8fX5/fXt6fHp8fYmHg4aFhoWGhoWEhIWFhYWFhIOBhYGGhIKEhHyAhn+ChYWGhYWGhYSHh4iIiIaFiYqHhYeGh4eIh4WIhYaHiIaGh4eGh4aIiIeFhoeGh4WFh4OEhoWEhoaHhoWEg4WFhoaGhoaFhoaHhoeHhYOGhYOBg4KAg4WCg36BgYF/g4F/fn5/fX98fH1/fXt9fXx+enl6eXt8fXt7e3t+fHx8fHp7fXx8fHx+fYB8e3t7e3x7iYeEhoSGhIaGhYSFhoWEhIOEgoCDgYWDgYJ/eoSMe4CEhYeGhoaFhIeIh4aHhYWHiYeEh4WGhoiGhYeEhoeIhoaIh4eHhoeIhoSGhoaHhYWHg4SFhIaGhoeFhISDhYWGhoeGhoWGhoaFhoaEg4SFgoGCgYCDg4OCfYGBgH6DgX5/f4B8f3x9fX59e359fH15eXp5e319enp7e318fXx8ent9fHx9fH5+gHx7e3x+fXyIh4WGhYeEhoSFhYWFhYODgYOBgIKBhYJ/gH9/fXx7gYSFhoaEhYSDh4eGhoaFhIaJhoKGhIaGhoWFh4WHiImGhYiHiYeGhoeFhIaFhYeFhIeDhIWEiIaGh4WFhIKFhYaFhoaHhIaGhoaFhoODg4WAgIGAgIOBg4B8gYB+foKAfYB/gXx/fH1+fX57fn18fHl6enl6fX15enp7fHt8e3t6e319fH18f35+fHt7fX59fIiGhYaGhoSFhYSFhYSDgoKAgoGAgICDgX5+foB5en2Ag4OFh4WEg4OHhoOEhYSChYiFgoSDg4WFhYWHh4aIiIaFiIeJh4aFhoWDhoSFh4OEhoSEhYSHhoWGhYaEgoWFhoaGhoaEhYaGhYWFgoKDhH9+gICAgYCDgHuBf31+gn5+gH6Afn99fX59f3t/fXt6eXp6eXp8fXl6ent7enx6e3t7fH19fXyAfn18fH1/fnx7h4WFhoaGhoSFhIWDhYKBgICAgYB+f4KCfX1/f3t/f4KDg4WGhYSDg4aDgYOEgoCFh4WCg4GBg4SEhIaGh4iHhYWIhomHhYSEhIKFg4SGgoOFhISGhIeGhYWFhoOEhYSFhoWGhIOEhYWDhYWBgIODf35/gH9/gIN/fIB9fX+CfYCBfn6Bfn5+fX1/e398e3p5enp5enp8eXp6e3t7fHp7e3t7fX59fYB9fXx8fYB/fXyGg4aGhoaGg4SDhoKFgYGAf3+AgH5/gIJ8fn9/foCAgoKChIWDgoGChIGAg4KBgISFhYKBf4CCg4OEhYWHhoWEhoeFh4WGgoOCgoOCgoWBg4WEhYaEhoaHhoaFgoSEg4SGhYWDhIODhIOFhIB/goJ/fX5/fn5/hH57f3x8gIF9gYB9foN9fn59fX57fnt7enl7enl6ent5enp6e3t8ent8e3t+fn1/gXx9fHx9f4B+gIaEhYWEh4SDg4KGgoOAgYB+fn+AfX9/gnx9f39+fn+BgYKEg4KBgYKCf4CBgoCAgoWEgoB/gIGCgYOFhYeFhISGhoOFg4WBgoGBgoGCg4GChISEhYWGh4eGhYSDg4ODhIaFhIGDgoOChIODgH+AgX59fX5+fH6Dfnx+fHyBgH6Cf35/gnx/fn19fHx8e3t6enp6eXt6enp5eXp6e3x5e317fH5/f4GAfX59fX1/gICAhoSEhYSFgoSCgoSCgoCBgH59fn9+fn6AfX2Af35+foGBgoODgoSHgYF+gICBf3+ChIOBf35/gIJ/goWEhYOCg4WFgoSBg4CBgIGBgYKBgIGEg4OGhYWHh4WEhIWCgoKDhYSCgYGBgYCFg4F/foB/fnx9fn18foN9e358fYF/gIN9fYCBf35/fXx8fH17e3p6enl5e3l6enl6ent7e3p7fXx8f3+BgoB+gH+AgH+AgYDKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzNzc3Nzc3Nzc3NzczMzMvLy8vLy8vLy8vLy8vLzMvLy8vLy8vLy8vLy8vMzMzMzM3Nzc7Oz8/Pz9DQ0NHR0dLS0tLS0tLT09PT0tLS0tLS0tPT09TU1NTU09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tLS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1dXV1NTU1NTT09PT09PT09PT09TU09PU1NTU1NTU1NTU09PT09PS0tLS0tPT09TU1NTU1NPT09LS0tLS0tLR0dHR0dPHhnNlYFtLWWdVTUZIQD03Nzg5Nzw8PDo8Oz42Oj04PDs6OTg3ODs7Oj87PTs8PD47P0E/QkJBQ0RFREE+PTw7QENDQUBDQ0FBR0hHSUtSwtXS09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXVysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMy8vLy8vLy8vLy8vLzMzMy8vLy8vLy8vLy8vLzMzMzc3Nzc3Oz8/P0NDQ0NHR0tLS0tLS09PT09PT09PT09PS09PT09TU1NTU1NTU09PT09PT09PT09PT09PT1NTU1NTU1NTT09PT09LS0tLS0tLT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1NTU1NPT09PT09PT09PU1NPT09TU1NTU1NTU1NPT09PS0tLS0tPT09PU1NTU1NTU09PT09PS0tLS0tLR0dHSzIxyZ2BcTVllUktHSz87Mzc4Ozg5Pj05PDpBOjs9Nzs8PDo6Nzg6Oz0/Oz88PTw/Pj9BPUFBPkNDREJAQT46Oz9DREFDRERCQklHSEhJTr7V0tPT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1crKy8vKysrKysrKy8vLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzMzMzMzMy8vLy8vMzMzMzMzMzMzLy8zMzMzLy8vLzMzMzc3Nzc3Ozs/P0NDQ0NDR0dLS0tLS09PT09PT09PU09PT09PT09TU1NXV1dTU1NTT09PU1NPT09PT09PT1NTU1NTU1NTU1NPT09PS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1tbV1dXV1dTU1NTT09PT09PT09PU1NTU09TU1NTU1NTU1NTT09PT0tLS0tLT09PU1NTU1NTU1NTU09PT09PT0tLS0tHR0s+Sd2hfXk9XZ01LRks9ODc2NTk5OTw+OT88RDo7PDc5PD07OTc5Ojw9QDs+PT47PD48PT5BQD5EQ0NDP0E9Ojs9QkNFQ0NEQT9FSEpJSky61dPT09TU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8rKysvLy8vLy8vLy8zLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMzMzMzMzMzMzMzMzMzczMzMzMzMzMzMzMzMzMzc3Nzc3Ozs/Pz9DQ0NDQ0dHS0tPT09PT09PT09TU1NTT1NTU1NTU1NTV1dXU1NTU1NPU1NTU09PT09TU1NTU1dTU1NTV1dTU09PT09LS0tLS0tLS09PT09TU1dXV1dbW1dXV1dXV1tbW1tXV1dXV1NTU1NTT09PT09PT1NTU1NTU1NTU1NTU1NTU09PT09LS0tLT09PU1NTU1dXV1dTU1NTT09PT09PT0tLS0dHRmn5nYWJOVWpKSElLPzw6OTM3Njc3PTs+OT06Ojo4ODo7Ozg4Ojs7PD46PT09Ojw/PD0/QkA/Q0RDRD5APT08QENEQ0JEQkQ+REhJSUtMttfT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3MzMzMzMzMzMzMzMzNzc3NzczMzMzMzMzMzMzMzc3Nzc3Ozs7Pz8/Q0NDQ0NHS0tLT09PT09PT1NTU1NTU1NTU1NTU1NTV1dXV1NTU1NPT1NTU1NTU1NTU1NTU1dXV1NXV1dXV1NTU09PT09PS0tLT09PT09PU1NXV1dbW1tXV1dbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1NTU1NTU1NXU1NTU1NTT09PT09PT09PU1NTU1dXV1dXV1dTU1NTU09PT09PS0tLR0p+DaV9kU1hsSEhIS0A9Nzg0NzY6Oj87RDw8OTw8OTg6OTo6Ojs8Ojo7OT49Pjk9QDs/QUFCP0JCQUM9Pz8+PEBCRUNDQkBBO0ZJR01MSbLY09TU1NTU1NXV1dXV1dXV1dXW1tbW1tbV1dXW1svLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzM3Nzc3Nzc3Nzc3Ozc3NzczMzMzMzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc3Mzc3Nzs7Ozs7Pz8/P0NDQ0NHS0tLS09PT09PT09TU1NTU1NTU1NTU1NTV1NXV1dTU1NTU1NTU1NTU1NTV1NTU1dXV1dXV1dXV1dTU1NTU1NPT09PT09PT09PU1NXV1dbW1tbW1tbW1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTV1NTU1NXV1dXU1NTU1NTT09PT09PT1NTU1dXV1dXV1dXU1NTU1NTT09PT09LS0tSjiGxfZlJWakdIR0lBPjM2Njo7PDhDPEJBPjxBPDg5Ojw6Ojw8PDk8PTo7PD09PD89QD9AQT9AQUBCPD4+PzxCQ0NDRkBBQT1ISklOTUeu2NPU1NTV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbMzMvLy8vLy8vLy8vLy8vLy8vMzMzNzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzs7Ozs7Oz8/P0NDQ0NHR0dLS0tPT09PT09TU1NTU1NTU1NTU1NTU1NTV1dXV1dTU1NTU1NTU1NTU1dXV1dXV1dXU1dTU1NXU1NTU1NTT0tPU1NTU1NTU1NTV1dbW1tbW1tbW1tbW1tbX19bW1tXV1dXV1dXV1dXV1dTU1NTU1dXV1dXV1dXU1NTU1NTU09PT09PT1NTU1NXV1dXV1dXV1dXV1NTU1NPT09PT0tLWroprY2VSWGhMSkdJQjg0OTQ6Ozo5QDk/Q0VAPDw5OTk9Oj07PDw6PTw7OTw9Ozs/PUA9PT5AQD9CQT5APD05QERDQkFBQj48SEpLTU5IqNnU1NXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbWzMzLy8vLy8vLy8vLy8vLy8rKy8vLzMzMzMzMzMzMzM3Nzc3Nzc7Ozs3Nzc3Nzc/Pz8/Pz8/Pz8/Pz9DQ0dHR0dHR0dHR0dHS0tHV2djY2NnZ2dra2tvb29vZ2dnZ2dna2tra2tra2tjW19fX19fX19jX19fX19vb29vb29vb29vb29vb3Nzc29zb29vb3Nvb29va09LT09PT09TU1NTU1NXW1dXV1dXV1dXV1dXW1tbX1tbW1tbV1dXV1dXV1dXV1dTU1dXV1dXV1dXU1NTU1NTU1NTU09PU1NTU1NXV1dXW1dXV1dXV1dTU1NTT09PT09PS1bqKa2hoUlhlSUlMT0A5OTo0O0E8Nz05QUM+QD89ODo6Ozk9Oz4/Ojs8PDo7PDo7Pj1APT8/P0FAQUE/QTw8Oz5BRENBREA9PElJSk1ORqPa09TV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbW1szMz9DPz8/Pz8/Pz8/Pz8/W3t3d3t7e3t7e3t7e3t3S0NDQ0NDQ0NDQ0NDQ0ci5ubm5ubm5ubm5ubq6t6WkpKSkpKSkpKSkpKSnhmBjY2NjY2NjY2NkZGRlhIuKioqKioqKioqKioemuri4uLi4uLi4uLi4ubSPjIyMjIyMjIyMjIyMjYiBgoGBgYGBgYGBgYF/j9PS0tLS0tLT09PS09PS3ePi4uLi4uLi4uLj4+Pi2NfX1tbW1tbW1tbV1dXV1dXV1dXV1dbW1dXV1dXV1dTU1NTU1NTU1NTV1dXV1dXW1dXV1dXV1dXV1NTU1NTT09PT09XDkXFrak5TYkxMVk48Ojo3Nz5DPzg+Oj8/QTw/QDc7Ojs7PTs+Pjo7PD48Oz07PT8+QDw/Pz1AQEBBPj88PjxAQUVCQkZAQD9HSEpLT0ae2tXV1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19fMzNDS0tLS0tLS0tLS0tLR3uzr6+rq6urq6urq6uvp1dLS0tLS0tLS0tLS0tTEqaqqqqqqqqqqqqqqq6aGhIWFhYWFhYWFhYWFik4MEhISEhISEhISEhIRE0pUU1NTU1NTU1NTU1NPg6ejo6Ojo6Ojo6Ojo6ScWlVWVlZWVlZWVlZWVldOQ0NDQ0NERENDQ0REQFzS09LS0tLS0tLS0tLS0ODs6+vr6+vr6+vr6+vr6dnX19fX1tbW1tbW1tbW1dXV1dXV1dbW1tbV1dXV1dXV1dXV1dTU1NTV1dXV1dXW1tXV1dXV1dXV1dXU1NTU1NTU1NPUy5h2bGlKTl9NUlVNPjw8Nzs/Qz42Ojc+Pjs9Qj84PDk9Ozw6PD07PTs9Ozs9PD0+PT07QT08QUBBQT08Pzw7QEJDQURFPUFAQ0ZLS09GmNzV1dXV1dbW1tbW1tbW1tbW1tfX19fX19fX19fXzMzR0tLS0tLS0tLS0tLS0d3q6enp6enp6enq6unq6dXS0tLS0tLS0tLS0tLUxaqrq6urq6urq6urq6yoiIeHh4eHh4eHh4eHh41SEhgYGBgYGBgYGBgYFxpOWVdXV1dXV1dXV1dXU4WopKSkpKSkpKSkpKSlnl9ZWlpaWlpaWlpaWlpbU0hISEhISEhISEhISERg0dPS0tLS0tLS0tLS0tDf6+rq6urq6urq6urq6unZ19jX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dXV1dXV1dXU1NTU1NTU1NGcenFpSlRdT1JVTkQ+Pzs/QEA4Ojs4PDs7PD86Ozs4Ozk5Ozw7Ojw5Ozs8Ozo9PT0+PUE/Pj8/Pj08PT88PEFBQ0FERTw+QEVGSktNRpPc1dXV1tbW1tbW1tbW1tbW1tfX19fX19fX19fX183N0NLS0tLS0tLS0dHR0dDc6Ofn5+fn5+fn5+fn5+bV0dLS0tLS0tLS0tLS08Wtrq6urq6urq6urq6vq46NjY2NjY2NjY2NjY2SXSInJycnJycoKCgoKCcpWmNiYWJhYmJiYmJiYl6MrKmpqampqampqampqqNoZGVlZWVlZWVlZGRlZV1TVFRUVFRVVFRUVFVRa9LT0tLS0tLS0tLS0tLS3unp6enp6enp6enp6enn2djY2NjY19fX19fX19fX19fX19bW1tfX19fW1tbW1tbV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbV1dXV1dXU1NTU1NTWo3txZElbYE5OVU9AQT89REI+Oz06OTs6PT07PDs6OTg5OTs8Ozw8Ojo7PDo7QD08PTxAQTxBQTs7PEA/PD1CP0RDQ0U8PkJERkpMTEWN3NXV1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjNzc7Ozs7Ozs7Ozc3Nzc3Nzs/Pz8/Pz8/Pz9DQ0NDQz87Ozs7Ozs/Ozs7Oz87NzMzMzMzMzMzMzMzMzMvJycrKysrKysrKysrKysfCw8PExMTExcXFxsbGxsvMy8zLzMzNzMzMzMzLz9HR0tLS0tLS0tLS0tLRzczMzMzMzMzMzMzMzMzMy8vLy8vLy8vLysvMy83U1NTV1dXV1dXW1dbW1tjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NfX19fX19fX1tfX19fX19bW1tbW1tbW1tXV1dXV1dXV1dbV1dbW1tbW1tbW1tXV1dXV1dTU1NTU169/cF5GXmJQUVdOR0ZDQ0lBPz07PDo8OEBCPD04Ojo4OTg7Pzs8PDs7PDw8PD87PD46Pj44PkI8Pj1BPjw+QkBERUNAPD5APkNJSUtEh9zV1tbW1tbW1tbW1tbX19fX19fX19jY2NjY2NjYzs3Nzc3Nzc3Nzc3NzdHNzc3NzczP09LSzs3P0s7Ozs7Ozs7Q1NLPz8/R08/P0tTV1NDPz8/Pz8/Pz8/Pz8/P0NDQ0NDR0dHR0dHS09PU1NTU1dXV1tbW1tfW1tbX1tfX19fX19fX19bW1tbW1tbW1tbW1tbW1tfX1tfX19fX1tbW1tbW1tfX19fX19fX19fX2NjX1tbW1tbX19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjX19fX19jY19fX1tbW1tbW1tbW1tbW1tbW1dbW1dbW1tbW1tbW1tbW1tXV1dXV1NTV1di4gm9XSl9jUlFaS0hBQTxCPT07Oj4+PD4/PT0/Nzk6OTk3OD48PD47Ozw7PDs/PT0+OTs7OT0+P0A+QD07OkI/QkNCPz0+QD5CRUdKQoDc1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2M7Ozs7Ozs7Nzc3Nzsqfys3Nzc3QuYOEi8fTwJrLz87Ozs7Pypal0c/SuJ/R0ZyChIrGz87Ozs7Ozs7Ozs7Oz8/Pz8/P0NDQ0NDQ0NDR0dHR0tLT09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbV1dXV1dbW1tbV1dXV1dXV1NTU1NXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NfX19fX1tbW1tbW1tbW1tbW1tXV1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXYwIBuVU9gY1dZW0xMQ0A9PTs9Ojw+Qj5CQ0A8Ojg5ODo6Ojc7Pz4/PDw7PDo5Pzw8PTg5PD9BPj09PUFAPTtBQkBCQz47QD9BQUlHSkF629bW1tbW1tbX19fX19fX19jY2NjY2NnZ2djY2dnOzs7Ozs7Ozs7OzdKpj63Rzs7Ozpu3tqSiwJOerNPOzs7Pz5yqna3VspeYuLqVuLmvodLOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0dHS0tLT09TU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dbW1tbW1tXV1dXV1dXU1dXV1dXV1dXW1tbW1tbW1tbW1tfX19fX19jX19fY2NjY2NjY2djY2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2dnY2NjZ2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV18h/b1pTYWVeXVxPSkQ9QD8+Ozc6Pjk/RD9BOTg3ODk7Ozw4OT89PTw9PD47OkE7OTs5OzxDQDw7PT5AQT49QkQ/QkM9PT8+Pz5ISUg/ddrW1tbX19fX19fX19fX2NjY2NjZ2dnZ2dnZ2dnZzs7Ozs7Ozs7Ozs/Inrym0tDQzsqgl36Cw6abr6fUz8/P0MuUiJqdzJ2jqLHRkn1+r7DSzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dLS0tPT09TU1dXV1dXV1dXV1dXV1dbV1dXV1dXV1tbW1tbW1tbV1dXV1dXW1tbV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2djY2NjY2NnZ2dnZ2dnY2NjY2NfX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dbV1dXV1dfNiHNdWGloXl9gT0lGOkFAPj88PDo2P0JAQjo2NDc6Ozo8Ojk+PD49PTs/PTxBPjw8Ojw8PTw6PEA9QEI+PkFCPUNDPT0+Oz9BRUtIQHDZ1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2c/Pz8/Pz87Ozs7SrKWnqdXAvNLHnY+ey9PJipmq1M/Pz8/RvciZmcLFiJu21dPNnp7D0M/Pz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0dHS0tLS09PT1NTU1dXV1dXV1dbW1tbW1dbW1tbW1tbV1tbW1tbW1tbW1dXV1dXV1dXW1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnY2NjY19fX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0JB1W1tqaWFeXVNOSTxDQEE+QD46OEZBP0M6NzQ5Ojo5Ozs4Oz0/Pj49QT08P0A9Pjw8PDw8Oj1AQD8/PT5CQD9AQkA8QD0+QUVLRz9r19fX19fX19fX2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnPz8/Pz8/Pz8/QzJ2Nl6zQmpfKxZ6ynpbN1q2ZqtTPz8/Pz9KXlJ/L16WbtdTTwKCg0M/Q0M/Pz8/Pz8/Pz8/Pz8/P0NDQ0dHS0tLT09PT1NTU1NXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX19fX19fY19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tKUcl5ea2tqZV1PTEc/RENDQDo9OzxCPD49OTY0Ojk5Ojo5Nzs/QDs8PUA8PEE+PD07PTw/PDo8Q0A+PTs9QD5CPkBBPkA9QD9GSUQ/ZtXX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2traz8/Pz8/Pz8/P07GigJuvyaCjv8qcpYynrdiqmarUz8/Pz9Ozm8SY1NWimrXU1K+iqdTQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1NXV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dbW1tXW1tbW1tbV1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbSk3BgXnBoZmVaUUhHQkVDQEA3Ojo8Pjo8OTc2NTk6Njo8Ozc8QEA8Ojo9Oj0/Pj08OUA8PDo6OT9APj08PUBBQz9APz5BOz9ARkpCP2LS2NfX2NjY2NjY2NjY2dnZ2dnZ2tra29vb29vb28/Pz8/Pz8/P0M6fkGyclteqo9PSrqa1mJ/Vqpmq1M/Q0NDRzo2QnsLXopm11NOjobrU0dHR0NDQ0dHQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1dXV1dbW1tbX19bW1tbW1tbW1tbX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfW1tfX19jY2NfX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX1tbW1tbW1tbW1tbW1tbX19fX19fW1tbW1tbX0pNuYFxxZGdkWlVKQENGQ0FCODs/PD07PDw4NTU4OTY4Ozo5PDo+Pzw9PTk8Pz49Ojo+OTw6Ojg+Pzw9PTw+QEFDQT48PDpCRERKRkJd0NnX19jY2NjY2NjY2dnZ2dna2trb29vb29vb29vPz8/Pz8/Pz9G9n8O31pfA09HQ0srSzZeb1KqZq9XRz9DQ0cvaqJmv2qKattTOnp/J0tHR0dHR0dHR0dHR0NDR0dHR0dHR0tLT09PU1NTV1dXV1tbW1tfX19fX19bW1tbW1tfX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19fY2NjY2NjY2NjY2NjY2djZ2dnZ2dnZ2dnZ2dnZ2drZ2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fX19fX19fW1tfX1tbX19fX19fX19fX19bW19GRbF1cb2doYl1PRkBISUdFQDw8Pj48PT48NzU2Ojk2OTs6Ojs4QD86PDw5PD49Ozs6Pzk/Ojs5PT49Pjw7PTxAQ0I/Pz47Q0ZGR0hEWc3a2NjY2NjZ2dnZ2dnZ2dna2trb29vb29vb29vb0NDQz8/Pz8/Pz5V+e6WS1KKa08ySl6ObodirmavV0pem1cmOpZqetNmjmrXXw5+h0tHR0dHR0dHR0dHR0dHR0dHR0tLS0tLS09PU1NTV1dXV1tbW19fX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tbX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2tnZ2dnZ2dnZ2djY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX1tfPjGRWXnBrXGBgTkVITUlJT0M+OkI9PUBCOzU1Nzw6Nzo7Ojo7OT09OTo6OT0+Pz07OT47PDo8Ozk+PD47PD0+QENCPz5BPEFDR0ZGRVXJ29jY2NnZ2dnZ2dnZ2dra2tvb29vb29zc3Nzc3NDQ0NDQ0M/Pz9DR1aeZrcmjqL7KnbGdo7XZqZup2Lirocq7oaannMvXopu02bKkptbS0tLS0tLS0tLS0tLR0dHS0tLT0tPT09PU1NTV1dbW1tbX19fX19fX19fX19fX19fX19fX19bW1tbW1tfX19fX19fW1tbW1tbW1tbX19fW1tbW1tbW1tbX19fX2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2djY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fX19fX19fX19fY2NfX19fX19fYzYZdV2JvZE9dVEtIRlNRS0xAPj1EPD9DRj01NTc7OTY6Ozo8PTo7Pzo6OTg6PT0/Pjs/Oz49Ojs5Pjs9PD0+QURCQD8+PzxAQUVHRURSxdvY2dnZ2dnZ2dnZ2tra2tvb29vb3Nzc3Nzc3NzQ0NDQ0NDQ0NDQ0NO5gL3Tm5bP1LWLkZ/T1LyBu9TOlKDT056QjbbW1bKExta5g7/V0tLS0tLS0tLS0tLS0tLS0tLT09PT09PU1NXV1dbW1tfX19fX19fY2NjY19fX19fX19fX19fX19fW1tbX19fX19fW1tbW1tbW1tbW19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2tnZ2tra2tra2tra29ra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2NfX2ct+WlVqaltMX01KTEpVTEZCPD0/R0ZIS0g9NjU3Ojk3OTo7Ojw9OT45OTo4Oz0+PkE+PTk8PDo9Pj46PTk5Oj9FQUA+PT8/QkBHRURFUMHc2dnZ2dnZ2dna2trb29vb29vb3Nzc3Nzc3dzc0NDQ0NDQ0NDQ0NDQ0cHR0crI0tDUxLjS0tHSwtLQ08fM0tHSusTV0tLRxNXR0cLT0tLS0tLS09PT09PT09LS0tPT09PU1NTU1NXV1dbW1tfX19fX19fX2NjY2NjX19fX2NfX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29va2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2djY2NjX19fX19fY2NjY2NjY2NjY2NjY19rHd1xSZ2laTlpOTFBRV0VKPz8+PkFFTExBPjc3NTs4ODk5Ojs8Pjw+ODo6OTs+P0A9Pj46NTo6Oz0/Ojs5Ojw+QkJAPz8/P0FCR0RDRE683dnZ2dnZ2dna2tvb29vb29vb3Nzc3Nzc3d3d3dDR0dDQ0NDQ0NDQ0NDS0NDR0dDQ0dPU0dHR0dPR0dHS0tHR0tXU0tLS09XT09PV0tLS0tPT09PT09PT09PT09PT09PU1NTU1dXV1dbW1tfX19fX2NjY2NjY2NjY2NfX19jY19fX19fX19fX19fX19fX19fX1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tvb2tra2tra2trZ2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2trZ2tra29ra2trZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjbwXNYVWlrU0xSTlBSWVRGSTw+Qz9BQkVLPj43ODY5Njc4OTk7Oz0/QDw9ODk7Ozs/Pjw8OTU6PT47OTk7PD8/P0JCQT1BPUBBQkZCQkJLtd7Z2dra2tra2tvb29vb29vc3Nzc3Nzd3d3d3d3R0dHR0dHR0dHR0dDQ0NDQ0NDQ0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tPT09PT09PT09PT09PT09TU1NPT1NTU1NTU1NXV1dXV1dXW1tbX19fX2NjY2NjY2NjY2NjY19fY2NjX19fX19fX19fX19fX19fX19fX19fW1tbX19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2NjY2NjY3LxvVFRsbExLUkpUUlVLRkQ6PkdEREFERjw/ODk6OTY5OTo3PD07PkA9PTc5Ojs5Pjs5OTY2Oj1AQT47PDk6Pj9DQT4/Qj0+QkNFQkFCSrDe2dra2tvb29vb29vb29vc3Nzc3Nzd3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0tLS0tLS0tLS0tLS0tLS0tPT09PT09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1tbW1tbW19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19fW1tbW1tfW19fX19jY2NjY2NjZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2dnZ2dnY2Ny2a1NbcGtLVVdSXFFXSEQ+PEJKRT1ISj89PDc4ODo1OTg5Njs+PD1APDw1OTk8Oj87OTk0ODw9PUFBPD47Ojw+QD89PkE9PUNGR0I/Qkmq39ra29vb29vb29vb3Nzc3Nzc3N3d3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHS0M/U0M7P0tLT0tLS0tLS0tLS0tPT09TU1NTU1NPU1NTU1NTU1NTU1NTU1NTV1dXV1dXV1dbW1tbW19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19jY2NfX19fX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dndsGRTYXJfT1pUV19RUkdCPUVJTEFBTEQ/Pzs5ODg5Mzg2ODY5Pj0+Pz06Njo7Pjs9PTo5Njg6PTtAQDxAPz0/P0I+PD48PEJFSElCPkNJpODa29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3t7S0tLS0tLS0tLS0dHR0dHR0dPT0bm7zLqbnLrQyNPT0tLS09PT09PT09PU1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2NjZ2dra2tra2tra2tra2tra2tra2tra2tra29va2tra29va2tvb2tra2tra2tra2tra2trb29vb29va2tra2tra2tra2tra2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ3qpfVWBuW1VZUVpeT0xHQ0ZNSUZEREo7QUE7PDg4NjQ4Njk4Nzw/QT89Ojc8Pz48Pz87OjY4OD09QEE9QD5BQD1AOjs6Pj1BRUdKQkBDR57h29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e0tLS0tLS0tLS0tLS0tLS0tO+wMqaoKKViJGeqpOpz9TT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fY2NjY2NnZ2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dna2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2tvb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2d6iXFVeblheXU5aUFROQ0NMSUlJRkpEPEJBPDs4NzY3OTc3OTk9P0E/PDo5QD88PkI/Ojg3NzY9Pz9APUBBPz88PTs7OD48P0VJSEE/Q0aX4dvb29zc3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3tPT09PT0tLS0tLS0tLS0tTIlZyum5m1iX2TjIKBhMTV09PT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tvb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dndmlpYYW5ZYVdPV01QRUJETElNS0ZJRT5CRDk4ODY3OTc1Njk4PT1BPjo4OT4+PD9APzw1Njc2PD4/PjtAQEA/Pj4/Pjs/PkFCRkdCQENIkeLb29zc3Nzc3d3d3d3d3d3d3d7e3t7e3t7f39/U09PT09PT09PT09LS0tLTz6h+kayPko6MhoCIiYSQo8rU09PT09PU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY19jY2NjY2NjY2NjY2NjX19fX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2tra29vb29ra2tra2tra2tna3JJaWWNuWlpSVV5QTDxAR05IUklIRT47SEY4OTc1Nzg3NTg5ODs+Pj07ODlBPj1AP0E+NzU5Njs+QUI/P0BAQkI/Pj8+QUBEQUZIQj9FSozi3Nzc3Nzc3d3d3d3d3d3e3t7e3t7f39/f39/f1NTU09PT09PT09PT09PWtaWaiIuQhYCFi4iBg4qLf4bC1tTU1NTU1NTV1dXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2dnZ2dna2dra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29ra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb2tra29uIWltnalxYTFpfVkg6TEhMSkpDRUVDQExINzo3Njc4ODU4Nzg5PDw7Ozk4QD89Pj8/PDY3PDQ3P0JCQUBAPz8/QT09P0A+QEBGRT09REuI4tzc3Nzd3d3d3d7e3t7e3t7e3t/f39/f39/f39TU1NTU1NPT09PT09PUxZKCg4WGfYGCfXx5foGCg36k29bU1NTU1NTV1dXV1dXV1tbV1tbW1tbW1tfX19fX19fX19fX19fX19jY2NjY2NjZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vc3Nzc3Nvb29vb29vb29vb29vb2tra2tra29vb29zb29zb29vb29vb29vb29vb29vb29va2tvb29vb29vb29vb29vb29vb2tvZgFpebWhaU0ldW1hKRE1ISlNMR0ZBQD9KQjg7NjY5OTc1ODY4Ozo7Ojw5OD09O0A9Ozo2NTw3Oz1CQEFBPD49QEE9PEA/Pz5CREU+PERLg+Lc3d3d3d3d3t7e3t7e3t7f39/f39/f39/f39/V1dTU1NTU1NPT09PT2LKEkKh9g3l2hIh/e3d5gn5+i67A1dTU1NXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dna2trZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2tra2tra2trb2tra2tvb29vb29vb29vc3Nzc3Nzc29vb29vb29vb29vb29va2trb29vb29zc3Nzc3Nvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc1nlcWmxmWFJPYFFSQUhHSkZYTEZAQENDSz87Ozc4ODc2NTc2ODo5PDw6PTs/PTs9Pjw7ODg8OT0/QkFCQzw8P0FCPj1BQkNCREVDQDtDTH3h3d3d3d3e3t7e3t7e39/f39/f39/f39/g4ODg1dXV1NXU1NTU1NPU0ruen3WKeXuIgICChYGDcnOAhYOMrNfV1NXV1dXW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NnZ2dna2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra29vb29ra2trb3Nzc3Nzc29zc3Nzc3Nzc3Nzb29vb29vb29vb29rb29vb29vb29zc3Nzc3Nzc3Nvb29zc3Nzc3Nvb29vb29vb29vb29vc3Nzc3Nzc3Nvb29vb3dByXV9wZVdLUGNPS0JHQ0pIS0ZBPEE9SFBBOjo3Nzg3Njc4Nzw6OD09PD47QD88Pz07Ojs5Ojk8QEJAQkNAPUFAPz1AQkNDQUBAP0A7RU144N3d3d7e3t/f39/f39/f39/f3+Dg4ODg4ODg4NXV1dXV1dXV1NXU18h4i4V8goh6g4SBfoKCc2l0hYuGkJ3U1tXU1dbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tvb2tvb3Nzc3Nzc3Nvc3Nzc3Nzc3Nzc29zb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb297KalxjcWVST1heSz9HTElPS0VAPkFCP0lPPjk6NzY7NzY6Ozc7Ojg6PDw+Oz09Oz48Ojs4OTo4OUFCQkFAQDtAQj06PkFCQz8+PT4/PUZOdN/e3t7e3t7f39/f39/f4ODg4ODg4ODg4ODg4OHV1dXV1dXV1dXV1s6dhpl+f5OTin+CgXx9gnNxm4mAgoOJwNnat7TQ19bW1tbX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tra2tra2tra2tra29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NvfwGNaW21gVlBTU0pETEhNSEk8PkFEQ0ZORDw8OTc5OjY4Ozk3PDk4OTw9OzlAPjpBPzw3NTc7ODpAQUVBPz45PUI/Oz1CQkI6Pj07PT5GTnHe3t7e3t/f39/f39/g4ODg4ODg4ODg4OHh4eHh1tbW1tbW1tbV1tjLioCHhYOXjHh7e3lvfYF1a3ebdHZ7eInHxpiMrdjZ19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2drZ2dna2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tra29vb3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29zb29vb3Nzc3Nzc3Nzd3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3Nzc3Nzc4LdjV1lrYlJNVVFMSktGS0ZDQD5CQT9FTT4+PTg5OTo3OTo3NT03Nzo+PDs7Qjw5Pz05NjY4PTk6QEJGQD49PEBCREA9QD9DO0A9PD4/Rk9t3N/e3t/f3+Dg4ODg4ODg4ODg4OHh4eHh4eHh4dbW1tbW1tbW1tfVrYZ6d32rn3l4entzdH+Dfm9xe3l6c3t2k4qFgImkzdnY19fX2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tna2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29vb29vc3Nzc3N3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vc3Nzb3Nzc3Nzc3N3d3d3d3d3d3dzc3Nzc3Nzd3d3c3Nzc3Nzc3N3d3d3d3d3d3d3d3dzc3OGtYVtebGJSTVZMTUdLS0RGQkI7QT08RUxDQT44Ojk6Nzc5NjY6NTs+QDs9Oz89PD89Ojk5Ojw5PEVDRkA/PkBDQkQ9OT0/QT1CPz1APkdPadvf3t/f3+Dg4ODg4ODh4eHh4eHh4eHh4eHi4uLW1tbW1tbW1tfQmH+Qh4N9eoN2e3Vzenl6kKqmd3JyfoeHh4CAfoKEhJHJzNnX19jY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra29va2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2djY2NnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vb3Nzc3N3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzb29vb3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3dzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3NzhpV9UYm1iUE9TSUhHRkpJSUJBPkJCPEVFREA+ODo4Ozc3Ojc4ODY+Pz07PDk9PDo+PTs6Njc7NjpEQUY+Pz8/PkNBPzs9PT47REM/PjxIT2fZ4N/f3+Dg4ODg4eHh4eHh4eHh4eLi4uLi4uLi1tbW1tbW19jYyH52doN+fnR2eIaCenl1d5yhu6GEgoCAfoeKinx/gYaMnKjO2NjY2NjY2NjY2djY2NjZ2djY2NjY2dnZ2dra2tra2trb29rb29rb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3d3d3d3c35pbT2drXFBRUElDT0pLR0xHSkJAP0FHREBBPDg8ODg1ODk3Njc3QEA/Ozw5Pj04PTw8Ojc4PTk/RENGPkE/QkBDPzw6Pj0/PkVEPz07S1Fj1+Hf4ODg4ODh4eHh4eHh4uLi4uLi4uLi4uLj49bW1tbW19XB3LRueHJze3B6eXaFiIR7eH2AgZiljH98fnuRhZaLhoGDgY6Rvd3Z2NjY2NjZ2dnZ2dnZ2dnZ2dnY2dnZ2dna2tra2trb29va2tva2tra2trb29ra2tra2tnZ2dnZ2dnZ2dnZ2dna2trZ2dnZ2dra2tra2tnZ2dnZ2dna2tra2tra2tra2tra2tra2trb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t3d3d6NWFdobllQUUtISlNJTUhNSUtBQz9DRkJBRDo6PDg2NDg4NzY2Nj8+Pjo8OTw7Oj09PD05Ozw7RERERT4/PkI+Qj84PT8/Q0NCQEE+O0xUY9Xh3+Dg4OHh4eHh4eLi4uLi4uLi4uLi4uPj4+PW1tbW1teslLZ6eHJvd5V7dHuLgHh1bn6Fg3t/hYhyfH2bnI6JioJ+g32Hk5rH1NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2trb29vb29vb29vb2tra2tra2tra2tra2tnZ2dnZ2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2trb2tra2tra2tra2trb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d7Zf1lgaGxcUUtHR09LTk5PTURGQkg/Q0hEREA6Ozs4NzU3Nzc4NThAPkA7PDk8Ozw+Ojk7OTk7OUZERUI8QD4/PEBDOz5AP0A/Qj8+OjtKVWPV4eDg4eHh4eHi4uLi4uLi4uLi4uPj4+Pj4+Pj1tbX19vKhYR3cXJubniVhHt4hH95dnB4c3eLkY6CdnN9ioaId3d1d4ODfIiIk8Pb2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2trb2tvb29vb29vb29vb29rb2tra2tra2tra2tra2tnZ2dnZ2dna2tra2tra2tra2trb2tra2tra2tra2tra2trb29vb29ra2trb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f0nVZaGlqVk5KSE1OR01EUElGSD9FPUZMREM+Ozs8OTc3OTY2OTU4Pj4/PTs8QDs9PDo3Ozc5OThHREVCPUE9Qj8+QDw/QUE/QEJAPjs8S1Ri1OLg4eHh4eLi4uLi4uLi4+Pj4+Pj4+Pj4+Pj49fX19fEknuJf29sbnV2foSBg4qGfnVybWVtiIaKjoR7c4OHint4e4OPj4GEioqxztrZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29zc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tvb2tvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3dzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f3t7e4clsW2pqalNOR0hOT0VIRk1JSUA7RD5ISUA9PDo6Ojg2ODo3Nzk0OD08PT07ODw8PDw4Njc4OTo6RUJFQT9APEI/Q0M+PkNEQUBAP0A8PUtRYdPj4OHh4uLi4uLi4uPj4+Pj4+Pj4+Pj4+Pj5OTX19fZqXaFfnx3bHB3eXh8jH2KhYB3anN0d3p9bot7fnl6foR/gIGDfnh8foeGlrbT2tnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra29ra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/e3uO9amFpa2lRTkZNTEtKWE1OR0FAQE9BQz9AOzw4OTk5Njg2NjY4NDs+PD07OTY6Ojk6OTU4OTg5OkJERj8+Pj5AQEBCPzxBQD88Pj9BOT5KT17S4+Hh4eLi4uLi4+Pj4+Pj4+Pj4+Pj4+Tk5OTk19fX2sqKhIB5c29tcXN1d4CUeHaAfHWHhXd1cnWgmXp7d3Z5doR0bWxue3iAmouTu9za2tra2tra2trb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc29vb29vb2tra2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f397js2lpbmloUFBPTExPUk9LU0Y/RURERD48PDg6ODc5OTU2ODY2NzM6Pjs+PTc6Pjk5OTk2Ojo4NzxDRUc/Pzs/PkA9PkE9Oz0+OUFAQDhBTlFc0OTh4eLi4uLj4+Pj4+Pj4+Pj4+Pk5OTk5OTk5NjY2NjauY6AenZ1bmpveHCBfWt0cnZ3hIV5h4d5lY55eXp1d3pza298gHx2fYh8gLLe2tra2tvb29vb29vb29vc3Nzc3Nzc3Nzc3dzc3Nzc3Nzc3Nzb29vb29rb29vb29ra2tra2tra2tra29va29vb29vb29vb29zc3Nzb29vb29vb29vb29vc3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3t7e3t7e3d7e3t3d3t7e3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/f39/f4qpqa2hrZFNQT0ZQVFJOSFJLPkREQ0I7Ozk6Ojg2Nzg1NjY4ODg0Oz88Pzw5PDw3Ozo6Nzo6Nzo9Q0JDPUE+Pzw5PT5BQDs8PDtFQD47Q05TXNDk4eLi4uLj4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTY2NjZ1p5vdntveHh2cG50d3BwdHBzb36Jc3qGhY2EenNtcoB6hn1vg5OBdnx9g4a13drb29vc29vc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29ra2tra2tvb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4N/f3+KgbWhma2ZVVlJHUFFOS0xMRUJIRUc9OD08Ojo3Nzg2Nzc2NTY3NDg+PD09Ojg6OD46Ozc4Nzc6Oj5DRDtDQj49OD1AQUM/Pjw+RTw+PUJNUF/S4+Hi4uLj4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk2NjY3MB2doCCfnp4eHBsdXlya399bHNvdGdoaYB/aWl4c2d+iYl4cIKGe3d9foWKvd3b3Nzc3Nzc3Nzc3Nzc3Nzc3d3c3Nzc3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODflGttZm5mU1NJUFlUTEhGTkZGRUJGPTs+PDs5NzY4NTc5NjQ1NzU4PDs9Pjo6OztAOTs7ODc6OTlAQkE8QUE/Pzk/QEJFQ0FAQEM7Oz1ES01g1uTi4uLi4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk5NnZ2tmYc3uqhJaCcnR1dn14aGx8d2h4d25rcHR5gIJ3dHyBhIJ9c3CAin94gn95g8je3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f4N/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh24tubWdzY1lRTVVbV0hDSUZOS0dCRD8/Qjo7OjY2NzU2NzY0ODc2Ozw7Pj86PDk8Qjg3OTo6Ojk6QUFCQUJDQEE+PT9CQ0NEQUJGOTg9REpOYtjk4uLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXZ2drcqHGCtXiRfnNsem6EgXaCfWtoan+DeHZ8dX2FhXRmcHl9d316gIqFe318foC03tzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3dzc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3Nzd3d3d3d3d3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e397e3t7e39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4ODg4ODg4tiFb3FrdWFWT1VVXE9ETUY+SkdKRUQ8P0I6PDk4Njg0NTY3NDc2NDk7Ozw7OD47PEE4ODo9OD04Oj09QEBAP0FCP0A+QENCQ0FBRTc2O0RMTmPa5OLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXl29ra3Z5sbnNxhY1ybXBuf391hH5rcnZ2enN4gXhzb3VwbWt2fHmFiIB/f392coODsd/c3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eDg4eHh4eHh4eHh4OLXhW1xb3ZeUldTWlpRSkhDQFFAQkQ8OT9BOjw5NzU3NDU2NjQ3NTY9PDo9PTk+OjxAODo6PDY7OTs+PUJCQjtBQkBDQEBEREM8PUA3OjxFS01l3OPi4uPj4+Pj5OTk5OTk5OTk5OTk5OXl5eXl5dPOxsB+cWxveHt2b3VuanNzbZKGeG50dG5vdIZ/b2twboJ0bXZyfY2DdnF/d3mKgabf3Nzc3d3d3d3d3d3e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3dzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t/f3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi1oZucG1xYFJZUFdfWUpMTElSP0Q9OTtCRjs6OTc0NTY1NzU0NjY2Pj07Pz45PTk7Pjg9Ozo0ODtAQENCQ0FCRkE/Q0BBQkREOz0+OTs8QkxNZODl4+Pk5OTj4+Tk5OTk5OTk5OTk5eXl5eXl5eW5t7Woc3JscHd6dHd4bXFydXd/hHRyc2xsa3F8bnBudGuBf3GAd32Eg355gHNygYqg2d3c3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh49WHcWxqbF5YWlVXYFZWUE9QTD1BOjs8RkE4Ojg3MzY1Njk2NTg1Nz89Oz8+OT04Ozw5PTs7NTo9Q0JCPENDREREQUE/PkJDQzw9Pjg5PENLS2PN0dnh1sjY4+Tk5OTk5OTk5OTk5eXl5eXl5eXltbW2q3J5cm59f3Z1d2hqaGlwb3Zta2tnZWZxdG15gG5teXd2iHhxa2podXV5dHV/wd/c3d3d3d3d3d3e3t7e3d3d3d7d3d3d3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHi4uHh4ePVhnFwY2lhV1NZV19MUk9STUtAPjg5O0E+ODc5NjQ3Njc6NjY2NDk+Pzo8Pzo/OTo6Nzo9PDk5PEFBPTtBQ0VDRkA+Pj5BRUQ+QEE3OD5GSEpesrW4wbm1u8jg5eXl5OTl5OXl5+fn5+fm5ebm5ra2tbWOfX5weoR1cnZnYmNlbGtyb2ZpbHZtd4Z9hXlsbHd4a3ZwfH14c3V5fHd2h7ng3d3d3d3d3d7e3t7e3t7d3t7e3t7d3d3d3d3d3t7e3t7d3t7e3t7e3t3d3d3d3d3d3d7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4eHj1Yd1bl5uY1pUU1hXS1NLSk1SR0E4Ozs+PDk4NzU2NTY2OTY4NjY5Pzw6PT07Pzo7Ozk8PDs5Oj4+Pjs8PUFEQkNBQEBBP0JDPDw9Nzs+REVKXrG1tLW2t7e2y9rJ3uXl3eDi3tXU1tPU4OPg39+2treuh3t/bnmNenJ1bWNobGxtaXR4enF5enqIh4N6aWh9cWRvcXyGgX55e318e4an2t7d3d3d3d7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4uHh49aGdmxhb19dV1lcWlJQSEpXTEVHPUA9Ozs9OTY0NjU1NTg2NzY3OD87OT09PDw5OTw6Pjw6OTg+Qjs7Pj5AREBDRUFAQD0/QDw9PTU5PEJHRl2xtbW2uLm5ubq9uMPT0r3BwcC6u7y6u8TMxb/Dt7e3hGl1gX1ndYd5Z3Vxa2t5eHB3fH15bWl3e3h3bml1j4FwbHl4d3d9gXuGgnmAoNze3d3d3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODh4OHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4ePXhXJrZ3RhW1hYX15TVVVRVUpMRj9JRDs5PTY2NDc3NTc4Nzc3ODk8PDo+PDg8Oj0+OTs8OTs5P0E8PT9DP0FARUJCQTw9Q0A6Pjw1NDlER0dasbW1tre5ubm5ubm3ubm4uLm5urq6urm5urm6u7e3uX9ucHN6b3B/eXNuc3Vsc3Z4cXFwb2tvcX6Bc2mHhIF9dHOHdW11hYmBgHJ2hafd3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uHj14lxa2xyW1dXXWBUUVVUUFJPSkNATUE9Ozk2NTM0NjQ2ODc3Nzk6Pjs8Pjs5PDo8PDk8PTw7PT0+PUNEREBDQkE/QD48PkE8OD06NjY6QkpIWLG1tLa2uLm5uLi5uLe3uLi5urq5ubi4uLi6uru3uKx7cnhxf3ZzfnBsbXpyZ29sbW50cHt3d3Jyd3pvhpJ2f3x8enZ5fH9zfYdyda3T393d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4eHh4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi49eHb2pxalVWV2FbT1FSUE5XSURESUo/Ojk6NzUzNDk1NzY2Nzg4Ojw7PD46PDo6PTw5PDw9Oz09PDs9REdEQ0E8PDw8Pj5AOzg8ODE1OkFGRVautbW1tre4uLm4uLi4uLe4ubq5uLi3t7i4ubq7t7mqcnB4d3x7e4J3aG5xam9qY2lyf21zcn54dHFsanaAeX2AgH91doB1a4qLgHaR1d/d3d7e39/f3t/f3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f4N/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLi4uPYhm1sdGVWUFxnWE1YU1JRWUVDS1BOOzk4ODc1NTM5NTY2NzY4Nzk+OT0+OTw5OTw7Njg5OTo8QEA9PkBGQEJCQDo+PEE9Pzs7OzYxNjxCR0RQqLa1tba2tre4t7i4uLi4uLm6ubi4t7e3t7e5ure2tIlyd3h9iXxwem99c2hqbGdnbHRscXd0cWx2c3Fxd3FyfHl4g3Z7d2mLkYp9kM7f3d7e3tvY2drZ297f39/e3+De39/f3Nvc3N3e3uDg3+Dg4ODf3t7e39jS397f397e3t/f3t7f3t/f3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLi4eLi4uLi4uLi4uLi4uLj4+Lj4+Li4uPj4+Pi4uLi4+Lk14NoZ3VkVlVkZVdKWllXW1Q9RU1LSD04NzU3NjQzOTQ0Nzc1Njc5PTo9Pjw9PDk7PDk5Oj45PD4/PkFBQ0FFRUQ+OzxBPjw5PDs3Mzc+REhFSqG2tbW1tbW2tre4uLi4t7e4uLi3tra2tra3uLm2traLfXpsbHp/cGx5dm5qaGdlcXp4b2lvb3B1c21zd4Fnb32CgYNyf3lqcHJ6f6ng393Zy8a/vL2/vsLN0tDW3tnc4NfQzcPCw8PH1dfT2dzX1NjX0MfExce9vM/Kz87Y3djO3N3c2t3T0dze39/e397e3t7e4N/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eLi4uLi4uLf4uPi4eLg4d7W29/Sw8rJx9Hb3OLk4eHg2dre1sbExcTN2trf5OHi4trX3st9aWZxYVleZWFNTFRLUlpMO0hNSEZBPTc2NjUzNDY2NDg3NjU2OTw7Pj46Pjk5PDk3OTs7Oj49PEBAQ0RCR0ZCQT08Q0A9OTw7Nzc3P0RGRkaZtrS1tbW2tra4uLi4uLi3uLi3s7W2t7a3t7i5tba3opdxb29waW50dnFmZWNrbmdvcm1mZ2tygWVvdnyAeGRzj39zaHFyaWVlbm+w39HFv7u5ubm5ubq6uru6vc3Gw8e/urq6uru7u8HCvcHFvby/vry7urq5ubq6ubm6w8XDucDDwby/ube/z8/U3tjc3t/g3tLa4N/f4ODg39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eDg4ODg4ODg4ODh4eHh4uLi4eDh4uLi4uHa2t3RwsPCu8XT1uDdydPDrrnAsaqrq6uwtLbJ0sXRxLG4v7Srq6usr7S0vMzE1c60tLureGxtbWBdYl9ZS1NVVFFQREBRTUhEPzo3ODU3MzE1NjQ5ODQ2Njo8Oz08ODw5Njo6ODg5NzU8PDw/QEFAQkRDQkE8PkI/Pz09PTc1OD5DRUNAj7a0tLW1t7i4uLi4uLm5uLe1sautr7Oxs7OztLS0tqaei2tue3ZxeXhnY2hfcXdha25vaG99b25ja2lseHdsa4Z+bHB6dm1scG95sca8uru7urm5ubq6urq6urq6urq6urq6urq7u7q7u7y7urq6ubq7u7q6urq6urq6ubi3t7i4t7e2tbW1tbi3u8e+w8XHzcS4wMnH0tzZ2d/e3uDf39/f4ODh4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh3Nji4uLi4eHh4OHg3tfGxtHQztTe3tPO0t/SuLi8sq2trKysrrG+ua63rKipqamqq6urqqqqq6ysuKyqqqqrq6urra6urq6urryzrayrpHlub21fXl1dVE1SU1xUSkE/UElIPjg5NjgzNzMwNTczNzg1NzY2Ojw/PDg5Ozo6Ojg5OjY1OTs8Pj9EP0NFQkNCP0BAQT9APjw3ODc6QUVEP4W4tLS1tbe4uLm5uLi3t7SurKuqqq2urq6vsLGzs7WjcG5ucm1wg311aWFlaGZkY2Rxc21td25naW1tZXBzb29zcXN8h4F6dX11n7u6uru7urm5ubm6urq6urq6ubq6urq5uLm5ubm6urq6u7q5ubm5ubq6ubm6ubm4uLi3t7e4uLe3t7a2tbW2tra1tbW1tba1t7e3t7rBvrzGycrb3+Dg3tvd3d7h4tDW4uHg4ODg4ODg4ODg4ODg4OHg4OHi0768zNjd3OLg0dnbxL23sLCxsa+zu7uzsLS9s66urq2tra2sq6qqqqmpqKmpqampqqurqqqqqamoqampqampqaqqqqytrq6urq6urq6sraR4aWJxZmFZWlZRUk5cU0Y9QlJEQTc8OzY5NTY1NDU2NTg3NTY1Nzg7Pjw7OTk5Ojg3Nzk3Njg8Oz47RD8/Q0BBREE+P0M9Pjw+Ojo3Nz9DRj54srCztLW2t7i3trKurq2sq6uqqaqtraysrq+xs7S1t4xucnRqaIB5ZmpmZWxdaG5waGxxYmNmcoJ+dmhobGpueoaBhXx4cXF5gK+6ubq6urm5uLm5ubm5ubm5ubm5ubm4uLe3t7e3uLm5ubm5uLe3t7i5ubi4uLi3t7a2tre3t7e3tra2trW0tLW1tbW2trW1tre3t7e3t7e3tre4v8bP0MS+v8DE19e8ydra4OHg4ODh4eDg4ODh4eDb3t7Uzby3tre6wMDJxLfIvrKwsLCwr7Cvrq6ur7Cwr66urq6uraytrKurq6qpqampqampqampqKmpqKmpqampqKmpqKmpqqqrraytra2ur66trK2heWpjbWdiXFhRUFFLVEpCOklRP0E3PDk0OjU2NTQ1NTY4ODY4Njs6OTw9PTs6ODY2ODg6ODY3Pj09PT5BQUVCQkNBQUBBOj09Pz05Ojc9QUc8bKqmqKutsLGwrqupqKqrq6mpqamrrKytra2usLO0tbilgIdvaWdzdGZrcG1qZGxvcm5rbWNrcHyJhG5qbHx4Y3uKfnNqc25rcY+7ubm5ubm5ubi4ubm5ubm5ubq5uLi3t7e3t7e3t7i5ubi4uLe2tra3t7e3t7a2t7a2tra3tra2tbW1tba1tLS0tbW1tra2tra3t7e3t7i4uLe2t7a2uLm4uLe3uL6+uLq9vcfb4OHg2Nnd4eHg3dfKwcPCurm5uLe4uLi3tbS0tLKysbGxsLCvr6+vr6+vr6+vr66ura2srKyrq6yqqqmoqKmppqepqaehpaipqamoop+hoZyip6inqausrK2ur7Cwrq2unXdwbGphY2BZUU1RTFJGQzlNUEU+ODs3Mjc5Njc0NDM1ODg3OTc7OTo9PTw6Ojk3NDo5ODY1OD8/QEI9RENDQ0FDQEJBQDtAP0A/PDw6O0NIPWOopaWlpqioqKenp6ipqqmoqKipqqqsra6wsLCztLW1taWYdn5xZmt4cW9tZmVsaGNsZ2ZpaX11bWlvfXZ5hWZod294b3Fvcninu7m5ubm5ubm4uLm6ubm5ubm5ubi3t7W1tba2tre3t7e3t7a2tba2tre2tbW1tra3t7e2tbS0tLS0tLS1tLS0tLW1tba2tra2t7e3t7e3t7a2tre2tre3uLe2t7i4t7i4uLi4wMXTyry8w83PyMC9urm5ubq6ubi4uLi4t7W0tLSzs7KysrGwr6+vr66urq+vr6+uraysrKurrKysq6ehoJ6gn5udoaGdlpmkpKaon5mZmZmanZ+gn56fpKqtrq+ura2srJl1cGlrY2FeXVVOU0tSREQ4TktHQTo4NTI2OTY1NDczNzc3ODk3OTo7PT0+ODg4NzU6OTk1OD9AQEFEPkZBQkNAQkNCQT88QEJCQD0+OjpERj5cpqWmpqampqanqKenqKioqKenqaurrKytra2ttLS0tbekc311bnONf3JmanFjaW1jaGZobG51aV9jZ3VzdnpuZ3Bwcn56cYihu7m5ubm6urq6urm2s7a1uLm2trW1tra1tbW1tbW3tra3tra2tbW2tbW1tbS0tLa2t7e3tbS0s7O0tLW1tLS0tbW1tra2tra2t7e3uLe3tra2trW2tbW2tra2tra2tra3tra3uLi3uri4uLi3uLi5ubm5urq6urm4t7e3t7W1tLS0s7OysrKxsbCwr66urq6urq+vra2srKuppaSmpqScmZubmpmampmXl5eXl5aZm5iZmJmZm52en5+dnJ6gpKWko6OioqKQdG5jcGFeXltUU1RIVEo/PFFCRkM7ODYzNzo1NTQ4Mzg5OTc4OTc7OTs9Ozc6NzU2OTk4NTg+Pz9ART5CPz9DPzxBQUI/PT9EQT8+PTk9Q0Y/VaSlpqanqKeoqamop6ioqKioqKiqrKuqqaipq7W1tba5o3eKcXKHhnd0cGh5a2JjYWVsaW5zal9jZWNjZWprYmRqbHaXjX6ovbm3tre5u7u6uLWxrKurqq6wrKyrq62tq6uvsLGvr7CytbW2t7W1trW1tbW1tbW2trSvr7O0tLSvra6vsrW0tbW1tbW2t7e3t7e3t7e3t7e3t7Owsra1tLa2tre3tra2tbW1tra3t7e5uLi4t7e3uLi4ubq6urq5uLi3t7e1tbS0tLS0tLS0s7OysbCvr6+vr66vr62oo6KgnJqampqZmZqbm5qampqbmpmZmZiXl5aYmZmZmpycnZ+foJ+goKChoaCgoJ+fi3RuaXRdYGZeUlRLRFRJPUVTSEVCOzo0NDY5NDQ1NzM4ODg3ODk5Ojs7Pz04OjkzNTg5NjM5PT5AP0A6QEJCQkA/QEJCPz0+QUFCPz06PkVDQFGjpqWlp6inqauqqKaoqKipp6ioqKinp6ioqaq1tbe3t7KZtH99kIx1Z2lqbGZjYGNoZW94cGlicXx5cGpmZmRma3NqhYystrKwra2ttLeysLCtrKuqqaiop6ipqampqKinqKipqaeoqqurra2sqqytraysrq6traunpaSnqqyopKOkpamwsbGztbW2t7i3t7W1tre4t7e3t7Kppaasq6ivtLa1s7W3t7a1tbW2tra3t7e3t7a2t7e3t7m6urq5uLi3t7Wxs7S0tLKxsK6sq6yurrCxsK2rqqmqqKijnJqZmJmYmJiYmZmZmZmZmpqZm5ubnJybmZeYmpqcnJydnJ2foKGhoqKioKGgoKCfnop1amtuWVxhVktPREdVRz5PV0hEPTw4MzQ0ODQ1NDgyODk4ODk6Ojw5OUA8Njk6MzY3OTE0PD8/QEBBOkNGRUJBREJDQTo7P0FCQz9APUBEQ0BPo6empaemqKqqqqakpqenqKioqKimpqaoq6uttba3t7e4rbJ1cHuDdmBiaWtiZWZhZGdmfYh5bHKAfXFvcXhjbW5xZo+srKurq6ysra6urK2trKyqp6WmpaWlpqioqKiopaeoqKioqKeoqampp6Wko6KioqOioKKioaKhoKChoaKjpKOjpaWlqLC0s7OzsKuqqaqztLa3trGopaOioaGipKiqqairs7Sxrq6xs7W2tra3uLi3t7e3t7e3t7a2uLe0sa6ppqerrKmnpqWkpKSkpKWnqaajoJ+enZycm5uampmZmJeXmZmZmJiZmpqampqampqbm5mYmpydnZ2dnZucoKGgoaOjoqCgoKCfnp2FdGtsaFdYU0pHTUVITUdAU1dGRz09OTM2Mzc0NTU3Mzg6Ojo6OTw9OjpBPDY9ODM3ODgzNztAPz9AQDpCRUNAQkRDQT87PEBDQkNBQDxBQ0A9TqKnpqanp6mqq6mkpaWlpaaoqKippqanqKmpqrW2tre3t7izc2h7c2JnamtpaWJhZGloXV1tfHJma3J/fHR8bm1zc36gqamrq6uqq62trKusq6mpqKWjpKampqWmp6eqqaamp6enqKinp6iop6WjpKKhoaGhn5+fn5+fn56foKGho6Wko6OkpKSmp6enpqWkpaampqeqraumpKKhoaChpKWlpaenpaeoqKalpaivtLa3trW1tra1tbOwrKupqa6rqKWlpqampaSkpaWlpqWkpKSkpaKhoaGgnp2bm5ucm5qamZiXmJiYmJiZmpmZmZmYmZmZmZqZmZydnJycnJybnJ+fn6ChoaKgoKCfnZ2cgHNrbmReU0pITUZETEtFRFFTQ0c9PDgzNjI4NDY0NjQ4OTg6Ozk7Pjw5PTs5PTczNTk2NTY8QD0/QD88P0JDPkJCQj89Pj5CQ0FFQD86PkVAO0+jpqWkpqeoqaelpKWlpKWnp6eoqKanp6alpqa1tba2trW2uYptcW1vfHxxZ2pmYGFsYFROW2hqbm9tgYJ9cWdxdn6aqKeoqqmpqqurrKqqqqimpaWkoqOlpqalpaWmqaqppqWjpKWmpqSjo6KioqKgoJ+fnp6cnJycnJ2dnJ2en6CioaKjo6KhoqKkpaSioqOjpKSjpKSko6Ggn6GipKanp6ipqaelpaSipKSlqK2wsKyrqqusqqmnpaWmpaWlpaalpqioqailpaWkpKSlpKOjpKOioaGhoqKgnp2cnJubm5qZmJiYmJmam5mXl5eWlpeXmJiZmpqcm5qampubm5ucnJ6goKGgnp6enpycm356bnJiXlNNSlBFRk5NQkBPRT5JOz01MzYzODM2Njc1Ojs4OTs5Oj49Ozo5OT03NjY5NjU2PkI+PkE/PT5DQT5DQ0BAO0BAQkJCRUA+Oz5FPzxQoKSjpKOjo6SkoqSlpaSlpqamp6empqalpqaltLW1tbS0tbiBaHx9ZXOCemxwdWFfY1ROT1FbaGxpbGxxbW5xbnScoqSnqKioqauqqqqqqaempaSjo6OjpKSlpqalp6ytqaShnp2eo6Shnp6foKCenJ2dnJycmpqam5ucnJubm5ydnp6foKChoJ+goaOioKGjpKSjoqSlpaWkop+go6SkpKapqainpaGdnJ+jpaipqainqKioqaempaWkpKSlpqampqampqenpaWko6Ojo6KioqGhoqKhoqOkop+enZ2cmpubmpqZmJeXmJaWlZSUlJWVl5iYmpubnJuampqam5ucm5ucnp+fnpucnJyam5p/fnF0YFtUTUdNSEZMSj8/TkM8QDs8NDM4Mzc0NzY3ODs9ODo6OTk7PTs7ODk9Nzc4OTU4OD9APT9BPjs9RD89REA/PzpAQUE/QUVAPjw8Qz88Tp2ioaKioKCipaSkpKWlpqenp6empqampaampbW1tbS0tLS3jHalsXdmc3Jvc2xjZGlYT1JRT09dgG1kYFptkZGSoqKjpaampqenqKiop6alpaSjoqGhoaKjpaempqesrKemoJ2cm6Ghnpuamp2cmZiam5qampmZmZubm5uampqampucnZ6goaCfnp+hoJ6foqOko6Omp6inqKWioKGhoaGkpaWlpKCcmZmbnqOmpqampqanpqempaOlpKWlpqiop6enpaWlpaWkpKOjo6KhoqKioqKhoaKjo6Kgn56enZybnJubmZaUlJSTk5OTk5SUlJWWl5qam5ubm5qZmZqanJ2dnZ2dnZuampqamZqXf3dvc11aTkhKTkdFRklERU5APD09PDQ1OzQ2NDY1Njc5Ozg5OTg5OTw7PDc6Ozc4ODg1ODg/Qj9BQTw+P0A8PEJAQT49QT4/Pz1CQUA6OkA8PE+doqGfoJ+dn6OkpKSlpqeoqKenp6ampqampqW1tLS0tLS0tbSXtqd1Znh2Y2xjY2VjW1JTU1JNXqCMeFhodpajnp6hoaOjo6OjpKSlpqalpKSioaGko6OjoqOlpqWmpqenpp+bmpuioJmWlpWam5mXl5iYmpqYmJqampqbm5qZmZmenZ2goqOjo6KkpKWinqGhoaKjpaampaSjoaCgn5+hoZ+goJ2amJeZmpygpKOjpKWmp6alpaOjpKSkpKWnp6ampqampaWmpKOjo6SjoqKjpKGfoKGhoKGgoaCfn56dnZyamJeVk5KSkpKSkpOTkpOUlZaZmpqbm5qampqbnZ6enp2cnJybm5qamZmZlH10bHReWk9IRUdGQkVORT9GOzo+Pzs0Njo2OTM2NDY4ODo4OTc4ODo8Ozw5Ozs6OjY3ODk5Pj9APjw9QD5AOjlAQT89QT8/QUE+QUE/Ojk9PjpQnaCfnZucnJufoqOlpaWlp6iop6ampqanpqantLS0tLOysrGwsK2rkHiGj36bmn93Yl1TUlFRTGKgootaiKCgn52YmZycnZ2eoaGgpKenpqWkoqGjp6alpaKipaampaanpqagm5mboaCXk5OSl5qcmpeXl5iampmampqam5qYmJmaoKCgoKGfoaKipKamop6gn5+goaOko6Khn56enpyanZuZmpqZmJeZnqChoaKioqKkpaWmpKSkpKKioqKkpaWlpaWlpaalpaOko6KioqGgoKGgnp+fn5+fnp+foJ+cm5qZl5WUlJSTkZCRkpKSkpKSk5SVl5iZmpmZmpqam5+fnp2cnJycmpmZmpiXl5F8cmdxXl1QRj9BRD9KT0JCRjhDRT4+OTg7Nzc0ODQ1OTo6Ozk3OTo8Ozo8PT48PDo2NzY5OD4/QT47Pz49PDg6PkFAQUE/P0FCQERBPjo4PkE8U5ycm5uampycnaGio6KjoqSmp6alpaampqSjo7KysK2rp6amp6alpqiln6iop6qnoXmEXFFST0xcnKCAYpmgnp2clZOVlpeZmp2dnqGmpqampKOioqanp6ajpaampaWmp6amop2cnqGfl5GRkJSXm52YlpaWmJuZmpqampqZl5iam6Ghn56fnpybnJ6goJ6dn56fn6Cio6SjoqCfnp2ZlpeXl5iYmZubnqKioqKioqGio6WlpKOio6SioaGhoqOkpKSko6SkpKSioqKhoqGgn5+gnp2enp2dnZ2dnp6em5mYl5WTk5SUk5KQj5GSkZKSkZKTlJaXl5iYmZqampyenZ2dnJubmpiYmpmXlZaNempmamBiTkY+P0A9SkVAQ0A7QEE8Ozs5Ojc2NTg0Njc4OT04ODs6Oz87Ojs8Ojk6Nzc2ODs7Oz08Ojs8PTw3Oz5DQkRDPz1BQ0FEQT88OkBCO1eZmJqamZmam5ucnp2foqKhoqSlpKSlpqSioJ6op6alpqWlpaemp6ampqakpaanqKehqXJOUU1KVJahenKanJyenJeVlJWWmJiXl5qeoqKhoqOkpKOjpaalpaanpqSlpqalpaOgoKGhn5mSkI+WmpmenJaXl5eZm5ycnJqamZeZm5uen52cnZyZmZqcnZydnp6fn5+hoaCgoaKgn56bl5WVlZeanZ6fn6GhoqKio6OhoaCgoJ2cnaGioqOkpKOioaSlpKOko6SjoqKioqKhoKGfn52cnZ2cnJ2dnJ2enpqXlpaVlJOTkpKSkpCRkpKSkpGSlJWWl5iYmJiam5ycnJycnJ2cm5mYmZiWlJWXi3hsY2RiZFFHQT1DO0tIRDo7Ozw+OTo6OTo3Mzc5NTo4ODg8OTg7OT09Ozo7Ojk8PDc2NDc/PDo9Ozw/Pjw7ODxBQ0FDQkI+P0NAQkFAOj9APztZmZiampqam5ubm5ydoKGhoaGhoqKioqKhn5+dpKWmpqenpaWmp6ampqWkpKalpKSkpaaGUFJQT0+PmHB6mpubnJ6cnJycm5ubmZiYm56dnp6foKOkoqGhoqKio6SkpaalpKOjoaGhnpyalZOUmJuam56amJiYmJqcnpyam5iWmZybnJycnJydmpqbnJ2dnp6dnp6fn52cnJyhoaCblpWVlZacoKGgn5+hoKKjoqOhnZuZlpaWlpicnqCip6ikoaCgoqOjoqKioKCgoJ+fn5+gnp2cm5ucnZydnJmanJuWk5KSkpKUk5KSkpKSkpOSkpKRkpSVlpeYmJiYmZqcm5qbm5ucnJqZmJiXlZWWl4d3ZGdoZGJNQ0U8RDlJSkU5Ojs9PTo6ODg6NjQ3OTU8OTY4OTc5PDs7PDo6PDs6PDw4Nzg3Pj07Pj46Qj86Ojo/QURCQ0FBQD9EQUFAPjpAPj06W5qYmZqbmpubm5uen6CgoaKioKCgn5+enp2dnKWkpaanpqWlpqakoqKio6Oko6Kjo6KnllRYVVJOZ21rgZ6am5udn6Cgn56enp6dnJ2dnJ6enp+goaCfn6CgoKGio6Ojo6OjoqGgnpuZmZiZmZmamZienpiYmZmam5qWlZeWlZicnJ2cm52dnpybnJ2cnZ6bmJqeoaGdm5udoKKhmpWVlpaZoKKgnZueoKGjop+em5eXlJKSlJeYmZ2goqenpaGgn56goaGioaCfnp2cnJubnJubmpqZmpydnJmXmZaVk5GQkJCPkZKSkpKSkZKTk5OTk5OTlJWWlpeXl5manJubnJucnJqamZeXlpaVlZSEcmZsYmRbREJMPT84RktCPEA+Pj05Ozk6PTg1ODg2Ozg1Njo4PDw7Ozw8Ozk8Oj09OTU4Nzw5PD87OkE/Ojo6QEBDQkRBQ0A/Q0FAPj08QD09Ol+al5mamJeYmpycn5+foaGhoJ+fn56foKCenZ2lpKSko6OioqOjoZ+foKGipKOio6SiradXXl1UV19ua42dmpqbnJ6dm5ucnZ+enZycnJydnZ+goKChoaGgoKGgoKGioaGioZ+enJqampqbnJqZmpuZnJ6ZlpaWl5eTjo6QlJabnJuam5udn52cnJycnJ6dlpSZnJ+in5ycnZ+hoJuXl5mZmpycnJubnZ6fnZqXlpaWlJOTlJiampqfoKGmpqWgn56fnqChoaCenJubnJybm5ybm5qZmJmZmZmXl5iVlJKQkJCQj5CSkpKSkZGTk5aYl5STkpSVlJWWlZaZmZmam52cnJyampmXlpaWlpaQgG9vZV5gV0BKSDg/N0lFP0VBPD07Ojo8Ozs3NTs4Njs3NDY6Oj47Oj0+Pj07Ozs+Ozo4Ojk5NkBBPTo8PTo6OT9BQ0JERUM+P0FBPz8+Pj89PDtgl5WXl5aVl5mbnqGhoKGioqCenp6enqCgn52bpaWkpKSioKCfoJ+dnZ+hoqOjo6OkobCjXWVkYGFua4GenJubm5ubmZianJ2enJubm5ycnJ6ipKGeoKGhoqKhoKCgoaGgn5+enJqZmpubm5ybmp2dm5manJiXlZWWkY6Nj5KYnZycm5ycnqCdnJucnJyempWVm56foZ+dnJyenp2cmpqampqampqbm5qXl5aTkpWVlpWTlZaam5qanZ6foqWjnp6fn5+en5+enZ6fnZycm5qcmpqbmpiZmJiYmJiYlZSTkZCRkJCQkZKTk5CRk5SYmZiVk5SVlZWWlZaXmZmXmZqenpyamJiXl5aWl5eYjX1ubV9lVlRFSzw3PjdSRUM+QkE4Ozw7OTg6ODY7Nzc6Njc5Oj0+Ojw8PT49PD06Pz06ODw9OTtBPj4/PT45ODs/QkNAQ0VDPT9DQj5AQD5APTw8YZWSlJWWlpeanJ6goKCgoaCgnp6enp6gn56em6WlpKSioJ+fnp2dm5mbnJydnp+gn56rmGNpbW5pZm2enZybm5ybmpmZmZqam5ucm5uam5ygo6SgnZ6en6CgoKCgn6ChoKCfnpuamZqam5qbm5ufnpyZmJqamJiYmJKOj5OXnJ2bnJ2cnJycnZycnp6dnpqVl5ygoaGfnp2eoJ+cnJuampqbmpqYmpmVk5OTkpOWl5eVlJiYmZucnJydoJ+gnp6enp+fn56en6KjpKKgnp6cm5qampuZmJmZmJeXlpWUlJORkZCQkZKTk5OSkpOUmJmYlpWUlZaWlpaWl5iYmJiXmZqamZeXl5aXlpeWl4l4dmddX1dURUU5OTs8WT5AOEI/OTs7Pjk4Ozg6Ozc5OjU4OTs9PDk9Oz0+PD0+Oz8/Ozk+PDw+Pz5AQUE9ODc7QkNFP0FFQz1AREJBQEQ7Oz47PGKWk5SUlpWUlpiYmZubnJycnZ2cnJ2en56dnJqkpKSkoJ+enpybm5qZmJiYmZucnZ6cpolla3R4bVuFop2dnJydnJqbmpqampydnZ2bmpuboKKinpucnZybnJ2enp2dnZ2fnpyampucnZybm5ycnp6cm5qanZqam5yVkZOXm52dnJ2fnZycnJycnZ6fnp+cl5idn6GhoJ6cn6CfnJubm5qbmpmZmZmZl5WWlZaYl5eXlpaYmZuenp2dn6GhoJ+fnp6fn5+dn5+hoqKhoZ+fn5yZm5qcnZuampmXlpaYl5eXlpWTkpGTlJSTlJSUlJaZmJaVlZeZmJeYl5eXl5eYl5iXl5eXlpaYl5eVl5eDeHZfW11eUT1GOjk4P1VDQTtDQzo8Pz86Ojk3Ozg4ODc0ODk8Ozw4Ozs8PTo9Pjo/QT06PTw+PkA/PUBBPjk2PERDRUBBRUU9PkVERD9COzo8OTpkl5SVlZaUlJSUlJWXmJiamZqcnJydnp6dnZybo6Oko6CenJuamZqZmJiYmZiam5ubm6WJa3F2em9lmp+enp2dnJybnZ6dnJ2enp2dnJydm5ygoJuampubmpudnJqampucnJuZmZycnJ2dnZ2dnZ2dnpybmp+fm5ydm5mZmZudnZ2dn52dn5+dnJydn5+fn5uanZ+goJ+dnJ6gnpubm5ubm5yampuamZudnJqZmJeYmJiYmp2foKCgoJ+hoaGgoJ+en5+fnp6foaKhoJ+enp+enJqam5ubmpqZlpaXmZmYmJiWlJOUlJWVk5OVlZSVlpWVlZSYmZuamZaWl5WWmJiWl5OUlJGRk4yRkJOWfXhqYWJiXFA8QDw2OENWSERCOjg7Oj47Nzc5Nj06OTk2NDc6Ozw9OTo6Oz87PT08QD47Oz46PT89PkBBP0A8NztBQ0U/P0REPj9EREM+Qj07PDs6Z5aTk5OTk5OTlJSVlpeWl5aWl5mbm5ybm5uamaOjoqCfnpuamJeYl5eXmJmYmZybm5qkgGpqb3lzcZegnp2dnJydnp6enp+enp2cnJydnp2bnJuampqam5ubmZiYmpqamZmZmJqdm5ydnZ2dnJ2cnZ2cm5qdn5ucnJubnJubnZ2dnJydnp2enZydnZ2cnJ2dm5uenp6dnZybnpubnJycnJydnJubmpmbmpmYmZmYmpmZmpyfn5+jpaKfoaKioaGfnqCgn5+fnqCioaGhn5+fn52ZmpudnZqZmJWWl5aVlZaTkpOUk5STkJCSk5GUkY+OkJGOlZabmJWYlJmXlJiRjJCPk5yTkoyFjIeDhndxZ2pkW1xRQT44NkJHYEJFR0A+Ozw7Ojg4NjU8ODo4MzQ6Njk9PTk5Ojs9Ozw6PD48Oj5AOj5APjw/QD8+PDg6Q0FEPz5CRD8+Q0VCPUJAPDw8OmeYk5KSk5OSk5SVlJWXl5aWlZaXmZmZmpqampqkoqCfn52bmpmYmJiXl5iZmJmcnZ2cqH1nZXN7enOJop+enp2dnp6enZ2enZ6enp2dnZ6cm5ybmpubm5ucm5iYmJmZmJiZmZmbnZycnZ6enp6enp6dnZybm52bnJybnJ2dnZ2dnJ2dnp+fn52cnZ2dm5qbnJmZnJ2dnZ2dm5uanJ2dnJycnp2dnZybmZeVlZeXmJqam5ubnZ6foqOhoKGhnJucm5ubnZqcmZycn6CfnZiZmZmUkpKUl5SPj4+OkYyNiYuQi4mLjpGRj4mQmJiQkoyNi5KQj5iYoqiqpqWlrKOmoZqep6eyqKKVo6Cfl39wcWlsXFtcTUY8NzdHR1g+SE5URjk+Ojg5ODc1PTk4NzMzOTY6Pjw6Nzo8Ozo6Ojo8PDs/PjtAQD47PT5BPDw2N0A+QkA+QUY+PEFEQT1DQj49PDlmmJSTk5OTkpOUlZOVl5iYmJaXl5iZmZqampqaoqGfnp2cm5mYmJiYmJiYmZmZm5ybnKx/am16f3lxh6Genp2cnZ6enp6enp6dnp2dnZ6enJubnJubm5ubm5uZmJiYmJiYmJmZnJ2dnJyenp6enp+fnp6dnp6dnJydnJ2dnZ6fnZ2fn56goJ+enZ2dnZybnJ2em5qbm52enZ6dm5ubnJ2cnp2cnZqYl5SRjo+QkJGVmJSWlJiZmpudmJuYlY2Mjo6TkpKRj4mQjpGRjo+Ki42NjYiIi4+Lg42NkY+MkI2Qk5WVnJihoJySn6SipKmam5eanKOprb3Bwbq8uL26ucC8ubq3uru7tL2zwbV/bnVmZ1peWUxJRTo7TElTPFZSSUM6QTo7Ozc3NTo6OjgyNTY4Oz08OTk7Ozw5Nzo4Ojw6PT85PD8+PDw9QTs5NTg8O0A/QT9EPTxBQkA8REM9PT06YZOTkZCUlJOTk5OTlJeYlpeZmJmYmZqbmpqamp+gnp+fnJqZmpqampmYl5iZmZmZmZmphXB1e4B3b4mhnp6enp6fn56en56fn56dnp6fnp2dnJ2cm5ubm5ubmpiYmJiZmZiam52cnJ2dnp2enp6goJ+enZ6hoJ6dnp2enZ6fn56en6CenZ6enJydnZ2cm5qYnJuVmJqamJiYmJmSjJCXlKCXk4+MjYqKiImMiJORh5CPjYqKkJCLjoqMi4+IiImJjpGOjYaFiYaKhoWLiI+SkJCNkJKXlpKamJ2TlJ6kpqaqq7Gsr6+rpquqsbm5tbS0rqyvtMDIxcXBvsbDxMTDurW+t7a0s7C2tb6qcHRyXGZfXV1JRj8/RUtMVklcTEQ/PUI6Qzk5Nzc7OTk3MTc5ODo+ODg6PDw7OTc5OTs9Oj4/OT5BPDs+PD46OTY5PDpBPkNBQT08QkBAPkJEPj8+OVyHhIOHi42KiYaFgYqMkZOVmJiHlZaWkpiampmenZ+gn52ampubm5ycm5iWmJmXl5ibqo56dXZ7f3mCoJ+fnp+goKCfn5+foKCfnp2dnp+enp2dnJqbm5ybm5uYmJmXl5iZm5ucnJydnp6enpybm52dnZycoaGfnZ6dnZ2dnp2dnJiWlpaYlZWSlpmWk5GKjI+PjI+NkIuLj4+WiYiEi5GZjn2Fi42PjYyHioyQm4yRj4+Lio6TjIyNjIiSi4yFiYyPhouIh42KhYyEj4qXkJOYmpWbnKOqoaKknKKrsbe0ubWxs62vsrKlp7O6sbq6vLa3tsDDw729vLa/urq8wbW4wL60r66mqa+3mm58Z1tjWl1fSEU+QUtJU1hZXkFGOTk9OkY/Pzo3Ozs7NjM6Nzo5Pjg6Ojw9OTk4Ozk7PDo+PTtAQDs8QjxAOjg0Nzw7Qj9BQj4+O0NEREBDQz0+PjlhmZWLkYWNj5aSiHl9e3+Fi4OKgoqJhmuAeJCLlpqRnZ2UlJGTlpeampiWk42Sk5KQm5uIdndzcX1/cpGgnZubm5yenZ2eoKGgm5uWlpucmpybnJuYmZqYmJmampqWi5CTlpmYlZiYlpucl5WSkY2SkZCUk5KXm5mYm5ePjpCLjo2Ch4uLi4qLiI2RjIeHhoqIiZGKh4yEhYqNi4qNhI+UkIyDkJOUmZWQi5OTkZWRlpWOj5GMlI2Oj4qIj4ePhoeJiYmNiomJioWNh46JmJKUmpuXmKChp6Cko5qqqbO2sbWwqKmiqK6tn6qvsK21ubi8wr/BxLixtbCutrOwuL68ury+urOzp7G3wpB1gGNiXlpXUk1IRkVQSVlXX1tDUDpCQz1HRj84Nzo6NzU1OTc8OTw5ODo9Pjo6Nzs7Pjs7PTs9P0E7Pz48Pzo4NDM3OkFBQEI+PjpDREM/QUM7PT45Z6mloqKZn6CippeUiI2CiIJ1h4iKiIp7e3Z7enmPeoiSfn18en6CkYWBgH1zfH99fISHfnRweHZzfHaBj4iIiYeIioyMkZicl4iOhIuNi4iNkI+Pi5GPi4yOj5CQjouFhYeLjIyHiIuOi4eMhYaBjYuGiop/iYqGiJiRiIOIg4KFfIuLjIaJi4iKkIyIi42PjI+Wh4mLio6NjY2Wk5OdnJyalpycm56bmpuYnZeTkZWWkJKRi4+LlpSMjYqDi4SEiYyQkIqOio2LipGJjZOTk5SVk5KcmZ6Xn6CfpaKvsamupKSfmKStpqa4t6ysu729wsPAv7+vpa2wsLS3uLO0uLa0ta6stK+4tLaBeXpjZmBeVlBRQUVMT0lcXl9UR0dCS0xCREA9ODg7OTU3Nzk3Ozc9PDk9Pj05Ozg6O0A8Oj06PkJBOD88Oj84NjQyOTtCQD9CPj04QEI/PkBEO0A+N2CloJqXnaGaoaCPl5efl5WCjaCfo6GdmpKOjIxycXBvdnFucG1ucHZub29waHBxcHR+c3FycXd7cnl2d3Jyd3Z6e3l8fXt/iIGEi3+PkYaNi4uGiouLiYaEgYaCgIKJkYOAg4x/ho+LiYWAh32AgZKQhoSEho2DhIyPj4+IjY+Hi4iRkJWRjpCKk5eOj5WYp6SfnZWYlpaln5udq6aqt7W4srGnr6qnpqGfmp2WkpWVkYqPjImTjZuVjYuLhoaJjJWQkJCLmZKVlZSbkJiTlIyNkYyWl5WilZ6mqauno6OqsJucpp+mq6G0vb6zs7+5u7u6uby9rqiusa6wuLyztLGxqrCpqLGxsqild3J0X2hhYFRWUUlKSFZNXl5eVExKRVFKRUdDPTo5OTc0ODY4Mzg4PTo9PD47OTs4Ojs/PDw+OT9DPzg7Ojg8Nzc2Mzc5RT4/Qz89N0BAQT0/RDw+PThUj4yGh4eUjJWZl5yWmZaNlZyWlZydoKCdmpiWeHFubXJ4cXFsbnJwa3FvcG1yc3t1dnd5fnVxeHZ0d3tybn98gX15eH1/eYOGg4WCg5CLkIuLi42Pi4mJhYKBfX9zfYiAfpyQhIWFiYuPinp9fYaOjYqGjZSRi5CXj5SXkpihlp6XlZunpp+goKawq6GjpbW0sqqmqq+isba5vcK7ucO+vLi9uLWxrLCspZuSk5mfm5SPk5WOmp2doJqfn5edo6qsoZ+em62hp6qwqaampJiRkZWUo6SirKSss7Szs6i3tru4sLKvra2yt7a6srW6s7e5u7i8urayr6yxsbKztLOxsa2us7Gzs6yhl3Zxc19jXlJRVE1PSUdYT1pcZFROR1VPRURKRD44Ojg3NTg4ODU5Nzo6PTw/Ojg8ODk5PTs9PTpCPj84Ozo5Ojk4NjI1N0I+P0RAQDY+P0I/PEM8PT46Tn98go6MjJOTl5eaj5SWjZaRkZSXk5qanqGdnHJvcnFxcXFxcG5zcW91dHJxdneAdXd8eYV+d3t8eX1/fICJiYmDfXp/h4GIiYGAgIGGiIGGi4aIhYSIiImEf4J/enx8fX6SkH+IeIGFi4qDhIWKj4yNkZmdlJSUoJqan6Ktsa2ppKWtr6ysrLWuvrmtrqm1sLexq7G2rK+9wsLAvrq8trKutraxtK66u7OurKepp6unoqmtoKmooq+wuLSxvLq6urK0ta+8tLezt7e7t7mtrbCprLW5sbeytLe2sLu7vLu6ury1vLi0wbWsqqqrtLG3uLm1trSzsKymrrCqq7Cxq6yusLKxtK6qo5N4dnJlZ1tMUlBGTUhTV1JlXmdUUExcUUhMUkNBOTk3OTU4ODY2Ozc5Ojs6Pjk4Ozo6Ojw8Pj08RD45Njs7ODg+OTUxNTZCRkREP0A3Pj5DPjpBP0BAO0t/gomXmJSdlpabmIuSlo6XkZGVl5SZl5+bmZx8dHV2dXl1c3RudnJzdHV2d319gX56gXyDfoJ/fYB/hIKFj52RiYF/go+Xjo6HgoCBiIuFfoqQi3+HjYyLioeSioeGjZGTkZGEh319g4iMjouOiomQj46PlJSYkZWcmp2dqK6yr6+1tLOtsrW4sLy1tbGqsKqztbS7t7SztrS1r7i4t62noqassLCvtre3vrW5vLOysa61u7C0r6+yu7axuMC9tLS0s7izvLq2tLrAvbm6ubq+ubm5vrWysa+yr6q1tLGzsbSzrri4tb+vpKaoo6ussa+zrq6wsKytq6qroqKmqKKnrauqpaynoqeYeHlxZmVZT09NSVJNV0xPX15cTlVVYlFEVE07Pzk8ODk1Nzc1Nzk1Ojo6OTs4Ojw8Oj08Pj4/P0I9ODY6Ojk6QDs1MjY2QUZDQz4/Nz49Q0I5P0I/PjtLjpGTmJmVmZGTopiTkpKLk4uOkI+Vl5ablZSbhoJ9enh2dHRzdH53end2gIKDhouMhISFioaQiYeRk5aRjZaalY+IjI+emJaVkpCTl5qamJCdoJ2Tl5qgmZ2bo6CVkJugpKOak42IiIuJkZGOkY6LmJqPj4yUmpecnJufnKSstLm6vK+2tLi0tLK3uLmzq6+qqKy1srK1rrGrrqa3s7OxpaGotbCvrayrtbqyu7q6tLK3ur67ubG4sLmtqLK4u66ttLS3tbu2trm5vLe0r7G0t7a5s7e1pq2pq6ior6yprq2up6KxtLG0q6aop6Cjq66oqq6orLKwr6+pqKGeoaGjpqOgopqlo56ol3J3bmdiVUtUT09KQ1BLX2JYWlFcVGBNSFJJQUA5Ojg2Njc3NTg5NDs5Ozk8Nzs+Ojg8PD0/QkBBPTs2OTk5Oj87NjM3OD5GQkJAQjk+PUBDPkBGQj44R5OWkZWTkpSQkZ+ZnZmVkI+Sko6Mk5aWko6RlZGSkIaBeXJzdXuBhI6HhZGTkpicnJiVkJWYo5yaoaeqqZ+clpeVnaKioZyZnpmlqKyvramnqqmop6GlqKirqamvoZufoaOjoJqfoJyUjZiUmKCgoaSem5qkp6Spq66spaOoq6+xtK6qrK6zr6ystLO0ua6urayqrLKwsK2wqKqmsrS0uK6qtrqwr6qurLC3s7i0t7W0u7y4tbWxtauyrKiys7uvrbGytLa1sbG0s7OvrKuvs7a0sayutKqqpqWnrauoqKupqqifqbOwqqeppaOio7CtqaatpairrayppaSioKWipaOYmZyVnqKippdudWVnZFZPWEtLSktTVHBiWWRXX1tcUlpQTEM8ODk6Njk4NzQ3NzQ4Ojw6PDg6PTk3PDw7PkM/QT47OTo5Ojs+PTg0NThBREVEQkM5PjtAPkI/R0Q+N0KSm5SVlZaVj46Wl5qZlZGKk5SSjo+SkYqKiY2Ul5qTjYmCho6VkZSfmpuin5+jnqGhn5ijpKelpaapqa2rqaKmpKilpKGfnqOjra2srairrq6qqqukoaKkqaenqaijopybm6SgpaijoJidmZ+hoqmnoKKirqyrqqetrqilpKmpqqmmo6iqqaekp66wr7Ovq7Crqq+yr7Czua+rqLCxrrCyubO0r62vtbCss7GurLW1tLSzs7CvrKyqrKusr7G0s7CwrrCwsKyqrauqq6alrrCysKumqbCvqaOkqaunqKaopquwq6mvqaaoqaalo6iwraqpqKKpo6WnpKGhoKKloZ2el5aYlJugpKmUbnNeamlfVVpOUk5QT1JkXGVjW11ZXFBZT0tAPDs5Ojc6ODczNTMzODo9OTo4OTo5Oj08PEBEPkA9OTo8PDw+Oz45NTo8QkFFQUNBOT47P0BEQENCQDdAkZ6YlJeZlpGHi5SSl5GIg4mLk4+OkI2Hh4SFlZmWmJeZlpqeop2anKKkoaCdn5qfoKGgpqGgoKCjo6KlqKmrramqpqOmpaCloKaopqWnqaepqKOnppmcpKaioaChoaCcmJmfoKGkpKKenpagm5qioqChn6CiqKCcn6GloaCmo6KfpKGspp6foaGkrKqnrKivq6e0sa6ur7WyrKqwq6mtrbWwrq6srreup6yqpKivsq+sq7Kvqqqpq6utqa6urrGxraqtqaunp6uoqauinaapqKilqKisqKilpKWop6iopqmsr6+oq6mhoqKlo6Opq6ymqKWjqKKhoKSdnZ+hoZ2bnZ+amZWcnKOqlG9zZm5yZF1dUFVPV09eZGRsaGJiWlpSVE9NQTo9Ojo4Ozk1MTYzMjg4Ozk5OTk7OTk8Oz0/Qz5APTk7Ojs8QD0+PDk5PEFBRUFGQTo9Oz9BQUJBRUI4PYqWlJOYmpaPiISNjpGSjIiIiI+JiZCRjoqKiJubmZygpaKlnqKjoZqeoZyanZ6bnKOop6ugoKOYoJ2XnKGjo6WjoqKkrKilqaCepqmnrKmkn6Kgoqahpq6mpp2fn5+fn5manJyhoKGkn6GbnZqcoJ6hn56eoKOZlpqYo6KipJ+ZnKGhoqCbmp6goaSgnaejqrGorqusqaSqqquorKalrKqws6+rq6mwq6appaWoq6ynpqevq6Wnq6upq6irqqqrrailqKOmpaesqayoopykoaOmo6qpqKano6SnqKanqKepqKupoaKoo5yepqWjqKino6WlpqmgpJ6inpeYnZ+doqKlnpiUlZ6go5d1d2t2d2FfXFVZUVVWW2Nec19oX2NTUVlUSD48PTg7OTo4NTM3MzM0Nzo4OT05Ozo5PDxBQEM9PT44Ozw9PEA/Qz86ODo+P0NAREE6Oz48QD9DQ0VDOTyCmJmenZ2alZKKiZGRl5GQh4SJgoGNj4+Sj42cnZ+hpKmlqaeorK2moqKfmKSmo6Stsa6yp6asm56em5qjp6Cfo5+foq+qqq2oqKuwqaiqqKGfoKeprbCyr6yjoqahqaWepKOipqClpKKlo56doJ6fpaKinp+imJWemp6fpKGblZigoZ2enJudnZuZmZWen6Oonp2iqKGaoaOmoqSoqaqoq7CxqKWlp6eopKWpqaqnoqWmqKadnqWloqClpaOlpqCjpaOjpaelqamqpKekpqKmp6SrqaenpKGlqKynpqWlo6OopJWdo5+bnaCjqaeopqGjo6mooKiioJyVkZqfoKGmopuXkpCamqCVfHdvfXlmW1tgX1pcVlxoZG9jbmlpYl5QUEA/Ozo4OTg8OzYzNDMzMzc5OTs8OTs7OT49QkBAPTs9ODw9QD08PENBPjo4PT9EP0M+Ojk+PEI/P0FEQjk6gJ6kp6Kem5+gmY+ZnaCWloqGj4iEi4qTl5SRo6Wnqq6trLOys7S4t62pqqevtLKxqq6usbKusa2lq7OssbGpq6+rq6y2r7Owq7GysaKfoqqpp663trS0trOvrKuuq7awqbKxra6npp6io6ObnZyXoqikoZ+eo5ueoZqWnaScm5aZoqefoJ+joJuUlpmWl5qfoJmVnqKamJ2dpZ2gpKeqqaiqraylqaSlqqeqqaqsp6SkpKOimZmhnpqaoaCfpaWYnqSmpKqooqelpaGqp6mnp6ejqKWmpaGkqKesoqekoaalpaOVl52Ym5mVo6elpaSfnZ2lo6Kqo5+amZiXnJyaoaGakJOTl5ibjX93cnZ4aWJbX15cYllgZG5ta25hX2RgUE9BQDs7OTs4Ojk2MTQzNjQ3Nzc6PTo8Ozk9PUI/Pj89PDo/OTo7PD5BRUA9OTtAQT5DPDs5PzlAQEBAQkM7OXuao6OcoJ2dop2Zn6KioJibmJaYkpSQm5qWl7S0rrW4s7S4tre0uLm3tbm4ub28uKqLnLK4vLS9urW7uru4s7q/uLe5u7G3r6iusq2inJ+qsri8vL27ur+0r7GztbS3t6+1tLWysKikop+gl5Wal6SqpqahpKOkq6WlmKGko52goaKooaOgpaGck5mYmJmco56cmpudl5uZlqWam5+hqKmpqKuvr66pqKirrKytq6irp6WjoJyfo6Ojn6Cipammmpyip6Spn6GjoqKgpaanpqSooJ+ipKGjoqiop6OloaGopqalo5mbmJuTj6GknqKfmJiVoJuhpaCfm5udnJuamZugmo2YmZiTkYaAdnh5eGNbUllUX19hbWh1a3BnaWliWVNMQDw6Ozg5Nzk3NTU2Mjg1Njc3Ojw7Ozs7QD4/QD0+Pjk6PDk2Nz47QkZCPDg7P0NDRDw+OT43PkFCP0ZDOzhwkpqblJ6bm52Vl52doqajopaXnpaXl6GblJi+t7G4uba3t7i7l5S2vbu9vcDFtaK7mKC3v7+6wcm0nbu2sra/xcGooLa0urGqrrSxsLG0tba8vL68vL7Guri3ur20r7Wxsbq4t7Kzsqqmpp+YpKSnqKSupKurtbWus6CnqqynqqmlpqCnoKGmoZOWmJ2foqSjnZ6coaChnZekmpmdoKaqqqqtrq2tsLGrrK2sqamrrqimpaalpqSkpqaeo6eppKGcoKKjpqCio5+jpJ2foqWgpJyboZ6fo6GhpaSlqaOkpaKkp6ehn52elpOcoJiZko+MjJeWn5uWnJqdnJqSlpSUmJOQmp2YiouHgIB8gnhhXllTYWhgZnNvc2l0ZGlkYltMSz46ODg5ODg5NzM0NTI1NDY2OTw8Oz08P0E/QEA9Pj44OTs4Njc/OUJFQzw7PD5DREM9QDs9Nz1DQ0BFQjw3Z4yRk4qalZiblZWYm6Knq6aVl5iQlZmhnpeXvrWztLu6ubi5woeYt6u4u8DCxbOjw6e4s72/tMTHvbS7uL62wMTErqCworW2tb2+wcPGwsO5vb/AwL2/xL28ur2+tKeqmLHAvbi1ucCzr6+qqqitp6ekr6eqtLyxtLWor7Gwr6yqoqajrJ+fpquXmqifpaWfoJydoKuwsKyiq5yYm6Cor7Kys6uorre1sq2tqaalqKulpaStqaShn6Cnnp6mqKmmnp+anqGlpqmcnaObl6KmmpuanZ+cmqGcmZ2eoKijn6GfnaWioKOioZSZmpmTj4qLhI2Qk5uPjpiVm5eYkJORkomNl5iYk4uKi32AgIVwYGFeXmpiYm53dXZubFtiUVVcTUc7PDk3OTc5Ojc0NDQxNDM3Njg8Ozs8PEBAPUA/Pj8+Ojo5Ojc6Pz5FRUU8PT1AQkJCQUI7PDhAQ0NARD87NV+MjIaFlouUlZeYl5ifpqellpWVkZebn5ual7mxtrO5vLy5urWqsryxvsG0vMe5uLuuv6fGw7/KxsnIxcXJvMLHx7+xsKe8vL7FxMbJx8XGu8TAxcbAua+9vMC+vrOrqoyzu760tbfCuq2vsLWqq6aqo62kp7G2q7WyrbOtqK6vp6awr7Ktqq+zpKu1qaeopKCgnqmyuL61tbWqqaausre4t7apq7i8ubexr66noqOop6SfqKOfnqCZoZydoqSnp6GelJuaoKGlnqChnpajnZSQlpiboZqflpORlpSin5qenJudoZ6kn56VnJiPkpOPjImTkJefiZCWkZuUmJGRlZaDjJWXlpKLjIh8f4N/amZoYWtsZm51cXJ1cWZeX1xSSUU/Ojo6Nzg0ODw3NjU0MjMzNjU3PDo7PDs9QD4/QD48PTk5OTs6PDw+QkRFPj49QENDQ0REOzo4QUJCQUNAOTJbk4iEjZGKi5GRlZCSmp2fnJOSmJSdnZqXmpW2sbm1tb6+tri1uLO8vMTEusPHwb+0s8XFxr/CzcfLzsvLx8HDxsfIysXExcO7vLzBxcHFxb/DwsbFwLGTvrq/w8K2trqptLO0qauzu7uxn5uxr6ykrK60p6qpqKqtrKmlpZ6pr6uyu7q4u7e5t7O5uLOurLO0qrC1ub3Bur6+vL60urm4u7qysbS8u7q7s7Oyp6Smq6uioaCdmpudmpyXmpuenJygnZaclpuZnZ6io52UnJCNiY6OkZ6bnJWNh5KLmJiWmpybmJybnp6cmp6UjpiYmpSRmZeeoZWYmpKXlJWRlJqYk4+TnZaSi5F+enx/dGtrbmRvbWhxeG95amlhXGdhUUZEQTw5OTc2NDQ6ODQ2NTMzMjY1Nj05OTs7PT47Pj49Oz05OTs7Oz89QUNBQkFAPEBDQ0NFQjs4OUQ/P0BCPzsyV5uQkZCQh4WSjo2IjZCTlZGPjZSUm5STlpqRs7e4uLi+u7C1sri2tbbAw8G+w8LAvru+u7u8xMzEzNDLxsa/xcfLyNTLysjGv7u7vsS+xcjGxsPEw7i0wLe0vMHCucK3t7/Au66lrre8t62co7ewpq20tayupaWjqKSgoKWZqrOxvsG+urm6uLW0srG0tLO6wL7Av769u7u9vsDCt7a3tru7sru+ubi3u7a3tKyoqamrpqijnpOampyYkZKZl5GRmJqXnpiWk5acm5+elJOJiX6GiIuWlJiZkYmVkZeWlZmbmpaYl5idnpyhmJWZmZyYl5ybn56jnJ6WmJeTl5yZmZyUlp2UlpOJdnl6e3Zua2lndVpmcndzeWZnXWRbUlhJRj87Nzg4NzYxNjk3NDQzMzM2NDY7ODo8Oz08OD0+PDo7PDs9Ozs+PkRBQURCQEBBQkNDREM9OTlCQD8/QD89MkyWmpaSk4yKmJCKi4yOkpKKiIaNkJiKj5CUl7O7tba/vb2xtrjBvby0uL/Bsbi3vsHFvbu8wsbJv8jOyMHEwcfKysbKxczIzcbIxb/DwMvNz8rGxMPDwcS+uL7Bw8DEvsHPz87Gq6+2tLWroKe0s66ruLWzq6mjoq2prKatn6y1s7/Cvrm4vbawrausr7W0ur7Fv7u8urO5u7i5ubWtsLS9u7G/vLiytrmzubu0ra2orKyqqaeXnpualY2MmJSTi5WWlJyZl5WWmZKYn5mQiop+iYqKkY6Vl5OUn5mWkJSZmJmWmJOUm6GeoZiYmp2ZmZaenpibopqdnJuYmpuZlpeXlpyZlJyYfoB4eXV1ZWVpamddam9teHdjYmBgXlhXRkU4Ojg6OTc5NDQ5NzY2NTEyMzM0Ozo9Pzs9PTo6PTs8Pjo7Pz48QkBDQkJFQj0/Q0NDQ0RFQDk6QkFBQj5CQTVCkJeUlZmSj5qQjpKRjZSVi4qHjI2UiImPkpq2u7S8xsHEwr3BxcLAtLO9v6ywr7rDysPCvs3IxbfByMW/wcLIy8rCwsTJzM3Pz8zDx8bIycjIycfFycfIx7/Fx8TEx8jK0s/SzLy4trS4uMG+vrq9ury6vKytp6q7urm3wLK1uLLAxrq3t8Gzsa2tqau1s7u2w7a2vbWxt762s7e4sLW2v7uwvbq0q7CxsbO8urOzrqutq62xnaOjoJqQjpiXlZCclpaYlpWSnJmTm5+clpGUjpWQiYyQlZOUm56YmZKSnJedlJmSk5aZmJ2VnJ6do5yVnZ+TnKKcnKCfnaOemJSVl5ebmpmgkH99cXRxb2JhZ3VnaWl0bXhsXWRbVWBZTEhDNjw5OTg4OjUzOjY2NDQxMzUyNTs6PD47Ozw9PDs8PTw7PD49P0E/RUFCQ0M+QEFARUVERUE7Nz5DQkI+Q0I4O4+akZaalJKUjZCUlI6VlI6Pi4yJk4uIkJObt8C6xsXEw8zCwcS9vrWvt7uvr7O6wMfFxMHMy8W2ucDCwsTHytHLwsPExsnFzdDOx8zJwsHHwcvLyMbMys3FxsXDxsXJzdDNz8zHxMDDwsnNx8XBxMfBu760sbCwwb6/wca/vri3w8K6urbAvrWyrKmvsri+tMC0tLi0t7nEua+8vrm+v8K/tbq2q6qsrq+wt768trSura2utaSlqKimmpycnZyeopydmZOQkp2VmKCdmJiVmZmZl46MlH2QkJefmZmYk5GToI6Nko+VjpCUlaKdnKSem56elpyjoKGipKOkop6amZubnJ2enIN9cnx4cGdgamp2bGlldW90Yl1iVFdUU01HOjc7OTk3Nzo3NDg3ODQ1MjM0MjU7Ojk+Oj08Pz04Oz05OTk9PEBBQEVCQUJBQT9AP0RFREVAPDk+QkNCQENBOjSAoZeUmZiVkImUk5aTiZGMlJGOiJaKi5CXnMXLw8O8wMPHwbm9vbu4tre3rrK3uLzAwsDCx8bHurzAwsXHyMbSycHCw7+/vsTLyMrLyby61dbJzMjDyMnJxcXDwsHCx8fJysfMyMfIzcbLz8W3wMDAwLu6vbWzs7+/ub/DucC3u8G8uri7ub27srCvsKy5wri9ube1t7q9xb24xsjCwcLGwr28tamurrCwr7O6t7m2sK+tr7OppquprqannqSlo6OjoqCblZiekZecl5GRlZeZlZmRlJiSlYyYo5qcnp2FiZ+TfJKWlZKUlJennaCipJ+en56foaGkoqKjoaOinJ2fnqOhppl5enl/cnBmZWdkamVham1ub15ZXFZWTlBKRjk5Ozk3Njc3NjM3ODk1NjEzNTI3PDs8QDs/PDw6ODo8OTk4Pj1APz9GP0JBQz89QT5ARENDQTw5PENBQ0RBQDozbKKdlZedlo+PmJiZmIiSjZGVkI+Vjo6TlpbKy7u5urnBu7q3vsG8vLu5sa61uri4u8S6vsC+vru8wMXBxsK+xsK5u8O5uLm8vcHHwca5ysqcwcbDwMTBwsHEwcO+vcLAwMHCy8PGzMvFyNHCsL69uLq7vL63tLC5vrO8vrG5tbi7tryztbm2uba5t7GtusG6vMG/t73Ev8bDw8fHwrvAwr/Cv7iys7O1tLGut7S3tbSxrK2xp6Wlp7CtqJ+nq6ajqKWmpqCgn5SYmZSRkZWUl5OYl5qhnZ6hnKGdoaWglpSbkZeXmJqTnpmZqaSlpKWdoqCanqCkoqOcoqGjoJ6cnp6ppaiVfXuDeG5mYWRiYWJjY2piZ2NbWlpcWVFORT07OTo7Nzc5OTY0OTk6NTMxNDUyNzo7OkA9Pzw8OTc3Ozo5Ojw+QD8+RDxCQURAPz49QkRCQkI+OjlCP0FCPT44NVmfnJiTmZaRlZiYmpeQkZCQk5GTlJKSkpSUxce4tbq5wrm5vMPFwri7ubGxtry6tbnAu7u5tri0tLW/u73Aub66urTAuLW3sq66u7bAudqbfrzCvsC8u8S+u8HEwL6+uLzBwcu+vcnEwMDKwLHBv7u4u766tbe0uLy0vbi1tLCzvLG3tri/tr25vb65t7q+u7/Axb2+y8PGw8TAw762ubq2v7i7v7y4trOyq7CwsrWzs66sq6emnqeurauiqKumpqqjp6iqo5+Ym52bmpicnJiXnJuhpZ2anqGhoKGmoJqbnJiboJ+dnJ+coKeho6SknaKfmqKgop+el6Shop+dmpieqKWhi3x5iH1xY2BiYmdqZ2ZpZWldVlZUWU9TS0U4PzY7Ojc3OTs2NTo7PDYzMTM0MTc7OTg/PT47PDs3Njk5ODo7PUA/PkA9PT9CPjxAQUNDQT9DPTo2PEBBQDw9ODdJlJibj5OUkZWYlZGWkpWRkJGUlZSTkpKYlcHCwLq8ub62uL7EwMKxvbqytLO4vLW3vMC8vbS1sbC1t7W7wbi+ub+8vLe0t6+ut7W4vcnKg4Slx7rDtbrHuLa5u725ura7xcXKvbnFwL+8wb64xr3BwLzFuLa3tLi2tru7uLa0t7q1tLi8vbm/ucPAwLu5vLu+vcjEvcfEw7rAvb62sra4srm0usLCureysaysq62yr7Kur6ijpJ6rrKyqpKakpKiqoqemraihoaGmn6Oiop6bnKKfoKOdnJuhn6KgpKCem5eZn6GdnZ6eoaWkoaGioZ6ho5yinqCZnZijn52eoJqZoKKmnYR6g4B4cW1lZWZvaWVraFhYTktLS1JJTEhDOT04PTs2Ojs5Njc8ODk4NjA0MzE3OTk7Pz0+Ojw6ODg5PDg6Ozs7PD1BPj09Q0E8P0NDREA/Pzw5Nz5CREE/QDg4P4mYmoyMkI+Tl5WMkpCakpGXmJaUlJKQmpTDvsbBwby8uLi6v7a8scK2tLyxtLa4s7q9v768sq2vrLGwt7y3u73BxLm3t7m3uru6u7/RqXt/ibq/x7e5uK23tbi6tLizu8XGy8G8xsDAv728v8nDxMW+xri1srK9uLi4vrq6uby6urS3u7q5v7zEwL+5uri/ubvFxr3Fw8Kyur27sa+2uLO3s7q+wLm2rLGrrqmqqa2qqq6mpKWnrq2ppaOio6GkpaWmoqato6Klo5+ho6Gcmpyhn6CloaCenZygnaWgnpeVmZ2fn52gn6KmpaCknpybn6Ofn5mcmJ2epJyWnKOcnqGcppZ+f4d8a25wZ3Brc2VibV9cVEhLSkRKQkNHPzk7OD48Nzs7OTc4Ozc8PDYyNzUxNjk8PD08QTs8Ojs6OT45Ojs9PUA+RD89PkRAPz9BRkQ/Pzw9OTc/QUNCQEI5Ojl3nJiLh4uQkpOWjY+TmpOQnZiSkY6QjpiSvbfHvsO+vbu+vL22uri9ure9s7OwuLi1uby8wLeqraSvsLa5sr2+u8S2t7emmKemp7bEyIx5foW5yc/CwLiutbW8vri6sr7ExMrFwcrDwr+/vr3HzMfHxMe9tbW2wb26u7/CusDCv7y2t729vcHBwL+8ube8wru3v8W7wr++tbe8vK+vt7awtLO6ubq7r6mtq62rrKaqoqeuqKWqra2vp6Sgn6ajnqKjqKOjq6Oiop6dm5ublJaZnJyfpZ6fnpmYnpejoJyXmZqZmqOjop6jo6egpqCbnaCjnp2WoJmcoKCblJegn6WcmKKQgYaBcWZsaW50bnhjZ2JbY1FLVEhFRUNHQzw7OTg9Ojc6PTo4OTs3PD01MzY1MDY4OTo8O0A9PDo+PDk+OTk9Pjs/PkM8Pz5APz4/P0ZEQEE/Pjo3P0BDQz9APTo4ZqGYj4uNlZKVlY6PlpmVl5uVjoyMjY+bk7m2wbS/vLm8w8C+wLq1trKywLmvsry8sLe7tru8qqqjsLrR07S7vrzFurSObmhwY2t5n6x7e4KFu9HRzMrEtbrAw8i/vrW/wb/Gxr/LxsO/wbzAw8zKx8XGwLm9vMS/wL/CyL3Hx8XFvLrEv7vBv7rAvLu7wMS9t7nCub69t7S2uLqur7WxsLCytre0t6yurKqsrKuoq6Gms6qlra+trKippaOkp5+io6Onoaeiop6cnZyamYyQlpeZnaKZnpuVkp2UoaCdmZ6fmJimpqKfoqKmoqeloqCko6GbnaCbnKKfl5WVnp6kmpafiYGDgXRvbGx0a2xuX2JeYGFOSE0/RUA/REM8Ozo6Ozo4Ozw6OTw+OTo+NDQ1NTE5OTo5PDtAPD89PTw4PDs6PDs7Pz5DPkI+QD89Pz9FRUJBQj87Nj9CRUQ8QUE6OlmfmJOSlZqVmpOQlpeclZuZlpSVkZKTnZm2uLaxuru6vsG5uca7trWypb69tLbBv66zvbS4wbGwsbPEssbZvL27x62OeGNiak5SWmB+eX+FibzKzMvNysbCxMvOwry5vbm5wMO/yMbEwcG/xcDKycPDxMO5w769ub+8wsbCyc7Hxr66xr26v7m3wLm5vsDCvrW0vLi2u7CvsrK1r7Cvrqyus7CzsrirsbKxqrCrq6yrrLatqKyusqarrKmpoaWgpaakrKSmoaChnqGgnaCMlJeTm5+mmZ6emZOYnZ+gnp2eopuYp62ooqSgoKKqpqmhqKGlm6CgnZ2jn5SYmKKdp6Gfm4J7eoh6bW13e19wY1tdX15TST5DRUlCQz5DOz42OTo7Ozs7Ozs7PT05PTU2NjIxODo5Ozs6QTs/PDw+Nzs8Ozw9PTw9Pz5BQUE/P0FCQUVDQkRAPDY+Q0RFPkJEPztTmZuZmJ6dmqCalpyZn5KdlZ2boJWWlJqYur20sLu8wcTCv8XGura5sqO7vbS3xLuwtbq2ucS4tby4vWl3vc6/uK9vWWJkU2xnU1FRW3N9hI+7w8fLyMHDwcDJysLAu7qwtLu9wMXGxcW/wMK/y8fCwMjAusK7urO6usG+wMrOysS9tby8ub+5ubW1s7/Avre0s7S4rbeqr7CwsrKvq6+nr7ausrG5rra2uLSzsLGttrS6sa6srranrLKsraSjoaenqLKrqqWkp6elpaCml5ujn6SmraKeo6KanaWiop+foaWenrC0sKSknp+kqaevp6mgq6CiopqipJ2anqGmp6+psZWCe32Bem5zeHNncF1bXlxZUUVEQ01JQUU9Rzo6NTk7Ojw8Ojs7Oz0/Oj01NDUxMjc4ODs8O0I8Pz46OzY6PTo7Pj0/QD87QUFBPj4/QkBBQkJFPjo1OkFCST9AQkA7TJqdnZ6fnZienZmampySoJWbnp+blZGRlsW+urbDvMbCvr/Ixbe1uLe2ubu0r7e2srWzt7m8u7a7wcB0aX2rvrZwVkpWaklagXdzVFBmfIWavL2/xsC5wLy+xcS9vbmysK64t7/Dx8PDvL2/v8PDvr/HvLy/tLSutbW8vr/OzcvCt7K4uLi9ubuxtrLIwLu2tLGwt6yzqbCtrbS3r6uuqrG1r7Gvt7O6usC/tre2sru6wLWyrbO3rLC6r7KloqWrrK+5s7KosK+xr6qiqKGkraitrLOun6inpqWmq6Sknqaqo6ayuLOrpZyfp6anrquqpbClpaWbpKOYn6exrLW4sLKOhHl/fXZsdXpwbmlbX19ZU1BBRUhHS0BEQ0g8PTY7OTk8Ozo6Ozo9Pzw9NTU2MTM2OTg8QT5AOz1AOzs5PD04Oj08QD46Oj49Pj09PkBCQ0JBRD03NDU9REc9Q0I/PEWUnqCgoJyXmpiYlZmdmZ2fmp2bnJaRj5LDwMK9wrzEvLy7xbu3s7e2tru7s6CWtayvsbS0tLa4ucm/endpf6mXVk9Kd3RNUWx5g3tQVIKJobe4t8K6s7u3u77Au7u8rq+us7K5wcLEw768v7u6uLbBwrW/urWur62wvcC5z8rJw7GvtbS0vbq+ubq7ysO7uravsL2xuK+ys7C3vbaur66wt7CsrLK2vbzEwrq9t7bAv8G3tbC2srGzurGxr6err6u2v7e1qbqztbmxp6uop7ausrG1uaisrK+qr7CqqKessayytr20sayjqKuoqKusq6i2qaaonqadmKOuvLG7wbSmiYF8gnpzdnZ3bnFgX2ZdWlRKPD8/RkY9RkNDOTo1Ozk5Pjw8Ojo8Pj4+Pjg4MzE1Nzg5Pj9BPzs6Pz08Oz09OTs8OTs6Nzs+PT1DQT8/QUJEQkE8ODU4PUNGPUREPzw/iZ2en52Xl5WUk5aZnpubmpuYlJ2Uio6Owb7Dwr6+vrm2usCxtbGzt7fCtbOrrbOoqa61r620trjIwIN+c3GTbE9IXIloT09Pga59XUt4pKixsre+ubK1sry5vLa6vrK0tLSwuL7DxsTAvb+5s6+yvLquu7Szpquorbq+uMvCv76sq7Cvs7q3ub67wMXBu7y3sLXEtb+0uLu0u8PCs7a2sbisqaWrsr23v7+7u7exvL28trGvq6uprbOvsLCrsLSpuMC2sqm0tbC3tq2spqu7s660uMKwsbG1sbK1saywsri4ubi+tLGzrqyxramvrqqyuK6trainoZ6ptr+4ur+wlol9gHxxdHd0dnFsX2NhW11PSEE+PUhDRk1DQDc3NTs6OT48PDk4PT47PT86ODMyNTc2OD8/Qj86OD4+PTw5PDk7Ozo8Ozs6PEA+QkI9QEE/QkI/PDs3OjxBRD5CQz8+QYqgm6GdlJiVlZKYmpyWm5WalY2bj4SIhru0vb+7vLm3s7y8rLOytLS2wLXAr7Kzqqqxt62pubO3xLuMg3t4fmFJYIxqXlFPXoGujl5QTnu2trC2urW0sqy8ubi1uMG6uLOxrLe8wcfDv7m6ta6lrLOwprCtqJ6gn6WttrXCt7a0pairqLC2s7K6tbu7u7W4trC1xLK+vL+8ubrFybq9vraxp6SeoamxrrW5trKxq7S3trGopp6gmaWmpKynq6y2qa+6sa2kpq2lq7GrrKmtuLawsrjBtrGxtbGvu7ayt7W1sry1urKwsbKutLKqrq2nuLWyta2uqqiosrq9wLa0qY6Ce393b3tvdXJtY11mWFxdUk5NQT5JQkFKSUA2NjU7Nzg+Ojs4Nz4+PDs/OjkzMjc1NzU8PD48PDg+Pjw8OTk5Ozs7Pjs7OTw+P0E9PEJAPz9CQD47Njc6QERBQ0E/QUKJoJ2loJSWmJiVnqCcl5uYmZGMmYmDhoS1r7S7u7S1sLG2uq6wtLOvtbq1urC1s7KttrqvrbyzuLrBm4yFiX5TTYieeGpaVmxedYdub3qlvLaxtLWytK+su7q4trrAw7aurqqytry9ubaysa2tn6Snp52jpp2WmZman6muuayrq5+lqKSrrq6nr6yvsbGtsa6usLmwtLy+uLm4x8W8vLu4qaKcmJufp6assq6zqaapqq6popqXl5GcmpijnqKir6ekrKaompqemqGnp6anqa+2squ0trCqsK+xqbm2sbWxrqy3s7avrquuq7S1ra+rq7GtsbKoraurs7W3ur2wq6GLeoJ5cnZzbXVpa11balRdXE9NSERGTEJGTkY4NjY1OjU6Pjg7OTc8PTo7PTo5MjM2Nzc3Pjs9Pjo6Pz48PDw6Ojs5Oz47PTk8Pj1CPDtAP0A/QT8+OjU1OkBFQkRBQEJBiJ+ipqGYm56dmqWpmJudmpmUjJmHhoeGrq2uuLmxsqiur7iyq7CwqrK1ubm+tbK4tLm6trm7tbWzvKqQjZaaTFWKvWR7golnYntqYm12oL64srSzsLGtsLm4tr64u7+ysrKusa65r6qrrayjqKGdnp6XmKGVkpWXkJifqK6ko6Sgoqeio6mpoaanpaqtp6ynqKesq6yyu7SztLm6trK2ramgmpaWm52fq6yqr6Oko6GpoJuTjo+Qk5KSmZaanaSloJ+ep5iVkpSZnqSjoaWqrK2iqaqppKmtrqW0sa6xraqprq+wraWmqqSos66trKmmpqmrpqqnq7Ksr7Oxq6mWgX+Bd3J4aHRzbmRUYGNXXFFOTEhASFFETUM9ODg3NTo3PD46Ozw4OTw7Ozw7ODI0ODk3ODs7PDs4PD0+Oz08Ojk8Ojs9PTw6OkA9PDw7QD5CQEE/Pjk1ODs8RkFDRD9BQYijpqKjnqCfp6Coqpufm5yZmI6Xi42PjKqpqLGvsK2lp6ayr6mmq6CvsLu1vby4wMG+vLy8ua6sr7KwpJqknUxgfo95bHl9Y2Fqa3R5bYKkt7Kts6+urK62trO8ta+qpJ6bnJyeqKieoKipn6GnlpuXl4+dk4+Qlo6Xm6SooKCioqKlpZ2jo6CepaCkrKSmqKSio6OrrLOuqa6urqeqraisoZyamJmYm6moq6ufpqKbo5yVkIyPj5CTkJeVlpifnp6amKaXk4+Slp2ioKWjpqSnoKKko6Ghq6uksq2qrKyno6yuraufoaKkpK+srKmmo6KqpKqqpKmrpqmsq6agiHiDfHZ/eWJ3bG5cUWhUUE5HUE1MQk9RQD47PjM5OjU7OT07Ojk9OTk8Ozw8OzkzNjk5Njo7Pz06ODs6Pjw6PDs5Oz07PDw9PjxAPT88ODtAQEE/Pz45NDk8N0FDQkQ9QEOOqqSjoqGinaulpqimoZ6dmZ2PmJWTkJWnpKGmqKmlpKChp6uhnKKbp6u1sry9wMLCwL7AuLSnpKyptL+zs29hhW9paVdjXV5TVFljYVxxe6K2qrK0rqqrr7Cyta2lnpKYlI+YoJ+ioJykpZ+eqJSblpeMl5GNkJeTmJ2iqp+fn6Cjpaicn6ChnKKfo6innKehoKSfrKisrKCpq6agpKimrKOdnp2Zl5qrpqqxo6WonqCclZOQj5GQmJCWlZiXn5ibmZqjmZeUlpqdoJ2nqKWgo6Kho56doKmqpa6upqipoaKqrqqnoaCio6msq6eppqShqaKlqaalpKKmpKijkn18gHV1fW1re2RoVVFjTUpIR09STUpORzxFQD0yPzc1OTs+Ozk5Ozg6PDs7Ozk5NDg7ODc7Oz48Ojk8Oj07Ozw9OTw8PD49PUE+QEJAPTc6P0FCQEA/ODU1PDpAQ0BEPkFGlq6koqWeo6KpqKipqqWmnp2imJiZmZWbop6bnqOioKOgoZqgmJeXlqGorK62t7q5ure3u66ooKGooabDw5BVdW5mb2ZXW1FIRUdJTEtOYWV7s6+vs7WqpqyropyZlI6RlpeZmZygoqKcnaWemqSXl5eWkJKRkZOal5ugpKqeoaGepqeqop+gp5+dn6SnqZ6jpp+qnaqtqq6nqLClo6Smp6ymoaShm5ier6iusqulqqqgmpiYmJWTlpqTlZWalpuXl5ihnpycl5uhmp6ao6eln6GioqOdm6Gmp6aoraOppZ6kp6mkpaWhpaSsrKmmq6eioKSjpKenoaCgpaKmoIl7gH12eHxkeXlgYlJVYElJSktTVElSUEw5P0I2Nz02NTs6PDw5Ozs4Ojw9Ojs4NjU3OjY5Pj0+PDk5PTk9PTw+PTs7PDo+PTw/Pz9APT03Oj5AQEA/Pzg2NT08PkFCRkBAR6CupKaroaOqrK6tp6ypqKCipp6bm56aoJyalZmfn5uen56WlJOXk5KcnqSorq2sq6uvqq+pnpeepZ6du7KDfWFfbWFUSEZRS0lESUdFSlVZXKWysLC4rKahnJ2alJeampCOkZWRjI6OlJminJejmZqXmJmUmZiWnZufpaapoKajnqeurqumorGjmqSmpqqioaqiqaSosquxsqu5qKarp6urqaysp6Cgo7GusrG0qrKvopmcnZ6hmZubmpiZm5SWm5aZnKWhoJqjoZqdmZ+kop6gn6KmnZulpqWkpaijp6OepqOinqaloqWlqKykpq2noJ2dn56gpaGenqWgppmBe4F8dXZzaIJsZVtTWllNUUpOT1VMU0xBNz5CNjg9NzY6PDw9Ojw5ODo7PDo7OTc2Oj01OTw7QD03ODs3PTs9PT06Ozw4Pj09QD5BPj4+ODg8P0BAPT43NTg9Pj1BQEZAQUihqqCrq6GkqquwramtqaelpaWkoKGfnqWXl5SYmZ6YnJ2blo+VmZKRnJihnaqip6Cep6Gln5ySm6KbnqOnoX9naF9UR0lWfX5oU0dDQkZMUFOKsa6sr6efnqKgl5GTm6CcmZeSk5+coaSbnpuWn5qfl5uinqWhnqSfpKitraisqKSstLe2sKe0rKKtraOvpaSmoamorrWzsr23vrCssa6tqaq0sbCoq6iytbezuK2ytKSgnaWfrKGhoqCgmpiWlqCbm5ikoaCeo6GgnpqcpaCfnZyhqJ+fp6meoaOkoKagnqehn5ymo5+ipaOooKmrpZ+dnZudmqainpyjnqeQgYJ/fHh1aXd1XWxaUmBIUlVIRlVWSkJMRz1LSDhFPDY3Oz49PDo8OTg6Ojs6PDk2Njo8Nzs+PT8+OTc9OT47PEA8OkA6OkA/O0A+QUA9PDk3Oj5APzo+NzU4PT0/QUBEQEJGnKueqamipamprqimqqWmp6aoqqGlpKOmkpOVmJacmpqcmpWTmZuNk5+ZqJ2un6eenKGdnpqZkpiem6GhoY93altRSkZMcaCnoGxORUJAP0JUg6Crqqmkn5+ZkpKTmJiWlpWMiIuOlZ2dnZ2elp6apqCgqKWxqqeuo6uttrC0srGutri9wLqttbSwt7CutKmmpKWsqbmztbvDvMPBtrq2q6+xube8r7OwtcG8t72zs7WirKKpqLKpq6inqJqZnpqqp6CZp6Cfn6eopaSfnaqhop6bn6igpKetmZ+jnp6nnqCmnpycoqGbo6KhnZympaWkn6KZnJukn6CboJyjiYWEfnZxbWl2bWhtXFhbQldOSkdNR0JGTTw+TD00PDk2Oj0/PDs6Ojg4PDk6Ozs8NTQ6PDg5Pj4/Pjg4Pzk8Oz0/Oz1BPTo/PjxAPj8+Pz08Njs/QT07Pzg1ODw8QERCREFCQ5WqoKapo6mqqKmjoamgpqinrK6lqaWpqpSSl5mUmpqanJiYmZyamJmqoLGit6Swpp+enZ2XmJWZnpqcpKB5Z1xSTUtKUo3Z2cCPdWRWSURTkayoramqpZ+enqGinZ+dmpyclJOVlJ6emJSFnZqhm6ukq7KwubKysbKxur28vLm2uMO+v8K/trq7wMS5vbusr6exrbHCtrjCxsDIysDKv7C5ub25wr64s7vGw7zDvLezqbOtqrO0r7Ouqq+jnauntrGtorCmoaOvsa2wpKWvo6GgmqGnoaSqqpmdoJmao6CmqKGcnqKemaSenpiYo6OhpZ6mmZuipJ6fm5ubnIeFgXt0cmtrdXJwaFdbUUVUSERKUEk/RUE0Rkg5NTs9Njs8Pjw8Ojo4OTw4OTs4Ojo4Ozw3Oz49Pj02OEA5Ozs9QDw9QDk3PD07Pj0+PUI+Pjc6QUA+PD45NTg9Oz1DQEFDQkGRqqGlqqelqqimn6KnnKasp7Gyq62jqayVkpWalJecoqGbnqCinJ+psqu7sr+rr6ylnqCgnJyYmp+fmqCeblZOTE5NVmeh0Lugl7imkImYrriup6OjoaCepaulnpeclJGZnZiUjIqGiIZ5bYigpKKrrLS8tsO+vrO7wcPCxcC/wsbGxcPIwsDFx83QyMvDsre1vrK+xbu+zM3FzMzM0se+v8DDvsfGwrfDycnCwca+urS6urS7t7C1sqq6sq67t7+7uqq3rauquLq0vK6uuaOmo56mpaKjqaaZm5+Ymp2nqqegoaGkmJSjlpSZkZydn6Sep5+en6KdmJmUmJSIhH16cWtjaG94amRaW0ZLTEVEU0xEQkU3Oj87NTQ5OTc5Pj87PDs7OD48Njo9OTw9OTw9Ojs9Pj4+NztBOj45PT45PT44Nzs6Ojs/Pz1CPj83OkFAPTw9ODY2PDo8QT9BQUE+kqugp66ooqulpKKipaGlqquwsq2upKmmlJWWmpaUm6SmnaGqp6KrrLy8v8PBsrK4p6Ghq6qhnJ6hop2clWBORkpMVmt+p7iqhozU1sa/t6ifmpybnp6Zl5eXkoyOl5eTjo2Qi4KDgndzcW5wj6atrrS5xbvNx8u/wszOzczHydHMzczHycXFzNDS1c7Tyb3Av8O7xsXIxdHUzdPQ09PMysLGxsfKyM6/yNHMx8XHxcG8w8G+v761vrOuv7/Cw8fEx8Suv7iyuLzDwcG6vLy1rqenraigoqmlmpagmpmdqKupo6SknpePm4yQmYmVmJugn6OdnZeempOTi5WPhYB5dHNlYmdyb2ZeWllDTkxDRVBJRENANTU1ODpCPTY4OkE+Ozs+PDk+PTc6PTk6PDg8PDw7Pz8+PD0+Qzw7OkA9Ojs6Ojg4ODk7QT48QD8+ODtBQTs7Pjc4Njo8PkI+Q0FAPpOvn6ivpqiro6KloKampKuoq62qrqKqo5Kcl5ebmJuirJ2frqalsarFxszOzb+wwaikqKytqqCdo5+cnpRcSkJITGh5qbihkH+xy7uvqaKenJ+amJaUkpSWkZCPjIeEg4iHg4CBgYB5cnJvbHmktrq5vsvB09LTyM3O0dPR0tHQ0dHNzs7Qxc7U1djS183Gx8nMw8XKz8rT19HX0tXW09PIzMfMzcnSzc7TzcXIycrBxsvHyMnGv8Ozs8jEy8rLz8bKv76/vcHHxMzMyMm/w7+tr7OonqKqo5qTnpyYnqaprKSlppaXipWFkZSHkpKSmZualpiQm5WQjIaRi4B6cnV2Z2NndmlkVldRRE1GQElRQj1CPDoyMkA8RDw3OTxCPTs9Pzs7Pj05Oj48Oz44Ojk5Oj86Pj1APkA8Pjs+Ozk9PTw5Njo6Pj08PEE/Pjk6QEE6OT44Ojo6Oz4+PEE/QT6QrKKiqaanqKSfop2qqKOso6OnpqyiqZ+To5iWn56dpK6bn7CrqKyxyc3U18/Gu8esrbO3rK6jnqOinaCibEpKTFV1os3Su6Gks6qjnJycoKSgnZqUlJWUiXx3cGtlYmhxb3F7hYqAdnBucXRwhbPCvsXR0NbW1tLWzdTW19TT0dPU1NPP0sPQ09bY1dbSy8nO0cvGzdLK0tbW2dXX09bYztLKz9HMztDM0s+/yMfKw8zMzM7PxcbHtr/Kv9HNy8/Gyci/w8PIzszP0M/NysfNuLe7qJ+lq6eemJ6jnp2qpa2pqKiSlYiQhIyRho2MiJOVmZCWjJiSj4aHjIR8eHN2cGNgZHJiXVJcSUpHQUVIST47QTg9NDU4NTs4Njo8QD07Pjw7OUA7OTo8Ozs8Nz09Ozo+Oz08Pjw/Ojo8Ozs5Oz89OTU7PD48PD0/Pz46O0BCOzk/OTg7PT0+PzxBQEQ8hqugnKegp6Oim6CbqaSlqaCfoaGmn6ifmKSimqmmoqarmqOwsamotdDU19rSx8bLtLXBxbG1qKGkpaChrIFlcnaQs9Hb0b2vqZmVmKCcmqCgnpucmZWJd2ljYF9fX19eX2BeYmx1c3Fwb2xycXWSxMfG1NXW19fT1s/V1NrU1M7P1dTU0dHM0M3T19bT1dDP0tPRydPRyNDY19jR2NLX2dXWzM/Pys3Sy87QwMbCx8XOzdHR0cjMzcDKzMXTzsvOyMTKx8bIzMrT09HVz9LM08G5xbGlqLWup5uorKWdsqiws6ysk4+TjoiKj4OPi4SQjpmNk4+Zj4+ChYx8enFzdG1hY2ltXlZQX0pKQ0ZDUk0/PD41NDo9NTI4NTU8PEA8Ozw6OTpAOjg7Oj46PTg+Ojo8QD08OTs9Pzk6Pz07PTw9PTo2PD0/QD08PT0+OjxAQjs5PDc0Oj48Pz89RkFEPYKknKClnaWlo5mcnaSeo6OfnZ+doJqnnpyhqZ+vraqqq52mrreoq7fX1NXZ2dHO0L+8zMm2vq6mqqihpaGCipK00tLVwq2moJeWmJqbnJ+dmJydk31xZWNjX19hX19hYF9gYF9gZm5wcG5rb3J3d5zMwdLV09jY1tnR0tLXz9POy9LN1dTSys/M09bS0dbNz9XV0cXR1MrQ1NXWztLQ2NjY18vIzsTJz8zKzMDJv8fJzc7Py9DNzszOz8jL0NDKzsrCycfJzMrL0dLM09HRz9DKvci5sK67uLWqtrCtqLits7+7sZqPn5SRjo2IjpCFkY2ZjJGRlY6RgIWIenZvcG9rYWRucGFXXFpJRkZETVdFO0A9MzM8PTg3ODY1Oz5APTk8PDg8Pjk8QDtAOj04Pjk4Oj88PTg7PkI6Oj08OkE9PTw6Nj08P0A9PDs9Pjg7QEE9Ojw4ODs+PD4+OkVCRT6Bn5mlp6Cfo6eam5+cl56eoZqdmpyappufpKefuLa1taykrK6+tLDA2NLX2tzWzs3Kw9LPwcCwqaytqaeBbIiHwNXMsJublpSXm56en5yUlpiUiGteXl5hZGJgYGFhYGBhXl9fXl1ibXJvb3J0dnZ5pL7L1dHW1NPY1s7O1MvNzsXOytLSz8fOzc3UzM7TzcvX1tDM0dTLzNDS08rO0dXS1dXKv8nBxczCyMnCzMPFyMrKz8rNzNDN08vGyM/NyMfLxcbBxcrMzc/RxtDOzc3Mz8XHwbi5vcPDvcO5s7K+sbvDxLWqmKWimZaRlZWSi5SNmpGUlI+PlIKJhXlwcWttZ2BgcGhYWGhWTEZMSVBQQjtDPjs2Nzo4OTo1Nz09QDs6PD05PD05PT06Pjo8ODs9OTtAPD47Pj5BPDk9Pj1CPTs3NzU/PDw/PDw7PDw4O0FAPDo8OTs7Ozw9QTpFQUU+hJ6bqK2epKSqnJ6fmJKXm5+am56ZmaKVoamppcTCwb+7tbKxx8K4y9XV2drb2MzMz8jW1cTCta+0qKCsamh+k9bQqpWOjZiWkZOSkZaWlpCLfGVhYmJgXV5hY2JgX2BgYWFgX11bXWdycXFyc3FtcnmkxtPPy9DP1NXJxcnJxsa/w8bPzsfFx83K0sjLzs3G0dLQzszUysfLzs/Hx8/Sy9HPxbrEv8bJvcLHyc7FwsjAx83IxMzKy8/IxMTQyMbCxsjEvsDHzMvLzsLLy8jHy9DExci7x8PJyMLPwb28v7DByce5vaqwsqelnaKcmJCbkKOZl5mRlZiJj4J3b3Rka2BeZnBhW1dgR0hIR0lNVEc/Sj02NDM1NT08NDg9PT06Oz08OTo7OT89OTw7PDg6PDo6QD1APD09Pjw6Qz48Pz04ODk6QD4/Pjw7Ozs7ODo+Pzw7Ojc5PD49Oz49RkFDPYOgm6qupa6qq5qdoJeUjpedmpmgmpqcm6WysazJzcrIxL68us3NxtDV1dna29jQyc/P0dPIwra7u62lpV9td6rUqpCOjpeQh4SEhIJ+hYV/c2BbXl5eYF5gY2RjX11dXl9gYF9bWlxga3Jyb29rbG9vfbjRyMnKz8vNxLrAw7u7urq+ycbCw8DDyMrJyMrIwcXMxsjLzcnEwsvJwcLM0MXMyL+5wbvGx76/xs/Lw7/Du8nHyLvIxsXKwL3Cy8bFxL7GvLzAw8XMxcW7wMrCxcfSxcHJv8rJxsjG0MPDxsOvxMvHw8q3v7y6tKmspKWYn5iso6Glm6Ogm5R7dnN0ZmlaYW5sWltYUkRMRkJHRExERlNANTQzMzQ/PDM6PDw7OTw8PDg7PTtBPTo8Ojs3Oz05Oz07PTs6OD4+PEI+Oz88OTk7Pz07QD48Ozk5OTk6Oz06PDo2OTw+PDs+O0NCRD5/pZypsqm0rrCdnp6YnImUm5man6Kfmp2ov7i8ys/RzMfCw8bNzs7M1c/V2djZz8vSzc3OyMG1w76yspVecHe4tI+Lk5eHe4GFhoB2eHVycF9bW11gYGJjZGRlZGBcXF1dX15gW1laXGJvcm9raWxwb3OPxrzJxczAxsKxtrqysrOyscK8vLy6uMHBwsW+vbm9v7nEysXGwr3GwLi7xMm/wsm7t7u6xcO/vMHNw8a9vbXBvcO6vca7wrqzvMXEwcK2v7a1vb+7zMO8tbrIur++y8TBxsLGycbIxtDGwszHssfJw87NwcXDwL2zt7Cyp6ioubClrbCqrayUeXZ3amRnYGhvY1ZeWUpGSkZISkFFQkVJQDk6NjQ4ODUzOzo7PDk8PDs5Ozk6QD46Ojw6Nzo7Nzo7Oz88OjxAPUA/PT8/Oz07O0A8Pj4+Ojk5ODk3ODo8PDw7OTo8Pjs7PjpAQEU+fqygrLWqt7SyoZ6fl5qNlJaan52mop2et8XCxMjO0crKysfNzc7RyNDG1dTW183Kz8XJxcfBucW9q6+GYHODsJKMiYuFeYGHh4B+hHx0dGNbXF1eYGBiY2JiZWViXV1bXF5cXl1aW11daHNxbWdnbnByeZ29zMDDusG4rrCwp6qtrKe4tbe0s7O0vLa9sbewta+yu8K8wcS8v7q1s7q+wLjHubS7tsHCvLi9xsHDu7Wusra6v7TEt7u1q7i9vcC9sbq2r7a6s8W8t667v7W3tMW8vsPFwMPFxsjLxcDGxrvIy7/PysfDxsLDt8O9vba5vse/rLW6tbe2jnl0eGZnZWJrbl5WXmBGS0hISkZCREFFRT88OjU2NTYzMzs6Oz06Ozs6Oz44PEE9PDo7ODc5OTk7PDo+Ozk+Pz1APz5CQD1AOjo+Oz89PTk6Ojo4NTY7PT48PDo7OT49OT86PEBAPIi3pauzsby8sa2foJmUlJiXnqujr6qnpMbLzcjFyM3M0MzNyMrIysnKxNDN0s/NxcfBxcC+urjJtamxhmhzk56MhomKe3l+hoZ3eIJ9dGleXV1dX2BfYGRhX2RlY19fXFteXF1eWltbXV9scG1oZmptbnJ8pMe/uLi1sKusp56iqqeeq62zraqsqbSvt7Cyqa6mrLK8urbDubq6sau1ubu0wrqwwLG+vLu2u8e5wratqqiwssC2uL2wsKeys7W7vKuutaWuta67srCpubCtu667uLvAwL25wr/Hw8XBvMbCyMu4xcfFv8bDw7rExsK7xsnMy7O5wry7s4hzdnZraWFibGhZV1dbQUxLTUlFQUM/RkE6OTo5OTU4NTQ6Ojk7PD07Ojs+ODtAPD05Ojc5Pjk7PDo4Ozs6Pj45QT0/QD87Pjo7PDo9PDw4OTg5NzY4PDw9Ozw6Ojs+PTs/Ozs+QDyKwKuouLe5w62zqZ2ZlJaZoZymsLWxt6bFztLLw8XBxc/HzsHDxr/ExMPDysHJyr6/vMC6srS0w66pr4lrY4mTiI6QfHh+ioV6e4SBd25eXVxdXV9gX19kYmFjY2JgX11bW1paXVpaWlpcZW5vaGZnaWtucoGtubC1rqalp6eaoKWhmpylq66kqKKsqqyqsKOmn6qttbaxvbmvt6+prri0tLy4tLyvuLm1srvBssCupamiq7Gys6i9qquoq6yttLOmqK2hpK+psqanqK6mqLessbK3urq7sry9vr7Ev7XCwcfIt7/AxbfEwr+7v8TCvsTIzMq/vsTAwKmHc3RyamldYW9kV1ZYUEhZUlNLRkZFPj5AOjc4OTc3NjQzNzo5OTo8Ozs8PDc7PTs7Ozw4OT44PTs8Njo9Oz89N0E+P0A/Ojw8Oj05Ojs6Nzc3ODg3OTw7PDs5Ozo8OTc5Pjw+P0E7jMKvrry3ucSwtrCbmZWcmKqpsLGztb2vxdDPzMPIurrLwcu+u8m2vcO+usm3wcPBtLW7tbCutLutqKiKY2eLhIiLgHt+gH54dH98c3dlX11cXF5fYF5fY2NhYmBgX11dXFpYWltbWVhaXF9ma2ZlZ2Vpa29yhaqlrKWgnKKllJ6km5iSoaOqpKKfpqWopa2gnZylpqyyr7a3p7CrqKq0q7S6sba1rra5sq+6urG2pKCkn6axp6uouaqkpqeop7KtoKemn5ukpqyen6ejoKGxra2ssrSztLC1vLa7wcGyur7DwbK5ucOzwL2/tbi7vb68wsfEwsO+wMSgg3hwa2FmX2tvYFRZXkhOZ09USEVKRjw9Pz06Ozs4MjU1MzY5OTk7OTo6PDo3PD88PDs8ODg8OTw6Ozc4Ojo8OTg+Oj89OTg8Ojs9Ojc2NzY3ODg2NjY7Ojo7OTo7PDg1OTw6Pj5AO43ItLW9uLrAur21oJ6VnaGmurars7O7s8TPyMvCxri3x8HMv7jJt7vFuLPEuLO+wKu1u7GrpK6yrKCijWF7h4aGgXx5dXRvbWtqanFpXmBdXFxcXl9fYWNiYGBgYF1cW1xcWFlYWFhWWFteX2RjYmVnZ2dqbW+Inamgl5aboZabopiWjZ6ho6ebn6CkpqKonpuim5+rsKyxtqOpqqqsrKS0ua23sKyzta6yta6wqp+dn6SisqSmqbitoqamn6isq5mfoJ6ZnZ+lmpmjnJudr6mrp6qsrK2xsrivuLm7sLa7u7qrs7O6s720trGxtbS/tr3AvcPBu7u9l4N7c2tfZV5kZFhUV11JV1xLUEdJSUZBPD8/QDs/PDA0NTM2Ojs5Ozg5OTw8Nz4/Oz07Ozg4PDg5ODw3ODo7Ozo7Pzo9Ozc4PDo9PDc0Nzc2NzU3NDY2Ozc5Ojs6ODo5ODo7OTo8PzuJyba4vru3wcHBtKSkmZqkpsCyr7astLfGz8jIwMa7u8TDz765x7i3vreywbSxu7uruLmwoZ6oqqaXnollg4WGf3hybnBua2JeYmZmXV1eXV1dXF1fYGFiY2NiYV9cW1taWllYWFdXWFhYWFpeYmRlZWZmaGlrco2nnZSVlZuYm6KWlpGcoqKonZudpaaippygoJuZrq6trrKgpaKuq6eitbGysqyor7KnurOmtaCinpujoa2joqq1qqKjpp2mpqOWmZ6XmZudoJqXnZ2dnK2hq6ekpKatq7O0qrWws6uyubSvqq+ysrO3s66prK6yuLC6trq9v7ezsZSFeXVlXmVeW1lWU1pVS1tRS0lFSEtJQj0/QUFAQToyNDUyNDk5ODk7OTo9PDY9Pzs8Pjs3Ozs3Nzc+Njo+Ozo4Oj07PD06Ozw6PTs4Nzk3NDY1NTQ2Nzg1Ojo4Ojk5PDg3Ojg5PkA6gci9t72/tr68v7KdpaSYpbHCtba9rbS4wszIxr/FtsG/x863wMS9s7m5sr+2sbi6rLG0rZ6Zo6ifkpp9aICDhH94b3F0cWlmZGhlY1xcW1tdXVxbXmBhXl9fYF5cW1pcWllYVldXVlhXWFdWV2FkZWNkZWRkaGp2opyUlJCVl5egl5mVmKCeoZyWoaKppJ+fqZ2cmqunr7Cqm6OkuKqhoK6otqqmp62wpLiwpLegopuZmaqmoZqsuLCioaScop+fk5ShlJaWm5iXlpeclZ+qnqqkop2jqqqwrqi0q6qnrbKwpauus7GwsK6vpqensq6xtLC8tLm3rqOUgXl1ZF5hVllXU1JUS01eTE9LR0dMTEU8QD48Qjw7NzY1MzQ5ODg5OTo5Pjo4Pj47PTw8Nz49Njc2PTc7PTs5Nzk7Ozw+OTk6Ozo4Njc2NTQ1MzEwNDU2Nzk6ODo5Ojo3Ojs5OT1AOnbAvLS5wrG+uL2unaeoo6q7wL3Aua60uMHMx8XCw73Ft8jMssHCwa28u7S7vLS4ua+ur6ibmKCnk5CKdHuAfHdxaWxydHBpaGVkZmJcXFpZWlxcXF1eXVxbXF5cW1xZW1taWFZXV1ZXWFdXV1ZbYmNiYmNiY2RmaoGWk5WMkpSUm5mdlpacoJyglqGgp6akpqefnZ+moKqvpp+ipLeooaGiqLSipailsKWwrau0nqCdlZWpoaKUrbGxn6KjnZ6Ym5OLoZSRk5iYkpeXmJeep5ynoaKZo6Wlq6SlsKelo6urraaprq+uq6iqqbOlpqyvtLGvvLWxr66gknp2cmRhXFpdWE5MUkhSYU1WUE9KTU9FQkQ/OT02OTo3NjQ1OTk7OTg4Nzs4OT0+Oz47PDY5Ojc7Njs3Ozs6ODU6Ozo7OzY8Ozg4NDc4NjMzMjEuLzI1NTY7Ojg7Nzg3Njw7Ojs7QTh4u7uxtb2wu7G4rJ6lp623u7zBxbqxubXEycnAw8bGx7bGxLPCv8Wqt7e9tr26urWyq6ymmJeeoouIcn2IfnZuY2JmaWhmaGpnam1gXVxbWlpaWlxdXFtcXl9cWllbWVlZW1dVWFdVVFZVU1RSVWBgX2BhX2BhY2RpgZSTiZGPlJOUnZSVl6SZoJedoaairaakpKOjopyqq6WZn6WxqqChnaWrnaehnq2sqamtrKGiopWYo5uckKupsJufop+el5mTiZ6RjZKTlpCYmJOcoaOdpKCilaCipKabo6uloqSqpKuupa6yqaalpqa0pqmorbO1tLm6r6msnotycG9gW1dWVVJHUE9IWltPUklUS1NMRUZJQzg7Oz08ODY2Nzo5Ozo5NzY5Nzc6Ozo9PDw2Ozw4PjU5ODo4ODY1OTo7PDk3Pzw5Njc4NDUyMTIxLi0xNDI2Ojg2OTg1OTg5ODk7OUA5e7W0rbS7srCrsq2dqKevubmzwMi6tcCvxcjMusHKzMi1yb2xvsTJrLG4wbW7wLu0s6ippJSZmpuIfnCHg3t0aWlpbGdqa21ram1lXVxcW1tcWlhaXVtbXmBgXFhYWllYV1hXVFZWVVRVVVJTT1FZXVxdXl5fX19iZG2OkISRh5CRj5mTlZOcm6Ocm6GpqauorKeopqSZpa6klJmlr6mfm5mboJ6umZyrs6Clpp+io6GVk5uWlpKpqq2anKChoJqUkIyZjoyRjJGNlpWQnaGgo5ybo5WboKOhl6Koo6Koq6Crr6Ott6Wjo6Ksraqoq6+zt7O+tbOrr5iEdHNoW1hYU1VRRVhMUVtYTVROUExQUUlOSUI8Pz9BPzw2NTc5OTw8OTg3Ojc5Ojs8PT47Nzs7Oj02Nzo7ODk3Njk4OTo2Oj05OTU3NzU3MTE0MC0rLzQzNDk4ODo6ODo6NzQ4PTg/OX6zraiztq6pp6+um6moq7e2rLvKu7a/rMvGxbjBzs/Is8S7t7vDyLGtuL+3vL26srOjp56UlpeVhnhzgHZ3bm1obW5tcGdnaWdkXVpbW1tbXFtZWltcXF5fX1xYWFlYV1hXVlVUU1VWVVVTU05QUVlaWlpdXVxeX2Bkfo2Bi3+MkIqSjZeRl5mioJugq6qmrqyor6Spmp+soJWWpKinnZeQj5qerpaYqKqZn52UpaCekpCSkZOVp6ulmpmZnp6VjYyLk4aJjYOPi5KVkaCeoaOXlZ+VmqGinpSbpaWnqKigsbCmsbynn6OstKuup7C1sLm1wLGtsauQfXJzYlZTVk5SSUZWUFJRTExXTUpMTlJHTUpBQ0ZEQz5ANjU4ODk7OTo3Ojo3PD06O0A+Ojk7OTo/NzU5Ojk4NzY5NTg3Nzk7ODU1NzY2NjEzMjAtKi4xMDI4Nzc7OTk7ODk0ODs4QDh/s6ymsbeqpqKwq52qp6mysaW2xrS5urPKxbm6wcvQy7G2uLy+wcOxsLK3rbSzurKxoaGam5eWkoJ+dmtnbG5xbnFqcGtkZWdlXlpZWllaWlpaWlpaXFxdXFpYWFhZWVdYV1VVVFJTVVNWVVJOTk5SV1hZWVlYXFxdYWqAen92iY2HkIqXiZSUmJuZnqmboKqmpaudqJqhpZuTj5+jm5eXhYSSm6OPlKOdlpaWiKKbm5OLjoqQmqSnnJWVl5uRkYeUjouBi42AkIqSkpKgmp+ilZSYmZWippmNmaSmqKahn7SyqLK3oZyit6yqraSysqa1vLWsq7GjiXhzbV1OUVFMT0NNTk5QS0ZOTkpKTk1RSU1KQUdMSEdDPTg1ODg4OTo7Njk6Njg7OTk+PDg6Pjk7Pzg3ODk6ODg2ODU3Njg4OTc0NTc3ODIwMzAxKiktLzEyODc2Ojk5OTk4NDk4OEE3d7anpLaxpaejqaWgqKWls6qissO1tbKzxsa3usPKzMazrLq9tLfAr62psJ6mrbmuq52YmZyUkoV6gW1fX2ZycHZxaW5pZWdoal9YWFhYWFlZWVpaWVtbXFxZWFhXWVlYVVZSU1JQUVRRU1VRTU1LTFNXV1ZYWFlYW11hb3N2cYWIgoiAkYSPi5SRlJ6hj5uco6GjmKWXopyVjYeYmoxzjYN+jZeWhpGZkJSOjnuZj5yMgol/ipifo56Qk5iWhY2ClH5+dIqOepCHk5CQnZqZmpGVkJ2OoqOOiZqgoaSkm6K0r6yvrJ+YpbimprGhsa6csLyqqa+qmYJ3c2NWTVJPUE1DU05MUU1CUFFISU5STUhKSkNKTEZLSzw3NDk4ODg7OzY5Ozc6PDk6Ojs3OT85PkA3OTo8ODk3NjQ0NDU4NzQzMTI1ODUvMDEwMikoLC0xMjc2NDc4OTo6NjU6ODdBN3i3oaO0qaalqKOmpaamprOnprTBuLC0sMnEt7nBzsW+s6y6wautw62ooqaSnaa1q6GcjpSVkY58dn1lV1ZfZ2ZpZ2huY2poZ2JcWFdYWFhZWVlZWVlaW1tbWVlZVldXV1NUUE5QTk9PUFNUUk1NSkhOU1NTVFVVV1lbXWlscm1/hXx0TlhykIOXho6dl4uUkJ+YnZWUlpWPlomAk4lfO1dvfIuUiYCMkYyQhoZzioWWgXmBeoWUnZSDlY6RkIOGfZN4cXCFjX2JgZGNj5eamJOKj4mciJ+YiIeWnpqhoJenr6mtqKiflq2zoqaumayrmKi0oqmto5N9cm5gW05TUlZMRFRKUE1MRk5PSUVMUU1LT0pJTU9GSUk8NzU5OTk5OTo3Ojs6Pj44Oj09Nzo/OD4/NTg5Ozc5Njc1MzMzNzYwLi0vMzQ0MTEwLy8oKCsrLTM4NTQ3Nzk8Ojc5Ozg2QTl5t6CjraGmpqqgp6moo6qwqKe0wbmxtbDHwrezvc+/ua+utcKnqsWpo52Yg5SbrqCYlYWTjoqGe3J0XFFMUlVZWlddXmJnY19ZV1dXWFhYWVpZWFlYWVpaWllYWFZXV1VTUk5MS0hHYlxNT1JNS0hGSE5RUU1QUlRWWFpgbXBpe4J0UEJAf5WRkX2JlI2Eio2bjZaViZKIhpWGeYh/YEpRbniKkYR9hI2KhX9/bn5/lHd1dXeEjZlwUY2IioZ7fniUdmh3hoh9iomVi42RkpaLhIqIlYSajIKEkpuWnp2UpKOoqaWknpuwqqGkpJGmqpaiqpyipqiJdG1nXltIUVFSTUlVTVNJTEtPSUhGSk5MTVRLUVBPRklDPDc2ODo4Ojs7ODo7OD4/OTk+PTg7PDY7OzQ3ODs3Nzc1MzQ0Njk2LzMvLjEyNTIyMS8sJykrKiw0ODMzOTc5Ojk5Ojo6Oj85d7abo6edn6Kvoaeopaeor6yqtby2uLezwbu2p7nIuLaoqLW2qrK8pp6Vjn+Jk6eVlIl9jYOBfHZvbVhNS01OT0xNUVdbXFpYWlVVVlZWV1lZWFhZWFhZWVlaWFhWVldVU1BNSkVAQJtrc3NJTUtERERJTk9oWU5RU1RVWm6DdHd+amldVY+JlIl0f4eBfIWMk4GSmYuPe4aPgHZ/eHNudXB0jY6Ben6Kq4V5emh2e45wcm14gYuNknh6gHuBdnJykndndYSEhIR7lYmIioyLgH+Ei4yAlIN8gY+YlZyVkZ+dqZ6foJ2gqaWfnZiNp6SToZ+Wnp6kgHJoYVxdSlZPUkdKWFJPSkxNUkpKSkxQSUxRTFJUTEVIQTw3Nzs5OT49Ojs8OThAPzo6Pj03PT03OTkzNzc4NTY3NTI1MTQ3Mi8yLiwvLzIwMC8tKygoKS4xMjcyMTk4Nzk4Nzc1Ojw7N3aumaOimJyftKmvqaWsq7Cxqr20sru4trq0sZ+3urKqnZ2sqaiyr6GakY2UgI2bjZB+doV3e3VvbmhYS0hISEdFSEhQVFRUV1dTVFVVVVZXV1dYWFhYWFhYWVlXV1VWVVNQS0Y+OTNOPH6eTUhKREA9QURqlH5MT1FRU1ZedYN8eGZ3jZeYjY99aHmBdniAiY99hJiSgXGHj3x3e29rfq19c5CLf3uGkoF9f3RmdnyGbG9oc3yJjIiAbHlxfXBtdY9xaXGAfo5wQ4uEgoOFf3d3eouFfYx7dX6Oko+YipKam6OWmZ2anZ6inZaNi6Wbj56XjpaYj3dvbWViWlhXVFFKU1VUT1BOUFZLTktOT0pRTkhOT0tFQzw7Nzk7Ojo/PTk8Ojk5Pz87ODw9Nzw5OTk5MjY2ODU2NjMzNTExMjI0LiwsLS4uLTAtKyonJyouMTM2Mi84NzY5NjY1Mjc5OTV5ppegnpagpq+srquoqbGvsau8uKy7vrmzrKebsKesm4+WnKWppKCXmY6EknmIjYqJdXB7bXRwaWxpV0tGR0VBQENESUxMTVFSUFFTVFRUVVZXV1dYV1hZWVlZWVlWVlRTUUtENzhmNzA/qGlOSEM9OzpEioV6WkpOUFFUWF5lcHJtiKeqwH51eWN8eG98eYiQen2Lhm9tjJJ5dHhqaoCCcZaRi4F+loBJk5huaHd+gmxpY2x5hZCShmtzbHxucnuGaW1wf3ONiYSGen1+e3ZvdHOFgnmBeHB8joyKlIOWl5iakJKVl5mXnpeMg4mfkYuSjYaQln9uaW5vblhVV1RSUVlPUlRUU1hVTU5ITktNTktDSE5HRT87OTk7OTk6Pjw5PDs6Oj0+Ojg6PDk/ODY4NzI3NTY1NTQxNDMyLzAyNCorKiotListKigqKCcsLTEyNTAsNTU2NzQ4NUhBODk1d5mRm5man6WtsKKsqqi1r66stL+rvMK/pqKZlaSXnY2Ei5ShoZiYkZOLc456f4WLhXRudGtwbGRralhORUZDQDw+PkFGRkdLS0tNUFJSUlRUVFRWVldXWFlaWVlaV1ZUU1BMRTFAmjMganNDmW87PDk1PICChl9JTU9PUldaUVlcYKeIYpppdHplf3Btf3qLiXaBiIZ0bJqSdHN8amudj015hZKJhI5nMXaGc2x+foN0ZmV0foSEhYBmaWx1a3GAfGdxcXtuk42Pe3N9fHFwbnVtgn94eXVqeYmCiIqElpOSkIuNkZSUj5eOgHmIl4iGioaAkIh2ampvaGVYUVpXWVlbTVBVVllYTklIRUpKSEdCQUZEQ0c9OTk4Ozk6OTw6OTs6OjpAPDk6PDk4Pjc4NzcxNTIzNDUzMzY0NTAzMS4qKispLCwrKykoKycpLCwyMjYsLDU3NzU0NzhpTzg7NW6SiJqRmZakqK6esp+nu6+rsrDCsbvDx5qWj5SZi42FeYSQmJSNkIyPhnGHgnOHjIV6b3Jwbm9kcGZfVEZJQz88Ozk6P0BBRERFR0lMT1FRUVFSU1RVVlZYWlpZWFZVVFNQS0U4MC9cYLNHOVhQOzk0NDGWuotITE1PT1FWTEFJUUlir7Ogcnx4bH1tcoOBhYF6hIaGeXKhlXR4gXN1lIc1cZ2onY6hoYSihXZwhnyHfHOMrY2JgGdmYmpucm1wg3Vpb1h1cI6akndsf3t9bXFtcIB6c3ZuY3aEfoaAhZCRiouJkYuRjIuPg3V4i4+AfoOAfo96cXBva2BbXF5bWVhgX1JOW1pYV0xISkZKRz9DQUJHPkNEPTs5Nz07Ojs7OTo5OTs6Pzw4OD06ODs2NjY1MTEyMTI1MzQ3NDUzMS4vLCwrKSopKSsqKikoKikrLzNETTIxNjY2NDM8dlI3PTdikoGTiJaRnqSnnq+VpbWqrrGuwbK7wcaWkIyUkICIfW6BkJKJg4qHj4V1goNslYiHe3R4eGx3bndjaV5JUEc+QDc0NDk7Ozw9PkBCRUhMTExMTlBRUlVVVldYWVhWVVRTUExFPDUqnUtbQC1nSTk0Lz+Sg6muX0dMTU5QTDdDTVJTREqGdoB8fHZ+bXeIiHx+hYN/jH52opl5foaBhZmEm5xhhqqfnYuDkI56d4h+iYiNc4qXj4R6XWRxdHp7d4psZ2pieW+Fj4J6boF3dIR6cHR6d2tuaV53h32HfIiHj4CLkpeDjYWNh31xhH+EfXV3e3yJdnBzdGVnX1tbXVNbZl5XUVVYW1VHSkpETEc/RkBEQz5BQT06OTc8Ozs9PDo6OTk7Oz0+Nzk+OTk4NTY1MzI0NDAwNDY0NTU1NC0sKSsoJycnJigoKSkoKCsrKy8wMFVxPTIzMzMxRX5XND05XIx4ioCUjJKdnZ+mkaCroLGor8CxusW6lo6RlId6hXZrf4yRgn2KhI6MeIOAc6GEi319gX5wgH56Z3ZrUldMQEUyMTEzNjc2ODg6PD5BRUdGR0pLTU9QUVNUVVdWVlZUU1BNRkA6Mj0gI5ZjjFs1MzExaT9Hb0lGSUxNT1JMS1RdWVJKaYSIe4l5fHF8j4x6fYmHfpeHdqGZiIePkpSljaypSIaur6+LgYCTioKLgYSRqIeAmJiKnHNtfIGGh32OaGdoeH5uhYeChXGEhUdrgHdyeXZobWtfd32DiX+IhYx6lZ6biYuIkX96dYt2fHhtb3d+f3NzcmxbXV1bY2NYZmVcVVBQVllQRExLRk5JQ0ZDQ0FAQ0E9OTg4Ojo6Ozs6ODg4Ojo/PjY7Pjc1ODU3NzMzNDQyMzY2NTY3Njg7REZMTU1MQzcrIiUnKykrKywvMDArbnUyMjQyMEyBXDU9PF6EdHx+ioWIkY+WmJKXoZ2soaa4r7O8s5eNkouYi310cH+Jkn59jIKSlH2Gfoakh4h/goiFeIeIfnOEeF9jV0tCNjAuLzIzMTMzNjY4Oj0/QEJFR0hKTE5RVFRVVFRWVVNRT0dDPzgwLCOHWz4/ODQuXZZwc6NVRklLTU5QV2BZcFpcXmqNk4eVgYSChZGTfoWIkYGalYKgoZeVm5qlrZOau7Gnu8fDqIqMoaWPlImBkXtxg56fkZx/doWFio+IkGlob4OAdY2HhItxhoJ3h4B7doV9bnZ1Z4CUj4aJiIiIh6GroZaJjph/eoKJenpvZ2t4fnp+cmpkXlpaXWpcYWZfWU9LTldSUUhQSkROR0NKREJARERBPDo4Nz08Ojw6ODg3Nzg6PT04PD02ODY1NjYyMzQ0NTU3Njg2NzxCQj88ODo+Q1FeZVxHMicmLCwtLS4xKD+LWy4zMTBPg180PztudXBmeIN7gIyAgZGPi5qbpJ2hrKarr7CXkZGEoZSEeHd/jJR8f5KGkpV/ioCSm46DgIGMi4KJjYN/iX9tcGpdQkE0LS0vLy4vMDIyMzQ3Nzk7PT9CRUhKTlFSU1JTVFRSUE9IREI8ODcvOUQ+PDw2My5sk5dNUEhKTEtLTlZgY39nZ211nZuPmpOTi42OmoiTj52LoKCSo6qlo6yTqLaiqMHDrseveLqUmnyNoZ6ZhJOFgo6hn5SZkoSKhY+YkZZscHWJi4KWjI2Pdo+EcWyFgYqWkoOFiHKJoZaHk4mPj5altambjZWig4eThH1/a2prfICBgXNhXWNeWmZrXGtrXldLR09TUU5NTEZJUENETUZBQ0VHQj45OTc9PDo7Ojk4Nzc2Nzs6Nj06Nzg1NDU2MzQ1NTY2NjY4NTU2MzEwLiosLCkoKS46UGFcQCwoLSsrMCwncog3MjQwT4RiM0A8dW5nWXCCcHWHcXaShn6YlpqVn5+cp6CqlpOYnmdlpJp+hJKReYCSiJCSfYqFmZKRgoCAi42JhZCGhIiFeHh+Z01SPi8uLiwvLi0vMDAwMjEyNTU3Oz9DRU5QUlRQUVFTUU5QSUVEPjs8OkNGPz48NzUyPD9SNUhISExMTU5SXm+KfHOBfaCdm6imopmhl6KVnZ+onqmrn6isqaq1l6u/q7bIyLfJ0c++m6Bwaaupn4SUkoacoZqamaeRkYiVopqaeHp+lJiSoZKXl4GUnnt2lZKrs4mNl6B9lJ6cjpOWmaSiprawnZGZqIiWj46BiGxzcnx/fHFoYFxgXmJnY2BnZ1xRRUpLUE9JSkxGRk1DSExGRkNCR0RBOjg1PDw4OTk5NzU2NTg+NzU9ODQ3NDU3NTQ1MzY5NTg6NjE2ODYzLzAuLSosLy4tJyMqO1hiQigqLDEtKEuXXjA2M1GFZjJBQGlhXlBwdWBufWF3jn18lI6Oip+Sl56WnKqYnqpCRH2HiYeYjXiCjYqOjXyKho+QjoGCgImMioSShYOGiYGAhndfYlA0NjAtMS8sLjAwLi8uLjAwMTU+QUFNUVJTUFJTVVJOU0xFRUA8Pj1HR0BBQDg2NjI8OTtGSEdJSk1PUVlthpB3lYujp6q0vbilrqysp6i0q7C3srKtu7GzvpyzxKy7ycu4xL+4paOwsqytq6SLlpiFpqagopeBppmNoqqopIiFlKShoKqhpKmOnLGLlaOnt7uboKOwk6Odo56RpKKrr62ztaKVpaqImYmSipZ6en6FfmdgaFxlYl1kY19mZl5bT0NJSFRPRkhMRkpHRUZIQUtGQ0ZGQTs4Nz08ODg6OTc0NjU4PDU0PDc2OjQ0NjQ0NzM5PDM4PDIwMjU1MS8xLi0qKi8sLSooKiYlNVhYLywwLCwwhIE4NzFQhWg1QUNbWFRMaWNXanBYeoV2gZSFiIKcg5KQjZLayJ2Wc1aXiI+InI98hoyOiop6iIKHkY6DhYCLhYaHkoaChImGiIeHcW5hQEU2NDwyLzExMC0sKy0xLy00P0RBTVVRUlNVVVdVTltQR0dEPD4+RkhDREA4Ozw1Qzs9RktJR0hST1BXgZOghK6js6qywcfDq7PGtqyzv7O4vra/tMG2u7ukuMaptsnHtb65tKijtK2xsZyakpqfiaevq6SVdp+kl6GrsbOYlqquqK62u7K6rK+1orGssbW8t7WutaCnqKOom6mwrbK6uLinm7apjKSOkZOgh3iCg3VZYWRWZWFhY2BhZV9aVUpERUxVUUhJSkRJR0VBQEBLREFNRjw4Njc7PDk3Ojk4NjU1NTcxMTw4ODk1NDY2NDk3Pj0zODkxLjAxMjExMzAsKiwuLCsrKyooJyopRVowMCovK2iSTzYwUodqNkFFV1FKTFtaUWNkV3p1cYKUfYWGk3aFfoCNe7+7o7yCtJSTjZuPhIiPkomJeYaAjJOMh4WBjn+BiY6GgIaJhYqHkXp4bl1WQEVNPDY6NDZBQjc2NTAvNkNIQ1FcT1FVV1VcVk9eVUlLSkFAP0dLRkVEOz5AN0Q3P0JKSkVHV1RQXo+lraOxtMO2uMHMyba8xb2zs8C3uMK1v7C4dLK0prrFpLDGubGzsbSopLW2qrGgopabopKlsK6lraynpJigrLO6oqmyurW7vsy/xcW9vbPCt7q4v7e6t7msrbCmsaqtvrC9u8LCrJm6qJSuj5iYq4l+gnxqV2JhWGplamVXW2NZVlRJR0dMUUdDSElBSEQ+P0JCS0BATUM5OTY2OTo/Njo5OTY2MjQ2LzE5NTk5MzY0NjI3Oz0/NjoxLi81ODo5NjUwKigsLS0tLCwqKCgrKyhFUy8qMDBKj2s1MlCHbTc/RlFMQUxSV1RZVVp3anB/j4SBjoVuenJ5iGK4oZmjiZWTlpOTk42Ql5KHh3uGgY2VioCEgIp6fIuHhnyKg4GKg5V9d3l1ZU9cZEdFTDpRZGFbXlNGPztIUERaY1FRWVhZZ1lUYGBNU09FQT9JSkhFRkFAQz1FNkI+SEdLTFNaVF2Tr7i1urnJwLu9ycy7vMC8t7W8u7e+tbqyxmB1s6Wxmp6rvaqlqKuqo6KytaGrqJ6Vlp+YoK6lp6elnqSUoqextKeysry2wb3TycrTxsLFzMLKw8C+vb+7vLe0sLm3t8O6xr3DybCeuaqirI+lqLeJgX9xX2FhXFdhX2hmUlhhVlJVSUVGTktBPkdEPUtCPUJAPUY9O0hANzk2Mzc5PjQ4OTo1NzA0NS8yNjM4OTM3MzUyNj84QD5HS1JUVFJQUFFSUUpBOS8sLCwqKygoLC0sL1A+KC40OIB9PDJLiHE5PkNLRUBJTVBSTFFdaGxscZCNhZB0bXNyc4jVwLWZoI2VmJmRjpeSlpaOhod9hoOMlot/g3+CeHqLg4d7i3mBioKXf3R9emtlcHVZXVxQZWViYGVkXVtYV1xNZG1VUm1tX25fWGdlVVlUSkRBS0pIRkhISEhCSTlEP0hLVFRWXFpbkrnAub23xsC7ucrLure5tri5s7i1tK62tplkdaierXBeoqycmKGjm6Seq6WUoJ+QlI6WmJeon6afn5qZhKSdrKWqsK23sL251NHP18/JzNLMz87Kx8C/wsq9wb3CwMXExsq/yM60pLuwtbCbrLm9mn95bF1fW1hdYVljY1FbYFNRS0NBRUZEPEBFPkJIQkBDPTpFPj1KPzQ3NTM1Oz00Njg5NzcwMjIvMjQxNjk3NzU1NTVEM0VMTT41MTAwMDY6NDc3QElPSjstJioqKC0uLyxATSsvNTRtiUkwSIl0Pz5CREBDREZLT0RSXFlpX3CXkpGUb2xvdXWIs6yhoZ+LmZyZjI2VkZuShYqKfoiHjJCLiXyBhHN7iYOGfIl0goqGlX9ze3hsbXV7aHJlaWxpZmppaGBmaWhtWm10l62kvIiHZ1tvaF1aWVRISk5QSktRTFRRSUxBSkdLUF9fYmZpYZi3x7C5s7u+trLEx7WvubCwu6yzsaeqt6yNtqeem6eaT5udjI6glpGmmKWVipOTiZCJj5GRnpuhmJuVl4eemqabrK+or6eztNTU1dbSy8/T1c7Tz83FwsnQv8rJy8nSyM3NwtDSuLDEvMS6pra7xKOCbmNcXF1YYFdYZlpRXVdOUENCSEVCSTtBRD5BSD8/Qjc7RD5ASD00NjY1NTs6Njg3NjU0LzEwMTQ2Mjc4ODc1MzY3QzVCOD8tMCwxMzQ5PTk3LC4sMTtGTD0pLCguMDAwN0s/LTQ2VIhXMESHd0M7Qj5FQkFDSk0/VVlTZVdzkJCYg2hxb3l5g6CqnqaXjZubl4uOlZGajn2Ji4WOioqLkIh8hIJwf4eBhnuHcoOSi499cXh1bHF4fnF7bXhzbGmBcG1jaW1weWl3fX7Lv8Lfp21jeG5jW2FgSlBSVU5ZXlBdXU5RTlRRVVRcbm53gnKWrristKewtqutvcCxq7WmpbinrK6hrLSjjrGumpiYjJGUkYSOm4GNppGciYOLhIqJhIuDlJWYl5SbkZyYmZmenquspKehrKzO0tXRzczS09TQ1NHOyMPU0cjN0tPT183S0cXS1sbAzsfIw6m/uNCeeW5lXWJcVl9SXVtPUFRQTkg+QUZBQkU8QEI+RUU+Pz86PT08PEpBNDU0NjU8ODg4NjY0NDEyLzAzNTI2NzY4NTMzOz08RT1AMTErLzM0OT81OTAxMDIyLTJFTzMpLzMuMzI9TjI0OEN9XzJBhnREOj09ST5AQ0ZIPFZSTU9bdYaFindtd3B9foChnp6hi42Zk5OMjJOPloR5hZCQjYuKiJGHf4J7cn6Agod6hXWFk5GJf292c2xzfHt2fHOBd3FrgHNyaW9xenlye77Lmn6MsoN2coR2aGFqXUNaWltWZmRYZWtUWF1cYGNdY3h7f4uBmaqkpKGgoammqrG4qqW0o6KtoqOtoqexn4mmmpSSkYqSjoiCk4lrlaKNmYSAhX6Rg4OTlq2LlY2VmY6FkpCdl6ewoaChpKSox83PyMLL0NPR1NLO083G1tLM1NjW1tjV19XJ1NrNydfW0cqtxMPMinJvYmBfWFNZUlxQSkdJSUpAOzo7RUFEPEJEPkhCP0JCOzs5PDpHQjQ2NTQ0PDU2ODc1NDMyNTAvMjU0Njc0NTU0NDw+PUU/QTYyLy0xNjs9MDgxLzI1NC8tLjtSMDE3LzUzMkVEMjg+bmI1PYF0TTk5QEk8QUQ/QTtQTEZLWXCAdX1oc3lygomBnZWdlIWLlomPioiOh49/d4SUmYuNiIiLiX6DeHN7fYOHd4B7h5GXgYNud3BtdX92eH1zhXx5bYd2dG99doR1eXudtYw8QYvGpX6NfGllVklDZWNmY2hqZG95W19maGtuaW6Ag4mRi52eoJ2Ql5ifo6OmsqSks6CipZ6hqaCisZyGnpKSkpCLjouGg4+EfpybjI2DhIV6lH6CqZWjjJKKmJKLfZeKmpGrs5iam6ecp73Dxri2xs3S0NLQzNLLydTO0NXa19fY1NnYzdjbzsna2tLWv8zMtHd2bmRdWVJVUFlWRkdKSkVFPTo3OUBBQjpIREBFQ0FEQTs/Ozs3REM3NTY1NTswNjg5NDQzMzQxMDE0NTU4NzQ0NDQ5QD5EQkM8MzMuNkZUV09RSkFKRj8xKiguQlQyOTI1NC83Szc1PGBiQTxzdlY4N0FIOj9DPjw5UUVDSlRsbm9wYXFxc4aNfJeRnYt+h5KDiYaFioKHfHiFlpeIj4OHhod6hHlxenuEhnV6hY6NnXqMcHxvcHp/cnyBcYOHgW6OenR3fXyCdX98h4iwdFipwraMkoJwbmI9XmhycHFwbnh3gmVpb3J1eHJ7i4eOlJKblqCWh4yTm6Cbn6qfoK2copqZn6Wen6yZi5qMkZKNhX2Ih4OEi46gmZOIhId+bZl5hJiGiJOMjZWMhnubiJOPrqqUlZeemKautr2orb3Gy8jJy8vQycPRytTW2NfY19Xb19PZ29bP29rR1sjVy5V5e2hoW1lQU1NdSENFSUk+QT49Nzo9Pzs+SD1AQUFBREE+Pjo4NkRCNzU1NDc5LjU2NjQzNTU0MjMyMzY0NzU1MzQ1N0VCRENFQjU2PEZOU01bbmZjbnNrYVY+LDRMRzg2NTQzM0JGND1XX2hMdXheODs/Rjw8Qjw5OUQ/Q0dSa19tZGJma3aAiHGRkJuAeYCOfoOCgoV/hHx8hJeOh4t+hoeAd4J5bnt7hoF0epKejaF2j3WCdHWBfXSAhG+BkIJvkoR0fIGFenaGe4m3xqTCybiBlpuPd3BlTmZjgXqBd4aikIt5eXd7g398hHZtlJaUlY+XkIOJj5aal5emnJigl5+TkpejnZqrlpGRi42Sg4yFiYiBhZCRnpyZiYWMgYaXe4iIn5eQiY2Ki4J8oYmQi7yhl5OXmZyopqWunqe1vsDAucfJzc7FzcrR1tXU2dXX29TW2drb19va2djO28aGenlmaGRfVFdWVU1LRE1DOz09PDk6PD45PkE2Pj9APT8+PDk4NjdDQTY0NTU9ODA2NjU1NDc3NDU2MTM4NTQ1NjQ1NjdISD1ESkU3OTI1O0g+Ozo6N0lQXVpSVVhLOVQ+Ozk1MzI3STg9TllNSHh4ZDU9PkM9PUA6Njo+PkBFUV9ZZWFdW2h0enlsiY2Sd3Z6inx+gH+AfYV6foKRiYSFeoWIe3V9dG58fYZ+dH+SnpGfg5J8hn54jn14iopugpqAdJiFfoGJhXx+kHqPqY+Qw6C8jJyknH2JhH2Jc4yKfnOmmpyZlIV7j5CJhGhHcaGknYyLkJKFiIuRkpWPnZqTlZGXjYyVn52UoZSSjo6Qi36Qj46LhIiSlpqfn4mMlJKekYKLf6aZiIWOgoaEgKWGioy4mJ2RlJahp6Cdnp2jrra6tau/xcrQyMfMz9PS0tjS1dfA19jZ29ja2tnZ19y3eHh3amlkVmBbU09OSERMQj09Pjk5Ojo5OTw9NkA+Pjw9OTo7OzM3REA4Mzc4PjcwNjg4MzU3PDM3ODA0OTc2NzU1NTQ2RlA1RE5JODkzOEFLPTszQ0BJPDlEV048TVRITj85NjMzMz5DO1tYPjVZeXBaPDxBPD0+ODU4OT89RFJTUlheVVhmbW1taYGPinFyeIp7e399f3yIenx7i4eCfnWDhnlzenNtgX6EfXeGm6GbnpSSgIuIf5iHgJySboeohXqgi3yQjoOIhJx+mpGKjaOioJCkr6CLkYuFi4GShldyrYufrJyPg5ibkJCOXIOikYKMn5OVjIaIjJKTjJSVlJCMj4qIlpudj5WWkYuSlIaAi4mSjYmKnZaZo6OGk52WoYuKiI6ckIOIj4CDh4WkhoyQs5ickpSXoaGemZKbnaexuKylvMHHzcfGz8zPzM/Xz9HUrtbV2NrZ2trX1tnan298dGdmXF1YU1ZXQ0BJRD4/Pjo0OTo7Nzo7OjM7PD89Pjc7OToxOkc9OjI3PUA1MDY3NzI1NT82NTs1NTg1ODo1NzczNUhSN0dPSzk5ND1FSkI+MUZDTEE5ODpHWEA1SFdJNjYyMjM6RUNlWD8mX3lpX3o+Pjk8Ozk4OjxAO0JRS0tTWVBUY2J4bGJ+koNubXeLeHl+eoF9hnx7doaEgHNwhYJ7dnZ1dISDhX1+kqajnqailomdkJSWi4qol3KKsoyEp5GEmZOEmYyilqCZk4manaKSqa+fkZWQjo2IlYtujbeEmsTIsp2ipZucmJaRspBjpM3IlY6Gh4mQko6Nk5SKhYqKhpaam4+QlJOHlZiEgI+LmYiNkKqXl6SjiJmelpuJj4eXl4uFj4yBf4aPpYmNk6iZlpOWmKGYn5mTnZuisrSlo7zBvsfFxcnIycLK08zN1KjS0dbW1tja1NPazoJyf2hiXl1dTklUWUFCR0Q7QT04Mzc7PDo4PTY0OTo8OjgyPzk5MjlJOj42N0JDMzI6OTYyNjQ+PTQ7PjY5NDk7NTc5NDRLUTxKUUs5QTdCR0lANjRKRUxGPjw4OEVUQTc+XDg2MjE0OjtFYFhBRmF0aExjWj41Ozo6NTs6PTpFTUZIUldTUkJjgUZ2gY59fG1+iHh6fnqCgoN+dnaAgnxsbot/enx4eHyEh4p+iqOzp6Oqs6GWp5+lo5aVrqKDkLiVkrOZjKGhjKSbr6OknZiQp5anmayvpJeVlpWQi5iZlqDAjqPJuaubo6atmJGbnbKdhYWoopyYhYmJjpWNi5OPiIGGh4mTmJWMi5STh5SYhoSRkJx0kZmzlpeloYicmpOQipGKl5uJipaOhn2MmJ6JkJCcmpmTmJeflKCdlZ6boLGuoqS3vrTFx8S9w8O/xs3KydKmzs3T0tDW2NPQ2LtyeXZdYFVfVk9ISk5EQkNFNT46Nzc6Pzs8Nz00MjY2OTc3ND01OzU8TDw+OzxCQTc1PDs0Mjc3P0A2P0A3ODQ5ODc7PDU1T01EUFJMOEA9RUFHQTU6SUVORUQ6NkFAQlM+OURPMzIzNTY1PXZcPFJcdGlaTV1TPD04ODU2Nz06SkZER05bXFlKZmA7SISLentuhYZ6fIR4gYWBfnB4fH59b3KNen2BfHiGi4mGhJKnu6yosr2vpK2zs6ijorCsipq0naO4pJWtpJeprbempKOfmamXqaOvsKmamZyUlZGXoJiau7uuyqFqtrirsJSYn6Ork5e+o16qsoKJio2Uh5F8jo59g4aOj5SViIeTl4yQlY2LjJeYkp2ZtJeWq52LnJSSjZCSjJmbipGekIuJlZ+hjZSNmJqdk5uYnpShoJScnKWvqKGks7irwsjEtbq9u8XHx8LRoMbJzc3E19bRy9ShcHpoXFpTXlFPRUM+PENBQjg/ODc1PkY8PDU8MzUzNDU0NTRCMzk6Qk06QjtBSEI7OkA8NzQ2PEI5P0BCODc0Ojo2Pjw0N1RLQ1VRSjc8OklBRUA0QUpITkJBPzZEQTxKTkQvVD0yNTQ6RUpcWEpaUW1ncHBEaWBLSTY3NTc6PkpAQ0lQZEdiYGJwSkCLin+Bc4aHfYKIdYOKgn9tfX18f3B3h3eNgYd7jY+MhoyZqsLAr73Gu7O0wby0rauztounsq2uvKqbu6Sorbm4q6amoqGjo6ivsrGqnJykmJqXl56ipaWSpLquqcC8ra2yuaWkp32Ih5ysvbCDjIyLkIOPg5GPeoGIkI2OnIiHj5eNi5WXlJCalp2nmrGakaycjpqPko6VkZCWl46RoJGJlJujrJSWj5ScnZKfnZuYoKGUmp6npqSipLCypsHGw6+wurbFxMK+zabHw8fDvNXRzcTKiHRzYlxZX1tNSkJMQEVHPkE/Qjs6ND5BPD01PTY+MzMzMjQxQTE3QEJOPkdAQ05DQT1DPTs4NkNCNUJJQjo4Nzg7NUI+NzlWS0RXT0Y4PTRLQEM+NEVLSE4+QUE2QkI/QlNFNThQMTQ1Ozw4O0Q+OUxqal07V1JkS2daVU83OUdFP0NGXGVHYGlnWl1ck4yMiHuHi4aDjHWGkYqBb357gX9xfoF6lXqSlJSYkJOVp7PGyb/CzMHDuce8uq+rubqXsra6ssCupcCkq6+7vKqtq6KinaeqrrSwqpufqpuhm5WfsLSni6O6urbBvKyonLKlpKiUhY6qw8SkgouPh4iEhpWUjXqDjZGPkaGMjJSSjoiXn5eTmZWYpqCvnYyqnI2Vj5KRlJWOkJWRj6GUhpefoLKelJqUoKCYpJ+aoJuglJiepqSmpqSvraXAxMKuqLe1ycO+ts6yxL7EvLPRysjCtXV5bVxYXGlTTEhETEtLSkFBPUNEPDVBRDs6Mz04QjMzMjI2M0EwNUlFTT5JQEhSQEg+Q0A7Pj1GQTVBVUA7OTk4PDdFPjg+VkpDV09HOD80TEBCOzVKS0NMP0I/PEJGPUFITDkrRzwzNjc0NjRBPzdPYU9hRS89PjZrbGpgQDpIPj9FQmZaTmVcZlRjapmNl4qMiJKQhol5hpSQgXKAfI1/eIeCgpB5jaGWqJqamLq9x8jJwdLJysLNvMGzrbu+p7q/vbzEt6zBqayzu76qsKmjpaOsrbOttrWgn66epaKYo7S8qZuovcGjt7ewq5Kwrausl4aaqqalkYKMk6WViYF2ipJ6hY2SkJ6fk4+Ui4+NlKOZl5yVlKOfqp+RpZqMj4+QlZaIfI+VkpKjmpWgopy1ppCel6WjoqWenaaYnpWXm6WjqKeisqyovMDEr6Wzt8zAua7Es7u+wbiswsPCwJlteWFYV1xbS0tNSkZERElCQkFETDo0REg5OzQ8N0UuMTIzNTJCMjZTSE48SkJKUUVLQ0RFOkVMQjw3RVY9Oz04OT88ST86RVVJQVdRRzdBOks6Qjc5Sk1CSUBDPjxERzxCQ089MjBIMzY2MTcwPUI6PWpqSks1UVMzU3BwZE47RD1ARj5qSF9YYVpkZFaej52Ol46ekomKf4mgk4R4hX+Vf3+QiIqQf5ahma6mo5jCvsfDx8XTzc7Ny7zCt7C5vLO8y7zDwbW2u62zv7m8rq+ooKintq2tqbG3mp6toqehnau3t6mlsL/Esb65s6eqtbOtrpaWpayooJGOkrHFp5WOfZGVfYiRmZCqmZiTk4+TlZOlnpOdmZOho6KcmJ+Zi4yPj56IWpCWl5KWpZllmKOesqWWopasrKqnm56ml5iXmJWhpKimn7arqbq8w7Wms7XLwbiptqyyuriuqLe6vbiCbG5aV1RVTkZKU05LP0FHRERIR0c5NUZNOz43PUBKLjMyMDI1QjU1UFZOPExGS1JMT0hHST5JUT86OElTOzs/Nzk+RExCQEhTS0BXUEY6QT9HNkE3O0hNQ0U7Qz00RkU6QkFCRzkvOkEzNjAzPkdEOTQ9dGRNRztFKzpmfGdWOz1AQkZCcUZpSVJlYkxGpZSclqGXqZaNkYOHppOIgoeCnISDlZCQlI6aop+vvq6hxrzFxMbGzs7O0sq+u7axuru7vs+2xL23uLeysbWzuLOrppyrq7iqqKevsJejr6SnpKS1wLCqrLS/w7rAurOnubW4sq6Vpa2vr6WLk5WhjXTBmn6XmYWPlpqMsZWampWTk5mZpaOVn5uWmqmdnKGgmouNj5adYEqWnJqVmqWWVJawn6+cn6WUr66spZqgpZSTmZmOnJ+nopm0qaqzvLy8qrCyx8C4paurrbGxo6GxsrSkcG5mXFpOUEtEUFBQUTtHSklHSENDPjpLVT9BOj1FTTA3NTQ0OkIzNE5XTzxKS05VTlFKUEhISk9CPD5NUjs+PTg6PENSPkRIUklCV05JQEJBRjM+NThKS0NBPUM7NEVBOkE/PkhANSpCNTIsPmNdZzozNXRkZUBSNyYjM31oVzs6QkNAPVFFV1NzYldGSKqXmaCiqK+ZkZeHi6eWjomThZ+HhJ2Xj56gmqOktci0qca6wsPHycjIzM3Gvruzrrm4wMHNtsi6wbi1urCvr7O0pqObqrO0qqimrayZpK6lpKesur+oq7W3v8G/vrmzssSxub2so661rLqmiJyYppt2v6CFmZ2Ok5mai6+XoZycl5Wbn6GpnqigmpqqmqKnnpiQjZGdg252kqKalZ2inpCusqKrlaiql6qupaSfpaiSkpmciJScop6Wsaapq7q2vrOyrr65tqCjp6ilp5ybrKmpjGJlYV9SS01HSE5JVUw9TEROSktCQ0Q8UVU9QUFCRE8xOD03Nz9CNzVVWE4/SE5RWVNQUVVLUUpKRUFFTVE/Pz04PTtHUjxFRFFCR1lNS0FIREU6OjM5S0lCPkNCOTlDPjxAPjs7RzctMj4tMYJoTnpcLzBraGA8PUJCODZ6Zlc7Oj0uLlJgTVVIf2VeSEWrlJyhn7uvmZSfi5Oqm5GSk4mrjYein4ykrZSjo7bGvbTBusLCx8jFws3Iwb25sq+5tMDCyrXFscG8tLqqqK2tsKKimaq0u6appquqnaivp6Oqqr67p628tLe9x7y3tbjBsb3As6m1t6u/pY+jmJGioLyfiZqgmZeeno+3n6mcpaObnKGaqKWzoZudppyoqp6Zlo+Um4uXiYylopSdop6gtK+lpZOwq5mrq56dpKOokZWVoIOPnp6clamkoqG0tLq1rai1srOenKKlmpeVmKqhnndgXF9dSkhGR01RSU1FRkZCUkxKQkVHQFZSREg9QUdRMTtCNzpCRjc5XFlLQUxQVFVTTVdSTlVKREBKSk5POUM/NT08TlFDPz9QP0VaTUpBS0RHQDUzPUlHPz1FQTk3QTs8QDw8M0A8Lyc7KkiRQjpTSjAsW29XNzE8Kh1CgGRUNDktMTpnXEZDQ5xwYkdFp5ekn57DrZuXpJeZqZyWmpqPqpaVp6aVra2Zoau2xMK7vrfBwsDHxL7Nxru9ubKvuLO/wsi1v6+7tri2pqSqrK2goJqqqsSipairpp6rr6yiqai/t6atvbC3tse2tbi4v7G/wba0s7SvvqOXo5aUnJSuoJGioqWjo5+QvqWpnairnZ2gm6afvaKYo5+iqauhnZeNlZ6TnoePhY2TnqShnbWspZyVsqeZr6efmqmeoI2ZlZ+EjaCam5OlpJqYq7G1saqlqq2snJigoJKOkJaonpRoYllhXU9JR0pOTEhFRElBPVBJQTxHSUhbUk9LPUhPVTRCRjk+SEc1Q2FbS0NOUlVXVlFYVFJVSEA4UVFQTTpHQDRDSFFTSUM8Qz5HVktDQE8+SzwwNjtHRj47RkE1Nj85Oj85OzE1RDAtLC9Ndlw0S1o1LE1uVzwtPSkeI3piUTVDS1E6blJGPEt4ZWJXTKKao5yexayhn6ydna6gk6OflqWgpqmrl7axo6qytcTEvb+2v8K7yMK+ysi2uLW1sLOzt8HGtr6wuLS4tZ+mrKqsnZ2epaPBpaCqrZ+kqa2voqanvbWlsby4trbDsrO3ub6yw8C3uK6ztbWjnaWVkpShrqCZop2pqKujmsOtqZ6srZubnpmmob2inaWYq6uspqGZjZmfkp+Jj1d/lp+moaC4qqeTmLajn7KhoJuulp6OmZSdgo6fl5WOoqSVkKausqupoaKlpZWVnZiLj5GTpJ6JYWRZY2BMSEpKTkZFQUZLPj1KQjk5SktOXVFRST1MVlw5Rkk9RE1JOEhiXExDTFBTWVlWV09aXklBPVdRSUs/SEA1SE1YU0hBOkBBRFBIPz5RPks3MDk5RkU7OEc/LjY+Nzg+NzcvMT85MSUxUVVtW0pPMTA9Z1dEMTc9LSt3YFM2U1prV3JIRTY9dWVcS06en6GYnsOopaKzoZyyqJOrpKCkn62prJ27sKistbHIxcHCs8LDvMbDvMTKvK+wtq2wtK+/xLS5sbC5tKyZqLCpqZqdpaGnwq2brLGbqqKusKmkp722pre7va+3w6yzs8K/ssazurestLatqqKmlpaVpKyin5+aqKuwr6+8sqagqaiZmZiToqS4oKGkk6+vrKWnn5KhnpWej5CNlZ2ao5+ns6amjZi0nKOump6brpCek5eUmoCRoZaOjZ+hk4umrLClpqGcoJ6SkpqThYuSjZyef2FlW2dlSklMSlJCQ0BJRzs7Rz85OU9NVV5SU0o+T15dPUhQQkxMSTlNY1xMRUxSVFlbU1VPXGJIQT9aUUFIQUtCN0ZFTEtOPjtCSEROQj07TkBBMy85N0NCOTdGOys2PDQ2PDM1LS80QDErJ1Z0U2VPPzEwNGJbTTIzPjA8dl1eP1tUXmVxQDg7SJZ3ZUE0n6Ofm6DDqKSqsqGjtKqVs6ynoqSyrK6pu7KssLW0xsDEw7XAxL3JxLXAyMG0q7Wor7isv8S0t66strmlmauxq6qYn6aXrbu0m6iwm62frrSxp6q5sqe6s7eyucCqt7LCvLTFp76vrbe1qqisoZeXkqaloqOYmKWvuK6ytbagn6mkmZWVk6Sgt6OkppausrKnq6ahnpuam5aYqJ+gmKKer7Kipo2Xrpmlq5eZnqSRm42Tl5qFlZ6UjI+cnpSLqamqoaegmJ6VjI6ZkIGFlYmUn3hjaF1rak1QTU5UPUNBTkM6OklANzdST11eUlZRQVdgXEJKU0hWS0g6VGRcTkZPTltXW1JQUVhdR0FCW1BCRz5OQzlIR0hPUD8/Q0lCTEI8MklBOTQxNzdCPjs3RTcrNjkxNDgwMi0vLjw2LSNCcWdzazIzLzFbYlozMzgwNnBbYkgwNUlwaFZDV0aMeWZDO6SjnKGmv6aor7ChqbWrnbmwq6OqtLaxsLm3r7a4uMW+w8e9vMTBxsC4wMbAuqm2pKy7rMDCt7eprLG6opWtsK2ylqWnkKq5qaCnsJ2qoLC0sqqptratu6yzs7q3rLmwwrq9vqbDq7C3r6mrq6eemJmroqKgkZihsa+zq7G6m5ypoJmWkpemobeppaOisLG0q7Koq5+boKCbnqWdopedo7Owmp+Qk6WaoKialKKelZiJlJiTlpack4iQm5mUjqmopp+im5ebk4eOmYt9jJaFj5tqaGxhbG5XUFFaVEFDRVRAOztJQTc6WFBkXlBWV0RZXl1NTFJOXktKPlpjXk5IUE5bVVlQS1RXWkk/RFhQREY/TkA9SUdHUVBCPURGQk0/OjFEPzc3NTQ3Pz05NUU0Kzc1LzI1MS4tLiwxPSonKz1ccD0+MS4xZVtkQDE2NDdnWWBGKD84bH1oW1Y7iXtjQz2nn5yhqb2hqq+ro7G4qaW1s6ygrbW9rrO4vLq9trbAw7/IxLnEwcDAuMS9wLevtaert7G7vr+0qa6xtp6Xq62orZanqI6nu5+krbOeq6KxsLOsqba0tb2tr7G1rLC1scC6xbervK+xuKytqqOxpp+lqqCkl5CZoLOqs6qrs5qdp5ualY6gpqS0rqeira2usaezrbKqpJyfqKSelaGZm6i1qZeZkpKfmZ6gnpCrnpeYhZWXi52Zm5OKjZaXmpempKKgnZaVl5OAj5SFe46Sg4yWZWxyZ3BxX0ZZZlZEQ01YRFo5SEI2Pl1RaFxOWV1HW15dTk1SWGRKSkNcYl9QTE1OWFdYUEpWVldMPUVVSkVEQU1AQUZISFFQQTtHREZLPTg3Qj02ODcxOT48NjVEMCs4MC8wNS8qLC8tKj0sLCUyKyo1SzEvJ19fYVUxNTA9YFZeOClDM1lUXGdLNox6ZkxApJqhpKy2pK2ppa+utqqvtbqnprC3xbext7/AwbW0usW+zMW5wr+6v7nDt8C4sbSrqbq2urm+tKqtsbWYmKesqqubrKuOq72eq66xo6ugsa2zrq62srm3qq2usai1r7O7vcqyqra1sbSvrqehs6CbqK2gpZWWm5qyo62gpq+XoaSampKNoqWnsqmip7KsqralrrG1r6SZna2nmpifmZmsuKOXk5CPmJyhmJeUq5+ck4GTmI2dnJqVj4mUk56apKGhoJiWkZOVeouPhXuMioOLkmtueG11e2BFYWpZSUhZWj17SkZENkFiVGlbTVxgSltdWlJSUmJgTEtFX2BgUUxJUFdWVU9HV1ZVTjpJVklIP0NLP0VESEhRTkE/SEhIRTw3PT46NzU2MDk/ODY2QiwtOCwvMDQsKCwvLSo3NikoOS4kOks1LiJUYFVgLzUoQ19RXC4qQi9KR1BbSDNjWVRLRJmXoLGosaqtpqSvrrWpt7S5pKu0t8m6tLq7v760tLfDwMzIu8O8tr2/v7e+u7C8rae6uLe2wrarrbG3lJemrquno7GqlK+7pKyysqeoo7KzsLGxtbG4s6muq7GnuK+1tMPFtqm1tqywramno7afoKexoKSUnJqVsZ6nnKCqjqmjnpuWmKWlpbenorK0rKeyp62wtaylmaCsqJucnZuUqriclI6Oi5mcopeQmKWhnpWDkZWQnZyYlpSHl5CXmqabo6CSlpCQlXaEkId7hYGEjYttcXd1e35cS2VsXEtOY1w+YntHSThHZ1dmW0xeYk1YWVdUWFRpXU9PSGFdX1BKSFFWVVJLSVdVVk04TVpORUBGSz9IQkNLU00/P0xPSEA7Oj47NjswNDE8PTQ1OD8pMDcpMS4yKSksLC0rLTkkMDQyJTlCNy4jQU5IZjI3J0diTFYlLUIuPUVMUTwzcmtKQ0ORmaWupa2uq6elsbKzqrext6CrtbnIuK7BvMO3s7G1wsLOxb/BvbS9v7+6vruxw6epuLC2tr+8r6uzspyfp7GtpqWwpZ6ytayrsrCsqai0uay0srWstK2qrKirqbitsbDHv7ilubCpra2lqK2wpqSkr6SpnJ6cm6+Zo6Oio5GsnqSgn6Kqpaa5pay1taWqq6isr7auo52jqaqboJqakqS0mo+JjoeRoqCVjZSdoJSShY6Skp2bmJWThpeTlZmmmp6fjJKRjpB3fo2FfHx9h4qJcXRyfn19XFNkb15OWWZcRkSWW0c7Tm1YYltNYGJOVldWV1RZZ15RUkxjWltUS0dPVFNOR0lXU1xOO1BeSUJESEpBRT8/S1NPPjpOTUM8PD45OjU9KzMyPTYyNDk6KDQ1KS8sMSgpKywtKiY1Ki8mMCkzODoxJiozQmM7NipIZUhKKzpJPzNCSVMsPo9rPEdIj5yqq6KpsaSppbO0sbS1srKhq629y7quwLvHsbSttMLC0cXFvsCyvcDCvL+3vMSnrLess7i8wLCrsa2go6etqqiksKOqsaqvrLCur66ss7untrCyqbKpq6Wlo626rKqxwrm1rLqoqaitqqixpaqko66qqKKfnKOslaWemJ6ZrJ2hp6mirKWjray4sbKgqaKgq6+wrJ6fp6ipmaSYmY+gp5iGhI+Ki56gj4uMlZuOjYWHkJWgnZaYlYaWk5OXpJucnIuSkI2Jfn6HhXx3f4eFhnRzcYh1a19ZYG5jUXNxXEs7hHxGPld0WGBaTmNbTlVWVVdQXGJeU09OaFhXV0tHTE5SSEVJVlJdYzxQXUQ8RkhIQkc/PUpQTDo+T0o9OT89Mjo3OyozNT4xMDQ4NSg1LyosLjMwOyksLCclMjM0JCwyLTg2MCkoMTxdSjAuSmdERjg8QjA1RUtYMUCUWj5MRZWYraihqrOcqqqwtq24ta6rpaqqvci7sb23wq+wrLPEw87Ow76/tMDCw7rAs8jErK63rbK4wL6zra6rpKeqsKmnqLGltK6rsK6tsbCzrbO7pLizrKyup6ugop6wt6qqrbq2pba1o6qnrKyqraGpp6aysqSmpqGhrJaqoZWaoKaepKKrpKyin6ext62to6Wim6qrrqmdoqWkpJigmZaPmJ2TgoOQiYWdoIyKjouYjY+Kg4yXo5uSkJuMk5KRlKKZm5mKjouKfIaAgYN6dICEgn50d4ykiHhqXmBuZ1dlh2NOP2eTTEVieVdiWFJlVE1WVVVUT1xdYVVLTWlXVVdJSkhJT0JHSVNRWW9BTVhAOkpHRkVHPj5FUUg4Q0tFODdDNzI6OjoqNDk/Li80NjMpNCsqLCsuIzQuLSsmKCs3OSomNis8LTIsJjA2V1ouMEpnQUE8PEMrOkpPXjREhj5IRkSXkrClo6qxmKuqrbWrtrGrpayqqbzAwLi4s7u1pbKvxMnL0b/Bu7m/v8G5wbrBxK6xtbGzusC+s7GuraurqLaqpq6vq7mwqLGxr7Kstqq2tae0tqyspKmrnKOetLKoqKS0tKC2raCpqKupq6egq6ypubapqqqqoqmgrJySqaGdoKSipqOpnZymta6opqmio5ilpqeqnKKko5+ZmJ+Rjo+Zjn+HjYeFnp6HhIqKjYyPjISGlKKajoyakZKRj5KflpiWi4qDf3SGgX9/eHWDf3t4f4GInY9vcWdncXhcYHOIak9emVZIbXhVZFZRYlBNVVRVUU9YW2JVSFBpVFZTR1BZVUk+SUhPUVB4TE1WPTxLRD9AQTxAQ1VDOUFLPTU7RTEzOzk3KjQ6PSstMzQxKjgqKisqLCkpKC8qJiklMzssJDIpMjAyMSUvMlFiMDI/Zj1OWD5DLD5MVF8vSmo2T0Q7lY6woKWrrpqspa2us7Svq6Wvqai6vrzAsK64raG2r8nHyNHAvr26vMK9usPBv7+usrKxtby8wrGxs6uzqKS1qaWts7O5sKOutrGvsrqrua6qrrasqp6prJ+ioLatqKGfr7OhtKqeqKeqo6uhoqytqL2vrK6toaeon6uZkK+hmKKhqKefqJqZqrGpo5+toqGToqOjp5iaqaWYl5mdj4qHlYh9jYaFhKSXhYKCi4aOjZCEhJOgloiRnZCTkI2RnJSXj4mFhXh0gX99dXh5gHt0c3ppgYajdWleZWuBdWeIjH1TWHBeSnhzU2RTUV5NTVJZZk5MVlllWUZTaVJRP0JOUWFROklITFNJcVFMUzs8ST87PD07QEBXPDw/SDczQ0IxNTo5My01OjopLTMxLS02KSgrLSw0MiMyKScsJS47LiYxLjAtMTQlLDBMaDo0OF89YWQ/RjFDUFtbK0hOOVVBNJCPsZ+kpqykp6SsprSysaqksKequL7Bu6+nuaqmrrDJx8jRw7y/vri+v7zJvMG4sLC1sbq7uMCys7utuK2itKanrLK2ubOnp7u1rba9sLymray1q62cqa+jn6Wsq6ecnqqzpLOomqqnqaSpnqOpp6m+q7Svrp2ppKCunJuyo5WknKSln6SamqirpZ6bqqGbkpuhpZ2Yl6mokpiak5CKgo+Ffo+CgIiej4Z/fYuHkI6QhH+Tm5OFk6KMlJKLkZqRlYeIfn9xenl+fGl4fHp1cHB9aIV4hIhkYWhjcoV6bWd5XV5WQld6bVRhUFJYS0tOcXVdSFpbZ1lFVWZQRD5KTkRDQTlIR0tTP2phSlE4PUg8PDw+Ojw/VDY6P0M0NUg+Mjs1OTAyNzw1KC41Ly0xMSYvPktIMCUaOTAlLCwwOS8sLCs2JzE3Iy0vR2pJMTRYPWZjQko3R1NgVSo9O0RYPyqPlLGZn6CppaShq6S3srKmqbGnrLjBvbWwo7msqKixw8nJzcG2vb+1t7+5yLbDtbSztbG9uLq+tq25tr+tobOmqquwtbi1q568vKiywLO6oK+ztaqsn66wo5ylqKmjnpylsaavoJ+qqaiiqpykqKCtvKiusK6hq6Okrp6eraaXn5uho5yfm5qiqqOamqSklZeUn6KWm5emq4uekZCRjIKKgYCPgHualY2JfH6Lho+OjIqEkpiRh5SjiZKSh5CZj5OAiHx5a312eXhje3pxcHFyeGiAdGqDZ2RoYW5zjm1iaXBgcEFceGxVXk9RUUpKTVRZV01dXm1XRFhgT15QSE1ERjs3SEVLTzxyaEtLOUFFOzs9PTs7PUo0OUI8MztHPDQ/MTgtNzg7MigwOS8sNS4uPS0qSz4qHTQ5JicuMzQuMCsvNCYsOiQ0MEJoWTEzUz1lX0RMNktXZU8qPDNPWT0jkpmsmZ+Yp6Sin6ejuK+uo6+wqau4wrqzrZ+4r6uotLvIy8i/t8K+r7S9t8S3w7GvurKzwLW7vrepubi9q6S0p6iqsK65saqbu72ksMC1tKGut7Wmp6exs6CepKanoaWZnq2nqJ6gqa6noKeYpKigsLifo7GvoayhrKScpqepmpqbn6OVnZyanamml5ufqJKYk5iek5mWoamQmomOkId9h3+Cjnx8oY2NiHmDjISJjIyFiJKajomVn4mRlYKLloyRfIR7c299cXN0YHl4aW9xcG9pfnFjemxpZWNgZoZ/YFtyanJNTX5oWFpNUExKSFBSUElOXF9uVERYW1JnT0hLRUY1NkhCTEk1WmVKQDZFQjk6Pj0+OjpDNTk+OjNARjwyQDIzLzo7ODMmMjwwLDg1QiopLUMqLDQ7Tk5AOzczLS4rLTcqKjwlNTM9ZmQyNE0/ZV1GTz1SWmhIKj4vWVg1KJedpZidlq2goKGkobersaSztKqoucS1sq6gt6yurbC1xsjBt7/BubC0vLe/u7+vq72wtL+xvcO5qbu6t6eotainq7Cts7Gnmr23pK28tq+fsbewqKWnsLKboKSgpKShl5yvpqGfoqevoqCik6Sko7ewoaaxq5+so6+YnKqlqZ6Xmp2lk5ucmp2mq5qcnKWWlZeVnY6Ul6OooZCJipCGeoV+hIt6j5eKjYZ5goeEiIuOhY2TmIyOlpmKj5Z+hpeLj3mAenByd29vdF95d2RsbGtpaINtZXJqa2VoXGNzgF9aa3VpWkl9XVtYT09KSEhSVUYyOV9ebFBEWFZZZU1JSUVFMDdGP0tCNklKSDs2Rjk0OT49PDk4QDg7ODo3QEk+ODw0LTM8PDc1KDU+MSw7QTEoKzY8IzhSPSoxMTM+RDUsLSc0Mis7KzEzOWNsODRHQWZbSFREVV1oRS47MmBULDKWo6GXlZypnaWhoqC3qq+gurmmrL3Es7CuorWvrK6vtMTEvbO/urews7m4uri7rq7As7S4r7/BuKy9urWmorOqp6mzq66yopvBtqWotbWpnrK7qqemqbCsmaKnnKSmlJiisqSZn6SoqZyioJOloKS5qKSnrqeepaGokp+poqGgmZudoJKanJagoqubm5mhlZKVlpqNlJOjp6SPiIqPhnmEfIWFfZ2NiouGeYCEh4iIkYWVk5KMkJWUjY6Ue4OXjop3fntsdHJsbHRieHVoaGpnZW+EZ2hoZGZpamBoYmlmWmV7Y2BTc1RbW1NMSUdJT1NAISppXmpMQ1ZVXmBLSUhFQy46QjxGPDZLUEQ4OkQzNTc9PTg5NT86OzQ+OEBMPT45Myk4Pjw6OSo2QDMuRTQoKyw+MC1OPy4rLTcsMTE5NSwmLjUtODA1NzZgdEIzQ0RnW0tXR1VgaEIzNzhjTicynqSjko6kppyenp2jta2nqrq3qKzDwLawrKK1raevr7jAwL2xwbexrrK3tri3tqyqvbOvsrG9v7euu7uxpZ+2q6WltKmrrqCfwquopbCzqqy0up2oqquxpZidqp6mpJGZpq2imJ6kqaGcop2XoJ2ntqavqq6hoZ6doZWgpp+ioJmbmZySmZ2UpZ6to5iXnpWUjpWYjI+YmqigkYiJioh5hXeCgoKdh4uCiXx/hIiGhZCElpWPjpCRkZGNknuDlY2Gc359Znhva2tsaHVza2NnZGN0f2JkZWZlaWpjaXFZXlhdbWRhTmhXWmBWSUdIS01SWD85YGxpR0JVU1xbSUlHRUEuPD85QTg5UkZANzpCMDM3PTc2OTI6PDk3OjlETT1CPDAqPEA7QT0tNUIzNz0rKiwwQSpKSy4vKiszNzIyKDU3JCs3LjcyNjg1XHlOMj5IaVpMWUpWYmZBOzNBZkglNZukoJGMraGZmKCWpbSxorG+t6Gxxru5sLGjtqurrqm5vby7rcCyr66ttq+zuLOoq7ixrq60tru2r7i9raadtaugobGlq6+fpMOgsqSusa+3rbWdra+trqOZnKeqpZ6Vm6iln5mloqecmqCclJydrbCmuaiuo6Kamp6ZnqOapJ2XnpiblJqhkqiVrKmblJuckoyVmY6UlJmpp42NiomPe4J0goGKmIWHfImJhISKjIiShZOckpKPkJGWjpB/gI2Ngm+Bf2Z5bmhramdxcmtcaGRicoBgZGdqbWxnamlmbFxsbXVxYVRiaGNlWUlGTE1PWFFQVWFlgVRAVlNZVUZIRkVALzw9Nz82PEZOYTg6PzI0OUAzNzgyOD83PTg+RkpARDkyLT1BPUE9MDVAOUAxLSsuMzw7SzYvLissLTI0OjYjMyopNi41NTQ2NVp8XTE5S2pbTVtLWGRkQEExSWVDJzSTopuPjrCdmpOhmqmysJ+4wLagtMK7vbmxpbavqa6lt7m3uKy7r62qq7eqtLmupbK1sa6psba2sLK1uqeon7apnp6qoqqtnKnAmK2krrC2taysnrGtsKqim5yjrKiblZyno52aqaKjlZqgnZGbo6uqqbufp6SgmJqanqGPa6KWmJxxgpacpIB2kauonpWVn5GJl5mAl4ugj3mGk4yDbWl+d4NxbIaLhn2Ei4ZvXmNgZ4SXhmuLkJSSdXeLhH6Dj39mh4BodWlmV1xpc25OUGpkZnGEZl5kZm5saV5fX4mQhIZoT0tEOEVUZ15KR1BQVVVLR1Ngb3RlRVtRVVBGSEZDPjE7PTY9NjwzZlw1Ojw3NTtENDg2MDpCNz86PkZMQ0IzNDM9QEBAPTI4QEU9MSwrMDg+RzYwMS4qLiovNjY4LCMxJzIxNDoxNzZYgWwxNk9rW05cS1tmYj5HMVBkPSsvjaSZh5Wwm5yToJuqraujvcWvqbfCuL28rae2sKarpLi0srOwua2qp6y0prC1o6i4trWop6y2sq60rbOiqZ+0q56ipJynqJqsvJWmpa+zuK2tpKiuq6yloZ6coKinm5ihpqWbm6ennZKfoJmRnqiqo7Wwo6OjnZaYmJejiKGPkpqHoYeUnqF/pX+nq56TkpuSiIRyeIyOhIihdoiMaZeIZn1zeKFviIeEfo17f6Ggn5l/e4iedIiOdpuKbIeBg21oZWN6bHFiVIZtY21pmHFYanBuhldeaVtraluIcG15coZoh4RaXkZOPkZeTUVSVldRUVJXVGdeTFlLUlJPRUdHPjw0OT05PDc7MDw8Nzk5OjY9RjU4NjA8Qjs8OT1GUUc9LjU8O0A9QD41OUdBODIpLjE8STkvMDEuKi8oLTQ1ODMlJjIxMTU+MTw4WIN1MjVSa1tOXExcZ189SzFWYTcvKIyml4ScrJ2ZmZ2fq6qoqr/DrrG6vLfAvqqkt7GqrKazta6vs7arqaWxraW1s5yttba0paeos7Gtsqevn6qgsqifpKOaoqScrrWVpKWmtr2mrKepqqyopqKgmZ+mo5mZpqOkmJykqZaTopyVk6OlpqG3pKSgpJiVk5iUnIiukJiUiamLl6OchbGApK2elJqelXmC1Kh/h5TBm8d5eLGlt5dkgMCcv3mEhHmPg3yQkJHKcZa8nMV7cranupB7gWyWsauweWhrWLGub2VpvJK8bmh6bXKP2H5TamO2sn+BcZR1mqGqkFdPV2FPVk5GVFtYUVBTi1xXW1BAXEVRTkRHSTw8NTc9Ozo5Oi49Ozg3ODs5PkY2Ojc0PkA+Njk/RVJJOi41PjtCPD9BODpKPjUyKjIyQkUvLjMyLisvKS0vMTg2LSAvNDE2QTE9OleDdzIxVGtcT1tNXmdcPkwxW100MSGOppOBpqmfl5ydpa2yqbHCvbK1wLW3vsKrprStramor7Sqr7a0qKemtaanuK+ds7G1qqWkp7GurbGmqp6npLGkoqGfl5ygn6+tlZ6in7S6oqmooK2upaKdm5qhqJ+Ym6ign5iep6eRnKeblJ2hp6OgsKOfoKOWlpKYkpmFsGtqio2qfmeEloetZXGenZWappVxrqGkfne7fGuhj3axX2q0W6WAZpyRYGaBemZ/anhqqWW+cmemjHaxanyxeHSSk2NtbaduW4SgRWlnh5ZFdZxgfmd7o6eCWV+Lq2mBlXh6aqc3Sq9bV1RsY1tLTldfXFdWO06IT1dWL0lUU0lDRUY9PzQ2Pzs4OjkwPTg5OTk6PTxEODs6Nj1BQDY8QEhRRzkwNzxBQz5ARDhARz0xMy0zM0UzLi41My8rLyguMC46Ni8nJDIwM0IvPTtVgnYyLVZqXE9ZTF9nWTpNNV9ZMzEbkqKVgqynpZ6jpKqxt620vb6wt8SyuLrCp6mwrK+pqbGvpLC6sKSlrrOjqbipnrOysKOloKqtr6uvpqefo6KwnKOcmJWYm52tppebop60s6Gqm6GtraCempegoqmcmZ6koJyZoaekkJ2jm5ihn6yfpqagm6ChlpWRlpGahrWbtXiFqZm1mXeHs5u3f5OWl6mUfmuBpnqBhYiSlJJ3q2dqsVuse4+HlHSIcI+GgH+IkJd4g4KLl4yDoI+FsHZ3n3Framx8i06kWEhjY5l+Y2imYHlydVOShl5QqW1jcX6HgGKdLlGibltUa2dgTEtcZFhcWkI+sHhXWEEjTWhFQkRBQEExOT44ODo4NDs6OTw5OkE6RTo6OzY6Q0I4PT9LTkg6NTpBRkJAQUQ8RkQ7MDIwMTtGLDAuOTQwLC4oLzMsPjgzMR8vMi1EMTw8U31uMytYalxPWE1fZ1g3SjlhVTUwHJaflIizpqahrqmns6yqu7bCsLzCrbi3waqsra6vpq6yqaGvvKqhp7Wto6u1paays6ejop2nqrKosKelnqCfr5afmZWWl5ifraKamqSota+hqY+pqKmbnpWYoKWomp+do5+coKKlo5WbnpianaOrm6aZm5uioJeTkZOTnYPVk5m5cLDCfsaGfNaUm7t8mpalkI2bjKR6jYejgqWCeqx5j51Vr3uJfp9quVq5d4aDfaaCk3yYeqp5jZ2Pe7FujoR0kLuFb5RPr6fFilGgemNgqmJzcodsl4dfU7W0yIaAiXxjpDNCnXZdUWpoZFBAWGZaZGFKSE1sS1pTT1lmWkNDP0U/MDw8NTk7NzQ8Ozg9OjxDOkY6Oz42OkBDOzZAT0xIPDk7REhDQkNEPEVGODEyMTFEQi4vMDQ4MystKS4zMjM5NzEjJTUqPjM9PVF3ajYqWWlbS1xQX2ZUN0c6YVE4MiWcoZOYsaiopbOqpbSopby3wbC6wLG1tbyztqexsaOxs6afrraom6i6rqKvsaCztLCgpJ6ep6mwqLSppZydnquXmZeXl5aXoaqdmpeorbCpo5+OrKKnlp6XnKGloZiioaKhmqKip5ueoJ6VmZumoJynlJuan6GZkJKVkZ2Ism5otXGriHCOpnK0c3K2e5qYpI2Pm42ifpCgpX6wdoOR0tF1W658hn+kb5uqpmuGhX2tfZeZj3uxc5OdjnizZZZ0hZ5unmaUUsiLWsJcn3liX61gd3OHYpeIXlnKnW+/gXVNS7VTVcZkVFFqY2ZYQU9qX2xpUFVGSTk9V1JbV1hIQz9KPDI/OzU9PDQ2Pjs3Pjw9QztHOTtANzs+RDsuQ1JKRz4/PElKRkNFRD5JSToxNzQ2QD4vLjI0MjUyLSkuMjYsNzQyJh82MDs1Oj1QcWg5J1dpXEJOVF9lUDVHPWFNNjIvop2RpK+spKq7raa0pai2u7yyu7+3trS7u7OltbSisrKjn6ywpJimuq6ksbCctLiqoKadoaqksaesqqWanZqpnpaVmJmTk6KnoJeTpqqxpqGWkqyfpZKUoZukpp+Vm6anoZqjn62aoJ6ekJacop6cpZSclZqin5WYlpKbhax7d6h2o4+Kh6lvrYqDqIOZmaKKkpmLon6SmImuhX+Cs1xys1KufoOCpH9x1313hH6PnYaZmnevhoqRnId3tGGaZZqCgZVsklqwWEuadZh5ZmCtXnd3h2eYiGpdr3eVno94bDV5yK6yX0FUb15oYEVQbF9wbVZVTS9lY2lTWVE7QURATDo1PzkxPTwxNj85OEA9OkM6Rzs8Pzo+PkU5LUVVSkVAQzpNS0pCSEc+R0s5Nzw0Njo+LzA0MzMzLjIuLjE4Ki4zMiUhMDM3Njc9UGtlPiZWZ1xAPVZfY042R0NgSTo4OJ+dlKC4sJi0wa2osqeqsrq4tLi/uriztr21pbi0oLSsn6Coq5+Vp7asqLCxq620pJupoKCoobWmpqqjmZ6VpaGUlJyZk5ajpZuTkKesr6aglZipn6KPkaKZqKaglZqmqZ6dpJ6snaCdoI2Un5ueoJiZnJaXoqCUmJGnnYapfX2leaGPj4OqcK2MgqeGlqChipeXiKOBkIiUqnyAi515b7FaqIOCiKB5dNh/dod0p4GOm42SpHyWkJ+Ee7JenGSgfYKUbJJcq1tak3+Rf2hnqmRze4FrmIdxXaxaiaCOa25lT0pDoVxaTHReY2ZNWmFfc3RfSlU1SpqSWUhFPUhGQUwzNUE4Ljs+MDVBNzhAPDY9PEY/Ojw2Pz1CNy5IVkpFQEg2S0lOQElLQEVOOjpANC46PjEwMjE1NCsqMDUvNywmMjEoJCQ2NjcxPFBlZUEmVWZbPzFVX2JMN0ZJX0MxPjihnJmZvqyYtMKuq62pprSwuLG1v7q6s7G3vKq7taCxpJ6lp6eek6qxqa+qtayrr6GYoaCmpKO5oqOroZeckaKglZSfmpSZoKCQjYypsK+mnZeap6afjZKkl6irp5SXqqifn6CjraOgnaGNlaGYn6CSnZeclZ6hlZePq5uPrm1ytHSpjHeKpnO0eXSzgJKko5KcjImkh452uG+Me4uia2u2WqGGZZeXaaCip22UcrR0k5h/smqGkoita3WzYZ1mom6GkmqXXK1gTaF8h5FSc6NseX9+bpiGb1yvVjycd2ZUb24uXKdPYlJrZWJtWWJcYHF8Y1NZUD4+bW8zQkJAP0w5ITdANi47QDM3QzU4Pz8zOzxDREJKRk1JRjYySlRLRUJKNklKUD9IT0NGUD08RTUwOzswMTAvNzUsKyw0MjYvIzAwLCwdMjg5LzlOYGVEJ1VkWT4vVV9hTDVGTV44MUI4pZqbnbuinLLArq2rq6e3qbivtcC1vLGvubirwbeqqqCbpqShnZKrqqe1o7Korqqgl5yooKSruZ2jrZyWmY+lo5aNnaGcmZ2fkZOVq7avp5mUm6ypl4yTpZmlrKORl6uypKCeqKuwmaGij5mil6CblpuXoZOdqZyUkauZh9SSmrt0scSAw4Z91ZacuHiIkZeMl4mMp4d5o7Z1fXd2woKasmCDunnAfHW4YrWBjIepfZaBrKlxe391vIinoGmdYaaOr6F+jHSHq32+bnO8dLKDdXiAim6aiHBtjaR0vV13fVthebxrWlZbanpeaWBkZmJteG9ZW1lDQUByP0NGKzVIIic7PzEwPD83OkI5OT1DNDxATlpeYGBfX19aUFBSS0VGSjRITFJASk5FRk9CPEU4ND05MDIwLjk3LSouLzE4MCItMSwzHiw8OjA4TFhhRidUY1g8L1ReYEs1O0xbLTdBOaaZnqK8opexw7Ctqaqssae4r7bEsbuyrruwrsGyrKWinqOhnJuRqqSqsqS1p62kn5aaqpmmrLicoq6ZlaGQpaCTjZyjnpiempCWkq+5sKuVl6Oop5SRlqWcpK2ekaCoq5+coKmks56ipI6nopShmpyXlaSYj7CgkpWqnoWQmbWAkZGNuJV4gpObtXdubG5zbnmPhI6Jc57Bu7yae4GyqHCAdJG5g3yGhouHjXuKho2XfKS7ub2cdXqzo3R2l3V0sHWYnmaGaY22dHJwd7aMXn96fYlng3lteWKLrHB1hX9ZW6dqRWRaVGZgY11iUWdncW11Qk1QTEQ7Wkw/SjM8MCA4PjsuMz1BOTk/PTs8QzZCVFlaWltbWlteYGJgXVNHR0g0RElUQUtOR0VPRj9HPDc+NzA3MC85Oi4sLy0qOC8lJjIoNCQoPjcvN0tUX0cnU2JWOCpPXV09KztWVic9OzymnaChv6WWtMO0rKqnrKupu66wxq+1tK+4p7W4ramjoqaeoJ2ZlKykraqmtaion5uWoKOerKS+pqGqmJWckaKbko+hqKKTnZeSmJSytbatmJ2kpKKLkpKmm6Wrm5aopKWcm6KppqajqKCRrZ6Wop6Xl5edno+wqZScp6KOan5pnKd4iXN+mo51emWHe72+wLpukoNxlIZfcmpaXpqJYWSHjpVrYICVY22cdmKUa3+alZRlXmBjcZuKaHKMfYaVZ2p+cXR5fXxiW3d0gWhQXG6DfHuLalhseYJySUpvhXBNdE1FV11mYUxbWGdjXk9bbXVpcVJPREVOO0hJPE0/MiwyQT84LzU/Qzw5O0A7PUM+UlZWV1laW1tcXWBhYWFgXFVHNURGVUVLT0hGUElJSDs4PTUxOi4wOzouMC03Nj01JiIvKjIsJTs4LTdJUl9JJ1NgVjQpUF5MKDM+W08nPzI+qJ+oocGjmrS6tqOspa6nqLWyrMissLOstaO+sbKmoKOpnaObmpmsp66kpLWqpZuYlaKbpq2ovqepppaUm5WgmpOYpamnkZ6Qj5icsLK/rJumnqeiiZORqpqopJqbq5+jmZujp62in6qhmbCblKagl5Sdn52XsKWZoqiZnJGenKOkmaejmpyam5qQloJobnxxdpGXlJGEibSpjYaYlY6KjJeXh5SVioOSk5GJjZGUmZOYl5qgopublKCdjoJ6pIVranyQfIB0iYqBcYJ4eXZ2ioB7impzgXSDdWR3fXZrcHttYGNccGhNWVllal9XWW96bW1mU09GUzlPWk5STygrO0pCNjM1PUBBOTpDPjxFTlNTVFZXWFpaXF1gYmJhX15eW1RLQ1NHS05ER1BMT0k8OjszODksMjs4MjApNklSTzgiKSsvMiM0Oyo3Rk9bSidSXlMxMFReOis9OF1LLDwtQLKgs6G/oqSxsregqaWyp6WwtarJq62xprWmwKi0oJ6kpZyklZagq6aso6O3rKCZlpagl62qpcCeq6SWkpyXnpiTlKKfnqKnkpGZqKeyw6+aq52rno+WlqmeqpycoKyYoZudoqWvpqKkp56tmJamnZmaoZ6enLCgnaKnlpiTmZSgopajn5egjpaUi4qNjpetj3uVm4KSgYmpqIWBmJaKhI6fiHuEkIaFmZCHhomVjpuXjZCYnqOWmpORnY1+jWais66FiYR2eo+KfXZ5em9neZCBgIlrdYF5iHJodH96doOIgmt0Y3lmYGlkY2Rmalhre3BpalxSTFBEX1VGQD8+LDRARjs0NTs+QTs8Pz4+SE5OT1BTVVZWWFpcX2FjYV9eXV1eXVhWSktMQklPTVJKOzw6Nzg2LzI5NjQuKCYkLTEuLykrKjclKzwoNkNNTEQvVF1RMDVNWzE3RTRcRzU8LEC0oLmvvq2rrrKyoKqmsq2irLOwxbCqrKOzr72ktJygpqKhnZmXqKWopqSms7WelZSemZmvpq6+oKujkZGempmUkZWhnJepnYWeqayis8i0oKqkq5aWmJqnnaibn6SrlJ6fnqCqrqmloqqhrZuen6GYpZ6cn52vpJmfqJOYl52SpZqYqZ6al2aDknxlfo6aj2N4jWxoa3qQo6trZZqYfmeFimVlaWh6jaGOa2iMl5Gid2tqi5ijn5hzbG56hI2GeVhlXYWBXmuKioF2W2hzd3eRgIeCbniCeIBzbXmEdHeIiI+De2qFWF5rdGRdc4hpanxxbGNdUU5XSWRYQEozPUY3P0ZENzE8PT9BQzs7REdISElMTlBSUlRXW15gYWFgXV1dXV5fXVpVT0RIT0tTTj0+PT02NTM1NTU0KiYmJSwqJS8qKyc2KiQ7Jy9BSVtJLzdaTzYpRVkvRE8xWUM7Py49pZ+6vLmvq7Owq6Wora6wpq6usL2xqaikrbCxn62Xn6OeoZqZpqqbrKOmqKmzrp6Vo5Cir6a2uaWuo4+OmqGZk5KaoJmZpZZ7payiqLPDuKSip6+enpWeo56jnKOpqJGeoZ6gqq+qq6Kpn6ibpZ6noKyWoZulsKSYnKuWoZ6bk6WYnquZnn6+g4hytHKFnoataHi5xLhxkqGje6aYmXOqgnzLwMC7cYuih4OffJWYiJ7AvYKWnZ6NncHBe4F6kYyawr99a6Wxb4yBb8p6f5t3kYOOgHZ5gX95cXp/h3F4hYyTeW12kmJmX3hjX2WBYl50aG1kYlhMVklRWkhPRDJJRT9EQj4vPD8+QEE6OERDQkNFSElLTU5QU1ZZXl9fYF9eXl5eX19fXVxTTVBHVU5BPz89NjQ2ODI3NiomJSMpKiYuKyopMTAfOSojPkhbTCojQ1AvI0ZbM1BZL1VBQjsvOJajuMO1sK/AqamUo6+psK+tprK1r6umpqaxq5+rmJqioJybqqeinKuipaikpLSknaOTpq6st7Onr6KSkZqdpZKRoKGXnJ+dh6arpKutv8CwoamvqZeSn52imaKjqqOSoKGena2uqaylo6KmoKSlna2pkaSbqa2qnJ2qnKyilpellqGjmJx/zpR5eqWCeZWWm1+uj16Op4ChoX2nlpt0q4OAr15kjal6p4eFoHSXkoizY4KrhqGOjbNphK50fJaHuGGCrVmjzW6PdXvbe3+ZcH6IknV/ZXuHdnZrfYhufoWRkn5tgY5gcWtwZmBfeGRbcGhqY2ZgUlRSV11KT0M1QUhFRDg+NjtAP0E7PThAPj4/QkRERklKTE5QUk9TXF5fX15dXV9gYF9fXVpXT1VKPT8+PDU1NzgxNjQoJyQhJywmJi8oJiszHTYwJDc7U0wrLS1KMCc7XDpMLSFQQEY0LjGtwsDAtbSwt5iekaSqqK20q6ayrKyspKymsKqgp5uappicorCfoZ+op6OmoZ6wrJuelqaurbGrqKyglJKbn6WTj5+ll56oo56upKuwqL/Gs6ipsa6Wkp2copegqaqflKCenJ2tr6eqqZunpqOhq5KttJamoquqnqOnpqGwoZKap5qhm5SUkZegcIWMl3WFqIdxsXydcax+oZ+CpY+ed6uCfa1/nHKtfquHhp92mJJ6fJd+qoiijJGLnX6re4iTj6CAeq1WnMR6j2+SwX2BlW11cIxtZnZlhm9hd25yb4mKkZCDbZCPZW90dm9gZm1kX29paW5mY1dTXGFaUlJDOElJQEM8PjxARkRDRUE9PDw8PkBAQUJFRkdFQENJU1dZWlxdXl1cXl9hX15eXVtaUkM+OzkxNDc4NDUyJiMfHCAxJyAxJyAnNB41LSY3PldKLT0nPjEpM1ZARiEcRzpDMS4rr9TGx7K0n52jjqOjoayutq+psKepqqiuq6unoqOdmaKVn6arn6Kln6ioop+dsKyXm5aop6+tqKepnpeUmqOikpShrZudpqOurKOstam5zbKtpq6slpScnaKYn66snZafmZ2fqbGpqambq6mjoqubr7GiqKyuppmmq6qqsaOTl6Olm5SShaRqpHWJeql0erJwgqWJmYxwiKCah6RfYFKrhH+ugpt2roGnhoafepiWhXtmgKOJpJmGgaN9qX6AlIeuXnyoVZ2ikoF6op+Ae8OvxYxzr7OzuXFiqa/CdGiNjJiPgW2akm9ueXh3bmxmZWRxcGZ7aGNdV19pWFhUTExRTENDQUI7Q0FAQkk8PTo5Ojw9Pj4/QT04NjtETFBSVFZYW15eXVxeYGFgX15dXF1bU0lCNjc5OTY3NCwmJCIgKCciKy0iJC4hMy0mQERXSCxHKzY2KjFQS0wjIEE5RDQsJ8LJ1dbAoZmrqKGvop6wtbCvqayjqKaqq6uppKagm6WfnaWnpqOcrJqiq6Gkn6+inZuTqqS2sK6gqZudlpSno5CaoqifoKacsKajqLGstsiytaqsqpWRnJ2imZ+ls52aoJOcn6erq6OumqyooqGqorOtoqqzsaGbqqivr7ajk5ekp5ibkXyqbJ6Eh3WreXywb4Kki4mflpWflYHSuLS4yYCBsl5flKmDpIeHoHqYlZl4qsl0maOVp6mQkpuMfpuJmsbGd2WhgqVzgZ+Ogn2vXm+1Y7F1S6OGbadHgpNkj5Cek3xwl5J+cHt1fXptXGZqcnFmgWpeYlhjbVxeWUlNTUtFREFCPkE8Qj9KOzc5Nzk5Ojs7OzMuNjxBRklMTU9RU1daW1tbXV5fXl9fXlxcXFxcWE1CNzU3ODUvKSglJiUkJiksNUZOT1BNRkxKVkYqTDAvPi00T1RRHRw7PEYyLCSopMHGua2osq6spaKcsrmsqqGmm6imqqypp6CmpZiqo5+uq52moKyan6mlnaa1nqKXk6eqtbKsm6acoJWQpa2RmZyno6Cqp66ho6epsLTCsrOqraiTiZidpJqho66klqGVmJylpquar52tqKaerKO3rKGyua+dm6+ns7SzpZWYqKSan46CnU54moF/n3qEo3yCpISHp5+cnpOEuHx8ebmCfszFwrZ4m6GQi59+mpaXinaemIqkmKOofrCFnISehKx9mZRhpWyjcI+FkIF9l4NyrGCkc3GAmmC8fVJVdY6Ro5d8fpKRiXV6c4R+cFxtbndyaoFvWmRfaG5iZF1LTFFUQUhHRkk6OUs+QjEwODg1Njg3Ny0qNT09P0JER0lMTlBUVlhZWltcX19eXV9fXFpaWllVU09IQDc3Mi4sKi4rKicmP1FUVldXV1lYWFdVT1VGPEUyOlBbVBwbNj9ILC0gjIeZqaykq7mrr6CcoayztKafoJWlrq6uqaadpqaao6ehsq6hqaayoJmopJSitaKjlZehqbS5pJujnqOTkKGymZ6cp6ahoq+tnaSoorWxw7Gtqq2pkYeRnKaco6ScpJaemJmZpaSomq6hraWmmK+lvK2it7etnp61srmys6eZnrCipJ6Gj9G1w7d5h46FkZOPgKZ4lKJ3jKCShKWCi3GrhoS0bnJqmaOclYmffJiZhoePc6+CpZuijaaLk52JlJCbbXCyXKVzk3qcbJl/e5l9bqlhonFxf59ic7K4aHiPk6aYfoyMkot4fXmNgW1pd2l4c25/dF1kZG5tZWhgSlpXWDxHR0BVM0BGPjwqKDYzLjAxMykmNDo7PD0+QENFSUtOUFJUVldXWV1fX15eYGBdWltaWFVSUlFGOjIyMzAvKysoQFFSVFVUU1RWV1dYWFdVVlZUUU9RW1UlITJBSCQpJZJzjIquv7+7u7Wel6ikrbahopmVo6mnrqmrmaWhn6WgoLWnoqmnsKOUq6OOpK2jnZCamqmztKSdpp2pkpSXrqCgnqeknKectZqgqqO2q8KwqauqoYyEjpuhoKailZiZnJiamKakppirp62ipZutp76slb6wrZ+jsLO6rLSnm6mypaiYeqiQfXywd4qBpKWInG2yb6GHrXyhj4OolpmArImEroWflKmgopaFn4CZlYB7kn6rgJ2aloqqeJ2gj4mTkoB5r12jgXymp2SdgHyXdGuuXaVrcYWZXWBbjKBulZGmmYOUjZaLenqCln5rbX5ifXRuf3pgZ2Vxb2dnaENZYFs9SlMyVThCQkM3JCQzKycnMywgLzY2NzQzNjpAQ0ZJS01OUVNTU1ZaXV9hYGFhYV1dW1pYU1BPTkk3MDUyLiosQVRWVlZVVFVVVVVUVFVUU1RXV1dYVlVVUUhGSUojKCi8kpqEqcbDtsG0n5utoK64paSOm6SjoK+vqp+jnp2tmJ65oKKroK+qma2hkKqppJaJmpCusKymn6ebrJiYj6yioZ2mopqlnK2Yn6imtqi/r6WppJ6MgI6bmqCmnpKUmZqTmpqlpKOZqKuro6Sfqai+pJfDrKqjoqyzuqyvp6G0sKmqmXavfpCLnIWHfbquiphlsIxlla19oY+Dp5WagayKhLCFpZmkoaKQhKBbbGqBs2B/rXt7goCxbGdumZeMiLFbfbRbpINryKJln4B7vFl2tVqyfVKvgHqsWIChbZiPqJqKl5CVlnt4jZx9ZHN9YoN3dIB8YWpmcG1mZWVPVWNbQVRePkkoPjk9NCEiLSUfMi4gKjEvMDQ1Nzk6PEFDRkhKTE5QUFJUV1peYF9gYWJeX1xbWFVQTUpHQzU1My4vQFVZWFdYV1hYV1dYV1ZXV1dXWFdXWFlaWltcWFdXR0I70p+zsre9u7TBs6Ocraaltqihi5mgn52zs6meop+dtJigs6iqq56wrp2rm5WuqaKOiJuOr6yopqKnma6TmY+omqGepZ+ao6OlmZ6iqbKovK+kqJ6dj3yLm5WhoJmPkpqbkZmXqJ6hmKitp6Wlo6Wpu5+gxqelqaKrtLatrqegva6trZaBqZKjr46bgIakl5iQgYC4w7qDjpyThaeXnIKsioKviKabmqWqkX7VvcKqYqO/vXx+o4KD17q4tYWUk4Oevb6EaqOBb6uEbp1/erKwx4Nqq7C9rXh3or67dICWjqacj5qQlZx5gZCaeWJ8emSMZnmCe2BrZWtqYlBiW1NqXEBUYUJOKT06NC8eHyQeJTIgHSQoMDQ5NjY3ODs+QUNGR0pLTU5OUVRXXWFcX19hXmBbXFlUUU1JQz88QT81PVNZWVhZWVpZWlpZWFdXWFlaWllZWFlbW11dXFpWWFRXWryVtLSxv7myvbOina6mpbOmnYyYpb+qt7Goob+mprGbnrGcuaiera6lppWUr6yXjIOaka+mo6yhpJyqoZiLo5KmnqecmqGoopmeoKutqbmtqKObl5N7h5mRppuTj5GYmI6Yk6mZn5ipqKCqpqGjq7ueqcWjoK+jq7O1q7CqobyosLCadHWqpLeGZYmfcGetj4qPbW93pJCZn4F1rpmVcJCMcZWno5uYrqRybW1tZYp3bm2CmXGAeWlxaWeJlpWYcWhphYZncIZkXoljam9ZXWd+d6ZgYnGOkm9mZICNko6imJeYkJWefIeOlHVlhndojWp5fnlkbGNmbGJLZFhKa1k6UGVFUidLOisjHCAbIywpGBsYLTIuNTo0NTc6PD9BQkRFSEtMTU9RU1ZcV1pcYGBhXV1bVFBMSEQ9OkFCN01YWVpZWVpZWFhZWFdXVldZXV5eXVxcXF1eXV5dW1tVV16olK2zqrq5srOqqaKunqSyqZiSvbHDyL62qp7Aq6yjoKarn7qjpK2srKaOlq2qj4yFlZetn6WqoZ+jo6CRjKSSp5mpmZajqqCWnKWlp6+6q6yam5KSe4SXjaWXjZGRmJONmJWnlJ6XqKKasKaeoqy6n7DCqKSzpqyxsquurKi5pK+4loqhqKW2nYmWopiHqZqQlJ2TqrOZm6OsoLKWoqCeoKKcoKShlaumjJKTjIeSnJyUkJmTmJCOlYaBpJqXlY2Lk5KKj4aEfmeLf3SCdnSIjHGnbXyVkZSTgYGPj4+PnZSglZeWoIKHk4xwaI92cIp3dnx6amxkZG9jVWBZQGlaR2JgT1orRj0rJiE3NDAuHxwhJTIoKjc5OTQ2OTs+P0FCREZKS0tNT1BRV1RWWV5fYWNdXlVRSkVEPjk9QEFTWFtcWVdYWFhYWFlYWFpbW1xeX19gXl5eX19gYGBfWVlgpZapqqW1uK+uorCkrZ+gtbGRjqvFvMS7uKqipZ2bpp2wqKO2p52ptKankZiso4uIiY+cp5arpKGZp56ek5Wjl6ibqZmUpqGkkJqnmaG1uqiqmJqQjXyBlIyhlIqUkZWQkJOXpY+emaifnLajnaest6euwq6jt6avr7Ctqqq0uqKvvZmSpqOmtqOSnaaejamfjZKfo6yvmqGjsaivl6SgnKSqnp2dnJernJKZoZuTkJaqmY2YmJaQlp6RiKCdlZSFkoyQjJSLgX5mjIZ1hnZ5iINznGqHkZSUkYp9jJaSkpiToZKclqCDh5eGeXGVcnmJf3F7f2puZF9waWBbYFltYlBgY1BbOkdHRD0yPT03LiomKykmHSY0MDY2NTg6PT0/QUFDSEpHSktMTVNTU1VaYGBpYGVWUEpBQ0I7OUVNVlxeXltaXFtbW1xdXV9eXV5fYGFhYmFhYWBiYmJkYlxbY5iVpKejsLOsrqOpp62gqLWqkI+cpbO7r6ysoaKZep2isKSlsamWm7imopSZqZyOhoqJm6KQrp6jlqefoZKXmJuui6uWj6iZqIyYqI+eubakpZibjYl5gZOMmpOKlJGTkI2RlqKMnZ6onp+4pH+Er7WisK90pL6jsqB4eqCrs7yVdq6kn4qAqn5kXGJ2n46knoSXfm6Ts5yjqK6romWeoJNzeZmWcICYqJdsf6KniWWcpZuQl5iWi5GbkYWdmpCVgpKHjo6SiYV4a5CHdoZxfIaBgGFpiIuVk4tbdpWRZ2iQjnJ6pJiYZHmYhoF3l2mDioJueX9rcGVfdm9ra2hbZmNiYm9TWz5OTk5SRz1AVEI5MS8eHyY0OjMxNjY3ODw7PkBBQkZIQkdGSUtMU1RVWVxfaGZnV1FKPERHOzhVUltgYWJgXmBfYGFhX1xdX19fYWFiY2RhYmFhZWRjaGReXWaclaajobCxrKuppaito6etpJKWq7Wvsaaaqqarl3OLnK+fqKqnk5a4oKCPnKSdkX6IiJqejauao5Snop6Ol5GehXWukIimmqiRlqOIm7q0p6CZmIuJdHaTjZWTipSQkJSMj5OgjpqfppmcspaAjJy1nbSMko+9p6F+p6J6o6+4gY6Op5+Ei4WPsamvjImWo5p5gYushpydoqeqqIeVhph3pZt6h5uBl6aCgXucsXqKhZ+XmZSYloGQlpaEmZpjeYeQhI6PkouDbnGQiHmBcYCBhn+GdIeFlpJ4lmiTdKCadHyZg5+chph+kYmBgphqjYyEa3h7cXBnZHduaWxrW2VqaWVyW15JVExRQEU1LVlUVDYpITA5PT42NDM1Njg7Oj0+PkBESUBJRUpLR1JYWllbYWFoZlpRSDlFTDs+YlZeYmRlZGBhYWBiYl9dYGFhYmJiY2ZnY2JhYGVkY2djYWFonZijn6aurquorKCosKenqqWZlK7GvbCglaWotZ6Pg5yrnKahn42Qvp6ZjZ+aoJB9hY6Zl4irnaKVn6CRjZOJhoCRqI6Hopyjk5adhp+5sqedmpKOhXB1j4iTkIqUj4+bi4+Rn5KWn6SWnqyIn7SJtJqui8qIq66Jt4WNsIOxr4SpjaeYjZ18qI9ye3ebjqaWaJWkebSLn56mqJKZwoF/q4iYoXGegJqkfZeFlbGBoXygk5+PmJeAjpObiZiSi3yFk4aNlZOJg21zkYaAe3KGgYV9hXSFgpeBj8VmgKmHj6JqnoOgmIGZf4qLg4iYb4yShGd3dHt2Z2h1cGdnbF5jbmxmbFhoR1xRTDJFNDZNYGM2JjQ8REdEOjY0NjU4Ozg+PT0+Qkw/TklKTENQWl1cV2JeamxcUUU9S01ASmRZXWNmaGdiYmJiZGNgX2JhYmNjY2RpaWNiYmJlY2FmY2JiaZWXop+wqKmopaugpLmxqqummpSgo6SqopWjqbajr3+gp5ylnp2Jk7yZk42gkZ2QeYSWlpGHq5mbmpmhhY+Md5ucj6CRiJ6km5WYl4aiuK2lmZuMjH9ibY+Kko+NkIyMl4uQkZ+Pk5+hmaGofqGnh62eoJauj5+dnZGGgaCNq6+HpI2qmoyafqN2gJiTa4GrdU2reIeNnZGbqKeBqqt9g6F7eqdpnn+Sa2eXhpe2iJ59bWBjWIOXf4x7ZGeLc5l9eZZsXXyXbl9TcYRcYGx5g2BZZYJ9hIGYcaeqa4OjbnKlcJ+Dnmhkn2xabIh6ZVlfgn5hV1BvdmVudHJqam9eam9sa2hXaU9dV0U5QTRHQ15rNCtJQ1FNTj04NDg1OTs2QDs7PkJPPlFSTE1CSlxdX1deX2J2YE1EOk1PTVRiXFxmZmlpYmJkYmRkYmFiYGNkY2FiaWtkYmRkZ2RiZ2VhY2iYlp2guaGqo6askqG2vKuuopmXoKGlrKyfnK21o6iSoJ+fppuZjpi0mZCLnoyVi3WBlJGNiqaWlZeenn+ShYaspIeckYqYqJeZmpGHpbCmopWaiIl/aG6Ih4qOjomLjZKLkJKijJOeoJyipX+TgY+joZSgd5yWkKeDoaeAhqquhaV5i32Emn2icHOTh5Z7nox5bYebjJmQm6iaj4edfIKic3amZp5+d6RfmHp8knOibpi3tLp0koeBgLaoZIHGuHtwlbeMcYCbpGNzrKtgfWqds35ufYeDjoKLl3GAo2xzpHOeg3+kXp2Zs5Zve5ees3RyW56ygmlib3R1cWhvWGtscnJlXGleYktEPUQ1UUFZcTI8UkZfSlI9PDM5NTo6NkQ7O0BJUD9UTU5RQERfXltaWGBgfGRIQzhMV1VWYmFaZmZra2JiZWFkY2BhYmBkZF9gY2tuY2NkZGhkYmdmY2holJaVo7mZrJyToI2kuLWuraCbopyjo6Ssm5qxrayTl6CYoKSZmpOeq5uLiJJ4i4VwgJaNio+gkJOUnZd9kImOqKGHmI+KkaKTm5qMi6iopJ6PloaDfWp6hn99j4yCi5CQiY+UoIKWnaCdoJ+LiXecmKKMoHKii4ipiJynkZeoq3+ujH16oJl6o5N4gHOXiIycfZafhpuNmZumhqNkoXyJlpCbjWyeaJqNbpqZen+Kp31yZ3Oqg52Cc6pnlJpdm4V2hJ1oqmqBuGZcqXCBnGGVjF6ndnWJin+eaJp1h5OSmI5/nm6ZkGummVyofne7an2pWo6EXbNnXG5xeXdraVtxaXh5Y19lV2JBUEVON1ZCUm00SlpaX05aQ0AxNTE7OzdIPzpDR1Q/WVJZXT5EYl5WYFFhZH1pRUI5TltdWGRmWGZnbm1iYmVfYWFfX2BgZWNeYmRvcV9kZWVrZWNpaGdraZWciaq2m6iJY5SbrLqysKydppycp5+drZqdsKirnZeimaGfmJaWoKOZhomNaYiAcXuXiIuWloSSlZiPeoqElqOdiZSPhYudkZybiY+oo6CZi5CJf39pgYZ5f5aLeoiNjoePlpp/k6KfoKKTmHJon4qgj4xwkoyCqYiZn6OpoKh9sK2koriXdqOzoqN/iJR4nXqrmn6ijp2bl4iXcqF8hY2vtX1rmpGheH6YtKOjq6iEmHuafJyZfnOqWl1ve5eLeJ5iTX97e4VjepdCTZ9ZompyfI5tgYmEmXWbeYeJsbN/f5qSpnR/nW1xfJRvmXJpo12VdkhlY2BzcH1+bmVgbGh2fGRjYFFeVl1UVkBZRVFnRFJXW2JYXklEPUI4QEI6SUU4TERXQVZRW1ZERmJcWmBLYG1+ckVDPFVfYlplalZnaGxuYmZmXmFhXF1eYWhiX2VkdmxeZWdma2RmbGhoa2mTnYGxrpmEU1+gp7O5s7OpmqKLm6mcm6iSoaukoaiPnp2cmpmVmKGdloeHiXeFgW55lYWQmot9kZKWiHKAiZKgnHKRkICImJSfmoSOqJyalIqKiXuDa4SFcYGgi3eFjYiHkpmVfJKkoZ+jiK6GfbWEj56de6aWeqmClp2Qi6Gefqdod21+mXOgc3F8nYWYb5OCrn2jg6aemoGjcF6pZ3WjY2+lYZzTkHx6mXhyc2OihY9+onKijnVrj7OLYIKYinOqsqi8f3eDbX+/pqq0XpxvfnGXb4FzonJdo2d0pmFopm2b05h7g5tud3mXa5t6dpdybKmlZ19leXB/hGtnZmRtdnhoX2FSW2VRUWJJV0lUX1dTW2VqXGRQRkNLTEpLQkpFOFA/UE1XU1hPUlJgZmVpUmR4eXdJRkVjXWRZaGpUaWhqb2NqZ2BjYFxdXV9oYmFoZXxkXmRnZGtkam1naGxomJt/sKxUXEt+qa+ytbCzo5yYhZinoKCjjaSooJipiZmXmJOZk5Kgl42IhXtwfYRofY+Ck5qBd5GNjolwf4aQk5Jsl5N8iJCRo5WDjqqalJKKhYl5g3WIgG6Cn4Z3f5KGiJmil3mToqSan4mzoaK2i3qsp6SupXCpgJqQhYGckn2kgKKZhphynoSirK6Jl4uAjKSNloOuopR2tba1yaFzlIqAn2Gel6lteZWHn5p1oYd3oH2QloqBb0xmopJwmohzpHt5dGGDgmx+oGxyZGCccn90l2l7abO1tMamc5h+e51qm5urdYKabXR3l2maeXSYcVBFfLNeanVqeIdmamdidHRxblZeVFloUFJoSVVMWFJWXGdrblZnV01KQUpNSkhKTkFRSlBlY2ltZXRyc355e251iXt7VFBPbV1oW2tpUmpoaWxnbGdjZV9cXVxeaWJkaGt7X11kZ2NqZm9tZWltZaKcia+nhWY/lKGzq6+vtaKikICXqKKipIylp52cpYKZl5aNl5CQm5KNiIN5anmGZYOMfpegeXWPiIyBaYSFkoOMhZ2NeoyKlKWSgpepl4yRi4CJeX98i3lwkKGGeYCVh4mWoJZ/lKWonJaWhGdueJxsomR8caV3nJhwZ6eBl4x7pXqgloOXcp92gImUlo+5bpCKomJ9maKViG5yaatqdaBsbqZgm2mLkGiWh5qVdaKAfZpfi4WMdW+IYmihZZ5/aZt1b2NmiIJucqJaX1tkoW5eiYxve39zcmSlbniiZGenaJhzi5huoW9TiI9voF5kp1SLXVOYbW1yanGBbXBoa3hza3BSWFdXZllTbUlYT1xIWGloc2pZa1ZRUkVWXExYUmFVaGped3V6fHB8fHKDe39ydo2AhHZeUXNhZ2JwZ1BqaGhrbG5nZGdfXV5dYGtiaml2dV1cY2hjampzbGZrbWOdpZimemV0bYunrqWqsLGmn4uAlqqcnqWMoqGaoqKAlZiTjZqPi5eQjYp7hnGAiGiLi3yXmnN0in2Qe2WDh5WKipWZgnyIhZamj4Giq5CFkIqBin1/f45zaY+lhHyFk42ImKCOiJKqp56JpniWnH6liZaMspiekIOvl5+leJaIeql0pY+Emm6looyShIyDvG58pa+ChoWGlJecoHylenGolKCWZ55+b6xjloqVkneobKmigYl2h4J3q5GmiGuRsGt2s4ypa4qGbm2fnpKVYX+ri6p2gH+Np593n32FpJWdoGmah3asZ56tjLZzd76MpJNZg6aNq2F1cXNve3RxYmp+bmhsU1ZbVWFhXGtNXFJdSV1tbXZgW3FZW2BaZ3Nlbm9yY3F0YHd7fnlyeYNzhH+Ae3uMgYKAdmJ4ZGNuc2RSbGdob2xyaWZpYV9eXGJrYmxsem9cXGJpYmxqd21nbG5ilaaqnIGAnqSWqaqeqKeuo5mJgpeqmZ6kiZqlnamdhIuaj4WckYWSjYuNdIV6iINvjYR9lpN0dIZykoJtf4ySh4aUj317gYSXpI1/paWNgI2JhJR1goeSb2yLqYCDi5SOiZyfiY2Tq6SgkIB1lZeIfoF5lK6jf4GbcY+GeJCMhYB7cqeMcX19epeWm4SOeHt+fYiUlZOKdpCYnqCDen2JbIyFW3l5cnlxaG5+kolxf3SBj5STcYWDgWWNf1+BgIx3dXOUdW95b26HbYSGX3dpeI5mgYKGjqqcfnR9l2qJiG+AdnyFdm1sZ4xzeHuXd4Rbalh4j2htd3Fwb3d4b11shm5pZ1ZaYFdcZWtjVWFVXlFfcHd5bGp2ZWpqanV8cXJ0c2FvdWJze4F4dXmCdYCAf4B4i4WDfXttf2xkeW5eV25naHVreGppamRcYFpjamVscHVuWltia2RsbHltaGxvYY6Vuqmni6GimqakmaSdq6Kgg4OXq5GdoImappqomIKBm4t+lpSHjomIjXKCfI99fo+EepeOdHKDcJWFe32Si4aGkIV4foCGmKKMe6ehi4WPj4SVgoaOl3dyhaqGjpKckIienoiMm6igoKuDiY6Vmn5+iZatqI+Sp5B4cJ6Rg3uTb36phXB9lXFqb3yBn4t/ko6MaG1dg4uMm5qejnOVi4hxdGuCdnOAWXJuh5CBfX6LaV1pY3qFg4iAX2l4e5t8g4yDdoGGgmh5i4drYXFzg3dgc4yCiZCnlYZmjY+DbnaLg3CFjXlvZWZjeYJ6lVpcaWZudlt6eXd0bXNygmZcbYprbGJZWV5aWWxxW19gWV5dZnR9e3Rvc2Nra2l7fHF7eHRkbXRobHx+dXl8e3p6f39+b4aKhHt9c355c39pVFxxaWx1b3Vna2hkXWFYa2hranFybVdbZW5sZ3N6b2hqbWCMjKuxopCjoZqfnpiemamjoX2Dl6uMn5SHm6KQpZV/e5eEfJKZiImGhopyfYCLdoWLgYSWinFvgHKYhoR+koSDhoqBeoCDipqej4KmoId4jZeIlYuLnJeFg3qtgpGYmZSKnp2HiKGroKKio4yIk5uco5mWqqGnpqCSm4iXj3x5j46EqH5/kpGSk5ywpZqUnZCNspOYhKaMjJSan4mQm4KJkYprfI52d2WChpCKfImdhIeLj4eIgISDkHd8enWaoomHi56LhZR/foyBgXZxdIaFgHiIh4qRppGEho6Ig42QjHyHioiPgXZrgYN7eZlpcmhgc4pwfXp2dW93dIFdXm+HaG5fX1pcXVNocVVjW1thbGh1e3xybnBka2pof3tteH9xaW9wbGaBe3KBgHiAfYCEem2DjIZ8enh8fnqDeE5kdmtzbXB6ZGtlYmJgW3RmcGZycWxVXWx0bWh5enFnaWtljYidup+WoqGYlZmYlJikoJ17gJmqjZ6NhZ+cip6WfHmUgnuOmYmGg4SGbXiBgHKAh36Ik4Rta356l4aEg5B+gIaEhn2Hg4yanJKHqp6CcYqPhZKRi5yRfY17qoSNkpeVjpyWhoabp6Cimp2Gg5KamZmQmqagpp2dkJeBkYp3fYiOhaV7fI+QkYaYqqGdk5yPjauNkYCejIiSmZ6Cjpd+ho2Cb3iFcXRgf4OPhnWLl4CDj4KGhH6Fg5RueXV0k6KLjYWahISNdICKfXxyc3uIhHt5jI6Ek6ePhoSPgoOKiYl2hYeJi3tua31/e21oa2xnXnl+Z3x7dnN1dXt3XGBwfW51YGNbXF5RZm1TZVpdYWtpdnp+cWtsZGtqZ4CAbHOAbGx0b3huhHluhoB2goB9hHZxgo2Ifnt7fH97gopgaXtqdWhpgmRqY2BpW2N1aG9idW1sVGJxeWVwenpzZWptbYuKn7iaoaOfkpKWl4uan56de3iepZCbiYaklIuYmXl6jYV8iZGDjIKBgm18f3hygIV9ipB8a2h9gZeIgYiOfH6GhId8j4CPmpuRiKecf3CLiouShqChioWMfKiSiI+Sl5OWkneNo6Ghnpaaf4GQmpmTjJujoaSal5Gbf46EeYCEj4ehgH6MjY98l6SgoJKZkI+mjY+Bm5GJkpebfpKSfoaNgXV0gnB2YH2AjYZyipV8iItyjH+ChYaOaHdxeIyYko9/l36IinOCh3x8cXl6jIV6e5KNg5amk4uGkXyFhoeEdYKDiId5ZHJ7fnh5cGxqZl59cmh8dXVzfHKAal5gdHZweGRjWV5eUmtoVGRYXmFnanZ4gXFma2NsaGWAgGptfmhucWt9d4Z5a4uBcoGBfYF0doKNhn58e3+BfX+PanKDbnNpYYdobGJfcVV0b21uYHhobVdqdHZjdXt7cmJqb3qJjZ+ykqWlnI6QmI+GnaCanHx2pKCNln+MooqImpZ4e4aHfoOJfoiCgH9wf3t0dYKFfomQeGdjfYaXioKKjXh9gIyDeZaAlZeVjJagmn1vi4GQk4alm4eMiYOmloWSipWXkpF2kZ6hoZiUmHp/jpiXjpabnaSemZOUnHqPhYN4hZeNnn6Bio6Mc5einqGSmI6PooyLg5aYg5KWmX6YjXyIjYF2cX1temSAfIqFcIaTf5CCbIeCgX+JhGV1b3yHkpeNfZN4i4l8gId8fHJ/eIqHeYWRiouYopWChIx3iISCgXZ7gYmFdF54d3xzfXdma2RgfmlqdnN0dH1xfGNjYXNudXNtYVlgXltsZFJiV19gaGt1eYZwYmpjbWVofINsaHRobG9of3yCeG2QhnGAgoJ/dHyDjIF/fnqCg358kG12iHR0bWWKbGphY3VWg2lxbmB5Z2xianZwZnl8enFgcmyGhpCdrpemqJ6NjZeHhqCTl5h9d6mciph5l5yLi5iQeXyAi318g3uAgoB4c3h6c32AhH+Ii4BkXn2LlYd+hId0fX6Kf32YhJaTloyjoZd+cod7k5GKpo+MjoqSoJGDkY+Ul5GKgY+YoJqSkJJ0gI2SlImdnZ6nmJiNlZd0jY6KbIaYkJl6h4iQiW+XnZqjk5WKjZ+MhoGSnH+SkpWGmYh8iYmBenF5anVse36Lfm6FkoKUd2+Cg31+in9kcmp7gJaXhH+NdJCJg3mHfnZ4gH2GgX2EjoWMlKSQeYWDdImHfX9zdYCHg21genV5cHtvYW5iZHthbm92cnd3c3RidmBvbHVub11bXl1eal5PXVdiYWhtc3qJa19pZWpjaHeIbWZsaGptaIB8endukIdzgIOEfXSBhol6gn16gYR9fI5yeop4eG5sh2toX2lyY4docW9ld2hubGF6aGt9e3hwYXdti4GZmqqgpKidioqRhoqeipWXfXatmIyWfZ6TkZaTiHd+e4p8e4B2d3+AcHRzem+FfYGAin58YFx+j5GGf4OEc3qAhnqPkYeRkZuSpJuUgX2AfI2KkqSIjYqNl5qNhZGYk5WOiYmMk52TkIyNboSQj5GJnpmioZeWiZeSb4mZhGeGmo+UeomFkIpwlpqUoZKSiIuZjIJ/kJ58ko+Si5mOe4qEh3RzdWtxbnV8i3RuhZCOknF0gHuBgYh8ZHFseX2ZlH2EiHSQi4F0iHluf32Ah32FjYqFjZWojXuIfX6LhXd9cG+AhYNjaHdzdG56Yl5vYGp0XnBqenh4bHJwZXldbWxzbXNYWl5fYWpaUFdYZGNncXF/h2ZdaWhnYmdxjm9kaWdlamiAend0bo6Fc4CBgnt1goiFd4V8eISFeoCJd3+Le3pyeYNqa19waHR/a3FubXFnb2xle2JugHl2cWx3d4p/o5iiqKGmm4eMioGPnYaTnHSAqZSRjIagjJWTkH90e3aFeHh/cnN7hWtyb3ltiXaAgIZucVtZfpGNiICAgHZ1gH9/oIaPipGcl6CTl3eJfoCMiJydiY+GkpeVhIiUmY+Wi4uNjo2dio6QhG6Ji4+RipyWoZuYlYWYiGuFo4Nnhp2KkX+LhIuBd5OYkZ6RkIiJlY1/fo+XfJGNj42aknyKf4Judm9rbW9we4Vpc4OOl4pwd390gomCeGZzb3aBmY58iYR6lJF6d4h0cIh7hox7i4eEiY+co4h8hHeCi4B4eG5qgIKBXXJycG9vd1pecGBval5vaXx5cG1tam12YHBva3JtWVhhYWJuWFFTWWVmY3VwhIJiXWptZGJma5JtYGZmX2hrgXVycnCLgHR/goB4doCLgHiFf3eHhneDhHuGjH97dop/anFjfGKGfG9wbHRqaG9sdndfcX95e3R1dICCf6WVmq2fp5aFjYN/l5WDj591ip+TkoWKmoyVjYt6cnh0gnByhXNxdYhsb211bYh3g31/bW5VUYGrlIeCeIB2coJ5gqCBkYGTkpebkZp4kXqCjJKkmpOOiJWYkoSGlpmMk4uJj4+InoWQinxzi4WJj4icmZ+blpSAlH9phpyIaIehiJKEkYOJcYORl4+ajY+Mi4+Nd3uSkHqOi4yRlox8iHyAa3ZqbWtrbHp+YXl+jpWBdnqAd4ONfHlndGx0h5WLf4iGe5SQcXqEcHeMeoqMe4l+g4yRn52FfH14got9dnBpa4GCeV93bmxrcXJVXW5icWBfbW55cGdwZmdzdWhwa2F3ZV1WZmBgclNQTlxmZV14cIh8X11ocmJiZWaSal9oZFtncH5wa3Fzin12fIWAdHV/jHl7hoF4iIJzhoR+jIyEe3mVd2ZyaoNgh35vb2t6YGpudH90X3R9eYZ4dHOFfHigj5mwnKWPgop/g5qIgIuef4qZk46EiJeNjo+EdnR2c4Bwb4VzcHGDb2ppdm2Cbn18bXVzUk6C38mS1pN8cHSCdYOggpJ3lJCYm4+Ye5NyhZCfoZOTkIqSm5SGfpaViI2NiJGNiJyAjoF4eox+iIyKnJudm5WTeY13aImSh2yJpIWTiJeDhmOMkZiOlIqWjI2Ki3F7lIl6jYiKkpGJeYV7fmx7ZXJvamt5eVuAeY+OgHp9fn+Gjnp6aHNrc4uPioKFhX2VjGx+f2+AjH+MiH2EeoKQlpqbi3x3eIOQeXNtZnB/g2xpdG5naHNtU15uZHBZX2txd2ZramJmeHNvcGNfd2BgVmtfXnZQTkxgZmNdeXGJdFxbZXZgYWVljmNhZmFYaXNzbmtxdot8dHqGgXV2fotzf4Z/eoh+comHgZGKiHx+mHZlc258ZYd+bnBrgFpsbnl5c2B2enuNdnJ3ind5n4ubrpugkIKFd4iVf32JnIeFn5GOhYyXhJOOh4F1d3B5cW6Eb21ufnJkZHhwfG16fWpobGOkmsHcru+hc2t1g3WEoYWRbpWPlJ+Um4GRcIWLo5eJjpWKkJ2Wg4CVkIWJj4CSioqXf4d7dX+JeIaEjZuamJmOkHaLd2+HiYt9i6SFkomdhYVei5SXio6JjouKhIlsfJaBfYiFiZCPhnaFfX1rfWR3dWpteHNXiHqRhoV6fn+AhYx+eWVzan+KjoqDgn+MloVrgnVuiJGCkYV/gnqAkZaUmZB0dHiIjXV0cWd1eYJidG1vYWh1ZlJgcGdrVV9udHlgcmNfaH1xcm1aYnJhYlduWVx3TU1MY2ZhXnZzim1bXGR5XmBkZoRfY2NeWGpya25rcneLfXN3hIF4d3uJcYOEfX6Ie3SLiYiWhox+fphzaHVxeW2Lem50cIFYcXp2eXFkd3mGjGl2gIlyf5yHmKeco5KEfXCMlHh5i52EhaGNjnyVjH+aiIR7cndwc2pvgWtpbHx0XmB4dntwdXtnYGV869q1ycPciHNsc4B2iZqIjWmXj46clJKBiHCFiKCOhIuVio2YlHyNk4iDiY97kYuGkIJ/dniDhHKHgpKblpSYhox2h39xhYKJh5mig5SMnoOJYYOVjoaJhomNh4CHaX2Uf32DhImOjYJxhn5/cXdodXJpc3drWox9koGFfH+DgISKgnZidGyIgY+Lgn5/kpF9boJseYaPhpOEfYF9gJKTkZeJbnJ6jIZ1bHFrcniAX3RpblxqdWBSZHFoZlNfcHZ0YG9gXWiCcXJpV2doY2lYbVdbdUxKTGVmXmJyc4VoW1xleV5eZGd6YWRfXFlrbmVvanR3in5zc4F+enZ6iHOFg3x/h3Z3ioaPmIGNgnuTdmx3dXl5k3RueHp9WHmFcYBvZ3h3koJkdoaFcYqWhZmhm6KKhnNvkotyd46cfYqaiIl7n3+DmX+BeHFzbm9kcn5oZmx3d1tfeXt6cXF/aWFnYX/Vto6QpnhucXd7cJKQjIdqmI2Im5GLhntoh4uZhoGSkYaHmI18jY2BgYqNfJCMfoqFenV7gnpxhoCVmY6TlIKJdYSHd4SAi5Odn4aWj59+iGF/k4eEiISJjX9/g2d9kH9+f4KLj5B+bYJ8gnRrbXZ0c3Z1a2ONgY5/hX58hH+EiH9wX3NxhXyPjYJ8f5KJenGDZnqDioeMg3yFfoCVj5GThG5weYx/dW1uamt6fWJoamlYa3VaUmlyaWJQYnJ4bGFlXVpqg21zYltnX2RsX25UWm9OSE9mZFxnbnGAbFpbY3JfXGNsd2RlXVxabGxibWlzdoZ/cW5/fHx0eIZ4hYJ8gId1eYmBkpZ8iYZ2iYFveHl7hJNwbXuBd16Df3SBbWl6c5RzZ3KIfXKSkYOan5ughod2dpR/bXaTl32HkIOKjZl8i5p2fXZxb2xqYXR8Z2JpdXpaX3h8em1xfmVjaGhXnY9ecXKWvMODdXGUiJB+cpaLhpuSjIdyaoiPloB7lIyBhJuMfIqGfXyJjH+UiHWKhnZ2fYFxdYaBnpSFlI+Dg3KAiHWFfImYnZiHlI6dgIhmfZOCf4WDiYlygX1nfot7eH5/h4uOfGmAfIN2ZW94eHN2c2xqjYWKgYp/eIGAhIN/a15yeHp+jYqFe4KPgH5ygGl5g4eLhoR5hHyBmI2QjH1ubXuJfXd0bmhnfHZjXHFiV25yU1Nuc2hhTWZ0eGVgXVxYboBvc1llYV5qbWBwT1lrUURTZ2Baa25tfG5aW15sY1pib3dkZ1xdYGxqY2tpc3aBg3Btfnx/dHWDe4OCfIKFdn6JgZaReIOKdIGIcnl4fo2Qb298gXFpgXl6fm1sfHaVa2p3hHRslI2FnpigmYWIbn2Mdmp4mI5+gYqClZeJeY6Wb3pzcGxqZGB0e2hfZXF6WmFyfXlncXphZWWPsbJ3SmJapNnQlnF7kIqQd32Ui4SZkYyFbmuFkpJ6eZKGgYSYinyHf3h4iYqEloBwjIhxdH16aXmFg6WQhJONg39vf4N3hHmFm5mUi5OQlIWHcHuSgn2Cg4mDboF4aICEeHJ/f4OKhntlfX6EdWNwcn9oeHBvdZiNhoKKe3Z4gIR5gWtccX1ygYiFiX2GiXqIcoFucYSHjoSFc4R5gZmNjYR4bm9+hIB3emVoanxwX1l3WlhwbE5XcXNnYEpsdnRgXVtbWXR9cm9XZ11manFfbk5XaFE/WWZeWm9rZ3lxWlpZa2VZY3F5X2hcXmVtaGVraHF3f4dua39+gHVvgnuAgX6Df3aBhYmXinGCjXF7hnx5eYSTjHVqen9sb350f31vcnt7lG9ugX94ZpOKg6GZnJKChmeHg29oepWIfX+EgZiJgXyNjGl4cmtsZl9hb3htX2JveFxkbIN6YXF2X2Vl1Oq+ijI6PouOgHF5hYeOjXaDlox+ko2Mf21shYyLdX2Pf4WClYl8g3hudoeEg5d3b4iFa3V7dGZ5goOni4KPi4R9boB1d4N5hpyQjJCRkoyLhn57koZ3f4SNg2x/cmiAfnhtfHuBioN3YXmEgXFkcWh+bXRxdIGbi4B/hX5ydX2Ac4FwW21+dHiKg4t7h4B8iHh6cWyIg4+Ei3KCeoCXi4t/dG5rd4CAdXVcaWh3cFhWe1NZb2RMWnJyZVtJcHduXFpaWV11fnRoWWJbZ2VuY2lMV2ZRPV5lXF11ZV90cFpZVG9kWWRxeVpoXmBnbWdpbGlwd32ObGmChH55boB8fIF/gnp1goGNk4VwgItueH6Ae3uIkol/aHt+a3R7coZ7c3d9f4x5eIR9fGuMjYSbnZaMgYBsjn5raH6NjHp+f4OUgX59iohrdXFnaGNbYmdybmBha3NhaHCJemJzdF5jZJugj25cNVmvtXRpgIh8koZ2hZaFc4+LiXZwbYWChnR5iXiJfJKIen9zZ3aJfn6Yb3GGfmh2eW1leYiEpIeAh42Jfm5+doCBfIyZh4KTkJiJi4SJfI+IcHt9hHtofmxqgHt6aXp2gYeBcmB3gX5xZHJmdYJtdXuElJGBfIF/bnd5fHR/bVhvf3Z0jIKGd4h2gol6eHNuiYGPgYVzf31/k4mJem5uam6CgnVuXWdmc3FRWnpNWm9cTltycGRVS3N4aVdZWVphcYB0YF1dYGZkaGlmTlloTUBhZFtgdWFcdG1YV1N0YVpkb3JXal5iaGtnbWxpcHd8kmxphIl8fHB+fnuBf4J6d4B/iouDcXuHb3F3g397iY2Pg2p+e253eXeKd314gIKHf4N+fnpthYyImKONhIN7dYt5a2yEiJB4fXuBkX9/foqDcHJwY2ZeWWdfb3BgYGdwZmpviXRhdG9bYWRqdnt/vpymo8i4cYWDc5N8eIaTgnOQjIhycnCEe4JzdYd0iHeTiHl5cWN3h3qAk2lyhHZmd3ZjanyDh56Bf3+Oj31yf3SFeYCRkIJ4lo2Uj4iCiHuIiWt4eX51Z3pobH95c2l6doCCfWhgd4d9amt0Z3uAaXaAi5CUfnp+fnB7dnt0fmJWd31yc4qEgnyDcYaKd3hwcIOCjX99eX59do6Gg3ZpcWltiIJycF1oY3NuSmR1S11uVVNZc25iUU9zeGBSWFhcYW+Cc1thXGhlZWNqZFFacElEY2FaY3BeXXdoVVZVd15bZW5oVmteYWpnZW9vaHB2epJuaYiMeX1ye355goGBfHZ9g4iGg3B3g3JudoKDfYmLk39wgHx4eXqBjHSDeH+BgYKEeoB1b36Ki5ueiH2FeneGe2d0hYuQen5/e4iFhHaPgGdvbl9kXFhlWW1yYGBgcGxraIluYHNpWV5kbYB3qdqpx4aHsnGJeG+MdXuGjoB6k4mAdXR1fnd/b3F/bYR0lIZ4dGtgeoJ5iI9mcYNvZ3ZuW219gZCUf4B5kZJ9eXtth3aAkIuEdJaKkY6HhYV7f4VsdHZ/bWd2ZW17dW1qdnd/f3xgYniFeWh0dWJ9e2d0ho6MlXt0f3VxgHp8bX9ZVnR+b3WEh3+AeWyIhnR4a3V/g4R9e315e3OLgX1zZ3RlbouEbXNbal91ZEhubkxaYVdWVXhtYlBSdHZXUFVYXmFxhG9cYGNtZGRebmJUXHJHQmZfXWZoXVp6YlFVXHVbW2drYVZqX2BuZmZrcWhwdXiOdGuOjHV/dnh9d4GDgXtzfYOIh4NvcX90cXV+hYGJjYp7d394g3x8hod4h3x9gX6EgHt+c3Z5jI6gjYl6iXZ0g3lefYWYjHmGg3SFhoR3iXtibmxbYltbYVZqc2NgW2dub2aHcWFxZldcY2t/fMrOh7mham1timxxhHF8g4l+e5GFenlzeXV1e2psdWOEdZGCd29mXn2CeouJZXKCa2pxY1hse4abiIKBc5eUd398bYhxgYqLh3GXjpCIhYuDe3l+cXFwfWZocWJteHFqa3F3fHx5XGR5gHdpdXhmgXZndIeLjZR8cYZpb36AeW58XVhyf210gIt8gm9viX9xdmh3f4F/gXZ9cnt1h3x6cmZzYW6MgmxyWGtfd1tJbmtNVVReVFV7a2FPVHVyUFFUVl5idIVpXGBramZjWW5hWGJwR0FoXGBmX11Ve11PVWRwWltqaF1XaGBfcmZraHJncHJ3hnhulYp0f3p4fniDh391cn+GhY2CcHB7eHd1eoaFhoyFenx/dYt+fYaEhId/fn59h398eHZ5eJGToH+MfYttdoB5Y4OGloVzkYpvhYWBeoN0Y25qWV9bXV1UZ3NlYFlkcXJmgXNia2VXW2Bpf3i+rnugt21ic4Zoc3txeYKFe32Mf3d4cnZve3Zlam5gh3WOgXNqYl5+eHmLhGZxfmhqa1pWb3eKo4GEf3GZk3GBeXSCbYCCkYdzlYiMiISJhX14dHJuaHlgam1gbXZqZ2preXd6d1tnfXx4ZXJ9bYR0ZXWFjIWVf2+LZmt6g3VtdGJcb3xrdXyLfIFmdYd9bXFndX54fn9yfWx7e4F6eHBmbGJuiX5tbVZrYHdVSmprT1FOaE1ZfGhiTlV1akxQVFVeZnWDZl1gcGhnYVdpXVtraEpFa1phZFdZVXlZTlZtalldbGVcWmVjXnRmbWRxZ3JvdYF4cJmFdn9+d398hYd9dXOCiICVgm5zeHp6c3OFhoiIg3iBfXaPf3yEio6EgoR7fouDe3d8d3eanZd6ioKGaXd9fGyDhJN/co+CcIWCfoF/b2ZsZ1ddW1xbVGRwZF9XYnJ1aXVwZWViV1xcaH9wb3KAc4lkZHh+aXR1c3OChHiAhHl2c3Vua3pwYWdrZ4Z0jYNuZl1ffXB7iX5pbXdmaWRVVnJvjaZ8hHt2lpB0fHN8em17e5CFdph8h4aChoN8dHBybGd0XGxoXmx0ZGdmaXpve3JZZ4B2dWdwgHeBdWJ3hIp8lIBui2pteoFxZnNlYG16Z3N3inx+YnWDdmlrcXR6cHp5c35mfn9/eXduZGZiboZ8bWtWamJwU0toak9LTnBHXntmYU1VdGNKTlNXYWp2fmVcZ3NpZWBWY1dicF1MS2tYY2JVVVVzVkxYdWRaX2thXFpjZV93Zm1icGlzbnJ/dXSagXd/gHd/foWFenx1goR+l4VucnR8enRxhIWPgYB5i3V0kX98gZWOgIWEfX6Mhnt+gHZ7o6WKeYiGhGt1fHp1g4KLeW6Fc3mEfYGDdW5qaGVWXVtaWlNibmRbWGFze2lobWlgYldfW2qAaWtvgGdrYWh5eGpzdHRuhIF6f311dW56aGp5al9lbmiBdo+EZ2VYYndpfod7b2lvZ2ZdVVhvZ46od4F6fJCOeXVvfm9ydXmPgHeVdIWCf4WHdWpydmdobltsZF1tc19nYWp4aHttWm2CcnNpb4B+eXdgd4SEd4+Ecohxb3mAcmNxaVxvd2RxdIh8eGJzgHBnanhzcmx4d3V4ZIN7f3h2cGRjY258fWtsVWliZlNLa2dPR1JrRWF4Z2FNU3FcSk1UWWVrd3tlXm1xaWRdVmBVbm5XS1NoV2ZeWE5VbFRKXHlfW19rXV1bY2VgemhsYW9vdW5veHV6mH13gIF6gH+Hhnp5eoN+gZOEcXR0f3l2dIWIkH2AfJBrc5WAe4KfhX6HfYB/hoKAint2hKyff3qIiINrcoF5dYCAgXNuhm58f3OJgGpvbWRkWF9aWVpVYmpnW1pedYJpXm1sXGFWXFxsgWVxdH1paV1rdnZndHdybYV7fX15dXJseWhpeGZdZHNoeneSgWNjVGVwZ4KFd3dmaGpgV1ZZZ2OPp25+d4CLjnpwcHxmeG96jXx2jnGEfX5/hm5kdnNkaGhca2Jdb29bZ19tdWR6aF10gG9ya3F7fXV1YXSFinqHh4B/d3J1f3VhcG1ZcXRicXKFfHVkcn9sYWx6b2ppe3l2cmaFdnt6dXFlYWVtc35pbFRpXl1US3JiUEZWYUdidmdhS1RvV0pMV1hna3Z6ZGVucWZjWlddWXZlVUpcY1doWFlJV2VRSGJ4Wl1fbFteXGFkXn9pamBvdHhub252g5d5coGAfH+Ii4Z+dXWGeYeMfXN1dYJ5enqCjI59foSJaXOWgXqKnX1+hXqBen98hohzcY+ujHt7h499ZXGHeXN8fHVxboVse35sj3picG9iZV1lVllZVmNma2BdXHOFaFhwblpeV1pcbHticHZ2bGJbbHNzZ3V1cGyEeX6AeXdubnRlaXRlW2d1ZnZ2kXpfXVJmZmuDgnR9YmNpXFRYXWJjj6VoeHSChZB4bW55Z3dtfIV7dYhygHh8eH9oZXZtYGZgXmpfXXNrWWVdb29iemVbd3trbm5vd3hzdGRyg5J+h4KIenZvcn1zYnhkW29wYXFxgnxzZnGAZF5udmlkZ3l7dW5vgnV0fXNxYl9mbm99ZGpTaFhZVE13X1FKWVhIYnVkYUlUbVNKTFpXaWxxe2JsbHNjYVlZW2F2W1NMY11YaVNXSFlhTkdpdVheYW1bW19iYl2FaGhhbnh5bG9qdoGQeG2CfoCBkoiEgXZ0iXSMhnNxd3WCd3x9foyPgH6TfnB3lYN8mZJ5gIB4eX5/dIiDc3CZont6f4mUeGR1iHhzeHVrc25+bHl8cJFyXnBvYGdibFRbWldoY21mXFxxiWVTcm5bWlhYYGx2Y2l1ampeWm1zcWxzc3NqhXx+f3x2bm5sZGlxY1tqcmR0do5zW1dTZWFygH9ygl1iY11TWmBbY5GeZXJxhYSRdGxqem1vcHt8fHGAd39yenl5ZGV1aF1iWmBnW152aFdiXXBoYXdgW3t2amlybndzcnRocIGUgoZ+hHZyanB9bWZ3V1xrbWJxc4F6c2Zvfltgb3FiX2pxfmxsdX5zcXhrcGFcZWxsemFnU2dVV1JQdVtRT1lSSWN0YmBHVWpQSVBaVWtra3xlbW9xYVtaWFlscFdTT2ZXV2lTVEZaXE9IcnVYX2NtY1hgYGFdi2pjZG15eGtvaXV5hntrg31/hJl8goR5fYhuj4Zxb3d6fXSCgnyLj4OCl3R3gpOFgZ+JdYCAgXN/gnGHgnVvopd0e4aLhntld4pubntvZndwemxzdnKMa150bmFnZWtSXVtVZ2FsbFpccIxkT29uXVZYVWdqdGdidGVlXVludG5wdXV5a4d8f3yIdo9zZGRrbmFcbm1jc3iHa1pUVmNkeH19cYVcY19jVFpgWWOVlWNucIOFinNqaHtvZnN3c3xsenR1b3l+dV5mcmNbXlZhZFlhdGVVX2BtZGFxXV1+cGhpc3FzcHR1am2Ek4GIe4VxcmZufXByb1RbZmpmcXSBd3NibHZVYnFqW19vZn1mbXd9c3Nzam1gWmRqandeZlRkVVZQVG1XUVZTUEhkc19hRlhpTkhXVFZtaGR8aWt4a2JXXFVbdGRTUldoUVlmVFNIWlpQTXh3W19lbGlZYmBeXo9uYmZreXVub2h2dn9/bIN/fYaXe3+IgYp+a5OIcmd0gHt1gIN9iI5/i5NyfIqRhYefhnt/hoxzgYZzfYN2bqWMc4GNi3Z3bXqMYGR8cGZ4cnlsbXF2gmdke2xjZmdoU19eVWdfbG9bXm6NaE5pbWBUVlNvZ3NsZndkZV1YcHRscnp3cm2Ie392nHp5a2FlbG1eYG9qZXB4fmdaVlhgbHh8e3CDX2JeZ1ZYX1dkm4hia3GBh313a2t5bVx3cWx6aXZzbm97gHJYam5fWV1VYmNYZHFiU15haGJibFpgfmxma3N1bm13dmtohYt+iHqIbXFlcH1tcm1jWWFoaW90gXRyXmlsUmVxZFRibmJ6Y3F3e3ZrcG1rX1hhZ2h0XGVWYVZTTlhlUk9cT09IZXBdY0ZZaU1JX0tYbWRfeGhufmRgVF5UXXVcVFNgZk5dYVRTSlxZUFl1dl1fZm1oWGNhW16OcGNnandxc25ndnR6g3KBgnmIjX58ioiOem6QinRsc4J0f3+IhYaRhJWPeX6Mj4eRm4SAfIyEcoCBc3R3cW6Tk5OTk5OTk5OTkpKSkpKSkpKSkpKSk5OTkpKSkpKSkpKSkpKSkZGRkJCPj4+Pj4+Ojo6Pj46OjY2Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2NjYyMjI2NjY2Njo6Ojo6OjY6OjY2Ojo6Oj4+Pjo2NjY2Oj4+Pj4+PjoKAfnp6fX5+fX1/fn59fn5+fn5+fn+Af4CAgIGAgIB/gIGBgYOHjI6Ojo6NjY2NjY2NjY2NjZKSkpOTkpKSkpKSkpKSkpGRkZGSkpKSkpKSkpKSkpKSkpKSkpGRkZCQkI+Pjo6Ojo6NjY6Ojo2NjY2Njo6Njo6OjY2NjY2Njo6Ojo6Ojo6NjYyMjY2MjIyNjY2Njo6Ojo6NjY2NjY2Njo6Ojo6OjY2NjY2Ojo6Ojo+Ogn99ent8fn59fX5+fn5+fn5+fn5+f4B/gICAgICAgH+BgYCBg4aMjY6NjY2NjY2NjIyMjIyMkpKSkpKSkpKSkpKSkpKSkZKSkpKSk5KSkpKRkZGRkZKSkpGRkZGQkJCQj4+Ojo6OjY2NjY2Njo6Ojo6NjY2NjY2NjY2NjY2Njo6Pj4+Pjo6NjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Njo6Ojo2NjY2NjY2NjY6Ojo6Cf3x6fHx9fn19fn19fX59fn5+fn5+gH9/gICBgYGAf4CAgICDhouOjo2NjY2NjIyMjIyMjIySk5OTk5OTk5OSkpKSkZGSkpKSkpKSkpGRkZGRkZGRkJCQkJGRkZCQkJCPj46Pjo6Ojo6Ojo6Ojo6Ojo2MjYyMjYyNjY2NjY2Ojo+Pj46Ojo2MjIyMjIyMjIyMjY2NjY2NjY2NjY2NjY2Njo6NjY2MjIyNjY2Njo6OjoN/fHp8e31+fH1+fXx9fn59fn5+fn5/f3+BgYGAgICAgYCAgIOGi42NjY2NjIyMjIyMjIyMjJA+LjExMTEvb4eEhISEiF0tMDAwMC1GoaGhoaGhoJqZmpqampqKg4SEhIOEd2VnZmZmaFxDREREREJOpa+tra2usH9rbm5ubnFKLDAwLy8sSYWDg4ODg4OLjIyMjIyMjY2NjYyMjY2NjY2NjY2NjIyMjIyNjY2NjY2OhX19e3t6fX58fH59fX1+fX1+fn5+fn9/f4GBgYCAgICBgICAgoWKjI2MjIyMjIyMjIyMjIyMjy0aHR0dHBpohYKCgoKGUxgdHR0dGTekpKSkpKSjnJycnJycnImBgoKBgYJyXV9fX19hUjQ1NTU1M0GptrS0tLS3fGVoZ2dnaz0aHR0cHBg7g4GBgYGAgYqLi4yMjIyMjIyMjIyMjIyMjY2NjY2MjIyMjIyMjY2NjY2GfH16e3p8fXt8fn19fX59fX5+fn5/f3+AgYCBgYGAgIGBgYGChYqNjYyMjIyMjIyMjIuLi4uRiYeHiIiIh46QkJCQkJCMh4eHh4aHiZKTkpKSkpKRkZGRkZGRj46Ojo2NjYuJiYmJiYmIhYaFhYWFho+QkJCQkJGLioqKiomKhoODg4KCgoSKioqKioqKi4uLi4uLi4uLjIyLi4yMjIyMjI2NjIyMjIyMjIyMjY2Njoh8f3l7ent8e319fX18fX19fX5+fn9/f4CBgYGBgYGAgYCAgYKFioyMjIyMjIyMjIuLi4uLi5GTk5OTk46RkpGJh46KkJKTkIqRjo6OhYqRkZGRkJCQkJCPj4+Pj4+Ojo6Njo6Ojo2Njo2Njo6Ojo6NjIuLjIyMjI2NjY2NjY2Njo6NjY2NjIuLi4uLiouLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyNjY2NiX59eHh5fH18fX19fHx9fX59fn5+f3+AgICBgYGBgYCBgIGCgoSKjIyMjIyMjIyLi4uLi4qLkJCRkZGPhI6QkIaKj4WNkJCOh4qJiY6IiZCQkJCQkJCQkI+Pj4+Ojo6NjY2NjYyMjIyMjIyMjIyMjIyMjIyMjI2NjIyMjIyMjIyMi4uLi4uLi4uLi4qKiouLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjI2Lfnx3dnh7fXx7fX18fH19fn5+fn5/f4CAgIGBgYGBgIGAgIGChIqMjIyMjIuLi4uLioqKioqQkJCQkIqFjoiOhoaPiY2QkI+Gi42JkImLj4+Pj4+Qj5CPj4+Ojo6OjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLi4uLi4qKioqKi4qKi4qKi4uKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIt+e3d2eHt8fHx9fX19fX1+fn5/fn9/f3+AgIGAgYGAgYCBgYGEiYyMi4uLi4uLioqKioqKipCQkJCPhYOMjpCOiYyJjZCQj4mIjImPh42Pj4+Pj4+Pj4+Pjo6OjY2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKioqKioqLi4uKioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMin18dnZ4fHx7fH19fH19fn5+fn5+fn9/f4CAgYCBgYGBgIGAgYSJi4yLi4uLi4qKiomJiYmJkJCQkJCMhoyJjoeFjYmOi4yLhomMiI2Gj4+Pjo+Pj4+Pjo6OjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKioqKioqKioqKi4uLioqKioqKioqLi4uLi4uLjIyMjIyMi4uMjIyKf353eHp7enp8fHx8fX1+fn5+fn9+fn9/gICAgICBgICAgYCBhIqMi4uLioqKioqJiYmJiYmPj4+Pj5CMjouPjIqPjI6MjY2JjY2LjYuOj46Ojo6Ojo6Ojo6NjYyMjIyLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLjIiAfXh5enp6e318e3t9fn5+fn5/f35+f39/gICBgICAgIGBgIGEiouLioqKioqJiYmJiYmIiI+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Ojo6Ojo6Ojo6Ojo6Ojo2NjYyMjIyLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLioqKi4uLh4B8eHp6eXt8fHt8fH1+fn5+fn9/fn9/f39/gIB/gYGAgIB/gYSJi4qKioqJiYmJiYmJiIiIj4+Pj4+Pj4+Pj46Pj4+Oj4+Ojo6Ojo6Ojo6OjY2NjY2NjY2MjIyMjIuLi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKiYmKioqKioqKioqKioqKioqKioqKi4uHgHt5eXh6fHx6e3t9fX5+fn5+f39+f39/f39/f3+BgYCAgH+BhIiLiomJiYmJiYmJiIiIiIiOjo6Ojo6Pj46MjI+Sj5COjo6Ojo6NjY2NjY2NjY2NjIyMjIyMjIuLi4uLioqKioqLi4uLi4uLi4uLi4uMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKiomKiomJiYqKioqKioqJiYmJioqKioqKioqKioqKioqKioqKi4aBe3h5eHp8ent7fH19fn5+fn5/f35/f39+fn9/f4CAgYCAgIGEiIqJiYmJiYmJiIiIiIeHh46Ojo6Ojo6Ojo+MkJOQkI+Ojo6NjY2NjY2NjYyMjIyMjIyMjIuLi4uLi4qKioqKioqKi4uLi4uLi4uLi4uLi4uMjIyLi4uLi4uLioqKioqKioqKiYmJiYmJiYmJiYmKioqKiomJiYmJiYmJiYqKioqKiomJioqKioqKhYB6eHl5fHt6ent8fH1+fn1+fn9/fX9/f35/f39/gICBgICAgYSIiomJiYiIiIiIiIeHh4eHjY2Ojo6Ojo6Pj4+PjoyNkI2NjY2NjY2MjIyMjIyMjIyMi4uLi4uLioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYmJiYmJiYmKioqJiYmJiYmJiYmJiYmKioqJiYmJiYmJioqFf3l6eXh7e3p7fHx7fn5+fX5+f39+f35/fn+Af3+AgICBgYCChIeKiYmIiIiIh4eHh4eHh4eNjY2Njo6Oi42Nj5WPiYyPjYyNjYyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYR+eXt5ent7eXt9fHt+fn59fn1+f35/fn9+f3+AgICAf4CAgICEh4mIiIiHh4eHh4eHh4aGhoyNjY2NjY+MjImKj42IjJGPjY2NjIyMjIyMjIyLi4uLi4uKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uKioqJiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJg355e3p8e3p7fX17fH9+fn5+fX5/fn9+f3+Af4CAgH+AgH9/f4OGiIiHh4eHh4aGhoaGhoaGjIyMjIyLiYyKiIeJhoyOjJCMjZGOjIyMi4uLi4uLi4uLi4qKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiImJiYmJiYmJiYmJiYmJiYmJiYmIiImJiYmJiYmJiYmJiYiIiIiIiYmCf3h7e3t6enx9fHx9f39+fn19fn9/f39/f4F/gIB/gICAgICAg4aIh4eHhoaGhoaGhoaGhoWMjIyMi4yOjoyKioeEiIuKjIuNjo+Li4uLi4uLi4uLi4uLioqKiomJiYmKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiomJiYmJiYiIiIiIiIiIiImJiYmJiYmJiYmJiIiIiIiIiYmIiIiIiIiIiIiIiIiIiIJ/eHp7enp6e3x8fX1+f35+fX1+f39/fn+AgICAf3+Af4CAgYCDhYiHh4aGhoaGhoaFhYWFhYyMjI2NjJCSjI2Ii4mJi4uLi4mLjIqMi4uLi4uLioqLi4qKiomJiYmJiYmJiYqKioqKioqKioqKioqKioqKioqKioqKiYqJioqJiYmJiYmIiIiIiIiIiIiIiImJiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIiIiIiIiIiHgXx4e3x5enp8fHx8fX9/fn59fX9/f39+fn+Af4B/f3+Af4CAgIKEh4eGhoaGhYWFhYWFhYWFjIyNkY+PjZGJjIaJjIuIiImMiYeNjo+NioqKioqKioqKiomJiYmJiYmJiYmJioqKioqKioqKioqKioqJioqKioqKiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4WAenl9e3t7enx8fHx+f39+fn19f39/f35+f4CAgH9/f4B/gH+AgoSHhoaGhYWFhYWFhYWFhISLi46PjoyLj4iHiYmMjYWFjo2KiYyNi46KioqKiomJiYmJiYmJiYmJiYmJiYmJiYmKioqKioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHhoaHh4eHhH55eX16enp7fXt8fX5+f35+fX5/f39/fX5/f3+Af39/f39/f4CChIaFhoWFhYWFhYWFhISEhIuLjI6MjI2Lh4mIiomGgoiNjoiKi5GTj4uJiYmJiYmJiYmJiYmIiYmJiYmJiYmJiYmKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIeHh4eHh4eIiIiIiIiIiIiIh4eHh4eHhoaGh4aGhoaGhoaGh4eDfXp5e3p5enx8e31+fn5/fn59fn9/fn9+fn+AgICAf35/f39/gIKEhoWFhYWFhYSEhISEhISEioqOjYmIiIqKh4iHiomIioiIh4qGi5GPiomJiYmJiYiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHh4iIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGh4J8eXl6eXp7e3t7fX5+fn5+fn59gH9/f39/f4CAgH9/fn9/gICAgoSGhYWFhISEhISEhISEhISKi5CPiYmJi4qHh4WHiYuKiYSLjYmOjYqJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiIiIiImJiYmJiYiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGgXt4enp4e3x7e3x+fn9+fn5+fX1/f39/f3+Af4B/f39/f3+Af4CChIaFhYSEhISEhISEhISEhI+Qj4+IiYuIhoeIiYuLjIuJioqNio6Oj4iJiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoaAe3h5eXh4enp8fX1+f35+fn59fn9/f39/gIB/gICAf39/gIB/gYKDhoiGiIaDhISEhIODg4ODkpKOioeKi4qLh4uNiYqJi4iHiouIio+SioiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhn96eXh4eHl5eXx9fn5/fn5/fn1+f35/f3+Af39/f4CAgH+AgH+BgoOHjo+PjoiHhIWFhoaFhYWSkI6KiYmIiImKioiIh4aKjIiHiYmOkJGNh4iIiIiIiIiIiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4aGh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWGf3l4d3d3eXp5e3x9fn9+f35+fn5+f35+fn+Af4CAgICAf3+Af4GBg4eOjo6Ojo6Mjo2OjY2MjZCQjomHhoiJiYeIiouIiYyJiYaKjY6PkYuIiIiIiIeHh4eIiIiIiIiHh4eHh4iIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhYZ+eXd5d3d6eXl8e31/fn5/fn5+fn5+fn9+f4B/fn+Af39/f39+gIGEiI6Ojo6Ojo6Ojo6Ojo2NkJGOi42JjIiIiYaHiYaIioiHi4yLjpCQiIeIiYmJiIeHh4iIiYmIh4eHh4iIiYiIiIiIh4iIiIiHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhoaFhYaGhoWGhYSEhIWFhoaFhIWFhX55d3l2eHl4e3x7fn5+fn5+fn5+fn5+f39+f39+f39/f35/f3+AgYOGjY2Ojo6OjY6NjY6OjY2Qj42Ni46KhoiKhISLiYeDhYSDi4mLj42JjI6QkI+NjYyLjY6Pj42NjI2Nj4+Pjo6MjYyMjY2KiYiHiImHh4aHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoeHiYqKiIeJi4yNjo2LiImLi42OjYyJiImMgHl3d3Z6eXh7e3t9fn5+fn5+fn5+fn5/f39+fn5/f4B/f4B/f4CBg4aMjY2NjY2NjY2Qj4+Pj46NjI6KiYuMjIeFiY2Lh4aIh4aHh4uNjo6Pj4+Pjo+Pj4+Pj4+Pj4+Pj4+Ojo+Pj4+Pj4+Pj4+Oj46Oj46Mi4uJh4eHh4aIhoaGhoaGhoaGhoeLiYeHiIiLjY2Mi4yLjY2Ojo+Ojo6Pj46Ojo6Ojo6Ojo6Njo6NjY2AeHZ4eHp4enx6fH5+fn5+fn5+fn5+f39/fn59fn9/f39/gH9/gIGDhoyMjIyMjY+QkpOTk5KSjYyMjIqHioyKh4eJiYWCiouIiYWJjpCNjo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjI2NjI2LiYaHh4eHiYqLjY6NjYyNjY6OjY2OjY2NjY2NjY2NjY2NjY2OjIyNj4+OjY2MjIyLi313dXd5enp7e3p+fn5+fn5+f35+fn5/f39+fn1+f39/gICAf3+AgYOFj5KRkJGSk5OTk5OTkpKLi4uLiomMiouLiYuKhoeOjYiIjI6OjIuMjIyNj46Njo6Ojo2NjY2MjY2NjIyMjIyMjIyMjY2NjYyMjI2NjYyMjI2NjIyNjIyMi4yMi4yMjI2MjIyMjIyMjIyMjIyLi4uLi4yNjY6Sk5OSkpSRkJOVlZSTk5COjo6Oe3Z2d3h6ent7e31+fn5+fn5/fn5+fn5/f35+fn9/f39/gIB/f4CBgoSNkpKTkpOSkpOTkZKSkoqJioyJi4qJjIuKioiHiYqKi4mKjY2Mj46Nj5KUlJOUlJOTkpGSkI+Ojo2NjY2Pko+OkZGOjIuKioqLi4qKi5CPjoyMjIqKioqKioqKiouKioqKi4yLi4uMjIyKiouLi46RkpOTk5SUk5STk5SUlJOTk5KSkpKSk5F6dXZ2eHt7e3p6fX5+fn5+fn5+fn5+fX5/fn5+f39/f3+Af39/gIGChIuRkZGRkZKSkpGRkpGRiYmIiIqMiYiJiYuJhoSJhoyKh4ySkpKTk5OUlZWWlZWUk5OUlJSUlJSUlJSVlZWVlZWUlJOTkY+QkZKQjoyRlZWVk5KSjo+QjYqKi4qKi42OjY6RkpCRkpKSkpGRkpKSk5OTk5OTk5OTk5OTkpOSkpKSkpKSkpKSj3h1d3l6e3t7ent9fX19fn5/f35+fX5+fn5+f39/f39/f4B/f3+AgYKEi5GQkJCSkpKRkZGRkZGIiIiIi4uJg4eLi4yMiIeHjYyNkpSSkpOTlJWWlpaVlZSSkpOTlJSUlZWVlZaXlpaWlpWUk5SUlJSVlJSUk5OVlZWUk5KTk5OTkJGSkZGSk5OTk5KSkpOSkpKSkpKSkpKSkpKSk5OTk5SUk5OSkpOTkpKSkpGRkZGPdnJ3enp7e3t8fX59fX1+fn9+fn9+fn5+fn6Af39/f3+Af3+Af4CBgoSKkJCRkZGRkZCQkJCQkIeHh4eIiIiFi4+KjI6Njo+OkJWUk5OTk5SUlZWVlJSVk5KSk5KTlZSUlZaWlpaWlpaWlpSTk5OTk5OUlJOSk5SVlZSTkpKSkpOTk5OTk5OTk5KSkpKSkpKSkpGSkpGRkZGRkZKTlJSUlJSTkpGRkZGRkZGRkZGRkYx0c3d6ent7e3x9fX1+fX5+f35+fn5+fn5+fn9/f39/fn9/f39/f4GDhIqQkJGRkJCQj4+Pj4+Ph4iKi4yNjYuOj42Mjo6RkpGSk5OSkpKSk5SUlJKSk5OTk5OSkpOUk5OTk5WVlZWUlZWUk5OTk5KSk5OUk5KTlJSUk5KSkpKSk5OTkpKSkpKRkZKSkpKSkpKSkpKSkZKRkZGSkpOTlJSUk5OSkZGRkZGQkJCQkZCRinN0dnp8fHp7fXx9fn59f35/f35+fn9+f31+f39+fn59f39/gH+AgYKDipCQkZGQj5CPjo+Pjo+Oj4+Pj4+Pj4+PkI2OjpCRkpKSkpKRkpKTk5OTkpGSkpKRkZKSk5OSk5OSk5STk5OTlJOSk5OTk5OTk5OSk5OTkpKSkpKSkpKSkpGRkZGSkZCRkZGRkpKRkZGRkpGRkZGRkpKSkpKSkpKSkpKRkJCQkJCQkJCQkJGGc3V2e3x8e3x9fX1+fn1/f35/fn5/gH9+fX5/fn5/fn5/f3+Af3+BgYGKkI+PkI+Pj4+Pj4+Pj4+Oj46Oj4+Pj5CQiI2PkJGRkpKSkpOTk5OTkpKSk5KSkZGRkZKSk5KTkpGRkpKSkZKSkpKSkpKTk5KRkZKTkpGRkpKSkpKRkJCQkJGRkZGQkJGSkZGRkZGSkZGRkZGRkZGSkpKSkpKSkZCRkZCPj4+Pj4+Pj4+PkX9ydHh8fHx7fHx9fX5+fn9+fn5/f3+AgH99fn5+f35+f39/f4CAf4GBgYqPj4+Pjo6Ojo+Pj46Ojo6Ojo+PkI+Pj4+GjpCQkJCRkZGRkZGRkZGQkJCQkZGRkZGRkZGRkZGQkJCRkZCQkJGRkZGRkZGRkJCQkZGQkJGRkZGRkI+PkJCQkJGRkJCQkJCRkJCQkJCQkZCQkJCQkJCQkZCQkJCPj4+Pjo+Pj46Ojo+Pj4+PeHJ2eXx9fHp9fH19fn5+f35+f39/f4CAf39/fn5/f35/f39/gIB/gYGAio6Ojo6NjY2Ojo6Ojo6NjY2Oj4+Pj4+PjoiQkZCPj4+QkJCQkJCQkI+PkJCQj4+Pj5CQkJCQkJCPj4+PkI+PkJCQkJCQj4+Oj4+QkI+PkJCQkJCPjo+QkJCPj4+Pj4+PkJCQkI+PkI+Qj4+PkI+PkJCQkI+OkI+Pj46OjoyMjY2NjIqDiYhzc3Z4fX58eX18fX1+fn5/fX5/fn9/f39/f4B/f39/f4CAgH+AgH+BgYCJjY2Ojo6Ojo6OjY2OjoyNjY6Ojo6Ojo2NiJCRkI6Njo6Ojo6Ojo6Pjo6Ojo6Ojo6Pjo6Ojo6Ojo6OjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Pj46Oj4+Pj4+Pj4+Pjo+PjY2MjYyNjoyLi4mJiYiFhYSDgoKEgnR5fXp4dXJrZWltb2xmZmdncHNzd3l9fnl6e3x9fX1+fn59fn9/fn9/f39/gIB/f3+AgIGAgIB/f4CBgImNjY2NjY2MjYyMjIyMi4uLjYyMjIyMjIyGj5GRjIyMjIyMjIyMjIyMjIyMjIyNjY2MjI2MjYyMjY2MjIyNjY2NjYyMjI2MiomKi4uJh4KAh4iEgXt6gH57fXx8fXlzcnJycnV1cG1ramppZ2NkYV9bXF1eWFVXWFlTS0VJSkpLTE1PT0tgdHR3eX19eHp5e318fX5+fn1+f39+f35/f4CAgH+AgICBgYCAgICAgIGAf4OEhYSFiIuLjYyMjIuLi4yGiYqKioqKh4OOkJGNiouLi4uMiYmKioqKiouLi4eDi4qIiYmGhYWEhIeJiYWCg397fHl6e3pzcHFxcW1samdsbWdlZmVmZGNlZGVkZWVlZWRkZGNhYV5dXFpYWFdUUFFSU1JTTU1KSUZESElHR0hHR0xOSWdzdXh5fXp4d3l8fHx8fn5+fn9/fn9/f39+f4CAgIB/gICBgICAgICBgYFnXmBjYWNucX17ent/fXd8fHZ4ent4eHpvcHt4eXt8e3h3e394dXd0dHZ0dXZ3dXFycW5wcnBnaGtsbm9tamlpaGhlZWRkZF9gYWJgYF5dWVhaWltdXV9gX2BfX19gYmFeXl5eWVldXF1bV1dWUlRSU1NOUUpISUZERUhMTEhGR0lLSklNbXJ0eHp7end3eXt6e3x+fn1+f39+f35/f35+gIGAf3+AgIGAgICAgICCgWdYW1pZXFtcY1xaXF5ga3FtcHBvbm5vbmtpbmxrbG9qaWtraWpraWdmZ2dnaGhnbWdqZ2hlaGdjY2JhYmBgXVhbW1dYV1RWUVBUU1NNSkxLTExOTk9UWFhXVVVUUlBQTU1QT05LTE1QUU9MTEpHSUlHSEhJSEhIR0ZHSEpKSEhISUlISVZwc3Z5ent5dnZ5enp7fH59fX5/f35/fn5+f3+AgX9+f4B/gICAgICAgIGBbFtYVlZWWVlaWVlYVVZoamxubmxra2poaGloZGVkYlxiZl9fYGNfXF9dYF1eWl5dWVleYmFeXlpZX1xYV1NOTUtLS0tMSUtNTktKS0tMSktQTEtLRkdHSUlGR0lISUZFSEdGRkVERUVEREVJSUlHSEdIRkZLTUtJSUlIR0hLTU1LTExMVXFzdnl6e3h2d3h3ent8fn1+fn9/f39+f3+AgIGAfn5/f4CAf4CAgIB/gYJoUlRVVlNVV1lZWVdXV1tbYWNfXlxbWFZWWVZSVFJRUVVUU1NTUE1KTU5QUk9NUFFRUVFRVlZRUVFUUFBOTk9MSk1MS0xKSktLRklJSkxJR0pISUlFR0dGRkVFSElKR0ZHRkZHR0hKR0dISEpMSkpLSUlISktLSkhKS0pISUtMTU9QUEtUdHR1eHp6eHZ2d3d6enx+fX5+fn5/f35+fn+AgYB/f3+AgYB/gICAgH+AgmlQUlRXVVRWWVdYWFpbVFRTUlBRU1FRUU9OTlBQUU9MTlBPTk5NTEtNTk5QTU9QUFJRUE5OT05PTk9PUFFPTk5PTk5QTk1NS0lISEpJSUlJR0ZHR0dJSkhJSEhJSEhHSEdISElISUxLSklISkpJSkpIR0pMS0pJSUhKSktMTk1NTU9RTFVzcnN3enl3dnR2eHp7fX19fn5+fn9+fn5+gICBgICAf4GBgH+AgICAgICBbE9PTlRZVVVdW1lXV1hOTUpKSUZKT0xKSkdJSk1NS0pMTUpHSUlJSktMRkRGSktLSkhKTExMT01MTE5PT09NTk9MTk5OUFBPTE1MTk1MTEpJSEdJSElISElJS0xLS0pJS0pJSklJSUlJR0dKSUdJSUpKTk1OTEhJSklJSk1PT01MT1JOWXBwcnd4d3d0c3R3enx+fX5+fn5+fn5+fn9/gICAgICAgYCAf39/gICAgIFvS0pNTlFOTlVXVlZSU0lFQ0VFUkREQT5CP0RAQD5CREFAQURHRkVIRUJBQEBDQ0RFQUNFSEtPS0lJSkhHSklKSUlLSkxQTk1MTU1MTU1NTElIREZGR0ZGRklKSUlLSkhMSklKSkpJSEhKS0tIRkdJSklLTU5OSktPTUxLTU1PUE5QT1BgcG9yd3h2dHJzdXd6fX19fn5+fn9+fn1/gICAgICAf4CAgIB/f3+AgICAgXNQUE5OUE1KS1BSUE5RQ0RCQUZRRT1DPT9FSDk6Oz0/PTxBRUA+Ojs+PjxFRD0/RUE/QEFAREVHR0dHQkRERUZFR0dHR0pHSEpLR0NER0pHQ0RFQUFDR0hHSEdISktKSElMS0lISktLTU5MTUxMSkpMS0lLTU9PUFNRT1BQTk9QUlFNUGdwb3N2dXRycXR4eX19fX1+fn5+f4B+foCAgH9/gIB/f4CAgH+Af4B/gICCdlRVUVFQT0xNUFBOT09BQkFAQkE/Oz48Pj8/Ozg5ODs7OkA7Oz48Ozs8PEhMPT1BQT9CQz1BRERGQ0ZGREdJSEM/QD9AQUFCQUE/Pjw9PkFAQD8+P0BFR0dHSUtMTk1OTUxNTUpLTVBVU05MTlFOTk1OTE1NTk9OTk1LS05OTk1OTkxUbnBwcnR0c3Fydnl5fX19fn1+fn5/gH5+gICAgICAgH9/gICAgIB/gH+BgIJ4UVFSVFJTUVNTUVFST0BAPT4/PD8+QEE/PT45Ozo7Ozk5Ojg4Oz07Nzg7PD49Ozs6ODpAQEFCP0E/Q0ZEQkNDPzs+PkBDQ0E/Pj9BPkBAQj9APD9CQEFDRUVFSktQT1BPTU1OTExMT1JRUFJOTExPTUtOT0xMTEtMS0tKS0tKTU1LS1xxcXF0c3VzcXR4eHp9fn1+fn5+f39/fn5/gIGAgH+Af4CAgICAf4CAf4CAgXxSTU9RUFFSUlRSU1NOPDs8Ozs7P0BBQkA9PDk8PTw6Nzk6Ojk3OjpAPzg6OTo7Ozg3ODk7Ojg8Oz1AQUA9Ozs+PD09QEJDQT9BQkE9Pj09Oz0/Q0RCQD9BREJFR0pKSkpKTE1MTExNTExOVVNLTE1USVBKSU1KSUpLS0pJSEdKS0lKZnJxc3RzdXJydnl5e31+fn5+fX9+f39/f36AgICAf4CAgICAgIF/gIF/gYCBgFZMTlBQTlJRUFBRUU44PT88PDo9PkFAQT8+PkA/Pj48PT0/Pz49PWppPj09PTw8PDw7PDo7PD49Pj8/QUA+P0E/QEBBQEBAPT8/PTw6Oz09PD9AQUJCQUBCREZGRkdGR0dISUtMTExLTEtKS0lKSk1MTEpMS0lISUxMS0lJSUlLR01tcHF1dXR1c3V4eXl8fX5+fn5+fn5/gH9+gIB/f39/gH+AgYCAgYCBgICBgYCCYUtPT05OT1BPT1BQTzo8Pjw9Oz8+PkFCPz0/QkREPz49Pj5AQDxKeHNMPUNFPz9APTs9PT08Ozo9PkFBPz5AQD9BPz89PD48PTs7PD0+QUA/QD5AQ0NEQkRFSEVFR0hISEdGSUpJSUlJSUhKSkpKTEtKSklJSEhKSktMS0lLSkpIVnBvcXNzdHR1eXp7e3x+f35+fn5+f39/f39/f3+Af4CAgICAf4GBgICAgIGBgIJtTFBRTk9QTk5PUFBPPjw8PT4/P0A+QEA/Pz9DRkVKPzw7Um9tZ2V4c0g4PDk9PUA9Ojw7Ozw7ODk7Pz49PD07PEA9PTw8Pjs9PD0+QUBCQUBAP0JEQ0RFRkZGQ0VHSElJSEhJS0tMTUpKSUpNTUpLSktJR0hISEpJSktKSk5MSUlfcHFycnJ0dXZ6e319fH5/fn5+fn5/f35/f36AgIB/gICAgICAgYGAgICAgIGAgXZNTk5NTk5MTE5QTkw+QTw8PT8+QkM/P0FBQUJATXpjPVeBhYaGgnlyRjg4ODo7PT8/PDs7PDs6Ojs+Pz89PDg6Pjw9Pj89Oz4/QEJDQkJDQ0FCQkFCQkRCQkRCRENGSUdGRkhJSUtNSklKSktMSkpJSkVESUlGRkhISkpKTEpGRmdwb3FxdHZ1d3t8fX18fn59fX1+fn9/foB+fn+AgH+AgICAgICBgYCAgICAgICBe05JS0tMTExFSUxOTTw/PDw9PkBAQUE7QkNCQz9Wd3tnfYOCg36CfnZHPT0/Pj0+Q0Q/Ozw9Pj89PT5BQ0A8OTtBPz4+QT07P0JAQkNCQENDQUNBPT0+QD0/QUFBQENFRUBAQ0JDR0dFRENGRUZGR0VEQEFHR0ZDRkRHSEpHQz5IbG9wb3F0dXZ5fHx8fHx+fn1+fn5+fn5+f36Af3+AgICAgICAgIGAf4CAf4CBgIF+UUhLTU1NS0pLTE9RQD8+PkFBQEBBR0FCRUNFQFd1dH+BfYKDeYGFckRAQENAQD9AQD49PD1BRUFCQkZIQz08QERDQUE/Pj1AQT4+Pj88PkBER0VAPkBBP0BDRkVDQkNDQEJEREJERUFCPkFCQkFCQEA9QUJDRENDQUNFR0E/PVZwcHFwcnV1d3p8e3t8fX9+fX19fX1+fX5+fn9/foB/f4CAgICAgYCAgIB/gIGAgX5SSEtNTUxLS05OUlVEQkBDQ0FBQkBCQ0BAQUFATnRyfn14goWBg4ZfPUNDRUA/P05hX0pAQ0VJSUlJTU1LRUNGR0hFR0VFRUREQ0E/QD4+QkZKSkdFRUdGRkpOTktKSUdHSEtNSkdHQ0REREVEQUJCQ0BDREVEREVERUZDQkFEZW9wcXF0dnV4e3x6fHx+f319fX19fn59f4B/f39/f39+gIGBf4CBgICAgH+AgICAfVJJSUpKSEpKTE9SU0dGRUdIREdIREA+PDs+QEVFZneAgYGEhYeGiIRLQ0VEQ1d1homKflhHSEpMTE5PT0xIR0hHSElJSEhHR0hIRUNFRUVFRkhKSkZFR0lKTU9PTU1LSktKTU5LSUhGSElIR0ZFRkZGREZIR0VFSEhGSEdIRlFubnBxcnZ2eXt7e3p9fX5/fX19fX1+fn1/f39/fn5/gH+BgYGAgICAgICAf4GBgIB8UEhHSElGR0lKTU5OSkxJSUpLTE5KRkNBQkNGSkdYc4GEhYWDhYiIjWU/QVZ0h4mHh4aHgldJTE1MTU1MSkdHR0dER0dHR0ZIRkhFQ0RERkVEREhIQ0NDR0pKS0xMTExMTElKS0pKSUlJSEpISEdISUhHR0hGRkZISklJSUlIXW9vcXJzd3d6e3t6e319fn59fX19fX5+fYB/f39+fn+BgIGAgYCAgICAgIB/gYCAgHxNR0ZIRkVGR0dKS0pMTUxLTU5NT0tJSEhKS0tMTEpYgoWGhIGChoiKfFRshYeGhoaHh4eHfFBLTEtIR0ZGREVDQ0BBQ0NDQ0ZGRUJAPj5AQUFAQkQ/Pj9ERkhERUdJS0lJR0hJR0lJSkpJSEZKSkpKSUpJSkpKRklMTEpKS0tmb3Bzc3R2eHl7e3t8fH1+fn19fX19fn59f39/f35/f4CAgICAgYCAgIGAgICAgICAfU9GRkdGR0hHRUZHR01NTUtMS0lHQ0NDRElLS0xMSmOGhoaDgYOChISDg4WFhISFhoaHh4aKdUlJRkI/P0A/Pz88PDw+Ojo8QUFAPjw5OTg8PD07Pjs5Oz9BQkFBQ0NDQEFCRERCQ0ZISUhISExNTEdJSk1NTk1KSktLSkxNU2xvcXRzc3d5e3t7fH19fn9+fX19fX1+fn5/foB/fn9/gICBgIGBgICAgYCAgIB/f39+UUZFRkdJSUdEQ0VGTk1MSklIRT85Oj5ARUhISkpKbIeGhIGDhoCBgoODhIWFhoeIiIiJiYyOZkJCPTg4Ojo5ODc4ODk2NDc5Ozw6ODU2Nzc4OTc4NzY4OTs7PD5AOzk5OT09Pjw8PUFERUhKTUxMR0lIT1JRUFBOTE1NT1Fdb3BydHN1eHp7e3x8fn5+f359fX59fX5+f39/gH9/f4CAgICAgYCAgICAgICAgIB/f39RR0ZHSEpIRkVGR0hMTEpJSUdDQjU2OjxDQENHSUlohoOBf4CDhISEg4OEhomKi4uLiomKi4yJVDo4NjU2NzY2NjQ1NzYzNDY4Ojg3NjU2NTY3Njc3ODo3Nzc4OTs3NTg5OTg5ODc2OjxAR0ZJRklGRUZPU1JTU1JPUFBSVGVwcXN0dHd5e3t7fH1+fn5/fn19fX19f39/f3+Afn+AgICAgICBgICAgICAgICAgH9/flJISEhJS0lHSUpJSkpLREVIRUJANTc4OD06PUVDRXKFgICBgoODhIODhYmKiomJioqKiouJiYqBSDY3NjQ2ODg3NDU3ODQ2NzY5OTc2Njc2NTo5Ojo6PDg5ODk3Nzc3OTo5ODg3ODU4OTtBPT4+QkE/QUtMT1FQUU9PUFJXa3FydHR1d3l7e3t8fX5/fn9+fX19fX5/f4B+fn9/f4CAgH9/gICAgICAgH+AgICAf39+VEhHSUlMTUtKS0tMSUg/QEFAPDo1Nzk4OTc7QjlGgISAg4SFhISEhIaJioqIh4eIiYqKjIqJiYx6Pjk4ODs8PT45Ojs8ODk7OTo7Ojk5Ozo5PT09Pzs7Oz06Pjs5Ozs8Ozw7OTo8ODo6Ozo5OTk8Pzw9QUJESUpNS0pLTFdvcnN1dHZ4e3t7fHt9f39+f359fX19fn9/f35/f39/f3+Bf4CAgICAgICAf4CAgH+Af35URkVGSUxOTkxKSk1CPzo7PDs4OTk4OTo6Ojs/PVSFg4KDhYaFhYaIiYiHhoaGiImIiYuMi4mKioxsPDs+QkNFRUFBQUI+QEJAQD89Pj5APz4/QD9APT0/Qj9BQT9BPz1AQEA/P0E9Pjw7Ojs6OTs/PTs7PT1BQUNBQkNBWHFxdHR0dnl7e3x9e31/fn9/fn19fX5+f35+fn9+f4B/f4CAgIB/gIGAf39/gICAf39/flJFQkFHSk5PTElHSzo4Ojs5Ojo8PTo7Oz09P0BCXYeDg4WGhYWEhomJiIiGhoaHiImKi4uKioqLiotePkRHSUtKSUZHR0RGSEdFQ0BAQ0VDQkBCQ0I/QERIRUNFREVFQUZFRkVGRkRAQj89QD49P0A+Pz8/Pj8+Pjo7PTxgcXJ0dHV3enp7fX19fn5+f39+fX19fX5/fn5+fn5/gH9/gICAgICAgICAf4CAgIB/f4B+UERAPUNIT01HRkJEOTc6Pjo8Oz4/Pz89QUBEREVhh4ODhYWGhoaIiYmIh4aGhoeJioqLjI2MjIuKiohXSExNTUtOSklLSElKSklFQ0RGR0ZEQ0VGREJISUtIR0dGR0dFS0lLSUpLSkNGQ0NEQkFBQ0JEQ0NERENBPTs9QGhwc3R0d3d6eHt8fH19fn5/f359fX1+fn9+fn59fn+Af3+AgH9/gICAgICAgICAgH+AgH9PQT49P0RMS0BCQkE5ODw+Ozw7PkA/QT9CQ0hISl+FgoOFhYeHiImJiIiHhoaGiIiIiYqMjYyMi4uKjH9QTVBNS05LSkxJSUlISkZER0hISUVFSEZGRUxMTUlKR0dISUpPTU5MTE1LSEZHR0VFQ0ZGRkZERUhIRkNBP0BMbHB0dXZ4eXl5fHx8fX1+fn9/fn19fX1/f35+fn5+f39/f39/f3+AgICAgIB/gICAgICAf1FBPz4/RkdHPTxAQDg4PDs8PTo/QD5AQENGSkpQZ4ODhYSFhoeHiIiIiIiIh4eIiIiJioyNjIyMjIuKjXFNUU9NTExLTEpIR0VKSERKSEdLSkhKR0dHS0xOTExISElKTVBOUE5NT0tJR0lKSElESUhIRkZHR0lGQ0JBQ1VucXV2d3l7eHl6enx8fX5+f39+fn1+fX5+fn5/f36Af4B/f3+Af4CAgICAgICAgICAf39/VERBQUJHR0I/OD9AODo8OD0+Oz1BPj9ARUlLTVZzg4OEhIWFhoeIiIiIiIeGiIiIiIiJjIyLjIyLi4uLi15RUVBNTk1LSkdGQ0dKR0xKRktPTEtKSk1NTE9QTkhJS0xPUVBQUU9PSklKSkxKTEZHSEdGR0lGRUVCQEJCXG9yd3h5enl5eXp6e3x+fn5/fn59fX19fn9+fn9+f4CAgIB/f39/gICAgICAgICAgH9/f39VRUNFRUdHRUQ7P0E7PTw5QD4+QEJHR0FITE1RV3mFg4ODhISGiIiIiIiIh4eIiIiIiIqLi4uMjIyMi4uNfFdVUlJUUk9MS0pFRUZLT05PV1ZRUE9RU1JNU1RPTVNMUFNVV1JTUVBMS01NTUtOR0dKRkZISkRERUVCRENjcHV5eXp6ent6e3p7fH59fX9+fX19fXx9fn5/gH9/gICAf39/f3+BgYCAf39/gIB/f39/f1VGRkdHR0dIRj5AQj0/PT1CP0JDRlZORk9RUVVZfIaDhYWEhIeIiIiIiIiIiIiIiIiJiouKioyMjIyOi4uLZ1ZWa2FFUlFRUEo7OlFTUmB1XVVWVFZZWVJYWFJaZlBVV1pdUlRXUVBOUlBQUFFLTEtHSElIRUZJSElISWpydnl5enl6e3t8ent8fXx9gH59fX19fX1+f39/f3+AgIB/f39/gICAgIB/f3+AgH9/f35+VEhKSUlHR0ZFPz9BQUVCQ0dFREVMWFJNVFZWWFt8hoWHhoWGh4iIiIiIiIiIiIiIiIiIlJyMioqMfWGKi4uHbFtkVTpYWFhTUD5AVlVZXGRgVllicl5dVl1aVkVRWVpbWV9UWWdSVVZYVVRWVE9PTUpMSklJTE1LT01Tb3N2eHl4d3l5ent6e3x9fH5/fn1+fX19fn1/f39+f4CAgH9/f3+AgICAgH9/gH+Af39+fn5WSkpJSEdGRERCQT9ITUlNUEtJS1BUU1NYWlpcXHiFhIWFhYWGh4eHiIiIiIiIiIiIiImcnaCPiY5nO36MiYqLeW5wWFpbWlJTUlZWVFpadYNZVX2QYVxYXV5XSVZdXVtbX1lIWVhZXF1ZWFlXUlFNUFFNTU9TUVFVUmFzc3Z3d3Z4eHh6e3t8fX19f39+fX59fX1+fn9/gH9/gIB/f3+Af4CAgICAf39/gIB/gHh5fVlOS0lJSUZCREBBOlBRUVdYUFBPUVNUVFhYWVpbboGCg4WEhYaHh4eHh4iIiIiIiIiIiJaanJeIioFuhomIh4OKfmZZWVxYU1ZUV1JRV1ZjloBRZXJYWldfaFBgZlpbWFxoYkdPWmlnXFtcXV1XU05TUFBRVlZWVllabnJ0d3Z2dHd4eHt7fH19fX5/fn59fn18fn9/f3+Af39/gH+AgH9/gICBgYB/gH1yfX9/b3R8XVNQT01LSkVDP0A7UFBaWltSU1FPUlJSVVNWVFdfdXiAhYSEhYaGhoaHh4eHiIiIh4eIh4ORjomJiIaFiIiGfYB7XFBWWFRSVFJRUUxPTUtmeVpdVFlVVl1aTFRaVVNUXlpYV1dXemtYWlxcXlNQUFBJTk9XVlhaWmRxc3Z2dHR2eHl5e3t8fH19fn99fX1+fX1+f39/gIB/f3+Afn56eHd2c3V7f3+AgHRrfn5rcXleW1ZVU1JPS0ZDREFNXoNsVlJTTk9RT1FVUlNSUlRjZHaAgoKDhISEhIWFhISDhoaGhoeIhn6JiYiHhoOHh4d5bXFWSUtOTktNS0hKREZIRUM+U2NVf1JQUU1LUlRSTU9ZUU1OUVNVVU1RU1JQTkxMSENJSFJUVVpcbXJ2dnVzc3d7enp7e317fX19fn19fX59fn9/f4CAgH99fX5+f39/f4B+e3Zzd31+fmR1fWlxdF9kXV5bWVZRTElMSWFsknRQUVNOUVJRUltSU1JRUlVVYnN7fH+AgYKBgX99e3uAf4OChYaHgoaGhoGEgYaFhnVfXUtDPkNDQ0NCP0RQQkRAQz5CSEdWQEhOTUddaVBIRk9GREVGSEdIQkNIR0hKR0NCQURAT1BNUmRzdXZ1c3R1enx6e3t7fHx9fHt+fX19fn5/f3+AgIB/f3x8fX+Af39/f4CBgH12dHt/bWh8Z25xZmllZWJcWFNRUFVSc1dlW09PTkxRU1FVWVNVUVFUUk9WYGtscnZ7e3h5dHJuc3RzeXh+foOAg4OCgIKAgoGBa0xHPj46Oz5AQD8/PmtQS2FFRkhJRUI/R0xOR01RVUlCRT8+PD08PT0/PT9BQ0I/Pjw9Qj5KTUZVbnV1dXN0dnh7fHp9fHx9fX19fH59fXx+fn9/f4B/f39/enl3eHd2dnh7foB+fXt4dnx1YXhnbHBqbGpqZmBbUVJaXFleSUpQUU5LTFFSUVRWVFdRUVdWUFhbYl1hZ21tbG9raGBucmptbHF1e3p9enh6fHx4d3hkQkBAQT06QkNBQURCW1xPe05PT05LTE1PT1FMS0xXTUhHQEE8OTc3NTk5PTs7Ozg5ODk/O0FIP1x0dXV2dXZ3eXx8fH18fH19fX58fn19fX9/f39/fn9/f314dXd6e3p3eXh1d3t8eXh1eXdjcWhpcG1ubW1oZl5PUF5cWklHUFJRT01QUU5RUlRWWFNSWVROWVpbV1ldXl5gZWBdXnF2a15gZ2t3b29sam9ubmxmYllHRkZIQkFGSUVFRkRMUU9hV1JYUVBTU1JVW09PUVZQTUpDRj46OTY0ODY5Nzk6MzY2Nzk2PEI9ZnR1dnd3eXl7fX18fHt8fX1+fnt+fn19f39/fn5+fn9/e3d1eX18enh8fHx8dHd2d3Z1d2tuaWhxbm9vb2prYFVXXlpXTUxUVFNRUVVPTFJTVFdYVFRYUkxYWVpWWFhWWFldV1dYaHNrXVZhc2thYV9dZGBfXllVUE1PTkxJSEpLSUhGQ1BPU1pXVFRNUVNZU1xlVU9TVFJOS0lIQz9BOTk4ODk3ODg0NzU3ODU4OUduc3V4eHp7e31+fX18e318fn5+en1+fH1/f359fn59f358dHR1e3hycW9vbnR4cXJzeHZ1cWZkZ3JucHBxbm1kXV9fWVdPUFhWVlNUVk9PVVZYWFlTVVRMS1RVVVVVV1BUVVdUVVJdbl5STllfW1ZZO0RVV1RbZkpMUFJST01NTk5OTEpGUFBVWVNUTkpOT1VTVFxWUlVTUk5NTElISEY/Pz06Nzg3NjU5OTY3NjY1V3FxdHd5ent8fX19fnx9fXx+fX15fX18fn5+fXx8fX1+fXxydnF4eHJ1dXFxbnBwb3B1dnRuamRkanBwcXJwb2ZlZGNcXlJUWlZXVVRXVFJYWFlZWVJVT0pIT1BPT01SSk9QUFBOTk9UTE1JUE9TVFUyPFhNSUFRPWNgUVNRUE5QUVBOTk1QTlRSUFJNSUxLT1FQUVJTVFFST0xNS0xMSENCQT06OTg3NjtCNDU2NjtlcHJ2eHl7fHx9fnx9fH19fX18e3h8ent9fX58e3l9fH18e3B1b3d1cHV0b3N2cHFxcHR1dmNqZ2VXaHRycnFuaWlocFZWVFVYVVdVUldWVVpZWFdVUVNGRUJGR0dIRkpESEpIR0VITEhLSUdMTVBNRy9FX1I+M0A+am9hUlJRQEZUUVBRUFFOUU9QT0xKTExPUE5OUFFRTlFPSkxNTUtHRUVEQjs9PTw5PUc2Njc3RG5xdXd6fHt8fH18enx8fX5+fXt5dnh3eXl8fXp6dn17fHp6b3Fud3JwdnFtcHNwb3Bzc3N0ZmdgaFpXa3JzcmxtbWtuYmVQU1RSU1VPV1ZWWVlWUVFRT0A+Oz0/QEJBQ0BCRURBQEdIR0hGRkhKTUxFR0NPUkM4RU5TXWdTUVNBR1VQT1FRUE1NTkxKTEtMTk9PUU1PTk1JTUxJS0xMS0dGRkVEPEFBPjtARTs8ODlUcXJ1eXt7e318fHt5fHp6fn58e3V0dXJ2dnp6eHpyfHt8eXltcW94cnF1bm5xcm9vb3Rzc3J1dGtnZ15lam1wa25xbWltY0xPTk1RU0xUVVRXV1VMTEtIPTk4Nzs/QT88PUFAQj0+RUhHREZGSUdLSkBGQUFARkhFSk9IUVJhXFFQUk5TT09PTExPTUtNTE1PTltXS01RT0hKSENJS01MSkZGRkU/QkM+PEJGP0I/QWRxdXh7ent7fHt6end8d3l9fnt7cXN0cHJzd3R4eHN6e3l2d2xxb3ZxdHRsb3Fybm5vc3ZydHNycmtsZW5zaG1ubWxtbGprSUxISE9RSlFTUVRTT0tIQ0U9OTg3OT9CPjs+QUBAPkFESUVDSEdJR0lFQkI/PjxDQUFHSURNT2FlUU1PTldLTE1LTE1NTExLTk5TZE1KTFJJSUlFQUhLTU1OS0dJRkJBQkA/RUZFSERLb3B3enl5e3t6e3p3dHh1eHx8eXpucXJtbm9ycnZyc3h8eHZ2bXBtc3B1dGxwcHJvb29ydnVyVlZucWdseYRqbXFybm5qaG9ISkNHTE1JTVBNUE9IS0U/Qj05OTk6P0I/PEFCQkFEREdLRkRJSUdHSENDP0I/P0BBPkNFQ0tOUVRMSklNVEZJSUpMSktLSUlMTU9QUlBLR0NLR0NCSkpMTU9OSUpJR0NDQ0RJSk1MSVpzbXh5eHp7e3l8dnJwdXJ0eXl2eGpxb2tsbG50dG1zdXtzdHhyb25xb3ZzbnBvcnBvcHN0eWpOYGdzanR8eWdvc3FqcWhlcUhLQ0ZISEdKS0lKS0RHQj0+PTo6OjtBQj89QkNDQ0hGSkxKRUlJRkdHQ0M7QUBCPkBAQ0VDSU1QR0hLRkhLREhJS01ISkxISEpMS01dUklIRE1GQkVLS05NUE5LTUpLRkdHSk1OUU5MY25pd3Z3e3h7en1xbWxza3B0dHR1aHBtamlra3RwbnR0eXByeXRvcnFvd3NvcXB0cnBydXR5a05WbXVscXt2aW5vaWp0aGRvRktDRkVHREVFRkVHQkNAPjw9Ojs6OkBEQD5CQ0VFSUZKSkxGSUlHRkZDQjtCQ0M+P0NDQ0VHTE5IS05IREhFSU1OTUdJTEdFRklJTE5LSkhFTkhDR01MTk1QTU5OTUxJSEpPUlFSTlJmZ2Zyb3N4dXt6fGxoam9la3Btc3FmbWxoaWtsdG1wdXR3cW94dG90c3J2c3BxcnRzcnR1dXZ2WFZ1dWtvdHJrb3ZsaG1lX3BHSUNFRkVCQ0JFQERCPj8+Ojs7PTo9P0NBP0FDRkdKR0lJTEhHR0dGRUNAPUVFQj5BQ0NDRUdISUdNUElGRkdLTk9LRkhJRkVERElJSEtJR0hQS0RKTUxQTlBOT09OSkpJTVJVVFJPV2RhYW1ncHJvc3l6Z2VoaGNpbGdxbGZsbWdpa2xzbHB2dXRwbnZyb3Nyc3V0cXNzdXRzdXZ2dnl2dXR2bGt1dW1ydnFsbmxlck1HRUVHQ0JBQkQ9QkE+QT06Oj0/Oj4/QEI/QEJFR0pGSkdJSEZGR0VDQkFBRkZDQkJCREVER0dIRkxRTElPSkpMS0lHSEVGRURDSUhIS0pIS1JNQ09PTlFQUE9OT09MS0tQVVdWVVNYYF5daWFtaW5ocnNiZWZmZGloZm5pZm1taGtrbXJpcXZ1c3Ftdm5vcXJzd3Nyc3R1dnZ2dnd2d3Z2dHd1a3N1bnV0c3Fya2tzTUZGRUhCQkFERDxBQUBDPDg5PT46Pzw/Qj9AQERGSEVIRkZHRkVFRENFQ0RJRkNGRUJFR0VFRkdFSk1LSFFNSktISElFRklIRUNJSUpLTUtQU05EUVNRUVJPUE1OUE1MTlNXVldYVlheW11kYGhiamlna19lZWdjZ2dna2dna21rbWxwcWd0dHVyc252b3FwcnR4cXNzdXZ1gpF5dnZ0eHV1d3hub3VvcnN1cXFpcHpNSEdHSEJCQkZFPEBDQkQ8Nzo9Pjs+OkBCPj8/Q0VGREZEREdFQ0VDREVGR0pFRUlHQ0dIRkhGRUNGSkpHTUpMS0lKTEZJSEtIRUtLTE1OT1NUT0lTVVRRVFBRTU5RTk1RV1pWWllWWl5aWGFgYGBeaGVjYGRlaGdqaGhqZmhubGxubXFwaXV1eHJycHVwcHBydXZwdXN1dnV7fn14dnR3dnZ2eHBsdXBtc3Vub3NzeU5JSEdJREFDSEU8QEVDRT04Oj4+Pj09QUI9Pz5BQkZDRUJDR0RDRUVGR0dHSUZISkhDSEhHSUdGREhLSUdLSE1LSktMSExKTUtJTkxPTk9SVVZPS1VWVFFUUVJMT1FQT1RZWllcWllcX19eYGNdXGFja2JgZGdocoVoZ2lmam1ucG9uc3FqdHV4cnNzdHJucHF2cnF1cnV1c355jn11dXZ2dnZ4cmh1cWtydGxxd3F1TUlLSEpFQkVHRTxAR0REQDk8PkBAPz9CQjxAPkFBRkNFRENIREZER0VISEZIR0lLSkZKSEhLSEZGTEhISEpHTExMTExJTUtNTk1PTFBQUVVWV09LVlZVU1NSUUxPUlJRVltbXV5bXF5gX2FgYmRdZGBlZmBlaGpjc3NmamhnbHBycW9zc25zd3dxdXZ0c21vcnVvcnNwdXJ2cnSBdnV1dXd2dXd0Z3Rya3Fya3J3b3ZKS0xKTEdCRURFPEBGRERCOz8/QUFBQERBQEI/QUNIQkVERkdFSUVGRElIRklISkxISEpKSUxKRkpLSElKSkdLS01NSkpNTE5PTk9MT1BSVVhWTU5UVlVTUlFQTE5UU1JXW15eX11dYGBhYWFgYmRlYmNpYmRpamd2i2xraWdtb3NxcHFwcHJ5d3J1dXRzbW1zc21xcm90dXRzcHN2dHV1d3Z1dXVlcXNrcHFqcnZvd0pNTExNR0RDQUQ8P0VFRUM9QUFDQkFDRUFDREFBRUdDSEdIR0VKRkNHSkdHSkZJTEhJSk1KTUxHS0lITEtOUUtSUUxTTUtOTk9QUFBUT1dYWFtOU1FXXFpTVlBOVFVUVFhaX2JiX2RhX2BiX2BlYWFjaW5oYmloaG14dmxoaW1vc3JwcXJycnZ0c3Vzc3Nua3NxbXByb3R2cnJxdXZ1c3d5d3V0dWNtdGtvcGpxdHB3TE1MS0xHREFARD4+REVGQ0BDQUVEREZDQkVHQ0JJRkNISkpISUtGREtKR0hJSUlLR0pKT0tOTElMSEpNS1pmSmRcS2xSSE9OX25VbHNbcXBid2NSUGJ2dWh1Y2F2YFhucWJkdmluemZcbHRgbGpUX3d2aWpnaWZnbG1qbW9qbW5zcnBycnFyc3Jzc3J0cm5sdG9ucHFxdXVxcXN0dnZ1dXl3dXR0YGt0a3Bwa3FzcXlLTkpLSkZCP0BCPz1ERUZEQ0NCRUVFRkJGRkdDREpFRUpMTEpMTUdHTUpISkpIS0pJS0pOTE1NTExJTE1MW3NiZHBebGxVTU5mc11nZXFsbnRncGlfYVlubmJwcGJrampnb3F0ZXRub1xwdWdwTUpyeXZrYmBrZWVteG1rdmxucHNycHJxcHFycXJycnRybW1zbm5vcHJ1dHFzc3R1dXV0d3h2dHRibXVrcHBscnJxektMSUlHRURAQUI/PUJGR0JGQ0VERUVEQ0hIR0RFS0dHTE1NSk1NRkpOSElLSklMSkpKS01NTk5NTUtOTU1bcm9vbnBwbGtOUFFsV05pYnRycGFtb3ZcWWxRXG1tWnFta29teHh0c2lwXGBzbHFqVXV5eHBjXmtmYmdwcGppb3Bwc3NwcXBxcXJycXFycnRsbXJtbW5vcnV0cXRydHV1dHV1enZ1dGVudWtwb2xzcnJ5SktHSEVFRUJCQj0/QEZHQkdESUVFREJGSUhIRUdLSkdNTU5LTU5ITE5JTEtJSk1JS0lKS09QT05NTE5NTFxoZHVdbHFXbE5PUW1VWmtea2x2YWxkdFRlY05tWWxcdHBraWx4and1aHBdX3NraFdiY3d8b2NgZ2hhZGl0eWtubnFzc3BxcHFwcnFwcHBydWttcW1tbW9xc3Rxc3J0dnZzd3Z6dnV0aG91bHNvbXNydHdJTUdJREVEQ0FCPEJAQkZER0ZMSEVDQ0hLSEhGSkxMRk1LTFJSTEdNTUhOSklITkhKSklITk9NTkxKTk1KWnNwcG9xcW1sT1FSbllxa2dvb3Fxb210Xm5YYXRfbm9wb3Fyb251c3R0altddGN3eHJqbnpoYWFjZ2Jiam10dXBzdXZzcXBwcW9ydHt/fn13bGtxbmxtbnByc3F0dHN1dXR4eHl5dHVrb3VtdG9uc3N2dEhLSElCRUVFQUA+Q0NCR0NISU1JRkNGSkxJR0ZKTUxGTkpLV1JLR0tKSk5JSEpMSUtKSUhKTE1NTUlLS0tTa2JaaV5famNyclpfWWpvX2VlVWtfY1thYlFgbWhdalxuaWlkW3BmZHBdWlxrW21xY3BzbGRnY2RnYGBrbXBwb3R5cnVxb3BxbnmFiIeHhoWAdnNua21tb25xcnR0cnR1dXZ5eHhzdW5xdW52cXJ1dHdzSEhGSURFREZBQEFFRERHQkhKTEhGREdLTElFRkpPTElPSUxbUUpGSEhLTUlISkpLS0lISUdLS0tLRkhKSkxMTEtJS0xOVFtcVFBUTVBPTk9PVlFPT1FPT1FKSk9QUWRxaVRZV1tbXFVZW11YXVxcY2ZhYWZiY2VfX2ZrbWhtdHlydHJvcHB0hoeGhoaFhYaHg3pwbW1sa3FzdHRydHZ0dXl4eHV2cXJ1b3ZydHN1dXNHQ0VHRkZBRUM/Q0dERUdDSUtMSEZER0tMSERHSVBLTE9LTFdNSUVFSElKSElLSUxKSEZIR0pHR0lFRkxISUtOTElPXFdeT1xbYF5PWFlTXFxiXk1ZWk1YYVJLWWFaU2BkXWJYW2RkVlZYXFlaWFxWWVxeY19kYGFfZWhrZ210dHFxdHBxcoGGhoaFhoWFhYaGhoR9cmtpb3Jzc3N0d3l5eHl4d3h0cXhyeHNxcnVydE9CQ0RMTUFDREJESUVHR0ZLSktIRUVKSkpGRUhIUEpMTUpNU0lIRUFIRkpJS0tJTEpJRkVKSEVGR0VFSkdDSk1KS1RfWWBYYGFbYFVYWVReXlpfUllcUF5cWU5fXF5TW15jX1pdYGNgWV9iW2BeW1RYWFpfXmRiYmFjZWlla3Jwb3Bwbm93hoaFhYaCe4CFhYaGhYaFf3VxcHJyc3Z5eXp5eXh4eHdyeXZ4cnF4dnR2YVNKSk1JREJCQ0ZHRUdHSUpKSUlERktLS0VGSElOSk5MSExOR0hGPkdHTElLS0pLS0lHRUlFRERFQUZKREBKS0lPW2NZXl5hX1JUU1dfYFxdWV5RWVxNVl9XS1FZW1FbX2FhXV5jYWBiYmJjY2VaUllWVVxbXmNgX19jZWJob21tbGxsbHWFf4SDeXV8hIWFhYaGhYWGhoN9d3JydHd5eXl5f359eXV5dnZybnp3dnhYUUpGQ0dFQkVHSEZHSElGR0pHSEZIS0lMRENLS05NTExISkpISkc/R0ZOSktLTEtLS0lHSEREQERBSElBP0lKR09dYVpbZF1fVFFSV11cXFxfWktXXExSXFlJTV5QUF1fYWNjY2NiXGRjYmRjZlhRVVRTXFhbYV9eXmFhX2Rsa21qamxudn51gXp8hIWFhYWFhYaGhYaFhoaGgnpyc3V1e4WHh4eGhYSBfnhwend2eFxSTUJASUZDRktJRkZGSEdHSkZGRklMSk5FQ0tKTE5KTElLSkhJR0JISFFNS0tPTEtLSUhHRUQ/REJISEFBR0ZEVF1ZXlhfWV9bXVVYWFBdXVFLSldeWF5bXVZaYFJRX19iYmBgYmJgY2JiZGRiWE9RUVJbU1xeXV1dX19fZGhnbGpubnB7e3x+e4CCg4SFhYWFhYWEhIWDhISHh4FzcneFh4eHh4eHh4eHh4WDgHx4XFNLQkFHRkRHTVJIQ1FKRkhISEVGS0pNUEVHSUpLTkxMSUxLSUlHREhLUU9NTFBMTUtLSElDRUBEQ0hHQkFGRUJWVUVcVF5TVl9YTlRVTlpbTUpLVWBhW19YX15hXU9ZYlxgYF9iY2JdYmJXX19UUE9QUVhSXVxbXF5fYGFmZmVsZm9vd3x7gHt9f4CEhISEhIWFhYODhYKDgoWFhnpvgYaGhoeHiIeGhoaFhYSFg35JTkZERkZHRElSY1BEVl5JR0dIREZNSlBQRkpJSktOTEtLTEtKSkdFSk1RUU5PUE1OTE5IS0FEQEJDRkRDQURFQUxIQ0xMUE9PTEZNRkdJSkhHTExNT1FJTE9QUFNQTFFTUlVaWVdZWFhkVk9TVFBQT05QVVRcWVlaXl5hYWVmY2hka2xwc3N6eX97en+EhISEhISEhIKEgH57gYOBfXuFhIaGh4eHhYWFhISEgoGAfUtJRUVHRkdES01eTEdHWE1ISEpIR05MUVFJTEtLS05OVU5PS0tMR0dLUFNTTlBPTk9OT0hLRWBEQ19MRGZjRE1bSF5cc21PTVZtWUxDUGBVbFdnSl1YVl5ETFFVTE1UVlFSVFhXVFhVVFxUUGZaaGhkWVRrVFdWVVtcXGBgYWJiYmBmaGZubGhyenx9foGEhISDg4ODgX18enJ7gXp7f4KAg4SEhYWBhIWBg4N/fnp7TElFRkZIRUVLT1RJS0dhVEhKT0pJT01SUUtNS0xPUlVST09KTE5HSE1RW1lPUFBOT1BPSUpQf1FJfFlZcnNYUG1IcW5vYVZQcXFzUEJrc21xc3BTb19bblhdVlxYVWtoVV1WY1pgWVpfVlVXf2p0dXVfYXZfWGJcXGZbX2FhYWJeYGJnbXBsYHB3dHiBgYKDhIJ/fX6Adnh6bHZ+dHh+gHx+gIGChHyAg3p/gX9+d3dOSUVITU1CRExMR0lMRlJWTEtPSUtSWFdRTk9PTFFUTk9RUEtMT0dNUFJaWlRRUU9QUFBKSFp4XVR4ZGhZUlRRdmd0bHBibmZrUXJPTXdtanJwc3JxcnBvcIBdZXp1eHFxenF+c31rdX1iUmh8ZXNzb3NzfH1vfnlvf3JgYGBiYlphYGdrbmtibGZnbXd+gYCDfnt4d4B0dnppcn5udHx+d3h7foCDeHyBdXx/fHxzc05LRmBdR0FFTU1IS0tISlBPTU1KTlZeWVVMUVNOWVlMU1NSTkxQSVFSVFlXV1BUUFBQUUtHZnhsY3hxbVpKTFV5cHVtdWJudlBkZUlmdnFtd2+AamZ4eGlXclFoem1panp6fWx4en9wZ29YdnZqdnVwgGFzaH1pbHh8b19fX2NiW15jZGdpamRnYmNkbGxwcHN0c3NzeXFyeGJsdWdyeXtzc3V5foFzdnpufH15eHJuTkpTdE5EQkVQUElLS0pMUE9PT01QWmBaWEtUV1BhXlJWUVlTTVBJU1RVWFdXUFVQT05SSktyb3V1cXVxZGhhVm5McXBeRmh5V3ZUTGh4fXhgeXtzbmFebW9kUmdydW5teXB3bHZzdHFsbVxzfnprbXl8bHVtfGtwdnV4Xl9fYl5dX2VkaWdoZWVeYmJpaWlqa25va3FubWpwYWNmZG93eG9tcHN5fm5xcGp7enRyb21LS1tWSEdFR1JQSkxNS0xRUVBQUFFXXFlVTlZZVWZYUlJZXlRNTklUVFZXWVdPU05OTlFIUm1IaXdLYGR2dlVXbE9ubHtzYWpnf3ZVS1draH1sbWx4YFtwenteYHpzY3JveHFoZHxpcntdVEtsX3Z1a2l1e3ttfnhrfHBdXl5iW15iZGVnZWVlYlpjY2lra3JzcndnbWloZGdgYWxhZ3Nya2htbXJ8a21oa3t0bW1rbU9HSktISkhIUlFMTlBNTFRTUk9TU1dSVlRQV1pWVlRUVGFgUU9OS1RTU1FVVk5OTE1PUEpIUU5QVUxLS1NUU1JUUFZVUVFOUVFYWFFPUFVUWFhYW1tVU1NXW1dYV1pPU1VXV1hRXVhWXVVTT1hSV1dXWFpgW2dyXltcW11dX2NaX2NjZWZkY2NiWWNjZmZmbW5tdWZmZ2NgZl9dZ2BkbGhmZ2tocHpoZ2drdWpoZ2lsUUlLS0xNS0pUUk1RUVBMVlZUUFRVWFVZVVJaXVZVVFdVWVhQT0xOV1RRTlVTTlBNTFFQS0pRUktRTUtLT1JUUlFRU1NJSE1OT1FSUVFRVFZSWFdcV1NTUVJVVVZTWlFOU1JYVVRZVlRZVVNSVVNUVVhZV15aX2FdXFtaXFxgY1xdYmNkZ2VkZGFZYGFjYWJpaGluY2FkXl9jXVpkXGJtYV5mZmdtc2RpaGtrZWRkZmhQSktMT09MTVRRT1RRUU1YV1VUVVdXV1pWVFxgVldWWVVYVFFQS09YU1BOVVBOUU5LU1BNT1VUTlFOTU5RU1BUUVNUVU5LTU9RVFRSUlFWV1VZWltZU1VSVFdXV1lbVE9UVVhVVFlVV1lUUlJXVVVXXFlbYF5WWV9dXl1cXWFhXltiYmNoZmVkYlhgYGJdYGhlZmRhXl9dXV5aWl9aX2dgXl1dY2hrYWdmaGZkYGJjYVBLTUxQUUxPVFBQU1FPUVpZWFdYWlpYWFZdamRWWFlaV1ZUVE9LT1ZUUE9UUFBRTk1RUVBSWFRSUU9NT1NVTldSVFVVT05OUVNVVVRUUlRYVlpdXFpWVlFSV1hWW1tXUVRWVlVWWVRXV1RSUlhWVVpfWl5gX1ZeXV5gXFxgYF9fWmJiZGhoZWRiWWJgYl5fZmRkYGJdXFxcXFlaW1hbYVteXVxfYl9fYmRkYmRfX2BcUE1OTlJRTVJTUFNUUU9VXFpaV1tbXFlaW2RxbWhkX1tZVlZYUk1NVlNNTlJPUVJPTFBTUlVaVVRQUExQV1ZRV1NTU1hNT1BSVFhVVVVTVVlYW15dW1tWUk9VV1ZbXFdRVFdVV1hWVFhaVFNRWVdWXF5bX19gVWFcYGFdYGJfXGBdY2FjZ2lkZmBaY2BhX19lZV9gY1taXFtcWVpZWVdcWVxbYF5fW15eYWBfYlxZYFpRTk9OVlFQVVNQVVRTUFdcXFxYXlxfV1xeanF3eYBjXFtWVlhSTk9XU05RUVBSVFJMUVRTWVpXVU9STlNYVlRTVFJSWk9RU1NWW1ZWV1RWWlhdXlxcXlZTTlRWVlxcVlJUVlZYWVNUWVxUUlJcWFpdXl1hYWBXYltjYl5hY19cYmFiX2RnaWRmXltkYGFgYWNlX2JfWVpeW1xbWVhZV1daWlphXF1bXVxcWl1gV1tbWlBPT09ZUFVVU1JXUlRQW11eXVtgXGBVXF1panJ9c2xnXFVZV1FPUltTUlFUUlRVVEtSVlVbWVpTT1NSVlZVU09WUlNaUlRVVFhcV1hYU1hcWF5dWVteVVVOVldXXltYUVVVWFhYVVdZW1RTVl1ZXV1hXmNjXllgW2ViX2RkXl5jY2FdZWZpZGZeXmRhYGFiY2RfYl5YWl9bXFtYWFhYV1taXGBdW1tcW1hZW15WXlldUE9PUlpQWlVVV1ZTVFReXmBeXmJcYFVdXmJreXRsfWxaVVpVUVFTXFRVVFVUVllXTFJaVl1bXFJPVVNYVlZTUFhSU1dTV1ZWW11YW1lVWl5YX15ZXFpSV1JZWFlfWllTVFZaWVpWWFlcVlVaXVxeYGFfZWRdXl1dZWFiZmReX2RjYFxnZGhlZGJfZGFfYWBiYl9gXldYXlpcXFpZWlhWXVpdXltaW1xbV1lcXVZYV11TT1BXWVFdVVZZV1dVWF9gYWFgY11gVV1eYmVldYF6aFhZWlRWU1ZcV1dXVlZXXVhQVVxZXl1dVFNYUlhWU1JUWFJTVlNZWFhdXlhdW1VeX1hfX1hcVlJZVFlaWmBYW1RWWFtaWlhZWlpYVl1eX15jYmFlZV1iXGBmYmRmZF9gZGJiW2ZjaGVjZmFmX19hYWFhYF9eVlVdWltcW1lcWVldW1tbWFhZW1laWl1fXVRZXVVOVFpWU1xUVldZV1ZcYGFiY2FkX19WW2BkYV96dW9oWVxaVlhVV1taWVxZWFlgV1BVXltgYVxUVVhQVVZVU1ZWUlNVV1taXF9eWl9cVl9fWl1eWV5WU1lXWVpdYlldVVZbXFtcW1tZW1lZXl9gYGRiY2VlYmRaYmZjZ2ZlXmFjYGNeY2NpZGRnX2deYmJjYWFgXl9YVFpaWltbWFtYWFxbWltXV1pYV1xbXGBdVl1dU1BWWlZWWlVZVVhXWF1fYmFkYWRhXllZYWRiYGxmaF5cXVtXWFhZXFxcX1tZW2JWVFdeXWFjXFNWWVBWVlZWVlZUVlRYXFxfYGBdYF1XYF5bXlxbXlhWWFhbW19fW15XWF1cXV5eXFpcWFtfYV5gZGNkZmZmYlljZWVoZ2ReY2FgZWNdZmlkZWlfZl5jYmNhYWBfX1tYWVtZWlpYWVhXW1taW1dYWlRZXVxaYFxVXmJNUldZVldaWVtcWVdZXmBiYWRhZGFdXllhY2JfYWBhX1xcXVhXW1tdXV9fXFpdY1hZWF1gY2RfUlhZUFhXWFhYV1ZXVl1dXmBhYV9iXllhXV1eWV1eWVhWV1tcYF9dX1lZXl1eXmFdW1pZXF9hX2JkZGVmZ2diWmRmZ2lnY19jXmFmZVpoaWNmaWNlXmJiY2FgYF9dXVpXW1lZWFhaWVdaW1pZV1hWVVtdXV1gYGJieEtXV1xYV11cXF1aV1xdX2BiZGJiYV1gWGJjYmBjYWJeXFxcWFdbXV9dYF9dW2BkXFxYWmNlY2FSXFlPWFdZW1pZWFpZYF1gYmJgYWNfXGJdX11bX15aWVVYXV1fYF9fW1peXmBiY1xbV1tdYGJiY2VkZ2ZlZ2RcZWZoaWZjYWJcY2dgXGlpYmhpZmVgYmFjYV9gX11dXFlcWVhXWFlZV1xbWldXWE9YWl1hY2Zmcmt/SllXXVpaX11cXlxYXVxeX2FjYmFhXWJbYmRhX2NjYl1cW1pXWGpxYFxgX11cYWNfXllZY2VkYVRfWlFZV1xdXFtaW1tjYGNiY2BiZGFgY15gXF5eX1pYVltfXVxhYV9dW2BhYmViX11TXF9gY2RkZmVnZmVmZV5lZmhoZ2RkYFtmZ15haGhiaGhmY2BiYGNiX19fXV1bWltZWFhYVlpWXFpaVlZVTFhXXGdpa2h1eIF2dnZ2dnZ2dnZ2dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6e3p6ent7e3t7e3t7e3t7e3t7e3x7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHt7e3t8fHx8fHx8fHx8e3t7fHx8fHx7e3t7e3t7fYmIhoqHhYKBgoOCg4OCgoKCgoKCgoKCgoGAgYCBgICAgYCBgYGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t6e3t7e3t7fHx8fHx8fHx8fHx7e3t7e3t7e3t7e3x7e3t7e3t7fHx8fHt7e3t7e3t8iYmHiYaFgoGCgoGCgoKCgYKCgoKCgoKBgYGAgICAgICAgIGBgYB9fHx8e3x8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eHh5eXl5eXl5eXl5eXt7e3t7e3t7e3t7enp6e3t7e3t7ent7e3t7e3t8fHx8fHx8fHx8fHx7e3t7e3t7fHx8e3t7e3t7e3t7fHx8fHx7fHt7e3uHiYiJhYSDgYKCgoODgoKCgoKCgoKCgYGBgICAgICAgICAgYKBgH58fHx8fHx8fHx8fHx8fHx2dnV2dnZ2dXZ2d3d3d3d3d3d3d3d3d3h4eHh4eHh4eHh4eHh4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t7enp6e3p6enp7ent7e3t7fHx8fHx8fHx8fHx8fHx8fHx8e3x8fHx8e3t7e3t7e3x8fHx8fHt7e3t7e4aJiYiFhYOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgIGBgYCAfnx8fHx8fHx8fHx9fX18fHaIi4uLi4uLgX19fX19fYSMi4uLi454KSkqKiopKz0/Pj4+Pj5tgH5+f397pdfT09PT1r2GiYmJiYiNsbW0tLSzs7u+vr6+vsGhioyMjIyNiX5/f39/f359fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx8fHx8fHt7e3t7hIuHh4aHgoGDg4GCgoKCgoKCgoKCgoGBgYCAgICAgICAgYCBgIB+fHx8fHx8fHx9fXx8fH19doyQj4+Pj5CDfn9/f39+hpCPj4+Pk3kZGhoaGhocMTMzMzMzMmqCf4CAgHut6eTk5OToyomMjIyMi5G7wL/AwL+/yczMzMzMz6qNkJCQkJKLf39/f39/f319fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e3uCjYeIh4eDgoSDgYKCgoKCgoOCgoKCgYGBgICAgICAgICAgICAgH58fHx8fHx8fXx8fH19fX12eHh4eHh4eHd3d3d3d3d4eXl5enp6d29wcHBwcHBycnJycnJyd3p5eXp6en6Dg4ODg4SBfHx8fHx8fYCBgYGBgICBgoODg4ODf3x8fH19fX18fX19fX19fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e4CMhomHh4SDhIKCgoKCgYKCg4KCgoGBgYGBgYCAf4CAgICAgICAfnx8fHx8fHx8fX19fX19fXZ2dnV1dXl2dnZ6e3h7eHd2eHt3enl6fnx5eXh4eHh5eXl5enp5eXl5enp6eXh4eXl5eXl7e3t7e3t7enp6enp5enl5eXl6enp7fHt7fHx7fHx8fHx9fX19fX19fX18fH19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8f4uHi4qIhIODgoKCg4KBgoKDgoKCgYGBgYGAgIGAf4CAgH+AgYF+fX18fHx8fHx9fX19fX19d3d3dnZ3fXh3d316eH14d3d5fHp8e3l8e3h3d3d3eHh4eHh5eXl5eXp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fHx8fHx8fHx7e3x8fHx8fHx8fHx+iomMjImFg4SEgoKDgoGCgoKCgoKBgYGBgYCAgICAgICAf4CAgH19fXx8fH19fX19fX19fX13d3d3d3p9eHt4fHx3e3h3d3d8e3l7eHx6eHh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fX19fXx9fX19fX19fX19fX19fHx8fHx8fHt7fHx8fHx8fHx8fH2Kio2NioWDg4OCgoKCgYGCgoKBgoGBgYKBgIGBgICAgIB/gIGAfXx9fX18fX19fX19fX19fXd3d3d3fX55d3d4e3p8eXd3d3p7eXt3fHl4eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt8fHx8fHx8fHx8fHx8fH19fX18fH18fH18fHx8fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8foqJjo2JhISEg4KDgoKBgYKBgoKCgYGBgoGAgYKAgICAgH+BgIB8fH19fX18fX19fX19fn5+d3d3d3d5fHl7eHx9eXt5enp6fXt5fHh8eHh4eHh4eHh4eXl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt7fHx7fHx8fHx8fHx8fXx8fX19fX19fXx8fHx8fHx8fXx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx/iIeNioeFhoaDg4ODgoGBgoGCgoGBgYGCgYCAgoF/gICAf4CAgHx8fX19fX19fX19fX5+fn53d3d3d3Z4eHl3eXp4enh5eXl7eHl5eXl4eHh5eXh4eHh5eXl5enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX18fH18fH19fX19fH19fX19fHx8fHx8fHx8fHx8fX+HiIyIhoeHhIKDhISCgYKBgYKCgoGBgYKBgIGBgYGAgIB/gIGAfHx9fX19fX19fX1+fn5+fnd3d3d3d3d3d3d3eHh4eHh4eHh4eHl5eXl5eXl5eXl5eXl6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fHx8fX19fHx8gIeIi4eHiYaDg4SDg4KBgYGCgoGBgYKCgYGBgIGBgYCAgICBgX97fH19fX19fX19fn5+fn5+d3d3d3d3d3d4eHd4dnl5eHh4eHh5eXl5eXl5eXl5eXl5enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fH19fXx9fXyBhoqKiYmIhIOFhISCgoGBgYGCgYGCgoGBgYCAgYGAgIGAgIGBf3x8fX19fX1+fn5+fn5+f394eHd4eHh4eHZxZGpeam15eXl4eHl5eXl5eXl5enp6enp6enp6enp7e3t8e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIGFiYqJioeEhYWEg4KCgYGBgoKBgYKBgYGBgYCBgYCAgYCBgIF+fH1+fn5+fn5+fn5+fn9/f3h4eHh4eHh5bWRiZV9fXm95eXl5eXl5eXl5eXp6enp6enp6enp6e3t7e3t7fHx8fHx8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goWKiomJhISGhYSDg4KBgYKCgoGBgoGBgYKBgIGBgICAgICBgH58fX5+fn5+fn5+fn9/f39/eHh4eHh4eW5kZWdlZGJeZnh5eXl5enp6enp6enp6enp6enp6e3t7e3t7e3x8fHx8fHt8fHt7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChouJiIqEhYaEg4OEgoGBgYGCgYKCgYGBgYCAgYGBgIB/gIGBf3x8fn5+fn5+fn9/f39/f394eHh4eHl3Z2VkZWZkZWFfaXl6enp6enp6enp6enp6ent7e3t7e3t7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHt8fHx8fHx8fHx9fX19fX19fX19fX19fXx9fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4eJh4SEhoSDg4WBgYGBgYKCgYGBgYKBgICAgYGAgYCAgYF+fHx/f35/f39/f39/f39/gHl5eXl5eWtlYWJlZWFlZV5ieHdze3p6enp6enp6enp6e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fH18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19g4aLhoiFhYaEgoOEhIKBgYGBgoKBgYKBgYGAgYGBgYGAgIGBgn98fH9/f39/f39/f3+AgICAeXl5eXl0Y2NlZGNmY2doZGZsZF5ze3p6enp6enp6enp6ent7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn6DhouGhoaGhYODg4SDgYGBgYGCgoGBgYKBgYCAgYGBgYCAgYGBfnx8f39/f39/gICAgICAgIB5eXl6d2RhY2diYmRdW2VfYV1eYGFoeHp6enp6enp6enp6e3t7e3t7fHx8e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+foSFi4eGhoaGhIODg4KBgYGBgoKCgYKBgoGAgIGBgYGAgYGBgYF+fX1/gH+AgICAgICAgICAgHl5eW9vYmJiZF5jZ19dYWFgXF9kYlttfHp6enp6enp6enp7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7fHx7e3x7fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5/hIiLhoSHhoaEhIODgoGBgYGCgYGBgYKCgYCAgYGBgYGBgYGBgX5+fYCAgICAgICAgICAgICBeXpwXWJlZGJkXmZnZ2BZYmJhY2VfXF1ze3t6enp7e3t7e3t8fHx8fHx8fHt7e3t7e3t7e3t7e3t7fHx8fHx8e3x8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fn19fn5+fn5+fn5+fn5+foCFjIqEhYaGhYODg4SCgYGBgYKBgYGBgoKCgYCBgYGCgICAgIGBf35+gICAgICAgICAgIGBgYF5emxiZGdjYmdmYWBgZGFiZWRjZGNeXGJ1fHt7e3t7e3t7e3x8fHx7e3x8fHx7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/gYeMiYWGhoeFg4SDg4GBgYGBgYKBgoKCg4KBgIGBgYKBgYGCgoF/f36AgICAgICAgIGBgYGBgXp7dGdnZmZkZGZmYF5fYWNlaGRlXmJkYHR8e3t7e3t7fHx8fHx8fHx8fHt7fHt8fHt7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f3+CiYqIhoaIhoWDhIOCgYGBgYGBgoGBgoKCgoGAgYGBgoKBgYKCgX9/f4GBgYGAgYGBgYGBgYGBenptaGNjZ2ZnZWdmZmdiZWRlYmdbYmVgdnx8e3t8fHx8fHx8fHx8e3t8fHx8e3x8fHt7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f39/f4SJioiGiYeFhYSEg4KBgYGBgYGCgYKCgYGBgYGBgYKBgoGBgICBgH9/gYGBgYGBgYGBgYGBgYF7emlpZGNqZmFgZmVjY2NnaWRjYmBiZGJ0fXx8fHx8fHt8fHx8fHx8e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f39+fn9/f39/f39/f3+AhIqMiIeJhoSFhYOCgYGBgYGBgYKBgoGBgYGBgYGBgoKBgYGBgYGAgH+BgYGBgYGBgYGBgYGBgXZzZWRnY2RmZWJlZmdkZmhmZWNgYGNkYHF9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fXx8fX18fHx9fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/fn5+f35+f39/f39/f3+AgICFioyJiIqJhoaDgoKCgYGBgYGBgoGBgoGBgYGBgIGBgYGBgYGCgX+Af35/foCCgoKCgoKCgoKCc3NnZWRkZWlqaGZnZ2NhZmZlZmdmZWVjdX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fH19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gICAgICAgIWLioqJioeHhoSCgoGBgYGBgYKCgYKBgYGBgIGBgoKBgYGBgYGAf4B+dHRzdX1/goCAfn5/gYB0cmdkZWNmaWppZWNlY2BmZGRnZ2JiZWFwfXx8fHx8fHx8fHx8fHx8fHx9fX18fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f39/f39/f4CAgICAgIB/houLiouLh4eHhIOCgYGBgYGBgYKBgoKBgYGBgYKCgYCBgYGBgoCAgH5zc3NzdHV4dXV0dHV2dXVwZmNmZWhoaWdoZ2VmZWJfZGVmY2BiZ3d8fHx8fX19fX18fHx8fH19fX19fX19fXx9fXx8fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gIB/f3+AgICAgICAgICHjIyIi4qHh4eEhIKBgYGBgYGBgoGCgoGBgICBgoGBgYKBgoKCgYCAfnNzc3Nzc3NzdHR0dHNzdW9jY2FnZWhoZ2pmZGVnZmhmY2JlYl5ieX18e3t8fX19fX18fHx9fX19fX19e3x9fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn9/fn5+fn5+fn5/f39/f4CAgH9/gICBgICAgICAgYCAf4CAgYGAgIeLi4iNiYiJhoSFgYGBgYGBgYKCgYKCgYGBgIGCgoGBgYKBgoKBgIB+dHNzc3Nzc3Nzc3Nzc3N1cmdlZWRlamhoZ2ZpaGdjZWViZGNoZGd7eHVzc3R2dnl4dnR0dHZ3d3d2dHR0dXV4d3h4d3d6e3x9fXx9fn5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f35/f39/gH9+fHt7fX58eXl2dnZ5fHx6end2d3l7fXt4hIyMioyHh4iEhYSBgYGBgYGBgoGBgoGBgYGAgYKCgYGBgoGBgoGAgH51c3Nzc3Nzc3Nzc3Nzc3VzaGVnaGVrbGhqZ2lqZ2dnZmRkYmVkbnV0dHNzdHNzc3Nzc3Nzc3Nzc3NzdHNzc3Nzc3Nzc3N0dHV1c3V3eHl7fn59fn98f39/f39/f39/f314fH5+fXx4dXZ3eXd4dnRzc3N0dXRzc3Nzc3NzdHNzc3R0c3R0dHODjI2KiYeIhoOGg4GBgYGBgYGBgYGCgYGAgYGDgoKBgYCBgYGBgICAf3VzdHRzc3Nzc3Nyc3NzdnZpY2hqaGpsZWZpbGhgZmVkY2BkZGZ0dXV1dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHRzdHRzc3Nzc3R2dnV1d3V4fH9+fX9+fHp4dXN0dXV1dHNzc3Nzc3N0dHR0dHR0dHR1dXR0dHV1dHR1dXR1dXV1dIaMjYuIhoeEhIWCgYGBgYGBgYGCgoGAgYCBgYKCgoGBgIGBgYGAgIB/dnNzc3Nzc3Nzc3Nzc3N2dnNnZ2pmaGdmaGhmZGlnY2NnZWVmcHZ1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dHR1dHR0dHR0dHRzdHR0dnV1d3Z0c3R0dHR0dHR0dXV1dXV0dXV1dXV1dXV0dHNzc3N0dHNzdHR0dHR1dXR1iY6MjIqHh4SEhYKBgYGBgYGBgYKCgoGBgICAgoKCgoGBgYGBgYCAgH93c3Nzc3NycnJyc3NzcnZ2dW5kXWNnZWlraGVoZ2dqamlnZXB2dXV1dXV0dHRzdHR0dHR0dHV1dXV1dXV0dHV1dHR1dXV1dXV1dXV1dXR0dHV1dXV1dXV0dHV0dHV1dXV1dXV1dXV1dXV1dXV1dXV0dHNzc3Nzc3N0dHNzc3Nzc3R0dHR0dHWKjoyMiYaGhIeFgoGBgYGBgYGBgoKBgYGAgYGCgYKBgYGBgYKBgYCAf3hzc3Nzc3JycnJyc3NzdnZ3d2liaGhnamtpaGZkZGVmaWhwdXR0dHRzc3JxcnJ0dXV0dHR0dHR0c3NycnFxcXNzdHR0dHR0dHR0dHV0cnJyc3R0dHR0dXV1dXV1dXR0dXR0dHR0dHR0dHR0dHR0c3Nzc3Nzc3Nzc3Nzc3N0dHN0dHR0dHR0dYuOjImGhYWFh4SCgYGBgYGBgYGBgoKCgYGAgIKCgoGBgYGBgYGBgIB/eXNzc3NycXJycnJzc3N3d3d3bGpoZGhpa3Z6a2VmZWhnbXJzdHN0c3JwcHBxcnN0dXR0c3NycnNycXBvb29vcHFzc3NycnJyc3R0dHNxcHFyc3R0dHR0dHRzc3Rzc3NzdHR0dHRzdHR0dHR0dHRzdHR0c3NycnFxcnJzc3Nyc3NzdHR0dHN2jZCMh4eFhYSEgoGCgoGBgYGBgYGCgoKBgYGAgYGCgoGBgoKBgYGAf395c3NycnFxcnJycnNzc3d3d3dzc2pnaWloeX99cW51bG5wcXJycnFxcG9wcXFxc3Rzc3NycXFwcG5ubm1tbW5ubnBxcnJycnJycnJzcXBvb3BxcnJzc3JxcnJycnJycnJycnJzc3Jzc3Nzc3Nzc3Nzc3Jxb29ubm9vcXJzc3Jyc3NycnNzcnaPj4uHhoWFhYOCgoKBgYGBgYGBgYGBgoGBgYGCgoKBgoGCgYGCgX9/f3hxcHBwcXFycnJyc3Nzd3d2dnd2cnF0c252f352c3hwcHBycnJycXFwcHFxcXFyc3Nzc3FwcXBvb25ubm5ub25vcHBxcXFxcXBwcXJwb25vcHFxcXFxcHBxcXFxcXJycnJycnJycnFxcnFxcnJycnFwb29ubm1ubW5vcXJycnJycnJyc3JxeI+OjYaDg4aEgoOCgoGCgYGBgYKBgYGCgYGBgYKCgoKCgoKBgYKBf4B/d29wb3BxcnJyc3Nzc3J2dnZ2dnZ3dnZ1c3l/fnd3d29wcXFxcXFxcHBwcXJxcnJzc3JycXBwb29wb29vb29vb29wb3Bvb29vcHBxb29vcHBwcHBvcG9wcHFycXFxcnJycnFxcXFxcXFxcHBwcHBxb29ubm5tbW5tbm9wcXFxcXFxcXFxcXB7j42NhoODhYOCgoKCgYKBgYGBgoGCgYGCgoGBg4KBg4KBgYGAgYF/f392bm9wcHBxcXFxcXBwcHZ2dnZ2dXR0c3NxfYB9fX9zb3BxcXFwcHBwcXFwcHBxcnJxcXFwb3Bvb3Bwb29wcG9vb29vb29vb3BxcXBub3Bwb29wb29wcnJycnFxcXBxcnFwcXFxcHBwcHBwcHBwb29ubm1ubm5ubm9ub3BwcHFxcXFxcXFxcIKRjoqEhIOFhIOCgoGBgoKBgYKBgYGBgYGCgoKCgoKCgYGBgYCBgX9/gHVvb29wcXFxcXBwcHBwdnZ2dXRzcnJycnGAgoCBeXBwcHBvcHBwcHFxcXFwcXFxcXFxcG9vcHBwcHBwb3BxcHBvb29wb29vcXFwcG9wcG9vb25vcHFxcHBwb3Bvb3BwcHBwcHBwcHBvb29vb29vbm5tbW1ubm5ub25vb3BvcHBwcHBwcHBwiZCMiISDhIaDg4KCgYGCgoKCgYGBgYCAgYGBgoKBgYGBgYGBgIGBgH+AdG5vb3BxcXFwcG9vcG92dnVzcnFxcXFxcICDg39ycHBwcHBwcHBwcHFxcHBxcXFxcXBwcHBwcHBwcHFwcHBwcHBwcHBvcHBxcXBwcHFxb29vbm9wcHBvb29vcHBvb3BwcHBwcHBwcHBvb29vbm5ubm5ubW5ubm1ubm9wcG9vb29vb3BzcXWPj4yJg4KFh4ODgoKBgoGCgoKBgYKBgYGBgYGBgYGBgYCAgYGAgYGAf4B0b29vbm9vb29vb29vb3Z1dHNxcXFxcXJygIKCgXRxcXFxcXFxcXFxcXFxcXFxcXBxcXFxcHFwcXBxcXFwcHBwcHFxcXBxcHBwcXBwcHBwcHBwcHBwcHBwcHFxcXBxcHBwcHFwcHFxcHFxcXFxcXJxcnFwcnRycnR0dHR1dnRzdHR0dXd3gpCPi4iDgYaHhISCg4GBgYKCgoGBgoGBgYKBgYGBgYGAgICBgYCBgYB/gHVvb29vb29vb25vb29vdXRzcnJycnJycnKDg4OCdnFycnFxcXJxcnJxcXJycnFxcXFxcnFxcXJycXFycXFxcXFxcXFxcXFwcXFxcXFxcnNzcnJyc3V1dHR0dHR0dHV2d3d3d3d3eHh4eHd3eHh4d3Z3dnV2dnZ2d3h6e3x7e3t6enp6enyGkI2LiIODiIeHhYODgoGCgYKBgYGBgYKCgoGBgYGAgYCAgYGAgIGBgH+Ad3FxcXFxcG5ucG9wcG92dHV1c3Nzc3NzdYiDgoN5cnNzcnJyc3Jyc3NycnJycnN0cnJzcnNzc3Nzc3Nyc3N0dHV1dXV1dHV3eHd3d3d4eHh3eHh4eXl5eXl4eHl5eXp6e3t7e3t6enp5eXh3d3d1dnV2dnd5enp7fn5+fX1+fn5/gH5+gIyQi4qHg4WIi4iEg4SDgYGCgYGBgoGBgoKCgoKAgYGBgYCBgYGAgIGAf4B8enp5eXx5eHh2dXZ2dHl2d3h3d3Z3dnZ6f3x+fnx2dnd3dnV4enh4eHh3d3d2eHx5eXx6eXl8e3l5eXh4eXl6enl5eXh4enp5eXh4eHh3dnd3eHh3eHh5eXp7e3p8fH1+fX9/f359e3t7e3p5enl5e3t/foB/fn5/fn19fX5+f35+fn6AjpCNioeEhoqLiIaGhIOBgoKBgYGCgYGCgoKCgoCBgoKBgYGCgYCBgIF/f4B/fn19fX9/f318e3t7eXh4eHh5eXl4eXh5eXl4enp6enp6e3t7fH1+fHt7ent8e318e3t7e3t7enl4eXh4ent6enp5eXp8fHt6enx8fHp6ent9fHx+fn+AgoGAgYKAgH9/gYGBgIB/f35+fn5/fX1+f4CAf35+f39+fn9/f39/gH+Af4OQjoyHhoWIi4yIh4aFg4GCgYGBgYKBgoKCgoKBgYKDgoGBgYGBgIGBgIB/goOCgoGBgX99f39/f4F6enh4d3h4eHh5eHh5enp5e358enx+fXt8fX19fHx8fnx9fn5+fn59fX9/f3x8fYGDgYCAf318fXx9fXt9fXx8fH19fX1+gYGChISDgoB/gYGBgH9/f4B/f39/f39+fn9/f39/f35+f3+Af39/gICAf4CAgICAhJCPi4eGhoiLi4mKhoaDgoKCgYGBgoGCgYKBgYGBgoOCgYCAgYGAgIGBgH+ChIKCgICAgH9+fn+AgH9/fn18fX19fYB/fX+Af35/gH9/fn+AgICBgICAf3+BgICAf4CBgn9/f4CAf35+f39+f39/fn5+f39/gYB/f4CBgYCAgYOEgoGCgoGCgH+AgYCBgYGAgH+BgICAf39/gICAgYGBgIGBgYCAgICBgoGBgYCAgYGFjo6MiYaHiYyLi4qGhoOCgoKBgYGCgoOCgoKBgIGBgYKCgICBgYCAgYGAf4KFg4KBgYCAf39+fn+AfX5+fn19fX5/fn9/f35+fn+AgYCAgICAfn9/fn+AgH+AgH9/f35/f39+fn59fn9+fn9/f35/gIGBgoKDgoKCg4KBgYKDg4OCgYGBgYKBgoKCgYKBgoGBgYGBgoKCgYGCgYKCgoGBgoKBgYKCgoKCgYGBgoKCgoaPkY+KiImKjY6MiYaFgoKCgoKBgYKCg4KCgoGBgYGBgYF/gIGBgYCBgIF/gYWEg4KCgoGCgYCAgIB8fHx7fH18fH9+fn9+fn5+f35+f39/f39/f35+foB+fn5+fX9/fn9+f39+fn5/gIB/gIB/f39/f3+BgYGCgoCAgYKDg4SDg4ODgoKCgoKCgoKCgoKCgoGCgoKDg4OCg4ODgoKCgYKCgoODg4ODgoKCgoODg4KCh5KSkIuKi4uPj42Lh4SCgoKCgYGBgoKDgoKBgYGBgIGBgICAgYGBgIGAgYCAg4SDg4OEg4ODgoKCgXx9fHx9gn1+f4GCiIGCgoSCgYGDg4GBgYKDgYKBgYCAf39/gICAf3+AgX9/f39/gYCAgICAgH9/f3+AgICAgH9/gYODhYSEg4SDgoKCg4OCgoOCgoODg4ODg4SDg4KEhYWDg4SEgoKDhIOCg4ODg4OCgoODgoCKlJOPioqMjpCPjYuGg4KCgoKBgYGBgoOCgYGBgIGBgoGBgICBgYGAgYCAgH+BgoODg4SEhIOCgoKCfXx8fn6AgYOAg4OChIaFhoaFhIWFg4ODg4SBgYKEhIKDgoeDgoKAgoGBgoKCg4KCg4KDgoODgoGAgIKCgYOCgYKCg4OEhYWEg4OChISEhIOEhISDg4OEg4ODg4OEg4SDhIWEhISDg4ODgoKCgoKCgoKBgYKCgo+UlI+Njo6RkY6KiISCgoKCgYGBgYGCg4GBgIGBgYGBgYCBgIGBgYCBgICAgIKChIKChIOCg4ODgoJ9fX2AgH+AgoGDg4ODhIaEhIOEhYWDg4GBg4OBgIGDgYKEhYWFhoaHhoWGhoeHh4aGhoeHhoWEgoGCg4SDg4ODg4ODhISFhYWDhYSFhISEg4KBg4OCg4SEg4KCg4SCg4ODg4OCgoKCgoKCg4OEhIOFhYWFhoaIk5OTkI+Pj5KRjIqIgoKCgoKBgYGBgYKDgoKBgIGBgYGBgICAgYGBgICAgICAhISEgoKCgoGBgoKBgX+AgYOCgICAf4CCgoGDg4KCgYODg4SDg4KDhYSCgYGBgoSFh4eHh4aGh4eHiIiHh4eIiIiFhIOBgIGBgoKCg4GCg4SEhYSDg4OEg4OEhIOBgYGCg4OEhISDg4ODg4OEhIODgoSDg4ODhIWFhoeHh4eIiIiJiY6TkpKOj46Qko+LiYeCgoKCgoKBgYGBgoKCgoGBgIGBgYGAgICAgYGAgIGAgICDg4KCgYKCgYGAf4CBhYWFhoOCgYB+fn+BgoSCgYKDhIOCg4ODg4KChIODg4OBg4SFhISFhYSDgoSFhYKEhIWFg4KBgH9/gIB/gIGEg4OEhYWEgoKCgoOCg4OFhIKDhISEhYaGhoaGhoWFhoeHhYaIh4aHiIeGhoaIiYeGhYaGhoeIkZKSkI6QjpCRjImHhYGBgoKCgoGBgYGBgoOBgYGBgYGBgICAgICBgYCAgICAgISEg4KBgoGAgYGAgYKIh4aHhYSCgH99fX6AgH+AgYGBgYGBgoGAgYaNgoKCgoKBgYGCgYKCg4GBgICAf4GAgH+AgH9/gIGBgYKCg4OEg4OEg4OCgoGBgoODg4SEg4SEhIOFhYaFh4eIh4eHh4eHh4eGhoaGh4WFhYaGhISEhIWEhYaSk5GOjo+OkI6JiIeEgoKCgoKCgoGBgIGCgoKCgoKCgYGBgYGAgYGBgICAgYGAgoSDg4KDgoGCgYKDg4iHh4iHhYSCgX5+gICAfn5/f4CBgoGCgoGCj5uFgH+AgIB+gIKBgIGCg4OAf39/gICAf4CAgYCCg4KDg4ODgoOBgYKCgoOCgYKCgoOCgoSDhISDg4SEhYWFhYaGhoaFhISEhYWEhIWFhYSEhISDhISEhISEipSTkZCQj46NiIaFhIOBgYKCgoKCgYGAgYKCgoKBgoKBgYCBgYCBgYGAgICAgYGAgoOCgoOCgoKBgoOCiImJiYiHhYSDgYKEhIOBgoKCg4SCgYB/f4WWm4iEgoSCgX+AgoGCgoGChIKBgYGBgoOCgoKDg4SDg4SEg4OCg4KDg4ODg4KCgoKCgoGDhISEhYSFhYWFhIWEhIWFhYWDg4OEhISEhYWFhISEhISEg4ODg4OOlZKRkZGOjYyHhYSDg4GBgoKCgoKBgYCBgoOCgYCCgYGBgICAgIGBgYCAgICBgICDhYSEhIODg4SDhIOGh4mIhoWDhIODhISDgYCCg4qIhoB9fX17f5eciYOFhISEgoGAgYKDgoKEhIOCgoGBhIWEg4ODgoKDhISDg4ODg4SFhISDg4KCgoKCgoSEhYSFhYWFhYODhYWFhYaFhoWEhIWEhYWGhYWEhIWEhISDhIODhJGUk5KSj4yMioWEhIODgYKCg4KCgoKBgYGCg4KBgYKBgYGBgICBgIGBgH+AgIGAgIaGhoaGhoaHh4aGhYSDhYaCgIGBgYGHgoB+f4CGmZCGfX5+fod+jZyFgYKAgYKCgYCCgoKCgoKDg4KCgYKDhYODg4ODg4OEgoKEhIOEhIWEg4OCgoKCgYKCg4ODg4SFhYWFhIOEhYWGhYWEhISEhIOEhIWFhIWFhIODg4OEg4KGlJSSlJKPjYuHhISDg4KBgoODgoKDg4GBgoKBgoKCgYGCgYGBgYCAgYGAgICAgICAhYWFhYaGh4aGhoWGg4ODg4GAgoKCgYKAfn5/foaenYaAiYB/h4GAjIKBg4GAgIGChIOBgYKBgYKBgYKDgoODgoOCgoKCg4OBg4SDg4ODg4OEhIKCgoKDgoKDg4ODhIWEhISEg4OEhIODg4OEhIODg4ODg4SDg4ODg4KCg4KDgouUk5KTkY2NioaDg4OEgoGCg4ODg4ODgoGBgoGCgoKCgoKBgYGBgICBgYCAf4CAgICDhISFhYSFhYWEhIWCg4KDgoKDg4OBgICAgICAg5qhiIWJg4OBgH2BhIOEg4ODg4KAgICCgoODgoKDg4ODgoODhIKCgoODgoKDg4KCg4KDg4WEg4ODg4SDg4SEhISEhYWEhIWEg4SEhIOEhISEhISEg4SEhYSDg4SEhIODgoKDkJSSkpKPi4yIhoSFg4OBgYKDg4ODg4OCgYGCgoKCgoKDgoCBgoGAgICAgIB/gICAgISDhYWEhYWFhYSFhYOEhIWDg4SEhIKCgoOCgoSBkJ2EgoKEh35+fX2EhYWEhYR/fX19f4KEg4ODg4OEg4ODhISEg4OEhISEg4SEhIOEg4OFhoWFhYSFhYWFhYSFhoWGhoWFhYWFhYWFhYWGhoWGhoaFhoaGh4aFhYWFg4SEhIeTk5KRkoyKiIWFhYWCgoGBgoODg4OCg4KBgYKDg4ODgoKBgIGAgICAgICAgH+AgICAhYWFhYWGh4eGhYWFhISFhYSEhISEg4ODg4OEhYOGjIKAf4CFgH19e4KHhoOAf35+fn9/f4OEg4OEhISEhISEhISEhISFhYWEhYSGhYWGhYaGhoWGhYWHhYWGhYaGhoaFhIWFhYWFhIWGhoaHhoaGhoaHh4iIiIaFhYaEhYWGjZSTkpGQi4qHhoeGhIGCgYKDg4ODg4KDgoGBgoODg4KAgYGBgICAgICAgICAf4CAgICHh4eGhoeHiIeHhoaEg4ODhIODg4OEg4ODg4OEhIODgoB/hI2Ef319gIaBf3+AgH9/f35/gISFhIWGhoaFhYWFhoaHhoaFhoWFhoeHh4iHh4eGhoaHh4eGhoaGh4aGhYSDhIWFhoSFhYaGhoeHhoaGhoeHh4eIiIeGhoaHh4eRk5KQkZCLiIiFhoSDgoKBgoODg4ODgoKDgoKCgoOCgYCBgICBgICAgIGAgIB/gICAf4aHiIeHh4eIiYmIiIODgoKDgoSEhIWEg4KCg4SEhIOAgIGFhIODgX+AgH9/f4CAgIB/f4B/f4WFhoeIiIeHh4eIh4iHiIiIhoaHiIiJiYmIh4aHh4eJiIaHhoeHhoaFhIOEhYaFhYWFhoaGh4eFhoeGh4aGh4eHh4eHh4eFh5OTkY+RkIuHhoWGhIKCgYGCg4ODg4ODgoKCgoGCg4KCgIGBgYCAgICAgICAf3+AgYB/hoiIiIiHh4iJiYmIg4KCg4ODhIWHh4aFg4OFhISDgX+Ag4WDgYKCgoKCgYGBgYB/gH9/fnt6gIaIiIqKiYmIiImJiYmKi4qIiIiJiYuLioqIiIeIiIiHh4iIh4iGh4aEg4OFh4eHhoWFhISDhYWEhYWGhISEhYWFhoWGhYOJlJOQj5GOioaFhoWDgYGBgYKDg4ODgoKCgoKCgoKCgYGBgYGBgYCAgICAgIB/gICBgH+GiYiIiYeIiImJiIiEgoKDg4KDhImKh4aEhIWEg4ODgoOEhISCgoKCgoKCgH9+fH19fX9+fHt8g4eJi4uKioqIiIqJiImLiomJiImIioqJi4mHhoaGh4WGiIiJiIeGh4SDgoSIiIiIh4WCgoGDg4KDg4SCgoKDgoGEg4SDgY6TkpCPj4uIhYSGhIKBgYGBgoODg4OCgoKCgoKCgoGBgYGBgIGAgICAgICAgH+AgIGAf4WIh4eHhoeIiIiHh4SCg4OCgoOFiYqJh4WHhYSFhIODhYODhIOCgoKDgX59fX5+fn5+fXx+fX19g4eJioqHh4WGh4eHh4iHh4mHiIaIh4aJiIODhIOFhISFhYaIh4aFg4KCg4WHhoeGhoOCgoOEgoODhYKBgYGBgYODhIOEkZKRjo+Oi4eEhoaEgoGAgYGDg4ODg4KCgoKCgoKCgYGBgIGBgYCAgIB/gIGAf39/gIB/hYaGhYaGhoeHiIeGgYKEhIOChYeIi4qGhIaEgoaFgIKEg4ODg4OCgoF9fH1/gH9+fn59fH19fHp8hIaHhoSDgYODhIWFhYODhYSEhISEhIWEgoKDgoSEgYKDg4WGhYSCgYGCgoODhYOEhIWEhIaDg4SFg4KDgYKDg4SFhIeSkY+NkIyJhoSFhIWCgYCBgYODg4ODgoKCgoKCgoKBgYGBgYGAgICAf4CAgYB/gICAgICDhIWEhYWFh4eHh4aAgYGFg4OEhYSHiIWCgIB/gYCAgYODg4ODgoJ/fX1/gICBf31+fn18fX16enp+g4SEgoGBgIGBgoKBf36BgYGCgYOAgoGCgoKBg4SAf4CAgYOCgICAgICBgYGCgYGChIODhYSCg4SDgoKBgoSDhYWGi5ORjo+Pi4iFhYOChIGBgYGBgoODg4KCgoKCgoKCgoGBgYCBgYCBgH9/gIGBgICAgH+AgIKCg4OChIOEhYWGhn+BfoCBgICAgIGDgn9+fn5+foCCg4OCg4ODgn19fn6AgIGAfn19fX1+fXx6enp/goKAf39/f35/f4B+fYB/f4CAgX+AgIF/f4CBgX59fX+AgX9/foCAgH+AgICAf4CCgICCgYGCgYGAgYGBgYKEg4aPkpCOj42Kh4eGg4OCgYGBgYGCg4ODgoKCgoKCgoOCgYGCgYGBgICAgH+AgICAgICAf39/gYKDhIGCgoOCg4SFgIB/fH19fn1+foCAf31/fn1+gIODg4KCgYF/fX1+f4CAgH9+fX19fHt7e3p6enqAgH9+f35+fn1+f35/gH9+f3+Af4GAf359fn9/fn18fn+Af35+f3+Af39/f4B/f4B+f4CBf4B+f39/gH9/f4B/hZKSj46Pi4uHiYWEg4KBgYGBgYKDg4ODg4OCgoKDg4KAgYKBgYGAgICAf3+AgIB/gIF/f36BgYSEgYKBg4OCg4OBgH98fn5/fX6Af4B/foF/f4CBhIOCgYB/f359fn5/gICAfn19fXx7e3x6enl5eXt/f35/f39+fX5/foCAf35/f4CAgoB/fH5+f35+fXx/f4B/fn9/f4B/f35/foCAf36Af39+fn5/f35+f318fH2Fk5KOjIuKiImIhISEgoKCgYGBgoOCgoODgoODg4ODgYCBgYGBgYCAf39/f4CAgICAgIB/foCBhIOCgYGDhISDhICBgICBgIGAgYKCgoGBgoCBg4ODgYGBgYCAfX19fn5+f359fX19fXx8fHt6enl5eX2Af4CBgYF/f4B/f4F/gICAgYGCgoB+gH5/fn5+foGAgoF/f39/gIB/f4B/gYB+f3+Afn9/fn+Af31+fX17fIaTkYyLioeHioiGhoSDgoGBgYGCg4ODg4OCg4OCgoKBgICBgYGAgH9/f4B/gICAgICAgH9+fn+BgYGAgISGh4aHgoSDhYOBg4ODhYSEhISEg4ODhIKCgoKCgH5+fX19fn6AfX19fX19fX19e3p5eXl5eYCCgoKEg4CCg4F/gYCBgYGDgoKDgYGCgIGAf4CBg4GEgoCAgYCBgYCAgYCCgn+BgIF/gIB/gICAfn9/fn18ipOQiomIiIiJiIaGhoSCgoGBgoKDg4ODg4KDg4KCgYCAgICBgYGAf39/gICAgICAgIGBf359fn5/f39+g4aHh4iChYSFg4SFhIWGhYaGhoWGhYGBg4ODgoKAfX19fX19fn59fX19fX19fX18e3l5eXl4fIKDhIWCgYSDgoKDhYaCg4SDgYKCg4OCgoKCgYKFg4iFgoGBgYKDgYGBgYSDgoOCgoKCgIGBgIF/gIGAf36Ok4yHiIaIh4aGhYaGhIKDgoGCgoODg4ODg4OCgYGBgH+AgYCBgYB/f39/gICAgH+AgYB/fn19fX5+f36Ag4SHiISGhoaFhoaHh4aHh4iHh4eGf32BgIGCgX59fX19fX19fX19fX18fH5+fnx7eXh3eHl5gIKDf4ONhIOEhISXl4ODhIF9foGCgoGCgYKBg4aIjIWDgoKBhIKEg4KDhYSEhYOCg4OCg4OCgoKCg4OCgpKQi4iJh4mHhoaEhoWEhISCgYKCg4ODg4ODgoGBgYCAgICBgIGBgH9/fn+AgYCAf4CAgH9/fn1+fn+Bf4CCgYWFhYeGh4eGh4eIhoaHh4eGh4V/fX18fX9+fX19fX19fX19fX19fXx7iJKCe3x6fIZ5eHl8gYF+iZaEg4OEhJSTgIGBf39/fn6Fi4B/gICEhpCJhYSCgoGFhYuDgYOFhYaGhIOFhYOFhIODhIOEhISIko6MiYiIiYeHh4WGhYSFhIKBgoKDg4ODg4OCgYGBgYB/gIGAgICAf39/f4CAgICAgYGBf39/f4CAgIGBgYGBg4OGh4aGh4aGiIeGhoaFhIOFhH59fHx8fX18fH19fX19fX19fX18fH+RlZaDe3qElHx4eXp7fICCg4GBgIOCgH58fn57iJF8fI6Wf31/f4KGioWDg4SDgYONiX9+f4OEhYWDhYaFhIWFg4SFhYaEhI6Rj4yKioyJiImHhYWFg4OCgYGCgoKDhIODgoGBgICBgICAgYGAgIB/f3+AgIB/gICAgX5+f4GBgoKCgoODgoOCgoWGhISFhYSGhIOEg4KBgIKAfn19fHx9fXx8fH18fH18fX19fHx8e4uRl4x6e3yBenp6e3x5eX19foB/gH98e3t+fn2ClZF/hIh+fH5/goR8fIGChIKAf4eDfYKBf4KCgIODhISEhISChIOEhYKEkZGOi4yMjoqJiYWFhYODgoKBgoODgoKDg4KCgYGAgIGAgICAgICAgH+Af3+Af357gICBenyAgoKDhYODhIWFhYODg4SCgYKDgoOCgoGBgIB/gX5+fX59fHx8fHx8fHx8fHx8fHx9fHx8fn6Kgnt6e3p4ent7fH17fn1+f319fX18fICBgX2Gj4F+fYJ+fn6Agnx8f3+CgIKAfnx7ioJ9gH9+gYCAgYKBgoCBgYGAf4uTj4yLjY6NiIeHhYWEhIOCgoKCg4OCgoODgYGBgICAgICAgH9+fXx7fHx9f3+AgHx6gYF4e4CCgYOFhIOFhYaHhISAhpSIgIKBgYGBgH9/f39/fn5+gHx8fHx8fHx8fHx8fHx9fHx8fHx8fHl7e3t4eHl7enp8gX+Afn+BfH5+f399gIKCgICAgX+CkYF/f4CAfoB+fn9+gIGBfX19e319fX19fHx9gH+AgH6Afn6Bk5GMjI2OjoqFhoaFhISFg4OCgoODg4OCgoGBgYGAgICBgICAf4CAf39/fXt6fICAgHh+gXd7gIF/gYKCgoKEhoeGhn6IlYp+gIGAgIB/foB+f39/fn+Bfnx7e3x8fHx8fHx8fH59fHt8fHx8e3x8fHp6eXt8en2Fg4J/gYF+f35/gH6FgoF+gH9+foCFhoKAfn6Dhn9+fH6AgIGAf39+fX19fX57fH1/f3+AfX9+gIyRjoyNjo2Nh4SGhoWEhISDg4OCg4ODg4KBgYGBgYCBgYGAgYGBgYGAgH9/f397en9/e3mAd3p/f31+f3+Af4KDhoaFf3+FgX5/gIB/gH5+f31/gIB/gIB/f319fHx9fn18fH19fX19fH58fXx7fXx8ent6fH19f4aEgoCAgX1+fX5/fouEgYZ+fXx8f36CgX99fX19gXx7fXx+gYSDgYB+fn5+fX1/f399foB+fn6Eko2MjI+Ni4qGhIWEhISDg4OCgoKDgoOCgYGBgYGBgYGBgYB/fXx8fH1+f39/f397e399d352eH59fH18fX5+gYGCg4B6fX18fn+Af36Af35/fn+AgH+AgH9/fn9+fn5+fn1+fn99fH59fn19fHt8fHx6e3p9fn+Ag4OCf35/fH18fXx8gIN9jH58e3t9fn1+fn17e3t9fHp7e3uAhoSChIOCf4B+f4KCgn9/goJ/gIqPjIyLjYyLiISEhIODg4ODgoKCgoKCgoKBgYGAgoGBgYKCf3+AgIB/fn18fH5/fn55fX52e3Z4fXx8fHt9fX6BgICAf31/f31+f39/foB/f39+f3+AgIGBgH99gH9/fn9+fn5/f3yCfn59fX17e319fHp8fH6AgoGAgIB8fH18fHx8fH17fXt/fnt7e3x8fH18e3t7e3x8enp9en6CfoGDhIKBgoGFhoWFh4aHhoGEkY6Mi4qLh4eFgoOEhISEg4KCgYGCgoKBgoGBgYGBgoGBgoKAgYKBgYCAgH9+e3x+fnx6fnh5dnd8fHx7e318f4GAf35/foB/f35/f35/gH9/f39/f3+AgYKAfn6BgIB/f39/f39+fYN8fH19fH99fX19e3x+fn9+fn5+fnx8fHx8fHt+fnp8e3x8fHx9fH18fnx9fHt7e3x5e3x7e316fX5+f4CAg4eJiYmLiYuJhYiRjYuIiYeFhYOCgoOEhIOCgoKBgYKBgYKBgYGBgYKCgoGCgoCAgX98e3p6eXt9enx+fnl8eXh4dHx8fHx8fHx/gH9/f39/gIB/fn9+fX+AgH9/f3+Af4CDgoB/gIGAgIB/f4CBf358enx9fX59fX5+jIZ9fX57e4OCfX5+fX18fX19fX1+e318fXx9fX58fn19fX18e3t6fHt8fHt6e3t6enp7fn6DhYiHiIqLi4uJjZGOjYmIhoWEgoKCgoODg4OBgYGBgYGBgYGBgYGCgoOCgYKBgICBf3+Af356eHl5en5+e3l6eH5zfHx8e3x8fH5+fn5/gH+AgIB/fn9+gIF/f4B/gIGAgoSEgYCAgYGAgX+AgYKBf39+f31+gH57foGRjHx9f4qAjYx+fn19fX59fX59fHx8fX18fXx9fX1+fX1+fnx7e3t8fH18e3p7fHl6eXh5e35/g4OEh4mKiImOkI2LiIiFhISCgYKCgoKCgoGCgoKCgYGCgYKCgoGCgoKBgoKAgYGAfoCAf39+e3p5e319eHx6f3KBfXt7fHx8fn59fYGBf4GBgX9/gH+AgX9/gIGCgYGFg4SCgYGCgYKCgICBg4KAf4F/fX6Afnx/f4iCf36CkISEg4F/fn18jYd9fX59fHx/fnx9fXx9fX5+fX5/fH19e3x9fnx8e3x9enp5eXl5e3t+foCBg4eEiI6NioqGhYSEg4KBgoKCgoGBgYGCgoKBgoKCgoKCgoKCgoGCgn+AgIB+f39+fn5/ent5fX16enp9cX6Cent8fX19fXp4f4KAgYKCgICBgYGBgICBgoKCgoWFhIKBgYGBg4F/gIKEgX9+gYB9foF+fX9/gIB9fn+EgH5+f31+fX2KhX1+fn1+foB/fX18fH5+fn99f4B9fn18fX9/fHx7fH17e3t6enp7e3x9fn6Ag4CJjYqLh4WFhYSDg4KCgoKCgYGBgoKBgoKCgoKCgoGBgoKBgYKCf4CAgH9/f39+fn59eXp6fXx5d3t0e4d8dHd9fn17e3Z2foCBgoKBgYKCgoKBgYGDg4OChYaEg4CAgICDgX+AgYOBfn6Af35+gH59fn6AgH+Bfn+Af35/f398f39/f3+Afn9/gH58fX18fn5+foF/gH2CgHx9gIB9e319fXx8e3x8e3t7fHt8fHx9fIqKiIiFhYWFhISDgYKBg4KAgIGCg4KCgoOCgoKCgoGCgoGBg4J/gIGAf39/fn5+fn57enp8fHt2e3R3f352cnt+fnt4dnd8gIGCgoKBgoODg4OCgoSDhIOFhoOCgX9/gIOAgICAg4F+foB/fX+AfX1+foCAf4J/gYGAgICBf31/f3+AgIGAgIB/fnx9fX19fn59g32AfoKAfX6AgX98fn59fX17fH58fXx8fHp8e3x+iYaGhYWHhYSFhIKCgoGDgYCAgoKDgoKCg4ODg4KBgYGBgYGCgH6AgYB/fn5+fn5+fn56e3p9goN9dXF6fHpxen59eXh1dICAgoKCgoKDhYOEg4KDhISEhIWEgYGAgH6Agn9+f36Bf35/f4B9foB9fX1+gH9/gYCBgYCAgIKBfn6Af4GAf4CAgH9+fX19fXx+fn19gYR/gH9+f4GBf31/f319fn1+fn1+fHt8enx7eoCHgoSEhYSEg4WDgoKBgYKBgICCgoOCgoOEg4SDg4KBgYKBgYOAfoCBf35+fn5+fX5+fnt7en6Jh354cnl9f3F6eHt4eXV1fYKDgoODg4OFhIWDg4OEhIODhIKBgH+Af4CBfn19fn9+fn5/gH19f3x9fX6Af4CAgIKAgIGAgoGAf4B+gIF+gIGAgH9+fn5+fn5/fn6FhYGBgH+Ag4F/foGAf35/foB/fn17ent6fHt6goR/g4KCgoOChIKBgYCAgoGAgIKBg4KBg4SDhIKEgoGBgoGCgn9+gIF/fn1+fn5+fX59fXp7fIWEe3tzeXp8cHd1dnd5dXR6hISBhISDhIWFhoSDg4WEgoODgoCBf39/f4B9fX1+f31+f39/fn1+fH19foF/gIB/gIB/gIGDgoGAf36AgH+AgYCBgH9/f39/f4CAgIGCgoKBf4GDgX+Ag4J/f4B/gX+Af3x7e3p8e3yCgH+Cf3+BgIKCgYF/fn+BgH6BgoKDgYGDg4KDgoSCgYGBgIGCgH6AgH9/fX5+fX19fn19e3t6gH94fHZ5eXtxdHh3dnh1cnmFhYKEhIKEhYWFhISChIOBg4GAgIF+f4B/gHx9fX6AfX5/f39+fX98fn5+gX+Bf39+f4B/gIODg4B/f4GBgIKBgYGAgICAgICAgIGAgYKDgYF/gISBfYGDhICAgX+BgYKBfXp7e3x8fH9+f4B9f399fYGAgH59fYB/foKBgYKBgIKCgoKBg4KCgYB/gYKAfn9/fn99fX1+fX19fX19ent7fHZ9eXh5enJ1eXl2d3dzdYaFg4WFgoSEhYSEhIKDgoGDgX+AgX5/gH6AfX19fn9+f4B+fn99f3x/f3+BgIF/f3x+gH6AgYKDgYCAgoOEgoGAgYB/gYCAgYGAgYGBg4KBgX+Ag4B+goKEgICCgYKChIJ+e3t8fHx8fX1+fXp+fX14fn9/fHx8fn5+gYCBgYCAgoGBgYGDgoGBf4CAgoB9fn19f319fX59fH19fX16e3p8dnx6d3t4cnZ5e3Z2dnN0hoSEhYSBhISFg4OCgYOBgYOBgIGBfX+BfoF9fX1/f39/gH5+f359fYB/gIGBgX5+fH5/fn5/gYJ/gYGCg4eFgX9/fn6Af4CBgICAgIKCgYCAfoCCf3+BgoKBgYOCg4OFgn99fX18e3x8eXp7en55e3l4f357e3t+fX1/f4F/gH6BgICAgoOCgYF/gIGBf31+fH1+fX19fX18fn58fXx5e3x4enx3endzeHd6c3d2c3SGhISFg4KDhISDgoKCg4GCgoGAgYF8gIB+gH1+fX5/gICAf35/f3x+f3+BgIGAf359f39+fn+BgH2AgIGDg4N/f359fn5+f4CAgIB/gYKAgH9+gIF+f4CCgYCBhIKEhYaEgH59fHx8fHp5dnl5enl2eXZ+fHt7e358e399gH99fX9/f3+BgoGBgX5/gYF+fX18fX19fX19fXx+jYF8fXl7e3p5fHd4eHR1dXhyd3d0doaEhIWEg4ODg4OCgYKDgoGDgn+Bf35/fn+AfX19fX+AgIB/f39/fIB/f4GAgYCAf3yAf31+fn9/fX5+gYGCgn5/fn1+fn5+f3+Af32AgIB+fn1/gX5+gIKBf4KDgoOEh4SAgH58fXx8e3x1eXl4eHh5d3t8e3t7foV9fn1/ent+fn59foGAgIGAfX6BgH59fXx9fX19fX18e32DgXx8ent7e3p7d3Z4dXJzdnB4eXJ4hYWFhYOEg4KChIKBgYKBgIKBgIF/fn5+foB+fX58f4CAgH+AgX97gH6AgH+BgIB/fYB+fn5/f319fX6AgYKBfn9+fn59fX5/fn9+fH+Af35+fn+Dfn6AgIF/gYOCg4OGhICBfnx9fHx7fHh4e3h1eXd3eXx6e3t9kod9fH13en1+fn19f35+gH98foB/fn19fH19fX19fHt8ent9enp4e3x6ent4dHh1cXJ0cHh4cnmEhYWFg4SDgoODgoGBgoKAgYGAgIB9fn5/gH18fn2AgIGAf4CBgHyAf4B+f4GAf39+gX9+f39+fX18gICAgIB+f35+fn18fn9/f358fYB/fX1+gIJ/foCAf36BhIKCg4WFgoJ+fXx7e3x8eXd8eXd4d3d4e3t7e3yFin17end6fH19fHx9fX1/fnx9fn59fXx8fX5+fX18fHt6enx7e3p5enp6enhzd3VxcXJweHdxe4WGhIWDhYKBg4OBgYGBgoCBgICBgH5/fn9/fXx+fYCAgoGAgIGBfX6Af35/gX+Af3+BgH9/f35+fH1/gICAgH9/f35+fXx+f39/f319f399fn6CgYF/gIB/foGDgoKEg4SCgn5+fHx6fHt7eXt6d3N2d3h5e3p7eXp/fnt7d3p8fXx8fH59fH19fH19fXx8fX19fX99fXx9e3l7fHx8enp6enp6eHN2dXBwcm93dnJ7hYaEhYOEgoGDgoKCgYGCgYKBgYGAf4B/f399fX9+f4CBgYJ/goF9foF+foCBf4B/gIKAgIB+fX58f3+BgICAf4B/f4B+fX5+f4B/f39/gH9/f4J/gICAgIB/gYGAgISBgoKAf39+f3x9fn56fYV+dHx9enp6enx5eXp6hoV3eXx8fHx8fXx8fHx8fX19fHx9fX19fn19fX16eX17fH16enp6enp5c3V1b29xb3d0c3yFhoOEgoOCgYKBgoKCgYKBgoGCgYCAgICAgH59gH+Af4GCgn+CgX+AgX5/gYF/gICAgn+Bf319f35/f4KAgICAgIB/gIB+fn1/gH9/f4B/f39/gH+AgICAgH+AgIGBgYGCgYCAf39/fn1/fnuBk416fH18e315e3p6eHmBgXh5e3x8fXx8fHx8fHx9fX18fH18fX1+fn59fHp8fHt9fXt5enp6eXlzdXVvb3Fwd3N0fYWGg4OCg4KAgYCCgoGAgYGCgYKBgYCAgIGAfn5/f4GAgYKCgIKCgICCfoCBgX9/gX+BgIF/fH6Af3+AgoCAgICAf3+AgH9+fX6Afn1/gH9/f3+AgICAgYCAf4CAgYCBgYKCgICAf39/fX5+fIGGiXx8fnt7fnl6e3p7jn53d3l7fHt9fHx8fHt9fH19fX18fXx+fn5/f358enx9e319e3l6e3p5eHN0dW5zcXB4cnV6hYaDg4KDgoCAgIKCgX+CgYKBgoGBgYKAgYF/fn9/gYGCgYKBg4OAgYJ/gYGBf4CAgIB/gX99f4F/gICBgICAf4B+gICAf359foB+fn+Af39/gH9/gIGBf4CBgH+BgIGBg4KAgICAgIB9foB9gIOCe35+e3t9e3p8e3uHeXh4eXx8fH17fHx9fX18fH19fn19fX5+f3+Af317fH18fHx7enl7e3l5c3J1bnZycHhxdXaFhYOEg4KCgICBgoF/gIKCgoKDgYGDgoCCgYB/gICCgoKBg4KEhICBgX6BgoF/gICAgH+Cf36AgYCCgICAgIB/gH+AgIB/fn2Af39/f4CAgH+AgH+AgYGAgICAf4GAgIGBgYGAgYCAgH9/gH5/fX59fn57fXx9fHx8d3h1eHh5e3x8fXx8fHx8fX5/f39/fn19foB/gIGAf3x9fHx9e3p7eXp8eHpzcnVud3FxenF2d4WFg4SDg4KBgYKDgH+CgYSDg4SBgYOBgoKBgYCAgIKDgoCCgoSDf4GAfoKDgICBgICAf4CAf4GBgIJ/f4CCgH9/gICAgICAf4CAgH+AgICAgIB/f4CBgYCAgICAgYGAgoOCgoCCgYGCgYB/f4B/gId+fnx6fXx7fX94d3Z5eXp8fXx8fXt8fX19fn5/gIGAfn1+gICAgoGAfH59fX58d3t6ent5eXNxdW53cHV6cXZ5hYWCg4KDg4KDhISAgIOBhoOEg4GChICEg4KCgICCgoSBgYKChIJ/gIB/gYOCgYCBgYCAf4GBgYGAg4F+gIOCf35/goGAgIB+gYCBf4CAgYGBgYCAgIKBgYKBgH+CgYGBgoOCgoOBg4OCgYCBgH+AhH19fXt/fXp9f3p5dnp4eXt7fH19e3x9fX19fn+AgYGAgH+AgICDg4B9f35+fn15eXt6enp5c3J1b3dxd3lzd3uFgoKDgoOEgoOEg4CAgoOGg4ODgoKEgYSDgYKAgIKBg4GCgoGCgX6BgICCgYKBgYKCgIGAgICCgoGEgH6Bg4J/foCDgoCBfoCCg4KAgYGBg4KDgoGBg4KChIGAgYOBgYKEg4KEhIODhIODgYGBgYCCf4B/fYB8enx/e3t3fHl5eXt6fX59fHx8fH1+foCBgYCAgIGBgYSEgH2Af39/f357e3t6e3p0cHhyeXR2eHR3e4SCg4KDg4SChIODgYKChYaEgoODg4SBhISAg4CBg4KCgoKCgIKAf4GAgIKBgoGCgoKBgIGBgYOCgoOAfoGDgn9/gYSEgYN/goKBg4GCgoGEg4OEgYKEgoOCgoGCgoOBg4SDhISEhYSFg4SCgYOCgoOBgYGAgH58fIB8fHh8eXp5enx9f3x7fHx9fX18fICAgICAgYGBgYKBfoGAgICAf3t7fHp6enVweHd5dnV8dXZ8gICDgoODg4OEhISAgoOGhYWDg4KDhIGEhYKCgYKDg4GCgoKAgYB+gYCBgYKDgoKCgoGAgYKCg4KCg4B/gYKBgICChIODgoGCgoGDgoKDg4ODg4SAgoSDg4OBgX+Bg4KDhYKEhISEhISDhISChIOEhIKBgoGBgHt+gX59eXx6enp9fXyBfXp8fH19fHp7fn5+gH9/gYGAgICAgIGBgIB/fX18fH18dnJ2eHl2dH92dX2Hh4OChIWDg4SFhICChYWEhIOCg4SEgIOFg4KCgoODgYOCgoCCgH2AgIGCg4KCgoKEgoGCgoOEgoKBgICBgoGAgYOFhIOCg4CCgoOCg4ODhIOEg4CCg4KEg4KCfoOBgoSEgoODhISEhIOEhIOEg4WEg4ODgoKAfICBf3x8fXp6e32Afn9/fHx6fH59fX19fn5/f39/gICAgH9+foCBgICAfnx9fX5/fn18e3h2f3Z3f4SHg4KDhYODhIaEgYKFhoWEhIODhISBhIWFgoKDg4SCg4KDgoOBfoCAgoKDgoODg4SCgoKCg4OCg4GCgYGDgn+ChISDg4KEf4KEg4ODgoSDg4SCgIOEg4SDg4KCg4KChIOCg4OEhISEhIWEg4OEhYSFhIOBgoB9gYKAfXx8e3x8gH19foB+fn1/fnx8fX19fn5/fn+BgYGBgH99fX6BgYB+fn19fX59fX5+f3+AfH2AgYKCg4OGg4SDhoSBgoiHhYSDg4SEhYGFhYWDg4SDhIODgoOCg4F+gYGDg4SCg4OEhIOCg4KEg4ODgoKDgYOCf4KDg4ODgoOAgoWDg4ODhIODhIOAgoSEhYOCgoODg4GEg4GDg4SDg4SEhYSEhIWFhYWEg4ODf32BhIB9fXx8fHx/gX5/f39/fX99e3x9fX19fX5+f4CBgIGBgH59fH6Cf39+fn5+fX1/f39/gICAf4CEhIODhIWDhIOFgH6CiouFhISDgoOFgYaGhoOEhISEhIODg4OEgn+BgYODhYSFhIWEg4KEhISFhIODgoSDhYKBhISFhYaEgoCDh4SDg4OFhIWFhIGEg4OGgoOCg4GCgYSDgoODhYODhYWEhYWHh4aHhYSEhYSBf4GDf35+fH5+fX+BgH9+fHx/f358enx9fX19fX5+fn9/gIKBf319fIB/gH5+fn5+f3+AgYGBgYKAgYWFhIOEhIKEg4aAgoWFiomEhISEhIWDh4aGhISEhIWEhYSEg4SDgYKDg4OEhIaEhYSDg4SEg3yDhHuBhHd5g4F9hH5+cnWDgoF2foOFgX2BdYF5g39/gH6EhIKDg4KBg4SDg4SFg4SFhoSFhn2EeXx+f4N7hYOBhIOBf31+fn5+gYOBfXt/fX6Afn18fHx9fX19fH19f4B/gYJ/fX18f4GBgICAgH+BgYGCgYKDg4KChoSEg4WEgYOEhYOEhYSKiIWFhYOFhYSGhoaDhIWFhYWEhYWEhIWCgoOEhYWFhoSFhIOEhYWCaICFanx7cXF8gXOGc3R0fYKDdXNxg4Z0cHVyc3SDdnt9dYF/goOAgnZ5hYCDgIR/hYSChYWCaHpyc3N8gHOBhH6Dg32BfX5+fX6Cg4J8f4F9f4B9fXx8fHx9fHx8fn1+gH+BgX99fX2AgYKBgYGBgIGBgYKBgoKCgoSHhIWEhYSBgoSGhoOFg4aIhoaFg4aGh4eGh4OFhYaFg4KFhoSFhYODg4SEhoaGhIaEg4SFhn1xe4FweXZ+g3+CbnlwdXN8dnl5hXKEg3B2eHF2dHR1cnN0dml/gG5yb3R2bnVsd217c26Ah3ltfXJzdnN2bW14bHB5bHV9f399foGAgX2Af32Af4B/fX18fH19fH1+f32Af4CAfnx/foCBgoCBgICAgYCAgIKDgoKEhYiGhoCChYODhIeGg4WFhYaHh4SDhoeIiYaHhIWGiIeEg4WGhYWEhIOFhIKFhoaFhoWEhoWHdnB0e3BydX+HhYNtdW92b3x1coR5eYd4cXR3bndod3pucHaCcoN+b3p5eW1vbnpvb213fXiGcHF6cHJ0ZoF1fm57eXNveX+Af319gYB/fH99fIB+gIB+foCAgYB+fn9/foF/gH9+fYB9f4CBf4B+fn+BgH9+goOCgoSFh4eEfoeEg4OFh4aEhoWFhoaIhISGh4iIhoeEhoaLiYWEhoeHhYSFhYWEgoWFhYWGhYWGhYZxdXByc29zenl+hHSIdHV+iHZugnKEhnluanJ/cW1zd3x/dXR8hH54cXV3bnl1enF2eHV6eYRxam95eHBreXN6b3p3dnZwgYB/fn5/f356fn18f31/f359gIGDg4CCg4GBhIGBf4GBgH1/f4F+f359f4GAfn6BgoCAgYSHhoODhoSFhYaHhoWFhYWHhoiFhYaFh4eFhoSGhomIhYSJioiGhIaGhYWDhYWEhoaGhoaFg3iLeXKIentwcIWEeIV4eWtzfnl7a3KDh4N6fG17eXl0fYB2bm+AgG90fHV3cXl9fW1+dW+DhYZ6gHJye3x1cG96bHN8bneCgIF+fn99fXp9e3x9fX9/fX1/f4KCf4GDgYGDgYB/gICAfn9+f31/fn1/gH58fYGAfn6Ag4iFhoOFhYWFhoeFhYWFhoeHiIaEhoWHhoaFhIWFhIWFhomKh4WEhoWGhoWGhoSGhoaGhoWGh4eHhoaEhoWGh4iHhYeGhoOHhoWFg4SGhoWGhIaEg4SEhoSEgYODhISFhIWEhYSGg4aHhYaEhIWHhoSEhYaEhX13hYOEhIKBgX1/fnt8e357fHx9f359fH59gIB9f4F/f4GAfn5+gH5+f35+fX99fX5/fHt8f358fH+BiYaFhIaGhoWHhoWFhYWGhoeIhoSGhYaGhYWDhIWGhYSGhoaGhYWGhIWGhoaGhIeGh4eGhYeIiIiIhoSHhYaGiIaFiIeIhYeGhoiFhYaHhYaGhYOChYWGhYWDhYOEhIWEhYWEhYWDhoaGhoWEhoeGhISFhoOFhIKEg4OFg4OCfYB/e3t8fnt8fH1/fnx8fn2Af31/gH5+gH99fXyAfX5/fn5+f3x9fX57fHx/fHt7fn+Ih4SEiIaGhoeGhYWEhoaGhoiHhIWGh4aFhIODhIaFhIeFhYaFhYaEhYaGh4eFh4aJiIaGh4eIiYiFhYiFhoeGh4aHhoeFh4eGh4WFhoeFh4aFgoOFhoaEhIOEhIOEhoSFhYWGhYOGhoWGhYWGhoWEhIWFg4SHhYOCgoWDhIF+gIB8e31+e3x7fX59e3x+fX5+fX9+fX1+fnx9fH98fn58fYGAfHx8fXx8fH56e3t8foiHgoWIh4eGhoaGhISGhoeGiIaEhYSGhoSFh4OEhYSFh4SFhoaFhoSGhoeHhoaHh4mIhoaIh4iKiIWHiIWGh4WHhoeGh4WIiIeHhYaGh4WGhoWBhISFhoWFhISEg4SFhIaGhoWGhIaFhoeFhYaGhYSDhISDhIeDhIGChISDgYCAgHt7fn18fHx9fXx8fH19fH18fn18fX19fHx8fXx+fXt8gX99fH18fXx8fHp6fHx9iIeChoiHhoeGhoaEhYaFhoWGhYOFhIaFhIiJg4GEg4SGhIaGhoaGhIeHiIiHh4eIioiGh4iHiImIhYiHhYeGhYeHh4WHhoiIh4eFh4eHhYaHhIKEg4SGhYeFhISEhISFhoaGhoaFh4WFh4WFhYeFhIOEg4ODh4GDgIKDg4KCgn+Ae31+fXt8fH59fH19fH17fHx8fHx8fXt7e318e359e3x/fX18fX1+fXx6ent7fHyIh4KGhoaGh4aGhYSFhoWFhYWEg4WChoSDiId/enqChYaEhoaFh4aEh4eJiIiHhoiKh4aHh4eIiYeFiIeGiIeGhoeHhYeGiIiHhoWHh4eGhoeDg4SEg4aGh4WFhISEhYaGhoaGhYaHhoaHhoaEhoWDhIODgoOGgYN+goKDgIOCf398f35+fHx9f318fX18fXp7e3p7fHx8e3t7fnt7fXx7e358fHx8fX5/fXt6fHp8fYmHg4aFhoWGhoWEhIWFhYWFhIOBhYGGhIKEhHyAhn+ChYWGhYWGhYSHh4iIiIaFiIqHhYeGh4eIh4WIhYaHiIaGh4eGh4aIiIeFhoeGh4WFh4OEhoSEhoaHhoWEg4WFhoaGhoaFhoaHhoeHhYOGhYOCgoKAg4WCg36BgYF/g4F/fn5/fX58fH1/fXt9fXx+enl6eXt8fXt7e3t+fHx8fHp7fXx8fHx+fYB8e3t7e3x7iYeEhoSGhIaGhYSFhYWEhIOEgoCDgYWCgYJ/eoSMe4CEhYeGhoaFhIeIh4aHhYWHiYeEh4WGhoiGhYeEhoeIhoaIiIeHhoeIhoSGhoaHhYWHg4SFhIaGhoeFhISDhYWGhoeGhoWGhoaFhoaEg4SFgoGCgYCDg4KCfYGBgH6DgX5/f4B8f3x9fX59e359fH15eXp5e319enp7e318fXx8ent9fHx9fH5+gHx7e3x+fXyIh4WGhYeEhoSFhYWFhYODgYOBgIKBhYKAgH9/fXx7gYSFhYaEhYSDh4eGhoaFhIaJhoKGhIaGhoWFh4aHiImGhYiHiIeGhoeFhIaFhYeFhIeDhIWEiIaGh4WFhIKFhYaFhoaHhIaGh4aFhoODg4WAgIGAgIOBg4B8gYB+foKAfYB/gXx/fH1+fX57fn18fHl6enl6fX15ent7fHt8e3t6e319fH18f35+e3t7fX59fIiGhYaGhoSFhYSFhYSDgoKAgoGAgICDgX5+foB5en2Ag4OFh4WEg4OHhoOEhYSChYiFgoSDg4WFhYWHh4aIiIWFiIeJh4aFhoWDhoSFh4OEhoSEhYSHhoWGhYaEgoWFhoaGhoaEhYaGhYWGgoKDhH9+gICAgYCDgHuBf31+gn5+gH6Afn99fX59f3t/fXt6eXp6eXp8fXl6ent7enx6e3t7fH19fXyAfn18fH1/fnx7h4WFhoaGhoSFhIWDhYKBgICAgYB+gIKCfX5/f3t/f4KDg4WGhYSDg4aDgYOEgoCFh4WCg4GBhIWEhIaGh4iHhYWIhomHhYSEhIKFg4SGgoOFhIWGhIeGhYWFhoOEhYSFhoWGhIOEhIWDhYWBgIODf35/gH9/gIN/fIB9fX+CfoCBfn6Bfn5+fX1/e398e3p5enp5enp8eXp6ent7fHp7e3t8fX59fYB9fXx8fYB/fXyGg4aGhoaGg4SDhYKFgYGAf3+Af35/gIF8fn9/foCAgoKChIWDgoGChIGAg4KBgISFhIKBf4CCg4OEhYWHhoWFhoeFh4aGgoOCgoOCgoWBg4WEhYaEhoaHhoaFgoSEg4SGhYWDhIODhIOFhIB/goJ+fn5/fn5/hH57f3x8gIF9gYB9fYN8fn59fX57fnx7enl7enl6ent5enp6e3t8ent8fHt+fn1/gXx9fHx9f4B+gIaEhYWEh4SDg4KGgoOAgYB+fn+AfX9/gXx9f39+fn+BgYKEg4KBgYKCf4CBgoCAgoWEgoB/gIGDgYOFhYeFhISGhoOFg4WBgoGBgoGCg4GChISEhYWGh4eGhYSDg4ODhIaFhIKDgoOChIODgH+AgX59fX5+fH6Dfnx+fHyBgH6Cf31/gnx/f319fHx8e3t6enp6eXt6enp5eXp6e3x5e317e35/f4GAfX59fX1/gICAhoSEhYSFgoSCgoSCgoCBgH59fn9+fn6AfX2Af35+foGBgoODgoSHgYF+gICBf3+ChIOBf35/gIJ/goWEhYOCg4WFgoSBg4CBgIGBgYKBgIGEg4OGhYWHh4WEhIWCgoKDhYSCgYGBgYCFg4F/foB/fnx9fn18foN9e318fYF/gIN9fYCBf35/fXx8fH17e3p6enl5e3l6enl6ent7e3p7fXx8f3+BgoB+gH+AgH+AgYDKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzNzc3Nzc3Nzc3NzczMzMvLy8vLy8vLy8vLy8vLzMvLy8vLy8vLy8vLy8vMzMzMzM3Nzc7Oz8/Pz9DQ0NHR0dLS0tLS0tLT09PT0tLS0tLS0tPT09TU1NTU09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tLS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1dXV1NTU1NTT09PT09PT09PT09TU09PU1NTU1NTU1NTU09PT09PS0tLS0tPT09TU1NTU1NPT09LS0tLS0tLR0dHR0dPHhnNlYFtLWWdVTUZIQD03Nzg5Nzw8PDo8Oz42Oj04PDs6OTg3ODs7Oj87PTs8PD47P0E/QkJBQ0RFREE+PTw7QENDQUBDQ0FBR0hHSUtSwtXS09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXVysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMy8vLy8vLy8vLy8vLzMzMy8vLy8vLy8vLy8vLzMzMzc3Nzc3Oz8/P0NDQ0NHR0tLS0tLS09PT09PT09PT09PS09PT09TU1NTU1NTU09PT09PT09PT09PT09PT1NTU1NTU1NTT09PT09LS0tLS0tLT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1NTU1NPT09PT09PT09PU1NPT09TU1NTU1NTU1NPT09PS0tLS0tPT09PU1NTU1NTU09PT09PS0tLS0tLR0dHSzIxyZ2BcTVllUktHSz87Mzc4Ozg5Pj05PDpBOjs9Nzs8PDo6Nzg6Oz0/Oz88PTw/Pj9BPUFBPkNDREJAQT46Oz9DREFDRERCQklHSEhJTr7V0tPT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1crKy8vKysrKysrKy8vLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzMzMzMzMy8vLy8vMzMzMzMzMzMzLy8zMzMzLy8vLzMzMzc3Nzc3Ozs/P0NDQ0NDR0dLS0tLS09PT09PT09PU09PT09PT09TU1NXV1dTU1NTT09PU1NPT09PT09PT1NTU1NTU1NTU1NPT09PS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1tbV1dXV1dTU1NTT09PT09PT09PU1NTU09TU1NTU1NTU1NTT09PT0tLS0tLT09PU1NTU1NTU1NTU09PT09PT0tLS0tHR0s+Sd2hfXk9XZ01LRks9ODc2NTk5OTw+OT88RDo7PDc5PD07OTc5Ojw9QDs+PT47PD48PT5BQD5EQ0NDP0E9Ojs9QkNFQ0NEQT9FSEpJSky61dPT09TU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8rKysvLy8vLy8vLy8zLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMzMzMzMzMzMzMzMzMzczMzMzMzMzMzMzMzMzMzc3Nzc3Ozs/Pz9DQ0NDQ0dHS0tPT09PT09PT09TU1NTT1NTU1NTU1NTV1dXU1NTU1NPU1NTU09PT09TU1NTU1dTU1NTV1dTU09PT09LS0tLS0tLS09PT09TU1dXV1dbW1dXV1dXV1tbW1tXV1dXV1NTU1NTT09PT09PT1NTU1NTU1NTU1NTU1NTU09PT09LS0tLT09PU1NTU1dXV1dTU1NTT09PT09PT0tLS0dHRmn5nYWJOVWpKSElLPzw6OTM3Njc3PTs+OT06Ojo4ODo7Ozg4Ojs7PD46PT09Ojw/PD0/QkA/Q0RDRD5APT08QENEQ0JEQkQ+REhJSUtMttfT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3MzMzMzMzMzMzMzMzNzc3NzczMzMzMzMzMzMzMzc3Nzc3Ozs7Pz8/Q0NDQ0NHS0tLT09PT09PT1NTU1NTU1NTU1NTU1NTV1dXV1NTU1NPT1NTU1NTU1NTU1NTU1dXV1NXV1dXV1NTU09PT09PS0tLT09PT09PU1NXV1dbW1tXV1dbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1NTU1NTU1NXU1NTU1NTT09PT09PT09PU1NTU1dXV1dXV1dTU1NTU09PT09PS0tLR0p+DaV9kU1hsSEhIS0A9Nzg0NzY6Oj87RDw8OTw8OTg6OTo6Ojs8Ojo7OT49Pjk9QDs/QUFCP0JCQUM9Pz8+PEBCRUNDQkBBO0ZJR01MSbLY09TU1NTU1NXV1dXV1dXV1dXW1tbW1tbV1dXW1svLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzM3Nzc3Nzc3Nzc3Ozc3NzczMzMzMzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc3Mzc3Nzs7Ozs7Pz8/P0NDQ0NHS0tLS09PT09PT09TU1NTU1NTU1NTU1NTV1NXV1dTU1NTU1NTU1NTU1NTV1NTU1dXV1dXV1dXV1dTU1NTU1NPT09PT09PT09PU1NXV1dbW1tbW1tbW1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTV1NTU1NXV1dXU1NTU1NTT09PT09PT1NTU1dXV1dXV1dXU1NTU1NTT09PT09LS0tSjiGxfZlJWakdIR0lBPjM2Njo7PDhDPEJBPjxBPDg5Ojw6Ojw8PDk8PTo7PD09PD89QD9AQT9AQUBCPD4+PzxCQ0NDRkBBQT1ISklOTUeu2NPU1NTV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbMzMvLy8vLy8vLy8vLy8vLy8vMzMzNzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzs7Ozs7Oz8/P0NDQ0NHR0dLS0tPT09PT09TU1NTU1NTU1NTU1NTU1NTV1dXV1dTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dXU1NTU1NTU09PT09TU1NTU1NXV1dbW1tbW1tbW1tbW1tbX19bW1tXV1dXV1dXV1dXV1dTU1NTU1dXV1dXV1dXU1NTU1NTU09PT09PT1NTU1NXV1dXV1dXV1dXV1NTU1NPT09PT0tLWroprY2VSWGhMSkdJQjg0OTQ6Ozo5QDk/Q0VAPDw5OTk9Oj07PDw6PTw7OTw9Ozs/PUA9PT5AQD9CQT5APD05QERDQkFBQj48SEpLTU5IqNnU1NXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbWzMzR09PT09PT09PT09PT087Ky8vLzMzMzMzMzMzMzM3Nzc3Nzc7Ozs3Nzc3Nzc/Pz8/Pz8/Pz8/Pz9DQ0dHR0dHR0dHR0dHS0tHV2djY2NnZ2dra2tvb29vZ2dnZ2dna2tra2tra2tjW19fX19fX19jX19fX19vb29vb29vb29vb29vb2NbX19fX19fX1tbW1tbX2tra2tra2tra2trb3NzX1dXV1dXV1dXV1dXW1tbX1tbW1tbV1dXV1dXV1dXV1dTU1dXV1dXV1dXU1NTU1NTU1NTU09PU1NTU1NXV1dXW1dXV1dXV1dTU1NTT09PT09PS1bqKa2hoUlhlSUlMT0A5OTo0O0E8Nz05QUM+QD89ODo6Ozk9Oz4/Ojs8PDo7PDo7Pj1APT8/P0FAQUE/QTw8Oz5BRENBREA9PElJSk1ORqPa09TV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbW1szNhG1wcHBwcHBwcHBwcGqn493d3t7e3t7e3t7e3t3S0NDQ0NDQ0NDQ0NDQ0ci5ubm5ubm5ubm5ubq6t6WkpKSkpKSkpKSkpKSnhmBjY2NjY2NjY2NkZGRlhIuKioqKioqKioqKioemuri4uLi4uLi4uLi4ubSPjIyMjIyMjIyMjIyMiaK/vL29vb29vb29vb2+tIqKioqKioqKioqKiouHvebh4uLi4uLi4uLj4+Pi2NfX1tbW1tbW1tbV1dXV1dXV1dXV1dbW1dXV1dXV1dTU1NTU1NTU1NTV1dXV1dXW1dXV1dXV1dXV1NTU1NTT09PT09XDkXFrak5TYkxMVk48Ojo3Nz5DPzg+Oj8/QTw/QDc7Ojs7PTs+Pjo7PD48Oz07PT8+QDw/Pz1AQEBBPj88PjxAQUVCQkZAQD9HSEpLT0ae2tXV1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19fMzk4mKysrKysrKysrKysiivTr6+rq6urq6urq6uvp1dLS0tLS0tLS0tLS0tTEqaqqqqqqqqqqqqqqq6aGhIWFhYWFhYWFhYWFik4MEhISEhISEhISEhIRE0pUU1NTU1NTU1NTU1NPg6ejo6Ojo6Ojo6Ojo6ScWlVWVlZWVlZWVlZWVlJ8rqqqqqqqqqqqqqqqrJtTUlNTU1NTU1NTU1NTS6ry6+vr6+vr6+vr6+vr6dnX19fX1tbW1tbW1tbW1dXV1dXV1dbW1tbV1dXV1dXV1dXV1dTU1NTV1dXV1dXW1tXV1dXV1dXV1dXU1NTU1NTU1NPUy5h2bGlKTl9NUlVNPjw8Nzs/Qz42Ojc+Pjs9Qj84PDk9Ozw6PD07PTs9Ozs9PD0+PT07QT08QUBBQT08Pzw7QEJDQURFPUFAQ0ZLS09GmNzV1dXV1dbW1tbW1tbW1tbW1tfX19fX19fX19fXzc5SKzExMTExMTExMTExJ43z6enp6enp6enq6unq6dXS0tLS0tLS0tLS0tLUxaqrq6urq6urq6urq6yoiIeHh4eHh4eHh4eHh41SEhgYGBgYGBgYGBgYFxpOWVdXV1dXV1dXV1dXU4WopKSkpKSkpKSkpKSlnl9ZWlpaWlpaWlpaWlpWgK+rq6urq6urq6urq66dWFdXV1dXV1dXV1dXV0+r8erq6urq6urq6urq6unZ19jX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dXV1dXV1dXU1NTU1NTU1NGcenFpSlRdT1JVTkQ+Pzs/QEA4Ojs4PDs7PD86Ozs4Ozk5Ozw7Ojw5Ozs8Ozo9PT0+PUE/Pj8/Pj08PT88PEFBQ0FERTw+QEVGSktNRpPc1dXV1tbW1tbW1tbW1tbW1tfX19fX19fX19fX183PXDk9PT09PT09PT09PTWT8Ofn5+fn5+fn5+fn5+bV0dLS0tLS0tLS0tLS08Wtrq6urq6urq6urq6vq46NjY2NjY2NjY2NjY2SXSInJycnJycoKCgoKCcpWmNiYWJhYmJiYmJiYl6MrKmpqampqampqampqqNoZGVlZWVlZWVlZGRkYYayr6+vr6+vr6+vr6+xoWJhYmJiYmJiYmJiYmJbr+/p6enp6enp6enp6enn2djY2NjY19fX19fX19fX19fX19bW1tfX19fW1tbW1tbV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbV1dXV1dXU1NTU1NTWo3txZElbYE5OVU9AQT89REI+Oz06OTs6PT07PDs6OTg5OTs8Ozw8Ojo7PDo7QD08PTxAQTxBQTs7PEA/PD1CP0RDQ0U8PkJERkpMTEWN3NXV1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjNzcXCw8PDw8PDw8PDw8PCydDPz8/Pz8/Pz9DQ0NDQz87Ozs7Ozs/Ozs7Oz87NzMzMzMzMzMzMzMzMzMvJycrKysrKysrKysrKysfCw8PExMTExcXFxsbGxsvMy8zLzMzNzMzMzMzLz9HR0tLS0tLS0tLS0tLRzczMzMzMzMzMzMzMzMvP09PS0tLS0tLS0tLT09HNzc3Nzc3Nzc3Nzc3NzdTY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NfX19fX19fX1tfX19fX19bW1tbW1tbW1tXV1dXV1dXV1dbV1dbW1tbW1tbW1tXV1dXV1dTU1NTU169/cF5GXmJQUVdOR0ZDQ0lBPz07PDo8OEBCPD04Ojo4OTg7Pzs8PDs7PDw8PD87PD46Pj44PkI8Pj1BPjw+QkBERUNAPD5APkNJSUtEh9zV1tbW1tbW1tbW1tbX19fX19fX19jY2NjY2NjYzs3P0NDPz8/Pz8/P0NTQ0M7MzczP09LSzs3P0s7Ozs7Ozs7Q1NLPz9DU0s/Pz9PSz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0NDR0dHR0dHS09PU1NTU1dXV1tbW1tfW1tbX1tfX19fX19fX19bW1tbW1tbW1tbW1tbW1tfX1tfX19fX1tbW1tbW1dXW1dbW1tbW1tbW19bW2NjY2NjZ2dnZ2dnZ2dnY19jY2NjY2NjY2NnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjX19fX19jY19fX1tbW1tbW1tbW1tbW1tbW1dbW1dbW1tbW1tbW1tbW1tXV1dXV1NTV1di4gm9XSl9jUlFaS0hBQTxCPT07Oj4+PD4/PT0/Nzk6OTk3OD48PD47Ozw7PDs/PT0+OTs7OT0+P0A+QD07OkI/QkNCPz0+QD5CRUdKQoDc1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2M7Ozs7Ozs7Nzc3Nzsqfys3Nzc3QuYOEi8fTwJrLz87Ozs7Pypal0dHIlKfS0ceSq9HOzs7Ozs7Ozs7Ozs7Oz8/Pz8/P0NDQ0NDQ0NDR0dHR0tLT09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbV1dXV1dbW1tbV1dXV1dXV1NTU1NXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NfX19fX1tbW1tbW1tbW1tbW1tXV1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXYwIBuVU9gY1dZW0xMQ0A9PTs9Ojw+Qj5CQ0A8Ojg5ODo6Ojc7Pz4/PDw7PDo5Pzw8PTg5PD9BPj09PUFAPTtBQkBCQz47QD9BQUlHSkF629bW1tbW1tbX19fX19fX19jY2NjY2NnZ2djY2dnOzs7Ozs7Ozs7OzdKpj63Rzs7Ozpu3tqSiwJOerNPOzs7Pz5yqna3RmaycsNGZrJqy0s7Ozs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0dHS0tLT09TU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dbW1tbW1tXV1dXV1dXU1dXV1dXV1dXW1tbW1tbW1tbW1tfX19fX19jX19fY2NjY2NjY2djY2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2dnY2NjZ2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV18h/b1pTYWVeXVxPSkQ9QD8+Ozc6Pjk/RD9BOTg3ODk7Ozw4OT89PTw9PD47OkE7OTs5OzxDQDw7PT5AQT49QkQ/QkM9PT8+Pz5ISUg/ddrW1tbX19fX19fX19fX2NjY2NjZ2dnZ2dnZ2dnZzs7Ozs7Ozs7Ozs/Inrym0tDQzsqgl36Cw6abr6fUz8/P0MuUiJqdxJSInJ7EkoadnM7Pzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dLS0tPT09TU1dXV1dXV1dXV1dXV1dbV1dXV1dXV1tbW1tbW1tbV1dXV1dXW1tbV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2djY2NjY2NnZ2dnZ2dnY2NjY2NfX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dbV1dXV1dfNiHNdWGloXl9gT0lGOkFAPj88PDo2P0JAQjo2NDc6Ozo8Ojk+PD49PTs/PTxBPjw8Ojw8PTw6PEA9QEI+PkFCPUNDPT0+Oz9BRUtIQHDZ1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2c/Pz8/Pz87Ozs7SrKWnqdXAvNLHnY+ey9PJipmq1M/Pz8/RvciZmcK/yZiYxbzJl5nG0M/Pz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0dHS0tLS09PT1NTU1dXV1dXV1dbW1tbW1dbW1tbW1tbV1tbW1tbW1tbW1dXV1dXV1dXW1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnY2NjY19fX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0JB1W1tqaWFeXVNOSTxDQEE+QD46OEZBP0M6NzQ5Ojo5Ozs4Oz0/Pj49QT08P0A9Pjw8PDw8Oj1AQD8/PT5CQD9AQkA8QD0+QUVLRz9r19fX19fX19fX2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnPz8/Pz8/Pz8/QzJ2Nl6zQmpfKxZ6ynpbN1q2ZqtTPz8/Pz9KXlJ/M0pSWn87RkpmgztDQ0M/Pz8/Pz8/Pz8/Pz8/P0NDQ0dHS0tLT09PT1NTU1NXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX19fX19fY19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tKUcl5ea2tqZV1PTEc/RENDQDo9OzxCPD49OTY0Ojk5Ojo5Nzs/QDs8PUA8PEE+PD07PTw/PDo8Q0A+PTs9QD5CPkBBPkA9QD9GSUQ/ZtXX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2traz8/Pz8/Pz8/P07GigJuvyaCjv8qcpYynrdiqmarUz8/Pz9Ozm8SY2a+fwpvaraO/ndXQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1NXV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dbW1tXW1tbW1tbV1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbSk3BgXnBoZmVaUUhHQkVDQEA3Ojo8Pjo8OTc2NTk6Njo8Ozc8QEA8Ojo9Oj0/Pj08OUA8PDo6OT9APj08PUBBQz9APz5BOz9ARkpCP2LS2NfX2NjY2NjY2NjY2dnZ2dnZ2tra29vb29vb28/Pz8/Pz8/P0M6fkGyclteqo9PSrqa1mJ/Vqpmq1M/Q0NDRzo2QnsPOi5Oex8uIlZ7I0tHR0NDQ0dHQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1dXV1dbW1tbX19bW1tbW1tbW1tbX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfW1tfX19jY2NfX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX1tbW1tbW1tbW1tbW1tbX19fX19fW1tbW1tbX0pNuYFxxZGdkWlVKQENGQ0FCODs/PD07PDw4NTU4OTY4Ozo5PDo+Pzw9PTk8Pz49Ojo+OTw6Ojg+Pzw9PTw+QEFDQT48PDpCRERKRkJd0NnX19jY2NjY2NjY2dnZ2dna2trb29vb29vb29vPz8/Pz8/Pz9G9n8O31pfA09HQ0srSzZeb1KqZq9XRz9DQ0cvaqJmvz9ulmbPQ26KZtdXR0dHR0dHR0dHR0NDR0dHR0dHR0tLT09PU1NTV1dXV1tbW1tfX19fX19bW1tbW1tfX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19fY2NjY2NjY2NjY2NjY2djZ2dnZ2dnZ2dnZ2dnZ2drZ2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fX19fX19fW1tfX1tbX19fX19fX19fX19bW19GRbF1cb2doYl1PRkBISUdFQDw8Pj48PT48NzU2Ojk3OTs6Ojs4QD86PDw5PD49Ozs6Pzk/Ojs5PT49Pjw7PTxAQ0I/Pz47Q0ZGR0hEWc3a2NjY2NjZ2dnZ2dnZ2dna2trb29vb29vb29vb0NDQz8/Pz8/Pz5V+e6WS1KKa08ySl6ObodirmavV0pem1cmOpZqgq5GnmaCtkKiYnrvV0dHR0dHR0dHR0dHR0dHR0tLS0tLS09PU1NTV1dXV1tbW19fX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tbX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2tnZ2dnZ2dnZ2djY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX1tfPjGRWXnBrXGBgTkVITUlJT0M+OkI9PUBCOzU0Nzw6Nzo7Ojo7OT09OTo6OT0+Pz07OT47PDo8Ozk+PD47PD0+QENCPz5BPEFDR0ZGRVXJ29jY2NnZ2dnZ2dnZ2dra2tvb29vb29zc3Nzc3NDQ0NDQ0M/Pz9DR1aeZrcmjqL7KnbGdo7XZqZup2Lirocq7oaann7GkpKigr6eiqZzQ09LS0tLS0tLS0tLR0dHS0tLT0tPT09PU1NTV1dbW1tbX19fX19fX19fX19fX19fX19fX19bW1tbW1tfX19fX19fW1tbW1tbW1tbX19fW1tbW1tbW1tbX19fX2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2djY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fX19fX19fX19fY2NfX19fX19fYzYZdV2JvZE9dVEtIRlNRS0xAPj1EPD9DRj01NTc7OTY6Ozo8PTo7Pzo6OTg6PT0/Pjs/Oz49Ojs5Pjs9PD0+QURCQD8+PzxAQUVHRURSxdvY2dnZ2dnZ2dnZ2tra2tvb29vb3Nzc3Nzc3NzQ0NDQ0NDQ0NDQ0NO5gL3Tm5bP1LWLkZ/T1LyBu9TOlKDT056QjbbWnJGOutWakY6+1tLS0tLS0tLS0tLS0tLS0tLT09PT09PU1NXV1dbW1tfX19fX19fY2NjY19fX19fX19fX19fX19fW1tbX19fX19fW1tbW1tbW1tbW19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2tnZ2tra2tra2tra29ra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2NfX2ct+WlVqaltMX01KTEpVTEZCPD0/R0ZIS0g9NjU3Ojk3OTo7Ojw9OT45OTo4Oz0+PkE+PTk8PDo9Pj46PTk5Oj9FQUA+PT8/QkBHRURFUMHc2dnZ2dnZ2dna2trb29vb29vb3Nzc3Nzc3dzc0NDQ0NDQ0NDQ0NDQ0cHR0crI0tDUxLjS0tHSwtLQ08fM0tHSusTV09O5x9bT07jI1dLS0tLS09PT09PT09LS0tPT09PU1NTU1NXV1dbW1tfX19fX19fX2NjY2NjX19fX2NfX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29va2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2djY2NjX19fX19fY2NjY2NjY2NjY2NjY19rHd1xSZ2laTlpOTFBRV0VKPz89P0FFTExBPjc3NTs4ODk5Ojs8Pjw+ODo6OTs+P0A9Pj46NTo6Oz0/Ojs5Ojw+QkJAPz8/P0FCR0RDRE683dnZ2dnZ2dna2tvb29vb29vb3Nzc3Nzc3d3d3dDR0dDQ0NDQ0NDQ0NDS0NDR0dDQ0dPU0dHR0dPR0dHS0tHR0tXU0tLS1dTT09PW1NLS0tPT09PT09PT09PT09PT09PU1NTU1dXV1dbW1tfX19fX2NjY2NjY2NjY2NfX19jY19fX19fX19fX19fX19fX19fX1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tvb2tra2tra2trZ2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2trZ2tra29ra2trZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjbwXNYVWlrU0xSTlBSWVRGSTw+Qz9BQkVLPj43ODY5Njc4OTk7Oz0/QDw9ODk7Ozs/Pjw8OTU6PT47OTk7PD8/P0JCQT1BPUBBQkZCQkJLtd7Z2dra2tra2tvb29vb29vc3Nzc3Nzd3d3d3d3R0dHR0dHR0dHR0dDQ0NDQ0NDQ0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tPT09PT09PT09PT09PT09TU1NPT1NTU1NTU1NXV1dXV1dXW1tbX19fX2NjY2NjY2NjY2NjY19fY2NjX19fX19fX19fX19fX19fX19fX19fW1tbX19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2NjY2NjY3LxvVFRsbExLUkpUUlVLRkQ6PkdEREFERjw/ODk6OTY5OTo3PD07PkA9PTc5Ojs5Pjs5OTY2Oj1AQT47PDk6Pj9DQT4/Qj0+QkNFQkFCSrDe2dra2tvb29vb29vb29vc3Nzc3Nzd3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0tLS0tLS0tLS0tLS0tLS0tPT09PT09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1tbW1tbW19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19fW1tbW1tfW19fX19jY2NjY2NjZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2dnZ2dnY2Ny2a1NbcGtLVVdSXFFXSEQ+PEJKRT1ISj89PDc4ODo1OTg5Njs+PD1APDw1OTk8Oj87OTk0ODw9PUFBPD47Ojw+QD89PkE9PUNGR0I/Qkmq39ra29vb29vb29vb3Nzc3Nzc3N3d3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHS0M/U0M7P0tLT0tLS0tLS0tLS0tPT09TU1NTU1NPU1NTU1NTU1NTU1NTU1NTV1dXV1dXV1dbW1tbW19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19jY2NfX19fX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dndsGRTYXJfT1pUV19RUkdCPUVJTEFBTEQ/Pzs5ODg5Mzg2ODY5Pj0+Pz06Njo7Pjs9PTo5Njg6PTtAQDxAPz0/P0I+PD48PEJFSElCPkNJpODa29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3t7S0tLS0tLS0tLS0dHR0dHR0dPT0bm7zLqbnLrQyNPT0tLS09PT09PT09PU1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2NjZ2dra2tra2tra2tra2tra2tra2tra2tra29va2tra29va2tvb2tra2tra2tra2tra2trb29vb29va2tra2tra2tra2tra2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ3qpfVWBuW1VZUVpeT0xHQ0ZNSUZEREo7QUE7PDg4NjQ4Njk4Nzw/QT89Ojc8Pz48Pz87OjY4OD09QEE9QD5BQD1AOjs6Pj1BRUdKQkBDR57h29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e0tLS0tLS0tLS0tLS0tLS0tO+wMqaoKKViJGeqpOpz9TT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fY2NjY2NnZ2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dna2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2tvb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2d6iXFVeblheXU5aUFROQ0NMSUlJRkpEPEJBPDs4NzY3OTc3OTk9P0E/PDo5QD88PkI/Ojg3NzY9Pz9APUBBPz88PTs7OD48P0VJSEE/Q0aX4dvb29zc3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3tPT09PT0tLS0tLS0tLS0tTIlZyum5m1iX2TjIKBhMTV09PT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tvb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dndmlpYYW5ZYVdPV01QRUJETElNS0ZJRT5CRDk4ODY3OTc1Njk4PT1BPjo4OT4+PD9APzw1Njc2PD4/PjtAQEA/Pj4/Pjs/PkFCRkdCQENIkeLb29zc3Nzc3d3d3d3d3d3d3d7e3t7e3t7f39/U09PT09PT09PT09LS0tLTz6h+kayPko6MhoCIiYSQo8rU09PT09PU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY19jY2NjY2NjY2NjY2NjX19fX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2tra29vb29ra2tra2tra2tna3JJaWWNuWlpSVV5QTDxAR05IUklIRT47SEY4OTc1Nzg3NTg5ODs+Pj07ODlBPj1AP0E+NzU5Njs+QUI/P0BAQkI/Pj8+QUBEQUZIQj9FSozi3Nzc3Nzc3d3d3d3d3d3e3t7e3t7f39/f39/f1NTU09PT09PT09PT09PWtaWaiIuQhYCFi4iBg4qLf4bC1tTU1NTU1NTV1dXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2dnZ2dna2dra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29ra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb2tra29uIWltnalxYTFpfVkg6TEhMSkpDRUVDQExINzo3Njc4ODU4Nzg5PDw7Ozk4QD89Pj8/PDY3PDQ3P0JCQUBAPz8/QT09P0A+QEBGRT09REuI4tzc3Nzd3d3d3d7e3t7e3t7e3t/f39/f39/f39TU1NTU1NPT09PT09PUxZKCg4WGfYGCfXx5foGCg36k29bU1NTU1NTV1dXV1dXV1tbV1tbW1tbW1tfX19fX19fX19fX19fX19jY2NjY2NjZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vc3Nzc3Nvb29vb29vb29vb29vb2tra2tra29vb29zb29zb29vb29vb29vb29vb29vb29va2tvb29vb29vb29vb29vb29vb2tvZgFpebWhaU0ldW1hKRE1ISlNMR0ZBQD9KQjg7NjY5OTc1ODY4Ozo7Ojw5OD09O0A9Ozo2NTw3Oz1CQEFBPD49QEE9PEA/Pz5CREU+PERLg+Lc3d3d3d3d3t7e3t7e3t7f39/f39/f39/f39/V1dTU1NTU1NPT09PT2LKEkKh9g3l2hIh/e3d5gn5+i67A1dTU1NXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dna2trZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2tra2tra2trb2tra2tvb29vb29vb29vc3Nzc3Nzc29vb29vb29vb29vb29va2trb29vb29zc3Nzc3Nvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc1nlcWmxmWFJPYFFSQUhHSkZYTEZAQENDSz87Ozc4ODc2NTc2ODo5PDw6PTs/PTs9Pjw7ODg8OT0/QkFCQzw8P0FCPj1BQkNCREVDQDtDTH3h3d3d3d3e3t7e3t7e39/f39/f39/f39/g4ODg1dXV1NXU1NTU1NPU0ruen3WKeXuIgICChYGDcnOAhYOMrNfV1NXV1dXW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NnZ2dna2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra29vb29ra2trb3Nzc3Nzc29zc3Nzc3Nzc3Nzb29vb29vb29vb29rb29vb29vb29zc3Nzc3Nzc3Nvb29zc3Nzc3Nvb29vb29vb29vb29vc3Nzc3Nzc3Nvb29vb3dByXV9wZVdLUGNPS0JHQ0pIS0ZBPEE9SFBBOjo3Nzg3Njc4Nzw6OD09PD47QD88Pz07Ojs5Ojk8QEJAQkNAPUFAPz1AQkNDQUBAP0A7RU144N3d3d7e3t/f39/f39/f39/f3+Dg4ODg4ODg4NXV1dXV1dXV1NXU18h4i4V8goh6g4SBfoKCc2l0hYuGkJ3U1tXU1dbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tvb2tvb3Nzc3Nzc3Nvc3Nzc3Nzc3Nzc29zb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb297KalxjcWVST1heSz9HTElPS0VAPkFCP0lPPjk6NzY7NzY6Ozc7Ojg6PDw+Oz09Oz48Ojs4OTo4OUFCQkFAQDtAQj06PkFCQz8+PT4/PUZOdN/e3t7e3t7f39/f39/f4ODg4ODg4ODg4ODg4OHV1dXV1dXV1dXV1s6dhpl+f5OTin+CgXx9gnNxm4mAgoOJwNnat7TQ19bW1tbX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tra2tra2tra2tra29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NvfwGNaW21gVlBTU0pETEhNSEk8PkFEQ0ZORDw8OTc5OjY4Ozk3PDk4OTw9OzlAPjpBPzw3NTc7ODpAQUVBPz45PUI/Oz1CQkI6Pj07PT5GTnHe3t7e3t/f39/f39/g4ODg4ODg4ODg4OHh4eHh1tbW1tbW1tbV1tjLioCHhYOXjHh7e3lvfYF1a3ebdHZ7eInHxpiMrdjZ19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2drZ2dna2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tra29vb3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29zb29vb3Nzc3Nzc3Nzd3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3Nzc3Nzc4LdjV1lrYlJNVVFMSktGS0ZDQD5CQT9FTT4+PTg5OTo3OTo3NT03Nzo+PDs7Qjw5Pz05NjY4PTk6QEJGQD49PEBCREA9QD9DO0A9PD4/Rk9t3N/e3t/f3+Dg4ODg4ODg4ODg4OHh4eHh4eHh4dbW1tbW1tbW1tfVrYZ6d32rn3l4entzdH+Dfm9xe3l6c3t2k4qFgImkzdnY19fX2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tna2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29vb29vc3Nzc3N3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vc3Nzb3Nzc3Nzc3N3d3d3d3d3d3dzc3Nzc3Nzd3d3c3Nzc3Nzc3N3d3d3d3d3d3d3d3dzc3OGtYVtebGJSTVZMTUdLS0RGQkI7QT08RUxDQT44Ojk6Nzc5NjY6NTs+QDs9Oz89PD89Ojk5Ojw5PEVDRkA/PkBDQkQ9OT0/QT1CPz1APkdPadvf3t/f3+Dg4ODg4ODh4eHh4eHh4eHh4eHi4uLW1tbW1tbW1tfQmH+Qh4N9eoN2e3Vzenl6kKqmd3JyfoeHh4CAfoKEhJHJzNnX19jY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra29va2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2djY2NnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vb3Nzc3N3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzb29vb3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3dzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3NzhpV9UYm1iUE9TSUhHRkpJSUJBPkJCPEVFREA+ODo4Ozc3Ojc4ODY+Pz07PDk9PDo+PTs6Njc7NjpEQUY+Pz8/PkNBPzs9PT47REM/PjxIT2fZ4N/f3+Dg4ODg4eHh4eHh4eHh4eLi4uLi4uLi1tbW1tbW19jYyH52doN+fnR2eIaCenl1d5yhu6GEgoCAfoeKinx/gYaMnKjO2NjY2NjY2NjY2djY2NjZ2djY2NjY2dnZ2dra2tra2trb29rb29rb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3d3d3d3c35pbT2drXFBRUElDT0pLR0xHSkJAP0FHREBBPDg8ODg1ODk3Njc3QEA/Ozw5Pj04PTw8Ojc4PTk/RENGPkE/QkBDPzw6Pj0/PkVEPz07S1Fj1+Hf4ODg4ODh4eHh4eHh4uLi4uLi4uLi4uLj49bW1tbW19XB3LRueHJze3B6eXaFiIR7eH2AgZiljH98fnuRhZaLhoGDgY6Rvd3Z2NjY2NjZ2dnZ2dnZ2dnZ2dnY2dnZ2dna2tra2trb29va2tva2tra2trb29ra2tra2tnZ2dnZ2dnZ2dnZ2dna2trZ2dnZ2dra2tra2tnZ2dnZ2dna2tra2tra2tra2tra2tra2trb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t3d3d6NWFdobllQUUtISlNJTUhNSUtBQz9DRkJBRDo6PDg2NDg4NzY2Nj8+Pjo8OTw7Oj09PDw4Ozw7RERERT4/PkI+Qj84PT8/Q0NCQEE+O0xUY9Xh3+Dg4OHh4eHh4eLi4uLi4uLi4uLi4uPj4+PW1tbW1teslLZ6eHJvd5V7dHuLgHh1bn6Fg3t/hYhyfH2bnI6JioJ+g32Hk5rH1NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2trb29vb29vb29vb2tra2tra2tra2tra2tnZ2dnZ2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2trb2tra2tra2tra2trb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d7Zf1lgaGxcUUtHR09LTk5PTURGQkg/Q0hEREA6Ozs4NzU3Nzc4NThAPkA7PDk8Ozw+Ojk7OTk7OUZERUI8QD4/PEBDOz5AP0A/Qj8+OjtKVWPV4eDg4eHh4eHi4uLi4uLi4uLi4uPj4+Pj4+Pj1tbX19vKhYR3cXJubniVhHt4hH95dnB4c3eLkY6CdnN9ioaId3d1d4ODfIiIk8Pb2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2trb2tvb29vb29vb29vb29rb2tra2tra2tra2tra2tnZ2dnZ2dna2tra2tra2tra2trb2tra2tra2tra2tra2trb29vb29ra2trb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f0nVZaGlqVk5KSE1OR01EUElGSD9FPUZMREM+Ozs8OTc3OTY2OTU4Pj4/PTs8QDs9PDo3Ozc5OThHREVCPUE9Qj8+QDw/QUE/QEJAPjs8S1Ri1OLg4eHh4eLi4uLi4uLi4+Pj4+Pj4+Pj4+Pj49fX19fEknuJf29sbnV2foSBg4qGfnVybWVtiIaKjoR7c4OHint4e4OPj4GEioqxztrZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29zc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tvb2tvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3dzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f3t7e4clsW2pqalNOR0hOT0VIRk1JSUA7RD5ISUA9PDo6Ojg2ODo3Nzk0OD08PT07ODw8PDw4Njc4OTo6RUJFQT9APEI/Q0M+PkNEQUBAP0A8PUtRYdPj4OHh4uLi4uLi4uPj4+Pj4+Pj4+Pj4+Pj5OTX19fZqXaFfnx3bHB3eXh8jH2KhYB3anN0d3p9bot7fnl6foR/gIGDfnh8foeGlrbT2tnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra29ra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/e3uO9amFpa2lRTkZNTEtKWE1OR0FAQE9BQz9AOzw4OTk5Njg2NjY4NDs+PD07OTY6Ojk6OTU4OTg5OkJERj8+Pj5AQEBCPzxBQD88Pj9BOT5KT17S4+Hh4eLi4uLi4+Pj4+Pj4+Pj4+Pj4+Tk5OTk19fX2sqKhIB5c29tcXN1d4CUeHaAfHWHhXd1cnWgmXp7d3Z5doR0bWxue3iAmouTu9za2tra2tra2trb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc29vb29vb2tra2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f397js2lpbmloUFBPTExPUk9LU0Y/RURERD48PDg7ODc5OTU2ODY2NzM6Pjs+PTc6Pjk5OTk2Ojo4NzxDRUc/Pzs/PkA9PkE9Oz0+OUFAQDhBTlFc0OTh4eLi4uLj4+Pj4+Pj4+Pj4+Pk5OTk5OTk5NjY2NjauY6AenZ1bmpveHCBfWt0cnZ3hIV5h4d5lY55eXp1d3pza298gHx2fYh8gLLe2tra2tvb29vb29vb29vc3Nzc3Nzc3Nzc3dzc3Nzc3Nzc3Nzb29vb29rb29vb29ra2tra2tra2tra29va29vb29vb29vb29zc3Nzb29vb29vb29vb29vc3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3t7e3t7e3d7e3t3d3t7e3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/f39/f4qpqa2hrZFNQT0ZQVFJOSFJLPkREQ0I7Ozk6Ojg2Nzg1NjY4ODg0Oz88Pzw5PDw3Ozo6Nzo6Nzo9Q0JDPUE+Pzw5PT5BQDs8PDtFQD47Q05TXNDk4eLi4uLj4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTY2NjZ1p5vdntveHh2cG50d3BwdHBzb36Jc3qGhY2EenNtcoB6hn1vg5OBdnx9g4a13drb29vc29vc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29ra2tra2tvb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4N/f3+KgbWhma2ZVVlJHUFFOS0xMRUJIRUc9OD08Ojo3Nzg2Nzc2NTY3NDg+PD09Ojg6OD46Ozc4Nzc6Oj5DRDtDQj49OD1AQUM/Pjw+RTw+PUJNUF/S4+Hi4uLj4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk2NjY3MB2doCCfnp4eHBsdXlya399bHNvdGdoaYB/aWl4c2d+iYl4cIKGe3d9foWKvd3b3Nzc3Nzc3Nzc3Nzc3Nzc3d3c3Nzc3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODflGttZm5mU1NJUFlUTEhGTkZGRUJGPTs+PDs5Nzc4NTc5NjQ1NzU4PDs9Pjo6OztAOTs7ODc6OTlAQkE8QUE/Pzk/QEJFQ0FAQEM7Oz1ES01g1uTi4uLi4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk5NnZ2tmYc3uqhJaCcnR1dn14aGx8d2h4d25rcHR5gIJ3dHyBhIJ9c3CAin94gn95g8je3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f4N/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh24tubWdzY1lRTVVbV0hDSUZOS0dCRD8/Qjo7OjY2NzU2NzY0ODc2Ozw7Pj86PDk8Qjg3OTo6Ojk6QUFCQUJDQEE+PT9CQ0NEQUJGOTg9REpOYtjk4uLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXZ2drcqHGCtXiRfnNsem6EgXaCfWtoan+DeHZ8dX2FhXRmcHl9d316gIqFe318foC03tzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3dzc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3Nzd3d3d3d3d3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e397e3t7e39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4ODg4ODg4tiFb3FrdWFWT1VVXE9ETUY+SkdKRUQ8P0I6PDk4Njg0NTY3NDc2NDk7Ozw7OD47PEE4ODo9OD04Oj09QEBAP0FCP0A+QENCQ0FBRTc2O0RMTmPa5OLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXl29ra3Z5sbnNxhY1ybXBuf391hH5rcnZ2enN4gXhzb3VwbWt2fHmFiIB/f392coODsd/c3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eDg4eHh4eHh4eHh4OLXhW1xb3ZeUldTWlpRSkhDQFFAQkQ8OT9BOjw5NzU3NDU2NjQ3NTY9PDo9PTk+OjxAODo6PDY7OTs+PUJCQjtBQkBDQEBEREM8PUA3OjxFS01l3OPi4uPj4+Pj5OTk5OTk5OTk5OTk5OXl5eXl5dPOxsB+cWxveHt2b3VuanNzbZKGeG50dG5vdIZ/b2twboJ0bXZyfY2DdnF/d3mKgabf3Nzc3d3d3d3d3d3e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3dzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t/f3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi1oZucG1xYFJZUFdfWUpMTElSP0Q9OTtCRjs6OTc0NTY1NzU0NjY2Pj07Pz45PTk7Pjg9Ozo0ODtAQENCQ0FCRkE/Q0BBQkREOz0+OTs8QkxNZODl4+Pk5OTj4+Tk5OTk5OTk5OTk5eXl5eXl5eW5t7Woc3JscHd6dHd4bXFydXd/hHRyc2xsa3F8bnBudGuBf3GAd32Eg355gHNygYqg2d3c3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh49WHcWxqbF5YWlVXYFZWUE9QTD1BOjs8RkE4Ojg3MzY1Njk2NTg1Nz89Oz8+OT04Ozw5PTs7NTo9Q0JCPENDREREQUE/PkJDQzw9Pjg5PENLS2PN0dnh1sjY4+Tk5OTk5OTk5OTk5eXl5eXl5eXltbW2q3J5cm59f3Z1d2hqaGlwb3Zta2tnZWZxdG15gG5teXd2iHhxa2podXV5dHV/wd/c3d3d3d3d3d3e3t7e3d3d3d7d3d3d3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHi4uHh4ePVhnFwY2lhV1NZV19MUk9STUtAPjg5O0E+ODc5NjQ3Njc6NjY2NDk+Pzo8Pzo/OTo6Nzo9PDk5PEFBPTtBQ0VDRkA+Pj5BRUQ+QEE3OD5GSEpesrW4wbm1u8jg5eXl5OTl5OXl5+fn5+fm5ebm5ra2tbWOfX5weoR1cnZnYmNlbGtyb2ZpbHZtd4Z9hXlsbHd4a3ZwfH14c3V5fHd2h7ng3d3d3d3d3d7e3t7e3t7d3t7e3t7d3d3d3d3d3t7e3t7d3t7e3t7e3t3d3d3d3d3d3d7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4eHj1Yd1bl5uY1pUU1hXS1NLSk1SR0E4Ozs+PDk4NzU2NTY2OTY4NjY5Pzw6PT07Pzo7Ozk8PDs5Oj4+Pjs8PUFEQkNBQEBBP0JDPDw9Nzs+REVKXrG1tLW2t7e2y9rJ3uXl3eDi3tXU1tPU4OPg39+2treuh3t/bnmNenJ1bWNobGxtaXR4enF5enqIh4N6aWh9cWRvcXyGgX55e318e4an2t7d3d3d3d7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4uHh49aGdmxhb19dV1lcWlJQSEpXTEVHPUA9Ozs9OTY0NjU1NTg2NzY3OD87OT09PDw5OTw6Pjw6OTg+Qjs7Pj5AREBDRUFAQD0/QDw9PTU5PEJHRl2xtbW2uLm5ubq9uMPT0r3BwcC6u7y6u8TMxb/Dt7e3hGl1gX1ndYd5Z3Vxa2t5eHB3fH15bWl3e3h3bml1j4FwbHl4d3d9gXuGgnmAoNze3d3d3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODh4OHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4ePXhXJrZ3RhW1hYX15TVVVRVUpMRj9JRDs5PTY2NDc3NTc4Nzc3ODk8PDo+PDg8Oj0+OTs8OTs5P0E8PT9DP0FARUJCQTw9Q0A6Pjw1NDlER0dasbW1tre5ubm5ubm3ubm4uLm5urq6urm5urm6u7e3uX9ucHN6b3B/eXNuc3Vsc3Z4cXFwb2tvcX6Bc2mHhIF9dHOHdW11hYmBgHJ2hafd3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uHj14lxa2xyW1dXXWBUUVVUUFJPSkNATUE9Ozk2NTM0NjQ2ODc3Nzk6Pjs8Pjs5PDo8PDk8PTw7PT0+PUNEREBDQkE/QD48PkE8OD06NjY6QkpIWLG1tLa2uLm5uLi5uLe3uLi5urq5ubi4uLi6uru3uKx7cnhxf3ZzfnBsbXpyZ29sbW50cHt3d3Jyd3pvhpJ2f3x8enZ5fH9zfYdyda3T393d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4eHh4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi49eHb2pxalVWV2FbT1FSUE5XSURESUo/Ojk6NzUzNDk1NzY2Nzg4Ojw7PD46PDo6PTw5PDw9Oz09PDs9REdEQ0E8PDw8Pj5AOzg8ODE1OkFGRVautbW1tre4uLm4uLi4uLe4ubq5uLi3t7i4ubq7t7mqcnB4d3x7e4J3aG5xam9qY2lyf21zcn54dHFsanaAeX2AgH91doB1a4qLgHaR1d/d3d7e39/f3t/f3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f4N/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLi4uPYhm1sdGVWUFxnWE1YU1JRWUVDS1BOOzk4ODc1NTM5NTY2NzY4Nzk+OT0+OTw5OTw7Njg5OTo8QEA9PkBGQEJCQDo+PEE9Pzs7OzYxNjxCR0RQqLa1tba2tre4t7i4uLi4uLm6ubi4t7e3t7e5ure2tIlyd3h9iXxwem99c2hqbGdnbHRscXd0cWx2c3Fxd3FyfHl4g3Z7d2mLkYp9kM7f3d7e3tvY2drZ297f39/e3+De39/f3Nvc3N3e3uDg3+Dg4ODf3t7e39jS397f397e3t/f3t7f3t/f3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLi4eLi4uLi4uLi4uLi4uLj4+Lj4+Li4uPj4+Pi4uLi4+Lk14NoZ3VkVlVkZVdKWllXW1Q9RU1LSD04NzU3NjQzOTQ0Nzc1Njc5PTo9Pjw9PDk7PDk5Oj45PD4/PkFBQ0FFRUQ+OzxBPjw5PDs3Mzc+REhFSqG2tbW1tbW2tre4uLi4t7e4uLi3tra2tra3uLm2traLfXpsbHp/cGx5dm5qaGdlcXp4b2lvb3B1c21zd4Fnb32CgYNyf3lqcHJ6f6ng393Zy8a/vL2/vsLN0tDW3tnc4NfQzcPCw8PH1dfT2dzX1NjX0MfExce9vM/Kz87Y3djO3N3c2t3T0dze39/e397e3t7e4N/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eLi4uLi4uLf4uPi4eLg4d7W29/Sw8rJx9Hb3OLk4eHg2dre1sbExcTN2trf5OHi4trX3st9aWZxYVleZWFNTFRLUlpMO0hNSEZBPTc2NjUzNDY2NDg3NjU2OTw7Pj46Pjk5PDk3OTs7Oj49PEBAQ0RCR0ZCQT08Q0A9OTw7Nzc3P0RGRkaZtrS1tbW2tra4uLi4uLi3uLi3s7W2t7a3t7i5tba3opdxb29waW50dnFmZWNrbmdvcm1mZ2tygWVvdnyAeGRzj39zaHFyaWVlbm+w39HFv7u5ubm5ubq6uru6vc3Gw8e/urq6uru7u8HCvcHFvby/vry7urq5ubq6ubm6w8XDucDDwby/ube/z8/U3tjc3t/g3tLa4N/f4ODg39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eDg4ODg4ODg4ODh4eHh4uLi4eDh4uLi4uHa2t3RwsPCu8XT1uDdydPDrrnAsaqrq6uwtLbJ0sXRxLG4v7Srq6usr7S0vMzE1c60tLureGxtbWBdYl9ZS1NVVFFQREBRTUhEPzo3ODU3MzE1NjQ5ODQ2Njo8Oz08ODw5Njo6ODg5NzU8PDw/QEFAQkRDQkE8PkI/Pz09PTc1OD5DRUNAj7a0tLW1t7i4uLi4uLm5uLe1sautr7Oxs7OztLS0tqaei2tue3ZxeXhnY2hfcXdha25vaG99b25ja2lseHdsa4Z+bHB6dm1scG95sca8uru7urm5ubq6urq6urq6urq6urq6urq7u7q7u7y7urq6ubq7u7q6urq6urq6ubi3t7i4t7e2tbW1tbi3u8e+w8XHzcS4wMnH0tzZ2d/e3uDf39/f4ODh4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh3Nji4uLi4eHh4OHg3tfGxtHQztTe3tPO0t/SuLi8sq2trKysrrG+ua63rKipqamqq6urqqqqq6ysuKyqqqqrq6urra6urq6urryzrayrpHlub21fXl1dVE1SU1xUSkE/UElIPjg5NjgzNzMwNTczNzg1NzY2Ojw/PDg5Ozo6Ojg5OjY1OTs8Pj9EP0NFQkNCP0BAQT9APjw3ODc6QUVEP4W4tLS1tbe4uLm5uLi3t7SurKuqqq2urq6vsLGzs7WjcG5ucm1wg311aWFlaGZkY2Rxc21td25naW1tZXBzb29zcXN8h4F6dX11n7u6uru7urm5ubm6urq6urq6ubq6urq5uLm5ubm6urq6u7q5ubm5ubq6ubm6ubm4uLi3t7e4uLe3t7a2tbW2tra1tbW1tba1t7e3t7rBvrzGycrb3+Dg3tvd3d7h4tDW4uHg4ODg4ODg4ODg4ODg4OHg4OHi0768zNjd3OLg0dnbxL23sLCxsa+zu7uzsLS9s66urq2tra2sq6qqqqmpqKmpqampqqurqqqqqamoqampqampqaqqqqytrq6urq6urq6sraR4aWJxZmFZWlZRUk5cU0Y9QlJEQTc8OzY5NTY1NDU2NTg3NTY1Nzg7Pjw7OTk5Ojg3Nzk3Njg8Oz47RD8/Q0BBREE+P0M9Pjw+Ojo3Nz9DRj54srCztLW2t7i3trKurq2sq6uqqaqtraysrq+xs7S1t4xucnRqaIB5ZmpmZWxdaG5waGxxYmNmcoJ+dmhobGpueoaBhXx4cXF5gK+6ubq6urm5uLm5ubm5ubm5ubm5ubm4uLe3t7e3uLm5ubm5uLe3t7i5ubi4uLi3t7a2tre3t7e3tra2trW0tLW1tbW2trW1tre3t7e3t7e3tre4v8bP0MS+v8DE19e8ydra4OHg4ODh4eDg4ODh4eDb3t7Uzby3tre6wMDJxLfIvrKwsLCwr7Cvrq6ur7Cwr66urq6uraytrKurq6qpqampqampqampqKmpqKmpqampqKmpqKmpqqqrraytra2ur66trK2heWpjbWdiXFhRUFFLVEpCOklRP0E3PDk0OjU2NTQ1NTY4ODY4Njs6OTw9PTs6ODY2ODg6ODY3Pj09PT5BQUVCQkNBQUBBOj09Pz05Ojc9QUc8bKqmqKutsLGwrqupqKqrq6mpqamrrKytra2usLO0tbilgIdvaWdzdGZrcG1qZGxvcm5rbWNrcHyJhG5qbHx4Y3uKfnNqc25rcY+7ubm5ubm5ubi4ubm5ubm5ubq5uLi3t7e3t7e3t7i5ubi4uLe2tra3t7e3t7a2t7a2tra3tra2tbW1tba1tLS0tbW1tra2tra3t7e3t7i4uLe2t7a2uLm4uLe3uL6+uLq9vcfb4OHg2Nnd4eHg3dfKwcPCurm5uLe4uLi3tbS0tLKysbGxsLCvr6+vr6+vr6+vr66ura2srKyrq6yqqqmoqKmppqepqaehpaipqamoop+hoZyip6inqausrK2ur7Cwrq2unXdwbGphY2BZUU1RTFJGQzlNUEU+ODs3Mjc5Njc0NDM1ODg3OTc7OTo9PTw6Ojk3NDo5ODY1OD8/QEI9RENDQ0FDQEJBQDtAP0A/PDw6O0NIPWOopaWlpqioqKenp6ipqqmoqKipqqqsra6wsLCztLW1taWYdn5xZmt4cW9tZmVsaGNsZ2ZpaX11bWlvfXZ5hWZod294b3Fvcninu7m5ubm5ubm4uLm6ubm5ubm5ubi3t7W1tba2tre3t7e3t7a2tba2tre2tbW1tra3t7e2tbS0tLS0tLS1tLS0tLW1tba2tra2t7e3t7e3t7a2tre2tre3uLe2t7i4t7i4uLi4wMXTyry8w83PyMC9urm5ubq6ubi4uLi4t7W0tLSzs7KysrGwr6+vr66urq+vr6+uraysrKurrKysq6ehoJ6gn5udoaGdlpmkpKaon5mZmZmanZ+gn56fpKqtrq+ura2srJl1cGlrY2FeXVVOU0tSREQ4TktHQTo4NTI2OTY1NDczNzc3ODk3OTo7PT0+ODg4NzU6OTk1OD9AQEFEPkZBQkNAQkNCQT88QEJCQD0+OjpERj5cpqWmpqampqanqKenqKioqKenqaurrKytra2ttLS0tbekc311bnONf3JmanFjaW1jaGZobG51aV9jZ3VzdnpuZ3Bwcn56cYihu7m5ubm6urq6urm2s7a1uLm2trW1tra1tbW1tbW3tra3tra2tbW2tbW1tbS0tLa2t7e3tbS0s7O0tLW1tLS0tbW1tra2tra2t7e3uLe3tra2trW2tbW2tra2tra2tra3tra3uLi3uri4uLi3uLi5ubm5urq6urm4t7e3t7W1tLS0s7OysrKxsbCwr66urq6urq+vra2srKuppaSmpqScmZubmpmampmXl5eXl5aZm5iZmJmZm52en5+dnJ6gpKWko6OioqKQdG5jcGFeXltUU1RIVEo/PFFCRkM7ODYzNzo1NTQ4Mzg5OTc4OTc7OTs9Ozc6NzU2OTk4NTg+Pz9ART5CPz9DPzxBQUI/PT9EQT8+PTk9Q0Y/VaSlpqanqKeoqamop6ioqKioqKiqrKuqqaipq7W1tba5o3eKcXKHhnd0cGh5a2JjYWVsaW5zal9jZWNjZWprYmRqbHaXjX6ovbm3tre5u7u6uLWxrKurqq6wrKyrq62tq6uvsLGvr7CytbW2t7W1trW1tbW1tbW2trSvr7O0tLSvra6vsrW0tbW1tbW2t7e3t7e3t7e3t7e3t7Owsra1tLa2tre3tra2tbW1tra3t7e5uLi4t7e3uLi4ubq6urq5uLi3t7e1tbS0tLS0tLS0s7OysbCvr6+vr66vr62oo6KgnJqampqZmZqbm5qampqbmpmZmZiXl5aYmZmZmpycnZ+foJ+goKChoaCgoJ+fi3RuaXRdYGZeUlRLRFRJPUVTSEVCOzo0NDY5NDQ1NzM4ODg3ODk5Ojs7Pz04OjkzNTg5NjM5PT5AP0A6QEJCQkA/QEJCPz0+QUFCPz06PkVDQFGjpqWlp6inqauqqKaoqKipp6ioqKinp6ioqaq1tbe3t7KZtH99kIx1Z2lqbGZjYGNoZW94cGlicXx5cGpmZmRma3NqhYystrKwra2ttLeysLCtrKuqqaiop6ipqampqKinqKipqaeoqqurra2sqqytraysrq6traunpaSnqqyopKOkpamwsbGztbW2t7i3t7W1tre4t7e3t7Kppaasq6ivtLa1s7W3t7a1tbW2tra3t7e3t7a2t7e3t7m6urq5uLi3t7Wxs7S0tLKxsK6sq6yurrCxsK2rqqmqqKijnJqZmJmYmJiYmZmZmZmZmpqZm5ubnJybmZeYmpqcnJydnJ2foKGhoqKioKGgoKCfnop1amtuWVxhVktPREdVRz5PV0hEPTw4MzQ0ODQ1NDgyODk4ODk6Ojw5OUA8Njk6MzY3OTE0PD8/QEBBOkNGRUJBREJDQTo7P0FCQz9APUBEQ0BPo6empaemqKqqqqakpqenqKioqKimpqaoq6uttba3t7e4rbJ1cHuDdmBiaWtiZWZhZGdmfYh5bHKAfXFvcXhjbW5xZo+srKurq6ysra6urK2trKyqp6WmpaWlpqioqKiopaeoqKioqKeoqampp6Wko6KioqOioKKioaKhoKChoaKjpKOjpaWlqLC0s7OzsKuqqaqztLa3trGopaOioaGipKiqqairs7Sxrq6xs7W2tra3uLi3t7e3t7e3t7a2uLe0sa6ppqerrKmnpqWkpKSkpKWnqaajoJ+enZycm5uampmZmJeXmZmZmJiZmpqampqampqbm5mYmpydnZ2dnZucoKGgoaOjoqCgoKCfnp2FdGtsaFdYU0pHTUVITUdAU1dGRz09OTM2Mzc0NTU3Mzg6Ojo6OTw9OjpBPDY9ODM3ODgzNztAPz9AQDpCRUNAQkRDQT87PEBDQkNBQDxBQ0A9TqKnpqanp6mqq6mkpaWlpaaoqKippqanqKmpqrW2tre3t7izc2h7c2JnamtpaWJhZGloXV1tfHJma3J/fHR8bm1zc36gqamrq6uqq62trKusq6mpqKWjpKampqWmp6eqqaamp6enqKinp6iop6WjpKKhoaGhn56en5+fn56foKGho6Wko6OkpKSmp6enpqWkpaampqeqraumpKKhoaChpKWlpaenpaeoqKalpaivtLa3trW1tra1tbOwrKupqa6rqKWlpqampaSkpaWlpqWkpKSkpaKhoaGgnp2bm5ucm5qamZiXmJiYmJiZmpmZmZmYmZmZmZqZmZydnJycnJybnJ+fn6ChoaKgoKCfnZ2cgHNrbmReU0pITUZETEtFRFFTQ0c9PDgzNjI4NDY0NjQ4OTg6Ozk7Pjw5PTs5PTczNTk2NTY8QD0/QD88P0JDPkJCQj89Pj5CQ0FFQD86PkVAO0+jpqWkpqeoqaelpKWlpKWnp6eoqKanp6alpqa1tba2trW2uYptcW1vfHxxZ2pmYGFsYFROW2hqbm9tgYJ9cWdxdn6aqKeoqqmpqqurrKqqqqimpaWkoqOlpqalpaWmqaqppqWjpKWmpqSjo6KioqKgoJ+fnp6cnJycnJ2dnJ2en6CioaKjo6KhoqKkpaSioqOjpKSjpKSko6Ggn6GipKanp6ipqaelpaSipKSlqK2wsKyrqqusqqmnpaWmpaWlpaalpqioqailpaWkpKSlpKOjpKOioaGhoqKgnp2cnJubm5qZmJiYmJmam5mXl5eWlpeXmJiZmpqcm5qampubm5ucnJ6goKGgnp6enpycm356bnJiXlNNSlBFRk5NQkBPRT5JOz01MzYzODM2Njc1Ojs4OTs5Oj49Ozo5OT03NjY5NjU2PkI+PkE/PT5DQT5DQ0BAO0BAQkJCRUA+Oz5FPzxQoKSjpKOjo6SkoqSlpaSlpqamp6empqalpqaltLW1tbS0tbiBaHx9ZXOCemxwdWFfY1ROT1FbaGxpbGxxbW5xbnScoqSnqKioqauqqqqqqaempaSjo6OjpKSlpqalp6ytqaShnp2eo6Shnp6foKCenJ2dnJycmpqam5ucnJubm5ydnp6foKChoJ+goaOioKGjpKSjoqSlpaWkop+go6SkpKapqainpaGdnJ+jpaipqainqKioqaempaWkpKSlpqampqampqenpaWko6Ojo6KioqGhoqKhoqOkop+enZ2cmpubmpqZmJeXmJaWlZSUlJWVl5iYmpubnJuampqam5ucm5ucnp+fnpucnJyam5p/fnF0YFtUTUdNSEZMSj8/TkM8QDs8NDM4Mzc0NzY3ODs9ODo6OTk7PTs7ODk9Nzc4OTU4OD9APT9BPjs9RD89REA/PzpAQUE/QUVAPjw8Qz88Tp2ioaKioKCipaSkpKWlpqenp6empqampaampbW1tbS0tLS3jHalsXdmc3Jvc2xjZGlYT1JRT09dgG1kYFptkZGSoqKjpaampqenqKiop6alpaSjoqGhoaKjpaempqesrKemoJ2cm6Ghnpuamp2cmZiam5qampmZmZubm5uampqampucnZ6goaCfnp+hoJ6foqOko6Omp6inqKWioKGhoaGkpaWlpKCcmZmbnqOmpqampqanpqempaOlpKWlpqiop6enpaWlpaWkpKOjo6KhoqKioqKhoaKjo6Kgn56enZybnJubmZaUlJSTk5OTk5SUlJWWl5qam5ubm5qZmZqanJ2dnZ2dnZuampqamZqXf3dvc11aTkhKTkdFRklERU5APD09PDQ1OzQ2NDY1Njc5Ozg5OTg5OTw7PDc6Ozc4ODg1ODg/Qj9BQTw+P0A8PEJAQT49QT4/Pz1CQUA6OkA8PE+doqGfoJ+dn6OkpKSlpqeoqKenp6ampqampqW1tLS0tLS0tbSXtqd1Znh2Y2xjY2VjW1JTU1JNXqCMeFhodpajnp6hoaOjo6OjpKSlpqalpKSioaGko6OjoqOlpqWmpqenpp+bmpuioJmWlpWam5mXl5iYmpqYmJqampqbm5qZmZmenZ2goqOjo6KkpKWinqGhoaKjpaampaSjoaCgn5+hoZ+goJ2amJeZmpygpKOjpKWmp6alpaOjpKSkpKWnp6ampqampaWmpKOjo6SjoqKjpKGfoKGhoKGgoaCfn56dnZyamJeVk5KSkpKSkpOTkpOUlZaZmpqbm5qampqbnZ6enp2cnJybm5qamZmZlH10bHReWk9IRUdGQkVORT9GOzo+Pzs0Njo2OTM2NDY4ODo4OTc4ODo8Ozw5Ozs6OjY3ODk5Pj9APjw9QD5AOjlAQT89QT8/QUE+QUE/Ojk9PjpQnaCfnZucnJufoqOlpaWlp6iop6ampqanpqantLS0tLOysrGwsK2rkHiGj36bmn93Yl1TUlFRTGKgootaiKCgn52YmZycnZ2eoaGgpKenpqWkoqGjp6alpaKipaampaanpqagm5mboaCXk5OSl5qcmpeXl5iampmampqam5qYmJmaoKCgoKGfoaKipKamop6gn5+goaOko6Khn56enpyanZuZmpqZmJeZnqChoaKioqKkpaWmpKSkpKKioqKkpaWlpaWlpaalpaOko6KioqGgoKGgnp+fn5+fnp+foJ+cm5qZl5WUlJSTkZCRkpKSkpKSk5SVl5iZmpmZmpqam5+fnp2cnJycmpmZmpiXl5F8cmdxXl1QRj9BRD9KT0JCRjhDRT4+OTg7Nzc0ODQ1OTo6Ozk3OTo8Ozo8PT48PDo2NzY5OD4/QT47Pz49PDg6PkFAQUE/P0FCQERBPjo4PkE8U5ycm5uampycnaGio6KjoqSmp6alpaampqSjo7KysK2rp6amp6alpqiln6iop6qnoXmEXFFST0xcnKCAYpmgnp2clZOVlpeZmp2dnqGmpqampKOioqanp6ajpaampaWmp6amop2cnqGfl5GRkJSXm52YlpaWmJuZmpqampqZl5iam6Ghn56fnpybnJ6goJ6dn56fn6Cio6SjoqCfnp2ZlpeXl5iYmZubnqKioqKioqGio6WlpKOio6SioaGhoqOkpKSko6SkpKSioqKhoqGgn5+gnp2enp2dnZ2dnp6em5mYl5WTk5SUk5KQj5GSkZKSkZKTlJaXl5iYmZqampyenZ2dnJubmpiYmpmXlZaNempmamBiTkY+P0A9SkVAQ0A7QEE8Ozs5Ojc2NTg0Njc4OT04ODs6Oz87Ojs8Ojk6Nzc2ODs7Oz08Ojo8PTw3Oz5DQkRDPz1BQ0FEQT88OkBCO1eZmJqamZmam5ucnp2foqKhoqSlpKSlpqSioJ6op6alpqWlpaemp6ampqakpaanqKehqXJOUU1KVJahenKanJyenJeVlJWWmJiXl5qeoqKhoqOkpKOjpaalpaanpqSlpqalpaOgoKGhn5mSkI+WmpmenJaXl5eZm5ycnJqamZeZm5uen52cnZyZmZqcnZydnp6fn5+hoaCgoaKgn56bl5WVlZeanZ6fn6GhoqKio6OhoaCgoJ2cnaGioqOkpKOioaSlpKOko6SjoqKioqKhoKGfn52cnZ2cnJ2dnJ2enpqXlpaVlJOTkpKSkpCRkpKSkpGSlJWWl5iYmJiam5ycnJycnJ2cm5mYmZiWlJWXi3hsY2RiZFFHQT1DO0tIRDo7Ozw+OTo6OTo3Mzc5NTo4ODg8OTg7OT09Ozo7Ojk8PDc2NDc/PDo9Ozw/Pjw7ODxBQ0FDQkI+P0NAQkFAOj9APztZmZiampqam5ubm5ydoKGhoaGhoqKioqKhn5+dpKWmpqenpaWmp6ampqWkpKalpKSkpaaGUFJQT0+PmHB6mpubnJ6cnJycm5ubmZiYm56dnp6foKOkoqGhoqKio6SkpaalpKOjoaGhnpyalZOUmJuam56amJiYmJqcnpyam5iWmZybnJycnJydmpqbnJ2dnp6dnp6fn52cnJyhoaCblpWVlZacoKGgn5+hoKKjoqOhnZuZlpaWlpicnqCip6ikoaCgoqOjoqKioKCgoJ+fn5+gnp2cm5ucnZydnJmanJuWk5KSkpKUk5KSkpKSkpOSkpKRkpSVlpeYmJiYmZqcm5qbm5ucnJqZmJiXlZWWl4d3ZGdoZGJNQ0U8RDlJSkU5Ojs9PTo6ODg6NjQ3OTU8OTY4OTc5PDs7PDo6PDs6PDw4Nzg3Pj07Pj46Qj86Ojo/QURCQ0FBQD9EQUFAPjpAPj06W5qYmZqbmpubm5uen6CgoaKioKCgn5+enp2dnKWkpaanpqWlpqakoqKio6Oko6Kjo6KnllRYVVJOZ21rgZ6am5udn6Cgn56enp6dnJ2dnJ6enp+goaCfn6CgoKGio6Ojo6OjoqGgnpuZmZiZmZmamZienpiYmZmam5qWlZeWlZicnJ2cm52dnpybnJ2cnZ6bmJqeoaGdm5udoKKhmpWVlpaZoKKgnZueoKGjop+em5eXlJKSlJeYmZ2goqenpaGgn56goaGioaCfnp2cnJubnJubmpqZmpydnJmXmZaVk5GQkJCPkZKSkpKSkZKTk5OTk5OTlJWWlpeXl5manJubnJucnJqamZeXlpaVlZSEcmZsYmRbREJMPT84RktCPEA+Pj05Ozk6PTg1ODg2Ozg1Njo4PDw7Ozw8Ozk8Oj09OTU4Nzw5PD88OkE/Ojo6QEBDQkRBQ0A/Q0FAPj08QD09Ol+al5mamJeYmpycn5+foaGhoJ+fn56foKCenZ2lpKSko6OioqOjoZ+foaGipKOio6SiradXXl1UV19ua42dmpqbnJ6dm5ucnZ+enZycnJydnZ+goKChoaGgoKGgoKGioaGioZ+enJqampqbnJqZmpuZnJ6ZlpaWl5eTjo6QlJabnJuam5udn52cnJycnJ6dlpSZnJ+in5ycnZ+hoJuXl5mZmpycnJubnZ6fnZqXlpaWlJOTlJiampqfoKGmpqWgn56fnqChoaCenJubnJybm5ybm5qZmJmZmZmXl5iVlJKQkJCQj5CSkpKSkZGTk5aYl5STkpSVlJWWlZaZmZmam52cnJyampmXlpaWlpaQgG9vZV5gV0BKSDg/N0lFP0VBPD07Ojo8Ozs3NTs4Njs3NDY6Oj47Oj0+Pj07Ozs+Ozo4Ojk5NkBBPTo8PTo6OT9BQ0JERUM+P0FBPz8+Pj89PDtgl5WXl5aVl5mbnqGhoKGioqCenp6enqCgn52bpaWkpKSioKCfoJ+dnZ+hoqOjo6OkobCjXWVkYGFua4GenJubm5ubmZianJ2enJubm5ycnJ6ipKGeoKGhoqKhoKCgoaGgn5+enJqZmpubm5ybmp2dm5manJiXlZWWkY6Nj5KYnZycm5ycnqCdnJucnJyempWVm56foZ+dnJyenp2cmpqampqampqbm5qXl5aTkpWVlpWTlZaam5qanZ6foqWjnp6fn5+en5+enZ6fnZycm5qcmpqbmpiZmJiYmJiYlZSTkZCRkJCQkZKTk5CRk5SYmZiVk5SVlZWWlZaXmZmXmZqenpyamJiXl5aWl5eYjX1ubV9lVlRFSzw3PjdSRUM+QkE4Ozw7OTg6ODY7Nzc6Njc5Oj0+Ojw8PT49PD06Pz06ODw9OTtAPj4/PT45ODs/QkNAQ0VDPT9DQj5AQD5APTw8YZWSlJWWlpeanJ6goKCgoaCgnp6enp6gn56em6WlpKSioJ+fnp2dm5mbnJydnp+gn56rmGNpbW5pZm2enZybm5ybmpmZmZqam5ucm5uam5ygo6SgnZ6en6CgoKCgn6ChoKCfnpuamZqam5qbm5ufnpyZmJqamJiYmJKOj5OXnJ2bnJ2cnJycnZycnp6dnpqVl5ygoaGfnp2eoJ+cnJuampqbmpqYmpmVk5OTkpOWl5eVlJiYmZucnJydoJ+gnp6enp+fn56en6KjpKKgnp6cm5qampuZmJmZmJeXlpWUlJORkZCQkZKTk5OSkpOUmJmYlpWUlZaWlpaWl5iYmJiXmZqamZeXl5aXlpeWl4l4dmddX1dURUU5OTs8WT5AOEI/OTs7Pjk4Ozg6Ozc5OjU4OTs9PDk9Oz0+PD0+Oz8/Ozk+PDw+Pz5AQUE9ODc7QkNFP0FFQz1AREJBQEQ7Oz47PGKWk5SUlpWUlpiYmZubnJycnZ2cnJ2en56dnJqkpKSkoJ+enpybm5qZmJiYmZucnZ6cpolla3R4bVuFop2dnJydnJqbmpqampydnZ2bmpuboKKinpucnZybnJ2enp2dnZ2fnpyampucnZybm5ycnp6cm5qanZqam5yVkZOXm52dnJ2fnZycnJycnZ6fnp+cl5idn6GhoJ6cn6CfnJubm5qbmpmZmZmZl5WWlZaYl5eXlpaYmZuenp2dn6GhoJ+fnp6fn5+dn5+hoqKhoZ+fn5yZm5qcnZuampmXlpaYl5eXlpWTkpGTlJSTlJSUlJaZmJaVlZeZmJeYl5eXl5eYl5iXl5eXlpaYl5eVl5eDeHZfW11eUT1GOjk4P1VDQTtDQzo8Pz86Ojk3Ozg4ODc0ODk8Ozw4Ozs8PTo9Pjo/QT06PTw+PkA/PUBBPjk2PERDRUBBRUU9PkVERD9COzo8OTpkl5SVlZaUlJSUlJWXmJiamZqcnJydnp6dnZybo6Oko6CenJuamZqZmJiYmZiam5ubm6WJa3F2em9lmp+enp2dnJybnZ6dnJ2enp2dnJydm5ygoJuampubmpudnJqampucnJuZmZycnJ2dnZ2dnZ2dnpybmp+fm5ydm5mZmZudnZ2dn52dn5+dnJydn5+fn5uanZ+goJ+dnJ6gnpubm5ubm5yampuamZudnJqZmJeYmJiYmp2foKCgoJ+hoaGgoJ+en5+fnp6foaKhoJ+enp+enJqam5ubmpqZlpaXmZmYmJiWlJOUlJWVk5OVlZSVlpWVlZSYmZuamZaWl5WWmJiWl5OUlJGRk4yRkJOWfXhqYWJiXFA8QDw2OENWSERCOjg7Oj47Nzc5Nj06OTk2NDc6Ozw9OTo6Oz87PT08QD47Oz46PT89PkBBP0A8NztBQ0U/P0REPj9EREM+Qj07PDs6Z5aTk5OTk5OTlJSVlpeWl5aWl5mbm5ybm5uamaOjoqCfnpuamJeYl5eXmJmYmZybm5qkgGpqb3lzcZegnp2dnJydnp6enp+enp2cnJydnp2bnJuampqam5ubmZiYmpqamZmZmJqdm5ydnZ2dnJ2cnZ2cm5qdn5ucnJubnJubnZ2dnJydnp2enZydnZ2cnJ2dm5uenp6dnZybnpubnJycnJydnJubmpmbmpmYmZmYmpmZmpyfn5+jpaKfoaKioaGfnqCgn5+fnqCioaGhn5+fn52ZmpudnZqZmJWWl5aVlZaTkpOUk5STkJCSk5GUkY+OkJGOlZabmJWYlJmXlJiRjJCPk5yTkoyFjIeDhndxZ2pkW1xRQT44NkJHYEJFR0A+Ozw7Ojg4NjU8ODo4MzQ6Njk9PTk5Ojs9Ozw6PD48Oj5AOj5APjw/QD8+PDg6Q0FEPz5CRD8+Q0VCPUJAPDw8OmeYk5KSk5OSk5SVlJWXl5aWlZaXmZmZmpqampqkoqCfn52bmpmYmJiXl5iZmJmcnZ2cqH1nZXN7enOJop+enp2dnp6enZ2enZ6enp2dnZ6cm5ybmpubm5ucm5iYmJmZmJiZmZmbnZycnZ6enp6enp6dnZybm52bnJybnJ2dnZ2dnJ2dnp+fn52cnZ2dm5qbnJmZnJ2dnZ2dm5uanJ2dnJycnp2dnZybmZeVlZeXmJqam5ubnZ6foqOhoKGhnJucm5ubnZqcmZycn6CfnZiZmZmUkpKUl5SPj4+OkYyNiYuQi4mLjpGRj4mQmJiQkoyNi5KQj5iYoqiqpqWlrKOmoZqep6eyqKKVo6Cfl39wcWlsXFtcTUY8NzdHR1g+SE5URjk+Ojg5ODc1PTk4NzMzOTY6Pjw6Nzo8Ozo6Ojo8PDs/PjtAQD47PT5BPDw2N0A+QkA+QUY+PEFEQT1DQj49PDlmmJSTk5OTkpOUlZOVl5iYmJaXl5iZmZqampqaoqGfnp2cm5mYmJiYmJiYmZmZm5ybnKx/am16f3lxh6Genp2cnZ6enp6enp6dnp2dnZ6enJubnJubm5ubm5uZmJiYmJiYmJmZnJ2dnJyenp6enp+fnp6dnp6dnJydnJ2dnZ6fnZ2fn56goJ+enZ2dnZybnJ2em5qbm52enZ6dm5ubnJ2cnp2cnZqYl5SRjo+QkJGVmJSWlJiZmpudmJuYlY2Mjo6TkpKRj4mQjpGRjo+Ki42NjYiIi4+Lg42NkY+MkI2Qk5WVnJihoJySn6SipKmam5eanKOprb3Bwbq8uL26ucC8ubq3uru7tL2zwbV/bnVmZ1peWUxJRTo7TElTPFZSSUM6QTo7Ozc3NTo6OjgyNTY4Oz08OTk7Ozw5Nzo4Ojw6PT85PD8+PDw9QTs5NTg8O0A/QT9EPTxBQkA8REM9PT06YZOTkZCUlJOTk5OTlJeYlpeZmJmYmZqbmpqamp+gnp+fnJqZmpqampmYl5iZmZmZmZmphXB1e4B3b4mhnp6enp6fn56en56fn56dnp6fnp2dnJ2cm5ubm5ubmpiYmJiZmZiam52cnJ2dnp2enp6goJ+enZ6hoJ6dnp2enZ6fn56en6CenZ6enJydnZ2cm5qYnJuVmJqamJiYmJmSjJCXlKCXk4+MjYqKiImMiJORh5CPjYqKkJCLjoqMi4+IiImJjpGOjYaFiYaKhoWLiI+SkJCNkJKXlpKamJ2TlJ6kpqaqq7Gsr6+rpquqsbm5tbS0rqyvtMDIxcXBvsbDxMTDurW+t7a0s7C2tb6qcHRyXGZfXV1JRj8/RUtMVklcTEQ/PUI6Qzk5Nzc7OTk3MTc5ODo+ODg6PDw7OTc5OTs9Oj4/OT5BPDs+PD46OTY5PDpBPkNBQT08QkBAPkJEPj8+OVyHhIOHi42KiYaFgYqMkZOVmJiHlZaWkpiampmenZ+gn52ampubm5ycm5iWmJmXl5ibqo56dXZ7f3mCoJ+fnp+goKCfn5+foKCfnp2dnp+enp2dnJqbm5ybm5uYmJiXl5iZm5ucnJydnp6enpybm52dnZycoaGfnZ6dnZ2dnp2dnJiWlpaYlZWSlpmWk5GKjI+PjI+NkIuLj4+WiYiEi5GZjn2Fi42PjYyHioyQm4yRj4+Lio6TjIyNjIiSi4yFiYyPhouIh42KhYyEj4qXkJOYmpWbnKOqoaKknKKrsbe0ubWxs62vsrKlp7O6sbq6vLa3tsDDw729vLa/urq8wbW4wL60r66mqa+3mm58Z1tjWl1fSEU+QUtJU1hZXkFGOTk9OUY/Pzo3Ozs7NjM6Nzo5Pjg6Ojw9OTk4Ozk7PDo+PTtAQDs8QjxAOjg0Nzw7Qj9BQj4+O0NEREBDQz0+PjlhmZWLkYWNj5aSiHl9e3+Fi4OKgoqJhmuAeJCLlpqRnZ2UlJGTlpeampiWk42Sk5KQm5uIdndzcX1/cpGgnZubm5yenZ2eoKGgm5uWlpucmpybnJuYmZqYmJmampqWi5CTlpmYlZiYlpucl5WSkY2SkZCUk5KXm5mYm5ePjpCLjo2Ch4uLi4qLiI2RjIeHhoqIiZGKh4yEhYqNi4qNhI+UkIyDkJOUmZWQi5OTkZWRlpWOj5GMlI2Oj4qIj4ePhoeJiYmNiomJioWNh46JmJKUmpuXmKChp6Cko5qqqbO2sbWwqKmiqK6tn6qvsK21ubi8wr/BxLixtbCutrOwuL68ury+urOzp7G3wpB1gGNiXlpXUk1IRkVQSVlXX1tDUDpCQz1HRj84Nzo6NzU1OTc8OTw5ODo9Pjo6Nzs7Pjs7PTs9P0E7Pz48Pzo4NDM3OkFBQEI+PjpDREM/QUM7PT45Z6mloqKZn6CippeUiI2CiIJ1h4iKiIp7e3Z7enmPeoiSfn18en6CkYWBgH1zfH99fISHfnRweHZzfHaBj4iIiYeIioyMkZicl4iOhIuNi4iNkI+Pi5GPi4yOj5CQjouFhYeLjIyHiIuOi4eMhYaBjYuGiop/iYqGiJiRiIOIg4KFfIuLjIaJi4iKkIyIi42PjI+Wh4mLio6NjY2Wk5OdnJyalpycm56bmpuYnZeTkZWWkJKRi4+LlpSMjYqDi4SEiYyQkIqOio2LipGJjZOTk5SVk5KcmZ6Xn6CfpaKvsamupKSfmKStpqa4t6ysu729wsPAv7+vpa2wsLS3uLO0uLa0ta6stK+4tLaBeXpjZmBeVlBRQUVMT0lcXl9UR0dCS0xCREA9ODg7OTU3Nzk3Ozc9PDk9Pj05Ozg6O0A8Oj06PkJBOD88Oj84NjQyOTtCQD9CPj04QEI/PkBEO0A+N2CloJqXnaGaoaCPl5efl5WCjaCfo6GdmpKOjIxycXBvdnFucG1ucHZub29waHBxcHR+c3FycXd7cnl2d3Jyd3Z6e3l8fXt/iIGEi3+PkYaNi4uGiouLiYaEgYaCgIKJkYOAg4x/ho+LiYWAh32AgZKQhoSEho2DhIyPj4+IjY+Hi4iRkJWRjpCKk5eOj5WYp6SfnZWYlpaln5udq6aqt7W4srGnr6qnpqGfmp2WkpWVkYqPjImTjZuVjYuLhoaJjJWQkJCLmZKVlZSbkJiTlIyNkYyWl5WilZ6mqauno6OqsJucpp+mq6G0vb6zs7+5u7u6uby9rqiusa6wuLyztLGxqrCpqLGxsqild3J0X2hhYFRWUUlKSFZNXl5eVExKRVFKRUdDPTo5OTc0ODY4Mzg4PTo9PD47OTs4Ojs/PDw+OT9DPzg7Ojg8Nzc2Mzc5RT4/Qz89N0BAQT0/RDw+PThUj4yGh4eUjJWZl5yWmZaNlZyWlZydoKCdmpiWeHFubXJ4cXFsbnJwa3FvcG1yc3t1dnd5fnVxeHZ0d3tybn98gX15eH1/eYOGg4WCg5CLkIuLi42Pi4mJhYKBfX9zfYiAfpyQhIWFiYuPinp9fYaOjYqGjZSRi5CXj5SXkpihlp6XlZunpp+goKawq6GjpbW0sqqmqq+isba5vcK7ucO+vLi9uLWxrLCspZuSk5mfm5SPk5WOmp2doJqfn5edo6qsoZ+em62hp6qwqaampJiRkZWUo6SirKSss7Szs6i3tru4sLKvra2yt7a6srW6s7e5u7i8urayr6yxsbKztLOxsa2us7Gzs6yhl3Zxc19jXlJRVE1PSUdYT1pcZFROR1VPRURKRD44Ojg3NTg4ODU5Nzo6PTw/Ojg8ODk5PTs9PTpCPj84Ozo5Ojk4NjI1N0I+P0RAQDY+P0I/PEM8PT46Tn98go6MjJOTl5eaj5SWjZaRkZSXk5qanqGdnHJvcnFxcXFxcG5zcW91dHJxdneAdXd8eYV+d3t8eX1/fICJiYmDfXp/h4GIiYGAgIGGiIGGi4aIhYSIiImEf4J/enx8fX6SkH+IeIGFi4qDhIWKj4yNkZmdlJSUoJqan6Ktsa2ppKWtr6ysrLWuvrmtrqm1sLexq7G2rK+9wsLAvrq8trKutraxtK66u7OurKepp6unoqmtoKmooq+wuLSxvLq6urK0ta+8tLezt7e7t7mtrbCprLW5sbeytLe2sLu7vLu6ury1vLi0wbWsqqqrtLG3uLm1trSzsKymrrCqq7Cxq6yusLKxtK6qo5N4dnJlZ1tMUlBGTUhTV1JlXmdUUExcUUhMUkNBOTk3OTU4ODY2Ozc5Ojs6Pjk4Ozo6Ojw8Pj08RD45Njs7ODg+OTUxNTZCRkREP0A3Pj5DPjpBP0BAO0t/gomXmJSdlpabmIuSlo6XkZGVl5SZl5+bmZx8dHV2dXl1c3RudnJzdHV2d319gX56gXyDfoJ/fYB/hIKFj52RiYF/go+Xjo6HgoCBiIuFfoqQi3+HjYyLioeSioeGjZGTkZGEh319g4iMjouOiomQj46PlJSYkZWbmp2dqK6yr6+1tLOtsrW4sLy1tbGqsKqztbS7t7SztrS1r7i4t62noqassLCvtre3vrW5vLOysa61u7C0r6+yu7axuMC9tLS0s7izvLq2tLrAvbm6ubq+ubm5vrWysa+yr6q1tLGzsbSzrri4tb+vpKaoo6ussa+zrq6wsKytq6qroqKmqKKnrauqpaynoqeYeHlxZmVZT09NSVJNV0xPX15cTlVVYlFEVE07Pzk8ODk1Nzc1Nzk1Ojo6OTs4Ojw8Oj08Pj4/P0I9ODY6Ojk6QDs1MjY2QUZDQz4/Nz49Q0I5P0I/PjtLjpGTmJmVmZGTopiTkpKLk4uOkI+Vl5ablZSbhoJ9enh2dHRzdH53end2gIKDhouMhISFioaQiYeRk5aRjZaalY+IjI+emJaVkpCTl5qamJCdoJ2Tl5qgmZ2bo6CVkJugpKOak42IiIuJkZGOkY6LmJqPj4yUmpecnJufnKSstLm6vK+2tLi0tLK3uLmzq6+qqKy1srK1rrGrrqa3s7OxpaGotbCvrayrtbqyu7q6tLK3ur67ubG4sLmtqLK4u66ttLS3tbu2trm5vLe0r7G0t7a5s7e1pq2pq6ior6yprq2up6KxtLG0q6aop6Cjq66oqq6orLKwr6+pqKGeoaGjpqOgopqlo56ol3J3bmdiVUtUT09KQ1BLX2JYWlFcVGBNSFJJQUA5Ojg2Njc3NTg5NDs5Ozk8Nzs+Ojg8PD0/QkBBPTs2OTk5Oj87NjM3OD5GQkJAQjk+PUBDPkBGQj44R5OWkZWTkpSQkZ+ZnZmVkI+Sko6Mk5aWko6RlZGSkIaBeXJzdXuBhI6HhZGTkpicnJiVkJWYo5yaoaeqqZ+clpeVnaKioZyZnpmlqKyvramnqqmop6GlqKirqamvoZufoaOjoJqfoJyUjZiUmKCgoaSem5qkp6Spq66spaOoq6+xtK6qrK6zr6ystLO0ua6urayqrLKwsK2wqKqmsrS0uK6qtrqwr6qurLC3s7i0t7W0u7y4tbWxtauyrKiys7uvrbGytLa1sbG0s7OvrKuvs7a0sayutKqqpqWnrauoqKupqqifqbOwqqeppaOio7CtqaatpairrayppaSioKWipaOYmZyVnqKippdudWVnZFZPWEtLSktTVHBiWWRXX1tcUlpQTEM8ODk6Njk4NzQ3NzQ4Ojw6PDg6PTk3PDw7PkM/QT47OTo5Ojs+PTg0NThBREVEQkM5PjtAPkI/R0Q+N0KSm5SVlZaVj46Wl5qZlZGKk5SSjo+SkYqKiY2Ul5qTjYmCho6VkZSfmpuin5+jnqGhn5ijpKelpaapqa2rqaKmpKilpKGfnqOjra2srairrq6qqqukoaKkqaenqaijopybm6SgpaijoJidmZ+hoqmnoKKirqyrqqetrqilpKmpqammo6iqqaekp66wr7Ovq7Crqq+yr7Czua+rqLCxrrCyubO0r62vtbCss7GurLW1tLSzs7CvrKyqrKusr7G0s7CwrrCwsKyqrauqq6alrrCysKumqbCvqaOkqaunqKaopquwq6mvqaaoqaalo6iwraqpqKKpo6WnpKGhoKKloZ2el5aYlJugpKmUbnNeamlfVVpOUk5QT1JkXGVjW11ZXFBZT0tAPDs5Ojc6ODczNTMzODo9OTo4OTo5Oj08PEBEPkA9OTo8PDw+Oz45NTo8QkFFQUNBOT47P0BEQENCQDdAkZ6YlJeZlpGHi5SSl5GIg4mLk4+OkI2Hh4SFlZmWmJeZlpqeop2anKKkoaCdn5qfoKGgpqGgoKCjo6KlqKmrramqpqOmpaCloKaopqWnqaepqKOnppmcpKaioaChoaCcmJmfoKGkpKKenpagm5qioqChn6CiqKCcn6GloaCmo6KfpKGspp6foaGkrKqnrKivq6e0sa6ur7WyrKqwq6mtrbWwrq6srreup6yqpKivsq+sq7Kvqqqpq6utqa6urrGxraqtqaunp6uoqauinaapqKilqKisqKilpKWop6iopqmsr6+oq6mhoqKlo6Opq6ymqKWjqKKhoKSdnZ+hoZ2bnZ+amZWcnKOqlG9zZm5yZF1dUFVPV09eZGRsaGJiWlpSVE9NQTo9Ojo4Ozk1MTYzMjg4Ozk5OTk7OTk8Oz0/Qz5APTk7Ojs8QD0+PDk5PEFBRUFGQTo9Oz9BQUJBRUI4PYqWlJOYmpaPiISNjpGSjIiIiI+JiZCRjoqKiJubmZygpaKlnqKjoZqeoZyanZ6bnKOop6ugoKOYoJ2XnKGjo6WjoqKkrKilqaCepqmnrKmkn6Kgoqahpq6mpp2fn5+fn5manJyhoKGkn6GbnZqcoJ6hn56eoKOZlpqYo6KipJ+ZnKGhoqCbmp6goaSgnaejqrGorqusqaSqqquorKalrKqws6+rq6mwq6appaWoq6ynpqevq6Wnq6upq6irqqqrrailqKOmpaesqayoopykoaOmo6qpqKano6SnqKanqKepqKupoaKoo5yepqWjqKino6WlpqmgpJ6inpeYnZ+doqKlnpiUlZ6go5d1d2t2d2FfXFVZUVVWW2Nec19oX2NTUVlUSD48PTg7OTo4NTM3MzM0Nzo4OT05Ozo5PDxBQEM9PT44Ozw9PEA/Qz86ODo+P0NAREE6Oz48QD9DQ0VDOTyCmJmenZ2alZKKiZGRl5GQh4SJgoGNj4+Sj42cnZ+hpKmlqaeorK2moqKfmKSmo6Stsa6yp6asm56em5qjp6Cfo5+foq+qqqyoqKuwqaiqqKGfoKeprbCyr6yjoqahqaWepKOipqClpKKlo56doJ6fpaKinp+imJWemp6fpKGblZigoZ2enJudnZuZmZWen6Oonp2iqKGaoaOmoqSoqaqoq7CxqKWlp6eopKWpqaqnoqWmqKadnqWloqClpaOlpqCjpaOjpaelqamqpKekpqKmp6SrqaenpKGlqKynpqWlo6OopJWdo5+bnaCjqaeopqGjo6mooKiioJyVkZqfoKGmopuXkpCamqCVfHdvfXlmW1tgX1pcVlxoZG9jbmlpYl5QUEA/Ozo4OTg8OzYzNDMzMzc5OTs8OTs7OT49QkBAPTs9ODw9QD08PENBPjo4PT9EP0M+Ojk/PEI/P0FEQjk6gJ6kp6Kem5+gmY+ZnaCWloqGj4iEi4qTl5SRo6Wnqq6trLOys7S4t62pqqevtLKxqq6usbKusa2lq7OssbGpq6+rq6y2r7Owq7GysaOfoqqpp663trS0trOvrKuuq7awqbKxra6npp6io6ObnZyXoqiloZ+eo5ueoZqWnaScm5aZoqefoJ+joJuUlpmWl5qfoJmVnqKZmJ2dpZ2gpKeqqaiqraylqaSlqqeqqaqsp6SkpKOimZmhnpqaoaCfpaWYnqSmpKqooqelpaGqp6mnp6ejqKWmpaGkqKesoqekoaalpaOVl52Ym5mVo6elpaSfnZ2lo6Kqo5+amZiXnJyaoaGakJOTl5ibjX93cnZ4aWJbX15cYllgZG5ta25hX2RgUE9BQDs7OTs4Ojk2MTQzNjQ3Nzc6PTo8Ozk9PUI/Pj89PDo/OTo7PD5BRUA9OTtAQT5DPDs5PzlAQEBAQkM7OXuao6OcoJ2dop2Zn6KioJibmJaYkpSQm5qWl7S0rrW4s7S4tre0uLm3tbm4ub28uKqLnLK4vLS9urW7uru4s7q/uLe5u7G3r6iusq2inJ+qsri8vL27ur+0r7GztbS3t6+1tLWysKikop+gl5Wal6SqpqahpKOkq6WlmKGko52goaKooaOgpaGck5mYmJmco56cmpudl5uZlqWam5+hqKmpqKuvr66pqKirrKytq6irp6WjoJyfo6Ojn6Cipammmpyip6Spn6GjoqKgpaanpqSooJ+ipKGjoqiop6OloaGopqalo5mbmJuTj6GknqKfmJiVoJuhpaCfm5udnJuamZugmo2YmZiTkYaAdnh5eGNbUllUX19hbWh1a3BnaWliWVNMQDw6Ozg5Nzk3NTU2Mjg1Njc3Ojw7Ozs7QD4/QD0+Pjk6PDk2Nz47QkZCPDg7P0NDRDw+OT43PkFCP0ZDOzhwkpqblJ6bm52Vl52doqajopaXnpaXl6GblJi+t7G4uba3t7i7l5S2vbu9vcDFtaK7mKC3v7+6wcm0nbu2sra/xcGooLa0urGqrrSxsLG0tba8vL68vL7Guri3ur20r7Wxsbq4t7Kzsqqmpp+YpKSnqKSupKurtbWus6CnqqynqqmlpqCnoKGmoZOWmJ2foqSjnZ6coaChnZekmpmdoKaqqqqtrq2tsLGrrK2sqamrrqimpaalpqSkpqaeo6eppKGcoKKjpqCio5+jpJ2foqWgpJyboZ6fo6GhpaSlqaOkpaKkp6ehn52elpOcoJiZko+MjJeWn5uWnJqdnJqSlpSUmJOQmp2YiouHgIB8gnhhXllTYWhgZnNvc2l0ZGlkYltMSz46ODg5ODg5NzM0NTI1NDY2OTw8Oz08P0E/QEA9Pj44OTs4Njc/OUJFQzw7PD5DREM9QDs9Nz1DQ0BFQjw3Z4yRk4qalZiblZWYm6Knq6aVl5iQlZmhnpeXvrWztLu6ubi5woeYt6u4u8DCxbOjw6e4s72/tMTHvbS7uL62wMTErqCworW2tb2+wcPGwsO5vb/AwL2/xL28ur2+tKeqmLHAvbi1ucCzr6+qqqitp6ekr6eqtLyxtLWor7Gwr6yqoqajrJ+fpquXmqifpaWfoJydoKuwsKyiq5yYm6Cor7Kys6uorre1sq2tqaalqKulpaStqaShn6Cnnp6mqKmmnp+anqGlpqmcnaObl6KmmpuanZ+cmqGcmZ2eoKijn6GfnaWioKOioZSZmpmTj4qLhI2Qk5uPjpiVm5eYkJORkomNl5iYk4uKi32AgIVwYGFeXmpiYm53dXZubFtiUVVcTUc7PDk3OTc5Ojc0NDQxNDM3Njg8Ozs8PEBAPUA/Pj8+Ojo5Ojc6Pz5FRUU8PT1AQkJCQUI7PDhAQ0NARD87NV+MjIaFlouUlZeYl5ifpqellpWVkZebn5ual7mxtrO5vLy5urWqsryxvsG0vMe5uLuuv6fGw7/KxsnIxcXJvMLHx7+xsKe8vL7FxMbJx8XGu8TAxcbAua+9vMC+vrOrqoyzu760tbfCuq2vsLWqq6aqo62kp7G2q7WyrbOtqK6vp6awr7Ktqq+zpKu1qaeopKCgnqmyuL61tbWqqaausre4t7apq7i8ubexr66noqOop6SfqKOfnqCZoZydoqSnp6GelJuaoKGlnqChnpajnZSQlpiboZqflpORlpSin5qenJudoZ6kn56VnJiPkpOPjImTkJefiZCWkZuUmJGRlZaDjJWXlpKLjIh8f4N/amZoYWtsZm51cXJ1cWZeX1xSSUU/Ojo6Nzg0ODw3NjU0MjMzNjU3PDo7PDs9QD4/QD48PTk5OTs6PDw+QkRFPj49QENDQkREOzo4QUJCQUNAOTJbk4iEjZGKi5GRlZCSmp2fnJOSmJSdnZqXmpW2sbm1tb6+tri1uLO8vMTEusPHwb+0s8XFxr/CzcfLzsvLx8HDxsfIysXExcO7vLzBxcHFxb/DwsbFwLGTvrq/w8K2trqptLO0qauzu7uxn5uxr6ykrK60p6qpqKqtrKmlpZ6pr6uyu7q4u7e5t7O5uLOurLO0qrC1ub3Bur6+vL60urm4u7qysbS8u7q7s7Oyp6Smq6uioaCdmpudmpyXmpuenJygnZaclpuZnZ6io52UnJCNiY6OkZ6bnJWNh5KLmJiWmpybmJybnp6cmp6UjpiYmpSRmZeeoZWYmpKXlJWRlJqYk4+TnZaSi5F+enx/dGtrbmRvbWhxeG95amlhXGdhUUZEQTw5OTc2NDQ6ODQ2NTMzMjY1Nj05OTs7PT47Pj49Oz05OTs7Oz89QUNBQkFAPEBDQ0NFQjs4OUQ/P0BCPzsyV5uQkZCQh4WSjo2IjZCTlZGPjZSUm5STlpqRs7e4uLi+u7C1sri2tbbAw8G+w8LAvru+u7u8xMzEzNDLxsa/xcfLyNTLysjGv7u7vsS+xcjGxsPEw7i0wLe0vMHCucK3t7/Au66lrre8t62co7ewpq20tayupaWjqKSgoKWZqrOyvsG+urm6uLW0srG0tLO6wL7Av769u7u9vsDCt7a3tru7sru+ubi3u7a3tKyoqamrpqijnpOampyYkZKZl5GRmJqXnpiWk5acm5+elJOJiX6GiIuWlJiZkYmVkZeWlZmbmpaYl5idnpyhmJWZmZyYl5ybn56jnJ6WmJeTl5yZmZyUlp2UlpOJdnl6e3Zua2lndVpmcndzeWZnXWRbUlhJRj87Nzg4NzYxNjk3NDQzMzM2NDY7ODo8Oz08OD0+PDo7PDs9Ozs+PkRBQURCQEBBQkNDREM9OTlCQD8/QD89MkyWmpaSk4yKmJCKi4yOkpKKiIaNkJiKj5CUl7O7tba/vb2xtrjBvby0uL/Bsbi3vsHFvbu8wsbJv8jOyMHEwcfKysbKxczIzcbIxb/DwMvNz8rGxMPDwcS+uL7Bw8DEvsHPz87Gq6+2tLWroKe0s66ruLWzq6mjoq2prKatn6y1tL/Cvrm4vbawrausr7W0ur7Fv7u8urO5u7i5ubWtsLS9u7G/vLiytrmzubu0ra2orKyqqaeXnpualY2MmJSTi5WWlJyZl5WWmZKYn5mQiop+iYqKkY6Vl5OUn5mWkJSZmJmWmJOUm6GeoZiYmp2ZmZaenpibopqdnJuYmpuZlpeXlpyZlJyYfoB4eXV1ZWVpamddam9teHdjYmBgXlhXRkU4Ojg6OTc5NDQ5NzY2NTEyMzM0Ozo9Pzs9PTo6PTs8Pjo7Pz48QkBDQkJFQj0/Q0NDQ0RFQDk6QkFBQj5CQTVCkJeUlZmSj5qQjpKRjZSVi4qHjI2UiImPkpq2u7S8xsHEwr3BxcLAtLO9v6ywr7rDysPCvs3IxbfByMW/wcLIy8rCwsTJzM3Pz8zDx8bIycjIycfFycfIx7/Fx8TEx8jK0s/SzLy4trS4uMG+vrq9ury6vKytp6q7urm3wLK1uLLAxrq3t8Gzsa2tqau1s7u2w7a2vbWxt762s7e4sLW2v7uwvbq0q7CxsbO8urOzrqutq62xnaOjoJqQjpiXlZCclpaYlpWSnJmTm5+clpGUjpWQiYyQlZOUm56YmZKSnJedlJmSk5aZmJ2VnJ6do5yVnZ+TnKKcnKCfnaOemJSVl5ebmpmgkH99cXRxb2JhZ3VnaWl0bXhsXWRbVWBZTEhDNjw5OTg4OjUzOjY2NDQxMzUyNTs6PD47Ozw9PDs8PTw7PD49P0E/RUFCQ0M+QEFARUVERUE7Nz5DQkI+Q0I4O4+akZaalJKUjZCUlI6VlI6Pi4yJk4uIkJObt8C6xsXEw8zCwcS9vrWvt7uvr7O6wMfFxMHMy8W2ucDCwsTHytHLwsPExsnFzdDOx8zJwsHOw8rKyMbMys3FxsXDxsXJzdDNz8zHxMDDwsnNx8XBxMfBu760sbCwwb6/wca/vri3w8K6urbAvrWyrKmvsri+tMC0tLi0t7nEua+8vrm+v8K/tbq2q6qsrq+wt768trSura2utaSlqKimmpycnZyeopydmZOQkp2VmKCdmJiVmZmZl46MlH2QkJefmZmYk5GToI6Nko+VjpCUlaKdnKSem56elpyjoKGipKOkop6amZubnJ2enIN9cnx4cGdgamp2bGlldW90Yl1iVFdUU01HOjc7OTk3Nzo3NDg3ODQ1MjM0MjU7Ojk+Oj08Pz04Oz05OTk9PEBBQEVCQUJBQT9AP0RFREVAPDo+QkNCQENBOjSAoZeUmZiVkImUk5aTiZGMlJGOiJaKi5CXnMXLw8O8wMPHwbm9vbu4tre3rrK3uLzAwsDCx8bHurzAwsXHyMbSycHCw7+/vsTLyMrLybrO08jIzcjDyMnJxcXDwsHCx8fJysfMyMfIzcbLz8W3wMDAwLu6vbWzs7+/ub/DucC3u8G8uri7ub27srCvsKy5wri9ube1t7q9xb24xsjCwcLGwr28tamurrCwr7O6t7m2sK+tr7OppquprqannqSlo6OjoqCblZiekZecl5GRlZeZlZmRlJiSlYyYo5qcnp2FiZ+TfJKWlZKUlJennaCipJ+en56foaGkoqKjoaOinJ2fnqOhppl5enl/cnBmZWdkamVham1ub15ZXFZWTlBKRjk5Ozk3Njc3NjM3ODk1NjEzNTI3PDs8QDs/PDw6ODo8OTk4Pj1APz9GP0JBQz89QT5ARENDQTw5PENBQ0RBQDozbKKdlZedlo+PmJiZmIiSjZGVkI+Vjo6TlpbKy7u5urnBu7q3vsG8vLu5sa61uri4u8S6vsC+vru8wMXBxsK+xsK5u8O5uLm7vsHHwcXD04mpz8TEwcTBwsHEwcO+vcLAwMHCy8PGzMvFyNHCsL69uLq7vL63tLC5vrO8vrG5tbi7tryztbm2uba5t7GtusG6vMG/t73Ev8bDw8fHwrvAwr/Cv7iys7O1tLGut7S3tbSxrK2xp6Wlp7CtqJ+nq6ajqKWmpqCgn5SYmZSRkZWUl5OYl5qhnZ6hnKGdoaWglpSbkZeXmJqTnpmZqaSlpKWdoqCanqCkoqOcoqGjoJ6cnp6ppaiVfXuDeG5mYWRiYWJjY2piZ2NbWlpcWVFORT07OTo7Nzc5OTY0OTk6NTMxNDUyNzo7OkA9Pzw8OTc3Ozo5Ojw+QD8+RDxCQURAPz49QkRCQkI+OjlCP0FCPT44NVmfnJiTmZaRlZiYmpeQkZCQk5GTlJKSkpSUxce4tbq5wrm5vMPFwri7ubGxtry6tbnAu7u5tri0tLW/u73Aub66urTAuLW3s666u7a+zLaEntK8v8G8u8S+u8HEwL6+uLzBwcu+vcnEwMDKwLHBv7u4u766tbe0uLy0vbi1tLCzvLG3tri/tr25vb65t7q+u7/Axb2+y8PGw8TAw762ubq2v7i7v7y4trOyq7CwsrWzs66sq6emnqeurauiqKumpqqjp6iqo5+Ym52bmpicnJiXnJuhpZ2anqGhoKGmoJqbnJiboJ+dnJ+coKeho6SknaKfmqKgop+el6Shop+dmpieqKWhi3x5iH1xY2BiYmdqZ2ZpZWldVlZUWU9TS0U4PzY7Ojc3OTs2NTo7PDYzMTM0MTc7OTg/PT47PDs3Njk5ODo7PUA/PkA9PT9CPjxAQUNDQT9DPTo2PEBBQDw9ODdJlJibj5OUkZWYlZGWkpWRkJGUlZSTkpKYlcHCwLq8ub62uL7EwMKxvbqytLO4vLW3vMC8vbS1sbC1t7W7wbi+ub+8vLe0t7Cut7W4v8+bgYq1wbrDtbrHuLa5u725ura7xcXKvbnFwL+8wb64xr3BwLzFuLa3tLi2tru7uLa0t7q1tLi8vbm/ucPAwLu5vLu+vcjEvcfEw7rAvb62sra4srm0usLCureysaysq62yr7Kur6ijpJ6rrKyqpKakpKiqoqemraihoaGmn6Oiop6bnKKfoKOdnJuhn6KgpKCem5eZn6GdnZ6eoaWkoaGioZ6ho5yinqCZnZijn52eoJqZoKKmnYR6g4B4cG1lZWZvaWVraFhYTktLS1JJTEhDOT04PTs2Ojs5Njc8ODk4NjA0MzE3OTk7Pz0+Ojw6ODg5PDg6Ozs7PD1BPj09Q0E8P0NDREA/Pzw6Nz5CREE/QDg4P4mYmoyMkI+Tl5WMkpCakpGXmJaUlJKQmpTDvsbBwby8uLi6v7a8scK2tLyxtLa4s7q9v768sq2vrLGwt7y3u73BxLm3uLStuLK2vcXFh4GAn8S+x7e5uK23tbi6tLizu8XGy8G8xsDAv728v8nDxMW+xri1srK9uLi4vrq6uby6urS3u7q5v7zEwL+5uri/ubvFxr3Fw8Kyur27sa+2uLO3s7q+wLm2rLGrrqmqqa2qqq6mpKWnrq2ppaOio6GkpaWmoqato6Klo5+ho6Gcmpyhn6CloaCenZygnaWgnpeVmZ2fn52gn6KmpaCknpybn6Ofn5mcmZ2epJyWnKOcnqGcppZ+f4d8a25wZ3Brc2VibV9cVEhLSkRKQkNHPzk7OD48Nzs7OTc4Ozc8PDYyNzUxNjk8PD08QTs8Ojs6OT45Ojs9PUA+RD89PkRAPz9BRkQ/Pz09OTc/QUNCQEI5Ojl3nJiLh4uQkpOWjY+TmpOQnZiSkY6QjpiSvbfHvsO+vbu+vL22uri9ure9s7OwuLi1uby8wLeqraSvsba6sb2+u8S2t5x+d4J0hJPBrHuBgpzJxs/CwLiutbW8vri6sr7ExMrFwcnDwr+/vr3HzMfHxMe9tbW2wb26u7/CusDCv7y2t729vcHBwL+8ube8wru3v8W7wr++tbe8vK+vt7awtLO6ubq7r6mtq62rrKaqoqeuqKWqra2vp6Sgn6ajnqKjqKOjq6Oiop6dm5ublJaZnJyfpZ6fnpmYnpejoJyXmZqZmqOjop6jo6egpqCbnaCjnp2WoJmcoKCblJegn6WcmKKQgYaBcWVsaW50bnhjZ2JbY1FLVEhFRUNHQzw7OTg9Ojc6PTo4OTs3PD01MzY1MDY4OTo8O0A9PDo+PDk+OTk9Pjs/PkM8Pz5APz4/P0ZEQEE/Pjo3P0BDQz9BPTo4ZqGYj4uNlZKVlY6PlpmVl5uVjoyMjY+bk7m2wbS/vLm8w8C+wLq1trKywLmvsry8sLe7tru8q6ujsLvU2ru6vrzGsp13Y2xkUFthfY96hYaZy87RzMrEtbrAw8i/vrW/wb/Gxr/LxsO/wbzAw8zKx8XGwLm9vMS/wL/CyL3Hx8XFvLrEv7vBv7rAvLu7wMS9t7nCub69t7S2uLqur7WxsLCytre0t6yurKqsrKuoq6Gms6qlra+trKippaOkp5+io6Onoaeiop6cnZyamYyQlpeZnaKZnpuVkp2UoaCdmZ6fmJimpqKfoqKmoqeloqCko6GbnaCbnKKfl5WVnp6kmpafiYGDgXRvbGx0a2xuX2JeYGFOSE0/RUA/REM7Ozo6Ozo4Ozw6OTw+OTo+NDQ1NTE5OTo5PDtAPD89PTw4PDs6PDs7Pz5DPkI+QD89Pz9FRUJBQj87Nj9CRUQ8QUE6OlmfmJOSlZqVmpOQlpeclZuZlpSVkZKTnZm2uLaxuru6vsG5uca7trWypb69tLbBv66zvbS4wbGwsbPEorLbv7y9un1kb2Bgc1tUVVhsfIaIm8jIzMvNysbCxMvOwry5vbm5wMO/yMbEwcG/xcDKycPDxMO5w769ub+8wsbCyc7Hxr66xr26v7m3wLm5vsDCvrW0vLi2u7CvsrK1r7Cvrqyus7CzsrirsbKxqrCrq6yrrLatqKyusqarrKmpoaWgpaakrKSmoaChnqGgnaCMlJeTm5+mmZ6emZOYnZ+gnp2eopuYp62ooqSgoKKqpqmhqKGlm6CgnZ2jn5SYmKKdp6Gfm4J7eoh6bW13e19wY1tdX15TST5DRUlCQz5DOz42OTo7Ozs7Ozs7PT05PTU2NjIxODo5Ozs6QTs/PDw+Nzs8Ozw9PTw9Pz5BQUE/P0FCQUVDQkRAPDY+Q0RFPkJEPztTmZuZmJ6dmqCalpyZn5KdlZ2boJWWlJqYur20sLu8wcTCv8XGura5sqO7vbS3xLuwtbq2ucS4tby3wW9vsM3BtHpaSmRjS3B+bmBRWXiCi6DFwsfLyMHDwcDJysLAu7qwtLu9wMXGxcW/wMK/y8fCwMjAusK7urO6usG+wMrOysS9tby8ub+5ubW1s7/Avre0s7S4rbeqr7CwsrKvq6+nr7ausrG5rra2uLSzsLGttrS6sa6srranrLKsraSjoaenqLKrqqWkp6elpaCml5ujn6SmraKeo6KanaWiop+foaWenrC0sKSlnp+kqaevp6mgq6CiopqipJ2anqGmp6+psZWCe32Bem1zeHNncF1bXlxZUUVEQ01JQUU9Rzo6NTk7Ojw8Ojs7Oz0/Oj01NDUxMjc4ODs8O0I8Pz46OzY6PTo7Pj0/QD87QUFBPj4/QkBBQkJFPjo1OkFCST9AQkA7TJqdnZ6fnZienZmampySoJWbnp+blZGRlsW+urbDvMbCvr/Ixbe1uLe2ubu0r7e2srWzt7m8u7a7v8d9b3akv5tVUk+DZ09cfIGDbEZrgpCsw72/xsC5wLy+xcS9vbmysK64t7/Dx8PEvL2/v8PDvr/HvLy/tLSutbW8vr/OzcvCt7K4uLi9ubuxtrLIwLu2tLGwt6yzqbCtrbS3r6uuqrG1r7Gvt7O6usC/tre2sru6wLWyrbO3rLC6r7KloqWrrK+5s7KosK+xr6qiqKGkraitrLOun6inpqWmq6Sknqaqo6ayuLOrpZyfp6anrquqpbClpaWbpKOYn6exrLW4sLKOhHl/fHZsdXpwbmlbX19ZU1BBRUhHS0BEQ0g8PTY7OTk8Ozo6Ozo9Pzw9NTU2MTM2OTg8QT5AOz1AOzs5PD04Oj08QD46Oj49Pj09PkBCQkJBRD03NDU9REc9Q0I/PEWUnqCgoJyXmpiYlZmdmZ2fmp2bnJaRj5LDwMK9wrzEvLy7xbu3s7e2tru7s6CWtayvsbS0tLa4ucfIgn9uf6VzUUxilV9RUVWOlnZOZYucrri4uMK6s7u3u77Au7u8rq+us7K5wcLEw768v7u6uLbBwrW/urWur62wvcC5z8rJw7GvtbS0vbq+ubq7ysO7uravsL2xuK+ys7C3vbaur66wt7CsrLK2vbzEwrq9t7bAv8G3tbC2srGzurGxr6err6u2v7e1qbqztbmxp6uop7ausrG1uaisrK+qr7CqqKessayytr20saykqKuoqKusq6i2qaaonqadmKOuvLG7wbSmiYF8gnpzdnZ3bnFgX2ZdWlRKPD8/RkY9RkNDOTo1Ozk5Pjw8Ojo8Pj4+Pjg4MzE1Nzg5Pj9BPzs6Pz08Oz09OTs8OTs6Nzs+PT1DQT8/QUJEQkE8ODU4PUNGPUREPzw/iZ2en52Xl5WUk5aZnpubmpuYlJ2Uio6Owb7Dwr6+vrm2usCxtbGzt7fCtbOrrbOoqa61r620trjHyIqDeHSNYUxiinFcT1ZksLp3VlB+r7Cysbe+ubK1sry5vLa6vrK0tLSwuL7DxsTAvb+5s6+yvLquu7Szpquorbq+uMvCv76sq7Cvs7q3ub67wMXBu7y3sLXEtb+0uLu0u8PCs7a2sbisqaWrsr23v7+7u7exvL28trGvq6uprbOvsLCrsLSpuMC2sqm0tbC3tq2spqu7s660uMKwsbG1sbK1saywsri4ubi+tLGzrqyxramvrqqyuK6trainoZ6ptr+4ur+wlol9gHxxdHd0dnFsX2NhW11PSEE+PUhDRk1DQDc3NTs6OT48PDk4PT47PT86ODMyNTc2OD8/Qj86OD4+PTw5PDk7Ozo8Ozs6PEA+QkI9QEE/QkI/PDs3OjxBRD5CQz8+QYqgm6GdlJiVlZKYmpyWm5WalY2bj4SIhru0vb+7vLm3s7y8rLOytLS2wLXAr7Kzqqqxt62pubO3w8ORiH9/eVZRjpRrbVZlcGeUfnFtXoe8s7C2urW0sqy8ubi1uMG6uLOxrLe8wcfDv7m6ta6lrLOwprCtqJ6gn6WttrXCt7a0pairqLC2s7K6tbu7u7W4trC1xLK+vL+8ubrFybq9vraxp6SeoamxrrW5trKxq7S3trGopp6gmaWmpKynq6y2qa+6sa2kpq2lq7GrrKmtuLawsrjBtrGxtbGvu7ayt7W1sry1urKwsbKutLKqrq2nuLWyta2uqqiosrq9wLa0qY6Ce393b3tvdXJtY11mWFxdUk5NQT5JQkFKSUA2NjU7Nzg+Ojs4Nz4+PDs/OjkzMjc1NzU8PD48PDg+Pjw8OTk5Ozs7Pjs7OTw+P0E9PEJAPz9CQD47Njc6QERBQ0E/QUKJoJ2loJSWmJiVnqCcl5uYmZGMmYmDhoS1r7S7u7S1sLG2uq6wtLOvtbq1urC1s7KttrqvrbyzuLnDopCJkH5KXpjDdIGKkF12fGlqdIq0u7WxtLWytK+su7q4trnAw7aurqqytry9ubaysa2tn6Snp52jpp2WmZman6muuayrq5+lqKSrrq6nr6yvsbGtsa6usLmwtLy+uLm4x8W8vLu4qaKcmJufp6assq6zqaapqq6popqXl5GcmpijnqKir6ekrKaompqemqGnp6anqa+2squ0trCqsK+xqbm2sbWxrqy3s7avrquuq7S1ra+rq7GtsbKoraurs7W3ur2wq6GLeoJ5cnZzbXVpa11balRdXE9NSERGTEJGTkY4NjY1OjU6Pjg7OTc8PTo7PTo5MjM2Nzc3Pjs9Pjo6Pz48PDw6Ojs5Oz47PTk8Pj1CPDtAP0A/QT8+OjU1OkBFQkRBQEJBiJ+ipqGYm56dmqWpmJudmpmUjJmHhoeGrq2uuLmxsqiur7iyq7CwqrK1ubm+tbK4tLm6trm7tbWyu6+UkJ2WTGKNlHZwgHpjamxzfnpznrq5srSzsLGtsLm4try4u7+ysrKusa65r6qrrayjqKGdnZ6XmKGVkpWXkJifqK6ko6Sgoqeio6mpoaanpaqtp6ynqKesq6yyu7SztLm6trK2ramgmpaWm52fq6yqr6Oko6GpoJuTjo+Qk5KSmZaanaSloJ+ep5iVkpSZnqSjoaWqrK2iqaqppKmtrqW0sa6xraqprq+wraWmqqSos66trKmmpqmrpqqnq7Ksr7Oxq6mWgX+Bd3J4aHRzbmRUYGNXXFFOTEhASFFETUM9ODg3NTo3PD46Ozw4OTw7Ozw7ODI0ODk3ODs7PDs4PD0+Oz08Ojk8Ojs9PTw6OkA9PDw7QD5CQEE/Pjk1ODs8RkFDRD9BQYijpqKjnqCfp6Coqpufm5yZmI6Xi42PjKqpqLGvsK2lp6ayr6mmq6CvsLu1vby4wMG+vLy8ua6sr7K0pp2qjleBb25qXGhfXVZZXmdjaYCXuLKts6+urK62trK0ta+qpJ6bnJyeqKieoKipn6GnlpuXl4+dk4+Qlo6Xm6SooKCioqKlpZ2jo6CepaCkrKSmqKSio6OrrLOuqa6urqeqraisoZyamJmYm6moq6ufpqKbo5yVkIyPj5CTkJeVlpifnp6amKaXk4+Slp2ioKWjpqSnoKKko6Ghq6uksq2qrKyno6yuraufoaKkpK+srKmmo6KqpKqqpKmrpqmsq6agiHiDfHZ/eWJ3bG5cUWhUUE5HUE1MQk9RQD47PjM5OjU7OT07Ojk9OTk8Ozw8OzkzNjk5Njo7Pz06ODs6Pjw6PDs5Oz07PDw9PjxAPT88ODtAQEE/Pz45NDk8N0FDQkQ9QEOOqqSjoqGinaulpqimoZ6dmZ2PmJWTkJWnpKGmqKmlpKChp6uhnKKbp6u1sry9wMLCwL7AuLSnpaypscC3r2h4eGtzaFleUEpISkxRT1prbqK2qrK0rqqrr7Cys66lnpKYlI+YoJ+ioJykpZ+eqJSblpeMl5GNkJeTmJ2iqp+fn6Cjpaicn6ChnKKfo6innKehoKSfrKisrKCpq6agpKimrKOdnp2Zl5qrpqqxo6WonqCclZOQj5GQmJCWlZiXn5ibmZqjmZeUlpqdoJ2nqKWgo6Kho56doKmqpa6upqipoaKqrqqnoaCio6msq6eppqShqaKlqaalpKKmpKijkn18gHV1fW1re2RoVVFjTUpIR09STUpORzxFQD0yPzc1OTs+Ozk5Ozg6PDs7Ozk5NDg7ODc7Oz48Ojk8Oj07Ozw9OTw8PD49PUE+QEJAPTc6P0FCQEA/ODU1PDpAQ0BEPkFGlq6koqWeo6KpqKipqqWmnp2imJiZmZWbop6bnqOioKOgoZqgmJeXlqGorK62t7q5ure3u66ooKGooaXEw45gZWNyY1RMRl1JUEZNS0tTXl18tq+vs7Wqp6yropyZlI6RlpeYmZygoqKcnaWemqSXl5eWkJKRkZOal5ugpKqeoaGepqeqop+gp5+dn6SnqZ6jpp+qnaqtqq6nqLClo6Smp6ymoaShm5ier6iusqulqqqgmpiYmJWTlpqTlZWalpuXl5ihnpycl5uhmp6ao6eln6GioqOdm6Gmp6aoraOppZ6kp6mkpaWhpaSsrKmmq6eioKSjpKenoaCgpaKmoIl7gH12eHxkeXlgYlJVYElJSktTVElSUEw5P0I2Nz02NTs6PDw5Ozs4Ojw9Ojs4NjU3OjY5Pj0+PDk5PTk9PTw+PTs7PDo+PTw/Pz9APT03Oj5AQEA/Pzg2NT08PkFCRkBAR6CupKaroaOqrK6tp6ypqKCipp6bm56aoJyalZmfn5uen56WlJOXk5KcnqSorq2sq6uvqq+pnpefpZ6dubGFemdqY1ZIUF6Oe2xTS0dHTlRUZKuysLC4rKahnJ2alJeampCOkZWRjI6OlJminJejmZqXmJmUmZiWnZufpaapoKajnqeurqumorGjmqSmpqqioaqiqaSosquxsqu5qKarp6urqaysp6Cgo7GusrG0qrKvopmcnZ6hmZubmpiZm5SWm5aZnKWhoJqjoZqdmZ+kop6gn6KmnZulpqWkpaijp6OepqOinqaloqWlqKykpq2noJ2dn56gpaGenqWgppmBe4F8dXZzaIJsZVtTWllNUUpOT1VMU0xBNz5CNjg9NzY6PDw9Ojw5ODo7PDo7OTc2Oj01OTw7QD03ODs3PTs9PT06Ozw4Pj09QD5BPj4+ODg8P0BAPT43NTg9Pj1BQEZAQUihqqCrq6GkqquwramtqaelpaWkoKGfnqWXl5SYmZ6YnJ2blo+VmZKRnJihnaqip6Cep6Gln5ySnKKbnqOnmn1sXVRMSVWDqrGfaFBGQ0NHTV6UsK2sr6efnqKgl5GTm6CcmZeSk5+coaSbnpuWn5qfl5uinqWhnqSfpKitraisqKSstLe2sKe0rKKtraOvpaSmoamorrWzsr23vrCssa6tqaq0sbCoq6iytbezuK2ytKSgnaWfrKGhoqCgmpiWlqCbm5ikoaCepKGgnpqcpaCfnZyhqJ+fp6meoaOkoKagnqehn5ymo5+ipaOooKmrpZ+dnZudmqainpyjnqeQgYJ/fHh1aXd1XWxaUmBIUlVIRlVWSkJMRz1LSDhFPDY3Oz49PDo8OTg6Ojs6PDk2Njo8Nzs+PT8+OTc9OT47PEA8OkA6OkA/O0A+QUA9PDk3Oj5APzo+NzU4PT0/QUBEQEJGnKueqamipamprqimqqWmp6aoqqGlpKOmkpOVmJacmpqcmpWTmZuNk5+ZqJ2un6eenKGdnpqZkpmem6GhoYZuYFVQTk9cq+Dauo91YlNIQk2LmZqrqqmkn5+ZkpKTmJiWlpWMiIuOlZ2dnZ2elp6apqCgqKWxqqeuo6uttrC0srGutri9wLqttbSwt7CutKmmpKWsqbmztbvDvMPBtrq2q6+xube8r7OwtcG8t72zs7WirKKpqLKpq6inqJqZnpqqp6CZp6Cfn6eopaSfnaqhop6bn6igpKetmZ+jnp6nnqCmnpycoqGbo6KhnZympaWkn6KZnJukn6CboJyjiYWEfnZxbWl2bWhtXFhbQldOSkdNR0JGTTw+TD00PDk2Oj0/PDs6Ojg4PDk6Ozs8NTQ6PDg5Pj4/Pjg4Pzk8Oz0/Oz1BPTo/PjxAPj8+Pz08Njs/QT07Pzg1ODw8QERCREFCQ5WqoKapo6mqqKmjoamgpqinrK6lqaWpqpSSl5mUmpqanJiYmZyamJmqoLGit6Swpp+enZ2XmJWZnpqcpKB0WVJPUlJddbjSuqCpuZ6EeYmuxKOoramqpZ+enqGinZ+dmpyclJOVlJ6emJSFnZqhm6ukq7KwubKysbKxur28vLm2uMO+v8K/trq7wMS5vbusr6exrbHCtrjCxsDIysDKv7C5ub25wr64s7vGw7zDvLezqbOtqrO0r7Ouqq+jnauntrGtorCmoaOvsa2wpKWvo6GgmqGnoaSqqpmdoJmao6CmqKGcnqKemaSenpiYo6OhpZ6mmZuipJ6fm5ubnIeFgXt0cWtrdXJwaFdbUUVUSERKUEk/RUE0Rkg5NTs9Njs8Pjw8Ojo4OTw4OTs4Ojo4Ozw3Oz49Pj02OEA5Ozs9QDw9QDk3PD07Pj0+PUI+Pjc6QUA+PD45NTg9Oz1DQEFDQkGRqqGlqqelqqimn6KnnKasp7Gyq62jqayVkpWalJecoqGbnqCinJ+psqu7sr+rr6ylnqCgnJyYmp+fmqCcZlBJTlBddY2yvamHotzWztTZyLSup6OjoaCepaulnpeclJGZnZiUjIqGiIZ5bYigpKKrrLS8tsO+vrO7wcPCxcC/wsbGxcPIwsDFx83QyMvDsre1vrK+xbu+zM3FzMzM0se+v8DDvsfGwrfDycnCwca+urS6urS7t7C1sqq6sq67t7+7uqq3rauquLq0vK6uuaOmo56mpaKjqaaZm5+Ymp2nqqegoaGkmJSjlpSZkZydn6Sep5+en6KdmJmUmJSIhH16cWtkaG94amRaW0ZLTEVEU0xEQkU3Oj87NTQ5OTc4Pj87PDs7OD48Njo9OTw9OTw9Ojs9Pj4+NztBOj45PT45PT44Nzs6Ojs/Pz1CPj83OkFAPTw9ODY2PDo8QT9BQUE+kqugp66ooqulpKKipaGlqquwsq2upKmmlJWWmpaUm6SmnaGqp6KrrLy8v8PBsrK4p6Ghq6qhnJ6hop2clF1LRUxTdYWztqSSicXj3NHEtaafmZybnp6Zl5eXkoyOl5eTjo2Qi4KDgndzcW5wj6atrrS5xbvNx8u/wszOzczHydHMzczHycXFzNDS1c7Tyb3Av8O7xsXIxdHUzdPQ09PMysLGxsfKyM6/yNHMx8XHxcG8w8G+v761vrOuv7/Cw8fEx8Suv7iyuLzDwcG6vLy1rqenraigoqmlmpagmpmdqKupo6SknpePm4yQmYmVmJugn6OdnZeempOTi5WPhYB5dHNlYmdyb2ZeWllDTkxDRVBJRENANTU1ODpCPTY4OkE+Ozs+PDk+PTc6PTk6PDg8PDw7Pz8+PD0+Qzw7OkA9Ojs6Ojg4ODk7QT48QD8+ODtBQTs7Pjc4Njo8PkI+Q0FAPpOvn6ivpqiro6KloKampKuoq62qrqKqo5Kcl5ebmJuirJ2frqalsarFxszOzb+wwaikqKytqqCdo5+cnpZjSklNXH6q0dC2oLPTzLqvqKKfnZ+amJaUkpSWkZCPjIeEg4iHg4CBgYB5cnJvbHmktrq5vsvB09LTyM3O0dPR0tHQ0dHNzs7Qxc7U1djS183Gx8nMw8XKz8rT19HX0tXW09PIzMfMzcnSzc7TzcXIycrBxsvHyMnGv8Ozs8jEy8rLz8bKv76/vcHHxMzMyMm/w7+tr7OonqKqo5qTnpyYnqaprKSlppaXipWFkZSHkpKSmZualpiQm5WQjIaRi4B6cnV2Z2NndmlkVldRRE1GQElRQj1CPDoyMkA8RDw3OTxCPTs9Pzs7Pj05Oj48Oz44Ojk5Oj86Pj1APkA8Pjs+Ozk9PTw5Njo6Pj08PEE/Pjk6QEE6OT44Ojo6Oz4+PEE/QT6QrKKiqaanqKSfop2qqKOso6OnpqyiqZ+To5iWn56dpK6bn7CrqKyxyc3U18/Gu8esrbO3rK6jnqOinaCld11naIOw0tra1sq6sqqjnp2doaWgnZqUlJWUiXx3cGtlYmhxb3F7hYqAdnBucXRwhbPCvsXR0NfW1tLWzdTW19TT0dPU1NPP0cPQ09bY1dbSy8nO0cvGzdLK0tbW2dXX09bYztLKz9HMztDM0s+/yMfKw8zMzM7PxcbHtr/Kv9HNy8/Gyci/w8PIzszP0M/NysfNuLe7qJ+lq6eemJ6jnp2qpa2pqKiSlYiQhIyRho2MiJOVmZCWjJiSj4aHjIR8eHN2cGNgZXJiXVJcSUpHQUVIST47QTg9NDU4NTs4Njo8QD07Pjw7OUA7OTo8Ozs8Nz09Ozo+Oz08Pjw/Ojo8Ozs5Oz89OTU7PD48PD0/Pz46O0BCOzk/OTg7PT0+PzxBQEQ8hqugnKegp6Oim6CbqaSlqaCfoaGmn6ifmKSimqmmoqarmqOwsamotdDU19rSx8bLtLXBxbG1qKGkpaChqomBkq/O1Nnaz7yvqJuWmKCcm6Gin5ucmZWJd2ljYF9fX19eX2BeYmx1c3Fwb2xycXWSxMfG1NXX19fT1s/V1NrU1M7P1dTU0dHM0M3T19bT1dDP0tPRydPRyNDY19jR2NLX2dXWzM/Pys3Sy87QwMbCx8XOzdHR0cjMzcDKzMXTzsvOyMTKx8bIzMrT09HVz9LM08G5xbGlqLWup5uorKWdsqiws6ysk4+TjoiKj4OPi4SQjpmNk4+Zj4+ChYx8enFzdG1hY2ltX1ZQX0pKQ0ZDUk0/PD41NDo9NTI4NTU8PEA8Ozw6OTpAOjg7Oj46PTg+Ojo8QD08OTs9Pzk6Pz07PTw9PTo2PD0/QD08PT0+OjxAQjs5PDc0Oj48Pz89RkFEPYKknKClnaWlo5mcnaSeo6OfnZ+doJqnnpyhqZ+vraqqq52mrreoq7fX1NXZ2dHO0L+8zMm2vq6mqqihppV7k5LF1tLVwq2moZiVl5manaCemZydkn1xZWNjX19hX19hYF9gYF9gZm5wcG5rb3J3d5zMwdLV09jY1tnR0tLXz9POy9LN1dTSys/M09bS0dbNz9XV0cXR1MrQ1NXWztLQ2NjY18vIzsTJz8zKzMDJv8fJzc7Py9DNzszOz8jL0NDKzsrCycfJzMrL0dLM09HRz9DKvci5sK67uLWqtrCtqLits7+7sZqPn5SRjo2IjpCFkY2ZjJGRlY6RgIWIenZvcG9rYWRucGFXXFpJRkZETVdFO0A9MzM8PTg3ODU1Oz5APTk8PDg8Pjk8QDtAOj04Pjk4Oj88PTg7PkI6Oj08OkE9PTw6Nj08P0A9PDs9Pjg7QEE9Ojw4ODs+PD4+OkVCRT6Bn5mlp6Cfo6eam5+cl56eoZqdmpyappufpKefuLa1taykrK6+tLDA2NLX2tzWzs3Kw9LPwcCwqaytqaZ2aX+U09bNsJyblpWXm56en52UlpiUiGteXl5hZGJgYGFhYGBhXl9fXl1ibXJvb3N0dnZ5pL7L1dHW1NPY1s7O1MvNzsXOytLSz8fOzc3UzM7TzcvX1tDM0dTLzNDS08rO0dXS1dXKwMnBxczCyMnCzMPFyMrKz8rNzNDN08vGyM/NyMfLxcbBxcrLzM/RxtDOzc3Mz8XHwbi5vcPDvcO5s7K+sbvDxLWqmKWimZaRlZWSi5SNmpGUlI+PlIKJhXlwcWttZ2BgcGhYWGhWTEZMSVBQQjtDPjs2Nzo4OTo1Nz09QTs6PD05PD05PT06Pjo8ODs9OTtAPD47Pj5BPDk9Pj1CPTs3NzU/PDw/PDw7PDw4O0FAPDo8OTs7Ozw9QTpFQUU+hJ6bqK2epKSqnJ6fmJKXm5+am56ZmaKVoamppcTCwb+7tbKxx8K4y9XV2drb2MzMz8jW1cTCta+0qKGoZG98qNnQqpWOjZiWkZOSkZaWlpCLfGVhYmJgXV5hY2JgX2BgYWFgX11bXWdycXFyc3FtcnmkxtPPy9DP1NXJxcnJxsa/w8bPzsfFx83K0sjLzs3G0dLQzszUysfLzs/Hx8/Sy9DPxbrEv8bJvcLHyc7FwsjAx83IxMzKy8/IxMTQyMbCxsjEvsDHy8vLzsLLy8jHy9DExci7x8PJyMLPwb28v7DByce5vaqwsqelnaKcmJCbkKOZl5mRlZiJj4J3b3Rka2BeZnBhW1dgR0hIR0lNVEc/Sj02NDM1NT08NDg9PT06Oz08OTo7OT89OTw7PDg6PDo6QD1APD09Pjw6Qz48Pz04ODk6QD4/Pjw7Ozs7ODo+Pzw7Ojc5PD49Oz49RkFDPYOgm6qupa6qq5qdoJeUjpedmpmgmpqcm6WysazJzcrIxL68us3NxtDV1dna29jQyc/P0dPIwra7u62mnF5vd7rQq5COjpeQh4SEhIJ+hYV/c2BbXl5eYF5gY2RjX11dXl9gYF9bWlxha3Jyb29rbG9vfbjRyMnKz8vNxLrAw7u7urq+ycbCw8DDyMrJyMrIwcXMxsjLzcnEwsvJwcLM0MXLyL+5wbvGx76/xs/Lw7/Du8nHyLvIxsXKwL3Cy8bFxL7GvLzAw8TLxcW7wMrCxcfSxcHJv8rJxsjG0MPDxsOvxMvHw8q3v7y6tKmspKWYn5iso6Glm6Ogm5R7dnN0ZmlaYW5sWltYUkRMRkJHRExERlNANTQzMzQ/PDM6PDw7OTw8PDg7PTtBPTo8Ojs3Oz05Oz07PTs6OD4+PEI+Oz88OTk7Pz07QD48Ozk5OTk6Oz06PDo2OTw+PDs+O0NCRD5/pZypsqm0rrCdnp6YnImUm5man6Kfmp2ov7i8ys/RzMfCw8bNzs7M1c/V2djZz8vSzc3OyMC0w76yso1gcoG/sJCLk5eHe4GFhoB2eHVycF9bW11gYGJjZGRlZGBcXF1dX15gW1laXGJvcm9raWxwb3OPxrzJxczAxsKxtrqysrOyscK8vLy6uMHBwsW+vbm9v7nEysXGwr3GwLi7xMm/wsm7t7u6xcO/vMHNw8a9vbXBvcO6vca7wrqzvMXEwcK2v7a1vb+6y8O8tbrIur++y8TBxsLGycbIxtDGwszHssfJw87NwcXDwL2zt7Cyp6ioubClrbCqrayUeXZ3amRnYGhvY1ZeWUpGSkZISkFFQkVJQDk6NjQ4ODUzOzo7PDk8PDs5Ozk6QD46Ojw6Nzo7Nzo7Oz88OjxAPUA/PT8/Oz07O0A8Pj4+Ojk5ODk3ODo8PDw7OTo8Pjs7PjpAQEU+fqygrLWqt7SyoZ6fl5qNlJaan52mop2et8XCxMjO0crKysfNzc7RyNDG1dTW183Kz8XJxcfAuMW9q69+ZHWQtZKMiYuFeYGHh4B+hHx0dGNbXF1eYGBiY2FiZWViXV1bXF5cXl1aW11daHNxbWdnbnByeZ29zMDDusG4rrCwp6qtrKe4tbe0s7O0vLa9sbewta+yu8K8wcS8v7q1s7q+wLjHubS7tsHCvLi9xsHDu7Wusra6v7TEt7u1q7i9vcC9sbq2r7a6s8W8t667v7W3tMW8vsPFwMPFxsjLxcDGxrvIy7/PysfDxsLDt8O9vba5vse/rLW6tbe2jnl0eGZnZWJrbl5WXmBGS0hISkZCREFFRT88OjU2NTYzMzs6Oz06Ozs6Oz44PEE9PDo7ODc5OTk7PDo+Ozk+Pz1APz5CQD1AOjo+Oz89PTk6Ojo4NTY7PT48PDo7OT49OT86PEBAPIi3pauzsby8sa2foJmUlJiXnqujr6qnpMbLzcjFyM3M0MzNyMrIysnKxNDN0s/NxcfBxcC+uLfJtamwgm1xl5qNhomKe3l+hoZ3eIJ9dGleXV1dX2BfYGRhXmRlY19fXFteXF1eWltbXV9scG5oZmpubnJ8pMe/uLi1sKusp56iqqeeq62zramsqbSvt7Cyqa6mrLK8urbDubq6sau1ubu0wrqwwLG+vLu2u8e5wratqqiwssC2uL2wsKeys7W7vKuutaWuta+7srCpubCtu667uLvAwL25wr/Hw8XBvMbCyMu4xcfFv8bDw7rExsK7xsnMy7O5wry7s4hzdnZraWFibGhZV1dbQUxLTUlFQUM/RkE6OTo5OTU4NTQ6Ojk7PD07Ojs+ODtAPD05Ojc5Pjk7PDo4Ozs6Pj45QT0/QD87Pjo7PDo9PDw4OTg5NzY4PDw9Ozw6Ojs+PTs/Ozs+QDyKwKuouLe5w62zqZ2ZlJaZoZymsLWxt6bFztLLw8XBxc/HzcHDxr/ExMPDysHJyr6/vMC6srO0w66proZoZIqSiI6QfHh+ioV6e4SBd25eXVxdXV9gX19kY2JjY2JgX11bW1paXVpaWlpcZG5vaGZnaWtucoGtubC1rqalp6eaoKWhmpylq66kqKKsqqyqsKOmn6qttbaxvbmvt6+prri0tLy4tLyvt7m1srvBssCupamiq7Gys6i9qquoq6yttLOmqK6hpK+psqanqK6mqLessbK3urq7sry9vr7Ev7XCwcfIt7/AxbfEwr+7v8TCvsTIzMq/vsTAwKmHc3RyamldYW9kV1ZYUEhZUlNLRkZFPj5AOjc4OTc3NjQzNzo5OTo8Ozs8PDc7PTs7Ozw4OT44PTs8Njo9Oz89N0E+P0A/Ojw8Oj05Ojs6Nzc3ODg3OTw7PDs5Ozo8OTc5Pjw+P0E7jMKvrry3ucSwtrCbmZWcmKqpsLGztb2vxdDPzMPIurrLwcu+u8m2vcO+usm3wcPBtLW7tbCutLutqKeHX3GOg4iLgHt+gH54dH98c3dlX11cXF5fYF5fY2NhYmBgX11dXFpYWltbWVhaXF9ma2ZlZ2Vpa29yhaqlrKWgnKKllJ6lm5iRoaOqpKKfpqWopa2gnZylpqyyr7a3p7CrqKq0q7S6sba1rra5sa+6urG2pKCkn6axp6uouaqkp6iop7KtoKemn5ukpqyen6ejoKGxra2ssrSztLC1vLa7wcGyur7DwbK5ucOzwL2/tbi7vb68wsfEwsO+wMSgg3hwa2FmX2tvYFRZXkhOZ09UR0VKRjw9Pz06Ozs4MjU1MzY5OTk7OTo6PDo3PD88PDs8ODg8OTw6Ozc4Ojo8OTg+Oj89OTg8Ojs9Ojc2NzY3ODg2NjY7Ojo7OTo7PDg1OTw6Pj5AO43ItLW9uLrAur21oJ6VnaGmurars7O7s8TPyMvCxri3x8HMv7jJt7vFuLPEuLO+wKu1u7GrpK6yrJ+iimGCh4aGgXx5dXRvbWtqanFpXmBdXFxcXl9fYWNiYGBgYF1cW1xcWFlYWFhWWFteX2RjYmVnZ2dqbW+Inamgl5abopaco5mWjZ+ho6ebn6CkpqKonpuim5+rsKyxtqOpqqqsrKS0ua23sKyzta6yta6wqp+dn6SisqSmqbitoqamn6isq5mfoJ6ZnZ+lmpmjnJudr6mrp6qsrK2xsrivuLm7sLa8vLqrs7O6s720trGxtbS/tr3AvcPBu7u9l4N7c2tfZV5kZFhUV11JV1xLUEdJSUZBPD8/QDs/PDA0NTM2Ojs5Ozg5OTw8Nz4/Oz07Ozg4PDg5ODw3ODo7Ozo7Pzo9Ozc4PDo9PDc0Nzc2NzU3NDY2Ozc5Ojs6ODo5ODo7OTo8PzuJyba4vru3wcHBtKSkmZqkpsCyr7astLfGz8jIwMa7u8TDz765x7i3vreywbSxu7uruLmwoZ2oqqaWnYJlgoWGf3hybnBua2JeYmZmXV1eXV1dXF1fYGFiY2NiYV9cW1taWllYWFdXWFhYWFpeYmRkZWZmaGlrco2nnZSVlZuYm6KXlpGcoqKonZudpaaippygoJuYrq6trrKgpaKuq6eitbGysqyor7KnurOmtaCinpujoa2joqq1qqKjpp2mpqOWmZ6XmZudoJqXnZ2dnK2hq6ekpKatq7O0qrWws6uyubSvqq+ysrO3s66prK6yuLC6trq9v7ezsZSFeXVlXmVeW1lWU1pVS1tRS0lFSEtJQj0/QUFAQToyNDUyNDk5ODk7OTo9PDY9Pzs8Pjs3Ozs3Nzc+Njo+Ozo4Oj07PD06Ozw6PTs4Nzk3NDY1NTQ2Nzg1Ojo4Ojk5PDg3Ojg5PkA6gci9t72/tr68v7KdpaOYpbHCtba9rbS4wszIxr/FtsG/x863wMS9s7m5sr+2sbi6rLG0rZ2Yo6iekpp3aYGDhH94b3F0cWlmZGhlY1xcW1tdXVxbXmBhXl9fYF5cW1pcWllYVldXVlhXWFdWV2FkZWNkZWRkaGp2opyUlJCVl5egl5mVl6CeoZyWoaKppJ+fqZ2cmqunr7Cqm6OkuKqhoK6otqqmp62wpLewpLegopuZmaqmoZqsuLCioaScop+fk5ShlJaWm5iXlpeclZ+qnqqkop2jqqqwrqi0q6qnrbOwpauus7GwsK6vpqensq6xtLC8tLm3rqOUgXl1ZF5hVllXU1JUS01eTE9LR0dMTEU8QD48Qjw7NzY1MzQ5ODg5OTo5Pjo4Pj47PTw8Nz49Njc2PTc7PTs5Nzk7Ozw+OTk6Ozo4Njc2NTQ1MzEwNDU2Nzk6ODo5Ojo3Ojs5OT1AOnbAvLS5wrG+uL2unaeoo6q7wL3Aua60uMHMx8XCw73Ft8jMssHCwa28u7S7vLS4ua+vr6ebmJ+nko+KcHqAfHdxaWxydHBpaGVkZmJcXFpZWlxcXF1eXVxbXF5cW1xZW1taWFZXV1ZXWFdXV1ZbYmNiYmNiY2RmaoGWk5WMkpSUm5mdlpacoJyglqGgp6akpqefnZ+moKqvpp+ipLeooaGiqLSipailsKWwrau0nqCdlZWpoaKUrbGxn6KjnZ6Ym5OLoZSRk5iYkpeXmJeep5ynoaKZo6Wlq6SlsKelo6urraaprq+uq6iqqbOlpqyvtLGvvLWxr66gknp2cmRhXFpdWE5MUkhSYU1WUE9KTU9FQkQ/OT02OTo3NjQ1OTk7OTg4Nzs4OT0+Oz47PDY5Ojc7Njs3Ozs6ODU6Ozo7OzY8Ozg4NDc4NjMzMjEuLzI1NTY7Ojg7Nzg3Njw7Ojs7QTh4u7uxtb2wu7G4rJ6lp623u7zBxbqxubXEycnAw8bGx7bGxLPCv8Wqt7e9tr26urWyq6ulmJedoYqHcXyIfnZuY2FmaWhmaGpnam1gXVxbWlpaWlxdXFtcXl9cWllbWVlaW1dVWFdVVFZVU1RSVWBgX2BhX2BhY2RpgZSTiZCOlJOUnZWWl6SZoJedoaairaakpKOjopyqq6WZn6WxqqCgnaWrnaeinq2sqamtrKGiopWYo5uckKupsJufop+el5mTip6RjZKTlpCYmJOcoaOdpKCilaCipKabo6uloqSqpKuupa6yqaalpqa0pqmorbO1tLm6r6msnotycG9gW1dWVVJHUU9IWltPUkpUS1NMRUZJQzg7Oz08ODY2Nzo5Ozo5NzY5Nzc6Ozo9PDw2Ozw4PjU5ODo4ODY1OTo8PDk3Pzw5Njc4NDUyMTIxLi4xNDI2Ojg2OTg1OTg5ODk7OUA5e7W0rbS7srCrsq2dqKevubmzwMi6tcCvxcjMusHKzMi1yb2xvsTJrLG4wbW7wLu0s6ippJSYmZqHfnCHg3t0aWlqbGdqa21ram1lXVxcW1tcWlhaXVtbXmBgXFhYWllYV1hXVFZWVVRVVVJTT1FZXVxdXV5eX19iZG2OkISRh4+Rj5qTlZOcm6Ocm6GpqauorKeopaSZpa6klJmlr6mfm5mboJ6umZurs6Clpp+io6GVk5uWlpKpqq2anJ+hoJqUkIyZjoyRjJKNlpWQnqGgo5ybo5WboaOhl6Koo6Koq6Crr6Ott6Wjo6Ksraqoq6+zt7O+tbOrr5iEdHNoW1hYUlVRRVhMUVtYTVROUExQUUlOSUI8Pz9BPzw2NTc5OTw8OTg3Ojc5Ojs8PT47Nzs7Oj02Nzo7ODk3Njk4OTo2Oj05OTU3NzU3MTE0MS0rLzQzNDk4ODo6ODo6NzQ4PTg/OX6zraiztq6pp6+um6morLe2rLzKu7a/rMvGxbjBzs/Is8S7t7vDyLGtuL+3vL26srOjp56UlZaUhXhzgHZ3bm1obW5tcGdnaWdkXVpbW1tbXFtZWltcXF5fX1xYWFlYV1hXVlVUU1VWVVVTU05QUVlaWlpdXFxeX2Bkfo2Bi3+MkIqSjZeRl5mioJugq6qmrqyor6Somp+soJWWpKinnZeQj5qerpaYqKqZn52UpaCekpCSkZOVp6ulmpmZnp6VjYyLk4aIjYOQi5GVkaCeoaOXlZ+VmqGinpSbpaWnqKigsbCmsbynn6OstKuup7C1sLm1wLGtsauQfXJzYlZTVk5SSUZWUFJRTExXTUpMTlJHTUpBQ0ZEQz5ANjU4ODk7OTo3Ojo3PD06O0A+Ojk7OTo/NzU5Ojk4NzY5NTg3Nzk7ODU1NzY2NjEzMjAtKi4xMDI4Nzc7OTk7ODk0ODs4QDh/s6ymsbeqpqKwq52qp6mysaW2xrS5urPKxbm6wcvQy7G2uLy+wcOxsLK3rbSzurKxoaGam5aVkoF+dmtnbG5xbnFqcGtkZWdlXlpZWllaWlpaWlpaXFxdXFpYWFhZWVdYV1VVVFJTVVNWVVJOTk5SV1hZWVlZXFxdYWqAen92iY2HkIqXiZSUmJuZnqmboKqmpaudqJmhpZuTj5+jm5eXhYSSm6OPlKOdlpaWiKKbm5OLjoqQmqSnnJWVl5uRkYeUjouBi41/kIqSkpKgmp+ilZOYmJWippmNmaSmqKahn7SyqLK3oZyit6yqraSysqa1vLWsq7GjiXhzbV1OUVFMT0NNTk5QS0ZOTkpKTk1RSU1KQUdMSEdDPTg1ODg4OTo7Njk6Njg7OTk+PDg6Pjk7Pzg3ODk6ODg2ODU3Njg4OTc0NTc3ODIwMzAxKyktLzEyODc2Ojk5OTk4NDk4OEE3d7anpLaxpaejqaWgqKWks6qissO1tbKzxsa3usPKzMazrLq9tLfAr62psJ6mrbmuq52YmZuUkoV6gW1fX2ZycHZxaW5pZWdoal9YWFhYWFlZWVpaWVtbXFxZWFhXWVlYVVZSU1JQUVRRU1VRTU1LTFNXV1ZYWFlYW11hb3N2cYWIgoiAkYSPi5SRlJ6hj5uco6GjmKWXopyVjYeYmoxzjYN+jZeWhpGZkJSOjnuZj5yMgol/ipifo56Qk5iWhY2ClH5+dImOeZCHk4+QnZqZmpGVkJ2OoqOOiZqgoaSkm6K0r6yvrJ+YpbimprGhsa6csLyqqa+qmYJ3c2NWTVJPUE1DU05MUU1CUFFISU5STUhKSkNKTEZLSzw3NDk4ODg7OzY5Ozc6PDk6Ojs3OT85PkA3OTo8ODk3NjQ0NDU4NzQzMTI1ODUvMDEwMikoLC0xMjc2NDc4OTo6NjU6ODdBN3i3oaO0qaalqKOmpaamprOnprTBuLC0sMnEt7nBzsW+s6y6wautw62ooqaSnaa1q6GcjpSVkY58dn1lV1ZfZ2ZpZ2huY2poZ2JcWFdYWFhZWVlZWVlaW1tbWVlZVldXV1NUUE5QTk9PUFNUUk1NSkhOU1NTVFVVV1lbXWlscm1/hXx0TlhykIOXho6dl4uUkJ+YnZWUlpWPlomAk4lfO1dvfIuUiYCMkYyQhoZzioWWgXmBeoWUnZSDlY6RkIOGfZN4cW+FjX2JgZGNj5eamJOKj4mch5+Yh4iWnpqhoJenr6mtqKiflq2zoqaumayrmKi0oqmto5N9cm5gW05TUlZMRFRKUE1MRk5PSUVMUU1LT0pJTU9GSUk8NzU5OTk5OTo3Ojs6Pj44Oj09Nzo/OD4/NTg5Ozc5Njc1MzMzNzYwLi0vMzQ0MTEwLy8oKSsrLTM4NTQ3Nzk8Ojc5Ozg2QTl5t6CjraGmpqqgp6mno6mwqKe0wbmxtbDHwrezvc+/ua+utcKnqsWpo52Yg5SbrqCYlYWTjoqGe3J0XFFMUlVZWlddXmJnY19ZV1dXWFhYWVpZWFlYWVpaWllYWFZXV1VTUk5MS0hHYlxNT1JNS0hGSE5RUU1QUlRWWFpgbXBpe4J0UEJAf5WRkX2JlI2Eio2bjZaViZKIhpWGeYh/YEpRbniKkYR9hI2KhX9/bn5/lHd1dXeEjZlwUY2IioZ7fniUdmh3hoh+ioiVio2RkpaLhIqIlISajIKEkpuWnp2UpKOoqaWknpuwqqGkpJGmqpaiqpyipqiJdG1nXltIUVFSTUlVTVNJTEtPSUhGSk5MTVRLUVBPRklDPDc2OTo4Ojs7ODo7OD4/OTk+PTg7PDY7OzQ3ODs2Nzc1MzQ0Njk2LzMvLjEyNTIyMS8sJykrKiw0ODMzOTc5Ojk5Ojo6Oj85d7abo6edn6Kvoaeopaeor62qtby2uLezwbu2p7nIuLaoqLW2qrK8pp6Vjn+Jk6eVlIl9jYOBfHZvbVhNS01OT0xNUVdbXFpYWlVVVlZWV1lZWFhZWFhZWVlaWFhWVldVU1BNSkVAQJtrc3NJTUtERERJTk9oWU5RU1RVWm6DdHd+amldVY+JlIl0f4eBfIWMk4GSmYuPe4aPgHZ/eHNudXB0jY6Ben6Kq4V5emh2e45wcm14gYuNknh6gHuBdnJykndndYSEhIR7lYmIioyLgH+Ei4x/lIN8gZCYlZyVkZ+dqZ6foJ2gqaWfnZiNp6SToZ+Wnp6kgHNoYFxcSlZPUkdKWFJPSkxNUkpKSkxQSUxRTFJUTEVIQTw3Nzs5OT49Ojs8OThAPzo6Pj03PT03OTkzNzc4NTY3NTI1MTQ3Mi8yLiwvLzIwMC8tKygoKS4xMjcyMTk4Nzk4Nzc1Ojw7N3aumaOimJyftKmvqaWtrLCxqr20sru4trq0sZ+3urKqnZ2sqaiyr6GakY2UgI2bjZB+doV3e3VvbmhYS0hISEdFSEhQVFRUV1dTVFVVVVZXV1dYWFhYWFhYWVlXV1VWVVNQS0Y+OTNOPH6eTUhKREA9QURqlH5MT1FRU1ZedYN8eGZ3jZeYjY99aHmBdniAiY99hJiSgXGHj3x3e29rfq19c5CLf3uGkoF9f3RmdnyGbG9oc3yJjIiAbHlxfXBtdY9xaXGAfo5wQ4uEgoOFf3d3eouFfox7dX6Oko+YipKam6OWmZ2anZ6inZaNi6Wbj56XjpaYj3dvbWViWldXVFFKU1VUT1BOUFZLTktOT0pRTkhOT0tFQzw7Nzk7Ojo/PTk8Ojk5Pz87ODw9Nzw5OTk5MjY2ODU2NjMzNjExMjI0LiwsLS4uLTAtKyonJyouMTM2Mi84NzY5NjY1Mjc5OTV5ppegnpagpq+srquoqbCvsau8uKy7vrmzrKebsKesm4+WnKWppKCXmY6EknmIjYqJdXB7bXRwaWxpV0tGR0VBQENESUxMTVFSUFFTVFRUVVZWV1dYV1hZWVlZWVlWVlRTUUtENzhmNzA/qGlOSEM9OzpEioV6WkpOUFFUWF1lcHJtiKeqwH51eWN8eG98eYiQen2Lhm9tjJJ5dHhqaoCCcZaRi4F+loBJk5huaHd+gmxpY2x5hZCShmtzbHxucnuGaW1wf3ONiYSGen1+e3ZvdHOFgnmBeHB8joyKlIOWl5iakJKVl5mXnpeMg4mfkYuSjYaQln5uaW5ubldVV1RSUVlPUlRUU1hVTU5ITktNTktDSE5HRT87OTk7OTk6Pjw5PDs6Oj0+Ojg6PDk/ODY4NzI3NTY1NTQxNDMyLzAyNCorKiotListKigqKCcsLTEyNTAsNTU2NzQ4NUhBODk1d5mRm5man6WtsKKsqqi1r66stL+rvMK/pqKZlaSXnY2Ei5ShoZiYkZOLc456f4WLhXRudGtwbGRralhORUZDQDw+PkFGRkdLS0tNUFJSUlRUVFRWVldXWFlaWVlaV1ZUU1BMRTFAmjMganNDmW87PDk1PICChl9JTU9PUldaUVlcYKeIYpppdHplf3Btf3qLiXaBiIZ0bJqSdHN8amudj015hZKJhI5nMXaGc2x+foN0ZmV0foSEhYBmaWx1a3GAfGdxcXtuk42Pe3N9fHFwbnVtgn94eXVqeYmCiIqElpOSkIuNkZSUj5eOgHmIl4iGioaAkIh2ampvaGRXUVpXWVlbTVBVVllYTklIRUpKSEdCQUZEQ0c9OTk4Ozk6OTw6OTs6OjpAPDk6PDk4Pjc4NzcxNTIzNDUzMzY0NTAzMS4qKispLCwrKykoKycpLCwyMjYsLDU3NzU0NzhpTzg7NW6SiJqRmZakqK6esp+muq+rsrDCsbvDx5qWj5SZi42FeYSQmJSNkIyPhnGHgnOHjIV6b3Jwbm9kcGZfVEZJQz88Ozk6P0BBRERFR0lMT1FRUVFSU1RVVlZYWlpZWFZVVFNQS0U4MC9cYLNHOVhQOzk0NDGWuotITE1PT1FWTEFJUUlir7Ogcnx4bH1tcoOBhYF6hIaGeXKhlXR4gXN1lIc1cZ2onY6hoYSihXZwhnyHfHOMrY2JgGdmYmpucm1wg3Vpb1h1cI6akndsf3t9bXFtcIB6c3ZuY3aEfoaAhZCRiouJkYuRjIuPg3V4i4+AfoOAfo97cnBvbGBbXF1bWVhgX1JOW1pYV0xISkZKRz9DQUJHPkNEPTs5Nz07Ojs7OTo5OTs6Pzw4OD06ODs2NjY1MTEyMTI1MzQ3NDUzMS4vLCwrKSopKSoqKikoKikrLzNETTIxNjY2NDM8dlI3PTdikoGTiJaRnqSnnq+VpbWqrrGuwbK7wcaWkIyUkICIfW6BkJKJg4qHj4V1goNslYiHe3R4eGx3bndjaV5JUEc+QDc0NDk7Ozw9PkBCRUhMTExMTlBRUlVVVldYWVhWVVRTUExFPDUqnUtbQC1nSTk0Lz+Sg6muX0dMTU5QTDdDTVJTREqGdoB8fHZ+bXeIiHx+hYN/jH52opl5foaBhZmEm5xhhqqfnYuDkI56d4h+iYiNc4qXj4R6XWRxdHp7d4psZ2pieW+Fj4J6boF3dIR6cHR6d2tuaV53h32HfIiHj4CLkpeDjYWNh31xhH+EfXV3e3yJdnByc2ZnX1tbXVNbZl5XUVVYW1VHSkpETEc/RkBEQz5BQT06OTc8Ozs9PDo6OTk7Oz0+Nzk+OTk4NTY1MzI0NDAwNDY0NTU1NC0sKSsoJycnJigoKSkoKCsrKy8wMFVxPTIzMzMxRX5XND05XIx4ioCUjJKdnZ+mkaCroLGor8CxusW6lo6RlId6hXZrf4yRgn2KhI6MeIOAc6GEi319gX5wgH56Z3ZrUldMQEUyMTEzNjc2ODg6PD5BRUdGR0pLTU9QUVNUVVdWVlZUU1BNRkA6Mj0gI5ZjjFs1MzExaT9Hb0lGSUxNT1JMS1RdWVJKaYSIe4l5fHF8j4x6fYmHfpeHdqGZiIePkpSljaypSIaur6+LgYCTioKLgYSRqIeAmJiKnHNtfIGGh32OaGdoeH5uhYeChXGEhUdrgHdyeXZobWtfd32DiX+IhYx6lZ6biYuIkX96dYt2fHhtb3d+f3NzcWtbXl1bY2NYZmVcVVBQVllQRExLRk5JQ0ZDQ0FAQ0E9OTg4Ojo6Ozs6ODg4Ojo/PjY7Pjc1ODU3NzMzNDQyMzY2NTY3Njg7REZMTU1MQzcrIiUnKykrKywvMDArbnUyMjQyMEyBXDU9PF6EdHx+ioWIkY+WmJKXoZ2soaa4r7O8s5eNkouYi310cH+Jkn59jIKSlH2Gfoakh4h/goiFeIeIfnOEeF9jV0tCNjAuLzIzMTIzNjY4Oj0/QEJFR0hKTE5RU1RVVFRWVVNRT0dDPzgwLCOHWz4/ODQuXZZwc6NVRklLTU5QV2BZcFpcXmqNk4eVgYSChZGTfoWIkYGalYKgoZeVm5qlrZOau7Gnu8fDqIqMoaWPlImBkXtyhJ6fkZx/doWFio+IkGpob4OAdY2HhItxhoJ3h4B7doV9bnZ1Z4CUj4aJiIiIh6GroZaJjph/e4KJenpvZ2t4fnl+cmpkXltbXWlcYWZfWU9LTldSUUlQSkROR0NKREJARERBPDo4Nz08Ojw6ODg3Nzg6PT04PD02ODY1NjYyMzQ0NTU3Njg2NzxCQj88ODo+Q1FeZVxHMicmLCwtLS4xKD+LWy4zMTBPg180PztudXBmeIN7gIyAgZGPi5qbpJ2hrKarr7CXkZGEoZSEeHd/jJR8f5KGkpV/ioCSm46DgIGMi4KJjYN/iX9tcGpdQkE0LS0vLy4vMDIyMzQ3Nzk7PT9CRUhKTlFSU1JTVFRSUE9IREI8ODcvOUQ+PDw2My5sk5dNUEhKTEtLTlZgY39nZ211nZuPmpOTi42OmoiTj52LoKCSo6qlo6yTqLaiqMHDrseveLqUmnyNoZ6ZhJOFgo+in5SZkoSKhY+YkZZscHWJi4KWjI2Pdo+EcWyFgYqWkoOFiHKJoZaHk4mPj5altambjZWig4eThH1/a2prfIB/gXNhXWNfWmZqXGtrXldLR09TUU5NTEZJUENETUZBQ0VHQj46OTc9PDo7Ojk4Nzc2Nzs6Nj06Nzg1NDU2MzQ1NTY2NjY4NTU2MzEwLiosLCkoKS46UGFcQCwoLSsrMCwncog3MjQwT4RiM0A8dW5nWXCCcHWHcXaShn6YlpqVn5+cp6CqlpOYnmdlpJp+hJKReYCSiJCSfYqFmZKRgoCAi42JhZCGhIiFeHh+Z01SPi8uLiwvLi0vMDAwMjEyNTU3Oz9DRU5QUlRQUVJTUU5QSUVEPjs8OkNGPz48NzUyPD9SNUhISExMTU5SXm+KfHOBfaCdm6imopmhl6KVnZ+onqmrn6isqaq1l6u/q7bIyLfJ0c++m6Bwaaupn4SUkoWcoZqamaeRkYiVopqad3p+lJiSoZKXl4GUnnt2lZKrs4mNl6B9lJ6cjpOWmaSiprawnZGZqIiXkI6BiGxzc3x+enFoYFxhX2FmY2BnZ1xRRUpLUE9JSkxGRk1DSExGRkNCR0RBOjg1PDw4OTk5NzU2NTg+NzU9ODQ3NDU3NTQ1MzY5NTg6NjE2ODYzLzAuLSosLy4tJyMqO1hiQigqLDEtKEuXXjA2M1GFZjJBQGlhXlBwdWBufWF3jn18lI6Oip+Sl56WnKqYnqpCRH2HiYeYjXiCjYqOjXyKho+QjoGCgImMioSShYKGiYGAhndfYlA0NjAtMS8sLjAwLi8uLjAwMTU+QUFNUVJTUFJTVVNOU0xFRUA8Pj1HR0BBQDg2NjI8OTtGSEdJSk1PUVlthpB3lYujp6q0vbilrqysqKm0q7C3srKtu7GzvpyzxKy7ycu4xL+4paOwsqytq6SLlpiFpqagopeBppmNoqqopIeFk6ShoKqhpKmOnLGLlaOnt7uboKOwk6Odo56RpKKrr62ztaKVpauImomSipZ6e36EfWZgaFxlYl1jY15mZl5bT0NJSFRPRkhMRkpHRUZIQUtGQ0ZGQTo4Nz08ODg6OTc0NjU4PDU0PDc2OjQ0NjQ0NzM5PDM4PDIwMjU1MS8xLi0qKi8sLSooKiYlNVhYLywwLCwwhIE4NzFQhWg1QUNbWFRMaWNXanBYeoV2gZSFiIKcg5KQjZLayJ2Wc1aXiI+InI98hoyOiop6iIKHkY6DhYCLhYaHkoaChImGiIeHcW5hQEU2NDwyLzExMC0sKy0xLy00P0RBTVVRUlNVVVdVTltQR0dEPD4+RkhDREA4Ozw1Qzs9RktJR0hST1BXgZOghK6js6qywcfDq7PGtq20v7O4vra/tMG2u7ukuMaptsnHtb65tKijtK2xsZyakpqfiaevq6SVdp+kl6GrsbOYlqqtqK62u7K6rK+1orGssbW8t7WutaCnqKOom6mwrbK6uLinm7epjaWOkZOgh3mBgnRYYWRWZWFgYl9gZV9aVUpERUxVUUhKSkRJR0VBQEBLREFNRjw4Njc7PDk3Ojk4NjU1NTcxMTw4ODk1NDY2NDk3Pj0zODkxLjAxMjExMzAsKiwuLCsrKyooJyopRVowMCovK2iSTzYwUodqNkFFV1FKTFtaUWNkV3p1cYKUfYWGk3aFfoCNe7+7o7yCtJSTjZuPhIiPkomJeYaAjJOMh4WBjn+BiY6GgIaJhYqHkXp4bl1WQEVNPDY6NDZBQjc2NTAvNkNIQ1FcT1FVV1VcV1BfVUlLSkFAP0dLRkVEOz5AN0Q3P0JKSkVHV1RQXo+lraOxtMO2uMHMyba8xb20tMC3uMK1v7C4dLK0prrFpLDGubGzsbSopLW2qrGgopabopKlsa6lraynpJigrLO6oqmyurW7vsy/xcW9vbPCt7q4v7e6t7msrbCmsaqtvrC9u8LCrJm6qJSuj5iYq4l+gXpqV2JhWGpkaGRWWmNZVlRJR0dMUUdDSElBSEQ+P0JCS0BATUM5OTY2OTo/Njo5OTY2MjQ2LzE5NTk5MzY0NjI3Oz0/NjoxLi81ODo5NjUwKigsLS0tLCwqKCgrKyhFUy8qMDBKj2s1MlCHbTY/RlFMQUxSV1RZVVp3anB/j4SBjoVuenJ5iGK4oZmjiZWTlpOTk42Ql5KHh3uGgY2VioCEgIl6fIuHhnyKg4GKg5V9d3l1ZU9cZEdFTDpRZGFbXlNGPztIUERaY1FRWVhZZ1pUYGBNU09FQT9JSkhFRkFAQz1FNkI+SEdLTFNaVF2Tr7i1urnJwLu9ycy7vcC7t7W8u7e+tbqyxmB1s6Wxmp6rvaqlqKuqo6KytaGrp56Vlp+YoK6lp6elnqSUoqextKeysry2wb3TycrTxsLFzMLKw8C+vb+7vLe0sLm3t8O6xr3DybCeuaqirI+lqLeJgX5xX2FhXFdhX2hmUlhhVlJVSUVFTktBPkdEPUtCPUJAPUY+O0hANzk2Mzc5PjQ4OTo1NzA0NS8yNjM4OTM3NDUyNj84QD5HS1JUVFJQUFFSUUpBOS8sLCwqKygoLC0sL1A+KC40OIB9PDJLiHE5PkNLRUBJTVBSTFFdaGxscZCNhZB0bXNyc4jVwLWZoI2VmJmRjpeRlpaOhod9hoOMlot/g3+CeHqLg4d7i3mBioKXf3R9emtlcHVZXVxQZWViYGVkXVtYV1xNZG1VUm1tXm9fWGdlVVlUSkRBS0tIRkhISEhCSTlEP0hLVFRWXFpbkrnAub23xsC7ucrLura6tri5s7i1tK62tplkdaierXBeoqycmKGjm6Seq6WUn5+QlI6WmJeon6afn5qZhKSdrKWqsK23sL251NHP18/JzNLMz87Kx8C/wsq9wb3CwMXExsq/yM60pLuwtbCbrLm9mn95bF1gW1hdYVpjYlFbYFNRS0NBRUZEPEBFPkJIQkBDPTpFPj1KPzQ3NTM1Oz00Njg5NzcwMjIvMjQxNjk3NzU1NTVEM0VMTT41MTAwMDY6NDc3QElPSjstJioqKC0uLyxATSsvNTRtiUkwSIl0Pz5CREBDREZLT0RSXFlpX3CXkpGUb2xvdXWIs6yhoZ+LmZyZjIyVkZuShYqKfoiHjJCLiXyBhHN7iYOGfIl0goqGlX9ze3hsbXV7aHJlaWxpZmppaGBmaWhtWm10l62kvIiHZ1tvaF1aWVRISk5QSktRTFRRSUxBSkdLUF9fYmZpYZi3x7C5s7u+trLEx7awubGwu6yzsaeqt6yNtqeem6eaT5udjI6glpGmmKWVipOTiZCJj5GRnpuhmJuVl4eemqabrK+or6eztNTU1dbSy8/T1c7Tz83FwsnQv8rJy8nSyM3NwtDSuLDEvMS6pra7xKOCbmNcXF1YYFdaZlpQXFdOUENCSEVCSTtBRD5BSD8/Qjc7RD5ASD00NjY1NTs6Njg3NjU0LzEwMTQ2Mjc4ODc1MzY3QzVCOD8tMCwxMzQ5PTk3LC4sMTtGTD0pLCguMDAwN0s/LTQ2VIhXMESHd0M7Qj5FQkFDSk0/VVlTZVdzkJCYg2hxb3l5g6CqnqaXjZubl4uNlZGajn2Ji4WOioqLkIh8hIJwf4eBhnuHcoOSi499cXh1bHF4fnF7bXhzbGiAcG1jaW1weWl3fX7Lv8Lfp21jeG5jW2FgSlBSVU5ZXlBdXU5RTlRRVVRcbm53gnKWrristKewtqutvcCxq7WmpbinrK6hrLSjjrGumpiYjJGUkYSOm4GNppGciYOLhIqJhIuDlJWYl5SbkZyYmZmenquspKehrKzO0tXRzczS09TQ1NHOyMPU0cjN0tPT183S0cXS1sbAzsfIw6m/uNCeeW5lXWJcVl9SXVtOT1NQTkg+QUZBQkU8QEI+RUU+Pz86PT09PEpBNDU0NjU8ODg4NjY0NDEyLzAzNTI2NzY4NTMzOz08RT1AMTErLzM0OT81OTAxMDIyLTJFTzMpLzMuMzI9TjI0OEN9XzJBhnREOj09ST5AQ0ZIPFZSTU9bdYaFindtd3B9foChnp6hi42Zk5OMi5OPloR5hZCQjYuKiJGHf4J7cn6Agod6hXWFk5GJf292c2xzfHt2fHOBd3FqgHJyaW9xenlye77Lmn6MsYN2coR2aGFqXUNaWltWZmRYZWtUWF1cYGNdY3h7f4uBmaqkpKGgoammqrG5qqa0o6KtoqOtoqexn4mmmpSSkYqSjoiCk4lrlaKNmISBhX6Rg4OTlq2LlY2VmY6FkpCdl6ewoaChpKSox83PyMLL0NPR1NLO083G1tLM1NjW1tjV19XJ1NrNydfW0cqtxMPMinJvYmBfWFNZUltPSkdJSUpAOzo7RUFEPEJEPkhCP0JCOzs5PDpHQjQ2NTQ0PDU2ODc1NDMyNTAvMjU0Njc0NTU0NDw+PUU/QTYyLy0xNjs9MDgxLzI1NC8tLjtSMDE3LzUzMkVEMjg+bmI1PYF0TTk5QEk8QUQ/QTtQTEZLWXCAdX1oc3lygomBnZWdlIWLlomPioiOh49/d4SUmYuNiIiLiX6DeHN7fYOHd4B7h5GXgYNud3BtdX92eH1zhXx5bId2dG99doR1eXudtYw8QYrGpX6NfGllVklDZWNmY2hqZG95W19maGtuaW6Ag4mRi52eoJ2Ql5ifo6OmsqSks6CipZ6hqaCisZyGnpKSkpCLjouGg4+EfpybjI2ChIV6lH6CqZWjjJKKmJKLfZeKmpGrs5iam6ecp73Dxri2xs3S0NLQzNLLydTO0NXa19fY1NnYzdjbzsna2tLWv8zMtHd2bmRdWVJVUFlWRUZKSUVFPTo3OUBBQjpIREBFQ0FEQTs/Ozs3REM3NTY1NTswNjg5NDQzMzQxMDE0NTU4NzQ0NDQ5QD5EQkM8MzMuNkZUV09RSkFKRj8xKiguQlQyOTI1NC83Szc1PGBiQTxzdlY4N0FIOj9DPjw5UUVDSlRsbm9wYXFxc4aNfJeRnYt+h5KCiYaFioKHfHiFlpeIj4OHhod6hHlxenuEhnV6hY6NnXqMcHxvcHp/cnyBcYOHgG6OenV3fXyCdX98h4iwdFipwraMkoFwbmI9XmhycHFwbnh3gmVpb3J1eHJ7i4eOlJKblqCWh4yTm6Cbn6qfoa2copqZn6Wen6yZi5qMkZKNhX2Ih4OFi46gmZOIhId+bZl5hJiGiJOMjZWMhnubiJOPrqqUlZeemKautr2orb3Gy8jJy8vPycPRytTW2NfY19Tb19PZ29bP29rR1sjVy5V5emhoW1lQU1NdSEJFSUk+QT49Nzo9Pzs+SD1AQUFBREE+Pzo4N0RCNzU1NDc5LjU2NjQzNTU0MjMyMzY0NzU1MzQ1N0VCRENFQjU2PEZOU01bbmZjbnNrYVY+LDRMRzg2NTQzM0JGND1XX2hMdXheODs/Rjw8Qjw5OUQ/Q0dSa19tZGJma3aAiHGRkJuAeYCOfoOCgoV/hHx8hJeOh4t+hoeAd4J5bnt7hoF0epKejaF2j3WCdHWBfXSAhG+BkIFvkoR0fIGFenaGe4m3xqTCybiBlpuPeHBlTmZjgXqBd4aikIt5eXd7g398hHZtlJaUlY+XkIOJj5aal5emnJigl5+TkpejnZmrlpGRi42Sg4yFiYiBhZCRnpyZiYWLgYaXe4iIn5eQiY2Ki4J8oYmQi7yhmJOXmZyopqWunqe1vsDAucfJzc7FzcrR1tXU2dXX29TX2drb19va2djO28aGenlmaGRfVFdWVU1LRE1DOz09PDk6PD45PkE2Pj9APD8+PDk4NjdDQTY0NTU9ODA2NjU1NDc3NDU2MTM4NTQ1NjQ1NjdISD1ESkU3OTI1O0g+Ozo6N0lQXVpSVVhLOVQ+Ozk1MzI3STg9TllNSHh4ZDU9PkM9PEA6Njo+PkBFUV9ZZWFdW2h0enlsiY2Sd3Z6inx+gH+AfYV6foKRiYSFeoWIe3V9dG58fYZ+dH+SnpGfg5J8hn54jn14iopugpqAdJiFfoGJhXx+kHqPqY+Qw6C8jJyjnH2JhH2Jc4yKfnOmmpyZlIV7j5CJhGhHcaGknYyLkJKFiIuRkpWPnZqTlZGXjYyVn52UoZSSjo6Qi36Qj46LhImSlpqfn4mMlJKekYKLf6aZiIWOgoaEgKWGioy4mJ2RlJahp6Cdnp2jrra6tau/xcrQyMfMz9PS0tjS1dfA19jZ29ja2tnZ19y3eHl3amlkVmBbU09OSERMQj09Pjk5Ojo5OTw9NkA+Pjw9OTo7OzM3REA4Mzc4PjcwNjg4MzU3PDM3ODA0OTc2NzU1NTQ2RlA1RE5JODkzOEFLPTszQ0BJPDlEV048TVRITj85NjMzMz5DO1tYPjVZeXBaPDxBPD0+ODU4OT89RFJTUlheVVhmbW1taYGPinFyeIp7e399f3yIenx7i4eCfnWDhnlzenNtgX6EfXeGm6GbnpSSgIuIf5iHgJySboeohXqgi3yQjoOIhJx+mpGKjaOioJCkr5+LkYuFi4GShldyrYufrJyPg5ibkJCOXIOikYKMn5OVjIaIjJKTjJSVlJCMj4qIlpudj5WWkYuSlIaAi4mSjYqKnZaZo6OGk52WoYuKiI6ckIOIj4CDh4WkhoyQs5ickpSXoaGemZKbnaexuKylvMHHzcfGz8zPzM/Xz9HUrtbV2NrZ2trX1tnanm98dGdmXF1YU1ZXQ0BJRD4/Pjo0OTo7Nzo7OjM7Oz89Pjc7OToxOkc9OjI3PUA1MDY3NzI1NT82NTs1NTg1ODo1NzczNUhSN0dPSzk5ND1FSkI+MUZDTEE5ODpHWEA1SFdJNjYyMjM6RUNlWD8mX3lpX3o+Pjk8Ozk4OjxAO0JRS0tTWVBUY2J4bWJ+koNubXeLeHl+eoF9hnx7doaEgHNwhYJ7dnZ1dISDhX1+kqajnqailomdkJSWi4qol3KKso2DppGEmZOEmYyilqCZk4manaKSqa+fkZSQjo2IlYtujbeEmsTIsp2ipZucmJaRspBjpM3IlY6Gh4mQko6Nk5SKhYqKhpaam4+QlJOHlZiEgI+LmYiNkKqXl6SjiJmelpuJj4eXl4uFj4yBf4aPpYmNk6iZl5OWmKGYn5mTnZuisrSlo7zBvsfFxcnIycLK08zN1KjS0dbW1tja1NPazoJyf2hiXl1dTklUWUFCR0Q7QT04Mzc7PDo4PTY0OTo8OjgyPzk5MjlJOj42N0JDMzI6OTYyNjQ+PTQ7PjY5NDk7NTc5NDRLUTxKUUs5QTdCR0lANjRKRUxGPjw4OEVUQTc+XDg2MjE0OjtFYFhBRmF0aExjWj41Ozo6NTs6PTpFTUZIUldTUkJjgUZ2gY59fG1+iHh6fnqCgoN+dnaAgnxsbot/enx4eHyEh4p+iqOzp6Oqs6GWp5+lo5aVrqKDkLiVkrKZjKGhjKSbr6OknZiQp5anmayvpJeUlpWQi5iZlqDAjqPJuaubo6atmJGbnbKdhYWoopyYhYmJjpWNi5OPiIGGh4mTmJWMi5STh5SYhoSRkJx0kZiylpeloYicmpOQipGKl5uJipaOhn2MmJ6JkJCcmpmTmJeflKCdlZ6boLGuoqS3vrTFx8S9w8O/xs3KydKmzs3T0tDW2NPQ2LtyeXZdYFVfVk9ISk5EQkNFNT46Nzc6Pzs8Nz00MjY2OTc3ND01OzU8TDw+OzxCQTc1PDs0Mjc3P0A2P0A3ODQ5ODc7PDU1T01EUFJMOEA9RUFHQTU6SUVORUQ6NkFAQlM+OURPMzIzNTY1PXZcPFJcdGlaTV1TPD04ODU2Nz06SkZER05bXFlJZmA7SISLentuhYZ6fIR4gYWBfnB4fH59b3KNen2BfHiGi4mGhJKnu6yosr2vpK2zs6ijorCsipq0naK4pJWtpJeprbempKOfmamXqaOvsKqZmJyUlZGXoJiau7uuyqFqtrirsJSYn6Ork5e+o16qsoKJio2Uh5F8jo59g4aOj5SViIeTl4yQlY2LjJeYkpyZtJeVq52LnJSSjpCSjJmbipGekIuJlZ+hjZSNmJmckpuYnpShoJScnKWvqKGks7irwsjEtbq9u8XHx8LRoMbJzc3E19bRy9ShcHpoXFpTXlFPRUQ+PENBQTg/ODc1P0Y8PDU8MzUzNDU0NTRCMzk6Qk06QjtBSEI7OkA8NzQ2PEI5P0BCODc0Ojo2Pjw0N1RLQ1VRSjc8OklBREA0QUpITkJBPzZEQTxKTkQvVD0yNTQ6RUpcWEpaUW1ncHBEaWBLSTY3NTc6PkpAQ0lQZEdiYGJwSkCLin+Bc4aHfYKIdYOKgn9tfX18f3B3h3eNgYd7jY+MhoyZqsLAr73Gu7O0wby0rauztoynsq2tvaqbu6Sorbm4q6amoaKjo6ivsrGqnZykmJuXl56ipqWSpLquqcC8ra2yuaWkp36IhpytvbCDjIyLkIOPg5GPeoGIkI2OnIiHj5eNi5WXlJCal52omrGakaycjpqPko6VkZCWl46RoJGJlJujrJSWj5ScnZOgnZuYoKGUmp6npqSipLCzp8HGw6+wurbFxMK+zabHxMfDvNXRzcTKiHRyYVtZX1tNSkJMQEZHPkE/Qjs6ND5BPD01PTY+MzMzMjQxQTE3QEJOPkdAQ05DQT1DPTs4NkNCNUJJQjo4Nzg7NUI+NzlWS0RXT0Y4PTRLQEM+NEVKSE4+QUE2QkI/QlNFNThQMTQ1Ozw4O0Q+OUxqal07V1JkS2daVU83OUdFP0NGXGVHYGlnWl1ck4yMiHuHi4aDjHWGkYqBb357gX9xfoF6lXqSlJSYkJOVp7PGyb/CzMHDuce8uq+rubuXsre6ssCupcCkq6+7vKqtq6OjnqeqrrSwqpugqpuhm5WfsLSni6O6urbBvKyonLKlpKiUhY6qxMSkgouPh4iEhpWUjXqDjZGPkaGMjJSSjoiXn5eTmZWYpqCunYyqnI6Wj5KRlZWNkJWRj6GUhpefoLKelJqUn6GYpJ+aoJuglJiepaOmpqSvrqW/xMKuqLe1ycO+ts6yxL/EvLPRycjCtXR4bFxYW2lSTEhETEtLSkFBPUNEPDVBRDs6Mz04QjMzMjI2M0EwNUlFTT5JQEhSQEg+Q0A7Pj1GQTVBVUA7OTk4PDdFPjg+VkpDV09HOD80TEBCOzVKS0NMP0I/PEJGPUFITDkrRzwzNjc0NjRBPzdPYU9hRS89PjZrbGpgQDpIPj9FQmZaTmVcZlRjapmNl4qMiJKQhol5hpSQgXKAfI1/eIeCgZB6jaGWqJqamLq9x8jJwdLJysLNvMGzrbu+p7rAvrzEt6zBqayzu76qsKmkpaOsrbOttrWgn66epaKYo7O9qZuovcGjt7ewq5Kwrausl4eaqqelkYKMk6WViYF2ipJ6hY2SkJ6fk4+Ui4+NlKOZl5yVlaOeqZ+RpZqMj4+PlZaIfI+VkpKjmpWgopy1ppCel6SjoqWenaaYnpWXm6SjqKeisqyovMDEr6Wzt8zAua7Es7u+writwsPCwJlteWFYV1tbS0tNSkZERElCQkFETDo0REg5OzQ8N0UuMTIzNTJCMjZTSE48SkJKUUVLQ0RFOkVMQjw3RVY9Oz04OT88ST86RVVJQVdRRzdBOks6Qjc5Sk1CSUBDPjxERzxCQ089MjBIMzY2MTcwPUI6PWpqSks1UVMzU3BwZE47RD1ARj5qSF9YYVpkZFaej52Ol46ekomKf4mgk4R4hX+Vf3+QiIqQgJahma6mo5jCvsfDx8XTzc7Ny7zCt7C5vLS8y7zDwbW2u62zv7m8rq+ooKintq2tqbK3mp6soqehnau3uKmksL/Esb65s6eqtbOtrpeWpayooJGOkrHFp5WOfZGVfYiRmZCqmZiTk4+TlZOlnpOdmZSho6KcmJ+Yi4yPj56IWpCWl5KWpJllmKOesqWWopasrKqnm56ml5iWmJWgo6iln7arqbm8w7Wms7XLwLiqtqyyuriuqLi6vbiCa25aV1RUTkZKU05LP0JIRERIR0c5NUZNOz43PUBKLjMyMDI1QjU1UFZOPExGS1JMT0hHST5JUT86OElTOzs/Nzk+RExCQEhTS0BXUEY6QT9HNkE3O0hNQ0U7Qz00RkU6QkFCRzkvOkEzNjAzPkdEOTQ9dGRNRztFKzpmfGdWOz1AQkZCcUZpSVJlYkxGpZSclqGXqZaNkYOHppOIgoeCnISDlZCQk46aop+vvq6hxrzFxMbGzs7O0sq+u7axuru8v8+2xL24uLeysbWzuLOrppyrq7iqqKevsJejrqSnpKS1wLCrrLS/w7rAurOnubW4sq6Vpa2vr6WLk5WhjXTBmn6XmYWPlpqMsZWampWTk5mZpaOVn5uWmqmdnKGgmYqMj5adYEqWnJqVmqWWVJawn6+cn6WUr66rpZqgpZSTmJiOnJ+mopm0qaqzvLy8qrCyx8C4paurrbGxo6GysrSkcG1mXFpOUEtFUFBQUTtISklHSUNDPjpLVT9BOj1FTTA3NTQ0OkIzNE5XTzxKS05VTlFKUEhISk9CPD5NUjs+PTg6PENSPkRIUklCV05JQEJBRjM+NThKS0NBPUM7NEVBOkE/PkhANSpCNTIsPmNdZzozNXRkZUBSNyYjM31oVzs6QkNAPVFFV1NzYldGSKqXmaCiqK+ZkZeHi6eWjomThZ+HhJ2Xjp2hmqOktci0qca6wsPHysjIzM3Gvruzrrm4wcHNtce6wbi1urCvr7O0pqObqrS0qqimrqyapK2lpKesur+oq7a3vsG/vrmzssSxub2so661rLqmiJyYppt2v6CFmZ2Ok5mai6+XoZycl5Wbn6GpnqigmpqqmaGnnpiQjZGdg252kqKalZ2inpCusqKrlaiql6qto6OfpaiSkpmciJScop6Xsaepq7q2vrOyrb65t6Cjp6ilp5ycrampjGJlYF9RS01HSE5JVUw9TUROSktCQ0Q8UVU9QUFCRE8xOD03Nz9CNzVVWE4/SE5RWVNQUVVLUUpKRUFFTVE/Pz04PTtHUjxFRFFCR1lNS0FIREU6OjM5S0lCPkNCOTlDPjxAPjs7RzctMj4tMYJoTnpcLzBraGA8PUJCODZ6Zlc7Oj0uLlJgTVVIf2VeSEWrlZyhn7uvmZSfi5Orm5GSk4mrjYein4ykrZSjo7bGvbTBusLCx8jFws3Iwb25sq+5tMDCyrXFscG8tLqqqK2tsKKjmKq0u6appquqnaivp6Oqqr68p628tLi9x7y3tbfBsb3As6m1t6u/pY+jmJGioLyfiZqgmZeeno+3n6mcpaObnKGaqKWzoZueppyoqp6ZlY+Um4uXiYylopSdop6gtK+lpZOwq5mrq52dpKOokZWVoIOPnp6blamkoaG0tLq1rai1srOenKKlmpeVmaqhnndgXF9dSkhGR01RSU1FRkdCUkxKQkVHQFZSREg9QUdRMTtCNzpCRjc5XFlLQUxQVFVTTVdSTlVKREBKSk5POUM/NT08TlFDPz9QP0VaTUpBS0RHQDUzPUlHPz1FQTk3QTs8QDw8M0A8Lyc7KkiRQjpTSjAsW29XNzE8Kh1CgGRUNDktMTpnXEZDQ5xwYkdFp5ekn57DrZuXpZiZqZyWmpqPqpaVp6aVra2Zoau2xMK7vrfBwsDHxL7Nxru9ubKvuLO/wsi1v6+7tri2pqSqq62goJqrqsSipairpp6rr6yiqai/t6atvrG4tse2tbm4v7K/wbe1s7SvvqOXo5aUnJSuoJGioqWjo5+QvaSpnairnZ2gm6afvaKYo5+iqauhnZeNlZ6TnoePhY2TnqShnbWsppyWsqeZr6efmqmeoI2ZlZ+EjaCam5OlpJqYq7G1saqlqq2snJigoJKOkJaonpRoYllhXU9JR0pOTEhFRElBPVBJQTxHSUhbUk9LPUhPVTRCRjk+SEc1Q2FbS0NOUlVXVlFYVFJVSEA4UVFQTTpHQDRDSFFTSUM8Qz5HVktDQE8+SzwwNjtHRj47RkE1Nj85Oj85OzE1RDAtLC9Ndlw0S1o1LE1uVzwtPSkeI3piUTVDS1E6blJGPEt4ZWJXTKKao5yexayhn6yena6gk6OflqWgpqmrl7exo6qztcTEvb+2v8K7yMK+ysi2uLW1sLOzt8HGtr6wuLS4tZ+mrKqsnZ2epaTBpaCqrZ+kqa2voqanvbWlsby5t7bDsrO3ub+yxMC4uK6ztbWjnaWVkpShrqCZop2pqKujmsKtqZ6srZubnpmmob2inaWYq6uspqGZjZmfkp+Jj1d/lp+moaC4qqeTmLWjn7KhoJuulp6OmZSdgo6fl5WOoqSVkKausqupoaKlpZWVnZiLj5GTpJ6JYWRZY2BMSEpKTkZFQUZLPj1KQjk5SktOXVFRST1MVlw5Rkk9RE1JOEhiXExDTFBTWVlWV09aXklBPVdRSUs/SEA1SE1YU0hBOkBBRFBIPz5RPks3MDk5RkU7OEc/LjY+Nzg+NzcvMT85MSUxUVVtW0pPMTA9Z1dEMTc9LSt3YFM2U1prV3JIRTY9dWVcS06en6GZnsOopaK0opyyqJOrpKCkn62prJ28saistbHIxcHCs8LDvMbDvMTKvK+wtq2wtK+/xLS5sbC5tKyZqLCpqZqdpaGnwq2brLGbqqKusKmkp722pre7va+3w62zssLAssezurestLatqqKmlpaVpKyin5+aqKuwr6+7sqagqaiZmZiToqS4oKGkk6+vrKWnn5KhnpWej5CNlZ2ao5+ns6amjZi0m6Oump6brZCek5eUmoCSoZaOjZ+hk4umrLClpqGcoJ6SkpqThYuSjZyef2FlW2dlSklMSlJCQ0BJRzs7Rz85OU9NVV5SU0o+T15dPUhQQkxMSTlNY1xMRUxSVFlbU1VPXGJIQT9aUUFIQUtCN0ZFTEtOPjtCSEROQj07TkBBMy85N0NCOTdGOys2PDQ2PDM1LS80QDErJ1Z0U2VPPzEwNGJbTTIzPjA8dl1eP1tUXmVxQDg7SJZ3ZUE0n6OfnKDDqKSqsqGjtKqVs6ynoqSyrK6pu7KssLS0xsDEw7XAxL3JxLXAyMG0q7Wor7isv8S0t66strmlmauxq6qXn6aXrbu0m6iwm62frrSyp6q5sqe6s7eyucCqt7HDvbTGp76vrbe1qqisoZeXkqaloqOYmKWvuK6ytbagn6ikmZWVk6Sgt6OkppausrKnq6ahnpuam5aYqJ+gmKKer7Kipo2Xrpmlq5eZnqSRm42Tl5qFlp+UjI+cnpSLqamqoaegmZ6VjI6ZkIGFlYmUn3hjaF1rak1QTU5UPUNBTkM6OklANzdST11eUlZRQVdgXEJKU0hWS0g6VGRcTkZPTltXW1JQUVhdR0FCW1BCRz5OQzlIR0hPUD8/Q0lCTEI8MklBOTQxNzdCPjs3RTcrNjkxNDgwMi0vLjw2LSNCcWdzazIzLzFbYlozMzgwNnBbYkgwNUlwaFZDV0aMeWZDO6SjnaGmv6aor6+hqbSrnbmwq6OqtLaxsLm3sLe4uMS9w8e9vMTBxsC4wMbAuqm2pKy7rMDCt7eprLG6opWtsK2ylqWnkaq5qaCnsJ2qoK+0s6qptratu6yzs7q3rLiww7q+v6bDq7C3r6mrq6eemJmroqKgkZihsa+zq7C5mpypoJmWkpemobeppaOisLG0q7Koq5+boKCbnqWdopedo7Owmp+Qk6WaoKialKKelZiJlJiTlpedlIiQm5mUjqiopp+jm5ebk4eOmYt9jJaFj5tqaGxhbG5XUFFaVEFDRVRAOztJQTc6WFBkXlBWV0RZXl1NTFJOXktKPlpjXk5IUE5bVVlQS1RXWkk/RFhQREY/TkA9SUdHUVBCPURGQk0/OjFEPzc3NTQ3Pz05NUU0Kzc1LzI1MS4tLiwxPSonKz1ccD0+MS4xZVtkQDE2NDdnWWBGKD84bH1oW1Y7iXtjQz2nn5yiqb2hq7Cro7G4qaW1s6ygrbW8rrO4vLq9trbAwr/IxLnEwcDAuMS9wLevtqert7G7vr+0qa6xtp6Xq62orZenqI6nu5+krbOeq6KxsLOsqba0tb2tr7G1rLC0scG6xbervK+xuKytqqOxpp+lqqCkl5CZoLOqs6qqs5qdp5ualY6gpqS0rqeirK2usaezrbKqpJyfqKSelaGZm6i1qZeZkpKfmZ6gnpCrnpeXhZWXi52ZnJSKjZaXmpempaKgnZaVl5OAj5SFe46Sg4yWZWxyZ3BxX0ZZZlZEQ01YRFo5SEI2Pl1RaFxOWV1HW15dTk1SWGRKSkNcYl9QTE1OWFdYUEpWVldMPUVVSkVEQU1AQUZISFFQQTtHREZLPTg3Qj02ODcxOT48NjVEMCs4MC8wNS8qLC8tKj0sLCUyKyo1SzEvJ19fYVUxNTA9YFZeOClDM1lUXGdLNox6ZkxApJqgpKy2pK2ppa+utqqvtbqnprC3xbext77BwrS0usW+zMW5wsC5vrnDt8C5srWsqrq2urm+tKqtsbWYmKesqqubq6uOq72dq66xo6ugsK2zrq62srm3qq6usqi1r7O7vcqyqra1sbSvrqehs6CbqK2gpZWWm5qyo62gpq+XoaSampKOo6Wns6mhprKsqralrrG1r6SZna2nmpifmZmsuKOXk5CPmJyhmJeUq5+bkoCTmIydnJmWkYqUk56apaKhoJiWkZOVeouPhXuMioOLkmtueG11e2BFYWpZSUhZWj17SkZENkFiVGlbTVxgSlxdWlJTUmJhTEtFX2BgUUxJUFdWVU9HV1ZVTjpJVklIP0NLP0VESEhRTkE/SEhIRTw3PT46NzU2MDk/ODY2QiwtOCwvMDQsKCwvLSo3NikoOS4kOks1LiJUYFVgLzUoQ19RXC4qQi9KR1BbSDNjWVRLRJmXoLGosaqtpqSvrrWpt7S5pKyzt8q6tLq6v760s7fDwMzIvMO8tr2/v7e/vLG9rqe6uLe2wrarrbG3lJemrquno7CqlK+7pKyxsqeoo7G0sLGxtbG4s6muq7Knt6+1tMPFtqm1tqywramno7afoKexoKSUnJqVsZ6nnKCqjqmjnpuWmKampbinorG0rKeyp62wtqykmaCsqJucnZuUqriclI6Oi5mcopeQmKWhnZSCkpaPnJyYlpWIl5CXmqeco6CSlpCQlXaEkId7hYGEjIttcXd1e35cS2VsXEtOY1w+YntHSThHZ1dmW0xeYk1YWVdUWFRpXU9PSGFdX1BKSFFWVVJLSVdVVk04TVpORUBGSz9IQkNLU00/P0xPSEA7Oj47NjswNDE8PTQ1OD8pMDcpMS4yKSksLC0rLTkkMDQyJTlCNy4jQU5IZjI3J0diTFYlLUIuPUVMUTwzcmtKQ0ORmaWupa2uq6elsbKzqrext6CrtbnJuK7Bu8K3srG1wsLOxcDBvbS8v7+6v7yyxKipuLC2tr+8rquzspyfp7GtpqWvpZ2ytayrsbGtqai0uqy0srWstK2qrKisqbitsbDHv7ilubCpra2lqK2wpqSkr6SpnJ6cm6+Zo6Oio5GsnqOgoKKqpqa5pay1taSqq6isr7auo52jqaqboJqakqS0mo+JjYeRoqCVjZSdoJORhI6Tkp2amJWUh5eTlZmnm5+ejJKRjpB3fo2FfXx8h4qJcXRyfn19XFNkb15OWWZcRkSWW0c7Tm1YYltNYGJOVldWV1RYZ15RUkxjWltUS0dPVFNOR0lXU1xOO1BeSUJESEpBRT8/S1NPPjpOTUM8PD45OjU9KzMyPTYyNDk6KDQ1KS8sMSgpKywtKiY1Ki8mMCkzODoxJiozQmM7NipIZUhKKzpJPzNCSVMsPo9rPEdIj5yqq6KpsaSppbO0sbS1srKhq628zLquwLvHsbSstMLC0cXGvsCyvcDCvL+3vMSnrLess7i7wLCrsa2go6etqqiksKOqsaqvrLCvsK+rs7untrGyqbKpq6alo626rKqxwrm1rLqoqaitqqixpaqko66qqKKfnKOslaWemJ6ZrJ2ip6mirKajray4sbKgqaKgq6+xrJ2fp6ipmaOYmY+gp5iGhI+Ki56gj4uMlpyPjoaHkJSfnZaYlYaWk5OXpJucnIuSkI2Jfn6HhXx3foeFhnRzcYh1a19ZYG5jUXNxXEs7hHxGPld0WGBaTmNbTlVWVVdRXGJeU09OaFhXV0tHTE5SSEVJVlJdYzxQXUQ8RkhIQkc/PUpQTDo+T0o9OT89Mjo3OyozNT4xMDQ4NSg1LyosLjMwOyksLCclMjM0JCwyLTg2MCkoMTxdSjAuSmdERjg8QjA1RUtYMUCUWj5MRZWYraihqrOcqqqwtq24ta6rpaqqvcm8sb23wq+xrLPEw87Ow76/s8DCw7rAs8jErK63rbK4wL6zra6rpKeqsKmnqLGmtK6qsK6tsbC0rbS7pLizrKyup6ugop6vt6qqrbq2pba1o6qnrKyqraGpp6aysqSmpqGhrJaqoZWaoKaepKKqpa2in6ext62uo6Wim6qrramcoaWkpJigmpaPmJ2TgoOQiYWcoIyKjoyZjpCLg4yXo5uSkJuMk5KRlKKZm5mKjouKfIaAgYN6dICDgX50d4yjiHhqXmBuZ1dlh2NOP2eTTEVieVdiWFJlVE1WVVVUT1xdYVVLTWlXVVdJSkhJT0JHSVNRWW9BTVhAOkpHRkVHPj5FUUg4Q0tFODdDNzI6OjoqNDk/Li80NjMpNCsqLCsuIzQuLSsmKCs3OSomNis8LTIsJjA2V1ouMEpnQUE8PEMrOkpPXjREhj5IRkSXkrClo6qxmKuqrbWrtrGrpayqqbzAwLi4s7u1pbKwxMnL0b/Bu7i/v8G5wbrBxK6xtbGzusC+s7GuraurqLaqpq6vqrmwqLGxr7Kttqq3tqe0t6yspKmrnKOes7OoqKS0tKC2raCpqKupq6egq6ypubapqqqqoqmgrJySqaGdoKSipqOqnpynta6opqqio5ilpqeqnKKko5+ZmaCRjo+Zjn+HjIeFnp6HhIqKjo2QjYOGlKKajoyakZKRj5KflpiWi4qDf3SGgX9/eXSDf3p4f4GInY9vcWdncXhcYHOIa09emVZIbXhVZFZRYlBNVVRVUE9YW2JVSFBpVFZTR1BZVUk+SUhPUVB4TE1WPTxLRD9AQTxAQ1VDOUFLPTU7RTEzOzk3KjQ6PSstMzQxKjgqKisqLCkpKC8qJiklMzssJDIpMjAyMSUvMlFiMDI/Zj1OWD5DLD5MVF8vSmo2T0Q7lo6woaarrpqspa2us7Svq6Wwqqm6vrvAsK64raG2r8nHyNHAvry6vMK9usPBv7+usrKxtby7wrGxs6uzqKS1qaWts7K5sKOut7Kvsrmrua+prbasqp6prJ+ioLWtqKGfr7KitKqeqKeqo6uhoqytqL2vrK6toqiooKyZkK+hmKKgqKeeqJuZqrCpo5+toqGToqOjp5iaqaWYl5mdj4qHlYh9jYaEg6OXhYKCi4aOjZGEhJOgloeQnJCTkI2RnJSXj4qGhXh0gX98dXh5gHt0c3ppgYajdWleZWuBdWaIi31SWHBdSnhzU2RTUV5NTVJZZk5MVllkWEZTaVJRP0JOUWFROklITFNJcVFMUzs8ST87PD07QEBXPDw/SDczQ0IxNTo5My01OjopLTMxLS02KSgrLSw0MiMyKScsJS47LiYxLjAtMTQlLC9LZzo0OF89YWQ/RjFDUFtbK0hOOVVBNJGPsqCkpqykp6SsprSysaqksaiquL7Bu6+nuaqmrrDJx8jRw7y/vri+v7zJvMG4sLC1sbq7uMCys7utuK2itKenrLK2ubOoqLy1rbW8sL2mrKy1q62cqa+jn6SrqqecnqqypLOomqqnqaSpnqOpp6m9q7Svrp2ppKCunJuyo5WknKWln6SbmqmrpZ6bqqGbkpuhpZ2Yl6mokpiak5CKgo+Ffo+Cf4edj4Z/foyHkI6QhH+Tm5OFk6GMlJKLkZqRlYaJfn9ye3l9fGh3fHp1cHB9aIV4hIhkYWhjcoV5bGZ4XV1VQVZ6bVRhUFJYS0tOcXVdSFpbZ1lFVWZQRD5KTkRDQTlIR0tTP2phSlE4PUg8PDw+Ojw/VDY6P0M0NUg+Mjs1OTAyNzw1KC41Ly0xMSYvPktIMCUaOTAlLCwwOS8sLCs2JzE3Iy0vRmpJMTRYPWZjQko3R1NgVSo9O0RYPyqPlLGZn6CppaShq6S3srKmqbGnrLjBvbWwo7msqKixw8nJzcG2vb+1t7+5yLbDtbSytbG9uLq+tq25tr+tobOnqquwtbi1q5+9vKmyv7O7oK+ztamsn66wo5ykqKqinpyksKawoJ+rqaiiqpykqKCtu6eusK6gq6Okrp6eraaXn5uho5yfnJqjqqOamqSklZeUn6KWm5emq4uekZCRjIKKgYCPgHuZlI2JfH+Lho+OjIqEkpiRhpSjiZKSh5CZj5OAiHx5bH12eHhje3pxcHFyeGiAdGqDZ2RoYW5zjWxhaW9fbz9beGxVXk9RUUpKTVRZV01dXmxXRFhgT15QSE1ERjs3SEVLTzxyaEtLOUFFOzs9PTs7PUo0OUI8MztHPDQ/MTgtNzg7MigwOS8sNS4uPS0qSz4qHTQ5JicuMzQuMCsvNCYsOiQ0MEFoWTEzUz1lX0RMNktXZU8qPDNPWT0jk5msmZ+Yp6Sin6ejuK+uo6+wqqu4wrqzrZ+4r6uotLvIy8i/t8K+r7S9t8S3w7GvurKzwLW7vrepubi9q6S0qKmqsK65saqbu72ksL+1taGutrWmp6exs6CepKanoaWZn6yoqZ6gqq+noaeYpKigsLifpLGvoKuhrKScpqepmpqcn6OVnZ2anqmml5ufqJKYk5iek5mWoamQmomOkId9h3+Cjn18oIyMiHiDi4WJjIyFiJKajomVnoiQlIKLloyRfIV7c3B9cXN0YHl4aW9xcG9pfnFjemxpZWNgZoV+X1pzanFLTH5oWFpNUExKSFBSUElOXF9uU0RYW1JnT0hLRUY1NkhCTEk1WmVKQDZFQjk6Pj0+OjpDNTk+OjNARjwyQDIzLzo7ODMmMjwwLDg1QiopLUMqLDQ7Tk5AOzczLS4rLTcqKjwlNTI8ZmQyNE0/ZV1GTz1SWmhIKj4vWVg1KJedppmdlq2goKGkobersaSztKqoucW1sq6gt6yurbC1xsjBt7/BubC0vLe/u7+vq72wtL+xvcO5qbu6t6eotaioq7Cts7Cnmr63pa28ta+esLewqKWnsLKboKSgpKShl5yvpqGeoqevoqCik6Sko7ewoaaxq56so6+YnKqlqZ6Ym56lk5udmp2mqpqcnKWWlZeVnY6Ul6OooZCJipCGeoV+hIp6jpeKjYZ4gYeEiIuOhY2TmI2OlpiKjpV+hpeLj3mAe3Byd29vdF95d2RsbGtpaINtZXJqa2VoXGNzf19abHZpWkh9XVtYT09KSEhSVUYyOV5ebFBEWFZZZU1JSUVFMDdGP0tCNklKSDs2Rjk0OT49PDk4QDg7ODo3QEk+ODw0LTM8PDc1KDU+MSw7QTEoKzY8IzhSPSoxMTM+RDUsLSc0Mis7KzEzOWNsODRHQWZbSFREVV1oRS47MmBULDKWo6GXlZypnaWhoqC3qq+gurmmrL3Fs7CuorWvrK6vtMTEvbO/urews7m4uri6rq7As7S4r7/BuKy9urWmorOrqKmzq66yo5zCtqaptrSpnrK7qaamqbCsmaKnnKSmlJihsqWZnqSpqZyioJOloKS5qKSnrqedpaGok5+poqGgmZudoJKbnJegoqubm5mhlZKVlpqNlJOjp6SPiIqPhnmEfIWFfJyNiYqGeICDh4iIkYWVk5KMkJWUjY2Te4OXjop3fntsdHJsbHNheHVoaGpnZW+EZ2hoZGZpamBoYmlmWmV6Y2FSc1RbW1NMSUdJT1NAISlpXmpMQ1ZVXmBLSUhFQy46QjxGPDZLUEQ4OkQzNTc9PTg5NT86OzQ+OEBMPT45Myk4Pjw6OSo2QDMuRTQoKyw+MC1OPy4rLTcsMTE5NSwmLjUtODA1NzZgdEIzQ0RnW0tXR1VgaEIzNzhjTicynqSjko6kppyenp2jta2nqrq3qKzDwbewrKK0raevr7fAwL2xwbexrrK3tri3tqyqvbOvsrG9wLeuvLyxpZ+2rKaltKmrrqCfw6ypprCzq6y0up2oqquxpZidqp6npZGZpq2imZ6kqaGbop2XoJ2ntqWvqq6hoZ6doZWgpp+ioJmcmpySmp6Vpp6to5iXnpWUjpSYjI+YmqigkYiJioh5hXeCgoKch4uCiXt+hIiGhZCElpWPj4+RkZGMknuDlY2Gc359Znhva2psZ3Vza2NnZGN0f2JkZWZlaWpjaXBZXlhdbGRhTWhXWmBWSUdIS01SWD45X2xpR0JVU1xbSUlHRkEuPD85QTg5UkZANzpCMDM3PTc2OTI6PDk3OjlETT1CPDAqPEA7QTwtNUIzNz0rKiwwQSpKSy4vKiszNzIyKDU3JCs3LjcyNjg1XHlOMj5IaVpMWkpWYmZBOzNBZUglNZukoJGMrqCZmKCWpbSxorG+t6Gxxry5sLGjtqurrqm5vby7rcCyr66ttq+zuLOoq7myr620tru2r7i9raaetaugobGlq6+fpcOgsqOusa+3rbWdra+srqOZnKeqpZ+Vm6iln5mlo6mdmqCclJudrbCmuaiuo6Kamp6ZnqOapJ2XnpiblJqhkqiVrKmblJyckoyVmY6UlJmpp42NiomPe4J0goGKmIWHfImIhISKjIiShZOckpKPkJGWjpB/gI2Ngm+Bf2Z5bWhramdxcmtcaGRicoBgZGdqbWxnamhmbFxsbXVxYVRiaGNlWUlGTE1PWFFQVWFlgVRAVlNZVUZIRkVALzw9Nz82PEZOYTg6PzI0OUAzNzgyOD83PTg+RkpARDkyLT1BPUE9MDVAOUAxLSsuMzw7SzYvLissLTI0OjYjMyopNi41NTQ2NVp8XTE5S2pbTVtLWGRkQEExSWVDJzSTopuPjrGdm5OhmqmysJ+4wLahtMK8vbmxpbavqa6lt7m3uKy7r62qq7eqtLmupbO2sq+psba2sbK1uqipn7apnp+qoqqtnKrBma6krrC2taysnrGtr6qjm5yjrKiclZyno52aqaOllpqgnZGbo6uqqbufp6SgmJqanqGPa6KWmJxxgpacpIB2kauonpaWoJGJl5mAl4ugj3mGk4yDbWl+d4NwbIaKhn2Ei4ZvXmNgZ4SXhmuLkJSSdXeLhH6Dj39mh4BodWlmV1xpc25OUGpkZnGDZl5kZm5saV5eX4mQhYdoT0tEOEVUZ15KR1BQVVVLR1Ngb3RlRVtRVVBGSEZDPjE7PTY9NjwzZlw1Ojw3NTtENDg2MDpCNz86PkZMQ0IzNDM9QEBAPTI4QEU9MSwrMDg+RzcwMS4qLiovNjY4LCMxJzIxNDoyNzZYgWwxNk9rW05cS1tmYj5HMVBkPSsvjaSZh5Wxm5yToJuqraujvcWvqbfDuL28rae2sKarpLi0srOxua2qp620prC1o6i4t7app6y2s660rbOiqZ+0q56ipJynqJqtvJWnpa+zt62tpKiuqqumoZ6coKinnJehpqWbm6ennZOfoJmQnqeqo7Wwo6OjnZaYmJejiKGPkpqHoYeUnqF/pX+nq56Tk5yTiYRyeIyOhIihdoiMaZeIZn1zeKBviIeEfo18f6Ggn5l/e4iedIiOdpuKbIeBg21oZWN6bHFiVIZtY21pmHFYanBuhldeaVtraluIcG15codph4RaXkZOPkZeTUVSVldRUVJXVGdeTFlLUlJQRUdHPjw0OT05PDc7MDw8Nzk5OjY9RjU4NjA8Qjs8OT1GUUc9LjU8O0A9QD41OUdBODIpLjE8STkvMDEuKi8oLTQ1ODMlJjIxMTU+MTw4WIN1MjVSa1tOXExcZ189SzFWYTcvKIyml4Scq5yZmZ2fq6qoqr/Dr7K6vbfAvqqkt6+qrKazta6vs7arqaWxraW1s5yttbe1pqeos7Gtsqivn6qhs6mgpKSaoqSdr7aVpKamtrymrKepqqynpqKgmZ+mo5mZpqOkmJykqZaUopyUk6KlpqG3pKSgpJiVk5iUnIiukJiUiamLl6OchbGApK2elJqelXmC1Kh/h5TBm8d5eLGlt5dkgMCcv3mEhHmPg3yQkJHKcZa8nMV7cranupB7gWyWsauweWhrWLGub2VpvJK8bmh6bXKP2H5TamO2sn+AcZR1mqGqkFdPV2FPVk5GVFtYUVBTi1xXW1BAXEVRTkRHSTw8NTc9Ozo5Oi49Ozg3ODs5PkY2Ojc0PkA+Njk/RVJJOi41PjtCPD9BODpKPjUyKjIyQkUvLjMyLisvKS0vMTg2LSAvNDE2QTE9OleDdzIxVGtcT1tNXmdcPkwxW100MSGOppOBpqmel52dpa2yqbHCvbK1wLW3vsKrprOsrKmor7Sqr7azqKemtaanuK6ds7K2q6akp7KurbGmqp6npLKkoqKfl5ygn7CtlZ6jn7S5oqmooa2upKKem5qhqJ+Ym6ihn5iep6eRnKeblJ2hpqKgsKOfoKOWlpKYkpmFsGtqio2qfmeEloetZXGenZWappVxrqGkfne7fGuhj3axX2q0W6WAZZyRYGaBemZ/anhqqWW+cmemjHaxanyxeHSSk2NtbaduW4SgRWlnh5ZFdZxgfmd7o6eCWV+Lq2mAlHh6aqc3Sq9bV1RsY1tLTldfXFdWO06IT1dWL0lUU0pDRUY9PzQ2Pzs4OjkwPTg5OTk6PTxEODs6Nj1BQDY8QEhRRzkwNzxBQz5ARDhARz0xMy0zM0UzLi41My8rLyguMC46Ni8nJDIwM0IvPTtVgnYyLVZqXE9ZTF9nWTpNNV9ZMzEbkqKVgqympZ+jpKqxt620vb6wt8WyuLrCp6mvq66pqbGupLC6sKSkrrOjqbmpnrOzsaSloKqtsKyvpqifo6KxnaSdmJWYm52up5eboZ+0sqGqm6GtraCempegoqmdmZ6koZyZoaekkJ2jmpegn6uepqegm6ChlpWRlpGahrWbtXiFqZm1mXeHs5u3f5OWl6mVfmuBpnqBhYiSlJJ3q2dqsVuse46HlHSJcI+GgH+IkJd4g4KLl4yDoI+FsHZ3n3Framx8i06kWEhjY5l+Y2imYHlydVKThl5QqW1jcX2GgGKdLlGibltUa2dgTEtcZFhcWkI+sHhXWEEjTWhGQ0RBQEExOT44ODo4NDs6OTw5OkE6RTo6OzY6Q0I4PT9LTkg6NTpBRkJAQUQ8RkQ7MDIwMTtGLDAuODQwLC4oLzMsPjgzMR8vMi1EMTw8U31uMytYalxPWE1fZ1g3SjlhVTUwHJaflIizpqairqmns6yqu7bCsLzCrbi3waqsra6upq6yqaGvvKqhp7Wto6u1pKWzs6ejop2nqrKosKilnqCfr5afmZWWl5ifrqOamqSotK6hqY+pqKmbnpWYoKWpmp+do5+coKKlo5WbnpianaKqnKWam5uioJeTkZOTnYPVk5m5cLDCfsaGfNaUm7t8mpalkI2bjKR6jYejgqWCeqx5j51Vr3uJfp9quVq5d4aDfaaCk3yYeqp5jZ2Pe7FujoR0kLuFb5RPr6fFilGgemNgqmJzcodsl4dfU7W0yIaAiXxjpDNCnXZdUWpoZFBAWGZaZGFKSE1sS1pTT1lmWkNDP0U/MDw8NTk7NzQ8Ozg9OjxDOkY6Oz42OkBDOzZAT0xIPDk7REhDQkNEPEVGODEyMTFEQi4vMDQ4MystKS4zMjM5NzEjJTUqPjM9PVF3ajYqWWlbS1xQX2ZUN0c6YVE4MiWcoZOYsaiopbOqpbSopby3wbC6wLG1tbyztqexsaOxs6afr7aom6i6rqKvsaCztLCgpJ6ep6mwqbSppZydnquXmZeXl5aXoquempeorbCoo5+OrKKnlp6XnKGmopiioaKhmqKip5ueoJ6VmZqmoJynlZubn6GZkJKVkZ2Ism5otXGriHCOpnK0c3K2e5qYpI2Pm42ifpCgpX6wdoOR0tF1W658hn+kb5uqpmuGhX2tfZeZj3uxc5OdjnizZZZ0hZ5unmaUUsiLWsJcn3liX61gd3OGYpeIXlnKnW+/gXVNS7VTVcZkVFFqY2ZYQU9qX2xpUFVGSTk9V1JbV1hIQz9KPDI/OzU9PDQ2Pjs3Pjw9QztHOTtANzs+RDsuQ1JKRz4/PElKRkNFRD5JSToxNzQ2QD4vLjI0MjUyLSkuMjYsNzQyJh82MDs1Oj1QcWg5J1dpXEJOVF9lUDVHPWFNNjIvop2RpK+spKq7raa0pai2u7yyu7+3trS7u7OltbSisrKjoKywpJimuq6ksbCctLipoKadoaqlsqisqqWanZqpnpaVmJmTk6OpoJeTpquwpaKWkqyfpZKUoZylp6CVm6anoZqjn62aoJ6ekJabop6cpZSclpqin5WYlpKbhax7d6h2o4+Kh6lvrYqDqIOZmaKKkpmLon6SmImuhX+Cs1xys1KufoOCpH9x1313hH6PnYaZmnevhoqRnId3tGGaZZqCgZVsklqwWEuadZh5ZmCtXnd3h2eYiGpdr3eVno94bDV5yK6yX0JUb15oYEVQbF9wbVZVTS9lY2lTWVE7QURATDo1PzkxPTwxNj85OEA9OkM6Rzs8Pzo+PkU5LUVVSkVAQzpNS0pCSEc+R0s5Nzw0Njo+LzA0MzMzLjIuLjE4Ki4zMiUhMDM3Njc9UGtlPiZWZ1xAPVZfY042R0NgSTo4OJ+dlKC4sJi0wa2osqeqsrq4tLi/uriztr21pbi0oLWtn6Cpq5+Vp7asqLCxq620pJupoKCoorWnpqqjmZ6VpaGUlJyZk5ajppuTkKesr6WhlZipn6KPkaKaqaahlZqmqZ6dpJ6snaCdoI2UnpueoJiYm5aXoqCUmJGnnYapfX2leaGPj4OqcK2MgqeGlqChipeXiKOBkIeUqnyAi515b7FaqIOCiKB5dNh/dod0p4GOm42SpHyWkJ+Ee7JenGSgfYKUbJJcq1tak3+Rf2hnqmRze4FrmIdxXaxaiaCOa25lT0pDoVxaTXRdY2ZNWmFfc3RfSlU1SpqSWUhFPUhGQUwzNUE4Ljs+MDVBNzhAPDY9PEY/Ojw2Pz1CNy5IVkpFQEg2S0lOQElLQEVOOjpANC47PjAwMjE1NCsqMDUvNywmMjEoJCQ2NjcxPFBlZUEmVWZbPzFVX2JMN0ZJX0MxPjihnJmZvqyYtMKuq62pprSwuLG1v7q6s7G3vKq7taCxpZ6lp6eek6qxqa+qtayqrqGYoaCmpKS6oqOroZeckaKglZSfmpSZn6CQjYypsK+mnZeap6afjZKkmKirqJSXqqifn6CjraOgnaGNlKGYn6CSnJeclZ6hlZePq5uPrm1ytHSpjHeKpnO0eXSzgJKko5KcjImkh452uG+Me4uia2u2WqGGZZeXaaCip22UcrR0k5h/smqGkoita3WzYZ1mom6GkmqXXK1gTaF8h5FSc6NseX9+bpiGb1yvVjycd2ZUb24uW6dPYlNrZWJtWWJcYHF8Y1NZUD4+bW8zQkJAP0w5ITdANi47QDM3QzU4Pz8zOzxDREJKRk1JRjYySlRLRUJKNklKUD9IT0NGUD08RTUwOzwwMDAvNzUsKyw0MjYvIzAwLCwdMjg5LzlOYGVEJ1VkWT4vVV9hTDVGTV44MUI5pJqbnbuinLLArq2rq6e3qbivtcC1vLGvubirwbeqq6Gcp6SinZKrqqe1o7Korqqhl5yooKSruZ2jrZyWmY+lo5aNnaGcmZ2fkZOVq7avp5mUm6ypl4yTppqlraORl6uyo6CeqKuwmaCij5iil5+blpuXoZOdqZyUkauZh9SSmrt0scSAw4Z91ZacuHiIkZeMl4mMp4d5o7Z1fXd2woKasmCDunnAfHW4YrWBjIepfZaBrKlxe391vIinoGmdYaaOr6F+jHSHq32+bnO8dLKDdXiAim6aiHBtjaR0vV13fVthebxqW1ZbaXleaWBkZmJteG9ZW1lDQUByP0NGKzVIIic7PzEwPD83OkI5OT1DNDxATlpeYGBfX19aUFBSS0VGSjRITFJASk5FRk9CPEU4ND05MDIwLjk3LSouLzE4MCItMSwzHiw8OjA4TFhhRidUY1g8L1ReYEs1O0xbLTdAOaeanqK8opexw7Ctqaqssae4r7bEsbuyrruwrsGyrKWjnqShnJuRqqSqsqS1p62kn5aaqpmmrLmdo66ZlaGQpaCTjZyjnpiempCWkq+5sKuVl6Oop5SRlqWdpK2ekaCoq6CcoKmksp6jpY6mopWhmZyXlaSYj7CgkpWqnoWQmbWAkZGNuJV4gpObtXdubG5zbnmPhI6Jc57Bu7yae4GyqHCAdJG5g3yGhouHjXuKho2XfKS7ub2cdXqzo3R2l3V0sHWYnmaGaY22dHJwd7aMXoB6fYlng3lteWKLrHB1hX9YW6dqRGVaVGZgY11iUWdmcW11Qk1QTEQ7Wkw+SjM8MCA4PjsuMz1BOTk/PTs8QzZCVFlaWltbWlteYGJgXVNHR0g0RElUQUtOR0VPRj9HPDc+NzA3MC85Oi4sLy0qOC8lJjIoNCQoPjcvN0tUX0cnU2JWOCpPXV09KztWVic9OzynnqGhv6WWs8O0rKqnrKupu66wxq+1tK+4p7W4ramjoqafoJ2ZlKykraqmtaion5uWoKOerKS+pqGqmJWckaKbko+hqKKTnZeSmJSytbatmJ6kpKKLkpKmnKWrnJappaadm6KppqajqaGSrZ+Xo56Xl5ieno+wqZScp6KOan5pnKd4iXN+mo51emWHe72+wLpukoNxlIZfcmpaXpqJYWSHjpVrYICVY22cdmKUa3+alZRlXmBjcZuKaHKMfYaVZ2p+cXR5fXxiW3d0gWhQXG6EfXuLalhseYJySUpvhXBNdE1FV11mYUxbWGdjXk9bbXZqclJPREVOO0hJPE0/MiwyQT84LzU/Qzw5O0A7PUM+UlZWV1laW1tcXWBhYWFgXFVHNURGVUVLT0hGUElJSDs4PTUxOi4wOzouMC03Nj01JiIvKjIsJTs4LTdJUl9JJ1NgVjQpUF5MKDM+W08nPzI+qKCoocGjmrS6tqOspa6nqLWyrMissLOstaO+sbKmoKOpnaObmpmsp66kpbWqpZuYlaKbpq2pv6ipppaUm5WgmpOYpamnkZ6Qj5icsLK/rJunnqeiiZORqpuopJubrKCjmpujp6yin6qimrCblaaflpSdn52XsKWZoqiZnJGenKOkmaejmpyam5qQloJobnxxdpGXlJGEibSpjYaYlY6KjJeXh5SVioOSk5GJjZGUmZOYl5qgopublKCdjoJ6pIVranyQfIB0iYqBcYJ4eXZ2ioB7iWpzgXSDdWR3fXZrcHptYGNccGhNWVllal9XWXB6bm5mU09GUzlPWk5STygrOkpCNjM1PUBBOTpDPjxFTlNTVFZXWFpaXF1gYmJhX15eW1RLQ1NHS05ER1BMT0k8OjszODksMjs4MjApNklSTzgiKSsvMiM0Oyo3Rk9bSidSXlMxMFReOis9OF1LLDwtQLKgs6G/oqSxsregqaWyp6WwtarJq62xprWmwKi0oJ6lpZyklpWgq6eso6O3rKCZlpagl62qpsGfrKSWkpyXnpiTlKKfnqKnkpGZqKeyw6+aq52rno+Wlqmeq5ydoK2YoZudoqWvpqGkqJ+tmJemnZqaoJ6enLCgnaKnlpiTmZSgopajn5egjpaUi4qNjpetj3uVm4KSgYmpqIWBmJaKhI6fiHuEkIaFmZCHhomVjpuXjZCYnqOWmpORnY1+jWais66FiYR2eo+KfXZ5em9neZCBgIlrdYF5iHJodH95dYOIgmt0Y3lmYGlkY2Rmalhre3BqalxSTFBEX1VGQD8/LDRARjs0NTs+QTs8Pz4+SE5OT1BTVVZWWFpcX2FjYV9eXV1eXVhWSktMQklPTVJKOzw6Nzg2LzI5NjQuKCYkLTEuLikrKjclKzwoNkNNTEQvVF1RMDVNWzE3RTRcRzU8LECzoLmvvq2rrrKyoKqmsq2irLOwxbCqrKOzr72ktJygp6KhnZmXqKappqSms7WelZSemZmvpq6+oKujkZGempmUkZWhnJepnYWeqayis8i0oKqkq5aWmJqnnqmcoKSrlJ6fnqCqrqmmo6uirZufoKGapZ6cn52vpJmfqJOYl52SpZqYqZ6al2aDknxlfo6aj2N4jWxoa3qQo6trZZqYfmeFimVlaWh6jaGOa2iMl5Gid2tqi5ijn5hzbG56hI2GeVhlXYWBXmuKioF2W2hzd3eRgIeCbniCeIBzbXmEc3aIiY+De2qFWF5rdGRdc4hpa3xxbGNdUU5XSWRYQEo0PkY3P0ZENzE8PT9BQzs7REdISElMTlBSUlRXW15gYWFgXV1dXV5fXVpVT0RIT0tTTj0+PT02NTM1NTU0KiYmJSwqJS4rKyc2KiQ7Jy9BSVtJLzdaTzYpRVkvRE8xWUM7Py49pZ+6vLmvq7Owq6Wora6wpq6usL2xqaikrbCxn62XoKSeoZqZpqucrKOmqKmzrp6Vo5Cir6a2uaWuo4+OmqGZk5KaoJmZpZZ7payiqLPDuKWip6+fnpWeo5+knKSqqJKeoZ6gqq+qq6OqoKibpp+ooayVoZulsKSYnKuWoZ6bk6WYnquZnn6+g4hytHKFnoataHi5xLhxkqGje6aYmXOqgnzLwMC7cYuih4OffJWYiJ7AvYKWnZ6NncHBe4F6kYyawr99a6Wxb4yBb8p6f5t4kYOOgHZ5gX95cXp/h293hYyTeW12kmJmX3hjX2WBYl50aG1kYlhMVklRWkhPRDJJRT9EQj4vPD8+QEE6OERDQkNFSElLTU5QU1ZZXl9fYF9eXl5eX19fXlxTTVBHVU5BPz89NjQ2ODI3NiomJSMpKiYuKyopMTAfOSojPkhbTCojQ1AvI0ZbM1BZL1VBQjsvOJajuMO1sK/AqamUo6+psK+tprK1r6umpqaxq5+rmJuioJybqqeinauipamlpLSknaOTpq6suLSnr6KSkZmdpZKRoKGXnJ+dh6arpKutv8CxoaqvqpeSn56imaKkqqOToKGena2uqaymo6OmoKWlna6pkaSbqa2qnJ2qnKyilpillqGjmJx/zpR5eqWCeZWWm1+tj16Op4ChoHynlZt0q4OAr15kjal6p4eFoHSXkoizY4KrhqGOjbNqhK50fJaHuGGCrVmjzW6PdXvbe3+ZcX6IknV/ZXuHdnZrfYhufYWQkn5tgY5gcWtwZmBfeGRbcWhqY2ZgUlRSV11KT0M1QUhFRDg+NjtAP0E7PThAPj4/QkRERklKTE5QUk9TXF5fX15dXV9gYF9fXVpXT1VKPT8+PDU1NzgxNjQoJyQhJywmJi8oJiszHTYwJDc7U0wrLS1KMCc7XDpMLSFQQEY0LjGtwsDAtbSwt5iekaSqqa20qqWyrKyspKymsKqgp5uappicorCfoJ+op6OmoZ+wrJuelqaurbGrqKyglJKboKWTj56ll56oo56upKuwqL/Gs6ipsa6Wk52dopegqaqflaGenZ2ur6eqqZunpqOhq5Kts5amo6uqnqOnpqGwoZKap5qhm5SUkZegcIWMl3WEqIdxsHydcqx+oZ+BpY+ed6uCfa1/nHKtfquHhp92mJJ6fJd+qoiijJGLnX6re4iTj6CAeq1WnMR6j2+SwX2BlW11cIxtZnZlhm9hd25yb4mKkZCDbZGPZW9zdW9gZm1kX25paW5mY1dUXGFaUlJDOElJQEQ8PjxARkRDRUE9PDw8PkBAQUJFRkdFQENJU1dZWlxdXl5cXl9hX15eXVtaUkM+OzkxNDc4NDUyJiMfHCAxJyAxJx8nNB41LSY3PldKLT0nPjEpM1ZARiEcRzpDMS4rr9TGx7K0n52jjqOjoq2utq6osaepqqiuq6unoqOdmaKVn6arn6Kln6ioop+esKyYm5aop6+tqKepnpeVmqSikpShrZudpqOurKOstam5zbKtpq6sl5WcnaKZn66snZahmZ6fqbGpqambq6mjoqubr7GiqKyuppmmq6qqsaOTl6OlmpSShaRqpHWJeql0erJxgqWJmYxwiKCah6RfYFKrhH+ugpt1roKnhoafepiWhXtmgKOJpJmGgaN9qX6AlIeuXnyoVZ2ikoF6op+Ae8OvxYxzr7OzuXFiqa/CdGiNjJiPgW2akm9ueHd3bmxmZWRxcGZ7aWNcV19pWFhUTExRTENDQUI7Q0FAQkk8PTo5Ojw9Pj4/QT04NjtETFBSVFZYW15eXVxeYWFgX15dXF1bU0lCNjc5OTY3NCwmJCIgKCciKy0iJC4hMy0mQERXSCxHKzY2KjFQS0wjIEE5RDQsJ8LJ1dbAoZmrqKGvop+wtbCuqayjqKaqq6uppKagm6WfnaWnpqOcrJqiq6Gkn6+inpuTqqS2sK6gqZudlpWnpJGboaifoKacsKajqLGstsiytaqsqpWSnZ2imZ+ls52aoZScn6arq6OumqyooqGqorOtoqqzsqKbqqivr7ajk5akp5ibkXyqbJ6Eh3WreXywboKki4mglpWflYHSuLS4yYCBsl5flKmDpIeHoHqYlZl4qslzmaOVqKmQkpuMfpuJmsbGd2WhgqVzgZ+Ogn2vXm+1Y7F1S6OGbadHgpNkj5Cekntwl5J+cHp0fHptXGZqcnFmgWleYVhjbVxeWUlNTUtFREFCPkE8Qj9KOzc5Nzk5Ojs7OzMuNjxBRklMTU9RU1daW1tbXV5fXl9fXlxcXFxcWE1CNzU3ODUvKSglJiUkJiksNUZOUFBNRkxKVkYqTDAvPi00T1RRHRw7PEYyLCSopMHGua2osq6spaKdsrmsqqGlm6imqqypp6CmpZiqo5+uq52moKyan6mlnae1n6KXk6irtrKsm6acoJaRpq2RmZyno6Cqp66hoqapsLTCsrOqraiUiZidpZuio6+ll6GVmZylpauar52tqKaerKO3rKGxubCdm6+ns7SzpZWYqKSboI6CnU54moF/n3qEo3yCpISGpp6cnpOEuHx8ebmCfszFwrZ4mqCQi59+mpaXinWel4qkmaSofrCFnISehKx9mZRhpWyjcI+FkIF9l4NyrGCkc3GAmmC8fVJVdY6Ro5Z7fZKRiXV5coR+cFtsbndyaoFuWmNfaG5iZF1LTFFUQUhHRkk6OUs+QjEwODg1Njg3Ny0qNT09P0JER0lMTlBUVlhZWltcX19eXV9fXFpaWllVU09IQDc3Mi4sKi4rKicmP1FUVldXV1lYWFdVT1VGPEUyOlBbVBwbNj9ILC0gjIeZqaykq7mrr6CboayztKafoJWlrq6uqaadpqaao6ehsq6hqaayoJmopJSitaKjlZehqbW5pJujnqOTkKKxmZ6cp6ahoq+unKOnorWxw7Gtqq2qkYeRnKedo6SdpZeemJmZpaOomq6hraWmmK+lvK2it7eunZ61srmys6eZnrCipJ6Gj9G1w7d5h46FkZOPgKZ4lKJ3jKCShKWCi3GrhoS0bnJpmaOclYmffJiZhoePcq6CpZuijaaLk52JlJCbbXCyXKVzk3qcbJl/e5l9bqlhonFxf59ic7K4aHiPk6aYfYuMkot4fHiNgWxod2l4c25/dFxkZG5tZWhgSlpXWDxHR0BVM0BGPjwqKDYzLjAxMykmNDo7PD0+QENFSUtOUFJUVldXWV1fX15eYGBdWltaWFVSUlFGOjIyMzAvKysoQFFSVFVUU1RWV1dYWFdVVlZUUU9RW1UlITJBSCQpJZJzjIquv7+7u7Wel6ikrbahopmVo6mnrqmrmaWhn6WgoLWnoqmnsKOUq6OOpK2jnZCamqq0tKSdpp2pkpWXrqCgnqeknKectZmfqaO2q8Kwqaupoo2Ej5yioaajlpmanJibmKWkppirp62ipZutp76slb6wrZ+jsLO6rLSnm6mypaiYeqiQfXywd4qBpKWInG2yb6GHrXyhj4OolpmArImEroWflKigopaFn4CZlYB7kn2rgJ2aloqqeJ2gj4mTkoB5r12jgXymp2SdgHyXdGuuXaVrcYWZXWBbjKBulZGnmYKUjZaLenmBln9qbH5ifXRuf3lgZmVxb2hnaENZYFs9SlMyVThCQkM3JCQzKycnMywgLzY2NzQzNjpAQ0ZJS01OUVNTU1ZaXV9hYGFhYV5dW1pYU1BPTkk3MDUyLiosQVRWVlZVVFVVVVVUVFVUU1RXV1dYVlVVUUhGSUojKCi8kpqEqcbDtsG0n5utoK64paSOm6SjoK+vqp+jnp2tmJ65oKKroK+qmq2hkKqppJaJmpCusaymn6ibrZiYj62ioZ6lopqlnK2Yn6imtqi/r6WppJ+MgI6bmqCmnpKUmZqUmpqlo6OZqKuro6Sfqai+pJfDrKqjoqyzuqyvp6G0sKmrmXavfpCLnIWHfbqtiphksIxlla19oI+DppWagayKhLCFpZmkoaKQhKBbbGqBs2B/rXt7goGxbGdumZeMiLFbfbRbpINryKJln4F7vFl2tVqyfVKvgHqsWIChbZeOqJqKl5CVlnp4jZx9ZHN9YYN4c4B8YWlmcG1mZWVPVWNbQVRePUkoPjk9NCEiLCUfMi4gKjEvMDQ1Nzk6PEFDRkhKTE5QUFJUV1peYGBgYWJeX1xbWFVQTUpHQzU1My4vQFVZWFdYV1dYV1dYV1ZXV1dXWFdXWFlaWltcWFdXR0I70p+zsre9u7TBs6Ocraaltqihi5mgn52zs6meop+dtJigs6iqq56wrZ6rm5WuqaKOiJuOr6yopqOoma6TmY+pmqGepZ+ao6OlmZ+iqbKovK+lqJ6dj3yLm5WhoJmQkZqbkZmXqJ6hmKitp6Wlo6Wpu5+gxqelqaKrtLatrqegva6trZaBqZKjr46bgIakl5iPgYC4w7qDjpyThaeXnIKsioKviKabmqWqkX7VvcKqYqO/vXx+o4KD17q4tYWUk4Oevb6EaqOBb6uEbp1/erKxx4Nqq7C9rXh3or67dICVjaacj5qQlZx5gZCaeWJ9emOMZ3iBe2BrZWtqYlBiW1NqXEBUYUJNKTw6NC8eHyQeJTIgHSQoMDQ5NjY3ODs+QUNGR0pLTU5OUVRXXWFcX19hXmBbXFlUUU1JQz88QT81PVNZWVhZWVpZWlpZWFdXWFlaWllZWFlbW11dXFpWWFRXWryVtLSxv7myvbOina6mpbOmnYyYpb+qt7Goob+mprGbnrGcuaiera+lp5WUr6yXjIOaka+mo6yhpZyqoZiLo5KmnqecmqGoopmeoKutqbmuqKSbl5N7h5mRppuTj5GYmI+Yk6mZn5ipqKCqpqGjq7ueqcWjoK+jq7O1q7CqobyosLCadHWqpLeGZYmfcGesj4qPbW93pJCZn4F1rpmVcJCMcZWno5uYrqRybW1tZYp3bm2CmXGAeWlxaWeJlpWYcWhphYZncIZkXoljanBZXWd+d6ZgYnGOkm9mZICNko6il5eYkJWefIeOlHVlhndojGp4fnlkbGNmbGJLZFhKa1k6UGVFUSdLOSsjHCAbIywpGBsYLTIuNTo0NTc6PD9BQkRFSEtMTU9RU1ZcV1pcYF9hXV1bVFBMSEQ9OkFCN01YWVpZWVpZWFhZWFdXVldZXV5eXVxcXF1eXV5dW1tVV16olK2zqrq5srOqqaKunqSyqZiSvbHDyL21qZ7Aq6yjoKarn7qjpK2srKaOlq2qj4yFlZetn6Wqop+jo6CRjKWTp5momZajqqCWnKWlp6+6q6yam5OSe4SXjaWXjZGQmJSNmJWnlJ6XqKKasKaeoq26oLHCqKS0pqyxsquurKi5pK+4loqhqKW2nYmWopiGqZqQlJ2TqrOZm6KroLKWoqCeoKKcoKShlaumjJKTjIeSnJyUkJmTmJCOlYaBpJqXlY2Lk5KKj4aEfmeLgHSDdnSIjHGnbXyVkZSTgYGPj4+OnZSglZeVoIKHk4xwaI92b4p3dnx6aWxkZG9jVWBZQGlaR2JgTlkqRT0rJiI3NDAuHxwhJTIoKjc5OTQ2OTs+P0FCREZKS0tNUFBRV1VWWV5fYWNdXlVRSkVEPjk9QEFTWFtcWVdYWFhYWFlYWFpbW1xeX19gXl5eX19gYGBfWVlgpZapqqW1uK+uorCkrZ+gtbGRjqvFvMS6t6qhpZ2bpp2wqKO2p52ptKankZiso4uIiY+cp5aspKGap56ek5Wjl6maqJmUp6GkkJqnmaG1uqirmJqQjXyBlIyhlIqUkZWQj5OXpY+emaifnLajnaetuKiwwq6juKevr7Ctqqq0uqKvvZmSpqOmtqOSnaaejamfjZKfo6yvmqGisKivl6SgnKSqnp2dnJernJKZoZuTkJaqmY2YmJaQlp6RiKCdlZSFkoyQjJSLgX5mjId1h3Z5iINznGqHkZSUkYp9jJaSkpiToZKclaCDhpeGeXGVcniJf3F7fmpuZF9waWBbYFltYlBgZFBaOkdGRT0zPT03LiomKykmHSY0MDY2NTg6PT0/QUFDSEpHSktMTVNTU1VaYGBpYGVWUEpBQ0I7OUVNVlxeXltaXFtbW1xdXV9eXV5fYGFhYmFhYWBiYmJkYlxbY5iVpKejsLOsrqOpp62gqLWqkI+cpbO6rquroaKZep2isKSlsamWm7imo5SZqZyOhoqJm6KQrp6klqigoZKXmZuui6qWj6iZqIyYqI+eubakpZibjYl5gZOMmpOKlZGUkI2SlqKMnZ6onp+4pH+EsLajsbB0pL+ksqB4eqCrs7yVdq6kn4qAqn5kXGJ2n46knYOXfm6Ts5yjp62romWeoJNzeZmWcICYqJdsf6KniWWcpZuQl5iWi5GbkYWdmpCVgpKHjo6SiYV4a5CHdodxfIaBgGFpiIuVk4tbdpWRZ2iPjnJ6pJiYZXiYhoF3l2mDiYJueX9rcGVfdW9ra2hcZmNiYm9SWz5NTk5SRz1AVEI5MS8eHyY0OjMxNjY3ODw7PkBBQkZIQkdGSUtMVFVVWVxfaGZnV1FKPERHOzhVUltgYWJgXmBfYGFhX1xdX19fYWFiY2RhYmFhZWRjaGReXWaclaajobCxrKuppamto6etpJKWq7WvsaWaqqarl3OLnK+fqKunk5a4oKCPnKOdkX6IiJqejauao5Wnop6Ol5KehXWtj4immqiRlqOIm7q0qKCZmIuJdXaTjpaTipORkJSMj5OgjpqfppmcspaAjJy1nrWNko+9qKF+p6J6o6+4gY6Op5+Ei4WPsamvjImWopp5gYushpydoqepqIeVhph3pZt6h5uBl6aCgXucsXqKhZ+XmZSYloGQlpaEmZpjeYeQhI6PkouDbnGQiHqBcYCBhn+GdIeFlpJ4lmiTdKCadHyZg5+bhph+kYmBgphqjYyEanh7cXBnZHduaWxqW2VqaWVyW15IU0xRQEU1LVlUVDYpITA5PT42NDM1Njg7Oj0+PkBESUBJRUpLR1JYWlhbYWFoZllRSDlFTDs+YlZeYmRlZGBhYWBiYl9dYGFhYmJiY2ZnY2JhYGVkY2djYWFonZijn6aurquorKCosKenqqWZlK7GvbChlqeotZ6Pg5yrnKeioI2Qvp6ZjZ+aoJB9hY6Zl4irnaKVoKGSjZSJhoCRp42Gopyjk5adhp+5sqedmpOPhXB1kIqVkIqUj4+bi4+Rn5GWn6SWnqyIn7SJtJqui8qHq66Jt4WNsIOxr4SpjaeYjZ18qI9ye3ebjqaWaJWkebSLn56mqJKZwoF/q4iYoXGegJqkfZeFlbGBoXygk5+PmJeAjpObiZiSi3yFk4aNlZOJg21zkYaAe3KGgYV9hXSFgpeBj8VmgKmHj6JqnoKfmIGZgIqLg4iYb42ShGd3dHt2Z2h1cGdna15ibmxmbFhoR1xRTDJFNDZNYGM2JjQ8REdEOjY0NjU4Ozg+PT0+Qkw/TklKTENQWl1cV2JeamxcUUU9S01ASmRZXWNmaGdiYmJiY2NgX2JhYmNjY2RpaWNiYmJlY2FmY2JiaZWXop+wqKmopaugpLmxqqummpSgo6Sqopalqbajr3+gp5ylnp2JlL2Zk42gkZ2QeYOWlpGHq5mbmpqhhY+Md5ucj5+QiJ6km5WYl4aiuK2lmZuNjX9ibZCLk5CNj4yMl4uQkZ+Pk5+hmaGofqGnh62eoJauj5+dnZGGgaCNq6+HpI2qmoyafqN2gJiTa4GrdU2reIeNnZGbqKeBqqt9g6F7eqdpnn+Sa2eXhpe2iJ59bWBjWIOXf4x7ZGeLc5l9eZZsXXyXbl9TcYRcYGx5g2BZZYJ9hIGYcaeqa4OjbnKlcJ+DnWdkn2xabIh6ZVlfgn5hV1BvdmVudHJqam9eam9sa2hXaU9dV0U5QTRHQ15rNCtJQ1FNTj04NDg1OTs2QDs7PkJPPlFSTE1CSlxdX1deX2J2YE1EOk1PTVRiXFxmZmlpYmJkYmRkYmFiYGNkY2FiaWtkYmRkZ2RiZ2VhY2iYlp2guaGqo6askqK2vKuuopmXoKGlrKygna61o6iRoJ+gppyZjpi0mZCLnoyVi3WBlJGNiqaWlZeenn6ThYaspIebkIqYqJeZmpGHpbCmopWZiImAaW6Ih4uOjomLjZKLkJKijJOeoJyipX+TgY+joZSgd5yWkKeDoaeAhqquhaV5i32Emn2icHOTh5Z7nox5bYebjJmQm6iaj4edfIKic3amZp5+d6RfmHp8knOibpi3tLp0koeBgLaoZIHGuHtwlbeMcYCbpGNzrKtgfWqds35ufYeDjoKLl3GAo2xzpHOeg36jXp2Zs5Zve5ees3RyW56ygmlib3R1cWhuWWtsc3JlXGleYktEPUQ1UUFZcTI8UkZfSlM9PDM5NTo6NkQ7O0BJUD9UTU5RQEVfXltaWGBgfGRIQzhMV1VWYmFaZmZra2JiZWFkY2BhYmBkZF9gY2tuY2NkZGhkYmdmY2holJaVo7mZrJyToI6luLWuraCbopyjo6Wtm5qxrayTl6CYoKSampSeq5uLiJJ4i4VwgJaNio+gkJOUnJZ9kYmOqKGHmI+KkaKTm5qMi6iopJ6PloeEfmt7hn59j42Di5CQiY+UoIKWnaCdoJ+LiXecmKKMoHKii4ipiJynkZeoq3+ujH16oJl6o5N4gHOXiIycfZafhpuNmZumhqNkoXyJlpCbjWyeaJqNbpqZen+Kp31yZ3Oqg52Cc6pnlJpdm4V2hJ1oqmqBuGZcqXCBnGGVjF6ndnWJin+eaJp1h5OSmI5/nm6ZkGummVyofne7an2pWo6EXbNnXG5xeXdqaFtwanl5Yl9mWGJBUEVON1ZCUm00SlpaX05aREAxNTE7OzdIPzpDR1Q/WVJZXT5EYl1WYFFhZH1pRUI5TltdWGRmWGZnbm1iYmVfYWFfX2BgZWNeYmRvcV9kZWVrZGNpaGdraZWciaq2m6iJY5WcrLqysKydppycp5+erpqdsKirnZeimaGfmZaWoKOZhomNaYiAcXuXiIuWloSSlZeOeYqElqOdiZSPhYudkZybiY+oo6Cai5GKgIBpgYZ4f5aMe4iNjoePlpp/k6KfoKKTmHJon4qgj4xwkoyCqYiZn6OpoKh9sK2koriXdqOzoqN/iJR4nXqrmn6ijp2bl4iXcqF8hY2vtX1rmpGheH6YtKOjq6iEmHuafJyZfnOqWl1ve5eLeJ5iTX97e4VjepdCTZ9ZompyfI5tgYmEmXWbeYeJsbN/f5qSpnR/nW1xfJRvmXJpo12VdkhlY2BzcH19bWRfa2l3fGRkYVJeVl1UVkBZRVFnRFJXW2JYX0lEPUI4QEI6SUU4TERXQVZRW1ZERmFcWmBLYG1+ckVDPFVfYlplalZnaGxuYmZmXmFhXF1eYWhiX2VkdmxeZWdmbGRlbGhoa2mTnYGxrpmEU1+hp7S6s7OpmqKLm6mcnKmToaukoaiPnp2cmpmVmKGdloeHiXeFgW55lYWQmot9kZOVh3KAiZKgnHKRkICImJSfmoSOqJyalYqLinyDbIWFcYGhjHiFjYiHkpmVfJKkoJ+jiK6GfbWEj56de6aWeqmClp2Qi6Gefadod21+mXOgc3F8nYWYb5OCrn2jg6aemoGjcF6pZ3WjY2+lYZzTkHx6mXhyc2OihY9+onKijnVrj7OLYIKYinOqsqi8f3eDbX+/pqq0XptvfnGXb4FzonJdo2d0pmFopm2b05h7g5tud3mXa5t6dpdybKmlZ19leXB/hGpmZmNudnhoYGNTW2VRUWJJV0lUX1dTW2VqXGVRRUNLTEpLQkpEOFA/UE1XU1hPUlFgZWVpUmR4eXdJRkVjXWRZaGpUaWhqb2NqZ2BjYFxdXV9oYmFoZXxkXmRnZGtkam1naGxomJt/sKxUXEt+qbCytbCzo5yYhZimoKCjjaSooJipiZmXmJOZk5Kgl46HhXtwfYRofY+Dk5qBd5GNjolwf4aPk5Jsl5N8iJCRo5WDjqqalJKKhYl5g3aHgG6Bn4Z3gJKGiJmil3mToqSan4mzoaK2i3qsp6SupXCpgJqQhYGckn2kgKKZhphynoSirK6Jl4uAjKSNloOuopR2tba1yaFzlIqAn2Gel6lteZWHn5p1oYd3oH2QloqBb0xmopJwmohzpHt5dGGDgmx+oGxyZGCccn90l2l7abO1tMamc5h+e51qm5urdYKabXR3l2maeXSYcVBFfLNeanZreIdmamdidHVxblZeVFloUFJoSVVMWFJWXWdrblZnV01KQUpNSkhKTkFRSlBlY2ltZXRyc354e251iXt7VFBPbV1oW2tpUmpoaWxnbGZjZV9cXFxeaWJkaGt7X11kZ2NqZm9sZWlsZaKcia+nhWY/lKGzq6+vtaKikICXqKKipIylp52cpYKZl5aNl5CQm5KOiIN5anmGZYOMfpageXWPiIyBaYSFkoOMhZ2NeoyKlKWSg5epl4yRi4CJeoB9inhwkKGGeYGVh4mWoJZ/lKWonJaWhGdueJxsomR8caV3nJhwZ6eBl4x7pXqgloOXcp92gImUlo+5bpCKomJ9maKViG5yaatqdaBsbqZgm2mLkGiWh5qVdaKAfZpfi4WMdW+IYmihZZ5/aZt1cGRmiIJucqJaX1tkoW5eiYxve39zcmSlbniiZGenaJhzi5huoW9TiI9voF5kp1SLXVOYbW1za3GBbXBoa3hza29SWFdXZllTbUlYT1xIWGloc2pZa1ZRUkVWXExYUmFVaGped3V6fHB8fHKCe39ydo2AhHZeUXNhZ2JwZ1BqaGhrbG5nZGdfXV5dYGtiaml2dV1cY2hjampzbGZrbWOdpZimemV0bYunrqWqsLGmn4uAlqqcnqWMoqGaoqKAlZiTjZqPi5eQjop7h3GAiGiLi3yXmnN0in2Qe2WDh5WKipWZgnyIhZamj4GirJCFkIqBin2AgI9zaY+lhH2GlI2ImKCOiJKqp56JpniWnH6liZaMspiekIOvl5+leJaIeql0pY+Emm6looyShIyDvG58pa+ChoWGk5acoHylenGolKCWZ55+b6xjloqVkneobKmigYl2h4J3q5GmiGuRsGt2s4ypbIuGbm2fnpKVYX+ri6p2gH+Np593n32FpJWdoGmah3asZ56tjLZzd76MpJNZg6aNq2F1cnNve3RxYmp+bmhsU1ZbVWFhXWtNXVJdSV1sbXZgW3FZW2BaZ3Nlbm9yY3F0YHd7fnlyeYNzg36Be3uMgYKAdmJ4ZGNuc2RSbGdob2xyaWZpYV9eXGJrYmxsem9cXGJpYmxqd21nbG5ilaaqnIGAnqSWqaqeqKeuo5mJgpeqmZ6kiZqlnamdhIuaj4WckYWSjYyNdIZ6iINvjYR9lpN0dIZykoJtf4ySh4aUj317gYSXpI1/paWOgY2JhJR1goeSb2yKqICCi5SOiZyfiY2Tq6OgkIB1lZeIfoF5lK6jf4GbcY+GeJCMhYB7cqeMcX19epeWm4SOeHt+fYiUlZOKdpCZn6CDen2JbIyFW3l5cnlxaG5+kolxf3SBj5STcYWDgWWNf1+BgIx3dXOUdW96b26HbYSGX3dpeI5mgYKGjqqcfnR9l2qJiG+AdnyFdm1sZ4xzeHuXd4Rbalh4j2htd3Jxb3d4b11shm5pZ1ZaYFdcZGtkVWFVXlFfcHd5a2p2ZWpqanV8cXJ0c2FvdWJze4F4dXmCdX+Af4B4i4WDfXttf2xkeW5eV25naHVreGppaWRcYFpjamVscHVuWltia2RsbHltaGxvYY6Vuaimi6GimqakmaSdq6Kgg4OXq5GdoImappqomIKBm4t+lpSHjomIjXKCfI99fo+EepeOdHKDcJWFe32Si4aGkIV4foCGmKKMe6ehi4WPj4SVgoaOl3dyhKmFjZKckIienoiMm6igoKuDiY6Vmn5+iZatqI+Sp5B4cJ6Rg3uTb36phXB9lXFqb3yBn4t/ko6MaG1dg4uMnJuejnOVi4hxdGuCdnOAWXJuhpCBfX6LaV1pY3qFg4iAX2l4e5t8g4yDdoGGg2l5i4drYXFzg3dgc4yCiZCnlYZmjY+DbnaLg3CFjXlvZWZjeYJ6lVpcaWZudlt6eXd0bXNygmZcbYprbGJZWV5aWWtxW15gWV5dZnN9e3Nvc2Nra2l7fHF7d3RkbXRobHx+dXl8e3p5f4B/b4aKhHt9c355c39pVFxxaWx1b3Vna2dkXWFYa2hranFybVdbZW5sZ3N6b2hqbWCMjKqwoZCjoZqfnpiemamjoX2Dl6uMn5SHm6KQpZV/e5eEfJKZiIiGhopyfYCLdoWLgYSWinFvgHKYhoR+koSDhoqBeoCDipqej4KmoId4jpeIlYuLnZeEg3qsgZCXmZSKnp2HiKGroKKio4yIk5uco5mWqqGnpqCSm4iXj3x5j46EqH5/kpGSk5ywpZqUnZCNspOYhKaMjJWbn4mQm4KJkYprfI52d2WChpCKfImdhIeLj4eIgISDkHd8enWaoomHi5+LhpV/foyBgHZxdIaFgHiIh4qRppGEho6Ig42QjHyHiomPgXZrgYN7eZlpcmhgc4pwfXp3dm93dIFdXm+HaG5fX1pcXVNncVVjW1thbGh0e3xybnBka2pof3tteH9xaW9wbGaBe3KBgHeAfX+Eem2CjIZ8enh8fnqDeE5kdmtzbXB6ZGtlYmJgW3RmcGZycWxVXWx0bWh5enFnaWtljYidup+WoqGYlZmYlJikoJ17f5mqjZ6NhZ+cip6WfHmUgnuOmYmGhISGbXiBgHKAh36Ik4Rta355l4aEg5B+gIaEhn2Hg42anJKHqp6DcoqPhZKSi52RfY16qYONkpeVjpyWhoabp6Cimp2Gg5KamZmQmqagpp2dkJeBkot3fYiOhaV7fI+QkYaYqqGdk5yPjaqOkoCejImTmp6Cjpd+h46Cb3iFcXRgf4OPhnSLl4CDj4KGhH6FhJRueXV1k6KLjYabhYWOdICKfX1yc3uJhHt5jI6Ek6ePhoSPgoOKiop2hYeIi3xua31/e21oa2xnXnl+Z3x7dnR1dXt3XGBwfW51YGNaXF5RZm1TZVpdYWtpdnl+cGtsZGtpZ4CAbHOAbGx0b3huhHluhoB2goB9hXZxgo2Ifnt6fH97gopgaXtrdWhpgmRqY2BpW2N1aG9idW1sVGJxeWVwenpyZWptbYuKn7iaoaSfk5KWl4uan56denedpZCbiYaklIuYmXl6jYV8iZGDjIKBgm17f3hygIV9ipB8a2h8gJeIgYiOfH6GhId8j4GPmpuRiKecf3CLiouSh6ChioWMfKeRh4+Sl5OWkneNo6Ghnpaaf4GQmpmTjJujoaSal5Gbf46FeYCEj4ehgH6MjY98l6SgoJKZkI+mjZCCm5GJkpebfpKSfoeOgXV0gnB2YH2AjYVxipV8iIxyjX6ChYWOaHhyeYyZkpCAmH6Ii3KCh3x9cXp8jIV6e5KNg5alk4uGkXyFhoeFdYKDiIh6ZXF6f3l6cGxqZl59cmh8dXVzfHKAal5gdHZweGRjWV5eUmtoVGRYXmFnanZ4gXFma2NsaGV/gGptfmhvcWt9d4Z6a4uBcoGBfYF0doKNhn58en+BfX+PanKDbnNpYYdobGJfcVV0b21uYHhobVdqdHZidXp7cWJqb3qJjZ+ykqWlnY6QmI+GnaCanHx1o6CNln+MooqImpZ4e4aHfoOJfoiCgH9wf3t0dYKFfomQeGdjfIWXioKKjXh9gIyDeZaAlZeVjJagmn1vi4GQk4amm4eMiYOllYSSipWXkpF2kZ6hoZiUmHp/jpiXjpabnaSemZOUnHqQhoN4hZeNnn6Bio6Mc5einqGSmI6PooyMg5aYg5KWmX6YjXyIjYF2cX1temSAfIqFcIaTf5CCbIeCgX+JhGV1b3yHk5iNfZR4jIl8gId9fHKAeYqHeYWRiouYopaChIx3iISDgnZ7gYmFdWB3d310fXdma2RgfmlqdnN0dH1xfGNjYXNudXNtYVlgXltsZFJiV19gaGt1eYZwY2pjbWZofINsaHRobG9of3yCeG2QhnGAgoJ/dHyDjIF/fnqCg358kG11iXR0bWWKbGphY3VWg2lxbmB4ZmxianZwZnl7eXFgcmyGhZCdrpimqJ6OjZeHhqCTl5h8d6mciph5l5yLi5iQeXyAi318g3uAgoB4c3h6c32AhH+Ii4BkXnyKlYd+hId0fX6Kf32YhJaTloyjoZd+cod7k5GKp4+MjoqSoJGDkY+Ul5GKgY+YoJqSkJJ0gI2SlImdnZ6nmJiNlZd0jo+KbIaYkJl6h4iQiW+XnZqjk5WKjZ+MhoKSnH+SkpWGmYh7iomBenF5anVse36Lfm2FkYKUd3CCg31+i4Bkcmp8gZeYhX+OdJGJg3mHfnZ4gX6HgX2EjoWNlKSQeYWDdImHfYBzdICHg21henR6cXxvYW5jZHthbm92cnd3c3RidmBvbHVub11bXl1eal5PXVdiYWhtc3qJa19qZWpjaHeIbWZsaGptaIB8endukIdzgIOEfXSBhol6gn16gYR9fY5yeYt5eG5sh2toX2lyY4docW9mdmdtbGF6aGp8enhwYXdti4GZmqqgpKmdioqRhoqeipWXfXatmIyWfZ6TkZaTiHd+e4p8e4B2d3+AcHRzem+FfYGAin58YFx+j5GGf4OEc3qAhnqPkYeRkZuSpJuUgX2AfI2KkqSJjYqNl5qNhZGYk5WOiYmMk52TkIyNboSQj5GJnpmioZeWiZeSb4qahWeGmo+UeomFkIpwlpqUoZKSiIuZjIKAkZ58ko+Si5mOe4qEh3RzdWtxbnV8i3RuhpCNkXF0gHuBgoh8ZXFteX6alH2FiXSRi4F0iXlvgX6Bh32FjYqFjZaojXuIfX6LhXd9cG+AhYNjaHdzdXB6Yl5wYWp0XnBqenh4bHJwZXldbWxzbXNYWl5fYWpaUFdYZGNncXF/h2ZdaWhmYmdxjm5kaWdlamiAend0bo6Fc4CBgnt1goiFeIR8d4OFeoCJd3+LfHtyeYNqa19waHR/a3FubXFnb2xle2Jtf3l2cWx3d4p/o5iiqKGnm4eMioGPnYaTnHSAqZSRjIagjJWTkH90e3aFeHh/cnN7hWtyb3ltiXaAgIZucVtZfpGNiICAgHZ1gH9/oIaPipGcl6CTl3eJfoCMiJyeio+GkpeVhIiUmY+Wi4uNjo2dio6QhG6Ji4+RipyWoZuYlYWYiGuGpINnhp2KkX+LhIuBd5OYkZ6RkIiJlY5/fo+XfJGNj42aknyKf4Jvdm9rbW9we4Vpc4OOl4pxd4B0goiCeWZ0b3aCmo98iYV6lZJ6d4l0cIl8h417i4eEiY+co4h8hHeCi4B4eG5qgIKAXXJycXBweFpecWFval5vaXx5cG1tam12YHBva3JtWVhhYWJuWFFTWWVmY3VwhIJiXWttZGJma5JtYGdmX2hrgXVycnCLgHR/goB4doCLgHmFf3eHhnaDhXyHjIB7dop/anFjfGKGfG9wbHRqaG9sdndfcX55e3R1dICCf6WVmq2fp5aFjYN/l5WDj591ip+TkoWKmoyVjYt6cnh0gnByhXNxdYhsb211bYh3g31/bW5VUYGrlIeCeIB2coJ5gqCBkYGTkpebkZp4kXqDjJKkmpOOiZWYkoSGlpmMk4uJj4+InoWQinxzi4WIj4icmZ+blpSAlH9php2IaIehiJKEkYOJcYORl4+ajY+Mi4+Nd3uSkHqOi4yRlox8iHyAa3ZqbWtrbHp+YXl+jpWBdnqBd4OMfHlndGx0h5aMf4iGe5SRcXqFcHiNe4uNe4l+g42Rnp6FfH14got9dnBpa4GCeF93b21rcXJVXnBicWBfbW55cGdwZmdzdWhwa2F3ZV1WZWBgclNQTlxlZF14cIh8X1xocmJiZWaSal9oZFtncH5wa3Fzin12fIWAdHV/jHl7hYB4iINzhoV+jIyDe3mVd2ZyaoNgh35vb2t6YGptdH90X3R9eIZ4dHOFfHmhkJqxnKaOg4p/g5qIgIuef4qZk46EiJeNjo6EdnR2c4Bwb4VzcHGDb2ppdm2Cbn18bXVzUk6C38mS1pN8cHSDdYOfgpJ3lJCYm4+Ye5NyhpCfoZOTkIqSm5SGfpaViI2NiJGNiJyAjoF4eox+iIyKnJudm5WTeY13aIqSiGyJpIWSiJeDhmOMkZiOlIqWjI2Ki3F7lIl7joiKkpGJeYV7fmx7ZXJvamt5eVuAeY+OgHp+fn+Gjnp6aHNrc4qPiYGFhX2WjGx+f2+BjX+NiH6Ee4OQlpqbi3x3eIOQeXNtZnB/g2xodG9naHNsU15vZXBZX2txeGZramJmeHNvcGNfd2BgVmtfXnZQTkxgZmNdeXGJdFxbZXZgYWVljmNhZmFYaXNzbmtxdot8dHqGgXV2fotzf4Z/e4l/comHgZGKiHx+mHVlc258ZYh/b3BsgFpsbnl5c2B2enuNdnJ3ind5n4ybr5ugkIKFd4iVf32JnIeFn5GOhYyXhJOOh4F1d3B5cW6Eb21ufnJkZHhwfG16fWpobGOkmsHcru+hc2t1g3WEoYWRbpWPlJ+Um4GRcYaLo5eJjpWKkJ2Wg4CVkIWJj4CSioqXf4d7dX+JeIaEjZuamJmOkHaLd2+Hiox+i6SFkomdhYVei5SXio6JjouKhIlse5eCfYiFiZCPhnaFfX1rfWN4dWlteHNXiHqRhoV6fn+AhYx+eWVzan+JjomCg4CMl4ZsgnZuiZGDkYV/gnqAkZaUmZB0dHiIjXV0cWd1eYJhc2xvYWh1ZlJgcWdrVV5tc3lgcmNfaH1xcm1aYnJhYlduWlx3TU1MY2ZhXnZzim1bXGR5XmBkZoRfY2NeWGpya25rcneLfXN3hIF3d3yIcYOEfX6Ie3SLiIiWhox+fpdyZ3VxeW2Me290cIFYcXp2eXFkd3mGjGl2gIlygJ2Imaico5KEfXCMlHh5i52EhaGNjnyVjH+Zh4R7c3dwc2pvgWtpbHx0XmB4dntwdXtnYGV869q1ycPciHNsc4B2iZqIjWmXj46clJKBiHGGiaCOhIuVio2YlHyNk4iDiY97kYuGkIJ/dniDhHKHgpKblpSYhox2h39xhoOKh5qig5SMnoOJYYOVjoaJhomNh4CHaX2Uf32DhImOjYJxhn5/cXdndnJpc3drWox9koGFfICDgISKgnZidGyIgY+Kgn6Ak5F9boJseYeQh5OEfYF+gZKUkZeJbnJ6jIZ1bHFrcniAX3JoblxqdWBRZXJpZlNfb3Z0X29gXWiCcXJpV2doY2lYbVdbdUxKTGVmXmJyc4VoW1xleV5eZGd6YWRfXFlrbmVuanR3in5zc4F+enZ6h3OFg3x/h3d2ioaPmIKNgnuSdGt3dXl5k3VveHp9WHmFcYBvZ3h3koJkdoaFcYqWhZmhm6KKhnNvkotyd46cfYqaiIl7n3+DmX+BeXJzbm9kcn5pZmx3d1tfeXt6cXF/aWFnYX/Vto6QpnhucXd7cZKQjIdqmI2Im5GLhnpoiIuZhoGSkYaHmI18jY2BgYqNfJCMfoqFenV7gnpxhoCVmY6TlIKJdYSHd4SAi5Odn4aWj59+iGF/k4eEiISJjX9/gmZ9kYB+f4KLj5B+bYJ8gnRrbXZ0c3Z1a2ONgY5/hX58hH+EiH9wX3NxhXyPjYJ8f5KJenGDZnuEi4eNhHyFfoGVj5GThG5weYx/dW1uamt6fWJnaWlYa3VaUmlyaWJQYnJ4bGFlXVpqg21zYltnX2RsX25UWm9OSE9mZFxnbnGAbFpbY3JfXGNsd2RlXVxabGtibWpzdoZ/cW9/fHx0eIV4hYJ8gIh1eYmBkpZ8iYZ2iYFveHl7hJNvbnyBd16Df3SBbWl6c5RzZ3KIfXKSkYSan5ughod2dpR/bXaTl32HkIOKjZl8i5p2fndxb2xqYXR8Z2JpdXpaX3h8em1xfmVjaGhXnY9ecXKWvMSEdnGUiJB+cpaLhpuSjIdyaomPloB7lIyBhJuMfIqGfXyJjH+UiHWKhnZ2fYFxdYaBnpSFlI+Dg3KAiHWFfIqZnZiHlI6dgIhmfZOCf4WDiYlygX1mfot7eX5/h4uOfGmAfIN2Zm94eHN2c2xqjYWKgYp/eIKAhYN/a15yeHp9jYqGfIKPgX5ygWl5hIiMhoV5hH2BmI2QjH1ubXuJfXd0bmhnfHZjW3BiV25yU1Nuc2hhTWZ0eGVgXVxYboBvc1llYV5qbWBwT1lrUURTZ2Baa25tfG5aW15sY1pib3dkZ1xdYGxpY2xpc3aBg3Fufnx/dHWDeoOCfIKFdn6IgZaReIOKdIGIcnl4fo2Qb258gXFpgXl6fm1se3WVa2p3hHRslI6GnpigmYWIbn2Mdmp4mI5+gYqClZeJeY6Wb3pzcGxqZGBzemhgZXF6WmFyfXlncXphZWWPsbJ3SmJapNnQlnJ7kIqQd32Ui4SZkYyFbmyGk5F6eZKGgYSYinyHf3h4iYqEloBwjIhxdH16aXmFg6WQhJONg39vf4N3hHmGnJmUi5OQlYWHcHuSgn2Cg4mDboF3aICFeHJ/f4OKhntlfX6EdWNwcn9oeHBvdZiNhoKKfHZ4gIR5gWtccX5ygYiFiX6GiXuJcoFucYWHj4WFc4R6gpmNjYR4bm9+hIB3emVoanxwX1h2WlhwbE5XcXNnYEpsdnRgXVtbWXR9cm9XZ11manBgb05XaFE/WWZeWm9rZ3lxWlpZa2VZY3F5X2hcXmVtaGVraXF3f4dvbH9+gHVvgnuAgX6Df3aBhYiXinGCjXF7hnx5eYSTjHVqen9sb350f31vcnt7lG9ugX94ZpOLg6GZnJKChmeHg3BoepWIfX6EgZiJgXyNjGl4cmtsZl9hbnhtX2JveFxkbIN6YXF2X2Vl1Oq+ijI6PouOgHF4hYiOjXaDlox+ko2Mf21shY2Mdn2Pf4WClYh8gnhudoeEg5d3b4iFa3V7dGZ5goOni4KPi4R9boB0doR6h52RjJCSk4yKhn57koZ3f4SNg2x/cmiAfnhtfHuBioN3YnmEgXFkcWh+bXRxdIGbi4B/hX5zdX2Ac4FwW21/dXmLg4t7h4B8iHh6cWyJhJCEi3KCeoCXi4t/dG5rd4CAdXVcaWh3cFhWe1NacGRMW3JyZVtJcHhvXFpaWV11fnRoWWJbZ2VuY2lMV2ZRPV5lXF11ZV90cFpZVG9kWWRxeVpoXmBnbWdpbGlwd32ObGmChH55boB8fIF/gnp1goCNk4VwgItud36Ae3uIkol/aHt+anR7coZ7c3d9f4x5eIR9fGuMjYSbnZaMgYBsjn5raH6NjHp+f4OUgX59iohrdXFnaGNbYmdybmBhbHNhaHCJemJzdF5jZJugj25cNVmvtXRpgIh8koZ1hZaFc4+KiXZwbIWDh3V5iXiJfJOHen5zZ3aJfn6Yb3GGfmh2eW1leYiEpIeAh42Jfm5+dX+BfYyZiIKUkpmIioSJfI+IcHt9hHtofmxqgHt6aXp2goeAcmB3gX5xZHJmdYJtdXuElJGBfIF/bnd5fHR/bVhvgHd1jIKGeIh2gol6eHNuioGQgYZzf31/k4mIem5uam6CgnVuXWdlc3FRWnpOXG9cT1xzcGRVS3N4aVdZWVphcYB0YF1dYGZkaGlmTlpoTkBhZFtgdWFcdG1YV1N0YVpkb3JXal5iaGtnbWxpcHd8kmxphIl8fHB+fnuBf4J6d4B/iouDcXuHb3F3hH97iY2Pg2p+e253eXeKd314gIKHf4N+fnpthYyImKONhIN7dox5a2yEiJB4fXuBkX9/foqDcHJwY2ZeWWdfb3BgYGdwZmpviXRhdG9bYWRqdnt/vpymo8i4cYWDcpJ8eIaTgnORjIdycm+De4N0dYd0iHeTiHl5cWN3h3qAk2lyhHZmd3VjanyDh56Bf3+Oj31yf3OEeYCSkYN4lo6VjoeCiHuIiGt4eX51Z3pobH95c2l6doCDfWhgd4d9amt0Z3uAaXaAi5CUfnp9fnB7dnt0fmJWd35zc4qEgn2DcYeKd3hxcISCjX9+eX59do6Gg3ZpcWltiIJycF1oYnJuSmR1TF5uVVRac25iUU9zeGBSWFhcYW+Cc1thXGhlZWNrZFFbcElEY2FaY3BeXXdoVVZVd15bZW5oVmteYWpnZW9vaHB2epJuaYiMeH1ye355goGBfHZ9g4iGg3B3g3Jud4OCfYmLk39wgHx4eXqBjHSDeH+BgYKEeoB1b36Ki5ueiH2FeneHe2d0hYuQen5/e4iFhHaPgGdvbl9kXFhlWW1yYGBgcGxraIluYHNpWV5kbYB3qdqpx4aHsnGJd2+MdXuGjoB6k4l/dXR0fneAcHF/bYR0lIV4dGtgeoJ5iI9mcYNvZ3ZuW219gJCUf4F5kpN+eXtsh3aBkYyEdJaKkY2GhYV7f4RsdXZ/bWd2ZW17dW1qd3Z/f3xgYniFeWh0dWJ9e2d0ho6NlXt0gHVxf3p8bX9ZVnR+cHWFh3+BeWyJhnR5bHWAg4R+e315e3OLgXxzZ3RlbouEbXNbal91ZEhubkxaYVdWVnhtYlBSdHZXUFVYXmFxhG9cYGNtZGReb2JUXXJHQmZfXWZoXVp6YlFVXHVbW2drYVZqX2BuZWZrcWhwdXiOdGuOjXV+dnh9d4GDgXtzfYOIh4NvcX90cXV/hYGJjYp7d394g3x8hod4h3x9gX6EgHt+c3Z5jI6gjYl6iXZ1g3lefYWYjHmGg3SFhoR3iXtibm1cYltbYVZqc2NgW2dub2aHcWFxZldcY2t/fMrOh7mham1timxxhHF8hIl+e5GFeXlzeXV1e2psdWOEdZKBdm9mXn2CeouJZXKCa2pxY1hteoabiIKCdJiVeH98bYhxgoqMiHKYjpCHhIuDe3h9cXFwfWZocWJteHFqa3F4fXx6XGR5gHdpdXhmgXZndIeLjpV8cYdqbn2BeW58XVhyf210gYt8gm9vin9xdmh3f4GAgXd9cXt1h3x6cmZzYW6MgmxyWGtfd1tJbmtNVVReVFV7a2FPVHVyUFFUVl5idIVpXGBramZjWW5hWGJwR0FoXGBmX11Ve11PVWRwWltqaF1XaGBfcmVqaHJncHJ3hnhulYp0f3p3fniDh391cn+GhY2CcHB7eHd1eoaFhoyFenx/dYt+fYaEhId/fn59h398eHZ5eJGToH+MfYttdoB5Y4OGloVzkYpvhYWBeoN0Y25rWl9bXV1UZ3NlYFlkcnJmgXNia2VXW2Bpf3i+rnugt21ic4Zoc3txeYKFe32Mf3d4cnZve3Zlam5gh3WOgHJpYl5/eHmLhGZxfmhqa1pWb3eKo4GEf3KblHKBeXSCboGCkoh0lYiMh4OIhX14dHJuaHlgam1gbXZqZ2preXd6d1tnfXx4ZXJ9bYR0ZXWFjYaWf2+LZmp6g3VtdGJcb3xrdX2MfIFmdYd9bnFodX94fn9zfWx7e4F6eHBmbGJuiX5tbVZrYHdVSmprT1FOaE1ZfGhiTlV1akxQVFVeZnWDZl1gcGhnYVdpXVtraEpEalphZFdZVXlZTlZtalldbGVcWmVjXnRlbGRxZ3JvdYF4cJmFdn9+d398hYd9dXOCiICVgm5zeXt6c3OFhoiIg3iBfXaPf3yEio6EgoR7fouDe3d8d3eanZd6ioKGaXd9fGyDhJOAco+CcIWCfoF/b2ZsZ1hdW1xbVGRwZF9XYnJ1aXVvZWViV1xcaH9wb3KAc4lkZHh+aXR1c3KChHiAhHl3dHVua3pxYmdrZ4Z0jYNtZl5ffXB7iX5pbXdmaWRVV3Jvjad8hHx2l5F0fHN8em58e5GFd5l9h4WChoN9dHBybGd0XGxoXmx0ZGdmaXpve3JZZ4B2dGdwgHeBdWJ3hYp8lIBui2pteoFxZnNlYG16Z3N4inx+YnaDdmprcXR7cXp5dH1mfn9/eXduZGZiboZ8bWtWamJwU0tpak9LTnBHXntmYU1VdGNKTlNXYWp2fmVcZ3NpZWBWY1dicF1MS2tYY2JVVVVzVkxYdWRaX2thXFpjZV93Zm1icGlzbnJ/dHSagXd/gHd/f4aEenx1goR+l4VucnR8enRxhIWPgYB5i3V0kX98gZWOgIWEfX6Mhnt+gHZ7o6WKeYiGhGt1fHt1g4KMem+Fc3mEfYGDdW5qaGVWXVtaWlNibmRbWGFyemlobGhfYldfW2qAaWtvgGdrYGh5eGpzdHRuhIF6f311dW56aGp5al9lbmiBdo+DZmVYYndpfod7b2lvZ2ZdVVhvaI+pd4F6fJCOeXVwf3BydXmOf3iVdYaCf4WHdWpydmdobltsZF1tc19nYWp4aHttWm2CcnNqb4B+eXdhd4SEd4+Ecohxb3l/cmNxaVxweGRxdIh8eGJzgHBnanhzcmx4d3V4ZIN7f3h2cGRjY258fWtsVWliZlNLbGhPR1JrRWF4Z2FNU3FcSk1UWWVrd3tlXm1xaWRdVmBWbm5XS1NoV2ZeWE5VbFRKXHlfW19rXV1bY2VgemhsYW9vdW5veHV6mH13gIF6gICHhXp5eoN+gZOEcXR0f3l2dISIkH2AfJBrc5WAe4KfhX6HfYB/hoKAint2hKyff3qIiINrcoJ6doF/gXVuhm58f3OJgGpvbWRkWF9aWVpVYmpnW1pedIFpXm1rXGFWXFxsgWVxdH1paVxrdnZndHdybYV7fX15dXJseWhpeGZdZHNoeneSgGJiVGVwZ4KFd3dmaGpgV1ZZZ2OPqG9+d4CLjnpwcX5oeG95jHt3j3KEfX5/hm5kdnNkaGhca2Jdb29bZ19tdWR6aF10gG9xa3F7fXV1YXSFinqHh4B/d3J1f3VhcG1acnRicXKFfHVlcoBsYWx6b2ppe3l2cmaFdnt6dXFlYWVtc35pbFRpXl1US3NjUEdWYUdidmdhS1RvV0pMV1hna3Z6ZGVucWZjWlddWXZlVUpcY1doWFlJV2VRSGJ4Wl1fbFteXGFkXn9pamBvdHhub252g5d5coGAfH+Ii4V9dXWGeYeMfXN1dYJ5enqCi459foSJaXOWgXqKnX1+hXqBen98hohzcY+ujHt7h499ZXKIenR9fHZyb4Vse35sj3picG9iZV1lVllZVmNma2BdXHKEaFhvbVpeV1pcbHticHd2bWJabHNzZ3V1cGyEeX6AeXdubnRlaXRlW2d1ZnZ2kXleXVJmZmuDgnR9YmNpXFRYXWJjkKVoeHSChZB4bW96aHhte4R7dYlzgHh8eH9oZXZtYGZgXmpfXXNrWWVdb29iemVbd3trbm5vd3hzdGRyg5J+h4KIenZvcn1zYnhkW29xYnFxgnxzZ3KAZF5udmlkZ3l7dW5vgnV0fXNxYl9mbm99ZGpTaFhZVE13X1FKWVhIYnVkYUlUbVNKTFpXaWxxe2JsbHNjYVlZW2F2W1NMY11YaVNXSFlhTkdpdVheYW1bW19iYl2FaGhhbnh5bG9qdoGQeG2CfoCBkoeDgXZ0iXSMhnNxd3WCd3x9foyPgH6TfnB3lYN8mZJ5gIB4eX5/dIiDc3CZont6f4mUeGR1iHlzeHVsdG9+bHl8cJFyXnBvYGdibFRbWldoY21mXFxxiWVTcW1aWlhYYGx2Y2l1amleWW1zcWxzc3NqhXx+f3x2bm5sZGlxY1tqcmR0do5zW1dTZWFygH9ygl1iY11TWmBbY5KfZXJxhYSRdGxrem1vcHt8fHGBd39yenl5ZGV1aF1iWmBnW152aFdiXXBoYXdgW3t2aWlybndzcnRocIGUgoZ+hHZyanB9bWZ3V1xrbmJxc4F6c2dvfltgb3FiX2pxfmxsdX5zcXhrcGFcZWxsemFnU2dVV1JQdVtSUFlSSGN0YmBHVWpQSVBaVWtra3xlbW9xYVtaWFlscFdTT2ZXV2lTVEZaXE9IcnVYX2NtY1hgYGFdi2pjZG15eGtvaXV5hntrg31/hJl8goR5fYhuj4Zxb3d6fXSCgnyKjoKCl3R3gpOFgZ+JdYCAgXN/gnGHgnVvopd0e4aLhntleItvbntvZnhwemxzdnKMa150bmFnZWtSXVtVZ2FsbFpccIxkT25tXFZYVWdqdGdidGVlXVludG5wdXV5a4d8f3yIdo9zZGRrbmFcbm1jc3iHa1pUVmNkeH19cYVcY19jVFpgWWOVlWNucIOFinNqaHtvZnN3c3xsenR1b3l+dV5mcmNbXlZhZFlhdGVVX2BtZGFxXV1+b2hpc3FzcHR1am2EkoGIe4VxcmZufXByb1RbZmtmcXSBd3NjbHZVYnFqW19vZn1mbXd9c3Nzam1gWmRqandeZlRkVVZQVG1XUVdTUEhkc19hRlhpTkhXVFZtaGR8aWt4a2JXXFVbdGRTUldoUVlmVFNIWlpQTXh3W19lbGlZYmBeXo9uYmZseXVub2h2dn9/bIN/fYaXe3+HgYp+a5OIcmd0gHt1gIJ8iI5/i5NyfIqRhYefhnt/hoxzgYZzfYN2bqWMc4GNi3Z3bXqMYGV8cGZ6c3lsbXF2gmdke2xjZmdoU19eVWdfbG9bXm6NaE5pbF9UVlNvZ3NsZnhkZFxYcHRscnp3cm2Ie392nHp5a2FlbG1eYG9qZXB4fmdaVlhgbHh8e3CDX2JeZ1ZYX1dkm4hia3GBh313a2t4bVx3cWx7anZzbm97gHJYam5fWV1VYmNYZHFiU15haGJibFpgfWtma3N1bm13dmtohYt+iHqIbXFlcH1tcm1jWWFpaW90gXRzX2lsU2VxZFRibmJ6Y3F3e3ZrcG1rX1hhZ2h0XGVWYVZTTlhlUk9cT09IZXBdY0ZZaU1JX0tYbWRfeGhufmRgVF5UXXVcVFNgZk5dYVRTSlxZUFl1dl1fZm1oWGNhW16OcGNnandxc25ndnR6g3KBgnmHjX58iYeOem6QinRsc4J0f3+HhIaRhJWPeX6Mj4eRm4SAfIyEcoCBc3R3cW6Tk5OTk5OTk5OTkpKSkpKSkpKSkpKSk5OTkpKSkpKSkpKSkpKSkZGRkJCPj4+Pj4+Ojo6Pj46OjY2Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2NjYyMjI2NjY2Njo6Ojo6OjY6OjY2Ojo6Oj4+Pjo2NjY2Oj4+Pj4+PjoKAfnp6fX5+fX1/fn59fn5+fn5+fn+Af4CAgIGAgIB/gIGBgYOHjI6Ojo6NjY2NjY2NjY2NjZKSkpOTkpKSkpKSkpKSkpGRkZGSkpKSkpKSkpKSkpKSkpKSkpGRkZCQkI+Pjo6Ojo6NjY6Ojo2NjY2Njo6Njo6OjY2NjY2Njo6Ojo6Ojo6NjYyMjY2MjIyNjY2Njo6Ojo6NjY2NjY2Njo6Ojo6OjY2NjY2Ojo6Ojo+Ogn99ent8fn59fX5+fn5+fn5+fn5+f4B/gICAgICAgH+BgYCBg4aMjY6NjY2NjY2NjIyMjIyMkpGRkZGRkZGSkpKSkpKSkZKSkpKSk5KSkpKRkZGRkZKSkpGRkZGQkJCQj4+Ojo6OjY2NjY2Njo6Ojo6NjY2NjY2NjY2NjY2NjY6Ojo6Ojo2NjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Njo6Ojo2NjY2NjY2NjY6Ojo6Cf3x6fHx9fn19fn19fX59fn5+fn5+gH9/gICBgYGAf4CAgICDhouOjo2NjY2NjIyMjIyMjIySkZCQkJCQkJKSkpKSkZGSkpKSkpKSkpGRkZGRkZGRkJCQkJGRkZCQkJCPj46Pjo6Ojo6Ojo6Ojo6Ojo2MjYyMjY2NjY2NjY2Njo6Ojo6OjY2MjIyMjIyMjIyMjY2NjY2NjY2NjY2NjY2Njo6NjY2MjIyNjY2Njo6OjoN/fHp8e31+fH1+fXx9fn59fn5+fn5/f3+BgYGAgICAgYCAgIOGi42NjY2NjIyMjIyMjIyMjJTO2tjY2NjamoGEhISEiF0tMDAwMC1GoaGhoaGhoJqZmpqampqKg4SEhIOEd2VnZmZmaFxDREREREJOpa+tra2trqSfoKCgoKOAY2dnZ2dmb4SDg4ODg4OLjIyMjIyMjY2NjYyMjY2NjY2NjY2NjIyMjIyNjY2NjY2OhX19e3t6fX58fH59fX1+fX1+fn5+fn9/f4GBgYCAgICBgICAgoWKjI2MjIyMjIyMjIyMjIyMlNvp5+fn5+qcfoKCgoKGUxgdHR0dGTekpKSkpKSjnJycnJycnImBgoKBgYJyXV9fX19hUjQ1NTU1M0GptrS0tLS1qKOkpKSkp3xcX19fX15qgoGBgYGAgYqLi4yMjIyMjIyMjIyMjIyMjY2NjY2MjIyMjIyMjY2NjY2GfH16e3p8fXt8fn19fX59fX5+fn5/f3+AgYCBgYGAgIGBgYGChYqNjYyMjIyMjIyMjIuLi4uSl5iYmZmZmZKPkJCQkJCMh4eHh4eHiZOTkpKSkpKRkZGRkZGRj46Ojo2NjYuJiYmJiYmIhYaFhYWFho+QkJCQkJGPj4+Qj4+Pi4iIiIiIiImKioqKioqKi4uLi4uLi4uLjIyLi4yMjIyMjI2NjIyMjIyMjIyMjY2Njoh8f3l7ent8e319fX18fX19fX5+fn9/f4CBgYGBgYGAgYCAgYKFioyMjIyMjIyMjIuLi4uLi5GQj5CQkIuOkZGJh46KkJKTkIqRjI6Ph4+RkZGRkJCQkJCPj4+Pj4+Ojo6Njo6Ojo2Njo2Njo6Ojo6NjIuLjIyMjIyMjIyMjIyMjY2MjIyMjIuLi4uLiouLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyNjY2NiX59eHh5fH18fX19fHx9fX59fn5+f3+AgICBgYGBgYCBgIGCgoSKjIyMjIyMjIyLi4uLi4qLkJCRkZGPhI6QkIaKj4WNkJCOh4qKho2GiZCQkJCQkJCQkI+Pj4+Ojo6NjY2NjYyMjIyMjIyMjIyMjIyMjIyMjI2NjIyMjIyMjIyMi4uLi4uLi4uLi4qKiouLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjI2Lfnx3dnh7fXx7fX18fH19fn5+fn5/f4CAgIGBgYGBgIGAgIGChIqMjIyMjIuLi4uLioqKioqQkJCQkIqFjoiOhoaPiY2QkI+Gi4uGjoaLj4+Pj4+Qj5CPj4+Ojo6OjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLi4uLi4qKioqKi4qKi4qKi4uKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIt+e3d2eHt8fHx9fX19fX1+fn5/fn9/f3+AgIGAgYGAgYCBgYGEiYyMi4uLi4uLioqKioqKipCQkJCPhYOMjpCOiYyJjZCQj4mIjYaMiYmPj4+Pj4+Pj4+Pjo6OjY2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKioqKioqLi4uKioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMin18dnZ4fHx7fH19fH19fn5+fn5+fn9/f4CAgYCBgYGBgIGAgYSJi4yLi4uLi4qKiomJiYmJkJCQkJCMhoyJjoeFjYmOi4yLhoiHhoiGiY+Pjo+Pj4+Pjo6OjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKioqKioqKioqKi4uLioqKioqKioqLi4uLi4uLjIyMjIyMi4uMjIyKf353eHp7enp8fHx8fX1+fn5+fn9+fn9/gICAgICBgICAgYCBhIqMi4uLioqKioqJiYmJiYmPj4+Pj5CMjouPjIqPjI6MjY2JjYqLjImOj46Ojo6Ojo6Ojo6NjYyMjIyLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLjIiAfXh5enp6e318e3t9fn5+fn5/f35+f39/gICBgICAgIGBgIGEiouLioqKioqJiYmJiYmIiI+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Oj46Oj46Ojo6Ojo6Ojo2NjYyMjIyLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLioqKi4uLh4B8eHp6eXt8fHt8fH1+fn5+fn9/fn9/f39/gIB/gYGAgIB/gYSJi4qKioqJiYmJiYmJiIiIj4+Pj4+Pj4+Pj46Pj4+Oj4+Ojo6Ojo6Ojo6OjY2NjY2NjY2MjIyMjIuLi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKiYmKioqKioqKioqKioqKioqKioqKi4uHgHt5eXh6fHx6e3t9fX5+fn5+f39+f39/f39/f3+BgYCAgH+BhIiLiomJiYmJiYmJiIiIiIiOjo6Ojo6Pj46MjI+Sj5COjo6Ojo6NjY2NjY2NjY2NjIyMjIyMjIuLi4uLioqKioqLi4uLi4uLi4uLi4uMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKiomKiomJiYqKioqKioqJiYmJioqKioqKioqKioqKioqKioqKi4aBe3h5eHp8ent7fH19fn5+fn5/f35/f39+fn9/f4CAgYCAgIGEiIqJiYmJiYmJiIiIiIeHh46Ojo6Ojo6Ojo+MkJOQkI+Ojo6NjY2NjY2NjYyMjIyMjIyMjIuLi4uLi4qKioqKioqKi4uLi4uLi4uLi4uLi4uMjIyLi4uLi4uLioqKioqKioqKiYmJiYmJiYmJiYmKioqKiomJiYmJiYmJiYqKioqKiomJioqKioqKhYB6eHl5fHt6ent8fH1+fn1+fn9/fX9/f35/f39/gICBgICAgYSIiomJiYiIiIiIiIeHh4eHjY2Ojo6Ojo6Pj4+PjoyNkI2NjY2NjY2MjIyMjIyMjIyMi4uLi4uLioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYmJiYmJiYmKioqJiYmJiYmJiYmJiYmKioqJiYmJiYmJioqFf3l6eXh7e3p7fHx7fn5+fX5+f39+f35/fn+Af3+AgICBgYCChIeKiYmIiIiIh4eHh4eHh4eNjY2Njo6Oi42Nj5WPiYyPjYyNjYyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYR+eXt5ent7eXt9fHt+fn59fn1+f35/fn9+f3+AgICAf4CAgICEh4mIiIiHh4eHh4eHh4aGhoyNjY2NjY+MjImKj42IjJGPjY2NjIyMjIyMjIyLi4uLi4uKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uKioqJiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJg355e3p8e3p7fX17fH9+fn5+fX5/fn9+f3+Af4CAgH+AgH9/f4OGiIiHh4eHh4aGhoaGhoaGjIyMjIyLiYyKiIeJhoyOjJCMjZGOjIyMi4uLi4uLi4uLi4qKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiImJiYmJiYmJiYmJiYmJiYmJiYmIiImJiYmJiYmJiYmJiYiIiIiIiYmCf3h7e3t6enx9fHx9f39+fn19fn9/f39/f4F/gIB/gICAgICAg4aIh4eHhoaGhoaGhoaGhoWMjIyMi4yOjoyKioeEiIuKjIuNjo+Li4uLi4uLi4uLi4uLioqKiomJiYmKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiomJiYmJiYiIiIiIiIiIiImJiYmJiYmJiYmJiIiIiIiIiYmIiIiIiIiIiIiIiIiIiIJ/eHp7enp6e3x8fX1+f35+fX1+f39/fn+AgICAf3+Af4CAgYCDhYiHh4aGhoaGhoaFhYWFhYyMjI2NjJCSjI2Ii4mJi4uLi4mLjIqMi4uLi4uLioqLi4qKiomJiYmJiYmJiYqKioqKioqKioqKioqKioqKioqKioqKiYqJioqJiYmJiYmIiIiIiIiIiIiIiImJiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIiIiIiIiIiHgXx4e3x5enp8fHx9fX9/fn59fX9/f39+fn+Af4B/f3+Af4CAgIKEh4eGhoaGhYWFhYWFhYWFjIyNkY+PjZGJjIaJjIuIiImMiYeNjo+NioqKioqKioqKiomJiYmJiYmJiYmJioqKioqKioqKioqKioqJioqKioqKiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4WAenl9e3t7enx8fHx9f39+fn19f39/f35+f4B/gH9/f4B/gH+AgoSHhoaGhYWFhYWFhYWFhISLi46PjoyLj4iHiYmMjYWFjo2KiYyNi46KioqKiomJiYmJiYmJiYmJiYmJiYmJiYmKioqKioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHhoaHh4eHhH55eX16enp7fXt8fX5+f35+fX5/f39/fX5/f3+Af39/f39/f4CChIaFhoWFhYWFhYWFhISEhIuLjI6MjI2Lh4mIiomGgoiNjoiKi5GTj4uJiYmJiYmJiYmJiYmIiYmJiYmJiYmJiYmKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIeHh4eHh4eIiIiIiIiIiIiIh4eHh4eHhoaGh4aGhoaGhoaGh4eDfXp5e3p5enx8e31+fn5/fn59fn9/fn9+fn+AgICAf35/f39/gIKEhoWFhYWFhISEhISEhISEioqOjYmIiIqKh4iHiomIioiIh4qGi5GPiomJiYmJiYiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHh4iIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGh4J8eXl6eXp7e3t7fX5+fn5+fn59gH9/f39/f4CAgH9/fn9/gICAgoSGhYWFhISEhISEhISEhISKi5CPiYmJi4qHh4WHiYuKiYSLjYmOjYqJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiIiIiImJiYmJiYiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGgXt4enp4e3x7e3x+fn9+fn5+fX1/f39/f3+Af4B/f39/f3+Af4CChIaFhYSEhISEhISEhISEhI+Qj4+IiYuIhoeIiYuLjIuJioqNio6Oj4iJiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoaAe3h5eXh4enp8fX1+f35+fn59fn9/f39/gIB/gICAf39/gIB/gYKDhoiGiIaDhISEhIODg4ODkpKOioeKi4qLh4uNiYqJi4iHiouIio+SioiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhn96eXh4eHl5eXx9fn5/fn5/fn1+f35/f3+Af39/f4CAgH+AgH+BgoOHjo+PjoiHhIWFhoaFhYWSkI6KiYmIiImKioiIh4aKjIiHiYmOkJGNh4iIiIiIiIiIiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4aGh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWGf3l4d3d3eXp5e3x9fn9+f35+fn5+f35+fn+Af4CAgICAf3+Af4GBg4eOjo6Ojo6Mjo2OjY2MjZCQjomHhoiJiYeIiouIiYyJiYaKjY6PkYuIiIiIiIeHh4eIiIiIiIiHh4eHh4iIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhYZ+eXd5d3d6eXl8e31/fn5/fn5+fn5+fn9+f4B/fn+Af39/f39+gIGEiI6Ojo6Ojo6Ojo6Ojo2NkJGOi42JjIiIiYaHiYaIioiHi4yLjpCQiIeIiYmJiIeHh4iIiYmIh4eHh4iIiYiIiIiIh4iIiIiHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhoaFhYaGhoWGhYSEhIWFhoaFhIWFhX55d3l2eHl4e3x7fn5+fn5+fn5+fn5+f39+f39+f39/f35/f3+AgYOGjY2Ojo6OjY6NjY6OjY2Qj42Ni46KhoiKhISLiYeDhYSDi4mLj42JjI6QkI+NjYyLjY6Pj42NjI2Nj4+Pjo6MjYyMjY2KiYiHiImHh4aHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoeHiYqKiIeJi4yNjo2LiImLi42OjYyJiImMgHl3d3Z6eXh7e3t9fn5+fn5+fn5+fn5/f39+fn5/f4B/f4B/f4CBg4aMjY2NjY2NjY2Qj4+Pj46NjI6KiYuMjIeFiY2Lh4aIh4aHh4uNjo6Pj4+Pjo+Pj4+Pj4+Pj4+Pj4+Ojo+Pj4+Pj4+Pj4+Oj46Oj46Mi4uJh4eHh4aIhoaGhoaGhoaGhoeLiYeHiIiLjY2Mi4yLjY2Ojo+Ojo6Pj46Ojo6Ojo6Ojo6Njo6NjY2AeHZ4eHp4enx6fH5+fn5+fn5+fn5+f39/fn59fn9/f39/gH9/gIGDhoyMjIyMjY+QkpOTk5KSjYyMjIqHioyKh4eJiYWCiouIiYWJjpCNjo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjI2NjI2LiYaHh4eHiYqLjY6NjYyNjY6OjY2OjY2NjY2NjY2NjY2NjY2OjIyNj4+OjY2MjIyLi313dXd5enp7e3p+fn5+fn5+f35+fn5/f39+fn1+f39/gICAf3+AgYOFj5KRkJGSk5OTk5OTkpKLi4uLiomMiouLiYuKhoeOjYiIjI6OjIuMjIyNj46Njo6Ojo2NjY2MjY2NjIyMjIyMjIyMjY2NjYyMjI2NjYyMjI2NjIyNjIyMi4yMi4yMjI2MjIyMjIyMjIyMjIyLi4uLi4yNjY6Sk5OSkpSRkJOVlZSTk5COjo6Oe3Z2d3h6ent7e31+fn5+fn5/fn5+fn5/f35+fn9/f39/gIB/f4CBgoSNkpKTkpOSkpOTkZKSkoqJioyJi4qJjIuKioiHiYqKi4mKjY2Mj46Nj5KUlJOUlJOTkpGSkI+Ojo2NjY2Pko+OkZGOjIuKioqLi4qKi5CPjoyMjIqKioqKioqKiouKioqKi4yLi4uMjIyKiouLi46RkpOTk5SUk5STk5SUlJOTk5KSkpKSk5F6dXZ2eHt7e3p6fX5+fn5+fn5+fn5+fX5/fn5+f39/f3+Af39/gIGChIuRkZGRkZKSkpGRkpGRiYmIiIqMiYiJiYuJhoSJhoyKh4ySkpKTk5OUlZWWlZWUk5OUlJSUk5SUlJSVlZWVlZWUlJOTkY+QkZKQjoyRlZWVk5KSjo+QjYqKi4qKi42OjY6RkpCRkpKSkpGRkpKSk5OTk5OTk5OTk5OTkpOSkpKSkpKSkpKSj3h1d3l6e3t7ent9fX19fn5/f35+fX5+fn5+f39/f39/f4B/f3+AgYKEi5GQkJCSkpKRkZGRkZGIiIiIi4uJg4eLi4yMiIeHjYyNkpSSkpOTlJWWlpaVlZSSkpOTlJSUlJWVlZaXlpaWlpWUk5SUlJSVlJSUk5OVlZWUk5KTk5OTkJGSkZGSk5OTk5KSkpOSkpKSkpKSkpKSkpKSk5OTk5SUk5OSkpOTkpKSkpGRkZGPdnJ3enp7e3t8fX59fX1+fn9+fn9+fn5+fn6Af39/f3+Af3+Af4CBgoSKkJCRkZGRkZCQkJCQkIeHh4eIiIiFi4+KjI6Njo+OkJWUk5OTk5SUlZWVlJSVk5KSk5KTlZSUlZaWlpaWlpaWlpSTk5OTk5OUlJOSk5SVlZSTkpKSkpOTk5OTk5OTk5KSkpKSkpKSkpGSkpGRkZGRkZKTlJSUlJSTkpGRkZGRkZGRkZGRkYx0c3d6ent7e3x9fX1+fX5+f35+fn5+fn5+fn9/f39/fn9/f39/f4GDhIqQkJGRkJCQj4+Pj4+Ph4iKi4yNjYuOj42Mjo6RkpGSk5OSkpKSk5SUlJKSk5OTk5OSkpOUk5OTk5WVlZWUlZWUk5OTk5KSk5OUk5KTlJSUk5KSkpKSk5OTkpKSkpKRkZKSkpKSkpKSkpKSkZKRkZGSkpOTlJSUk5OSkZGRkZGQkJCQkZCRinN0dnp8fHp7fXx9fn59f35/f35+fn9+f31+f39+fn59f39/gH+AgYKDipCQkZGQj5CPjo+Pjo+Oj4+Pj4+Pj4+PkI2OjpCRkpKSkpKRkpKTk5OTkpGSkpKRkZKSk5OSk5OSk5STk5OTlJOSk5OTk5OTk5OSk5OTkpKSkpKSkpKSkpGRkZGSkZCRkZGRkpKRkZGRkpGRkZGRkpKSkpKSkpKSkpKRkJCQkJCQkJCQkJGGc3V2e3x8e3x9fX1+fn1/f35/fn5/gH9+fX5/fX5/fn5/f3+Af3+BgYGKkI+PkI+Pj4+Pj4+Pj4+Oj46Oj4+Pj5CQiI2PkJGRkpKSkpOTk5OTkpKSk5KSkZGRkZKSk5KTkpGRkpKSkZKSkpKSkpKTk5KRkZKTkpGRkpKSkpKRkJCQkJGRkZGQkJGSkZGRkZGSkZGRkZGRkZGSkpKSkpKSkZCRkZCPj4+Pj4+Pj4+PkX9ydHh8fHx7fHx9fX5+fn9+fn5/f3+AgH99fn5+f39+f39/f4CAf4GBgYqPj4+Pjo6Ojo+Pj46Ojo6Ojo+PkI+Pj4+GjpCQkJCRkZGRkZGRkZGQkJCQkZGRkZGRkZGRkZGQkJCRkZCQkJGRkZGRkZGRkJCQkZGQkJGRkZGRkI+PkJCQkJGRkJCQkJCRkJCQkJCQkZCQkJCQkJCQkZCQkJCPj4+Pjo+Pj46Ojo+Pj4+PeHJ2eXx9fHp9fH19fn5+f35+f39/f4CAf39/fn5/f35/f39/gIB/gYGAio6Ojo6NjY2Ojo6Ojo6NjY2Oj4+Pj4+PjoiQkZCPj4+QkJCQkJCQkI+PkJCQj4+Pj5CQkJCQkJCPj4+PkI+PkJCQkJCQj4+Oj4+QkI+PkJCQkJCPjo+QkJCPj4+Pj4+PkJCQkI+PkI+Qj4+PkI+PkJCQkI+OkI+Pj46OjoyMjY2NjIqDiYhzc3Z4fX58eX18fX1+fn5/fX5/fn9/f39/f4B/f39/f4CAgH+AgH+BgYCJjY2Ojo6Ojo6OjY2OjoyNjY6Ojo6Ojo2NiJCRkI6Njo6Ojo6Ojo6Pjo6Ojo6Ojo6Pjo6Ojo6Ojo6OjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Pj46Oj4+Pj4+Pj4+Pjo+PjY2MjYyNjoyLi4mJiYiFhYSDgoKEgnR5fXp4dXJrZWltb2xmZmdncHNzd3l9fnl6e3x9fX1+fn59fn9/fn9/f39/gIB/f3+AgIGAgIB/f4CBgImNjY2NjY2MjYyMjIyMi4uLjYyMjIyMjIyGj5GRjIyMjIyMjIyMjIyMjIyMjIyNjY2MjIyMjYyMjY2MjIyNjY2NjYyMjI2MiomKi4uJh4KAh4iEgXt6gH57fXx8fXlzcnJycnV1cG1ramppZ2NkYV9bXF1eWFVXWFlTS0VJSkpLTE1PT0tgdHR3eX19eHp5e3x8fX5+fn1+f39+f35/f4CAgH+AgICBgYCAgICAgIGAf4OEhYSFiIuLjYyMjIuLi4yGiYqKioqKh4OOkJGNiouLi4uMiYmKioqKiouLi4eDi4qIiYmGhYWEhIeJiYWCg397fHl6e3pzcHFxcW1samdsbWdlZmVmZGNlZGVkZWVlZWRkZGNhYV5dXFpYWFdUUFFSU1JTTU1KSUZESEpHR0hHR0xOSWdzdXh5fXp4d3l8fHx8fn5+fn9/fn9/f39+f4CAgIB/gICBgICAgICBgYFnXmBjYWNucX17ent/fXd8fHZ4ent4eHpvcHt4eXt8e3h3e394dXd0dHZ0dXZ3dXFycW5wcnBnaGtsbm9tamlpaGhlZWRkZF9gYWJgYF5dWVhaWltdXV9gX2BfX19gYmFeXl5eWVldXF1bV1dWUlRSU1NOUUpISUZERUhMTEhGR0lLSklNbXJ0eHp7end3eXt6e3x+fn1+f39+f35/f35+gIGAf3+AgIGAgICAgICCgWdYW1pZXFtcY1xaXF5ga3FtcHBvbm5vbmtpbmxrbG9qaWtraWpraWdmZ2dnaGhnbWdqZ2hlaGdjY2JhYmBgXVhbW1dYV1RWUVBUU1NNSkxLTExOTk9UWFhXVVVUUlBQTU1QT05LTE1QUU9MTEpHSUlHSEhJSEhIR0ZHSEpKSEhISUlISVZwc3V5ent5dnZ5enp7fH59fX5/f35/fn5+f3+AgX9+f4B/gICAgICAgIGBbFtYVlZWWVlaWVlYVVZoamxubmxra2poaGloZGVkYlxiZl9fYGNfXF9dYF1eWl5dWVleYmFeXlpZX1xYV1NOTUxLS0tMSUtNTktKS0tMSktQTEtLRkdHSUlGR0lISUZFSEdGRkVERUVEREVJSUlHSEdIRkZLTUtJSUlIR0hLTU1LTExMVXFzdnl6e3h2d3h3ent8fn1+fn9/f39+f3+AgIGAfn5/f4CAf4CAgIB/gYJoUlRVVlNVV1lZWVdXV1tbYWNfXlxbWFZWWVZSVFJRUVVUU1NTUE1KTU5QUk9NUFFRUVFSVlZRUVFUUFBOTk9MSk1MS0xKSktLRklJSkxJR0pISUlFR0dGRkVFSElKR0ZHRkZHR0hKR0dISEpMSkpLSUlISktLSkhKS0pISUtMTU9QUEtUdHR1eHp6eHZ2d3d6enx+fX5+fn5/f35+fn+AgYB/f3+AgYB/gICAgH+AgmlQUlRXVVRWWVdYWFpbVFRTUlBRU1FRUU9OTlBQUU9MTlBPTk5NTEtNTk5QTU9QUFJRUE5OT05PTk9PUFFPTk5PTk5QTk1NS0lISEpJSUlJR0ZHR0dJSkhJSEhJSEhHSEdISElISUxLSklISkpJSkpIR0pMS0pJSUhKSktMTk1NTU9RTFVzcnN3enl3dnR2eHp7fX19fn5+fn9+fn5+gICBgICAf4GBgH+AgICAgICBbE9PTlRZVVVdW1lXV1hOTUpKSUZKT0xKSkdJSk1NS0pMTUpHSUlJSktMRkRGSktLS0hKTExMT01MTE5PT09NTk9MTk5OUFBPTE1MTk1MTEpJSEdJSElISElJS0xLS0pJS0pJSklJSUlJR0dKSUdJSUpKTk1OTEhJSklJSk1PT01MT1JOWXBwcnd4d3d0c3R3enx+fX5+fn5+fn5+fn9/gICAgICAgYCAf39/gICAgIFvS0pNTlFOTlVXVlZSU0lFQ0VFUkREQT5CP0RAQD5CREFAQURHRkVIRUJBQEBDQ0RFQUNFSEtPS0lJSkhHSklKSUlLSkxQTk1MTU1MTU1NTElIREZGR0ZGRklKSUlLSkhMSklKSkpJSEhKS0tIRkdJSklLTU5OSktPTUxLTU1PUE5QT1BgcG9yd3h2dHJzdXd6fX19fn5+fn9+fn1/gICAgICAf4CAgIB/f3+AgICAgXNQUE5OUE1KS1BSUE5RQ0RCQUZRRT1DPT9FSDk6Oz0/PTxBRUA+Ojs+PjxFRD0/RUE/QEFAREVHR0dHQkRERUZFR0dHR0pHSEpLR0NER0pHQ0RFQUFDR0hHSEdISktKSElMS0lISktLTU5MTUxMSkpMS0lLTU9PUFNRT1BQTk9QUlFNUGdwb3N2dXRycXR4eX19fX1+fn5+f4B+foCAgH9/gIB/f4CAgH+Af4B/gICCdlRVUVFQT0xNUFBOT09BQkFAQkE/Oz48Pj8/Ozg5ODs7OkA7Oz48Ozs8PEhMPT1BQT9CQz1BRERGQkZGREdJSEM/QEBAQUFCQUE/Pjw9PkFAQD8+P0BFR0dHSUtMTk1OTUxNTUpLTVBVU05MTlFOTk1OTE1NTk9OTk1LS05OTk1OTkxUbnBwcnR0c3Fydnl5fX19fn1+fn5/gH5+gICAgICAgH9/gICAgH9/gH+BgIJ4UVFSVFJTUVNTUVFST0BAPT4/PD8+QEE/PT45Ozo7Ozk5Ojg4Ozw6Njg7PD49Ozs6ODpAQEFCP0E/Q0ZEQkNDPzs+PkBDQ0E/Pj9BPkBAQj9APD9CQEFDRUVFSktQT1BPTU1OTExMT1JRUFJOTExPTUtOT0xMTEtMS0tKS0tKTU1LS1xxcXF0c3VzcXR4eHp9fn1+fn5+f39/fn5/gIGAgH+Af4CAgICAf4CAf4CAgXxSTU9RUFFSUlRSU1NOPDs8Ozs7P0BBQkA9PDk8PTw6Nzk6Ojk4OTpOPzg6OTo7Ozg3ODk7Ojg8Oz1AQUA9Ozs+PD09QEJDQT9BQkE9Pj09Oz0/Q0RCQD9BREJFR0pKSkpKTE1MTExNTExOVVNLTE1USVBKSU1KSUpLS0pJSEdKS0lKZnJxc3RzdXJydnl5e31+fn5+fX9+f39/f36AgICAf4CAgICAgIF/gIF/gYGBgFZMTlBQTlJRUFBRUU44PT88PDo9PkFAQT8+PkA/Pj48PT0+Pj07RnlfOz09PTw8PDw7Ozo7PD49Pj8/QUA+P0E/QEBBQEBAPT8/PTw6Oz09PD9AQUJCQUBCREZGRkdGR0dISUtMTExLTEtKS0lKSk1MTEpMS0lISUxMS0lJSElLR01tcHF1dXR1c3V4eXl8fX5+fn5+fn5/gH9+gIB/f39/gH+AgYCAgYCBgICBgYCCYUtPT05OT1BPT1BQTzo8Pjw9Oz8+PkFBPz0/Q0REPz49PUBJSENYeW9DPkNFPz9APTs9PT08Ozo9PkFBPz5AQD9BPz89PD48PTs7PD0+QUA/QD5AQ0NEQkRFSEVFR0hISEdGSUpJSUlJSUhKSkpKTEtKSklJSEhKSktMS0lLSkpIVnBvcXNzdHR1eXp7e3x+f35+fn5+f39/f39/f3+Af4CAgICAf4GBgICAgIGBgIJtTFBRTk9QTk5PUFBPPjw8PT4/P0A+QEA/Pz9DRkVOQDpAZX5+eHJ3bz45PDk9PUA9Ojw7Ozw7ODk7Pz49PD07PEA9PTw8Pjs9PD0+QUBCQUBAP0JEQ0RFRkZGQ0VHSElJSEhJS0tMTUpKSUpNTUpLSktJSEhISEpJSktKSk5MSUlfcHBycnJ0dXZ6e319fX5/fn5+fn5/f35/f36AgIB/gICAgICAgYGAgICAgIGAgnZNTk5NTk5MTE5QTkw+QTw8PT8+QkM/P0FBQUJATXtmQGuHhISDgnpwPzk4ODo7PT8/PDs7PDs6Ojs+Pz89PDg6Pjw9Pj89Oz4/QEJDQkJDQ0FCQkFCQkRCQkRCRENGSUdGRkhJSUtNSklKSktMSkpJSkVESUlGRkhISUpKTEpGRmdwb3FxdHZ1d3t8fH18fn59fX1+fn9/foB+fn+AgH+AgICAgICBgYCAgICAgICBek5JS0tMTExFSUxOTTw/PDw9PkBAQUE7QkNCQz9VdXlxgYGCgnyEgHJCPT0/PT0+Q0Q/Ozw9Pj89PT5BQ0A8OTtBPz4+QT07P0JAQkNCQENDQUNBPT0+QD0/QUFBQENFRUBAQ0JDR0dFRENGRUZGR0VEQEFHR0ZDRkRHSEpHQz5IbG9wcHF0dXZ5fHx8fHx+fn1+fn5+fn5+f36Af3+AgICAgICAgIGAf4CAf4CBgIF+UUhLTU1NS0pLTE9RQD8+PkFBQEBBR0FCRENFQFV1dIF/fIODfIWFaEFBQENAQD9AQD49PD1BRUFCQkZIQz08QERDQUE/Pj1AQT4+Pj88PkBER0VAPkBBP0BDRkVDQkNDQEJEREJERUFCPkFCQkFCQEA9QUJDRENDQUNFR0E/PVZwcHFwcnV1d3p8e3t8fX9+fX19fX1+fX5+fn9/foB/f4CAgICAgYCAgIB/gIGAgX5SSEtNTUxLS05OUlVEQkBDQ0FBQkBCQ0BAQUFATHNzf399g4WGhodfPkNDRUA/P05hX0pAQ0VJSUlJTU1LRUNGR0hFR0VFRUREQ0E/QD4+QkZKSkdFRUdGRkpOTktKSUdHSEtNSkdHQ0REREVEQUJCQ0BDREVEREVERUZDQkFEZW9wcXF0dnV4e3x6fHx+f319fX19fn59f4B/f39/f39+gIGBf4CBgICAgH+AgICAfVJJSUpKSEpKTE9SU0dGRUdIREdIREA+PDs+QEVFZneBg4SFhoeHiYRLREVEQ1d1homKflhHSEpMTE1PT0xIR0hHSElJSEhHR0hIRUNFRUVFRkhKSkZFR0lKTU9PTU1LSktKTU5LSUhHSElIR0ZFRkZGREZIR0VFSEhGSEdIRlFubnBxcnZ2eXt7e3p9fX5/fX19fX1+fn1/f39/fn5/gH+BgYGAgICAgICAf4GBgIB8UEhHSElGR0lKTU5OSkxJSUpLTE5KRkNBQkNGSkdYdIKEhoSChYiIjWNAQlV0h4mHh4aHgldJTE1MTU5MSkdHR0dER0dHR0ZIRkhFQ0RERkVEREhIQ0NDR0pKS0xMTExMTElKS0pKSUlJSEpISEdISUhHR0hGRkZISklJSUlIXW9vcXJzd3d6e3t6e319fn59fX19fX5+fYB/f39+fn+BgIGAgYCAgICAgIB/gYCAgHxNR0ZIRkVGR0dKS0pMTUxLTU5NT0tJSEhKS0tMTEpbhIaHg4GDhoiJfVdshIeGhoaHh4eHfFBLTEtIR0ZGREVDQ0BBQ0NDQ0ZGRUJAPj5AQUFAQkQ/Pj9ERkhERUdJS0lJR0hJR0lJSkpJSEZKSkpKSUpJSkpKRklMTEpKS0tmb3BzcnR2eHl7e3t8fH1+fn19fX19fn59f39/f35/f4CAgICAgYCAgIGAgICAgICAfU9GRkdGR0hHRUZHR01NTUtMS0lHQ0NDRElLS0xMSWWHh4aBg4WAgYKDhIWFhISFhoaHh4aKdUlJRkI/P0A/Pz88PDw+Ojo8QUFAPjw5OTg8PD07Pjs5Oz9BQkFBQ0NDQEFCRERCQ0ZISUhISExNTEdJSk1NTk1KSktLSkxNU2xvcXRzc3d5e3t7fH19fn9+fX19fX1+fn5/foB/fn9/gICBgIGBgICAgYCAgIB/f39+UUZFRkdJSUdEQ0VGTk1MSklIRT85Oj5ARUhISkpKbIeGg4CDhICBg4ODhIWFhoeIiIiJiYyOZkJCPTg4Ojo5ODc4ODk2NDc5Ozw6ODU2Nzc4OTc4NzY4OTs7PD5AOzk5OT09Pjw8PUFERUhKTUxMR0lIT1JRUFBOTE1NT1Fdb3BydHN1eHp7e3x8fn5+f359fX59fX5+f39/gH9/f4CAgICAgYCAgICAgICAgIB/f39RR0ZHSEpIRkVGR0hMTEpJSUdDQjU2OjxDQENHSUlphYGAfoCChISEg4OEhomKi4yLiomKi4yJVDs4NjU2NzY2NjQ1NzYzNDY4Ojg3NjU2NTY3Njc3ODo3Nzc4OTs3NTg5OTg5ODc2OjxAR0ZJRklGRUZPU1JTU1JPUFBSVGVwcXN0dHd5e3t7fH1+fn5/fn19fX19f39/f3+Afn+AgICAgICBgICAgICAgICAgH9/flJISEhJS0lHSUpJSkpLREVIRUJANTc4OD06PUVDRXaFf4CBg4ODg4ODhYmKiomJioqKiouJiYqBSDY3NjQ2ODg3NDU3ODQ2NzY5OTc2Njc2NTo5Ojo6PDg5ODk3Nzc3OTo5ODg3ODU4OTtBPT4+QkE/QUtMT1FQUU9PT1JXa3JydHR1d3l7e3t8fX5/fn9+fX19fX5/f4B+fn9/f4CAgH9/gICAgICAgH+AgICAf39+VEhHSUlMTUtKS0tMSUg/QEFAPDo1Nzk4OTc7QjlIgoOAg4SFhISEhIaJioqIh4iIiIqKjIqJiYx6Pjo4ODs8PT45Ojs8ODk7OTo7Ojk5Ozo5PT09Pzs7Oz06Pjs5Ozs8Ozw8OTs8ODo6Ozo5OTk8Pzw9QUJESUpNS0pLTFdvcnN1dHZ4e3t7fHt9f39+f359fX19fn9/f35/f39/f3+Bf4CAgICAgICAf4CAgH+Af35URkVGSUxOTkxKSk1CPzo7PDs4OTk4OTo6Ojs/PFeGg4KDhYaFhYaIiYiHhoaGiImIiYuMi4mKioxsPDs+QkNFRUFBQUI+QEJAQD89Pj5APz4/QD9APT0/Qj9BQT9BPz1AQEA/P0E9Pjw7Ojs6OTs/PTs7PT1BQUNBQkNBWHFxdHR0dnl7e3x9e31/fn9/fn19fX5+f35+fn9+f4B/f4CAgIB/gIGAf39/gICAf39/flJFQ0FHSk5PTElHSzo4Ojs5Ojo8PTo7Oz09P0BCYIeDg4WGhYWEhomJiIiGhoaHiImKi4uKioqLiotePkRHSUtKSUZHR0RGSEdFQ0BAQ0VDQkBCQ0I/QERIRUNFREVFQUZFRkVGRkRAQj89QD49P0A+Pz8/Pj8+Pjo7PTxgcXJ0dHV3enp6fX19fn5+f39+fX19fX5/fn5+fn5/gH9/gICAgICAgICAf4CAgIB/f4B+UERAPUNIT01HRkJEOTc6Pjo8Oz4/Pz89QUBEREVjiIODhYWGhoaIiYmIh4aGhoeJioqLjI2MjIuKiohXSExNTUtOSklLSElKSklFQ0RGR0ZEQ0VGREJISUtIR0dGR0dFS0lLSUpLSkNGQ0NEQkFBQ0JEQ0NERENBPTs9QGhwc3R0d3d6eHt8fH19fn5/f359fX1+fn9+fn59fn+Af3+AgH9/gICAgICAgICAgH+AgH9PQT49P0RMS0BCQkE5ODw+Ozw7PkA/QT9CQ0hISmCGgoOFhYeHiImJiIiHhoaGiIiIiYqMjYyMi4uKjH9QTVBNS05LSkxJSUlISkZER0hISUVFSEZGRUxMTUlKR0dISUpPTU5MTE1LSEZHR0VFQ0ZGRkZERUhIRkNBP0BMbHB0dXZ4eXl5fHx8fX1+fn9+fn19fX1/f35+fn5+f39/f39/f3+AgICAgIB/gICAgICAf1FBPz4/RkdHPTxAQDg3PDs8PTo/QD5AQENGSkpQaIODhYSFhoeHiIiIiIiIh4eIiIiJioyNjIyMjIuKjXFNUU9NTExLTEpIR0VKSURKSEdLSkhKR0dHS0xOTExISElKTVBOUE5NT0tJR0lKSElESUhIRkZHR0lGQ0JBQ1VucXV2d3l7eHl6enx8fX5+f39+fn1+fX5+fn5/f36Af39/f3+Af4CAgICAgICAgICAf39/VERBQUJHSEI/OD9AODo8OD0+Oz1BPj9ARUlLTVZzg4SEhISFhoeIiIiIiIeGiIiIiImJjIyLjIyMi4uLi15RUVBNTk1LSkdGQ0dKR0xKR0tPTEtKSk1NTE9QTkhJS0xPUVFQUU9PSklKSkxKTEZHSEdGR0lGRUVCQEJCXG9yd3h5enl5eXp6e3t+fn5/fn59fX19fn9+fn9+f4CAgIB/f39/gICAgICAgICAgH9/f39VRUNFRUdHRUQ7P0E7PTw5QD4+QEJHR0FITE1RV3mFg4ODhISGiIiIiIiIh4eIiIiIiIqLi4uMjIyMi4uNfFdVUlJUUk9MS0pFRUZLT05PV1ZRUE9RU1JNU1RPTVNMUFNVV1JTUVBMS01NTUtOR0dKRkZISkRERUVCRENjcHV5eXp6ent6e3p7fH59fX9+fX19fXx9fn5/gH9/gICAf39/f3+BgYCAf39/gIB/f39/f1VGRkdHR0dIRj5AQj0/PT1CP0JDRlZORk9RUVVZfIaDhYWEhIeIiIiIiIiIiIiIiIiJiouKioyMjIyOi4uLZ1ZWa2FFUlFRUEo7OlFTUmB1XVVWVFZZWVJYWFJaZlBVV1pdUlRXUVBOUlBQUFFLS0tHSElIRUZJSElISWpydnl5enl6e3t8ent8fXx9gH59fX19fX1+f39/f3+AgIB/f39/gICAgIB/f3+AgH9/f35+VEhKSUlHR0ZFPz9BQUVCQ0dFREVMWFJNVFZWWFt8hoWHhoWGh4iIiIiIiIiIiIiIiIiIlJyMioqMfWGKi4uHbFtkVTpYWFhTUD5AVlVZXGRgVllicl5dVl1aVkVRWVpbWV9UWWdSVVZYVVRWVE9PTUpMSklJTE1LT01Tb3N2eHl4d3p6ent6e3x9fH5/fn1+fX19fn1/f39+f4CAgH9/f3+AgICAgH9/gH+Af39+fn5WSkpJSEdGRERCQT9ITUlNUEtJS1BUU1NYWlpcXHiFhIWFhYWGh4eHiIiIiIiIiIiIiImcnaCPiY5nO36MiYqLem5wWFpbWlJTUlZWVFpadYNZVX2QYVxYXV5XSVZdXVtbX1lIWVhZXF1ZWFlXUlFNUFFNTU9TUVFVUmFzc3Z3d3Z4eHh6e3t8fX19f39+fX59fX1+fn9/gH9/gIB/f3+Af4CAgICAf39/gIB/gHh5fVlOS0lJSUZCREBBOlBRUVdYUFBPUVNUVFhYWVpbboGCg4WEhYaHh4eHh4iIiIiIiIiIiJaanJeIioFuhomIh4OKfmZZWVxYU1ZUV1JRV1ZjloBRZXJYWldfaFBgZlpbWFxoYkdPWmlnXFtcXV1XU05TUFBRVlZWVllabnJ0d3Z2dHd4eHt7fH19fX5/fn59fn18fn9/f3+Af39/gH+AgH9/gICBgYB/gH1yfX9/b3R8XVNQT01LSkVDP0A7UFBaWltSU1FPUlJSVVNWVFdfdXiAhYSEhYaGhoaHh4eHiIiIh4eIh4ORjomJiIaFiIiGfYB7XFBWWFRSVFJRUUxPTUtmeVpdVFlVVl1aTFRaVVNUXlpYV1dXemtYWlxcXlNQUFBJTk9XVlhaWmRxc3Z2dHR2eHl5e3t8fH19fn99fX1+fX1+f39/gIB/f3+Afn56eHd2c3V7f3+AgHRrfn5rcnleW1ZVU1JPS0ZDREFNXoNsVlJTTk9RT1FVUlNSUlRjZHaAgoKDhISEhIWFhISDhoaGhoeIhn6JiYiHhoOHh4d5bXFWSUtOTktNS0hKREZIRUM+U2NVf1JRUU5LUlRSTU9ZUU1OUVNVVU1RU1JQTkxMSENJSFJUVVpcbXJ2dnVzc3d7ent7e317fX19fn19fX59fn9/f3+Af399fX5+f39/f4B+e3Zzd31+fmR1fWlxdF9kXV5bWVZRTElMSWFsknRQUVNOUVJRUltSU1JRUlVVYnN7fH+AgYKBgX99e3uAf4OChYaHgoaGhoGEgYaFhnVfXUtDPkNDQ0NCP0RQQkRAQz5CSEdWQEhOTUddaVBIRk9GREVGSEdIQkNIR0hKR0NCQURAT1BNUmRzdXZ1c3R1enx6e3t7fHx9fHt+fX19fn5/f3+AgIB/f3x8fX+Af39/f4CBgH12dHt/bWh8Z25xZmllZWJcWFNRUFVSc1dlW09PTkxRU1FVWVNVUVFUUk9WYGtscnZ7e3h5dHJuc3RzeXh+foOAg4OCgIKAgoGBa0xHPj46Oz5APz8/PmtRS2FFRkhJRUI/R0xOR01RVUlCRT8+PD08PT0/PT9BQ0I/Pjw9Qj5KTUZVbnV1dXN0dnh7fHp9fHx9fX19fH59fXx+fn9/f4B/f39/enl3eHd2dnh7foB+fXt4dnx1YXhnbHBqbGppZmBbUVFaXFleSUpQUU5LTFFSUVRVVVdRUVdWUFhbYl1hZ21tbG9raGBucmptbHF1e3p9enh6fHx4d3hkQkBAQT06QkNBQURCXF1Pe05PT05LTE1PT1FNS0xXTUhHQEI8OTc3NTk5PTs7Ozg5ODk/O0FIP1x0dXV2dXZ3eXx8fH18fH19fn58fX19fX9/f39/fn9/f314dXd6e3p3eXh1d3t8eXh1eXdjcWhpcG1ubW1oZl5PUF5cWklHUFJRT01QUU5RUlRWWFNSWVROWVpbV1ldXl5gZWBdXnF2a15gZ2t3b29sam9ubmxmYllHRkZIQkFGSUVFRkRNUlBhV1JYUVBTU1JVW09PUVZQTUpDRj46OjY0ODY5Nzk6MzY2Nzk2PEI9ZnR1dnd3eXl7fX18fHt8fX5+fnt9fn19f39/fn5+fn9/e3d1eX18enh8fHx8dHd2d3Z1d2tuaWhxbm9vb2prYFVXXlpXTUxUVFNRUVVPTFJTVFdYVFRYUUxYWVpWWFhWWFldV1dYaHNrXVZgdGthYV9dZGBfXllVUE1PTkxJR0pLSUhGQ1FQU1pXVFRNUVNZU1xlVU9TVFJOS0lIQz9BOTk4ODk3ODg0NzU3ODU4OEduc3V4eHp7e31+fX18e318fn5+en1+fH1/f359fn59f358dHR1e3hycW9vbnR4cXJzeHZ1cWZkZ3JucHBxbm1kXV9fWVdPUFhWVlNUVk9PVVZYWFlTVVRMS1RVVVVVV1BUVVdUVVJdbl5STllgW1ZZO0RVV1RbZkpMUFJST01NTk5OTEpGUFBVWVNUTkpPT1VTVFxWUlVTUk5NTElISEY/Pz06Nzg3NjU5OTY3NjY1V3FxdHd5ent8fX59fnx8fXx+fX15fX18fn5+fXx8fX1+fXxydnF4eHJ1dXFxbnBwb3B1dnRuamRkanBwcXJwbmZlZGNcXlJUWlZXVVRXVFJYWFlZWVJVT0pHT1BPT01SSk9QUFBOTk9UTE1JUFBTVFUyPFhNSUFRPWNgUVNRUE5QUVBOTk1QTlRSUFJMSUxLT1FQUVJTVFFST0xNS0xMSENCQT06OTg3NjtCNDU2NjtlcHJ2eHl7fHx9fnx9fH19fX18e3h8ent9fX58e3l9fH18e3B1b3d1cHV0b3N2cHFxcHR1dmNqZ2VXaHRycnFuaWlocFZWVFVYVVdVUldWVVpZWFdVUVNGRUJGR0dIRkpESEpIR0VITEhLSUdMTVBNRy9FX1I+M0A+am9hUlJRQEZUUVBRUFFOUU9QT0xKTExPUE5OUFFRTlFPSkxNTUtHRUVEQjs9PDw5PUc2Njc2RG5xdXd6fHt8fX18enx8fX5+fXt5dnh3eXl8fXp6dn17fHp6b3Fud3JwdnFtcHNwb3Bzc3N0ZmdgaFpXa3JzcmxtbWtuYmVQU1RSU1VPV1ZWWVlWUVFRT0A+Oz0/QEJBQ0BCRURBQEdIR0hGRkhKTUxER0NPUkM4RU5TXWdTUVNBR1VQT1FRUE1NTk1LTEtMTk9PUU1PT01JTUxJTEtMS0dGRkVEPEFBPjtARTs8ODlUcXN1eXt7e318fHt5fHp6fn58e3V0dXJ2dnp6eHpyfHt8eXltcW94cnF1bm5xcm9vb3Rzc3J1dGtnZ15lam1wa29xbWltY0xPTk1RU0xUVVRXV1VMTEtIPTk4Nzs/QT89PUFAQj0+RUhHREZGSUdLSkBGQUFARkhFSk9IUVJhXFFQUk5TT09PTExPTUtNTE1PTltWS01RT0hKSENJSkxMS0ZGRkQ/QkM+PEJGP0I/QWRxdHd7ent7fHt6end8d3l+fnt7cXN0cHJzd3R4eHN6e3l2d2xxb3ZxdHRsb3Fybm5vc3ZydHNycmtsZW5zaG1ubWxtbGprSUxISE9RSlFTUVRTT0tIQ0U9OTg3OT9CPzs/QUBAPkFESUVDSEdJR0lFQkI/PjxDQkFHSURNT2FlUU1PTldLTE1LTE1NTUxLTk5TZE1KTFJJSUlFQUhKTE1OS0dJRkJBQkA/RUZFSERLb3B3enl5e3t6fHp3c3h0eHx8eXpucXJtbm9ycnZyc3h8eHZ2bXBtc3B1dGxwcHJvb29ydnVyVlZucWdseYRqbXFybm5qaG9ISkNHTE1JTVBNUFBIS0U/Qj05OTk6P0I/PEFCQkFEREdLRkRJSUdHSENDP0I/P0BBPkNFQ0tOUVRMSklNVEZJSUpMSktMSUlMTU9QUlBLR0NMR0NDSkpMTU9OSUpJR0NDQ0RJSk1MSVpzbXh5eHp7e3l8dnJwdXJ0eXl2eGpxbmpsbG50dG1zdXtzdHhyb25xb3ZzbnBvcnBvcHN0eWpOYGdzanR8eWdvc3FqcWhlcUhLQ0ZISEdKS0lKTERHQj0+PTo6OjtBQj89QkJDQ0hGSkxKRUlJRkdHQ0M7QUBCPkBAQ0VDSU1QR0hLRkhLREhJS01ISkxISEpMS01dUklIRE5HQkVLS05NUE5LTUpLRkdHSk1OUU5MY25pd3Z3e3h7en1xbWxza3B0dHR1aHBtamlra3RwbnR0eXByeXRvcnFvd3NvcXB0cnBydXR5a05WbXVscXt2aW5vaWp0aGRvRktDRkVHREVFRkVHQ0NAPjw9Ojs6OkBEQD5CQ0VFSUZKSkxGSUlHRkZEQjtCQ0M+QENDQ0VHTE5IS05IREhFSUxOTUdJTEdFRklJTE5LSkhFT0lDR01MTk1QTU5OTUxJSElPUlFSTlJmZ2Zyb3N4dXt6fGxoam9la3Btc3FmbWxoaWtsdG1wdXR3cW94dG90c3J2c3BxcnRzcnR1dXZ2WFZ1dWtvdHJrb3ZsaG1lX3BHSUNFRkVCQ0JFQERCPj8+Ojs7PTo9P0NBP0FDRkdKR0lJTEhHR0dGRUNAPUVFQj5BRENDRUdISUdNUElGRkdLTk9LRkhKRkVERElJSEtJR0hQS0RKTUxQTk9OT09OSkpITVJVVFJPV2RhYW1ncHJvc3l6Z2VoaGNpbGdxbGZsbWdpa2xzbHB2dXRwbnZyb3Nyc3V0cXNzdXRzdXZ2dnl2dXR2bGt1dW1ydnFsbmxlck1HRUVHQ0JBQkQ9QkE+QT06Oj0/Oj4+QEI/QEJFR0pGSkdJR0ZGRkVEQkFBRkZDQkJCREVER0dIRkxRTElPSkpMS0lHSEVGRURDSUhIS0pIS1JNQ09PTlFQT09OT09LS0tQVVdWVVRYYF5daWFtaW5ocnNiZWZmZGloZm5pZm1taGtrbXJpcXZ1c3Ftdm5vcXJzd3Nyc3R1dnZ2dnd2d3Z2dHd1a3N1bnV0c3Fya2tzTUZGRUhCQkFERDxBQUBDPDg5PT46Pz0/Qj9AQERGSEVIRkZHRkZFRENFQ0RJRkNGRUJFR0VFRkdFSk1LSFFNSktISElFRklIRUNJSUpLTUtQU05EUVNRUVJOT01OUE1MTlNXVldYVlheW11kYGhiamlna19lZWdjZ2dna2dna21rbWxwcWd0dHVyc252b3FwcnR4cXNzdXZ1gpF5dnZ0eHV1d3hub3VvcnN1cXFpcHpNR0dHSEJCQkZFPEBDQkQ8Nzo9Pjs+OkBCPj8/Q0VGREZEREdFQ0VDREVGRkpFRUlHQ0dIRkhGRUNGSkpHTUpMS0lKTEZJSEtIRUtLTE1OT1JUT0lTVVRRVFBRTU5RTk1RV1pWWllWWl5aWGFgYGBfaGVjYGRlaGdqaWhqZmhubGxubXFwaXV1eHJycHVwcHBydXZwdXN1dnV7fn14dnR3dnZ2d3BsdXBtc3Vub3JzeU1ISEdJREFDSEU8QEVDRT04Oj4+PDw8QUI8Pz5BQkZDRUJCSERDREVGRkdHSUZHS0hDSEhHSUdGREhLSUdLSE1LSktMSExKTUtJTkxPTk9SVVZPS1VWVFFUUVJMT1FQT1RZWllcWllcX19eYGNeXGFja2JgZGdocoVoZ2lmam1ucG9uc3FqdHV4cnNzdHJucHF2cnF1cnV1c355jn11dXZ2dnZ4cml1cWtydGxxd3F1S0lLSEpFQkVHRTxAR0REQDk8PkA/Pj9DQjxAPkFBRkNFRENIREZER0ZISEZISElLSkVKSEhLSEZGTEhISEpHTExMTExJTUtNTk1PTFBQUVVWV09KVlZVU1NSUUxPUlJRVltbXV5bXF5gX2FgYmRdZGBlZmBlaGpjc3NmamhnbHBycW9zc25zd3dxdXZ0c21vcnVvcnNwdXJ2cnSBdnV1dXd2dXd0Z3Rya3Fya3J3b3ZJSkxJTEdCRURFPEBGRERCOz8/QUBAQERBQEI/QUNIQkVERkhFSUVGRUlIRklISkxISEpKSUxKRkpLSElKSkdLS01NSkpNTE5PTk9MT1BSVVhWTU5UVlVTUlFQTU5UU1JXW15eX11dYGBhYWFgYmRlYmNoYmRpamd2i2xraWdtb3NxcHFwcHJ5d3J1dXRzbW1zc21xcm90dXRzcHN2dHV1d3Z1dXRlcXNrcHFqcnZvd0pNTEtNR0RDQUQ8P0VFRUM9QUFDQkJDRkJDREFBRUdDSEdIR0ZKRkNHSkdHSkZJTEhJSk1LTUxHS0lITEtOUUtSUUxTTUtOTk9QUFBUT1dYWFtOU1FXXFpTVlBOVFVUVFhaX2JiX2RhX2BiX2BlYWFjaW5oYmloaG14dmxoaW1vc3JwcXJycnZ0c3Vzc3Nua3NxbXByb3R2cnJxdXZ1c3d5d3V0dWNtdGtvcGpxdHB3TE1MTExHREFARD4+REVGQ0BDQUVEREZDQ0VHQ0JJRUJISkpISUtGREtKR0hJSUlLR0pKT0tOTElMSEpNS1pmSmRcS2xSSE9OX25VbHNbcXBid2NSUGJ2dWh1Y2F2YFhucWJkdmluemZcbHRgbGpUX3d2aWpnaWZnbG1qbW9qbW5zcnBycnFyc3Jzc3J0cm5sdG9ucHFxdXVxcXN0dnZ1dXl3dXR0YGt0a3Bwa3FzcXlLTkpLSkZCP0BCPz1ERUZEQ0RCRUVER0JGRkdDREpERUpMTEpMTUdHTUpISkpIS0pJS0pOTE1NTExJTE1MW3NiZHBebGxVTU5mc11nZXFsbnRncGlfYVlubmJwcGJrampnb3F0ZXRub1xwdWdwTUpyeXZrYmBrZWVteG1rdmxucHNycHJxcHFycXJycnRybW1zbm5vcHJ1dHFzc3R1dXV0d3h2dXRibXVrcHBscnJxektMSUlHRUQ/QkI/PUJGR0JGQ0VERUVEQ0hIR0RFS0dHTE1NSk1MRkpOSElLSklMSkpKS01NTk1NTUtOTU1bcm9vbnBwbGtNUFFsV05pYnRycGFtb3ZcWWxRXG1tWnFta29teHh0c2lwXGBzbHFqVXV5eHBjXmtmYmdwcGppb3Bwc3NwcXBxcXJycXFycnRsbXJtbW5vcnV0cXRydHV1dHV1enZ1dGVudWtwb2xzcnJ5SktHSEVFRUJCQj0/P0ZHQkdESUVFREJGSUhIRUdLSkdNTU5LTU5HTE5JTEtJSk1JS0pKS09QTk5NTE5NTFxoZHVdbHFXbE5PUW1VWmtea2x2YWxkdFRlY05tWWxcdHBraWx4and1aHBdX3NraFdiY3d8b2NgZ2hhZGl0eWtubnFzc3BxcHFwcnFwcHBydWttcW1tbW9xc3Rxc3J0dnZzd3Z6dnV0aG91bHNvbXNydHdJTUdJREVFQ0FCPEJAQkZER0ZMSEVDQ0hLSEhGSkxMRk1LTFJSTEdNTUhOSklITkhKSklITk9OTkxKTk1KWnNwcG9xcW1sT1FSbllxa2dvb3Fxb210Xm5YYXRfbm9wb3Fyb251c3R0altddGN3eHJqbnpoYWFjZ2Jiam10dXBzdXZzcXBwcW9ydHt/fn13bGtxbmxtbnByc3F0dHN1dXR4eHl5dHVrb3VtdG9uc3N2dEhLSElCRUVFQUA+Q0NCR0NISU1JRkNGSkxJR0ZKTUxGT0pLV1JLR0tKSk5JSEpMSUtKSUhKTE1NTElLS0tTa2JaaV5famNyclpfWWpvX2VlVWtfY1thYlFgbGhdalxuaWlkW3BmZHBdWlxrW21xY3BzbGRnY2RnYGBrbXBwb3R5cnVxb3BxbnmFiIeHhoWAdnNua21tb25xcnR0cnR1dXZ5eHhzdW5xdW53cXJ1dHdzSEhGSURFREZBQEFFRERHQkhKTEhGREdLTElFRkpPTElPSUxbUUpGSEhLTUlISklLS0lISkdLS0tLR0hKSkxMTEtJS0xOVFtcVFBUTVBPTk9PVlFPT1FPT1FKSk9QUWRxaVRZV1tbXFVZW11YXVxcY2ZhYWZiY2VfX2ZrbWhtdHlydHJvcHB0hoeGhoaFhYaHg3pwbW1sa3FzdHRydHZ0dXl5eHV2cXJ1b3ZydHN1dXNHQ0VHRkZBRUM/Q0dERUdDSUtMSEZER0tMSERHSVBLTE9LTFdNSUVFSElKSElLSExKSEZISEpHR0lFRkxISUtOTElPXFdeT1xbYF5PWFlTXFxiXk1ZWk1YYVJLWWFaU2BkXWJYW2RkVlZYXFlaWFxWWVxeY19kYGFfZWhrZ210dHFxdHBxcoGGhoaFhoWFhYaGhoR9cmtpb3Jzc3N0eHl5eHl4d3h0cXhyeHNxcnVydE9CQ0RMTUJDREJESUVHR0ZLSktIRUVKSkpHRUhIUEpMTUpNU0lIRUFIRkpJS0tJTEpIRkVKSEVGR0VFSkdDSk1KS1RfWWBYYGFbYFVYWVReXlpfUllcUF5cWU5fXF5TW15jX1pdYGNgWV9iW2BeW1RYWFpfXmRiYmFjZWlla3Jwb3Bwbm93hoaFhYaCe4CFhYaGhYaFf3VxcHJyc3Z5eXp5eXh4eHZyeXZ4cnF4dnR2YVNKSk1JRUNCQ0ZHRUdHSUpKSUlERktLS0VGSElOSk5MSExOR0hGPkdHTElLS0pLS0lHRUlFRERFQUZKREBKS0lPW2NZXl5hX1JUU1dfYFxdWV5RWVxNVl9XS1FZW1FbX2FhXV5jYWBiYmJjY2VaUllWVVxbXmNgX19jZWJob21tbGxsbHWFf4SDeXV8hIWFhYaGhYWGhoN9d3JydHd5eXl5f359eXV5dnZybnp3dnhYUUpGQ0dFQkVHSEZHSElGR0pHSEZIS0lMRENLSk5NTExISkpISkc/R0ZOSktLTUtLS0lHSEREQERBSElBP0lKR09dYVpbZF1fVFFSWF1cXFxfWktXXExSXFlJTV5QUF1fYWNjY2NiXGRjYmRjZlhRVVRTXFhbYV9eX2FhX2Rsa21qamxudn51gXp8hIWFhYWFhYaGhYaFhoaGgnpyc3V1e4WHh4eGhYSBfnhwend2eFxSTUJASUZDRktJRkZHSEdHSkZGRklMSk5FQ0tKTE5KTElLSkhJR0JISFFNS0tPTUtLSUhHRUQ/RUJISEFBR0ZEVF1ZXlhfWV9bXVVYWFBdXVFLSldeWF5bXVZaYFJRX19iYmBgYmJgY2JiZGRiWE9RUVJbU1xeXV5eX19fZGhnbGpubnB7e3x+e4CCg4SFhYWFhYWEhIWDhISHh4FzcneFh4eHh4eHh4eHh4WDgHx4XFNLQkFHRkRHTVJIQ1JLRkhISEVGS0pNUEVHSUlLTkxMSUxLSUlHREhLUU9NTFBMTUtLSElDRUFFQ0hHQkFGRUJWVUVcVF5TVl9YTlRVTlpbTUpLVWBhW19YX15hXU9ZYlxgYF9iY2JdYmJXX19UUE9QUVhSXVxcXV5fYGFmZmVsZm9vd3x7gHt9f4CEhISEhIWFhYODhYKDgoWFhnpvgYaGhoeHiIeGhoaFhYSFg35JTkZERkZHRElSY1BEV19JR0dIREZNSlBQRkpJSktOTEtLTEtKSkdFSk1RUU5PUE1OTE5IS0FEQUNERkRDQURFQUxIQ0xMUE9PTEZNRkdJSkhHTExNT1FJTE9QUFNQTFFTUlVaWVdZWFhkVk9TVFBQT05QVVRcWVlbXl5hYWVmY2hja21xc3N6eX97en+EhISEhISEhIKEgH57gYOBfXuFhIaGh4eHhYWFhISEgoGAfUtJRUVHRkdES01eTEdIWU1HSEpIR05MUVFJTEpLS05OVU5PS0tMR0dLUFNTTlBPTk9OT0hLRWBFRF9MRGZjRE1bSF5cc21PTVZtWUxDUGBVbFdnSl1YVl5ETFFVTE1UVlFSVFhXVFhVVFxUUGZaaGhkWVRrVFdWVVtcXGBgYWJiYmBnaWdubGhyenx9foGEhISEg4ODgX19enJ7gXp7f4KAg4SEhYWBhIWBg4N/fnp7TElFRkZIRUVLT1RJS0dgVEdKT0pJT01SUUtNS0xPUlVST09KTE5HSE1RW1lPUFBOT1BPSUpQf1FJfFlZcnNYUG1IcW5vYVZQcXFzUENrc21xc3BTb19bblhdVlxYVWtoVV1WY1pgWVpfVlVXf2p0dXVfYXZfWGJcXGZbX2FhYWJeYGJnbXBsYHB3dHiBgYKDhIJ/fX6Adnh6bHZ+dHh+gHx+gIGChHyAg3p/gX9+d3dOSUVITU1CRExMR0lMRlJWTEtPSUtSWFdRTk9PTVFUTk9RUEtMT0dNUFNbWlRRUk9QUFBKSFp4XVR4ZGhZUlRRdmd0bHBibmZrUXJPTXdtanJwc3JxcnBvcIBdZXp1eHFxenF+c31rdX1iUmh8ZXNzb3NzfH1vfnlvf3JgYGBiYVphYGdrbmtibGZnbXd+gYCDfnt4d4B0dnppcn5udHx+d3h7foCDeHyBdXx/fHxzc05LRmBdR0FFTU1IS0tISlBPTU1KTlZeWVVMUVNOWVlMU1NSTkxQSVFSVFlXV1FUUFBQUUtHZnhsY3hxbVpKTFV5cHVtdWJudlBkZUpmdnFtd2+AamZ4eGlXclFoem1panp6fWx4en9wZ29YdnZqdnVwgGFzaH1pbHh8b19fX2NiW15iZGdpamRnYmNkbGxwcHN0c3NzeXFyeGJsdWdyeXtzc3V5foFzdnpufH15eHJuTkpTdE5DQkVQUElLS0pMUE9PT01QWmBaWEtUV1BhXlJWUVlTTVBJU1RVWFdXUFVQT05SSktyb3V1cXVxZGhhVm5McXBeRmh5V3ZUS2h4fXhgeXtzbmFebW9kUmdydW5teXB3bHZzdHFsbVxzfnprbXl8bHVtfGtwdnV4Xl9fYl5dX2VkaWdoZWVeYmJpaWlqa25va3FubWpwYWNmZG93eG9tcHN5f25xcGp7enRyb21LS1tWSEdFR1JQSkxNS0xRUVBQUFFXXFlVTlZZVWZYUlJZXlRNTklUVFZXWVdPU05OTlFIUm1IaXdLYGR2dlVXbE9ubHtzYWpnf3ZVS1draH1sbWx4YFtwenteYHpzY3JveHFoZHxpcntdVEtsX3Z1a2l1e3ttfnhrfHBdXl5iW15iZGVnZWVlYlpjY2lra3JzcndnbWloZGdgYWxhZ3Nya2hsbXJ8a21oa3t0bW1rbU9HSktISkhIUlFMTlBNTFRTUk9TU1dSVlRQV1pWVlRUVGFgUU9OS1RTU1FWVk9OTE1PUEpIUU5QVUxLS1NUU1JUUFZVUVFOUVFYWFFOUFVUWFhYW1tVU1NXW1dYV1pQU1VXV1hRXVhWXVVTT1hSV1dXWFpgW2dyXltcW11eX2NaX2NkZWZkY2NiWWNjZmZmbW5tdWZmZ2NgZl9dZ2BkbGhmZ2tocHpoZ2drdWpoZ2lsUUlLS0xNS0pUUk1RUVBMVlVUUFRVWFVZVVJaXVZVVFdVWVhQT0xOV1RRTlVTTlBNTFFQS0pRUktRTUtLT1JUUlFRU1NJSE1OT1FSUVFRVFZSWFdcV1NTUFFVVVZUWlFOU1JXVVRZVlRZVVNSVVNUVVhZV15aX2FdXFtaXFxgY1xdYmNkZ2VkZGFZYGFjYWJpaGluY2FkXl9jXVpkXGJtYV5mZmdtc2RpaGtrZWRjZmhQSktLTk9MTVRRT1RRUU1YV1VUVVdXV1pWVFxgVldWWVVYVFFQS09YU1BOVVBNUk5LU1BNT1VUTlFOTU5RU1BUUVNUVU5LTU9RVFRSUlFWV1VZWltZU1VSVFdXV1lbU09TVVdVVFlVV1lUUlJXVVVXXFlaYF1WWV9dXl1cXWFhXltiYmNoZmVkYlhgYGJdYGhlZmRhXl9dXV5aWl9aX2dgXl1dYmhrYWdmaGZkYGJjYVBLTUxQUUxPVFBQU1FPUVpZWFdYWlpYWVZdamRWWFlaV1ZUVE9LT1ZUUE9UUFBRTk1RUVBSWFRSUU9NT1NVTldSVFVVT05OUVNVVVRUUlRYVlpdXFpWVlFSV1hWW1tWUFNWVVVWWFRXV1RSUlhWVVpfWl5gXlZeXV5gXFxgYF9fWmJiZGhoZWRiWWJgYl5fZmRjYGJdXFxcXFlaW1hbYVteXVxfYl9fYmRkYmRfX2BcUE1OTlJRTVJTUFNUUU9VXFpaV1tbXFlaW2RxbWhkX1tZVlZYUk1NVlNNTlJPUVJPTFBTUlVaVVRQUExQV1ZRV1NTU1hNT1BSVFhVVVVTVVlYW15dXFtWUk9VVlZbW1dRU1dVVlhVU1haVFNRWVdWXF5bX19gVWFcYGFeYGJfXGBdY2FjZ2lkZWBaY2BhX19lZV9gY1taXFtcWlpZWVdcWVxbYF5fW15eYWBfYlxZYFpRTk9OVlFQVVNQVVRTUFdcXFxYXlxfV1xeanF3eYBjXFtWVlhSTk9XU05RUVBSVFJMUVRTWVpXVU9STlNYVlRTVFJSWk9RU1NWW1ZWV1RWWlhdXlxcXlZTTlRWVlxcVlFUVlZYWVJTWVxUUlJcWFpdXl1hYWBXYltjYl5hY19cYmFiX2RnaWRmXltkYGFgYWNlX2JfWVpeW1xbWVhZV1daWlphXF1bXVxcWl1gV1tbWlBPT09ZUFVVU1JXUlRQWl1eXVtgXGBVXF1panJ9c2xoXFVZV1FPUltTUlFUUlRVVEtSVlVbWVpTT1NSVlZVU09WUlNaUlRVVFhcV1hYU1hcWF5dWVteVFVOVldXXltYUVRVWFhYVFZYW1RTVl1ZXV1hXmNjXllgW2ViX2RkXl5jY2FdZWZpZGZdXmRhYGFiY2RfYl5YWl9bXFtYWFhYV1taXGBdW1xcW1haW15WXlldUE9PUlpQWlVVV1ZUVFReXmBeXmJcYFVdXmJreXRsfWxaVVpVUVFTXFRUVFVUVllXTFJaVl1bXFJPVVNYVlZTUFhSU1dTV1ZWW11YW1lVWl5XX15ZXFpSV1JZWFlfWllTVFZaWVpWV1lcVlRaXVxeYGFgZWRdXl1dZWFiZmReX2RjYFxnZGhlZGJfZGFfYWBiYl9gXldYXlpcXFpZWldWXVpdXltaW1xbV1lcXVZYV11TT1BXWVFdVVZZV1dVWF9gYWFgY11gVV1eYmVldYF6aFhZWlRWU1ZcWFdXVlZXXVhQVVxZXl1dVFNYUlhWU1JUWFJTVlRYWFhdXlhdW1VeX1hfX1hcVlJZVVlaWmFZXFVXV1paWlhZWlpYVl1eX15jYmJlZV1iXGBmYmVmZF9gZGJiW2ZjaGVjZmFmX19hYWFhYF9eVlVdWltcW1lcWVldW1tbWFhZW1laWl1fXVRZXVVOVFpWVFxUVldZV1ZcYGFiY2FkX19WW2BkYV96dW9oWlxaVlhVV1taWVtaWFlgV1BVXltgYVxUVVhQVVZVU1ZWUlNVV1paXF9eWl9cVl9fWl1eWV5WU1lYWVpdYlpeVldaW1tbWltZW1lZXl9gYGRjZGVlYmRaYmZjZ2ZlXmFjYGNeY2NpZGRnX2deYmJjYWFgXl9YVFpaWltbWFtYWFxbWltXV1pYV1xbXGBdVl1dU1BWWldWWlVYVVhXWF1fYmFkYWRhXllZYWRiYGxmaF5cXVtXWFhZXFxcX1tZW2JWVFdeXWFjXFNWWFBWVlZWVlZTVlRYXFxfYGBdYV1XYF5bXlxbXlhWWFhbW19gXF9YWF1cXV1eXFpcWFtfYV5gZGNkZmZmYlljZWVoZ2ReY2FgZWNdZmlkZWhfZ15jYmNhYWBfX1tYWVtZWlpYWVhXW1taW1dYWlRZXVxaYFxVXmJNUldZVldaWVtcWVdZXmBiYWVhZGFdXlliY2JfYWBhX1xcXVhXW1tdXV9fXFpdY1hZWF1gY2RfUlhZUFhXWFhYV1ZXVl1dXmBhYV9iXllhXV1eWV1eWVhWV1tcYF9dX1lZXl1eXmFdW1pZXF9iX2JkZGVmZ2diWmRmZ2lnY19jXmFmZFpoaWNmaWNlXmJiY2FgYF9dXVpXW1lZWFhaWVdaW1pZV1hWVVtdXV1gYGJieEtXV1xZV11cXF1aV1xdX2BiZGJiYV1gWGNkYmBjYWNeXFxcWFdbXV9dYF9dW2BkXFxYWmNlY2FSXFlPWFdZW1pZV1paYF1gYmJgYWNfXGJdX11bX15ZWVVYXV1fYF9fW1peXmBiY1xbV1tdYGJiY2VkZ2ZlZ2RcZWZoaWZjYWJcY2dgXGlpYmhpZmVgYmFjYV9gX11dXFlcWVhXWFlZV1xbWldXWFBYWl1hY2Zmcmt/SllXXVpaX11cXlxZXVxeX2FjYmFhXWJbYmRhX2NiYl1cW1pXWGpxYFxgX11cYWNfXllZY2VkYVRfWlFZV1xdXFtaW1tjYGNiY2BiZGFgY15gXF5fX1pYVltfXVxhYV9dW2BhYmViX11TXF9gY2RkZmVnZmVmZV5lZmhoZ2RkYFtmZ15haGhiaGhmY2BiYGNiX19fXV1bWltZWFhYVlpWXFpaVlZVTFhXXGdpa2h1eIF2dnZ2dnZ2dnZ2dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6e3p6ent7e3t7e3t7e3t7e3t7e3x7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHt7e3t8fHx8fHx8fHx8e3t7fHx8fHx7e3t7e3t7fYmIhoqHhYKBgoOCg4OCgoKCgoKCgoKCgoGAgYCBgICAgYCBgYGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t6e3t7e3t7fHx8fHx8fHx8fHx7e3t7e3t7e3t7e3x7e3t7e3t7fHx8fHt7e3t7e3t8iYmHiYaFgoGCgoGCgoKCgYKCgoKCgoKBgYGAgICAgICAgIGBgYB9fHx8e3x8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eHh5eXl5eXl5eXl5eXt7e3t7e3t7e3t7enp6e3x8fHx7fHt6enp6ent7fHx8fHx8fHx8fHx7e3t7e3t7fHx8e3t7e3t7e3t7fHx8fHx7fHt7e3uHiYiJhYSDgYKCgoODgoKCgoKCgoKCgYGBgICAgICAgICAgYKBgH58fHx8fHx8fHx8fHx8fHx2dnZ2dnZ2d3d2d3d3d3d3d3d3d3d3d3h4eHh4eHh4eHh4eHh4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t7enp7fX19fXx9fHp6enp6e3t8fHx8fHx8fHx8fHx8fHx8e3x8fHx8e3t7e3t7e3x8fHx8fHt7e3t7e4aJiYiFhYOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgIGBgYCAfnx8fHx8fHx8fHx9fX18fHVwb29vb3Bwen59fX19fYSMi4uLi454KSkqKiopKz0/Pj4+Pj5tgH5+f397pdfT09PT1r2GiYmJiYiNsbW0tLS0uFEmKysrKiKL29LS0tLWun1+f39/f359fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx8fHx8fHt7e3t7hIuHh4aHgoGDg4GCgoKCgoKCgoKCgoGBgYCAgICAgICAgYCBgIB+fHx8fHx8fHx9fXx8fH19dXBub29vb296gH9/f39+hpCPj4+Pk3kZGhoaGhocMTMzMzMzMmqCf4CAgHut6eTk5OToyomMjIyMi5G7wL/AwL/ESRQbGxsbEI7v5eXl5enHfX5/f39/f319fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e3uCjYeIh4eDgoSDgYKCgoKCgoOCgoKCgYGBgICAgICAgICAgICAgH58fHx8fHx8fXx8fH19fX12dXV1dXV1dXZ3d3d3d3d4eXl5eXl6eG9wcHBwcHBycnJycnJyd3p5eXp6en6Dg4ODg4SBfHx8fHx8fYCBgYGBgIF3c3Nzc3NzfYWEhISEhYJ8fX19fX19fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e4CMhomHh4SDhIKCgoKCgYKCg4KCgoGBgYGBgYCAf4CAgICAgICAfnx8fHx8fHx8fX19fX19fXZ2dnZ2dnl2dnZ6e3h7eHd2eHt4enl5fXp5eXh4eHh5eXl5enp5eXl5enp6eXh4eXl5eXl7e3t7e3t7enp6enp5enx9fX19fX17enp6enp6e3x8fHx9fX19fX19fX18fH19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8f4uHi4qIhIODgoKCg4KBgoKDgoKCgYGBgYGAgIGAf4CAgH+AgYF+fX18fHx8fHx9fX19fX19d3d3dnZ3fXh3d316eH14d3d5fHp7fXp8e3h3d3d3eHh4eHh5eXl5eXp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fHx8fHx8fHx7e3x8fHx8fHx8fHx+iomMjImFg4SEgoKDgoGCgoKCgoKBgYGBgYCAgICAgICAf4CAgH19fXx8fH19fX19fX19fX13d3d3d3p9eHt4fHx3e3h3d3d8e3p9eXx6eHh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fX19fXx9fX19fX19fX19fX19fHx8fHx8fHt7fHx8fHx8fHx8fH2Kio2NioWDg4OCgoKCgYGCgoKBgoGBgYKBgIGBgICAgIB/gIGAfXx9fX18fX19fX19fX19fXd3d3d3fX55d3d4e3p8eXd3d3p7eXx6e3p3eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt8fHx8fHx8fHx8fHx8fH19fX18fH18fH18fHx8fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8foqJjo2JhISEg4KDgoKBgYKBgoKCgYGBgoGAgYKAgICAgH+BgIB8fH19fX18fX19fX19fn5+d3d3d3d5fHl7eHx9eXt5enp6fXx8fXt9e3h4eHh4eHh4eXl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt7fHx7fHx8fHx8fHx8fXx8fX19fX19fXx8fHx8fHx8fXx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx/iIeNioeFhoaDg4ODgoGBgoGCgoGBgYGCgYCAgoF/gICAf4CAgHx8fX19fX19fX19fX5+fn53d3d3d3Z4eHl3eXp4enh5eXl7eHt6eXt4eHh5eXh4eHh5eXl5enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX18fH18fH19fX19fH19fX19fHx8fHx8fHx8fHx8fX+HiIyIhoeHhIKDhISCgYKBgYKCgoGBgYKBgIGBgYGAgIB/gIGAfHx9fX19fX19fX1+fn5+fnd3d3d3d3d3d3d3eHh4eHh4eHh4eHl5eHl5eXl5eXl5eXl6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fHx8fX19fHx8gIeIi4eHiYaDg4SDg4KBgYGCgoGBgYKCgYGBgIGBgYCAgICBgX97fH19fX19fX19fn5+fn5+d3d3d3d3d3d4eHd4dnl5eHh4eHh5eXl5eXl5eXl5eXl5enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fH19fXx9fXyBhoqKiYmIhIOFhISCgoGBgYGCgYGCgoGBgYCAgYGAgIGAgIGBf3x8fX19fX1+fn5+fn5+f394eHd4eHh4eHZxZGpeam15eXl4eHl5eXl5eXl5enp6enp6enp6enp7e3t8e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIGFiYqJioeEhYWEg4KCgYGBgoKBgYKBgYGBgYCBgYCAgYCBgIF+fH1+fn5+fn5+fn5+fn9/f3h4eHh4eHh5bWRiZV9fXm95eXl5eXl5eXl5eXp6enp6enp6enp6e3t7e3t7fHx8fHx8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goWKiomJhISGhYSDg4KBgYKCgoGBgoGBgYKBgIGBgICAgICBgH58fX5+fn5+fn5+fn9/f39/eHh4eHh4eW5kZWdlZGJeZnh5eXl5enp6enp6enp6enp6enp6e3t7e3t7e3x8fHx8fHt8fHt7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChouJiIqEhYaEg4OEgoGBgYGCgYKCgYGBgYCAgYGBgIB/gIGBf3x8fn5+fn5+fn9/f39/f394eHh4eHl3Z2VkZWZkZWFfaXl6enp6enp6enp6enp6ent7e3t7e3t7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHt8fHx8fHx8fHx9fX19fX19fX19fX19fXx9fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4eJh4SEhoSDg4WBgYGBgYKCgYGBgYKBgICAgYGAgYCAgYF+fHx/f35/f39/f39/f39/gHl5eXl5eWtlYWJlZWFlZV5ieHdze3p6enp6enp6enp6e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fH18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19g4aLhoiFhYaEgoOEhIKBgYGBgoKBgYKBgYGAgYGBgYGAgIGBgn98fH9/f39/f39/f3+AgICAeXl5eXl0Y2NlZGNmY2doZGZsZF5ze3p6enp6enp6enp6ent7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn6DhouGhoaGhYODg4SDgYGBgYGCgoGBgYKBgYCAgYGBgYCAgYGBfnx8f39/f39/gICAgICAgIB5eXl6d2RhY2diYmRdW2VfYV1eYGFoeHp6enp6enp6enp6e3t7e3t7fHx8e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+foSFi4eGhoaGhIODg4KBgYGBgoKCgYKBgoGAgIGBgYGAgYGBgYF+fX1/gH+AgICAgICAgICAgHl5eW9vYmJiZF5jZ19dYWFgXF9kYlttfHp6enp6enp6enp7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7fHx7e3x7fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5/hIiLhoSHhoaEhIODgoGBgYGCgYGBgYKCgYCAgYGBgYGBgYGBgX5+fYCAgICAgICAgICAgICBeXpwXWJlZGJkXmZnZ2BZYmJhY2VfXF1ze3t6enp7e3t7e3t8fHx8fHx8fHt7e3t7e3t7e3t7e3t7fHx8fHx8e3x8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fn19fn5+fn5+fn5+fn5+foCFjIqEhYaGhYODg4SCgYGBgYKBgYGBgoKCgYCBgYGCgICAgIGBf35+gICAgICAgICAgIGBgYF5emxiZGdjYmdmYWBgZGFiZWRjZGNeXGJ1fHt7e3t7e3t7e3x8fHx7e3x8fHx7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/gYeMiYWGhoeFg4SDgoGBgYGBgYKBgoKCg4KBgIGBgYKBgYGCgoF/f36AgICAgICAgIGBgYGBgXp7dGdnZmZkZGZmYF5fYWNlaGRlXmJkYHR8e3t7e3t7fHx8fHx8fHx8fHt7fHt8fHt7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f3+CiYqIhoaIhoWDhIOCgYGBgYGBgoGBgoKCgoGAgYGBgoKBgYKCgX9/f4GBgYGAgYGBgYGBgYGBenptaGNjZ2ZnZWdmZmdiZWRlYmdbYmVgdnx8e3t8fHx8fHx8fHx8e3t8fHx8e3x8fHt7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f39/f4SJioiGiYeFhYSEg4KBgYGBgYGCgYKCgYGBgYGBgYKBgoGBgICBgH9/gYGBgYGBgYGBgYGBgYF7emlpZGNqZmFgZmVjY2NnaWRjYmBiZGJ0fXx8fHx8fHt8fHx8fHx8e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f39+fn9/f39/f39/f3+AhIqMiIeJhoSFhYOCgYGBgYGBgYKBgoGBgYGBgYGBgoKBgYGBgYGAgH+BgYGBgYGBgYGBgYGBgXZzZWRnY2RmZWJlZmdkZmhmZWNgYGNkYHF9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fXx8fHx8fHx9fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/fn5+f35+f39/f39/f3+AgICFioyJiIqJhoaDgoKCgYGBgYGBgoGBgoGBgYGBgIGBgYGBgYGCgX+Af35/foCCgoKCgoKCgoKCc3NnZWRkZWlqaGZnZ2NhZmZlZmdmZWVjdX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fH19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gICAgICAgIWLioqJioeHhoSCgoGBgYGBgYKCgYKBgYGBgIGBgoKBgYGBgYGAf4B+dHRzdX1/goCAfn5/gYB0cmdkZWNmaWppZWNlY2BmZGRnZ2JiZWFwfXx8fHx8fHx8fHx8fHx8fHx9fX18fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f39/f39/f4CAgICAgIB/houLiouLh4eHhIOCgYGBgYGBgYKBgoKBgYGBgYKCgYCBgYGBgoCAgH5zc3NzdHV4dXV0dHV2dXVwZmNmZWhoaWdoZ2VmZWJfZGVmY2BiZ3d8fHx8fX19fX18fHx8fH19fX19fX19fXx9fXx8fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gIB/f3+AgICAgICAgICHjIyIi4qHh4eEhIKBgYGBgYGBgoGCgoGBgICBgoGBgYKBgoKCgYCAfnNzc3Nzc3NzdHR0dHNzdW9jY2FnZWhoZ2pmZGVnZmhmY2JlYl5ieX18e3t8fX19fX18fHx9fX19fX19e3x9fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn9/fn5+fn5+fn5/f39/f4CAgH9/gICBgICAgICAgYCAf4CAgYGAgIeLi4iNiYiJhoSFgYGBgYGBgYKCgYKCgYGBgIGCgoGBgYKBgoKBgIB+dHNzc3Nzc3Nzc3Nzc3N1cmdlZWRlamhoZ2ZpaGdjZWViZGNoZGd7eHVzc3R2dnl4dnR0dHZ3d3d2dHR0dXV4d3h4d3d6e3x9fXx9fn5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f35/f39/gH9+fHt7fX58eXl2dnZ5fHx6end2d3l7fXt4hIyMioyHh4iEhYSBgYGBgYGBgoGBgoGBgYGAgYKCgYGBgoGBgoGAgH51c3Nzc3Nzc3Nzc3Nzc3VzaGVnaGVrbGhqZ2lqZ2dnZmRkYmVkbnV0dHNzdHNzc3Nzc3Nzc3Nzc3NzdHNzc3Nzc3Nzc3N0dHV1c3V3eHl7fn59fn98f39/f39/f39/f314fH5+fXx4dXZ3eXd4dnRzc3N0dXRzc3Nzc3NzdHNzc3R0c3R0dHODjI2KiYeIhoOGg4GBgYGBgYGBgYGCgYGAgYGDgoKBgYCBgYGBgICAf3VzdHRzc3Nzc3Nyc3NzdnZpY2hqaGpsZWZpbGhgZmVkY2BkZGZ0dXV1dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHRzdHRzc3Nzc3R2dnV1d3V4fH9+fX9+fHp4dXN0dXV1dHNzc3Nzc3N0dHR0dHR0dHR1dXR0dHV1dHR1dXR1dXV1dIaMjYuIhoeEhIWCgYGBgYGBgYGCgoGAgYCBgYKCgoGBgIGBgYGAgIB/dnNzc3Nzc3Nzc3Nzc3N2dnNnZ2pmaGdmaGhmZGlnY2NnZWVmcHZ1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dHR1dHR0dHR0dHRzdHR0dnV1d3Z0c3R0dHR0dHR0dXV1dXV0dXV1dXV1dXV0dHNzc3N0dHNzdHR0dHR1dXR1iY6MjIqHh4SEhYKBgYGBgYGBgYKCgoGBgICAgoKCgoGBgYGBgYCAgH93c3Nzc3NycnJyc3NzcnZ2dW5kXWNnZWlraGVoZ2dqamlnZXB2dXV1dXV0dHRzdHR0dHR0dHV1dXV1dXV0dHV1dHR1dXV1dXV1dXV1dXR0dHV1dXV1dXV0dHV0dHV1dXV1dXV1dXV1dXV1dXV1dXV0dHNzc3Nzc3N0dHNzc3Nzc3R0dHR0dHWKjoyMiYaGhIeFgoGBgYGBgYGBgoKBgYGAgYGCgYKBgYGBgYKBgYCAf3hzc3Nzc3JycnJyc3NzdnZ3d2liaGhnamtpaGZkZGVmaWhwdXR0dHRzc3JxcnJ0dXV0dHR0dHR0c3NycXFxcXNzdHR0dHR0dHR0dHV0cnJyc3R0dHR0dXV1dXV1dXR0dXR0dHR0dHR0dHR0dHR0c3Nzc3Nzc3Nzc3Nzc3N0dHN0dHR0dHR0dYuOjImGhYWFh4SCgYGBgYGBgYGBgoKCgYGAgIKCgoGBgYGBgYGBgIB/eXNzc3NycXJycnJzc3N3d3d3bGpoZGhpa3Z6a2VmZWhnbXJzdHN0c3JwcHBxcnN0dXR0c3NycnNycXBvb29vcHFzc3NycnJyc3R0dHNxcHFyc3R0dHR0dHRzc3Rzc3NzdHR0dHRzdHR0dHR0dHRzdHR0c3NycnFxcnJzc3Nyc3NzdHR0dHN2jZCMh4eFhYSEgoGCgoGBgYGBgYGCgoKBgYGAgYGCgoGBgoKBgYGAf395c3NycnFxcnJycnNzc3d3d3dzc2pnaWloeX99cW51bG5wcXJycnFxcG9wcXFxc3Rzc3NycXFwcG5ubm1ubW5ubnBxcnJycnJycnJzcXBvb3BxcnJzc3JxcnJycnJycnJycnJzc3Jzc3Nzc3Nzc3Nzc3Jxb29ubm9vcXJzc3Jyc3NycnNzcnaPj4uHhoWFhYOCgoKBgYGBgYGBgYGBgoGBgYGCgoKBgoGCgYGCgX9/f3hxcHBwcXFycnJyc3Nzd3d2dnd2cnF0c252f352c3hwcHBycnJycXFwcHFxcXFyc3Nzc3FwcXBvb25ubm5ub25vcHBxcXFxcXBwcXJwb25vcHFxcXFxcHBxcXFxcXJycnJycnJycnFxcnFxcnJycnFwb29ubm1ubW5vcXJycnJycnJyc3JxeI+OjYaDg4aEgoOCgoGCgYGBgYKBgYGCgYGBgYKCgoKCgoKBgYKBf4B/d29wb3BxcnJyc3Nzc3J2dnZ2dnZ3dnZ1c3l/fnd3d29wcXFxcXFxcHBwcXJxcnJzc3JycXBwb29wb29vb29vb29wb3Bvb29vcHBxb29vcHBwcHBvcG9wcHFycXFxcnJycnFxcXFxcXFxcHBwcHBxb29ubm5tbW5tbm9wcXFxcXFxcXFxcXB7j42NhoODhYOCgoKCgYKBgYGBgoGCgYGCgoGCg4KBg4KBgYGAgYF/f392bm9wcHBxcXFxcXBwcHZ2dnZ2dXR0c3NxfYB9fX9zb3BxcXFwcHBwcXFwcHBxcnJxcXFwb3Bvb3Bwb29wcG9vb29vb29vb3BxcXBub3Bwb29wb29wcnJycnFxcXBxcnFwcXFxcHBwcHBwcHBwb29ubm1ubm5ubm9ub3BwcHFxcXFxcXFxcIKRjoqEhIOFhIOCgoGBgoKBgYKBgYGBgYGCgoKCgoKCgYGBgYCBgX9/gHVvb29wcXFxcXBwcHBwdnZ2dXRzcnJycnGAgoCBeXBwcHBvcHBwcHFxcXFwcXFxcXFxcG9vcHBwcHBwb3BxcHBvb29wb29vcXFwcG9wcG9vb25vcHFxcHBwb3Bvb3BwcHBwcHBwcHBvb29vb29vbm5tbW1ubm5ub25vb3BvcHBwcHBwcHBwiZCMiISDhIaDg4KCgYGCgoKCgYGBgYCAgYGBgoKBgYGBgYGBgIGBgH+AdG5vb3BxcXFwcG9vcG92dnVzcnFxcXFxcICDg39ycHBwcHBwcHBwcHFxcHBxcXFxcXBwcHBwcHBwcHFwcHBwcHBwcHBvcHBxcXBwcHFxb29vbm9wcHBvb29vcHBvb3BwcHBwcHBwcHBvb29vbm5ubm5ubW5ubm1ubm9wcG9vb29vb3BzcXWPj4yJg4KFh4ODgoKBgoGCgoKBgYKBgYGBgYGBgYGBgYCAgYGAgYGAf4B0b29vbm9vb29vb29vb3Z1dHNxcXFxcXJygIKCgXRxcXFxcXFxcXFxcXFxcXFxcXBxcXFxcHFwcXBxcXFwcHBwcHFxcXBxcHBwcXBwcHBwcHBwcHBwcHBwcHFxcXBxcHBwcHFwcHFxcHFxcXFxcXJxcnFwcnRycnR0dHR1dnRzdHR0dXd3gpCPi4iDgoaHhISCg4GBgYKCgoGBgoGBgYKBgYGBgYGAgICBgYCBgYB/gHVvb29vb29vb25vb29vdXRzcnJycnJycnKDg4OCdnFycnFxcXJxcnJxcXJycnFxcXFxcnFxcXJycXFycXFxcXFxcXFxcXFwcXFxcXFxcnNzcnJyc3V1dHR0dHR0dHV2d3d3d3d3eHh4eHd3eHh4d3Z3dnV2dnZ2d3h6e3x7e3t6enp6enyGkI2LiIODiIeHhYODgoGCgYKBgYGBgYKCgoGBgYGAgYCAgYGAgIGBgH+Ad3FxcXFxcG5ucG9wcG92dHV1c3Nzc3NzdYiDgoN5cnNzcnJyc3Jyc3NycnJycnN0cnJzcnNzc3Nzc3Nyc3N0dHV1dXV1dHV3eHd3d3d4eHh3eHh4eXl5eXl4eHl5eXp6e3t7e3t6enp5eXh3d3d1dnV2dnd5enp7fn5+fX1+fn5/f35+gIyQi4qHg4WIi4iEg4SDgYGCgYGBgoGBgoKCgoKAgYGBgYCBgYGAgIGAf4B8enp5eXx5eHh2dXZ2dHl2d3h3d3Z3dnZ6f3x+fnx2dnd3dnV4enh4eHh3d3d2eHx5eXx6eXl8e3l5eXh4eXl6enl5eXh4enp5eXh4eHh3dnd3eHh3eHh5eXp7e3p8fH1+fX9/f359e3t7e3p5enl5e3t/foB/fn5/fn19fX5+f35+fn6AjpCNioeEhoqLiIaGhIOBgoKBgYGCgYGCgoKCgoCBgoKBgYGCgYCBgIF/f4B/fn19fX9/f318e3t7eXh4eHh5eXl4eXh5eXl4enp6enp6e3t7fH1+fHt7ent8e318e3t7e3t7enl4eXh4ent6enp5eXp8fHt6enx8fHp6ent9fHx+fn+AgoGAgYKAgH9/gYGBgIB/f35+fn5/fX1+f4CAf35+f39+fn9/f39/gH+Af4OQjoyHhoWIi4yIh4aFg4GCgYGBgYKBgoKCgoKBgYKDgoGBgYGBgIGBgIB/goOCgoGBgX99f39/f4F6enh4d3h4eHh5eHh5enp5e358enx9fXt8fX19fHx8fnx9fn5+fn59fX9/f3x8fYGDgYCAf318fXx9fXt9fXx8fH19fX1+gYGChISDgoB/gYGBgH9/f4B/f39/f39+fn9/f39/f35+f3+Af39/gICAf4CAgICAhJCPi4eGhoiLi4mKhYaDgoKCgYGBgoGCgYKBgYGBgoOCgYCAgYGAgIGBgH+ChIKCgICAgH9+fn+AgH9/fn18fX19fYB/fX+Af35/gH9/fn9/gIGBgICAf3+BgICAf4CBgn9/f4CAf35+f39+f39/fn5+f39/gYB/f4CBgYCAgYOEgoGCgoGCgH+AgYCBgYGAgH+BgICAf39/gICAgYGBgIGBgYCAgICBgoGBgYCAgYGFjo6MiYaHiYyLi4qGhoOCgoKBgYGCgoOCgoKBgIGBgYKCgICBgYCAgYGAf4KFg4KBgYCAf39+fn+AfX5+fn19fX5/fn9/f35+fn+AgYCAgICAfn9/fn+Af3+AgH9/f35/f39+fn59fn9+fn9/f35/gIGBgoKDg4KCg4KBgYKDg4OCgYGBgYKBgoKCgYKBgoGBgYGBgoKCgYGCgYKCgoGBgoKBgYKCgoKCgYGBgoKCgoaPkY+KiImKjY6NiYaFgoKCgoKBgYKCg4KCgoGBgYGBgYF/gIGBgYCBgIF/gYWEg4KCgoGCgYCAgIB8fHx7fH18fH9+fn9+fn5+f35+f39/f39/f35+foB+fn5+fn9/f39+f39+fn5/gIB/gIB/f39/f3+BgYGCgoCAgYKDg4SDg4ODgoKCgoKCgoKCgoKCgoGCgoKDg4OCg4ODgoKCgYKCgoODg4ODgoKCgoODg4KCh5KTkIuKi4uPj42Kh4SCgoKCgYGBgoKDgoKBgYGBgIGBgICAgYGBgIGAgYCAg4SDg4OEg4ODgoKCgXx9fHx9gn1+f4GCiIGCgoSCgYGDg4GBgYKDgYKBgYCAf39/gICAf3+AgX9/f39/gYCAgICAgH9/f3+AgICAgH9/gYODhYSEg4SDgoKCg4OCgoOCgoODg4ODg4SDg4KEhYWDg4SEgoKDhIOCg4ODg4OCgoODgoCKlJOPioqMjpCPjYuGg4KCgoKBgYGBgoOCgYGBgIGBgoGBgICBgYGAgYCAgH+BgoODg4SEhIOCgoKCfXx8fn6AgYOAg4OChIaFhoaFhIWFg4ODg4SBgYKEhIKDgoeDgoKAgoGBgoKCg4KCg4KDgoODgoGAgIKCgYOCgYKCg4OEhYWEg4OChISEhIOEhISDg4OEg4ODg4OEg4SDhIWEhISDg4ODgoKCgoKCgoKBgYKCgo+UlI+Njo6RkY6KiISCgoKCgYGBgYGCg4GBgIGBgYGBgYCBgIGBgYCBgICAgIKChIKChIOCg4ODgoJ9fX2AgH+AgoGDg4ODhIaEhIOEhYWDg4GBg4OBgIKDgYKFhYWFhoaHhoWGhoeHh4aGhoeHhoaEgoGCg4SDg4ODg4ODhISFhYWDhYSFhISEg4KBg4OCg4SEg4KCg4SCg4ODg4OCgoKCgoKCg4OEhIOFhYWFhoaIk5OTkI+Pj5KRjIqIgoKCgoKBgYGBgYKDgoKBgIGBgYGBgICAgYGBgICAgICAhISEgoKCgoGBgoKBgX+AgYOCgICAf4CCgoGDg4KCgYODg4SDg4KDhISCgYGBgoSFh4eHh4aGh4eHiIiHh4eIiIiFhIOBgIGBgoKCg4GCg4SEhYSDg4OEg4OEhIOBgYGCg4OEhISDg4ODg4OEhIODgoSDg4ODhIWFhoeHh4eIiIiJiY6TkpKOj46Qko+LiYeCgoKCgoKBgYGBgoKCgoGBgIGBgYGAgICAgYGAgIGAgICDg4KCgYKCgYGAf4CBhYWFhoOCgYB+fn+BgoSCgYKDhIOCg4ODg4KChYSDg4OBg4SFhISFhYSDgoSFhYKEhIWFg4KBgH9/gIB/gIGEg4OEhYWEgoKCgoOCg4OFhIKDhISEhYaGhoaGhoWFhoeHhYaIh4aHiIeGhoaIiYeGhYaGhoeIkZKSkI6QjpCRjImHhYGBgoKCgoGBgYGBgoOBgYGBgYGBgICAgICBgYCAgICAgISEg4KBgoGAgYGAgYKIh4aHhYSCgH99fX6AgH+AgYGBgYGBgoGAgI2MgYGCgoKBgYGCgYKCg4GBgICAf4GAgH+AgH9+gIGBgYKCg4OEg4OEg4OCgoGBgoODg4SEg4SEhIOFhYaFh4eIh4eHh4eHh4eGhoaGh4WFhYaGhIWEhIWEhYaSk5GOjo+OkI6JiIeEgoKCgoKCgoGBgIGCgoKCgoKCgYGBgYGAgYGBgICAgYGAgoSDg4KDgoGCgYKDg4iHh4iHhYSCgX5+gICAfn5/f4CBgoGCgYCDlpaDgH+AgIB+gIKBgIGCg4OAf39/gICAf4CAgICCg4KDg4ODgoOBgYKCgoOCgYKCgoOCgoSDhISDg4SEhYWFhYaGhoaFhISEhYWEhIWFhYSEhISDhISEhISEipSTkpCQj46NiIaFhIOBgYKCgoKCgYGAgYKCgoKBgoKBgYCBgYCBgYGAgICAgYGAgoOCgoOCgoKBgoOCiImJiYiHhYSDgYKEhIOBgoGChISCf319fIeamIaEgoSCgX+AgoGCgoGChIKBgYGBgoOCgoGDg4SDg4SEg4OCg4KDg4ODg4KCgoKCgoGDhISEhYSFhYWFhIWEhIWFhYWDg4OEhISEhYWFhISEhISEg4ODg4OOlZKQkZGOjYyHhYODg4GBgoKCgoKBgYCBgoOCgYCCgYGBgICAgIGBgYCAgICBgICDhYSEhIODg4SDhIOGh4mIhoWDhIODhIWDgYGDg4uIhX58fH1+f5mahoSFhISEgoGAgYKDgoKEhIOCgoGBhIWEg4ODgoKDhISDg4ODg4WFhISDg4KCgoKCgoSEhYSFhYWFhYODhYWFhYaFhoWEhIWEhYWGhYWFhIWEhISDhIODhJGUk5KSj4yMioWEg4ODgYKCg4KCgoKBgYGCg4KBgYKBgYGBgICBgIGBgH+AgIGAgYaGhoaGhoaHh4aGhYSDhYaCgIGBgYGHgoB+f4CGmpGGfIJ/gop+kJqDgYKBgYKCgYCCgoKCgYKDg4KBgYKDhYODg4ODg4OEgoKEhIOEhIWEg4OCgoKCgYKCg4ODg4SFhYWFhIOEhYWGhYWEhISEhIOEhIWFhIWFhIODhIOEg4KGlJSSlJKPjYuHhISDg4KBgoODgoKDg4GBgoKBgoKCgYGCgYGBgYCAgYGAgICAgICAhYWFhYaGh4aGhoWGg4ODg4GAgoKCgYKAf35/foWdnoWDi4CAhYCBiYGBg4GBgYGChIOBgYKBgYKBgYKDgoODgoOCgoKCg4OBg4SDg4ODg4OEhIKCgoKDgoKDg4ODhIWEhISEg4OEhIODg4OEhIODg4ODg4SDg4ODg4KDg4KDgouUk5KTkY2NioaDg4OEgoGCg4ODg4ODgoGBgoGCgoKCgoKBgYGBgICBgYCAf4CAgICDhISFhYSFhYWEhIWCg4KDgoKDg4OBgICAgICAgpmhh4SFiId/f36BhIOEgoODg4KAgICCgoKCgoKDg4ODgoODhIKCgoODgoKDg4KCg4KDg4WEg4ODg4SDg4SEhISEhYWEhIWEg4SEg4OEhISEhISEg4SEhYSDg4SEhIODgoKDkJSSkpKPi4yIhoSFg4OBgYKDg4ODg4OCgYGCgoKCgoKDgoCBgoGAgICAgIB/gICAgISDhYWEhYWFhYSFhYOEhIWDg4SEhIKCgoOCgoSCkJyDgICBgX5+fX2EhYWEhYJ/fX19f4KEg4ODg4OEg4ODhISEg4OEhISEg4SEhIOEg4OFhoWFhYSFhYWFhYSFhoWGhoWFhYWFhYWFhYWGhoWGhoaFhoaGh4aFhYWFg4SEhIeTk5KRkoyKiIWFhYWCgoGBgoODg4OCg4KBgYKDg4ODgoKBgIGAgICAgICAgH+AgICAhYWFhYWGh4eGhYWFhISFhYSEhISEg4ODg4OEhYOGi4GAf4OLgX19fIOHhoOAfn9+fn9/f4OEg4OEhISEhISEhISEhISFhYWEhYSGhYWGhYaGhoWGhYWHhYWGhYaGhoaFhIWFhYWFhIWGhoaHhoaGhoaHh4iIiIaFhYaEhYWGjZSTkpGQi4qHhoeGhIGCgYKDg4ODg4KDgoGBgoODg4KAgYGBgICAgICAgICAf4CAgICHh4eGhoeHiIeHhoaEg4ODhIODg4OEg4ODg4OEhIODgn9/hYeEgX9+gYWBf39/f39/f35/gISFhIWGhoaFhYWFhoaHhoaFhoWFhoeHh4iHh4eGhoaHh4eGhoaGhoaGhYSDhIWFhYSFhYaGhoeHhoaGhoeHh4eIiIeGhoaHh4eRk5KQkZCLiIiFhoSDgoKBgoODg4ODgoKDgoKCgoOCgYCBgICBgICAgIGAgIB/gICAf4aHiIeHh4eIiYmIiIODgoKDgoSEhIWEg4KCg4SEhIOAf4KFgoKEgoGAgH9/f39/gIB/f4B/f4WFhoeIiIeHh4eIh4iHiIiIhoaHiIiJiYmIh4aHh4eJiIaHhoeHhoaFhIOEhYaFhYWFhoaGh4eFhoeGh4aGh4eHh4eHh4eFh5OTkY+RkIuHhoWGhIKCgYGCg4ODg4ODgoKCgoGCg4KCgIGBgYCAgICAgICAf3+AgYB/hoiIiIiHh4iJiYmIg4KCg4ODhIWHh4aFg4OFhISDgX+AhISDgYGBgYKCgYGBgYB/gH9/fnt6gIaIiIqKiYmIiImJiYmKi4qIiIiJiYuLioqIiIeIiIiHh4iIh4iGh4aEg4OFh4eHhoWFhISDhYWEhYWGhISEhYWFhoWGhYOJlJOQj5GOioaFhoWDgYGBgoKDg4ODgoKCgoKCgoKCgYGBgYGBgYCAgICAgIB/gICBgH+GiYiIiYeIiImJiIiEgoKDg4KDhImKh4aEhIWEg4OCgYOEg4OCgoKCgoKCgH9+fH19fX9+fHt8g4eJi4uKioqIiIqJiImLiomJiImIioqJi4mHhoaGh4WGiIiJiIeGh4SDgoSIiIiIh4WCgoGDg4KDg4SCgoKDgoGEg4SDgY6TkpCPj4uIhYSGhIKBgYGBgoODg4OCgoKCgoKCgoGBgYGBgIGAgICAgICAgH+AgIGAf4WIh4eHhoeIiIiHh4SCg4OCgoOFiYqJh4WHhYSFhIGChIODg4OCgoKDgX59fX5+fn5+fX1+fX19g4eJioqHh4WGh4eHh4iHh4mGiIaIh4aJiIODhIOFhISFhYaIh4aFg4KCg4WHhoeGhoOCgoOEgoODhIKBgoGBgYODhIOEkZKRjo+Oi4eEhoaEgoGAgYGDg4ODg4KCgoKCgoKCgYGBgIGBgYCAgIB/gIGAf39/gIB/hYaGhYaGhoeHiIeGgYKEhIOChYeIi4qGhIaEgoaFgIKEg4ODg4OCgoF9fH1/gH9+fn59fH19fHp8hIaHhoSDgYODhIWFhYODhYSEhISEhIWEgoKDgYSEgYKDg4WGhYSCgYGCgoODhYOEhIWEhIaDhISFg4KDgYKDg4SFhIeSkY+Nj4yJhoSFhIWCgYCBgYODg4ODgoKCgoKCgoKBgYGBgYGAgICAf4CAgYB/gICAgICDhIWEhYWFh4eHh4aAgYGFg4OEhYSHiIWCgIB/goCAgoODg4ODgoJ/fX1/gICBf31+fn19fX16enp+g4SEgoGBgIGBgoKBf36BgYGCgYOAgoGCgoKBg4SAf4CAgYOCgICAgICBgYGCgYGChIODhYSCg4SDgoKBgoSDhYWGi5ORjo+Pi4iFhYOChIGBgYGBgoODg4KCgoKCgoKCgoGBgYCBgYCBgH9/gIGBgICAgH+AgIKCg4OChIOEhYWGhn+BfoCBgICAgIGDgn9+fn5+fYCCg4OCg4KDgn19fn6AgIGAfn19fX1+fXx6enp/goKAf39/f35/f4B+fYB/f4CAgX+AgIF/f4CAgX59fX+AgX9/foCAgH+AgICAf4CCgICCgYGCgYGAgYGBgYKEg4aPkpCOj42Kh4eGg4OCgYGBgYGCg4ODgoKCgoKCgoOCgYGCgYGBgICAgH+AgICAgICAf39/gYKDhIGCgoOCg4SFgIB/fH19fn1+foCAf31/fn1+f4KDg4KCgYF/fX1+f4CAgH9+fX19fHt7e3p6eXqAgH5+f39+fnx+f35/gH9+f3+Af4GAf359fn9/fn18fn+Af35+f3+Af39/f4B/f4B+f4CBf4B+f39/gH9/f4B/hZKSj46Pi4uHiYWEg4KCgYGBgYKDg4ODg4OCgoKDg4KAgYKBgYGAgICAf3+AgIB/gIF/f36BgYSEgYKBg4OCg4OBgH98fn5/fX6Af4B/foF/f4CBhIOCgYB/f359fn5/gICAfn19fX17e3x6enl5eXt/fn5/f39+fX5/foCAf35/f4CAgoB/fH5+f35+fXx/f4B/fn9/f4B/f35/foCAf36Af39+fn5/f35+f318fH2Fk5KOjIuKiImIhISEgoKCgYGBgoOCgoODgoODg4ODgYCBgYGBgYCAf39/f4CAgICAgIB/foCBhIOCgYGDhISDhICBgICBgIGAgYKCgoGBgoCBg4ODgYGBgYCAfX19fn5+f359fX19fXx8fHt6eXl5eX2Af4CBgYF/f4B/f4F/gICAgYGCgoB+gH5/fn5+foGAgYF/f39/gIB/f39/gYB+f4CAfn9/fn+Af31+fX17fIaTkYyLioeHioiGhoSDgoGBgYGCg4ODg4OCg4OCgoKBgICBgYGAgH9/f39/gICAgICAgH9+fn+BgYGAgISGh4aHgoSDhYOBg4ODhYSEhISEg4ODhIKCgoKCgX5+fX19fn6AfX19fX19fX19e3p6eXl5eYCCgoKEg4CCg4F/gYCBgYGDgoODgYGCgIGAf4CBg4GEgoCAgYCBgYCAgYCCgn+BgIF/gIB/gICAfn9/fn18ipOQiomIiIiJiIaGhoSCgoGBgoKDg4ODg4KDg4KCgYCAgICBgYGAf39/f4CAgICAgIGBf359fn5/f39+g4aHh4iChYSFg4SFhIWGhYaGhoWGhYGBg4ODgoKAfX19fX19fn59fX19fX19fX18e3l5eXl4fIKDhIWCgYSDgoKDhYaCg4SDgYKCg4OCgoKCgYKFg4iFgoGBgYKCgYGBgYSDgoOCgoKCgYGBgIF/gIGAf36Ok4yHiIaIh4aGhYaGhIKDgoGCgoODg4ODg4OCgYGBgH+AgYCBgYB/gH9/gICAgH+AgYB/fn19fX5+f36Ag4SHiISGhoaFhoaHh4aHh4iHh4eGf32BgIGCgX59fX19fX19fX19fX18fH5+fnx7eXh3eHl5gIODf4ONhIOEhISXl4ODhIF9foGCgoGCgYKBg4aIjIWDgoKBhIKEg4KDhYSEhYOCg4OCg4OCgoKCg4OCgpKQi4iJh4mHhoaEhoWEhISCgYKCg4ODg4ODgoGBgYCAgICBgIGBgH9/fn+AgYCAf4CAgH9/fn1+fn+Bf4CCgYWFhYeGh4eGh4eIhoaHh4eGh4V+fX18fX9+fX19fX19fX19fX19fXx7iJKCe3x6fIZ5eHl8gYF+iZaEg4OEhJSTgIGBf39/fn6Fi4B/gICEhpCJhYSCgoGFhYuDgYKFhYaGhIOFhYOFhIODhIOFhISIko6MiYiIiYeHh4WGhYSFhIKBgoKDg4ODg4OCgYGBgYB/gIGAgICAf39/f4CAgICAgYGBf39/f4CAgIGBgYGBg4OGh4aGh4aGiIeGhoaFhIOFhH59fHx8fX18fH19fX19fX19fX18fH+RlZaDe3qElHx4eXp7fICCg4GBgIOCgH58fn57iJF8fI6Wf31/f4KGioWDg4SDgYONiX9+f4OEhYWDhYaFhIWFg4SFhYaEhI6Rj4yKioyJiImHhYWFg4OCgYGCgoKDhIODgoGBgICBgICAgYGAgIB/f3+AgIB/gICAgX5+f4GBgoKCgoODgoOCgoWGhISFhYSGhIOEg4KBgIKAfn19fHx9fXx8fH18fH18fX19fHx8e4uRl4x6e3yBenp6e3x5eX19foB/gH98e3t+fn2ClZF/hIh+fH5/goR8fIGChIKAf4eDfYKBf4KCgIODhISEhISChIOEhYKEkZGOi4yMjoqJiYWFhYODgoKBgoODgoKDg4KCgYGAgIGAgICAgICAgH+Af3+Af357gICBenyAgYKDhYODhYWFhYODg4SCgYKDgoOCgoGBgIB/gX5+fX59fHx8fHx8fHx8fHx8fHx9fHx8fn6Kgnt6e3p4ent7fH17fn1+f319fX18fH+BgX2Gj4F+fYJ+fn6Agnx8f3+CgIKAfnx7ioJ9gH9+gYCAgYKBgoCBgYGAf4uTj4yLjY6NiIeHhYWEhIOCgoKCg4OCgoODgYGBgICAgICAgH9+fXx7fHx9f3+AgHx6gYF4e4CCgYOFhIOFhYaHhISAhpSIgIKBgYGBgH9/f39/fn5+gHx8fHx8fHx8fHx8fHx9fHx8fHx8fHl7e3t4eHl7enp8gX+Afn+BfH5+f399gIKCgICAgX+CkYF/f4CAfoB+fn9+gIGBfX19e319fXx9fHx9gH+AgH6Afn6ClJGMjI2NjoqFhoaFhISFg4OCgoODg4OCgoGBgYGAgICBgICAf4CAf39/fXt6fICAgHh+gXd7gIF/gYKCgoKEhoeGhn6IlYp+gYGAf4B/foB+f39/fn+Bfnx7e3x8fHx8fHx8fH59fHt9fHx8e3x8fHp6eXt8en2Fg4J/gYF+f35/gH6FgoF+gH9+foCFhoKAfn6Dhn9+fH6AgIGAf39+fX19fX57fH1/f3+AfX9+gIyRjYyNjo2Nh4SGhoWEhISDg4OCg4ODg4KBgYGBgYCAgYGAgYGBgYGAgH9/f397en9/e3mAd3p/f31+f3+Af4KDhoaFf3+FgX5/gIB/gH5+f31/gIB/gIB/f319fHx9fn18fH19fX19fH58fXx7fXx8ent6fH19f4aEgoCAgX1+fX5/fouEgYZ+fXx8f36CgX99fX19gHx7fXx+gYSDgYB+fn5+fX1/f399foB+fn6Eko2MjI+Ni4qGhIWEhIODg4OCgoKDgoOCgYGBgYGBgYGBgYB/fXx8fH1+f39/f397e399d352eH59fH18fX5+gYGCg4B6fX18fn+Af36Af35/fn+AgH+AgH9/fn9+fn5+fn1+fn99fH59fn19fHt8fHx6e3p9fn+Ag4OCf35/fH18fXx8gYN+jH58e3t9fn1+fn17e3t9fHp7e3uAhoSChIOCf4B+f4KCgn9/goJ/gIqPjIyLjYuKiISEhIODg4ODgoKCgoKCgoKBgYGAgoGBgYKCf3+AgIB/fn18fH5/fn55fX52e3Z4fXx8fHt9fX6BgICAf31/f31+f39/foB/f39+f3+AgIGBgH99gH9/fn9+fn5/f3yCfn59fX17e319fHp8fH6AgoGAgIB8fH18fHx8fH18fnt/fnt7e3x8fH18e3t7e3x8enp9en6CfoGDhIKBgoGFhoWFh4aHhoGEkY6Mi4qLh4iFgoOEhISEg4KCgYGCgoKBgoGBgYGBgoGBgoKAgYKBgYCAgH9+e3x+fnx6fnh5dnd8fHx7e318f4GAf35/foB/f35/f35/gH9/f39/f3+AgYKAfn6BgIB/f39/f39+fYN8fH19fH99fX19e3x+fn9+fn5+fnx8fHx8fHt+fnt8e3x8fHx9fH18fnx9fHt7e3x5e3x7e317fX5+f4CAg4eJiYmLiYuJhYiRjYuIiYeFhYOCgoOEhIOCgoKBgYGBgYKBgYGBgYKCgoGCgoCAgX98e3p6eXt9enx+fnl8eXh4dHx8fHt8fHx+gH9/f39/gIB/fn5+fX+AgH9/f3+Af4CDgoB/gIGAgIB/f4CAgH58enx9fX59fX5+jIZ9fX57e4OCfX5+fX18fX19fX1+fH18fXx9fX58fn19fX18e3t6fHt8fHt6e3t6enp7fn6ChYiHiIqLi4uJjZGOjYmIhoWEgoKCgoODg4OBgYGBgYGBgYGBgYGCgoOCgYKBgIGBf3+Af356eHl5en5+e3l6eH5zfHx8e3x8fH5+fn5/gH+AgIB/fn9+gIF/f4B/gIGAgoSEgYCAgYGAgX+AgYKBf39+f31+gH57foGRjHx9f4qAjYx+fn19fX59fX59fHx8fX18fXx9fX1+fX1+fnx7e3t8fH18e3p7fHl6eXh5e35/hIOEh4mKiImOkI2LiIiFhISCgYKCgoKCgoGCgoKBgYGCgYKCgoGCgoKBgoKAgYGAfoCAf39+e3p5e319eHx6f3KBfXt7fHx8fn59fYGBf4GBgX9/gH+AgX9/gIGCgYGFg4SCgYGCgYKCgICBg4KAf4F/fX6Afnx+f4iCf36DkISEg4F/fn18jYd9fX59fHx/fnx9fXx9fX5+fX5/fX19e3x9fnx8e3x9enp5eXl5e3t+foCBg4eEiI6NioqGhYSEg4KBgoKCgoGBgYGCgoKBgoKCgoKCgoKCgoGCgn+AgIB+f39/fn5/ent5fX16enp9cX6Cent8fX19fXp4f4KAgYKCgICBgIGBgICBgoKCgoaFhIKBgYGBg4F/gIKEgX9+gYB9foF+fX5/gIB9fn+EgH5+f31+fX2KhX1+f31+foB/fX19fH5+fn99f4B9fn18fX9/fHx7fH17e3t6enp7e3x9fn2Ag4CJjYqLh4WFhYSDg4KCgoKCgYGBgoKBgoKCgoKCgoGBgoKBgYKCf4CAgH9/f39+fn59eXp6fXx5d3t0e4d8dHd9fn17e3Z2foCBg4KBgYKCgoKBgYGDg4OChYaEg4CAgICCgX+AgYOBfn6Af35+gH59fn6AgH+Bfn+Af39/f398f39/f3+Afn9/gH58fX18fn5+foF/gH2CgHx9gIB9e319fXx8e3x8e3t7fHt8fHx9fIqKiIiFhYWFhISDgYKBg4KAgIGCg4KCgoOCgoKCgoGCgoGBg4J/gIGAf39/fn5+fn57enp8fHt2e3R3f352cnt+fnt4dnd8gIGCgoKBgoODg4OCgoSDhIOFhoOCgX9/gIOAgICAg4F+foB/fX+AfX1+foCAf4J/gYGAgICBf31/f3+AgIGAgIB/fnx9fX19fn59g32AfoKAfX6AgX98fn59fX17fH58fXx8fHp8e3x+iYaGhYWHhYSFhIKBgoGDgYCAgoKDgoKCg4ODg4KBgYGBgYGCgH6AgYB/fn5+fn5+fn56e3p9goN9dXF6fHpxen59eXh1dICAgoKCg4KDhYOEg4KDhISEhIWEgYGAgH6Agn9+f36Bf35/f4B9foB9fX1+gH9/gYCCgYCAgIKBfn6Af4GAf4CAgH9+fX19fnx+fn19gYR/gH9+f4GBf31/f319fn1+fn1+fHt8enx7eoCHgoSEhYSEg4WDgoKBgYKBgICCgoOCgoOEg4SDg4KBgYKBgYOAfoCBf35+fn5+fX5+fnt7en6Jh354cnl9f3F6eHt4eXV1fYKDgoODg4OFhIWEg4OEhIODhIKBgH+Af4CBfn19foB+fn5/gH19f3x9fX6Af4CAgIKAgIGAgoGAf4B+gIF+gIGAgH9+fn5+fn5/fn6FhYGBgH+Ag4F/foGAf35/f4B/fn17ent6fHt6goR/g4KCgoOChIKBgYCAgoGAgIKBg4KBg4SDhIKEgoGBgoGCgn9+gIF/fn1+fn5+fX59fXp7fIWEe3tzeXp8cHd1dnd5dXR6hISBhISDhIWFhoSDg4WEgoODgoCBf39/f4B9fX1+gH1+f39/fn1+fH19foF/gIB/gIB/gIGDgoGAf36AgH+AgYCBgH9/f39/f4CAgIGCgoKBf4CDgX+Ag4J/f4B/gX+Af3x7e3p8e3yCgH+Cf3+BgIKCgYF/f3+BgH6BgoKDgYGDg4KEgoSCgYGBgIGCgH6AgH9/fX5+fX19fn19e3t6gH94fHZ5eXtxdHh3dnh1cnmFhYKEhIKEhYWGhISChIOBg4GAgIF+f4B/gHx9fX6AfX5/f39+fX98fn5+gX+Bf39+f4B/gIODg4B/f4GBgIKBgYGAgICAgICAgIGAgYKDgYF/gISBfYGDhICAgX+BgYKBfXp7e3x8fH9+f4B8f399fYGAgH59fYB/foKBgYKBgIKCgoKBg4KCgYB/gYKAfn9/fn99fX1+fX19fX19ent7fHZ9eXh5enJ1eXl2d3dzdYaFg4WFgoSEhYSEhIKDgoGDgX+AgX5/gH6AfX19fn9+f4B+fn99f3x/f3+BgIF/f3x+gH6AgYKDgYCAgoOEgoGAgYB/goCAgYGAgYGCg4KBgX+Ag4B+goKEgICCgYKChIJ+e3t8fHx8fX1+fXp+fX14fn9/fHx8fn5+gYCBgYCAgoGBgYGDgoGBf4CAgoB9fn19f319fX59fH19fX16e3p8dnx6d3t4cnZ5e3Z2dnN0hoSEhYSChISFg4OCgYOBgYOBgIGBfX+BfoF9fX1/f39/gH5+f359fYB/gIGBgX9+fH5/fn5/gYJ/gYGCg4eFgX9/fn6Af4CBgICAgIKCgYCAfoCCf36BgoKBgYOCg4OFgn99fX18e3x8eXp7en55e3l4f357e3t+fX1/f4F/gH6BgICAgoOCgYF/gIGBf31+fH1+fX19fX18fn58fXx5e3x4enx3endzeHd6c3Z2c3SGhISFg4KDhISDgoKCg4GCgoGAgYF8gIB+gH1+fX5/gICAf35/f3x+f3+BgIGAf359f39+fn+BgH2AgIGDg4N/f359fn5+f4CAgIB/gYKBgH9+f4F+f4CCgoCBhIKEhIaEgH59fHx8fHp5dnl5enl2eXZ+fHt7e359e399gH99fX9/f3+BgoGBgX5/gYF+fX18fX19fX19fXx+jYF8fXl7e3p5fHd4eHR1dXhyd3d0doaEhIWEg4ODg4OCgYKDgoGDgn+Bf39/fn+AfX19fX+AgIB/f4B/fIB/f4GAgYCAf3yAf31+fn9/fX5+gIGCgn5/fn1+fn5+f3+Af32AgIB+fn5/gX5+gIKBf4GDgoOEh4SAgH58fXx8e3x1eXl4eHh5d3t8e3p7foV9fn1/ent+fn59foGAgIGAfX6BgH59fXx9fX19fX18e32Dgnx8ent7e3p7d3Z4dXJzdnB4eXJ4hYWFhYOEg4KChIKBgYKBgIKBgIF/fn5+foB+fX58f4CAgH+AgX98gH6AgH+BgIB/fYB/fn5/f319fX6AgYKBfn9+fn59fX5/fn9+fH+Af35+fn+Cfn6AgIF/gYOCg4OGhICBfnx9fHx7fHh4e3h1eXd3eXx6e3t9kod9fH13en1+fn19f35+gH98foB/fn19fH19fX19fHt8ent9enp4e3x6ent4dHh1cXJ0cHh4cnmEhYWFg4SDgoODgoGBgoKAgYGAgIB9fn5/gH18fn2AgIGAf4CBgHyAf4B+f4GAf39+gX9+f39+fX18gICAgIB+f35+fn18fn9/f358fYB/fn1+gIJ/foCAf36BhIKCg4WFgoJ+fnx7e3x8eXd8eXd4d3d4e3t6e3yFin17end6fH19fHx9fX1/fnx9fn59fXx8fX5+fX18fHt6enx7e3p5enp7enhzd3VxcXJweHdxe4WGhIWDhYKBg4OBgYGBgoCBgICBgH5/fn9/fXx+fYCAgoGAgIGBfX6Af35/gX+Af3+BgH9/f31+fH1/gICAgH9/f35/fXx+f39/f319f39+fn6CgYF/gIB/foGDgoKEg4SCgn5+fHx6fHt7eXt6d3N2d3h5e3p7eXp/fnt7d3p8fXx8fH59fH19fH19fXx8fX19fX99fXx9e3l7fHx8enp6enp6eHN2dXBwcm93dnJ7hYaEhYOEgoGDgoKCgYGCgYKBgYGAf4B/f399fX9+f4CBgYJ/goF9foF+foCBf4B/gIKAgIB+fX58f3+BgICAf4B/f4B+fX5+f4B/f39/gH9/f4J/gICAgIB/gYGAgISBgoKAf39+f3x9fn56fYV+dHx9enp6enx5eXp6hoV3eXx8fHx8fXx8fHx8fX19fHx9fX19fn19fX16eX18fH16enp6enp5c3V1b29xb3d0c3yFhoOEgoOCgYKBgoKCgYKBgoGBgYCAgICAgH59gH+Af4GCgn+BgX+AgX5/gYB/f4CAgn+Bf319f35/f4KAgICAgIB/gIB+fn1/gH9/gIB/f39/gH+AgICAgH+AgYCBgYGCgYCAf39/fn1/fnuBk416fH18e315e3p6eHmBgXh5e3x8fXx8fHx8fHx9fX18fH18fn1+fn59fHp8fHt8fXt5enp6eXlzdXVvb3Fwd3N0fYWGg4OCg4KAgYCCg4KAgYGCgYKBgYCAgIGAfn6Af4GAgYKCgIKCgICCfoCBgX9/gX+BgIF/fH6Af3+AgoCAgICAf3+AgH9+fX6Afn2AgIB/f3+AgICAgYCAf4CAgYCBgYKCgICAf39/fX5+fIGGiXx8fnt7fnl6e3p7jn53d3l7fHt9fHx8fHt9fH19fX18fXx+fn5/f358enx9e319e3l6e3p5eXN0dW5zcXB4cnV6hYaDg4KDgoCAgIKCgX+CgYKBgoGBgYKAgYF/fn9/gYGCgYKBg4OAgYJ/gYGBf4CAgIB/gX99f4F/gICBgICAf4B+gICAf359foB+fn+Af39/gH9/gICBf4CBgH+BgIGCgoKAgICAgIB9foB9gIOCe35+e3x9e3p8e3uHeXh4eXx8fH17fHx9fX18fH19fn19fX5+f3+Af317fH18fHx7enl7e3l5c3J1bnZycHhxdXaFhYOEg4KCgICBgoF/gIKCgoKDgYGDgoCCgYB/gICCgoKBg4KEhICBgX6BgoF/gICAgH+Cf36AgYCCgICAgIB/gH+AgIB/fn2Af39/f4CAgH+AgH+AgYF/gICAgIGAgYGBgYGAgYCAgH9/gH5/fX59fn57fXx9e3x8d3h1eHh5e3x8fXx8fHx8fX5/f39/fn19fn9/gIGAf3x9fHx9e3p7eXp8eHpzcnVud3FxenF2d4WFg4ODg4KBgYKDgH+CgYSDg4SBgYOAgoOBgYCAgIKDgoCCgoSDf4GAfoKDgICBgICAf4CAf4GBgIKAf4CCgH9/gICAgICAf4CAgH+AgICAgIB/f4CBgYCAgICAgYGAgoOCgoCCgYGCgYB/f4B/gId+fnx6fXx7fX94d3Z5eXp8fXx8fXt8fH19fn5/gIGAfn1+gICAgoGAfH59fX58d3t6ent5eXNxdW53cHV6cXZ5hYWCg4KDg4KDhISAgIOBhoOEg4GChICEg4KCgICCgoSBgYKChIJ/gIB/gYOCgYCBgYCAf4GBgYGAg4F+gIOCf35/goGAgIB+gYCBf4CAgYGBgYCAgIKBgYKBgH+CgYGBgoOCgoOBg4OCgYCBgH+AhH19fXx/fXp9f3p5dnp4eXt7fH19e3x9fX19fn+AgYGAgH+AgICDg4B9f35+fn15eXt6enp5c3J1b3dxd3lzd3uFgoKDgoOEgoOEg4CAgoOGg4ODgoKEgYSDgYKAgIKBhIGCgoGCgX6BgICCgYKBgYKCgIGAgICBgoGEgH6Bg4F/f4CDgoCBfoCCg4KAgYGBg4KDgoGBg4KChIGAgYOBgYKEg4KEhIODhIODgoGBgYCCf4B/fYB8enx/e3t3fHl5eXt6fX59fHx8fH1+foCBgYCAgIGBgYSEgH2Af39/f357e3t6e3p0cHhyeXR2eHR3e4SCg4KDg4SChIODgYKChYaEgoODg4SBhISAg4CBg4KCgoKCgIKAf4GAgIKBgoGCgoKBgIGBgYOCgoOAfoGDgX9/gYSEgYN/goKBg4KCgoGEg4OEgYKEgoOCgoGCgoOBg4SDhISEhYSFg4SCgYOCgoOBgYGAgH58fIB8fHh8eXp5enx9f3x7fHx9fX18fICAgICAgYGBgYKBfoGAgICAf3t7e3p6enVweHd5dnV8dXZ8gICDgoODg4OEhISAgoOGhYWDg4KDhIGEhYKCgYKDg4GCgoKAgYB+gYCBgYKDgoKCgoGAgYKCg4KCg4B/gYOBgICChIODgoGCgoGDgoKDg4ODg4SAgoSDg4OBgX+Bg4KDhYKEhISEhISDhISChIOEhIKBgoGBgHt+gX59eXx6enp9fXyBfXp8fH19fHp7fn5+gH9/gYGAgICAgIGBgIB/fX18fH18dnJ2eHh2dH92dX2Hh4OChIWDg4SFhICChYWEhIOCg4SEgISFg4KCgoODgYOCgoCCgH2AgIGCg4KCgoKEgoGCgoOEgoKBgICBgoGAgYOFhIOCg4CCgoOCg4ODg4OEg4CCg4KEg4KCfoOBgoSEgoODhISEhIOEhIOEg4WEg4ODgoKAe4CBf3x8fXp6e32AfX9/fHx6fH59fX19fn5/f39/gICAgH9+foCBgICAfnx9fX5/fn18e3h2f3Z3f4SHg4KDhYODhIaEgYKFhoWEhIODhISChIWFgoKDg4SCg4KDgoKBfoCAgoKDgoODg4SDgoKCg4OCg4GBgYGDgn+ChISDg4KEf4KEg4ODgoSDg4SCgIOEg4SDg4KCg4KChIOCg4OEhISEhIWEg4OEhYSFhIOBgoB9gYJ/fXx8e3x8gH19foB+fn1/fnx8fX19fn5/fn+BgYGBgH99fX6BgYB+fn19fX59fX5+f39/fH2AgYKCg4OGg4SDhoSBgoiHhYSDg4SEhYGFhYWDg4SDhIODgoOCg4F+gYGDg4SCg4OEhIOCg4KEg4ODgoKDgYOCf4KEg4ODgoOAgoWDg4ODhIODhIOBgoSEhYOCgoODgoGEg4GDg4SDhISEhYSEhIWFhYWEg4ODf32BhIB9fXx8fHx/gX5+f39/fX99e3x9fX19fX5+f4CBgIGBgH59fH6Cf39+fn5+fX1/f39/gICAf4CEhIODhIWDhIOFf36CiouFhISDgoOFgYaGhoOEhISEhIODg4OEgn+BgYODhYSFhIWEg4KEhISFhIODgoSDhYKBhISFhYaEgoCDh4SDg4OFhIWFhIGEg4OHgoOCg4GCgYSDgoODhYODhYWEhYWHh4aHhYSEhYSBf4GDf35+fH5+fX+BgH9+fHx/f358enx9fX19fX5+fn9/gIGBf319fIB/gH5+fn5+f3+AgYGBgYKAgYWFhIOEhIKEg4aAgoWFiomEhIOEhYWDh4aGhIWEhIWEhYSEg4SDgYKDg4OEhIaEhYSDg4SEg3yDhHuBhHd5g4F9hH5+cnWDgoF2foOEgX2BdYF5g39/gH6EhIKDg4KBg4SDg4SFg4SFhoSFhn2EeXx+f4N7hYOBhIOAf319fn1+gYOBfXt/fX6Afn18fHx9fX19fH19f4B/gYJ/fX18f4GBgICAgH+BgYGCgYKDg4KChoSEg4WEgYOEhYOEhYSKiIWFhYOFhYSGhoaDhIWFhYWEhYWEhIWCgoOEhYWFhoSFhIOEhYWCaICFanx7cXF8gXOGc3R0fYKDdXNxg4Z0cHVyc3SDdnt9dYF/goOBgnZ5hYCDgIR/hYSChYWCaHpyc3N8gHOCg3+Dg32BfX5+fX6Cg4J8f4F9f4B9fXx8fHx9fHx8fn1+gH+BgX99fX2AgYKBgYGBgIGBgYKBgoKCgoSHhIWEhYSBgoSGhoOFg4aIhoaFg4aGh4eGh4OFhYaFg4KFhoSFhYODg4SEhoaGhIaEg4SFhn1xe4FweXZ+g3+CbnlwdXN8dnl5hXKEg3B2eHF2dHR1cnN0dml/gG5yb3R2bnVsd217c26Ah3ltfXJzdnN2bW14bHB5bHV9f399foGAgX2Af32Af4B/fX18fHx9fH1+f32Af4CAfnx/foCBgoCBgICAgYCAgIKDgoOEhYiGhoCChYODhIeGg4WFhYaHh4SDhoeIiYaHhIWGiIeEg4WGhYWEhIOFhIKFhoaFhoWEhoWHdnB0e3BydX+HhYNtdW92b3x1coR5eYd4cXR3bndod3pucHaCcoN+b3p5eW1vbnpvb213fXiGcHF6cHJ0ZoF1fm57eXNveX+Af319gYB/fH99fIB+gIB+foCAgYB+fn9/foF/gH9+fYB9f4CBgIB+fn+BgH9+goOCgoSFh4eEfoeEg4OFh4aEhoWFhoaIhISGh4iIhoeEhoaLioWEhoeHhYOFhYWEgoaGhoWGhYWGhYZxdXByc29zenl+hHSIdHV+iHZugnKEhnluanJ/cW1zd3x/dXR8hH54cXV3bnl1enF2eHV6eYRxam95eHBreXN6b3p3dnZwgYB/fn5/f356fn19f31/f359gIGDg4CCg4GBhIKBgIGBgH1/f4F+f35+f4GAfn6BgoCAgYSHhoODhoSEhYaHhoWFhYWHhoiFhYaFh4eFhoSGhomIhYSJioiGhIaGhYWDhYaFhoaGhoaFg3iLeXKIentwcIWEeIV4eWtzfnl7a3KDh4N6fG17eXl0fYB2bm+AgG90fHV3cXl9fW1+dW+DhYZ6gHJye3x1cG96bHN8bneCgIF+fn99fXt9e3x9fX9/fn1/f4KCf4GDgYGDgYB/gICAfn9+f31/fn1/gH58fYGAfn6Ag4iFhoOFhYWFhoeFhYWFhoeHiIaEhoWHhoaFhIWFhIWFhomKh4WFhoWGhoWGhoSGhoaGhoWGh4eHhoaEhoWGh4iHhYeGhoOHhoWFg4SFhoWGhIaEg4SEhoSEgYODhISFhIWEhYSGg4aHhYaEhIWHhoSEhYaEhX13hYOEhIKBgX1/fnt8e357fHx9f359fH59gIB9f4F/f4GAfn5+gH5+f35+fX99fX5/fHt8f358fH+BiYaFhIaGhoWHhoWFhYWGhoeIhoSGhYaGhYWDhIWGhYSGhoaGhYWGhIWGhoaGhIeGh4eGhYeIiIiIhoSHhYaGiIaFiIeIhYeGhoiFhYaHhYaGhYOChYWGhYWDhYSEhIWEhYWEhYWDhoaGhoWEhoeGhISFhoOFhIKEg4OFg4OCfYB/e3t8fXt8fH1/fnx8fn2Af31/gH5+gH99fXyAfX5+fn5+f3x8fX57fHx/fHt7fn+Ih4SEiIaGhoeGhYWEhoaGhoiHhIWGh4aFhIODhIaFhIeFhoaFhYaEhYaGh4eFh4aJiIaGh4eIiYiFhYiFhoeGh4aHhoeFh4eGh4WFhoeFh4aFgoOFhoaEhIOEhIOEhoSFhYWFhYOGhoWGhYWGhoWEhIWFg4SHhYOCgoWDhIF+gIB8e31+e3x7fX59fHx+fX5+fX9+fX1+fnx9fH98fn58fYGAfHx8fXx8fH56e3t8foiHgoWIh4eGhoaGhISGhoeGiIaEhYSGhoSFh4OEhYSFh4SFhoaFhoSGhoeHhoaHh4mIhoaIh4iKiIWHiIWHh4WHhoeGh4WIiIeHhYaGh4WGhoWBhISFhoWFhISEg4SFhYaGhoWGhIaFhoeFhYaGhYSDhISDg4eDhIGChISDgYCAgHt7fn18fHx9fXx8fH19fH18fn18fX18fHx8fXx+fXt8gX99fH18fnx8fHp6fHx9iIeChoiHhoeGhoaDhYaFhoaGhYOFhIaFhIiJg4GEg4SGhIaGhoaGhIeHiIiHh4eIioiGh4iHiImIhYiHhYeGhoeHh4WHhoiIh4eFh4eHhYaHhIKEg4SGhYeFhISEhISFhoaGhoaFh4WFh4WGhYeFhIOEg4OEh4GDgIKDg4KCgn+Ae31+fXt8fH59fH19fH17fHx8fHx8fXt7e318e359e3x/fX18fX1+fXx6ent7fHyIh4KGhoaGh4aGhYOFhoWFhYWEg4WChoSDiId/enqChYaEhoaFh4aEh4eJiIiHhoiKh4aHh4eIiYeFiIeGiIeGhoeHhYeGiIiHhoWHhoiGhoeDg4SEg4aGh4WFhISEhYaGhoaGhYaHhoaHhoaEhoWDhIODgoOGgYN+goKDgIOCf398f35+fHx9f318fX18fXp7e3p7fHx8e3t7fnt7fXx7e358fHx8fX5/fXt6fHp8fYmHg4aFhoWGhoWEhIWFhYWFhIOBhYGGhIKEhHyAhn+ChYWGhYWGhYSHh4iIiIaFiYqHhYeGh4eIh4WIhYaHiIaGh4eGh4aIiIeFhoeGh4WFh4OEhoWEhoaHhoWEg4WFhoaGhoaFhoaHhoeHhYOGhYOCgoKAg4WCg36BgYF/g4F/fn5/fX98fH1/fXt9fXx+enl6eXt8fXt7e3t+fHx8fHp7fXx8fHx+fYB8e3t7e3x7iYeEhoSGhIaGhYSFhoWEhIOEgoCDgYWDgYJ/eoSMe4CEhYeGhoaFhIeIh4aHhYWHiYeEh4WGhoiGhYeEhoeIhoaIh4eHhoeIhoSGhoaHhYWHg4SFhIaGhoeFhISDhYWGhoeGhoWGhoaFhoaEg4SFgoGCgYCDg4OCfYGBgH6DgX5/f4B8f3x9fX59e359fH15eXp5e319enp7e318fXx8ent9fHx9fH5+gHx7e3x+fXyIh4WGhYeEhoSFhYWFhYODgYOBgIKBhYJ/gH9/fXx7gYSFhoaEhYSDh4eGhoaFhIaJhoKGhIaGhoWFh4WHiImGhYiHiYeGhoeFhIaFhYeFhIeDhIWEiIaGh4WFhIKFhYaFh4aHhIaGhoaFhoODg4WAgIGAgIOBg4B8gYB+foKAfYB/gXx/fH1+fX57fn18fHl6enl6fX15enp7fHt8e3t6e319fH18f35+fHt7fX59fIiGhYaGhoSFhYSFhYSDgoKAgoGAgICDgX5+foB5en2Ag4OEh4WEg4OHhoOEhYSChYiFgoSDg4WFhYWHh4aIiIaFiIeJh4aFhoWDhoSFh4OEhoSEhYSHhoWGhYaEgoWFhoaGhoaEhYaGhYWGgoKDhH9+gICAgYCDgHuBf31+gn5+gH6Afn99fX59f3t/fXt6eXp6eXp8fXl6ent7enx6e3t7fH19fXyAfn18fH1/fnx7h4WFhoaGhoSFhIWDhYKBgICAgYB+f4KCfX1/f3t/f4KDg4WGhYSDg4aDgYOEgoCFh4WCg4GBg4WEhIaGh4iHhYWIhomHhYSEhIKFg4SGgoOFhISGhIeGhYWFhoOEhYSFhoWGhIOEhYWDhYWBgIODf35/gH9/gIN/fIB9fX+CfYCBfn6Bfn5+fX1/e398e3p5enp5enp8eXp6e3t7fHp7e3t7fX59fYB9fXx8fYB/fXyGg4aGhoaGg4SDhoKFgYGAf3+AgH5/gIJ8fn9/foCAgYKChIWDgoGChIGAg4KBgISFhIKBf4CCg4OEhYWHhoWEhoeFh4aGgoOCgoOCgoWBg4WEhYaEhoaHhoaFgoSEg4SGhYWDhIODhIOFhIB/goJ/fX5/fn5/hH57f3x8gIF9gYB9fYN9fn59fX57fnt7enl7enl6ent5enp6e3t8ent8e3t+fn1/gXx9fHx9f4B+gIaEhYWEh4SDg4KGgoOAgYB+fn+AfX9/gnx9f39+fn+BgYKEg4KBgYKCf4CBgoCAgoWEgoB/gIGCgYOFhYeFhISGhoOFg4WBgoGBgoGCg4GChISEhYWGh4eGhYSDg4ODhIWFhIGDgoOChIODgH+AgX59fX5+fH6Dfnx+fHyBgH6Cf31/gnx/fn19fHx8e3t6enp6eXt6enp5eXp6e3x5e317fH5/f4GAfX59fX1/gICAhoSEhYSFgoSCgoSCgoCBgH59fn9+fn6AfX2Af35+foGBgoODgoSHgYF+gICBf3+ChIOBf35/gIJ/goWEhYOCg4WFgoSBg4CBgIGBgYKBgIGEg4OGhYWHh4WEhIWCgoKDhYSCgYGBgYCFg4F/foB/fnx9fn18foN9e358fYF/gIN9fYCBf35/fXx8fH17e3p6enl5e3l6enl6ent7e3p7fXx8f3+BgoB+gH+AgH+AgYDKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzNzc3Nzc3Nzc3NzczMzMvLy8vLy8vLy8vLy8vLzMvLy8vLy8vLy8vLy8vMzMzMzM3Nzc7Oz8/Pz9DQ0NHR0dLS0tLS0tLT09PT0tLS0tLS0tPT09TU1NTU09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tLS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1dXV1NTU1NTT09PT09PT09PT09TU09PU1NTU1NTU1NTU09PT09PS0tLS0tPT09TU1NTU1NPT09LS0tLS0tLR0dHR0dPHhnNlYFtLWWdVTUZIQD03Nzg5Nzw8PDo8Oz42Oj04PDs6OTg3ODs7Oj87PTs8PD47P0E/QkJBQ0RFREE+PTw7QENDQUBDQ0FBR0hHSUtSwtXS09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXVysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMy8vLy8vLy8vLy8vLzMzMy8vLy8vLy8vLy8vLzMzMzc3Nzc3Oz8/P0NDQ0NHR0tLS0tLS09PT09PT09PT09PS09PT09TU1NTU1NTU09PT09PT09PT09PT09PT1NTU1NTU1NTT09PT09LS0tLS0tLT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1NTU1NPT09PT09PT09PU1NPT09TU1NTU1NTU1NPT09PS0tLS0tPT09PU1NTU1NTU09PT09PS0tLS0tLR0dHSzIxyZ2BcTVllUktHSz87Mzc4Ozg5Pj05PDpBOjs9Nzs8PDo6Nzg6Oz0/Oz88PTw/Pj9BPUFBPkNDREJAQT46Oz9DREFDRERCQklHSEhJTr7V0tPT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1crKy8vKysrKysrKy8vLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzMzMzMzMy8vLy8vMzMzMzMzMzMzLy8zMzMzLy8vLzMzMzc3Nzc3Ozs/P0NDQ0NDR0dLS0tLS09PT09PT09PU09PT09PT09TU1NXV1dTU1NTT09PU1NPT09PT09PT1NTU1NTU1NTU1NPT09PS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1tbV1dXV1dTU1NTT09PT09PT09PU1NTU09TU1NTU1NTU1NTT09PT0tLS0tLT09PU1NTU1NTU1NTU09PT09PT0tLS0tHR0s+Sd2hfXk9XZ01LRks9ODc2NTk5OTw+OT88RDo7PDc5PD07OTc5Ojw9QDs+PT47PD48PT5BQD5EQ0NDP0E9Ojs9QkNFQ0NEQT9FSEpJSky61dPT09TU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8rKysvLy8vLy8vLy8zLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMzMzMzMzMzMzMzMzMzczMzMzMzMzMzMzMzMzMzc3Nzc3Ozs/Pz9DQ0NDQ0dHS0tPT09PT09PT09TU1NTT1NTU1NTU1NTV1dXU1NTU1NPU1NTU09PT09TU1NTU1dTU1NTV1dTU09PT09LS0tLS0tLS09PT09TU1dXV1dbW1dXV1dXV1tbW1tXV1dXV1NTU1NTT09PT09PT1NTU1NTU1NTU1NTU1NTU09PT09LS0tLT09PU1NTU1dXV1dTU1NTT09PT09PT0tLS0dHRmn5nYWJOVWpKSElLPzw6OTM3Njc3PTs+OT06Ojo4ODo7Ozg4Ojs7PD46PT09Ojw/PD0/QkA/Q0RDRD5APT08QENEQ0JEQkQ+REhJSUtMttfT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3MzMzMzMzMzMzMzMzNzc3NzczMzMzMzMzMzMzMzc3Nzc3Ozs7Pz8/Q0NDQ0NHS0tLT09PT09PT1NTU1NTU1NTU1NTU1NTV1dXV1NTU1NPT1NTU1NTU1NTU1NTU1dXV1NXV1dXV1NTU09PT09PS0tLT09PT09PU1NXV1dbW1tXV1dbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1NTU1NTU1NXU1NTU1NTT09PT09PT09PU1NTU1dXV1dXV1dTU1NTU09PT09PS0tLR0p+DaV9kU1hsSEhIS0A9Nzg0NzY6Oj87RDw8OTw8OTg6OTo6Ojs8Ojo7OT49Pjk9QDs/QUFCP0JCQUM9Pz8+PEBCRUNDQkBBO0ZJR01MSbLY09TU1NTU1NXV1dXV1dXV1dXW1tbW1tbV1dXW1svLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzM3Nzc3Nzc3Nzc3Ozc3NzczMzMzMzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc3Mzc3Nzs7Ozs7Pz8/P0NDQ0NHS0tLS09PT09PT09TU1NTU1NTU1NTU1NTV1NXV1dTU1NTU1NTU1NTU1NTV1NTU1dXV1dXV1dXV1dTU1NTU1NPT09PT09PT09PU1NXV1dbW1tbW1tbW1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTV1NTU1NXV1dXU1NTU1NTT09PT09PT1NTU1dXV1dXV1dXU1NTU1NTT09PT09LS0tSjiGxfZlJWakdIR0lBPjM2Njo7PDhDPEJBPjxBPDg5Ojw6Ojw8PDk8PTo7PD09PD89QD9AQT9AQUBCPD4+PzxCQ0NDRkBBQT1ISklOTUeu2NPU1NTV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbMzMvLy8rKysvLy8vLy8vLy8vMzMzNzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzs7Ozs7Oz8/P0NDQ0NHR0dLS0tPT09PT09TU1NTU1NTU1NTU1NTU1NTV1dXV1dTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dXU1NTU1NTT0tPU1NTU1NTU1NTV1dbW1tbW1tbW1tbW1tbX19bW1tXV1dXV1dXV1dXV1dTU1NTU1dXV1dXV1dXU1NTU1NTU09PT09PT1NTU1NXV1dXV1dXV1dXV1NTU1NPT09PT0tLWroprY2VSWGhMSkdJQjg0OTQ6Ozo5QDk/Q0VAPDw5OTk9Oj07PDw6PTw7OTw9Ozs/PUA9PT5AQD9CQT5APD05QERDQkFBQj48SEpLTU5IqNnU1NXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbWzMzQ0dDQ0NDQ0dHR0dHR0c3Ky8vLzMzMzMzMzMzMzM3Nzc3Nzc7Ozs3Nzc3Nzc/Pz8/Pz8/Pz8/Pz9DQ0dHR0dHR0dHR0dHS0tHV2djY2NnZ2dra2tvb29vZ2dnZ2dna2tra2tra2tjW19fX19fX19jX19fX19vb29vb29vb29vb29vb2NbX19fX19fX1tbW1tbW09LT09PT09TU1NTU1NbW1dXV1dXV1dXV1dXW1tbX1tbW1tbV1dXV1dXV1dXV1dTU1dXV1dXV1dXU1NTU1NTU1NTU09PU1NTU1NXV1dXW1dXV1dXV1dTU1NTT09PT09PS1bqKa2hoUlhlSUlMT0A5OTo0O0E8Nz05QUM+QD89ODo6Ozk9Oz4/Ojs8PDo7PDo7Pj1APT8/P0FAQUE/QTw8Oz5BRENBREA9PElJSk1ORqPa09TV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbW1szNloSGhoaGhoeHh4eHh4Ky4t3d3t7e3t7e3t7e3t3S0NDQ0NDQ0NDQ0NDQ0ci5ubm5ubm5ubm5ubq6t6WkpKSkpKSkpKSkpKSnhmBjY2NjY2NjY2NkZGRlhIuKioqKioqKioqKioemuri4uLi4uLi4uLi4ubSPjIyMjIyMjIyMjIyMiaK/vL29vb29vb29vb28v9LS0tLS0tLT09PS09PT3OPi4uLi4uLi4uLj4+Pi2NfX1tbW1tbW1tbV1dXV1dXV1dXV1dbW1dXV1dXV1dTU1NTU1NTU1NTV1dXV1dXW1dXV1dXV1dXV1NTU1NTT09PT09XDkXFrak5TYkxMVk48Ojo3Nz5DPzg+Oj8/QTw/QDc7Ojs7PTs+Pjo7PD48Oz07PT8+QDw/Pz1AQEBBPj88PjxAQUVCQkZAQD9HSEpLT0ae2tXV1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19fMzm5QU1NTU1NUVFRUVFNMoPPr6+rq6urq6urq6uvp1dLS0tLS0tLS0tLS0tTEqaqqqqqqqqqqqqqqq6aGhIWFhYWFhYWFhYWFik4MEhISEhISEhISEhIRE0pUU1NTU1NTU1NTU1NPg6ejo6Ojo6Ojo6Ojo6ScWlVWVlZWVlZWVlZWVlJ8rqqqqqqqqqqqqqqqqLDS0tLS0tLS0tLS0tLS0eDs6+vr6+vr6+vr6+vr6dnX19fX1tbW1tbW1tbW1dXV1dXV1dbW1tbV1dXV1dXV1dXV1dTU1NTV1dXV1dXW1tXV1dXV1dXV1dXU1NTU1NTU1NPUy5h2bGlKTl9NUlVNPjw8Nzs/Qz42Ojc+Pjs9Qj85PDk9Ozw6PD07PTs9Ozs9PD0+PT07QT08QUBBQT08Pzw7QEJDQURFPUFAQ0ZLS09GmNzV1dXV1dbW1tbW1tbW1tbW1tfX19fX19fX19fXzM5xVFhXV1dYWFhYWFhXUKHx6enp6enp6enq6unq6dXS0tLS0tLS0tLS0tLUxaqrq6urq6urq6urq6yoiIeHh4eHh4eHh4eHh41SEhgYGBgYGBgYGBgYFxpOWVdXV1dXV1dXV1dXU4WopKSkpKSkpKSkpKSlnl9ZWlpaWlpaWlpaWlpWgK+rq6urq6urq6urq6qx0dLS0tLS0tLS0tLS0tHf6+rq6urq6urq6urq6unZ19jX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dXV1dXV1dXU1NTU1NTU1NGcenFpSlRdT1JVTkQ+Pzs/QEA4Ojs4PDs7PD86Ozs4Ozk5Ozw7Ojw5Ozs8Ozo9PT0+PUE/Pj8/Pj08PT88PEFBQ0FERTw+QEVGSktNRpPc1dXV1tbW1tbW1tbW1tbW1tfX19fX19fX19fX183OeF5hYGBgYGFhYWFgYFqk7ufn5+fn5+fn5+fn5+bV0dLS0tLS0tLS0tLS08Wtrq6urq6urq6urq6vq46NjY2NjY2NjY2NjY2SXSInJycnJycoKCgoKCcpWmNiYWJhYmJiYmJiYl6MrKmpqampqampqampqqNoZGVlZWVlZWVlZGRkYYayr6+vr6+vr6+vr6+uttLS0tPS0tLS0tLS0tLS3+np6enp6enp6enp6enn2djY2NjY19fX19fX19fX19fX19bW1tfX19fW1tbW1tbV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbV1dXV1dXU1NTU1NTWo3txZElbYE5OVU9AQT89REI+Oz06OTs6PT07PDs6OTg5OTs8Ozw8Ojo7PDo7QD08PTxAQTxBQTs7PEA/PD1CP0RDQ0U8PkJERkpMTEWN3NXV1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjNzcfFxcXFxcXFxcXFxcXEy9DPz8/Pz8/Pz9DQ0NDQz87Ozs7Ozs/Oz87Oz8/NzMzMzMzMzMzMzMzMzMvJycrKysrKysrKysrKysfCw8PExMTExcXFxsbGxsvMy8zLzMzNzMzMzMzLz9HR0tLS0tLS0tLS0tLRzczMzMzMzMzMzMzMzMvP09PS0tLS0tLS0tLT09LU1NTV1dXV1dXW1dbW1tjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NfX19fX19fX1tfX19fX19bW1tbW1tbW1tXV1dXV1dXV1dbV1dbW1tbW1tbW1tXV1dXV1dTU1NTU169/cF5GXmJQUVdOR0ZDQ0lBPz07PDo8OEBCPD04Ojo4OTg7Pzs8PDs7PDw8PD87PD46Pj44PkI8Pj1BPjw+QkBERUNAPD5APkNJSUtEh9zV1tbW1tbW1tbW1tbX19fX19fX19jY2NjY2NjYzs3Pz8/Pz8/Pz8/Pz9PPz87MzczP09LSzs3P0s7Ozs7Ozs7Q1NLPztHV1NPOztPTz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0NDR0dHR0dHS09PU1NTU1dXV1tbW1tfW1tbX1tfX19fX19fX19bW1tbW1tbW1tbW1tbW1tfX1tfX19fX1tbW1tbW1dXW1dbW1tbW1tbW19bW1tbW1tbX19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjX19fX19jY19fX1tbW1tbW1tbW1tbW1tbW1dbW1dbW1tbW1tbW1tbW1tXV1dXV1NTV1di4gm9XSl9jUlFaS0hBQTxCPT07Oj4+PD4/PT0/Nzk6OTk3OD48PD47Ozw7PDs/PT0+OTs7OT0+P0A+QD07OkI/QkNCPz0+QD5CRUdKQoDc1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2M7Ozs7Ozs7Nzc3Nzsqfys3Nzc3QuYOEi8fTwJrLz87Ozs7Pypal0dOtg4OVz9KkodDOzs7Ozs7Ozs7Ozs7Oz8/Pz8/P0NDQ0NDQ0NDR0dHR0tLT09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbV1dXV1dbW1tbV1dXV1dXV1NTU1NXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NfX19fX1tbW1tbW1tbW1tbW1tXV1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXYwIBuVU9gY1dZW0xMQ0A9PTs9Ojw+Qj5CQ0A8Ojg5ODo6Ojc7Pz4/PDw7PDo5Pzw8PTg5PD9BPj09PUFAPTtBQkBCQz47QD9BQUlHSkF629bW1tbW1tbX19fX19fX19jY2NjY2NnZ2djY2dnOzs7Ozs7Ozs7OzdKpj63Rzs7Ozpu3tqSiwJOerNPOzs7Pz5yqna3Lmrq4mbWzn6Gp0s7Ozs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0dHS0tLT09TU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dbW1tbW1tXV1dXV1dXU1dXV1dXV1dXW1tbW1tbW1tbW1tfX19fX19jX19fY2NjY2NjY2djY2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2dnY2NjZ2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV18h/b1pTYWVeXVxPSkQ9QD8+Ozc6Pjk/RD9BOTg3ODk7Ozw4OT89PTw9PD47OkE7OTs5OzxDQDw7PT5AQT49QkQ/QkM9PT8+Pz5ISUg/ddrW1tbX19fX19fX19fX2NjY2NjZ2dnZ2dnZ2dnZzs7Ozs7Ozs7Ozs/Inrym0tDQzsqgl36Cw6abr6fUz8/P0MuUiJqevKKMgI3FnpiVnMjQzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dLS0tPT09TU1dXV1dXV1dXV1dXV1dbV1dXV1dXV1tbW1tbW1tbV1dXV1dXW1tbV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2djY2NjY2NnZ2dnZ2dnY2NjY2NfX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dbV1dXV1dfNiHNdWGloXl9gT0lGOkFAPj88PDo2P0JAQjo2NDc6Ozo8Ojk+PD49PTs/PTxBPjw8Ojw8PTw6PEA9QEI+PkFCPUNDPT0+Oz9BRUtIQHDZ1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2c/Pz8/Pz87Ozs7SrKWnqdXAvNLHnY+ey9PJipmq1M/Pz8/RvciZm6ygiKzWupmhnbCy08/Pz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0dHS0tLS09PT1NTU1dXV1dXV1dbW1tbW1dbW1tbW1tbV1tbW1tbW1tbW1dXV1dXV1dXW1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnY2NjY19fX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0JB1W1tqaWFeXVNOSTxDQEE+QD46OEZBP0M6NzQ5Ojo5Ozs4Oz0/Pj49QT08P0A9Pjw8PDw8Oj1AQD8/PT5CQD9AQkA8QD0+QUVLRz9r19fX19fX19fX2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnPz8/Pz8/Pz8/QzJ2Nl6zQmpfKxZ6ynpbN1q2ZqtTPz8/Pz9KXlKKxqK2bprKZlq+zqtXQ0M/Pz8/Pz8/Pz8/Pz8/P0NDQ0dHS0tLT09PT1NTU1NXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX19fX19fY19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tKUcl5ea2tqZV1PTEc/RENDQDo9OzxCPD49OTY0Ojk5Ojo5Nzs/QDs8PUA8PEE+PD07PTw/PDo8Q0A+PTs9QD5CPkBBPkA9QD9GSUQ/ZtXX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2traz8/Pz8/Pz8/P07GigJuvyaCjv8qcpYynrdiqmarUz8/Pz9Ozm8SawaKdlaeQmoSdk6TV0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1NXV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dbW1tXW1tbW1tbV1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbSk3BgXnBoZmVaUUhHQkVDQEA3Ojo8Pjo8OTc2NTk6Njo8Ozc8QEA8Ojo9Oj0/Pj08OUA8PDo6OT9APj08PUBBQz9APz5BOz9ARkpCP2LS2NfX2NjY2NjY2NjY2dnZ2dnZ2tra29vb29vb28/Pz8/Pz8/P0M6fkGyclteqo9PSrqa1mJ/Vqpmq1M/Q0NDRzo2QnsSntKuff6CphZmk1dHR0NDQ0dHQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1dXV1dbW1tbX19bW1tbW1tbW1tbX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfW1tfX19jY2NfX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX1tbW1tbW1tbW1tbW1tbX19fX19fW1tbW1tbX0pNuYFxxZGdkWlVKQENGQ0FCODs/PD07PDw4NTU4OTY4Ozo5PDo+Pzw9PTk8Pz49Ojo+OTw6Ojg+Pzw9PTw+QEFDQT48PDpCRERKRkJd0NnX19jY2NjY2NjY2dnZ2dna2trb29vb29vb29vPz8/Pz8/Pz9G9n8O31pfA09HQ0srSzZeb1KqZq9XRz9DQ0cvaqJmwztrBnIC8raaYr9bR0dHR0dHR0dHR0NDR0dHR0dHR0tLT09PU1NTV1dXV1tbW1tfX19fX19bW1tbW1tfX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19fY2NjY2NjY2NjY2NjY2djZ2dnZ2dnZ2dnZ2dnZ2drZ2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fX19fX19fW1tfX1tbX19fX19fX19fX19bW19GRbF1cb2doYl1PRkBISUdFQDw8Pj48PT48NzU2Ojk3OTs6Ojs4QD86PDw5PD49Ozs6Pzk/Ojs5PT49Pjw7PTxAQ0I/Pz47Q0ZGR0hEWc3a2NjY2NjZ2dnZ2dnZ2dna2trb29vb29vb29vb0NDQz8/Pz8/Pz5V+e6WS1KKa08ySl6ObodirmavV0pem1cmOpZqgp5Ghn6CZqJaYm7vV0dHR0dHR0dHR0dHR0dHR0tLS0tLS09PU1NTV1dXV1tbW19fX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tbX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2tnZ2dnZ2dnZ2djY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX1tfPjGRWXnBrXGBgTkVITUlJT0M+OkI9PUBCOzU0Nzw6Nzo7Ojo7OT09OTo6OT0+Pz07OT47PDo8Ozk+PD47PD0+QENCPz5BPEFDR0ZGRVXJ29jY2NnZ2dnZ2dnZ2dra2tvb29vb29zc3Nzc3NDQ0NDQ0M/Pz9DR1aeZrcmjqL7KnbGdo7XZqZup2Lirocq7oaannrekq6Oew6CrpJzR09LS0tLS0tLS0tLR0dHS0tLT0tPT09PU1NTV1dbW1tbX19fX19fX19fX19fX19fX19fX19bW1tbW1tfX19fX19fW1tbW1tbW1tbX19fW1tbW1tbW1tbX19fX2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2djY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fX19fX19fX19fY2NfX19fX19fYzYZdV2JvZE9dVEtIRlNRS0xAPj1EPD9DRj01NTc7OTY6Ozo8PTo7Pzo6OTg6PT0/Pjs/Oz49Ojs5Pjs9PD0+QURCQD8+PzxAQUVHRURSxdvY2dnZ2dnZ2dnZ2tra2tvb29vb3Nzc3Nzc3NzQ0NDQ0NDQ0NDQ0NO5gL3Tm5bP1LWLkZ/T1LyBu9TOlKDT056QjbbZp4+PrNjCj4281dLS0tLS0tLS0tLS0tLS0tLT09PT09PU1NXV1dbW1tfX19fX19fY2NjY19fX19fX19fX19fX19fW1tbX19fX19fW1tbW1tbW1tbW19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2tnZ2tra2tra2tra29ra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2NfX2ct+WlVqaltMX01KTEpVTEZCPD0/R0ZIS0g9NjU3Ojk3OTo7Ojw9OT45OTo4Oz0+PkE+PTk8PDo9Pj46PTk5Oj9FQUA+PT8/QkBHRURFUMHc2dnZ2dnZ2dna2trb29vb29vb3Nzc3Nzc3dzc0NDQ0NDQ0NDQ0NDQ0cHR0crI0tDUxLjS0tHSwtLQ08fM0tHSusTV0tW/v9bS1cXE1dLS0tLS09PT09PT09LS0tPT09PU1NTU1NXV1dbW1tfX19fX19fX2NjY2NjX19fX2NfX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29va2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2djY2NjX19fX19fY2NjY2NjY2NjY2NjY19rHd1xSZ2laTlpOTFBRV0VKPz89P0FFTExBPjc3NTs4ODk5Ojs8Pjw+ODo6OTs+P0A9Pj46NTo6Oz0/Ojs5Ojw+QkJAPz8/P0FCR0RDRE683dnZ2dnZ2dna2tvb29vb29vb3Nzc3Nzc3d3d3dDR0dDQ0NDQ0NDQ0NDS0NDR0dDQ0dPU0dHR0dPR0dHS0tHR0tXU0tLS1NXT09PU1NLS0tPT09PT09PT09PT09PT09PU1NTU1dXV1dbW1tfX19fX2NjY2NjY2NjY2NfX19jY19fX19fX19fX19fX19fX19fX1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tvb2tra2tra2trZ2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2trZ2tra29ra2trZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjbwXNYVWlrU0xSTlBSWVRGSTw+Qz9BQkVLPj43ODY5Njc4OTk7Oz0/QDw9ODk7Ozs/Pjw8OTU6PT47OTk7PD8/P0JCQT1BPUBBQkZCQkJLtd7Z2dra2tra2tvb29vb29vc3Nzc3Nzd3d3d3d3R0dHR0dHR0dHR0dDQ0NDQ0NDQ0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tPT09PT09PT09PT09PT09TU1NPT1NTU1NTU1NXV1dXV1dXW1tbX19fX2NjY2NjY2NjY2NjY19fY2NjX19fX19fX19fX19fX19fX19fX19fW1tbX19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2NjY2NjY3LxvVFRsbExLUkpUUlVLRkQ6PkdEREFERjw/ODk6OTY5OTo3PD07PkA9PTc5Ojs5Pjs5OTY2Oj1AQT47PDk6Pj9DQT4/Qj0+QkNFQkFCSrDe2dra2tvb29vb29vb29vc3Nzc3Nzd3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0tLS0tLS0tLS0tLS0tLS0tPT09PT09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1tbW1tbW19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19fW1tbW1tfW19fX19jY2NjY2NjZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2dnZ2dnY2Ny2a1NbcGtLVVdSXFFXSEQ+PEJKRT1ISj89PDc4ODo1OTg5Njs+PD1APDw1OTk8Oj87OTk0ODw9PUFBPD47Ojw+QD89PkE9PUNGR0I/Qkmq39ra29vb29vb29vb3Nzc3Nzc3N3d3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHS0M/U0M7P0tLT0tLS0tLS0tLS0tPT09TU1NTU1NPU1NTU1NTU1NTU1NTU1NTV1dXV1dXV1dbW1tbW19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19jY2NfX19fX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dndsGRTYXJfT1pUV19RUkdCPUVJTEFBTEQ/Pzs5ODg5Mzg2ODY5Pj0+Pz06Njo7Pjs9PTo5Njg6PTtAQDxAPz0/P0I+PD48PEJFSElCPkNJpODa29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3t7S0tLS0tLS0tLS0dHR0dHR0dPT0bm7zLqbnLrQyNPT0tLS09PT09PT09PU1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2NjZ2dra2tra2tra2tra2tra2tra2tra2tra29va2tra29va2tvb2tra2tra2tra2tra2trb29vb29va2tra2tra2tra2tra2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ3qpfVWBuW1VZUVpeT0xHQ0ZNSUZEREo7QUE7PDg4NjQ4Njk4Nzw/QT89Ojc8Pz48Pz87OjY4OD09QEE9QD5BQD1AOjs6Pj1BRUdJQkBDR57h29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e0tLS0tLS0tLS0tLS0tLS0tO+wMqaoKKViJGeqpOpz9TT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fY2NjY2NnZ2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dna2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2tvb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2d6iXFVeblheXU5aUFROQ0NMSUlJRkpEPEJBPDs4NzY3OTc3OTk9P0E/PDo5QD88PkI/Ojg3NzY9Pz9APUBBPz88PTs7OD48P0VJSEE/Q0aX4dvb29zc3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3tPT09PT0tLS0tLS0tLS0tTIlZyum5m1iX2TjIKBhMTV09PT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tvb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dndmlpYYW5ZYVdPV01QRUJETElNS0ZJRT5CRDk4ODY3OTc1Njk4PT1BPjo4OT4+PD9APzw1Njc2PD4/PjtAQEA/Pj4/Pjs/PkFCRkdCQENIkeLb29zc3Nzc3d3d3d3d3d3d3d7e3t7e3t7f39/U09PT09PT09PT09LS0tLTz6h+kayPko6MhoCIiYSQo8rU09PT09PU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY19jY2NjY2NjY2NjY2NjX19fX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2tra29vb29ra2tra2tra2tna3JJaWWNuWlpSVV5QTDxAR05IUklIRT47SEY4OTc1Nzg3NTg5ODs+Pj07ODlBPj1AP0E+NzU5Njs+QUI/P0BAQkI/Pj8+QUBEQUZIQj9FSozi3Nzc3Nzc3d3d3d3d3d3e3t7e3t7f39/f39/f1NTU09PT09PT09PT09PWtaWaiIuQhYCFi4iBg4qLf4bC1tTU1NTU1NTV1dXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2dnZ2dna2dra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29ra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb2tra29uIWltnalxYTFpfVkg6TEhMSkpDRUVDQExINzo3Njc4ODU4Nzg5PDw7Ozk4QD89Pj8/PDY3PDQ3P0JCQUBAPz8/QT09P0A+QEBGRT09REuI4tzc3Nzd3d3d3d7e3t7e3t7e3t/f39/f39/f39TU1NTU1NPT09PT09PUxZKCg4WGfYGCfXx5foGCg36k29bU1NTU1NTV1dXV1dXV1tbV1tbW1tbW1tfX19fX19fX19fX19fX19jY2NjY2NjZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vc3Nzc3Nvb29vb29vb29vb29vb2tra2tra29vb29zb29zb29vb29vb29vb29vb29vb29va2tvb29vb29vb29vb29vb29vb2tvZgFpebWhaU0ldW1hKRE1ISlNMR0ZBQD9KQjg7NjY5OTc1ODY4Ozo7Ojw5OD09O0A9Ozo2NTw3Oz1CQEFBPD49QEE9PEA/Pz5CREU+PERLg+Lc3d3d3d3d3t7e3t7e3t7f39/f39/f39/f39/V1dTU1NTU1NPT09PT2LKEkKh9g3l2hIh/e3d5gn5+i67A1dTU1NXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dna2trZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2tra2tra2trb2tra2tvb29vb29vb29vc3Nzc3Nzc29vb29vb29vb29vb29va2trb29vb29zc3Nzc3Nvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc1nlcWmxmWFJPYFFSQUhHSkZYTEZAQENDSz87Ozc4ODc2NTc2ODo5PDw6PTs/PTs9Pjw7ODg8OT0/QkFCQzw8P0FCPj1BQkNCREVDQDtDTH3h3d3d3d3e3t7e3t7e39/f39/f39/f39/g4ODg1dXV1NXU1NTU1NPU0ruen3WKeXuIgICChYGDcnOAhYOMrNfV1NXV1dXW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NnZ2dna2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra29vb29ra2trb3Nzc3Nzc29zc3Nzc3Nzc3Nzb29vb29vb29vb29rb29vb29vb29zc3Nzc3Nzc3Nvb29zc3Nzc3Nvb29vb29vb29vb29vc3Nzc3Nzc3Nvb29vb3dByXV9wZVdLUGNPS0JHQ0pIS0ZBPEE9SFBBOjo3Nzg3Njc4Nzw6OD09PD47QD88Pz07Ojs5Ojk8QEJAQkNAPUFAPz1AQkNDQUBAP0A7RU144N3d3d7e3t/f39/f39/f39/f3+Dg4ODg4ODg4NXV1dXV1dXV1NXU18h4i4V8goh6g4SBfoKCc2l0hYuGkJ3U1tXU1dbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tvb2tvb3Nzc3Nzc3Nvc3Nzc3Nzc3Nzc29zb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb297KalxjcWVST1heSz9HTElPS0VAPkFCP0lPPjk6NzY7NzY6Ozc7Ojg6PDw+Oz09Oz48Ojs4OTo4OUFCQkFAQDtAQj06PkFCQz8+PT4/PUZOdN/e3t7e3t7f39/f39/f4ODg4ODg4ODg4ODg4OHV1dXV1dXV1dXV1s6dhpl+f5OTin+CgXx9gnNxm4mAgoOJwNnat7TQ19bW1tbX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tra2tra2tra2tra29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NvfwGNaW21gVlBTU0pETEhNSEk8PkFEQ0ZORDw8OTc5OjY4Ozk3PDk4OTw9OzlAPjpBPzw3NTc7ODpAQUVBPz45PUI/Oz1CQkI6Pj07PT5GTnHe3t7e3t/f39/f39/g4ODg4ODg4ODg4OHh4eHh1tbW1tbW1tbV1tjLioCHhYOXjHh7e3lvfYF1a3ebdHZ7eInHxpiMrdjZ19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2drZ2dna2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tra29vb3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29zb29vb3Nzc3Nzc3Nzd3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3Nzc3Nzc4LdjV1lrYlJNVVFMSktGS0ZDQD5CQT9FTT4+PTg5OTo3OTo3NT03Nzo+PDs7Qjw5Pz05NjY4PTk6QEJGQD49PEBCREA9QD9DO0A9PD4/Rk9t3N/e3t/f3+Dg4ODg4ODg4ODg4OHh4eHh4eHh4dbW1tbW1tbW1tfVrYZ6d32rn3l4entzdH+Dfm9xe3l6c3t2k4qFgImkzdnY19fX2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tna2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29vb29vc3Nzc3N3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vc3Nzb3Nzc3Nzc3N3d3d3d3d3d3dzc3Nzc3Nzd3d3c3Nzc3Nzc3N3d3d3d3d3d3d3d3dzc3OGtYVtebGJSTVZMTUdLS0RGQkI7QT08RUxDQT44Ojk6Nzc5NjY6NTs+QDs9Oz89PD89Ojk5Ojw5PEVDRkA/PkBDQkQ9OT0/QT1CPz1APkdPadvf3t/f3+Dg4ODg4ODh4eHh4eHh4eHh4eHi4uLW1tbW1tbW1tfQmH+Qh4N9eoN2e3Vzenl6kKqmd3JyfoeHh4CAfoKEhJHJzNnX19jY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra29va2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2djY2NnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vb3Nzc3N3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzb29vb3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3dzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3NzhpV9UYm1iUE9TSUhHRkpJSUJBPkJCPEVFREA+ODo4Ozc3Ojc4ODY+Pz07PDk9PDo+PTs6Njc7NjpEQUY+Pz8/PkNBPzs9PT47REM/PjxIT2fZ4N/f3+Dg4ODg4eHh4eHh4eHh4eLi4uLi4uLi1tbW1tbW19jYyH52doN+fnR2eIaCenl1d5yhu6GEgoCAfoeKinx/gYaMnKjO2NjY2NjY2NjY2djY2NjZ2djY2NjY2dnZ2dra2tra2trb29rb29rb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3d3d3d3c35pbT2drXFBRUElDT0pLR0xHSkJAP0FHREBBPDg8ODg1ODk3Njc3QEA/Ozw5Pj04PTw8Ojc4PTk/RENGPkE/QkBDPzw6Pj0/PkVEPz07S1Fj1+Hf4ODg4ODh4eHh4eHh4uLi4uLi4uLi4uLj49bW1tbW19XB3LRueHJze3B6eXaFiIR7eH2AgZiljH98fnuRhZaLhoGDgY6Rvd3Z2NjY2NjZ2dnZ2dnZ2dnZ2dnY2dnZ2dna2tra2trb29va2tva2tra2trb29ra2tra2tnZ2dnZ2dnZ2dnZ2dna2trZ2dnZ2dra2tra2tnZ2dnZ2dna2tra2tra2tra2tra2tra2trb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t3d3d6NWFdobllQUUtISlNJTUhNSUtBQz9DRkJBRDo6PDg2NDg4NzY2Nj8+Pjo8OTw7Oj09PDw4Ozw7RERERT4/PkI+Qj84PT8/Q0NCQEE+O0xUY9Xh3+Dg4OHh4eHh4eLi4uLi4uLi4uLi4uPj4+PW1tbW1teslLZ6eHJvd5V7dHuLgHh1bn6Fg3t/hYhyfH2bnI6JioJ+g32Hk5rH1NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2trb29vb29vb29vb2tra2tra2tra2tra2tnZ2dnZ2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2trb2tra2tra2tra2trb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d7Zf1lgaGxcUUtHR09LTk5PTURGQkg/Q0hEREA6Ozs4NzU3Nzc4NThAPkA7PDk8Ozw+Ojk7OTk7OUZERUI8QD4/PEBDOz5AP0A/Qj8+OjtKVWPV4eDg4eHh4eHi4uLi4uLi4uLi4uPj4+Pj4+Pj1tbX19vKhYR3cXJubniVhHt4hH95dnB4c3eLkY6CdnN9ioaId3d1d4ODfIiIk8Pb2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2trb2tvb29vb29vb29vb29rb2tra2tra2tra2tra2tnZ2dnZ2dna2tra2tra2tra2trb2tra2tra2tra2tra2trb29vb29ra2trb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f0nVZaGlqVk5KSE1OR01EUElGSD9FPUZMREM+Ozs8OTc3OTY2OTU4Pj4/PTs8QDs9PDo3Ozc5OThHREVCPUE9Qj8+QDw/QUE/QEJAPjs8S1Ri1OLg4eHh4eLi4uLi4uLi4+Pj4+Pj4+Pj4+Pj49fX19fEknuJf29sbnV2foSBg4qGfnVybWVtiIaKjoR7c4OHint4e4OPj4GEioqxztrZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29zc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tvb2tvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3dzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f3t7e4clsW2pqalNOR0hOT0VIRk1JSUA7RD5ISUA9PDo6Ojg2ODo3Nzk0OD08PT07ODw8PDw4Njc4OTo6RUJFQT9APEI/Q0M+PkNEQUBAP0A8PUtRYdPj4OHh4uLi4uLi4uPj4+Pj4+Pj4+Pj4+Pj5OTX19fZqXaFfnx3bHB3eXh8jH2KhYB3anN0d3p9bot7fnl6foR/gIGDfnh8foeGlrbT2tnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra29ra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/e3uO9amFpa2lRTkZNTEtKWE1OR0FAQE9BQz9AOzw4OTk5Njg2NjY4NDs+PD07OTY6Ojk6OTU4OTg5OkJERj8+Pj5AQEBCPzxBQD88Pj9BOT5KT17S4+Hh4eLi4uLi4+Pj4+Pj4+Pj4+Pj4+Tk5OTk19fX2sqKhIB5c29tcXN1d4CUeHaAfHWHhXd1cnWgmXp7d3Z5doR0bWxue3iAmouTu9za2tra2tra2trb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc29vb29vb2tra2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f397js2lpbmloUFBPTExPUk9LU0Y/RURERD48PDg7ODc5OTU2ODY2NzM6Pjs+PTc6Pjk5OTk2Ojo4NzxDRUc/Pzs/PkA9PkE9Oz0+OUFAQDhBTlFc0OTh4eLi4uLj4+Pj4+Pj4+Pj4+Pk5OTk5OTk5NjY2NjauY6AenZ1bmpveHCBfWt0cnZ3hIV5h4d5lY55eXp1d3pza298gHx2fYh8gLLe2tra2tvb29vb29vb29vc3Nzc3Nzc3Nzc3dzc3Nzc3Nzc3Nzb29vb29rb29vb29ra2tra2tra2tra29va29vb29vb29vb29zc3Nzb29vb29vb29vb29vc3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3t7e3t7e3d7e3t3d3t7e3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/f39/f4qpqa2hrZFNQT0ZQVFJOSFJLPkREQ0I7Ozk6Ojg2Nzg1NjY4ODg0Oz88Pzw5PDw3Ozo6Nzo6Nzo9Q0JDPUE+Pzw5PT5BQDs8PDtFQD47Q05TXNDk4eLi4uLj4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTY2NjZ1p5vdntveHh2cG50d3BwdHBzb36Jc3qGhY2EenNtcoB6hn1vg5OBdnx9g4a13drb29vc29vc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29ra2tra2tvb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4N/f3+KgbWhma2ZVVlJHUFFOS0xMRUJIRUc9OD08Ojo3Nzg2Nzc2NTY3NDg+PD09Ojg6OD46Ozc4Nzc6Oj5DRDtDQj49OD1AQUM/Pjw+RTw+PUJNUF/S4+Hi4uLj4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk2NjY3MB2doCCfnp4eHBsdXlya399bHNvdGdoaYB/aWl4c2d+iYl4cIKGe3d9foWKvd3b3Nzc3Nzc3Nzc3Nzc3Nzc3d3c3Nzc3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODflGttZm5mU1NJUFlUTEhGTkZGRUJGPTs+PDs5Nzc4NTc5NjQ1NzU4PDs9Pjo6OztAOTs7ODc6OTlAQkE8QUE/Pzk/QEJFQ0FAQEM7Oz1ES01g1uTi4uLi4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk5NnZ2tmYc3uqhJaCcnR1dn14aGx8d2h4d25rcHR5gIJ3dHyBhIJ9c3CAin94gn95g8je3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f4N/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh24tubWdzY1lRTVVbV0hDSUZOS0dCRD8/Qjo7OjY2NzU2NzY0ODc2Ozw7Pj86PDk8Qjg3OTo6Ojk6QUFCQUJDQEE+PT9CQ0NEQUJGOTg9REpOYtjk4uLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXZ2drcqHGCtXiRfnNsem6EgXaCfWtoan+DeHZ8dX2FhXRmcHl9d316gIqFe318foC03tzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3dzc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3Nzd3d3d3d3d3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e397e3t7e39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4ODg4ODg4tiFb3FrdWFWT1VVXE9ETUY+SkdKRUQ8P0I6PDk4Njg0NTY3NDc2NDk7Ozw7OD47PEE4ODo9OD04Oj09QEBAP0FCP0A+QENCQ0FBRTc2O0RMTmPa5OLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXl29ra3Z5sbnNxhY1ybXBuf391hH5rcnZ2enN4gXhzb3VwbWt2fHmFiIB/f392coODsd/c3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eDg4eHh4eHh4eHh4OLXhW1xb3ZeUldTWlpRSkhDQFFAQkQ8OT9BOjw5NzU3NDU2NjQ3NTY9PDo9PTk+OjxAODo6PDY7OTs+PUJCQjtBQkBDQEBEREM8PUA3OjxFS01l3OPi4uPj4+Pj5OTk5OTk5OTk5OTk5OXl5eXl5dPOxsB+cWxveHt2b3VuanNzbZKGeG50dG5vdIZ/b2twboJ0bXZyfY2DdnF/d3mKgabf3Nzc3d3d3d3d3d3e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3dzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t/f3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi1oZucG1xYFJZUFdfWUpMTElSP0Q9OTtCRjs6OTc0NTY1NzU0NjY2Pj07Pz45PTk7Pjg9Ozo0ODtAQENCQ0FCRkE/Q0BBQkREOz0+OTs8QkxNZODl4+Pk5OTj4+Tk5OTk5OTk5OTk5eXl5eXl5eW5t7Woc3JscHd6dHd4bXFydXd/hHRyc2xsa3F8bnBudGuBf3GAd32Eg355gHNygYqg2d3c3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh49WHcWxqbF5YWlVXYFZWUE9QTD1BOjs8RkE4Ojg3MzY1Njk2NTg1Nz89Oz8+OT04Ozw5PTs7NTo9Q0JCPENDREREQUE/PkJDQzw9Pjg5PENLS2PN0dnh1sjY4+Tk5OTk5OTk5OTk5eXl5eXl5eXltbW2q3J5cm59f3Z1d2hqaGlwb3Zta2tnZWZxdG15gG5teXd2iHhxa2podXV5dHV/wd/c3d3d3d3d3d3e3t7e3d3d3d7d3d3d3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHi4uHh4ePVhnFwY2lhV1NZV19MUk9STUtAPjg5O0E+ODc5NjQ3Njc6NjY2NDk+Pzo8Pzo/OTo6Nzo9PDk5PEFBPTtBQ0VDRkA+Pj5BRUQ+QEE3OD5GSEpesrW4wbm1u8jg5eXl5OTl5OXl5+fn5+fm5ebm5ra2tbWOfX5weoR1cnZnYmNlbGtyb2ZpbHZtd4Z9hXlsbHd4a3ZwfH14c3V5fHd2h7ng3d3d3d3d3d7e3t7e3t7d3t7e3t7d3d3d3d3d3t7e3t7d3t7e3t7e3t3d3d3d3d3d3d7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4eHj1Yd1bl5uY1pUU1hXS1NLSk1SR0E4Ozs+PDk4NzU2NTY2OTY4NjY5Pzw6PT07Pzo7Ozk8PDs5Oj4+Pjs8PUFEQkNBQEBBP0JDPDw9Nzs+REVKXrG1tLW2t7e2y9rJ3uXl3eDi3tXU1tPU4OPg39+2treuh3t/bnmNenJ1bWNobGxtaXR4enF5enqIh4N6aWh9cWRvcXyGgX55e318e4an2t7d3d3d3d7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4uHh49aGdmxhb19dV1lcWlJQSEpXTEVHPUA9Ozs9OTY0NjU1NTg2NzY3OD87OT09PDw5OTw6Pjw6OTg+Qjs7Pj5AREBDRUFAQD0/QDw9PTU5PEJHRl2xtbW2uLm5ubq9uMPT0r3BwcC6u7y6u8TMxb/Dt7e3hGl1gX1ndYd5Z3Vxa2t5eHB3fH15bWl3e3h3bml1j4FwbHl4d3d9gXuGgnmAoNze3d3d3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODh4OHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4ePXhXJrZ3RhW1hYX15TVVVRVUpMRj9JRDs5PTY2NDc3NTc4Nzc3ODk8PDo+PDg8Oj0+OTs8OTs5P0E8PT9DP0FARUJCQTw9Q0A6Pjw1NDlER0dasbW1tre5ubm5ubm3ubm4uLm5urq6urm5urm6u7e3uX9ucHN6b3B/eXNuc3Vsc3Z4cXFwb2tvcX6Bc2mHhIF9dHOHdW11hYmBgHJ2hafd3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uHj14lxa2xyW1dXXWBUUVVUUFJPSkNATUE9Ozk2NTM0NjQ2ODc3Nzk6Pjs8Pjs5PDo8PDk8PTw7PT0+PUNEREBDQkE/QD48PkE8OD06NjY6QkpIWLG1tLa2uLm5uLi5uLe3uLi5urq5ubi4uLi6uru3uKx7cnhxf3ZzfnBsbXpyZ29sbW50cHt3d3Jyd3pvhpJ2f3x8enZ5fH9zfYdyda3T393d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4eHh4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi49eHb2pxalVWV2FbT1FSUE5XSURESUo/Ojk6NzUzNDk1NzY2Nzg4Ojw7PD46PDo6PTw5PDw9Oz09PDs9REdEQ0E8PDw8Pj5AOzg8ODE1OkFGRVautbW1tre4uLm4uLi4uLe4ubq5uLi3t7i4ubq7t7mqcnB4d3x7e4J3aG5xam9qY2lyf21zcn54dHFsanaAeX2AgH91doB1a4qLgHaR1d/d3d7e39/f3t/f3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f4N/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLi4uPYhm1sdGVWUFxnWE1YU1JRWUVDS1BOOzk4ODc1NTM5NTY2NzY4Nzk+OT0+OTw5OTw7Njg5OTo8QEA9PkBGQEJCQDo+PEE9Pzs7OzYxNjxCR0RQqLa1tba2tre4t7i4uLi4uLm6ubi4t7e3t7e5ure2tIlyd3h9iXxwem99c2hqbGdnbHRscXd0cWx2c3Fxd3FyfHl4g3Z7d2mLkYp9kM7f3d7e3tvY2drZ297f39/e3+De39/f3Nvc3N3e3uDg3+Dg4ODf3t7e39jS397f397e3t/f3t7f3t/f3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLi4eLi4uLi4uLi4uLi4uLj4+Lj4+Li4uPj4+Pi4uLi4+Lk14NoZ3VkVlVkZVdKWllXW1Q9RU1LSD04NzU3NjQzOTQ0Nzc1Njc5PTo9Pjw9PDk7PDk5Oj45PD4/PkFBQ0FFRUQ+OzxBPjw5PDs3Mzc+REhFSqG2tbW1tbW2tre4uLi4t7e4uLi3tra2tra3uLm2traLfXpsbHp/cGx5dm5qaGdlcXp4b2lvb3B1c21zd4Fnb32CgYNyf3lqcHJ6f6ng393Zy8a/vL2/vsLN0tDW3tnc4NfQzcPCw8PH1dfT2dzX1NjX0MfExce9vM/Kz87Y3djO3N3c2t3T0dze39/e397e3t7e4N/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eLi4uLi4uLf4uPi4eLg4d7W29/Sw8rJx9Hb3OLk4eHg2dre1sbExcTN2trf5OHi4trX3st9aWZxYVleZWFNTFRLUlpMO0hNSEZBPTc2NjUzNDY2NDg3NjU2OTw7Pj46Pjk5PDk3OTs7Oj49PEBAQ0RCR0ZCQT08Q0A9OTw7Nzc3P0RGRkaZtrS1tbW2tra4uLi4uLi3uLi3s7W2t7a3t7i5tba3opdxb29waW50dnFmZWNrbmdvcm1mZ2tygWVvdnyAeGRzj39zaHFyaWVlbm+w39HFv7u5ubm5ubq6uru6vc3Gw8e/urq6uru7u8HCvcHFvby/vry7urq5ubq6ubm6w8XDucDDwby/ube/z8/U3tjc3t/g3tLa4N/f4ODg39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eDg4ODg4ODg4ODh4eHh4uLi4eDh4uLi4uHa2t3RwsPCu8XT1uDdydPDrrnAsaqrq6uwtLbJ0sXRxLG4v7Srq6usr7S0vMzE1c60tLureGxtbWBdYl9ZS1NVVFFQREBRTUhEPzo3ODU3MzE1NjQ5ODQ2Njo8Oz08ODw5Njo6ODg5NzU8PDw/QEFAQkRDQkE8PkI/Pz09PTc1OD5DRUNAj7a0tLW1t7i4uLi4uLm5uLe1sautr7Oxs7OztLS0tqaei2tue3ZxeXhnY2hfcXdha25vaG99b25ja2lseHdsa4Z+bHB6dm1scG95sca8uru7urm5ubq6urq6urq6urq6urq6urq7u7q7u7y7urq6ubq7u7q6urq6urq6ubi3t7i4t7e2tbW1tbi3u8e+w8XHzcS4wMnH0tzZ2d/e3uDf39/f4ODh4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh3Nji4uLi4eHh4OHg3tfGxtHQztTe3tPO0t/SuLi8sq2trKysrrG+ua63rKipqamqq6urqqqqq6ysuKyqqqqrq6urra6urq6urryzrayrpHlub21fXl1dVE1SU1xUSkE/UElIPjg5NjgzNzMwNTczNzg1NzY2Ojw/PDg5Ozo6Ojg5OjY1OTs8Pj9EP0NFQkNCP0BAQT9APjw3ODc6QUVEP4W4tLS1tbe4uLm5uLi3t7SurKuqqq2urq6vsLGzs7WjcG5ucm1wg311aWFlaGZkY2Rxc21td25naW1tZXBzb29zcXN8h4F6dX11n7u6uru7urm5ubm6urq6urq6ubq6urq5uLm5ubm6urq6u7q5ubm5ubq6ubm6ubm4uLi3t7e4uLe3t7a2tbW2tra1tbW1tba1t7e3t7rBvrzGycrb3+Dg3tvd3d7h4tDW4uHg4ODg4ODg4ODg4ODg4OHg4OHi0768zNjd3OLg0dnbxL23sLCxsa+zu7uzsLS9s66urq2tra2sq6qqqqmpqKmpqampqqurqqqqqamoqampqampqaqqqqytrq6urq6urq6sraR4aWJxZmFZWlZRUk5cU0Y9QlJEQTc8OzY5NTY1NDU2NTg3NTY1Nzg7Pjw7OTk5Ojg3Nzk3Njg8Oz47RD8/Q0BBREE+P0M9Pjw+Ojo3Nz9DRj54srCztLW2t7i3trKurq2sq6uqqaqtraysrq+xs7S1t4xucnRqaIB5ZmpmZWxdaG5waGxxYmNmcoJ+dmhobGpueoaBhXx4cXF5gK+6ubq6urm5uLm5ubm5ubm5ubm5ubm4uLe3t7e3uLm5ubm5uLe3t7i5ubi4uLi3t7a2tre3t7e3tra2trW0tLW1tbW2trW1tre3t7e3t7e3tre4v8bP0MS+v8DE19e8ydra4OHg4ODh4eDg4ODh4eDb3t7Uzby3tre6wMDJxLfIvrKwsLCwr7Cvrq6ur7Cwr66urq6uraytrKurq6qpqampqampqampqKmpqKmpqampqKmpqKmpqqqrraytra2ur66trK2heWpjbWdiXFhRUFFLVEpCOklRP0E3PDk0OjU2NTQ1NTY4ODY4Njs6OTw9PTs6ODY2ODg6ODY3Pj09PT5BQUVCQkNBQUBBOj09Pz05Ojc9QUc8bKqmqKutsLGwrqupqKqrq6mpqamrrKytra2usLO0tbilgIdvaWdzdGZrcG1qZGxvcm5rbWNrcHyJhG5qbHx4Y3uKfnNqc25rcY+7ubm5ubm5ubi4ubm5ubm5ubq5uLi3t7e3t7e3t7i5ubi4uLe2tra3t7e3t7a2t7a2tra3tra2tbW1tba1tLS0tbW1tra2tra3t7e3t7i4uLe2t7a2uLm4uLe3uL6+uLq9vcfb4OHg2Nnd4eHg3dfKwcPCurm5uLe4uLi3tbS0tLKysbGxsLCvr6+vr6+vr6+vr66ura2srKyrq6yqqqmoqKmppqepqaehpaipqamoop+hoZyip6inqausrK2ur7Cwrq2unXdwbGphY2BZUU1RTFJGQzlNUEU+ODs3Mjc5Njc0NDM1ODg3OTc7OTo9PTw6Ojk3NDo5ODY1OD8/QEI9RENDQ0FDQEJBQDtAP0A/PDw6O0NIPWOopaWlpqioqKenp6ipqqmoqKipqqqsra6wsLCztLW1taWYdn5xZmt4cW9tZmVsaGNsZ2ZpaX11bWlvfXZ5hWZod294b3Fvcninu7m5ubm5ubm4uLm6ubm5ubm5ubi3t7W1tba2tre3t7e3t7a2tba2tre2tbW1tra3t7e2tbS0tLS0tLS1tLS0tLW1tba2tra2t7e3t7e3t7a2tre2tre3uLe2t7i4t7i4uLi4wMXTyry8w83PyMC9urm5ubq6ubi4uLi4t7W0tLSzs7KysrGwr6+vr66urq+vr6+uraysrKurrKysq6ehoJ6gn5udoaGdlpmkpKaon5mZmZmanZ+gn56fpKqtrq+ura2srJl1cGlrY2FeXVVOU0tSREQ4TktHQTo4NTI2OTY1NDczNzc3ODk3OTo7PT0+ODg4NzU6OTk1OD9AQEFEPkZBQkNAQkNCQT88QEJCQD0+OjpERj5cpqWmpqampqanqKenqKioqKenqaurrKytra2ttLS0tbekc311bnONf3JmanFjaW1jaGZobG51aV9jZ3VzdnpuZ3Bwcn56cYihu7m5ubm6urq6urm2s7a1uLm2trW1tra1tbW1tbW3tra3tra2tbW2tbW1tbS0tLa2t7e3tbS0s7O0tLW1tLS0tbW1tra2tra2t7e3uLe3tra2trW2tbW2tra2tra2tra3tra3uLi3uri4uLi3uLi5ubm5urq6urm4t7e3t7W1tLS0s7OysrKxsbCwr66urq6urq+vra2srKuppaSmpqScmZubmpmampmXl5eXl5aZm5iZmJmZm52en5+dnJ6gpKWko6OioqKQdG5jcGFeXltUU1RIVEo/PFFCRkM7ODYzNzo1NTQ4Mzg5OTc4OTc7OTs9Ozc6NzU2OTk4NTg+Pz9ART5CPz9DPzxBQUI/PT9EQT8+PTk9Q0Y/VaSlpqanqKeoqamop6ioqKioqKiqrKuqqaipq7W1tba5o3eKcXKHhnd0cGh5a2JjYWVsaW5zal9jZWNjZWprYmRqbHaXjX6ovbm3tre5u7u6uLWxrKurqq6wrKyrq62tq6uvsLGvr7CytbW2t7W1trW1tbW1tbW2trSvr7O0tLSvra6vsrW0tbW1tbW2t7e3t7e3t7e3t7e3t7Owsra1tLa2tre3tra2tbW1tra3t7e5uLi4t7e3uLi4ubq6urq5uLi3t7e1tbS0tLS0tLS0s7OysbCvr6+vr66vr62oo6KgnJqampqZmZqbm5qampqbmpmZmZiXl5aYmZmZmpycnZ+foJ+goKChoaCgoJ+fi3RuaXRdYGZeUlRLRFRJPUVTSEVCOzo0NDY5NDQ1NzM4ODg3ODk5Ojs7Pz04OjkzNTg5NjM5PT5AP0A6QEJCQkA/QEJCPz0+QUFCPz06PkVDQFGjpqWlp6inqauqqKaoqKipp6ioqKinp6ioqaq1tbe3t7KZtH99kIx1Z2lqbGZjYGNoZW94cGlicXx5cGpmZmRma3NqhYystrKwra2ttLeysLCtrKuqqaiop6ipqampqKinqKipqaeoqqurra2sqqytraysrq6traunpaSnqqyopKOkpamwsbGztbW2t7i3t7W1tre4t7e3t7Kppaasq6ivtLa1s7W3t7a1tbW2tra3t7e3t7a2t7e3t7m6urq5uLi3t7Wxs7S0tLKxsK6sq6yurrCxsK2rqqmqqKijnJqZmJmYmJiYmZmZmZmZmpqZm5ubnJybmZeYmpqcnJydnJ2foKGhoqKioKGgoKCfnop1amtuWVxhVktPREdVRz5PV0hEPTw4MzQ0ODQ1NDgyODk4ODk6Ojw5OUA8Njk6MzY3OTE0PD8/QEBBOkNGRUJBREJDQTo7P0FCQz9APUBEQ0BPo6empaemqKqqqqakpqenqKioqKimpqaoq6uttba3t7e4rbJ1cHuDdmBiaWtiZWZhZGdmfYh5bHKAfXFvcXhjbW5xZo+srKurq6ysra6urK2trKyqp6WmpaWlpqioqKiopaeoqKioqKeoqampp6Wko6KioqOioKKioaKhoKChoaKjpKOjpaWlqLC0s7OzsKuqqaqztLa3trGopaOioaGipKiqqairs7Sxrq6xs7W2tra3uLi3t7e3t7e3t7a2uLe0sa6ppqerrKmnpqWkpKSkpKWnqaajoJ+enZycm5uampmZmJeXmZmZmJiZmpqampqampqbm5mYmpydnZ2dnZucoKGgoaOjoqCgoKCfnp2FdGtsaFdYU0pHTUVITUdAU1dGRz09OTM2Mzc0NTU3Mzg6Ojo6OTw9OjpBPDY9ODM3ODgzNztAPz9AQDpCRUNAQkRDQT87PEBDQkNBQDxBQ0A9TqKnpqanp6mqq6mkpaWlpaaoqKippqanqKmpqrW2tre3t7izc2h7c2JnamtpaWJhZGloXV1tfHJma3J/fHR8bm1zc36gqamrq6uqq62trKusq6mpqKWjpKampqWmp6eqqaamp6enqKinp6iop6WjpKKhoaGhn56en5+fn56foKGho6Wko6OkpKSmp6enpqWkpaampqeqraumpKKhoaChpKWlpaenpaeoqKalpaivtLa3trW1tra1tbOwrKupqa6rqKWlpqampaSkpaWlpqWkpKSkpaKhoaGgnp2bm5ucm5qamZiXmJiYmJiZmpmZmZmYmZmZmZqZmZydnJycnJybnJ+fn6ChoaKgoKCfnZ2cgHNrbmReU0pITUZETEtFRFFTQ0c9PDgzNjI4NDY0NjQ4OTg6Ozk7Pjw5PTs5PTczNTk2NTY8QD0/QD88P0JDPkJCQj89Pj5CQ0FFQD86PkVAO0+jpqWkpqeoqaelpKWlpKWnp6eoqKanp6alpqa1tba2trW2uYptcW1vfHxxZ2pmYGFsYFROW2hqbm9tgYJ9cWdxdn6aqKeoqqmpqqurrKqqqqimpaWkoqOlpqalpaWmqaqppqWjpKWmpqSjo6KioqKgoJ+fnp6cnJycnJ2dnJ2en6CioaKjo6KhoqKkpaSioqOjpKSjpKSko6Ggn6GipKanp6ipqaelpaSipKSlqK2wsKyrqqusqqmnpaWmpaWlpaalpqioqailpaWkpKSlpKOjpKOioaGhoqKgnp2cnJubm5qZmJiYmJmam5mXl5eWlpeXmJiZmpqcm5qampubm5ucnJ6goKGgnp6enpycm356bnJiXlNNSlBFRk5NQkBPRT5JOz01MzYzODM2Njc1Ojs4OTs5Oj49Ozo5OT03NjY5NjU2PkI+PkE/PT5DQT5DQ0BAO0BAQkJCRUA+Oz5FPzxQoKSjpKOjo6SkoqSlpaSlpqamp6empqalpqaltLW1tbS0tbiBaHx9ZXOCemxwdWFfY1ROT1FbaGxpbGxxbW5xbnScoqSnqKioqauqqqqqqaempaSjo6OjpKSlpqalp6ytqaShnp2eo6Shnp6foKCenJ2dnJycmpqam5ucnJubm5ydnp6foKChoJ+goaOioKGjpKSjoqSlpaWkop+go6SkpKapqainpaGdnJ+jpaipqainqKioqaempaWkpKSlpqampqampqenpaWko6Ojo6KioqGhoqKhoqOkop+enZ2cmpubmpqZmJeXmJaWlZSUlJWVl5iYmpubnJuampqam5ucm5ucnp+fnpucnJyam5p/fnF0YFtUTUdNSEZMSj8/TkM8QDs8NDM4Mzc0NzY3ODs9ODo6OTk7PTs7ODk9Nzc4OTU4OD9APT9BPjs9RD89REA/PzpAQUE/QUVAPjw8Qz88Tp2ioaKioKCipaSkpKWlpqenp6empqampaampbW1tbS0tLS3jHalsXdmc3Jvc2xjZGlYT1JRT09dgG1kYFptkZGSoqKjpaampqenqKiop6alpaSjoqGhoaKjpaempqesrKemoJ2cm6Ghnpuamp2cmZiam5qampmZmZubm5uampqampucnZ6goaCfnp+hoJ6foqOko6Omp6inqKWioKGhoaGkpaWlpKCcmZmbnqOmpqampqanpqempaOlpKWlpqiop6enpaWlpaWkpKOjo6KhoqKioqKhoaKjo6Kgn56enZybnJubmZaUlJSTk5OTk5SUlJWWl5qam5ubm5qZmZqanJ2dnZ2dnZuampqamZqXf3dvc11aTkhKTkdFRklERU5APD09PDQ1OzQ2NDY1Njc5Ozg5OTg5OTw7PDc6Ozc4ODg1ODg/Qj9BQTw+P0A8PEJAQT49QT4/Pz1CQUA6OkA8PE+doqGfoJ+dn6OkpKSlpqeoqKenp6ampqampqW1tLS0tLS0tbSXtqd1Znh2Y2xjY2VjW1JTU1JNXqCMeFhodpajnp6hoaOjo6OjpKSlpqalpKSioaGko6OjoqOlpqWmpqenpp+bmpuioJmWlpWam5mXl5iYmpqYmJqampqbm5qZmZmenZ2goqOjo6KkpKWinqGhoaKjpaampaSjoaCgn5+hoZ+goJ2amJeZmpygpKOjpKWmp6alpaOjpKSkpKWnp6ampqampaWmpKOjo6SjoqKjpKGfoKGhoKGgoaCfn56dnZyamJeVk5KSkpKSkpOTkpOUlZaZmpqbm5qampqbnZ6enp2cnJybm5qamZmZlH10bHReWk9IRUdGQkVORT9GOzo+Pzs0Njo2OTM2NDY4ODo4OTc4ODo8Ozw5Ozs6OjY3ODk5Pj9APjw9QD5AOjlAQT89QT8/QUE+QUE/Ojk9PjpQnaCfnZucnJufoqOlpaWlp6iop6ampqanpqantLS0tLOysrGwsK2rkHiGj36bmn93Yl1TUlFRTGKgootaiKCgn52YmZycnZ2eoaGgpKenpqWkoqGjp6alpaKipaampaanpqagm5mboaCXk5OSl5qcmpeXl5iampmampqam5qYmJmaoKCgoKGfoaKipKamop6gn5+goaOko6Khn56enpyanZuZmpqZmJeZnqChoaKioqKkpaWmpKSkpKKioqKkpaWlpaWlpaalpaOko6KioqGgoKGgnp+fn5+fnp+foJ+cm5qZl5WUlJSTkZCRkpKSkpKSk5SVl5iZmpmZmpqam5+fnp2cnJycmpmZmpiXl5F8cmdxXl1QRj9BRD9KT0JCRjhDRT4+OTg7Nzc0ODQ1OTo6Ozk3OTo8Ozo8PT48PDo2NzY5OD4/QT47Pz49PDg6PkFAQUE/P0FCQERBPjo4PkE8U5ycm5uampycnaGio6KjoqSmp6alpaampqSjo7KysK2rp6amp6alpqiln6iop6qnoXmEXFFST0xcnKCAYpmgnp2clZOVlpeZmp2dnqGmpqampKOioqanp6ajpaampaWmp6amop2cnqGfl5GRkJSXm52YlpaWmJuZmpqampqZl5iam6Ghn56fnpybnJ6goJ6dn56fn6Cio6SjoqCfnp2ZlpeXl5iYmZubnqKioqKioqGio6WlpKOio6SioaGhoqOkpKSko6SkpKSioqKhoqGgn5+gnp2enp2dnZ2dnp6em5mYl5WTk5SUk5KQj5GSkZKSkZKTlJaXl5iYmZqampyenZ2dnJubmpiYmpmXlZaNempmamBiTkY+P0A9SkVAQ0A7QEE8Ozs5Ojc2NTg0Njc4OT04ODs6Oz87Ojs8Ojk6Nzc2ODs7Oz08Ojo8PTw3Oz5DQkRDPz1BQ0FEQT88OkBCO1eZmJqamZmam5ucnp2foqKhoqSlpKSlpqSioJ6op6alpqWlpaemp6ampqakpaanqKehqXJOUU1KVJahenKanJyenJeVlJWWmJiXl5qeoqKhoqOkpKOjpaalpaanpqSlpqalpaOgoKGhn5mSkI+WmpmenJaXl5eZm5ycnJqamZeZm5uen52cnZyZmZqcnZydnp6fn5+hoaCgoaKgn56bl5WVlZeanZ6fn6GhoqKio6OhoaCgoJ2cnaGioqOkpKOioaSlpKOko6SjoqKioqKhoKGfn52cnZ2cnJ2dnJ2enpqXlpaVlJOTkpKSkpCRkpKSkpGSlJWWl5iYmJiam5ycnJycnJ2cm5mYmZiWlJWXi3hsY2RiZFFHQT1DO0tIRDo7Ozw+OTo6OTo3Mzc5NTo4ODg8OTg7OT09Ozo7Ojk8PDc2NDc/PDo9Ozw/Pjw7ODxBQ0FDQkI+P0NAQkFAOj9APztZmZiampqam5ubm5ydoKGhoaGhoqKioqKhn5+dpKWmpqenpaWmp6ampqWkpKalpKSkpaaGUFJQT0+PmHB6mpubnJ6cnJycm5ubmZiYm56dnp6foKOkoqGhoqKio6SkpaalpKOjoaGhnpyalZOUmJuam56amJiYmJqcnpyam5iWmZybnJycnJydmpqbnJ2dnp6dnp6fn52cnJyhoaCblpWVlZacoKGgn5+hoKKjoqOhnZuZlpaWlpicnqCip6ikoaCgoqOjoqKioKCgoJ+fn5+gnp2cm5ucnZydnJmanJuWk5KSkpKUk5KSkpKSkpOSkpKRkpSVlpeYmJiYmZqcm5qbm5ucnJqZmJiXlZWWl4d3ZGdoZGJNQ0U8RDlJSkU5Ojs9PTo6ODg6NjQ3OTU8OTY4OTc5PDs7PDo6PDs6PDw4Nzg3Pj07Pj46Qj86Ojo/QURCQ0FBQD9EQUFAPjpAPj06W5qYmZqbmpubm5uen6CgoaKioKCgn5+enp2dnKWkpaanpqWlpqakoqKio6Oko6Kjo6KnllRYVVJOZ21rgZ6am5udn6Cgn56enp6dnJ2dnJ6enp+goaCfn6CgoKGio6Ojo6OjoqGgnpuZmZiZmZmamZienpiYmZmam5qWlZeWlZicnJ2cm52dnpybnJ2cnZ6bmJqeoaGdm5udoKKhmpWVlpaZoKKgnZueoKGjop+em5eXlJKSlJeYmZ2goqenpaGgn56goaGioaCfnp2cnJubnJubmpqZmpydnJmXmZaVk5GQkJCPkZKSkpKSkZKTk5OTk5OTlJWWlpeXl5manJubnJucnJqamZeXlpaVlZSEcmZsYmRbREJMPT84RktCPEA+Pj05Ozk6PTg1ODg2Ozg1Njo4PDw7Ozw8Ozk8Oj09OTU4Nzw5PD88OkE/Ojo6QEBDQkRBQ0A/Q0FAPj08QD09Ol+al5mamJeYmpycn5+foaGhoJ+fn56foKCenZ2lpKSko6OioqOjoZ+foaGipKOio6SiradXXl1UV19ua42dmpqbnJ6dm5ucnZ+enZycnJydnZ+goKChoaGgoKGgoKGioaGioZ+enJqampqbnJqZmpuZnJ6ZlpaWl5eTjo6QlJabnJuam5udn52cnJycnJ6dlpSZnJ+in5ycnZ+hoJuXl5mZmpycnJubnZ6fnZqXlpaWlJOTlJiampqfoKGmpqWgn56fnqChoaCenJubnJybm5ybm5qZmJmZmZmXl5iVlJKQkJCQj5CSkpKSkZGTk5aYl5STkpSVlJWWlZaZmZmam52cnJyampmXlpaWlpaQgG9vZV5gV0BKSDg/N0lFP0VBPD07Ojo8Ozs3NTs4Njs3NDY6Oj47Oj0+Pj07Ozs+Ozo4Ojk5NkBBPTo8PTo6OT9BQ0JERUM+P0FBPz8+Pj89PDtgl5WXl5aVl5mbnqGhoKGioqCenp6enqCgn52bpaWkpKSioKCfoJ+dnZ+hoqOjo6OkobCjXWVkYGFua4GenJubm5ubmZianJ2enJubm5ycnJ6ipKGeoKGhoqKhoKCgoaGgn5+enJqZmpubm5ybmp2dm5manJiXlZWWkY6Nj5KYnZycm5ycnqCdnJucnJyempWVm56foZ+dnJyenp2cmpqampqampqbm5qXl5aTkpWVlpWTlZaam5qanZ6foqWjnp6fn5+en5+enZ6fnZycm5qcmpqbmpiZmJiYmJiYlZSTkZCRkJCQkZKTk5CRk5SYmZiVk5SVlZWWlZaXmZmXmZqenpyamJiXl5aWl5eYjX1ubV9lVlRFSzw3PjdSRUM+QkE4Ozw7OTg6ODY7Nzc6Njc5Oj0+Ojw8PT49PD06Pz06ODw9OTtAPj4/PT45ODs/QkNAQ0VDPT9DQj5AQD5APTw8YZWSlJWWlpeanJ6goKCgoaCgnp6enp6gn56em6WlpKSioJ+fnp2dm5mbnJydnp+gn56rmGNpbW5pZm2enZybm5ybmpmZmZqam5ucm5uam5ygo6SgnZ6en6CgoKCgn6ChoKCfnpuamZqam5qbm5ufnpyZmJqamJiYmJKOj5OXnJ2bnJ2cnJycnZycnp6dnpqVl5ygoaGfnp2eoJ+cnJuampqbmpqYmpmVk5OTkpOWl5eVlJiYmZucnJydoJ+gnp6enp+fn56en6KjpKKgnp6cm5qampuZmJmZmJeXlpWUlJORkZCQkZKTk5OSkpOUmJmYlpWUlZaWlpaWl5iYmJiXmZqamZeXl5aXlpeWl4l4dmddX1dURUU5OTs8WT5AOEI/OTs7Pjk4Ozg6Ozc5OjU4OTs9PDk9Oz0+PD0+Oz8/Ozk+PDw+Pz5AQUE9ODc7QkNFP0FFQz1AREJBQEQ7Oz47PGKWk5SUlpWUlpiYmZubnJycnZ2cnJ2en56dnJqkpKSkoJ+enpybm5qZmJiYmZucnZ6cpolla3R4bVuFop2dnJydnJqbmpqampydnZ2bmpuboKKinpucnZybnJ2enp2dnZ2fnpyampucnZybm5ycnp6cm5qanZqam5yVkZOXm52dnJ2fnZycnJycnZ6fnp+cl5idn6GhoJ6cn6CfnJubm5qbmpmZmZmZl5WWlZaYl5eXlpaYmZuenp2dn6GhoJ+fnp6fn5+dn5+hoqKhoZ+fn5yZm5qcnZuampmXlpaYl5eXlpWTkpGTlJSTlJSUlJaZmJaVlZeZmJeYl5eXl5eYl5iXl5eXlpaYl5eVl5eDeHZfW11eUT1GOjk4P1VDQTtDQzo8Pz86Ojk3Ozg4ODc0ODk8Ozw4Ozs8PTo9Pjo/QT06PTw+PkA/PUBBPjk2PERDRUBBRUU9PkVERD9COzo8OTpkl5SVlZaUlJSUlJWXmJiamZqcnJydnp6dnZybo6Oko6CenJuamZqZmJiYmZiam5ubm6WJa3F2em9lmp+enp2dnJybnZ6dnJ2enp2dnJydm5ygoJuampubmpudnJqampucnJuZmZycnJ2dnZ2dnZ2dnpybmp+fm5ydm5mZmZudnZ2dn52dn5+dnJydn5+fn5uanZ+goJ+dnJ6gnpubm5ubm5yampuamZudnJqZmJeYmJiYmp2foKCgoJ+hoaGgoJ+en5+fnp6foaKhoJ+enp+enJqam5ubmpqZlpaXmZmYmJiWlJOUlJWVk5OVlZSVlpWVlZSYmZuamZaWl5WWmJiWl5OUlJGRk4yRkJOWfXhqYWJiXFA8QDw2OENWSERCOjg7Oj47Nzc5Nj06OTk2NDc6Ozw9OTo6Oz87PT08QD47Oz46PT89PkBBP0A8NztBQ0U/P0REPj9EREM+Qj07PDs6Z5aTk5OTk5OTlJSVlpeWl5aWl5mbm5ybm5uamaOjoqCfnpuamJeYl5eXmJmYmZybm5qkgGpqb3lzcZegnp2dnJydnp6enp+enp2cnJydnp2bnJuampqam5ubmZiYmpqamZmZmJqdm5ydnZ2dnJ2cnZ2cm5qdn5ucnJubnJubnZ2dnJydnp2enZydnZ2cnJ2dm5uenp6dnZybnpubnJycnJydnJubmpmbmpmYmZmYmpmZmpyfn5+jpaKfoaKioaGfnqCgn5+fnqCioaGhn5+fn52ZmpudnZqZmJWWl5aVlZaTkpOUk5STkJCSk5GUkY+OkJGOlZabmJWYlJmXlJiRjJCPk5yTkoyFjIeDhndxZ2pkW1xRQT44NkJHYEJFR0A+Ozw7Ojg4NjU8ODo4MzQ6Njk9PTk5Ojs9Ozw6PD48Oj5AOj5APjw/QD8+PDg6Q0FEPz5CRD8+Q0VCPUJAPDw8OmeYk5KSk5OSk5SVlJWXl5aWlZaXmZmZmpqampqkoqCfn52bmpmYmJiXl5iZmJmcnZ2cqH1nZXN7enOJop+enp2dnp6enZ2enZ6enp2dnZ6cm5ybmpubm5ucm5iYmJmZmJiZmZmbnZycnZ6enp6enp6dnZybm52bnJybnJ2dnZ2dnJ2dnp+fn52cnZ2dm5qbnJmZnJ2dnZ2dm5uanJ2dnJycnp2dnZybmZeVlZeXmJqam5ubnZ6foqOhoKGhnJucm5ubnZqcmZycn6CfnZiZmZmUkpKUl5SPj4+OkYyNiYuQi4mLjpGRj4mQmJiQkoyNi5KQj5iYoqiqpqWlrKOmoZqep6eyqKKVo6Cfl39wcWlsXFtcTUY8NzdHR1g+SE5URjk+Ojg5ODc1PTk4NzMzOTY6Pjw6Nzo8Ozo6Ojo8PDs/PjtAQD47PT5BPDw2N0A+QkA+QUY+PEFEQT1DQj49PDlmmJSTk5OTkpOUlZOVl5iYmJaXl5iZmZqampqaoqGfnp2cm5mYmJiYmJiYmZmZm5ybnKx/am16f3lxh6Genp2cnZ6enp6enp6dnp2dnZ6enJubnJubm5ubm5uZmJiYmJiYmJmZnJ2dnJyenp6enp+fnp6dnp6dnJydnJ2dnZ6fnZ2fn56goJ+enZ2dnZybnJ2em5qbm52enZ6dm5ubnJ2cnp2cnZqYl5SRjo+QkJGVmJSWlJiZmpudmJuYlY2Mjo6TkpKRj4mQjpGRjo+Ki42NjYiIi4+Lg42NkY+MkI2Qk5WVnJihoJySn6SipKmam5eanKOprb3Bwbq8uL26ucC8ubq3uru7tL2zwbV/bnVmZ1peWUxJRTo7TElTPFZSSUM6QTo7Ozc3NTo6OjgyNTY4Oz08OTk7Ozw5Nzo4Ojw6PT85PD8+PDw9QTs5NTg8O0A/QT9EPTxBQkA8REM9PT06YZOTkZCUlJOTk5OTlJeYlpeZmJmYmZqbmpqamp+gnp+fnJqZmpqampmYl5iZmZmZmZmphXB1e4B3b4mhnp6enp6fn56en56fn56dnp6fnp2dnJ2cm5ubm5ubmpiYmJiZmZiam52cnJ2dnp2enp6goJ+enZ6hoJ6dnp2enZ6fn56en6CenZ6enJydnZ2cm5qYnJuVmJqamJiYmJmSjJCXlKCXk4+MjYqKiImMiJORh5CPjYqKkJCLjoqMi4+IiImJjpGOjYaFiYaKhoWLiI+SkJCNkJKXlpKamJ2TlJ6kpqaqq7Gsr6+rpquqsbm5tbS0rqyvtMDIxcXBvsbDxMTDurW+t7a0s7C2tb6qcHRyXGZfXV1JRj8/RUtMVklcTEQ/PUI6Qzk5Nzc7OTk3MTc5ODo+ODg6PDw7OTc5OTs9Oj4/OT5BPDs+PD46OTY5PDpBPkNBQT08QkBAPkJEPj8+OVyHhIOHi42KiYaFgYqMkZOVmJiHlZaWkpiampmenZ+gn52ampubm5ycm5iWmJmXl5ibqo56dXZ7f3mCoJ+fnp+goKCfn5+foKCfnp2dnp+enp2dnJqbm5ybm5uYmJiXl5iZm5ucnJydnp6enpybm52dnZycoaGfnZ6dnZ2dnp2dnJiWlpaYlZWSlpmWk5GKjI+PjI+NkIuLj4+WiYiEi5GZjn2Fi42PjYyHioyQm4yRj4+Lio6TjIyNjIiSi4yFiYyPhouIh42KhYyEj4qXkJOYmpWbnKOqoaKknKKrsbe0ubWxs62vsrKlp7O6sbq6vLa3tsDDw729vLa/urq8wbW4wL60r66mqa+3mm58Z1tjWl1fSEU+QUtJU1hZXkFGOTk9OUY/Pzo3Ozs7NjM6Nzo5Pjg6Ojw9OTk4Ozk7PDo+PTtAQDs8QjxAOjg0Nzw7Qj9BQj4+O0NEREBDQz0+PjlhmZWLkYWNj5aSiHl9e3+Fi4OKgoqJhmuAeJCLlpqRnZ2UlJGTlpeampiWk42Sk5KQm5uIdndzcX1/cpGgnZubm5yenZ2eoKGgm5uWlpucmpybnJuYmZqYmJmampqWi5CTlpmYlZiYlpucl5WSkY2SkZCUk5KXm5mYm5ePjpCLjo2Ch4uLi4qLiI2RjIeHhoqIiZGKh4yEhYqNi4qNhI+UkIyDkJOUmZWQi5OTkZWRlpWOj5GMlI2Oj4qIj4ePhoeJiYmNiomJioWNh46JmJKUmpuXmKChp6Cko5qqqbO2sbWwqKmiqK6tn6qvsK21ubi8wr/BxLixtbCutrOwuL68ury+urOzp7G3wpB1gGNiXlpXUk1IRkVQSVlXX1tDUDpCQz1HRj84Nzo6NzU1OTc8OTw5ODo9Pjo6Nzs7Pjs7PTs9P0E7Pz48Pzo4NDM3OkFBQEI+PjpDREM/QUM7PT45Z6mloqKZn6CippeUiI2CiIJ1h4iKiIp7e3Z7enmPeoiSfn18en6CkYWBgH1zfH99fISHfnRweHZzfHaBj4iIiYeIioyMkZicl4iOhIuNi4iNkI+Pi5GPi4yOj5CQjouFhYeLjIyHiIuOi4eMhYaBjYuGiop/iYqGiJiRiIOIg4KFfIuLjIaJi4iKkIyIi42PjI+Wh4mLio6NjY2Wk5OdnJyalpycm56bmpuYnZeTkZWWkJKRi4+LlpSMjYqDi4SEiYyQkIqOio2LipGJjZOTk5SVk5KcmZ6Xn6CfpaKvsamupKSfmKStpqa4t6ysu729wsPAv7+vpa2wsLS3uLO0uLa0ta6stK+4tLaBeXpjZmBeVlBRQUVMT0lcXl9UR0dCS0xCREA9ODg7OTU3Nzk3Ozc9PDk9Pj05Ozg6O0A8Oj06PkJBOD88Oj84NjQyOTtCQD9CPj04QEI/PkBEO0A+N2CloJqXnaGaoaCPl5efl5WCjaCfo6GdmpKOjIxycXBvdnFucG1ucHZub29waHBxcHR+c3FycXd7cnl2d3Jyd3Z6e3l8fXt/iIGEi3+PkYaNi4uGiouLiYaEgYaCgIKJkYOAg4x/ho+LiYWAh32AgZKQhoSEho2DhIyPj4+IjY+Hi4iRkJWRjpCKk5eOj5WYp6SfnZWYlpaln5udq6aqt7W4srGnr6qnpqGfmp2WkpWVkYqPjImTjZuVjYuLhoaJjJWQkJCLmZKVlZSbkJiTlIyNkYyWl5WilZ6mqauno6OqsJucpp+mq6G0vb6zs7+5u7u6uby9rqiusa6wuLyztLGxqrCpqLGxsqild3J0X2hhYFRWUUlKSFZNXl5eVExKRVFKRUdDPTo5OTc0ODY4Mzg4PTo9PD47OTs4Ojs/PDw+OT9DPzg7Ojg8Nzc2Mzc5RT4/Qz89N0BAQT0/RDw+PThUj4yGh4eUjJWZl5yWmZaNlZyWlZydoKCdmpiWeHFubXJ4cXFsbnJwa3FvcG1yc3t1dnd5fnVxeHZ0d3tybn98gX15eH1/eYOGg4WCg5CLkIuLi42Pi4mJhYKBfX9zfYiAfpyQhIWFiYuPinp9fYaOjYqGjZSRi5CXj5SXkpihlp6XlZunpp+goKawq6GjpbW0sqqmqq+isba5vcK7ucO+vLi9uLWxrLCspZuSk5mfm5SPk5WOmp2doJqfn5edo6qsoZ+em62hp6qwqaampJiRkZWUo6SirKSss7Szs6i3tru4sLKvra2yt7a6srW6s7e5u7i8urayr6yxsbKztLOxsa2us7Gzs6yhl3Zxc19jXlJRVE1PSUdYT1tcZFROR1VPRURKRD44Ojg3NTg4ODU5Nzo6PTw/Ojg8ODk5PTs9PTpCPj84Ozo5Ojk4NjI1N0I+P0RAQDY+P0I/PEM8PT46Tn98go6MjJOTl5eaj5SWjZaRkZSXk5qanqGdnHJvcnFxcXFxcG5zcW91dHJxdneAdXd8eYV+d3t8eX1/fICJiYmDfXp/h4GIiYGAgIGGiIGGi4aIhYSIiImEf4J/enx8fX6SkH+IeIGFi4qDhIWKj4yNkZmdlJSUoJqan6Ktsa2ppKWtr6ysrLWuvrmtrqm1sLexq7G2rK+9wsLAvrq8trKutraxtK66u7OurKepp6unoqmtoKmooq+wuLSxvLq6urK0ta+8tLezt7e7t7mtrbCprLW5sbeytLe2sLu7vLu6ury1vLi0wbWsqqqrtLG3uLm1trSzsKymrrCqq7Cxq6yusLKxtK6qo5N4dnJlZ1tMUlBGTUhTV1JlXmdUUExcUUhMUkNBOTk3OTU4ODY2Ozc5Ojs6Pjk4Ozo6Ojw8Pj08RD45Njs7ODg+OTUxNTZCRkREP0A3Pj5DPjpBP0BAO0t/gomXmJSdlpabmIuSlo6XkZGVl5SZl5+bmZx8dHV2dXl1c3RudnJzdHV2d319gX56gXyDfoJ/fYB/hIKFj52RiYF/go+Xjo6HgoCBiIuFfoqQi3+HjYyLioeSioeGjZGTkZGEh319g4iMjouOiomQj46PlJSYkZWbmp2dqK6yr6+1tLOtsrW4sLy1tbGqsKqztbS7t7SztrS1r7i4t62noqassLCvtre3vrW5vLOysa61u7C0r6+yu7axuMC9tLS0s7izvLq2tLrAvbm6ubq+ubm5vrWysa+yr6q1tLGzsbSzrri4tb+vpKaoo6ussa+zrq6wsKytq6qroqKmqKKnrauqpaynoqeYeHlxZmVZT09NSVJNV0xPX15cTlVVYlFEVE07Pzk8ODk1Nzc1Nzk1Ojo6OTs4Ojw8Oj08Pj4/P0I9ODY6Ojk6QDs1MjY2QUZDQz4/Nz49Q0I5P0I/PjtLjpGTmJmVmZGTopiTkpKLk4uOkI+Vl5ablZSbhoJ9enh2dHRzdH53end2gIKDhouMhISFioaQiYeRk5aRjZaalY+IjI+emJaVkpCTl5qamJCdoJ2Tl5qgmZ2bo6CVkJugpKOak42IiIuJkZGOkY6LmJqPj4yUmpecnJufnKSstLm6vK+2tLi0tLK3uLmzq6+qqKy1srK1rrGrrqa3s7OxpaGotbCvrayrtbqyu7q6tLK3ur67ubG4sLmtqLK4u66ttLS3tbu2trm5vLe0r7G0t7a5s7e1pq2pq6ior6yprq2up6KxtLG0q6aop6Cjq66oqq6orLKwr6+pqKGeoaGjpqOgopqlo56ol3J3bmdiVUtUT09KQ1BLX2JYWlFcVGBNSFJJQUA5Ojg2Njc3NTg5NDs5Ozk8Nzs+Ojg8PD0/QkBBPTs2OTk5Oj87NjM3OD5GQkJAQjk+PUBDPkBGQj44R5OWkZWTkpSQkZ+ZnZmVkI+Sko6Mk5aWko6RlZGSkIaBeXJzdXuBhI6HhZGTkpicnJiVkJWYo5yaoaeqqZ+clpeVnaKioZyZnpmlqKyvramnqqmop6GlqKirqamvoZufoaOjoJqfoJyUjZiUmKCgoaSem5qkp6Spq66spaOoq6+xtK6qrK6zr6ystLO0ua6urayqrLKwsK2wqKqmsrS0uK6qtrqwr6qurLC3s7i0t7W0u7y4tbWxtauyrKiys7uvrbGytLa1sbG0s7OvrKuvs7a0sayutKqqpqWnrauoqKupqqifqbOwqqeppaOio7CtqaatpairrayppaSioKWipaOYmZyVnqKippdudWVnZFZPWEtLSktTVHBiWWRXX1tcUlpQTEM8ODk6Njk4NzQ3NzQ4Ojw6PDg6PTk3PDw7PkM/QT47OTo5Ojs+PTg0NThBREVEQkM5PjtAPkI/R0Q+N0KSm5SVlZaVj46Wl5qZlZGKk5SSjo+SkYqKiY2Ul5qTjYmCho6VkZSfmpuin5+jnqGhn5ijpKelpaapqa2rqaKmpKilpKGfnqOjra2srairrq6qqqukoaKkqaenqaijopybm6SgpaijoJidmZ+hoqmnoKKirqyrqqetrqilpKmpqammo6iqqaekp66wr7Ovq7Crqq+yr7Czua+rqLCxrrCyubO0r62vtbCss7GurLW1tLSzs7CvrKyqrKusr7G0s7CwrrCwsKyqrauqq6alrrCysKumqbCvqaOkqaunqKaopquwq6mvqaaoqaalo6iwraqpqKKpo6WnpKGhoKKloZ2el5aYlJugpKmUbnNeamlfVVpOUk5QT1JkXGVjW11ZXFBZT0tAPDs5Ojc6ODczNTMzODo9OTo4OTo5Oj08PEBEPkA9OTo8PDw+Oz45NTo8QkFFQUNBOT47P0BEQENCQDdAkZ6YlJeZlpGHi5SSl5GIg4mLk4+OkI2Hh4SFlZmWmJeZlpqeop2anKKkoaCdn5qfoKGgpqGgoKCjo6KlqKmrramqpqOmpaCloKaopqWnqaepqKOnppmcpKaioaChoaCcmJmfoKGkpKKenpagm5qioqChn6CiqKCcn6GloaCmo6KfpKGspp6foaGkrKqnrKivq6e0sa6ur7WyrKqwq6mtrbWwrq6srreup6yqpKivsq+sq7Kvqqqpq6utqa6urrGxraqtqaunp6uoqauinaapqKilqKisqKilpKWop6iopqmsr6+oq6mhoqKlo6Opq6ymqKWjqKKhoKSdnZ+hoZ2bnZ+amZWcnKOqlG9zZm5yZF1dUFVPV09eZGRsaGJiWlpSVE9NQTo9Ojo4Ozk1MTYzMjg4Ozk5OTk7OTk8Oz0/Qz5APTk7Ojs8QD0+PDk5PEFBRUFGQTo9Oz9BQUJBRUI4PYqWlJOYmpaPiISNjpGSjIiIiI+JiZCRjoqKiJubmZygpaKlnqKjoZqeoZyanZ6bnKOop6ugoKOYoJ2XnKGjo6WjoqKkrKilqaCepqmnrKmkn6Kgoqahpq6mpp2fn5+fn5manJyhoKGkn6GbnZqcoJ6hn56eoKOZlpqYo6KipJ+ZnKGhoqCbmp6goaSgnaejqrGorqusqaSqqquorKalrKqws6+rq6mwq6appaWoq6ynpqevq6Wnq6upq6irqqqrrailqKOmpaesqayoopykoaOmo6qpqKano6SnqKanqKepqKupoaKoo5yepqWjqKino6WlpqmgpJ6inpeYnZ+doqKlnpiUlZ6go5d1d2t2d2FfXFVZUVVWW2Nec19oX2NTUVlUSD48PTg7OTo4NTM3MzM0Nzo4OT05Ozo5PDxBQEM9PT44Ozw9PEA/Qz86ODo+P0NAREE6Oz48QD9DQ0VDOTyCmJmenZ2alZKKiZGRl5GQh4SJgoGNj4+Sj42cnZ+hpKmlqaeorK2moqKfmKSmo6Stsa6yp6asm56em5qjp6Cfo5+foq+qqqyoqKuwqaiqqKGfoKeprbCyr6yjoqahqaWepKOipqClpKKlo56doJ6fpaKinp+imJWemp6fpKGblZigoZ2enJudnZuZmZWen6Oonp2iqKGaoaOmoqSoqaqoq7CxqKWlp6eopKWpqaqnoqWmqKadnqWloqClpaOlpqCjpaOjpaelqamqpKekpqKmp6SrqaenpKGlqKynpqWlo6OopJWdo5+bnaCjqaeopqGjo6mooKiioJyVkZqfoKGmopuXkpCamqCVfHdvfXlmW1tgX1pcVlxoZG9jbmlpYl5QUEA/Ozo4OTg8OzYzNDMzMzc5OTs8OTs7OT49QkBAPTs9ODw9QD08PENBPjo4PT9EP0M+Ojk/PEI/P0FEQjk6gJ6kp6Kem5+gmY+ZnaCWloqGj4iEi4qTl5SRo6Wnqq6trLOys7S4t62pqqevtLKxqq6usbKusa2lq7OssbGpq6+rq6y2r7Owq7GysaOfoqqpp663trS0trOvrKuuq7awqbKxra6npp6io6ObnZyXoqiloZ+eo5ueoZqWnaScm5aZoqefoJ+joJuUlpmWl5qfoJmVnqKZmJ2dpZ2gpKeqqaiqraylqaSlqqeqqaqsp6SkpKOimZmhnpqaoaCfpaWYnqSmpKqooqelpaGqp6mnp6ejqKWmpaGkqKesoqekoaalpaOVl52Ym5mVo6elpaSfnZ2lo6Kqo5+amZiXnJyaoaGakJOTl5ibjX93cnZ4aWJbX15cYllgZG5ta25hX2RgUE9BQDs7OTs4Ojk2MTQzNjQ3Nzc6PTo8Ozk9PUI/Pj89PDo/OTo7PD5BRUA9OTtAQT5DPDs5PzlAQEBAQkM7OXuao6OcoJ2dop2Zn6KioJibmJaYkpSQm5qWl7S0rrW4s7S4tre0uLm3tbm4ub28uKqLnLK4vLS9urW7uru4s7q/uLe5u7G3r6iusq2inJ+qsri8vL27ur+0r7GztbS3t6+1tLWysKikop+gl5Wal6SqpqahpKOkq6WlmKGko52goaKooaOgpaGck5mYmJmco56cmpudl5uZlqWam5+hqKmpqKuvr66pqKirrKytq6irp6WjoJyfo6Ojn6Cipammmpyip6Spn6GjoqKgpaanpqSooJ+ipKGjoqiop6OloaGopqalo5mbmJuTj6GknqKfmJiVoJuhpaCfm5udnJuamZugmo2YmZiTkYaAdnh5eGNbUllUX19hbWh1a3BnaWliWVNMQDw6Ozg5Nzk3NTU2Mjg1Njc3Ojw7Ozs7QD4/QD0+Pjk6PDk2Nz47QkZCPDg7P0NDRDw+OT43PkFCP0ZDOzhwkpqblJ6bm52Vl52doqajopaXnpaXl6GblJi+t7G4uba3t7i7l5S2vbu9vcDFtaK7mKC3v7+6wcm0nbu2sra/xcGooLa0urGqrrSxsLG0tba8vL68vL7Guri3ur20r7Wxsbq4t7Kzsqqmpp+YpKSnqKSupKurtbWus6CnqqynqqmlpqCnoKGmoZOWmJ2foqSjnZ6coaChnZekmpmdoKaqqqqtrq2tsLGrrK2sqamrrqimpaalpqSkpqaeo6eppKGcoKKjpqCio5+jpJ2foqWgpJyboZ6fo6GhpaSlqaOkpaKkp6ehn52elpOcoJiZko+MjJeWn5uWnJqdnJqSlpSUmJOQmp2YiouHgIB8gnhhXllTYWhgZnNvc2l0ZGlkYltMSz46ODg5ODg5NzM0NTI1NDY2OTw8Oz08P0E/QEA9Pj44OTs4Njc/OUJFQzw7PD5DREM9QDs9Nz1DQ0BFQjw3Z4yRk4qalZiblZWYm6Knq6aVl5iQlZmhnpeXvrWztLu6ubi5woeYt6u4u8DCxbOjw6e4s72/tMTHvbS7uL62wMTErqCworW2tb2+wcPGwsO5vb/AwL2/xL28ur2+tKeqmLHAvbi1ucCzr6+qqqitp6ekr6eqtLyxtLWor7Gwr6yqoqajrJ+fpquXmqifpaWfoJydoKuwsKyiq5yYm6Cor7Kys6uorre1sq2tqaalqKulpaStqaShn6Cnnp6mqKmmnp+anqGlpqmcnaObl6KmmpuanZ+cmqGcmZ2eoKijn6GfnaWioKOioZSZmpmTj4qLhI2Qk5uPjpiVm5eYkJORkomNl5iYk4uKi32AgIVwYGFeXmpiYm53dXZubFtiUVVcTUc7PDk3OTc5Ojc0NDQxNDM3Njg8Ozs8PEBAPUA/Pj8+Ojo5Ojc6Pz5FRUU8PT1AQkJCQUI7PDhAQ0NARD87NV+MjIaFlouUlZeYl5ifpqellpWVkZebn5ual7mxtrO5vLy5urWqsryxvsG0vMe5uLuuv6fGw7/KxsnIxcXJvMLHx7+xsKe8vL7FxMbJx8XGu8TAxcbAua+9vMC+vrOrqoyzu760tbfCuq2vsLWqq6aqo62kp7G2q7WyrbOtqK6vp6awr7Ktqq+zpKu1qaeopKCgnqmyuL61tbWqqaausre4t7apq7i8ubexr66noqOop6SfqKOfnqCZoZydoqSnp6GelJuaoKGlnqChnpajnZSQlpiboZqflpORlpSin5qenJudoZ6kn56VnJiPkpOPjImTkJefiZCWkZuUmJGRlZaDjJWXlpKLjIh8f4N/amZoYWtsZm51cXJ1cWZeX1xSSUU/Ojo6Nzg0ODw3NjU0MjMzNjU3PDo7PDs9QD4/QD48PTk5OTs6PDw+QkRFPj49QENDQ0REOzo4QUJCQUNAOTJbk4iEjZGKi5GRlZCSmp2fnJOSmJSdnZqXmpW2sbm1tb6+tri1uLO8vMTEusPHwb+0s8XFxr/CzcfLzsvLx8HDxsfIysXExcO7vLzBxcHFxb/DwsbFwLGTvrq/w8K2trqptLO0qauzu7uxn5uxr6ykrK60p6qpqKqtrKmlpZ6pr6uyu7q4u7e5t7O5uLOurLO0qrC1ub3Bur6+vL60urm4u7qysbS8u7q7s7Oyp6Smq6uioaCdmpudmpyXmpuenJygnZaclpuZnZ6io52UnJCNiY6OkZ6bnJWNh5KLmJiWmpybmJybnp6cmp6UjpiYmpSRmZeeoZWYmpKXlJWRlJqYk4+TnZaSi5F+enx/dGtrbmRvbWhxeG95amlhXGdhUUZEQTw5OTc2NDQ6ODQ2NTMzMjY1Nj05OTs7PT47Pj49Oz05OTs7Oz89QUNBQkFAPEBDQ0NFQjs4OUQ/P0BCPzsyV5uQkZCQh4WSjo2IjZCTlZGPjZSUm5STlpqRs7e4uLi+u7C1sri2tbbAw8G+w8LAvru+u7u8xMzEzNDLxsa/xcfLyNTLysjGv7u7vsS+xcjGxsPEw7i0wLe0vMHCucK3t7/Au66lrre8t62co7ewpq20tayupaWjqKSgoKWZqrOyvsG+urm6uLW0srG0tLO6wL7Av769u7u9vsDCt7a3tru7sru+ubi3u7a3tKyoqamrpqijnpOampyYkZKZl5GRmJqXnpiWk5acm5+elJOJiX6GiIuWlJiZkYmVkZeWlZmbmpaYl5idnpyhmJWZmZyYl5ybn56jnJ6WmJeTl5yZmZyUlp2UlpOJdnl6e3Zua2lndVpmcndzeWZnXWRbUlhJRj87Nzg4NzYxNjk3NDQzMzM2NDY7ODo8Oz08OD0+PDo7PDs9Ozs+PkRBQURCQEBBQkNDREM9OTlCQD8/QD89MkyWmpaSk4yKmJCKi4yOkpKKiIaNkJiKj5CUl7O7tba/vb2xtrjBvby0uL/Bsbi3vsHFvbu8wsbJv8jOyMHEwcfKysbKxczIzcbIxb/DwMvNz8rGxMPDwcS+uL7Bw8DEvsHPz87Gq6+2tLWroKe0s66ruLWzq6mjoq2prKatn6y1tL/Cvrm4vbawrausr7W0ur7Fv7u8urO5u7i5ubWtsLS9u7G/vLiytrmzubu0ra2orKyqqaeXnpualY2MmJSTi5WWlJyZl5WWmZKYn5mQiop+iYqKkY6Vl5OUn5mWkJSZmJmWmJOUm6GeoZiYmp2ZmZaenpibopqdnJuYmpuZlpeXlpyZlJyYfoB4eXV1ZWVpamddam9teHdjYmBgXlhXRkU4Ojg6OTc5NDQ5NzY2NTEyMzM0Ozo9Pzs9PTo6PTs8Pjo7Pz48QkBDQkJFQj0/Q0NDQ0RFQDk6QkFBQj5CQTVCkJeUlZmSj5qQjpKRjZSVi4qHjI2UiImPkpq2u7S8xsHEwr3BxcLAtLO9v6ywr7rDysPCvs3IxbfByMW/wcLIy8rCwsTJzM3Pz8zDx8bIyMjIycfFycfIx7/Fx8TEx8jK08/SzLy4trS4uMG+vrq9ury6vKytp6q7urm3wLK1uLLAxrq3t8Gzsa2tqau1s7u2w7a2vbWxt762s7e4sLW2v7uwvbq0q7CxsbO8urOzrqutq62xnaOjoJqQjpiXlZCclpaYlpWSnJmTm5+clpGUjpWQiYyQlZOUm56YmZKSnJedlJmSk5aZmJ2VnJ6do5yVnZ+TnKKcnKCfnaOemJSVl5ebmpmgkH99cXRxb2JhZ3VnaWl0bXhsXWRbVWBZTEhDNjw5OTg4OjUzOjY2NDQxMzUyNTs6PD47Ozw9PDs8PTw7PD49P0E/RUFCQ0M+QEFARUVERUE7Nz5DQkI+Q0I4O4+akZaalJKUjZCUlI6VlI6Pi4yJk4uIkJObt8C6xsXEw8zCwcS9vrWvt7uvr7O6wMfFxMHMy8W2ucDCwsTHytHLwsPExsnFzdDOx8zJwsLJwcrKyMbMys3FxsXDxsXJzdDNz8zHxMDDwsnNx8XBxMfBu760sbCwwb6/wca/vri3w8K6urbAvrWyrKmvsri+tMC0tLi0t7nEua+8vrm+v8K/tbq2q6qsrq+wt768trSura2utaSlqKimmpycnZyeopydmZOQkp2VmKCdmJiVmZmZl46MlH2QkJefmZmYk5GToI6Nko+VjpCUlaKdnKSem56elpyjoKGipKOkop6amZubnJ2enIN9cnx4cGdgamp2bGlldW90Yl1iVFdUU01HOjc7OTk3Nzo3NDg3ODQ1MjM0MjU7Ojk+Oj08Pz04Oz05OTk9PEBBQEVCQUJBQT9AP0RFREVAPDo+QkNCQENBOjSAoZeUmZiVkImUk5aTiZGMlJGOiJaKi5CXnMXLw8O8wMPHwbm9vbu4tre3rrK3uLzAwsDCx8bHurzAwsXHyMbSycHCw7+/vsTLyMrLx73U08fIzcjDyMnJxcXDwsHCx8fJysfMyMfIzcbLz8W3wMDAwLu6vbWzs7+/ub/DucC3u8G8uri7ub27srCvsKy5wri9ube1t7q9xb24xsjCwcLGwr28tamurrCwr7O6t7m2sK+tr7OppquprqannqSlo6OjoqCblZiekZecl5GRlZeZlZmRlJiSlYyYo5qcnp2FiZ+TfJKWlZKUlJennaCipJ+en56foaGkoqKjoaOinJ2fnqOhppl5enl/cnBmZWdkamVham1ub15ZXFZWTlBKRjk5Ozk3Njc3NjM3ODk1NjEzNTI3PDs8QDs/PDw6ODo8OTk4Pj1APz9GP0JBQz89QT5ARENDQTw5PENBQ0RBQDozbKKdlZedlo+PmJiZmIiSjZGVkI+Vjo6TlpbKy7u5urnBu7q3vsG8vLu5sa61uri4u8S6vsC+vru8wMXBxsK+xsK5u8O5uLm7vcHHwcTNv5DLxsXEwcTBwsHEwcO+vcLAwMHCy8PGzMvFyNHCsL69uLq7vL63tLC5vrO8vrG5tbi7tryztbm2uba5t7GtusG6vMG/t73Ev8bDw8fHwrvAwr/Cv7iys7O1tLGut7S3tbSxrK2xp6Wlp7CtqJ+nq6ajqKWmpqCgn5SYmZSRkZWUl5OYl5qhnZ6hnKGdoaWglpSbkZeXmJqTnpmZqaSlpKWdoqCanqCkoqOcoqGjoJ6cnp6ppaiVfXuDeG5mYWRiYWJjY2piZ2NbWlpcWVFORT07OTo7Nzc5OTY0OTk6NTMxNDUyNzo7OkA9Pzw8OTc3Ozo5Ojw+QD8+RDxCQURAPz49QkRCQkI+OjlCP0FCPT44NVmfnJiTmZaRlZiYmpeQkZCQk5GTlJKSkpSUxce4tbq5wrm5vMPFwri7ubGxtry6tbnAu7u5tri0tLW/u73Aub66urTAuLW4s666u7a/0Z+IwM67v8G8u8S+u8HEwL6+uLzBwcu+vcnEwMDKwLHBv7u4u766tbe0uLy0vbi1tLCzvLG3tri/tr25vb65t7q+u7/Axb2+y8PGw8TAw762ubq2v7i7v7y4trOyq7CwsrWzs66sq6emnqeurauiqKumpqqjp6iqo5+Ym52bmpicnJiXnJuhpZ2anqGhoKGmoJqbnJiboJ+dnJ+coKiho6SknaKfmqKgop+el6Shop+dmpieqKWhi3x5iH1xY2BiYmdqZ2ZpZWldVlZUWU9TS0U4PzY7Ojc3OTs2NTo7PDYzMTM0MTc7OTg/PT47PDs3Njk5ODo7PUA/PkA9PT9CPjxAQUNDQUBDPTo2PEBBQDw9ODdJlJibj5OUkZWYlZGWkpWRkJGUlZSTk5KYlcHCwLq8ub62uL7EwMKxvbqytLO4vLW3vMC8vbS1sbC1t7W7wbi+ub+8vLe0t7Ctt7a4xMuMhZvIvbvDtbrHuLa5u725ura7xcXKvbnFwL+8wb64xr3BwLzFuLa3tLi2tru7uLa0t7q1tLi8vbm/ucPAwLu5vLu+vcjEvcfEw7rAvb62sra4srm0usLCureysaysq62yr7Kur6ijpJ6rrKyqpKakpKiqoqemraihoaGmn6Oiop6bnKKfoKOdnJuhn6KgpKCem5eZn6GdnZ6eoaWkoaGioZ6ho5yinqCZnZijn52eoJqZoKKmnYR6g4B4cG1lZWZvaWVraFhYTktLS1JJTEhDOT04PTs2Ojs5Njc8ODk4NjA0MzE3OTk7Pz0+Ojw6ODg5PDg6Ozs7PD1BPj09Q0E8P0NDREA/Pzw6Nz5CREE/QDg4P4mYmoyMkI+Tl5WMkpCakpGXmJaUlJKQmpTDvsbBwby8uLi6v7a8scK2tLyxtLa4s7q9v768sq2vrLGwt7y3u73BxLm3ubiwurS5vMm6g4WGtcS+x7e5uK23tbi6tLizu8XGy8G8xsDAv728v8nDxMW+xri1srK9uLi4vrq6uby6urS3u7q5v7zEwL+5uri/ubvFxr3Fw8Kyur27sa+2uLO3s7q+wLm2rLGrrqmqqa2qqq6mpKWnrq2ppaOio6GkpaWmoqato6Klo5+ho6Gcmpyhn6CloaCenZygnaWgnpeVmZ2fn52gn6KmpaCknpybn6Ofn5mcmZ2epJyWnKOcnqGcppZ+f4d8a25wZ3Brc2VibV9cVEhLSkRKQkNHPzk7OD48Nzs7OTc4Ozc8PDYyNzUxNjk8PD08QTs8Ojs6OT45Ojs9PUA+RD89PkRAPz9BRkQ/Pzw9OTc/QUNCQEI5Ojl3nJiLh4uQkpOWjY+TmpOQnZiSkY6QjpiSvbfHvsO+vbu+vL22uri9ure9s7OwuLi1uby8wLeqraSusLe5sb2+u8S2uKWHgIt7jpzFo3yDhbHLxs/CwLiutbW8vri6sr7ExMrFwcnDwr+/vr3HzMfHxMe9tbW2wb26u7/CusDCv7y2t729vcHBwL+8ube8wru3v8W7wr++tbe8vK+vt7awtLO6ubq7r6mtq62rrKaqoqeuqKWqra2vp6Sgn6ajnqKjqKOjq6Oiop6dm5ublJaZnJyfpZ6fnpmYnpejoJyXmZqZmqOjop6jo6egpqCbnaCjnp2WoJmcoKCblJegn6WcmKKQgYaBcWVsaW50bnhjZ2JbY1FLVEhFRUNHQzw7OTg9Ojc6PTo4OTs3PD01MzY1MDY4OTo8O0A9PDo+PDk+OTk9Pjs/PkM8Pz5APz4/P0ZEQEE/Pjo3P0BDQz9BPTo4ZqGYj4uNlZKVlY6PlpmVl5uVjoyMjY+bk7m2wbS/vLm8w8C+wLq1trKywLmvsry8sLe7tru8q6ujsLjJ07a6vrzGtKJ4ZXJlVWBmh419h4eqzs7RzMrEtbrAw8i/vrW/wb/Gxr/LxsO/wbzAw8zKx8XGwLm9vMS/wL/CyL3Hx8XFvLrEv7vBv7rAvLu7wMS9t7nCub69t7S2uLqur7WxsLCytre0t6yurKqsrKuoq6Gms6qlra+trKippaOkp5+io6Onoaeiop6cnZyamYyQlpeZnaKZnpuVkp2UoaCdmZ6fmJimpqKfoqKmoqeloqCko6GbnaCbnKKfl5WVnp6kmpafiYGDgXRvbGx0a2xuX2JeYGFOSE0/RUA/REM7Ozo6Ozo4Ozw6OTw+OTo+NDQ1NTE5OTo5PDtAPD89PTw4PDs6PDs7Pz5DPkI+QD89Pz9FRUJBQj87Nj9CRUQ8QUE6OlmfmJOSlZqVmpOQlpeclZuZlpSVkZKTnZm2uLaxuru6vsG5uca7trWypb69tLbBv66zvbS4wbGwsbO/y8jbvr29vIFqdmBndl5XVlxzgImLqMzIzMvNysbCxMvOwry5vbm5wMO/yMbEwcG/xcDKycPDxMO5w769ub+8wsbCyc7Hxr66xr26v7m3wLm5vsDCvrW0vLi2u7CvsrK1r7Cvrqyus7CzsrirsbKxqrCrq6yrrLatqKyusqarrKmpoaWgpaakrKSmoaChnqGgnaCMlJeTm5+mmZ6emZOYnZ+gnp2eopuYp62ooqSgoKKqpqmhqKGlm6CgnZ2jn5SYmKKdp6Gfm4J7eoh6bW13e19wY1tdX15TST5DRUlCQz5DOz42OTo7Ozs7Ozs7PT05PTU2NjIxODo5Ozs6QTs/PDw+Nzs8Ozw9PTw9Pz5BQUE/P0FCQUVDQkRAPDY+Q0RFPkJEPztTmZuZmJ6dmqCalpyZn5KdlZ2boJWWlJqYur20sLu8wcTCv8XGura5sqO7vbS3xLuwtbq2ucS4tby1xpBxwdPAtH1bTG9hUHx/dWJWYH6GkanGwsfLyMHDwcDJysLAu7qwtLu9wMXGxcW/wMK/y8fCwMjAusK7urO6usG+wMrOysS9tby8ub+5ubW1s7/Avre0s7S4rbeqr7CwsrKvq6+nr7ausrG5rra2uLSzsLGttrS6sa6srranrLKsraSjoaenqLKrqqWkp6elpaCml5ujn6SmraKeo6KanaWiop+foaWenrC0sKSlnp+kqaevp6mgq6CiopqipJ2anqGmp6+psZWCe32Bem1zeHNncF1bXlxZUUVEQ01JQUU9Rzo6NTk7Ojw8Ojs7Oz0/Oj01NDUxMjc4ODs8O0I8Pz46OzY6PTo7Pj0/QD87QUFBPj4/QkBBQkJFPjo1OkFCST9AQkA7TJqdnZ6fnZienZmampySoJWbnp+blZGRlsW+urbDvMbCvr/Ixbe1uLe2ubu0r7e2srWzt7m8u7a7u9KXcoO1wptYVFaNYlJkgISFbUlyhpe0wr2/xsC5wLy+xcS9vbmysK64t7/Dx8PEvL2/v8PDvr/HvLy/tLSutbW8vr/OzcvCt7K4uLi9ubuxtrLIwLu2tLGwt6yzqbCtrbS3r6uuqrG1r7Gvt7O6usC/tre2sru6wLWyrbO3rLC6r7KloqWrrK+5s7KosK+xr6qiqKGkraitrLOun6inpqWmq6Sknqaqo6ayuLOrpZyfp6anrquqpbClpaWbpKOYn6exrLW4sLKOhHl/fHZsdXpwbmlbX2BZU1BBRUhHS0BEQ0g8PTY7OTk8Ozo6Ozo9Pzw9NTU2MTM2OTg8QT5AOz1AOzs5PD04Oj08QD46Oj49Pj09PkBCQkJBRD03NDU9REc+Q0I/PEWUnqCgoJyXmpiYlZmdmZ2fmp2bnJaRj5LDwMK9wrzEvLy7xbu3s7e2tru7s6CWtayvsbS0tLa4ucLXmH9yi652Uk9smVpSVVqalHdMbo6itLi4uMK6s7u3u77Au7u8rq+us7K5wcLEw768v7u6uLbBwrW/urWur62wvcC5z8rJw7GvtbS0vbq+ubq7ysO7uravsL2xuK+ys7C3vbaur66wt7CsrLK2vbzEwrq9t7bAv8G3tbC2srGzurGxr6err6u2v7e1qbqztbmxp6uop7ausrG1uaisrK+qr7CqqKessayytr20saykqKuoqKusq6i2qaaonqadmKOuvLG7wbSmiYF8gnpzdnZ3bnFgX2ZdWlRKPD8/RkY9RkNDOTo1Ozk5Pjw8Ojo8Pj4+Pjg4MzE1Nzg5Pj9BPzs6Pz08Oz09OTs8OTs6Nzs+PT1DQT8/QUJEQkE8ODU4PUNGPUREPzw/iZ2en52Xl5WUk5aZnpubmpuYlJ2Uio6Owb7Dwr6+vrm2usCxtbGzt7fCtbOrrbOoqa61r620trnD1Z2JfXiVYE5qjXVdUV1surV1VFePuLWysbe+ubK1sry5vLa6vrK0tLSwuL7DxsTAvb+5s6+yvLquu7Szpquorbq+uMvCv76sq7Cvs7q3ub67wMXBu7y3sLXEtb+0uLu0u8PCs7a2sbisqaWrsr23v7+7u7exvL28trGvq6uprbOvsLCrsLSpuMC2sqm0tbC3tq2spqu7s660uMKwsbG1sbK1saywsri4ubi+tLGzrqyxramvrqqyuK6trainoZ6ptr+4ur+wlol9gHxxdHd0dnFsX2NhW11PSEE+PUhDRk1DQDc3NTs6OT48PDk4PT47PT86ODMyNTc2OD8/Qj86OD4+PTw5PDk7Ozo8Ozs6PEA+QkI9QEE/QkI/PDs3OjxBRD5CQz8+QYqgm6GdlJiVlZKYmpyWm5WalY2bj4SIhru0vb+7vLm3s7y8rLOytLS2wLXAr7Kzqqqxt62pubO3wMqfiYF9gFhYko9ncWB3cnqXd25rX4u9s7C2urW0sqy8ubi1uMG6uLOxrLe8wcfDv7m6ta6lrLOwprCtqJ6gn6WttrXCt7a0pairqLC2s7K6tbu7u7W4trC1xLK+vL+8ubrFybq9vraxp6SeoamxrrW5trKxq7S3trGopp6gmaWmpKynq6y2qa+6sa2kpq2lq7GrrKmtuLawsrjBtrGxtbGvu7ayt7W1sry1urKwsbKutLKqrq2nuLWyta2uqqiosrq9wLa0qY6Ce393b3tvdXJtY11mWFxdUk5NQT5JQkFKSUA2NjU7Nzg+Ojs4Nz4+PDs/OjkzMjc1NzU8PD48PDg+Pjw8OTk5Ozs7Pjs7OTw+P0E9PEJAPz9CQD47Njc6QERBQ0E/QUKJoJ2loJSWmJiVnqCcl5uYmZGMmYmDhoS1r7S7u7S1sLG2uq6wtLOvtbq1urC1s7KttrqvrbyzuLnFq5WJjHhMZqDDfYabkF1/eWx1eYmxurWxtLWytK+su7q4trnAw7aurqqytry9ubaysa2tn6Snp52jpp2WmZman6muuayrq5+lqKSrrq6nr6yvsbGtsa6usLmwtLy+uLm4x8W8vLu4qaKcmJufp6assq6zqaapqq6popqXl5GcmpijnqKir6ekrKaompqemqGnp6anqa+2squ0trCqsK+xqbm2sbWxrqy3s7avrquuq7S1ra+rq7GtsbKoraurs7W3ur2wq6GLeoJ5cnZzbXVpa11balRdXE9NSERGTEJGTkY4NjY1OjU6Pjg7OTc8PTo7PTo5MjM2Nzc3Pjs9Pjo6Pz48PDw6Ojs5Oz47PTk8Pj1CPDtAP0A/QT8+OjU1OkBFQkRBQEJBiJ+ipqGYm56dmqWpmJudmpmUjJmHhoeGrq2uuLmxsqiur7iyq7CwqrK1ubm+tbK4tLm6trm7tbWzu7eWk6CKTWiSk3ZveXJoaWt2gXd4pby4srSzsLGtsLm4try4u7+ysrKusa65r6qrrayjqKGdnZ6XmKGVkpWXkJifqK6ko6Sgoqeio6mpoaanpaqtp6ynqKesq6yyu7SztLm6trK2ramgmpaWm52fq6yqr6Oko6GpoJuTjo+Qk5KSmZaanaSloJ+ep5iVkpSZnqSjoaWqrK2iqaqppKmtrqW0sa6xraqprq+wraWmqqSos66trKmmpqmrpqqnq7Ksr7Oxq6mWgX+Bd3J4aHRzbmRUYGNXXFFOTEhASFFETUM9ODg3NTo3PD46Ozw4OTw7Ozw7ODI0ODk3ODs7PDs4PD0+Oz08Ojk8Ojs9PTw6OkA9PDw7QD5CQEE/Pjk1ODs8RkFDRD9BQYijpqKjnqCfp6Coqpufm5yZmI6Xi42PjKqpqLGvsK2lp6ayr6mmq6CvsLu1vby4wMG+vLy8ua6sr7K3pp2ok1iAcHNtZGtfWVdYW2JfbIGbubKts6+urK62trK0ta+qpJ6bnJyeqKieoKipn6GnlpuXl4+dk4+Qlo6Xm6SooKCioqKlpZ2jo6CepaCkrKSmqKSio6OrrLOuqa6urqeqraisoZyamJmYm6moq6ufpqKbo5yVkIyPj5CTkJeVlpifnp6amKaXk4+Slp2ioKWjpqSnoKKko6Ghq6uksq2qrKyno6yuraufoaKkpK+srKmmo6KqpKqqpKmrpqmsq6agiHiDfHZ/eWJ3bG5cUWhUUE5HUE1MQk9RQD47PjM5OjU7OT07Ojk9OTk8Ozw8OzkzNjk5Njo7Pz06ODs6Pjw6PDs5Oz07PDw9PjxAPT88ODtAQEE/Pz45NDk8N0FDQkQ9QEOOqqSjoqGinaulpqimoZ6dmZ2PmJWTkJWnpKGmqKmlpKChp6uhnKKbp6u1sry9wMLCwL7AuLSnpaypsMCxs3x4dnJ0ZVdWT0lJS05PT1xrcKa1qrK0rqqrr7Cys66lnpKYlI+YoJ+ioJykpZ+eqJSblpeMl5GNkJeTmJ2iqp+fn6Cjpaicn6ChnKKfo6innKehoKSfrKisrKCpq6agpKimrKOdnp2Zl5qrpqqxo6WonqCclZOQj5GQmJCWlZiXn5ibmZqjmZeUlpqdoJ2nqKWgo6Kho56doKmqpa6upqipoaKqrqqnoaCio6msq6eppqShqaKlqaalpKKmpKijkn18gHV1fW1re2RoVVFjTUpIR09STkpORzxFQD0yPzc1OTs+Ozk5Ozg6PDs7Ozk5NDg7ODc7Oz48Ojk8Oj07Ozw9OTw8PD49PUE+QEJAPTc6P0FCQEA/ODU1PDpAQ0BEPkFGlq6koqWeo6KpqKipqqWmnp2imJiZmZWbop6bnqOioKOgoZqgmJeXlqGorK62t7q5ure3u66ooKGpoabHxKZhZmlyYFJPSnBVVkpPSkxUXl2Bt6+vs7Wqp6yropyZlI6RlpeZmZygoqKcnaWemqSXl5eWkJKRkZOal5ugpKqeoaGepqeqop+gp5+dn6SnqZ6jpp+qnaqtqq6nqLClo6Smp6ymoaShm5ier6iusqulqqqgmpiYmJWTlpqTlZWalpuXl5ihnpycl5uhmp6ao6eln6GioqOdm6Gmp6aoraOppZ6kp6mkpaWhpaSsrKmmq6eioKSjpKenoaCgpaKmoIl7gH12eHxkeXlgYlJVYElJSktTVElSUEw5P0I2Nz02NTs6PDw5Ozs4Ojw9Ojs4NjU3OjY5Pj0+PDk5PTk9PTw+PTs7PDo+PTw/Pz9APT03Oj5AQEA/Pzg2NT08PkFCRkBAR6CupKaroaOqrK6tp6ypqKCipp6bm56aoJyalZmfn5uen56WlJOXk5KcnqSorq2sq6uvqq+pnpeepZ6cu7x9b2lqYVRKV3Cci3pZTEZHTlRUaK6ysLC4rKahnJ2alJeampCOkZWRjI6OlJminJejmZqXmJmUmZiWnZufpaapoKajnqeurqumorGjmqSmpqqioaqiqaSosquxsqu5qKarp6urqaysp6Cgo7GusrG0qrKvopmcnZ6hmZubmpiZm5SWm5aZnKWhoJqjoZqdmZ+kop6gn6KmnZulpqWkpaijp6OepqOinqaloqWlqKykpq2noJ2dn56gpaGenqWgppmBe4F8dXZzaIJsZVtTWllNUUpPT1VMU0xBNz5CNjg9NzY6PDw9Ojw5ODo7PDo7OTc2Oj01OTw7QD03ODs3PTs9PT06Ozw4Pj09QD5BPj4+ODg8P0BAPT43NTg9Pj1BQEZAQUihqqCrq6GkqquwramtqaelpaWkoKGfnqWXl5SYmZ6YnJ2blo+VmZKRnJihnaqip6Cep6Gln5ySnKKbnqmrln1rXVRNTVydxMupb1lMRUNHTWGYsK2sr6efnqKgl5GTm6CcmZeSk5+coaSbnpuWn5qfl5uinqWhnqSfpKitraisqKSstLe2sKe0rKKtraOvpaSmoamorrWzsr23vrCssa6tqaq0sbCoq6iytbezuK2ytKSgnaWfrKGhoqCgmpiWlqCbm5ikoaCepKGgnpqcpaCfnZyhqJ+fp6meoaOkoKagnqehn5ymo5+ipaOooKmrpZ+dnZudmqainpyjnqeQgYJ/fHh1aXd1XWxaUmBIUlVIRlVWSkJMRz1LSDhFPDY3Oz49PDo8OTg6Ojs6PDk2Njo8Nzs+PT8+OTc9OT47PEA8OkA6OkA/O0A+QUA9PDk3Oj5APzo+NzU4PT0/QUBEQEJGnKueqamipamprqimqqWmp6aoqqGlpKOmkpOVmJacmpqcmpWTmZuNk5+ZqJ2un6eenKGdnpqZkpmem6Gho4pvX1VSUVVpwOPStJ2Hb1lKRVSRmJ2rqqmkn5+ZkpKTmJiWlpWMiIuOlZ2dnZ2elp6apqCgqKWxqqeuo6uttrC0srGutri9wLqttbSwt7CutKmmpKWsqbmztbvDvMPBtrq2q6+xube8r7OwtcG8t72zs7WirKKpqLKpq6inqJqZnpqqp6CZp6Cfn6eopaSfnaqhop6bn6igpKetmZ+jnp6nnqCmnpycoqGbo6KhnZympaWkn6KZnJukn6CboJyjiYWEfnZxbWl2bWhtXFhbQldOSkdNR0NGTTw+TD00PDk2Oj0/PDs6Ojg4PDk6Ozs8NTQ6PDg5Pj4/Pjg4Pzk8Oz0/Oz1BPTo/PjxAPj8+Pz08Njs/QT07Pzg1ODw8QERCREFCQ5WqoKapo6mqqKmjoamgpqinrK6lqaWpqpSSl5mUmpqanJiYmZyamJmqoLGit6Swpp+enZ2XmJWZnpqco6J3WVJRVFZog8DMs5ixyLCUipi5xaKpramqpZ+enqGinZ+dmpyclJOVlJ6emJSFnZqhm6ukq7KwubKysbKxur28vLm2uMO+v8K/trq7wMS5vbusr6exrbHCtrjCxsDIysDKv7C5ub25wr64s7vGw7zDvLezqbOtqrO0r7Ouqq+jnauntrGtorCmoaOvsa2wpKWvo6GgmqGnoaSqqpmdoJmao6CmqKGcnqKemaSenpiYo6OhpZ6mmZuipJ6fm5ubnIeFgXt0cWtrdXJwaFdbUUVUSERKUEg/RUE0Rkg5NTs9Njs8Pjw8Ojo4OTw4OTs4Ojo4Ozw3Oz49Pj02OEA5Ozs9QDw9QDk3PD07Pj0+PUI+Pjc6QUA+PD45NTg9Oz1DQEFDQkGRqqGlqqelqqimn6KnnKasp7Gyq62jqayVkpWalJecoqGbnqCinJ+psqu7sr+rr6ylnqCgnJyYmp+fmqGdaFBLUFFpgZy1uqeHs+Db1tvayLSup6OjoaCepaulnpeclJGZnZiUjIqGiIZ5bYigpKKrrLS8tsO+vrO7wcPCxcC/wsbGxcPIwsDFyM3QyMvDsre1vrK+xbu+zM3FzMzM0se+v8DDvsfGwrfDycnCwca+urS6urS7t7C1sqq6sq67t7+7uqq3rauquLq0vK6uuaOmo56mpaKjqaaZm5+Ymp2nqqegoaGkmJSjlpSZkZydn6Sep5+en6KdmJmUmJSIhH16cWtkaG94amRaW0ZLTEVEU0xEQkU3Oj87NTQ5OTc4Pj87PDs7OD48Njo9OTw9OTw9Ojs9Pj4+NztBOj45PT45PT44Nzs6Ojs/Pz1CPj83OkFAPTw9ODY2PDo8QT9BQUE+kqugp66ooqulpKKipaGlqquwsq2upKmmlJWWmpaUm6SmnaGqp6KrrLy8v8PBsrK4p6Ghq6qhnJ6hop2clV1MR05YfpPAuKSQmNXk29HEtKafmpybnp6Zl5eXkoyOl5eTjo2Qi4KDgndzcW5wj6atrrS5xbvNx8u/wszOzczHydHMzczHycXGzNHS1c7Tyb3Av8O7xsXIxdLUzdPQ09PMysLGxsfKyM6/yNHMx8XHxcG8w8G+v761vrOuv7/Cw8fEx8Suv7iyuLzDwcG6vLy1rqenraigoqmlmpagmpmdqKupo6SknpePm4yQmYmVmJugn6OdnZeempOTi5WPhYB5dHNlYmdyb2ZeWllDTkxDRVBJRENANTU1ODpCPTY4OkE+Ozs+PDk+PTc6PTk6PDg8PDw7Pz8+PD0+Qzw7OkA9Ojs6Ojg4ODk7QT48QD8+ODtBQTs7Pjc4Njo8PkI+Q0FAPpOvn6ivpqiro6KloKampKuoq62qrqKqo5Kcl5ebmJuirJ2frqalsarFxszOzb+wwaikqKytqqCdo5+cnpZhSkpOZoq619O/r8DUy7muqKKfnZ+amJaUkpSWkZCPjIeEg4iHg4CBgYB5cnJvbHmktrq5vsvB09LTyM3O0dPR0tHQ0dHNzs7Qxc7U1tjS183Gx8nMw8XKz8rT19HX0tXW09PIzMfMzcnSzc7TzcXIycrBxsvHyMnGv8Ozs8jEy8rLz8bKv76/vcHHxMzMyMm/w7+tr7OonqKqo5qTnpyYnqaprKSlppaXipWFkZSHkpKSmZualpiQm5WQjIaRi4B6cnV2Z2NndmlkVldRRE1GQElRQj1CPDoyMkA8RDw3OTxCPTs9Pzs7Pj05Oj48Oz44Ojk5Oj86Pj1APkA8Pjs+Ozk9PTw5Njo6Pj08PEE/Pjk6QEE6OT44Ojo6Oz4+PEE/QT6QrKKiqaanqKSfop2qqKOso6OnpqyiqZ+To5iWn56dpK6bn7CrqKyxyc3U18/Gu8esrbO3rK6jnqOinaCkdV1nbY282Nza1su6sqqjnZ2doaWgnZqUlJWUiXx3cGtlYmhxb3F7hYqAdnBucXRwhbPCvsXR0NbW1tLWzdTW19TT0dPU1NPP0cPQ09bY1dbSy8nO0cvGzdLK0tbW2dXX09bYztLKz9HMztDM0s+/yMfKw8zMzM7PxcbHtr/Kv9HNy8/Gyci/w8PIzszP0M/NysfNuLe7qJ+lq6eemJ6jnp2qpa2pqKiSlYiQhIyRho2MiJOVmZCWjJiSj4aHjIR8eHN2cGNgZXJiXVJcSUpHQUVIST47QTg9NDU4NTs4Njo8QD47Pjw7OUA7OTo8Ozs8Nz09Ozo+Oz08Pjw/Ojo8Ozs5Oz89OTU7PD48PD0/Pz46O0BCOzk/OTg7PT0+PzxBQEQ8hqugnKegp6Oim6CbqaSlqaCfoaGmn6ifmKSimqmmoqarmqOwsamotdDU19rSx8bLtLXBxbG1qKGkpZ+jrIp/k7PS1draz7yuqJuVmKCcm6Gin5ucmZWJd2ljYF9fX19eX2BeYmx1c3Fwb2xycXWSxMfG1NXX19fT1s/V1NrU1M7P1dTU0dHM0c3U19bT1dDP0tPRydPRyNDY19jR2NLX2dXWzM/Pys3Sy87QwMbCx8XOzdHR0cjMzcDKzMXTzsvOyMTKx8bIzMrT09HVz9LM08G5xbGlqLWup5uorKWdsqiws6ysk4+TjoiKj4OPi4SQjpmNk4+Zj4+ChYx8enFzdG1hY2ltX1ZQX0pKQ0ZDUk0/PD41NDo9NTI4NTU8PEA8Ozw6OTpAOjg7Oj46PTg+Ojo8QD08OTs9Pzk6Pz07PTw9PTo2PD0/QD08PT0+OjxAQjs5PDc0Oj48Pz89RkFEPYKknKClnaWlo5mcnaSeo6OfnZ+doJqnnpyhqZ+vraqqq52mrreoq7fX1NXZ2dHO0L+8zMm2vq6mqqihpZyAlJbH2NPWwq2moZiVl5mbnaCemZ2dk31xZWNjX19hX19hYF9gYF9gZm5wcG5rb3J3d5zMwdLV09jY1tnR0tLXz9POy9LN1dTSys/M09bS0dbNz9XV0cbR1MrR1NXWztLQ2NjY18vIzsTJz8zKzMDJv8fJzc7Py9DNzszOz8jL0NDKzsrCycfJzMrL0dLM09HRz9DKvci5sK67uLWqtrCtqLits7+7sZqPn5SRjo2IjpCFkY2ZjJGRlY6RgIWIenZvcG9rYWRucGFXXFpJRkZETVdFO0A9MzM8PTg3ODU1Oz5APTk8PDg8Pjk8QDtAOj04Pjk4Oj88PTg7PkI6Oj08OkE9PTw6Nj08P0A9PDs9Pjg7QEE9Ojw4ODs+PD4+OkVCRT6Bn5mlp6Cfo6eam5+cl56eoZqdmpyappufpKefuLa1taykrK6+tLDA2NLX2tzWzs3Kw9LPwcCwqaytqad/bIGU09bNsJublpWXm56en52UlpiUiGteXl5hZGJgYGFhYGBhXl9fXl1ibXJvb3N0dnZ5pL7L1dHW1NPY1s7O1MvNzsXOytLSz8fOzc3UzM7TzcvX1tDM0dTLzNDS08rO0dXS1dXKwMnBxczCyMnCzMPFyMrKz8rNzNDN08vGyM/NyMfLxcbBxcrMzc/RxtDOzc3Mz8XHwbi5vcPDvcO5s7K+sbvDxLWqmKWimZaRlZWSi5SNmpGUlI+PlIKJhXlwcWttZ2BgcGhYWGhWTEZMSVBQQjtDPjs2Nzo4OTo1Nz09QTs6PD05PD05PT06Pjo8ODs9OTtAPD47Pj5BPDk9Pj1CPTs3NzU/PDw/PDw7PDw4O0FAPDo8OTs7Ozw9QTpFQUU+hJ6bqK2epKSqnJ6fmJKXm5+am56ZmaKVoamppcTCwb+7tbKxx8K4y9XV2drb2MzMz8jW1cTCta+0qKCqaG99p9nQqpWOjZiWkZOSkZaWlpCLfGVhYmJgXV5hY2JgX2BgYWFgX11bXWdycXFyc3FtcnmkxtPPy9DP1NXJxcnJxsa/w8bPzsfFx83K0sjLzs3G0dLQzszUysfLzs/Hx8/Sy9DPxbrEv8bJvcLHyc7FwsjAx83IxMzKy8/IxMTQyMbCxsjEvsDHzMzLzsLLy8jHy9DExci7x8PJyMLPwb28v7DByce5vaqwsqelnaKcmJCbkKOZl5mRlZiJj4J3b3Rka2BeZnBhW1dgR0hIR0lNVEc/Sj02NDM1NT08NDg9PT06Oz08OTo7OT89OTw7PDg6PDo6QD1APD09Pjw6Qz48Pz04ODk6QD4/Pjw7Ozs7ODo+Pzw7Ojc5PD49Oz49RkFDPYOgm6qupa6qq5qdoJeUjpedmpmgmpqcm6WysazJzcrIxL68us3NxtDV1dna29jQyc/P0dPIwra7u62lol9veLnQq5COjpeQh4SEhIJ+hYV/c2BbXl5eYF5gY2RjX11dXl9gYF9bWlxha3Jyb29rbG9vfbjRyMnKz8vNxLrAw7u7urq+ycbCw8DDyMrJyMrIwcXMxsjLzcnEwsvJwcLM0MXLyL+5wbvGx76/xs/Lw7/Du8nHyLvIxsXKwL3Cy8bFxL7GvLzAw8XMxcW7wMrCxcfSxcHJv8rJxsjG0MPDxsOvxMvHw8q3v7y6tKmspKWYn5iso6Glm6Ogm5R7dnN0ZmlaYW5sWltYUkRMRkJHRExERlNANTQzMzQ/PDM6PDw7OTw8PDg7PTtBPTo8Ojs3Oz05Oz07PTs6OD4+PEI+Oz88OTk7Pz07QD48Ozk5OTk6Oz06PDo2OTw+PDs+O0NCRD5/pZypsqm0rrCdnp6YnImUm5man6Kfmp2ov7i8ys/RzMfCw8bNzs7M1c/V2djZz8vSzc3OyMG1w76yspFfcoC+sJCLk5eHe4GFhoB2eHVycF9bW11gYGJjZGRlZGBcXF1dX15gW1laXGJvcm9raWxwb3OPxrzJxczAxsKxtrqysrOyscK8vLy6uMHBwsW+vbm9v7nEysXGwr3GwLi7xMm/wsm7t7u6xcO/vMHNw8a9vbXBvcO6vca7wrqzvMXEwcK2v7a1vb+7zMO8tbrIur++y8TBxsLGycbIxtDGwszHssfJw87NwcXDwL2zt7Cyp6ioubClrbCqrayUeXZ3amRnYGhvY1ZeWUpGSkZISkFFQkVJQDk6NjQ4ODUzOzo7PDk8PDs5Ozk6QD46Ojw6Nzo7Nzo7Oz88OjxAPUA/PT8/Oz07O0A8Pj4+Ojk5ODk3ODo8PDw7OTo8Pjs7PjpAQEU+fqygrLWqt7SyoZ6fl5qNlJaan52mop2et8XCxMjO0crKysfNzc7RyNDG1dTW183Kz8XJxcfBucW9q6+DY3WPtZKMiYuFeYGHh4B+hHx0dGNbXF1eYGBiY2FiZWViXV1bXF5cXl1aW11daHNxbWdnbnByeZ29zMDDusG4rrCwp6qtrKe4tbe0s7O0vLa9sbewta+yu8K8wcS8v7q1s7q+wLjHubS7tsHCvLi9xsHDu7Wusra6v7TEt7u1q7i9vcC9sbq2r7a6s8W8t667v7W3tMW8vsPFwMPFxsjLxcDGxrvIy7/PysfDxsLDt8O9vba5vse/rLW6tbe2jnl0eGZnZWJrbl5WXmBGS0hISkZCREFFRT88OjU2NTYzMzs6Oz06Ozs6Oz44PEE9PDo7ODc5OTk7PDo+Ozk+Pz1APz5CQD1AOjo+Oz89PTk6Ojo4NTY7PT48PDo7OT49OT86PEBAPIi3pauzsby8sa2foJmUlJiXnqujr6qnpMbLzcjFyM3M0MzNyMrIysnKxM/N0s/NxcfBxcC+urjJtqqwgWtymZyNhomKe3l+hoZ3eIJ9dGleXV1dX2BfYGRhXmNlY19fXFteXF1eWltbXV9scG5oZmpubnJ8pMe/uLi1sKusp56iqqeeq62zramsqbSvt7Cyqa6mrLK8urbDubq6sau1ubu0wrqwwLG+vLu2u8e5wratqqiwscC2uL2wsKeys7W7vKuutaWuta67srCpubCtu667uLvAwL25wr/Hw8XBvMbCyMu4xcfFv8bDw7rExsK7xsnMy7O5wry7s4hzdnZraWFibGhZV1dbQUxLTUlFQUM/RkE6OTo5OTU4NTQ6Ojk7PD07Ojs+ODtAPD05Ojc5Pjk7PDo4Ozs6Pj45QT0/QD87Pjo7PDo9PDw4OTg5NzY4PDw9Ozw6Ojs+PTs/Ozs+QDyKwKuouLe5w62zqZ2ZlJaZoZymsLWxt6bFztLLw8XBxc/HzcHDxr/ExMPDysLJyr6/vMC6srS0w66proZrZIqSiI6QfHh+ioV6e4SBd25eXVxdXV9gX19kY2JjY2JgX15bW1paXVpaWlpcZG5vaGdnaWtucoGtubC1rqalp6eaoKWhmpylq66kqKKsqqyqr6Omn6qttbaxvbmvt6+prri0tLy4tLyvt7m1srvBssCupamiq7GytKi9qquoq6yttLOmqK6hpK+psqanqK6mqLessbK3urq7sry9vr7Ev7XCwcfIt7/AxLfEwr+7v8TCvsTIzMq/vsTAwKmHc3RyamldYW9kV1ZYUEhZUlNLRkZFPj5AOjc4OTc3NjQzNzo5OTo8Ozs8PDc7PTs7Ozw4OT44PTs8Njo9Oz89N0E+P0A/Ojw8Oj05Ojs6Nzc3ODg3OTw7PDs5Ozo8OTc5Pjw+P0E7jMKvrry3ucSwtrCbmZWcmKqpsLGztb2vxdDPzMPIurrLwcu+u8m2vcO+usq3wcPBtLW7tbCutLutqKeIYG2Ng4iLgHt+gH54dH98c3dlX11cXF5fYF5fY2NhYmBgX15dXFpYWltbWVhaXF9ma2ZlZ2Vpa29yhaqlrKWgnKKllJ6lm5iRoaOqpKKfpaWnpa2gnZylpqyyr7a3p7CrqKq0q7S6sba1rra5sa+6urG2pKCkn6axqKuouaqkp6iop7KtoKemn5ukpqyen6ekoKCxra2ssrSytLC1vLa7wcGyur7DwbK5ucOzwL2/tbi7vb68wsfEwsO+wMSgg3hwa2FmX2tvYFRZXkhOZ09UR0VKRjw9Pz06Ozs4MjU1MzY5OTk7OTo6PDo3PD88PDs8ODg8OTw6Ozc4Ojo8OTg+Oj89OTg8Ojs9Ojc2NzY3ODg2NjY7Ojo7OTo7PDg1OTw6Pj5AO43ItbW9uLrAur21oJ6VnaGmurars7O7s8TPycvCxri3x8HMv7jJt7vFuLPEuLS+wKu1u7GrpK6yrJ+hi2GAh4aGgXx5dXRvbWtqanFpXmBdXFxcXl9fYWNiYGBgYF1cW1xcWFlYWFhWWFteX2RjYmVnZ2dqbW+Inamgl5abopaco5mWjZ6ho6ebn5+jpaKonpuim5+rsKyxtqOpqqqsrKS0ua23sKyzta6yta6wqp+dn6SisqWmqbitoqamn6isq5mfoJ6ZnZ+lmpqjnJudr6mrp6qrrK2xsrivuLm7sLa8vLqrs7O5s720trGxtbS/tr3AvcPBu7u9l4N7c2tfZV5kZFhUV11JV1xLUEdJSUZBPD8/QDs/PDA0NTM1Ojs5Ozg5OTw8Nz4/Oz07Ozg4PDg5ODw3ODo7Ozo7Pzo9Ozc4PDo9PDc0Nzc2NzU3NDY2Ozc5Ojs6ODo5ODo7OTo8PzuJyba4vru3wcHBtKSkmZqkpsCyr7astLfGz8jIwMa7u8TDz765x7i3vreywbSxu7uruLmwoZ2oqqaWnYVmgoWGf3hybnBua2JeYmZmXV1eXV1dXF1fYWFiY2NiYV9cW1taWllYWFdXWFhYWFpeYmRkZWZmaGlrco2nnZSVlZuYm6KXlpGco6KonZudpaaippygoJuYrq6trrKgpaKurKeitbGysqyor7KnurOmtaCinpujoq2joqq1qqKjpp2mpqOWmZ6XmZqdoJqXnpycm6yhq6ejpKatq7O0qrWws6uyubSvqa+ysrO3s66prK6yuLC6trq9v7ezsZSFeXVlXmVeW1lWU1pVS1tRS0lFSEtJQj0/QUFAQToyNDUyNDk5ODk7OTo9PDY9Pzs8Pjs3Ozs3Nzc+Njo+Ozo4Oj07PD06Ozw6PTs4Nzk3NDY1NTQ2Nzg1Ojo4Ojk5PDg3Ojg5PkA6gci9t72/tr68v7KdpaOYpbHCtba9rbS4wszIxsDFtsG/x863wMS9s7m5sr+2sbi6rLG0rZ2Yo6iekZp6aYGDhH94b3F0cWlmZGllY1xcW1tdXVxbXmBhXl9fYF5cW1pcWllYVldXVlhXWFdWV2FkZWNkZWRkaGp2opyUlJCVl5egl5mVmKGeoZyWoaKppJ+fqZ2cmqunr7Cqm6OkuKqhoK6otqqmp62wpLewpLegopuZmaqmoZqsuLCioaScop+fk5ShlJWWm5iXlpeclZ+pnamjoZ2jqqqwrqi0q6qnrbOwpauusrGwsK6vpqensq6xtLC8tLm3rqOUgXl1ZF5hVllXU1JUS01eTE9LR0dMTEU8QD48Qjw7NzY1MzQ5ODg5OTo5Pjo4Pj47PTw8Nz49Njc2PTc7PTs5Nzk7Ozw+OTk6Ozo4Njc2NTQ1MzEwNDU2Nzk6ODo5Ojo3Ojs5OT1AOnbAvLS5wrG+uL2unaeoo6q7wL3Aua60uMHMx8XCw73Ft8jMssHCwa68u7W7vLW4ua+vr6ebmJ+nko+KcnqAfHdxaWxydHBpaGVkZmJcXFpZWlxcXF1eXVxbXF5cW1xZW1taWFZXV1ZXWFdXV1ZbYmNjYmNiY2RmaoGWk5WMkpSUm5mdl5ecoJyglqGgpqWkpqefnZ+moKqvpp+ipLeooaGiqLSipailsKWwrau0nqCdlZWqoaKUrbGxn6KjnZ6Ym5OLoZSRk5iYk5eXmJedppunoaKZo6Wlq6SlsKelo6urraaorq+uq6iqqbOlpqyvtLGvvLWxr66gknp2cmRhXFpdWE5MUkhSYU1WUE9KTU9FQkQ/OT02OTo3NjQ1OTk7OTg4Nzs4OT0+Oz47PDY5Ojc7Njs3Ozs6ODU6Ozo7OzY8Ozg4NDc4NjMzMjEuLzI1NTY7Ojg7Nzg3Njw7Ojs7QTh4u7uxtb2wu7G4rJ6lp623u7zBxbqxubXEycnAw8bGx7bGxLPCv8Wrt7e9tr27urWyq6ulmJedoYqHcXuHfnZuY2FmaWhmZ2pnam1gXVxbWlpaWlxdXFtcXl9cWllbWllaW1dVWFdUVFZVU1RSVWBgX2BhX2BhY2RpgZSTiZGPlJOUnZWWl6SZoJecoKWiraakpKOjopyqq6WZn6WxqqChnaWrnaeinq2sqamtrKGiopWYo5uckKupsJufop+el5mTip6RjZKTlpCYmJOcoaKdpKChlaCipKabo6uloqSqpKuupa2yqaalpqa0pqmorbO1tLm6r6msnotycG9gW1dWVVJHUU9IWltPUkpUS1NMRUZJQzg7Oz08ODY2Nzo5Ozo5NzY5Nzc6Ozo9PDw2Ozw4PjU5ODo4ODY1OTo7PDk3Pzw5Njc4NDUyMTIxLi4xNDI2Ojg2OTg1OTg5ODk7OUA5e7W0rbS7srCrsq2dqKevubmzwMi6tcCvxcjMusHKzMi1yb2xvsTJrLG4wbW7wLu0s6ippJSYmZqHfnCHg3t0aWlqbGdqa21ram1lXVxcW1tcWlhaXVtbXmBgXFhYWllYV1hXVFZWVVRVVVJTT1FZXVxdXV5fX19iZG2OkISRh5CRj5qTlZOcm6Ocm6CoqauorKeopaSZpa6klJmlr6mfm5mboJ6umZurs6Clpp+io6GVk5uWlpKpqq2anJ+hoJqUkIyZjouQjJKNlpWQnqGgo5ybo5WboaOhl6Koo6Koq6Crr6Ott6Wjo6Ksraqoq6+zt7O+tbOrr5iEdHNoW1hYUlVRRVhMUVtYTVROUExQUUlOSUI8Pz9BPzw2NTc5OTw8OTg3Ojc5Ojs8PT47Nzs7Oj02Nzo7ODk3Njk4OTo2Oj05OTU3NzU3MTE0MS0rLzQzNDk4ODo6ODo6NzQ4PTg/OX6zraiztq6pp6+um6morLe2rLzKu7a/rMvGxbjBzs/Is8S7t7vDyLGtuL+3vL26srOjp56UlZaUhXhzgHZ3bm1obW5tcGdnaWdkXVpbW1tbXFtZWltcXF5fX1xYWFlYV1hXVlVUU1VWVVVTU05QUVlaWlpdXVxeX2Bkfo2Bi3+MkIqSjZeRl5mioJugrKqmrqyor6Somp+soJWWpKinnZeQj5qerpaYqKqZn52UpaCekpCSkZOVp6ulmpmZnp6VjYyLk4aIjYOQi5GVkaCeoaOXlZ+VmqGinpSbpaWnqKigsbCmsbynn6OstKuup7C1sLm1wLGtsauQfXJzYlZTVk5SSUZWUFJRTExXTUpMTlJHTUpBQ0ZEQz5ANjU4ODk7OTo3Ojo3PD06O0A+Ojk7OTo/NzU5Ojk4NzY5NTg3Nzk7ODU1NzY2NjEzMjAtKi4xMDI4Nzc7OTk7ODk0ODs4QDh/s6ymsbeqpqKwq52qp6mysaW2xrS5urPKxbm6wcvQy7G2uLy+wcOxsLK3rbSzurKxoaGam5aVkoF+dmtnbG5xbnFqcGtkZWdlXlpZWllaWlpaWlpaXFxdXFpYWFhZWVdYV1VVVFJTVVNWVVJOTk5SV1hZWVlZXFxdYWqAen92iY2HkIqXiZSUmJuZnqmboKqmpaudqJmhpZuTj5+jm5eXhYSSm6OPlKOdlpaWiKKbm5OLjoqQmqSnnJWVl5uRkYeUjouBi41/kIqSkpKgmp+ilZOYmJWippmNmaSmqKahn7SyqLK3oZyit6yqraSysqa1vLasq7GjiXhzbV1OUVFMT0NNTk5QS0ZOTkpKTk1RSU1KQUdMSEdDPTg1ODg4OTo7Njk6Njg7OTk+PDg6Pjk7Pzg3ODk6ODg2ODU3Njg4OTc0NTc3ODIwMzAxKyktLzEyODc2Ojk5OTk4NDk4OEE3d7anpLaxpaejqaWgqKWks6qissO1tbKzxsa3usPKzMazrLq9tLfAr62psJ6mrbmuq52YmZuUkoV6gW1fX2ZycHZxaW5pZWdoal9YWFhYWFlZWVpaWVtbXFxZWFhXWVlYVVZSU1JQUVRRU1VRTU1LTFNXV1ZYWFlYW11hb3N2cYWIgoiAkYSPi5SRlJ6hj5uco6GjmKWXopyVjYeYmoxzjYN+jZeWhpGZkJSOjnuZj5yMgol/ipifo56Qk5iWhY2ClH5+dImOeZCHk4+QnZqZmpGVkJ2OoqOOiZqgoaSkm6K0r6yvrJ+YpbimprGhsa6csLyqqa+qmYJ3c2NWTVJPUE1DU05MUU1CUFFISU5STUhKSkNKTEZLSzw3NDk4ODg7OzY5Ozc6PDk6Ojs3OT85PkA3OTo8ODk3NjQ0NDU4NzQzMTI1ODUvMDEwMikoLC0xMjc2NDc4OTo6NjU6ODdBN3i3oaO0qaalqKOmpaamprOnprTBuLC0sMnEt7nBzsW+s6y6wautw62ooqaSnaa1q6GcjpSVkY58dn1lV1ZfZ2ZpZ2huY2poZ2JcWFdYWFhZWVlZWVlaW1tbWVlZVldXV1NUUE5QTk9PUFNUUk1NSkhOU1NTVFVVV1lbXWlscm1/hXx0TlhykIOXho6dl4uUkJ+YnZWUlpWPlomAk4lfO1dvfIuUiYCMkYyQhoZzioWWgXmBeoWUnZSDlY6RkIOGfZN4cW+FjX2JgZGNj5eamJOKj4mch5+Yh4iWnpqhoJenr6mtqKiflq2zoqaumayrmKi0oqmto5N9cm5gW05TUlZMRFRKUE1MRk5PSUVMUU1LT0pJTU9GSUk8NzU5OTk5OTo3Ojs6Pj44Oj09Nzo/OD4/NTg5Ozc5Njc1MzMzNzYwLi0vMzQ0MTEwLy8oKSsrLTM4NTQ3Nzk8Ojc5Ozg2QTl5t6CjraGmpqqgp6mno6mwqKe0wbmxtbDHwrezvc+/ua+utcKnqsWpo52Yg5SbrqCYlYSTjoqGe3J0XFFMUlVZWlddXmJnY19ZV1dXWFhYWVpZWFlYWVpaWllYWFZXV1VTUk5MS0hHYlxNT1JNS0hGSE5RUU1QUlRWWFpgbXBpe4J0UEJAf5WRkX2JlI2Eio2bjZaViZKIhpWGeYh/YEpRbniKkYR9hI2KhX9/bn5/lHd1dXeEjZlwUY2IioZ7fniUdmh3hoh+ioiVio2RkpaLhIqIlISajIKEkpuWnp2UpKOoqaWknpuwqqGkpJGmqpaiqpyipqiJdG1nXltIUVFSTUlVTVNJTEtPSUhGSk5MTVRLUVBPRklDPDc2ODo4Ojs7ODo7OD4/OTk+PTg7PDY7OzQ3ODs2Nzc1MzQ0Njk2LzMvLjEyNTIyMS8sJykrKiw0ODMzOTc5Ojk5Ojo6Oj85d7abo6edn6Kvoaeopaeor62qtby2uLezwbu2p7nIuLaoqLW2qrK8pp6Vjn+Jk6eVlIl9jYOBfHZvbVhNS01OT0xNUVdbXFpYWlVVVlZWV1lZWFhZWFhZWVlaWFhWVldVU1BNSkVAQJtrc3NJTUtERERJTk9oWU5RU1RVWm6DdHd+amldVY+JlIl0f4eBfIWMk4GSmYuPe4aPgHZ/eHNudXB0jY6Ben6Kq4V5emh2e45wcm14gYuNknh6gHuBdnJykndndYSEhIR7lYmIioyLgH+Ei4x/lIN8gZCYlZyVkZ+dqZ6foJ2gqaWfnZiNp6SToZ+Wnp6kgHJoYFxcSlZPUkdKWFJPSkxNUkpKSkxQSUxRTFJUTEVIQTw3Nzs5OT49Ojs8OThAPzo6Pj03PT03OTk0Nzc5NTY3NjI1MjU3Mi8yLiwvLzIwMC8tKygoKS4xMjcyMTk4Nzk4Nzc1Ojw7N3aumaOimJyftKmvqaWtrLCxqr20sru4trq0sZ+3urKqnZ2sqaiyr6GakY6UgY6bjZB+doV4e3VvbmhYS0hISEdFSEhQVFRUV1dTVFVVVVZXV1dYWFhYWFhYWVlXV1VWVVNQS0Y+OTNOPH6eTUhKREA9QURqlH5MT1FRU1ZedYN9eWd3jZeYjY99aHmBdniAiY99hJiSgXGHj3x3e29rfq19c5CLf3uGkoF9f3RmdnyGbG9oc3yJjIiAbHlxfXBtdY9xaXGAfo5wQ4uEgoOFf3d3eouFfox7dX6Oko+YipKam6OWmZ2anZ6inZaNiqWbj56XjpaYj3ZubWViWldXVFFKU1VUT1BOUFZLTktOT0pRTkhOT0tFQzw7Nzk7Ojo/PTk8Ojk5Pz87ODw9Nzw5OTk5MjY2ODU2NjMzNjIxMjI0LiwsLS4uLTAtKyonJyouMTM2Mi84NzY5NjY1Mjc5OTV5ppegnpagpq+srquoqbCvsau8uKy7vrmzrKebsKesm4+WnKWppKCXmY+EknqIjYqKdnF9bnRwaWxpV0tGR0VBQENESUxMTVFSUFFTVVRUVVZXV1dYV1hZWVlZWVlWVlRTUUtENzhmNzA/qGlOSEM9OzpEioV6WkpOUFFUWF5lcHJtiKeqwH51eWN8eG98eYiQen2Lhm9tjJJ5dHhqaoCCcZaRi4F+loBJk5huaHd+gmxpY2x5hZCShmtzbHxucnuGaW1wf3ONiYSGen1+e3ZvdHOFgnmBeHB8joyKlIOWl5iakJOWl5mXnpeMg4mfkYuSjYaQln5taG1ubldVV1RSUVlPUlRUU1hVTU5ITktNTktDSE5HRT87OTk7OTk6Pjw5PDs6Oj0+Ojg6PDk/ODY4NzI3NTc1NTQxNDQyLzAyNCorKiotListKigqKCcsLTEyNTAsNTU2NzQ4NUhBODk1d5mRm5man6WtsKKsqqi1r66stL+rvMK/pqKZlaSXnY2Ei5ShoZiYkZOLc456gIWLhnVvdWxwbGRralhORUZDQDw+PkFGRkdLS0tNUFJSUlRVVFRWVldXWFlaWVlaV1ZUU1BMRTFAmjMganNDmW87PDk1PICChl9JTU9PUldaUllcYKeIYpppdHplf3Btf3qLiXaBiIZ0bJqSdHN8amudj015hZKJhI5nMXaGc2x+foN0ZmV0foSEhYBmaWx1a3GAfGdxcXtuk42Pe3N9fHFwbnVtgn94eXVqeYmCiIqElpOSkIuNkZSUj5eOgHmIl4iGioaAkId2ampuZ2RXUVpXWVlbTVBVVllYTklIRUpKSEdCQUZEQ0c9OTk4Ozk6OTw6OTs6OjpAPDk6PDk4Pjc4NzcxNTI0NDUzMzY0NTAzMS4qKispLCwrKykoKycpLCwyMjYsLDU3NzU0NzhpTzg7NW6SiJqRmZakqK6esp+muq+rsrDCsbvDx5qWj5SZi42FeYSQmJSNkIyPhnGHgnSHjIV5cHNxbm9kcGZfVEZJQz88Ozk6P0BBRERFR0pMT1FRUVFSU1RVVlZYWlpZWFZVVFNQS0U4MC9cYLNHOVhQOzk0NDGWuotITE1PT1FWTEFJUUlir7Ogcnx4bH1tcoOBhYF6hIaGeXKhlXR4gXN1lIc1cZ2onY6hoYSihXZwhnyHfHOMrY2JgGdmYmpucm1wg3Vpb1h1cI6akndsf3t9bXFtcIB6c3ZuY3aEfoaAhZCRiouJkYuRjIuPg3V4i4+AfoOAfo96cXBva19aXF1bWVhgX1JOW1pYV0xISkZKRz9DQUJHPkNEPTs5Nz07Ojs7OTo5OTs6Pzw4OD06ODs2NjY1MTEyMTM1MzQ3NTUzMS4vLCwrKSopKSoqKikoKikrLzNETTIxNjY2NDM8dlI3PTdikoGTiJaRnqSnnq+VpbWqrrGuwbK7wcaWkIyUkICIfW6BkJKJg4qHj4V1goRslYiHe3V4eGx3bndjaV5JUEc+QDc0NDk7Ozw9PkBCRUhMTExMTlBRUlVVVldYWVhWVVRTUExFPDUqnUtbQC1nSTk0Lz+Sg6muX0dMTU5QTDdDTVJTREqGdoB8fHZ+bXeIiHx+hYN/jH52opl5foaBhZmEm5xhhqqfnYuDkI56d4h+iYiNc4qXj4R6XWRxdHp7d4psZ2pieW+Fj4J6boF3dIR6cHR6d2tuaV53h32HfIiHj4CLkpeDjYWNh31xhH+EfHV3e32JdW9yc2VmX1tbXVNbZl5XUVVYW1VHSktFS0c/RkBEQz5BQT06OTc8Ozs9PDo6OTk7Oz0+Nzk+OTk4Njc1NDI0NDAwNDY0NTY1NC0sKSsoJycnJigoKSkoKCsrKy8wMFVyPTIzMzMxRX5XND05XIx4ioCUjJKdnZ+mkaCroLGor8CxusW6lo6RlId6hXZrf4yRgn2KhI6MeIOBc6GEi319gX9wgH56Z3ZrUldMQEUyMTEzNjc2ODg6PD5CRUdGR0pLTU9QUVNUVVdWVlZUU1BNRkA6Mj0gI5ZjjFs1MzExaT9Hb0lGSUxNT1JMS1RdWVJKaYSIe4l5fHF8j4x6fYmHfpeHdqGZiIePkpSljaypSIaur6+LgYCTioKLgYSRqIeAmJiKnHNtfIGGh32OaGdoeH5uhYeChXGEhUdrgHdyeXZobWtfd32DiX+IhYx6lZ6biouIkX96dYt2fHdtb3d+f3NycWpaXVxbY2NYZmVcVVBQVllQRExLRk5JQ0ZDQ0FAQ0E9OTg4Ojo6Ozs6ODg4Ojo/PjY7Pjc1ODU3NzMzNDQyMzY2NTY3Njg7REZMTU1MQzcrIiYnKykrKywvMDArbnUyMjQyMEyBXDU9PF6EdHx+ioWIkY+WmJKXoZ2soaa4r7O8s5eNkouYi310cH+Jkn59jIKSlH2Gfoakh4h/goiFeIeIfnOEeF9jVktCNjAuLzIzMTMzNjY4Oj0/QEJFR0hKTE5RU1RVVFRWVVNRT0dDPzgwLCOHWz4/ODQuXZZwc6NVRklLTU5QV2BZcFpcXmqNk4eVgYSChZGTfoWJkYGalYKgoZeVm5qlrZOau7Gnu8fDqIqMoaWPlImBkXtyhJ6fkZx/doWFio+IkGpob4OAdY2HhItxhoJ3h4B7doV9bnZ1Z4CUj4aJiIiIh6GroZaKjph/e4KJenpvZ2t4fnh9cWpjXVpaXWlcYWZfWU9LTldSUUlQSkROR0NLRENARERBPDo4Nz08Ojw6ODg3Nzg6PT04PD02ODY1NjYyMzQ0NTU3Njg2NzxCQj88ODo+Q1FeZVxHMicmLCwtLS4xKD+LWy4zMTBPg180PztudXBmeIN7gIyAgZGPi5ubpJyhrKarr7CXkZGEoZSEeHd/jJR8f5KGkpV/ioCSm46DgIGLi4KJjYN/iX9scGpdQkE0LS0vLy4vMDIyMzQ3Nzk7PT9CREhKT1FSU1JTVFRSUE9IREI8ODcvOUQ+PDw2My5sk5dNUEhKTEtLTlZgY39nZ211nZuPmpOTi42OmoiTj52LoKCSo6qlo6yTqLaiqMHDrseveLqUmnyNoZ6ZhJOFgo+in5SZkoSKhY+YkZZscHWJi4KWjI2Pdo+EcWyFgYqWkoOFiHKJoZaHk4mPj5altambjZWig4eThH1/a2prfIB/gHJhXGJeWWZqXGtrXldLR09TUU5NTEZJUENETkZCQ0VHQj46OTc9PDo7Ojk4Nzc2Nzs6Nj06Nzg1NDU2MzQ1NTY2NjY4NTU2MzEwLiosLCkoKS46UGFcQCwoLSsrMCwncog3MjQwT4RiM0A8dW5nWXCCcHWHcXaShn6YlpqUn5+cp6CqlpOYnmdlpJp+hJKReYCSiJCSfYqFmJKRgoCAi42JhZCGhIiFeHh/Z01SPi8uLiwvLi0vMDAwMjEyNTU3Oz9DRk5QUlRQUVJTUU5QSUVEPjs8OkNGPz48NzUyPD9SNUhISExMTU5SXm+KfHOBfaCdm6imopmhl6KVnJ+onqmrn6isqaq1l6u/q7bIyLfJ0c++m6Bwaaupn4SUkoWcoZqamaeRkYiVopqad3p+lJiSoZKXl4GUnnt2lZKrs4mNl6B9lJ6cjpOWmaSiprawnZGZqIiXkI6BiGxzc3x+enBnYFtfXmFmY2BnZ1xRRUpLUE9JSkxGRk1DSExGRkNCR0RBOjg1PDw4OTk5NzU2NTg+NzU9ODQ3NDU3NTQ1MzY5NTg6NjE2ODYzLzAuLSosLy4tJyMqO1hiQigqLDEtKEuXXjA2M1GFZjJBQGlhXlBwdWBufWF3jn18lI6Oip+Sl56WnKqYnqpCRH2HiYeYjXiCjYqOjHuKho+QjoGCgImMioSShYKGiIGAh3dfYlA0NjAtMS8sLjAwLi8uLjAwMTU+QUFNUVJTUFJTVVNOU0xFRUA8Pj1HR0BBQDg2NjI8OTtGSEdJSU1PUVlthpB3lYujp6q0vbilrqysp6i0rLC3srKtu7GzvpyzxKy7ycu4xL+4paOwsqytq6SLlpiFpqagopeBppmNoqqopIeFk6ShoKqhpKmOnLGLlaOnt7uboKOwk6Odo56RpKKrr62ztaKVpauImomSipZ6e36EfWZfZ1tkYV1jY15mZl5bT0NJSFRPRkhMRkpHRUZIQUtGQ0ZGQTs4Nz08ODg6OTc0NjU4PDU0PDc2OjQ0NjQ0NzM5PDM4PDIwMjU1MS8xLi0qKi8sLSooKiYlNVhYLywwLCwwhIE4NzFQhWg1QUNbWFRMaWNXanBYeoV2gZSFiIKbg5KQjZLayJ2Wc1aXiI+InI98hoyOiol6iIKHkY6DhYCLhYaHkoaChImGh4eHcW5hQEU2NDwyLzExMC0sKy0xLy00P0RBTVVRUlNVVVdVTltQR0dEPD4+RkhDREA4Ozw1Qzs9RktJR0hST1BXgZOghK6js6qywcfDq7PGtqyzwLO5vra/tMG2u7ukuMaptsnHtr65tKijtK2xsZyakpqfiaevq6SVdp+kl6GrsbOYlqqtqK62u7K6rK+1orGssbW8t7WutaCnqKOom6mwrbK6uLinm7epjaWOkZOgh3mBgnRYYGNVZWFgYl9gZV9aVUpERUxVUUhKSkRJR0VBQEBLREFNRjw4Njc7PDk3Ojk4NjU1NTcxMTw4ODk1NDY2NDk3Pj0zODkxLjAxMjExMzAsKiwuLCsrKyooJyopRVowMCovK2iSTzYwUodqNkFFV1FKTFtaUWNkV3p1cYKUfYWGk3aFfoCNe7+7o7yCtJSTjZuPhIiPkomJeYaAjJOMh4WBjn+BiY6GgIaIhYqHkXp4bl1WQEVNPDY6NDZBQjc2NTAvNkNIQ1FbT1FVV1VcV1BfVUlLSkFAP0dLRkVEOz5AN0Q3P0JKSkVHV1RQXo+lraOxtMO2uMHMyba8xb2zs8C3uMK1v7C4dLK0prrFpLDGubGzsbSopLW2qrGgopabopKlsa6mraynpJigrLO6oqmyurW7vsy/xcW9vbPCt7q4v7e6t7msrbCmsaqtvrC9u8LCrJm6qJSuj5iYq4l+gXppVmFgV2lkaGRWWmNZVlRJR0dMUUdDSElBSEQ+P0JCS0BATUM5OTY2OTo/Njo5OTY2MjQ2LzE5NTk5MzY0NjI3Oz0/NjoxLi81ODo5NjUwKigsLS0tLCwqKCgrKyhFUy8qMDBKj2s1MlCHbTY/RlFMQUxSV1RZVVp3anB/j4SBjoVuenJ5iGK4oZmjiZWTlpOTk42Ql5KHh3uGgY2VioCEgIl6fIuHhnyKgoGKg5V9d3l1ZU9cZEdFTDpRZGFbXlNGPztIUERaZFFRWVhZZ1pUYGBNU09FQT9JSkhFRkFAQz1FNkI+SEdLTFNaVF2Tr7i1urnJwLu9ycy7vcC8t7W8u7e+tbqyxmB1s6Wxmp6rvaqlqKuqo6KytaGrp56Vlp+Zn66lp6elnqSUoqews6eysry2wb3TycrTxsLFzMLKw8C+vb+8vLe0sLm3t8O6xr3DybCeuaqirI+lqLeJgX5xXmFhXFZhXmdlUlhhVlJVSUVFTktBPkdEPUtCPUJAPUY+O0hANzk2Mzc5PjQ4OTo1NzA0NS8yNjM4OTM3NDUyNj84QD5HS1JUVFJQUFFSUUpBOS8sLCwqKygoLC0sL1A+KC40OIB9PDJLiHE5PkNLRUBJTVBSTFFdaGxscZCNhZBzbHNyc4jVwLWZoI2VmJmRjpeRlpaOhod9hoOMlot/g3+CeHqLg4d7i3mBioKXf3R9emtlcHVZXVxQZWViYGVkXVtYV1xNZG1VUm1tXm9fWGdlVVlUSkRBS0tIRkhISEhCSTlEP0hLVFRWXFpbkrnAub23xsC7ucrLura6tri5s7i1tK62tplkdaierXBeoqycmKGjm6Seq6WUn5+QlI6WmJeon6Wfn5qZg6SdrKSqsK23sL251NHP18/JzNLMz87Kx8C/wsq9wb3CwMXExsq/yM+0pLuwtbCbrLm9mn54a1xfXFldYVliYlFbYFNRS0NCRUZFPEBFPkJIQkBDPTpFPj1KPzQ3NTM1Oz00Njg5NzcwMjIvMjQxNjk3NzU1NTVEM0VMTT41MTAwMDY6NDc3QElPSjstJioqKC0uLyxATSsvNTRtiUkwSIl0Pz5CREBDREZLT0RSXFlpX3CXkpGUbmxvdXWIs6yhoZ+LmZyZjIyVkZuShYqKfoiHjJCLiXyBhHN7iYOGfIl0goqGlX9ze3hsbXV7aHJlaWxpZmppaGBmaWhtWm10l62kvIiHZ1tvaF1aWVRISk5QSktRTFRRSUxBSkdLUF9fYmZpYZi3x7C5s7u+trLEx7awubGwu6yzsaeqt6yNtqeem6eaT5udjI6glpGmmKWVipOTiZCJj5CSnpuhmJuVloeemaabrK+or6eztNTU1dbSy8/T1c7Tz83FwsrQv8rJy8nSyM3NwtDSuLDEvMS6pra7xKKBbWJbXF1YYFdZZVlQXFdOUUNCSEVCSDtBRD5BSD8/Qjc7RD5ASD00NjY1NTs6Njg3NjU0LzEwMTQ2Mjc4ODc1MzY3QzVCOD8tMCwxMzQ5PTk3LC4sMTtGTD0pLCguMDAwN0s/LTQ2VIhXMESHd0M7Qj5FQkFDSk0/VVlTZVdzkJCYg2hxb3l5g6CqnqaXjZubl4uNlZGajn2Ji4WOioqLkIh8hIJwf4eBhnuHcoOSi499cXh1bHF4fnF7bXhzbGiAcG1jaW1weWl3fX7Lv8Lfp21jeG5jW2FgSlBSVU5ZXlBdXU5RTlRRVVRcbm53gnKWrristKewtqutvcCxq7WmpbinrK6hrLSjjrGumpiYjJGUkYSOm4GNppGciYOLhIqJhIuDlJWYl5SbkZyXmZmenquspKehrKzO0tXRzczS09TQ1NHOyMPU0cjN0tPT183S0cXS1sbAzsfIw6m/uNCdeG1kXGFcVl9SXVpOT1NQTkg+QUZCQkU8QEI/RUU+Pz86PT09PEpBNDU0NjU8ODg4NjY0NDEyLzAzNTI2NzY4NTMzOz08RT1AMTErLzM0OT81OTAxMDIyLTJFTzMpLzMuMzI9TjI0OEN9XzJBhnREOj09ST5AQ0ZIPFZSTU9bdYaFindtd3B9foChnp6hi42Zk5OMi5OPloR5hZCQjYuKiJGHf4J7cn6Agod6hXWFk5GJf292c2xzfHt2fHOBd3FqgHJyaW9xenlye77Lmn6MsYN2coR2aGFqXUNaWltWZmRYZWtUWF1cYGNdY3h7f4uBmaqkpKGgoammqrG5qqa0o6KtoqOtoqexn4mmmpSSkYqSjoiCk4lrlaKNmISBhX6Rg4OTlqyLlY2VmY6FkpCdl6ewoaCgpKSox83PyMLL0NPR1NLO083G1tPN1NjW1tjV19XJ1NrNydfW0cqtxMPLiXFuYl9fV1NZUltPSkdJSUpAOzo7RUJEPEJEPkhCP0JCOzs5PDpHQjQ2NTQ0PDU2ODc1NDMyNTAvMjU0Njc0NTU0NDw+PUU/QTYyLy0xNjs9MDgxLzI1NC8tLjtSMDE3LzUzMkVEMjg+bmI1PYF0TTk5QEk8QUQ/QTtQTEZLWXCAdX1oc3lygomBnZWdlIWLlomPioiOh49/d4SUmYuNiIiLiX6DeHN7fYOHd4B7h5GXgYNud3BtdX92eH1zhXx5bId2dG99doR1eXudtYw8QYrGpX6NfGllVklDZWNmY2hqZG95W19maGtuaW6Ag4mRi52foJ2Ql5ifo6OmsqSks6CipZ6hqaCisZyGnpKSkpCLjouGg4+EfpybjI2ChIV6lH6CqZWjjJKKmJKLfZeKmpGrs5iam6ecp73Dxri2xs3S0NLQzNLLydTP0dXa19fY1NnYzdjbzsna2tLWv8zMtHZ1bWNcWVJVUFlWRUZKSUVFPTo3OkBBQzpHRUBFQ0FEQTs/Ozs3REM3NTY1NTswNjg5NDQzMzQxMDE0NTU4NzU0NDQ5QD5EQkM8MzMuNkZUV09RSkFKRj8xKiguQlQyOTI1NC83Szc1PGBiQTxzdlY4N0FIOj9DPjw5UUVDSlRsbm9wYXFxc4aNfJeRnYt+h5KCiYaFioKHfHiFlpeIj4OHhod6hHlxenuEhnV6hY6NnXqMcHxvcHp/cnyBcYOHgG6OenV3fXyCdX98h4iwdFipwraMkoFwbmI9XmhycHFwbnh3gmVpb3J1eHJ7i4eOlJKblqCWh4yTm6Cbn6qfoa2copqZn6Wen6yZi5qMkZKNhX2Ih4OFi46gmZOIg4d+bZl5hJiGiJOMjpWMhnubiJOPrquUlZeemKautr2orb3Gy8jJy8vPycTSytTW2NfY19Tb19PZ29bQ29rR1sjVzJV4emhnWllPUlNdSEJFSUk+QT49Nzo9Pzs+SD1AQUFBREE+Pjo4N0RCNzU1NDc5LjU2NjQzNTU0MjMyMzY0NjU1MzQ1N0VCRENFQjU2PEZOU01bbmZjbnNrYFY+LDRMRzg2NTQzM0JGND1XX2hMdXheODs/Rjw8Qjw6OUQ/Q0dSa19tZGJma3aAiHGRkJuAeYCOfoOCgoV/hHx8hJeOh4t+hoeAd4J5bnt7hoF0epKejaF2j3WCdHWBfXSAhG+BkIFvkoR0fIGFenaGe4m3xqTCybeBlZuPeHBlTmVjgnqBd4aikIt5eXd7g398hHZtlJaUlY+XkIOJj5aal5emnJigl5+TkpejnZqrlpGRi42Sg4yFiYiBhZCRnpyZiYWLgYaXe4iIn5eQiY2Ki4J8oYiQi7yhmJOXmZyopqWunqe1vsDAucfJzc7FzcrR1tXU2dXX29TX2drb19va2djO28aFeXhlaGNfU1ZWVU1LRE1DOz09PDk6PD45PkE2Pj9APD8+PDk4NjdDQTY0NTU9ODA2NjU1NDc3NDU2MTM4NTU1NjQ1NTdISD1ESkU3OTI1O0g+Ozo6N0hQXFpSVVhLOVQ+Ozk1MzI3STg9TllNSHh4ZDU9PkM9PEA6Njo+PkBFUV9ZZWFdW2h0enlsiY2Sd3Z6inx+gH+AfYV6foKRiYSFeoWIe3V9dG58fYZ+dH+SnZGfg5J8hn14jn14iopugpqAdJiFfoGJhXx+kHqPqY+Qw6C7jJyjnH2JhH2JcoyKfnOmmpyZlIV7j5CJhGhHcaGknYyLkJKFiIuRkpWPnZqTlZGXjYyVn52UoZSSjo6Qi36Qj46LhIiSlpqfn4mLlJGdkYKLf6aZiIWOgoaEgKSGiou4mJ2RlJahp6Cdnp2jrra6tau/xcrQyMfMz9PS0tjS1dfA19jZ29ja2tnZ19y3d3d2aWlkVl9aU09OSERMQj09Pjk5Ozo5OTw9NkA+Pjw9OTo7OzM3REA4Mzc4PjcwNjg4MzU3PDM3ODA0OTc2NzU1NTQ2RlA1RE5JODkzOEFLPTszQ0BJPDlEV048TVRITj85NjMzMz5DO1tYPjVZeXBaPDxBPD0+ODU4OT89RFJTUlheVVhmbW1taYGPinFyeIp7e399f3yIenx7i4eCfnWDhnlzenNtgX6EfXeGm6CanpSSgIuHf5iHgJySboeohXqgi3yQjoOIhJx+mpGKjaOin5Cjrp+LkYuFi4GShldyrYufrJyPg5ibkJCOXIOikYKMn5OVjIaIjJKTjJSVlJCMj4qIlpudj5WWkYuSlIaAi4mSjYqKnZaZo6OGk52VoIuKiI6ckIOIj4CDh4WkhYuQs5ickpSXoaGemZKbnaexuKylvMHHzcfGz8zPzM/Xz9HUrtbV2NrZ2trX1tnZnm57c2ZlW1xXUlZXQ0BJRD4/Pjo0OTo7Nzo7OjM7Oz89Pjc7OToxOkc9OjI3PUA1MDY3NzI1NT82NTs1NTg1ODo1NzczNUhSN0dPSzk5ND1FSkI+MUZDTEE5ODpHWEA1SFdJNjYyMjM6RUNlWD8mX3lpX3o+Pjk8Ozk4OjxAO0JRS0tTWVBUY2J4bWJ+koNubXeLeHl+eoF9hnx7doaEgHNwhYJ7dnZ1dISDhX1+kqajnqWilomdkJSWi4qol3KKso2DppGEmZOEmYyilqCZk4manaGSqK+fkZSQjo6IlYtujbeEmsTIsp2ipZucmJaRspBjpM3IlY6Gh4mQko6Nk5SKhYqKhpaam4+QlJOHlZiEgI+LmYiNkKqXl6SjiJmelZuJj4eXl4uFj4yBf4aPpIiNk6iZl5OWmKGYn5mTnZuisrSlo7zBvsfFxcnIycLK08zN1KjS0dbW1tja1NPazoFxfmdiXV1cTklUWUFCR0Q7QT04Mzc7PDo4PTY0OTo8OjgyPzk5MjlJOj42N0JDMzI6OTYyNjQ+PTQ7PjY5NDk7NTc5NDRLUTxKUUs5QTdCR0lANjRKRUxGPjs4OEVUQTc+XDg2MjE0OjtFYFhBRmF0aExjWj41Ozo6NTs6PTpFTUZIUldTUkJjgUZ2gY59fG1+iHh6fnqCgoN+dnaAgnxsbot/enx4eHyEh4p+iqOzp6Oqs6GWp5+lo5aVrqKDkLiVkrKZjKGhjKSbr6OknZiQp5anmayvpJeUlpWQi5iZlqDAjqPJuaubo6atmJGbnbKdhYWoopyYhYmJjpWNi5OPiIGGh4mTmJWMi5SThpSYhoSRkJx0kZiylpeloYicmpOQipGKl5uJipaOhn2MmJ6JkJCcmpmTmJeflKCdlZ6boLGuoqS3vrTFx8S9w8O/xs3KydKmzs3T0tDW2NPQ2LpxeHVcX1RfVU9ISk5EQkNFNT46Nzc6Pzs8Nz00MjY2OTc3ND01OzU8TDw+OzxCQTc1PDs0Mjc3P0A2P0A3ODQ5ODc7PDU1T01EUFJMOEA9RUFHQTU6SkVORUQ6NkFAQlM+OURPMzIzNTc1PXZcPFJcdGlaTV1TPD04ODU2Nz06SkZER05bXFlKZmA7SISLentuhYZ6fIR4gYWBfnB4fH59b3KNen2BfHiGi4mGhJKnu6yosr2vpK2ys6ijorCsipq0naK4pJWtpJeprbempKOfmamXqaOvsKmZmJyUlZGXoJiau7uuyqFqtrirsJSZnqOrk5e9o16qsoKJio2Uh5F8jo59g4aOkJSUiIeTloyQlY2LjJeYkpyZtJeWq52LnJSSjZGSjJmbipGekIuJlZ+hjZSNmJmckpuYnpShoJScnKWvqKGks7irwsjEtbq9u8XHx8LRoMbJzc3E19bRy9Shb3lnW1lTXlBPRUM+PENBQjg/ODc1P0Y8PDU8MzUzNTU0NTRCMzk6Qk06QjtBSEI7OkA8NzQ2PEI5P0BCODc0Ojk2Pj00N1RLQ1VRSjc8OklBRUA0QUpITkJBPzZEQTxKTkQvVD0yNTQ6RUpcWEpaUW1ncHBEaWBLSTY3NTc6PkpAQ0lQZEdiYGJwSkCLin+Bc4aHfYKIdYOKgn9tfX18f3B3h3eNgYd7jY+MhoyZqsLAr73Gu7OzwLy0rauztounsq2tvaqbu6Sorbm4q6amoaKjo6ivsrGqnZykmJuXl56ipqWSpLquqcC8ra2yuaakp36IhpytvbCDjIyLkIOPg5GPeoGIkI2NnIiHj5eNi5WXlJGal52omrGakaycjpqPko6VkZCWl46RoJGJlJujrJSWj5ScnZOgnZuYoKGUmp6npqSipLCzp8HGw6+wurbFxMK/zabHxMfDvNXRzcTKh3JyYFpZXlpMSkJMQEZHPkE/Qjs6ND5BPD01PTY+MzMzMjQyQTE3QEJOPkdAQ05DQT1DPTs4NkNCNUJJQjo4Nzg7NUI+NzlWS0RXT0Y4PTRLQEM+NEVLSE4+QUE2QkI/QlNFNThQMTQ1Ozw4O0Q+OUxqal07V1JkS2daVU83OUdFP0NGXGVHYGlnWl1ck4yMiHuHi4aDjHWGkYqBb357gX9xfoF6lXqSlJSYkJOVp7PGyb/CzMHDuce8uq+rubqXsra6ssCupcCkq6+7vKqtq6OjnqeqrrSwqpugqpuhm5WfsLSni6O6urbBvKyonLOlpKmUhY6pxMSkgouPh4iEhpWUjXqDjZGPkaGMjJSSj4iXoJiTmZWYpqCunYyqnI6Wj5KRlZWNkJWRj6GUhpefoLKelJqUn6GYpJ+aoJuglJiepaOmpqSvrqW/xMKuqLe1ycO+ts+yxL/EvLPRycjCtXN3a1tXW2lRTEhETEpLSkFBPUNEPDVBRDs6Mz04QjMzMjI2MkEwNUlFTT5JQEhSQEg+Q0A7Pj1GQTVBVUA7OTk4PDdFPjg+VkpDV09HOD80TEBCOzVKS0NMP0I/PEJGPUFITDkrRzwzNjc0NjRBPzdPYU9hRS89PjZrbGpgQDpIPj9FQmZaTmVcZlRjapmNl4qMiJKQhol5hpSQgXKAfI1/eIeCgZB6jaGWqJqamLq9x8jJwdLJysLNvMGzrbu+p7q/vrzEt6zBqayzu76qsKmkpaOrrbOttrWgn66epaKYo7O9qZuovcGjt7ewq5Oxrausl4eaqaelkYKMk6WViYF2ipJ6hY2SkJ6fk4+Ui4+NlKOZl5yVlaOeqZ+RpZqMj4+PlZaIfI+VkpKjmpWgopy1pZCel6SjoqWenaaYnpWXm6SjqKeisqyovMDDr6Wyt8zAua/Es7u/writwsPCwJhseGBXVlpaSktNSkZEREhCQkFETDo0REg5OzQ8N0UuMTIzNTJCMjZTSE48SkJKUUVLQ0RFOkVMQjw3RVY9Oz04OT88ST86RVVJQVdRRzdBOks6Qjc5Sk1CSUBDPjxERzxCQ089MjBIMzY2MTcwPUI6PWpqSks1UVMzU3BwZE47RD1ARj5qSF9YYVpkZFaej52Ol46ekomKf4mgk4R4hX+Vf3+QiIqQgJahma6mo5jCvsfDx8XTzc7Ny7vCt7C5vLO8y7zDwbW2u62zv7m8rq+ooKintq2tqbK3mp6soqehnau3uKmksL/Esb65s6eqtbSurpeWpayooJGOkrHFp5WOfZGVfYiRmZCqmZiTk4+TlZOlnpOdmZSho6KcmJ+Yi4yPj56IWpCWl5KWpJllmKOesqSWoZasrKqnm56ml5iWmJWgo6iln7arqbm7w7Sls7XLwLiqtqyyu7iuqLi6vbiCa21ZVlRUTUVKU05LP0JIRURIR0c5NUZNOz43PUBKLjMyMDI1QjU1UFZOPExGS1JMT0hHST5JUT86OElTOzs/Nzk+RExCQEhTS0BXUEY6QT9HNkE3O0hNQ0U7Qz00RkU6QkFCRzkvOkEzNjAzPkdEOTQ9dGRNRztFKzpmfGdWOz1AQkZCcUZpSVJlYkxGpZSclqGXqZaNkYOHppOIgoeCnISDlZCQk46aop+vvq6hxrzFxMbGzs7O0sq+u7axuru7vs+2xL24uLeysbWzuLOrppyrq7mqqKevr5ejrqSnpKS1wLCrrLS/w7rAurOnubW4s6+Vpa2urqWLk5WhjXTBmn6XmYWPlpqMsZWbmpWTk5qZpaOVoJuWmqmdnKGgmYqMj5adYEqWnJqVmqWWVJawn66cn6SUr66rpZqgpZSTmJiOnJ+mopm0qaqzvLu7qrCyx7+5pqysrbGxo6GysrSkb2xlW1lOT0tFT1BQUTtISkhHSUNDPjpLVT9BOj1FTTA3NTQ0OkIzNE5XTzxKS05VTlFKUEhISk9CPD5NUjs+PTg6PENSPkRIUklCV05JQEJBRjM+NThKS0NBPUM7NEVBOkE/PkhANSpCNTIsPmNdZzozNXRkZUBSNyYjM31oVzs6QkNAPVFFV1NzYldGSKqXmaCiqK+ZkZeHi6eWjomThZ+HhJ2Xjp2hmqOktci0qca6wsPHysjHzM3Gvruzrrm4wMHMtce6wbi1urCvr7O0pqObqrS0qaimrayapK2lpKisur+oq7a3vsG/vrmzssSyub2so661rLmmiJyYppt2v6CFmZ2Ok5mai6+XoZycl5Wbn6Gpn6igmZqqmaGnnpiQjZGdg252kqKalZ2inpCusqKqlKiql6qto6OfpaiSkpmciJScop6Xsaepq7q2vbOyrb65t6Cjp6ilp5ycrampjGJkX15RSkxGSE5JVUw9TUROSktCQ0Q8UVU9QUFCRE8xOD03Nz9CNzVVWE4/SE5RWVNQUVVLUUpKRUFFTVE/Pz04PTtHUjxFRFFCR1lNS0FIREU6OjM5S0lCPkNCOTlDPjxAPjs7RzctMj4tMYJoTnpcLzBraGA8PUJCODZ6Zlc7Oj0uLlJgTVVIf2VeSEWrlZyhn7uvmZSfi5Orm5GSk4mrjYein4yjrZSjo7bGvbTBusLCx8jFws3Iwb25sq+5tMDCyrXFscG8tLqqqK2ssKKjmKq0u6Wppqyqnaivp6Oqqr68p628tLi9x7y3tbfBsb7AtKm1t6u/pY+jmJGioLyfiZqgmZeeno+3n6mcpaObnKGaqKWzoZueppyoqp6ZlY+Um4uXiYylopSdop6gtK+lpJOvq5mrq52dpKOokZWVoIOPnp6blamkoaG0tLq1rai1srOenKOlmpeVmaqhnnZeW19dSkhGR01RSU1FRkdCUkxKQkVHQFZSREg9QUdRMTtCNzpCRjc5XFlLQUxQVFVTTVdSTlVKREBKSk5POUM/NT08TlFDPz9QP0VaTUpBS0RHQDUzPUlHPz1FQTk3QTs8QDw8M0A8Lyc7KkiRQjpTSjAsW29XNzE8Kh1CgWRUNDktMTpnXEZDQ5xwYkdFp5ekn57DrZuXpZiZqZyWmpqPqpaVp6aVra2Zoau2xMK7vrfBwsDHxL7Nxru9ubKvuLO/wsi1v6+7tri2pqSqq62goJqrqsSipairpp6rr6yhqKi/t6atvrG4tse2tbm4v7K/wbe0s7SvvqOXo5aUnJSuoJGioqWjo5+QvaSpnairnZ2gm6afvaKYo5+iqauhnZeNlZ6TnoePhY2TnqShnbWspZuVsaeZr6efmqmeoI2YlJ6DjaCam5OlpJqYq7G1saqlqq2snJigoJKOkJaonpRnYlhgXU5IR0pOS0hFRElBPlBIQDxHSUhbUk9LPUhPVTRCRjk+SEc1Q2FbS0NOUlVXVlFYVFJVSEA4UVFQTTpHQDRDSFFTSUM7Qz5HVktDQE8+SzwwNjtHRj47RkE1Nj85Oj85OzE1RDAtLC9Ndlw0S1o1LE1uVzwtPSkeI3piUTVDS1E6blJGPEt4ZWJXTKKao5yexayhn6yena6gk6OflqWgpqmrl7axo6qztcTEvb+2v8K7yMK+ysi2uLW1sLOzt8HGtr6wuLS4tZ+mrKqrnZ2epaTBpaCqrZ+kqayvoqanvbWlsby5t7bDsrO3ub+yxMC4uK6ztbWjnaWVkpShrqCZop2pqKujmsKtqZ6srZubnpmmob2inaWYq6uspqGZjZmfkp+Jj1d/lp+moaC4qqaTmLWjn7KhoJuulp6OmJSdgY6fl5WOoqSVkKausqupoaKlpZWVnZiLj5GTpJ6JYGRZY2BLSEpKTkZFQUZKPj1KQjk5SktOXVFRST1MVlw5Rkk9RE1JOEhiXExDTFBTWVlWV09aXklBPVdRSUs/SEA1SE1YU0hBOkBBRFBIPz5RPks3MDk5RkU7OEc/LjY+Nzg+NzcvMT85MSUxUVVtW0pPMTA9Z1dEMTc9LSt3YFM2U1prV3JIRTY9dWVcS06en6GZnsOopaK0opyyqJOrpKCkn62prJ27sKistbHIxcHCs8LDvMbDvMTKvK+wtq2wtK+/xLS5sbC5tKyZqLCpqZqdpaGnwq2brLGcqaOtsKmkp722pre7va+3w62zssLAssezurestLauqqKmlpWVpKyin5+aqKuwr6+7sqagqaiZmZiToqS4oKGkk6+vrKWnn5KhnpWej5CNlZ2ao5+ns6amjJizm6Oump6brZCek5aTmX+RoZaPjZ+hk4umrLClpqGcoJ6SkpqThYuSjZyef2BlWmdlSklMSlJCQ0BJRzs7Rz85OU9NVV5SU0o+T15dPUhQQkxMSTlNY1xMRUxSVFlbU1VPXGJIQT9aUUFIQUtCN0ZFTEtOPjtCSEROQj07TkBBMy85N0NCOTdGOys2PDQ2PDM1LS80QDErJ1Z0U2VPPzEwNGJbTTIzPjA8dl1eP1tUXmVxQDg7SJZ3ZUE0n6OfnKDDqKSqsqGjtKqVs6ynoqSyrK6pu7KssLS0xsDEw7XAxL3JxLXAyMG0q7Wor7isv8S0t66strmlmauxq6qXn6aXrbu0m6iwm62frbSyp6q5sqi6s7eyucCqt7HDvbTGp76vrbe1qaisoZeXkqaloqOYmKWvuK6ytbagn6ikmZWVk6Sgt6OkppavsrKnq6ahnpuam5aYqJ+gmKKer7KipoyXrpikq5eZnqSRm42TlpmElZ6UjI+cnpSLqamqoaegmZ6VjI6ZkIGFlYmUn3hjaFxqak1QTU5UPUNBTkM6Okk/NzdST11eUlZRQVdgXEJKU0hWS0g6VGRcTkZPTltXW1JQUVhdR0FCW1BCRz5OQzlIR0hPUD8/Q0lCTEI8MklBOTQxNzdCPjs3RTcrNjkxNDgwMi0vLjw2LSNCcWdzazIzLzFbYlozMzgwNnBbYkgwNUlwaFZDV0aMeWZDO6SjnaGmv6aor6+hqbSrnbmwq6OqtLaxsLm3sLe4uMS9w8e9vMTBxsC4wMbAuqm2pKy7rMDCt7eprLG6opWtsK2ylqWnkaq5qaCnsJ2qoK+0s6qptratu6yzs7q3rLiww7q+v6bDq7C3rqmrq6aemJmroqKgkZihsa+zq7C5mpypoJmWkpemobeppaOjsLG0q7Koq5+boKCbnqWdopedo7Owmp+Pk6WaoKmalKKelZiJk5eSlZack4iQm5mUjqiopp+jm5ebk4eOmYt9jJaFj5tqaGxgbG5XUFFaVEFDRVRAOztIQTc6WFBkXlBWV0RZXl1NTFJOXktKPlpjXk5IUE5bVVlQS1RXWkk/RFhQREY/TkA9SUdHUVBCPURGQk0/OjFEPzc3NTQ3Pz05NUU0Kzc1LzI1MS4tLiwxPSonKz1ccD0+MS4xZVtkQDE2NDdnWWBGKD84bH1oW1Y7iXtjQz2nn5yiqb2hq7Cqo7G4qqW1s6ygrbW8rrO4vLq9trbAwr/IxLnEwcDAuMS9wLevtqert7G7vr+0qK6xtp6Xq62orZenqI6nu5+krbOeq6KwsLOrqba0tb2tr7G1rLC0scG6xbervK+xuKytqqOxpp6lqaCkl5CZoLOqs6qqs5qdp5ualY6gpqS0rqeira2usaezrbKqpJyfqKOelaGZm6i1qZeZkZKemZ6gnpCrnpeXhZSXipyYm5OKjZaXmpempaKgnZaVl5OAj5SFe46Sg4yWZWxyZ29xXkZZZlZEQ01YRFo5SEI2Pl1RaFxOWV1HW15dTk1SWGRKSkNcYl9QTE1OWFdYUEpWVldMPUVVSkVEQU1AQUZISFFQQTtGREZLPTg3Qj02ODcxOT48NjVEMCs4MC8wNS8qLC8tKj0sLCUyKyo1SzEvJ19fYVUxNTA9YFZeOClDM1lUXGdLNox6ZkxApJqgpKy2pK2ppa6utqqvtbqnprC3xbext77BwrS0usW+zMW5wsC5vrnDt8C5srSrqbq2urm9tKmtsLWYmKesqqubq6uOq72dq66xo6ugsK2zrq22srm3qq6usqi1r7O7vcqyqra1sbSvrqehs6CbqK2gpZWWm5qyo62gpq+XoaSampKOo6Wns6mhprKsqralrrG1r6SZna2nmpifmZmrt6KXk5COl5yhl5aTq56bkn+Sl4ydnJqWkImUkp6ZpaKhoJiWkZOVeouPhXuMioOLkmpteG11e2BFYWpZSUhZWj17SkZENkFiVGlbTVxgSlxdWlJTUmJhTEtFX2BgUUxJUFdWVU9HV1ZVTjpJVklIP0NLP0VESEhRTkE/SEhIRTw3PT46NzU2MDk/ODY2QiwtOCwvMDQsKCwvLSo3NikoOS4kOks1LiJUYFVgLzUoQ19RXC4qQi9KR1BbSDNjWVRLRJmXoLGosaqtpqSvrrWpt7S5pKyzt8q6tLq6v760s7fDwMzIvMO8tr2/v7e/vLG9rae6uLe2wbaqrLG3lJemrquno7CqlK+7pKyxsqeoo7G0sLGwtbG4s6muq7Knt6+1tMPFtqm1tqywramoo7agoKexoKSUnJqVsZ6nnKCqjqmjnpuWmKampbinorG0rKeyp62wtqykmaCsqJucnZuUqbiclI6OipicopePl6WgnZSCkZWPnJyYlpSHlo+Xmqeco6CSlpCQlXaEkId7hYGEjIttcHd1e35cS2VsXEtOY1w+YntHSThHZ1dmXE1eYk1YWVdUWFRpXU9PSGFdX1BKSFFWVVJLSFdVVk04TVpORUBGSz9IQkNLU00/P0xPSEA7Oj47NjswNDE8PTQ1OD8pMDcpMS4yKSksLC0rLTkkMDQyJTlCNy4jQU5IZjI3J0diTFYlLUIuPUVMUTwzcmtKQ0ORmaWupa2uq6eksLKzqrext6CrtbnJuK7Bu8K3srG1wsLOxcDBvbS8v7+6vryyxKepuLC2tr+8rqqzspyfp7GtpqWvpZ2ytayrsbGtqai0uqyzsrWstK2qrKisqbitsbDHv7ilurCpra2lqK2wpqSkr6SpnJ6cm6+Zo6Oio5GsnqOgoKKqpqa5pay1taSqq6isr7auo52jqKqboJqakqSzmY6JjYeQoqCUjZOcn5ORhI2Skp2amZWTh5eSlZmnm5+ejJKRjpB3fo2FfXx8h4mIcHNxfn19XFNkb15OWWZcRkSWW0c7Tm1YYltMX2JOVldWV1RYZ15RUkxjWltUS0dPVFNOR0lWU1xOO1BeSUJESEpBRT8/S1NPPjpOTUM8PD45OjU9KzMyPTYyNDk6KDQ1KS8sMSgpKywtKiY1Ki8mMCkzODoxJiozQmM7NipIZUhKKzpJPzNCSVMsPo9rPEdIj5yqq6KpsaSppbO0srS1srKhq628zLquwLvHsbSstMLC0cXGvsCyvcDCvL+3u8SnrLess7i7v6+qsa2go6etqqiksKOqsaqvrLCvsK+rs7untrCyqbKpq6alo626rKqxwrm1rLqoqKitqqixpamko66qqKKfnKOslaWemJ6ZrJ2ip6mirKajray4sbKgqaKgq6+xrJ2fp6epmaOYmY+gp5iGhI6Ki56fjouMlZuOjYWGj5SfnJWXlIaWk5OXpJucnIuSkI2Jfn6HhXx3foeFhnRycYh1a19ZYG5jUXNxXEs7hHxGPld0WGBaTmNcTlVWVVdRXGJeU09OaFhXV0tHTE5SSEVJVlJdYzxQXUQ8RkhIQkc/PUpQTDo+T0o9OT89Mjo3OyozNT4xMDQ4NSg1LyosLjMwOyksLCclMjM0JCwyLTg2MCkoMTxdSjAuSmdERjg8QjA1RUtYMUCUWj5MRZWYraihqrOcqqqwta24ta6rpaqqvcm8sb63wq+xrLPEw87Ow76/s8DCw7rAs8jDq663rbK4v76yra2rpKeqsKmnqLGmtK6qsK6tsbC0rbS7pLeyq6yup6ugop6vt6qqrbq2pba1o6qnrKyqraGpp6aysqSmpqGhrJaqoZWaoKaepKKqpa2in6ext62uo6Wim6qrramcoaWkpJigmpWPmJyTgYKPiIWcn4uKjYuYjY+KgouXo5qRkJqLk5KRk6KZm5mKjouKfIaAgYN6dICEgX1zdoujiHhqXmBuZ1dlh2NOP2eTTEVieVdiWFJlVE1WVVVUT1xdYVVLTWlXVVdJSkhJT0JHSVNRWW9BTVhAOkpHRkVHPj5FUUg4Q0tFODdDNzI6OjoqNDk/Li80NjMpNCsqLCsuIzQuLSsmKCs3OSomNis8LTIsJjA2V1ouMEpnQUE8PEMrOkpPXjREhj5IRkSXkrClo6qxmKuqrbartrGrpayqqbzAwLi4s7u1pbKwxMnL0b/Bu7i/v8G5wbnAxK2xtbGzur+9srCurauqqLaqpq6vqrmvqLGxr7Kttqq3t6aztauspKmrnKOes7OoqKS0tKC2raCqqKuprKegq6ypubapqqqqoqmgrJySqaGdoKSjpqOqnpynta6opqqio5ilpqeqnKKko5+ZmJ+Qjo+YjX6HjIaEnp2Gg4qJjY2PjIKFlKKZjYyZkJGRj5KflpiWi4qDf3SGgX9/eXSDf3p3foCHnY9vcWdncXhcYHOIa09emVZIbXhVZFZSYk9NVVRVUE9YW2JVSFBpVFZTR1BZVUk+SUhPUVB4TE1WPTxLRD9AQTxAQ1VDOUFLPTU7RTEzOzk3KjQ6PSstMzQxKjgqKisqLCkpKC8qJiklMzssJDIpMjAyMSUvMlFiMDI/Zj1OWD5DLD5MVF8vSmo2T0Q7lo6woaarrpqspa2vs7Wvq6Wwqqm6vrzAsa64raG2r8nHyNHAvry6vMK9usPAvr+usbKxtby6wbGxsquzqKS1qaWts7K5sKOttrGws7qrua+prbWrqp6prJ+ioLWtqKGfr7KitKqeqKeqpKqhoqytqL2vrK6toqiooKyZkLChmKKgp6eeqJuZqrCpo5+toqGToqOjp5iaqaWYl5mdjoqHlIh9jYaEhKSWhIGCioaNjJCDg5OgloeQnJCSkI2RnJSXj4qGhXh0gX98dXh5gHt0c3pogIajdWleZWuBdWeIi31TWHBeSnhzU2RTUV5NTVJZZk5MVllkWEZTaVJRP0JOUWFROklITFNJcVFMUzs8ST87PD07QEBXPDw/SDczQ0IxNTo5My01OjopLTMxLS02KSgrLSw0MiMyKScsJS47LiYxLjAtMTQlLDBMZzo0OF89YWQ/RjFDUFtbKkhNOVVBNJGPsqCkpqykp6Ssp7SysaqksaiquL7BvK+ouaqmrrDJx8nRw7y/vri+v7zJu8C4sK+0sbq7t8Cys7usuKyitKenrLK2ubOnqLy1rra9sL2mrKy1q62cqa+jn6SrqqecnqqypLOomqqnqqSpnaOpp6m9q7Svrp2ppKCunJuzo5WknKWln6SbmqmrpZ6bqqGbkpyhpZ2Yl6mokpiak5CKgo+Ffo+Cf4iej4V+fYuGkI2PhH+SmpOFk6GMk5GLkZqRlYaJfn9ye3l9fGh3fHp1cHB9aIV4hIhkYWhjcoV6bWZ4XV5WQld6bVRhUFJYS0tOcXVdSFpbZ1lFVWZQRD5KTkRDQTlIR0tTP2phSlE4PUg8PDw+Ojw/VDY6P0M0NUg+Mjs1OTAyNzw1KC41Ly0xMSYvPktIMCUaOTAlLCwwOS8sLCs2JzE3Iy0wR2pJMTRYPWZjQko3R1NgVSo9OkRYPyqPlLGZn6CppaWhq6W3srKmqbGnrLjBvbWwo7msqKixw8nJzcG2vb+1t7+5yLbDtbOxtbG9t7m9ta25tb6tobOnqquwtbi0q5+9vKmzwLO7oK+ztamrnq2wo5ykqKqjnpylsKawoJ+rqaiiqpukqKCtu6eusK6gq6Okrp6eraaXn5uho5yfnJqjqqOamqSklpeUn6KWm5emq4uekZCRjIKKgICPgHualY2Ie36LhY6Ni4qDkZeQhpSjiZGRh5CZj5OAiHx5bH12eHhje3pxcHFyeGiAdGqDZ2RoYW5zjm1haXBgcEFceGxVXk9RUUpKTVRZV01dXmxXRFhgT15QSE1ERjs3SEVLTzxyaEtLOUFFOzs9PTs7PUo0OUI8MztHPDQ/MTgtNzg7MigwOS8sNS4uPS0qSz4qHTQ5JicuMzQuMCsvNCYsOiQ0MUJoWTEzUz1lX0RMNktXZU8pOzJPWT0jk5msmZ+Yp6Sjn6ikuK+uo6+wqqu4wrqzrp+4r6uotLvIy8i/t8K+r7S9t8S2w7GuubGzwLS6vbepubi9q6S0qKmqsK65saqbu72ksMC1taGutrWmpqexs6CepKanoaWZn6yoqZ6gqq+noaaYo6igsLifo7GuoKuhrKScpqepmpqbn6OVnZ2anqmml5ugqJKZk5mek5mWoamQmomOkIZ9h3+Cjn18oY2MiHiCi4SJi4uFh5KZjomVnoiQlYKLl4yRfIV7c3B9cXN0YHl4aW9xcG9pfnFjemxpZWNgZoZ/X1pza3JMTH5oWFpNUExKSFBSUElOXF9uU0RYW1JnT0hLRUY1NkhCTEk1WmVKQDZFQjk6Pj0+OjpDNTk+OjNARjwyQDIzLzo7ODMmMjwwLDg1QiopLUMqLDQ7Tk5AOzczLS4rLTcqKjwlNTM9ZmQyNE0/ZV1GTz1SWmdIKj4vWVg1KJedppmdlq2goKGkobersaSztKqoucW2s66gt6yurbC1xsjBt7/BubC0vLe/u76vq72vtL+wvMK4qbu6t6eotaioq7Css7Cnmr63pa28trCesLewqKWnr7GboKSgpKShl5yvpqGeoqevoqCik6Sko7ewoaaxqp6so6+YnKqlqZ6Ymp6lk5udmp2mqpqcnKWWlZeVnY6Ul6OooZCJi4+EeoV+hIp6jpeKjYZ4gYaDiIuNhY2Tl4yOlpiKj5Z+hpeLj3mAe3Byd29vdF95d2RsbGtpaINtZXJqa2VoXGNzf19abHZpWkh9XVtYT09KSEhSVUYyOl9ebFBEWFZZZU1JSUVFMDdGP0tCNklKSDs2Rjk0OT49PDk4QDg7ODo3QEk+ODw0LTM8PDc1KDU+MSw7QTEoKzY8IzhSPSoxMTM+RDUsLSc0Mis7KzEzOWNsODRHQWZbSFREVV1oRS47MWBULDKWo6GXlZypnaWho6G3qq+gurmmrL3Fs7Cvo7WvrK6vtMTEvbO/urews7m4uri6rq2/s7S4r7/BuKy9urSmorOrqKmzq66xo5zBtqaptrWqnrK7qaamqLCsmaKnnKSmlJihsqWZnqSpqZyioJOln6S5qKSnraaepaGok5+poaGgmZudoJKbnJegoqubm5mhlZKVlpqNlJOjp6SPiIqOhXmEfIWFfJyNiYqGeICDh4eHkYWVkpKMkJWUjY6Ue4OXjop3fntsdHJsbHNheHVoaGpnZW+EZ2hoZGZpal9oYmlmWmV6Y2FSc1RbW1NMSUdJT1NAIStqXmpMQ1ZVXmBLSUhFQy46QjxGPDZLUEQ4OkQzNTc9PTg5NT86OzQ+OEBMPT45Myk4Pjw6OSo2QDMuRTQoKyw+MC1OPy4rLTcsMTE5NSwmLjUtODA1NzZgdEIzQ0RnW0tXR1VgaEIzNzhjTicynqSjko6kppyenp6ktaynqrq3qKzDwbewrKK0raevr7fAwL2xwbexrrG2tri3tayqvLOvsrG9wLeuvLyxpZ+2rKaltKmrrqCgw6upprCzq6y0up2oqqqxppidqp6npZGZpq2imZ6kqqGbop2XoJyntqWvqq6goZ2doZWgpp+hoJmbmpySmp6Vpp6to5iXnpWUjpSYjI+YmqefkYiJioh4hXeCgoKch4uCiXt+hIeGhJCElZWPj4+RkZGNknuDlY2Gc359Znhva2psZ3Vza2NnZGN0f2FkZWZlaWpjaXBZXlhdbGRhTWhXWmBWSUdIS01SWD85YGxpR0JVU1xbSUhGRkEuPD85QTg5UkZANzpCMDM3PTc2OTI6PDk3OjlETT1CPDAqPEA7QTwtNUIzNz0rKywwQSpKSy4vKiszNzIyKDU3JCs3LjcyNjg1XXlOMj5IaVpMWkpWYmZBOjNBZUglNZukoJGMrqCZmKCWpbSxorG+t6Gxxry5sLGjtqurrqm5vby7rcCyr66ttq+zuLOnq7mwrq60tru2r7i9raaetaugobClq6+fpcOhs6Wvsa+3rbWdra+srqOZnKeqpZ+Vm6iloJmlo6mdmqCclJudrLCluaetoqGamp6ZnqOapZ2WnpiblJqhkqiVrKmblJyckoyVmY6UlJiopo2NiomPe4J0goGKmIWHfImIhISJjIiShJSckpKPkJGWjpB/gI2Ngm+Bf2Z5bWhramdxcmtcaGNhcn9gZGdqbWxnamhmbFxsbXVxYVRiaGNlWUlGTE1PWFFQVWFlgVRAVlNZVEZHRkVALzw9Nz82PEZOYTg6PzI0OUAzNzgyOD83PTg+RkpARDkyLT1BPUE9MDVAOUAxLSsuMzw7SzYvLissLTI0OjYjMyopNi41NTQ2NVp8XTE5S2pbTVtLWGRkQEExSWRCJzSTopuPjrGdm5OhmqmysJ+4wLahtMK8vbmxpravqa6lt7m3uKy7r62qq7eqtLitpbO1sa6psba2sbK1uqipn7apnp+qoqqtnKrBma6lr7C2taysnrGtr6qjm5yjrKiclZynpJ2aqaOllpqgnZGbo6uqqbqfpqSgmJqanqGPa6KVmJxxgpacpIB2kauonpaWoJGJl5mAl4ufj3iFk4yDbWl+d4NwbIaKhn2EioZvXWRgZ4SXhmuLkJSSdXeLhH6Dj39mh4BodWlmV1xpdG5OUGpkZnGCZl5kZm5saV5eX4mQhYdoT0tEOEVUZ15KR1BQVVVLR1Ngb3RlRVtRVVBGR0ZDPjE7PTY9NjwzZlw1Ojw3NTtENDg2MDpCNz86PkZMQ0IzNDM9QEBAPTI4QEU9MSwsMDg+RzcwMS4qLiovNjY4LCMxJzIxNDoyNzZYgWwxNk9rW05cS1tmYj5HMVBiPCsvjaSZh5Wxm5yToJuqraujvcWvqbfDuL28rae2sKarpLi0srOxua2qp6y0prC1o6e3trWop6y2s660rbOiqZ+0q56ipZynqJquvZWnpq+zt62tpKiuqqumoZ6coKinnJehpqacnKennpOfoJmQnqeqo7Svo6KjnJaYmJejiKGPkpqHoYeUnqF/pX+nq56Tk5yTiYRyeIyOg4egdoiMaZeIZn1zeKBviIeDfox8f6Ggn5l/e4iedIiOdpuKbIeBg21oZWN6bHFiVIZtY21pmHFYanBuhldeaVtraluIcG15codph4RaXkZOPkZeTUZSVldRUVJXVGdeTFlLUlJQRUdHPjw0OT05PDc7MDw8Nzk5OjY9RjU4NjA8Qjs8OT1GUUc9LjU8O0A9QD41OUdBODIqLzE8STkvMDEuKi8oLTQ1ODMlJjIxMTU+MTw4WIN1MjVSa1tOXExcZ189SzFWYDcvKIyml4SdrJ2ZmZ2fq6qoqr/Dr7K6vbfAvqqkt7GqrKazta6vs7arqaWxraW1s5ystba0paeos7Gtsqivn6qhs6mfpKOaoqOdr7aVpKamtrymrKepqqynpqKgmaCnpJmZpqOkmZykqpeUopyUk6KlpqC2pKOgo5iVk5iUnIiukJiUiamLl6OchbGApK2elJqelXmC1Kh/h5TAm8d5eLGlt5dkgMCcv3mEhHmPg3yQkJHKcZa8nMV7cranupB7gWyWsauweGhrWLGub2VpvJK8bmh6bXGP2H5TamO2sn+AcZR1mqGqkFdPV2FPVk5GVFtYUVBTi1xXW1BAXEVRTkRGSTw8NTc9Ozo5Oi49Ozg3ODs5PkY2Ojc0PkA+Njk/RVJJOi41PjtCPD9BODpKPjUyKjIyQkUvLjMyLisvKS0vMTg2LSAvNDE2QTE9OleDdzIxVGtcT1tNXmdcPkwxW1w0MSGOppOBp6qfl52dpa2yqbHCvbK1wLW3vsKrprStramor7Sqr7azqKemtaWnuK6csrG1qqWkp7KurbGmqp6npLKkoaGfl5ygoLCtlZ6jn7S5oqmooa2upKKem5qiqaCYm6ihn5ieqKeRnKeblJ2hpqKgsKOen6OWlpKYkpmFsGtqio2qfmeEloetZXGenZWappVxrqGkfne6fGuhj3axX2q0W6WAZZyRYGaBemZ/anhqqWW+cmemjHaxanyxeHSSk2NtbadtW4SgRWlnh5ZFdZxgfWZ7o6eCWV+Lq2mAlHh6aqc3Sq9bV1RsY1pLT1dfXFdWO06IT1dWL0lUU0pDRUY9PzQ2Pzs4OjkwPTg5OTk6PTxEODs6Nj1BQDY8QEhRRzkwNzxBQz5ARDhARz0xMy0zM0UzLi41My8rLyguMC46Ni8nJDIwM0IvPTtVgnYyLVZqXE9ZTF9nWTpNNV9ZMzEbkqKVgq2npZ+jpKqxt620vb6wt8WyuLrCp6mwrK+pqbGupLC6sKSkrrOjqbmpnrOzsKOloKqtsKyvpqefo6KxnKOcmJWYnJ2up5eboZ+0sqGqm6GtraCempegoqqdmZ6koZyaoaekkJ2jmpegn6ufpaagmp+hlZWRlpGahbWbtXiFqZm1mXeHs5u3f5OWl6mVfmuBpnqBhYeSlJJ3q2dqsVuse46HlHSIcI6GgH+IkJd4g4KLl4yDoI+FsHZ3n3Framx8i06kWEhjY5l+Y2imYHlydVKThl5QqW1jcX2GgGKdLlGibltUa2dgTEtcZFhcWkI+sHhXWEEjTWhGQ0RBQEExOT44ODo4NDs6OTw5OkE6RTo6OzY6Q0I4PT9LTkg6NTpBRkJAQUQ8RkQ7MDIwMTtGLDAuODQwLC4oLzIsPjgzMR8vMi1EMTw8U31uMytYalxPWE1fZ1c3SjlhVTUwHJaflIizpqairqmns6yqu7bCsLzCrbi3waqsra6vpq6yqaGvvKqhp7Wto6u1pKazs6ejop2nqrKosKelnqCfsJegmpWWl5ifrqOamqSotK6hqY+pqKmbnpWYoKWpmp+do5+coKOlo5WbnpianaKqnKWam5uioJaTkZOTnYPVk5m5cLDCfsaGfNaUm7t8mpalkI2bjKR6jYejgqWCeqx5j51Vr3uJfp9quVq5d4aDfaaCk3yYeqp5jZ2Pe7FujoR0kLuFb5RPr6fFilGgemNgqmJzcodsl4dfU7W0yIaAiXxjpDNCnXZdUWpoZFBAWGZaZGFKSE1sS1pTT1lmWkNDP0U/MDw8NTk7NzQ8Ozg9OjxDOkY6Oz42OkBDOzZAT0xIPDk7REhDQkNEPEVGODEyMTFEQi4vMDQ4MystKC4zMjM5NzEjJTUqPjM9PVF3ajYqWWlbS1xQX2ZUN0c6YVE4MiWcoZOYsaiopbOqpbSopby3wbC6wLG1tbyztqexsaOxs6afr7aom6i6rqKvsaCztLCgpJ6ep6mwqbSppZydnquYmZiXl5aXoquempeorbCoo5+OrKKnlp6XnKGmopiioaKhmqKip5ueoJ6VmZqmoJynlZubn6CYkJKVkZ2Ism5otXGriHCOpnK0c3K2e5qYpI2Pm42ifpCgpX6wdoOR0tF1W658hn+kb5uqpmuGhX2tfZeZj3uxc5OdjnizZZZ0hZ5unmaUUsiLWsJcn3liX61gd3OGYpeIXlnKnW+/gXVNS7VTVcZkVFFqY2VYQU9qX2xpUFVGSTk9V1JbV1hIQz9KPDI/OzU9PDQ2Pjs3Pjw9QztHOTtANzs+RDsuQ1JKRz4/PElKRkNFRD5JSToxNzQ2QD4vLjI0MjUyLSkuMjYsNzQyJh82MDs1Oj1QcWg5J1dpXEJOVF9lUDVHPWFNNjIvop2RpK+spKq7raa0pai2u7yyu7+3trS7u7OltbSisrKjoKyvpJimuq6ksbCctLipoKadoaqlsqisqqWanZqpn5aVmJmTk6OpoJeTpquwpaKWkqyfpZKUoZylp6CVm6anoZqjn62aoJ6ekJabop6cpZSclZminpWYlpKbhax7d6h2o4+Lh6lvrYqDqIOZmaKKkpmLon6SmImuhX+Cs1xys1KufoOCpH9x1313hH6PnYaZmnevhoqRnId3tGGaZZqCgZVsklqwWEuadZh5ZmCtXnd3h2eYiGpdr3eVno94bDV5yK6yX0JUb15nYEVPa19wbVZVTS9lY2lTWVE7QURATDo1PzkxPTwxNj85OEA9OkM6Rzs8Pzo+PkU5LUVVSkVAQzpNS0pCSEc+R0s5Njw0Njo+LzA0MzMzLjIuLjE4Ki4zMiUhMDM3Njc9UGtlPiZWZ1xAPVZfY042R0NgSTo4OJ+dlKC4sJi0wa2osqeqsrq4tLi/uriztr21pbi0oLWtn6Cpq5+Vp7asqLCxq620pJupoKCoorWnpqqjmZ6VpaKUlJyZk5ajppuTkKesr6WhlZipn6KPkaKaqaahlZqmqZ6dpJ6snaCdoI2UnpueoJiYm5WXoaCUmJGnnYapfX2leaGPkIOqcK2MgqeGlqChipeXiKOBkIeUqnyAi515b7FaqIOCiKB5dNh/dod0p4GOm42SpHyWkJ+Ee7JenGSgfYKUbJJcq1tak3+Rf2hnqmRze4FrmIdxXaxaiaCOa25lT0pDoVxaTXRdYmZNWmFfc3RfSlU1SpqSWUhFPUhGQUwzNUE4Ljs+MDVBNzhAPDY9PEY/Ojw2Pz1CNy5IVkpFQEg2S0lOQElLQEVOOjpANC47PjAwMjE1NCsqMDUvNywmMjEoJCQ2NjcxPFBlZUEmVWZbPzFVX2JMN0ZJX0MxPjihnJmZvqyYtMKuq62pprSwuLG1v7q6s7G3vKq7taCxpZ6lp6eek6qxqa+qtayqrqGYoaCmpKS6oqOroZebkaKglZSfmpSZn6CQjYypsK+mnZeap6afjZKkmKirqJSXqqifn6CjraOgnaGNlKGYn6CSnJeclZ2hlZePq5uPrm1ytHSpjHeKpnO0eXSzgJKko5KcjImkh452uG+Me4uia2u2WqGGZZeXaaCip22UcrR0k5h/smqGkoita3WzYZ1mom6GkmqXXK1gTaF8h5FSc6NseX9+bpiGb1yvVjycd2ZUb24uW6dPYlNrZWJsWmJcYHF8Y1NZUD4+bW8zQkJAP0w5ITdANi47QDM3QzU4Pz8zOzxDREJKRk1JRjYySlRLRUJKNklKUD9IT0NGUD08RTUwOzwwMDAvNzUsKyw0MjYvIzAwLCwdMjg5LzlOYGVEJ1VkWT4vVV9hTDVGTV44MUI5pZqbnbuinLLArq2rq6e3qbivtcC1vLGvubirwbeqq6Gcp6SinZKrqqe1o7Korqqhl5yooKSruZ2jrZyWmY+lo5aNnaGcmZ2fkZOVq7avp5mUm6ypl4yTppqlraSSl6uypKCeqKuwmaGij5iil6CblpuXoZOcqZyUkauZh9SSmrt0scSAw4Z91ZacuHiIkZeMl4mMp4d5o7Z1fXd2woKasmCDunnAfHW4YrWBjIepfZaBrKlxe391vIinoGmdYaaOr6F+jHSHq32+bnO8dLKDdXiAim6aiHBtjaR0vV13fVthebxqWlZbaXleaWBkZmJteG9ZW1lDQUByP0NGKzVIIic7PzEwPD83OkI5OT1DNDxATlpeYGBfX19aUFBSS0VGSjRITFJASk5FRk9CPEU4ND05MDIwLjg3LSouLzE4MCItMSwzHiw8OjA4TFhhRidUY1g8L1ReYEs1O0xbLTdAOaaZnqK8opexw7Ctqaqssae4r7bEsbuzrruwrsGyrKWjnqShnJuQqqSqsqS1p62kn5aaqpmmrLmdo66ZlaGQpqCTjZyjnpiempCWkq+5sKuVl6Onp5SRlqWdpK2ekaCoq6Ccn6mksp6ipI6moZShmZyXlqSYj7CgkpWqnoWQmbWAkZGNuJV4gpObtXdubG5zbnmPhI6Jc57Bu7yZeoGyqHCAdJG5g3yGhouHjXuKho2XfKS7ub2cdXmzo3R2l3V0sHWYnmaGaY22dHJwd7aMXoB6fYlng3lteWKLrHB1hX9YW6dqRGRaVGZfY11iUGdmcW11Qk1QTEQ7Wkw+SjM8MCA4PjsuMz1BOTk/PTs8QzZCVFlaWltbWlteYGJgXVNHR0g0RElUQUtOR0VPRj9HPDc/NzA3MC85Oi4sLy0qOC8lJjIoNCQoPjcvN0xUX0cnU2JWOCpPXV09KztWVic9OzymnaChv6aWs8O0rKqnrKupu66wxq+1tK+4p7W4raqjoqafoJ2Zk6ykraqmtaion5uWoKOerKS+pqGqmJWckaKbko+hqKKTnpeSmJSytbatmJ2kpKKLkpKmnKWrnJappaadm6Kpp6ajqKCRrJ6Xo56Xl5idno+wqZScp6KOan5pnKd4iXN+mo51emWHe72+wLpukoNxlIZfcmpaXZqJYWSHjpVrYICVY22bdmKUa3+alZRlXmBjcZuJaHKMfYaUZmp+cXR5fXxiW3d0gWhQXG6EfXuLalhseYJySUpvhXBNdE1FV1xmYUxbV2ZjXk9abXZqclJPREVOO0hJPE0/MiwyQT84LzU/Qzw5O0A7PUM+UlZWV1laW1tcXWBhYWFgXFVHNURGVUVKT0hGUElJSDs4PTUxOi4wOzouMC03Nj01JiIvKjIsJTs4LTdJUl9JJ1NgVjQpUF5MKDM+W08nPzI+qJ+oocGjmrS6tqOspa6nqLWyrMissLSstaO+sbKnoKOpnaObmpmsp66kpbWqpZuYlaKbpq2pv6ipppaUm5WgmpOYpamokZ6Qj5icsLK/rJunnaehiZORqpuppJybrKCjmpujp6yin6qhma+alaaflpSdn52XsKWZoqiZnJGenKOkmaejmpyam5qQloJobnxxdpGXlJGEibSpjYWYlY6KjJiXh5SVioOSkpCJjZGUmZOYl5qgoZqblKCdjoJ6pIVsaXyQfIB0iYqBcYJ4eXZ2ioB7iWpzgXSDdWR3fXZrcHptYGNbb2hNWFhlal9XWXB6b25mU09GUzlPWk5STygrOkpCNjM1PUBBOTpDPjxFTlNTVFZXWFpaXF1gYmJhX15eW1RLQ1NHS05ER1BMT0k8OjszODksMjs4MjApNklSTzgiKSsvMiM0Oyo3Rk9bSidSXlMxMFReOis9OF1LLDwtQLKgs6G/oqSxsregqaWzp6WwtarJq62xprWmwKi0oZ6lpZyklpWgq6eso6O3rKCZlpagl62qpsGfrKSWkpyXnpiTlKKfnqOnkpGZqKeyw6+Zq52rno+Wlqmeq5yeoK2YoZudoqWvpqGkp56smJemnZmaoZ6enLCgnaKnlpiTmZSgopajn5egjpaUi4qNj5atj3uVm4KSgYmpqIWAmJaKhI6fiHuEkIaFmZCHhomVjpuXjZCYnqOWmZKQnY1+jWWhs66FiYR2eo+KfXZ5em9neZCBgIlrdYF5iHJodH96doOIgmt0Y3hmX2hkY2Rmalhre3FqalxSTFBEX1VGQD8/LDRARjs0NTs+QTs8Pz4+SE5OT1BTVVZWWFpcX2FjYV9eXV1eXVhWSktMQklPTVJKOzw6Nzg2LzI5NjQuKCYkLTEuLikrKjclKzwoNkNNTEQvVF1RMDVNWzE3RTRcRzU8LEC0oLmvvq2rrrKyoKqmsq2irLOwxbCqrKOzr72ktJygp6KhnZmXqKappqSms7WelZSemZmvpq6+oKujkZGempmUkZWhnJepnYWeqayis8i0n6mkqpaWmJqnnqmcoKSrlJ6fnqCqrqmloqqhrJufoKCYpZ6cnpyvpJmfqJOYl52SpZqYqZ6al2aDknxlfo6aj2N4jWxoa3qQo6trZJmYfmeFimVlaWh6jaGOa2eMl5Gid2tqi5iin5hzbG56hI2FeVhlXYWBXmuKioF2W2hzd3eRgIeCbniCeIBzbXmEdHeIiY+De2iEWF1qc2Rdc4hpanxxbGNdUU5XSWRYQEo0PkY3P0ZENzE8PT9BQzs7REdISElMTlBSUlRXW15gYWFgXV1dXV5fXVpVT0RIT0tTTj0+PT02NTM1NTU0KiYmJSwqJS4rKyc2KiQ7Jy9BSVtJLzdaTzYpRVkvRE8xWUM7Py49pZ+6vLmvq7Owq6Wora6wp66usL2xqaikrbCxoK2XoKSeoZqZpqucrKOmqKmzrp6Vo5Cir6a2uaWuo4+OmqGZk5KaoJmZppZ7payiqLPDuKWip6+fnpWeo5+knKSqqJKeoZ6gqq+pqqKpn6ebpp+noKyVoZulsKSYnKuWoZ6bk6WYnquZnn6+g4hytHKFnoataHi5xLhxkqGje6aYmXOqgnzLwMC7cYuih4OefJWYiJ7AvYKWnZ2NnMHBe4F6kYyawr99a6Wxb4yBb8p6f5t4kYOOgHZ5gX95cXp/h3B4hYyTeWx1kWJlXnhkX2WBYl50aG1kYlhMVklRWkhPRDJJRT9EQj4vPD8+QEE6OERDQkNFSElLTU5QU1ZZXl9fYF9eXl5eX19fXVxTTVBHVU5BPz89NjQ2ODI3NiomJSMpKiYuKyopMTAfOSojPkhbTCojQ1AvI0ZbM1BZL1VBQjsvOJajuMO1sK/AqamUo6+psK+tprK1r6umpqaxq6CrmJuioJybqqeinauipamlpLSknaOTpq6suLSnr6KSkZmdpZKRoKGYnKCdh6arpKutv8CxoaquqpaSn52imaKkqqOToKGenayuqaulo6KloKSlnK2pkaSbqK6qnJ2qnKyilpellqGjmJx/zpR5eqWCepWWm1+tj16Op4ChoHynlZt0q4OAr15kjal6p4eFn3SXkoizY4KrhqCNjbJqhK50fJaHuGGCrVmjzW6PdXvbe3+ZcX6IknV/ZXuIdnZrfYhufoWQkn5sgI1fcGpvZmBfeGRccWhqY2ZgUlRSV11KT0M1QUhFRDg+NjtAP0E7PThAPj8/QkRERklKTE5QUk9TXF5fX15dXV9gYF9fXVpXT1VKPT8+PDU1NzcxNjQoJyQhJywmJi8oJiszHTYwJDc7U0wrLS5KMCc7XDpMLSFQQEY0LjGtwsDAtbSwt5iekaSqqa20q6ayrK2spKymsKqgp5uappicorCfoJ+op6OmoZ+wrJuelqaurbGrqKyglJKbn6WTj56ll52oo56upKuwqL/Gs6ipsa6Wk5ycopegqaqflaGenZ2ur6eqqJumpqOgqpKts5amo6uqnqOnpqGwoZKap5qhm5SUkZegcIWMl3WEqIdxsHydcqx+oZ+BpY+ed6uCfa1/nHKtfquHhp92mJJ6fJd+qoihi5GLnH6re4iSjqCAeq1WnMR6j2+SwX2BlW11cIxtZnZlhm9hd25yboiKkY+DbZCOZG5zdW9gZm1kX25paW5mY1dUXGFaUlJDOElJQEQ8PjxARURDRUE9PDw8PkBAQUJFRkdFQENJU1dZWlxdXl5cXl9hX15eXVtaUkM+OzkxNDc4NDUyJiMfHCAxJyAxJx8nNB41LSY3PldKLTwoPTEpM1ZARiEcRzpDMS4rr9TGx7K0n52jjqOjoq2utq+psKepqqiuq6unoqOdmaKVn6arn6Kln6ioop+esK2Ym5aop6+tqKepnpeVmqSikpShrZudp6OurKOstam5zbKtpq6sl5WbnKKZn66snZahmZ6fqbGpqaiaqqijoaubr7GiqKyuppmmq6qqsaOTl6OlmpSShaRqpHWJeql0erJxgqWJmIxwiKCah6RfYFKrhH+ugpt1roKnhoafepiWhXtmgKOJpJiGgaN9qX6AlIauXnyoVZ2ikoF6op+Ae8OvxYxzr7OzuXFiqa/CdWiMi5ePgWyZkW5teHd3bmxmZWRxcGZ7aWNcV19pWFhUTExRTENDQUI7Q0BAQkk8PTo5Ojw9Pj4/QT04NjtETFBSVFZYW15eXVxeYGFgX15dXF1bU0lCNjc5OTY2NCwmJCIgKCciKy0iJC4hMy0mQERXSCxHKzU2KjFQS0wjIEE5RDQsJ8LJ1dbAoZmrqKGvop+wtbCvqayjqKaqq6uppKagm6WfnaWnpqOcrJqiq6Gkn6+jnpuTqqS2sK6gqZudl5WnpJGboqifoKacsKajqLGstsiytaqsqpWRnJ2imZ+ls52aoZScn6arq6KtmauooaGporOtoqqzsqKbqqivr7ajk5akp5ibkXyqbJ6Eh3WreXywboKki4iflpWflYHSt7S4yYCBsl5flKmDpIeHoHqYlZl4qslzmaOUp6mQkpuMfpqJmsbGd2WhgqVzgZ+Ogn2vXm+1Y7F1S6OGbadHgpNjjo+dkntwlpF9b3p0fHptXGZqcnFmgWleYVhjbVxeWUlNTUtFREFCPkE8Qj9KOzc5Nzk5Ojs7OzMuNjxBRklMTU9RU1daW1tbXV5fXl9fXlxcXFxcWE1CNzU3ODUvKSglJiUkJiksNUZOT1BNRkxKVkYqTDAvPi00T1RRHRw7PEYyLCSopMHGua2osq6spaKdsrmsqqGmm6imqqypp6CmpZiqo5+uq52moKyan6mlnae1n6KXk6irtrKsm6acoJWQpq2RmJumoqCqp66ho6epsLTCsrOqraiUiZedpZuio6+ll6GVmZylpauarpysp6Weq6O3rKGxubCdm6+ns7SzpZWYqKSboI6CnU54moF/n3qEo3yCpISGpp6cnpOEuHt8ebmCfszFwrZ4mqCQi59+mpaXinWel4qkmKOofrCFnISeg6x9mZRhpWyjcI+FkIF9l4NyrGCkc3GAmmC8fVJVdY+Ro5Z7fZGQiHN6coR+cFtsbndyaoFuWmNfaG5iZF1LTFFUQUhIRkk6OUs+QjEwODg1Njg3Ny0qNT09P0JER0lMTlBUVlhZWltcX19eXV9fXFpaWllVU09IQDc3Mi4sKi4rKicmP1FUVldXV1lYWFdVT1VGPEUyOlBbVBwbNj9ILC0gjIeZqaykq7mrr6CboayztKafoJWlrq6uqaadpqaao6ehsq6hqaayoJmopJSitaKjlZehqbW5pJujnaOTkKKxmZ2bpqShoq+tnaSoorWxw7Gtqq2qkYeRnKedo6SdpZeemJmZpaOoma2hrKSll6+lvK2it7eunZ61srmys6eZnrCipJ6Gj9G1w7d5h46FkZOPgKZ4lKJ3jKCShKWCi3GrhoS0bnJpmaOclYmffJiZhoePcq6CpZuijaaLk52JlJCabXCyXKVzk3qcbJl/e5l9bqlhonFxf59ic7K4aHiPk6WYfYuLkYp3fHiNgWxod2l4c25/dFxkZG5tZWhgSlpXWDxHR0BUM0BGPjwqKDYzLjAxMykmNDo7PD0/QENFSUtOUFJUVldXWV1fX15eYGBdWltaWFVSUlFGOjIyMzAvKysoQFFSVFVUU1RWV1dYWFdVVVZUUU9RW1UlITJBSCQpJZJzjIquv7+7u7Wel6ikrbaho5mVo6mnrqmrmaWhn6WgoLWnoqmnsKOUq6OOpK2jnZCamqq0tKSdppypkpSXrqCfnaWjnKectZqgqqO2q8Kwqaupoo2Ej5yioaajlpmanJibmKWkppiqpqyhpJusp76slb6wrZ+jsLO6rLSnm6mypaiYeqiQfXywd4qApKWInG2yb6CHrXyhj4OolpmArImEroWflKigopaFn4CZlYB7kn2rgJ2aloqqeJ2gj4iTkoB5r12jgXymp2SdgHyXdGuvXaVrcYWZXWBbjKBulZGmmYKTi5WKeXmCln9qbH5ifXRuf3lgZmVxb2hnaENZYFs9SlQyVDhCQkM3JCQzKycnMywgLzY2NzQzNjpAQ0ZJS01OUVNTU1ZaXV9hYGFhYV5dW1pYU1BPTkk3MDUyLiosQVRWVlZUVFVVVVVUVFVUU1NWV1dYVlVVUUhGSUojKCi8kpqEqcbDtsG0n5utoK64paSOm6SjoK+uqZ+jnp2tmJ65oKKroK+qmq2hkKqppJaJmpCusKymn6ibrZiYj62ioZ6loZqlnK2Yn6imtqi/r6WppJ+MgI6bm6CmnpKUmZqUmpqko6OZqKuroqOeqai+pJfDrKqjoqyzuqyvp6G0sKmrmXavfpCKnIWHfLqtiZhksIxlla19oI+Dp5aagayKhLCFpZmkoaKQhKBbbGqBs2B/rXt7goGxbGdumZeLiLFbfbRbpINryKJln4F7vFl2tVqyfVKvgHqsWIChbZeOqJqJlo+UlXl3jZt9Y3J9YYN4c4B8YWlmcG1mZWVPVWNbQVRePUkoPjk9NCEiLCUfMi4gKjEvMDQ1Nzk6PEFDRkhKTE5QUFJUV1peYGBgYWJeX1xbWFVQTUpHQzU1My4vQFVZWFdYV1dYV1dYV1ZXV1dXWFdXWFlaWltcWFdXR0I70p+zsre9u7TBs6Ocraaltqmhi5mgn52zsqieop+dtJigs6iqq56wrZ6sm5WuqaKOiJuOr62opqOoma6Tmo+pmqGepZ+Zo6OlmZ6iqbKou6+lqJ6dj3yLm5ahoJqQkZqbkZmXp56hmKitpqSkoqSpu56gxqelqaKrtLatrqegva6trZaBqZKjro6bgIakl5iPgYC4w7qDjpyThKeXnIKsioKviKabmqWqkX7VvcKqYqO/vXx+o4KD17q4tYWTkoKevb6EaqOBb6uEbpx/erKxx4Nqq7C9rXh3or67dICVjaabjpmPlZt4gI+ZeWJ8emOMZ3iBe2BrZWtqYlBiW1NqXEBUYUJNKTw6NC8eHyQeJTIgHSQoMDQ5NjY3ODs+QURGR0pLTU5OUVRXXWFcX19hXmBbXFlUUU1JQz48QT81PVNZWVhZWVpZWlpZWFdXWFlaWllZWFlbW11dXFpWWFRXWryVtLSxv7myvbOina6mprOmnoyYpb+qt7CnoL+mprGbnrGcuaiera+lp5WUr6yXjIOaka+mo6yhpZyqoJiLo5KmnqecmqGoopmeoKutqbmuqKSbl5N7h5mSppuTj5GYmI+Yk6iZn5ipqJ+ppqGiqrueqcWjoK+jq7O1q7CqobyosLCadHWqpLeFZYmfb2esj4qPbW93pJCZn4F1r5mVcJCMcZWno5uYrqRybW1tZYp3bm2CmXGAeWlwaWeJlZWXcWhphYZncIZkXoljanBZXWd+d6ZgYnGOkm9mZICNko6il5aXj5Sde4aNk3RlhndojGp4fnlkbGNmbGJLZFhKa1k6UGVFUSdLOSsjHCAbIywpGBsYLTIuNTo0NTc6PD9BQkRFSEtMTU9RU1ZcV1pcYF9hXV1bVFBMSEQ9OkFCN01YWVpZWVpZWFhZWFdXVldZXV5eXVxcXF1eXV5dW1tVV16olK2zqrq5srOqqaKun6SzqpiSvbHDyL21qZ7Aq6yjoKarn7qjpK2srKaOlq2qj4yFlZetn6Wqop+kpKCRjKWTp5momZajqqCWnKWmp6+5q6yam5OSe4SXjaaYjpGQmJSNl5WnlJ6XqKKar6adoqy5n7DBqKSzpqyxsquurKi5pK+4loqhqKW2nImWoZeGqZqQlJ2TqrOZm6OsobOXoqCeoKKcoKShlaumjJKTjIeSnJyUkJmTmJCOlYWApJqXlY2Lk5KKj4aEfWeLgHSDdnSHjHGnbXyVkZSTgYGPj4+OnZOglZaVn4GGk4twZ452b4p3dnx6aWxkZG9jVWBZQGlaR2JgTlkqRT0rJiI3NDAuHxwhJTIoKjc5OTQ2OTs+P0FCREZKS0tNUFBRV1VWWV5fYWNdXlVRSkVDPjk9QEFTWFtcWVdYWFhYWFlYWFpbW1xeX19gXl5eX19gYGBfWVlgpZapqqW1uK+uorCkraChtrGQjqvEu8S6t6qhpZ2bpp2wqKO2p52ptKankZiso4uIiY+cp5aspKGap56fk5Wjl6maqJmUp6GkkJqnmaG1uqirmJqQjXyBlIyhlIqUkZWQj5OXpY+emaifm7Wjnaart6iuwq6jt6avr7Ctqqq0uqKvvZmSpqOmtaKRnaaejamfjZKfo6yvmqGjsamwmKShnKSqnp2dnJernJKZoZuTkJaqmY2YmJaQlp6RiKCdlJSFkoyQjJSLgH5mjId1h3Z5iINznGqHkZSUkYp9jJaSkpiSoJGblZ+ChpeFeHGUcniJf3F7fmpuZF9waWBbYFltYlBgZFBaOkdGRT0zPT03LiomKykmHSY0MDY2NTg6PT0/QUFDSEpHSktMTVNTU1VaYGBpYGVWUEpBQ0I7OUVNVlxeXltaXFtbW1xdXV9eXV5fYGFhYmFhYWBiYmJkYlxbY5iVpKejsLOsrqOpp62gqLWqkZCco7K6rquroaKZep2isKSlsamWm7imo5SZqZyOhoqJm6KQrp6klqigoZKXmZyui6qWj6iZqIyYqI+eubakpZibjYl5gZSMm5OKlZGUkI2RlqGMnZ6onp63o3+Dr7WisK90pL6jsqB4eqCrs7yVdq6kn4qAqn5kW2F2n46knYOXfm6Ts5yjqK6ro2WeoJNzeZmWcICYqJdsf6KniWWcpZuQl5iWi5GbkIWdmpCUgpKHjo6SiYV3a4+HdodxfIaBgGFpiIuVk4tbdpWRZ2iPjXF6o5eWZHiYhoB2l2iDiYJueX9rcGVfdm9ra2hcZmNiYm9SWz5NTk5SRz1AVEI5MS4eHyY0OjMxNjY3ODw7PkBBQkZIQkdGSUtMVFVVWVxfaGZnV1FKPERHPDlWUltgYWJgXmBfYGFhX1xdX19fYWFiY2RhYmFhZWRjaGReXWaclqajobCxrKuppamto6etpZKWqrSusaWZqaarlnOLnK+fqKunk5a4oKCPnKSdkX6IiJqejauapJWnop6Ol5KehXWukImmmqiRlqOIm7q0qKCZmIuJdXaTjpaTipORkJSMj5KfjZqfppmbspaAjJu1nbSMko+9p6F+p6J6o6+4gY6Op5+Ei4WPsKmvjImWopl5gYushpydoqiqqIiVhph3pZt6h5uBl6aCgXucsXqKhZ+XmZSYloGQlpaEmZpieYeQhI6PkouDbnGQiHqBcYCBhn+GdIeFlpJ4lmiTdKCadHyZg56bhZh+kYmBgpdpjYyEanh7cXBnZHdtaWxqW2VqaWVyW15IU0xRQEU1LVlUVDYpITA5PT42NDM1Njg7Oj0+Pj9ESUBJRUpLR1JYWlhbYWFoZllRSDlESzw+YlZeYmRlZGBhYWBiYl9dYGFhYmJiY2ZnY2JhYGVkY2djYWFonZijn6aurquorKCosKenqqWZlK3GvLChlaWotJ2Pg5yrm6eioI2Qvp6ZjZ+aoJB9hY6Zl4irnaOWoKGSjZSJhoCRqI6Hopyjk5adhp+5sqedmpOPhXB1kIqVkIqUj4+bi4+RnpGWn6OVnayIn7SJtJqui8qIq66Jt4WNsIOxr4SpjaeYjZ18qI9ye3ebjqaWaJWkebSLn56nqZKZwoF/q4iYoXGegJqkfZeFlbGBoXygk5+PmJeAjpObiZiSi3yFk4aNlZOJg21zkYWAe3KGgYV9hXSFgpeBj8VmgKmHj6JqnoKfmIGZgIqLg4iYb42ShGd3dHt2Z2h1cGZna15ibmxmbFhmRlxQTDJFNDZNYGM2JjQ8REdEOjY0NjU4Ozg+PT0+Qkw/TklKTENQWl1cV2JeamxcUUU9S01ASmRYXWNmaGdiYmJiY2NgX2JhYmNjY2RpaWNiYmJlY2FmY2JiaZWXop+wqKmopaugpLmxqqummpSfoqSqopWjqbair3+gppylnp2JlL2Zk42gkZ2QeYOWlpGHq5mcm5qhhY+Md5ucj6CRiJ6km5WYl4aiuK2lmZuNjX9ibZCLk5CNj4yMl4uQkZ6Ok5+gmKGofqGnh62doJauj5+dnZGGgaCNq7CHpI2qmoyafqN2gJiTa4GrdE2reIeNnZGbqaiCqqt9g6F7eqdpnn+Sa2eXhpe2iJ59bWBjWIOXf4x7ZGeLc5l9eZZsXXyXbl9TcYVcYGx5g2BZZYJ9hIGYcaeqa4OjbnKlcJ+DnWdkn2xabIh6ZVlfgn5hV1BvdmVtdHFqam9eam9sa2hXaE5dV0U5QTRHQ15rNCtJQ1FNTj04NDg1OTs2QDs7PkJPPlFSTE1CSlxdX1deX2J2YE1EOk1PTVRiXFtmZmlpYmJkYWRkYmFiYGJkY2FiaWtkYmRkZ2RiZ2VhY2iYlp2guaGqo6askqK2vKuuopmXn6GlrKyfnK20oqeRoJ+fppyZjpi0mZCLnoyVi3WBlJGNiqaWlpienn+ThYaspIeckYqYqJeZmpGHpbCmopWZiImAaW6Ih4uOjomLjZKLkJGhjJOen5uipX+TgY+joZSgd5yWkKeDoaeAhqquhaV5i32Emn2icHOTh5Z7nox5bYebjJmQm6mbj4edfIKic3amZp5+d6RfmHp8knOibpi3tLp0koeBgLaoZIHGuHtwlbeMcYCbpGN0rKtgfWqds35ufYeDjoKLl3GAo2xzpHOeg36jXp2Zs5Zve5ees3RyW56ygmlib3N1cWhvWWtscnJlXGhdYktEPUQ1UUFZcTI8UkZfSlM9PDM5NTo6NkQ7O0BJUD9UTU5RQEVfXltaWGBgfGRJQzhMV1VWYmFaZWZra2JiZWFkY2BhYmBjY19gY2tuY2NkZGhkYmdmY2holJaVo7mZrJyToI6luLWuraCaopyjo6Ssm5qxrKuSl6CYoKSampSeq5uLiJJ4i4VwgJaNio+gkJOUnZd9kYmOqKGHmI+KkqOTm5qMi6iopJ6PloeEfmt7hn59j42Di5CQiY+Tn4KXnqCdoJ+LiXecmKKMoHKii4ipiJynkZeorH+ujH16oJl6o5N4gHOXiIycfZafhpuNmZumhqNkoXyJlpCbjWyeaJqNbpqZen+Kp31yZ3Oqg52Cc6pnlJpdm4V2hJ1oqmqBuGZcqXCBnGGVjF6ndnWJin+eaJp1h5OSmI5/nm6ZkGummVyofne7an2pWo6EXbNnXG1xeHdraVtwaXh4Yl5lV2JBUERPN1ZCUm00SlpaX05aREAxNTE7OzdIPzpDSFU/WFJZXT5EYl1WYFFhZH1pRUI5TlteWWRmWGZnbm1iYmVfYWFfX2BgZWNeYmRvcV9kZWVrZGNpaGdraZWciaq2m6iJY5WcrLqysKydppubp5+drZqdsKernZeimaGfmZaWoKOZhomNaYiAcXuXiIuWloSSlZiPeoqElqOdiZWQhoudkZybiY+oo6Cai5GKgIBpgYZ4f5aMe4iNjoeOlZp+lKOfoKKTmHJon4qgj4xwkoyCqYiZn6Opoah9sK2koriXdqOzoqN/iJR4nXqrmn6ijp2bl4iXcqF8hY2vtX1rmpGheH6YtKOjq6iEmHuafJyZfnOqWl1ve5eLeJ5iTX97e4VjephCTZ9ZompyfI5tgYmEmXWbeYeJsbN/f5qSpnR/nW1xfJRvmXJpo12VdkhlY2BzcHx9bmVga2h2e2JjYFFeVlxUVkBZRVFnRFJXW2JYX0lEPUI4QEI6SUU4TEVYQVZRW1ZERmFcWmBLYG1+ckVDPFVfYlplalZnaGxuYmZmXmFhXF1eYGhiX2VjdmxeZWdmbGRlbGhoa2mTnYGxrpmEU1+hp7S6s7OpmqKLm6mcm6iSoaujoKeOnp2cmpmVmKGdloeHiXeFgW55lYWQmot9kZKWiHKAiZKgnHKRkIGImJSfmoSOqJyalYqLinyEbISFcYGhjHiFjYiHkpiUfJOkoJ6jiK6GfbWEj56de6aWeqmClp2Qi6Gefadod21+mXOgc3F8nYWYb5OCrn2jg6aemoGjcF6pZ3WjY2+lYZzTkHx6mXhyc2OihY9+onKijnVrj7OLYIKYinOqsqi8f3eDbX+/pqq0XptvfnGXb4FzonJdo2d0pmFopm2b05h6gptud3mXa5t6dpdybKmlZ19keXB+hGtnZmNtdndmX2FSW2VRUWJJV0lUX1dTW2VqXGVRRUNLTEpLQkpEOFBAUU5XU1hPUlFgZWVpUmR4eXdJRkVjXWVaaGpTaWhqb2NqZ2BiX1xdXV9oYmFoZXtkXmRnZGtkamxmaGxomJt/sKxUXEt+qbCytbCzo5yYhZimoKCijaSon5eoiZmXmJOZk5Kgl42IhXtwfYRofY+Dk5qBd5GNjolwf4aPkpJsl5N8iJCRo5WDjqqalJKKhYl5hHaHgG6Bn4Z3gJKGiJmhlnmToqOaoImzoaK2i3qsp6SupXCpgJqQhYGckn2kgKKZhphynoSirK6Jl4uAjKSNloOuopR2tba1yaF0lIqAn2Gel6lteJaGn5p1oYd3oH2QloqBb0xmopJwmohzpHt5dGGDgmx+oGxyZGCccn90l2l7abO1tMamc5h+e51qm5qrdIKabXN3l2maeXSYcVBFfLNeanVqeIdmamdidHRwbVVdU1loUFJoSVVMWFJWXWdrblZnV01KQUpNSkhKTkFRSlBlY2ltZXRyc354e251iXt7VFBPbV1oW2tpUmpoaWxnbGZjZV9cXFxeaWJkaGt7X11kZ2NqZm5tZWlsZaKcia+nhWY/lKKzq6+vtaKikICXqKKho4ukpp2cpYGal5aNl5CQm5KNiIN5anmGZYOMfpageXWPiIyBaYSFkoOMhZ2NeoyKlKWSgpepl4yRi4CJeoB9i3lwkKGGeYCUh4mWn5R/lKWnnJaWhGdueJxsomR8caV3nJhwZ6eBl4x7pXqgloOXcp92gImUlo+5bpCKomJ9maKViG5yaaprdaBsbqZgm2mLkGiWh5qVdaKAfZpfi4WMdW+IYmihZZ5/aZt1cGRmiIJucqJaX1tkoW5eiYxve39zcmSlbniiZGenaJhyi5huoW9SiI9voF5kp1SLXVOYbW1yanGBbHBoa3hza29RV1ZWZllTbUlYT1xIWGloc2pZa1ZRUkVWXExYUmFVaGped3V6fHB8fHKCe39ydo2AhHZeUXNhZ2JwZ1BqaGhrbG5nZGdfXV1dYGpiaml2dV1cY2hjamlybGZrbWOdpZimemV0bYunrqWqsLGmn4uAlqqcnqSMoaGaoaGAlZiTjZqPi5eQjYp7hnGAiGiLi3yXmnN0in2Qe2WDh5WKipWZgnyIhZamj4Giq5CFkIqBin2AgI5zaY+lhH2Fk42ImJ+Nh5Kqpp6JpniWnH6liZaMspiekIOvl5+leJaIeql0pY+Emm6looyShIyDvG58pa+ChoWGk5acoH2menGolKCWZ55+b6tiloqVkneobKmigYl2h4J3q5GmiGuRsGt2s4ypbIuGbm2fnpKVYX6ri6p2gH+Np593n32FpJWdoGmah3WrZp6tjLZzd76MpJNZg6aNq2F1cXNve3RwYmp+bmhsUlVaVWBhXWtNXVJdSV1sbXZgW3FZW2BaZ3Nlbm9yY3F0YHd7fnlyeYNzg36Be3uMgYKAdmJ4ZGNuc2RSbGdob2xyaWZpYV9eXGFqYmxsem9cXGJpYm1pd21nbG5ilaaqnIGAnqSWqaqeqKeuo5mJgpeqmZ2jiZqlnKidhIuaj4WckYWSjYuNdIV6iINvjYR9lpN0dIZykoJtf4uSh4aTj317gYSXpI1/paWNgI2JhJR1g4eSb2yKqICCi5ONiJyeiYyTqqOgkIB1lZeIfoF5lK6jf4GbcY+GeJCMhYB7cqeMcX19epeWm4SOeHt+fYiUlZOKdpCZn6GEe32Ja4yFW3l5cnlwaG59kYlxf3SBj5STcYWDgWWNf1+BgIx3dXOUdW96b26HbYSGX3doeI5mgYKGjqqcfnR9l2qJiG9/dXyEdW1sZoxzeHuXd4Rbalh4j2htd3Fwb3d3b11shm1pZ1ZZX1dcZGtkVWFVXlFfcHd5a2p3ZWpqanV8cXF0c2FvdWJze4F4dXmCdX+Af4B4i4WDfXttf2xkeW5eV25naHVreGppaWRcYFpjaWVscHVuWltia2Rra3ltaGxvYY6Vuqmni6GimqakmaSdq6Kgg4OXq5GdoImappqomIKBm4t+lpSHjomIjXKCfI99fo+EepeOdHKDcJWFe32Si4aGkIV4foCGmKKMe6ehi4WPj4SVgoaOl3dyhKmFjZKcj4ienoeLmqegoKuDiY6Vmn5+iZatqI+Sp5B4cJ6Rg3uTb36phXB9lXFqb3yBn4t/ko6MaG1dg4uMnJufj3OVi4hxdGuCdnN/WXJuho+BfX6LaV1pY3qFg4iAX2l4e5t8g4yDdoGGg2l5i4drYXFzg3dgc4yCiZCnlYZmjY+DbnaLg2+EjHhuZGZjeYJ6lVpcaWZudlt6eXd0bXNygmZcbYpra2JZWV1aWGtxW15gWV5dZnN9e3NvdGNqaml7fHF6d3RkbXRobHx+dXl8e3p5f4B/b4aKhHt9c355c39pVFxxaWx2cHVna2dkXWFZamhranFybVdbZW5sZ3N5bmhqbWCMjKuxopCjoZqfnpiemamjoX2Dl6uMn5SHm6KQpJR/e5eEfJKZiImGhopyfYCLdoWLgYSWinFvgHKYhoR+koOEhoqBeoCDipqej4KmoId4jZeIlYuLnJeFg3qsgZCXmZOJnp2HiKGqn6Kio4yIk5uco5mWqqGnpqCSm4iXj3x5j46EqH5/kpGSk5ywpZqUnZCOspOYhKaMjJWboImQm4KJkYprfI52d2WChpCKfImdhIeLj4eIgISDkHd8enWaoomHi5+LhpV/foyBgHZxdIaFgHiIh4qRppGEho6Ig42QjHyGioeOgHVrgYN7eZlpcmhgc4pwfXp2dW93dIFcXm+HaG5fXlpbXFNncVVjW1thbGh0e3xybnBjamlof3tteH5xaG9wbGaBe3KBgHeAfX+Ee22CjIZ8enh8fnqDeE5kdmpzbnB7ZWtlYmJgW3NmcGZycWxVXWx0bWl5enBnaWtljYidup+WoqGYlZmYlJikoJ17f5mqjZ2NhZ+cip6WfHiUgnuOmYmGg4SGbXiBgHKAh36Ik4RtbH56l4aEg5B+gIaEhn2Hg4yanJKHqp6CcYqPhZKRi5yRfY16qYONkpeVjpuWhoabpqCimp2Gg5KZmZiQmqafpp2dkJeBkot3fYiOhaV7fI+QkYaYqaGck5yPjaqOkoCejYmTmp+Dj5d/h46Cb3iFcXRgfoOPhXSLl4CDjoKGhH6FhJRueXV1k6KLjYabhYWOdICKfX1yc3uJhHt5jI6Ek6ePhoSPgoOKiYl1hIeIintuan1/e21oa2xnXnl+Z3x7dnN1dXp2XGBwfW10YGJaXF5RZm1TZVpdYWtpdnl+cGtsY2tqZ4CAa3KAbGt0b3huhHluhoB2goB9hXZygo2Ifnt6fH97gopgaXtrdWhpg2VqY2BpW2N1aG9idW1sVGJxeWRwenpyZWptbYuKn7iaoaSfk5KWl4uan56denedpZCbiYaklIuYmXl5jYV8iZGDjIKBgm18f3hygIV9ipB9a2h9gZeIgYiOfH6GhId8j4CPmpqRiKecf3CLiouShqChioWMfKeRh4+Sl5OWkneNo6ChnZaaf4GQmZiTjJqioaOal5Gbf46FeYCEj4ehgH6MjY98l6SgoJKZkI+mjZCBm5GJk5ibfpKSfoeOgXV0gnB2YH2AjYVxipV8h4txjH6ChYWOaHhyeYyZkpCAmH6Ii3KCh3x9cXp8jIV7e5KNg5alk4uGkXyFhoeEdYGChod5ZHF6fnh5cGxqZl59cmh8dXVzfHN/al5gc3Zwd2RjWV5eUmpoVGRYXmFnanZ4gXFma2NsaGV/gGptfmhvcGp9d4V6a4uBcoGBfYF0doKNhn58en+BfX+PanKDbnNpYYhpbGJfcVV0b21uYHhobVdqdHZidXp7cWJrb3qJjZ+zkqWlnY6QmI+GnaCanHx1o6CNln+MooqImpZ4e4aHfoOJfoiCgH9wf3t0dYKFfomQeGdjfYaXioKKjXh9gIyDeZaAlJaVjZafmn1vi4GQk4alm4eMiYOllYSSipWXkpF2kZ2hoZiUmHp/jpiWjpaanKSemZOUm3qQhoN4hZeNnn6Bio6Mc5einaCSmI6PooyMg5eYg5OWmn+YjXyIjYF2cX1temSAfIqFcIaSf5CCa4eCgX+JhGV1b3yHk5iNfZR4jIl8gId9fHKAeYqHeYWRiouYopaChIx3iISCgXZ6gIiEdF93d3xzfXdma2RgfmlqdnNzdH1we2NjYHNtdXJtYVlgXltsZFJiV19gaGt1eYZwY2pjbGZofINraHRobG9of3yBeW2QhnGAgoJ/dHyDjIF/fnqCg358kG11iXR0bWWKbGphY3VWg2lxbmB4ZmxianZwZnl7eXFgcmyGhZCdrpimqJ6OjZeHhp+Tl5h8d6mciph5l5yLi5iQeHuAi318g3uAgoB4c3h6c32AhH+IioBkXn2LlYd+hId0fX6Kf32YhJaTloyioJd+cod7k5GKpo+MjoqSoJGDkY+Ul5GKgY+YoJqSkJJ0gI2Rk4mcnZ6mmJiNlZd0jo+KbIaYkJl6h4iQiW+XnZmik5SKjJ+MhoKSnH+TkpWHmYh7iYmBenF5anVse32LfW2FkYKTd2+Bg31+i4Bkcmp8gZeYhX+OdJGJg3mHfnZ4gX6HgX2EjoWNlKSQeYWDdImHfX9ydH+GgmxgenR5cHtvYW5iZHthbm92cnd3c3Nhdl9ua3Vub11bXl1eal1PXVdiYWhtc3qJa19qZWpjaHeHbWZsaGpsZ4B8endvkIdzgIOEfXSBhol6gn16gYR9fY5yeYt5eG5sh2toX2lyY4docW9mdmdtbGF6aGp8enhwYXdti4GZmqqgpKmdioqRhoqeipWXfXatmIyWfZ6TkZaTiHd9e4p8e4B2d3+AcHRzem+FfYGAiX17YVx+j5GGf4OEc3qAhnqPkYeRkZySpJuUgX2AfI2KkqSIjYqNl5qNhZGYk5WOiYmMk52TkIyNboSQjpGInpmhoJeWiZaSb4qahWeGmo+UeomFkIpwlpqToZKSiIuZjIKAkZ59kpCTjJmPe4mEh3RzdWtxbnV7inRuhpCNkXF0gHuBgoh8ZXFteX6alH2FiXSRi4F0iXlvgX6Bh32FjYqFjZaojXuIfX6LhXd9cG5/hIJiZ3dzdG56Yl5vYGp0XnBqenh4bHJwZXhdbWxzbXNYWl5fYWpaT1dYZGNncXF/h2ZdaWhmYmdxjW5kaWdlaWiAend1b46Fc4CBgnt1goiFeIR8d4OFeoCJd3+LfHtyeYNqa19waHR/a3FubXFnb2xle2Jtf3l2cWx3d4p/o5iiqKGnm4eMioGPnIaTnHSAqpSRjIagjJWTkH90e3aEd3h/cnN7hWtyb3ltiXaAgIZtcFtZfpGNiICAgHZ1gH9/oIaPipGcl6CTl3eJfoCMiJydiY+GkpeWhIiUmY+Wi4uNjo2dio6QhG6Ji4+RipyWoJuYlYWYiGuGpINnhp2KkX+LhIuBd5OYkZ2RkIiJlY5/fo+YfJGNj42akn2Kf4Jvdm9rbW9weoVpc4OOl4lwd4B0goiCeWZ0b3aBmo98iYV6lZJ6d4l0cIp8h417i4eEiY+co4h8hHeCi4B4eG5pf4F/XHFycW9vd1pecGBval5vaXx6cG1tam12YHBvanFtWVhhYWJtV1FTWWVmY3VwhIJiXWttZGJma5JtYGZmX2drgXVxcnCLgHR/goB4doCLgHmFf3eHhnaDhXyHjIB7dop/anFjfGOGfG9wbHRqaG9sdndfcX55e3R1dH+Cf6WVmq2fp5aFjYN/l5WDj551ip+TkoWKmoyVjYt6cnd0gnByhXNxdYhsb211bYh3g31/bG1VUYGrlIeCeIB2coJ5gqCBkYGTkpibkZp4kXqCjJKkmpOOiJWYkoOGlpmMk4uJj4+InoWQin1zi4WIj4icmZ6blpSAlH9php2IaIehiJKEkYOJcYORl46ajo+Mi4+Nd3uSkHuOjI2Rlo18iHyAa3ZqbWtrbHp+YXl9jpWBdnqBd4OMfHlndWx1h5aMf4iGe5SRcXqFcHiNe4uNe4l+g42Rnp6FfH14got9dnBoa4CBd152b21rcHJVXW5icWBfbW55cGdwZmdzdWhwa2F3ZV1WZWBgclNQTltmZV14cIh8X1xocmJiZWaRaV9oZFtncH5va3Fzin12fYWAdHV/jHl7hYB4iINzhoV+jIyDe3mVeGZyaoNgh35vb2t6YGludH90X3R9eIZ4dHKFfHmhkJqxnKaOg4p/g5qIgIuefoqZko6EiJeNjo6EdnR2c4Bwb4VzcHGDb2ppdm2Cbn18bXVzUk6C38mS1pN8cHSDdYOggpJ3lJCYm4+Ye5NyhZCfoZOTkIqSm5OFfpaViI2NiJGNiJyAjoF4eox+iIyJm5ucmpWTeY13aIqSiGyJpIWTiJeDhmOMkZiOlImWi42Ki3F7lIl7jYiKk5GKeoV7fmx7ZXJvamt5eVuAeY+NgHp9fn+Gjnp6aHRrdIuQioKGhX2WjGx+f2+BjX+NiH6EeoOQlpqbi3x3eIOPeHJsZXB/gmtodG9naHNsU15uZHBZX2txeGZramJmeHNvcGNfd2BgVmtfXnZQTkxgZmNdeXGKdFxbZXZgYWVljmNhZmFYaXNzbmtxdot8dHmGgXV2fotzf4Z/eol/comHgZGKiHx+mHZlc258ZYh/b3BsgFpsbnl5c2B2enuNdnJ3ind5n4ybr5ugkIKFd4iVf32JnIaEn5COhYyXhJOOh4F1d3B5cW6Eb21ufnJkZHhwfG16fWpobGOkmsHcru+hc2t1g3WEoYWRbpWPlJ+Um4GRcIWLo5eJjpWKkJ2VgoCVkIWJj4CSioqXf4d7dX+JeIaEjZual5mOkHaLd2+Iiox+i6SFkomdhYVei5SXio6IjouKhIlse5eCfYiFiZGPhnaFfX1rfWN4dWlteHNXiHqRhoR5fn+AhYx+eWZ0aoCKj4qDg4CMl4ZsgnZuiZGDkYV/gnqAkZaUmZB0dHiHjXVzcGZ0eYFhc2xvYWh1ZlJgcGdrVV5tc3lgcmNfaH1xcm1aYnJhYlduWlx3TU1MY2ZhXnZzim1bXGR5XmBkZoRfY2NeWGpya25rcneLfXN3hIF4d3yIcYOEfX6Ie3SLiIiVhox+fpdzaHVxeWyMe250cIFYcXp2eXFkd3mGjGl2gIlygJ2Imaico5KEfXCMlHh5i52EhKCNjnyVjH+Zh4R7c3dwc2pvgWtpbHx0XmB4dntwdXtnYGV869q1ycPciHNsc4B2iZqIjWmXj46clJKBiHCFiKCOhIuVioyYk3yNkoiDiY97kYuGkIJ/dniDhHKHgpKblpOYhox2h39xhoOKh5qig5SMnoOJYYOVjoaJhYmMh4CHaX2Uf32DhImOjoJxhn5/cXdndnJpc3drWox9koGEfH+DgISKgnZidGyJgpCLgn9/k5F9boJseYeQh5OEfYF+gZKUkZeJbnJ6jIZ1bHBqcXd/XnNoblxqdWBSZHFoZlNfb3Z0X29gXWiCcXJpV2doY2lYbVdbdUxKTGVmXmJyc4VoW1xleV5eZGd6YWRfXFlrbmVuanR3in5zc4F+enZ6h3OFg3x/h3d2ioWPmIGNgnuTdmx3dXl5k3VueHp9WHmGcYBvZ3h3koJkdoaFcYqWhZmhm6KKhnNvkotyd46cfYmZiIl7n3+DmX+BeXJzbm9kcn5pZmx3d1tfeHp6cXF/aWFnYX/Vto6QpnhucXd7cZKQjIdqmI2Im5GLhntoh4uZhoGSkYaHl418jYyAgImNfJCMfoqFenV7gnpxhYCUmI6Sk4GJdYSHd4SAi5Sdn4aWj59+iGF/k4eEh4OJjX9/gmZ9kYB+f4KMj5B/bYJ8gnRrbXZ0c3Z1a2ONgY5/hH58hH+EiH9wYHNxhnyPjYJ8f5KJenGDZnuEi4eNhHyFfoGVj5GThG5weYx+dW1uaWp5fGFnaWlYa3VaUmlyaWJQYnJ4bGFlXVpqg21zYltnX2RsX25UWm9OSE9mZFxnbnGAa1pbY3JfXGNsd2RlXVxabGtibWpzdoZ/cW9/fHx0eIV4hYJ8gIh1eYmBkpV8iIZ2iIFweHl7hJNvbXuBd16Df3SBbWl6c5RzZ3KIfXKSkYSan5ughod2dpR/bXaTl32HkIOKjZl8i5p2fndxb2xqYXR8Z2JpdXpaX3h8eW1xfmVjaGhXnY9ecXKWvMSEdnGUiJB+cpaLhpuSjIdyaoiPloB7lIyBhJuMfIqGfHuJjH+UiHWKhnZ2fYFxdYWBnZOFlI+Dg3KAiHWFfIqZnZiHlI6dgIhmfZOCf4WDiYlxgX1mfot7eX5/h4uOfWmAfIN2Zm94eHN2c2xqjYWKgYl/eIGAhYN/a19yeXt+jYqGfIKPgX5ygWl5hIiMhoV5hH2BmI2QjH1ubXuJfXd0bmdme3ViW3BiV25yU1Nuc2hhTWZ0eGVgXVxYboBvc1llYV5qbWBwT1lrUURTZ2Baa25tfG5aW15sY1pib3dkZ1xdYGxpY2xpc3aBg3Fufnx/dHWDeoOCfIKFdn6IgZaQeIOKdIGIcnl4fo2Qb297gXFpgXl6fm1se3WVa2p3hHRslI6GnpigmYWIbn2Mdmp4mI5+gYqClZeJeY6Wb3pzcGxqZGBzemhgZXF6WmFyfXlncXphZWWPsbJ3SmJapNnQlnJ7kIqQd36UioSZkYyFbmuFkpF6eZKGgISYinyHf3h4iYqEloBwjIhxdH16aXmFg6SQhJOMg35vf4N3hHmGnJmVi5OQlIWHcHuSgn2Cg4iDboF3aICFeHJ/f4OKh3xlfX6EdWNwcn9oeHBvdZiMhYKKfHZ4gIR5gWtccX5zgYiFiX6GiXuJcoFucYWHj4WFc4R6gpmNjYR4bm9+hH92emRnaXtvXlh2WlhwbE5XcXNnYEpsdnRgXVtbWXR9cm9XZ11manBgb05XaFE/WWZeWm9qZ3pxWlpZa2VZY3F5X2hcXmVtaGVraXF3f4dvbH9+gHVvgnuAgX+Df3aBhYiXinGCjXF7hnx5eYSTjHVqen9sb351f31vcnt7lG9ugX94ZpOLg6GZnJKChmeHg3BnepWIfX6EgZiJgXyNjGl4cmtsZl9hbnhtX2JveFxkbIN6YXF2X2Vl1Oq+ijI6PouOgHF4hYiOjXaDlox+ko2Mf21shY2Mdn2Pf4WBlYh8gnhudoeEg5d3b4iFbHV7dGZ5goOmi4KPi4N9boB1d4R6h52RjJGSk4yLhn57koZ3f4SMg2t/cmiAfnhtfHyCioR3YnmEgXFkcWh+bXRxdIGbi4B+hX5zdX2Ac4FvW21/dXiLg4t7h4B8iHh6cWyJhJCEi3KCeoCXi4t/dG1rd4CAdXVcaGd2b1hWe1JZb2RMWnJyZVtJcHhvXFpaWV11fnRoWWJbZ2VuY2lMV2ZRPV5lXF11ZWB1cFpZVG9kWWRxeVpoXmBnbWdpbGlwd32ObGmChH55boB8fIF/gnp1goGNk4VwgItud36Ae3uIkol/aHt9anR7coZ7c3d9f4x5eIR9fGuMjYSbnZaMgYBsjX5raH6NjHp+f4OUgX59iohrdXFnaGNbYmdybmBha3NhaHCJemJzdF5jZJugj25cNVmvtXRpgIh8koZ1hZaFc4+KiXZwbIWDh3V5iXiJfJOHen5zZ3aJfn6YcHGGfmh2eW1leYiEpIaAh42Jfm5+doCBfYyaiIKUkZiJi4SJfI+IcHt9hHtofmxqgHt6aXp2gYeAcmB3gX5xZHJmdYJtdXuElJGBfIF/bnd5fHR/bVhwgHd1jIKGeIh2gol6eHNuioGQgYZzf31/k4mIem5tam6CgnVuXWdkcnBRWnpNWm9cTltycGRVS3N4aVdZWVphcYB0YF1dYGZkaGlmTlpoTkBhZFtgdWFddW1YV1N0YVpkb3JXal1haGtnbWxpcHd8kmxphIl8fHB+fnuBf4J6d4B/iouDcXuHb3F3hH97iY2Pg2p+e213eHaKd314gIKHf4N+fnpthYyImKONhIN7dYt5a2yEiJB4fXuBkX9/foqDcHJxY2ZeWWdfb3BgYGdwZmpviXRhdG9bYWRqdnt/vpymo8i4cYWDcpJ8eIaTgnORjIdycm+De4N0dYd0iHeTiHl5cWN3h3qAk2lyhHZnd3VjanyCh52Bf3+Oj31yf3SFeoCSkYN5lo6Vj4iCiHuIiGt4eX51Z3pobH95c2l6doCDfWhgd4d9ampzZ3uAaXaAi5CUfnp9fnB7dnt0fmJWd31yc4qEgn2DcYeKd3hxcISCjX9+eX59do6Gg3ZpcWltiIJycF1nYXFtSmV1S11uVVNZc25iUU9zeGBSWFhcYW+Cc1thXGhlZWNrZFFbcElEY2FaY3BeXXhoVVZVd15bZW5oVmteYWpnZW9vaHB2epJuaYiMeH1ye355goGBfHZ9g4iGg3B3g3Jud4OCfYmLk39wgHt4eXqBjHSDeH+BgYKEeoB1b36Ki5ueiH2FeneGe2d0hYuQen5/e4iFhHaPgGdvbl9kXFhlWW1yYGBgcGxraIluYHNpWV5kbYB3qdqpx4aHsnGJd2+MdXuGjoB6k4l/dXR1fneAcHF/bYR0lIZ4dWtgeoJ5iY9mcYRwZ3ZuW218gJCTf4B5kZJ9eXttiHeBkoyEdJaKkY6HhYV7f4RsdXZ/bWd2ZW17dW1qd3Z/f3xgYniFeWh0dWJ9e2d0ho6MlXt0gHVxf3p8bX9ZVnR/cHWFh3+BeWyJhnR5bHWAg4R+e315e3OLgXxzZ3RlbouEbXNbal50ZEdtbUxaYVdWVXhtYlBSdHZXUFVYXmFxhG9cYGNtZGReb2JUXXJHQmZfXWZoXVt7YlFVXHVbWmdrYVZqX2BuZWZrcWhwdXiOdGuOjXV+dnh9d4GDgXtzfYOIh4NvcX90cXV/hYGJjYp7d394g3t8hYd4h3x9gX6EgHt+c3Z5jI6gjYl6iXZ0g3lefYWYjHmGg3SFhoR3iXtibm1cYltbYVZqc2NgW2dub2aHcWFxZldcY2t/fMrOh7mham1timxxhHF8hIl+e5GFeXlzeXV1fGpsdWOEdZKCd29mXn2CeouJZnKCa2pxY1hteoWbiIGBc5eUd398bolygouMiHKYjpGJhYuDe3h9cXFwfWZocWJteHFqa3F4fXx6XGR5gHdpdXhlgnZndIeLjZR8cYdqbn2BeW58XVhyf250gYt8gm9vin9xdmh3f4GAgXd9cXt1h3x6cmZzYW6MgmxyWGpddltIbWpNVVReVFV7a2FPVHVyUFFUVl5idIVpXGBramZjWW5hWGJwR0FoXGBmXl1We11PVWRwWltqaF1XaGBfcmVqaHJncHJ3hnhulYp0f3p3fniDh391cn+GhY2CcHB7eHd1eoaFhoyFenx/dIt+fYaEhId/fn59h398eHZ5eJGToH+MfYttdYB5Y4OGloVzkYpvhYWBeoN0Y25qWV9bXV1UZ3NlYFlkcXJmgXNia2VXW2Bpf3i+rnugt21ic4Zoc3txeYKFe32Mf3d4cnZve3Zlam5gh3WOgXNqYl5/eHmLhGdxfmhra1pWb3eJo4GEf3GZk3GAeXWDboGDkohzlYiNiISJhX14dHJuaHlgam1gbXZqZ2preXd6d1tnfXx4ZXJ9bYR0ZXWFjIWVf2+LZmp6g3VtdGJccH1sdX2MfIFmdYd9bnFodX94fn9zfWx7e4F6eHFmbGJuiX5tblZqX3ZVSmlqT1FOaE1ZfGhiTlV1akxQVFVeZnWDZl1gcGhnYVdpXVtraEpEalphZFdZVXlZTlZtalldbGVcWWVjXnRlbGRxZ3JvdYF4cJmFdn9+d398hYd9dXOCiICVgm5zeXt6c3OFhoiIg3iBfXWPfnyEio6EgoR7fouDe3d8d3eanZd6ioKGaXZ9fGyDhJJ/co+CcIWCfoF/b2ZsZ1ddW1xbVGRwZF9XYnJ1aXVwZWViV1xcaH9wb3KAc4lkZHh+aXR1c3KChHiAhHl3dHVta3pxYmdrZ4Z0jYNuZl1ffXB7iX5pbXhmaWRVV3JvjaZ8g3t2lpB0fHN9e258fJGFd5l8iIaDhoN9dHBybGd0XGxoXmx0ZGdmaXpve3JZZ4B2dGdwgHeBdWJ3hYp8lIBui2pteoFxZnNlYW57Z3N4inx+YnaDdmprcXV7cXp6dH1mfn9/eXduZGZiboV8bWpWaWFvUkpoak9LTnBHXntmYU1VdGNKTlNXYWp2fmVcZ3NpZWBWY1dicF1MS2tYY2FVVFVzVkxYdWRaX2thXFpjZV93Zm1icGlzbnJ/dXSagXd/gHd/f4aEenx1goR+l4VucnR8enRxhIWPgYB6i3V0kH98gZWOgIWEfX6Mhnt+gHZ7o6WKeYiGhGt1fHp1g4GLeW+Fc3mEfYGDdW5qaGVWXVtaWlNibmRbWGFze2lobWlgYldfW2qAaWtvgGdrYGh5eGpzdHRuhIF6f311dW56aGp5al9lbmiBdo+EZ2VYYndpfod7b2lwZ2ZdVVhvZ46od4F6fJCOeXVwf3BzdnqPgHiVdYaDgIWIdmpydmdobltsZF1tc19nYWp4aHttWm2CcnNqb4B+eXdhd4SEd4+Ecohxb3l/cWNwaFxweGRxdIh8eGNzgHBnanl0cmx4d3Z4ZIN7f3h2cGRjY258fGtrVWhhZVNKa2dPR1JrRWF4Z2FNU3FcSk1UWWVrd3tlX21xaWRdVmBWbm5XS1NoV2VeWE5VbFRKXHlfW19rXV1bY2VgemhrYW9vdW5veHV6mH13gIF6gICHhXp5eoN+gZOEcXR0f3l2dISIkH2AfJBrc5WAe4KfhX6HfYB/hoKAint2hKyff3qIiINrcoF5dYB/gXRuhm58f3OJgGpvbWRkWF9aWVpVYmpnW1pedYJpXm1sXGFWXFxsgWVxdH1paVxrdnVndHdybYV7fX15dXJseWhpeGZdZXNoeneSgWNjVGVwZ4KFd3dnaWpgV1ZZZ2OPp25+d4CLjnpwcX1oem96jXx3j3KEfX9/hm5kdXNkaGhca2Jdb29bZ19tdWR6aF10gG9xa3F7fXV1YXSFinqHh4B/d3J1f3VhcG1acnRicXKFfHVlcoBsYWx7b2ppe3l2cmaFdnt6dXFkYWVtc35pbFRoXlxUS3JiUEZWYUdidmdhS1RvV0pMV1hna3Z6ZGVucWZjWlddWXZlVUpcY1dnWFlJV2VRSGJ4Wl1fbFteXGFkXn9pal9udHhub252g5d5coGAfH+Ii4V9dXWGeYeMfXN1dYJ5enqCi459foSJaXOWgXqKnX1+hXqBen98hohzcY+ujHt7h499ZXGHeXN8e3Vyb4Vse35sj3picG9iZV1lVllZVmNma2BdXHOFaFhwblpeV1pcbHticHd2bWJabHNzZ3R1cGyEeX6AeXdubnRlaXRlW2h1ZnZ2kXpfXVJmZmuDgnR9YmNpXFRYXWJjj6VoeHSChZB4bW96aHhufIV7dYlzgHh8eH9oZXZtYGZgXmpfXXNrWWVdb29iemVbd3trbm5vd3hzdGRyg5J+h4KIenZvcn1zYndkW29xYnFxgnxzZ3KAZV5udmlkZ3l7dW5vgnV0fXNxYl9mbm99ZGlTZ1hYVE13X1FKWVhIYnVkYUlUbVNKTFpXaWxye2JsbHNjYVlZW2F2W1NMY11YaVNXSFlhTkdpdVheYW1bW19iYl2FaGdhbnh5bG9qdoGQeG2CfoCBkoeDgXZ0iXSMhnNxd3WCd3x9foyPgH6TfnB3lYN8mZJ5gIB4eX5/dIiDc3CZont6f4mUeGR1iHhzd3VsdG9+bHl8cJFyXnBvYGdibFRbWldoY21mXFxxiWVTcm5bWlhYYGx2Y2l1amleWW1zcWxzc3NqhXx+f3x2bm5sZGlxY1trcmR0do5zW1dTZWFygH9ygl1iY15TWmBbY5GeZXJxhYSRdGxrem1vcHt8fHGBd39zenp6ZGV1aF1iWmBnW152aFdiXXBoYXdgW3t2aWlybndzcnRocIGUgoZ+hHZyanB9bWZ3V1xrbmJxc4F6c2dvfltgcHFhX2pxfmxsdX5zcXhrcGFcZWxsemFnU2ZUV1FPdVtRT1lSSGN0YmBGVWpQSVBaVWtra3xlbW9xYVtaWFlscFdTT2ZXV2hTVEZaXE9IcnRYX2NtY1hgYGFdi2pjZG15eGtvaXV5hntrg31/hJl8goR5fYhuj4Zxb3d6fXSCgnyKjoKCl3R3gpOFgZ+JdYCAgXN/gnGHgnVvopd0e4aLhntld4pubnpuZnhwemtzdnKMa150bmFnZWtSXVtVZ2FsbFpccIxkT29uXVZYVWdqdGdidGVlXVludG1wdXV5a4d8f3yIdo9zZGRrbmFcbm1jc3iHa1pUVmNkeH19cYVcY19jVFpgWWOVlWNucIOFinNqaHtvZnN3c3xsenR1b3p+dV5mcmNbXlZhZFlhdGVVX2BtZGFxXV1+b2hpc3FzcHR1am2EkoGIe4VxcmZufXByb1NbZmtmcXSBd3NjbHZVYnJrWl9vZn1mbXd9c3Nzam1gWmRqandeZlRkVFVQVG1XUVZTUEhkc19hRVhpTkhXVFZtaGR8aWt4a2JXXFVbdGRTUldoUVllVFNIWlpQTXh2Wl9lbGlZYmBeXo9uYWZseXVub2h2dn9/bIN/fYaXe3+HgYp+a5OIcmd0gHt1gIJ8iI5/i5NyfIqRhYefhnt/hoxzgYZzfYN2bqWMc4GNi3Z3bXqMYGR7cGZ6c3hsbXF2gmdke2xjZmdoU19eVWdfbG9bXm6NaE5pbWBUVlNvZ3NsZnhkZFxYcHRscXp4cm2Ie392nHp5a2FlbG1eYG9qZXF4fmdaVlhgbHh8e3CDX2JeZ1dYX1dkm4hia3GBh313a2t4bVx3cWx7anZzbm97gHJYam5fWV1VYmNYZHFiU15haGJibFpgfWtma3N1bm13dmtohYt+iHqIbXFlcH1tcm1jWWFpaW90gXRzX2lsU2VxZFVibmJ6Y3F3e3ZrcG1qX1hhZ2h0XGVVYVVSTlhlUk9cT09IZXBdY0ZZaU1JX0tYbWRfeGhufmRgVF5UXXVcVFNgZk5dYVRTSlxZUFl1dV1fZW1oWGNhW16OcWJnandxc25ndnR6g3KBgnmHjX58iYeOem6QinRsc4J0f3+HhIaRhJWPeX6Mj4eRm4SAfIyEcoCBc3R3cW6Tk5OTk5OTk5OTkpKSkpKSkpKSkpKSk5OTkpKSkpKSkpKSkpKSkZGRkJCPj4+Pj4+Ojo6Pj46OjY2Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2NjYyMjI2NjY2Njo6Ojo6OjY6OjY2Ojo6Oj4+Pjo2NjY2Oj4+Pj4+PjoKAfnp6fX5+fX1/fn59fn5+fn5+fn+Af4CAgIGAgIB/gIGBgYOHjI6Ojo6NjY2NjY2NjY2NjZKSkpOTkpKSkpKSkpKSkpGRkZGSkpKSkpKSkpKSkpKSkpKSkpGRkZCQkI+Pjo6Ojo6NjY6Ojo2NjY2Njo6Njo6OjY2NjY2Njo6Ojo6Ojo6NjYyMjY2MjIyNjY2Njo6Ojo6NjY2NjY2Njo6Ojo6OjY2NjY2Ojo6Ojo+Ogn99ent8fn59fX5+fn5+fn5+fn5+f4B/gICAgICAgH+BgYCBg4aMjY6NjY2NjY2NjIyMjIyMkpKSkpKSkpKSkpKSkpKSkZKSkpKSk5KSkpKRkZGRkZKSkpGRkZGQkJCQj4+Ojo6OjY2NjY2Njo6Ojo6NjY2NjY2NjY2NjY2NjY6Pj4+Pjo6NjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Njo6Ojo2NjY2NjY2NjY6Ojo6Cf3x6fHx9fn19fn19fX59fn5+fn5+gH9/gICBgYGAf4CAgICDhouOjo2NjY2NjIyMjIyMjIySkpOTk5KTk5KSkpKSkZGSkpKSkpKSkpGRkZGRkZGRkJCQkJGRkZCQkJCPj46Pjo6Ojo6Ojo6Ojo6Ojo2MjYyMjY2NjY2NjY2NjY+Pjo6OjY6MjIyMjIyMjIyMjY2NjY2NjY2NjY2NjY2Njo6NjY2MjIyNjY2Njo6OjoN/fHp8e31+fH1+fXx9fn59fn5+fn5/f3+BgYGAgICAgYCAgIOGi42NjY2NjIyMjIyMjIyMjJFtZmdnZ2dnfYWEhISEiF0tMDAwMC1GoaGhoaGhoJqZmpqampqKg4SEhIOEd2VnZmZmaFxDREREREJOpa+tra2trqSfoKCgoKVeKi8vLzAsSIWDg4ODg4OLjIyMjIyMjY2NjYyMjY2NjY2NjY2NjIyMjIyNjY2NjY2OhX19e3t6fX58fH59fX1+fX1+fn5+fn9/f4GBgYCAgICBgICAgoWKjI2MjIyMjIyMjIyMjIyMkWdfYGBgX155g4KCgoKGUxgdHR0dGTekpKSkpKSjnJycnJycnImBgoKBgYJyXV9fX19hUjQ1NTU1M0GptrS0tLS1qKOkpKSkqlYVHBwcHBc6g4GBgYGAgYqLi4yMjIyMjIyMjIyMjIyMjY2NjY2MjIyMjIyMjY2NjY2GfH16e3p8fXt8fn1+fX59fX5+fn5/f3+AgYCBgYGAgIGBgYGChYqNjYyMjIyMjIyMjIuLi4uRjo2NjY2NjY+QkJCQkJCMh4eHh4eHiZOTkpKSkpKRkZGRkZGRj46Ojo2NjYuJiYmJiYmIhYaFhYWFho+QkJCQkJGQj5CQj4+PiIKDg4KCgoWKioqKioqKi4uLi4uLi4uLjIyLi4yMjIyMjI2NjIyMjIyMjIyMjY2Njoh8f3l7ent8e319fX18fX19fX5+fn9/f4CBgYGBgYGAgYCAgYKFioyMjIyMjIyMjIuLi4uLi5GSkpKSko2QkpGJh46KkJKTkIqQi4uQiY+RkZGRkJCQkJCPj4+Pj4+Ojo6Njo6Ojo2Njo2Njo6Ojo6NjIuLjIyMjIyMjIyMjIyNjo6NjY2NjIuLi4uLiouLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyNjY2NiX59eHh5fH18fX19fHx9fX59fn5+f3+AgICBgYGBgYCBgIGCgoSKjIyMjIyMjIyLi4uLi4qLkJCRkZGPhI6QkIaKj4WNkJCOh4iFiYuGiJCQkJCQkJCQkI+Pj4+Ojo6NjY2NjYyMjIyMjIyMjIyMjIyMjIyMjI2NjIyMjIyMjIyMi4uLi4uLi4uLi4qKiouLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjI2Lfnx3dnh7fXx7fX18fH19fn5+fn5/f4CAgIGBgYGBgIGAgIGChIqMjIyMjIuLi4uLioqKioqQkJCQkIqFjoiOhoaPiY2QkI+GioaHh4WHj4+Pj4+Qj5CPj4+Ojo6OjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLi4uLi4qKioqKi4qKi4qKi4uKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIt+e3d2eHt8fHx9fX19fX1+fn5/fn9/f3+AgIGAgYGAgYCBgYGEiYyMi4uLi4uLioqKioqKipCQkJCPhYOMjpCOiYyJjZCQj4mIjoiEhoiPj4+Pj4+Pj4+Pjo6OjY2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKioqKioqLi4uKioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMin18dnZ4fHx7fH19fH19fn5+fn5+fn9/f4CAgYCBgYGBgIGAgYSJi4yLi4uLi4qKiomJiYmJkJCQkJCMhoyJjoeFjYmOi4yLhoeHhYiDio+Pjo+Pj4+Pjo6OjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKioqKioqKioqKi4uLioqKioqKioqLi4uLi4uLjIyMjIyMi4uMjIyKf353eHp7enp8fHx8fX1+fn5+fn9+fn9/gICAgICBgICAgYCBhIqMi4uLioqKioqJiYmJiYmPj4+Pj5CMjouPjIqPjI6MjY2JjYqKjomOj46Ojo6Ojo6Ojo6NjYyMjIyLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLjIiAfXh5enp6e318e3t9fn5+fn5/f35+f39/gICBgICAgIGBgIGEiouLioqKioqJiYmJiYmIiI+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Oj4+Oj46Ojo6Ojo6Ojo2NjYyMjIyLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLioqKi4uLh4B8eHp6eXt8fHt8fH1+fn5+fn9/fn9/f39/gIB/gYGAgIB/gYSJi4qKioqJiYmJiYmJiIiIj4+Pj4+Pj4+Pj46Pj4+Oj4+Ojo6Ojo6Ojo6OjY2NjY2NjY2MjIyMjIuLi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKiYmKioqKioqKioqKioqKioqKioqKi4uHgHt5eXh6fHx6e3t9fX5+fn5+f39+f39/f39/f3+BgYCAgH+BhIiLiomJiYmJiYmJiIiIiIiOjo6Ojo6Pj46MjI+Sj5COjo6Ojo6NjY2NjY2NjY2NjIyMjIyMjIuLi4uLioqKioqLi4uLi4uLi4uLi4uMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKiomKiomJiYqKioqKioqJiYmJioqKioqKioqKioqKioqKioqKi4aBe3h5eHp8ent7fH19fn5+fn5/f35/f39+fn9/f4CAgYCAgIGEiIqJiYmJiYmJiIiIiIeHh46Ojo6Ojo6Ojo+MkJOQkI+Ojo6NjY2NjY2NjYyMjIyMjIyMjIuLi4uLi4qKioqKioqKi4uLi4uLi4uLi4uLi4uMjIyLi4uLi4uLioqKioqKioqKiYmJiYmJiYmJiYmKioqKiomJiYmJiYmJiYqKioqKiomJioqKioqKhYB6eHl5fHt6ent8fH1+fn1+fn9/fX9/f35/f39/gICBgICAgYSIiomJiYiIiIiIiIeHh4eHjY2Ojo6Ojo6Pj4+PjoyNkI2NjY2NjY2MjIyMjIyMjIyMi4uLi4uLioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYmJiYmJiYmKioqJiYmJiYmJiYmJiYmKioqJiYmJiYmJioqFf3l6eXh7e3p7fHx7fn5+fX5+f39+f35/fn+Af3+AgICBgYCChIeKiYmIiIiIh4eHh4eHh4eNjY2Njo6Oi42Nj5WPiYyPjYyNjYyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYR+eXt5ent7eXt9fHt+fn59fn1+f35/fn9+f3+AgICAf4CAgICEh4mIiIiHh4eHh4eHh4aGhoyNjY2NjY+MjImKj42IjJGPjY2NjIyMjIyMjIyLi4uLi4uKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uKioqJiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJg355e3p8e3p7fX17fH9+fn5+fX5/fn9+f3+Af4CAgH+AgH9/f4OGiIiHh4eHh4aGhoaGhoaGjIyMjIyLiYyKiIeJhoyOjJCMjZGOjIyMi4uLi4uLi4uLi4qKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiImJiYmJiYmJiYmJiYmJiYmJiYmIiImJiYmJiYmJiYmJiYiIiIiIiYmCf3h7e3t6enx9fHx9f39+fn19fn9/f39/f4F/gIB/gICAgICAg4aIh4eHhoaGhoaGhoaGhoWMjIyMi4yOjoyKioeEiIuKjIuNjo+Li4uLi4uLi4uLi4uLioqKiomJiYmKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiomJiYmJiYiIiIiIiIiIiImJiYmJiYmJiYmJiIiIiIiIiYmIiIiIiIiIiIiIiIiIiIJ/eHp7enp6e3x8fX1+f35+fX1+f39/fn+AgICAf3+Af4CAgYCDhYiHh4aGhoaGhoaFhYWFhYyMjI2NjJCSjI2Ii4mJi4uLi4mLjIqMi4uLi4uLioqLi4qKiomJiYmJiYmJiYqKioqKioqKioqKioqKioqKioqKioqKiYqJioqJiYmJiYmIiIiIiIiIiIiIiImJiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIiIiIiIiIiHgXx4e3x5enp8fHx9fX9/fn59fX9/f39+fn+Af4B/f3+Af4CAgIKEh4eGhoaGhYWFhYWFhYWFjIyNkY+PjZGJjIaJjIuIiImMiYeNjo+NioqKioqKioqKiomJiYmJiYmJiYmJioqKioqKioqKioqKioqJioqKioqKiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4WAenl9e3t7enx8fHx9f39+fn19f39/f35+f4B/gH9/f4B/gH+AgoSHhoaGhYWFhYWFhYWFhISLi46PjoyLj4iHiYmMjYWFjo2KiYyNi46KioqKiomJiYmJiYmJiYmJiYmJiYmJiYmKioqKioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHhoaHh4eHhH55eX16enp7fXt8fX5+f35+fX5/f39/fX5/f3+Af39/f39/f4CChIaFhoWFhYWFhYWFhISEhIuLjI6MjI2Lh4mIiomGgoiNjoiKi5GTj4uJiYmJiYmJiYmJiYmIiYmJiYmJiYmJiYmKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIeHh4eHh4eIiIiIiIiIiIiIh4eHh4eHhoaGh4aGhoaGhoaGh4eDfXp5e3p5enx8e31+fn5/fn59fn9/fn9+fn+AgICAf35/f39/gIKEhoWFhYWFhISEhISEhISEioqOjYmIiIqKh4iHiomIioiIh4qGi5GPiomJiYmJiYiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHh4iIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGh4J8eXl6eXp7e3t7fX5+fn5+fn59gH9/f39/f4CAgH9/fn9/gICAgoSGhYWFhISEhISEhISEhISKi5CPiYmJi4qHh4WHiYuKiYSLjYmOjYqJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiIiIiImJiYmJiYiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGgXt4enp4e3x7e3x+fn9+fn5+fX1/f39/f3+Af4B/f39/f3+Af4CChIaFhYSEhISEhISEhISEhI+Qj4+IiYuIhoeIiYuLjIuJioqNio6Oj4iJiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoaAe3h5eXh4enp8fX1+f35+fn59fn9/f39/gIB/gICAf39/gIB/gYKDhoiGiIaDhISEhIODg4ODkpKOioeKi4qLh4uNiYqJi4iHiouIio+SioiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhn96eXh4eHl5eXx9fn5/fn5/fn1+f35/f3+Af39/f4CAgH+AgH+BgoOHjo+PjoiHhIWFhoaFhYWSkI6KiYmIiImKioiIh4aKjIiHiYmOkJGNh4iIiIiIiIiIiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4aGh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWGf3l4d3d3eXp5e3x9fn9+f35+fn5+f35+fn+Af4CAgICAf3+Af4GBg4eOjo6Ojo6Mjo2OjY2MjZCQjomHhoiJiYeIiouIiYyJiYaKjY6PkYuIiIiIiIeHh4eIiIiIiIiHh4eHh4iIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhYZ+eXd5d3d6eXl8e31/fn5/fn5+fn5+fn9+f4B/fn+Af39/f39+gIGEiI6Ojo6Ojo6Ojo6Ojo2NkJGOi42JjIiIiYaHiYaIioiHi4yLjpCQiIeIiYmJiIeHh4iIiYmIh4eHh4iIiYiIiIiIh4iIiIiHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhoaFhYaGhoWGhYSEhIWFhoaFhIWFhX55d3l2eHl4e3x7fn5+fn5+fn5+fn5+f39+f39+f39/f35/f3+AgYOGjY2Ojo6OjY6NjY6OjY2Qj42Ni46KhoiKhISLiYeDhYSDi4mLj42JjI6QkI+NjYyLjY6Pj42NjI2Nj4+Pjo6MjYyMjY2KiYiHiImHh4aHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoeHiYqKiIeJi4yNjo2LiImLi42OjYyJiImMgHl3d3Z6eXh7e3t9fn5+fn5+fn5+fn5/f39+fn5/f4B/f4B/f4CBg4aMjY2NjY2NjY2Qj4+Pj46NjI6KiYuMjIeFiY2Lh4aIh4aHh4uNjo6Pj4+Pjo+Pj4+Pj4+Pj4+Pj4+Ojo+Pj4+Pj4+Pj4+Oj46Oj46Mi4uJh4eHh4aIhoaGhoaGhoaGhoeLiYeHiIiLjY2Mi4yLjY2Ojo+Ojo6Pj46Ojo6Ojo6Ojo6Njo6NjY2AeHZ4eHp4enx6fH5+fn5+fn5+fn5+f39/fn59fn9/f39/gH9/gIGDhoyMjIyMjY+QkpOTk5KSjYyMjIqHioyKh4eJiYWCiouIiYWJjpCNjo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjI2NjI2LiYaHh4eHiYqLjY6NjYyNjY6OjY2OjY2NjY2NjY2NjY2NjY2OjIyNj4+OjY2MjIyLi313dXd5enp7e3p+fn5+fn5+f35+fn5/f39+fn1+f39/gICAf3+AgYOFj5KRkJGSk5OTk5OTkpKLi4uLiomMiouLiYuKhoeOjYiIjI6OjIuMjIyNj46Njo6Ojo2NjY2MjY2NjIyMjIyMjIyMjY2NjYyMjI2NjYyMjI2NjIyNjIyMi4yMi4yMjI2MjIyMjIyMjIyMjIyLi4uLi4yNjY6Sk5OSkpSRkJOVlZSTk5COjo6Oe3Z2d3h6ent7e31+fn5+fn5/fn5+fn5/f35+fn9/f39/gIB/f4CBgoSNkpKTkpOSkpOTkZKSkoqJioyJi4qJjIuKioiHiYqKi4mKjY2Mj46Nj5KUlJOUlJOTkpGSkI+Ojo2NjY2Pko+OkZGOjIuKioqLi4qKi5CPjoyMjIqKioqKioqKiouKioqKi4yLi4uMjIyKiouLi46RkpOTk5SUk5STk5SUlJOTk5KSkpKSk5F6dXZ2eHt7e3p6fX5+fn5+fn5+fn5+fX5/fn5+f39/f3+Af39/gIGChIuRkZGRkZKSkpGRkpGRiYmIiIqMiYiJiYuJhoSJhoyKh4ySkpKTk5OUlZWWlZWUk5OUlJSUk5SUlJSVlZWVlZWUlJOTkY+QkZKQjoyRlZWVk5KSjo+QjYqKi4qKi42OjY6RkpCRkpKSkpGRkpKSk5OTk5OTk5OTk5OTkpOSkpKSkpKSkpKSj3h1d3l6e3t7ent9fX19fn5/f35+fX5+fn5+f39/f39/f4B/f3+AgYKEi5GQkJCSkpKRkZGRkZGIiIiIi4uJg4eLi4yMiIeHjYyNkpSSkpOTlJWWlpaVlZSSkpOTlJSUlJWVlZaXlpaWlpWUk5SUlJSVlJSUk5OVlZWUk5KTk5OTkJGSkZGSk5OTk5KSkpOSkpKSkpKSkpKSkpKSk5OTk5SUk5OSkpOTkpKSkpGRkZGPdnJ3enp7e3t8fX59fX1+fn9+fn9+fn5+fn6Af39/f3+Af3+Af4CBgoSKkJCRkZGRkZCQkJCQkIeHh4eIiIiFi4+KjI6Njo+OkJWUk5OTk5SUlZWVlJSVk5KSk5KTlZSUlZaWlpaWlpaWlpSTk5OTk5OUlJOSk5SVlZSTkpKSkpOTk5OTk5OTk5KSkpKSkpKSkpGSkpGRkZGRkZKTlJSUlJSTkpGRkZGRkZGRkZGRkYx0c3d6ent7e3x9fX1+fX5+f35+fn5+fn5+fn9/f39/fn9/f39/f4GDhIqQkJGRkJCQj4+Pj4+Ph4iKi4yNjYuOj42Mjo6RkpGSk5OSkpKSk5SUlJKSk5OTk5OSkpOUk5OTk5WVlZWUlZWUk5OTk5KSk5OUk5KTlJSUk5KSkpKSk5OTkpKSkpKRkZKSkpKSkpKSkpKSkZKRkZGSkpOTlJSUk5OSkZGRkZGQkJCQkZCRinN0dnp8fHp7fXx9fn59f35/f35+fn9+f31+f39+fn59f39/gH+AgYKDipCQkZGQj5CPjo+Pjo+Oj4+Pj4+Pj4+PkI2OjpCRkpKSkpKRkpKTk5OTkpGSkpKRkZKSk5OSk5OSk5STk5OTlJOSk5OTk5OTk5OSk5OTkpKSkpKSkpKSkpGRkZGSkZCRkZGRkpKRkZGRkpGRkZGRkpKSkpKSkpKSkpKRkJCQkJCQkJCQkJGGc3V2e3x8e3x9fX1+fn1/f35/fn5/gH9+fX5/fX5/fn5/f3+Af3+BgYGKkI+PkI+Pj4+Pj4+Pj4+Oj46Oj4+Pj5CQiI2PkJGRkpKSkpOTk5OTkpKSk5KSkZGRkZKSk5KTkpGRkpKSkZKSkpKSkpKTk5KRkZKTkpGRkpKSkpKRkJCQkJGRkZGQkJGSkZGRkZGSkZGRkZGRkZGSkpKSkpKSkZCRkZCPj4+Pj4+Pj4+PkX9ydHh8fHx7fHx9fX5+fn9+fn5/f3+AgH99fn5+f39+f39/f4CAf4GBgYqPj4+Pjo6Ojo+Pj46Ojo6Ojo+PkI+Pj4+GjpCQkJCRkZGRkZGRkZGQkJCQkZGRkZGRkZGRkZGQkJCRkZCQkJGRkZGRkZGRkJCQkZGQkJGRkZGRkI+PkJCQkJGRkJCQkJCRkJCQkJCQkZCQkJCQkJCQkZCQkJCPj4+Pjo+Pj46Ojo+Pj4+PeHJ2eXx9fHp9fH19fn5+f35+f39/f4CAf39/fn5/f35/f39/gIB/gYGAio6Ojo6NjY2Ojo6Ojo6NjY2Oj4+Pj4+PjoiQkZCPj4+QkJCQkJCQkI+PkJCQj4+Pj5CQkJCQkJCPj4+PkI+PkJCQkJCQj4+Oj4+QkI+PkJCQkJCPjo+QkJCPj4+Pj4+PkJCQkI+PkI+Qj4+PkI+PkJCQkI+OkI+Pj46OjoyMjY2NjIqDiYhzc3Z4fX58eX18fX1+fn5/fX5/fn9/f39/f4B/f39/f4CAgH+AgH+BgYCJjY2Ojo6Ojo6OjY2OjoyNjY6Ojo6Ojo2NiJCRkI6Njo6Ojo6Ojo6Pjo6Ojo6Ojo6Pjo6Ojo6Ojo6OjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Pj46Oj4+Pj4+Pj4+Pjo+PjY2MjYyNjoyLi4mJiYiFhYSDgoKEgnR5fXp4dXJrZWltb2xmZmdncHNzd3l9fnl6e3x9fX1+fn59fn9/fn9/f39/gIB/f3+AgIGAgIB/f4CBgImNjY2NjY2MjYyMjIyMi4uLjYyMjIyMjIyGj5GRjIyMjIyMjIyMjIyMjIyMjIyNjY2MjIyMjYyMjY2MjIyNjY2NjYyMjI2MiomKi4uJh4KAh4iEgXt6gH57fXx8fXlzcnJycnV1cG1ramppZ2NkYV9bXF1eWFVXWFlTS0VJSkpLTE1PT0tgdHR3eX19eHp5e3x8fX5+fn1+f39+f35/f4CAgH+AgICBgYCAgICAgIGAf4OEhYSFiIuLjYyMjIuLi4yGiYqKioqKh4OOkJGNiouLi4uMiYmKioqKiouLi4eDi4qIiYmGhYWEhIeJiYWCg397fHl6e3pzcHFxcW1samdsbWdlZmVmZGNlZGVkZWVlZWRkZGNhYV5dXFpYWFdUUFFSU1JTTU1KSUZESEpHR0hHR0xOSWdzdXh5fXp4d3l8fHx8fn5+fn9/fn9/f39+f4CAgIB/gICBgICAgICBgYFnXmBjYWNucX17ent/fXd8fHZ4ent4eHpvcHt4eXt8e3h3e394dXd0dHZ0dXZ3dXFycW5wcnBnaGtsbm9tamlpaGhlZWRkZF9gYWJgYF5dWVhaWltdXV9gX2BfX19gYmFeXl5eWVldXF1bV1dWUlRSU1NOUUpISUZERUhMTEhGR0lLSklNbXJ0eHp7end3eXt6e3x+fn1+f39+f35/f35+gIGAf3+AgIGAgICAgICCgWdYW1pZXFtcY1xaXF5ga3FtcHBvbm5vbmtpbmxrbG9qaWtraWpraWdmZ2dnaGhnbWdqZ2hlaGdjY2JhYmBgXVhbW1dYV1RWUVBUU1NNSkxLTExOTk9UWFhXVVVUUlBQTU1QT05LTE1QUU9MTEpHSUlHSEhJSEhIR0ZHSEpKSEhISUlISVZwc3V5ent5dnZ5enp7fH59fX5/f35/fn5+f3+AgX9+f4B/gICAgICAgIGBbFtYVlZWWVlaWVlYVVZoamxubmxra2poaGloZGVkYlxiZl9fYGNfXF9dYF1eWl5dWVleYmFeXlpZX1xYV1NOTUxLS0tMSUtNTktKS0tMSktQTEtLRkdHSUlGR0lISUZFSEdGRkVERUVEREVJSUlHSEdIRkZLTUtJSUlIR0hLTU1LTExMVXFzdnl6e3h2d3h3ent8fn1+fn9/f39+f3+AgIGAfn5/f4CAf4CAgIB/gYJoUlRVVlNVV1lZWVdXV1tbYWNfXlxbWFZWWVZSVFJRUVVUU1NTUE1KTU5QUk9NUFFRUVFSVlZRUVFUUFBOTk9MSk1MS0xKSktLRklJSkxJR0pISUlFR0dGRkVFSElKR0ZHRkZHR0hKR0dISEpMSkpLSUlISktLSkhKS0pISUtMTU9QUEtUdHR1eHp6eHZ2d3d6enx+fX5+fn5/f35+fn+AgYB/f3+AgYB/gICAgH+AgmlQUlRXVVRWWVdYWFpbVFRTUlBRU1FRUU9OTlBQUU9MTlBPTk5NTEtNTk5QTU9QUFJRUE5OT05PTk9PUFFPTk5PTk5QTk1NS0lISEpJSUlJR0ZHR0dJSkhJSEhJSEhHSEdISElISUxLSklISkpJSkpIR0pMS0pJSUhKSktMTk1NTU9RTFVzcnN3enl3dnR2eHp7fX19fn5+fn9+fn5+gICBgICAf4GBgH+AgICAgICBbE9PTlRZVVVdW1lXV1hOTUpKSUZKT0xKSkdJSk1NS0pMTUpHSUlJSktMRkRGSktLS0hKTExMT01MTE5PT09NTk9MTk5OUFBPTE1MTk1MTEpJSEdJSElISElJS0xLS0pJS0pJSklJSUlJR0dKSUdJSUpKTk1OTEhJSklJSk1PT01MT1JOWXBwcnd4d3d0c3R3enx+fX5+fn5+fn5+fn9/gICAgICAgYCAf39/gICAgIFvS0pNTlFOTlVXVlZSU0lFQ0VFUkREQT5CP0RAQD5CREFAQURHRkVIRUJBQEBDQ0RFQUNFSEtPS0lJSkhHSklKSUlLSkxQTk1MTU1MTU1NTElIREZGR0ZGRklKSUlLSkhMSklKSkpJSEhKS0tIRkdJSklLTU5OSktPTUxLTU1PUE5QT1BgcG9yd3h2dHJzdXd6fX19fn5+fn9+fn1/gICAgICAf4CAgIB/f3+AgICAgXNQUE5OUE1KS1BSUE5RQ0RCQUZRRT1DPT9FSDk6Oz0/PTxBRUA+Ojs+PjxFRD0/RUE/QEFAREVHR0dHQkRERUZFR0dHR0pHSEpLR0NER0pHQ0RFQUFDR0hHSEdISktKSElMS0lISktLTU5MTUxMSkpMS0lLTU9PUFNRT1BQTk9QUlFNUGdwb3N2dXRycXR4eX19fX1+fn5+f4B+foCAgH9/gIB/f4CAgH+Af4B/gICCdlRVUVFQT0xNUFBOT09BQkFAQkE/Oz48Pj8/Ozg5ODs7OkA7Oz48Ozw8PEhMPT1BQT9CQz1BRERGQkZGREdJSEM/QEBAQUFCQUE/Pjw9PkFAQD8+P0BFR0dHSUtMTk1OTUxNTUpLTVBVU05MTlFOTk1OTE1NTk9OTk1LS05OTk1OTkxUbnBwcnR0c3Fydnl5fX19fn1+fn5/gH5+gICAgICAgH9/gICAgH9/gH+BgIJ4UVFSVFJTUVNTUVFST0BAPT4/PD8+QEE/PT45Ozo7Ozk5Ojg4Oz06Nzo8PD49Ozs6ODpAQEFCP0E/Q0ZEQkNDPzs+PkBDQ0E/Pj9BPkBAQj9APD9CQEFDRUVFSktQT1BPTU1OTExMT1JRUFJOTExPTUtOT0xMTEtMS0tKS0tKTU1LS1xxcXF1c3VzcXR4eHp9fn1+fn5+f39/fn5/gIGAgH+Af4CAgICAf4CAf4CAgXxSTU9RUFFSUlRSU1NOPDs8Ozs7P0BBQkA9PDk8PTw6Nzk6Ojk4OTtLOzk6OTo7Ozg3ODk7Ojg8Oz1AQUA9Ozs+PD09QEJDQT9BQkE9Pj09Oz0/Q0RCQD9BREJFR0pKSkpKTE1MTExNTExOVVNLTE1USVBKSU1KSUpLS0pJSEdKS0lKZnJxc3RzdXJydnl5e31+fn5+fX9+f39/f36AgICAf4CAgICAgIF/gIGAgYCBgFZMTlBQTlJRUFBRUU44PT88PDo9PkFAQT8+PkA/Pj48PT0+Pj06TXpSOj09PTw8PDw7Ozo7PD49Pj8/QUA+P0E/QEBBQEBAPT8/PTw6Oz09PD9AQUJCQUBCREZGRkdGR0dISUtMTExLTEtKS0lKSk1MTEpMS0lISUxMS0lJSElLR01tcHF1dXR1c3V4eXl8fX5+fn5+fn5/gH9+gIB/f39/gH+AgYCAgYCBgICBgYCCYUtPT05OT1BPT1BQTzo8Pjw9Oz8+PkFBPz0/Q0NEQT8+PUBIR0Beemk9PkNFPz9APTs9PT08Ozo9PkFBPz5AQD9BPz89PD48PTs7PD0+QUA/QD5AQ0NEQkRFSEVFR0hISEdGSUpJSUlJSUhKSkpKTEtKSklJSEhKS0tMS0lLSkpIVnBvcXNzdHR1eXp7e3x+f35+fn5+f39/f39/f3+Af4CAgICAf4GBgICAgIGBgIJtTFBRTk9QTk5PUFBPPjw8PT4/P0A+QEA/Pz9DRURIPztAY3x7dXN4bDk5PDk9PUA9Ojw7Ozw7ODk7Pz49PD07PEA9PTw8Pjs9PD0+QUBCQUBAP0JEQ0RFRkZGQ0VHSElJSEhJS0tMTUpKSUpNTUpLSktJSEhISEpJSktKSk5MSUlfcHFycnJ0dXZ6e319fX5/fn5+fn5/f35/f36AgIB/gICAgICAgYGAgICAgIGAgnZNTk5NTk5MTE5QTkw+QTw8PT8+QkM/P0FBQUJARXNiP2uFhISEgXlsOzk4ODo7PT8/PDs7PDs6Ojs+Pz89PDg6Pjw9Pj89Oz4/QEJDQkJDQ0FCQkFCQkRCQkRCRENGSUdGRkhJSUtNSklKSktMSkpJSkVESUlGRkhISkpKTEpGRmdwb3FxdHZ1d3t8fX18fn59fX1+fn9/foB+fn+AgH+AgICAgICBgYCAgICAgICBek5JS0tMTExFSUxOTTw/PDw9PkBAQUE7QkNCQz9NdHptgICDgXuDfnBAPT0/Pj0+Q0Q/PDw9Pj89PT5BQ0A8OTtBPz4+QT07P0JAQkNCQENDQUNBPT0+QD0/QUFBQENFRUBAQ0JDR0dFRENGRUZGR0VEQEFHR0ZDRkRHSEpHQz5IbW9wcHF0dXZ5fHx8fHx+fn1+fn5+fn5+f36Af3+AgICAgICAgIGAf4CAf4CBgIF+UUhLTU1NS0pLTE9RQD8+PkFBQEBBR0FCRENFQE5zdYB+e4ODfISEaEFBQENAQD9AQD49PD1BRUFCQkZIQz08QERDQUE/Pj1AQT4+Pj88PkBER0VAPkBBP0BDRkVDQkNDQEJEREJERUFCPkFCQkFCQEA9QUJDRENDQUNFR0E/PVZwcHFwcnV1d3p8e3t8fX9+fX19fX1+fX5+fn9/foB/f4CAgICAgYCAgIB/gIGAgX5SSEtNTUxLS05OUlVEQkBDQ0FBQkBCQ0BAQUFASXJzf359hIWFhYZdPkNDRUA/P05hX0pAQ0VJSUlJTU1LRUNGR0hFR0VFRUREQ0E/QD4+QkZKSkdFRUdGRkpOTktKSUdHSEtNSkdHQ0REREVEQUJCQ0BDREVEREVERUZDQkFEZW9wcXF0dnV4e3x6fHx+f319fX19fn59f4B/f39/f39+gIGBf4CBgICAgH+AgICAfVJJSUpKSEpKTE9SU0dGRUdIREdIREA+PDs+QEVEZnaAhIWFhYeHiYJKREVEQ1d1homKflhHSEpMTE1PT0xIR0hHSElJSEhHR0hIRUNFRUVFRkhKSkZFR0lKTU9PTU1LSktKTU5LSUhHSElIR0ZFRkZGREZIR0VFSEhGSEdIRlFubnBxcnZ2eXt7e3p9fX5/fX19fX1+fn1/f39/fn5/gH+BgYGAgICAgICAf4GBgIB8UEhHSElGR0lKTU5OSkxJSUpLTE5KRkNBQkNGSkdZeYKFh4SBhomJjGFAQlV0h4mHh4aHgldJTE1MTU5MSkdHR0dER0dHR0ZIRkhFQ0RERkVEREhIQ0NDR0pKS0xMTExMTElKS0pKSUlJSEpISEdISUhHR0hGRkZISklJSUlIXW9vcXJzd3d6e3t6e319fn59fX19fX5+fYB/f39+fn+BgIGAgYCAgICAgIB/gYCAgHxNR0ZIRkVGR0dKS0pMTUxLTU5NT0tJSEhKS0tMTExghIeIg4GDh4iJe1dshIeGhoaHh4eHfFBLTEtIR0ZGREVDQ0BBQ0NDQ0ZGRUJAPj5AQUFAQkQ/Pj9ERkhERUdJS0lJR0hJR0lJSkpJSEZKSkpKSUpJSkpKRklMTEpKS0tmb3BzcnR2eHl7e3t8fH1+fn19fX19fn59f39/f35/f4CAgICAgYCAgIGAgICAgICAfU9GRkdGR0hHRUZHR01NTUtMS0lHQ0NDRElLS0xMSWSHh4WBg4WAgYGDhIaFhISFhoaHh4aKdUlJRkI/P0A/Pz88PDw+Ojo8QUFAPjw5OTg8PD07Pjs5Oz9BQkFBQ0NDQEFCRERCQ0ZISUhISExNTEdJSk1NTk1KSktLSkxNU2xvcXRzc3d5e3t7fH19fn9+fX19fX1+fn5/foB/fn9/gICBgIGBgICAgYCAgIB/f39+UUZFRkdJSUdEQ0VGTk1MSklIRT85Oj5ARUhISkpKbIeGgn+Dg4GBg4ODhIWFhoeIiIiJiYyOZkJCPTg4Ojo5ODc4ODk2NDc5Ozw6ODU2Nzc4OTc4NzY4OTs7PD5AOzk5OT09Pjw8PUFERUhKTUxMR0lIT1JRUFBOTE1NT1Fdb3BydHN1eHp7e3x8fn5+f359fX59fX5+f39/gH9/f4CAgICAgYCAgICAgICAgIB/f39RR0ZHSEpIRkVGR0hMTEpJSUdDQjU2OjxDQENHSUlphYGAfoCChISEg4OEhomKi4yLiomKi4yJVDs4NjU2NzY2NjQ1NzYzNDY4Ojg3NjU2NTY3Njc3ODo3Nzc4OTs3NTg5OTg5ODc2OjxAR0ZJRklGRUZPU1JTU1JPUFBSVGVwcXN0dHd5e3t7fH1+fn5/fn19fX19f39/f3+Afn+AgICAgICBgICAgICAgICAgH9/flJISEhJS0lHSUpJSkpLREVIRUJANTc4OD06PUVDRXWFf4CBg4ODg4ODhYmKiomJioqKiouJiYqBSDY3NjQ2ODg3NDU3ODQ2NzY5OTc2Njc2NTo5Ojo6PDg5ODk3Nzc3OTo5ODg3ODU4OTtBPT4+QkE/QUtMT1FQUU9PT1JXa3JydHR1d3l7e3t8fX5/fn9+fX19fX5/f4B+fn9/f4CAgH9/gICAgICAgH+AgICAf39+VEhHSUlMTUtKS0tMSUg/QEFAPDo1Nzk4OTc7QjlHgYOAg4SFhISEhIaJioqIh4iIiIqKjIqJiYx6Pjo4ODs8PT45Ojs8ODk7OTo7Ojk5Ozo5PT09Pzs7Oz06Pjs5Ozs8Ozw8OTs8ODo6Ozo5OTk8Pzw9QUJESUpNS0pMTFdvcnN1dHZ4e3t7fHt9f39+f359fX19fn9/f35/f39/f3+Bf4CAgICAgICAf4CAgH+Af35URkVGSUxOTkxKSk1CPzo7PDs4OTk4OTo6Ojs/PFaGg4KDhYaFhYaIiYiHhoaGiImIiYuMi4mKioxsPDs+QkNFRUFBQUI+QEJAQD89Pj5APz4/QD9APT0/Qj9BQT9BPz1AQEA/P0E9Pjw7Ojs6OTs/PTs7PT1BQUNBQkNBWHFxdHR0dnl7e3x9e31/fn9/fn19fX5+f35+fn9+f4B/f4CAgIB/gIGAf39/gICAf39/flJFQ0FHSk5PTElHSzo4Ojs5Ojo8PTo7Oz09P0BCYIeDg4WGhYWEhomJiIiGhoaHiImKi4uKioqLiotePkRHSUtKSUZHR0RGSEdFQ0BAQ0VDQkBCQ0I/QERIRUNFREVFQUZFRkVGRkRAQj89QD49P0A+Pz8/Pj8+Pjo7PTxgcXJ0dHV3enp6fX19fn5+f39+fX19fX5/fn5+fn5/gH9/gICAgICAgICAf4CAgIB/f4B+UERAPUNIT01HRkJEOTc6Pjo8Oz4/Pz89QUBEREVkiIODhYWGhoaIiYmIh4aGhoeJioqLjI2MjIuKiohXSExNTUtOSklLSElKSklFQ0RGR0ZEQ0VGREJISUtIR0dGR0dFS0lLSUpLSkNGQ0NEQkFBQ0JEQ0NERENBPTs9QGhwc3R0d3d6eHt8fH19fn5/f359fX1+fn9+fn59fn+Af3+AgH9/gICAgICAgICAgH+AgH9PQT49P0RMS0BCQkE5ODw+Ozw7PkBAQT9CQ0hISmCGgoOFhYeHiImJiIiHhoaGiIiIiYqMjYyMi4uKjH9QTVBNS05LSkxJSUlISkZER0hISUVFSEZGRUxMTUlKR0dISUpPTU5MTE5LSEZHR0VFQ0ZGRkZERUhIRkNBP0BMbHB0dXZ4eXl5fHx8fX1+fn9+fn19fX1/f35+fn5+f39/f39/f3+AgICAgIB/gICAgICAf1FBPz4/RkdHPTxAQDk4PDs8PTo/QD5AQENGSkpQaIODhYSFhoeHiIiIiIiIh4eIiIiJioyNjIyMjIuKjXFNUU9NTExLTEpIR0VKSURKSEdMSkhKR0dHS0xOTExISElKTVBOUE5NT0tJR0lKSElESUhIRkZHR0lGQ0JBQ1VucXV2d3l7eHl6enx8fX5+f39+fn1+fX5+fn5/f36Af39/f3+Af4CAgICAgICAgICAf39/VERBQUJHSEI/OD9AOTo8OD0+Oz1BPj9ARUlLTVZzg4OEhIWFhoeIiIiIiIeGiIiIiImJjIyLjIyMi4uLi15RUVBNTk1LSkdGQ0dKR0xKR0tPTEtKSk1NTE9QTkhJS0xPUVFQUU9PSklKSkxKTEZHSEdGR0lGRUVCQEJCXG9yd3h5enl5eXp6e3t+fn5/fn59fX19fn9+fn9+f4CAgIB/f39/gICAgICAgICAgH9/f39VRUNFRUdHRUQ7P0E7PTw5QD4+QEJHR0FITE1RV3mFg4ODhISGiIiIiIiIh4eIiIiIiIqLi4uMjIyMi4uNfFdVUlJUUk9MS0pFRUZLT05PV1ZRUE9RU1JNU1RPTVNMUFNVV1JTUVBMS01NTUtOR0dKRkZISkRERUVCRENjcHV5eXp6ent6e3p7fH59fX9+fX19fXx9fn5/gH9/gICAf39/f3+BgYCAf39/gIB/f39/f1VGRkdHR0dIRj5AQj0/PT1CP0JDRlZORk9RUVVZfIaDhYWEhIeIiIiIiIiIiIiIiIiJiouKioyMjIyOi4uLZ1ZWa2FFUlFRUEo7OlFTUmB1XVVWVFZZWVJYWFJaZlBVV1pdUlRXUVBOUlBQUFFLS0tHSElIRUZJSElISWpydnl5enl6e3t8ent8fXx9f359fX19fX1+f39/f3+AgIB/f39/gICAgIB/f3+AgH9/f35+VEhKSUlHR0ZFPz9BQUVCQ0dFREVMWFJNVFZWWFt8hoWHhoWGh4iIiIiIiIiIiIiIiIiIlJyMioqMfWGKi4uHbFtkVTpYWFhTUD5AVlVZXGRgVllicl5dVl1aVkVRWVpbWV9UWWdSVVZYVVRWVE9PTUpMSklJTE1LT01UcHR2eHl4d3p6ent6e3x9fH5/fn1+fX19fn1/f39+f4CAgH9/f3+AgICAgH9/gH+Af39+fn5WSkpJSEdGRERCQT9ITUlNUEtJS1BUU1NYWlpcXHiFhIWFhYWGh4eHiIiIiIiIiIiIiImcnaCPiY5nO36MiYqLem5wWFpbWlJTUlZWVFpadYNZVX2QYVxYXV5XSVZdXVtbX1lIWVhZXF1ZWFlXUlFNUFFNTU9TUVFVUmJ0c3Z3d3Z4eHh6e3t8fX19f39+fX59fX1+fn9/gH9/gIB/f3+Af4CAgICAf39/gIB/gHh5fVlOS0lJSUZCREBBOlBRUVdYUFBPUVNUVFhYWVpbboGCg4WEhYaHh4eHh4iIiIiIiIiIiJaanJeIioFuhomIh4OKfmZZWVxYU1ZUV1JRV1ZjloBRZXJYWldfaFBgZlpbWFxoYkdPWmlnXFtcXV1XU05TUFBRVlZWVllab3N0d3Z2dHd4eHt7fH19fX5/fn59fn18fn9/f3+Af39/gH+AgH9/gICBgYB/gH1yfX9/b3R8XVNQT01LSkVDP0A7UFBaWltSU1FPUlJSVVNWVFdfdXiAhYSEhYaGhoaHh4eHiIiIh4eIh4ORjomJiIaFiIiGfYB7XFBWWFRSVFJRUUxPTUtmeVpdVFlVVl1aTFRaVVNUXlpYV1dXemtYWlxcXlNQUFBJTk9XVlhaWmRxdHZ2dHR2eHl5e3t8fH19fn99fX1+fX1+f39/gIB/f3+Afn56eHd2c3V7f3+AgHRrfn5rcnleW1ZVU1JPS0ZDREFNXoNsVlJTTk9RT1FVUlNSUlRjZHaAgoKDhISEhIWFhISDhoaGhoeIhn6JiYiHhoOHh4d5bXFWSUtOTktNS0hKREZIRUM+U2NVf1JRUU5LUlRSTU9ZUU1OUVNVVU1RU1JQTkxMSENJSFJUVVpcbXJ2dnVzc3d7ent7e317fX19fn19fX59fn9/f3+AgH99fX5+f39/f4B+e3Zzd31+fmR1fWlxdF9kXV5bWVVRTElMSWFsknRQUVNOUVJRUltSU1JRUlVVYnN7fH+AgYKBgX99e3uAf4OChYaHgoaGhoGEgYaFhnVfXUtDPkNDQ0NCP0RQQkRAQz5CSEdWQEhOTUddaVBIRk9GREVGSEdIQkNIR0hKR0NCQURAT1BNUmRzdXZ1c3R1enx6e3t7fHx9fHt+fX19fn5/f3+AgIB/f3x8fX+Af39/f4CBgH12dHt/bWh8Z25xZmllZWJcWFNRUFVSc1dlW09PTkxRU1FVWVNVUVFUUk9WYGtscnZ7e3h5dHJuc3RzeXh+foOAg4OCgIKAgoGBa0xHPj46Oz5AQD8/PmtRS2FFRkhJRUI/R0xNR01RVUlCRT8+PD08PT0/PT9BQ0I/Pjw9Qj5KTUZVbnV1dXN0dnh7fHp9fHx9fX19fH59fXx+fn9/f4B/f39/enl3eHd2dnh7foB+fXt4dnx1YXhnbHBqbGppZmBbUVFaXFleSUpQUU5LTFFSUVRVVVdRUVdWUFhbYl1hZ21tbG9raGBucmptbHF1e3p9enh6fHx4d3hkQkBAQT06QkNBQURCXF1Pe05PT05LTE1PT1FMS0xXTkhHQEI8OTc3NTk5PTs7Ozg5ODk/O0FHPlx0dXV2dXZ3eXx8fH18fH19fn58fX19fX9/f39/fn9/f314dXd6e3p3eXh1d3t8eXh1eXdjcWhpcG1ubW1oZl5PUF5cWklHUFJRT01QUU5RUlRWWFNSWVROWVpbV1ldXl5gZWBdXnF2a15gZ2t3b29sam9ubmxmYllHRkZIQkFGSUVFRkRNUlBhV1JYUVBTU1JVW09PUVZQTUlDRj46OjY0ODY5Nzk6MzY2Nzk2PEI9ZnR1dnd3eXl7fX18fHt8fX5+fnt9fn19f39/fn5+fn9/e3d1eX18enh8fHx8dHd2d3Z1d2tuaWhxbm9vb2prYFVXXlpXTUxUVFNRUVVPTFJTVFdYVFRYUkxYWVpWWFhWWFldV1dYaHNrXVZgdGthYV9dZGBfXllVUE1PTkxJR0pLSUhGQ1FQU1pXVFRNUVNZU1xlVU9TVFFOTElIQz9BOTk4ODk3ODg0NzU3ODU4OEducnV4eHp7e31+fX18e318fn5+en1+fH1/f359fn59f358dHR1e3hycW9vbnR4cXJzeHZ1cWZkZ3JucHBxbm1kXV9fWVdPUFhWVlNUVk9PVVZYWFlTVVRMS1RVVVVVV1BUVVdUVVJdbl5STllgW1ZZO0RVV1RbZkpMUFJST01NTk5OTEpGUFBVWVNUTkpPT1RTVFxWUlVTUk5NTElISEY/Pz06Nzg3NjU5OTY3NjY1V3FxdHd5ent8fX59fnx9fXx+fX15fX18fn5+fXx8fX1+fXxydnF4eHJ1dXFxbnBwb3B1dnRuamRkanBwcXJwbmZlZGNcXlJUWlZXVVRXVFJYWFlZWVJVT0pHUFBPT01SSk9QUFBOTk9UTE1JUFBTVFUyPFhNSUFRPWNgUVNRUE5QUVBOTk1QTlRSUFJMSUxLT1FQUVJTVFFST0xNS0xMSENCQT06OTg3NjtCNDU2NjtlcHJ2eHl7fHx9fnx9fH19fX18e3h8ent9fX58e3l9fH18e3B1b3d1cHV0b3N2cHFxcHV1dmNqZ2VXaHRycnFuaWlocFZWVFVYVVdVUldWVVpZWFdVUVNGRUFGR0dIRkpESEpIR0VITEhLSUdMTVBNRy9FX1I+M0A+am9hUlJRQEZUUVBRUFFOUU9QT0xKTExPUE5OUFFRTlFPSkxNTUtHRUVEQjs9PDw5PUc2Njc3RG5xdXd6fHt8fX18enx8fX5+fXt5dnh3eXl8fXp6dn17fHp6b3Fud3JwdnFtcHNwb3Bzc3N0ZmdgaFpXa3JzcmxtbWtuYmVQU1RSU1VPV1ZWWVlWUVFRT0A+Oz0/QEJBQ0BCRURBQEdIR0hGRkhKTUxER0NPUkM4RU5TXWdTUVNBR1VQT1FRUE1NTkxKTEtMTk9PUU1PT01JTUxJTEtMS0dGRkVEPEFBPjtARTs8ODlUcXN1eHt7e3x8fHt5fHp6fn58e3V0dXJ2dnp6eHpyfHt8eXltcW94cnF1bm5xcm9vb3Rzc3J1dGtnZ15lam1wa29xbWltY0xPTk1RU0xUVVRXV1VMTEtIPTk4Nzs/QT88PUFAQj0+RUhHREZGSUdLSkBGQUFARkhFSk9IUVJhXFFQUk5TT09QTExPTEpNTE1PTltWS01RT0hKSENJSkxMS0ZGRkQ/QkM+PEJGP0I/QWRxdHd6ent7fHt6end8d3l+fnt7cXN0cHJzd3R4eHN6e3l2d2xxb3ZxdHRsb3Fybm5vc3ZydHNycmtsZW5zaG1ubWxtbGprSUxISE9RSlFTUVRTT0tIQ0U9OTg3OT9CPjs+QUBAPkFESUVDSEdJR0lFQkI/PjxDQkFHSURNT2FlUU1PTldLTE5LTE1MTExLTk5TZE1KTFJJSUlFQUhKTE1OS0dJRkJBQkA/RUZFSERLb3B3enl5e3t6fHp3c3h0eHx8eXpucXJtbm9ycnZyc3h8eHZ2bXBtc291dGxwcHJvb29ydnZyVlZucWdseYRqbXFybm5qaG9ISkNHTE1JTVBNUE9HS0U/Qj05OTk6P0I/PEFCQkFEREdLRkRJSUdHSENDP0I/P0BBPkNFQ0tOUVRMSklNVEZJSUpMSkpLSUlMTU9QUlBLR0NMR0NDSkpMTU9NSUpJR0NDQ0RJSk1MSVpzbXh5eHp7e3l8dnJwdXJ0eXl2eGpxbmpsbG50dG1zdXtzdHhyb25xbnZzbnBvcnBvcHN0eWpOYGdzanR8eWdvc3FqcWhlcUhLQ0ZISEdKS0lKTERHQj0+PTo6OjtBQj89QkJDQ0hGSkxKRUlJRkdHQ0M7QUBCPkBAQ0VDSU1PR0hLRkhLREhJS01ISkxISEpMS01dUklIRE5HQkVLS05NUE5LTUpLRkdHSk1OUU5MY25pd3Z3e3h7en1xbWxza3B0dHR1aHBtamlra3RwbnR0eXByeXRvcnFvd3NvcXB0cnBydXR5a05WbXVscXt2aW5vaWp0aGRvRktDRkVHREVFRkVHQ0NAPjw9Ojs6OkBEQD5CQ0VFSUZKSkxGSUlHRkZDQjtCQ0M+QENDQ0VHTE5IS05IREhFSU1OTUdJTEdFRklJTE5LSkhFT0lDR01NTk1QTk9PTUxJSElPUlFSTlJmZ2Zyb3N4dXt6fGxoam9la3Btc3FmbWxoaWtsdG1wdXR3cW94dG90c3J2c3BxcnRzcnR1dXZ2WFZ1dWtvdHJrb3ZsaG1lX3BHSUNFRkVCQ0JFQERCPj8+Ojs7PTs9P0NBP0FDRkdKR0pJTEhHR0dGRUNAPUVFQj5BRENDRUdISUdNUElGRkdLTk9LRkhKRkVERElJSEtJRkhQS0RKTUxQTk9OT1BOSkpITVJVVFJPV2RhYW1ncHJvc3l6Z2VoaGNpbGdxbGZsbWdpa2xzbHB2dXRwbnZyb3Nyc3V0cXNzdXRzdXZ2dnl2dXR2bGt1dW1ydnFsbmxlck1HRUVHQ0JBQkQ9QkE+QT06Oj0/Oz4+QEI/QEJFR0pGSUdJR0ZGRkVEQkFBRkZDQkJCREVER0dIRkxRTElPSkpMS0lHSEVGRURDSUhIS0pHS1JNQ09PTlFQT09OT09LS0tQVVdWVVNYYF5daWFtaW5ocnNiZWZmZGloZm5pZm1taGtrbXJpcXZ1c3Ftdm5vcXJzd3Nyc3R1dnZ2dnd2d3Z2dHd1a3N1bnV0c3Fya2tzTUZGRUhCQkFERDxBQUBDPDg5PT46Pz0/Qj9AQERGSEVIRkZHRkZFQ0NFQ0RJRkNGRUJFR0VFRkdFSk1LSFFNSktISElFRklIRUNJSUpLTUtQU05EUVNRUVJOT01OUE1MTlNXVldYVlheW11kYGhiamlna19kZWZjZ2dna2dna21rbWxwcWd0dHVyc252b3FwcnR4cXNzdXZ1gpF5dnZ0eHV1d3hub3VvcnN1cXFpcHpNR0dHSEJCQkZFPEBDQkQ8Nzo9Pjs+OkBCPj8/Q0VGREZEREdFQ0VDREVGRkpFRUlHQ0dIRkhGRUNGSkpHTUpMS0hKTEZJSEtIRUtLTE1OT1JUT0lTVVRRVFBRTU5RTk1RV1pWWllWWl5aWGFgYGBfaGVjYGRlZ2dqaWhqZmhubGxvbXFwaXV1eHJycHVwcHBydXZwdXN1dnV7fn14dnR3dnZ2d3BsdXBtc3Vub3JzeU1ISEdJREFDSEU8QEVDRT04Oj4+PDw8QUI9Pz5BQkZDRUJCSENDREVGRkdHSUZHS0hDSEhHSUdGREhLSUdLSE1LSktMSExKTUtJTkxPTk9SVVZPS1VWVFFUUVJMT1FQT1RZWllcWllcX19eYGNeXGFja2JgZGdocoVoZ2lmam1ucG9uc3FqdHV4cnNzdHJucHF2cnF1cnV1c355jn11dXZ2dnZ4cml1cWtydGxxd3F1S0lLSEpFQkVHRTxAR0REQDk8PkA/Pj9DQjxAPkFBRkNFRUNIREZER0ZISEZISElLSkVKSEhLSEZGTEhISEpITExMTExJTUtNTk1PTFBQUVVWV09KVlZVU1NSUUxPUlJRVltbXV5bXF5gX2FgYmRdZGBlZmBlaGpjc3NmamhnbHBycW9zc25zd3dwdXZ0c21vcnVvcnNwdXJ2cnSBdnV1dXd2dXd0Z3Rya3Fya3J3b3ZJSkxJTEdCRURFPEBGRERCOz8/QUBAQERBQEI/QUNIQkVFRkdFSUVGRUlIRklISkxISEpKSUxKRkpLSElKSkdLS01NSkpNTE5PTk9MT1BSVVhWTU5UVlVTUlFQTU5UU1JXW15eX11dYGBhYWFgYmRlYmNoYmRpamd2i2xraWdtb3NxcHFwcHJ5d3J1dXRzbW1zc21xcm90dXRzcHN2dHV1d3Z1dXRlcXNrcHFqcnZvd0pNTEtNR0RDQUQ8P0VFRUM9QUFDQkJDRUFDREFBRUdDSEdIR0ZKRkNHSkdHSkZJTEhJSk1LTUxHS0lITEtOUUtSUUxTTUtOTk9QUFBUT1dYWFtOU1FXXFpTVlBOVFVUVFhaX2JiX2RhX2BiX2BlYWFjaW5oYmloaG14dmxoaW1vc3JwcXJycnZ0c3Vzc3Nua3NxbXByb3R2cnJxdXZ1c3d5d3V0dWNtdGtvcGpxdHB3TE1MTExHREFARD4+REVGQ0BDQUVEREZDQ0VHQ0JJRUJISklISEtGREtKR0hJSUlLR0pKT0tOTElMSEpNS1pmSmRcS2xSSE9OX25VbHNbcXBid2NSUGJ2dWh1Y2F2YFhucWJkdmluemZcbHRgbGpUX3d2aWpnaWZnbG1qbW9qbW5zcnBycnFyc3Jzc3J0cm5sdG9ucHFxdXVxcXN0dnZ1dXl3dXR0YGt0a3Bwa3FzcXlLTkpLSkZCP0BCPz1ERUZEQ0RCRUVERkJGRkdDREpERUpMTEpMTUdHTUpISkpIS0pJS0pOTE1NTExJTE1MW3NiZHBebGxVTU5mc11nZXFsbnRncGlfYVlubmJwcGJrampnb3F0ZXRub1xwdWdwTUpyeXZrYmBrZWVteG1rdmxucHNycHJxcHFycXJycnRybW1zbm5vcHJ1dHFzc3R1dXV0d3h2dXRibXVrcHBscnJxektMSUlHRUQ/QkI/PUJGR0JGQ0VERUVEQ0hIR0RFS0dHTE1NSk1MRkpOSElLSklMSkpKS01NTk1NTUtOTU1bcm9vbnBwbGtNUFFsV05pYnRycGFtb3ZcWWxRXG1tWnFta29teHh0c2lwXGBzbHFqVXV5eHBjXmtmYmdwcGppb3Bwc3NwcXBxcXJycXFycnRsbXJtbW5vcnV0cXRydHV1dHV1enZ1dGVudWtwb2xzcnJ5SktHSEVFRUJCQj0/P0ZHQkdESUVFREJGSUhIRUdLSkdNTU5LTU5HTE5JTEtJSk1JS0pKS09QTk5NTE5NTFxoZHVdbHFXbE5PUW1VWmtea2x2YWxkdFRlY05tWWxcdHBraWx4and1aHBdX3NraFdiY3d8b2NgZ2dhZGl0eWtubnFzc3BxcHFwcnFwcHBydWttcW1tbW9xc3Rxc3J0dnZzd3Z6dnV0aG91bHNvbXNydHdJTUdJREVFQ0FCPEJAQkZER0ZLR0VDQ0hLSEhGSkxMRk5LTFJSTEdNTUhOSklITkhKSklITk9OTkxKTk1KWnNwcG9xcW1sT1FSbllxa2dvb3Fxb210Xm5YYXRfbm9wb3Fyb251c3R0altddGN3eHJqbnpoYWFjZmJiam10dXBzdXZzcXBwcW9ydHt/fn13bGtxbmxtbnByc3F0dHN1dXR4eHl5dHVrb3VtdG9uc3N2dEhLSElCRUVFQUA+Q0NCR0NISU1JRkNGSkxJR0ZKTUxGT0pLV1JLR0tKSk5JSEpMSUtKSUhKTE1NTElLS0tTa2JaaV5famNyclpfWWpvX2VlVWtfY1thYlFgbWhcalxuaWlkW3BmZHBdWlxrW21xY3BzbGRnY2RnYGBrbXBwb3R5cnVxb3BxbnmFiIeHhoWAdnNua21tb25xcnR0cnR1dXZ5eHhzdW5xdW53cXJ1dHdzSEhGSURFREZBQEFFRERHQkhKTEdGREdLTElFRkpPTElPSUxbUUpGSEhLTUlISklLS0lISkdLS0tLR0hKSkxMTEtJS0xOVFtcVFBUTVBPTk9PVlFPT1FPT1FKSk5QUWRxaVRZV1tbXFVZW11YXVxcY2ZhYWZiY2VfX2ZrbWhtdHlydHJvcHB0hoeGhoaFhYaHg3pwbW1sa3FzdHRydHZ0dXl5eHV2cXJ1b3ZydHN1dXNHQ0VHRkZBRUM/Q0dERUdDSUtMSEZER0tMSERHSVBLTE9LTFdNSUVFSElKSElLSExKSEZISEpHR0lFRkxISUtOTElPXFdeT1xbYF5PWFlTXFxiXk1ZWk1YYVJLWWFaU2BkXWJYW2RkVlZYXFlaWFxWWVxeY19kYGFfZWhrZ210dHFxdHBxcoGGhoaFhoWFhYaGhoR9cmtpb3Jzc3N0eHl5eHl4d3h0cXhyeHNxcnVydE9CQ0RMTUJDREJESUVHR0ZLSktIRUVKSkpHRUhIUEpMTUpNU0lIRUFIRkpJS0tJTEpIRkVKSEVGR0VFSkdDSk1KS1RfWWBYYGFbYFVYWVReXlpfUllcUF5cWU5fXF5TW15jX1pdYGNgWV9iW2BeW1RYWFpfXmRiYmFjZWlla3Jwb3Bwbm93h4aFhYaCe4CFhYaGhYaFf3VxcHJyc3Z5eXp5eXh4eHdyeXZ4cnF4dnR2YVNKSk1JRUNCQ0ZHRUdHSUpKSUlERktLS0VGSElOSk5MSExOR0hGPkdHTElLS0pLS0lHRUlFRERFQUZKREBKS0lPW2NZXl5hX1JUU1dfYFxdWV5RWVxNVl9XS1FZW1FbX2FhXV5jYWBiYmJjY2VaUllWVVxbXmNgX19jZWJob21tbGxsbHWFf4SDeXV8hIWFhYaGhYWGhoN9d3JydHd5eXl5f359eXV5dnZybnp3dnhYUUpGQ0dFQkVHSEZHSElGR0pHSEZIS0lMRENLSk1NTExISkpISkc/R0ZOSktLTUtLS0lHSEREQERBSElBP0hJR09dYVpbZF1fVFFSWF1cXFxfWktXXExSXFlJTV5QUF1fYWNjY2NiXGRjYmRjZlhRVVRTXFhbYV9eX2FhX2Rsa21qamxudn51gXp8hIWFhYWFhYaGhYaFhoaGgnpyc3V1e4WHh4eGhYSBfnhwend2eFxSTUJASUZDRktJRkZHSEdHSkZGRklMSk5FQ0tKTE5KTElLSkhJR0JISFFNS0tPTUtLSUhHRUQ/RUJISEFBRkVEVF1ZXlhfWV9bXVVYWFBdXVFLSldeWF5bXVZaYFJRX19iYmBgYmJgY2JiZGRiWE9RUlJbU1xeXV5eX19fZGhnbGpubnB7e3x+e4CCg4SFhYWFhYWEhIWDhISHh4FzcneFh4eHh4eHh4eIh4WDgHx4XFNLQkFHRkRHTVJIQ1JLRkhISEVGS0pNUEVHSUlLTkxMSUxLSUlHREhLUU9NTFBMTEtLSElDRUFFQ0hHQkFGRUJWVUVcVF1TVl9YTlRVTlpbTUpLVWBhW19YX15hXU9ZYlxgYF9iY2JdYmJXX19UUE9QUVhSXVxcXV5fYGFmZmVsZm9vd3x7gHt9f4CEhISEhIWFhYODhYKDgoWFhnpvgYaGhoeHiIeGhoaFhYSFg35JTkZERkZHRElSY1BEV19JR0dIREZNSlBQRkpJSktOTEtLTEtKSkdFSk1RUU5PT01OTE5IS0FEQUNERkRDQURFQUxIQ0xMUE9PTEZNRkdJSkhHTExNT1FJTE9QUFNQTFFTUlVaWVdZWFhkVk9TVFBQT05QVVRcWVlbXl5hYWVmY2hja21xc3N6eX97en+EhISEhISEhIKEgH57gYOBfXuFhIaGh4eHhYWFhISEgoGAfUtJRUVHRkdES01eTEdIWU1ISEpIR05MUVFJTEpLS05OVU5PS0tMR0dLUFNTT1BPTk9OT0hLRWBFRF9MRGZjRE1bSF5cc21PTVZtWUxDUF9VbFdnSl1YVl5ETFFVTE1UVlFSVFhXVFhVVFxUUGZaaGhkWVRrVFdWVVtcXGBgYWJiYmBmaWdubGhyenx9foGEhISDg4ODgX19enJ7gXp7f4KAg4SEhYWBhIWBg4N/fnp7TElFRkZIRUVLT1RJS0dgVEhKT0pJT01SUUtNS0xPUlVST09KTE5HSE1RW1lPUFBOT1BQSktQf1FJfFlZcnNYUG1IcW5vYVZQcXFzUENrc21xc3BTb19bblhdVlxYVWtoVV1WY1pgWVpfVlVXf2p0dXVfYXZfWGJcXGZbX2FhYWJeYGJnbXBsYHB3dHiBgYKDg4J/fX6Adnh6bHZ+dHh+gHx+gIGChHyAg3p/gX9+d3dOSUVITU1CRExMR0lMRlJWTEtPSUtSWFdRTk9PTVFUTk9RUEtMT0dNUFNbWlRRUk9QUFBLSFp4XVR4ZGhZUlRRdmd0bHBibmZrUXJPTXdtanJwc3JxcnBvcIBdZXp1eHFxenF+c31rdX1iUmh8ZXNzb3NzfH1vfnlvf3JfYGBiYVphYGdrbmtibGZnbXd+gYCDfnt4d4B0dnppcn5udHx+d3h7foCDeHyBdXx/fHxzc05LRmBdR0FFTU1IS0tISlBPTU1KTlZeWVVMUVNOWVlMU1NSTkxQSVFSVFlXV1BUUFBQUUtHZnhsY3hxbVpKTFV5cHVtdWJudlBkZUpmdnFtd2+AamZ4eGlXclFoem1panp6fWx4en9wZ29YdnZqdnVwgGFzaH1pbHh8b19fX2NiW15iZGdpamRnYmNkbGxwcHN0c3NzeXFyeGJsdGdyeXtzc3V5foFzdXpufH15eHJuTkpTdE5DQkVQUElLS0pMUU9PT01QWmBaWEtUV1BhXlJWUVlTTVBJU1RVWFdXUFVQT05SSkxyb3V1cXVxZGhhVm5McXBeRmh5V3ZUS2h4fXhgeXtzbmFebW9kUmdydW5teXB3bHZzdHFsbVxzfnprbXl8bHVtfGtwdnV4Xl9fYl5dX2VkaWdoZWVeYmJpaWlqa25va3FubWpwYWNmZG93eG9tcHN5f25xcGp7enRyb21LS1tWSEdFR1JQSkxNS0xRUVBQUFFXXFlVTlZZVWZYUlJZXlRNTklUVFZXWVdPU05OTlFIUm1IaXdLYGR2dlVXbE9ubHtzYWpnf3ZVS1draH1sbWx4YFtwenteYHpzY3JveHFoZHxpcntdVEtsX3Z1a2l1e3ttfnhrfHBdXl5iW15iZGVnZWVlYlpjY2lra3JzcndnbWloZGdgYWxhZ3Nya2hsbXJ8a21oa3t0bW1rbU9HSktISkhIUlFMTlBNTFNTUk9TU1dSVlRQV1pWVlRUVGFgUU9OS1RTU1FWVk9OTE1PUEpIUU5QVUxLS1NUU1JUUFZVUVFOUVFYWFFOUFVUWFhYW1tVU1NXW1dYV1pQU1VXV1hRXVhWXVVTT1hSV1dXWFpgW2dyXltcW11eX2NaX2NjZWZkY2NiWWNjZmZmbW5tdWZmZ2NgZl9dZ2BkbGhmZ2tocHpoZ2drdWpoZ2lsUUlLS0xNS0pUUk1RUVBMVlZUUFRVWFVZVVJaXVZVVFdVWVhQT0xOV1RRTlVTTlBNTFFQS0pRUUtRTUtLT1JUUlFRU1NJSE1OT1FSUVFRVFZSWFdcV1NTUFJVVVZUWlFOU1JXVVRZVlRZVVNSVVNUVVhZV15aX2FdXFtaXFxgY1xdYmNkZ2VkZGFZYGFjYWJpaGluY2FkXl9jXVpkXGJtYV5mZmdtc2RpaGtrZWRjZmhQSktLTk9MTVRRT1RRUU1YV1VUVVdXV1pWVFxgVldWWVVYVFFQS09YU1BOVVBNUk5LU1BNTlVUTlFOTU5RU1BUUVNUVU5LTU9RVFRSUlFWV1VZWltZU1VSVFdXV1lbU09TVVdVVFlVV1lUUlJXVVVXXFlaYF1WWV9dXl1cXWBhXltiYmNoZmVkYlhgYGJdYGhlZmRhXl9dXV5aWl9aX2dgXl1dY2hrYWdmaGZkYGJjYVBLTUxQUUxPVFBQU1FPUVpZWFdYWlpYWFZdamRWWFlaV1ZUVFBLT1ZUUE9UUFBRTk1RUU9SWFRSUU9NT1NVTldSVFVVT05OUVNVVVRUUlRYVlpdXFpWVlFSV1hWW1tWUFNWVVVWWFRXV1RSUlhWVVpfWl5gXlZeXV5gXVxgYF9fWmJiZGhoZWRiWWJgYl5eZmRjYGJdXFxcXFlaW1hbYVteXV1fYl9fYmRkYmRfX2BcUE1OTlJRTVJTUFNUUU9VXFpaV1tbXFlaW2RxbWhkX1tZVlZYUk1NVlNNTlJPUVJPTFBTUlVaVVRQUExQV1ZRV1JTU1hNT1BSVFhVVVVTVVlYW15dXFtWUk9VV1ZbW1dQU1dVVlhVU1haVFNRWVdWXF5bX19gVWFcYGFeYGJfXGBdY2FjaGllZmBaY2BhX19lZV9gY1taXFtcWlpZWVdcWVxbYF5fW15eYWBfYlxZYFpRTk9OVlFQVVNQVVRTUFdcXFxYXlxfV1xeanF3eYBjXFtWVlhSTk9XU05RUVBSVFJMUVRTWVpXVU9STlNYVlRSVFJSWk9RU1NWW1ZWV1RWWlhdXlxcXlZTTlRWVlxcVlFUVlZYWVJTWVxUUlJcWFpdXl1hYWBXYltjYl5hY19cYmFiX2RnaWRoXlxkYGFgYWNlX2JfWVpeW1xbWVhZV1daW1phXF1bXVxcWl1gV1tbWlBPT09ZUFVVU1JXUlRQWl1eXVtgXGBVXF1panJ9c2xoXFVZV1FPUltTUlFUUlRVVEtSVlVbWVpTT1NSVlZVU05WUlNaUlRVVFhcV1hYU1hcWF5dWVteVFVOVldXXltYUVRVWFhYVFZYW1RTVl1ZXV1hXmNjXllgW2ViX2RkXl5jY2FdZWZpZWdeXWRhYGFiY2RfYl5YWl9bXFtYWFhYV1taXGBdW1tcW1haW15WXlldUE9PUlpQWlVVV1ZUVFReXmBeXmJcYFVdXmJreXRsfWxaVVpVUVFTXFRUVFVUVllXTFJaVl1bXFJPVVNYVlZTUFdSU1dTV1VWW11YW1lVWl5XX15ZXFpSV1JZWFlfWlpTVFZaWVpWV1lcVlRaXVxeYGFgZWRdXl1dZWFiZmReX2RjYFxnZGhlZWJfZGFfYWBiYl9gXldYXlpcXFpZWldWXVpdXltaW1xbV1lcXVZYV11TT1BXWVBdVVZZV1dVWF9gYWFgY11gVV1eYmVldYF6aFhZWlRWU1ZcWFdXVlZXXVhQVVxZXl1dVFNYUlhWU1JUWFJTVlRYWFhdXlhdW1VeX1hfX1hcVlJZVVlaWmFYXFVXV1paWlhZWlpYVl1eX15jYmJlZV1iXGBmYmVmZF9gZGJiW2ZjaGVjZmFmX19hYWFhYF9eVlVdWltcW1lcWVldW1tbWFhZW1laWl1fXVRZXVVOVFpWVFxUVldZV1ZcYGFiY2FkX19WW2BkYV96dW9oWlxaVlhVV1taWVtZWFlgV1BVXltgYVxUVVhQVVZVU1ZWUlNVV1paXF9eWl9cVl9fWl1eWV5WU1lYWVpdYlleVldaW1tbWltZW1lZXl9gYGRjZGVlYmRaYWZjZ2ZlXmFjYGNeY2NpZGRnX2deYmJjYWFgXl9YVFpaWltbWFtYWFxbWltXV1pYV1xbXGBdVl1dU1BWWldWWlVZVVhXWF5gYmFkYWRhXllZYWRiYGxmaF5cXVtXWFhZXFxcX1tZW2JWVFdeXWFjXFNWWVBWVlZWVlZTVlRYXVxfYGBdYV1XYF5bXlxbXlhWWFhbW19gW15YWF1cXV1eXFpcWFtfYV5gZGNkZmZmYlljZWVoZ2ReY2FgZWNdZmlkZWhfZl5jYmNhYWBfX1tYWVtZWlpYWVhXW1taW1dYWlRZXVxaYFxVXmJNUldZVldaWVtcWVdZXmBiYWRhZGFdXllhY2JfYWBhX1xcXVhXW1tdXV9fXFpdY1hZWF1gZGRfUlhZUFhWWFhYV1ZXVl1eXmBhYV9iXllhXV1eWV1eWVhWV1tcYF9dX1lZXl1eXmFdW1pZXF9iX2JkZGVmZ2diWmVnZ2lnY19jXmFmZFpoaWNmaWNlXmJiY2FgYF9dXVpXW1lZWFhaWVdaW1pZV1hWVVtdXV1gYGJieEtXV1xYV11cXF1aV1xdX2BiZGJiYV1gWGJjYmBjYWNeXF1cWFdbXV9dYF9dW2BkXFxYWmJlY2FSXFlPWFdZW1pZV1pZYF5hYmJgYWNfXGJdX11bX15ZWVVYXV1fYF9fW1peXmBiY1xbV1tdYGJiY2VkZ2ZlZ2RcZmhoaWZjYWJcY2dgXGlpYmhpZmVgYmFjYV9gX11dXFlcWVhXWFlZV1xbWldXWFBYWl1hY2Zmcmt/SllXXVpaX11cXlxYXVxeX2FjYmFhXWJbYmRhX2NiYl1cW1pXWGpxYFxgX11cYWNfXllZY2VkYVRfWlFZV1xdXFtaW1tkYWNiY2BiZGFgY15gXF5fX1pYVltfXVxhYV9dW2BhYmViX11TXF9gY2RkZmVnZmVmZV9mZ2loZ2RkYFtmZ15haGhiaGhmY2BiYGNiX19fXV1bWltZWFhYVlpWXFpaVlZVTFhXXGdpa2h1eIF2dnZ2dnZ2dnZ2dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6e3p6ent7e3t7e3t7e3t7e3t7e3x7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHt7e3t8fHx8fHx8fHx8e3t7fHx8fHx7e3t7e3t7fYmIhoqHhYKBgoOCg4OCgoKCgoKCgoKCgoGAgYCBgICAgYCBgYGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t6e3t7e3t7fHx8fHx8fHx8fHx7e3t7e3t7e3t7e3x7e3t7e3t7fHx8fHt7e3t7e3t8iYmHiYaFgoGCgoGCgoKCgYKCgoKCgoKBgYGAgICAgICAgIGBgYB9fHx8e3x8fHx8fHx8fHx8dnV1dXV1dXV2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eHh5eXl5eXl5eXl5eXt7e3t7e3t7e3t7enp6e3x8fHx8fHt7e3t7e3t8fHx8fHx8fHx8fHx7e3t7e3t7fHx8e3t7e3t7e3t7fHx8fHx7fHt7e3uHiYiJhYSDgYKCgoODgoKCgoKCgoKCgYGBgICAgICAgICAgYKBgH58fHx8fHx8fHx8fHx8fHx2dXR1dXV1dHV2d3d3d3d3d3d3d3d3d3h4eHh4eHh4eHh4eHh4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t7enp7fX19fXx8fHt7e3t7fHx8fHx8fHx8fHx8fHx8fHx8e3x8fHx8e3t7e3t7e3x8fHx8fHt7e3t7e4aJiYiFhYOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgIGBgYCAfnx8fHx8fHx8fHx9fX18fHjF1NLS0tLUk3t9fX19fYSMi4uLi454KSkqKiopKz0/Pj4+Pj5tgH5+f397pdfT09PT1r2GiYmJiYiNsbW0tLS0uFEmKysrKiVikoyMjY2OiX5/f39/f359fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx8fHx8fHt7e3t7hIuHh4aHgoGDg4GCgoKCgoKCgoKCgoGBgYCAgICAgICAgYCBgIB+fHx8fHx8fHx9fXx8fH19eNXn5OTk5OeZe39/f39+hpCPj4+Pk3kZGhoaGhocMTMzMzMzMmqCf4CAgHut6eTk5OToyomMjIyMi5G7wL/AwL/ESRQbGxsbFF2Wj4+QkJCLf39/f39/f319fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e3uCjYeIh4eDgoSDgYKCgoKCgoOCgoKCgYGBgICAgICAgICAgICAgH58fHx8fHx8fXx8fH19fX12fn9/f39/f3l3d3d3d3d4eXl5enp7eG5vb29wcHBycnJycnJyd3p5eXp6en6Dg4ODg4SBfHx8fHx8fYCBgYGBgIF3cnNzc3NyeX19fX5+fX18fX19fX19fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e4CMhomHh4SDhIKCgoKCgYKCg4KCgoGBgYGBgYCAf4CAgICAgICAfnx8fHx8fHx8fX19fX19fXZ0dHR0dHd0dnd6e3h7eHd2eHt4e3p5fXl4eHl4eHh5eXl5enp5eXl5enp6eXh4eXl5eXl7e3t7e3t7enp6enp5enx9fX19fX18e3t7e3t8fHx8fHx9fX19fX19fX18fH19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8f4uHi4qIhIODgoKCg4KBgoKDgoKCgYGBgYGAgIGAf4CAgH+AgYF+fX18fHx8fHx9fX19fX19d3d3dnZ3fXh3d316eH14d3d5fHt9ent9e3d3d3d3eHh4eHh5eXl5eXp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fHx8fHx8fHx7e3x8fHx8fHx8fHx+iomMjImFg4SEgoKDgoGCgoKCgoKBgYGBgYCAgICAgICAf4CAgH19fXx8fH19fX19fX19fX13d3d3d3p9eHt4fHx3e3h3d3d8fHx8fX58d3h4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fX19fXx9fX19fX19fX19fX19fHx8fHx8fHt7fHx8fHx8fHx8fH2Kio2NioWDg4OCgoKCgYGCgoKBgoGBgYKBgIGBgICAgIB/gIGAfXx9fX18fX19fX19fX19fXd3d3d3fX55d3d4e3p8eXd3d3p8ent9fnx4eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt8fHx8fHx8fHx8fHx8fH19fX18fH18fH18fHx8fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8foqJjo2JhISEg4KDgoKBgYKBgoKCgYGBgoGAgYKAgICAgH+BgIB8fH19fX18fX19fX19fn5+d3d3d3d5fHl7eHx9eXt5enp6fXx8fHx+e3h4eHh4eHh4eXl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt7fHx7fHx8fHx8fHx8fXx8fX19fX19fXx8fHx8fHx8fXx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx/iIeNioeFhoaDg4ODgoGBgoGCgoGBgYGCgYCAgoF/gICAf4CAgHx8fX19fX19fX19fX5+fn53d3d3d3Z4eHl3eXp4enh5eXl7eHp6eXx4eHh5eXh4eHh5eXl5enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX18fH18fH19fX19fH19fX19fHx8fHx8fHx8fHx8fX+HiIyIhoeHhIKDhISCgYKBgYKCgoGBgYKBgIGBgYGAgIB/gIGAfHx9fX19fX19fX1+fn5+fnd3d3d3d3d3d3d3eHh4eHh4eHh4eHl5eHl5eXl5eXl5eXl6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fHx8fX19fHx8gIeIi4eHiYaDg4SDg4KBgYGCgoGBgYKCgYGBgIGBgYCAgICBgX97fH19fX19fX19fn5+fn5+d3d3d3d3d3d4eHd4dnl5eHh4eHh5eXl5eXl5eXl5eXl5enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fH19fXx9fXyBhoqKiYmIhIOFhISCgoGBgYGCgYGCgoGBgYCAgYGAgIGAgIGBf3x8fX19fX1+fn5+fn5+f394eHd4eHh4eHZxZGpeam15eXl4eHl5eXl5eXl5enp6enp6enp6enp7e3t8e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIGFiYqJioeEhYWEg4KCgYGBgoKBgYKBgYGBgYCBgYCAgYCBgIF+fH1+fn5+fn5+fn5+fn9/f3h4eHh4eHh5bWRiZV9fXm95eXl5eXl5eXl5eXp6enp6enp6enp6e3t7e3t7fHx8fHx8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goWKiomJhISGhYSDg4KBgYKCgoGBgoGBgYKBgIGBgICAgICBgH58fX5+fn5+fn5+fn9/f39/eHh4eHh4eW5kZWdlZGJeZnh5eXl5enp6enp6enp6enp6enp6e3t7e3t7e3x8fHx8fHt8fHt7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChouJiIqEhYaEg4OEgoGBgYGCgYKCgYGBgYCAgYGBgIB/gIGBf3x8fn5+fn5+fn9/f39/f394eHh4eHl3Z2VkZWZkZWFfaXl6enp6enp6enp6enp6ent7e3t7e3t7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHt8fHx8fHx8fHx9fX19fX19fX19fX19fXx9fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4eJh4SEhoSDg4WBgYGBgYKCgYGBgYKBgICAgYGAgYCAgYF+fHx/f35/f39/f39/f39/gHl5eXl5eWtlYWJlZWFlZV5ieHdze3p6enp6enp6enp6e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fH18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19g4aLhoiFhYaEgoOEhIKBgYGBgoKBgYKBgYGAgYGBgYGAgIGBgn98fH9/f39/f39/f3+AgICAeXl5eXl0Y2NlZGNmY2doZGZsZF5ze3p6enp6enp6enp6ent7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn6DhouGhoaGhYODg4SDgYGBgYGCgoGBgYKBgYCAgYGBgYCAgYGBfnx8f39/f39/gICAgICAgIB5eXl6d2RhY2diYmRdW2VfYV1eYGFoeHp6enp6enp6enp6e3t7e3t7fHx8e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+foSFi4eGhoaGhIODg4KBgYGBgoKCgYKBgoGAgIGBgYGAgYGBgYF+fX1/gH+AgICAgICAgICAgHl5eW9vYmJiZF5jZ19dYWFgXF9kYlttfHp6enp6enp6enp7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7fHx7e3x7fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5/hIiLhoSHhoaEhIODgoGBgYGCgYGBgYKCgYCAgYGBgYGBgYGBgX5+fYCAgICAgICAgICAgICBeXpwXWJlZGJkXmZnZ2BZYmJhY2VfXF1ze3t6enp7e3t7e3t8fHx8fHx8fHt7e3t7e3t7e3t7e3t7fHx8fHx8e3x8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fn19fn5+fn5+fn5+fn5+foCFjIqEhYaGhYODg4SCgYGBgYKBgYGBgoKCgYCBgYGCgICAgIGBf35+gICAgICAgICAgIGBgYF5emxiZGdjYmdmYWBgZGFiZWRjZGNeXGJ1fHt7e3t7e3t7e3x8fHx7e3x8fHx7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/gYeMiYWGhoeFg4SDgoGBgYGBgYKBgoKCg4KBgIGBgYKBgYGCgoF/f36AgICAgICAgIGBgYGBgXp7dGdnZmZkZGZmYF5fYWNlaGRlXmJkYHR8e3t7e3t7fHx8fHx8fHx8fHt7fHt8fHt7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f3+CiYqIhoaIhoWDhIOCgYGBgYGBgoGBgoKCgoGAgYGBgoKBgYKCgX9/f4GBgYGAgYGBgYGBgYGBenptaGNjZ2ZnZWdmZmdiZWRlYmdbYmVgdnx8e3x8fHx8fHx8fHx8e3t8fHx8e3x8fHt7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f39/f4SJioiGiYeFhYSEg4KBgYGBgYGCgYKCgYGBgYGBgYKBgoGBgICBgH9/gYGBgYGBgYGBgYGBgYF7emlpZGNqZmFgZmVjY2NnaWRjYmBiZGJ0fXx8fHx8fHt8fHx8fHx8e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f39+fn9/f39/f39/f3+AhIqMiIeJhoSFhYOCgYGBgYGBgYKBgoGBgYGBgYGBgoKBgYGBgYGAgH+BgYGBgYGBgYGBgYGBgXZzZWRnY2RmZWJlZmdkZmhmZWNgYGNkYHF9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fXx8fHx8fHx9fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/fn5+f35+f39/f39/f3+AgICFioyJiIqJhoaDgoKCgYGBgYGBgoGBgoGBgYGBgIGBgYGBgYGCgX+Af35/foCCgoKCgoKCgoKCc3NnZWRkZWlqaGZnZ2NhZmZlZmdmZWVjdX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fH19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gICAgICAgIWLioqJioeHhoSCgoGBgYGBgYKCgYKBgYGBgIGBgoKBgYGBgYGAf4B+dHRzdX1/goCAfn5/gYB0cmdkZWNmaWppZWNlY2BmZGRnZ2JiZWFwfXx8fHx8fHx8fHx8fHx8fHx9fX18fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f39/f39/f4CAgICAgIB/houLiouLh4eHhIOCgYGBgYGBgYKBgoKBgYGBgYKCgYCBgYGBgoCAgH5zc3NzdHV4dXV0dHV2dXVwZmNmZWhoaWdoZ2VmZWJfZGVmY2BiZ3d8fHx8fX19fX18fHx8fH19fX19fX19fXx9fXx8fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gIB/f3+AgICAgICAgICHjIyIi4qHh4eEhIKBgYGBgYGBgoGCgoGBgICBgoGBgYKBgoKCgYCAfnNzc3Nzc3NzdHR0dHNzdW9jY2FnZWhoZ2pmZGVnZmhmY2JlYl5ieX18e3t8fX19fX18fHx9fX19fX19e3x9fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn9/fn5+fn5+fn5/f39/f4CAgH9/gICBgICAgICAgYCAf4CAgYGAgIeLi4iNiYiJhoSFgYGBgYGBgYKCgYKCgYGBgIGCgoGBgYKBgoKBgIB+dHNzc3Nzc3Nzc3Nzc3N1cmdlZWRlamhoZ2ZpaGdjZWViZGNoZGd7eHVzc3R2dnl4dnR0dHZ3d3d2dHR0dXV4d3h4d3d6e3x9fXx9fn5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f35/f39/gH9+fHt7fX58eXl2dnZ5fHx6end2d3l7fXt4hIyMioyHh4iEhYSBgYGBgYGBgoGBgoGBgYGAgYKCgYGBgoGBgoGAgH51c3Nzc3Nzc3Nzc3Nzc3VzaGVnaGVrbGhqZ2lqZ2dnZmRkYmVkbnV0dHNzdHNzc3Nzc3Nzc3Nzc3NzdHNzc3Nzc3Nzc3N0dHV1c3V3eHl7fn59fn98f39/f39/f39/f314fH5+fXx4dXZ3eXd4dnRzc3N0dXRzc3Nzc3NzdHNzc3R0c3R0dHODjI2KiYeIhoOGg4GBgYGBgYGBgYGCgYGAgYGDgoKBgYCBgYGBgICAf3VzdHRzc3Nzc3Nyc3NzdnZpY2hqaGpsZWZpbGhgZmVkY2BkZGZ0dXV1dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHRzdHRzc3Nzc3R2dnV1d3V4fH9+fX9+fHp4dXN0dXV1dHNzc3Nzc3N0dHR0dHR0dHR1dXR0dHV1dHR1dXR1dXV1dIaMjYuIhoeEhIWCgYGBgYGBgYGCgoGAgYCBgYKCgoGBgIGBgYGAgIB/dnNzc3Nzc3Nzc3Nzc3N2dnNnZ2pmaGdmaGhmZGlnY2NnZWVmcHZ1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dHR1dHR0dHR0dHRzdHR0dnV1d3Z0c3R0dHR0dHR0dXV1dXV0dXV1dXV1dXV0dHNzc3N0dHNzdHR0dHR1dXR1iY6MjIqHh4SEhYKBgYGBgYGBgYKCgoGBgICAgoKCgoGBgYGBgYCAgH93c3Nzc3NycnJyc3NzcnZ2dW5kXWNnZWlraGVoZ2dqamlnZXB2dXV1dXV0dHRzdHR0dHR0dHV1dXV1dXV0dHV1dHR1dXV1dXV1dXV1dXR0dHV1dXV1dXV0dHV0dHV1dXV1dXV1dXV1dXV1dXV1dXV0dHNzc3Nzc3N0dHNzc3Nzc3R0dHR0dHWKjoyMiYaGhIeFgoGBgYGBgYGBgoKBgYGAgYGCgYKBgYGBgYKBgYCAf3hzc3Nzc3JycnJyc3NzdnZ3d2liaGhnamtpaGZkZGVmaWhwdXR0dHRzc3JxcnJ0dXV0dHR0dHR0c3NycXFxcXNzdHR0dHR0dHR0dHV0cnJyc3R0dHR0dXV1dXV1dXR0dXR0dHR0dHR0dHR0dHR0c3Nzc3Nzc3Nzc3Nzc3N0dHN0dHR0dHR0dYuOjImGhYWFh4SCgYGBgYGBgYGBgoKCgYGAgIKCgoGBgYGBgYGBgIB/eXNzc3NycXJycnJzc3N3d3d3bGpoZGhpa3Z6a2VmZWhnbXJzdHN0c3JwcHBxcnN0dXR0c3NycnNycXBvb29vcHFzc3NycnJyc3R0dHNxcHFyc3R0dHR0dHRzc3Rzc3NzdHR0dHRzdHR0dHR0dHRzdHR0c3NycnFxcnJzc3Nyc3NzdHR0dHN2jZCMh4eFhYSEgoGCgoGBgYGBgYGCgoKBgYGAgYGCgoGBgoKBgYGAf395c3NycnFxcnJycnNzc3d3d3dzc2pnaWloeX99cW51bG5wcXJycnFxcG9wcXFxc3Rzc3NycXFwcG5ubm1ubW5ubnBxcnJycnJycnJzcXBvb3BxcnJzc3JxcnJycnJycnJycnJzc3Jzc3Nzc3Nzc3Nzc3Jxb29ubm9vcXJzc3Jyc3NycnNzcnaPj4uHhoWFhYOCgoKBgYGBgYGBgYGBgoGBgYGCgoKBgoGCgYGCgX9/f3hxcHBwcXFycnJyc3Nzd3d2dnd2cnF0c252f352c3hwcHBycnJycXFwcHFxcXFyc3Nzc3FwcXBvb25ubm5ub25vcHBxcXFxcXBwcXJwb25vcHFxcXFxcHBxcXFxcXJycnJycnJycnFxcnFxcnJycnFwb29ubm1ubW5vcXJycnJycnJyc3JxeI+OjYaDg4aEgoOCgoGCgYGBgYKBgYGCgYGBgYKCgoKCgoKBgYKBf4B/d29wb3BxcnJyc3Nzc3J2dnZ2dnZ3dnZ1c3l/fnd3d29wcXFxcXFxcHBwcXJxcnJzc3JycXBwb29wb29vb29vb29wb3Bvb29vcHBxb29vcHBwcHBvcG9wcHFycXFxcnJycnFxcXFxcXFxcHBwcHBxb29ubm5tbW5tbm9wcXFxcXFxcXFxcXB7j42NhoODhYOCgoKCgYKBgYGBgoGCgYGCgoGCg4KBg4KBgYGAgYF/f392bm9wcHBxcXFxcXBwcHZ2dnZ2dXR0c3NxfYB9fX9zb3BxcXFwcHBwcXFwcHBxcnJxcXFwb3Bvb3Bwb29wcG9vb29vb29vb3BxcXBub3Bwb29wb29wcnJycnFxcXBxcnFwcXFxcHBwcHBwcHBwb29ubm1ubm5ubm9ub3BwcHFxcXFxcXFxcIKRjoqEhIOFhIOCgoGBgoKBgYKBgYGBgYGCgoKCgoKCgYGBgYCBgX9/gHVvb29wcXFxcXBwcHBwdnZ2dXRzcnJycnGAgoCBeXBwcHBvcHBwcHFxcXFwcXFxcXFxcG9vcHBwcHBwb3BxcHBvb29wb29vcXFwcG9wcG9vb25vcHFxcHBwb3Bvb3BwcHBwcHBwcHBvb29vb29vbm5tbW1ubm5ub25vb3BvcHBwcHBwcHBwiZCMiISDhIaDg4KCgYGCgoKCgYGBgYCAgYGBgoKBgYGBgYGBgIGBgH+AdG5vb3BxcXFwcG9vcG92dnVzcnFxcXFxcICDg39ycHBwcHBwcHBwcHFxcHBxcXFxcXBwcHBwcHBwcHFwcHBwcHBwcHBvcHBxcXBwcHFxb29vbm9wcHBvb29vcHBvb3BwcHBwcHBwcHBvb29vbm5ubm5ubW5ubm1ubm9wcG9vb29vb3BzcXWPj4yJg4KFh4ODgoKBgoGCgoKBgYKBgYGBgYGBgYGBgYCAgYGAgYGAf4B0b29vbm9vb29vb29vb3Z1dHNxcXFxcXJygIKCgXRxcXFxcXFxcXFxcXFxcXFxcXBxcXFxcHFwcXBxcXFwcHBwcHFxcXBxcHBwcXBwcHBwcHBwcHBwcHBwcHFxcXBxcHBwcHFwcHFxcHFxcXFxcXJxcnFwcnRycnR0dHR1dnRzdHR0dXd3gpCPi4iDgoaHhISCg4GBgYKCgoGBgoGBgYKBgYGBgYGAgICBgYCBgYB/gHVvb29vb29vb25vb29vdXRzcnJycnJycnKDg4OCdnFycnFxcXJxcnJxcXJycnFxcXFxcnFxcXJycXFycXFxcXFxcXFxcXFwcXFxcXFxcnNzcnJyc3V1dHR0dHR0dHV2d3d3d3d3eHh4eHd3eHh4d3Z3dnV2dnZ2d3h6e3x7e3t6enp6enyGkI2LiIODiIeHhYODgoGCgYKBgYGBgYKCgoGBgYGAgYCAgYGAgIGBgH+Ad3FxcXFxcG5ucG9wcG92dHV1c3Nzc3NzdYiDgoN5cnNzcnJyc3Jyc3NycnJycnN0cnJzcnNzc3Nzc3Nyc3N0dHV1dXV1dHV3eHd3d3d4eHh3eHh4eXl5eXl4eHl5eXp6e3t7e3t6enp5eXh3d3d1dnV2dnd5enp7fn5+fX1+fn5/f35+gIyQi4qHg4WIi4iEg4SDgYGCgYGBgoGBgoKCgoKAgYGBgYCBgYGAgIGAf4B8enp5eXx5eHh2dXZ2dHl2d3h3d3Z3dnZ6f3x+fnx2dnd3dnV4enh4eHh3d3d2eHx5eXx6eXl8e3l5eXh4eXl6enl5eXh4enp5eXh4eHh3dnd3eHh3eHh5eXp7e3p8fH1+fX9/f359e3t7e3p5enl5e3t/foB/fn5/fn19fX5+f35+fn6AjpCNioeEhoqLiIaGhIOBgoKBgYGCgYGCgoKCgoCBgoKBgYGCgYCBgIF/f4B/fn19fX9/f318e3t7eXh4eHh5eXl4eXh5eXl4enp6enp6e3t7fH1+fHt7ent8e318e3t7e3t7enl4eXh4ent6enp5eXp8fHt6enx8fHp6ent9fHx+fn+AgoGAgYKAgH9/gYGBgIB/f35+fn5/fX1+f4CAf35+f39+fn9/f39/gH+Af4OQjoyHhoWIi4yIh4aFg4GCgYGBgYKBgoKCgoKBgYKDgoGBgYGBgIGBgIB/goOCgoGBgX99f39/f4F6enh4d3h4eHh5eHh5enp5e358enx9fXt8fX19fHx8fnx9fn5+fn59fX9/f3x8fYGDgYCAf318fXx9fXt9fXx8fH19fX1+gYGChISDgoB/gYGBgH9/f4B/f39/f39+fn9/f39/f35+f3+Af39/gICAf4CAgICAhJCPi4eGhoiLi4mKhYaDgoKCgYGBgoGCgYKBgYGBgoOCgYCAgYGAgIGBgH+ChIKCgICAgH9+fn+AgH9/fn18fX19fYB/fX+Af35/gH9/fn9/gIGBgICAf3+BgICAf4CBgn9/f4CAf35+f39+f39/fn5+f39/gYB/f4CBgYCAgYOEgoGCgoGCgH+AgYCBgYGAgH+BgICAf39/gICAgYGBgIGBgYCAgICBgoGBgYCAgYGFjo6MiYaHiYyLi4qGhoOCgoKBgYGCgoOCgoKBgIGBgYKCgICBgYCAgYGAf4KFg4KBgYCAf39+fn+AfX5+fn19fX5/fn9/f35+fn+AgYCAgICAfn9/fn+Af3+AgH9/f35/f39+fn59fn9+fn9/f35/gIGBgoKDg4KCg4KBgYKDg4OCgYGBgYKBgoKCgYKBgoGBgYGBgoKCgYGCgYKCgoGBgoKBgYKCgoKCgYGBgoKCgoaPkY+KiImKjY6NiYaFgoKCgoKBgYKCg4KCgoGBgYGBgYF/gIGBgYCBgIF/gYWEg4KCgoGCgYCAgIB8fHx7fH18fH9+fn9+fn5+f35+f39/f39/f35+foB+fn5+fn9/f39+f39+fn5/gIB/gIB/f39/f3+BgYGCgoCAgYKDg4SDg4ODgoKCgoKCgoKCgoKCgoGCgoKDg4OCg4ODgoKCgYKCgoODg4ODgoKCgoODg4KCh5KTkIuKi4uPj42Kh4SCgoKCgYGBgoKDgoKBgYGBgIGBgICAgYGBgIGAgYCAg4SDg4OEg4ODgoKCgXx9fHx9gn1+f4GCiIGCgoSCgYGDg4GBgYKDgYKBgYCAf39/gICAf3+AgX9/f39/gYCAgICAgH9/f3+AgICAgH9/gYODhYSEg4SDgoKCg4OCgoOCgoODg4ODg4SDg4KEhYWDg4SEgoKDhIOCg4ODg4OCgoODgoCKlJOPioqMjpCPjYuGg4KCgoKBgYGBgoOCgYGBgIGBgoGBgICBgYGAgYCAgH+BgoODg4SEhIOCgoKCfXx8fn6AgYOAg4OChIaFhoaFhIWFg4ODg4SBgYKEhIKDgoeDgoKAgoGBgoKCg4KCg4KDgoODgoGAgIKCgYOCgYKCg4OEhYWEg4OChISEhIOEhISDg4OEg4ODg4OEg4SDhIWEhISDg4ODgoKCgoKCgoKBgYKCgo+UlI+Njo6RkY6KiISCgoKCgYGBgYGCg4GBgIGBgYGBgYCBgIGBgYCBgICAgIKChIKChIOCg4ODgoJ9fX2AgH+AgoGDg4ODhIaEhIOEhYWDg4GBg4OBgIKDgYKFhYaFhoaHhoaGhoeHh4aGhoeHhoaEgoGCg4SDg4ODg4ODhISFhYWDhYSFhISEg4KBg4OCg4SEg4KCg4SCg4ODg4OCgoKCgoKCg4OEhIOFhYWFhoaIk5OTkI+Pj5KRjIqIgoKCgoKBgYGBgYKDgoKBgIGBgYGBgICAgYGBgICAgICAhISEgoKCgoGBgoKBgX+AgYOCgICAf4CCgoGDg4KCgYODg4SDg4KDhISCgYGBgoSFiIeHh4aGiIeHiIiHh4eIiIiFhIOBgIGBgoKCg4GCg4SEhYSDg4OEg4OEhIOBgYGCg4OEhISDg4ODg4OEhIODgoSDg4ODhIWFhoeHh4eIiIiJiY6TkpKOj46Qko+LiYeCgoKCgoKBgYGBgoKCgoGBgIGBgYGAgICAgYGAgIGAgICDg4KCgYKCgYGAf4CBhYWFhoOCgYB+fn+BgoSCgYKDhIOCg4ODg4KDhISDg4OBg4SFhISFhYSDg4SFhYKEhIWFg4KBgH9/gIB/gIGEg4OEhYWEgoKCgoOCg4OFhIKDhISEhYaGhoaGhoWFhoeHhYaIh4aHiIeGhoaIiYeGhYaGhoeIkZKSkI6QjpCRjImHhYGBgoKCgoGBgYGBgoOBgYGBgYGBgICAgICBgYCAgICAgISEg4KBgoGAgYGAgYKIh4aHhYSCgH99fX6AgH+AgYGBgYGBgoKBgY+IgYGCgoKBgYGCgYKCg4GBgICAf4GAgH+AgH9/gIGBgYKCg4OEg4OEg4OCgoGBgoODg4SEg4SEhIOFhYaFh4eIh4eHh4eHh4eGhoaGh4WFhYaGhIWEhIWEhYaSk5GOjo+OkI6JiIeEgoKCgoKCgoGBgIGCgoKCgoKCgYGBgYGAgYGBgICAgYGAgoSDg4KDgoGCgYKDg4iHh4iHhYSCgX5+gICAfn5/f4CBgoGDgoCEmZGCgH+AgIB+gIKBgIGCg4OAf39/gICAf4CAgICDg4KDg4ODgoOBgYKCgoOCgYKCgoOCgoSDhISDg4SEhYWFhYaGhoaFhISEhYWEhIWFhYSEhISDhISEhISEipSTkpCQj46NiIaFhIOBgYKCgoKCgYGAgYKCgoKBgoKBgYCBgYCBgYGAgICAgYGAgoOCgoOCgoKBgoOCiImJiYiHhYSDgYKEhIOBgoKCg4SCf359fYiblYWEgoSCgX+AgoGCgoGChIOBgYGBgoOCgoKDg4SDg4SEg4OCg4KDg4ODg4KCgoKCgoGDhISEhYSFhYWFhIWEhIWFhYWDg4OEhISEhYWFhISEhISEg4ODg4OOlZKQkZGOjYyHhYODg4GBgoKCgoKBgYCBgoOCgYCCgYGBgICAgIGBgYCAgICBgICDhYSEhIODg4SDhIOGh4mIhoWDhIODhIWDgYGDgomIhX58fH1+gZqYhISFhISEgoGAgYKDgoKEhIOCgoGBhIWEg4ODgoKDhISDg4ODg4WFhISDg4KCgoKCgoSEhYSFhYWFhYODhYWFhYaFhoWEhIWEhYWGhYWFhIWEhISDhIODhJGUk5KSj42MioWEhIODgYKCg4KCgoKBgYGCg4KBgYKBgYGBgICBgIGBgH+AgIGAgYaGhoaGhoaHh4aGhYSDhYaCgIGBgYGHgoB/f4CDl5GGfYF+gol+kpiCgoKBgYKCgYCCgoKCgoKDg4KCgYKDhYODg4ODg4OEgoKEhIOEhIWEg4OCgoKCgYKCg4ODg4SFhYWFhIOEhYWGhYWEhISEhIOEhIWFhYWFhIODhIOEg4KGlJSTlJKPjYuHhISEg4KBgoODgoKDg4GBgoKBgoKCgYGCgYGBgYCAgYGAgICAgICAhYWFhYaGh4aGhoWGg4ODg4GAgoKCgYKAf39/f4ObnoWEin+AhH+CiYKBg4GBgYGChIOBgYKBgYKBgYKDgoODgoOCgoKCg4OBg4SDg4ODg4OEhIKCgoKDgoKDg4ODhIWEhISEg4OEhIODg4OEhIODg4ODg4SDg4ODg4KDg4KDgouUk5KTkY2NioaDg4OEgoGCg4ODg4ODgoGBgoGCgoKCgoKBgYGBgICBgYCAf4CAgICDhISFhYSFhYWEhIWCg4KDgoKDg4OBgICAgICAgZiih4WEiYZ+fn6Bg4OEgoODg4KAgICCgoKDgoKDg4ODgoODhIKCgoODgoKDg4KCg4KDg4WEg4ODg4SDg4SEhISEhYWEhIWEg4SEg4OEhISEhISEg4SEhYSDg4SEhIODgoKDkJSSkpKPi4yIhoSFg4OBgYKDg4ODg4OCgYGCgoKCgoKDgoCBgoGAgICAgIB/gICAgISDhYWEhYWFhYSFhYOEhIWDg4SEhIKCgoOCgoSBkJ2EgICBgX19fX2FhYWEhYJ/fX19f4KEg4ODg4OEg4ODhISEg4OEhISEg4SEhIOEg4OFhoWFhYSFhYWFhYSFhoWGhoWFhYWFhYWFhYWGhoWGhoaFhoaGh4aFhYWFg4SEhIeTk5KRkoyKiIWFhYWCgoGBgoODg4OCg4KBgYKDg4ODgoKBgIGAgICAgICAgH+AgICAhYWFhYWGh4eGhYWFhISFhYSEhISEg4ODg4OEhYOGjoKAf4WMgX19fYOHhoOAfn9+fn9/f4OEg4OEhISEhISEhISEhISFhYWEhYSGhYWGhYaGhoWGhYWHhYWGhYaGhoaFhIWFhYWFhIWGhoaHhoaGhoaHh4iIiIaFhYaEhYWGjZSTkpGQi4qHhoeGhIGCgYKDg4ODg4KDgoGBgoODg4KAgYGBgICAgICAgICAf4CAgICHh4eGhoeHiIeHhoaEg4ODhIODg4OEg4ODg4OEhIODgX+AhoaDgH9/gYaBf39/f39/f35/gISFhIWGhoaFhYWFhoaHhoaFhoWFhoeHh4iHh4eGhoaHh4eGhoaGhoaGhYSDhIWFhYSFhYaGhoeHhoaGhoeHh4eIiIeGhoaHh4eRk5KQkZCLiIiFhoSDgoKBgoODg4ODgoKDgoKCgoOCgYCBgICBgICAgIGAgIB/gICAf4aHiIeHh4eIiYmIiIODgoKDgoSEhIWEg4KCg4SEhIOAf4OGg4KDgoGAgH9/f39/gIB/f4B/f4WFhoeIiIeHh4eIh4iHiIiIhoaHiIiJiYmIh4aHh4eJiIaHhoeHhoaFhIOEhYaFhYWFhoaGh4eFhoeGh4aGh4eHh4eHh4eFh5OTkY+RkIuHhoWGhIKCgYGCg4ODg4ODgoKCgoGCg4KCgIGBgYCAgICAgICAf3+AgYB/hoiIiIiHh4iJiYmIg4KCg4ODhIWHh4aFg4OFhISEgoCBhYSDgYKBgYKCgYGBgYB/gH9/fnt6gIaIiIqKiYmIiImJiYmKi4qIiIiJiouLioqIiIeIiIiHh4iIh4iGh4aEg4OFh4eHhoWFhISDhYWEhYWGhISEhYWFhoWGhYOJlJOQj5GOioaFhoWDgYGBgoKDg4ODgoKCgoKCgoKCgYGBgYGBgYCAgICAgIB/gICBgH+GiYiIiYeIiImJiIiEgoKDg4KDhImKh4aEhIWEg4ODgoOEg4OCgoKCgoKCgH9+fH19fX9+fHt8g4eJi4uKioqIiIqJiImLiomJiImIioqJi4mHhoaGh4WGiIiJiIeGh4SDgoSIiIiIh4WCgoGDg4KDg4SCgoKDgoGEg4SDgY6TkpCPj4uIhYSGhIKBgYGBgoODg4OCgoKCgoKCgoGBgYGBgIGAgICAgICAgH+AgIGAf4WIh4eHhoeIiIiHh4SCg4OCgoOFiYqJh4WHhYSFhIKChIODg4OCgoKDgX59fX5+fn5+fX1+fX19g4eJioqHh4WGh4eHh4iHh4mGiIaIh4aJiIODhIOFhISFhYaIh4aFg4KCg4WHhoeGhoOCgoOEgoODhIKBgoGBgYODhIOEkZKRjo+Oi4eEhoaEgoGAgYGDg4ODg4KCgoKCgoKCgYGBgIGBgYCAgIB/gIGAf39/gIB/hYaGhYaGhoeHiIeGgYKEhIOChYeIi4qGhIaEgoaFgIKEg4ODg4OCgoF9fH1/gH9+fn59fH19fHp8hIaHhoSDgYODhIWFhYODhYSEhISEhIWEgoKDgYSEgYKDg4WGhYSCgYGCgoODhYOEhIWEhIaDhISFg4KDgYKDg4SFhIeSkY+Nj4yJhoSFhIWCgYCBgYODg4ODgoKCgoKCgoKBgYGBgYGAgICAf4CAgYB/gICAgICDhIWEhYWFh4eHh4aAgYGFg4OEhYSHiIWCgIB/gYCAgoODg4ODgoJ/fX1/gICBf31+fn19fX16enp+g4SEgoGBgIGBgoKBf36BgYGCgYOAgoGCgoKBg4SAf4CAgYOCgICAgICBgYGCgYGChIODhYSCg4SDgoKBgoSDhYWGi5ORjo+Pi4iFhYOChIGBgYGBgoODg4KCgoKCgoKCgoGBgYCBgYCBgH9/gIGBgICAgH+AgIKCg4OChIOEhYWGhn+BfoCBgICAgIGDgn9+fn5+fYCCg4OCg4ODgn19fn6AgIGAfn19fX1+fXx6enp/goKAf39/f35/f4B+fYB/f4CAgX+AgIF/f4CAgX59fX+AgX9/foCAgH+AgICBf4CCgICCgYGCgYGAgYGBgYKEg4aPkpCOj42Kh4eGg4OCgYGBgYGCg4ODgoKCgoKCgoOCgYGCgYGBgICAgH+AgICAgICAf39/gYKDhIGCgoOCg4SFgIB/fH19fn1+fn+Af31/fn1+gIKDg4KCgYF/fX1+f4CAgH9+fX19fHt7e3p6eXqAgH5+f39+fnx+f35/gH9+f3+Af4GAf359fn9/fn18fn+Af35+f3+Af39/f4B/f4B+f4CBf4B+f39/gH9/f4B/hZKSj46Pi4uHiYWEg4KCgYGBgYKDg4ODg4OCgoKDg4KAgYKBgYGAgICAf3+AgIB/gIF/f36BgYSEgYKBg4OCg4OBgH98fn5/fX6Af4B/foF/f4CBhIOCgYB/f359fn5/gICAfn19fX17e3x6enl5eXt/fn5/f39+fX5/foCAf35/f4CAgoB/fH5+f35+fXx/f4B/fn9/f4B/f35/foCAf36Af39+fn5/f35+f318fH2Fk5KOjIuKiImIhISEgoKCgYGBgoOCgoODgoODg4ODgYCBgYGBgYCAf39/f4CAgICAgIB/foCBhIOCgYGDhISDhICBgICBgIGAgYKCgoGBgoCBg4ODgYGBgYCAfX19fn5+f359fX19fXx8fHt6eXl5eX2Af4CBgYF/f4B/f4F/gICAgYGCgoB+gH5/fn5+foGAgYF/f39/gIB/f4B/gYB+f4CAfn9/fn+Af31+fX17fIaTkYyLioeHioiGhoSDgoGBgYGCg4ODg4OCg4OCgoKBgICBgYGAgH9/f39/gICAgICAgH9+fn+BgYGAgISGh4aHgoSDhYOBg4ODhYSEhISEg4ODhIKCgoKCgX5+fX19fn6AfX19fX19fX19e3p6eXl5eYCCgoKEg4CCgoF/gYCBgYGDgoODgYGCgIGAf4CBg4GEgoCAgYGBgYCAgYCCgn+BgIF/gIB/gICAfn9/fn18ipOQiomIiIiJiIaGhoSCgoGBgoKDg4ODg4KDg4KCgYCAgICBgYGAf39/f4CAgICAgIGBf359fn5/f39+g4aHh4iChYSFg4SFhIWGhYaGhoWGhYGBg4ODgoKAfX19fX19fn59fX19fX19fX18e3l5eXl4fIKDhIWCgYSDgoKDhYaCg4SDgYKCg4OCgoKCgYKFg4iFgoGBgYKCgYGBgYSDgoOCgoKCgYGBgIF/gIGAf36Ok4yHiIaIh4aGhYaGhIKDgoGCgoODg4ODg4OCgYGBgH+AgYCBgYB/gH9/gICAgH+AgYB/fn19fX5+f36Ag4SHiISGhoaFhoaHh4aHh4iHh4eGf32BgIGCgX59fX19fX19fX19fX18fH5+fnx7eXh3eHl5gIODf4ONhIOEhISXl4ODhIF9foGCgoGCgYKBg4aIjIWDgoKBhIKEg4KDhYSEhYOCg4OCg4OCgoKCg4OCgpKQi4iJh4mHhoaEhoWEhISCgYKCg4ODg4ODgoGBgYCAgICBgIGBgH9/fn+AgYCAf4CAgH9/fn1+fn+Bf4CCgYWFhYeGh4eGh4eIhoeHh4eGh4V+fX18fX9+fX19fX19fX19fX19fXx7iJKCe3x6fIZ5eHl8gYF+iZaEg4OEhJSTgIGBf39/fn6Fi4B/gICEhpCJhYSCgoGFhYuDgYKFhYaGhIOFhYOFhIODhIOEhISIko6MiYiIiYeHh4WGhYSFhIKBgoKDg4ODg4OCgYGBgYCAgICAgICAf39/f4CAgICAgYGBf39/f4CAgIGBgYGBg4OGh4aGh4aGiIeGhoaFhIOFhH59fHx8fX18fH19fX19fX19fX18fH+RlZaDe3qElHx4eXp7fICCg4GBgIOCgH58fn57iJF8fI6Wf31/f4KGioWDg4SDgYONiX9+f4OEhYWDhYaFhIWFg4SFhYaEhI6Rj4yKioyJiImHhYaFg4OCgYGCgoKDhIODgoGBgICBgICAgYGAgIB/f3+AgIB/gICAgX5+f4GBgoKCgoODgoOCgoWGhISFhYSGhIOEg4KBgIKAfn19fHx9fXx8fH18fH18fX19fHx8e4uRl4x6e3yBenp6e3x5eX19foB/gH98e3t+fn2ClZF/hIh+fH5/goR8fIGChIKAf4eDfYKBf4KCgIODhISEhISChIOEhYKEkZGOi4yMjoqJiYWFhYODgoKBgoODgoKDg4KCgYGAgIGAgICAgICAgH+Af3+Af357gICBenyAgYKDhYODhYWFhYODg4SCgYKDgoOCgoGBgIB/gX5+fX59fHx8fHx8fHx8fHx8fHx9fHx8fn6Kgnt6e3p4ent7fH17fn1+f319fX18fH+BgX2Gj4F+fYJ+fn6Agnx8f3+CgIKAfnx7ioJ9gH9+gYCAgYKBgoCBgYGAf4uTj4yLjY6NiIeHhYWEhIOCgoGCg4OCgoODgYGBgICAgICAgH9+fXx7fHx9f3+AgHx6gYF4e4CCgYOFhIOFhIaHhISAhpSIgIKBgYGBgH9/f39/fn5+gHx8fHx8fHx8fHx8fHx9fHx8fHx8fHl7e3t4eHl7enp8gX+Afn+BfH5+f399gIKCgICAgX+CkYF/f4CAfoB+fn9+gIGBfX19e319fXx9fHx9gH+AgH6Afn6Ck5GMjI2NjoqFhoaFhISFg4OCgoODg4OCgoGBgYGAgICBgICAf4CAf39/fXt6fICAgHh+gXd7gIF/gYKCgoKDhoeGhn6IlYp+gYGAf4B/foB+f39/fn+Bfnx7e3x8fHx8fHx8fH59fHt9fHx8e3x8fHp6eXt8en2Fg4J/gYF+f35/gH6FgoF+gH9+foCFhoKAfn6Dhn9+fH6AgIGAf39+fX19fX57fH1/f3+AfX9+gIyRjYuNjo2Nh4SGhoWEhISDg4OCg4ODg4KBgYGBgYCAgYGAgYGBgYGAgH9/f397en9/e3mAd3p/f31+f3+Af4KDhoaFf3+FgX5/gIB/gH5+f31/gIB/gIB/f319fHx9fn18fX19fX19fH58fXx7fXx8ent6fH19f4aEgoCAgX1+fX5/fouEgYZ+fXx8f36CgX99fX19gXx7fXx+gYSDgYB+fn5+fX1/f399foB+fn6EkoyMi46Ni4qGhIWEhISDg4OCgoKDgoOCgYGBgYGBgYGBgYB/fXx8fH1+f39/f397e399d352eH59fH18fX5+gYGCg4B6fX18fn+Af36Af35/fn+AgH+AgH9/fn9+fn5+fn1+fn99fH59fn19fHt8fHx6e3p9fn+Ag4OCf35/fH18fXx8gYN+jH58e3t9fn1+fn17e3t9fHp7e3uAhoSChIOCf4B+f4KCgn9/goJ/gIqPjIyLjYuKiISEhIOEg4ODgoKCgoKCgoKBgYGAgoGBgYKCf3+AgIB/fn18fH5/fn55fX52e3Z4fXx8fHt9fX6BgICAf31/f31+f39/foB/f39+f3+AgIGBgH99gH9/fn9+fn5/f3yCfn59fX17e319fHp8fH6AgoGAgIB8fH18fHx8fH18fnt/fnt7e3x8fH18e3t7e3x8enp9en6CfoGDhIKBg4GFhoWFhoaHhoGEkY6Mi4qLh4iFgoOEhISEg4KCgYGCgoKBgoGBgYGBgoGBgoKAgYKBgYCAgH9+e3x+fnx6fnh5dnd8fHx7e318f4GAf35/foB/f35/f35/gH9/f39/f3+AgYKAfn6BgIB/f39/f39+fYN8fH19fH99fX19e3x+fn9+fn5+fnx8fHx8fHt+fnt8e3x8fHx9fH18fnx9fHx7e3x5e3x7e317fX5+f4CAg4eJiYmKiIuJhYiRjouIiYeFhYOCgoOEhIOCgoKBgYGBgYKBgYGBgYKCgoGCgoCAgX98e3p6eXt9enx+fnl8eXh4dHx8fHt8fHx+gH9/f39/gIB/fn5+fX+AgH9/f3+Af4CDgoB/gIGAgIB/f4CAgH58enx9fX59fX5+jIZ9fX57e4OCfX5+fX18fX19fX1+fH17fXx9fX58fn19fX18e3t6fHt8fHt6e3t6enp7fn6DhYiHiIqLi4uJjJCOjYmIhoWEgoKCgoODg4OBgYGBgYGBgYGBgYGCgoOCgYKBgIGBf3+Af356eHl5en5+e3l6eH5zfHx8e3x8fH5+fn5/gH+AgIB/fn9+gIF/f4B/gIGAgoSEgYCAgYGAgX+AgYKBf39+f31+gH57foGRjHx9f4qAjYx+fn19fX59fX59fHx8fn18fXx9fX1+fX1+fnx7e3t8fH18e3p7fHl6eXh5e35/hIOEh4mKiImNj42LiIiFhISCgYKCgoKCgoGCgoKBgYGCgYKCgoGCgoKBgoKAgYGAf4CAf39+e3p5e319eHx6f3KBfXt7fHx8fn59fYGBf4GBgX9/gH+AgX9/gIGCgYGFg4SCgYGCgYKCgICBg4KAf4F/fX6Afnx/f4iCf36DkISEg4F/fn18jYd9fX59fHx/fnx9fXx9fX5+fX5/fX19e3x9fnx8e3x9enp5eXl5e3t+foCBg4eEiI2MioqGhYSEg4KBgoKCgoGBgYGCgoKBgoKCgoKCgoKCgoGCgn+AgIB+f39/fn5/ent5fX16enp9cX6Cent8fX19fXp4f4KAgYKCgICBgIGBgICBgoKCgoWFhIKBgYGBg4F/gIKEgX9+gYB9foF+fX5/gIB9fn+EgH5+f31+fX2KhX1+f31+foB/fX19fH5+fn99f4B9fn18fX9/fHx7fH17e3t6enp7e3x9fn6Ag4CJjYqLh4WFhYSDg4KCgoKCgYGBgoKBgoKCgoKCgoGBgoKBgYKCf4CAgH9/f39+fn59eXp6fXx5d3t0e4d8dHd9fn17e3Z2foCBg4KBgYKCgoKBgYGDg4OChYaEgoCAgICDgX+AgYOBfn6AgH1+gH59fn6AgH+Bfn+Af35/f398f39/f3+Afn9/gH58fX18fn5+foF/gH2CgHx9gIB9e319fXx8e3x8e3t7fHt8fHx9fImKiIiFhYWFhISDgYKBg4KAgIGCg4KCgoOCgoKCgoGCgoGBg4J/gIGAf39/fn5+fn57enp8fHt2e3R3f352cnt+fnt4dnd8gIGCgoKBgoODg4OCgoSDhIOFhoOCgX9/gIOAgICAg4F+foCAfX+AfX1+foCAf4J/gYGAgICBf31/f3+AgIGAgIB/fnx9fX19fn59g32AfoKAfX6AgX98fn59fX17fH58fXx8fHt8e3x9iYWGhYWHhYSFhIKBgoGDgYCAgoKDgoKCg4ODg4KBgYGBgYGCgH6AgYB/fn5+fn5+fn56e3p9goN9dXF6fHpxen59eXh1dICAgoKCg4KDhYOEg4KDhISEhIWEgYGAgH6Agn9+f36Bf35/f4B9foB9fX1+gH9/gYCCgYCAgIKBfn6Af4GAf4CAgH9+fX19fXx+fn19gYR/gH9+f4GBf31/f319fn1+fn1+fHt8enx7eoCGgoSEhYSEg4WDgoKBgYKBgICCgoOCgoOEg4SDg4KBgYKBgYOAfoCBf35+fn5+fX5+fnt7en6Jh354cnl9f3F6eHt4eXV1fYKDgoODg4OFhIWDg4OEhIODhIKBgH+Af4CBfn19fn9+fn5/gH19f3x9fX6Af4CAgIKAgIGAgoGAf4B+gIF+gIGAgH9+fn5+fn5/fn6FhYGBgH+Ag4F/foGAf35/foB/fn17ent6fHt6goR/g4KCgoKCg4GBgYCAgoGAgIKBg4KBg4SDhIKEgoGBgoGCgn9+gIF/fn1+fn5+fX59fXp7fIWEe3tzeXp8cHd1dnd5dXR6hISBhISDhIWFhoSDg4WEgoODgoCBf39/f4B9fX1+f31+f39/fn1+fH19foF/gIB/gIB/gIGDgoGAf36AgH+AgYCBgH9/f39/f4CAgIGCgoKBf4GDgX+Ag4J/f4B/gX+Af3x7e3p8e3yBgH+Cf3+BgIKCgYF/fn+BgH6BgoKDgYGDg4KEgoSCgYGBgIGCgH6AgH9/fX5+fX19fn19e3t6gH94fHZ5eXtxdHh3dnh1cnmFhYKEhIKEhYWGhISChIOBg4GAgIF+f4B/gHx9fX6Afn5/f39+fX98fn5+gX+Bf39+f4B/gIODg4F/f4GBgIKBgYGAgICAgICAgIGAgYKDgYF/gISAfYGDhICAgX+BgYKBfXp7e3x8fH99f4B8f399fYGAgH59fYB/foKBgYKBgIKCgoKBg4KCgYB/gYKAfn9/fn99fX1+fX19fX19ent7fHZ9eXh5enJ1eXl2d3dzdYaFg4WFgYSEhYSEhIKDgoGDgX+AgX5/gH6AfX19fn9+f4B+fn99f3x/f3+BgIF/f3x+gH6AgYKDgYCAgoOEgoGAgYB/goCAgYGAgYGCg4KBgX+Ag4B+goKEgICCgYKChIJ+e3t8fHx8fX1+fXp+fX14fn9/fHx8fn5+gYCBgYCAgoGBgYGDgoGBf4CAgoB9fn19f319fX59fH19fX16e3p8dnx6d3t4cnZ5e3Z2dnN0hoSEhYSBhISFg4OCgYOBgYOBgIGBfX+BfoF9fX1/f39/gH5+f359fYB/gIGBgX9+fH5/fn5/gYJ/gYGCg4eFgX9/fn6Af4CBgICAgIKCgYCAfoCCf36BgoKBgYOCg4OFgn99fX18e3x8eXp7en55e3l4f357e3t+fX1/f4F/gH6BgICAgoOCgYF/gIGBf31+fH1+fX19fX18fn58fXx5e3x4enx3endzeHd6c3Z2c3SGhISFg4KDhISDgoKCg4GCgoGAgYF8gIB+gH1+fX5/gICAf35/f3x+gH+BgIGAf359f39+fn+BgH2AgIGDg4N/f359fn5+f4CAgIB/gYKAgH9+f4F+f4CCgoCBhIKEhIaEgH59fHx8fHp5dnl5enl2eXZ+fHt7e359e399gH99fX9/f3+BgoGBgX5/gYF+fX18fX19fX19fXx+jYF8fXl7e3p5fHd4eHR1dXhyd3d0doaEhIWEg4ODg4OCgYKDgoGDgn+Bf39/fn+AfX19fX+AgIB/f39/fIB/f4GAgYCAf3yAf31+fn9/fX5+gIGCgn5/fn1+fn5+f3+Af32AgIB+fn5/gX5+gIKBf4GDgoOEh4SAgH58fXx8e3x1eXl4eHh5d3t8e3p7foV9fn1/ent+fn59foGAgIGAfX6BgH59fXx9fX19fX18e32Dgnx8ent7e3p7d3Z4dXJzdnB4eXJ4hYWFhYOEg4KChIKBgYKBgIKBgIF/fn5+foB+fX58foCAgH+AgX97gH6AgH+BgYB/fYB/fn5/f319fX6AgYGAfn9+fn59fX5/fn9+fH+Af35+fn+Cfn6AgIF/gYOCg4OGhICBfnx9fHx7fHh4e3h1eXd3eXx6e3t9kod9fH13en1+fn19f35+gH98foB/fn19fH19fX19fHt8ent9enp4e3x6ent4dHh1cXJ0cHh4cnmEhYWFg4SDgoODgoGBgoKAgYGAgIB9fn5/gH18fn1/gIGAf4CBgHyAf4B+f4GAf39+gX9+f39+fX18gICAgIB+f35+fn18fn9/f358fYB/fn1+gIJ/foCAf36BhIKCg4WFgoJ+fnx7e3x8eXd8eXd4d3d4e3t6e3yFin17end6fH19fHx9fX1/fnx9fn59fXx8fX5+fX18fHt6enx7e3p5enp7enhzd3VxcXJweHdxe4WGhIWDhYKBg4OBgYGBgoCBgICBgH5/fn9/fXx+fYCAgoGAgIGBfX6Af35/gX+Af3+BgH9/f31+fH1/gICAgH9/f35/fXx+f39/f319f39+fn6CgYF/gIB/foGDgoKEg4SCgn5+fHx6fHt7eXt6d3N2d3h5e3p7eXp/fnt7d3p8fXx8fH59fH19fH19fXx8fX19fX99fXx9e3l7fHx8enp6enp6eHN2dXBwcm93dnJ7hYaEhYOEgoGDgoKCgYGCgYKBgYGAf4B/f399fX9+f4CBgYF/goF9foF+foCBf4B/gIKAgIB+fX58f3+BgICAf4B/f4B+fX5+f4B/f39/gH9/f4J/gH9/gIB/gYGAgISBgoKAf39+f3x9fn56fYV+dHx9enp6enx5eXp6hoV3eXx8fHx8fXx8fHx8fX19fHx9fX19fn19fX16eX18fH16enp6enp5c3V1b29xb3d0c3yFhoOEgoOCgYKBgoKCgYKBgoGBgYCAgICAgH59gH+Af4GCgn+BgX+AgX5/gYB/f4CAgn+Bf319f35/f4KAgICAgIB/gIB+fn1/gH9/gIB/f39/gH+AgICAgH+AgYCBgYGCgYCAf39/fn1/fnuBk416fH18e315e3p6eHmBgXh5e3x8fXx8fHx8fHx9fX18fH18fn1+fn59fHp8fHt8fXt5enp6eXlzdXVvb3Fwd3N0fYWGg4OCg4KAgYCCg4KAgYGCgYKBgYCAgIGAfn6Af4GAgYKCgIKCgICCfoCBgX9/gX+BgIF/fH6Af3+AgoCAgICAf3+AgH9+fX6Afn2AgIB/f3+AgICAgYCAf4CAgYCBgYKCgICAf39/fX5+fIGGiXx8fnt7fnl6e3p7jn53d3l7fHt9fHx8fHt9fH19fX18fXx+fn5/f358enx9e319e3l6e3p5eXN0dW5zcXB4cnV6hYaDg4KDgoCAgIKCgX+CgYKBgoGBgYKAgYF/fn9/gYGCgYKBg4OAgYJ/gYGBf4CAgIB/gX99f4F/gICBgICAf4B+gICAf359foB+fn+Af39/gH9/gICBf4CBgH+BgIGCgoKAgICAgIB9foB9gIOCe35+e3x9e3p8e3uHeXh4eXx8fH17fHx9fX18fH19fn19fX5+f3+Af317fH18fHx7enl7e3l5c3J1bnZycHhxdXaFhYOEg4KCgICBgoF/gIKCgoKDgYGDgoCCgYB/gICCgoKBg4KEhICBgX6BgoF/gICAgH+Cf36AgYCCgICAgIB/gH+AgIB/fn2Af39/f4CAgH+AgH+AgYF/gICAgIGAgYGBgYGAgYCAgH9/gH5/fX59fn57fXx9e3x8d3h1eHh5e3x8fXx8fHx8fX5/f39/fn19fn9/gIGAf3x9fHx9e3p7eXp8eHpzcnVud3FxenF2d4WFg4ODg4KBgYKDgH+CgYSDg4SBgYOAgoOBgYCAgIKDgoCCgoSDf4GAfoKDgICBgICAf4CAf4GBgIKAf4CCgH9+gICAgICAf4CAgH+AgICAgIB/f4CBgYCAgICAgYGAgoOCgoCCgYGCgYB/f4B/gId+fnx6fXx7fX94d3Z5eXp8fXx8fXt8fH19fn5/gIGAfn1+gICAgoGAfH59fX58d3t6ent5eXNxdW53cHV6cXZ5hYWCg4KDg4KDhISAgIOBhoOEg4GChICEg4KCgICCgoSBgYKChIJ/gIB/gYOCgYCBgYCAf4GBgYGAg4F+gIOCf35/goGAgIB+gYCBf4CAgYGBgYCAgIKBgYKBgH+CgYGBgoOCgoOBg4OCgYCBgH+AhH19fXx/fXp9f3p5dnp4eXt7fH19e3x9fX19fn+AgYGAgH+AgICDg4B9f35+fn15eXt6enp5c3J1b3dxd3lzd3uFgoKDgoOEgoOEg4CAgoOGg4ODgoKEgYSDgYKAgIKBhIGCgoGCgX6BgICCgYKBgYKCgIGAgICBgoGEgH6Bg4F/f4CDgoCBfoCCg4KAgYGBg4KDgoGBg4KChIGAgYOBgYKEg4KEhIODhIODgYGBgYCCf4B/fYB8enx/e3t3fHl5eXt6fX59fHx8fH1+foCBgYCAgIGBgYSEgH2Af39/f357e3t6e3p0cHhyeXR2eHR3e4SCg4KDg4SChIODgYKChYaEgoODg4SBhISAg4CBg4KCgoKCgIKAf4GAgIKBgoGCgoKBgIGBgYOCgoOAfoGDgX9/gYSEgYN/goKBg4KCgoGEg4OEgYKEgoOCgoGCgoOBg4SDhISEhISFg4SCgYOCgoOBgYGAgH58fIB8fHh8eXp5enx9f3x7fHx9fX18fICAgICAgYGBgYKBfoGAgICAf3t7fHp6enVweHd5dnV8dXZ8gICDgoODg4OEhISAgoOGhYWDg4KDhIGEhYKCgYKDg4GCgoKAgYB+gYCBgYKDgoKCgoGAgYKCg4KCg4B/gYOBgICChIODgoGCgoGDgoKDg4ODg4SAgoSDg4OBgX+Bg4KDhYKEhISEhISDhISChIOEhIKBgoGBgHt+gX59eXx6enp9fXyBfnp8fH19fHp7fn5+gH9/gYGAgICAgIGBgIB/fX18fH18dnJ2eHh2dH92dX2Hh4OChIWDg4SFhICChYWEhIOCg4SEgISFg4KCgoODgYOCgoCCgH2AgIGCg4KCgoKEgoGCgoOEgoKBgICBgoGAgYOFhIOCg4CCgoOCg4ODhIOEg4CCg4KEg4KCfoOCgoSEgoODhISEhIOEhIOEg4WEg4ODgoKAe4CBf3x8fXp6e32AfX9/fHx6fH59fH19fn5/f39/gICAgH9+foCBgICAfnx9fX5/fn18e3h2f3Z3f4SHg4KDhYODhIaEgYKFhoWEhIODhISChIWFgoKDg4SCg4KDgoKBfoCAgoKDgoODg4SCgoKCg4OCg4GCgYGDgn+ChISDg4KEf4KEg4ODgoSDg4SCgIOEg4SDg4KCg4KChIOCg4OEhISEhIWEg4OEhYSFhIOBgoB9gYKAfXx8e3x8gH19foB+fn1/fnx9fX19fn5/fn+BgYGBgH99fX6BgYB+fn19fX59fX5+f3+AfH2AgYKCg4OGg4SDhoSBgoiHhYSDg4SEhYGFhYWDg4SDhIODgoOCg4F+gYGDg4SCg4OEhIOCg4KEg4ODgoKDgYOCf4KEg4ODgoOAgoWDg4ODhIODhIOBgoSEhYOCgoODg4GEg4GDg4SDhISEhYSEhIWFhYWEg4ODf32BhIB9fXx8fHx/gX5+f39/fX99e3x9fX19fX5+f4CBgIGBgH59fH6Cf39+fn5+fX1/f39/gICAf4CEhIODhIWDhIOFf36CiouFhISDgoOFgYaGhoOEhISEhIODg4OEgn+BgYODhYSFhIWEg4KEhISFhIODgoSDhYKBhISFhYaEgoCDh4SDg4OFhIWFhIGEg4OGgoOCg4GCgYSDgoODhYODhYWEhYWHh4aHhYSEhYSAf4GDf35+fH5+fX+BgH9+fHx/f358enx9fX19fX5+fn9/gIGBf319fIB/gH5+fn5+f3+AgYGBgYKAgYWFhIOEhIKEg4aAgoWFiomEhIOEhYWDh4aGhISFhIWEhISEg4SDgYKDg4OEhIaEhYSDg4SEg3yDhHuBhHd5g4F9hH5+cnWDgoF2foOFgX2BdYF5g39/gH6EhIKDg4KBg4SDg4SFg4SFhoSFhn2EeXx+f4N7hYKBhIOAf319fn1+gYOBfXt/fX6Afn18fHx9fX19fH19f4B/gYJ/fX18f4GBgICAgH+BgYGCgYKDg4KChoSEg4WEgYOEhYOEhYSKiIWFhYOFhYSGhoaDhIWFhYWEhYWEhIWCgoOEhYWFhoSFhIOEhYWCaICFanx7cXF8gXOGc3R0fYKDdXNxg4Z0cHVyc3SDdnt9dYF/goOBgnZ5hYCDgIR/hYSChYWCaHpyc3N8gHOCg3+Dg32BfX5+fX6Cg4J8f4F9f4B9fXx8fHx9fHx8fn1+gH+BgX99fX2AgYKBgYGBgIGBgYKBgoKCgoSHhIWEhYSBgoSGhoOFg4aIhoaFg4aGh4eGh4OFhYaFg4KFhoSFhYODg4SEhoaGhIaEg4SFhn1xe4FweXZ+g3+CbnlwdXN8dnl5hXKEg3B2eHF2dHR1cnN0dml/gG5yb3R2bnVsd217c26Ah3ltfXJzdnN2bW14bHB5bHV9f399foGAgX2Af32Af4B/fX18fH19fH1+f32Af4CAfnx/foCBgoCBgICAgYCAgIKDgoOEhYiGhoCChYODhIeGg4WFhYaHh4SDhoeIiYaHhIWGiIeEg4WGhYWEhIOFhIKFhoaFhoWEhoWHdnB0e3BydX+HhYNtdW92b3x1coR5eYd4cXR3bndod3pucHaCcoN+b3p5eW1vbnpvb213fXiGcHF6cHJ0ZoF1fm57eXNveX+Af319gYB/fH99fIB+gIB+foCAgYB+fn9/foF/gH9+fYB9f4CBgIB+fn+BgH9+goOCgoSFh4eEfoeEg4OFh4aEhoWFhoaIhISGh4iIhoeEhoaLioWEhoeHhYSFhYWEgoaGhoWGhYWGhYZxdXByc29zenl+hHSIdHV+iHZugnKEhnluanJ/cW1zd3x/dXR8hH54cXV3bnl1enF2eHV6eYRxam95eHBreXN6b3p3dnZwgYB/fn5/f356fn19f31/f359gIGDg4CCg4GBhIKBgIGBgH1/f4F+f359f4GAfn6BgoCAgoSHhoODhoSFhYaHhoWFhYWGhoiFhYaFh4eFhoSGhomIhYSJioiGhIaGhYWDhYaFhoaGhoaFg3iLeXKIentwcIWEeIV4eWtzfnl7a3KDh4N6fG17eXl0fYB2bm+AgG90fHV3cXl9fW1+dW+DhYZ6gHJye3x1cG96bHN8bneCgIF+fn99fXt9e3x9fX9/fn1/f4KCf4GDgYGDgYB/gICAfn9+f31/fn1/gH58fYGAfn6Ag4iFhoOFhYWFhoeFhYWFhoeHiIaEhoWHhoaFhIWFhIWFhomKh4aEhoWGhoWGhoSGhoaGhoWGh4eHhoaEhoWGh4iHhYeGhoOHhoWFg4SFhoWGhIaEg4SEhoSEgYODhISFhIWEhYSGg4aHhYaEhIWHhoSEhYaEhX13hYOEhIKBgX1/fnt8e357fHx9f359fH59gIB9f4F/f4GAfn5+gH5+f35+fX99fX5/fHt8f358fH+BiYaFhIaGhoWHhoWFhYWGhoeIhoSGhYaGhYWDhIWGhYSGhoaGhYSGhIWGhoaGhIeGh4eGhYeIiIiIhoSHhYaGiIaFiIeIhYeGhoiFhYaHhYaGhYOChYWGhYWDhYSEhIWEhYWEhYWDhoaGhoWEhoeGhISFhoKEhIKEg4OFg4OCfYB/e3t8fnt8fH1/fnx8fn2Af31+gH5+gH99fXyAfX5/fn5+f3x8fX57fHx/fHt7fn+Ih4SEiIaGhoeGhYWEhoaGhoiHhIWGh4aFhIODhIaFhIeFhYaFhYaEhYaGh4eFh4aJiIaGiIeIiYiFhYiFhoeGh4aHhoeFh4eGh4WFhoeFh4aFgoOFhoaEhIOEhIOEhoSFhYWFhYOGhoWGhYWGhoWEg4WFgoSHhYOCgoWDhIF+gIB8e31+e3x7fX59fHx+fX5+fH9+fX1+fnx9fH98fn58fYGAfXx8fXx8fH56e3t8foiHgoWIh4eGhoaGhISGhoeGiIaEhYSGhoSFh4OEhYSFh4SFhoaFhoSGhoeHhoaHh4mIhoaIh4iKiIWHiIWHh4WHhoeGh4WIiIeHhYaGh4WGhoWBhISFhoWFhISEg4SFhYaGhoWGhIaFhoeFhYaGhYSDhIOCg4eDhIGChISDgYCAgHt7fn58fHx9fXx8fH19fH18fn18fX18fHx8fXx+fXt8gX99fH18fnx8fHp6fHx9iIeChoiHhoeGhoaEhYaFhoWGhYOFhIaFhIiJg4GEg4SGhIaGhoaGhIeHiIiHh4eIioiGh4iHiImIhYiHhYeGhoeHh4WHhoiIh4eFh4eHhYaHhIKEg4SGhYeFhISEhISFhoaGhoaFh4aGiIWGhYeFhIOEg4ODh4GDgIKDg4KCgn+Ae31+fXt8fH59fH19fH17fHx8fHx8fXt7e318e358e3x/fX18fX1+fXx6ent7fHyIh4KGhoaGh4aGhYSFhoWFhYWEg4WChoSDiId/enqChYaEhoaFh4aEh4eJiIiHhoiKh4aHh4eIiYeFiIeGiIeGhoeHhYeGiIiHhoWHhoiGhoeDg4SEg4aGh4WFhISEhYaGhoaGhYaHh4eIhoaEhoWDhIODg4OGgYN+goKDgIOCf398f35+fHx9f318fX18fXp7e3p7fHx8e3t7fnt7fXt7e358fHx8fX5/fXt6fHp8fYmHg4aFhoWGhoWEhIWFhYWFhIOBhYGGhIKEhHyAhn+ChYWGhYWGhYSHh4iIiIaFiIqHhYeGh4eIh4WIhYaHiIaGh4eGh4aIiIeFhoeGh4WFh4OEhoWEhoaHhoWEg4WFhoaGhoaFhoaHh4eHhYOGhYKBgoKAg4WCg36BgYF/g4F/fn5/fX98fH1/fXt9fXx+enl6eXt8fXt7e3t+fHx8fHp7fXx8fHx+fYF8e3t7e3x7iYeEhoSGhIaGhYSFhoWEhIOEgoCDgYWCgYJ/eoSMe4CEhYeGhoaFhIeIh4aHhYWHiYeEh4WGhoiGhYeEhoeIhoaIiIeHhoeIhoSGhoaHhYWHg4SFhIaGhoeFhISDhYWGhoeGhoWGhoeGhoaEg4SFgoGCgYCDg4OCfYGBgH6DgX5/f4B8f3x9fX59e359fH15eXp5e319enp7e318fXx8ent9fHx9fH5+gHx7e3x+fXyIh4WGhYaEhoSFhYWFhYODgYOBgIKBhYJ/gH9/fXx7gYSFhoaEhYSDh4eGhoaFhIaJhoKGhIaGhoWFh4WHiImGhYiHiIeGhoeFhIaFhYeFhIeDhIWEiIaGh4WFhIKFhYaFh4aHhIaGhoWFhoODg4WAgIGAgIOBg4B8gYB+foKAfYB/gXx/fH1+fX57fn18fHl6enl6fX15ent7fHt8e3t6e319fH18f35+fHt7fX59fIiGhYaGhoSFhYSFhYSDgoKAgoGAgICDgX5+foB5en2Ag4OEh4WEg4OHhoOEhYSChYiFgoSDg4WFhYWHh4aIiIWFiIeJh4aFhoWDhoSFh4OEhoSEhYSHhoWGhYaEgoWFhoaGhoaEhYaGhYWGgoKDg39+gICAgYCDgHuBf31+gn5+gH6Afn99fX59f3t/fXt6eXp6eXp8fXl6ent7enx6e3t7fH19fXyAfn18fH1/fnx7h4WFhoaGhoSFhIWDhYKBgICAgYB+gIKCfX5/f3t/f4KDg4WGhYSDgoaDgYOEgoCFh4WCg4GBhIWEhIaGh4iHhYWIhomHhYSEhIKFg4SGgoOFhIWGhIeGhYWFhoOEhYSFhoWGhIOEhYWDhYWBgIODf35/gH9/gIN/e4B9fX+CfYCBfn6Bfn5+fX1/e398e3p5enp5ent8eXp6e3t7fHp7e3t7fX59fYB9fXx8fYB/fXyGg4aGhoaGg4SDhYKFgYGAf3+AgH5/gIF8fn9/foCAgYKChIWDgoGChIGAg4KBgISFhYKBf4CCg4OEhYWHhoWEhoeFh4WFgoOCgoOCgoWBg4WEhYaEhoaHhoaFgoSEg4SGhYWDhIODhIOFhIB/goJ/fX5/fn5/hH57f3x8gIF9gYB9fYN8fn59fX57fnt7enl6enl6ent5enp6e3t8ent8e3t+fn1/gXx9fHx9f4B+gIaEhYWEh4SDg4KGgoOAgYB+fn+AfX9/gnx9f39+fn+BgYKEg4KBgYKCf4CBgoCAgoWEgoB/gIGCgYOFhYeFhISGhoOFg4WBgoGBgoGCg4GChISEhYWGh4eGhYSDg4ODhIWFhIGDgoOChIODgH+AgX59fX5+fH6Dfnx+fHyBgH6Cf31/gnx/f319fHx8e3t6enp6eXt6enp5eXp6e3x5e317fH5/f4GAfX59fX1/gICAhoSEhYSFgoSCgoSCgoCBgH59fn9+fn6AfX2Af35+foGBgoODgoSHgYF+gICBf3+ChIOBf35/gIJ/goWEhYOCg4WFgoSBg4CBgIGBgYKBgIGEg4OGhYWHh4WEhIWCgoKDhYSCgYGBgYCFg4F/foB/fnx9fn18foN9e358fYF/gIN9fYCBf35/fXx8fH17e3p6enl5e3l6enl6ent7e3p7fXx8f3+BgoB+gH+AgH+AgYDKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzNzc3Nzc3Nzc3NzczMzMvLy8vLy8vLy8vLy8vLzMvLy8vLy8vLy8vLy8vMzMzMzM3Nzc7Oz8/Pz9DQ0NHR0dLS0tLS0tLT09PT0tLS0tLS0tPT09TU1NTU09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tLS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1dXV1NTU1NTT09PT09PT09PT09TU09PU1NTU1NTU1NTU09PT09PS0tLS0tPT09TU1NTU1NPT09LS0tLS0tLR0dHR0dPHhnNlYFtLWWdVTUZIQD03Nzg5Nzw8PDo8Oz42Oj04PDs6OTg3ODs7Oj87PTs8PD47P0E/QkJBQ0RFREE+PTw7QENDQUBDQ0FBR0hHSUtSwtXS09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXVysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMy8vLy8vLy8vLy8vLzMzMy8vLy8vLy8vLy8vLzMzMzc3Nzc3Oz8/P0NDQ0NHR0tLS0tLS09PT09PT09PT09PS09PT09TU1NTU1NTU09PT09PT09PT09PT09PT1NTU1NTU1NTT09PT09LS0tLS0tLT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1NTU1NPT09PT09PT09PU1NPT09TU1NTU1NTU1NPT09PS0tLS0tPT09PU1NTU1NTU09PT09PS0tLS0tLR0dHSzIxyZ2BcTVllUktHSz87Mzc4Ozg5Pj05PDpBOjs9Nzs8PDo6Nzg6Oz0/Oz88PTw/Pj9BPUFBPkNDREJAQT46Oz9DREFDRERCQklHSEhJTr7V0tPT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1crKy8vKysrKysrKy8vLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzMzMzMzMy8vLy8vMzMzMzMzMzMzLy8zMzMzLy8vLzMzMzc3Nzc3Ozs/P0NDQ0NDR0dLS0tLS09PT09PT09PU09PT09PT09TU1NXV1dTU1NTT09PU1NPT09PT09PT1NTU1NTU1NTU1NPT09PS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1tbV1dXV1dTU1NTT09PT09PT09PU1NTU09TU1NTU1NTU1NTT09PT0tLS0tLT09PU1NTU1NTU1NTU09PT09PT0tLS0tHR0s+Sd2hfXk9XZ01LRks9ODc2NTk5OTw+OT88RDo7PDc5PD07OTc5Ojw9QDs+PT47PD48PT5BQD5EQ0NDP0E9Ojs9QkNFQ0NEQT9FSEpJSky61dPT09TU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8rKysvLy8vLy8vLy8zLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMzMzMzMzMzMzMzMzMzczMzMzMzMzMzMzMzMzMzc3Nzc3Ozs/Pz9DQ0NDQ0dHS0tPT09PT09PT09TU1NTU09TU1NTU1NTV1dXU1NTU1NPU1NTU09PT09TU1NTU1dTU1NTV1dTU09PT09LS0tLS0tLS09PT09TU1dXV1dbW1dXV1dXV1tbW1tXV1dXV1NTU1NTT09PT09PT1NTU1NTU1NTU1NTU1NTU09PT09LS0tLT09PU1NTU1dXV1dTU1NTT09PT09PT0tLS0dHRmn5nYWJOVWpKSElLPzw6OTM3Njc3PTs+OT06Ojo4ODo7Ozg4Ojs7PD46PT09Ojw/PD0/QkA/Q0RDRD5APT08QENEQ0JEQkQ+REhJSUtMttfT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3MzMzMzMzMzMzMzMzNzc3NzczMzMzMzMzMzMzMzc3Nzc3Ozs7Pz8/Q0NDQ0NHS0tLT09PT09PT1NTU1NTU1NTU1NTU1NTV1dXV1NTU1NPT1NTU1NTU1NTU1NTU1dXV1NXV1dXV1NTU09PT09PS0tLT09PT09PU1NXV1dbW1tXV1dbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1NTU1NTU1NXU1NTU1NTT09PT09PT09PU1NTU1dXV1dXV1dTU1NTU09PT09PS0tLR0p+DaV9kU1hsSEhIS0A9Nzg0NzY6Oj87RDw8OTw8OTg6OTo6Ojs8Ojo7OT49Pjk9QDs/QUFCP0JCQUM9Pz8+PEBCRUNDQkBBO0ZJR01MSbLY09TU1NTU1NXV1dXV1dXV1dXW1tbW1tbV1dXW1svLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzM3Nzc3Nzc3Nzc3Ozc3NzczMzMzMzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc3Mzc3Nzs7Ozs7Pz8/P0NDQ0NHS0tLS09PT09PT09TU1NTU1NTU1NTU1NTV1NXV1dTU1NTU1NTU1NTU1NTV1NTU1dXV1dXV1dXV1dTU1NTU1NPT09PT09PT09PU1NXV1dbW1tbW1tbW1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTV1NTU1NXV1dXU1NTU1NTT09PT09PT1NTU1dXV1dXV1dXU1NTU1NTT09PT09LS0tSjiGxfZlJWakdIR0lBPjM2Njo7PDhDPEJBPjxBPDg5Ojw6Ojw8PDk8PTo7PD09PD89QD9AQT9AQUBCPD4+PzxCQ0NDRkBBQT1ISklOTUeu2NPU1NTV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbMzMvLy8vLy8vLy8vLy8vLy8vMzMzNzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzs7Ozs7Oz8/P0NDQ0NHR0dLS0tPT09PT09TU1NTU1NTU1NTU1NTU1NTV1dXV1dTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dXU1NTU1NTU09PT09TU1NTU1NXV1dbW1tbW1tbW1tbW1tbX19bW1tXV1dXV1dXV1dXV1dTU1NTU1dXV1dXV1dXU1NTU1NTU09PT09PT1NTU1NXV1dXV1dXV1dXV1NTU1NPT09PT0tLWroprY2VSWGhMSkdJQjg0OTQ6Ozo5QDk/Q0VAPDw5OTk9Oj07PDw6PTw7OTw9Ozs/PUA9PT5AQD9CQT5APD05QERDQkFBQj48SEpLTU5IqNnU1NXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbWzMzLy8vLy8vLy8vLy8vLy8rKy8vLzMzMzMzMzMzMzM3Nzc3Nzc7Ozs3Nzc3Nzc/Pz8/Pz8/Pz8/Pz9DQ0dHR0dHR0dHR0dHS0tHV2djY2NnZ2dra2tvb29vZ2dnZ2dna2tra2tra2tjW19fX19fX19jX19fX19vb29vb29vb29vb29vb2dfX19fX19fY19bX19bX2tra2tra2tra2trb3NzX1dXV1dXV1dXV1dXW1tbX1tbW1tbV1dXV1dXV1dXV1dTU1dXV1dXV1dXU1NTU1NTU1NTU09PU1NTU1NXV1dXW1dXV1dXV1dTU1NTT09PT09PS1bqKa2hoUlhlSUlMT0A5OTo0O0E8Nz05QUM+QD89ODo6Ozk9Oz4/Ojs8PDo7PDo7Pj1APT8/P0FAQUE/QTw8Oz5BRENBREA9PElJSk1ORqPa09TV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbW1szMz9DPz8/Pz8/Pz8/Pz8/W3t3d3t7e3t7e3t7e3t3S0NDQ0NDQ0NDQ0NDQ0ci5ubm5ubm5ubm5ubq6t6WkpKSkpKSkpKSkpKSnhmBjY2NjY2NjY2NkZGRlhIuKioqKioqKioqKioemuri4uLi4uLi4uLi4ubSPjIyMjIyMjIyMjIyMiqC6uLi4uLi4uLi4uLi5sIqKioqKioqKioqKiouHvebh4uLi4uLi4uLj4+Pi2NfX1tbW1tbW1tbV1dXV1dXV1dXV1dbW1dXV1dXV1dTU1NTU1NTU1NTV1dXV1dXW1dXV1dXV1dXV1NTU1NTT09PT09XDkXFrak5TYkxMVk48Ojo3Nz5DPzg+Oj8/QTw/QDc7Ojs7PTs+Pjo7PD48Oz07PT8+QDw/Pz1AQEBBPj88PjxAQUVCQkZAQD9HSEpLT0ae2tXV1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19fMzNDS0tLS0tLS0tLS0tLR3uzr6+rq6urq6urq6uvp1dLS0tLS0tLS0tLS0tTEqaqqqqqqqqqqqqqqq6aGhIWFhYWFhYWFhYWFik4MEhISEhISEhISEhIRE0pUU1NTU1NTU1NTU1NPg6ejo6Ojo6Ojo6Ojo6ScWlVWVlZWVlZWVlZWVlJ5p6Ojo6Ojo6Ojo6OjpZVTUlNTU1NTU1NTU1NTS6ry6+vr6+vr6+vr6+vr6dnX19fX1tbW1tbW1tbW1dXV1dXV1dbW1tbV1dXV1dXV1dXV1dTU1NTV1dXV1dXW1tXV1dXV1dXV1dXU1NTU1NTU1NPUy5h2bGlKTl9NUlVNPjw8Nzs/Qz42Ojc+Pjs9Qj85PDk9Ozw6PD07PTs9Ozs9PD0+PT07QT08QUBBQT08Pzw7QEJDQURFPUFAQ0ZLS09GmNzV1dXV1dbW1tbW1tbW1tbW1tfX19fX19fX19fXzMzR0tLS0tLS0tLS0tLS0d3q6enp6enp6enq6unq6dXS0tLS0tLS0tLS0tLUxaqrq6urq6urq6urq6yoiIeHh4eHh4eHh4eHh41SEhgYGBgYGBgYGBgYFxpOWVdXV1dXV1dXV1dXU4WopKSkpKSkpKSkpKSlnl9ZWlpaWlpaWlpaWlpXfKikpKSkpKSkpKSkpKaXV1dXV1dXV1dXV1dXV0+r8erq6urq6urq6urq6unZ19jX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dXV1dXV1dXU1NTU1NTU1NGcenFpSlRdT1JVTkQ+Pzs/QEA4Ojs4PDs7PD86Ozs4Ozk5Ozw7Ojw5Ozs8Ozo9PT0+PUE/Pj8/Pj08PT88PEFBQ0FERTw+QEVGSktNRpPc1dXV1tbW1tbW1tbW1tbW1tfX19fX19fX19fX183N0NLS0tLS0tLS0dHR0dDc6Ofn5+fn5+fn5+fn5+bV0dLS0tLS0tLS0tLS08Wtrq6urq6urq6urq6vq46NjY2NjY2NjY2NjY2SXSInJycnJycoKCgoKCcpWmNiYWJhYmJiYmJiYl6MrKmpqampqampqampqqNoZGVlZWVlZWVlZGRkYYOsqampqampqampqamrnGJhYmJiYmJiYmJiYmJbr+/p6enp6enp6enp6enn2djY2NjY19fX19fX19fX19fX19bW1tfX19fW1tbW1tbV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbV1dXV1dXU1NTU1NTWo3txZElbYE5OVU9AQT89REI+Oz06OTs6PT07PDs6OTg5OTs8Ozw8Ojo7PDo7QD08PTxAQTxBQTs7PEA/PD1CP0RDQ0U8PkJERkpMTEWN3NXV1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjNzc7Ozs7Ozs7Ozc3Nzc3Nzs/Pz8/Pz8/Pz9DQ0NDQz87Ozs7Ozs/Oz87Oz87NzMzMzMzMzMzMzMzMzMvJycrKysrKysrKysrKysfCw8PExMTExcXFxsbGxsvMy8zLzMzNzMzMzMzLz9HR0tLS0tLS0tLS0tLRzczMzMzMzMzMzMzMzMvO0tLS0tLS0tLS0tLS0tDNzc3Nzc3Nzc3Nzc3NzdTY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NfX19fX19fX1tfX19fX19bW1tbW1tbW1tXV1dXV1dXV1dbV1dbW1tbW1tbW1tXV1dXV1dTU1NTU169/cF5GXmJQUVdOR0ZDQ0lBPz07PDo8OEBCPD04Ojo4OTg7Pzs8PDs7PDw8PD87PD46Pj44PkI8Pj1BPjw+QkBERUNAPD5APkNJSUtEh9zV1tbW1tbW1tbW1tbX19fX19fX19jY2NjY2NjYzs3Nzc3Nzc3Nzc3NzdHNzc3NzczP09LSzs3P0s7Ozs7Ozs7Q1NLPz87Q09DO0tTV1NDPz8/Pz8/Pz8/Pz8/P0NDQ0NDR0dHR0dHS09PU1NTU1dXV1tbW1tfW1tbX1tfX19fX19fX19bW1tbW1tbW1tbW1tbW1tfX1tfX19fX1tbW1tbW1dbW1tbW1tbW1tbW19fW2NjY2NjZ2dnZ2dnZ2dnY19jY2NjY2NjY2NnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjX19fX19jY19fX1tbW1tbW1tbW1tbW1tbW1dbW1dbW1tbW1tbW1tbW1tXV1dXV1NTV1di4gm9XSl9jUlFaS0hBQTxCPT07Oj4+PD4/PT0/Nzk6OTk3OD48PD47Ozw7PDs/PT0+OTs7OT0+P0A+QD07OkI/QkNCPz0+QD5CRUdKQoDc1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2M7Ozs7Ozs7Nzc3Nzsqfys3Nzc3QuYOEi8fTwJrLz87Ozs7Pypal0c/SuY++1JyChIrGz87Ozs7Ozs7Ozs7Oz8/Pz8/P0NDQ0NDQ0NDR0dHR0tLT09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbV1dXV1dbW1tbV1dXV1dXV1NTU1NXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NfX19fX1tbW1tbW1tbW1tbW1tXV1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXYwIBuVU9gY1dZW0xMQ0A9PTs9Ojw+Qj5CQ0A8Ojg5ODo6Ojc7Pz4/PDw7PDo5Pzw8PTg5PD9BPj09PUFAPTtBQkBCQz47QD9BQUlHSkF629bW1tbW1tbX19fX19fX19jY2NjY2NnZ2djY2dnOzs7Ozs7Ozs7OzdKpj63Rzs7Ozpu3tqSiwJOerNPOzs7Pz5yqnazVwJSwnLGWuLmvodLOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0dHS0tLT09TU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dbW1tbW1tXV1dXV1dXU1dXV1dXV1dXW1tbW1tbW1tbW1tfX19fX19jX19fY2NjY2NjY2djY2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2dnY2NjZ2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV18h/b1pTYWVeXVxPSkQ9QD8+Ozc6Pjk/RD9BOTg3ODk7Ozw4OT89PTw9PD47OkE7OTs5OzxDQDw7PT5AQT49QkQ/QkM9PT8+Pz5ISUg/ddrW1tbX19fX19fX19fX2NjY2NjZ2dnZ2dnZ2dnZzs7Ozs7Ozs7Ozs/Inrym0tDQzsqgl36Cw6abr6fUz8/P0MuUiJqczqOgi5HDk31+r7DSzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dLS0tPT09TU1dXV1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tbV1dXV1dXW1tbV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2djY2NjY2NnZ2dnZ2dnY2NjY2NfX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dbV1dXV1dfNiHNdWGloXl9gT0lGOkFAPj88PDo2P0JAQjo2NDc6Ozo8Ojk+PD49PTs/PTxBPjw8Ojw8PTw6PEA9QEI+PkFCPUNDPT0+Oz9BRUtIQHDZ1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2c/Pz8/Pz87Ozs7SrKWnqdXAvNLHnY+ey9PJipmq1M/Pz8/RvciZmbuah5261NLNnp7D0M/Pz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0dHS0tLS09PT1NTU1dXV1dXV1dbW1tbW1dbW1tbW1tbV1tbW1tbW1tbW1dXV1dXV1dXW1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnY2NjY19fX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0JB1W1tqaWFeXVNOSTxDQEE+QD46OEZBP0M6NzQ5Ojo5Ozs4Oz0/Pj49QT08P0A9Pjw8PDw8Oj1AQD8/PT5CQD9AQkA8QD0+QUVLRz9r19fX19fX19fX2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnPz8/Pz8/Pz8/QzJ2Nl6zQmpfKxZ6ynpbN1q2ZqtTPz8/Pz9KXlKC+mZCfoNLTwKCg0M/Q0M/Pz8/Pz8/Pz8/Pz8/P0NDQ0dHS0tLT09PT1NTU1NXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX19fX19fY19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tKUcl5ea2tqZV1PTEc/RENDQDo9OzxCPD49OTY0Ojk5Ojo5Nzs/QDs8PUA8PEE+PD07PTw/PDo8Q0A+PTs9QD5CPkBBPkA9QD9GSUQ/ZtXX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2traz8/Pz8/Pz8/P07GigJuvyaCjv8qcpYynrdiqmarUz8/Pz9Ozm8SbvqmvkaG516+iqdTQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1NXV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dbW1tXW1tbW1tbV1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbSk3BgXnBoZmVaUUhHQkVDQEA3Ojo8Pjo8OTc2NTk6Njo8Ozc8QEA8Ojo9Oj0/Pj08OUA8PDo6OT9APj08PUBBQz9APz5BOz9ARkpCP2LS2NfX2NjY2NjY2NjY2dnZ2dnZ2tra29vb29vb28/Pz8/Pz8/P0M6fkGyclteqo9PSrqa1mJ/Vqpmq1M/Q0NDRzo2Qoaygmq2bqdijobrU0dHR0NDQ0dHQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1dXV1dbW1tbX19bW1tbW1tbW1tbX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfW1tfX19jY2NfX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX1tbW1tbW1tbW1tbW1tbX19fX19fW1tbW1tbX0pNuYFxxZGdkWlVKQENGQ0FCODs/PD07PDw4NTU4OTY4Ozo5PDo+Pzw9PTk8Pz49Ojo+OTw6Ojg+Pzw9PTw+QEFDQT48PDpCRERKRkJd0NnX19jY2NjY2NjY2dnZ2dna2trb29vb29vb29vPz8/Pz8/Pz9G9n8O31pfA09HQ0srSzZeb1KqZq9XRz9DQ0cvaqJugmqbFmKLRnp/J0tHR0dHR0dHR0dHR0NDR0dHR0dHR0tLT09PU1NTV1dXV1tbW1tfX19fX19bW1tbW1tfX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19fY2NjY2NjY2NjY2NjY2djZ2dnZ2dnZ2dnZ2dnZ2drZ2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fX19fX19fW1tfX1tbX19fX19fX19fX19bW19GRbF1cb2doYl1PRkBISUdFQDw8Pj48PT48NzU2Ojk3OTs6Ojs4QD86PDw5PD49Ozs6Pzk/Ojs5PT49PTs7PTxAQ0I/Pz47Q0ZGR0hEWc3a2NjY2NjZ2dnZ2dnZ2dna2trb29vb29vb29vb0NDQz8/Pz8/Pz5V+e6WS1KKa08ySl6ObodirmavV0pem1cmOpZqfr56cm5utx5+h0tHR0dHR0dHR0dHR0dHR0dHR0tLS0tLS09PU1NTV1dXV1tbW19fX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tbX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2tnZ2dnZ2dnZ2djY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX1tfPjGRWXnBrXGBgTkVITUlJT0M+OkI9PUBCOzU0Nzw6Nzo7Ojo7OT09OTo6OT0+Pz07OT47PDo8Ozk+PD47PD0+QENCPz5BPEFDR0ZGRVXJ29jY2NnZ2dnZ2dnZ2dra2tvb29vb29zc3Nzc3NDQ0NDQ0M/Pz9DR1aeZrcmjqL7KnbGdo7XZqZup2Lirocq7oaannM+mq6SexbSkptbS0tLS0tLS0tLS0tLR0dHS0tLT0tPT09PU1NTV1dbW1tbX19fX19fX19fX19fX19fX19fX19bW1tbW1tfX19fX19fW1tbW1tbW1tbX19fW1tbW1tbW1tbX19fX2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2djY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fX19fX19fX19fY2NfX19fX19fYzYZdV2JvZE9dVEtIRlNRS0xAPj1EPD9DRj01NTc7OTY6Ozo8PTo7Pzo6OTg6PT0/Pjs/Oz49Ojs5Pjs9PD0+QURCQD8+PzxAQUVHRURSxdvY2dnZ2dnZ2dnZ2tra2tvb29vb3Nzc3Nzc3NzQ0NDQ0NDQ0NDQ0NO5gL3Tm5bP1LWLkZ/T1LyBu9TOlKDT056QjbbWy5KQp9e5g7/V0tLS0tLS0tLS0tLS0tLS0tLT09PT09PU1NXV1dbW1tfX19fX19fY2NjY19fX19fX19fX19fX19fW1tbX19fX19fW1tbW1tbW1tbW19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2tnZ2tra2tra2tra29ra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2NfX2ct+WlVqaltMX01KTEpVTEZCPD0/R0ZIS0g9NjU3Ojk3OTo7Ojw9OT45OTo4Oz0+PkE+PTk8PDo9Pj46PTk5Oj9FQUA+PT8/QkBHRURFUMHc2dnZ2dnZ2dna2trb29vb29vb3Nzc3Nzc3dzc0NDQ0NDQ0NDQ0NDQ0cHR0crI0tDUxLjS0tHSwtLQ08fM0tHSusTV0dTLvdXS0cLT0tLS0tLS09PT09PT09LS0tPT09PU1NTU1NXV1dbW1tfX19fX19fX2NjY2NjX19fX2NfX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29va2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2djY2NjX19fX19fY2NjY2NjY2NjY2NjY19rHd1xSZ2laTlpOTFBRV0VKPz89P0FFTExBPjc3NTs4ODk5Ojs8Pjw+ODo6OTs+P0A9Pj46NTo6Oz0/Ojs5Ojw+QkJAPz8/P0FCR0RDRE683dnZ2dnZ2dna2tvb29vb29vb3Nzc3Nzc3d3d3dDR0dDQ0NDQ0NDQ0NDS0NDR0dDQ0dPU0dHR0dPR0dHS0tHR0tXU0tLS09XT09PV0tLS0tPT09PT09PT09PT09PT09PU1NTU1dXV1dbW1tfX19fX2NjY2NjY2NjY2NfX19jY19fX19fX19fX19fX19fX19fX1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tvb2tra2tra2trZ2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2trZ2tra29ra2trZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjbwXNYVWlrU0xSTlBSWVRGSTw+Qz9BQkVLPj43ODY5Njc4OTk7Oz0/QDw9ODk7Ozs/Pjw8OTU6PT47OTk7PD8/P0JCQT1BPUBBQkZCQkJLtd7Z2dra2tra2tvb29vb29vc3Nzc3Nzd3d3d3d3R0dHR0dHR0dHR0dDQ0NDQ0NDQ0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tPT09PT09PT09PT09PT09TU1NPT1NTU1NTU1NXV1dXV1dXW1tbX19fX2NjY2NjY2NjY2NjY19fY2NjX19fX19fX19fX19fX19fX19fX19fW1tbX19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2NjY2NjY3LxvVFRsbExLUkpUUlVLRkQ6PkdEREFERjw/ODk6OTY5OTo3PD07PkA9PTc5Ojs5Pjs5OTY2Oj1AQT47PDk6Pj9DQT4/Qj0+QkNFQkFCSrDe2dra2tvb29vb29vb29vc3Nzc3Nzd3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0tLS0tLS0tLS0tLS0tLS0tPT09PT09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1tbW1tbW19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19fW1tbW1tfW19fX19jY2NjY2NjZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2dnZ2dnY2Ny2a1NbcGtLVVdSXFFXSEQ+PEJKRT1ISj89PDc4ODo1OTg5Njs+PD1APDw1OTk8Oj87OTk0ODw9PUFBPD47Ojw+QD89PkE9PUNGR0I/Qkmq39ra29vb29vb29vb3Nzc3Nzc3N3d3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHS0M/U0M7P0tLT0tLS0tLS0tLS0tPT09TU1NTU1NTU1NTU1NTU1NTU1NTU1NTV1dXV1dXV1dbW1tbW19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19jY2NfX19fX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dndsGRTYXJfT1pUV19RUkdCPUVJTEFBTEQ/Pzs5ODg5Mzg2ODY5Pj0+Pz06Njo7Pjs9PTo5Njg6PTtAQDxAPz0/P0I+PD48PEJFR0lCPkNJpODa29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3t7S0tLS0tLS0tLS0dHR0dHR0dPT0bm7zLqbnLrQyNPT0tLS09PT09PT09PU1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2NjZ2dra2tra2tra2tra2tra2tra2tra2tra29va2tra29va2tvb2tra2tra2tra2tra2trb29vb29va2tra2tra2tra2tra2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ3qpfVWBuW1VZUVpeT0xHQ0ZNSUZEREo7QUE7PDg4NjQ4Njk4Nzw/QT89Ojc8Pz48Pz87OjY4OD09QEE9QD5BQD1AOjs6Pj1BRUdJQkBDR57h29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e0tLS0tLS0tLS0tLS0tLS0tO+wMqaoKKViJGeqpOpz9TT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fY2NjY2NnZ2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dna2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2tvb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2d6iXFVeblheXU5aUFROQ0NMSUlJRkpEPEJBPDs4NzY3OTc3OTk9P0E/PDo5QD88PkI/Ojg3NzY9Pz9APUBBPz88PTs7OD48P0VJSEE/Q0aX4dvb29zc3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3tPT09PT0tLS0tLS0tLS0tTIlZyum5m1iX2TjIKBhMTV09PT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tvb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dndmlpYYW5ZYVdPV01QRUJETElNS0ZJRT5CRDk4ODY3OTc1Njk4PT1BPjo4OT4+PD9APzw1Njc2PD4/PjtAQEA/Pj4/Pjs/PkFCRkdCQENIkeLb29zc3Nzc3d3d3d3d3d3d3d7e3t7e3t7f39/U09PT09PT09PT09LS0tLTz6h+kayPko6MhoCIiYSQo8rU09PT09PU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY19jY2NjY2NjY2NjY2NjX19fX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2tra29vb29ra2tra2tra2tna3JJaWWNuWlpSVV5QTDxAR05IUklIRT47SEY4OTc1Nzg3NTg5ODs+Pj07ODlBPj1AP0E+NzU5Njs+QUI/P0BAQkI/Pj8+QUBEQUZIQj9FSozi3Nzc3Nzc3d3d3d3d3d3e3t7e3t7f39/f39/f1NTU09PT09PT09PT09PWtaWaiIuQhYCFi4iBg4qLf4bC1tTU1NTU1NTV1dXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2dnZ2dna2dra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29ra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb2tra29uIWltnalxYTFpfVkg6TEhMSkpDRUVDQExINzo3Njc4ODU4Nzg5PDw7Ozk4QD89Pj8/PDY3PDQ3P0JCQUBAPz8/QT09P0A+QEBGRT09REuI4tzc3Nzd3d3d3d7e3t7e3t7e3t/f39/f39/f39TU1NTU1NPT09PT09PUxZKCg4WGfYGCfXx5foGCg36k29bU1NTU1NTV1dXV1dXV1tbV1tbW1tbW1tfX19fX19fX19fX19fX19jY2NjY2NjZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vc3Nzc3Nvb29vb29vb29vb29vb2tra2tra29vb29zb29zb29vb29vb29vb29vb29vb29va2tvb29vb29vb29vb29vb29vb2tvZgFpebWhaU0ldW1hKRE1ISlNMR0ZBQD9KQjg7NjY5OTc1ODY4Ozo7Ojw5OD09O0A9Ozo2NTw3Oz1CQEFBPD49QEE9PEA/Pz5CREU+PERLg+Lc3d3d3d3d3t7e3t7e3t7f39/f39/f39/f39/V1dTU1NTU1NPT09PT2LKEkKh9g3l2hIh/e3d5gn5+i67A1dTU1NXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dna2trZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2tra2tra2trb2tra2tvb29vb29vb29vc3Nzc3Nzc29vb29vb29vb29vb29va2trb29vb29zc3Nzc3Nvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc1nlcWmxmWFJPYFFSQUhHSkZYTEZAQENDSz87Ozc4ODc2NTc2ODo5PDw6PTs/PTs9Pjw7ODg8OT0/QkFCQzw8P0FCPj1BQkNCREVDQDtDTH3h3d3d3d3e3t7e3t7e39/f39/f39/f39/g4ODg1dXV1NXU1NTU1NPU0ruen3WKeXuIgICChYGDcnOAhYOMrNfV1NXV1dXW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NnZ2dna2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra29vb29ra2trb3Nzc3Nzc29zc3Nzc3Nzc3Nzb29vb29vb29vb29rb29vb29vb29zc3Nzc3Nzc3Nvb29zc3Nzc3Nvb29vb29vb29vb29vc3Nzc3Nzc3Nvb29vb3dByXV9wZVdLUGNPS0JHQ0pIS0ZBPEE9SFBBOjo3Nzg3Njc4Nzw6OD09PD47QD88Pz07Ojs5Ojk8QEJAQkNAPUFAPz1AQkNDQUBAP0A7RU144N3d3d7e3t/f39/f39/f39/f3+Dg4ODg4ODg4NXV1dXV1dXV1NXU18h4i4V8goh6g4SBfoKCc2l0hYuGkJ3U1tXU1dbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tvb2tvb3Nzc3Nzc3Nvc3Nzc3Nzc3Nzc29zb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb297KalxjcWVST1heSz9HTElPS0VAPkFCP0lPPjk6NzY7NzY6Ozc7Ojg6PDw+Oz09Oz48Ojs4OTo4OUFCQkFAQDtAQj06PkFCQz8+PT4/PUZOdN/e3t7e3t7f39/f39/f4ODg4ODg4ODg4ODg4OHV1dXV1dXV1dXV1s6dhpl+f5OTin+CgXx9gnNxm4mAgoOJwNnat7TQ19bW1tbX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tra2tra2tra2tra29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NvfwGNaW21gVlBTU0pETEhNSEk8PkFEQ0ZORDw8OTc5OjY4Ozk3PDk4OTw9OzlAPjpBPzw3NTc7ODpAQUVBPz45PUI/Oz1CQkI6Pj07PT5GTnHe3t7e3t/f39/f39/g4ODg4ODg4ODg4OHh4eHh1tbW1tbW1tbV1tjLioCHhYOXjHh7e3lvfYF1a3ebdHZ7eInHxpiMrdjZ19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2drZ2dna2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tra29vb3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29zb29vb3Nzc3Nzc3Nzd3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3Nzc3Nzc4LdjV1lrYlJNVVFMSktGS0ZDQD5CQT9FTT4+PTg5OTo3OTo3NT03Nzo+PDs7Qjw5Pz05NjY4PTk6QEJGQD49PEBCREA9QD9DO0A9PD4/Rk9t3N/e3t/f3+Dg4ODg4ODg4ODg4OHh4eHh4eHh4dbW1tbW1tbW1tfVrYZ6d32rn3l4entzdH+Dfm9xe3l6c3t2k4qFgImkzdnY19fX2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tna2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29vb29vc3Nzc3N3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vc3Nzb3Nzc3Nzc3N3d3d3d3d3d3dzc3Nzc3Nzd3d3c3Nzc3Nzc3N3d3d3d3d3d3d3d3dzc3OGtYVtebGJSTVZMTUdLS0RGQkI7QT08RUxDQT44Ojk6Nzc5NjY6NTs+QDs9Oz89PD89Ojk5Ojw5PEVDRkA/PkBDQkQ9OT0/QT1CPz1APkdPadvf3t/f3+Dg4ODg4ODh4eHh4eHh4eHh4eHi4uLW1tbW1tbW1tfQmH+Qh4N9eoN2e3Vzenl6kKqmd3JyfoeHh4CAfoKEhJHJzNnX19jY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra29va2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2djY2NnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vb3Nzc3N3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzb29vb3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3dzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3NzhpV9UYm1iUE9TSUhHRkpJSUJBPkJCPEVFREA+ODo4Ozc3Ojc4ODY+Pz07PDk9PDo+PTs6Njc7NjpEQUY+Pz8/PkNBPzs9PT47REM/PjxIT2fZ4N/f3+Dg4ODg4eHh4eHh4eHh4eLi4uLi4uLi1tbW1tbW19jYyH52doN+fnR2eIaCenl1d5yhu6GEgoCAfoeKinx/gYaMnKjO2NjY2NjY2NjY2djY2NjZ2djY2NjY2dnZ2dra2tra2trb29rb29rb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3d3d3d3c35pbT2drXFBRUElDT0pLR0xHSkJAP0FHREBBPDg8ODg1ODk3Njc3QEA/Ozw5Pj04PTw8Ojc4PTk/RENGPkE/QkBDPzw6Pj0/PkVEPz07S1Fj1+Hf4ODg4ODh4eHh4eHh4uLi4uLi4uLi4uLj49bW1tbW19XB3LRueHJze3B6eXaFiIR7eH2AgZiljH98fnuRhZaLhoGDgY6Rvd3Z2NjY2NjZ2dnZ2dnZ2dnZ2dnY2dnZ2dna2tra2trb29va2tva2tra2trb29ra2tra2tnZ2dnZ2dnZ2dnZ2dna2trZ2dnZ2dra2tra2tnZ2dnZ2dna2tra2tra2tra2tra2tra2trb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t3d3d6NWFdobllQUUtISlNJTUhNSUtBQz9DRkJBRDo6PDg2NDg4NzY2Nj8+Pjo8OTw7Oj09PDw4Ozw7RERERT4/PkI+Qj84PT8/Q0NCQEE+O0xUY9Xh3+Dg4OHh4eHh4eLi4uLi4uLi4uLi4uPj4+PW1tbW1teslLZ6eHJvd5V7dHuLgHh1bn6Fg3t/hYhyfH2bnI6JioJ+g32Hk5rH1NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2trb29vb29vb29vb2tra2tra2tra2tra2tnZ2dnZ2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2trb2tra2tra2tra2trb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d7Zf1lgaGxcUUtHR09LTk5PTURGQkg/Q0hEREA6Ozs4NzU3Nzc4NThAPkA7PDk8Ozw+Ojk7OTk7OUZERUI8QD4/PEBDOz5AP0A/Qj8+OjtKVWPV4eDg4eHh4eHi4uLi4uLi4uLi4uPj4+Pj4+Pj1tbX19vKhYR3cXJubniVhHt4hH95dnB4c3eLkY6CdnN9ioaId3d1d4ODfIiIk8Pb2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2trb2tvb29vb29vb29vb29rb2tra2tra2tra2tra2tnZ2dnZ2dna2tra2tra2tra2trb2tra2tra2tra2tra2trb29vb29ra2trb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f0nVZaGlqVk5KSE1OR01EUElGSD9FPUZMREM+Ozs8OTc3OTY2OTU4Pj4/PTs8QDs9PDo3Ozc5OThHREVCPUE9Qj8+QDw/QUE/QEJAPjs8S1Ri1OLg4eHh4eLi4uLi4uLi4+Pj4+Pj4+Pj4+Pj49fX19fEknuJf29sbnV2foSBg4qGfnVybWVtiIaKjoR7c4OHint4e4OPj4GEioqxztrZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29zc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tvb2tvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3dzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f3t7e4clsW2pqalNOR0dOT0VIRk1JSUA7RD5ISUA9PDo6Ojg2ODo3Nzk0OD08PT07ODw8PDw4Njc4OTo6RUJFQT9APEI/Q0M+PkNEQUBAP0A8PUtRYdPj4OHh4uLi4uLi4uPj4+Pj4+Pj4+Pj4+Pj5OTX19fZqXaFfnx3bHB3eXh8jH2KhYB3anN0d3p9bot7fnl6foR/gIGDfnh8foeGlrbT2tnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra29ra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/e3uO9amFpa2lRTkZNTEtKWE1OR0FAQE9BQz9AOzw4OTk5Njg2NjY4NDs+PD07OTY6Ojk6OTU4OTg5OkJERj8+Pj5AQEBCPzxBQD88Pj9BOT5KT17S4+Hh4eLi4uLi4+Pj4+Pj4+Pj4+Pj4+Tk5OTk19fX2sqKhIB5c29tcXN1d4CUeHaAfHWHhXd1cnWgmXp7d3Z5doR0bWxue3iAmouTu9za2tra2tra2trb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc29vb29vb2tra2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f397js2lpbmloUFBPTExPUk9LU0Y/RURERD48PDg7ODc5OTU2ODY2NzM6Pjs+PTc6Pjk5OTk2Ojo4NzxDRUc/Pzs/PkA9PkE9Oz0+OUFAQDhBTlFc0OTh4eLi4uLj4+Pj4+Pj4+Pj4+Pk5OTk5OTk5NjY2NjauY6AenZ1bmpveHCBfWt0cnZ3hIV5h4d5lY55eXp1d3pza298gHx2fYh8gLLe2tra2tvb29vb29vb29vc3Nzc3Nzc3Nzc3dzc3Nzc3Nzc3Nzb29vb29rb29vb29ra2tra2tra2tra29va29vb29vb29vb29zc3Nzb29vb29vb29vb29vc3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3t7e3t7e3d7e3t3d3t7e3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/f39/f4qpqa2hrZFNQT0ZQVFJOSFJLPkREQ0I7Ozk6Ojg2Nzg1NjY4ODg0Oz88Pzw5PDw3Ozo6Nzo6Nzo9Q0JDPUE+Pzw5PT5BQDs8PDtFQD47Q05TXNDk4eLi4uLj4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTY2NjZ1p5vdntveHh2cG50d3BwdHBzb36Jc3qGhY2EenNtcoB6hn1vg5OBdnx9g4a13drb29vc29vc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29ra2tra2tvb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4N/f3+KgbWhma2ZVVlJHUFFOS0xMRUJIRUc9OD08Ojo3Nzg2Nzc2NTY3NDg+PD09Ojg6OD46Ozc4Nzc6Oj5DRDtDQj49OD1AQUM/Pjw+RTw+PUJNUF/S4+Hi4uLj4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk2NjY3MB2doCCfnp4eHBsdXlya399bHNvdGdoaYB/aWl4c2d+iYl4cIKGe3d9foWKvd3b3Nzc3Nzc3Nzc3Nzc3Nzc3d3c3Nzc3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODflGttZm5mU1NJUFlUTEhGTkZGRUJGPTs+PDs5Nzc4NTc5NjQ1NzU4PDs9Pjo6OztAOTs7ODc6OTlAQkE8QUE/Pzk/QEJFQ0FAQEM7Oz1ES01g1uTi4uLi4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk5NnZ2tmYc3uqhJaCcnR1dn14aGx8d2h4d25rcHR5gIJ3dHyBhIJ9c3CAin94gn95g8je3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f4N/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh24tubWdzY1lRTVVbV0hDSUZOS0dCRD8/Qjo7OjY2NzU2NzY0ODc2Ozw7Pj86PDk8Qjg3OTo6Ojk6QUFCQUJDQEE+PT9CQ0NEQUJGOTg9REpOYtjk4uLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXZ2drcqHGCtXiRfnNsem6EgXaCfWtoan+DeHZ8dX2FhXRmcHl9d316gIqFe318foC03tzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3dzc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3Nzd3d3d3d3d3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e397e3t7e39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4ODg4ODg4tiFb3FrdWFWT1VVXE9ETUY+SkdKRUQ8P0I6PDk4Njg0NTY3NDc2NDk7Ozw7OD47PEE4ODo9OD04Oj09QEBAP0FCP0A+QENCQ0FBRTc2O0RMTmPa5OLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXl29ra3Z5sbnNxhY1ybXBuf391hH5rcnZ2enN4gXhzb3VwbWt2fHmFiIB/f392coODsd/c3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eDg4eHh4eHh4eHh4OLXhW1xb3ZeUldTWlpRSkhDQFFAQkQ8OT9BOjw5NzU3NDU2NjQ3NTY9PDo9PTk+OjxAODo6PDY7OTs+PUJCQjtBQkBDQEBEREM8PUA3OjxFS01l3OPi4uPj4+Pj5OTk5OTk5OTk5OTk5OXl5eXl5dPOxsB+cWxveHt2b3VuanNzbZKGeG50dG5vdIZ/b2twboJ0bXZyfY2DdnF/d3mKgabf3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3dzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t/f3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi1oZucG1xYFJZUFdfWUpMTElSP0Q9OTtCRjs6OTc0NTY1NzU0NjY2Pj07Pz45PTk7Pjg9Ozo0ODtAQENCQ0FCRkE/Q0BBQkREOz0+OTs8QkxNZODl4+Pk5OTj4+Tk5OTk5OTk5OTk5eXl5eXl5eW5t7Woc3JscHd6dHd4bXFydXd/hHRyc2xsa3F8bnBudGuBf3GAd32Eg355gHNygYqg2d3c3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh49WHcWxqbF5YWlVXYFZWUE9QTD1BOjs8RkE4Ojg3MzY1Njk2NTg1Nz89Oz8+OT04Ozw5PTs7NTo9Q0JCPENDREREQUE/PkJDQzw9Pjg5PENLS2PN0dnh1sjY4+Tk5OTk5OTk5OTk5eXl5eXl5eXltbW2q3J5cm59f3Z1d2hqaGlwb3Zta2tnZWZxdG15gG5teXd2iHhxa2podXV5dHV/wd/c3d3d3d3d3d3e3t7e3d3d3d7d3d3d3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHi4uHh4ePVhnFwY2lhV1NZV19MUk9STUtAPjg5O0E+ODc5NjQ3Njc6NjY2NDk+Pzo8Pzo/OTo6Nzo9PDk5PEFBPTtBQ0VDRkA+Pj5BRUQ+QEE3OD5GSEpesrW4wbm1u8jg5eXl5OTl5OXl5+fn5+fm5ebm5ra2tbWOfX5weoR1cnZnYmNlbGtyb2ZpbHZtd4Z9hXlsbHd4a3ZwfH14c3V5fHd2h7ng3d3d3d3d3d7e3t7e3t7d3t7e3t7d3d3d3d3d3t7e3t7d3t7e3t7e3t3d3d3d3d3d3d7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4eHj1Yd1bl5uY1pUU1hXS1NLSk1SR0E4Ozs+PDk4NzU2NTY2OTY4NjY5Pzw6PT07Pzo7Ozk8PDs5Oj4+Pjs8PUFEQkNBQEBBP0JDPDw9Nzs+REVKXrG1tLW2t7e2y9rJ3uXl3eDi3tXU1tPU4OPg39+2treuh3t/bnmNenJ1bWNobGxtaXR4enF5enqIh4N6aWh9cWRvcXyGgX55e318e4an2t7d3d3d3d7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4uHh49aGdmxhb19dV1lcWlJQSEpXTEVHPUA9Ozs9OTY0NjU1NTg2NzY3OD87OT09PDw5OTw6Pjw6OTg+Qjs7Pj5AREBDRUFAQD0/QDw9PTU5PEJHRl2xtbW2uLm5ubq9uMPT0r3BwcC6u7y6u8TMxb/Dt7e3hGl1gX1ndYd5Z3Vxa2t5eHB3fH15bWl3e3h3bml1j4FwbHl4d3d9gXuGgnmAoNze3d3d3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODh4OHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4ePXhXJrZ3RhW1hYX15TVVVRVUpMRj9JRDs5PTY2NDc3NTc4Nzc3ODk8PDo+PDg8Oj0+OTs8OTs5P0E8PT9DP0FARUJCQTw9Q0A6Pjw1NDlER0dasbW1tre5ubm5ubm3ubm4uLm5urq6urm5urm6u7e3uX9ucHN6b3B/eXNuc3Vsc3Z4cXFwb2tvcX6Bc2mHhIF9dHOHdW11hYmBgHJ2hafd3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uHj14lxa2xyW1dXXWBUUVVUUFJPSkNATUE9Ozk2NTM0NjQ2ODc3Nzk6Pjs8Pjs5PDo8PDk8PTw7PT0+PUNEREBDQkE/QD48PkE8OD06NjY6QkpIWLG1tLa2uLm5uLi5uLe3uLi5urq5ubi4uLi6uru3uKx7cnhxf3ZzfnBsbXpyZ29sbW50cHt3d3Jyd3pvhpJ2f3x8enZ5fH9zfYdyda3T393d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4eHh4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi49eHb2pxalVWV2FbT1FSUE5XSURESUo/Ojk6NzUzNDk1NzY2Nzg4Ojw7PD46PDo6PTw5PDw9Oz09PDs9REdEQ0E8PDw8Pj5AOzg8ODE1OkFGRVautbW1tre4uLm4uLi4uLe4ubq5uLi3t7i4ubq7t7mqcnB4d3x7e4J3aG5xam9qY2lyf21zcn54dHFsanaAeX2AgH91doB1a4qLgHaR1d/d3d7e39/f3t/f3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f4N/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLi4uPYhm1sdGVWUFxnWE1YU1JRWUVDS1BOOzk4ODc1NTM5NTY2NzY4Nzk+OT0+OTw5OTw7Njg5OTo8QEA9PkBGQEJCQDo+PEE9Pzs7OzYxNjxCR0RQqLa1tba2tre4t7i4uLi4uLm6ubi4t7e3t7e5ure2tIlyd3h9iXxwem99c2hqbGdnbHRscXd0cWx2c3Fxd3FyfHl4g3Z7d2mLkYp9kM7f3d7e3tvY2drZ297f39/e3+De39/f3Nvc3N3e3uDg3+Dg4ODf3t7e39jS397f397e3t/f3t7f3t/f3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLi4eLi4uLi4uLi4uLi4uLj4+Lj4+Li4uPj4+Pi4uLi4+Lk14NoZ3VkVlVkZVdKWllXW1Q9RU1LSD04NzU3NjQzOTQ0Nzc1Njc5PTo9Pjw9PDk7PDk5Oj45PD4/PkFBQ0FFRUQ+OzxBPjw5PDs3Mzc+REhFSqG2tbW1tbW2tre4uLi4t7e4uLi3tra2tra3uLm2traLfXpsbHp/cGx5dm5qaGdlcXp4b2lvb3B1c21zd4Fnb32CgYNyf3lqcHJ6f6ng393Zy8a/vL2/vsLN0tDW3tnc4NfQzcPCw8PH1dfT2dzX1NjX0MfExce9vM/Kz87Y3djO3N3c2t3T0dze39/e397e3t7e4N/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eLi4uLi4uLf4uPi4eLg4d7W29/Sw8rJx9Hb3OLk4eHg2dre1sbExcTN2trf5OHi4trX3st9aWZxYVleZWFNTFRLUlpMO0hNSEZBPTc2NjUzNDY2NDg3NjU2OTw7Pj46Pjk5PDk3OTs7Oj49PEBAQ0RCR0ZCQT08Q0A9OTw7Nzc3P0RGRkaZtrS1tbW2tra4uLi4uLi3uLi3s7W2t7a3t7i5tba3opdxb29waW50dnFmZWNrbmdvcm1mZ2tygWVvdnyAeGRzj39zaHFyaWVlbm+w39HFv7u5ubm5ubq6uru6vc3Gw8e/urq6uru7u8HCvcHFvby/vry7urq5ubq6ubm6w8XDucDDwby/ube/z8/U3tjc3t/g3tLa4N/f4ODg39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eDg4ODg4ODg4ODh4eHh4uLi4eDh4uLi4uHa2t3RwsPCu8XT1uDdydPDrrnAsaqrq6uwtLbJ0sXRxLG4v7Srq6usr7S0vMzE1c60tLureGxtbWBdYl9ZS1NVVFFQREBRTUhEPzo3ODU3MzE1NjQ5ODQ2Njo8Oz08ODw5Njo6ODg5NzU8PDw/QEFAQkRDQkE8PkI/Pz09PTc1OD5DRUNAj7a0tLW1t7i4uLi4uLm5uLe1sautr7Oxs7OztLS0tqaei2tue3ZxeXhnY2hfcXdha25vaG99b25ja2lseHdsa4Z+bHB6dm1scG95sca8uru7urm5ubq6urq6urq6urq6urq6urq7u7q7u7y7urq6ubq7u7q6urq6urq6ubi3t7i4t7e2tbW1tbi3u8e+w8XHzcS4wMnH0tzZ2d/e3uDf39/f4ODh4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh3Nji4uLi4eHh4OHg3tfGxtHQztTe3tPO0t/SuLi8sq2trKysrrG+ua63rKipqamqq6urqqqqq6ysuKyqqqqrq6urra6urq6urryzrayrpHlub21fXl1dVE1SU1xUSkE/UElIPjg5NjgzNzMwNTczNzg1NzY2Ojw/PDg5Ozo6Ojg5OjY1OTs8Pj9EP0NFQkNCP0BAQT9APjw3ODc6QUVEP4W4tLS1tbe4uLm5uLi3t7SurKuqqq2urq6vsLGzs7WjcG5ucm1wg311aWFlaGZkY2Rxc21td25naW1tZXBzb29zcXN8h4F6dX11n7u6uru7urm5ubm6urq6urq6ubq6urq5uLm5ubm6urq6u7q5ubm5ubq6ubm6ubm4uLi3t7e4uLe3t7a2tbW2tra1tbW1tba1t7e3t7rBvrzGycrb3+Dg3tvd3d7h4tDW4uHg4ODg4ODg4ODg4ODg4OHg4OHi0768zNjd3OLg0dnbxL23sLCxsa+zu7uzsLS9s66urq2tra2sq6qqqqmpqKmpqampqqurqqqqqamoqampqampqaqqqqytrq6urq6urq6sraR4aWJxZmFZWlZRUk5cU0Y9QlJEQTc8OzY5NTY1NDU2NTg3NTY1Nzg7Pjw7OTk5Ojg3Nzk3Njg8Oz47RD8/Q0BBREE+P0M9Pjw+Ojo3Nz9DRj54srCztLW2t7i3trKurq2sq6uqqaqtraysrq+xs7S1t4xucnRqaIB5ZmpmZWxdaG5waGxxYmNmcoJ+dmhobGpueoaBhXx4cXF5gK+6ubq6urm5uLm5ubm5ubm5ubm5ubm4uLe3t7e3uLm5ubm5uLe3t7i5ubi4uLi3t7a2tre3t7e3tra2trW0tLW1tbW2trW1tre3t7e3t7e3tre4v8bP0MS+v8DE19e8ydra4OHg4ODh4eDg4ODh4eDb3t7Uzby3tre6wMDJxLfIvrKwsLCwr7Cvrq6ur7Cwr66urq6uraytrKurq6qpqampqampqampqKmpqKmpqampqKmpqKmpqqqrraytra2ur66trK2heWpjbWdiXFhRUFFLVEpCOklRP0E3PDk0OjU2NTQ1NTY4ODY4Njs6OTw9PTs6ODY2ODg6ODY3Pj09PT5BQUVCQkNBQUBBOj09Pz05Ojc9QUc8bKqmqKutsLGwrqupqKqrq6mpqamrrKytra2usLO0tbilgIdvaWdzdGZrcG1qZGxvcm5rbWNrcHyJhG5qbHx4Y3uKfnNqc25rcY+7ubm5ubm5ubi4ubm5ubm5ubq5uLi3t7e3t7e3t7i5ubi4uLe2tra3t7e3t7a2t7a2tra3tra2tbW1tba1tLS0tbW1tra2tra3t7e3t7i4uLe2t7a2uLm4uLe3uL6+uLq9vcfb4OHg2Nnd4eHg3dfKwcPCurm5uLe4uLi3tbS0tLKysbGxsLCvr6+vr6+vr6+vr66ura2srKyrq6yqqqmoqKmppqepqaehpaipqamoop+hoZyip6inqausrK2ur7Cwrq2unXdwbGphY2BZUU1RTFJGQzlNUEU+ODs3Mjc5Njc0NDM1ODg3OTc7OTo9PTw6Ojk3NDo5ODY1OD8/QEI9RENDQ0FDQEJBQDtAP0A/PDw6O0NIPWOopaWlpqioqKenp6ipqqmoqKipqqqsra6wsLCztLW1taWYdn5xZmt4cW9tZmVsaGNsZ2ZpaX11bWlvfXZ5hWZod294b3Fvcninu7m5ubm5ubm4uLm6ubm5ubm5ubi3t7W1tba2tre3t7e3t7a2tba2tre2tbW1tra3t7e2tbS0tLS0tLS1tLS0tLW1tba2tra2t7e3t7e3t7a2tre2tre3uLe2t7i4t7i4uLi4wMXTyry8w83PyMC9urm5ubq6ubi4uLi4t7W0tLSzs7KysrGwr6+vr66urq+vr6+uraysrKurrKysq6ehoJ6gn5udoaGdlpmkpKaon5mZmZmanZ+gn56fpKqtrq+ura2srJl1cGlrY2FeXVVOU0tSREQ4TktHQTo4NTI2OTY1NDczNzc3ODk3OTo7PT0+ODg4NzU6OTk1OD9AQEFEPkZAQkNAQkNCQT88QEJCQD0+OjpERj5cpqWmpqampqanqKenqKioqKenqaurrKytra2ttLS0tbekc311bnONf3JmanFjaW1jaGZobG51aV9jZ3VzdnpuZ3Bwcn56cYihu7m5ubm6urq6urm2s7a1uLm2trW1tra1tbW1tbW3tra3tra2tbW2tbW1tbS0tLa2t7e3tbS0s7O0tLW1tLS0tbW1tra2tra2t7e3uLe3tra2trW2tbW2tra2tra2tra3tra3uLi3uri4uLi3uLi5ubm5urq6urm4t7e3t7W1tLS0s7OysrKxsbCwr66urq6urq+vra2srKuppaSmpqScmZubmpmampmXl5eXl5aZm5iZmJmZm52en5+dnJ6gpKWko6OioqKQdG5jcGFeXltUU1RIVEo/PFFCRkM7ODYzNzo1NTQ4Mzg5OTc4OTc7OTs9Ozc6NzU2OTk4NTg+Pz9ART5CPz9DPzxBQUI/PT9EQT8+PTk9Q0Y/VaSlpqanqKeoqamop6ioqKioqKiqrKuqqaipq7W1tba5o3eKcXKHhnd0cGh5a2JjYWVsaW5zal9jZWNjZWprYmRqbHaXjX6ovbm3tre5u7u6uLWxrKurqq6wrKyrq62tq6uvsLGvr7CytbW2t7W1trW1tbW1tbW2trSvr7O0tLSvra6vsrW0tbW1tbW2t7e3t7e3t7e3t7e3t7Owsra1tLa2tre3tra2tbW1tra3t7e5uLi4t7e3uLi4ubq6urq5uLi3t7e1tbS0tLS0tLS0s7OysbCvr6+vr66vr62oo6KgnJqampqZmZqbm5qampqbmpmZmZiXl5aYmZmZmpycnZ+foJ+goKChoaCgoJ+fi3RuaXRdYGZeUlRLRFRJPUVTSEVCOzo0NDY5NDQ1NzM4ODg3ODk5Ojs7Pz04OjkzNTg5NjM5PT5AP0A6QEJCQkA/QEJCPz0+QUFCPz06PkVDQFGjpqWlp6inqauqqKaoqKipp6ioqKinp6ioqaq1tbe3t7KZtH99kIx1Z2lqbGZjYGNoZW94cGlicXx5cGpmZmRma3NqhYystrKwra2ttLeysLCtrKuqqaiop6ipqampqKinqKipqaeoqqurra2sqqytraysrq6traunpaSnqqyopKOkpamwsbGztbW2t7i3t7W1tre4t7e3t7Kppaasq6ivtLa1s7W3t7a1tbW2tra3t7e3t7a2t7e3t7m6urq5uLi3t7Wxs7S0tLKxsK6sq6yurrCxsK2rqqmqqKijnJqZmJmYmJiYmZmZmZmZmpqZm5ubnJybmZeYmpqcnJydnJ2foKGhoqKioKGgoKCfnop1amtuWVxhVktPREdVRz5PV0hEPTw4MzQ0ODQ1NDgyODk4ODk6Ojw5OUA8Njk6MzY3OTE0PD8/QEBBOkNGRUJBREJDQTo7P0FCQz9APUBEQ0BPo6empaemqKqqqqakpqenqKioqKimpqaoq6uttba3t7e4rbJ1cHuDdmBiaWtiZWZhZGdmfYh5bHKAfXFvcXhjbW5xZo+srKurq6ysra6urK2trKyqp6WmpaWlpqioqKiopaeoqKioqKeoqampp6Wko6KioqOioKKioaKhoKChoaKjpKOjpaWlqLC0s7OzsKuqqaqztLa3trGopaOioaGipKiqqairs7Sxrq6xs7W2tra3uLi3t7e3t7e3t7a2uLe0sa6ppqerrKmnpqWkpKSkpKWnqaajoJ+enZycm5uampmZmJeXmZmZmJiZmpqampqampqbm5mYmpydnZ2dnZucoKGgoaOjoqCgoKCfnp2FdGtsaFdYU0pHTUVITUdAU1dGRz09OTM2Mzc0NTU3Mzg6Ojo6OTw9OjpBPDY9ODM3ODgzNztAPz9AQDpCRUNAQkRDQT87PEBDQkNBQDxBQ0A9TqKnpqanp6mqq6mkpaWlpaaoqKippqanqKmpqrW2tre3t7izc2h7c2JnamtpaWJhZGloXV1tfHJma3J/fHR8bm1zc36gqamrq6uqq62trKusq6mpqKWjpKampqWmp6eqqaamp6enqKinp6iop6WjpKKhoaGhn56en5+fn56foKGho6Wko6OkpKSmp6enpqWkpaampqeqraumpKKhoaChpKWlpaenpaeoqKalpaivtLa3trW1tra1tbOwrKupqa6rqKWlpqampaSkpaWlpqWkpKSkpaKhoaGgnp2bm5ucm5qamZiXmJiYmJiZmpmZmZmYmZmZmZqZmZydnJycnJybnJ+fn6ChoaKgoKCfnZ2cgHNrbmReU0pITUZETEtFRFFTQ0c9PDgzNjI4NDY0NjQ4OTg6Ozk7Pjw5PTs5PTczNTk2NTY8QD0/QD88P0JDPkJCQj89Pj5CQ0FFQD86PkVAO0+jpqWkpqeoqaelpKWlpKWnp6eoqKanp6alpqa1tba2trW2uYptcW1vfHxxZ2pmYGFsYFROW2hqbm9tgYJ9cWdxdn6aqKeoqqmpqqurrKqqqqimpaWkoqOlpqalpaWmqaqppqWjpKWmpqSjo6KioqKgoJ+fnp6cnJycnJ2dnJ2en6CioaKjo6KhoqKkpaSioqOjpKSjpKSko6Ggn6GipKanp6ipqaelpaSipKSlqK2wsKyrqqusqqmnpaWmpaWlpaalpqioqailpaWkpKSlpKOjpKOioaGhoqKgnp2cnJubm5qZmJiYmJmam5mXl5eWlpeXmJiZmpqcm5qampubm5ucnJ6goKGgnp6enpycm356bnJiXlNNSlBFRk5NQkBPRT5JOz01MzYzODM2Njc1Ojs4OTs5Oj49Ozo5OT03NjY5NjU2PkI+PkE/PT5DQT5DQ0BAO0BAQkJCRUA+Oz5FPzxQoKSjpKOjo6SkoqSlpaSlpqamp6empqalpqaltLW1tbS0tbiBaHx9ZXOCemxwdWFfY1ROT1FbaGxpbGxxbW5xbnScoqSnqKioqauqqqqqqaempaSjo6OjpKSlpqalp6ytqaShnp2eo6Shnp6foKCenJ2dnJycmpqam5ucnJubm5ydnp6foKChoJ+goaOioKGjpKSjoqSlpaWkop+go6SkpKapqainpaGdnJ+jpaipqainqKioqaempaWkpKSlpqampqampqenpaWko6Ojo6KioqGhoqKhoqOkop+enZ2cmpubmpqZmJeXmJaWlZSUlJWVl5iYmpubnJuampqam5ucm5ucnp+fnpucnJyam5p/fnF0YFtUTUdNSEZMSj8/TkM8QDs8NDM4Mzc0NzY3ODs9ODo6OTk7PTs7ODk9Nzc4OTU4OD9APT9BPjs9RD89REA/PzpAQUE/QUVAPjw8Qz88Tp2ioaKioKCipaSkpKWlpqenp6empqampaampbW1tbS0tLS3jHalsXdmc3Jvc2xjZGlYT1JRT09dgG1kYFptkZGSoqKjpaampqenqKiop6alpaSjoqGhoaKjpaempqesrKemoJ2cm6Ghnpuamp2cmZiam5qampmZmZubm5uampqampucnZ6goaCfnp+hoJ6foqOko6Omp6inqKWioKGhoaGkpaWlpKCcmZmbnqOmpqampqanpqempaOlpKWlpqiop6enpaWlpaWkpKOjo6KhoqKioqKhoaKjo6Kgn56enZybnJubmZaUlJSTk5OTk5SUlJWWl5qam5ubm5qZmZqanJ2dnZ2dnZuampqamZqXf3dvc11aTkhKTkdFRklERU5APD09PDQ1OzQ2NDY1Njc5Ozg5OTg5OTw7PDc6Ozc4ODg1ODg/Qj9BQTw+P0A8PEJAQT49QT4/Pz1CQUA6OkA8PE+doqGfoJ+dn6OkpKSlpqeoqKenp6ampqampqW1tLS0tLS0tbSXtqd1Znh2Y2xjY2VjW1JTU1JNXqCMeFhodpajnp6hoaOjo6OjpKSlpqalpKSioaGko6OjoqOlpqWmpqenpp+bmpuioJmWlpWam5mXl5iYmpqYmJqampqbm5qZmZmenZ2goqOjo6KkpKWinqGhoaKjpaampaSjoaCgn5+hoZ+goJ2amJeZmpygpKOjpKWmp6alpaOjpKSkpKWnp6ampqampaWmpKOjo6SjoqKjpKGfoKGhoKGgoaCfn56dnZyamJeVk5KSkpKSkpOTkpOUlZaZmpqbm5qampqbnZ6enp2cnJybm5qamZmZlH10bHReWk9IRUdGQkVORT9GOzo+Pzs0Njo2OTM2NDY4ODo4OTc4ODo8Ozw5Ozs6OjY3ODk5Pj9APjw9QD5AOjlAQT89QT8/QUE+QUE/Ojk9PjpQnaCfnZucnJufoqOlpaWlp6iop6ampqanpqantLS0tLOysrGwsK2rkHiGj36bmn93Yl1TUlFRTGKgootaiKCgn52YmZycnZ2eoaGgpKenpqWkoqGjp6alpaKipaampaanpqagm5mboaCXk5OSl5qcmpeXl5iampmampqam5qYmJmaoKCgoKGfoaKipKamop6gn5+goaOko6Khn56enpyanZuZmpqZmJeZnqChoaKioqKkpaWmpKSkpKKioqKkpaWlpaWlpaalpaOko6KioqGgoKGgnp+fn5+fnp+foJ+cm5qZl5WUlJSTkZCRkpKSkpKSk5SVl5iZmpmZmpqam5+fnp2cnJycmpmZmpiXl5F8cmdxXl1QRj9BRD9KT0JCRjhDRT4+OTg7Nzc0ODQ1OTo6Ozk3OTo8Ozo8PT48PDo2NzY5OD4/QT47Pz49PDg6PkFAQUE/P0FCQERBPjo4PkE8U5ycm5uampycnaGio6KjoqSmp6alpaampqSjo7KysK2rp6amp6alpqiln6iop6qnoXmEXFFST0xcnKCAYpmgnp2clZOVlpeZmp2dnqGmpqampKOioqanp6ajpaampaWmp6amop2cnqGfl5GRkJSXm52YlpaWmJuZmpqampqZl5iam6Ghn56fnpybnJ6goJ6dn56fn6Cio6SjoqCfnp2ZlpeXl5iYmZubnqKioqKioqGio6WlpKOio6SioaGhoqOkpKSko6SkpKSioqKhoqGgn5+gnp2enp2dnZ2dnp6em5mYl5WTk5SUk5KQj5GSkZKSkZKTlJaXl5iYmZqampyenZ2dnJubmpiYmpmXlZaNempmamBiTkY+P0A9SkVAQ0A7QEE8Ozs5Ojc2NTg0Njc4OT04ODs6Oz87Ojs8Ojk6Nzc2ODs7Oz08Ojo8PTw3Oz5DQkRDPz1BQ0FEQT88OkBCO1eZmJqamZmam5ucnp2foqKhoqSlpKSlpqSioJ6op6alpqWlpaemp6ampqakpaanqKehqXJOUU1KVJahenKanJyenJeVlJWWmJiXl5qeoqKhoqOkpKOjpaalpaanpqSlpqalpaOgoKGhn5mSkI+WmpmenJaXl5eZm5ycnJqamZeZm5uen52cnZyZmZqcnZydnp6fn5+hoaCgoaKgn56bl5WVlZeanZ6fn6GhoqKio6OhoaCgoJ2cnaGioqOkpKOioaSlpKOko6SjoqKioqKhoKGfn52cnZ2cnJ2dnJ2enpqXlpaVlJOTkpKSkpCRkpKSkpGSlJWWl5iYmJiam5ycnJycnJ2cm5mYmZiWlJWXi3hsY2RiZFFHQT1DO0tIRDo7Ozw+OTo6OTo3Mzc5NTo4ODg8OTg7OT09Ozo7Ojk8PDc2NDc/PDo9Ozw/Pjw7ODxBQ0FDQkI+P0NAQkFAOj9APztZmZiampqam5ubm5ydoKGhoaGhoqKioqKhn5+dpKWmpqenpaWmp6ampqWkpKalpKSkpaaGUFJQT0+PmHB6mpubnJ6cnJycm5ubmZiYm56dnp6foKOkoqGhoqKio6SkpaalpKOjoaGhnpyalZOUmJuam56amJiYmJqcnpyam5iWmZybnJycnJydmpqbnJ2dnp6dnp6fn52cnJyhoaCblpWVlZacoKGgn5+hoKKjoqOhnZuZlpaWlpicnqCip6ikoaCgoqOjoqKioKCgoJ+fn5+gnp2cm5ucnZydnJmanJuWk5KSkpKUk5KSkpKSkpOSkpKRkpSVlpeYmJiYmZqcm5qbm5ucnJqZmJiXlZWWl4d3ZGdoZGJNQ0U8RDlJSkU5Ojs9PTo6ODg6NjQ3OTU8OTY4OTc5PDs7PDo6PDs6PDw4Nzg3Pj07Pj46Qj86Ojo/QURCQ0FBQD9EQUFAPjpAPj06W5qYmZqbmpubm5uen6CgoaKioKCgn5+enp2dnKWkpaanpqWlpqakoqKio6Oko6Kjo6KnllRYVVJOZ21rgZ6am5udn6Cgn56enp6dnJ2dnJ6enp+goaCfn6CgoKGio6Ojo6OjoqGgnpuZmZiZmZmamZienpiYmZmam5qWlZeWlZicnJ2cm52dnpybnJ2cnZ6bmJqeoaGdm5udoKKhmpWVlpaZoKKgnZueoKGjop+em5eXlJKSlJeYmZ2goqenpaGgn56goaGioaCfnp2cnJubnJubmpqZmpydnJmXmZaVk5GQkJCPkZKSkpKSkZKTk5OTk5OTlJWWlpeXl5manJubnJucnJqamZeXlpaVlZSEcmZsYmRbREJMPT84RktCPEA+Pj05Ozk6PTg1ODg2Ozg1Njo4PDw7Ozw8Ozk8Oj09OTU4Nzw5PD88OkE/Ojo6QEBDQkRBQ0A/Q0FAPj08QD09Ol+al5mamJeYmpycn5+foaGhoJ+fn56foKCenZ2lpKSko6OioqOjoZ+foaGipKOio6SiradXXl1UV19ua42dmpqbnJ6dm5ucnZ+enZycnJydnZ+goKChoaGgoKGgoKGioaGioZ+enJqampqbnJqZmpuZnJ6ZlpaWl5eTjo6QlJabnJuam5udn52cnJycnJ6dlpSZnJ+in5ycnZ+hoJuXl5mZmpycnJubnZ6fnZqXlpaWlJOTlJiampqfoKGmpqWgn56fnqChoaCenJubnJybm5ybm5qZmJmZmZmXl5iVlJKQkJCQj5CSkpKSkZGTk5aYl5STkpSVlJWWlZaZmZmam52cnJyampmXlpaWlpaQgG9vZV5gV0BKSDg/N0lFP0VBPD07Ojo8Ozs3NTs4Njs3NDY6Oj47Oj0+Pj07Ozs+Ozo4Ojk5NkBBPTo8PTo6OT9BQ0JERUM+P0FBPz8+Pj89PDtgl5WXl5aVl5mbnqGhoKGioqCenp6enqCgn52bpaWjpKSioKCfoJ+dnZ+hoqOjo6OkobCjXWVkYGFua4GenJubm5ubmZianJ2enJubm5ycnJ6ipKGeoKGhoqKhoKCgoaGgn5+enJqZmpubm5ybmp2dm5manJiXlZWWkY6Nj5KYnZycm5ycnqCdnJucnJyempWVm56foZ+dnJyenp2cmpqampqampqbm5qXl5aTkpWVlpWTlZaam5qanZ6foqWjnp6fn5+en5+enZ6fnZycm5qcmpqbmpiZmJiYmJiYlZSTkZCRkJCQkZKTk5CRk5SYmZiVk5SVlZWWlZaXmZmXmZqenpyamJiXl5aWl5eYjX1ubV9lVlRFSzw3PjdSRUM+QkE4Ozw7OTg6ODY7Nzc6Njc5Oj0+Ojw8PT49PD06Pz06ODw9OTtAPj4/PT45ODs/QkNAQ0VDPT9DQj5AQD5APTw8YZWSlJWWlpeanJ6goKCgoaCgnp6enp6gn56em6WlpKOioJ+fnp2dm5mbnJydnp+gn56rmGNpbW5pZm2enZybm5ybmpmZmZqam5ucm5uam5ygo6SgnZ6en6CgoKCgn6ChoKCfnpuamZqam5qbm5ufnpyZmJqamJiYmJKOj5OXnJ2bnJ2cnJycnZycnp6dnpqVl5ygoaGfnp2eoJ+cnJuampqbmpqYmpmVk5OTkpOWl5eVlJiYmZucnJydoJ+gnp6enp+fn56en6KjpKKgnp6cm5qampuZmJmZmJeXlpWUlJORkZCQkZKTk5OSkpOUmJmYlpWUlZaWlpaWl5iYmJiXmZqamZeXl5aXlpeWl4l4dmddX1dURUU5OTs8WT5AOEI/OTs7Pjk4Ozg6Ozc5OjU4OTs9PDk9Oz0+PD0+Oz8/Ozk+PDw+Pz5AQUE9ODc7QkNFP0FFQz1AREJBQEQ7Oz47PGKWk5SUlpWUlpiYmZubnJycnZ2cnJ2en56dnJqkpKSkoJ+enpybm5qZmJiYmZucnZ6cpolla3R4bVuFop2dnJydnJqbmpqampydnZ2bmpuboKKinpucnZybnJ2enp2dnZ2fnpyampucnZybm5ycnp6cm5qanZqam5yVkZOXm52dnJ2fnZycnJycnZ6fnp+cl5idn6GhoJ6cn6CfnJubm5qbmpmZmZmZl5WWlZaYl5eXlpaYmZuenp2dn6GhoJ+fnp6fn5+dn5+hoqKhoZ+fn5yZm5qcnZuampmXlpaYl5eXlpWTkpGTlJSTlJSUlJaZmJaVlZeZmJeYl5eXl5eYl5iXl5eXlpaYl5eVl5eDeHZfW11eUT1GOjk4P1VDQTtDQzo8Pz86Ojk3Ozg4ODc0ODk8Ozw4Ozs8PTo9Pjo/QT06PTw+PkA/PUBBPjk2PERDRUBBRUU9PkVERD9COzo8OTpkl5SVlZaUlJSUlJWXmJiamZqcnJydnp6dnZybo6Oko6CenJuamZqZmJiYmZiam5ubm6WJa3F2em9lmp+enp2dnJybnZ6dnJ2enp2dnJydm5ygoJuampubmpudnJqampucnJuZmZycnJ2dnZ2dnZ2dnpybmp+fm5ydm5mZmZudnZ2dn52dn5+dnJydn5+fn5uanZ+goJ+dnJ6gnpubm5ubm5yampuamZudnJqZmJeYmJiYmp2foKCgoJ+hoaGgoJ+en5+fnp6foaKhoJ+enp+enJqam5ubmpqZlpaXmZmYmJiWlJOUlJWVk5OVlZSVlpWVlZSYmZuamZaWl5WWmJiWl5OUlJGRk4yRkJOWfXhqYWJiXFA8QDw2OENWSERCOjg7Oj47Nzc5Nj06OTk2NDc6Ozw9OTo6Oz87PT08QD47Oz46PT89PkBBP0A8NztBQ0U/P0REPj9EREM+Qj07PDs6Z5aTk5OTk5OTlJSVlpeWl5aWl5mbm5ybm5uamaOjoqCfnpuamJeYl5eXmJmYmZybm5qkgGpqb3lzcZegnp2dnJydnp6enp+enp2cnJydnp2bnJuampqam5ubmZiYmpqamZmZmJqdm5ydnZ2dnJ2cnZ2cm5qdn5ucnJubnJubnZ2dnJydnp2enZydnZ2cnJ2dm5uenp6dnZybnpubnJycnJydnJubmpmbmpmYmZmYmpmZmpyfn5+jpaKfoaKioaGfnqCgn5+fnqCioaGhn5+fn52ZmpudnZqZmJWWl5aVlZaTkpOUk5STkJCSk5GUkY+OkJGOlZabmJWYlJmXlJiRjJCPk5yTkoyFjIeDhndxZ2pkW1xRQT44NkJHYEJFR0A+Ozw7Ojg4NjU8ODo4MzQ6Njk9PTk5Ojs9Ozw6PD48Oj5AOj5APjw/QD8+PDg6Q0FEPz5CRD8+Q0VCPUJAPDw8OmeYk5KSk5OSk5SVlJWXl5aWlZaXmZmZmpqampqkoqCfn52bmpmYmJiXl5iZmJmcnZ2cqH1nZXN7enOJop+enp2dnp6enZ2enZ6enp2dnZ6cm5ybmpubm5ucm5iYmJmZmJiZmZmbnZycnZ6enp6enp6dnZybm52bnJybnJ2dnZ2dnJ2dnp+fn52cnZ2dm5qbnJmZnJ2dnZ2dm5uanJ2dnJycnp2dnZybmZeVlZeXmJqam5ubnZ6foqOhoKGhnJucm5ubnZqcmZycn6CfnZiZmZmUkpKUl5SPj4+OkYyNiYuQi4mLjpGRj4mQmJiQkoyNi5KQj5iYoqiqpqWlrKOmoZqep6eyqKKVo6Cfl39wcWlsXFtcTUY8NzdHR1g+SE5URjk+Ojg5ODc1PTk4NzMzOTY6Pjw6Nzo8Ozo6Ojo8PDs/PjtAQD47PT5BPDw2N0A+QkA+QUY+PEFEQT1DQj49PDlmmJSTk5OTkpOUlZOVl5iYmJaXl5iZmZqampqaoqGfnp2cm5mYmJiYmJiYmZmZm5ybnKx/am16f3lxh6Genp2cnZ6enp6enp6dnp2dnZ6enJubnJubm5ubm5uZmJiYmJiYmJmZnJ2dnJyenp6enp+fnp6dnp6dnJydnJ2dnZ6fnZ2fn56goJ+enZ2dnZybnJ2em5qbm52enZ6dm5ubnJ2cnp2cnZqYl5SRjo+QkJGVmJSWlJiZmpudmJuYlY2Mjo6TkpKRj4mQjpGRjo+Ki42NjYiIi4+Lg42NkY+MkI2Qk5WVnJihoJySn6SipKmam5eanKOprb3Bwbq8uL26ucC8ubq3uru7tL2zwbV/bnVmZ1peWUxJRTo7TElTPFZSSUM6QTo7Ozc3NTo6OjgyNTY4Oz08OTk7Ozw5Nzo4Ojw6PT85PD8+PDw9QTs5NTg8O0A/QT9EPTxBQkA8REM9PT06YZOTkZCUlJOTk5OTlJeYlpeZmJmYmZqbmpqamp+gnp+fnJqZmpqampmYl5iZmZmZmZmphXB1e4B3b4mhnp6enp6fn56en56fn56dnp6fnp2dnJ2cm5ubm5ubmpiYmJiZmZiam52cnJ2dnp2dnp6goJ+enZ6hoJ6dnp2enZ6fn56en6CenZ6enJydnZ2cm5qYnJuVmJqamJiYmJmSjJCXlKCXk4+MjYqKiImMiJORh5CPjYqKkJCLjoqMi4+IiImJjpGOjYaFiYaKhoWLiI+SkJCNkJKXlpKamJ2TlJ6kpqaqq7Gsr6+rpquqsbm5tbS0rqyvtMDIxcXBvsbDxMTDurW+t7a0s7C2tb6qcHRyXGZfXV1JRj8/RUtMVklcTEQ/PUI6Qzk5Nzc7OTk3MTc5ODo+ODg6PDw7OTc5OTs9Oj4/OT5BPDs+PD46OTY5PDpBPkNBQT08QkBAPkJEPj8+OVyHhIOHi42KiYaFgYqMkZOVmJiHlZaWkpiampmenZ+gn52ampubm5ycm5iWmJmXl5ibqo56dXZ7f3mCoJ+fnp+goKCfn5+foKCfnp2dnp+enp2dnJqbm5ybm5uYmJiXl5iZm5ucnJydnp6enpybm52dnZycoaGfnZ6dnZ2dnp2dnJiWlpaYlZWSlpmWk5GKjI+PjI+NkIuLj4+WiYiEi5GZjn2Fi42PjYyHioyQm4yRj4+Lio6TjIyNjIiSi4yFiYyPhouIh42KhYyEj4qXkJOYmpWbnKOqoaKknKKrsbe0ubWxs62vsrKlp7O6sbq6vLa3tsDDw729vLa/urq8wbW4wL60r66mqa+3mm58Z1tjWl1fSEU+QUtJU1hZXkFGOTk9OUY/Pzo3Ozs7NjM6Nzo5Pjg6Ojw9OTk4Ozk7PDo+PTtAQDs8QjxAOjg0Nzw7Qj9BQj4+O0NEREBDQz0+PjlhmZWLkYWNj5aSiHl9e3+Fi4OKgoqJhmuAeJCLlpqRnZ2UlJGTlpeampiWk42Sk5KQm5uIdndzcX1/cpGgnZubm5yenZ2eoKGgm5uWlpucmpybnJuYmZqYmJmampqWi5CTlpmYlZiYlpucl5WSkY2SkZCUk5KXm5mYm5ePjpCLjo2Ch4uLi4qLiI2RjIeHhoqIiZGKh4yEhYqNi4qNhI+UkIyDkJOUmZWQi5OTkZWRlpWOj5GMlI2Oj4qIj4ePhoeJiYmNiomJioWNh46JmJKUmpuXmKChp6Cko5qqqbO2sbWwqKmiqK6tn6qvsK21ubi8wr/BxLixtbCutrOwuL68ury+urOzp7G3wpB1gGNiXlpXUk1IRkVQSVlXX1tDUDpCQz1HRj84Nzo6NzU1OTc8OTw5ODo9Pjo6Nzs7Pjs7PTs9P0E7Pz48Pzo4NDM3OkFBQEI+PjpDREM/QUM7PT45Z6mloqKZn6CippeUiI2CiIJ1h4iKiIp7e3Z7enmPeoiSfn18en6CkYWBgH1zfH99fISHfnRweHZzfHaBj4iIiYeIioyMkZicl4iOhIuNi4iNkI+Pi5GPi4yOj5CQjouFhYeLjIyHiIuOi4eMhYaBjYuGiop/iYqGiJiRiIOIg4KFfIuLjIaJi4iKkIyIi42PjI+Wh4mLio6NjY2Wk5OdnJyalpycm56bmpuYnZeTkZWWkJKRi4+LlpSMjYqDi4SEiYyQkIqOio2LipGJjZOTk5SVk5KcmZ6Xn6CfpaKvsamupKSfmKStpqa4t6ysu729wsPAv7+vpa2wsLS3uLO0uLa0ta6stK+4tLaBeXpjZmBeVlBRQUVMT0lcXl9UR0dCS0xCREA9ODg7OTU3Nzk3Ozc9PDk9Pj05Ozg6O0A8Oj06PkJBOD88Oj84NjQyOTtCQD9CPj04QEI/PkBEO0A+N2CloJqXnaGaoaCPl5efl5WCjaCfo6GdmpKOjIxycXBvdnFucG1ucHZub29waHBxcHR+c3FycXd7cnl2d3Jyd3Z6e3l8fXt/iIGEi3+PkYaNi4uGiouLiYaEgYaCgIKJkYOAg4x/ho+LiYWAh32AgZKQhoSEho2DhIyPj4+IjY+Hi4iRkJWRjpCKk5eOj5WYp6SfnZWYlpaln5udq6aqt7W4srGnr6qnpqGfmp2WkpWVkYqPjImTjZuVjYuLhoaJjJWQkJCLmZKVlZSbkJiTlIyNkYyWl5WilZ6mqauno6OqsJucpp+mq6G0vb6zs7+5u7u6uby9rqiusa6wuLyztLGxqrCpqLGxsqild3J0X2hhYFRWUUlKSFZNXl5eVExKRVFKRUdDPTo5OTc0ODY4Mzg4PTo9PD47OTs4Ojs/PDw+OT9DPzg7Ojg8Nzc2Mzc5RT4/Qz89N0BAQT0/RDw+PThUj4yGh4eUjJWZl5yWmZaNlZyWlZydoKCdmpiWeHFubXJ4cXFsbnJwa3FvcG1yc3t1dnd5fnVxeHZ0d3tybn98gX15eH1/eYOGg4WCg5CLkIuLi42Pi4mJhYKBfX9zfYiAfpyQhIWFiYuPinp9fYaOjYqGjZSRi5CXj5SXkpihlp6XlZunpp+goKawq6GjpbW0sqqmqq+isba5vcK7ucO+vLi9uLWxrLCspZuSk5mfm5SPk5WOmp2doJqfn5edo6qsoZ+em62hp6qwqaampJiRkZWUo6SirKSss7Szs6i3tru4sLKvra2yt7a6srW6s7e5u7i8urayr6yxsbKztLOxsa2us7Gzs6yhl3Zxc19jXlJRVE1PSUdYT1tcZFROR1VPRURKRD44Ojg3NTg4ODU5Nzo6PTw/Ojg8ODk5PTs9PTpCPj84Ozo5Ojk4NjI1N0I+P0RAQDY+P0I/PEM8PT46Tn98go6MjJOTl5eaj5SWjZaRkZSXk5qanqGdnHJvcnFxcXFxcG5zcW91dHJxdneAdXd8eYV+d3t8eX1/fICJiYmDfXp/h4GIiYGAgIGGiIGGi4aIhYSIiImEf4J/enx8fX6SkH+IeIGFi4qDhIWKj4yNkZmdlJSUoJqan6Ktsa2ppKWtr6ysrLWuvrmtrqm1sLexq7G2rK+9wsLAvrq8trKutraxtK66u7OurKepp6unoqmtoKmooq+wuLSxvLq6urK0ta+8tLezt7e7t7mtrbCprLW5sbeytLe2sLu7vLu6ury1vLi0wbWsqqqrtLG3uLm1trSzsKymrrCqq7Cxq6yusLKxtK6qo5N4dnJlZ1tMUlBGTUhTV1JlXmdUUExcUUhMUkNBOTk3OTU4ODY2Ozc5Ojs6Pjk4Ozo6Ojw8Pj08RD45Njs7ODg+OTUxNTZCRkREP0A3Pj5DPjpBP0BAO0t/gomXmJSdlpabmIuSlo6XkZGVl5SZl5+bmZx8dHV2dXl1c3RudnJzdHV2d319gX56gXyDfoJ/fYB/hIKFj52RiYF/go+Xjo6HgoCBiIuFfoqQi3+HjYyLioeSioeGjZGTkZGEh319g4iMjouOiomQj46PlJSYkZWbmp2dqK6yr6+1tLOtsrW4sLy1tbGqsKqztbS7t7SztrS1r7i4t62noqassLCvtre3vrW5vLOysa61u7C0r6+yu7axuMC9tLS0s7izvLq2tLrAvbm6ubq+ubm5vrWysa+yr6q1tLGzsbSzrri4tb+vpKaoo6ussa+zrq6wsKytq6qroqKmqKKnrauqpaynoqeYeHlxZmVZT09NSVJNV0xPX15cTlVVYlFEVE07Pzk8ODk1Nzc1Nzk1Ojo6OTs4Ojw8Oj08Pj4/P0I9ODY6Ojk6QDs1MjY2QUZDQz4/Nz49Q0I5P0I/PjtLjpGTmJmVmZGTopiTkpKLk4uOkI+Vl5ablZSbhoJ9enh2dHRzdH53end2gIKDhouMhISFioaQiYeRk5aRjZaalY+IjI+emJaVkpCTl5qamJCdoJ2Tl5qgmZ2bo6CVkJugpKOak42IiIuJkZGOkY6LmJqPj4yUmpecnJufnKSstLm6vK+2tLi0tLK3uLmzq6+qqKy1srK1rrGrrqa3s7OxpaGotbCvrayrtbqyu7q6tLK3ur67ubG4sLmtqLK4u66ttLS3tbu2trm5vLe0r7G0t7a5s7e1pq2pq6ior6yprq2up6KxtLG0q6aop6Cjq66oqq6orLKwr6+pqKGeoaGjpqOgopqlo56ol3J3bmdiVUtUT09KQ1BLX2JYWlFcVGBNSFJJQUA5Ojg2Njc3NTg5NDs5Ozk8Nzs+Ojg8PD0/QkBBPTs2OTk5Oj87NjM3OD5GQkJAQjk+PUBDPkBGQj44R5OWkZWTkpSQkZ+ZnZmVkI+Sko6Mk5aWko6RlZGSkIaBeXJzdXuBhI6HhZGTkpicnJiVkJWYo5yaoaeqqZ+clpeVnaKioZyZnpmlqKyvramnqqmop6GlqKirqamvoZufoaOjoJqfoJyUjZiUmKCgoaSem5qkp6Spq66spaOoq6+xtK6qrK6zr6ystLO0ua6urayqrLKwsK2wqKqmsrS0uK6qtrqwr6qurLC3s7i0t7W0u7y4tbWxtauyrKiys7uvrbGytLa1sbG0s7OvrKuvs7a0sayutKqqpqWnrauoqKupqqifqbOwqqeppaOio7CtqaatpairrayppaSioKWipaOYmZyVnqKippdudWVnZFZPWEtLSktTVHBiWWRXX1tcUlpQTEM8ODk6Njk4NzQ3NzQ4Ojw6PDg6PTk3PDw7PkM/QT47OTo5Ojs+PTg0NThBREVEQkM5PjtAPkI/R0Q+N0KSm5SVlZaVj46Wl5qZlZGKk5SSjo+SkYqKiY2Ul5qTjYmCho6VkZSfmpuin5+jnqGhn5ijpKelpaapqa2rqaKmpKilpKGfnqOjra2srairrq6qqqukoaKkqaenqaijopybm6SgpaijoJidmZ+hoqmnoKKirqyrqqetrqilpKmpqammo6iqqaekp66wr7Ovq7Crqq+yr7Czua+rqLCxrrCyubO0r62vtbCss7GurLW1tLSzs7CvrKyqrKusr7G0s7CwrrCwsKyqrauqq6alrrCysKumqbCvqaOkqaunqKaopquwq6mvqaaoqaalo6iwraqpqKKpo6WnpKGhoKKloZ2el5aYlJugpKmUbnNeamlfVVpOUk5QT1JkXGVjW11ZXFBZT0tAPDs5Ojc6ODczNTMzODo9OTo4OTo5Oj08PEBEPkA9OTo8PDw+Oz45NTo8QkFFQUNBOT47P0BEQENCQDdAkZ6YlJeZlpGHi5SSl5GIg4mLk4+OkI2Hh4SFlZmWmJeZlpqeop2anKKkoaCdn5qfoKGgpqGgoKCjo6KlqKmrramqpqOmpaCloKaopqWnqKapqKOnppmcpKaioaChoaCcmJmfoKGkpKKenpagm5qioqChn6CiqKCcn6GloaCmo6KfpKGspp6foaGkrKqnrKivq6e0sa6ur7WyrKqwq6mtrbWwrq6srreup6yqpKivsq+sq7Kvqqqpq6utqa6urrGxraqtqaunp6uoqauinaapqKilqKisqKilpKWop6iopqmsr6+oq6mhoqKlo6Opq6ymqKWjqKKhoKSdnZ+hoZ2bnZ+amZWcnKOqlG9zZm5yZF1dUFVPV09eZGRsaGJiWlpSVE9NQTo9Ojo4Ozk1MTYzMjg4Ozk5OTk7OTk8Oz0/Qz5APTk7Ojs8QD0+PDk5PEFBRUFGQTo9Oz9BQUJBRUI4PYqWlJOYmpaPiISNjpGSjIiIiI+JiZCRjoqKiJubmZygpaKlnqKjoZqeoZyanZ6bnKOop6ugoKOYoJ2XnKGjo6WjoqKkrKilqaCepqmnq6mkn6Kgoqahpq6mpp2fn5+fn5manJyhoKGkn6GbnZqcoJ6hn56eoKOZlpqYo6KipJ+ZnKGhoqCbmp6goaSgnaejqrGorqusqaSqqquorKalrKqws6+rq6mwq6appaWoq6ynpqevq6Wnq6upq6irqqqrrailqKOmpaesqayoopykoaOmo6qpqKano6SnqKanqKepqKupoaKoo5yepqWjqKino6WlpqmgpJ6inpeYnZ+doqKlnpiUlZ6go5d1d2t2d2FfXFVZUVVWW2Necl9oX2NTUVlUSD48PTg7OTo4NTM3MzM0Nzo4OT05Ozo5PDxBQEM9PT44Ozw9PEA/Qz86ODo+P0NAREE6Oz48QD9DQ0VDOTyCmJmenZ2alZKKiZGRl5GQh4SJgoGNj4+Sj42cnZ+hpKmlqaeorK2moqKfmKSmo6Stsa6yp6asm56em5qjp6Cfo5+foq+qqqyoqKuwqaipqKGfoKeprbCyr6yjoqahqaWepKOipqClpKKlo56doJ6fpaKinp+imJWemp6fpKGblZigoZ2enJudnZuZmZWen6Oonp2iqKGaoaOmoqSoqaqoq7CxqKWlp6eopKWpqaqnoqWmqKadnqWloqClpaOlpqCjpaOjpaelqamqpKekpqKmp6SrqaenpKGlqKynpqWlo6OopJWdo5+bnaCjqaeopqGjo6mooKiioJyVkZqfoKGmopuXkpCamqCVfHdvfXlmW1tgX1pcVlxoZG9jbmlpYl5QUEA/Ozo4OTg8OzYzNDMzMzc5OTs8OTs7OT49QkBAPTs9ODw9QD08PENBPjo4PT9EP0M+Ojk/PEI/P0FEQjk6gJ6kp6Kem5+gmY+ZnaCWloqGj4iEi4qTl5SRo6Wnqq6trLOys7S4t62pqqevtLKxqq6usbKusa2lq7OssbGpq6+rq6y2r7Owq7GysaOfoqqpp663trS0trOvrKuuq7awqbKxra6npp6io6ObnZyXoqiloZ+eo5ueoZqWnaScm5aZoqefoJ+joJuUlpmWl5qfoJmVnqKZmJ2dpZ2gpKeqqaiqraylqaSlqqeqqaqsp6SkpKOimZmhnpqaoaCfpaWYnqSmpKqooqelpaGqp6mnp6ejqKWmpaGkqKesoqekoaalpaOVl52Ym5mVo6elpaSfnZ2lo6Kqo5+amZiXnJyaoaGakJOTl5ibjX93cnZ4aWJbX15cYllgZG5ta25hX2RgUE9BQDs7OTs4Ojk2MTQzNjQ3Nzc6PTo8Ozk9PUI/Pj89PDo/OTo7PD5BRUA9OTtAQT5DPDs5PzlAQEBAQkM7OXuao6OcoJ2dop2Zn6KioJibmJaYkpSQm5qWl7S0rrW4s7S4tre0uLm3tbm4ub28uKqLnLK4vLS9urW7uru4s7q/uLe5u7G3r6iusq2inJ+qsri8vL27ur+0r7GztbS3t6+1tLWysKikop+gl5Wal6SqpqahpKOkq6WlmKGko52goaKooaOgpaGck5mYmJmco56cmpudl5uZlqWam5+hqKmpqKuvr66pqKirrKytq6irp6WjoJyfo6Ojn6Cipammmpyip6Spn6GjoqKgpaanpqSooJ+ipKGjoqiop6OloaGopqalo5mbmJuTj6GknqKfmJiVoJuhpaCfm5udnJuamZugmo2YmZiTkYaAdnh4eGNbUllUX19hbWh1a3BnaWliWVNMQDw6Ozg5Nzk3NTU2Mjg1Njc3Ojw7Ozs7QD4/QD0+Pjk6PDk2Nz47QkZCPDg7P0NDRDw+OT43PkFCP0ZDOzhwkpqblJ6bm52Vl52doqajopaXnpaXl6GblJi+t7G4uba3t7i7l5S2vbu9vcDFtaK7mKC3v7+6wcm0nbu2sra/xcGooLa0urGqrrSxsLG0tba8vL68vL7Guri3ur20r7Wxsbq4t7Kzsqqmpp+YpKSnqKSupKurtbWus6CnqqynqqmlpqCnoKGmoZOWmJ2foqSjnZ6coaChnZekmpmdoKaqqqqtrq2tsLGrrK2sqamrrqimpaalpqSkpqaeo6eppKGcoKKjpqCio5+jpJ2foqWgpJyboZ6fo6GhpaSlqaOkpaKkp6ehn52elpOcoJiZko+MjJeWn5uWnJqdnJqSlpSUmJOQmp2YiouHgIB8gnhhXllTYWhgZnNvc2l0ZGlkYltMSz46ODg5ODg5NzM0NTI1NDY2OTw8Oz08P0E/QEA9Pj44OTs4Njc/OUJFQzw7PD5DREM9QDs9Nz1DQ0BFQjw3Z4yRk4qalZiblZWYm6Knq6aVl5iQlZmhnpeXvrWztLu6ubi5woeYt6u4u8DCxbOjw6e4s72/tMTHvbS7uL62wMTErqCworW2tb2+wcPGwsO5vb/AwL2/xL28ur2+tKeqmLHAvbi1ucCzr6+qqqitp6ekr6eqtLyxtLWor7Gwr6yqoqajrJ+fpquXmqifpaWfoJydoKuwsKyiq5yYm6Cor7Kys6uorre1sq2tqaalqKulpaStqaShn6Cnnp6mqKmmnp+anqGlpqmcnaObl6KmmpuanZ+cmqGcmZ2eoKijn6GfnaWioKOioZSZmpmTj4qLhI2Qk5uPjpiVm5eYkJORkomNl5iYk4uKi32AgIVwYGFeXmpiYm53dXZubFtiUVVcTUc7PDk3OTc5Ojc0NDQxNDM3Njg8Ozs8PEBAPUA/Pj8+Ojo5Ojc6Pz5FRUU8PT1AQkJCQUI7PDhAQ0NARD87NV+MjIaFlouUlZeYl5ifpqellpWWkZebn5ual7mxtrO5vLy5urWqsryxvsG0vMe5uLuuv6fGw7/KxsnIxcXJvMLHx7+xsKe8vL7FxMbJx8XGu8TAxcbAua+9vMC+vrOrqoyzu760tbfCuq2vsLWqq6aqo62kp7G2q7WyrbOtqK6vp6awr7Ktqq+zpKu1qaeopKCgnqmyuL61tbWqqaausre4t7apq7i8ubexr66noqOop6SfqKOfnqCZoZydoqSnp6GelJuaoKGlnqChnpajnZSQlpiboZqflpORlpSin5qenJudoZ6kn56VnJiPkpOPjImTkJefiZCWkZuUmJGRlZaDjJWXlpKLjIh8f4N/amZoYWtsZm51cXJ1cWZeX1xSSUU/Ojo6Nzg0ODw3NjU0MjMzNjU3PDo7PDs9QD4/QD48PTk5OTs6PDw+QkRFPj49QENDQkREOzo4QUJCQUNAOTJbk4iEjZGKi5GRlZCSmp2fnJOSmJSdnZqXmpW2sbm1tb6+tri1uLO8vMTEusPHwb+0s8XFxr/CzcfLzsvLx8HDxsfIysXExcO7vLzBxcHFxb/DwsbFwLGTvrq/w8K2trqptLO0qauzu7uxn5uxr6ykrK60p6qpqKqtrKmlpZ6pr6uyu7q4u7e5t7O5uLOurLO0qrC1ub3Bur6+vL60urm4u7qysbS8u7q7s7Oyp6Smq6uioaCdmpudmpyXmpuenJygnZaclpuZnZ6io52UnJCNiY6OkZ6bnJWNh5KLmJiWmpybmJybnp6cmp6UjpiYmpSRmZeeoZWYmpKXlJWRlJqYk4+TnZaSi5F+enx/dGtrbmRvbWhxeG55amlhXGdhUUZEQTw5OTc2NDQ6ODQ2NTMzMjY1Nj05OTs7PT47Pj49Oz05OTs7Oz89QUNBQkFAPEBDQ0NFQjs4OUQ/P0BCPzsyV5uQkZCQh4WSjo2IjZCTlZGPjZSUm5STlpqRs7e4uLi+u7C1sri2tbbAw8G+w8LAvru+u7u8xMzEzNDLxsa/xcfLyNTLysjGv7u7vsS+xcjGxsPEw7i0wLe0vMHCucK3t7/Au66lrre8t62co7ewpq20tayupaWjqKSgoKWZqrOyvsG+urm6uLW0srG0tLO6wL7Av769u7u9vsDCt7a3tru7sru+ubi3u7a3tKyoqamrpqijnpOampyYkZKZl5GRmJqXnpiWk5acm5+elJOJiX6GiIuWlJiZkYmVkZeWlZmbmpaYl5idnpyhmJWZmZyYl5ybn56jnJ6WmJeTl5yZmZyUlp2UlpOJdnl6e3Zua2lndVpmcndzeGZnXWRbUlhJRj87Nzg4NzYxNjk3NDQzMzM2NDY7ODo8Oz08OD0+PDo7PDs9Ozs+PkRBQURCQEBBQkNDREM9OTlCQD8/QD89MkyWmpaSk4yKmJCKi4yOkpKKiIaNkJiKj5CUl7O7tba/vb2xtrjBvby0uL/Bsbi3vsHFvbu8wsbJv8jOyMHEwcfKysbKxczIzcbIxb/DwMvNz8rGxMPDwcS+uL7Bw8DEvsHPz87Gq6+2tLWroKe0s66ruLWzq6mjoq2prKatn6y1tL/Cvrm4vbawrausr7W0ur7Fv7u8urO5u7i5ubWtsLS9u7G/vLiytrmzubu0ra2orKyqqaeXnpualY2MmJSTi5WWlJyZl5WWmZKYn5mQiop+iYqKkY6Vl5OUn5mWkJSZmJmWmJOUm6GeoZiYmp2ZmZaenpibopqdnJuYmpuZlpeXlpyZlJyYfoB4eXV1ZWVpamddam9teHdjYmBgXlhXRkU4Ojg6OTc5NDQ5NzY2NTEyMzM0Ozo9Pzs9PTo6PTs8Pjo7Pz48QkBDQkJFQj0/Q0NDQ0RFQDk6QkFBQj5CQTVCkJeUlZmSj5qQjpKRjZSVi4qHjI2UiImPkpq2u7S8xsHEwr3BxcLAtLO9v6ywr7rDysPCvs3IxbfByMW/wcLIy8rCwsTJzM3Pz8zDx8bIycjIycfFycfIx7/Fx8TEx8jK0s/SzLy4trS4uMG+vrq9ury6vKytp6q7urm3wLK1uLLAxrq3t8Gzsa2tqau1s7u2w7a2vbWxt762s7e4sLW2v7uwvbq0q7CxsbO8urOzrqutq62xnaOjoJqQjpiXlZCclpaYlpWSnJmTm5+clpGUjpWQiYyQlZOUm56YmZKSnJedlJmSk5aZmJ2VnJ6do5yVnZ+TnKKcnKCfnaOemJSVl5ebmpmgkH99cXRxb2JhZ3VnaWl0bXhsXWRbVWBZTEhDNjw5OTg4OjUzOjY2NDQxMzUyNTs6PD47Ozw9PDs8PTw7PD49P0E/RUFCQ0M+QEFARUVERUE7Nz5DQkI+Q0I4O4+akZaalJKUjZCUlI6VlI6Pi4yJk4uIkJObt8C6xsXEw8zCwcS9vrWvt7uvr7O6wMfFxMHMy8W2ucDCwsTHytHLwsPExsnFzdDOx8zJwsHHwcrKyMbMys3FxsXDxsXJzdDNz8zHxMDDwsnNx8XBxMfBu760sbCwwb6/wca/vri3w8K6urbAvrWyrKmvsri+tMC0tLi0t7nEua+8vrm+v8K/tbq2q6qsrq+wt768trSura2utaSlqKimmpycnZyeopydmZOQkp2VmKCdmJiVmZmZl46MlH2QkJefmZmYk5GToI6Nko+VjpCUlaKdnKSem56elpyjoKGipKOkop6amZubnJ2enIN9cnx4cGdgamp2bGlldW9zYl1iVFdUU01HOjc7OTk3Nzo3NDg3ODQ1MjM0MjU7Ojk+Oj08Pz04Oz05OTk9PEBBQEVCQUJBQT9AP0RFREVAPDo+QkNCQENBOjSAoZeUmZiVkImUk5aTiZGMlJGOiJaKi5CXnMXLw8O8wMPHwbm9vbu4tre3rrK3uLzAwsDCx8bHurzAwsXHyMbSycHCw7+/vsTLyMrLyLu6yMfJzcjDyMnJxcXDwsHCx8fJysfMyMfIzcbLz8W3wMDAwLu6vbWzs7+/ub/DucC3u8G8uri7ub27srCvsKy5wri9ube1t7q9xb24xsjCwcLGwr28tamurrCwr7O6t7m2sK+tr7OppquprqannqSlo6OjoqCblZiekZecl5GRlZeZlZmRlJiSlYyYo5qcnp2FiZ+TfJKWlZKUlJennaCipJ+en56foaGkoqKjoaOinJ2fnqOhppl5enl/cnBmZWdkamVham1ub15ZXFZWTlBKRjk5Ozk3Njc3NjM3ODk1NjEzNTI3PDs8QDs/PDw6ODo8OTk4Pj1APz9GP0JBQz89QT5ARENDQTw5PENBQ0RBQDozbKKdlZedlo+PmJiZmIiSjZGVkI+Vjo6TlpbKy7u5urnBu7q3vsG8vLu5sa61uri4u8S6vsC+vru8wMXBxsK+xsK5u8O5uLm7vcHHwcTIxsfJw8XEwMTBwsHEwcO+vcLAwMHCy8PGzMvFyNHCsL69uLq7vL63tLC5vrO8vrG5tbi7tryztbm2uba5t7GtusG6vMG/t77Ev8bDw8fHwrvAwr/Cv7iys7O1tLGut7S3tbSxrK2xp6Wlp7CtqJ+nq6ajqKWmpqCgn5SYmZSRkZWUl5OYl5qhnZ6hnKGdoaWglpSbkZeXmJqTnpmZqaSlpKWdoqCanqCkoqOcoqGjoJ6cnp6ppaiVfXuDeG5mYWRiYWJjY2piZmNaWlpcWVFORT07OTo7Nzc5OTY0OTk6NTMxNDUyNzo7OkA9Pzw8OTc3Ozo5Ojw+QD8+RDxCQURAPz49QkRCQkI+OjlCP0FCPT44NVmfnJiTmZaRlZiYmpeQkZCQk5GTlJKSkpSUxce4tbq5wrm5vMPFwri7ubGxtry6tbnAu7u5tri0tLW/u73Aub66urTAuLW3sq66vLbH1LnLvsG7v8G8u8S+u8HEwL6+uLzBwcu+vcnEwMDKwLHBv7u4u765tbe0uLy0vbi1tLCzvLG3tri/tr25vb65t7q+u7/Axb29y8PGw8TAw762ubq2v7i7v7y4trOyq7CwsrWzs66sq6emnqeurauiqKumpqqjp6iqo5+Ym52bmpicnJiXnJuhpZ2anqGhoKGmoJqbnJiboJ+dnJ+coKiho6SknaKfmqKgop+el6Shop+dmpieqKWhi3x5iH1xY2BiYmdqZ2ZpZWldVlZUWU9TS0U4PzY7Ojc3OTs2NTo7PDYzMTM0MTc7OTg/PT47PDs3Njk5ODo7PUA/PkA9PT9CPjxAQUNDQT9DPTo2PEBBQDw9ODdJlJibj5OUkZWYlZGWkpWRkJGUlZSTkpKYlcHCwLq8ub62uL7EwMKxvbqytLO4vLW3vMC8vbS1sbC1t7W7wbi+ub+8vLe0t6+ut7W308CY1Lu/vLvDtbrHuLa5u725ura7xcXKvbnFwL+8wb64xr3BwLzFuLa3tLi2tru7uLa0t7q1tLi8vbm/ucPAwLu5vLu+vcjEvcfEw7rAvb62sra4srm0usLCureysaysq62yr7Kur6ijpJ6rrKyqpKakpKiqoqemraihoaGmn6Oiop6bnKKfoKOdnJuhn6KgpKCem5eZn6GdnZ6eoaWkoaKioZ6ho5yinqCZnZijn52eoJqZoKKmnYR6g4B4cG1lZWZvaWVraFhYTktLS1JJTEhDOT04PTs2Ojs5Njc8ODk4NjA0MzE3OTk7Pz0+Ojw6ODg5PDg6Ozs7PD1BPj09Q0E8P0NDREA/Pzw6Nz5CREE/QDg4P4mYmoyMkI+Tl5WMkpCakpGXmJaUlJKQmpTDvsbBwby8uLi6v7a8scK2tLyxtLa4s7q9v728sq2vrLGwt7y3u73BxLm3t7a1ubm5utK0jLjDwsK+x7e5uK23tbi6tLizu8XGy8G7xsDAv728v8nDxMW+xri1srK9uLi4vrq6uby6urS3u7q5v7zEwL+5uri/ubvFxr3Fw8Kyur27sa+2uLO3s7q+wLm2rLGrrqmqqa2qqq6mpKWnrq2ppaOio6GkpaWmoqato6Klo5+ho6Gcmpyhn6CloaCenZygnaWgnpeVmZ2fn52gn6KmpaCknpybn6Ofn5mcmZ2epJyWnKOcnqGcppZ+f4d8a25wZ3Brc2VibV9cVEhLSkRKQkNHPzk7OD48Nzs7OTc4Ozc8PDYyNzUxNjk8PD08QTs8Ojs6OT45Ojs9PUA+RD89PkRAPz9BRkQ/Pzw9OTc/QUNCQEI5Ojl3nJiLh4uQkpOWjY+TmpOQnZiSkY6QjpiSvbfHvsO+vbu+vL22uri9ure9s7OwuLi1uby8wLeqraSvsLi7sr2+u8S2tbi2uMDAxbvNqISVwsvJxs/CwLiutbW8vri6sr7ExMrFwcnDwr+/vr3HzMfHxMe9tbW2wb26u7/CusDCv7y2t729vcHBwL+8ube8wru3v8W7wr++tbe8vK+vt7awtLO6ubq7r6mtq62rrKaqoqeuqKWqra2vp6Sgn6ajnqKjqKOjq6Oiop6dm5ublJaZnJyfpZ6fnpmYnpejoJyXmZqZmqOjop6jo6egpqCbnaCjnp2WoJmcoKCblJegn6WcmKKQgYaBcWVsaW50bnhjZ2JbY1FLVEhFRUNHQzw7OTg9Ojc6PTo4OTs3PD01MzY1MDY4OTo8O0A9PDo+PDk+OTk9Pjs/PkM8Pz5APz4/P0ZEQEE/Pjo3P0BDQz9BPTo4ZqGYj4uNlZKVlY6PlpmVl5uVjoyMjY+bk7m2wbS/vLm8w8C+wLq1trKywLmvsry8sLe7tru8q6ujsbm9vrK6vrzFuLG4uLbDub/DxJ+Ei7nKzM7RzMrEtbrAw8i/vrW/wb/Gxr/LxsO/wbzAw8zKx8XGwLm9vMS/wL/CyL3Hx8XFvLrEv7vBv7rAvLu7wMS9t7nCub69t7S2uLqur7WxsLCytre0t6yurKqsrKuoq6Gms6qlra+trKippaOkp5+io6Onoaeiop6cnZyamYyQlpeZnaKZnpuVkp2UoaCdmZ6fmJimpqKfoqKmoqeloqCko6GbnaCbnKKfl5WVnp6kmpafiYGDgXRvbGx0a2xuX2JeYGFOSE0/RUA/REM8Ozo6Ozo4Ozw6OTw+OTo+NDQ1NTE5OTo5PDtAPD89PTw4PDs6PDs7Pz5DPkI+QD89Pz9FRUJBQj87Nj9CRUQ9QUE6OlmfmJOSlZqVmpOQlpeclZuZlpSVkZKTnZm2uLaxuru6vsG5uca7trWypb69tLbBv66zvbS4wbGwsbS8wr3NxL27xL+5sZWKjnqIla2XhYyuxsnIzMvNysbCxMvOwry5vbm5wMO/yMbEwcG/xcDKycPDxMO5w769ub+8wsbCyc7Hxr66xr26v7m3wLm5vsDCvrW0vLi2u7CvsrK1r7Cvrqyus7CzsrirsbKxqrCrq6yrrLatqKyusqarrKmpoaWgpaakrKSmoaChnqGgnaCMlJeTm5+mmZ6emZOYnZ+gnp2eopuYp62ooqSgoKKqpqmhqKGlm6CgnZ2jn5SYmKKdp6Gfm4J7eoh6bW13e19wY1tdX15TST5DRUlCQz5DOz42OTo7Ozs7Ozs7PT05PTU2NjIxODo5Ozs6QTs/PDw+Nzs8Ozw9PTw9Pz5BQUE/P0FCQUVDQkRAPDY+Q0RFPkJEPztTmZuZmJ6dmqCalpyZn5KdlZ2boJWWlJqYur20sLu8wcTCv8XGura5sqO7vbS3xLuwtbq2ucS4tby2urzGyNvCtb+8sIxqcXFYYmZ4iYqNqMHGwsfLyMHDwcDJysLAu7qwtLu9wMXGxcW/wMK/y8fCwMjAusK7urO6usG+wMrOysS9tby8ub+5ubW1s7/Avre0s7S4rbeqr7CwsrGvq6+nr7ausrG5rra2uLSzsLGttrS6sa6srranrLKsraSjoaenqLKrqqWkp6elpaCml5ujn6SmraKeo6KanaWiop+foaWenrC0sKSlnp+kqaevp6mgq6CiopqipJ2anqGmp6+psZWCe32Bem1zeHNncF1bXlxZUUVEQ01JQUU9Rzo6NTk7Ojw8Ojs7Oz0/Oj01NDUxMjc4ODs8O0I8Pz46OzY6PTo7Pj0/QD87QUFBPj4/QkBBQkJFPjo1OkFCST9AQkA7TJqdnZ6fnZienZmampySoJWbnp+blZGRlsW+urbDvMbCvr/Ixbe1uLe2ubu0r7e2srWzt7m8u7a7vL260rLByba0knR5aGJ+aVtaXHCKj6m7wb2+xsC5wLy+xcS9vbmysK64t7/Dx8PEvL2/v8PDvr/HvLy/tLSutbW8vr/OzcvCt7K4uLi9ubuxtrLIwLu2tLGwt6yzqbCtrbO3r6uuqrG1r7Gvt7O6usC/tre2sru6wLWyrbO3rLC6r7KloqWrrK+5s7KosK+xr6qiqKGkraitrLOun6inpqWmq6Sknqaqo6ayuLOrpZyfp6anrquqpbClpaWbpKOYn6exrLW4sLKOhHl/fHZsdXpwbmlbX2BZU1BBRUhHS0BEQ0g8PTY7OTk8Ozo6Ozo9Pzw9NTU2MTM2OTg8QT5AOz1AOzs5PD04Oj08QD46Oj49Pj09PkBCQkJBRD03NDU9REc9Q0I/PEWUnqCgoJyXmpiYlZmdmZ2fmp2bnJaRj5LDwMK9wrzEvLy7xbu3s7e2tru7s6CWtayvsbS0tLa4ucHAt9C2psa2jmdSbm5Pc4t/d15ZfpKxube4t8K6s7u3u77Au7u8rq+us7K5wcLEw768v7u6uLbBwrW/urWur62wvcC5z8rJw7GvtbS0vbq+ubq7ysO7uravsL2xuK+ys7C3vbaur66wt7CsrLK2vbzEwrq9t7bAv8G3tbC2srGzurGxr6err6u2v7e1qbqztbmxp6uop7ausrG1uaisrK+qr7CqqKessayytr20saykqKuoqKusq6i2qaaonqadmKOuvLG7wbSmiYF8gnpzdnZ3bnFgX2VdWlRKPD8/RkY9RkNDOTo1Ozk5Pjw8Ojo8Pj4+Pjg4MzE1Nzg5Pj9BPzs6Pz08Oz09OTs8OTs6Nzs+PT1DQT8/QUJEQkE8ODU4PUNGPUREPzw/iZ2en52Xl5WUk5aZnpubmpuYlJ2Uio6Owb7Dwr6+vrm2usCxtbGzt7fCtbOrrbOoqa61r620trnDv7bJtJaxoWdYVYtwU116goeATWiYtbaysre+ubK1sry5vLa6vrK0tLSwuL7DxsTAvb+5s6+yvLquu7Szpquorbq+uMvCv76sq7Cvs7q3ub67wMXBu7y3sLXEtb+0uLu0u8PCs7a2sbisqaWrsr23v7+7u7exvL28trGvq6uprbOvsLCrsLSpuMC2sqm0tbC3tq2spqu7s660uMKwsbG1sbK1saywsri4ubi+tLGzrqyxramvrqqyuK6trainoZ6ptr+4ur+wlol9gHxxdHd0dnFsXmJgW11PSEE+PUhDRk1DQDc3NTs6OT48PDk4PT47PT86ODMyNTc2OD8/Qj86OD4+PTw5PDk7Ozo8Ozs6PEA+QkI9QEE/QkI/PDs3OjxBRD5CQz8+QYqgm6GdlJiVlZKYmpyWm5WalY2bj4SIhru0vb+7vLm3s7y8rLOytLS2wLXAr7Kzqqqxt62pubO3wL27xrKTnoVYU2ecZlJXV5Kpflhap8O5s7C2urW0sqy8ubi1uMG6uLOxrLe8wcfDv7m6ta6lrLOwprCtqJ6gn6WttrXCt7a0pairqLC2s7K6tbu7u7W4trC1xLK+vL+8ubrFybq9vraxp6SeoamxrrW5trKxq7S3trGopp6gmaWmpKynq6y2qa+6sa2kpq2lq7GrrKmtuLawsrjBtrGxtbGvu7ayt7W1sry1urKwsbKutLKqrq2nuLWyta2uqqiosrq9wLa0qY6Ce393b3tvdXJtY1xmWFxdUk5NQT5JQkFKSUA2NjU7Nzg+Ojs4Nz4+PDs/OjkzMjc1NzU8PD48PDg+Pjw8OTk5Ozs7Pjs7OTw+P0E9PEJAPz9CQD47Njc6QERBQ0E/QUKJoJ2loJSWmJiVnqCcl5uYmZGMmYmDhoS1r7S7u7S1sLG2uq6wtLOvtbq1urC1s7KttrqvrbyzuLq3u8+5mJNyUmWOfGZUYm2lvYZjU3aeu7axtLWytK+su7q4trnAw7aurqqytry9ubaysa2tn6Snp52jpp2WmZman6muuayrq5+lqKSrrq6nr6yvsbGtsa6usLmwtLy+uLm4x8W8vLu4qaKcmJufp6assq6zqaapqq6popqXl5GcmpijnqKir6ekrKaompqemqGnp6anqa+2squ0trCqsK+xqbm2sbWxrqy3s7avrquuq7S1ra+rq7GtsbKoraurs7W3ur2wq6GLeoJ5cnZzbXVpa11balRdXE9NSERGTEJGTkY4NjY1OjU6Pjg7OTc8PTo7PTo5MjM2Nzc3Pjs9Pjo6Pz48PDw6Ojs5Oz47PTk8Pj1CPDtAP0A/QT8+OjU1OkBFQkRBQEJBiJ+ipqGYm56dmqWpmJudmpmUjJmHhoeGrq2uuLmxsqiur7iyq7CwqrK1ubm+tbK4tLm6trm7tbWztbnHvqCSZFKLmXJ6eYtygpJ1cHVtosG4s7SzsLGtsLm4try4u7+ysrKusa65r6qrrayjqKGdnZ6XmKGVkpWXkJifqK6ko6Sgoqeio6mpoaanpaqtp6ynqKesq6yyu7SztLm6trK2ramgmpaWm52fq6yrr6Oko6GpoJuTjo+Qk5KSmZaanaSloJ+ep5iVkpSZnqSjoaWqrK2iqaqppKmtrqW0sa6xraqprq+wraWmqqSos66trKmmpqmrpqqnq7Ksr7Oxq6mWgX+Bd3J4aHRzbmRUYGNXXFFOTEhASFFETUM9ODg3NTo3PD46Ozw4OTw7Ozw7ODI0ODk3ODs7PDs4PD0+Oz08Ojk8Ojs9PTw6OkA9PDw7QD5CQEE/Pjk1ODs8RkFDRD9BQYijpqKjnqCfp6Coqpufm5yZmI6Xi42PjKqpqLGvsK2lp6ayr6mmq6CvsLu1vby4wMG+vLy8ua6sr7KywL6snFZelMSVgZiSZnV1doB+fa+/uLGss6+urK62trK0ta+qpJ6bnJyeqKieoKipn6GnlpuXl4+dk4+Qlo6Xm6SooKCioqKlpZ2jo6CepaCkrKSmqKSio6OrrLOuqa6urqeqraisoZyamJmYm6moqqufpqKbo5yVkIyPj5CTkJeVlpifnp6amKaXk4+Slp2ioKWjpqSnoKKko6Ghq6uksq2qrKyno6yuraufoaKkpK+srKmmo6KqpKqqpKmrpqmsq6agiHiDfHZ/eWJ3bG5cUWhUUE5HT01MQk9RQD47PjM5OjU7OT07Ojk9OTk8Ozw8OzkzNjk5Njo7Pz06ODs6Pjw6PDs5Oz07PDw9PjxAPT88ODtAQEE/Pz45NDk8N0FDQkQ9QEOOqqSjoqGinaulpqimoZ6dmZ2PmJWTkJWnpKGmqKmlpKChp6uhnKKbp6u1sry9wMLCwL7AuLSnpayqp73JtaRWZIWTfml0bGdjZmt1cXCQrrOzqrK0rqqrr7Cys66lnpKYlI+YoJ+ioJykpZ+eqJSblpeMl5GNkJeTmJ2iqp+fn6Cjpaicn6ChnKKfo6innKehoKSfrKisrKCpq6agpKimrKOdnp2Zl5qrpamxo6WonqCclZOQj5GQmJCWlZiXn5ibmZqjmZeUlpqdoJ2nqKWgo6Kho56doKmqpa6upqipoaKqrqqnoaCio6msq6eppqShqaKlqaalpKKmpKijkn18gHV1fW1re2RoVVFjTUpIR05STkpORzxFQD0yPzc1OTs+Ozk5Ozg6PDs7Ozk5NDg7ODc7Oz48Ojk8Oj07Ozw9OTw8PD49PUE+QEJAPTc6P0FCQEA/ODU1PDpAQ0BEPkFGlq6koqWeo6KpqKipqqWmnp2imJiZmZWbop6bnqOioKOgoZqgmJeXlqGorK62t7q5ure3u66ooKGpop+0z8CsXXh1eHRkaVlQT1NSV1dgd4apta6vs7WqpqyropyZlI6RlpeZmZygoqKcnaWemqSXl5eWkJKRkZOal5ugpKqeoaGepqeqop+gp5+dn6SnqZ6jpp+qnaqtqq6nqLClo6Smp6ymoaShm5ier6iusqulqqqgmpiYmJWTlpqTlZWalpuXl5ihnpycl5uhmp6ao6eln6GioqOdm6Gmp6aoraOppZ6kp6mkpaWhpaSsrKmmq6eioKSjpKenoaCgpaKmoIl7gH12eHxkeXlgYlJVYElJSktTVElSUEw5P0I2Nz02NTs6PDw5Ozs4Ojw9Ojs4NjU3OjY5Pj0+PDk5PTk9PTw+PTs7PDo+PTw/Pz9APT03Oj5AQEA/Pzg2NT08PkFCRkBAR6CupKaroaOqrK6tp6ypqKCipp6bm56aoJyalZmfn5uen56WlJOXk5KcnqSorq2sq6uvqq+pnpeepZ6eqc3NmW96dnRjU01USFBJUE1MVWRniLWwsLC4rKahnJ2alJeampCOkZWRjI6OlJminJejmZqXmJmUmZiWnZufpaapoKajnqeurqumorGjmqSmpqqioaqiqaSosquxsqu5qKarp6urqaysp6Cgo7GusrC0qbGvopmcnZ6hmZubmpiZm5SWm5aZnKWhoJqjoZqcmZ+kop6gn6KmnZulpqWkpaijp6OepqOinqaloqWlqKykpq2noJ2dn56gpaGenqWgppmBe4F8dXZzaIJsZVtTWllNUUpOTlRMU0xBNz5CNjg9NzY6PDw9Ojw5ODo7PDo7OTc2Oj01OTw7QD03ODs3PTs9PT06Ozw4Pj09QD5BPj4+ODg8P0BAPT43NTg9Pj1BQEZAQUihqqCrq6GkqquwramtqaelpaWkoKGfnqWXl5SYmZ6YnJ2blo+VmZKRnJihnaqip6Cep6Gln5ySnKKbnqTKsGhqa3NiUlNVhXVqU09KSlFWWWOnr62sr6efnqKgl5GTm6CcmZeSk5+coaSbnpuWn5qfl5uinqWhnqSfpKitraisqKSstLe2sKe0rKKtraOvpaSmoamorrWzsr23vrCssa6tqaq0sbCoq6iytbezuKyytKSgnaWfrKGhoqCgmpiWlqCbm5ikoaCeo6GgnpqcpaCfnZyhqJ+fp6meoaOkoKagnqehn5ymo5+ipaOooKmrpZ+dnZudmqainpyjnqeQgYJ/fHh1aXd1XWxaUmBIUlVIRlVWSkJMRz1LSDhFPDY3Oz49PDo8OTg6Ojs6PDk2Njo8Nzs+PT8+OTc9OT47PEA8OkA6OkA/O0A+QUA9PDk3Oj5APzo+NzU4PT0/QUBEQEJGnKueqamipamprqimqqWmp6aoqqGlpKOmkpOVmJacmpqcmpWTmZuNk5+ZqJ2un6eenKGdnpqZkpmem6GhrJh4bmtgVExYeqqwoGxSSEVHTFFWjauqqqmkn5+ZkpKTmJiWlpWMiIuOlZ2dnZ2elp6apqCgqKWxqqeuo6uttrC0srGutri9wLqttbSwt7CutKmmpKWsqbmztbvDvMPBtrq2q6+xube8r7OwtcG8tr2zs7WirKKpqLKpq6inqJqZnpqqp5+Zp6Cfn6eopaSfnaqhop6bn6igpKetmZ+jnp6nnqCmnpycoqGbo6KhnZympaWkn6KZnJukn6CboJyjiYWEfnZxbWl2bWhtXFhbQldOSkdNR0JGTTw+TD00PDk2Oj0/PDs6Ojg4PDk6Ozs8NTQ6PDg5Pj4/Pjg4Pzk8Oz0/Oz1BPTo/PjxAPj8+Pz08Njs/QT07Pzg1ODw8QERCREFCQ5WqoKapo6mqqKmjoamgpqinrK6lqaWpqpSSl5mUmpqanJiYmZyamJmqoLGit6Swpp+enZ2XmJWZnpqcpKCfiG1gVVBRW6Ld4MONcFtLREBEYZawramqpZ+enqGinZ+dmpyclJOVlJ6emJSFnZqhm6ukq7KwubKysbKxur28vLm2uMO+v8K/trq6wMS5vbusr6exrbHCtrjCxsDIysDKv7C5ub25wr64s7vGw7zDu7ezqbOtqrO0r7Ouqq6jnauntrKsorCmoaOvsa2wpKWvo6GgmqGnoaSqqpmdoJmao6CmqKGcnqKemaSenpiYo6OhpZ6mmZuipJ6fm5ubnIeFgXt0cWtrdXJwaFdbUUVUSERJT0g+RUE0Rkg5NTs9Njs8Pjw8Ojo4OTw4OTs4Ojo4Ozw3Oz49Pj02OEA5Ozs9QDw9QDk3PD07Pj0+PUI+Pjc6QUA+PD45NTg9Oz1DQEFDQkGRqqGlqqelqqimn6KnnKasp7Gyq62jqayVkpWalJecoqGbnqCinJ+psqu7sr+rr6ylnqCgnJyYmp+gmp+flHNiV1NUWW2z3Mawq6yMbVVbgaywpqOjoaCepaulnpeclJGZnZiUjIqGiIZ5bYigpKKrrLS8tsO+vrO7wcPCxcC/wsbGxcPIwsDFyM3QyMvDsre1vrK+xbu+zM3FzMzM0se+v8DCvsfGwrfDycnCwca+urS6urS7t7C1sqq6sq67t7+6uqq3rauquLq0vK6uuaOmo56mpaKjqaaZm5+Ymp2nqqegoaGkmJSjlpSZkZydn6Sep5+en6KdmJmUmJSIhH15cWtkaG94amRaW0ZLTEVEU0xEQkU3Oj87NTQ5OTc4Pj87PDs7OD48Njo9OTw9OTw9Ojs9Pj4+NztBOj45PT45PT44Nzs6Ojs/Pz1CPj83OkFAPTw9ODY2PDo8QT9BQUE+kqugp66ooqulpKKipaGlqquwsq2upKmmlJWWmpaUm6SmnaGqp6KrrLy8v8PBsrK4p6Ghq6qhnJ6hoZ2bnYlfU1FVWW6HtcWzlJ7YyqyjsKygmZybnp6Zl5eXkoyOl5eTjo2Qi4KDgndzcW5wj6atrrS5xbvNx8u/wszOzczHydHMzczHycXGzNDS1c7Tyb3Av8O7xsXIxdLTzdPQ09PMysLFxsbKyM6/yNHMx8XHxcG8w8G+v761vrOtv7/Cw8fEx8SuvriyuLzDwcG6vLy1rqenraigoqmlmpagmpmdqKupo6SknpePm4yQmYmVmJugn6OdnZeempOTi5WPhYB4dHNlYmdyb2ZeWllDTkxDRVBJRENANTU1ODpCPTY4OkE+Ozs+PDk+PTc6PTk6PDg8PDw7Pz8+PD0+Qzw7OkA9Ojs6Ojg4ODk7QT48QD8+ODtBQTs7Pjc4Njo8PkI+Q0FAPpOvn6ivpqiro6KloKampKuoq62qrqKqo5Kcl5ebmJuirJ2frqalsarFxszOzb+wwaikqKytqqCdo5+cnZt8U0pPUmeDoraypYmtzLuxrKOenJ+amJaUkpSWkZCPjIeEg4iHg4CBgYB5cnJvbHmktrq5vsvB09LTyM3O0dPR0tHQ0dHNzs7Qxc7U1djS183Gx8nMw8XKz8rS19HX0tTW09PIzMfMzcnSzc7TzcXIycrBxsvHyMnGv8Ozs8jEy8rLzsXKv76/vcHHxMzMyMm/w7+tr7OonqKqo5qTnpyYnqaprKSlppaXipWFkZSHkpKSmZualpiQm5WQjIaRi4B6cnR2aGNndmlkVldRRE1GQElRQj1CPDoyMkA8RDw3OTxCPTs9Pzs7Pj05Oj48Oz44Ojk5Oj86Pj1APkA8Pjs+Ozk9PTw5Njo6Pj08PEA/Pjk6QEE6OT44Ojo6Oz4+PEE/QT6QrKKiqaanqKSfop2qqKOso6OnpqyiqZ+To5iWn56dpK6bn7CrqKyxyc3U18/Gu8esrbO3rK6jnqOinaGlcU5FTVV3k8XKrpyjsaminJ2coKSgnZqUlJWUiXx3cGtlYmhxb3F7hYqAdnBucXRwhbPCvsXR0NfW1tLWzdTW19TT0dPU1NPP0cPQ09bY1dbSy8nO0cvGzdHJ0tXW2dXX09bYztLJz9HMztDM0s+/yMfKw8zMzM7PxcbHtr/Kv9HNy8/Fyci/w8PIzszP0M/NysfNuLe7qJ+lq6eemJ6jnp2qpa2pqKiSlYiQhIyRho2MiJOVmZCWjJiSj4aHjIR8eHN2b2NgZXJiXVJcSUpHQUVIST47QTg9NDU4NTs4Njo8QD07Pjw7OUA7OTo8Ozs8Nz09Ozo+Oz08Pjw/Ojo8Ozs5Oz89OTU7PD48PD0/Pz46O0BCOzk/OTg7PT0+PzxBQEQ8hqugnKegp6Oim6CbqaSlqaCfoaGmn6ifmKSimqmmoqarmqOwsamotdDU19rSx8bLtLXBxbG1qKGkpZ+hrHhNSU5ehLfb1bitqpqUl5+bm6Chn5ucmZWJd2ljYF9fX19eX2BeYmx1c3Fwb2xycXWSxMfG1NXW19fT1s/V1NrU1M7P1dTU0dHM0M7T19bT1dDP0tPRydPRx9DY19jR2NLX2dXWzM/Pyc3Sy87QwMbCx8XOzdHR0cjLzcDKzMXTzszOyMTJxsbIzMrT09HVz9LM08G5xbGlqLWup5qorKWdsqiws6ysk4+TjoiKj4OPi4SQjpmNk4+Zj4+ChYx8enFzdG1hY2ltX1ZQX0pKQ0ZDUk0/PD41NDo9NTI4NTU8PEA8Ozw6OTpAOjg7Oj46PTg+Ojo8QD08OTs9Pzk6Pz07PTw9PTo2PD0/QD08PT0+OjxAQjs5PDc0Oj48Pz89RkFEPYKknKClnaWlo5mcnaSeo6OfnZ+doJqnnpyhqZ+vraqqq52mrreoq7fX1NXZ2dHO0L+8zMm2vq6mqqiio7OLW2VtibfXxq+mn5eVl5manaCcmZydk31xZWNjX19hX19hYF9gYF9gZm1wcG5rb3J3d5vMwNLV09jY1tnR0tLXz9POy9LN1dTSys/M09bS0dbNz9XV0cbR1MrQ1NXWztLQ2NjY18vIzsTJz8zKzMDJv8fJzc7Py9DNzsvOzsfL0NDKzsrCycbJzMrL0dLM09HRz9DKvci5sK67uLWqtrCtqLits7+7sZqPn5SRjo2IjpCFkY2ZjJGRlY6RgIWIenVvcG5rYWRucGFXXFpJRkZETVdFO0A9MzM8PTg3ODU1Oz5APTk8PDg8Pjk8QDtAOj04Pjk4Oj88PTg7PkI6Oj08OkE9PTw6Nj08P0A9PDs9Pjg7QEE9Ojw4ODs+PD4+OkVCRT6Bn5mlp6Cfo6eam5+cl56eoZqdmpyappufpKefuLa1taykrK6+tLDA2NLX2tzWzs3Kw9LPwcCwqaytqaOzm3iKp87Us5ublZOXm56enpyUlpiViGteXl5hZGJgYGFhYGBhXl9fXl1ibXJvb3N0dnZ5pL7L1dHW1NPY1s7O1MvNzsXOytLSz8bOzc3UzM7TzcrX1dDM0dTLzNDR08rO0dXS1dXKv8nBxczCyMnCzMPFyMrKz8rNzNDN08vGyM/MyMfLxMbBxcrMzc/RxtDOzc3Mz8XHwLi5vcPDvcO5s7K+sbvDxLWqmKWimZaRlZWSi5SNmpGUlI+PlIKJhXlwcmttZ2BgcGhYWGhWTEZMSVBQQjtDPjs2Nzo4OTo1Nz09QTs6PD05PD05PT06Pjo8ODs9OTtAPD47Pj5BPDk9Pj1CPTs3NzU/PDw/PDw7PDw4O0FAPDo8OTs7Ozw9QTpFQUU+hJ6bqK2epKSqnJ6fmJKXm5+am56ZmaKVoamppcTCwb+7tbKxx8K4y9XV2drb2MzMz8jW1cTCta+0qKCro4iNkrjUrJSNjZiVkJSSkZaWlpCLfGVhYmJgXV5hY2JgX2BgYWFgX11bXWdycXFyc3FtcnmkxtPPy9DP1NXJxcnJxsa/w8bPzsfFx83K0sjLzs3G0dLPzszUysfLzs/Hx8/Sy9DPxbrEv8bJvcLHyc7FwsjAx83IxMzKy8/IxMTQyMbCxsjEvsDHzMzLzsLLy8jHzNDExce7x8PJyMLPwb28v7DByce5vaqwsqelnaKcmJCbkKOZl5mRlZiJj4J3b3Rka2BeZnBhW1dgR0hIR0lNVEc/Sj02NDM1NT08NDg9PT06Oz08OTo7OT89OTw7PDg6PDo6QD1APD09Pjw6Qz48Pz04ODk6QD4/Pjw7Ozs7ODo+Pzw7Ojc5PD49Oz49RkFDPYOgm6qupa6qq5qdoJeUjpedmpmgmpqcm6WysazJzcrIxL68us3NxtDV1dna29jQyc/P0dPIwra7u62jtZJogIjErpCNjpePhoOEhIJ+hYV/c2BbXl5eYF5gY2RjX11dXl9gYF9bWlxha3Jyb29rbG9vfbjRyMnKz8vNxLrAw7u7urq+ycbCw8DDyMrJyMrIwcXMxsjLzcnEwsvJwcLL0MTLyL+5wbvGx76/xs/Lw7/Du8nHyLvIxsXKwL3Cy8bFxL7FvLzAw8XMxcW7wMrCxcfSxMDIv8rJxsjG0MPDxsOvxMvHw8q3v7y6tKmspKWYn5iso6Glm6Ogm5R7dnN0ZmlaYW5sWltYUkRMRkJHRExERlNANTQzMzQ/PDM6PDw7OTw8PDg7PTtBPTo8Ojs3Oz05Oz07PTs6OD4+PEI+Oz88OTk7Pz07QD48Ozk5OTk6Oz06PDo2OTw+PDs+O0NCRD5/pZypsqm0rrCdnp6YnImUm5man6Kfmp2ov7i8ys/RzMfCw8bNzs7M1c/V2djZz8vSzc3OyMG1w76xr7mCYn6Pto+KkpeHeoCFhoB2eHVycF9bW11gYGJjZGRlZGBcXF1dX15gW1laXGJvcm9raWxwb3OPxrzJxczAxsKwtrqysrOyscK8vLy6uMHBwcS+vbm9v7nEysXGwr3GwLi7xMm/wsm7t7u6xcO/vMHNw8a9vbXBvcO6vca7wrqzvMXEwcK2v7W1vb+7zMO8tbrIur++y8PBxcLGycbIxtDGwszHssfJw87NwcXDwL2zt7Cyp6ioubClrbCqrayUeXZ3amRnYGhvY1ZeWUpGSkZISkFFQkVJQDk6NjQ4ODUzOzo7PDk8PDs5Ozk6QD46Ojw6Nzo7Nzo7Oz88OjxAPUA/PT8/Oz07O0A8Pj4+Ojk5ODk3ODo8PDw7OTo8Pjs7PjpAQEU+fqygrLWqt7SyoZ6fl5qNlJaan52mop2et8XCxMjO0crKysfNzc7RyNDG1dTW183Kz8XJxcfBucW9q6yub2V2j5OLiIqFeYCGhoB+hHx0dGNbXF1eYGBiY2FiZWViXV1bXF5cXl1aW11daHNxbWdnbnByeZ29zMDDusG4rrCwp6qtrKe4tbe0s7O0urS9sbewta+yu8K8wcS8v7q1s7q+wLjHubS7tsHCvLi9xsHDu7Wusra6v7TEt7u1q7i9vb+9sbq2r7a6s8W8t667v7W3tMW8vsPFwMPFxsjLxcDGxrvHy7/PysfDxsLDt8O9vba5vse/rLW6tbe2jnl0eGZnZWJrbl5WXmBGS0hISkZCREFFRT88OjU2NTYzMzs6Oz06Ozs6Oz44PEE9PDo7ODc5OTk7PDo+Ozk+Pz1APz5CQD1AOjo+Oz89PTk6Ojo4NTY7PT48PDo7OT49OT86PEBAPIi3pauzsby8sa2foJmUlJiXnqujr6qnpMbLzcjFyM3M0MzNyMrIysnKxM/N0s/NxcfBxcC+ubjJtqqvo2VpdYyPhoiJe3h+hoZ3eIJ9dGleXV1dX2BfYGRhXmNlY19fXFteXF1eWltbXV9scG5oZmpubnJ8pMe/uLi1sKusp56iqqeeq62zramrqbSutrCyqa6mrLK8urbDubq6sau1ubu0wrqwwLG+vLu2u8e5wratqqiwscC2uL2vsKeys7S7vKuttaauta+7srCpubCtu667uLvAv725wr/Hw8XBvMbBx8u4xcfFv8bDw7rExsK7xsnMy7O5wry7s4hzdnZraWFibGhZV1dbQUxLTUlFQUM/RkE6OTo5OTU4NTQ6Ojk7PD07Ojs+ODtAPD05Ojc5Pjk7PDo4Ozs6Pj45QT0/QD87Pjo7PDo9PDw4OTg5NzY4PDw9Ozw6Ojs+PTs/Ozs+QDyKwKuouLe5w62zqZ2ZlJaZoZymsLWxt6bFztLLw8XBxc/HzcHDxr/ExMPDysHJyr7AvMG6srS1xK+qr5thbH+RiI6Pe3h+ioZ6e4SBd25eXVxdXV9gXl9kY2JjY2JgX11bW1paXVpaWlpcZG5vaGZnaWtucoGtubC1rqalp6eaoKSgmpylq66jp6KrqqyqsKOmn6qttbaxvbmvt6+prre0tLy4tLyvt7m1srvBssCupamiq7Gys6i9qquoq6yttLOmqK2hpK+psqanqK6lqLessbK3urq7sry9v77Ev7XCwMfIt7/AxLfEwr+7v8TCvsTIzMq/vsPAwKmHc3RyamldYW9kV1ZYUEhZUlNLRkZFPj5AOjc4OTc3NjQzNzo5OTo8Ozs8PDc7PTs7Ozw4OT44PTs8Njo9Oz89N0E+P0A/Ojw8Oj05Ojs6Nzc3ODg3OTw7PDs5Ozo8OTc5Pjw+P0E7jMKvrry3ucSwtrCbmZWcmKqpsLGztb2vxdDPzMPIurrLwcu+u8m2vcO+ucq3wcPBtLa8trGvtbyuqKmXZW+Ig4iLgHt+gH54dH98c3dlX11cXF5fYF5fY2NhYmBgX15dXFpYWltbWVhaXF9ma2ZlZ2Vpa29yhaqlrKWgnKKllJ6km5iSoaOqpKKfpaWnpa2gnZukpqyyr7a3p7CrqKq0qrS6sba1rra5sa+6urG2pKCkn6axp6uouaqkp6iop7KtoKemn5ukpqyen6ekoKCxra2ssrSytLC1vLa7wcGyur7DwbK5ucOzwL2/tbi7vb68wsfEwsO+wMSgg3hwa2FmX2tvYFRZXkhOZ09UR0VKRjw9Pz06Ozs4MjU1MzY5OTk7OTo6PDo3PD88PDs8ODg8OTw6Ozc4Ojo8OTg+Oj89OTg8Ojs9Ojc2NzY3ODg2NjY7Ojo7OTo7PDg1OTw6Pj5AO43ItbW9uLrAur21oJ6VnaGmurars7O7s8TPycvCxri3x8HMv7jJt7vFuLPEt7O/wKy2vLKspa+0raCilGx4hYaGgXx5dXNvbWtqaXFpXmBdXFxcXl9fYWNiYGBgYF1cW1xcWFlYWFhWWFteX2RjYmVnZ2dqbW+Inamgl5aboZabopiWjZ6ho6ebn5+jpaKonpuim5+rsKyxtqOpqqmsrKS0ua23sKyzta6yta6wqp+dn6SisqSmqbitoqamn6isqpmfoJ6ZnZ+lmpqjnJudr6mrp6qrrK2wsrivuLm7sLa7u7qrs7O5s720trGxtbS/tr3AvcPBu7u9l4N7c2tfZV5kZFhUV11JV1xLUEdJSUZBPD8/QDs/PDA0NTM1Ojs5Ozg5OTw8Nz4/Oz07Ozg4PDg5ODw3ODo7Ozo7Pzo9Ozc4PDo9PDc0Nzc2NzU3NDY2Ozc5Ojs6ODo5ODo7OTo8PzuJyba4vru3wcHBtKSkmZqkpsCyr7astLfGz8jIwMa7u8TDz765x7i3vreywbSxu7usurqxop6pq6eXnZBxf4WGf3hybnBua2JeYmZmXF1eXV1dXF1fYGFiY2NiYV9cW1taWllYWFdXV1hYWFpeYmRlZWZmaGlrco2nnZSVlZuYm6KWlpGcoqKonZudpaaippygoJqYrq6trrKgpaKtq6ehtbGysqyor7KnurOmtaCinpujoq2joqm1qqKjpp2mpqOWmJ6XmZqdoJqXnZycm6yhq6ejpKatq7OzqrSwsqqyubSvqa+ysrO3s66prK6yuLC6trm9v7ezsZSFeXVlXmVeW1lWU1pVS1tRS0lFSEtJQj0/QUFAQToyNDUyNDk5ODk7OTo9PDY9Pzs8Pjs3Ozs3Nzc+Njo+Ozo4Oj07PD06Ozw6PTs4Nzk3NDY1NTQ2Nzg1Ojo4Ojk5PDg3Ojg5PkA6gci9t72/tr68v7KdpaOYpbHCtba9rbS4wszIxsDFtsG/x863wMS9s7m5sr+2sbi6rbK1r5+ao6qhkpmNeX+DhH94b3F0cWhmZGhlY1xcW1tdXVxbXmBhXl9fYF5cW1pcWllYVldXVlhXWFdWV2FkZWNkZWRkaGp2opyUlJCVl5egl5mVmKCeoZyWoaKppJ+eqZyamqunr7Cqm6OkuKmgn66otqqmp62wpLewpLegopuZmaqmoJqsuLCioaScop+fk5WhlJWWm5iXlpeclZ+pnamjoZ2jqqqwrai0q6qmrbKwpaqusrGwr66vpqensq6xtK+8tLm3rqOUgXl1ZF5hVllXU1JUS01eTE9LR0dMTEU8QD48Qjw7NzY1MzQ5ODg5OTo5Pjo4Pj47PTw8Nz49Njc2PTc7PTs5Nzk7Ozw+OTk6Ozo4Njc2NTQ1MzEwNDU2Nzk6ODo5Ojo3Ojs5OT1AOnbAvLS5wrG+uL2unaeno6q7wL3Aua60uMHMx8XCw73Ft8jMssHCwa28u7W7vLW5ubCwsaqcmaGplZCJjIGAfHdxaWxydHBoaGVkZmJcXFpZWlxcXF1eXVxbXF5cW1xZW1taWFZXV1ZXWFdXV1ZbYmNiYmNiY2RmaoGWk5WMkpSUm5mdlpacoJyglqGgpqWkpqefnJ+moKqvpp+ipLeooaGiqLSipailsKWwrau0nqCdlZWqoaGUrbGxn6KjnZ6Ym5OLoZSRk5iYkpeXmJedppunoaKZo6Wlq6SlsKelo6urraaorq+uq6iqqbOlpqyvtLGuvLWxr66gknp2cmRhXFpdWE5MUkhSYU1WUE9KTU9FQkQ/OT02OTo3NjQ1OTk7OTg4Nzs4OT0+Oz47PDY5Ojc7Njs3Ozs6ODU6Ozo7OzY8Ozg4NDY4NjMzMjEuLzI1NTY7Ojg7Nzg3Njw7Ojs7QTh4u7uxtb2wu7G4rJ6lp623u7zBxbqxubXEycnAw8bGx7bGxLPCv8Wrt7e9tr27u7azra2omZifo4uIc4mIfnZuY2FmaWhmaGpnam1gXVxbWlpaWlxdXFtcXl9cWllbWVlaW1dVWFdUVFZVUlRSVWBgX2BhX2BhY2RpgZSTiZGPlJOUnZSVl6SZoJecoKWhraakpKOjopyqq6WZn6WxqqCgnaWrnaeinq2sqamtrKGiopWYo5uckKupsJufop+el5mTip6RjZKTlpCYmJOcoaKdpKChlaChpKabo6uloqSqpKuupa2yqaalpqa0pqmorbO1tLm6r6msnotycG9gW1dWVVJHUU9IWltPUklUS1NMRUZJQzg7Oz08ODY2Nzo5Ozo5NzY5Nzc6Ozo9PDw2Ozw4PjU5ODo4ODY1OTo7PDk3Pzw5Njc4NDUyMTIxLi4xNDI2Ojg2OTg1OTg5ODk7OUA5e7W0rbS7srCrsq2dqKevubmzwMi6tcCvxcjMusHKzMi1ybyxvcTJrLG4wrW8wby0tausppWZm5uHf3KIg3t0aWlqbGdqa21ram1lXVxcW1tcWlhaXVtbXmBgXFhYWllYV1hXVFZWVVRVVVJTT1FZXVxdXV5eX19iZG2OkISRh5CRj5mTlZOcm6Ocm6CoqauorKeopaOYpK6klJmlr6mfm5mboJ6umZurs6Clpp+io6GVk5uWlpKpqa2anJ+hoJqUkIyZjoyQjJKNlpWQnqGgo5ybo5WboaOhl6Goo6Koq6Crr6Ott6Wjo6Ksraqoq6+yt7K9tbOrr5iEc3NoW1hYUlVRRVhMUVtYTVROUExQUUlOSUI8Pz9BPzw2NTc5OTw8OTg3Ojc5Ojs8PT47Nzs7Oj02Nzo7ODk3Njk4OTo2Oj05OTU3NzU3MTE0MS0rLzQzNDk4ODo6ODo6NzQ4PTg/OX6zraiztq6pp6+um6morLe2rLzKu7a/rMvGxbjBzs/Is8S6t7vDyLGsuL+3vL67tLenqqCWlpiVhXl0gHZ3bm1obW5tcGdnaWdkXVpbW1tbXFtZWltcXF5fX1xYWFlYV1hXVlVUU1VWVVVTU05QUVlaWlpdXFxeX2Bkfo2Bi3+MkIqSjZeRl5mioJugq6qmrqyor6Oomp+soZWWpKinnZeQj5qerpaYqKqZn52UpaCekpCSkZOVp6qlmpmZnp6VjYyLk4aIjYOQi5GVkaCeoaOXlZ+VmqGinpSbpaWnqKigsbCmsbynn6OstKuup7C1sLm1wLGtsauQfXFyYlZTVk5SSUZWUFJRTExXTUpMTlJHTUpBQ0ZEQz5ANjU4ODk7OTo3Ojo3PD06O0A+Ojk7OTo/NzU5Ojk4NzY5NTg3Nzk7ODU1NzY2NjEzMjAtKi4xMDI4Nzc7OTk7ODk0ODs4QDh/s6ymsbeqpqKwq52qp6mysaW2xrS5urPKxbm6wcvQy7G2t7y+wcOxsLK4rbS0u7S2paSdnJeWkoF+dmtnbG5xbnFqcGtkZWdlXlpZWllaWlpaWlpaXFxdXFpYWFhZWVdYV1VVVFJTVVNWVVJOTk5SV1hZWVlZXFxdYWqAen92iY2HkIqXiZSUmJuZnqmboKqmpaudp5mgpZuTj5+jm5eXhYSSm6OPlKOdlpaWiKKbm5OLjoqQmqSnnJWVl5yRkYeUjouBi41/kIqSkpKgmp+ilZOYmJWippmMmaSmqKahn7SyqLK3oZyit6yqraSysqW1vLWrq7GjiXhybV1OUVFMT0NNTk5QS0ZOTkpKTk1RSU1KQUdMSEdDPTg1ODg4OTo7Njk6Njg7OTk+PDg6Pjk7Pzg3ODk6ODg2ODU3Njg4OTc0NTc3ODIwMzAxKyktLzEyODc2Ojk5OTk4NDk4OEE3d7anpLaxpaejqaWgqKWks6qissO1tbKzxsa3usPKzMazrLm9tLfAr62psZ6mrrqwsKGbm52Vk4Z6gm1fX2ZycHZxaW5pZWdoal9YWFhYWFlZWVpaWVtbXFxZWFhXWVlYVVZSU1JQUVRRU1VRTU1LTFNXV1ZYWFlYW11hb3N2cYWIgoiAkYSPi5SRlJ6hj5uco6GjmKWWopuVjYeYmoxzjYN+jZeWhpGZkJSOjnuZj5yMgol/ipifop6Qk5iWhY2ClH5+dImOeZCHk4+QnZqZmpGVkJ2OoqOOiZqgoaOjm6K0r6yvrJ+YpbimprGhsa6csLuqqa+qmYJ2cmJVTVJPUE1DU05MUU1CUFFISU5STUhKSkNKTEZLSzw3NDk4ODg7OzY5Ozc6PDk6Ojs3OT85PkA3OTo8ODk3NjQ0NDU4NzQzMTI1ODUvMDEwMikoLC0xMTc2NDc4OTo6NjU6ODdBN3i3oaO0qaalqKOmpaamprOnprTBuK+0sMnEt7nBzsW+s6y6wautw62ooqeSnaa3rqWikJaXk499d31lV1ZfZ2ZpZ2huY2poZ2JcWFdYWFhZWVlZWVlaW1tbWVlZVldXV1NUUE5QTk9PUFNUUk1NSkhOU1NTVFVVV1lbXWlscm1/hXx0TlhykIOXho2cl4uUkJ+YnZWUlpSOlomAk4lfO1dvfIuUiYCMkYyQhoZzioWWgXmBeoWUnZSDlo6RkIOGfZN4cW+FjX2JgZGNj5eamJOKj4mch5+Yh4iWnpqhoJenr6mtqKiflq2zoqaumayrmKe0oqmto5N+cm1fW05TUlZMRFRKUE1MRk5PSUVMUU1LT0pJTU9GSUk8NzU5OTk5OTo3Ojs6Pj44Oj09Njo/OD4/NTg5Ozc5Njc1MzMzNzYwLi0vMzQ0MTEwLy8oKSsrLTM4NTQ3Nzk8Ojc5Ozg2QTl5t6CjraGmpqqgp6mno6mwqKe0wbmwtbDHwrezvc+/ua+utcKnqsWpo52Zg5ScsaSdmoiUkIyHfHN1XVFMUlVZWlddXmJnY19ZV1dXWFhYWVpZWFlYWVpaWllYWFZXV1VTUk5MS0hHYlxNT1JNS0hGSE5RUU1QUlRWWFpgbXBpe4J0UEJAf5WRkX2JlI2Eio2bjZaViZKIhZWGeYh/YEpRbniKkYR9hI2KhX9/bn5/lHd1dXeEjZlwUY2IioZ7fniUdmh3hoh+ioiVio2RkpaLhIqIlISajIKEkpqWnpyUpKOoqaWknpuwqqGkpJGmqpahqZyipqiJdWxlXltIUVFSTUlVTVNJTEtPSUhGSk5MTVRLUVBPRklDPDc2OTo4Ojs7ODo7OD4/OTk+PTg7PDY7OzQ3ODs2Nzc1MzQ0Njk2LzMvLjEyNTIyMS8sJykrKiw0ODMzOTc5Ojk5Ojo6Oj85d7aboqedn6Kvoaeopaeor62qtby2uLezwbu2p7nIuLaoqLW2qrK8pp6Wjn+KlKmXmI1/joSEfXdxblhNS01OT0xNUVdbXFpYWlVVVlZWV1lZWFhZWFhZWVlaWFhWVldVU1BNSkVAQJtrc3NJTUtERERJTk9oWU5RU1RVWm6DdHd+amldVY+JlIl0f4eBfIWMk4GSmYuPe4aPgHZ/eHNudXB0jY6Ben6Kq4V5emh2e45wcm14gYuNknh6gHuAdnJykndndYSEhIR7lYmIioyLgH+Ei4x/lIN7gZCYlZyVkZ+dqZ6foJ2gqaWfnZiNp6SToJ+Wnp6kgHJoYFxcSlZPUkdKWFJPSkxNUkpKSkxQSExRTFJUTEVIQTw3Nzs5OT49Ojs8OThAPzo6Pj03PT03OTkzNzc5NTY3NTI1MjU3Mi8yLiwvLzIwMC8tKygoKS4xMjcyMTk4Nzk4Nzc1Ojw7N3aumKOhmJyftKmvqaWtrLCxqr20sru4trq0sZ+3urKqnZ2sqaiyr6GakY6UgY6cj5SBeIh6fXdwcGlYS0hISEdFSEhQVFRUV1dTVFVVVVZXV1dYWFhYWFhYWVlXV1VWVVNQS0Y+OTNOPH6eTUhKREA9QURqlH5MT1FRU1ZedYN9eWd3jZeYjY99aHmBdniAiY99hJiSgXKHj3x3e29rfq19c5CLf3uGkoF9f3RmdnyGbG9oc3yJjIiAbHlxfXBtdY9xaXGAfo5wQ4uEgoOFf3d3eouFfYx7dX6Oko+YipKam6OWmZ2anZ6inZaNiqWbj56XjpaYj3ZubWViWldXVFFKU1VUT1BOUFZLTktOT0pRTkhOT0tFQzw7Nzk7Ojo/PTk8Ojk5Pz87ODw9Nzw5OTk5MjY2ODU2NjMzNjIxMjI0LiwsLS4uLTAtKyonJyouMTM2Mi84NzY5NjY1Mjc5OTV5ppegn5agpq+srquoqbCvsau8uKy7vrmzrKebsKesm4+WnKWppKCXmY+FknqJj4yNeHJ/b3ZxbG5rWEtGR0VBQENESUxMTVFSUFFTVVRUVVZWV1dYV1hZWVlZWVlWVlRTUUtENzhmNzA/qGlOSEM9OzpEioV6WkpOT1FUWF5lcHJtiKeqwH51eWN8eG98eYiQen2Lhm9tjJJ5dHhqaoCCcZaRi4F+loBJk5huaHd+gmxpY2x5hZCShmtzbHxucnuGaW1wf3ONiYSGen1+e3ZvdHOFgnmBeHB8joyKlIOWl5iakJOVlpmXnpeMg4mfkYuSjYaQln5taG1ubldVV1RSUVlPUlRUU1hVTU5ITkpNTkpDSE5HRT86ODk7OTk6Pjw5PDs6Oj0+Ojg6Ozk/ODY4NzI3NTc1NTQxNDQyLzAyNCorKiotListKigqKCcsLTEyNTAsNTU2NzQ4NUhBODk1d5mRm5manqWtsKKsqqi1r66stL+qu8K/pqKZlaSXnY2Ei5ShoZiYkZOLc456gIaNiHZwdm1xbWZsa1lORUZDQDw+PkFGRkdLS0tNUFJSUlRUVFRWVldXWFlaWVlaV1ZUU1BMRTFAmjMganNDmW87PDk1PICChl9JTU9PUldaUllcYKeIYpppdHplf3Btf3qLiXaBiIZ0bJqRdHN8amudj015hZKJhI5nMXaGc2x+foN0ZmV0foSEhYBmaWx1a3GAfGdxcXtuk42Pe3N9fHFwbnVtgn53eXVqeYmCiImDlpOSkIuNkZSUj5eOgHmIl4iGioaAkId2ampuZ2RXUVpXWVlbTVBVVllYTklIRUpKSEZCQUZEQ0c9OTk4Ozk6OTw6OTs6OjpAPDk6PDk4Pjc4NzcxNTI0NDUzMzY0NTAzMS4qKispLCwrKykoKycpLCwyMjYsKzU3NzU0NzhpTzg7NW6SiJqRmZakqK6esp+muq+rsrDCsbvDx5qWjpSZi42FeYSQmJSNkIyPhnGHgnSHjYh7cXNxb3BmcWdfVEZJQz88Ozk6P0BBRERFR0pMT1FRUVFSU1RVVlZYWlpZWFZVVFNQS0U4MC9cYLNHOVhQOzk0NDGWuotITE1PT1FWTEFJUUlir7Ogcnx4bH1tcoOBhYF6hIaGeXKglXN4gHN1lIc1cZ2onY6hoYSihXZwhnyHfHOMrY2JgGdmYmpucm1wg3Vpb1h1cI6akndsf3t9bXFtcIB6c3VuY3aDfoaAhZCRiouJkYuRjIuPg3V4i4+AfoOAfo96cXBva19aXF1bWVhgXlJOW1pYV0xISkVKRz9DQUJHPkNEPTs5Nz07Ojs7OTo5OTs6Pzw4OD06ODs2NjY1MTEyMTM1MzQ3NTUzMS4vLCwrKSopKSoqKikoKikrLzNETTIxNjY2NDM8dlI3PTdikoGSh5aRnqSnnq+VpbWqrrGuwbK7wcaWj4yUkICIfW6BkJKJg4qHj4V1goRslYiJfHV4eG13bndkaV5JUEc+QDc0NDg7Ozw9PkBCRUhMTExNTlBRUlVVVldYWVhWVVRTUExFPDUqnUtbQC1nSTk0Lz+Sg6muX0dMTU5QTDdDTVJTREqGdoB8fHZ+bXeIiHx+hYN/jH52opl5foaBhZmEm5xhhqqfnYuDkI56d4h+iYiNc4qXj4R6XWRxdHp7d4psZ2pieW+Fj4J6boF3dIR6cHN6d2tuaV53h32HfIiHj4CLkpeDjYWNh31xhH+EfHV3e32JdW9yc2VmX1tbXVNbZl5XUVVYW1VHSkpES0c/RkBEQz5BQT06OTc8Ozs9PDo6OTk7Oz0+Nzk+OTk4Njc1NDI0NDAwNDY0NTY1NC0sKSsoJycnJigoKSkoKCsrKy8wMFVxPDIzMzMxRX5XND05XIx4in+UjJKdnZ+mkaCroLGor8CxusW6lo6RlId6hXZrf4yRgn2KhI6MeIOAc6GEi319gX9wgX56aHZrUldMQEUyMTEyNjc2ODg6PD5CRUdGR0pLTU9QUVNUVVdWVlZUU1BNRkA6Mj0gI5ZjjFs1MzExaT9Hb0lGSUxNT1JMS1RdWVJKaYSIe4l5fHF8j4x6fYmHfpeHdqGZiIePkpSljaypSIaur6+LgYCTioKLgYSRqIeAmJiKnHNtfIGGh32OaGdoeH5uhYeChXGEhUdrgHdxeXZobWtfdn2DiX+IhYx6lZ6biouIkX96dYt2fHdtb3d+f3NycWpaXVxbY2NYZmVbVU9QVllQRExLRk5JQ0ZDQ0FAQ0E9OTc4Ojo6Ozs6ODg4Ojo/PjY7Pjc1ODU3NzMzNDQyMzY2NTY3Njg7REZMTU1MQzcrIiUnKykrKywvMDArbnUyMjQyMEyBXDU9PF6EdHx+ioWIkY+Wl5KXoZ2soaa4r7O8s5eNkouYi310cH+Jkn59jIKSlH2Gfoakh4h/goiFeIeJfnOEeF9jVktCNjAuLzIzMTIzNjY4Oj0/P0JFR0hKTE5RU1RVVFRWVVNRT0dDPzgwLCOHWz4/ODQuXZZwc6NVRklLTU5QV2BZcFpcXmqNk4eVgYSChZGTfoWJkYGalYKgoZeVm5qlrZOau7Gnu8fDqIqMoaWPlImBkXtyhJ6fkZx/doWFio+IkGpob4OAdY2GhItxhoJ3h4B7doV9bnZ1Z4CUj4aJiIiIh6GroZaJjph/e4GJenpvZ2t4fnh9cWpjXVpaXWlcYWZfWU9LTldSUUlQSkROR0NLRENBRENBPDo4Nz08Ojw6ODg3Nzg6PT04PD02ODY1NjYyMzQ0NTU3Njg2NzxCQj88ODo+Q1FeZVxHMicmLCwtLS4xKD+MWy4zMTBPg180PztudXBmeIN7gIyAgZCPi5qapJyhrKarr7CXkZGEoZSEeHd/jJR8f5KGkpV/ioCSm46DgIGLi4KJjYN/in9scGpdQkE0LS0vLy4vMDIyMzQ3Nzk7PT9CREhKT1FSU1JTVFRSUE9IREI8ODcvOUQ+PDw2My5sk5dNUEhJS0tLTlZgY39nZ211nZuPmpOTi42OmoiTj52LoKCSo6qlo6yTqLaiqMHDrseveLqUmnyNoZ6ZhJOFgo+in5SZkoSKhY+YkZZscHWJi4GWjI2Pdo+EcWyFgYqWkoOFiHKJoZaHk4mPj5altambjZWig4eThH1/a2prfIB/gHJhXGJeWWZqXGtrXldLR09TUU5NTEZJUENETkZCQ0VHQj45OTc9PDo7Ojk4Nzc2Nzs6Nj06Nzg1NDU2MzQ1NTY2NjY4NTU2MzEwLiosLCkoKS46UGFcQCwoLSsrMCwncog3MjQwT4RiM0A8dW5nWXCCcHWHcXaShn6XlpqUn5+cp6CqlpOYnmdlpJp+hJKReYCSiJCSfYqFmJKRgoCAi42JhZCHhIiFeHh/Z01SPi8uLiwvLi0vMDAwMjEyNDU3Oz9DRk5QUlRQUVJTUU5QSUVEPjs8OkNGPz48NzUyPD9SNUhISExMTU5SXm+KfHOBfaCdm6imopmhl6KVnJ+onqmrn6isqaq1l6u/q7bIyLfJ0c++m6Bwaaupn4SUkoacoZqamaeRkYiVopqad3p+lJeRoZKXl4GUnnt2lZKrs4mNl6B9lJ6cjpOWmaSiprawnZGZqIiXkI6BiGxzc3x+enBnYFtfXmFmY2BnZ1xRRUpLUE9JSkxGRk1DSExGRkNCR0RAOjg1PDw4OTk5NzU2NTg+NzU9ODQ3NDU3NTQ1MzY5NTg6NjE2ODYzLzAuLSosLy4tJyMqO1hiQigqLDEtKEuXXjA2M1GFZjJBQGlhXlBwdWBufWF3jn18lI6Oip+Sl56WnKqYnqpCRH2HiYeYjXiCjYqOjHuKho+QjoGDgImLioSShYOGiIGAh3dfYlA0NjAtMS8sLjAwLi8uLjAwMTU+QUFNUVJTUFJTVVNOU0xFRUA8Pj1HR0BBQDg2NjI8OTtGSEdJSU1PUVlthpB3lYujp6q0vbilrqysp6i0rLC3srKtu7GzvpyzxKy7ycu4xL+4paOwsqytq6SLlpiFpqagopeBppmNoqqopIeFk6OhoKqgpKmOnLGLlaOnt7uboKOwk6Odo56RpKKrr62ztaKVpaqImomSipV6e36EfWZfZ1tkYV1jY15mZl5bT0NJSFRPRkhMRkpHRUZIQUtGQ0ZGQTo4Nz08ODg6OTc0NjU4PDU0PDc2OjQ0NjQ0NzM5PDM4PDIwMjU1MS8xLi0qKi8sLSooKiYlNVhYLywwLCwwhIE4NzFQhWg1QUNbWFRMaWNXanBYeoR2gZSFiIKbg5KQjZLayJ2Wc1aXiI+InI98hoyOiol6iIKHkY6DhYCLhYaHkoaChImGh4eHcW5hQEU2NDwyLzExMC0sKy0xLy00P0RBTVVRUlNVVVdVTltQR0dEPD4+RkhDREA4Ozw1Qzs9RktJR0hST1BXgZOghK6js6qywcfDq7PFtqyzwLO5vra/tMG2u7ukuMaptsnHtr65tKijtK2xsZyakpqfiaevqqSVdp+kl6GrsbOYlqqtqK61u7K6rK+1orGssbW8t7WutaCnqKOom6mwrbK6uLinm7epjaWOkZOgh3mBgnRYYGNVZWFgYl9gZV9aVUpERUxVUUhKSkRJR0VBQEBLREFNRjw4Njc7PDk3Ojk4NjU1NTcxMTw4ODk1NDY2NDk3Pj0zODkxLjAxMjExMzAsKiwuLCsrKyooJyopRVowMCovK2iSTzYwUodqNkFFV1FKTFtaUWNkV3p1cYKUfYWGk3aFfoCNe7+7o7yCtJSTjZuPhIiPkomJeYaAjJOMh4WBjn+BiY6Gf4aIhYqHkXp4bl1WQEVNPDY6NDZBQjc2NC8vNkNIQ1FbT1FVV1VcV1BfVUlLSkFAP0dLRkVEOz5AN0Q3P0JKSkVHV1RQXo+lraOxtMO2uMHMyba7xL2zs8C3uMK1v7C4dLK0prrFpLDGubGzsbSopLW2qrGgopabopKlsa2lraynpJigrLO6oqmyurW7vsy/xcW9vbPCt7q4v7e6t7msrbCmsaqtvrC9u8LCrJm6qJSuj5iYqol+gXtqVmFgV2lkaGRWWmNZVlRJR0dMUUdDSElBSEQ+P0JCS0BATEM5OTY2OTo/Njo5OTY2MjQ2LzE5NTk5MzY0NjI3Oz0/NjoxLi81ODo5NjUwKigsLS0tLCwqKCgrKyhFUy8qMDBKj2s1MlCHbTY/RlFMQUxSV1RZVVp3anB/j4SBjoVuenJ5iGK4oZmjiZWTlpOTk42Ql5KHh3uGgY2VioCEgIl6fIuHhnyKgoGKg5V9d3l1ZU9cZEdFTDpRZGFbXlNGPjtIUERaZFFRWVhZZ1pUYGBNU09FQT9JSkhFRkFAQz1FNkI+SEdLTFNaVF2Tr7i1urnJwLu9ycy7vcC7t7W8u7e+tbqyxmB1s6Wxmp6rvaqlqKuqo6KytaGrp56Vlp6Yn66lp6elnqSUoqews6eysry2wb3TycrTxsLFzMLKw8C+vb+7vLe0sLm3t8O6xr3DybCeuaqirI+lqLeJgX5xXmFgXFZhXmdlUlhhVlJVSUVFTktBPkdEPUtCPUJAPUY+O0hANzk2Mzc5PjQ4OTo1NzA0NS8yNjM4OTM3NDUyNj84QD5HS1JUU1FQT1FSUUpBOS8sLCwqKygoLC0sL1A+KC40OIB9PDJLiHE5PkNLRUBJTVBSTFFdaGxscZCNhZBzbHNyc4jVwLWZoI2VmJmRjpeRlpaOhod9hoOMlot/g3+CeHqLg4d7i3mBioKXf3R9emtlcHVZXVxQZWViYGVkXVtYV1xNZG1VUm1tXm9fWGdlVVlUSkRBS0tIRkhISEhCSTlEP0hLVFRWXFpbkrnAub23xsC7ucrLura6tri5s7i1tK62tplkdaierXBeoqycmKGim6Seq6WUn5+QlI+WmJeon6WfnpqZg6SdrKSqsK23sL251NDP18/JzNLMz87Kx7+/wsq9wb3CwMXExcq/yM+0pLuwtbCbrLm9mn54a1xfW1hdYFliYlFbYFNRS0NCRUZFPEBFPkJIQkBDPTpFPj1KPzQ3NTM1Oz00Njg5NzcwMjIvMjQxNjk3NzU1NTVEM0VMTT41MS8wMDY6NDc3QElPSjstJioqKC0uLyxATSsvNTRtiUkwSIl0Pz5CREBDREZLT0RSXFlpX3CXkpGUbmxvdXWIs6yhoZ+LmZyZjIyVkZuShYqKfoiHjJCLiXyBhHN7iYOGfIl0goqGlX9ze3hsbXV7aHJlaWxpZmppaGBmaWhtWm10l62kvIiHZ1tvaF1aWVRISk5QSktRTFRRSUxBSkdLUF9fYmZpYZi3x7C5s7u+trLEx7awubGwu6yzsaeqt6yNtqeem6eaTpudjI6glpGmmKWVipOTiZCJj5CSnpuhmJuUloeemaabrK+or6eztNTU1NbRy8/T1c7Tz8zFwsrQv8rJy8nSyM3NwtDSuLDEvMS6pra7xKKBbWJbW11XX1dZZVlQXFdOUUNCSEVCSDtBRD5BSD8/Qjc7RD5ASD00NjY1NTs6Njg3NjU0LzEwMTQ2Mjc4ODc1MzY3QzVCOD8tMCwxMzQ4PTk3LC4sMTtGTD0pLCguMDAwN0s/LTQ2VIhXMESHd0M7Qj5FQkFDSk0/VVlTZVdzkJCYg2hxb3l5g6CqnqaXjZubl4uNlZGajn2Ji4WOioqLkIh8hIJwf4eBhnuHcoOSi499cXh1bHF4fnF7bXhzbGiAcG1jaW1weWl3fX7Lv8Lfp21jeG5jW2FgSlBSVU5ZXlBdXU5RTlRRVVRcbm53gnKWrristKewtqutvcCxq7WmpbinrK6hrLSjjrGumpiYjJGUkYSOm4GNppGciYOLhIqJhIuDlJWYl5SbkJyXmZmenquspKehrKzO0tXRzczS09TQ1NHOyMPU0cjO0tPT183S0cXS1sbAzsfIw6m/uNCdeG1kXGFcVV5RXVpOT1NQTkg+QUZCQkU8QEI/RUU+Pz86PT09PEpBNDU0NjU8ODg4NjY0NDEyLzAzNTI2NzY4NTMzOz08RT1AMTErLzM0OT41OTAxMDIyLTJFTzMpLzMuMzI9TjI0OEN9XzJBhnREOj09ST5AQ0ZIPFZSTU9bdYaFindtd3B9foChnp6hi42Zk5OMi5OPloR5hZCQjYuKiJGHf4J7cn6Agod6hXWFk5GJf292c2xzfHx2fHOBd3FqgHJyaW9xenlye77Lmn6MsYN2coR2aGFqXUNaWltWZmRYZWtUWF1cYGNdY3h7f4uBmaqkpKGgoammqrG5qqa0o6KtoqOtoqexn4mmmpSSkYqSjoiCk4lrlaKNmISBhX6Rg4OTlqyLlY2VmY6FkpCdl6ewoaCgpKSoyM3Px8HL0NPR1NPO083G1tPN1NjW1tjV19XJ1NrNydfW0cqtxMPLiXFuYl9fV1JYUltPSkdJSUpAOzo7RUJEPEJEPkhCP0JCOzs5PDpHQjQ2NTQ0PDU2ODc1NDMyNTAvMjU0Njc0NTU0NDw+PUU/QTYyLy0xNTs9MDgxLzI1NC8tLjtSMDE3LzUzMkVEMjg+bmI1PYF0TTk5QEk8QUQ/QTtQTEZLWXCAdX1oc3lygomBnZWdlIWLlomPioiOh49/d4SUmYuNiIiLiX6DeHN7fYOHd4B7h5GXgYNud3BtdX92eH1zhXx5bId2dG99doR1eXudtYw8QYrGpX6NfGllVklDZWNmY2hqZG95W19maGtuaW6Ag4mRi52foJ2Ql5ifo6OmsqSks6CipZ6hqaCisZyGnpKSkpCLjouGg4+EfpybjI2ChIV6lH6CqZWjjJKKl5KLfZeKmpGrs5iam6ecp73Dxri2xs3S0NLQy9LLydTP0dXa19fY1NnYzdjbzsna2tLWv8zMtHZ1bWNcWVJVUFlVRUZKSUVFPTo3OUBBQzpHRUBFQ0FEQTs/Ozs3REM3NTY1NTswNjg5NDQzMzQxMDE0NTU4NzQ0NDQ5QD5EQkM8MzMuNkZUVk9RSkFKRj8xKiguQlQyOTI1NC83Szc1PGBiQTxzdlY4N0FIOj9DPjw5UUVDSlRsbm9wYXFxc4aNfJeRnYt+h5KCiYaFioKHfHiFlpeIj4OHhod6hHlxenuEhnV6hY6NnXqMcHxvcHp/cXyBcYOHgG6OenV3fXyCdX98h4iwdFipwraMkoFwbmI9XmhycHFwbnh3gmVpb3J1eHJ7i4eOlJKblqCWh4yTm6Cbn6qfoa2copqZn6Wen6yZi5qMkZKNhX2Ih4OFi46gmZOIg4d+bZl5hJiGiJOMjpSMhXubiJOPrqqUlZeemKautbyorb3Gy8jJy8vPyMTSytTW2NfY19Tb19PZ29bP29rR1sjVzJV4emhnWllPUlNdSEJFSUk+QT49Nzo9Pzs+SD1AQUFBREE+Pjo4N0RCNzU1NDc5LjU2NjQzNTUzMjMyMzY0NzU1MzQ1N0VCRENFQjU2PEZOU01bbmZjbnNrYFY+LDRMRzg2NTQzM0JGND1XX2hMdXheODs/Rjw8Qjw6OUQ/Q0dSa19tZGJma3aAiHGRkJuAeYCOfoOCgoV/hHx8hJeOh4t+hoeAd4J5bnt7hoF0epKejaF2j3WCdHWBfXSAhG+BkIFvkoR0fIGFenaGe4m3xqTCybeBlZuPeHBlTmVjgnqBd4aikIt5eXd7g398hHZtlJaUlY+XkIOJj5aal5emnJigl5+TkpejnZmrlpGRi42Sg4yFiIiBhZCRnpyZiYWLgYWXe4iIn5eQiY2Ki4J8oYiQi7yhmJOXmZyopqWunqe1vsDAucfJzc7FzcrR1tXU2dXX29TX2drb19va2djO28aFeXhlaGNfUlZWVU1LRE1DOz09PDk6PD45PkE2Pj9APD8+PDk4NjdDQTY0NTU9ODA2NjU1NDc3NDU2MTM4NTQ1NjQ1NTdISD1ESkU3OTI1O0g+Ozo6N0hQXFpSVVhLOVQ+Ozk1MzI3STg9TllNSHh4ZDU9PkM9PEA6Njo+PkBFUV9ZZWFdW2h0enlsiY2Sd3Z6inx+gH+AfYV6foKRiYSFeoWIe3V9dG58fYZ+dH+SnZGfg5J8hn14jn15iopugpqAdJiFfoGJhXx+kHqPqY+Qw6C7jJyjnH2JhH2JcoyKfnOmmpyZlIV7j5CJhGhHcaGknYyLkJKFiIuRk5WPnZqTlZGXjYyVn52UoZSSjo6Qi36Qj46LhIiSlpqfn4mMlJGdkIKLf6aZiIWOgoaEgKSGiou4mJ2RlJahp6Cdnp2jrra6tau/xcrQyMfMz9PS0tjS1dfA19jZ29ja2tnZ19y3d3d2aWlkVl9aU09OSERMQj09Pjk5Ojo5OTw9NkA+Pjw9OTo7OzM3REA4Mzc4PjcwNjg4MzU3PDM3ODA0OTc2NzU1NTQ2RlA1RE5JODkzOEFLPTszQ0BJPDlEV048TVRITj85NjMzMz5DO1tYPjVZeXBaPDxBPD0+ODU4OT89RFJTUlheVVhmbW1taYCOinFyeIp7e399f3yIenx7i4eCfnWDhnlzenNtgX6EfXeGm6CanpSSgIuHf5iHgJySboeohXqgi3yQjoOIhJx+mpGKjaOin5Cjrp+LkYuFi4GShldyrYufrJyPg5ibj5COW4OikYKMn5OVjIaIjJKTjJSVlJCMj4qIlpudj5WWkYuSlIaAi4mSjYqKnZaZo6KGk52VoIuKiI6ckIOIj4CDh4WkhYuQs5ickpSXoaGemZKbnaexuKylvMHHzcfGz8zPzM/Xz9HUrtbV2NrZ2trX1tnZnm57c2ZlW1xXUlZXQ0BJRD4/Pjo0ODo7Nzo7OjM7Oz89Pjc7OToxOkc9OjI3PUA1MDY3NzI1NT82NTs1NTg1ODo1NzczNUhSN0dPSzk5ND1FSkI+MUZDTEE5ODpHWEA1SFdJNjYyMjM6RUNlWD8mX3lpX3o+Pjk8Ozk4OjxAO0JRS0tTWVBUY2J4bGJ+koNubXeLeHl+eoF9hnx7doaEgHNwhYJ7dnZ1dISDhX1+kqajnqWilomdkJSWi4qol3KKso2DppGEmZOEmYyilqCZk4manaGSqK+fkZSQjo6IlYtujbeEmsTIsp2ipZucmJaRspBjpM3IlY6Gh4mQko2Nk5SKhYqKhpaam4+QlJOHlZiEgI+LmYiNkKqXl6SjiJmelpuJj4eXl4uFj4yBf4aPpIiNk6iZl5OWmKGYn5mTnZuisrSlo7zBvsfFxcnIycLK08zN1KjS0dbW1tja1NPazoFxfmdiXV1cTklUWUFCR0Q7QT04Mzc7PDo4PTY0OTo8OjgyPzk5MjlJOj42N0JDMzI6OTYyNjQ+PTQ7PjY5NDk7NTc5NDRLUTxKUUs5QTdCR0lANjRKRUxGPjs4OEVUQTc+XDg2MjE0OjtFYFhBRmF0aExjWj41Ozo6NTs6PTpFTUZIUldTUkJjgUZ2gY99fG1+iHh6fnqCgoN+dnaAgnxsbot/enx4eHyEh4p+iqOzp6Oqs6GWp5+lo5aVrqGDkLiVkrKZjKGhjKSbr6OknZiQp5anmayvpJeUlpWQi5iZlqDAjqPJuaubo6atmJGbnbKdhYWoopyYhYmJjpWMi5OPiIGGh4mTmJWMi5SThpSYhoSRkJx0kZiylpekoYicmpOQipGKl5uJipaOhn2MmJ6JkJCcmpmTmJeflKCdlZ6boLGuoqS3vrTFx8S9w8O/xs3KydKmzs3T0tDW2NPQ2LpxeHVcX1RfVU9ISk5EQkNFNT46Nzc6Pzs8Nz00MjY2OTc3ND01OzU8TDw+OzxCQTc1PDs0Mjc3P0A2P0A3ODQ5ODc7PDU1T01EUFJMOEA9RUFHQTU6SkVORUQ6NkFAQlM+OURPMzIzNTc1PXZcPFJcdGlaTV1TPD04ODU2Nz06SkZER05bXFlKZmA7SISLentuhYZ6fIR4gYWBfnB4fH59b3KNen2BfHiGi4mGhJKnu6yosr2vpK2ys6ijorCsipq1naK4pJWtpJeprbempKOfmamXqaOvsKmZmJyUlZGXoJiau7uuyqFqtrirsJSYnqOrk5e9o16qsoKJio2Uh5F8jo59g4aOkJSUiIeTloyQlY2LjJeYkpyZtJeWq52LnJSSjpGSjJmbipGekIuJlZ+hjZSNmJmckpuYnpShoJScnKWvqKGks7irwsjEtbq9u8XHx8LRoMbJzc3E19bRy9Shb3lnW1lTXlBORUM+PENBQTg/ODc1P0Y8PDU8MzUzNTU0NTRCMzk6Qk06QjtBSEI7OkA8NzQ2PEI5P0BCODc0Ojo2Pjw0N1RLQ1VRSjc8OklBREA0QUpITkJBPzZEQTxKTkQvVD0yNTQ6RUpcWEpaUW1ncHBEaWBLSTY3NTc6PkpAQ0lQZEdiYGJwSkCLin+Bc4aHfYKIdYOKgn9tfX18f3B3h3eNgYd7jY+MhoyZqsLAr73Gu7OzwLyzrKuztounsq2tvaqbu6Sorbm4q6amoaKjo6ivsrGqnZykmJuXl56ipqWSpLquqcC8ra2yuaakqH6IhpytvbCCjIyLkIOPg5GPeoGHkI2NnIiHj5eNi5WXlJGal52omrGakaycjpqPko6VkJCWl46RoJGJlJujrJSWj5ScnZOgnZuYoKGUmp6npqSipLCzp8HGw6+wurbFxMK/zabHxMfDvNXRzcTKh3JyYFpZXlpMSkJLQEZHPkE/Qjs6ND5BPD01PTY+MzMzMjQyQTE3QEJOPkdAQ05DQT1DPTs4NkNDNUJJQjo4Nzg7NUI+NzlWS0RXT0Y4PTRLQEM+NEVLSE4+QUE2QkI/QlNFNThQMTQ1Ozw4O0Q+OUxqal07V1JkS2daVU83OUdFP0NGXGVHYGlnWl1ck4yMiHuHi4aDjHWGkYqBb357gX9xfoF6lXqSlJSYkJOVp7PGyb/CzMHDuce8uq+rubqXsra6ssCupcCkq6+7vKqtq6OjnqeqrrSwqpugqpuhm5WfsLSni6O6urbBvKyonLKlpKiUhY6pxMSkgouPh4iEhpWUjXqDjZGPkaGMjJSRjomXn5iTmZWYpqCunYyqnI6Wj5KRlZWOkJWRj6GUhpefoLKelJqUn6GYpJ+aoJuglJiepaOmpqSvrqW/xMKuqLe1ycO+ts+yxL/EvLPRycjCtXN3a1tXW2lRTEhDTEpLSkFBPUNEPDVBRDs6Mz04QjMzMjI2MkEwNUlFTT5JQEhSQEg+Q0A7Pj1GQTVBVUA7OTk4PDdFPjg+VkpDV09HOD80TEBCOzVKS0NMP0I/PEJGPUFITDkrRzwzNjc0NjRBPzdPYU9hRS89PjZrbGpgQDpIPj9FQmZaTmVcZlRjapmNl4qMiJKQhol5hpSQgXKAe41/eIeCgZB6jaGWqJqamLq9x8jJwdLJysLMvMGyrbu+p7q/vrzEt6zBqayzu76qsKmkpaOrrbOttrWgn66epaKYo7O9qZuovcGjt7ewq5OxrKusl4eaqaelkYKMk6WViYF2ipF6hY2SkJ6fk4+Ui4+NlKOZl5yVlaOeqZ+RpZqMj4+PlZaIfI+VkpKjmpWgopy1pZCel6SjoqWenaaYnpWXm6SjqKeisqyovMDDr6Wyt8zAua/Es7u+writwsPCwJhseGBXVlpaSktNSkZEREhCQkFETDo0REg5OzQ8N0UuMTIzNTJCMjZTSE48SkJKUUVLQ0RFOkVMQjw3RVY9Oz04OT88ST86RVVJQVdRRzdBOks6Qjc5Sk1CSUBDPjxERzxCQ089MjBIMzY2MTcwPUI6PWpqSks1UVMzU3BwZE47RD1ARj5qSF9YYVpkZFaej52Ol46ekomKf4mgk4R4hX+Vf3+QiIqQgJahma6mo5jCvsfDx8XTzc7Ny7vBt7C5vLO8y7zDwbW2u62zv7m8rq+ooKintq2tqbK3mp6soqehnau3uKmksL/Esb65s6eqtbOtrpeWpayooJGOkrHFp5WOfZGUfYiRmZCqmZiTk4+SlZOlnZOdmZSho6KcmJ+Yi4yPj56IWpCWl5KWpJllmKOesqSWoZasrKqnm56ml5iWmJWgo6iln7arqbm7w7Sls7XLwLiqtqyyuriuqLe6vbiCa21ZVlRUTUVKU05LP0FIRURIR0c5NUZNOz43PUBKLjMyMDI1QjU1UFZOPExGS1JMT0hHST5JUT86OElTOzs/Nzk+RExCQEhTS0BXUEY6QT9HNkE3O0hNQ0U7Qz00RkU6QkFCRzkvOkEzNjAzPkdEOTQ9dGRNRztFKzpmfGdWOz1AQkZCcUZpSVJlYkxGpZSclqGXqZaNkYOHppOIgoeCnIODlZCQk46aop+vvq6hxrzFxMbGzs7O0sq+u7axuru7vs+2xL24uLeysbWzuLOrppyrq7mqqKevr5ejrqSnpKS1wLCrrLS/w7rAurOnubW4s6+Wpa2urqWLk5WhjXTBmn2WmYWPlpqMsZWbmpWSk5mZpaOVn5uWmqmdnKGgmYqMj5adYEqWnJqVmqWWVJawn66cn6SUr66rpZqgpZSTmJiOnJ+mopm0qaqzvLu7qrCyx7+5pqyrrbGxo6GxsrSkb2xlW1lOT0tFT1BQUTtHSkhHSUNDPjpLVT9BOj1FTTA3NTQ0OkIzNE5XTzxKS09VTlFKUEhISk9CPD5NUjs+PTg6PENSPkRIUklCV05JQEJBRjM+NThKS0NBPUM7NEVBOkE/PkhANSpCNTIsPmNdZzozNXRkZUBSNyYjM31oVzs6QkNAPVFFV1NzYldGSKqXmaCiqK+ZkZeHi6eWjomShZ+HhJ2Xjp2hmqOktci0qca6wsPHysjHzM3Gvruzrrm4wMHMtce6wbi1urCvr7O0pqObqrS0qammrayapK2lpKisur+oq7a3vsG/vrmzssSyub2so661rLmmiJuYppt2v5+EmZ2Ok5mai6+XoZyblpWbn6Gpn6egmZqqmaGnnpiQjZGdg252kqKalZ2inpCusqKqlKiql6qto6OfpaiSkpmciJScop6Xsaepq7q2vbOyrb65t6Cjp6ilp5ybrKmpjGJkX15RSkxGSE5JVUw9TUROSktCQ0Q8UVU9QUFCRE8xOD03Nz9CNzVVWE4/SE5RWVNQUVVLUUpKRUFFTVE/Pz04PTtHUjxFRFFCR1lNS0FIREU6OjM5S0lCPkNCOTlDPjxAPjs7RzctMj4tMYJoTnpcLzBraGA8PUJCODZ6Zlc7Oj0uLlJgTVVIf2VeSEWrlZyhn7qvmZSfi5Orm5GSk4mrjYein4yjrZSjo7bGvbTBusLBxsjFws3Iwb25sq+4tMDCyrXFscG8tLqqqK2ssKKjmKq0u6Wopquqnaivp6Oqqr68p628tLi9x7y3tbfBsb7AtKm1t6u/pY+imJGioLyfiZqgmZeeno+3n6mcpaKbnKGaqKWzoZudpZyoqp6ZlY+Um4qWiYykopSdop6gtK+lpJOvq5mrqp2dpKOokZWVn4OPnp6blamkoaG0tLq1rai1srOenKKlmpeVmKqhnnZeW19dSkhFRk1RSU1FRkdCUkxKQkVHQFZSREg9QUdRMTtCNzpCRjc5XFlLQUxQVFVTTVdSTlVKREBKSk5POUM/NT08TlFDPz9QP0VaTUpBS0RHQDUzPUlHPz1FQTk3QTs8QDw8M0A8Lyc7KkiRQjpTSjAsW29XNzE8Kh1CgGRUNDktMTpnXEZDQ5xwYkdFp5ekn57DrZuXpZiZqZyWmpqPqpaVp6aVra2Zoau2xMK7vrfAwsDHxL7Nxru9ubKvuLO/wsi1v6+7tri2pqSqq62goJqrqsSipKirpp6rr6yhqKi/t6atvrG4tse2tbm4v7K/wbe0s7SvvqOXo5aUnJSuoJGioqWjo5+QvaSpnairnZ2gm6afvaKYo56iqauhnZaNlZ6TnoePhI2TnqSgnbWspZuVsaeZrqaemamdn42YlJ6DjaCam5OlpJqYq7G1saqlqq2snJigoJKOkJaonpRnYlhgXU5IR0pOS0hFRElBPlBIQDxHSUhbUk9LPUhPVTRCRjk+SEc1Q2FbS0NOUlVXVlFYVFJVSEA4UVFQTTpHQDRDSFFTSUM7Qz5HVktDQE8+SzwwNjtHRj47RkE1Nj85Oj85OzE1RDAtLC9Ndlw0S1o1LE1uVzwtPSkeI3piUTVDS1E6blJGPEt4ZWJWTKKao5yexayhn6yena6gk6OflqWfpqmrl7axo6qztcTEvb+2v8K7yMK+ysi2uLW1sLOzt8HGtr6wuLS4tZ+mrKqrnZ2epaTBpJ+prZ+kqayvoqanvbWlsby5t7bDsrO3ub+yxMC4uK6ztbWjnaWVkpShrqCZop2pqKujmsKtqZ6srZubnpmmob2hnaSYq6uspqGZjZqfkp6Jjld/lp+moaC4qqaTmLWjn7Ggn5qulp6OmJSdgY6fl5WOoqSVkKausqupoaKlpZWVnZiLj5GTpJ6JYGRZY2BLSEpKTkVFQUZKPj1KQjk5SktOXVFRST1MVlw5Rkk9RE1JOEhiXExDTFBTWVlWV09aXklBPVdRSUs/SD81SE1YU0hBOkBBRFBIPz5RPks3MDk5RkU7OEc/LjY+Nzg+NzcvMT85MSUxUVVtW0pPMTA9Z1dEMTc9LSt3YFM2U1prV3JIRTY9dWVcS06en6GZnsOopaK0opyyqJOrpKCjn62prJ27sKistbHIxcHCs8LDvMbDvMTKvK+wtq2wtK+/xLS5sbC5tKyZqLCpqZqdpaGnwqybrLCcqaOtsKmkp722pre7va+3w62zssLAssezurestLauqqKmlpWVpKyin5+aqKuwr6+7sqagqaiZmZiToqS4oKGkk6+vrKWnnpKhnpSej5CNlZ2aop6ns6amjJizm6Oump2brZCek5WTmX+RoZaPjZ+hk4umrLClpqGcoJ6SkpqThYuSjZyef2BlWmdlSklMSlJCQ0BJRzs7Rz85OU9NVV5SU0o+T15dPUhQQkxMSTlNY1xMRUxSVFlbU1VPXGJIQT9aUUFIQUtCN0ZFTEtNPztCSEROQj07TkBBMy85N0NCOTdGOys2PDQ2PDM1LS80QDErJ1Z0U2VPPzEwNGJbTTIzPjA8dl1eP1tUXmVxQDg7SJZ3ZUE0n6OfnKDDqKSqsqGjtKqVs6ynoqSyrK6pu7KssLS0xsDEw7W/xL3JxLXAyMG0q7Wor7isv8Ozt66strmlmauxq6qXn6aXrbu0m6ewm62frbSyp6q5sqi6s7eyucCqt7HDvbTGp76vrbe1qairoZeXkqaloqKYmKWvuK6ytbagn6ikmZWVk6Sgt6KkpZavsbKnqqahnpuampaXqJ+fmKGer7KipoyXrpikqpeZnqSQmo2Tl5mElZ6UjI+cnpSLqamqoaegmZ6VjI6ZkIGFlYmUn3hjaFxqak1QTU5UPUNBTkM6Okk/NzdST11eUlZRQVdgXEJKU0hWS0g6VGRcTkZPTltXW1JQUVhdR0FCW1BCRz5OQzlIR0hPUD8/Q0lCTEI8MklBOTQxNzdCPjs3RTcrNjkxNDgwMi0vLjw2LSNCcWdzazIzLzFbYlozMzgwNnBbYkgwNUlwaFZDV0aMeWZDO6SjnaGmv6aor6+hqbSrnbmwq6OqtLaxsLm3sLe4uMS9w8e9vMTBxsC4wMbAuqm2pKy7rMDCt7eprLG6opWtsK2ylqWnkaq5qaCmsJ2qoK+0s6qptratu6yzs7q3rLiww7q+v6bDq7C3rqmrq6eemJmroqKgkZihsa+zq7C5mpypoJmWkpemobeppaOisLG0q7Koq5+boKCbnaWcoZedo7Owmp+Pk6Wan6ialKKdlJeJk5eSlZack4iQm5mUjqiopp+jm5ebk4eOmYt9jJaFj5tqaGxgbG5XUFFaVEFDRVRAOztIQTc6WFBkXlBWV0RZXl1NTFJOXktKPlpjXk5IUE5bVVlQS1RXWkk/RFhQREY/TkA9SUdHUVBCPURGQk0/OjFEPzc3NTQ3Pz05NUU0Kzc1LzI1MS4tLiwxPSonKz1ccD0+MS4wZFpkQDE2NDdnWWBGKD84bH1oW1Y7iXtjQz2nn5yiqb2hq7Cro7G4qqW1s6ygrbW8rrO4vLq9trbAwr/IxLnEwb+/uMS9wLevtqert7G7vr+0qK6xtp6Xq62orZenqI6nu5+krLOeq6KwsLOrqbW0tb2tr7G1rLC0scG6xbervK+xuKytqqOxpp6kqZ+kl5CZn7Oqs6qqs5qdp5ualY6gpqS0rqehrK2usaezrbGqpJyfqKOelaGZm6i1qZeZkZKemZ2fnZCqnZaXhJSXipyYm5OKjZaXmpempaKgnZaVl5OAj5SFe46Sg4yWZWxyZ29xXkZZZlZEQ01YRFo5SEI2Pl1RaFxOWV1HW15dTk1SWGRKSkNcYl9QTE1OWFdYUEpWVldMPUVVSkVEQU1AQUZISFFQQTtGREZLPTg3Qj02ODcxOT48NjVEMCs4MC8wNS8qLC8tKj0sLCUyKyo1SzEvJ19fYVUxNTA9YFZeOClDM1lUXGdLNox6ZkxApJqgpKy2pK2ppa6utqqvtbqnprC3xbextr7BwrS0usW+zMW5wsC5vrnDt8C5srSrqbq2urm9tKmtsLWYmKerqqubq6uOq72dq66xo6ugsK2zrq22srm3qq6usqi1r7O7vcqyqra1sbSvrqehs6CbqK2gpZWVmpqyo62gpq+XoaSampKOoqWnsqmhprKsqralrrG1r6SZna2nmpifmZmrt6KXk5COl5yhl5aTq56akn+Sl4ydnJmVkImUkp6ZpaKhoJiWkZOVeouPhXuMioOLkmpteG11e2FFYGpZSUhZWj17SkZENkFiVGlbTVxgSltdWlJTUmJhTEtFX2BgUUxJUFdWVU9HV1ZVTjpJVklIP0NLP0VESEhRTkE/SEhIRTw3PT46NzU2MDk/ODY2QiwtOCwvMDQsKCwvLSo3NikoOS4kOks1LiJUYFVgLzUoQ19RXC4qQi9KR1BbSDNjWVRLRJmXoLGosaqtpqSvrrWpt7S5pKyzt8q6tLq6v760s7fDwMzIvMO8tr2/v7e/vLG9rae6uLe2wbaqrLG3lJemrquno7CqlK+7pKyxsqeoo7G0sLGwtbG4sqmuq7Knt6+1tMPFtqm1tqywramoo7agoKexoKSUm5mVsZ6nnKCqjqmjnpuWmKalpbenorG0rKeyp62wtqykmaCsqJucnZuUqbiclI6OipicopePl6WfnZSCkZWPnJuXlZSHlo+Xmqeco6CSlpCQlXaEkId7hYGEjIttcHd0e35cS2VsXEtOY1w+YntHSThHZ1dmXE1eYk1YWVdUWFRpXU9PSGFdX1BKSFFWVVJLSFdVVk04TVpORUBGSz9IQkNLU00/P0xPSEA7Oj47NjswNDE8PTQ1OD8pMDcpMS4yKSksLC0rLTkkMDQyJTlCNy4jQU5IZjI3J0diTFYlLUIuPUVMUTwzcmtKQ0OQmaWupa2uq6eksLKzqrext6CrtbnJuK7Au8O3srG1wsLOxcDBvbS8v7+6vryyxKepuLC2tr+8rqqzspygp7CtpqWvpZ2ytayrsbGtqai0uqy0srWstKyqrKisqbitsbDHv7ilurCpra2lqK2wpqSkr6OpnJ6cm6+Zo6Oio5GsnqOgoKKqpaa5pay1taSqq6isr7auo52jqKqboJqakqSzmY6JjYeQoqCUjZOcn5ORhI2Skp2amJSTh5eSlZmnm5+ejJKRjpB2fo2FfXx8h4mIcHNxfXx9XFNkbl5OWWZcRkSWW0c7Tm1YYltMX2JOVldWV1RYZ15RUkxjWltUS0dPVFNOR0lWU1xOO1BeSUJESEpBRT8/S1NPPjpOTUM8PD45OjU9KzMyPTYyNDk6KDQ1KS8sMSgpKywtKiY1Ki8mMCkzODoxJiozQmM7NipIZUhKKzpJPzNCSVMsPo9rPEdIj5yqq6KpsaSppbO0srS1srKhq629zLquwLvHsbSstMLC0cXGvsCyvcDCvL+3u8SnrLess7i7v6+qsa2go6etqqiksKOqsaqvrLCvsK+rs7umtrGyqbKpq6alo626rKqxwrm1rLqoqKitqqixpamkoq6qqKKfnKOslaWemJ6ZrJ2ip6mirKajray4sbKgqaKgq6+xrJ2fp6epmaOYmY+gp5iGhI6Ki56fjouMlZuOjYWGj5SfnJWXlIaWk5OXpJucnIuSkI2Jfn6HhXx3foeFhnRycYh1a19ZYG5jUXNxXEs7hHxGPld0WGBaTmNcTlVWVVdRXGJeU09OaFhXV0tHTE5SSEVJVlJdYzxQXUQ8RkhIQkc/PUpQTDo+T0o9OT89Mjo3OyozNT4xMDQ4NSg1LyosLjMwOyksLCclMjM0JCwyLTg2MCkoMTxdSjAuSmdERjg8QjA1RUtYMUCUWj5MRZWYraihqrOcqqqwta24ta6rpaqqvcm8sb23wq+xrLPEw87Ow76/s8DCw7rAs8jDq663rbK4v76yra2rpKepsKmnqLGmtK6qsK6tsbC0rbS7pLizrKyup6ugop6vt6qqrbq2pba1o6qnrKuqraGopqaxsqSmpqGhrJaqoZWaoKaepKKqpa2in6ext62uo6Wim6qrramcoaWkpJigmpWPmJyTgYKPiIWcn4uKjYuYjY+KgouXo5qRkJqLk5KRk6KZm5mKjouKfIaAgYN6dICEgX1zdoujh3hqXmBuZldlh2NOP2eTTEVieVdiWFJlVE1WVVVUT1xdYVVLTWlXVVdJSkhJT0JHSVNRWW9BTVhAOkpHRkVHPj5FUUg4Q0tFODdDNzI6OjoqNDk/Li80NjMpNCsqLCsuIzQuLSsmKCs3OSomNis8LTIsJjA2V1ouMEpnQUE8PEMrOkpPXjREhj5IRkSXkrClo6qxmKuqrbartrGrpayqqbzAwLi4s7u1pbKwxMnL0b/Bu7i/v8G5wbnAxK2xtbGzur+9srCuraurqLaqpq2vqrmvqLGxr7Kttqq3t6a0t6uspKmqnKOes7OoqKS0tKC2raCqqKuoq6egq6uoubapqqqqoqmgrJySqaGdoKSjpqOqnpynta6opqqio5ilpqeqnKKko5+ZmJ+Qjo+YjX6HjIaEnp2Gg4qJjY2PjIKFlKKZjYyZkJGRj5KflpiWi4qDf3SGgX9/eXSDf3p3foCHnY9vcWdncHhcYHOIa09emVZIbXhVZFZSYk9NVVRVUE9YW2JVSFBpVFZTR1BZVUk+SUhPUVB4TE1WPTxLRD9AQTxAQ1VDOUFLPTU7RTEzOzk3KjQ6PSstMzQxKjgqKisqLCkpKC8qJiklMzssJDIpMjAyMSUvMlFiMDI/Zj1OWD9DLD5MVF8vSmo2T0Q7lo6woaarrpqspa2vs7Wvq6Wwqqm6vrzAsK64raG2r8nHyNDAvry6vMK9usPAvr+usbKxtby6wbGxsquzqKS1qaWts7O5sKOttrGws7qrua+prbasqp6prJ+ioLWtp6Gfr7KitKqeqKeqo6qhoqytqL2vrK6toqiooKyZkLChmKKgp6eeqJuZqrCpo5+toqGToqKjp5iaqaWYl5mdjoqHlId9jYaEhKSWhIGCioaNjJCDg5OgloeQnJCTkI2RnJSXjoqGhXh0gX98dXh5gHp0c3lof4ajdWleZWuBdGeIi31TWHBeSnhzU2RTUV5NTVJZZk5MVllkWEZTaVJRP0JOUWFROklITFNJcVFMUzs8ST87PD07QEBXPDw/SDczQ0IxNTo5My01OjopLTMxLS02KSgrLSw0MiMyKScsJS47LiYxLjAtMTQlLDBMZzozOF89YWQ/RjFDUFtbKkhNOVVBNJGPsqCkpqykp6Ssp7SysaqksaiquL7BvK+nuaqmrrDJx8jRw7y/vri+v7zJu8C4sK+0sbq7t8Cys7usuKyitKenrLK2ubOnqLy1rra9sL2mrKy1q62cqa+jn6SrqqecnqqypLOomqqnqaOpnaOpp6m9q7Svrp2ppKCunJuzo5WknKWln6SbmqmrpZ6bqqGbkpuhpJ2Yl6mokpiak5CKgo+Ffo6Cf4iej4V+fYuGkI2PhH+SmpOFk6GMlJKLkZqRlYaJfoBye3l9fGh3fHp0cHB8Z4R4hIhkYWdjcYV6bWZ4XV5WQld6bVRhUFJYS0tOcXVdSFpbZ1lFVWZQRD5KTkRDQTlIR0tTP2piSlE4PUg8PDw+Ojw/VDY6P0M0NUg+Mjs1OTAyNzw1KC41Ly0xMSYvPktIMCUaOTAlLCwwOS8sLCs2JzE3Iy0wR2pJMTRYPWZjQUo3R1NgVSo9OkRXPiqPlLGZn6CppaWhq6W3srKmqbGnrLjBvbWwo7mtqKixw8nJzcG2vb+1t7+5yLbDtbOxtbG9t7m9ta25tb6tobOnqquwtbi0q5+9vKmzwLO7oK+ztamrnq2wo5ykqKqjnpyksKawoJ+rqaeiqpukqKCtu6eusK6gq6Okrp6eraaXn5uho5yfnJqjqqOamqSklpaUn6GWm5emq4uekZCRi4KKgH+OgHualY2Ie36LhY6Ni4qDkZeQhpSjiZKSh5CZj5OAiHx5bH12eHhje3txcHByd2d/c2qDZ2RnYG1zjm1haXBgcEFceGxVXk9RUUpKTVRZV01dXmxXRFhgT15QSE1ERjs3SEVLTzxyaEtLOUFFOzs9PTs7PUo0OUI8MztHPDQ/MTgtNzg7MigwOS8sNS4uPS0qSz4qHTQ5JicuMzQuMCsvMyYsOiQ0MUJoWTEzUz1lX0RMNktWZE8pOzJPWD0jk5msmZ+Yp6Sjn6ikuK+uo6+wqqu4wrqzrZ+4r6uotLrIy8i/t8K+r7S9t8S2w7GuubGzwLS6vbepubi9q6S0qKmqsK65saqbu72ksMC1taGutrWmpqexs6CepKanoaWZnqyoqZ6gqq6noKaYo6ifsLifo7GuoKuhrKScpqepmpqbn6OVnZ2anqmml5ugqJKYk5iek5mWoamQmYmOj4Z9h36Cjn18oY2MiHiCi4SJi4uFh5KZjomVnoiRlYKLl4yRfIV7c3B9cXN0YHl4aW5wcG5ofXFjemxpZWNfZYV/X1pza3JMTH5oWFpNUExKSFBSUElOXF9uU0RXWlJnT0hMRUY1NkhCTEk1WmVKQDZFQjk6Pj0+OjpDNTk+OjNARjwyQDIzLzo7ODMmMjwwLDg1QiopLUMqLDQ7Tk5AOzczLS4rLTYqKjwlNTM9ZmQyNE0/ZV1GTz1SWmdIKj4vWFc1KJedppmdlq2goKGkobersaSztKqoucS1s66ft6yurbC1xsjAt7/BubC0vLe/u76vq72vtL+wvMK4qbu6t6eotaioq7Css7Cnmr63pa28trCesLewqKWnr7GboKSgpKShlpuvpqGeoqevoaCik6Skorevoaaxqp6so6+YnKqlqZ6Ymp6lk5udmp2mqpqcnKWWlZeUnI6Tl6OooZCIi4+FeoR+hIp6jpeKjYZ4gYaDiIuNhY2Tl4yOlpiKj5Z+hpeLj3mAenByd29vdF95d2RsbGtpaIJtZXJqa2RoW2Jzf19abHZpWkh9XVtYT09KSEhSVUYyOl9ebFBDV1ZZZU1ISkVFMDdGP0tCNklKSDs2Rjk0OT49PDk4QDg7ODo3QEk+ODw0LTM8PDc1KDU+MSw7QTEoKzY8IzhSPSoxMTM+RDUsLSc0Mis7KzEzOWNsODRHQWZbSFRDVF1oRS47MV9TLDKWo6GXlZypnaWho6G3qq+gurmmrL3Es7CvorSvrK6vtMTEvLO/urews7m4uri6rq2/s7S4r7/BuKy9urSmorOrqKmzq66xo5zBtqaptrWqnrK7qaamqLCsmaKnnKSmlJihsqWZnqSpqZyioJOln6S5qKSnraaepaGok5+poaGgmZudoJKbnJegoqubm5mhlZKUlpqNk5Ojp6SPiIqOhXmEfISFfJyNiYqGeICDh4eHkYWVkpKMkJWUjY6Ue4OXjop3fntsdHJsbHNheHVoZ2lnZW6EZ2hoZGZoal9nYmlmWmV6Y2FSc1RbW1NMSUdJT1NAIStqXmpMQ1ZVXmBLSEdFQy46QjxGPDZLUEQ4OkQzNTc9PTg5NT86OzQ+OEBLPT45Myk4Pjw6OSo2QDMuRTQoKyw+MC1OPy4rLTcsMTE5NSwmLjUtODA1NzZgdEIzQ0RnW0tXR1VgaEIzNzhiTicynqSjko6kppyenp6ktaynqrq3qKzDwLewrKK0raevr7fAwL2xwbexrrG2tri3tayqvLOvsrG9wLeuu7uxpZ+2rKaltKmrrqCgw6upprCzq6y0up2oqqqxppidqp6npJGZpq2imZ2kqqGbop2XoJyntqWvqq6goZ2doZWgpp+hoJmbmpySmp6Vpp6to5iXnpWUjZSXjI+YmqefkYiKiod4hXeCgoKch4uCiXt+hIeGhJCElZWPj4+RkZGNknuDlY2Gc359Znhva2psZ3Vza2JnZGN0f2JkZWZlaWpjaHBZXlhdbGRhTWhXWmBWSUdIS01SWD85YGxpR0JVU1xbSEhGRUEuPD85QTg5UkZANzpCMDM3PTc2OTI6PDk3OjlETT1CPDAqPEA7QT0tNUIzNz0rKiwwQSpKSy4vKiszNzIyKDU3JCs3LjcyNjg1XHlOMj5IaVpMWkpWYmZBOjNAZEclNZukoJGMrqCZmKCWpbSxorG+t6Gxxru5sLGitqurrqm4vby7rcCyr66ttq+zuLOnq7mwrq60tru2r7i9rKaetaugobClq6+fpcOhs6Wvsa+3rbWdra+srqOZnKeqpZ+Vm6iln5mko6mcmp+clJudrLCluaetoqGamp6ZnqOapZ2WnpiblJqhkqiVrKmblJyckoyVmY6UlJiopo2NiomOe4J0goGKmIWHfImIhISJjIiShJSckpKPkJGWjpB/gI2Ngm+Bf2Z5bWhramdxcmtcaGRicn9gZGdqbWxnamhmbFxsbXVxYVRiaGNlWUlGTE1PWFFQVWFlgVRAVlNZVEZHRkVALzw9Nz82PEZOYTg6PzI0OUAzNzgyOD83PTg+RkpARDkyLT1BPUE9MDVAOUAxLSsuMzw7SzYvLissLTI0OjYjMyopNi41NTQ2NVp8XTE5S2pbTVtLWGRkQEExSWRCJzSTopuPjrGdm5Ohmqmyr5+4wLagtMG7vbmxpbavqa6lt7m3uKy7r62qq7eqtLitpbO1sa6psba2sbK1uqepn7apnp+qoqqtnKrBma6lr7C2taysnrGtr6qjm5yjrKiclZynpJ2aqaOllZqgnZGbo6uqqbqfpqSgmJqanqGPa6KVmJxxgpacpIB2kauonpaWoJGJl5mAl4ufj3iFk4yDbWl+d4NwbIaKhn2EioZvXWRgZ4SXhmuLkJSSdXeLhH6Dj39mh4BodWlmV1xpdG5OUGpkZnGCZl5kZm5saV5dX4mQhYdoT0tEOEVUZ15KR1BQVVVLR1Ngb3RlRVtRVVBGR0ZDPjE7PTY9NjwzZlw1Ojw3NTtENDg2MDpCNz86PkZMQ0IzNDM9QEBAPTI4QEU9MSwsMDg+RzcwMS4qLiovNjY4LCMxJzIxNDoyNzZYgWwxNk9rW05cS1tmYj5HMU9iPCsvjaSZh5Wxm5yToJuqraujvcWvqbfCuL29rae2sKarpLe0srOxua2qp6y0prC1o6e3trWop6y2s660rbOiqZ+0q56ipZynqJquvZWnpq+zt62tpKiuqqumoZ6coKinnJehpqacm6ennZKeoJmQnqeqo7Svo6KjnJaYmJejiKGPkpqHoYeUnqF/pX+nq56Tk5yTiIRyeIyOg4egdoiMaZeIZn1zeKBviIeDfox8f6Ggn5l/e4iedIiOdpuKbIeBg21oZWN6bHFiVIZtY21pmHFYanBuhldeaVtraluIcG15codph4RaXkZOPkZeTUZSVldRUVJXVGdeTFlLUlJQRUdHPjw0OT05PDc7MDw8Nzk5OjY9RjU4NjA8Qjs8OT1GUUc9LjU8O0A9QD41OUdBODIqLzE8STkvMDEuKi8oLTQ1ODMlJjIxMTU+MTw4WIN1MjVSa1tOXExcZ189SzFWYDcvKIyml4SdrJ2ZmZ2fq6qoqr/Dr7K5vLfAv6qkt7GqrKazta6vs7arqaWxraW1s5ystba0paeos7Gtsqivnqqhs6mfpKOaoqOdr7aVpKamtrymrKepqqynpqKgmaCnpJmZpqOkmZykqZaTopyUk6KlpqC2pKOgo5iVk5iUnIiukJiUiamLl6OchbGApK2elJqelXmC1Kh/h5TAm8d5eLGlt5dkgMCcv3mEhHmPg3yQkJHKcZa8nMV7cranupB7gWyXsauweGhrWLGub2VpvJK8bmh6bXGP2H5TamO2sn6AcZR1mqGqkFdPV2FPVk5GVFtYUVBTi1xXW1BAXEVRTkRGSTw8NTc9Ozo5Oi49Ozg3ODs5PkY2Ojc0PkA+Njk/RVJJOi41PjtCPD9BODpKPjUyKjIyQkUvLjMyLisvKS0vMTg2LSAvNDE2QTE9OleDdzIxVGtcT1tNXmdcPkwxW1w0MSGOpZOBp6qfl52dpa2yqbHCvbK1v7W3vsKrprStramor7Sqr7azqKemtaWnuK6csrG1qqWkp7KurbGmqp6npLKkoaGfl5ygoLCtlZ6jn7S5oqmooa2upKKem5qiqaCYm6ihn5iep6eRnKeblJ2hpqKgsKOen6OWlpKYkpmFsGtqio2qfmeEloetZXGenZWappVxrqGkfne6fGuhj3axX2q0W6WAZZyRYGaBemZ/anhqqWW+cmemjHaxanyxeHSSk2NtbadtW4SgRWlnh5ZFdZxgfWZ7o6eCWV+Lq2mAlHh6aqc3Sq9bV1RsY1pLT1dfXFdWO06IT1dWL0lUU0pDRUY9PzQ2Pzs4OjkwPTg5OTk6PTxEODs6Nj1BQDY8QEhRRzkwNzxBQz5ARDhARz0xMy0zM0UzLi41My8rLyguMC46Ni8nJDIwM0IvPTtVgnYyLVZqXE9ZTF9nWTpNNV9ZMzEbkqGVgqynpZ+jpKqxt620vb6wt8WyuLrCp6iwrK+pqbGupLC6r6SkrrOjqbmpnrOzsKOloKqtsKyvpqifo6KxnKOcmJWYnJ2up5eboZ+0sqGqm6GtraCempegoqqdmZ6koZyaoaekkJ2jmpegn6ufpaagmp+hlZWRlpGahbWbtXiFqZm1mXeHs5u3f5OWl6mVfmuBpnqBhYeSlJJ3q2dqsVuse46HlHSIcI6GgH+IkJd4g4KLl4yDoI+FsHZ3n3Framx8i06kWEhjY5l+Y2imYHlydVKThl5QqW1jcX2GgGKdLlGibltUa2dgTEtcZFhcWkI+sHhXWEEjTWhGQ0RBQEExOT44ODo4NDs6OTw5OkE6RTo6OzY6Q0I4PT9LTkg6NTpBRkJAQUQ8RkQ7MDIwMTtGLDAuODQwLC4oLzMsPjgzMR8vMi1EMTw8U31uMytYalxPWE1fZlc3SjlhVTUwHJaflIizpqairqmns6yqu7bCsLzCrbi3waqsra6vpq6yqaGvu6qhp7Wto6u1pKazs6ejoZ2nqrKosKilnqCfsJegmpWVl5mfrqOamqSotK6hqY+pqKmbnpWYoKWpmp+do5+coKKlo5WbnpianaKqnKWam5uioJaTkZOTnYPVk5m5cLDCfsaGfNaUm7t8mpalkI2bjKR6jYaigaWCeqx5j51Vr3uJfp9quVq5d4aDfaaCk3yYeqp5jZ2Pe7FtjoR0kLuFb5RPr6fFilGgemNgqmJzcoZsl4dfU7W0yIaAiXxjpDNCnXZdUWloZFBAWGZaZGFKSE1sS1pTT1lmWkNDP0U/MDw8NTk7NzQ8Ozg9OjxDOkY6Oz42OkBDOzZAT0xIPDk7REhDQkNEPEVGODEyMTFEQi4vMDQ4MystKS4zMjM5NzEjJTUqPjM9PVF3ajYqWWlbS1xQX2ZUN0c6YVA3MiWcoZOYsaiopbOqpbSopby3wbC6wLG1tbyztqexsaOxs6afr7aom6i6rqKvsaCztLCgo56ep6mwqbSppZydnquYmZiXl5aXoquempeorbCoo5+OrKKnlp6XnKGmopiioaKhmqKip5ueoJ6VmZqmoJynlZubn6CYkJKVkZ2Ism5otXGriHCOpnK0c3K2e5qYpI2Pm42ifo+fpH6wdoOR0tF1W658hX+kb5uqpmuGhX2tfZeZj3uxc5OdjnizZZZ0hZ5unmaUUsiLWsJcn3liX61gdnOGYpeIXlnKnW+/gXVNS7VTVcZkVFFqY2VYQU9qX2xpUFVGSTk9V1JbV1hIQz9KPDI/OzU9PDQ2Pjs3Pjw9QztHOTtANzs+RDsuQ1JKRz4/PElKRkNFRD5JSToxNzQ2QD4vLjI0MjUyLSkuMjYsNzQyJh82MDs1Oj1QcWg5J1dpXEJOVF9lUDVHPWFNNjIuop2RpK+spKq7raa0pai2u7yyu7+3trS7u7OltLSisrKjoKyvpJimuq6ksbCctLipoKWdoaqlsaisqqWanZqpn5aVmJmTk6OpoJeTpquwpaKWkqyfpZKUoZykp6CVm6anopqjn62aoJ6ekJabop6cpZSclZminpWYlpKbhax7d6h2o4+Lh6lvrYqDqIOZmaKKkpmLon6Sl4euhX+Cs1xys1KufYKCpH9x1313hH6PnYaZmnevhoqRnId3tGGaZZqCgZVsklqwWEuadZh5ZmCtXnd3h2eYiGpdr3eVno94bDV5yK6yX0JUb11oYEVPa19xbVZVTS9lY2lTWVE7QURATDo1PzkxPjwxNj85OEA9OkM6Rzs8Pzo+PkU5LUVVSkVAQzpNS0pCSEc+R0s5Njw0Njo+LzA0MzMzLjIuLjE4Ki4zMiUhMDM3Njc9UGtlPiZWZ1xAPVZfY042R0NgSTo3N5+dlKC4sJizwa2osqeqsrq4tLi/uriztr21pbi0oLWtn6Cpq5+Vp7asqLCxq620pJupn5+oobWnpqqjmZ6VpaKUlJyZk5ajppuTkKesr6WhlZipn6KPkaKaqaahlZqmqZ6dpJ6snaCdoI2UnpueoJiYm5WXoaCUmJGnnYapfX2leaGPkIOqcK2MgqeGlqChipeXiKOBkIeUqnyAi515b7FaqIOCiKB5dNh/dod0p4GOm42SpHyWkJ+Ee7JenGSgfYKUbJJcq1tak3+Rf2hnqmNye4FrmIdxXaxaiaCOa25lT0pDoVxaTXRdY2ZNWmFfc3RfSlU1SpqSWUhFPUhGQUwzNUE4Ljs+MDVBNzhAPDY9PEY/Ojw2Pz1CNy5IVkpFQEg2S0lOQElLQEVOOjpANC47PjAwMjE1NCsqMDUvNywmMjEoJCQ2NjcxPFBlZUEmVWZbPzFVX2JMN0ZJX0MxPTehnJmZvqyYtMKuq62pprSwuLG1v7q6s7G3vKm7taCxpZ6lp6eek6qxqa+qtayqrqGYoaCmpKS5oqOroZebkaKglZSem5SZoKCQjYypsK+mnZeap6afjZKkmKirqJSXqqifn6CjraOgnaGNlKGYn6CSnJeclZ2hlZePq5uPrm1ytHSpjHeKpnO0eXSzgJKko5KcjImkh451uG+Me4uia2u2WqGGZZeXaaCip22UcrR0k5h/smqGkoita3WzYZ1mom6GkmqXXK1gTaF8h5FSc6NseX9+bpiGb1yvVjycd2ZUb24uW6dPYlJrZWJsWmJcYHF8Y1NZUD4+bW8zQkJAP0w5ITdANi47QDM3QzU4Pz8zOzxDREJKRk1JRjYySlRLRUJKNklKUD9IT0NGUD08RTUwOzwwMDAvNzUsKyw0MjYvIzAwLCwdMjg5LzlOYGVEJ1VkWT4vVV9hTDVGTV45MUE4pZqbnbuinLLArq2rq6e3qbivtcC1vLGvubirwbeqq6Gcp6SinZKrqqe1o7Korqqhl5yooKSruZ2jrZyWmY+lo5aNnaGbmZ2fkZOVq7avp5mUm6ypl4yTppqlraSSl6uzpKCeqKuwmaGij5iil6CblpuXoZOcqZyUkauZh9SSmrt0scSAw4Z91ZacuHiIkZeMl4mMp4d5orZ1fXd2woKasmCDunnAfHW4YrWBjIepfZaBrKlxe391vIinoGmdYaaOr6F+jHSHq32+bnO8dLKDdXiAim2aiHBtjaR0vV13fVthebxqWlZbaXleaWBkZmJteG9ZW1lDQUByP0NGKzVIIic7PzEwPD83OkI5OT1DNDxATlpeYGBfX19aUFBSS0VGSjRITFJASk5FRk9CPEU4ND05MDIwLjg3LSouLzE4MCItMSwzHiw8OjA4TFhhRidUY1g8L1ReYEs1O0xbLTZAOaaZnqK8opexwrCtqaqssae4r7bEsbqyrruwrsGyrKWjnqShnJuQqqSqsqS1p62kn5aaqpmmrLmdo66ZlaGQpqCTjZyjnpiempCWkq+5sKuVl6Onp5SRlqWdpK2ekaGoq6Ccn6mksp6ipI6moZShmZyXlqSYj7CgkpWqnoWQmbWAkZGNuJV4gpObtXdubG5zbnmPhI6Jcp7Bu7yZeoGyqHCAdJG5g3yGhouHjXuKho2XfKS7ub2cdXmzo3R2l3V0sHWYnmaGaY22dHJwd7aMXn95fYlng3lteWKLrHB1hX9YW6dqRGRaVGZfY11iUGdmcW11Qk1QTEQ7Wkw/SjM8MCA4PjsuMz1BOTk/PTs8QzZCVFlaWltbWlteYGJgXVNHR0g0RElUQktOR0VPRj9HPDc/NzA3MC85Oi4sLy0qOC8lJjIoNCQoPjcvN0tUX0cnU2JXOCpPXV09KztWVic9OjymnaChv6WWs8K0rKqnrKupu66wxq+1tK+4p7W4raqjoqafoJ2Zk6ylraqmtaion5uWoKOerKS+pqGqmJWckaKbko+hqKGTnpeSmJSytbatmJ2kpKKLkpKmnKWrnJappaadm6Kpp6ajqKCRrJ6Xo56Xl5idno+wqZScp6KOan5pnKd4iXN+mo51emWHe72+wLpukYJxlIVfcmpaXZqJYWSHjpVrYH+VY22bdmKUa3+alZRlXmBjcZuJaHKMfYaUZmp+cXN5fXxiW3d0gWhQXG6DfHuKalhseYJySUpvhXBNdE1FV1xmYUxbV2ZjXk9abXZqclJPREVOO0hJPE0/MiwyQT84LzU/Qzw5O0A7PUM+UlZWV1laW1tcXWBhYWFgXFVHNURGVUVKT0hGUElJSDs4PTUxOi4wOzouMC03Nj01JiIvKjIsJTs4LTdJUl9JJ1NfVjQpUF5MKDM+W08nPzI+qJ+oocGjmrS6tqOspa6nqLWyrMissLOstaO+sbKmoKOpnaObmpmsp66kpbWqpJuYlaKbpq2pv6ipppaUm5WgmpOYpamokZ6Qj5icsLK/rJunnaehiZORqpuopJybrKCjmpujp6yin6qhma+alaaflpSdn52XsKWZoqiZnJGenKOkmaejmpyampqQloJobnxxdpCXlJGEirSpjYWYlY6KjJiXh5OVioOSkpCJjZGUmZOYl5qgoZqblKCdjoJ6pIVsaXyQfIB0iYqBcYJ4eXZ2ioB7iWpzgXSDdWR3fXZrcHptYGNbb2hNWFhlal9XWXB6b25mU09GUzlPWk5STygrO0pCNjM1PUBBOTpDPjxFTlNTVFZXWFpaXF1gYmJhX15eW1RLQ1NHS05ER1BMT0k8OjszODksMjs4MjApNklSTzgiKSsvMiM0Oyo3Rk9bSidSXlQxMFReOis9OF1LLDwtQLKgs6G/oqSxsbegqaWzp6WwtarJq62xprWmwKi0oZ6lpZyklpWgq6eso6O3rKCZlpagl62qpsGfrKSWkpyXnpiTlKKenqOnkpGZqKeyw6+Zq52rno+Wlqmeq5yeoK2YoZudoqWvpqGkp56smJemnZmaoZ6enLCgnaKnlpiTmZSgopajn5egjpaUi4qNjpatj3uUm4KRgYqpqIWAmJaKhI6fiHuDkIaFmZCHhomVjpuXjZCYnqOWmZKQnY1+jWWhs66EiYR2eo+KfXZ5em9neZCBgIlrdYF5iHJodH96doOIgmt0Y3hmX2hkY2Rmalhre3FqalxSTFBEX1VGQD8+LDRARjs0NTs+QTs8Pz4+SE5OT1BTVVZWWFpcX2FjYV9eXV1eXVhWSktMQklPTVJKOzw6Nzg2LzI5NjQuKCYkLTEuLikrKjclKzwoNkNNTEQvVFxRMDVNWzE3RTRcRzU8LEC0oLmvvq2rrbGyoKqmsq2irLOwxbCqrKOyr7yktJygp6KhnZmXqKappqSls7WelZSemZmvpq6+oKujkZGempmUkZWhnJepnYWeqayis8ezn6mkqpaWmJqnnqmcoKSrlJ6fnqCqrqmloqqhrJufoKCYpZ6cnpyvpJmfqJOYl52SpZqYqZ6al2aDknxlfo6aj2N4jGxoanqQo6trZJmYfmeFimVlaWh6jaGOa2eMl5Gid2tqi5iin5hzbG56hI2FeVhlXYWBXmuKioF2W2hzd3eRgIeCbniCeIBzbXmEdHeIiY+De2iEWF1qc2Rdc4hpanxxbGNdUU5XSWRYQEozPUY3P0ZENzE8PT9BQzs7REdISElMTlBSUlRXW15gYWFgXV1dXV5fXVpVT0RIT0tTTj0+PT02NTM1NTU0KiYmJSwqJS4rKyc2KiQ7Jy9BSVtJLjZaTzYpRVkvRE8xWUM7Py49pZ+6vLmvq7Owq6Wora6wp66usL2xqaikrbCwn62XoKSeoZqZpqucrKOmqKmzrp6Vo5Cir6a2uaWuo4+OmqGZk5KaoJmZppZ7payiqLPDuKWip6+fnpWeo5+knKSqqJKeoZ6gqq+pqqKpn6ebpp+noKyVoZulsKSYnKuWoZ6bk6WYnquZnn6+g4hytHKFnYataHe5xLhxkqGje6aYmXOqgnzLwMC7cYqih4OefJWYiJ7AvYKWnZ2NnMHBe4F6kYyawr99a6Wxb4yBb8p6f5t4kYOOgHZ5gX95cXp/h3B4hYyTeWx1kWJlXnhkX2WBYl50aG1kYlhMVklRWkhPRDJJRT9EQj4vPD8+QEE6OERDQkNFSElLTU5QU1ZZXl9fYF9eXl5eX19fXVxTTVBHVU5BPz89NjQ2ODI3NiomJSMpKiYuKyopMTAfOSojPkhbTCojQ1AvI0ZbM1BZL1VBQjsvOJajuMO0sK+/qamUo6+psK+tprK2r6qmpqaxq6CrmJuioJybqqeinauipamlpLSknaOTpq6suLSnr6KSkZmdpZKRn6GYm6Cdh6arpKutv8CxoaquqpeSn52imaKkqqOToKGenayuqaulo6KloKSlnK2pkaSbqK6qnJ2qnKyilpellqGjmJx/zpR5eqWBeZWWm1+tj12Op4ChoHynlZt0q4KAr15kjKl6p4eFn3SXkoizY4KrhqCNjbJqhK50fJaHuGGCrVmjzW6PdXvbe3+ZcX6IknV/ZXuIdnZrfYhufoWQkn5sgI1fcGpvZmBfeGRbcWhqY2ZgUlRSV11KT0M1QUhFRDg+NjtAP0E7PThAPj8/QkRERklKTE5QUk9TXF5fX15dXV9gYF9fXVpXT1VKPT8+PDU1NzgxNjQoJyQhJywmJi8oJiszHTYwJDc7U0wrLC1KMCc7XDpMLSFQQEY0LjGtwsDAtbSwt5iekaSqqa20q6ayra2spKymsKqgp5uappicorCfoJ+op6OmoZ+wrJuelqaurbGrqKyglJKbn6WTj56ll52oo56upKuwqL/Gs6ipsa6Wk52dopegqaqflaGenZ2ur6eqqJumpqOgqpKss5amoqqqnqOnpqGwoZKap5qhm5SUkZegcIWMl3WEqIdxsHydcqx+oZ+BpY+ed6uCfa1/nHKtfquHhp92mJJ6fJd+qoihi5GLnH6re4iSjqCAeq1WnMR6j2+SwX2BlW11cIxtZnZlhm9hd25yboiKkY+DbZCOZG5zdW9gZm1kX25paW5mY1dTXGBaUlJDOElJQEQ8PjxARkRDRUE9PDw8PkBAQUJFRkdFQENJU1dZWlxdXl5cXl9hX15eXVtaUkM+OzkxNDc4NDUyJiMfHCAxJyAxJx8nNB41LSY3PVdKLTwnPTEpM1ZARiEcRztDMS0rr9TGx7K0n52jjqOjoq2utq+psaepqqiuq6unoqOdmaKVn6arn6Kln6ioop+esK2Ym5aop6+tqKepnpeVmqSikpShrZudp6OurKOstam5zbKtpq6sl5WcnaKZn66snZahmZ6fqbGpqaiaqqijoaubr7GiqKuuppmmq6qqsaOTl6OlmpSShaRqpHWJeql0erJxgqWJmIxwh6Cah6RfYFKrhH+ugpt1roGmhoafepiWhXtmgKOJpJiGgaN9qX6AlIauXnyoVZ2ikoF6o5+Ae8OvxYxzr7OzuXFiqa/CdWiMi5ePgWyZkW5teHd3bmxmZWRxcGZ7aWNdVl9pWFhUTExRTENDQUI7Q0BAQkk8PTo5Ojw9Pj4/QT04NjtETFBSVFZYW15eXVxeYGFgX15dXF1bU0lCNjc5OTY2NCwmJCIgKCciKy0iJC4hMy0mQERXSCxHKzU2KjFQS0wjIEE5RDQsJ8LJ1dbAoZmrqKGvop+wtbCvqa2jqKeqq6uppKagm6WfnaWnpqScrJqiq6Gkn6+jnpuTqqS2sK6gqZudl5WnpJGboaifoKacsKajqLGstsiytaqsqpWSnZ2imZ+ls52aoZScn6arq6KtmauooaGporKtoqqysqGbqqivr7ajk5akp5ibkXyqbJ6Eh3WreXywboKki4iflpWelYHSt7S4yYCBsl5flKmDpIiHoHqYlZl4qslzmaOUp6mQkpuMfpqJmsbGd2WhgqVzgqCOgn2vXm+1Y7F1S6OGbadHgpNjjo+dkntwlpF9b3p0fHptXGZqcnFmgWleYVhjbVxeWUlNTUtFREFCPkE8Qj9KOzc5Nzk5Ojs7OzMuNjxBRklMTU9RU1daW1tbXV5fXl9fXlxcXFxcWE1CNzU3ODUvKSglJiUkJiksNUZOUFBNRkxKVkYqTDAvPi00T1RRHRw7PEYyLCSopMHGua2osq6spaKdsrmsqqGmm6imq6ypp6CmpZiqo5+uq52moKyan6mlnae1n6KXk6irtrKsm6acoJWQpq2RmZyno6Cqp66ho6epr7TCsrOqraiUiZedpZuio6+ll6GVmZylpauarpysp6Weq6O3rKCxuLCdm6+ns7SzpZWYqKSboI6CnU54moF/n3qEo3yCpISGpp6cnpOEuHt8ebmCfszFwrZ4mqCQi59+mpaXinWel4qkmKOofrCFm4SehKx9mZRhpWyjcI+FkIF9l4NyrGCkc3GAmmC8fVJVdI6Ro5Z7fZGQiHN6coR+cFtsbndyaoFuWmNfaG5iZF1LTFFUQUhIRkk6OUs+QjEwODg1Njg3Ny0qNT09P0JER0lMTlBUVlhZWltcX19eXV9fXFpaWllVU09IQDc3Mi4sKi4rKicmP1FUVldXV1lYWFdVT1VGPEUyOlBbVBwbNj9ILC0gjIeZqaykq7mrr6CboayztKafoJWlr66uqaadpqaao6ehsq6hqaayoJmopJSitaKjlZehqbW5pJujnaOTkKKxmZ6cp6Whoq+tnaSoorWxw7Gtqq2qkYaRnKedo6SdpZeemJmZpaOoma2hrKSll66lu6yht7eunZ62s7mxs6eZnrCipJ6Gj9G1w7d5h46FkZOPgKZ4lKJ3jKCShKWCi3GrhoS0bnJpmaOclYmffJiZhoePcq6CpZuijaaLk5yIk5CabXCyXKVzk3qcbJl/e5l9bqlhonFxf59ic7K4aHePk6WYfYuLkYp3fHiNgWxod2l4c25/dFxkZG1tZWhgSlpXWDxHR0BUM0BGPjwqKDYzLjAxMykmNDo7PD0+QENFSUtOUFJUVldXWV1fX15eX19dWltaWFVSUlFGOjIyMzAvKysoQFFSVFVUU1RWV1dYWFdVVVZUUU9RW1UlITJBSCQpJZJzjIquv7+8u7Wel6ikrbaho5mVo6mnrqmrmaWhn6WgoLWnoqmnsKOUq6OOpK2jnZCamqq0tKSdppypkpSXrqCgnqaknaectZqgqqO1q8Kwqaupoo2Ej5yioaajlpmanJibmKWkppiqpqyhpJuspr2slL2wrZ+jsLO6rLSnm6mypaiYeqiQfXywd4qBpKWInG2yb6CHrXyhj4OolpmArIiEroWflKigopaFn4CZlYB7kn2rgJ2aloqqeJ2fjoiTkoB5r12jgXymp2SdgHyXdGuuXaVrcYWZXWBbjKBtlJCmmYKTi5WKeXmCln9qbH5ifXRuf3lfZmVxbmdnaENZYFs9SlQyVDhCQkM3JCQzKycnMywgLzY2NzQzNjpAQ0ZJS01OUVNTU1ZaXV9hYGFhYV5dW1pYU1BPTkk3MDUyLiosQVRWVlZUVFVVVVVUVFVUU1NWV1dYVlVVUUhGSUojKCi8kpqEqcbDtsG0n5utoK64paSOm6SjoK+uqZ+jnp2tmJ65oKKroK+qmq2hkKqppJaJmpCusaymn6ibrZiYj62ioZ6loZqlnK2Yn6imtqi/r6WppJ+MgI6bm6CmnpKUmZqUmpqko6OZp6qroqOeqai+pJfDrKqjoquzuqyvp6G0sKmrmXavfpCKnIWHfLqtiZhksIxlla19oI+Dp5aagayKhLCFpZmkoaKQhKBbbGqBs2B/rXt7goGxbGdumZeLiLFbfbRbpINryKJln4F7vFl2tVqyfVKvgHqsWIChbZeOqJqJlo+UlXl3jZt9Y3J9YYN4c398YGlmcG1mZWVPVWNcQVRePUkoPjk9NCEiLCUfMi4gKjEvMDQ1Nzk6PEFDRkhKTE5QUFJUV1peYGBgYGJeX1xbWFVQTUpHQzU1My4vQFVZWFdYV1hYV1dYV1ZXV1dXWFdXWFlaWltcWFdXR0I70p+zsre9u7TBs6Ocraaltqmhi5mgn52zsqieop+dtJigs6iqq56wrZ2sm5SuqaKOiJuOr62opqOoma6Tmo+pmqGepZ+Zo6OlmZ6iqbKou6+lqJ6dj3yLmpahoJqQkZqbkZmXp56gmKespqSkoqSpu56gxqelqaKrtLatrqegva6trZaBqZKjro6bgIakl5iPgYC4w7qDjpyThKeXnIKsioKviKabmqWqkX7VvcKqYqO/vXx+o4KD17q4tYWTkoKevb6EaqOBb6uEbpx/erKxx4Nqq7C9rXh3or67dICVjaabjpmPlZt4gI+ZeWJ8emOMZ3iBe2BrZWtqYlBiW1NpXEBUYUJNKTw6NC8eHyQeJTIgHSQoMDQ5NjY3ODs+QUNGR0pLTU5OUVRXXWFcX19hXmBbXFlUUU1JQz48QT81PVNZWVhZWVpZWlpZWFdXWFlaWllZWFlbW11dXFpWWFRXWryVtLSxv7myvbOina6mprOmnoyYpb+qt7CnoL+mprGbnrGcuaiera6lp5SUr6yXjIOaka+mo6yhpZyqoJiLo5KmnqecmqGoopmeoKutqbmuqKSbl5N7h5mRppuTj5GYmI+Yk6iZn5eoqJ+ppqGiqrueqcWjoK+jq7O1q7CqobyosLCadHWqpLeFZYmfb2esj4qPbW93pJCZn4F1r5mVcJCMcZWno5uYrqRybW1tZYp3bm2CmXGAeWlwaWeJlZWXcWhphYZncIZkXoljanBZXWd+d6ZgYnGOkm9mZICNko6il5aXj5Sde4aNk3RlhndojGp4fnhkbGNmbGJLZFhKa1k6UGVFUSdLOSsjHCAbIywpGBsYLTIuNTo0NTc6PD9BQkRFSEtMTU9RU1ZcV1pcYF9hXV1bVFBMSEQ9OkFCN01YWVpZWVpZWFhZWFdXVldZXV5eXVxcXF1eXV5dW1tVV16olK2zqbq5srOqqaKun6SzqpiSvbHDyL21qZ7Aq6yjoKarn7qjpK2srKWNlq2qj4yFlZetn6Wqop+kpKCRjKWTp5momZajqqCWnKWmp6+5q6yam5OSe4SXjaaXjZGQmJSNl5WnlJ6Xp6Kar6adoqy5n7DBqKSzpqyxsauurKi5pK+4loqhqKW2nImWoZeGqZqQlJ2TqrOZm6OsobOXoqCeoKKcoKShlaumjJKTjIeSnJyUkJmTmJCOlYWApJqXlY2Lk5KKj4aEfWeLgHSDdnSHjHGnbXyVkZSTgYGPj4+OnZOglZaVn4GGk4twZ452b4p3dnx5aWtkZG9jVWBZQGlaR2JgTlkqRT0rJiI3NDAuHxwhJTIoKjc5OTQ2OTs+P0FCREZKS0tNUFBRV1VWWV5fYWNdXlVRSkVDPjk9QEFTWFtcWVdYWFhYWFlYWFpbW1xeX19gXl5eX19gYGBfWVlgpZapqqS1uK6uorCkraChtrGQjqvEu8S6t6qhpZ2bpp2wqKO2p52ptKankZeso4uIiY+cp5aspKGap56fk5Wjl6maqJmUp6GkkJqnmaG1uqirmJqQjHuBlIyhlIqUkZWQj5OXpY+emaiem7Wjnaart6iuwq6jt6avr7Ctqqq0uqKvvZmSpqOmtaKRnaaejamfjZKfo6yvmqGjsamwmKShnKSqnp2dnJernJKZoZuTkJaqmY2YmJaQlp6RiKCdlJSFkoyQjJSLgH5mjId1h3Z5iINznGqHkZSUkYp9jJaSkpiSoJGblZ+ChpeFeHGUcniJf3F7fmluZF9waWBbX1ltYlBgZFBaOkdGRT0zPT03LiomKykmHSY0MDY2NTg6PT0/QUFDSEpHSktMTVNTU1VaYGBpYGVWUEpBQ0I7OUVNVlteXltaXFtbW1xdXV9eXV5fYGFhYmFhYWBiYmJkYlxbY5iVpKejsLOsrqOpp62gqLWqkZCco7K6rquroaKZep2isKSlsamWm7imo5SZqZyOhoqJm6KQrp6klqigoZKXmZyui6qWj6iZqIyYqI+eubakpZibjYh5gZOMm5OKlZGUkI2RlqGMnZ2nnZ64o3+Dr7WisK90pL6jsqB4eqCrs7yVdq6kn4qAqn5kW2F2n46knYOXfm6Ts5yjqK6ro2WeoJNzeZmWcICYqJdsf6KniWWcpZuQl5iWi5GbkIWdmpCUgpKHjo6SiYV3a4+HdodxfIaBgGFpiIuVk4tbdpWRZ2iPjXF6o5eWZHiYhoB2l2iDiYJueH5qcGVfdW9ra2hcZWNiYm9SWz5NTk5SRz1AVEI5MS4eHyY0OjMxNjY3ODw7PkBBQkZIQkdGSUtMVFVVWVxfaGZnV1FKPERHPDlWUltgYWJgXmBfYGFhX1xdX19fYWFiY2RhYmFhZWRjaGReXWaclqajobCxrKuppamto6etpZKWqrSusaWZqaarlnOLnK+fqKunk5a4n6CPnKOdkX6IiJqejauapJWnop6Ol5KehXWukImmmqiRl6OIm7q0qKCZmIuJdXaTjpaTipORkJSMj5KfjZqfppibspaAjJu1nbSMko+9p6F+p6J6o6+4gY6Op5+Ei4WPsKmvjImWopl5gYushpydoqiqqIiVhph3pZt6h5uBl6aCgXucsXqKhZ+XmZSYloGQlpaEmZpieYeQhI2PkouDbnGPiHqBcYCBhn+GdIeFlpJ4lmiTdKCadHyZg56bhZh+kYmBgpdpjYyEa3h6cHBnZHdtaWxqW2RqaWVyW15IU0xRQEU1LVlUVDYpITA5PT42NDM1Njg7Oj0+Pj9ESUBJRUpLR1JYWlhbYWFoZllRSDlESzw+YlZeYmRlZGBhYWBiYl9dYGFhYmJiY2ZnY2JhYGVkY2djYWFonZijn6aurquorKCosKenqqWZlK3GvLChlaWotJ2Pg5yrm6eioI2Qvp6ZjZ+aoJB9hY6Zl4irnaOWoKGSjZOJhoCRqI6Hopyjk5eehp+5sqedmpOPhXB1kIqVkIqUj4+bi4+RnpGWn6OVnayIn7SJtJqui8qIq66Jt4WNsIOxr4SpjaeYjZ18qI9ye3ebjqaWaJWkebSLn56nqZKZwoF/q4iYoXGegJqkfZeFlbGBoXygk5+PmJeAjpObiZiSi3yFk4aNlZOJg21zkYWAe3KGgYV9hXSFgpeBj8VmgKmHj6JqnoKfmIGZgIqLg4iYb42ShGd3dHt2Z2h1cGZna15ibmxmbFhmRlxQTDJFNDZNYGM2JjQ8REdEOjYzNjU4Ozg+PT0+Qkw/TklKS0NQWl1cV2JeamxcUUU9S01ASmRYXWNmaGdiYmJiY2NgX2JhYmNjY2RpaWNiYmJlY2FmY2JiaZWXop+wqKmopaugpLixqqummpSfoqSqopWjqbair3+gppylnp2JlL2Zk42gkZ2QeYOWlpGHq5mcm5qhhY+Md5ucj6CRiJ6km5WZmIaiuK2lmZuNjX9ibZCLk5CNj4yMl4uQkZ6Ok5+gmKGofqGnh62doJauj5+dnZGGgaCNq6+HpI2qmoyafqJ1gJiTa4GrdE2reIeNnZGbqaiCqqt9g6F7eqdpnn+Sa2eXhpe2iJ59bWBjWIOXf4x7ZGeLc5l9eZZrXXyXbl9TcYVcYGx5g2BZZYJ9hIGYcaeqa4OjbnKlcJ+DnWdkn2xabIh6ZVlfgn5hV1BvdmVtdHFqam9eam9sa2hXaE5dV0U5QTRHQ15rNCtJQ1FNTj04NDg1OTs2QDs7PkJPPlFSTE1CSlxdX1deX2J2YE1EOk1PTVRiXFtmZmlpYmJkYWRkYmFiYGJkY2FiaWtkYmRkZ2RiZ2VhY2iYlp2guaGqo6askqG2vKuuopmXn6GlrKyfnK20oqeRoJ+fppyZjpi0mZCLnoyVi3WBlJGNiqaWlpienn+ThYaspIeckYqYqZiZmpKHpbCmopWZiImAaW6Ih4uOjomLjZKLkJGhjJOen5uipX+TgY+joZSgd5yWkKeDoaeAhqquhaV5i32Emn2icHKSh5Z7nox5bYebjJmQm6mbj4edfIKic3amZp5+d6RfmHp8knOibpi3tLp0koeBgLaoZIHGuHtwlbaMcYCbpGN0rKtgfWqds35ufYeDjoKLl3GAo2xzpHOeg36jXp2Zs5Zve5ees3RyW56ygmlib3N1cWhvWWtscnJlXGhdYktEPUQ1UUFZcTI8UkZfSlM9PDM5NTo6NkQ7O0BJUD9UTU5RQEVfXltaWGBgfGRJQzhMV1VWYmFaZWZra2JiZWFkY2BhYmBjY19gY2tuY2NkZGhkYmdmY2holJaVo7mZrJyToI6luLWuraCaopyjo6Ssm5qxrKuSl6CYoKSampSeq5uLiJJ4i4VwgJaNio+gkJOUnZd9kYmOqKGHmI+KkqOTm5qMi6inpJ6PloeEfmt7hn59j42Di5CQiY+Tn4KWnKCdoJ+LiXecmKKMoHKii4ipiJynkZeorH+ujH16oJl5o5N4gHOXiIycfZafhpuNmZumhqNkoXyJlpCbjWyeaJqNbpqZen+Kp31yZ3Oqg52Cc6pnlJpdm4V2hJ1oqmqBuGZcqXCBnGGVjF6ndnWJin+eaJp1h5OSmI5/nm6ZkGummVyofne7an2pWo6EXbNnXG1xeHdraVtwaXh4Yl5lV2JBUERPN1ZCUm00SlpaX05aREAxNTE7OzdIPzpDSFU/WFJZXT5EYl1WYFFhZH1pRUI5TlteWWRmWGZnbm1iYmVfYWFfX2BgZWNeYmRvcV9kZWVrZGNpaGdraZWciaq2m6iJY5WcrLqysKydppubp5+drZqdsKernZeimaGfmZaWoKOZhomNaYiAcXuXiIuWloSSlZiPeoqElqOdiZWPhoudkZybiY+ooqCai5GKgIBpgYZ4f5aMe4iNjoeOlZp+k6GeoKKTmHJon4qgj4xwkoyCqYiZn6Opoah9sK2koriXdqOzoqN/iJR4nXqrmn6ijp2bl4iXcqF8hY2vtX1rmpGheH6YtKOjq6iEmHuafJyZfnOqWl1ve5eLeJ5iTH97e4VjephCTZ9ZompyfI5tgYmEmXWbeYeJsbN/f5qSpnR/nW1xfJRvmXJpo12VdkhlY2BzcHx9bmVga2h2e2JjYFFeVlxUVkBZRVFnRFJXW2JYX0lEPUI4QEI6SUU4TEVYQVZRW1ZERmFcWmBLYG1+ckVDPFVeYlplalZnaGxuYmZmXmFhXF1eYGhiX2VjdmxeZWdmbGRlbGhoa2mTnYGxrpmEU16hp7S6s7OpmqKLm6mcm6iSoaujoKeOnp2cmpmVmKGdloeHiXeFgW55lYWQmot9kZOWiHKAiZKgnHKRkIGImJSfmoSOqJyalYqLinyEbISFcYGhjHiFjYiHkpiUfJKjoJ6jiK6GfbWEj56de6aWeqmClp2Qi6Gefadod21+mXOgc3F8nYWYb5OCrn2jg6aemoGjcF6pZ3WjY2+lYZzTj3x6mXhyc2OihY9+onKijnVrj7OLYIKYinOqsqe8f3eDbX+/pqq0XptvfnGXb4FzonJdo2d0pmFopm2b05h6gptud3mXa5t6dpdybKmlZ19keXB+hGtnZmNtdndmX2FSW2VRUWFJV0lUX1dTW2VqW2VRRUNLTEpLQkpEOFBAUU5XU1hPUlFgZWVpUmR4eXdJRkVjXWVaaGpTaWhqb2NqZ2BiX1xdXV9oYmFoZXtkXmRnZGtkamxmaGxomJt/sKxUXEt+qa+ytbCzo5yYhZimoKCijaSon5eoiZmXmJOZk5Kgl42IhXtwfYRofY+Dk5qBeJGNjolwf4aPkpJsl5N8iZGSo5WDjqqalJKKhYl5hHaHgG6Bn4Z3gJKGiJmhlnmToqOaoImzoaK2i3qsp6SupXCpgJqQhYGckn2kgKKZhphxnoSirK6Jl4uAjKSNloOuopR2tba1yaF0lIqAn2Gel6lteJaGn5p1oYd3oH2QloqBb0xmopJwmohzpHt5dGGDgmx+oGxyZGCccn90l2l7abO1tMamc5h+e51qm5qrdIKabXN3l2maeXSYcVBFfLNeanVqeIdmamdidHRwbVVdU1loUFJoSVVMWFJWXWdrblZnV01KQUpNSkhKTkFRSlBlY2ltZXRyc354e251iXt7VFFPbF5oW2tpUmpoaWxnbGZjZV9cXFxeaWJkaGt7X11kZ2NqZm5tZWlsZaKcia+nhWY/lKGzq6+vtaKikICXqKKho4ukpp2cpYGal5aNl5CQm5KNiIN5anmGZYOMfpageXWPiIyBaYSFkoOMhZ2NeoyKlaWSgpepl4yRi4CJeoB9i3lwkKGGeYCUh4mWn5R/lKWnnJaWhGdueJxsomR8caV3nJhwZ6eBl4x7pXqgloOWcp92gImUlo+5bpCKomJ9maKViG5yaaprdaBsbqZgm2mLkGiWh5qVdaKAfZpfi4WMdW+IYmihZZ5/aZt1cGRmiIJucqJaX1tkoW5eiYxve39zcmSlbniiZGenaJhyi5huoW9SiI9voF5kp1SLXVOYbW1yanGBbHBoa3hza29RV1ZWZllTbUlYT1xIWGloc2pZa1ZRUkVWXExYUmFVaGped3V6fHB8fHKCe39ydo2Ag3ZeUXNhZ2JwZ1BqaGhrbG5nZGdfXV1dYGpiaml2dV1cY2hjamlybGZrbWOdpZimemV0bYunrqWqsLGmn4uAlqqcnqSMoaGaoaGAlZiTjZqPi5eQjYp7hnGAiGiLi3yXmnN1iX2Qe2WDh5WKipWZgnyIhpamkIGiq5CFkIqBin2AgI5zaY+lhH2Fk42ImJ+Nh5Kqpp6JpniWnH6liZaMspiekIOvl5+leJaIeql0pY+Emm6looyShIyDvG58pa+ChoWGk5acoH2menGolKCWZ55+b6tiloqVkneobKmigYl2h4J3q5GmiGuRsGt2s4ypbIuGbm2fnpKVYX6ri6p2gH+Np593n32FpJWdoGmah3WrZp6tjLZzd76MpJNZg6aNq2F1cXNve3RwYmp+bmhsUlVaVWBhXWtNXVJdSV1sbXZgW3FZW2BaZ3Nlbm9yY3F0YHd6fnlyeYNzg36Be3uMgYKAdmJ4ZGNuc2RSbGdob2xyaWZpYV9eXGFqYmxsem9cXGJpYm1pd21nbG5ilaaqnIGAnqSWqaqeqKeuo5mJgpeqmZ2jiZqlnKidhIuaj4WckYWSjYuNdIV6iINvjYR9lpN0dYZykYNtf4uSh4aTj317gYWXpY1/paWNgI2JhJR1g4eSb2yKqICCi5SOiZyeiYyTqqOgkIB1lZeIfoF5lK6jf4GbcY+GeJCMhYB7cqeMcX19epeWm4SOeHt+fYiUlZOKdpCZn6GEe32Ja4yFW3l5cnlwaG59kYlxf3SBj5STcYWDgWWNf1+BgIx3dXOUdW96b26HbYSGX3doeI5mgYKGjqqcfnR9l2qJiG9/dXyEdW1sZoxzeHuXd4Rbalh4j2htd3Fwb3d3b11shm1pZ1ZZX1dcZGtkVWFVXlFfcHd5a2p3ZWpqanV8cXF0c2FvdWJze4F4dXmCdX+Af4B4i4WCfXtuf2xkeW5eV25naHVreGppaWRcYFpjaWVscHVuWltia2Rra3ltaGxvYY6Vuqmni6GimqakmaSdq6Kgg4OXq5GdoImappqomIKBm4t+lpSHjomIjXKCfI99fo+EepeOdHOEcJWFe32Si4aGkIV4foCGmaOMe6ehi4WPj4SVgoaOl3dyhKmFjZKckIienoeLmqegoKuDiY6Vmn5+iZatqI+Sp5B4cJ6Rg3uTb36phXB9lXFqb3yBn4t/ko6MaG1dg4uMnJufjnOVi4hxdGuCdnN/WHJuho+BfX6LaV1pY3qFg4iAX2l4e5t8g4yDdoGGg2l5i4drYXFzg3dgc4yCiZCnlYZmjY+DbnaLg2+EjHhuZGZjeYJ6lVpcaWZudlt6eXd0bXNygmZcbYpra2JZWV1aWGtxW15gWV5dZnN9e3NvdGNqaml7fHF6d3RkbXRobHx+dXl8e3p5f4B/b4aKhHt9dH55cn9oVFxxaWx2cHVna2dkXWFZamhranFybVdbZW5sZ3N5bmhqbWCMjKuxopCjoZqfnpiemamjoX2Dl6uMn5SHm6KQpJR/e5eEfJKZiImGhopyfYCLdoWLgYSWinJvgHKYhoR+koOEhoqBeoCDipufj4KmoId4jZeIlYuLnJeFg3qsgZCXmZSKnp2HiKGqn6Kio4yIk5uco5mWqqGnpqCSm4iXj3x4j46EqH5/kpGSk5ywpZqUnZCOspOYhKaMjJWboImQm4KIkYprfI52d2WChpCKfImdhIeLj4eIgISDkHd8enWaoomHi5+LhpV/foyBgHZxdIaFgHiIh4qRppGEho6Ig42QjHyGioeOgHVrgYN7eZlpcmhgc4pwfXp2dW93dIFcXm+HaG5fXlpbXFNncVVjW1thbGh0e3xybnBjamlof3tteH5xaG9wbGaAe3KBgHeAfX+Ee22CjIV8enh8fXqDeE5kdmpzbnB7ZWtlYmJgW3NmcGZycWxVXWx0bWl5enBnaWtljYidup+WoqGYlZmYlJikoJ17f5mqjZ2NhZ+cip2WfHiUgnuOmYmGg4SGbXiBgHKAh32Ik4Rta356l4aEg5B+gIaEhn2Hg42bnZKHqp6CcYqPhZKRi5yRfY16qYONkpeVjpuWhoabpqCimp2Gg5KZmZiQmqafpp2dkJeBkot3fYiOhaV7fI6QkYaYqaGck5yPjaqOkoCejYiTmp+Dj5d+ho6Cb3iFcXRgfoOPhXSLl4CDjoKGhH6FhJRueXV1k6KLjYabhYWOdICKfX1yc3uJhHt5jI6Ek6ePhoSPgoOKiYl1hIeIintuan1/e21oa2xnXnl+Z3x7dnN1dXp2XGBwfW10YGJaXF5RZm1TZVpdYWtpdXl+cGtsY2tqZ4B/a3KAbGt0bnhuhHluhoB2goB9hXZxgo2HfXt6fH97gotgaXtrdWhpg2VqY2BpW2N1aG9idW1sVGJxeWRwenpyZWptbYuKn7iaoaSfk5KWl4uan56denedpZCbiYaklIqYmXh6jYV8iZGDjIKBgm18f3hygIV9ipB9a2h9gZeIgYiOfH6GhId8j4CPm5uRiKecf3CLiouShqChioWMfKeRh4+Sl5OWkneNo6ChnZaaf4GQmZiTjJqioaOal5Gbf46FeYCEj4ehgH6MjI98l6SgoJKZkI+mjZCBm5GJk5ibfpKSfoeOgXV0gnB2YH2AjYVxipV8h4txjH6ChYWOaHhyeYyZkpCAmH6Ii3KCh3x9cXp8jIV6e5KNg5alk4uGkXyFhoeEdYGChod5ZHF6fnh5cGxqZl59cmh7dXVzfHN/al5gc3Zwd2RjWV5eUmpoVGRYXmFnanZ4gXFma2NsaGV/gGptfWducGp9d4V6a4uBcoGBfYF0doKNhn58en+BfX+PanKDbnNpYYhpbGJfcVV0b21uYHhobVdqdHZidXp7cWJrb3qJjZ+zkqWlnY6QmI+GnaCanHx1o6CNln+MooqImpZ4e4aHfoOJfoiCgH9wf3t0dYKFfomQeGdjfYaXioKKjXh9gIyDeZaAlZeVjZafmn1vi4GQk4alm4eMiYOllYSSipWXkpF2kZ2hoZiUmHp/jpiWjpaanKSemZOUm3qQhoN4hZeNnn6Bio2Mc5einaCSmI6PooyMg5eYg5OWmn+YjXyIjYF2cX1temSAfIqFcIaSf5CCa4eCgX+JhGV1b3yHk5iNfZR4jIl8gId9fHKAeIqHeYWRiouYopaChIx3iISCgXZ6gIiEdF93d3xzfXdma2RgfmlqdnJzdH1we2NjYHNtdXJtYVlgXltsZFJiV19gaGt1eYZwY2pjbGZofINraHRobG9of3yBeG2PhnGAgoJ/dHyDjIF/fnqCg358kG11iXR0bWWKbGphY3VWg2lxbmB4ZmxianZwZnl7eXFgcmyGhZCdrpimqJ6OjZeHhp+Tl5h8d6mciph5l5yLi5iPeHuAi318g3uAgoB4c3h6c32AhH+IioBkXn2LlYd+hId0fX6Kf32YhJaUloyioJd+cod7k5GKpo+MjoqSoJGDkY+Ul5GKgY+YoJqSkJJ0gI2Rk4mcnZ6mmJiNlZd0jo+KbIaYkJl6h4iQiW+XnZmik5SKjJ+MhoKSnH+TkpWHmYh7iYmBenF5anVse32LfW2FkYKTd2+Bg31+i4Bkcmp8gZeYhX+OdJGJg3mHfnZ4gX6HgX2EjoWNlKSQeYWDdImHfX9ydH+GgmxgenR5cHtvYW5iZHthbm51cnd3c3Nhdl9ua3Vub11bXl1eal1PXVdiYWhtc3qJa19qZWpjaHeHbWVsaGlsZ4B8endvj4dzgIOEfXSBhol6gn16gYR9fY5yeYt5eG5sh2toX2lxY4docW9ldmdtbGF6aGp8enhwYXdti4GZmqqgpKmdioqRhoqeipWXfXatmIyWfZ6TkZaUiHZ9e4p8e4B2d3+AcHRzem+FfYGAiX58YVx+j5GGf4OEc3qAhnqPkYeRkZuSpJuUgX2AfI2KkqSIjYqNl5qNhZGYk5WOiYmMk52TkIyNboSQjpGInpmhoJeWiZaSb4qahWeGmo+UeomFkIpwlpqToZKSiIuZjIKAkZ59ko+TjJmOe4mEh3RzdWtxbnV7inRuhpCNkXF0gHuBgoh8ZXFteX6alH2FiXSRi4F0iXlvgX+Bh32FjYqFjZaojXuIfX6LhXd9cG5/hIJiZ3dzdG56Yl5vYGp0XnBpenh4bHJwZXhdbWxzbXNYWl5fYWpaT1dYZGNncXF/h2VdaWhmYmdxjW5kaWdkaWiAend1b46Ec4CBgnt1goiFeIR8d4OFeoCJd3+LfHtyeYNqa19waHR/a3FubXFnb2xle2Jtf3l2cWx3d4p/opiiqKGnm4eMioGPnIaTnHSAqpSRjIagjJWTkH9ze3aEd3h/cnN7hWtyb3ltiXaAgIZucFtZfpGNiICAgHZ1gH9/oIaPipGcl6CTlneJfoCMiJydiY+GkpeWhIiUmY+Wi4uNjo2dio6QhG6Ji4+RipyWoJuYlYWYiGuGpINnhp2KkX+LhIuBd5OYkZ2RkIiJlY5/fo+YfJGNj42akn2Kf4Jvdm9rbW9weoVpc4OOl4lwd4B0goiCeWZ0b3aCmo98iYV6lZJ6d4l0cIp8h417i4eEiY+co4h8hHeCi4B4eG5pf4F/XHFycW9vd1pecGBval5vaXx5cG1tam12YHBvanFtWVhhYWJtV1FTWWVmY3VwhIJiXWttZGJma5JtYGZmX2drgXVxcnCLgHR/goB4doCLgHmFf3eHhnaDhXyHjIB7dop/anFjfGKGfG9wbHRqaG9sdndfcX55e3R1dH+CfqWVmq2fp5aFjYN/l5WDj550ip+TkoWKmoyVjot6cnd0gnByhXNxdYhsb211bYh3g31/bW5VUYGrlIeCeIB2coJ5gqCBkYGTkpibkZl4kXqCjJKkmpOOiJWYkoOGlpmMk4uJj4+InoWQin1zi4WIj4icmZ6blpSAlH9php2IaIehiJKEkYOJcYORl46ajo+Mi4+Nd3uSkHqOi42Rlo18iHyAa3ZqbWtrbHp+YXl9jpWBdnqBd4OMfHlndWx1h5aMf4iGe5SRcXqFcHiNe4uNe4l+g42Rnp6FfH14got9dnBoa4CBd152b21rcHJVXW5icWBfbW15cGdwZmdzdWhwa2F3ZV1WZWBgclNQTltmZF14cIh8XlxocmJiZWaRaV9nZFpocH5va3Fzin12fYWAdHV/jHl7hoB4iINzhoV+jIyDe3mVeGZyaoNgh35vb2t6YGltdH90X3R8eIZ4c3KFfHmhkJqxnKaOg4p/g5qIgIudfoqZko6EiJeNjo6EdnN2c4Bwb4VzcHGDb2ppdm2Cbn18bXRzUk6C38mS1pN8cHSDdYOggpJ3lJCYm4+Ye5NyhZCfoZOTkIqSm5OFfpaViI2NiJGNiJyAjoF4eox+iIyJm5ucmpWTeY13aIqSiGyJpIWSiJeDhmOMkZiOlImWi42Ki3F7lIl7jYiKk5GJeoV7fmx7ZXJvamt5eVuAeY+NgHp9fn+Gjnp6aHRrdIuQioKGhX2WjGx+f2+BjX+NiH6EeoOQlpqbi3x3eIOPeHJsZXB/gmtodG9naHNsU15uZHBZX2tweGZramJmeHNvcGNfd2BgVmtfXXZPTUtgZmNdeXGKdFxbZXVgYWVljmNhZmFYaXNzbmtxdot8dHmGgXV2fotzf4Z/e4l/comHgZGKiHx+mHZlc258ZYh/b3BrgFlrbnl5c2B2enuNdnJ3ind5n4ybr5ugkIKFd4iVfnyJnIeEn5COhYyXhJOOh4F1d3B5cW6Eb21ufnJkZHhwfG16fGpobGOkmsHcru+hc2t1g3WEoYWRbpWPlJ+Um4GRcIWLo5eJjpWKkJ2VgoCVkIWJj4CSioqXf4d7dX+JeIaEjZual5mOkHaLd2+Iiox9i6SFkomdhYZei5SXio6IjouKhIlse5eCfYiFiZGPhnaFfX1rfWN4dWlteHNXiHqRhoR5fn+AhYx+eWZ0aoCKj4qDg4CMl4ZrgXZuiZKDkYV/gnqAkZaUmZB0dHiHjXVzcGZ0eYFhc2xvYWh1ZlJgcGdrVV5tc3lgcmNfaH1xcm1aYnJhYlduWlx3TU1MY2ZhXnZzim1bXGR4XmBkZoRfY2NeWGpya25rcneLfXN3hIF4d3yIcYOEfX6Ie3SLiIiVhox+fpdzaHVxeWyMe250cIFYcHp2eXFkd3mGjGl2gIlygJ2Imaico5KEfXCMlHh5ip2DhKCNjnyVjH+Zh4R7c3dwc2pvgWtpbHx0XmB4dntwdHpnYGV869q1ycPciHNsc4B2ipqIjWmXj46clJKBiHCFiKCOhIuVioyYk3yNkoiDiY97kYuGkIJ/dniDhHKHgpKblpOYhox2h39whoOKh5qig5SMnoOJYYOVjoaJhYmMh4CHaX2Uf32DhImOjYJxhn5/cXdndnJpc3drWox9koGEfH+DgISKgnZidGyJgpCLgn9/k5F9boJseYeQh5OFfYF+gZKUkZeJbnJ6jIZ1bHBqcXd/XnNoblxqdWBSZHFoZlNfb3Z0X29gXWiCcXJpV2doY2lYbVdbdUxKS2VmXmJyc4VoW1xleV5eZGd6YWRfXFlrbmVuanR3in5zc4F+enZ6h3OFgnx/h3d2ioWPmIGNgnuTdmx3dXl5k3VueHp9WHmGcYBvZ3h3koJkdoaFcYqWhZmhm6KKhnNvkotydo6bfYmZiIl7n3+DmX+BeXJzbm9kcn5pZmx3d1tfeHp6cXF/aWFnYX/Vto6QpnhucXd7cZKQjIdqmI2Im5GLhntoh4uZhoGSkYaHl418jYyAgImNfJCMfoqFenV7gnpxhYCUmI6Sk4GJdYSHd4SAi5Sdn4aWj59/iGF/k4eEh4OJjX9/gmZ9kX9+f4KMj5B+bYJ8gnRrbXZ0c3Z1a2ONgY5/hH58hH+EiH9wYHNxhnyPjYJ8f5KJenGDZnuEi4eNhHyFfoGVj5GThG5weYx+dW1uaWp5fGFnaWlYa3VaUmlyaWJQYnJ4bGFlXVpqg21zYltnX2RsX25UWm9OSE5mZFxnbnGAa1pbY3JfXGNsd2RlXVxabGtibWpzdoZ/cW9/fHx0eIV4hYJ8gIh1eYmBkpV8iIZ2iIFweHl7hJNvbXuBd16Df3SBbWl6c5RzZ3KIfXKSkYSan5ughod2dpR/bXaTl32HkIOKjZl8i5p2fndxb2xqYXR8Z2JpdXpaX3h8eW1xfmVjaGhXnY9ecXKWvMSEdXGUiJB+cpaLhpuSjIdyaoiPloB7lIyBhJuMfIqGfHuJjH+UiHWKhnZ2fYFxdYWBnZOFlI+Dg3GAiHWFfIqZnZiHlI6dgIhmfZOCf4WDiYlxgX1mfot7eX5/h4uPfWmAfIN2Zm94eHN2c2xqjYWKgYl/eIGAhYN/a19yeXt+jYqGfIKPgX5ygWl5hIiMhoV5hH2BmI2QjH1ubXuJfXd0bmdme3ViW3BiV25yU1Nuc2hhTWZ0eGVgXVxYboBvc1llYV5qbWBwT1lrUURTZ2Baa25tfG5ZW15sY1pib3dkZltdYGxpY2xpc3aBg3Fufnx/dHWDeoOCfIGFdn6IgZaQeIOKdIGIcnl4fo2Qb297gXFpgXh6fm1se3WVa2p3hHRslI6GnpigmYWIbn2Mdml4mI5+gIqClZeJeY6Wb3pzcGxqZGBzemhfZXF6WmByfXlncXphZWWPsbJ3SmJapNnQlnJ7kIqQd32UioSZkYyFbmuFkpF6eZKGgISYinyHf3h4iYqEloBwjIhxdH16aXmFg6SQhJOMg35vf4N3hHmGnJmVi5OQlIWIcHuSgn2Cg4iDboF3aICFeHJ/f4OKh3xlfX6EdWNwcn9oeHBvdZiMhYKKfHZ4gIR5gWtccX9zgYiFiX6GiXuJcoFucYWHj4WFc4R6gpmNjYR4bm9+hH92emRnaXtvXlh2WlhwbE5XcXNnYEpsdnRgXVtbWXR9cm9XZ11manBgb05XaFE/WWZeWm9qZ3pxWlpZa2VZY3F5X2hcXmVtaGVraXF3f4dvbH9+gHVvgnuAgX6Cf3aBhYiXinGCjXF7hnx5eYSTjHVqen9sb350f31vcnt7lG9ugX94ZpOLg6GZnJKChWeHg3BnepaIfX6EgZiJgXyNjGl4cmtsZl9hbnhtX2JveFxkbIN6YXF2X2Vl1Oq+ijI6PouOgHF4hYiOjXaDlox+ko2Mf21shY2Mdn2Pf4WBlYh8gnhudoeEg5d3boiFbHV7dGZ5goOmi4KPi4N9boB1d4R6h52RjJGSk4yLhn97koZ3f4SNg2t/cmiAfnhtfHuBioN3YnmEgXFkcWh+bXRxdIGbi4B+hX5zdX2Ac4FvW21/dXiLg4t7h4B8iHh6cWyJhJCEi3KCeoCXi4t/dG1rd4CAdXVcaGd2b1hWe1JZb2RMWnJyZVtJcHhvXFpaWV11fnRoWWJbZ2VuY2lNV2ZRPV5lXF11ZWB1cFpZVG9kWWRxeVpoXmBnbWdqa2lwd32ObGmChH55boB8fIF/gnp1goGNk4VwgItud36Ae3uIkol/aHt9anR7coZ7c3d9f4x5eIR9fGuMjYSbnZaMgIBsjX5raH6NjHp+f4OUgX59iohrdXFnaGJbYmdybmBha3NhaHCJemJzdF5jZJugj25cNVmvtXRpgIh8koZ1hZaFc4+KiXZwbIWDh3V5iXiJfJOHen5zZ3aJfn6Yb3GGfmh2eW1leYiEpIaAh42Jfm5+doCBfYyaiIKUkZiJi4SJfI+IcHt9hHtofmxqgHt6aXp2gYeAcmB3gX5xZHJmdYJtdXuElJGBfIF/bnd5fHR+bFhwgHd1jIKGeIh2gol6eHNuioGQgYZzf31/k4mIem5tam6CgnVuXGdkcnBRWnpNWm9cTltycGRVS3N4aVdZWVphcYB0YF1dYGZkaGllTlpoTkBhZFtgdWFddW1YV1N0YVpkb3JXal1haGtnbWxpcHd8kmxphIl8fHB+fnuBf4J6d4B/iYuDcXuHb3F3hH97iY2Pg2p+e213eHaKd314gIKHf4N+fnpthYyImKONhIN7dYt5a2yEiJB4fXuBkX9/foqDcHJxY2ZeWWZfb3BgYGdwZmpviXRhdG9bYWRqdnt/vpymo8i4cYWDcpJ8eIaTgnORjIdycm+De4N0dYd0iHeTiHl5cWN3h3qAk2lyhHZnd3VjanyCh52Bf3+Oj31yf3SFeoCSkYN5lo6Vj4iCiHuIiGt4eX51Z3pobH95c2l6doCDfWhgd4d9ampzZ3uAaXaAi5CUfnp9fnB7dnt0fmJWd31yc4qEgn2DcYeKd3hxcISCjX9+eX59do6Gg3ZpcWltiIJyb11nYXFtSmV1S11uVVNZc25iUU9zeGBSWFhcYW+Cc1thXGhlZWNrY1BbcElEY2FaY3BeXXdoVVZVd15bZW5oVmteYWpnZW9vaHB2epJuaYiMeH1ye355goGBfHZ9g4iFg3B3g3Jud4OCfYmLk39wgHt4eXqBjHSDeH+BgYKEeoB1b36Ki5ueiH2FeneGe2d0hYuQen5/e4iFg3aPgGdvbl9kXFhlWW1yYGBgcGxraIluYHNpWV5kbYB3qdqpx4aHsnGJd2+MdXuGjoB6k4l/dXR1fneAcHF/bYR0lIZ4dWtgeoJ5iI9mcoRwZ3ZuW218gJCTf4B5kZJ9eXttiHeBkoyEdJaKkY6HhYV7f4RsdXZ/bWd2ZW17dW1qd3Z/f3xgYniFeWh0dWJ9e2d0ho6MlXt0gHVxf3p8bX9ZVnR/cHWFh3+BeWyJhnR5bHWAhIR+e315e3OLgXxzZ3RlbouEbXNaaV50ZEdtbUxaYVdWVXhtYlBSdHZXUFVYXmFxhG9cYGNtZGReb2JUXXJHQmZfXWZoXVt7YlFVXHVbWmdrYVZqX2BuZWZrcWhwdXiOdGuOjXV+dnh9d4GDgXtzfYOIh4NvcX90cXV/hYGJjYp7d394g3t8hYd4h3x9gX6EgHt+c3Z5jI6gjYl6iXZ0g3lefYWYjHmGg3SFhoR3iXtibm1cYltbYVZpc2NgW2dub2aHcWFxZldcY2t/fMrOh7mham1timxxhHF8hIl+e5GFeXlzeXV1fGpsdWOEdZKCd29mXn2CeouJZnKCa2pxY1hteoWbiIGBc5eUd398bolygouMiHKYjpGJhYuDe3h9cXFwfWZocWJteHFqa3F4fXx6XGR5gHdpdXhlgnZndIeLjZR8cYdqbn2BeW58XVhyf250gYt8gm9vin9xdmh3f4GAgXd9cXt1h3x6cmZzYW6MgmtyV2pddltIbWpNVVReVFV7a2FPVHVyUFFUVl5idIVpXGBramZjWW5hWGJwR0FoXGBmXl1We11PVWRwWltqaF1XaGBfcmVqZ3JncHJ3hnhulYp0f3p3fniDh391cn+GhY2CcHB7eHd1eoaFhoyFenx/dIt+fYaEhId/fn59h398eHZ5eJGToH+MfIttdYB5Y4OGloVzkYpvhYWBeoN0Y25qWV9bXV1UZ3NlYFlkcXJmgXNia2VXW2Bpf3i+rnugt21ic4Zoc3txeYKFe32Mf3d4cnZve3Zlam5gh3WOgXNqYl5/eHmLhGdxfmhqa1pWb3eJo4GEf3GZk3GAeXWDboGDkohzlYiNiISJhX14dHJuaHlgam1gbXZqZ2preXd6dlpnfXx4ZXJ9bYR0ZXWFjIWVf2+LZmp6g3VtdWJccH1sdX2MfIFmdYd9bnFodX94fn9zfWx7e4F6eHFmbGJuiX5sbVZpX3ZVSmlqT1FOaE1ZfGhiTlV1akxQVFVeZnWDZl1gcGhnYVdpXVtraEpEalphZFdZVXlZTlZtalldbGVcWWVjXnRlbGRxZ3JvdYF4cJmFdn9+d398hYd9dXOCiICVgm5zeXt6c3OFhoiIg3iBfXWPfnyEio6EgoR7fouDe3d8d3eanZd6ioKGaXZ9fGyDhJJ/co+CcIWCfoF/b2ZsZ1ddW1xbVGRwZF9XYnJ1aXVwZWViV1xcaH9wb3KAc4lkZHh+aXN1c3KChHiAhHl3dHVta3pxYmdrZ4Z0jYNuZl1ffXB7iX5pbXhmaWRVV3JvjaZ8g3t2lpB0fHN9e258fJGGd5l8iIaDhoN9dHBybGd0XGxoXmx0ZGdmaXpve3JZZ4B2dGdwgHeBdWJ3hYp8lIBui2pteoFxZnNlYW56Z3N4inx+YnaDdmprcXV7cXp5dH1mfn9/eXduZGZiboV8bWpVaWFvUkpoak9LTnBHXntmYU1VdGNKTlNXYWp2fmVcZ3NpZWBWY1dicF1MS2tYY2FVVFVzVkxYdWRaX2thXFpjZV92Zm1icGlzbnJ/dXSagXd/gHd/f4aEenx1goR+l4VucnR8enRxhIWPgYB5i3V0kH98gZWOgIWEfX6Mhnt+gHZ7o6WKeYiGhGt1fHp1g4GLeW+Fc3mEfYGDdW5qaGVWXVtaWlNibmRbWGFze2lobWlgYldfW2qAaWtvgGdrYGh5eGpzc3RuhIF6f311dW56aGp5al9lbmiBdpCFZ2VYYndpfod7b2lwZ2ZdVVhvZ46od4F6fJCOeXVwf3BzdnqPgHiVdYaDgIWIdmpydmdobltsZF1tc19nYWp4aHttW22CcnNqb4B+eXdhd4SEd4+Ecohxb3l/cWNwaFxweGRxdIh8eWJzgHBnanl0cmx4d3Z4ZIN7f3h2cGRjY258fWtrVWhhZVNKa2dPR1FrRWB4Z2FNU3FcSk1UWWVrd3plX21xaWRdVmBWbm5XS1NoV2VeWE1Va1RKXHlfW19rXV1bY2VgeWhrYW9vdW5veHV6mH13gIF6gICHhXp4eYN+gZOEcXR0f3l2dISIkH2AfJBrc5WAe4KfhX6HfYB/hoKAint2hKyff3qIiINrcoF5dYB/gXRuhm58f3OJgGpvbWRkWF9aWVpVYmpnW1pedYJpXm1sXGFWXFxsgWVxdH1paVxrdnVndHdybIV7fX15dXJseWhpeGZdZXJoeneTgWNjVGVwZ4KFd3dmaGpgV1ZZZ2OPp25+d4CLjnpwcX1oem96jXx3j3KEfX9/hm5kdXNkaGhca2Jdb29bZ19tdWR6aF10gG9xa3F7fXV1YXSFinqHh4B/d3J1f3VhcG1acnRicXKFfHRlcoBsYWx7b2ppe3l2cmaFdnt6dXFkYWVtc35pbFRoXlxUS3JiUEZWYUdidmdhS1RvV0pMV1hna3Z6ZGVucWZjWlddWXZlVUpcY1dnWFlIV2VQSGJ4Wl1fbFteXGFjXn9pal9udHhub252g5d5coGAfH+Ii4V+dXWFeIeMfXN1dYJ5enqCi459foSJaXOWgXqKnX1+hXqBen98hohzcY+ujHt7h499ZXGHeXN8e3VyboZse35sj3picG9iZV1lVllZVmNma2BdXHOFaFhwblpeV1pcbHticHd2bWJabHNzZ3R1cGyEeX6AeXdubnRlaXRlW2d0ZnZ2knpfXVJlZmuDgnR9YmNpXFRYXWJjj6VoeHSChZB4bW96aHhufIV7dYlzgHh8eH9oZXZtYGZgXmpfXXNrWWVdb29iemVcd3trbm5vd3hzdGRyg5J+h4KIenZvcn1zYndkW29wYnFxgXxzZ3KAZF5udmlkZ3l7dW5vgnV0fXNxYl9mbm99ZGlTZ1hYVE13X1FKWVhIYnVkYUlUbVNKTFpWaWxye2JsbHNjYVlZW2F2W1NMY11YaVNXR1lgTkdpdVheYW1bW19iYl2FaGdhbnh5bG9qdoGQeG2CfoCBkoeDgXZ0iXSMhnNxd3WCd3x9foyPgH6TfnB3lYN8mZJ5gIB4eX5/dIiDc3CZont6f4mUeGR1iHhzd3Vrc25+bHl8cJFyXnBvYGdibFRbWldoY21mXFxxiWVTcm5bWlhYYGx2Y2l1amleWW1zcWxzc3NphXx+f3x2bm5sZGlxY1trcmR0do5zW1dTZWFygH9ygl1iY11TWmBbY5GeZXJxhYSRdGxrem1vcHt8fHGBd39zenp6ZGV1aF1iWmBnW152aFdiXXBoYXdgW3t2aWlybndzcnRocIGUgoZ+hHZyanB9bWZ3V1xrbmJxc4F6c2ZvfltgcHFhX2pxfmxsdX5zcXhrcGFcZWxsemFnU2ZUV1FPdVtRT1hRSGN0YmBGVWpQSVBaVWpra3xlbW5xYVtaWFlscFdTT2ZXV2hTVEZaXE5IcnRYX2NtY1hgYGJdi2pjZG15eGtvaXV5hntrg31/hJl8goR5fIdtj4Zxb3d6fXSCgnyKjoKCl3R3gpOFgZ+JdYCAgXN/gnGHgnVvopd0e4aLhntld4pubnpuZndwemtzdnKMa150bmFnZWtSXVtVZ2FsbFpccIxkT29uXVZYVWdqdGdidGVlXVludG1wdXV4aoZ8f3yIdo9zZGRrbmFcbm1jc3iHa1pUVmNkeH19cYVcY19jVFpgWWOVlWNucIOFinNqaHtvZnN3c3xsenR1b3p+dV5mcmNbXlZhZFlhdGVVX2BtZGFxXV1+b2hpc3FzcHR1am2EkoGIe4VxcmZufXByb1NbZmtmcXSAdnNjbHZVYnJrWl5vZn1mbXd9c3Nzam1gWmRqandeZlRkVFVQVG1XUVZTT0dkc19hRVhpTkhXVFZtaGR8aWt3a2JXXFVbdGRTUldoUVllVFNIWlpQTXh2Wl9lbGlZYmBeXo5uYWZseXVub2h2dn9/bIN/fYaXe3+HgYl+a5OIcmd0gHt1gIJ8iI5/i5NyfIqRhYefhnt/hoxzgYZzfYN2bqWMc4GNi3Z3bXqMYGR7cGZ5cnhsbXF2gmdke2xjZmdoU19eVWdfbG9bXm6NaE5pbWBUVlNvZ3NsZnhkZFxYcHRscXp4cmyIe392nHp5a2FlbG1eYG9qZXF5fmdaVlhgbHh8e3CDX2JeZ1dYX1dkm4hia3GBh313a2t4bVx3cWx7anZzbm97gHJYam5fWV1VYmNYZHFiU15haGJibFpgfWtma3N1bm13dmtohYt+iHqIbXFlcH1tcm1jWWFpaW90gXRzXmlsU2VxZFVibmJ6Y3F3e3ZrcG1qX1hhZ2h0XGVVYVVSTlhlUk9cT09IZHBdY0ZZaU1JX0tYbWRfeGhufWRgVF5UXXVcVFNgZk5dYVRTSlxZUFl1dV1fZW1oWGNhW16NcGNnandxc25ndnR6g3KBgnmHjX58iYeOeW6QinRsc4J0f3+HhIaRhJWPeX6Mj4eRm4SAfIyEcoCBc3R3cW6Tk5OTk5OTk5OTkpKSkpKSkpKSkpKSk5OTkpKSkpKSkpKSkpKSkZGRkJCPj4+Pj4+Ojo6Pj46OjY2Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2NjYyMjI2NjY2Njo6Ojo6OjY6OjY2Ojo6Oj4+Pjo2NjY2Oj4+Pj4+PjoKAfnp6fX5+fX1/fn59fn5+fn5+fn+Af4CAgIGAgIB/gIGBgYOHjI6Ojo6NjY2NjY2NjY2NjZKSkpOTkpKSkpKSkpKSkpGRkZGSkpKSkpKSkpKSkpKSkpKSkpGRkZCQkI+Pjo6Ojo6NjY6Ojo2NjY2Njo6Njo6OjY2NjY2Njo6Ojo6Ojo6NjYyMjY2MjIyNjY2Njo6Ojo6NjY2NjY2Njo6Ojo6OjY2NjY2Ojo6Ojo+Ogn99ent8fn59fX59fn5+fn5+fn5+f4B/gICAgICAgH+BgYCBg4aMjY6NjY2NjY2NjIyMjIyMkpKSkpKSkpKSkpKSkpKSkZKSkpKSk5KSkpKRkZGRkZKSkpGRkZGQkJCQj4+Ojo6OjY2NjY2Njo6Ojo6NjY2NjY2NjY6Ojo2Ojo6Ojo6Ojo2NjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Njo6Ojo2NjY2NjY2NjY6Ojo6Cf3x6fHx9fn19fn19fX59fn5+fn5+gH9/gICBgYGAf4CAgICDhouOjo2NjY2NjIyMjIyMjIySk5OTk5OTk5OSkpKSkZGSkpKSkpKSkpGRkZGRkZGRkJCQkJGRkZCQkJCPj46Pjo6Ojo6Ojo6Ojo6Ojo2MjYyMjYyOjo6Ojo6Ojo6Ojo6OjY2MjIyMjIyMjIyMjY2NjY2NjY2NjY2NjY2Njo6NjY2MjIyNjY2Njo6OjoN/fHp8e31+fH1+fXx9fn59fn5+fn5/f3+BgYGAgICAgYCAgIOGi42NjY2NjIyMjIyMjIyMjJA+LjExMTEvb4eEhISEiF0tMDAwMC1GoaGhoaGhoJqZmpqampqKg4SEhIOEd2VnZmZmaFxDREREREJOpa+tra2usWFARERERENYaGdnZ2dmb4SDg4ODg4OLjIyMjIyMjY2NjYyMjY2NjY2NjY2NjIyMjIyNjY2NjY2OhX19e3t6fX58fH59fX1+fX1+fn5+fn9/f4GBgYCAgICBgICAgoWKjI2MjIyMjIyMjIyMjIyMjy0aHR0dHBpohYKCgoKGUxgdHR0dGTekpKSkpKSjnJycnJycnImBgoKBgYJyXV9fX19hUjQ1NTU1M0GptrS0tLS4WTA1NTU1NE1hX19fX15qgoGBgYGAgYqLi4yMjIyMjIyMjIyMjIyMjY2NjY2MjIyMjIyMjY2NjY2GfH16e3p8fXt8fn19fX59fX5+fn5/f3+AgYCBgYGAgIGBgYGChYqNjYyMjIyMjIyMjIuLi4uRiYiIiIiIh46QkJCQkJCMh4eHh4eHiZKTkpKSkpKRkZGRkZGRj46Ojo2NjYuJiYmJiYmIhYaFhYWFho+QkJCQkJGJhYaGhoaFh4mIiIiIiImKioqKioqKi4uLi4uLi4uLjIyLi4yMjIyMjI2NjIyMjIyMjIyMjY2Njoh8f3l7ent8e319fX18fX19fX5+fn9/f4CBgYGBgYGAgYCAgYKFioyMjIyMjIyMjIuLi4uLi5GTk5OTk46RkpGJh46KkJKTkIqRj4yOhYqRkZGRkJCQkJCPj4+Pj4+Ojo6Njo6Ojo2Njo2Njo6Ojo6NjIuLjIyMjI6Ojo6Ojo6NjY2MjIyMjIuLi4uLiouLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyNjY2NiX59eHh5fH18fX19fHx9fX59fn5+f3+AgICBgYGBgYCBgIGCgoSKjIyMjIyMjIyLi4uLi4qLkJCRkZGPhI6QkIaKj4WNkJCOh4qIiI2IiZCQkJCQkJCQkI+Pj4+Ojo6NjY2NjYyMjIyMjIyMjIyMjIyMjIyMjI2NjIyMjIyMjIyMi4uLi4uLi4uLi4qKiouLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjI2Lfnx3dnh7fXx7fX18fH19fn5+fn5/f4CAgIGBgYGBgIGAgIGChIqMjIyMjIuLi4uLioqKioqQkJCQkIqFjoiOhoaPiY2QkI+GioWGj4mMj4+Pj4+Qj5CPj4+Ojo6OjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLi4uLi4qKioqKi4qKi4qKi4uKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIt+e3d2eHt8fHx9fX19fX1+fn5/fn9/f3+AgIGAgYGAgYCBgYGEiYyMi4uLi4uLioqKioqKipCQkJCPhYOMjpCOiYyJjZCQj4mHh4iMiI6Pj4+Pj4+Pj4+Pjo6OjY2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKioqKioqLi4uKioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMin18dnZ4fHx7fH19fH19fn5+fn5+fn9/f4CAgYCBgYGBgIGAgYSJi4yLi4uLi4qKiomJiYmJkJCQkJCMhoyJjoeFjYmOi4yLhoiHhoyIj4+Pjo+Pj4+Pjo6OjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKioqKioqKioqKi4uLioqKioqKioqLi4uLi4uLjIyMjIyMi4uMjIyKf353eHp7enp8fHx8fX1+fn5+fn9+fn9/gICAgICBgICAgYCBhIqMi4uLioqKioqJiYmJiYmPj4+Pj5CMjouPjIqPjI6MjY2JjoyLjYyOj46Ojo6Ojo6Ojo6NjYyMjIyLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLjIiAfXh5enp6e318e3t9fn5+fn5/f35+f39/gICBgICAgIGBgIGEiouLioqKioqJiYmJiYmIiI+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Ojo+Ojo6Ojo6Ojo6Ojo2NjYyMjIyLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLioqKi4uLh4B8eHp6eXt8fHt8fH1+fn5+fn9/fn9/f39/gIB/gYGAgIB/gYSJi4qKioqJiYmJiYmJiIiIj4+Pj4+Pj4+Pj46Pj4+Oj4+Ojo6Ojo6Ojo6OjY2NjY2NjY2MjIyMjIuLi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKiYmKioqKioqKioqKioqKioqKioqKi4uHgHt5eXh6fHx6e3t9fX5+fn5+f39+f39/f39/f3+BgYCAgH+BhIiLiomJiYmJiYmJiIiIiIiOjo6Ojo6Pj46MjI+Sj5COjo6Ojo6NjY2NjY2NjY2NjIyMjIyMjIuLi4uLioqKioqLi4uLi4uLi4uLi4uMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKiomKiomJiYqKioqKioqJiYmJioqKioqKioqKioqKioqKioqKi4aBe3h5eHp8ent7fH19fn5+fn5/f35/f39+fn9/f4CAgYCAgIGEiIqJiYmJiYmJiIiIiIeHh46Ojo6Ojo6Ojo+MkJOQkI+Ojo6NjY2NjY2NjYyMjIyMjIyMjIuLi4uLi4qKioqKioqKi4uLi4uLi4uLi4uLi4uMjIyLi4uLi4uLioqKioqKioqKiYmJiYmJiYmJiYmKioqKiomJiYmJiYmJiYqKioqKiomJioqKioqKhYB6eHl5fHt6ent8fH1+fn1+fn9/fX9/f35/f39/gICBgICAgYSIiomJiYiIiIiIiIeHh4eHjY2Ojo6Ojo6Pj4+PjoyNkI2NjY2NjY2MjIyMjIyMjIyMi4uLi4uLioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYmJiYmJiYmKioqJiYmJiYmJiYmJiYmKioqJiYmJiYmJioqFf3l6eXh7e3p7fHx7fn5+fX5+f39+f35/fn+Af3+AgICBgYCChIeKiYmIiIiIh4eHh4eHh4eNjY2Njo6Oi42Nj5WPiYyPjYyNjYyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYR+eXt5ent7eXt9fHt+fn59fn1+f35/fn9+f3+AgICAf4CAgICEh4mIiIiHh4eHh4eHh4aGhoyNjY2NjY+MjImKj42IjJGPjY2NjIyMjIyMjIyLi4uLi4uKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uKioqJiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJg355e3p8e3p7fX17fH9+fn5+fX5/fn9+f3+Af4CAgH+AgH9/f4OGiIiHh4eHh4aGhoaGhoaGjIyMjIyLiYyKiIeJhoyOjJCMjZGOjIyMi4uLi4uLi4uLi4qKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiImJiYmJiYmJiYmJiYmJiYmJiYmIiImJiYmJiYmJiYmJiYiIiIiIiYmCf3h7e3t6enx9fHx9f39+fn19fn9/f39/f4F/gIB/gICAgICAg4aIh4eHhoaGhoaGhoaGhoWMjIyMi4yOjoyKioeEiIuKjIuNjo+Li4uLi4uLi4uLi4uLioqKiomJiYmKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiomJiYmJiYiIiIiIiIiIiImJiYmJiYmJiYmJiIiIiIiIiYmIiIiIiIiIiIiIiIiIiIJ/eHp7enp6e3x8fX1+f35+fX1+f39/fn+AgICAf3+Af4CAgYCDhYiHh4aGhoaGhoaFhYWFhYyMjI2NjJCSjI2Ii4mJi4uLi4mLjIqMi4uLi4uLioqLi4qKiomJiYmJiYmJiYqKioqKioqKioqKioqKioqKioqKioqKiYqJioqJiYmJiYmIiIiIiIiIiIiIiImJiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIiIiIiIiIiHgXx4e3x5enp8fHx9fX9/fn59fX9/f39+fn+Af4B/f3+Af4CAgIKEh4eGhoaGhYWFhYWFhYWFjIyNkY+PjZGJjIaJjIuIiImMiYeNjo+NioqKioqKioqKiomJiYmJiYmJiYmJioqKioqKioqKioqKioqJioqKioqKiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4WAenl9e3t7enx8fHx9f39+fn19f39/f35+f4B/gH9/f4B/gH+AgoSHhoaGhYWFhYWFhYWFhISLi46PjoyLj4iHiYmMjYWFjo2KiYyNi46KioqKiomJiYmJiYmJiYmJiYmJiYmJiYmKioqKioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHhoaHh4eHhH55eX16enp7fXt8fX5+f35+fX5/f39/fX5/f3+Af39/f39/f4CChIaFhoWFhYWFhYWFhISEhIuLjI6MjI2Lh4mIiomGgoiNjoiKi5GTj4uJiYmJiYmJiYmJiYmIiYmJiYmJiYmJiYmKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIeHh4eHh4eIiIiIiIiIiIiIh4eHh4eHhoaGh4aGhoaGhoaGh4eDfXp5e3p5enx8e31+fn5/fn59fn9/fn9+fn+AgICAf35/f39/gIKEhoWFhYWFhISEhISEhISEioqOjYmIiIqKh4iHiomIioiIh4qGi5GPiomJiYmJiYiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHh4iIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGh4J8eXl6eXp7e3t7fX5+fn5+fn59gH9/f39/f4CAgH9/fn9/gICAgoSGhYWFhISEhISEhISEhISKi5CPiYmJi4qHh4WHiYuKiYSLjYmOjYqJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiIiIiImJiYmJiYiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGgXt4enp4e3x7e3x+fn9+fn5+fX1/f39/f3+Af4B/f39/f3+Af4CChIaFhYSEhISEhISEhISEhI+Qj4+IiYuIhoeIiYuLjIuJioqNio6Oj4iJiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoaAe3h5eXh4enp8fX1+f35+fn59fn9/f39/gIB/gICAf39/gIB/gYKDhoiGiIaDhISEhIODg4ODkpKOioeKi4qLh4uNiYqJi4iHiouIio+SioiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhn96eXh4eHl5eXx9fn5/fn5/fn1+f35/f3+Af39/f4CAgH+AgH+BgoOHjo+PjoiHhIWFhoaFhYWSkI6KiYmIiImKioiIh4aKjIiHiYmOkJGNh4iIiIiIiIiIiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4aGh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWGf3l4d3d3eXp5e3x9fn9+f35+fn5+f35+fn+Af4CAgICAf3+Af4GBg4eOjo6Ojo6Mjo2OjY2MjZCQjomHhoiJiYeIiouIiYyJiYaKjY6PkYuIiIiIiIeHh4eIiIiIiIiHh4eHh4iIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhYZ+eXd5d3d6eXl8e31/fn5/fn5+fn5+fn9+f4B/fn+Af39/f39+gIGEiI6Ojo6Ojo6Ojo6Ojo2NkJGOi42JjIiIiYaHiYaIioiHi4yLjpCQiIeIiYmJiIeHh4iIiYmIh4eHh4iIiYiIiIiIh4iIiIiHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhoaFhYaGhoWGhYSEhIWFhoaFhIWFhX55d3l2eHl4e3x7fn5+fn5+fn5+fn5+f39+f39+f39/f35/f3+AgYOGjY2Ojo6OjY6NjY6OjY2Qj42Ni46KhoiKhISLiYeDhYSDi4mLj42JjI6QkI+NjYyLjY6Pj42NjI2Nj4+Pjo6MjYyMjY2KiYiHiImHh4aHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoeHiYqKiIeJi4yNjo2LiImLi42OjYyJiImMgHl3d3Z6eXh7e3t9fn5+fn5+fn5+fn5/f39+fn5/f4B/f4B/f4CBg4aMjY2NjY2NjY2Qj4+Pj46NjI6KiYuMjIeFiY2Lh4aIh4aHh4uNjo6Pj4+Pjo+Pj4+Pj4+Pj4+Pj4+Ojo+Pj4+Pj4+Pj4+Oj46Oj46Mi4uJh4eHh4aIhoaGhoaGhoaGhoeLiYeHiIiLjY2Mi4yLjY2Ojo+Ojo6Pj46Ojo6Ojo6Ojo6Njo6NjY2AeHZ4eHp4enx6fH5+fn5+fn5+fn5+f39/fn59fn9/f39/gH9/gIGDhoyMjIyMjY+QkpOTk5KSjYyMjIqHioyKh4eJiYWCiouIiYWJjpCNjo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjI2NjI2LiYaHh4eHiYqLjY6NjYyNjY6OjY2OjY2NjY2NjY2NjY2NjY2OjIyNj4+OjY2MjIyLi313dXd5enp7e3p+fn5+fn5+f35+fn5/f39+fn1+f39/gICAf3+AgYOFj5KRkJGSk5OTk5OTkpKLi4uLiomMiouLiYuKhoeOjYiIjI6OjIuMjIyNj46Njo6Ojo2NjY2MjY2NjIyMjIyMjIyMjY2NjYyMjI2NjYyMjI2NjIyNjIyMi4yMi4yMjI2MjIyMjIyMjIyMjIyLi4uLi4yNjY6Sk5OSkpSRkJOVlZSTk5COjo6Oe3Z2d3h6ent7e31+fn5+fn5/fn5+fn5/f35+fn9/f39/gIB/f4CBgoSNkpKTkpOSkpOTkZKSkoqJioyJi4qJjIuKioiHiYqKi4mKjY2Mj46Nj5KUlJOUlJOTkpGSkI+Ojo2NjY2Pko+OkZGOjIuKioqLi4qKi5CPjoyMjIqKioqKioqKiouKioqKi4yLi4uMjIyKiouLi46RkpOTk5SUk5STk5SUlJOTk5KSkpKSk5F6dXZ2eHt7e3p6fX5+fn5+fn5+fn5+fX5/fn5+f35/f3+Af39/gIGChIuRkZGRkZKSkpGRkpGRiYmIiIqMiYiJiYuJhoSJhoyKh4ySkpKTk5OUlZWWlZWUk5OUlJSUk5SUlJSVlZWVlZWUlJOTkY+QkZKQjoyRlZWVk5KSjo+QjYqKi4qKi42OjY6RkpCRkpKSkpGRkpKSk5OTk5OTk5OTk5OTkpOSkpKSkpKSkpKSj3h1d3l6e3t7ent9fX19fn5/f35+fX5+fn5+f39/f39/f4B/f3+AgYKEi5GQkJCSkpKRkZGRkZGIiIiIi4uJg4eLi4yMiIeHjYyNkpSSkpOTlJWWlpaVlZSSkpOTlJSUlJWVlZaXlpaWlpWUk5SUlJSVlJSUk5OVlZWUk5KTk5OTkJGSkZGSk5OTk5KSkpOSkpKSkpKSkpKSkpKSk5OTk5SUk5OSkpOTkpKSkpGRkZGPdnJ3enp7e3t8fX59fX1+fn9+fn9+fn5+fn6Af39/f3+Af3+Af4CBgoSKkJCRkZGRkZCQkJCQkIeHh4eIiIiFi4+KjI6Njo+OkJWUk5OTk5SUlZWVlJSVk5KSk5KTlZSUlZaWlpaWlpaWlpSTk5OTk5OUlJOSk5SVlZSTkpKSkpOTk5OTk5OTk5KSkpKSkpKSkpGSkpGRkZGRkZKTlJSUlJSTkpGRkZGRkZGRkZGRkYx0c3d6ent7e3x9fX1+fX5+f35+fn5+fn5+fn9/f39/fn9/f39/f4GDhIqQkJGRkJCQj4+Pj4+Ph4iKi4yNjYuOj42Mjo6RkpGSk5OSkpKSk5SUlJKSk5OTk5OSkpOUk5OTk5WVlZWUlZWUk5OTk5KSk5OUk5KTlJSUk5KSkpKSk5OTkpKSkpKRkZKSkpKSkpKSkpKSkZKRkZGSkpOTlJSUk5OSkZGRkZGQkJCQkZCRinN0dnp8fHp7fXx9fn59f35/f35+fn9+f31+f39+fn59f39/gH+AgYKDipCQkZGQj5CPjo+Pjo+Oj4+Pj4+Pj4+PkI2OjpCRkpKSkpKRkpKTk5OTkpGSkpKRkZKSk5OSk5OSk5STk5OTlJOSk5OTk5OTk5OSk5OTkpKSkpKSkpKSkpGRkZGSkZCRkZGRkpKRkZGRkpGRkZGRkpKSkpKSkpKSkpKRkJCQkJCQkJCQkJGGc3V2e3x8e3x9fX1+fn1/f35/fn5/gH9+fX5/fX5/fn5/f3+Af3+BgYGKkI+PkI+Pj4+Pj4+Pj4+Oj46Oj4+Pj5CQiI2PkJGRkpKSkpOTk5OTkpKSk5KSkZGRkZKSk5KTkpGRkpKSkZKSkpKSkpKTk5KRkZKTkpGRkpKSkpKRkJCQkJGRkZGQkJGSkZGRkZGSkZGRkZGRkZGSkpKSkpKSkZCRkZCPj4+Pj4+Pj4+PkX9ydHh8fHx7fHx9fX5+fn9+fn5/f3+AgH99fn5+f39+f39/f4CAf4GBgYqPj4+Pjo6Ojo+Pj46Ojo6Ojo+PkI+Pj4+GjpCQkJCRkZGRkZGRkZGQkJCQkZGRkZGRkZGRkZGQkJCRkZCQkJGRkZGRkZGRkJCQkZGQkJGRkZGRkI+PkJCQkJGRkJCQkJCRkJCQkJCQkZCQkJCQkJCQkZCQkJCPj4+Pjo+Pj46Ojo+Pj4+PeHJ2eXx9fHp9fH19fn5+f35+f39/f4CAf39/fn5/f35/f39/gIB/gYGAio6Ojo6NjY2Ojo6Ojo6NjY2Oj4+Pj4+PjoiQkZCPj4+QkJCQkJCQkI+PkJCQj4+Pj5CQkJCQkJCPj4+PkI+PkJCQkJCQj4+Oj4+QkI+PkJCQkJCPjo+QkJCPj4+Pj4+PkJCQkI+PkI+Qj4+PkI+PkJCQkI+OkI+Pj46OjoyMjY2NjIqDiYhzc3Z4fX58eX18fX1+fn5/fX5/fn9/f39/f4B/f39/f4CAgH+AgH+BgYCJjY2Ojo6Ojo6OjY2OjoyNjY6Ojo6Ojo2NiJCRkI6Njo6Ojo6Ojo6Pjo6Ojo6Ojo6Pjo6Ojo6Ojo6OjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Pj46Oj4+Pj4+Pj4+Pjo+PjY2MjYyNjoyLi4mJiYiFhYSDgoKEgnR5fXp4dXJrZWltb2xmZmdncHNzd3l9fnl6e3x9fX1+fn59fn9/fn9/f39/gIB/f3+AgIGAgIB/f4CBgImNjY2NjY2MjYyMjIyMi4uLjYyMjIyMjIyGj5GRjIyMjIyMjIyMjIyMjIyMjIyNjY2MjIyMjYyMjY2MjIyNjY2NjYyMjI2MiomKi4uJh4KAh4iEgXt6gH57fXx8fXlzcnJycnV1cG1ramppZ2NkYV9bXF1eWFVXWFlTS0VJSkpLTE1PT0tgdHR3eX19eHp5e3x8fX5+fn1+f39+f35/f4CAgH+AgICBgYCAgICAgIGAf4OEhYSFiIuLjYyMjIuLi4yGiYqKioqKh4OOkJGNiouLi4uMiYmKioqKiouLi4eDi4qIiYmGhYWEhIeJiYWCg397fHl6e3pzcHFxcW1samdsbWdlZmVmZGNlZGVkZWVlZWRkZGNhYV5dXFpYWFdUUFFSU1JTTU1KSUZESEpHR0hHR0xOSWdzdXh5fXp4d3l8fHx8fn5+fn9/fn9/f39+f4CAgIB/gICBgICAgICBgYFnXmBjYWNucX17ent/fXd8fHZ4ent4eHpvcHt4eXt8e3h3e394dXd0dHZ0dXZ3dXFycW5wcnBnaGtsbm9tamlpaGhlZWRkZF9gYWJgYF5dWVhaWltdXV9gX2BfX19gYmFeXl5eWVldXF1bV1dWUlRSU1NOUUpISUZERUhMTEhGR0lLSklNbXJ0eHp7end3eXt6e3x+fn1+f39+f35/f35+gIGAf3+AgIGAgICAgICCgWdYW1pZXFtcY1xaXF5ga3FtcHBvbm5vbmtpbmxrbG9qaWtraWpraWdmZ2dnaGhnbWdqZ2hlaGdjY2JhYmBgXVhbW1dYV1RWUVBUU1NNSkxLTExOTk9UWFhXVVVUUlBQTU1QT05LTE1QUU9MTEpHSUlHSEhJSEhIR0ZHSEpKSEhISUlISVZwc3V5ent5dnZ5enp7fH59fX5/f35/fn5+f3+AgX9+f4B/gICAgICAgIGBbFtYVlZWWVlaWVlYVVZoamxubmxra2poaGloZGVkYlxiZl9fYGNfXF9dYF1eWl5dWVleYmFeXlpZX1xYV1NOTUxLS0tMSUtNTktKS0tMSktQTEtLRkdHSUlGR0lISUZFSEdGRkVERUVEREVJSUlHSEdIRkZLTUtJSUlIR0hLTU1LTExMVXFzdnl6e3h2d3h3ent8fn1+fn9/f39+f3+AgIGAfn5/f4CAf4CAgIB/gYJoUlRVVlNVV1lZWVdXV1tbYWNfXlxbWFZWWVZSVFJRUVVUU1NTUE1KTU5QUk9NUFFRUVFSVlZRUVFUUFBOTk9MSk1MS0xKSktLRklJSkxJR0pISUlFR0dGRkVFSElKR0ZHRkZHR0hKR0dISEpMSkpLSUlISktLSkhKS0pISUtMTU9QUEtUdHR1eHp6eHZ2d3d6enx+fX5+fn5/f35+fn+AgYB/f3+AgYB/gICAgH+AgmlQUlRXVVRWWVdYWFpbVFRTUlBRU1FRUU9OTlBQUU9MTlBPTk5NTEtNTk5QTU9QUFJRUE5OT05PTk9PUFFPTk5PTk5QTk1NS0lISEpJSUlJR0ZHR0dJSkhJSEhJSEhHSEdISElISUxLSklISkpJSkpIR0pMS0pJSUhKSktMTk1NTU9RTFVzcnN3enl3dnR2eHp7fX19fn5+fn9+fn5+gICBgICAf4GBgH+AgICAgICBbE9PTlRZVVVdW1lXV1hOTUpKSUZKT0xKSkdJSk1NS0pMTUpHSUlJSktMRkRGSktLS0hKTExMT01MTE5PT09NTk9MTk5OUFBPTE1MTk1MTEpJSEdJSElISElJS0xLS0pJS0pJSklJSUlJR0dKSUdJSUpKTk1OTEhJSklJSk1PT01MT1JOWXBwcnd4d3d0c3R3enx+fX5+fn5+fn5+fn9/gICAgICAgYCAf39/gICAgIFvS0pNTlFOTlVXVlZSU0lFQ0VFUkREQT5CP0RAQD5CREFAQURHRkVIRUJBQEBDQ0RFQUNFSEtPS0lJSkhHSklKSUlLSkxQTk1MTU1MTU1NTElIREZGR0ZGRklKSUlLSkhMSklKSkpJSEhKS0tIRkdJSklLTU5OSktPTUxLTU1PUE5QT1BgcG9yd3h2dHJzdXd6fX19fn5+fn9+fn1/gICAgICAf4CAgIB/f3+AgICAgXNQUE5OUE1KS1BSUE5RQ0RCQUZRRT1DPT9FSDk6Oz0/PTxBRUA+Ojs+PjxFRD0/RUE/QEFAREVHR0dHQkRERUZFR0dHR0pHSEpLR0NER0pHQ0RFQUFDR0hHSEdISktKSElMS0lISktLTU5MTUxMSkpMS0lLTU9PUFNRT1BQTk9QUlFNUGdwb3N2dXRycXR4eX19fX1+fn5+f4B+foCAgH9/gIB/f4CAgH+Af4B/gICCdlRVUVFQT0xNUFBOT09BQkFAQkE/Oz48Pj8/Ozg5ODs7OkA7Oz48Ozs8PEhMPT1BQT9CQz1BRERGQkZGREdJSEM/QEBAQUFCQUE/Pjw9PkFAQD8+P0BFR0dHSUtMTk1OTUxNTUpLTVBVU05MTlFOTk1OTE1NTk9OTk1LS05OTk1OTkxUbnBwcnR0c3Fydnl5fX19fn1+fn5/gH5+gICAgICAgH9/gICAgH9/gH+BgIJ4UVFSVFJTUVNTUVFST0BAPT4/PD8+QEE/PT45Ozo7Ozk5Ojg4Oz05Nzk7Oz49Ozs6ODpAQEFCP0E/Q0ZEQkNDPzs+PkBDQ0E/Pj9BPkBAQj9APD9CQEFDRUVFSktQT1BPTU1OTExMT1JRUFJOTExPTUtOT0xMTEtMS0tKS0tKTU1LS1xxcXF1c3VzcXR4eHp9fn1+fn5+f39/fn5/gIGAgH+Af4CAgICAf4CAf4CAgXxSTU9RUFFSUlRSU1NOPDs8Ozs7P0BBQkA9PDk8PTw6Nzk6Ojk4OTk5ODg6OTo7Ozg3ODk7Ojg8Oz1AQUA9Ozs+PD09QEJDQT9BQkE9Pj09Oz0/Q0RCQD9BREJFR0pKSkpKTE1MTExNTExOVVNLTE1USVBKSU1KSUpLS0pJSEdKS0lKZnJxc3RzdXJydnl5e31+fn5+fX9+f39/f36AgICAf4CAgICAgIF/gIF/gYCBgFZMTlBQTlJRUFBRUU44PT88PDo9PkFAQT8+PkA/Pj07PT0/QD48TUw5PD09PTw8PDw7Ozo7PD49Pj8/QUA+P0E/QEBBQEBAPT8/PTw6Oz09PD9AQUJCQUBCREZGRkdGR0dISUtMTExLTEtKS0lKSk1MTEpMS0lISUxMSklJSElLR01tcHF1dXR1c3V4eXl8fX5+fn5+fn5/gH9+gIB/f39/gH+AgYCAgYCBgICBgYCCYUtPT05OT1BPT1BQTzo8Pjw9Oz8+PkFBPz0/Q0REQT49PkBBPz5qb0I9P0NFPz9APTs9PT08Ozo9PkFBPz5AQD9BPz89PD48PTs7PD0+QUA/QD5AQ0NEQkRFSEVFR0hISEdGSUpJSUlJSUhKSkpKTEtKSklJSEhKSktMS0lLSkpIVnBvcXNzdHR1eXp7e3x+f35+fn5+f39/f39/f3+Af4CAgICAf4GBgICAgIGBgIJtTFBRTk9QTk5PUFBPPjw8PT4/P0A+QEA/Pz9DRkRAPDw9QERERW15STY6PDk9PUA9Ojw7Ozw7ODk7Pz49PD07PEA9PTw8Pjs9PD0+QUBCQUBAP0JEQ0RFRkZGQ0VHSElJSEhJS0tMTUpKSUpNTUpLSktJSEhISEpJSktKSk5MSUlfcHBycnJ0dXZ6e319fH5/fn5+fn5/f35/f36AgIB/gICAgICAgYGAgICAgIGAgnZNTk5NTk5MTE5QT0w+QTw8PT8+QkM/P0FBQUJBQEFYQD5beHx7eXlTNzo4ODo7PT8/PDs7PDs6Ojs+Pz89PDg6Pjw9Pj89Oz4/QEJDQkJDQ0FCQkFCQkRCQkRCRENGSUdGRkhJSUtNSklKSktMSkpJSkVESUlGRkhISUpKTEpGRmdwb3FxdHZ1d3t8fH18fn59fX1+fn9/foB+fn+AgH+AgICAgICBgYCAgICAgICBek5JS0tMTExFSUxOTTw/PDw9PkBAQUE7QkNCQ0E/RnhYY4SEhIOCe187Pj0/Pj0+Q0Q/Ozw9Pj89PT5BQ0A8OTtBPz4+QT07P0JAQkNCQENDQUNBPT0+QD0/QUFBQENFRUBAQ0JDR0dFRENGRUZGR0VEQEFHR0ZDRkRHSEpHQz5IbG9wcHF0dXZ5fHx8fHx+fn1+fn5+fn5+f36Af3+AgICAgICAgIGAf4CAf4CBgIF+UUhLTU1NS0pLTE9RQD8+PkFBQEBBR0FCRENEQT9KdHiAgYKBe4OBaD9BQENAQD9AQD49PD1BRUFCQkZIQz08QERDQUE/Pj1AQT4+Pj88PkBER0VAPkBBP0BDRkVDQkNDQEJEREJERUFCPkFCQkFCQEA9QUJDRENDQUNFR0E/PVZwcHFwcnV1d3p8e3t8fX9+fX19fX1+fX5+fn9/foB/f4CAgICAgYCAgIB/gIGAgX5SSEtNTUxLS05OUlVEQkBDQ0FBQkBCQ0BAQUFBQExzfIB7goN+hYVZPkNDRUA/P05hX0pAQ0VJSUlJTU1LRUNGR0hFR0VFRUREQ0E/QD4+QkZKSkdFRUZGRkpOTktKSUdHSEtNSkdHQ0REREVEQUJCQ0BDREVEREVERUZDQkFEZW9wcXF0dnV4e3x6fHx+f319fX19fn59f4B/f39/f39+gIGBf4CBgICAgH+AgICAfVJJSUpKSEpKTE9SU0dGRUdIREdIREA+PDs+QEVFSnB9f32DhYaGh2hBRUVEQ1d1homKflhHSEpMTE1PT0xIR0hHSElJSEhHR0hIRUNFRUVFRkhKSkZFR0lKTU9PTU1LSktKTU5LSUhHSElIR0ZFRkZGREZIR0VFSEhGSEdIRlFubnBxcnZ2eXt7e3p9fX5/fX19fX1+fn1/f39/fn5/gH+BgYGAgICAgICAf4GBgIB8UEhHSElGR0lKTU5OSkxJSUpLTE5KRkNBQkNGSkhNcn+DhISChYeIilVBQVV0h4mHh4aHgldJTE1MTU5MSkdHR0dER0dHR0ZIRkhFQ0RERkVEREhIQ0NDRklLS0xMTExMTElKS0pKSUlJSEpISEdISUhHR0hGRkZISklJSUlIXW9vcXJzd3d6e3t6e319fn59fX19fX5+fYB/f39+fn+BgIGAgYCAgICAgIB/gYCAgHxNR0ZIRkVGR0dKS0pMTUxLTU5NT0tJSEhKS0tMTExngISGg4CEiImMcE5thIeGhoaHh4eHfFBLTEtIR0ZGREVDQ0BBQ0NDQ0ZGRUJAPj5AQUFAQkQ/Pj9ERkhERUdJS0lJR0hJR0lJSkpJSEZKSkpKSUpJSkpKRklMTEpKS0tmb3BzcnR2eHl7e3t8fH1+fn19fX19fn59f39/f35/f4CAgICAgYCAgIGAgICAgICAfU9GRkdGR0hHRUZHR01NTUtMS0lHQ0NDRElLS0xMSlOAhYaCgIKEhoeDgIaFhISFhoaHh4aKdUlJRkI/P0A/Pz88PDw+Ojo8QUFAPjw5OTg8PD07Pjs5Oz9BQkFBQ0NDQEFCRERCQ0ZISUhISExNTEdJSk1NTk1KSktLSkxNU2xvcXRzc3d5e3t7fH19fn9+fX19fX1+fn5/foB/fn9/gICBgIGBgICAgYCAgIB/f39+UUZFRkdJSUdEQ0VGTk1MSklIRT85Oj5ARUhISkpKXYWFhICChYCCgoOEhIWFhoeIiIiJiYyOZkJCPTg4Ojo5ODc4ODk2NDc5Ozw6ODU2Nzc4OTc4NzY4OTs7PD5AOzk5OT09Pjw8PUFERUhKTUxMR0lIT1JRUFBOTE1NT1Fdb3BydHN1eHp7e3x8fn5+f359fX59fX5+f39/gH9/f4CAgICAgYCAgICAgICAgIB/f39RR0ZHSEpIRkVGR0hMTEpJSUdDQjU2OjxDQENHSUlghoSBfoCChIOCgoOEhomKi4yLiomKi4yJVDs4NjU2NzY2NjQ1NzczNDY4Ojg3NjU2NTY3Njc3ODo3Nzc4OTs3NTc5OTg5ODc2OjxAR0ZJRklGRUZPU1JTU1JPUFBSVGVwcXN0dHd5e3t7fH1+fn5/fn19fX19f39/f3+Afn+AgICAgICBgICAgICAgICAgH9/flJISEhJS0lHSUpJSkpLREVIRUJANTc4OD06PUVDQl6EgICAgoODg4ODhYmKiomJioqKiouJiYqBSDY3NjQ2ODg3NDU3ODQ2NzY5OTc2Njc2NTo5Ojo6PDg5ODk3Nzc3OTo5ODg3ODU4OTtBPT4+QkE/QUtMT1FQUU9PT1FXa3JydHR1d3l7e3t8fX5/fn9+fX19fX5/f4B+fn9/f4CAgH9/gICAgICAgH+AgICAf39+VEhHSUlMTUtKS0tMSUg/QEFAPDo1Nzk4OTc7Qjo8aoaBgoOEhISEhIaJioqIh4iIiIqKjIqJiYx6Pjo4ODs8PT45Ojo7ODk7OTo7Ojk5Ozo5PT09Pzs7Oz06Pjs5Ozs8Ozw8OTs8ODo6Ozo5OTk8Pzw9QUJESUpNS0pLTFdvcnN1dHZ4e3t7fHt9f39+f359fX19fn9/f35/f39/f3+Bf4CAgICAgICAf4CAgH+Af35URkVGSUxOTkxKSk1CPzo7PDs4OTk4OTo6Ojs/PkV6hIGChIWFhYaIiYiHhoaGiImIiYuMi4mKioxsPDs+QkNFRUFBQEI+QEJAQD89Pj5APz4/QD9APT0/Qj9BQT9BPz1AQEA/P0E9Pjw7Ojs6OTs/PTs7PT1BQUNBQkNBWHFxdHR0dnl7e3x9e31/fn9/fn19fX5+f35+fn9+f4B/f4CAgIB/gIGAf39/gICAf39/flJFQ0FHSk5PTElHSzo4Ojs5Ojo8PTo7Oz09P0BDUIGDg4SFhIWEhomJiIiGhoaHiImKi4uKioqLiotePkRHSUtKSUZHR0RGSEdFQ0BAQ0VDQkBCQ0I/QERIRUNFREVFQUZFRkVGRkRAQj48QD49P0A+Pz8/Pj8+Pjo7PTxgcXJ0dHV3enp6fX19fn5+f39+fX19fX5/fn5+fn5/gH9/gICAgICAgICAf4CAgIB/f4B+UERAPUNIT01HRkJEOTc6Pjo8Oz4/Pz89QUBDREZWg4KDhYWGhoaIiYmIh4aGhoeJioqLjI2MjIuKiohXR0xNTUtOSklLSElKSklFQ0RGR0ZEQ0VGREJISUtIR0dGR0dFS0lLSUpLSkNGQ0NEQkFBQ0JEQ0NERENBPTs9QGhwc3R0d3d6eHt8fH19fn5/f359fX1+fn9+fn59fn+Af3+AgH9/gICAgICAgICAgH+AgH9PQT49P0RMS0BCQkE5ODw+Ozw7PkBAQT9CQkdHSlmEgoOFhYeHiImJiIiHhoaGiIiIiYqMjYyMi4uKjH9QTVBNS05LSkxJSUlISkZER0hISUVFSEZGRUxMTUlKR0dISUpOTU5MTE5LSEZHR0VFQ0ZGRkZERUhIRkNBP0BMbHB0dXZ4eXl5fHx8fX1+fn9+fn19fX1/f35+fn5+f39/f39/f3+AgICAgIB/gICAgICAf1FBPz4/RkdHPTxAQDk4PDs8PTo/QD5AQENGSUlQYIKDhYSFhoeHiIiIiIiIh4eIiIiJioyNjIyMjIuKjXFNUU9NTExLTEpIR0VKSURKSEdMSkhKR0dHS0xOTExISElKTVBOUE5NT0tJR0lKSElESUhIRkZHR0lGQ0JBQ1VucXV2d3l7eHl6enx8fX5+f39+fn1+fX5+fn5/f36Af39/f3+Af4CAgICAgICAgICAf39/VERBQUJHSEI/OD9AOTo8OD0+Oz1BPj9BREdKTFZyg4SEhISFhoeIiIiIiIeGiIiIiImJjIyLjIyMi4uLi15RUVBNTk1LSkdGQ0dKR0xKR0tPTEtKSk1NTE9QTkhJS0xPUVFQUU9PSklKSkxKTEZHSEdGR0lGRUVCQEJCXG9yd3h5enl5eXp6e3t+fn5/fn59fX19fn9+fn9+f4CAgIB/f39/gICAgICAgICAgH9/f39VRUNFRUdHRUQ7P0E7PTw5QD4+QEJHR0FHS0xQV3mFg4ODhISGiIiIiIiIh4eIiIiIiIqLi4uMjIyMi4uNfFdVUlJUUk9MS0pFRUZLT05PV1ZRUE9RU1JNU1RPTVNMUFNVV1JTUVBMS01NTUtOR0dKRkZISkRERUVCRENjcHV5eXp6ent6e3p7fH59fX9+fX19fXx9fn5/gH9/gICAf39/f3+BgYCAf39/gIB/f39/f1VGRkdHR0dIRj5AQj0/PT1CP0JDRlZORk1PUFRZfIaDhYWEhIeIiIiIiIiIiIiIiIiJiouKioyMjIyOi4uLZ1ZWa2FFUlFRUEo7OlFTUmB1XVVWVFZZWVJYWFJaZlBVV1pdUlRXUVBOUlBQUFFLS0tHSElIRUZJSElISWpydnl5enl6e3t8ent8fXx9gH59fX19fX1+f39/f3+AgIB/f39/f4CAgIB/f3+AgH9/f35+VEhKSUlHR0ZFPz9BQUVCQ0dFREVMWFJNVFVWWFt8hoWHhoWGh4iIiIiIiIiIiIiIiIiIlJyMioqMfWGKi4uHbFtkVTpYWFhTUD5AVlVZXGRgVllicl5dVl1aVkVRWVpbWV9UWWdSVVZYVFRWU09PTUpMSklJTE1LT01Tb3N2eHl4d3p6ent6e3x9fH5/fn1+fX19fn1/f39+f4CAgH9/f3+AgICAgH9/gH+Af39+fn5WSkpJSEdGRERCQT9ITUlNUEtJS1BUU1NXWlpcXHiFhIWFhYWGh4eHiIiIiIiIiIiIiImcnaCPiY5nO36MiYqLem5wWFpbWlJTUlZWVFpadYNZVX2QYVxYXV5XSVZdXVtbX1lIWVhZXF1YWFlXUlFNUFFNTU9TUVFVUmFzc3Z3d3Z4eHh6e3t8fX19f39+fX59fX1+fn9/gH9/gIB/f3+Af3+AgICAf39/gIB/gHh5fVlOS0lJSUZCREBBOlBRUVdYUFBPUVNUVFdYWFpbboGCg4WEhYaHh4eHh4iIiIiIiIiIiJaanJeIioFuhomIh4OKfmZZWVxYU1ZUV1JRV1ZjloBRZXJYWldfaFBgZlpbWFxoYkdPWmlnXFtcXV1XU05TUFBRVlZWVllabnJ0d3Z2dHd4eHt7fH19fX5/fn59fn18fn9/f3+Af39/gH+AgH9/gICBgYB/gH1yfX9/b3R8XVNQT01LSkVDP0A7UFBaWltSU1FPUlJRVVNVVFdfdXiAhYSEhYaGhoaHh4eHiIiIh4eIh4ORjomJiIaFiIiGfYB7XFBWWFRSVFJRUUxPTUtmeVpdVFlVVl1aTFRaVVNUXlpYV1dXemtYWlxcXlNQUFBJTk9XVlhbWmRxc3Z2dHR2eHl5e3t8fH19fn99fX1+fX1+f39/gIB/f3+Afn56eHd2c3V7f3+AgHRrfn5rcnleW1ZVU1JPS0ZDREFNXoNsVlJTTk9RT1FVUlNSUlRjZHaAgoKDhISEhIWFhISDhoaGhoeIhn6JiYiHhoOHh4d5bXFWSUtOTktNS0hKREZIRUM+U2NVf1JRUU5LUlRSTU9ZUU1OUVNVVU1RU1JQTkxMSENJSFJTVFpcbXJ2dnVzc3d7ent7e317fX19fn19fX59fn9/f3+Af399fX5+f39/f4B+e3Zzd31+fmR1fWlxdF9kXV5bWVVRTElMSWFsknRQUVNOUVJRUltSU1JRUlVVYnN7fH+AgYKBgX99e3uAf4OChYaHgoaGhoGEgYaFhnVfXUtDPkNDQ0NCP0RQQkRAQz5CSEdWQEhOTUddaVBIRk9GREVGSEdIQkNIR0hKR0NCQURAT1BNU2RzdXZ1c3R1enx6e3t7fHx9fHt+fX19fn5/f3+AgIB/f3x8fX+Af39/f4CBgH12dHt/bWh8Z25xZmllZWJcWFNRUFVSc1dlW09PTkxRU1FVWVNVUVFUUk9WYGtscnZ7e3h5dXJuc3RzeXh+foOAg4OCgIKAgoGBa0xHPj46Oz5APz8/PmtRS2FFRkhJRUI/R0xNR01RVUlCRT8+PD08PT0/PT9BQ0I/Pjw9Qj5KTUZVbnV1dXN0dnh7fHp9fHx9fX19fH59fXx+fn9/f4B/f39/enl3eHd2dnh7foB+fXt4dnx1YXhnbHBqbGppZmBbUVFaXFleSUpQUU5LTFFSUVRVVVdRUVdWUFhbYl1hZ21tbG9raGBucmptbHF1e3p9enh6fHx4d3hkQkBAQT06QkNBQURCXF1Pe05PT05LTE1PT1FMS0xXTUhHQEI8OTc3NTk5PTs7Ozg5ODk/O0FHPlx0dXV2dXZ3eXx8fH18fH19fn58fX19fX9/f39/fn9/f314dXd6e3p3eXh1d3t8eXh1eXdjcWhpcG1ubW1oZl5PUF5cWklHUFJRT01QUU5RUlRWWFNSWVROWVpbV1ldXl5gZWBdXnF2a15gZ2t3b29sam9ubmxmYllHRkZIQkFGSUVFRkRNUlBhV1JYUVBTU1JVW09PUVZQTUlDRj46OjY0ODY5Nzk6MzY2Nzk2PEI9ZnR1dnd3eXl7fX18fHt8fX5+fnt9fn19f39/fn5+fn9/e3d1eX18enh8fHx8dHd2d3Z1d2tuaWhxbm9vb2prYFVXXlpXTUxUVFNRUVVPTFJTVFdYVFRYUUxYWVpWWFhWWFldV1dYaHNrXVZgdGthYV9dZGBfXllVUE1PTkxJR0pLSUhGQ1FQU1pXVFRNUVNZU1xlVU9TVFFOS0lIQz9BOTk4ODk3ODg0NzU3ODU4OEducnV4eHp7e31+fX18e318fn5+en1+fH1/f359fn59f358dHR1e3hycW9vbnR4cXJzeHZ1cWZkZ3JucHBxbm1kXV9fWVdPUFhWVlNUVk9PVVZYWFlTVVRMS1RVVVVVV1BUVVdUVVJdbl5STllgW1ZZO0RVV1RbZkpMUFJST01NTk5OTEpGUFBVWVNUTkpOT1RTVFxWUlVTUk5NTElISEY/Pz06Nzg3NjU5OTY3NjY1V3FxdHd5ent8fX59fnx8fXx+fX15fX18fn5+fXx8fX1+fXxydnF4eHJ1dXFxbnBwb3B1dnRuamRkanBwcXJwbmZlZGNcXlJUWlZXVVRXVFJYWFlZWVJVT0pHUFBPT01SSk9QUFBOTk9UTE1JUFBTVFUyPFhNSUFRPWNgUVNRUE5QUVBOTk1QTlRSUFJMSUxLT1FQUVJTVFFST0xNS0xMSENCQT06OTg3NjtCNDU2NjtlcHJ2eHl7fHx9fnx9fH19fX18e3h8ent9fX58e3l9fH18e3B1b3d1cHV0b3N2cHFxcHV1dmNqZ2VXaHRycnFuaWlocFZWVFVYVVdVUldWVVpZWFdVUVNGRUFGR0dIRkpESEpIR0VITEhLSUdMTVBNRy9FX1I+M0A+am9hUlJRQEZUUVBRUFFOUU9QT0xKTExPUE5OUFFRTlFPSkxNTUtHRUVEQjs9PDw5PUc2Njc2RG5xdXd6fHt8fX18enx8fX5+fXt5dnh3eXl8fXp6dn17fHp6b3Fud3JwdnFtcHNwb3Bzc3N0ZmdgaFpXa3JzcmxtbWtuYmVQU1RSU1VPV1ZWWVlWUVFRT0A+Oz0/QEJBQ0BCRURBQEdIR0hGRkhKTUxER0NPUkM4RU5TXWZSUVNBR1VQT1FRUE1NTk1LTEtMTk9PUU1PT01JTUxJTEtMS0dGRkVEPEFBPjtARTs8ODlUcXN1eHt6e3x8fHt5fHp6fn58e3V0dXJ2dnp6eHpyfHt8eXltcW94cnF1bm5xcm9vb3Rzc3J1dGtnZ15lam1wa29xbWltY0xPTk1RU0xUVVRXV1VMTEtIPTk4Nzs/QD88PUFAQj0+RUhHREZGSUdLSkBGQUFARkhFSk9IUFFhXFFQUk5TT09QTExPTUtNTE1PTltWS01RT0hKSENJSkxMS0ZGRkQ/QkM+PEJHP0I/QWRxdHd6ent7fHt6end8d3l+fnt7cXN0cHJzd3R4eHN6e3l2d2xxb3ZxdHRsb3Fybm5vc3ZydHNycmtsZW5zaG1ubWxtbGprSUxISE9RSlFTUVRTT0tIQ0U9OTg3OT9CPjs+QUBAPkFESUVDSEdJR0lFQkI/PjxDQkFHSURNT2FlUExOTldLTE5LTE1NTUxLTk5TZE1KTFJJSUlFQUhKTE1OS0dJRkJBQkA/RUZFSERLb3B3enl5e3t6fHp3c3h0eHx8eXpucXJtbm9ycnZyc3h8eHZ2bXBtc3B1dGxwcHJvb29ydnVyVlZucWdseYRqbXFybm5qaG9ISkNHTE1JTVBNUE9HS0U/Qj05OTk6P0I/PEFCQkFEREdLRkRJSUdHSENDP0I/P0BBPkNFQ0tOUVRLSkhNVEZJSUpMSktMSUlMTU9QUlBLR0NMR0NDSkpMTU9OSUpJR0NDQ0RJSk1MSVpzbXh5eHp7e3l8dnJwdXJ0eXl2eGpxbmpsbG50dG1zdXtzdHhyb25xb3ZzbnBvcnBvcHN0eWpOYGdzanR8eWdvc3FqcWhlcUhLQ0ZISEdKS0lKTERHQj0+PTo6OjtBQj89QkJDQ0hGSkxKRUlJRkdHQ0M7QUBCPkBAQ0VDSU1PR0hLR0hLREhJS01ISkxISEpMS01dUklIRE5HQkVLS05NUE5LTUpLRkdHSk1OUU5MY25pd3Z3e3h7en1xbWxza3B0dHR1aHBtamlra3RwbnR0eXByeXRvcnFvd3NvcXB0cnBydXR5a05WbXVscXt2aW5vaWp0aGRvRktDRkVHREVFRkVHQ0NAPjw9Ojs6OkBEQD5CQ0VFSUZKSkxGSUlHRkZEQjtCQ0M+QENDQ0VGS01IS05IREhFSUxOTUdJTEdFRklJTE5LSkhFT0lDR01NTk1QTk9PTUxJSElPUlFSTlJmZ2Zyb3N4dXt6fGxoam9la3Btc3FmbWxoaWtsdG1wdXR3cW94dG90c3J2c3BxcnRzcnR1dXZ2WFZ1dWtvdHJrb3ZsaG1lX3BHSUNFRkVCQ0JFQERCPj8+Ojs7PTs9P0NBP0FDRkdKR0lJTEhHR0dGRUNAPURFQj5BRENDRUdISUdNUElGRkdLTk9LRkhKRkVERElJSEtJRkhQS0RKTUxQTk9OT1BOSkpITVJVVFJPV2RhYW1ncHJvc3l6Z2VoaGNpbGdxbGZsbWdpa2xzbHB2dXRwbnZyb3Nyc3V0cXNzdXRzdXZ2dnl2dXR2bGt1dW1ydnFsbmxlck1HRUVHQ0JBQkQ9QkE+QT06Oj0/Oz4+QEI/QEJFR0pGSkdJR0ZGRkVEQkFBRkZDQkJCREVER0dIRkxQTElPSkpMS0lHSEVGRURDSUhIS0pHS1JNQ09PTlFQT09OT09LS0tQVVdWVVRYYF5daWFtaW5ocnNiZWZmZGloZm5pZm1taGtrbXJpcXZ1c3Ftdm5vcXJzd3Nyc3R1dnZ2dnd2d3Z2dHd1a3N1bnV0c3Fya2tzTUZGRUhCQkFERDxBQUBDPDg5PT46Pz0/Qj9AQERGSEVIRkZHRkZFQ0NFQkRJRkNGRUJFR0VFRkdFSU1LSFFNSktISElFRklIRUNJSUpLTUtQU05EUVNRUVJOT01OUE1MTlNXVldYVlheW11kYGhiamlna19kZWZjZ2dna2dna21rbWxwcWd0dHVyc252b3FwcnR4cXNzdXZ1gpF5dnZ0eHV1d3hub3VvcnN1cXFpcHpNR0dHSEJCQkZFPEBDQkQ8Nzo9Pjs+OkBCPj8/Q0VGREZEREdFQ0VDREVGRkpFRUlHQ0dIRkhGRUNGSkpHTUpMS0lKTEZJSEtIRUtLTE1OT1JUT0lTVVRRVFBRTU5RTk1RV1pWWllWWl5aWGFgYGBfaGVjYGRlZ2dqaWhqZmhubGxvbXFwaXV1eHJycHVwcHBydXZwdXN1dnV7fn14dnR3dnZ2d3BsdXBtc3Vub3JzeU1ISEdJREFDSEU8QEVDRT04Oj4+PDw8QUI8Pz5BQkZDRUJCSENDREVGRkdHSUZHS0hDSEhHSUdGREhLSUdLSE1LSktMSExKTUtJTkxPTk9SVVZPS1VWVFFUUVJMT1FQT1RZWllcWllbX19eYGNeXGFja2JgZGdocoVoZ2lmam1ucG9uc3FqdHV4cnNzdHJucHF2cnF1cnV1c355jn11dXZ2dnZ4cml1cWtydGxxd3F1S0lLSEpFQkVHRTxAR0REQDk8PkA/Pj9DQjxAPkFBRkNFRUNIREZER0ZISEZISElLSkVKSEhLSEZGTEhISEpITExMTExJTUtNTU1PTFBQUVVWV09KVlZVU1NSUUxPUlJRVlpbXV5bXF5gYGFgYWRdZGBlZmBlaGpjc3NmamhnbHBycW9zc25zd3dwdXZ0c21vcnVvcnNwdXJ2cnSBdnV1dXd2dXd0Z3Rya3Fya3J3b3dJSkxJTEdCRURFPEBGRERCOz8/QUBAQERBQEI/QUNIQkVFRkdFSUVGRUlIRklISkxISEpKSUxKRkpLSElKSkdLS01NSkpNTE5OTk9MT1BSVVdWTU5UVlVTUlFQTU5UU1JXW15eX11dYGBhYWFgYmRlYmNoYmRpamd2i2xraWdtb3NxcHFwcHJ5d3J1dXRzbW1zc21xcm90dXRzcHN2dHV1d3Z1dXRlcXNrcHFqcnZvd0pMTEtNR0RDQUQ8P0VFRUM9QUFDQkJDRUFDREFBRUdDSEdIR0ZKRkNHSkdHSkZJTEhJSk1LTUxHS0lITEtOUUtSUUxTTUtOTk9QUFBUT1dYWFtOU1FXXFpTVlBOVFVUVFhaX2JiX2RhX2BiX2BlYWFjaW5oYmloaG14dmxoaW1vc3JwcXJycnZ0c3Vzc3Nua3NxbXByb3R2cnJxdXZ1c3d5d3V0dWNtdGtvcGpxdHB3TE1MTExHREFARD4+REVGQ0BDQUVEREZDQ0VHQ0JJRUJISklISEtGREtKR0hJSUlLR0pKT0tOTElMSEpNS1pmSmRcS2xSSE5OX25VbHNbcXBid2NSUGJ2dWh1Y2F2YFhucWJkdmluemZcbHRgbGpUX3d2aWpnaWZnbG1qbW9qbW5zcnBycnFyc3Jzc3J0cm5sdG9ucHFxdXVxcXN0dnZ1dXl3dXR0YGt0a3Bwa3FzcXlLTkpLSkZCP0BCPz1ERUZEQ0RCRUVERkJGRkdDREpFRUpMTEpMTUdHTUpISkpIS0pJS0pOTE1NTExJTE1MW3NiZHBebGxVTU5mc11nZXFsbnRncGlfYVlubWJwcGJrampnb3F0ZXRub1xwdWdwTUpyeXZrYmBrZWVteG1rdmxucHNycHJxcHFycXJycnRybW1zbm5vcHJ1dHFzc3R1dXV0d3h2dXRibXVrcHBscnJxektMSUlHRUQ/QkI/PUJFRkJGQ0VERUVEQ0hIR0RFS0dHTE1NSk1MRkpOSElLSklLSkpKS01NTk1NTUtOTU1bcm9vbnBwbGtNUFFsV05pYnRycGFtb3ZcWWxQW21tWnFta29teHh0c2lwXGBzbHFqVXV5eHBjXmtmYmdwcGppb3Bwc3NwcXBxcXJycXFycnRsbXJtbW5vcnV0cXRydHV1dHV1enZ1dGVudWtwb2xzcnJ5SktHSEVFRUJCQj0/P0VHQkdESUVFREJGSUhIRUdLSkdNTU5LTU5HTE5JTEtISU1JS0pKS09QTk5NTE5NTFxoZHVdbHFXbE5PUW1VWmtea2x2YWxkdFRlY05sWWxcdHBraWx4and1aHBdX3NraFdiY3d8b2NgZ2dhZGl0eWtubnFzc3BxcHFwcnFwcHBydWttcW1tbW9xc3Rxc3J0dnZzd3Z6dnV0aG91bHNvbXNydHZJTUdJREVFQ0FCPEJAQkZDR0ZLR0VDQ0hLSEhGSkxMRk5LTFJSTEdNTUhOSkdITkhKSklITk9OTkxKTk1KWnNwcG9xcW1sT1FSbllxa2dvb3Fxb210Xm5YYXRfbm9wb3Fyb251c3R0altddGN3eHJqbnpoYWFjZmJiam10dXBzdXZzcXBwcW9ydHt/fn13bGtxbmxtbnByc3F0dHN1dXR4eHl5dHVrb3VtdG9uc3N2dEhLSElCRUVFQUA+Q0NBRUNISU1JRkNGSkxJR0ZKTUtGT0pLV1JLR0tKSk5JSEpMSUtKSUhKTE1NTElLS0tTa2JaaV5famNyclpfWWpvX2VlVWtfY1thYlFgbWhcalxuaWlkW3BmZHBdWlxrW21xY3BzbGRnY2RnYGBrbXBwb3R5cnVxb3BxbnmFiIeHhoWAdnNua21tb25xcnR0cnR1dXZ5eHhzdW5xdW53cXJ1dHdySEhGSURFREZBQEFFRENGQkhKTEdGQ0ZLTElFRkpPTElPSUxbUUpGSEhLTUlISklLS0lISkdLS0tLR0hKSkxMTEtJS0xOVFtcVFBUTVBPTk9PVlFPT1FPT1FKSk5QUWRxaVRZV1tbXFVZW11YXVxcY2ZhYWZiY2VfX2ZrbWhtdHlydHJvcHB0hoeGhoaFhYaHg3pwbW1sa3FzdHRydHZ0dXl5eHV2cXJ1b3ZydHN1dXNHQ0VHRkZBRUM/Q0dERUdDSUtMSEZER0pMSERHSVBLTE9LTFdNSUVFSElKSElLSExKSEZISEpHR0lFRkxISUtOTElPXFdeT1xbYF5PWFlTXFxiXk1ZWk1YYVJLWWFaU2BkXWJYW2RkVlZYXFlaWFxWWVxeY19kYGFfZWhrZ210dHFxdHBxcoGGhoaFhoWFhYaGhoR9cmtpb3Jzc3N0d3l5eHl4d3h0cXhyeHNxcnVydE9CQ0RMTUJDREJESUVHR0ZLSktIRUVKSkpHRUhIUEpMTUpNU0lIRUFIRkpJS0tJTEpIRkVKSEVGR0VFSkdDSk1KS1RfWWBYYGFbYFVYWVReXlpfUllcUF5cWU5fXF5TW15jX1pdYGNgWV9iW2BeW1RYWFpfXmRiYmFjZWlla3Jwb3Bwbm93hoaFhYaCe4CFhYaGhYaFf3VxcHJyc3Z5eXp5eXh4eHdyeXZ4cnF4dnR2YVNKSk1JRUNCQ0ZHRUdHSUpKSUlERktLS0VGSElOSk5MSExOR0hGPkdHTElLS0pLS0lHRUlFRERFQkZKREBKS0lPW2NZXl5hX1JUU1dfYFxdWV5RWVxNVl9XS1FZW1FbX2FhXl5jYWBiYmJjY2VaUllWVVxbXmNgX19jZWJob21tbGxsbHWFf4SDeXV8hIWFhYaGhYWGhoN9d3JydHd5eXl5f359eXV5dnZybnp3dnhYUUpGQ0dFQkVHSEZHSElGR0pHSEZIS0lMRENLSk1NTExISkpISkc/R0ZOSktLTUtLS0lHSEREQERBSElBP0hJR09dYVpbZF1fVFFSWF1cXFxfWktXXExSXFlJTV5QUF1fYWNkY2NiXGRjYmRjZlhRVVRTXFhbYV9eX2FhX2Rsa21qamxudn51gXp8hIWFhYWFhYaGhYaFhoaGgnpyc3V1e4WHh4eGhYSBfnhwend2eFxSTUJASUZDRktJRkZHSEdHSkZGRklMSk5FQ0tKTE5KTElLSkhJR0JISFFNS0tPTUtLSUhHRUQ/RUJISEFBRkZEVF1ZXlhfWV9bXVVYWFBdXVFLSldeWF5bXVZaYFJRX19hYmFgYmJgY2JiZGRiWE9RUlJbU1xeXV5eX19fZGhnbGpubnB7e3x+e4CCg4SFhYWFhYWEhIWDhISHh4FzcneFh4eHh4eHh4eHh4WDgHx4XFNLQkFHRkRHTVJIQ1JLRkhISEVGS0pNUEVHSUlLTkxMSUxLSUlHREhLUU9NTFBMTEtLSElDRUFFQ0hHQkFGRUJWVUVcVF1TVl9YTlRVTlpbTUpLVWBhW19YX15hXU9ZYlxgYF9iY2JdYmJXX19UUE9QUVhSXVxcXV5fYGFmZmVsZm9vd3x7gHt9f4CEhISEhIWFhYODhYKDgoWFhnpvgYaGhoeHiIeGhoaFhYSFg35JTkZERkZHRElSY1BEV19JR0dIREZNSlBQRkpJSktOTEtLTEtKSkdFSk1RUU5PT01OTE5IS0FEQUNERkRDQURFQUxIQ0xMUE9PTEZNRkdJSkhHTExNT1FJTE9QUFNQTFFTUlVaWVdZWFhkVk9TVFBQT05QVVRcWVlbXl5hYWVmY2hja21xc3N6eX97en+EhISEhISEhIKEgH57gYOBfXuFhIaGh4eHhYWFhISEgoGAfUtJRUVHRkdES01eTEdIWU1HSEpIR05MUVFJTEpLS05OVU5PS0tMR0dLUFNTTlBPTk9OT0hLRWBFRF9MRGZjRE1bSF5cc21PTVZtWUxDUF9VbFdnSl1YVl5ETFFVTE1UVlFSVFhXVFhVVFxUUGZaaGhkWVRrVFdWVVtcXGBgYWJiYmBnaWdubGhyenx9foGEhISEg4ODgX19enJ7gXp7f4KAg4SEhYWBhIWBg4N/fnp7TElFRkZIRUVLT1RJS0dgVEhKT0pJT01SUUtNS0xPUlVST09KTE1HSE1RW1lPUFBOT1BQSktQf1FJfFlZcnNYUG1IcW5vYVZQcXFzUENrc21xc3BTb19bblhdVlxYVWtoVV1WY1pgWVpfVlVXf2p0dXVfYXZfWGJcXGZbX2FhYWJeYGJnbXBsYHB3dHiBgYKDhIJ/fX6Adnh6bHZ+dHh+gHx+gIGChHyAg3p/gX9+d3dOSUVITU1CRExMR0lMRlJWTEtPSUtSWFdRTk9PTVFUTk9RUEtLTkdNUFNbWlRRUk9QUFBLSFp4XVR4ZGhZUlRRdmd0bHBibmZrUXJPTXdtanJwc3JxcnBvcIBdZXp1eHFxenF+c31rdX1iUmh8ZXNzb3NzfH1vfnlvf3JfYGBiYVphYGdrbmtibGZnbXd+gYCDfnt4d4B0dnppcn5udHx+d3h7foCDeHyBdXx/fHxzc05LRmBdR0FFTU1IS0tISlBPTU1KTlZeWVVMUVNOWVlMU1NSTkxQSVFSVFlXV1FUUFBQUUtHZnhsY3hxbVpKTFV5cHVtdWJudlBkZUpmdnFtd2+AamZ4eGlXclFoem1panp6fWx4en9wZ29YdnZqdnVwgGFzaH1pbHh8b19fX2NiW15iZGdpamRnYmNkbGxwcHN0c3NzeXFyeGJsdGdyeXtzc3V5foFzdXpufH15eHJuTkpSdE5DQkVQUElLS0pMUU9PT01QWmBaWEtUV1BhXlJWUVlTTVBJU1RVWFdXUFVQT05SSkxyb3V1cXVxZGhhVm5McXBeRmh5V3ZUS2h4fXhgeXtzbmFebW9kUmdydW5teXB3bHZzdHFsbVxzfnprbXl8bHVtfGtwdnV4Xl9fYl5dX2VkaWdoZWVeYmJpaWlqa25va3FubWpwYWNmZG93eG9tcHN5f25xcGp7enRyb21LS1pWSEdFR1JQSkxNS0xRUVBQUFFXXFlVTlZZVWZYUlJZXlRNTklUVFZXWVdPU05OTlFIUm1IaXdLYGR2dlVXbE9ubHtzYWpnf3ZVS1draH1sbWx4YFtwenteYHpzY3JveHFoZHxpcntdVEtsX3Z1a2l1e3ttfnhrfHBdXl5iW15iZGVnZWVlYlpjY2lra3JzcndnbWloZGdgYWxhZ3Nya2hsbXJ8a21oa3t0bW1rbU9HSktISkhIUlFMTlBNTFNTUk9TU1dSVlRQV1pWVlRUVGFgUU9OS1RTU1FWVk9OTE1PUEpIUU5QVUxLS1NUUlJUUFZVUVFOUVFYWFFOUFVUWFhYW1tVU1NXW1dYV1pQU1VXV1hRXVhWXVVTT1hSV1dXWFpgW2dyXltcW11eX2NaX2NjZWZkY2NiWmNjZmZmbW5tdWZmZ2NgZl9dZ2BkbGhmZ2tocHpoZ2drdWpoZ2lsUUlLS0xNS0pUUk1RUVBMVlVUUFRVWFVZVVJaXVZVVFdVWVhQT0xOV1RRTlVTTlBNTFFQS0pRUktRTUtLT1FUUlFRU1NJSE1OT1FSUVFRVFZSWFdcV1NTUFFVVVZUWlFOU1JXVVRZVlRZVVNSVVNUVVhZV15aX2FdXFtaXFxgY1xdYmJkZ2VkZGFZYGFjYWJoaGluY2FkXl9jXVpkXGJtYV5mZmdtc2RpaGtrZWRjZmhQSktLTk9MTVRRT1RRUU1YV1VUVVdXV1pWVFxgVldWWVVYVFFQS09YU1BOVVBNUk5LU1BNTlVUTlFOTU5RU1BUUVNUVU5LTU9RVFRSUlFWV1VZWltZU1VSVFdXV1lbU09TVVdVVFlVVllUUlJXVVVXXFlaYF1WWV9dXl1cXWBhXltiYmNoZmVkYlhgYGJdYGhlZmRhXl9dXV5aWl9aX2dgXl1dY2hrYWdmaGZkYGJjYVBLTUxQUUxPVFBQU1FPUVpZWFdYWlpYWVZdamRWWFlaV1ZUVE9LT1ZUUE9UUFBRTk1RUU9SWFRSUU9NT1NVTldSVFVVT05OUVNVVVRUUlRYVlpdXFpWVlFSV1hWW1xWUFNWVVVWWFRXV1RSUlhWVVpfWl5gXlZeXV5gXVxgYF9fWmJiZGhoZWRiWWJgYl5eZmRjYGJdXFxcXFlaW1hbYVteXVxfYl9fYmRkYmRfX2BcUE1OTlJRTVJTUFNUUU9VXFpaV1tbXFlaW2RxbWhkX1tZVlZYUk1NVlNNTlJPUVJPTFBTUlVaVVRQUExQV1ZRV1NTU1hNT1BSVFhVVVVTVVlYW15dXFtWUk9VVlZbW1dRU1dVVlhVU1haVFNRWVdWXF5bX19gVWFcYGFeYGJfXGBdY2FjZ2lkZWBaY2BhX19lZV9gY1taXFtcWlpZWVdcWVxbYF5fW15eYWBfYlxZYFpRTk9OVlFQVVNQVVRTUFdcXFxYXlxfV1xeanB3eX9jXFtWVlhSTk9XU05RUVBSVFJMUVRTWVpXVU9STlNXVlRSVFJSWk9RU1NWW1ZWV1RWWlhdXlxcXlZTTlRWVltbVlFUVlZYWVJTWVxUUlJcWFpdXl1hYWBXYltjYl5hY19cYmFiX2RnaWRmXlxkYGFgYWNkX2JfWVpeW1xbWVhZV1daW1phXF1bXVxcWl1gV1tbWlBPT09ZUFVVU1JXUlRQWl1eXVtgXGBVXF1oanJ9cmxoXFVZV1FPUltTUlFUUlRVVEtSVlVbWVpTT1NSVlVVU05WUlNaUlRVVFhcV1hYU1hcWF5dWVteVFVOVldXXlpXUVRVWFhYVFZYW1RTVl1ZXV1hXmNjXllgW2ViX2RkXl5jY2FdZWZpZGZdXmRhYGFiY2RfYl5YWl9bXFtYWFhYV1taXGBdW1tcW1haW15WXlldUE9PUlpQWlVVV1ZUVFReXmBeXmJcYFVdXmJreXRsfWxaVVpVUVFTXFRUVFVUVllXTFJaVl1bXFJPVVNYVlVTUFdSU1dTV1VWW11YW1lVWl5XX15ZXFpSV1JZWFlfWllTVFZaWVpWV1lcVlRaXVxeYGFgZWRdXl1dZWFiZmReX2RjYFxnZGhlZGJfZGFfYWBiYl9gXldYXlpcXFpZWldWXVpdXltaW1xbV1lcXVZYV11TT1BXWVBdVVZZV1dVWF9gYWFgY11gVV1eYmVldYF6aFhZWlRWU1ZcWFdXVlZXXVhQVVxZXl1dVFNYUlhWU1JUWFJTVlRYWFhdXlhdW1VeX1hfX1hcVlJZVVlaWmFYXFVXV1paWlhZWVpYVl1eX15jYmJlZV1iXGBmYmVmZF9gZGJiW2ZjaGVjZmFmX19hYWFhYF9eVlVdWVtcW1lcWVldW1tbWFhZW1laWl1fXVRZXVVOU1pWVFxUVldZV1ZcYGFiY2FkX19WW2BkYV96dW9oWlxaVlhVV1taWVtZWFlgV1BVXltgYVxUVVhQVVZVU1ZWUlNVV1paXF9eWl9cVl9fWl1eWV5WU1lYWVpdYlleVldaW1tbWlpZW1lZXl9gYGRjZGVlYmRaYmZjZ2ZlXmFjYGNeY2NpZGRnX2deYmJjYWFgXl9YVFpaWltbWFtYWFxbWltXV1pYV1xbXGBdVl1dU1BWWlZWWlVYVVhXWF5gYmFkYWRhXllZYWRiYGxmaF5cXVtXWFhZXFxcX1tZW2JWVFdeXWFjXFNWWFBWVlZWVlZTVVRYXVxfYGBdYF1XYF5bXlxbXlhWWFhbW19fW19YWF1cXV1eXFpcWFtfYV5gZGNkZmZmYlljZWVoZ2ReY2FgZWNdZmlkZWhfZ15jYmNhYWBfX1tYWVtZWlpYWVhXW1xaW1dYWlRZXVxaYFxVXmJNUldZVldaWVtcWVdZXmBiYWVhZGFdXllhY2JfYWBhX1xcXVhXW1tdXV9fXFpdY1hZWF1gY2RfUlhZUFhWV1hYV1ZXVl1dXmBhYV9iXllhXV1eWV1eWVhWV1tcYF5cX1laXl1eXmFdW1pZXF9iX2JkZGVmZ2diWmRmZ2lnY19jXmFmZFpoaWNmaWNlXmJiY2FgYF9dXVpXW1lZWFhaWVdaW1pZV1hWVVtdXV1gYGJieEtXV1xYV11cXF1aV1xdX2BiZGJiYV1gWGJjYmBjYWNeXFxcWFdbXV9dYF9dW2BkXFxYWmNlY2FSXFlPWFdZW1pZV1paYF1gYmJgYWNfXGJdX11bX15ZWVVYXV1fX15fW1peXmBiY1xbV1tdYGJiY2VkZ2ZlZ2RcZWZoaWZjYWJcY2dgXGlpYmhpZmVgYmFjYV9gX11dXFlcWVhXWFlZV1xbWldXWFBYWl1hY2Zmcmt/SllXXVpaX11cXlxZXVteX2FjYmFhXWJbYmRhX2NiYl1cW1pXWGpxYFxgX11cYWNfXllZY2VkYVRfWlFZV1xdXFtaW1tjYGNiY2BiZGFgY15gXF5fX1pYVltfXVxhYV9dW2BhYmViXlxTXF9gY2RkZmVnZmVmZV5lZmhoZ2RkYFtmZ15haGhiaGhmY2BiYGNiX19fXV1bWltZWFhYVlpWXFpaVlZVTFhXXGdpa2h1eIF2dnZ2dnZ2dnZ2dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6e3p6ent7e3t7e3t7e3t7e3t7e3x7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHt7e3t8fHx8fHx8fHx8e3t7fHx8fHx7e3t7e3t7fYmIhoqHhYKBgoOCg4OCgoKCgoKCgoKCgoGAgYCBgICAgYCBgYGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t6e3t7e3t7fHx8fHx8fHx8fHx7e3t7e3t7e3t7e3x7e3t7e3t7fHx8fHt7e3t7e3t8iYmHiYaFgoGCgoGCgoKCgYKCgoKCgoKBgYGAgICAgICAgIGBgYB9fHx8e3x8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eHh5eXl5eXl5eXl5eXt7e3t7e3t7e3t7enp6e3t7fHt7e3t6enp6ent7fHx8fHx8fHx8fHx7e3t7e3t7fHx8e3t7e3t7e3t7fHx8fHx7fHt7e3uHiYiJhYSDgYKCgoODgoKCgoKCgoKCgYGBgICAgICAgICAgYKBgH58fHx8fHx8fHx8fHx8fHx2dnV2dnZ2dXZ2d3d3d3d3d3d3d3d3d3h4eHh4eHh4eHh4eHh4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t7enp7e3x7e3t7e3p6enp6e3t8fHx8fHx8fHx8fHx8fHx8e3x8fHx8e3t7e3t7e3x8fHx8fHt7e3t7e4aJiYiFhYOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgIGBgYCAfnx8fHx8fHx8fHx9fX18fHaIi4uLi4uLgX19fX19fYSMi4uLi454KSkqKiopKz0/Pj4+Pj5tgH5+f397pdfT09PT1r2GiYmJiYiNsbW0tLSztZWHiYmJiYaz1tLS0tLWun1+f39/f359fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx8fHx8fHt7e3t7hIuHh4aHgoGDg4GCgoKCgoKCgoKCgoGBgYCAgICAgICAgYCBgIB+fHx8fHx8fHx9fXx8fH19doyQj4+Pj5CDfn9/f39+hpCPj4+Pk3kZGhoaGhocMTMzMzMzMmqCf4CAgHut6eTk5OToyomMjIyMi5G7wL+/v7/BmoqMjIyMiL/p5eXl5enHfX5/f39/f319fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e3uCjYeIh4eDgoSCgYKCgoKCgoOCgoKCgYGBgICAgICAgICAgICAgH58fHx8fHx8fXx8fH19fX12eHh4eHh4eHd3d3d3d3d4eXl5enl5d29wcHBwcHBycnJycnJyd3p5eXp6en6Dg4ODg4SBfHx8fHx8fYCBgYGAgIF+fHx8fH18gYSEhISEhYJ8fX19fX19fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e4CMhomHh4SDhIKCgoKCgYKCg4KCgoGBgYGBgYCAf4CAgICAgICAfnx8fHx8fHx8fX19fX19fXZ2dnV1dXh2dnZ6e3h7eHd2eHt3eXp6fnx5eXh4eHh5eXl5enp5eXl5enp6eXh4eXl5eXl7e3t7e3t7enp6enp5enp7e3t7e3t6enp6enp6e3x8fHx9fX19fX19fX18fH19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8f4uHi4qIhIODgoKCg4KBgoKDgoKCgYGBgYGAgIGAf4CAgH+AgYF+fX18fHx8fHx9fX19fX19d3d3dnZ3fXh3d316eH14d3d5fHt8enl8e3h3d3d3eHh4eHh5eXl5eXp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fHx8fHx8fHx7e3x8fHx8fHx8fHx+iomMjImFg4SEgoKDgoGCgoKCgoKBgYGBgYCAgICAgICAf4CAgH19fXx8fH19fX19fX19fX13d3d3d3p9eHt4fHx3e3h3d3d8fH19eXt6eHh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fX19fXx9fX19fX19fX19fX19fHx8fHx8fHt7fHx8fHx8fHx8fH2Kio2NioWDg4OCgoKCgYGCgoKBgoGBgYKBgIGBgICAgIB/gIGAfXx9fX18fX19fX19fX19fXd3d3d3fX55d3d4e3p8eXd3d3p8fHx6fHl4eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt8fHx8fHx8fHx8fHx8fH19fX18fH18fH18fHx8fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8foqJjo2JhISEg4KDgoKBgYKBgoKCgYGBgoGAgYKAgICAgH+BgIB8fH19fX18fX19fX19fn5+d3d3d3d5fHl7eHx9eXt5enp6fXx8fXp8eHh4eHh4eHh4eXl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt7fHx7fHx8fHx8fHx8fXx8fX19fX19fXx8fHx8fHx8fXx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx/iIeNioeFhoaDg4ODgoGBgoGCgoGBgYGCgYCAgoF/gICAf4CAgHx8fX19fX19fX19fX5+fn53d3d3d3Z4eHl3eXp4enh5eXl7eHp7eXl4eHh5eXh4eHh5eXl5enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX18fH18fH19fX19fH19fX19fHx8fHx8fHx8fHx8fX+HiIyIhoeHhIKDhISCgYKBgYKCgoGBgYKBgIGBgYGAgIB/gIGAfHx9fX19fX19fX1+fn5+fnd3d3d3d3d3d3d3eHh4eHh4eHh4eHh5eXl5eXl5eXl5eXl6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fHx8fX19fHx8gIeIi4eHiYaDg4SDg4KBgYGCgoGBgYKCgYGBgIGBgYCAgICBgX97fH19fX19fX19fn5+fn5+d3d3d3d3d3d4eHd4dnl5eHh4eHh5eXl5eXl5eXl5eXl5enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fH19fXx9fXyBhoqKiYmIhIOFhISCgoGBgYGCgYGCgoGBgYCAgYGAgIGAgIGBf3x8fX19fX1+fn5+fn5+f394eHd4eHh4eHZxZGpeam15eXl4eHl5eXl5eXl5enp6enp6enp6enp7e3t8e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIGFiYqJioeEhYWEg4KCgYGBgoKBgYKBgYGBgYCBgYCAgYCBgIF+fH1+fn5+fn5+fn5+fn9/f3h4eHh4eHh5bWRiZV9fXm95eXl5eXl5eXl5eXp6enp6enp6enp6e3t7e3t7fHx8fHx8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goWKiomJhISGhYSDg4KBgYKCgoGBgoGBgYKBgIGBgICAgICBgH58fX5+fn5+fn5+fn9/f39/eHh4eHh4eW5kZWdlZGJeZnh5eXl5enp6enp6enp6enp6enp6e3t7e3t7e3x8fHx8fHt8fHt7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChouJiIqEhYaEg4OEgoGBgYGCgYKCgYGBgYCAgYGBgIB/gIGBf3x8fn5+fn5+fn9/f39/f394eHh4eHl3Z2VkZWZkZWFfaXl6enp6enp6enp6enp6ent7e3t7e3t7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHt8fHx8fHx8fHx9fX19fX19fX19fX19fXx9fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4eJh4SEhoSDg4WBgYGBgYKCgYGBgYKBgICAgYGAgYCAgYF+fHx/f35/f39/f39/f39/gHl5eXl5eWtlYWJlZWFlZV5ieHdze3p6enp6enp6enp6e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fH18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19g4aLhoiFhYaEgoOEhIKBgYGBgoKBgYKBgYGAgYGBgYGAgIGBgn98fH9/f39/f39/f3+AgICAeXl5eXl0Y2NlZGNmY2doZGZsZF5ze3p6enp6enp6enp6ent7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn6DhouGhoaGhYODg4SDgYGBgYGCgoGBgYKBgYCAgYGBgYCAgYGBfnx8f39/f39/gICAgICAgIB5eXl6d2RhY2diYmRdW2VfYV1eYGFoeHp6enp6enp6enp6e3t7e3t7fHx8e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+foSFi4eGhoaGhIODg4KBgYGBgoKCgYKBgoGAgIGBgYGAgYGBgYF+fX1/gH+AgICAgICAgICAgHl5eW9vYmJiZF5jZ19dYWFgXF9kYlttfHp6enp6enp6enp7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7fHx7e3x7fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5/hIiLhoSHhoaEhIODgoGBgYGCgYGBgYKCgYCAgYGBgYGBgYGBgX5+fYCAgICAgICAgICAgICBeXpwXWJlZGJkXmZnZ2BZYmJhY2VfXF1ze3t6enp7e3t7e3t8fHx8fHx8fHt7e3t7e3t7e3t7e3t7fHx8fHx8e3x8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fn19fn5+fn5+fn5+fn5+foCFjIqEhYaGhYODg4SCgYGBgYKBgYGBgoKCgYCBgYGCgICAgIGBf35+gICAgICAgICAgIGBgYF5emxiZGdjYmdmYWBgZGFiZWRjZGNeXGJ1fHt7e3t7e3t7e3x8fHx7e3x8fHx7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/gYeMiYWGhoeFg4SDgoGBgYGBgYKBgoKCg4KBgIGBgYKBgYGCgoF/f36AgICAgICAgIGBgYGBgXp7dGdnZmZkZGZmYF5fYWNlaGRlXmJkYHR8e3t7e3t7fHx8fHx8fHx8fHt7fHt8fHt7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f3+CiYqIhoaIhoWDhIOCgYGBgYGBgoGBgoKCgoGAgYGBgoKBgYKCgX9/f4GBgYGAgYGBgYGBgYGBenptaGNjZ2ZnZWdmZmdiZWRlYmdbYmVgdnx8e3x8fHx8fHx8fHx8e3t8fHx8e3x8fHt7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f39/f4SJioiGiYeFhYSEg4KBgYGBgYGCgYKCgYGBgYGBgYKBgoGBgICBgH9/gYGBgYGBgYGBgYGBgYF7emlpZGNqZmFgZmVjY2NnaWRjYmBiZGJ0fXx8fHx8fHt8fHx8fHx8e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f39+fn9/f39/f39/f3+AhIqMiIeJhoSFhYOCgYGBgYGBgYKBgoGBgYGBgYGBgoKBgYGBgYGAgH+BgYGBgYGBgYGBgYGBgXZzZWRnY2RmZWJlZmdkZmhmZWNgYGNkYHF9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fXx8fHx8fHx9fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/fn5+f35+f39/f39/f3+AgICFioyJiIqJhoaDgoKCgYGBgYGBgoGBgoGBgYGBgIGBgYGBgYGCgX+Af35/foCCgoKCgoKCgoKCc3NnZWRkZWlqaGZnZ2NhZmZlZmdmZWVjdX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fH19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gICAgICAgIWLioqJioeHhoSCgoGBgYGBgYKCgYKBgYGBgIGBgoKBgYGBgYGAf4B+dHRzdX1/goCAfn5/gYB0cmdkZWNmaWppZWNlY2BmZGRnZ2JiZWFwfXx8fHx8fHx8fHx8fHx8fHx9fX18fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f39/f39/f4CAgICAgIB/houLiouLh4eHhIOCgYGBgYGBgYKBgoKBgYGBgYKCgYCBgYGBgoCAgH5zc3NzdHV4dXV0dHV2dXVwZmNmZWhoaWdoZ2VmZWJfZGVmY2BiZ3d8fHx8fX19fX18fHx8fH19fX19fX19fXx9fXx8fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gIB/f3+AgICAgICAgICHjIyIi4qHh4eEhIKBgYGBgYGBgoGCgoGBgICBgoGBgYKBgoKCgYCAfnNzc3Nzc3NzdHR0dHNzdW9jY2FnZWhoZ2pmZGVnZmhmY2JlYl5ieX18e3t8fX19fX18fHx9fX19fX19e3x9fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn9/fn5+fn5+fn5/f39/f4CAgH9/gICBgICAgICAgYCAf4CAgYGAgIeLi4iNiYiJhoSFgYGBgYGBgYKCgYKCgYGBgIGCgoGBgYKBgoKBgIB+dHNzc3Nzc3Nzc3Nzc3N1cmdlZWRlamhoZ2ZpaGdjZWViZGNoZGd7eHVzc3R2dnl4dnR0dHZ3d3d2dHR0dXV4d3h4d3d6e3x9fXx9fn5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f35/f39/gH9+fHt7fX58eXl2dnZ5fHx6end2d3l7fXt4hIyMioyHh4iEhYSBgYGBgYGBgoGBgoGBgYGAgYKCgYGBgoGBgoGAgH51c3Nzc3Nzc3Nzc3Nzc3VzaGVnaGVrbGhqZ2lqZ2dnZmRkYmVkbnV0dHNzdHNzc3Nzc3Nzc3Nzc3NzdHNzc3Nzc3Nzc3N0dHV1c3V3eHl7fn59fn98f39/f39/f39/f314fH5+fXx4dXZ3eXd4dnRzc3N0dXRzc3Nzc3NzdHNzc3R0c3R0dHODjI2KiYeIhoOGg4GBgYGBgYGBgYGCgYGAgYGDgoKBgYCBgYGBgICAf3VzdHRzc3Nzc3Nyc3NzdnZpY2hqaGpsZWZpbGhgZmVkY2BkZGZ0dXV1dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHRzdHRzc3Nzc3R2dnV1d3V4fH9+fX9+fHp4dXN0dXV1dHNzc3Nzc3N0dHR0dHR0dHR1dXR0dHV1dHR1dXR1dXV1dIaMjYuIhoeEhIWCgYGBgYGBgYGCgoGAgYCBgYKCgoGBgIGBgYGAgIB/dnNzc3Nzc3Nzc3Nzc3N2dnNnZ2pmaGdmaGhmZGlnY2NnZWVmcHZ1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dHR1dHR0dHR0dHRzdHR0dnV1d3Z0c3R0dHR0dHR0dXV1dXV0dXV1dXV1dXV0dHNzc3N0dHNzdHR0dHR1dXR1iY6MjIqHh4SEhYKBgYGBgYGBgYKCgoGBgICAgoKCgoGBgYGBgYCAgH93c3Nzc3NycnJyc3NzcnZ2dW5kXWNnZWlraGVoZ2dqamlnZXB2dXV1dXV0dHRzdHR0dHR0dHV1dXV1dXV0dHV1dHR1dXV1dXV1dXV1dXR0dHV1dXV1dXV0dHV0dHV1dXV1dXV1dXV1dXV1dXV1dXV0dHNzc3Nzc3N0dHNzc3Nzc3R0dHR0dHWKjoyMiYaGhIeFgoGBgYGBgYGBgoKBgYGAgYGCgYKBgYGBgYKBgICAf3hzc3Nzc3JycnJyc3NzdnZ3d2liaGhnamtpaGZkZGVmaWhwdXR0dHRzc3JxcnJ0dXV0dHR0dHR0c3NycXFxcXNzdHR0dHR0dHR0dHV0cnJyc3R0dHR0dXV1dXV1dXR0dXR0dHR0dHR0dHR0dHR0c3Nzc3Nzc3Nzc3Nzc3N0dHN0dHR0dHR0dYuOjImGhYWFh4SCgYGBgYGBgYGBgoKCgYGAgIKCgoGBgYGBgYGBgIB/eXNzc3NycXJycnJzc3N3d3d3bGpoZGhpa3Z6a2VmZWhnbXJzdHN0c3JwcHBxcnN0dXR0c3NycnNycXBvb29vcHFzc3NycnJyc3R0dHNxcHFyc3R0dHR0dHRzc3Rzc3NzdHR0dHRzdHR0dHR0dHRzdHR0c3NycnFxcnJzc3Nyc3NzdHR0dHN2jZCMh4eFhYSEgoGCgoGBgYGBgYGCgoKBgYGAgYGCgoGBgoKBgYGAf395c3NycnFxcnJycnNzc3d3d3dzc2pnaWloeX99cW51bG5wcXJycnFxcG9wcXFxc3Rzc3NycXFwcG5ubm1ubW5ubnBxcnJycnJycnJzcXBvb3BxcnJzc3JxcnJycnJycnJycnJzc3Jzc3Nzc3Nzc3Nzc3Jxb29ubm9vcXJzc3Jyc3NycnNzcnaPj4uHhoWFhYOCgoKBgYGBgYGBgYGBgoGBgYGCgoKBgoGCgYGCgX9/f3hxcHBwcXFycnJyc3Nzd3d2dnd2cnF0c252f352c3hwcHBycnJycXFwcHFxcXFyc3Nzc3FwcXBvb25ubm5ub25vcHBxcXFxcXBwcXJwb25vcHFxcXFxcHBxcXFxcXJycnJycnJycnFxcnFxcnJycnFwb29ubm1ubW5vcXJycnJycnJyc3JxeI+OjYaDg4aEgoOCgoGCgYGBgYKBgYGCgYGBgYKCgoKCgoKBgYKBf4B/d29wb3BxcnJyc3Nzc3J2dnZ2dnZ3dnZ1c3l/fnd3d29wcXFxcXFxcHBwcXJxcnJzc3JycXBwb29wb29vb29vb29wb3Bvb29vcHBxb29vcHBwcHBvcG9wcHFycXFxcnJycnFxcXFxcXFxcHBwcHBxb29ubm5tbW5tbm9wcXFxcXFxcXFxcXB7j42NhoODhYOCgoKCgYKBgYGBgoGCgYGCgoGCg4KBg4KBgYGAgYF/f392bm9wcHBxcXFxcXBwcHZ2dnZ2dXR0c3NxfYB9fX9zb3BxcXFwcHBwcXFwcHBxcnJxcXFwb3Bvb3Bwb29wcG9vb29vb29vb3BxcXBub3Bwb29wb29wcnJycnFxcXBxcnFwcXFxcHBwcHBwcHBwb29ubm1ubm5ubm9ub3BwcHFxcXFxcXFxcIKRjoqEhIOFhIOCgoGBgoKBgYKBgYGBgYGCgoKCgoKCgYGBgYCBgX9/gHVvb29wcXFxcXBwcHBwdnZ2dXRzcnJycnGAgoCBeXBwcHBvcHBwcHFxcXFwcXFxcXFxcG9vcHBwcHBwb3BxcHBvb29wb29vcXFwcG9wcG9vb25vcHFxcHBwb3Bvb3BwcHBwcHBwcHBvb29vb29vbm5tbW1ubm5ub25vb3BvcHBwcHBwcHBwiZCMiISDhIaDg4KCgYGCgoKCgYGBgYCAgYGBgoKBgYGBgYGBgIGBgH+AdG5vb3BxcXFwcG9vcG92dnVzcnFxcXFxcICDg39ycHBwcHBwcHBwcHFxcHBxcXFxcXBwcHBwcHBwcHFwcHBwcHBwcHBvcHBxcXBwcHFxb29vbm9wcHBvb29vcHBvb3BwcHBwcHBwcHBvb29vbm5ubm5ubW5ubm1ubm9wcG9vb29vb3BzcXWPj4uJg4KFh4ODgoKBgoGCgoKBgYKBgYGBgYGBgYGBgYCAgYGAgYGAf4B0b29vbm9vb29vb29vb3Z1dHNxcXFxcXJygIKCgXRxcXFxcXFxcXFxcXFxcXFxcXBxcXFxcHFwcXBxcXFwcHBwcHFxcXBxcHBwcXBwcHBwcHBwcHBwcHBwcHFxcXBxcHBwcHFwcHFxcHFxcXFxcXJxcnFwcnRycnR0dHR1dnRzdHR0dXd3gpCPi4iDgoaHhISCg4GBgYKCgoGBgoGBgYKBgYGBgYGAgICBgYCBgYB/gHVvb29vb29vb25vb29vdXRzcnJycnJycnKDg4OCdnFycnFxcXJxcnJxcXJycnFxcXFxcnFxcXJycXFycXFxcXFxcXFxcXFwcXFxcXFxcnNzcnJyc3V1dHR0dHR0dHV2d3d3d3d3eHh4eHd3eHh4d3Z3dnV2dnZ2d3h6e3x7e3t6enp6enyGkI2LiIODiIeHhYODgoGCgYKBgYGBgYKCgoGBgYGAgYCAgYGAgIGBgH+Ad3FxcXFxcG5ucG9wcG92dHV1c3Nzc3NzdYiDgoN5cnNzcnJyc3Jyc3NycnJycnN0cnJzcnNzc3Nzc3Nyc3N0dHV1dXV1dHV3eHd3d3d4eHh3eHh4eXl5eXl4eHl5eXp6e3t7e3t6enp5eXh3d3d1dnV2dnd5enp7fn5+fX1+fn5/f35+gIyQi4qHg4WIi4iEg4SDgYGCgYGBgoGBgoKCgoKAgYGBgYCBgYGAgIGAf4B8enp5eXx5eHh2dXZ2dHl2d3h3d3Z3dnZ6f3x+fnx2dnd3dnV4enh4eHh3d3d2eHx5eXx6eXl8e3l5eXh4eXl6enl5eXh4enp5eXh4eHh3dnd3eHh3eHh5eXp7e3p8fH1+fX9/f359e3t7e3p5enl5e3t/foB/fn5/fn19fX5+f35+fn6AjpCNioeEhoqLiIaGhIOBgoKBgYGCgYGCgoKCgoCBgoKBgYGCgYCBgIF/f4B/fn19fX9/f318e3t7eXh4eHh5eXl4eXh5eXl4enp6enp6e3t7fH1+fHt7ent8e318e3t7e3t7enl4eXh4ent6enp5eXp8fHt6enx8fHp6ent9fHx+fn+AgoGAgYKAgH9/gYGBgIB/f35+fn5/fX1+f4CAf35+f39+fn9/f39/gH+Af4OQjoyHhoWIi4yIh4aFg4GCgYGBgYKBgoKCgoKBgYKDgoGBgYGBgIGBgIB/goOCgoGBgX99f39/f4F6enh4d3h4eHh5eHh5enp5e358enx9fXt8fX19fHx8fnx9fn5+fn59fX9/f3x8fYGDgYCAf318fXx9fXt9fXx8fH19fX1+gYGChISDgoB/gYGBgH9/f4B/f39/f39+fn9/f39/f35+f3+Af39/gICAf4CAgICAhJCPi4eGhoiLi4mKhYaDgoKCgYGBgoGCgYKBgYGBgoOCgYCAgYGAgIGBgH+ChIKCgICAgH9+fn+AgH9/fn18fX19fYB/fX+Af35/gH9/fn9/gIGBgICAf3+BgICAf4CBgn9/f4CAf35+f39+f39/fn5+f39/gYB/f4CBgYCAgYOEgoGCgoGCgH+AgYCBgYGAgH+BgICAf39/gICAgYGBgIGBgYCAgICBgoGBgYCAgYGFjo6MiYaHiYyLi4qGhoOCgoKBgYGCgoOCgoKBgIGBgYKCgICBgYCAgYGAf4KFg4KBgYCAf39+fn+AfX5+fn19fX5/fn9/f35+fn+AgYCAgICAfn9/fn+Af3+AgH9/f35/f39+fn59fn9+fn9/f35/gIGBgoKDg4KCg4KBgYKDg4OCgYGBgYKBgoKCgYKBgoGBgYGBgoKCgYGCgYKCgoGBgoKBgYKCgoKCgYGBgoKCgoaPkY+KiImKjY6NiYaFgoKCgoKBgYKCg4KCgoGBgYGBgYF/gIGBgYCBgIF/gYWEg4KCgoGCgYCAgIB8fHx7fH18fH9+fn9+fn5+f35+f39/f39/f35+foB+fn5+fn9/f39+f39+fn5/gIB/gIB/f39/f3+BgYGCgoCAgYKDg4SDg4ODgoKCgoKCgoKCgoKCgoGCgoKDg4OCg4ODgoKCgYKCgoODg4ODgoKCgoODg4KCh5KTkIuKi4uPj42Kh4SCgoKCgYGBgoKDgoKBgYGBgIGBgICAgYGBgIGAgYCAg4SDg4OEg4ODgoKCgXx9fHx9gn1+f4GCiIGCgoSCgYGDg4GBgYKDgYKBgYCAf39/gICAf3+AgX9/f39/gYCAgICAgH9/f3+AgICAgH9/gYODhYSEg4SDgoKCg4OCgoOCgoODg4ODg4SDg4KEhYWDg4SEgoKDhIOCg4ODg4OCgoODgoCKlJOPioqMjpCPjYuGg4KCgoKBgYGBgoOCgYGBgIGBgoGBgICBgYGAgYCAgH+BgoODg4SEhIOCgoKCfXx8fn6AgYOAg4OChIaFhoaFhIWFg4ODg4SBgYKEhIKDgoeDgoKAgoGBgoKCg4KCg4KDgoODgoGAgIKCgYOCgYKCg4OEhYWEg4OChISEhIOEhISDg4OEg4ODg4OEg4SDhIWEhISDg4ODgoKCgoKCgoKBgYKCgo+UlI+Njo6RkY6KiISCgoKCgYGBgYGCg4GBgIGBgYGBgYCBgIGBgYCBgICAgIKChIKChIOCg4ODgoJ9fX2AgH+AgoGDg4ODhIaEhIOEhYWDg4GBg4OBgIKDgYKFhYWFhoaHhoWGhoeHh4aGhoeHhoaEgoGCg4SDg4ODg4ODhISFhYWDhYSFhISEg4KBg4OCg4SEg4KCg4SCg4ODg4OCgoKCgoKCg4OEhIOFhYWFhoaIk5OTkI+Pj5KRjIqIgoKCgoKBgYGBgYKDgoKBgIGBgYGBgICAgYGBgICAgICAhISEgoKCgoGBgoKBgX+AgYOCgICAf4CCgoGDg4KCgYODg4SDg4KDhYSCgYGBgoSFh4eHh4aGh4eHiIiHh4eIiIiFhIOBgIGBgoKCg4GCg4SEhYSDg4OEg4OEhIOBgYGCg4OEhISDg4ODg4OEhIODgoSDg4ODhIWFhoeHh4eIiIiJiY6TkpKOj46Qko+LiYeCgoKCgoKBgYGBgoKCgoGBgIGBgYGAgICAgYGAgIGAgICDg4KCgYKCgYGAf4CBhYWFhoOCgYB+fn+BgoSCgYKDhIOCg4ODg4KChISDg4OBg4SFhISFhYSDg4SFhYKEhIWFg4KBgH9/gIB/gIGEg4OEhYWEgoKCgoOCg4OFhIKDhISEhYaGhoaGhoWFhoeHhYaIh4aHiIeGhoaIiYeGhYaGhoeIkZKSj46QjpCRjImHhYGBgoKCgoGBgYGBgoOBgYGBgYGBgICAgICBgYCAgICAgISEg4KBgoGAgYGAgYKIh4aHhYSCgH99fX6AgH+AgYGBgYGBgoGBgoSBgoGCgoKBgYGCgYKCg4GBgICAf4GAgH+AgH9+gIGBgYKCg4OEg4OEg4OCgoGBgoODg4SEg4SEhIOFhYaFh4eIh4eHh4eHh4eGhoaGh4WFhYaGhIWEhIWEhYaSk5GOjo+OkI6JiIeEgYKCgoKCgoGBgIGCgoKCgoKCgYGBgYGAgYGBgICAgYGAgoSDg4KDgoGCgYKDg4iHh4iHhYSCgX5+gICAfn5/f4CBgYGCgoGIkYKCgH+AgIB+gIKBgIGCg4OAf39/gICAf4CAgICDg4KDg4ODgoOBgYKCgoOCgYKCgoOCgoSDhISDg4SEhYWFhYaGhoaFhISEhYWEhIWFhYSEhISDhISEhISEipSTkpCQj46NiIaFhIOBgYKCgoKCgYGAgYKCgoKBgoKBgYCBgYCBgYGAgICAgYGAg4OCgoOCgoKBgoOCiImJiYiHhYSDgYKEhIOBgoKCgoSCgoOCgouYh4WEgoSCgX+AgoGBgoGChIOBgYGBgoOCgoGDg4SDg4SEg4OCg4KDg4ODg4KCgoKCgoGDhISEhYSFhYWFhIWEhIWFhYWDg4OEhISEhYWFhISEhISEg4ODg4OOlZKQkZGOjYyHhYODg4GBgoKCgoKBgYCBgoOCgYCCgYGBgICAgIGBgYCAgICBgICDhYSEhIODg4SDhIOGh4mIhoWDhIODg4WDgYCDgoSFhIOBf358iJuLg4SFhISEgoGAgYKDgoKEg4OCgoGBhIWEg4ODgoKDhISDg4ODg4SFhISDg4KCgoKCgoSEhYSFhYWFhYODhYWFhYaFhoWEhIWEhYWGhYWFhIWEhISDhIODhJGUk5KSj4yMioWEhIODgYKCg4KCgoKBgYGCg4KBgYKBgYGBgICBgIGBgH+AgIGAgYaGhoaGhoaHh4aGhYSDhYaCgIGBgYGHgoB+f4GAg42Ffnx+f39/mY+BgoKBgYKCgYCCgoKCgYKDg4GCgYKDhYODg4KDg4OEgoKEhIOEhIWEg4OCgoKCgYKCg4ODg4SFhYWFhIOEhYWGhYWEhISEhIOEhIWFhYWFhIODhIOEg4KGlJSSlJKPjYuHhISEg4KBgoODgoKDg4GBgoKBgoKCgYGCgYGBgYCAgYGAgICAgICAhYWFhYaGh4aGhoWGg4ODg4GAgoKCgYKAf35/f4CDlop9gH+Cin+NjYGBg4GBgYGChIOBgYKBgYKBgYKDgoODgoOCgoKCg4OBg4SDg4ODg4OEhIKCgoKDgoKDg4ODhIWEhISEg4OEhIODg4OEhIODg4ODg4SDg4ODg4KDg4KDgouUk5KTkY2NioaDg4OEgoGCg4ODg4ODgoGBgoGCgoKCgoKBgYGBgICBgYCAf4CAgICDhISFhYSFhYWEhIWCg4KDgoKDg4OBgICAgICAgIKajYKLgoKDgH+Eg4OEgoODg4KAgICCgoKDgoKDg4ODgoODhIKCgoODgoKDg4KCg4KDg4WEg4ODg4SDg4SEhISEhYWEhIWEg4SEg4OEhISEhISEg4SEhYSDg4SEhIODgoKDkJSSkpKPi4yIhoSFg4OBgYKDg4ODg4OCgYGCgoKCgoKDgoCBgoGAgICAgIB/gICAgISDhYWEhYWFhYSFhYOEhIWDg4SEhIKCgoOCgoSCgpiMhIWHh31/foCGhYWEhYJ/fX19f4KEg4ODg4OEg4ODhISEg4OEhISEg4SEhIOEg4OFhoWFhYSEhoWFhYSFhoWGhoWFhYWFhYWFhYWGhoWGhoaFhoaGh4aFhYWFg4SEhIeTk5KRkoyKiIWFhYWCgoGBgoODg4OCg4KBgYKDg4ODgoKBgIGAgICAgICAgH+AgICAhYWFhYWGh4eGhYWFhISFhYSEhISEg4ODg4OEhYSDkoiBgYCEf39+fYWHhoOAfn9+fn9/f4OEg4OEhISEhISEhISEhISFhYWEhYSGhYWGhYaGhoWGhYWHhYWGhYaGhoaFhIWFhYWFhIWGhoaHhoaGhoaHh4iIiIaFhYaEhYWGjZSTkpGQi4qHhoeGhIGCgYKDg4ODg4KDgoGBgoODg4KAgYGBgICAgICAgICAf4CAgICHh4eGhoeHiIeHhoaEg4ODhIODg4OEg4ODg4OEhISGg4GAhIyCfn19gYaBf39/f39/f35/gISFhIWGhoaFhYWFhoaHhoaFhoWFhoeHh4iHh4eGhoaHh4eGhoaGhoaGhYSDhIWFhYSFhYaGhoeHhoaGhoeHh4eIiIeGhoaHh4eRk5KQkZCLiIiFhoSDgoKBgoODg4ODgoKDgoKCgoOCgYCBgICBgICAgIGAgIB/gICAf4aHiIeHh4eIiYmIiIODgoKDgoSEhIWEg4KCg4SEg4OCgIGFhIOCgH5+gH9/f39/gIB/f4B/f4WFhoeIiIeHh4eIh4iHiIiIhoaHiIiJiYmIh4aHh4eIiIaHhoeHhoaFhIOEhYaFhYWFhoaGh4eFhoeGh4aGh4eHh4eHh4eFh5OTkY+RkIuHhoWGhIKCgYGCg4ODg4ODgoKCgoGCg4KCgIGBgYCAgICAgICAf3+AgYB/hoiIiIiHh4iJiYmIg4KCg4ODhIWHh4aFg4OFhISEg4GAg4WDgoOCgYGCgYGBgYB/gH9/fnt6gIaIiIqKiYmIiImJiYmKi4qIiIiJiouLioqIiIeIiIiHh4iIh4iGh4aEg4OFh4eHhoWFhISDhYWEhYWGhISEhYWFhoWGhYOJlJOQj5GOioaFhoWDgYGBgoKDg4ODgoKCgoKCgoKCgYGBgYGBgYCAgICAgIB/gICBgH+GiYiIiYeIiImJiIiEgoKDg4KDhImKh4aEhIWEg4ODgIGFhISCgoKCgoKCgH9+fH19fX9+fHt8g4eJi4uKioqIiIqJiImLiomJiImIioqJi4mHhoaGh4WGiIiJiIeGh4SDgoSIiIiIh4WCgoGDg4KDg4SCgoKDgoGEg4SDgY6TkpCPj4uIhYSGhIKBgYGBgoODg4OCgoKCgoKCgoGBgYGBgIGAgICAgICAgH+AgIGAf4WIh4eHhoeIiIiHh4SCg4OCgoOFiYqJh4WHhYSFhYOChISDhIOCgoKDgX59fX5+fn5+fX1+fX19g4eJioqHh4WGh4eHh4iHh4mGiIaIh4eJiIODhIOFhISFhYaIh4aFg4KCg4WHhoeGhoOCgoOEgoODhIKBgoGBgYODhIOEkZKRjo+Oi4eEhoaEgoGAgYGDg4ODg4KCgoKCgoKCgYGBgIGBgYCAgIB/gIGAf39/gIB/hYaGhYaGhoeHiIeGgYKEhIOChYeIi4qGhIaEgoaGgoKDg4ODg4OCgoF9fH1/gH9+fn59fH19fHp8hIaHhoSDgYODhIWFhYODhYSEhISEhIWEgoKDgYSEgYKDg4WGhYSCgYGCgoODhYOEhIWEhIaDhISFg4KDgYKDg4SFhIeSkY+Nj4yJhoSFhIWCgYCBgYODg4ODgoKCgoKCgoKBgYGBgYGAgICAf4CAgYB/gICAgICDhIWEhYWFh4eHh4aAgYGFg4OEhYSHiIWCgIB/goCAgYODg4ODgoJ/fX1/gICBf31+fn19fX16enp+g4SEgoGBgIGBgoKBf36BgYGCgYOAgoGCgoKBg4SAf4CAgYOCgICAgICBgYGCgYGChIODhYSCg4SDgoKBgoSDhYWGi5ORjo+Pi4iFhYOChIGBgYGBgoODg4KCgoKCgoKCgoGBgYCBgYCBgH9/gIGBgICAgH+AgIKCg4OChIOEhYWGhn+BfoCBgICAgIGDgn9+fn5+fYCCg4OCg4KDgn19fn6AgIGAfn19fX1+fXx6enp/goKAf39/f35/f4B+fYB/f4CAgX+AgIF/f4CAgX59fX+AgX9/foCAgH+AgICAf4CCf4CCgYGCgYGAgYGBgYKEg4aPkpCOj42Kh4eGg4OCgYGBgYGCg4ODgoKCgoKCgoOCgYGCgYGBgICAgH+AgICAgICAf39/gYKDhIGCgoOCg4SFgIB/fH19fn1+foCAf31/fn1+gYODg4KCgYF/fX1+f4CAgH9+fX19fHt7e3p6eXqAgH5+f35+fnx+f35/gH9+f3+Af4GAf359fn9/fn18fn+Af35+f3+Af39/f4B/f39+f4CBf4B+f39/gH9/f4B/hZKSj46Pi4uHiYWEg4KCgYGBgYKDg4ODg4OCgoKDg4KAgYKBgYGAgICAf3+AgIB/gIF/f36BgYSEgYKBg4OCg4OBgH98fn5/fX6Af4B/foF/f4CBhIOCgYB/f359fn5/gICAfn19fX17e3x6enl5eXt/fn5/f39+fX5/foCAf35/f4CAgoB/fH5+f35+fXx/f4B/fn9/f4B/f35/foCAfn2Af39+fn5/f35+f318fH2Fk5KOjIuKiImIhISEgoKCgYGBgoOCgoODgoODg4ODgYCBgYGBgYCAf39/f4CAgICAgIB/foCBhIOCgYGDhISDhICBgICBgIGAgYKCgoGBgoCBg4ODgYGBgYCAfX19fn5+f359fX19fXx8fHt6eXl5eX2Af4CBgYF/f4B/f4F/gICAgYGCgoB+gH5/fn5+foGAgYF/f39/gIB/f39/gYB+f4CAfn9/fn+Af31+fX17fIaTkYyLioeHioiGhoSDgoGBgYGCg4ODg4OCg4OCgoKBgICBgYGAgH9/f39/gICAgICAgH9+fn+BgYGAgISGh4aHgoSDhYOBg4ODhYSEhISEg4ODhIKCgoKCgX5+fX19fn6AfX19fX19fX19e3p6eXl5eYCCgoKEg4CCg4F/gYCBgYGDgoODgYGCgIGAf4CBg4GEgoCAgYCBgYCAgYCCgn+BgIF/gIB/gICAfn9/fnx8ipOQiomIiIiJiIaGhoSCgoGBgoKDg4ODg4KDg4KCgYCAgICBgYGAf39/f4CAgICAgIGBf359fn5/f39+g4aHh4iChYSFg4SFhIWGhYaGhoWGhYGBg4ODgoKAfX19fX19fn59fX19fX19fX18e3l5eXl4fIKDhIWCgYSDgoKDhYaCg4SDgYKCg4OCgoKCgYKFg4iFgoGBgYKCgYGBgYSDgoOCgoKCgYGBgIF/gIGAf36Ok4yHiIaIh4aGhYaGhIKDgoGCgoODg4ODg4OCgYGBgH+AgYCBgYB/gH9/gICAgH+AgYB/fn19fX5+f36Ag4SHiISGhoaFhoaHh4aHh4iHh4eGf32BgIGCgX59fX19fX19fX19fX18fH5+fnx7eXh3eHl5gIODf4ONhIOEhISXl4ODhIF9foGCgoGCgYKBg4aIjIWDgoKBhIKEg4KDhYSEhYOCg4OCg4OCgoKCg4OCgpKQi4iJh4mHhoaEhoWEhISCgYKCg4ODg4ODgoGBgYCAf4CBgIGBgH9/fn+AgYCAf4CAgH9/fn1+fn+Bf4CCgYWFhYaGh4eGh4eIhoaHh4eGh4V+fX18fX9+fX19fX19fX19fX19fXx7iJKCe3x6fIZ5eHl8gYF+iZaEg4OEhJSTgIGBf39/fn6Fi4B/gICEhpCJhYSCgoGFhYuDgYKFhYaGhIOFhYOEhIODhIOFhISIko6MiYiIiYeHh4WGhYSFhIKBgoKDg4ODg4OCgYGBgYCAgIGAgICAf39/f4CAgICAgYGBf39/f4CAgIGBgYGBg4OGh4aGh4aGiIeGhoaFhIOFhH59fHx8fX18fH19fX19fX19fX18fH+RlZaDe3qElHx4eXp7fICCg4GBgIOCgH58fn57iJF8fI6Wf31/f4KGioWDg4SDgYONiX9+f4OEhYWDhYaFhIWFg4SFhYaEhI6Rj4yKioyJiImHhYaFg4OCgYGCgoKDhIODgoGBgICBgICAgYGAgIB/f3+AgIB/gICAgX5+f4GBgoKCgoODgoOCgoWGhISFhYSGhIOEg4KBgIKAfn19fHx9fXx8fH18fH18fX19fHx8e4uRl4x6e3yBenp6e3x5eX19foB/gH98e3t+fn2ClZF/hIh+fH5/goR8fIGChIKAf4eDfYKBf4KCgIODhISEhISChIOEhYKEkZGOi4yMjoqJiYWFhYODgoKBgoODgoKDg4KCgYGAgIGAgICAgICAgH+Af3+Af357gICBenyAgYKDhYODhYWFhYODg4SCgYKDgoOCgoGBgIB/gX5+fX59fHx8fHx8fHx8fHx8fHx9fHx8fn6Kgnt6e3p4ent7fH17fn1+f319fX18fH+BgX2Gj4F+fYJ+fn6Agnx8f3+CgIKAfnx7ioJ9gH9+gYCAgYKBgoCAgIGAf4uTj4yLjY6NiIeHhYWEhIOCgoKCg4OCgoODgYGBgICAgICAgH9+fXx7fHx9f3+AgHx6gYF4e4CCgYOFhIOFhIaHhISAhpSIgIKBgYGBgH9/f39/fn5+gHx8fHx8fHx8fHx8fHx9fHx8fHx8fHl7e3t4eHl7enp8gX+Afn+BfH5+f399gIKCgICAgX+CkYF/f4CAfoB+fn9+gIGBfX19e319fXx9fHx9gH+AgH6Afn6ClJGMjI2NjoqFhoaFhISFg4OCgoODg4OCgoGBgYGAgICBgICAf4CAf39/fXt6fICAgHh+gXd7gIF/gYKCgoKDhoeGhn6IlYp+gYGAf4B/foB+f39/fn+Bfnx7e3x8fHx8fHx8fH59fHt9fHx8e3x8fHp6eXt8en2Fg4J/gYF+f35/gH6FgoF+gH9+foCFhoKAfn6Dhn9+fH6AgIGAf39+fX19fX57fH1/f3+AfX9+gIyRjYuNjo2Nh4SGhoWEhISDg4OCg4ODg4KBgYGBgYCAgYGAgYGBgYGAgH9/f397en9/e3mAd3p/f31+f3+Af4KDhoaFf3+FgX5/gIB/gH5+f31/gIB/gIB/f319fHx9fn18fH19fX19fH58fXx7fXx8ent6fH19f4aEgoCAgX1+fX5/fouEgYZ+fXx8f36CgX99fX19gHx7fXx+gYSDgYB+fn5+fX1/f399foB+fn6Eko2Mi46Ni4qGhIWEhIODg4OCgoKDgoOCgYGBgYGBgYGBgYB/fXx8fH1+f39/f397e399d352eH59fH18fX5+gYGCg4B6fX18fn+Af36Af35/fn+AgH+AgH9/fn9+fn5+fn1+fn99fH59fn19fHt8fHx6e3p9fn+Ag4OCf35/fH18fXx8gYN+jH58e3t9fn1+fn17e3t9fHp7e3uAhoSChIOCf4B+f4KCgn9/goJ/gIqPjIyLjYuKiISEhIOEg4ODgoKCgoKCgoKBgYGAgoGBgYKCf3+AgIB/fn18fH5/fn55fX52e3Z4fXx8fHt9fX6BgICAf31/f31+f39/foB/f39+f3+AgIGBgH99gH9/fn9+fn5/f3yCfn59fX17e319fHp8fH6AgoGAgIB8fH18fHx8fH18fXt/fnt7e3x8fH18e3t7e3x8enp9en6CfoGDhIKBg4GFhoWFhoaHhoGEkY6Mi4qLh4iFgoOEhISEg4KCgYGCgoKBgoGBgYGBgoGBgoKAgYKBgYCAgH9+e3x+fnx6fnh5dnd8fHx7e318f4GAf35/foB/f35/f35/gH9/f39/f3+AgYKAfn6BgIB/f39/f39+fYN8fH19fH99fX19e3x+fn9+fn5+fnx8fHx8fHt+fnt8e3x8fHx9fH18fnx9fHx7e3x5e3x7e317fX5+f4CAg4eJiYmLiYuJhYiRjYuIiYeFhYOCgoOEhIOCgoKBgYGBgYKBgYGBgYKCgoGCgoCAgX98e3p6eXt9enx+fnl8eXh4dHx8fHt8fHx+gH9/f39/gIB/fn5+fX+AgH9/f3+Af4CDgoB/gIGAgIB/f4CAgH58enx9fX59fX5+jIZ9fX57e4OCfX5+fX18fX19fX1+fH18fXx9fX58fn19fX18e3t6fHt8fHt6e3t6enp7fn6ChYiHiIqLi4uJjJCOjYmIhoWEgoKCgoODg4OBgYGBgYGBgYGBgYGCgoOCgYKBgIGBf3+Af356eHl5en5+e3l6eH5zfHx8e3x8fH5+fn5/gH+AgIB/fn9+gIF/f4B/gIGAgoSEgYCAgYGAgX+AgYKBf39+f31+gH57foGRjHx9f4qAjYx+fn19fX59fX59fHx8fX18fXx9fX1+fX1+fnx7e3t8fH18e3p7fHl6eXh5e35/hIOEh4mKiImNj42LiIiFhISCgYKCgoKCgoGCgoKBgYGCgYKCgoGCgoKBgoKAgYGAfoCAf39+e3p5e319eHx6f3KBfXt7fHx8fn59fYGBf4GBgX9/gH+AgX9/gIGCgYGFg4SCgYGCgYKCgICBg4KAf4F/fX6Afnx+f4iCf36DkISEg4F/fn18jYd9fX59fHx/fnx9fXx9fX5+fX5/fX19e3x9fnx8e3x9enp5eXl5e3t+foCBg4eEiI2MioqGhYSEg4KBgoKCgoGBgYGCgoKBgoKCgoKCgoKCgoGCgn+AgIB+f39/fn5/ent5fX16enp9cX6Cent8fX19fXp4f4KAgYKCgICBgIGBgICBgoKCgoaFhIKBgYGBg4F/gIKEgX9+gYB9foF+fX5/gIB9fn+EgH5+f31+fX2KhX1+f31+foB/fX19fH5+fn99f4B9fn18fX9/fHx7fH17e3t6enp7e3x9fn6Ag4CJjYqLh4WFhYSDg4KCgoKCgYGBgoKBgoKCgoKCgoGBgoKBgYKCf4CAgH9/f39+fn59eXp6fXx5d3t0e4d8dHd9fn17e3Z2foCBg4KBgYKCgoKBgYGDg4OChYaEgoCAgICCgX+AgYOBfn6AgH1+gH59fn6AgH+Bfn+Af39/f398f39/f3+Afn9/gH58fX18fn5+foF/gH2CgHx9gIB9e319fXx8e3x8e3t7fHt8fHx9fImKiIiFhYWFhISDgYKBg4KAgIGCg4KCgoOCgoKCgoGCgoGBg4J/gIGAf39/fn5+fn57enp8fHt2e3R3f352cnt+fnt4dnd8gIGCgoKBgoODg4OCgoSDhIOFhoOCgX9/gIOAgICAg4F+foCAfX+AfX1+foCAf4J/gYGAgICBf31/f3+AgIGAgIB/fnx9fX19fn59g32AfoKAfX6AgX98fn59fX17fH58fXx8fHt8e3x9iYWGhYWHhYSFhIKBgoGDgYCAgoKDgoKCg4ODg4KBgYGBgYGCgH6AgYB/fn5+fn5+fn56e3p9goN9dXF6fHpxen59eXh1dICAgoKCg4KDhYOEg4KDhISEhIWEgYGAgH6Agn9+f36Bf35/f4B9foB9fX1+gH9/gYCCgYCAgIKBfn6Af4GAf4CAgH9+fX19fnx+fn19gYR/gH9+f4GBf31/f319fn1+fn1+fHt8enx7eoCGgoSEhYSEg4WDgoKBgYKBgICCgoOCgoOEg4SDg4KBgYKBgYOAfoCBf35+fn5+fX5+fnt7en6Jh354cnl9f3F6eHt4eXV1fYKDgoODg4OFhIWEg4OEhIODhIKBgH+Af4CBfn19foB+fn5/gH19f3x9fX6Af4CAgIKAgIGAgoGAf4B+gIF+gIGAgH9+fn5+fn5/fn6FhYGBgH+Ag4F/foGAf35/f4B/fn17ent6fHt6goR/g4KCgoOCg4GBgYCAgoGAgIKBg4KBg4SDhIKEgoGBgoGCgn9+gIF/fn1+fn5+fX59fXp7fIWEe3tzeXp8cHd1dnd5dXR6hISBhISDhIWFhoSDg4WEgoODgoCBf39/f4B9fX1+gH1+f39/fn1+fH19foF/gIB/gIB/gIGDgoGAf36AgH+AgYCBgH9/f39/f4CAgIGCgoKBf4CDgX+Ag4J/f4B/gX+Af3x7e3p8e3yBgH+Cf3+BgIKCgYF/f3+BgH6BgoKDgYGDg4KEgoSCgYGBgIGCgH6AgH9/fX5+fX19fn19e3t6gH94fHZ5eXtxdHh3dnh1cnmFhYKEhIKEhYWGhISChIOBg4GAgIF+f4B/gHx9fX6AfX5/f39+fX98fn5+gX+Bf39+f4B/gIODg4B/f4GBgIKBgYGAgICAgICAgIGAgYKDgYF/gISBfYGDhICAgX+BgYKBfXp7e3x8fH99f4B8f399fYGAgH59fYB/foKBgYKBgIKCgoKBg4KCgYB/gYKAfn9/fn99fX1+fX19fX19ent7fHZ9eXh5enJ1eXl2d3dzdYaFg4WFgYSEhYSEhIKDgoGDgX+AgX5/gH6AfX19fn9+f4B+fn99f3x/f3+BgIF/f3x+gH6AgYKDgYCAgoOEgoGAgYB/goCAgYGAgYGCg4KBgX+Ag4B+goKEgICCgYKChIJ+e3t8fHx8fX1+fXp+fX14fn9/fHx8fn5+gYCBgYCAgoGBgYGDgoGBf4CAgoB9fn19f319fX59fH19fX16e3p8dnx6d3t4cnZ5e3Z2dnN0hoSEhYSBhISFg4OCgYOBgYOBgIGBfX+BfoF9fX1/f39/gH5+f359fYB/gIGBgX9+fH5/fn5/gYJ/gYGCg4eFgX9/fn6Af4CBgICAgIKCgYCAfoCCf36BgoKBgYOCg4OFgn99fX18e3x8eXp7en55e3l4f357e3t+fX1/f4F/gH6BgICAgoOCgYF/gIGBf31+fH1+fX19fX18fn58fXx5e3x4enx3endzeHd6c3Z2c3SGhISFg4KDhISDgoKCg4GCgoGAgYF8gIB+gH1+fX5/gICAf35/f3x+gH+BgIGAf359f39+fn+BgH2AgIGDg4N/f359fn5+f4CAgIB/gYKBgH9+f4F+f4CCgoCBhIKEhIaEgH59fHx8fHp5dnl5enl2eXZ+fHt7e359e399gH99fX9/f3+BgoGBgX5/gYF+fX18fX19fX19fXx+jYF8fXl7e3p5fHd4eHR1dXhyd3d0doaEhIWEg4ODg4OCgYKDgoGDgn+Bf39/fn+AfX19fX+AgIB/f4B/fIB/f4GAgYCAf3yAf31+fn9/fX5+gIGCgn5/fn1+fn5+f3+Af32AgIB+fn5/gX5+gIKBf4GDgoOEh4SAgH58fXx8e3x1eXl4eHh5d3t8e3p7foV9fn1/ent+fn59foGAgIGAfX6BgH59fXx9fX19fX18e32Dgnx8ent7e3p7d3Z4dXJzdnB4eXJ4hYWFhYOEg4KChIKBgYKBgIKBgIF/fn5+foB+fX58foCAgH+AgX97gH6AgH+BgYB/fYB/fn5/f319fX6AgYGAfn9+fn59fX5/fn9+fH+Af35+fn+Cfn6AgIF/gYOCg4OGhICBfnx9fHx7fHh3e3h1eXd3eXx6e3t9kod9fH13en1+fn19f35+gH98foB/fn19fH19fX19fHt8ent9enp4e3x6ent4dHh1cXJ0cHh4cXmEhYWFg4SDgoODgoGBgoKAgYGAgIB9fn5/gH18fn1/gIGAf4CBgHyAf4B+f4GAf399gH9+f39+fX18gICAgIB+f35+fn18fn9/f358fYB/fn1+gIJ/foCAf36BhIKCg4WFgoJ+fnx7e3x8eXd7eXd4d3d4e3t6e3yFin17end6fH19fHx9fX1/fnx9fn59fXx8fX5+fX18fHt6enx7e3p5enp7enhzd3VxcXJweHdxe4WGhIWDhYKBg4OBgYGBgoCBgICBgH5/fn9/fXx+fYCAgoGAgIGBfX6Af35/gX+Af3+BgH9/f31+fH1/gICAgH9/f35/fXx+f39/f319f39+fn6CgYF/gIB/foGDgoKEg4SCgn5+fHx6fHt7eXt6d3N2d3h5e3p7eXp/fnt7d3p8fXx8fH59fH19fH19fXx8fX19fX99fXx9e3l7fHx8enp6enp6eHN2dXBwcm93dnJ7hYaEhYOEgoGDgoKCgYGCgYKBgYGAf4B/f399fX9+f4CBgYF/goF9foF+foCBf4B/gIKAgIB+fX58f3+BgICAf4B/f4B+fX5+f4B/f39/gH9/f4J/gH9/gIB/gYGAgISBgoKAf39+f3x9fn56fYV+dHx9enp6enx5eXp6hoV3eXx8fHx8fXx8fHx8fX19fHx9fX19fn19fX16eX18fH16enp6enp5c3V1b29xb3d0c3yFhoOEgoOCgYKBgoKCgYKBgoGBgYCAgICAgH59gH+Af4GCgn+BgX+AgX5/gYB/f4CAgn+Bf319f35/f4KAgICAgIB/gIB+fn1/gH9/gIB/f39/gH+AgICAgH+AgYCBgYGCgYCAf39/fn1/fnuBk416fH18e315e3p6eHmBgXh5e3x8fXx8fHx8fHx9fX18fH18fn1+fn59fHp8fHt8fXt5enp6eXlzdXVvb3Fwd3N0fYWGg4OCg4KAgYCCg4KAgYGCgYKBgYCAgIGAfn6Af4GAgYKCgIKCgICCfoCBgX9/gX+BgIF/fH6Af3+AgoCAgICAf3+AgH9+fX6Afn2AgIB/f3+AgICAgYCAf4CAgYCBgYKCgICAf39/fX5+fIGGiXx8fnt7fnl6e3p7jn53d3l7fHt9fHx8fHt9fH19fX18fXx+fn5/f358enx9e319e3l6e3p5eXN0dW5zcXB4cnV6hYaDg4KDgoCAgIKCgX+BgYKBgoGBgYKAgYF/fn9/gYGCgYKBg4OAgYJ/gYGBf4CAgIB/gX99f4F/gICBgICAf4B+gICAf359foB+fn+Af39/gH9/gICBf4CBgH+BgIGCgoKAgICAgIB9foB9gIOCe35+e3x9e3p8e3uHeXh4eXx8fH17fHx9fX18fH19fn19fX5+f3+Af317fH18fHx7enl7e3l5c3J1bnZycHhxdXaFhYOEg4KCgICBgoF/gIGCgoKDgYGDgoCCgYB/gICCgoKBg4KEhICBgX6BgoF/gICAgH+Cf36AgYCCgICAgIB/gH+AgIB/fn2Af39/f4CAgH+AgH+AgYF/gICAgIGAgYGBgYGAgYCAgH9/gH5/fX59fn57fXx9e3x8d3h1eHh5e3x8fXx8fHx8fX5/f39/fn19fn9/gIGAf3x9fHx9e3p7eXp8eHpzcnVud3FxenF2d4WFg4ODg4KBgYKDgH+CgYSDg4SBgYOAgoOBgYCAgIKDgoCCgoSDf4GAfoKDgICBgICAf4CAf4GBgIKAf4CCgH9+gICAgICAf4CAgH+AgICAgIB/f4CBgYCAgICAgYGAgoOCgoCCgYGCgYB/f4B/gId+fnx6fXx7fX94d3Z5eXl8fXx8fXt8fH19fn5/gIGAfn1+gICAgoGAfH59fX58d3t6ent5eXNxdW53cHV6cXZ5hYWCg4KDg4KDhISAgIOBhoOEg4GChICEg4KCgICCgoSBgYKChIJ/gIB/gYOCgYCBgYCAf4GBgYGAg4F+gIOCf35/goGAgIB+gYCBf4CAgYGBgYCAgIKBgYKBgH+CgYGBgoOCgoOBg4OCgYCBgH+AhH19fXx/fXp9f3p5dnp4eXt7fH19e3x9fX19fn+AgYGAgH+AgICDg4B9f35+fn15eXt6enp5c3J1b3dxd3lzd3uFgoKDgoOEgoOEg4CAgoOGg4ODgoKEgYSDgYKAgIKBhIGCgoGCgX6BgICCgYKBgYKCgIGAgICBgoGEgH6Bg4F/f4CDgoCBfoCCg4KAgYGBg4KDgoGBg4KChIGAgYOBgYKEg4KEhIODhIODgYGBgYCCf4B/fYB8enx/e3t3fHl5eXt6fX59fHx8fH1+foCBgYCAgIGBgYSEgH2Af39/f357e3t6e3p0cHhyeXR2eHR3e4SCg4KDg4SChIODgYKChYaEgoODg4SBhISAg4CBg4KCgoKCgIKAfoGAgIKBgoGCgoKBgIGBgYOCgoOAfoGDgX9/gYSEgYN/goKBg4KCgoGEg4OEgYKEgoOCgoGCgoOBg4SDhISEhISFg4SCgYOCgoOBgYGAgH58fIB8fHh8eXp5enx9f3x7fHx9fX18fICAgICAgYGBgYKBfoGAgICAf3t7e3p6enVweHd5dnV8dXZ8gICDgoODg4OEhISAgoOGhYWDg4KDhIGEhYKCgYKDg4GCgoKAgYB9gICBgYKDgoKCgoGAgYKCg4KCg4B/gYOBgICChIODgoGCgoGDgoKDg4ODg4SAgoSDg4OBgX+Bg4KDhYKEhISEhISDhISChIOEhIKBgoGBgHt+gX59eXx6enp9fXyBfXp8fH19fHp7fn5+gIB/gYGAgICAgIGBgIB/fX18fH18dnJ2eHh2dH92dX2Hh4OChIWDg4SFhICChYWEhIOCg4SEgISFg4KCgoODgYOCgoCCgH2AgIGCg4KCgoKEgoGCgoOEgoKBgICBgoGAgYOFhIOCg4CCgoOCg4ODg4OEg4CCg4KEg4KCfoOBgoSEgoODhISEhIOEhIOEg4WEg4ODgoKAe4CBf3x8fXp6e32AfX9/fHx6fH59fH19fn5/f39/gICAgH9+foCBgICAfnx9fX5/fn18e3h2f3Z3f4SHg4KDhYODhIaEgYKFhoWEhIODhISBhIWFgoKDg4SCg4KDgoKBfoCAgoKDgoODg4SCgYKCg4OCg4GBgYGDgn+ChISDg4KEf4KEg4ODgoSDg4SCgIOEg4SDg4KCg4KChIOCg4OEhISEhIWEg4OEhYSFhIOBgoB9gYKAfXx8e3x8gH19foB+fn1/fnx8fH19fn5/fn+BgYGBgH99fX6BgYB+fn19fX59fX5+f39/fH2AgYKCg4OGg4SDhoSBgoiHhYSDg4SEhYGFhYWDg4SDhIODgoOCg4F+gYGDg4SCg4OEhIOCg4KEg4ODgoKDgYOCf4KEg4ODgoOAgoWDg4ODhIODhIOBgoSEhYOCgoODg4GEg4GDg4SDhISEhYSEhIWFhYWEg4ODf32BhIB9fXx8fHx/gX5/f39/fX99e3x9fX19fX5+f4CBgIGBgH59fH6Cf39+fn5+fX1/f39/gICAf4CEhIODhIWDhIOFf36CiouFhISDgoOFgYaGhoOEhISEhIODg4OEgn+BgYODhYSFhIWEg4KEhISFhIODgoSDhYKBhISFhYaEgoCDh4SDg4OFhIWFhIGEg4OHgoOCg4GCgYSDgoODhYODhYWEhYWHh4aHhYSEhYSAf4GDf35+fH59fX+BgH9+fHx/f358enx9fX19fX5+fn9/gIGBf319fIB/gH5+fn5+f3+AgYGBgYKAgYWFhIOEhIKEg4aAgoWFiomEhIOEhYWDh4aGhISEhIWEhISEg4SDgYKDg4OEhIaEhYSDg4SEg3yDhHuBhHd5g4F9hH5+cnWDgoF2foOEgX2BdYF5g39/gH6EhIKDg4KBg4SDg4SFg4SFhoSFhn2EeXx+f4N7hYKBhIOAf319fn19gYOBfXt/fX6Afn18fHx9fX19fH19f4B/gYJ/fX18f4GBgICAgH+BgYGCgYKDg4KChoSEg4WEgYOEhYOEhYOKiIWFhYOFhYSGhoaDhISFhYWEhYWEhIWCgoOEhYWFhoSFhIOEhYWCaICFanx7cXF8gXOGc3R0fYKDdXNxg4Z0cHVyc3SDdnt9dYF/goOBgnZ5hYCDgIR/hYSChYWCaHpyc3N8gHOCg3+Dg32BfX5+fX6Cg4J8f4F9f4B9fXx8fHx9fHx8fn1+gH+BgX99fX2AgYKBgYGBgIGBgYKBgoKCgoSHhIWEhYSBgoSGhoOFg4aIhoaFg4aGh4eGh4OFhYaFg4KFhoSFhYODg4SEhoaGhIaEg4SFhn1xe4FweXZ+g3+CbnlwdXN8dnl5hXKEg3B2eHF2dHR1cnN0dml/gG5yb3R2bnVsd217c26Ah3ltfXJzdnN2bW14bHB5bHV9f399foGAgX2Af32Af4B/fX18fHx9fH1+f32Af4CAfnx/foCBgoCBgICAgYCAgIKDgoOEhYiGhoCChYODhIeGg4WFhYaHh4SDhoeIiYaHhIWGiIeEg4WGhYWEhIOFhIKFhoaFhoWEhoWHdnB0e3BydX+HhYNtdW92b3x1coR5eYd4cXR3bndod3pucHaCcoN+b3p5eW1vbnpvb213fXiGcHF6cHJ0ZoF1fm57eXNveX+Af319gYB/fH99fIB+gIB+foCAgYB+fn9+foF/gH9+fYB9f4CBgIB+fn+BgH9+goOCgoSFh4eEfoeEg4OFh4aEhoWFhoaIhISGh4iIhoeEhoaLioWEhoeHhYOFhYWEgoaGhoWGhYWGhYZxdXByc29zenl+hHSIdHV+iHZugnKEhnluanJ/cW1zd3x/dXR8hH54cXV3bnl1enF2eHV6eYRxam95eHBreXN6b3p3dnZwgYB/fn5/f356fn19f31/f359gIGDg4CCg4GBhIKBgIGBgH1/f4F+f35+f4GAfn6BgoCAgYSHhoODhoSEhYaHhoWFhYWGhoiFhYaFh4eFhoSGhomIhYSJioiFhIaGhYWDhYaFhoaGhoaFg3iLeXKIentwcIWEeIV4eWtzfnl7a3KDh4N6fG17eXl0fYB2bm+AgG90fHV3cXl9fW1+dW+DhYZ6gHJye3x1cG96bHN8bneCgIF+fn99fXt9e3x9fX9/fn1/f4KCf4GDgYGDgYB/gICAfn9+f31/fn1/gH58fYGAfn6Ag4iFhoOFhYWFhoeFhYWFhYeHiIaEhoWHhoaFhIWFhIWFhomJh4aEhoWGhoWGhoSGhoaGhoWGh4eHhoaEhoWGh4iHhYeGhoOHhoWFg4SFhoWGhIaEg4SEhoSEgYODhISFhIWEhYSGg4aHhYaEhIWHhoSEhYaEhX13hYOEhIKBgX1/fnt8e357fHx9f359fH59gIB9f4F/f4GAfn5+gH5+f35+fX99fX5/fHt8f358fH+BiYaFhIaGhoWHhoWFhYWGhoeIhoSGhYaGhYWDhIWGhYSGhoaGhYWGhIWGhoaGhIeGh4eGhYeIiIiIhoSHhYaGiIaFiIeIhYeGhoiFhYaHhYaGhYOChYWGhYWDhYSEhIWEhYWEhYWDhoaGhoWEhoeGhISFhoOFhIKEg4OFg4OCfYB/e3t8fXt8fH1/fnx8fn2Af31/gH5+gH99fXyAfX5+fn5+fnx8fX57fHx/fHt7fn+Ih4SEiIaGhoeGhYWEhoaGhoiHhIWGh4aFhIODhIaFhIeFhYaFhIaEhYaGh4eFh4aJiIaGh4eIiYiFhYiFhoeGh4aHhoeFh4eGh4WFhoeFh4aFgoOFhoaEhIOEhIOEhoSFhYWFhYOGhoWGhYWGhoWEg4WFg4SHhYOCgoWDhIF+gIB8e31+e3x7fX59fHx+fX5+fH9+fX1+fnx9fH98fn58fYGAfHx8fXx8fH56e3t8foiHgoWIh4eGhoaGhISGhoeGiIaEhYSGhoSFh4OEhYSFh4SFhoaFhoSGhoeHhoaHh4mIhoaIh4iKiIWHiIWHh4WHhoeGh4WIiIeHhYaGh4WGhoWBhISFhoWFhISEg4SFhYaGhoWGhIaFhoeFhYaGhYSDhISDg4eDhIGChISDgYCAgHt7fn18fHx9fXx8fH19fH18fn18fX18fHx8fXx+fXt8gX99fH18fnx8fHp6fHx9iIeChoiHhoeGhoaDhYaFhoaGhYOFhIaFhIiJg4GEg4SGhIaGhoaGhIeHiIiHh4eIioiGh4iHiImIhYiHhYeGhoeHh4WHhoiIh4eFh4eHhYaHhIKEg4SGhYeFhISEhISFhoaGhoaFh4WFh4WGhYeFhIOEg4OEh4GDgIKDg4KCgn+Ae31+fXt8fH59fH19fH17fHx8fHx8fXt7e318e358e3x/fX18fX1/fXx6ent7fHyIh4KGhoaGh4aGhYOFhoWFhYWEg4WChoSDiId/enqChYaEhoaFh4aEh4eJiIiHhoiKh4aHh4eIiYeFiIeGiIeGhoeHhYeGiIiHhoWHhoiGhoeDg4SEg4aGh4WFhISEhYaGhoaGhYaHhoaHhoaEhoWDhIODgoOGgYN+goKDgIOCf398f35+fHx9f318fX18fXp7e3p7fHx8e3t7fnt7fXt7e358fHx8fX5/fXt6fHp8fYmHg4aFhoWGhoWEhIWFhYWFhIOBhYGGhIKEhHyAhn+ChYWGhYWGhYSHh4iIiIaFiYqHhYeGh4eIh4WIhYaHiIaGh4eGh4aIiIeFhoeGh4WFh4OEhoWEhoaHhoWEg4WFhoaGhoaFhoaHhoeHhYOGhYKBgoKAg4WCg36BgYF/g4F/fn5/fX98fH1/fXt9fXx+enl6eXt8fXt7e3t+fHx8fHp7fXx8fHx+fYF8e3t7e3x7iYeEhoSGhIaGhYSFhoWEhIOEgoCDgYWDgYJ/eoSMe4CEhYeGhoaFhIeIh4aHhYWHiYeEh4WGhoiGhYeEhoeIhoaIh4eHhoeIhoSGhoaHhYWHg4SFhIaGhoeFhISDhYWGhoeGhoWGhoaFhoaEg4SFgoGCgYCDg4OCfYGBgH6DgX5/f4B8f3x9fX59e359fH15eXp5e319enp7e318fXx8ent9fHx9fH5+gHx7e3x+fXyIh4WGhYaEhoSFhYWFhYODgYOBgIKBhYJ/gH9/fXx7gYSFhoaEhYSDh4eGhoaFhIaJhoKGhIaGhoWFh4WHiImGhYiHiYeGhoeFhIaFhYeFhIeDhIWEiIaGh4WFhIKFhYaFh4aHhIaGhoaFhoODg4WAgIGAgIOBg4B8gYB+foKAfYB/gXx/fH1+fX57fn18fHl6enl6fX15enp7fHt8e3t6e319fH18f35+fHt7fX59fIiGhYaGhoSFhYSFhYSDgoKAgoGAgICDgX5+foB5en2Ag4OEh4WEg4OHhoOEhYSChYiFgoSDg4WFhYWHh4aIiIaFiIeJh4aFhoWDhoSFh4OEhoSEhYSHhoWGhYaEgoWFhoaGhoaEhYaGhYWGgoKDhH9+gICAgYCDgHuBf31+gn5+gH6Afn99fX59f3t/fXt6eXp6eXp8fXl6ent7enx6e3t7fH19fXyAfn18fH1/fnx7h4WFhoaGhoSFhIWDhYKBgICAgYB+f4KCfX1/f3t/f4KDg4WGhYSDgoaDgYOEgoCFh4WCg4GBg4SEhIaGh4iHhYWIhomHhYSEhIKFg4SGgoOFhISGhIeGhYWFhoOEhYSFhoWGhIOEhYWDhYWBgIODf35/gH9/gIN/fIB9fX+CfYCBfn6Bfn5+fX1/e398e3p5enp5enp8eXp6e3t7fHp7e3t7fX59fYB9fXx8fYB/fXyGg4aGhoaGg4SDhoKFgYGAf3+AgH5/gIJ8fn9/foCAgYKChIWDgoGChIGAg4KBgISFhYKBf4CCg4OEhYWHhoWEhoeFh4WFgoOCgoOCgoWBg4WEhYaEhoaHhoaFgoSEg4SGhYWDhIODhIOFhIB/goJ/fX5/fn5/hH57f3x8gIF9gYB9fYN9fn59fX57fnt7enl7enl6ent5enp6e3t8ent8e3t+fn1/gXx9fHx9f4B+gIaEhYWEh4SDg4KGgoOAgYB+fn+AfX9/gnx9f39+fn+BgYKEg4KBgYKCf4CBgoCAgoWEgoB/gIGCgYOFhYeFhISGhoOFg4WBgoGBgoGCg4GChISEhYWGh4eGhYSDg4ODhIWFhIGDgoOChIODgH+AgX59fX5+fH6Dfnx+fHyBgH6Cf31/gnx/fn19fHx8e3t6enp6eXt6enp5eXp6e3x5e317fH5/f4GAfX59fX1/gICAhoSEhYSFgoSCgoSCgoCBgH59fn9+fn6AfX2Af35+foGBgoODgoSHgYF+gICBf3+ChIOBf35/gIJ/goWEhYOCg4WFgoSBg4CBgIGBgYKBgIGEg4OGhYWHh4WEhIWCgoKDhYSCgYGBgYCFg4F/foB/fnx9fn18foN9e358fYF/gIN9fYCBf35/fXx8fH17e3p6enl5e3l6enl6ent7e3p7fXx8f3+BgoB+gH+AgH+AgYDKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzNzc3Nzc3Nzc3NzczMzMvLy8vLy8vLy8vLy8vLzMvLy8vLy8vLy8vLy8vMzMzMzM3Nzc7Oz8/Pz9DQ0NHR0dLS0tLS0tLT09PT0tLS0tLS0tPT09TU1NTU09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tLS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1dXV1NTU1NTT09PT09PT09PT09TU09PU1NTU1NTU1NTU09PT09PS0tLS0tPT09TU1NTU1NPT09LS0tLS0tLR0dHR0dPHhnNlYFtLWWdVTUZIQD03Nzg5Nzw8PDo8Oz42Oj04PDs6OTg3ODs7Oj87PTs8PD47P0E/QkJBQ0RFREE+PTw7QENDQUBDQ0FBR0hHSUtSwtXS09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXVysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMy8vLy8vLy8vLy8vLzMzMy8vLy8vLy8vLy8vLzMzMzc3Nzc3Oz8/P0NDQ0NHR0tLS0tLS09PT09PT09PT09PS09PT09TU1NTU1NTU09PT09PT09PT09PT09PT1NTU1NTU1NTT09PT09LS0tLS0tLT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1NTU1NPT09PT09PT09PU1NPT09TU1NTU1NTU1NPT09PS0tLS0tPT09PU1NTU1NTU09PT09PS0tLS0tLR0dHSzIxyZ2BcTVllUktHSz87Mzc4Ozg5Pj05PDpBOjs9Nzs8PDo6Nzg6Oz0/Oz88PTw/Pj9BPUFBPkNDREJAQT46Oz9DREFDRERCQklHSEhJTr7V0tPT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1crKy8vKysrKysrKy8vLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzMzMzMzMy8vLy8vMzMzMzMzMzMzLy8zMzMzLy8vLzMzMzc3Nzc3Ozs/P0NDQ0NDR0dLS0tLS09PT09PT09PU09PT09PT09TU1NXV1dTU1NTT09PU1NPT09PT09PT1NTU1NTU1NTU1NPT09PS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1tbV1dXV1dTU1NTT09PT09PT09PU1NTU09TU1NTU1NTU1NTT09PT0tLS0tLT09PU1NTU1NTU1NTU09PT09PT0tLS0tHR0s+Sd2hfXk9XZ01LRkw9ODc2NTk5OTw+OT88RDo7PDc5PD07OTc5Ojw9QDs+PT47PD48PT5BQD5EQ0NDP0E9Ojs9QkNFQ0NEQT9FSEpJSky61dPT09TU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8rKysvLy8vLy8vLy8zLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMzMzMzMzMzMzMzMzMzczMzMzMzMzMzMzMzMzMzc3Nzc3Ozs/Pz9DQ0NDQ0dHS0tPT09PT09PT09TU1NTT1NTU1NTU1NTV1dXU1NTU1NPU1NTU09PT09TU1NTU1dTU1NTV1dTU09PT09LS0tLS0tLS09PT09TU1dXV1dbW1dXV1dXV1tbW1tXV1dXV1NTU1NTT09PT09PT1NTU1NTU1NTU1NTU1NTU09PT09LS0tLT09PU1NTU1dXV1dTU1NTT09PT09PT0tLS0dHRmn5nYWJOVWpKSElLPzw6OTM3Njc3PTs+OT06Ojo4ODo7Ozg4Ojs7PD46PT09Ojw/PD0/QkA/Q0RDRD5APT08QENEQ0JEQkQ+REhJSUtMttfT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3MzMzMzMzMzMzMzMzNzc3NzczMzMzMzMzMzMzMzc3Nzc3Ozs7Pz8/Q0NDQ0NHS0tLT09PT09PT1NTU1NTU1NTU1NTU1NTV1dXV1NTU1NPT1NTU1NTU1NTU1NTU1dXV1NXV1dXV1NTU09PT09PS0tLT09PT09PU1NXV1dbW1tXV1dbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1NTU1NTU1NXU1NTU1NTT09PT09PT09PU1NTU1dXV1dXV1dTU1NTU09PT09PS0tLR0p+DaV9kU1hsSEhIS0A9Nzg0NzY6Oj87RDw8OTw8OTg6OTo6Ojs8Ojo7OT49Pjk9QDs/QUFCP0JCQUM9Pz8+PEBCRUNDQkBBO0ZJR01MSbLY09TU1NTU1NXV1dXV1dXV1dXW1tbW1tbV1dXW1svLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzM3Nzc3Nzc3Nzc3Ozc3NzczMzMzMzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc3Mzc3Nzs7Ozs7Pz8/P0NDQ0NHS0tLS09PT09PT09TU1NTU1NTU1NTU1NTV1NXV1dTU1NTU1NTU1NTU1NTV1NTU1dXV1dXV1dXV1dTU1NTU1NPT09PT09PT09PU1NXV1dbW1tbW1tbW1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTV1NTU1NXV1dXU1NTU1NTT09PT09PT1NTU1dXV1dXV1dXU1NTU1NTT09PT09LS0tSjiGxfZlJWakdIR0lBPjM2Njo7PDhDPEJBPjxBPDg5Ojw6Ojw8PDk8PTo7PD09PD89QD9AQT9AQUBCPD4+PzxCQ0NDRkBBQT1ISklOTUeu2NPU1NTV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbMzMvLy8vLy8vLy8vLy8vLy8vMzMzNzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzs7Ozs7Oz8/P0NDQ0NHR0dLS0tPT09PT09TU1NTU1NTU1NTU1NTU1NTV1dXV1dTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dXU1NTU1NTT0tPU1NTU1NTU1NTV1dbW1tbW1tbW1tbW1tbX19bW1tXV1dXV1dXV1dXV1dTU1NTU1dXV1dXV1dXU1NTU1NTU09PT09PT1NTU1NXV1dXV1dXV1dXV1NTU1NPT09PT0tLWroprY2VSWGhMSkdJQjg0OTQ6Ozo5QDk/Q0VAPDw5OTk9Oj07PDw6PTw7OTw9Ozs/PUA9PT5AQD9CQT5APD05QERDQkFBQj48SEpLTU5IqNnU1NXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbWzMzR09PT09PT09PT09PT087Ky8vLzMzMzMzMzMzMzM3Nzc3Nzc7Ozs3Nzc3Nzc/Pz8/Pz8/Pz8/Pz9DQ0dHR0dHR0dHR0dHS0tHV2djY2NnZ2dra2tvb29vZ2dnZ2dna2tra2tra2tjW19fX19fX19jX19fX19vb29vb29vb29vb29vb2dfX19fX19fY19bX19fW09LT09PT09TU1NTU1NbW1dXV1dXV1dXV1dXW1tbX1tbW1tbV1dXV1dXV1dXV1dTU1dXV1dXV1dXU1NTU1NTU1NTU09PU1NTU1NXV1dXW1dXV1dXV1dTU1NTT09PT09PS1bqKa2hoUlhlSUlMT0A5OTo0O0E8Nz05QUM+QD89ODo6Ozk9Oz4/Ojs8PDo7PDo7Pj1APT8/P0FAQUE/QTw8Oz5BRENBREA9PElJSk1ORqPa09TV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbW1szNhG1wcHBwcHBwcHBwcGqn493d3t7e3t7e3t7e3t3S0NDQ0NDQ0NDQ0NDQ0ci5ubm5ubm5ubm5ubq6t6WkpKSkpKSkpKSkpKSnhmBjY2NjY2NjY2NkZGRlhIuKioqKioqKioqKioemuri4uLi4uLi4uLi4ubSPjIyMjIyMjIyMjIyMiqC6uLi4uLi4uLi4uLi3vdLS0tLS0tLT09PS09PT3OLh4uLi4uLi4uLj4+Pi2NfX1tbW1tbW1tbV1dXV1dXV1dXV1dbW1dXV1dXV1dTU1NTU1NTU1NTV1dXV1dXW1dXV1dXV1dXV1NTU1NTT09PT09XDkXFrak5TYkxMVk48Ojo4Nz5DPzg+Oj8/QTw/QDc7Ojs7PTs+Pjo7PD48Oz07PT8+QDw/Pz1AQEBBPj88PjxAQUVCQkZAQD9HSEpLT0ae2tXV1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19fMzk4mKysrKysrKysrKysiivTr6+rq6urq6urq6uvp1dLS0tLS0tLS0tLS0tTEqaqqqqqqqqqqqqqqq6aGhIWFhYWFhYWFhYWFik4MEhISEhISEhISEhIRE0pUU1NTU1NTU1NTU1NPg6ejo6Ojo6Ojo6Ojo6ScWlVWVlZWVlZWVlZWVlJ5p6Ojo6Ojo6Ojo6OjoavS0tLS0tLS0tLS0tLS0d/q6uvr6+vr6+vr6+vr6dnX19fX1tbW1tbW1tbW1dXV1dXV1dbW1tbV1dXV1dXV1dXV1dTU1NTV1dXV1dXW1tXV1dXV1dXV1dXU1NTU1NTU1NPUy5h2bGlKTl9NUlVNPjw8Nzs/Qz42Ojc+Pjs9Qj85PDk9Ozw6PD07PTs9Ozs9PD0+PT07QT08QUBBQT08Pzw7QEJDQURFPUFAQ0ZLS09GmNzV1dXV1dbW1tbW1tbW1tbW1tfX19fX19fX19fXzc5SKzExMTExMTExMTExJ43z6enp6enp6enq6unq6dXS0tLS0tLS0tLS0tLUxaqrq6urq6urq6urq6yoiIeHh4eHh4eHh4eHh41SEhgYGBgYGBgYGBgYFxpOWVdXV1dXV1dXV1dXU4WopKSkpKSkpKSkpKSlnl9ZWlpaWlpaWlpaWlpXfKikpKSkpKSkpKSkpKOs0tLS0tLS0tLS0tLS0tHe6urq6urq6urq6urq6unZ19jX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dXV1dXV1dXU1NTU1NTU1NGcenFpSlRdT1JVTkQ+Pzs/QEA4Ojs4PDs7PD86Ozs4Ozk5Ozw7Ojw5Ozs8Ozo9PT0+PUE/Pj8/Pj08PT88PEFBQ0FERTw+QEVGSktNRpPc1dXV1tbW1tbW1tbW1tbW1tfX19fX19fX19fX183PXDk9PT09PT09PT09PTWT8Ofn5+fn5+fn5+fn5+bV0dLS0tLS0tLS0tLS08Wtrq6urq6urq6urq6vq46NjY2NjY2NjY2NjY2SXSInJycnJycoKCgoKCcpWmNiYWJhYmJiYmJiYl6MrKmpqampqampqampqqNoZGVlZWVlZWVlZGRkYYOsqampqampqampqamosNLS0tPS0tLS0tLS0tLR3unp6enp6enp6enp6enn2djY2NjY19fX19fX19fX19fX19bW1tfX19fW1tbW1tbV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbV1dXV1dXU1NTU1NTWo3txZElbYE5OVU9AQT89REI+Oz06OTs6PT07PDs6OTg5OTs8Ozw8Ojo7PDo7QD08PTxAQTxBQTs7PEA/PD1CP0RDQ0U8PkJERkpMTEWN3NXV1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjNzcXCw8PDw8PDw8PDw8PCydDPz8/Pz8/Pz9DQ0NDQz87Ozs7Ozs/Oz8/Oz87NzMzMzMzMzMzMzMzMzMvJycrKysrKysrKysrKysfCw8PExMTExcXFxsbGxsvMy8zLzMzNzMzMzMzLz9HR0tLS0tLS0tLS0tLRzczMzMzMzMzMzMzMzMvO0tLS0tLS0tLS0tLS0tLU1NTV1dXV1dXW1dbW1tjZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NfX19fX19fX1tfX19fX19bW1tbW1tbW1tXV1dXV1dXV1dbV1dbW1tbW1tbW1tXV1dXV1dTU1NTU169/cF5GXmJQUVdOR0ZDQ0lBPz07PDo8OEBCPD04Ojo4OTg7Pzs8PDs7PDw8PD87PD46Pj44PkI8Pj1BPjw+QkBERUNAPD5APkNJSUtEh9zV1tbW1tbW1tbW1tbX19fX19fX19jY2NjY2NjYzs3P0NDPz8/Pz8/P0NTQ0M7MzczP09LSzs3P0s7Ozs7Ozs7Q1NLPzs/T08/O0NTSz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0NDR0dHR0dHS09PU1NTU1dXV1tbW1tfW1tbX1tfX19fX19fX19bW1tbW1tbW1tbW1tbW1tfX1tfX19fX1tbW1tbW1dbW1tbW1tbW1tbW19fW1dbW1tbX19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjX19fX19jY19fX1tbW1tbW1tbW1tbW1tbW1dbW1dbW1tbW1tbW1tbW1tXV1dXV1NTV1di4gm9XSl9jUlFaS0hBQTxCPT07Oj4+PD4/PT0/Nzk6OTk3OD48PD47Ozw7PDs/PT0+OTs7OT0+P0A+QD07OkI/QkNCPz0+QD5CRUdKQoDc1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2M7Ozs7Ozs7Nzc3Nzsqfys3Nzc3QuYOEi8fTwJrLz87Ozs7Pypal0c/PopfK0saSq9HOzs7Ozs7Ozs7Ozs7Oz8/Pz8/P0NDQ0NDQ0NDR0dHR0tLT09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbV1dXV1dbW1tbV1dXV1dXV1NTU1NXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NfX19fX1tbW1tbW1tbW1tbW1tXV1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXYwIBuVU9gY1dZW0xMQ0A9PTs9Ojw+Qj5CQ0A8Ojg5ODo6Ojc7Pz4/PDw7PDo5Pzw8PTg5PD9BPj09PUFAPTtBQkBCQz47QD9BQUlHSkF629bW1tbW1tbX19fX19fX19jY2NjY2NnZ2djY2dnOzs7Ozs7Ozs7OzdKpj63Rzs7Ozpu3tqSiwJOerNPOzs7Pz5yqnazXqKCroM6ZrZqz0s7Ozs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0dHS0tLT09TU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dbW1tbW1tXV1dXV1dXU1dXV1dXV1dXW1tbW1tbW1tbW1tfX19fX19jX19fY2NjY2NjY2djY2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2dnY2NjZ2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV18h/b1pTYWVeXVxPSkQ9QD8+Ozc6Pjk/RD9BOTg3ODk7Ozw4OT89PTw9PD47OkE7OTs5OzxDQDw7PT5AQT49QkQ/QkM9PT8+Pz5ISUg/ddrW1tbX19fX19fX19fX2NjY2NjZ2dnZ2dnZ2dnZzs7Ozs7Ozs7Ozs/Inrym0tDQzsqgl36Cw6abr6fUz8/P0MuUiJqdwpyVkKGzlYadnc7Pzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dLS0tPT09TU1dXV1dXV1dXV1dXV1dbV1dXV1dXV1tbW1tbW1tbV1dXV1dXW1tbV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2djY2NjY2NnZ2dnZ2dnY2NjY2NfX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dbV1dXV1dfNiHNdWGloXl9gT0lGOkFAPj88PDo2P0JAQzo2NDc6Ozo8Ojk+PD49PTs/PTxBPjw8Ojw8PTw6PEA9QEI+PkFCPUNDPT0+Oz9BRUtIQHDZ1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2c/Pz8/Pz87Ozs7SrKWnqdXAvNLHnY+ey9PJipmq1M/Pz8/RvciZm6udn6eZtMDJl5nG0M/Pz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0dHS0tLS09PT1NTU1dXV1dXV1dbW1tbW1dbW1tbW1tbV1tbW1tbW1tbW1dXV1dXV1dXW1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnY2NjY19fX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0JB1W1tqaWFeXVNOSTxDQEE+QD46OEZBP0M6NzQ5Ojo5Ozs4Oz0/Pj49QT08P0A9Pjw8PDw8Oj1AQD8/PT5CQD9AQkA8QD0+QUVLRz9r19fX19fX19fX2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnPz8/Pz8/Pz8/QzJ2Nl6zQmpfKxZ6ynpbN1q2ZqtTPz8/Pz9KXlKDDoqCMoMXTkZigztDQ0M/Pz8/Pz8/Pz8/Pz8/P0NDQ0dHS0tLT09PT1NTU1NXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX19fX19fY19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tKUcl5ea2tqZV1PTEc/RENDQDo9OzxCPD49OTY0Ojk5Ojo5Nzs/QDs8PUA8PEE+PD07PTw/PDo8Q0A+PTs9QD5CPkBBPkA9QD9GSUQ/ZtXX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2traz8/Pz8/Pz8/P07GigJuvyaCjv8qcpYynrdiqmarUz8/Pz9Ozm8SY2pfFyZTYrKO/ndXQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1NXV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dbW1tXW1tbW1tbV1tbW1tbX19fX19fX19fX19fX2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbSk3BgXnBoZmVaUUhHQkVDQEA3Ojo8Pjo8OTc2NTk6Njo8Ozc8QEA8Ojo9Oj0/Pj08OUA8PDo6OT9APj08PUBBQz9APz5BOz9ARkpCP2LS2NfX2NjY2NjY2NjY2dnZ2dnZ2tra29vb29vb28/Pz8/Pz8/P0M6fkGyclteqo9PSrqa1mJ/Vqpmq1M/Q0NDRzo2QoLaglJWhu82IlZ7I0tHR0NDQ0dHQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1dXV1dbW1tbX19bW1tbW1tbW1tbX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfW1tfX19jY2NfX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX1tbW1tbW1tbW1tbW1tbX19fX19fW1tbW1tbX0pNuYFxxZGdkWlVKQENGQ0FCODs/PD07PDw4NTU4OTY4Ozo5PDo+Pzw9PTk8Pz49Ojo+OTw6Ojg+Pzw9PTw+QEFDQT48PDpCRERKRkJd0NnX19jY2NjY2NjY2dnZ2dna2trb29vb29vb29vPz8/Pz8/Pz9G9n8O31pfA09HQ0srSzZeb1KqZq9XRz9DQ0cvaqJ2Ln6+znaXQ26KZtdXR0dHR0dHR0dHR0NDR0dHR0dHR0tLT09PU1NTV1dXV1tbW1tfX19fX19bW1tbW1tfX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19fY2NjY2NjY2NjY2NjY2djZ2dnZ2dnZ2dnZ2dnZ2drZ2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fX19fX19fW1tfX1tbX19fX19fX19fX19bW19GRbF1cb2doYl1PRkBISUdFQDw8Pj48PT48NzU2Ojk2Ojs6Ojs4QD86PDw5PD49Ozs6Pzk/Ojs5PT49PTs7PTxAQ0I/Pz47Q0ZGR0hEWc3a2NjY2NjZ2dnZ2dnZ2dna2trb29vb29vb29vb0NDQz8/Pz8/Pz5V+e6WS1KKa08ySl6ObodirmavV0pem1cmOpZqjkKKaopyckaiYnrvV0dHR0dHR0dHR0dHR0dHR0tLS0tLS09PU1NTV1dXV1tbW19fX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tbX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2tnZ2dnZ2dnZ2djY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX1tfPjGRWXnBrXGBgTkVITUlJT0M+OkI9PUBCOzU1Nzw6ODo7Ojo7OT09OTo6OT0+Pz07OT47PDo8Ozk+PD47PD0+QENCPz5BPEFDR0ZGRVXJ29jY2NnZ2dnZ2dnZ2dra2tvb29vb29zc3Nzc3NDQ0NDQ0M/Pz9DR1aeZrcmjqL7KnbGdo7XZqZup2Lirocq7oaannb6eqaCinqmiqZzQ09LS0tLS0tLS0tLR0dHS0tLT0tPT09PU1NTV1dbW1tbX19fX19fX19fX19fX19fX19fX19bW1tbW1tfX19fX19fW1tbW1tbW1tbX19fW1tbW1tbW1tbX19fX2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2djY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fX19fX19fX19fY2NfX19fX19fYzYZdV2JvZE9dVEtIRlNRS0xAPj1EPD9DRj01NTc7OTc6Ozo8PTo7Pzo6OTg6PT0/Pjs/Oz49Ojs5Pjs9PD0+QURCQD8+PzxAQUVHRURSxdvY2dnZ2dnZ2dnZ2tra2tvb29vb3Nzc3Nzc3NzQ0NDQ0NDQ0NDQ0NO5gL3Tm5bP1LWLkZ/T1LyBu9TOlKDT056QjbbZro6RpdSakY6+1tLS0tLS0tLS0tLS0tLS0tLT09PT09PU1NXV1dbW1tfX19fX19fY2NjY19fX19fX19fX19fX19fW1tbX19fX19fW1tbW1tbW1tbW19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2tnZ2tra2tra2tra29ra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2NfX2ct+WlVqaltMX01KTEpVTEZCPD0/R0ZIS0g9NjU3Ojk3OTo7Ojw9OT45OTo4Oz0+PkE+PTk8PDo9Pj46PTk5Oj9FQUA+PT8/QkBHRURFUMHc2dnZ2dnZ2dna2trb29vb29vb3Nzc3Nzc3dzc0NDQ0NDQ0NDQ0NDQ0cHR0crI0tDUxLjS0tHSwtLQ08fM0tHSusTV0tXBvdbT07jI1dLS0tLS09PT09PT09LS0tPT09PU1NTU1NXV1dbW1tfX19fX19fX2NjY2NjX19fX2NfX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29va2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2djY2NjX19fX19fY2NjY2NjY2NjY2NjY19rHd1xSZ2laTlpOTFBRV0VKPz89P0FFTExBPjc3Njs4ODk5Ojs8Pjw+ODo6OTs+P0A9Pj46NTo6Oz0/Ojs5Ojw+QkJAPz8/P0FCR0RDRE683dnZ2dnZ2dna2tvb29vb29vb3Nzc3Nzc3d3d3dDR0dDQ0NDQ0NDQ0NDS0NDR0dDQ0dPU0dHR0dPR0dHS0tHR0tXU0tLS1NXT09PW1NLS0tPT09PT09PT09PT09PT09PU1NTU1dXV1dbW1tfX19fX2NjY2NjY2NjY2NfX19jY19fX19fX19fX19fX19fX19fX1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tvb2tra2tra2tnZ2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2trZ2tra29ra2trZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjbwXNYVWlrU0xSTlBSWVRGSTw+Qz9BQkVLPj43ODc5Nzc4OTk7Oz0/QDw9ODk7Ozs/Pjw8OTU6PT47OTk7PD8/P0JCQT1BPUBBQkZCQkJLtd7Z2dra2tra2tvb29vb29vc3Nzc3Nzd3d3d3d3R0dHR0dHR0dHR0dDQ0NDQ0NDQ0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tPT09PT09PT09PT09PT09TU1NPT1NTU1NTU1NXV1dXV1dXW1tbX19fX2NjY2NjY2NjY2NjY19fY2NjX19fX19fX19fX19fX19fX19fX19fW1tbX19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2NjY2NjY3LxvVFRsbExLUkpUUlVLRkQ6PkdEREFERjw/ODk6OTY5OTo3PD07PkA9PTc5Ojs5Pjs5OTY2Oj1AQT47PDk6Pj9DQT4/Qj0+QkNFQkFCSrDe2dra2tvb29vb29vb29vc3Nzc3Nzd3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0tLS0tLS0tLS0tLS0tLS0tPT09PT09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1tbW1tbW19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19fW1tbW1tfW19fX19jY2NjY2NjZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2dnZ2dnY2Ny2a1NbcGtLVVdSXFFXSEQ+PEJKRT1ISj89PDc4ODo1OTg5Njs+PD1APDw1OTk8Oj87OTk0ODw9PUFBPD47Ojw+QD89PkE9PUNGR0I/Qkmq39ra29vb29vb29vb3Nzc3Nzc3N3d3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHS0M/U0M7P0tLT0tLS0tLS0tLS0tPT09TU1NTU1NPU1NTU1NTU1NTU1NTU1NTV1dXV1dXV1dbW1tbW19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19jY2NfX19fX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dndsGRTYXJfT1pUV19RUkdCPUVJTEFBTEQ/Pzs6ODg5Mzg2ODY5Pj0+Pz06Njo7Pjs9PTo5Njg6PTtAQDxAPz0/P0I+PD48PEJFR0lCPkNJpODa29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3t7S0tLS0tLS0tLS0dHR0dHR0dPT0bm7zLqbnLrQyNPT0tLS09PT09PT09PU1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2NjZ2dra2tra2tra2tra2tra2tra2tra2tra29va2tra29va2tvb2tra2tra2tra2tra2trb29vb29va2tra2tra2tra2tra2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ3qpfVWBuW1VZUVpeT0xHQ0ZNSUZEREo7QUE7PDg4NjQ4Njk4Nzw/QT89Ojc8Pz48Pz87OjY4OD09QEE9QD5BQD1AOjs6Pj1BRUdJQkBDR57h29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e0tLS0tLS0tLS0tLS0tLS0tO+wMqaoKKViJGeqpOpz9TT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fY2NjY2NnZ2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dna2tra2tra2tra2tra2tra2tra29vb29vb29va29vb29vb29vb29ra2tra2tra2tra2tvb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2d6iXFVeblheXU5aUFROQ0NMSUlJRkpEPEJBPDs4NzY3OTc3OTk9P0E/PDo5QD88PkI/Ojg3NzY9Pz9APUBBPz88PTs7OD48P0VJSEE/Q0aX4dvb29zc3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3tPT09PT0tLS0tLS0tLS0tTIlZyum5m1iX2TjIKBhMTV09PT09PT09PU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tvb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dndmlpYYW5ZYVdPV01QRUJETElNS0ZJRT5CRDk4ODY3OTc1Njk4PT1BPjo4OT4+PD9APzw1Njc2PD4/PjtAQEA/Pj4/Pjs/PkFCRkdCQENIkeLb29zc3Nzc3d3d3d3d3d3d3d7e3t7e3t7f39/U09PT09PT09PT09LS0tLTz6h+kayPko6MhoCIiYSQo8rU09PT09PU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY19jY2NjY2NjY2NjY2NjX19fX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2tra29vb29ra2tra2tra2tna3JJaWWNuWlpSVV5QTDxAR05IUklIRT47SEY4OTc1Nzg3NTg5ODs+Pj07ODlBPj1AP0E+NzU5Njs+QUI/P0BAQkI/Pj8+QUBEQUZIQj9FSozi3Nzc3Nzc3d3d3d3d3d3e3t7e3t7f39/f39/f1NTU09PT09PT09PT09PWtaWaiIuQhYCFi4iBg4qLf4bC1tTU1NTU1NTV1dXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2dnZ2dna2dra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29ra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb2tra29uIWltnalxYTFpfVkg6TEhMSkpDRUZDQExINzo3Njc4ODU4Nzg5PDw7Ozk4QD89Pj8/PDY3PDQ3P0JCQUBAPz8/QT09P0A+QEBGRT09REuI4tzc3Nzd3d3d3d7e3t7e3t7e3t/f39/f39/f39TU1NTU1NPT09PT09PUxZKCg4WGfYGCfXx5foGCg36k29bU1NTU1NTV1dXV1dXV1tbV1tbW1tbW1tfX19fX19fX19fX19fX19jY2NjY2NjZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vc3Nzc3Nvb29vb29vb29vb29vb2tra2tra29vb29zb29zb29vb29vb29vb29vb29vb29va2tvb29vb29vb29vb29vb29vb2tvZgFpebWhaU0ldW1hKRE1ISlNMR0ZBQD9KQjg7NjY5OTc1ODY4Ozo7Ojw5OD09O0A9Ozo2NTw3Oz1CQEFBPD49QEE9PEA/Pz5CREU+PERLg+Lc3d3d3d3d3t7e3t7e3t7f39/f39/f39/f39/V1dTU1NTU1NPT09PT2LKEkKh9g3l2hIh/e3d5gn5+i67A1dTU1NXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dna2trZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2tra2tra2trb2tra2tvb29vb29vb29vc3Nzc3Nzc29vb29vb29vb29vb29va2trb29vb29zc3Nzc3Nvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc1nlcWmxmWFJPYFFSQUhHSkZYTEZAQENDSz87Ozc4ODc2NTc2ODo5PDw6PTs/PTs9Pjw7ODg8OT0/QkFCQzw8P0FCPj1BQkNCREVDQDtDTH3h3d3d3d3e3t7e3t7e39/f39/f39/f39/g4ODg1dXV1NXU1NTU1NPU0ruen3WKeXuIgICChYGDcnOAhYOMrNfV1NXV1dXW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NnZ2dna2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra29vb29ra2trb3Nzc3Nzc29zc3Nzc3Nzc3Nzb29vb29vb29vb29rb29vb29vb29zc3Nzc3Nzc3Nvb29zc3Nzc3Nvb29vb29vb29vb29vc3Nzc3Nzc3Nvb29vb3dByXV9wZVdLUGNPS0JHQ0pIS0ZBPEE9SFBBOjo3Nzg3Njc4Nzw6OD09PD47QD88Pz07Ojs5Ojk8QEJAQkNAPUFAPz1AQkNDQUBAP0A7RU144N3d3d7e3t/f39/f39/f39/f3+Dg4ODg4ODg4NXV1dXV1dXV1NXU18h4i4V8goh6g4SBfoKCc2l0hYuGkJ3U1tXU1dbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tvb2tvb3Nzc3Nzc3Nvc3Nzc3Nzc3Nzc29zb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb297KalxjcWVST1heSz9HTElPS0VAPkFCP0lPPjk6NzY7NzY6Ozc7Ojg6PDw+Oz09Oz48Ojs4OTo4OUFCQkFAQDtAQj06PkFCQz8+PT4/PUZOdN/e3t7e3t7f39/f39/f4ODg4ODg4ODg4ODg4OHV1dXV1dXV1dXV1s6dhpl+f5OTin+CgXx9gnNxm4mAgoOJwNnat7TQ19bW1tbX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tra2tra2tra2tra29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NvfwGNaW21gVlBTU0pETEhNSEk8PkFEQ0ZORDw8OTc5OjY4Ozk3PDk4OTw9OzlAPjpBPzw3NTc7ODpAQUVBPz45PUI/Oz1CQkI6Pj07PT5GTnHe3t7e3t/f39/f39/g4ODg4ODg4ODg4OHh4eHh1tbW1tbW1tbV1tjLioCHhYOXjHh7e3lvfYF1a3ebdHZ7eInHxpiMrdjZ19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2drZ2dna2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tra29vb3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29zb29vb3Nzc3Nzc3Nzd3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3Nzc3Nzc4LdjV1lrYlJNVVFMSktGS0ZDQD5CQT9FTT4+PTg5OTo3OTo3NT03Nzo+PDs7Qjw5Pz05NjY4PTk6QEJGQD49PEBCREA9QD9DO0A9PD4/Rk9t3N/e3t/f3+Dg4ODg4ODg4ODg4OHh4eHh4eHh4dbW1tbW1tbW1tfVrYZ6d32rn3l4entzdH+Dfm9xe3l6c3t2k4qFgImkzdnY19fX2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tna2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29vb29vc3Nzc3N3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vc3Nzb3Nzc3Nzc3N3d3d3d3d3d3dzc3Nzc3Nzd3d3c3Nzc3Nzc3N3d3d3d3d3d3d3d3dzc3OGtYVtebGJSTVZMTUdLS0RGQkI7QT08RUxDQT44Ojk6Nzc5NjY6NTs+QDs9Oz89PD89Ojk5Ojw5PEVDRkA/PkBDQkQ9OT0/QT1CPz1APkdPadvf3t/f3+Dg4ODg4ODh4eHh4eHh4eHh4eHi4uLW1tbW1tbW1tfQmH+Qh4N9eoN2e3Vzenl6kKqmd3JyfoeHh4CAfoKEhJHJzNnX19jY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra29va2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2djY2NnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vb3Nzc3N3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzb29vb3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3dzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3NzhpV9UYm1iUE9TSUhHRkpJSUJBPkJCPEVFREA+ODo4Ozc3Ojc4ODY+Pz07PDk9PDo+PTs6Njc7NjpEQUY+Pz8/PkNBPzs9PT47REM/PjxIT2fZ4N/f3+Dg4ODg4eHh4eHh4eHh4eLi4uLi4uLi1tbW1tbW19jYyH52doN+fnR2eIaCenl1d5yhu6GEgoCAfoeKinx/gYaMnKjO2NjY2NjY2NjY2djY2NjZ2djY2NjY2dnZ2dra2tra2trb29rb29rb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3d3d3d3c35pbT2drXFBRUElDT0pLR0xHSkJAP0FHREBBPDg8ODg1ODk3Njc3QEA/Ozw5Pj04PTw8Ojc4PTk/RENGPkE/QkBDPzw6Pj0/PkVEPz07S1Fj1+Hf4ODg4ODh4eHh4eHh4uLi4uLi4uLi4uLj49bW1tbW19XB3LRueHJze3B6eXaFiIR7eH2AgZiljH98fnuRhZaLhoGDgY6Rvd3Z2NjY2NjZ2dnZ2dnZ2dnZ2dnY2dnZ2dna2tra2trb29va2tva2tra2trb29ra2tra2tnZ2dnZ2dnZ2dnZ2dna2trZ2dnZ2dra2tra2tnZ2dnZ2dna2tra2tra2tra2tra2tra2trb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t3d3d6NWFdobllQUUtISlNJTUhNSUtBQz9DRkJBRDo6PDg2NDg4NzY2Nj8+Pjo8OTw7Oj09PDw4Ozw7RERERT4/PkI+Qj84PT8/Q0NCQEE+O0xUY9Xh3+Dg4OHh4eHh4eLi4uLi4uLi4uLi4uPj4+PW1tbW1teslLZ6eHJvd5V7dHuLgHh1bn6Fg3t/hYhyfH2bnI6JioJ+g32Hk5rH1NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2trb29vb29vb29vb2tra2tra2tra2tra2tnZ2dnZ2dnZ2dna2tra2tra2dra2tra2tra2tra2tra2tra2trb2tra2tra2tra2trb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d7Zf1lgaGxcUUtHR09LTk5PTURGQkg/Q0hEREA6Ozs4NzU3Nzc4NThAPkA7PDk8Ozw+Ojk7OTk7OUZERUI8QD4/PEBDOz5AP0A/Qj8+OjtKVWPV4eDg4eHh4eHi4uLi4uLi4uLi4uPj4+Pj4+Pj1tbX19vKhYR3cXJubniVhHt4hH95dnB4c3eLkY6CdnN9ioaId3d1d4ODfIiIk8Pb2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2trb2tvb29vb29vb29vb29rb2tra2tra2tra2tra2tnZ2dnZ2dna2tra2tra2tra2trb2tra2tra2tra2tra2trb29vb29ra2trb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f0nVZaGlqVk5KSE1OR01EUElGSD9FPUZMREM+Ozs8OTc3OTY2OTU4Pj4/PTs8QDs9PDo3Ozc5OThHREVCPUE9Qj8+QDw/QUE/QEJAPjs8S1Ri1OLg4eHh4eLi4uLi4uLi4+Pj4+Pj4+Pj4+Pj49fX19fEknuJf29sbnV2foSBg4qGfnVybWVtiIaKjoR7c4OHint4e4OPj4GEioqxztrZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29zc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tvb2tvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3dzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f3t7e4clsW2pqalNOR0dOT0VIRk1JSUA7RD5ISUA9PDo6Ojg2ODo3Nzk0OD08PT07ODw8PDw4Njc4OTo6RUJFQT9APEI/Q0M+PkNEQUBAP0A8PUtRYdPj4OHh4uLi4uLi4uPj4+Pj4+Pj4+Pj4+Pj5OTX19fZqXaFfnx3bHB3eXh8jH2KhYB3anN0d3p9bot7fnl6foR/gIGDfnh8foeGlrbT2tnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra29ra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/e3uO9amFpa2lRTkZNTEtKWE1OR0FAQE9BQz9AOzw4OTk5Njg2NjY4NDs+PD07OTY6Ojk6OTU4OTg5OkJERj8+Pj5AQEBCPzxBQD88Pj9BOT5KT17S4+Hh4eLi4uLi4+Pj4+Pj4+Pj4+Pj4+Tk5OTk19fX2sqKhIB5c29tcXN1d4CUeHaAfHWHhXd1cnWgmXp7d3Z5doR0bWxue3iAmouTu9za2tra2tra2trb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc29vb29vb2tra2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f397js2lpbmloUFBPTExPUk9LU0Y/RURERD48PDg7ODc5OTU2ODY2NzM6Pjs+PTc6Pjk5OTk2Ojo4NzxDRUc/Pzs/PkA9PkE9Oz0+OUFAQDhBTlFc0OTh4eLi4uLj4+Pj4+Pj4+Pj4+Pk5OTk5OTk5NjY2NjauY6AenZ1bmpveHCBfWt0cnZ3hIV5h4d5lY55eXp1d3pza298gHx2fYh8gLLe2tra2tvb29vb29vb29vb29zc3Nzc3Nzc3dzc3Nzc3Nzc3Nzb29vb29rb29vb29ra2tra2tra2tra2tra29vb29vb29vb29zc3Nzb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3t7e3t7e3d7e3t3d3t7e3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/f39/f4qpqa2hrZFNQT0ZQVFJOSFJLPkREQ0I7Ozk6Ojg2Nzg1NjY4ODg0Oz88Pzw5PDw3Ozo6Nzo6Nzo9Q0JDPUE+Pzw5PT5BQDs8PDtFQD47Q05TXNDk4eLi4uLj4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTY2NjZ1p5vdntveHh2cG50d3BwdHBzb36Jc3qGhY2EenNtcoB6hn1vg5OBdnx9g4a13drb29vc29vc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29ra2tra2tvb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4N/f3+KgbWhma2ZVVlJHUFFOS0xMRUJIRUc9OD08Ojo3Nzg2Nzc2NTY3NDg+PD09Ojg6OD46Ozc4Nzc6Oj5DRDtDQj49OD1AQUM/Pjw+RTw+PUJNUF/S4+Hi4uLj4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk2NjY3MB2doCCfnp4eHBsdXlya399bHNvdGdoaYB/aWl4c2d+iYl4cIKGe3d9foWKvd3b3Nzc3Nzc3Nzc3Nzc3Nzc3d3c3Nzc3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODflGttZm5mU1NJUFlUTEhGTkZGRUJGPTs+PDs5Nzc4NTc5NjQ1NzU4PDs9Pjo6OztAOTs7ODc6OTlAQkE8QUE/Pzk/QEJFQ0FAQEM7Oz1ES01g1uTi4uLi4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk5NnZ2tmYc3uqhJaCcnR1dn14aGx8d2h4d25rcHR5gIJ3dHyBhIJ9c3CAin94gn95g8je3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f4N/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh24tubWdzY1lRTVVbV0hDSUZOS0dCRD8/Qjo7OjY2NzU2NzY0ODc2Ozw7Pj86PDk8Qjg3OTo6Ojk6QUFCQUJDQEE+PT9CQ0NEQUJGOTg9REpOYtjk4uLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXZ2drcqHGCtXiRfnNsem6EgXaCfWtoan+DeHZ8dX2FhXRmcHl9d316gIqFe318foC03tzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3Nzd3d3d3d3d3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e397e3t7e39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4ODg4ODg4tiFb3FrdWFWT1VVXE9ETUY+SkdKRUQ8P0I6PDk4Njg0NTY3NDc2NDk7Ozw7OD47PEE4ODo9OD04Oj09QEBAP0FCP0A+QENCQ0FBRTc2O0RMTmPa5OLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXl29ra3Z5sbnNxhY1ybXBuf391hH5rcnZ2enN4gXhzb3VwbWt2fHmFiIB/f392coODsd/c3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eDg4eHh4eHh4eHh4OLXhW1xb3ZeUldTWlpRSkhDQFFAQkQ8OT9BOjw5NzU3NDU2NjQ3NTY9PDo9PTk+OjxAODo6PDY7OTs+PUJCQjtBQkBDQEBEREM8PUA3OjxFS01l3OPi4uPj4+Pj5OTk5OTk5OTk5OTk5OXl5eXl5dPOxsB+cWxveHt2b3VuanNzbZKGeG50dG5vdIZ/b2twboJ0bXZyfY2DdnF/d3mKgabf3Nzc3d3d3d3d3d3e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3dzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t/f3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi1oZucG1xYFJZUFdfWUpMTElSP0Q9OTtCRjs6OTc0NTY1NzU0NjY2Pj07Pz45PTk7Pjg9Ozo0ODtAQENCQ0FCRkE/Q0BBQkREOz0+OTs8QkxNZODl4+Pk5OTj4+Tk5OTk5OTk5OTk5eXl5eXl5eW5t7Woc3JscHd6dHd4bXFydXd/hHRyc2xsa3F8bnBudGuBf3GAd32Eg355gHNygYqg2d3c3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh49WHcWxqbF5YWlVXYFZWUE9QTD1BOjs8RkE4Ojg3MzY1Njk2NTg1Nz89Oz8+OT04Ozw5PTs7NTo9Q0JCPENDREREQUE/PkJDQzw9Pjg5PENLS2PN0dnh1sjY4+Tk5OTk5OTk5OTk5eXl5eXl5eXltbW2q3J5cm59f3Z1d2hqaGlwb3Zta2tnZWZxdG15gG5teXd2iHhxa2podXV5dHV/wd/c3d3d3d3d3d3e3t7e3d3d3d7d3d3d3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHi4uHh4ePVhnFwY2lhV1NZV19MUk9STUtAPjg5O0E+ODc5NjQ3Njc6NjY2NDk+Pzo8Pzo/OTo6Nzo9PDk5PEFBPTtBQ0VDRkA+Pj5BRUQ+QEE3OD5GSEpesrW4wbm1u8jg5eXl5OTl5OXl5+fn5+fm5ebm5ra2tbWOfX5weoR1cnZnYmNlbGtyb2ZpbHZtd4Z9hXlsbHd4a3ZwfH14c3V5fHd2h7ng3d3d3d3d3d7e3t7e3t7d3t7e3t7d3d3d3d3d3t7e3t7d3t7e3t7e3t3d3d3d3d3d3d7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4eHj1Yd1bl5uY1pUU1hXS1NLSk1SR0E4Ozs+PDk4NzU2NTY2OTY4NjY5Pzw6PT07Pzo7Ozk8PDs5Oj4+Pjs8PUFEQkNBQEBBP0JDPDw9Nzs+REVKXrG1tLW2t7e2y9rJ3uXl3eDi3tXU1tPU4OPg39+2treuh3t/bnmNenJ1bWNobGxtaXR4enF5enqIh4N6aWh9cWRvcXyGgX55e318e4an2t7d3d3d3d7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4uHh49aGdmxhb19dV1lcWlJQSEpXTEVHPUA9Ozs9OTY0NjU1NTg2NzY3OD87OT09PDw5OTw6Pjw6OTg+Qjs7Pj5AREBDRUFAQD0/QDw9PTU5PEJHRl2xtbW2uLm5ubq9uMPT0r3BwcC6u7y6u8TMxb/Dt7e3hGl1gX1ndYd5Z3Vxa2t5eHB3fH15bWl3e3h3bml1j4FwbHl4d3d9gXuGgnmAoNze3d3d3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODh4OHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4ePXhXJrZ3RhW1hYX15TVVVRVUpMRj9JRDs5PTY2NDc3NTc4Nzc3ODk8PDo+PDg8Oj0+OTs8OTs5P0E8PT9DP0FARUJCQTw9Q0A6Pjw1NDlER0dasbW1tre5ubm5ubm3ubm4uLm5urq6urm5urm6u7e3uX9ucHN6b3B/eXNuc3Vsc3Z4cXFwb2tvcX6Bc2mHhIF9dHOHdW11hYmBgHJ2hafd3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uHj14lxa2xyW1dXXWBUUVVUUFJPSkNATUE9Ozk2NTM0NjQ2ODc3Nzk6Pjs8Pjs5PDo8PDk8PTw7PT0+PUNEREBDQkE/QD48PkE8OD06NjY6QkpIWLG1tLa2uLm5uLi5uLe3uLi5urq5ubi4uLi6uru3uKx7cnhxf3ZzfnBsbXpyZ29sbW50cHt3d3Jyd3pvhpJ2f3x8enZ5fH9zfYdyda3T393d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4eHh4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi49eHb2pxalVWV2FbT1FSUE5XSURESUo/Ojk6NzUzNDk1NzY2Nzg4Ojw7PD46PDo6PTw5PDw9Oz09PDs9REdEQ0E8PDw8Pj5AOzg8ODE1OkFGRVautbW1tre4uLm4uLi4uLe4ubq5uLi3t7i4ubq7t7mqcnB4d3x7e4J3aG5xam9qY2lyf21zcn54dHFsanaAeX2AgH91doB1a4qLgHaR1d/d3d7e39/f3t/f3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f4N/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLi4uPYhm1sdGVWUFxnWE1YU1JRWUVDS1BOOzk4ODc1NTM5NTY2NzY4Nzk+OT0+OTw5OTw7Njg5OTo8QEA9PkBGQEJCQDo+PEE9Pzs7OzYxNjxCR0RQqLa1tba2tre4t7i4uLi4uLm6ubi4t7e3t7e5ure2tIlyd3h9iXxwem99c2hqbGdnbHRscXd0cWx2c3Fxd3FyfHl4g3Z7d2mLkYp9kM7f3d7e3tvY2drZ297f39/e3+De39/f3Nvc3N3e3uDg3+Dg4ODf3t7e39jS397f397e3t/f3t7f3t/f3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLi4eLi4uLi4uLi4uLi4uLj4+Lj4+Li4uPj4+Pi4uLi4+Lk14NoZ3VkVlVkZVdKWllXW1Q9RU1LSD04NzU3NjQzOTQ0Nzc1Njc5PTo9Pjw9PDk7PDk5Oj45PD4/PkFBQ0FFRUQ+OzxBPjw5PDs3Mzc+REhFSqG2tbW1tbW2tre4uLi4t7e4uLi3tra2tra3uLm2traLfXpsbHp/cGx5dm5qaGdlcXp4b2lvb3B1c21zd4Fnb32CgYNyf3lqcHJ6f6ng393Zy8a/vL2/vsLN0tDW3tnc4NfQzcPCw8PH1dfT2dzX1NjX0MfExce9vM/Kz87Y3djO3N3c2t3T0dze39/e397e3t7e4N/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eLi4uLi4uLf4uPi4eLg4d7W29/Sw8rJx9Hb3OLk4eHg2dre1sbExcTN2trf5OHi4trX3st9aWZxYVleZWFNTFRLUlpMO0hNSEZBPTc2NjUzNDY2NDg3NjU2OTw7Pj46Pjk5PDk3OTs7Oj49PEBAQ0RCR0ZCQT08Q0A9OTw7Nzc3P0RGRkaZtrS1tbW2tra4uLi4uLi3uLi3s7W2t7a3t7i5tba3opdxb29waW50dnFmZWNrbmdvcm1mZ2tygWVvdnyAeGRzj39zaHFyaWVlbm+w39HFv7u5ubm5ubq6uru6vc3Gw8e/urq6uru7u8HCvcHFvby/vry7urq5ubq6ubm6w8XDucDDwby/ube/z8/U3tjc3t/g3tLa4N/f4ODg39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eDg4ODg4ODg4ODh4eHh4uLi4eDh4uLi4uHa2t3RwsPCu8XT1uDdydPDrrnAsaqrq6uwtLbJ0sXRxLG4v7Srq6usr7S0vMzE1c60tLureGxtbWBdYl9ZS1NVVFFQREBRTUhEPzo3ODU3MzE1NjQ5ODQ2Njo8Oz08ODw5Njo6ODg5NzU8PDw/QEFAQkRDQkE8PkI/Pz09PTc1OD5DRUNAj7a0tLW1t7i4uLi4uLm5uLe1sautr7Oxs7OztLS0tqaei2tue3ZxeXhnY2hfcXdha25vaG99b25ja2lseHdsa4Z+bHB6dm1scG95sca8uru7urm5ubq6urq6urq6urq6urq6urq7u7q7u7y7urq6ubq7u7q6urq6urq6ubi3t7i4t7e2tbW1tbi3u8e+w8XHzcS4wMnH0tzZ2d/e3uDf39/f4ODh4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh3Nji4uLi4eHh4OHg3tfGxtHQztTe3tPO0t/SuLi8sq2trKysrrG+ua63rKipqamqq6urqqqqq6ysuKyqqqqrq6urra6urq6urryzrayrpHlub21fXl1dVE1SU1xUSkE/UElIPjg5NjgzNzMwNTczNzg1NzY2Ojw/PDg5Ozo6Ojg5OjY1OTs8Pj9EP0NFQkNCP0BAQT9APjw3ODc6QUVEP4W4tLS1tbe4uLm5uLi3t7SurKuqqq2urq6vsLGzs7WjcG5ucm1wg311aWFlaGZkY2Rxc21td25naW1tZXBzb29zcXN8h4F6dX11n7u6uru7urm5ubm6urq6urq6ubq6urq5uLm5ubm6urq6u7q5ubm5ubq6ubm6ubm4uLi3t7e4uLe3t7a2tbW2tra1tbW1tba1t7e3t7rBvrzGycrb3+Dg3tvd3d7h4tDW4uHg4ODg4ODg4ODg4ODg4OHg4OHi0768zNjd3OLg0dnbxL23sLCxsa+zu7uzsLS9s66urq2tra2sq6qqqqmpqKmpqampqqurqqqqqamoqampqampqaqqqqytrq6urq6urq6sraR4aWJxZmFZWlZRUk5cU0Y9QlJEQTc8OzY5NTY1NDU2NTg3NTY1Nzg7Pjw7OTk5Ojg3Nzk3Njg8Oz47RD8/Q0BBREE+P0M9Pjw+Ojo3Nz9DRj54srCztLW2t7i3trKurq2sq6uqqaqtraysrq+xs7S1t4xucnRqaIB5ZmpmZWxdaG5waGxxYmNmcoJ+dmhobGpueoaBhXx4cXF5gK+6ubq6urm5uLm5ubm5ubm5ubm5ubm4uLe3t7e3uLm5ubm5uLe3t7i5ubi4uLi3t7a2tre3t7e3tra2trW0tLW1tbW2trW1tre3t7e3t7e3tre4v8bP0MS+v8DE19e8ydra4OHg4ODh4eDg4ODh4eDb3t7Uzby3tre6wMDJxLfIvrKwsLCwr7Cvrq6ur7Cwr66urq6uraytrKurq6qpqampqampqampqKmpqKmpqampqKmpqKmpqqqrraytra2ur66trK2heWpkbWdiXFhRUFFLVEpCOklRP0E3PDk0OjU2NTQ1NTY4ODY4Njs6OTw9PTs6ODY2ODg6ODY3Pj08PT5BQUVCQkNBQUBBOj09Pz05Ojc9QUc8bKqmqKutsLGwrqupqKqrq6mpqamrrKytra2usLO0tbilgIdvaWdzdGZrcG1qZGxvcm5rbWNrcHyJhG5qbHx4Y3uKfnNqc25rcY+7ubm5ubm5ubi4ubm5ubm5ubq5uLi3t7e3t7e3t7i5ubi4uLe2tra3t7e3t7a2t7a2tra3tra2tbW1tba1tLS0tbW1tra2tra3t7e3t7i4uLe2t7a2uLm4uLe3uL6+uLq9vcfb4OHg2Nnd4eHg3dfKwcPCurm5uLe4uLi3tbS0tLKysbGxsLCvr6+vr6+vr6+vr66ura2srKyrq6yqqqmoqKmppqepqaehpaipqamoop+hoZyip6inqausrK2ur7Cwrq2unXdwbGphY2BZUU1RTFJGQzlNUEU+ODs3Mjc5Njc0NDM1ODg3OTc7OTo9PTw6Ojk3NDo5ODY1OD8/QEI9RENDQ0FDQEJBQDtAP0A/PDw6O0NIPWOopaWlpqioqKenp6ipqqmoqKipqqqsra6wsLCztLW1taWYdn5xZmt4cW9tZmVsaGNsZ2ZpaX11bWlvfXZ5hWZod294b3Fvcninu7m5ubm5ubm4uLm6ubm5ubm5ubi3t7W1tba2tre3t7e3t7a2tbW2tre2tbW1tra3t7e2tbS0tLS0tLS1tLS0tLW1tba2tra2t7e3t7e3t7a2tre2tre3uLe2t7i4t7i4uLi4wMXTyry8w83PyMC9urm5ubq6ubi4uLi4t7W0tLSzs7KysrGwr6+vr66urq+vr6+uraysrKurrKysq6ehoJ6gn5udoaGdlpmkpKaon5mZmZmanZ+gn56fpKqtrq+ura2srJl1cGlrY2FeXVVOU0tSREQ4TktHQTo4NTI2OTY1NDczNzc3ODk3OTo7PT0+ODg4NzU6OTk1OD9AQEFEPkZBQkNAQkNCQT88QEJCQD0+OjpERj5cpqWmpqampqanqKenqKioqKenqaurrKytra2ttLS0tbekc311bnONf3JmanFjaW1jaGZobG51aV9jZ3VzdnpuZ3Bwcn56cYihu7m5ubm6urq6urm2s7a1uLm2trW1tra1tbW1tbW3tra3tra2tbW2tbW1tbS0tLa2t7e3tbS0s7O0tLW1tLS0tbW1tra2tra2t7e3uLe3tra2trW2tbW2tra2tra2tra3tra3uLi3uri4uLi3uLi5ubm5urq6urm4t7e3t7W1tLS0s7OysrKxsbCwr66urq6urq+vra2srKuppaSmpqScmZubmpmampmXl5eXl5aZm5iZmJmZm52en5+dnJ6gpKWko6OioqKQdG5jcGFeXltUU1RIVEo/PFFCRkM7ODYzNzo1NTQ4Mzg5OTc4OTc7OTs9Ozc6NzU2OTk4NTg+Pz9ART5CPz9DPzxBQUI/PT9EQT8+PTk9Q0Y/VaSlpqanqKeoqamop6ioqKioqKiqrKuqqaipq7W1tba5o3eKcXKHhnd0cGh5a2JjYWVsaW5zal9jZWNjZWprYmRqbHaXjX6ovbm3tre5u7u6uLWxrKurqq6wrKyrq62tq6uvsLGvr7CytbW2t7W1trW1tbW1tbW2trSvr7O0tLSvra6vsrW0tbW1tbW2t7e3t7e3t7e3t7e3t7Owsra1tLa2tre3tra2tbW1tra3t7e5uLi4t7e3uLi4ubq6urq5uLi3t7e1tbS0tLS0tLS0s7OysbCvr6+vr66vr62oo6KgnJqampqZmZqbm5qampqbmpmZmZiXl5aYmZmZmpycnZ+foJ+goKChoaCgoJ+fi3RuaXRdYGZeUlRLRFRJPUVTSEVCOzo0NDY5NDQ1NzM4ODg3ODk5Ojs7Pz04OjkzNTg5NjM5PT5AP0A6QEJCQkA/QEJCPz0+QUFCPz06PkVDQFGjpqWlp6inqauqqKaoqKipp6ioqKinp6ioqaq1tbe3t7KZtH99kIx1Z2lqbGZjYGNoZW94cGlicXx5cGpmZmRma3NqhYystrKwra2ttLeysLCtrKuqqaiop6ipqampqKinqKipqaeoqqurra2sqqytraysrq6traunpaSnqqyopKOkpamwsbGztbW2t7i3t7W1tre4t7e3t7Kppaasq6ivtLa1s7W3t7a1tbW2tra3t7e3t7a2t7e3t7m6urq5uLi3t7Wxs7S0tLKxsK6sq6yurrCxsK2rqqmqqKijnJqZmJmYmJiYmZmZmZmZmpqZm5ubnJybmZeYmpqcnJydnJ2foKGhoqKioKGgoKCfnop1amtuWVxhVktPREdVRz5PV0hEPTw4MzQ0ODQ1NDgyODk4ODk6Ojw5OUA8Njk6MzY3OTE0PD8/QEBBOkNGRUJBREJDQTo7P0FCQz9APUBEQ0BPo6empaemqKqqqqakpqenqKioqKimpqaoq6uttba3t7e4rbJ1cHuDdmBiaWtiZWZhZGdmfYh5bHKAfXFvcXhjbW5xZo+srKurq6ysra6urK2trKyqp6WmpaWlpqioqKiopaeoqKioqKeoqampp6Wko6KioqOioKKioaKhoKChoaKjpKOjpaWlqLC0s7OzsKuqqaqztLa3trGopaOioaGipKiqqairs7Sxrq6xs7W2tra3uLi3t7e3t7e3t7a2uLe0sa6ppqerrKmnpqWkpKSkpKWnqaajoJ+enZycm5uampmZmJeXmZmYmJiZmpqampqampqbm5mYmpydnZ2dnZucoKGgoaOjoqCgoKCfnp2FdGtsaFdYU0pHTUVITUdAU1dGRz09OTM2Mzc0NTU3Mzg6Ojo6OTw9OjpBPDY9ODM3ODgzNztAPz8/QDpCRUNAQkRDQT87PEBDQkNBQDxBQ0A9TqKnpqanp6mqq6mkpaWlpaaoqKippqanqKmpqrW2tre3t7izc2h7c2JnamtpaWJhZGloXV1tfHJma3J/fHR8bm1zc36gqamrq6uqq62trKusq6mpqKWjpKampqWmp6eqqaamp6enqKinp6iop6WjpKKhoaGhn56en5+fn56foKGho6Wko6OkpKSmp6enpqWkpaampqeqraumpKKhoaChpKWlpaenpaeoqKalpaivtLa3trW1tra1tbOwrKupqa6rqKWlpqampaSkpaWlpqWkpKSkpaKhoaGgnp2bm5ucm5qamZiXmJiYmJmampmZmZmYmZmZmZqZmZydnJycnJybnJ+fn6ChoaKgoKCfnZ2cgHNrbmReU0pITUZETEtFRFFTQ0c9PDgzNjI4NDY0NjQ4OTg6Ozk7Pjw5PTs5PTczNTk2NTY8QD0/QD88P0JDPkJCQj89Pj5CQ0FFQD86PkVAO0+jpqWkpqeoqaelpKWlpKWnp6eoqKanp6alpqa1tba2trW2uYptcW1vfHxxZ2pmYGFsYFROW2hqbm9tgYJ9cWdxdn6aqKeoqqmpqqurrKqqqqimpaWkoqOlpqalpaWmqaqppqWjpKWmpqSjo6KioqKgoJ+fnp6cnJycnJ2dnJ2en6CioaKjo6KhoqKkpaSioqOjpKSjpKSko6Ggn6GipKanp6ipqaelpaSipKSlqK2wsKyrqqusqqmnpaWmpaWlpaalpqioqailpaWkpKSlpKOjpKOioaGhoqKgnp2cnJubm5qZmJiYmJmam5mXl5eWlpeXmJiZmpqcm5qampubm5ucnJ6goKGgnp6enpycm356bnJiXlNNSlBFRk5NQkBPRT5JOz01MzYzODM2Njc1Ojs4OTs5Oj49Ozo5OT03NjY5NjU2PkI+PkE/PT5DQT5DQ0BAO0BAQkJCRUA+Oz5FPzxQoKSjpKOjo6SkoqSlpaSlpqamp6empqalpqaltLW1tbS0tbiBaHx9ZXOCemxwdWFfY1ROT1FbaGxpbGxxbW5xbnScoqSnqKioqauqqqqqqaempaSjo6OjpKSlpqalp6ytqaShnp2eo6Shnp6foKCenJ2dnJycmpqam5ucnJubm5ydnp6foKChoJ+goaOioKGjpKSjoqSlpaWkop+go6SkpKapqainpaGdnJ+jpaipqainqKioqaempaWkpKSlpqampqampqenpaWko6Ojo6KioqGhoqKhoqOkop+enZ2cmpubmpqZmJeXmJaWlZSUlJWVl5iYmpubnJuampqam5ucm5ucnp+fnpucnJyam5p/fnF0YFtUTUdNSEZMSj8/TkM8QDs8NDM4Mzc0NzY3ODs9ODo6OTk7PTs7ODk9Nzc4OTU4OD9APT9BPjs9RD89REA/PzpAQUE/QUVAPjw8Qz88Tp2ioaKioKCipaSkpKWlpqenp6empqampaampbW1tbS0tLS3jHalsXdmc3Jvc2xjZGlYT1JRT09dgG1kYFptkZGSoqKjpaampqenqKiop6alpaSjoqGhoaKjpaempqesrKemoJ2cm6Ghnpuamp2cmZiam5qampmZmZubm5uampqampucnZ6goaCfnp+hoJ6foqOko6Omp6inqKWioKGhoaGkpaWlpKCcmZmbnqOmpqampqanpqempaOlpKWlpqiop6enpaWlpaWkpKOjo6KhoqKioqKhoaKjo6Kgn56enZybnJubmZaUlJSTk5OTk5SUlJWWl5qam5ubm5qZmZqanJ2dnZ2dnZuampqamZqXf3dvc11aTkhKTkdFRklERU5APD09PDQ1OzQ2NDY1Njc5Ozg5OTg5OTw7PDc6Ozc4ODg1ODg/Qj9BQTw+P0A8PEJAQT49QT4/Pz1CQUA6OkA8PE+doqGfoJ+dn6OkpKSlpqeoqKenp6ampqampqW1tLS0tLS0tbSXtqd1Znh2Y2xjY2VjW1JTU1JNXqCMeFhodpajnp6hoaOjo6OjpKSlpqalpKSioaGko6OjoqOlpqWmpqenpp+bmpuioJmWlpWam5mXl5iYmpqYmJqampqbm5qZmZmenZ2goqOjo6KkpKWinqGhoaKjpaampaSjoaCgn5+hoZ+goJ2amJeZmpygpKOjpKWmp6alpaOjpKSkpKWnp6ampqampaWmpKOjo6SjoqKjpKGfoKGhoKGgoaCfn56dnZyamJeVk5KSkpKSkpOTkpOUlZaZmpqbm5qampqbnZ6enp2cnJybm5qamZmZlH10bHReWk9IRUdGQkVORT9GOzo+Pzs0Njo2OTM2NDY4ODo4OTc4ODo8Ozw5Ozs6OjY3ODk5Pj9APjw9QD5AOjlAQT89QT8/QUE+QUE/Ojk9PjpQnaCfnZucnJufoqOlpaWlp6iop6ampqanpqantLS0tLOysrGwsK2rkHiGj36bmn93Yl1TUlFRTGKgootaiKCgn52YmZycnZ2eoaGgpKenpqWkoqGjp6alpaKipaampaanpqagm5mboaCXk5OSl5qcmpeXl5iampmampqam5qYmJmaoKCgoKGfoaKipKamop6gn5+goaOko6Khn56enpyanZuZmpqZmJeZnqChoaKioqKkpaWmpKSkpKKioqKkpaWlpaWlpaalpaOko6KioqGgoKGgnp+fn5+fnp+foJ+cm5qZl5WUlJSTkZCQkZKSkpKSk5SVl5iZmpmZmpqam5+fnp2cnJycmpmZmpiXl5F8cmdxXl1QRj9BRD9KT0JCRjhDRT4+OTg7Nzc0ODQ1OTo6Ozk3OTo8Ozo8PT48PDo2NzY5OD4/QT47Pz49PDg6PkFAQUE/P0FCQERBPjo4PkE8U5ycm5uampycnaGio6KjoqSmp6alpaampqSjo7KysK2rp6amp6alpqiln6iop6qnoXmEXFFST0xcnKCAYpmgnp2clZOVlpeZmp2dnqGmpqampKOioqanp6ajpaampaWmp6amop2cnqGfl5GRkJSXm52YlpaWmJuZmpqampqZl5iam6Ghn56fnpybnJ6goJ6dn56fn6Cio6SjoqCfnp2ZlpeXl5iYmZubnqKioqKioqGio6WlpKOio6SioaGhoqOkpKSko6SkpKSioqKhoqGgn5+gnp2enp2dnZ2dnp6em5mYl5WTk5SUk5KQj5GSkZKSkZKTlJaXl5iYmZqampyenZ2dnJubmpiYmpmXlZaNempmamBiTkY+P0A9SkVAQ0A7QEE8Ozs5Ojc2NTg0Njc4OT04ODs6Oz87Ojs8Ojk6Nzc2ODs7Oz08Ojo8PTw3Oz5DQkRDPz1BQ0FEQT88OkBCO1eZmJqamZmam5ucnp2foqKhoqSlpKSlpqSioJ6op6alpqWlpaemp6ampqakpaanqKehqXJOUU1KVJahenKanJyenJeVlJWWmJiXl5qeoqKhoqOkpKOjpaalpaanpqSlpqalpaOgoKGhn5mSkI+WmpmenJaXl5eZm5ycnJqamZeZm5uen52cnZyZmZqcnZydnp6fn5+hoaCgoaKgn56bl5WVlZeanZ6fn6GhoqKio6OhoaCgoJ2cnaGioqOkpKOioaSlpKOko6SjoqKioqKhoKGfn52cnZ2cnJ2dnJ2enpqXlpaVlJOTkpKSkZCRkpKSkpGSlJWWl5iYmJiam5ycnJycnJ2cm5mYmZiWlJWXi3hsY2RiZFFHQT1DO0tIRDo7Ozw+OTo6OTo3Mzc5NTo4ODg8OTg7OT09Ozo7Ojk8PDc2NDc/PDo9Ozw/Pjw7ODxBQ0FDQkI+P0NAQkFAOj9APztZmZiampqam5ubm5ydoKGhoaGhoqKioqKhn5+dpKWmpqenpaWmp6ampqWkpKalpKSkpaaGUFJQT0+PmHB6mpubnJ6cnJycm5ubmZiYm56dnp6foKOkoqGhoqKio6SkpaalpKOjoaGhnpyalZOUmJuam56amJiYmJqcnpyam5iWmZybnJycnJydmpqbnJ2dnp6dnp6fn52cnJyhoaCblpWVlZacoKGgn5+hoKKjoqOhnZuZlpaWlpicnqCip6ikoaCgoqOjoqKioKCgoJ+fn5+gnp2cm5ucnZydnJmanJuWk5KSkpKUk5KSkpKSkpOSkpKRkpSVlpeYmJiYmZqcm5qbm5ucnJqZmJiXlZWWl4d3ZGdoZGJNQ0U8RDlJSkU5Ojs9PTo6ODg6NjQ3OTU8OTY4OTc5PDs7PDo6PDs6PDw4Nzg3Pj07Pj46Qj86Ojo/QURCQ0FBQD9EQUFAPjpAPj06W5qYmZqbmpubm5uen6CgoaKioKCgn5+enp2dnKWkpaanpqWlpqakoqKio6Oko6Kjo6KnllRYVVJOZ21rgZ6am5udn6Cgn56enp6dnJ2dnJ6enp+goaCfn6CgoKGio6Ojo6OjoqGgnpuZmZiZmZmamZienpiYmZmam5qWlZeWlZicnJ2cm52dnpybnJ2cnZ6bmJqeoaGdm5udoKKhmpWVlpaZoKKgnZueoKGjop+em5eXlJKSlJeYmZ2goqenpaGgn56goaGioaCfnp2cnJubnJubmpqZmpydnJmXmZaVk5GQkJCPkZKSkpKSkZKTk5OTk5OTlJWWlpeXl5manJubnJucnJqamZeXlpaVlZSEcmZsYmRbREJMPT84RktCPEA+Pj05Ozk6PTg1ODg2Ozg1Njo4PDw7Ozw8Ozk8Oj09OTU4Nzw5PD88OkE/Ojo6QEBDQkRBQ0A/Q0FAPj08QD09Ol+al5mamJeYmpycn5+foaGhoJ+fn56foKCenZ2lpKSko6OioqOjoZ+foaGipKOio6SiradXXl1UV19ua42dmpqbnJ6dm5ucnZ+enZycnJydnZ+goKChoaGgoKGgoKGioaGioZ+enJqampqbnJqZmpuZnJ6ZlpaWl5eTjo6QlJabnJuam5udn52cnJycnJ6dlpSZnJ+in5ycnZ+hoJuXl5mZmpycnJubnZ6fnZqXlpaWlJOTlJiampqfoKGmpqWgn56fnqChoaCenJubnJybm5ybm5qZmJmZmZmXl5iVlJKQkJCQj5CSkpKSkZGTk5aYl5STkpSVlJWWlZaZmZmam52cnJyampmXlpaWlpaQgG9vZV5gV0BKSDg/N0lFP0VBPD07Ojo8Ozs3NTs4Njs3NDY6Oj47Oj0+Pj07Ozs+Ozo4Ojk5NkBBPTo8PTo6OT9BQ0JERUM+P0FBPz8+Pj89PDtgl5WXl5aVl5mbnqGhoKGioqCenp6enqCgn52bpaWjpKSioKCfoJ+dnZ+hoqOjo6OkobCjXWVkYGFua4GenJubm5ubmZianJ2enJubm5ycnJ6ipKGeoKGhoqKhoKCgoaGgn5+enJqZmpubm5ybmp2dm5manJiXlZWWkY6Nj5KYnZycm5ycnqCdnJucnJyempWVm56foZ+dnJyenp2cmpqampqampqbm5qXl5aTkpWVlpWTlZaam5qanZ6foqWjnp6fn5+en5+enZ6fnZycm5qcmpqbmpiZmJiYmJiYlZSTkZCRkJCQkZKTk5CRk5SYmZiVk5SVlZWWlZaXmZmXmZqenpyamJiXl5aWl5eYjX1ubV9lVlRFSzw3PjdSRUM+QkE4Ozw7OTg6ODY7Nzc6Njc5Oj0+Ojw8PT49PD06Pz06ODw9OTtAPj4/PT45ODs/QkNAQ0VDPT9DQj5AQD5APTw8YZWSlJWWlpeanJ6goKCgoaCgnp6enp6gn56em6WlpKOioJ+fnp2dm5mbnJydnp+gn56rmGNpbW5pZm2enZybm5ybmpmZmZqam5ucm5uam5ygo6SgnZ6en6CgoKCgn6ChoKCfnpuamZqam5qbm5ufnpyZmJqamJiYmJKOj5OXnJ2bnJ2cnJycnZycnp6dnpqVl5ygoaGfnp2eoJ+cnJuampqbmpqYmpmVk5OTkpOWl5eVlJiYmZucnJydoJ+gnp6enp+fn56en6KjpKKgnp6cm5qampuZmJmZmJeXlpWUlJORkZCQkZKTk5OSkpOUmJmYlpWUlZaWlpaWl5iYmJiXmZqamZeXl5aXlpeWl4l4dmddX1dURUU5OTs8WT5AOEI/OTs7Pjk4Ozg6Ozc5OjU4OTs9PDk9Oz0+PD0+Oz8/Ozk+PDw+Pz5AQUE9ODc7QkNFP0FFQz1AREJBQEQ7Oz47PGKWk5SUlpWUlpiYmZubnJycnZ2cnJ2en56dnJqkpKSkoJ+enpybm5qZmJiYmZucnZ6cpolla3R4bVuFop2dnJydnJqbmpqampydnZ2bmpuboKKinpucnZybnJ2enp2dnZ2fnpyampucnJycnJycnp6cm5qanZqam5yVkZOXm52dnJ2fnZycnJycnZ6fnp+cl5idn6GhoJ6cn6CfnJubm5qbmpmZmZmZl5WWlZaYl5eXlpaYmZuenp2dn6GhoJ+fnp6fn5+dn5+hoqKhoZ+fn5yZm5qcnZuampmXlpaYl5eXlpWTkpGTlJSTlJSUlJaZmJaVlZeZmJeYl5eXl5eYl5iXl5eXlpaYl5eVl5eDeHZfW11eUT1GOjk4P1VDQTtDQzo8Pz86Ojk3Ozg4ODc0ODk8Ozw4Ozs8PTo9Pjo/QT06PTw+PkA/PUBBPjk2PERDRUBBRUU9PkVERD9COzo8OTpkl5SVlZaUlJSUlJWXmJiamZqcnJydnp6dnZybo6Oko6CenJuamZqZmJiYmZiam5ubm6WJa3F2em9lmp+enp2dnJybnZ6dnJ2enp2dnJydm5ygoJuampubmpudnJqampucnJuZmZycnJ2dnZ2dnZ2dnpybmp+fm5ydm5mZmZudnZ2dn52dn5+dnJydn5+fn5uanZ+goJ+dnJ6gnpubm5ubm5yampuamZudnJqZmJeYmJiYmp2foKCgoJ+hoaGgoJ+en5+fnp6foaKhoJ+enp+enJqam5ubmpqZlpaXmZmYmJiWlJOUlJWVk5OVlZSVlpWVlZSYmZuamZaWl5WWmJiWl5OUlJGRk4yRkJOWfXhqYWJiXFA8QDw2OENWSERCOjg7Oj47Nzc5Nj06OTk2NDc6Ozw9OTo6Oz87PT08QD47Oz46PT89PkBBP0A8NztBQ0U/P0REPj9EREM+Qj07PDs6Z5aTk5OTk5OTlJSVlpeWl5aWl5mbm5ybm5uamaOjoqCfnpuamJeYl5eXmJmYmZybm5qkgGpqb3lzcZegnp2dnJydnp6enp+enp2cnJydnp2bnJuampqam5ubmZiYmpqamZmZmJqdnJydnZ2dnJ2cnZ2cm5qdn5ucnJubnJubnZ2dnJydnp2enZydnZ2cnJ2dm5uenp6dnZybnpubnJycnJydnJubmpmbmpmYmZmYmpmZmpyfn5+jpaKfoaKioaGfnqCgn5+fnqCioaGhn5+fn52ZmpudnZqZmJWWl5aVlZaTkpOUk5STkJCSk5GUkY+OkJGOlZabmJWYlJmXlJiRjJCPk5yTkoyFjIeDhndxZ2pkW1xRQT44NkJHYEJFR0A+Ozw7Ojg4NjU8ODo4MzQ6Njk9PTk5Ojs9Ozw6PD48Oj5AOj5APjw/QD8+PDg6Q0FEPz5CRD8+Q0VCPUJAPDw8OmeYk5KSk5OSk5SVlJWXl5aWlZaXmZmZmpqampqkoqCfn52bmpmYmJiXl5iZmJmcnZ2cqH1nZXN7enOJop+enp2dnp6enZ2enZ6enp2dnZ6cm5ybmpubm5ucm5iYmJmZmJiZmZmbnZycnZ6enp6enp6dnZybm52bnJybnJ2dnZ2dnJ2dnp+fn52cnZ2dm5qbnJmZnJ2dnZ2dm5uanJ2dnJycnp2dnZybmZeVlZeXmJqam5ubnZ6foqOhoKGhnJucm5ubnZqcmZycn6CfnZiZmZmUkpKUl5SPj4+OkYyNiYuQi4mLjpGRj4mQmJiQkoyNi5KQj5iYoqiqpqWlrKOmoZqep6eyqKKVo6Cfl39wcWlsXFtcTUY8NzdHR1g+SE5URjk+Ojg5ODc1PTk4NzMzOTY6Pjw6Nzo8Ozo6Ojo8PDs/PjtAQD47PT5BPDw2N0A+QkA+QUY+PEFEQT1DQj49PDlmmJSTk5OTkpOUlZOVl5iYmJaXl5iZmZqampqaoqGfnp2cm5mYmJiYmJiYmZmZm5ybnKx/am16f3lxh6Genp2cnZ6enp6enp6dnp2dnZ6enJubnJubm5ubm5uZmJiYmJiYmJmZnJ2dnJyenp6enp+fnp6dnp6dnJydnJ2dnZ6fnZ2fn56goJ+enZ2dnZybnJ2em5qbm52enZ6dm5ubnJ2cnp2cnZqYl5SRjo+QkJGVmJSWlJiZmpudmJuYlY2Mjo6TkpKRj4mQjpGRjo+Ki42NjYiIi4+Lg42NkY+MkI2Qk5WVnJihoJySn6SipKmam5eanKOprb3Bwbq8uL26ucC8ubq3uru7tL2zwbV/bnVmZ1peWUxJRTo7TElTPFZSSUM6QTo7Ozc3NTo6OjgyNTY4Oz08OTk7Ozw5Nzo4Ojw6PT85PD8+PDw9QTs5NTg8O0A/QT9EPTxBQkA8REM9PT06YZOTkZCUlJOTk5OTlJeYlpeZmJmYmZqbmpqamp+gnp+fnJqZmpqampmYl5iZmZmZmZmphXB1e4B3b4mhnp6enp6fn56en56fn56dnp6fnp2dnJ2cm5ubm5ubmpiYmJiZmZiam52cnJydnp2dnp6goJ+enZ6hoJ6dnp2enZ6fn56en6CenZ6enJydnZ2cm5qYnJuVmJqamJiYmJmSjJCXlKCXk4+MjYqKiImMiJORh5CPjYqKkJCLjoqMi4+IiImJjpGOjYaFiYaKhoWLiI+SkJCNkJKXlpKamJ2TlJ6kpqaqq7Gsr6+rpquqsbm5tbS0rqyvtMDIxcXBvsbDxMTDurW+t7a0s7C2tb6qcHRyXGZfXl1JRj8/RUtMVklcTEQ/PUI6Qzk5Nzc7OTk3MTc5ODo+ODg6PDw7OTc5OTs9Oj4/OT5BPDs+PD46OTY5PDpBPkNBQT08QkBAPkJEPj8+OVyHhIOHi42KiYaFgYqMkZOVmJiHlZaWkpiampmenZ+gn52ampubm5ycm5iWmJmXl5ibqo56dXZ7f3mCoJ+fnp+goKCfn5+foKCfnp2dnp+enp2dnJqbm5ybm5uYmJiXl5iZm5ucnJydnp6enpybm52dnZycoaGfnZ6dnZ2dnp2dnJiWlpaYlZWSlpmWk5GKjI+PjI+NkIuLj4+WiYiEi5GZjn2Fi42PjYyHioyQm4yRj4+Lio6TjIyNjIiSi4yFiYyPhouIh42KhYyEj4qXkJOYmpWbnKOqoaKknKKrsbe0ubWxs62vsrKlp7O6sbq6vLa3tsDDw729vLa/urq8wbW4wL60r66mqa+3mm58Z1tjWl1fSEU+QUtJUlhZXkFGOTk9OUY/Pzo3Ozs7NjM6Nzo5Pjg6Ojw9OTk4Ozk7PDo+PTtAQDs8QjxAOjg0Nzw7Qj9BQj4+O0NEREBDQz0+PjlhmZWLkYWNj5aSiHl9e3+Fi4OKgoqJhmuAeJCLlpqRnZ2UlJGTlpeampiWk42Sk5KQm5uIdndzcX1/cpGgnZubm5yenZ2eoKGgm5uWlpucmpybnJuYmZqYmJmampqWi5CTlpmYlZiYlpucl5WSkY2SkZCUk5KXm5mYm5ePjpCLjo2Ch4uLi4qLiI2RjIeHhoqIiZGKh4yEhYqNi4qNhI+UkIyDkJOUmZWQi5OTkZWRlpWOj5GMlI2Oj4qIj4ePhoeJiYmNiomJioWNh46JmJKUmpuXmKChp6Cko5qqqbO2sbWwqKmiqK6tn6qvsK21ubi8wr/BxLixtbCutrOwuL68ury+urOzp7G3wpB1gGNiXlpXUk1IRkVQSVlXX1tDUDpCQz1HRj84Nzo6NzU1OTc8OTw5ODo9Pjo6Nzs7Pjs7PTs9P0E7Pz48Pzo4NDM3OkFBQEI+PjpDREM/QUM7PT45Z6mloqKZn6CippeUiI2CiIJ1h4iKiIp7e3Z7enmPeoiSfn18en6CkYWBgH1zfH99fISHfnRweHZzfHaBj4iIiYeIioyMkZicl4iOhIuNi4iNkI+Pi5GPi4yOj5CQjouFhYeLjIyHiIuOi4eMhYaBjYuGiop/iYqGiJiRiIOIg4KFfIuLjIaJi4iKkIyIi42PjI+Wh4mLio6NjY2Wk5OdnJyalpycm56bmpuYnZeTkZWWkJKRi4+LlpSMjYqDi4SEiYyQkIqOio2LipGJjZOTk5SVk5KcmZ6Xn6CfpaKvsamupKSfmKStpqa4t6ysu729wsPAv7+vpa2wsLS3uLO0uLa0ta6stK+4tLaBeXpjZmBeVlBRQUVMT0lcXl9UR0dCS0xCREA9ODg7OTU3Nzk3Ozc9PDk9Pj05Ozg6O0A8Oj06PkJBOD88Oj84NjQyOTtCQD9CPj04QEI/PkBEO0A+N2CloJqXnaGaoaCPl5efl5WCjaCfo6GdmpKOjIxycXBvdnFucG1ucHZub29waHBxcHR+c3FycXd7cnl2d3Jyd3Z6e3l8fXt/iIGEi3+PkYaNi4uGiouLiYaEgYaCgIKJkYOAg4x/ho+LiYWAh32AgZKQhoSEho2DhIyPj4+IjY+Hi4iRkJWRjpCKk5eOj5WYp6SfnZWYlpaln5udq6aqt7W4srGnr6qnpqGfmp2WkpWVkYqPjImTjZuVjYuLhoaJjJWQkJCLmZKVlZSbkJiTlIyNkYyWl5WilZ6mqauno6OqsJucpp+mq6G0vb6zs7+5u7u6uby9rqiusa6wuLyztLGxqrCpqLGxsqild3J0X2hhYFRWUUlKSFZNXl5eVExKRVFKRUdDPTo5OTc0ODY4Mzg4PTo9PD47OTs4Ojs/PDw+OT9DPzg7Ojg8Nzc2Mzc5RT4/Qz89N0BAQT0/RDw+PThUj4yGh4eUjJWZl5yWmZaNlZyWlZydoKCdmpiWeHFubXJ4cXFsbnJwa3FvcG1yc3t1dnd5fnVxeHZ0d3tybn98gX15eH1/eYOGg4WCg5CLkIuLi42Pi4mJhYKBfX9zfYiAfpyQhIWFiYuPinp9fYaOjYqGjZSRi5CXj5SXkpihlp6XlZunpp+goKawq6GjpbW0sqqmqq+isba5vcK7ucO+vLi9uLWxrLCspZuSk5mfm5SPk5WOmp2doJqfn5edo6qsoZ+em62hp6qwqaampJiRkZWUo6SirKSss7Szs6i3tru4sLKvra2yt7a6srW6s7e5u7i8urayr6yxsbKztLOxsa2us7Gzs6yhl3Zxc19jXlJRVE1PSUdYT1pcZFROR1VPRURKRD44Ojg3NTg4ODU5Nzo6PTw/Ojg8ODk5PTs9PTpCPj84Ozo5Ojk4NjI1N0I+P0RAQDY+P0I/PEM8PT46Tn98go6MjJOTl5eaj5SWjZaRkZSXk5qanqGdnHJvcnFxcXFxcG5zcW91dHJxdneAdXd8eYV+d3t8eX1/fICJiYmDfXp/h4GIiYGAgIGGiIGGi4aIhYSIiImEf4J/enx8fX6SkH+IeIGFi4qDhIWKj4yNkZmdlJSUoJqan6Ktsa2ppKWtr6ysrLWuvrmtrqm1sLexq7G2rK+9wsLAvrq8trKutraxtK66u7OurKepp6unoqmtoKmooq+wuLSxvLq6urK0ta+8tLezt7e7t7mtrbCprLW5sbeytLe2sLu7vLu6ury1vLi0wbWsqqqrtLG3uLm1trSzsKymrrCqq7Cxq6yusLKxtK6qo5N4dnJlZ1tMUlBFTUlTV1JlXmdUUExcUUhMUkNBOTk3OTU4ODY2Ozc5Ojs6Pjk4Ozo6Ojw8Pj08RD45Njs7ODg+OTUxNTZCRkREP0A3Pj5DPjpBP0BAO0t/gomXmJSdlpabmIuSlo6XkZGVl5SZl5+bmZx8dHV2dXl1c3RudnJzdHV2d319gX56gXyDfoJ/fYB/hIKFj52RiYF/go+Xjo6HgoCBiIuFfoqQi3+HjYyLioeSioeGjZGTkZGEh319g4iMjouOiomQj46PlJSYkZWbmp2dqK6yr6+1tLOtsrW4sLy1tbGqsKqztbS7t7SztrS1r7i4t62noqassLCvtre3vrW5vLOysa61u7C0r6+yu7axuMC9tLS0s7izvLq2tLrAvbm6ubq+ubm5vrWysa+yr6q1tLGzsbSzrri4tb+vpKaoo6ussa+zrq6wsKytq6qroqKmqKKnrauqpaynoqeYeHlxZmVZT09NSVJNV0xPX15cTlVUYlFEVE07Pzk8ODk1Nzc1Nzk1Ojo6OTs4Ojw8Oj08Pj4/P0I9ODY6Ojk6QDs1MjY2QUZDQz4/Nz49Q0I5P0I/PjtLjpGTmJmVmZGTopiTkpKLk4uOkI+Vl5ablZSbhoJ9enh2dHRzdH53end2gIKDhouMhISFioaQiYeRk5aRjZaalY+IjI+emJaVkpCTl5qamJCdoJ2Tl5qgmZ2bo6CVkJugpKOak42IiIuJkZGOkY6LmJqPj4yUmpecnJufnKSstLm6vK+2tLi0tLK3uLmzq6+qqKy1srK1rrGrrqa3s7OxpaGotbCvrayrtbqyu7q6tLK3ur67ubG4sLmtqLK4u66ttLS3tbu2trm5vLe0r7G0t7a5s7e1pq2pq6ior6yprq2up6KxtLG0q6aop6Cjq66oqq6orLKwr6+pqKGeoaGjpqOgopqlo56ol3J3bmdiVUtUT09KQ1BLX2JYWlFcVGBNSFJJQUA5Ojg2Njc3NTg5NDs5Ozk8Nzs+Ojg8PD0/QkBBPTs2OTk5Oj87NjM3OD5GQkJAQjk+PUBDPkBGQj44R5OWkZWTkpSQkZ+ZnZmVkI+Sko6Mk5aWko6RlZGSkIaBeXJzdXuBhI6HhZGTkpicnJiVkJWYo5yaoaeqqZ+clpeVnaKioZyZnpmlqKyvramnqqmop6GlqKirqamvoZufoaOjoJqfoJyUjZiUmKCgoaSem5qkp6Spq66spaOoq6+xtK6qrK6zr6ystLO0ua6urayqrLKwsK2wqKqmsrS0uK6qtrqwr6qurLC3s7i0t7W0u7y4tbWxtauyrKiys7uvrbGytLa1sbG0s7OvrKuvs7a0sayutKqqpqWnrauoqKupqaifqbOwqqeppaOio7CtqaatpairrayppaSioKWipaOYmZyVnqKippdudWVnZFZPWEtLSktTVHBiWWRXX1tcUlpQTEM8ODk6Njk4NzQ3NzQ4Ojw6PDg6PTk3PDw7PkM/QT47OTo5Ojs+PTg0NThBREVEQkM5PjtAPkI/R0Q+N0KSm5SVlZaVj46Wl5qZlZGKk5SSjo+SkYqKiY2Ul5qTjYmCho6VkZSfmpuin5+jnqGhn5ijpKelpaapqa2rqaKmpKilpKGfnqOjra2srairrq6qqqukoaKlqaenqaijopybm6SgpaijoJidmZ+hoqmnoKKirqyrqqetrqilpKmpqammo6iqqaekp66wr7Ovq7Crqq+yr7Czua+rqLCxrrCyubO0r62vtbCss7GurLW1tLSzs7CvrKyqrKusr7G0s7CwrrCwsKyqrauqq6alrrCysKumqbCvqaOkqaunqKaopquwq6mvqaaoqaalo6iwraqpqKKpo6WnpKGhoKKloZ2el5aYlJugpKmUbnNeamlfVVpOUk5QT1JkXGVjW11ZXFBZT0tAPDs5Ojc6ODczNTMzODo9OTo4OTo5Oj08PEBEPkA9OTo8PDw+Oz45NTo8QkFFQUNBOT47P0BEQENCQDdAkZ6YlJeZlpGHi5SSl5GIg4mLk4+OkI2Hh4SFlZmWmJeZlpqeop2anKKkoaCdn5qfoKGgpqGgoKCjo6KlqKmrramqpqOmpaCloKaopqWnqKapqKOnppmcpKaioaChoaCcmJmfoKGkpKKenpagm5qioqChn6CiqKCcn6GloaCmo6KfpKGspp6foaGkrKqnrKivq6e0sa6ur7WyrKqwq6mtrbWwrq6srreup6yqpKivsq+sq7Kvqqqpq6utqa6urrGxraqtqaunp6uoqauinaapqKilqKisqKilpKWop6iopqmsr6+oq6mhoqKlo6Opq6ymqKWjqKKhoKSdnZ+hoZ2bnZ+amZWcnKOqlG9zZm5yZF1dUFVPV09eZGRsaGJiWlpSVE9NQTo9Ojo4Ozk1MTYzMjg4Ozk5OTk7OTk8Oz0/Qz5APTk7Ojs8QD0+PDk5PEFBRUFGQTo9Oz9BQUJBRUI4PYqWlJOYmpaPiISNjpGSjIiIiI+JiZCRjoqKiJubmZygpaKlnqKjoZqeoZyanZ6bnKOop6ugoKOYoJ2XnKGjo6WjoqKkrKilqaCepqmnq6mkn6Kgoqahpq6mpp2fn5+fn5manJyhoKGkn6GbnZqcoJ6hn56eoKOZlpqYo6KipJ+ZnKGhoqCbmp6goaSgnaejqrGorqusqaSqqquorKalrKqws6+rq6mwq6appaWoq6ynpqevq6Wnq6upq6irqqqrrailqKOmpaesqayoopykoaOmo6qpqKano6SnqKamqKepqKupoaKoo5yepqWjqKino6WlpqmgpJ6inpeYnZ+doqKlnpiUlZ6go5d1d2t2d2FfXFVZUVVWW2Necl9oX2NTUVlUSD48PTg7OTo4NTM3MzM0Nzo4OT05Ozo5PDxBQEM9PT44Ozw9PEA/Qz86ODo+P0NAREE6Oz48QD9DQ0VDOTyCmJmenZ2alZKKiZGRl5GQh4SJgoGNj4+Sj42cnZ+hpKmlqaeorK2moaKfmKSmo6Stsa6yp6asm56em5qjp6Cfo5+foq+qqqyoqKuwqaipqKGfoKeprbCyr6yjoqahqaWepKOipqClpKKlo56doJ6fpaKinp+imJWemp6fpKGblZigoZ2enJudnZuZmZWen6Oonp2iqKGaoaOmoqSoqaqoq7CxqKWlp6eopKWpqaqnoqWmqKadnqWloqClpaOlpqCjpaOjpaelqamqpKekpqKmp6SrqaenpKClqKynpqWlo6OnpJWdo5+bnaCjqaeopqGjo6mooKiioJyVkZqfoKGmopuXkpCamqCVfHdwfXlmW1tgX1pcVlxoZG9jbmlpYl5QUEA/Ozo4OTg8OzYzNDMzMzc5OTs8OTs7OT49QkBAPTs9ODw9QD08PENBPjo4PT9EP0M+Ojk/PEI/P0FEQjk6gJ6kp6Kem5+gmY+ZnaCWloqGj4iEi4qTl5SRo6Wnqq6trLOys7S4t62pqqevtLKxqq6usbKusa2lq7OssbGpq6+rq6y2r7Owq7GysaOfoqqpp663trS0trOvrKuuq7awqbKxra6npp6io6ObnZyXoqiloZ+eo5ueoZqWnaScm5aZoqefoJ+joJuUlpmWl5qfoJmVnqKZmJ2dpZ2gpKeqqaiqraylqaSlqqeqqaqsp6SkpKOimZmhnpqaoaCfpaWYnqSmpKqooqelpaGqp6mnp6ejqKWmpaGkqKeso6ekoaalpaOVl52Ym5mVo6elpaSfnZ2lo6Kqo5+amZiXnJyaoaGakJOTl5ibjX93cnZ4aWJbX15cYllgZG5ta25hX2RgUE9BQDs7OTs4Ojk2MTQzNjQ3Nzc6PTo8Ozk9PUI/Pj89PDo/OTo7PD5BRUA9OTtAQT5DPDs5PzlAQEBAQkM7OXuao6OcoJ2dop2Zn6KioJibmJaYkpSQm5qWl7S0rrW4s7S4tre0uLm3tbm4ub28uKqLnLK4vLS9urW7uru4s7q/uLe5u7G3r6iusq2inJ+qsri8vL27ur+0r7GztbS3t6+1tLWysKikop+gl5Wal6SqpqahpKOkq6WlmKGko52goaKooaOgpaGck5mYmJmco56cmpudl5uZlqWam5+hqKmpqKuvr66pqKmrrKytq6irp6WjoJyfo6Ojn6Cipammmpyip6Spn6GjoqKgpaanpqSooJ+ipKGjoqiop6OloaGopqalo5mbmJuTj6GknqKfmJiVoJuhpaCfm5udnJuamZugmo2YmZiTkYaAdnh4eGNbUllUX19ibGh1a3BnaWliWVNMQDw6Ozg5Nzk3NTU2Mjg1Njc3Ojw7Ozs7QD4/QD0+Pjk6PDk2Nz47QkZCPDg7P0NDRDw+OT43PkFCP0ZDOzhwkpqblJ6bm52Vl52doqajopaXnpaXl6GblJi+t7G4uba3t7i7l5S2vbu9vcDFtaK7mKC3v7+6wcm0nbu2sra/xcGooLa0urGqrrSxsLG0tba8vb68vL3Guri3ur20r7Wxsbq4t7Kzsqqmpp+YpKSnqKSupKurtbWus6CnqqynqqmlpqCnoKGmoZOWmJ2foqSjnZ6coaChnZekmpmdoKaqqqqtrq2tsLGrrK2sqamrrqimpaalpqSkpqaeo6eppKGcoKKjpqCio5+jpJ2foqWgpJyboZ6fo6GhpaSlqaOkpaKlp6ehn52elpOcoJiZko+MjJeWn5uWnJqdnJqTlpSUmJOQmp2YiouHgIB8gnhhXllTYWhgZnNvc2l0ZGlkYltMSz46ODg5ODg5NzM0NTI1NDY2OTw8Oz08P0E/QEA9Pj44OTs4Njc/OUJFQzw7PD5DREM9QDs9Nz1DQ0BFQjw3Z4yRk4qalZiblZWYm6Knq6aVl5iQlZmhnpeXvrWztLu6ubi5woeYt6u4u8DCxbOjw6e4s72/tMTHvbS7uL62wMTErqCworW2tb2+wcPGw8O5vb/AwL2/xL28ur2+tKeqmLHAvbi1ucCzr6+qqqitp6ekr6eqtLyxtLWor7Gwr6yqoqajrJ+fpquXmqifpaWfoJydoKuwsKyiq5yYm6Cor7Kys6uorre1sq2tqaalqKulpaStqaShn6Cnnp6mqKmmnp+anqGlpqmcnaObl6KmmpuanZ+cmqGcmZ2eoKijn6GfnaWioKOioZSZmpmTj4qLhI2Qk5uPjpiVm5eYkJORkomNl5iYk4uKi32AgIVwYGFeXmpiYm53dXZubFtiUVVcTUc7PDk3OTc5Ojc0NDQxNDM3Njg8Ozs8PEBAPUA/Pj8+Ojo5Ojc6Pz5FRUU8PT1AQkJCQUI7PDhAQ0NARD87NV+MjIaFlouUlZeYl5ifpqellpWWkZebn5ual7mxtrO5vLy5urWqsryxvsG0vMe5uLuuv6fGw7/KxsnIxcXJvMLHx7+xsKe8vL7FxMbJx8XGu8TBxcbAua+9vMC+vrOrqoyzu760tbfCuq2vsLWqq6aqo62kp7G2q7WyrbOtqK6vp6awr7Ktqq+zpKu1qaeopKCgnqmyuL61tbWqqaausre4t7apq7i8ubexr66noqOop6SfqKOfnqCZoZydoqSnp6GelJuaoKGlnqChnpajnZSQlpiboZqflpORlpSin5qenJudoZ6kn56VnJiPkpOPjImTkJefiZCWkZuUmJGRlZaDjJWXlpKLjIh8f4N/amZoYWtsZm51cXJ1cWZeX1xSSUU/Ojo6Nzg0ODw3NjU0MjMzNjU3PDo7PDs9QD4/QD48PTk5OTs6PDw+QkRFPj49QENDQkREOzo4QUJCQUNAOTJbk4iEjZGKi5GRlZCSmp2fnJOSmJSdnZqXmpW2sbm1tb6+tri1uLO8vMTEusPHwb+0s8XFxr/CzcfLzszMx8HDx8fIysXExcO7vLzBxcHFxb/DwsbFwLGTvrq/w8K2trqptLO0qauzu7uxn5uxr6ykrK60p6qpqKqtrKmlpZ6pr6uyu7q4u7e5t7O5uLOurLO0qrC1ub3Bur6+vL60urm4u7qysbS8u7q7s7Oyp6Smq6uioaCdmpudmpyXmpuenJygnZaclpuZnZ6io52UnJCNiY6OkZ6bnJWMh5KLmJiVmpybmJybnp6cmp6UjpiYmpSRmZeeoZWYmpKXlJWRlJqYk4+TnZaSi5F+enx/dGtrbmRvbGhxeG95aWlhXGdhUUZEQTw5OTc2NDQ6ODQ2NTMzMjY1Nj05OTs7PT47Pj49Oz05OTs7Oz89QUNBQkJBPUBDQ0NFQjs4OUQ/P0BCPzsyV5uQkZCQh4WSjo2IjZCTlZGPjZSUm5STlpqRs7e4uLi+u7C1sri2tbbAw8G+w8LAvru+u7u8xMzEzNDLxsbAxcfLyNTLysfGv7u7vsS+xcjGxsTEw7i0wLe0vMHCucK3t7/Au66lrre8t62co7ewpq20tayupaWjqKSgoKWZqrOyvsG+urm6uLW0srG0tLO6wL7Av769u7u9vsDCt7a3tru7sru+ubi3u7a3tKyoqamrpqijnpOampyYkZKZl5GRmJqXnpiWk5acm5+elJOJiX6GiIuWlJiZkomVkZeVlJmbmpaYl5idnpyhmJWZmZyYl5ybn56jnJ6WmJeTl5yZmZyUlp2UlpOJdnh6e3Zua2lndVpmcndzeGZmXWRbUlhJRj87Nzg4NzYxNjk3NDQzMzM2NDY7ODo8Oz08OD0+PDo7PDs9Ozs+PkRBQURCQEBBQkNDREM9OTlCQD8/QD89MkyWmpaSk4yKmJCKi4yOkpKKiIaNkJiKj5CUl7O7tba/vb2xtrjBvby0uL/Bsbi3vsHFvbu8wsbJv8jOyMHEwcfKysbKxczIzcbIxb/DwMvNz8nGw8PEwsS+t77Bw8DEvsHPz87Gq6+2tLWroKe0s66ruLWzq6mjoq2prKatn6y1tL/Cvrm4vbawrausr7W0ur7Fv7u8urO5u7i5ubWtsLS9u7G/vLiytrmzubu0ra2orKyqqaeXnpualY2MmJSTi5WWlJyZl5WWmZKYn5mQiop+iYqKkY6Vl5OUn5mWkJSZmJmWmJOUm6GeoZiYmp2ZmZaenpibopqdnJuYmpuZlpeXlpyZlJyYfoB4eXV1ZWVpamddam9teHdjYmBgXlhXRkU4Ojg6OTc5NDQ5NzY2NTEyMzM0Ozo9Pzs9PTo6PTs8Pjo7Pz48QkBDQkJFQj0/Q0NDQ0RFQDk6QkFBQj5CQTVCkJeUlZmSj5qQjpKRjZSVi4qHjI2UiImPkpq2u7S8xsHEwr3BxcLAtLO9v6ywr7rDysPCvs3IxbfByMW/wcLIy8rCwsTJzM3Pz8zDx8bIyMjHycfFycfIx7/Fx8TEx8jK0s/SzLy4trS4uMG+vrq9ury6vKytp6q7urm3wLK1uLLAxrq3t8Gzsa2tqau1s7u2w7a2vbWxt762s7e4sLW2v7uwvbq0q7CxsbO8urOzrqutq62xnaOjoJqQjpiXlZCclpaYlpWSnJmTm5+clpGUjpWQiYyQlZOUm56YmZKSnJedlJmSk5aZmJ2VnJ6do5yVnZ+TnKKcnKCfnaOemJSVl5ebmpmgkH99cXRxb2JhZ3VnaWl0bXhsXWRbVWBZTEhDNjw5OTg4OjUzOjY2NDQxMzUyNTs6PD47Ozw9PDs8PTw7PD49P0E/RUFCQ0M+QEFARUVERUE7Nz5DQkI+Q0I4O4+akZaalJKUjZCUlI6VlI6Pi4yJk4uIkJObt8C6xsXEw8zCwcS9vrWvt7uvr7O6wMfFxMHMy8W2ucDCwsTHytHLwsPExsnFzdDOx8zJwsHGwcvLx8bMyc3FxsXDxsXJzdDNz8zHxMDDwsnNx8XBxMfBu760sbCwwb6/wca/vri3w8K6urbAvrWyrKmvsri+tMC0tLi0t7nEua+8vrm+v8K/tbq2q6qsrq+wt768trSura2utaSlqKimmpycnZyeopydmZOQkp2VmKCdmJiVmZmZl46MlH2QkJefmZmYk5GToI6Nko+VjpCUlaKdnKSem56elpyjoKGipKOkop6amZubnJ2enIN9cnx4cGdgamp2bGlldW5zYlxiVFdUU01HOjc7OTk3Nzo3NDg3ODQ1MjM0MjU7Ojk+Oj08Pz04Oz05OTk9PEBBQEVCQUJBQT9AP0RFREVAPDo+QkNCQENBOjSAoZeUmZiVkImUk5aTiZGMlJGOiJaKi5CXnMXLw8O8wMPHwbm9vbu4tre3rrK3uLzAwsDCx8bHurzAwsXHyMbSycHDxL+/vsTLyMrLyLy7yMfJzcjDyMnJxcXDwsHCx8fJysfMyMfIzcbLz8W3wMDAwLu6vbWzs7+/ub/DucC3u8G8uri7ub27srCvsKy5wri9ube1t7q9xb24xsjCwcLGwr28tamurrCwr7O6t7m2sK+tr7OppquprqannqSlo6OjoqCblZiekZecl5GRlZeZlZmRlJiSlYyYo5qcnp2FiZ+TfJKWlZKUlJennaCipJ+en56foaGkoqKjoaOinJ2fnqOhppl5enl/cnBmZWdkamViam1ubl5YXFZVTlBKRjk5Ozk3Njc3NjM3ODk1NjEzNTI3PDs8QDs/PDw6ODo8OTk4Pj1APz9GP0JBQz89QT5ARENDQTw5PENBQ0RBQDozbKKdlZedlo+PmJiZmIiSjZGVkI+Vjo6TlpbKy7u5urnBu7q3vsG8vLu5sa61uri4u8S6vsC+vru8wMXBxsK+xsG5u8O6uLm8vsHGwca6ucnJw8XEwMTBwsHEwcO+vcLAwMHCy8PGzMvFyNHCsL69uLq7vL63tLC5vrO8vrG5tbi7tryztbm2uba5t7GtusG6vMG/t77Ev8bDw8fHwrvAwr/Cv7iys7O1tLGut7S3tbSxrK2xp6Wlp7CtqJ+nq6ajqKWmpqCgn5SYmZSRkZWUl5OYl5qhnZ6hnKGdoaWglpSbkZeXmJqTnpmZqaSlpKWdoqCanqCkoqOcoqGjoJ6cnp6ppaiVfXuDeG5mYWRiYWJjY2piZmNaWVlcWVFORT07OTo7Nzc5OTY0OTk6NTMxNDUyNzo7OkA9Pzw8OTc3Ozo5Ojw+QD8+RDxCQURAPz49QkRCQkI+OjlCP0FCPT44NVmfnJiTmZaRlZiYmpeQkZCQk5GTlJKSkpSUxce4tbq5wrm5vMPFwri7ubGxtry6tbnAu7u5tre0tLW/u72/ub26urS/uLW3sq+7vLfAt73Cv8G7v8G8u8W+u8HEwL6+uLzBwcu+vcnEwMDKwLHBv7u4u766tbe0uLy0vbi1tLCzvLG3tri/tr25vb65t7q+u7/Axb29y8PGw8TAw762ubq2v7i7v7y4trOyq7CwsrWzs66sq6emnqeurauiqKumpqqjp6iqo5+Ym52bmpicnJiXnJuhpZ2anqGhoKGmoJqbnJiboJ+dnJ+coKiho6SknaKfmqKgop+el6Shop+dmpieqKWhi3x5h31xY2BiYmdqZ2ZpZWldVlVTWU9TS0U4PzY7Ojc3OTs2NTo7PDYzMTM0MTc7OTg/PT47PDs3Njk5ODo7PUA/PkA9PT9CPjxAQUNDQT9DPTo2PEBBQDw9ODdJlJibj5OUkZWYlZGWkpWRkJGUlZSTkpKYlcHCwLq8ub62uL7EwMKxvbqytLO4vLW3vMC8vbS1sbC1t7W7wbi+uL+8vbe1t7CuuLa5v7vAv7fBvLvDtrrIuLa5u725ura7xcXKvbnFwL+8wb64xr3BwLzFuLa3tLi2tru7uLa0t7q1tLi8vbm/ucPAwLu5vLu+vcjEvcfEw7rAvb62sra4srm0usLCureysaysq62yr7Kur6ijpJ6rrKyqpKakpKiqoqemraihoaGmn6Oiop6bnKKfoKOdnJuhn6KgpKCem5eZn6GdnZ6eoaWkoaKioZ6ho5yinqCZnZijn52eoJqZoKKmnYR6g4B4cG1lZWZvaWVraFhYTktLS1JJTEhDOT44PTs2Ojs5Njc8ODk4NjA0MzE3OTk7Pz0+Ojw6ODg5PDg6Ozs7PD1BPj09Q0E8P0NDREA/Pzw6Nz5CREE/QDg4P4mYmoyMkI+Tl5WMkpCakpGXmJaUlJKQmpTDvsbBwby8uLi6v7a8scK2tLyxtLa4s7q9v728sq2vrLGwt7y2u7zAxLm3t7e1urm6u8C+w8C6xMK+x7i5uK23tbi6tLizu8XGy8G7xsDAv728v8nDxMW+xri1srK9uLi4vrq6uby6urS3u7q5v7zEwL+5uri/ubvFxr3Fw8Kyur27sa+2uLO3s7q+wLm2rLGrrqmqqa2qqq6mpKWnrq2ppaOio6GkpaWmoqato6Klo5+ho6Gcmpyhn6CloaCenZygnaWgnpeVmZ2fn52gn6KmpaCknpybn6Ofn5mcmZ2epJyWnKOcnqGcppZ+f4Z8a25wZ3Brc2VibV9cVEhLSkRKQkNHPzk7OD48Nzs7OTc4Ozc8PDYyNzUxNjk8PD08QTs8Ojs6OT45Ojs9PUA+RD89PkRAPz9BRkQ/Pzw9OTc/QUNCQEI5Ojl3nJiLh4uQkpOWjY+TmpOQnZiSkY6QjpiSvbfHvsO+vbu+vL22uri9ure9s7OwuLi1uby8wLeqraSusLe7s72/u8S3tri2t7+/xLzC0srGx8rJxs/CwbiutbW8vri6sr7ExMrFwcnDwr+/vr3HzMfHxMe9tbW2wb26u7/CusDCv7y2t729vcHBwL+8ube8wru3v8W7wr++tbe8vK+vt7awtLO6ubq7r6mtq62rrKaqoqeuqKWqra2vp6Sgn6ajnqKjqKOjq6Oiop6dm5ublJaZnJyfpZ6fnpmYnpejoJyXmZqZmqOjop6jo6egpqCbnaCjnp2WoJmcoKCblJegn6WcmKKQgYaBcWVsaW50bndjZ2JcY1FLVEhFRUNHQzw7OTg9Ojc6PTo4OTs3PD01MzY1MDY4OTo8O0A9PDo+PDk+OTk9Pjs/PkM8Pz5APz0/P0ZEQEE/Pjo3P0BDQz9BPTo4ZqGYj4uNlZKVlY6PlpmVl5uVjoyMjY+bk7m2wbS/vLm8w8C+wLq1trKywLmvsry8sLe7tru8q6ujsLm9vrO8vrzFuLK4ub3HycrCzdnIy8nIzM7RzMrEtbrAw8i/vrW/wb/Gxr/LxsO/wbzAw8zKx8XGwLm9vMS/wL/CyL3Hx8XFvLrEv7vBv7rAvLu7wMS9t7nCub69t7S2uLqur7WxsLCytre0t6yurKqsrKuoq6Gms6qlra+trKippaOkp5+io6Onoaeiop6cnZyamYyQlpeZnaKZnpuVkp2UoaCdmZ6fmJimpqKfoqKmoqeloqCko6GbnaCbnKKfl5WVnp6kmpafiYGDgXRvbGx0a2xuX2NeYWFOSE0/RUA/REM8Ozo6Ozo4Ozw6OTw+OTo+NDQ1NTE5OTo5PDtAPD89PTw4PDs6PDs7Pz5DPkI+QD89Pz9FRUJBQj87Nj9CRUQ8QUE6OlmfmJOSlZqVmpOQlpeclZuZlpSVkZKTnZm2uLaxuru6vsG5uca7trWypb69tLbBv66zvbS4wbGwsbS8w7y6ur68xL+3vb+9x8zGxtfHq9TFxMrIzMzNysbCw8vOwry5vbq5wMO/yMbEwcG/xcDKycPDxMO5w769ub+8wsbCyc7Hxr66xr26v7m3wLm5vsDCvrW0vLi2u7CvsrK1r7Cvrqyus7CzsrirsbKxqrCrq6yrrLatqKyusqarrKmpoaWgpaakrKSmoaChnqGgnaCMlJeTm5+mmZ6emZOYnZ+gnp2eopuYp62ooqSgoKKqpqmhqKGlm6CgnZ2jn5SYmKKdp6Gfm4J7eod6bW13e19wY1tdX15TST5DRUlCQz5DOz42OTo7Ozs7Ozs7PT05PTU2NjIxODo5Ozs6QTs/PDw+Nzs8Ozw9PTw9Pz5BQUE+PkFCQUVDQkRAPDY+Q0RFPkJEPztTmZuZmJ6dmqCalpyZn5KdlZ2boJWWlJqYur20sLu8wcTCv8XGura5sqO7vbS3xLuwtbq2ucS4tLy2ur3BvLu/tr/Bv7y+usDKwsbTwJTCw7/FwsfLyMHDwMDJysLAu7uwtLu9wMXGxcW/wMK/y8fCwMjAusK7urO6usG+wMrOysS9tby8ub+5ubW1s7/Avre0s7S4rbeqr7CwsrKvq6+nr7ausrG5rra2uLSzsLGttrS6sa6srranrLKsraSjoaenqLKrqqWkp6elpaCml5ujn6SmraKeo6KanaWiop+foaWenrC0sKSlnp+kqaevp6mgq6CiopqipJ2anqGmp6+psZWCe32Cem1zeHNncF1bXlxZUUVEQ01JQUU9Rzo6NTk7Ojw8Ojs7Oz0/Oj01NDUxMjc4ODs8O0I8Pz46OzY6PTo7Pj0/QD87QUFBPj4/QkBBQkJFPjo1OkFCST9AQkA7TJqdnZ6fnZienZmampySoJWbnp+blZGRlsW+urbDvMbCvr/Ixbe1uLe2ubu0r7e2srWzt7m8u7a7u726w7u3vLa5wbq6uLi1xMHEybmMnby5wb2/x8C5wLy+xcS9vrmysK64t7/Dx8PEvb2/v8PDvr/HvLy/tLSutbW8vr/OzcvCt7K4uLi9ubuxtrLIwLu2tLGwt6yzqbCtrbO3r6uuqrG1r7Gvt7O6usC/tre2sru6wLWyrbO3rLC6r7KloqWrrK+5s7KosK+xr6qiqKGkraitrLOun6inpqWmq6Sknqaqo6ayuLOrpZyfp6anrquqpbClpaWbpKOYn6exrLW4sLKOhHl/fHZsdXpwbmlcX2BZU1BBRUhHS0BEQ0g8PTY7OTk8Ozo6Ozo9Pzw9NTU2MTM2OTg8QT5AOz1AOzs5PD04Oj08QD46Oj49Pj09PkBCQkJBRD03NDU9REc9Q0I/PEWUnqCgoJyXmpiYlZmdmZ2fmp2bnJaRj5LDwMK9wrzEvLy7xbu3s7e2tru7s6CWtayvsbS0tLa4ucHAt725uMC2tcCztbKyqq6mt7mvi4+vtri4uMK6tLu3u77Au7u8rq+us7K5wcLEw768v7u6uLbBwrW/urWur62wvcC5z8rJw7GvtbS0vbq+ubq7ysO7uravsL2xuK+ys7C3vbaur66wt7CsrLK2vbzEwrq9t7bAv8G3tbC2srGzurGxr6esr6u2v7e1qbqztbmxp6uop7ausrG1uaisrK+qr7CqqKessayytr20saykqKuoqKusq6i2qaaonqadmKOuvLG7wbSmiYF8gnpzdnZ3bnFgX2VdWlVKPD8/RkY9RkNDOTo1Ozk5Pjw8Ojo8Pj4+Pjg4MzE1Nzg5Pj9BPzs6Pz08Oz09OTs8Ojs6Nzs+PT1DQT8/QUJEQkE8ODU4PUNGPUREPzw/iZ2en52Xl5WUk5aZnpubmpuYlJ2Uio6Owb7Dwr6+vrm2usCxtbGzt7fCtbOrrbOoqa61r620trnDv7e6trbRwLLAt7CdkIx+d4qOn4yMpbWzsre+ubO1sry5vLa6vrK0tLSwuL7DxsTAvb+5s6+yvLquu7Szpquorbq+uMvCv76sq7Cvs7q3ub67wMXBu7y3sLXEtb+0uLu0u8PCs7a2sbisqaWrsr23v7+7u7exvL28trGvq6uprbOvsLCrsLSpuMC2sqm0tbC3tq2spqu7s660uMKwsbG1sbK1saywsri4ubi+tLGzrqyxramvrqqyuK6trainoZ6ptr+4ur+wlol9gHxxdHd0dnJsXmJgW11PSEE+PUhDRk1DQDc3NTs6OT48PDk4PT47PT86ODMyNTc2OD8/Qj86OD4+PTw5PDk7Ozo8Ozs6PEA+QkI9QEE/QkI/PDs3OjxBRD5CQz8+QYqgm6GdlJiVlZKYmpyWm5WalY2bj4SIhru0vb+7vLm3s7y8rLOytLS2wLXAr7Kzqqqxt62pubO3wL27vLi50sywv6yhgGx9bWBnaXqKjqW3s7C2urW0sqy8ubi1uMG6uLOxrLe8wcfDv7m6ta6lrLOwprCtqJ6gn6WttrXCt7a0pairqLC2s7K6tbu7u7W4trC1xLK+vL+8ubrFybq9vraxp6SeoamxrrW5trKxq7S3trGopp6gmaWmpKynq6y2qa+6sa2kpq2lq7GrrKmtuLawsrjBtrGxtbGvu7ayt7W1sry1urKwsbKutLKqrq2nuLWyta2uqqiosrq9wLa0qY6Ce393b3tvdXJuY1xmWFxdUk5NQT5JQkBKSUA2NjU7Nzg+Ojs4Nz4+PDs/OjkzMjc1NzU8PD48PDg+Pjw8OTk5Ozs7Pjs7OTw+P0E9PEJAPz9CQD47Njc6QERBQ0E/QUKJoJ2loJSWmJiVnqCcl5uYmZGMmYmDhoS1r7S7u7S1sLG2uq6wtLOvtbq1urC1s7KttrqurLyyuLm3u7+8vtXFsqmBeH5fbIdqY15hepGpvbaxtLaytK+tu7q4trnAw7aurqqytry9ubaysa2tn6Snp52jpp2WmZman6muuayrq5+lqKSrrq6nr6yvsbGtsa6usLmwtLy+uLm4x8W8vLu4qaKcmJufp6assq6zqaapqq6popqXl5GcmpijnqKir6ekrKaompqemqGnp6anqa+2squ0trCqsK+xqbm2sbWxrqy3s7avrquuq7S1ra+rq7GtsbKoraurs7W3ur2wq6GLeoJ5cnZzbXVpa11balRdXE9NSERGTEJGTUY4NjY1OjU6Pjg7OTc8PTo7PTo5MjM2Nzc3Pjs9Pjo6Pz48PDw6Ojs5Oz47PTk8Pj1CPDtAP0A/QT8+OjU1OkBFQkRBQEJBiJ+ipqGYm56dmqWpmJudmpmUjJmHhoeGrq2uuLmxsqiur7iyq7CwqrK1ubm+tbK4tLm6tbm7tbWztbu8v8LNvaCAZFqEXVaFiox8YVuQr8a5tLSzsLGtsLm4try4u7+ysrKusa65r6qrrayjqKGdnZ6XmKGVkpWXkJifqK6ko6Sgoqeio6mpoaanpaqtp6ynqKesq6yyu7SztLm6trK2ramgmpaWm52fq6yrr6Ojo6GpoJuTjo+Qk5KSmZaanaSloJ+ep5iVkpSYnqSjoaWqrK2iqaqppKmtrqW0sa6xraqprq+wraWmqqSos66trKmmpqmrpqqnq7Ksr7Oxq6mWgX+Bd3J4aHRzbmRUYGNXXFFOTEhASFFETUM9ODg3NTo3PD46Ozw4OTw7Ozw7ODI0ODk3ODs7PDs4PD0+Oz08Ojk8Ojs9PDw6OkA9PDw7QD5CQEE/Pjk1ODs8RkJDRD9BQYijpqKjnqCfp6Coqpufm5yZmI6Xi42PjKqpqLGvsK2lp6ayr6mmq6CvsLu1vby4wMG+vLy8ua6sr7KyurjIxbOHY1lrllxXZHiJi3lKgrfGubKts7CvrK62trK0ta+qpJ6bnJyeqKieoKipn6GnlpuXl4+dk4+Qlo6Xm6SooKCioqKlpZ2jo6CepaCkrKSmqKSio6OrrLOuqa6urqeqraisoZyamJmYm6moqquepaObo5yVkIyPj5CTkJaVlpifnp6amaaXk4+Slp2ioKWjpqSnoKKko6Ghq6uksq2qrKyno6yuraufoaKkpK+srKmmo6KqpKqqpKmrpqmsq6agiHiDfHZ/eWJ3bG5cUWhUUE5HT01MQk9RQD47PjM5OjU7OT07Ojk9OTk8Ozw8OzkzNjk5Njo7Pz06ODs6Pjw6PDs5Oz07PDw9PjxAPT88ODtAQEE/Pz45NDk8N0FDQkQ9QEOOqqSjoqGinaulpqimoZ6dmZ2PmJWTkJWnpKGmqKmlpKChp6uhnKKbp6u1sry9wMLCwL7AuLSnpa2qqLWvy8emc1ddhI9XVmFmsqV2UGi3vrazqrK0rqqrr7Cys66lnpKYlI+YoJ+ioJykpZ+eqJSblpeMl5GNkJeTmJ2iqp+fn6Cjpaicn6ChnKKfo6innKehoKSfrKisrKCpq6agpKimrKOdnp2Zl5qrpqmxo6WonqCclZOQj5GQmJCWlZiWn5ibmZujmZeUlpqdoJ2nqKWgo6Kho56doKmqpa6upqipoaKqrqqnoaCio6msq6eppqShqaKlqaalpKKmpKijkn18gHV1fW1re2RoVVFjTUlIR05STkpORztFQD0yPzc1OTs+Ozk5Ozg6PDs7Ozk5NDg7ODc7Oz48Ojk8Oj07Ozw9OTw8PD49PUE+QEJAPTc6P0FCQEA/ODU1PDpAQ0FEPkFGlq6koqWeo6KpqKipqqWmnp2imJiZmZWbop6bnqOioKOgoZqgmJeXlqGorK62t7q5ure3u66ooKGpoqCtqMLGmWJaf4p2ZWR6da+jdmZfd5uvtK6vs7Wqp62so5yZlI6RlpeYmZygoqKcnaWemqSXl5eWkJKRkZOal5ugpKqeoaGepqeqop+gp5+dn6SnqZ6jpp+qnaqtqq6nqLClo6Smp6ymoaShm5ier6iusqulqqqgmpiYmJWTlpqTlZWZlpuXl5ignpycl5uhmp6ao6eln6GioqOdm6Gmp6aoraOppZ6kp6mkpaWhpaSsrKmmq6eioKSjpKenoaCgpaKmoIl7gH12eHxkeHlgYlJVX0hJSUtTVElSUEw5P0I2Nz02NTs6PDw5Ozs4Ojw9Ojs4NjU3OjY5Pj0+PDk5PTk9PTw+PTs7PDo+PTw/Pz9APT03Oj5AQEA/Pzg2NT08PkFCRkBAR6CupKaroaOqrK6tp6ypqKCipp6bm56aoJyalZmfn5uen56WlJOXk5KcnqSorq2sq6uvqq+pnpefpZ6epaS9w5VWaJuXdIuZiW+MfnV9eXqiqrOxsLC4raehnJ2alJeampCOkZWRjI6OlJminJejmZqXmJmUmZiWnZufpaapoKajnqeurqumorGjmqSmpqqioaqiqaSosquxsqu5qKarp6urqaysp6Cgo7GusrC0qbGvopmcnZ6hmZubmpiZm5SWm5aYnKWhoJqjoZqdmZ+kop6gn6KmnZulpqWkpaijp6OepqOinqaloqWlqKykpq2noJ2dn56gpaGenqWgppmBe4F8dXZzaIJsZVtTWllNUUpOTlVMUkxBNz5CNjg9NzY6PDw9Ojw5ODo7PDo7OTc2Oj01OTw7QD03ODs3PTs9PT06Ozw4Pj09QD5BPj4+ODg8P0BAPT43NTg9Pj1BQEZAQUihqqCrq6GkqquwramtqaelpaWkoKGfnqWXl5SYmZ6YnJ2blo+VmZKRnJihnaqip6Cep6Gln5ySnKKbn6GhwsiRUXOltICEhnhpcHF7g3h/qKmwrq6ssKegn6Kgl5GUm6CcmZeSk5+coaSbnpuWn5qfl5uinqWhnqSfpKitraisqKSstLe2sKe0rKKtraOvpaSmoamorrWzsr23vrCssa6tqaq0sbCoq6iytbezuKyxtKSgnaWfrKGhoqCgmpiWlqCbm5ikoaCepKGfnpqcpaCfnZyhqJ+fp6meoaOkoKagnqehn5ymo5+ipaOooKmrpZ+dnZudmqainpyjnqeQgYJ/fHh1aXd1XWxaUmBIUVVIRlVWSkJMRz1LSDhFPDY3Oz49PDo8OTg6Ojs6PDk2Njo8Nzs+PT8+OTc9OT47PEA8OkA6OkA/O0A+QUA9PDk3Oj5APzo+NzU4PT0/QUBEQEJGnKueqamipamprqimqqWmp6aoqqGlpKOmkpOVmJacmpqcmpWTmZuNk5+ZqJ2un6eenKGenpqakpmenKKin8fNj1R2iopzb2pgW11cXmVhbo2gqqiqrKqln5+ZkpKTmJiWlpWMiIuOlZ2dnZ2elp6apqCgqKWxqqeuo6uttrC0srGutri9wLqttbSwt7CutKmmpKWsqbmztbvDvMPBtrq2q6+xube8r7OwtcG8t72zs7WirKKpqLKpqqinqJqZnpqqp5+ZpqCfn6eopaSenaqhop6bn6igpKetmZ+jnp6nnqCmnpycoqGbo6KhnZympaWkn6KZnJukn6CboJyjiYWEfnZxbWl2bWhtXFhbQlZNSkdNR0JGTTw+TD00PDk2Oj0/PDs6Ojg4PDk6Ozs8NTQ6PDg5Pj4/Pjg4Pzk8Oz0/Oz1BPTo/PjxAPj8+Pz08Njs/QT07Pzg1ODw8QERCREFCQ5WqoKapo6mqqKmjoamgpqinrK6lqaWpqpSSl5mUmpqanJiYmZyamJmqoLGit6Swpp+enZ2XmJWZnpuco6DG0ZNhfHp5aGBXTElLTlBPUVxrg6qvrqmqpqCenqGinZ+dmpyclJOVlJ6emJSFnZqhm6ukq7KwubKysbKxur28vLm2uMO+v8K/trq6wMS5vbusr6exrbHCtrjCxsDIysDKv7C5ub25wr64s7vGw7zDu7ezqbOtqrO0r7Ouqq6jnauntrGsoq+moaOvsa2wpKSvo6GgmqGnoaSqqpmdoJmao6CmqKGcnqKemaSenpiYo6OhpZ6mmZuipJ6fm5ubnIeFgXt0cWtrdXJwaFdbUUVUSERJT0g+RUE0RUg5NTs9Njs8Pjw8Ojo4OTw4OTs4Ojo4Ozw3Oz49Pj02OEA5Ozs9QDw9QDk3PDw7Pj0+PUI+Pjc6QUA+PD45NTg9Oz1DQEFDQkGRqqGlqqelqqimn6KnnKasp7Gyq62jqayVkpWalJecoqGbnqCinJ+psqu7sr+rr6ylnqCgnJyYm5+gm5+gxMiHcXh2Z1ZSUm5XV05NREdhjayupqOjoqCepaulnpeclJGZnZiUjIqGiIZ5bYigpKKrrLS8tsO+vrO7wcPCxcC/wsbGxcPIwsDFyM3QyMvDsre1vrK+xbu+zM3FzMzM0se+v8DDvsfGwrfDycnCwMa+urS6urS7t7C2sqq6sq67t766uqq3rauquLq0vK6uuaOmo56mpaKjqaaZm5+Ymp2nqqegoaGkmJSjlpSZkZydn6Sep5+en6KdmJmUmJSIhH16cWtkaG94amVaW0ZLTEVEU0xEQkU3Oj87NTQ5OTc5Pj87PDs7OD48Njo9OTw9OTw9Ojs9Pj4+NztBOj45PT45PT44Nzs6Ojs/Pz1CPj83OkFAPTw9ODY2PDo8QT9BQUE+kqugp66ooqulpKKipaGlqquwsq2upKmmlJWWmpaUm6SmnaGqp6KrrLy8v8PBs7K4p6Ghq6qhnJ6hop6bmrOda2xwaFVQXHymlXlSTWeUrqygmZybnp6Zl5eXkoyOl5eTjo2Qi4KDgndzcW5wj6atrrS5xbvNx8u/wszOzczHydHMzczHycXGzNDS1c7Tyb3Av8O7xsXIxdLTzdPQ09PMysLFxsfKyM6/yNHMx8XHxcG8w8C+vr61vrOtv7/CwsbEx8SuvriyuLzEwcG6vLy1rqenraigoqmlmpagmpmdqKupo6SknpePm4yQmYmVmJugn6OdnZeempOTi5WPhYB5dHNlYmdyb2ZeWllDTkxDRVBJRENANTU1ODpCPTY4OkE+Ozs+PDk+PTc6PTk6PDg8PDw7Pz8+PD0+Qzw7OkA9Ojs6Ojg4ODk7QT88QD8+ODtBQTs7Pjc4Njo8PkI+Q0FAPpOvn6ivpqiro6KloKampKuoq62qrqKqo5Kcl5ebmJuirJ2frqalsarFxszOzb+wwailqKytqqCdo5+cnZmslXJtY1dOUmi009OkjaSzrqSfnZ+amJaUkpSWkZCPjIeEg4iHg4CBgYB5cnJvbHmktrq5vsvB09LTyM3O0dPR0tHQ0dHNzs7Qxc7U1djS183Gx8nMw8XKz8rS19HX0tTW09PIzMfNzcnSzc7TzMXHycrBxsvGyMjFv8Ozs8jEy8rKzsXKv76/vcHHxMzMyMm/w7+tr7OonqKqo5qTnpyYnqaprKSlppaXipWFkZSHkpKSmZualpiQm5WQjIaRi4B6cnV2Z2NndmlkVldRRE1GQElRQj1CPDoyMkA8RDw3OTxCPTs9Pzs7Pj05Oj48Oz44Ojk5Oj86Pj1APkA8Pjs+Ozk9PTw5Njo6Pj08PEA/Pjk6QEE6OT44Ojo6Oz4+PEE/QT6QrKKiqaanqKSfop2qqKOso6OnpqyiqZ+To5iWn56dpK6bn7CrqKyxyc3U18/Gu8esrbO3rK6jnqOinaCkrJh6ZlhTUlh309e/sq+nnZydoKSgnZqUlJWUiXx3cGtlYmhxb3F7hYqAdnBucXRwhbPCvsXR0NfW1tLWzdTW19TT0dPU1NPP0cPQ09bY1dbSy8nO0cvGzdHJ0tXW2dXX09bYztLKz9HMztDM0s+/x8bKw8zMy87PxcbHtr/Kv9HMy8/Fyce/w8PIzszP0M/NysfNuLe7qJ+lq6eemJ6jnp2qpa2pqKiSlYiQhIyRho2MiJOVmZCWjJiSj4aHjIR8eHN2cGNgZXJiXVJcSUpHQUVIST47QDg9NDU4NTs4Njo8QD07Pjw7OUA7OTo8Ozs8Nz09Ozo+Oz08Pjw/Ojo8Ozs5Oz89OTU7PD48PD0/Pz46O0BCOzk/OTg7PT0+PzxBQEQ8hqugnKegp6Oim6CbqaSlqaCfoaGmn6ifmKSimqmmoqarmqOwsamotdDU19rSx8bLtLXBxbG1qKGkpaCiq7WPZ1pUVVZok7mupJqVmKCcmqChn5ucmZWJd2ljYF9fX19eX2BeYmx1c3Fwb2xycXWSxMfG1NXW19fT1s/V1NrU1M7P1dTU0dHM0M7T19bT1dDP0tPRydPRx9DY19jR2NLX2dXWzM/Pys3Sy87Pv8XCx8XOzdHQ0cjLzcDKzMXTzsvOyMTJxsbIzMrT09HVz9LM08G5xbGlqLWup5qorKWdsqiws6ysk4+TjoiKj4OPi4SQjpmNk4+Zj4+ChYx8enFzdG1hY2ltX1ZQX0pKQ0ZDUU0/PD41NDo9NTI4NTU8PEA8Ozw6OTpAOjg7Oj46PTg+Ojo8QD08OTs9Pzk6Pz07PTw9PTo2PD0/QD08PT0+OjxAQjs5PDc0Oj48Pz89RkFEPYKknKClnaWlo5mcnaSeo6OfnZ+doJqnnpyhqZ+vraqqq52mrreoq7fX1NXZ2dHO0MC8zMm2vq6mqqihpLG0f1VQU1Jlk62mn5iWmJqbnaCdmZydk31xZWNjX19hX19hYF9gYF9gZm1wcG5rb3J3d5vMwNLV09jY1tnR0tLXz9POy9LN1dTSys/M09bS0dbNz9XV0cbR1MrQ1NXWztLQ2NjY18vIzcTJz8zKy7/Jv8fJzc7Py9DNzsvOzsfLz9DKzsrCycbJzMrL0dLM09HRz8/Kvci5sK67uLWqtrCtqLits7+7sZqPn5SRjo2IjpCFkY2ZjJGRlY6RgIWIenZvcG9rYWRucGFXXFpJRkZETVdFO0A8MzM8PTg3ODU1Oz5APTk8PDg8Pjk8QDtAOj04Pjk4Oj88PTg7PkI6Oj08OkE9PTw6Nj09P0A9PDs9Pjg7QEE9Ojw4ODs+PD4+OkVCRT6Bn5mlp6Cfo6eam5+cl56eoZqdmpyappufpKefuLa1taykrK6+tLDA2NLX2tzWzs3Kw9LPwcCxqqytqqWxqW1NSk5YkqCblZSXnJ6fn52UlpiUiWteXl5hZGJgYGBhYGBhXl9fXl1ibXJvb3N0dnZ5pL7L1dHW1NPY1s7O1MvNzsXOytLSz8bOzc3UzM7TzcrX1dDM0dTLzNDR08rO0dXS1dXKwMrBxczCyMnCzMPFyMrKzsrNzNDN08vFyM/MyMfKxMbAxcrLzc/RxtDOzc3Mz8XHwLi5vcPDvcO5s7K+sbvDxLWqmKWimZaRlZWSi5SNmpGUlI+PlIKJhXhwcWttZ2BgcGhYWGhWTEZMSVBQQjtEPjs2Nzo4OTo1Nz09QTs6PD05PD05PT06Pjo8ODs9OTtAPD47Pj5BPDk9Pj1CPTs3NzY/PDw/PDw7PDw4O0FAPDo8OTs7Ozw9QTpFQUU+hJ6bqK2epKSqnJ6fmJKXm5+am56ZmaKVoamppcXCwb+7tbKxx8K4y9XV2drb2MzMz8jW1cTCtbC1qKGrqq1hSERRi5uNjJiVkJSSkZaWlpCLfGViYmJgXV5hY2JgX2BgYWFgX11bXWdycXFyc3FtcnmkxtPPy9DP1NXJxcnJxsa/w8bPzsfFx83K0sjLzs3G0dLPzszUysfLzs/Hx8/Sy9DPxbrEvsbJvcLHyc7EwsjAx83Hw8vKy8/Hw8TQyMbBxcfEvsDHy8vLzsLKy8jHzNDExce7x8PIyMLPwb28v7DByce5vaqwsqelnaKcmJCbkKOZl5mRlZiJj4J3bnRka2BeZnBhW1dgR0hIR0lNVEc/Sj02NDM1NT08NDg9PT06Oz08OTo7OT89OTw7PDg6PDo6QD1APD09Pjw6Qz48Pz04ODk6QD4/Pjw7Ozs7ODo+Pzw7Ojc5PD49Oz49RkFDPYOgm6qupa6qq5qdoJeUjpedmpmgmpqcm6WysazJzcrIxL68us3NxtDV1dna29jQyc/P0dPIwre8vK6ls6ezZElLgpiOjZaPhoOEhIJ+hYV/c2BcXl5eYF5gY2RjX11dXl9gYF9bWlxga3Jyb29rbG9vfbjRyMnKz8vNxLrAw7u7urq+ycbCw8DDyMrJyMrIwcXMxsjLzcnEwsvJwcLL0MTLyL+5wbvFx72/xs/Lw7/Du8nGyLvIxsTKv73Cy8bFxL7FvLy/w8TLxcS8wMnCxcfSxMDIv8rJxsfG0MPDxsOvxMvHw8q3v7y6tKmspKWYn5iso6GlmqOgm5R7dnN0ZmlaYW5sWltYUkRMRkJHRExERlNANTQzMzQ/PDM6PDw7OTw8PDg7PTtBPTo8Ojs3Oz05Oz07PTs6OD4+PEI+Oz88OTk7Pz07QD48Ozk5OTk6Oz06PDo2OTw+PDs+O0NCRD5/pZypsqm0rrCdnp6YnImUm5man6Kfmp2ov7i8y8/RzMfCw8bNzs7M1c/V2djZz8vSzc3OyMG1xL+zsberuXVXeZaMk5eGeoCFhoB2eHVycF9aW11gYGJjZGRlZGBcXF1dX15gW1laXGJvcm9raWxwb3OPxrzJxczAxsKwtrqysrOyscK8vLy6uMHBwcW/vbm9v7nEysXGwr3GwLi7xMm/wsm7t7u6xcO+vMHNw8a9vbXBvcO6vMa7wrmzvMXEwsK2v7W1vb+6y8O8tbrIur+9y8PBxcLFyMbIxtDGwszHssfJw87NwcXDwL2yt7Cyp6ioubClrbCrrayUeXZ3amRnYGhvY1ZeWUpGSkZISkFFQkVJQDk6NjQ4ODUzOzo7PDk8PDs5Ozk6QD46Ojw6Nzo7Nzo7Oz88OjxAPUA/PT8/Oz07O0A8Pj4+Ojk5ODk3ODo8PDw7OTo8Pjs7PjpAQEU+fqygrLWqt7SyoZ6fl5qNlJaan52mop2et8bDxMjO0crKysfNzc7RyNDG1dTW183Kz8XJxcfBuse+ra6yrrCGeJGNiouFeICGhoB+hHx0dGNbXF1eYGBiY2FiZWViXV1bXF5cXl1aW11daHNxbWdnbnByeZ29zMDDusG4rrCwp6qtrKe4tbe0s7O0urW+srewta+yu8K8wcS8v7q1s7q+wLjHubS7tsDCvLi9xsHDu7Wusra6vrTEt7u1q7i9vb+9sLq2r7a6ssW8tq67v7S2tMW9vsLFwMPFxsjLxcDGxrvHy7/PysfDxsLDtsO9vba5vse/rLW6tbe2jnh0eGZnZWJrbl5WXmBGS0hISkZCREFFRT88OjU2NTYzMzs6Oz06Ozs6Oz44PEE9PDo7ODc5OTk7PDo+Ozk+Pz1APz5CQD1AOjo+Oz89PTk6Ojo4NTY7PT48PDo7OT49OT86PEBAPIi3pauzsby8sa2foJmUlJiXnqujr6qnpMbLzsjFyM3M0MzNyMrIysnKxM/N0s/NxcfBxcHAu7nLuK2wsa+Xf4+QhomKe3h+hoZ3eIJ9dGleXV1dX2BfYGRhXmRlY19fXFteXF1eWltbXV9scG1oZmptbnJ8pMe/uLi1sKusp56iqqeeq62zramrqbSttrGyqa6mrLK8urbDubq6sau1ubu0wrqwv7G9vLu2vMe5wratqqiwsb+1t7yvsKeys7S7vKuttaWutq66sbCquLCtu667uLvAv725wr/Hw8XBvMbBx8u4xcfFv8bDw7nExsK7xsnMy7O5wry6sohydnZraWFibGhZWFdbQUxLTUlFQUM/RkE6OTo5OTU4NTQ6Ojk7PD07Ojs+ODtAPD05Ojc5Pjk7PDo4Ozs6Pj45QT0/QD87Pjo7PDo9PDw4OTg5NzY4PDw9Ozw6Ojs+PTs/Ozs+QDyKwKuouLe5w62zqZ2ZlJaZoZymsLWxt6bFztLLw8XBxc/HzcHDxr/FxcPDysLJyr/AvcK7tLa2xbGrsK6qfHaTiI+QfHh+ioV6e4SBd29eXVxdXV9gXl9kY2JjY2JgX11bW1paXVpaWlpcZW5vaGZnaWtucoGtubC1rqalp6eaoKSgmpylq66jp6KrqqyqsKOmn6qttLaxvbmvt6+orre0tLy4s7yvuLm0sbzBscCupaiiq7Gys6e8qquoq6yttLOlqK2hpK+psqWnqK2lqLessLK3urq7sbu9vr7Ev7XCwMfIt7/AxLfEwr+7v8TCvsTIzMq/vsPAwKmGcnRyamldYW9kV1ZYUEhZUlNLRkZFPj5AOjc4OTc3NjQzNzo5OTo8Ozs8PDc7PTs7Ozw4OT44PTs8Njo9Oz89N0E+P0A/Ojw8Oj05Ojs6Nzc3ODg3OTw7PDs5Ozo8OTc5Pjw+P0E7jMKvrry3ucSwtrCbmZWcmKqpsLGztb2vxdDPzMPIurrLwcu+u8q3vsS/u8q4wcTCtri+t7Kwtr6wqqqqnW6Dg4iLgHt+gH54dH98c3dmX11cXV5fYF5fY2NhYmBgX15dXFpYWltbWVhaXF9ma2ZlZ2Vpa29yhaqlrKagnKGllJ2km5iSoaOqo6KfpaWopq6gnZukpauyr7a3p7Csp6q0qrS6sba1rra5sa+6ubG3pJ+jn6axp6uouaqkp6eop7KtoKemn5ukpqyen6ekoKCxra2ssrSytLC1vLa7wcGyur7DwbK5ucKzwL2/tbi7vb68wsfEwsO/v8Sgg3dwa2FmX2tvYFRZXkhOZ09USEVKRjw9Pz06Ozs4MjU1MzY5OTk7OTo6PDo3PD88PDs8ODg8OTw6Ozc4Ojo8OTg+Oj89OTg8Ojs9Ojc2NzY3Nzg2NjY7Ojo7OTs7PDg1OTw6Pj5AO43ItbW9uLrAur21oJ6VnaGmurars7O7s8TPycvCxri3x8HMv7jKuLzGubTFuLTAwq64vrSup7G3saOjpo90hoaGgXx5dXRvbWtqanFpXmBdXFxcXmBfYWNiYGBgYF1cW1xcWFlYWFhWWFteX2RjYmVnZ2dqbW+Inamgl5WaoZabopiWjZ6hoqabn5+jpaKonpuim56qsK2xtaKpqqmrq6S0ua23sKyzta6yta6wqp+dnqOisqSmqbitoqamn6isqpmfoJ6ZnZ+lmpqjnJudr6mrp6qrrK2wsrivuLm7sLa7u7qrs7O5s720trGxtbS/tr3AvcPBuru9l4N6cmtfZV5kZFhUV11JV1xLUEdJSUZBPD8/QDs/PDA0NTM1Ojs5Ozg5OTw8Nz4/Oz07Ozg4PDg5ODw3ODo7Ozo7Pzo9Ozc4PDo9PDc0Nzc2NzU3NDY2Ozc5Ojs6ODo5ODo7OTo8PzuJyba4vru3wcHBtKSkmZqkpsCyr7astLfGz8jIwMa7u8TDz765yLm5v7izwrWyvb2uvLy0pKGrrquZoJ+Kf4aGf3hybnBua2JeYmZmXV1eXV1dXF1fYGFiY2NiYV9cW1taWllYWFdXV1hYWFpeYmRlZWZmaGlrco2onZSUlJuYm6GWlpGcoaKonZudpaaippygoJqYra6trrKgpaKtq6ahtLCxsayor7KnurOmtqGinpujoa2joam1qqKjpp2lpqOWmJ6XmZqdoJqXnZycm6yhq6ajpKatq7OzqrSwsqqyubSvqa+ysrO3s66prK6yuLC6trm9v7eysZSFeXVlXmVeW1lWU1pVS1xRTElFSEtJQj0/QUFAQToyNDUyNDk5ODk7OTo9PDY9Pzs8Pjs3Ozs3Nzc+Njo+Ozo4Oj07PD06Ozw6PTs4Nzk3NDY1NTQ2Nzg1Ojo4Ojk5PDg3Ojg5PkA6gci9t72/tr68v7OdpaOYpbHCtba9rbS4wszIxsDFt8LAx863wMS+tLq6s8C3s7q8r7W3saGdp62jl52Yi3+EhH94b3F0cWlmZGhlY1xcW1tdXVxbXmBhXl9fYF5cW1pcWllYVldXVlhXWFdWV2FkZWNkZWRkaGp2opyUlI+Ulpefl5mUmJ+eoZyWoaGoo5+eqZyamqunr7Crm6Ojt6qgn66otqmmp62wpLewpLefopuYmKqmoZqsuLCioaScoqCgk5WhlJWWm5iXlpeclZ+pnamjoZ2jqqqwrqi0q6qmrbKwpaqusrGwr66vpqensq6xtK+8tLq3rqOUgXl1ZF5hVllXU1JUS01eTFBLR0dMTEU8QD48Qjw7NzY1MzQ5ODg5OTo5Pjo4Pj47PTw8Nz49Njc2PTc7PTs5Nzk7Ozw+OTk6Ozo4Njc2NTQ1MzEwNDU2Nzk6ODo5Ojo3Ojs5OT1AOnbAvLS5wrG+uLyunaeno6q7wL3Aua60uMHMx8XCw73GuMjMssHDwq69vLa8vba6u7OztKyenKSsl5SNkYWAfXdxaWxydHBpaGVkZmJcXFpZWlxcXF1eXVxbXF5cW1xZW1taWFZXV1ZXWFdXV1ZbY2NjYmNiY2RmaoGWk5WLkZSTm5mclpaboJyflaCfpqWkpqefnJ+moKqvpp+io7aooKGiqLShpailsKWwray1nqCdlZSpoaKUrbGxn6KjnZ2Ym5OLoZSRk5iYkpeXmJedppunoaKZo6Wlq6SlsKelo6urraaorq+uq6iqqbOlpqyvtLGuvLWxr6+gknp2cmRhXFpdWE5MUkhSYU1XUE9KTU9FQkQ/OT02OTo3NjQ1OTk7OTg4Nzs4OT0+Oz47PDY5Ojc7Njs3Ozs6ODU6Ozo7OzY8Ozg4NDY4NjMzMjEuLzI1NTY7Ojg7Nzg3Njw7Ojs7QTh4u7uxtb2wu7G3rJ6lp623u7zBxbqxubXEycnAw8bGyLbGxLPCwMasuLi+t768vbi2sLCrnJujpo+NdouHf3VuY2JmaWhmaGpnam1gXVxbWlpaWlxdXFtcXl9cWllbWVlaW1dVWFdUVFZVUlVSVWBgX2BhX2BhY2RpgZOTiJCOlJKTnJSVlqOZoJacoKWhraakpKKjopyqq6WZnqWxqaCgnaWrnqehnq2tqamuraGhopSXo5uckKupsJufop+el5mTip6RjZKTlpCYmJOcoaKdpKChlaChpKabo6uloqSqpKuupa2yqaalpqa0pqmorbO1tLm6r6qsnotycG9gW1dWVlJHUE9IWlxPUklUS1NMRUZJQzg7Oz08ODY2Nzo5Ozo5NzY5Nzc6Ozo9PDw2Ozw4PjU5ODo4ODY1OTo7PDk3Pzw5Njc4NDUyMTIxLi4xNDI2Ojg2Ojg2OTg5ODk7OUA5e7W0rbS7sq+rsa2dqKevubmzwMi6tcCvxsnNu8HKzMi1yr2xvsTKrrK5w7e9wr63t66wqZmeoJ+KhXWIg3t0aWlpbGdqbG1ram1lXVxcW1tcWlhaXVtbXmBgXFhYWllYV1hXVFZWVVRVVVJTT1FZXVxdXl5eX19iZG2Oj4SRh5CRjpmTlJKcmqKcm6CnqKqoqqaopaOYpK6klJmlr6mfm5mboJ6umZuqs5+lpp+io6GUk5uWlpKpqa2anJ+hoJqUkIyZjouQjJKNlpWQnqGgo5ybopWboKKgmKKoo6Koq6Crr6Sut6WjpKKsraqoq6+yt7K9tbOrr5iEc3NoW1hYU1VRRVhMUVtZTVVOUExQUUlOSUI8Pz9BPzw2NTc5OTw8OTg3Ojc5Ojs8PT47Nzs7Oj02Nzo7ODk3Njk4OTo2Oj05OTU3NzU3MTE0MS0rLzQzNDk4ODo6ODo6NzQ4PTg/OX6zrqiztq6pp6+tm6morLe2rLvKu7a/rMzHxrnBzs/ItMW8t7vEybKuucG4vsC9trmqrqSanJ6aiX93f3Z3bm1obW5tcGhnaWdkXVpbW1tbXFtZWltcXF5fX1xYWFlYV1hXVlVUU1VWVVVUU05QUVlaWlpdXFxeX2Bkfo2Bi3+MkIqSjZeRl5mioJufqqmmrqqnr6OnmZ+soJWWpKinnZeQj5qerpaXp6qZn52UpaGekpCTkpOVp6qlmpmZnZ2WjYyMlIaIjYOQi5KVkaCeoKOXlZ+VmqCinZObpaWnqKigsbCmsbynoKOstKuup7C1sLm1wLGtsauRfXFyYlZTVk5SSUZWUFJSTExYTUpMTlJHTUpBQ0ZEQz5ANzU4ODk7OTo3Ojo3PD06O0A+Ojk7OTo/NzU5Ojk4NzY5NTg3Nzk7ODU1NzY2NjEzMjAtKi4xMDI4Nzc7OTk7ODk0ODs4QDh/s62msbeqpqKwq52qp6mysaS2xrS5urPLxrq7wsvQy7G4uLy+wcSysbO5rra2vba5p6ihop6emIWGeWpnbG5xbnFqcGtkZmdlXlpZWllaWlpbWlpaXFxdXFpYWFhZWVdYV1VVVFJTVVNWVVJOTk5SV1hZWVlZXFxdYWqAen92iY2HkIqXiZSUl5uZnaian6mlpKqdp5igpZuSj56impeWhYSSmqOPk6KclpaWiKKampOLjouQmqSnnJWVl5uQkoeUjoyBi41/kIqSkpKhmp+ilZSYmJWipZmMmaSmqKahn7SyqLK3oZ2it6yqraSysqW1u7Wrq7GjiXhybV1OUVFMT0NNTk5QS0ZOTkpKTk1RSU1KQUdMSEdDPTg1ODg4OTo7Njk6Njg7OTk+PDg6Pjk7Pzg3ODk6ODg2ODU3Njg4OTc0NTc3ODIwMzAxKyktLzEyNzc2Ojk5OTk4NDk4OEE3d7anpLawpKejqaWgqaWks6qissO1tbKzxsa3usPKzMazrbu+tbjBsK6qsp+osL2ysqSfoKWdm4t/inBeX2ZycHZxaW5pZWhoal9YWFhYWFlZWVpaWVtbXFxZWFhXWVlYVVZSU1JQUVRRU1VRTU1LTFNXV1ZYWFlYW11hb3N2cYWIgoiAkYSOipSRk52gj5qboqGjmKSWoZuVjYeYmoxzjYJ9jZeWhZCZkJSOjnuZjpyMgoqAiZifop6Qk5iWhI6Ck35+dImOeZCHk5CQnZqZmpCVkJ2OoqOOiZqgoaOjm6K0r6yvrJ+ZpbimprGhsa6csLuqqa+qmYJ2cmJVTVJPUE1DU05MUU1CUFFISU5TTUhKSkNKTEZLSzw3NDk4ODg7OzY5Ozc6PDk6Ojs3OT85PkA3OTo8ODk3NjQ0NDU4NzQzMTI1ODUvMDEwMikoLC0xMTc2NDc4OTo6NjU6ODdBN3i3oqO0qKWmqKOmpaamprOnpbTBuK+0sMnEt7nBzsW+s627wqyuxK6po6iTn6i5sKillZyem5aCfYRnV1ZfZ2ZpZ2huY2ppZ2JcWFdYWFhZWVlZWVlaW1tbWVlZVldXV1NUUE5QTk9PUFNUUU1NSkhOU1NTVFVVV1lbXWlscm1/hXx0Tlhyj4KXho2cl4uTkJ+XnZWUlpSOlol/k4lfO1dve4uUiYCLkoyQhoZzioSWgXmCeoWUnZSDlo6Qj4OGfZJ4cm+FjX2JgZGNj5eZmJOKj4mch56Xh4iWnpqhoJenr6mtqKiel62zoqaumayrmKe0oqmto5N+cm1fW05TUlZMRFRKUE1MRk5PSUZMUU1LT0pJTVBGSUk8NzU5OTk5OTo3Ojs6Pj44Oj09Njo/OD4/NTg5Ozc5Njc1MzMzNzYwLi0vMzQ0MTEwLy8oKSsrLTM4NTQ3Nzk8Ojc5Ozg2QTl5t6CjraGmpqqgp6mnoqmwqKe0wbmwtbDHwrezvc+/ua+vtsOoq8aqpJ6ahJWdtKafnoyal5SNgXh7XlBMUlVZWlddXmJnY19ZV1dXWFhYWVpZWFlYWVpaWllYWFZXV1VTUk5MS0hHYlxNT1JNS0hGSE5RUU1QUlRWWFpgbXBpe4J0UEJBf5WRkX2JlIyEio2ajZWVipKIhZWGeIh/YEpRbniKkYR9hI2JhX9/bn5/lHd1dXeEjZlwUY2Iiod8fniTdmh3hoh+ioiVio2QkZaLhIqIlISajIGEkpqWnpyUpKOoqaWknpuwqqGkpJGmqpahqZyipqiJdWxlXltIUVFSTUlVTVNJTEtPSUhHS05MTVRLUVFPRklDPDc2OTo4Ojs7ODo7OD4/OTk+PTg7PDY7OzQ3ODs2Nzc1MzQ0Njk2LzMvLjEyNTIyMS8sJykrKiw0ODMzOTc5Ojk5Ojo6Oj85d7aboqedn6Guoaeopaeor62qtry2uLezwru2qLrIuLaoqLW2qrO+qJ+Wj4CLlauZmpCDlIqKg312dFpNS01OT0xNUVdbXFpYWlVVVlZWV1lZWFhZWFhZWVlaWFhWVldVU1BNSkVAQJtrc3NJTUtERERJTk9oWU5RU1RVWm6DdHd+amldVY+JlIl0f4eBfIWMkoGSmYuPe4aPgHV/eHNudXB0jY2BeX2KqoV5emh2e45wcm14gYuMknh6gHuAdnJykndodYSEhIR7lYmIioyKgH+Ei4x/lIN7gI+YlZyVkZ+dqZ6foJ2gqaWfnZiNp6SToJ+Wnp6kgHJnYFxcSlZPUUdKWFJPSk1NUkpKSk1QSExRTFJUTEVIQTw3Nzs5OT49Ojs8OThAPzo6Pj03PT03OTkzNzc5NTY3NTI1MjU3Mi8yLiwvLzIwMC8tKygoKS4xMjcyMTk4Nzk4Nzc1Ojw7N3aumKOhmJyftKmvqaWtrLCxqr20sru4tru1sqC3urKqnZ2sqaizsKKbko+VgY+ekZaEe41/gnx2dW5aS0hISEdFSEhQVFRUV1dTVFVVVVZXV1dYWFhYWFhYWVlXV1VWVVNQS0Y+OTNOPH6eTUhKREA9QURqlH5MT1FRU1ZedYN9eWd3jZeYjo99Z3mBdniAiY98hJiSgXKHj3x2e29rfq18c5CKf3uGkoF9f3RmdnyGbG9oc3yJjIeAbHlxfXBtdY9xaXGAfo5wQ4uEgoOFf3d3eouFfYt6dX6Oko+YipKam6OWmZ2anZ6inZaNiqWbj56XjpaYj3ZubGViWldXVFFKU1VUT1BOUFZLTktOT0pRTkhOT0tFQzw7Nzk7Ojo/PTk8Ojk5Pz87ODw9Nzw5OTk5MjY2ODU2NjMzNjIxMjI0LiwsLS4uLTAtKyonJyouMTM2Mi84NzY5NjY1Mjc5OTV5ppegn5agpq+srquoqbCvsau8uKy7vrmzraibsKesm4+WnKWppaGYmpCGk3qKkY6PenWCcnp2cHFvWktGR0VBQENESUxMTVFSUFFTVVRUVVZXV1dYV1hZWVlZWVlWVlRTUUtENzhmNzA/qGlOSEM9OzpEioV6WkpOUFFUWF5lcHJtiKeqwH51eWJ7eG58eYiQeXyLhW9tjJF4c3hqaoCCcpaRi4F9loBJk5huaHd+gmxpY2x5hZCShmtzbHxucnuGaW1wf3ONiYSGen1+e3ZvdHOFgnmBd3B8joyKlIOWl5iakJOVlpmXnpeMg4mfkYuSjYaQln5taG1ubldVV1RSUVlPUlRUU1hVTU5ITkpNTktDSE5HRT86ODk7OTk6Pjw5PDs6Oj0+Ojg6Ozk/ODY4NzI3NTc1NTQxNDQyLzAyNCorKiotListKigqKCcsLTEyNTAsNDU2NzQ4NUhBODk1d5mRm5manqWtsKKsqqi1r66stL+rvMK/pqKalaSXnY2Ei5ShoZmZkZSLdI56gYeOinhzeW91cGpubltORUZDQDw+PkFGRkdLS0tNUFJSUlRUVFRWVldXWFlaWVlaV1ZUU1BMRTFAmjMganNDmW87PDk1PICChl9JTU9PUldaUllcYKeIYpppdHplfnBtf3qLiXaBiIZ0bJqRdHN7amudj015hZKJhI5nMXaGc2x+foN0ZmV0foSEhYBmaWx1a3GAfGdxcXtuk42Pe3N9fHFwbnVtgn53eXRpeYmCiImDlpOSkIuNkZSUj5eOgHmIl4iGioaAkId2ampuZ2RXUVpXWVlbTVBVVllYTklIRUpKSEdCQUZEQ0c9OTk4Ozk6OTw6OTs6OjpAPDk6PDk4Pjc4NzcxNTI0NDUzMzY0NTAzMS4qKispLCwrKykoKycpLCwyMjYsKzU3NzU0NzhpTzg7NW6SiJqRmZakqK6esp+muq6rsrDCsbvDx5uWj5WZi42FeYSQmJSNkIyPhnGHgnSIjol8c3VycXFocmphVEZJQz88Ozk6P0BBRERFR0pMT1FRUVFSU1RVVlZYWlpZWFZVVFNQS0U4MC9cYLNHOVhQOzk0NDGWuotITE1PT1FWTEFJUUlir7OgcXx4bX1scoOBhYF6hIaGeXKglXR4gHN1lIc1cZ2onY6hoYSihXZwhnyHfHOMrY2JgGhmYmlucm1wg3Vpb1h1cI6akndsf3t9bXFtcIB6c3ZtYnaEf4aAhZCRiouKkouRjIuPg3V4i4+AfoOAfo96cXBva15aXF1bWVhgXlJOW1pYV0xISkVKRz9DQUJHPkNEPTs5Nz07Ojs7OTo5OTs6Pzw4OD06ODs2NjY1MTEyMTM1MzQ3NTUzMS4vLCwrKSopKSoqKikoKikrLzNETTIxNjY2NDM8dlI3PTdikoGSh5aRnqSnnq+VpbWprbGuwbK7wcaXkIyUkICIfW6BkJKJg4qHj4V1goRslomKfXd5eW54cHhmal5JUEc+QDc0NDg7Ozw9PkBCRUlMTExNTlBRU1VVVldYWVhWVVRTUExFPDUqnUtbQC1nSTk0Lz+Sg6muX0dMTU5QTDdDTVJTREqGdoB8fHZ+bXeIiHx9hYN/jH52opl5foaBhZmEm5xhhqqfnYqCkI56d4h+iYiOc4qXj4N7XGRxdHp7d4psZ2pieW+Fj4J6boF3dIR6cHR5d2tuaV13h32HfIiHj4CLk5eDjYWNhn1xhH+EfHV3e32JdW9yc2VmX1taXVNbZl5XUVVYW1VHSkpES0c/RkBEQz5BQT06OTc8Ozs9PDo6OTk7Oz0+Nzk+OTk4Njc1NDI0NDAwNDY0NTY1NC0sKSsoJycnJigoKSkoKCsrKy8wMFVxPDIzMzMxRX5XND05XI14in+UjJKdnZ+mkaCroLGor8CxusW6lo6RlId6hXZrf4yRgn2KhI6MeIOAc6GFjH5+gn9wgH56aXdrUldMQEUyMTEyNjc2ODg6PD9CRUdGR0pLTU9QUVNUVVdWVlZUU1BNRkA6Mj0gI5ZjjFs1MzExaT9Hb0lGSUxNT1JMS1RdWVJKaYSIe4l5fHF8j4x6fImGfpeHdqGZiIePkpSljaypSIaur6+LgYCTioKLgYSRqIeAmJiKnHNsfIGGh32OaGdoeH5uhYaChXGEhUdrgHdyeXZobWtfdn2DiH+IhYx6lZ6ciouIkX97dYt2fHdtb3d+f3JycWtaXFxbY2NYZmVbVU9QVllQRExLRk5JQ0ZDQ0FAQ0E9OTc4Ojo6Ozs6ODg4Ojo/PjY7Pjc1ODU3NzMzNDQyMzY2NTY3Njg7REZMTU1MQzcrIiUnKykrKywvMDArbnUyMjQyMEyBXDU9PF6EdHx+ioWIkY+Wl5KXoZ2soaa4r7O9s5eNkouYi310cH+Jkn59jIKSlH2Gfoakh4h/goiFeIeIfnOEeF9jVktCNjAuLzIzMTIzNjY4Oj0/P0JFR0hKTE5RU1RVVFRWVVNRT0dDPzgwLCOHWz4/OTQuXZZwc6NVRklLTU5QV2BZcFpcXmqNk4eVgYSChZGTfoWJkYGalYKhoZeVm5qlrZOau7Gnu8fDqIuMoaWPlImBkXtyhJ6fkZx/doWFio+HkGlob4OAdIyGhItxhoJ3h4B7doV9bnZ1Z4CUj4aJiIeIh6GropaJjph/e4KJenpvZ2t4fnh9cWpjXVpaXWlcYWZfWU9LTldSUUlQS0ROR0NLRENBRENBPDo4Nz08Ojw6ODg3Nzg6PT04PD02ODY1NjYyMzQ0NTU3Njg2NzxCQj88ODo+Q1FeZVxHMicmLCwtLS4xKD+MWy4zMTBPg180PztudXBneIN7gIyAgZCPi5qapJyhrKarr7CXkZGEoZSEeHd/jJR8f5KGkpV/ioCSm46DgIGLi4KJjYN/in9scGpdQ0E0LS0vLy4vMDIyMzQ3Nzk7PT9CREhKT1FSU1JTVFRSUE9IREI8ODcvOUQ+PDw2My5sk5dNUEhJS0tLTlZgY39nZ211nZuPmpOTi42OmoiTj52LoKCSo6qlo6yTqLaiqMHDrseveLqUmnyNoZ6ZhJOFgo+in5SZkoSKhY+YkZZscHWJi4GVjI2Pdo+EcWyFgYqWkoOFiHKJoZaGk4qPj5altambjZWig4eThH5/a2prfIB/gHJgXGJeWWZqXGtrXldLR09TUU5NTEZJUERETkZCQ0VHQj45OTc9PDo7Ojk4Nzc2Nzs6Nj06Nzg1NDU2MzQ1NTY2NjY4NTU2MzEwLiosLCkoKS46UGFcQCwoLSsrMCwncog3MjQwT4RiM0A8dW5oWXCDcHWHcXaShn6XlpqUn5+cp6CqlpOYnmdlpJp+hJKReYCSiJCSfYqFmJKRgoCAi42JhZCHhIiFeHh/Z01SPi8uLiwvLi0vMDAwMjEyNDU3Oz9DRk5QUlRQUVJTUU5QSUVEPjs8OkNGPz48NzUyPD9SNUhISExMTU5SXm+KfHOBfaCdm6imopmhl6KVnJ+onqmrn6isqaq1l6u/q7bIyLfJ0c++m6Bwaaupn4SUkoacoZqamaeRkYiVopqad3p+lJeRoZKWl4GUnnt2lZKrs4mNl6B9lJ6cjpOWmaSiprawnZGZqIiXkI6BiGxzc3x+em9nX1tfXmFmY2BnZ1xRRUpLUE9JSkxGRk1DSExGRkNCR0RAOjg1PDw4OTk5NzU2NTg+NzU9ODQ3NDU3NTQ1MzY5NTg6NjE2ODYzLzAuLSosLy4tJyMqO1hiQigqLDEtKEuXXjA2M1GFZjJBQGlhXlBxdWBufWJ3jn18lI6Oip+Sl56WnKqYnqpCRH2HiYeYjXiCjYqOjHuKho+QjoGDgImLioSShYOGiIGAh3dfYlA0NjAtMS8sLjAwLi8uLjAwMTU+QUFNUVJTUFJTVVNOU0xFRUA8Pj1HR0BBQDg2NjI8OTtGSEdJSU1PUVlthpB3lYujp6q0vbilrqysp6i0rLG3srKtu7GzvpyzxKy7ycu4xL+4paOwsqytq6SLlpiFpqagopeBppmNoqqopIeFk6OgoKqgpKmOnLGLlaOnt7uboKOwk6Odo56RpKKrr62ztaKVpauJmoqTipV6e36EfWZfZ1tkYV1jY15mZl5bT0NJSFRPRkhMRktIRUZIQUtGQ0ZGQTo4Nz08ODg6OTc0NjU4PDU0PDc2OjQ0NjQ0NzM5PDM4PDIwMjU1MS8xLi0qKi8sLSooKiYlNVhYLywwLCwwhIE4NzFQhWg1QUNbWFRMaWNYanBYeoV2gZSFiIKbg5KQjZLayJ2Wc1aXiI+InI98hoyOiol6iIKHkY6DhYCLhYaHkoaChImGh4eHcW5hQEU2NDwyLzExMC0sKy0xLy00P0RBTVVRUlRVVVdVTVtQR0dEPD4+RkhDREA4Ozw1Qzs9RktJR0hST1BXgZOghK6js6qywcfDq7PFtqyzwLO4vra/tMG2u7ukuMaptsnHtr65tKijtK2xsZyakpqfiaevqqSVdp+kl6GrsbOYlqmtqK61u7K6rK+1orGssbW8t7WutaCnp6Oom6mwrbK6uLinnLepjaWPkpOghnmCgnRYYGNVZWFgYl9gZV9aVUpERUxVUUlKSkRKSEVBQEBLREFNRjw4Njc7PDk3Ojk4NjU1NTcxMTw4ODk1NDY2NDk3Pj0zODkxLjAxMjExMzAsKiwuLCsrKyooJyopRVowMCovK2iSTzYwUodqNkFFV1FKTFtaUWNkV3p1cYKUfYWGk3aGfoCNe7+7o7yCtJSTjZuPhIiPkomJeYaAjJOMh4WBjn+BiY6Gf4WIhYqHkXp5bl1WQEVNPDY6NDZBQjc2NC8vNkNIQ1FbT1FVV1VcV09fVUlLSkFAP0dLRkVEOz5AN0Q3P0JKSkVHV1RQXo+lraOxtMO2uMHMyba7xL2ztMG3uMK1v7C3dLG0prrFpLDGubGzsbSopLW2qrGgopabopKlsa2lraynpJigrLK6oqiyubW7vsy/xcW9vbPCt7q4v7e6t7mtrbGmsaqtvrC9u8LCrJm7qJWtj5iYqol+gnppV2FgV2lkaGRWWmNZVlRJR0dMUUdESUpBSEQ+P0JCS0BATEM5OTY2OTo/Njo5OTY2MjQ2LzE5NTk5MzY0NjI3Oz0/NjoxLi81ODo5NjUwKigsLS0tLCwqKCgrKyhFUy8qMDBKj2s1MlCHbTY/RlFMQUxSV1RaVlp3anB/j4SBjoVuenN4iGK4oZqjiZWUlpOUk42Ql5KHh3uGgY2VioCEgYp6fIuHhn2KgoGLhJV9eHl1ZU9cZEdFTDpRZGFbXlNGPjtIUERaZFFRWVhaZ1pUYGFNU09FQT9JSkhFRkFAQz1FNkI+SEdLTVNaVF6Ur7i1urnJwLu9ycy7vcC7t7W8u7e+tbqyxmB1sqWxmp6rvqqlqKuqo6KytaGrp56Vlp6Yn66lp6aln6SToqews6iysry2wb3TycnTxsLFzMLKw8C+vb+7vLe0sLm3t8O6xr7DybCeuqqirI+lqLaJgX5xXmFgXFZhXmdlUlhhVlJVSUVFTktAPkdEPUtCPUJAPUY+O0hANzk2Mzc5PjQ4OTo1NzA0NS8yNjM4OTM3MzUyNj84QD5HS1JUVFJQT1FSUUpBOS8sLCwqKygoLC0sL1A+KC40OIB9PDJLiHE5PkNLRUBJTVBSTFFdZ21scZCNhZBzbXNyc4jVwLWZoI2VmZqRjpeRlpaOhod9hoOMlot/g3+DeHuLhId7i3mBioKXf3R9emtlcHZZXVxQZWViYGVkXVtYV1xNZG1VUm1uX29fWGdlVVlUSkRBS0tIRkhISEhCSTlEP0hLVFRWXVpck7nAub23xsC7ucrLu7e6tri5s7i1ta62tplkdamerXBeoq2cmKGim6Seq6WUn5+QlI+WmJeon6WfnpqZg6SdrKSqsK23sLy41NDO1s/JzNLMz87Kx8C/wsq9wb3CwMXExsq/yc+0pLuxtbCbrLm9mn54alxfW1hdYFliYlFbYFNRS0NCRUZFPEBFPkJIQkBDPTpFPj1KPzQ3NTM1Oz00Njg5NzcwMjIvMjQxNjk3NzU1NTVEM0VMTT41MTAwMDY6NDc3QElPSjstJioqKC0uLyxATSsvNTRtiUkwSIl0Pz5CREBDREZLT0RSXFlpYG+XkpGUbmxvdHWHs6yhoZ+LmZyZjY2VkZuShYqKfoiHjJCMiXyBg3N7ioOFfIp0goqGlX9ze3hsbXV8aXNlaWxpZmpqaWBmaWhtWm10l62kvIeHZ1tvaF1aWVRISk5QSktRTFRRSExBSkdLUF9fYmdqYpe3x7C5s7u+trLEx7awubGwu6yzsaert6yNtqeenKeaTpuejY6glpGmmKWVipOTiJGJj5CSnpuhmJuVloeemaaarK+or6ezs9PU1NbRy8/T1c7Tz8zGw8rQv8rJy8nSyM3Nw9HSuLDEvcS6pre7xKKAbWJbW1xXX1dZZVlQXFdOUUNCSEVCSDtBRD5BSD8/Qjc7RD5ASD00NjY1NTs6Njg3NjU0LzEwMTQ2Mjc4ODc1MzY3QzVCOD8tMCwxMzQ5PTk3LC4sMTtGTD0pLCguMDAwN0s/LTQ2VIhXMESHd0M7Qj5FQkFDSk0/VVlTZldzkJCZg2hxb3l5g6CqnqaXjZubmIuNlZGajn2Ji4WOioqLkIh8hIJwf4eBhnuHcoOSi499cXh1bHB4f3J7bnhzbGmAcG1jaW1weWl3fX7Lv8Lfp21jeG9kW2FgSlBSVU5ZXlBdXU5QTlRRVVRcbm53g3KWrristKiwtqutvcCxq7WmpbinrK6grLSkj7Gum5iYjJGUkYSPm4GNppGciYOLhIqJhIqDlJWYl5SbkZuXmZmenquspKehrKzO0tXRzczS09TQ1NHOyMPU0cjO0tPT1s3S0cXS1sbAzsjIw6m/uNCdeGxkXGFcVV5RXVpOT1NQTkg+QUZCQkU8QEI/RUU+Pz86PT09PEpBNDU0NjU8ODg4NjY0NDEyLzAzNTI2NzY4NTMzOz08RT1AMTErLzM0OT81OTAxMDIyLTJFTzMpLzMuMzI9TjI0OEN9XzJBhnREOj09ST5AQ0ZIPFZSTU9bdYeGi3dtd3B9foChnp6hi42Zk5OMjJOQloV5hpCQjYuKiJGHf4J7cn6Agod6hXaFk5GJf292c2xzfHx3fHOCeHFrgHJyaW9xenlye77Lmn6MsYN2coV3aGFqXUNaWltXZmRYZWtUWF1cYGNdY3h7f4uBmaqkpKKgoammqrG5q6a0o6KtoqOtoaexn4mmm5WTkYqSjoiClIlrlaKNmYSBhn6Rg4OTlqyLlY2VmY6FkpCdl6ewoqCgpKSox83Px8HL0NPR1NLO083G1tPN1NjW1tjV19XJ1NrNydfW0cqtxMPMinFtYl9eV1JYUltPSkdJSUpAOzo7RUJEPEJEPkhCP0JCOzs5PDpHQjQ2NTQ0PDU2ODc1NDMyNTAvMjU0Njc0NTU0NDw+PUU/QTYyLy0xNjs9MDgxLzI1NC8tLjtSMDE3LzUzMkVEMjg+bmI1PYF0TTk5QEk8QUQ/QTtQTEZLWXCAdX5pc3lygomBnZWelIWLlomOioiOiI+AeIOUmYuNiIiLiX6DeHN7fYSHd4B7h5GXgYNud3BtdX92eH10hnx5bId2dW99doR1eXudtYw8QYrGpX6NfGplV0lDZWNmY2hqZG95W19maGtuaW6AhIiRjJ6foJ6Rl5ifo6OmsqSls6CipZ6hqJ+isZyHn5KSk5GLjouGg4+EfpybjI2ChIV6lH6CqpWjjJKKmJKLfZeKmpGrs5eam6ecp73Dxbm2xc3S0NHPy9LLydTP0dXa19fY1NnYzdjbzsna2tLWv8zNtXZ1bWNcWFFVUFlVRUZKSUVFPTo3OkBBQzpHRUBFQ0FEQTs/Ozs3REM3NTY1NTswNjg5NDQzMzQxMDE0NTU4NzQ0NDQ5QD5EQkM8MzMuNkZUV09RSkFKRj8xKiguQlQyOTI1NC83Szc1PGBiQTxzdlY4N0FIOj9DPjw5UUVDSlRsbm9wYnFxc4aNfJeRnYt+h5KCiYaFioKIfXmFl5eIj4OHhod6hHlxenuEhnZ6ho6NnXqMcHxvcHp/cnuAcYSHgG6OenV3fXyCdX98h4mwdFmpwraMkoFwbmM9XmhycHFwbnh3gmVpb3J1eHJ7i4eOk5KblqCWiIyTm6Cbn6qfoa2copqZn6Wen6yZjJqMkZKOhX2Ih4OFi46gmZOIg4d+bZl5hJmGiJOMjZWMhnubiJOPrquUlZeemKautbyorb3Gy8jJy8vPycPRytTW2NfY19Xb19Pa29bQ29rR1snVzJR3eWdnWllPUlNdSEJFSUk+QT49Nzo9Pzs+SD1AQkFBREE+Pzo4N0RCNzU1NDc5LjU2NjQzNTUzMjMyMzY0NzU1MzQ1N0VCRENFQjU2PEZOU01bbmZjbnNrYFY+LDRMRzg2NTQzM0JGND1XX2hMdXheODs/Rjw8Qjw6OUQ/Q0dSa19tZGJma3aAiHGRkJuAeYCOfoOCgoR+hHx9hJiOh4x+hoeAd4J5bnt7h4J0epKejaF2j3WCdHWBfXSAhG+CkIJvkoR0fIGFenaHfIm4xqXDybeBlZuPeHBlTmVjgnqBd4aikIt5eXd7hH98hHZtlJaUlY+YkYOJj5aal5emnJigl5+TkpejnZmrlpGRi42Sg4yFiYiBhpCRnpyZiYWLgYWXe4iJn5eQiY2Ki4J8oYiQi7yhmJOXmZyopqWunqe1vsDAucfJzc7FzcrR1tXU2dXX29TX2drb19va2djO28eFeXdlaGNfU1ZWVU1LRE5EOz09PDk6PD45PkE2Pj9APUA+PDk4NjdDQTY0NTU9ODA2NjU1NDc3NDU2MTM4NTQ1NjQ1NTdISD1ESkU3OTI1O0g+Ozo6N0hQXFpSVVhLOVQ+Ozk1MzI3STg9TllNSHh4ZDU9PkM9PEA6Njo+PkBFUV9ZZWFdW2h0enlsiY2Sd3Z6inx+gH9/fIV7foKRioWGeoWIe3V9dW19fYZ+dH+SnpGfg5J8hn14j355i4pvg5uAdJmGfYGJhXx+kXuQqY6Qw6C8jJyjnH2JhH2JcoyLf3OmmpyZlIV7j5GJhGlHcaGknYyLkJKFiIuRk5WPnZqTlZGXjYyVn52UoZSSjo6Qi36Qj46LhIiSlpqfn4mMlJGdkIKMf6aZiIWOgoaEgKSGiou4mJ2RlJahp6Cdnp2jrra6tau/xcrQyMfMz9PS0tjS1dfA19jZ29ja2tnZ19u3d3d2aWlkVl5aU09OSERMQj09Pjk5Ozo5OTw9NkA+Pj09OTo7OzM3REA4Mzc4PjcwNjg4MzU3PDM3ODA0OTc2NzU1NTQ2RlA1RE5JODkzOEFLPTszQ0BJPDlEV048TVRITj85NjMzMz5DO1tYPjVZeXBaPDxBPD0+ODU4OT89RFJTUlheVVhmbW1taYGOinFzeIp7e399f3uIe317i4eDfnWEhnlzenRtgX6EfXeGm6GbnpSSgIuHf5iHgJySboiphXqgi3yQjoOIhJx+mpGJjaOin5Cjrp+LkYuFi4GShldyrYufrJyPhJickJCOXIOikYKNn5OVjIeIjJKTjJSVlJCMj4qIlpudj5WWkYuTlIaAi4mSjYqKnZaZo6KGk52VoIqKiI6ckIOIj4CDh4WkhYuQs5ickpSXoaGemZKbnaexuKylvMHHzcfGz8zPzM/Xz9HUrtbV2NrZ2trX1tnZnm57c2ZlW1xXUlVXQ0BJRD8/Pjo0OTo7Nzo7OjM7PD89Pjc7OToxOkc9OjI3PUA1MDY3NzI1NT82NTs1NTg1ODo1NzczNUhSN0dPSzk5ND1FSkI+MUZDTEE5ODpHWEA1SFdJNjYyMjM6RUNlWD8mX3lpX3o+Pjk8Ozk4OjxAO0JRS0tTWVBUY2J4bGJ+koNvbXeLeHp/e4F9hnx7doaFgHNwhYJ7dnd2dISDhX1/kqain6ailomdkJSXioqnl3KKso2Ep5KEmZOEmoyjlqCYk4mbnaGSqK+fkZSQjo6IlYtujbeEmsTIsp2ipZudmJaRspBkpM3IlY6Gh4mQko2Nk5SKhYqKhpaam4+QlJOHlZiEgI+LmYiOkKqXl6SjiJmelpqJj4aXl4uFj4yBf4aPpYiNk6iZl5OWmKGYn5mTnZuisrSlo7zBvsfFxcnIycLK08zN1KjS0dbW1tja1NPazoFxfWdiXV1cTklUWUFCR0Q7QT04Mzc7PDo4PTY0OTo8OjcyPzk5MjlJOj42N0JDMzI6OTYyNjQ+PTQ7PjY5NDk7NTc5NDRLUTxKUUs5QTdCR0lANjRKRUxGPjs4OEVUQTc+XDg2MjE0OjtFYFhBRmF0aExjWj41Ozo6NTs6PTpFTUZIUldTUkJjgUZ2gY99fG1+iHh6fnuCgoN/dnaAg3xtbot/enx4eHyEh4p+i6Ozp6Oqs6GWp5+lpJaVrqKDkbiVkbOajKGhjKSbsKOknZiRp5anmayvpJeUlpWQi5iZl6HAjqPJuauco6atmZKbnbKdhYWoopyYhYmJjpWMi5OPiIGGh4mTmJWMi5SThpWYhoSRkJx1kZiylpekoYidmpOQipCKl5uJipaOhn2MmJ6JkJCcmpmTmJeflKCdlZ6boLGuoqS3vrTFx8S9w8O/xs3KydKmzs3T0tHW2NPQ2LpxeHRbX1RfVU9ISk5EQkNFNT46Nzc6Pzw8Nz00MjY2OTc3ND01OzU8TDw+OzxCQTc1PDs0Mjc3P0A2P0A3ODQ5ODc7PDU1T01EUFJMOEA9RUFHQTU6SkVORUQ6NkFAQlM+OURPMzIzNTc1PXZcPFJcdGlaTV1TPD04ODU2Nz06SkZER05bXFlKZmA7SISLenpuhYZ6fIR5gYaBfnB4fH59b3KNen2BfHiGi4mGhJKnu6yosr2vpK2zs6ijobCsipq1naK4pZWtpJeprbinpKOfmqmXqaOvsKmZmJyUlZGXoJiau7uuyqFqtrirsJSZn6Osk5e9o16qsoOKio2Uh5F8jo59g4aOj5SViIiTloyQlo2LjJeYk52ZtJeWq52LnJSSjpGSjJibipGekIuJlZ+hjZSNmJmckpuYnpShoJScnKWvqKGks7irwsjEtbq9u8XHx8LRoMbJzc3F19bRy9Shb3lnW1lTXVBPRUM+PENBQjg/ODc1P0c9PDY8MzUzNDU0NTRCMzk6Qk06QjtBSEI7OkA8NzQ2PEI5P0BCODc0Ojo2Pjw0N1RLQ1VRSjc8OklBREA0QUpITkJBPzZEQTxKTkQvVD0yNTQ6RUpcWEpaUW1ncHBEaWBLSTY3NTc6PkpAQ0lQZEdiYGJwSkCLin+Bc4aHfYKIdYOKgn9tfH19f3B3h3eOgod7jY+MhoyZqsLAr73Gu7O0wLy0rauztoyosq2tvaubu6Sorbm4q6amoqKkoqmvsrGqnZykmJuYl56ipqWSpLqvqcC8ra2yuaakqH6IhpytvLCDjIyLkIOPg5GOeoGHkI2NnImIj5eNi5WWlJGal52omrGakaycjpqPko6VkJCWl46RoJGJlJujrJSWj5ScnZOgnZuYoKGUmp6npqSio7Czp8HGw6+wurbFxMK/zabHxMfDvNXRzcXKh3JxYFpYXlpMSkJLQEZHPkE/Qjs6ND5BPT01PDY+MzMzMjQxQTE3QEJOPkdAQ05DQT1DPTs4NkNDNUJJQjo4Nzg7NUI+NzlWS0RXT0Y4PTRLQEM+NEVLSE4+QUE2QkI/QlNFNThQMTQ1Ozw4O0Q+OUxqal07V1JkS2daVU83OUdEP0NGXGVHYGlnWl1ck4yMiHuHjIeDjHWGkYqBb357gX9xfoF7lXqSlJSYkJOVp7PGyb/CzMLDuce8u6+rubuXsre6ssCupcCkq6+7vKqtq6OjnqerrrSwqZugqpuhm5afsLWni6O6u7bBvKyonLKlpKiUhY6pxMOkgouPh4iEhpWUjXqEjZGPkaKMjJSRjomXn5iTmZWYpqCunYyqnI6Wj5KRlZWNkJWRj6GUhpefoLKelJqUn6GYpJ+aoJuglJiepaOmpqSvrqW/xMOuqLe2ycO+ts+yxL/EvLPRycjCtXN3a1tWWmhRTEhDTEtLSkFBPUNEPDVBRDs7Mz04QjMzMjI2M0EwNUlFTj5JQEhSQEg+Q0A7Pj1GQTVBVUA7OTk4PDdFPjg+VkpDV09HOD80TEBCOzVKS0NMP0I/PEJGPUFITDkrRzwzNjc0NjRBPzdPYU9hRS89PjZrbGpgQDpIPj9FQmVZTmVcZlRjapmNl4qMiJOQhol5hpSQgXKAfI1/eIeCgpB6jqGWqJqamLq+x8jJwdLJysLNvcKzrbu+p7q/vbvDt6zBqayzu76qsKqkpaSsrrOttrWgn66fpaKYo7O9qZuovcGkt7ewq5OxrKusl4eaqaelkYKMk6WViYF2ipF6hY2SkJ6fk4+Ui4+NlKOZlpyUlKOeqp+RpZqMj4+PlZaIfI+VkpKjmpWgopy1pZCel6SjoqWenaaYnpaXm6SjqaeisqyovMDEr6Wyt8zAua/Es7u+writwsPCwJhreGBXVlpaSktNSkZEREhCQkFETDo0REg5OzQ8N0UuMTIzNTJCMjZTSE48SkJKUUVLQ0RFOkVMQjw3RVY9Oz04OT88ST86RVVJQVdRRzdBOks6Qjc5Sk1CSUBDPjxERzxCQ089MjBIMzY2MTcwPUI6PWpqSks1UVMzU3BwZE47RD1ARj5qSF9YYVpkZFaej52Ol46ekomKf4mgk4R4hX+Vf3+QiIqQgJahma6mpJjCvcfDx8XTzc7Ny7zCt7C5vLS8y7zDwba2u62zv7m8rq+ooKmotq2uqbK3mp6soqehnqu3uKqlsL/Fsb25s6eqtbOtrpeWpayooJGOkrLFp5WOfZKVfYiSmZCqmZiTk4+SlZOlnpKdmZSho6KcmJ+Yi4yPj56IWpCWl5KWpJllmKOes6WWoZasrKqnm56ml5iWmJWgpKiln7arqbm7w7Sls7XLwLiqtqyyuriuqLi6vbiCam1ZVlNUTUVKUk5LP0FIRURIR0c5NUZNOz44PUBKLjMyMDI1QjU1UFdOPExGS1JMT0hHST5JUT86OElTOzs/Nzk+RExCQEhTS0BXUEY6QT9HNkE3O0hNQ0U7Qz00RkU6QkFCRzkvOkEzNjAzPkdEOTQ9dGRNRztFKzpmfGdWOz1AQkZCcEVpSVJlYkxGpZScl6KXqZaNkYOHppOIgoeCnIODlZCQlI+aop+vvq+hxrzFxMbGzs7O0sq+u7axuru8v8+1w724uLeysbWzuLOrppyrrLmqqaevr5ejrqSnpKW1wLCrrLS/w7rAurOnubW4s6+Wpa2urqSLk5WhjXTBmn2XmYSPlpqMsZWbmpWSk5mZpaOUoJuXmqmcnKGgmYqNkJacYEqWnJqVmqWWVJawn6+cnqSUr66rpZqgpZSTmZiOnKCnopm0qaqzvLu7qrCyx7+5pqyrrbGxo6GxsrSkb2xkW1lOT0tFT1BRUTtHSkhHSUNDPjpLVT9BOj1FTTA3NTQ0OkIzNE5XTzxKS09VTlFKUEhISk9CPD5NUjs+PTg6PENSPkRIUklCV05JQEJBRjM+NThKS0NBPUM7NEVBOkE/PkhANSpCNTIsPmNdZzozNXRkZUBSNyYjM31oVzs6QkNAPVFFV1NzYldGSKqXmaCiqK+ZkZeHi6eWjoiThZ+HhJ2Xjp2hm6Oktci1qca6wsPHysjIzM3Gvruzrrm4wcHNtce6wbi1urCur7O0pqSbqrS1qqmmrayapK2lpKisur+oq7a3vsK/vrmzssSyub2so661rLmmiJuXppt2v5+EmZ2Ok5mai66XoZyblpWbn6GpnqefmZqqmaGnnpiQjZGdg252kqKalZ2inpCusqKqlKiql6qto6OfpaiSkpmciJScop2Wsaepq7q2vbOyrb65t6Cjp6ilp5ybrKmpjGFkYF5RSkxGSE1JVkw9TUROSktCQ0Q8UVY9QUFCRE8xOD03Nz9CNzVVWE4/SE5RWVNQUVVLUUpKRUFFTVE/Pz04PTtHUjxFRFFCR1lNS0FIREU6OjM5S0lCPkNCOTlDPjxAPjs7RzctMj4tMYJoTnpcLzBraGA8PUJCODZ6Zlc7Oj0uLVJgTVVIf2VeSEWrlZyhn7uvmZSfi5Orm5GSk4mrjYein4ykrZSjo7bGvrTAusLCx8jFws3Iwb25sq+4tMDCyrXFssG8tLqqqK2tsKOjmKq0u6appquqnamup6Oqq768qK28tLi+x7y3trjBsb7BtKm1t6u+pY+imJKioLyfiZqgmZeeno+3n6mcpaKbnKGaqKWzoZudppyoqp6ZlY+Um4uXiYykopSdop6gta+lpJKvq5mrqp2dpKOokZWVn4OPnp6blamkoaG0tLq1rai1srOenKKlmpeVmKqhnnZfW19dSkhFRk1RSE1FRkdCUkxJQkVHQVZSREg9QUdRMTtCNzpCRjc5XFlLQUxQVFVTTVdSTlVKREBKSk5POUNANT08TlFDPz9QP0VaTUpBS0RHQDUzPUlHPz1FQTk3QTs8QDw8M0A8Lyc7KkiRQjpTSjAsW29XNzE8Kh1CgGRUNDktMTlnXEZDQ5xwYkdFp5ekn57DrZuXpZiZqZyWm5uPqpaVp6aVrayZoqu2xMK8vrfBwsDHxL7Nxru9ubKwuLO/wsi1v7C8tri2pqSrrK2hoZqqqsWipKmrpp6sr6uiqai/t6atvrG4tse2tbm4wLO/wre1s7SvvqOXo5aUnJSuoJCho6Wjo5+QvaSpnqirnZ2gm6afvaKZo5+iqauhnZaNlZ6TnoePhI2Tn6SgnrWspZuVsaeZrqaemamdn42YlJ6EjaCam5OlpJqYq7G1saulqq2snJigoJKOkJWonpRnYlhgXU5IR0pOS0hFRElBPlBIQDxHSUhbUk9LPUhPVTRCRjk+SEc1Q2FbS0NOUlVXVlFYVFJVSUA4UlFQTTpHQTRDSFFTSUM7Qz5HVktDQE8+SzwwNjtHRj47RkE0NkA5Oj85OzE1RDAtLC9Ndlw0S1o1LE1uVzwtPSkeI3piUTVDS1E6blJGPEt4ZWJWTKKao5yexayhn6yena6gkqOflqWfpqqsl7axo6qztsTEvb+1v8K7yMK+ysi2uLW0sLOzt8HFtr6xuLW4tZ+mrKqsnZ2epaTBpJ+qraCkqa2voqaovbWlsby5trbEsrS4ur+zxMG4uK6ztbWjnaWVkpShrqCZop6oqKujmsKtqZ6srZubnpmmob6hnaSYq6uspqKZjZqfkp+Jjld/lp+moaC4qqaTmLWjn7Ggn5qulp6OmJOdgY6fl5WOoqOWkKausqupoaKlpZWVnZiLj5GSpJ6JYGNZY2BLSEpKTkVFQUZKPj1KQjk5SktOXVFRST1MVlw5Rkk9RE1JOEhiXExDTFBTWVlWV09aXklBPVdRSUs/SD81SE1YU0hBOkBBRFBIPz5RPks3MDk5RkU7OEc/LjY+Nzg+NzcvMT85MSUxUVVtW0pPMTA9Z1dEMTc9LSt3YFM2U1prV3JHRTY9dWVcS06en6GZnsOopaK0opyyqJOrpaCjn62prJ27sKistrHIxcHCssLDvcbDvMTKvK+wtq2wtK+/xLS5sbC5tKyZqLCpqpqdpaGowaybrLCcqqOusamkqL22pre7vq+3xK20s8PAs8e0u7estLatqqKmlpWVpKyin5+aqKuwr6+7sqagqaiamZiToqS5oKGkk6+vrKWnn5KhnpWej5CNlZ6aop6ntKamjJizm6Oump2brZCek5WTmX+RoZaPjZ+hk4umrLClpqGcoJ6SkpqThYuRjZyef2BlWmdlSklMSlJCQ0BJRzs7Rz85OU9NVV5SU0o+T15dPUhQQkxMSTlNY1xMRUxSVFlbU1VPXGJIQT9aUUFIQUtCN0ZFTEtNPztCSEROQj07TkBBMy85N0NCOTdGOys2PDQ2PDM1LS80QDErJ1Z0U2VPPzEwNGJbTTIzPjA8dl1eP1tUXmVxQDg7SJZ3ZUE0n6OfnKDDqaSqsqGjtKqWs6ynoqSyrK6pu7GtsLW0xsDEw7XAxL3JxLXAyMG0q7Wor7isv8Ozt66strmlmauyq6qYn6aXrbu0m6ewm62grrSyp6u5sqe6s7iyucCqt7LEvrXGqL+vrbe1qaesoZeXkqaloqKYmKWvuK6ytbagn6ikmpWVk6Sgt6KkpZavsbKnqqain5uam5aXqJ+gmKGer7KipoyXrpikqpeZnqSQmo2Tl5mFlZ6UjI+cnZOLqamqoaegmZ6VjI6Zj4GFlYiUn3hiaFxqak1QTU5UPUNBTkM6Okk/NzdST11eUlZRQVdgXEJKU0hWS0g6VGRcTkZPTltXW1JQUVhdR0FCW1BCRz5OQzlIR0hPUD8/Q0lCTEI8MklBOTQxNzdCPjs3RTcrNjkxNDgwMi0vLjw2LSNCcWdzazIzLzFbYlozMzgwNnBbYkgwNUlwaFZDV0aMeWZDO6OjnaGmv6eor6+hqbWrnbqxq6OqtLaxsLm3sLe4uMS9w8e9vMTBxsC4wMbAuam2pKy7rMDCt7eqrLG6opWtsa2ylqWnkaq5qZ+msJ2roLC0s6qqtratu6yzs7m3rLiww7u+v6bDq7C3rqmrq6aemJmroqKhkZehsa+zrLC5mpypoJmWkpemobeppaOisLG0q7OorJ+boKCbnaWdopedo7Owmp+Pk6Wan6ialKKdlJeJk5aSlZack4iQmpmUjqiopp+jm5ebk4aOmIt9jJaFjppqaGxgbG5XUFFaVEFDRVRAOztIQTc6WFBkXlBWV0VZX11NTFJOXktKPlpjXk5IUE9cVVlQS1RXWkk/RFhQREY/TkA9SUdHUVBCPURGQk0/OjFEPzc3NTQ3Pz05NUU0Kzc1LzI1MS4tLiwxPSonKz1ccD0+MS4wZFpkQDE2NDdnWWBGKD84bH1nW1Y7iXtjQz2nn52iqb2iq7Cro7G4qqW2tKygrbW9rrO4u7q9trbAwr/IxLnEwsDAuMS9wbevtaert7G7vr+0qa6xtp6Xq66orpemqI6nu5+krLOerKKxsLOsqra0tb2usLG1rLC1ssG7xberva+xuKytqqOxpp6lqZ+kmJCZn7Oqs6uqs5qdp5ualY6gpqW0rqehra2usae0rbKqpJyfqKOelaKZm6i1qZeZkZKemZ2fnZCqnZaXhJSWip2ZnJOKjZaXmpempaKgnZaVl5N/j5SFe46Sg4uWZWxyZ29xXkZZZlZEQ01YRFo5SEI2Pl1RaFxOWV1HW15dTk1SWGRKSkNcYl9QTE1OWFdYUEpWVldMPUVVSkVEQU1AQUZISFFQQTtGREZLPTg3Qj02ODcxOT48NjVEMCs4MC8wNS8qLC8tKj0sLCUyKyo1SzEvJ19fYFUxNTA9YFZeOClDM1lUXGdLNox6ZkxApJqhpKy2pK2qpq+ut6qvtbqnp7G3xbext73BwrW0usW+zMW5wsC6vrnEt8C5srSrqbq2u7m+tKmtsLWYmKesqqybq6uPq72dq66yo6ufsK20rq22srm4qq6vsqi1r7S8vcqzqra1sbSwr6ehs6CbqK2gppaWmpqyo62gpa+XoaSampKOo6Wns6mhprOsqbWlr7G1r6SZna2nmpifmpmrt6KXk5GOl5yhl5aUq56akn+Sl4ydnJmWkImUkp6ZpaKhoJiWkZOVeoqPhXuMioOLkmpteG11e2FFYGpZSUhZWj17SkZENkFiVGlbTVxhSltdWlJSUmJhTEtFX2BgUUxJUFdWVU9HV1ZVTjpJVklIP0NLP0VESEhRTkE/SEhIRTw3PT46NzU2MDk/ODY2QiwtOCwvMDQsKCwvLSo3NikoOS4kOks1LiJUYFVgLzUoQ19RXC4qQi9KR1BbSDNjWVVLRJmXobGosaqtpqSvrrapt7S5pKy0t8m7tLq6v7+0s7fDwMzIvMO8t72/v7e/vLG9rae6ube2wraqrLG3lJemrquoo7CqlK+6o6yxs6eoo7K0sbGwtbG4tKquq7Knt6+2tMTGtqm2tqywramno7agoKexoaSUnJmVsZ6nnKCqjqijnpyWmKampbinorK1rKexp66wtqykmaCsqJucnpyUqbiclI6OipibopePmKWfnZSCkZWPnJuXlpWIlo+Xmqeco6CSlpCQlXaEkId7hYGEjIttcHd0e35cS2VsXEtOY1w+YntHSThHZ1dmXExeYk1YWVdUV1RpXU9PSGFdX1BKSFFWVVJLSFdVVk04TVpORUBGSz9IQkNLU00/P0xPSEA7Oj47NjswNDE8PTQ1OD8pMDcpMS4yKSksLC0rLTkkMDQyJTlCNy4jQU5IZjI3J0diTFYlLUItPUVMUTwzcmtJQ0OQmaWupa2uq6elsbO0qrext6CrtbnJua7Au8K4s7G1wsLOxcDBvbS9v7+6vryyxKepubC2tr+8rquzspygp7GtpqWvpZ6ytauqsbKtqqm0u620srWstK2qrKitqbmtsrHIwLilurCpra2lqK6wpqWjr6SpnJ6cm6+Zo6Oio5GsnqOgoKKqpqa5pay1tqWqq6itr7auo52jqaqboJqakqSzmY6JjYeQoaCUjJScn5ORhI2Skp2amJWTh5eSlZmnm5+ejJKRjpB2fY6FfHx8h4mIcHNxfXx9XFNkbl5OWWZcRkSWW0c7Tm1YYltMYGJOVldWV1RZZ11RUkxjWltUS0dPVFNOR0lWU1xOO1BeSUJESEpBRT8/S1NPPjpOTUM8PD45OjU9KzMyPTYyNDk6KDQ1KS8sMSgpKywtKiY1Ki8mMCkzODoxJiozQmM7NipIZUhKKztIPzNCSFMsPpBrO0dIj5yqq6KpsaSppbO0sbS1srKhrK69zLquwLrHsbSttMLC0cXGvsCyvcDCvL+3u8SnrLess7i7wK+rsa2go6etqqiksKSrsqqvrLCvsK6rs7yntrGyqbKpq6alo626rKqxw7q2rbupqKitqqmzpamko66qqKKfnaSslaWemJ6ZrJ2iqKqirKajray4sbKhqaKgrK+xrJ2fp6ipmaSZmY+gp5iGhI6Ki56fjoqMlZuOjYWGj5SfnJWXlIaWk5OXpJucnIqSkI2Jfn2HhXx3foeFhnNycYh1a19ZYG5jUXNxXEs7hHxGP1d0WGFaTmNbTlZWVVdRXGJfU09OaFhXV0tHTE5SSEVJVlJdYzxQXUQ8RkhIQkc/PUpQTDo+T0o9OT89Mjo3OyoyNT4xMDQ4NSg1LyosLjMwOyksLCclMjM0JCwyLTg2MCkoMTxdSjAuSmdERjg8QjA1RUtYMUCVWj5MRZWYraihqrOcqqqwtq24ta6rpauqvcm7sL23wq+xrLPEw87Pw7++s7/Cw7rAs8jDq663rbK4v76yra2rpKeqsKmnqLGmtK+qsK6tsrG0rLS7pLizrKyup6ugo56wt6uqrbu3pbe2pKqnrKyrrqGpp6axsqSnpqKirJaqoZSboKaepKKrpa2in6ext62uo6aim6qrramcoqWkpJmgmpaPmJyTgoKPiIWcn4uKjouYjY+KgouXo5qRkJqMk5KRk6KZm5qKjouKfIWAgYN6dICEgX1zdoujh3hqXmBuZldlh2NOP2eTTEVieVdiWVJlVE1WVVZUT1xdYVVLTWlXVldJSkhJT0JHSVNRWW9BTVhAOkpHRkVHPj5FUUg4Q0tFODdDNzI6OjoqMzk/Li80NjMpNCsqLCsuIzQuLSsmKCs3OSomNis8LTIsJjA2V1ouMEpnQUE8PEIrOkpPXjREhj5IRkSXkrClo6qxmKuqrbastrGrpayqqbzAwLi4s7u1prKvxMnL0b/Buri/v8K5wbnAxK2xtbGzur+9srCuraurp7aqpq2vqrmwqLGyrrKtt6q3t6a0t6uspKmqnKOes7OoqKS0taC3rqCqqKuprKigq6ypubapqqmqo6mgrJySqqGdoKSjpqOqnpynta6opqqjo5ilp6eqnKOko6CamKCRjo+YjX+HjIeDnZ2GhIqKjY2PjIOFlKKZjYyZkJGRj5KflpiWi4qDf3SGgH5/eHSDf3p3foGInY9vcWdncXhcYHOIa09emVZIbXhVZFZRY09NVVRVUE9YW2JVSFBpVVZTR1BZVUk+SUhPUVB4TE1WPTxLRD9AQTxAQ1VDOUFLPTU7RTEzOzk3KjQ6PSstMzMxKjgqKisqLCkpKC8qJiklMzssJDIpMjAyMSUvMlFiMDI/Zj1OWD5DLD5MVF8vSmk1T0Q7lo6woaarrpqrpaywtLWvq6awqqm6vrvAsK65rqG3r8nHyNDBvr27vMK9usPAvr+usrKxtby6wbGxsquzqKS0qKWts7K5sKOttrGwsruruq+prbasqp6qrJ+joLatqKGfr7KitKqeqKeqo6qhoqytqL2vrK6toqiooKyZkLCimKKgp6eep5uZqrGpo6CtoqGUo6Ojp5iaqaWYmJiejoqHlIh9jYaEg6OWhIGBi4aOjJCDg5OgloiQnJCTkI2RnJSXjoqGhXh0gX98dXh5gHp0c3lof4akdWleZGuBdGeIjH1TWHBeS3hzU2VTUV5NTVJZZk5MVllkWEZTaVJRP0NOUWFROklITFNJcVFMUzs8ST87PD07QEBXPDw/SDczQ0IxNTo5My01OjopLTMxLi01KSgrLSw0MiMyKScsJS47LiYxLjAtMTQlLDBMZzo0OF89YWQ/RjFDUFtbK0hNOVVBNJGPsqCkp6ykp6Osp7WzsaulsaiquL7AvK+nuaqmr7DJx8jRw7y/vrm+v7zJu8G4sK+0sbq7t8Cys7usuKyitKenrLK2ubOnqLy1rra+sL2mrKy1q62cqa+koKWtq6ecnqqypLOom6unqaOpnaSpqKm9rLSvrp2ppKCunJuzo5WknKWln6Sbm6mrpp+bqqKbk5yhpZ6Yl6mpkpialJCKgo+Ffo6Cf4edj4V+fYuGkI2PhH+TmpOFkqGMlJGLkZqRlYaJfn9ye3p+fGh4fHp1cHB8Z4R4hIhkYWdicoV6bWd4XV1WQVd6bVRhUFJYS0xOcXVdSFpbZ1lFVWZQRD5KTkRDQTlIR0tTP2phSlE4PUg8PDw+Ojw/VDY6P0M0NUg+Mjs1OTAyNzw1KC41Ly0xMSYvPktIMCUaOTAlLCwwOS8sLCs2JzE3Iy0wR2pJMTRYPWZjQUo3R1NgVSo9OURXPiqPlLGZn6CppqWgqqW4s7OmqbGnrbjBvbWvoritqKiwwsnJzMG2vcC1t7+5yLXDtbOxtbG9t7m9ta25tr+tobOnq6uwtbi1q5+9vKmzwbS8oK+ztaqrn62wo5ylqKqjnpuksKawoJ+rqaihqZykqKGtu6iusK6gq6Okrp6fraaXn5uho5ygnJqkqqObm6WllpeVn6KWm5emrIyekZGRi4KKgICOgHuZlIyIe36LhY6Ni4qDkpiRhpOiiZKSh5CZj5OAiHx5bH52eXhje3txcHByd2iAc2qDZ2VnYG1zjWxhaW9gb0BbeGtVXk9RUUpKTVRZV01dXmxXRFhgT15QSE1ERjs3SEVLTzxyaEtLOUFFOzs9PTs7PUo0OUI8MztHPDQ/MTgtNzg7MigwOS8sNC8uPS0qSz4qHTQ5JicuMzQuMCsvNCYsOiQ0MUJoWTEzUz1lX0RMNktWZE8qOzJOWD0jk5msmaCYp6Sjn6ekuLCvpK+wqqu4wrqzrZ+4r6uotLrIy8i/t8K+sLS9t8S2w7GuubGzwLS6vbepubi9q6S0qKmqsK65saqbu72ksMG1tqGutrWmp6exs6CepKanoaWZn6yoqZ6gqq+noKaYo6mgsbmfo7GuoKuhrKScpqepmpqbn6OVnZ2bnqmml5ygqJKZlJiek5mWoaqRmoiOj4Z9h3+Cjn18oIyMiHiCi4SJi4uFh5Kaj4iVnoiRlYKMl4yRfIV7c3B9cXR0YHl4aW5wcG5ofXFje21pZWNfZYV+X1pza3JMTH5oWFpOUExKSFBSUElOXF9uU0RXWlJoT0hLRUY1NkhCTEk1WmVKQDZFQjk6Pj0+OjpDNTk+OjNARjwyQDIzLzo7ODMmMjwwLDg1QiopLUMqLDQ7Tk5AOzczLS4rLTcqKjwlNTM9ZmQyNE0/ZV1GTz1SWmdIKj4wWFY1KJedppmdlqygoKGkorirsqW0tKqpucS1s62ft62urbC1xsjBt7/CubG0vLa/u76vq72vtL+wvMK4qbu6t6eotamoq7Cts7Cnmr63pa28t7KfsLewqKWnr7GboaSgpKShl5uvpqGeo6ivoaChk6Skorewoaaxqp6so6+YnKqlqZ6Ymp6lk5udm56nq5qdnaWWlpiUnY6Tl6KoopCIi4+FeoR+hIt6jpeKjYZ4gYeDiIuNhY2TmI2OlpiKj5d+hpeLj3mBenByd29vdF95d2RsbGtpaIJtZXJra2VoWmJzf15abHZpWkh9XVtYT09KSEhSVUYyOl9ebFBDV1ZZZUxISkVFMDdGP0tCNklKSDs2Rjk0OT49PDk4QDg7ODo3QEk+ODw0LTM8PDc1KDU+MSw7QTEoKzY8IzhSPSoxMTM+RDUsLSc0Mis7KzEzOWNsODRHQmdbSFRDVF1oRS47MV9ULDKWo6GXlZ2pnqaho6G4qq+hu7mmrL3Es6+uorWvra2vtMTEvbO/urexs7m4uri6rq2/s7S4r7/BuKy9urSmorOrqKqzq66yo5zBtqWpt7ernrK7qaalqK+rmaKnnKWmlJihsqWZnqSqqZyhoJSln6S5qKSnraaepaGok5+poqGhmZudoJKbnZegoqucm5mhlZOVlpuOk5Ojp6SPiIqOhnmEfIWFfJyNiYqGeICDh4eHkYWVk5KMkJWTjY6Ue4KXjop3fntsdXJtbHNieXVoZ2lnZW6EZ2doZGZoal9mYmlmWmV6Y2BSc1RbW1NMSUdJT1NAIStqXmpMQ1ZVXmBLSEdFQy46QjxGPDZLUEQ4OkQzNTc9PTg5NT86OzQ+OEBMPT45Myk4Pjw6OSo2QDMuRTQoKyw+MC1OPy4rLTctMTE5NSwmLjUtODA1NzZgdEIzQ0RoW0tXR1VgaEIzNzhiTScynqSjko6lppyenp6kta2oqrq3qKzDwLevrKG1rqevr7fBwL2ywbexrrK2tbi3tayqvLOvsrG9wLeuvLyxpZ+2rKamtKmrrqGgw6ypp7G0rKy0up2oqquxpZieqp6opZGZpq2imZ2kqqGbop2XoJ2ntqawqq6goZ2doZWgpp+ioJmbmpySmp6Vpp6topiXnpWUjpWYjI+YmqegkIeKioh4hXeCgoKch4uCiXt+hIiGhJCElpWPj5CRkJGNk3uDlY2Gcn59Z3lwa2psZ3Vza2JnZGN0f2FkZWZlaWpjaG9ZXlhdbGRhTWhXW2BWSUdIS0xSWD45YGxpR0JVU11bSUhGRUEuPD85QTg5UkZANzpCMDM3PTc2OTI6PDk3OjlETT1CPDAqPEA7QTwtNUIzNz0rKywwQSpKSy4vKiszNzIyKDU3JCs3LjcyNzg1XHlOMj5IaVpMWkpWYmZBOjNAZUclNZukoJGMrqCamKCXpbSyo7K+t6Gxxbu5sLGitqurr6m5vr28rcCyr66utq+zuLKnq7mxrq60tru2sLi9raaetaugobGlq6+fpcShs6Wvsq+3rbWdra+srqKZnaeqpZ+Vm6imoJmko6mcmp+clZydrbCmuqitoqGamp6Zn6SapZ2WnpiblJqhkqiWramblJ2ck4yVmY6UlJinp42NiomOe4J0goGKmIWHfImIhISKjIiShZOck5KPkJGWjpB/gI2Ng2+Bf2Z5bmhramdxcmtcaGNicn9gZGdqbWxnamdkbFxsbXZxYVRiaGNlWklGTE1PWFFQVWFlgVRAVlNZVUZHRkVALzw9Nz82PEZOYTg6PzI0OUAzNzgyOD83PTg+RkpARDkyLT1BPUE9MDVAOUAxLSsuMzw7SzYvLissLTI0OzYjMyopNi41NTQ2NVp8XTE6S2pbTVtLWGRkQEExSWRDJzSTopuPj7Gdm5ShmqmysJ+5wLagtMG7vbmxpbavqa6lt7m4ua27r62qq7eqtLmtpbK1sa6psbe2sbO1uqipn7apnp+qoqqtnKrCma+lr7G2taysnrGtr6qim52krKiclZynpJ2ZqaOllZqgnZGco6uqqbufpqSgmJqanqKPa6KVmJxxg5acpIB2kauonpaWoZGJl5mAl4qfj3iFk42DbWl+d4NwbIaKhn2EioZvXWRgZ4SXhmuLkJSSdXeLhH+DkH9miIBodmlmWF1pdG5OUGpkZnGCZl5kZm5saV5dXomQhYhoT0tEOEVUZ15KSFBQVVVLSFNgb3RlRVtRVVBGR0ZDPjE7PTY9NjwzZlw1Ojw3NTtENDg2MDpCNz86PkZMQ0IzNDM9QEBAPTI4QEU9MSwsMDg+RzcwMS4qLiovNjY4LCMxJzIxNDoyNzZYgWwxNU9rW05cS1tmYj5HMU9iPCsvjaSZh5Wxm52ToJyqraujvcWvqbfCuL29rae2sKarpLi0s7Sxua2qp6y0prC1oqe4trWop6y2s660rbOiqZ+0q56ipJynqJquvZWop7C0uK2tpKiuqqumop+coainnJehpqacm6ennZKeoJmQnqiqo7Wwo6KjnJaYmJikiaGPkpqHoYiUnqF/pX+nrJ6Uk52TiINyeI2Og4egdYiNaZeIZn1zeKBviIeDfox8f6Ggn5l/e4eedIiOdpuKbIiCg21pZWR7bXJiVIZtY21pmHFYanBuhldeaVtraluIcG15codph4RaXkZOPkZeTUVSVlZRUFJXVGdeTFlLUlJQRUdHPjw0OT05PDc7MDw8Nzk5OjY9RjU4NjA8Qjs8OT1GUUc9LjU8O0A9QD41OUdBODIqLzE8STkvMDEuKi8oLTQ1ODMlJjIxMTU+MTw4WIN0MTVSa1tOXExcZ189SzFVYDcvKIyml4SdrJ2ZmZ2fq6qoqr/Dr7K5vLfAv6qkt7GqrKazta6vs7arqaWxraW1s5ustba0paeos7Gtsqivn6qhs6mgpKSaoqSdsLeVpaantr2mrKepqqynpqKgmaCopJmZpqOlmZylqZaTopyUk6OmpqC2pKOgo5iVk5iTnIiukJiUiamLmKSchrGApK2elJqflXmC1Kh/h5TAm8Z4d7Glt5dkgMCcv3mEhHmPg3yQkJHKcZa8nMV7cranupB7gWyWsauweWhsWLGub2VpvJK8bmh6bXGP2H5TamO2sn6AcZR1mqGqkFdPWGFPVk5GVFtYUVBTi1xXW1BAXEVRTkRGSTw8NTc9Ozo5Oi49Ozg3ODs5PkY2Ojc0PkA+Njk/RVJJOi41PjtCPD9BODpKPjUyKjIyQkUvLjMyLisvKS0vMTg2LSAvNDE2QTE9OleDdzExVGtcT1tNXmdcPkwxWlw0MSGOppOBp6qfl52dpa2yqbHCvbK1v7W4v8KrprStramor7Sqr7azqKemtqWnuK+csrK1qqWkp7KvrrGmqp6npLKkoqKfl5ygn7GulZ+joLS6oqmooa2upaKdm5qiqqCYm6ihn5idqKiRnKealJ6ip6OgsKOen6OWlpKYkpmFsGtqio2qfmeFloetZXGenZWap5ZxrqGkfne6fGuhj3axX2q0W6WAZZyRYGaBemZ/aXhqqWW+cmemjHaxanyxeHWSlGNtbaduXISgRWlnh5ZFdZxgfWZ7o6eCWV+Lq2mAknh6aqg4Sq9bV1RtY1tMT1hfXFdWO06IT1dWL0lUU0pDRUY9PzQ2Pzs4OjkwPTg5OTk6PTxEODs6Nj1BQDY8QEhRRzkwNzxBQz5ARDhARz0xMy0zM0UzLi41My8rLyguMC46Ni8nJDIwM0IvPTtVgnYyLVZqXE9ZTF9nWTpNNV5ZMzEbkqKVgqynpZ+jpKqxt620vb6wt8WyuLrCp6iwrK+pqbGvpLG6sKSkr7OjqbmpnrOysKOloKqtsKyvpqifo6KxnaSdmJWYm52vqJecop+0s6Grm6GtraCempego6qdmZ6koZyZoaekkJ2jm5ihn6yfpaagmp+hlZWRlpGahrWbtXiFqZm1mXeHs5u3f5OWl6uVfmuBpnqBhYaRlJJ3q2dqsVuse46HlHSIcI6GgX+IkJd4g4KLl4yDoI+FsHZ3n3Framx8i0+lWEhjY5l+Y2imYHlxdVKThl5QqW1jcX2GgGGdL1KibltUa2dgTEtcY1hcWkI+sHhXWEEjTWhGQ0RBQEExOT44OTo4NDs6OTw5OkE6RTo6OzY6Q0I4PT9LTkg6NTpBRkJBQUQ8RkQ7MDIwMjtGLDAuODQwLC4oLzIsPjgzMR8vMi1EMTw8U31uMytYalxPWE1fZlc3SjhhVTUwHJeglIizpqairqmos6yqu7bCsLzCrbi3waqsra+up66zqqKvvKqhp7Wto6u1pKWys6ijoZ2nqrKosKimnqCgsJagmpaWl5qgr6ObmqSota6hqY+pp6manZaYoKWpm5+do5+coKKlo5WbnpiZnaKqm6WanJqioJaTkZOTnYTVk5m5cbDCf8aGfNaUnLt8m5amkI2cjKR6jYaigaWCeqx5j51Wr3uJfp9quVq5d4aDfaaCk3yYeqp5jp2Qe7FujoR0kLuFbpVQr6fFilGgemNgqmJzcoZsl4dfU7W0yIWAiXxjpDNCnXVdUGpoZFBAWGZaZGFKSE1rSlpTT1lmWkNDP0U/MDw8NTk7NzQ8Ozg9OjxDOkY6Oz42OkBDOzZAT0xIPDo8REhDQkNEPEVGODEyMTFEQi4vMDQ4MystKS4zMjM5NzEjJTUqPjM9PVF3ajYqWWlbS1xQX2ZUN0c6YVA3MiWcopOZsaiopbOqpbSnpLy3wbG6wLK2tLyztqeysaOxs6agr7Wom6i6rqKvsaCytLGhpJ6eqKmwqbSppZyenqyXmZmXl5aYoqyem5eprbCoo5+OrKKnlp2YnKGmopiioaOhmqKip5ueoJ6VmZqloJynlZubn6CYkJKVkJ2Ism5otXGriHCOpnK0dHO2e5uYpI2PnI2ifo+fpH6wdYOR0tF1W658hX+kb5uqpmuGhX2tfZeZj3uxc5Odj3izZZZ0hZ5unmaUUsmLWsJcn3liX61fdnOGYpeIXlnKnW+/gHVNS7VTVcZkVFFqY2ZYQU9qX2xpUFVGSTg9V1JbVllJQz9KPDI/OzU9PDU2Pjs3Pjw9QztHOTtANzs+RDsuQ1JKRz4/PElKRkNFRT5JSToxNzQ2QD4vLjI0MjUyLSkuMjYsNzQyJh82MDs1Oj1Qcmg5J1dpXEJOVF9lUDVHPWFNNjIuop2Rpa+spKq7rKa1pae2u7yyu7+4t7W7u7SmtbSisrKjoKyvpJimuq6ksbCctLiqoKWdoaqlsqisqqWanZupn5aVmJmSk6OqoZeTp6uwpaKWkqyfpZKUoZykp6CVm6enopqjn62aoJ6ekJWboZ2cpZWdlZminpWZlpKbhax7d6h2o4+Lh6lvrYqDp4SamaKKkpmLon6Sl4euhX+Cs1xys1KufYKCpH9x1313hH6PnYaZmnevhoqRnIh3tGGaZZqCgZVskluwV0uadZh5ZmCtXnZ3h2eYiGpdr3eVn494bDV5yK6yX0JUb11nYEVQbGBxbVZVTS5lYmhTWVA7QkRATDo1PzkxPjwxNj85OEA9OkM6Rzs8Pzo+PkU5LUVVSkVAQzpNS0pCSEc+R0s5Nzw0Njo+LzA0MzMzLjIuLjE4Ki4zMiUhMDM3Njc9UGtlPiZWZ1xAPVZfY042R0NgSTo3N6CdlKC4sJizwayosqeqsrq4tLm+ubiztr22pri0oLWtoKCpq5+Vp7asqLCxq620pJupn6CoorWnpqqkmZ6VpaKUlJyakpajppuUkKetr6WhlZipn6KPkaKaqaahlZqmqZ6dpJ6snaCdoI2UnpueoZiZnJaXoaCUmJGmnYapfX2leaGPkIOqcK2MgaaGlqCiipeXiKOBkIeUqnt/i515b7FaqIOCiKB5dNh/dod0p4GOm42SpHyWkJ+Ee7JenGSgfYKUbZNcq1xbk3+Rf2hnqmNye4BqmIZxXataiaCPa25lT0pDoVxaTXRdYmZNWmFfcnRfSlU1SpqSWEhFPUhGQU0zNUE4Ljs+MDVBNzhAPDY9PEY/Ojw2Pz1CNy5IVkpFQEg2S0lOQElLQEVOOjpANC47PjAwMjE1NCsqMDUvNywmMjEoJCQ2NjcxPFBlZUEmVWZbPzFVX2JMN0ZJX0MxPTeinJqav6yYtMKuq62oprSwuLG2v7m6s7G4vaq7taCxpZ+mp6eek6qxqa+qta2qr6GYoaCmpKS6oqOsoZebkaOglZWfm5WZoKCQjoypsK+mnZeaqKafjZKkmKirqJWYqaifn6CjraOgnaGNlKCYn6CSnJeclZ2hlZaPq5uPrm5ytHSpjHeKpnO0eXS0gZOlo5KcjImkh451uG+Me4uia2u2WqGGZZeXaaCip22UcrR0k5h/smqGkoita3WzYZ1mom6GkmuXXK1gTqF8h5FSc6NseX9+bpiGcFyvVjycd2ZUb24uW6dPYlJrZWJsWmJcYHB8Y1NZUT4+bW8yQkJAP006ITdANi47QDM3QzU4Pz8zOzxDREJKRk1JRjYySlRLRUJKNklKUD9IT0NGUD08RTUwOzswMTAvNzUsKywzMjYvIzAwLCwdMjg5LzlOYGVEJ1VkWT4vVV9hTDVGTV45MUE4pZqbnbuinLLArq2rq6e3qbivtcG1vbGvurmswbaqq6Gdp6SinZKrqqe1o7Korqqhl5yooKWruZ2jrZyWmZClo5aOnqGcmZ6fkZOVq7avp5mUm6ypl4yUppqlraOSl6uypKCeqKuwmaGij5ihl6CblpuXoZOcqZ2UkKqZh9OTmrt0scSAw4Z91ZabuHmJkpmMl4mMp4d5orZ1fXd2woKasmCDunnAfHW4YrWBjIepfZaBrKlxe391vIinoGmdYaaOr6J+jHSHq32+bnO8dLKDdXiAim2aiHFtjaR0vV13fVthebxqWlZbaXleaWFkZmJteW9ZW1lDQUByP0NGKzVIIic7PzEwPD83OkI5OT1DNDxATlpeYGBfX19aUFBSS0VGSjRITFJASk5FRk9CPEU4ND05MDIwLjg3LSouLzE4MCItMSwzHiw8OjA4TFhhRidUY1g8L1ReYEs1O0xbLTZAOaaZnqK8opexwrCtqaqssae4r7fFsbuyrrywrsGyrKWjn6ShnJuQqqSqsqS1p62kn5aaqpmmrLmdo66ZlaGQpqCTjZyjnpiempCWk6+5sKuVl6Onp5SQlqWdpK2ekaCoq6Cbn6mksp6ipI2moZShmpuXlqSYj7CgkpWpn4WQmbWAkZGNuJV4gpObtXdubG9zbnmPhI6Jc57Bu7yZeoGyqHCAdJG5g3yGhouHjXuKho2XfKS7ub2cdXmzo3R2l3V0sHWYnmaGaY22dHJxd7aMXn95fYhng3lteWKLrHB0hX9YW6dqRGRZVGZfY11jUWdncW11Qk1QTUQ7Wkw/SjM8MCA4PjsuMz1BOTk/PTs8QzZCVFlaWltbWlteYGJgXVNHR0g0RElUQktOR0VPRj9HPDc+NzA3MC85Oi4sLy0qOC8lJjIoNCQoPjcvN0tUX0cnU2FXOCpPXV09KztWVic9OjymnaChv6aWs8K0q6qorKupu66xxq+1tK64p7W5ramjo6efoJ2Yk6ykraqmtaion5uWoKOerKW+p6GqmJWckaKbko+hqKGTnpeSmJSytbasmJ2kpKKLkpKmnKWrnJappaacmaCop6ajqKCRrJ6Xo56Xlpidno+wqZOcp6KOan5pnKd4iXN+m451emWHe76/wLpukoJxlYVfcmpaXZqJYWSHjpVrYH+VY22cdmKUa4CalZRlXl9jcZuJaHKMfIaUZmp+cXR5fn1iW3h0gWhQXG6DfHuKalhseYFySUpvhXBOc01FV1xmYUxbV2ZjXk9abXZqclJPREVNPEhJPE0/MiwyQT84LzU/Qzw5O0A7PUM+UlZWV1laW1tcXWBhYWFgXFVHNURGVUVKT0hGUElJSDs4PTUxOi4xOzouLy03Nj01JiIvKjIsJTs4LTdJUl9JJ1NfVjQpUF5MKDM+W08nPzI+qJ+oocGkmrS6tqOspq6nqLWyrMissLOstqS+srOmoKSqnaObmZmsp66kpbWqpJuYlaKbpq2pv6ipppaUm5agmpOYpamnkZ6Qj5icsLK+rJunnaeiiZORqpuopJubrKCkmpqip6yin6mhma+alaaflpSdn52XsaWZoqiZnJGenKOkmaejmp2ampqQloJobn1xdpGXlJGDibSpjYWYlY6KjJiWh5OVioOTk5CIjZGUmZOZl5qgoZqblJ+bjYJ6pIVsaXuQfYB1iYuCcoJ4eXZ2ioB7iWpzgXSDdWR3fXZrcHptYGNbb2dMWFllal9XWXB6b25mU09GUjlPWk5STygrO0pCNjM1PUBBOTpDPjxFTlNTVFZXWFpaXF1gYmJhX15eW1RLQ1NHS05ER1BMT0k8Ojs0ODksMjs4MjApNklSTzgiKSsvMiM0Oyo3Rk9bSidSXlQxMFReOis9OF1LLDwtQLKgs6G/oqSxsbegqaazp6WwtarJq62yprWmwKi0oZ6lppyllZWgq6eso6O3rKCZlpagl62qpsGfrKSWkpyXnpiUlKKenqOokpCZqKeyw6+aq52qno+Xlqmeq5ydoK2YoZucoqWvpqGkp56smJemnZmaoZ6enLChnaKnlZiTmZSgopajn5ihjpaUi4qNj5etj3uVm4KRgImpqIWAmJaKhI6fiHuDkIaFmpGHhomVjpuXjpCYnqOWmZKQnI1+jWWhs66EiYR3e5CKfXd5em9neZCBgIlrdYF5iHJpc395dYOHgmt0Y3hmX2hkY2Rmalhre3Bqa1xTTFBEX1VGQD8+LDRARjs0NTs+QTs8Pz4+SE5OT1BTVFZWWFpcX2FjYV9dXV1eXVhWSktMQklPTVJKOzw6Nzg2LzM5NjQuKCYkLTEuLikrKjclKzwoNkNNTEQvVFxRMDVNWzE3RTRcRzU8LEC0oLmvvqyrrbGyoKqmsq2irLOwxrCrraSzr7yktJygp6KhnZmXqKappqSls7WelZSemZmvpq6+oKyjkZGempmUkpahnJepnYWdqayitMezn6mkqpaWmJqnnqmcoKSrlJ6fnqCqrqimo6uhrJufoKCYpJ6cn5ywpJmfqJOYl52SpZqYqZ+bl2aDknxlfo+aj2N4jGxoanqQo6trZJmXfmeFimVlaWh6jaGOa2iMl5Gid2tqi5iin5hzbG56hIyGeVhlXYWCXmyLioJ2W2hzd3eRgIeCbniCeH9zbXmEc3eIiI6De2mFWF1qc2Rdc4hpa3xxbWNdUU5XSWRYQEozPUY3P0ZENzE8PT9BQzs7REdISElMTk9SUlRXW15gYWFgXV1dXV5fXVpVT0RIT0tTTj0+PT02NTM1NTU0KiYmJSwqJS4rKyc2KiQ7Jy9BSVtJLjZaTzYpRVkvRE8xWUI7Py49pZ+6vLmvq7Owq6Wora6wp66tsL2xqqilrbCwn62YoKSeopqap6ycrKOmqKmzrp6Vo5Cir6a2uaWuo4+OmqGZk5KboJiZppZ7payiqLPDt6Wip6+fnpWeo5+knKSqqJKeoZ6gqq+qqqOqn6ebpp+noKyWoZylsaSXnKuWoZ6bk6WXnquZnn6+g4hytHKFnoWtaHe5xLhxkqGje6aYmHOqgnzLwMC7cYqjh4KefJaYiJ7AvYKWnZ2NnMHAe4F6kYyawr99a6Wyb4yBb8p6f5t3kYOOgHZ5gX95cXuAhnB4hYyTeWx2kWJlXnhkX2WBYl50aG1kYlhMVklRWkhPRDJJRT9EQj4vPD8+QEE6OERDQkNFSElLTU5QU1ZZXl9fYV9eXl5eX19fXVxTTVBHVU5BQD89NjQ2ODI2NiomJSMpKiYuKyopMTAfOSojPkhbTCojQ1AvI0ZbM1BZL1VBQjsvOJajuMO0sK+/qamUo6+psK+tprK1r6qmp6Wxq5+rmJuioJybqqeinauipamlpLSknaOTpq6suLSnr6KSkZmdpZKRoKGXm6Cdh6aqpKutv7+xoamuqZeSn56imaKkqqOToKGenayuqKymo6KloKSlnK2okaSbqa2qnJ6qna2ilpellqGjmJ1/zpR5eqWBepaWm1+tj12OqICgoXynlZp0q4OAr15kjKl6qIeFn3SXkoizY4KrhqCNjbNqhK50fJaHuGGCrVmjzW6QdXvbe3+ZcX6IknV/ZXuIdnZsfYdufYWQkX5sgY1fcGpvZmBfeGRccWhqY2ZgUlRTV15KT0M1QUhFRDg+NjtAP0E7PThAPj8/QkRERklKTE5QUk9TXF5fX15dXV9gYF9fXVpXT1VKPT8+PDU1NzgxNjQoJyQhJywmJi8oJiszHTYwJDc7U0wrLC1KMCc7XDpMLSFQQEY0LjGtwsDAtbSwt5iekaOqqa20q6ayra2spKymsKqgp5uappicoq+foZ+op6OmoZ+wrJuelqaurbCrqKyglJKbn6WTj56ll52oo56upKuwqL/Gs6ipsa6Wkp6copehqqqflaGenZytrqeqqJumpaOhqpKss5aloqqqnqSopqGxopOap5qgmpSUkZegcIWMmHWEqIdxsHydcqx9oJ+BpY+ed6uCfa1/nHKtfquHhp92mJJ7fJd+qoihjJGLnH6re4iSjqCAeq1WnMR6j2+SwX2BlW11cIxtZndlhm9hd25yboiKkY+DbZCOZG5zdW9gZm1kX29oam5mY1dTXGBaUlJDOUlJQEM8PjxARkRDRUE9PDw8PkBAQUJFRkdFQENJU1dZWlxdXl5cXl9hX15eXVtaUkM+OzkyNDc4NDUyJiMfHCAxJyAxJx8nNB41LSY3PVdKLTwoPTEpM1ZARiEcRztDMS0rr9TGx7K0n52jjqOioq2utq+psaepq6iuq6umoqOdmqOWn6arn6KmoKioop+esKyYm5eoqK+sqKepnpeVmqSikpShrZudp6OurKOstam5zbKtpq6slpWcnaKZn66snZahmZ6eqbCoqaiaqqijoqubr7GiqKyvppqnrKqqsqOTl6OlmpSRhKRqpHWJeql1erJxgqWJmIxwh5+ah6RfYFKrhH+ugpt1roKnhoafepmXhXtmgKOJpJmGgaN9qX+BlIauXnyoVZ2ikoF6o5+Ae8OvxYxzr7SzuXFiqa/CdWiMjJeOgWyZkW5teHd3bmtmZGRxcGZ7aWNdVl9pWFhUTExRTENDQUI7Q0FAQkk8PTo5Ojw9Pj4/QT04NjtETFBSVFZYW15eXVxeYGFgX15dXF1bU0lCNjc5OTY2NCwmJCIgKCciKy0iJC4hMy0mQERXSCxHKzU2KjFQS0wjIEE5RDQsJ8LJ1dbAoZmrqKGvop+wtbCvqq2jqKeqq6uppKagm6WfnaanpqSdrJqiq6Gkn6+inpuTqqS2sK6gqZudl5WnpJGboaifoKacsKajqLGstsiytamsqpWRnJ2imaCltJ2aoZScn6aqq6KtmaunoaGqorOtoqqzsqKcq6mvr7eklJajp5ibknyqbJ6Eh3WreXywboKki4iflpWelYHSt7S4yYCBsl5flKmDpIeHoHqYlZl4qslzmaOUqKmQk5qMfpqJmsbGd2WhgqVzgZ+Ogn2vXm+1Y7F1S6OGbadHgpNkjo+ckntwlpF9b3p0fHptW2VqcnFmgWleYVhjbVxeWUlMTEtFREJCPUE8Qj9KOzc5Nzk5Ojs7OzMuNjxBRklMTU9RU1daW1tbXV5fXl9fXlxcXFxcWE1CNzU3ODUvKSglJiUkJiksNUZOUFBNRkxKVkYqTDAvPi00TlRRHRw7PEYyLCSopMHGua2ps66spaKdsrmsqqGmm6imq6yppqCmpZiqo5+urJ2moayan6mlnae1oKOYk6irtrKsm6acoJaRpq2RmZyno6Cqpq6ho6epsLTCsbKqraiUiZidpZuipK6ll6GVmZylpaqarpyspqWerKO3rKCyubCenK+ns7S0ppWYqKSboI6CnU54moF/n3qEo3yCpISGpp6cnpSEuHt8ebmCf8zGw7Z3m6GQi59+mpaXiXafl4qkmKSofrCFnISehKx9mZRhpWyjcI+FkIF9l4RyrGCkcnGAmmC8fVJVdY6Ro5Z7fJKPiHN6coR9cFxsbndyaoFuWmNfaG5iZF1MTFFTQUhHRkk5OUs+QjEwODg1Njg3Ny0qNT09P0JER0lMTlBUV1lZWltcX19eXV9fXFpaWllVU09IQDc3Mi4sKi4rKicmP1FUVldXV1lYWFdVT1RGPEUyOlBbVBwbNj9HLC0gjIeZqaykq7mrr6CboayztKafoZWmr66uqaadpqaao6ehsq6iqaeyoJmopJSitaOklpeiqrW5pJyjnaOTkKKxmZ6cpqWhoq+tnaSoorWxw7Gtqq2qkYeRnKedo6ScpZeemJmZpaOoma2hrKSlmK+lu6yht7eunp61srmytKiZnrCipJ6Gj9G1w7d5h46FkZOPgKZ4lKJ3i6CShaWCi3GrhoW0bnJpmaOclYmffJeZhoeQc66CpZuijaaLk5yIlJCabXCyXKVzk3qcbJl/e5l+bqlhonFxf59ic7K4aHePk6SYfYqLkYp3fHiNgWxod2l4c25/dFxkZG1tZWhgSlpXWDxIRj9UM0BGPjwqKDYzLjAxMykmNDo7PD0+QENFSUtOUFJUVldXWV1fX15eYGBdWlpaWFVSUlFGOjIyMzAvKysoQFFSVFVUU1RWV1dYWFdVVVZUUU9RW1UlITJBSCMpJZJyjYquv7+8u7Wel6ikrbahopmVo6mnrqmrmaWhn6WhoLWnoqmnsKOUq6OOpK2kn5Camqq0tKSdppypkpSXrqCgnqaknKectZqgqqO1q8KvqaupooyEj5yioKajlZmanJibmKajppiqpqyhpJutpr2slb6wrZ+jsLO6rLWonKmypamYeqeRfXywd4qApKWInG2yb6CHrXuhj4OolZqArImFroWglKihopeFn4CZlYB7kn6rgJ2aloureJ2gj4iTkn95r12jgXymp2SegHyXdGuuXaVrcYWZXWBbjKBtlJClmIGTjJWKeXmBln5qbH1ifXRtf3lfZmVwbmdnaEJZX1s9SlMyVDhCQkM3JCQzKycnMywgLzY2NzQzNjpAQ0ZJS01OUVNTU1ZaXV9hYGFhYV5dW1pXU1BPTkk3MDUyLiosQVRWVlZUVFVVVVVUVFVUU1NWV1dYVlZVUUhGSUojKCi8kpqEqcbDtsG0n5qtoK64paOOm6SjoK+uqZ+jnp2tmJ65oKKroK+qmq2gkKqppZaJmpCusKymoKibrZiZj62ioZ2loZmknK2Yn6iltqi/rqSpo5+MgI6bm5+mnpKUmZqUmZmko6OZp6qroqOeqai+pJfDrKujoqyzuqyvqKK0sKqrmXavfpCKnIWHfLqtiZhksIxlla19oY+Dp5abga2KhLCFppmkoaKQhKBbbGqBs2B/rXt7goCybGdumZeLiLFbfbRbpINryKJln4F7vFl2tVqyfVKvgHqsWIChbZeOp5qJlo+UlXp4jZt8Y3N8YYN4c398YGlmcG1mZWVPVWNcQVRePUgoPjk9NCEhLSQfMi4gKjEvMDQ1Nzk6PEFDRkhKTE5QUFJUV1peYGBgYWJeX1xbWFVQTkpHQzU1My4vQFVZWFdYV1hYV1dYV1ZXV1dXWFdXWFlaWltcWFdXR0I70p+zsbe9u7TBs6Ocraaltqmgi5mgn52zsaieop+dtJigs6iqq56wrZ6rmpSuqKKOiJuOr6ypp6Ooma+Tmo+pmqGepZ6Zo6KlmZ+jqbKovK+lqJ6djnyLmpahoJmQkZqbkZiWqJ6gmKespqSkoqSpu56gxqelqaKrtLatr6igva+urpeBqZKjro6bgIakl5iQgYC4w7qDjp2ThKeYnYKsioKviaabmqWqkX7VvcKqYqO/vXx+o4KD17q3tYWTkoKevb6EaqOBb6uEbp1/erKxx4Nrq7C9rHh3or67dICVjaWbjpmPlZt4gJCZeWJ8emOMZ3iBe2BrZWtqYlBiW1NpXEBUYEJMKTw6NS8fHyQeJTIgHSQoMDQ5NjY3ODs+QURGR0pLTU5OUVRXXWFcX19hXmBbXFlUUU1IQz48QT81PVNZWVhZWVpZWlpZWFdXWFlaWllZWFlbW11dXFpWWFRXWruVtLSxv7qyvbOina6mpbOmnYyYpb+ptrCnob+mprGbnrGcuaifra6lp5STr6yXjIOaka6mo6yipZyqoJiLo5OmnqebmqCoopmeoKysqbitp6Oal5N7h5mSppuTj5GYmI+Xk6iZn5eoqJ+ppqGiq7ueqcWjoK+jq7O1q7Gror2psLCbdHaqpLaFZYmfb2esj4qPbW93pJCaoIF1sJqWcJCNcpano5uYrqRybW1sZYp4bm2CmXGAemlwaWaJlpWYcWhphYZncIZkXYpjaW9ZXWd+eKZgYnKPkm9mZICNk46hl5aXj5ScfIaOlHRlhndnjGp4fnhkbGNmbGJLZFhKa1k6UGREUCdKOisjHCAaIiwpGBsYLTIuNTo0NTc6PD9BQkRFSEtMTU9RU1ZcV1pcYF9hXV1bVFBMSEQ9OkFCN01YWVpZWVpZWFhZWFdXVldZXV5eXVxcXF1eXV5dW1tVV16ola20qru6srOqqaKunqSzqpiSvbHDyL60qZ6/q6yjoKarn7qjpK2sraWNlq2qkIyFlZetn6Wqop+kpKCRi6WSp5mpmZajqqCWnKWmp6+5qquam5OSe4SXjqaXjpGQmJSNl5Smk56Xp6KasKadoqy5oLDCqKSzpqyxsquvram6pbC5l4uhqaW2nImWoZeGqZqQlJ2TqrOZm6OsobOXo6GeoaKcoKShlaumjJKTjIeSnJyUkJmTmJCOlYR/pJqXlY6Lk5KKj4aEfmeLgHSDdnSHjHGnbXyVkpSTgYGPj4+OnJOglJaUn4GGk4twZ452bol3dXx5aWtkZG9jVWBZQGlaR2JgTlgrRT0rJiE2NDAvHxwhJTIoKjc5OTQ2OTs+P0FCREZKS0tNUFBRV1VWWV5fYWNdXlRRSkVDPjk9QEFTWFtcWVdYWFhYWFlYWFpaW1xeX19gXl5eX19gYGBfWVlgpZapqaW2uK6uorClrZ+gtrGQjqrEu8W6t6mhpZ2bpZ2wqKO2p52ptaankZiso4uIiY+cp5aspKKaqJ6fk5Wjl6iaqZmUpqGkkJqnmaG0uaeqmJqQjHuBlIyhlIqUkZWQj5KXpI6emaiem7Wjnaast6ivwq6jt6avr7Ctqqu1u6KxvpqSpqSmtaKRnaaejamfjZKfo6ywm6GksqmwmaWhnaSrnp6dnJernJKZopuUkJaqmY2YmJaQlp6Rh6CdlZSFkoyQjZWLgX5mjYd1h3Z5iIR0nGqHkZWVkop9jJaSkpeSoJGalJ6DhpaFeHGUcniJfnF7fmluZF9waWBbX1ltYlBgZE9ZOUdGRT0yPD04LyomKykmHSY0MDY2NTg6PT0/QUFDSEpHSktMTVNTU1VaYGBpYGVWUEpBQ0I7OUVNVlteXltaXFtbW1xdXV9eXV5fYGFhYmFhYWBiYmJkYlxbY5iVpKejsbSsrqOpp62gqLWqkI+co7K7rqqroaKZepyisKSlsamWm7imo5SYqZyOhoqJm6KQrp+kl6igoZKXmZuui6qWj6iZqIyYqI6euLajpZibjYh5gZOMm5OKlZGUkI2RlqGLnZ2nnZ64o3+Dr7WisK90pL6jsqB4eqGss72Wd66loIqAqn5kW2F2n46knYOXfm6Ts5yjqK+ro2WfoJR0epqWcICYqJdsfqKoimWdpZuQl5iWi5KbkISdmpCUg5KHjo6SiYV3a5CIdodxfIaBgGFpiYuVk4xbdpWRZ2iPjXJ5opaXZXeXhoB2l2iCiYJueX5qcGVfdm9ra2hbZWNhYW9SWj1NTU5SRj1AVEI5MS8eHyY0OjMwNjY3ODw7PkBBQkZIQkdGSUtMVFVVWV1gaGdnWFFJPERHPDlWUltgYWJgXmBfYGFhX1xdX19fYWFiY2RhYmFhZWRjaGReXWaclqajobCxrKuppamto6etpZKWqrSusaWZqaaql3OLnK+fqKunk5a4n6CPnKSekH6IiJuejayapJWoop6Ol5GehXSuj4ilmqiRlqOIm7mzp6CZmYuJdXaTjZaTipORkJSMj5OfjZqepZibspaAjJu1nbSMko+9p6F+p6J6pLC5gY6Op5+Ei4WPsKmvjImWopl5gYushpydoqiqqIiVh5l3pZt6h5uBl6aCgXucsnqKhp+XmZSYloGQlpaEmZpjeYeQhI2PkouDbnGQiHqBcYCBhn+GdIeFlpJ4lmiTdKCadHyZgp2ahZh9kYmBgphpjIyEanh6cHBnZHhuaWxqW2RpaWVyW11IVExRQEU1LVlUVDYpITA5PT42NDM1Njg7Oj0+Pj9ESUBJRUpLR1JYWlhbYWFoZllRSDlESzw+YlZeYmRlZGBhYWBiYl9dYGFhYmJiY2ZnY2JhYGVkY2djYWFonZijn6aurquorKCosKenqqWZlK3GvK+glaWotJ2Pg5yrm6eioI2Qvp6ZjZ+aoZB8hY6Zl4isnaOWoaGSjpSJhoCRqI6Hopyjk5adhp65saedmpOPhXB1kImUkIqUj4+bi46RnpGVnqOVnayIn7SJtJqui8qIq6+Jt4WNsIOxr4SpjaeYjZ18qI9ye3ebjqaWaJWkebSLn56mqJOZwoJ/q4iYoXGegJqlfZeFlbGBoXygk5+PmJeAjpObiZiSi3yFk4aNlJOJg21zkoaAe3KGgYR9hXWGgpiBj8VmgKmHj6JqnYGel4CZgIqLg4iYb42ShGd3dHt2Z2h1cGdoa15ibmxma1hnR1xRTDJFNDZNYWM3JjQ8REdEOjYzNjU4Ozg+PTw+Qkw/TklKS0NQWl1cV2JeamxcUUU9S01ASmRYXWNnaGdiYmJiY2NgX2JhYmNjY2RpaWNiYmJlY2FmY2JiaZWXop+wqKmopaugpLmxqqunmpSfoqSqopWkqbair3+gppylnp2JlLyZk42gkZ2PeYOWlpGIq5mcm5qihY+Md5ucjqCRiJ6km5WYl4aiuKylmZuNjX9ibZCLk5CNj4yMl4uPkZ+Okp6gmaGofqGnh62doJaukKCenZGGgqCNrK+HpI2qmoyafqJ1gJiTa4GrdE2reIeNnZKbqKiCqqt+hKF7eqdpnn+SbGeXhpe1iJ59bWBjWIOXf4x7ZGeLc5l9eZZrXXyXbl9TcYVcYGx5g2BZZYJ+hIGYcaeqa4OjbnKlcJ+CnGdknmxabIh6ZVlfgn5hV1BvdmVtdHFqam5eam9sa2hXaE5dWEU5QDRHRF5rNCtJQ1FNTj04NDg1OTs2QDs7PkJPPlFSTE1CSltdX1deX2J2YE1FOk1PTVRiXFtmZ2lpYmJkYWRkYmFiYGJkY2FiaWtkYmRkZ2RiZ2VhY2iYlp2guaCqo6askaG2vKuvopmXn6GlrKufnK20oqeRoJ+fppuZjZi0mZCLnoyVi3WBlJGMiqaWlpifnn+ThYaso4eckYqYqZiZmpGHpbCmopWZiImAaW6Ih4uOjomLjJGLj5GhjJOdn5uipX+TgY+joZSgd5yWkKeDoqiAhqqthaV5i32Emn2icHKSh5Z7nox5bYebi5mRnKmbj4edfIKic3amZp5+d6RemHt9knOibpi3tLpzkoeBgLaoZIHGuHtwlbaMcYCbpGN0rKtgfWqds35ufYeDj4KLl3GAo2xzpHOegn2jXpyZs5Zve5ees3RyW56ygmlib3N1cWhuWGtscnJkXGhdYUtEPUQ1UUFacTI8UkZfSlM9PDM5NTo6NkQ7O0BJUD9UTU5RQEVfXltZWGBgfGRJQzhMV1VWYmFaZmZra2JiZWFkY2BhYmBkZF9gY2tuY2NkZGhkYmdmY2holJaVo7mZq5yToI6luLatrqCaopyjo6Srm5qxrKuSl6CYoKSZmpSeq5uLiJF4i4VwgJaNiY+hkJOUnZd9kYqOqKCHmI+KkqKTm5qMiqinpJ6PloeEfmt7hn59j42Di4+PiY6Tn4KWnKCdoJ+LiXecmKKNoHKii4ipiJynkZipq3+ujH16oJl5o5N4gHOXiIycfZafhpuOmZynh6NkoX2JlpCbjGyeaJqNbpqZen+Kp31yZ3Oqg52Cc6pnlJpdm4V2hJ1oqmqBuGZcqXCBnGGVjF6ndnaJioCdaJp1h5OSmI5/nm2ZkGqmmVyofne7an2pWo6EXbNnXG5xeHdraVtwanl4YV5kVmFBUEVPN1ZCUm40SlpZXk5aREAxNTE7OzdIPzpDR1U/WFJYXT5EYl1WYFFhY31qRUI5TlteWWRmWGZnbW1iYmVfYWFfX2BgZWNeYmRvcV9kZWVrZGNpaGdraZWciaq2m6iJY5WcrLqysKydppubp5+drJmdsKernZeimaGfmZaWoKOZhomNaYiAcXuXiIuWl4SSlZiPeoqElqOciZWQhoudkZybiI+oop+ajJGKgIBpgYZ5f5aMe4iNjoeOlZp/k6GeoKKTmHJon4qgj4xwkoyCqYiZoKSqoah9sK2koriXdqOzoqN/iJR4nXqqmn6ij56cmImYcqF9hY2wtX1rmpGheH6YtKOjq6iEmHuafJyafnOqWl1ve5eLeJ5iTH97e4VkephCTZ9ZompyfI5ugYqEmXWbeYeJsbN/fpqSpnR+nW1xfJRvmXJpo12VdkhlY2BzcH19bmZfa2h2e2JjX1BdVlxUVkBZRVFnRVJWXGFYX0lEPUI4QEE6SUU4TEVYQVZRWlZERmFcWmBLYG19ckVDPFVeYlplalZoaG1vYmZmXmFgXF1eYGhiX2VjdmxeZWdmbGRlbGhoa2mUnYGxrpmEU1+hp7S6s7OpmqKLm6mcnKeSoKujoKePnp2cmpmVmKGdloeHiXeFgW55lYWQmot9kZOWiHKAiZKgm3KSkIGImZSfmoSOqJuZlYuKinyDbISFcYGhjHiFjYiHkZeUfJKjoJ6jiK6GfbWEj56de6aWeqmClp6Ri6Kdfadod21+mXOgc3F8nYWYb5OCrn2jg6efm4GkcF6paHWjY2+lYZzTj3x6mXhyc2OihY9+onKijnVrj7OLYIKYinOqsqe8f3eDbX+/pqq0XpxvfnKXb4FzonJdo2d0pmBopmya05h6gptud3mXa5t5dpdybKmlZ19keXB/g2tnZmNudndmX2FRWmVQUWFIV0lUX1dTW2RqW2VRRkNLTEpLQkpEOFBAUE1YU1hPUlFgZWVpUmR4eXdKRkVjXWVaaGpTaWhqb2NqZmBjX1xdXV9oYmFoZXtkXmRnZGtkamxmaGxomJt/sKxUXEt+qa+ytbCzo5yYhJemoKCjjKSnn5eoiZmXmJOZk5Ggl42IhXtwfYRofY+Ck5qBd5GOjolwf4aPk5JsmJR8iZGSo5WDjqqak5KLhYl5g3aHgG6BnoZ3gJKFh5ihlnmToqOaoImzoaK2i3qsp6SupXCpgJuRhoGcknykgKKZhphxnoSira6Jl4uAjKSNloOuopR2tba1yaF0lIuCnmGdl6lteZWHn5p1oYd3oH2QloqBb0xmo5JwmohzpXt5dGKDgmx+oGxyZGCccn90l2p7abO1tMamc5h+ep1qm5qrdIKabXN3l2mZeXSYcVBEfbNeanVqeIdma2didHRwbVZdU1hnT1JoSVVMWFJWXWdrblZnV01KQUpNSkhKTkFRSlBkY2ltZXRyc354e251iXt7VFFObF5oW2tpUmpoaWxnbWZjZV9cXFxfaWJkaGt7X11kZ2NqZm5tZWlsZaKcia+nhWY/lKGyrK+vtaKij3+Wp6Kho4ukppybpYGal5aNl5CPm5KNiIN5anmGZYOMfpafeXWPiIyBaYSFkoOMhZ2NeoyKlaWSgpepl4yRi4CJeX98i3lwj6CGeYGUhoiWn5R/lKWnnJaWhGdueJxsomR8caV4nJhwaKeCmIx8pXqgloOWcp92gImUlY+5bpCKomJ9maKWiW5yaaprdaBtb6Zgm2mLkGmWh5qVdaKAfZpfi4WMdW+IYmihZZ5/aZt1cGRniIJuc6JaX1tkoW5diYxve39zcmSlbniiZGanaJhyi5huoW9SiI9uoF5kp1SLXVSYbW1yanGBbXBoa3hza29RWFZVZVlTbUlYT1xIWGloc2pZa1ZRUkVWXExYUmFVaGped3V6fHB8fHKCe39zdo2Ag3ZeUXNhZ2JwZ1BqaGhrbG9oZGdfXV1dYGpiaml2dV1cY2hjamlybGZrbWOdpZmmemV0bYunrqWqsbGmn4t/lqqcnaSLoaGZoaGAlZiTjZqPi5eQjYp7hnGAiGiLinyXmnN0iX2Qe2WDh5WKiZaZgnyIhpamkIGiq5CFkIqBin1/f45zaY+lhH2Fk4yHmJ+Nh5Kqpp6JpniWnH6liZaMspmekYOvl5+leZeIeal0pY+Emm6looyShIyDvG59pa+ChoaHlJedoH2menGolKCWZ55+b6xjloqVkneobKmigYl2h4J3q5GmiGuRsGt2s4ypbIuGbm6fnpGVYn+ri6p3gH+Np593n32FpJWdoGmah3WrZp6tjLZzdr6MpJNZg6aNq2F1cXNve3RxYmp+bmhsU1ZaVWBgXGpMXFJdSV5sbXZgW3FZW2BaZ3Nlbm9xY3F0YHd6fnlyeYNyg36Be3uMgYKAdmJ4ZGNuc2RSbGdob21yaWZpYV9eXGFqYmxsem9cXGJpYW1pd21nbG5ilaaqnYGAnqSWqqqeqKeuo5mIgZaqmZ2jiZqknKidhIuaj4WckYWSjYuNdIV6iINvjYR9l5NzdYZykYNtf4uShoaUj317goWXpY1/paWNgI2JhJR1goeSb2yLqICCi5ONiJyeiYyTqqOgkIB0lJeIfoF5lK+kf4KccY+GeZKMhIB7cqeMcX19epeWm4SNeHt+foiUlZOKd5GZoKGEe32Ja4yFW3l5c3lwaW5+kolxf3SBj5STcYWDgmWNf1+BgIx4dnSUdW97b26JboSGX3dpeI5mgoKGjqqcfnR9l2qJiG9/dXyEdW1sZoxzd3uXd4Rbalh5j2hud3Fwb3d4b11shm1pZ1ZaX1dcZGtkVWFVXlFfcHd5a2p3ZWpqanV8cHF0c2FvdWJze4F4dXqBdX+Af4F5i4WCfXttf2xkeW5eV25naHVreGppaWRcYFpjaWVscHVuWltia2Rra3ltaGxvYY6Vuqmni6Gim6akmaSdq6Kgg4OWqpGdoIiZppqomIOBm4t+lpSHjoqIjXKCfI99fo+EepeOdHKEcJWFe32Si4aGkIV4foCGmKOMe6ehi4WPj4SVgoaOl3dxhKqFjZGcj4eenoeLmqigoKuDiY6Vm39+ipetqJCTp5B4cZ6Tg3uTb36phXB9lXFqb3yBn4t/ko6MaG1dg4yMnJyfjnOVi4hxdGuCdnSAWXJuhpCBfX6LaV1pY3qFg4iAX2l4e5x8g42DdoGHg2l5jIhrYnFzg3dfco2CiZCnlYZmjY+DbneLg2+EjHhuZGZjeYJ6lVpcaWZudlt6eHd0bXNygmZcbYpra2JaWV1ZWGtxW15gWV5dZnN9e3NvdGNqaml7fHJ6d3RkbXRobHt+dXp8e3l5f4B/cIaKhHt9c355cn9oVFxxaWx2cHVna2dkXWFZamhranFybVdbZW5sZ3J5b2hqbWCMjKuxoZCjoZqfnpiemamjoX2ClquMnpSHmqGQpJR/e5iEfJKZiIiGhopyfYCLdoWLgYSWinJvgHKYhoR+koOEhoqBeoCEi5qfj4KmoId4jZeIlYuLnJeFg3qsgZCXmZOJnp2HiKGrn6Kio4uIk5udo5mWqqKop6GTnImYkHx5j46EqH5/kpGSk5yxpZqUnZCOspOYhKaMjJacoImRm4KJkoprfI52d2WChpCKfImdhIeLj4eIgIWEkHd8e3Wbo4mIi5+LhpV/fo2CgXZxdIaFf3iJh4qRppGEho6Ig4yQi3uGiYeOgHVrgYN7eZlpcmhgdIpwfXp2dW93dIFdXW+HaG5fX1pbXFJncVVjW1thbGh0e3xybnBkamlof3tteH5waG9vbGaAe3KBgHd/fX+Ee22DjIZ8enh8fnqDeE5kdmpzbnF7ZWtlYmJgW3NmcGZycWxVXWx0bWh4enBnaWtljYieup+WoqGYlZmYlJikoJ17f5ipjZ6MhZ+cip2WfHiUgnuOmYmGg4SGbXiBgHKAh36Ik4Rta356l4eEg5B+gIaEhn2Hg42bnZGGqZ6CcYqPhZKRi5yRfY16qYOMkZeVjpuWhoabpqCimp2Gg5KamZiQmqagpp6ekJaBkot3fYiOhKV7fI+QkIWYqqCck5yPjaqOkoCejYmUmp+Djpd+ho6Cb3iGcXVhfoSPhnSLl4CCjoKGhH6FhJRueXZ1lKOMjoabhYWOdYCLfX1zc3yJhHt5jI+Ek6ePhoSPgoOKiYl1hYaHiXtuan1/e21oa2xnXnl+Z3x7dnR1dXp3XGBwfW10YGNaW15RZm1TZVpdYWppdXl+cGxsY2pqZ4B/a3J/a2pzbnhuhHluhoB2goB9hXZxgo2Ifnt6fIB7gotgaXtrdWhpg2VqY2BpW2N1aG9idW1rVGJxeWVveXpyZWptbYuKn7iaoaSfk5GWl4uan56de3ecpZCbiYaklIqYmXh5jYV8iZGDjIKCgmx7f3hygIV9ipB8a2h9gpeJgYiOfH6GhId8j4CPm5uQh6acf3CLiouShqChioWMfKePho6Sl5OWkneNo6ChnZaaf4GQmZiTjJqioaOamJGbfo6FeoGEjoegf36MjI58l6SgoJKZkI+mjZCBm5GJk5ecfpKRfYaNgHV0gXB2YH2AjoZxipV8h4pxjH6ChYWOaHhyeY2ZkpCAl36Ii3OCiH19cnp8jIV7epGNg5alk4uFkXyFhoeFdYGChYZ5ZHF6fnh5cGxpZl59c2h8dXVzfHJ/al5gdHZwd2RjWF1eUmpoVGRYXmBnanZ4gXFma2NsZ2V/gGptfWdtcGp9d4Z6a4uBcoGBfYF0doKNhn98eoCBfX+PaXKDbnRpYohpbGJfcVV0b21uYHhobFdqdHZidXp7cWJrb3mJjZ+zkqWlnY6QmI+GnaCanHx1o5+Nl3+MoYqImpZ4e4aHfoOJfoiCgX9wfnp0dYKFfomQd2djfYaXi4KKjXh9gI2DeZaAlZeVjZWfmn1vi4GQk4alm4eMiYOlk4ORipaXkpF2kZ2hoZiUmHp/jpeWjpaanKSdmZOUm3qQhoR5hZaNnX2Bio2LcpeinqCSmI6PooyMg5eYg5OWmn+XjHuIjIB2cX1temOAfIuFcIaTf4+Ba4eCgX+JhGZ2b32Ik5mOfpR4jIl9gIh9fHKAeYqGeoSRiouYopaBg4x3iISCgXZ7gIeDdF93d3xzfXdma2NgfmlqdnN0dX1xfGNjYXNudXJtYVlfXVprZFJiV19gaGt1eYZwYmpjbGZofINraHRobG9of3yBeG2PhnGAgoJ/dHyDjIGAfnqCg358kG11iXR0bWWKbGpiY3VWg2lwbmB4Z2xhanZwZnl7eXFfcWyFhZCdrpinqJ6OjZeHhZ+Tlph9dqibiZh5lpyLjJiPeHuAi318g3uAgoF4c3h5c32Ag3+IioBkXn2LlYh+hYh0fX6Kf36YhJaTloyjoJd+cYd7k5CKpo+MjoqSn5CCkI+Ul5GKgY+YoJqSkJJ0gI2Rk4mcnZ6mmJiOlZZ0jo+LbYaYj5l6h4iQiW+XnZqik5SKjJ+MhoKSnH+TkpaHmYh7iYmBeXF5anVse3+Lfm2FkYKTd2+Cg31+i4Blc2p9gZeYhX+OdJGJhHqIfnZ4gX6HgX2DjYWNlKSQeYWCdImHfX9ydH+FgWxgenR5cHxvYW5iZHthbm92c3d3c3NhdmBva3Vub11bXl1dal1PXVdiYWhtc3qJa19pZWpjaHeIbWZsaGlsZ4B8endvj4dzgIOEfXSBhol6g316gYR9fY5yeYt5eG5sh2toX2lyY4docW9ldmdtbGF6aGt8e3hwYXdti4GZmqqhpKmeioqRhoqeipWXfXasl4yWfJ6TkZaUiHZ9e4p8e4B2d3+Ab3Rzem+FfYGAiX58YVx+j5GGgISEc3qAhnqPkYeRkZuSpJqTgX2AfI2JkaOIjYqNl5mMhZGYk5WOiYmMk52TkIyNboSQjpGInpmhoJeWiZeRb4qahWeGmY6UeomFkIpwlpqToZKSiIuZjIKAkZ59ko+TjJqPe4qEhnNzdWtxbnV8i3RuhpCNkXF0gHyBgoh8ZXFten6blH6FiXSRi4F0iXpvgX+CiH2FjIqFjZaojXuIfX6LhXd+cG5+g4FiZ3dzdG56Yl1vYGp0XnBqenh4bHJwZXldbWxzbXNYWl1fYWpaT1dXZGNmcXF/iGVdaWhnYmdxjW5kaWdkaWiAend1b46Ec4GBg3t1goiFeIV8d4OFeoCKd3+Le3tyeYNqa19waHN/a3FubXFnb2tle2Juf3l2cGt2d4l/o5iiqKGnm4iMioGPnIaTnHSAqZSRjYagjJWTkH9ze3aEd3h/cnN7hWtyb3ltiXZ/gIZucVtZfpKNiICBgXZ1gH9/oIaPipGcl6CTlneJfoCMh5ydiY+GkpeVg4iUmY+Wi4uNjo2dio6QhG6Ji4+RipyWoJuYlYaYiGuFpIRnh52KkX6LhIuBd5OYkZ2RkIiJlY5/fo+YfJGNkI6akn2LgIJudm9rbW9we4Zpc4OOl4pxd4B0goiCeWd0b3aCm499ioV6lZJ6d4p1cYp8h417i4aEiY+co4h8hHaBi4B4eG5qf4B+XHFycW9veFpdb2Bval5vaXx6cG1tam13YHBvanFtWVhgYWFtV1FTWWVmYnVwhIJiXWttZGNma5JtYGZmX2drgXVxcnCLgHR/goB4doCLgHmGf3eHhnaDhXyGjIB7dop/anFifGKFfG9wbHRqaG5sdndfcX55e3R1c3+CfqWVmq2fp5aFjIN+lpSDj550iZ+TkoWKmoyVjYt6cnd0gm9yhXNxdYhsbmx1bYh3g31/bW5VUYGrlIeCeYB2coJ5gqCCkYGSkZebkZl3kHqCi5GjmpOOiJWYkYOGlpmLk4uIj4+InoWQinxzi4WIj4icmZ6blpSAlH9php2JaIegiJKEkYOJcYORl4+ajY+Mi4+Nd3uSkHuOjI2Sl418iHyAa3ZpbWtsbHp/Ynl9jpWBdnqBd4OMfHlodW11iJaMf4mGe5SRcnqFcXiOe4uNe4l+g42Rn56FfX14gYt9d3Boa4CAd153b21rcXJWXW5hcWFfbW55cGdwZmZ0dWhxa2F3ZV1WZWBgclNQTltlZF14cIh8XlxocWJiZWaRaV9nZFtocH5va3Fzin12fYWBdHV/jHl7hoB4iINzhoV+jIyEfHmVeGZxaoNfh35vb2t6YGltdH90X3R8eIZ3c3OFfHmhkJqxnKWOgop/gpmIgIudfoqYko6EiJeOjo6EdnR2c4Bwb4VzcHGDb2ppdW2Cbn18bXVzUk6C38mS1pN8b3SDdYOfgpF2lJCYm4+Ye5NyhZCfoZOTkImSm5OFfZWVh4yNh5KNiZx/joF4eox/iIyKm5ucmpWTeY13aYmSiG2JpIWTiJiDhmOMkZiNlImWi42Ji3B6lYl8jomKkpGJeoV8fm18ZXJva2t5eVuAeY+OgXp+fn+Gjnp6aHRsdYyQioOGhX2WjGx+f2+BjH+NiH6Ee4ORlpubi3x3eIOPeHNsZXB/gmtpdG9naHNtU15uZHBaX2txeGZra2JneHNvcWNfd2BgVmtfXnZPTUtgZmNdeXGKdFxbZXZgYWVljmNgZmJYaXJzbWtxdot8dHmGgnV2fotzf4Z/e4l/comHgZGKiH1+mXZlc259ZYh/b3BrgFprbnl5c2B2enuNdnJ3ind5n4ybr5ugkIKFeIiUfnyJnIeEnpCOhYyXhJOOh4F0d3B5cG6Eb21ufnJjZHhwfG56fGpobGOkmsHcru+hc2t1g3WEoYSRbpWPlJ+UmoGRcIWLo5eJjpWKkJ2Vg4CUj4SIj4CSioqXfod7dX+JeIaFjpual5mOj3WKd3CHiYx+jKWFk4qdhYZei5SXiY6IjouKhIlsfJeCfYiFiZGPhnaFfn5rfWN4dGlteHNXiHqRh4V5fn+AhYx+eWZ0a4GLj4uEg4CMl4ZsgnZuiZGDkYV/gnuBkZeTmZB0dHiHjHVzcWZ0eYFhc21vYWh1ZlJgcGdrVV5tc3lgcmNgaX1xcm5aYnJhYlduWlx3TU1MY2ZhXnZzim1bXGR4XmBkZoRfY2NeWWlya25rcneLfXN3hIF4d3yIcYOEfX2Ie3SLiIiVh4x/f5hzaHVxeW2Me250cIBXcHl2eXFkdniGjGl2gIpygJ2Imaeco5KEfHCMlHh5ip2DhJ+NjnyVjYCZh4R7cndwc2pvgWtpbHx0XmB4dntwdHpnYGV869q1ycPciHNsc4B2ipqIjGmXj46clJKBiHCFiKCOhIqVioyXk3yNkoiCiI96kYuGj4KAd3iDhHKHgpOblpOYhox1h39xhoKKiJqjhJWNn4SJYYOVj4WIhomMh4CHaH2Uf32DhImOjYJxhn5/cndndnJoc3drWox9koKFfICDgISKgnZidG2KgpGMg39/k5F9boJseYeQh5OEfYJ+gZOUkZeJbnJ6jIV0bHBqcXd/XnNoblxpdV9SZHFoZlNfb3Z0X29gXWiCcXJqV2doY2lYbVdbdUxKTGVmXmJyc4VoW1xleV5eZGd6YWRfXVlrbmVuanR3in5zcoF+enZ6h3OFg3x/h3d2ioWPmIKNgnuTdmx3dnl4k3VueHp9WHmFcYBvZ3h2kYJkdoaFcYqWhpmhm6KKhnNvkotydo6bfYmZiIl7n3+EmX+BeHF0bm9kcn5oZmx3d1tfeHt6cXF/aWFnYX/Vto6QpnhucXd7cZKQjIZqmI2Im5GLhntoh4uZhoGSkIaGl417jIyAgImNe5CNfomFenV7g3txhoCVmY6Sk4GJdYSHd4SAi5OeoIeWkJ9+iGF/k4eDh4OJjX9/gmZ9kYB+f4KMj5B+bYN8gnRrbXd1c3Z1a2ONgY5/hX58hH+EiH9wYHNyhnyQjoN9f5KJenGDZnuEi4eNhHyFf4GUj5GThG5weYx+dGxuaWp5fGFnaWlYa3VaUmlyaWJQYnJ4bGJlXlpqg25zYltnX2RtX25UWm9OSE5mZFxnbnGAa1pbY3NfXGNsd2RlXV1abGxibWpzdoZ/cW9/fHx0eIV4hYN8gId1eYmBkpV8iYZ2iYFweHl7hJNvbXuAdl6Df3SBbWl6c5RzZ3KIfXKSkYSan5ughoZ1dZR+bXaTl32HkIOKjZl8jJp2fnZxb2xqYXR8Z2JpdXlaYHd7eW1xfmVjaGhXnY9ecXKWvMSEdnGUiI99cZaLhpuSjIdyaoiPloB7lIyBhJqMfIqFfHuJi3+UiHWJhnZ3fYFydYaBnpSFlI+Dg3KAiXWFfIqZnpmHlY6cgIhmfZOCfoSDiYlygX1mfox8eX9/h4uPfWmAfYN2Zm95eHN2c2xrjoWKgYp/eIKAhYN/a19yeXt+jouGfIKPgX5ygWl5hIiMhoV5hH2CmIyQjH1ubXuJfXZzbmdme3ViW3BiV25xU1Nuc2hhTmZ0eGVgXl1Zb4Bvc1llYV5qbmBwT1lrUURTZ2Baa25tfG5ZW15tY1pib3dkZ1xdYGtpY2xqc3aBg3Btf3x/dHWDeoOCfIKFdn6IgZaQeISLdIGIcnl5fo2Qb297gHFpgXh6fm1se3WVa2p4hHRsk42Fn5igmYSIbn2Mdmp4mI5+gImClJeJeY+Wb3pzcGxpZGBzemhfZXF6WmByfHlncXphZWWPsbJ3SmJapNnQlnF7kIqPd32TioSYkYyFbmuFkpJ6eZKGgYSYinyGf3h3iYqEloBvi4hxdX56anmFg6WQhJKMg39vf4N2hHmGm5mVjJSRlISIcHuSgnyCg4iDboF3aICEeHJ/gIOKh3xlfX6EdmNwc4BoeHBvdZmNhoOKfHZ4gIR5gWtccX9zgomGin6GiXuJcoFucYWHj4WFc4V6gpmNjYR4bm9+hH92eWRnaXtwXlh2WlhwbE5XcXNnYEtsdnRgXVxaWXR9c29XZ11manFgb05XaFI/WWZeWm9qZ3pxWlpZa2VaY3F5X2hcXmVsaGVraXF3f4dubH9+gHVvgnuAgn6Cf3aBhYiXinGCjXF7hnx6eYSTjHVqen9rb350f31vcnt6k3BvgX94Z5KLg6GZnJKChWaGg29neZWIfX6EgZiJgXyNjGl4cmtrZl9hb3ltX2JveFxka4J6YXF2X2Vl1Oq9izI6PouOf3F4hYiOjXaClYx+ko2Mf21shYyLdX2Pf4WBlYh8gnhudoeEg5d3boiFbHV7dGZ5goOni4KOi4R9boB1d4V6h52RjZGSk4yLhn97koZ3f4OMgmt/cmiAfnhtfHyBioN3YXmEgXFkcWh+bXVxdYGbi4B/hYBzdX6Bc4FvXG5/dXmLg4t7h4B8iHh6cWyJhJCEi3KDeoCWi4p/dG1rd4CAdHRcaGd2b1hWe1JZcGRMWnJyZVtJcHhvXFtbWV10fnRoWWJbZ2VuY2lNV2ZRPV5lXF11ZmB1cFpZVG9kWWRxeVpoXV9mbWdpa2lwd32ObGmChH55boB8fIF/gnp1goGNk4RwgItud32Ae3uIkol/aHt9anN7coZ7c3d+f4x6eIR9fGuMjYSbnZaMgIBsjX1raH6Ni3p+foOTgn59iohrdXFnaGJbYmdzb19ha3NgaHCIemJzdF5jZJugj25cNVqvtXRpgIh8koZ2hZWFc46KiXZwbIWChnR5iXiJfJOIen5yZ3WJfn6Yb3GGfmh2eW5meYeEpIeAhoyJfm5/doCCfo2aiIKUkZiJi4SJfI+IcHt9hHtofmxrgHt6aXp2gYeAcmB3gX5xZHJmdIJtdXuGlZGBfIKBb3d6fXV+bFlwgHd1jIKGeIh2gol6eHNuioGQgYZzf31/k4iJem5tam6CgXRtXGdkcnBRWnpNW29cT1xyb2RVS3N4aVdZWlphcYB0YF1dYGZkaGlmTlpoTUBgY1tgdmFddW1YV1N0YVpkb3JXal5iaGtnbWxpcHd8kmxphIl8fHB+fnuBf4J6d4B/iouDcXuIb3F3g397iY2Pg2p+e213eHaKd314gIKHf4N+fnpthIyImKONhIN6dYt4a2yDh5B4fXqBkYCAfoqDcHJxY2ZeWWZfb29fYGdwZmpviXRhdG9bYWRqdnuAv5ympMi4cYWDcpJ8eIaSgnOQi4dxcm+DeoJzdYd0iHeUiHl5cGN3h3qAk2lyhHZnd3VjanyCiJ2Bf3+Oj31zgHSFeoGSkIN5lo6Vj4iCiHuIiGt4eX50Z3pobH95c2l6doCDfWhgd4d9amt0Z3qAaXaBjJGUfnp+fnB8d3x0fmJWeH5zc4qEgn2DcYeKd3hxcISCjX9+eX59do6Fg3ZpcWltiIFwb11nYXFtSmV1S11tVVRac25iUU9zeGBSWFhdYW+Cc1thXGhlZWNrZFFbcElDY2BbY3BeXXhoVVZVd15bZW5oVmteYWlnZW5uaHB2epJuaYiMeH1ye355goGBfHZ9g4iGg3B3hHJtd4OCfYmLk39wgHt3eXqBjHSDeH+BgYKEeoB1b36Ki5ueiH2FeneFe2d0hYyPeX5/e4iFg3aPgGdwbl9kW1hlWW1yYWBgcGxraIluYXRpWV5kboB3qdqqx4aHsnGJd2+MdXuGjX96kol/dHN0fnd/b3F/bYR0lIZ4dWtgeoJ5iY9mcYRwZ3ZuW218gJCTf4B5kZJ9eHtuiHeBko2FdJaKkY6HhYV7f4RsdHZ+bWd2ZW17dW1qd3Z/f3xhYniFeWh1dWJ9e2d1ho6NlXt0gHZxgHt9bX9ZV3V/cHWFh3+BeWyJhnR5bHWAhIR+e315e3OLgX1zZ3RlbouDa3NaaV50ZEdtbUxaYVdWVndtYlBSdHZXUFZYXmFxhG9cYGNtZGReb2NVXnJGQmVfXWZoXVt6YlFVXHVbWmdrYVZqX2BuZWZrcWhwdXiOdGuOjXV+dnh9d4GDgXtzfYOIh4NvcoB0cXV+hYGJjYp7d393g3t8hYd4h3x9gX6EgHt+c3Z5jI6gjYl6iXZ0g3hefYWYi3iGg3SFhoR3iXtibm1bYVpbYVZpc2NgW2dub2aHcWFxZldcY2t/fMrOh7mham1timxxhHF8g4l+epCEeXhzeXV1fGpsdWOEdZKCd29mXn2CeouKZXKCa2pxY1hteoWbiIKBc5aTdn58b4pxgouNiHKYjpGJhYuDe3h9cXFvfGZocWJteHFqa3F4fXx6XWV5gHdpdnhmgndndIeMjpR7cYdqb36AeW58XVlzf250gYt8gm9vin9xdmh3f4GAgXd9cXt1h316cmZzYW6LgWpyV2pedltIbWpNVlReU1V7a2FPVHVyUFFUV15idIVpXWBramZjWW5hWWRwR0BnXGBmX1xVel1PVWRwWltqaF1XaGBecmZrZ3FncHJ3hnhulYp0f3p3fniDh391cn+GhY6DcHB7eHZ1eoaFhoyFenx/dIt+fYaEhId/fn59h398eHZ5eJGTn3+MfIttdX94ZIKGlYVzkYpvhYWBeoN0Y25qWV9aXV1UZ3JkYFhkcXJmgXNia2VXW2Bqf3i+rnugtm5ic4Zoc3txeYGEen2Lfnd3cnZve3Zlam5gh3WOgXNqYl5/eHmLhGZxf2hra1pWb3eJo4GEf3GZknGAeXaEboGDk4lzlYiNiISJhX14dHJuaHhgam1gbXZqZ2preXd6dlpnfXx4ZXJ+boR0ZXWFjYaWfm+MZ2t6g3VtdGJdcX1sdX2Me4FmdYd9bnFodX94fn9zfWx7e4J7eG9lbGJuiX1rbVZpX3ZVSmlqT1FOaE1Ye2hhTlV1akxQVFVfZnWDZl5gcGhnYVdpXVxsaEpEallhZFdZVHhZTlZtallda2RcWWVjXnRmbGRxZ3JvdYF4cJmFdn9+d398hYd9dXOCiICVg25zeXt6c3KFhoiIg3iBfXWPfnyEio6EgoR7fouDe3d8d3eanZd6ioKGaXZ9e2yDhJJ/cY6BcIWCfoF/cGZsZ1ddWlxbU2RwZF5XYnJ1aXVwZWViV1xcaX9wb3KAc4lkZHh+aXR1dHKBg3eAg3l2c3Vta3pxYmdrZ4Z0jYNuZl1ffXB7iX9pbXhnamRVV3JvjaZ8hHt2lpB0fHN9fG58fJKGd5l8iIaDhoN9dHBxbGd0XGxoXmx0ZGdmaXpve3JZZ4B2dWhwgHiCdmJ3hYt8lIBujGpte4JxZnNlYW56Z3N4inx+YnaDdmprcXV7cXp6dH1mfn+AeXduY2ZiboZ8bGpVaWJvUkpoak9LTm9HXntmYU1VdGNKTlNXYWp2fmVdZ3NpZWBWY1djcF1MS2pYY2FVVFRzVkxYdWRaXmtgXFpjZV92Z21icGlzbnJ/dXSagXd/gHd/f4aEenx0goR+l4VucnR8enRxhIWPgYB5i3V0kH98gZWOgIWEfX6Mhnt+gHZ7o6WKeYiGhGt1fHp1g4GLem6Ec3mEfYGDdW5qaGVWXVtaWlNibWRbWGFze2lobWlgYldfW2qAaWtwgGdrYGh5eGpzdHRuhIB6f3x1dW56aGp5al9lbmiBdpCEZ2VYYndqfod7b2lwZ2ZdVVhvZ46od4F6fJGOeXVwf3BzdnqPgHiVdYaDgIWIdmpxdWdobltsZF1tcl9nYWp4aHttW26CcnRqb4B+eXhhd4WEeI+Fc4hyb3mAcmNxaVxxeGRydIl8eWJzgHBnanl0cWx4eHV4ZIN7f3l3cWRkY258fWtrVWhhZVJKa2dPR1FrRWF4Z2FNU3JdSk1UWmVrdnplX21xaWRdVmBWbm5XS1NoV2VeWE5VbFRKXHlfW19rXV1bY2VgeWhsYG9vdW5veHV6mH13gIF6gICHhnp4eYJ+gZOEcXR0f3l2dISIkX2AfJBrc5WAe4KfhX6HfYB/hoKAint2hKuff3qIiINrcoF5dYB/gXRuhm58gHOKgGpvbWRkWF9aWVpUYWpnW1pedIJpXm1sXGFWXFxsgWVxdH1paVxrdnVnc3ZybYV7fXx4dXJseWdpeGZdZXJoeneTgWNjVGVwZ4KFd3dnaGpgV1ZZZ2OPp25+d4CLj3twcX5oem96jXx3j3KEfX9/hm5kdXJkaGhca2Fcb29cZ19tdWR6aF10gG9ya3F7fXV2YnSFi3uIh4GAeHJ1f3VhcG1bcnRjcXOFfXVlcoBsYWx7b2ppe3p1cmaFdnt7dnFlYmVtc35pbFRnXVxUS3JiUEZWYUdid2dhS1RvV0pMWFhna3V6ZGVucWZkWlddWHZmVUpcY1dnWFlJV2VQSGJ4Wl1fbFteXGFjXn5pal9udHhub252g5d5coGAfH+JjIZ+dXWGeYeMfXN1dYJ5enqCjI59foSJaXOWgXqKnX1+hXqBen98hohzcY+tjHt7h499ZXGHeXN8e3VyboVse35sj3picG9iZV1lVllZVmNma19dXHKFaFhwblteV1pcbHticHd2bWJabHNzZ3R1cGyEeH5/eHdubnRkaXRlW2d0ZnZ2knlfXVJmZmqDgnR+YmNpXFRYXmJjj6RoeHSDhpF4bW97aXhufIV7dYlzgHh8eH9oZHZsYGZgXmpfXHNrWWVdb29iemVbd3xrbm5vd3hzdGRzg5J+h4OJe3Zwcn5zYnhkXHBwYnFygn10Z3KAZV5udmlkZnl8dW5vgnV0fXRyYl9mbm99ZGlTZ1hXU013X1FKWVhIYnVkYUlUbVNKTVpXaWxxe2JsbHNjYlpaW2F3XFNMY11YaVNXSFlgTUZpdVheYGxbW19iYlyEaWdhbnh5bG9qdoGQeG2DfoCBk4iEgXZziHSMhnNxd3WCd3x9foyQgH6TfnB3lYN8mZJ5gIB4en6AdIiDdHCZont6f4mUeGR1h3hzeHVrc25+a3h8cJFyXnBvYGdibFRbWldoY21mXFtxiWVTcm5bWlhYYGx2Y2l1amleWW1zcGxzc3NphHx+fnt2b25sZGlxY1trcmR0do5zW1dTZWFygH9ygl1iY11TWmBcY5GfZXFxhYSRdGxse25vcHt8fHGBd39zenp6Y2V1aF1iWmBnW152aFdiXW9oYXdgW3t2aWpybndzcnVocYKVg4Z9g3ZzanF9bmZ3WF1sbmNyc4F6dGdvfltgcHFhX2pxfWxsdX5zcXhrcGFcZWxsemFnU2ZUVlFQdVtRT1hRSGN0YmBGVWtQSVBaVWtranxlbW5xYFtaWFlscVdTT2ZXV2hTVEZZXE5IcnVYX2NtY1hgYGFdi2pjZG15eGtvaXV5hntrg31/hJp8goR5fIduj4Zxb3d6fXSCgnyLj4KCl3R3gpOFgZ+JdYGAgXR/gnGHgnVvopdze4aLhntld4pubXpuZndwemtzdnKMa150bmFnZWtSXVtWZ2Fsa1pccIxkT29uXVZYVWdqdGdidGVlXVltdG1vdXR4aoZ8f3uHdo9zZGRrbmFdbm1jc3iHa1pUVmNkeH19cYZdY19jVFpgWWKVlWNucIOFinRraHxwZnN3c3xsenR1b3p+dV5lcmNbXlZhZFhhdGVVX2BtZGFxXV1+cGhpc3FzcHR2a22Ek4GIeoRxc2dvfnFzb1RcZ2tmcXSBd3NjbHZVYnJrWl5vZn1lbXd9c3Nza21gWmRqandeZlRkVFVQVG1XUVZTT0dkc19hRVhpT0hXVFZtaGR8aWt3amFXXVVbdGRTUldoUVllVFNIWlpQTXh2Wl9lbGlZYmBeXo5uYWZreXVub2h2dn9/bIOAfYeXe4CHgYl+a5OIcmd0gHt1gIJ9iI5/i5NyfIqRhYefhnt/hoxzgYZzfoJ2bqWMcoGNi3Z3bXqMYGR7cGZ4cnhsbXF2gmdke2xjZmdoU19eVWdfbG5bXm2NaE5pbWBUVlNvZ3NsZnhkZFxYb3NscXp3cmyHe392m3p5a2FlbG1eYG9qZXF5fmdaVlhgbHh8e3CEX2JeZ1dYX1dkm4hia3CBh314bGt5blx3cWx7anZzbm97gHJYaW1eWV1VYmNXZHBjU15haGFibFpgfmtma3N1bm13dmxphYx/iXmHbXFmcX1uc25jWmFpaW90gnRzX2lsU2VxZFVibmJ6Y3F3e3ZrcG1rYFlhZ2h0XGVVYVVSTlhlUk9cT09IZHBdY0ZZaU1JX0tYbWRfeGhufWNfVF9UXXVcVFNgZk5dYVRTSlxZUFl0dV1fZWxoWGNhW16NcWNnanhxc25ndnR6g3KCg3qIjn58iYeNeW6QinRsc4J0f3+HhYaShJWPeX6Mj4eRm4SAfIyFc4CBc3R4cm+Tk5OTk5OTk5OTkpKSkpKSkpKSkpKSk5OTkpKSkpKSkpKSkpKSkZGRkJCPj4+Pj4+Ojo6Pj46OjY2Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2NjYyMjI2NjY2Njo6Ojo6OjY6OjY2Ojo6Oj4+Pjo2NjY2Oj4+Pj4+PjoKAfnp6fX5+fX1/fn59fn5+fn5+fn+Af4CAgIGAgIB/gIGBgYOHjI6Ojo6NjY2NjY2NjY2NjZKSkpOTkpKSkpKSkpKSkpGRkZGSkpKSkpKSkpKSkpKSkpKSkpGRkZCQkI+Pjo6Ojo6NjY6Ojo2NjY2Njo6Njo6OjY2NjY2Njo6Ojo6Ojo6NjYyMjY2MjIyNjY2Njo6Ojo6NjY2NjY2Njo6Ojo6OjY2NjY2Ojo6Ojo+Ogn99ent8fn59fX59fn5+fn5+fn5+f4B/gICAgICAgH+BgYCBg4aMjY6NjY2NjY2NjIyMjIyMkpGRkZGRkZGSkpKSkpKSkZKSkpKSk5KSkpKRkZGRkZKSkpGRkZGQkJCQj4+Ojo6OjY2NjY2Njo6Ojo6NjY2NjY2NjY6Ojo2Ojo6Pj4+Pjo6NjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Njo6Ojo2NjY2NjY2NjY6Ojo6Cf3x6fHx9fn19fn19fX59fn5+fn5+gH9/gICBgYGAf4CAgICDhouOjo2NjY2NjIyMjIyMjIySkZCQkJCQkJKSkpKSkZGSkpKSkpKSkpGRkZGRkZGRkJCQkJGRkZCQkJCPj46Pjo6Ojo6Ojo6Ojo6Ojo2MjYyMjYyOjo6Ojo6Njo6Ojo6OjY2MjIyMjIyMjIyMjY2NjY2NjY2NjY2NjY2Njo6NjY2MjIyNjY2Njo6OjoN/fHp8e31+fH1+fXx9fn59fn5+fn5/f3+BgYGAgICAgYCAgIOGi42NjY2NjIyMjIyMjIyMjJTO2tjY2NjamoGEhISEiF0tMDAwMC1GoaGhoaGhoJqZmpqampqKg4SEhIOEd2VnZmZmaFxDREREREJOpa+tra2usWFAREREREU4Li8vLy8rSIWDg4ODg4OLjIyMjIyMjY2NjYyMjY2NjY2NjY2NjIyMjIyNjY2NjY2OhX19e3t6fX58fH59fX1+fX1+fn5+fn9/f4GBgYCAgICBgICAgoWKjI2MjIyMjIyMjIyMjIyMlNvp5+fn5+qcfoKCgoKGUxgdHR0dGTekpKSkpKSjnJycnJycnImBgoKBgYJyXV9fX19hUjQ1NTU1M0GptrS0tLS4WTA1NTU1NyccHR0dHRg6g4GBgYGAgYqLi4yMjIyMjIyMjIyMjIyMjY2NjY2MjIyMjIyMjY2NjY2GfH16e3p8fXt9fn19fX59fX5+fn5/f3+AgYCBgYGAgIGBgYGChYqNjYyMjIyMjIyMjIuLi4uSl5iYmJiZmpKPkJCQkJCMh4eHh4eHiZOTkpKSkpKRkZGRkZGRj46Ojo2NjYuJiYmJiYmIhYaFhYWFho+QkJCQkJGJhYWFhYWFhIODg4KCgoSKioqKioqKi4uLi4uLi4uLjIyLi4yMjIyMjI2NjIyMjIyMjIyMjY2Njoh8f3l7ent8e319fX18fX19fX5+fn9/f4CBgYGBgYGAgYCAgYKFioyMjIyMjIyMjIuLi4uLi5GQj5CQkIuOkZGJh46KkJKTkIqRjY2Ph4+RkZGRkJCQkJCPj4+Pj4+Ojo6Njo6Ojo2Njo2Njo6Ojo6NjIuLjIyMjI6Ojo6Ojo6Ojo6NjY2NjIuLi4uLiouLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyNjY2NiX59eHh5fH18fX19fH19fX59fn5+f3+AgICBgYGBgYCBgIGCgoSKjIyMjIyMjIyLi4uLi4qLkJCRkZGPhI6QkIaKj4WNkJCOh4mHh4yHipCQkJCQkJCQkI+Pj4+Ojo6NjY2NjYyMjIyMjIyMjIyMjIyMjIyMjI2NjIyMjIyMjIyMi4uLi4uLi4uLi4qKiouLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjI2Lfnx3dnh7fXx7fX18fH19fn5+fn5/f4CAgIGBgYGBgIGAgIGChIqMjIyMjIuLi4uLioqKioqQkJCQkIqFjoiOhoaPiY2QkI+GioeGjoaMj4+Pj4+Qj5CPj4+Ojo6OjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLi4uLi4qKioqKi4qKi4qKi4uKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIt+e3d2eHt8fHx9fX19fX1+fn5/fn9/f3+AgIGAgYGAgYCBgYGEiYyMi4uLi4uLioqKioqKipCQkJCPhYOMjpCOiYyJjZCQj4mHiIeMiImPj4+Pj4+Pj4+Pjo6OjY2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKioqKioqLi4uKioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMin18dnZ4fHx7fH19fH19fn5+fn5+fn9/f4CAgYCBgYGBgIGAgYSJi4yLi4uLi4qKiomJiYmJkJCQkJCMhoyJjoeFjYmOi4yLhoeHhoiGiY+Pjo+Pj4+Pjo6OjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKioqKioqKioqKi4uLioqKioqKioqLi4uLi4uLjIyMjIyMi4uMjIyKf353eHp7enp8fHx8fX5+fn5+fn9+fn9/gICAgICBgICAgYCBhIqMi4uLioqKioqJiYmJiYmPj4+Pj5CMjouPjIqPjI6MjY2JjYqKjImOj46Ojo6Ojo6Ojo6NjYyMjIyLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLjIiAfXh5enp6e318e3t9fn5+fn5/f35+f39/gICBgICAgIGBgIGEiouLioqKioqJiYmJiYmIiI+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Ojo+Oj46Ojo6Ojo6Ojo2NjYyMjIyLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLioqKi4uLh4B8eHp6eXt8fHt8fH1+fn5+fn9/fn9/f39/gIB/gYGAgIB/gYSJi4qKioqJiYmJiYmJiIiIj4+Pj4+Pj4+Pj46Pj4+Oj4+Ojo6Ojo6Ojo6OjY2NjY2NjY2MjIyMjIuLi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKiYmKioqKioqKioqKioqKioqKioqKi4uHgHt5eXh6fHx6e3t9fX5+fn5+f39+f39/f39/f3+BgYCAgH+BhIiLiomJiYmJiYmJiIiIiIiOjo6Ojo6Pj46MjI+Sj5COjo6Ojo6NjY2NjY2NjY2NjIyMjIyMjIuLi4uLioqKioqLi4uLi4uLi4uLi4uMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKiomKiomJiYqKioqKioqJiYmJioqKioqKioqKioqKioqKioqKi4aBe3h5eHp8ent7fH19fn5+fn5/f35/f39+fn9/f4CAgYCAgIGEiIqJiYmJiYmJiIiIiIeHh46Ojo6Ojo6Ojo+MkJOQkI+Ojo6NjY2NjY2NjYyMjIyMjIyMjIuLi4uLi4qKioqKioqKi4uLi4uLi4uLi4uLi4uMjIyLi4uLi4uLioqKioqKioqKiYmJiYmJiYmJiYmKioqKiomJiYmJiYmJiYqKioqKiomJioqKioqKhYB6eHl5fHt6ent8fH1+fn1+fn9/fX9/f35/f39/gICBgICAgYSIiomJiYiIiIiIiIeHh4eHjY2Ojo6Ojo6Pj4+PjoyNkI2NjY2NjY2MjIyMjIyMjIyMi4uLi4uLioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYmJiYmJiYmKioqJiYmJiYmJiYmJiYmKioqJiYmJiYmJioqFf3l6eXh7e3p7fHx7fn5+fX5+f39+f35/fn+Af3+AgICBgYCChIeKiYmIiIiIh4eHh4eHh4eNjY2Njo6Oi42Nj5WPiYyPjYyNjYyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYR+eXt5ent7eXt9fHt+fn59fn1+f35/fn9+f3+AgICAf4CAgICEh4mIiIiHh4eHh4eHh4aGhoyNjY2NjY+MjImKj42IjJGPjY2NjIyMjIyMjIyLi4uLi4uKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uKioqJiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJg355e3p8e3p7fX17fH9+fn5+fX5/fn9+f3+Af4CAgH+AgH9/f4OGiIiHh4eHh4aGhoaGhoaGjIyMjIyLiYyKiIeJhoyOjJCMjZGOjIyMi4uLi4uLi4uLi4qKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiImJiYmJiYmJiYmJiYmJiYmJiYmIiImJiYmJiYmJiYmJiYiIiIiIiYmCf3h7e3t6enx9fHx9f39+fn19fn9/f39/f4F/gIB/gICAgICAg4aIh4eHhoaGhoaGhoaGhoWMjIyMi4yOjoyKioeEiIuKjIuNjo+Li4uLi4uLi4uLi4uLioqKiomJiYmKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiomJiYmJiYiIiIiIiIiIiImJiYmJiYmJiYmJiIiIiIiIiYmIiIiIiIiIiIiIiIiIiIJ/eHp7enp6e3x8fX1+f35+fX1+f39/fn+AgICAf3+Af4CAgYCDhYiHh4aGhoaGhoaFhYWFhYyMjI2NjJCSjI2Ii4mJi4uLi4mLjIqMi4uLi4uLioqLi4qKiomJiYmJiYmJiYqKioqKioqKioqKioqKioqKioqKioqKiYqJioqJiYmJiYmIiIiIiIiIiIiIiImJiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIiIiIiIiIiHgXx4e3x5enp8fHx9fX9/fn59fX9/f39+fn+Af4B/f3+Af4CAgIKEh4eGhoaGhYWFhYWFhYWFjIyNkY+PjZGJjIaJjIuIiImMiYeNjo+NioqKioqKioqKiomJiYmJiYmJiYmJioqKioqKioqKioqKioqJioqKioqKiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4WAenl9e3t7enx8fHx9f39+fn19f39/f35+f4B/gH9/f4B/gH+AgoSHhoaGhYWFhYWFhYWFhISLi46PjoyLj4iHiYmMjYWFjo2KiYyNi46KioqKiomJiYmJiYmJiYmJiYmJiYmJiYmKioqKioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHhoaHh4eHhH55eX16enp7fXt8fX5+f35+fX5/f39/fX5/f3+Af39/f39/f4CChIaFhoWFhYWFhYWFhISEhIuLjI6MjI2Lh4mIiomHgoeNjoiKi5GTj4uJiYmJiYmJiYmJiYmIiYmJiYmJiYmJiYmKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIeHh4eHh4eIiIiIiIiIiIiIh4eHh4eHhoaGh4aGhoaGhoaGh4eDfXp5e3p5enx8e31+fn5/fn59fn9/fn9+fn+AgICAf35/f39/gIKEhoWFhYWFhYWEhISEhISEioqOjYmIiIqKh4iHiomIioiIh4qGi5GPiomJiYmJiYiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHh4iIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGh4J8eXl6eXp7e3t7fX5+fn5+fn59gH9/f39/f4CAgH9/fn9/gICAgoSGhYWFhISEhISEhISEhISKi5CPiYmJi4qHh4WHiYuKiYSLjYmOjYqJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiIiIiImJiYmJiYiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGgXt4enp4e3x7e3x+fn9+fn5+fX1/f39/f3+Af4B/f39/f3+Af4CChIaFhYSEhISEhISEhISEhI+Qj4+IiYuIhoeIiYuLjIuJioqNio6Oj4iJiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoaAe3h5eXh4enp8fX1+f35+fn59fn9/f39/gIB/gICAf39/gIB/gYKDhoiGiIaDhISEhIODg4ODkpKOioeKi4qLh4uNiYqJi4iHiouIio+SioiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhn96eXh4eHl5eXx9fn5/fn5/fn1+f35/f3+Af39/f4CAgH+AgH+BgoOHjo+PjoiHhIWFhoaFhYWSkI6KiYmIiImKioiIh4aKjIiHiYmOkJGNh4iIiIiIiIiIiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4aGh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWGf3l4d3d3eXp5e3x9fn9+f35+fn5+f35+fn+Af4CAgICAf3+Af4GBg4eOjo6Ojo6Mjo2OjY2MjZCQjomHhoiJiYeIiouIiYyJiYaKjY6PkYuIiIiIiIeHh4eIiIiIiIiHh4eHh4iIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhYZ+eXd5d3d6eXl8e31/fn5/fn5+fn5+fn9+f4B/fn+Af39/f39+gIGEiI6Ojo6Ojo6Ojo6Ojo2NkJGOi42JjIiIiYaHiYaIioiHi4yLjpCQiIeIiYmJiIeHh4iIiYmIh4eHh4iIiYiIiIiIh4iIiIiHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhoaFhYaGhoWGhYSEhIWFhoaFhIWFhX55d3l2eHl4e3x7fn5+fn5+fn5+fn5+f39+f39+f39/f35/f3+AgYOGjY2Ojo6OjY6NjY6OjY2Qj42Ni46KhoiKhISLiYeDhYSDi4mLj42JjI6QkI+NjYyLjY6Pj42NjI2Nj4+Pjo6MjYyMjY2KiYiHiImHh4aHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoeHiYqKiIeJi4yNjo2LiImLi42OjYyJiImMgHl3d3Z6eXh7e3t9fn5+fn5+fn5+fn5/f39+fn5/f4B/f4B/f4CBg4aMjY2NjY2NjY2Qj4+Pj46NjI6KiYuMjIeFiY2Lh4aIh4aHh4uNjo6Pj4+Pjo+Pj4+Pj4+Pj4+Pj4+Ojo+Pj4+Pj4+Pj4+Oj46Oj46Mi4uJh4eHh4aIhoaGhoaGhoaGhoeLiYeHiIiLjY2Mi4yLjY2Ojo+Ojo6Pj46Ojo6Ojo6Ojo6Njo6NjY2AeHZ4eHp4enx6fH5+fn5+fn5+fn5+f39/fn59fn9/f39/gH9/gIGDhoyMjIyMjY+QkpOTk5KSjYyMjIqHioyKh4eJiYWCiouIiYWJjpCNjo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjI2NjI2LiYaHh4eHiYqLjY6NjYyNjY6OjY2OjY2NjY2NjY2NjY2NjY2OjIyNj4+OjY2MjIyLi313dXd5enp7e3p+fn5+fn5+f35+fn5/f39+fn1+f39/gICAf3+AgYOFj5KRkJGSk5OTk5OTkpKLi4uLiomMiouLiYuKhoeOjYiIjI6OjIuMjIyNj46Njo6Ojo2NjY2MjY2NjIyMjIyMjIyMjY2NjYyMjI2NjYyMjI2NjIyNjIyMi4yMi4yMjI2MjIyMjIyMjIyMjIyLi4uLi4yNjY6Sk5OSkpSRkJOVlZSTk5COjo6Oe3Z2d3h6ent7e31+fn5+fn5/fn5+fn5/f35+fn9/f39/gIB/f4CBgoSNkpKTkpOSkpOTkZKSkoqJioyJi4qJjIuKioiHiYqKi4mKjY2Mj46Nj5KUlJOUlJOTkpGSkI+Ojo2NjY2Pko+OkZGOjIuKioqLi4qKi5CPjoyMjIqKioqKioqKiouKioqKi4yLi4uMjIyKiouLi46RkpOTk5SUk5STk5SUlJOTk5KSkpKSk5F6dXZ2eHt7e3p6fX5+fn5+fn5+fn5+fX5/fn5+f39/f3+Af39/gIGChIuRkZGRkZKSkpGRkpGRiYmIiIqMiYiJiYuJhoSJhoyKh4ySkpKTk5OUlZWWlZWUk5OUlJSUk5SUlJSVlZWVlZWUlJOTkY+QkZKQjoyRlZWVk5KSjo+QjYqKi4qKi42OjY6RkpCRkpKSkpGRkpKSk5OTk5OTk5OTk5OTkpOSkpKSkpKSkpKSj3h1d3l6e3t7ent9fX19fn5/f35+fX5+fn5+f39/fn9/f4B/f3+AgYKEi5GQkJCSkpKRkZGRkZGIiIiIi4uJg4eLi4yMiIeHjYyNkpSSkpOTlJWWlpaVlZSSkpOTlJSUlJWVlZaXlpaWlpWUk5SUlJSVlJSUk5OVlZWUk5KTk5OTkJGSkZGSk5OTk5KSkpOSkpKSkpKSkpKSkpKSk5OTk5SUk5OSkpOTkpKSkpGRkZGPdnJ3enp7e3t8fX59fX1+fn9+fn9+fn5+fn6Af39/f3+Af3+Af4CBgoSKkJCRkZGRkZCQkJCQkIeHh4eIiIiFi4+KjI6Njo+OkJWUk5OTk5SUlZWVlJSVk5KSk5KTlZSUlZaWlpaWlpaWlpSTk5OTk5OUlJOSk5SVlZSTkpKSkpOTk5OTk5OTk5KSkpKSkpKSkpGSkpGRkZGRkZKTlJSUlJSTkpGRkZGRkZGRkZGRkYx0c3d6ent7e3x9fX1+fX5+f35+fn5+fn5+fn9/f39/fn9/f39/f4GDhIqQkJGRkJCQj4+Pj4+Ph4iKi4yNjYuOj42Mjo6RkpGSk5OSkpKSk5SUlJKSk5OTk5OSkpOUk5OTk5WVlZWUlZWUk5OTk5KSk5OUk5KTlJSUk5KSkpKSk5OTkpKSkpKRkZKSkpKSkpKSkpKSkZKRkZGSkpOTlJSUk5OSkZGRkZGQkJCQkZCRinN0dnp8fHp7fXx9fn59f35/f35+fn9+f31+f39+fn59f39/gH+AgYKDipCQkZGQj5CPjo+Pjo+Oj4+Pj4+Pj4+PkI2OjpCRkpKSkpKRkpKTk5OTkpGSkpKRkZKSk5OSk5OSk5STk5OTlJOSk5OTk5OTk5OSk5OTkpKSkpKSkpKSkpGRkZGSkZCRkZGRkpKRkZGRkpGRkZGRkpKSkpKSkpKSkpKRkJCQkJCQkJCQkJGGc3V2e3x8e3x9fX1+fn1/f35/fn5/gH9+fX5/fX5/fn5/f3+Af3+BgYGKkI+PkI+Pj4+Pj4+Pj4+Oj46Oj4+Pj5CQiI2PkJGRkpKSkpOTk5OTkpKSk5KSkZGRkZKSk5KTkpGRkpKSkZKSkpKSkpKTk5KRkZKTkpGRkpKSkpKRkJCQkJGRkZGQkJGSkZGRkZGSkZGRkZGRkZGSkpKSkpKSkZCRkZCPj4+Pj4+Pj4+PkX9ydHh8fHx7fHx9fX5+fn9+fn5/f3+AgH99fn5+f39+f39/f4CAf4GBgYqPj4+Pjo6Ojo+Pj46Ojo6Ojo+PkI+Pj4+GjpCQkJCRkZGRkZGRkZGQkJCQkZGRkZGRkZGRkZGQkJCRkZCQkJGRkZGRkZGRkJCQkZGQkJGRkZGRkI+PkJCQkJGRkJCQkJCRkJCQkJCQkZCQkJCQkJCQkZCQkJCPj4+Pjo+Pj46Ojo+Pj4+PeHJ2eXx9fHp9fH19fn5+f35+f39/f4CAf39/fn5/f35/f39/gIB/gYGAio6Ojo6NjY2Ojo6Ojo6NjY2Oj4+Pj4+PjoiQkZCPj4+QkJCQkJCQkI+PkJCQj4+Pj5CQkJCQkJCPj4+PkI+PkJCQkJCQj4+Oj4+QkI+PkJCQkJCPjo+QkJCPj4+Pj4+PkJCQkI+PkI+Qj4+PkI+PkJCQkI+OkI+Pj46OjoyMjY2NjIqDiYhzc3Z5fX58eX18fX1+fn5/fX5/fn9/f39/f4B/f39/f4CAgH+AgH+BgYCJjY2Ojo6Ojo6OjY2OjoyNjY6Ojo6Ojo2NiJCRkI6Njo6Ojo6Ojo6Pjo6Ojo6Ojo6Pjo6Ojo6Ojo6OjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Pj46Oj4+Pj4+Pj4+Pjo+PjY2MjYyNjoyLi4mJiYiFhYSDgoKEgnR5fXp4dXJrZWltb2xmZmdncHNzd3l9fnl6e3x9fX1+fn59fn9/fn9/f39/gIB/f3+AgIGAgIB/f4CBgImNjY2NjY2MjYyMjIyMi4uLjYyMjIyMjIyGj5GRjIyMjIyMjIyMjIyMjIyMjIyNjY2MjI2MjYyMjY2MjIyNjY2NjYyMjI2MiomKi4uJh4KAh4iEgXt6gH57fXx8fXlzcnJycnV1cG1ramppZ2NkYV9bXF1eWFVXWFlTS0VJSkpLTE1PT0tgdHR3eX19eHp5e3x8fX5+fn1+f39+f35/f4CAgH+AgICBgYCAgICAgIGAf4OEhYSFiIuLjYyMjIuLi4yGiYqKioqKh4OOkJGNiouLi4uMiYmKioqKiouLi4eDi4qIiYmGhYWEhIeJiYWCg397fHl6e3pzcHFxcW1samdsbWdlZmVmZGNlZGVkZWVlZWRkZGNhYV5dXFpYWFdUUFFSU1JTTU1KSUZESEpHR0hHR0xOSWdzdXh5fXp4d3l8fHx8fn5+fn9/fn9/f39+f4CAgIB/gICBgICAgICBgYFnXmBjYWNucX17ent/fXd8fHZ4ent4eHpvcHt4eXt8e3h3e394dXd0dHZ0dHZ3dXFycW5wcnBnaGtsbm9tamlpaGhlZWRkZF9gYWJgYF5dWVhaWltdXV9gX2BfX19gYmFeXl5eWVldXF1bV1dWUlRSU1NOUUpISUZERUhMTEhGR0lLSklNbXJ0eHp7end3eXt6e3x+fn1+f39+f35/f35+gIGAf3+AgIGAgICAgICCgWdYW1pZXFtcY1xaXF5ga3FtcHBvbm5vbmtpbmxrbG9qaWtraWpraWdmZ2dnaWhnbWdqZ2hlaGdjY2JhYmBgXVhbW1dYV1RWUVBUU1NNSkxLTExOTk9UWFhXVVVUUlBQTU1QT05LTE1QUU9MTEpHSUlHSEhJSEhIR0ZHSEpKSEhISUlISVZwc3V5ent5dnZ5enp7fH59fX5/f35/fn5+f3+AgX9+f4B/gICAgICAgIGBbFtYVlZWWVlaWVlYVVZoamxubmxra2poaGloZGVkYlxiZl9fYGNfXF9dYF1eWl5dWVleYmFeXlpZX1xYV1NOTUxLS0tMSUtNTktKS0tMSktQTEtLRkdHSUlGR0lISUZFSEdGRkVERUVEREVJSUlHSEdIRkZLTUtJSUlIR0hLTU1LTExMVXFzdnl6e3l2d3h3ent8fn1+fn9/f39+f3+AgIGAfn5/f4CAf4CAgIB/gYJoUlRVVlNVV1lZWVdXV1tbYWNfXlxbWFZWWVZSVFJRUVVUU1NTUE1KTU5QUk9NUFFRUVFSVlZRUVFUUFBOTk9MSk1MS0xKSktLRklJSkxJR0pISUlFR0dGRkVFSElKR0ZHRkZHR0hKR0dISEpMSkpLSUlISktLSkhKS0pISUtMTU9QUEtUdHR1eHp6eHZ2d3d6enx+fX5+fn5/f35+fn+AgYB/f3+AgYB/gICAgH+AgmlQUlRXVVRWWVdYWFpbVFRTUlBRU1FRUU9OTlBQUU9MTlBPTk5NTEtNTk5QTU9QUFJRUE5OT05PTk9PUFFPTk5PTk5QTk1NS0lISEpJSUlJR0ZHR0dJSkhJSEhJSEhHSEdISElISUxLSklISkpJSkpIR0pMS0pJSUhKSktMTk1NTU9RTFVzcnN3enl3dnR2eHp7fX19fn5+fn9+fn5+gICBgICAf4GBgH+AgICAgICBbE9PTlRZVVVdW1lXV1hOTUpKSUZKT0xKSkdJSk1NS0pMTUpHSUlJSktMRkRGSktLS0hKTExMT01MTE5PT09NTk9MTk5OUFBPTE1MTk1MTEpJSEdJSElISElJS0xLS0pJS0pJSklJSUlJR0dKSUdJSUpKTk1OTEhJSklJSk1PT01MT1JOWXBwcnd4d3d0dHR3enx+fX5+fn5+fn5+fn9/gICAgICAgYCAf39/gICAgIFvS0pNTlFOTlVXVlZSU0lFQ0VFUkREQT5CP0RAQD5CREFAQURHRkVIRUJBQEBDQ0RFQUNFSEtPS0lJSkhHSklKSUlLSkxQTk1MTU1MTU1NTElIREZGR0ZGRklKSUlLSkhMSklKSkpJSEhKS0tIRkdJSklLTU5OSktPTUxLTU1PUE5QT1BgcG9yd3h2dHJzdXd6fX19fn5+fn9+fn1/gICAgICAf4CAgIB/f3+AgICAgXNQUE5OUE1KS1BSUE5RQ0RCQUZRRT1DPT9FSDk6Oz0/PTxBRUA+Ojw+PjxFRD4/RUE/QEFAREVHR0dHQkRERUZFR0dHR0pHSEpLR0NER0pHQ0RFQUFDR0hHSEdISktKSElMS0lISktLTU5MTUxMSkpMS0lLTU9PUFNRT1BQTk9QUlFNUGdwb3N2dXRycnR4eX19fX1+fn5+f4B+foCAgH9/gIB/f4CAgH+Af4B/gICCdlRVUVFQT0xNUFBOT09BQkFAQkE/Oz48Pj8/Ozg5OTs7OkA7Oz48Ozs8PEhMPT1BQT9CQz1BRERGQkZGREdJSEM/QEBAQUFCQUE/Pjw9PkFAQD8+P0BFR0dHSUtMTk1OTUxNTUpLTVBVU05MTlFOTk1OTU1NTk9OTk1LS05OTk1OTkxUbnBwcnR1c3Fydnh5fX19fn1+fn5/gH5+gICAgICAgH9/gICAgH9/gH+BgIJ4UVFSVFJTUVNTUVFST0BAPT4/PD8+QEE/PT45Ozo7Ozg5Ojg3Ojw5Nzg7Oz49Ozs6ODpAQEFCP0E/Q0ZEQkNDPzs+PkBDQ0E/Pj9BPkBAQj9APD9CQEFDRUVFSktQT1BPTU1OTExMT1JRUFJOTExPTUtOT0xMTEtMS0tKS0tKTU1LS1xxcXF0c3VzcXN4eHp9fn1+fn5+f39/fn5/gIGAgH+Af4CAgICAf4CAf4CAgXxSTU9RUFFSUlRSU1NOPDs8Ozs7P0BBQkA9PDk8PTw5Nzk6OTk4ODo6Nzg6OTo7Ozg3ODk7Ojg8Oz1AQUA9Ozs+PD09QEJDQT9BQkE9Pj09Oz0/Q0RCQD9BREJFR0pKSkpKTE1MTExNTExOVVNLTE1USVBKSU1KSUpLS0pJSEdKS0lKZnJxc3RzdXJydnl5e31+fn5+fX9+f39/f36AgICAf4CAgICAgIF/gIF/gYCBgFZMTlBQTlJRUFBRUU44PT88PDo9PkFAQT8+PkA/Pj07PDw+Pz08PTs6PD09PTw8PDw7Ozo7PD49Pj9AQUA+P0E/QEBBQEBAPT8/PTw6Oz09PD9AQUJCQUBCREZGRkdGR0dISUtMTExLTEtKS0lKSk1MTEpMS0lISUxMSklJSElLR01tcXF1dXR1c3V4eXl8fX5+fn5+fn5/gH9+gIB/f39/gH+AgYCAgYCBgICBgYCCYUtPT05OT1BPT1BQTzo8Pjw9Oz8+PkFBPz0/Q0NDQD48PT9BQD88Oz49PkNFPz9APTs9PT08Ozo9PkFBPz5AQD9BPz89PD48PTs7PD0+QUA/QD5AQ0NEQkRFSEVFR0hISEdGSUpJSUlJSUhKSkpKTEtKSklJSEhKSktMS0lLSkpIVnBwcXNzdHR1eXt7e31+f35+fn5+f39/f39/f3+Af4CAgICAf4GBgICAgIGBgIJtTFBRTk9QTk5PUFBPPjw8PT4/P0A+QEA/Pz9DRUQ/PTs8QD88O0tHODg6PDk9PUA9Ojw7Ozw7ODo7Pz49PD07PEA9PTw8Pjs9PD0+QUBCQUBAP0JEQ0RFRkZGQ0VHSElJSEhJS0tMTUpKSUpNTUpLSktJSEhISEpJSktKSk5MSUlfcHFycnJ0dXZ6e319fH5/fn5+fn5/f35/f36AgIB/gICAgICAgYGAgICAgIGAgnZNTk5NTk5MTE5QT0w+QTw8PT8+QkM/P0FBQUJBQD08PTs+Pjk3ZGw7ODo4ODo7PT8/PDs7PDs6Ozs+Pz89PDg6Pjw9Pj89Oz4/QEJDQkJDQ0FCQkFCQkRCQkRCRENGSUdGRkhJSUtNSklKSktMSkpJSkVESUlGRkhISUpKTEpGRmdwb3FxdHZ1d3t8fX18fn59fX1+fn9/foB+fn+AgH+AgICAgICBgYCAgICAgICBe05JS0tMTExFSUxOTTw/PDw9PkBAQUE7QkNCQ0FAP0BAPT1GSUpreU08Pj0/PT0+Q0Q/Ozw9PkA9PT5BQ0A8OTtBPz4+QT07P0JAQkNCQENDQUNBPT0+QD0/QUFBQENFRUBAQ0JDR0dFRENGRUZGR0VEQEFHR0ZDRkRHSEpHQz5IbG9wcHF0dXZ5fHx9fH1+fn1+fn5+fn5+f36Af3+AgICAgICAgIGAf4CAf4CBgIF9UUhLTU1NS0pLTE9RQD8+PkFBQEBBR0FCRUNEQkBAQ1tBUXR9gX17XD9AQENAQD9AQD49PD1ARUFCQkZIQz08QERDQUE/Pj1AQT4+Pj88PkBER0VAP0BBP0BDRkVDQkJDQEJEREJERUFCPkFCQkFCQEA9QUJDRENDQUNFR0E/PVZwb3FwcnV0d3p8e3x8fX9+fX19fX1+fX5+fn9/foB/f4CAgICAgYCAgIB/gIGAgX5SSEtNTUxLS05OUlVEQkBDQ0FBQkBCQ0BAQUFBQkBBb2N/hIWCg35pP0JDRUA/P05hX0pAQ0VJSUlJTU1LRUNGR0hFR0VFRUREQ0E/QD4+QkZKSkdERUZGRkpOTktKSUdHSEtMSkdHQ0REREVEQUJCQ0BDREVEREVERUZDQkFEZW9wcXF0dnV4e3x6fHx+f319fX19fn59f4B/f39/f39+gIGAgICBgICAgH+AgICAfVJJSUpKSEpKTE9SU0dGRUdIREdIREA+PDs+QEVGQ0p2gIKBhHuAhXREREVEQ1d1homKflhHSUpMTE1PT0xIR0hHSElJSEhHR0hIRUNFRUVFRkhKSkZFR0lKTU9PTU1LSktKTU5LSUhHSElIR0ZFRkZGREZIR0VFSEhGSEdIRlFubnBxcnZ2eXt7e3p9fX5/fX19fX1+fn1/f39/fn5/gH+BgYGAgICAgICAf4GBgIB8UEhHSElGR0lKTU5OSkxJSUpLTE5KRkNBQkNGSklJUXaBfICEgYOIcERDQVV0h4mHh4aHgldJTE1MTU5MSkdHR0dER0dHR0ZIRkhFQ0NERkVEREhIQ0NDR0pKS0xMTExMTElKS0pKSUlJSEpISEdISUhHR0hGRkZISklJSUlIXW9vcXJzd3d6e3t6e319fn59fX19fX5+fYB/f39+fn+BgIGAgYCAgICAgIB/gYCAgHxNR0ZIRkVGR0dKS0pMTUxLTU5NT0tJSEhKS0tMS0pVeIF+goSGhoeDVU5shIeGhoaHh4eHfFBLTEtIR0ZGREVDQ0BBQ0NDQ0ZGRUJAPj5AQUFAQkQ/Pj9ERkhERUdJS0lJR0hJR0lJSUpJSEZKSkpKSUpJSkpKRklMTEpKS0tmb3Bzc3V2eHl7e3t8fH1+fn19fX19fn59f39/f35/f4CAgICAgYCAgIGAgICAgICAfU9GRkdGR0hHRUZHR01NTUtMS0lHQ0NDRElLS0xLSlh9g4SEgYOHh4h9f4aFhISGhoaHh4aKdUlJRkI/P0A/Pz48PDw+Ojo8QUFAPjw5OTg8PD07Pjs5Oz9BQkFBQ0NDQEFCRURCQ0ZISUhISExNTEdJSk1NTk1KSktLSkxNU2xvcnRzc3d5e3t7fH19fn9+fX19fX1+fn5/foB/fn9/gICBgIGBgICAgYCAgIB/f39+UUZFRkdJSUdEQ0VGTk1MSklIRT85Oj5ARUhISUlLUXaEhoR+gYWDg4SEhIWFhoeIiIiJiYyOZkJCPTg4Ojo5ODc4ODk2NDc5Ozw6ODU2Nzc4OTc4NzY4OTs7PD5AOzk5OT09Pjs7PUFERUhKTUxMR0lIT1JRUFBOTE1NT1Fdb3BydHN1eHp7e3x8fn5+f359fX59fX5+f39/gH9/f4CAgICAgYCAgICAgICAgIB/f39RR0ZHSEpIRkVGR0hMTEpJSUdDQjU2OjxDQENHSUxIcYaFgX6Bg4KDgoOEhomKi4uLiomKi4yJVDs4NjU2NzY2NjQ1NzczNDY4Ojg3NjU2NTY3Njc3ODo3Nzc4OTs3Njg5OTg5ODc2OjxAR0ZJRklGRUZPU1JTU1JPUFBSVGVwcXN0dHd5e3x7fH1+fn5/fn19fX19f39/f3+Afn+AgICAgICBgICAgICAgICAgH9/flJISEhJS0lHSUpJSkpLREVIRUJANTc4OD06PUVDREt7hoSBgoODg4ODhYmKiomJioqKiouJiYqBSDY3NjQ2ODg3NDU3ODQ2NzY5OTc2Njc2NTo6Ojo6PDg5ODk3Nzc3OTo5ODg3ODU4OTtBPT4+QkE/QUtMT1FQUU9PT1FXa3JydHR1d3p7e3t8fX5/fn9+fX19fX5/f4B+fn9/f4CAgH9/gICAgICAgH+AgICAf39+VEhHSUlMTUtKS0tMSUg/QEFAPDo1Nzk4OTc7Qjo9TX6EgoOEhISEhIaJioqIh4iIiYqKjIqJiYx6Pjo4ODs8PT45Ojo7ODk7OTo7Ojk5Ozo5PT09Pzs7Oz06Pjs5Ozs8Ozw7OTs8ODo6Ozs5OTk8Pzw8QUJESUpNS0pLTFdvcnN1dHZ4e3t7fHt9f39+f359fX19fn9/f35/f39/f3+Bf4CAgICAgICAf4CAgH+Af35URkVGSUxOTkxKSk1CPzo7PDs4OTk4OTo6OTs/P0FKfYOChIWFhYaIiYiHhoaGiImIiYuMi4mKioxsPDs+QkNFRUFBQEI+QEJAQD89Pj5APz4/QD9APT0/Qj9BQT9BPz1AQEA+P0E8Pjw7Ojs6OTs/PTs7PT1BQUNBQkNBWHFxdHR0dnl7e3x9e31/fn9/fn19fX5+f35+fn9+f4B/f4CAgIB/gIGAf39/gICAf39/flJFQ0FHSk5PTElHSzo4Ojs5Ojo8PTo7Oz08PkBEQ1WCg4SFhIWEhomJiIiGhoaHiImKi4uLioqLiotePkRHSUtJSUZHSERGSEdFQ0BAQ0VDQkBCQ0I/QERIRUNFREVFQUZFRkRGRkRAQj49QD49P0A+Pz8/Pj8+Pjo7PTxgcXJ0dHV3enl6fX19fn5+f39+fX19fX5/fn5+fn5/gH9/gICAgICAgICAf4CAgIB/f4B+UERAPUNIT01HRkJEOTc6Pjo8Oz4/Pz89QT9CQ0dFaISDhYWGhoaIiIiIh4aGhoeJioqLjI2MjIuKiohXR0xMTUtOSklLSElKSklFQ0RGR0ZEQ0VGREJISUtIR0dGR0dFS0lLSUtLSkNGQ0NEQkFBQ0JEQ0NERENBPTs9QGhwc3R0dnd6eHt8fH19fn5/f359fX1+fn9+fn59fn+Af3+AgH9/gICAgICAgICAgH+AgH9PQT49P0RMS0BCQkE5ODw+Ozw7PkBAQT9CQkZGS0p1hIOFhYeIiImJiIiHhoaGiIiIiYqMjYyMi4uKjH9QTVBNS05LSkxJSUlISkZER0hISUVFSEZGRUxMTUlKR0dISUpOTU5MTE5LSEZHR0VFQ0ZGRkZERUhIRkNBP0BMbHB0dXZ4eXl5fHx8fX1+fn9+fn19fX1/f35+fn5+f39/f39/f3+AgICAgIB/gICAgICAf1FBPz4/RkdHPTxAQDk4PDs8PTo/QD5AQENESEhQW3+EhYSFhoeHiIiIiIiIh4eIiIiJioyNjIyMjIuKjXFNUU9NTExLTEpJR0VKSERKSEdLSkhKR0dHS0xOTExISElKTVBOT05NT0tJR0lKSElESUhIRkZHR0lGQ0JBQ1VucXV2d3l7eHl6enx8fX5+f39+fn1+fX5+fn5/f36Af4B/f3+Af4CAgICAgICAgICAf39/VERBQUJHR0I/OD9AOTo8OD0+Oz1BPj9BQ0ZISlRxg4SEhIWFhoeIiIiIiIeGiIiIiImJjIyLjIyLi4uLi15SUlBNTk1LSkdGQ0dKR0xKR0tPTEtKSk1NTE9QTkhJS0xPUVBQUU9PSklKSkxKTEZHSEdGR0lGRUVCQEJCXHByd3h5enl5eXp6e3x+fn5/fn59fX19fn9+fn9+f4CAgIB/f39/gICAgICAgICAgIB/f39VRUNFRUdHRUQ7P0E7PTw5QD4+QEJHR0FGSUlOVHiFg4ODhISGiIiIiIiIh4eIiIiIiIqLi4uMjIyMi4uNfFdWUlJUUk9MS0pFRUZLT05PV1ZRUE9RU1JOU1RPTVNMUFNVVlJTUlBMS01NTUtOR0dKRkZISkRERUVCRENjcXV5eXp6ent6e3p7fH59fX9+fX19fXx9fn5/gH9/gICAf39/f3+BgYCAf39/gIB/f39/f1VGRUdHR0dIRj5AQj0/PT1CP0JDRlZORUxOTVFWe4aEhYWEhIeIiIiIiIiIiIiIiIiJiouKioyMjIyOi4uLZ1ZWa2FFUlFRUEo7O1FTUmB1XVVWVFZZWVNZWFJaZlBVV1pdUlRXUVBOUlBQUFFLTEtHSElIRUZJSElISWpzdnl5enl6e3t8ent8fXx9gH59fX19fX1+f39/f3+AgIB/f39/f4CAgIB/f3+AgH9/f35+VEhKSUlHR0ZFPz9BQEVCQ0dFREVMWFJNU1RTVlh8hoWHhoWGh4iIh4iIiIiIiIiIiIiIlJyMioqMfWGKi4uHbFtkVTpYWFhTUD9AVlVZXGRgVllicl5dV11aVkVRWVpcWV9UWWdSVVZYVFRWU09PTUpMSklJTE1LT01Tb3R2eHl4d3p5ent6e3x9fH5/fn1+fX19fn1/f39+f4CAgH9/f3+AgICAgH9/gH+Afn9+fn5WSkpJSEdGRERCQT9ITUlNUEtJS1BUU1NXWVhaWXiFhIWFhYWGh4iHiIiIiIiIiIiIiImcnaCPiY5nO36MiYqLem5wWFpbWlJTUldWVFpadYNZVX2QYVxYXV5XSVZdXVtbX1lIWVhZXF1YWFlXUlFNUFFNTU9TUVFVUmFzc3Z3d3Z4eHh6e3t8fX19f39+fX59fX1+fn9/gH9/gIB/f3+Af3+AgICAf39/gIB/gHh5fVlOS0lJSUZCREBBOlBRUVdYUFBPUVNUVFdYWFlaboGCg4WEhYaHh4eHh4iIiIiIiIiIiJaanJeIioFuhomIh4OKf2ZZWVxZU1ZUV1JRV1ZjloBRZXJYWldfaFBgZlpbWFxoYkdPWmlnXFtcXV1XU05TUFBRVlZWVllab3N1d3Z2dHd4eHt7fH19fX5/fn59fn18fn9/f3+Af39/gH+AgH9/gICBgYB/gH1yfX9/b3R8XVNQT01LSkVDP0A7UFBaWltSU1FPUlJRVVJVU1dfdXiAhYSEhYaGhoaHh4eHiIiIh4eIh4ORjomJiIaFiIiGfYB7XFBWWFRSVFJRUUxPTUtmeVpdVFlVVl1aTFRaVFNUXlpYV1dXemtYWlxcXlNQUFBJTk9XVlhbWmRxdHZ2dHR2eHl5e3t8fH19fn99fX1+fX1+f39/gICAf3+Afn56eHd2c3V7f3+AgHRrfn5rcnleXFZVU1JPS0ZDREFNXoNsVlJTTk9RT1FVUlNSUlRjZHaAgoKDhISEhIWFhISDhoaGhoeIhn6JiYmHhoOHh4d5bXFWSUtOTktNS0hKREZIRUM+U2NVf1JQUU5LUlRRTU9ZUU1OUVNVVU1RU1JQTkxMSENJSFJTVFpdbXJ2dnVzc3d7ent7e317fX19fn19fX59fn9/f39/gH99fX5+f39/f4B+e3Zzd31+fmR1fWlxdF9kXV5bWVVRTElMSWFsknRQUVNOUVJRUltSU1JRUlVVYnN7fH+AgYKBgX99e3uAf4OChYaHgoaGhoGEgYaFhnVfXUtDPkNDQ0NCP0RQQ0NAQz5CSEdWQEhOTUddaVFIRk9GREVGSEdIQkNIR0hKR0RCQUNAT1BNUmR0dXZ1c3R1enx6e3t7fHx9fHt+fX19fn5/f3+AgIB/f3x8fX+Af39/f4CBgH12dHt/bWh8Z25xZmllZWJcWFNRUFVSc1dlW09PTkxRU1FVWVNVUVFUUk9WYGtsc3Z6e3h5dXJuc3RzeXh+foOAg4KCgIKAgoGBa0xHPj46Oz5APz8+PmpQS2FFRkhJRUI/R0xNR01RVUlCRT8+PD08PT0/PT9BQ0I/Pzw9Qj5KTUZVb3V1dnN0dnh7fHp9e3x9fX19fH59fXx+fn9/f4B/f39/enl3eHd2dnh7foB+fXt4dnx1YXhnbHBqbGppZmBbUVFaXFleSUpQUU5LTFFSUVRVVVdRUVdWUFhbYl1hZ21tbG9raGBucmptbHF1e3p9enh6fHx4d3hkQkBAQT06QkNBQUNBW1xPe05PT05LTE1PT1FMS0xXTUhHQEI8OTc3NTk5PTs7Ozg5ODk/O0FHPlx0dXV2dXZ3eXx8fH18fH19fX58fn19fX9/f39/fn9/f314dXd6e3p3eXh1d3t8eXh1eXdjcWhpcG1ubW1oZl5PUF5cWklHUFJRT01QUU5RUlNWWFNSWVROWVpbV1lcX19gZWBdXnF3a15gZ2t3b29sam9ubmxmYllHRkZIQkFGSUVFRkNMUU9hV1JYUVBTU1JVW09PUVZQTUlDRj46OjY0ODY5Nzk6MzY1Nzk1PEI9ZnR0dnd3eXl7fX18fHt8fX1+fnt+fn19f39/fn5+fn9/e3d1eX18enh8fHx8dHd2d3Z1d2tuaWhxbm9vb2prYFVXXlpXTUtUVFNQUVVPTFJTVFdZVFRYUUxYWVlWWFhWWFldV1dYaHNrXVZgdGthYV9dZGBfXllVUE1PTkxJR0pLSUhGQ1BPU1pXVFRNUVNZU1xlVU9TVFJOTElIQz9BOjk4ODk3ODg0NzU3ODU4OUducnV4eHp7e31+fX18e318fn5+en1+fH1/f359fn59f358dHR1e3hycW9vbnR4cXJzeHZ1cWZkZ3JucHBxbm1kXV9fWVdPUFdWVlNUVk9PVVZYWFlTVVRMS1RVVVVVV1BUVVdUVVJdbl5STllgW1ZZO0RVV1RbZkpMUFJST01NTk5OTEpGUFBVWVNUTkpOT1RTVFxWUlVTU09NTElISEY/Pz06Nzg3NjU5OTY3NjY1V3FxdHd6ent8fX59fnx9fXx9fX15fX18fn5+fXx8fX1+fXxydnF4eHJ1dXFxbnBwb3B1dnRuamRkanBwcXJwb2ZlZGNcXlJUWlZXVFNWVFJYWFlZWVJVT0pHUFBPT01SSk9QUFBOTk9UTE1JUFBTVFUyPFhNSUFRPWNgUVNRUE5QUVBOTk1QTlRSUFJMSUxLT1FQUVJTVFFTT0xNS0xMSENCQT06OTg3NjtCNDU2NjtlcHJ2eHl7fHx9fnx9fH19fX18e3h8ent9fX58e3l9fH18e3B1b3d1cHV0b3N2cHFxcHV1dmNqZ2VXaHRycnFuaWlocFZWVFVYVVZVUldWVVpZWFdVUVNGRUFGR0dIRkpESEpIR0VITEhLSUdMTVBNRy9FX1I+M0A+am9hUlJRQEZUUU9QUFFOUU9QT0xKTExPUE5OUFFRTlBPSk1NTUtHRUVEQjs9PTw5PUc2Njc3RG5xdXd6e3t8fH18enx8fX5+fXt5dnh3eXl8fXp6dn17fHp6b3Fud3JwdnFtcHNwb3Bzc3N0ZmdgaFpXa3JzcmxtbWtuYmVQU1RSU1VPV1ZWWVlWUVFRT0A+Oz0/QEJBQ0BCRURBQEdIR0hGRkhKTUxER0NPUkM4RU5TXWdTUVNBR1VQT1JRUE1NTkxKTEtMTk9PUU1PT01JTUxJTEtMS0dGRkVEPEFBPjtARTs8ODlUcXN1eXt7e3x8fHt5fHp6fn58e3V0dXJ2dnp6eHpyfHt8eXltcW94cnF1bm5xcm9vb3Rzc3J1dGtnZ15lam1wa25xbWltY0xPTk1RU0xUVVRXV1VMTEtIPTk4Nzs/QT89PUFAQj0+RUhGREZGSUdLSkBGQUFARkhFSk9IUVJhXFFQUk5TT09QTExPTUtNTE1PTltWS01RT0hKSENJSkxMS0ZGRkU/Q0M+PUJHP0I+QWRxdHd7ent7fHt6end8d3l9fnt7cXN0cHJzd3R4eHN6e3l2d2xxb3ZxdHRsb3Fybm5vc3ZydHNycmtsZW5zaG1ubWxtbGprSUxISE9RSlFTUVRTT0tIQ0U9OTg3OT9CPzs/QUBAPkFESUVDSEdJR0lFQkI/PjxDQkFHSURNT2FlUE1PTldLTE5LTE1NTExLTk5TZE1KTFJISUpGQUlKTE1OS0dJRkJBQkA/RUZFSERMb3B3enp5e3t6fHp3c3h0eHx8eXpucXJtbm9ycnZyc3h8eHZ2bXBtc3B1dGxwcHJvb29ydnVyVlZucWdseYRqbXFybm5qaG9ISkNHTExJTVBNUE9HS0U/Qj05OTk6P0I/PEFCQkFEREdLRkRJSUdHSENDP0I/P0BBPkNFQ0tOUVRLSklNVEZJSUpMSktLSUpMTU9QUlBLR0NMSERDSkpMTU9NSUpJR0NDQ0RJSk1MSVpzbXh5eHp7e3l8dnJwdXJ0eXl2eGpxbmpsbG50dG1zdXtzdHhyb25xb3ZzbnBvcnBvcHN0eWpOYGdzanR8eWdvc3FpcWhlcUhLQ0ZHR0dKS0lKTERHQj0+PTo6OjtBQj89QkJDQ0hGSkxKRUlJRkdHQ0M7QUBCPkBAQ0VDSU1PR0hLRkhLREhJS01ISkxISUpMSk1dUklIRE5HQkVLS05NUE5LTUpLRkdHSk1OUU5MY25pd3Z2e3h7en1xbWxza3B0dHR1aHBtamlra3RwbnR0eXByeXRvcnFvd3NvcXB0cnBydXR5a05WbXVscXt2aW5vaWp0aGRwRktDRkVGREVFRkVHQ0NAPjw9Ojs6OkBEQD5CQ0VFSUZKSkxGSUlHRkZDQjtCQ0M+QENDQ0VHTE5IS05IREhFSUxOTUdJTEdGRklJTE5LSkhFT0lDR01NTk1QTk9PTUxJSElPU1FSTlJmZ2Zyb3N4dXt6fGxoam9la3Btc3FmbWxoaWtsdG1wdXR3cW94dG90c3J2c3BxcnRzcnR1dXZ2WFZ1dWtvdHJrb3ZsaG1lX3BHSUNFRURCQ0JFQERCPj8+Ojs7PTs9P0NBP0FDRkdKR0pJTEhHR0dGRUNAPUVFQj5BRENDRUdJSUdNUElGRkdLTk9LRkhJRkVERElJSEtJRkhQS0RKTUxQTk9OT1BOSkpJTVJVVVJPV2RhYW1ncHJvc3l6Z2VoaGNpbGdxbGZsbWdpa2xzbXB2dXRwbnZyb3Nyc3V0cXNzdXRzdXZ2dnl2dXR2bGt1dW1ydnFsbmxlck1HRUVHQ0FBQkQ8QkE+QT06Oj0/Oz4/QEI/QEJFR0pGSUdJR0ZGRkVEQ0FBRkZDQkJCREVFR0dIRkxQTElPSkpMS0lHSEVGRURDSUhIS0pHS1JNQ09PTlFQT09OT09LS0tQVVdWVVNYX15daWFtaW5ocnNiZWZmZGloZm5pZm1taGtrbXJpcXZ1c3Ftdm5vcXJzd3Nyc3R1dnZ2dnd2d3Z2dHd1a3N1bnV0c3Bya2tzTUZHRUdCQkFERDxBQUBDPDg5PT46Pz0/Qj9AQERGSEVIRkZIRkVFQ0NFQkNJRkNHRUFFR0VGRkdFSk1LSFFNSktISElFRkhIRUNJSUpLTUtQU05EUlNRUVJOT05OUE1MTlNXVldYVlhdWl1kYGhiamlna19kZWZjZ2dna2dna21rbWxwcWd0dHVyc252b3FwcnR4cXNzdXZ1gpF5dnZ0eHV1d3hub3VvcnN1cXFpcHpNR0dHSEJCQkZFPEBDQkQ8Nzo9Pjs+OkBCPj8/Q0VGREZEREdFQ0VDREVGRkpFRUlHQkdIRkdGRUNGSkpHTUtMS0hKTEZJSEpIRUtLTExOT1NUT0lUVVRRVFBRTU5RTk1RV1pWWllXWl1aWGFgYGBfaGVjYGRlZ2dqaGhqZmhubGxvbXFwaXV1eHJycHVwcHBydXZwdXN1dnV7fn14dnR3dnZ2d3BsdXBtc3Vub3NzeU1ISEdJREJDSEU8QEVCRDw4Oj4+PDw9QkI9Pz5BQkZDRUJCSENDREVGRkdHSUZHSkhDSUhHSUdGREhLSUdLSU1LSktMSExKTUtJTkxOTk9SVVZPTFZWVFFUUVJMT1FQT1RZWllcWlpcX19eYGNeXGFja2JgZGdocoVoZ2lmam5ucG9uc3FqdHV4cnNzdHJucHF2cnF0cnV1c355jn11dXZ2dnZ4cml1cWtydGxxd3F1S0lLSEpFQkVHRTxAR0REQDk8PkA/Pj9DQjxAPkFBRkNFRENIREZERkZISEZIR0lLSkVKSEhLSEZGTEhISEpITUxMTExJTUtNTk1PTFBQUVVWV09LVlZVU1NSUUxPUlJRVltbXV5bXV5gYGFgYmVdZGBlZ2BlaGpjc3NmamhnbHBycW9zc25zd3dwdXZ0c21vcnVvcnNwdXJ2cnSBd3V1dXd2dXdzZ3Rya3Fya3J3b3dJSkxJS0dCRURFPEBGRERCOz8/QUBAQERBQEI/QUNIQkVERkdFSUVGRUlIRklISkxISEpKSUtKRkpLSElKSkdLS01NSkpNTE1OTk9MT1BSVVdWTU5UVlVTUlFQTU5UU1JXW15eX11eYGBhYWFgY2RlYmNpY2Rpamd2i2xraWhtb3NxcHFwcHJ5d3J1dXRzbW1zc21xcm90dXRzcHN3dHV1d3Z1dXVlcXNrcHFqcnZwd0pNTExNR0NDQUQ8P0VFRUM9QUFDQkJDRUFDREFBRUdDSEdIR0ZKRkRHSkdHSkZJTEhJSk1KTUxHS0lIS0tOUUtSUUxTTUtOTU5QUFBUT1dYWFtOU1FXXFpTVlBOVFVUVFhaX2JiX2RhX2BiX2BlYmFjaW5pY2loaG14dmxoaW1vc3JwcXJycnZ0c3Vzc3Nua3NxbXByb3R2cnJxdXZ1c3d5d3V0dWNtdGtvcGpxdHB3TE1MTExHRUFARD4+REVGQz9DQUVDREZDQ0VHQ0JJRUJISklISEtGREtKR0hKSElLR0pKTktOTElMSEpNS1pmSmRcS2xSSE9NX25VbHNbcXBid2NSUGJ2dWh1Y2F2YFhucWJkdmluemZcbHRgbGtVX3d2aWpoaGZnbG1qbW9qbW5zcnBycnFyc3Jzc3J0cm5sdG9ucHFxdXVxcXN0dnZ1dXl3dXR0YGt0a3Bwa3FzcXlLTkpLSkZCP0BCPz1ERUZDQ0NCRUVERkJGRkdEREpFRUpMTEpMTUdHTUpISktHS0pJSkpOTE1NTExJTE1MW3NiZHBebGxVTU5mc15nZnFsbnRncGlfYVlubWJwcGJrampnb3F0ZXRub1xvdWdwTUtyeXZrYmFrZWVseG1rdmxucHNycHJxcHFycXJycnRybW1zbm5vcHJ1dHFzc3R1dXV0d3h2dXRibXVrcHBscnJxektMSUlHRUQ/QUI/PUJFR0JGQ0VERUVEQ0hIR0RFS0hHS01NSk1MRkpOSEpLSklLSkpKS01NTk1NTUtOTU1bcm9vbnBwbGtOUFFsWE5pYnRycGFtb3ZcWWxQW21tWnFta29teHh0c2lwXGBzbHFqVXV5eG9jXmtmYmdwcGppb3BwcnNwcXBxcXJycXFycnRsbXJtbW5vcnV0cXRydHV1dHV1enZ1dGVudWtwb2xzcnJ5SktHSEZFRUJBQj0/P0VHQkdESUVFREJGSUhIRUdLSkdNTU5LTU5HTE5JTUtISU1JS0pKS05PTk5NTE5NTFxoZHVdbHFXbE5QUW5VWmtea2x2YWxkdFRlY05sWWxcdHBraWx4and1aHBdX3NraFdiY3d8b2NgZ2hhZGl0eWtvbnFzc3BxcHFwcnFwcHBydWttcW1tbW9xc3Rxc3J0dnZzd3Z6dnV0aG91bHNvbXNydHZJTUdJRUVEQ0FCPEJAQkZDR0ZLR0VDQ0hLSEhGSkxLRk1LTFJSTEdNTUhOSkhITkhKSklITk9OTkxKTU1KWnNwcG9xcW1sT1FTb1lxa2dvb3Fxb210Xm5YYXRfbm9wb3Fyb291c3R0altedGN3eHJqbnpoYWFjZmFiam10dXBzdXZzcXBwcW9ydHt/fn13bGtxbmxtbnByc3F0dHN1dXR4eHl5dHVrb3VtdG9udHN2dEhLSEpDRUVFQEA+Q0NBRkNISk1JRkNGSkxJR0ZLTUxGT0pLV1JLR0tKSk5JSEpMSUtKSUhKTE1NTElLS0tTa2JaaV5famNyclpfWmpvYGVlVWtfY1thYlFgbWhcalxuaWlkW3BmZHBdWlxrW21xY3BzbGRnY2RnYGBrbnBwb3R5cnVxb3BxbnmFiIeHhoWAdnNua21tb25xcnR0cnR1dXZ5eHhzdW5xdW52cXJ1dHdySEhGSkRFREZBQEFFRENHQkhKTEdGQ0ZLTElFRkpPTElPSUxbUUpGSEhLTUlISklLS0lISUdLS0tLR0hKSkxMTEtJS0xOVFtdVFBVTVFQTk9PVVJQT1FPT1FKSk5QUWRxaVRZV1tbXFVZW11YXVxcY2ZhYWZiY2ZfX2ZrbWhtdHlydHJvcHB0hoeGhoaFhYaHg3pwbW1sa3FzdHRydHZ0dXp5eHV2cXJ1b3ZydHN1dXNHQ0VHRkZBRUM/Q0dERUdDSUtMSEZER0pMSERHSVBLTE9LTFdNSUZFSElKSElLSExKSEZISEpHR0lFRktISUtOTElPXFdeT1xcYF5PWFlTXFxiXk1ZWk1YYVJLWWFaU2BkXWJYW2RkVlZYXFlaWFxWWVxeY19kYGFfZWhrZ210dHFxdHBxcoGGhoaFhoWFhYaGhoR9cmtpb3Jzc3N0d3l5eHl4d3h0cXhyeHNxcnVydE9CQ0RMTUJDREJESUVHR0ZLSktIRUVKSkpGRUhIUEpMTUpNUklIRUFIRkpJS0tJTEpIRkVKSEVGR0VFSkdCSk1KS1RfWWBYYGFbYFVYWVReXlpfUllcUF5cWU5fXF5TW15jX1pdYGNgWV9iW2BeW1RZWFpfXmRiYmFjZmlla3Jwb3Bwbm53hoaFhYaCe4CFhYaGhYaFf3VxcHJyc3Z5eXp5eXh4eHdyeXZ4cnF4dnR2YVNKSk1JRUNCQ0ZHRUdHSUpKSUlERktLS0VGSUlOSk5MSExOR0hGPkdHTElLS0pLS0lHRUlFRERFQkZKREBKS0pPW2NZXl5hX1JUU1dfYFxdWV5RWVxNVl9XS1FZW1FbX2FhXV5jYWBiYmJjY2VaUlhWVlxbXmNgX19jZWJob21tbGxsbHWFf4SDeXV8hIWFhYaGhYWGhoN9d3JydHd5eXh5f359eXV5dnZybnp3dnhYUUpGQ0dFQkVHSEZHSElGR0pHSEZIS0lMRERKSk1NTExISkpISkc/R0ZOS0tLTUtLS0lHSEREQERBSElBP0lKR1BdYVpbZF1fVFFSWF1cXFxfWktXXExSXFlJTV5RUV1fYWNjY2NiXGRjYmRjZlhRVlVTXFhbYV9eX2FhX2Rsa21qa2xudn51gXp8hIWFhYWFhYaGhYaFhYaGgnpyc3V1e4WHh4eGhYSBfnhwend2eFxSTUJASUZDRktJRkZHSUdHSkZGRklMSk5FREpKTE5KTElLSklJR0JISFFNS0tPTEtLSUhHRUQ/RUJISEFBR0ZEVF1ZXlhfWF9bXVVYWFBdXVFLSldeWF5bXVZaYVJSX19iYmBgYmJgY2JiZGRiWE9SUVNcU1xeXV5eX19gZGhnbGpubnB7e3x+e4CCg4SFhYWFhYWEhIWDhISHh4FzcneFh4eHh4eHh4eHh4WDgHx4XFNLQkFHRkRHTVJIRFJLRkhISERGS0pNUEVHSUpLTkxMSUxLSUlHREhLUU9NTFBMTEtLSElDRUFFQ0hHQkFGRUJWVUVcVF1TVmBYTlRVTlpbTUpLVWBhW19YX15iXU9ZYlxgYF9iY2JdYmJXX19UUE9QUVlTXlxcXV1eYGJmZmVsZm9vd3x7gHt9f4CEhISEhIWFhYODhYKDgoWFhnpvgYaGhoeHiIeGhoaFhYSFg35JTkZERkZHRElSY1FEV19JR0dIREZNSlBQRkpJSktOTExLTUtKSkdFSk5RUU5PT01OTU5IS0FEQUNERkRDQURFQUxIQ0xMUE9PTUZNRkZISkhHTExNT1BJTE9QUFNQTFFTUlVaWVdZWFhkVk9TVFBQT05RVVRcWVlbXVxhYWVmY2hka2xxc3N6eX97en+EhISEhISEhIKEgH57gYOBfXuFhIaGh4eHhYWFhISEgoGAfUtJRUVHRkdES01eTUdIWU1ISEpIR01MUVFJTEpLS05NVU5PS0tMR0dLUFNTTlBPTk9PT0hMRmBFRF9MRGZjRE1bSF5cc21PTVZtWUxDUF9VbFdnSl1XVV5ETFFVTE1TVlFSVFhXVFhVVFxUUGZaaGhkWVRrVFhXVVtcW2BgYWJiYmBnaWdubGhyenx9foGEhISDg4ODgX19enJ7gXp7f4KAg4SEhYWBhIWBg4N/fnp7TElFRkZIRUVLT1RKS0dgVEhKT0pJT01SUUtNS0xPUlVST09KTE1HSE1RW1lPUFBOT1BQSktRf1FJfFlZcnNXUG1IcW5vYVZQcXF0T0Jrc25xdHBTb19bblhdVlxYVWtoVV1WY1lgWVpfVlVXf2p0dXVfYXZfWWNcXGZbX2FhYWJeYGJnbXBsYHB3dHiBgYKDhIJ/fX6Adnh6bXZ+dHh+gHx+gIGChHyAg3p/gX9+d3dOSUVITU1CRExMR0pMRlJWTExPSEtSWFdRTk9PTFFUTk9RUEtLTkdNUFNbWlRRUk9QUFBLSFp4XVR4ZGhZUlNQdmd0bHBibmZrUnJPTHdtanJwc3JxcnBvcIBdZnp1eHFxenF+cn1rdX1iUmh8ZXNzb3NzfH1wfnlvf3JfYGBiYlthYGhrbmtibGZnbXd+gYCDfnt4d4B0dnpocn5udHx+d3h7foCDeHyBdXx/fHxzc05LRmBdR0FFTU1IS0tIS1FPTU5KTlZeWVVMUVNOWVlMU1NSTkxQSVFSVFlXV1FUUFBRUktHZ3hsY3hxbVpLTFR5cHVtdWJudlBkZUlldnFtd2+AamZ4eGlYclJpe21panp6fmx4en9wZ29YdnZqdnVwgGFzaH1pbHh8b19fX2NiXF9kZWZpamRnYmNkbGxwcHN0c3NzeXFyeGJsdGdyeXtzc3V5foFzdXpufH15eHJuTkpSdE5DQkVQUEhLTEpMUU9PT01QWmBaWEtUV1BhXlJWUVlTTVBKU1RVWFdXUFVQT05TSktyb3V1cXVxZGhhVm5McXBeR2h5V3ZUS2h5fXhgeXtzbmFebW9kU2dydW5teXB3bHZzdHFsbVxzfnprbXl8bHVtfGtwdnV4Xl9fYl5dX2VkamhoZWVeYmJpaWlqa25va3FubWpwYWNmZG93eG9tcHN5f25xcGp7enRyb21MS1pWSEdFR1JQS0xOS0xRUVBQUFFXXFlVTlZZVWZYUlJZXlRNTkpUVFZXWVdPU09OTlFJUm1IaXdLYGR2dVVXbE9ubHtyYWpnf3ZVS1draH1sbWx4YFtwentfYHpzY3JveHFoZHxpcntdVEtsX3Z1a2l1e3ttfnhrfHBdXl5iW15iZGVoZmVlYlpjY2lra3JzcndnbWloZGdgYWxhZ3Nya2htbXJ8a21oa3t0bW1rbU9HSktISkhIUlFNT1BNTFNTUk9TUldSVlRQV1pWVlRUVGFgUU9OS1RTU1FWVk9PTU5PUEpIUU5QVUxLS1JTUlJUUFZVUVFPUlJYWFFOUFVUWFhYW1tVU1NXW1dYV1pQU1VXV1hRXVhWXVVTT1hSVldXWFpgW2dyXltcW11dX2NaX2NjZWdlY2NiWmNjZ2ZmbW5tdWZmZ2NgZl9dZ2BkbGhmZ2tocHpoZ2drdWpoZ2lsUElLS0xNS0pUUk1SUVBMVlZUUFRVWFVaVVJaXVZVVFdVWVhQT0xOV1VRTlVTTlBOTFFQS0lRUUtRTUtLT1FUUlFRU1NJSU1OT1FSUVFRVFZSWFdcV1NTUFJVVVZUWlFOU1JXVVRZVlRZVVNSVVNUVVhYV15aX2FdXFtaXV1gY1xdYmJkZ2VlZWJZYGFjYWJoaGluY2FkXl9jXVpkXGJtYV5mZmdtc2RpaGtrZWRkZmhRSktLTk9MTVRRT1RRUU1YV1VUVlhXV1pWVFxgVldWWVVYVFFQS09YVFFOVVBOUU5LU1BNTlVTTlJOTU5RU1BUUVNUVU5MTk9RVFRSUlFWV1VZWltZU1VSVFhXV1lbU09TVVdVVFlVVllUUlJXVVZYXFlbYF1WWV9dXl1cXWBhXltiYmNoZmVlYlhgYGJdYGhlZmRhXl9dXV5aWl9aX2dgXl5dY2hrYWhmaGZkYGJkYlBLTUxQUUxPVFBQVFFPUVpZWFdZWlpYWVZdamRWWFlaV1ZUVE9LT1dVUE9UUFBRTk1RUU9SWFNSUU9NT1NVTldRVFVVT05OUVNVVVRUUlRYVlpdXFpWVlFSV1hWW1xWUFNWVVVWWVRXV1RSUlhWVltfWl5gX1ZfXV5gXFxgYF9fWmJiZGhoZWViWWJgYl5eZmRjYGJdXFxcXFlaW1hbYVteXV1fYl9fYmRkYmRfX2BcUE1OTlJRTVJTUFNUUU9VXFpaV1tbXFlaW2RxbWhkX1tZVlZYUk1NVlNOTlJQUlJPTFBTUlVaVVRQUExQV1VRVlJTU1hNT1BRVFhVVVVTVVlYW15dXFtWUk9VVlZbW1dRU1dVVlhVU1haVFNRWVdXXV9bX19gVmJcYGFeYGJfXGBdY2FjZ2llZ2FaY2BhX19lZV9gY1taXFtcWlpZWVdcWVxbYF5fW15eYWBfY1xZYFpRTk9OVlFQVVNQVVRTUFdcXFxZXlxfV1xeanB3eX9jXFtWVllSTk9XU05RUlFTVFJMUVRTWVtXVU9STlNYVlNSVFJSWk9RU1NWW1ZWVlRWWlhdXlxcXlZTTlRWVltcVlFUVlZYWVJTWVxUUlJcWFpdXl1hYWBXYltjYl5hY19cYmFiX2RnaWRoXlxlYGFgYWNkX2JfWVpfW1xbWVhZV1daW1phXV1bXVxcWl1gV1tbWlBPT09ZUFVVU1JXUlRQWl1eXVxgXGBVXF1oanJ9cmxoXFVZV1FPUltTUlFUU1VVVEtSVlVaWlpTT1NSVVVVU05WUlNaUlRVVFhdV1hYU1hcWF5dWVteVVVOVldXXlpXUVVVWFhYVFZYW1RSVl1ZXV1hXmNjX1lgW2ViX2RkXl5jY2FeZWZpZWdeXWRhYWFiY2RfYl5YW19bXFtYWFhYV1taW2BdW1tcW1haW15WXlldUE9PUlpQW1VVV1ZUVFReXmBfXmJcYFVdXmJreXRsfWxaVVpWUVFUXFRUVFVVVllXTFJaVlxaXFJQVVNXVVVTT1dSU1dTV1ZWW11YW1lVWl5YX15ZXFpSV1JZWFlgWllTVVZaWVpWV1lcVVRaXVxeYGFgZWRdXl1dZWFiZmReX2RjYFxnZGhmZWJfZGFfYWFiYl9gXldYXlpcXFpZWldWXVpdXltaW1xbV1lcXVZYV11TT1BXWVBdVVZZV1dVWF9gYWFgY11gVV1eYmVldoJ7aFhZWlRWVFZcWFdXVlZXXVhPVVxZXl1dVFNYUldVU1JTWFJTVlRZWFhdXlhdW1VeX1hfX1hcVlFZVVlaWmFYXFVWV1paWlhZWVpYVl1eX15jYmJlZV1iXGBmYmVmZF9gZGJiW2ZiaGZjZmFmX19hYmFhYF9eVlVdWVtcW1lcWVldW1tbWFhZW1laWl1fXVRZXVVOU1pXVFxVVldZV1ZcYGFiY2FjX19WW2BkYV96dW9oWlxaVlhWWFtaWVxaWFlgVk9UXVtgYVxVVVlQVFZUUlZWUlNVV1tbXF9eWl9cVl9fWl1eWV5WU1lYWlldYlleVldaW1tbWlpZW1lZX19gYGRjZGVlYmRaYmZjZ2ZlXmFjYGNeY2NpZWRnX2deYmJjYWFgXl9YVFpaWltbWFxYWFxbWltXV1pYV1xbXGBdVl1dU09WWlZWWlZZVVhXWF5gYmFkYWRhXllZYWRiYGtmaF5cXVtXV1laXFxcX1tZW2JWU1deXWFjXFNWWVBWVVVVVlZTVlRYXV1fYGBdYV1XYF5bXlxbXlhWWFhbWl9fW19YWF1cXV1dW1pcWFpfYV5gZGNkZmZmYlljZmVoZ2ReY2FfZWNdZmlkZWlfZ15jYmNhYWBfX1tYWVtZWlpYWlhXW1taW1dYWlRZXVxaYFxVXmJNUldZVldaWVtcWVdZXmBiYWVhZGFdXlliY2JfYWBhX11dXVhXW1tdXV9fXFpdY1hZWF1gY2RfUllZUFdWV1hYV1ZXVl1dXmBhYV9iXllhXV1eWV1eWVhVV1tbYF5dX1lZXl1eXmBbWlpZW19hX2JkZGVmZ2diWmRmZ2lnY19jXmBmZVpoaWNmaWNmX2JiY2FgYF9dXVpXW1lZWFhaWVdaW1pZV1hWVVtdXV1gYGJieEtXV1xZV11cXF1aV1xdX2BiZGJjYV1gWGJjYmBjYWNeXF1cWFdbXV9dYF9dW2BkXFxYWmNlY2FSXFlPWFZZW1pZV1paYF5hYmJgYWNfXGJdX11bX15ZWVRYXV1fX15fW1peXmBiYlxcV1tdYGJiY2VkZ2ZlZ2RcZWZoaWZjYWJcY2dgXGlpYmhpZmVgYmFjYV9gX11dXFlcWVhXWFlZV1xbWldWWFBYWl1hY2Zmcmt/SllXXVtaX11cXlxZXVteX2FjYmFhXWJbYmRhX2NiYl1cW1pXWGpxYFxgX11cYWNfXllZY2VkYlRfWlFZV1xdXFtaW1tjYGNiY2BiZGFgY15gXF5fX1pYVltfXVxhYV9dW2BhYmViXlxTXF9gY2RkZmVnZmVmZV9mZmhoZ2RkYFtmZ15haGhiaGhmY2BiYGNiX19fXV1bWltZWFhYVlpWXFpaVlZVTFhXXGdpa2h1eIF2dnZ2dnZ2dnZ2dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6e3p6ent7e3t7e3t7e3t7e3t7e3x7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHt7e3t8fHx8fHx8fHx8e3t7fHx8fHx7e3t7e3t7fYmIhoqHhYKBgoOCg4OCgoKCgoKCgoKCgoGAgYCBgICAgYCBgYGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t6e3t7e3t7fHx8fHx8fHx8fHx7e3t7e3t7e3t7e3x7e3t7e3t7fHx8fHt7e3t7e3t8iYmHiYaFgoGCgoGCgoKCgYKCgoKCgoKBgYGAgICAgICAgIGBgYB9fHx8e3x8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eHh5eXl5eXl5eXl5eXt7e3t7e3t7e3t7enp6e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx7e3t7e3t7fHx8e3t7e3t7e3t7fHx8fHx7fHt7e3uHiYiJhYSDgYKCgoODgoKCgoKCgoKCgYGBgICAgICAgICAgYKBgH58fHx8fHx8fHx8fHx8fHx2dnZ2dnZ2d3d2d3d3d3d3d3d3d3d3d3h4eHh4eHh4eHh4eHh4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t7enp7e3x7e3t7e3t6ent7e3x8fHx8fHx8fHx8fHx8fHx8e3x8fHx8e3t7e3t7e3x8fHx8fHt7e3t7e4aJiYiFhYOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgIGBgYCAfnx8fHx8fHx8fHx9fX18fHVwb29vb3Bwen59fX19fYSMi4uLi454KSkqKiopKz0/Pj4+Pj5tgH5+f397pdfT09PT1r2GiYmJiYiNsbW0tLSztZWHiYmJiYqMjY2Njo6OiX9/f39/f359fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx8fHx8fHt7e3t7hIuHh4aHgoGDg4GCgoKCgoKCgoKCgoGBgYCAgICAgICAgYCBgIB+fHx8fHx8fHx9fXx8fH19dXBub29vb296gH9/f39+hpCPj4+Pk3kZGhoaGhocMTMzMzMzMmqCf4CAgHut6eTk5OToyomMjIyMi5G7wL+/v7/BmoqMjIyMjI6Qj4+QkJCLf39/f39/f319fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e3uCjYeIh4eDg4SCgYKCgoKCgoOCgoKCgYGBgICAgICAgICAgICAgH58fHx8fHx8fXx8fH19fX12dXV1dXV1dXZ3d3d3d3d4eXl5enl6eG9vb29wcHBycnJycnJyd3p5eXp6en6Dg4ODg4SBfHx8fHx8fYGBgYGBgIF+fHx8fHx8fX19fX5+fX18fX19fX19fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e4CMhomHh4SDhIKCgoKCgYKCg4KCgoGBgYGBgYCAf4CAgICAgICAfnx8fHx8fHx8fX19fX19fXZ2dnZ2dnl3dnZ6e3h7eHd2eHt3enp6fnl4eHl4eHh5eXl5enp5eXl5enp6eXh4eXl5eXl7e3t7e3t7enp6enp5enp7e3t7e3t7e3t7e3t7fHx8fHx9fX19fX19fX18fH19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8f4uHi4qIhIODgoKCg4KBgoKDgoKCgYGBgYGAgIGAf4CAgH+AgYF+fX18fHx8fHx9fX19fX19d3d3dnZ3fXh3d316eH14d3d5fHt8fHp9end3d3d3eHh4eHh5eXl5eXp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fHx8fHx8fHx7e3x8fHx8fHx8fHx+iomMjImFg4SEgoKDgoGCgoKCgoKBgYGBgYCAgICAgICAf4CAgH19fXx8fH19fX19fX19fX13d3d3d3p9eHt4fHx3e3h3d3d8e3x9eX15d3h4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fX19fXx9fX19fX19fX19fX19fHx8fHx8fHt7fHx8fHx8fHx8fH2Kio2NioWDg4OCgoKCgYGCgoKBgoGBgYKBgIGBgICAgIB/gIGAfXx9fX18fX19fX19fX19fXd3d3d3fX55d3d4e3p8eXd3d3p8fHx6e3p3eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt8fHx8fHx8fHx8fHx8fH19fX18fH18fH18fHx8fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8foqJjo2JhISEg4KDgoKBgYKBgoKCgYGBgoGAgYKAgICAgH+BgIB8fH19fX18fX19fX19fn5+d3d3d3d5fHl7eHx9eXt5enp6fHx9fHt9e3h4eHh4eHh4eXl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt7fHx7fHx8fHx8fHx8fXx8fX19fX19fXx8fHx8fHx8fXx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx/iIeNioeFhoaDg4ODgoGBgoGCgoGBgYGCgYCAgoF/gICAf4CAgHx8fX19fX19fX19fX5+fn53d3d3d3Z4eHl3eXp4enh5eXl7eHp6eXt5eHh5eXh4eHh5eXl5enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX18fH18fH19fX19fH19fX19fHx8fHx8fHx8fHx8fX+HiIyIhoeHhIKDhISCgYKBgYKCgoGBgYKBgIGBgYGAgIB/gIGAfHx9fX19fX19fX1+fn5+fnd3d3d3d3d3d3d3eHh4eHh4eHh4eHl5eHl5eXl5eXl5eXl6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fHx8fX19fHx8gIeIi4eHiYaDg4SDg4KBgYGCgoGBgYKCgYGBgIGBgYCAgICBgX97fH19fX19fX19fn5+fn5+d3d3d3d3d3d4eHd4dnl5eHh4eHh5eXl5eXl5eXl5eXl5enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fH19fXx9fXyBhoqKiYmIhIOFhISCgoGBgYGCgYGCgoGBgYCAgYGAgIGAgIGBf3x8fX19fX1+fn5+fn5+f394eHd4eHh4eHZxZGpeam15eXl4eHl5eXl5eXl5enp6enp6enp6enp7e3t8e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIGFiYqJioeEhYWEg4KCgYGBgoKBgYKBgYGBgYCBgYCAgYCBgIF+fH1+fn5+fn5+fn5+fn9/f3h4eHh4eHh5bWRiZV9fXm95eXl5eXl5eXl5eXp6enp6enp6enp6e3t7e3t7fHx8fHx8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goWKiomJhISGhYSDg4KBgYKCgoGBgoGBgYKBgIGBgICAgICBgH58fX5+fn5+fn5+fn9/f39/eHh4eHh4eW5kZWdlZGJeZnh5eXl5enp6enp6enp6enp6enp6e3t7e3t7e3x8fHx8fHt8fHt7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChouJiIqEhYaEg4OEgoGBgYGCgYKCgYGBgYCAgYGBgIB/gIGBf3x8fn5+fn5+fn9/f39/f394eHh4eHl3Z2VkZWZkZWFfaXl6enp6enp6enp6enp6ent7e3t7e3t7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHt8fHx8fHx8fHx9fX19fX19fX19fX19fXx9fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4eJh4SEhoSDg4WBgYGBgYKCgYGBgYKBgICAgYGAgYCAgYF+fHx/f35/f39/f39/f39/gHl5eXl5eWtlYWJlZWFlZV5ieHdze3p6enp6enp6enp6e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fH18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19g4aLhoiFhYaEgoOEhIKBgYGBgoKBgYKBgYGAgYGBgYGAgIGBgn98fH9/f39/f39/f3+AgICAeXl5eXl0Y2NlZGNmY2doZGZsZF5ze3p6enp6enp6enp6ent7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn6DhouGhoaGhYODg4SDgYGBgYGCgoGBgYKBgYCAgYGBgYCAgYGBfnx8f39/f39/gICAgICAgIB5eXl6d2RhY2diYmRdW2VfYV1eYGFoeHp6enp6enp6enp6e3t7e3t7fHx8e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+foSFi4eGhoaGhIODg4KBgYGBgoKCgYKBgoGAgIGBgYGAgYGBgYF+fX1/gH+AgICAgICAgICAgHl5eW9vYmJiZF5jZ19dYWFgXF9kYlttfHp6enp6enp6enp7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7fHx7e3x7fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5/hIiLhoSHhoaEhIODgoGBgYGCgYGBgYKCgYCAgYGBgYGBgYGBgX5+fYCAgICAgICAgICAgICBeXpwXWJlZGJkXmZnZ2BZYmJhY2VfXF1ze3t6enp7e3t7e3t8fHx8fHx8fHt7e3t7e3t7e3t7e3t7fHx8fHx8e3x8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fn19fn5+fn5+fn5+fn5+foCFjIqEhYaGhYODg4SCgYGBgYKBgYGBgoKCgYCBgYGCgICAgIGBf35+gICAgICAgICAgIGBgYF5emxiZGdjYmdmYWBgZGFiZWRjZGNeXGJ1fHt7e3t7e3t7e3x8fHx7e3x8fHx7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/gYeMiYWGhoeFg4SDgoGBgYGBgYKBgoKCg4KBgIGBgYKBgYGCgoF/f36AgICAgICAgIGBgYGBgXp7dGdnZmZkZGZmYF5fYWNlaGRlXmJkYHR8e3t7e3t7fHx8fHx8fHx8fHt7fHt8fHt7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f3+CiYqIhoaIhoWDhIOCgYGBgYGBgoGBgoKCgoGAgYGBgoKBgYKCgX9/f4GBgYGAgYGBgYGBgYGBenptaGNjZ2ZnZWdlZmdiZWRlYmdbYmVgdnx8e3t8fHx8fHx8fHx8e3t8fHx8e3x8fHt7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f39/f4SJioiGiYeFhYSEg4KBgYGBgYGCgYKCgYGBgYGBgYKBgoGBgICBgH9/gYGBgYGBgYGBgYGBgYF7emlpZGNqZmFgZmVjY2NnaWRjYmBiZGJ0fXx8fHx8fHt8fHx8fHx8e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f39+fn9/f39/f39/f3+AhIqMiIeJhoSFhYOCgYGBgYGBgYKBgoGBgYGBgYGBgoKBgYGBgYGAgH+BgYGBgYGBgYGBgYGBgXZzZWRnY2RmZWJlZmdkZmhmZWNgYGNkYHF9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fXx8fX18fHx9fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/fn5+f35+f39/f39/f3+AgICFioyJiIqJhoaDgoKCgYGBgYGBgoGBgoGBgYGBgIGBgYGBgYGCgX+Af35/foCCgoKCgoKCgoKCc3NnZWRkZWlqaGZnZ2NhZmZlZmdmZWVjdX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gICAgICAgIWLioqJioeHhoSCgoGBgYGBgYKCgYKBgYGBgIGBgoKBgYGBgYGAf4B+dHRzdX1/goCAfn5/gYB0cmdkZWNmaWppZWNlY2BmZGRnZ2JiZWFwfXx8fHx8fHx8fHx8fHx8fHx9fX18fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f39/f39/f4CAgICAgIB/houLiouLh4eHhIOCgYGBgYGBgYKBgoKBgYGBgYKCgYCBgYGBgoCAgH5zc3NzdHV4dXV0dHV2dXVwZmNmZWhoaWdoZ2VmZWJfZGVmY2BiZ3d8fHx8fX19fX18fHx8fH19fX19fX19fXx9fXx8fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gIB/f3+AgICAgICAgICHjIyIi4qHh4eEhIKBgYGBgYGBgoGCgoGBgICBgoGBgYKBgoKCgYCAfnNzc3Nzc3NzdHR0dHNzdW9jY2FnZWhoZ2pmZGVnZmhmY2JlYl5ieX18e3t8fX19fX18fHx9fX19fX19e3x9fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn9/fn5+fn5+fn5/f39/f4CAgH9/gICBgICAgICAgYCAf4CAgYGAgIeLi4iNiYiJhoSFgYGBgYGBgYKCgYKCgYGBgIGCgoGBgYKBgoKBgIB+dHNzc3Nzc3Nzc3Nzc3N1cmdlZWRlamhoZ2ZpaGdjZWViZGNoZGd7eHVzc3R2dnl4dnR0dHZ3d3d2dHR0dXV4d3h4d3d6e3x9fXx9fn5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f35/f39/gH9+fHt7fX58eXl2dnZ5fHx6end2d3l7fXt4hIyMioyHh4iEhYSBgYGBgYGBgoGBgoGBgYGAgYKCgYGBgoGBgoGAgH51c3Nzc3Nzc3Nzc3Nzc3VzaGVnaGVrbGhqZ2lqZ2dnZmRkYmVkbnV0dHNzdHNzc3Nzc3Nzc3Nzc3NzdHNzc3Nzc3Nzc3N0dHV1c3V3eHl7fn59fn98f39/f39/f39/f314fH5+fXx4dXZ3eXd4dnRzc3N0dXRzc3Nzc3NzdHNzc3R0c3R0dHODjI2KiYeIhoOGg4GBgYGBgYGBgYGCgYGAgYGDgoKBgYCBgYGBgICAf3VzdHRzc3Nzc3Nyc3NzdnZpY2hqaGpsZWZpbGhgZmVkY2BkZGZ0dXV1dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHRzdHRzc3Nzc3R2dnV1d3V4fH9+fX9+fHp4dXN0dXV1dHNzc3Nzc3N0dHR0dHR0dHR1dXR0dHV1dHR1dXR1dXV1dIaMjYuIhoeEhIWCgYGBgYGBgYGCgoGAgYCBgYKCgoGBgIGBgYGAgIB/dnNzc3Nzc3Nzc3Nzc3N2dnNnZ2pmaGdmaGhmZGlnY2NnZWVmcHZ1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dHR1dHR0dHR0dHRzdHR0dnV1d3Z0c3R0dHR0dHR0dXV1dXV0dXV1dXV1dXV0dHNzc3N0dHNzdHR0dHR1dXR1iY6MjIqHh4SEhYKBgYGBgYGBgYKCgoGBgICAgoKCgoGBgYGBgYCAgH93c3Nzc3NycnJyc3NzcnZ2dW5kXWNnZWlraGVoZ2dqamlnZXB2dXV1dXV0dHRzdHR0dHR0dHV1dXV1dXV0dHV1dHR1dXV1dXV1dXV1dXR0dHV1dXV1dXV0dHV0dHV1dXV1dXV1dXV1dXV1dXV1dXV0dHNzc3Nzc3N0dHNzc3Nzc3R0dHR0dHWKjoyMiYaGhIeFgoGBgYGBgYGBgoKBgYGAgYGCgoKCgYGBgYKBgICAf3hzc3Nzc3JycnJyc3NzdnZ3d2liaGhnamtpaGZkZGVmaWhwdXR0dHRzc3JxcnJ0dXV0dHR0dHR0c3NycXFxcXNzdHR0dHR0dHR0dHV0cnJyc3R0dHR0dXV1dXV1dXR0dXR0dHR0dHR0dHR0dHR0c3Nzc3Nzc3Nzc3Nzc3N0dHN0dHR0dHR0dYuOjImGhYWFh4SCgYGBgYGBgYGBgoKCgYGAgIKCgoGBgYGBgYGBgIB/eXNzc3NycXJycnJzc3N3d3d3bGpoZGhpa3Z6a2VmZWhnbXJzdHN0c3JwcHBxcnN0dXR0c3NycnNycXBvb29vcHFzc3NycnJyc3R0dHNxcHFyc3R0dHR0dHRzc3Rzc3NzdHR0dHRzdHR0dHR0dHRzdHR0c3NycnFxcnJzc3Nyc3NzdHR0dHN2jZCMh4eFhYSEgoGCgoGBgYGBgYGCgoKBgYGAgYGCgoGBgoKBgYGAf395c3NycnFxcnJycnNzc3d3d3dzc2pnaWloeX99cW51bG5wcXJycnFxcG9wcXFxc3Rzc3NycXFwcG5ubm1ubW5ubnBxcnJycnJycnJzcXBvb3BxcnJzc3JxcnJycnJycnJycnJzc3Jzc3Nzc3Nzc3Nzc3Jxb29ubm9vcXJzc3Jyc3NycnNzcnaPj4uHhoWFhYOCgoKBgYGBgYGBgYGBgoGBgYGCgoKBgoGCgYGCgX9/f3hxcHBwcXFycnJyc3Nzd3d2dnd2cnF0c252f352c3hwcHBycnJycXFwcHFxcXFyc3Nzc3FwcXBvb25ubm5ub25vcHBxcXFxcXBwcXJwb25vcHFxcXFxcHBxcXFxcXJycnJycnJycnFxcnFxcnJycnFwb29ubm1ubW5vcXJycnJycnJyc3JxeI+OjYaDg4aEgoOCgoGCgYGBgYKBgYGCgYGBgYKCgoKCgoKBgYKBf4B/d29wb3BxcnJyc3Nzc3J2dnZ2dnZ3dnZ1c3l/fnd3d29wcXFxcXFxcHBwcXJxcnJzc3JycXBwb29wb29vb29vb29wb3Bvb29vcHBxb29vcHBwcHBvcG9wcHFycXFxcnJycnFxcXFxcXFxcHBwcHBxb29ubm5tbW5tbm9wcXFxcXFxcXFxcXB7j42NhoODhYOCgoKCgYKBgYGBgoGCgYGCgoGCg4KBg4KBgYGAgYF/f392bm9wcHBxcXFxcXBwcHZ2dnZ2dXR0c3NxfYB9fX9zb3BxcXFwcHBwcXFwcHBxcnJxcXFwb3Bvb3Bwb29wcG9vb29vb29vb3BxcXBub3Bwb29wb29wcnJycnFxcXBxcnFwcXFxcHBwcHBwcHBwb29ubm1ubm5ubm9ub3BwcHFxcXFxcXFxcIKRjoqEhIOFhIOCgoGBgoKBgYKBgYGBgYGCgoKCgoKCgYGBgYCBgX9/gHVvb29wcXFxcXBwcHBwdnZ2dXRzcnJycnGAgoCBeXBwcHBvcHBwcHFxcXFwcXFxcXFxcG9vcHBwcHBwb3BxcHBvb29wb29vcXFwcG9wcG9vb25vcHFxcHBwb3Bvb3BwcHBwcHBwcHBvb29vb29vbm5tbW1ubm5ub25vb3BvcHBwcHBwcHBwipCMiISDhIaDg4KCgYGCgoKCgYGBgYCAgYGBgoKBgYGBgYGBgIGBgH+AdG5vb3BxcXFwcG9vcG92dnVzcnFxcXFxcICDg39ycHBwcHBwcHBwcHFxcHBxcXFxcXBwcHBwcHBwcHFwcHBwcHBwcHBvcHBxcXBwcHFxb29vbm9wcHBvb29vcHBvb3BwcHBwcHBwcHBvb29vbm5ubm5ubW5ubm1ubm9wcG9vb29vb3BzcXWPj4yJg4KFh4ODgoKBgoGCgoKBgYKBgYGBgYGBgYGBgYCAgYGAgYGAf4B0b29vbm9vb29vb29vb3Z1dHNxcXFxcXJygIKCgXRxcXFxcXFxcXFxcXFxcXFxcXBxcXFxcHFwcXBxcXFwcHBwcHFxcXBxcHBwcXBwcHBwcHBwcHBwcHBwcHFxcXBxcHBwcHFwcHFxcHFxcXFxcXJxcnFwcnRycnR0dHR1dnRzdHR0dXd3gpCPi4mDgoaHhISCg4GBgYKCgoGBgoGBgYKBgYGBgYGAgICBgYCBgYB/gHVvb29vb29vb25vb29vdXRzcnJycnJycnKDg4OCdnFycnFxcXJxcnJxcXJycnFxcXFxcnFxcXJycXFycXFxcXFxcXFxcXFwcXFxcXFxcnNzcnJyc3V1dHR0dHR0dHV2d3d3d3d3eHh4eHd3eHh4d3Z3dnV2dnZ2d3h6e3x7e3t6enp6enyGkI2LiIODiIeHhYODgoGCgYKBgYGBgYKCgoGBgYGAgYCAgYGAgIGBgH+Ad3FxcXFxcG5ucG9wcG92dHV1c3Nzc3NzdYiDgoN5cnNzcnJyc3Jyc3NycnJycnN0cnJzcnNzc3Nzc3Nyc3N0dHV1dXV1dHV3eHd3d3d4eHh3eHh4eXl5eXl4eHl5eXp6e3t7e3t6enp5eXh3d3d1dnV2dnd5enp7fn5+fX1+fn5/f35+gIyPi4qHg4WIi4iEg4SDgYGCgYGBgoGBgoKCgoKAgYGBgYCBgYGAgIGAf4B8enp5eXx5eHh2dXZ2dHl2d3h3d3Z3dnZ6f3x+fnx2dnd3dnV4enh4eHh3d3d2eHx5eXx6eXl8e3l5eXh4eXl6enl5eXh4enp5eXh4eHh3dnd3eHh3eHh5eXp7e3p8fH1+fX9/f359e3t7e3p5enl5e3t/foB/fn5/fn19fX5+f35+fn6AjpCNioeEhoqLiIaGhIOBgoKBgYGCgYGCgoKCgoCBgoKBgYGCgYCBgIF/f4B/fn19fX9/f318e3t7eXh4eHh5eXl4eXh5eXl4enp6enp6e3t7fH1+fHt7ent8e318e3t7e3t7enl4eXh4ent6enp5eXp8fHt6enx8fHp6ent9fHx+fn+AgoGAgYKAgH9/gYGBgIB/f35+fn5/fX1+f4CAf35+f39+fn9/f39/gH+Af4OQjoyHhoWIi4yJh4aFg4GCgYGBgYKBgoKCgoKBgYKDgoGBgYGBgIGBgIB/goOCgoGBgX99f39/f4F6enh4d3h4eHh5eHh5enp5e358enx9fXt8fX19fHx8fnx9fn5+fn59fX9/f3x8fYGDgYCAf318fXx9fXt9fXx8fH19fX1+gYGChISDgoB/gYGBgH9/f4B/f39/f39+fn9/f39/f35+f3+Af39/gICAf4CAgICAhJCPi4eGhoiMi4mKhYaDgoKCgYGBgoGCgYKBgYGBgoOCgYCAgYGAgIGBgH+ChIKCgICAgH9+fn+AgH9/fn18fX19fYB/fX+Af35/gH9/fn9/gIGBgICAf3+BgICAf4CBgn9/f4CAf35+f39+f39/fn5+f39/gYB/f4CBgYCAgYOEgoGCgoGCgH+AgYCBgYGAgH+BgICAf39/gICAgYGBgIGBgYCAgICBgoGBgYCAgYGFjo6MiIaHiYyLi4qGhoOCgoKBgYGCgoOCgoKBgIGBgYKCgICBgYCAgYGAf4KFg4KBgYCAf39+fn+AfX5+fn19fX5/fn9/f35+fn+AgYCAgICAfn9/fn+Af3+AgH9/f35/f39+fn59fn9+fn9/f35/gIGBgoKDg4KCg4KBgYKDg4OCgYGBgYKBgoKCgYKBgoGBgYGBgoKCgYGCgYKCgoGBgoKBgYKCgoKCgYGBgoKCgoaPkY+KiImKjY6MiYaFgoKCgoKBgYKCg4KCgoGBgYGBgYF/gIGBgYCBgIF/gYWEg4KCgoGCgYCAgIB8fHx7fH18fH9+fn9+fn5+f35+f39/f39/f35+foB+fn5+fn9/f39+f39+fn5/gIB/gIB/f39/f3+BgYGCgoCAgYKDg4SDg4ODgoKCgoKCgoKCgoKCgoGCgoKDg4OCg4ODgoKCgYKCgoODg4ODgoKCgoODg4KCh5KSkIuKi4uPj42Lh4SCgoKCgYGBgoKDgoKBgYGBgIGBgICAgYGBgIGAgYCAg4SDg4OEg4ODgoKCgXx9fHx9gn1+f4GCiIGCgoSCgYGDg4GBgYKDgYKBgYCAf39/gICAf3+AgX9/f39/gYCAgICAgH9/f3+AgICAgH9/gYODhYSEg4SDgoKCg4OCgoOCgoODg4ODg4SDg4KEhYWDg4SEgoKDhIOCg4ODg4OCgoODgoCKlJOPioqMjpCPjYuGg4KCgoKBgYGBgoOCgYGBgIGBgoGBgICBgYGAgYCAgH+BgoODg4SEhIOCgoKCfXx8fn6AgYOAg4OChIaFhoaFhIWFg4ODg4SBgYKEhIKCgoeDgoKAgoGBgoKCg4KCg4KDgoODgoGAgIKCgYOCgYKCg4OEhYWEg4OChISEhIOEhISDg4OEg4ODg4OEg4SDhIWDhISDg4ODgoKCgoKCgoKBgYKCgo+UlI+Njo6RkY6KiISCgoKCgYGBgYGCg4GBgIGBgYGBgYCBgIGBgYCBgICAgIKChIKChIOCg4ODgoJ9fX2AgH+AgoGDg4ODhIaEhIOEhYWDg4KBg4OBgIKDgYKFhYWFhoaHhoWGhoeHh4aGhoeHhoaEgoGCg4SDg4ODg4ODhISFhYWDhYSFhISEg4KBg4OCg4SEg4KCg4SCg4KDg4OCgoKCgoKCg4OEhIOFhYWFhoaIk5OTkI+PkJKRjIqHgoKCgoKBgYGBgYKDgoKBgIGBgYGBgICAgYGBgICAgICAhISEgoKCgoGBgoKBgX+AgYOCgICAf4CCgoGDg4KCgYODg4SDg4KDhYOCgYGBgoSFh4eHh4aGh4eHiIiHh4eIiIiFhIOBgIGBgoKCg4GCg4SEhYSDg4OEg4OEhIOBgYGCg4OEhISDg4ODg4OEhIODgoSDg4ODhIWFhoeHh4eIiIiJiY6TkpKOj46QkY+LiYeCgoKCgoKBgYGBgoKCgoGBgIGBgYGAgICAgYGAgIGAgICDg4KCgYKCgYGAf4CBhYWFhoOCgYB+fn+BgoSCgoKDhIOCgoODg4KChISDg4OCg4SFhISFhYSDg4SFhYKEhIWFg4KBgH9/gIB/gIGEg4OEhYWEgoKCgoOCg4OFhIKDhISEhYaGhoaGhoWFhoeHhYaIh4aHiIeGhoaIiYeGhYaGhoeIkZOSkI6QjpCRjImHhYGBgoKCgoGBgYGBgoOBgYGBgYGBgICAgICBgYCAgICAgISEg4KBgoGAgYGAgYKIh4aHhYSCgH99fX6AgH+AgYGBgYGBgoGAgYOCgoGCgoKBgYGCgYKCg4GBgICAf4GAgH+AgH9+gIGBgYKCg4OEg4OEg4OCgoGBgoODg4SEg4SEhIOFhYaFh4eIh4eHh4eHh4eGhoaGh4WFhYaGhIWEhIWEhYaSk5GOjo+OkI6JiYeEgoKCgoKCgoGBgIGCgoKCgoKCgYGBgYGBgYGBgICAgYGAgoSDg4KDgoGCgYKDg4iHh4iHhYSCgX5+gICAfn5+f4CBgYGCgYCBgoKCgH+AgIB+gIKBgIGCg4OAf39/gICAf4CAgICDg4KDg4ODgoOBgYKCgoOCgYKCgoOCgoSDhISDg4SEhYWFhYaGhoaFhISEhYWEhIWFhYSEhISDhISEhISEipSTkpCQj46NiIaFhIOBgYKCgoKCgYGAgYKCgoKBgoKBgYCBgYCBgYGAgICAgYGAgoOCgoOCgoKBgoOCiImJiYiHhYSDgYKEhIOBgoGCgoSCgoOEgoOFhYaEgoSCgX+AgoGBgoGChIOBgYGBgoOCgoGDg4SDg4SEg4OCg4KDg4ODg4KCgoKCgoGDhISEhYSFhYWFhIWEhIWFhYWDg4OEhISEhYWFhISEhISEg4ODg4OOlZKQkZGOjYyHhYODg4GCgoKCgoKBgYCBgoOCgYCCgYGBgICAgIGBgYCAgICBgICDhYSEhIODg4SDhIOGh4mIhoWDhIODg4WDgYGDgoOFhYODg4SCiI6DhYSFhISEgoGAgYKDgoKEg4OCgoGBhIWEg4ODgoKDhISDg4ODg4WFhISDg4KCgoKCgoSEhYSFhYWFhYODhYWFhYaFhoWEhIWEhYWGhYWFhIWEhISDhIODhJGUk5OSj42MioWEhIODgYKCg4KCgoKBgYGCg4KBgYKBgYGBgIGBgIGBgH+AgIGAgYaGhoaGhoaHh4aGhYSDhYaCgIGBgYGHgoB+f4GAgYOCgYCBgX+KmYWBgoKBgYKCgYCCgoOCgoKDg4GCgYKDhYODg4KDg4OEgoKEhIOEhIWEg4OCgoKCgYGCg4ODg4SFhYWFhIOEhYWGhYWEhISEhIOEhIWFhYWFhIODhIOEg4KGlJSSlJKPjYuHhISDg4KBgoODgoKDg4GBgoKBgoKCgYGCgYGBgYCAgYGAgICAgICAhYWFhYaGh4aGhoWGg4ODg4GAgoKCgYKAf35/f4CAgIOBgH9+e4GYjICBg4GAgYGChIOBgYGBgYKBgYKDgoODgoOCgoKCg4OBg4SDg4ODg4OEhIKCgoKDgoKDg4ODhIWEhISEg4OEhIODg4OEhIODg4ODg4SDg4ODg4KDg4KDgouUk5KTkY2NioaDg4OEgoGCg4ODg4ODgoGBgoGCgoKCgoKBgYGBgICBgYCAf4CAgICDhISFhYSFhYWEhIWCg4KDgoKDg4OBgICAgICAgYCBiYN+fn+CfY+VgoOEgoODg4KAgICCgoKCgoKDg4ODgoODhIKCgoODgoKDg4KCg4KDg4WEg4ODg4SDg4SEhISEhYWEhIWEg4WEg4OEhISEhISEg4SEhYSDg4SEhIODgoKDkJSSkpKPi4yIhoSEg4OBgYKDg4ODg4OCgYGCgoKCgoKDgoGBgYGAgICAgIB/gIGAgISDhYWEhYWFhYSFhYOEhIWDg4SEhIKCgoOCgoSCgYOPg4GBf4qEg5KFhYSEhYJ/fX19f4KEg4ODg4OEg4ODhISEg4OEhISEg4SEhIOEg4OFhoWFhYSFhYWFhYSFhoWGhoWFhYWFhYSFhYWGhoWGhoaFhoaGh4aFhYWFg4SEhIeTk5KRkoyLiIWFhYWCgoGBgoODg4OCg4KBgYKDg4ODgoKBgIGAgICAgICAgH+AgICAhYWFhYWGh4eGhYWFhISFhYSEhISEhIODg4OEhYSChZKCioaFgoF+goaHhoOBfn9+fn9/f4OEg4OEhISEhISEhISEhISFhYWEhYSGhYWGhYaGhoWGhYWHhYWGhYaGhoaFhIWFhYWFhIWGhoaHhoaGhoaHh4iIiIaFhYaEhYWGjZSTkpGQi4qHhoeGhIGCgoKDg4ODg4KDgoGBgoODg4KAgYGBgYCAgICAgICAf4CAgICHh4eGhoeHiIeHhoaEg4ODhIODg4OEg4ODg4OEhIOHkoKGhId+fn9/hYWBf39/f39/f35/gISFhIWGhoaFhYWFhoaHhoaFhoWFhoeHh4iHh4eGhoaHh4eGhoaHhoaGhYSDhIWFhoSFhYaGhoeHhoaGhoeHh4eIiIeGhoaHh4eRk5KQkZCLiIiFhoSDgoKBgoODg4ODgoKDgoKCgoOCgYCBgICBgICAgIGAgIB/gICAf4aHiIeHh4eIiYmIiIODgoKDg4SEhIWEg4KCg4OEg4eNgYF/h4J+fn6AgH9/f39/gIB/f4B/f4WFhoeIiIeHh4eIh4iHiIiIhoaHiIiJiYmIh4aHh4eIiIaHhoeHhoaFhIOEhYaFhYWFhoaGh4eFhoeGh4aHh4eHh4eHh4eFh5OTkY+RkIuHhoWGhIKCgYGCg4ODg4ODgoKCgoGCg4KCgIGBgYCAgICAgICAf3+AgYB/hoiIiIiHh4iJiYmIg4KCg4ODhIWHh4eFg4OFhIOEhISBgIGLhYB/gIGCgYGBgYB/gH9/fnt6gIaIiIqKiYmIiImJiYmKi4qIiIiJiouLioqIiIeIiIiHh4iIh4iGh4aEg4OFh4eHhoWFhISDhYWEhYWGhISEhYWFhoWGhYOJlJOQj5GOioaFhoWDgYGBgoKDg4ODgoKCgoKCgoKCgYGBgYGBgYCAgICAgIB/gICBgH+GiYiIiYeIiImJiIiEgoKDg4KDhImKh4eEhIWEg4OFg4GAg4OCgoKCgoKCgH9+fH19fX9+fHt8g4eJi4uKioqIiIqJiImLiomJiImIioqJi4mHhoaGh4WGiIiJiIeGh4SDgoSIiIiIh4WCgoGDg4KDg4SCgoKDgoGEg4SEgY6TkpCPj4uIhYSGhIKBgYGBgoODg4OCgoKCgoKCgoGBgYGBgIGAgICAgICAgH+AgIGAf4WIh4eHhoeIiIiHh4SCg4OCgoOFiYqJh4WHhYSFhYWCgIKDg4OCgoKDgX59fX5+fn5+fX1+fX19g4eJioqHh4WGh4eHh4iHh4mGiIaIh4eJiISDhIOFhISFhYaIiIaFg4KChIWHhoeGhoSCgoOEgoODhIKBgYGBgYODhIOEkZKRjo+Oi4eFhoaEgoGAgYGDg4ODg4KCgoKCgoKCgYGBgIGBgYCAgIB/gIGAf39/gIB/hYaGhYaGhoeHiIeGgYKEhIOChYeJi4qGhIaEgoaHg3+BhIODg4OCgoF9fH1/gH9+fn59fH19fHp8hIaHhoSDgYKDhIWFhYODhYSEhISEhIWEgoKDgoSEgYKDg4WGhYSCgYGCgoODhYOEhIWEhIaDg4SFg4KDgYKDg4SFhIeSkY+Nj4yKhYSFhIWCgYCBgYODg4ODgoKCgoKCgoKBgYGBgYGAgICAf4CAgYB/gICAgICDhIWEhYWFh4eHh4aAgYGFg4OEhYSHiIWCgYCAgoB/gYOEg4ODgoJ/fX1/gICBf31+fn19fX16enp+g4SEgoGBgIGBgoKBf36BgYGCgYOAgoGCgoKBg4OAf4CAgYOCgICAgICBgYGCgYGChIODhYSCg4SDgoKBgoSDhYWGjJORjo+Pi4iFhYOChIGBgYGBgoODg4KCgoKCgoKCgoGBgYCBgYCBgH9/gIGBgICAgH+AgIKCg4OChIOEhYWGhn+BfoCBgICAgIGDgn9+fn9+fX6DhIOCg4ODgn19fn+AgIGAfn19fX1+fXx6enp/goKAf39/f35/f4B+fYB/f4CAgX+AgIF/f3+BgX99fX+AgX9/fn+AgH+AgICBf4CCgICCgYGCgYGAgYGBgYKEg4aPkpCOj42Kh4eGg4OCgYGBgYGCg4ODgoKCgoKCgoOCgYGCgYGBgICAgH+AgICAgICAf39/gYKDhIGCgoOCg4SFgIB/fH19fn1+foCAf31/fn1+f4ODg4KCgYF/fX1+foCAgH9+fX19fHt7e3p6enqAgH9+f35+fn1+f35/gH9+f3+Af4CAf35+fn9/fn18fn+Af35+f3+Af39/f4B/f4B+f4CBf4B+f39/gH9/f4B/hZKSj46Pi4uHiYWEg4KCgYGBgYKDg4ODg4OCgoKDg4KAgYKBgYGAgICAf3+AgIB/gIF/f36BgYSEgYKBg4OCg4OBgH98fn5/fn6Af4B/foF/f4CBhIOCgYB/f359fn5/gICAfn19fX17e3x6enl5eXt/fn5/f39+fX5/foCAf35/f4CAgoB/fH5+f35+fXx/f4B/fn9/f4B/f35/foCAf36Af39+fn5/f35+f318fH2Fk5KNjIuKiImIhISEgoKCgYGBgoOCgoODgoODg4ODgYCBgYGBgYCAf39/f4CAgICAgIB/foCBhIOCgYGDhISDhICBgICBgIGAgYKCg4GBgoCBgoODgYGBgYCAfX19fn5+f359fX19fXx8fHt6enl5eX2Af4CBgYF/f4B/f4F/gICAgYGCgoB+gH5/fn5+foGAgYF/f39/gIB/f39/gYB+f4CAfn9/fn+Af31+fX17fIaTkYyLioeHioiGhoSDgoGBgYGCg4ODg4OCg4OCgoKBgICBgYGAgH9/f39/gICAgICAgH9+fn+BgYGAgISGh4aHgoSDhYOBg4ODhYSEhISEgoKDhIKCgoKCgX9+fX19fn6AfX19fX19fX18e3p5eXl5eYCCgoKEg4CCg4GAgoCBgYGDgoODgYGCgIGAf4CBg4KEgoCAgYGBgYCAgYCCgn+BgIF/gIB/gICAfn9/fnx8ipOQiomIiIiJiIaGhoSCgoGBgoKDg4ODg4KDg4KCgYCAgICBgYGAf39/f4CAgICAgIGBf359fn5/f39+g4aHh4iChYSFg4SFhIWGhoaGh4WFhYGBg4ODgoKAfX19fX19fn59fX19fX18fX18e3l5eXl4fIKDhIWCgYSDgoKDhYaCg4SDgYKCg4OCgoKCgYKFg4iFgoGBgYKCgYGBgYSDgoOCgoKCgYGBgIF/gIGAf36Ok4yHiIaIh4aGhYaGhIKDgoGCgoODg4ODg4OCgYGBgH+AgYCBgYB/gH9/gICBgH+AgYB/fn19fX5+f36Ag4SHiISGhoaFhoaHh4aGh4iHh4eGf32BgIGCgX59fX19fX19fX19fX18fH5+fnx7eXh3eHl5gIODf4ONhIOEhISXl4ODhIF9foGCgoGCgYKBg4aIjIWDgoKBhIKEg4KDhYWEhYOCg4OCg4OCgoKCg4OCgpKQi4iJh4mHhoaEhoWEhISCgYKCg4ODg4ODgoGBgYCAgICBgIGBgH9/fn+AgYCAf4CAgH9/fn1/fn+Bf4CCgYWFhYeGh4eGh4eIhoeHh4aHh4Z/fX18fX9+fX19fX19fX19fX19fXx7iJKCe3x6fIZ5eHl8gYF+iZeEg4OEhJSTgIGBf39/fn6Fi4B/gICEhpCJhYSCgoGFhYuDgYKFhYaGhIOFhYOEhIODhIOFhISIko6LiYiIiYeHh4WGhYSFhIKBgoKDg4ODg4OCgYGBgICAgIGAgICAf39/f4CAgICAgYGBf39/f4CAgIGBgYGBg4OGh4aGh4aGiIeGhoaFhISFhH99fHx8fX18fH19fX19fX19fX18fH+RlZaDe3qElHx4eXp7fH+Cg4GBgIOCgH58fn57iJF8fI6Wf31/f4KGioWDg4SDgYONiX99f4OEhYWDhYaFhIWFg4SFhYaEhI6Rj4uKioyJiImHhYaFg4OCgYGCgoKDhIODgoGBgICBgICAgYGAgIB/f3+AgIB/gICAgX5+f4GBgoKCgoODgoOCgoWGhISFhYSGhIOEg4KCgYOBf319fHx9fXx8fH18fH18fX19fHx8e4uRl4x6e3yBenp6e3x5eX19foB/gH98e3t+fn2ClZF/hIh+fH5/goR8fIGChIKAf4eDfYOBf4KCgIODhISEhISChIOEhYKEkZGOi4yMjoqJiYWFhYODgoKBgoODgoKDg4KCgYGAgIGAgICAgICAgH+Af3+Af357gICBenyAgYKDhYODhYWFhYODg4SCgYKDgoOCgoGBgIB/gX5/fX59fHx8fHx8fHx8fHx8fHx9fHx8fn6Kgnt6e3p4ent7fH17fn1+f319fX18fH+BgX2Gj4F+fYJ+fn6Agnx8f3+BgIGAfn17ioJ9gH9+gYCAgYKBgoCAgIGAf4uTj4yLjY6NiIeHhYWEhIOCgoKCg4OCgoODgYGBgICAgICAgH9+fXx7fHx9f3+AgHx6gYF4e4CCgYOFhIOFhIaGhISAhpSIgIKBgYGBgH9/f39/fn5+gHx8fHx8fHx8fHx8fHx9fHx8fHx8fHl7e3t4eHl7enp8gX+Afn+BfH5+f399gIKCgICAgX+CkYF/f4CAfoB+fn9+gIGBfXx9e319fXx9fHx9gH+AgH6Afn6Bk5GMjI2NjoqFhoaFhISFg4OCgoODg4OCgoGBgYGAgICBgICAf4CAf39/fXt6fICAgHh+gXd7gIF/gYKCgoKEhoeGhn6IlYp+gYGAf4B/foB+f39/fn+Bfnx7e3x8fHx8fHx8fH59fHt8fHx8e3x8fHp6eXt8en2Fg4J/gYF+f35/gH6FgoF+gH9+foCFhoKAfn6Dhn9+fH6AgIGAf39+fX19fX57fH1/f3+AfX9+gIyRjYuNjo2Nh4SGhoWEhISDg4OCg4ODg4KBgYGBgYCAgYGAgYGBgYGAgH9/f397en9/e3mAd3p/f31+f3+Af4KDhoaFf3+FgX5/gIB/gH5+f31/gIB/gIB/f319fHx9fn18fH19fX19fH58fXx7fXx8ent6fH19f4aEgoCAgX1+fX5/fouEgYZ+fXx8f36CgX99fX19gHx7fXx+gYSDgYB+fn5+fX1/f399foB+fn6EkoyMi46Ni4qGhIWEhISDg4OCgoKDgoOCgYGBgYGBgYGBgYB/fXx8fH1+f39/f397e399d352eH59fH18fX5+gYGCg4B6fX18fn+AgH6Af35/fn+AgH+AgH9/fn9+fn5+fn1+fn99fH59fn19fHt8fHx6e3p9fn+Ag4OCf35/fH18fXx8gYN+jH58e3t9fn1+fn17e3t9fHp7e3uAhoSChIOCf4B+f4KCgn9/goJ/gIqPjIyLjYuKiISEhIOEhIODgoKCgoKCgoKBgYGAgoGBgYKCf3+AgIB/fn18fH5/fn55fX52e3Z4fXx8fHt9fX6BgICAf31/f31+f39/foB/f39+f3+AgIGBgH99gH9/fn9+fn5/f3yCfn59fX17e319fHp8fH6AgoGAgIB8fH18fHx8fH18fXt/fnt7e3x8fH18fHt7e3x8enp9en6CfoGDhIKBgoGFhoWFhoaHhoKEkY6Mi4qLh4iFgoOEhISEg4KCgYGCgoKBgoGBgYGBgoGBgoKAgYKBgYCAgH9+e3x+fnx6fnh5dnd8fHx7e318f4GAf35/foB/f35/fn5/gH9/f39/f3+AgYKAfn6BgIB/f39/f39+fYN8fH19fH99fX19e3x+fn9+fn5+fnx8fHx8fHt+fnt8e3x8fHx9fH18fnx9fHx7e3x5e3x7fH16fX5+f4CAg4eJiYmKiIuJhYiRjYuIiYeFhYOCgoOEhIOCgoKBgYKBgYKBgYGBgYKCgoGCgoCAgX98e3p6eXt9enx+fnl8eXh4dHx8fHt8fHx+gX9/f39/gIB/fn5+fX+AgH9/f3+Af4CDgoB/gIGAgIB/f4CBgH58enx9fX59fX5+jIZ9fX57e4OCfX5+fX18fX19fX1+fH18fXx9fX58fn19fX18e3t6fHt8fHt6e3t6enp7fn6DhYiHiIqLi4uJjJCOjYmIhoWEgoKCgoODg4OBgYGBgYGBgYGBgYGCgoOCgYKBgIGBf3+Af356eHl5en5+e3l6eH5zfHx8e3x8fH5+fn9/gH+AgIB/fn9+gIF/f4B/gIGAgoSEgYCAgYGAgX+AgYKBf39+fn1+gH57foGRjHx9f4qAjYx+fn19fX59fX59fHx8fX18fXx9fX1+fX1+fnx7e3t8fH18e3p7fHl6eXh5e35/hIOEh4mKiImNj42LiIiFhISCgYKCgoKCgoGCgoKCgYGCgYKCgoGCgoKBgoKAgYGAfoCAf39+e3p5e319eHx6f3KBfXt7fHx8fn59fYGBf4GBgX9/gH+AgX9/gIGCgYGFg4SCgYGCgYKCgICBg4KAf4F/fX6Afnx+f4iCf36DkISEg4F/fn18jYd9fX59fHx/fnx9fXx9fX5+fX5/fX19e3x9fnx8e3x9enp5eXl5e3t+foCBg4eEiI2MioqGhYSEg4KBgoKCgoGBgYGCgoKBgoKCgoKCgoKCgoGCgn+AgIB+f39/fn5/ent5fX16enp9cX6Cent8fX19fXp4f4KAgYKCgICBgIGBgICBgoKCgoaFhIKBgYGBg4F/gIKEgX9+gYB9foF+fX5/gIB9fn+EgH5+f31+fX2KhX1+f31+foB/fX19fH5+fn99f4B9fn18fX9/fHx7fH17e3t6enp7e3x9fn6Ag4CJjYqLh4WFhYSDg4KCgoKCgYGBgoKBgoKCgoKCgoGBgoKBgYKCf4CAgH9/f39+fn59eXp6fXx5d3t0e4d8dHd9fn17e3Z2foCBg4KBgYKCgoKBgYGDg4OChYaEgoCAgICCgX+AgYOBfn6AgH5+gH59fn6AgH+Bfn+Af39/f398f39/f3+Afn9/gH58fX18fn5+foF/gH2CgHx9gIB9fH19fXx8e3x8e3t7fHt8fHx9fImKiIiFhoWFhISDgYKBg4KAgIGCg4KCgoOCgoKCgoGCgoGBg4J/gIGAf39/fn5+fn57enp8fHt2e3R3f352cnt+fnt4dnd8gIGCgoKBgoODg4OCgoSDhIOFhoOCgX9/gIOAgICAg4F+foCAfX+AfX1+foCAf4J/gYGAf4CBf31/f3+AgIGAgIB/fnx9fX19fn59g32AfoKAfX6AgX98fn59fX17fH58fXx8fHt8e3x+iYWGhYaHhYSFhIKCgoGDgYCAgoKDgoKCg4ODg4KBgYGBgYGCgH6AgYB/fn5+fn5+fn56e3p9goN9dXF6fHpxen19eXh1dICAgoKCg4KDhYOEg4KDhISEhIWEgYGAgH6Agn9+f36Bf35/f4B9foB9fX1+gH9/gYCBgYCAgIKBfn6Af4GAf4CAgH9+fX19fXx+fn19gYR/gH9+f4GBf31/f319fn1+fn1+fHt8enx7eoCHgoSEhYSEhIWDgoKBgYKBgICCgoOCgoOEg4SDg4KBgYKBgYOAfoCBf35+fn5+fX5+fnt7en6Jh354cnl9f3F6eHt4eXR1fYKDgoODg4OFhIWEg4OEhIODhIKBgH+Af4CBfn19fn9+fn5/gH19f3x9fX6Af4CAgIKAgIGAgoGAf4B+gIF+gIGAgH9+fn5+fn5/fn6FhYGBgH+Ag4F/foGAf35/foB/fn17ent6fHt6goR/g4KCgoKCg4GBgYCAgoGAgIKBg4KBg4SDhIKEgoGBgoGCgn9+gIF/fn1+fn5+fX59fXp7fIWEe3tzeXp8cHd1dnd5dnR6hISBhISDhIWFhoSDg4WEgoODgoCBf4B/f4B9fX1+f31+f39/fn1+fH19foF/gIB/gIB/gIGDgoGAf36AgH+AgYCBgH9/f39/f4CAgIGCgoKBf4CDgX+Ag4J/f4B/gX+Af3x7fHp8e3yBgH+Cf3+BgIKCgYF/fn+BgH6BgoKDgYGDg4KDgoSCgYGBgIGCgH6AgH9/fX5+fX19fn1+e3t6gH94fHZ5eXtxdHh3dnh1cnmFhYKEhIKEhYWGhISChIOBg4GAgIF/f4B+gHx9fX6Afn5/f39+fX98fn5+gX+Bf39+f4B/gIODg4F/f4GBgIKBgYGAgICAgICAgIGAgYKDgYF/gISBfYGDhICAgX+BgYKBfXp7e3x8fX99f4B8f399fYGAgH59fYB/foGBgYKBgIKCgoKBg4KCgYB/gYKAfn9/fn99fX1+fX19fX19ent7fHZ9eXh5enJ1eXl2d3dzdYaFg4WFgoSEhYSEhIKDgoGDgX+AgX5/gH6AfX19fn9+f4B+fn99f3x/f3+BgIF/f3x+gH6AgYKDgYCAgoOEgoGAgYB/gYCAgYGAgYGCg4KBgX+Ag4B+goKEgICCgYKChIJ+e3t8fHx9fX1+fXp+fX14fn9/fHx8fn1+gYCBgYCAgoGBgYGDgoGBf4CAgoB9fn19f319fX59fH19fX16e3p8dnx6d3t4cnZ5e3Z2dnN0hoSEhYSBhISFg4OCgYOBgYOBgIGBfX+BfoF9fX1/f39/gH5+f359fYB/gIGBgX9+fH5/fn5/gYJ/gYGCg4eFgX9/fn6Af4CBgICAgIKCgYCAfoCCf36BgoKBgYOCg4OFgn99fX18e3x8eXp7en55e3l4f357e3t+fX1/f4F/gH6BgICAgoOCgYF/gIGBf31+fH1+fX19fX18fn58fXx5e3x4enx3endzeHd6c3d2c3SGhISFg4KDhISDgoKCg4GCgoGAgYF8gIB+gH1+fX5/gICAf35/f3x+gH+BgIGAf359f39+fn+BgH2AgIGDhIN/f359fn5+f4B/gIB/gYKBgH9+f4F+f4CCgoCBhIKEhYaEgH59fHx8fHp5dnl5enl2eXZ+fHt7e358e399gH99fX9/f3+BgoGBgX5/gYF+fX18fX19fX19fXx+jYF8fXl7e3p5fHd4eHR1dXhyd3d0doaEhIWDg4ODg4OCgYKDgoGDgn+Bf39/fn+AfX19fX+AgIB/f39/fIB/f4GAgYCAf32Af31+fn9/fX5+gIGCgn5/fn1+fn5+f3+Af32AgIB+fn5/gX5+gIKBf4GDgoOEh4SAgH58fXx8e3x1eXl4eHh5d3t8e3p7foV9fn1/ent+fn59foGAgIGAfX6BgH59fXx9fX19fX18e32DgXx8ent7e3p7d3Z4dXJzdnF4eXJ4hYWFhYOEg4KChIKBgYKBgIKBgIF/fn5+foB+fX58foCAgH+AgX98gH6AgH+BgIB/fYB/fn5/f319fX6AgYKBfn9+fn59fX5/fn9+fH+Af35+fn+Cfn6AgIF/gYOCg4OGhICBfnx9fHx7fHh3e3h1eXd3eXx6e3t9kod9fH13en1+fn19f35+gH98foB/fn19fH19fX19fXt8ent9enp4e3x6ent4dHh1cXJ0cHh4cXmEhYWFg4SDgoODgoGBgoKAgYGAgIB9fn5/gH18fn1/gIGAf4CBgHyAf4B+f4GAf399gH9+f39/fX18gICAgYB+f35+fn18fn9/f358fYB/fn1+gIJ/foCAf36BhIKCg4WFgoJ+fX17e3x8eXd7eXd4d3d4e3t6e3yFin17end6fH19fHx9fX1/fnx9fn59fXx8fX5+fX18fHt6enx7e3p5enp6enhzd3VxcXJweHdxe4WGhIWDhYKBg4OBgYGBgoCBgICBgH5/fn+AfXx+fYCAgoGAgIGBfX6Af35/gX+Af3+BgH+Af31+fH1/gICAgH9/f35/fXx+f39/f319f39+fn6CgYF/gIB/foGDgoKEg4SCgn5+fHx6fHt7eXt6d3N2d3h5e3p7eXp/fnt7d3p8fXx8fH59fH19fH19fXx8fX19fX99fXx9e3l7fHx8enp6enp6eHN2dXBwcm93dnJ7hYaEhYOEgoGDgoKCgYGCgYKBgYGAf4B/f399fX9+f4CBgYJ/goF9foF+foCBf4B/gIKAgIB+fX58f3+BgICAf4B/f4B+fX5+f4B/f39/gH9/f4J/gH9/gIB/gYGAgISBgoKAf39+f3x9fn56fYV+dHx9enp6enx5eXp6hoV3eXx8fHx8fXx8fHx8fX19fHx9fX19fn19fX16eX18fH16enp6enp5c3V1b29xb3d0c3yFhoOEgoOCgYKBgoKCgYKBgYGBgYCAgICAgH59gH+Af4GCgn+CgX+AgX5/gYB/f4CAgn+Bf319f35/f4KAgICAgIB/gIB+fn1/gH9+gIB/f39/gH+AgICAgH+AgYCBgYGCgYCAf39/fn1/fnqBk416fH18e315e3p6eHmBgXh5e3x8fXx8fHx8fHx9fX18fH18fn1+fn59fHp8fHt9fXt5enp6eXlzdXVvb3Fwd3N0fYWGg4OCg4KAgYCCgoKAgYGBgYKBgYCAgIGAfn6Af4GAgYKCgIKCgICCfoCBgX9/gX+BgIF/fH6Af3+AgoCAgICAf3+AgH9+fX6Afn2AgIB/f3+AgICAgYCAf4CAgYCBgYKCgICAf39/fX5/fIGGiXx8fnt7fnl6e3p7jX53d3l8fHt9fHx8fHt9fH19fX18fXx+fn5/f358e3x9e319e3l6e3p5eHN0dW5zcXB4cnV6hYaDg4KDgoCAgIGCgX+CgYKBgoGBgYKAgYF/fn9/gYGCgYKBhIOAgYJ/gYGBf4CAgIB/gX99f4F/gICBgICAf4B+gICAf359foB+fn+Af39/gH9/gICBf4CBgH+BgIGCgoKAgICAgIB9foB9gIOCe35+e3x9e3p8fHuHeXh4eXx8fH17fHx9fX18fH19fn19fX5+f3+Af317fH18fHx7enl7e3l5c3J1bnZycHhxdXaFhYOEg4KCgICAgoF/gIKCgoKDgYGDgoCCgYB/gICCgoKBg4KEhICBgX6BgoB/gICAgH+Cf36AgYCCgICAgIB/gH+AgIB/fn2Af35/f4CAgH+AgH+AgYGAgICAgIGAgYGBgoGAgYCAgH9/gH5/fX59fn57fXx9fHx8eHh1eHh5e3x8fXt8fHx8fX5/f39/fn19foB/gIGAf3x9fHx9e3p7eXp8eHpzcnVud3FxenF2d4WFg4ODg4KBgYKDgH+CgYWDg4SBgYOAgoOCgYCAgYKDgoCCgoSDf4GAfoKDgICBgICAf4CAf4GBgIKAf4CCgH9+gICAgICAf4CAgH+AgICAgICAf4CBgYCAgICAgYGAgoKCgoCCgYGBgYB/f4B/gId+fnx6fXx7fX94d3Z5eXp8fX18fXt8fH19fn5/gIGAfn1+gICAgoGAfH59fX58d3t6ent6eXRxdW53cHV6cnZ5hYWCg4KDg4KDhISAgIKBhoOEg4GChICEg4KCgICCgoSBgYKChIJ/gIB/gYOCgYCBgYCAgIGBgYGAg4F+gIOCf35/goGAgIB+gYCBf4CAgYGBgYCAgIKBgYKBgYCBgYGBgoOCgoOBg4OCgYCBgH+AhH19fXx/fXp9gHp5dnp4eXt7fH19e3x9fX19fn+AgYGAgH+AgICDg4B9f35+fn15eXt6enp5c3J1b3dxd3lzd3uFgoKDgoOEgoOEg4CAgoKGg4ODgoKEgYSDgYKAgIKBg4GCgoGCgX6BgICCgYKBgYKCgIGAgICCgoGEgH6Bg4J/f4CDgoCBfoCCg4KAgYGBgoKDgoGBg4KChIGAgYOBgYKEg4KEhIODhIODgYGBgYCCf4B/fYB8enx/e3t3fHl5eXt6fX59fHx8fH1+fn+BgYCAgIGBgYSEgH2Af39/f357e3t6e3pzcHhyeXR2eHR3e4SCg4KDg4SChIODgYKChIaEgoODgoSBhISBg4CBg4KCgoKCgIKAfoGAgIKBgoGCgoKBgIGBgYOCgoOAfoGDgX9/gYSEgYN/goKBg4KCgoGDg4OEgYKEgoOCgoGCgoOBg4SDhISEhYSFg4SCgYOCgoOBgYGAgH58fIB8fHh8eXp5enx9f3x7fHx9fX18fICAgICAgYGBgYKBfoGAgICAf3p7fHp6enVweHd5dnV8dXZ8gICDgoODg4OEhISAgoOFhYWDg4KDhIGEhYKCgYKDg4GCgoKAgYB9gICBgYKDgoKCgoGAgYKCg4KCg4B/gYKBgICChIODgoGCgoGDgoKDg4SDg4SAgoSDhIOBgX+Bg4KDhYKEhISEhISDhISChIOEhIKBgoGBgHt+gX59eXx6enp9fXyBfnp8fH19fHp7fn5+gIB/gYGAgICAgIGBgIB/fX18fH18dnJ2eHh2dH92dX2Hh4OChIWDg4SFhICChYWEhIOCg4SEgISFg4KCgoODgYOCgoCCgH2AgIGCg4KCgoKEgoGCgoOEgoKBgICBgoGAgYOFhIOCg4CCgoOCg4ODg4OEg4CCg4KEg4KCfoOBgoSEgoODhISEhIOEhIOEg4WEg4ODgoKAe4CBf3x8fXp6e32AfX9/fHx6fH59fX19fn5/f39/gICAgH9+foCBgICAfnx9fX5/fn18e3h2f3Z3f4SHg4KDhYODhIaEgYKGhoWEhIODhISChIWFgoKDg4SCg4KDgoOBfoCAgoKDgoODg4SCgYKCg4OCg4GBgYGDgn+ChISDg4KEf4KEg4ODgoSDg4SCgIOEg4SDg4KCg4KChIOCg4OEhISEhIWEg4OEhYSFhIOBgoB9gYKAfXx8e3x8gH19foB+fn1/fnx8fX19fn5/fn+BgYGBgH99fX6BgYB+fn19fX59fX5+f39/fH2BgYKCg4OGg4SDhoSBg4iHhYSDg4SEhYGFhYWDg4SDhIODgoOCg4F+gYGDg4SCg4OEhIOCg4KEg4ODgoODgYOCf4KDg4ODgoOAgoWDg4ODhIODhIOBgoOEhYOCgoODgoGEg4GDg4SDhISEhYSEhIWFhYWEg4OEf32BhIB9fXx8fHx/gX5/f39/fX99e3x9fX19fX5+f4CBgIGBgH59fH6Cf39+fn5+fX1/f39/gYCAf4CEhIODhIWDhIOFf3+CiouFhISDgoSFgYaGhoOEhISEhIODg4OEgn+BgYODhYSFhIWEg4KEhISFhIODgoODhYKBhISFhYaEgoCDh4SDhIOFhIWFhIGEg4OGgoOCg4GCgoSDgoODhYODhYWEhYWHh4aHhYSEhYSAf4GDf35+fH59fX+BgH9+fHx+f358enx9fX19fX5+fn9/gIGBf319fIB/gH5+fn5+f3+AgYGBgYKAgYWFhIOFhIKEg4aAgoWFiomEhIOEhYWDh4aGhISEhIWEhYSEg4SDgYKDg4OEhIaEhYSDg4SEg3yDhHuBhHd5g4F9hH5+cnWDgoF2foOEgX2BdYF6g39/f3+EhIKDg4KBg4SDg4SFg4SFhoSFhn2EeXx+f4N7hYKBhIOBf35+fn19gYOBfXt/fX6Afn18fHx9fX19fH19f4B/gYJ/fX18f4GBgICAgH+BgYGCgYKDg4KChoSEhIaEgYOEhYOEhYSKiIWFhYOFhYSGhoaDhISFhYWEhYWEhIWCgoOEhYWFhoSFhIODhYWCaICFanx7cXF8gXOGc3R0fYKDdXNxg4ZzcHVyc3SDdnt9dYF/goOBgnZ5hYCDgIR/hYSChYWCaHpyc3N8gHOCg36Dg32BfX5+fX6Cg4F8f4B9f4B+fXx8fHx9fHx8fn1+gH+BgX99fX2AgYKBgYGBgIGBgYKBgoKCgoSHhIWEhYSBgoSGhoOGg4aIhoaFg4aGh4eGh4OFhYaFg4KFhoSFhYODg4SEhoaGhIaEg4SFhn1xe4FweXZ+g3+CbnlwdXN8dnl5hXKEg3B2eHF2dHR1cnN0dml/gG5yb3R2bnVsd217c26AiHltfXJzdnN2bW14bHB5bHV9f399foGAgX1/fn2Af4B/fX18fH19fH1+f32Af4CAfnx/foCBgoCBgICAgYCAgIKDgoOEhYiGhoCChYODhIeGg4aFhYaHh4SDhoeIiYaHhIWGiIeEg4WGhYWEhIOFhIKFhoaFhoWEhoWHdnB0e3BydX+HhYNtdW92b3x1coR5eYd4cXR3bndnd3pucHWCcoN+b3p5eW1vbnpvb213fXiGcHF6cHJ0ZoF1fm57eXNveX+Af319gX9/fH99fIF+gIB+foCAgYB+fn9/foF/gH9+fYB9f4CBf4B+fn+BgH9+goOCgoSFh4eEfoeEg4OFh4aEhoWFhoaIhISGh4iIhoeEhoaLiYWEhoeHhYSFhYWEgoWFhIWGhYWGhYZxdXByc29zenl+hHSIdHV+iHZugnKEhnluanJ/cW1zd3x/dXR8hH54cXV3bnl1enF2eHV6eYRxam95eHBreXN6b3p3dnZwgYB/fn5/f356fn19f31/f359gIGDg4CCg4GBhIKBf4GBgH1/f4F+f35+f4GAfn6BgoCAgYSHhoODhoSFhYaHhoWFhYWGhoiFhYaFh4eFhoSGhomIhYSJioiFhIaGhYWDhYWEhYaGhoaFg3iLeXKIentwcIWFeIV4eWtzfnl7a3KDh4N6fG17eXl0fYB2bm+AgG90fHV3cXl9fW1+dW+DhYZ6gHJye3x1cG96bHN8bneCgIF+fn99fXt9e3x9fX9/fX1/f4KCf4GDgYGDgYB/gICAfn9+f31/fn1/gH58fYGAfn6Ag4iFhoOFhYWFhoeFhYWFhoeHiIaEhoWHhoaFhIWFhYWFhomJh4aEhoWGhoWGhoSGhoaGhoWGh4eHhoaEhoWGh4iHhYeGhoOHhoWFg4SGhoWGhIaEg4SEhoSEgYODhISFhIWEhYSGg4aHhYaEhIWHhoSEhYaEhX13hYOEhIKBgX1/fnt8e357fHx9f359fH5+gYB9f4F/f4GAfn5+gH5+f35+fX99fX5/fHt8f358fH+BiYaFhIaGhoWHhoWFhYWHhoeIhoSGhYaGhYWDhIWGhYSGhoaGhYWGhIWGhoaGhYaGh4eGhYeIiIiIhoSHhYaGiIaFiIeIhYeGhoiFhYaGhYaGhYOChYWGhYWDhYOEhIWEhYWEhYWDhoeGhoWEhoeGhISFhoOFhIKEg4OFg4OCfYB/e3t8fnt8fH1/fnx8fn2Af31+gH5+gH99fXyAfX5+fn5+fnx9fX57fHx/fHt7fX+Ih4SEiIaGhoeGhYWEhoaGhoiHhIWGh4aFhIODhIaFhIeFhYaFhIaEhYaGh4eFh4aJiIaGiIeIiYiFhYiFhoeGh4aHhoeFh4eGh4WFhoeFh4aFgoOFhoaEhIOEhIOEhoSFhYWGhoOGhoWGhYSGhoWEhIWFg4WHhYOCgoWDhIF+gIB8e31+e3x7fX59e3x+fX5+fH9+fX1+fn19fH98fn58fYGAfHx8fXx8fH56e3t9foiHgoWIh4eGhoaGhISGhoeGiIaEhYSGhoSFh4OEhYSFh4SFhoaFhoSGhoeHhoaIh4mIhoaIh4iKiIWHiIWGh4WHhoeGh4WIiIeHhYaGh4WGhoWBhISFhoWFhISEg4SFhYaGhoWGhYaFhoeFhYaGhYSDhISDhIeDhIGChISDgYCAgXt7fn18fHx9fXx8fH19fH18fn18fX18fHx8fXx+fXt8gX99fH18fnx8fHp6fHx9iIeChoiHhoeGhoaEhYaFhoWGhYOFhIaFhIiJg4GEg4SGhIaGhoaGhIeHiIiHh4eIioiGh4iHiImIhYiHhYeGhoeHh4WHhoiIh4eFh4eHhoaHhIKEg4SGhYaFhISEhISFhoaGhoaFh4WFh4WFhYeFhIOEg4ODh4GDgIKDg4KCgn+Ae31+fXt8fH59fH19fH17fHx8fHx8fXt7e318e358e3x/fX18fX1+fXx6ent7fHyIh4KGhoaGh4aGhYSFhoWFhYWEg4WChoSDiId/enqChYaEhoaFh4aEh4eJiIiHhoiKh4aHh4eIiYeFiIeGh4eGhoeHhYeGiIiHhoWHh4iGhoeDg4SEg4aGh4WFhISEhYaGhoaGhYaHhoaHhoaEhoWDg4ODgoOGgYN+goKDgIOCf398f35+fHx9f318fX18fXp7e3p7fHx8e3t7fnt7fXt7e358fHx8fX5/fXt6fHp8fYmHg4aFhoWGhoWEhIWFhYWFhIOBhYGGhIKEhHyAhn+ChYWGhYWGhYSHh4iIiIaFiYqHhYeGh4eIh4WIhYaHiIaGh4eGh4aIiIeFhoeGh4WFh4OEhoWEhoaHhoWEg4WFhoaGhoaFhoaHhoeHhYOGhYOBg4KAg4WCg36BgYF/g4F/fn5/fn98fH1/fXt9fXx9enl6eXt8fXt7e3t+fHx8fHp7fXx8fHx+fYF8e3t7e3x7iYeEhoSGhIaGhYSFhoWEhIOEgoCDgYWDgYJ/eoSMe4CEhYeGhoaFhIeIh4aHhYWHioeEh4WGhoiGhYeEhoeJhoaIiIeHhoeIhoSGhoaHhYWHg4SFhIaGhoeFhISDhYWHhoeGhoWGhoaFhoaEg4SFgoGCgYCDg4KCfYGBgH6DgX5/f4B8f3x9fX59e359fH15eXp5e319enp7e318fXx8ent9fHx9fH5+gHx7e3x+fXyIh4WGhYaEhoSFhYWFhYODgYOBgIKBhYKAgH9/fXx7gYSFhYaEhYSDh4iGhoaFhIaJhoKGhIaGhoWFh4WHiIiGhYiHiYeGhoeFhIaFhYeFhIeDhIWEiIaGh4WFhIKGhYaFh4aHhIaGhoaFhoODg4WBgIGAgIOBg4B8gYB+foKAfYB/gXx/fH1+fX57fn18fHl6enl6fX15ent7fHt8e3t6e319fH18f35+fHt7fX59fIiGhYaGhoSFhYSFhYSDgoKAgoGAgICDgX5+foB5en2Ag4OEhoWEg4OHhoOEhYSChYiFgoSDg4WFhYWHh4aIiIaFiIeJh4aFhoWDhoSFh4OEhoSEhYSHhoWGhYaEg4aFhoaGhoaEhYaGhYWFgoKDg39+gICAgX+DgHuBf31+gn5+gH6Afn99fX59f3t/fXt6eXp6eXp8fXl6ent7enx6e3t7fH19fXyAfn18fH1/fnx7h4WFhoaGhoSFhIWDhYKBgICAgYB+f4KCfX1/f3t/f4KDg4WGhYSDgoaDgYOEgoCFh4WCg4GBg4WEhIaGh4iHhYWIhomHhYSEhIKFg4SGgoOFhIWGhIeGhYWFhoOEhYSFhoWGhIOFhIWDhYWBgYODf35/gH9/gIN/e4B9fX+CfYCBfX6Bfn19fX1/e398e3p5enp5enp8eXp6ent7fHp7e3t8fX59fYB9fXx8fYB/fXyGg4aGhoaGhIWDhYKFgYGAf3+AgH5/gIJ9fn9/foCAgYKChISDgoGChIGAg4KBgISFhYKBf4CCg4OEhYaIhoWEhoeFh4WFgoOCgoOCgoWBg4WEhYaEhoaHhoaFgoSEg4SGhYWDhIODhIOFhICAgoJ/fX1/fn5/hH57f3x8gIF9gYB9fYN8fn59fX57fnt7enl7enl6ent5enp6e3t8ent8fHt9fn1/gXx9fHx9f4B+gIaEhYWEh4SEg4KGgoOAgYB+fn+AfX9/gXx9f39+fn+BgYKEg4KBgYKCf4CBgoCAgoWEgoB/gIGCgYOFhYeFhISGhoOFg4WBgoGBgoGCg4GChISEhYWGh4eGhYSDg4ODhIWFhIGDgoOChIODgH+AgX59fH5+fH6Dfnx+fHyBgH6Cf31/gnx/fn19fHx8e3t6enp6eXt6enp5eXp6e3x5e317fH5/f4GAfX59fX1/gICAhoSEhYSFgoSCgoSCgoCBgH59fn9+fn6AfX2Af35+foGBgoODgoSHgYF+gICBf3+ChIOBf35/gIJ/goWEhYSCg4WFgoSBg4CBgIGBgYKBgIGEg4OGhYWHh4WEhIWCgoKDhYSCgYGBgoCFg4F/foB/fnx8fn18foN9e318fYF/gIN9fYCBf35/fXx8fH17e3p6enl5e3l6enl6ent7e3p7fXx8f3+BgoB+gH+AgH+AgYDKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzNzc3Nzc3Nzc3NzczMzMvLy8vLy8vLy8vLy8vLzMvLy8vLy8vLy8vLy8vMzMzMzM3Nzc7Oz8/Pz9DQ0NHR0dLS0tLS0tLT09PT0tLS0tLS0tPT09TU1NTU09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tLS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1dXV1NTU1NTT09PT09PT09PT09TU09PU1NTU1NTU1NTU09PT09PS0tLS0tPT09TU1NTU1NPT09LS0tLS0tLR0dHR0dPHhnNlYFtLWWdVTUZIQD03Nzg5Nzw8PDo8Oz42Oj04PDs6OTg3ODs7Oj87PTs8PD47P0E/QkJBQ0RFREE+PTw7QENDQUBDQ0FBR0hHSUtSwtXS09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXVysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMy8vLy8vLy8vLy8vLzMzMy8vLy8vLy8vLy8vLzMzMzc3Nzc3Oz8/P0NDQ0NHR0tLS0tLS09PT09PT09PT09PS09PT09TU1NTU1NTU09PT09PT09PT09PT09PT1NTU1NTU1NTT09PT09LS0tLS0tLT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1NTU1NPT09PT09PT09PU1NPT09TU1NTU1NTU1NPT09PS0tLS0tPT09PU1NTU1NTU09PT09PS0tLS0tLR0dHSzIxyZ2BcTVllUktHSz87Mzc4Ozg5Pj05PDpBOjs9Nzs8PDo6Nzg6Oz0/Oz88PTw/Pj9BPUFBPkNDREJAQT46Oz9DREFDRERCQklHSEhJTr7V0tPT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1crKy8vKysrKysrKy8vLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzMzMzMzMy8vLy8vMzMzMzMzMzMzLy8zMzMzLy8vLzMzMzc3Nzc3Ozs/P0NDQ0NDR0dLS0tLS09PT09PT09PU09PT09PT09TU1NXV1dTU1NTT09PU1NPT09PT09PT1NTU1NTU1NTU1NPT09PS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1tbV1dXV1dTU1NTT09PT09PT09PU1NTU09TU1NTU1NTU1NTT09PT0tLS0tLT09PU1NTU1NTU1NTU09PT09PT0tLS0tHR0s+Sd2hfXk9XZ01LRkw9ODc2NTk5OTw+OT88RDo7PDc5PD07OTc5Ojw9QDs+PT47PD48PT5BQD5EQ0NDP0E9Ojs9QkNFQ0NEQT9FSEpJSky61dPT09TU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8rKysvLy8vLy8vLy8zLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMzMzMzMzMzMzMzMzMzczMzMzMzMzMzMzMzMzMzc3Nzc3Ozs/Pz9DQ0NDQ0dHS0tPT09PT09PT09TU1NTT1NTU1NTU1NTV1dXU1NTU1NPU1NTU09PT09TU1NTU1dTU1NTV1dTU09PT09LS0tLS0tLS09PT09TU1dXV1dbW1dXV1dXV1tbW1tXV1dXV1NTU1NTT09PT09PT1NTU1NTU1NTU1NTU1NTU09PT09LS0tLT09PU1NTU1dXV1dTU1NTT09PT09PT0tLS0dHRmn5nYWJOVWpKSElLPzw6OTM3Njc3PTs+OT06Ojo4ODo7Ozg4Ojs7PD46PT09Ojw/PD0/QkA/Q0RDRD5APT08QENEQ0JEQkQ+REhJSUtMttfT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3MzMzMzMzMzMzMzMzNzc3NzczMzMzMzMzMzMzMzc3Nzc3Ozs7Pz8/Q0NDQ0NHS0tLT09PT09PT1NTU1NTU1NTU1NTU1NTV1dXV1NTU1NPT1NTU1NTU1NTU1NTU1dXV1NXV1dXV1NTU09PT09PS0tLT09PT09PU1NXV1dbW1tXV1dbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1NTU1NTU1NXU1NTU1NTT09PT09PT09PU1NTU1dXV1dXV1dTU1NTU09PT09PS0tLR0p+DaV9kU1hsSEhIS0A9Nzg0NzY6Oj87RDw8OTw8OTg6OTo6Ojs8Ojo7OT49Pjk9QDs/QUFCP0JCQUM9Pz8+PEBCRUNDQkBBO0ZJR01MSbLY09TU1NTU1NXV1dXV1dXV1dXW1tbW1tbV1dXW1svLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzM3Nzc3Nzc3Nzc3Ozc3NzczMzMzMzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc3Mzc3Nzs7Ozs7Pz8/P0NDQ0NHS0tLS09PT09PT09TU1NTU1NTU1NTU1NTV1NXV1dTU1NTU1NTU1NTU1NTV1dTU1dXV1dXV1dXV1dTU1NTU1NPT09PT09PT09PU1NXV1dbW1tbW1tbW1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTV1NTU1NXV1dXU1NTU1NTT09PT09PT1NTU1dXV1dXV1dXU1NTU1NTT09PT09LS0tSjiGxfZlJWakdIR0lBPjM2Njo7PDhDPEJBPjxBPDg5Ojw6Ojw8PDk8PTo7PD09PD89QD9AQT9AQUBCPD4+PzxCQ0NDRkBBQT1ISklOTUeu2NPU1NTV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbMzMvLy8rKysvLy8vLy8vLy8vMzMzNzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzs7Ozs7Oz8/P0NDQ0NHR0dLS0tPT09PT09TU1NTU1NTU1NTU1NTU1NTV1dXV1dTU1NTU1NTU1NTU1dXV1dTV1NXU1NTU1dTU1NTU1NTU09PT09TU1NTU1NXV1dbW1tbW1tbW1tbW1tbX19bW1tXV1dXV1dXV1dXV1dTU1NTU1dXV1dXV1dXU1NTU1NTU09PT09PT1NTU1NXV1dXV1dXV1dXV1NTU1NPT09PT0tLWroprY2VSWGhMSkdJQjg0OTQ6Ozo5QDk/Q0VAPDw5OTk9Oj07PDw6PTw7OTw9Ozs/PUA9PT5AQD9CQT5APD05QERDQkFBQj48SEpLTU5IqNnU1NXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbWzMzQ0dDQ0NDQ0dHR0dHR0c3Ky8vLzMzMzMzMzMzMzM3Nzc3Nzc7Ozs3Nzc3Nzc/Pz8/Pz8/Pz8/Pz9DQ0dHR0dHR0dHR0dHS0tHV2djY2NnZ2dra2tvb29vZ2dnZ2dna2tra2tra2tjW19fX19fX19jX19fX2Nzd3d3d3d3d3d3d3d3d3Nvc29vb29zb29vb29vb2tra2tra2tra2trb3NzX1dXV1dXV1dXV1dXW1tbX1tbW1tbV1dXV1dXV1dXV1dTU1dXV1dXV1dXU1NTU1NTU1NTU09PU1NTU1NXV1dXW1dXV1dXV1dTU1NTT09PT09PS1bqKa2hoUlhlSUlMT0A5OTo0O0E8Nz05QUM+QD89ODo6Ozk9Oz4/Ojs8PDo7PDo7Pj1APT8/P0FAQUE/QTw8Oz5BRENBREA9PElJSk1ORqPa09TV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbW1szNloSGhoaGhoeHh4eHh4Ky4t3d3t7e3t7e3t7e3t3S0NDQ0NDQ0NDQ0NDQ0ci5ubm5ubm5ubm5ubq6t6WkpKSkpKSkpKSkpKSnhmBjY2NjY2NjY2NkZGRlhIuKioqKioqKioqKioemuri4uLi4uLi4uLi4ubN4c3Nzc3Nzc3Nzc3Nzc3qCgYGBgYGBgYGBgYGBg4uKioqKioqKioqKiouHvebh4uLi4uLi4uLj4+Pi2NfX1tbW1tbW1tbV1dXV1dXV1dXV1dbW1dXV1dXV1dTU1NTU1NTU1NTV1dXV1dXW1dXV1dXV1dXV1NTU1NTT09PT09XDkXFrak5TYkxMVk48Ojo3Nz5DPzg+Oj8/QTw/QDc7Ojs7PTs+Pjo7PD48Oz07PT8+QDw/Pz1AQEBBPj88PjxAQUVCQkZAQD9HSEpLT0ae2tXV1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19fMzm5QU1NTU1NUVFRUVFNMoPPr6+rq6urq6urq6uvp1dLS0tLS0tLS0tLS0tTEqaqqqqqqqqqqqqqqq6aGhIWFhYWFhYWFhYWFik4MEhISEhISEhISEhIRE0pUU1NTU1NTU1NTU1NPg6ejo6Ojo6Ojo6Ojo6WZMikrKysrKysrKysrKyk1RUNDQ0RDQ0NEQ0NDQ0ZTU1NTU1NTU1NTU1NTS6ry6+vr6+vr6+vr6+vr6dnX19fX1tbW1tbW1tbW1dXV1dXV1dbW1tbV1dXV1dXV1dXV1dTU1NTV1dXV1dXW1tXV1dXV1dXV1dXU1NTU1NTU1NPUy5h2bGlKTl9NUlVNPjw8Nzs/Qz42Ojc+Pjs9Qj85PDk9Ozw6PD07PTs9Ozs9PD0+PT07QT08QUBBQT08Pzw7QEJDQURFPUFAQ0ZLS09GmNzV1dXV1dbW1tbW1tbW1tbW1tfX19fX19fX19fXzM5xVFhXV1dYWFhYWFhXUKHx6enp6enp6enq6unq6dXS0tLS0tLS0tLS0tLUxaqrq6urq6urq6urq6yoiIeHh4eHh4eHh4eHh41SEhgYGBgYGBgYGBgYFxpOWVdXV1dXV1dXV1dXU4WopKSkpKSkpKSkpKSmmzgvMDAwMDAwMDAwMDAvO0lISEhISEhISEhISEdKV1dXV1dXV1dXV1dXV0+r8erq6urq6urq6urq6unZ19jX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dXV1dXV1dXU1NTU1NTU1NGcenFpSlRdT1JVTkQ+Pzs/QEA4Ojs4PDs7PD86Ozs4Ozk5Ozw7Ojw5Ozs8Ozo9PT0+PUE/Pj8/Pj08PT88PEFBQ0FERTw+QEVGSktNRpPc1dXV1tbW1tbW1tbW1tbW1tfX19fX19fX19fX183OeF5hYGBgYGFhYWFgYFqk7ufn5+fn5+fn5+fn5+bV0dLS0tLS0tLS0tLS08Wtrq6urq6urq6urq6vq46NjY2NjY2NjY2NjY2SXSInJycnJycoKCgoKCcpWmNiYWJhYmJiYmJiYl6MrKmpqampqampqampq6BFPT4+Pj4+Pj4+Pj4+PUhVVFRUVFVUVFRUVVVUVmBiYmJiYmJiYmJiYmJbr+/p6enp6enp6enp6enn2djY2NjY19fX19fX19fX19fX19bW1tfX19fW1tbW1tbV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbV1dXV1dXU1NTU1NTWo3txZElbYE5OVU9AQT89REI+Oz06OTs6PT07PDs6OTg5OTs8Ozw8Ojo7PDo7QD08PTxAQTxBQTs7PEA/PD1CP0RDQ0U8PkJERkpMTEWN3NXV1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjNzcfFxcXFxcXFxcXFxcXEy9DPz8/Pz8/Pz9DQ0NDQz87Ozs7Ozs7Pzs/Oz87NzMzMzMzMzMzMzMzMzMvJycrKysrKysrKysrKysfCw8PExMTExcXFxsbGxsvMy8zLzMzNzMzMzMzLz9HR0tLS0tLS0tLS0tLRysrKysrKysrJycnJycnKy8vLy8vLy8vLy8vMzMvNzc3Nzc3Nzc3Nzc3NzdTY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NfX19fX19fX1tfX19fX19bW1tbW1tbW1tXV1dXV1dXV1dbV1dbW1tbW1tbW1tXV1dXV1dTU1NTU169/cF5GXmJQUVdOR0ZDQ0lBPz07PDo8OEBCPD04Ojo4OTg7Pzs8PDs7PDw8PD87PD46Pj44PkI8Pj1BPjw+QkBERUNAPD5APkNJSUtEh9zV1tbW1tbW1tbW1tbX19fX19fX19jY2NjY2NjYzs3Pz8/Pz8/Pz8/Pz9PPz87MzczP09LSzs3P0s7Ozs7Ozs7Ozs/Rzs7S1M/OztPTz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0NDR0dHR0dHS09PU1NTU1dXV1tbW1tfW1tbX1tfX19fX19fX19bW1tbW1tbW1tbW1tbW1tjX19fX19fY19bX19fX1tfX19fX19fX19fX2NjX2NjY2NjZ2dnZ2dnZ2dnY19jY2NjY2NjY2NnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjX19fX19jY19fX1tbW1tbW1tbW1tbW1tbW1dbW1dbW1tbW1tbW1tbW1tXV1dXV1NTV1di4gm9XSl9jUlFaS0hBQTxCPT07Oj4+PD4/PT0/Nzk6OTk3OD48PD47Ozw7PDs/PT0+OTs7OT0+P0A+QD07OkI/QkNCPz0+QD5CRUdKQoDc1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2M7Ozs7Ozs7Nzc3Nzsqfys3Nzc3QuYOEi8fTwJrLz87Ozs7OztHBp9HSqKDQz9GkodDOzs7Ozs7Ozs7Ozs7Oz8/Pz8/P0NDQ0NDQ0NDR0dHR0tLT09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbV1dXV1dbW1tbV1dXV1dXV1NTU1NXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NfX19fX1tbW1tbW1tbW1tbW1tXV1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXYwIBuVU9gY1dZW0xMQ0A9PTs9Ojw+Qj5CQ0A8Ojg5ODo6Ojc7Pz4/PDw7PDo5Pzw8PTg5PD9BPj09PUFAPTtBQkBCQz47QD9BQUlHSkF629bW1tbW1tbX19fX19fX19jY2NjY2NnZ2djY2dnOzs7Ozs7Ozs7OztKpj63Rzs7Ozpu3tqSiwJOerNPOzs7Oz8/RnY/FtJ6jp9avn6Gp0s7Ozs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0dHS0tLT09TU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dbW1tbW1tXV1dXV1dXU1dXV1dXV1dXW1tbW1tbW1tbW1tfX19fX19jX19fY2NjY2NjY2djY2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2dnY2NjZ2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV18h/b1pTYWVeXVxPSkQ9QD8+Ozc6Pjk/RD9BOTg3ODk7Ozw4OT89PTw9PD47OkE7OTs5OzxDQDw7PT5AQT49QkQ/QkM9PT8+Pz5ISUg/ddrW1tbX19fX19fX19fX2NjY2NjZ2dnZ2dnZ2dnZzs7Ozs7Ozs7Ozs/Inrym0tDQzsqgl36Cw6abr6fUz8/Pz8/Tuq+quJ+ak53AnpiVnMjQzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dLS0tPT09TU1dXV1dXV1dXV1dXV1dbV1dXV1dXV1tbW1tbW1tbV1dXV1dXW1tbV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2djY2NjY2NnZ2dnZ2dnY2NjY2NfX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dbV1dXV1dfNiHNdWGloXl9gT0lGOkFAPj88PDo2P0JAQzo2NDc6Ozo8Ojk+PD49PTs/PTxBPjw8Ojw8PTw6PEA9QEI+PkFCPUNDPT0+Oz9BRUtIQHDZ1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2c/Pz8/Pz87Ozs7SrKWnqdXAvNLHnY+ey9PJipmq1M/Pz8/P05+xnaiaoZy0mJyinbCy08/Pz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0dHS0tLS09PT1NTU1dXV1dXV1dbW1tbW1dbW1tbW1tbV1tbW1tbW1tbW1dXV1dXV1dXW1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnY2NjY19fX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0JB1W1tqaWFeXVNOSTxDQEE+QD46OEZBP0M6NzQ5Ojo5Ozs4Oz0/Pj49QT08P0A9Pjw8PDw8Oj1AQD8/PT5CQD9AQkA8QD0+QUVLRz9r19fX19fX19fX2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnPz8/Pz8/Pz8/QzJ2Nl6zQmpfKxZ6ynpbN1q2ZqtTPz8/P0cCciZ6fm5atuYaelq+zqtXQ0M/Pz8/Pz8/Pz8/Pz8/P0NDQ0dHS0tLT09PT1NTU1NXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX19fX19fY19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tKUcl5ea2tqZV1PTEc/RENDQDo9OzxCPD49OTY0Ojk5Ojo5Nzs/QDs8PUA8PEE+PD07PTw/PDo8Q0A+PTs9QD5CPkBBPkA9QD9GSUQ/ZtXX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2traz8/Pz8/Pz8/P07GigJuvyaCjv8qcpYynrdiqmarUz8/Pz9SjooGgmJuBoJZ4m4Sdk6TV0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1NXV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dbW1tXW1tbW1tbV1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbSk3BgXnBoZmVaUUhHQkVDQEA3Ojo8Pjo8OTc2NTk6Njo8Ozc8QEA8Ojo9Oj0/Pj08OUA8PDo6OT9APj08PUBBQz9APz5BOz9ARkpCP2LS2NfX2NjY2NjY2NjY2dnZ2dnZ2tra29vb29vb28/Pz8/Pz8/P0M6fkGyclteqo9PSrqa1mJ/Vqpmq1M/Q0NHEn4F7moWfqIiceZ+phZmk1dHR0NDQ0dHQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1dXV1dbW1tbX19bW1tbW1tbW1tbX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfW1tfX19jY2NfX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX1tbW1tbW1tbW1tbW1tbX19fX19fW1tbW1tbX0pNuYFxxZGdkWlVKQENGQ0FCODs/PD07PDw4NTU4OTY4Ozo5PDo+Pzw9PTk8Pz49Ojo+OTw6Ojg+Pzw9PTw+QEFDQT48PDpCRERKRkJd0NnX19jY2NjY2NjY2dnZ2dna2trb29vb29vb29vPz8/Pz8/Pz9G9n8O31pfA09HQ0srSzZeb1KqZq9XRz9DVq6+8wNN2tLCmnIq9raaYr9bR0dHR0dHR0dHR0NDR0dHR0dHR0tLT09PU1NTV1dXV1tbW1tfX19fX19bW1tbW1tfX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19fY2NjY2NjY2NjY2NjY2djZ2dnZ2dnZ2dnZ2dnZ2drZ2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fX19fX19fW1tfX1tbX19fX19fX19fX19bW19GRbF1cb2doYl1PRkBISUdFQDw8Pj48PT48NzU2Ojk2Ojs6Ojs4QD86PDw5PD49Ozs6Pzk/Ojs5PT49PTs7PTxAQ0I/Pz47Q0ZGR0hEWc3a2NjY2NjZ2dnZ2dnZ2dna2trb29vb29vb29vb0NDQz8/Pz8/Pz5V+e6WS1KKa08ySl6ObodirmavV0pem1cmHf4WglaaXl52lp5aYm7vV0dHR0dHR0dHR0dHR0dHR0tLS0tLS09PU1NTV1dXV1tbW19fX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tbX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2tnZ2dnZ2dnZ2djY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX1tfPjGRWXnBrXGBgTkVITUlJT0M+OkI9PUBCOzU1Nzw6Nzo7Ojo7OT09OTo6OT0+Pz07OT47PDo8Ozk+PD47PD0+QENCPz5BPEFDR0ZGRVXJ29jY2NnZ2dnZ2dnZ2dra2tvb29vb29zc3Nzc3NDQ0NDQ0M/Pz9DR1aeZrcmjqL7KnbGdo7XZqZup2LirocbT09WcmMKiq6Sb0J+rpJzR09LS0tLS0tLS0tLR0dHS0tLT0tPT09PU1NTV1dbW1tbX19fX19fX19fX19fX19fX19fX19bW1tbW1tfX19fX19fW1tbW1tbW1tbX19fW1tbW1tbW1tbX19fX2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2djY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fX19fX19fX19fY2NfX19fX19fYzYZdV2JvZE9dVEtIRlNRS0xAPj1EPD9DRj01NTc7OTY6Ozo8PTo7Pzo6OTg6PT0/Pjs/Oz49Ojs5Pjs9PD0+QURCQD8+PzxAQUVHRURSxdvY2dnZ2dnZ2dnZ2tra2tvb29vb3Nzc3Nzc3NzQ0NDQ0NDQ0NDQ0NO5gL3Tm5bP1LWLkZ/T1LyBu9TOlKDS0dLXqIfOxpCNt9fCj4281dLS0tLS0tLS0tLS0tLS0tLT09PT09PU1NXV1dbW1tfX19fX19fY2NjY19fX19fX19fX19fX19fW1tbX19fX19fW1tbW1tbW1tbW19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2tnZ2tra2tra2tra29ra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2NfX2ct+WlVqaltMX01KTEpVTEZCPD0/R0ZIS0g9NjU3Ojk3OTo7Ojw9OT45OTo4Oz0+PkE+PTk8PDo9Pj46PTk5Oj9FQUA+PT8/QkBHRURFUMHc2dnZ2dnZ2dna2trb29vb29vb3Nzc3Nzc3dzc0NDQ0NDQ0NDQ0NDQ0cHR0crI0tDUxLjS0tHSwtLQ08fM0tHR0s/F1NTHw9XR1cXE1dLS0tLS09PT09PT09LS0tPT09PU1NTU1NXV1dbW1tfX19fX19fX2NjY2NjX19fX2NfX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29va2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2djY2NjX19fX19fY2NjY2NjY2NjY2NjY19rHd1xSZ2laTlpOTFBRV0VKPz89P0FFTExBPjc3NTs4ODk5Ojs8Pjw+ODo6OTs+P0A9Pj46NTo6Oz0/Ojs5Ojw+QkJAPz8/P0FCR0RDRE683dnZ2dnZ2dna2tvb29vb29vb3Nzc3Nzc3d3d3dDR0dDQ0NDQ0NDQ0NDS0NDR0dDQ0dPU0dHR0dPR0dHS0tHR0tLT1NLS1NXT09PU1NLS0tPT09PT09PT09PT09PT09PU1NTU1dXV1dbW1tfX19fX2NjY2NjY2NjY2NfX19jY19fX19fX19fX19fX19fX19fX1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tvb2tra2tra2trZ2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2trZ2tra29ra2trZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjbwXNYVWlrU0xSTlBSWVRGSTw+Qz9BQkVLPj43ODY5Njc4OTk7Oz0/QDw9ODk7Ozs/Pjw8OTU6PT47OTk7PD8/P0JCQT1BPUBBQkZCQkJLtd7Z2dra2tra2tvb29vb29vc3Nzc3Nzd3d3d3d3R0dHR0dHR0dHR0dDQ0NDQ0NDQ0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tPT09PT09PT09PT09PT09TU1NPT1NTU1NTU1NXV1dXV1dXW1tbX19fX2NjY2NjY2NjY2NjY19fY2NjX19fX19fX19fX19fX19fX19fX19fW1tbX19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2NjY2NjY3LxvVFRsbExLUkpUUlVLRkQ6PkdEREFERjw/ODk6OTY5OTo3PD07PkA9PTc5Ojs5Pjs5OTY2Oj1AQT47PDk6Pj9DQT4/Qj0+QkNFQkFCSrDe2dra2tvb29vb29vb29vc3Nzc3Nzd3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0tLS0tLS0tLS0tLS0tLS0tPT09PT09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1tbW1tbW19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19fW1tbW1tfW19fX19jY2NjY2NjZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2dnZ2dnY2Ny2a1NbcGtLVVdSXFFXSEQ+PEJKRT1ISj89PDc4ODo1OTg5Njs+PD1APDw1OTk8Oj87OTk0ODw9PUFBPD47Ojw+QD89PkE9PUNGR0I/Qkmq39ra29vb29vb29vb3Nzc3Nzc3N3d3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHS0M/U0M7P0tLT0tLS0tLS0tLS0tPT09TU1NTU1NPU1NTU1NTU1NTU1NTU1NTV1dXV1dXV1dbW1tbW19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19jY2NfX19fX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dndsGRTYXJfT1pUV19RUkdCPUVJTEFBTEQ/Pzs6ODg5Mzg2ODY5Pj0+Pz06Njo7Pjs9PTo5Njg6PTtAQDxAPz0/P0I+PD48PEJFR0lCPkNJpODa29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3t7S0tLS0tLS0tLS0dHR0dHR0dPT0bm7zLqbnLrQyNPT0tLS09PT09PT09PU1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2NjZ2dra2tra2tra2tra2tra2tra2tra2tra29va2tra29va2tvb2tra2tra2tra2tra2trb29vb29va2tra2tra2tra2tra2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ3qpfVWBuW1VZUVpeT0xHQ0ZNSUZEREo7QUE7PDg4NjQ4Njk4Nzw/QT89Ojc8Pz48Pz87OjY4OD09QEE9QD5BQD1AOjs6Pj1BRUdJQkBDR57h29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e0tLS0tLS0tLS0tLS0tLS0tO+wMqaoKKViJGeqpOpz9TT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fY2NjY2NnZ2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dna2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2tvb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2d6iXFVeblheXU5aUFROQ0NMSUlJRkpEPEJBPDs4NzY3OTc3OTk9P0E/PDo5QD88PkI/Ojg3NzY9Pz9APUBBPz88PTs7OD48P0VJSEE/Q0aX4dvb29zc3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3tPT09PT0tLS0tLS0tLS0tTIlZyum5m1iX2TjIKBhMTV09PT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tvb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dndmlpYYW5ZYVdPV01QRUJETElNS0ZJRT5CRDk4ODY3OTc1Njk4PT1BPjo4OT4+PD9APzw1Njc2PD4/PjtAQEA/Pj4/Pjs/PkFCRkdCQENIkeLb29zc3Nzc3d3d3d3d3d3d3d7e3t7e3t7f39/U09PT09PT09PT09LS0tLTz6h+kayPko6MhoCIiYSQo8rU09PT09PU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY19jY2NjY2NjY2NjY2NjX19fX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2tra29vb29ra2tra2tra2tna3JJaWWNuWlpSVV5QTDxAR05IUklIRT47SEY4OTc1Nzg3NTg5ODs+Pj07ODlBPj1AP0E+NzU5Njs+QUI/P0BAQkI/Pj8+QUBEQUZIQj9FSozi3Nzc3Nzc3d3d3d3d3d3e3t7e3t7f39/f39/f1NTU09PT09PT09PT09PWtaWaiIuQhYCFi4iBg4qLf4bC1tTU1NTU1NTV1dXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2dnZ2dna2dra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29ra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb2tra29uIWltnalxYTFpfVkg6TEhMSkpDRUZDQExINzo3Njc4ODU4Nzg5PDw7Ozk4QD89Pj8/PDY3PDQ3P0JCQUBAPz8/QT09P0A+QEBGRT09REuI4tzc3Nzd3d3d3d7e3t7e3t7e3t/f39/f39/f39TU1NTU1NPT09PT09PUxZKCg4WGfYGCfXx5foGCg36k29bU1NTU1NTV1dXV1dXV1tbV1tbW1tbW1tfX19fX19fX19fX19fX19jY2NjY2NjZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vc3Nzc3Nvb29vb29vb29vb29vb2tra2tra29vb29zb29zb29vb29vb29vb29vb29vb29va2tvb29vb29vb29vb29vb29vb2tvZgFpebWhaU0ldW1hKRE1ISlNMR0ZBQD9KQjg7NjY5OTc1ODY4Ozo7Ojw5OD09O0A9Ozo2NTw3Oz1CQEFBPD49QEE9PEA/Pz5CREU+PERLg+Lc3d3d3d3d3t7e3t7e3t7f39/f39/f39/f39/V1dTU1NTU1NPT09PT2LKEkKh9g3l2hIh/e3d5gn5+i67A1dTU1NXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dna2trZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2tra2tra2trb2tra2tvb29vb29vb29vc3Nzc3Nzc29vb29vb29vb29vb29va2trb29vb29zc3Nzc3Nvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc1nlcWmxmWFJPYFFSQUhHSkZYTEZAQENDSz87Ozc4ODc2NTc2ODo5PDw6PTs/PTs9Pjw7ODg8OT0/QkFCQzw8P0FCPj1BQkNCREVDQDtDTH3h3d3d3d3e3t7e3t7e39/f39/f39/f39/g4ODg1dXV1NXU1NTU1NPU0ruen3WKeXuIgICChYGDcnOAhYOMrNfV1NXV1dXW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NnZ2dna2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra29vb29ra2trb3Nzc3Nzc29zc3Nzc3Nzc3Nzb29vb29vb29vb29rb29vb29vb29zc3Nzc3Nzc3Nvb29zc3Nzc3Nvb29vb29vb29vb29vc3Nzc3Nzc3Nvb29vb3dByXV9wZVdLUGNPS0JHQ0pIS0ZBPEE9SFBBOjo3Nzg3Njc4Nzw6OD09PD47QD88Pz07Ojs5Ojk8QEJAQkNAPUFAPz1AQkNDQUBAP0A7RU144N3d3d7e3t/f39/f39/f39/f3+Dg4ODg4ODg4NXV1dXV1dXV1NXU18h4i4V8goh6g4SBfoKCc2l0hYuGkJ3U1tXU1dbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tvb2tvb3Nzc3Nzc3Nvc3Nzc3Nzc3Nzc29zb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb297KalxjcWVST1heSz9HTElPS0VAPkFCP0lPPjk6NzY7NzY6Ozc7Ojg6PDw+Oz09Oz48Ojs4OTo4OUFCQkFAQDtAQj06PkFCQz8+PT4/PUZOdN/e3t7e3t7f39/f39/f4ODg4ODg4ODg4ODg4OHV1dXV1dXV1dXV1s6dhpl+f5OTin+CgXx9gnNxm4mAgoOJwNnat7TQ19bW1tbX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tra2tra2tra2tra29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NvfwGNaW21gVlBTU0pETEhNSEk8PkFEQ0ZORDw8OTc5OjY4Ozk3PDk4OTw9OzlAPjpBPzw3NTc7ODpAQUVBPz45PUI/Oz1CQkI6Pj07PT5GTnHe3t7e3t/f39/f39/g4ODg4ODg4ODg4OHh4eHh1tbW1tbW1tbV1tjLioCHhYOXjHh7e3lvfYF1a3ebdHZ7eInHxpiMrdjZ19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2drZ2dna2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tra29vb3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29zb29vb3Nzc3Nzc3Nzd3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3Nzc3Nzc4LdjV1lrYlJNVVFMSktGS0ZDQD5CQT9FTT4+PTg5OTo3OTo3NT03Nzo+PDs7Qjw5Pz05NjY4PTk6QEJGQD49PEBCREA9QD9DO0A9PD4/Rk9t3N/e3t/f3+Dg4ODg4ODg4ODg4OHh4eHh4eHh4dbW1tbW1tbW1tfVrYZ6d32rn3l4entzdH+Dfm9xe3l6c3t2k4qFgImkzdnY19fX2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tna2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29vb29vc3Nzc3N3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vc3Nzb3Nzc3Nzc3N3d3d3d3d3d3dzc3Nzc3Nzd3d3c3Nzc3Nzc3N3d3d3d3d3d3d3d3dzc3OGtYVtebGJSTVZMTUdLS0RGQkI7QT08RUxDQT44Ojk6Nzc5NjY6NTs+QDs9Oz89PD89Ojk5Ojw5PEVDRkA/PkBDQkQ9OT0/QT1CPz1APkdPadvf3t/f3+Dg4ODg4ODh4eHh4eHh4eHh4eHi4uLW1tbW1tbW1tfQmH+Qh4N9eoN2e3Vzenl6kKqmd3JyfoeHh4CAfoKEhJHJzNnX19jY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra29va2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2djY2NnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vb3Nzc3N3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzb29vb3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3dzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3NzhpV9UYm1iUE9TSUhHRkpJSUJBPkJCPEVFREA+ODo4Ozc3Ojc4ODY+Pz07PDk9PDo+PTs6Njc7NjpEQUY+Pz8/PkNBPzs9PT47REM/PjxIT2fZ4N/f3+Dg4ODg4eHh4eHh4eHh4eLi4uLi4uLi1tbW1tbW19jYyH52doN+fnR2eIaCenl1d5yhu6GEgoCAfoeKinx/gYaMnKjO2NjY2NjY2NjY2djY2NjZ2djY2NjY2dnZ2dra2tra2trb29rb29rb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3d3d3d3c35pbT2drXFBRUElDT0pLR0xHSkJAP0FHREBBPDg8ODg1ODk3Njc3QEA/Ozw5Pj04PTw8Ojc4PTk/RENGPkE/QkBDPzw6Pj0/PkVEPz07S1Fj1+Hf4ODg4ODh4eHh4eHh4uLi4uLi4uLi4uLj49bW1tbW19XB3LRueHJze3B6eXaFiIR7eH2AgZiljH98fnuRhZaLhoGDgY6Rvd3Z2NjY2NjZ2dnZ2dnZ2dnZ2dnY2dnZ2dna2tra2trb29va2tva2tra2trb29ra2tra2tnZ2dnZ2dnZ2dnZ2dna2trZ2dnZ2dra2tra2tnZ2dnZ2dna2tra2tra2tra2tra2tra2trb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t3d3d6NWFdobllQUUtISlNJTUhNSUtBQz9DRkJBRDo6PDg2NDg4NzY2Nj8+Pjo8OTw7Oj09PDw4Ozw7RERERT4/PkI+Qj84PT8/Q0NCQEE+O0xUY9Xh3+Dg4OHh4eHh4eLi4uLi4uLi4uLi4uPj4+PW1tbW1teslLZ6eHJvd5V7dHuLgHh1bn6Fg3t/hYhyfH2bnI6JioJ+g32Hk5rH1NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2trb29vb29vb29vb2tra2tra2tra2tra2tnZ2dnZ2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2trb2tra2tra2tra2trb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d7Zf1lgaGxcUUtHR09LTk5PTURGQkg/Q0hEREA6Ozs4NzU3Nzc4NThAPkA7PDk8Ozw+Ojk7OTk7OUZERUI8QD4/PEBDOz5AP0A/Qj8+OjtKVWPV4eDg4eHh4eHi4uLi4uLi4uLi4uPj4+Pj4+Pj1tbX19vKhYR3cXJubniVhHt4hH95dnB4c3eLkY6CdnN9ioaId3d1d4ODfIiIk8Pb2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2trb2tvb29vb29vb29vb29rb2tra2tra2tra2tra2tnZ2dnZ2dna2tra2tra2tra2trb2tra2tra2tra2tra2trb29vb29ra2trb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f0nVZaGlqVk5KSE1OR01EUElGSD9FPUZMREM+Ozs8OTc3OTY2OTU4Pj4/PTs8QDs9PDo3Ozc5OThHREVCPUE9Qj8+QDw/QUE/QEJAPjs8S1Ri1OLg4eHh4eLi4uLi4uLi4+Pj4+Pj4+Pj4+Pj49fX19fEknuJf29sbnV2foSBg4qGfnVybWVtiIaKjoR7c4OHint4e4OPj4GEioqxztrZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29zc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tvb2tvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3dzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f3t7e4clsW2pqalNOR0dOT0VIRk1JSUA7RD5ISUA9PDo6Ojg2ODo3Nzk0OD08PT07ODw8PDw4Njc4OTo6RUJFQT9APEI/Q0M+PkNEQUBAP0A8PUtRYdPj4OHh4uLi4uLi4uPj4+Pj4+Pj4+Pj4+Pj5OTX19fZqXaFfnx3bHB3eXh8jH2KhYB3anN0d3p9bot7fnl6foR/gIGDfnh8foeGlrbT2tnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra29ra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/e3uO9amFpa2lRTkZNTEtKWE1OR0FAQE9BQz9AOzw4OTk5Njg2NjY4NDs+PD07OTY6Ojk6OTU4OTg5OkJERj8+Pj5AQEBCPzxBQD88Pj9BOT5KT17S4+Hh4eLi4uLi4+Pj4+Pj4+Pj4+Pj4+Tk5OTk19fX2sqKhIB5c29tcXN1d4CUeHaAfHWHhXd1cnWgmXp7d3Z5doR0bWxue3iAmouTu9za2tra2tra2trb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc29vb29vb2tra2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f397js2lpbmloUFBPTExPUk9LU0Y/RURERD48PDg7ODc5OTU2ODY2NzM6Pjs+PTc6Pjk5OTk2Ojo4NzxDRUc/Pzs/PkA9PkE9Oz0+OUFAQDhBTlFc0OTh4eLi4uLj4+Pj4+Pj4+Pj4+Pk5OTk5OTk5NjY2NjauY6AenZ1bmpveHCBfWt0cnZ3hIV5h4d5lY55eXp1d3pza298gHx2fYh8gLLe2tra2tvb29vb29vb29vc3Nzc3Nzc3Nzc3dzc3Nzc3Nzc3Nzb29vb29rb29vb29ra2tra2tra2tra29va29vb29vb29vb29zc3Nzb29vb29vb29vb29vc3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3t7e3t7e3d7e3t3d3t7e3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/f39/f4qpqa2hrZFNQT0ZQVFJOSFJLPkREQ0I7Ozk6Ojg2Nzg1NjY4ODg0Oz88Pzw5PDw3Ozo6Nzo6Nzo9Q0JDPUE+Pzw5PT5BQDs8PDtFQD47Q05TXNDk4eLi4uLj4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTY2NjZ1p5vdntveHh2cG50d3BwdHBzb36Jc3qGhY2EenNtcoB6hn1vg5OBdnx9g4a13drb29vc29vc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29ra2tra2tvb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4N/f3+KgbWhma2ZVVlJHUFFOS0xMRUJIRUc9OD08Ojo3Nzg2Nzc2NTY3NDg+PD09Ojg6OD46Ozc4Nzc6Oj5DRDtDQj49OD1AQUM/Pjw+RTw+PUJNUF/S4+Hi4uLj4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk2NjY3MB2doCCfnp4eHBsdXlya399bHNvdGdoaYB/aWl4c2d+iYl4cIKGe3d9foWKvd3b3Nzc3Nzc3Nzc3Nzc3Nzc3d3c3Nzc3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODflGttZm5mU1NJUFlUTEhGTkZGRUJGPTs+PDs5Nzc4NTc5NjQ1NzU4PDs9Pjo6OztAOTs7ODc6OTlAQkE8QUE/Pzk/QEJFQ0FAQEM7Oz1ES01g1uTi4uLi4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk5NnZ2tmYc3uqhJaCcnR1dn14aGx8d2h4d25rcHR5gIJ3dHyBhIJ9c3CAin94gn95g8je3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f4N/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh24tubWdzY1lRTVVbV0hDSUZOS0dCRD8/Qjo7OjY2NzU2NzY0ODc2Ozw7Pj86PDk8Qjg3OTo6Ojk6QUFCQUJDQEE+PT9CQ0NEQUJGOTg9REpOYtjk4uLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXZ2drcqHGCtXiRfnNsem6EgXaCfWtoan+DeHZ8dX2FhXRmcHl9d316gIqFe318foC03tzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3dzc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3Nzd3d3d3d3d3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e397e3t7e39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4ODg4ODg4tiFb3FrdWFWT1VVXE9ETUY+SkdKRUQ8P0I6PDk4Njg0NTY3NDc2NDk7Ozw7OD47PEE4ODo9OD04Oj09QEBAP0FCP0A+QENCQ0FBRTc2O0RMTmPa5OLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXl29ra3Z5sbnNxhY1ybXBuf391hH5rcnZ2enN4gXhzb3VwbWt2fHmFiIB/f392coODsd/c3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eDg4eHh4eHh4eHh4OLXhW1xb3ZeUldTWlpRSkhDQFFAQkQ8OT9BOjw5NzU3NDU2NjQ3NTY9PDo9PTk+OjxAODo6PDY7OTs+PUJCQjtBQkBDQEBEREM8PUA3OjxFS01l3OPi4uPj4+Pj5OTk5OTk5OTk5OTk5OXl5eXl5dPOxsB+cWxveHt2b3VuanNzbZKGeG50dG5vdIZ/b2twboJ0bXZyfY2DdnF/d3mKgabf3Nzc3d3d3d3d3d3e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3dzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t/f3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi1oZucG1xYFJZUFdfWUpMTElSP0Q9OTtCRjs6OTc0NTY1NzU0NjY2Pj07Pz45PTk7Pjg9Ozo0ODtAQENCQ0FCRkE/Q0BBQkREOz0+OTs8QkxNZODl4+Pk5OTj4+Tk5OTk5OTk5OTk5eXl5eXl5eW5t7Woc3JscHd6dHd4bXFydXd/hHRyc2xsa3F8bnBudGuBf3GAd32Eg355gHNygYqg2d3c3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh49WHcWxqbF5YWlVXYFZWUE9QTD1BOjs8RkE4Ojg3MzY1Njk2NTg1Nz89Oz8+OT04Ozw5PTs7NTo9Q0JCPENDREREQUE/PkJDQzw9Pjg5PENLS2PN0dnh1sjY4+Tk5OTk5OTk5OTk5eXl5eXl5eXltbW2q3J5cm59f3Z1d2hqaGlwb3Zta2tnZWZxdG15gG5teXd2iHhxa2podXV5dHV/wd/c3d3d3d3d3d3e3t7e3d3d3d7d3d3d3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHi4uHh4ePVhnFwY2lhV1NZV19MUk9STUtAPjg5O0E+ODc5NjQ3Njc6NjY2NDk+Pzo8Pzo/OTo6Nzo9PDk5PEFBPTtBQ0VDRkA+Pj5BRUQ+QEE3OD5GSEpesrW4wbm1u8jg5eXl5OTl5OXl5+fn5+fm5ebm5ra2tbWOfX5weoR1cnZnYmNlbGtyb2ZpbHZtd4Z9hXlsbHd4a3ZwfH14c3V5fHd2h7ng3d3d3d3d3d7e3t7e3t7d3t7e3t7d3d3d3d3d3t7e3t7d3t7e3t7e3t3d3d3d3d3d3d7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4eHj1Yd1bl5uY1pUU1hXS1NLSk1SR0E4Ozs+PDk4NzU2NTY2OTY4NjY5Pzw6PT07Pzo7Ozk8PDs5Oj4+Pjs8PUFEQkNBQEBBP0JDPDw9Nzs+REVKXrG1tLW2t7e2y9rJ3uXl3eDi3tXU1tPU4OPg39+2treuh3t/bnmNenJ1bWNobGxtaXR4enF5enqIh4N6aWh9cWRvcXyGgX55e318e4an2t7d3d3d3d7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4uHh49aGdmxhb19dV1lcWlJQSEpXTEVHPUA9Ozs9OTY0NjU1NTg2NzY3OD87OT09PDw5OTw6Pjw6OTg+Qjs7Pj5AREBDRUFAQD0/QDw9PTU5PEJHRl2xtbW2uLm5ubq9uMPT0r3BwcC6u7y6u8TMxb/Dt7e3hGl1gX1ndYd5Z3Vxa2t5eHB3fH15bWl3e3h3bml1j4FwbHl4d3d9gXuGgnmAoNze3d3d3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODh4OHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4ePXhXJrZ3RhW1hYX15TVVVRVUpMRj9JRDs5PTY2NDc3NTc4Nzc3ODk8PDo+PDg8Oj0+OTs8OTs5P0E8PT9DP0FARUJCQTw9Q0A6Pjw1NDlER0dasbW1tre5ubm5ubm3ubm4uLm5urq6urm5urm6u7e3uX9ucHN6b3B/eXNuc3Vsc3Z4cXFwb2tvcX6Bc2mHhIF9dHOHdW11hYmBgHJ2hafd3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uHj14lxa2xyW1dXXWBUUVVUUFJPSkNATUE9Ozk2NTM0NjQ2ODc3Nzk6Pjs8Pjs5PDo8PDk8PTw7PT0+PUNEREBDQkE/QD48PkE8OD06NjY6QkpIWLG1tLa2uLm5uLi5uLe3uLi5urq5ubi4uLi6uru3uKx7cnhxf3ZzfnBsbXpyZ29sbW50cHt3d3Jyd3pvhpJ2f3x8enZ5fH9zfYdyda3T393d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4eHh4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi49eHb2pxalVWV2FbT1FSUE5XSURESUo/Ojk6NzUzNDk1NzY2Nzg4Ojw7PD46PDo6PTw5PDw9Oz09PDs9REdEQ0E8PDw8Pj5AOzg8ODE1OkFGRVautbW1tre4uLm4uLi4uLe4ubq5uLi3t7i4ubq7t7mqcnB4d3x7e4J3aG5xam9qY2lyf21zcn54dHFsanaAeX2AgH91doB1a4qLgHaR1d/d3d7e39/f3t/f3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f4N/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLi4uPYhm1sdGVWUFxnWE1YU1JRWUVDS1BOOzk4ODc1NTM5NTY2NzY4Nzk+OT0+OTw5OTw7Njg5OTo8QEA9PkBGQEJCQDo+PEE9Pzs7OzYxNjxCR0RQqLa1tba2tre4t7i4uLi4uLm6ubi4t7e3t7e5ure2tIlyd3h9iXxwem99c2hqbGdnbHRscXd0cWx2c3Fxd3FyfHl4g3Z7d2mLkYp9kM7f3d7e3tvY2drZ297f39/e3+De39/f3Nvc3N3e3uDg3+Dg4ODf3t7e39jS397f397e3t/f3t7f3t/f3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLi4eLi4uLi4uLi4uLi4uLj4+Lj4+Li4uPj4+Pi4uLi4+Lk14NoZ3VkVlVkZVdKWllXW1Q9RU1LSD04NzU3NjQzOTQ0Nzc1Njc5PTo9Pjw9PDk7PDk5Oj45PD4/PkFBQ0FFRUQ+OzxBPjw5PDs3Mzc+REhFSqG2tbW1tbW2tre4uLi4t7e4uLi3tra2tra3uLm2traLfXpsbHp/cGx5dm5qaGdlcXp4b2lvb3B1c21zd4Fnb32CgYNyf3lqcHJ6f6ng393Zy8a/vL2/vsLN0tDW3tnc4NfQzcPCw8PH1dfT2dzX1NjX0MfExce9vM/Kz87Y3djO3N3c2t3T0dze39/e397e3t7e4N/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eLi4uLi4uLf4uPi4eLg4d7W29/Sw8rJx9Hb3OLk4eHg2dre1sbExcTN2trf5OHi4trX3st9aWZxYVleZWFNTFRLUlpMO0hNSEZBPTc2NjUzNDY2NDg3NjU2OTw7Pj46Pjk5PDk3OTs7Oj49PEBAQ0RCR0ZCQT08Q0A9OTw7Nzc3P0RGRkaZtrS1tbW2tra4uLi4uLi3uLi3s7W2t7a3t7i5tba3opdxb29waW50dnFmZWNrbmdvcm1mZ2tygWVvdnyAeGRzj39zaHFyaWVlbm+w39HFv7u5ubm5ubq6uru6vc3Gw8e/urq6uru7u8HCvcHFvby/vry7urq5ubq6ubm6w8XDucDDwby/ube/z8/U3tjc3t/g3tLa4N/f4ODg39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eDg4ODg4ODg4ODh4eHh4uLi4eDh4uLi4uHa2t3RwsPCu8XT1uDdydPDrrnAsaqrq6uwtLbJ0sXRxLG4v7Srq6usr7S0vMzE1c60tLureGxtbWBdYl9ZS1NVVFFQREBRTUhEPzo3ODU3MzE1NjQ5ODQ2Njo8Oz08ODw5Njo6ODg5NzU8PDw/QEFAQkRDQkE8PkI/Pz09PTc1OD5DRUNAj7a0tLW1t7i4uLi4uLm5uLe1sautr7Oxs7OztLS0tqaei2tue3ZxeXhnY2hfcXdha25vaG99b25ja2lseHdsa4Z+bHB6dm1scG95sca8uru7urm5ubq6urq6urq6urq6urq6urq7u7q7u7y7urq6ubq7u7q6urq6urq6ubi3t7i4t7e2tbW1tbi3u8e+w8XHzcS4wMnH0tzZ2d/e3uDf39/f4ODh4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh3Nji4uLi4eHh4OHg3tfGxtHQztTe3tPO0t/SuLi8sq2trKysrrG+ua63rKipqamqq6urqqqqq6ysuKyqqqqrq6urra6urq6urryzrayrpHlub21fXl1dVE1SU1xUSkE/UElIPjg5NjgzNzMwNTczNzg1NzY2Ojw/PDg5Ozo6Ojg5OjY1OTs8Pj9EP0NFQkNCP0BAQT9APjw3ODc6QUVEP4W4tLS1tbe4uLm5uLi3t7SurKuqqq2urq6vsLGzs7WjcG5ucm1wg311aWFlaGZkY2Rxc21td25naW1tZXBzb29zcXN8h4F6dX11n7u6uru7urm5ubm6urq6urq6ubq6urq5uLm5ubm6urq6u7q5ubm5ubq6ubm6ubm4uLi3t7e4uLe3t7a2tbW2tra1tbW1tba1t7e3t7rBvrzGycrb3+Dg3tvd3d7h4tDW4uHg4ODg4ODg4ODg4ODg4OHg4OHi0768zNjd3OLg0dnbxL23sLCxsa+zu7uzsLS9s66urq2tra2sq6qqqqmpqKmpqampqqurqqqqqamoqampqampqaqqqqytrq6urq6urq6sraR4aWJxZmFZWlZRUk5cU0Y9QlJEQTc8OzY5NTY1NDU2NTg3NTY1Nzg7Pjw7OTk5Ojg3Nzk3Njg8Oz47RD8/Q0BBREE+P0M9Pjw+Ojo3Nz9DRj54srCztLW2t7i3trKurq2sq6uqqaqtraysrq+xs7S1t4xucnRqaIB5ZmpmZWxdaG5waGxxYmNmcoJ+dmhobGpueoaBhXx4cXF5gK+6ubq6urm5uLm5ubm5ubm5ubm5ubm4uLe3t7e3uLm5ubm5uLe3t7i5ubi4uLi3t7a2tre3t7e3tra2trW0tLW1tbW2trW1tre3t7e3t7e3tre4v8bP0MS+v8DE19e8ydra4OHg4ODh4eDg4ODh4eDb3t7Uzby3tre6wMDJxLfIvrKwsLCwr7Cvrq6ur7Cwr66urq6uraytrKurq6qpqampqampqampqKmpqKmpqampqKmpqKmpqqqrraytra2ur66trK2heWpkbWdiXFhRUFFLVEpCOklRP0E3PDk0OjU2NTQ1NTY4ODY4Njs6OTw9PTs6ODY2ODg6ODY3Pj09PT5BQUVCQkNBQUBBOj09Pz05Ojc9QUc8bKqmqKutsLGwrqupqKqrq6mpqamrrKytra2usLO0tbilgIdvaWdzdGZrcG1qZGxvcm5rbWNrcHyJhG5qbHx4Y3uKfnNqc25rcY+7ubm5ubm5ubi4ubm5ubm5ubq5uLi3t7e3t7e3t7i5ubi4uLe2tra3t7e3t7a2t7a2tra3tra2tbW1tba1tLS0tbW1tra2tra3t7e3t7i4uLe2t7a2uLm4uLe3uL6+uLq9vcfb4OHg2Nnd4eHg3dfKwcPCurm5uLe4uLi3tbS0tLKysbGxsLCvr6+vr6+vr6+vr66ura2srKyrq6yqqqmoqKmppqepqaehpaipqamoop+hoZyip6inqausrK2ur7Cwrq2unXdwbGphY2BZUU1RTFJGQzlNUEU+ODs3Mjc5Njc0NDM1ODg3OTc7OTo9PTw6Ojk3NDo5ODY1OD8/QEI9RENDQ0FDQEJBQDtAP0A/PDw6O0NIPWOopaWlpqioqKenp6ipqqmoqKipqqqsra6wsLCztLW1taWYdn5xZmt4cW9tZmVsaGNsZ2ZpaX11bWlvfXZ5hWZod294b3Fvcninu7m5ubm5ubm4uLm6ubm5ubm5ubi3t7W1tba2tre3t7e3t7a2tbW2tre2tbW1tra3t7e2tbS0tLS0tLS1tLS0tLW1tba2tra2t7e3t7e3t7a2tre2tre3uLe2t7i4t7i4uLi4wMXTyry8w83PyMC9urm5ubq6ubi4uLi4t7W0tLSzs7KysrGwr6+vr66urq+vr6+uraysrKurrKysq6ehoJ6gn5udoaGdlpmkpKaon5mZmZmanZ+gn56fpKqtrq+ura2srJl1cGlrY2FeXVVOU0tSREQ4TktHQTo4NTI2OTY1NDczNzc3ODk3OTo7PT0+ODg4NzU6OTk1OD9AQEFEPkZBQkNAQkNCQT88QEJCQD0+OjpERj5cpqWmpqampqanqKenqKioqKenqaurrKytra2ttLS0tbekc311bnONf3JmanFjaW1jaGZobG51aV9jZ3VzdnpuZ3Bwcn56cYihu7m5ubm6urq6urm2s7a1uLm2trW1tra1tbW1tbW3tra3tra2tbW2tbW1tbS0tLa2t7e3tbS0s7O0tLW1tLS0tbW1tra2tra2t7e3uLe3tra2trW2tbW2tra2tra2tra3tra3uLi3uri4uLi3uLi5ubm5urq6urm4t7e3t7W1tLS0s7OysrKxsbCwr66urq6urq+vra2srKuppaSmpqScmZubmpmampmXl5eXl5aZm5iZmJmZm52en5+dnJ6gpKWko6OioqKQdG5jcGFeXltUU1RIVEo/PFFCRkM7ODYzNzo1NTQ4Mzg5OTc4OTc7OTs9Ozc6NzU2OTk4NTg+Pz9ART5CPz9DPzxBQUI/PT9EQT8+PTk9Q0Y/VaSlpqanqKeoqamop6ioqKioqKiqrKuqqaipq7W1tba5o3eKcXKHhnd0cGh5a2JjYWVsaW5zal9jZWNjZWprYmRqbHaXjX6ovbm3tre5u7u6uLWxrKurqq6wrKyrq62tq6uvsLGvr7CytbW2t7W1trW1tbW1tbW2trSvr7O0tLSvra6vsrW0tbW1tbW2t7e3t7e3t7e3t7e3t7Owsra1tLa2tre3tra2tbW1tra3t7e5uLi4t7e3uLi4ubq6urq5uLi3t7e1tbS0tLS0tLS0s7OysbCvr6+vr66vr62oo6KgnJqampqZmZqbm5qampqbmpmZmZiXl5aYmZmZmpycnZ+foJ+goKChoaCgoJ+fi3RuaXRdYGZeUlRLRFRJPUVTSEVCOzo0NDY5NDQ1NzM4ODg3ODk5Ojs7Pz04OjkzNTg5NjM5PT5AP0A6QEJCQkA/QEJCPz0+QUFCPz06PkVDQFGjpqWlp6inqauqqKaoqKipp6ioqKinp6ioqaq1tbe3t7KZtH99kIx1Z2lqbGZjYGNoZW94cGlicXx5cGpmZmRma3NqhYystrKwra2ttLeysLCtrKuqqaiop6ipqampqKinqKipqaeoqqurra2sqqytraysrq6traunpaSnqqyopKOkpamwsbGztbW2t7i3t7W1tre4t7e3t7Kppaasq6ivtLa1s7W3t7a1tbW2tra3t7e3t7a2t7e3t7m6urq5uLi3t7Wxs7S0tLKxsK6sq6yurrCxsK2rqqmqqKijnJqZmJmYmJiYmZmZmZmZmpqZm5ubnJybmZeYmpqcnJydnJ2foKGhoqKioKGgoKCfnop1amtuWVxhVktPREdVRz5PV0hEPTw4MzQ0ODQ1NDgyODk4ODk6Ojw5OUA8Njk6MzY3OTE0PD8/QEBBOkNGRUJBREJDQTo7P0FCQz9APUBEQ0BPo6empaemqKqqqqakpqenqKioqKimpqaoq6uttba3t7e4rbJ1cHuDdmBiaWtiZWZhZGdmfYh5bHKAfXFvcXhjbW5xZo+srKurq6ysra6urK2trKyqp6WmpaWlpqioqKiopaeoqKioqKeoqampp6Wko6KioqOioKKioaKhoKChoaKjpKOjpaWlqLC0s7OzsKuqqaqztLa3trGopaOioaGipKiqqairs7Sxrq6xs7W2tra3uLi3t7e3t7e3t7a2uLe0sa6ppqerrKmnpqWkpKSkpKWnqaajoJ+enZycm5uampmZmJeXmZmZmJiZmpqampqampqbm5mYmpydnZ2dnZucoKGgoaOjoqCgoKCfnp2FdGtsaFdYU0pHTUVITUdAU1dGRz09OTM2Mzc0NTU3Mzg6Ojo6OTw9OjpBPDY9ODM3ODgzNztAPz9AQDpCRUNAQkRDQT87PEBDQkNBQDxBQ0A9TqKnpqanp6mqq6mkpaWlpaaoqKippqanqKmpqrW2tre3t7izc2h7c2JnamtpaWJhZGloXV1tfHJma3J/fHR8bm1zc36gqamrq6uqq62trKusq6mpqKWjpKampqWmp6eqqaamp6enqKinp6iop6WjpKKhoaGhn56en5+fn56foKGho6Wko6OkpKSmp6enpqWkpaampqeqraumpKKhoaChpKWlpaenpaeoqKalpaivtLa3trW1tra1tbOwrKupqa6rqKWlpqampaSkpaWlpqWkpKSkpaKhoaGgnp2bm5ucm5qamZiXmJiYmJiZmpmZmZmYmZmZmZqZmZydnJycnJybnJ+fn6ChoaKgoKCfnZ2cgHNrbmReU0pITUZETEtFRFFTQ0c9PDgzNjI4NDY0NjQ4OTg6Ozk7Pjw5PTs5PTczNTk2NTY8QD0/QD88P0JDPkJCQj89Pj5CQ0FFQD86PkVAO0+jpqWkpqeoqaelpKWlpKWnp6eoqKanp6alpqa1tba2trW2uYptcW1vfHxxZ2pmYGFsYFROW2hqbm9tgYJ9cWdxdn6aqKeoqqmpqqurrKqqqqimpaWkoqOlpqalpaWmqaqppqWjpKWmpqSjo6KioqKgoJ+fnp6cnJycnJ2dnJ2en6CioaKjo6KhoqKkpaSioqOjpKSjpKSko6Ggn6GipKanp6ipqaelpaSipKSlqK2wsKyrqqusqqmnpaWmpaWlpaalpqioqailpaWkpKSlpKOjpKOioaGhoqKgnp2cnJubm5qZmJiYmJmam5mXl5eWlpeXmJiZmpqcm5qampubm5ucnJ6goKGgnp6enpycm356bnJiXlNNSlBFRk5NQkBPRT5JOz01MzYzODM2Njc1Ojs4OTs5Oj49Ozo5OT03NjY5NjU2PkI+PkE/PT5DQT5DQ0BAO0BAQkJCRUA+Oz5FPzxQoKSjpKOjo6SkoqSlpaSlpqamp6empqalpqaltLW1tbS0tbiBaHx9ZXOCemxwdWFfY1ROT1FbaGxpbGxxbW5xbnScoqSnqKioqauqqqqqqaempaSjo6OjpKSlpqalp6ytqaShnp2eo6Shnp6foKCenJ2dnJycmpqam5ucnJubm5ydnp6foKChoJ+goaOioKGjpKSjoqSlpaWkop+go6SkpKapqainpaGdnJ+jpaipqainqKioqaempaWkpKSlpqampqampqenpaWko6Ojo6KioqGhoqKhoqOkop+enZ2cmpubmpqZmJeXmJaWlZSUlJWVl5iYmpubnJuampqam5ucm5ucnp+fnpucnJyam5p/fnF0YFtUTUdNSEZMSj8/TkM8QDs8NDM4Mzc0NzY3ODs9ODo6OTk7PTs7ODk9Nzc4OTU4OD9APT9BPjs9RD89REA/PzpAQUE/QUVAPjw8Qz88Tp2ioaKioKCipaSkpKWlpqenp6empqampaampbW1tbS0tLS3jHalsXdmc3Jvc2xjZGlYT1JRT09dgG1kYFptkZGSoqKjpaampqenqKiop6alpaSjoqGhoaKjpaempqesrKemoJ2cm6Ghnpuamp2cmZiam5qampmZmZubm5uampqampucnZ6goaCfnp+hoJ6foqOko6Omp6inqKWioKGhoaGkpaWlpKCcmZmbnqOmpqampqanpqempaOlpKWlpqiop6enpaWlpaWkpKOjo6KhoqKioqKhoaKjo6Kgn56enZybnJubmZaUlJSTk5OTk5SUlJWWl5qam5ubm5qZmZqanJ2dnZ2dnZuampqamZqXf3dvc11aTkhKTkdFRklERU5APD09PDQ1OzQ2NDY1Njc5Ozg5OTg5OTw7PDc6Ozc4ODg1ODg/Qj9BQTw+P0A8PEJAQT49QT4/Pz1CQUA6OkA8PE+doqGfoJ+dn6OkpKSlpqeoqKenp6ampqampqW1tLS0tLS0tbSXtqd1Znh2Y2xjY2VjW1JTU1JNXqCMeFhodpajnp6hoaOjo6OjpKSlpqalpKSioaGko6OjoqOlpqWmpqenpp+bmpuioJmWlpWam5mXl5iYmpqYmJqampqbm5qZmZmenZ2goqOjo6KkpKWinqGhoaKjpaampaSjoaCgn5+hoZ+goJ2amJeZmpygpKOjpKWmp6alpaOjpKSkpKWnp6ampqampaWmpKOjo6SjoqKjpKGfoKGhoKGgoaCfn56dnZyamJeVk5KSkpKSkpOTkpOUlZaZmpqbm5qampqbnZ6enp2cnJybm5qamZmZlH10bHReWk9IRUdGQkVORT9GOzo+Pzs0Njo2OTM2NDY4ODo4OTc4ODo8Ozw5Ozs6OjY3ODk5Pj9APjw9QD5AOjlAQT89QT8/QUE+QUE/Ojk9PjpQnaCfnZucnJufoqOlpaWlp6iop6ampqanpqantLS0tLOysrGwsK2rkHiGj36bmn93Yl1TUlFRTGKgootaiKCgn52YmZycnZ2eoaGgpKenpqWkoqGjp6alpaKipaampaanpqagm5mboaCXk5OSl5qcmpeXl5iampmampqam5qYmJmaoKCgoKGfoaKipKamop6gn5+goaOko6Khn56enpyanZuZmpqZmJeZnqChoaKioqKkpaWmpKSkpKKioqKkpaWlpaWlpaalpaOko6KioqGgoKGgnp+fn5+fnp+foJ+cm5qZl5WUlJSTkZCRkpKSkpKSk5SVl5iZmpmZmpqam5+fnp2cnJycmpmZmpiXl5F8cmdxXl1QRj9BRD9KT0JCRjhDRT4+OTg7Nzc0ODQ1OTo6Ozk3OTo8Ozo8PT48PDo2NzY5OD4/QT47Pz49PDg6PkFAQUE/P0FCQERBPjo4PkE8U5ycm5uampycnaGio6KjoqSmp6alpaampqSjo7KysK2rp6amp6alpqiln6iop6qnoXmEXFFST0xcnKCAYpmgnp2clZOVlpeZmp2dnqGmpqampKOioqanp6ajpaampaWmp6amop2cnqGfl5GRkJSXm52YlpaWmJuZmpqampqZl5iam6Ghn56fnpybnJ6goJ6dn56fn6Cio6SjoqCfnp2ZlpeXl5iYmZubnqKioqKioqGio6WlpKOio6SioaGhoqOkpKSko6SkpKSioqKhoqGgn5+gnp2enp2dnZ2dnp6em5mYl5WTk5SUk5KQj5GSkZKSkZKTlJaXl5iYmZqampyenZ2dnJubmpiYmpmXlZaNempmamBiTkY+P0A9SkVAQ0A7QEE8Ozs5Ojc2NTg0Njc4OT04ODs6Oz87Ojs8Ojk6Nzc2ODs7Oz08Ojo8PTw3Oz5DQkRDPz1BQ0FEQT88OkBCO1eZmJqamZmam5ucnp2foqKhoqSlpKSlpqSioJ6op6alpqWlpaemp6ampqakpaanqKehqXJOUU1KVJahenKanJyenJeVlJWWmJiXl5qeoqKhoqOkpKOjpaalpaanpqSlpqalpaOgoKGhn5mSkI+WmpmenJaXl5eZm5ycnJqamZeZm5uen52cnZyZmZqcnZydnp6fn5+hoaCgoaKgn56bl5WVlZeanZ6fn6GhoqKio6OhoaCgoJ2cnaGioqOkpKOioaSlpKOko6SjoqKioqKhoKGfn52cnZ2cnJ2dnJ2enpqXlpaVlJOTkpKSkpCRkpKSkpGSlJWWl5iYmJiam5ycnJycnJ2cm5mYmZiWlJWXi3hsY2RiZFFHQT1DO0tIRDo7Ozw+OTo6OTo3Mzc5NTo4ODg8OTg7OT09Ozo7Ojk8PDc2NDc/PDo9Ozw/Pjw7ODxBQ0FDQkI+P0NAQkFAOj9APztZmZiampqam5ubm5ydoKGhoaGhoqKioqKhn5+dpKWmpqenpaWmp6ampqWkpKalpKSkpaaGUFJQT0+PmHB6mpubnJ6cnJycm5ubmZiYm56dnp6foKOkoqGhoqKio6SkpaalpKOjoaGhnpyalZOUmJuam56amJiYmJqcnpyam5iWmZybnJycnJydmpqbnJ2dnp6dnp6fn52cnJyhoaCblpWVlZacoKGgn5+hoKKjoqOhnZuZlpaWlpicnqCip6ikoaCgoqOjoqKioKCgoJ+fn5+gnp2cm5ucnZydnJmanJuWk5KSkpKUk5KSkpKSkpOSkpKRkpSVlpeYmJiYmZqcm5qbm5ucnJqZmJiXlZWWl4d3ZGdoZGJNQ0U8RDlJSkU5Ojs9PTo6ODg6NjQ3OTU8OTY4OTc5PDs7PDo6PDs6PDw4Nzg3Pj07Pj46Qj86Ojo/QURCQ0FBQD9EQUFAPjpAPj06W5qYmZqbmpubm5uen6CgoaKioKCgn5+enp2dnKWkpaanpqWlpqakoqKio6Oko6Kjo6KnllRYVVJOZ21rgZ6am5udn6Cgn56enp6dnJ2dnJ6enp+goaCfn6CgoKGio6Ojo6OjoqGgnpuZmZiZmZmamZienpiYmZmam5qWlZeWlZicnJ2cm52dnpybnJ2cnZ6bmJqeoaGdm5udoKKhmpWVlpaZoKKgnZueoKGjop+em5eXlJKSlJeYmZ2goqenpaGgn56goaGioaCfnp2cnJubnJubmpqZmpydnJmXmZaVk5GQkJCPkZKSkpKSkZKTk5OTk5OTlJWWlpeXl5manJubnJucnJqamZeXlpaVlZSEcmZsYmRbREJMPT84RktCPEA+Pj05Ozk6PTg1ODg2Ozg1Njo4PDw7Ozw8Ozk8Oj09OTU4Nzw5PD88OkE/Ojo6QEBDQkRBQ0A/Q0FAPj08QD09Ol+al5mamJeYmpycn5+foaGhoJ+fn56foKCenZ2lpKSko6OioqOjoZ+foaGipKOio6SiradXXl1UV19ua42dmpqbnJ6dm5ucnZ+enZycnJydnZ+goKChoaGgoKGgoKGioaGioZ+enJqampqbnJqZmpuZnJ6ZlpaWl5eTjo6QlJabnJuam5udn52cnJycnJ6dlpSZnJ+in5ycnZ+hoJuXl5mZmpycnJubnZ6fnZqXlpaWlJOTlJiampqfoKGmpqWgn56fnqChoaCenJubnJybm5ybm5qZmJmZmZmXl5iVlJKQkJCQj5CSkpKSkZGTk5aYl5STkpSVlJWWlZaZmZmam52cnJyampmXlpaWlpaQgG9vZV5gV0BKSDg/N0lFP0VBPD07Ojo8Ozs3NTs4Njs3NDY6Oj47Oj0+Pj07Ozs+Ozo4Ojk5NkBBPTo8PTo6OT9BQ0JERUM+P0FBPz8+Pj89PDtgl5WXl5aVl5mbnqGhoKGioqCenp6enqCgn52bpaWjpKSioKCfoJ+dnZ+hoqOjo6OkobCjXWVkYGFua4GenJubm5ubmZianJ2enJubm5ycnJ6ipKGeoKGhoqKhoKCgoaGgn5+enJqZmpubm5ybmp2dm5manJiXlZWWkY6Nj5KYnZycm5ycnqCdnJucnJyempWVm56foZ+dnJyenp2cmpqampqampqbm5qXl5aTkpWVlpWTlZaam5qanZ6foqWjnp6fn5+en5+enZ6fnZycm5qcmpqbmpiZmJiYmJiYlZSTkZCRkJCQkZKTk5CRk5SYmZiVk5SVlZWWlZaXmZmXmZqenpyamJiXl5aWl5eYjX1ubV9lVlRFSzw3PjdSRUM+QkE4Ozw7OTg6ODY7Nzc6Njc5Oj0+Ojw8PT49PD06Pz06ODw9OTtAPj4/PT45ODs/QkNAQ0VDPT9DQj5AQD5APTw8YZWSlJWWlpeanJ6goKCgoaCgnp6enp6gn56em6WlpKOioJ+fnp2dm5mbnJydnp+gn56rmGNpbW5pZm2enZybm5ybmpmZmZqam5ucm5uam5ygo6SgnZ6en6CgoKCgn6ChoKCfnpuamZqam5ubm5ufnpyZmJqamJiYmJKOj5OXnJ2bnJ2cnJycnZycnp6dnpqVl5ygoaGfnp2eoJ+cnJuampqbmpqYmpmVk5OTkpOWl5eVlJiYmZucnJydoJ+gnp6enp+fn56en6KjpKKgnp6cm5qampuZmJmZmJeXlpWUlJORkZCQkZKTk5OSkpOUmJmYlpWUlZaWlpaWl5iYmJiXmZqamZeXl5aXlpeWl4l4dmddX1dURUU5OTs8WT5AOEI/OTs7Pjk4Ozg6Ozc5OjU4OTs9PDk9Oz0+PD0+Oz8/Ozk+PDw+Pz5AQUE9ODc7QkNFP0FFQz1AREJBQEQ7Oz47PGKWk5SUlpWUlpiYmZubnJycnZ2cnJ2en56dnJqkpKSkoJ+enpybm5qZmJiYmZucnZ6cpolla3R4bVuFop2dnJydnJqbmpqampydnZ2bmpuboKKinpucnZybnJ2enp2dnZ2fnpyampucnZycm5ycnp6cm5qanZqam5yVkZOXm52dnJ2fnZycnJycnZ6fnp+cl5idn6GhoJ6cn6CfnJubm5qbmpmZmZmZl5WWlZaYl5eXlpaYmZuenp2dn6GhoJ+fnp6fn5+dn5+hoqKhoZ+fn5yZm5qcnZuampmXlpaYl5eXlpWTkpGTlJSTlJSUlJaZmJaVlZeZmJeYl5eXl5eYl5iXl5eXlpaYl5eVl5eDeHZfW11eUT1GOjk4P1VDQTtDQzo8Pz86Ojk3Ozg4ODc0ODk8Ozw4Ozs8PTo9Pjo/QT06PTw+PkA/PUBBPjk2PERDRUBBRUU9PkVERD9COzo8OTpkl5SVlZaUlJSUlJWXmJiamZqcnJydnp6dnZybo6Oko6CenJuamZqZmJiYmZiam5ubm6WJa3F2em9lmp+enp2dnJybnZ6dnJ2enp2dnJydm5ygoJuampubmpudnJqampucnJuZmZycnJ2dnZ2dnZ2dnpybmp+fm5ydm5mZmZudnZ2dn52dn5+dnJydn5+fn5uanZ+goJ+dnJ6gnpubm5ubm5yampuamZudnJqZmJeYmJiYmp2foKCgoJ+hoaGgoJ+en5+fnp6foaKhoJ+enp+enJqam5ubmpqZlpaXmZmYmJiWlJOUlJWVk5OVlZSVlpWVlZSYmZuamZaWl5WWmJiWl5OUlJGRk4yRkJOWfXhqYWJiXFA8QDw2OENWSERCOjg7Oj47Nzc5Nj06OTk2NDc6Ozw9OTo6Oz87PT08QD47Oz46PT89PkBBP0A8NztBQ0U/P0REPj9EREM+Qj07PDs6Z5aTk5OTk5OTlJSVlpeWl5aWl5mbm5ybm5uamaOjoqCfnpuamJeYl5eXmJmYmZybm5qkgGpqb3lzcZegnp2dnJydnp6enp+enp2cnJydnp2bnJuampqam5ubmZiYmpqamZmZmJqdm5ydnZ2dnJ2cnZ2cm5qdn5ucnJubnJubnZ2dnJydnp2enZydnZ2cnJ2dm5uenp6dnZybnpubnJycnJydnJubmpmbmpmYmZmYmpmZmpyfn5+jpaKfoaKioaGfnqCgn5+fnqCioaGhn5+fn52ZmpudnZqZmJWWl5aVlZaTkpOUk5STkJCSk5GUkY+OkJGOlZabmJWYlJmXlJiRjJCPk5yTkoyFjIeDhndxZ2pkW1xRQT44NkJHYEJFR0A+Ozw7Ojg4NjU8ODo4MzQ6Njk9PTk5Ojs9Ozw6PD48Oj5AOj5APjw/QD8+PDg6Q0FEPz5CRD8+Q0VCPUJAPDw8OmeYk5KSk5OSk5SVlJWXl5aWlZaXmZmZmpqampqkoqCfn52bmpmYmJiXl5iZmJmcnZ2cqH1nZXN7enOJop+enp2dnp6enZ2enZ6enp2dnZ6cm5ybmpubm5ucm5iYmJmZmJiZmZmbnZycnZ6enp6enp6dnZybm52bnJybnJ2dnZ2dnJ2dnp+fn52cnZ2dm5qbnJmZnJ2dnZ2dm5uanJ2dnJycnp2dnZybmZeVlZeXmJqam5ubnZ6foqOhoKGhnJucm5ubnZqcmZycn6CfnZiZmZmUkpKUl5SPj4+OkYyNiYuQi4mLjpGRj4mQmJiQkoyNi5KQj5iYoqiqpqWlrKOmoZqep6eyqKKVo6Cfl39wcWlsXFtcTUY8NzdHR1g+SE5URjk+Ojg5ODc1PTk4NzMzOTY6Pjw6Nzo8Ozo6Ojo8PDs/PjtAQD47PT5BPDw2N0A+QkA+QUY+PEFEQT1DQj49PDlmmJSTk5OTkpOUlZOVl5iYmJaXl5iZmZqampqaoqGfnp2cm5mYmJiYmJiYmZmZm5ybnKx/am16f3lxh6Genp2cnZ6enp6enp6dnp2dnZ6enJubnJubm5ubm5uZmJiYmJiYmJmZnJ2dnJyenp6enp+fnp6dnp6dnJydnJ2dnZ6fnZ2fn56goJ+enZ2dnZybnJ2em5qbm52enZ6dm5ubnJ2cnp2cnZqYl5SRjo+QkJGVmJSWlJiZmpudmJuYlY2Mjo6TkpKRj4mQjpGRjo+Ki42NjYiIi4+Lg42NkY+MkI2Qk5WVnJihoJySn6SipKmam5eanKOprb3Bwbq8uL26ucC8ubq3uru7tL2zwbV/bnVmZ1peWUxJRTo7TElTPFZSSUM6QTo7Ozc3NTo6OjgyNTY4Oz08OTk7Ozw5Nzo4Ojw6PT85PD8+PDw9QTs5NTg8O0A/QT9EPTxBQkA8REM9PT06YZOTkZCUlJOTk5OTlJeYlpeZmJmYmZqbmpqamp+gnp+fnJqZmpqampmYl5iZmZmZmZmphXB1e4B3b4mhnp6enp6fn56en56fn56dnp6fnp2dnJ2cm5ubm5ubmpiYmJiZmZiam52cnJ2dnp2dnp6goJ+enZ6hoJ6dnp2enZ6fn56en6CenZ6enJydnZ2cm5qYnJuVmJqamJiYmJmSjJCXlKCXk4+MjYqKiImMiJORh5CPjYqKkJCLjoqMi4+IiImJjpGOjYaFiYaKhoWLiI+SkJCNkJKXlpKamJ2TlJ6kpqaqq7Gsr6+rpquqsbm5tbS0rqyvtMDIxcXBvsbDxMTDurW+t7a0s7C2tb6qcHRyXGZfXl1JRj8/RUtMVklcTEQ/PUI6Qzk5Nzc7OTk3MTc5ODo+ODg6PDw7OTc5OTs9Oj4/OT5BPDs+PD46OTY5PDpBPkNBQT08QkBAPkJEPj8+OVyHhIOHi42KiYaFgYqMkZOVmJiHlZaWkpiampmenZ+gn52ampubm5ycm5iWmJmXl5ibqo56dXZ7f3mCoJ+fnp+goKCfn5+foKCfnp2dnp+enp2dnJqbm5ybm5uYmJiXl5iZm5ucnJydnp6enpybm52dnZycoaGfnZ6dnZ2dnp2dnJiWlpaYlZWSlpmWk5GKjI+PjI+NkIuLj4+WiYiEi5GZjn2Fi42PjYyHioyQm4yRj4+Lio6TjIyNjIiSi4yFiYyPhouIh42KhYyEj4qXkJOYmpWbnKOqoaKknKKrsbe0ubWxs62vsrKlp7O6sbq6vLa3tsDDw729vLa/urq8wbW4wL60r66mqa+3mm58Z1tjWl1fSEU+QUtJU1hZXkFGOTk9OUY/Pzo3Ozs7NjM6Nzo5Pjg6Ojw9OTk4Ozk7PDo+PTtAQDs8QjxAOjg0Nzw7Qj9BQj4+O0NEREBDQz0+PjlhmZWLkYWNj5aSiHl9e3+Fi4OKgoqJhmuAeJCLlpqRnZ2UlJGTlpeampiWk42Sk5KQm5uIdndzcX1/cpGgnZubm5yenZ2eoKGgm5uWlpucmpybnJuYmZqYmJmampqWi5CTlpmYlZiYlpucl5WSkY2SkZCUk5KXm5mYm5ePjpCLjo2Ch4uLi4qLiI2RjIeHhoqIiZGKh4yEhYqNi4qNhI+UkIyDkJOUmZWQi5OTkZWRlpWOj5GMlI2Oj4qIj4ePhoeJiYmNiomJioWNh46JmJKUmpuXmKChp6Cko5qqqbO2sbWwqKmiqK6tn6qvsK21ubi8wr/BxLixtbCutrOwuL68ury+urOzp7G3wpB1gGNiXlpXUk1IRkVQSVlXX1tDUDpCQz1HRj84Nzo6NzU1OTc8OTw5ODo9Pjo6Nzs7Pjs7PTs9P0E7Pz48Pzo4NDM3OkFBQEI+PjpDREM/QUM7PT45Z6mloqKZn6CippeUiI2CiIJ1h4iKiIp7e3Z7enmPeoiSfn18en6CkYWBgH1zfH99fISHfnRweHZzfHaBj4iIiYeIioyMkZicl4iOhIuNi4iNkI+Pi5GPi4yOj5CQjouFhYeLjIyHiIuOi4eMhYaBjYuGiop/iYqGiJiRiIOIg4KFfIuLjIaJi4iKkIyIi42PjI+Wh4mLio6NjY2Wk5OdnJyalpycm56bmpuYnZeTkZWWkJKRi4+LlpSMjYqDi4SEiYyQkIqOio2LipGJjZOTk5SVk5KcmZ6Xn6CfpaKvsamupKSfmKStpqa4t6ysu729wsPAv7+vpa2wsLS3uLO0uLa0ta6stK+4tLaBeXpjZmBeVlBRQUVMT0lcXl9UR0dCS0xCREA9ODg7OTU3Nzk3Ozc9PDk9Pj05Ozg6O0A8Oj06PkJBOD88Oj84NjQyOTtCQD9CPj04QEI/PkBEO0A+N2CloJqXnaGaoaCPl5efl5WCjaCfo6GdmpKOjIxycXBvdnFucG1ucHZub29waHBxcHR+c3FycXd7cnl2d3Jyd3Z6e3l8fXt/iIGEi3+PkYaNi4uGiouLiYaEgYaCgIKJkYOAg4x/ho+LiYWAh32AgZKQhoSEho2DhIyPj4+IjY+Hi4iRkJWRjpCKk5eOj5WYp6SfnZWYlpaln5udq6aqt7W4srGnr6qnpqGfmp2WkpWVkYqPjImTjZuVjYuLhoaJjJWQkJCLmZKVlZSbkJiTlIyNkYyWl5WilZ6mqauno6OqsJucpp+mq6G0vb6zs7+5u7u6uby9rqiusa6wuLyztLGxqrCpqLGxsqild3J0X2hhYFRWUUlKSFZNXl5eVExKRVFKRUdDPTo5OTc0ODY4Mzg4PTo9PD47OTs4Ojs/PDw+OT9DPzg7Ojg8Nzc2Mzc5RT4/Qz89N0BAQT0/RDw+PThUj4yGh4eUjJWZl5yWmZaNlZyWlZydoKCdmpiWeHFubXJ4cXFsbnJwa3FvcG1yc3t1dnd5fnVxeHZ0d3tybn98gX15eH1/eYOGg4WCg5CLkIuLi42Pi4mJhYKBfX9zfYiAfpyQhIWFiYuPinp9fYaOjYqGjZSRi5CXj5SXkpihlp6XlZunpp+goKawq6GjpbW0sqqmqq+isba5vcK7ucO+vLi9uLWxrLCspZuSk5mfm5SPk5WOmp2doJqfn5edo6qsoZ+em62hp6qwqaampJiRkZWUo6SirKSss7Szs6i3tru4sLKvra2yt7a6srW6s7e5u7i8urayr6yxsbKztLOxsa2us7Gzs6yhl3Zxc19jXlJRVE1PSUdYT1pcZFROR1VPRURKRD44Ojg3NTg4ODU5Nzo6PTw/Ojg8ODk5PTs9PTpCPj84Ozo5Ojk4NjI1N0I+P0RAQDY+P0I/PEM8PT46Tn98go6MjJOTl5eaj5SWjZaRkZSXk5qanqGdnHJvcnFxcXFxcG5zcW91dHJxdneAdXd8eYV+d3t8eX1/fICJiYmDfXp/h4GIiYGAgIGGiIGGi4aIhYSIiImEf4J/enx8fX6SkH+IeIGFi4qDhIWKj4yNkZmdlJSUoJqan6Ktsa2ppKWtr6ysrLWuvrmtrqm1sLexq7G2rK+9wsLAvrq8trKutraxtK66u7OurKepp6unoqmtoKmooq+wuLSxvLq6urK0ta+8tLezt7e7t7mtrbCprLW5sbeytLe2sLu7vLu6ury1vLi0wbWsqqqrtLG3uLm1trSzsKymrrCqq7Cxq6yusLKxtK6qo5N4dnJlZ1tMUlBGTUhTV1JlXmdUUExcUUhMUkNBOTk3OTU4ODY2Ozc5Ojs6Pjk4Ozo6Ojw8Pj08RD45Njs7ODg+OTUxNTZCRkREP0A3Pj5DPjpBP0BAO0t/gomXmJSdlpabmIuSlo6XkZGVl5SZl5+bmZx8dHV2dXl1c3RudnJzdHV2d319gX56gXyDfoJ/fYB/hIKFj52RiYF/go+Xjo6HgoCBiIuFfoqQi3+HjYyLioeSioeGjZGTkZGEh319g4iMjouOiomQj46PlJSYkZWbmp2dqK6yr6+1tLOtsrW4sLy1tbGqsKqztbS7t7SztrS1r7i4t62noqassLCvtre3vrW5vLOysa61u7C0r6+yu7axuMC9tLS0s7izvLq2tLrAvbm6ubq+ubm5vrWysa+yr6q1tLGzsbSzrri4tb+vpKaoo6ussa+zrq6wsKytq6qroqKmqKKnrauqpaynoqeYeHlxZmVZT09NSVJNV0xPX15cTlVUYlFEVE07Pzk8ODk1Nzc1Nzk1Ojo6OTs4Ojw8Oj08Pj4/P0I9ODY6Ojk6QDs1MjY2QUZDQz4/Nz49Q0I5P0I/PjtLjpGTmJmVmZGTopiTkpKLk4uOkI+Vl5ablZSbhoJ9enh2dHRzdH53end2gIKDhouMhISFioaQiYeRk5aRjZaalY+IjI+emJaVkpCTl5qamJCdoJ2Tl5qgmZ2bo6CVkJugpKOak42IiIuJkZGOkY6LmJqPj4yUmpecnJufnKSstLm6vK+2tLi0tLK3uLmzq6+qqKy1srK1rrGrrqa3s7OxpaGotbCvrayrtbqyu7q6tLK3ur67ubG4sLmtqLK4u66ttLS3tbu2trm5vLe0r7G0t7a5s7e1pq2pq6ior6yprq2up6KxtLG0q6aop6Cjq66oqq6orLKwr6+pqKGeoaGjpqOgopqlo56ol3J3bmdiVUtUT09KQ1BLX2JYWlFcU19NSFJJQUA5Ojg2Njc3NTg5NDs5Ozk8Nzs+Ojg8PD0/QkBBPTs2OTk5Oj87NjM3OD5GQkJAQjk+PUBDPkBGQj44R5OWkZWTkpSQkZ+ZnZmVkI+Sko6Mk5aWko6RlZGSkIaBeXJzdXuBhI6HhZGTkpicnJiVkJWYo5yaoaeqqZ+clpeVnaKioZyZnpmlqKyvramnqqmop6GlqKirqamvoZufoaOjoJqfoJyUjZiUmKCgoaSem5qkp6Spq66spaOoq6+xtK6qrK6zr6ystLO0ua6urayqrLKwsK2wqKqmsrS0uK6qtrqwr6qurLC3s7i0t7W0u7y4tbWxtauyrKiys7uvrbGytLa1sbG0s7OvrKuvs7a0sayutKqqpqWnrauoqKupqqifqbOwqqeppaOio7CtqaatpairrayppaSioKWipaOYmZyVnqKippdudWVnZFZPWEtLSktTVHBiWWRXX1tcUlpQTEM8ODk6Njk4NzQ3NzQ4Ojw6PDg6PTk3PDw7PkM/QT47OTo5Ojs+PTg0NThBREVEQkM5PjtAPkI/R0Q+N0KSm5SVlZaVj46Wl5qZlZGKk5SSjo+SkYqKiY2Ul5qTjYmCho6VkZSfmpuin5+jnqGhn5ijpKelpaapqa2rqaKmpKilpKGfnqOjra2srairrq6qqqukoaKlqaenqaijopybm6SgpaijoJidmZ+hoqmnoKKirqyrqqetrqilpKmpqammo6iqqaekp66wr7Ovq7Crqq+yr7Czua+rqLCxrrCyubO0r62vtbCss7GurLW1tLSzs7CvrKyqrKusr7G0s7CwrrCwsKyqrauqq6alrrCysKumqbCvqaOkqaunqKaopquwq6mvqaaoqaalo6iwraqpqKKpo6WnpKGhoKKloZ2el5aYlJugpKmUbnNeamlfVVpOUk5QT1JkXGVjW11ZXFBZT0tAPDs5Ojc6ODczNTMzODo9OTo4OTo5Oj08PEBEPkA9OTo8PDw+Oz45NTo8QkFFQUNBOT47P0BEQENCQDdAkZ6YlJeZlpGHi5SSl5GIg4mLk4+OkI2Hh4SFlZmWmJeZlpqeop2anKKkoaCdn5qfoKGgpqGgoKCjo6KlqKmrramqpqOmpaCloKaopqWnqKapqKOnppmcpKaioaChoaCcmJmfoKGkpKKenpagm5qioqChn6CiqKCcn6GloaCmo6KfpKGspp6foaGkrKqnrKivq6e0sa6ur7WyrKqwq6mtrbWwrq6srreup6yqpKivsq+sq7Kvqqqpq6utqa6urrGxraqtqaunp6uoqauinaapqKilqKisqKilpKWop6iopqmsr6+oq6mhoqKlo6Opq6ymqKWjqKKhoKSdnZ+hoZ2bnZ+amZWcnKOqlG9zZm5yZF1dUFVPV09eZGRsaGJiWlpSVE9NQTo9Ojo4Ozk1MTYzMjg4Ozk5OTk7OTk8Oz0/Qz5APTk7Ojs8QD0+PDk5PEFBRUFGQTo9Oz9BQUJBRUI4PYqWlJOYmpaPiISNjpGSjIiIiI+JiZCRjoqKiJubmZygpaKlnqKjoZqeoZyanZ6bnKOop6ugoKOYoJ2XnKGjo6WjoqKkrKilqaCepqmnq6mkn6Kgoqahpq2mpp2fn5+fn5manJyhoKGkn6GbnZqcoJ6hn56eoKOZlpqYo6KipJ+ZnKGhoqCbmp6goaSgnaejqrGorqusqaSqqquorKalrKqws6+rq6mwq6appaWoq6ynpqevq6Wnq6upq6irqqqrrailqKOmpaesqayoopykoaOmo6qpqKano6SnqKanqKepqKupoaKoo5yepqWjqKino6WlpqmgpJ6inpeYnZ+doqKlnpiUlZ6go5d1d2t2d2FfXFVZUVVWW2Necl9oX2NTUVlUSD48PTg7OTo4NTM3MzM0Nzo4OT05Ozo5PDxBQEM9PT44Ozw9PEA/Qz86ODo+P0NAREE6Oz48QD9DQ0VDOTyCmJmenZ2alZKKiZGRl5GQh4SJgoGNj4+Sj42cnZ+hpKmlqaeorK2moqKfmKSmo6Stsa6yp6asm56em5qjp6Cfo5+foq+rqqyoqKuwqaipqKGfoKeprbCyr6yjoqahqaWepKOipqClpKKlo56doJ6fpaKinp+imJWemp6fpKGblZigoZ2enJudnZuZmZWen6Oonp2iqKGaoaOmoqSoqaqoq7CxqKWlp6eopKWpqaqnoqWmqKadnqWloqClpaOlpqCjpaOjpaelqamqpKekpqKmp6SrqaenpKGlqKynpqWlo6OopJWdo5+bnaCjqaeopqGjo6mooKiioJyVkZqfoKGmopuXkpCamqCVfHdvfXlmW1tgX1pcVlxoZG9jbmloYl5QUEA/Ozo4OTg8OzYzNDMzMzc5OTs8OTs7OT49QkBAPTs9ODw9QD08PENBPjo4PT9EP0M+Ojk/PEI/P0FEQjk6gJ6kp6Kem5+gmY+ZnaCWloqGj4iEi4qTl5SRo6Wnqq6trLOys7S4t62pqqevtLKxqq6usbKusa2lq7OssbGpq6+rq6y2sLSwq7GysaOfoqqpp663trS0trOvrKuuq7awqbKxra6npp6io6ObnZyXoqiloZ+eo5ueoZqWnaScm5aZoqefoJ+joJuUlpmWl5qfoJmVnqKZmJ2dpZ2gpKeqqaiqraylqaSlqqeqqaqsp6SkpKOimZmhnpqaoaCfpaWYnqSmpKqooqelpaGqp6mnp6ejqKWmpaGkqKesoqekoaalpaOVl52Ym5mVo6elpaSfnZ2lo6Kqo5+amZiXnJyaoaGakJOTl5ibjX93cnZ4aWJbX15cYllgZG5ta25hX2RgUE9BQDs7OTs4Ojk2MTQzNjQ3Nzc6PTo8Ozk9PUI/Pj89PDo/OTo7PD5BRUA9OTtAQT5DPDs5PzlAQEBAQkM7OXuao6OcoJ2dop2Zn6KioJibmJaYkpSQm5qWl7S0rrW4s7S4tre0uLm3tbm4ub28uKqLnLK4vLS9urW7uru4s7q/uLe5u7G3r6iusq2inJ+qsri8vL27ur+0r7GztbS3t6+1tLWysKikop+gl5Wal6SqpqahpKOkq6WlmKGko52goaKooaOgpaGck5mYmJmco56cmpudl5uZlqWam5+hqKmpqKuvr66pqKmrrKytq6irp6WjoJyfo6Ojn6Cipammmpyip6Spn6GjoqKgpaanpqSooJ+ipKGjoqiop6OloKGopqalo5mbmJuTj6GknqKfmJiVoJuhpaCfm5udnJuamZugmo2YmZiTkYaAdnh5eGNbUllUX19hbGh1a3BnaWliWVNMQDw6Ozg5Nzk3NTU2Mjg1Njc3Ojw7Ozs7QD4/QD0+Pjk6PDk2Nz47QkZCPDg7P0NDRDw+OT43PkFCP0ZDOzhwkpqblJ6bm52Vl52doqajopaXnpaXl6GblJi+t7G4uba3t7i7l5S2vbu9vcDFtaK7mKC3v7+6wcm0nbu2sra/xcGooLazurGqrrSxsLG0tba8vb68vL3Guri3ur20r7Wxsbq4t7Kzsqqmpp+YpKSnqKSupKurtbWus6CnqqynqqmlpqCnoKGmoZOWmJ2foqSjnZ6coaChnZekmpmdoKaqqqqtrq2tsLGrrK2sqamrrqimpaalpqSkpqaeo6eppKGcoKKjpqCio5+jpJ2foqWgpJyboZ6fo6GhpaSlqaOkpaKkp6ehn52elpOcoJiZko+MjJeWn5uWnJqdnJqTlpSUmJOQmp2YiouHgIB8gnhhXllTYWhgZnNvc2l0ZGlkYltMSz46ODg5ODg5NzM0NTI1NDY2OTw8Oz08P0E/QEA9Pj44OTs4Njc/OUJFQzw7PD5DREM9QDs9Nz1DQ0BFQjw3Z4yRk4qalZiblZWYm6Knq6aVl5iQlZmhnpeXvrWztLu6ubi5woeYt6u4u8DCxbOjw6e4s72/tMTHvbS7uL62wMTErqCworW2tb2+wcPGw8O5vb/AwL2/xL28ur2+tKeqmLHAvbi1ucCzr6+qqqitp6ekr6eqtLyxtLWor7Gwr6yqoqajrJ+fpquXmqifpaWfoJydoKuwsKyiq5yYm6Cor7Kys6uorre1sq2tqaalqKulpaStqaShn6Cnnp6mqKmmnp+anqGlpqmcnaObl6KmmpuanZ+cmqGcmZ2eoKijn6GfnaWioKOioZSZmpmTj4qLhI2Qk5uPjpiVm5eYkJORkomNl5iYk4uKi32AgIVwYGFeXmpiYm53dXZubFtiUVVcTUc7PDk3OTc5Ojc0NDQxNDM3Njg8Ozs8PEBAPUA/Pj8+Ojo5Ojc6Pz5FRUU8PT1AQkJCQUI7PDhAQ0NARD87NV+MjIaFlouUlZeYl5ifpqellpWWkZebn5ual7mxtrO5vLy5urWqsryxvsG0vMe5uLuuv6fGw7/KxsnIxcXJvMLHx7+xsae8vL7FxMbJx8XGu8TAxcbAua+9vMC+vrOrqoyzu760tbfCuq2vsLWqq6aqo62kp7G2q7WyrbOtqK6vp6awr7Ktqq+zpKu1qaeopKCgnqmyuL61tbWqqaausre4t7apq7i8ubexr66noqOop6SfqKOfnqCZoZydoqSnp6GelJuaoKGlnqChnpajnZSQlpiboZqflpORlpSin5qenJudoZ6kn56VnJiPkpOPjImTkJefiZCWkZuUmJGRlZaDjJWXlpKLjIh8f4N/amZoYWtsZm51cXJ1cWZeX1xSSUU/Ojo6Nzg0ODw3NjU0MjMzNjU3PDo7PDs9QD4/QD48PTk5OTs6PDw+QkRFPj49QENDQkREOzo4QUJCQUNAOTJbk4iEjZGKi5GRlZCSmp2fnJOSmJSdnZqXmpW2sbm1tb6+tri1uLO8vMTEusPHwb+0s8XFxr/CzcfLzsvLx8HDxsfIysXExcO7vLzBxcHFxb/DwsbFwLGTvrq/w8K2trqptLO0qauzu7uxn5uxr6ykrK60p6qpqKqtrKmlpZ6pr6uyu7q4u7e5t7O5uLOurLO0qrC1ub3Bur6+vL60urm4u7qysbS8u7q7s7Oyp6Smq6uioaCdmpudmpyXmpuenJygnZaclpuZnZ6io52UnJCNiY6OkZ6bnJWNh5KLmJiWmpybmJybnp6cmp6UjpiYmpSRmZeeoZWYmpKXlJWRlJqYk4+TnZaSi5F+enx/dGtrbmRvbGhxeG95aWlhXGdhUUZEQTw5OTc2NDQ6ODQ2NTMzMjY1Nj05OTs7PT47Pj49Oz05OTs7Oz89QUNBQkFAPEBDQ0NFQjs4OUQ/P0BCPzsyV5uQkZCQh4WSjo2IjZCTlZGPjZSUm5STlpqRs7e4uLi+u7C1sri2tbbAw8G+w8LAvru+u7u8xMzEzNDLxsa/xcfLyNTLysjGv7u7vsS+xcjGxsTEw7i0wLe0vMHCucK3t7/Au66lrre8t62co7ewpq20tayupaWjqKSgoKWZqrOyvsG+urm6uLW0srG0tLO6wL7Av769u7u9vsDCt7a3tru7sru+ubi3u7a3tKyoqamrpqijnpOampyYkZKZl5GRmJqXnpiWk5acm5+elJOJiX6GiIuWlJiZkYmVkZeWlZmbmpaYl5idnpyhmJWZmZyYl5ybn56jnJ6WmJeTl5yZmZyUlp2UlpOJdnl6e3Zua2lndVpmcndzeGZnXWRbUlhJRj87Nzg4NzYxNjk3NDQzMzM2NDY7ODo8Oz08OD0+PDo7PDs9Ozs+PkRBQURCQEBBQkNDREM9OTlCQD8/QD89MkyWmpaSk4yKmJCKi4yOkpKKiIaNkJiKj5CUl7O7tba/vb2xtrjBvby0uL/Bsbi3vsHFvbu8wsbJv8jOyMHEwcfKysbKxczIzcbIxb/DwMvNz8nGw8PEwsS+uL7Bw8DEvsHPz87Gq6+2tLWroKe0s66ruLWzq6mjoq2prKatn6y1tL/Cvrm4vbawrausr7W0ur7Fv7u8urO5u7i5ubWtsLS9u7G/vLiytrmzubu0ra2orKyqqaeXnpualY2MmJSTi5WWlJyZl5WWmZKYn5mQiop+iYqKkY6Vl5OUn5mWkJSZmJmWmJOUm6GeoZiYmp2ZmZaenpibopqdnJuYmpuZlpeXlpyZlJyYfoB4eXV1ZWVpamddam9teHdjYmBgXlhXRkU4Ojg6OTc5NDQ5NzY2NTEyMzM0Ozo9Pzs9PTo6PTs8Pjo7Pz48QkBDQkJFQj0/Q0NDQ0RFQDk6QkFBQj5CQTVCkJeUlZmSj5qQjpKRjZSVi4qHjI2UiImPkpq2u7S8xsHEwr3BxcLAtLO9v6ywr7rDysPCvs3IxbfByMW/wcLIy8rCwsTJzM3Pz8zDx8bIyMjHycfFycfIx7/Fx8TEx8jK0s/SzLy4trS4uMG+vrq9ury6vKytp6q7urm3wLK1uLLAxrq3t8Gzsa2tqau1s7u2w7a2vbWxt762s7e4sLW2v7uwvbq0q7CxsbO8urOzrqutq62xnaOjoJqQjpiXlZCclpaYlpWSnJmTm5+clpGUjpWQiYyQlZOUm56YmZKSnJedlJmSk5aZmJ2VnJ6do5yVnZ+TnKKcnKCfnaOemJSVl5ebmpmgkH99cXRxb2JhZ3VnaWl0bXhsXWRbVWBZTEhDNjw5OTg4OjUzOjY2NDQxMzUyNTs6PD47Ozw9PDs8PTw7PD49P0E/RUFCQ0M+QEFARUVERUE7Nz5DQkI+Q0I4O4+akZaalJKUjZCUlI6VlI6Pi4yJk4uIkJObt8C6xsXEw8zCwcS9vrWvt7uvr7O6wMfFxMHMy8W2ucDCwsTHytHLwsPExsnFzdDOx8zJwsHGwcvLx8bMyc3FxsbDxsXJzdDNz8zHxMDDwsnNx8XBxMfBu760sbCwwb6/wca/vri3w8K6urbAvrWyrKmvsri+tMC0tLi0t7nEua+8vrm+v8K/tbq2q6qsrq+wt768trSura2utaSlqKimmpycnZyeopydmZOQkp2VmKCdmJiVmZmZl46MlH2QkJefmZmYk5GToI6Nko+VjpCUlaKdnKSem56elpyjoKGipKOkop6amZubnJ2enIN9cnx4cGdgamp2bGlldW5zYlxiVFdUU01HOjc7OTk3Nzo3NDg3ODQ1MjM0MjU7Ojk+Oj08Pz04Oz05OTk9PEBBQEVCQUJBQT9AP0RFREVAPDo+QkNCQENBOjSAoZeUmZiVkImUk5aTiZGMlJGOiJaKi5CXnMXLw8O8wMPHwbm9vbu4tre3rrK3uLzAwsDCx8bHurzAwsXHyMbSycHDxL+/vsTLyMrLyLy7yMfJzcjDyMnJxsXDwsHCx8fJysfMyMfIzcbLz8W3wMDAwLu6vbWzs7+/ub/DucC3u8G8uri7ub27srCvsKy5wri9ube1t7q9xb24xsjCwcLGwr28tamurrCwr7O6t7m2sK+tr7OppquprqannqSlo6OjoqCblZiekZecl5GRlZeZlZmRlJiSlYyYo5qcnp2FiZ+TfJKWlZKUlJennaCipJ+en56foaGkoqKjoaOinJ2fnqOhppl5enl/cm9mZWdkamRham1ubl5YXFZVTlBKRjk5Ozk3Njc3NjM3ODk1NjEzNTI3PDs8QDs/PDw6ODo8OTk4Pj1APz9GP0JBQz89QT5ARENDQTw5PENBQ0RBQDozbKKdlZedlo+PmJiZmIiSjZGVkI+Vjo6TlpbKy7u5urnBu7q3vsG8vLu5sa61uri4u8S6vsC+vru8wMXCxsK+xsG5u8O6uLm8vsHGwca6ucnJw8XEwMTBwsHEwcO+vcLAwMHCy8PGzMvFyNHCsL69uLq7vL63tLC5vrO8vrG5tbi7tryztbm2uba5t7GtusG6vMG/t77Ev8bDw8fHwrvAwr/Cv7iys7O1tLGut7S3tbSxrK2xp6Wlp7CtqJ+nq6ajqKWmpqCgn5SYmZSRkZWUl5OYl5qhnZ6hnKGdoaWglpSbkZeXmJqTnpmZqaSlpKWdoqCanqCkoqOcoqGjoJ6cnp6ppaiVfXuDeG5mYWRiYWJjY2piZmNaWVlcWVFORT07OTo7Nzc5OTY0OTk6NTMxNDUyNzo7OkA9Pzw8OTc3Ozo5Ojw+QD8+RDxCQURAPz49QkRCQkI+OjlCP0FCPT44NVmfnJiTmZaRlZiYmpeQkZCQk5GTlJKSkpSUxce4tbq5wrm5vMPFwri7ubGxtry6tbnAu7u5tre0tLW/u72/ub26urS/uLW4s6+7vLfAt73Cv8G7v8G8u8W+u8HEwL6+uLzBwcu+vcnEwMDKwLHBv7u4u766tbe0uLy0vbi1tLCzvLG3tri/tr25vb65t7q+u7/Axb29y8PGw8TAw762ubq2v7i7v7y4trOyq7CwsrWzs66sq6emnqeurauiqKumpqqjp6iqo5+Ym52bmpicnJiXnJuhpZ2anqGhoKGmoJqbnJiboJ+dnJ+coKiho6SknaKfmqKgop+el6Shop+dmpieqKWhi3x5h31xY2BiYmdqZ2ZpZWldVlVTWU9TS0U4PzY7Ojc3OTs2NTo7PDYzMTM0MTc7OTg/PT47PDs3Njk5ODo7PUA/PkA9PT9CPjxAQUNDQT9DPTo2PEBBQDw9ODdJlJibj5OUkZWYlZGWkpWRkJGUlZSTkpKYlcHCwLq8ub62uL7EwMKxvbqytLO4vLW3vMC8vbS0sbC1t7W6wbi+uL+8vbe1t7CuuLa5v7vAv7fBvLvDtrrIuLa5u725ura7xcXKvbnFwL+8wb64xr3BwLzFuLa3tLi2tru7uLa0t7q1tLi8vbm/ucPAwLu5vLu+vcjEvcfEw7rAvb62sra4srm0usLCureysaysq62yr7Kur6ijpJ6rrKyqpKakpKiqoqemraihoaGmn6Oiop6bnKKfoKOdnJuhn6KgpKCem5eZn6GdnZ6eoaWkoaKioZ6ho5yinqCZnZijn52eoJqZoKKmnYR6g4B4cG1lZGZvaWVraFhYTktLS1JJTEhDOT44PTs2Ojs5Njc8ODk4NjA0MzE3OTk7Pz0+Ojw6ODg5PDg6Ozs7PD1BPj09Q0E8P0NDREA/Pzw6Nz5CREE/QDg4P4mYmoyMkI+Tl5WMkpCakpGXmJaUlJKQmpTDvsbBwby8uLi6v7a8scK2tLyxtLa4s7q9v728sq2vrLGwt7y2u7zAxLm3t7e1urm6u8C9w8C6xMK+x7i5uK23tbi6tLezu8XGy8G7xsDAv728v8nDxMW+xri1srK9uLi4vrq6uby6urS3u7q5v7zEwL+5uri/ubvFxr3Fw8Kyur27sa+2uLO3s7q+wLm2rLGrrqmqqa2qqq6mpKWnrq2ppaOio6GkpaWmoqato6Klo5+ho6Gcmpyhn6CloaCenZygnaWgnpeVmZ2fn52gn6KmpaCknpybn6Ofn5mcmZ2epJyWnKOcnqGcppZ+f4Z8a25wZ3Brc2VibV9cVEhLSkRKQkNHPzk7OD48Nzs7OTc4Ozc8PDYyNzUxNjk8PD08QTs8Ojs6OT45Ojs9PUA+RD89PkRAPz9BRkQ/Pzw9OTc/QUNCQEI5Ojl3nJiLh4uQkpOWjY+TmpOQnZiSkY6QjpiSvbfHvsO+vbu+vL22uri9ure9s7OwuLi1uby8wLeqraSusLe7s72/u8S3tri2t7+/xLzCxcXHx8rJxs/CwbiutbW8vri7sr7ExMrFwcnDwr+/vr3HzMfHxMe9tbW2wb26u7/CusDCv7y2t729vcHBwL+8ube8wru3v8W7wr++tbe8vK+vt7awtLO6ubq7r6mtq62rrKaqoqeuqKWqra2vp6Sgn6ajnqKjqKOjq6Oiop6dm5ublJaZnJyfpZ6fnpmYnpejoJyXmZqZmqOjop6jo6egpqCbnaCjnp2WoJmcoKCblJegn6WcmKKQgYaBcWVsaW50bndjZ2JcY1FLVEhFRUNHQzw7OTg9Ojc6PTo4OTs3PD01MzY1MDY4OTo8O0A9PDo+PDk+OTk9Pjs/PkM8Pz5APz0/P0ZEQEE/Pjo3P0BDQz9BPTo4ZqGYj4uNlZKVlY6PlpmVl5uVjoyMjY+bk7m2wbS/vLm8w8C+wLq1trKywLmvsry8sLe7tru8q6qjsLm9vrO8vrzFuLK4ub3HycrDx8jGxsnIzM7RzMrEtbrAw8i/v7W/wb/Gxr/LxsO/wbzAw8zKx8XGwbm9vMS/wL/CyL3Hx8XFvLrEv7vBv7rAvLu7wMS9t7nCub69t7S2uLqur7WxsLCytre0t6yurKqsrKuoq6Gms6qlra+trKippaOkp5+io6Onoaeiop6cnZyamYyQlpeZnaKZnpuVkp2UoaCdmZ6fmJimpqKfoqKmoqeloqCko6GbnaCbnKKfl5WVnp6kmpafiYGDgXRvbGx0a2xuX2NeYWFOSE0/RUA/REM8Ozo6Ozo4Ozw6OTw+OTo+NDQ1NTE5OTo5PDtAPD89PTw4PDs6PDs7Pz5DPkI+QD89Pz9FRUJBQj87Nj9CRUQ8QUE6OlmfmJOSlZqVmpOQlpeclZuZlpSVkZKTnZm2uLaxuru6vsG5uca7trWypb69tLbBv66zvbS4wbGwsbS8w7y6ur68xL+3vb+9x8zGx8nGxr/ExMrIzMzNysbCw8vOwry5vbq5wMO/yMbEwcG/xcDKycPDw8O5w769ub+8wsbCyc7Hxr66xr26v7m3wLm5vsDCvrW0vLi2u7CvsrK1r7Cvrqyus7CzsrirsbKxqrCrq6yrrLatqKyusqarrKmpoaWgpaakrKSmoaChnqGgnaCMlJeTm5+mmZ6emZOYnZ+gnp2eopuYp62ooqSgoKKqpqmhqKGlm6CgnZ2jn5SYmKKdp6Gfm4J7eod6bW13e19wY1tdX15TST5DRUlCQz5DOz42OTo7Ozs7Ozs7PT05PTU2NjIxODo5Ozs6QTs/PDw+Nzs8Ozw9PTw9Pz5BQUE+PkFCQUVDQkRAPDY+Q0RFPkJEPztTmZuZmJ6dmqCalpyZn5KdlZ2boJWWlJqYur20sLu8wcTCv8XGura5sqO7vbS3xLuwtbq2ucS4tLy2ur3BvLu/tr/Bv7y/usDLwsfIwL+8vL/FwsfLyMHDwMDJysLAu7uwtLu9wMXGxcW/wMK/y8fCwMjAusK7urO6usG+wMrOysS9tby8ub+5ubW1s7/Avre0s7S4rbeqr7CwsrKvq6+nr7ausrG5rra2uLSzsLGttrS6sa6srranrLKsraSjoaenqLKrqqWkp6elpaCml5ujn6SmraKeo6KanaWiop+foaWenrC0sKSlnp+kqaevp6mgq6CiopqipJ2anqGmp6+psZWCe32Cem1zeHNncF1bXlxZUUVEQ01JQUU9Rzo6NTk7Ojw8Ojs7Oz0/Oj01NDUxMjc4ODs8O0I8Pz46OzY6PTo7Pj0/QD87QUFBPT4/QkBBQkJFPjo1OkFCST9AQkA7TJqdnZ6fnZienZmampySoJWbnp+blZGRlsW+urbDvMbCvr/Ixbe1uLe2ubu0r7e2srWzt7m8u7a7u726w7u3vbe5wLu6uLi1xcHCw7u4s7S6wb2/x8C5wLy+xcS9vrmysK64t7/Dx8PEvb2/v8PDvr/HvLy/tLSutbW8vr/OzcvCt7K4uLi9ubuxtrLIwLu2tLGwt6yzqbCtrbO3r6uuqrG1r7Gvt7O6usC/tre2sru6wLWyrbO3rLC6r7KloqWrrK+5s7KosK+xr6qiqKGkraitrLOun6inpqWmq6Sknqaqo6ayuLOrpZyfp6anrquqpbClpaWbpKOYn6exrLW4sLKOhHl/fHZsdXpwbmlcX2BZU1BBRUhHS0BEQ0g8PTY7OTk8Ozo6Ozo9Pzw9NTU2MTM2OTg8QT5AOz1AOzs5PD04Oj08QD46Oj49Pj09PkBCQkJBRD03NDU9REc9Q0I/PEWUnqCgoJyXmpiYlZmdmZ2fmp2bnJaRj5LDwMK9wrzEvLy7xbu3s7e2tru7s6CWtayvsbS0tLa4ucHAt725uLm2tb+ztLK4sbvBwMO4wLCvtbi4uMK6tLu3u77Au7u8rq+us7K5wcLEw768v7u6uLbBwrW/urWur62wvcC5z8rJw7GvtbS0vbq+ubq7ysO7uravsL2xuK+ys7C3vbaur66wt7CsrLK2vbzEwrq9t7bAv8G3tbC2srGzurGxr6esr6u2v7e1qbqztbmxp6uop7ausrG1uaisrK+qr7CqqKessayytr20saykqKuoqKusq6i2qaaonqadmKOuvLG7wbSmiYF8gnpzdnZ3bnFgX2VdWlVKPD8/RkY9RkNDOTo1Ozk5Pjw8Ojo8Pj4+Pjg4MzE1Nzg5Pj9BPzs6Pz08Oz09OTs8OTs6Nzs+PT1DQT8/QUJEQkE8ODU4PUNGPUREPzw/iZ2en52Xl5WUk5aZnpubmpuYlJ2Uio6Owb7Dwr6+vrm2usCxtbGzt7fCtbOrrbOoqa61r620trnDv7e6t7a2srTAtrK0uLO6wMHCvtjAtLG0sre+ubO1sry5vLa6vrK0tLSwuL7DxsTAvb+5s6+yvLquu7Szpquorbq+uMvCv76sq7Cvs7q3ub67wMXBu7y3sLXEtb+0uLu0u8PCs7a2sbisqaWrsr23v7+7u7exvL28trGvq6uprbOvsLCrsLSpuMC2sqm0tbC3tq2spqu7s660uMKwsbG1sbK1saywsri4ubi+tLGzrqyxramvrqqyuK6trainoZ6ptr+4ur+wlol9gHxxdHd0dnJsXmJgW11PSEE+PUhDRk1DQDc3NTs6OT48PDk4PT47PT86ODMyNTc2OD8/Qj86OD4+PTw5PDk7Ozo8Ozs6PEA+QkI9QEE/QkI/PDs3OjxBRD5CQz8+QYqgm6GdlJiVlZKYmpyWm5WalY2bj4SIhru0vb+7vLm3s7y8rLOytLS2wLXAr7Kzqqqxt62pubO3wL27vLi2uraxwLq3ubi5u8HBw9DStMi0tLC2urW0sqy8ubi1uMG6uLOxrLe8wcfDv7m6ta6lrLOwprCtqJ6gn6WttrXCt7a0pairqLC2s7K6tbu7u7W4trC1xLK+vL+8ubrFybq9vraxp6SeoamxrrW5trKxq7S3trGopp6gmaWmpKynq6y2qa+6sa2kpq2lq7GrrKmtuLawsrjBtrGxtbGvu7ayt7W1sry1urKwsbKutLKqrq2nuLWyta2uqqiosrq9wLa0qY6Ce393b3tvdXJuY1xmWFxdUk5NQT5JQkBKSUA2NjU7Nzg+Ojs4Nz4+PDs/OjkzMjc1NzU8PD48PDg+Pjw8OTk5Ozs7Pjs7OTw+P0E9PEJAPz9CQD47Njc6QERBQ0E/QUKJoJ2loJSWmJiVnqCcl5uYmZGMmYmDhoS1r7S7u7S1sLG2uq6wtLOvtbq1urC1s7KttrqurLyyuLm3u7+9ub7AtL+7vLq4vsK8wsnVyZfOxLSytLaytK+tu7q4trnAw7aurqqytry9ubaysa2tn6Snp52jpp2WmZman6muuayrq5+lqKSrrq6nr6yvsbGtsa6usLmwtLy+uLm4x8W8vLu4qaKcmJufp6assq6zqaapqq6popqXl5GcmpijnqKir6ekrKaompqemqGnp6anqa+2squ0trCqsK+xqbm2sbWxrqy3s7avrquuq7S1ra+rq7GtsbKoraurs7W3ur2wq6GLeoJ5cnZzbXVpa11balRdXE9NSERGTEJGTUY4NjY1OjU6Pjg7OTc8PTo7PTo5MjM2Nzc3Pjs9Pjo6Pz48PDw6Ojs5Oz47PTk8Pj1CPDtAP0A/QT8+OjU1OkBFQkRBQEJBiJ+ipqGYm56dmqWpmJudmpmUjJmHhoeGrq2uuLmxsqiur7iyq7CwqrK1ubm+tbK4tLm6tbm7tbWztbu8wLu+wLS/ubm6sbvFvMHLzcKOp8m5tLSzsLGtsLm4try4u7+ysrKusa65r6qrrayjqKGdnZ6XmKGVkpWXkJifqK6ko6Sgoqeio6mpoaanpaqtp6ynqKesq6yyu7SztLm6trK2ramgmpaWm52fq6yrr6Ojo6GpoJuTjo+Qk5KSmZaanaSloJ+ep5iVkpSYnqSjoaWqrK2iqaqppKmtrqW0sa6xraqprq+wraWmqqSos66trKmmpqmrpqqnq7Ksr7Oxq6mWgX+Bd3J4aHRzbmRUYGNXXFFOTEhASFFETUM9ODg3NTo3PD46Ozw4OTw7Ozw7ODI0ODk3ODs7PDs4PD0+Oz08Ojk8Ojs9PTw7OkA9PDw7QD5CQEE/Pjk1ODs8RkFDRD9BQYijpqKjnqCfp6Coqpufm5yZmI6Xi42PjKqpqLGvsK2lp6ayr6mmq6CvsLu1vby4wMG+vLy8ua6sr7Kyurq3t7i4u7SvtKywr6ScsLa3jYm1urKts7CvrK62trK0ta+qpJ6bnJyeqKieoKipn6GnlpuXl4+dk4+Qlo6Xm6SooKCioqKlpZ2jo6CepaCkrKSmqKSio6OrrLOuqa6urqeqraisoZyamJmYm6moqquepaObo5yVkIyPj5CTkJeVlpifnp6amaaXk4+Slp2ioKWjpqSnoKKko6Ghq6uksq2qrKyno6yuraufoaKkpK+srKmmo6KqpKqqpKmrpqmsq6agiHiDfHZ/eWJ3bG5cUWhUUE5HT01MQk9RQD47PjM5OjU7OT07Ojk9OTk8Ozw8OzkzNjk5Njo7Pz06ODs6Pjw6PDs5Oz07PDw9PjxAPT88ODtAQEE/Pz45NDk8N0FDQkQ9QEOOqqSjoqGinaulpqimoZ6dmZ2PmJWTkJWnpKGmqKmlpKChp6uhnKKbp6u1sry9wMLCwL7AuLSnpayqqLWysa+9yrKmqK2Vi412cH+En4yFobe0q7K0rqqrr7Cys66lnpKYlI+YoJ+ioJykpZ+eqJSblpeMl5GNkJeTmJ2iqp+fn6Cjpaicn6ChnKKfo6innKehoKSfrKisrKCpq6agpKimrKOdnp2Zl5qrpqmxo6WonqCclZOQj5GQmJCWlZiWn5ibmZujmZeUlpqdoJ2nqKWgo6Kho56doKmqpa6upqipoaKqrqqnoaCio6msq6eppqShqaKlqaalpKKmpKijkn18gHV1fW1re2RoVVFjTUlIR05STkpORztFQD0yPzc1OTs+Ozk5Ozg6PDs7Ozk5NDg7ODc7Oz48Ojk8Oj07Ozw9OTw8PD49PUE+QEJAPTc6P0FCQEA/ODU1PDpAQ0BEPkFGlq6koqWeo6KpqKipqqWmnp2imJiZmZWbop6bnqOioKOgoZqgmJiXlqGorK62t7q5ure3u66ooKGpoaCtq6qlvdSrop2cgGyBdGFjZXKDipu3ta+vs7Wqp62so5yZlI6RlpeZmZygoqKcnaWemqSXl5eWkJKRkZOal5ugpKqeoaGepqeqop+gp5+dn6SnqZ6jpp+qnaqtqq6nqLClo6Smp6ymoaShm5ier6iusqulqqqgmpiYmJWTlpqTlZWZlpuXl5ignpycl5uhmp6ao6eln6GioqOdm6Gmp6aoraOppZ6kp6mkpaWhpaSsrKmmq6eioKSjpKenoaCgpaKmoIl7gH12eHxkeHlgYlJVX0hJSUtTVElSUEw5P0I2Nz02NTs6PDw5Ozs4Ojw9Ojs4NjU3OjY5Pj0+PDk5PTk9PTw+PTs7PDo+PTw/Pz9APT03Oj5AQEA/Pzg2NT08PkFCRkBAR6CupKaroaOqrK6tp6ypqKCipp6bm56aoJyalZmfn5uen56WlJOXk5OcnqSorq2sq6uvqq+pnpeepZ2epaakn8DPqZJ8d4Fea5F1b2VfbpCgvrSxsbC4raehnJ2alJeampCOkZWRjI6OlJminJejmZqXmJmUmZiWnZufpaapoKajnqeurqumorGjmqSmpqqioaqiqaSosquxsqu5qKarp6urqaysp6Cgo7GusrC0qbGvopmcnZ6hmZubmpiZm5SWm5aYnKWhoJqjoZqdmZ+kop6gn6KmnZulpqWkpaijp6OepqOinqaloqWlqKykpq2noJ2dn56gpaGenqWgppmBe4F8dXZzaIJsZVtTWllNUUpOTlVMUkxBNz5CNjg9NzY6PDw9Ojw5ODo7PDo7OTc2Oj01OTw7QD03ODs3PTs9PT06Ozw4Pj09QD5BPj4+ODg8P0BAPT43NTg9Pj1BQEZAQUihqqCrq6GkqquwramtqaelpaWkoKGfnqWXl5SYmZ6YnJ2blo+VmZKSnJihnaqip6Cep6Gln5ySnKKbn6Gjn57Cx5l4Y2GKXFeCi5CIbFKJqcOzra2ssKegn6Kgl5GUm6CcmZeSk5+coaSbnpuWn5qfl5uinqWhnqSfpKitraisqKSstLe2sKe0rKKtraOvpaSmoamorrWzsr23vrCssa6tqaq0sbCoq6iytbezuKyxtKSgnaWfrKGhoqCgmpiWlqCbm5ikoaCepKGfnpqcpaCfnZyhqJ+fp6meoaOkoKagnqehn5ymo5+ipaOooKmrpZ+dnZudmqainpyjnqeQgYJ/fHh1aXd1XWxaUmBIUVVIRlVWSkJMRz1LSDhFPDY3Oz49PDo8OTg6Ojs6PDk2Njo8Nzs+PT8+OTc9OT47PEA8OkA6OkA/O0A+QUA9PDk3Oj5APzo+NzU4PT0/QUBEQEJGnKueqamipamprqimqqWmp6aoqqGlpKOmkpOVmJacmpqcmpWTmZuNk56ZqJ2un6eenKGdnpqakpmenKGioJ+nybmIYVp2l1pYYW2Qj35OdLTGs6eqrKqln5+ZkpKTmJiWlpWMiIuOlZ2dnZ2elp6apqCgqKWxqqeuo6uttrC0srGutri9wLqttbSwt7CutKmmpKWsqbmztbvDvMPBtrq2q6+xube8r7OwtcG8t72zs7WirKKpqLKpq6inqJqZnpqqp5+ZpqCfn6eopaSenaqhop6bn6igpKetmZ+jnp6nnqCmnpycoqGbo6KhnZympaWkn6KZnJukn6CboJyjiYWEfnZxbWl2bWhtXFhbQlZNSkdNR0JGTTw+TD00PDk2Oj0/PDs6Ojg4PDk6Ozs8NTQ6PDg5Pj4/Pjg4Pzk8Oz0/Oz1BPTo/PjxAPj8+Pz08Njs/QT07Pzg1ODw8QERCREFCQ5WqoKapo6mqqKmjoamgpqinrK6lqaWpqpSSl5mUmpqanJiYmZyamJqqoLGit6Swpp+enZ2XmJWZnpuco5+drtGqc1lkjIlYW29pt612WlmgurOurqmrpqCenqGinZ+dmpyclJOVlJ6emJSFnZqhm6ukq7KwubKysbKxur28vLm2uMO+v8K/trq6wMS5vbusr6exrbHCtrjCxsDIysDKv7C5ub25wr64s7vGw7zDvLezqbOtqrO0r7Ouqq6jnauntrGsoq+moaOvsa2wpKSvo6GgmqGnoaSqqpmdoJmao6CmqKGcnqKemaSenpiYo6OhpZ6mmZuipJ6fm5ubnIeFgXt0cWtrdXJwaFdbUUVUSERJT0g+RUE0RUg5NTs9Njs8Pjw8Ojo4OTw4OTs4Ojo4Ozw3Oz49Pj02OEA5Ozs9QDw9QDk3PD07Pj0+PUI+Pjc6QUA+PD45NTg9Oz1DQEFDQkGRqqGlqqelqqimn6KnnKasp7Gyq62jqayVkpWalJecoqGbnqCinJ+psqu7sr+rr6ylnqChnZyYm5+gm6CfnazOnmBfiId3eIWHdZ6NcnJzlLCup6SkoqCepaulnpeclJGZnZiUjIqGiIZ5bYigpKKrrLS8tsO+vrO7wcPCxcC/wsbGxcPIwsDFyM3QyMvDsre1vrK+xbu+zM3FzMzM0se+v8DDvsfGwrfDycnCwMW+ubS5urS7t7C1sqq6sa67t766uqq3rauquLq0vK6uuaOmo56mpaKjqaaZm5+Ymp2nqqegoaGkmJSjlpSZkZydn6Sep5+en6KdmJmUmJSIhH16cWtkaG94amVaW0ZLTEVEU0xEQkU3Oj87NTQ5OTc5Pj87PDs7OD48Njo9OTw9OTw9Ojs9Pj4+NztBOj45PT45PT44Nzs6Ojs/Pj1CPj83OkFAPTw9ODY2PDo8QT9BQUE+kqugp66ooqulpKKipaGlqquwsq2upKmmlJWWmpaUm6SmnaGqp6KrrLy8v8PBs7K4p6Ghq6qinZ6hop6cm56tyZhWb5+ZeZKcf2t6eo2msqqgmp2cn56al5iXkoyPl5eTjo2Qi4KDgndzcW5wj6atrrS5xbvNx8u/wszOzczHydHMzczHycXGzNDS1c7Tyb3Av8O7xsXIxdLTzNPQ09PMysLFxsfKx86/yNHMx8XGxMG7w8C+vr61vbOtv7/CwsbEx8SuvriyuLzEwcG6vLy1rqenraigoqmlmpagmpmdqKupo6SknpePm4yQmYmVmJugn6OdnZeempOTi5WPhYB5dHNlYmdyb2ZeWllDTkxDRVBJRENANTU1ODpCPTY4OkE+Ozs+PDk+PTc6PTk6PDg8PDw7Pz8+PD0+Qzw7OkA9Ojs6Ojg4ODk7QT88QD8+ODtBQTs7Pjc4Njo8PkI+Q0FAPpOvn6ivpqiro6KloKampKuoq62qrqKqo5Kcl5ebmJuirJ2frqalsarFxszOzb+wwailqKytqqGdo5+cnZqmt8yRVHmgpHp7bmZvkamxrKSfnaCbmJeUk5SWkZCPjIeEg4iHg4CBgYB5cnJvbHmktrq5vsvB09LTyM3O0dPR0tHQ0dHNzs7Qxc7U1djS183Gx8nMw8XKz8rS19HX0tTW09PIzMfNzcnSzM7TzMXHycrBxcvGyMjFvsKys8jEy8rKzsXKv76/vcHHxMzMyMm/w7+tr7OonqKqo5qTnpyYnqaprKSlppaXipWFkZSHkpKSmZualpiQm5WQjIaRi4B6cnV2Z2NndmlkVldRRE1GQElRQj1CPDoyMkA8RDw3OTxCPTs9Pzs7Pj05Oj48Oz44Ojk5Oj86Pj1APkA8Pjs+Ozk9PTw5Njo6Pj08PEA/Pjk6QEE6OT44Ojo6Oz4+PEE/QT6QrKKiqaanqKSfop2qqKOso6OnpqyiqZ+To5iWn56dpK6bn7CrqKyxyc3U18/Gu8esrbS4rK6jnqSjn6CkqsPOilh6hoRuaHGQrq+lnZ2doaWhnpqVlJaUin13cGtlYmhxb3F7hYqAdnBucXRwhbPCvsXR0NfW1tLWzdTW19TT0dPU1NLP0cPQ09bY1dbSy8nO0cvGzdHJ0tXW2dXX09bYztLKz9HMztDM0s+/x8bKw8zMy87PxcbHtsDKv9HMy8/Fyce/w8LIzszP0M/NysjOuLe7qJ+lq6eemJ6jnp2qpa2pqKiSlYiQhIyRho2MiJOVmZCWjJiSj4aHjIR8eHN2cGNgZXJiXVJcSUpHQUVIST47QDg9NDU4NTs4Njo8QD07Pjw7OUA7OTo8Ozs8Nz09Ozo+Oz08Pjw/Ojo8Ozs5Oz89OTU7PD48PD0/Pz46O0BCOzk/OTg7PT0+PzxBQEQ8hqugnKegp6Oim6CbqaSlqaCfoaGmn6ifmKSimqmmoqarmqOwsamotdDU19rSx8bLtLXCxbG2qKKlpqGiq7XPz49ke31vbpStrZyVmKCcm6Gin5ydmpaKd2ljYF9fX19eX2BeYmx1c3Fwb2xycXWSxMfG1NXW19fT1s/V1NrU1M7P1dTU0dHM0M7T19bT1dDP0tPRydPRx9DY19jR2NLX2dXWzM/Pyc3Ry87Pv8XCx8XOzdHQ0cjLzMDKy8XTzsvOyMTJxsbIzMrT09HVz9LM0sG5xbGlqLWup5qorKWdsqiws6ysk4+TjoiKj4OPi4SQjpmNk4+Zj4+ChYx8enFzdG1hY2ltX1ZQX0pKQ0ZDUU0/PD41NDo9NTI4NTU8PEA8Ozw6OTpAOjg7Oj46PTg+Ojo8QD08OTs9Pzk6Pz07PTw9PTo2PD0/QD08PT0+OjxAQjs5PDc0Oj48Pz89RkFEPYKknKClnaWlo5mcnaSeo6OfnZ+doJqnnpyhqZ+vraqqq52mrrioq7fX1NXZ2dHO0MC8zMm3v6+nq6mjpLG00ceMb3ZxhKmsoZiWmJqbnaGdmpyek31xZWNiX19hYF9hYF9gYF9gZm1wcG5rb3J3d5vMwNLV09jY1tnR0tLXz9POy9LN1dTSys/M09bS0dbNz9XV0cbR1MrQ1NXWztLQ2NjY18vIzcPIzszKy7/Jv8fIzc7Py9DNzsvOzsfLz9DKzsrCycbJzMrL0dLM09HRz9DKvci5sK67uLWqtrCtqLits7+7sZqPn5SRjo2IjpCFkY2ZjJGRlY6RgIWIenZvcG9rYWRucGFXXFpJRkZETVdFO0A8MzM8PTg3ODU1Oz5APTk8PDg8Pjk8QDtAOj04Pjk4Oj88PTg7PkI6Oj08OkE9PTw6Nj08P0A9PDs9Pjg7QEE9Ojw4ODs+PD4+OkVCRT6Bn5mlp6Cfo6eam5+cl56eoZqdmpyappufpKefuLa1taylra6+tLDA2NLX2tzWz83LxNPQwsGxqq2uq6WyscShbWxukKGclZOXnJ6fn52UlpiUiWteXl5hZGJgYGBhYGBhXl9fXl1ibXJvb3N0dnZ5pL7L1dHW1NPY1s7O1MvNzsXOytLSz8bOzc3UzM7TzcrX1dDM0dTLzNDR08rO0dXS1dXKv8rBxczCyMnCzMPFyMrKzsrNzNDN08vFyM/MyMfKxMbAxcrLzc/RxtDOzc3Mz8XHwLe5vcPDvcO5s7K+sbvDxLWqmKWimZaRlZWSi5SNmpGUlI+PlIKJhXhwcWttZ2BgcWhZWGhWTEZMSVBQQjtEPjs2Nzo4OTo1Nz09QTs6PD05PD05PT06Pjo8ODs9OTtAPD47Pj5BPDk9Pj1CPTs3NzU/PDw/Ozw7PDw4O0FAPDo8OTs7Ozw9QTpFQUU+hJ6bqK2epKSqnJ6fmJKXm5+am56ZmaKVoamppcXDwb+7tbKxx8K4y9XV2drb2MzNz8jW1cXDt7C1qaKtrLi8oW9tjpqNjJeVkJSSkZaWlpCMfGViYmJgXV5hY2JgX2BgYWFgX11bXWdycXFyc3FtcnmkxtPPy9DP1NXJxcnJxsa/w8bPzsfFx83K0sjLzs3G0dLPzszUysfLzs/Hx8/Sy9DPxbrEvsbJvcLHyc7EwcfAx83Hw8vKy8/Hw8TQyMbBxcfEvsDHy8vLzsLKy8jHzNDExce7x8PIyMLPwb28v7DByce5vaqwsqelnaKcmJCbkKOZl5mRlZiJj4J3bnRka2BeZnFhW1dgR0hIR0lNVEc/Sj02NDM1NT08NDg9PT06Oz08OTo7OT89OTw7PDg6PDo6QD1APD09Pjw6Qz48Pz04ODk6QD4/Pjw7Ozs7ODo+Pzw7Ojc5PD49Oz49RkFDPYOgm6qupa6qq5qdoJeUjpedmpmgmpqcm6WysazJzcrIxL69us3NxtDV1dna29jQys/Q0tTJxLi8vK6ltqq+uqF3iZaOjZaPhoOEhIJ+hYV/dGBcXl5eYF5gY2RjX11dXl9gYF9bWlxha3Jyb29rbG9vfbjRyMnKz8vNxLrAw7u7urq+ycbCw8DDx8rJyMrIwcXMxsjLzcnEwsvJwcLL0MTLyL+5wbvFx72/xs/Lw7/Du8nGyLvIxsTKv73Cy8bFxL7FvLy/w8TLxcS8wMnCxcfSxMDIv8rJxsfG0MPDxsOvxMvHw8q3v7y6tKmspKWYn5iso6GlmqOgm5R7dnN0ZmlaYW5tWltYUkRMRkJHRExERlNANTQzMzQ/PDM6PDw7OTw8PDg7PTtBPTo8Ojs3Oz05Oz07PTs6OD4+PEI+Oz88OTk7Pz07QD48Ozk5OTk6Oz06PDo2OTw+PDs+O0NCRD5/pZypsqm0rrCdnp6YnImUm5man6Kfmp2ov7i8y8/RzMfCw8fNzs7M1c/V2djZ0MzTzs7QysO2xL+0srqvvraIfZWMk5eGeoCFhoB2eHVycV9aW11gYGJkZGRlZGBcXF1dX15gW1laXGJvcm9raWxwb3OPxrzJxczAxsKwtrqysrOyscK8vLy6uMDBwcW+vbm9v7nEysXGwr3GwLi7xMm/wsm7t7u6xcO+vMHNw8a+vrXBvcO6vMa7wrmzvMXEwsK2v7W1vb+6y8O8tbrIur+9y8PBxcLFyMbIxtDGwszHssfJw87NwcXDwL2yt7Cyp6ioubClrbCrrayUeXZ3amRnYGhvY1ZeWUpGSkZISkFFQkVJQDk6NjQ4ODUzOzo7PDk8PDs5Ozk6QD46Ojw6Nzo7Nzo7Oz88OjxAPUA/PT8/Oz07O0A8Pj4+Ojk5ODk3ODo8PDw7OTo8Pjs7PjpAQEU+fqygrLWqt7SyoZ6fl5qNlJaan52mop2et8bDxMjO0svKysfNzs/SydDG1dTW187M0MbLx8nEvMi/rrC2tLevgoyNiouFeICGhoB+hHx0dWRcXF1eYGBiY2FiZWViXV1bXF5cXl1aW11daHNxbWdnbnByeZ29zMDDusG4rrCwp6qtrKe4tbe0srO0urW+sbewta+yu8K8wcS8v7q1s7q+wLjHubS7tsDCvLi9xsHDu7Wusra6vrTEt7u1q7i9vb+9sLq2r7a6ssW8tq67v7S2tMW9vsLFwMPFxsjLxcDGxrvIy7/PysfDxsLDtsO9vba5vse/rLW6tbe2jnh0eGZnZWJrbl5WXmBGS0hISkZCREFFRT88OjU2NTYzMzs6Oz06Ozs6Oz44PEE9PDo7ODc5OTk7PDo+Ozk+Pz1APz5CQD1AOjo+Oz89PTk6Ojo4NTY7PT48PDo7OT49OT86PEBAPIi3pauzsby8sa2foJmUlJiXnqujr6qnpMbLzsjGyc7M0MzOyMrJy8nKxM/N0s/PxsnEycTCvrvMuq6yt7Syq4yQhomJe3h+hoZ3eIJ9dGheXV1dX2BfYGRhXmRlY19fXFteXF1eWltbXV9scG5oZmpubnJ8pMe/uLi1sKusp56iqqeeq62zramrqbSttrCyqa6mrLK8urbDubq6sau1ubu0wrqwv7G9vLu2vMe5wratqqiwsb+1t7yvsKeys7S7vKuttaWutq66sbCquLCtu667uLvAv725wr/Hw8XBvMbByMu4xcfFv8bDw7nExsK7xsnMy7O5wry6sohydnZraWFibGhZWFdbQUxLTUlFQUM/RkE6OTo5OTU4NTQ6Ojk7PD07Ojs+ODtAPD05Ojc5Pjk7PDo4Ozs6Pj45QT0/QD87Pjo7PDo9PDw4OTg5NzY4PDw9Ozw6Ojs+PTs/Ozs+QDyKwKuouLe5w62zqZ2ZlJaZoZymsLWxt6bGztLLw8bCxdDHzsLExsDFxcPDysLJy8HCv8W+t7m5x7OvtLavraaRiY+RfHh+ioV6e4SBd29eXVxdXV9gXl9kY2JjY2JgX11bW1paXVpaWlpcZG5vaGZnaWtucoGtubC1rqalp6eaoKSgmpylq66jp6KrqqyqsKSmn6qttbaxvbmvt6+orre0tLy4tLyvuLm0sbzBscCupaiiq7Gys6e8qquoq6yttLOlqK2hpK6psqWnqK2lqLessLK3urq7sbu9vr7Ev7XBwMfIt7/AxLfEwr+7v8TCvsTIzMq/vsPAwKmGcnRyamldYW9kV1ZYUEhZUlNLRkZFPj5AOjc4OTc3NjQzNzo5OTo8Ozs8PDc7PTs7Ozw4OT44PTs8Njo9Oz89N0E+P0A/Ojw8Oj05Ojs6Nzc3ODg3OTw7PDs5Ozo8OTc5Pjw+P0E7jMKvrry3ucSwtrCbmZWcmKqpsLGztb2vxdHQzcTIurrMwsy/vMq3vsS/u8u4wsTDt7rAurWzucK1sbKzp6mTg4mNgXx+gH54dH98c3dmX11cXV5fYF5fY2NhYmBgX11dXFpYWltbWVhaXF9ma2ZlZ2Voa29yhaqlrKagnKGllJ2km5iSoaOqo6KfpaWnpayfnZukpqyyr7a3p7Csp6q0qrS6sba1rba5sa+6ubG3pJ+kn6axp6uouaqkp6iop7KtoKemn5ukpayen6ekn6Cxra2ssrSytLC1vLa7wcGyur7DwbK5ucKzwL2/tbi7vb68wsfEwsO/v8Sgg3dwa2FmX2tvYFRZXkhOZ09UR0VKRjw9Pz06Ozs4MjU1MzY5OTk7OTo6PDo3PD88PDs8ODg8OTw6Ozc4Ojo8OTg+Oj89OTg8Ojs9Ojc2NzY3ODg2NjY7Ojo7OTo7PDg1OTw6Pj5AO43ItbW9uLrAur21oJ6UnaGmurars7O7s8TQycvDx7m4ycLNwLnLuLzGubXGubXAw7C6wbeyq7S7tqqsrqWbhIeHgX16dXRvbWtqanFpXmBdXFxcXmBfYWNiYGBgYF1cW1xcWFlYWFhWWFteX2RjYmVnZ2dqbW+Inamgl5WaoZabopiWjZ6hoqabn5+jpaGnnpuim5+qsK2xtaKpqqmrq6S0ua23sKyyta6yta6wqp+dnqOisqSmqbitoqamn6isqpmfoJ6ZnZ+lmpqjnJudr6mrp6qrrK2wsrivuLm7sLa7u7qrs7O5s720trGxtbS/tr3AvcPBuru9l4N6cmtfZV5kZFhUV11JV1xLUEdJSUZBPD8/QDs/PDA0NTM1Ojs5Ozg5OTw8Nz4/Oz07Ozg4PDg5ODw3ODo7Ozo7Pzo9Ozc4PDo9PDc0Nzc2NzU3NDY2Ozc5Ojs6ODo5ODo7OTo8PzuJyba4vru3wcHBtKSkmZqkpsCyr7astLfG0MjIwce8vMXEz7+6yLm5wLm0w7ayvb6wvr+4qKSwtLGhqKmeiIaHgHhzbnBua2JeYmZmXV1eXV1dXF1fYGFiY2NiYV9cW1taWllYWFdXV1hYWFpeYmRkZWZmaGlrco2onZSUlJuYm6GWlpGcoaKonZudpaahpZygoJqYra6trrKgpaKtq6ahtLCxsayor7KnurOmtqGinpujoa2joam1qqKjpp2lpqOWmJ6XmZqdn5qXnZ2cnKyhq6ajpKatq7OzqrSwsqqyubSvqa+ysrO3s66prK6yuLC6trm9v7eysZSFeXVlXmVeW1lWU1pVS1xRTElFSEtJQj0/QUFAQToyNDUyNDk5ODk7OTo9PDY9Pzs8Pjs3Ozs3Nzc+Njo+Ozo4Oj07PD06Ozw6PTs4Nzk3NDY1NTQ2Nzg1Ojo4Ojk5PDg3Ojg5PkA6gci9t72/tr68v7OdpaOYpbHCtba9rbS4ws3Ix8DGt8HAyM+4wsW+tLu7tMC4tLu9sbe6taWhrLOqoKeklHyEhIB5cHJ0cWlmZGhlY1xcW1tdXVxbXmBhXl9fYF5cW1pcWllYVldXVlhYWFhWV2FkZWNkZWRkaGp2opyUlI+Ulpefl5mUmJ+eoZyWoaGoo5+eqZyamqqmr7Crm6Ojt6qgn66otqmmp62wo7ewpLefopuYmKqmoZqsuLCioaScoqCgk5WhlJWWm5iXlpeclZ+pnamjoZ2jqqqwrqi0q6qmrbKwpaqusrGwsK6vpqensq6xtK+8tLq3rqOUgXl1ZF5hVllXU1JUS01eTFBLR0dMTEU8QD48Qjw7NzY1MzQ5ODg5OTo5Pjo4Pj47PTw8Nz49Njc2PTc7PTs5Nzk7Ozw+OTk6Ozo4Njc2NTQ1MzEwNDU2Nzk6ODo5Ojo3Ojs5OT1AOnbAvLS5wrG+uLyunaeno6q7wL3Aua60uMLNycbDxL7GuMnMs8LDwq+9vbe9vre7vLW1t7Gioaqznp6Wm4aAfHhyam1ydHBpaGVkZmJcXFpZWlxcXF1eXVxbXF5cW1xZW1taWFZXV1ZXWFdXV1ZbY2NiYmNiY2RmaoGWk5WLkZSTm5mclpaboJyflaCfpqWkpqeenJ+ln6qvpp+io7aooKGiqLShpaekr6Wwray1nqCdlZSpoaKUrLGxnqKjnZ2Ym5OLoZSRk5eYkpeXmJadppumoaKZo6Wlq6SlsKelo6urraaorq+uq6iqqbOlpquvtLGuvLWxr6+gknp2cmRhXFpdWE5MUkhSYU1XUE9KTU9FQkQ/OT02OTo3NjQ1OTk7OTg4Nzs4OT0+Oz47PDY5Ojc7Njs3Ozs6ODU6Ozo7OzY8Ozg4NDY4NjMzMjEuLzI1NTY7Ojg7Nzg3Njw7Ojs7QTh4u7uxtb2wu7G3rJ6kp623u7zBxbqxubXFysvBxMfHyLfGxbTDwMesuLm/uL+9vrm4srSvoKCqrZaWf5GHf3VuZGJnaWhmaGpnam1gXVxbWlpaWlxdXFtcXl9cWllbWVlZW1dVWFdUVFdWU1RSVWBgX2BhX2BhY2RpgZOTiJCOlJKTnJSVlqOZoJacoKWhraWko6KjoZuqq6WZnqWxqaCgnaWrnqehnqytqaiuraKhopSXo5uckKqosJufop+el5mTip6RjZKTlZCYmJOboaKcpKChlaChpKabo6uloqSqpKuupa2yqaalpqa0pqmorbO1tLm6r6qsnotycG9gW1dWVlJHUU9IWlxPUklUS1NMRUdJQzg7Oz08ODY2Nzo5Ozo5NzY5Nzc6Ozo9PDw2Ozw4PjU5ODo4ODY1OTo8PDk3Pzw5Njc4NDUyMTIxLi4xNDI2Ojg2Ojg2OTg5ODk7OUA5e7W0rbS7sq+rsa2dp6evubmzwMi6tcCvxsnNu8LLzMi2yr6yv8XKrrO6xLi+w7+5ubC0r56jqKeUjn2LhHx1aWlpbGdqbG1ram1lXVxcW1tcWlhaXVtbXmBgXFhYWllYV1hXVFZWVVRVVVJTT1FZXVxdXV5eX19iZG2Oj4SRh5CRjpmTlJKcmqKcm6CnqKqoqqaopaOYpK6klJmlr6mfm5mboJ6vmZuqs5+lpp+jo6GUk5uWlpKoqayanJ+hoJqUkIyZjoyQjJKNlpWQnqGgo5ybopWboKKgmKKoo6Koq6Crr6Sut6WjpKKsraqoq66yt7K9tbOrr5iEc3NoW1hYUlVSRVhMUVtZTVVOUExQUUlOSUI8Pz9BPzw2NTc5OTw8OTg3Ojc5Ojs8PT47Nzs7Oj02Nzo7ODk3Njk4OTo2Oj05OTU3NzU3MTE0MS0rLzQzNDk4ODo6ODo6NzQ4PTg/OX6zrqiztq6pp6+tm6morLe2rLzKu7a/rMzHxrnCz8/HtMW8uLzEyrKuusK5v8G/uLussqmfoqailIp9gXd4b25obW5tcGhnaWdkXVpbW1tbXFtZWltcXF5fX1xYWFlYV1hXVlVUU1VWVVVUU05QUVlaWlpdXFxeX2Bkfo2Bi3+MkIqSjZeRl5mioJufqqmmrqqnr6OnmZ+soJWWpKinnZeQj5qerpaXp6qZn5yUpaGekpCTkpOVp6qkmpmZnZ2WjYyMlIaJjYOQi5KVkaCeoKOXlZ+VmqCinZObpaWnqKigsbCmsbynoKOstKuup7C0sLm1wLGtsauRfXFyYlZUVk5SSUdWUVJSTExYTUpMTlJHTUtBQ0ZEQz5ANzU4ODk7OTo3Ojo3PD06O0A+Ojk7OTo/NzU5Ojk4NzY5NTg3Nzk7ODU1NzY2NjEzMjAtKi4xMDI4Nzc7OTk7ODk0ODs4QDh/s62msbeqpqKwq52qp6mysaS2xrS5urPLxrq7wsvQyrK4ub2/wsWzsrS6r7e3v7i7qqynqqamoZCSf2tnbW5ybnFqcGtkZmdlXlpZWllaWlpbWlpaXFxdXFpYWFhZWVdYV1VVVFJTVVNWVVJOTk5SV1hZWVlZXFxdYWqAen92iY2HkIqXiZSUl5uZnaian6mlpKqdp5igpZuSj56impeWhYSSmqOPk6KclZaVh6KampOLjouQmqOmm5WVl5uQkoeUjoyBi42AkIqSkpKhmp+ilZSYmJWipZmMmKSmqKahn7SyqLK3oZ2it6yqraSysqa1u7Wrq7GjiXhybV1OUVFMT0NNTk5QS0ZOTkpKTk1RSU1KQUdMSEdDPTg1ODg4OTo7Njk6Njg7OTk+PDg6Pjk7Pzg3ODk6ODg2ODU3Njg4OTc0NTc3ODIwMzAxKyktLzEyNzc2Ojk5OTk4NDk4OEE3d7anpLawpKejqaWgqaWks6qissO1tbKzx8a4u8TKzca0rbu+trnBsa+rs5+psb60taejpaymppWKl3ZfYGdzcXZxaW5pZWhoal9YWFhYWFlZWVpaWVtbXFxZWFhXWVlYVVZSU1JQUVRRU1VRTU1LTFNXV1ZYWFlYW11hb3N2cYWIgoiAkYSOipSRk52gj5qboqGjmKSWoZuVjYeYmoxzjYJ9jZeWhZCZkJOOjnuZjpyMgoqAiZifop6Qk5iWhI6Ck35+dImOepCHk5CQnZqZmpCVkJ2OoqOOiZqgoaOjm6K0r6yvrJ+ZpbimprChsK6csLuqqa+qmYJ2cmJVTVJPUE1DU05MUU1CUFFISU5TTUhKSkNKTEZLSzw3NDk4ODg7OzY5Ozc6PDk6Ojs3OT85PkA3OTo8ODk3NjQ0NDU4NzQzMTI1ODUvMDEwMikoLC0xMTc2NDc4OTo6NjU6ODdBN3i3oqO0qKWmqKOmpaamprOnpbTBuK+0sMrFuLrBz8a+s627wq2vxa+qpKmToKm6sqqomaClpKGMh5JsV1dfaGdpZ2huY2ppZ2JcWFdYWFhZWVlZWVlaW1tbWVlZVldXV1NUUE5QTk9PUFNUUU1NSkhOU1NTVFVVV1lbXWlscm1/hXx0Tlhyj4KXho2cl4uTkJ+XnZWUlpSOlol/k4lfO1dve4uUiYCLkoyPhYZzioSWgXmCeoWUnZSDlo6Qj4OGfZJ4cm+FjX6JgZGNj5eZmJOKj4mch56Xh4iWnpqhoJenr6mtqKiel62zoqatmKyrmKe0oqmto5N+cm1fW05TUlZMRFRKUE1MRk5PSUZMUU1LT0pJTVBGSUk8NzU5OTk5OTo3Ojs6Pj44Oj09Njo/OD4/NTg5Ozc5Njc1MzMzNzYwLi0vMzQ0MTEwLy8oKSsrLTM4NTQ3Nzk8Ojc5Ozg2QTl5t6CjraGmpqqgp6mnoqmwqKe0wbmwtbDIw7i0vs/Aua+vtsOorMerpZ+ahJeetaihoJCfnZyYjIOIY1FNUlZaWlddXmJnY19ZV1dXWFhYWVpZWFlYWVpaWllYWFZXV1VTUk5MS0hHYlxNT1JNS0hGSE5RUU1QUlRWWFpgbXBpe4J0UEJBf5WRkX2JlIyEio2ajZWVipKIhZWGeIh/YEpRbniKkYR9hI2JhX9/bn5/lHd1dXeEjZlwUY2Iiod8fniTdmh3hoh+ioiVio2QkZaLhIqIlISajIGEkpuWnpyUpKOoqaWknpuwqqGkpJClqpahqZyipqiJdWxlXltIUVFSTUlVTVNJTEtPSUhHS05MTVRLUVFPRklDPDc2OTo4Ojs7ODo7OD4/OTk+PTg7PDY7OzQ3ODs2Nzc1MzQ0Njk2LzMvLjEyNTIyMS8sJykrKiw0ODMzOTc5Ojk5Ojo6Oj85d7aboqedn6Guoaeopaeor62qtry2uLezwry3qLrJubaoqba3q7O+qKCYkIGMlqybnJKGmZCSjIeAgF9NTE5OT0xNUVdbXFpYWlVVVlZWV1lZWFhZWFhZWVlaWFhWVldVU1BNSkVAQJtrc3NJTUtERERJTk9oWU5RU1RVWm6DdHd+amldVY+JlIl0f4eBfIWMkoGSmYuPe4aPgHV/eHNudXB0jY2BeX2KqoV5emh2e45wcm14gYuMknh6gHuAdnNykndndYSEhIR7lYmIioyKgH+Ei4x/lIN7gI+YlZyVkZ+dqZ6foJ2gqaWfnZiMp6SToJ+Wnp6kgHJnYFxcSlZPUkdLWFJPSk1NUkpKSk1QSExRTFJUTEVIQTw3Nzs5OT49Ojs8OThAPzo6Pj03PT03OTkzNzc5NTY3NTI1MjU3Mi8yLiwvLzIwMC8tKygoKS4xMjcyMTk4Nzk4Nzc1Ojw7N3aumKOhmJyftKmvqaWtrLCxqr20sru4tru1sqC3u7OrnZ6tqqq0sKOck5CWg5CfkpiGfpKEioN+fnhgS0lJSEdGSEhQVFRUV1dTVFVVVVZXV1dYWFhYWFhYWVlXV1VWVVNQS0Y+OTNOPH6eTUhKREA9QURqlH5MT1FRU1ZedYN9eWd3jZeYjo99Z3mBdniAiY98hJiSgXKHj3x2e29rfq18c5CKf3uGkoF9f3RmdnyGbG9oc3yJjIeAbHlxfXBtdY9xaXGAfo5wQ4uEgoOFf3d3eouFfYt6dX6Oko+YipKam6OWmZ2anZ6inZaNiqWbj56XjpaYj3ZubGViWldXVFFKU1VUT1BOUVZLTktOT0pRTkhOT0tFQzw7Nzk7Ojo/PTk8Ojk5Pz87ODw9Nzw5OTk5MjY2ODU2NjMzNjIxMjI0LiwsLS4uLTAtKyonJyouMTM2Mi84NzY5NjY1Mjc5OTV5ppegn5agpq+srquoqbCvsau8uKy7vrmzraibsaetnJCWnaaqpaKZm5GGk3uLko+RfHeGdoB8eHl4YEtGR0ZBQENESUxMTVFSUFFTVVRUVVZXV1dYV1hZWVlZWVlWVlRTUUtENzhmNzA/qGlOSEM9OzpEioV6WkpOUFFUWF1lcHJtiKeqwH51eWJ7eG58eYiQeXyLhW9tjJF4c3hqaoCCcpaRi4F9loBJk5huaHd+gmxpY2x5hZCShmtzbHxucnuGaW1wf3ONiYSGen1+e3ZvdHOFgnmBd3B8joyKlIOWl5iakJOVlpmXnpeMg4mfkYuSjYaQln5taG1ubldVV1RSUVlPUlVVU1hVTU5ITkpNTktDSE5HRT86ODk7OTk6Pjw5PDs6Oj0+Ojg6Ozk/ODY4NzI3NTc1NTQxNDQyLzAyNCorKiotListKigqKCcsLTEyNTAsNTU2NzQ4NUhBODk1d5mRm5manqWtsKKsqqi1r66stL+rvMK/pqKalaWYno6FjJaiopmZkpWNdI97goiOi3l1e3F6dHB0dmFPRUdEQDw+PkFGRkdLS0tNUFJSUlRUVFRWVldXWFlaWVlaV1ZUU1BMRTFAmjMganNDmW87PDk1PICChl9JTU9PUldaUllcYKeIYpppdHplfnBtf3qLiXaBiIZ0bJqRdHN7amudj015hZKJhI5nMXaGc2x+foN0ZmV0foSEhYBmaWx1a3F/fGdxcXtuk42Pe3N9fHFwbnVtgn53eXRpeYmCiImDlpOSkIuNkZSUj5eOgHmIl4iGioaAkId2ampuZ2RXUVpXWVlbTVBVVllZTklIRUpKSEdCQUZEQ0c9OTk4Ozk6OTw6OTs6OjpAPDk6PDk4Pjc4NzcxNTI0NDUzMzY0NTAzMS4qKispLCwrKykoKycpLCwyMjYsKzU3NzU0NzhpTzg7NW6SiJqRmZakqK6esp+muq6rsrDCsbvDx5uWj5WZi42GeoWRmZWOkY2RiHKIg3aJjop9dHVzdXRsdm5lVUZJRD88Ozk6P0BBRERFR0pMT1FRUVFSU1RVVlZYWlpZWFZVVFNQS0U4MC9cYLNHOVhQOzk0NDGWuotITE1PT1FWTEFJUUlir7OgcXx4bX1scoOBhYF6hIaGeXKglXR4gHN1lIc1cZ2onY6hoYSihXZwhnyHfHOMrY2JgGhmYmlucm1wgnVpb1h1cI6akndsf3t9bXFtcIB6c3ZtYnaEf4aAhZCRiouKkouRjIuPg3V4i4+AfoOAfo96cXBva2BbXF1bWVhgX1NOW1pZWExISkVKRz9DQUJHPkNEPTs5Nz07Ojs7OTo5OTs6Pzw4OD06ODs2NjY1MTEyMTM1MzQ3NTUzMS4vLCwrKSopKSoqKikoKikrLzNETTIxNjY2NDM8dlI3PTdikoGSh5aRnqSnnq+VpbWprbGuwbK7wcaXkIyUkIGJfW6CkZKJhIuIj4d2g4VtlomLfnh5enB6cntpbV5KUEc+QDc0NDg7Ozw9PkBCRUlMTExNTlBRUlVVVldYWVhWVVRTUExFPDUqnUtbQC1nSTk0Lz+Sg6muX0dMTU5QTDdDTVJTREqGdoB8fHZ+bXeIiHx9hYN/jH52opl5foaBhZmEm5xhhqqfnYqCkI56d4h+iYiOc4qXj4N7XGRxdHp7d4psZ2pieW+Fj4J6boF3dIR6cHR5d2tuaV13h32HfIiHj4CLk5eDjYWNhn1xhH+EfHV3e32JdW9yc2VnX1taXVNbZl5XUVVZXFZHSkpES0c/RkBEQz5BQT06OTc8Ozs9PDo6OTk7Oz0+Nzk+OTk4Njc1NDI0NDAwNDY0NTY1NC0sKSsoJycnJigoKSkoKCsrKy8wMFVxPDIzMzMxRX5XND05XI14in+UjJKdnZ+mkaCroLGor8CxusW6lo6RlIh6hXZrgIySg36LhI+NeYOBdKKFjH5+goBygoB8a3hrU1dMQEUyMTEyNjc2ODg6PD9CRUdGR0pLTU9QUVNUVVdWVlZUU1BNRkA6Mj0gI5ZjjFs1MzExaT9Hb0lGSUxNT1JMS1RdWVJKaYSIe4l5fHF8j4x6fImGfpeHdqGZiIePkpSljaypSIaur6+LgYCTioKLgYSRqIeAmJiKnHNsfIGGh32OaGdoeH5uhYaChXGEhUdrgHdyeXZobWtfdn2DiH+IhYx6lZ6ciouIkX97dYt2fHdtb3d+f3JycWtbXVxbY2NYZ2VcVVBQV1lQRExLRk5JQ0ZDQ0FAQ0E9OTc4Ojo6Ozs6ODg4Ojo/PjY7Pjc1ODU3NzMzNDQyMzY2NTY3Njg7REZMTU1MQzcrIiUnKykrKywvMDArbnUyMjQyMEyBXDU9PF6EdHx+ioWIkY+Wl5KXoZ2soaa4r7O9s5eNkouYi310cH+Jk399jIOTlX2GfoaliImAg4iGeYiLf3WGeF9jVktCNjAuLzIzMTIzNjY4Oj0/P0JFR0hKTE5RU1RVVFRWVVNRT0dDPzgwLCOHWz4/OTQuXZZwc6NVRklLTU5QV2BZcFpcXmqNk4eVgYSChZGTfoWJkYGalYKhoZeVm5qlrZOau7Gnu8fDqIuMoaWPlImBkHtyg52fkZx+doWFio+HkGlob4OAdIyGhItxhoJ3h4B7doV9bnZ1Z4CUj4aJiIeIh6GropaJjph/e4KJenpvZ2t4fnh9cWpjXVpaXWlcYWZfWk9MTlhSUUlQS0ROR0NLRENBRENBPDo4Nz08Ojw6ODg3Nzg6PT04PD02ODY1NjYyMzQ0NTU3Njg2NzxCQj88ODo+Q1FeZVxHMicmLCwtLS4xKD+MWy4zMTBPg180PztudXBneIN7gIyAgZCPi5qapJyhrKarr7CXkZGEoZSEeHd/jJR9f5KGk5Z/ioCSm46EgYKMi4KKjoSAin9scGpdQ0E0LS0vLy4vMDIyMzQ3Nzk7PT9CREhKT1FSU1JTVFRSUE9IREI8ODcvOUQ+PDw2My5sk5dNUEhJS0tLTlZgY39nZ211nZuPmpOTi42OmoiTj52LoKCSo6qlo6yTqLaiqMHDrseveLqUmnyMoZ6YhJKFgo+hn5OYkoSKhY+YkZZscHWJi4GVjI2Pdo+EcWyFgYqWkoOFiHKJoZaGk4qPj5altambjZWig4eThH5/a2prfH9/gHJgXGNeWWZqXGxrXlhLSE9TUU5NTEZJUERETkZCQ0VHQj45OTc9PDo7Ojk4Nzc2Nzs6Nj06Nzg1NDU2MzQ1NTY2NjY4NTU2MzEwLiosLCkoKS46UGFcQCwoLSsrMCwncog3MjQwT4RiM0A8dW5oWXCDcHWHcXaShn6XlpqUn5+cp6CqlpOYnmdlpJp+hJKSeoCRiZGSfYqFmZKRg4CAi42JhpGHhYiFeHh/Z01SPi8uLiwvLi0vMDAwMjEyNDU3Oz9DRk5QUlRQUVJTUU5QSUVEPjs8OkNGPz48NzUyPD9SNUhISExMTU5SXm+KfHOBfaCdm6imopmhl6KVnJ+onqmrn6isqaq1l6u/q7bIyLfJ0c++m6Bwaaupn4STkoWcoZqamaeRkYiVopqad3p+lJeRoZKWl4GUnnt2lZKrs4mNl6B9lJ6cjpOWmaSiprawnZGZqIiXkI6BiGxzc3x+em9nX1tgXmFmY2BnZ1xSRUtLUE9JSkxGRk1DSExGRkNCR0RAOjg1PDw4OTk5NzU2NTg+NzU9ODQ3NDU3NTQ1MzY5NTg6NjE2ODYzLzAuLSosLy4tJyMqO1hiQigqLDEtKEuXXjA2M1GFZjJBQGlhXlBxdWBufWJ3jn18lI6Oip+Sl56WnKqYnqpCRH2HiYeYjXiCjYuOjXuKho+QjoKDgImMioWThYOGiIGAh3dfYlA0NjAtMS8sLjAwLi8uLjAwMTU+QUFNUVJTUFJTVVNOU0xFRUA8Pj1HR0FBQDg2NjI8OTtGSEdJSU1PUVlthpB3lYujp6q1vbilrqysp6i0rLG3srKtu7GzvpyzxKy7ycu4xL+4paOwsqytqqOLlpiFpqagopeCppmNoqqopIeFk6OgoKqgpKmOnLGLlaOnt7uboKOwk6Odo56RpKKrr62ztaKVpauJmoqTipV6e36EfWZfZ1tkYV1jY15mZl9bT0RKSFRPRkhMRktIRUZIQUtGQ0ZGQTo4Nz08ODg6OTc0NjU4PDU0PDc2OjQ0NjQ0NzM5PDM4PDIwMjU1MS8xLi0qKi8sLSooKiYlNVhYLywwLCwwhIE4NzFQhWg1QUNbWFRMaWNYanBYeoV2gZSFiIKbg5KQjZLayJ2Wc1aXiI+InI98hoyPi4p6iIKHkY6DhYCLhYWIkoaChImGh4eHcW5hQEU2NDwyLzExMC0sKy0xLy00P0RBTVVRUlRVVVdVTVtQR0dEPD4+RkhDREA3Ozw1Qzs9RktJR0hST1BXgZOghK6js6qywcjEq7PFtqyzwLO4vra/tMG2u7ukuMaptsnHtr65tKijtK2xsZuZkpqfiKevqqSUdp+kl6GrsbOYlqmtqK61u7K6rK+1orGssbW8t7WutaCnp6Oom6mwrbK6uLinnLepjaWPkpOghnmBgnRYYGNVZWFhYl9gZl9bVEpERUxWUUlKSkRKSEVBQEBLREFNRjw4Njc7PDk3Ojk4NjU1NTcxMTw4ODk1NDY2NDk3Pj0zODkxLjAxMjExMzAsKiwuLCsrKyooJyopRVowMCovK2iSTzYwUodqNkFFV1FKTFtaUWNkV3p1cYKUfYWGk3aGfoCNe7+7o7yCtJSTjZuPhIiPk4mJeYeAjJOMh4WBjn+BiY+Gf4WIhYqHkXp5bl1WQEVOPDY6NDZBQjc2NC8vNkNIQ1FbT1FVV1VcV09fVUlLSkFAP0dLRkVDOz5AN0Q3P0JKSkVHV1RQXo+lraOxtMO2uMHMyra7xL2ztMG3uMK1v7C3dLG0prrFpLDGubGzsbSopLW2qrGgopabopGlsa2lraunpJigrLO6oqiyubW7vsy/xcW9vbPCt7q4v7e6t7mtrbGmsaqtvrC9u8LCrJm7qJWtj5iYqol+gXtpVmFgV2lkaWRWW2NZVlRJSEdMUUdESUpBSEQ+P0JCS0BATEM5OTY2OTo/Njo5OTY2MjQ2LzE5NTk5MzY0NjI3Oz0/NjoxLi81ODo5NjUwKigsLS0tLCwqKCgrKyhFUy8qMDBKj2s1MlCHbTY/RlFMQUxSV1RaVlp3anB/j4SBjoVuenN4iGK4oZqjiZWUlpOUk42Ql5KHh3uHgY2VioCEgYp6fIuHhn2KgoGLhJV9eHp1ZU9cZEdFTDpRZGFbXlNGPjtIUERaZFFRWVhaZ1pUYGFNU09FQT9JSkhFRkFAQz1FNkI+SEdLTVNaVF6Ur7i1urnJwLu9ysy7vcC7t7W8u7e+tbqyxmB1sqWxmp6rvqqlqKuqpKKytaGrp56Vlp6Yn66lp6aln6SToqews6iysry2wb3TycnTxsLFzMLKw8C+vb+7vLe0sLm3t8O6xr7DybCeuqqirI+lqLaJgX1xXmFgXFZhXmdlUlhhVlJWSUVGTUtAPkhEPUtCPUJAPUY9O0hANzk2Mzc5PjQ4OTo1NzA0NS8yNjM4OTM3NDUyNj84QD5HS1JUVFJQT1FSUUpBOS8sLCwqKygoLC0sL1A+KC40OIB9PDJLiHE5PkNLRUBJTVBSTFFdZ21scZCNhZBzbHNyc4jVwLWZoI2VmZqRjpeRlpaOhod9h4ONlot/g3+DeHuLhId7i3mBioKXf3R9emxlcHZZXVxQZWViYGVkXVtYV1xNZG1VUm1uX29fWGdlVVlUSkRBS0tIRkhISEhCSTlEP0hLVFRWXVpck7nAub23xsG7ucrLu7e6tri5s7i1ta62tplkdamerXBeoq2cmKGim6Seq6WUn5+QlI+WmJeon6WfnpqZg6SdrKSqsK23sLy41NDO1s/JzNLMz87Kx8C/wsq9wb3CwMXExsq/yc+0pLuxtbCbrLm9mn54alxfW1hdYFliYlFbYFNRS0NCRUZFPEBGPkJJQkBEPTpFPj1KPzQ3NTM1Oz00Njg5NzcwMjIvMjQxNjk3NzU1NTVEM0VMTT41MTAwMDY6NDc3QElPSjstJioqKC0uLyxATSsvNTRtiUkwSIl0Pz5CREBDREZLT0RSXFlpYG+XkpGUbmxvdHWHs6yhoZ+LmZyZjY2VkZuShYqKf4iHjJCMiXyBg3N7ioOFfIp0goqGlX9ze3lsbXV8aXNlaWxpZmpqaWBmaWhtWm10l62kvIeHZ1tvaF1aWVRISk5QSktRTFRRSExBSkdLUF9fYmdqYpe3x7C5s7u+trHEx7awubGwu6yzsaert6yNtqeenKeaTpuejY6glpGnmKWVipOTiJGJj5GRnZuhmJuVloeemaaarK+or6ezs9PU1NbRy8/T1M7Tz8zGw8rQv8rJy8nSyM3Nw9HSuK/EvMS6pre7xKKAbWJbW1xXX1dZZVlQXFdOUUNCSUVDSTtBRD5BSD8/QTc7RD5AST00NjY1NTs6Njg3NjU0LzEwMTQ2Mjc4ODc1MzY3QzVCOD8tMCwxMzQ5PTk3LC4sMTtGTD0pLCguMDAwN0s/LTQ2VIhXMESHd0M7Qj5FQkFDSk0/VVlTZldzkJCZg2hxb3l5g6CqnqaXjZubmIuNlZGajn2JjIWOioqLkIh8hIJwf4eBhnuHcoOSi49+cXl1bHB4f3J7bnhzbGmAcG1jaW1weWl3fX7Lv8Lfp21jeG9kW2FgSlBSVU5ZXlBdXU5QTlRRVVRcbm53g3KWrristKiwtqutvcGxq7WmpbinrK6hrLSkj7Gum5iYjJGUkYSPm4GNp5GciYOLhIqJhIqDk5WYl5SbkZuYmZmenquspKehrKzO0tXRzczS09PQ1NHOyMPU0cjO0tPT1s3S0cXS1sbBz8jIw6m/uNCdeGxkXGFcVV5RXVpPT1RQTkg+QUdCQ0Y8QUI/RkU+QD86PT09PEpBNDU0NjU8ODg4NjY0NDEyLzAzNTI2NzY4NTMzOz08RT1AMTErLzI0OT81OTAxMDIyLTJFTzMpLzMuMzI9TjI0OEN9XzJBhnREOj09ST5AQ0ZIPFZSTU9bdYeGi3dtd3B9foChnp6hi42Zk5OMjJOQloV5hZCQjouKiJGHf4J7cn6Agod6hXaFk5GJgHB3c2xzfHx3fHOCeHFrgHJyaW9xenlze77Lmn6MsYN2coV3aGFqXUNaWltXZmRYZWtUWF1cYGNdY3h7f4uBmaqkpKKgoainqrG5q6a0o6KtoqOuoqexn4mmm5WTkYqSjoiClIlrlaKNmYSBhn6Rg4OTl62LlY2VmY6FkpCdl6ewoqCgpKSox83Px8HL0NPR1NLO083G1tPN1NjW1tjV19XJ1NrNytjW0cqtxMPMinFtYl9eV1JYUltQSkdKSUpAOzo7RUNEPENEPkhDP0NCOzs5PDlHQzQ2NTQ0PDU2ODc1NDMyNTAvMjU0Njc0NTU0NDw+PUU/QTYyLy0xNjs9MDgxLzI1NC8tLjtSMDE3LzUzMkVEMjg+bmI1PYF0TTk5QEk8QUQ/QTtQTEZLWXCAdX5pc3lygomBnZWelIWLlomOioiOiI+AeIOUmYuNiIiLiX6DeHN7fYSHd4B7h5GXgYRveHBtdX92eH10hnx5bId2dW59doR1eXudtYw8QYrGpX6NfGplV0lDZWNmY2hqZG95W19maGtuaW6AhIiRjJ6foJ6Rl5ifpKSmsqSls6CipZ6hqaCisZyHn5KSk5GLjouGg4+EfpycjI2ChIV6lH6CqpWjjJKKmJKLfZeKmpGrs5iam6ecp73Dxbm2xc3R0NHPy9LLydTP0dXa19fY1NnYzdjbzsna2tLWv8zNtXZ1bWNcWFJVUFlVRkZKSUVFPTo3OkBBQjpHRUBFREJEQTs/Ozs3REM3NTY1NTswNjg5NDQzMzQxMDE0NTU4NzQ0NDQ5QD5EQkM8MzMuNkZUV09RSkFKRj8xKiguQlQyOTI1NC83Szc1PGBiQTxzdlY4N0FIOj9DPjw5UUVDSlRsbm9wYnFxc4aNfJeRnYt+h5KCiYaFioOIfXmFl5eJj4OHhod6hHlxenuEhnZ6ho6NnXqMcH1vcHp/cnuAcYSHgG6OenV3fXyCdX98h4mwdFmqwreNkoFwbmM9XmhycHFwbnh3gmVpb3J1eHJ7i4eOk5KblqCWiIyTm6Cbn6qfoa2copqan6afn6yZjJqMkZOOhX2Ih4OFi46gmZOIg4d+bZl5hJmGiJOMjpWMhnubiJOPrqqUlZeemKautbyorb3Gy8jJy8vPyMPRytTW2NfY19Xb19Pa29bQ2trR1sjVzJR3eWdmWllPUlNdSEJFSUk+QT49ODo9Pzs+SD1AQkFBREE+Pzo4N0RCNzU1NDc5LjU2NjQzNTUzMjMyMzY0NzU1MzQ1N0VCRENFQjU2PEZOU01bbmZjbnNrYFY+LDRMRzg2NTQzM0JGND1XX2hMdXheODs/Rjw8Qjw6OUQ/Q0dSa19tZGJma3aAiHGRkJuAeYCOfoOCgoV/hHx9hJiOh4t+hoeAd4J5bnt7h4J0epKejaF2j3aDdHWBfXSAhG+CkIJvkoR1fIGFenaHfIm4xqXDyriClpyPeHBlTmVjgnqBd4aikIt5eXd7hH98hHZtlJaUlY+YkYOJj5eal5emnJigl5+TkpejnZmrlpGRi46Sg4yFiYiBhpCRnpyZiYWLgYWXe4iJn5eQiY6Ki4J8oYiQi7yhmJOXmZyopqWtnqe1vsC/uMfJzc7FzcrR1tXU2dXX29TX2drb19va2djO28eFeXdlZ2NeUlZWVU1LRE5EOz09PDk6PD45PkE3Pj9APUA+PDk4NjdDQTY0NTU9ODA2NjU1NDc3NDU2MTM4NTQ1NjQ1NTdISD1ESkU3OTI1O0g+Ozo6N0hQXFpSVVhLOVQ+Ozk1MzI3STg9TllNSHh4ZDU9PkM9PEA6Njo+PkBFUV9ZZmFdW2h0enlsiY2Sd3Z6inx+gH+AfYV7foKRioWGeoWIe3V9dW19fYZ+dH+SnpGfg5J8hn14j355i4pvg5uAdJmGfYKKhXx+kXuQqY6Qw6C9jJyknH6KhH2JcoyLf3OmmpyZlIV7j5GJhGlHcaGknYyLkJKFiIuRk5WPnZuTlJGXjYyVn52UoZSSjo6QjH6Qj46LhIiSlpqfn4mMlJGdkIKMf6aZiIWOg4aEgKSGiou4mJ2RlJaip6CdnZ2jrra6tKu/xcrQyMfMz9PS0tjS1dfA19jZ29ja2tnZ19u3d3d2aWljVV5aU09OSERMQj09Pjk5Ozo5OTw9NkA+Pj09OTo7OzM3REA4Mzc4PjcwNjg4MzU3PDM3ODA0OTc2NzU1NTQ2RlA1RE5JODkzOEFLPTszQ0BJPDlEV048TVRITj85NjMzMz5DO1tYPjVZeXBaPDxBPD0+ODU4OT89RFJTUlheVVhmbW1taYGOinFzeIp7e399gHyIe317i4eDfnWEhnlzenRtgX6EfXeGm6GbnpSSgIyHf5iHgJySboiphXqgi3yRj4OJhJx+mpGJjaOin5Ckr6CLkYuGi4GShldyrYufrJyPhJickJCOXIOikYKNn5OVjIeIjJKTjJSVlZCMj4qIlpudj5WWkYuTlIaAi4mSjYqKnZeZo6KGk52VoIqKiI6ckIOIj4CDh4WkhYuQs5ickpSXoaGemZKbnaexuKykvMHHzcfGz8zPzM/Xz9HUrtbV2NrZ2trX1tnZnm57c2VlW1tWUlVXQ0BJRD8/Pjo0OTo7Nzo7OjM8PD89Pjc7OToxOkc9OjI3PUA1MDY3NzI1NT82NTs1NTg1ODo1NzczNUhSN0dPSzk5ND1FSkI+MUZDTEE5ODpHWEA1SFdJNjYyMjM6RUNlWD8mX3lpX3o+Pjk8Ozk4OjxAO0JRS0tTWVBUY2J4bGJ+koNvbXeLeHp/e4F9hnx7doaFgHNwhYJ7dnd2dISDhX1/kqain6ail4qdkJSXioqnl3KKso2Ep5KEmZSFmoyjlqCYk4mbnqKTqbCgkZWQjo6IlYtujbeEmsTIsp2ipZudmJaRspBkpM3IlY6Gh4mQko6Nk5SKhYqKhpaam4+QlJOHlZiEf4+LmYiOkKqXl6SjiJmelpqJj4aXmIqFj42Cf4aPpYiNk6mal5OXmaGYn5mTnJqisrSlo7zBvsfFxcnIycLK08zN1KjS0dbW1tja1NPazoFxfWZhXFxdTklUWUFCR0Q7QT44Mzc7PDo4PTY0Ojo8OjcyPzk5MjlJOj42N0JDMzI6OTYyNjQ+PTQ7PjY5NDk7NTc5NDRLUTxKUUs5QTdCR0lANjRKRUxGPjs4OEVUQTc+XDg2MjE0OjtFYFhBRmF0aExjWj41Ozo6NTs6PTpFTUZIUldTUkJjgkd2gY99fG1+iHh6fnuCgoN/dnaAg3xtbot/enx4eHyEh4p+i6Ozp6Oqs6KXp5+lpJaVrqKDkbiVkbOajaGhjKWbsKOknZiRp5aomayvpJiVlpWQi5iZl6HAjqPJuauco6atmZKbnbKdhYWoopyYhYmJjpWNi5OPiIGGh4mTmJWMi5SThpWYhoSRkJx1kZiylpekoYidmpOQipCKl5uJi5aOh32MmJ6JkJCcmpmTmJiflKCdlJ6boLGuoqS3vrTFx8S9w8O/xs3KydKmzs3T0tHW2NPQ2LpxeHRbX1RfVU9ISk5EQkNFNT46Nzc6Pzw8Nz00MzY2OTc3ND01OzU8TDw+OzxCQTc1PDs0Mjc3P0A2P0A3ODQ5ODc7PDU1T01EUFJMOEA9RUFHQTU6SkVORUQ6NkFAQlM+OURPMzIzNTc1PXZcPFJcdGlaTV1TPD04ODU2Nz06SkZER05bXFlKZmA7SISLenpuhYZ6fIR5gYaBfnB4fH59b3KNen6CfHiGi4mGhJKnu6yosr2vpa2zs6ijobCsipq1naK4pZWtpJeprbinpaOfmqmXqaOvsKqamZyUlZGXoJiau7uuyqFqtrirsJSZn6Osk5e9o16qsoOKio2Uh5B8jo59g4aOj5SViIiTloyQlo2LjZeYk52ZtJeVq52LnJSSjpGSjJmbipKekIuJlZ+hjZSNmJqdkpyYnpShoJScnaWvqKGls7irwsjEtbq9u8XHx8LRoMbJzc3F19bRy9Shb3lnW1lSXVBPRUM+PENBQjg/ODg1P0c9PDY8MzUzNDU0NTRCMzk6Qk06QjtBSEI7OkA8NzQ2PEI5P0BCODc0Ojo2Pjw0N1RLQ1VRSjc8OklBREA0QUpITkJBPzZEQTxKTkQvVD0yNTQ6RUpcWEpaUW1ncHBEaWBLSTY3NTc6PkpAQ0lQZEdiYGJwSj+Lin+Bc4aHfYKJdYOKgn9tfH19f3B3h3eOgod7jY+MhoyZqsLAr73Gu7O0wLy0rauztoyos62tvaubu6Sorbm4q6emoqKkoqmvsrGrnZykmJuYl56ipqWSpLqvqcC8ra2yuaWlqH6IhpytvLCDjIyLkIOOg5GPeoGHkI2NnImIj5eNi5WWlJGal52omrGakaycjpqPko6VkJCWl46RoJGJlJukrJSWj5ScnZOhnZuYoKGUmp6npqSipLCzp8HGw6+wurbFxMK/zabHxMfDvNXRzcXKh3JxYFpYXlpMSkJLQEZHPkE/Qjs6NT5BPT01PDY+MzMzMjQyQTE3QEJOPkdAQ05DQT1DPTs4NkNDNUJJQjo4Nzg7NUI+NzlWS0RXT0Y4PTRLQEM+NEVLSE4+QUE2QkI/QlNFNThQMTQ1Ozw4O0Q+OUxqal07V1JkS2daVU83OUdEP0NGXGVHYGlnWl1ck4yMiHuHjIeDjHWGkYqBb357gX9xfoF7lXqSlJSYkJOVp7PGyb/CzMLDuce8u6+rubuYs7e6ssCupcGkq7C8vauuq6OjnqerrrSwqpygqpyhm5afsLWni6O6u7bBvKypnLKlpKmUhY6pxMOkgouPh4iEhpWUjXqEjZGPkaKMjJSRjomXn5iTmZWYpqCunYyqnI6Wj5KRlZWNkJWRj6GUhpefoLKelJqUn6CYpJ+aoJuglJiepaOmpqSvrqXAxMOuqLe2ycO+ts+yxL/EvLPRycjCtXN3a1tWWmhRTEhDTEtLSkFBPUNEPDVBRDs7Mz04QjMzMjI2MkEwNUlFTj5JQEhSQEg+Q0A7Pj1GQTVBVUA7OTk4PDdFPjg+VkpDV09HOD80TEBCOzVKS0NMP0I/PEJGPUFITDkrRzwzNjc0NjRBPzdPYU9hRS89PjZrbGpgQDpIPj9FQmVZTmVcZlRjapmNl4qMiJOQhol5h5SQgXKAfI1/eIeCgpB6jqGWqJqamLq+x8jJwdLJysLNvcKzrby+qLq/vbvDt6zCqayzvL6qsKqkpaSsrrOttrWgn6+fpaKYo7O9qZuovcGktrewrJOxraytl4eaqaelkYKMk6WViYF2ipF6hY2SkJ6fk4+Ui4+NlKOZlpyUlKOeqp+RpZqMj4+PlZaIfI+VkpKjmpWfoZy1pZCel6WjoqWenaaYnpaXm6SjqaeisqyovMDEr6Wyt8zAua/Es7u+writwsPCwJhreGBXVlpaSktNSkZEREhDQkFETDo0REg5OzQ8N0UuMTIzNTJCMjVTSE48SkJKUUVLQ0RFOkVMQjw3RVY9Oz04OT88ST86RVVJQVdRRzdBOks6Qjc5Sk1CSUBDPjxERzxCQ089MjBIMzY2MTcwPUI6PWpqSks1UVMzU3BwZE47RD1ARj5qSF9YYVpkZFaej52Ol46ekomKf4qgk4R4hX+Vf3+QiIqQgJahma6mpJjCvcfDx8XTzc7Ny7zCt7C5vLS9y7zDwba3vK2zwLq8rq+ooKmotq2uqbK3m56toqehnqu3uKqlsL/Fsb25tKiqtbSur5eWpayooJGOkrLFp5WOfZKVfYiSmZCqmZiTk4+SlZOlnpKdmZSho6KcmJ+Yi4yPj56IWpCWl5KXpZllmKOfs6WWoZasrKqnm56ml5iWmJWgpKiln7arqrq7w7Sls7XLwLiqtqyyuriuqLi6vbiCam1ZVlNUTUVKUk5LP0FIRURISEg5NUZNOz44PUBKLjMyMDI1QzU1T1ZOPExGS1JMT0hHST5JUT86OElTOzs/Nzk+RExCQEhTS0BXUEY6QT9HNkE3O0hNQ0U7Qz00RkU6QkFCRzkvOkEzNjAzPkdEOTQ9dGRNRztFKzpmfGdWOz1AQkZCcEVpSVJlYkxGpZScl6KXqZaNkIOHppOIgoeCnIODlZCQlI+aop+vvq+hxrzFxMbGzs7O0sq+u7axuru7vs+1w724ubeysbWzuLOrppyrrLmqqaevr5ijr6SnpKW1wLCrrLS/w7rAurSoubW5s6+Wpa2urqSLk5WhjXTBmn2XmYSPlpqMsZWbmpWSk5mZpaOUoJuXmqmcnKGgmYqNkJacYEqWnJqVmqWWVZewn6+cnqSUr66spZqgpZSTmZiOnKCnopm0qaqzvLu7qrCyx7+5pqyrrbGxo6GxsrSkb2xkW1lOT0tFT1BRUTtISklHSUNDPjpLVT9BOj1FTTA3NTQ0OkI0NE1XTzxKS09VTlFKUEhISk9CPD5NUjs+PTg6PENSPkRIUklCV05JQEJBRjM+NThKS0NBPUM7NEVBOkE/PkhANSpCNTIsPmNdZzozNXRkZUBSNyYjM31oVzs6QkNAPVFFV1NzYldGSKqXmaCiqK+ZkZiHi6iWjoiThZ+HhJ2Xjp2hm6Oktci1qca6wsPHysnIzM3Gvruzrrm5wcHMtce6wbm1urCvr7O1p6SbqrS1qqmmrayapK6lpKisur+oq7a3vsK/vrm0s8Syub2so6+1rLmmiJuXppt2v5+EmZ2Ok5mai66XoZyblpWbn6GpnqefmZqqmaGnnpiQjZGdg252kqKalZ2inpCusqKqlKiql6qupKSfpaiSkpmciJScop2Wsaepq7q2vbOyrb65t6Cjp6ilp5ybrKmpjGFkYF5RSkxGSE1JVkw9TUVOS0xCQ0Q8UVY9QUFCRE8xOD03Nz9CNzVVWE4/SE5RWVNQUVVLUUpKRUFFTVE/Pz04PTtHUjxFRFFCR1lNS0FIREU6OjM5S0lCPkNCOTlDPjxAPjs7RzctMj4tMYJoTnpcLzBraGA8PUJCODZ6Zlc7Oj0uLVJgTVVIf2VeSEWrlZyhn7uvmZSfjJOrm5GSk4mrjYein4ykrZSjo7bGvrTAusLCx8jFws3Iwb65sq+4tMDCyrXFssG8tLqqqa2tsKOjmKq0u6appquqnamvp6Oqq768qK29tLi+x7y3trjBsr7BtKm1t6u+pY+imJKin7yfiZqgmZeeno+3n6mcpaKbnKGaqKWzoZudppyoqp6ZlY+Um4uXiYykopSdop6hta+lpJOvq5mrqp2dpKOokZWVn4OPnp6blamkoaG0tLq1rai1srOenKKlmpeVmKqhnnZfW19dSkhFRk1RSU1FRkdDU0xKQkVHQVZSREg9QUdRMTtCNzpCRjc5XFlLQUxQVFVTTVdSTlVKREBKSk5POUNANT08TlFDPz9QP0VaTUpBS0RHQDUzPUlHPz1FQTk3QTs8QDw8M0A8Lyc7KkiRQjpTSjAsW29XNzE8Kh1CgGRUNDktMTlnXEZDQ5xwYkdFp5ekn57DrZuXpZiaqZyWm5uPqpaVp6aVrayZoqu2xMK8vrfBwsDHw7/Nxru9ubKwuLO/wsi1v7C8tri2pqSrrK2hoZqqqsWipKmrpp6sr6uiqai/uKetvrG4tse2tbm4wLK/wre1s7SvvqOXo5aUm5SuoJCho6Wjo5+QvaSpnqirnZ2gm6afvaKZo5+iqauhnZaNlZ6TnoePhI2Tn6SgnrWspZuVsaeZrqaemamdn42YlJ6EjaCam5OlpJqYq7G1saulqq2snJigoJKOkJWonpRnYlhgXU5IR0pOS0hFRElAPlFJQTxHSUhbUk9LPUhPVTRCRjk+SEc1Q2FbS0NOUlVXVlFYVFJVSUA4UlFQTTpHQTRDSFFTSUM7Qz5HVktDQE8+SzwwNjtHRj47RkE0NkA5Oj85OzE1RDAtLC9Ndlw0S1o1LE1uVzwtPSkeI3piUTVDS1E6blJGPEt4ZWJWTKKao5yexayhn6yenq6gkqOflqWfpqqsl7axo6qztsTEvb+1v8K7yMK+yse1uLW0sLOzt8HFtr6xuLW4tZ+mrKqsnZ2epaTBpJ+qraCkqa2voqaovbWlsb25trbEsrS4ur+zxMG4uK6ztbWjnaWVkZShrqCZop6oqKujmsKtqZ6srZubnpmmoL6hnaSYq6uspqKZjZqfkp+Jjld/lp+moaC4qqaTmLWjn7Ggn5qulp6OmJOdgY6fl5WOoqOWkKausqupoaKlpZWVnZiLj5GSpJ6JYGNZY2BLSEpKTkVFQUZKPj1KQjk5SktOXVFRST1MVlw5Rkk9RE1JOEhiXExDTFBTWVlWV09aXklBPVdRSUs/SD81SE1YU0hBOkBBRFBIPz5RPks3MDk5RkU7OEc/LjY+Nzg+NzcvMT85MSUxUVVtW0pPMTA9Z1dEMTc9LSt3YFM2U1prV3JHRTY9dWVcS06en6GZnsOopaK0op2yqJOrpaCjn62prJ27sKistrHIxcHCssLDvcbDvMTJvK+wtq2wtK+/xLS5sbC6tKyZqLCpqpqdpaGowaybrLCcqqOusamkqL22p7e7vq+3xK20s8PAs8e0u7estLatqqKmlpWUpKyin5+aqKuwr6+7sqagqaiamZiToqS5oKGkk6+vrKWnn5KhnpWej5CNlZ6aop6ntKamjJizm6Oump2brZCek5WTmX+RoZaPjZ+hk4umrLClpqGcoJ6SkpqThYuRjZyef2BlWmdlSklMSlJCQ0BJRzs7Rz85OU9NVV5SU0o+T15dPUhQQkxMSTlNY1xMRUxSVFlbU1VPXGJIQT9aUUFIQUtCN0ZFTEtNPztCSEROQj07TkBBMy85N0NCOTdGOys2PDQ2PDM1LS80QDErJ1Z0U2VPPzEwNGJbTTIzPjA8dl1eP1tUXmVxQDg7SJZ3ZUE0n6OgnKDDqaSqs6GktKqWs6ynoqSyrK6pu7GtsLW0xsDEw7XAxL3JxLW/yMK0q7Wor7isv8Ozt66st7qlmauyq6qYn6aXrbu0m6ewm62grrSyp6u5s6i6tLiyucCqt7LEvrXGqL+vrbe1qaesoZeXkaaloqKYmKWvuK6ytbagn6ikmpWVk6Sgt6KkpZavsbKnqqain5uam5aXqJ+gmKGer7KipoyXrpikqpeZnqSQmo2Tl5mFlZ6UjI+cnZOLqamqoaegmZ6VjI6Zj4GFlYiUn3hiaFxqak1QTU5UPUNBTkM6Okk/NzdST11eUlZRQVdgXEJKU0hWS0g6VGRcTkZPTltXW1JQUVhdR0FCW1BCRz5OQzlIR0hPUD8/Q0lCTEI8MklBOTQxNzdCPjs3RTcrNjkxNDgwMi0vLjw2LSNCcWdzazIzLzFbYlozMzgwNnBbYkgwNUlwaFZDV0aMeWZDO6SknaKmv6eor7ChqbWrnbqxq6OqtLaxsLm3sLe4uMS9w8e9vMTBxsC4wMXAuqm2pKy7rMDCt7eqrLK7opWtsa2ylqWnkaq5qZ+msJ2roLC0s6qptratvK2zs7m3rLiww7u+v6bDq7C3rqmrq6eemJmroaKhkZehsa+zrLC5mpypoJmWkpemobeppaOisLG0q7OorJ+boKCbnaWdopedo7Owmp+Pk6Wan6ialKKdlJeJk5aSlZack4iQmpmUjqiopp+jm5ebk4aOmIt9jJaFjppqaGxgbG5XUFFaVEFDRFRAOztIQTc6WFBkXlBWV0VZX11NTFJOXktKPlpjXk5IUE9cVVlQS1RXWkk/RFhQREY/TkA9SUdHUVBCPURGQk0/OjFEPzc3NTQ3Pz05NUU0Kzc1LzI1MS4tLiwxPSonKz1ccD0+MS4wZFpkQDE2NDdnWWBGKD84bH1nW1Y7iXtjQz2on52iqr2iq7Cro7G4qqW2tKygrbW9rrO4u7q9trbAwr/IxLnEwsDAuMS9wbevtaert7G7vr+0qa6xt5+Xq66orpemqI6nu5+krLOerKKxsLOsqra0tb6usLG1rLC1ssG7xberva+xuKytqqOxpp6lqp+kmJCZn7Oqs6uqs5qdp5ualY6gpqW0rqehra2usae0rbKqpJyfqKOelaKZm6i1qZeZkZKemZ2fnZCqnZaXhJSWip2ZnJOKjZaXmpempaKgnZaVl5N/j5SFe46SgoyWZWxyZ29xXkZZZlZEQ01YRFo5SEI2Pl1RaFxOWV1HW15dTk1SWGRKSkNcYl9QTE1OWFdYUEpWVldMPUVVSkVEQU1AQUZISFFQQTtGREZLPTg3Qj02ODcxOT48NjVEMCs4MC8wNS8qLC8tKj0sLCUyKyo1SzEvJ19fYFUxNTA9YFZeOClDM1lUXGdLNox6ZkxApJqhpKy2pa2qpq+ut6qvtbuop7G3xbext73BwrW0usW+zMa5wsC6vrnDt8C5srSrqbq2u7m+tKmtsLWYmKesqqybq6uPq76erK6yo6ufsK2zrq62srm4qq6vsqi1r7S8vcqzqra1sbSwr6iis6CbqK2gppaWmpqyoq2gpa+XoaSampKOo6aos6mhprOsqralr7G1r6SZna2nmpifmpmrt6KXk5GOl5yhl5aUq56akn+Sl4ydnJmWkImUkp6ZpaKhoJiWkpOVeYqPhXuMioOKkmpteG11e2FFYGpZSUhaWj17SkZENkFiVGlbTVxhSltdWlJSUmJhTEtFXmBgUUxJUFdWVU9HV1ZVTjpJVklIP0NLP0VESEhRTkE/SEhIRTw3PT46NzU2MDk/ODY2QiwtOCwvMDQsKCwvLSo3NikoOS4kOks1LiJUYFVgLzUoQ19RXC4qQi9KR1BbSDNjWVVLRJmXobGosaqtpqSvrrapt7W6pKy0t8m7tLq6v7+0s7fDwMzIvMO8t72/v7e/vLG9rae6ube2wraqrLG3lJemrquoo7CqlK+7pK2xs6eoo7K0sbKxtbG4s6muq7Knt6+2tMTGtqm2tqywraqppLagoKexoaSUnJmVsZ6nnKCqjqmjnpyWmKampbino7K1rKiyp66xtqylmaCsqJucnpyUqbiclI6OipibopePmKWgnJSCkZWPnZuXlpWIlo+Xmqeco6CSlpGQlXWEkId7hYGEjIttcHd0e35cS2VsXEtOY1w/YntHSThHZ1dmXExeYk1YWVdUV1RpXU9PSGFdX1BKSFFWVVJLSFdVVk04TVpORUBGSz9IQkNLU00/P0xPSEA7Oj47NjswNDE8PTQ1OD8pMDcpMS4yKSksLC0rLTkkMDQyJTlCNy4jQU5IZjI3J0diTFYlLUItPUVMUTwzcmtJQ0OQmaWupa2vq6ilsbO0q7eyt6CrtbnJua7Au8K4s7G1wsPOxcDBvbS9v7+6vryyxKepubC2tr+8rquzspygp7GtpqWvpZ6ytayrsbKtqqm0u6y1s7WttKyqrKitqbmtsrHIwLilurCpra2lqa6wpqWjr6SpnJ6cm6+ao6Oio5GsnqOgoKKqpqa5pKy1tqWrrKitr7auo56jqaqboJqakqSzmY6JjYeQoaCUjJScn5KRg42Skp2amJWTh5eSlZmnm5+ejJKRjZB2fY6FfHx8h4mIcHNxfXx9XFNkbl5OWWZcRkSWW0c7Tm1YYltMYGJOVldWV1RZZ11RUkxjWltUS0dPVFNOR0lWU1xOO1BeSUJESEpBRT8/S1NPPjpOTUM8PD45OjU9KzMyPTYyNDk6KDQ1KS8sMSgpKywtKiY1Ki8mMCkzODoxJiozQmM7NipIZUhKKztIPzNCSFMsPpBrO0dIj5yqq6KqsaSppbO0sbW1srKiq669zLquwLrHsbSttMLC0cXGvsCyvcDCvL+3u8SnrLess7i7wK+rsa2go6etqqiksKSrsqqvrLCvsK6rs7ynt7GyqbOrrKalo626rKqxw7q2rbupqKitqqmzpamko66qqKKfnaStlaWemJ6ZrJ2iqKqiraakrau4srKhqaKgrK+xrJ6gp6ipmaSZmY+gp5iGhI6Ki56fjoqMlZuOjYSGj5SfnJWXlIaWk5OXpJucnIuTkY2Jfn6HhXx3foeFhnNycYh1a19ZYG5jUXNxXEs7hHxGP1d0WGFaTmNbTlZWVVdRXGJfU09OZ1hXV0tHTE5SSEVJVlJdYzxQXUQ8RkhIQkc/PUpQTDo+T0o9OT89Mjo3OyoyNT4xMDQ4NSg1LyosLjMwOyksLCclMjM0JCwyLTg2MCkoMTxdSjAuSmdERjg8QjA1RUtYMUCVWj5MRZWYraiiq7Ocqqqwtq25tq+rpquqvcm7sL23wq+xrLPEw87Pw7+/tMDCw7rAs8jDq663rbK4v76yra2rpKeqsKmnqLGmtK+qsK6tsrG0rLS8pLizrayuqKygo56wt6uqrbu3pbe2pKqnrKyrrqGpp6axsqSnpqKirJeqoZWboKaepKKrpa2jn6exuK6uo6aim6qrrqmdoqWkpJmgmpaPmJyTgoKPiIWcn4uKjouYjY+KgouXo5qRkJqMk5KRk6KZm5mKj4uLfIaBgYN6dICEgX1zdoujh3hqXmBuZldlh2NOP2eTTEVieVdiWVJlVE1WVVZUT1xdYVVLTWhWVldJSkhJT0JHSVNRWW9BTVhAOkpHRkVHPj5FUUg4Q0tFODdDNzI6OjoqMzk/Li80NjMpNCsqLCsuIzQuLSsmKCs3OSomNis8LTIsJjA2V1ouMEpnQUE8PEIrOkpPXjREhj5IRkSXkrClo6uxmKuqrbastrKspqyqqbzAwLi4s7u1prKvxMnL0r/Bu7nAv8K5wbnAxK2xtbGzur+9srCuraurp7aqpq2vqrmwqLGyrrKtt6q3t6e0t6uspKqrnKOes7OoqKS0taC3rqCqqKuprKigq6ypubapqqmqo6qgrZySqqGdoKSipqOqnp2ntK+opqqio5ilp6eqnKOko6CamKCRjo+YjX+HjIeDnZ2GhIqKjY2Pi4KFlKKajYyZkJGRj5KflpiWjIuEf3SHgX5/eHSDf3p3foGInY9vcWdncXhcYXOIa09emVZIbXhVZFZRY09NVVRVUE9YW2JVSFBpVFZTR1BZVUk+SUhPUVB4TE1WPTxLRD9AQTxAQ1VDOUFLPTU7RTEzOzo3KjQ6PSstMzQxKjgqKisqLCkpKC8qJiklMzssJDIpMjAyMSUvMlFiMDI/Zj1OWD5DLD5MVF8vSmk1T0Q7lo6xoaarrpqspa2wtLWvq6awqqm6vrvAsK65rqG3r8nHyNHAvr27vMK9usPAvr+usrKxtby6wbGxsquzqKS0qKWts7O5sKOut7Kwsruruq+qrrasqp6qrJ+joLatqKGfr7OitaqeqKeqo6qhoqytqL2vrK6toqiooKyZkLCimKKgp6iep5uZqrGqo6CtoqGUo6Ojp5iaqaWYmJiejoqHlIh9jYaEhKSWhIGBi4aOjJCDg5OgloiQnJCTkI2RnJSXjoqGhnh0gX98dXh5gHp0c3lof4akdWleZGuBdGeIjH1TWHBeSnhzU2VTUV5NTVJaZk5MVllkWEZTaVJRP0NOUWFROklITFNJcVFMUzs8ST87PD07QEBXPDw/SDczQ0IxNTo5My01OjopLTMxLS01KSgrLSw0MiMyKScsJS47LiYxLjAtMTQlLDBMZzo0OF89YWQ/RjFDUFtbKkhNOVVBNJCPsqGkpqykp6Stp7WzsaulsaiquL7AvK+nuaqmr7DJx8jRw7y/vrm+v7zJu8G4sLC0sbq7t8Cys7usuKyitKenrLK2ubOoqL22rra+sL2nray1rK2cqa+koKWtq6ecnquzpbSom6unqaOpnaSpqKm9rLSvrp2qpKCunJuzo5WknKWln6Sbm6mrpp+bqqKbk5yhpZ6Yl6mpkpialJCKgo+Ffo+DgIiej4V+fYuGkI2PhH+TmpOFkqGMlJGLkZqRlYaJfn9ye3p+fGh4fHp1cHB8Z4R4hIhkYWdicoV6bWd4XV1VQFd6bVRhUFJYS0xOcnVdSFpbZ1lFVWZQRD5KTkRDQTlIR0tTP2phSlE4PUg8PDw+Ojw/VDY6P0M0NUg+Mjs1OTAyNzw1KC41Ly0xMScvPktIMCUaOTAlLCwwOS8sLCs2JzE3Iy0wR2pJMTRYPWZjQUo3R1NgVSo9OURXPiqPlLKZoKCppqWhq6W4s7OmqbGnrbjBvbWvoritqKiwwsnJzMG2vcC1t7+5yLXDtbOytbK8t7m9ta25tr+tobOnq6uwtbi1rJ++vaqzwbS8oa+ztaqrn62wo5ylqKqjnpulsaewoJ+rqaihqZykqKGtu6iusa6gq6Okrp6fraaXn5uho5ygnJqkqqObm6WklpeVn6KWm5emrIyekZGRi4KKgICOgXualI2Ie36LhY6Ni4qDkpiRhpOiiZKSh5CZj5OAiHx5bH52eXhje3txcHByd2iAc2qDZ2VnYG1zjWxhaW9gbz5aeGtVXk9RUUpJTVRZV01dXmxXRFhgT15QSE1ERjs3SEVLTzxyaEtLOUFFOzs9PTs7PUo0OUI8MztHPDQ/MTgtNjg7MigwOS8sNC8uPS0qSz4qHTQ5JicuMzQuMCsvNCYsOiQ0MUJoWTEzUz1lX0RMNktWZE8qOzJOWD0jk5mtmqCYp6Sjn6ikuLCvpK+wqqu4wrqzrZ+4r6uotLrIy8i/t8K+sLS9t8S2w7GuubKzv7S6vbepubi9q6S0qKmqsa66saucvL2lsMG1tqKvt7Wmp6exs6CepKWnoaWZn6yoqZ6gqq+noKaYo6mgsbmfo7GvoayhrKScpqepmpqbn6SVnZ2bnqqnmJygqZOZlJiek5mWoaqRmoiOj4Z9h3+Cjn18oYyNiHiCi4SJi4uFh5Kaj4iVnoiRlYKMl4yRfIV7c3B9cXR0YHl4aW5wcG5ofXFje21pZWNfZYV+X1pza3JLS39oWFpOUExKSFBSUElOXF9uU0RYWlJoT0hLRUY1NkhCTEk1WmVKQDZFQjk6Pj0+OjpDNTk+OjNARjwyQDIzLjo7ODMmMjwwLDg1QiopLUMqLDQ7Tk5AOzczLS4rLTcqKjwlNTM9ZmQyNE0/ZV1GTz1SWmdIKj4wWFY1KJeep5qdlqygoKGkorirsqW0tKqpucS1s62ft62urbC1xsjBt7/CubG0vLa/u76vq72ws76xvMK4qbu6t6eotamoq7Gts7Gom763pq28t7KfsbiwqKWnr7GboaSgpKShl5yvp6Gfo6ivoaChk6Skorewoaaxq5+so6+YnKqlqZ6Xmp6lk5udm56nrJudnaaXlpiUnY6Tl6KoopCIi4+FeoR+hIt6jpaJjYZ4gYeDiIuNhY2TmI2OlpiKj5d+hpeLj3mBenByd29vdF95d2RsbGtpaIJtZXJra2VoWmJzf15abHZqWkh9XVtYT09KSEhSVUYyOl9ebFBEWFZZZUxISkVFMDdGP0tCNklKSDs2Rjk0OT49PDk4QDg7ODo3QEk+ODw0LTM8PDc1KDU+MSw7QTEoKzY8IzhSPSoxMTM+RDUsLSc0Mis7KzEzOWNsODRHQmdbSFRDVF1oRS47MV9ULDKWo6KYlZ2pnqaho6G4qq+hu7mmrL3Es6+uorWvra2vtMTEvbO/urexs7m4uri6rq2/s7S4r7/BuKy9urSmorOrqKqzq66yo53Ctqapt7ern7K7qaalqK+rmaKnnKWmlJihs6aZnqWqqZyhoJSln6S5qKSnraaepaGok5+poqGhmZudoZKbnZego6ycm5qilpOVlpuOk5Ojp6SPiIqOhnmEfIWGfZyNiYqGeICDh4eHkYWVk5KMkJWTjY6Ue4KXjop3fntsdXJtbHNieXVoZ2lnZW6EZ2doZGZoal9mYmlmWmZ7Y2FSc1RbW1NMSUdJT1NAIStqXmpMQ1ZVXmBLSEdFQy46QjxGPDZLUEQ4OkQzNTc9PTg5NT86OzQ+OEBMPT45Myk4Pjw6OSo2QDMuRTQoKyw+MC1OPy4rLTctMTE5NSwmLjUtODA1NzZgdEIzQ0RoW0tXR1VgaEIzNzhiTScynqSkko6lppyenp6kta2oqrq3qKzDwLevrKG1rqeur7fBwL2ywbexr7K2tbi3tayqvLSvsrG9wLeuvLyxpZ+2rKamtamrr6GgxKyqp7G0q6y0up6oqquxpZidqp6opZGZpq6jmJ6kqqGbop2XoJ2ntqavqq6hoZ2doZWgpp+ioJmbmpySmp6Vpp6uo5iXn5aUjpWYjI+YmqegkIeKioh4hXeCgoKch4uCiXt+hIiGhJCElpWPj5CRkJGNk3uDlY2Gcn59Z3lwa2psZ3Vza2JnZGJ0f2JkZWZlaWpjZ29ZXlhdbWRhTWhXW2BWSUdIS0xSWD45YGxpR0JVU1xbSUhGRUEuPD85QTg5UkZANzpCMDM3PTc2OTI6PDk3OjlETT1CPDAqPEA7QTwtNUIzNz0rKiwwQSpKSy4vKiszNzIyKDU3JCs3LjcyNjg1XHlOMj5IaVpMWkpWYmZBOjNBZEclNZykoJGMrqCamKCXpbSyo7K+t6Gxxbu5sLGjtqyrrqm5vr28rcCyr6+utq+zubKnq7mxr66ztru2sLm+rKWetaugobGlq6+fpcShs6Wvsq+3rbWera+srqKZnaeqpZ+Vm6imoJmko6mcmp+clZydrbCmuaetoqGamp6Zn6SapZ2WnpiblJqhkqiWramblJ2ck4yVmY6UlJinp42NiomOe4F0goKKmIWHfImIhISKjIiShZOck5KPkJGWjpB/gI2Ng2+Bf2Z5bmhramdxcmtcaGNhcn9gZGdqbmxmamdkbFxsbXZxYVRiaGNlWklGTE1PWFFQVWFlgVRAVlNZVUZHRkVALzw9Nz82PEZOYTg6PzI0OUAzNzgyOD83PTg+RkpARDkyLT1BPUE9MDVAOUAxLSsuMzw7SzYvLissLTI0OzYjMyopNi41NTQ2NVp8XTE6S2pbTVtLWGRjQEExSWRCJzSTopyPj7Gdm5ShmqmysJ+5wLagtMG7vbmxprawqa6lt7m4ua27r62rq7eqtLmtpbK1sa+psbe2sbO2u6epn7apnZ+qo6qtnarCma+lr7G2taysnrGtr6qim52krKiclZynpJ6aqaOllZqgnZGco6uqqbqfpqSgmJqanqKPa6KVmJxxg5acpIB2kauonpaWoZGJl5mAl4qfj3iFk42DbWl+d4RybIaKhn2EioZvXWRgZ4SXhmuLkJSSdXeLhH+DkH9miIBodmlmWF1pdG5OUGpjZnGCZl5kZm5saV5dXomQhYhoT0tEOEVUZ15KSFBQVVVLSFNgb3RlRVtRVVBGR0ZDPjE7PTY9NjwzZlw1Ojw3NTtENDg2MDpCNz86PkZMQ0IzNDM9QEBAPTI4QEU9MSwsMDg+RzcwMS4qLiovNjY4LCMxJzIxNDoyNzZYgWwxNU9rW05cS1tmYj5HMU9iPCsvjaSah5Wxm52ToJyqraujvcWvqbfCuL28rae2saarpLi0s7Sxua6qp6y0pbC1oqe4trWop6y2s660rrOiqZ+0q56ipZynqJuuvZWop7C0uK2upKiuqqumop+coainnJehpqacnKennZKeoJmQnqiqo7Svo6KjnJaYmJikiaGPkpqHoYiUnqF/pX+nrJ+Uk52TiINyeI2Og4egdYiNaZeJZn5zeaBviIeDfox8f6GgoJl/e4eedIiOdpuKbIiCg21pZWR7bXJiVIZtY21pmHFYaXBuhlddaVtraluIcG15codph4RaXkZOPkZeTUVSVlZRUFJXVGdeTFlLUlJQRUdHPjw0OT05PDc7MDw8Nzk5OjY9RjU4NjA8Qjs8OT1GUUc9LjU8O0A9QD41OUdBODIqLzE8STkvMDEuKi8oLTQ1ODMlJjIxMTU+MTw4WIN0MTVSa1tOXExbZ189SzFVYDcvKI2ml4SdrJ2ZmZ2fq6qoqr/Dr7K5vLfAv6qkt7GqrKazta6vs7arqaWxraW1s5ustba0pqeos7Gtsqiunqqhs6mgpKSaoqSdsLeVpaantr2mrKepqqynpqKgmaCopJmZpqOlmZylqZaTopyUk6OmpqG2pKOgo5iVk5iTnIiukJiUiamLmKOchrGApK6elZuflXmC1Kh/h5TAm8Z4d7Glt5ZkgMCcv3mEhHmPg3yQkJHKcZa8nMV7cranupB7gWyWsauweWhsWLGub2VpvJK8bmh6bXCP2H5Ta2K2sn6AcZR1mqGqkFdPWGFPVk5GVFtYUVBTi1xXW1BAXEVRTkRGSTw8NTc9Ozo5Oi49Ozg3ODs5PkY2Ojc0PkA+Njk/RVJJOi41PjtCPD9BODpKPjUyKjIyQkUvLjMyLisvKS0vMTg2LSAvNDE2QTE9OleDdzExVGtcT1tNXmdcPkwxWlw0MSGOppOBp6qfl52dpa2yqbHCvbK1v7W4v8KrprStramor7Sqr7a0qKimtqWoua+csrK2qqWkp7KvrrGmq56npLKkoqGfl5yhoLGulZ+joLS6oqqooa2upaKdm5qiqqCYm6ihn5ieqKeRnKealJ6ip6OgsKOen6OWlpKYkpmFsGtqio2qfmeFloetZXGfnpWap5ZxrqGkfne6fGuhj3axX2q0W6WAZZyRYGaBemaAaXhqqWW+cmemjHaxanyxeHWSlGNtbaduXISgRWlnh5ZFdZxgfWZ7o6aCWV+Lq2mAknh6aqg4Sq9bV1RtY1pMT1hfXFdWO06IT1dWL0lUU0pDRUY9PzQ2Pzs4OjkwPTg5OTk6PTxEODs6Nj1BQDY8QEhRRzkwNzxBQz5ARDhARz0xMy0zM0UzLi41My8rLyguMC46Ni8nJDIwM0IvPTtVgnYyLVZqXE9ZTF9nWTpNNV5ZMzEbkqKVgqynpZ+jpKqxt620vb6wt8WyuLrDp6mwrK+pqbGvpLG6sKSlr7OjqbmpnrOysKOloKqtsKyvpqifo6KxnKOdmJWYnZ2vqJecop+0s6Grm6GtraCempego6qdmZ6koZyaoaekkJ2jm5ihoKyfpqagmp+hlZWRlpGahrWbtXiFqZm1mXeHs5u3f5SXl6uWfmuBpnqBhYaRlJJ3q2dqsVuse46HlHSIcI6GgICIkJd4g4KLl4yDoI+FsHZ3n3Framx8i0+lWEhjY5l+Y2ilX3lxdVKSh15QqW1jcX2GgGGdL1KibltUa2dgTEtcY1hcWkI+sHhXWEEjTWhGQ0RBQEExOT44ODo4NDs6OTw5OkE6RTo6OzY6Q0I4PT9LTkg6NTpBRkJBQUQ8RkQ7MDIwMTtGLDAuODQwLC4oLzIsPjgzMR8vMi1EMTw8U31uMytYalxPWE1fZlc3SjhhVTUwHJeglIizpqairqmos6yqu7bCsLzCrbi3wqusra+up66zqqKvvKuip7Wto6u2paWys6ijoZ2nqrKosKimnqCgsJagmpaWl5qgr6ObmqSota6hqY+pqKqbnZaYoKapm5+do5+coKOlo5Wbn5ianqOrm6WanJqioJaTkZOTnYTVk5m5cbDCf8aGfNaUnLt8m5enkI2cjKR6jYaigaWCeqx5j51Wr3uJfp9quVq5d4aDfaaCk3yYeqp5jp2Qe7FujoR0kLuFbpVQr6fFilGgemNgqmJzcoZsl4dfU7W0yIWAiXxjpDNCnXVdUGpoZFBAWGZaZGFKSE1rSlpTT1lmWkNDP0U/MDw8NTk7NzQ8Ozg9OjxDOkY6Oz42OkBDOzZAT0xIPDo8REhDQkNEPEVGODEyMTFEQi4wMDQ4MystKC4zMjM5NzEjJTUqPjM9PVF3ajYqWWlbSltQX2ZUN0c6YVA3MiWcopOZsaippbOqpbSopLy3wbG6wLK2tb20tqiysaOxs6agr7apm6i6rqOwsqGytLGhpJ6ep6mxqbSppZyenqyXmZmXl5aYoqyem5eprbCoo5+OrKKol52YnKGnopiioaOhm6Kip5ueoJ6VmZumoZynlZubn6CYkJKVkJ2Ism5otXGriHCOpnK0dHO2e5uZpo2PnI2ifo+fpH6wdYOR0tF1W658hX+kb5uqpmuGhX2tfZeZj3uxc5Odj3izZZZ0hZ5unmaUUsmLWsJcn3liX61fdnOGYpeIXlnKnW+/gHVNS7VTVcZkVFFqY2ZYQU9qX2xpUFVGSTg9V1JbVllJQz9KPDI/OzU9PDU2Pjs3Pjw9QztHOTtANzs+RDsuQ1JKRz4/PElKRkNFRD5JSToxNzQ2QD4vLjI0MjUyLSkuMjYsNzQyJh82MDs1Oj1Qcmg5J1dpXEFOVF9lUDVHPWFNNjIuop2RpbCtpaq7rae1pae2u7yyu7+4t7W7u7SmtbSisrKjoKywpZinuq6ksrGdtLiqoKWdoaqksqisqqWanZupn5aVmJmSk6OqoZeTp6uwpaKWkqyfppOUoZylp6CVm6enopqjn66aoZ6ekJacop6cpZWdlZminpWZlpKbhax7d6h2o4+Lh6lvrYqDp4OamqOKkpmLon6Sl4euhX+Cs1xys1KufYKCpH9x1313hH6PnYaZmnevhoqRnIh3tGGaZZqCgZVskluwV0uadZh5ZmCtXnZ3h2eYiGpdr3eVn494bDV5yK6yX0JUb11nYEVQbGBxbVZVTS5lYmhTWVA7QkRATDo1PzkxPjwxNj85OEA9OkM6Rzs8Pzo+PkU5LUVVSkVAQzpNS0pCSEc+R0s5Nzw0Njo+LzAzMzMzLjIuLjE4Ki4zMiUhMDM3Njc9UGtlPiZWZ1xAPVZfY042R0NgSTo3N6CdlKC4sZizwa2osqeqsrq4tLm+ubiztr62pri0oLWtoKCprKCVp7asqLGyq620pJupn6CoorWnpqqkmZ6VpaKUlJyakpajppuUkKetr6WhlZipn6KPkaKaqaahlZqmqZ2dpJ6tnaGcoI2Un5ueoZiZnJaXoaCUmJGmnYapfX2leaGPkIOqcK2MgaaGlqGiipeWiKOBkIeUqnt/i515b7FaqIOCiKB5dNh/dod0p4GOm42SpHyWkJ+Ee7JenGSgfYKUbZNcq1xbk3+Rf2hnqmNye4BqmIZxXataiaCPa25lT0pDoVxaTXRdYmZNWmFfcnRfSlU1SpqSWEhFPUhGQU0zNUE4Ljs+MDVBNzhAPDY9PEY/Ojw2Pz1CNy5IVkpFQEg2S0lOQElLQEVOOjpANC47PjAwMjE1NCsqMDUvNywmMjEoJCQ2NjcxPFBlZUEmVWZbPzFUX2JMN0ZJX0MxPTeinJqav6yYtMKuq62oprSwuLG2v7m6s7G4vKq7taCxpZ+mp6eflKqxqbCqtq2qr6GYoaCmpKS6oqOroZebkaOglZWfm5WZoKCQjoypsK+mnZebp6afjZKkmKisqJWYqaien6CkraOhnqGOlaGYn6CSnJeclZ2hlZaPq5uPrm5ytHSpjHeKpnO0eXS0gZOlo5OcjImkh451uG+Me4uia2u2WqGGZZeXaaCip22UcrR0k5h/smqGkoita3WzYZ1mom6GkmuXXK1gTqF8h5FSc6NseX9+bpiGcFyvVjycd2ZUb24uW6dPYlJrZWJsWmJcYHB8Y1NZUT4+bW8yQkJAP006ITdANi47QDM3QzU4Pz8zOzxDREJKRk1JRjYySlRLRUJKNklKUD9IT0NGUD08RTUwOzswMTAvNzUsKywzMjYvIzAwLCwdMjg5LzlOYGVEJ1VkWT4vVV5hTDVGTV45MUE4pZqbnbuinLLArq2rq6e3qbivtcG1vbKwurirwbaqq6Gdp6SinZKrq6e2o7Oorqqhl5yooKWruZ2jrZyWmZClo5aOnqGbmZ6fkZOVq7avp5mUm6ypl4yUppqlraORl6uypKCeqKuwmaGikJmil6CblpuXoZOcqZ2UkKqZh9OTmrt0scSAw4Z91ZabuHmJkZiNl4mMp4d5orZ1fXd2woKasmCDunnAfHW4YrWBjIepfZaBrKlxe391vIinoGmdYaaOr6J+jHSHq32+bnO8dLKDdXiAim2aiHFtjaR0vV13fVthebxqWlZbaXleaWFkZmJteW9ZW1lDQUByP0NGKzVIIic7PzEwPD83OkI5OT1DNDxATlpeYGBfX19aUFBSS0VGSjRITFJASk5FRk9CPEU4ND05MDIwLjg3LSouLzE4MCItMSwzHiw8OjA4TFhhRidUY1g8L1ReYEs1O0xbLTZAOaean6K8opixwrCtqaqssai5r7fFsryzr7ywrsGyraajn6ShnZyRqqWqsqS1p62koJaaqpmmrLmdo66ZlaGQpqCTjZyjn5mfmpCWk6+5sKuVl6Onp5SQlqWdpK2fkaCoq5+cn6mksp6ipI6nopShmpyXlqSYj7CgkpWpn4WQmbaAkZKNuJV4gpObtXdubG5zb3mPhI6Jc57Bu7yZeoGyqHCAdJG5g3yGhouHjXuKho2XfKS7ub2cdXmzo3V2l3V0sHWYnmaGaY22dHJxd7aMXn95fYhng3lteWKLrHB0hX9YW6dqRGRZVGZfY11jUWZmcW11Qk1QTUQ7Wkw/SjM8MCA4PjsuMz1BOTk/PTs8QzZCU1laWltbWlteYGJgXVNHR0g0RElUQktOR0VPRj9HPDc+NzA3MC85Oi4sLy0qOC8lJjIoNCQoPjcvN0tUX0cnU2JXOCpPXV09KztWVic9OjymnaGhv6aWs8K0q6qorauqu6+xxrC2tK+4p7W5rqukoqefoJ2ZlKykraqmtaion5yWoKOerKW+p6Gql5WckaKbko+hqKKUnpeSmJSytbatmJ2kpKKLkpKmnKWrnZappaacm6Kpp6ajqKGSrJ6Xop6Xl5idno+wqZOcp6KPa35pnKh5iXN+m451emWHe76/wLpukoJxlYVfcmpaXZqJYWSHjpVrYH+VY22cdmKUa4CalZRlXl9jcZuJaHONfIaUZmp+cXR5fn1iW3h0gWhQXG6DfHuKalhseYFySUpvhXBOc01FV1xmYUxbV2ZjXk9abXZqclJPREVNPEhJPE0/MiwyQT84LzU/Qzw5O0A7PUM+UlZWV1laW1tcXWBhYWFgXFVHNURGVUVKT0hGUElJSDs4PTUxOi4xOzouMC03Nj01JiIvKjIsJTs4LTdJUl9JJ1NfVjQpUF5MKDM+W08nPzI+qJ+oocGkmrS6tqOspq6nqLWyrMitsbSttqS+sbOnoaSqnaOcmpqsp66kpbWqpJuYlqKbpq2pv6ippZWUm5agmpOYpamokp+Qj5icsLK/rJunnaeiiZORqpuopJycrJ+jmpujp6yin6qimq6blaaglpWdn52XsaWZoqiZnJGenKOlmqejmp2ampqQloJobn1xdpGXlJGDibSpjYWYlY6KjJiXh5OVioOTk5CIjZGUmZOZl5qgoZqblKCcjoJ6pIVsaXuQfYB1iYuCcoJ4eXZ1ioB7iWpzgXSDdWR3fXZrcHptYGNbb2dMWFllal9XWXB6b25mU09GUjlPWk5STygrO0pCNjM1PUBBOTpDPjxFTlNTVFZXWFpaXF1gYmJhX15eW1RLQ1NHS05ER1BMT0k8Ojs0ODksMjs4MTApNklSTzgiKSsvMiM0Oyo3Rk9bSidSXlQxMFReOis9OF1LLDwtQLKgs6K/oqSxsbegqaazp6WwtarJrK6yprWmwKi0oZ6lppyllpagq6eso6O3rKCZl5agl62qpsGfrKSWkpyXnpiUlKKenqOokpCZqKeyw7Caq52qno+Xlqmeq5yeoa2YoZudoqWvpaGkqJ6rmJemnZmaoZ6enLChnaKnlZiUmZSho5akn5ihjpaUi4qNj5etj3uVm4KRgImpqIWAmJaKhI6fiHuDkIaFmpGHhomVjpuXjpCYnqOWmZKQnY1+jWWhs66EiYR3e5CKfXd5em9neZCBgIlrdYF5iHJpc395dYOHgmt0Y3hmX2hkY2Rmalhre3Bqa1xTTFBEX1VGQD8+LDRARjs0NTs+QTs8Pz4+SE5OT1BTVFZWWFpcX2FjYV9dXV1eXVhWSktMQklPTVJKOzw6Nzg2LzM5NjQuKCYkLTEuLikrKjclKzwoNkNNTEQvVFxRMDVNWzE3RTRcRzU8LEC0oLmvvqyrrbGyoKqmsq2irLOwxrGsraSzr7yktJygp6KhnZmXqKappqSls7WelZWdmZmvpq6+oKyjkpKempmUkpahnJepnYWdqayitMezn6mkqpaWmJqnnqmcoKWrlJ+fnaCqrqiko6uhrJufn6CYpZ6cn5ywpJmfqJOYmJ2SpZqZqZ+bl2aDknxlfo+aj2N4jGxoanqQo6trZJmXfmeFimVlaWh6jaGOa2iMl5Gid2tqi5iin5hzbG56hIyGeVhlXYWCXmyLioJ2W2hzd3eRgIeCbniCeH9zbXmEc3eIiI6De2mFWF1qc2Rdc4hpa3xxbWNdUU5XSWRYQEozPUY3P0ZENzE8PT9BQzs7REdISElMTk9SUlRXW15gYWFgXV1dXV5fXVpVT0RIT0tTTj0+PT02NTM1NTU0KiYmJSwqJS4rKyc2KiQ7Jy9BSVtJLjZaTzYpRVkvRE8xWUI7Py49pZ+6vLmvq7Owq6Wora6wp66tsL2yq6ilrbCwn62YoKSeopqap6ycrKOmqKmzrp6Wo5Cir6a2uaWuo5CPmqGZk5KboJiZppZ7payiqLTDuKWip6+fnpWeo56jnaSqqJKfoZ6gqq+pqaOqnqebpp6noKyWoZylsaSYnKuWoZ+bk6WYn6uZnn6+g4hytHKFnoWtaHe5xLhxkqGje6aYmHOqgnzLwMC7cYqjh4KefJaYiJ7AvYKWnZ2NnMHAe4F6kYyawr99a6Wyb4yBb8p6f5t3kYOOgHZ5gX95cXuAhnB4hYyTeWx2kWJlXnhkX2WBYl50aG1kYlhMVklRWkhPRDJJRT9EQj4vPD8+QEE6OERDQkNFSElLTU5QU1ZZXl9fYF9eXl5eX19fXVxTTVBHVU5BQD89NjQ2ODI2NiomJSMpKiYuKyopMTAfOSojPkhbTCojQ1AvI0ZbM1BZL1VBQjsvOJajuMO0sK+/qamUo6+psK+tprK2sKump6Wxq6CrmJuioJybqqeinauipamlpbSknqOTpq6suLSnr6OSkpmdpZKRoKGXm6Cdh6arpKutv8CxoamuqZeSn56imaOkqqOToKGenayup6umo6Gln6SknK2pkaSbqa2qnJ2rna2il5iml6KkmJ1/zpR5eqWBepaWm1+tj12OqICgoXynlZp0q4KAr15kjKl6qIeFn3SXkoizY4KrhqCNjbNqhK5zfJaHuGGCrVmjzW6QdXvbe3+ZcX6IknV/ZXuIdnZsfYdufYWQkX5sgI1fcGpvZmBfeGRccWhqY2ZgUlRTV15KT0M1QUhFRDg+NjtAP0E7PThAPj8/QkRERklKTE5QUk9TXF5fX15dXV9gYF9fXVpXT1VKPT8+PDU0NzgxNjQoJyQhJywmJi8oJiszHTYwJDc7U0wrLC1KMCc7WzpMLSFQQEY0LjGtwsDAtbSwt5iekaOqqa20q6ayra2spKymsKqhp5uappicoq+foZ+op6OmoZ+wrJuelqaurbCrqKyglJKbn6WTkJ+ll52oo56upKuwqL/Gs6ipsa6Wkp6copehqqqflaGenZytrqapqJumpqOgqpKss5aloqqqnqSnp6KxopObp5uhm5WUkZegcIWMmHWEqIdxsHydcqx9oJ+BpY+ed6uCfa1/nHKtfquHhp92mJJ7fJd+qoihi5GLnH6reoiSjqCAeq1WnMR6j2+SwX2BlW11cIxtZndlhm9hd25yboiKkY+DbI+OZG1zdW9gZm1kX29oam5mY1dTXGBaUlJDOUlJQEM8PjxARkRDRUE9PDw8PkBAQUJFRkdFQENJU1dZWlxdXl5cXl9hX15eXVtaUkM+OzkyNDc4NDUyJiMfHCAxJyAxJx8nNB41LSY3PVdKLTwoPTEpM1ZARiEcRztDMS0rr9TGx7K0n52jjqOioq2utq+psaepq6iuq6umoqOdmqOWn6arn6KmoKioop+esKyYm5eoqK+sqKepnpeVmqOikpShrZudp6OurKOstam5zbKtpq6slpWcnaKZn66snZahmZ6eqbCnqamaqqijoaubr7GiqKyvppmmq6qrsqSTmKSmm5WShaRqpHWJeql1erJxgqWJmIxwh5+ah6RfYFKrhH+ugpt1roKnhoafepmXhXtmgKOJpJiGgaN9qX+BlIauXnyoVZ2ikoF6o5+Ae8OvxYxzr7SzuXFiqa/CdGiMjJeOgWyYkW5seHh3bmtmZGRxcGZ7aWNcVl9pWFhUTExRTENDQUI7Q0FAQkk8PTo5Ojw9Pj4/QT04NjtETFBSVFZYW15eXVxeYGFgX15dXF1bU0lCNjc5OTY2NCwmJCIgKCciKy0iJC4hMy0mQERXSCxHKzU2KjFQS0wjIEE5RDQsJ8LJ1dbAoZmrqKGvop+wtbCvqa2jqKeqq6uppKafm6WfnaanpqSdrJqiq6Gkn6+inpuTqqS2sK6gqZudl5Wmo5CaoqifoKacsKajqLGstsiytamsqpWRnJ2imaCltJ2aoZScn6aqqqKtmaqooaGporOtoqqzsqKcqqiwsLellJekqJmdknyqbJ6Eh3WreXywboKki4iflpWelYHSt7S4yYCBsl5flKmDpIeHoHqYlZl4qslzmaOUqKmQk5qMfpqJmsbGd2WhgqVzgZ+Ogn2vXm+1Y7F1S6OGbadHgpNkjo+ckntvlZB9bnl0fHptW2VqcnFmgWpeYVhjbVxeWUlMTEtFREJCPUE8Qj9KOzc5Nzk5Ojs7OzMuNjxBRklMTU9RU1daW1tbXV5fXl9fXlxcXFxcWE1CNzU3ODUvKSglJiUkJiksNUZOUFBNRkxKVkYqTDAvPi00TlRRHRw7PEYyLCSopMHGua2ps66spaKdsrmsqqGmm6imq6yppqCmpJiro5+urJ2moayan6mlnae1oKOYk6irtrKsm6acoJaQpq2Smpyno6Cqpq2ho6epsLTCsbKqraiUiZidpZuipK6ll6GVmZylpamZrpysp6Weq6O3rKCyubCenK+otLS0ppaYqaSboY+CnU54moF/n3qEo3yCpISGpp6cnpSEuHt8ebmCf8zGw7Z3m6GQi59+mpaXiXafl4qkmKSofrCFm4SehKx9mZRhpWyjcI+FkIF9l4RyrGCkcnGAmmC8fVJVdY6Ro5Z7fJGOh3J5coN9cFxsbndyaoFvWmNfaG5iZF1MTFFTQUhHRkk5OUs+QjEwODg1Njg3Ny0qNT09P0JER0lMTlBUV1lZWltcX19eXV9fXFpaWllVU09IQDc3Mi4sKi4rKicmP1FUVldXV1lYWFdVT1RGPEUyOlBbVBwbNj9HLC0gjIeZqaykq7mrr6CboayztKafoZWmr66uqaadpaWao6ehsq6iqaeyoJmopJSitaOklpeiqrW5pJyjnaOTkKGymZ6bpqWhoq6snKSoorWxw7Gtqq2qkYeRnKedo6ScpZeemJmZpaOnmK2hrKSll66lu6yht7eunp61s7mytKiZn7GipZ+Hj9G1w7d5h46FkZOPgKZ4lKJ3i6CShaWCi3GrhoW0bnJpmaOclYmffJeZhoeQc66CpZuijaaLk5yIlJCabXCyXKVzk3qcbJl/e5l+bqlhonFxf59ic7K4aHePk6SYfYqLkIh2e3iNgWxod2l4c26AdV1kZG1tZWhgSlpXWDxIRj9UM0BGPjwqKDYzLjAxMykmNDo7PD0+QENFSUtOUFJUVldXWV1fX15eYGBdWltaWFVSUlFGOjIyMzAvKysoQFFSVFVUU1RWV1dYWFdVVVZUUU9RW1UlITJBSCMpJZJyjYquv7+8u7Wel6ikrbahopmVo6mnrqmrmaWhnqahoLWnoqmnsKOUq6OOpK2knpGamqq0tKSdppypkpSXrqCgnqaknKectJmhqqO1q8KvqaupooyEj5yioKajlZmanJibmKajpZeppqyhpJuspr2slb6wrZ+jsLS7rLWonaqzpamZe6iRfXywd4qBpKWInG2yb6CHrXuhj4OolpmArImFroWglKihopeFn4CZlYB7kn6rgJ2alouqeJ2gj4iTkn95r12jgXymp2SegHyXdGuuXaVrcYWZXWBbjKBtlJClmIGTi5OJeHmBln5qbH1ifXRtgHpgZ2VwbmdnaEJZX1s9SlMyVDhCQkM3JCQzKycnMywgLzY2NzQzNjpAQ0ZJS01OUVNTU1ZaXV9hYGFhYV5dW1pXU1BPTkk3MDUyLiosQVRWVlZUVFVVVVVUVFVUU1NWV1dYVlVWUUhGSUojKCi8kpqEqcbDtsG0n5qtoK64paOOm6SjoK+uqZ+jnp2tmJ65oKKroK+qmq2gkKqppZaJmpCusKymoKibrZiZj62ioZ2loZqlnK2YoKiltqi/rqSpo5+LgI2bm5+mnpKUmZmTmpqko6OYp6qqoqOeqai+pJfDrKujoqyzu6ywqKK1saqsmXavfpCKnIWHfbqtiZhksIxlla19oY+Dp5abga2KhLCFppmjoaKRhaBbbGqBs2B/rXt7goCybGdumZeLiLFbfbRbpINryKJln4F7vFl2tVqyfVKvgHqsWIChbZeOp5qKlo+TlHl4jZt8Y3N8YYN4c4B8YWlmcG1mZWVPVWNcQVRePUgoPjk9NCEhLCQfMi4gKjEvMDQ1Nzk6PEFDRkhKTE5QUFJUV1peYGBgYWJeX1xbWFVQTkpHQzU1My4vQFVZWFdYV1hYV1dYV1ZXV1dXWFdXWFlaWltcWFdXR0I70p+zsbe9u7TBs6Ocraaltqmgi5mgn52zsaieop+dtJigs6iqq56wrZ6rmpSuqKKOiJuOr6ypp6Ooma+Tmo+pmqGepZ+apKOlmZ6jqbKovK+lqJ6djnyKmpahoJmQkZmakZmXqJ6fl6espaSkoqSpu56gxqelqaKstbeur6igva+urpeBqZKjro6bgIakl5iQgYC4w7qDjp2ThKeYnYKsioKviaecmqWrkX7VvcKqYqO/vXx+o4KD17q3tYWTkoKevb6EaqOBb6uEbp1/erKxx4Nrq7C9rHh3or67dICVjaWbj5mOlJp3gJCZeWJ8emOMZ3iBe2BrZWtqYVBiW1NpXEBUYEJMKTw6NS8fHyQeJTIgHSQoMDQ5NjY3ODs+QURGR0pLTU5OUVRXXWFcX19hXmBbXFlUUU1IQz48QT81PVNZWVhZWVpZWlpZWFdXWFlaWllZWFlbW11dXFpWWFRXWruVtLSxv7qyvbOina6mpbOmnYyYpb+ptrCnob+mprGbnrGcuaifra6lp5STr6yXjIOaka6mo6yipZyqoJiLo5OmnqecmqGoopmeoKysqbitp6Oal5N7h5iSppuTj5GYl46YlKiZnpaop56ppqGiq7ueqcWjoK+jq7S1q7GrorypsLCbdHaqpLaFZYmfcGesj4qPbW93pJCaoIF1sJqWcJCNcpaoo5uYrqRybG1sZYp4bm2CmXGAemlwaWaJlpWXcWhphYZncIZkXYpjaW9ZXWd+eKZgYnKPkm9mZICNk46hl5aXjpSbe4aOlHRlhndnjGp4fnhkbGNmbGJLZVdKa1k6UGREUCdKOisjHCAaIiwpGBsYLTIuNTo0NTc6PD9BQkRFSEtMTU9RU1ZcV1pcYF9hXV1bVFBMSEQ9OkFCN01YWVpZWVpZWFhZWFdXVldZXV5eXVxcXF1eXV5dW1tVV16ola20qru6srOqqaKunqSzqpiSvbHDx720qZ6/q6yjoKarn7qjpK2sraWNla2qkIyFlZetn6Wqop+kpKCRi6WSp5mpmZajqqCWnKWmp6+5qquam5OSe4OVjaaXjpGRl5OMl5Wmk52Wp6GZsKadoqy5oLDCqKSzpqyxsquvram6pbC5l4uhqaW2nYmWopiGqZqQlJ2TqrOZm6OsobSXo6GeoaKdoaShlaunjJKTjIeSnJyUkJmTmJCOlYR/pJqXlY6Lk5KKj4aEfmeLgHSDdnSHjHGnbXyVkpSTgYGPj4+OnJOflJaUnoCGk4twZ452bol3dXx5aWtkZG9jVWBYQGlaR2JgTlgrRT0rJiE2NDAvHxwhJTIoKjc5OTQ2OTs+P0FCREZKS0tNUFBRV1VWWV5fYWNdXlRRSkVDPjk9QEFTWFtcWVdYWFhYWFlYWFpaW1xeX19gXl5eX19gYGBfWVlgpZapqaW2uK6uorClrZ+gtrGQjqrEu8S5t6mhpZ2bpZ2wqKO2p52ptaankJeso4uIiY+cp5aspKKaqJ6fk5Wjl6iaqZmUp6GkkJqnmaG0uaeqmJqQjXuAk4yhlIqUkZWPjpKXpI6dmKeem7Wjnaast6ivwq6jt6ewr7Guqqu1u6KxvpqSpqSmtaKSnaaejamfjZKfo6ywm6GksqqxmaWhnaSqnp6dnJesnZKaopuUkJaqmY2YmJaQlp6Rh6CdlZSFkoyQjZWLgX5mjYd1h3Z5iIR0nGqHkZWVkop9jJaSkpeRoJGblZ6ChpaFeHGUcniJfnF7fmluZF9waWBbX1ltYlBgZE9ZOUdGRT0yPD04LyomKykmHSY0MDY2NTg6PT0/QUFDSEpHSktMTVNTU1VaYGBpYGVWUEpBQ0I7OUVNVlteXltaXFtbW1xdXV9eXV5fYGFhYmFhYWBiYmJkYlxbY5iVpKejsbSsrqOpp62gqLWqkI+co7K6raqroaKZepyisKSlsamWm7imo5OXqZyOhoqJm6KQrp+kl6igoZKXmZuui6qWkKiZqIyYqI6euLajpZibjYl5gJKMm5OKlZGTj4yRlqGLnJynnZ63o3+Dr7WisK90pL6jsqB4e6Gss72Wd66loIqAqn5kXGJ2n46knYOXfm6Ts5yjqK+rpGWfoJR0epqXcYCZqZhsgKOoimWcpZuQl5iWi5KbkISdmpCUg5KHjo6SiYV3a5CIdodxfIaBgGFpiYuVk4xbdpWRZ2iPjHF6o5eWZHeXhoB2l2iCiYJueX5qcGVfdm9ra2dcZWNhYW9SWj1NTU5SRj1AVEI5MS8eHyY0OjMwNjY3ODw7PkBBQkZIQkdGSUtMVFVVWV1gaGdnWFFJPERHPDlWUltgYWJgXmBfYGFhX1xdX19fYWFiY2RhYmFhZWRjaGReXWaclqajobCxrKuppamtpKetpZKWqrSusaWZqaaql3OLna+fqKunk5a4oKCOm6SekH6IiJqejayapJWoop6Ol5GehXSukImmmqiRlqOIm7mzp6CYmYuJdXaSjZaTipORkJOLj5OfjZmepZibspaAjJu1nbSMko+9p6F+p6J7pLC5go6Pp5+Ei4WPsamvjImWopl5gYushpydoqirqYiVh5l3pZt6h5yBl6eCgXudsnqKhp+XmZSYloGQlpaEmZpjeYeQhI2PkouDbnGQiHqBcYCBhn+GdIeFlpJ4lmiTdKCadHuZgp6ahJh9kYmBgphpjIyEanh6cHBnZHdtaWxqXGRpaWVyW1xIVExRQEU1LVlUVDYpITA5PT42NDM1Njg7Oj0+Pj9ESUBJRUpLR1JYWlhbYWFoZllRSDlESzw+YlZeYmRlZGBhYWBiYl9dYGFhYmJiY2ZnY2JhYGVkY2djYWFonZijn6aurquorKCosKenqqWZlK3FvK+glaWotJ2Pg52rnKaioI2Qvp6ZjZ+aoZB8hY6ZmIisnaOWoaGSjpSJhoCRqI6Hopyjk5adhp65saedmpOPhXB1kImUkIqUj46bi46RnZCVnqOUnayIn7SJtJqui8qIq6+Jt4WNsIOysIWpjqeYjZ18qI9ye3ebjqaWaJWkebSLn5+nqZOZwoJ/q4iYoXGegJqlfZeFlbKAoX2gk5+PmJeAjpObiZiSi3yFk4aNlJOJg21zkoaAe3KGgYR9hXWGgpiBj8VmgKmHj6JqnYGel4CZgIqLg4iYb42ShGd3dHt2Z2h1cGdoa15ibmxmbFhmRlxRTDJFNDZNYWM3JjQ8REdEOjYzNjU4Ozg+PT0+Qkw/TklKS0NQWl1cV2JeamxcUUU9S01ASmRYXWNnaGdiYmJiY2NgX2JhYmNjY2RpaWNiYmJlY2FmY2JiaZWXop+wqKmopaugpLmxqqunmpSeoqSqopWkqbair3+gppylnp2JlL2Zk42gkZ2PeYOWlpGIq5mcm5qihY+Md5ucjqCRiJ6km5WYl4aiuKylmZuNjX9ibY+Lk5CNj4yMl4uPkZ6Nkp6gmKCofqGnh62doJaukKCenZGGgqCNrLGIpI6rmoyafqJ1gJiTa4GrdE2reIeNnZKbqamCqqt+hKF7eqdpnn+SbGeXhpi2iZ5+bmBjWIOXf4x7ZGeLc5l9eZZrXXyXbl9TcYVcYGx5g2BZZYJ+hIGYcaeqa4OjbnKlcJ+CnGdknmxabIh6ZVlfgn5hV1BvdmVtdHFqam5eam9sa2hXZ05dWEU5QDRHRF5rNCtJQ1FNTj04NDg1OTs2QDs7PkJPPlFSTE1CSltdX1deX2J2YE1FOk1PTVRiXFtmZ2lpYmJkYWRkYmFiYGJkY2FiamtkYmRkZ2RiZ2VhY2iYlp2guaCqo6askaG2vKuvopmWn6Clq6ufnK20oqeRoJ+fppuZjZi0mZCLnoyVi3WBlJGNiqaWlpifnn+ThYaso4eckYqYqZiZmpGHpbCmopWZiImAaW6Ih4uOjomLjJGLj5Ggi5Kdn5uhpX+TgY+joZSgd5yWkKeDoqiAhquvhqV6i32Emn2icHKSh5Z7nox5bYebi5mRnKmcj4edfIKic3amZp5+d6RemHt9k3Oibpi3tLpzkoeBgLaoZIHGuHtwlbaMcYCbpGN0rKtgfWqds35ufYeDj4KLl3GAo2xzpHOegn2jXpyZs5Zve5ees3RyW56ygmlib3N1cWhuWGtrcnJkW2hdYkxEPUQ1UUFacTI8UkZfSlM9PDM5NTo6NkQ7O0BJUD9UTU5RQEVfXltZWGBgfGRJQzhMV1VWYmFaZmZra2JiZWFkY2BhYmBkZF9gY2tuY2NkZGhkYmdmY2holJaVo7mZq5yToI6luLatrqCaoZuio6Srm5qxrKuSl6CYoKSZmpSeq5uLiJJ4i4VwgJaNio+hkJOUnZd9kYqOqKCHmI+KkqKTm5qMiqinpJ6PloeEfmt7h359j42Di4+PiY6TnoGVm5+coJ+LiXecmKKNoHKii4ipiJynkZeprICujH16oJl5o5N4gHOXiIycfZafhpuOmZynh6NkoX2JlpCbjGyeaJqNbpqZe4CKp31yZ3Oqg52Cc6pnlJpdm4V2hJ1oqmqBuGZcqXCBnGGVjF6ndnaJioCdaJp1h5OSmI5/nm2ZkGqmmVyofne7an2pWo6EXbNnXG5xeHdraVtwaXd4YV9mV2JCUEVPN1ZCUm40SlpZXk5aREAxNTE7OzdIPzpDR1U/WFJYXT5EYl1WYFFhY31qRUI5TlteWWRmWGZnbW1iYmVfYWFfX2BgZWNeYmRvcV9kZWVrZGNpaGdraZWciaq2m6iJY5WcrLqysKydppuap5+drJmdsKernZeimaGfmZaWoKOZhomNaYiAcXuXiIyWl4SSlJiPeoqElqOciZWQhoudkZybiI+oop+ajJGKgIBpgYZ5f5aMe4iNjoeOlZl+kqGeoKKTmHJon4qgj4xwkoyCqYiZoKSpoql9sK2koriXdqOzoqN/iJR4nXqrmn6ij56cmImYcqF9hY2wtX1rmpGheH6YtKOjq6iEmHuafJyafnOqWl1ve5eLeJ5iTH97e4VkephCTZ9ZompyfI5ugYqEmXabeYeJsbN/fpqSpnR+nW1xfJRvmXJpo12VdkhlY2BzcH19bmZfa2h1e2JjYFFeV1xUVkBZRVFnRVJWXGFYX0lEPUI4QEE6SUU4TEVYQVZRWlZERmFcWmBLYG19ckVDPFVeYlplalZoaG1vYmZmXmFgXF1eYGhiX2VkdmxeZWdmbGRlbGhoa2mUnYGxrpmEU1+hp7S6s7OpmqKLmqmbnKeSoKujoKePnp2cmpmVmKGdloeHiXeFgW55lYWQmot9kZOWiHKAiZKgm3KSkIGImZSfmoSOqJuZlYqKinyEbISFcYGhjHiFjYiHkZeTe5Gin56jiK6GfbWEj56de6aWeqmClp6Ri6Kefqdod21+mXOgc3F8nYWYb5OCrn2jg6efm4GkcF6paHWjY2+lYZzTj3x6mXhyc2OihY9+onKijnVrj7OLYIKYinOqsqe8f3eDbX+/pqq0XpxvfnKXb4FzonJepGd0pmBopmya05h6gptud3mXa5t5dpdybKmlZ19keXB/hGtnZmNtdXdmX2FSW2ZQUWFIV0lUX1dTW2RqW2VRRkNLTEpLQkpFOFBAUE1YU1hPUlFgZWVpUmR4eXdKRkVjXWVaaGpTaWhqb2NqZmBjX1xdXV9oYmFoZXxkXmRnZGtkamxmaGxomJt/sKxUXEt+qa+ytbCzo5yYhJemoKCjjKSnn5eoiZmXmJOZk5Ggl46IhXtwfYRofY+Dk5qBd5GOj4lwf4ePk5JsmJR8iZGSo5WDjqqak5KKhYl5hHeIgG6BnoZ3gJKFh5iglnmToqOaoImzoaK2i3qsp6SupXCpgJuRhoGdk32kgKKZhphxnoSira6Jl4uAjKSNlYOvopR2tba1yaJ0lIuCnmGdl6lteZWHn5p1oYd3oH2QloqBb0xmo5JwmohzpXt5dGKDgmx+oGxyZGCccn90l2t7arS1tMamc5h+epxqmpqrdIGabXN3l2mZeXSYcVBEfbNeanVqeIdma2didHRwbVZdU1loT1JoSVVMWFJWXGdrblVnV01KQUpNSkhKTkFRSlBkY2ltZXRyc354e251iXt7VFFPbV5oW2tpUmpoaWxnbWZjZV9cXFxfaWJkaGt7X11kZ2NqZm5tZWlsZaKcia+nhWY/lKGyrK+vtaKij3+Wp6Kho4ukppybpYGal5aNl5CPm5OOiIN5anmGZYOMfpafeXWPiIyCaYSFkoOMhZ2NeoyKlaWSgpepl4yRi4CJeoB9i3lwj6CGeYGUhoiVnpV/k6WnnJaWhGdueJxsomR8caV4nJhwaKeCmI18pXqgloOWcp92gImUlY+5bpCKomJ9maKWiW5zaqtrdaBtb6Zgm2mLkGmWh5qVdaKAfZpfi4WMdW+IYmihZZ5/aZt1cGRniIJuc6JaX1tkoW5diYxwe390cmSlbniiZGanaJdyi5huoW9SiI9uoF5kp1SLXVSYbW1yanGBbXBoa3hza29RWFZWZllTbUlYT1xIWGhoc2pZa1ZRUkVWXExYUmFVaGped3V6fHB8fHKCe39zdo2Ag3ZeUXNhZ2JxZ1BraGhrbG9oZGdfXV1dYGpiaWl2dV1cY2hjamlybGZrbWOdpZmmemV0bYunrqWqsbGmn4t/lqqcnaSLoaGZoaGAlZiTjZqPi5eQjot7hnGAiGiLinyXmnN0iX2QfGWDh5WKiZaZgnyIhpamkIGiq5CFkIqBin2AgI5zaY+lhH2Fk4yHl5+Oh5Kqpp6JpniWnH6liZaMspmekYOvl5+leZeJeql0po+Emm6looyShIyDvG59pa+Ch4aHlJedoX2me3KolKCWZ55+b6xjloqVkneobKmigYl2h4J3q5GmiGuRsGt2s4ypbIuGbm6fnpGVYn+ri6p3gH+Op593n32FpJWdoGmah3WsZp6tjLZzdr6MpJNZg6aNq2F1cXNve3RxYmp+bmhsU1ZaVmFgXGpMXFJdSV1sbXZgW3FZW2BaZ3Nlbm9xY3F0YHd6fnlyeYNyg36Be3uMgYKAdmJ5ZGRuc2RSbGdnb21yaWZpYV9eXGFqYmxsem9cXGJpYW1pd21nbG5ilaaqnYGAnqSWqqqeqKeuo5mIgZaqmZ2jiZqknKidhIuaj4WckYWSjYyMdIV6iINvjYR9l5NzdYZykYNuf4uShoaUj317goWXpY1/paWNgI2JhJR1g4eSb2yLqICCi5ONiJueiIuTqqOgkIB0lJeIfoF5lK+kf4KccY+GeZKMhYB7cqeMcX19epeWm4SNeHt+foiUlZOLd5GZoKGEe36Ja4yFW3l5c3lwaW5+kolxf3SBj5STcYWDgmWNf1+BgIx4dnSUdW97b26JboSGX3dpeI5mgoOGj6qcf3R9l2qJiG9/dXyEdW1sZoxzd3uXd4Rbalh5j2hud3Jxb3d4b11shm1pZ1ZaX1dcZGtkVWFVXlFfb3d5a2p3ZWpqanV8cHF0c2FvdWJze4F4dXqBdX+Af4F5i4WCfXttf2xkeW5eV25naHVreGppaWRcYFpjaWVscXVuWltia2Rra3ltaGxvYY6Vuqmni6Gim6akmaSdq6Kgg4OWqpGdoIiZppqomIOBm4t+lpSHjoqJjHKCfI99fo+EepeOdHKEcJWGe32Si4aGkIV4foCGmKOMe6ehi4WPj4SVgoaOmHdxhKqFjZGcj4eenYaKmqigoKuDiY6Vm39+ipetqJCTp5B4cZ6Tg3uTcH+phnB9lXFqb3yBn4t/ko6LaG5dhIyMnJygj3OVjIhxdGuCdnSAWXJuhpCBfX6LaV1pY3qFg4iAX2l4e5x8g42DdoGHg2l5jIhrYnFzg3dfco2CipColodnjY+DbneLgm+Di3duZGZjeYJ6lVpcaWZudlt6eHd0bXNygmZcbYpra2JaWV1ZWGtxW15gWV5dZnJ9enRvdGNqaml7fHJ6d3RkbXRobHt+dXp8e3l5f4B/cIaKhHt9c356cn9oVFxyaWx2cHVna2dkXWFZamhranFybVdbZW5sZ3J5b2hqbWCMjKuxoZCjoZqfnpiemamjoX2ClquMnpSHmqGQpJR/e5iEfJKZiIiGhopyfYCLdoWLgYSWinJvgHKZh4R+koOEhoqBeoCEi5qfj4KmoId4jZeIlYuLnJeEg3qsgZCXmZOJnZyGh6Grn6Kio4uIk5udo5mWqqKop6GTnImYkHx5j4+FqH5+kpGSk5yxpZqUnZCNsZKYhKaMjJacoIqRnIOJkoprfI52d2WChpCKfImdhIeLj4eIgIWEkHd8e3Wbo4mIi5+LhpV/fo2CgXZxdIaFf3iJiIuRp5GEh46Ig4yQi3uFiYeNgHVrgYN7eZlpcmhgdIpwfXp3dm92c4FdXW+HZ25fX1pbXFJncVVjW1thbGh0e3xybnBkamlof3tteH5waG9wbGaAe3KBgHd/fX+Ee22DjIZ8enh8fnqDeE5kdmpzbnF7ZWtlYmJgW3NmcGZycWxVXWx0bWh4enBnaWtljYieup+WoqGYlZmYlJikoJ17f5ipjZ6MhZ+cip2WfHiUgnuOmYmGg4SHbXiBgHKAh32Hk4Rta356l4eEg5B+gIaEhn2Hg42bnZGGqZ6CcYqPhZKRi5yRfY16qYONkZeVjpyWhYWbpqCimp2GhJOamZmQmaagpp6ekJeCk4t4fYiPhaZ8fI+QkYWYqqCck5yPjaqNkYCejYmUmp+Dj5h/h46DcHiGcXRhfoSPhnWMmICCjoKGhH6FhJVueXZ1lKOMjoabhYWOdYCLfX1zc3yJhHt5jY+Fk6iQh4SPgoOKiYl1hIaHiXtuan1/e21oa2xnXnl+Z3x7dnR1dXp3XGBwfW11YGNaW15RZm1TZVpdYWtpdXp+cGttY2tpZ4B/a3J/a2pzbnhug3luhoB2goB9hXZygo2Hfnt6fIB7gotgaXtrdWhpg2VqY2BpW2N1aG9idW1rVGJxeWVveXpyZWptbYuKn7iaoaSfk5GWl4uan56de3ecpZCbiYaklIqYmXh5jYV8iZGDjIKCgmx7f3hygIR8iZB8a2h9gpeJgYiOfH6GhId8j4CPm5uQh6acf3CLioyShqChioWMfKeRiI+SlpOWknaMo6ChnZaaf4KRmpmTjZqioqSbmJGcf4+GeoGFj4ihgH6MjY98l6SgoJKZkJCmjI+BnJKKk5ecfpOTfoeOgXZ0gnB2YH2AjodyipZ8h4pxjH6ChYaPaHhyeY2Zk5CAmH+JjHOCiH19cnp8jIV7e5KOhJemlIyGkXyFhoeFdIGChoZ5ZHF6fnh5cGxqZl59c2h8dXVzfHN/al5gdHZwd2RjWF1eUmpoVGRYXmFoanZ4gXFma2NsaGV/gGptfWdtcGp9d4V6a4uBcoGBfYF0doKMhn98eoCBfX+PanKDbnRpYohpbGJfcVV0b21uYHhobFdqdHZidXp7cWJrb3mJjZ+zkqWlnY6QmI+GnaCanHx1o5+Nl3+MoYqImpV4e4aHfoOJfoiCgX9wfnp0dYKEfYiQd2djfYaXi4KKjXh9gI2DeZaAlZeVjZWfmn1vi4GQk4alm4eMiYOmlYSSipWXkpF2kJ2hoZiUmHqAj5iXj5eanaSemZOUnHuRh4R4hpeOnn6Cio6Mc5einqCSmI6PooyLg5iZhJOWmn+YjXyJjYF3cn5ue2SAfIuGcIaTgI+Ba4eDgYCJhWZ2b32Ik5mOfpR5jIl9gIh9fHKAeYqGeoWSioyZo5eDhIx3iISCgXZ6gIeEdF93d3xzfXdma2NgfmlqdnN0dX1xfGNjYXNudXJtYVlfXVprZFJiV19gaWx1eYZwY2pjbGZofINraHRobG9of3yBeG2PhnGAgoJ/dHyDjIGAfnqCg358kG11iXR0bWWKbGphY3VWg2lwbmB4Z2xhanZwZnl7eXFfcWyFhZCdrpinqJ6OjZeHhZ+Tlph9dqibiZh5lpyLjJiPeHuAi318g3uAgoF4c3h5c32Ag3+IioBkXn2LlYh+hYh0fX6Kf36YhJaTloyjoJd+cYd7k5GKpo+MjoqSoJGDkY+Tl5CKgI6XoJuSkJJ0gY6SlImdnZ6nmZiOlZh1j5CLbYaZkJl7h4iQiW+XnZqik5SKjZ6MhoGTnX+TkpaHmol8ioqBenJ6a3Vse3+Lfm6FkoOTd2+ChH5+i4Blc2p9gZeYhYCOdJGJhHqIfnZ4gX6HgX2EjoaNlaWReYWCdImHfX9ydH+GgmxgenR5cHxvYW5iZHthbm92c3d3c3NhdmBvbHVub11bXl1dal1PXVdiYWhtc3qJa19qZWpjaHeIbWZsaGlsZ4B8endvj4dzgIOEfXSBhol6g316gYR9fY5yeYt5eG5sh2toX2pyY4docW9ldmdtbGF6aGt8e3hwYXdti4GZmqqhpKmeioqRhoqeipWXfXasl4yWfJ6TkZaUiHZ9e4p8e4B2d3+Ab3Rzem+FfYGAiX58YVx+j5GGgISEc3qAhnqPkYeRkZuSpJqTgXyBfI2KkqOIjYqNl5qNhZGYk5WOiIiLkp2UkY2NboSQj5GJnpmioZeXiZeScIubhWeHmo+UeomFkIpwlpqToZKSiIuZjIJ/kZ59ko+TjJqPe4qFh3RzdmtxbnV8i3RuhpGOknF0gHyCgoh8ZXFten6blH6FinWRi4F0iXpvgX+CiH2FjYqGjpaqjnuIfX6LhXd9cG5/hIJiZ3dzdG56Yl5wYWp0XnBqenh4bHJwZXldbWxzbXNYWl1fYWpaT1dXZGNmcXF/iGVdaWhnYmdxjW5kaWdlaWeAend1b46Ec4GBg3x1goiFeIV8d4OFeoCKd3+Le3tyeYNqal9xaXN/a3FubXFnb2tle2Juf3l2cGt2d4l/o5iiqKGnm4iMioGPnIaTnHSAqZSRjYagjJWTkH9ze3aFd3h/cnN7hWtyb3ltiXZ/gIZucVtZfpKNiICBgXZ1gH9/oIaPipGcl6CTlneJfoCMiJydiY+GkpeWhYiUmI+Wi4uMjYydi4+RhG6Ji4+RipyWoZyYloaYiWyGpYVnh56KkX6MhIyBd5OYkZ2RkIiJlI1+fpCYfJGNkI6akn2LgINvdnBsbW9we4Zpc4OOmIpwd4B1gomDeWdzb3aCm499ioV7lZJ6d4p1cYp8h417i4eFio+cpIl8hHaBi4B3eG1pf4F/XHFycW9veFpecGFval5vaXx6cG1tam13YHBva3FtWVhgYWFtV1FTWWVmYnVwhIJiXWttZGNma5JtYGZmX2drgXRxcnCLgHR/goB5doCLgHmGf3eHhnaDhXuHjIB7dop/anFjfWOFfG9wbHRqaG5sdndfcX55e3R1c3+CfqWVmq2fp5aFjIN+lpSDj550iZ+TkoWKmoyVjYt6cnd0gnByhXNxdYhsbmx1bYh3g31/bW5VUYGrlIeCeYB2coJ5gqCCkYGSkZebkZl3kHqCjJKkmpOOiJWYkoOGlpiLk4uIjo+InoWRi31zi4WIj4icmZ+blpWAlIBph56JaIehiJKEkYSKcYORl4+ajo+Mi4+Nd3uTkHuOi42Sl418iHyBa3dqbmtsbXp/Ynl+jpaBdnqBd4ONfHpodW11iJaMf4mHe5SRcnqFcXiOe4uNe4l+hI6Rn5+GfX14gYt9d3Boa4CBd153b21rcXJVXm9icWFfbW55cGdwZmZ0dWhxbGF3ZV1WZWBgclNQTltlZFx4cIh8XlxpcWJiZWaRaV9nZFtnb35va3Fzin12fYWAdXZ/jHl7hoB4iINzhoV+jIyEfHmVeGZxa4Rgh35vb2t6YGltdH90X3R8eIZ3c3OFfHmhkJqxnKWOgop/gpmIgIudfoqYko6EiJeOjo6EdnR2c4Bwb4VzcHGDb2ppdW2Cbn18bXVzUk6C38mS1pN8b3SDdYOfgpF2lJCYm4+Ye5NyhZCfoZOTkImSm5OFfZWVh4yNh5KNiZx/joF4eox/iIyKnJucm5aUeo53aYqTiW2JpIWTiJiDhmOMkZiNlImWi42Ji3B6lYl8jomLk5GKeoV8f218ZXNva2x6eVyAeY+OgHt9fn+Gjnt6aXVrdIyQioOGhn2WjWx/f3CBjYCOiX6Ee4ORlpubi313eIKQeXNsZW9+gmtpdG9naHNtU15uZHBaX2tyeWdra2JneHNvcWRfd2BhVmtfXnZPTUtgZWNceXGKdFxbZXVgYWVljmNgZmJYaXJzbWtxdot8dHmGgnZ3fotzf4Z/e4l/comHgZGKiH1+mXZlc259ZYh/b3BrgFprbnl5c2B2enuNdnJ3ind5n4ybr5ugkIKFeIiUfnyJnIeEnpCOhYyXhJOOh4F0d3B5cG6Eb21ufnJjZHhwfG56fGpobGOkmsHcru+ic2t1g3WEoYWRbpWPlJ+UmoGRcIWLo5eJjpWKkJ2Vg4CUj4SIj4CSioqXfod7dX+JeIaFjpual5mPkHaLd3CIiox+jKWFk4qdhYZei5SXiY6IjouKhIlsfJeCfYiFipGPhnaFfn5rfWN4dGpveHNYiHqRh4V6f3+AhYx+emZ0aoGLj4uEhICMmIZsgndviZKDkYV/gnuBkZeTmZF1dHiGjXZzcWZ0eIFhc21vYWh1ZlJgcGdrVV5tdHphcmNgaX1xcm5bY3JhY1duWlx3TU1MY2VhXXZzim1bXGR4XmBkZoRfY2NeWWlya25rcneLfXN3hIF4eHyJcYOEfX2Ie3SLiIiVh4x/f5hzaHVxeW2Me250cIBXcHl2eXFkdniGjGl2gIpygJ2Imaeco5KEfHCMlHh5ip2DhJ+NjnyVjYCZh4R7cndwc2pvgWtpbHx0XmB4dntwdHpnYGV869q1ycPciXNsc4B2ipqIjWmXj46clJKBiHCFiKCOhIqVioyXk3yNkoiCiI96kYuGj4KAd3iDhHKHgpOblpSYho12h39xhoOKiJujhJWNn4SJYYOVj4WIhomMh4CHaH2Uf32ChYmOjoJxhn5/cndndnJpdHdsWox9koKFfYCDgISKgnZidW2KgpGMg3+Ak5J+boNteoiRiJOFfYJ+gZOUkZeJb3J6jIZ1bHBqcXd/XnNoblxpdV9SZHFoZlNfb3d1YG9gXWiCcXJqV2dpY2lYbVdbdUxKTGVmXmFyc4VoW1xleV5eZGd6YWRfXVlrbmVuanR3in5zcoF+e3Z6h3SFg3x/h3d2ioWPmIKNgnuTdmx3dnl4k3VueHp9WHmFcYBvZ3h2kYJkdoaFcYqWhpmhm6KKhnNvkotydo6bfYmZiIl7n3+EmX+BeHF0bm9kcn5oZmx3d1tfeHt6cXF/aWFnYX/Vto6Rp3hucXd7cZKQjYdqmI2Im5GLhntoh4uZhoGSkIaGl417jIyAgImNe5CNfomFenV7g3txhoCVmY6SlIKJdYSIeISAjJWeoIeWkKB/iGF/k4eDh4OJjX9/gmZ9kYB+f4KMj5B/bYN8gnRrbXd1dHd2a2ONgY5/hH98hH+FiH5wYHRyhn2QjoN9gJKKenGEZ3uFjIiNhHyFf4GVkJGThW9weYt/dG1uaWp4fGFnaWlYa3VaUmlyaWJQYnJ5bWJlXlpqg25zYlxnX2VtX25UWm9OSE5mZFxmbnKAa1pbY3NfXGNsd2RlXV1abGxibWpzdoaAcW9/fH10eIZ4hYN8gId1eYmBkpV8iYZ2iYFweHl7hJNvbXuAdl6Df3SBbWl6c5RzZ3KIfXKSkYSan5ughoZ1dZR+bXaTl32HkIOKjZl8jJp2fnZxb2xqYXR8Z2JpdXlaYHd7eW1xfmVjaGhXnY9fcnOXvMSEdnGUiJB+cpaLhpuSjIdyaoiPloB7lIyBhJqMfIqFfHuJi3+UiHWJhnZ3fYFydYaBnpSFlI+Dg3KAinaFfIqanpmHlY+dgYlmfZOCfoSDiYlygX1mfox8eX9/h4uPfWmAfYN2Zm95eHN3c2xrjoWKgYqAeIKBhYN/a19zeXt+jouGfIKQgX5zgml6hImMhoV5hH2CmY6RjH5ubXuIfXZzbmdme3ViW3BiV25xU1Nuc2hhTmZ0eWZgXl1Zb4Bvc1llYl1qbmBwT1lrUURTZ2Baam5tfG5ZW15tY1pib3dkZ1xdYGtpY2xqc3aBg3Btf3x/dHWDeoOCfIGFdn6IgZaQeISLdIGIcnl5fo2Qb297gHFpgXh6fm1se3WVa2p4hHRsk42Fn5igmYSIbn2Mdmp4l45+gImClJeJeY+Wb3pzcGxpZGBzemhfZXF6WmByfHlncXphZWWPsbJ3S2JapdrQlnF7kIqQeH2TioSYkYyFbmuFkpF6eZKGgYSYinyGf3h3iYqEloBvi4hxdX56anmFg6WQhJONg39vf4R3hHmHnZqVjJSRlYWIcHuSgnyCg4iDboF3aICEeHJ/gIOKh3xlfX+EdWNwc4BpeXBvdZmNhoOKfHZ4gIV6gWpccn9zgomGin6HinuJcoJucoWIj4aGc4R6gpqOjoR4bm9+hH92eWRnaXtwXlh2WlhwbE5XcXNnYEtsdnVhXlxaWXR9c29XZ11manJgb05XaFI/WWZeWnBraHpxW1pZa2VaY3F5X2hcXmVsaGVraXF3f4hvbH9+gHVvgnuAgn+Cf3aBhYiXinGCjXF7hnx6eYSTjHVqen9rb350f31vcnt6k3BvgX94Z5KLg6GZnJKChWaGg29neZWIfX6EgZiJgXyNjGl4cmtrZl9gb3ltX2JveFxka4J6YXF2X2Vl1Oq9izI6PouOf3F4hYiOjXaDlox+ko2Mf21shY2MdXyPf4WBlYh8gnhudoeEg5d3boiFbHV7dGZ5goOni4KOi4R+boB1d4V6iJ6RjZGTk46Lh397koZ3foOMgmt/cmiAfnhtfHyBioN3YXmEgnJkcWh+bnVxdYKbi4B/hYBzdX6Bc4FvXG5/dXmLhIt7h4F9iXl7cm2JhJGFjHOCeoCXjIt/dG1rd4CAdHRcaGd2b1dWe1JZcGRMWnJyZVtJcXhvXFtbWV10fnRoWWJbZ2ZuY2lNV2ZRPV5lXF11ZV90b1pZVG9kWWRxeVpoXV9mbWdpa2lwd32ObWmChH55boB8fIF/gnp1goGNk4RwgItud32Ae3uIk4l/aHt9anN7coZ7c3d+f4x6eIR9fGyMjYSbnZaMgIBsjX1raH6Ni3p+foOTgn59iohrdXFnaGJbYmdzb19ha3NgaHCIemJzdF5jZJugj25cNVqvtXRpgIh8koZ1hZaGc46KiXZwbIWDh3V5iXiJfJOIen5yZ3WJfn6Yb3GGfmh2eW5meYeEpIeAhoyJfm5/doCCfo2aiIOVkpmKi4WJfI+IcHp9hHtofmxqgHt6anp3goeAcmB2gX9yZHJndoJtdXuGlZGBfIKBb3d6fHV/bVlwgHd1jIOHeIh2g4l7eXRvioGRgoZzf35/lImJem9uam6CgXRuXWdkcnBQWnpNW29cT1xyb2RVS3N4aVdZWVphcYB0YF1dYGdkaGlmTlpoTUBgY1tgdmFcdGxYV1N0YVpkb3JXal5iaGtnbWxocHd8k2xohIp8fHB/fnuBf4J6d4B/iouDcXuIb3F3g397io2Pg2p+e213eHaKd3x4gIKHf4N+fnpthIyImKONhIN6dYt4a2yDh5B4fXqBkYCAfoqDcHJxY2ZeWWZfb29fYGdwZmpviXRhdG9bYWRqdnuAv5ympMi4cYWDcpJ8eIaTg3OQi4dxcm+De4N0dId0iHeUiHl5cGN3h3qAk2lyhHZnd3VjanyCiJ2Bf3+Oj31zgHSFeoGSkIN6l4+WkIiCiHuIiGt4eX50Z3poa395c2l6doCDfWhgd4d+a2p0aHuAaXaBjJGUfnp+fnB8dnx0f2JWeH5zc4uFgn2EcYeKeHlxcYSDjoB/en59do+Gg3ZpcWltiIFxb11nYXFtSWR1S11tVVRac25iUU90eGFSWFhdYW+Cc1thXWhlZWRrZFFbcElDY2BbY3BeXHZnVVZVd15bZW5oVmteYWlnZW5uaHB3epNtaYiMeX1ye355goGBfHZ9g4iGg3B3hHJtd4KCfoqMk39wgHt3eXqBi3SDeH+BgYKEeoB1b36Ki5ueiH2FeneFe2d0hYyPeX5/e4iFg3aPgGdwbl9kXFhlWW1yYWBgcGxraIluYXRpWV5kboB3qdqqx4aHsnGJd2+MdXuGjoB6kol/dHN0fneAcHF/bYR0lIZ4dWtgeoJ5iY9mcYRwZ3ZuW218gJCTf4B5kZN+eXxuiHeCkoyFdZeLko+HhYZ7f4RsdHZ+bWd2ZG17dW1pd3Z/f3xhYniFemh1dWJ9e2d1ho6NlXt0gHZxgHt9bYBaV3V/cHaFiH+Bem2JhnR6bHaBhIV/fH55fHSLgn5zaHRlbouDbHNaaV50ZEdtbUtaYVdWVndtYlBSdHZYUFZYXmFxhG9cYGNtZGReb2NVXnJGQmVfXWZoXVt6YlFVXHVbWmdrYVZqX2BuZWZrcWhwdniOdGuOjXV+dnh+d4GDgXtzfYOIh4NvcoB0cXV+hYKJjop7d4B4g3t8hYd4h3x9gX6EgHt+c3Z5jI6gjYl6iXZ0g3hefYWYi3iGg3SFhoR3iXpibm1cYltbYVZpc2NgW2dub2aHcWFxZlddY2x/fMrOh7mham1timxxhHF8g4l+e5GEeXhzeXV1e2psdmOEdZKCd29mXn2CeouKZXKCa2pxY1hteoWbiIKBc5eUeH99b4pyhIuMiHOYj5GJhouDe3l9cHBvfGZocWJteHFqa3F4fXx6XWV5gHdpdnhmgndndIeMjpR9codqb36BeW59XVlzf251gYt8gm9wioBxd2l4gIKAgnd+c3t1h317c2dzYW6LgWtyWGpedltHbWpMVlReU1V7a2FPVHVyUFFUV15idIVpXWBsamZjWW5hWWRwR0BnXGBmXl1We15PVWRwWltqaF1XaGBecmZrZ3FncHN3hnhulYp0f3p4fnmDh4B1cn+GhY6DcHB7eHZ1eoaFh4yGenx/dIt+fYaEhId/fn59h398eHZ4eJGTn3+MfIttdX94ZIKGlYVzkYpvhYWBeoN0Y25qWV9bXF1UZ3JkYFhkcXJmgXNia2VXW2Bqf3e+rnugtm5ic4Zoc3txeYGEe36Mfnd3cnZve3Zlam9gh3WOgXNqYl5/eHmLhGZxf2hra1pWb3eJo4GEf3GZk3KBeXaEb4KDkYh0lomNiIWJhX14dHFuaHhfamxfbXZqZ2preXd6dlpnfXx4ZXJ+boR0ZXWFjYaWf3CMZ2t6hHVudWJdcX1sdX2MfIJmdod9bnFpdn95f4Bzfm17fIJ7eXFmbGJtiX1sbldqX3ZVSmlqTlFOaE1Ye2hhTlV2a0xRVFVfZnWDZl5hcWhnYldpXVxsaEpEallhZFdZVXlZTVZtallda2RcWWVjXnRmbGRxZ3JwdYF4cJmFdn9+d398hYd9dXOCiICVg25zeXt6c3KFh4mIg3mBfnWPfnyEio6EgoR7fouDe3Z7d3eanZd6ioKGaXZ9e2yDhJJ/cY6BcIWCfoF/cGZsZ1hdW1xbU2RwZF5XYnJ1aXVwZWViV1xcaIBwb3KAc4lkZHh+aXR1c3KBg3eAhHl2c3Vua3pxYmdrZ4Z0jYNuZl1ffXB7iX9pbXlnamRVV3JvjaZ8hHt2lpF0fXN9e299fJGGeJp9iIaDhoN9dW9xbGd0XGxnXmx0ZGdlaXpve3JZZ4B2dWhwgXiCdmJ3hYt8lIFvjGpte4JxZ3NmYW56Z3N4i3x+YneDd2pscnZ7cXt6dH5nf3+AeXdvZGZiboV8bGtWaWJvUkpoak9LTm9HXntmYU1VdGNKTlNXYWp2fmVdZ3NpZmBWY1djcF1MS2pYY2FVVFVzVkxYdWRaXmtgXFpjZV92Z21icGlzb3J/dXSZgnd/gHd/f4aFen10goR+l4Vuc3R8enRxhIWPgYB6i3Z0kH98gZWOgIWEfX6Mhnt+gHZ7o6WKeYiGhGt1fHp1g4GLem6Ec3mEfYGDdW5qaGVWXVtaWlNibWRbWGFze2lobWlgYldfW2qAamtwgGdrYGh5eGpzdHNtg4B6f3x1dW56aGp5al9lbmiBdpCEZ2VYYndqfod7b2pwZ2ZdVVhvZ46od4F6fJGOeXZxf3B0d3qQgXmWdYaDgIWIdmpxdWdnbltsY11tcl9nYWp4aHttW26CcnRqb4F+endhd4WEeI+Fc4hyb3mAcmNxaVxxeGRydIl8eWN0gHFoanp1cm15eHZ5ZIR8f3l3cWRkY258fWtrVWhhZVJKbGdPR1FrRWF4Z2FNU3FdSk1UWmVrdnplX21xaWRdVmBWbm5XS1NoV2VeWE5VbFRKXHlfW19rXV1bY2VgeWhsYG9vdW5weHV6mH13gIF6gICHhnp4eYJ+gZOEcnV0f3l2dISIkX2AfJBrc5WAe4KfhX6HfYB/hoKAint2hKuff3qIiINrcoF5dYB/gXRuhm58gHOKgGpvbWRkWF9aWVpUYWpnW1pedIJpXm1sXGFXXFxsgWVydH1paVxrdnVnc3ZxbIR7fXx4dXJseWdpeGZdZXNoeneTgWNjVGVwZ4KFd3dnaWpgV1ZZZ2OPp29+d4CLjntxcn5oenB7jn14kHKEfX9/hm5kdXJkZ2dcamFcb29cZ19tdWR6aF10gG9ya3J8fnV2YnSFi3uIh4GAeHJ1f3VhcG1bcnRjcXOFfHVlc4BtYW17cGtqe3l2c2aGdnt7dnFlYmVtcn5qbFRoXVxUS3JiUEZWYUdid2dhS1RvV0pMWFhna3V6ZGVucWZkWlddWHZlVEpcYldnWFlJV2VQSGJ4Wl1fbFteXGFjXn5pal9udHhtcG52g5d5coGAfH+JjIZ+dXWGeYeMfXR2dYJ5enqCjI59foSJaXOWgXqKnX1+hXqBen98hohzcY+tjHt7h499ZXGHeXN8e3VyboVse35sj3picG9iZV1lVllZV2Nma19dXHKFaFhwblteWFpcbHtjcHd2bWJabHNzZ3R1b2yDeH6AeHdubnRkaXRlW2d1ZnZ2knlfXVJmZmqDgnR+YmRpXFRYXmJjj6RoeHSDhpB5bnB7aXlufIZ8dopzgXh8eH9oZHZsYGZfXmleXHNrWWVdb29iemVbd3xrbm5veHlzdWRzg5J+h4OJe3Zwcn5zYnhkXHBwYnFygn10Z3KAZV5ud2llaHp8dW5vgnV0fXRyYl9mbm59ZWlUZ1hXU013X1FKWVhIYnVkYUlUbVNKTVpXaWxxe2JsbHNjYlpaW2F3XFNMZF1YaVNXSFlgTUZpdVheYGxbW19iYlyEaWdhbnh5bG9qdoGQeG2DfoCBk4iEgXZziHSMhnRyd3aCd3x9foyQgH6TfnB3lYN8mZJ5gIB4en6AdIiDdHCZont6f4mUeGR1h3hzeHVrc25+a3h8cJFyXnBvYGdibFRaWldoY21mXFtxiWVTcm5bWlhYYGx2Y2l1amleWW1zcGxzc3NphHx/gHx2b25sZGlxY1trcmR1do5zW1dTZWFygH9ygl1iY11TWmBcY5GfZXJxhYSRdGxse25wcXt9fXKBeIBzenp6Y2V1aF1iWWBnWl52aFdiXW9oYXdgW3t2aWpybnhzcnVocYKVg4d+hHZzanF9bmZ3WF1sbmNyc4F6dGdvfltgcHJiYGtyfm1tdX9zcXhrcGFcZWxsemFnVGZUVlFQdVtRT1hRSGN0YmBGVWtQSVBaVWtranxlbW5xYltaWFlscVdSUGdXV2hTVEZZXE5IcnVYX2NtY1hgYGFdi2pjZG15eGtwaXV5hntrg31/hJp8goR5fIduj4Zxbnd6fXSCgnyLj4KCl3R3gpOFgZ+JdYGAgXR/gnGHgnVvopdze4aLhntld4pubXpuZndwemtzdnKMa150bmFnZWtSXVtVZ2Fsa1pccIxkT29uXVZYVWdpdGhidGVlXVltdG1vdXR4aoZ8f3yIdo9zZGRrbmFcbm1jc3iHa1pUVmNkeH19cYZdY19jVFpgWWOVlWNucIOFinRraHxwZnR4dX1tenV2b3p+dV5lcmNbXVZhY1hhdGVVX2BtZGFxXV1+cGhpc3F0cHV2a22Ek4GJe4Vxc2dvfnFzb1RcZ2tmcXSBd3NjbXZWYnJsW19wZ35mbXd+c3Nza21gWmRqandfZ1RkVFVQVG1XUVZTT0dkc19hRVhpT0hXVFZtaGR8aWt3a2JXXVVbdGRTUldpUllmVFNIWlpQTXh2Wl9lbGlZYmBeXo5uYWZreXVub2l2dn9/bIOAfYeXe4CHgYl+a5OIcmd0gHt1gIJ9iI5/i5NyfIqRhYefhnt/hoxzgYZzfoJ2bqWMcoGNi3Z3bXqMYGR7cGZ4cnhsbXF2gmdke2xjZmdoU19eVWdfbG5bXm2NaE5pbWBUVlNuZ3RrZXhkZFxYb3NscXp3cmyHe4B3nHp5a2FlbG1eYG9qZXF5fmdaVlhgbHh8e3CEX2JeZ1ZYX1dkm4hia3GBh314bGt5blx3c217anZ0b297gHJYaW1eWFxVYWJXZHBjU15haGFibFpgfmtma3N2b213d2xphYx/iXuIbXFmcX1uc25jWmFpaW90gnRzXmltU2VxZVVjb2N7ZHJ3fHdrcG1rYFlhZ2h0XWVWYVVSTlhlUk9cT09IZHBdY0ZZaU1JX0tYbWRfeGhufWRgVV9UXXVcVFNgZ09dYVVTSlxZUFl0dV1fZWxoWGNhW16NcWNnanhxc25odnR6g3KCg3qIjn58iYeNeW6QinRsc4J0f3+HhYaShJWPeX6Mj4eRm4SAfIyFc4CBc3R4cm+Tk5OTk5OTk5OTkpKSkpKSkpKSkpKSk5OTkpKSkpKSkpKSkpKSkZGRkJCPj4+Pj4+Ojo6Pj46OjY2Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2NjYyMjI2NjY2Njo6Ojo6OjY6OjY2Ojo6Oj4+Pjo2NjY2Oj4+Pj4+PjoKAfnp6fX5+fX1/fn59fn5+fn5+fn+Af4CAgIGAgIB/gIGBgYOHjI6Ojo6NjY2NjY2NjY2NjZKSkpOTkpKSkpKSkpKSkpGRkZGSkpKSkpKSkpKSkpKSkpKSkpGRkZCQkI+Pjo6Ojo6NjY6Ojo2NjY2Njo6Njo6OjY2NjY2Njo6Ojo6Ojo6NjYyMjY2MjIyNjY2Njo6Ojo6NjY2NjY2Njo6Ojo6OjY2NjY2Ojo6Ojo+Ogn99ent8fn59fX59fn5+fn5+fn5+f4B/gICAgICAgH+BgYCBg4aMjY6NjY2NjY2NjIyMjIyMkpKSkpKSkpKSkpKSkpKSkZKSkpKSk5KSkpKRkZGRkZKSkpGRkZGQkJCQj4+Ojo6OjY2NjY2Njo6Ojo6NjIyMjIyMjY2NjY2Njo6Ojo6Ojo2NjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Njo6Ojo2NjY2NjY2NjY6Ojo6Cf3x6fHx9fn19fn19fX59fn5+fn5+gH9/gICBgYGAf4CAgICDhouOjo2NjY2NjIyMjIyMjIySkpOTk5KTk5KSkpKSkZGSkpKSkpKSkpGRkZGRkZGRkJCQkJGRkZCQkJCPj46Pjo6Ojo6Ojo6Ojo6Ojo2MjIyMjIyNjY2OjY6Ojo6Ojo6OjY2MjIyMjIyMjIyMjY2NjY2NjY2NjY2NjY2Njo6NjY2MjIyNjY2Njo6OjoN/fHp8e31+fH1+fXx9fn59fn5+fn5/f3+BgYGAgICAgYCAgIOGi42NjY2NjIyMjIyMjIyMjJFtZmdnZ2dnfYWEhISEiF0tMDAwMC1GoaGhoaGhoJqZmpqampqKg4SEhIOEd2VnZmZmaFxDREREREFSzNrY2NjY3Itpbm5ubm9qZmdnZ2dmb4SDg4ODg4OLjIyMjIyMjY2NjYyMjY2NjY2NjY2NjIyMjIyNjY2NjY2OhX19e3t6fX58fH59fX1+fX1+fn5+fn9/f4GBgYCAgICBgICAgoWKjI2MjIyMjIyMjIyMjIyMkWdfYGBgX155g4KCgoKGUxgdHR0dGTekpKSkpKSjnJycnJycnImBgoKBgYJyXV9fX19hUjQ1NTU1MkbY6ufn5+fri2JnZ2dnaGNfX19fX15qgoGBgYGAgYqLi4yMjIyMjIyMjIyMjIyMjY2NjY2MjIyMjIyMjY2NjY2GfH16e3p8fXt8fn19fX59fX5+fn5/f3+AgYCBgYGAgIGBgYGChYqNjYyMjIyMjIyMjIuLi4uRjo2NjY2NjY+QkJCQkJCMh4eHh4eHiZOTkpKSkpKRkZGRkZGRj46Ojo2NjYuJiYmJiYmIhYaFhYWFhpOUlJSUlJWNiYqKiomKiYiIiIiIiImKioqKioqKi4uLi4uLi4uLjIyLi4yMjIyMjI2NjIyMjIyMjIyMjY2Njoh8f3l7ent8e319fX18fX19fX5+fn9/f4CBgYGBgYGAgYCAgYKFioyMjIyMjIyMjIuLi4uLi5GSkpKSko2RkpGJh46KkJKSk4+Ojo2RiI+RkZGRkJCQkJCPj4+Pj4+Ojo6Njo6Ojo2Njo2Njo6Ojo6Ni4uLi4uMjI2NjY2NjY2NjY2MjIyMjIuLi4uLiouLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyNjY2NiX59eHh5fH18fX19fH19fX59fn5+f3+AgICBgYGBgYCBgIGCgoSKjIyMjIyMjIyLi4uLi4qLkJCRkZGPhI6QkIaKj4WNkJCQh4mHhomFiJCQkJCQkJCQkI+Pj4+Ojo6NjY2NjYyMjIyMjIyMjIyMjIyMjIyMjI2NjIyMjIyMjIyMi4uLi4uLi4uLi4qKiouLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjI2Lfnx3dnh7fXx7fX18fH19fn5+fn5/f4CAgIGBgYGBgIGAgIGChIqMjIyMjIuLi4uLioqKioqQkJCQkIqFjoiOhoaPiY2QkI2Eh4aFhYWHj4+Pj4+Qj5CPj4+Ojo6OjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLi4uLi4qKioqKi4qKi4qKi4uKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIt+e3d2eHt8fHx9fX19fX1+fn5/fn9/f3+AgIGAgYGAgYCBgYGEiYyMi4uLi4uLioqKioqKipCQkJCPhYOMjpCOiYyJjZCRiYOFhYeEhoiPj4+Pj4+Pj4+Pjo6OjY2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKioqKioqLi4uKioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMin18dnZ4fHx7fH19fH19fn5+fn5+fn9/f4CAgYCBgYGBgIGAgYSJi4yLi4uLi4qKiomJiYmJkJCQkJCMhoyJjoeFjYmOi4yOiIeGhoiDio+Pjo+Pj4+Pjo6OjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKioqKioqKioqKi4uLioqKioqKioqLi4uLi4uLjIyMjIyMi4uMjIyKf353eHp7enp8fHx8fX1+fn5+fn9+fn9/gICAgICBgICAgYCBhIqMi4uLioqKioqJiYmJiYmPj4+Pj5CMjouPjIqPjI6MjZCOjYyLjomOj46Ojo6Ojo6Ojo6NjYyMjIyLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLjIiAfXh5enp6e318e3t9fn5+fn5/f35+f39/gICBgICAgIGBgIGEiouLioqKioqJiYmJiYmIiI+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pjo6Oj46Ojo6Ojo6Ojo2NjYyMjIyLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLioqKi4uLh4B8eHp6eXt8fHt8fH1+fn5+fn9/fn9/f39/gIB/gYGAgIB/gYSJi4qKioqJiYmJiYmJiIiIj4+Pj4+Pj4+Pj46Pj4+Oj4+Ojo6Ojo6Ojo6OjY2NjY2NjY2MjIyMjIuLi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKiYmKioqKioqKioqKioqKioqKioqKi4uHgHt5eXh6fHx6e3t9fX5+fn5+f39+f39/f39/f3+BgYCAgH+BhIiLiomJiYmJiYmJiIiIiIiOjo6Ojo6Pj46MjI+Sj5COjo6Ojo6NjY2NjY2NjY2NjIyMjIyMjIuLi4uLioqKioqLi4uLi4uLi4uLi4uMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKiomKiomJiYqKioqKioqJiYmJioqKioqKioqKioqKioqKioqKi4aBe3h5eHp8ent7fH19fn5+fn5/f35/f39+fn9/f4CAgYCAgIGEiIqJiYmJiYmJiIiIiIeHh46Ojo6Ojo6Ojo+MkJOQkI+Ojo6NjY2NjY2NjYyMjIyMjIyMjIuLi4uLi4qKioqKioqKi4uLi4uLi4uLi4uLi4uMjIyLi4uLi4uLioqKioqKioqKiYmJiYmJiYmJiYmKioqKiomJiYmJiYmJiYqKioqKiomJioqKioqKhYB6eHl5fHt6ent8fH1+fn1+fn9/fX9/f35/f39/gICBgICAgYSIiomJiYiIiIiIiIeHh4eHjY2Ojo6Ojo6Pj4+PjoyNkI2NjY2NjY2MjIyMjIyMjIyMi4uLi4uLioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYmJiYmJiYmKioqJiYmJiYmJiYmJiYmKioqJiYmJiYmJioqFf3l6eXh7e3p7fHx7fn5+fX5+f39+f35/fn+Af3+AgICBgYCChIeKiYmIiIiIh4eHh4eHh4eNjY2Njo6Oi42Nj5WPiYyPjYyNjYyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYR+eXt5ent7eXt9fHt+fn59fn1+f35/fn9+f3+AgICAf4CAgICEh4mIiIiHh4eHh4eHh4aGhoyNjY2NjY+MjImKj42IjJGPjY2NjIyMjIyMjIyLi4uLi4uKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uKioqJiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJg355e3p8e3p7fX17fH9+fn5+fX5/fn9+f3+Af4CAgH+AgH9/f4OGiIiHh4eHh4aGhoaGhoaGjIyMjIyLiYyKiIeJhoyOjJCMjZGOjIyMi4uLi4uLi4uLi4qKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiImJiYmJiYmJiYmJiYmJiYmJiYmIiImJiYmJiYmJiYmJiYiIiIiIiYmCf3h7e3t6enx9fHx9f39+fn19fn9/f39/f4F/gIB/gICAgICAg4aIh4eHhoaGhoaGhoaGhoWMjIyMi4yOjoyKioeEiIuKjIuNjo+Li4uLi4uLi4uLi4uLioqKiomJiYmKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiomJiYmJiYiIiIiIiIiIiImJiYmJiYmJiYmJiIiIiIiIiYmIiIiIiIiIiIiIiIiIiIJ/eHp7enp6e3x8fX1+f35+fX1+f39/fn+AgICAf3+Af4CAgYCDhYiHh4aGhoaGhoaFhYWFhYyMjI2NjJCSjI2Ii4mJi4uLi4mLjIqMi4uLi4uLioqLi4qKiomJiYmJiYmJiYqKioqKioqKioqKioqKioqKioqKioqKiYqJioqJiYmJiYmIiIiIiIiIiIiIiImJiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIiIiIiIiIiHgXx4e3x5enp8fHx9fX9/fn59fX9/f39+fn+Af4B/f3+Af4CAgIKEh4eGhoaGhYWFhYWFhYWFjIyNkY+PjZGJjIaJjIuIiImMiYeNjo+NioqKioqKioqKiomJiYmJiYmJiYmJioqKioqKioqKioqKioqJioqKioqKiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4WAenl9e3t7enx8fHx9f39+fn19f39/f35+f4B/gH9/f4B/gH+AgoSHhoaGhYWFhYWFhYWFhISLi46PjoyLj4iHiYmMjYWFjo2KiYyNi46KioqKiomJiYmJiYmJiYmJiYmJiYmJiYmKioqKioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHhoaHh4eHhH55eX16enp7fXt8fX5+f35+fX5/f39/fX5/f3+Af39/f39/f4CChIaFhoWFhYWFhYWFhISEhIuLjI6MjI2Lh4mIiomGgoeNjoiKi5GTj4uJiYmJiYmJiYmJiYmIiYmJiYmJiYmJiYmKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIeHh4eHh4eIiIiIiIiIiIiIh4eHh4eHhoaGh4aGhoaGhoaGh4eDfXp5e3p5enx8e31+fn5/fn59fn9/fn9+fn+AgICAf35/f39/gIKEhoWFhYWFhYSEhISEhISEioqOjYmIiIqKh4iHiomIioiIh4qGi5GPiomJiYmJiYiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHh4iIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGh4J8eXl6eXp7e3t7fX5+fn5+fn59gH9/f39/f4CAgH9/fn9/gICAgoSGhYWFhISEhISEhISEhISKi5CPiYmJi4qHh4WHiYuKiYSLjYmOjYqJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiIiIiImJiYmJiYiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGgXt4enp4e3x7e3x+fn9+fn5+fX1/f39/f3+Af4B/f39/f3+Af4CChIaFhYSEhISEhISEhISEhI+Qj4+IiYuIhoeIiYuLjIuKioqNio6Oj4iJiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoaAe3h5eXh4enp8fX1+f35+fn59fn9/f39/gIB/gICAf39/gIB/gYKDhoiGiIaDhISEhIODg4ODkpKOioeKi4qLh4uNiYqJi4iHiouIio+SioiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhn96eXh4eHl5eXx9fn5/fn5/fn1+f35/f3+Af39/f4CAgH+AgH+BgoOHjo+PjoiHhIWFhoaFhYWSkI6KiYmIiImKioiIh4aKjIiHiYmOkJGNh4iIiIiIiIiIiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4aGh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWGf3l4d3d3eXp5e3x9fn9+f35+fn5+f35+fn+Af4CAgICAf3+Af4GBg4eOjo6Ojo6Mjo2OjY2MjZCQjomHhoiJiYeIiouIiYyJiYaKjY6PkYuIiIiIiIeHh4eIiIiIiIiHh4eHh4iIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhYZ+eXd5d3d6eXl8e31/fn5/fn5+fn5+fn9+f4B/fn+Af39/f39+gIGEiI6Ojo6Ojo6Ojo6Ojo2NkJGOi42JjIiIiYaHiYaIioiHi4yLjpCQiIeIiYmJiIeHh4iIiYmIh4eHh4iIiYiIiIiIh4iIiIiHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhoaFhYaGhoWGhYSEhIWFhoaFhIWFhX55d3l2eHl4e3x7fn5+fn5+fn5+fn5+f39+f39+f39/f35/f3+AgYOGjY2Ojo6OjY6NjY6OjY2Qj42Ni46KhoiKhISLiYeDhYSDi4mLj42JjI6QkI+NjYyLjY6Pj42NjI2Nj4+Pjo6MjYyMjY2KiYiHiImHh4aHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoeHiYqKiIeJi4yNjo2LiImLi42OjYyJiImMgHl3d3Z6eXh7e3t9fn5+fn5+fn5+fn5/f39+fn5/f4B/f4B/f4CBg4aMjY2NjY2NjY2Qj4+Pj46NjI6KiYuMjIeFiY2Lh4aIh4aHh4uNjo6Pj4+Pjo+Pj4+Pj4+Pj4+Pj4+Ojo+Pj4+Pj4+Pj4+Oj46Oj46Mi4uJh4eHh4aIhoaGhoaGhoaGhoeLiYeHiIiLjY2Mi4yLjY2Ojo+Ojo6Pj46Ojo6Ojo6Ojo6Njo6NjY2AeHZ4eHp4enx6fH5+fn5+fn5+fn5+f39/fn59fn9/f39/gH9/gIGDhoyMjIyMjY+QkpOTk5KSjYyMjIqHioyKh4eJiYWCiouIiYWJjpCNjo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjI2NjI2LiYaHh4eHiYqLjY6NjYyNjY6OjY2OjY2NjY2NjY2NjY2NjY2OjIyNj4+OjY2MjIyLi313dXd5enp7e3p+fn5+fn5+f35+fn5/f39+fn1+f39/gICAf3+AgYOFj5KRkJGSk5OTk5OTkpKLi4uLiomMiouLiYuKhoeOjYiIjI6OjIuMjIyNj46Njo6Ojo2NjY2MjY2NjIyMjIyMjIyMjY2NjYyMjI2NjYyMjI2NjIyNjIyMi4yMi4yMjI2MjIyMjIyMjIyMjIyLi4uLi4yNjY6Sk5OSkpSRkJOVlZSTk5COjo6Oe3Z2d3h6ent7e31+fn5+fn5/fn5+fn5/f35+fn9/f39/gIB/f4CBgoSNkpKTkpOSkpOTkZKSkoqJioyJi4qJjIuKioiHiYqKi4mKjY2Mj46Nj5KUlJOUlJOTkpGSkI+Ojo2NjY2Pko+OkZGOjIuKioqLi4qKi5CPjoyMjIqKioqKioqKiouKioqKi4yLi4uMjIyKiouLi46RkpOTk5SUk5STk5SUlJOTk5KSkpKSk5F6dXZ2eHt7e3p6fX5+fn5+fn5+fn5+fX5/fn5+f35/f3+Af39/gIGChIuRkZGRkZKSkpGRkpGRiYmIiIqMiYiJiYuJhoSJhoyKh4ySkpKTk5OUlZWWlZWUk5OUlJSUk5SUlJSVlZWVlZWUlJOTkY+QkZKQjoyRlZWVk5KSjo+QjYqKi4qKi42OjY6RkpCRkpKSkpGRkpKSk5OTk5OTk5OTk5OTkpOSkpKSkpKSkpKSj3h1d3l6e3t7ent9fX19fn5/f35+fX5+fn5+f39/f39/f4B/f3+AgYKEi5GQkJCSkpKRkZGRkZGIiIiIi4uJg4eLi4yMiIeHjYyNkpSSkpOTlJWWlpaVlZSSkpOTlJSUlJWVlZaXlpaWlpWUk5SUlJSVlJSUk5OVlZWUk5KTk5OTkJGSkZGSk5OTk5KSkpOSkpKSkpKSkpKSkpKSk5OTk5SUk5OSkpOTkpKSkpGRkZGPdnJ3enp7e3t8fX59fX1+fn9+fn9+fn5+fn6Af39/f3+Af3+Af4CBgoSKkJCRkZGRkZCQkJCQkIeHh4eIiIiFi4+KjI6Njo+OkJWUk5OTk5SUlZWVlJSVk5KSk5KTlZSUlZaWlpaWlpaWlpSTk5OTk5OUlJOSk5SVlZSTkpKSkpOTk5OTk5OTk5KSkpKSkpKSkpGSkpGRkZGRkZKTlJSUlJSTkpGRkZGRkZGRkZGRkYx0c3d6ent7e3x9fX1+fX5+f35+fn5+fn5+fn9/f39/fn9/f39/f4GDhIqQkJGRkJCQj4+Pj4+Ph4iKi4yNjYuOj42Mjo6RkpGSk5OSkpKSk5SUlJKSk5OTk5OSkpOUk5OTk5WVlZWUlZWUk5OTk5KSk5OUk5KTlJSUk5KSkpKSk5OTkpKSkpKRkZKSkpKSkpKSkpKSkZKRkZGSkpOTlJSUk5OSkZGRkZGQkJCQkZCRinN0dnp8fHp7fXx9fn59f35/f35+fn9+f31+f39+fn59f39/gH+AgYKDipCQkZGQj5CPjo+Pjo+Oj4+Pj4+Pj4+PkI2OjpCRkpKSkpKRkpKTk5OTkpGSkpKRkZKSk5OSk5OSk5STk5OTlJOSk5OTk5OTk5OSk5OTkpKSkpKSkpKSkpGRkZGSkZCRkZGRkpKRkZGRkpGRkZGRkpKSkpKSkpKSkpKRkJCQkJCQkJCQkJGGc3V2e3x8e3x9fX1+fn1/f35/fn5/gH9+fX5/fX5/fn5/f3+Af3+BgYGKkI+PkI+Pj4+Pj4+Pj4+Oj46Oj4+Pj5CQiI2PkJGRkpKSkpOTk5OTkpKSk5KSkZGRkZKSk5KTkpGRkpKSkZKSkpKSkpKTk5KRkZKTkpGRkpKSkpKRkJCQkJGRkZGQkJGSkZGRkZGSkZGRkZGRkZGSkpKSkpKSkZCRkZCPj4+Pj4+Pj4+PkX9ydHh8fHx7fHx9fX5+fn9+fn5/f3+AgH99fn5+f39+f39/f4CAf4GBgYqPj4+Pjo6Ojo+Pj46Ojo6Ojo+PkI+Pj4+GjpCQkJCRkZGRkZGRkZGQkJCQkZGRkZGRkZGRkZGQkJCRkZCQkJGRkZGRkZGRkJCQkZGQkJGRkZGRkI+PkJCQkJGRkJCQkJCRkJCQkJCQkZCQkJCQkJCQkZCQkJCPj4+Pjo+Pj46Ojo+Pj4+PeHJ2eXx9fHp9fH19fn5+f35+f39/f4CAf39/fn5/f35/f39/gIB/gYGAio6Ojo6NjY2Ojo6Ojo6NjY2Oj4+Pj4+PjoiQkZCPj4+QkJCQkJCQkI+PkJCQj4+Pj5CQkJCQkJCPj4+PkI+PkJCQkJCQj4+Oj4+QkI+PkJCQkJCPjo+QkJCPj4+Pj4+PkJCQkI+PkI+Qj4+PkI+PkJCQkI+OkI+Pj46OjoyMjY2NjIqDiYhzc3Z4fX58eX18fX1+fn5/fX5/fn9/f39/f4B/f39/f4CAgH+AgH+BgYCJjY2Ojo6Ojo6OjY2OjoyNjY6Ojo6Ojo2NiJCRkI6Njo6Ojo6Ojo6Pjo6Ojo6Ojo6Pjo6Ojo6Ojo6OjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Pj46Oj4+Pj4+Pj4+Pjo+PjY2MjYyNjoyLi4mJiYiFhYSDgoKEgnR5fXp4dXJrZWltb2xmZmdncHNzd3l9fnl6e3x9fX1+fn59fn9/fn9/f39/gIB/f3+AgIGAgIB/f4CBgImNjY2NjY2MjYyMjIyMi4uLjYyMjIyMjIyGj5GRjIyMjIyMjIyMjIyMjIyMjIyNjY2MjI2MjYyMjY2MjIyNjY2NjYyMjI2MiomKi4uJh4KAh4iEgXt6gH57fXx8fXlzcnJycnV1cG1ramppZ2NkYV9bXF1eWFVXWFlTS0VJSkpLTE1PT0tgdHR3eX19eHp5e3x8fX5+fn1+f39+f35/f4CAgH+AgICBgYCAgICAgIGAf4OEhYSFiIuLjYyMjIuLi4yGiYqKioqKh4OOkJGNiouLi4uMiYmKioqKiouLi4eDi4qIiYmGhYWEhIeJiYWCg397fHl6e3pzcHFxcW1samdsbWdlZmVmZGNlZGVkZWVlZWRkZGNhYV5dXFpYWFdUUFFSU1JTTU1KSUZESEpHR0hHR0xOSWdzdXh5fXp4d3l8fHx8fn5+fn9/fn9/f39+f4CAgIB/gICBgICAgICBgYFnXmBjYWNucX17ent/fXd8fHZ4ent4eHpvcHt4eXt8e3h3e394dXd0dHZ0dHZ3dXFycW5wcnBnaGtsbm9tamlpaGhlZWRkZF9gYWJgYF5dWVhaWltdXV9gX2BfX19gYmFeXl5eWVldXF1bV1dWUlRSU1NOUUpISUZERUhMTEhGR0lLSklNbXJ0eHp7end3eXt6e3x+fn1+f39+f35/f35+gIGAf3+AgIGAgICAgICCgWdYW1pZXFtcY1xaXF5ga3FtcHBvbm5vbmtpbmxrbG9qaWtraWpraWdmZ2dnaWhnbWdqZ2hlaGdjY2JhYmBgXVhbW1dYV1RWUVBUU1NNSkxLTExOTk9UWFhXVVVUUlBQTU1QT05LTE1QUU9MTEpHSUlHSEhJSEhIR0ZHSEpKSEhISUlISVZwc3V5ent5dnZ5enp7fH59fX5/f35/fn5+f3+AgX9+f4B/gICAgICAgIGBbFtYVlZWWVlaWVlYVVZoamxubmxra2poaGloZGVkYlxiZl9fYGNfXF9dYF1eWl5dWVleYmFeXlpZX1xYV1NOTUxLS0tMSUtNTktKS0tMSktQTEtLRkdHSUlGR0lISUZFSEdGRkVERUVEREVJSUlHSEdIRkZLTUtJSUlIR0hLTU1LTExMVXFzdnl6e3l2d3h3ent8fn1+fn9/f39+f3+AgIGAfn5/f4CAf4CAgIB/gYJoUlRVVlNVV1lZWVdXV1tbYWNfXlxbWFZWWVZSVFJRUVVUU1NTUE1KTU5QUk9NUFFRUVFSVlZRUVFUUFBOTk9MSk1MS0xKSktLRklJSkxJR0pISUlFR0dGRkVFSElKR0ZHRkZHR0hKR0dISEpMSkpLSUlISktLSkhKS0pISUtMTU9QUEtUdHR1eHp6eHZ2d3d6enx+fX5+fn5/f35+fn+AgYB/f3+AgYB/gICAgH+AgmlQUlRXVVRWWVdYWFpbVFRTUlBRU1FRUU9OTlBQUU9MTlBPTk5NTEtNTk5QTU9QUFJRUE5OT05PTk9PUFFPTk5PTk5QTk1NS0lISEpJSUlJR0ZHR0dJSkhJSEhJSEhHSEdISElISUxLSklISkpJSkpIR0pMS0pJSUhKSktMTk1NTU9RTFVzcnN3enl3dnR2eHp7fX19fn5+fn9+fn5+gICBgICAf4GBgH+AgICAgICBbE9PTlRZVVVdW1lXV1hOTUpKSUZKT0xKSkdJSk1NS0pMTUpHSUlJSktMRkRGSktLS0hKTExMT01MTE5PT09NTk9MTk5OUFBPTE1MTk1MTEpJSEdJSElISElJS0xLS0pJS0pJSklJSUlJR0dKSUdJSUpKTk1OTEhJSklJSk1PT01MT1JOWXBwcnd4d3d0dHR3enx+fX5+fn5+fn5+fn9/gICAgICAgYCAf39/gICAgIFvS0pNTlFOTlVXVlZSU0lFQ0VFUkREQT5CP0RAQD5CREFAQURHRkVIRUJBQEBDQ0RFQUNFSEtPS0lJSkhHSklKSUlLSkxQTk1MTU1MTU1NTElIREZGR0ZGRklKSUlLSkhMSklKSkpJSEhKS0tIRkdJSklLTU5OSktPTUxLTU1PUE5QT1BgcG9yd3h2dHJzdXd6fX19fn5+fn9+fn1/gICAgICAf4CAgIB/f3+AgICAgXNQUE5OUE1KS1BSUE5RQ0RCQUZRRT1DPT9FSDk6Oz0/PTxBRkA+Ojw+PjxFRD0/RUE/QEFAREVHR0dHQkRERUZFR0dHR0pHSEpLR0NER0pHQ0RFQUFDR0hHSEdISktKSElMS0lISktLTU5MTUxMSkpMS0lLTU9PUFNRT1BQTk9QUlFNUGdwb3N2dXRycnR4eX19fX1+fn5+f4B+foCAgH9/gIB/f4CAgH+Af4B/gICCdlRVUVFQT0xNUFBOT09BQkFAQkE/Oz48Pj8/Ozg5ODs7OkA6Oz48Ozs8PEhMPT1BQT9CQz1BRERGQkZGREdJSEM/QEBAQUFCQUE/Pjw9PkFAQD8+P0BFR0dHSUtMTk1OTUxNTUpLTVBVU05MTlFOTk1OTE1NTk9OTk1LS05OTk1OTkxUbnBwcnR0c3Fydnh5fX19fn1+fn5/gH5+gICAgICAgH9/gICAgH9/gH+BgIJ4UVFSVFJTUVNTUVFST0BAPT4/PD8+QEE/PT45Ozo6Ozg5Ojg3Ojw5Nzg7Oz49Ozs6ODpAQEFCP0E/Q0ZEQkNDPzs+PkBDQ0E/Pj9BPkBAQj9APD9CQEFDRUVFSktQT1BPTU1OTExMT1JRUFJOTExPTUtOT0xMTEtMS0tKS0tKTU1LS1xxcXF0c3VzcXN4eHp9fn1+fn5+f39/fn5/gIGAgH+Af4CAgICAf4CAf4CAgXxSTU9RUFFSUlRSU1NOPDs8Ozs7P0BBQkA9PDk8PTw5Nzk6Ojk4OTo6Nzg6OTo7Ozg3ODk7Ojg8Oz1AQUA9Ozs+PD09QEJDQT9BQkE9Pj09Oz0/Q0RCQD9BREJFR0pKSkpKTE1MTExNTExOVVNLTE1USVBKSU1KSUpLS0pJSEdKS0lKZnJxc3RzdXNydnl5e31+fn5+fX9+f39/f36AgICAf4CAgICAgIF/gIF/gYGBgFZMTlBQTlJRUFBRUU44PT88PDo9PkFAQT8+PkA/Pj07PDw+Pz08PTs6PD09PTw8PDw7Ozo7PD49Pj8/QUA+P0E/QEBBQEBAPT8/PTw6Oz09PD9AQUJCQUBCREZGRkdGR0dISUtMTExLTEtKS0lKSk1MTEpMS0lISUxMSklJSElLR01tcHF1dXV1c3V4eXl8fX5+fn5+fn5/gH9+gIB/f39/gH+AgYCAgYCBgICBgYCCYUtPT05OT1BPT1BQTzo8Pjw9Oz8+PkFBPz0/QkNDQD48PT9APz89Oz49PkNFPz9APTs9PT08Ozo9PkFBPz5AQD9BPz89PD48PTs7PD0+QUA/QD5AQ0NEQkRFSEVFR0hISEdGSUpJSUlJSUhKSkpKTEtKSklJSEhKSktMS0lLSkpIVnBwcXNzdHR1eXp7e31+f35+fn5+f39/f39/f3+Af4CAgICAgIGBgICAgIGBgIJtTFBRTk9QTk5PUFBPPjw8PT4/P0A+QEA/Pz9DRUQ/PTs8QD46Ozo6OTc6PDk9PUA9Ojw7Ozw7ODk7Pz49PD07PEA9PTw8Pjs9PD0+QUBCQUBAP0JEQ0RFRkZGQ0VHSElJSEhJS0tMTUpKSUpNTUpLSktJSEhISEpJSktKSk5MSUlfcHBycnJ0dXZ6e319fH5/fn5+fn5/f35/f36AgIB/gICAgICAgYGAgICAgIGAgXZNTk5NTk5MTE5QT0w+QTw8PT8+QkM/P0FBQUJBQD08PTs+PTo6Ojw6ODo4ODo7PT8/PDs7PDs6Ojs+Pz89PDg6Pjw9Pj89Oz4/QEJDQkJDQ0FCQkFCQkRCQkRCRENGSUdGRkhJSUtNSklKSktMSkpJSkVESUlGRkhISUpKTEpGRmdwb3FxdHZ1d3t8fH18fn59fX1+fn9/foB+fn+AgH+AgICAgICBgYCAgICAgICBe05JS0tMTExFSUxOTTw/PDw9PkBAQUE7QkNCQ0A/Pz9APT9APz0+QUA9Pj0/PT0+Q0Q/Ozw9PkA9PT5BQ0A8OTtBPz4+QT07P0JAQkNCQENDQUNBPT0+QD0/QUFBQENFRUBAQ0JDR0dFRENGRUZGR0VEQEFHR0ZDRkRHSEpHQz5IbG9wcHF0dXZ5fHx9fHx+fn1+fn5+fn5+f36Af3+AgICAgICAgIGAf4CAf4CBgIF+UUhLTU1NS0pLTE9RQD8+PkFBQEBBR0FCRUNEQT9AQEA/PUBAPENjREBAQENAQD9AQD49PD1ARUFCQkZIQz08QERDQUE/Pj1AQT4+Pj88PkBER0VAPkBBP0BDRkVDQkJDQEJEREJERUFCPkFCQkFCQEA9QUJDRENDQUNFR0E/PVZwcHFwcnV1d3p8e3x8fX9+fX19fX1+fX5+fn9/foB/f4CAgICAgYCAgIB/gIGAgX5SSEtNTUxLS05OUlVEQkBDQ0FBQkBCQ0BAQUFAQUA+Oj49Pjw8R3tbPkNDRUA/P05hX0pAQ0VJSUlJTU1LRUNGR0hFR0VFRUREQ0E/QD4+QkZKSkdFRUZGRkpOTktKSUdHSEtMSkdHQ0REREVEQUJCQ0BDREVEREVERUZDQkFEZW9wcXF0dnV4e3x6fHx+f319fX19fn59f4B/f39/f39+gIGBf4CBgICAgH+AgICAfVJJSUpKSEpKTE9SU0dGRUdIREZIREA+PDs+QERFREBBRkJRZW5weXFFREREQ1d1homKflhHSEpMTE1PT0xIR0hHSElJSEhHR0hIRUNFRUVFRkhKSkZFR0lKTU9PTU1LSktKTU5LSUhHSElIR0ZFRkZGREZIR0VFSEhGSEdIRlFubnBxcnZ2eXt7e3p9fX5/fX19fX1+fn1/f39/fn5/gH+BgYGAgICAgICAf4GBgIB8UEhHSElGR0lKTU5OSkxJSUpLTE5KRkNBQkNGSkhJR1VlYX6FhYWAelRBQVV0h4mHh4aHgldJTE1MTU5MSkdHR0dER0dHR0ZIRkhFQ0RERkVEREhIQ0NDR0pKS0xMTExMTElKS0pKSUlJSEpISEdISUhHR0hGRkZISklJSUlIXW9vcXJzd3d6e3t6e319fn59fX19fX5+fYB/f39+fn+BgIGAgYCAgICAgIB/gYCAgHxNR0ZIRkVGR0dKS0pMTUxLTU5NT0tJSEhKS0tMS0tKXnqAg4OBfIN+Y05shIeGhoaHh4eHfFBLTEtIR0ZGREVDQ0BBQ0NDQ0ZGRUJAPj5AQUFAQkQ/Pj9ERkhERUdJS0lJR0hJR0lJSUpJSEZKSkpKSUpJSkpKRklMTEpKS0tmb3Bzc3V2eHl7e3t8fH1+fn19fX19fn59f39/f35/f4CAgICAgYCAgIGAgICAgICAfU9GRkdGR0hHRUZHR01NTUtMS0lHQ0NDRElLS0tLS0tkf4F+g4F9hIJ7gIaFhISGhoaHh4aKdUlJRkI/P0A/Pz88PDw+Ojo8QUFAPjw5OTg8PD07Pjs5Oz9BQkBBQ0NDQEFCRURCQ0ZISUhISExNTEdJSk1NTk1KSktLSkxNU2xvcXRzc3d5e3t7fH19fn9+fX19fX1+fn5/foB/fn9/gICBgIGBgICAgYCAgIB/f39+UUZFRkdJSUdEQ0VGTk1MSklIRT85Oj5ARUhISUhLS2Z/fn2ChIOBgoSEhIWFhoeIiIiJiYyOZkJCPTg4Ojo5ODc4ODk2NDc5Ozw6ODU2Nzc4OTc4NzY4OTs7PD5AOzk5OT09Pjs7PUFERUhKTUxMR0lIT1JRUFBOTE1NT1Fdb3BydHN1eHp8e3x8fn5+f359fX59fX5+f39/gH9/f4CAgICAgYCAgICAgICAgIB/f39RR0ZHSEpIRkVGR0hMTEpJSUdDQjU2OjxDQENHSEtHaoCCgoKDgoKDgoOEhomKi4yLiomKi4yJVDs4NjU2NzY2NjU1NzYzNDY4Ojg3NjU2NTY3Nzc3ODo3Nzc4OTs3Njg5OTg5ODc2OjxAR0ZJRklGRUZPU1JTU1JPUFBSVGVwcXN0dHd5e3x7fH1+fn5/fn19fX19f39/f3+Afn+AgICAgICBgICAgICAgICAgH9/flJISEhJS0lHSUpJSkpLREVIRUJANTc4OD06PUVCREVmgoKCgYODg4OChYmKiomJioqKiouJiYqBSDY3NjQ2ODg3NDU3ODQ2NzY5OTc2Njc2NTo6Ozo6PDg5ODk3Nzc3OTo5ODg3ODU4ODtBPT4+QkE/QUtMT1FQUU9PT1FXa3JydHR1d3p7e3t8fX5/fn9+fX19fX5/f4B+fn9/f4CAgH9/gICAgICAgH+AgICAf39+VEhHSUlMTUtKS0tMSUg/QEFAPDo1Nzk4OTc6QTo9Q1OBg4OEhISEhIaJioqIh4iIiIqKjIqJiYx6Pjo4ODs8PT45Ojs8ODk7OTo7Ojk5Ozo5PT09Pzs7Oz06Pjs5Ozs8Ozw7OTs8ODo6Ozo5OTk8Pzw9QUJESUpNS0pLTFdvcnN1dHZ4e3t7fHt9f39+f359fX19fn9/f35/f39/f3+Bf4CAgICAgICAf4CAgH+Af35URkVGSUxOTkxKSk1CPzo7PDo4OTk4OTk5OTo/PkE/WYSDhIWFhYaHiYiHhoaGiImIiYuMi4mKioxsPDs+QkNFRUFBQUI+QEJAQD89Pj5APz4/QD9APT0/Qj9BQT9BPz1AQEA+P0E8Pjw7Ojs6OTs/PTs7PT1BQUNBQkNBWHFxdHR0dnl7e3x9e31/fn9/fn19fX5+f35+fn9+f4B/f4CAgIB/gIGAf39/gICAf39/flJFQ0FHSk5PTElHSzo4Ojs5Ojo8PTo7Ozw7PT9DQkBnhYSFhIWEhomJiIiGhoaHiImKi4uKioqLiotePkRHSUtKSUZHR0RGSEdFQ0BAQ0VDQkBCQ0I/QERIRUNFREZFQUZFRkRGRkRAQj49QD49P0A+Pz8/Pj8+Pjo7PTxgcXJ0dHV3enp6fX19fn5+f39+fX19fX5/fn5+fn5/gH9/gICAgICAgICAf4CAgIB/f4B+UERAPUNIT01HRkJEOTc6Pjo8Oz4/Pz88QD5BQEVCTn6DhIWGhoaIiIiIh4aGhoeJioqLjI2MjIuKiohXR0xMTUtOSklLSElKSklFQ0RGR0ZEQ0VGREJISUtIR0dGSEdFS0lLSUtLSkNGQ0NEQkFBQ0JEQ0NERENBPTs9QGhwc3R0d3d6eHt8fH19fn5/f359fX1+fn9+fn59fn+Af3+AgH9/gICAgICAgICAgH+AgH9PQT49P0RMS0BCQkE5Nzw+Ozw7PkA/QT5BQERESENqhYKFhYeIiImJiIiHhoaGiIiIiYqMjYyMi4uKjH9QTVBNS05LSkxJSUpIS0dFR0hISUVFSEZGRUxMTUlKR0dISUpOTU5MTE5LSEZHR0VFQ0ZGRkZERUhIRkNBP0BMbHB0dXZ4eXl5fHx8fX1+fn9+fn19fX1/f35+fn5+f39/f39/f3+AgICAgIB/gICAgICAf1FBPz4/RkdHPTxAQDg3PDs8PTo/QD4/P0JDRkVMV36DhISFhoeHiIiIiIiIh4eIiIiJioyNjIyMjIuKjXFNUU9NTExLTEpJSEZKSkVKSEdLSkhKR0dHS0xOTExISElKTVBOUE5NT0tJR0lKSElESUhIRkZHR0lGQ0JBQ1VucXV2d3l7eHl6enx8fX5+f39+fn1+fX5+fn5/f36Af39/f3+Af4CAgICAgICAgICAf39/VERBQUJHSEI/OD9AODo7ODw9Oz1BPT5AQkRGR1FvhIOEhIWFhoeIiIiIiIeGiIiIiIiJjIyLjIyLi4uLi15SUlBNTk1LSkdGQ0dKR0xKR0tPTEtKSk1NTE9QTkhJS0xPUVFQUU9PSklKSkxKTEZHSEdGR0lGRUVCQEJCXHByd3h5enl5eXp6e3x+fn5/fn59fX19fn9+fn9+f4CAgIB/f39/gICAgICAgICAgIB/f39VRUNFRUdHRUQ7P0E7PTw5Pz09QEJHRkBFR0VKUXeGg4ODhISGiIiIiIiIh4eIiIiIiIqLi4uMjIyMi4uNfFdWUlJUUk9MS0pFRUZLT05PV1ZRUE9RU1JOU1RPTVNMUFNVV1JTUlBMS01NTUtOR0dKRkZISkRERUVCRENjcXV5eXp6ent6e3p6fH59fX9+fX19fXx9fn5/gH9/gICAf39/f3+BgYCAf39/gIB/f39/f1VGRkdHR0dIRj5AQj0/PT1CPkJCRlZNREtMSU5SeoaDhYWEhIeIiIiIiIiIiIiIiIiJiouKioyMjIyOi4uLZ1ZWa2FFUlFRUEo7O1FTUmB1XVVWVFZZWVNZWFJaZlBVV1pdUlRXUVBOUlBQUFFLTEtHSElIRUZJSUlISWpzdnl5enl6e3t8ent8fXx9gH59fX19fX1+f39/f3+AgIB/f39/f4CAgIB/f3+AgH9/f35+VEhKSUlHR0ZFPz9BQEVCQ0ZFREVMWFJMUlJQU1V6hoWHhoWGh4iIiIiIiIiIiIiIiIiIlJyMioqMfWGKi4uHbFtkVTpYWFhTUD9AVlVZXGRgVllicl5dV11aVkVRWVpcWV9UWWdSVVZYVFRWU09PTUpMSklJTE1LT01Tb3R2eHl4d3p6ent6e3x9fH5/fn1+fX19fn1/f39+f4CAgH9/f3+AgICAgH9/gH+Afn9+fn5WSkpJSEdGRERCQT9ITUlNUEtJS1BUU1JWWFZYV3eFhIWFhYWGh4iHiIiIiIiIiIiIiImcnaCPiY5nO36MiYqLem5wWFpbWlJTUldWVFpadYNZVX2QYVxYXV5XSVZdXVtbX1lIWVhZXF1YWFlXUlFNUFFNTU9TUVFVUmFzc3Z3d3Z4eXh6e3t8fX19f39+fX59fX1+fn9/gH9/gIB/f3+Af3+AgICAf39/gIB/gHh5fVlOS0lJSUZCREBBOlBRUVdYUFBPUVNUU1ZXV1dZbYGCg4WEhYaHh4eHh4iIiIiIiIiIiJaanJeIioFuhomIh4OKfmZZWVxZU1ZUV1JRV1ZjloBRZXJYWldfaFBgZlpbWFxoYkdPWmlnXFtcXV1XU05TUFBRVlZWVllab3N1d3Z2dHd4eHt7fH19fX5/fn59fn18fn9/f3+Af39/gH+AgH9/gICBgYB/gH1yfX9/b3R8XVNQT01LSkVDP0A7UFBaWltSU1FPUlJRVVJVU1ZfdXiAhYSEhYaGhoaHh4eHiIiIh4eIh4ORjomJiIaFiIiGfYB7XFBWWFRSVFJRUUxPTUtmeVpdVFlVVl1aTFRaVFNUXlpYV1dXemtYWlxcXlNQUFBJTk9XVlhbWmRxdHZ2dHR2eHl5e3t8fH19fn99fX1+fX1+f39/gICAf3+Afn56eHd2c3V7f3+AgHRrfn5rcnleXFZVU1JPS0ZDREFNXoNsVlJTTk9RT1FWUlNSUlRjZHaAgoKDhISEhIWFhISDhoaGhoeIhn6JiYiHhoOHh4d5bXFWSUtOTktNS0hKREZIRUM+U2NVf1JRUU5LUlRRTU9ZUU1OUVNVVU1RU1JQTkxMSENJSFJTVFpdbXJ2dnVzc3d7ent7e317fX19fn19fX59fn9/f39/gH99fX5+f39/f4B+e3Zzd31+fmR1fWlxdF9kXV5bWVVRTElMSWFsknRQUVNOUVJRUltSU1JRUlVVYnN7fH+AgYKBgX99e3uAf4OChYaHgoaGhoGEgYaFhnVfXUtDPkNDQ0NCP0RQQ0NAQz5CSEdWQElOTUddaVFIRk9GREVGSEdIQkNIR0hKR0RCQUNAT1BNUmR0dXZ1c3R1enx6e3t7fHx9fHt+fX19fn5/f3+AgIB/f3x8fX+Af39/f4CBgH12dHt/bWh8Z25xZmllZWJcWFNRUFVSc1dlW09PTkxRU1FVWVNVUVFUUk9WYGtsc3Z6e3h5dXJuc3RzeXh+foOAg4OCgIKAgoGBa0xHPj46Oz5APz8+PmtRS2FFRkhJRUI/SE1NR01RVUpCRT8+PD08PT0/PT9BQ0I/Pzw9Qj5KTUZVb3V1dnN0dnh6fHp9e3x9fX19fH59fXx+fn9/f4B/f39/enl3eHd2dnh7foB+fXt4dnx1YXhnbHBqbGppZmBbUVFaXFleSUpQUU5LTFFSUVRVVVdRUVdWUFhbYl1hZ21tbG9raGBucmptbHF1e3p9enh6fHx4d3hkQkBAQT06QkNBQUNCXF1Pe05PT05LTE1PT1BMS0xXTklHQEI8OTc3NTk5PTs7Ozg5ODk/O0FHPlx0dXV2dXZ3eXx8fH18fH19fn58fn19fX9/f39/fn9/f314dXd6e3p3eXh1d3t8eXh1eXdjcWhpcG1ubW1oZl5PUF5cWklHUFJRT01QUU5RUlNWWFNSWVROWVpbV1lcX19gZWBdXnF3a15gZ2t3b29sam9ubmxmYllHRkZIQkFGSUVFRkNNUlBhV1JYUVBTU1JVW09PUVZQTUlDRj46OTY1ODY5Nzk6MzY1Nzk1PEI9ZnR1dnd3eXl7fX18fHt8fX1+fnt+fn19f39/fn5+fn9/e3d1eX18enh8fHx8dHd2d3Z1d2tuaWhxbm9vb2prYFVXXlpXTUtUVFNQUVVPTFJTVFdYVFRYUUxXWVlWWFhWWFldV1dYaHNrXVZgdGthYV9dZGBfXllVUE1PTkxJR0pLSUhGQ1FQU1pXVFROUVNZU1xlVU9TVFFOS0lIQz9BOTk4ODk3ODg0NzU3ODU5OEducnV4eHp7e31+fX18e318fn5+en1+fH1/f359fn59f358dHR1e3hycW9vbnR4cXJzeHZ1cWZkZ3JucHBxbm1kXV9fWVdPUFdWVlNUVk9PVVZYWFlTVVRMS1NVVVVVV1BUVVdUVVJdbl5STllgW1ZZO0RVV1RbZkpMUFJST01NTk5OTEpGUFBVWVNUTkpOT1RTVFxWUlVTU09NTElISEY/Pz06Nzg3NjU5OTY3NjY1V3FxdHd6ent8fX59fnx9fXx+fX15fX18fn5+fXx8fX1+fXxydnF4eHJ1dXFxbnBwb3B1dnRuamRkanBwcXJwbmZlZGNcXlJUWlZXVFNWVFJYWFlZWVJVT0pHT1BPT01SSk9QUFBOTk9UTE1JUFBTVFUyPFhNSUFRPWNgUVNRUE5QUVBOTk1QTlRSUFJMSUxLT1FQUVJTVFFTT0xNS0xMSENCQT06OTg3NjtCNDU2NjtlcHJ2eHl7fHx9fnx9fH19fX18e3h8ent9fX58e3l9fH18e3B1b3d1cHV0b3N2cHFxcHV1dmNqZ2VXaHRycnFuaWlocFZWVFVYVVZVUldWVVpZWFdVUVNGRUFGR0dIRkpESEpIR0VITEhLSUdMTVBNRy9FX1I+M0A+am9hUlJRQEZUUU9QUFFOUU9QT0xKTExPUE5OUFFRTlBPSkxNTUtHRUVEQjs9PTw5PUc2Njc2RG5xdXd6fHt8fX18enx8fX5+fXt5dnh3eXl8fXp6dn17fHp6b3Fud3JwdnFtcHNwb3Bzc3N0ZmdgaFpXa3JzcmxtbWtuYmVQU1RSU1VPV1ZWWVlWUVFRT0A+Oz0/QEJBQ0BCRURBQEdIR0hGRkhKTUxER0NPUkM4RU5TXWdTUVNBR1VQT1JRUE1NTkxKTEtMTk9PUU1PT01ITEtJS0tMS0dGRkVEPEFBPjtARTs8ODlUcXN1eXt7e3x8fHt5fHp6fn58e3V0dXJ2dnp6eHpyfHt8eXltcW94cnF1bm5xcm9vb3Rzc3J1dGtnZ15lam1wa29xbWltY0xPTk1RU0xUVVRXV1VMTEtIPTk4Nzs/QT49PUFAQj0+RUhGREZGSUdLSkBGQUFARkhFSk9IUVJhXFFQUk5TT09QTExPTUtNTE1PTltWS01RT0dJSERJSkxMS0ZGRkQ/Q0M+PUJHP0I+QWRxdHd7ent7fHt6end8d3l+fnt7cXN0cHJzd3R4eHN6e3l2d2xxb3ZxdHRsb3Fybm5vc3ZydHNycmtsZW5zaG1ubWxtbGprSUxISE9RSlFTUVRTT0tIQ0U9OTg3OT9CPzs+QUBAPkFESUVDSEdJR0lFQkI/PjxDQkFHSURNT2FlUE1PTldLTE5LTE1NTExLTk5TZE5KTFJJSUlFQUlKTE1OS0dJRkJBQkA/RUZFSERMb3B3enp5e3t6fHp3c3h0eHx8eXpucXJtbm9ycnZyc3h8eHZ2bXBtc3B1dGxwcHJvb29ydnVyVlZucWdseYRqbXFybm5qaG9ISkNHTE1JTVBNUE9HS0U/Qj05OTk6P0I/PEFCQkFEREdLRkRJSUdHSENDP0I/P0BBPkRFQ0tOUVRLSklNVEZJSUpMSktLSUpMTU9QUlBLR0NMR0NDSkpMTU9OSUpJR0NDQ0RJSk1MSVpzbXh5eHp7e3l8dnJwdXJ0eXl2eGpxbmpsbG50dG1zdXtzdHhyb25xb3ZzbnBvcnBvcHN0eWpOYGdzanR8eWdvc3FpcWhlcUhLQ0ZISEdKS0lKTERHQj0+PTo6OjtBQj89QkJDQ0hGSkxKRUlJRkdHQ0M7QUBCPkBAQ0VDSU1PR0hLRkhLREhJS01ISkxISUpMSk1dUklIRE5HQkVLS05NUE5LTUpLRkdHSk1OUU5MY25pd3Z2e3h7en1xbWxza3B0dHR1aHBtamlra3RwbnR0eXByeXRvcnFvd3NvcXB0cnBydXR5a05WbXVscXt2aW5vaWp0aGRwRktDRkVHREVFRkVHQ0NAPTw9Ojs6OkBEQD5CQ0VFSUZKSkxGSUlHRkZDQjtCQ0M+QENDQ0VHTE5IS05IREhFSUxOTUdJTEdGRklJTE5LSkhFT0lDR01NTk1QTk9PTUxJSElPU1FSTlJmZ2Zyb3N4dXt6fGxoam9la3Btc3FmbWxoaWtsdG1wdXR3cW94dG90c3J2c3BxcnRzcnR1dXZ2WFZ1dWtvdHJrb3ZsaG1lX3BHSUNFRkVCQkFFQERCPj8+Ojs7PTs9P0NBP0FDRkdKR0pJTEhHR0dGRUM/PUVFQj5BQ0NDRUdISUdNUElGRkdLTk9LRkhJRkVERElJSEtJRkhQS0RKTUxQTk9OT1BOSkpITVJVVVJPV2RhYW1ncHJvc3l6Z2VoaGNpbGdxbGZsbWdpa2xzbXB2dXRwbnZyb3Nyc3V0cXNzdXRzdXZ2dnl2dXR2bGt1dW1ydnFsbmxlck1HRUVHQ0FAQUQ8QkE+QT06Oj0/Oz4/QEI/QEJFR0pGSkdJR0ZGRkVEQ0FBRkZDQkJCREVFR0dIRkxQTElPSkpMS0lGSEVGRURDSUhIS0pHS1JNQ09PTlFQT09OT09LS0tQVVdWVVRZYF9daWFtaW5ocnNiZWZmZGloZm5pZm1taGtrbXJpcXZ1c3Ftdm5vcXJzd3Nyc3R1dnZ2dnd2d3Z2dHd1a3N1bnV0c3Bya2tzTUZHRUdBQkBDRDxBQUBDPDg5PT46Pz0/Qj9AQERGSEVIRkZIRkVFQ0NEQkRJRkNHRUFFR0VGRkdFSk1LSFFNSktISElFRkhIRUNJSUpLTUtQU05EUlNRUVJOT05OUE1MTlNXVldYVlheW11kYGhiamlna19kZWZjZ2dna2dna21rbWxwcWd0dHVyc252b3FwcnR4cXNzdXZ1gpF5dnZ0eHV1d3hub3VvcnN1cXFpcHpNR0dHSEJCQkVFPEBDQkQ8Nzo9Pjs+OkBCPj8/Q0VGREZEREdFQ0VDREVGRkpFRUlHQkdIRkdGRUNGSkpHTUtMS0hKS0ZJSEpIRUtLTExOT1JUT0lUVVRRVFBRTU5RTk1RV1pWWllXWl5bWGFgYGBfaGVjYGRlZ2dqaGhqZmhubGxvbXFwaXV1eHJycHVwcHBydXZwdXN1dnV7fn14dnR3dnZ2d3BsdXBtc3Vub3NzeU1ISEdJREJDSEU8QEVCRDw4Oj4+PDw9QkI8Pz5BQkZDRUJCSENDREVGRkdHSUZHS0hDSUhHSUdGREhLSUdLSU1LSktMSExKTUtJTkxOTk9SVVZPTFZWVFFUUlJMT1FQT1RZWllcWlpcX19eYGNeXGFja2JgZGdocoVoZ2pmam5ucG9uc3FqdHV4cnNzdHJucHF2cnF1cnV1c355jn11dXZ2dnZ4cml1cWtydGxxd3F1S0lLSEpFQkVHRTxAR0REQDk8PkA/Pj9DQjxAPkFBRkNFRENIREZERkZISEZIR0lLSkVKSEhLSEZGTEhISEpITUxMTExJTUtNTk1PTFBQUVVWV09LVlZVU1NSUUxPUlJRVltbXV5bXV5gYGFgYmVdZGBmZ2BlaGpjc3NmamhnbHBycW9zc25zd3dwdXZ0c21vcnVvcnNwdXJ2cnSBd3V1dXd2dXdzZ3Rya3Fya3J3b3dJSkxJS0dCRURFPEBGRERCOz8/QUBAQERBQEI/QUNIQkVERkhFSUVGRUlIRklISkxISEpKSUtKRkpLSElKSkdLS01NSkpNTE1OTk9MT1BSVVdWTk5UVlVTUlFQTU5UU1JXW15eX11eYGBhYWFgY2RlYmRpY2Rpamd2i2xraWhtb3NxcHFwcHJ5d3J1dXRzbW1zc21xcm90dXRzcHN3dHV1d3Z1dXVlcXNrcHFqcnZwd0pMTExNR0NDQUQ8P0VFRUM9QUFDQkJDRUFDREFBRUdDR0dHRkVKRkRHSkdHSkZJTEhJSk1LTUxHS0lIS0tOUUtSUUxTTUtOTU5QUFBUT1dYWFtOU1FXXFpTVlBOVFVUVFhaX2JiX2RhX2BiX2BmYmFjaW5pY2loaG14dm1oaW1vc3JwcXJycnZ0c3Vzc3Nua3NxbXByb3R2cnJxdXZ1c3d5d3V0dWNtdGtvcGpxdHB3TE1MTExHRUFARD4+REVGQz9DQUVDREZDQ0VHQ0JIRUJISUlISEtGREtKR0hKSElLR0pKTktOTElMSEpNS1pmSmRcS2xSSE9NX25VbHNbcXBid2NSUGJ2dWh1Y2F2YFhucWJkdmluemZcbHRgbGtVX3d2aWpoaGZnbG1qbW9qbW5zcnBycnFyc3Jzc3J0cm5sdG9ucHFxdXVxcXN0dnZ1dXl3dXR0YGt0a3Bwa3FzcXlLTkpLSkZCP0BCPz1ERUZEQ0NCRUVERkJGRkdEREtFRUpMTEpMTUdHTkpISktHS0pJS0tOTE1NTExJTE1MW3NiZHBebGxVTU5lc15nZnFsbnRncGlfYVlubWJwcGJrampnb3F0ZXRub1xwdWdxTUtyeXZrYmFrZWVseG1rdmxucHNycHJxcHFycXJycnRybW1zbm5vcHJ1dHFzc3R1dXV0d3h2dHRibXVrcHBscnJxektMSUlHRUQ/QUI/PUJFR0JGQ0VERUVEQkhIR0RFS0hHS01NSk1MRkpOSEpLSklLSkpJSkxNTk1NTUtOTU1bcm9vbnBwbGtOUFFsWE1pYnRycGFtb3ZcWWxQW21tWnFta29teHh0c2lwXGBzbHFqVXV5eG9jXmtmYmdwcGppb3BwcnNwcXBxcXJycXFycnRsbXJtbW5vcnV0cXRydHV1dHV1enZ1dGVudWtwb2xzcnJ5SktHSEVFRUJBQj0/QEVHQkdESUVFREJGSUhIRUdLSkdNTU5LTU5HTE5JTUtISk1JS0lKSk5PTk5NTE5NTFxoZHVdbHFXbE5PUW5VWmtea2x2YWxkdFRlY05sWWxcdHBraWx4and1aHBdX3NraFdiY3d8b2NgZ2hhZGl0eWtvbnFzc3BxcHFwcnFwcHBydWttcW1tbW9xc3Rxc3J0dnZzd3Z6dnV0aG91bHNvbXNydHZJTUdJRUVEQ0FCPEJAQkZDR0ZLR0VDQ0hLSEhGSkxLRk1LTFJSTEdNTUhOSklITkhKSkhITk9OTkxKTU1KWnNwcG9xcW1sT1FTb1lza2dvb3Fxb210Xm5YYXRfbm9wb3Fyb291c3R0altddGN3eHJqbnpoYWFjZmFiam10dXBzdXZzcXBwcW9ydHt/fn13bGtxbmxtbnByc3F0dHN1dXR4eHl5dHVrb3VtdG9uc3N2dElLSEpDRUVFQEA+Q0NBRkNISU1IRkNGSkxJR0ZLTUxGT0pLV1JLR0tKSk5JSUpMSUtKSUhKTE1NTElLS0tTa2JaaV5famNyclpfWmtvYGVlVWtfY1thYlFgbWhcalxuaWlkW3BmZHBdWlxrW21xY3BzbGRnY2RnYGBrbnBwb3R5cnVxb3BxbnmFiIeHhoWAdnNua21tb25xcnR0cnR1dXZ5eHhzdW5xdW52cXJ1dHdySUhGSkRFREZBQEFFRENHQkhKTEdGREdLTElFRkpOS0lPSUxbUUpGSEhLTUlISkpLS0lISkdLS0tLR0hKSkxMTEtJS0xOVFtdVFBVTVFQTk9PVVJQT1FPT1FKSk5QUWRxaVRZV1tbXFVZW11YXVxcY2ZhYWZiY2ZfXmZrbWhtdHlydHJvcHB0hoeGhoaFhYaHg3pwbW1sa3FzdHRydHZ0dXl5eHV2cXJ1b3ZydHN1dXNIQ0VHRkZBRUM/Q0dERUdDSUtMSEZER0tMSERHSFBLTE9LTFdNSUZFSElKSElLSExKSUZISEpHR0lFRktISUtOTElPXFdeT1xcYF5PWFlTXFxiXk1ZWk1YYVJLWWFaU2BkXWFYW2RkVlZYXFlaWFxWWVxeY19kYGFfZWhrZ210dHFxdHBxcoGGhoaFhoWFhYaGhoR9cmtpb3Jzc3N0d3l5eHl4d3h0cXhyeHNxcnVydE9CQ0RMTUFDREJESUVHR0ZLSktIRUVKSkpHRUhIUEpMTUpNUklIRUFIRkpJS0tJTEpJR0VKSEVGR0VFSkdCSU1KS1RfWWBYYGFbYFVYWVReXlpfUllcUF5cWU5fXF5TW15jX1pdYGNfWV9iW2BeW1RZWFpfXmRiYmFjZmlla3Jwb3Bwbm93hoaFhYaCe4CFhYaGhYaFf3VxcHJyc3Z5eXp5eXh4eHdyeXZ4cnF4dnR2YVNKSk1JREJCQ0ZHRUdHSUpKSUlERktLS0ZGSUlOSk5MSExOR0hGPkdHTElLS0pLS0lHRUlFRERFQkZKRD9JS0hOW2NZXl5hX1JUU1dfYFxdWV5RWVxNVl9XS1FZW1FbX2FhXV5jYWBiYmJjY2VaUlhWVlxbXmNgX19jZWJob21tbGxsbHWFf4SDeXV8hIWFhYaGhYWGhoN9d3JydHd5eXl5f359eXV5dnZybnp3dnhYUUpGQ0dFQkVHSEZHSElGR0pHSEZIS0lMRERKSk1NTExISkpISkc/R0ZOSktLTUtLS0lHSEREQERBSElBPkhJRk9dYVpbZF1fVFFSWF1cXFxfWktXXExSXFlJTV5RUV1fYWNjY2NiXGRjYmRjZlhRVlVTXFhbYV9eX2FhX2Rsa21qa2xudn51gXp8hIWFhYWFhYaGhYaFhoaGgnpyc3V1e4WHh4eGhYSBfnhwend2eFxSTUJASUZDRktJRkZHSUdHSkZGRklMSk5FREpKTE5KTElLSkhJR0JISFFNS0tPTUtLSUhIRUQ/RUJISEFARkVEVF1ZXlhfWF9bXVVYWFBdXVFLSldeWF5bXVZaYVJSX19iYmBgYmJgY2JiZGRiWE9SUlNcU1xeXV5eX19gZGhnbGpubnB7e3x+e4CCg4SFhYWFhYWEhIWDhISHh4FzcneFh4eHh4eHh4eHh4WDgHx4XFNLQkFHRkRHTVJIRFJLRkhISERGS0lNUEVHSUpLTkxMSUxLSUlHREhLUU9NTFBMTEtLSUlERUFFQ0hGQUBGRUJWVUVcVF5TVmBYTlRVTlpbTUpLVWBhW19YX15iXU9ZYlxgYF9iY2JdYmJXX19UUE9RUllTXlxcXV5fYGJmZmVsZm9vd3x7gHt9f4CEhISEhIWFhYODhYKDgoWFhnpvgYaGhoeHiIeGhoaFhYSFg35JTkZERkZHRElSY1FEV19JR0dIREZNSlBQRkpJSktOTExLTUtKSkdFSU5RUU5PT01OTU5IS0FEQUNERkRCQURFQUxIQ0xMUE9PTUZNRkZISkhHTExNT1BJTE9QUFNQTFFTUlVaWVdZWFhkVk9TVFBQT05RVVRcWVlbXl5hYWVmY2hka2xxc3N6eX97en+EhISEhISEhIKEgH57gYOBfXuFhIaGh4eHhYWFhISEgoGAfUtJRUVHRkdES01eTUdIWU1HSEpIR05MUVFJTEpLS05NVU5PS0tMR0dLT1NTTlBPTk9PT0hLRmBFRF9MRGZjRE1bSF5cc21PTVZtWUxDUF9VbFdnSl1XVV5ETFFVTE1TVlFSVFhXVFhVVFxUUGZaaGhkWVRrVFhXVVtcXGBgYWJiYmBnaWdubGhyenx9foGEhISDg4ODgX19enJ7gXp7f4KAg4SEhYWBhIWBg4N/fnp7TElFRkZIRUVLT1RKS0dgVEdKT0pJT01SUUtNS0xPUlVST09KTE1HSE1RW1lPUFBOT1BQSktRf1FJfFlZcnNXUG1IcW5vYVZQcXF0T0Jrc25xdHBTb19bblhdVlxYVWtoVV1WY1lgWVpfVlVXf2l0dXVfYXZfWWJcXGZbX2FhYWJeYGJnbXBsYHB3dHiBgYKDg4J/fX6Adnh6bXZ+dHh+gHx+gIGChHyAg3p/gX9+d3dOSUVITU1CRExMR0pMRlJWTExPSExSWFdRTk9PTVFUTk9RUEtLTkdNUFNbWlRRUk9QUFFLSVp4XVR4ZGhZUlNQdmd0bHBibmZrUnJOTHdtanJwc3JxcnBvcIBdZnp1eHFxenF+cn1rdX1iUmd8ZXNzb3NzfH1wfnlvf3JfYGBiYlthYGhrbmtibGZnbXd+gYCDfnt4d4B0dnpocn5udHx+d3h7foCDeHyBdXx/fHxzc05LRmBdR0FFTU1IS0tIS1FPTU5KTldeWVVMUVNOWVlMU1NSTkxPSVFSVFlXV1FUUFBRU0xIZ3hsY3hxbVpLTFR5cHVtdWJudlBkZUlldnFtd2+AamZ4eGlXclJpe21panp6fWx4en9wZ29YdXVqdnVwgGFzaH1pbHh8b19fX2NiXF9kZWZpamRnYmNkbGxwcHN0c3NzeXFyeGJsdGdyeXtzc3V5foFzdnpufH15eHJuTkpSdE5DQkVQUElLTEpMUU9PT01QWmBaWEtUV1BhXlJWUVlTTVBKU1RVWFdXUFVQT05TSktyb3V1cXVxZGhhVm5McXBeR2h5V3ZUS2h4fXhgeXtzbmFebW9kU2dydW5teXB3bHZzdHFsbVxzfXprbXl8bHVtfGtwdnV4Xl9fYl5dX2VkaWdoZWVeYmJpaWlqa25va3FubWpwYWNmZG93eG9tcHN5f25xcGp7enRyb21MS1pWSEdFR1JQS0xOS0xRUVBQUFFXXFlVTlZZVWZYUlJZXlRNTkpUVFZXWVdPU09PTlFJUm1IaXdLYGR2dVVXbE5ubHtyYWpnf3ZVS1draH1sbWx4YFtwentfYHpzY3JveHFoZHxpcntdVEtsX3Z1a2l1e3ttfnhrfHBdXl5iW15iZGVnZWVlYlpjY2lra3JzcndnbWloZGdgYWxhZ3Nya2htbXJ8a21oa3t0bW1rbU9HSktISkhIUlFNT1BNTFNTUk9TUldSVlRQV1pWVlRUVGFgUU9OS1RTU1FWVk9PTU5PUUpIUU5QVUxLS1JTUlJST1ZVUVFPUlJYWFFOUFVUWFhYW1tVU1NXW1dYV1pQU1VXV1hRXVhWXVVTT1hSVldXWFpgW2dyXltcW11dX2NaX2NjZWZkY2NiWmNjZ2ZmbW5tdWZmZ2NgZl9dZ2BkbGhmZ2tocHpoZ2drdWpoZ2lsUElLS0xNS0pUUk1SUVBMVlVUUFRVWFVaVVJaXVZVVFdVWVhQT0xOV1RQTlVTTlBOTFFQS0pRUUtRTUpLT1FUUlFRU1JJSU1OT1FSUVFRVFZSWFdcV1NTUVFVVVZUWlFOU1FXVVRZVlRZVVNSVVNUVVhZWF5aX2FdXFtaXV1gY1xdYmJkZ2VkZGFZYGFjYWJoaGluY2FkXl9jXVpkXGJtYV5mZmdtc2RpaGtrZWRjZmhRSktLTk9MTVRRT1RRUU1YV1VUVlhXV1pWVFxgVldWWVVYVFFQS09YU1BOVVFOUk5MU1BNTlVTTlFOTU5RU1BUUVNUVE5MTk9RVFRSUlFWV1VZWltZU1VSVFhXV1lbU09TVFdVVFlVVllUUlJXVVZYXFpbYF1WWV9dXl1cXWBhXltiYmNoZmVkYlhgYGJdYGhlZmRhXl9dXV5aWl9aX2dgXl5dY2hrYWhmaGZkYGJkYlBLTUxQUUxPVFBQVFFPUVpZWFdZWlpYWVZdamRWWFlaV1ZUVE9LT1ZUUE9UUFBRTk1RUU9SWFNRUU9NT1NVTldRVFRVT05OUVRVVVRUUlRYVlpdXFpWVlFSV1hWW1xWUFNVVVVWWVRXV1RSUlhWVltfW15gX1ZfXV5gXFxgYF9fWmJiZGhoZWRiWWJgYl5eZmRjYGJdXFxcXFlaW1hbYVteXV1fYl9fYmRkYmRfX2BcUE1OTlJRTVJTUFNUUU9VXFpaV1tbXFlaW2RxbWhkX1tZVlZYUk1NVlNNTlJPUVJPTVBTUlVaVVNQUExQV1VRVlJTU1hNT1BRVFhVVVVTVVlYW15dXFtWUk9VVlVbW1ZRU1ZVVlhVU1haVFNRWVdXXF9bYF9gVmJcYGFeYGJfXGBdY2FjZ2llZmBaY2BhX19lZV9gY1taXFtcWlpZWVdcWVxbYF5gW15eYWBfY1xZYFpRTk9OVlFQVVNQVVRTUFdcXFxZXlxfV1xeanB3eYBjXFtWVllSTk9XU05RUVBSVFJMUVRTWVtXVU9STlNYVVNSVFJSWk9RU1NWW1ZWVlRWWlhdXlxcXlZTTlRWVltbVVFTVFZYWFJTWVxUUlJcWFpdXl1hYWBXYltjYl5hY19cYmFiX2RnaWRnXlxlYGFgYWNkX2JfWVpfW1xbWVhZV1daW1phXV1bXVxcWl1gV1tbWlBPT09ZUFVVU1JXUlRQWl1eXVxgXGBVXF1oanJ9c2xoXFVZV1FPUltTUlFUUlRVVEtSVlVaWlpTT1NRVVVVU05WUlNaUlRVVFhdV1hYU1hcWF5dWVpdVVVOVlZXXlpYUVRUWFhYU1ZZXFRSVl1ZXV1hXmNjX1lgW2ViX2RkXl5jY2FeZWZpZWZdXmRhYWFiY2RfYl5YW19bXFtYWFhYV1taW2BdW1tcW1haW15WXlldUE9PUlpQW1VVV1ZUVFReXmBfXmJcYFVdXmJreXVtfWxaVVpWUVFUXFRUVFVUVllXTFJaVlxaXFJQVVNXVVVTT1dSU1dTV1VWW11YW1lVWl5YX15ZXFlSV1JZWFlfWVlTVVVaWVlVV1lcVVRaXVxeYGFgZWRdXl1dZWFiZmReX2RjYFxnZGhmZGJfZGFfYWBiYl9gXldZXlpcXFpZWldWXVpdXltaW1xbV1lcXVZYV11TT1BXWVBdVVZZV1dVWF9gYWFgY11gVV1eYmVldoJ7aFhZWlRWVFZcWFdXVlZXXVhPVVxZXl1dVFNYUldVU1JTWFJTVlRYWFhdXlhdW1VeX1hfX1hcVlFZVVlaWmFYXFVXV1paWlhZWlpXVl1eX15jYmJlZV1iXGBmYmVmZF9gZGJhW2ZjaGZjZmFmX19hYmFhYF9eVlVdWVtcW1lcWVldW1tbWFhZW1laWl1fXVRZXVVOU1pXVFxVVldZV1ZcYGFhY2FjX19WW2BkYV96dW9oWlxaVlhWWFtaWVtZWFlgVk9UXVtgYVxVVVlQVFZUUlZWUlNVV1tbXF9eWl9cVl9fWl1eWV5WU1lYWVpdYlleVldaW1tbW1tZWlhZX19gYGRjZGVlYmRaYmZjZ2ZlXmFiYGNeY2NpZWRnX2deYmJjYWFgXl9YVFpaWltbWFxYWFxbWltXV1pYV1xbXGBdVl1dU09WWlZWWlZZVVhXWF5gYmFkYWRhXllZYWRiYGtmaF5cXVtXV1laXFxcX1tZW2JWU1deXWFjXFNWWVBWVVVVVlZTVVRYXV1fYGBdYV1XYF5bXlxbXlhWWFhbWl9fW19YWFxcXV1eW1pcV1pfYV5gZWRkZmZmYlljZmVoZ2ReY2BfZWNdZmlkZWhfZ15jYmNhYWBfX1tYWVtZWlpYWlhXW1xaW1dYWlRZXVxaYFxVXmJNUldZVldaWVtcWVdZXmBiYWVhZGFdXllhY2JfYWBhX1xcXVhXW1tdXV9fXFpdY1hZWF1fY2RfUllZUFdWV1hXV1ZXVl1dXmFiYV9iXllhXV1eWV1eWVhVV1tbYF5cX1lZXV1eXmBcWlpZW19iX2JlZGVmZ2diWmRmZ2lnY19jXmBmZVppaWNmaWNmX2JiY2FgYF9dXVpYW1lZWFhaWVdaW1pZV1hWVVtdXV1gYGJieEtXV1xZV11cXF1aV1xdX2BiZGJjYV1gWGJjYmBjYWNeXFxdWFdbXV9dYF9dW2BkXFxYWmJlY2FSXFlPWFZZWllZV1paYF5hYmNgYWNfXGJdX11bX15ZWVRYXV1fX15fW1peXmBiYlxcV1tdYGJiY2VkZ2ZlZ2RcZWZoaWZjYWJcY2dgXGlpY2hpZmVgYmFjYV9gX11dXFlcWVhXWFlZV1xbWldXWFBYWl1hY2Zmcmt/SllXXVtaX11cXlxZXVteX2JjYmFhXWJbYmRhX2NiYl1cW1tYWGpxYFxgX11cYWNfXllZY2VkYlRfWlFZV1xdXFtaW1tjYGNjY2BiZGFgY15gXF5fX1pYVltfXVxhYV9dW2BhYmViXlxTXF9gY2RkZmVnZmVmZV9mZmhoZ2RkYFtmZ15haGhiaGhmY2BiYGNiX19fXV1bWltZWFhYVlpWXFpaVlZVTFhXXGdpa2h1eIF2dnZ2dnZ2dnZ2dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6e3p6ent7e3t7e3t7e3t7e3t7e3x7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHt7e3t8fHx8fHx8fHx8e3t7fHx8fHx7e3t7e3t7fYmIhoqHhYKBgoOCg4OCgoKCgoKCgoKCgoGAgYCBgICAgYCBgYGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t6e3t7e3t7fHx8fHx8fHx8fHx7e3t7e3t7e3t7e3x7e3t7e3t7fHx8fHt7e3t7e3t8iYmHiYaFgoGCgoGCgoKCgYKCgoKCgoKBgYGAgICAgICAgIGBgYB9fHx8e3x8fHx8fHx8fHx8dnV1dXV1dXV2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eHh5eXl5eXl5eXl5eXt7e3t7e3t7e3t7e3t7e3t7e3t7e3p6enp6ent7fHx8fHx8fHx8fHx7e3t7e3t7fHx8e3t7e3t7e3t7fHx8fHx7fHt7e3uHiYiJhYSDgYKCgoODgoKCgoKCgoKCgYGBgICAgICAgICAgYKBgH58fHx8fHx8fHx8fHx8fHx2dXR1dXV1dHV2d3d3d3d3d3d3d3d3d3h4eHh4eHh4eHh4eHh4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t8e3t7e3x7enp7enp6enp6enp6e3t8fHx8fHx8fHx8fHx8fHx8e3x8fHx8e3t7e3t7e3x8fHx8fHt7e3t7e4aJiYiFhYOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgIGBgYCAfnx8fHx8fHx8fHx9fX18fHjF1NLS0tLUk3t9fX19fYSMi4uLi454KSkqKiopKz0/Pj4+Pj5tgH5+f397pdfT09PT1r2GiYmJiYqHc3FycnJxb6nBvr6+vr7K09LS0tLWun1+f39/f359fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx8fHx8fHt7e3t7hIuHh4aHgoGDg4GCgoKCgoKCgoKCgoGBgYCAgICAgICAgYCBgIB+fHx8fHx8fHx9fXx8fH19eNXn5OTk5OeZe39/f39+hpCPj4+Pk3kZGhoaGhocMTMzMzMzMmqCf4CAgHut6eTk5OToyomMjIyMjIlyb29vb29sstDMzMzMzNvm5eXl5enHfX5/f39/f319fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e3uCjYeIh4eDgoSCgYKCgoKCgoOCgoKCgYGBgICAgICAgICAgICAgH58fHx8fHx8fXx8fH19fX12fn9/f39/gHl3d3d3d3d4eXl5enl6eG9vb29wcHBycnJycnJyd3p5eXp6en6Dg4ODg4SBfHx8fHx8fHp6enp5eXl/g4KCgoKChISEhISEhYJ8fX19fX19fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e4CMhomHh4SDhIKCgoKCgYKCg4KCgoGBgYGBgYCAf4CAgICAgICAfnx8fHx8fHx8fX19fX19fXZ0dHR0dHd1dnd6e3h7eHd2dnh4eXl5fXl4eHl4eHh5eXl5enp5eXl5enp6eXh4eXl5eXl7e3t7e3t7e3t7e3t7e3p5eXl5eXp6enp6enp6e3x8fHx9fX19fX19fX18fH19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8f4uHi4qIhIODgoKCg4KBgoKDgoKCgYGBgYGAgIGAf4CAgH+AgYF+fX18fHx8fHx9fX19fX19d3d3dnZ3fXh3d316eH14d3d3fHt7fHt9e3d3d3d3eHh4eHh5eXl5eXp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fHx8fHx8fHx7e3x8fHx8fHx8fHx+iomMjImFg4SEgoKDgoGCgoKCgoKBgYGBgYCAgICAgICAf4CAgH19fXx8fH19fX19fX19fX13d3d3d3p9eHt4fHx3e3h3d3l+fHx9fX58d3h4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fX19fXx9fX19fX19fX19fX19fHx8fHx8fHt7fHx8fHx8fHx8fH2Kio2NioWDg4OCgoKCgYGCgoKBgoGBgYKBgIGBgICAgIB/gIGAfXx9fX18fX19fX19fX19fXd3d3d3fX55d3d4e3p8eXd3e359fXx9fnx4eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt8fHx8fHx8fHx8fHx8fH19fX18fH18fH18fHx8fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8foqJjo2JhISEg4KDgoKBgYKBgoKCgYGBgoGAgYKAgICAgH+BgIB8fH19fX18fX19fX19fn5+d3d3d3d5fHl7eHx9eXt5enp4e3x8fHt+e3h4eHh4eHh4eXl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt7fHx7fHx8fHx8fHx8fXx8fX19fX19fXx8fHx8fHx8fXx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx/iIeNioeFhoaDg4ODgoGBgoGCgoGBgYGCgYCAgoF/gICAf4CAgHx8fX19fX19fX19fX5+fn53d3d3d3Z4eHl3eXp4enh5eXd4enp6eXx4eHh5eXh4eHh5eXl5enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX18fH18fH19fX19fH19fX19fHx8fHx8fHx8fHx8fX+HiIyIhoeHhIKDhISCgYKBgYKCgoGBgYKBgIGBgYGAgIB/gIGAfHx9fX19fX19fX1+fn5+fnd3d3d3d3d3d3d3eHh4eHh4eHh4eHl5eXl5eXl5eXl5eXl6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fHx8fX19fHx8gIeIi4eHiYaDg4SDg4KBgYGCgoGBgYKCgYGBgIGBgYCAgICBgX97fH19fX19fX19fn5+fn5+d3d3d3d3d3d4eHd4dnl5eHh4eHh5eXl5eXl5eXl5eXl5enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fH19fXx9fXyBhoqKiYmIhIOFhISCgoGBgYGCgYGCgoGBgYCAgYGAgIGAgIGBf3x8fX19fX1+fn5+fn5+f394eHd4eHh4eHZxZGpeam15eXl4eHl5eXl5eXl5enp6enp6enp6enp7e3t8e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIGFiYqJioeEhYWEg4KCgYGBgoKBgYKBgYGBgYCBgYCAgYCBgIF+fH1+fn5+fn5+fn5+fn9/f3h4eHh4eHh5bWRiZV9fXm95eXl5eXl5eXl5eXp6enp6enp6enp6e3t7e3t7fHx8fHx8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goWKiomJhISGhYSDg4KBgYKCgoGBgoGBgYKBgIGBgICAgICBgH58fX5+fn5+fn5+fn9/f39/eHh4eHh4eW5kZWdlZGJeZnh5eXl5enp6enp6enp6enp6enp6e3t7e3t7e3x8fHx8fHt8fHt7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChouJiIqEhYaEg4OEgoGBgYGCgYKCgYGBgYCAgYGBgIB/gIGBf3x8fn5+fn5+fn9/f39/f394eHh4eHl3Z2VkZWZkZWFfaXl6enp6enp6enp6enp6ent7e3t7e3t7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHt8fHx8fHx8fHx9fX19fX19fX19fX19fXx9fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4eJh4SEhoSDg4WBgYGBgYKCgYGBgYKBgICAgYGAgYCAgYF+fHx/f35/f39/f39/f39/gHl5eXl5eWtlYWJlZWFlZV5ieHdze3p6enp6enp6enp6e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fH18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19g4aLhoiFhYaEgoOEhIKBgYGBgoKBgYKBgYGAgYGBgYGAgIGBgn98fH9/f39/f39/f3+AgICAeXl5eXl0Y2NlZGNmY2doZGZsZF5ze3p6enp6enp6enp6ent7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn6DhouGhoaGhYODg4SDgYGBgYGCgoGBgYKBgYCAgYGBgYCAgYGBfnx8f39/f39/gICAgICAgIB5eXl6d2RhY2diYmRdW2VfYV1eYGFoeHp6enp6enp6enp6e3t7e3t7fHx8e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+foSFi4eGhoaGhIODg4KBgYGBgoKCgYKBgoGAgIGBgYGAgYGBgYF+fX1/gH+AgICAgICAgICAgHl5eW9vYmJiZF5jZ19dYWFgXF9kYlttfHp6enp6enp6enp7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7fHx7e3x7fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5/hIiLhoSHhoaEhIODgoGBgYGCgYGBgYKCgYCAgYGBgYGBgYGBgX5+fYCAgICAgICAgICAgICBeXpwXWJlZGJkXmZnZ2BZYmJhY2VfXF1ze3t6enp7e3t7e3t8fHx8fHx8fHt7e3t7e3t7e3t7e3t7fHx8fHx8e3x8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fn19fn5+fn5+fn5+fn5+foCFjIqEhYaGhYODg4SCgYGBgYKBgYGBgoKCgYCBgYGCgICAgIGBf35+gICAgICAgICAgIGBgYF5emxiZGdjYmdmYWBgZGFiZWRjZGNeXGJ1fHt7e3t7e3t7e3x8fHx7e3x8fHx7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/gYeMiYWGhoeFg4SDgoGBgYGBgYKBgoKCg4KBgIGBgYKBgYGCgoF/f36AgICAgICAgIGBgYGBgXp7dGdnZmZkZGZmYF5fYWNlaGRlXmJkYHR8e3t7e3t7fHx8fHx8fHx8fHt7fHt8fHt7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f3+CiYqIhoaIhoWDhIOCgYGBgYGBgoGBgoKCgoGAgYGBgoKBgYKCgX9/f4GBgYGAgYGBgYGBgYGBenptaGNjZ2ZnZWdlZmdiZWRlYmdbYmVgdnx8e3t8fHx8fHx8fHx8e3t8fHx8e3x8fHt7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f39/f4SJioiGiYeFhYSEg4KBgYGBgYGCgYKCgYGBgYGBgYKBgoGBgICBgH9/gYGBgYGBgYGBgYGBgYF7emlpZGNqZmFgZmVjY2NnaWRjYmBiZGJ0fXx8fHx8fHt8fHx8fHx8e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f39+fn9/f39/f39/f3+AhIqMiIeJhoSFhYOCgYGBgYGBgYKBgoGBgYGBgYGBgoKBgYGBgYGAgH+BgYGBgYGBgYGBgYGBgXZzZWRnY2RmZWJlZmdkZmhmZWNgYGNkYHF9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fXx8fX18fHx9fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/fn5+f35+f39/f39/f3+AgICFioyJiIqJhoaDgoKCgYGBgYGBgoGBgoGBgYGBgIGBgYGBgYGCgX+Af35/foCCgoKCgoKCgoKCc3NnZWRkZWlqaGZnZ2NhZmZlZmdmZWVjdX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fH19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gICAgICAgIWLioqJioeHhoSCgoGBgYGBgYKCgYKBgYGBgIGBgoKBgYGBgYGAf4B+dHRzdX1/goCAfn5/gYB0cmdkZWNmaWppZWNlY2BmZGRnZ2JiZWFwfXx8fHx8fHx8fHx8fHx8fHx9fX18fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f39/f39/f4CAgICAgIB/houLiouLh4eHhIOCgYGBgYGBgYKBgoKBgYGBgYKCgYCBgYGBgoCAgH5zc3NzdHV4dXV0dHV2dXVwZmNmZWhoaWdoZ2VmZWJfZGVmY2BiZ3d8fHx8fX19fX18fHx8fH19fX19fX19fXx9fXx8fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gIB/f3+AgICAgICAgICHjIyIi4qHh4eEhIKBgYGBgYGBgoGCgoGBgICBgoGBgYKBgoKCgYCAfnNzc3Nzc3NzdHR0dHNzdW9jY2FnZWhoZ2pmZGVnZmhmY2JlYl5ieX18e3t8fX19fX18fHx9fX19fX19e3x9fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn9/fn5+fn5+fn5/f39/f4CAgH9/gICBgICAgICAgYCAf4CAgYGAgIeLi4iNiYiJhoSFgYGBgYGBgYKCgYKCgYGBgIGCgoGBgYKBgoKBgIB+dHNzc3Nzc3Nzc3Nzc3N1cmdlZWRlamhoZ2ZpaGdjZWViZGNoZGd7eHVzc3R2dnl4dnR0dHZ3d3d2dHR0dXV4d3h4d3d6e3x9fXx9fn5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f35/f39/gH9+fHt7fX58eXl2dnZ5fHx6end2d3l7fXt4hIyMioyHh4iEhYSBgYGBgYGBgoGBgoGBgYGAgYKCgYGBgoGBgoGAgH51c3Nzc3Nzc3Nzc3Nzc3VzaGVnaGVrbGhqZ2lqZ2dnZmRkYmVkbnV0dHNzdHNzc3Nzc3Nzc3Nzc3NzdHNzc3Nzc3Nzc3N0dHV1c3V3eHl7fn59fn98f39/f39/f39/f314fH5+fXx4dXZ3eXd4dnRzc3N0dXRzc3Nzc3NzdHNzc3R0c3R0dHODjI2KiYeIhoOGg4GBgYGBgYGBgYGCgYGAgYGDgoKBgYCBgYGBgICAf3VzdHRzc3Nzc3Nyc3NzdnZpY2hqaGpsZWZpbGhgZmVkY2BkZGZ0dXV1dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHRzdHRzc3Nzc3R2dnV1d3V4fH9+fX9+fHp4dXN0dXV1dHNzc3Nzc3N0dHR0dHR0dHR1dXR0dHV1dHR1dXR1dXV1dIaMjYuIhoeEhIWCgYGBgYGBgYGCgoGAgYCBgYKCgoGBgIGBgYGAgIB/dnNzc3Nzc3Nzc3Nzc3N2dnNnZ2pmaGdmaGhmZGlnY2NnZWVmcHZ1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dHR1dHR0dHR0dHRzdHR0dnV1d3Z0c3R0dHR0dHR0dXV1dXV0dXV1dXV1dXV0dHNzc3N0dHNzdHR0dHR1dXR1iY6MjIqHh4SEhYKBgYGBgYGBgYKCgoGBgICAgoKCgoGBgYGBgYCAgH93c3Nzc3NycnJyc3NzcnZ2dW5kXWNnZWlraGVoZ2dqamlnZXB2dXV1dXV0dHRzdHR0dHR0dHV1dXV1dXV0dHV1dHR1dXV1dXV1dXV1dXR0dHV1dXV1dXV0dHV0dHV1dXV1dXV1dXV1dXV1dXV1dXV0dHNzc3Nzc3N0dHNzc3Nzc3R0dHR0dHWKjoyMiYaGhIeFgoGBgYGBgYGBgoKBgYGAgYGCgYKBgYGBgYKBgICAf3hzc3Nzc3JycnJyc3NzdnZ3d2liaGhnamtpaGZkZGVmaWhwdXR0dHRzc3JxcnJ0dXV0dHR0dHR0c3NycXFxcXNzdHR0dHR0dHR0dHV0cnJyc3R0dHR0dXV1dXV1dXR0dXR0dHR0dHR0dHR0dHR0c3Nzc3Nzc3Nzc3Nzc3N0dHN0dHR0dHR0dYuOjImGhYWFh4SCgYGBgYGBgYGBgoKCgYGAgIKCgoGBgYGBgYGBgIB/eXNzc3NycXJycnJzc3N3d3d3bGpoZGhpa3Z6a2VmZWhnbXJzdHN0c3JwcHBxcnN0dXR0c3NycnNycXBvb29vcHFzc3NycnJyc3R0dHNxcHFyc3R0dHR0dHRzc3Rzc3NzdHR0dHRzdHR0dHR0dHRzdHR0c3NycnFxcnJzc3Nyc3NzdHR0dHN2jZCMh4eFhYSEgoGCgoGBgYGBgYGCgoKBgYGAgYGCgoGBgoKBgYGAf395c3NycnFxcnJycnNzc3d3d3dzc2pnaWloeX99cW51bG5wcXJycnFxcG9wcXFxc3Rzc3NycXFwcG5ubm1ubW5ubnBxcnJycnJycnJzcXBvb3BxcnJzc3JxcnJycnJycnJycnJzc3Jzc3Nzc3Nzc3Nzc3Jxb29ubm9vcXJzc3Jyc3NycnNzcnaPj4uHhoWFhYOCgoKBgYGBgYGBgYGBgoGBgYGCgoKBgoGCgYGCgX9/f3hxcHBwcXFycnJyc3Nzd3d2dnd2cnF0c252f352c3hwcHBycnJycXFwcHFxcXFyc3Nzc3FwcXBvb25ubm5ub25vcHBxcXFxcXBwcXJwb25vcHFxcXFxcHBxcXFxcXJycnJycnJycnFxcnFxcnJycnFwb29ubm1ubW5vcXJycnJycnJyc3JxeI+OjYaDg4aEgoOCgoGCgYGBgYKBgYGCgYGBgYKCgoKCgoKBgYKBf4B/d29wb3BxcnJyc3Nzc3J2dnZ2dnZ3dnZ1c3l/fnd3d29wcXFxcXFxcHBwcXJxcnJzc3JycXBwb29wb29vb29vb29wb3Bvb29vcHBxb29vcHBwcHBvcG9wcHFycXFxcnJycnFxcXFxcXFxcHBwcHBxb29ubm5tbW5tbm9wcXFxcXFxcXFxcXB7j42NhoODhYOCgoKCgYKBgYGBgoGCgYGCgoGCg4KBg4KBgYGAgYF/f392bm9wcHBxcXFxcXBwcHZ2dnZ2dXR0c3NxfYB9fX9zb3BxcXFwcHBwcXFwcHBxcnJxcXFwb3Bvb3Bwb29wcG9vb29vb29vb3BxcXBub3Bwb29wb29wcnJycnFxcXBxcnFwcXFxcHBwcHBwcHBwb29ubm1ubm5ubm9ub3BwcHFxcXFxcXFxcIKRjoqEhIOFhIOCgoGBgoKBgYKBgYGBgYGCgoKCgoKCgYGBgYCBgX9/gHVvb29wcXFxcXBwcHBwdnZ2dXRzcnJycnGAgoCBeXBwcHBvcHBwcHFxcXFwcXFxcXFxcG9vcHBwcHBwb3BxcHBvb29wb29vcXFwcG9wcG9vb25vcHFxcHBwb3Bvb3BwcHBwcHBwcHBvb29vb29vbm5tbW1ubm5ub25vb3BvcHBwcHBwcHBwiZCMiISDhIaDg4KCgYGCgoKCgYGBgYCAgYGBgoKBgYGBgYGBgIGBgH+AdG5vb3BxcXFwcG9vcG92dnVzcnFxcXFxcICDg39ycHBwcHBwcHBwcHFxcHBxcXFxcXBwcHBwcHBwcHFwcHBwcHBwcHBvcHBxcXBwcHFxb29vbm9wcHBvb29vcHBvb3BwcHBwcHBwcHBvb29vbm5ubm5ubW5ubm1ubm9wcG9vb29vb3BzcXWPj4yJg4KFh4ODgoKBgoGCgoKBgYKBgYGBgYGBgYGBgYCAgYGAgYGAf4B0b29vbm9vb29vb29vb3Z1dHNxcXFxcXJygIKCgXRxcXFxcXFxcXFxcXFxcXFxcXBxcXFxcHFwcXBxcXFwcHBwcHFxcXBxcHBwcXBwcHBwcHBwcHBwcHBwcHFxcXBxcHBwcHFwcHFxcHFxcXFxcXJxcnFwcnRycnR0dHR1dnRzdHR0dXd3gpCPi4iDgoaHhISCg4GBgYKCgoGBgoGBgYKBgYGBgYGAgICBgYCBgYB/gHVvb29vb29vb25vb29vdXRzcnJycnJycnKDg4OCdnFycnFxcXJxcnJxcXJycnFxcXFxcnFxcXJycXFycXFxcXFxcXFxcXFwcXFxcXFxcnNzcnJyc3V1dHR0dHR0dHV2d3d3d3d3eHh4eHd3eHh4d3Z3dnV2dnZ2d3h6e3x7e3t6enp6enyGkI2LiIODiIeHhYODgoGCgYKBgYGBgYKCgoGBgYGAgYCAgYGAgIGBgH+Ad3FxcXFxcG5ucG9wcG92dHV1c3Nzc3NzdYiDgoN5cnNzcnJyc3Jyc3NycnJycnN0cnJzcnNzc3Nzc3Nyc3N0dHV1dXV1dHV3eHd3d3d4eHh3eHh4eXl5eXl4eHl5eXp6e3t7e3t6enp5eXh3d3d1dnV2dnd5enp7fn5+fX1+fn5/f35+gIyPi4qHg4WIi4iEg4SDgYGCgYGBgoGBgoKCgoKAgYGBgYCBgYGAgIGAf4B8enp5eXx5eHh2dXZ2dHl2d3h3d3Z3dnZ6f3x+fnx2dnd3dnV4enh4eHh3d3d2eHx5eXx6eXl8e3l5eXh4eXl6enl5eXh4enp5eXh4eHh3dnd3eHh3eHh5eXp7e3p8fH1+fX9/f359e3t7e3p5enl5e3t/foB/fn5/fn19fX5+f35+fn6AjpCNioeEhoqLiIaGhIOBgoKBgYGCgYGCgoKCgoCBgoKBgYGCgYCBgIF/f4B/fn19fX9/f318e3t7eXh4eHh5eXl4eXh5eXl4enp6enp6e3t7fH1+fHt7ent8e318e3t7e3t7enl4eXh4ent6enp5eXp8fHt6enx8fHp6ent9fHx+fn+AgoGAgYKAgH9/gYGBgIB/f35+fn5/fX1+f4CAf35+f39+fn9/f39/gH+Af4OQjoyHhoWIi4yIh4aFg4GCgYGBgYKBgoKCgoKBgYKDgoGBgYGBgIGBgIB/goOCgoGBgX99f39/f4F6enh4d3h4eHh5eHh5enp5e358enx9fXt8fX19fHx8fnx9fn5+fn59fX9/f3x8fYGDgYCAf318fXx9fXt9fXx8fH19fX1+gYGChISDgoB/gYGBgH9/f4B/f39/f39+fn9/f39/f35+f3+Af39/gICAf4CAgICAhJCPi4eGhoiMi4iKhYaDgoKCgYGBgoGCgYKBgYGBgoOCgYCAgYGAgIGBgH+ChIKCgICAgH9+fn+AgH9/fn18fX19fYB/fX+Af35/gH9/fn9/gIGBgICAf3+BgICAf4CBgn9/f4CAf35+f39+f39/fn5+f39/gYB/f4CBgYCAgYOEgoGCgoGCgH+AgYCBgYGAgH+BgICAf39/gICAgYGBgIGBgYCAgICBgoGBgYCAgYGFjo6MiIaHiYyLi4qGhoOCgoKBgYGCgoOCgoKBgIGBgYKCgICBgYCAgYGAf4KFg4KBgYCAf39+fn+AfX5+fn19fX5/fn9/f35+fn+AgYCAgICAfn9/fn+Af3+AgH9/f35/f39+fn59fn9+fn9/f35/gIGBgoKDg4KCg4KBgYKDg4OCgYGBgYKBgoKCgYKBgoGBgYGBgoKCgYGCgYKCgoGBgoKBgYKCgoKCgYGBgoKCgoaPkY+KiImKjY6NiYaFgoKCgoKBgYKCg4KCgoGBgYGBgYF/gIGBgYCBgIF/gYWEg4KCgoGCgYCAgIB8fHx7fH18fH9+fn9+fn5+f35/f39/f39/f35+foB+fn5+fn9/f39+f39+fn5/gIB/gIB/f39/f3+BgYGCgoCAgYKDg4SDg4ODgoKCgoKCgoKCgoKCgoGCgoKDg4OCg4ODgoKCgYKCgoODg4ODgoKCgoODg4KCh5KTkIuKi4uPj42Lh4SCgoKCgYGBgoKDgoKBgYGBgIGBgICAgYGBgIGAgYCAg4SDg4OEg4ODgoKCgXx9fHx9gn1+f4GCiIGCgoSCgYGDg4GBgYKDgYKBgYCAf39/gICAf3+AgX9/f39/gYCAgICAgH9/f3+AgICAgH9/gYODhYSEg4SDgoKCg4OCgoOCgoODg4ODg4SDg4KEhYWDg4SEgoKDhIOCg4ODg4OCgoODgoCKlJOPioqMjpCPjYuGg4KCgoKBgYGBgoOCgYGBgIGBgoGBgICBgYGAgYCAgH+BgoODg4SEhIOCgoKCfXx8fn6AgYOAg4OChIaFhoaFhIWFg4ODg4SBgYKEhIKCgoeDgoKAgoGBgoKCg4KCg4KDgoODgoGAgIKCgYOCgYKCg4OEhYWEg4OChISEhIOEhISDg4OEg4ODg4OEg4SDhIWDhISDg4ODgoKCgoKCgoKBgYKCgo+UlI+Njo6RkY6KiISCgoKCgYGBgYGCg4GBgIGBgYGBgYCBgIGBgYCBgICAgIKChIKChIOCg4ODgoJ9fX2AgH+AgoGDg4ODhIaEhIOEhYWDg4GBg4OBgIKDgYKFhYWFhoaHhoWGhoeHh4aGhoeHhoaEgoGCg4SDg4ODg4ODhISFhYWDhYSFhISEg4KBg4OCg4SEg4KCg4SCg4ODg4OCgoKCgoKCg4OEhIOFhYWFhoaIk5OTkI+Pj5KRjIqHgoKCgoKBgYGBgYKDgoKBgIGBgYGBgICAgYGBgICAgICAhISEgoKCgoGBgoKBgX+AgYOCgICAf4CCgoGDg4KCgYODg4SEg4KDhYOCgYGBgoSFh4eHh4aGh4eHiIiHh4eIiIiFhIOBgIGBgoKCg4GCg4SEhYSDg4OEg4OEhIOBgYGCg4OEhISDg4ODg4OEhIODgoSDg4ODhIWFhoeHh4eIiIiJiY6TkpKOj46Qko+LiYeCgoKCgoKBgYGBgoKCgoGBgIGBgYGAgICAgYGAgIGAgICDg4KCgYKCgYGAf4CBhYWFhoOCgYB+fn+BgoSCgoKDhIOCgoODg4KChISDg4OCg4SFhISFhYSDg4SFhYKEhIWFg4KBgH9/gIB/gIGEg4OEhYWEgoKCgoOCg4OFhIKDhISEhYaGhoaGhoWFhoeHhYaIh4aHiIeGhoaIiYeGhYaGhoeIkZKSkI6QjpCRjImHhYGBgoKCgoGBgYGBgoOBgYGBgYGBgICAgICBgYCAgICAgISEg4KBgoGAgYGAgYKIh4aHhYSCgH99fX6AgH+AgYGBgYGBgoGAgYKCgoGCgoKBgYGCgYKCg4GBgICAf4GAgH+AgH9+gIGBgYKCg4OEg4OEg4OCgoGBgoODg4SEg4SEhIOFhYaFh4eIh4eHh4eHh4eGhoaGh4WFhYaGhIWEhIWEhYaSk5GOjo+OkI6JiIeEgoKCgoKCgoGBgIGCgoKCgoKCgYGBgYGBgYGBgICAgYGAgoSDg4KDgoGCgYKDg4iHh4iHhYSCgX5+gICAfn5+f4CBgYGCgYCCgoGCgH+AgIB+gIKBgIGCg4OAf39/gICAf4CAgICDg4KDg4ODgoOBgYKCgoOCgYKCgoOCgoSDhISDg4SEhYWFhYaGhoaFhISEhYWEhIWFhYSEhISDhISEhISEipSTkZCQj46NiIaFhIOBgYKCgoKCgYGAgYKCgoKBgoKBgYCBgYCBgYGAgICAgYGAgoOCgoOCgoKBgoOCiImJiYiHhYSDgYKEhIOBgYGCgoSCgoOEgoOEhYaEgoSCgX+AgoGBgoGChIOBgYGBgoOCgoGDg4SDg4SEg4OCg4KDg4ODg4KCgoKCgoGDhISEhYSFhYWFhIWEhIWFhYWDg4OEhISEhYWFhISEhISEg4ODg4OOlZKRkZGOjYyHhYODg4GCgoKCgoKBgYCBgoOCgYCCgYGBgICAgIGBgYCAgICBgICDhYSEhIODg4SDhIOGh4mIhoWDhIODg4WDgYCDgoOFhYODg4SDhIODhISFhISEgoGAgYKDgoKEg4OCgoGBhIWEg4ODgoKDhISDg4ODg4SFhISDg4KCgoKCgoSEhYSFhYWFhYODhYWFhYaFhoWEhIWEhYWGhYWFhIWEhISDhIODhJGUk5KSj42MioWEhIODgYKCg4KCgoKBgYGCg4KBgYKBgYGBgIGBgIGBgH+AgIGAgYaGhoaGhoaHh4aGhYSDhYaCgIGBgYGHgoB+f4GAgIKBgX+BgYCAgoGCgoKBgYKCgYCCgoKCgYKDg4GCgYKDhYODg4KDg4OEgoKEhIOEhIWEg4OCgoKCgYGCg4ODg4SFhYWFhIOEhYWGhYWEhISEhIOEhIWFhYWFhIODhIOEg4KGlJOSlJKPjYuHhISDg4KBgoODgoKDg4GBgoKBgoKCgYGCgYGBgYCAgYGAgICAgICAhYWFhYaGh4aGhoWGg4ODg4GAgoKCgYKAf35/f4CAf4B/gIGAgH+HgoGBg4GAgYGChIOBgYGBgYKBgYKDgoODgoOCgoKCg4OBg4SDg4ODg4OEhIKCgoKDgoKDg4ODhIWEhISEg4OEhIODg4OEhIODg4ODg4SDg4ODg4KDg4KDgouUk5KTkY2NioaDg4OEgoGCg4ODg4ODgoGBgoGCgoKCgoKBgYGBgICBgYCAf4CAgICDhISFhYSFhYWEhIWCg4KDgoKDg4OBgICAgICAgYCAg4KCg4KBgpKMgoOEgoODg4KAgICCgoKCgoKDg4ODgoODhIKCgoODgoKDg4KCg4KDg4WEg4ODg4SDg4SEhISEhYWEhIWEg4SEg4OEhISEhISEg4SEhYSDg4SEhIODgoKDkJSSkpKPi4yIhoOEg4OBgYKDg4ODg4OCgYGCgoKCgoKDgoCBgoGAgICAgIB/gICAgISDhYWEhYWFhYSFhYOEhIWDg4SEhIKCgoOCgoSCgYKGhoOCgX5/kZmGhYSEhYJ/fX19foKEg4ODg4OEg4ODhISEg4OEhISEg4SEhIOEg4OFhoWFhYSEhoWFhYSFhoWGhoWFhYWFhYWFhYWGhoWGhoaFhoaGh4aFhYWFg4SEhIeTk5KRkoyKiIWFhYWCgoGBgoODg4OCg4KBgYKDg4ODgoKBgIGAgICAgICAgH+AgICAhYWFhYWGh4eGhYWFhISFhYSEhISEg4ODg4OEhYOCg4WIgn59fn2FnIyGhoOBfn9+fn5+f4OEg4OEhISEhISEhISEhISFhYWEhYSGhYWGhYaGhoWGhYWHhYWGhYaGhoaFhIWFhYWFhIWGhoaHhoaGhoaHh4iIiIaFhYaEhYWGjZSTkpGQi4qHhoeGhIGCgoKDg4ODg4KDgoGBgoODg4KAgYGBgICAgICAgICAf4CAgICHh4eGhoeHiIeHhoaEg4ODhIODg4OEg4ODg4OEhIODiYqAgH6Fin+Tj4SBf39/f39/f35/gISFhIWGhoaFhYWFhoaHhoaFhoWFhoeHh4iHh4eGhoaHh4eGhoaHhoaGhYSDhIWFhoSFhYaGhoeHhoaGhoeHh4eIiIeGhoaHh4eRk5KQkZCLiIiFhoSDgoKBgoODg4ODgoKDgoKCgoOCgYCBgICBgICAgIGAgIB/gICAf4aHiIeHh4eIiYmIiIODgoKDgoSEhIWEg4KCg4OEg4KKioOIgoOFgISEgH9/f39/gIB/f4B/f4WFhoeIiIeHh4eIh4iHiIiIhoaHiIiJiYmIh4aHh4eIiIaHhoeHhoaFhIOEhYaFhYWFhoaGh4eFhoeGh4aHh4eHh4eHh4eFh5OTkY+RkIuHhoWGhIKCgYGCg4ODg4ODgoKCgoGCg4KCgIGBgYCAgICAgICAf3+AgYB/hoiIiIiHh4iJiYmIg4KCg4ODhIWHh4eFg4OFhIODg46JhoaLg3+AgIGCgYGBgYB/gH9/fnt6gIaIiIqKiYmIiImJiYmKi4qIiIiJiouLioqIiIeIiIiHh4iIh4iGh4aEg4OFh4eHhoWFhISDhYWEhYWGhISEhYWFhoWGhYOJlJOQj5GOioaFhoWDgYGBgoKDg4ODgoKCgoKCgoKCgYGBgYGBgYCAgICAgIB/gICBgH+GiYiIiYeIiImJiIiEgoKDg4KDhImKh4eEhIWEg4OEkIeBgoKCgoKCgoKCgH9+fH19fX9+fHt8g4eJi4uKioqIiIqJiImLiomJiImIioqJi4mHhoaGh4WGiIiJiIeGh4SDgoSIiIiIh4WCgoGDg4KDg4SCgoKDgoGEg4SEgY6TkpCPj4uIhYSGhIKBgYGBgoODg4OCgoKCgoKCgoGBgYGBgIGAgICAgICAgH+AgIGAf4WIh4eHhoeIiIiHh4SCg4OCgoOFiYqJh4WHhYSFhYWIg4KCgoOCgoKDgX59fn5+fn5+fXx+fX19g4eJioqHh4WGh4eHh4iHh4mGiIaIh4eJiIODhIOFhISFhYaIh4aFg4KCg4WHhoeGhoSCgoOEgoODhIKBgYGBgYODhIOEkZKRjo+Oi4eEhoaDgoGAgYGDg4ODg4KCgoKCgoKCgYGBgIGBgYCAgIB/gIGAf39/gIB/hYaGhYaGhoeHiIeGgYKEhIOChYeIi4qGhIaEgoaHgoGChIODg4OCgoF9fH1/gH9+fn59fH19fHp8hIaHhoSDgYKDhIWFhYODhYSEhISEhIWEgoKDgoSEgYKDg4WGhYSCgYGCgoODhYOEhIWEhIaDhISFg4KDgYKDg4SFhIeSkY+NkIyJhoSFhIWCgYCBgYODg4ODgoKCgoKCgoKBgYGBgYGAgICAf4CAgYB/gICAgICDhIWEhYWFh4eHh4aAgYGFg4OEhYSHiIWCgYCAgoB+f4SEg4ODgoKAfX1/gICBf31+fn18fX16enp+g4SEgoGBgIGBgoKBf36BgYGCgYOAgoGCgoKBg4OAf4CAgYOCgICAgICBgYGCgYGChIODhYSCg4SDgoKBgoSDhYWGjJORjo+Pi4iFhYOChIGBgYGBgoODg4KCgoKCgoKCgoGBgYCBgYCBgH9/gIGBgICAgH+AgIKCg4OChIOEhYWGhn+BfoCBgICAgIGDgn9+fn5+fX2AhISCg4ODgX59fn+AgIGAfn19fX1+fXx6enp/goKBf39/f35/f4B+fYB/f4CAgX+AgIF/f3+BgX59fX+AgX9/foCAgH+AgICBf4CCgICCgYGCgYGAgYGBgYKEg4aPkpCOj42Kh4eGg4OCgYGBgYGCg4ODgoKCgoKCgoOCgYGCgYGBgICAgH+AgICAgICAf39/gYKDhIGCgoOCg4SFgIB/fH19fn1+foCAf31/fn1+gIODg4KCgYF/fX1+foCAgH9+fX19fHt7e3p6enqAgIB+f35+fn1+f35/gH9+f3+Af4GAf359fn9/fn18fn+Af35+f3+Af39/f4B/f4B+f4CBf4B+f39/gH9/f4B/hZKSj46Pi4uHiYWEg4KCgYGBgYKDg4ODg4OCgoKDg4KAgYKBgYGAgICAf3+AgIB/gIF/f36BgYSEgYKBg4OCg4OBgH98fn5/fn6Af4B/foF+foCChIOCgYB/f359fn5/gICAfn19fX17e3x6enl5eXuAgH9/f39+fX5/foCAf35/f4CAgoB/fH5+f35+fXx/f4B/fn9/f4B/f35/foCAf36Af39+fn5/f35+f318fH2Fk5KNjIuKiImIhISEgoKCgYGBgoOCgoODgoODg4ODgYCBgYGBgYCAf39/f4CAgICAgIB/foCBhIOCgYGDhISDhICBgICBgIGAgYKCg4GBgoCBg4SEgYGBgYCAfX19fn5+f359fX19fXx8fHt6enl5eX2BgICBgYF/f4B/f4F/gICAgYGCgoB+gH5/fn5+foGAgoF/f39/gIB/f39/gYB+f4CAfn9/fn+Af31+fX17fIaTkYyLioeHioiGhoSDgoGBgYGCg4ODg4OCg4OCgoKBgICBgYGAgH9/f39/gICAgICAgH9+fn+BgYGAgISGh4aHgoSDhYOBg4ODhYSEhISDgoODg4KCgoKCgX5+fX19fn6AfX19fX19fX18e3p5eXl5eYCCgoKEg4CCg4GAgoCBgYGDgoODgYGCgIGAf4CBg4GEgoCAgYCBgYCAgYCCgn+BgIF/gIB/gICAfn9/fnx8ipOQiomIiIiJiIaGhoSCgoGBgoKDg4ODg4KDg4KCgYCAgICBgYGAf39/f4CAgICAgIGBf359fn5/f39+g4aHh4iChYSFg4SFhIWGhoaGhoWFhoGAg4ODgoKAfX19fX19fn59fX19fX19fX18e3l5eXl4fIKDhIWCgYSDgoKDhYaCg4SDgYKCg4OCgoKCgYKFg4iFgoGBgYKCgYGBgYSDgoOCgoKCgYGBgIF/gIGAf36Ok4yHiIaIh4aGhYaGhIKDgoGCgoODg4ODg4OCgYGBgH+AgYCBgYB/gH9/gICAgH+AgYB/fn19fX5+f36Ag4SHiISGhoaFhoaHh4aGh4iHhoeHgH2AgIGCgX59fX19fX19fX19fX18fH5+fnx7eXh3eHl5gIODf4ONhIOEhISXl4ODhIF9foGCgoGCgYKBg4aIjIWDgoKBhIKEg4KDhYWEhYOCg4OCg4OCgoKCg4OCgpKQi4iIh4mHhoaEhoWEhISCgYKCg4ODg4ODgoGBgYCAf4CBgIGBgH9/fn+AgYCAf4CAgH9/fn1+fn+Bf4CCgYWFhYeGh4eGh4eIhoaHh4aHh4Z/fX18fX9+fX19fX19fX19fX19fXx7iJKCe3x6fIZ5eHl8gYF+iZeEg4OEhJSTgIGBf39/fn6Fi4B/gICEhpCJhYSCgoGFhYuDgYKFhYaGhIOFhYOEhIODhIOFhISIko6LiYiIiYeHh4WGhYSFhIKBgoKDg4ODg4OCgYGBgYCAgIGAgICAf39/f4CAgICAgYGBf39/f4CAgIGBgYGBg4OGh4aGh4aGiIeGhoaFhISGhX99fHx8fX18fH19fX19fX19fX18fH+RlZaDe3qElHx4eXp7fH+Cg4GBgIOCgH58fn57iJF8fI6Wf31/f4KGioWDg4SDgYONiX9+f4OEhYWDhYaFhIWFg4SFhYaEhI6Rj4uKioyJiImHhYaFg4OCgYGCgoKDhIODgoGBgICBgICAgYGAgIB/f3+AgIB/gICAgX5+f4GBgoKCgoODgoOCgoWGhISFhYSGhIOEg4KBgYOBf319fHx9fXx8fH18fH18fX19fHx8e4uRl4x6e3yBenp6e3x5eX19foB/gH98e3t+fn2ClZF/hIh+fH5/goR8fIGChIKAf4eDfYKBf4KCgIODhISEhISChIOEhYKEkZGOi4yMjoqJiYWFhYODgoKBgoODgoKDg4KCgYGAgIGAgICAgICAgH+Af3+Af357gICBenyAgYKDhYODhYWFhYODg4SCgYKDgoOCgoGBgIB/gX5/fX59fHx8fHx8fHx8fHx8fHx9fHx8fn6Kgnt6e3p4ent7fH17fn1+f319fX18fH+BgX2Gj4F+fYJ+f36Agnx8f3+BgIKAfnx7ioJ9gH9+gYCAgYKBgoCAgIGAf4uTj4yLjY6NiIeHhYWEhIOCgoKCg4OCgoODgYGBgICAgICAgH9+fXx7fHx9f3+AgHx6gYF4e4CCgYOFhIOFhIaGhISAhpSIgIKBgYGBgH9/f39/fn5+gHx8fHx8fHx8fHx8fHx9fHx8fHx8fHl7e3t4eHl7enp8gX+Afn+BfH5+f399gIKCgICAgX+CkYF/f4CAfoB+fn9+gIGBfX19e319fXx9fHx9gH+AgH6Afn6ClJGMjI2Oj4qFhoaFhISFg4OCgoODg4OCgoGBgYGAgICBgICAf4CAf39/fXt6fICAgHh+gXd7gIF/gYKCgoKEhoeGhn6IlYp+gYGAf4B/foB+f39/fn+Bfnx7e3x8fHx8fHx8fH59fHt9fHx8e3x8fHp6eXt8en2Fg4J/gYF+f35/gH6FgoF+gH9+foCFhoKAfn6Dhn9+fH6AgIGAf39+fX19fX57fH1/f3+AfX9+gIyRjYuNjo6Nh4SGhoWEhISDg4OCg4ODg4KBgYGBgYCAgYGAgYGBgYGAgH9/f397en9/e3mAd3p/f31+f3+Af4KDhoaFf3+FgX5/gIB/gH5+f31/gIB/gIB/f319fHx9fn18fX19fX19fH58fXx7fXx8ent6fH19f4aEgoCAgX1+fX5/fouEgYZ+fXx8f36CgX99fX19gHx7fXx+gYSDgYB+fn5+fX1/f399foB+fn6Eko2Mi46Ni4qGhIWEhIODg4OCgoKDgoOCgYGBgYGBgYGBgYB/fXx8fH1+f39/f397e399d352eH59fH18fX5+gYGCg4B6fX18fn+AgH6Af35/fn+AgH+AgH9/fn9+fn5+fn1+f399fH59fn19fHt8fHx6e3p9fn+Ag4OCf35/fH18fXx8gYN+jH58e3t9fn1+fn17e3t9e3p7e3uAhoWChIOCf4B+f4KCgn9/goJ/gIqPjIyLjYuKiISEhIOEg4ODgoKCgoKCgoKBgYGAgoGBgYKCf3+AgIB/fn18fH5/fn55fX52e3Z4fXx8fHt9fX6BgICAf31/f31+f39/foB/f39+f3+AgIGBgH99gH9/fn9+fn9/f3yCfn59fX17e319fHp8fH6AgoGAgIB8fH18fHx8fH18fXt/fnt7e3x8fH18e3t7e318enp9en6CfoGDhIKBgoGFhoWFhoaHhoKEkY6Mi4qLh4iFgoOEhISEg4KCgYGCgoKBgoGBgYGBgoGBgoKAgYKBgYCAgH9+e3x+fnx6fnh5dnd8fHx7e318f4GAf35/foB/f35/fn5/gH9/f39/f3+AgYKAfn6BgIB/f39/f39+fYN8fH19fH99fX19e3x+fn9+fn5+fnx8fHx8fHt+fnt8e3x8fHx9fH18fnx9fHx7e3x5e3x7e317fX5+f4CAg4eJiYmLiYuJhYiRjouIiYeFhYOCgoOEhIODgoKBgYGBgYKBgYGBgYKCgoGCgoCAgX98e3p6eXt9enx+fnl8eXh4dHx8fHt8fHx+gX9/f39/gIB/fn5+fX+AgH9/f3+Af4CDgoB/gIGAgIB/f4CBgH58enx9fX59fX5+jIZ9fX57e4OCfX5+fX18fX19fX1+fH18fXx9fX58fn19fX18e3t7fHt8fHt6e3t6enp7fn6ChYiHiIqLi4uJjJCOjYmIhoWEgoKCgoODg4OBgYGBgYGBgYGBgYGCgoOCgYKBgIGBf3+Af356eHl5en5+e3l6eH5zfHx8e3x8fH5+fn5/gH+AgIB/fn9+gIF/f4B/gIGAgoSEgYCAgYGAgX+AgYKBf39+f31+gH57foGRjHx9f4qAjYx+fn19fX59fX59fHx8fX18fXx9fX1+fX1+fnx7e3t8fH18e3p7fHl6eXh5e35/hIOEh4mKiImNj42LiIiFhISCgYKCgoKCgoGCgoKBgYGCgYKCgoGCgoKBgoKAgYGAfoCAf39+e3p5e319eHx6f3KBfXt7fHx8fn59fYGBf4GBgX9/gH+AgX9/gIGCgYGFg4SCgYGCgYKCgICBg4KAf4F/fX6Afnx+f4iCf36DkISEg4F/fn18jYd9fX59fHx/fnx9fXx9fX5+fX5/fX19e3x9fnx8e3x9enp5eXl5e3t+foCBg4eEiI2MioqGhYSEg4KBgoKCgoGBgYGCgoKBgoKCgoKCgoKCgoGCgn+AgIB+f39/fn5/ent5fX16enp9cX6Cent8fX19fXp4f4KAgYKCgICBgIGBgICBgoKCgoaFhIKBgYGBg4F/gIKEgX9+gYB9foF+fX5/gIB9fn+EgH5+f31+fX2KhX1+f31+foB/fX19fH5+fn99f4B9fn18fX9/fHx7fH17e3t6enp7e3x9fn6Ag4CJjYqLh4WFhYSDg4KCgoKCgYGBgoKBgoKCgoKCgoGBgoKBgYKCf4CAgH9/f39+fn59eXp6fXx5d3t0e4d8dHd9fn17e3Z2foCBg4KBgYKCgoKBgYGDg4OChYaEgoCAgICCgX+AgYOBfn6AgH5+gH59fn6AgH+Bfn+Af39/f398f39/f3+Afn9/gH58fX18fn5+foF/gH2CgHx9gIF9fH19fXx8e3x8e3t7fHt8fHx9fImKiIiFhoWFhISDgYKBg4KAgIGCg4KCgoOCgoKCgoGCgoGBg4J/gIGAf39/fn5+fn57enp8fHt2e3R3f352cnt+fnt4dnd8gIGCgoKBgoODg4OCgoSDhIOFhoOCgX9/gIOAgICAg4F+foCAfX+AfX1+foCAf4J/gYGAgICBf31/f3+AgIGAgIB/fnx9fX19fn59g32AfoKAfX6AgX98fn59fX17fH58fXx8fHt8e3x+iYWGhYaHhYSFhIKBgoGDgYCAgoKDgoKCg4ODg4KBgYGBgYGCgH6AgYB/fn5+fn5+fn56e3p9goN9dXF6fHpxen19eXh1dICAgoKCg4KDhYOEg4KDhISEhIWEgYGAgH6Agn9+f36Bf35/f4B9foB9fX1+gH9/gYCCgYCAgIKBfn6Af4GAf4CAgH9+fX19fnx+fn19gYR/gH9+f4GBf31/f319fn1+fn1+fHt8enx7eoCGgoSEhYSEg4WDgoKBgYKBgICCgoOCgoOEg4SDg4KBgYKBgYOAfoCBf35+fn5+fX5+fnt7en6Jh354cnl9f3F6eHt4eXR1fYKDgoODg4OFhIWEg4OEhIODhIKBgH+Af4CBfn19foB+fn5/gH19f3x9fX6Af4CAgIKAgIGAgoGAf4B+gIF+gIGAgH9+fn5+fn5/fn6FhYGBgH+Ag4F/foGAf35/f4B/fn17ent6fHt6goR/g4KCgoOChIKBgYCAgoGAgIKBg4KBg4SDhIKEgoGBgoGCgn9+gIF/fn1+fn5+fX59fXp7fIWEe3tzeXp8cHd1dnd5dnR6hISBhISDhIWFhoSDg4WEgoODgoCBfn9/f4B9fX1+gH1+f39/fn1+fH19foF/gIB/gIB/gIGDgoGAf36AgH+AgYCBgH9/f39/f4CAgIGCgoKBf4CDgX+Ag4J/f4B/gX+Af3x7e3p8e3yBgH+Cf3+BgIKCgYF/f3+BgH6BgoKDgYGDg4KEgoSCgYGBgIGCgH6AgH9/fX5+fX19fn19e3t6gH94fHZ5eXtxdHh3dnh1cnmFhYKEhIKEhYWGhISChIOBg4KAgIF+f4B/gHx9fX6AfX5/f39+fX98fn5+gX+Bf39+f4B/gIODg4B/f4GBgIKBgYGAgICAgICAgIGAgYKDgYF/gISBfYGDhICAgX+BgYKBfXp7e3x8fX99f4B8f399fYGAgH59fYB/foGBgYKBgIKCgoKBg4KCgYB/gYKAfn9/fn99fX1+fX19fX19ent7fHZ9eXh5enJ1eXl2d3dzdYaFg4WFgoSEhYSEhIKDgoGEgX+AgX5/gH6AfX19fn9+f4B+fn99f3x/f3+BgIF/f3x+gH6AgYKDgYCAgoOEgoGAgYB/goCAgYGAgYGCg4KBgX+Ag4B+goKEgICCgYKChIJ+e3t8fHx9fX1+fXp+fX14fn9/fHx8fn1+gYCBgYCAgoGBgYGDgoGBf4CAgoB9fn19f319fX59fH19fX16e3p8dnx6d3t4cnZ5e3Z2dnN0hoSEhYSChISFg4OCgYOBgYOBgIGBfX+BfoF9fX1/f39/gH5+f359fYB/gIGBgX9+fH5/fn5/gYJ/gYGCg4eFgX9/fn6Af4CBgICAgIKCgYCAfoCCf36BgoKBgYOCg4OFgn99fX18e3x8eXp7en55e3l4f357e3t+fX1/f4F/gH6BgICAgoOCgYF/gIGBf31+fH1+fX19fX18fn58fXx5e3x4enx3endzeHd6c3Z2c3SGhISFg4KDhISDgoKCg4GCgoGAgYF8gIB+gH1+fX5/gICAf35/f3x+gH+BgIGAf359f39+fn+BgH2AgIGDhIN/f359fn5+f4B/gIB/gYKBgH9+f4F+f4CCgoCBhIKEhIaEgH59fHx8fHp5dnl5enl2eXZ+fHt7e358e399gH99fX9/f3+BgoGBgX5/gYF+fX18fX19fX19fXx+jYF8fXl7e3p5fHd4eHR1dXhyd3d0doaEhIWDg4ODg4OCgYKDgoGDgn+Bf39/fn+AfX19fX+AgIB/f4B/fIB/f4GAgYCAf3yAf31+fn9/fX5+gIGCgn5/fn1+fn5+f3+Af32AgIB+fn5/gX5+gIKBf4GDgoOEh4SAgH58fXx8e3x1eXl4eHh5d3t8e3p7foV9fn1/ent+fn59foGAgIGAfX6BgH59fXx9fX19fX18e32Dgnx8ent7e3p7d3Z4dXJzdnF4eXJ4hYWFhYOEg4KChIKBgYKBgIKBgIF/fn5+foB+fX58foCAgH+AgX97gH6AgH+BgYB/fYB/fn5/f319fX6AgYKBfn9+fn59fX5/fn9+fH+Af35+fn+Cfn6AgIF/gYOCg4OGhICBfnx9fHx7fHh3e3h1eXd3eXx6e3t9kod9fH13en1+fn19f35+gH98foB/fn19fH19fX19fXt8ent9enp4e3x6ent4dHh1cXJ0cHh4cXmEhYaFg4SDgoODgoGBgoKAgYGAgIB9fn5/gH18fn1/gIGAf4CBgHyAf4B+f4GAf399gH9+f39+fX18gICAgYB+f35+fn18fn9+f358fYB/fn1+gIJ/foCAf36BhIKCg4WFgoJ+fXx7e3x8eXd7eXd4d3d4e3t6e3yFin17end6fH19fHx9fX1/fnx9fn59fXx8fX5+fX18fHt6enx7e3p5enp6enhzd3VxcXJweHdxe4WGhYWDhYKBg4OBgYGBgoCBgICBgH5/fn9/fXx+fYCAgoGAf4GBfX6Af35/gX+Af3+BgH+Af31+fH1/gICAgH9/f35/fXx+f39/f319f39+fn6CgYF/gIB/foGDgoKEg4SCgn5+fHx6fHt7eXt6d3N2d3h5e3p7eXp/fnt7d3p8fXx8fH59fH19fH19fXx8fX19fX99fXx9e3l7fHx8enp6enp6eHN2dXBwcm93dnJ7hYaEhYOEgoGDgoKCgYGCgYKBgYGAf4B/f399fX9+f4CBgYJ/goF9foF+foCBf4B/gIKAgIB+fX58f3+BgICAf4B/f4B+fX5+f4B/f39/gH9/f4J/gH9/gIB/gYGAgISBgoKAf39+f3x9fn56fYV+dHx9enp6enx5eXp6hoV3eXx8fHx8fXx8fHx8fX19fHx9fX19fn19fX16eX18fH16enp6enp5c3V1b29xb3d0c3yFhoOEgoOCgYKBgoKCgYKBgoGCgYCAgICAgH59gH+Af4GCgn+CgX+AgX5/gYB/f4CAgn+Bf319f35/f4KAgICAgIB/gIB+fn1/gH9+gIB/f39/gH+AgICAgH+AgYCBgYGCgYCAf39/fn1/fnqBk416fH18e315e3p6eHmBgXh5fHx8fXx8fHx8fHx9fX18fH18fn1+fn59fHp8fHt8fXt5enp6eXlzdXVvb3Fwd3N0fYWGg4OCg4KAgYCCgoGAgYGCgYKBgYCAgIGAfn5/f4GAgYKCgIKCgICCfoCBgX9/gX+BgIF/fH6Af3+AgoCAgICAf3+AgH9/fX6Afn2AgIB/f3+AgICAgYCAf4CAgYCBgYKCgICAf39/fX5/fIGGiXx8fnt7fnl6e3p7jX53d3l8fHt9fHx8fHt9fH19fX18fXx+fn5/f358enx9e319e3l6e3p5eHN0dW5zcXB4cnV6hYaDg4KDgoCAgIGCgX+CgYKBgoGBgYKAgYF/fn9/gYGCgYKBhIOAgYJ/gYGBf4CAgIB/gX99f4F/gICBgICAf4B+gICAf359foB+fn+Af39/gH9/gICBf4CBgH+BgIGCgoKAgICAgIB9foB9gIOCe35+e3x9e3p8fHuHeXh4eXx8fH17fHx9fX18fH19fn19fX5+f3+Af317fH18fHx7enl7e3l5c3J1bnZycHhxdXaFhYOEg4KCgICAgoF/gIKCgoKDgYGDgoCCgYB/gICCgoKBg4KEhICBgX6BgoF/gICAgH+Cf36AgYCCgICAgIB/gH+AgIB/fn2Af39/f4CAgH+AgH+AgYF/gICAgIGAgYGBgYGAgYCAgH9/gH5/fX59fn57fXx9fHx8d3h1eHh5e3x8fXt8fHx8fX5/f39/fn19foB/gIGAf3x9fHx9e3p7eXp8eHpzcnVud3FxenF2d4WFg4SDg4KBgYKDgH+CgYWDg4SBgYOBgoKBgYCAgIKDgoCCgoSDf4GAfoKDgICBgICAf4CAf4GBgIKAf4CCgH9+gICAgICAf4CAgH+AgICAgICAf4CBgYCAgICAgYGAgoOCgoCCgYGCgYB/f4B/gId+fnx6fXx7fX94d3Z5eXp8fX18fHt8fH19fn5/gIGAfn1+gICAgoGAfH59fX58d3t6ent5eXRxdW53cHV6cXZ5hYWCg4KDg4KDhISAgIKBhoOEg4GChICEg4KCgICCgoSBgYKChIJ/gIB/gYOCgYCBgYCAf4GBgYGAg4F+gIOCf31/goGAgIB+gYCBf4CAgYGBgYCAgIKBgYKBgYCBgYGBgoOCgoOBg4OCgYCBgH+AhH19fXx/fXp9gHp5dnp4eXt7fH19e3x9fX19fn+AgYGAgH+AgICDg4B9f35+fn15eXt6enp5c3J1b3dxd3lzd3uFgoKDgoOEgoOEg4CAgoKGg4ODgoKEgYSDgYKAgIKBhIGCgoGCgX6BgICCgYKBgYKCgICAgICBgoGEgH6Bg4F/f4CDgoCBfoCCg4KAgYGBg4KDgoGBg4KChIGAgYOBgYKEg4KEhIODhIODgYGBgYCCf4B/fYB8enx/e3t3fHl5eXt6fX59fHx8fH1+fn+BgYCAgIGBgYSEgH2Af39/f357e3p6e3p0cHhyeXR2eHR3e4SCg4KDg4SChIODgYKChIaEgoODg4SBhISAg4CBg4KCgoKCgIKAfoGAgIKBgoGCgoKBgIGBgYOCgoOAfoGDgX9/gYSEgYN/goKBg4KCgoGEg4OEgYKEgoOCgoGCgoOBg4SDhIOEhYSFg4SCgYOCgoOBgYGAgH58fIB8fHh8eXp5enx9f3x7fHx9fX18fICAgICAgYGBgYKBfoGAgICAf3p7e3p6enVweHd5dnV8dXZ8gICDgoODg4OEhISAgoOGhYWDg4KDhIGEhYKCgYKDg4GCgoKAgYB9gICBgYKDgoKCgoGAgYKCg4KCg4B/gYOBgICChIODgoGCgoGDgoKDg4ODg4SAgoSDg4OBgX+Bg4KDhYKEhISEhISDhISChIOEhIKBgoGBgHt+gX59eXx6enp9fXyBfXp8fH19fHp7fn5+gIB/gYGAgICAgIGBgIB/fX18fH18dnJ2eHh2dH92dX2Hh4OChIWDg4SFhICChIWEhIOCg4SEgISFg4KCgoODgYOCgoCCgH2AgIGCg4KCgoKEgoGCgoOEgoKBgICBgoGAgYOFhIOCg4CCgoOCg4ODg4OEg4CCg4KEg4KCfoOBgoSEgoODhISEhIOEhIOEg4WEg4ODgoKAe4CBf3x8fXp6e32AfX9/fHx6fH59fX19fn5/f39/gICAgH9+foCBgICAfnx9fX5/fn18e3h2f3Z3f4SHg4KDhYODhIaEgYKFhoWEhIODhISChIWFgoKDg4SCg4KDgoKBfoCAgoKDgoODg4SCgYKCg4OCg4GBgYGDgn+ChISDg4KEf4KEg4ODgoSDg4SCgIOEg4SDg4KCg4KChIOCg4SEhISEhIWEg4OEhYSFhIOBgoB9gYKAfXx8e3x8gH19foB+fn1/fnx8fX19fn5/fn+BgYGBgH99fX6BgYB+fn19fX59fX5+f3+AfH2AgYKCg4OGg4SDhoSBgoiHhYSDg4SEhYGFhYWDg4SDhIODgoOCg4F+gYGDg4SCg4OEhIOCg4KEg4ODgoODgYOCf4KEg4ODgoOAgoWDg4ODhIODhIOBgoSEhYOCgoODg4GEg4GDg4SDhISEhYSEhIWFhYWEg4OEf32BhIB9fXx8fHx/gX5/f39/fX99e3x9fX19fX5+f4CBgIGBgH59fH6Cf39+fn5+fX1/f39/gICAf4CEhIODhIWDhIOFf36CiouFhISDgoOFgYaGhoOEhISEhIODg4OEgn+BgYODhYSFhIWEg4KEhISFhIODgoODhYKBhISFhYaEgoCDh4SDg4OFhIWFhIGEg4OGgoOCg4GCgYSDgoODhYODhYWEhYWHh4aHhYSEhYSAf4GDf35+fH59fX+BgH9+fHx+f358enx9fX19fX5+fn9/gIGBf319fIB/gH5+fn5+f3+AgYGBgYKAgYWFhIOFhIKEg4aAgoWFiomEhIOEhYWDh4aGhISEhIWEhISEg4SDgYKDg4OEhIaEhYSDg4SEg3yDhHuBhHd5g4F9hH5+cnWDgoF2foOFgX2BdYF5g39/gH6EhIKDg4KBg4SDg4SFg4SFhoSFhn2EeXx+f4N7hYKBhIOAf35+fn19gYOBfXt/fX6Afn18fHx9fX19fH19f4B/gYJ/fX18f4GBgICAgH+BgYGCgYKDg4KChoSEhIaEgYOEhYOEhYSKiIWFhYOFhYSGhoaDhISFhYWEhYWEhIWCgoOEhYWFhoSFhIOEhYWCaICFanx7cXF8gXOGc3R0fYKDdXNxg4Z0cHVyc3SDdnt9dYF/goOBgnZ5hYCDgIR/hYSChYWCaHpyc3N8f3OCg3+Dg32BfX5+fX6Cg4F8f4B9f4B9fXx8fHx9fHx8fn1+gH+BgX99fX2AgYKBgYGBgIGBgYKBgoKCgoSHhIWEhYSBgoSGhoOGg4aIhoaFg4aGh4eGh4OFhYaFg4KFhoSFhYODg4SEhoaGhIaEg4SFhn1xe4FweXZ+g3+CbnlwdXN8dnl5hXKEg3B2eHF2dHR1cnN0dml/gG5yb3R2bnVsd217c26AiHltfXJzdnN2bW14bHB5bHV9f399foGAgX1/fn2Af4B/fX18fH19fH1+f32Af4CAfnx/foCBgoCBgICAgYCAgIKDgoOEhYiGhoCChYODhIeGg4aFhYaHh4SDhoeIiYaHhIWGiIeEg4WGhYWEhIOFhIKFhoaFhoWEhoWHdnB0e3BydX+HhYNtdW92b3x1coR5eYd4cXR3bndod3pucHaCcoN+b3p5eW1vbnpvb213fXiGcHF6cHJ0ZoF1fm57eXNveX+Af319gX9/fH99fIF+gIB+foCAgYB+fn9/foF/gH9+fYB9f4CBgIB+fn+BgH9+goOCgoSFh4eEfoeEg4OFh4aEhoWFhoaIhISGh4iIhoeEhoaLioWEhoeHhYOFhYWEgoWFhIWGhoWGhYZxdXByc29zenl+hHSIdHV+iHZugnKEhnluanJ/cW1zd3x/dXR8hH54cXV3bnl1enF2eHV6eYRxam95eHBreXN6b3p3dnZwgYB/fn5/f356fn19f31/f359gIGDg4CCg4GBhIKBgIGBgH1/f4F+f35+f4GAfn6BgoCAgYSHhoODhoSEhYaHhoWFhYWGhoiFhYaFh4eFhoSGhomIhYSJioiFhIaGhYWDhYWEhYaGhoaFg3iLeXKIentwcIWEeIV4eWtzfnl7a3KDh4N6fG17eXl0fYB2bm+AgG90fHV3cXl9fW1+dW+DhYZ6gHJye3x1cG96bHN8bneCgIF+fn99fXt9e3x9fX9/fn1/f4KCf4GDgYGDgYB/gICAfn9+f31/fn1/gH58fYGAfn6Ag4iFhoOFhYWFhoeFhYWFhYeHiIaEhoWHhoaFhIWFhIWFhomJh4aEhoWGhoWGhoSGhoeGhoWGh4eHhoaEhoWGh4iHhYeGhoOHhoWFg4SFhoWGhIaEg4SEhoSEgYODhISFhIWEhYSGg4aHhYaEhIWHhoSEhYaEhX13hYOEhIKBgX1/fnt8e357fHx9f359fH59gIB9f4F/f4GAfn5+gH5+f35+fX99fX5/fHt8f358fH+BiYaFhIaGhoWHhoWFhYWGhoeIhoSGhYaGhYWDhIWGhYSGhoaGhYWGhIWGhoaGhYaGh4eGhYeIiIiIhoSHhYaGiIaFiIeIhYeGhoiFhYaHhYaGhYOChYWGhYWDhYSEhIWEhYWEhYWDhoeGhoWEhoeGhISFhoOFhIKEg4OFg4OCfYB/e3t8fXt8fH1/fnx8fn2Af31+gH5+gH99fXyAfX5+fn5+f3x8fX57fHx/fHt7fn+Ih4SEiIaGhoeGhYWEhoaGhoiHhIWGh4aFhIODhIaFhIeFhYaFhIaEhYaGh4eFh4aJiIaGh4eIiYiFhYiFhoeGh4aHhoeFh4eGh4WFhoeFh4aFgoOFhoaEhIOEhIOEhoSFhYWGhoOGhoWGhYWGhoWEg4WFg4WHhYOCgoWDhIF+gIB8e31+e3x7fX59fHx+fX5+fH9+fX1+fXx9fH98fn58fYGAfXx8fXx8fH56e3t9foiHgoWIh4eGhoaGhISGhoeGiIaEhYSGhoSFh4OEhYSFh4SFhoaFhoSGhoeHhoaHh4mIhoaIh4iKiIWHiIWHh4WHhoeGh4WIiIeHhYaGh4WGhoWBhISFhoWFhISEg4SFhYaGhoWGhYaFhoeFhYaGhYSDhISDhIeDhIGChISDgYCAgHt7fn18fHx9fXx8fH19fH18fn18fX18fHx9fXx+fXt8gX99fH18fnx8fHp6fHx9iIeChoiHhoeGhoaDhYaFhoaGhYOFhIaFhIiJg4GEg4SGhIaGhoaGhIeHiIiHh4eIioiGh4iHiImIhYiHhYeGhoeHh4WHhoiIh4eFh4eHhoaHhIKEg4SGhYeFhISDhISFhoaGhoaFh4WFh4WGhYeFhIOEg4OEh4GDgIKDg4KCgn+Ae31+fXt8fH59fH19fH17fHx8fHx8fXt7e318e358e3x/fX18fX1/fXx6ent7fHyIh4KGhoaGh4aGhYOFhoWFhYWEg4WChoSDiId/enqChYaEhoaFh4aEh4eJiIiHhoiKh4aHh4eIiYeFiIeGh4eGhoeHhYeGiIiHhoWHh4eGhoeDg4SEg4aGh4WFhISEhYaGhoaGhYaHhoaHhoaEhoWDg4ODgoOGgYN+goKDgIOCf398f35+fHx9f318fX18fXp7e3p7fHx8e3t7fnt7fXt7e358fHx8fX5/fXt6fHp8fYmHg4aFhoWGhoWEhIWFhYWFhIOBhYGGhIKEhHyAhn+ChYWGhYWGhYSHh4iIiIaFiYqHhYeGh4eIh4WIhYaHiIaGh4eGh4aIiIeFhoeGh4WFh4OEhoWEhoaHhoWFhIWFhoaGhoaFhoaHhoeHhYOGhYOBg4KAg4WCg36BgYF/g4F/fn5/fX98fH1/fXt9fXx+enl6eXt8fXt7e3t+fHx8fHp7fXx8fHx+fYF8e3t7e3x7iYeEhoSGhIaGhYSFhoWEhIOEgoCDgYWDgYJ/eoSMe4CEhYeGhoaFhIeIh4aHhYWHiYeEh4WGhoiGhYeEhoeJhoaIh4eHhoeIhoSGhoaHhYWHg4SFhIaGhoeFhYSDhYWHhoeGhoWGhoaFhoaEg4WFgoGCgYCDg4OCfYGBgH6DgX5/f4B8f3x9fX59e359fH15eXp5e319enp7e318fXx8ent9fHx9fH5+gHx7e3x+fXyIh4WGhYaEhoSFhYWFhYODgYOBgIKBhYJ/gH9/fXx7gYSFhoaEhYSDh4eGhoaFhIaJhoKGhIaGhoWFh4WHiImGhYiHiIeGhoeFhIaFhYeFhIeDhIWEiIaGh4WFhIKGhYaFh4aHhIaGhoaFhoODg4WAgIGAgIOBg4B8gYB+foKAfYB/gXx/fH1+fX57fn18fHl6enl6fX15enp7fHt8e3t6e319fH18f35+fHt7fX59fIiGhYaGhoSFhYSFhYSDgoKAgoGAgICDgn5+foB5en2Ag4OEh4WEg4OHhoOEhYSChYiFgoSDg4WFhYWHh4aIiIaFiIeJh4aFhoWDhoSFh4OEhoSEhYSHhoWGhYaEg4aFhoaGhoaEhYaGhYWGgoKDhH9+gICAgYCDgHuBf31+gn5+gH6Afn99fX59f3t/fXt6eXp6eXp8fXl6ent7enx6e3t7fH19fXyAfn18fH1/fnx7h4WFhoaGhoSFhIWDhYKBgICAgYB+f4KCfX5/f3t/f4KDg4WGhYSDgoaDgYOEgoCFh4WCg4GBg4SEhIaGh4iHhYWIhomHhYOEhIKFg4SGgoOFhISGhIeGhYWFhoOEhYSFhoWGhIOFhIWDhYWBgYODfn5/gH9/gIN/fIB9fX+CfYCBfn6Bfn19fX1/e398e3p5enp5enp8eXp6e3t7fHp7e3t7fX59fYF9fXx8fYB/fXyGg4aGhoaGhISChYKFgYGAf3+AgH5/gIJ9fn9/foCAgYKChIWDgoGChIGAg4KBgISFhYKBf4CCg4OEhYaIhoWEhoeFh4WFgoOCgoOCgoWBg4WEhYaEhoaHhoaFgoSEg4SGhYWDhISDhIOFhICAgoJ+fX1/fn5/hH57f3x8gIF9gYB9fYN9fn59fX57fnt7enl7enl6ent5enp6e3t8ent8e3t+fn1/gXx9fHx9f4B+gIaEhYWEh4SEg4KGgoOAgYB+fn+AfX9/gXx9f39+fn+BgYKEg4KBgYKCf4CBgoCAgoWEgoB/gIGCgYOFhYeFhISGhoOFg4WBgoGBgoGCg4GChISEhYWGh4eGhYSDg4ODhIaFhIGDgoOChIODgH+AgX59fH5+fH6Dfnx+fHyBgH6Cf31/gnx/fn19fHx8e3t6enp6eXt6enp5eXp6e3x5e317fH5/f4GAfX59fX1/gICAhoSEhYSFgoSCgoSCgoCBgH59fn9+fn6AfX2Af35+foGBgoODgoSHgYF+gICBf3+ChIOBf35/gIJ/goWEhYSCg4WFgoSBg4CBgIGBgYKBgIGEg4OGhYWHh4WEhIWCgoKDhYSCgYGBgoCFg4F/foB/fnx8fn18foN9e358fYF/gIN9fYCBf35/fXx8fH17e3p6enl5e3l6enl6ent7e3p7fXx8f3+BgoB+gH+AgH+AgYDKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzNzc3Nzc3Nzc3NzczMzMvLy8vLy8vLy8vLy8vLzMvLy8vLy8vLy8vLy8vMzMzMzM3Nzc7Oz8/Pz9DQ0NHR0dLS0tLS0tLT09PT0tLS0tLS0tPT09TU1NTU09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tLS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1dXV1NTU1NTT09PT09PT09PT09TU09PU1NTU1NTU1NTU09PT09PS0tLS0tPT09TU1NTU1NPT09LS0tLS0tLR0dHR0dPHhnNlYFtLWWdVTUZIQD03Nzg5Nzw8PDo8Oz42Oj04PDs6OTg3ODs7Oj87PTs8PD47P0E/QkJBQ0RFREE+PTw7QENDQUBDQ0FBR0hHSUtSwtXS09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXVysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMy8vLy8vLy8vLy8vLzMzMy8vLy8vLy8vLy8vLzMzMzc3Nzc3Oz8/P0NDQ0NHR0tLS0tLS09PT09PT09PT09PS09PT09TU1NTU1NTU09PT09PT09PT09PT09PT1NTU1NTU1NTT09PT09LS0tLS0tLT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1NTU1NPT09PT09PT09PU1NPT09TU1NTU1NTU1NPT09PS0tLS0tPT09PU1NTU1NTU09PT09PS0tLS0tLR0dHSzIxyZ2BcTVllUktHSz87Mzc4Ozg5Pj05PDpBOjs9Nzs8PDo6Nzg6Oz0/Oz88PTw/Pj9BPUFBPkNDREJAQT46Oz9DREFDRERCQklHSEhJTr7V0tPT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1crKy8vKysrKysrKy8vLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzMzMzMzMy8vLy8vMzMzMzMzMzMzLy8zMzMzLy8vLzMzMzc3Nzc3Ozs/P0NDQ0NDR0dLS0tLS09PT09PT09PU09PT09PT09TU1NXV1dTU1NTT09PU1NPT09PT09PT1NTU1NTU1NTU1NPT09PS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1tbV1dXV1dTU1NTT09PT09PT09PU1NTU09TU1NTU1NTU1NTT09PT0tLS0tLT09PU1NTU1NTU1NTU09PT09PT0tLS0tHR0s+Sd2hfXk9XZ01LRkw9ODc2NTk5OTw+OT88RDo7PDc5PD07OTc5Ojw9QDs+PT47PD48PT5BQD5EQ0NDP0E9Ojs9QkNFQ0NEQT9FSEpJSky61dPT09TU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8rKysvLy8vLy8vLy8zLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMzMzMzMzMzMzMzMzMzczMzMzMzMzMzMzMzMzMzc3Nzc3Ozs/Pz9DQ0NDQ0dHS0tPT09PT09PT09TU1NTT1NTU1NTU1NTV1dXU1NTU1NPU1NTU09PT09TU1NTU1dTU1NTV1dTU09PT09LS0tLS0tLS09PT09TU1dXV1dbW1dXV1dXV1tbW1tXV1dXV1NTU1NTT09PT09PT1NTU1NTU1NTU1NTU1NTU09PT09LS0tLT09PU1NTU1dXV1dTU1NTT09PT09PT0tLS0dHRmn5nYWJOVWpKSElLPzw6OTM3Njc3PTs+OT06Ojo4ODo7Ozg4Ojs7PD46PT09Ojw/PD0/QkA/Q0RDRD5APT08QENEQ0JEQkQ+REhJSUtMttfT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3MzMzMzMzMzMzMzMzNzc3NzczMzMzMzMzMzMzMzc3Nzc3Ozs7Pz8/Q0NDQ0NHS0tLT09PT09PT1NTU1NTU1NTU1NTU1NTV1dXV1NTU1NPT1NTU1NTU1NTU1NTU1dXV1NXV1dXV1NTU09PT09PS0tLT09PT09PU1NXV1dbW1tXV1dbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1NTU1NTU1NXU1NTU1NTT09PT09PT09PU1NTU1dXV1dXV1dTU1NTU09PT09PS0tLR0p+DaV9kU1hsSEhIS0A9Nzg0NzY6Oj87RDw8OTw8OTg6OTo6Ojs8Ojo7OT49Pjk9QDs/QUFCP0JCQUM9Pz8+PEBCRUNDQkBBO0ZJR01MSbLY09TU1NTU1NXV1dXV1dXV1dXW1tbW1tbV1dXW1svLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzM3Nzc3Nzc3Nzc3Ozc3NzczMzMzMzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc3Mzc3Nzs7Ozs7Pz8/P0NDQ0NHS0tLS09PT09PT09TU1NTU1NTU1NTU1NTV1NXV1dTU1NTU1NTU1NTU1NTV1dTU1dXV1dXV1dXV1dTU1NTU1NPT09PT09PT09PU1NXV1dbW1tbW1tbW1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTV1NTU1NXV1dXU1NTU1NTT09PT09PT1NTU1dXV1dXV1dXU1NTU1NTT09PT09LS0tSjiGxfZlJWakdIR0lBPjM2Njo7PDhDPEJBPjxBPDg5Ojw6Ojw8PDk8PTo7PD09PD89QD9AQT9AQUBCPD4+PzxCQ0NDRkBBQT1ISklOTUeu2NPU1NTV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbMzMvLy8vLy8vLy8vLy8vLy8vMzMzNzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzs7Ozs7Oz8/P0NDQ0NHR0dLS0tPT09PT09TU1NTU1NTU1NTU1NTU1NTV1dXV1dTU1NTU1NTU1NTU1dXV1dTV1NXU1NTU1dTU1NTU1dXU0tPU1NTU1NTU1NTV1dbW1tbW1tbW1tbW1tbX19bW1tXV1dXV1dXV1dXV1dTU1NTU1dXV1dXV1dXU1NTU1NTU09PT09PT1NTU1NXV1dXV1dXV1dXV1NTU1NPT09PT0tLWroprY2VSWGhMSkdJQjg0OTQ6Ozo5QDk/Q0VAPDw5OTk9Oj07PDw6PTw7OTw9Ozs/PUA9PT5AQD9CQT5APD05QERDQkFBQj48SEpLTU5IqNnU1NXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbWzMzLy8vLy8vLy8vLy8vLy8rKy8vLzMzMzMzMzMzMzM3Nzc3Nzc7Ozs3Nzc3Nzc/Pz8/Pz8/Pz8/Pz9DQ0dHR0dHR0dHR0dHS0tHV2djY2NnZ2dra2tvb29vZ2dnZ2dna2tra2tra2tjW19fX19fX19jX19fX2Nzd3d3d3d3d3d3d3d3d3Nvc29vb29zb29vb29za09LT09PT09TU1NTU1NbW1dXV1dXV1dXV1dXW1tbX1tbW1tbV1dXV1dXV1dXV1dTU1dXV1dXV1dXU1NTU1NTU1NTU09PU1NTU1NXV1dXW1dXV1dXV1dTU1NTT09PT09PS1bqKa2hoUlhlSUlMT0A5OTo0O0E8Nz05QUM+QD89ODo6Ozk9Oz4/Ojs8PDo7PDo7Pj1APT8/P0FAQUE/QTw8Oz5BRENBREA9PElJSk1ORqPa09TV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbW1szMz9DPz8/Pz8/Pz8/Pz8/W3t3d3t7e3t7e3t7e3t3S0NDQ0NDQ0NDQ0NDQ0ci5ubm5ubm5ubm5ubq6t6WkpKSkpKSkpKSkpKSnhmBjY2NjY2NjY2NkZGRlhIuKioqKioqKioqKioemuri4uLi4uLi4uLi4ubN4c3Nzc3Nzc3Nzc3Nzc3qCgYGBgYGBgYGBgYGAj9LS0tLS0tLT09PS09PT3OPi4uLi4uLi4uLj4+Pi2NfX1tbW1tbW1tbV1dXV1dXV1dXV1dbW1dXV1dXV1dTU1NTU1NTU1NTV1dXV1dXW1dXV1dXV1dXV1NTU1NTT09PT09XDkXFrak5TYkxMVk48Ojo4Nz5DPzg+Oj8/QTw/QDc7Ojs7PTs+Pjo7PD48Oz07PT8+QDw/Pz1AQEBBPj88PjxAQUVCQkZAQD9HSEpLT0ae2tXV1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19fMzNDS0tLS0tLS0tLS0tLR3uzr6+rq6urq6urq6uvp1dLS0tLS0tLS0tLS0tTEqaqqqqqqqqqqqqqqq6aGhIWFhYWFhYWFhYWFik4MEhISEhISEhISEhIRE0pUU1NTU1NTU1NTU1NPg6ejo6Ojo6Ojo6Ojo6WZMikrKysrKysrKysrKyk1RUNDQ0RDQ0NEQ0NDP1zT09LS0tLS0tLS0tLS0eDs6+vr6+vr6+vr6+vr6dnX19fX1tbW1tbW1tbW1dXV1dXV1dbW1tbV1dXV1dXV1dXV1dTU1NTV1dXV1dXW1tXV1dXV1dXV1dXU1NTU1NTU1NPUy5h2bGlKTl9NUlVNPjw8NztAQz42Ojc+Pjs9Qj85PDk9Ozw6PD07PTs9Ozs9PD0+PT07QT08QUBBQT08Pzw7QEJDQURFPUFAQ0ZLS09GmNzV1dXV1dbW1tbW1tbW1tbW1tfX19fX19fX19fXzMzR0tLS0tLS0tLS0tLS0d3q6enp6enp6enq6unq6dXS0tLS0tLS0tLS0tLUxaqrq6urq6urq6urq6yoiIeHh4eHh4eHh4eHh41SEhgYGBgYGBgYGBgYFxpOWVdXV1dXV1dXV1dXU4WopKSkpKSkpKSkpKSmmzgvMDAwMDAwMDAwMDAvO0lISEhISEhISEhISENg0tPS0tLS0tLS0tLS0tHf6+rq6urq6urq6urq6unZ19jX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dXV1dXV1dXU1NTU1NTU1NGcenFpSlRdT1JVTkQ+Pzs/QEA4Ojs4PDs7PD86Ozs4Ozk5Ozw7Ojw5Ozs8Ozo9PT0+PUE/Pj8/Pj08PT88PEFBQ0FERTw+QEVGSktNRpPc1dXV1tbW1tbW1tbW1tbW1tfX19fX19fX19fX183N0NLS0tLS0tLS0dHR0dDc6Ofn5+fn5+fn5+fn5+bV0dLS0tLS0tLS0tLS08Wtrq6urq6urq6urq6vq46NjY2NjY2NjY2NjY2SXSInJycnJycoKCgoKCcpWmNiYWJhYmJiYmJiYl6MrKmpqampqampqampq6BFPT4+Pj4+Pj4+Pj4+PUhVVFRUVFVUVFRUVVVRatLT0tLS0tLS0tLS0tLS3+np6enp6enp6enp6enn2djY2NjY19fX19fX19fX19fX19bW1tfX19fW1tbW1tbV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbV1dXV1dXU1NTU1NTWo3txZElbYE5OVU9AQT89REI/Oz06OTs6PT07PDs6OTg5OTs8Ozw8Ojo7PDo7QD08PTxAQTxBQTs7PEA/PD1CP0RDQ0U8PkJERkpMTEWN3NXV1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjNzc7Ozs7Ozs7Ozc3Nzc3Nzs/Pz8/Pz8/Pz9DQ0NDQz87Ozs7Ozs7Pz87Oz87NzMzMzMzMzMzMzMzMzMvJycrKysrKysrKysrKysfCw8PExMTExcXFxsbGxsvMy8zLzMzNzMzMzMzLz9HR0tLS0tLS0tLS0tLRysrKysrKysrJycnJycnKy8vLy8vLy8vLy8vMzMzT1NTV1dXV1dXW1dbW1tjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NfX19fX19fX1tfX19fX19bW1tbW1tbW1tXV1dXV1dXV1dbV1dbW1tbW1tbW1tXV1dXV1dTU1NTU169/cF5GXmJQUVdOR0ZDQ0lBPz07PDo8OEBCPD04Ojo4OTg7Pzs8PDs7PDw8PD87PD46Pj44PkI8Pj1BPjw+QkBERUNAPD5APkNJSUtEh9zV1tbW1tbW1tbW1tbX19fX19fX19jY2NjY2NjYzs3Nzc3Nzc3Nzc3NzdHNzc3NzczP09LSzs3P0s7Ozs7Ozs7Ozs/Rzs7Q0s7P0tTV1NDPz8/Pz8/Pz8/Pz8/P0NDQ0NDR0dHR0dHS09PU1NTU1dXV1tbW1tfW1tbX1tfX19fX19fX19bW1tbW1tbW1tbW1tbW1tjX19fX19fY19bX19fX1tfX19fX19fX19fX2NjX1tbW1tbX19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjX19fX19jY19fX1tbW1tbW1tbW1tbW1tbW1dbW1dbW1tbW1tbW1tbW1tXV1dXV1NTV1di4gm9XSl9jUlFaS0hBQTxCPT07Oj4+PD4/PT0/Nzk6OTk3OD48PD47Ozw7PDs/PT0+OTs7OT0+P0A+QD07OkI/QkNCPz0+QD5CRUdKQoDc1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2M7Ozs7Ozs7Nzc3Nzsqfys3Nzc3QuYOEi8fTwJrLz87Ozs7OztHBp9HRuKDQ0ZyChIrGz87Ozs7Ozs7Ozs7Oz8/Pz8/P0NDQ0NDQ0NDR0dHR0tLT09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbV1dXV1dbW1tbV1dXV1dXV1NTU1NXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NfX19fX1tbW1tbW1tbW1tbW1tXV1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXYwIBuVU9gY1dZW0xMQ0A9PTs9Ojw+Qj5CQ0A8Ojg5ODo6Ojc7Pz4/PDw7PDo5Pzw8PTg5PD9BPj09PUFAPTtBQkBCQz47QD9BQUlHSkF629bW1tbW1tbX19fX19fX19jY2NjY2NnZ2djY2dnOzs7Ozs7Ozs7OzdKpj63Rzs7Ozpu3tqSiwJOerNPOzs7Pz8/RnY/Es5aYurqVuLmvodLOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0dHS0tLT09TU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dbW1tbW1tXV1dXV1dXU1dXV1dXV1dXW1tbW1tbW1tbW1tfX19fX19jX19fY2NjY2NjY2djY2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2dnY2NjZ2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV18h/b1pTYWVeXVxPSkQ9QD8+Ozc6Pjk/RD9BOTg3ODk7Ozw4OT89PTw9PD47OkE7OTs5OzxDQDw7PT5AQT49QkQ/QkM9PT8+Pz5ISUg/ddrW1tbX19fX19fX19fX2NjY2NjZ2dnZ2dnZ2dnZzs7Ozs7Ozs7Ozs/Inrym0tDQzsqgl36Cw6abr6fUz8/Pz8/Tuq+qvJ+jqLLRkn1+r7DSzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dLS0tPT09TU1dXV1dXV1dXV1dXV1dbV1dXV1dXV1tbW1tbW1tbV1dXV1dXW1tbV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2djY2NjY2NnZ2dnZ2dnY2NjY2NfX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dbV1dXV1dfNiHNdWGloXl9gT0lGOkFAPj88PDo2P0JAQzo2NDc6Ozo8Ojk+PD49PTs/PTxBPjw8Ojw8PTw6PEA9QEI+PkFCPUNDPT0+Oz9BRUtIQHDZ1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2c/Pz8/Pz87Ozs7SrKWnqdXAvNLHnY+ey9PJipmq1M/Pz8/P05+xm7/Hh5q01dPNnp7D0M/Pz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0dHS0tLS09PT1NTU1dXV1dXV1dbW1tbW1dbW1tbW1tbV1tbW1tbW1tbW1dXV1dXV1dXW1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnY2NjY19fX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0JB1W1tqaWFeXVNOSTxDQEE+QD46OEZBP0M6NzQ5Ojo5Ozs4Oz0/Pj49QT08P0A9Pjw8PDw8Oj1AQD8/PT5CQD9AQkA8QD0+QUVLRz9r19fX19fX19fX2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnPz8/Pz8/Pz8/QzJ2Nl6zQmpfKxZ6ynpbN1q2ZqtTPz8/P0cCciZq92qOYtdTTwKCg0M/Q0M/Pz8/Pz8/Pz8/Pz8/P0NDQ0dHS0tLT09PT1NTU1NXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX19fX19fY19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tKUcl5ea2tqZV1PTEc/RENDQDo9OzxCPD49OTY0Ojk5Ojo5Nzs/QDs8PUA8PEE+PD07PTw/PDo8Q0A+PTs9QD5CPkBBPkA9QD9GSUQ/ZtXX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2traz8/Pz8/Pz8/P07GigJuvyaCjv8qcpYynrdiqmarUz8/Pz9SjooGbwNehmLTT06+iqdTQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1NXV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dbW1tXW1tbW1tbV1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbSk3BgXnBoZmVaUUhHQkVDQEA3Ojo8Pjo8OTc2NTk6Njo8Ozc8QEA8Ojo9Oj0/Pj08OUA8PDo6OT9APj08PUBBQz9APz5BOz9ARkpCP2LS2NfX2NjY2NjY2NjY2dnZ2dnZ2tra29vb29vb28/Pz8/Pz8/P0M6fkGyclteqo9PSrqa1mJ/Vqpmq1M/Q0NHEn4F7lqvYoZi009OjobrU0dHR0NDQ0dHQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1dXV1dbW1tbX19bW1tbW1tbW1tbX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfW1tfX19jY2NfX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX1tbW1tbW1tbW1tbW1tbX19fX19fW1tbW1tbX0pNuYFxxZGdkWlVKQENGQ0FCODs/PD07PDw4NTU4OTY4Ozo5PDo+Pzw9PTk8Pz49Ojo+OTw6Ojg+Pzw9PTw+QEFDQT48PDpCRERKRkJd0NnX19jY2NjY2NjY2dnZ2dna2trb29vb29vb29vPz8/Pz8/Pz9G9n8O31pfA09HQ0srSzZeb1KqZq9XRz9DVq6+8wM+T06GZtdTNnp/J0tHR0dHR0dHR0dHR0NDR0dHR0dHR0tLT09PU1NTV1dXV1tbW1tfX19fX19bW1tbW1tfX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19fY2NjY2NjY2NjY2NjY2djZ2dnZ2dnZ2dnZ2dnZ2drZ2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fX19fX19fW1tfX1tbX19fX19fX19fX19bW19GRbF1cb2doYl1PRkBISUdFQDw8Pj48PT48NzU2Ojk2Ojs6Ojs4QD86PDw5PD49Ozs6Pzk/Ojs5PT49PTs7PTxAQ0I/Pz47Q0ZGR0hEWc3a2NjY2NjZ2dnZ2dnZ2dna2trb29vb29vb29vb0NDQz8/Pz8/Pz5V+e6WS1KKa08ySl6ObodirmavV0pem1cmHf4WepNmimbXXw5+g0tHR0dHR0dHR0dHR0dHR0dHR0tLS0tLS09PU1NTV1dXV1tbW19fX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tbX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2tnZ2dnZ2dnZ2djY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX1tfPjGRWXnBrXGBgTkVITUlJT0M+OkI9PUBCOzU1Nzw6Nzo7Ojo7OT09OTo6OT0+Pz07OT47PDo8Ozk+PD47PD0+QENCPz5BPEFDR0ZGRVXJ29jY2NnZ2dnZ2dnZ2dra2tvb29vb29zc3Nzc3NDQ0NDQ0M/Pz9DR1aeZrcmjqL7KnbGdo7XZqZup2LirocbT09WcmL/XoZqz2bKkptbS0tLS0tLS0tLS0tLR0dHS0tLT0tPT09PU1NTV1dbW1tbX19fX19fX19fX19fX19fX19fX19bW1tbW1tfX19fX19fW1tbW1tbW1tbX19fW1tbW1tbW1tbX19fX2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2djY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fX19fX19fX19fY2NfX19fX19fYzYZdV2JvZE9dVEtIRlNRS0xAPj1EPD9DRj01NTc7OTY6Ozo8PTo7Pzo6OTg6PT0/Pjs/Oz49Ojs5Pjs9PD0+QURCQD8+PzxAQUVHRURSxdvY2dnZ2dnZ2dnZ2tra2tvb29vb3Nzc3Nzc3NzQ0NDQ0NDQ0NDQ0NO5gL3Tm5bP1LWLkZ/T1LyBu9TOlKDS0dLXqIfL1rGDxda5g7/V0tLS0tLS0tLS0tLS0tLS0tLT09PT09PU1NXV1dbW1tfX19fX19fY2NjY19fX19fX19fX19fX19fW1tbX19fX19fW1tbW1tbW1tbW19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2tnZ2tra2tra2tra29ra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2NfX2ct+WlVqaltMX01KTEpVTEZCPD0/R0ZIS0g9NjU3Ojk3OTo7Ojw9OT45OTo4Oz0+PkE+PTk8PDo9Pj46PTk5Oj9FQUA+PT8/QkBHRURFUMHc2dnZ2dnZ2dna2trb29vb29vb3Nzc3Nzc3dzc0NDQ0NDQ0NDQ0NDQ0cHR0crI0tDUxLjS0tHSwtLQ08fM0tHR0s/F1NHQw9TR0sLT0tLS0tLS09PT09PT09LS0tPT09PU1NTU1NXV1dbW1tfX19fX19fX2NjY2NjX19fX2NfX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29va2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2djY2NjX19fX19fY2NjY2NjY2NjY2NjY19rHd1xSZ2laTlpOTFBRV0VKPz89P0FFTExBPjc3NTs4ODk5Ojs8Pjw+ODo6OTs+P0A9Pj46NTo6Oz0/Ojs5Ojw+QkJAPz8/P0FCR0RDRE683dnZ2dnZ2dna2tvb29vb29vb3Nzc3Nzc3d3d3dDR0dDQ0NDQ0NDQ0NDS0NDR0dDQ0dPU0dHR0dPR0dHS0tHR0tLT1NLS0tXT09PV0tLS0tPT09PT09PT09PT09PT09PU1NTU1dXV1dbW1tfX19fX2NjY2NjY2NjY2NfX19jY19fX19fX19fX19fX19fX19fX1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tvb2tra2tra2trZ2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2trZ2tra29ra2trZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjbwXNYVWlrU0xSTlBSWVRGSTw+Qz9BQkVLPj43ODY5Njc4OTk7Oz0/QDw9ODk7Ozs/Pjw8OTU6PT47OTk7PD8/P0JCQT1BPUBBQkZCQkJLtd7Z2dra2tra2tvb29vb29vc3Nzc3Nzd3d3d3d3R0dHR0dHR0dHR0dDQ0NDQ0NDQ0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tPT09PT09PT09PT09PT09TU1NPT1NTU1NTU1NXV1dXV1dXW1tbX19fX2NjY2NjY2NjY2NjY19fY2NjX19fX19fX19fX19fX19fX19fX19fW1tbX19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2NjY2NjY3LxvVFRsbExLUkpUUlVLRkQ6PkdEREFERjw/ODk6OTY5OTo3PD07PkA9PTc5Ojs5Pjs5OTY2Oj1AQT47PDk6Pj9DQT4/Qj0+QkNFQkFCSrDe2dra2tvb29vb29vb29vc3Nzc3Nzd3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0tLS0tLS0tLS0tLS0tLS0tPT09PT09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1tbW1tbW19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19fW1tbW1tfW19fX19jY2NjY2NjZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2dnZ2dnY2Ny2a1NbcGtLVVdSXFFXSEQ+PEJKRT1ISj89PDc4ODo1OTg5Njs+PD1APDw1OTk8Oj87OTk0ODw9PUFBPD47Ojw+QD89PkE9PUNGR0I/Qkmq39ra29vb29vb29vb3Nzc3Nzc3N3d3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHS0M/U0M7P0tLT0tLS0tLS0tLS0tPT09TU1NTU1NPU1NTU1NTU1NTU1NTU1NTV1dXV1dXV1dbW1tbW19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19jY2NfX19fX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dndsGRTYXJfT1pUV19RUkdCPUVJTEFBTEQ/Pzs6ODg5Mzg2ODY5Pj0+Pz06Njo7Pjs9PTo5Njg6PTtAQDxAPz0/P0I+PD48PEJFR0lCPkNJpODa29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3t7S0tLS0tLS0tLS0dHR0dHR0dPT0bm7zLqbnLrQyNPT0tLS09PT09PT09PU1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2NjZ2dra2tra2tra2tra2tra2tra2tra2tra29va2tra29va2tvb2tra2tra2tra2tra2trb29vb29va2tra2tra2tra2tra2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ3qpfVWBuW1VZUVpeT0xHQ0ZNSUZEREo7QUE7PDg4NjQ4Njk4Nzw/QT89Ojc8Pz48Pz87OjY4OD09QEE9QD5BQD1AOjs6Pj1BRUdJQkBDR57h29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e0tLS0tLS0tLS0tLS0tLS0tO+wMqaoKKViJGeqpOpz9TT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fY2NjY2NnZ2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dna2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2tvb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2d6iXFVeblheXU5aUFROQ0NMSUlJRkpEPEJBPDs4NzY3OTc3OTk9P0E/PDo5QD88PkI/Ojg3NzY9Pz9APUBBPz88PTs7OD48P0VJSEE/Q0aX4dvb29zc3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3tPT09PT0tLS0tLS0tLS0tTIlZyum5m1iX2TjIKBhMTV09PT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tvb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dndmlpYYW5ZYVdPV01QRUJETElNS0ZJRT5CRDk4ODY3OTc1Njk4PT1BPjo4OT4+PD9APzw1Njc2PD4/PjtAQEA/Pj4/Pjs/PkFCRkdCQENIkeLb29zc3Nzc3d3d3d3d3d3d3d7e3t7e3t7f39/U09PT09PT09PT09LS0tLTz6h+kayPko6MhoCIiYSQo8rU09PT09PU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY19jY2NjY2NjY2NjY2NjX19fX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2tra29vb29ra2tra2tra2tna3JJaWWNuWlpSVV5QTDxAR05IUklIRT47SEY4OTc1Nzg3NTg5ODs+Pj07ODlBPj1AP0E+NzU5Njs+QUI/P0BAQkI/Pj8+QUBEQUZIQj9FSozi3Nzc3Nzc3d3d3d3d3d3e3t7e3t7f39/f39/f1NTU09PT09PT09PT09PWtaWaiIuQhYCFi4iBg4qLf4bC1tTU1NTU1NTV1dXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2dnZ2dna2dra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29ra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb2tra29uIWltnalxYTFpfVkg6TEhMSkpDRUZDQExINzo3Njc4ODU4Nzg5PDw7Ozk4QD89Pj8/PDY3PDQ3P0JCQUBAPz8/QT09P0A+QEBGRT09REuI4tzc3Nzd3d3d3d7e3t7e3t7e3t/f39/f39/f39TU1NTU1NPT09PT09PUxZKCg4WGfYGCfXx5foGCg36k29bU1NTU1NTV1dXV1dXV1tbV1tbW1tbW1tfX19fX19fX19fX19fX19jY2NjY2NjZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vc3Nzc3Nvb29vb29vb29vb29vb2tra2tra29vb29zb29zb29vb29vb29vb29vb29vb29va2tvb29vb29vb29vb29vb29vb2tvZgFpebWhaU0ldW1hKRE1ISlNMR0ZBQD9KQjg7NjY5OTc1ODY4Ozo7Ojw5OD09O0A9Ozo2NTw3Oz1CQEFBPD49QEE9PEA/Pz5CREU+PERLg+Lc3d3d3d3d3t7e3t7e3t7f39/f39/f39/f39/V1dTU1NTU1NPT09PT2LKEkKh9g3l2hIh/e3d5gn5+i67A1dTU1NXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dna2trZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2tra2tra2trb2tra2tvb29vb29vb29vc3Nzc3Nzc29vb29vb29vb29vb29va2trb29vb29zc3Nzc3Nvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc1nlcWmxmWFJPYFFSQUhHSkZYTEZAQENDSz87Ozc4ODc2NTc2ODo5PDw6PTs/PTs9Pjw7ODg8OT0/QkFCQzw8P0FCPj1BQkNCREVDQDtDTH3h3d3d3d3e3t7e3t7e39/f39/f39/f39/g4ODg1dXV1NXU1NTU1NPU0ruen3WKeXuIgICChYGDcnOAhYOMrNfV1NXV1dXW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NnZ2dna2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra29vb29ra2trb3Nzc3Nzc29zc3Nzc3Nzc3Nzb29vb29vb29vb29rb29vb29vb29zc3Nzc3Nzc3Nvb29zc3Nzc3Nvb29vb29vb29vb29vc3Nzc3Nzc3Nvb29vb3dByXV9wZVdLUGNPS0JHQ0pIS0ZBPEE9SFBBOjo3Nzg3Njc4Nzw6OD09PD47QD88Pz07Ojs5Ojk8QEJAQkNAPUFAPz1AQkNDQUBAP0A7RU144N3d3d7e3t/f39/f39/f39/f3+Dg4ODg4ODg4NXV1dXV1dXV1NXU18h4i4V8goh6g4SBfoKCc2l0hYuGkJ3U1tXU1dbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tvb2tvb3Nzc3Nzc3Nvc3Nzc3Nzc3Nzc29zb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb297KalxjcWVST1heSz9HTElPS0VAPkFCP0lPPjk6NzY7NzY6Ozc7Ojg6PDw+Oz09Oz48Ojs4OTo4OUFCQkFAQDtAQj06PkFCQz8+PT4/PUZOdN/e3t7e3t7f39/f39/f4ODg4ODg4ODg4ODg4OHV1dXV1dXV1dXV1s6dhpl+f5OTin+CgXx9gnNxm4mAgoOJwNnat7TQ19bW1tbX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tra2tra2tra2tra29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NvfwGNaW21gVlBTU0pETEhNSEk8PkFEQ0ZORDw8OTc5OjY4Ozk3PDk4OTw9OzlAPjpBPzw3NTc7ODpAQUVBPz45PUI/Oz1CQkI6Pj07PT5GTnHe3t7e3t/f39/f39/g4ODg4ODg4ODg4OHh4eHh1tbW1tbW1tbV1tjLioCHhYOXjHh7e3lvfYF1a3ebdHZ7eInHxpiMrdjZ19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2drZ2dna2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tra29vb3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29zb29vb3Nzc3Nzc3Nzd3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3Nzc3Nzc4LdjV1lrYlJNVVFMSktGS0ZDQD5CQT9FTT4+PTg5OTo3OTo3NT03Nzo+PDs7Qjw5Pz05NjY4PTk6QEJGQD49PEBCREA9QD9DO0A9PD4/Rk9t3N/e3t/f3+Dg4ODg4ODg4ODg4OHh4eHh4eHh4dbW1tbW1tbW1tfVrYZ6d32rn3l4entzdH+Dfm9xe3l6c3t2k4qFgImkzdnY19fX2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tna2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29vb29vc3Nzc3N3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vc3Nzb3Nzc3Nzc3N3d3d3d3d3d3dzc3Nzc3Nzd3d3c3Nzc3Nzc3N3d3d3d3d3d3d3d3dzc3OGtYVtebGJSTVZMTUdLS0RGQkI7QT08RUxDQT44Ojk6Nzc5NjY6NTs+QDs9Oz89PD89Ojk5Ojw5PEVDRkA/PkBDQkQ9OT0/QT1CPz1APkdPadvf3t/f3+Dg4ODg4ODh4eHh4eHh4eHh4eHi4uLW1tbW1tbW1tfQmH+Qh4N9eoN2e3Vzenl6kKqmd3JyfoeHh4CAfoKEhJHJzNnX19jY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra29va2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2djY2NnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vb3Nzc3N3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzb29vb3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3dzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3NzhpV9UYm1iUE9TSUhHRkpJSUJBPkJCPEVFREA+ODo4Ozc3Ojc4ODY+Pz07PDk9PDo+PTs6Njc7NjpEQUY+Pz8/PkNBPzs9PT47REM/PjxIT2fZ4N/f3+Dg4ODg4eHh4eHh4eHh4eLi4uLi4uLi1tbW1tbW19jYyH52doN+fnR2eIaCenl1d5yhu6GEgoCAfoeKinx/gYaMnKjO2NjY2NjY2NjY2djY2NjZ2djY2NjY2dnZ2dra2tra2trb29rb29rb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3d3d3d3c35pbT2drXFBRUElDT0pLR0xHSkJAP0FHREBBPDg8ODg1ODk3Njc3QEA/Ozw5Pj04PTw8Ojc4PTk/RENGPkE/QkBDPzw6Pj0/PkVEPz07S1Fj1+Hf4ODg4ODh4eHh4eHh4uLi4uLi4uLi4uLj49bW1tbW19XB3LRueHJze3B6eXaFiIR7eH2AgZiljH98fnuRhZaLhoGDgY6Rvd3Z2NjY2NjZ2dnZ2dnZ2dnZ2dnY2dnZ2dna2tra2trb29va2tva2tra2trb29ra2tra2tnZ2dnZ2dnZ2dnZ2dna2trZ2dnZ2dra2tra2tnZ2dnZ2dna2tra2tra2tra2tra2tra2trb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t3d3d6NWFdobllQUUtISlNJTUhNSUtBQz9DRkJBRDo6PDg2NDg4NzY2Nj8+Pjo8OTw7Oj09PDw4Ozw7RERERT4/PkI+Qj84PT8/Q0NCQEE+O0xUY9Xh3+Dg4OHh4eHh4eLi4uLi4uLi4uLi4uPj4+PW1tbW1teslLZ6eHJvd5V7dHuLgHh1bn6Fg3t/hYhyfH2bnI6JioJ+g32Hk5rH1NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2trb29vb29vb29vb2tra2tra2tra2tra2tnZ2dnZ2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2trb2tra2tra2tra2trb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d7Zf1lgaGxcUUtHR09LTk5PTURGQkg/Q0hEREA6Ozs4NzU3Nzc4NThAPkA7PDk8Ozw+Ojk7OTk7OUZERUI8QD4/PEBDOz5AP0A/Qj8+OjtKVWPV4eDg4eHh4eHi4uLi4uLi4uLi4uPj4+Pj4+Pj1tbX19vKhYR3cXJubniVhHt4hH95dnB4c3eLkY6CdnN9ioaId3d1d4ODfIiIk8Pb2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2trb2tvb29vb29vb29vb29rb2tra2tra2tra2tra2tnZ2dnZ2dna2tra2tra2tra2trb2tra2tra2tra2tra2trb29vb29ra2trb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f0nVZaGlqVk5KSE1OR01EUElGSD9FPUZMREM+Ozs8OTc3OTY2OTU4Pj4/PTs8QDs9PDo3Ozc5OThHREVCPUE9Qj8+QDw/QUE/QEJAPjs8S1Ri1OLg4eHh4eLi4uLi4uLi4+Pj4+Pj4+Pj4+Pj49fX19fEknuJf29sbnV2foSBg4qGfnVybWVtiIaKjoR7c4OHint4e4OPj4GEioqxztrZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29zc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tvb2tvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3dzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f3t7e4clsW2pqalNOR0dOT0VIRk1JSUA7RD5ISUA9PDo6Ojg2ODo3Nzk0OD08PT07ODw8PDw4Njc4OTo6RUJFQT9APEI/Q0M+PkNEQUBAP0A8PUtRYdPj4OHh4uLi4uLi4uPj4+Pj4+Pj4+Pj4+Pj5OTX19fZqXaFfnx3bHB3eXh8jH2KhYB3anN0d3p9bot7fnl6foR/gIGDfnh8foeGlrbT2tnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra29ra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/e3uO9amFpa2lRTkZNTEtKWE1OR0FAQE9BQz9AOzw4OTk5Njg2NjY4NDs+PD07OTY6Ojk6OTU4OTg5OkJERj8+Pj5AQEBCPzxBQD88Pj9BOT5KT17S4+Hh4eLi4uLi4+Pj4+Pj4+Pj4+Pj4+Tk5OTk19fX2sqKhIB5c29tcXN1d4CUeHaAfHWHhXd1cnWgmXp7d3Z5doR0bWxue3iAmouTu9za2tra2tra2trb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc29vb29vb2tra2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f397js2lpbmloUFBPTExPUk9LU0Y/RURERD48PDg7ODc5OTU2ODY2NzM6Pjs+PTc6Pjk5OTk2Ojo4NzxDRUc/Pzs/PkA9PkE9Oz0+OUFAQDhBTlFc0OTh4eLi4uLj4+Pj4+Pj4+Pj4+Pk5OTk5OTk5NjY2NjauY6AenZ1bmpveHCBfWt0cnZ3hIV5h4d5lY55eXp1d3pza298gHx2fYh8gLLe2tra2tvb29vb29vb29vc3Nzc3Nzc3Nzc3dzc3Nzc3Nzc3Nzb29vb29rb29vb29ra2tra2tra2tra29va29vb29vb29vb29zc3Nzb29vb29vb29vb29vc3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3t7e3t7e3d7e3t3d3t7e3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/f39/f4qpqa2hrZFNQT0ZQVFJOSFJLPkREQ0I7Ozk6Ojg2Nzg1NjY4ODg0Oz88Pzw5PDw3Ozo6Nzo6Nzo9Q0JDPUE+Pzw5PT5BQDs8PDtFQD47Q05TXNDk4eLi4uLj4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTY2NjZ1p5vdntveHh2cG50d3BwdHBzb36Jc3qGhY2EenNtcoB6hn1vg5OBdnx9g4a13drb29vc29vc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29ra2tra2tvb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4N/f3+KgbWhma2ZVVlJHUFFOS0xMRUJIRUc9OD08Ojo3Nzg2Nzc2NTY3NDg+PD09Ojg6OD46Ozc4Nzc6Oj5DRDtDQj49OD1AQUM/Pjw+RTw+PUJNUF/S4+Hi4uLj4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk2NjY3MB2doCCfnp4eHBsdXlya399bHNvdGdoaYB/aWh4c2d+iYl4cIKGe3d9foWKvd3b3Nzc3Nzc3Nzc3Nzc3Nzc3d3c3Nzc3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODflGttZm5mU1NJUFlUTEhGTkZGRUJGPTs+PDs5Nzc4NTc5NjQ1NzU4PDs9Pjo6OztAOTs7ODc6OTlAQkE8QUE/Pzk/QEJFQ0FAQEM7Oz1ES01g1uTi4uLi4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk5NnZ2tmYc3uqhJaCcnR1dn14aGx8d2h4d25rcHR5gIN2dHyBhIJ9c3CAin94gn95g8je3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f4N/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh24tubWdzY1lRTVVbV0hDSUZOS0dCRD8/Qjo7OjY2NzU2NzY0ODc2Ozw7Pj86PDk8Qjg3OTo6Ojk6QUFCQUJDQEE+PT9CQ0NEQUJGOTg9REpOYtjk4uLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXZ2drcqHGCtXiRfnNsem6EgXaCfWtoan+DeHZ8dX2FhXRmcHl9d316gIqFe318foC03tzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3dzc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3Nzd3d3d3d3d3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e397e3t7e39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4ODg4ODg4tiFb3FrdWFWT1VVXE9ETUY+SkdKRUQ8P0I6PDk4Njg0NTY3NDc2NDk7Ozw7OD47PEE4ODo9OD04Oj09QEBAP0FCP0A+QENCQ0FBRTc2O0RMTmPa5OLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXl29ra3Z5sbnNxhY1ybXBuf391hH5rcnZ2enN4gXhzb3VwbWt2fHmFiIB/f392coODsd/c3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eDg4eHh4eHh4eHh4OLXhW1xb3ZeUldTWlpRSkhDQFFAQkQ8OT9BOjw5NzU3NDU2NjQ3NTY9PDo9PTk+OjxAODo6PDY7OTs+PUJCQjtBQkBDQEBEREM8PUA3OjxFS01l3OPi4uPj4+Pj5OTk5OTk5OTk5OTk5OXl5eXl5dPOxsB+cWxveHt2b3VuanNzbZKGeG50dG5vdIZ/b2twboJ0bXZyfY2DdnF/d3mKgabf3Nzc3d3d3d3d3d3e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3dzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t/f3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi1oZucG1xYFJZUFdfWUpMTElSP0Q9OTtCRjs6OTc0NTY1NzU0NjY2Pj07Pz45PTk7Pjg9Ozo0ODtAQENCQ0FCRkE/Q0BBQkREOz0+OTs8QkxNZODl4+Pk5OTj4+Tk5OTk5OTk5OTk5eXl5eXl5eW5t7Woc3JscHd6dHd4bXFydXd/hHRyc2xsa3F8bnBudGuBf3GAd32Eg355gHNygYqg2d3c3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh49WHcWxqbF5YWlVXYFZWUE9QTD1BOjs8RkE4Ojg3MzY1Njk2NTg1Nz89Oz8+OT04Ozw5PTs7NTo9Q0JCPENDREREQUE/PkJDQzw9Pjg5PENLS2PN0dnh1sjY4+Tk5OTk5OTk5OTk5eXl5eXl5eXltbW2q3J5cm59f3Z1d2hqaGlwb3Zta2tnZWZxdG15gG5teXd2iHhxa2podXV5dHV/wd/c3d3d3d3d3d3e3t7e3d3d3d7d3d3d3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHi4uHh4ePVhnFwY2lhV1NZV19MUk9STUtAPjg5O0E+ODc5NjQ3Njc6NjY2NDk+Pzo8Pzo/OTo6Nzo9PDk5PEFBPTtBQ0VDRkA+Pj5BRUQ+QEE3OD5GSEpesrW4wbm1u8jg5eXl5OTl5OXl5+fn5+fm5ebm5ra2tbWOfX5weoR1cnZnYmNlbGtyb2ZpbHZtd4Z9hXlsbHd4a3ZwfH14c3V5fHd2h7ng3d3d3d3d3d7e3t7e3t7d3t7e3t7d3d3d3d3d3t7e3t7d3t7e3t7e3t3d3d3d3d3d3d7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4eHj1Yd1bl5uY1pUU1hXS1NLSk1SR0E4Ozs+PDk4NzU2NTY2OTY4NjY5Pzw6PT07Pzo7Ozk8PDs5Oj4+Pjs8PUFEQkNBQEBBP0JDPDw9Nzs+REVKXrG1tLW2t7e2y9rJ3uXl3eDi3tXU1tPU4OPg39+2treuh3t/bnmNenJ1bWNobGxtaXR4enF5enqIh4N6aWh9cWRvcXyGgX55e318e4an2t7d3d3d3d7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4uHh49aGdmxhb19dV1lcWlJQSEpXTEVHPUA9Ozs9OTY0NjU1NTg2NzY3OD87OT09PDw5OTw6Pjw6OTg+Qjs7Pj5AREBDRUFAQD0/QDw9PTU5PEJHRl2xtbW2uLm5ubq9uMPT0r3BwcC6u7y6u8TMxb/Dt7e3hGl1gX1ndYd5Z3Vxa2t5eHB3fH15bWl3e3h3bml1j4FwbHl4d3d9gXuGgnmAoNze3d3d3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODh4OHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4ePXhXJrZ3RhW1hYX15TVVVRVUpMRj9JRDs5PTY2NDc3NTc4Nzc3ODk8PDo+PDg8Oj0+OTs8OTs5P0E8PT9DP0FARUJCQTw9Q0A6Pjw1NDlER0dasbW1tre5ubm5ubm3ubm4uLm5urq6urm5urm6u7e3uX9ucHN6b3B/eXNuc3Vsc3Z4cXFwb2tvcX6Bc2mHhIF9dHOHdW11hYmBgHJ2hafd3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uHj14lxa2xyW1dXXWBUUVVUUFJPSkNATUE9Ozk2NTM0NjQ2ODc3Nzk6Pjs8Pjs5PDo8PDk8PTw7PT0+PUNEREBDQkE/QD48PkE8OD06NjY6QkpIWLG1tLa2uLm5uLi5uLe3uLi5urq5ubi4uLi6uru3uKx7cnhxf3ZzfnBsbXpyZ29sbW50cHt3d3Jyd3pvhpJ2f3x8enZ5fH9zfYdyda3T393d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4eHh4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi49eHb2pxalVWV2FbT1FSUE5XSURESUo/Ojk6NzUzNDk1NzY2Nzg4Ojw7PD46PDo6PTw5PDw9Oz09PDs9REdEQ0E8PDw8Pj5AOzg8ODE1OkFGRVautbW1tre4uLm4uLi4uLe4ubq5uLi3t7i4ubq7t7mqcnB4d3x7e4J3aG5xam9qY2lyf21zcn54dHFsanaAeX2AgH91doB1a4qLgHaR1d/d3d7e39/f3t/f3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f4N/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLi4uPYhm1sdGVWUFxnWE1YU1JRWUVDS1BOOzk4ODc1NTM5NTY2NzY4Nzk+OT0+OTw5OTw7Njg5OTo8QEA9PkBGQEJCQDo+PEE9Pzs7OzYxNjxCR0RQqLa1tba2tre4t7i4uLi4uLm6ubi4t7e3t7e5ure2tIlyd3h9iXxwem99c2hqbGdnbHRscXd0cWx2c3Fxd3FyfHl4g3Z7d2mLkYp9kM7f3d7e3tvY2drZ297f39/e3+De39/f3Nvc3N3e3uDg3+Dg4ODf3t7e39jS397f397e3t/f3t7f3t/f3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLi4eLi4uLi4uLi4uLi4uLj4+Lj4+Li4uPj4+Pi4uLi4+Lk14NoZ3VkVlVkZVdKWllXW1Q9RU1LSD04NzU3NjQzOTQ0Nzc1Njc5PTo9Pjw9PDk7PDk5Oj45PD4/PkFBQ0FFRUQ+OzxBPjw5PDs3Mzc+REhFSqG2tbW1tbW2tre4uLi4t7e4uLi3tra2tra3uLm2traLfXpsbHp/cGx5dm5qaGdlcXp4b2lvb3B1c21zd4Fnb32CgYNyf3lqcHJ6f6ng393Zy8a/vL2/vsLN0tDW3tnc4NfQzcPCw8PH1dfT2dzX1NjX0MfExce9vM/Kz87Y3djO3N3c2t3T0dze39/e397e3t7e4N/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eLi4uLi4uLf4uPi4eLg4d7W29/Sw8rJx9Hb3OLk4eHg2dre1sbExcTN2trf5OHi4trX3st9aWZxYVleZWFNTFRLUlpMO0hNSEZBPTc2NjUzNDY2NDg3NjU2OTw7Pj46Pjk5PDk3OTs7Oj49PEBAQ0RCR0ZCQT08Q0A9OTw7Nzc3P0RGRkaZtrS1tbW2tra4uLi4uLi3uLi3s7W2t7a3t7i5tba3opdxb29waW50dnFmZWNrbmdvcm1mZ2tygWVvdnyAeGRzj39zaHFyaWVlbm+w39HFv7u5ubm5ubq6uru6vc3Gw8e/urq6uru7u8HCvcHFvby/vry7urq5ubq6ubm6w8XDucDDwby/ube/z8/U3tjc3t/g3tLa4N/f4ODg39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eDg4ODg4ODg4ODh4eHh4uLi4eDh4uLi4uHa2t3RwsPCu8XT1uDdydPDrrnAsaqrq6uwtLbJ0sXRxLG4v7Srq6usr7S0vMzE1c60tLureGxtbWBdYl9ZS1NVVFFQREBRTUhEPzo3ODU3MzE1NjQ5ODQ2Njo8Oz08ODw5Njo6ODg5NzU8PDw/QEFAQkRDQkE8PkI/Pz09PTc1OD5DRUNAj7a0tLW1t7i4uLi4uLm5uLe1sautr7Oxs7OztLS0tqaei2tue3ZxeXhnY2hfcXdha25vaG99b25ja2lseHdsa4Z+bHB6dm1scG95sca8uru7urm5ubq6urq6urq6urq6urq6urq7u7q7u7y7urq6ubq7u7q6urq6urq6ubi3t7i4t7e2tbW1tbi3u8e+w8XHzcS4wMnH0tzZ2d/e3uDf39/f4ODh4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh3Nji4uLi4eHh4OHg3tfGxtHQztTe3tPO0t/SuLi8sq2trKysrrG+ua63rKipqamqq6urqqqqq6ysuKyqqqqrq6urra6urq6urryzrayrpHlub21fXl1dVE1SU1xUSkE/UElIPjg5NjgzNzMwNTczNzg1NzY2Ojw/PDg5Ozo6Ojg5OjY1OTs8Pj9EP0NFQkNCP0BAQT9APjw3ODc6QUVEP4W4tLS1tbe4uLm5uLi3t7SurKuqqq2urq6vsLGzs7WjcG5ucm1wg311aWFlaGZkY2Rxc21td25naW1tZXBzb29zcXN8h4F6dX11n7u6uru7urm5ubm6urq6urq6ubq6urq5uLm5ubm6urq6u7q5ubm5ubq6ubm6ubm4uLi3t7e4uLe3t7a2tbW2tra1tbW1tba1t7e3t7rBvrzGycrb3+Dg3tvd3d7h4tDW4uHg4ODg4ODg4ODg4ODg4OHg4OHi0768zNjd3OLg0dnbxL23sLCxsa+zu7uzsLS9s66urq2tra2sq6qqqqmpqKmpqampqqurqqqqqamoqampqampqaqqqqytrq6urq6urq6sraR4aWJxZmFZWlZRUk5cU0Y9QlJEQTc8OzY5NTY1NDU2NTg3NTY1Nzg7Pjw7OTk5Ojg3Nzk3Njg8Oz47RD8/Q0BBREE+P0M9Pjw+Ojo3Nz9DRj54srCztLW2t7i3trKurq2sq6uqqaqtraysrq+xs7S1t4xucnRqaIB5ZmpmZWxdaG5waGxxYmNmcoJ+dmhobGpueoaBhXx4cXF5gK+6ubq6urm5uLm5ubm5ubm5ubm5ubm4uLe3t7e3uLm5ubm5uLe3t7i5ubi4uLi3t7a2tre3t7e3tra2trW0tLW1tbW2trW1tre3t7e3t7e3tre4v8bP0MS+v8DE19e8ydra4OHg4ODh4eDg4ODh4eDb3t7Uzby3tre6wMDJxLfIvrKwsLCwr7Cvrq6ur7Cwr66urq6uraytrKurq6qpqampqampqampqKmpqKmpqampqKmpqKmpqqqrraytra2ur66trK2heWpkbWdiXFhRUFFLVEpCOklRP0E3PDk0OjU2NTQ1NTY4ODY4Njs6OTw9PTs6ODY2ODg6ODY3Pj09PT5BQUVCQkNBQUBBOj09Pz05Ojc9QUc8bKqmqKutsLGwrqupqKqrq6mpqamrrKytra2usLO0tbilgIdvaWdzdGZrcG1qZGxvcm5rbWNrcHyJhG5qbHx4Y3uKfnNqc25rcY+7ubm5ubm5ubi4ubm5ubm5ubq5uLi3t7e3t7e3t7i5ubi4uLe2tra3t7e3t7a2t7a2tra3tra2tbW1tba1tLS0tbW1tra2tra3t7e3t7i4uLe2t7a2uLm4uLe3uL6+uLq9vcfb4OHg2Nnd4eHg3dfKwcPCurm5uLe4uLi3tbS0tLKysbGxsLCvr6+vr6+vr6+vr66ura2srKyrq6yqqqmoqKmppqepqaehpaipqamoop+hoZyip6inqausrK2ur7Cwrq2unXdwbGphY2BZUU1RTFJGQzlNUEU+ODs3Mjc5Njc0NDM1ODg3OTc7OTo9PTw6Ojk3NDo5ODY1OD8/QEI9RENDQ0FDQEJBQDtAP0A/PDw6O0NIPWOopaWlpqioqKenp6ipqqmoqKipqqqsra6wsLCztLW1taWYdn5xZmt4cW9tZmVsaGNsZ2ZpaX11bWlvfXZ5hWZod294b3Fvcninu7m5ubm5ubm4uLm6ubm5ubm5ubi3t7W1tba2tre3t7e3t7a2tbW2tre2tbW1tra3t7e2tbS0tLS0tLS1tLS0tLW1tba2tra2t7e3t7e3t7a2tre2tre3uLe2t7i4t7i4uLi4wMXTyry8w83PyMC9urm5ubq6ubi4uLi4t7W0tLSzs7KysrGwr6+vr66urq+vr6+uraysrKurrKysq6ehoJ6gn5udoaGdlpmkpKaon5mZmZmanZ+gn56fpKqtrq+ura2srJl1cGlrY2FeXVVOU0tSREQ4TktHQTo4NTI2OTY1NDczNzc3ODk3OTo7PT0+ODg4NzU6OTk1OD9AQEJEPkZBQkNAQkNCQT88QEJCQD0+OjpERj5cpqWmpqampqanqKenqKioqKenqaurrKytra2ttLS0tbekc311bnONf3JmanFjaW1jaGZobG51aV9jZ3VzdnpuZ3Bwcn56cYihu7m5ubm6urq6urm2s7a1uLm2trW1tra1tbW1tbW3tra3tra2tbW2tbW1tbS0tLa2t7e3tbS0s7O0tLW1tLS0tbW1tra2tra2t7e3uLe3tra2trW2tbW2tra2tra2tra3tra3uLi3uri4uLi3uLi5ubm5urq6urm4t7e3t7W1tLS0s7OysrKxsbCwr66urq6urq+vra2srKuppaSmpqScmZubmpmampmXl5eXl5aZm5iZmJmZm52en5+dnJ6gpKWko6OioqKQdG5jcGFeXltUU1RIVEo/PFFCRkM7ODYzNzo1NTQ4Mzg5OTc4OTc7OTs9Ozc6NzU2OTk4NTg+Pz9ART5CPz9DPzxBQUI/PT9EQT8+PTk9Q0Y/VaSlpqanqKeoqamop6ioqKioqKiqrKuqqaipq7W1tba5o3eKcXKHhnd0cGh5a2JjYWVsaW5zal9jZWNjZWprYmRqbHaXjX6ovbm3tre5u7u6uLWxrKurqq6wrKyrq62tq6uvsLGvr7CytbW2t7W1trW1tbW1tbW2trSvr7O0tLSvra6vsrW0tbW1tbW2t7e3t7e3t7e3t7e3t7Owsra1tLa2tre3tra2tbW1tra3t7e5uLi4t7e3uLi4ubq6urq5uLi3t7e1tbS0tLS0tLS0s7OysbCvr6+vr66vr62oo6KgnJqampqZmZqbm5qampqbmpmZmZiXl5aYmZmZmpycnZ+foJ+goKChoaCgoJ+fi3RuaXRdYGZeUlRLRFRJPUVTSEVCOzo0NDY5NDQ1NzM4ODg3ODk5Ojs7Pz04OjkzNTg5NjM5PT5AP0A6QEJCQkA/QEJCPz0+QUFCPz06PkVDQFGjpqWlp6inqauqqKaoqKipp6ioqKinp6ioqaq1tbe3t7KZtH99kIx1Z2lqbGZjYGNoZW94cGlicXx5cGpmZmRma3NqhYystrKwra2ttLeysLCtrKuqqaiop6ipqampqKinqKipqaeoqqurra2sqqytraysrq6traunpaSnqqyopKOkpamwsbGztbW2t7i3t7W1tre4t7e3t7Kppaasq6ivtLa1s7W3t7a1tbW2tra3t7e3t7a2t7e3t7m6urq5uLi3t7Wxs7S0tLKxsK6sq6yurrCxsK2rqqmqqKijnJqZmJmYmJiYmZmZmZmZmpqZm5ubnJybmZeYmpqcnJydnJ2foKGhoqKioKGgoKCfnop1amtuWVxhVktPREdVRz5PV0hEPTw4MzQ0ODQ1NDgyODk4ODk6Ojw5OUA8Njk6MzY3OTE0PD8/QEBBOkNGRUJBREJDQTo7P0FCQz9APUBEQ0BPo6empaemqKqqqqakpqenqKioqKimpqaoq6uttba3t7e4rbJ1cHuDdmBiaWtiZWZhZGdmfYh5bHKAfXFvcXhjbW5xZo+srKurq6ysra6urK2trKyqp6WmpaWlpqioqKiopaeoqKioqKeoqampp6Wko6KioqOioKKioaKhoKChoaKjpKOjpaWlqLC0s7OzsKuqqaqztLa3trGopaOioaGipKiqqairs7Sxrq6xs7W2tra3uLi3t7e3t7e3t7a2uLe0sa6ppqerrKmnpqWkpKSkpKWnqaajoJ+enZycm5uampmZmJeXmZmZmJiZmpqampqampqbm5mYmpydnZ2dnZucoKGgoaOjoqCgoKCfnp2FdGtsaFdYU0pHTUVITUdAU1dGRz09OTM2Mzc0NTU3Mzg6Ojo6OTw9OjpBPDY9ODM3ODgzNztAPz9AQDpCRUNAQkRDQT87PEBDQkNBQDxBQ0A9TqKnpqanp6mqq6mkpaWlpaaoqKippqanqKmpqrW2tre3t7izc2h7c2JnamtpaWJhZGloXV1tfHJma3J/fHR8bm1zc36gqamrq6uqq62trKusq6mpqKWjpKampqWmp6eqqaamp6enqKinp6iop6WjpKKhoaGhn56en5+fn56foKGho6Wko6OkpKSmp6enpqWkpaampqeqraumpKKhoaChpKWlpaenpaeoqKalpaivtLa3trW1tra1tbOwrKupqa6rqKWlpqampaSkpaWlpqWkpKSkpaKhoaGgnp2bm5ucm5qamZiXmJiYmJiZmpmZmZmYmZmZmZqZmZydnJycnJybnJ+fn6ChoaKgoKCfnZ2cgHNrbmReU0pITUZETEtFRFFTQ0c9PDgzNjI4NDY0NjQ4OTg6Ozk7Pjw5PTs5PTczNTk2NTY8QD0/QD88P0JDPkJCQj89Pj5CQ0FFQD86PkVAO0+jpqWkpqeoqaelpKWlpKWnp6eoqKanp6alpqa1tba2trW2uYptcW1vfHxxZ2pmYGFsYFROW2hqbm9tgYJ9cWdxdn6aqKeoqqmpqqurrKqqqqimpaWkoqOlpqalpaWmqaqppqWjpKWmpqSjo6KioqKgoJ+fnp6cnJycnJ2dnJ2en6CioaKjo6KhoqKkpaSioqOjpKSjpKSko6Ggn6GipKanp6ipqaelpaSipKSlqK2wsKyrqqusqqmnpaWmpaWlpaalpqioqailpaWkpKSlpKOjpKOioaGhoqKgnp2cnJubm5qZmJiYmJmam5mXl5eWlpeXmJiZmpqcm5qampubm5ucnJ6goKGgnp6enpycm356bnJiXlNNSlBFRk5NQkBPRT5JOz01MzYzODM2Njc1Ojs4OTs5Oj49Ozo5OT03NjY5NjU2PkI+PkE/PT5DQT5DQ0BAO0BAQkJCRUA+Oz5FPzxQoKSjpKOjo6SkoqSlpaSlpqamp6empqalpqaltLW1tbS0tbiBaHx9ZXOCemxwdWFfY1ROT1FbaGxpbGxxbW5xbnScoqSnqKioqauqqqqqqaempaSjo6OjpKSlpqalp6ytqaShnp2eo6Shnp6foKCenJ2dnJycmpqam5ucnJubm5ydnp6foKChoJ+goaOioKGjpKSjoqSlpaWkop+go6SkpKapqainpaGdnJ+jpaipqainqKioqaempaWkpKSlpqampqampqenpaWko6Ojo6KioqGhoqKhoqOkop+enZ2cmpubmpqZmJeXmJaWlZSUlJWVl5iYmpubnJuampqam5ucm5ucnp+fnpucnJyam5p/fnF0YFtUTUdNSEZMSj8/TkM8QDs8NDM4Mzc0NzY3ODs9ODo6OTk7PTs7ODk9Nzc4OTU4OD9APT9BPjs9RD89REA/PzpAQUE/QUVAPjw8Qz88Tp2ioaKioKCipaSkpKWlpqenp6empqampaampbW1tbS0tLS3jHalsXdmc3Jvc2xjZGlYT1JRT09dgG1kYFptkZGSoqKjpaampqenqKiop6alpaSjoqGhoaKjpaempqesrKemoJ2cm6Ghnpuamp2cmZiam5qampmZmZubm5uampqampucnZ6goaCfnp+hoJ6foqOko6Omp6inqKWioKGhoaGkpaWlpKCcmZmbnqOmpqampqanpqempaOlpKWlpqiop6enpaWlpaWkpKOjo6KhoqKioqKhoaKjo6Kgn56enZybnJubmZaUlJSTk5OTk5SUlJWWl5qam5ubm5qZmZqanJ2dnZ2dnZuampqamZqXf3dvc11aTkhKTkdFRklERU5APD09PDQ1OzQ2NDY1Njc5Ozg5OTg5OTw7PDc6Ozc4ODg1ODg/Qj9BQTw+P0A8PEJAQT49QT4/Pz1CQUA6OkA8PE+doqGfoJ+dn6OkpKSlpqeoqKenp6ampqampqW1tLS0tLS0tbSXtqd1Znh2Y2xjY2VjW1JTU1JNXqCMeFhodpajnp6hoaOjo6OjpKSlpqalpKSioaGko6OjoqOlpqWmpqenpp+bmpuioJmWlpWam5mXl5iYmpqYmJqampqbm5qZmZmenZ2goqOjo6KkpKWinqGhoaKjpaampaSjoaCgn5+hoZ+goJ2amJeZmpygpKOjpKWmp6alpaOjpKSkpKWnp6ampqampaWmpKOjo6SjoqKjpKGfoKGhoKGgoaCfn56dnZyamJeVk5KSkpKSkpOTkpOUlZaZmpqbm5qampqbnZ6enp2cnJybm5qamZmZlH10bHReWk9IRUdGQkVORT9GOzo+Pzs0Njo2OTM2NDY4ODo4OTc4ODo8Ozw5Ozs6OjY3ODk5Pj9APjw9QD5AOjlAQT89QT8/QUE+QUE/Ojk9PjpQnaCfnZucnJufoqOlpaWlp6iop6ampqanpqantLS0tLOysrGwsK2rkHiGj36bmn93Yl1TUlFRTGKgootaiKCgn52YmZycnZ2eoaGgpKenpqWkoqGjp6alpaKipaampaanpqagm5mboaCXk5OSl5qcmpeXl5iampmampqam5qYmJmaoKCgoKGfoaKipKamop6gn5+goaOko6Khn56enpyanZuZmpqZmJeZnqChoaKioqKkpaWmpKSkpKKioqKkpaWlpaWlpaalpaOko6KioqGgoKGgnp+fn5+fnp+foJ+cm5qZl5WUlJSTkZCRkpKSkpKSk5SVl5iZmpmZmpqam5+fnp2cnJycmpmZmpiXl5F8cmdxXl1QRj9BRD9KT0JCRjhDRT4+OTg7Nzc0ODQ1OTo6Ozk3OTo8Ozo8PT48PDo2NzY5OD4/QT47Pz49PDg6PkFAQUE/P0FCQERBPjo4PkE8U5ycm5uampycnaGio6KjoqSmp6alpaampqSjo7KysK2rp6amp6alpqiln6iop6qnoXmEXFFST0xcnKCAYpmgnp2clZOVlpeZmp2dnqGmpqampKOioqanp6ajpaampaWmp6amop2cnqGfl5GRkJSXm52YlpaWmJuZmpqampqZl5iam6Ghn56fnpybnJ6goJ6dn56fn6Cio6SjoqCfnp2ZlpeXl5iYmZubnqKioqKioqGio6WlpKOio6SioaGhoqOkpKSko6SkpKSioqKhoqGgn5+gnp2enp2dnZ2dnp6em5mYl5WTk5SUk5KQj5GSkZKSkZKTlJaXl5iYmZqampyenZ2dnJubmpiYmpmXlZaNempmamBiTkY+P0A9SkVAQ0A7QEE8Ozs5Ojc2NTg0Njc4OT04ODs6Oz87Ojs8Ojk6Nzc2ODs7Oz08Ojo8PTw3Oz5DQkRDPz1BQ0FEQT88OkBCO1eZmJqamZmam5ucnp2foqKhoqSlpKSlpqSioJ6op6alpqWlpaemp6ampqakpaanqKehqXJOUU1KVJahenKanJyenJeVlJWWmJiXl5qeoqKhoqOkpKOjpaalpaanpqSlpqalpaOgoKGhn5mSkI+WmpmenJaXl5eZm5ycnJqamZeZm5uen52cnZyZmZqcnZydnp6fn5+hoaCgoaKgn56bl5WVlZeanZ6fn6GhoqKio6OhoaCgoJ2cnaGioqOkpKOioaSlpKOko6SjoqKioqKhoKGfn52cnZ2cnJ2dnJ2enpqXlpaVlJOTkpKSkpCRkpKSkpGSlJWWl5iYmJiam5ycnJycnJ2cm5mYmZiWlJWXi3hsY2RiZFFHQT1DO0tIRDo7Ozw+OTo6OTo3Mzc5NTo4ODg8OTg7OT09Ozo7Ojk8PDc2NDc/PDo9Ozw/Pjw7ODxBQ0FDQkI+P0NAQkFAOj9APztZmZiampqam5ubm5ydoKGhoaGhoqKioqKhn5+dpKWmpqenpaWmp6ampqWkpKalpKSkpaaGUFJQT0+PmHB6mpubnJ6cnJycm5ubmZiYm56dnp6foKOkoqGhoqKio6SkpaalpKOjoaGhnpyalZOUmJuam56amJiYmJqcnpyam5iWmZybnJycnJydmpqbnJ2dnp6dnp6fn52cnJyhoaCblpWVlZacoKGgn5+hoKKjoqOhnZuZlpaWlpicnqCip6ikoaCgoqOjoqKioKCgoJ+fn5+gnp2cm5ucnZydnJmanJuWk5KSkpKUk5KSkpKSkpOSkpKRkpSVlpeYmJiYmZqcm5qbm5ucnJqZmJiXlZWWl4d3ZGdoZGJNQ0U8RDlJSkU5Ojs9PTo6ODg6NjQ3OTU8OTY4OTc5PDs7PDo6PDs6PDw4Nzg3Pj07Pj46Qj86Ojo/QURCQ0FBQD9EQUFAPjpAPj06W5qYmZqbmpubm5uen6CgoaKioKCgn5+enp2dnKWkpaanpqWlpqakoqKio6Oko6Kjo6KnllRYVVJOZ21rgZ6am5udn6Cgn56enp6dnJ2dnJ6enp+goaCfn6CgoKGio6Ojo6OjoqGgnpuZmZiZmZmamZienpiYmZmam5qWlZeWlZicnJ2cm52dnpybnJ2cnZ6bmJqeoaGdm5udoKKhmpWVlpaZoKKgnZueoKGjop+em5eXlJKSlJeYmZ2goqenpaGgn56goaGioaCfnp2cnJubnJubmpqZmpydnJmXmZaVk5GQkJCPkZKSkpKSkZKTk5OTk5OTlJWWlpeXl5manJubnJucnJqamZeXlpaVlZSEcmZsYmRbREJMPT84RktCPEA+Pj05Ozk6PTg1ODg2Ozg1Njo4PDw7Ozw8Ozk8Oj09OTU4Nzw5PD88OkE/Ojo6QEBDQkRBQ0A/Q0FAPj08QD09Ol+al5mamJeYmpycn5+foaGhoJ+fn56foKCenZ2lpKSko6OioqOjoZ+foaGipKOio6SiradXXl1UV19ua42dmpqbnJ6dm5ucnZ+enZycnJydnZ+goKChoaGgoKGgoKGioaGioZ+enJqampqbnJqZmpuZnJ6ZlpaWl5eTjo6QlJabnJuam5udn52cnJycnJ6dlpSZnJ+in5ycnZ+hoJuXl5mZmpycnJubnZ6fnZqXlpaWlJOTlJiampqfoKGmpqWgn56fnqChoaCenJubnJybm5ybm5qZmJmZmZmXl5iVlJKQkJCQj5CSkpKSkZGTk5aYl5STkpSVlJWWlZaZmZmam52cnJyampmXlpaWlpaQgG9vZV5gV0BKSDg/N0lFP0VBPD07Ojo8Ozs3NTs4Njs3NDY6Oj47Oj0+Pj07Ozs+Ozo4Ojk5NkBBPTo8PTo6OT9BQ0JERUM+P0FBPz8+Pj89PDtgl5WXl5aVl5mbnqGhoKGioqCenp6enqCgn52bpaWjpKSioKCfoJ+dnZ+hoqOjo6OkobCjXWVkYGFua4GenJubm5ubmZianJ2enJubm5ycnJ6ipKGeoKGhoqKhoKCgoaGgn5+enJqZmpubm5ybmp2dm5manJiXlZWWkY6Nj5KYnZycm5ycnqCdnJucnJyempWVm56foZ+dnJyenp2cmpqampqampqbm5qXl5aTkpWVlpWTlZaam5qanZ6foqWjnp6fn5+en5+enZ6fnZycm5qcmpqbmpiZmJiYmJiYlZSTkZCRkJCQkZKTk5CRk5SYmZiVk5SVlZWWlZaXmZmXmZqenpyamJiXl5aWl5eYjX1ubV9lVlRFSzw3PjdSRUM+QkE4Ozw7OTg6ODY7Nzc6Njc5Oj0+Ojw8PT49PD06Pz06ODw9OTtAPj4/PT45ODs/QkNAQ0VDPT9DQj5AQD5APTw8YZWSlJWWlpeanJ6goKCgoaCgnp6enp6gn56em6WlpKOioJ+fnp2dm5mbnJydnp+gn56rmGNpbW5pZm2enZybm5ybmpmZmZqam5ucm5uam5ygo6SgnZ6en6CgoKCgn6ChoKCfnpuamZqam5ubm5ufnpyZmJqamJiYmJKOj5OXnJ2bnJ2cnJycnZycnp6dnpqVl5ygoaGfnp2eoJ+cnJuampqbmpqYmpmVk5OTkpOWl5eVlJiYmZucnJydoJ+gnp6enp+fn56en6KjpKKgnp6cm5qampuZmJmZmJeXlpWUlJORkZCQkZKTk5OSkpOUmJmYlpWUlZaWlpaWl5iYmJiXmZqamZeXl5aXlpeWl4l4dmddX1dURUU5OTs8WT5AOEI/OTs7Pjk4Ozg6Ozc5OjU4OTs9PDk9Oz0+PD0+Oz8/Ozk+PDw+Pz5AQUE9ODc7QkNFP0FFQz1AREJBQEQ7Oz47PGKWk5SUlpWUlpiYmZubnJycnZ2cnJ2en56dnJqkpKSkoJ+enpybm5qZmJiYmZucnZ6cpolla3R4bVuFop2dnJydnJqbmpqampydnZ2bmpuboKKinpucnZybnJ2enp2dnZ2fnpyampucnZycm5ycnp6cm5qanZqam5yVkZOXm52dnJ2fnZycnJycnZ6fnp+cl5idn6GhoJ6cn6CfnJubm5qbmpmZmZmZl5WWlZaYl5eXlpaYmZuenp2dn6GhoJ+fnp6fn5+dn5+hoqKhoZ+fn5yZm5qcnZuampmXlpaYl5eXlpWTkpGTlJSTlJSUlJaZmJaVlZeZmJeYl5eXl5eYl5iXl5eXlpaYl5eVl5eDeHZfW11eUT1GOjk4P1VDQTtDQzo8Pz86Ojk3Ozg4ODc0ODk8Ozw4Ozs8PTo9Pjo/QT06PTw+PkA/PUBBPjk2PERDRUBBRUU9PkVERD9COzo8OTpkl5SVlZaUlJSUlJWXmJiamZqcnJydnp6dnZybo6Oko6CenJuamZqZmJiYmZiam5ubm6WJa3F2em9lmp+enp2dnJybnZ6dnJ2enp2dnJydm5ygoJuampubmpudnJqampucnJuZmZycnJ2dnZ2dnZ2dnpybmp+fm5ydm5mZmZudnZ2dn52dn5+dnJydn5+fn5uanZ+goJ+dnJ6gnpubm5ubm5yampuamZudnJqZmJeYmJiYmp2foKCgoJ+hoaGgoJ+en5+fnp6foaKhoJ+enp+enJqam5ubmpqZlpaXmZmYmJiWlJOUlJWVk5OVlZSVlpWVlZSYmZuamZaWl5WWmJiWl5OUlJGRk4yRkJOWfXhqYWJiXFA8QDw2OENWSERCOjg7Oj47Nzc5Nj06OTk2NDc6Ozw9OTo6Oz87PT08QD47Oz46PT89PkBBP0A8NztBQ0U/P0REPj9EREM+Qj07PDs6Z5aTk5OTk5OTlJSVlpeWl5aWl5mbm5ybm5uamaOjoqCfnpuamJeYl5eXmJmYmZybm5qkgGpqb3lzcZegnp2dnJydnp6enp+enp2cnJydnp2bnJuampqam5ubmZiYmpqamZmZmJqdm5ydnZ2dnJ2cnZ2cm5qdn5ucnJubnJubnZ2dnJydnp2enZydnZ2cnJ2dm5uenp6dnZybnpubnJycnJydnJubmpmbmpmYmZmYmpmZmpyfn5+jpaKfoaKioaGfnqCgn5+fnqCioaGhn5+fn52ZmpudnZqZmJWWl5aVlZaTkpOUk5STkJCSk5GUkY+OkJGOlZabmJWYlJmXlJiRjJCPk5yTkoyFjIeDhndxZ2pkW1xRQT44NkJHYEJFR0A+Ozw7Ojg4NjU8ODo4MzQ6Njk9PTk5Ojs9Ozw6PD48Oj5AOj5APjw/QD8+PDg6Q0FEPz5CRD8+Q0VCPUJAPDw8OmeYk5KSk5OSk5SVlJWXl5aWlZaXmZmZmpqampqkoqCfn52bmpmYmJiXl5iZmJmcnZ2cqH1nZXN7enOJop+enp2dnp6enZ2enZ6enp2dnZ6cm5ybmpubm5ucm5iYmJmZmJiZmZmbnZycnZ6enp6enp6dnZybm52bnJybnJ2dnZ2dnJ2dnp+fn52cnZ2dm5qbnJmZnJ2dnZ2dm5uanJ2dnJycnp2dnZybmZeVlZeXmJqam5ubnZ6foqOhoKGhnJucm5ubnZqcmZycn6CfnZiZmZmUkpKUl5SPj4+OkYyNiYuQi4mLjpGRj4mQmJiQkoyNi5KQj5iYoqiqpqWlrKOmoZqep6eyqKKVo6Cfl39wcWlsXFtcTUY8NzdHR1g+SE5URjk+Ojg5ODc1PTk4NzMzOTY6Pjw6Nzo8Ozo6Ojo8PDs/PjtAQD47PT5BPDw2N0A+QkA+QUY+PEFEQT1DQj49PDlmmJSTk5OTkpOUlZOVl5iYmJaXl5iZmZqampqaoqGfnp2cm5mYmJiYmJiYmZmZm5ybnKx/am16f3lxh6Genp2cnZ6enp6enp6dnp2dnZ6enJubnJubm5ubm5uZmJiYmJiYmJmZnJ2dnJyenp6enp+fnp6dnp6dnJydnJ2dnZ6fnZ2fn56goJ+enZ2dnZybnJ2em5qbm52enZ6dm5ubnJ2cnp2cnZqYl5SRjo+QkJGVmJSWlJiZmpudmJuYlY2Mjo6TkpKRj4mQjpGRjo+Ki42NjYiIi4+Lg42NkY+MkI2Qk5WVnJihoJySn6SipKmam5eanKOprb3Bwbq8uL26ucC8ubq3uru7tL2zwbV/bnVmZ1peWUxJRTo7TElTPFZSSUM6QTo7Ozc3NTo6OjgyNTY4Oz08OTk7Ozw5Nzo4Ojw6PT85PD8+PDw9QTs5NTg8O0A/QT9EPTxBQkA8REM9PT06YZOTkZCUlJOTk5OTlJeYlpeZmJmYmZqbmpqamp+gnp+fnJqZmpqampmYl5iZmZmZmZmphXB1e4B3b4mhnp6enp6fn56en56fn56dnp6fnp2dnJ2cm5ubm5ubmpiYmJiZmZiam52cnJ2dnp2dnp6goJ+enZ6hoJ6dnp2enZ6fn56en6CenZ6enJydnZ2cm5qYnJuVmJqamJiYmJmSjJCXlKCXk4+MjYqKiImMiJORh5CPjYqKkJCLjoqMi4+IiImJjpGOjYaFiYaKhoWLiI+SkJCNkJKXlpKamJ2TlJ6kpqaqq7Gsr6+rpquqsbm5tbS0rqyvtMDIxcXBvsbDxMTDurW+t7a0s7C2tb6qcHRyXGZfXl1JRj8/RUtMVklcTEQ/PUI6Qzk5Nzc7OTk3MTc5ODo+ODg6PDw7OTc5OTs9Oj4/OT5BPDs+PD46OTY5PDpBPkNBQT08QkBAPkJEPj8+OVyHhIOHi42KiYaFgYqMkZOVmJiHlZaWkpiampmenZ+gn52ampubm5ycm5iWmJmXl5ibqo56dXZ7f3mCoJ+fnp+goKCfn5+foKCfnp2dnp+enp2dnJqbm5ybm5uYmJiXl5iZm5ucnJydnp6enpybm52dnZycoaGfnZ6dnZ2dnp2dnJiWlpaYlZWSlpmWk5GKjI+PjI+NkIuLj4+WiYiEi5GZjn2Fi42PjYyHioyQm4yRj4+Lio6TjIyNjIiSi4yFiYyPhouIh42KhYyEj4qXkJOYmpWbnKOqoaKknKKrsbe0ubWxs62vsrKlp7O6sbq6vLa3tsDDw729vLa/urq8wbW4wL60r66mqa+3mm58Z1tjWl1fSEU+QUtJU1hZXkFGOTk9OUY/Pzo3Ozs7NjM6Nzo5Pjg6Ojw9OTk4Ozk7PDo+PTtAQDs8QjxAOjg0Nzw7Qj9BQj4+O0NEREBDQz0+PjlhmZWLkYWNj5aSiHl9e3+Fi4OKgoqJhmuAeJCLlpqRnZ2UlJGTlpeampiWk42Sk5KQm5uIdndzcX1/cpGgnZubm5yenZ2eoKGgm5uWlpucmpybnJuYmZqYmJmampqWi5CTlpmYlZiYlpucl5WSkY2SkZCUk5KXm5mYm5ePjpCLjo2Ch4uLi4qLiI2RjIeHhoqIiZGKh4yEhYqNi4qNhI+UkIyDkJOUmZWQi5OTkZWRlpWOj5GMlI2Oj4qIj4ePhoeJiYmNiomJioWNh46JmJKUmpuXmKChp6Cko5qqqbO2sbWwqKmiqK6tn6qvsK21ubi8wr/BxLixtbCutrOwuL68ury+urOzp7G3wpB1gGNiXlpXUk1IRkVQSVlXX1tDUDpCQz1HRj84Nzo6NzU1OTc8OTw5ODo9Pjo6Nzs7Pjs7PTs9P0E7Pz48Pzo4NDM3OkFBQEI+PjpDREM/QUM7PT45Z6mloqKZn6CippeUiI2CiIJ1h4iKiIp7e3Z7enmPeoiSfn18en6CkYWBgH1zfH99fISHfnRweHZzfHaBj4iIiYeIioyMkZicl4iOhIuNi4iNkI+Pi5GPi4yOj5CQjouFhYeLjIyHiIuOi4eMhYaBjYuGiop/iYqGiJiRiIOIg4KFfIuLjIaJi4iKkIyIi42PjI+Wh4mLio6NjY2Wk5OdnJyalpycm56bmpuYnZeTkZWWkJKRi4+LlpSMjYqDi4SEiYyQkIqOio2LipGJjZOTk5SVk5KcmZ6Xn6CfpaKvsamupKSfmKStpqa4t6ysu729wsPAv7+vpa2wsLS3uLO0uLa0ta6stK+4tLaBeXpjZmBeVlBRQUVMT0lcXl9UR0dCS0xCREA9ODg7OTU3Nzk3Ozc9PDk9Pj05Ozg6O0A8Oj06PkJBOD88Oj84NjQyOTtCQD9CPj04QEI/PkBEO0A+N2CloJqXnaGaoaCPl5efl5WCjaCfo6GdmpKOjIxycXBvdnFucG1ucHZub29waHBxcHR+c3FycXd7cnl2d3Jyd3Z6e3l8fXt/iIGEi3+PkYaNi4uGiouLiYaEgYaCgIKJkYOAg4x/ho+LiYWAh32AgZKQhoSEho2DhIyPj4+IjY+Hi4iRkJWRjpCKk5eOj5WYp6SfnZWYlpaln5udq6aqt7W4srGnr6qnpqGfmp2WkpWVkYqPjImTjZuVjYuLhoaJjJWQkJCLmZKVlZSbkJiTlIyNkYyWl5WilZ6mqauno6OqsJucpp+mq6G0vb6zs7+5u7u6uby9rqiusa6wuLyztLGxqrCpqLGxsqild3J0X2hhYFRWUUlKSFZNXl5eVExKRVFKRUdDPTo5OTc0ODY4Mzg4PTo9PD47OTs4Ojs/PDw+OT9DPzg7Ojg8Nzc2Mzc5RT4/Qz89N0BAQT0/RDw+PThUj4yGh4eUjJWZl5yWmZaNlZyWlZydoKCdmpiWeHFubXJ4cXFsbnJwa3FvcG1yc3t1dnd5fnVxeHZ0d3tybn98gX15eH1/eYOGg4WCg5CLkIuLi42Pi4mJhYKBfX9zfYiAfpyQhIWFiYuPinp9fYaOjYqGjZSRi5CXj5SXkpihlp6XlZunpp+goKawq6GjpbW0sqqmqq+isba5vcK7ucO+vLi9uLWxrLCspZuSk5mfm5SPk5WOmp2doJqfn5edo6qsoZ+em62hp6qwqaampJiRkZWUo6SirKSss7Szs6i3tru4sLKvra2yt7a6srW6s7e5u7i8urayr6yxsbKztLOxsa2us7Gzs6yhl3Zxc19jXlJRVE1PSUdYT1pcZFROR1VPRURKRD44Ojg3NTg4ODU5Nzo6PTw/Ojg8ODk5PTs9PTpCPj84Ozo5Ojk4NjI1N0I+P0RAQDY+P0I/PEM8PT46Tn98go6MjJOTl5eaj5SWjZaRkZSXk5qanqGdnHJvcnFxcXFxcG5zcW91dHJxdneAdXd8eYV+d3t8eX1/fICJiYmDfXp/h4GIiYGAgIGGiIGGi4aIhYSIiImEf4J/enx8fX6SkH+IeIGFi4qDhIWKj4yNkZmdlJSUoJqan6Ktsa2ppKWtr6ysrLWuvrmtrqm1sLexq7G2rK+9wsLAvrq8trKutraxtK66u7OurKepp6unoqmtoKmooq+wuLSxvLq6urK0ta+8tLezt7e7t7mtrbCprLW5sbeytLe2sLu7vLu6ury1vLi0wbWsqqqrtLG3uLm1trSzsKymrrCqq7Cxq6yusLKxtK6qo5N4dnJlZ1tMUlBGTUhTV1JlXmdUUExcUUhMUkNBOTk3OTU4ODY2Ozc5Ojs6Pjk4Ozo6Ojw8Pj08RD45Njs7ODg+OTUxNTZCRkREP0A3Pj5DPjpBP0BAO0t/gomXmJSdlpabmIuSlo6XkZGVl5SZl5+bmZx8dHV2dXl1c3RudnJzdHV2d319gX56gXyDfoJ/fYB/hIKFj52RiYF/go+Xjo6HgoCBiIuFfoqQi3+HjYyLioeSioeGjZGTkZGEh319g4iMjouOiomQj46PlJSYkZWbmp2dqK6yr6+1tLOtsrW4sLy1tbGqsKqztbS7t7SztrS1r7i4t62noqassLCvtre3vrW5vLOysa61u7C0r6+yu7axuMC9tLS0s7izvLq2tLrAvbm6ubq+ubm5vrWysa+yr6q1tLGzsbSzrri4tb+vpKaoo6ussa+zrq6wsKytq6qroqKmqKKnrauqpaynoqeYeHlxZmVZT09NSVJNV0xPX15cTlVUYlFEVE07Pzk8ODk1Nzc1Nzk1Ojo6OTs4Ojw8Oj08Pj4/P0I9ODY6Ojk6QDs1MjY2QUZDQz4/Nz49Q0I5P0I/PjtLjpGTmJmVmZGTopiTkpKLk4uOkI+Vl5ablZSbhoJ9enh2dHRzdH53end2gIKDhouMhISFioaQiYeRk5aRjZaalY+IjI+emJaVkpCTl5qamJCdoJ2Tl5qgmZ2bo6CVkJugpKOak42IiIuJkZGOkY6LmJqPj4yUmpecnJufnKSstLm6vK+2tLi0tLK3uLmzq6+qqKy1srK1rrGrrqa3s7OxpaGotbCvrayrtbqyu7q6tLK3ur67ubG4sLmtqLK4u66ttLS3tbu2trm5vLe0r7G0t7a5s7e1pq2pq6ior6yprq2up6KxtLG0q6aop6Cjq66oqq6orLKwr6+pqKGeoaGjpqOgopqlo56ol3J3bmdiVUtUT09KQ1BLX2JYWlFcU19NSFJJQUA5Ojg2Njc3NTg5NDs5Ozk8Nzs+Ojg8PD0/QkBBPTs2OTk5Oj87NjM3OD5GQkJAQjk+PUBDPkBGQj44R5OWkZWTkpSQkZ+ZnZmVkI+Sko6Mk5aWko6RlZGSkIaBeXJzdXuBhI6HhZGTkpicnJiVkJWYo5yaoaeqqZ+clpeVnaKioZyZnpmlqKyvramnqqmop6GlqKirqamvoZufoaOjoJqfoJyUjZiUmKCgoaSem5qkp6Spq66spaOoq6+xtK6qrK6zr6ystLO0ua6urayqrLKwsK2wqKqmsrS0uK6qtrqwr6qurLC3s7i0t7W0u7y4tbWxtauyrKiys7uvrbGytLa1sbG0s7OvrKuvs7a0sayutKqqpqWnrauoqKupqqifqbOwqqeppaOio7CtqaatpairrayppaSioKWipaOYmZyVnqKippdudWVnZFZPWEtLSktTVHBiWWRXX1tcUlpQTEM8ODk6Njk4NzQ3NzQ4Ojw6PDg6PTk3PDw7PkM/QT47OTo5Ojs+PTg0NThBREVEQkM5PjtAPkI/R0Q+N0KSm5SVlZaVj46Wl5qZlZGKk5SSjo+SkYqKiY2Ul5qTjYmCho6VkZSfmpuin5+jnqGhn5ijpKelpaapqa2rqaKmpKilpKGfnqOjra2srairrq6qqqukoaKlqaenqaijopybm6SgpaijoJidmZ+hoqmnoKKirqyrqqetrqilpKmpqammo6iqqaekp66wr7Ovq7Crqq+yr7Czua+rqLCxrrCyubO0r62vtbCss7GurLW1tLSzs7CvrKyqrKusr7G0s7CwrrCwsKyqrauqq6alrrCysKumqbCvqaOkqaunqKaopquwq6mvqaaoqaalo6iwraqpqKKpo6WnpKGhoKKloZ2el5aYlJugpKmUbnNeamlfVVpOUk5QT1JkXGVjW11ZXFBZT0tAPDs5Ojc6ODczNTMzODo9OTo4OTo5Oj08PEBEPkA9OTo8PDw+Oz45NTo8QkFFQUNBOT47P0BEQENCQDdAkZ6YlJeZlpGHi5SSl5GIg4mLk4+OkI2Hh4SFlZmWmJeZlpqeop2anKKkoaCdn5qfoKGgpqGgoKCjo6KlqKmrramqpqOmpaCloKaopqWnqKapqKOnppmcpKaioaChoaCcmJmfoKGkpKKenpagm5qioqChn6CiqKCcn6GloaCmo6KfpKGspp6foaGkrKqnrKivq6e0sa6ur7WyrKqwq6mtrbWwrq6srreup6yqpKivsq+sq7Kvqqqpq6utqa6urrGxraqtqaunp6uoqauinaapqKilqKisqKilpKWop6iopqmsr6+oq6mhoqKlo6Opq6ymqKWjqKKhoKSdnZ+hoZ2bnZ+amZWcnKOqlG9zZm5yZF1dUFVPV09eZGRsaGJiWlpSVE9NQTo9Ojo4Ozk1MTYzMjg4Ozk5OTk7OTk8Oz0/Qz5APTk7Ojs8QD0+PDk5PEFBRUFGQTo9Oz9BQUJBRUI4PYqWlJOYmpaPiISNjpGSjIiIiI+JiZCRjoqKiJubmZygpaKlnqKjoZqeoZyanZ6bnKOop6ugoKOYoJ2XnKGjo6WjoqKkrKilqaCepqmnq6mkn6Kgoqahpq2mpp2fn5+fn5manJyhoKGkn6GbnZqcoJ6hn56eoKOZlpqYo6KipJ+ZnKGhoqCbmp6goaSgnaejqrGorqusqaSqqquorKalrKqws6+rq6mwq6appaWoq6ynpqevq6Wnq6upq6irqqqrrailqKOmpaesqayoopykoaOmo6qpqKano6SnqKanqKepqKupoaKoo5yepqWjqKino6WlpqmgpJ6inpeYnZ+doqKlnpiUlZ6go5d1d2t2d2FfXFVZUVVWW2Necl9oX2NTUVlUSD48PTg7OTo4NTM3MzM0Nzo4OT05Ozo5PDxBQEM9PT44Ozw9PEA/Qz86ODo+P0NAREE6Oz48QD9DQ0VDOTyCmJmenZ2alZKKiZGRl5GQh4SJgoGNj4+Sj42cnZ+hpKmlqaeorK2moqKfmKSmo6Stsa6yp6asm56em5qjp6Cfo5+foq+rqqyoqKuwqaipqKGfoKeprbCyr6yjoqahqaWepKOipqClpKKlo56doJ6fpaKinp+imJWemp6fpKGblZigoZ2enJudnZuZmZWen6Oonp2iqKGaoaOmoqSoqaqoq7CxqKWlp6eopKWpqaqnoqWmqKadnqWloqClpaOlpqCjpaOjpaelqamqpKekpqKmp6SrqaenpKGlqKynpqWlo6OopJWdo5+bnaCjqaeopqGjo6mooKiioJyVkZqfoKGmopuXkpCamqCVfHdvfXlmW1tgX1pcVlxoZG9jbmloYl5QUEA/Ozo4OTg8OzYzNDMzMzc5OTs8OTs7OT49QkBAPTs9ODw9QD08PENBPjo4PT9EP0M+Ojk/PEI/P0FEQjk6gJ6kp6Kem5+gmY+ZnaCWloqGj4iEi4qTl5SRo6Wnqq6trLOys7S4t66pqqevtLKxqq6usbKusa2lq7OssbGpq6+rq6y2sLSwq7GysaOfoqqpp663trS0trOvrKuuq7awqbKxra6npp6io6ObnZyXoqiloZ+eo5ueoZqWnaScm5aZoqefoJ+joJuUlpmWl5qfoJmVnqKZmJ2dpZ2gpKeqqaiqraylqaSlqqeqqaqsp6SkpKOimZmhnpqaoaCfpaWYnqSmpKqooqelpaGqp6mnp6ejqKWmpaGkqKesoqekoaalpaOVl52Ym5mVo6elpaSfnZ2lo6Kqo5+amZiXnJyaoaGakJOTl5ibjX93cnZ4aWJbX15cYllgZG5ta25hX2RgUE9BQDs7OTs4Ojk2MTQzNjQ3Nzc6PTo8Ozk9PUI/Pj89PDo/OTo7PD5BRUA9OTtAQT5DPDs5PzlAQEBAQkM7OXuao6OcoJ2dop2Zn6KioJibmJaYkpSQm5qWl7S0rrW4s7S4tre0uLm3tbm4ub28uKqLnLK4vLS9urW7uru4s7q/uLe5u7G3r6iusq2inJ+qsri8vL27ur+0r7GztbS3t6+1tLWysKikop+gl5Wal6SqpqahpKOkq6WlmKGko52goaKooaOgpaGck5mYmJmco56cmpudl5uZlqWam5+hqKmpqKuvr66pqKmrrKytq6irp6WjoJyfo6Ojn6Cipammmpyip6Spn6GjoqKgpaanpqSooJ+ipKGjoqiop6OloKGopqalo5mbmJuTj6GknqKfmJiVoJuhpaCfm5udnJuamZugmo2YmZiTkYaAdnh5eGNbUllUX19hbGh1a3BnaWliWVNMQDw6Ozg5Nzk3NTU2Mjg1Njc3Ojw7Ozs7QD4/QD0+Pjk6PDk2Nz47QkZCPDg7P0NDRDw+OT43PkFCP0ZDOzhwkpqblJ6bm52Vl52doqajopaXnpaXl6GblJi+t7G4uba3t7i7l5S2vbu9vcDFtaK7mKC3v7+6wcm0nbu2sra/xcGooLazurGqrrSxsLG0tba8vb68vL3Guri3ur20r7Wxsbq4t7Kzsqqmpp+YpKSnqKSupKurtbWus6CnqqynqqmlpqCnoKGmoZOWmJ2foqSjnZ6coaChnZekmpmdoKaqqqqtrq2tsLGrrK2sqamrrqimpaalpqSkpqaeo6eppKGcoKKjpqCio5+jpJ2foqWgpJyboZ6fo6GhpaSlqaOkpaKkp6ehn52elpOcoJiZko+MjJeWn5uWnJqdnJqTlpSUmJOQmp2YiouHgIB8gnhhXllTYWhgZnNvc2l0ZGlkYltMSz46ODg5ODg5NzM0NTI1NDY2OTw8Oz08P0E/QEA9Pj44OTs4Njc/OUJFQzw7PD5DREM9QDs9Nz1DQ0BFQjw3Z4yRk4qalZiblZWYm6Knq6aVl5iQlZmhnpeXvrWztLu6ubi5woeYt6u4u8DCxbOjw6e4s72/tMTHvbS7uL62wMTErqCworW2tb2+wcPGw8O5vb/AwL2/xL28ur2+tKeqmLHAvbi1ucCzr6+qqqitp6ekr6eqtLyxtLWor7Gwr6yqoqajrJ+fpquXmqifpaWfoJydoKuwsKyiq5yYm6Cor7Kys6uorre1sq2tqaalqKulpaStqaShn6Cnnp6mqKmmnp+anqGlpqmcnaObl6KmmpuanZ+cmqGcmZ2eoKijn6GfnaWioKOioZSZmpmTj4qLhI2Qk5uPjpiVm5eYkJORkomNl5iYk4uKi32AgIVwYGFeXmpiYm53dXZubFtiUVVcTUc7PDk3OTc5Ojc0NDQxNDM3Njg8Ozs8PEBAPUA/Pj8+Ojo5Ojc6Pz5FRUU8PT1AQkJCQUI7PDhAQ0NARD87NV+MjIaFlouUlZeYl5ifpqellpWWkZebn5ual7mxtrO5vLy5urWqsryxvsG0vMe5uLuuv6fGw7/KxsnIxcXJvMLHx7+xsae8vL7FxMbJx8XGu8TAxcbAua+9vMC+vrOrqoyzu760tbfCuq2vsLWqq6aqo62kp7G2q7WyrbOtqK6vp6awr7Ktqq+zpKu1qaeopKCgnqmyuL61tbWqqaausre4t7apq7i8ubexr66noqOop6SfqKOfnqCZoZydoqSnp6GelJuaoKGlnqChnpajnZSQlpiboZqflpORlpSin5qenJudoZ6kn56VnJiPkpOPjImTkJefiZCWkZuUmJGRlZaDjJWXlpKLjIh8f4N/amZoYWtsZm51cXJ1cWZeX1xSSUU/Ojo6Nzg0ODw3NjU0MjMzNjU3PDo7PDs9QD4/QD48PTk5OTs6PDw+QkRFPj49QENDQkREOzo4QUJCQUNAOTJbk4iEjZGKi5GRlZCSmp2fnJOSmJSdnZqXmpW2sbm1tb6+tri1uLO8vMTEusPHwb+0s8XFxr/CzcfLzszLx8HDxsfIysXExcO7vLzBxcHFxb/DwsbFwLGTvrq/w8K2trqptLO0qauzu7uxn5uxr6ykrK60p6qpqKqtrKmlpZ6pr6uyu7q4u7e5t7O5uLOurLO0qrC1ub3Bur6+vL60urm4u7qysbS8u7q7s7Oyp6Smq6uioaCdmpudmpyXmpuenJygnZaclpuZnZ6io52UnJCNiY6OkZ6bnJWNh5KLmJiWmpybmJybnp6cmp6UjpiYmpSRmZeeoZWYmpKXlJWRlJqYk4+TnZaSi5F+enx/dGtrbmRvbGhxeG95aWlhXGdhUUZEQTw5OTc2NDQ6ODQ2NTMzMjY1Nj05OTs7PT47Pj49Oz05OTs7Oz89QUNBQkJAPEBDQ0NFQjs4OUQ/P0BCPzsyV5uQkZCQh4WSjo2IjZCTlZGPjZSUm5STlpqRs7e4uLi+u7C1sri2tbbAw8G+w8LAvru+u7u8xMzEzNDLxsa/xcfLyNTLysjGv7u7vsS+xcjGxsTEw7i0wLe0vMHCucK3t7/Au66lrre8t62co7ewpq20tayupaWjqKSgoKWZqrOyvsG+urm6uLW0srG0tLO6wL7Av769u7u9vsDCt7a3tru7sru+ubi3u7a3tKyoqamrpqijnpOampyYkZKZl5GRmJqXnpiWk5acm5+elJOJiX6GiIuWlJiZkYmVkZeWlZmbmpaYl5idnpyhmJWZmZyYl5ybn56jnJ6WmJeTl5yZmZyUlp2UlpOJdnl6e3Zua2lndVpmcndzeGZnXWRbUlhJRj87Nzg4NzYxNjk3NDQzMzM2NDY7ODo8Oz08OD0+PDo7PDs9Ozs+PkRBQUNCQEBBQkNDREM9OTlCQD8/QD89MkyWmpaSk4yKmJCKi4yOkpKKiIaNkJiKj5CUl7O7tba/vb2xtrjBvby0uL/Bsbi3vsHFvbu8wsbJv8nOyMHEwcfKysbKxczIzcbIxb/DwMvNz8nGw8PEwsS+uL7Bw8DEvsHPz87Gq6+2tLWroKe0s66ruLWzq6mjoq2prKatn6y1tL/Cvrm4vbawrausr7W0ur7Fv7u8urO5u7i5ubWtsLS9u7G/vLiytrmzubu0ra2orKyqqaeXnpualY2MmJSTi5WWlJyZl5WWmZKYn5mQiop+iYqKkY6Vl5OUn5mWkJSZmJmWmJOUm6GeoZiYmp2ZmZaenpibopqdnJuYmpuZlpeXlpyZlJyYfoB4eXV1ZWVpamhdam9teHdjYmBgXlhXRkU4Ojg6OTc5NDQ5NzY2NTEyMzM0Ozo9Pzs9PTo6PTs8Pjo7Pz48QkBDQkJFQj0/Q0NDQ0RFQDk6QkFBQj5CQTVCkJeUlZmSj5qQjpKRjZSVi4qHjI2UiImPkpq2u7S8xsHEwr3BxcLAtLO9v6ywr7rDysPCvs3IxbfByMW/wcLIy8rCwsTJzM3Pz8zDx8bIyMjHycfFycfIx7/Fx8TEx8jK0s/SzLy4trS4uMG+vrq9ury6vKytp6q7urm3wLK1uLLAxrq3t8Gzsa2tqau1s7u2w7a2vbWxt762s7e4sLW2v7uwvbq0q7CxsbO8urOzrqutq62xnaOjoJqQjpiXlZCclpaYlpWSnJmTm5+clpGUjpWQiYyQlZOUm56YmZKSnJedlJmSk5aZmJ2VnJ6do5yVnZ+TnKKcnKCfnaOemJSVl5ebmpmgkH99cXRxb2JhZ3VnaWl0bXhsXWRbVWBZTEhDNjw5OTg4OjUzOjY2NDQxMzUyNTs6PD47Ozw9PDs8PTw7PD49P0E/RUFCQ0M+QEFARUVERUE7Nz5DQkI+Q0I4O4+akZaalJKUjZCUlI6VlI6Pi4yJk4uIkJObt8C6xsXEw8zCwcS9vrWvt7uvr7O6wMfFxMHMy8W2ucDCwsTHytHLwsPExsnFzdDOx8zJwsHGwcvLx8bMyc3FxsbDxsXJzdDNz8zHxMDDwsnNx8XBxMfBu760sbCwwb6/wca/vri3w8K6urbAvrWyrKmvsri+tMC0tLi0t7nEua+8vrm+v8K/tbq2q6qsrq+wt768trSura2utaSlqKimmpycnZyeopydmZOQkp2VmKCdmJiVmZmZl46MlH2QkJefmZmYk5GToI6Nko+VjpCUlaKdnKSem56elpyjoKGipKOkop6amZubnJ2enIN9cnx4cGdgamp2bGlldG5zYlxiVFdUU01HOjc7OTk3Nzo3NDg3ODQ1MjM0MjU7Ojk+Oj08Pz04Oz05OTk9PEBBQEVCQUJBQT9AP0RFREVAPDo+QkNCQENBOjSAoZeUmZiVkImUk5aTiZGMlJGOiJaKi5CXnMXLw8O8wMPHwbm9vbu4tre3rrK3uLzAwsDCx8bHurzAwsXHyMbSycHDxL+/vsTLyMrLyLy7yMfJzcjDyMnJxsXDwsHCx8fJysfMyMfIzcbLz8W3wMDAwLu6vbWzs7+/ub/DucC3u8G8uri7ub27srCvsKy5wri9ube1t7q9xb24xsjCwcLGwr28tamurrCwr7O6t7m2sK+tr7OppquprqannqSlo6OjoqCblZiekZecl5GRlZeZlZmRlJiSlYyYo5qcnp2FiZ+TfJKWlZKUlJennaCipJ+en56foaGkoqKjoaOinJ2fnqOhppl5enl/cm9mZWdkamRham1ubl5YXFZVTlBKRjk5Ozk3Njc3NjM3ODk1NjEzNTI3PDs8QDs/PDw6ODo8OTk4Pj1APz9GP0JBQz89QT5ARENDQTw5PENBQ0RBQDozbKKdlZedlo+PmJiZmIiSjZGVkI+Vjo6TlpbKy7u5urnBu7q3vsG8vLu5sa61uri4u8S6vsC+vru8wMXCxsK+xsG5u8O6uLm8vsHGwca6ucnJw8XEwMTBwsHEwcO+vcLAwMHCy8PGzMvFyNHCsL69uLq7vL63tLC5vrO8vrG5tbi7tryztbm2uba5t7GtusG6vMG/t77Ev8bDw8fHwrvAwr/Cv7iys7O1tLGut7S3tbSxrK2xp6Wlp7CtqJ+nq6ajqKWmpqCgn5SYmZSRkZWUl5OYl5qhnZ6hnKGdoaWglpSbkZeXmJqTnpmZqaSlpKWdoqCanqCkoqOcoqGjoJ6cnp6ppaiVfXuDeG5mYWRiYWJjY2piZmNaWVlcWVFORT07OTo7Nzc5OTY0OTk6NTMxNDUyNzo7OkA9Pzw8OTc3Ozo5Ojw+QD8+RDxCQURAPz49QkRCQkI+OjlCP0FCPT44NVmfnJiTmZaRlZiYmpeQkZCQk5GTlJKSkpSUxce4tbq5wrm5vMPFwri7ubGxtry6tbnAu7u5tre0tLW/u72/ub26urS/uLW4s6+7vLfAt73Cv8G7v8G8u8W+u8HEwL6+ubzBwcu+vcnEwMDKwLHBv7u4u766tbezuLy0vbi1tLCzvLG3tri/tr25vb65t7q+u7/Axb29y8PGw8TAw762ubq2v7i7v7y4trOyq7CwsrWzs66sq6emnqeurauiqKumpqqjp6iqo5+Ym52bmpicnJiXnJuhpZ2anqGhoKGmoJqbnJiboJ+dnJ+coKiho6SknaKfmqKgop+el6Shop+dmpieqKWhi3x5h31xY2BiYmdqZmZpZWldVlVTWU9TS0U4PzY7Ojc3OTs2NTo7PDYzMTM0MTc7OTg/PT47PDs3Njk5ODo7PUA/PkA9PT9CPjxAQUNDQT9DPTk2PEBBQDw9ODdJlJibj5OUkZWYlZGWkpWRkJGUlZSTkpKYlcHCwLq8ub62uL7EwMKxvbqytLO4vLW3vMC8vbS0sbC1t7W6wbi+uL+8vbe1t7CuuLa5v7vAv7fBvLvDtrrIuLa5u725ura7xcXKvbnFwL+8wb64xr3BwLzFuLa3tLi2tru7uLa0t7q1tLi8vbm/ucPAwLu5vLu+vcjEvcfEw7rAvb62sra4srm0usLCureysaysq62yr7Kur6ijpJ6rrKyqpKakpKiqoqemraihoaGmn6Oiop6bnKKfoKOdnJuhn6KgpKCem5eZn6GdnZ6eoaWkoaKioZ6ho5yinqCZnZijn52eoJqZoKKmnYR6g4B4cG1lZWZvaWVrZ1hYTktLS1JJTEhDOT44PTs2Ojs5Njc8ODk4NjA0MzE3OTk7Pz0+Ojw6ODg5PDg6Ozs7PD1BPj09Q0E8P0NDREA/Pzw5Nz5CREE/QDg4P4mYmoyMkI+Tl5WMkpCakpGXmJaUlJKQmpTDvsbBwby8uLi6v7a8scK2tLyxtLa4s7q9v728sq2vrLGwt7y2u7zAxLm3t7e1urm6u8C9w8C6xMK+x7i5uK23tbi6tLezu8XGy8G7xsDAv728v8nDxMW+xri1srK9uLi4vrq6uby6urS3u7q5v7zEwL+5uri/ubvFxr3Fw8Kyur27sa+2uLO3s7q+wLm2rLGrrqmqqa2qqq6mpKWnrq2ppaOio6GkpaWmoqato6Klo5+ho6Gcmpyhn6CloaCenZygnaWgnpeVmZ2fn52gn6KmpaCknpybn6Ofn5mcmZ2epJyWnKOcnqGcppZ+f4Z8a25wZ3Brc2VibV9cVEhLSkRKQkNHPzk7OD08Nzs7OTc4Ozc8PDYyNzUxNjk8PD08QTs8Ojs6OT45Ojs9PUA+RD89PkRAPz9BRkQ/Pzw9OTc/QUNCQEI5Ojl3nJiLh4uQkpOWjY+TmpOQnZiSkY6QjpiSvbfHvsO+vbu+vL22uri9ure9s7OwuLi1uby8wLeqraSusLe7s72/u8S3tri2t7+/xLzCxcXHx8rJxs/CwbiutbW8vri7sr7ExMrFwcnDwr+/vr3HzMfHxMe9tbW2wb26u7/CusDCv7y2t729vcHBwL+8ube8wru3v8W7wr++tbe8vK+vt7awtLO6ubq7r6mtq62rrKaqoqeuqKWqra2vp6Sgn6ajnqKjqKOjq6Oiop6dm5ublJaZnJyfpZ6fnpmYnpejoJyXmZqZmqOjop6jo6egpqCbnaCjnp2WoJmcoKCblJegn6WcmKKQgYaBcWVsaW50bndjZ2JcY1FLVEhFRUNHQzw7OTg9Ojc6PTo4OTs3PD01MzY1MDY4OTo8O0A9PDo+PDk+OTk9Pjs/PkM8Pz5APz0/P0ZEQEE/Pjo3P0BDQz9BPTo4ZqGYj4uNlZKVlY6PlpmVl5uVjoyMjY+bk7m2wbS/vLm8w8C+wLq1trKywLmvsry8sLe7tru8q6qjsLm9vrO8vrzFuLK4ub3HycrDx8jGxsnIzM7RzMrEtbrAw8i/v7W/wL/Gxr/LxsO/wbzAw8zKx8XGwbm9vMS/wL/CyL3Hx8XFvLrEv7vBv7rAvLu7wMS9t7nCub69t7S2uLqur7WxsLCytre0t6yurKqsrKuoq6Gms6qlra+trKippaOkp5+io6Onoaeiop6cnZyamYyQlpeZnaKZnpuVkp2UoaCdmZ6fmJimpqKfoqKmoqeloqCko6GbnaCbnKKfl5WVnp6kmpafiYGDgXRvbGx0a2xuX2JeYWFOSE0/RUA/REM7Ozo6Ozo4Ozw6OTw+OTo+NDQ1NTE5OTo5PDtAPD89PTw4PDs6PDs7Pz5DPkI+QD89Pz9FRUJBQj87Nj9CRUQ9QUE6OlmfmJOSlZqVmpOQlpeclZuZlpSVkZKTnZm2uLaxuru6vsG5uca7trWypb69tLbBv66zvbS4wbGwsbS8w7y6ur68xL+3vb+9x8zGx8nGxr/ExMrIzMzNysbCw8vOwry5vbq5wMO/yMbEwcG/xcDKycPDw8O5w769ub+8wsbCyc7Hxr66xr26v7m3wLm5vsDCvrW0vLi2u7CvsrK1r7Cvrqyus7CzsrirsbKxqrCrq6yrrLatqKyusqarrKmpoaWgpaakrKSmoaChnqGgnaCMlJeTm5+mmZ6emZOYnZ+gnp2eopuYp62ooqSgoKKqpqmhqKGlm6CgnZ2jn5SYmKKdp6Gfm4J7eod6bW13e19wY1tdX15TST5DRUlCQz5DOz42OTo7Ozs7Ozs7PT05PTU2NjIxODo5Ozs6QTs/PDw+Nzs8Ozw9PTw9Pz5BQUE+PkFCQUVDQkRAPDY+Q0RFPkJEPztTmZuZmJ6dmqCalpyZn5KdlZ2boJWWlJqYur20sLu8wcTCv8XGura5sqO7vbS3xLuwtbq2ucS4tLy2ur3BvLu/tr/Bv7y/usDLwsfIwL+8vL/FwsfLyMHDwMDJysLAu7uwtLu9wMXGxcW/wMK/y8fCwMjAusK7urO6usG+wMrOysS9tby8ub+5ubW1s7/Avre0s7S4rbeqr7CwsrKvq6+nr7ausrG5rra2uLSzsLGttrS6sa6srranrLKsraSjoaenqLKrqqWkp6elpaCml5ujn6SmraKeo6KanaWiop+foaWenrC0sKSlnp+kqaevp6mgq6CiopqipJ2anqGmp6+psZWCe32Cem1zeHNncF1bXlxZUUVEQ01JQUU9Rzo6NTk7Ojw8Ojs7Oz0/Oj01NDUxMjc4ODs8O0I8Pz46OzY6PTo7Pj0/QD87QUFBPj4/QkBBQkJFPjo1OkFCST9AQkA7TJqdnZ6fnZienZmampySoJWbnp+blZGRlsW+urbDvMbCvr/Ixbe1uLe2ubu0r7e2srWzt7m8u7a7u726w7u3vbe5wLu6uLi1xcHCw7u5s7S6wb2/xsC5wLy+xcS9vrmysK64t7/Dx8PEvb2/v8PDvr/HvLy/tLSutbW8vr/OzcvCt7K4uLi9ubuxtrLIwLu2tLGwt6yzqbCtrbO3r6uuqrG1r7Gvt7O6usC/tre2sru6wLWyrbO3rLC6r7KloqWrrK+5s7KosK+xr6qiqKGkraitrLOun6inpqWmq6Sknqaqo6ayuLOrpZyfp6anrquqpbClpaWbpKOYn6exrLW4sLKOhHl/fHZsdXpwbmlcX2BZU1BBRUhHS0BEQ0g8PTY7OTk8Ozo6Ozo9Pzw9NTU2MTM2OTg8QT5AOz1AOzs5PD04Oj08QD46Oj49Pj09PkBCQkJBRD03NDU9REc9Q0I/PEWUnqCgoJyXmpiYlZmdmZ2fmp2bnJaRj5LDwMK9wrzEvLy7xbu3s7e2tru7s6CWtayvsbS0tLa4ucHAt725uLm2tb+ztLK4sbvBwMO3t62wtbi4uMK6tLu3u77Au7u8rq+us7K5wcLEw768v7u6uLbBwrW/urWur62wvcC5z8rJw7GvtbS0vbq+ubq7ysO7uravsL2xuK+ys7C3vbaur66wt7CsrLK2vbzEwrq9t7bAv8G3tbC2srGzurGxr6esr6u2v7e1qbqztbmxp6uop7ausrG1uaisrK+qr7CqqKessayytr20saykqKuoqKusq6i2qaaonqadmKOuvLG7wbSmiYF8gnpzdnZ3bnFgX2VcWlVKPD8/RkY9RkNDOTo1Ozk5Pjw8Ojo8Pj4+Pjg4MzE1Nzg5Pj9BPzs6Pz08Oz09OTs8Ojs6Nzs+PT1DQT8/QUJEQkE8ODU4PUNGPUREPzw/iZ2en52Xl5WUk5aZnpubmpuYlJ2Uio6Owb7Dwr6+vrm2usCxtbGzt7fCtbOrrbOoqa61r620trnDv7e6t7a2srTAtrK0uLO6wMHDubezsrK0sri+ubO1sry5vLa6vrK0tLSwuL7DxsTAvb+5s6+yvLquu7Szpquorbq+uMvCv76sq7Cvs7q3ub67wMXBu7y3sLXEtb+0uLu0u8PCs7a2sbisqaWrsr23v7+7u7exvL28trGvq6uprbOvsLCrsLSpuMC2sqm0tbC3tq2spqu7s660uMKwsbG1sbK1saywsri4ubi+tLGzrqyxramvrqqyuK6trainoZ6ptr+4ur+wlol9gHxxdHd0dnJsXmJgW11PSEE+PUhDRk1DQDc3NTs6OT48PDk4PT47PT86ODMyNTc2OD8/Qj86OD4+PTw5PDk7Ozo8Ozs6PEA+QkI9QEE/QkI/PDs3OjxBRD5CQz8+QYqgm6GdlJiVlZKYmpyWm5WalY2bj4SIhru0vb+7vLm3s7y8rLOytLS2wLXAr7Kzqqqxt62pubO3wL27vLi2uraxwLq3ubi5u8HBxMO7u7a0tLC2urW0sqy8ubi1uMG6uLOxrLe8wcfDv7m6ta6lrLOwprCtqJ6gn6WttrXCt7a0pairqLC2s7K6tbu7u7W4trC1xLK+vL+8ubrFybq9vraxp6SeoamxrrW5trKxq7S3trGopp6gmaWmpKynq6y2qa+6sa2kpq2lq7GrrKmtuLawsrjBtrGxtbGvu7ayt7W1sry1urKwsbKutLKqrq2nuLWyta2uqqiosrq9wLa0qY6Ce393b3tvdXJuY1xmWFxdUk5NQT5JQkBKSUA2NjU7Nzg+Ojs4Nz4+PDs/OjkzMjc1NzU8PD48PDg+Pjw8OTk5Ozs7Pjs7OTw+P0E9PEJAPz9CQD47Njc6QERBQ0E/QUKJoJ2loJSWmJiVnqCcl5uYmZGMmYmDhoS1r7S7u7S1sLG2uq6wtLOvtbq1urC1s7GttrqurLyyuLm3u7+9ub7AtL+7vLq4vsK8wsrIvsC4uLaytLaytK+tu7q4trnAw7aurqqytry9ubaysa2tn6Snp52jpp2WmZman6muuayrq5+lqKSrrq6nr6yvsbGtsa6usLmwtLy+uLm4x8W8vLu4qaKcmJufp6assq6zqaapqq6popqXl5GcmpijnqKir6ekrKaompqemqGnp6anqa+2squ0tq+qsK+xqbm2sbWxrqy3s7avrquuq7S1ra+rq7GtsbKoraurs7W3ur2wq6GLeoJ5cnZzbXVpa11balRdXE9NSERGTEJGTUY4NjY1OjU6Pjg7OTc8PTo7PTo5MjM2Nzc3Pjs9Pjo6Pz48PDw6Ojs5Oz47PTk8Pj1CPDtAP0A/QT8+OjU1OkBFQkRBQEJBiJ+ipqGYm56dmqWpmJudmpmUjJmHhoeGrq2uuLmxsqiur7iyq7CwqrK1ubm9tbK4tLm6tbm7tbWztbu8wLu+wLS/ubm6sbrDvMLKxb+7vr+5tLSzsLGtsLm4try4u7+ysrKusa65r6qrrayjqKGdnZ6XmKGVkpWXkJifqK6ko6Sgoqeio6mpoaanpaqtp6ynqKesq6yyu7SztLm6trK2ramgmpaWm52fq6yrr6Ojo6GpoJuTjo+Qk5KSmZaanaSloJ+ep5iVkpSYnqSjoaWqrK2iqaqppKmtrqW0sa6xraqprq+wraWmqqSos66trKmmpqmrpqqnq7Ksr7Oxq6mWgX+Bd3J4aHRzbmRUYGNXXFFOTEhASFFETUM9ODg3NTo3PD46Ozw4OTw7Ozw7ODI0ODk3ODs7PDs4PD0+Oz08Ojk8Ojs9PDw7OkA9PDw7Pz5CQEE/Pjk1ODs8RkJDRD9BQYijpqKjnqCfp6Coqpufm5yZmI6Xi42PjKqpqLGvsK2lp6ayr6mmq6CvsLu1vby4wMG+vLy8ua6sr7Kyurq3t7W1vLOvtKu2urjAxMG6u7+9t7Kts7CvrK62trK0ta+qpJ6bnJyeqKieoKipn6GnlpuXl4+dk4+Qlo6Xm6SooKCioqKlpZ2jo6CepaCkrKSmqKSio6OrrLOuqa6urqeqraisoZyamJmYm6moqquepaObo5yVkIyPj5CTkJeVlpifnp6amaaXk4+Slp2ioKWjpqSnoKKko6Ghq6uksq2qrKyno6yuraufoaKkpK+srKmmo6KqpKqqpKmrpqmsq6agiHiDfHZ/eWJ3bG5cUWhUUE5HT01MQk9RQD47PjQ5OjU7OT07Ojk9OTk8Ozw8OzkzNjk5Njo7Pz06ODs6Pjw6PDs5Oz07PDw9PjxAPT88ODs/QEE/Pz45NDk8N0FDQkQ9QEOOqqSjoqGinaulpqimoZ6dmZ2PmJWTkJWnpKGmqKmlpKChp6uhnKKbp6u1sry9wMLCwL7AuLSnpayqqLWysbCur7KnprCkr661wbq1udXHtbO0q7K0rqqrr7Cys66lnpKYlI+YoJ+ioJykpZ+eqJSblpeMl5GNkJeTmJ2iqp+fn6Cjpaicn6ChnKKfo6innKehoKSfrKisrKCpq6agpKimrKOdnp2Zl5qrpqmxo6WonqCclZOQj5GQmJCWlZiWn5ibmZujmZeUlpqdoJ2nqKWgo6Kho56doKmqpa6upqipoaKqrqqnoaCio6msq6eppqShqaKlqaalpKKmpKijkn18gHV1fW1re2RoVVFjTUlIR05STkpORztFQD0yPzc1OTs+Ozk5Ozg6PDs7Ozk5NDg7ODc7Oz48Ojk8Oj07Ozw9OTw8PD49PUE+QEJAPTc6P0FCQEA/ODU1PDpAQ0FEPkFGlq6koqWeo6KpqKipqqWmnp2imJiZmZWbop6bnqOioKOgoZqgmJiXlqGorK62t7q5ure3u66ooKGpoaCtq6qmqaSppKWupaystLy3rLnZs7utta+vs7Wqp62so5yZlI6RlpeZmZygoqKcnaWemqSXl5eWkJKRkZOal5ugpKqeoaGepqeqop+gp5+dn6SnqZ6jpp+qnaqtqq6nqLClo6Smp6ymoaShm5ier6iusqulqqqgmpiYmJWTlpqTlZWZlpuXl5ignpycl5uhmp6ao6eln6GioqOdm6Gmp6aoraOppZ6kp6mkpaWhpaSsrKmmq6eioKSjpKenoaCgpaKmoIl7gH12eHxkeHlgYlJVX0hJSUtTVElSUEw5P0I2Nz02NTs6PDw5Ozs4Ojw9Ojs4NjU3OjY5Pj0+PDk5PTk9PTw+PTs7PDo+PTw/Pz9APT03Oj5AQEA/Pzg2NT08PkFCRkBAR6CupKaroaOqrK6tp6ypqKCipp6bm56aoJyalZmfn5uen56WlJOXk5OcnqSorq2sq6uvqq+pnpeepZ2epaakoaKfpqCir6usrbWyt6a11JnBt7KxsbC4raehnJ2alJeampCOkZWRjI6OlJminJejmZqXmJmUmZiWnZufpaapoKajnqeurqumorGjmqSmpqqioaqiqaSosquxsqu5qKarp6urqaysp6Cgo7GusrC0qbGvopmcnZ6hmZubmpiZm5SWm5aYnKWhoJqjoZqdmZ+kop6gn6KmnZulpqWkpaijp6OepqOinqaloqWlqKykpq2noJ2dn56gpaGenqWgppmBe4F8dXZzaIJsZVtTWllNUUpOTlVMUkxBNz5CNjg9NzY6PDw9Ojw5ODo7PDo7OTc2Oj01OTw7QD03ODs3PTs9PT06Ozw4Pj09QD5BPj4+ODg8P0BAPT43NTg9Pj1BQEZAQUihqqCrq6GkqquwramtqaelpaWkoKGfnqWXl5SYmZ6YnJ2blo+VmZKSnJihnaqip6Cep6Gln5ySnKKbn6Gjn52gn6Kgoq+vrLCxqqiqssmWpsiwrq2ssKegn6Kgl5GUm6CcmZeSk5+coaSbnpuWn5qfl5uinqWhnqSfpKitraisqKSstLe2sKe0rKKtraOvpaSmoamorrWzsr23vrCssa6tqaq0sbCoq6iytbezuKyxtKSgnaWfrKGhoqCgmpiWlqCbm5ikoaCepKGfnpqcpaCfnZyhqJ+fp6meoaOkoKagnqehn5ymo5+ipaOooKmrpZ+dnZudmqainpyjnqeQgYJ/fHh1aXd1XWxaUmBIUVVIRlVWSkJMRz1LSDhFPDY3Oz49PDo8OTg6Ojs6PDk2Njo8Nzs+PT8+OTc9OT47PEA8OkA6OkA/O0A+QUA9PDk3Oj5APzo+NzU4PT0/QUBEQEJGnKueqamipamprqimqqWmp6aoqqGlpKOmkpOVmJacmpqcmpWTmZuNk56ZqJ2unqeenKGenpqakpmenKGioKCdoaSunZ+prKOel4V7jJGxlIi1r6iqrKqloJ6ZkpKTmJiWlpWMiIuOlZ2dnZ2elp6apqCgqKWxqqeuo6uttrC0srGutri9wLqttbSwt7CutKmmpKWsqbmztbvDvMPBtrq2q6+xube8r7OwtcG8t72zs7WirKKpqLKpq6inqJqZnpqqp5+ZpqCfn6eopaSenaqhop6bn6igpKetmZ+jnp6nnqCmnpycoqGbo6KhnZympaWkn6KZnJukn6CboJyjiYWEfnZxbWl2bWhtXFhbQlZNSkdNR0JGTTw+TD00PDk2Oj0/PDs6Ojg4PDk6Ozs8NTQ6PDg5Pj4/Pjg4Pzk8Oz0/Oz1BPTo/PjxAPj8+Pz08Njs/QT07Pzg1ODw8QERCREFCQ5WqoKapo6mqqKmjoamgpqinrK6lqaWpqpSSl5mUmpqanJiYmZyamJqqoLGit6Owpp+enZ2XmJWZnpuco5+fnaOmzqObpaCJdoNzYmhrfYeDobOurqmrp6CenqGinZ+dmpyclJOVlJ6emJSFnZqhm6ukq7KwubKysbKxur28vLm2uMO+v8K/trq6wMS5vbusr6exrbHCtrjCxsDIysDKv7C5ub25wr64s7vGw7zDvLezqbOtqrO0r7Ouqq6jnauntrGsoq+moaOvsa2wpKSvo6GgmqGnoaSqqpmdoJmao6CmqKGcnqKemaSenpiYo6OhpZ6mmZuipJ6fm5ubnIeFgXt0cmtrdXJwaFdbUUVUSERJT0g+RUE0RUg5NTs9Njs8Pjw8Ojo4OTw4OTs4Ojo4Ozw3Oz49Pj02OEA5Ozs9QDw9QDk3PDw7Pj0+PUI+Pjc6QUA+PD45NTg9Oz1DQEFDQkGRqqGlqqelqqimn6KnnKasp7Gyq62jqayVkpWalJecoqGbnqCinJ+psqu7sr+rr6ylnp+hnZyYm5+gm6Cfn5eisNGrlI6IgWJxjmxiXWB4oLGvp6Sko6CepaumnpeclJGZnZiUjIqGiIZ5bYigpKKrrLS8tsO+vrO7wcPCxcC/wsbGxcPIwsDFyM3QyMvDsre1vrK+xbu+zM3FzMzM0se+v8DDvsfGwrfDycnCwMW+ubS5urS7t7C1sqq6sa67t766uqq3rauquLq0vK6uuaOmo56mpaKjqaaZm5+Ymp2nqqegoaGkmJSjlpSakZydn6Sep5+en6KdmJmUmJSIhH16cmtkaG94amVaW0ZLTEVEU0xEQkU3Oj87NTQ5OTc5Pj87PDs7OD48Njo9OTw9OTw9Ojs9Pj4+NztBOj45PT45PT44Nzs6Ojs/Pz1CPj83OkFAPTw9ODY2PDo8QT9BQUE+kqugp66ooqulpKKipaGlqquwsq2upKmmlJWWmpaUm6SmnaGqp6KrrLy8v8PBs7K4p6Ghq6qinZ6hop6cm6CSnLrOooZuY4dfV4eIj4+csKqhmp2cn5+Zl5iYkoyPl5eTjo2Qi4KDgndzcW5wj6atrrS5xbvNx8u/wszOzczHydHMzczHycXGzNDS1c7Tyb3Av8O7xsXIxdLTzNPQ09PMysLFxsfKx86/yNHMx8XGxMG7w8C+vr61vbOtv7/CwsbEx8SuvriyuLzEwcG6vLy1rqenraigoqmlmpagmpmdqKupo6SknpePm4uQmYmVmJugn6OdnZeempOTi5WPhYB5dHNlYmdyb2ZeWllDTkxDRVBJRENANTU1ODpCPTY4OkE+Ozs+PDk+PTc6PTk6PDg8PDw7Pz8+PD0+Qzw7OkA9Ojs6Ojg4ODk7QT48QD8+ODtBQTs7Pjc4Njo8PkI+Q0FAPpOvn6ivpqiro6KloKampKuoq62qrqKqo5Kcl5ebmJujrJ2frqalsarFxszOzb+wwailqKytqqGdo5+cnZqpk5nGwpVrXGqXW1Rxm7CzraSfnaCbmJeUk5SWkZCPjIeEg4iHg4CBgYB5cnJvbHmktrq5vsvB09LTyM3O0dPR0tHQ0dHNzs7Qxc7U1djS183Gx8nMw8XKz8rS19HX0tTW09PIzMfNzcnSzM7TzMXHycrBxcvGyMjFvsKys8jEy8rKzsXKv76/vcHHxMzMyMm/w7+tr7OonqKqo5qTnpyYnqaprKSlppaXipWFkZSHkpKSmZualpiQm5WQjIaRi4B6cnV2Z2NndmlkVldRRE1GQElRQj1CPDoyMkA8RDw3OTxCPTs9Pzs7Pj05Oj48Oz44Ojk5Oj86Pj1APkA8Pjs+Ozk9PTw5Njo6Pj08PEA/Pjk6QEE6OT44Ojo6Oz4+PEE/QT6QrKKiqaanqKSfop2qqKOso6OnpqyiqZ+To5iWn56dpK6bn7CrqKyxyc3U18/Gu8esrbS4rK6jn6Sjn6CkrJqfz7SBWlx9kWuQrq6lnZ2doaWhnpqVlJaUin13cGtlYmhxb3F7hYqAdnBucXRwhbPCvsXR0NfW1tLWzdTW19TT0dPU1NLP0cPQ09bY1dbSy8nO0cvGzdHJ0tXW2dXX09bYztLKz9HMztDM0s+/x8bKw8zMy87PxcbHtsDKv9HMy8/Fyce/w8LIzszP0M/NysjOuLe7qJ+lq6eemJ6jnp2qpa2pqKiSlYiQhIyRho2MiJOVmZCWjJiSj4aHjIR8eHN2cGNgZXJiXVJcSUpHQUVIST47QDg9NDU4NTs4Njo8QD07Pjw7OUA7OTo8Ozs8Nz09Ozo+Oz08Pjw/Ojo8Ozs5Oz89OTU7PD48PD0/Pz46O0BCOzk/OTg7PT0+PzxBQEQ8hqugnKegp6Oim6CbqaSlqaCfoaGmn6ifmKSimqmmoqarmqOwsamotdDU19rSx8bLtLXCxbG2qKKlpqGiq7WlpdKoalp1laOtrZyVmKCcm6Gin5ydmpaKd2ljYF9fX19eX2BeYmx1c3Fwb2xycXWSxMfG1NXW19fT1s/V1NrU1M7P1dTU0dHM0M7T19bT1dDP0tPRydPRx9DY19jR2NLX2dXWzM/Pyc3Ry87Pv8XCx8XOzdHQ0cjLzMDKy8XTzsvOyMTJxsbIzMrT09HVz9LM0sG5xbGlqLWup5qorKWdsqiws6ysk4+TjoiLjoOPi4SQjpmNk4+Zj4+ChYx8enFzdG1hY2ltX1ZQX0pKQ0ZDUU0/PD41NDo9NTI4NTU8PEA8Ozw6OTpAOjg7Oj46PTg+Ojo8QD08OTs9Pzk6Pz07PTw9PTo2PD0/QD08PT0+OjxAQjs5PDc0Oj48Pz89RkFEPYKknKClnaWlo5mcnaSeo6OfnZ+doJqnnpyhqZ+vrqqqq52mrrioq7fX1NXZ2dHO0MC8zMm3v6+nq6mjpLG1sa/NoVpkn62ropmWmJqbnaGdmpyek35yZWNiX19hYF9hYF9gYF9gZm1wcG5rb3J3d5vMwNLV09jY1tnR0tLXz9POy9LN1dTSys/M09bS0dbNz9XV0cbR1MrQ1NXWztLQ2NjY18vIzcPIzszKy7/Jv8fIzc7Py9DNzsvOzsfKz9DKzsrCycbJzMrL0dLM09HRz9DKvci5sK67uLWqtrCtqLits7+7sZqPn5SRjo2IjpCFkY2ZjJGRlY6RgIWIenZvcG9rYWRucGFXXFpJRkZETVdFO0A8MzM8PTg3ODU1Oz5APTk8PDg8Pjk8QDtAOj04Pjk4Oj88PTg7PkI6Oj08OkE9PTw6Nj09P0A9PDs9Pjg7QEE9Ojw4ODs+PD4+OkVCRT6Bn5mlp6Cfo6eam5+cl56eoZqdmpyappufpKefuLa1ta2lra6+tLDA2NLX2tzWz83LxNPQwsGxqq2uq6Wysba+zJdakKKclpOXnJ6fn52UlpiUiWteXl5hZGJgYGFhYGBhXl9fXl1ibXJvb3N0dnZ5pL7L1dHW1NPY1s7O1MvNzsXOytLSz8bOzc3UzM7TzcrX1dDM0dTLzNDR08rO0dXS1dXKwMrBxczCyMnCzMPFx8rKzsrNzNDN08vFyM/MyMfKxMbAxcrLzc/RxtDOzc3Mz8XHwLe4vcPDvcO5s7K+sbvDxLWqmKWimZaRlZWSi5SNmpGUlI+PlIKJhXhwcWttZ2BgcWhYWGhWTEZMSVBQQjtEPjs2Nzo4OTo1Nz09QTs6PD05PD05PT06Pjo8ODs9OTtAPD47Pj5BPDk9Pj1CPTs3NzY/PDw/PDw7PDw4O0FAPDo8OTs7Ozw9QTpFQUU+hJ6bqK2epKSqnJ6fmJKXm5+am56ZmaKVoamppcXDwb+7tbKxx8K4y9XW2drb2MzNz8jW1cXDt7G1qqOtrLi3yc2XiJqOjZiVkJSSkZaWlpCMfGZiYmJgXV5hY2JgX2BgYWFgX11bXWdycXFyc3FtcnmkxtPPy9DP1NXJxcnJxsa/w8bPzsfFx83K0sjLzs3G0dLPzszUysfLzs/Hx8/Sy9DPxbrEvsbJvcLHyc7EwcfAx83Hw8vKy8/Hw8PQyMbBxcfEvsDHy8vLzsLKy8jHzNDExce7x8PIyMLPwb28v7DByce5vaqwsqelnaKcmJCbkKOZl5mRlZiJj4J3bnRka2BeZnFhW1dgR0hIR0lNVEc/Sj02NDM1NT08NDg9PT06Oz08OTo7OT89OTw7PDg6PDo6QD1APD09Pjw6Qz48Pz04ODk6QD4/Pjw7Ozs7ODo+Pzw7Ojc5PD49Oz49RkFDPYOgm6qupa6qq5qdoJeUjpedmpmgmpqcm6WysazJzcrIxL69us3Nx9DV1dna29jQys/Q0tTJxLm9vq+nt6q9uc7JoZSOjpePhoOEhIJ+hYV/dGBcXl5eYF5gY2RjX11dXl9gYF9bWlxha3Jyb29rbG9vfbjRyMnKz8vNxLrAw7u7urq+yMbCw8DDx8rJyMrIwcXMxsjLzcnEwsvJwcLL0MTLyL+5wbvFx72/xs/Lw7/Du8nGyLvIxsTKwL3By8bFxL7FvLy/w8TLxcS8wMnCxcfSxMDIv8rJxsfG0MPDxsOvxMvHw8q3v7y6tKmspKWYn5iso6GlmqOgm5R7dnN0ZmlaYW5tWltYUkRMRkJHRExERlNANTQzMzQ/PDM6PDw7OTw8PDg7PTtBPTo8Ojs3Oz05Oz07PTs6OD4+PEI+Oz88OTk7Pz07QD48Ozk5OTk6Oz06PDo2OTw+PDs+O0NCRD5/pZypsqm0rrCdnp6YnImUm5man6Kfmp2ov7i8y8/RzMfCw8fNz8/M1dDW2djZ0MzTzs/QysO3xsC1tbuwv7bSs5GMk5iHeoCFhoB2eHVycV9aW11gYGJkZGRlZGBcXF1dX15gW1laXGJvcm9raWxwb3OPxrzJxczAxsKwtrqysrOyscK8vLy6uMDBwcW+vbm9v7nEysXGwr3GwLi7xMm/wsm7t7u6xcO+vMHNw8a+vrXBvcO6vMa7wrmzvMXEwcK2v7W1vb+6y8O8tbrIur+9y8PBxcLFyMbIxtDGwszHssfJw87NwcXDwL2yt7Cyp6ioubClrbCrrayUeXZ3amRnYGhvY1ZeWUpGSkZISkFFQkVJQDk6NjQ4ODUzOzo7PDk8PDs5Ozk6QD46Ojw6Nzo7Nzo7Oz88OjxAPUA/PT8/Oz07O0A8Pj4+Ojk5ODk3ODo8PDw7OTo8Pjs7PjpAQEU+fqygrLWqt7SyoZ6fl5qNlJaan52mop2et8bDxMjO0svKysfNzs/SydHG1tTW2M7M0MfMyMrEvcnBsbS5trm0u5ONiouFeYCGhoB+hHx0dWRcXF1eYGBiY2FiZWViXV1bXF5cXl1aW11daHNxbWdnbnByeZ29zMDDusG4rrCwp6qtrKe4tLe0srO0urW+sbewta+yu8K8wcS8v7q1s7q+wLjHubS7tsDCvLi9xsHDu7Wusra6vrTEt7u1q7i9vb+9sLq2r7a6ssW8tq67v7S2tMW9vsPFwMPFxsjLxcDGxrvIy7/PysfDxsLDtsO9vba5vse/rLW6tbe2jnh0eGZnZWJrbl5WXmBGS0hISkZCREFFRT88OjU2NTYzMzs6Oz06Ozs6Oz44PEE9PDo7ODc5OTk7PDo+Ozk+Pz1APz5CQD1AOjo+Oz89PTk6Ojo4NTY7PT48PDo7OT49OT86PEBAPIi3pauzsby8sa2foJmUlJiXnqujr6qnpMbLzsjGyc7M0MzOyMvJy8rLxdHO09DPx8nFycTDv7zPvLK3u7i1tJuOh4mJe3l+hoZ3eIJ9dGheXV1dX2BfYGRhXmRlY19fXFteXF1eWltbXV9scG1oZmptbnJ8pMe/uLi1sKusp56iqqeeq6yzramrqbSttrCyqa6mrLK8urbDubq6sau1ubu0wrqwv7G9vLu2vMe5wratqqiwsb+1t7yvsKexs7S7vKuttaWutq66sbCquLCtu667uLu/v725wr/Hw8XBvMbByMu4xcfFv8bDw7nExsK7xsnMy7O5wry6sohydnZraWFibGhZWFdbQUxLTUlFQUM/RkE6OTo5OTU4NTQ6Ojk7PD07Ojs+ODtAPD05Ojc5Pjk7PDo4Ozs6Pj45QT0/QD87Pjo7PDo9PDw4OTg5NzY4PDw9Ozw6Ojs+PTs/Ozs+QDyKwKuouLe5w62zqZ2ZlJaZoZymsLWxt6bGztLMw8bCxdDHzsLEx8DGxsTEy8LKy8HDwMa/uLq6ybazubqzsamRiY+QfHl+ioZ6e4WBd29eXVxdXV9gXl9kY2JjY2JgX11bW1paXVpaWlpcZG5vaGZnaWtucoGtubC1rqalp6eaoKSgmpylq66jp6KrqqyqsKSmn6qttbaxvbmvt6+orre0tLy4tLyvuLm0sbzBscCupaiiq7Gys6e8qquoq6yttLOlqK2hpK6psqWnqK2lqLessLK3ubq7sbu9vr7Ev7XBwMfIt7/AxLfEwr+7v8TCvsTIzMq/vsPAwKmGcnRyamldYW9kV1ZYUEhZUlNLRkZFPj5AOjc4OTc3NjQzNzo5OTo8Ozs8PDc7PTs7Ozw4OT44PTs8Njo9Oz89N0E+P0A/Ojw8Oj05Ojs6Nzc3ODg3OTw7PDs5Ozo8OTc5Pjw+P0E7jMKvrry3ucSwtrCbmZWcmKqpsLGztb2vxdHQzcTIurrMwszAvMq4v8XAu8u5wsXEuLvBu7e1u8O2s7W2qa2Ug4mNgXx+gH54dH98c3dmX11cXV5fYF5fY2NhYmBgX15dXFpYWltbWVhaXF9ma2ZlZ2Voa29yhaqlrKagnKGllJ2km5iSoaOqo6KfpaWnpayfnZukpqyyr7a3p7Csp6q0qrS6sba1rba5sa+6ubG3pJ+jn6axp6uouaqkp6iop7KtoKemn5ukpayen6ekn6Cxra2ssrSytLC1vLa7wcGyur7DwbK5ucKzwL2/tbi7vb68wsfEwsO/v8Sgg3dwa2FmX2tvYFVZXkhOZ09UR0VKRjw9Pz06Ozs4MjU1MzY5OTk7OTo6PDo3PD88PDs8ODg8OTw6Ozc4Ojo8OTg+Oj89OTg8Ojs9Ojc2NzY3Nzg2NjY7Ojo7OTs7PDg1OTw6Pj5AO43ItbW9uLrAur21oJ6UnaGmurars7O7s8TQycvDx7m4ycLNwLnLubzHu7XHurXCxLG7w7mzrba9uKyvsamehIeHgn16dnRvbWtqanFpXmBdXFxcXmBfYWNiYGBgYF1cW1xcWFlYWFhWWFteX2RjYmVnZ2dqbW+Inamgl5WaoZabopiWjZ6hoqabn5+jpaGnnpuim5+qsK2xtaKpqqmrq6S0ua23sKyyta6yta6wqp+dnqOisqSmqbitoqamn6isqpmfoJ6ZnZ+lmpqjnJudr6mrp6qrrK2wsrivuLm7sLa7u7qrs7O5s720trGxtbS/tr3AvcPBuru9l4N6cmtfZV5kZFhUWF1JV1xLUEdJSUZBPD8/QDs/PDA0NTM1Ojs5Ozg5OTw8Nz4/Oz07Ozg4PDg5ODw3ODo7Ozo7Pzo9Ozc4PDo9PDc0Nzc2NzU3NDY2Ozc5Ojs6ODo5ODo7OTo8PzuJyba4vru3wcHBtKSkmZqkpsCyr7astLfG0MjJwce8vMXEz7+7ybq6wbq0xLezvr+xv8G5qqaxtrOkrK2jiYaHgHlzbnBua2JeYmZmXV1eXV1dXF1fYGFiY2NiYV9cW1taWllYWFdXV1hYWFpeYmRkZWZmaGlrco2onZSUlJuYm6GWlpGcoaKonZudpaahpZygoJqYra6trrKgpaKtq6ahtLCxsayor7KnurOmtqGinpujoa2joam1qqKjpp2lpqOWmJ6XmZqdn5qXnZ2cnKyhq6ajpKatq7OzqrSwsqqyubSvqa+ysrO3s66prK6yuLC6trm9v7eysZSFeXVlXmVeW1lWU1pVS1tRTElFSEtJQj0/QUFAQToyNDUyNDk5ODk7OTo9PDY9Pzs8Pjs3Ozs3Nzc+Njo+Ozo4Oj07PD06Ozw6PTs4Nzk3NDY1NTQ2Nzg1Ojo4Ojk5PDg3Ojg5PkA6gci9t72/tr68v7OdpaOYpbHCtba9rbS4ws3Ix8HGuMLByM+4wsa/tby8tcG5tby+s7i8t6ajrbato6uoln2EhYB5cHJ0cWlmZGhlY1xcW1tdXVxbXmBhXl9fYF5cW1pcWllYVldXVlhYWFhWV2FkZWNkZWRkaGp2opyUlI+Ulpefl5mUmJ+eoZyWoaGoo5+eqZyamqqmr7Crm6Ojt6qgn66otqmmp62wo7ewpLefopuYmKqmoZqsuLCioaScoqCgk5WhlJWWm5iXlpeclZ+pnamjoZ2jqqqwrqi0q6qmrbKwpaqusrGwsK6vpqensq6xtK+8tLq3rqOUgXl1ZF5hVllXU1JUS01eTFBLR0dMTEU8QD48Qjw7NzY1MzQ5ODg5OTo5Pjo4Pj47PTw8Nz49Njc2PTc7PTs5Nzk7Ozw+OTk6Ozo4Njc2NTQ1MzEwNDU2Nzk6ODo5Ojo3Ojs5OT1AOnbAvLS5wrG+uLyunaeno6q7wL3Aua60uMLNycbDxL7HucnNtMPEw7C+vri+v7i9vbe3ubOko623oaKan4eAfXlyam1ydHBoaGVkZ2JcXFpZWlxcXF1eXVxbXF5cW1xZW1taWFZXV1ZXWFdXV1ZbY2NiYmNiY2RmaoGWk5WLkZSTm5mclpaboJyflaCfpqWkpqeenJ+ln6qvpp+io7aooKGiqLShpaekr6Wwray1nqCdlZSpoaKUrLGxnqKjnZ2Ym5OLoZSRk5eYkpeXmJadppumoaKZo6Wlq6SlsKelo6urraaorq+uq6iqqbOlpquvtLGuvLWxr6+gknp2cmRhXFpdWE5MUkhSYU1WUE9KTU9FQkQ/OT02OTo3NjQ1OTk7OTg4Nzs4OT0+Oz47PDY5Ojc7Njs3Ozs6ODU6Ozo7OzY8Ozg4NDY4NjMzMjEuLzI1NTY7Ojg7Nzg3Njw7Ojs7QTh4u7uxtb2wu7G3rJ6kp623u7zBxbqxubXFysvBxMfHyLfHxbTEwciuubrAusC+v7u5tLayoqOtsZmbg5SIgHdvZGJnaWhmaGpnam1gXVxbWlpaWlxdXFtcXl9cWllbWVlaW1dVWFdUVFdWU1RSVWBgX2BhX2BhY2RpgZOTiJCOlJKTnJSVlqOZoJacoKWhraWko6KjoZuqq6WZnqWxqaCgnaWrnqehnqytqaiuraKhopSXo5uckKqosJufop+el5mTip6RjZKTlZCYmJOboaKcpKChlaChpKabo6uloqSqpKuupa2yqaalpqa0pqmorbO1tLm6r6qsnotycG9gW1dWVlJHUU9IWlxPUklUS1NMRUdJQzg7Oz08ODY2Nzo5Ozo5NzY5Nzc6Ozo9PDw2Ozw4PjU5ODo4ODY1OTo7PDk3Pzw5Njc4NDUyMTIxLi4xNDI2Ojg2OTg2OTg5ODk7OUA5e7W0rbS7sq+rsa2dp6evubmzwMi6tcCvxsnNu8LLzci3y7+zwMbLr7S7xbm/xcG6u7O2saCmq6mXkoGMhHx1ampqbGhqbG1ram1lXVxcW1tcWlhaXVtbXmBgXFhYWllYV1hXVFZWVVRVVVJTT1FZXVxdXl5eX19iZG2Oj4SRh5CRjpmTlJKcmqKcm6CnqKqoqqaopaOYpK6klJmlr6mfm5mboJ6vmZuqs5+lpp+jo6GUk5uWlpKpqq2anJ+hoJqUkIyZjouQjJKNlpWQnqGgo5ybopWboKKgmKKoo6Koq6Crr6Sut6WjpKKsraqoq66yt7K9tbOrr5iDc3NoW1hYUlVSRVhMUVtZTVVOUExQUUlOSUI8Pz9BPzw2NTc5OTw8OTg3Ojc5Ojs8PT47Nzs7Oj02Nzo7ODk3Njk4OTo2Oj05OTU3NzU3MTE0MS0rLzQzNDk4ODo6ODo6NzQ4PTg/OX6zrqiztq6pp6+tm6morLe2rLzKu7a/rMzHxrnCz9DItca9ub7Fy7Ovu8O6wMLAur6vtKuhpamml4+AgXd4b25pbm5ucGhnaWdkXVpbW1tbXFtZWltcXF5fX1xYWFlYV1hXVlVUU1VWVVVUU05QUVlaWlpdXFxeX2Bkfo2Bi3+MkIqSjZeRl5mioJufqqmmrqqnr6OnmZ+soJWWpKinnZeQj5qerpaXp6qZn5yUpaGekpCTkpOVp6ulmpmZnZ2WjYyMlIaIjYOQi5KVkaCeoKOXlZ+VmqCinZObpaWnqKigsbCmsbynoKOstKqup7C0sLm1wLGtsauQfXFyYlZUVk5SSUdWUVJSTExYTUpMTlJHTUtBQ0ZEQz5ANzU4ODk7OTo3Ojo3PD06O0A+Ojk7OTo/NzU5Ojk4NzY5NTg3Nzk7ODU1NzY2NjEzMjEtKi4xMDI4Nzc7OTk7ODk0ODs4QDh/s62msbeqpqKwq52qp6mysaS2xrS5urPLxrq7wsvRzLO4ur7AxMa0srW7sLi5wbq9ra+prKiqpZWYgmtnbW5yb3FrcGtkZmdlXlpZWllaWlpbWlpaXFxdXFpYWFhZWVdYV1VVVFJTVVNWVVJOTk5SV1hZWVlZXFxdYWqAen92iY2HkIqYiZSUl5uZnaian6mlpKqdp5igpZuSj56impeWhYSSmqOPk6KclZaVh6KampOLjouQmqSnnJWVl5uQkoeUjoyBi42AkIqSkpKhmp+ilZSYmJWipZmMmKSmqKahoLSyp7O3oZ2it6ypraSysqa1u7Wrq7GjiHhxbF1OUVFMT0NNTk5QS0ZOTkpKTk1RSU1KQUdLSEdDPTg1ODg4OTo7Njk6Njg7OTk+PDg6Pjk7Pzg3ODk6ODg2ODU3Njg4OTc0NTc3ODIwMzAxKiktLzEyNzc2Ojk5OTk4NDk4OEE3d7anpLawpKejqaWgqaWks6qissO1tbKzx8a4u8TKzce1r7u/t7rDsrGstKGqssC2t6mmp6+pqpmQn3lfYGdzcXZxam5pZWhoal9YWFhYWFlZWVpaWVtbXFxZWFhXWVlYVVZSU1JQUVRRU1VRTU1LTFNXV1ZYWFlYW11hb3N2cYWIgoiAkYOOipSRk52gj5qboqGjmKSWoZuVjYeYmoxzjYJ9jZeWhZCZkJOOjnuZjpyMgoqAiZifop6Qk5iWhI6Ck35+dImOepCHk5CQnZqZmpCVkJ2OoqOOiZqgoaOjm6K0r6yvrJ+ZpbimpbChsK6csLuqqa+qmYF2cmJVTVJPUE1DU05MUU1CUFFISU5TTUhKSkNKTEZLSzw3NDk4ODg7OzY5Ozc6PDk6Ojs3OT85PkA3OTo8ODk3NjQ0NDU4NzQzMTI1ODUvMDEwMikoLC0xMTc2NDc4OTo6NjU6ODdBN3i3oqO0qKWmqKOmpaamprOnpbTBuK+0sMrFuLrBz8a/tK68w66wxrCrpaqUoau8tKyrm6Oop6WRjppvV1dgaGdpaGluY2ppZ2JcWFdYWFhZWVlZWVlaW1tbWVlZVldXV1NUUE5QTk9PUFNUUk1NSkhOU1NTVFVVV1lbXWlscm1/hXx0Tlhyj4KXho2cl4uTkJ+XnZWUlpSOlol/k4lfO1dve4uUiYCLkoyPhYZzioSWgXmCeoWUnZSDlo6Qj4OGfZJ4cm+FjX6JgZGNj5eZmJOKj4mch56Xh4iWnpqhoJenr6mtqKiel62zoqatmKyrmKe0oqmto5J9cm1fW05TUlZMRFRKUE1MRk5PSUZMUU1LT0pJTVBGSUk8NzU5OTk5OTo3Ojs6Pj44Oj09Njo/OD4/NTg5Ozc5Njc1MzMzNzYwLi0vMzQ0MTEwLy8oKCsrLTM4NTQ3Nzk8Ojc5Ozg2QTl5t6CjraGmpqqgp6mnoqmwqKe0wbmwtbDIw7i0vs/AurCwt8SqrcispaCbhZift6qjo5KhoJ+ckYmQZlFNUlZaWlddXmJnY19ZV1dXWFhYWVpZWFlYWVpaWllYWFZXV1VTUk5MS0hHYlxNT1JNS0hGSE5RUU1QUlRWWFpgbXBpe4J0UEJBf5WRkX2JlIyEio2ajZWVipKIhZWGeIh/YEpRbniKkYR9hI2JhX9/bn5/lHd1dXeEjZlwUY2Iiod8fniTdmh3hYd+ioiVio2QkZaLhIqIlISajIGEkpuWnpyUpKOoqaWknpuwqqGkpJClqpahqZyipqiIdGxlXltIUVFSTUlVTVNJTEtPSUhHSk5MTVRLUVFPRkhDPDc2OTo4Ojs7ODo7OD4/OTk+PTg7PDY7OzQ3ODs2Nzc1MzQ0Njk2LzMvLjEyNTIyMS8sJykqKiw0ODMzOTc5Ojk5Ojo6Oj85d7aboqedn6Guoaeopaeor62qtry2uLezwry3qLrJubaoqba3rLS/qaCZkYGNl66dnpWJm5KUj4uFhmJNTE5OT0xNUVdbXFpYWlVVVlZWV1lZWFhZWFhZWVlaWFhWVldVU1BNSkVAQJtrc3NJTUtERERJTk9oWU5RU1RVWm6DdHd+amldVY+JlIl0f4eBfIWMkoGSmYuPe4aPgHV/eHNudXB0jY2BeX2KqoV5emh2e45wcm14gYuMknh6gHuAdnNykndndYSEhIR7lYmIioyKgH+Ei4x/lIN7gI+YlZyVkZ+dqZ6foJ2gqaWfnZiMp6SToJ+Wnp6kf3JnYFxcSlZPUkdLWFJPSk1NUkpKSk1QSExRTFJUTUVIQTw3Nzs5OT49Ojs8OThAPzo6Pj03PT03OTk0Nzc5NTY3NTI1MjU3Mi8yLiwvLzIwMC8tKygoKS4xMzcyMTk4Nzk4Nzc1Ojw7N3aumKOhmJyftKmvqaWtrLCxqr20sru4tru1sqC3u7OrnZ6tqqqzsKOck5CXhJKhlJqIgJSGi4WBgn1iS0lJSEdGSEhQVFRUV1dTVFVVVVZXV1dYWFhYWFhYWVlXV1VWVVNQS0Y+OTNOPH6eTUhKREA9QURqlH5MT1FSU1ZedYN9eWd3jZeYjo99Z3mBdniAiY98hJiSgXKHj3x2e29rfq18c5CKf3uGkoF9f3RmdnyGbG9oc3yJjIeAbHlxfXBtdY9xaHGAfo5wQ4qEgoOFf3d3eouFfYt6dX6Oko+YipKam6OWmZyanZ6inZaNiqWbj56XjpaYj3ZubGViWldXVFFKU1VUT1BOUVZLTktOT0pRTkhOT0tGRDw7Nzk7Ojo/PTk8Ojk5Pz87ODw9Nzw5OTk5MjY2ODU2NjMzNjIxMjI0LiwsLS4uLTAtKyonJyouMTM2Mi84NzY5NjY1Mjc5OTV5ppefn5agpq+srqunqbGvsau8uKy7vrmzraibsaetnJCWnaaqpaKZm5GHlH2Mk5CSfXmHeIJ+e3t8YktGR0ZBQENESUxMTVFSUFFTVVRUVVZXV1dYV1hZWVlZWVlWVlRTUUtENzhmNzA/qGlOSEM9OzpEioV6WkpOUFFUWF5lcHJtiKeqwH51eWJ7eG58eYiQeXyLhW9tjJF4c3hqaoCCcpaRi4F9loBJkphuaHh+gmxpY2x5hZCShmtzbHxucnuGaG1wf3ONiYSFen1+e3ZvdHOFgnmBd3B8joyKlIOWl5iakJOVlpmXnpeMg4mfkYuSjYaQln5taG1ubldVV1RSUVlPUlVVU1hVTU5ITkpNTktDSE5HRUA6ODk7OTk6Pjw5PDs6Oj0+Ojg6Ozk/ODY4NzI3NTc1NTQxNDQyLzAyNCorKiotListKigqKCcsLTEyNTAsNDU2NzQ4NUhBODk1d5mRm5manqWtsKKsqqi1r66stL+rvMK/pqKalaWYno6FjJaiopmZkpWNdZB9g4mPjHp2fHJ7dnJ2eWRPRUdEQDw+PkFGRkdLS0tNUFJSUlRUVFRWVldXWFlaWVlaV1ZUU1BMRTFAmjMganNDmW87PDk1PICChl9JTU9PUldaUllcYKeIYpppdHplfnBtf3qLiXaBiIZ0bJqRdHN7amudj015hZKJhI5nMXaGc2x+foN0ZmV0foSEhYBmaWx1a3B/fGdwcHtuk42Oe3N9fHFwbnVtgn53eXRpeYmCiImDlpOSkIuNkZSUj5eOgHmIl4iGioaAkId2ampuZ2RXUVpXWVlbTVBVVllZTklIRUpKSEdCQUZEQ0c9OTk4Ozk6OTw6OTs6OjpAPDk6PDk4Pjc4NzcxNTI0NDUzMzY0NTAzMS4qKispLCwrKykoKycpLCwyMjYsKzU3NzU0NzhpTzg7NW6SiJmRmpakqK6esp+muq6rsrDCsbvDx5uWj5WZi42GeoWRmZWOkY2RiHOIhHeKj4t+dXZ0dnVtd3FnVUZJRD88Ozk6P0BBRERFR0pMT1FRUVFSU1RVVlZYWlpZWFZVVFNQS0U4MC9cYLNHOVhQOzk0NDGWuotITE1PUFFWTEFJUUlir7OgcXx4bX1scoOBhYF6hIaGeXKglXR4gHN1lIc1cZ2onY6hoYSihHZwhnyHfHOMrY2JgGhmYmlucm1wg3Vpb1h1cI6aknZsf3t9bXFtcIB6c3ZtYnaEf4aAhZCRiouKkouRjIuPg3V4i4+AfoOBfo96cXBva15aXF1bWVhgX1NOW1pZWExISkVKRz9DQUJHPkNEPTs5Nz07Ojs7OTo5OTs6Pzw4OD06ODs2NjY1MTEyMTM1MzQ3NTUzMS4vLCwrKSopKSoqKikoKikrLzNETTIxNjY2NDM8dlI3PTdikoGSiJaRnqSnnq+VpbWprbGuwbK7wcaXkIyUkIGJfW6CkZKJhIuIj4d2g4Vul4qMf3l6e3F7c3xqbl5KUEc+QDc0NDg7Ozw9PkBCRUlMTExNTlBRU1VVVldYWVhWVVRTUExFPDUqnUtbQC1nSTk0Lz+Sg6muX0dMTU5QTDdDTVJTREqGdoB8fHZ+bXeIiHx9hYN/jH52opl5foaBhZmEm5xhhqqfnYqCkI16doh+iYiOc4qXj4N7XGRxdHp7d4psZ2lheW+Fj4J6boF3dIR6cHR5d2tuaV13h32HfIiHj4CLk5eDjYWNh31xhH+EfHV3e32JdW9yc2VmX1taXVNbZl5XUVVYXFZHSkpES0c/RkBEQz5BQT06OTc8Ozs9PDo6OTk7Oz0+Nzk+OTk4Njc1NDI0NDAwNDY0NTY1NC0sKSsoJycnJigoKSkoKCsrKy8wMFVxPDIzMzMxRX5XND05XI14ioCUjJKdnZ+mkaCroLGor8CxusW6lo6RlIh6hXZrgIySg36LhI+NeYOCdKKGjX9/goFzg4B8a3lsU1dMQEUyMTEyNjc2ODg6PD9CRUdGR0pLTU9QUVNUVVdWVlZUU1BNRkA6Mj0gI5ZjjFs1MzExaT9Hb0lGSUxNT1JMS1RdWVJKaYSIe4l5fHF8j4x6fImGfpeHdqGZiIePkpSljaypSIaur6+LgYCTioKLgYSRqIeAmJiKnHNsfIGGh32OaGZneH5uhYaChXGEhUdrgHdyeXZobWtfdn2DiH+IhYx6lZ6ciouIkX97dYt2fHdtb3d+f3JycWpaXFxbY2NYZ2VcVVBQV1lQRExLRk5JQ0ZDQ0FAQ0E9OTg4Ojo6Ozs6ODg4Ojo/PjY7Pjc1ODU3NzMzNDQyMzY3NTY3Njg7REZMTU1MQzcrIiUnKykrKywvMDArbnUyMjQyMEyBXDU9PF6FdHx+ioWIkY+WmJKXoJ2soaa4r7O9s5eNkouYi310cH+Jk399jIOTlX2Gf4eliImBg4iGeYiLf3WGeV9jVktCNjAuLzIzMTIzNjY4Oj0/P0JFR0hKTE5RU1RVVFRWVVNRT0dDPzgwLCOHWz4/OTQuXZZwc6NVRklLTU5QV2BZcFpcXmqNk4eVgYSChZGTfoWJkYGalYKhoZeVm5qlrZOau7Gnu8fDqIuMoaWOk4mBkHtyg52fkZx+doWFio+HkGlob4OAdIyGhItxhoJ3h4B7doV9bnZ1Z4CUj4aJiIeIh6GropaJjph/e4KJenpvZ2t4fXh8cWljXVpZXWlcYWZfWk9MTlhSUUlQS0ROR0NLRENBRERBPDo4Nz08Ojw6ODg3Nzg6PT04PD02ODY1NjYyMzQ0NDU3Njg2NzxCQj88ODo+Q1FeZVxHMicmLCwtLS4xKD+MWy4zMTBPg180PztudXBneIN7gIyAgZCPi5qapJyhrKarr7CXkZGEoZSEeHeAjZR9f5KGk5Z/ioCSm46EgYKMi4KKjoSAioBscGpdQ0E0LS0vLy4vMDIyMzQ3Nzk7PT9CREhKT1FSU1JTVFRSUE9IREI8ODcvOUQ+PDw2My5sk5dNUEhJS0tLTlZgY39nZ211nZuPmpOTi42OmoiTj52LoKCSo6qlo6yTqLaiqMHDrseveLqUmnyMoZ6YhJKFgo+hn5OYkoSKhY+YkZZscHWJi4GVjI2Pdo+EcWyFgYqWkoOFiHKJoZaGk4qPj5altambjZWig4eThH5/a2prfH5+f3FfXGJeWWZqXGxrXlhLSE9TUU5NTEZJUENETkZCQ0VHQj46OTc9PDo7Ojk4Nzc2Nzs6Nj06Nzg1NDU2MzQ1NTY2NjY4NTU2MzEwLiosLCkoKS46UGFcQCwoLSsrMCwncog3MjQwT4RiM0A8dW5oWXCDcHWHcXaShn6XlpqUn5+cp6CqlpOYnmdlpJp+hZOSeoCRiZGSfYqFmZKRg4CAi42JhpGHhIiFeHh/Z01SPi8uLiwvLi0vMDAwMjEyNDU3Oz9DRk5QUlRQUVJTUU5QSUVEPjs8OkNGPz48ODUyPD9SNUhISExMTU5SXm+KfHOBfaCdm6imopmhl6KVnJ+onqmrn6isqaq1l6u/q7bIyLfJ0c++m6Bwaaupn4STkoWcoZqamaeRkYiVopqad3p+lJeRoZKWl4GUnnt2lZKrs4mNl6B9lJ6cjpOWmaSiprawnZGZqIiXkI6BiGxzc3t9em9mXltfXmBmY2BnZ1xSRUtLUE9JSkxGRk1DR01GRkNCR0RBOjg1PDw4OTk5NzU2NTg+NzU9ODQ3NDU3NTQ1MzY5NTg6NjE2ODYzLzAuLSosLy4tJyMqO1hiQigqLDEtKEuXXjA2M1GFZjJBQGlhXlBxdWBufWJ3jn18lI6Oip+Sl56WnKqYnqpCRH2HiYeYjXiCjYuOjXuKho+QjoKDgImMioWThYOGiIGAh3dfYlA0NjAtMS8sLjAwLi8uLjAwMTU+QUFNUVJTUFJTVVNOU0xFRUA8Pj1HR0FBQDg2NjI8OTtGSEdJSU1PUVlthpB3lYujp6q1vbilrqysp6i0rLG3srKtu7GzvpyzxKy7ycu4xL+4paOwsqytqqOLlpiFpqagopeCppmNoqqopIeFk6OgoKqgpKmOnLGLlaOnt7uboKOwk6Odo56RpKKrr62ztaKVpaqJmoqTipV6e36DfGVfZltkYF1iY15mZl9bT0RKSFRPRkhMRktIRUZIQUtGQ0ZGQTs4Nz08ODg6OTc0NjU4PDU0PDc2OjQ0NjQ0NzM5PDM4PDIwMjU1MS8xLi0qKi8sLSooKiYlNVhYLywwLCwwhIE4NzFQhWg1QUNbWFRMaWNYanBYeoV2gZSFiIKbg5KQjZLayJ2Wc1aXiI+InI98hoyPi4p6iIKHkY6DhYCLhYWIkoaChImGh4eHcW5hQEU2NDwyLzExMC0sKy0xLy00P0RBTVVRUlRVVVdVTVtQR0dEPD4+RkhDREA3Ozw1Qzs9RktJR0hST1BXgZOghK6js6qywcjEq7PFtqyzwLO4vra/tMG2u7ukuMaptsnHtr65tKijtK2wsZuZkpqfiKevqqSUdp+kl6GrsbOYlqmtqK61u7K6rK+1orGssbW8t7WutaCnp6Oom6mwrbK6uLinnLepjaWPkpOghnmBgXNXYGJUZWBgYl9fZV9bVEpERUxWUUlKSkRKSEVBQEBLREJNRjw4Njc7PDk3Ojk4NjU1NTcxMTw4ODk1NDY2NDk3Pj0zODkxLjAxMjExMzAsKiwuLCsrKyooJyopRVowMCovK2iSTzYwUodqNkFFV1FKTFtaUWNkV3p1cYKUfYWGk3aGf4CNe7+7o7yCtJSTjpuPhIiPk4mJeYeAjJOMh4WBjn+BiY+Gf4WIhYqHkXp5bl1WQEVOPDY6NDZBQjc2NC8vNkNIQ1FbT1FVV1VcV09fVUlLSkFAP0dLRkVDOz5AN0Q3P0JKSkVHV1RQXo+lraOxtMO2uMHMyra7xL2ztMG3uMK1v7C3dLG0prrFpLDGubGzsbSopLW2qrGgopabopGlsa2lraunpJigrLO6oqiyubW7vsy/xcW9vbPCt7q4v7e6t7mtrbGmsaqtvrC9u8LCrJm7qJWtj5iYqol+gHlpVmFfV2ljaWRVW2NZVlRJSEdMUUdESUpBSEQ+P0JCS0BATUQ5OTY2OTo/Njo5OTY2MjQ2LzE5NTk5MzY0NjI3Oz0/NjoxLi81ODo5NjUwKigsLS0tLCwqKCgrKyhFUy8qMDBKj2s1MlCHbTY/RlFMQUxSV1RaVlp3anB/j4SBjoVuenN4iGK4oZqjiZWUlpOUk42Ql5KHh3uHgY2VioCEgYp6fIuHhn2KgoGLhJV9eHp1ZU9cZEdFTDpRZGFbXlNGPjtIUERaZFFRWVhaZ1pUYGFNU09FQT9JSkhFRkFAQz1FNkI+SEdLTVNaVF6Ur7i1urnJwLu9ysy7vcC7t7W8vLe+tbqyxmB1sqWxmp6rvqqlqKuqpKKytaCrqJ6Vlp6Yn66lp6aln6SToqews6iysry2wb3TycnTxsLFzMLKw8C+vb+7vLe0sLm3t8O6xr7DybCeuqqirI+lqLaJgH1wXmBgXFZgXWdlUlhhVlJWSUVGTktAPkhEPUtCPUJAPUY+O0hANzk2Mzc5PjQ4OTo1NzA0NS8yNjM4OTM3MzUyNj84QD5HS1JUVFJQT1FSUUpBOS8sLCwqKygoLC0sL1A+KC40OIB9PDJLiHE5PkNLRUBJTVBSTFFdZ21scZCNhZBzbHNyc4jVwLWZoI2VmZqRjpeRlpaOhod9h4ONlot/g3+DeHuLhId7i3mBioKXf3R9emxlcHZZXVxQZWViYGVkXVtYV1xNZG1VUm1uX29fWGdlVVlUSkRBS0tIRkhISEhCSTlEP0hLVFRWXVpck7nAub23xsC7ucrLu7e6tri5s7i1ta62tplkdamerXBeoq2cmKGim6Seq6WUn5+QlI+WmJeon6WfnpqZg6SdrKSqsK23sLy41NDO1s/JzNLMz87Kx8C/wsq9wb3CwMXExsq/yc+0pLuxtbCbrLm9mn54alxfW1hdYFhhYlFbYFNRS0NCRUZFPEBGPkJJQkBEPTpFPj1KPzQ3NTM1Oz00Njg5NzcwMjIvMjQxNjk3NzU1NTVEM0VMTT41MTAwMDY6NDc3QElPSjstJioqKC0uLyxATSsvNTRtiUkwSIl0Pz5CREBDREZLT0RSXFlpYG+XkpGUbmxvdHWHs6yhoZ+LmZyZjY2VkZuShYqKf4iHjJCMiXyBg3N7ioOFe4p0goqGlX9ze3lsbXV8aXNlaWxpZmpqaWBmaWhtWm10l62kvIeHZ1tvaF1aWVRISk5QSktRTFRRSExBSkdLUF9fYmdqYpe3x7C5s7u+trHEx7awubGwu6yzsaert6yNtqeenKeaTpuejY6glpGnmKWVipOTiJGJj5GRnZuhmJuVloeemaaarK+or6ezs9PU1NbRy8/T1M7Tz8zGw8rQv8rJy8nSyM3Nw9HSuK/EvMS6pre7xKKAbWJbW1xYX1dYZFlPXFdOUUNCSUVDSTtBRD5BSD8/Qjg7RD5AST00NjY1NTs6Njg3NjU0LzEwMTQ2Mjc4ODc1MzY3QzVCOD8tMCwxMzQ5PTk3LC4sMTtGTD0pLCguMDAwN0s/LTQ2VIhXMESHd0M7Qj5FQkFDSk0/VVlTZldzkJCZg2hxb3l5g6CqnqaXjZubmIuNlZGajn2JjIWOioqLkIh8hIJwf4eBhnuHcoOSi49+cXl1bHB4f3J7bnhzbGmAcG1jaW1weWl3fX7Lv8Lfp21jeG9kW2FgSlBSVU5ZXlBdXU5QTlRRVVRcbm53g3KWrristKiwtqutvcGxq7WmpbmnrK6hrLSkj7Gum5iYjJGUkYSPm4GNp5GciYOLhIqJhIqDk5WYl5SbkZuYmZmenquspKehrKzO0tXRzczS09PQ1NHOyMPU0cjO0tPT1s3S0cXS1sbBz8jIw6m/uNCcd21kW2BcVV5RXVpPT1RQTkg+QUdCQ0Y8QUI/RkU+QD86PT09PEpBNDU0NjU8ODg4NjY0NDEyLzAzNTI2NzY4NTMzOz08RT1AMTErLzM1OT81OTAxMDIyLTJFTzMpLzMuMzI9TjI0OEN9XzJBhnREOj09ST5AQ0ZIPFZSTU9bdYeGi3dtd3B9foChnp6hi42Zk5OMjJOQloV5hZCQjouKiJGHf4J7cn6Agod6hXaFk5GJgHB3c2xzfHx3fHOCeHFrgHJyaW9xenlze77Lmn6MsYN2coV3aGFqXUNaWltXZmRYZWtUWF1dYGNeY3h7f4uBmaqkpKKgoainqrG5q6a0o6KuoqSuoqexn4mmm5WTkYqSjoiClIlrlaKNmYSBhn6Rg4OTl62LlY2VmY6FkpCdl6ewoqCgpKSox83Px8HL0NPR1NLO083G1tPN1NjW1tjV19XJ1NrNytjW0cqtxMPMiXFuYV5dV1JYUltPSkdKSUpAOzo7RUNEPENEPkhDP0NCOzs5PDlHQzQ2NTQ0PDU2ODc1NDMyNTAvMjU0Njc0NTU0NDw+PUU/QTYyLy0xNjs9MDgxLzI1NC8tLjtSMDE3LzUzMkVEMjg+bmI1PYF0TTk5QEk8QUQ/QTtQTEZLWXCAdX5pc3lygomBnZWelIWLlomOioiOiI+AeIOUmYuNiIiLiX6DeHN7fYOHd4B7h5GXgYRveHBtdX92eH10hnx5bId2dW59doR1eXudtYw8QYrGpX6NfGplV0lDZWNmY2hqZG95W19maGtuaW6AhIiRjJ6foJ6Rl5ifpKSmsqSls6CipZ6hqaCisZyHn5KSk5GLjouGg4+EfpycjI2ChIV6lH6CqpWjjJKKmJKLfZeKmpGrs5iam6ecp73Dxbm2xc3R0NHPy9LLydTP0dXa19fY1NnYzdjbzsna2tLWv8zNtHV0bWNbV1FUUFhVRUZKSUVFPTo3OkBBQjpHRUBFREJEQTs/Ozs3REM3NTY1NTswNjg5NDQzMzQxMDE0NTU4NzQ0NDQ5QD5EQkM8MzMuNkZUV09RSkFKRj8xKiguQlQyOTI1NC83Szc1PGBiQTxzdlY4N0FIOj9DPjw5UUVDSlRsbm9wYnFxc4aNfJeRnYt+h5KCiYaFioOIfXmFl5eJj4OHhYd6hHlxenuEhnV6ho6NnXqMcH1vcHp/cnuAcYSHgG6OenV3fXyCdX98h4mwdFmqwreNkoFwbmM9XmhycHFwbnh3gmVpb3J1eHJ7i4eOk5KblqCWiIyTm6Cbn6qfoa2copqan6afn6yZjJqMkZOOhX2Ih4OFi46gmZOIg4d+bZl5hJmGiJOMjpWMhnubiJOPrqqUlZeemKautbyorb3Gy8jJy8vPyMPRytTW2NfY19Xb19PZ29bP29rR1sjVzJN2eGdmWVhPUlNcR0JFSUk+QT49ODo9Pzs+SD1AQkFBREE+Pzo4N0RCNzU1NDc5LjU2NjQzNTUzMjMyMzY0NzU1MzQ1N0VCRENFQjU2PEZOU01bbmZjbnNrYFY+LDRMRzg2NTQzM0JGND1XX2hMdXheODs/Rjw8Qjw6OUQ/Q0dSa19tZGJma3aAiHGRkJuAeYCOfoOCgoV/hHx9hJiOh4t+hoeAd4J5bnt7h4J0epKejaF2j3aDdHWBfXSAhG+CkIJvkoR1fIGFenaHfIm4xqXDyriClpyPeHBlTmVjgnqBd4aikIt5eXd7g398hHZtlJaUlY+YkYOJj5eal5emnJigl5+TkpejnZmrlpGRi46Sg4yFiYiBhpCRnpyZiYWLgYWXe4iJn5eQiY6Ki4J8oYiQi7yhmJOXmZyopqWtnqe1vsC/uMfJzc7FzcrR1tXU2dXX29TX2drb19va2djO3MaFeHdlZ2NeU1ZWVExLRE1EOz09PDk6PD45PkE3Pj9APUA+PDk4NjdDQTY0NTU9ODA2NjU1NDc3NDU2MTM4NTQ1NjQ1NTdISD1ESkU3OTI1O0g+Ozo6N0hQXFpSVVhLOVQ+Ozk1MzI3STg9TllNSHh4ZDU9PkM9PEA6Njo+PkBFUV9ZZmFdW2h0enlsiY2Sd3Z6inx+gH+AfYV7foKRioWGeoWIe3V9dW19fYZ+dH+SnpGfg5J8hn14j355i4pvg5uAdJmGfYKKhXx+kXuQqY6Qw6C9jJyknH6KhH2JcoyLf3OmmpyZlIV7j5GJhGlHcaGknYyLkJKFiIuRk5WPnZuTlJGXjYyVn52UoZSSjo6QjH6Qj46LhIiSlpqfn4mMlJGdkIKMf6aZiIWOg4aEgKSGiou4mJ2RlJaip6CdnZ2jrra6tKu/xcrQyMfMz9PS0tjS1dfA19jZ29ja2tnZ19u3d3Z1aWhkVV9aUk9OSENMQz09Pjk5Ozo5OTw9NkA+Pj09OTo6OzM3REA4Mzc4PjcwNjg4MzU3PDM3ODA0OTc2NzU1NTQ2RlA1RE5JODkzOEFLPTszQ0BJPDlEV048TVRITj85NjMzMz5DO1tYPjVZeXBaPDxBPD0+ODU4OT89RFJTUlheVVhmbW1taYGOinFzeIp7e399gHyIe317i4eDfnWDhnpzenRtgX6EfXeGm6GbnpSSgIyHf5iHgJySboiphXqgi3yRj4OJhJx+mpGJjaOin5Ckr6CLkYuGi4GShldyrYufrJyPg5ickJCOXIOikYKNn5OVjIeIjJKTjJSVlZCMj4qIlpudj5WWkYuTlIaAi4mSjYqKnZeZo6KGk52VoIqKiI6ckIOIj4CDh4WkhYuQs5ickpSXoaGemZKbnaexuKykvMHHzcfGz8zPzM/Xz9HUrtbV2NrY2trX1tnZnW16cmVlW1tWUlVWQ0BJRD8/Pjo0OTo7Nzo7OjM8PD89Pjc7OToxOkc9OjI3PUA1MDY3NzI1NT82NTs1NTg1ODo1NzczNUhSN0dPSzk5ND1FSkI+MUZDTEE5ODpHWEA1SFdJNjYyMjM6RUNlWD8mX3lpX3o+Pjk8Ozk4OjxAO0JRS0tTWVBUY2J4bGJ+koNvbXeLeHp/e4F9hnx7doaFgHNwhYJ7dXd2dISDhX1/kqain6ail4qdkJSXioqnl3KKso2Ep5KEmZSFmoyjlqCYk4mbnqKTqbCgkZWQjo6IlYtujbeEmsTIspyipZudmJaRspBkpM3IlY6Gh4mQko6Nk5SKhYqKhpaam4+QlJOHlZiEf4+LmYiOkKqXl6SjiJmelZqJj4aXmIqFj42Cf4aPpYiNk6mal5OXmaGYn5mTnJqisrSlo7zBvsfFxcnIycLK08zN1KjS0dbW1tja1NPazoBwfGVgW1xcTUlTWEFCR0Q7QT44Mzc7PDo4PTY0Ojo8OjcyPzk5MjlJOj42N0JDMzI6OTYyNjQ+PTQ7PjY5NDk7NTc5NDRLUTxKUUs5QTdCR0lANjRKRUxGPjs4OEVUQTc+XDg2MjE0OjtFYFhBRmF0aExjWj41Ozo6NTs6PTpFTUZIUldTUkJjgkd2gY99fG1+iHh6fnuCgoN/dnaAg3xtbot/enx4eHyEh4p+i6Ozp6Oqs6KXp5+lpJaVrqKDkbiVkbOajaGhjKWbsKOknZiRp5aomayvpJiVlpWQi5iZl6HAjqPJuaubo6atmZKbnbKdhYWoopyYhYmJjpWNi5OPiIGGh4mTmJWMi5SThpWYhoSRkJx1kZiylpekoYidmpKPipCKl5uJi5aOh32MmJ6JkJCcmpqTmJiflKCdlJ6boLGuoqS3vrTFx8S9w8O/xs3KydKmzs3T0tHW2NPQ2Lpwd3NaXlNeVE9ISU1FQkNENT46Nzc6Pzw8Nz00MzY2OTc3ND01OzU8TDw+OzxCQTc1PDs0Mjc3P0A2P0A3ODQ5ODc7PDU1T01EUFJMOEA9RUFHQTU6SkVORUQ6NkFAQlM+OURPMzIzNTc1PXZcPFJcdGlaTV1TPD04ODU2Nz06SkZER05bXFlKZmA7SISLenpuhYZ6fIR5gYaBfnB4fH59b3KNen6CfHiGi4mGhJKnu6yosr2vpa2zs6ijobCsipq1naK4pZWtpJeprbinpaOfmqmXqaOvsKqamZyUlZGXoJiau7uuyqFqtrirsJSZn6Osk5e9o16qsoOKio2Uh5B8jo59g4aOj5SViIiTloyQlo2LjZeYk52ZtJeVq52LnJSSjpGSjJmbipKekIuJlZ+hjZSNmJqdkpyYnpShoJScnaWvqKGls7irwsjEtbq9u8XHx8LRoMbJzc3E19bRy9OgbnhmWlhRXFBORUM+PENBQjg/ODg1P0c9PDY8MzUzNDU0NTRCMzk6Qk06QjtBSEI7OkA8NzQ2PEI5P0BCODc0Ojo2Pjw0N1RLQ1VRSjc8OklBREA0QUpITkJBPzZEQTxKTkQvVD0yNTQ6RUpcWEpaUW1ncHBEaWBLSTY3NTc6PkpAQ0lQZEdiYGJwSj+Lin6Bc4aHfYKJdYOKgn9tfH19f3B3h3eOgod7jY+MhoyZqsLAr73Gu7O0wLy0rauztoyos62tvaubu6Sorbm4q6emoqKkoqmvsrGrnZykmJuYl56ipqWSpLqvqcC8ra2yuaWlqH6IhpytvLCDjIyLkIOOg5GOeoGHkI2NnImIj5eNi5WWlJGal52omrGakaycjpqPko6VkJCWl46RoJGJlJukrJSWj5ScnZOhnZuYn6GUmp6npqSipLCzp8HGw6+wurbFxMK/zabHxMfDvNbRzcTKhnJwX1lXXVlMSkFLQEZHPkE/Qjs6NT5BPT01PDY+MzMzMjQyQTE3QEJOPkdAQ05DQT1DPTs4NkNDNUJJQjo4Nzg7NUI+NzlWS0RXT0Y4PTRLQEM+NEVLSE4+QUE2QkI/QlNFNThQMTQ1Ozw4O0Q+OUxqal07V1JkS2daVU83OUdEP0NGXGVHYGlnWl1ck4yLiHuHjIeDjHWGkYqBb357gX9xfoF7lXqSlJSYkJOVp7PGyb/CzMLDuce8u6+rubuYs7e6ssCupcGkq7C8vauuq6OjnqerrrSwqpygqpyhm5afsLWni6O6u7bBvKypnLKlpKmUhY6pxMOkgouPh4iEhpWUjXqEjZGPkaKMjJSSj4mXn5iTmZWYpqCunYyqnI6Wj5KRlZWNkJWRj6GUhpefoLKelJqUn6CYpJ+aoJuglJiepaOmpqSvrqXAxMOuqLe1ycK+ts+yxL/EvLPRycjCtHJ2allWWWhQTEhCTEtLSkFBPUNEPDVBRDs7Mz04QjMzMjI2MkEwNUlFTj5JQEhSQEg+Q0A7Pj1GQTVBVUA7OTk4PDdFPjg+VkpDV09HOD80TEBCOzVKS0NMP0I/PEJGPUFITDkrRzwzNjc0NjRBPzdPYU9hRS89PjZrbGpgQDpIPj9FQmVZTmVcZlRjapmNl4qMiJOQhol5h5SQgXKAfI1/eIeCgpB6jqGWqJqamLq9x8jJwdLJysLNvcKzrby+qLq/vbvDt6zCqayzvL6qsKqkpaSsrrOttrWgn6+fpaKYo7O9qZuovcGktrewrJOxraytl4eaqaelkYKMk6WViYF2ipF6hY2SkJ6fk4+UjI+NlaOZlpyUlKOeqp+RpZqMj4+PlZaIfI+VkpKjmpWfoZy1pZCel6WjoqWenaaYnpaXm6SjqaeisqyovMDEr6Wyt8y/ua/Es7u+writwsPCwJdqd2BWVVpZSUpMSUZEREhDQkFETDo0REg5OzQ8N0UuMTIzNTJCMjVTSE48SkJKUUVLQ0RFOkVMQjw3RVY9Oz04OT88ST86RVVJQVdRRzdBOks6Qjc5Sk1CSUBDPjxERzxCQ089MjBIMzY2MTcwPUI6PWpqSks1UVMzU3BwZE47RD1ARj5qSF9YYVpkZFaej52Ol46ekomKf4qgk4R4hX+Vf3+QiIqQgJahma6mpJjCvcfDx8XTzc7Ny7zCt7C5vLS9y7zDwba3vK2zwLq8rq+ooKmotq2uqbK3m56toqehnqu3uKqlsL/Fsb25tKiqtbSur5eWpayooJGOkrLFp5WOfZKVfYiSmZCqmZiTk4+TlpOlnpKdmZSho6KcmJ+Yi4yPj56IWpCWl5KXpZllmKOfs6WWoZasrKmnm56ml5iWl5WgpKiln7arqrq7w7Sls7XLwLiqtqyyu7muqLi6vbiBaWxYVVNTTURKUk1LP0FIRURISEg5NUVNOz44PUBKLjMyMDI1QzU1T1ZOPExGS1JMT0hHST5JUT86OElTOzs/Nzk+RExCQEhTS0BXUEY6QT9HNkE3O0hNQ0U7Qz00RkU6QkFCRzkvOkEzNjAzPkdEOTQ9dGRNRztFKzpmfGdWOz1AQkZCcEVpSVJlYkxGpZSbl6KXqZaNkIOHppOIgoeCnIODlZCQlI+aop+vvq+hxrzExMbGzs7O0sq+u7axuru7vs+1w724ubeysbWzuLOrppyrrLmqqaevr5ijr6SnpKW1wLCsrLS/w7rAurSoubW5s6+Wpa2urqSLk5WhjXTBmn2XmYSPlpqMsZWbmpWSk5qapaOUoJuXmqmcnKGgmYqNkJacYEqWnJqVmqWWVZewn6+cnqSUr66rpZqgpZSTmJiNnKCnopm0qaqzu7u7qrCyx7+5pqyrrbKyo6GysrSkbmtjWlhNT0pET09QUTtIS0lHSUNDPjpLVD9BOj1FTTA3NTQ0OkI0NE1XTzxKS09VTlFKUEhISk9CPD5NUjs+PTg6PENSPkRIUklCV05JQEJBRjM+NThKS0NBPUM7NEVBOkE/PkhANSpCNTIsPmNdZzozNXRkZUBSNyYjM31oVzs6QkNAPVFFV1NzYldGSKqXmaCiqK+ZkZiHi6iWjoiThZ+HhJ2Xjp2hm6Oktci1qca5wsPHysnIzM3Gvruzrrm5wcHMtce6wbm1urCvr7O1p6SbqrS1qqmmrayapK6lpKisur+orLa3vsK/vrm0s8Syub2so6+1rLmmiJuXppt2v5+EmZ2Ok5mai66XoZycl5WboKGonqefmZqqmaGnnpiQjZGdg252kqKalZ2inpCusqKqlKiql6qto6OfpKiRkZmbh5Scop6Wsaepq7m2vbOyrr65t6Cjp6ilppycrampi2BjXl5QSUtGR01JVkw9TUVOS0xCQ0Q8UVY9QUFCRE8xOD03Nz9CNzVUV04/SE5RWVNQUVVLUUpKRUFFTVE/Pz04PTtHUjxFRFFCR1lNS0FIREU6OjM5S0lCPkNCOTlDPjxAPjs7RzctMj4tMYJoTnpcLzBraGA8PUJCODZ6Zlc7Oj0uLVJgTVVIf2VeSEWrlZuhn7uvmZSfjJOrm5GSk4mrjYein4ykrZSjo7bGvrTAusLCx8jFws3Iwb65sq+4tMDCyrXFssG8tbqqqa2tsKOjmKq0u6appquqnamvp6Oqq768qK29tLi+x7y3trjBsr7BtKm1t6u+pY+imJKin7yfiZqgmZeeno+3n6mcpaKbnKGaqKSzoZudppyoqZ6ZlY+Um4uXiYykopSdop6hta+lpJOvq5mrqp2do6OokJSUn4KPnp6blamkoaGztLq1rai1srOenKKlmpeVmaqhnnVeWl1cSUdFRk1QSE1FR0dDU0xKQkVHQVZSREg9QUdRMTtCNzpCRjc5XFlLQUxQVFVTTVdSTlVKRUBKSk5POUNANT08TlFDPz9QP0VaTUpBS0RHQDUzPUlHPz1FQTk3QTs8QDw8M0A8Lyc7KkiRQjpTSjAsW29XNzE8Kh1CgGRUNDktMTlmXEZDQ5xwYkdFp5ekn57DrZuXpZiaqZyWm5uPqpaVp6aVrayZoqu2xMK8vrfBwsDHw7/Nxru9ubKwuLO/wsi1v7C8t7m3paSrrK2hoZqqqsWipKmrpp6sr6uiqai/uKetvrG4tse2tbm4wLK/wre1s7SvvqOXo5aUm5SuoJCho6Wjo5+QvaSpnqirnZ2gm6WfvaKZo5+iqauhnZaNlZ6TnoePhI2Tn6SgnrWspZuVsaeZr6admaqcn42YlJ6EjaCam5KlpJqYq7G1saqlqq2snJigoJKOkJWonpRmYFhfXE5IR0pOS0hFRElBPlFJQTxHSUhbUk9LPUhPVTRCRjk+SEc1Q2FbS0NOUlVXVlFYVFJVSUA4UlFQTTpHQTRDSFFTSUM7Qz5HVktDQE8+SzwwNjtHRj47RkE0NkA5Oj85OzE1RDAtLC9Ndlw0S1o1LE1uVzwtPSkeI3piUTVDS1E6bVJGPEt4ZWJWTKKao5yexayhn6yenq6gkqOflqWfpqqsl7axo6qztsTEvb+1v8K7yMK+yse1uLW0sLOzt8HFtr6xuLW4tJ+mrKqsnZ2epaTBpJ+qraCkqa2voqaovbWlsb25trbEsrS4ur+zxMG4uK6ztbWjnaWVkZShrqCZop6oqKujmsKtqZ6srZubnZmmoL2hnaSYq6uspqKZjZqfkp+Jjld/lp+loaC4qqaTmLWjn7Ggnpqulp2NmJOdgY6fl5WOoqOWkKausqupoaGlpZWVnZiLj5GSpJ6JX2JYYl9LSEpKTkVFQUdLPj1KQjk5SkpOXVFRST1MVlw5Rkk9RE1JOEhiXExDTFBTWVlWV09aXklBPVdRSUs/SD81SE1YU0hBOkBBRFBIPz5RPks3MDk5RkU7OEc/LjY+Nzg+NzcvMT85MSUxUVVtW0pPMTA9Z1dEMTc9LSt3YFM2U1prV3JHRTY9dWVcS06en6GZnsOopaK0op2yqJOrpaCjn62prJ27sKistrHIxcHCssLDvcbDvMTJvK+wtq2wtK+/xLS5sbC5tKyZqLCpqpqdpaGowaybrLCcqqOusamkqL22p7e7vq+3xK20s8PAs8e0u7ers7atqqKmlpWUpKyin5+aqKuwr6+7sqagqaiZmZeToqS4oKGkk6+vrKWnn5KhnpWej5CNlZ6aop6ntKamjJizm6OumZ2brJCek5WTmX+RoZWPjZ+hk4umrK+lpqGcoJ6SkpqThYuRjZydf19kWmZkSklMSlJCQ0BJSDs7Rz85OU9NVV5SU0o+T15dPUhQQkxMSTlNY1xMRUxSVFlbU1VPXGJIQT9aUUFIQUtCN0ZFTEtNPztCSEROQj07TkBBMy85N0NCOTdGOys2PDQ2PDM1LS80QDErJ1Z0U2VPPzEwNGJbTTIzPjA8dl1eP1tUXmVxQDg7SJZ3ZUE0n6OgnKDDqaSrs6GktKqWs6ynoqSyrK6pu7GtsLW0xsDEw7XAxL3JxLW/yMK0q7Wor7isv8Ozt66strmlmKqyq6qYn6aXrbu0m6ewm62grrSyp6u5s6i6tLiyucCqt7LEvrXGqL+vrba1qaesoZeXkaaloqKYmKWvuK6ytbagn6ikmpWVk6Sgt6KkpZavsbKnqqain5uam5aXqJ+gmKGer7KipoyXrpikqpeZnqSRmoyTl5mFlZ6UjI+cnZOLqKmqoaegmJ6VjI6Zj4GFlYiUnndiZ1xqaUxPTU5UPUNBTkM6Okk/NzdST11eUlZRQVdgXEJKU0hWS0g6VGRcTkZPTltXW1JQUVhdR0FCW1BCRz5OQzlIR0hPUD8/Q0lCTEI8MklBOTQxNzdCPjs3RTcrNjkxNDgwMi0vLjw2LSNCcWdzazIzLzFbYlozMzgwNnBbYkgwNUlwaFZDV0aMeWZDO6SjnaKmv6eor7ChqbWrnbqxq6OqtLaxsLm3sLe4uMS9w8e9vMTBxsC4wMXAuqm2pKy7rMDCt7eprLG6oZStsa2ylqWnkaq5qZ+msJ2roLC0s6qptratvK2zs7m3rLiww7u+v6bDq7C3rqmrq6eemJmroaKhkZehsa+zrLC5mpypoJmWkpemobappaOisLG0q7OorJ+boKCbnaWcopedo7Owmp+Pk6Wan6iak6KelJeIk5aSlZack4iQmpmUjqiopp+jm5ebk4aOmIt9jJaFjZlpZ2tgbG1XUFFaVEFCRVRAOztIQTc6WFBkXlBWV0VZX11NTFJOXktKPlpjXk5IUE9cVVlQS1RXWkk/RFhQREY/TkA9SUdHUVBCPURGQk0/OjFEPzc3NTQ3Pz05NUU0Kzc1LzI1MS4tLiwxPSonKz1ccD0+MS4wZFpkQDE2NDdnWWBGKD84bH1nW1Y7iXtjQz2on52iqr2iq7Cro7G4qqW2tKygrbW9rrO4u7q9trbAwr/IxLnEwsDAuMS9wbevtaert7G7vr60qK6xtp6Wq66orpemqI6nu5+krLOerKKxsLOsqra0tb6usLG1rLC1ssG7xberva+xuKytqqOxpp6lqp+kmJCZn7Oqs6uqs5qdp5ualY6gpqW0rqehra2usae0rbKqpJyfqKOelaGZm6i1qZaZkZKemZ2fnY+rnpaXhJSWip2YnJOJjZaXmpempaKgnZWVl5N/j5SFe46SgouVZGtxZ29xXkZZZlZEQk1YRFo5SEI2PlxRaFxOWV1HW15dTk1SWGRKSkNcYl9QTE1OWFdYUEpWVldMPUVVSkVEQU1AQUZISFFQQTtGREZLPTg3Qj02ODcxOT48NjVEMCs4MC8wNS8qLC8tKj0sLCUyKyo1SzEvJ19fYFUxNTA9YFZeOClDM1lUXGdLNox6ZkxApJqhpKy2pa2qpq+ut6qvtbunprG3xbext73BwrW0usS+zMa5wsC6vrnDt8C5sbSrqbq2u7m+tKmtsLWYmKesqqybq6uPq76erK6yo6ufsK2zrq62srm4qq6usai1r7S8vcqzqra1sbSwr6ehs6CbqK2gppaWmpqyoq2gpa+XoaSampKOo6aos6mhprOsqralr7G1r6SZna2nmpifmpmrt6KXk5GOl5yhl5aUq56akn+Sl4ydnJmWkIqUkp6ZpaKhoJiWkZOVeYqPhXuMioKJkWptd211e2FFYGtZSUhaWj17SkZENkFiVGlbTVxhSltdWlJSUmJhTEtFX2BgUUxJUFdWVU9HV1ZVTjpJVklIP0NLP0VESEhRTkE/SEhIRTw3PT46NzU2MDk/ODY2QiwtOCwvMDQsKCwvLSo3NikoOS4kOks1LiJUYFVgLzUoQ19RXC4qQi9KR1BbSDNjWVVLRJmXobGosaqtpqSvrrapt7W6pKy0t8m7tLq6v7+0s7fDwMzIvMO8t76+v7e+vLG8rae6ube2wraqrLC3lJanrquoo7CqlK+7pK2xs6eoo7K0sbKxtbG4s6muq7Knt6+2tMTGtqm2tqywramno7agoKexoaSUnJmVsZ6nnKCqjqminpuWmKampbino7K1rKiyp66xtqylmaCsqJucnpyUqbiclI6OipibopePmKWgnJSCkZWPnZuXlpWIlo+Ymqeco6CSlpGQlXWEkId7hIGDi4psb3Z0e35cS2VtXEtOY1w/YntHSThHZ1dlXExeYk1YWVdUV1RpXU9PSGFdX1BKSFFWVVJLSFdVVk04TVpORUBGSz9IQkNLU00/P0xPSEA7Oj47NjswNDE8PTQ1OD8pMDcpMS4yKSksLC0rLTkkMDQyJTlCNy4jQU5IZjI3J0diTFYlLUItPUVMUTwzcmtJQ0OQmaWupa2vq6ilsbO0q7eyt6CrtbnJua7Au8K4s7G1wsPOxcDBvbS9v7+6vryyxKepubC2tr+8rquysZugp7GtpqWvpZ2ytayrsbKtqqm0u6y1s7WttKyqq6isqbmtsrHIwLilurCpra2lqK6wpqWjr6SpnJ2cm6+ao6Oio5GsnqOgn6Kqpqa5pKy1tqWrrKitr7auo56jqaqboJqakqSzmY6JjYeQoaCUjJScn5KRg42Skp2al5WTh5eSlZmnm5+ejJKRjZB2fY6FfHt7homIcHJxfXx9XFNkb15OWWZcRkSWW0c7Tm1YYltMYGJOVlZVV1RZZ11RUkxjWlpUS0dPVFNOR0lWU1xOO1BeSUJESEpBRT8/S1NPPjpOTUM8PD45OjU9KzMyPTYyNDk6KDQ1KS8sMSgpKywtKiY1Ki8mMCkzODoxJiozQmM7NipIZUhKKztIPzNCSFMsPpBrO0dIj5yqq6KqsaSppbO0sbW1srKiq669zLquwLrHsbSttMLD0cXGvsCzvsHCu763u8SnrLess7i8wK+rsayfo6etqqiksKSqsqqvrLCvsK6rs7ynt7GyqbOpq6Wlo626rKqyw7q2rbupqKitqaiypamko66qqKKenKOtlaWemJ6ZrJ2ip6miraakrau4srKhqaKgrK+xrJ6gp6ipmaSZmY+gppeGhI6Ki56fjoqMlZuOjYSGkJSfnJSXlIaWlJOXpJucnIqSkI2Jfn6HhXx3foWEhXJxcIh1a19aYG5jUXNxXEs7hHxGP1d0WGFaTmNbTlZWVVdRXGJfU09OZ1hXVktHTE5SSEVJVlJdYzxQXUQ8RkhIQkc/PUpQTDo+T0o9OT89Mjo3OyoyNT4xMDQ4NSg1LyosLjMwOyksLCclMjM0JCwyLTg2MCkoMTxdSjAuSmdERjg8QjA1RUtYMUCVWj5MRZWYraiiq7Ocqqqwtq25tq+rpquqvcm7sL23wq+xrLPEw87Pw7+/tMDCw7q/s8jDq663rbK4v76yra2rpKeqsKmnqLGltK6qsK6tsrG0rLS8pbizrayup6ufo56wt6uqrbu3pbe2pKqnrKuqraGpp6axsqSnpaGhrJeqoZWboKaepKKqpK2jn6exuK6uo6aim6qrrqmdoqWkpJmgmpaPmJySgYKPiIWcn4uKjouYjY+KgouXo5uRkJqLk5KRk6OZm5qKjouLfIaBgYN6dH+CgHxydYukh3hqXmBuZldlh2NOP2eTTEVieVdiWVJlVE1WVVVUT1xdYVVLTWhWVVdJSkhJT0JHSVNRWW9BTVhAOkpHRkVHPj5FUUg4Q0tFODdDNzI6OjoqMzk/Li80NjMpNCsqLCsuIzQuLSsmKCs3OSomNis8LTIsJjA2V1ouMEpnQUE8PEIrOkpPXjREhj5IRkSXkrClo6uxmKuqrbastrKspqyqqbzAwLi4s7u1prKvxMnL0b/Bu7m/vsG4wbnAxK2xtbGzur+9srCtrKqrp7aqpq2vqrmwqLGyrrKtt6q3t6e0t6uspKmqnKOes7OoqKS0taC3rqCqqKuoq6egq6ypubapqqmpoqqgrZuSqqGdoKSipqOqnp2ntK+opqqio5ilp6eqnKOko6CamKCRjo+YjX6HjIeDnZ2GhIqKjY2Pi4KFlKKajYyZkJKRj5OflpiWjIuDf3SHgX5/eHSCfnl2foCHnY9vcWdncXhcYXOIa09emVZIbXhVZFZRY09NVVRUUE9YW2JVSFBpVFZTR1BZVUk+SUhPUVB4TE1WPTxLRD9AQTxAQ1VDOUFLPTU7RTEzOzo3KjQ6PSstMzQxKjgqKisqLCkpKC8qJiklMzssJDIpMjAyMSUvMlFiMDI/Zj1OWD5DLD5MVF8vSmk1T0Q7lo6xoaarrpqspa2wtLWwrKawqqm6vrvAsK65rqG3r8jHyNHAvr27vMK9usPAvr+usrKxtby7wbGxsquzqKS0qKWts7O5saOut7Kwsruruq+qrrasqp6qrJ+joLatqKGfsLOitaqeqKeqo6qhoqytqL2vrK6soqiooKyZkLCimKKgp6eep5uZqrGqo6CtoqGUo6Ojp5iaqaWYmJiejoqHlId9jIaEg6OWhIGBi4aNjJCDg5OgloiQnJCTkI2RnJSXj4qFhnh0gX98dXh5f3pzc3lnf4akdWleZGuAdGeIjH1TWHBeSnhzU2VTUV5NTVJaZk5MVllkWEZTaVJRP0NOUWFROklITFNJcVFMUzs8ST87PD07QEBXPDw/SDczQ0IxNTo5My01OjopLTMxLS01KSgrLSw0MiMyKScsJS47LiYxLjAtMTQlLDBMZzo0OF89YWQ/RjFDUFtbKkhNOVVBNJCPsqGkpqykp6Stp7WzsaulsKequL7AvK+nuaqmr7DJx8jRwry/vrm+v7zJusC4sK+0sbq7t8Cys7usuKyitKenrLK2ubOoqL22rra+sL2nray1rK2cqa+koKWtq6ecnquzpbSom6unqaOpnqSpqKm9rLSvrZ2qpKGunJuzo5WknKWln6Sbmqmrpp+bqqKbk5yhpZ6Yl6mpkpialJCKgo+Ffo6CgIedj4V+fYuHkI2PhH+TmpOFkqGMlJGLkZuSlYeJfn9ye3p+fGh4fHp0b3B7Z4R4hIhkYWdhcYR6bWd4XV1VQFd6bVRhUFJYS0xOcnVdSFpbZ1lFVWZQRD5KTkRDQTlIR0tTP2phSlE4PUg8PDw+Ojw/VDY6P0M0NUg+Mjs1OTAyNzw1KC41Ly0xMScvPktIMCUaOTAlLCwwOS8sLCs2JzE3Iy0wR2pJMTRYPWZjQUo3R1NgVSo9OURXPiqPlLKaoKCppqWhq6W4s7OmqrGnrbjBvbWvoritqKiwwsnJzMG2vcC1t7+5yLXCtbOytbK8t7m9ta25tr+tobOnq6uwtbi1rJ++vaqzwbS8oa+ztaqrn62wo5ylqKqjnpulsaewoJ+rqaihqZykqKGtu6iusK2gq6Okr5+fraaXn5uho5yfnJqkqqObm6WklpeVn6KWm5emrIyekZGRi4KKgICOgHuZk42IfH6Lho+Ni4qDkpiRhpOiiZKSh5Caj5OAiHx5bH52eXhje3pxb29xdmeAc2qDZ2RnX2xyjWxhaW9gbz5aeGtVXk9RUUpJTVRZV01dXmxXRFhgT15QSE1ERjs3SEVLTzxyaEtLOUFFOzs9PTs7PUo0OUI8MztHPDQ/MTgtNjg7MigwOS8sNC8uPS0qSz4qHTQ5JicuMzQuMCsvNCYsOiQ0MUFoWTEzUz1lX0RMNktWZE8qOzJOWD0jk5mtmqCYp6Sjn6ikuLCvo6+wqqu4wbmzrZ+4r6uotLrIy8i/tsK+sLS9t8S2w7GuubKzv7S7vrepubi9q6S0qKmqsa66saucvL2lsMG1tqKvt7Wmp6exs6CepKWnoaWZn6yoqZ6gqq+noKaYo6mgsbmfo7CvoayhraScpqepmpqbn6SVnJ2anqmml5ygqZOZlJiek5mWoaqRmoiOj4Z9h36CjX18oIyMiHiCi4SJi4uFh5Oaj4iVnoiRlYKMl4yRfYV7c3B9cXR0YHl4aG5wcG5ofXFje21pZWJeZIV+X1pyanFLSn9oWFpOUExKSFBSUElOXF9uU0RYWlJoT0hLRUY1NkhCTEk1WmVKQDZFQjk6Pj0+OjpDNTk+OjNARjwyQDIzLjo7ODMmMjwwLDg1QiopLUMqLDQ7Tk5AOzczLS4rLTcqKjwlNTM8ZmQyNE0/ZV1GTz1RWmdIKj4wWFY1KJeep5qdlqygoKGkorirsqW0tKqpucO1s62ft62urbC1xsjBt77BubG0vLa/u76vqr2ws76xvMK5qbu6t6eotamoq7Gts7Gom764pq28t7KfsbiwqKWnr7GboaSgpKSgl5uvp6Gfo6ivoaChlKSkorewoaawq5+so6+YnKqlqZ6Xmp6lk5udmp2mq5qdnaaXlpiUnY6Tl6KoopCIi4+FeoR+hIp6jpaJjYZ4gYeDiIuNhY2TmI2OlpiKj5d+hpeLj3mBenByd29vdF95d2RrbGtoZ4JtZXJra2VoWWFzf15aa3VpWUd9XVtYT09KSEhSVUYyOl9ebFBEWFZZZUxISkVFMDdGP0tCNklKSDs2Rjk0OT49PDk4QDg7ODo3QEk+ODw0LTM8PDc1KDU+MSw7QTEoKzY8IzhSPSoxMTM+RDUsLSc0Mis7KzEzOWNsODRHQmdbSFRDVF1oRS47MV9ULDKWo6KYlZ2pnqWho6G4qrChu7mmrL3Es7CuorWvra2vtMTEvbO+urexs7m4uri6rq2/s7S4r7/BuKy9urSmorOrqKqzrK6yo53Ctqapt7ern7K7qaalqK+rmaKnnKWmlJihsqaZnqWpqZyhoJSln6S5qKSnraaepaGok5+poqGhmZudoZKbnZegoqucm5qilpOVlpuOk5Ojp6SPiIqOhnmEfIWGfZyMiYqGeICDh4iIkYWVk5KMkJWTjY6Ue4KXjot3fntsdXJtbHNieXVoZ2lnZW2EZ2doZGZoaV5mYmlmWmV6YmBRc1RbW1NMSUdJT1NAIStqXmpMQ1ZVXmBLSEdFQy46QjxGPDZLUEQ4OkQzNTc9PTg5NT86OzQ+OEBMPT45Myk4Pjw6OSo2QDMuRTQoKyw+MC1OPy4rLTctMTE5NSwmLjUtODA1NzZgdEIzQ0RoW0tXR1VgaEIzNzhiTScynqSkko6lppyenp6kta2oqrq3p6zDwLevrKG1rqeur7fBwL2xwbewr7K2tbi3tayqvLSvsrG9wLeuvLyxpZ+2rKamtaqrr6GgxKyqp7G0q6y0up6oqauxpZieqp6opZKapq6jmJ6lqqGbop2XoJ2ntqavqq6hoZ2doZWgpp+ioJmbmpySmp6Vpp6topiXn5aUjpWYjI+YmqegkIeKioh4hXeCgoKch4qCiXt+hIiGhJCElpWPj5CRkJGNknuDlY6Gc399Z3lwa2psZ3Vza2JnZGJ0f2FkZWZlaWliZ29ZXlhdbWRgTWhXW2BWSUdIS0xSWD45YGxpR0JVU11bSUhGRUEuPD85QTg5UkZANzpCMDM3PTc2OTI6PDk3OjlETj1CPDAqPEA7QTwtNUIzNz0rKiwwQSpKSy4vKiszNzIyKDU3JCs3LjcyNjg1XHlOMj5IaVpMWkpWYmZBOjNBZEclNZykoJGMrqCamKCXpbSyo7K+t6Gxxbu5sLGjtqyrrqm5vry7rcCyr6+utq+zubKnq7mxr66ztru2sLm+rKWetaugobGlq6+fpcShs6WvsrC3rbWerK6srqKZnaeqpZ+VnKemoJmko6mcmqCclZyerbCmuaetoqGamp6YnqOapZ2WnpiblJqhkqiWramblJ2ck4yVmY6UlJinp42NiomOe4F0goKKmIWHfImIhISKjIiShZOckpKPkJGWjpB/gY2Ng2+Bf2Z5bmhramdxcmtbaGNhcn9gZGdqbmtmamZkbFxsbXZxYVRiaGNlWklGTE1PWFFQVWFlgVRAVlNZVUZHRkVALzw9Nz82PEZOYTg6PzI0OUAzNzgyOD83PTg+RkpARDkyLT1BPUE9MDVAOUAxLSsuMzw7SzYvLissLTI0OzYjMyopNi41NTQ2NVp8XTE6S2pbTVtLWGRjQEExSWRCJzSTopyPjrGdm5ShmqmysJ+5wLagtMG7vbmxprawqa6lt7m3uKy7r62rq7eqtLmtpbK1sa+psbe2sbO2u6epn7apnZ+qo6qtnarCma+lr7G2taysnrGtr6qim52krKmclZynpJ6aqaOllZqgnZGco6uqqbqfpqSgmJqanaGPa6KVmJxxg5acpIB2kauonpaWoZGJl5mAl4qfj3iFk42DbWl+d4RybIaKhn2EioZvXWRgZ4SXhmuLkJSSdXeLhH+DkIBmiIBodmlmWF1pdG5OUGpjZnGCZl5kZm5raV1dXomQhYhoT0tEOEVUZ15KSFBQVVVLSFNgb3RlRVtRVVBGR0ZDPjE7PTY9NjwzZlw1Ojw3NTtENDg2MDpCNz86PkZMQ0IzNDM9QEBAPTI4QEU9MSwsMDg+RzcwMS4qLiovNjY4LCMxJzIxNDoyNzZYgWwxNU9rW05cS1tmYj5HMU9iPCsvjaSah5Wxm52ToJyqraujvcWvqbfCuL28rae2saarpLi0srOwua6qp6y0pbC1oqe4trWop6y2s660rrOiqZ+0q56ipZynqJuuvZWop7C0uK2upKitqqumoZ+coaionJehpqacnKeonZKeoJiQn6iqo7Svo6KjnJaYmJejiKGPkpqGoYiUnqF/pX+nrJ6Uk52TiINyeIyOg4egdYiNaZeJZn5zeaBviIeDfox8f6Ggn5l/e4eedIiOdpuKbIeCg25pZWR7bXJiVIZtY21pmHFYaXBuhlddaVtralqIcG15codph4RaXkZOPkZeTUVSVlZRUFJXVGddTFlLUlJQRUdHPjw0OT05PDc7MDw8Nzk5OjY9RjU4NjA8Qjs8OT1GUUc9LjU8O0A9QD41OUdBODIqLzE8STkvMDEuKi8oLTQ1ODMlJjIxMTU+MTw4WIN0MTVSa1tOXExbZ189SzFVYDcvKI2ml4SdrJ2ZmZ2fq6qoqr/Dr7K5vLfAv6qkt7GqrKazta6vs7arqaWxraW1s5ustba0pqeos7Gtsqiunqqhs6mgpKSaoqSdsLeVpaant72mrKepqqunpqKgmaCopJqZp6OkmZylqpaTo5yUlKSmpqG2pKOgo5iVk5iTnIiukJiViamLmKOchrGApK2elJqflXmC1Kh/h5TAm8Z4d7Glt5ZkgMCcv3mEhHmPg3yQkJHKcZa8nMV7cranupB7gWyXsauweWhsWLGub2VpvJK8bmh6bXCP2H5Ta2K2sn6AcZR1mqGqkFdPWGFPVk5GVFtYUVBSi1xXW1BAXEVRTkRGSTw8NTc9Ozo5Oi49Ozg3ODs5PkY2Ojc0PkA+Njk/RVJJOi41PjtCPD9BODpKPjUyKjIyQkUvLjMyLisvKS0vMTg2LSAvNDE2QTE9OleDdzExVGtcT1tNXmdcPkwxWlw0MSGOppOBp6qfl52dpa2yqbHCvbK1v7W4v8KrprStramor7Sqr7a0qKimtqWoua+csrK2qqWkp7KvrrGmq56npLKkoqGfl5yhoLGulZ+joLS6oqqooKytpKKdm5qiqqCYm6mgn5ieqKiRnKeblJ6ip6OhsKOen6OWlpKYkpmFsGtqi42qfmeFloetZXGenZWap5ZxrqGkfne6fGuhj3axX2q0W6WAZZyRYGaBemZ/aXhqqWW+cmemjHaxanyxeHWSlGNtbaduXISgRWlnh5ZFdZxgfWZ7o6aCWV+Lq2mAknh6aqg4Sq9bV1RtY1pMT1hfXFdWO06IT1ZWL0lUU0pDRUY9PzQ2Pzs4OjkwPTg5OTk6PTxEODs6Nj1BQDY8QEhRRzkwNzxBQz5ARDhARz0xMy0zM0UzLi41My8rLyguMC46Ni8nJDIwM0IvPTtVgnYyLVZqXE9ZTF9nWTpNNV5ZMzEbkqKVgq2npZ6jpKqxt620vb6wt8WyuLrDp6mwrK+pqbGvpLG6sKSlr7OjqbmpnrOysKOloaqtsKyvpqifo6KxnKOdmJWYnZ6vqJecop+0s6Gqm6GsrJ+empego6qdmZ6loZyaoaekkJ2jm5ihoKyfpqagmp+hlZWRlpGahrWbtXmFqZm1mXeHs5u3f5OWl6uWfmuBpnqBhYaRlJJ3q2dqsVuse46HlHSIcI6GgX+IkJd4g4KLl4yDoI+FsHZ3n3Framx8i0+lWEhjY5l+Y2ilX3lxdVKSh15QqW1jcX2GgGGdL1KibltUa2dgTEtcY1hcWkI+sHdXWEEjTWhGQ0RBQEExOT44ODo4NDs6OTw5OkE6RTo6OzY6Q0I4PT9LTkg6NTpBRkJAQUQ8RkQ7MDIwMTtGLDAuODQwLC4oLzIsPjgzMR8vMi1EMTw8U31uMytYalxPWE1fZlc3SjhhVTUwHJeflIizpqahrqmos6yqu7bCsLzCrbi3wqusra+up66zqqKvvKuip7Wto6u2paWys6ijoZ2nqrKosKimnqCgsJagmpaWl5qgr6ObmqSota6hqY+pp6mbnZaYoKapm5+do5+coKOlo5Wbn5ianqOrm6WanJqioJaTkZOTnYTVk5m5cbDCf8aGfNaUnLt8m5amkI2cjKR6jYaigaWCeqx5j51Wr3uJfp9quVq5d4aDfaaCk3yYeqp5jp2Qe7FtjoR0kLuFbpVQr6fFilGgemNgqmJzcoZsl4dfU7W0yIWAiXxjpDNCnXVdUGpoZFBAWGZZZGFKSE1rSlpTT1lmWkNDP0U/MDw8NTk7NzQ8PDg9OjxDOkY6Oz42OkBDOzZAT0xIPDo8REhDQkNEPEVGODEyMTFEQi4wMDQ4MystKS4zMjM5NzEjJTUqPjM9PVF3ajYqWWlcSltQX2ZUN0c6YVA3MiWcopOZsaippbOqpbSnpLy3wbG6wLK2tb20tqeysaOxs6agr7apm6i6rqOwsqGytLGhpJ6ep6mxqbSppZyenqyXmZmXl5aYoqyem5eprbCoo5+OrKKnlp2YnKGmopiioaOhm6Kip5ueoJ6VmZumoZymlJubn6CYkJKVkJ2Ism5otXGriHCOpnK0dHO2e5uYpY2PnI2ifo+fpH6wdYOR0tF1W658hX+kb5uqpmuGhX2tfZeZj3uxc5Odj3izZZZ0hZ5unmaUUsmLWsJcn3liX61fdnOGYpeIXlnKnW+/gHVNS7VTVcZkVFFqY2VYQU9qX2xpUFVGSTk9V1JbVllIQj9KPDI/OzU9PDU2Pjs3Pjw9QztHOTtANzs+RDsuQ1JKRz4/PElKRkNFRT5JSToxNzQ2QD4vLjI0MjUyLSkuMjYsNzQyJh82MDs1Oj1Qcmg5J1dpXEFOVF9lUDVHPWFNNjIuop2Rpa+spam6rKa1pae2u7yyu7+4t7W7u7SmtbSisrKjoKywpZinuq6ksrGdtLiqoKWdoaqksqisqqWanZupn5aVmJmSk6OqoZiTp6uwpaKWkqyfpZKUoZykp6CVm6enopqjn66aoZ6ekJacop6cpZSdlZminpWZlpKbhax7d6h2o4+Lh6lvrYqDp4SamaKKkpmLon6Rl4euhX+Cs1xys1KufYKCpH9x1313hH6PnYaZmnevhoqRnIh3tGGaZZqCgZVskluwV0uadZh5ZmCtXnZ3h2eYiGpdr3eVn494bDV5yK6yX0JUb11nYEVQbF9wbVZVTS5lYmhTWVA7QURATDo1PzkxPjwxNj85OEA9OkM6Rzs8Pzo+PkU5LUVVSkVAQzpNS0pCSEc+R0s5Nzw0Njo+LzA0MzMzLjIuLjE4Ki4zMiUhMDM3Njc9UGtlPiZWZ1xAPVZfY042R0NgSTo3N6CdlKC4sZizwayosqeqsrq4tLm+ubiztr62pri0oLWtoKCprKCVp7asqLGxq620pJupn6CoorWnpqqkmZ6VpaKUlJyakpajp5uUkKetr6WhlZipn6KPkaKaqaahlZqmqZ2dpJ6tnaGcoI2Un5ueoJiYnJaXoaCUmJGmnYapfX2leaGPkIOqcK2MgaaGlqCiipeWiKOBkIeUqnt/i515b7FaqIOCiKB5dNh/dod0p4GOm42SpHyWkJ+Ee7JenGSgfYKUbZNcq1xbk3+Rf2hnqmNye4BqmIZxXataiaCPa25lT0pDoVxaTXRdYmZNWmFfcnRfSlU1SpqSWEhFPUhGQU0zNUE4Ljs+MDVBNzhAPDY9PEY/Ojw2Pz1CNy5IVkpFQEg2S0lOQElLQEVOOjpANC47PjAwMjE1NCsqMDUvNywmMjEoJCQ2NjcxPFBlZUEmVWZbPzFUX2JMN0ZJX0MxPTeinJqav6yYs8Kuq62oprSwuLG2v7m6s7K4vKq7taCxpZ+mp6eflKqxqbCqtq2qr6GYoaCmpKS6oqOroZebkaOglZWfm5WYoKCQjoypsK+mnZebp6afjZKkmKisqJWYqaien6CkraOhnqGOlaGYn6CSnJeclZ2hlZaPq5uPrm5ytHSpjHeKpnO0eXS0gZOlo5OcjImkh451uG+Me4uia2u2WqGGZZeXaaCip22UcrR0k5h/smqGkoita3WzYZ1mom6GkmuXXK1gTqF8h5FSc6NseX9+bpiGcFyvVjycd2ZUb24uW6dPYlJrZWJsWmJcYHB8Y1NZUT4+bW8yQkJAP005ITdANi47QDM3QzU4Pz8zOzxDREJKRk1JRjYySlRLRUJKNklKUD9IT0NGUD08RTUwOzswMTAvNzUsKywzMjYvIzAwLCwdMjg5LzlOYGVEJ1VkWT4vVV5hTDVGTV45MUE4pZqbnbuinLG/rq2rq6e3qbivtcG1vbKwu7irwbaqq6Gdp6SinZKrq6e2o7Oorqqhl5yooKWruZ2jrZyWmZClo5aOnqGcmJ6fkZSVq7avp5mUm6ypl4yUppqlraORl6uypKCeqKuwmaGikJmil6CblpuXoZOcqZ2UkKqZh9OTmrt0scSAw4Z91ZabuHmJkZiNl4mMp4d5orZ1fXd2woKasmCDunnAfHW4YrWBjIepfZaBrKlxe391vIinoGmdYaaOr6J+jHSHq32+bnO8dLKDdXiAim2aiHFtjaR0vV13fVthebxqWlZbaXpeaWFkZmJteW9ZW1lDQUByP0NHKjVIIic7PzEwPD83OkI5OT1DNDxATlpeYGBfX19aUFBSS0VGSjRITFJASk5FRk9CPEU4ND05MDIwLjg3LSouLzE4MCItMSwzHiw8OjA4TFhhRidUY1g8L1ReYEs1O0xbLTZAOaeZn6K8opexwrCtqaqssai5r7fFsbuzr7ywrsGyraajn6ShnZyRqqWqsqS1p62koJaaq5mnrLmdo66ZlaGQpqCTjZyjnpiempCWk6+5sKuVl6Onp5SQlqWdpK2fkaCoq5+cn6mksp6ipI6nopShmpyXlaSYj7CgkpWpn4WQmbaAkZGNuJV4gpObtXdubG5zb3mPhI6Jc57Bu7yZeoGyqHCAdJG5g3yGhouHjXuKho2XfKS7ub2cdXmzo3R2l3V0sHWYnmaGaY22dHJwd7aMXn95fYhng3lteWKLrHB0hX9YW6dpRGRZVGZfY11jUWZmcW11Qk1QTUQ7Wkw/SjM8MCA4PjsuMz1BOTk/PTs8QzZCU1laWltbWlteYGJgXVNHR0g0RElUQUtOR0VPRj9HPDc/NzA3MC85Oi4sLy0qOC8lJjIoNCQoPjcvN0tUX0cnU2JXOCpPXV09KztWVic9OjymnaGhv6aWs8K0q6qorauqu6+xxq+1tK+4p7W5rqukoqefoJ2ZlKykrqqmtqion5yWoKOdrKS+p6Gql5WckaKbko+hqKGTnpeSmJSytbasmJ2kpKKLkpKmnKWrnZappaacm6Kpp6ajqKGSrJ6Xop6Xl5idno+wqZOcp6KPa35pnKh5iXN+m451emWHe76/wLpukoJxlYVfcmpaXZqJYWSHjpVrYH+VY22cdmKUa4CalZRlXl9jcZuJaHKMfIaUZmp+cXR5fn1iW3h0gWhQXG6DfHuKalhseYFySUpvhXBOc01EVlxmYUxbV2ZjXk9abXZqclJPREVNPEhJPE0/MiwyQT84LzU/Qzw5O0A7PUM+UlZWV1laW1tcXWBhYWFgXFVHNURGVUVKT0hGUElJSDs4PTUxOi4xOzouLy03Nj01JiIvKjIsJTs4LTdJUl9JJ1NfVjQpUF5MKDM+W08nPzI+qJ+oocGkmrS6tqOspq6nqLWyrMissLSttqS+sbOnoaSqnaOcmpqsp66kpbWqpJuYlaKbpq2pvqiopZWUm5agmpOYpamnkZ6Qj5icsLK+rJunnaeiiZORqpuopJycrJ+jmpujp6yin6qimq6blaaglpWdn52XsaWZoqiZnJGenKOlmqejmp2ampqQloJobn1xdpGXlJGDibSpjYWYlY6KjJiWh5OVioOTk5CIjZGUmZOZl5qgoZqblJ+bjYJ6pIVsaXuQfYB1iYuCcoJ4eXZ1ioB7iWpzgXSDdWR3fXZrcHpsX2Jbb2dMWFllal9XWXB6b21mU09GUjlPWk5STygrO0pCNjM1PUBBOTpDPjxFTlNTVFZXWFpaXF1gYmJhX15eW1RLQ1NHS05ER1BMT0k8Ojs0ODksMjs4MjApNklSTzgiKSsvMiM0Oyo3Rk9bSidSXlQxMFReOis9OF1LLDwtQLKgs6K/oqOxsbegqaazp6WwtarJq62yprWmwKi0oZ6lppyllpagq6eso6S3rKCZl5agl62qpsGfq6SWkpyXnpiUlKKenqOokpCZqKeyw6+aq52qno+Xlqmeq5yeoa2YoZudoqWvpaGkqJ6rmJemnZmaoZ6enLChnaKnlZiUmZSho5akn5ihjpaUi4qNj5etj3uVm4KRgImpqIWAmJaKhI6fiHuDkIaFmpGHhomVjpuXjpCYnqOWmZKQnI1+jWWhs66EiYR3e4+Kfnd5em9neZCBgIlrdYF5iHJpc395dYOHgWp0Y3hmX2hkY2Rmalhre3Fqa1xTTFBEX1VGQD8/LDRARjs0NTs+QTs8Pz4+SE5OT1BTVFZWWFpcX2FjYV9eXV1eXVhWSktMQklPTVJKOzw6Nzg2LzM5NjQuKCYkLTEuLikrKjclKzwoNkNNTEQvVFxRMDVNWzE3RTRcRzU8LECzoLmvvqyrrbGyoKqmsq2irLOwxrCrraSzr7yktJygp6KhnZmXqKappqSms7WelZWdmZmwpq6+oKuikZGempmUkpahnJepnYWdqayitMezn6mkqpaWmJqnnqmcoKWrlJ+fnaCqrqiko6uhrJufn6CYpZ6cn5ywpJmfqJOYmZ2SpZqZqZ+bl2aDknxlfo+aj2N4jGxoanqQo6trZJmXfmeFimVlaWh6jaGOa2iMl5Gid2tqi5iin5hzbG56hIyGeVhlXYWCXmyLioJ2W2hzd3eRgIeCbniCeH9zbXmEc3eIiI6De2mFWF1qc2Rdc4hpa3xxbWNdUU5XSWRYQEo0PUY3P0ZENzE8PT9BQzs7REdISElMTk9SUlRXW15gYWFgXV1dXV5fXVpVT0RIT0tTTj0+PT02NTM1NTU0KiYmJSwqJS4rKyc2KiQ7Jy9BSVtJLjZaTzYpRVkvRE8xWUI7Py49pZ+6vLmvrLKwq6Wora6wp66tsL2xqqilrbCwn62YoKSeopqap6ycrKOmqKmzrp6Wo5CjsKa2uaWuo4+PmqGZk5KboJiZppZ7payiqLPDt6Wip6+fnpWeo56jnaSqqJKfoZ6gqq+pqaOqnqebpp6noKyWoZylsaSYnKuWoZ+bk6WYn6uZnn6+g4hytHKFnoWtaHe5xLhxkqGje6aYmHOqgnzLwMC7cYqjh4KefJaYiJ7AvYKWnZ2NnMHAe4F6kYyawr99a6Wyb4yBb8p6f5t3kYOOgHZ5gX95cXuAhnB4hYyTeWx1kWJlXnhkX2WBYl50aG1kYlhMVklRWkhPRDJJRT9EQj4vPD8+QEE6OERDQkNFSElLTU5QU1ZZXl9fYF9eXl5eX19fXVxTTVBHVU5BQD89NjQ2ODI2NiomJSMpKiYuKyopMTAfOSojPkhbTCojQ1AvI0ZbM1BZL1VBQjsvOJaiuMO0sK+/qamUo6+psK+tprK1r6ump6Wxq6CrmJuioJybqqeinauipamlpbSknqOTpq6suLSnr6KSkZmdpZKRoKGXm6Cdh6arpKutv7+xoamuqZeSn56imaOkqqOToKGenayup6umo6Gln6SknK2pkaSbqa2qnJ2rna2il5iml6KkmJ1/zpR5eqWBepaWm1+tj12OqICgoXynlZp0q4OAr15kjKl6qIeFn3SXkoizY4KrhqCNjbNqhK5zfJaHuGGCrVmjzW6QdXvbe3+ZcX6IknV/ZXuIdnZsfYdufYWQkX1rgI1fcGpvZmBfeGRccWhqY2ZgUlRTV15KT0Q1QUhFRDg+NjtAP0E7PThAPj4/QkRERklKTE5QUk9TXF5fX15dXV9gYF9fXVpXT1VKPT8+PDU1NzgxNjQoJyQhJywmJi8oJiszHTYwJDc7U0wrLC1KMCc7XDpMLSFQQEY0LjGtwb+/tLSwt5iekaOqqa20q6ayra2spKymsKqhp5uappicoq+foZ+op6OmoZ+wrJuelqaurbCrqKyglJKbn6WTkJ+kl52no56upKuwqL/Gs6ipsa6Wkp6copehqqqflaGenZyurqapqJumpqOgqpKss5aloqqqnqSnp6KxopObp5uhm5WUkZegcIWMmHWEqIdxsHydcqx9oJ+BpY+ed6uCfa1/nHKtfquHhp92mJJ7fJd+qoihi5GLnH2reoiSjqCAeq1WnMR6j2+SwX2BlW11cIxtZndlhm9hd25yboiKkY+DbI+OZG1zdW9gZm1kX29oam5mY1dTXGBaUlJDOElJQEM8PjxARkRDRUE9PDw8PkBAQUJFRkdFQENJU1dZWlxdXl5cXl9hX15eXVtaUkM+OzkyNDc4NDUyJiMfHCAxJyAxJx8nNB41LSY3PVdKLTwoPTEpM1ZARiEcRztDMS0rr9PFxrKzoJ2jjqOioq2utq+psaepq6iuq6umoqOdmqOWn6arn6KmoKmoop+esKyYm5eoqK+sqKepnpeVmqOikpShrJqdpqOvrKOstam5zbKtpq6slpWcnaKZn66snZahmZ6eqrGnqamaqqijoaqar7GiqKyvppmmq6qrsqSTmKSmm5WShaRqpHWJeql1erJxgqWJmIxwh5+ah6RfYFKrhH+ugpt1roKnhoafepmXhXtmgKOJpJiGgaN9qX6BlIauXnyoVZ2ikoF6o5+AfMOvxYxzr7SzuXFiqa/CdGiMjJeOgWyYkW5seHh3bmtmZGRxcGZ7aWNcVl9pWFhUTExRTENDQUI7Q0FAQkk8PTo5Ojw9Pj4/QT04NjtETFBSVFZYW15eXVxeYGFgX15dXF1bU0lCNjc5OTY2NCwmJCIgKCciKy0iJC4hMy0mQERXSCxHKzU2KjFQS0wjIEE5RDQsJ8LJ1dXAoZmrqKGvop+wtbCvqa2jqKeqq6uppKafm6WfnaanpqSdrJqjrKGkn6+inZuTqqS2sK6gqZucl5Wmo5CaoqefoKacsaajqLGstsiytamsqpWRnJ2imaCltJ2aoZScn6erqaKtmaqooaGpobOtoqqzsqKcqqiwsLellJekqJmdknyqbJ6Eh3WreXywboKki4iflpWelYHSt7S4yYCBsl5flKmDpIeHoHqYlZl4qslzmaOUp6iQkpqMfpqJmsbGd2WhgqVzgZ+Ogn2vXm+1Y7F1S6OGbadHgpNkjo+ckntvlZB9bnl0fHptW2VqcnFmgWpeYVhjbVxeWUlMTEtFREJCPUE8Qj9KOzc5Nzk5Ojs7OzMuNjxBRklMTU9RU1daW1tbXV5fXl9fXlxcXF1cWE1CNzU3ODUvKSglJiUkJiksNUZOUFBNRkxKVkYqTDAvPi00TlRRHRw7PEYyLCSopMDGua2psq6spaKdsrmsqqGmm6imq6yppqCmpJiro5+urJ2moayan6mlnae1n6KXk6irtrKsm6acoJaQpa2SmpymoqCqpq2ho6epsLTCsbKqraiUiZidpZuipK+ml6GVmZylpamZrpyrpqSeq6O2rKCxubCenK+otLS0ppaYqaSboY+CnU54moF/n3qEo3yCpISGpp6cnpSEuHt8ebmCf8zGw7Z3m6GQi59+mpaXiXafl4qkmKSnfq+Em4OehKx9mZRhpWyjcI+FkIF9l4RyrGCkcnGAmmC8fVJVdY6Ro5Z7fJGOh3J5coN9cFxsbndyaoBuWmNfaG5iZF1MTFFTQUhHRkk5OUs+QjEwODg1Njg3Ny0qNT09P0JER0lMTlBUV1lZWltcX19eXV9fXFpaWllVU09IQDc3Mi4sKi4rKicmP1FUVldXV1lYWFdVT1RGPEUyOlBbVBwbNj9HLC0gjIeZqaykq7mrr6CboayztKafoZWmr66uqaadpaWao6ehsq6iqaeyoJmppJSitaKjlZeiqrW5pJyjnaOTkKGymZ6bpqSgoq+tnKSoorWxw7Gtqq2qkYeRnKedo6SdpZeemJmZpaOnmK2hrKKkl66lu6yht7eunp61s7mytKiZn7GipZ+Hj9G1w7d5h46FkZOPgKZ4lKJ3i6CShaWCi3GrhoW0bnJpmaOclYmffJeZhoeQc66CpZuijKaKk5yIlJCabXCyXKVzk3qcbJl/e5l+bqlhonFxf59ic7K4aHePk6SYfYqLkIh2e3iNgWxod2l4c25+dFxkZG1tZWhgSlpXWDxIRj9UM0BGPjwqKDYzLjAxMykmNDo7PD0+QENFSUtOUFJUVldXWV1fX15eYGBdWltaWFVSUlFGOjIyMzAvKysoQFFSVFVUU1RWV1dYWFdVVVZUUU9RW1UlITJBSCMpJZJyjYqtv7+8u7Wel6ikrbahopmVo6mnrqmrmaWhnqahoLWnoqmnsKOUq6OOpK2jnZCamqq0tKSdppypkpSXrqCgnqajnKectZmhqqO1q8KvqaupooyEj5yioKajlpqanJibmKajpZeppqygo5uspr2slL6wrZ+jsLS7rLWonaqzpamZe6iRfXywd4qBpKWInG2yb6CHrXuhj4OolpmArImFroWglKihopeFn4CZlYB7kn6rgJ2Zloqqd52gj4iTkn95r12jgXymp2SegHyXdGuuXaVrcYWZXWBbjKBtlJClmIKTi5OJeHmBln5qbH1ifXRtf3lgZ2VwbmdnaEJZX1s9SlMyVDhCQkM3JCQzKycnMywgLzY2NzQzNjpAQ0ZJS01OUVNTU1ZaXV9hYGFhYV5dW1pXU1BPTkk3MDUyLiosQVRWVlZUVFVVVVVUVFVUU1NWV1dYVlVWUUhGSUojKCi8kpqEqcbDtsG0n5qtoK64paOOm6SjoK+uqZ+jnp2tmJ65oKKroK+qmq6hkaqppZaJmo+usKymoKibrZiZj62ioZ2loZmknK2Xn6iltqi/rqSpo5+LgI6bm5+mnpKUmZqUmpqko6OYp6qqoaOeqai+pZfDrKujoqyzu6yvqKK1saqsmXavfpCKnIWHfbqtiZhksIxlla19oY+Dp5abga2KhLCFppmjoaKRhaBbbGqBs2B/rXt7goCxbGdtmZeLiLFbfbRbpINryKJln4F7vFl2tVqyfVKvgHqsWIChbZeOp5mJlY+TlHl3jJt8Y3N8YYN4c398YWlmcG1mZWVPVWNcQVRePUgoPjk9NCEhLCQfMi4gKjEvMDQ1Nzk6PEFDRkhKTE5QUFJUV1peYF9gYWJfX1xbWFVQTkpHQzU1My4vQFVZWFdYV1hYV1dYV1ZXV1dXWFdXWFlaWltcWFdXR0I70p+0sbe9u7TBs6Ocraaltqmgi5mgn52zsaieop+dtJigs6iqq56wrZ6sm5WuqKKOiJuOr6yop6Ooma6Tmo+pmqGepZ6Zo6KlmJ6iqbKovK+lqJ6djnyLm5ahoJmQkpqbkZmXqJ6fl6espaSkoqSpu56gxqelqaKstbeur6ihva+urpeBqZKjro6bgIakl5iQgYC4w7qDjp2ThKeYnYKsioKviaecmqWrkX7VvcKqYqO/vXx+o4KD17q3tYWTkoKevb6EaqOBb6uEbp1/erKxx4Nrq7C9rHh3or67dICVjaWajZmOlJp3f4+ZeGF8eWOMZ3iBe2BrZWtqYVBiW1NpXEBUYEJMKTw6NS8fHyQeJTIgHSQoMDQ5NjY3ODs+QURGR0pLTU5OUVRXXWFcX19hXmBbXFlUUU1IQz48QT81PVNZWVhZWVpZWlpZWFdXWFlaWllZWFlbW11dXFpWWFRXWruVtLSxv7qyvbOina6mpbOmnYyYpb+ptrCnob+mprGbnrGcuaifra6lp5WUr6yXjIOaka6mo6yhpZyqoJiKo5OmnqebmqCoopidoKysqbitp6Oal5N7iJmSppuTj5GYmI+YlKiZnpaop56ppqGiq7ueqcWjoK+jq7S1q7Gror2qsLCcdHaqpLeFZYmfcGesj4qPbW93pJCaoIF1sJqWcJCNcpaoo5uYrqRybG1sZYp4bm2CmXGAemlwaWaJlpWXcWhphYZncIZkXYpjaW9ZXWd+eKZgYnKPkm9mZICNk46hlpWWjpSbeoWNk3RkhndnjGp4fnhkbGNmbGJLZVdKa1k6UGREUCdKOisjHCAaIiwpGBsYLTIuNTo0NTc6PD9BQkRFSEtMTU9RU1ZcV1pcYF9hXV1bVFBMSEQ9OkFCN01YWVpZWVpZWFhZWFdXVldZXV5eXVxcXF1eXV5dW1tVV16ola20qbq5srOqqaKunqSzqpiSvbHDx720qZ6/q6yjoKarn7qjpK2sraWOlq2qkIyFlZetn6Wqop+ko6CRi6WSp5mpmZajqqCWnKWmp6+5qquam5OSe4SWjqaXjpGRmJONl5Wmk52Wp6GZsKadoqy5oLDCqKSzpqyxsquvram6pbC5l4uhqaW1nImWopiGqZqQlJ2TqrOZm6OsobSXo6GeoaKcoaShlaynjJKTjIeSnJyUkJmTmJCOlYR/pJqXlY6Lk5KKj4aEfmeLgHSDdnSHjHGnbXyVkpSTgYGPj4+OnJKflJWUnoCFkotwZ452bol3dXx5aWtkZG9jVWBYQGlaR2JgTlgrRT0rJiE2NDAvHxwhJTIoKjc5OTQ2OTs+P0FCREZKS0tNUFBRV1VWWV5fYWNdXlRRSkVDPjk9QEFTWFtcWVdYWFhYWFlYWFpbW1xeX19gXl5eX19gYGBfWVlgpZapqqS1t66uorCkrZ+gtrGQjqrEu8S5t6mhpZ2bpZ2wqKO2p52ptaankZiso4uIiY+cp5aso6GaqJ6ek5Wjl6iaqZmUpqGjj5qnmaG0uaeqmJqQjXyBlIyhlIqVkZWQj5KXpI6dmKeem7Wjnaast6ivwq6jt6ewr7Guqqu1u6KxvpmSpqSmtaKSnaaejamfjZKfo6ywm6GksqqxmaWhnaSrnp6dnJesnpKaopuUkJaqmY2YmJaQlp6Rh6CdlZSFkoyQjZWLgX5mjYd1h3Z5iIR0nGqHkZWVkop9jJaSkpeRoJGalJ6ChpaFeHGUcniJfnF7fmluZF9waWBbX1ltYlBgZE9ZOUdGRT0yPD04LyomKykmHSY0MDY2NTg6PT0/QUFDSEpHSktMTVNTU1VaYGBpYGVWUEpBQ0I7OUVNVlteXltaXFtbW1xdXV9eXV5fYGFhYmFhYWBiYmJkYlxbY5eVpKejsLOsrqOpp62gqLWqkI+co7K6raqroaKZepyisKSlsamWm7imo5SYqZyOhoqJm6KQrp6klqigoZKXmZuui6qWj6iZqIyYqI6euLajpZibjYl5gZSMm5OKlZGUkI2RlqGLnJynnZ64o3+Dr7WisK90pL6jsqB4e6GstL2Wd66loIqAqX5kXGJ2n46knYOXfm6UtJyjqK+spGWfoJR0epqXcYCZqZhsgKOoimWcpZuQl5iWi5KbkISdmpCUg5KHjo6SiYV3a5CIdodxfIaBgGFpiYuVk4xbdpWRZ2iPjHF5opaWZHeXhoB2l2iCiYJueX5qcGVfdm9ra2dcZWNhYW9SWj1NTU5SRj1AVEI5MS8eHyY0OjMwNjY3ODw7PkBBQkZIQkdHSUtMVFVVWV1gaGdnWFFJPERHPDlWUltgYWJgXmBfYGFhX1xdX19fYWFiY2RhYmFhZWRjaGReXWaclqajobCxrKuppamtpKetpJKWqrSusaWZqaaql3OLna+fqKunk5a4oKCPnKSekH6IiJqejauapJWnop6Ol5GehXSuj4ilmqiRlqOIm7mzp6CZmYuJdXaTjZaTipORkJSMj5OfjZmepZibspaAjJu1nbSMko+9p6F+p6J7pLC5go6Pp5+Ei4WPsamvjImWopl5gYushpydoqirqYiVh5l3pZt6h5yBl6eCgXudsnqKhp+XmZSYloGQlpaEmZpjeYeQhI2PkouDbnGQiHqBcYCBhn+GdIeFlpJ4lmiTdKCadHuZgp2ahJh9kYiBgphpjIyEanh6cHBnZHdtaWxqXGRpaWVyW1xIVExRQEU1LVlUVDYpITA5PT42NDM1Njg7Oj0+Pj9ESUBJRUpLR1JYWlhbYWFoZllRSDlESzw+YlZeYmRlZGBhYWBiYl9dYGFhYmJiY2ZnY2JhYGVkY2djYWFonZijn6aurquorKCosKenqqWZlK3FvK+glaWntJ2Pg5yrnKaioI2Qvp6ZjZ+aoZB8hY6ZmIisnaOWoaGSjZSJhoCRqI6Hopyjk5adhp65saedmpOPhXB1kImUkIqUj46bi46RnZCVnqOUnauHn7SJtJqui8qIq6+Jt4WNsIOysIWpjqeYjZ18qI9ye3ebjqaWaJWkebSLn5+nqZOZwoJ/q4iYoXGegJqlfZeFlbKAoX2gk5+PmJeAjpObiZiSi3yFk4aNlJOJg21zkoaAe3KGgYR9hXWGgpiBj8VmgKmHj6JqnYGel4CZgIqLg4iYb42ShGd3dHt2Z2h1cGdoa15ibmxmbFhmRlxRTDJFNDZNYWM3JjQ8REdEOjYzNjU4Ozg+PT0+Qkw/TklKS0NQWl1cV2JeamxcUUU9S01ASmRYXWNnaGdiYmJiY2NgX2JhYmNjY2RpaWNiYmJlY2FmY2JiaZWXop+wqKmopaugpLmxqaummpSeoqSqopWkqbWir3+gppylnp2JlL2Zk42gkZ2PeYOWlpGIq5mcm5qihY+Md5ucjqCRiJ6km5WYl4aiuKylmZuNjX9ibY+Lk5CNj4yMl4uPkZ6Nkp6gmKCnfqGnh62doJaukKCenZGGgqCNrLGIpI6rmoyafqJ1gJiTa4GrdE2reIeNnZKbqamCqqt+hKF7eqdpnn+SbGeXhpi2iZ5+bmBjWIOXf4x7ZGeLc5l9eZZrXXyXbl9TcYVcYGx5g2BZZYJ+hIGYcaeqa4OjbnKlcJ+CnGdknmxabIh6ZVlfgn5hV1BvdmVtdHFqam5eam9sa2hXZ05dWEU5QDRHRF5rNCtJQ1FNTj04NDg1OTs2QDs7PkJPPlFSTE1CSltdX1deX2J2YE1FOk1PTVRiXFtmZ2lpYmJkYWRkYmFiYGNkY2FiamtkYmRkZ2RiZ2VhY2iYlp2guaCqo6askaG2vKuuopmWn6Clq6ufnK20oaeRoJ+fppuZjZi0mZCLnoyVi3WBlJGNiqaWlpifnn6ThYaso4eckYqYqZiZmpGHpbCmopWZiImAaW6Ih4uOjomLjJGLj5Ggi5Kdn5uhpX+TgY+joZSgd5yWkKeDoqiAhquvhqV6i32Emn2icHKSh5Z7nox5bYebi5mRnKmcj4edfIKic3amZp5+d6RemHt9k3Oibpi3tLpzk4eBgLaoZIHGuHtwlbaMcYCbpGN0rKtgfWqds35ufYeDj4KLl3GAo2xzpHOegn2jXpyZs5Zve5ees3RyW56ygmlib3N1cWhuWGtrcnJkW2ddYUtEPUQ1UUFacTI8UkZfSlM9PDM5NTo6NkQ7O0BJUD9UTU5RQEVfXltZWGBge2RJQzhMV1VWYmFaZmZra2JiZWFkY2BhYmBkZF9gY2tuY2NkZGhkYmdmY2holJaVo7mZq5yToI6luLWtraCaoZuio6Srm5qxrKqSl6CYoKSZmpSeq5uLiJJ4i4VwgJaNio+hkJOUnZd9kYqOqKCHmI+KkqKTm5qMiqinpJ6PloeEfmt7h359j42Di4+PiY6TnoGVm5+coJ+LiXecmKKNoHKii4ipiJynkZeprICujH16oJl5o5N4gHOXiIycfZafhpuOmZynh6NkoX2JlpCbjGyeaJqNbpqZe4CKp31yZ3Oqg52Cc6pnlJpdm4V2hJ1oqmqBuGZcqXCBnGGVjF6ndnaJioCdaJp1h5OSmI5/nm2ZkGqmmVyofne7an2pWo6EXbNnXG5xeHdraVtwaXd4YV5kVmFBUEVPN1ZCUm40SlpZXk5aREAxNTE7OzdIPzpDR1U/WFJYXT5EYl1WYFFhY3xpRUI5TlteWWRmWGZnbW1iYmVfYWFfX2BgZWNeYmRvcV9kZWVrZGNpaGdraZWciaq2m6iJY5WcrLqysKudpZuap5+drJmdsKeqnZaimaGfmZaWoKOZhomNaYiAcXuXiIyWloSSlJiPeoqElqOciZWPhoudkZybiI+oop+ajJGKgIBpgYZ5f5aMe4iNjoeOlZl+kqGeoKKTmHJon4qgj4xwkoyCqYiZoKSpoql9sK2koriXdqOzoqN/iJR4nXqrmn6ij56cmImYcqF9hY2wtX1rmpGheH6YtKOjq6iEmHuafJyafnOqWl1ve5eLeJ5iTH97e4VkephCTZ9ZompyfI5ugYqEmXabeYeJsbN/fpqSpnR+nW1xfJRvmXJpo12VdkhlY2BzcH19bmZfa2h1e2JjX1BdVlxUVkBZRVFnRVJWXGFYX0lEPUI4QEE6SUU4TEVYQVZRWlZERmFcWmBLYG19cUVDPFVeYlplalZoaG1vYmZmXmFgXF1eYGhiX2VkdmxeZWdmbGRlbGhoa2mUnYGxrpmEU1+hp7S6s7OomqKLmqmbnKeSoKujoKeOnp2cmpmVmKGdloeHiXeFgW55lYWQmot9kZOWiHKAiZKgm3KSkIGImZSfmoSOqJuZlYuKinyEbISFcYGhjHiFjYiHkZeTe5Gin56jiK6GfbWEj56de6aWeqmClp6Ri6Kefqdod21+mXOgc3F8nYWYb5OCrn2jg6efm4GkcF6paHWjY2+lYZzTj3x6mXhyc2OihY9+onKijnVrj7OLYIKYinOqsqe8f3eDbX+/pqq0XpxvfnKXb4FzonJepGd0pmBopmya05h6gptudnmXa5t5dpdybKmlZ19keXB/hGtnZmNtdXdmX2FRWmVQUWFIV0lUX1dTW2RqW2VRRkNLTEpLQkpFOFBAUE1YU1hPUlFgZWVpUmR4eXdJRkVjXWVaaGpTaWhqb2NqZmBjX1xdXV9pYmFoZXxkXmRnZGtkamxmaGxomJt/sKxUXEt+qa+ytbCyo5yYhJemoKCjjKSnn5eoiZmXmJOZk5Ggl46IhXtwfYRofY+Dk5qBd5GOj4lwf4ePk5JsmJR8iZGSo5WDjqqak5KLhYl5hHeIgG6BnoZ3gJKFh5iglXmSoqOZoImzoaK2i3qsp6SupXCpgJuRhoGdk32kgKKZhphxnoSira6Jl4uAjKSNlYOvopV2tba2yaJ0lIuCnmGel6lteZWGoJt1oYd3oH2QloqBb0xmo5JwmohzpXt5dGKDgmx+oGxyZGCccn90l2t7arS1tMamc5h+epxqmpqrdIGabHN3l2mZeXSXcVBEfbNeanVqeIdma2didHRwbVVcUlhnT1JoSVVMWFJVXGdrblVnV01KQUpNSkhKTkFRSlBkY2ltZXRyc354e251iXt7VFFPbV5oW2tpUmpoaWxnbWZjZV9cXFxfaWJkaGt7X11kZ2NqZm5tZWlsZaKciK+nhWY/lKGzrK+vtaKij3+Wp6Kho4ukppybpYGal5aNl5CPm5OOiIN5anmGZYOMfpafeXWPiIyCaYSFkoOMhZ2NeoyKlaWSgpepl4yRi4CJeoB9i3lwj6CGeYGUhoiVnpR+k6WnnJaWhGdueJxsomR8caV4nJhwaKeCmI18pHqgloOWcp92gImUlY+5bpCKomJ9maKWiW5zaqtrdaBtb6Zgm2mLkGmWh5qVdaKAfZpfi4WMdW+IYmihZZ5/aZt1cGRniIJucqJaX1tjoW5diYxwe390cmSlbniiZGanaJdyi5huoW9SiI9uoF5kp1SLXVSYbW1yanGBbXBoa3hza29RVlVVZVlTbUlYT1xIWGhoc2pZa1ZQUkVWXExYUmFVaGped3V6fHB8fHKCe39zdo2Ag3ZeUXNhZ2JxZ1BraGhrbG9oZGdfXV1dYGpiaWl2dV1cY2hjamlybGZrbWOdpZmmemV0bYunrqWqsLGmn4t/lqqcnaSLoaGZoaGAlZiTjZqPi5eQjot7hnGAiGiLinyXmnN0iX2QfGWDh5WKiZaZgnyIhZamkIGiq5CFkIqBin2AgI5zaY+lhH2Fk4yHl5+NhpGppp2JpniWnH6liZaMspmekYOvl5+leZeJeql0po+Emm6looyShIyDvG59pa+Ch4aHlJedoX2me3KolKCWZ55+b6xjloqVkneobKmigYl2h4J3q5GmiGuRsGt2s4ypbIuGb2+gnpGUYX+ri6p3gX+Op593n32FpJWdoGmah3WsZp6tjLZzdr6Mo5NZg6aNq2B1cXNve3VwYmp+bmhsU1VZVWBgXGpMXFFcSV1sbXZgW3FYW19aZ3Nlbm9xY3F0YHd6fnlyeYNyg36Be3uMgYKAdmJ5ZGRuc2RSbGdnb2xyaWZpYV9eXGFqYmxsem9cXGJpYW1pd21nbG5ilaaqnIGAnqSWqqqeqKeuo5iIgZaqmZ2jiZqknKidhIuaj4WckYWSjYyMdIV6iINvjYR9l5NzdYZykYNuf4uShoaUj317goWXpY1/paWNgI2JhJR1g4eSb2yLqICCi5ONiJueiIuSqqKgkIB0lJeIfoF5lK+kf4GccY+GeZKMhYB7cqeMcX19epeWm4SNeHt+foiUlZOLd5GZoKGEe36Ja4yFW3l5c3lwaW5+kopyf3SBj5STcYWDgmWNf1+BgIx3dnSUdW97b2+JboSGXndpeI5mgoOGj6qcf3R9l2qJiG9/dXyEdW1sZoxzd3uXd4Raald5j2htd3Jxb3d4b11shm1pZ1ZZXldcZGtkVWFUXlFfb3d5a2p3ZWpqanV8cHF0c2FvdWJze4F4dXmBdX+Af4F5i4WCfXttf2xkeW5eV25naHVreGppaWRcYFpjaWVscXVuWltia2Rsa3ltaGxvYY6Vuamni6Gim6akmaSdq6Kfg4OWqpGdoIiZppqomIOBm4t+lpSHjoqJjHKCfI99fo+EepeOdHKEcJWGe32Si4aGkIV4foCGmKOMe6ehi4WPj4SVgoaOmHdxhKqFjZGcj4eenYaKmqifoKqDiY6Vm39+ipetqJCTp5B4cZ6Tg3uTcH+phnB9lXFqb3yBn4t/ko6LaG5dhIyMnJygj3OWjIhxdGuCdnSAWXJuhpGCfn6LaV1pY3qFg4iAX2l4e5x8g42DdoGHg2l5jIhrYnFyg3dfco2CipColodnjY+DbneLgm+Di3duZGZjeYJ6lVpbaWZtdlt6eHd0bXNygmZcbYpra2JZWF1ZWGtxW15gWV5dZXJ9enNvdGNqaml7fHJ6d3RkbXRobHt+dXp8e3l5f4B/cIaKhHt9c356cn9oVFxyaWx2cHVna2dkXWFZamhranFybVdbZW1sZ3J5b2hqbWCMjKqxoZCjoZqfnpiemaiioX2ClquMnpSHmqGQpJR/e5iEfJKZiIiGhopyfYCLdoWLgYSWinJvgHKZh4R+koOEhoqBeoCEi5qfj4KmoId4jZeIlYuLnJeEg3qsgZCXmZOJnZyGh6Gqn6Gio4uIk5udo5mWqqKop6GTnImYkHx5j4+FqH5+kpGSk5yxpZqUnZCNsZKYhKaMjJacoIqRnIOJkoprfI52d2WChpCKfYmdhIeLj4eIgIWEkHd8e3Wbo4mIi5+LhpV/fo2CgXZxdIaFf3iJiIuRp5GEh46Ig4yQi3uFiYeNf3VqgYN7eZlpcWhgc4pwfXp3dm92c4FcXm+HZ25fXllaXFJncVVjW1thbGh0e3xybnBjamlof3tteH5waG9wbGaAe3KBgHd/fX+Ee22DjIZ8enh8fnqDeE5kdmpzbnF7ZWtlYmJgW3NmcGZycWxVXWx0bWh4enBnaWtljYieup+WoqGYlZmYlJikoJ16f5ipjZ6MhZ+cip2WfHiUgnuOmYmGg4SHbXiBgHKAh36Ik4RtbH56l4eEg5B+gIaEhn2Hg42bnZGGqZ6CcYqPhZKRi5yRfY16qYONkZeVjpyWhYWbpp+imp2Gg5KamZmQmaagpp6ekJeCk4t4fYiPhaZ8fI+QkYWYqqCck5yPjaqNkYCejYmUm6CDj5d/h46DcHiGcXRhfoSPhnWMmICDj4KGhH6FhJVueXZ1k6OMjoabhYWOdYCMfn1yc3yJhHt5jY+Fk6iQh4SPgoOJiYh1hIaGiXptan1/em1oa2xmXnl+Z3x7dnR1dXp3XGBwfW11YGNaW15RZm1TZVpdYWtpdXp+cGxsY2pqZ4B/a3J/a2pzbnhug3luhoB2goB9hXZygo2Hfnt6fH97gotgaXtrdWhpg2VqY2BpW2N1aG9idW1rVGJxeWVveXpyZWptbYuKn7iaoaSfkpGWl4uan56denecpZCbiYaklIqYmXh5jYV8iZGDjIKCgmx7f3hygIV9ipB8a2h9gpeJgYiOfH6GhId8j4CPm5uQh6acf3CLioyShqChioWMfKeQh4+SlpOWknaMo6ChnZaaf4GQmpmTjZqioqSbmJGcf4+GeoGFj4ihgH6MjY98l6SgoJKZkJCmjI+BnJKKlJicfpOTfoeOgXZ0gnB2YH2AjodyipZ8iIxxjH6ChYWPaXhyeY2Zk5CAmH+JjHOCiH19cXp8jIV7e5KOhJemlIyGkXyEhYaEdICBhYV4ZHF6fnh5cGtqZl59c2h8dXVzfHN/al5gdHZwd2RjWF1eUmpoVGRYXmFoanZ4gXFma2NsZ2V/gGptfWdtcGp9d4V6a4uBcoGBfYF0doKMhn98eoCBfX+PanKDbnRpYohpbGJfcVV0b21uYHhobFdqdHZjdHp6cWJrb3mJjZ+zkqWlnI6QmI+GnKCam3t1o5+Nl3+MoYqImpV4e4aHfoOJfoiCgX9wfnp0dYKFfomQd2djfYaXi4KKjXh9gI2DeZaAlZeVjZWfmn1vi4GQk4alm4eMiYOmlYSSipWXkpF2kJ2hoZiUmHp/jpiXj5eanaSemZOUnHuRh4R4hpeOnn6Cio6Mc5einqCSmI6PooyLg5iZhJOWmn+YjXyJjYF3cn5ue2SAfIuGcIaTgJCCa4eDgYCJhWZ2b32Ik5mOfpR5jIl9gIh9fHKAeYuGeoWSioyZo5eDhIx3h4OCgXV5f4aDc153d3xzfXdma2NgfmlqdnN0dX1xfGNjYXNudXJtYVlfXVprZFJiV19gaWx1eYZwYmpjbGZofINraHRobG9of3yBeG2PhnGAgoJ/dHyDjIGAfnqCg358kG11iXR0bWWKbGpiY3VWg2lwbmB4Z2xhanZwZXh7eXBfcWyFhZCdrpimqJ6NjZeHhZ+Slpd8dqibiZh5lpyLjJiPeHuAi318g3uAgoF4c3h5c32Ag3+IioBkXn2LlYh+hYh0fX6Kf36YhJaTloyjoJd+cYd7k5GKpo+MjoqSoJGDkY+Tl5CKgI6XoJqSkJJ0gI2SlImdnZ6nmZiOlZh1j5CLbYaZkJp7h4iQiW+XnZqik5WKjZ6MhoGTnYCTk5aHmol8ioqBenJ6a3VsfH+Lfm6FkoOUeG+ChH5+i4Blc2p9gZeYhYCOdJGJhHqIfnZ4gX6HgX2EjoaNlaWReYWCdIiGfH9yc3+FgWxfeXR4cHtuYW5iZHthbm92c3d3c3NhdmBvbHVub11bXl1dal1PXVdiYWhtc3qJa19pZWpjaHeIbWZsaGlsZ4B8endvj4dzgIOEfXSBhol6g316gYR9fI5yeYt5eG5sh2toX2lyY4docW9ldmdtbGF6aGp8e3dwYXdti4GZmqqgpKidioqRhoqdipSXfHasl4yWfJ6TkZaUiHZ9e4p8e4B2d3+Ab3Rzem+FfYGAiX58YVx+j5GGgISEc3qAhnqPkYeRkZuSpJqTgXyBfI2KkqOIjYqNl5qNhZGYk5WOiIiLkp2TkIyNboSQj5GJnpmioZeXiZeScIubhWeHmo+Ue4mFkIpwlpqUoZKSiIuZjIJ/kZ99ko+TjJqPe4qFh3RzdmtxbnZ8i3RuhpGOknF0gHyBgoh8ZXFten6blH6FinWRi4F0iHlugH6BiH2FjYqGjpaqjnuIfX6KhXd9b25/g4FiZ3dzdG56YV1vYGp0XnBqenh4bHJwZXldbWxzbXNYWl1fYWpaT1dXZGNmcXF/iGVdaWhnYmdxjW5kaWdlaWeAend1b46Ec4GBg3x1goiFeIV8d4OFeoCKd3+Le3tyeYNqa19waHN/a3FubXFnb2tle2Juf3l3cGt2d4l/o5iiqKGmm4iMioGPnIaSm3SAqZSRjYagjJWTkH9ze3aFd3h/cnN7hWtyb3ltiXZ/gIZucVtZfpKNiICBgXZ1gH9/oIaPipGcl6CTlneJfoCMiJydiY+GkpeWhYiUmI+Wi4uMjYydio6QhG6Ji4+RipyWoZyYloaYiWyGpYVnh56Lkn+MhIyBd5OYkZ2RkIiJlI1+fpCZfJGNkI6akn2LgINvdnBsbW9we4Zpc4OOmIpwd4B1gomDeWdzb3aCm499ioV7lZJ6d4l0cIp8h417i4eFio+cpIl8hHaBin93d21qf4B/XHFycW9vd1ldb2Bval5vaXx6cG1tam13YHBva3FtWVhgYWFtV1FTWWVmYnVwhIJiXWttZGNma5JtYGZmX2drgXRxcnCLgHR/goB5doCLgHmGf3eHhnaDhXuHjIB7dop/anFifGKFfG9wbHRqaG5sdndfcX54e3R1c3+CfqWVmq2fp5aFjIN+lpSCjp50ip+TkoWKmoyVjYt6cnd0gnByhXNxdYhsbmx1bYh3g31/bW5VUYGrlIeCeYB2coJ5gqCCkYGSkZebkZl3kHqCjJKkmpOOiJSYkoOGlpiLk4uIjo+InoSQinxzi4WIj4icmZ+blpWAlIBph56JaIehiJOFkYSKcYORl4+ajo+Mi4+Nd3uTkXuOi42Sl418iHyBa3dqbmtsbXp/Ynl+jpaBdnqBd4ONfXpodW11iJaMf4mHe5SRcnuFcHeNe4uNe4l+hI6Rn5+GfX14gYp8dm9oa3+Ad153b21rcHJVXW5hcWFfbW55cGdwZmZzdWhxbGF3ZV1WZWBgclNQTltlZFx4cIh8XlxocWJiZWaRaV9nZFtnb35va3Fzin12fYWAdXZ/jHl7hoB4iINzhoV+jIyEfHmVeGZxaoNfh35vb2t6YGltdH90X3N8eIZ3c3OFfHmhkJqxnKWOgop/gpmIf4qcfoqYko6EiJeOjo6EdnR2c4Bwb4VzcHGDb2ppdW2Cbn18bXVzUk6C38mS1pN8b3SDdYOfgpF2lJCYm4+Ye5NyhZCfoZOTkImSm5OFfZWVh4yNh5KNiZx/joF4eox/iIyKnJucm5aUeo53aYqTiW2JpYaTiZiDhmOMkZiNlImWi42Ji3B6lYl8jomLk5GKeoV8f218ZXNva2x6eVyAeY+OgHt9fn+Gjnt6aXVrdIyQioOGhn2WjWx/gHCCjYCOiX6Ee4ORlpubjH13eIKPeHJrZW59gWtpdG9naHNsU15vZHBaX2xyd2Zra2JneHNvcWRfd2BhVmtfXnVPTUtgZWNceXGKdFxbZXZgYWVljmNgZmJYaXJzbWtxdot8dHmGgnZ3fotzf4Z+eol/comHgZGKiH1+mXZlc258ZYd/bnBrgFprbnh5cmB2enuNdnJ2inZ5n4ybr5ugkIKFeIiUfnuInIaEnpCOhYyXhJOOh4F0d3B5cG6Eb21ufnJjZHhwfG56fGpobGOkmsHcru+ic2t1g3WEoYSRbpWPlJ+UmoGRcIWLo5eJjpWKkJ2Vg4CUj4SIj4CSioqXfod7dX+JeIaFjpual5mPkHaLd3CIiox+jKWFkoqdhYZei5SXiY6IjouKhIlsfJeCfYiGipGPhnaFfn5rfWN4dGpveHNYiHqRh4V6f3+AhYx+emZ0aoGLj4uEhICMmIZsgndviZKDkYV/gnuBkZeUm5F1dHiGjHVycGVzd4Bgc2xvYWh1ZlJgcGdrVV9udHlhcmNgaX1xcm5bY3JhY1duWlx3TExMY2VhXXZzim1bXGR4XmBkZoRfY2NeWWlya25rcneLfXN3hIF4eHyJcYOEfH2Ie3SLiYiVhox/f5hzaHVxeWyLe250cIBXcHl2eXFkdniGjGh2gIlxgJ2Imaeco5KEfHCMlHd4iZyDhJ+NjnyVjYCZh4R7cndwc2pvgWtpbHx0XmB4dntwdHpnYGV869q1ycPciXNsc4B2ipqIjGmXj46clJKBiHCFiKCOhIqVioyXk3yNkoiCiI96kYuGj4KAd3iDhHKHgpOblpSYho12h39xhoOKiJqkhJWNn4SJYYOVj4WIhomMh4CHaH2Uf32ChYmOj4Jxhn9/cndndnJpdHdsWox9koKFfYCDgISKgnZidW2KgpGMg3+Ak5J+boNteoiRiJOFfYJ+gZOUkZiKb3J6jIV0a29pcHZ+XnNoblxpdV9SZHFoZlNfcHZ0YG9gXWiCcXJqV2dpY2lYbVdbdExKTGVmXmFyc4VoW1xleV5eZGd6YWRfXVlrbmVuanR3in5zcoF+e3Z6h3SFg3x/h3d2ioWPmIGNgnuTdmx3dnl4knVud3p9WHmFcX9uZnh2kYJkdoaFcYqWhpmhm6KKhnNvkotydo2afImZiIl7n3+EmX+BeHF0bm9kcn5oZmx3d1tfeHt6cXF/aWFnYX/Vto6RpnhucXd7cZKQjIZqmI2Im5GLhntoh4uZhoGSkIaGl417jIyAgImNe5CNfomFenV7g3txhoCVmY6SlIKJdYSIeIWBjJWeoIeWkKB/iGF/k4eDh4OJjX9/gmZ9kYB+f4KMj5B/bYN8gnRrbXd1dHd2a2ONgY5/hH98hH+FiH9wYHRyhn2QjoN9gJKKenGEZ3uFjIiNhHyFf4GVkJKUhW9weYt/dGxtaWp3emFnaWlYa3VaUmlyaWJQYnJ4bGJlXlpqg25zYlxnX2VtX25UWm9OR05mZFxmbnKAa1pbY3NfXGNsd2RlXV1abGxibWpzdoaAcW9/fH10eIZ4hYN8gIh2eImBkpV7iYZ2iYFveHl7g5JvbXuAdl6Df3OBbWh6c5RzZ3OHfHKSkYSan5ughoZ1dZR+bXWSln2HkIOKjZl8jJp2fnZxb2xqYXR8Z2JpdXlaYHd7eW1xfmVjaGhXnY9fcnOXvMSEdnGUiI99cZaLhpuSjIdyaoiPloB7lIyBhJqMfIqFfHuJi3+UiHWJhnZ3fYFydYaBnpSFlI+Dg3KAinaGfYuanpqHlY+dgYlmfZOCfoSDiYlygX1mfox8eX9/h4uPfWmAfYN2Zm95eHN3c2xrjoWKgYqAeIKBhYSBa19zeXt+jouGfIKQgX5zgml6hImMhoV5hH2CmY2RjX5ubXuIfXZ0bmZle3RiW3BiV25xU1NtcmhhTmZ0eGZgXl1Zb4Bvc1llYl1qbmBwT1lrUURTZ2Baam5tfG5ZW15tY1pib3dkZ1xdYGtpY2xqc3aBg3Btf3x/dHWDeoOCfIGFdn6IgZaQeISLdIGIcnl5fo2Qb297gHFpgXh6fm1se3WVa2p4hHRrk42Fn5igmYSIbn2Mdml3l45+gImClJeJeY+Wb3pzcGxpZGBzemhfZXF6WmByfHlncXphZWWPsbJ3S2JapdnQlnF7kIqPd32TioSYkYyFbmuFkpF6eZKGgYSYinyGf3h3iYqEloBvi4hxdX56anmFg6WQhJONg39vf4R3hXqHnZqVjJSRlYWIcHuSgnyCg4iDboF3aICEeHJ/gIOKh3xlfX6EdmNwc4BpeXBvdZmNhoOKfHZ4gIV6g2tccn9zgomGin6HinuJcoJucoWIj4aGc4R6gpqNjoV5bm9+hH92emRmaHtvXlh2WlhwbE5XcXNmYEtsd3RhXVxaWXR9c29XZ11manJgb05XaFI/WGZeWnBraHpxW1pZa2VaY3F5X2hcXmVsaGVraXF3f4hvbH9+gHVvgnuAgn+Cf3aBhYiXiXGCjXF7hnx6eYOTjHVqeX5rb350f31vcnt6k3BvgX54Z5KLg6GZnJGChWaGg29neZWIfX6EgZiJgXyNjGh4cmtsZl9gb3ltX2JveFxka4J6YXF2X2Vl1Oq9izI6PouOf3F4hYiOjXaClYx+ko2Mf21shY2MdXyPf4WBlYh8gnhudoeEg5d3boiFbHV7dGZ5goOni4KOi4R+boB2eIV7iJ6SjZGTk46Lh397koZ3foOMgmt/cmiAfnhtfHyCioN3YXmEgXFkcWh+bnVxdYKbi4B/hYBzdX6Bc4FvXG5/dXmLhIt7iIF9iXh6cm2JhJGFjHOCeoCXjIuAdW1rdoCAdXRbZ2d1bldWe1JZcGRLWnJyZVtJcHhvXFtbWV10fnRoWWJbZ2ZvZGpNV2ZRPl5lXF11ZWB1cFpZVG5kWWRxeVpoXV9mbWdpa2lwd32ObWmChH55boB8fIF/gnp1goGNk4RwgItud32Ae3uHkol/aHt9anN7coV6c3d+fox6eIR9fGuMjYSbnZaMgYBsjX1raH6Ni3p+foOTgn59iohrdXFnaGJbYmdzb19ha3NgaHCIemJzdF5jZJugj25cNVqvtXRpgIh8koZ1hZWFc46KiXZwbIWDh3V5iXiJfJOIen5yZ3WJfn6Yb3GGfmh2eW5meYeEpIeAhoyJfm5/d4GCfo6biIOVkpmKi4WJfI+IcHp9hHtofmxqgHt6anp3goeAcmB3gX5xZHJndoJtdXuGlZGBfIKBb3d6fHV/bVlwgHd1jYOHeIh2g4l6eHNvi4GRgodzf35/lImKe29uam2BgXRtXGZkcnBQWnpNW29cT1tyb2RVS3N4aVdZWVphcYB0YF1dYGdkaWlmTlloTUBgY1tgdWFddWxYV1N0YVpkb3JXal5iaGtnbWxocHd8k2xohIp8fHB/fnuBf4J6d4B/iouDcXuIb3F3g397iYyPg2p+e213eHaKd3x4gIGHf4N+fnpthIyImKONhIN6dYt4a2yDh5B4fXqBkYCAfoqDcHJwY2ZeWWZfb29fYGdwZmpviXRhdG9bYWRqdnuAv5ympMi4cYWDcpJ8eIaSgnOQi4dxcm+De4N0dId0iHeUiHl5cGN3h3qAk2lyhHZnd3VjanyCiJ2Bf3+Oj31zgHWGeoGTkYR6l4+WkIiCiHuIiGt4eX50Z3poa395c2l6doCDfWhgd4d9amp0aHuAaXaBjJGUfnp+fnB8dnx0f2JWeH5zc4uFgn2EcYeKd3hxcYSDjoB/en59do+GhHdqcWlsh4Fxb1xmYXFtSWR1S11tVVNZcm5iUU90eGFSWFhdYW+Cc1thXWhlZWRrZFBbcElDY2BbY3BeXXdoVVZVdl1bZW5oVmteYWlnZW5uaHB3epNtaYiMeX1ye355goGBfHV8g4iGg3B3hHJtd4KCfomLk39wgHt3eXqBi3SDeH6BgYKEeoB1b36Ki5ueiH2FeneFe2d0hYyPeX5/e4iFg3aPf2dvbl9kXFhlWW1yYWBgcGxraIluYXRpWV5kboB3qdqqx4aHsnGJd2+MdXuGjX96kol/dHN0fneAcHF/bYR0lIZ4dWtgeoJ5iY9mcYRwZ3ZuW218gJCTf4B5kZN+eXxuiXeCko2FdZeLko+HhYZ7f4RsdHZ+bWd2ZG17dW1pd3Z/f3xhYniGemh1dWJ9e2d1ho6NlXt0gHZxgHt9bYBaV3V/cHaFiH+Aem2JhnR5bHaBhIV/fH55fHSLgn50aHRlboqDbHNZaF5zZEdtbUtaYVdWVXdtYlBSdHZYUFZYXmFxhG9cYGNtZGReb2NUXXJGQmVfXWZnXVt7YlFVXHVbW2drYVZqX2BuZWZrcWhwdniOdGuOjXV+dnh+d4GDgXtzfYOIh4NvcoB0cXV+hYGJjYp7d4B4g3t8hYd4h3x9gX6EgHt+c3Z5jI6gjYl6iXZ0g3hefYWYi3iGg3SFhoR3iXpibmxbYltbYVZpc2NgW2dub2aHcWFxZlddY2x/fMrOh7mham1timxxhHF8g4l+epCEeXhzeXV1e2psdmOEdZKCd29mXn2CeouKZXKCa2pxY1hteoWbiIKBc5eUeH99b4lyhIuNiXOYj5GJhouDe3l9cHBvfGZocWJteHFqa3F4fXx6XWV5gHhpdnhmgndndIeMjpR9codqb36BeW99Xllzf251gYt8gm9wioBxd2l4gIKAgnh+c3t1h317c2dzYW6LgWtxV2lddltHbWpMVlReU1V7a2FPVHVyUFFUV15idIVpXWBsamZjWm9hWGNwR0BnXGBlXlxWe15OVmVwWVtqaF1XaGBecmZrZ3FncHN3hnhulYp0f3p4fnmDh4B1cX+GhY6DcHB7eHZ1eoaFh4yGenx/dIt+fYaEhId/fn59h398eHZ4eJGTn3+MfYttdX94ZIKGlYVzkYpvhYWBeoN0Y25qWV9bXF1UZ3JkYFhkcXJmgXNia2VXW2Bqf3e+rnugtm5ic4Zoc3txeYGEen2Lfnd3cnZve3Zlam9gh3WOgXNqYl5/eHmLhGZxf2hra1pWb3eJo4GEf3GZk3KBeXaEb4KDk4l0loqOiIWJhX14dHFuaHhfamxfbXZqZ2preXd6dlpnfXx4ZXN+boR0ZXWFjYaWf3CMZ2t6hHVudWJdcX1sdX2Me4Jmdod9bnFpdn95f4Bzfm17fIJ7eXFmbGJtiX1sbVVpX3ZVSmlqTlFOaE1Ye2hhTlV2a0xRVFVfZnWDZl5gcWhnYldpXVxraEpEallhZFZZVXlZTVZtallda2RcWWVjXnRmbGRxZ3JwdYF4cJmFdn9+d398hYd9dXKCiICVg25zeXt6c3KFh4mIg3mBfnWPfnyEio6EgoN6fouDe3Z7d3eanZd6iYKGaXZ9e2yDhJJ/cY6BcIWCfoF/cGZsZ1hdW1xbU2RwZF5XYnJ1aXVwZWViV1xcaIBwb3KAc4lkZHh+aXR1c3KBg3eAg3l2c3Vua3pxYmdrZ4Z0jYNuZl1ffXB7iX9pbXlnamRVV3JvjaZ8hHt2lpF0fXN9e299fJKHeJp9iIaDhoN9dW9xbGd0XGxnXmx0ZGdlaXpve3JZaIF3dWhwgXiCdmJ3hYt8lIFvjGpte4JxZ3NmYW56Z3N4i3x+YneDd2pscnZ7cXt6dH5nf3+AeXdvZGZiboV7bGpVaGJvUkpoak9LTm9HXXtmYU1VdGNKTlNXYWp2fmVdZ3NpZmBWY1dicF1MS2pYY2FVVFVzVkxYdWRZXmtgXFpjZV92Z21icGlzb3J+dXSZgnd/gHd/f4aFenx0goR+l4VucnR8enRxhIWPgYB6i3Z0kH98gZWOgIWEfH6Mhnt+gHZ7o6WKeYiFhGt1fHp1g4CLem6Ec3mEfYGDdW5qaGVWXVtaWlNibWRbWGFze2lobWlgYldfW2qAamtwgGdrYGh5eGpzdHNtg4B6f3x1dW56aGp5al9lbmiBdpCEZ2VYYndqfod7b2pwZ2ZdVFhvZ46od4F6fJGOenZxf3B0d3qQgXmWdIWDgIWIdmpxdWdnbltsY11tcl9nYWp4aHxtW26CcnRqb4F+endhd4WEeI+Fc4hyb3mAcmNxaVxxeGRydIl8eWN0gHFoanp1cm15eHZ5ZIR8f3l3cWRkY258fGpqVGhhZVNKa2dPR1FrRWB4ZmFNU3FdSk1UWmVrdntlX21xaWRdVmBWbm5XS1NoV2VeWE1VbFRKXHlfW15rXV1bY2VgeWhsYG9vdW5wd3V6mH13gIF6gICHhnp4eYJ+gZOEcXR0f3l2dISIkX2AfJBrc5WAe4KfhX6HfYB/hoKAint2hKuff3qIh4NrcoF5dYB+gHRuhm58gHOKgGpvbWRkWF9aWVpUYWpnW1pedIJpXm1sXGFXXFxsgWVydH1paVxrdnVnc3ZxbIR7fXx4dXJseWdpeGZdZXNneneTgWNjVGVwZ4KFd3dnaWpgV1ZZZ2OPp25+d4CLjntxcn5oenB7jn14kHGEfX9/hm5kdXJkZ2dcamFcb29cZ19tdWR6aF10gG9ya3J8fnV2YnSFi3uIh4GAeHJ1f3VhcG1bcnRjcXOFfHVlc4BtYW17cGtqe3l2c2aGdnt7dnFlYmVtc31pa1NnXVxUS3FiUEZWYUdidmZhS1RvV0pMWFhna3V6ZGVucWZkWlddWHZlVEpcYldnV1lIV2VQSGJ4Wl1fbFteXGFjXn5pal9udHhtcG52g5d5coGAfH+JjIZ+dXWGeYeMfHR1dYJ5enqCjI59foSJaXOWgXqKnX1+hXqBen98hohzcY+tjHt7h499ZHGHeXN8enVyb4Vse35sj3picG9iZV1lVllZV2Nma19dXHKFaFhwblteWFpcbHtjcHd2bWJabHNzZ3R1b2yDeH5/eHdubnRkaXRlW2d1ZnZ2knlfXVJmZmqDgnR+YmRpXFRXXWJjj6RoeHSDhpF5bXB7aXlufIZ8dolzgHh8eH9oZHZsYGZfXmleXHNrWWVdb29iemVbd3xrbm5veHlzdWRzg5J+h4OJe3dwcn5zYnhkXHBwYnFygn10Z3KAZV5ud2llaHp8dW5vgnV0fXRyYl9mbm58ZGhTZ1hXU0x2X1BKWVhIYnRjYUlUbVNKTVpXaWxxe2JtbHNjYlpaW2F3XFNMY11YaVNXR1lgTUZpdVheYGxbW19iYlyEaWdhbnh5bG9qdoGQeG2DfoCBk4iEgXZziHSMhnRydnWCd3x9foyQgH6TfnB3lYN8mZJ5gIB4en6AdIiDdHCYoHp7f4mUeGN1h3hzd3RrdG9+a3h8cJFyXnBvYGdibFRaWldoY21mXFtxiWVTcm5bWlhYYGx2Y2l1amleWW1zcGxzc3NphHx+fnt2b25sZGlxY1trcmR0do5zW1dTZWFygH9ygl1iY11TWmBcY5GfZXFxhYSRdGxse25wcXt9fXGBeIBzenp6Y2V1aF1iWWBnWl52aFdiXW9oYXdgW3t2aWpybnhzcnVocYKVg4d+hHZzanF9bmZ3WF1sbmNyc4F6dGdvfltgcHJiYGtyfm1tdX9zcXhrcGFcZWxseWBmUmVUVlFPdFpRT1hRSGNzYmBGVWtQSVBaVWtra3xlbW9xYltaWFlscVdSUGZXVmhTVEZaXE5IcXRYX2NtY1hgYGFdi2pjZG15eGtwaXV5hntrg31/hJp8goR5fIduj4dyb3Z6fXSBgnyLj4KCl3R4gZOFgZ+JdYGAgXR/gnGHgnVvoZZze4aLhnpld4pubXpuZnhwemtzdnKMa150bmFnZWtSXVtVZ2Fsa1pccIxkT29uXVZYVWdpdGhidGVlXVltdG1vdXR4aoZ8f3uHdo9zZGRrbmFcbm1jc3iHa1pUVmNkeH19cYZdY19jU1pfWWKVlWNucIOFinRraHxwZnR4dX1senV2b3p+dV5lcmNbXVZhY1hhdGVVX2BtZGFxXV1+cGhpc3F0cHV2a22Ek4GJe4Vxc2dwfnFzb1RcZ2tmcXSBd3NjbXZWYnJsW19wZ35mbXd+c3Nza21gWmRqanZeZlNjVFVQU2xWUFZTT0dkcl9hRVhpT0hXVFZtaGR8aWt4a2JXXVVbdGRTUldoUVhlVFNIWlpQTXd2Wl9lbGlZYmBeXo5uYWZreXVub2l2dn9/bIOAfYeXe4CHgYl+a5OIcmd0gHt1f4J9iI5/i5NyfIqRhYefhnt/hoxzgYZzfoJ2bqSLcoGNi3Z3bHqMYGR7cGZ6c3hsbXF2gmdke2xjZmdoU19eVWdfbG5bXm2NaE5pbWBUVlNuZ3RrZXhkZFxYb3NscXp3cmyHe392m3p5a2FlbG1eYG9qZXB5fmdaVlhgbHh8e3CEX2JeZ1ZYX1djm4hia3CBh314bGt5blx3c217aXV0b297gHJYaW1eWFxVYWJXZHBjU15haGFibFpgfmtma3N2b213d2xphYx/iXuIbXJncX1uc25kWmFpaW90gnRzXmltU2VxZVVjb2N7ZHJ3fHdrcG1rYFlhZ2h0XGRVYFVSTldkUk5bT09HZG9dYkZZaU1JX0tYbWRgeGlufmRgVV9UXXVcVFNgZk5dYVVTSlxZUFl0dV1fZWxoWGNhW16NcWNnanhxc25odnR6g3KCg3qIjn58iYeNeW6QinVsc4J0f3+HhYaShJWPeX2Mj4eRm4SAfIyFc4CBc3R4cm+Tk5OTk5OTk5OTkpKSkpKSkpKSkpKSk5OTkpKSkpKSkpKSkpKSkZGRkJCPj4+Pj4+Ojo6Pj46OjY2Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2NjYyMjI2NjY2Njo6Ojo6OjY6OjY2Ojo6Oj4+Pjo2NjY2Oj4+Pj4+PjoKAfnp6fX5+fX1/fn59fn5+fn5+fn+Af4CAgIGAgIB/gIGBgYOHjI6Ojo6NjY2NjY2NjY2NjZKSkpOTkpKSkpKSkpKSkpGRkZGSkpKSkpKSkpKSkpKSkpKSkpGRkZCQkI+Pjo6Ojo6NjY6Ojo2NjY2Njo6Njo6OjY2NjY2Njo6Ojo6Ojo6NjYyMjY2MjIyNjY2Njo6Ojo6NjY2NjY2Njo6Ojo6OjY2NjY2Ojo6Ojo+Ogn99ent8fn59fX59fn5+fn5+fn5+f4B/gICAgICAgH+BgYCBg4aMjY6NjY2NjY2NjIyMjIyMkpKSkpKSkpKSkpKSkpKSkZKSkpKSk5KSkpKRkZGRkZKSkpGRkZGQkJCQj4+Ojo6OjY2NjY2Njo6Ojo6NjIyMjIyMjY2NjY2Njo6Pj4+Pjo6NjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Njo6Ojo2NjY2NjY2NjY6Ojo6Cf3x6fHx9fn19fn19fX59fn5+fn5+gH9/gICBgYGAf4CAgICDhouOjo2NjY2NjIyMjIyMjIySk5OTk5OTk5OSkpKSkZGSkpKSkpKSkpGRkZGRkZGRkJCQkJGRkZCQkJCPj46Pjo6Ojo6Ojo6Ojo6Ojo2MjIyMjIyNjY2OjY6Ojo+Pj46Ojo2MjIyMjIyMjIyMjY2NjY2NjY2NjY2NjY2Njo6NjY2MjIyNjY2Njo6OjoN/fHp8e31+fH1+fXx9fn59fn5+fn5/f3+BgYGAgICAgYCAgIOGi42NjY2NjIyMjIyMjIyMjJA+LjExMTEvb4eEhISEiF0tMDAwMC1GoaGhoaGhoJqZmpqampqKg4SEhIOEd2VnZmZmaFxDREREREFSzNrY2NjY3Itpbm5ubnFJLDAwLy8sSYWDg4ODg4OLjIyMjIyMjY2NjYyMjY2NjY2NjY2NjIyMjIyNjY2NjY2OhX19e3t6fX58fH59fX1+fX1+fn5+fn9/f4GBgYCAgICBgICAgoWKjI2MjIyMjIyMjIyMjIyMjy0aHR0dHBpohYKCgoKGUxgdHR0dGTekpKSkpKSjnJycnJycnImBgoKBgYJyXV9fX19hUjQ1NTU1MkbY6ufn5+fri2JnZ2dnbDwYHBwdHRg7g4GBgYGAgYqLi4yMjIyMjIyMjIyMjIyMjY2NjY2MjIyMjIyMjY2NjY2GfH16e3p8fXt9fn19fX59fX5+fn5/f3+AgYCBgYGAgIGBgYGChYqNjYyMjIyMjIyMjIuLi4uRiYiIiIiIh42QkJCQkJCMh4eHh4iHiZKTkpKSkpKRkZGRkZGRj46Ojo2NjYuJiYmJiYmIhYaFhYWFhpOUlJSUlJWNiYqKiomKhoKCgoKCgoSKioqKioqKi4uLi4uLi4uLjIyLi4yMjIyMjI2NjIyMjIyMjIyMjY2Njoh8f3l7ent8e319fX18fX19fX5+fn9/f4CBgYGBgYGAgYCAgYKFioyMjIyMjIyMjIuLi4uLi5GTk5OTk46SkpGJh46KkJKSk4+Ojo6OhYqRkZGRkJCQkJCPj4+Pj4+Ojo6Njo6Ojo2Njo2Njo6Ojo6Ni4uLi4uMjI2NjY2NjY2Njo6NjY2NjIuLi4uLiouLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyNjY2NiX59eHh5fH18fX19fH19fX59fn5+f3+AgICBgYGBgYCBgIGCgoSKjIyMjIyMjIyLi4uLi4qLkJCRkZGPhI6QkIaKj4WNkJCQh4qJiY6IiZCQkJCQkJCQkI+Pj4+Ojo6NjY2NjYyMjIyMjIyMjIyMjIyMjIyMjI2NjIyMjIyMjIyMi4uLi4uLi4uLi4qKiouLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjI2Lfnx3dnh7fXx7fX18fH19fn5+fn5/f4CAgIGBgYGBgIGAgIGChIqMjIyMjIuLi4uLioqKioqQkJCQkIqFjoiOhoaPiY2QkI2Eio2IkImLj4+Pj4+Qj5CPj4+Ojo6OjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLi4uLi4qKioqKi4qKi4qKi4uKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIt+e3d2eHt8fHx9fX19fX1+fn5/fn9/f3+AgIGAgYGAgYCBgYGEiYyMi4uLi4uLioqKioqKipCQkJCPhYOMjpCOiYyJjZCRiYKIjIiPh42Pj4+Pj4+Pj4+Pjo6OjY2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKioqKioqLi4uKioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMin18dnZ4fHx7fH19fH19fn5+fn5+fn9/f4CAgYCBgYGBgIGAgYSJi4yLi4uLi4qKiomJiYmJkJCQkJCMhoyJjoeFjYmOi4yOiIiMiI2Gj4+Pjo+Pj4+Pjo6OjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKioqKioqKioqKi4uLioqKioqKioqLi4uLi4uLjIyMjIyMi4uMjIyKf353eHp7enp8fHx8fX5+fn5+fn9+fn9/gICAgICBgICAgYCBhIqMi4uLioqKioqJiYmJiYmPj4+Pj5CMjouPjIqPjI6MjZCOjI2LjYuOj46Ojo6Ojo6Ojo6NjYyMjIyLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLjIiAfXh5enp6e318e3t9fn5+fn5/f35+f39/gICBgICAgIGBgIGEiouLioqKioqJiYmJiYmIiI+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Ojo6Ojo6Ojo6Ojo6Ojo2NjYyMjIyLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLioqKi4uLh4B8eHp6eXt8fHt8fH1+fn5+fn9/fn9/f39/gIB/gYGAgIB/gYSJi4qKioqJiYmJiYmJiIiIj4+Pj4+Pj4+Pj46Pj4+Oj4+Ojo6Ojo6Ojo6OjY2NjY2NjY2MjIyMjIuLi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKiYmKioqKioqKioqKioqKioqKioqKi4uHgHt5eXh6fHx6e3t9fX5+fn5+f39+f39/f39/f3+BgYCAgH+BhIiLiomJiYmJiYmJiIiIiIiOjo6Ojo6Pj46MjI+Sj5COjo6Ojo6NjY2NjY2NjY2NjIyMjIyMjIuLi4uLioqKioqLi4uLi4uLi4uLi4uMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKiomKiomJiYqKioqKioqJiYmJioqKioqKioqKioqKioqKioqKi4aBe3h5eHp8ent7fH19fn5+fn5/f35/f39+fn9/f4CAgYCAgIGEiIqJiYmJiYmJiIiIiIeHh46Ojo6Ojo6Ojo+MkJOQkI+Ojo6NjY2NjY2NjYyMjIyMjIyMjIuLi4uLi4qKioqKioqKi4uLi4uLi4uLi4uLi4uMjIyLi4uLi4uLioqKioqKioqKiYmJiYmJiYmJiYmKioqKiomJiYmJiYmJiYqKioqKiomJioqKioqKhYB6eHl5fHt6ent8fH1+fn1+fn9/fX9/f35/f39/gICBgICAgYSIiomJiYiIiIiIiIeHh4eHjY2Ojo6Ojo6Pj4+PjoyNkI2NjY2NjY2MjIyMjIyMjIyMi4uLi4uLioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYmJiYmJiYmKioqJiYmJiYmJiYmJiYmKioqJiYmJiYmJioqFf3l6eXh7e3p7fHx7fn5+fX5+f39+f35/fn+Af3+AgICBgYCChIeKiYmIiIiIh4eHh4eHh4eNjY2Njo6Oi42Nj5WPiYyPjYyNjYyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYR+eXt5ent7eXt9fHt+fn59fn1+f35/fn9+f3+AgICAf4CAgICEh4mIiIiHh4eHh4eHh4aGhoyNjY2NjY+MjImKj42IjJGPjY2NjIyMjIyMjIyLi4uLi4uKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uKioqJiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJg355e3p8e3p7fX17fH9+fn5+fX5/fn9+f3+Af4CAgH+AgH9/f4OGiIiHh4eHh4aGhoaGhoaGjIyMjIyLiYyKiIeJhoyOjJCMjZGOjIyMi4uLi4uLi4uLi4qKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiImJiYmJiYmJiYmJiYmJiYmJiYmIiImJiYmJiYmJiYmJiYiIiIiIiYmCf3h7e3t6enx9fHx9f39+fn19fn9/f39/f4F/gIB/gICAgICAg4aIh4eHhoaGhoaGhoaGhoWMjIyMi4yOjoyKioeEiIuKjIuNjo+Li4uLi4uLi4uLi4uLioqKiomJiYmKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiomJiYmJiYiIiIiIiIiIiImJiYmJiYmJiYmJiIiIiIiIiYmIiIiIiIiIiIiIiIiIiIJ/eHp7enp6e3x8fX1+f35+fX1+f39/fn+AgICAf3+Af4CAgYCDhYiHh4aGhoaGhoaFhYWFhYyMjI2NjJCSjI2Ii4mJi4uLi4mLjIqMi4uLi4uLioqLi4qKiomJiYmJiYmJiYqKioqKioqKioqKioqKioqKioqKioqKiYqJioqJiYmJiYmIiIiIiIiIiIiIiImJiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIiIiIiIiIiHgXx4e3x5enp8fHx9fX9/fn59fX9/f39+fn+Af4B/f3+Af4CAgIKEh4eGhoaGhYWFhYWFhYWFjIyNkY+PjZGJjIaJjIuIiImMiYeNjo+NioqKioqKioqKiomJiYmJiYmJiYmJioqKioqKioqKioqKioqJioqKioqKiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4WAenl9e3t7enx8fHx9f39+fn19f39/f35+f4B/gH9/f4B/gH+AgoSHhoaGhYWFhYWFhYWFhISLi46PjoyLj4iHiYmMjYWFjo2KiYyNi46KioqKiomJiYmJiYmJiYmJiYmJiYmJiYmKioqKioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHhoaHh4eHhH55eX16enp7fXt8fX5+f35+fX5/f39/fX5/f3+Af39/f39/f4CChIaFhoWFhYWFhYWFhISEhIuLjI6MjI2Lh4mIiomHgoeNjoiKi5GTj4uJiYmJiYmJiYmJiYmIiYmJiYmJiYmJiYmKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIeHh4eHh4eIiIiIiIiIiIiIh4eHh4eHhoaGh4aGhoaGhoaGh4eDfXp5e3p5enx8e31+fn5/fn59fn9/fn9+fn+AgICAf35/f39/gIKEhoWFhYWFhYWEhISEhISEioqOjYmIiIqKh4iHiomIioiIh4qGi5GPiomJiYmJiYiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHh4iIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGh4J8eXl6eXp7e3t7fX5+fn5+fn59gH9/f39/f4CAgH9/fn9/gICAgoSGhYWFhISEhISEhISEhISKi5CPiYmJi4qHh4WHiYuKiYSLjYmOjYqJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiIiIiImJiYmJiYiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGgXt4enp4e3x7e3x+fn9+fn5+fX1/f39/f3+Af4B/f39/f3+Af4CChIaFhYSEhISEhISEhISEhI+Qj4+IiYuIhoeIiYuLjIuJioqNio6Oj4iJiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoaAe3h5eXh4enp8fX1+f35+fn59fn9/f39/gIB/gICAf39/gIB/gYKDhoiGiIaDhISEhIODg4ODkpKOioeKi4qLh4uNiYqJi4iHiouIio+SioiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhn96eXh4eHl5eXx9fn5/fn5/fn1+f35/f3+Af39/f4CAgH+AgH+BgoOHjo+PjoiHhIWFhoaFhYWSkI6KiYmIiImKioiIh4aKjIiHiYmOkJGNh4iIiIiIiIiIiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4aGh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWGf3l4d3d3eXp5e3x9fn9+f35+fn5+f35+fn+Af4CAgICAf3+Af4GBg4eOjo6Ojo6Mjo2OjY2MjZCQjomHhoiJiYeIiouIiYyJiYaKjY6PkYuIiIiIiIeHh4eIiIiIiIiHh4eHh4iIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhYZ+eXd5d3d6eXl8e31/fn5/fn5+fn5+fn9+f4B/fn+Af39/f39+gIGEiI6Ojo6Ojo6Ojo6Ojo2NkJGOi42JjIiIiYaHiYaIioiHi4yLjpCQiIeIiYmJiIeHh4iIiYmIh4eHh4iIiYiIiIiIh4iIiIiHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhoaFhYaGhoWGhYSEhIWFhoaFhIWFhX55d3l2eHl4e3x7fn5+fn5+fn5+fn5+f39+f39+f39/f35/f3+AgYOGjY2Ojo6OjY6NjY6OjY2Qj42Ni46KhoiKhISLiYeDhYSDi4mLj42JjI6QkI+NjYyLjY6Pj42NjI2Nj4+Pjo6MjYyMjY2KiYiHiImHh4aHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoeHiYqKiIeJi4yNjo2LiImLi42OjYyJiImMgHl3d3Z6eXh7e3t9fn5+fn5+fn5+fn5/f39+fn5/f4B/f4B/f4CBg4aMjY2NjY2NjY2Qj4+Pj46NjI6KiYuMjIeFiY2Lh4aIh4aHh4uNjo6Pj4+Pjo+Pj4+Pj4+Pj4+Pj4+Ojo+Pj4+Pj4+Pj4+Oj46Oj46Mi4uJh4eHh4aIhoaGhoaGhoaGhoeLiYeHiIiLjY2Mi4yLjY2Ojo+Ojo6Pj46Ojo6Ojo6Ojo6Njo6NjY2AeHZ4eHp4enx6fH5+fn5+fn5+fn5+f39/fn59fn9/f39/gH9/gIGDhoyMjIyMjY+QkpOTk5KSjYyMjIqHioyKh4eJiYWCiouIiYWJjpCNjo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjI2NjI2LiYaHh4eHiYqLjY6NjYyNjY6OjY2OjY2NjY2NjY2NjY2NjY2OjIyNj4+OjY2MjIyLi313dXd5enp7e3p+fn5+fn5+f35+fn5/f39+fn1+f39/gICAf3+AgYOFj5KRkJGSk5OTk5OTkpKLi4uLiomMiouLiYuKhoeOjYiIjI6OjIuMjIyNj46Njo6Ojo2NjY2MjY2NjIyMjIyMjIyMjY2NjYyMjI2NjYyMjI2NjIyNjIyMi4yMi4yMjI2MjIyMjIyMjIyMjIyLi4uLi4yNjY6Sk5OSkpSRkJOVlZSTk5COjo6Oe3Z2d3h6ent7e31+fn5+fn5/fn5+fn5/f35+fn9/f39/gIB/f4CBgoSNkpKTkpOSkpOTkZKSkoqJioyJi4qJjIuKioiHiYqKi4mKjY2Mj46Nj5KUlJOUlJOTkpGSkI+Ojo2NjY2Pko+OkZGOjIuKioqLi4qKi5CPjoyMjIqKioqKioqKiouKioqKi4yLi4uMjIyKiouLi46RkpOTk5SUk5STk5SUlJOTk5KSkpKSk5F6dXZ2eHt7e3p6fX5+fn5+fn5+fn5+fX5/fn5+f35/f3+Af39/gIGChIuRkZGRkZKSkpGRkpGRiYmIiIqMiYiJiYuJhoSJhoyKh4ySkpKTk5OUlZWWlZWUk5OUlJSUk5SUlJSVlZWVlZWUlJOTkY+QkZKQjoyRlZWVk5KSjo+QjYqKi4qKi42OjY6RkpCRkpKSkpGRkpKSk5OTk5OTk5OTk5OTkpOSkpKSkpKSkpKSj3h1d3l6e3t7ent9fX19fn5/f35+fX5+fn5+f39/f39/f4B/f3+AgYKEi5GQkJCSkpKRkZGRkZGIiIiIi4uJg4eLi4yMiIeHjYyNkpSSkpOTlJWWlpaVlZSSkpOTlJSUlJWVlZaXlpaWlpWUk5SUlJSVlJSUk5OVlZWUk5KTk5OTkJGSkZGSk5OTk5KSkpOSkpKSkpKSkpKSkpKSk5OTk5SUk5OSkpOTkpKSkpGRkZGPdnJ3enp7e3t8fX59fX1+fn9+fn9+fn5+fn6Af39/f3+Af3+Af4CBgoSKkJCRkZGRkZCQkJCQkIeHh4eIiIiFi4+KjI6Njo+OkJWUk5OTk5SUlZWVlJSVk5KSk5KTlZSUlZaWlpaWlpaWlpSTk5OTk5OUlJOSk5SVlZSTkpKSkpOTk5OTk5OTk5KSkpKSkpKSkpGSkpGRkZGRkZKTlJSUlJSTkpGRkZGRkZGRkZGRkYx0c3d6ent7e3x9fX1+fX5+f35+fn5+fn5+fn9/f39/fn9/f39/f4GDhIqQkJGRkJCQj4+Pj4+Ph4iKi4yNjYuOj42Mjo6RkpGSk5OSkpKSk5SUlJKSk5OTk5OSkpOUk5OTk5WVlZWUlZWUk5OTk5KSk5OUk5KTlJSUk5KSkpKSk5OTkpKSkpKRkZKSkpKSkpKSkpKSkZKRkZGSkpOTlJSUk5OSkZGRkZGQkJCQkZCRinN0dnp8fHp7fXx9fn59f35/f35+fn9+f31+f39+fn59f39/gH+AgYKDipCQkZGQj5CPjo+Pjo+Oj4+Pj4+Pj4+PkI2OjpCRkpKSkpKRkpKTk5OTkpGSkpKRkZKSk5OSk5OSk5STk5OTlJOSk5OTk5OTk5OSk5OTkpKSkpKSkpKSkpGRkZGSkZCRkZGRkpKRkZGRkpGRkZGRkpKSkpKSkpKSkpKRkJCQkJCQkJCQkJGGc3V2e3x8e3x9fX1+fn1/f35/fn5/gH9+fX5/fX5/fn5/f3+Af3+BgYGKkI+PkI+Pj4+Pj4+Pj4+Oj46Oj4+Pj5CQiI2PkJGRkpKSkpOTk5OTkpKSk5KSkZGRkZKSk5KTkpGRkpKSkZKSkpKSkpKTk5KRkZKTkpGRkpKSkpKRkJCQkJGRkZGQkJGSkZGRkZGSkZGRkZGRkZGSkpKSkpKSkZCRkZCPj4+Pj4+Pj4+PkX9ydHh8fHx7fHx9fX5+fn9+fn5/f3+AgH99fn5+f39+f39/f4CAf4GBgYqPj4+Pjo6Ojo+Pj46Ojo6Ojo+PkI+Pj4+GjpCQkJCRkZGRkZGRkZGQkJCQkZGRkZGRkZGRkZGQkJCRkZCQkJGRkZGRkZGRkJCQkZGQkJGRkZGRkI+PkJCQkJGRkJCQkJCRkJCQkJCQkZCQkJCQkJCQkZCQkJCPj4+Pjo+Pj46Ojo+Pj4+PeHJ2eXx9fHp9fH19fn5+f35+f39/f4CAf39/fn5/f35/f39/gIB/gYGAio6Ojo6NjY2Ojo6Ojo6NjY2Oj4+Pj4+PjoiQkZCPj4+QkJCQkJCQkI+PkJCQj4+Pj5CQkJCQkJCPj4+PkI+PkJCQkJCQj4+Oj4+QkI+PkJCQkJCPjo+QkJCPj4+Pj4+PkJCQkI+PkI+Qj4+PkI+PkJCQkI+OkI+Pj46OjoyMjY2NjIqDiYhzc3Z5fX58eX18fX1+fn5/fX5/fn9/f39/f4B/f39/f4CAgH+AgH+BgYCJjY2Ojo6Ojo6OjY2OjoyNjY6Ojo6Ojo2NiJCRkI6Njo6Ojo6Ojo6Pjo6Ojo6Ojo6Pjo6Ojo6Ojo6OjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Pj46Oj4+Pj4+Pj4+Pjo+PjY2MjYyNjoyLi4mJiYiFhYSDgoKEgnR5fXp4dXJrZWltb2xmZmdncHNzd3l9fnl6e3x9fX1+fn59fn9/fn9/f39/gIB/f3+AgIGAgIB/f4CBgImNjY2NjY2MjYyMjIyMi4uLjYyMjIyMjIyGj5GRjIyMjIyMjIyMjIyMjIyMjIyNjY2MjI2MjYyMjY2MjIyNjY2NjYyMjI2MiomKi4uJh4KAh4iEgXt6gH57fXx8fXlzcnJycnV1cG1ramppZ2NkYV9bXF1eWFVXWFlTS0VJSkpLTE1PT0tgdHR3eX19eHp5e3x8fX5+fn1+f39+f35/f4CAgH+AgICBgYCAgICAgIGAf4OEhYSFiIuLjYyMjIuLi4yGiYqKioqKh4OOkJGNiouLi4uMiYmKioqKiouLi4eDi4qIiYmGhYWEhIeJiYWCg397fHl6e3pzcHFxcW1samdsbWdlZmVmZGNlZGVkZWVlZWRkZGNhYV5dXFpYWFdUUFFSU1JTTU1KSUZESEpHR0hHR0xOSWdzdXh5fXp4d3l8fHx8fn5+fn9/fn9/f39+f4CAgIB/gICBgICAgICBgYFnXmBjYWNucX17ent/fXd8fHZ4ent4eHpvcHt4eXt8e3h3e394dXd0dHZ0dHZ3dXFycW5wcnBnaGtsbm9tamlpaGhlZWRkZF9gYWJgYF5dWVhaWltdXV9gX2BfX19gYmFeXl5eWVldXF1bV1dWUlRSU1NOUUpISUZERUhMTEhGR0lLSklNbXJ0eHp7end3eXt6e3x+fn1+f39+f35/f35+gIGAf3+AgIGAgICAgICCgWdYW1pZXFtcY1xaXF5ga3FtcHBvbm5vbmtpbmxrbG9qaWtraWpraWdmZ2dnaWhnbWdqZ2hlaGdjY2JhYmBgXVhbW1dYV1RWUVBUU1NNSkxLTExOTk9UWFhXVVVUUlBQTU1QT05LTE1QUU9MTEpHSUlHSEhJSEhIR0ZHSEpKSEhISUlISVZwc3V5ent5dnZ5enp7fH59fX5/f35/fn5+f3+AgX9+f4B/gICAgICAgIGBbFtYVlZWWVlaWVlYVVZoamxubmxra2poaGloZGVkYlxiZl9fYGNfXF9dYF1eWl5dWVleYmFeXlpZX1xYV1NOTUxLS0tMSUtNTktKS0tMSktQTEtLRkdHSUlGR0lISUZFSEdGRkVERUVEREVJSUlHSEdIRkZLTUtJSUlIR0hLTU1LTExMVXFzdnl6e3l2d3h4ent8fn1+fn9/f39+f3+AgIGAfn5/f4CAf4CAgIB/gYJoUlRVVlNVV1lZWVdXV1tbYWNfXlxbWFZWWVZSVFJRUVVUU1NTUE1KTU5QUk9NUFFRUVFSVlZRUVFUUFBOTk9MSk1MS0xKSktLRklJSkxJR0pISUlFR0dGRkVFSElKR0ZHRkZHR0hKR0dISEpMSkpLSUlISktLSkhKS0pISUtMTU9QUEtUdHR1eHp6eHZ2d3d6enx+fX5+fn5/f35+fn+AgYB/f3+AgYB/gICAgH+AgmlQUlRXVVRWWVdYWFpbVFRTUlBRU1FRUU9OTlBQUU9MTlBPTk5NTEtNTk5QTU9QUFJRUE5OT05PTk9PUFFPTk5PTk5QTk1NS0lISEpJSUlJR0ZHR0dJSkhJSEhJSEhHSEdISElISUxLSklISkpJSkpIR0pMS0pJSUhKSktMTk1NTU9RTFVzcnN3enl3dnR2eHp7fX19fn5+fn9+fn5+gICBgICAf4GBgH+AgICAgICBbE9PTlRZVVVdW1lXV1hOTUpKSUZKT0xKSkdJSk1NS0pMTUpHSUlJSktMRkRGSktLS0hKTExMT01MTE5PT09NTk9MTk5OUFBPTE1MTk1MTEpJSEdJSElISElJS0xLS0pJS0pJSklJSUlJR0dKSUdJSUpKTk1OTEhJSklJSk1PT01MT1JOWXBwcnd4d3d0c3R3enx+fX5+fn5+fn5+fn9/gICAgICAgYCAf39/gICAgIFvS0pNTlFOTlVXVlZSU0lFQ0VFUkREQT5CP0RAQD5CREFAQURHRkVIRUJBQEBDQ0RFQUNFSEtPS0lJSkhHSklKSUlLSkxQTk1MTU1MTU1NTElIREZGR0ZGRklKSUlLSkhMSklKSkpJSEhKS0tIRkdJSklLTU5OSktPTUxLTU1PUE5QT1BgcG9yd3h2dHJzdXd6fX19fn5+fn9+fn1/gICAgICAf4CAgIB/f3+AgICAgXNQUE5OUE1KS1BSUE5RQ0RCQUZRRT1DPT9FSDk6Oz0/PTxBRkA+Ojw+PjxFRD4/RUE/QEFAREVHR0dHQkRERUZFR0dHR0pHSEpLR0NER0pHQ0RFQUFDR0hHSEdISktKSElMS0lISktLTU5MTUxMSkpMS0lLTU9PUFNRT1BQTk9QUlFNUGdwb3N2dXRycXV4eX19fX1+fn5+f4B+foCAgH9/gIB/f4CAgH+Af4B/gICCdlRVUVFQT0xNUFBOT09BQkFAQkE/Oz48Pj8/Ozg5OTs7OkA6Oz48Ozs8PEhMPT1BQT9CQz1BRERGQkZGREdJSEM/QEBAQUFCQUE/Pjw9PkFAQD8+P0BFR0dHSUtMTk1OTUxNTUpLTVBVU05MTlFOTk1OTU1NTk9OTk1LS05OTk1OTkxUbnBwcnR1c3Fyd3l5fX19fn1+fn5/gH5+gICAgICAgH9/gICAgH9/gH+BgIJ4UVFSVFJTUVNTUVFST0BAPT4/PD8+QEE/PT45Ozo6Ozg5Ojg3Ojw5Nzg7Oz49Ozs6ODpAQEFCP0E/Q0ZEQkNDPzs+PkBDQ0E/Pj9BPkBAQj9APD9CQEFDRUVFSktQT1BPTU1OTExMT1JRUFJOTExPTUtOT0xMTEtMS0tKS0tKTU1LS1xxcXF0c3VzcXN4eHp9fn1+fn5+f39/fn5/gIGAgH+Af4CAgICAf4CAf4CAgXxSTU9RUFFSUlRSU1NOPDs8Ozs7P0BBQkA9PDk8PTw5Nzk6Ojk4OTo6Nzg6OTo7Ozg3ODk7Ojg8Oz1AQUA9Ozs+PD09QEJDQT9BQkE9Pj09Oz0/Q0RCQD9BREJFR0pKSkpKTE1MTExNTExOVVNLTE1USVBKSU1KSUpLS0pJSEdKS0lKZnJxc3RzdXJydnl5e31+fn5+fX9+f39/f36AgICAf4CAgICAgIF/gIF/gYCBgFZMTlBQTlJRUFBRUU44PT88PDo9PkFAQT8+PkA/Pj07PTw+Pz08PTs6PD09PTw8PDw7PDo7PD49Pj9AQUA+P0E/QEBBQEBAPT8/PTw6Oz09PD9AQUJCQUBCREZGRkdGR0dISUtMTExLTEtKS0lKSk1MTEpMS0lISUxMSklJSElLR01tcXF1dXV1c3V4eXl8fX5+fn5+fn5/gH9+gIB/f39/gH+AgYCAgYCBgICBgYCCYUtPT05OT1BPT1BQTzo8Pjw9Oz8+PkFBPz0/Q0NDQD48PT9APz89Oz49PkNFPz9APTs9PT08Ozo9PkFBPz5AQD9BPz89PD48PTs7PD0+QUA/QD5AQ0NEQkRFSEVFR0hISEdGSUpJSUlJSUhKSkpKTEtKSklJSEhKSktMS0lLSkpIVnBwcXNzdHR1eXt7e31+f35+fn5+f39/f39/f3+Af4CAgICAf4GBgICAgIGBgIJtTFBRTk9QTk5PUFBPPjw8PT4/P0A+QEA/Pz9DRUQ/PTs8QD46Ozo6OTc6PDk9PUA9Ojw7Ozw7ODo7Pz49PD07PEA9PTw8Pjs9PD0+QUBCQUBAP0JEQ0RFRkZGQ0VHSElJSEhJS0tMTUpKSUpNTUpLSktJSEhISEpJSktKSk5MSUlfcHFycnJ0dXZ6e319fX5/fn5+fn5/f35/f36AgIB/gICAgICAgYGAgICAgIGAgnZNTk5NTk5MTE5QT0w+QTw8PT8+QkM/P0FBQUJBQD08PTs+PTo6Ojw6ODo4ODo7PT8/PDs7PDs6Ozs+Pz89PDg6Pjw9Pj89Oz4/QEJDQkJDQ0FCQkFCQkRCQkRCRENGSUdGRkhJSUtNSklKSktMSkpJSkVESUlGRkhISUpKTEpGRmdwb3FxdHZ1d3t8fH18fn59fX1+fn9/foB+fn+AgH+AgICAgICBgYCAgICAgICBe05JS0tMTExFSUxOTTw/PDw9PkBAQUE7QkNCQ0A/Pz9APT8/Pjw+QD89PT0/Pj0+Q0Q/Ozw9PkA9PT5BQ0A8OTtBPz4+QT07P0JAQkNCQENDQUNBPT0+QD0/QUFBQENFRUBAQ0JDR0hFRENGRUZGR0VEQEFHR0ZDRkRHSEpHQz5IbHBwcHF0dXZ5fHx9fHx+fn1+fn5+fn5+f36Af3+AgICAgICAgIGAf4CAf4CBgIF9UUhLTU1NS0pLTE9RQD8+PkFBQEBBR0FCRENEQT9AQEA/PUA+PD0/P0BAQENAQD9AQD49PD1ARUFCQkZIQz08QERDQUE/Pj1AQT4+Pj88PkBER0VAPkBBP0BDRkVDQkJDQEJEREJERUFCPkFCQkFCQEA9QUJDRENDQUNFR0E/PVZwcHFwcnV1d3p8e3x8fX9+fX19fX1+fX5+fn9/foB/f4CAgICAgYCAgIB/gIGAgX5SSEtNTUxLS05OUlVEQkBDQ0FBQkBCQ0BAQUFAQUA+Oj48Pz08Oj08QEJCRUA/P05hX0pAQ0VJSUlJTU1LRUNGR0hFR0VFRUREQ0E/QD4+QkZKSkdERUZGRkpOTktKSUdHSEtMSkdHQ0REREVEQUJCQ0BDREVEREVERUZDQkFEZW9wcXF0dnV4e3x6fHx+f319fX19fn59f4B/f39/f39+gIGAgICBgICAgH+AgICAfVJJSUpKSEpKTE9SU0dGRUdIREdIREA+PDs+QERFRD88QURFQ0A9SERBREREQ1d1homKflhHSEpMTE1PT0xIR0hHSElJSEhHR0hIRUNFRUVFRkhKSkZFR0lKTU9PTU1LSktKTU5LSUhGSElIR0ZFRkZGREZIR0VFSEhGSEdIRlFubnBxcnZ2eXt7e3p9fX5/fX19fX1+fn1/f39/fn5/gH+BgYGAgICAgICAf4GBgIB8UEhHSElGR0lKTU5OSkxJSUpLTE5KRkNBQUNGSkhJRkhISkhGQUBfaERCQVV0h4mHh4aHgldJTE1MTU5MSkdHR0dER0dHR0ZIRkhFQ0RERkVEREhIQ0NDR0pKS0xMTExMTElKS0pKSUlJSEpISEdISUhHR0hGRkZISklJSUlIXW9vcXJzd3d6e3t6e319fn59fX19fX5+fYB/f39+fn+BgIGAgYCAgICAgIB/gYCAgHxNR0ZIRkVGR0dKS0pMTUxLTU5NT0tJSEhKS0tMS0pLTEtMSFRfaHF7V05shIeGhoaHh4eHfFBLTEtIR0ZGREVDQ0BBQ0NDQ0ZGRUJAPj5AQUFAQkQ/Pj9ERkhERUdJS0lJR0hJR0lJSkpJSEZKSkpKSUpJSkpKRklMTEpKS0tmb3Bzc3V2eHl7e3t8fH1+fn19fX19fn59f39/f35/f4CAgICAgYCAgIGAgICAgICAfU9GRkdGR0hHRUZHR01NTUtMS0lHQ0NDRElLS0tLS0xMYFhnf4SGhH55f4aFhISGhoaHh4aKdUlJRkI/P0A/Pz88PDw+Ojo8QUFAPjw5OTg8PD07Pjs5Oz9BQkFBQ0NDQEFCRURCQ0ZISUhISExNTEdJSk1NTk1KSktLSkxNU2xvcXRzc3d5e3t7fH19fn9+fX19fX1+fn5/foB/fn9/gICBgIGBgICAgYCAgIB/f39+UUZFRkdJSUdEQ0VGTk1MSklIRT85Oj5ARUhHSUhLTE9teYOEg3+AgYSEhIWFhoeIiIiJiYyOZkJCPTg4Ojo5ODc4ODk2NDc5Ozw6ODU2Nzc4OTc4NzY4OTs7PD5AOzk5OT09Pjs7PUFERUhKTUxMR0lIT1JRUFBOTE1NT1Fdb3BydHN1eHp8e3x8fn9+f359fX59fX5+f39/gH9/f4CAgICAgYCAgICAgICAgIB/f39RR0ZHSEpIRkVGR0hMTEpJSUdDQjU2OjxDQEJGSEtIUHWCgYCCgoKDg4OEhomKi4uLiomKi4yJVDs4NjU2NzY2NjQ1NzYzNDY4Ojg3NjU2NTY3Nzc3ODo3Nzc4OTs3Njg5OTg5ODc2OjxAR0ZJRklGRUZPU1JTU1JPUFBSVGVwcXN0dHd5e3x7fH1+fn5/fn19fX19f39/f3+Afn+AgICAgICBgICAgICAgICAgH9/flJISEhJS0lHSUpJSkpLREVIRUJANTc4OD06PERCREVNdoF/gYKDg4KDhYmKiomJioqKiouJiYqBSDY3NjQ2ODg3NDU3ODQ2NzY5OTc2Njc2NTo6Ojo6PDg5ODk3Nzc3OTo6ODg3ODU4ODtBPT4+QkE/QUtMT1FQUU9PUFFXa3JydHR1d3p7e3t9fX5/fn9+fX19fX5/f4B+fn9/f4CAgH9/gICAgICAgH+AgICAf39+VEhHSUlMTUtKS0tMSUg/QEFAPDo1Nzk4OTc6QTk8RE54goKDg4SEhIaJioqIh4eIiYqKjIqJiYx6Pjo4ODs8PT45Ojs8ODk7OTo7Ojk5Ozo5PT09Pzs7Oz06Pjs5Ozs8Ozw8Ojs8ODo6Ozo5OTk8Pzw9QUJESUpNS0pLTFdvcnN1dHZ4e3t7fHt9f39+f359fX19fn9/f35/f39/f3+Bf4CAgICAgICAf4CAgH+Af35URkVGSUxOTkxKSk1CPzo7PDo4OTk4OTk5OTo+PUBAT3+Cg4SEhoaHiYiHhoaGiImIiYuMi4mKioxsPDs+QkNFRUFBQUI+QEJAQD89Pj5APz4/QD9APT0/Qj9BQT9BPz1AQEA+P0E8Pjw7Ojs6OTs/PTs7PT1BQUNBQkNBWHFxdHR0dnl7e3x9e31/fn9/fn19fX5+f35+fn9+f4B/f4CAgIB/gIGAf39/gICAf39/flJFQ0FHSk5PTElHSzo4Ojs5Ojo8PDo7Ozw7PT5BQT9ig4OFhIWEhomJiIeGhoaHiImKi4uKioqLiotePkRHSUtKSUZHR0RGSEdFQ0BAQ0VDQkBCQ0I/QERIRUNFREZFQUZFRkRGRkRAQj49QD49P0A+Pz8/Pj8+Pjo7PTxgcXJ0dHV3enp6fX19fn5+f39+fX19fX5/fn5+fn5/gH9/gICAgICAgICAf4CAgIB/f4B+UERAPUNIT01HRkJEOTc6Pjo8Oz4+Pz88QD5BQERBTX+DhIWGhoaIiYiIh4aGhoeJioqLjI2MjIuKiohXR0xMTUtOSklLSElKSklFQ0RGR0ZEQ0VGREJISUtIR0dGSEdFS0lLSUtLSkNGQ0NEQkFBQ0JEQ0NERENBPTs9QGhwc3R0dnd6eHt8fH19fn5/f359fX1+fn9+fn59fn+Af3+AgH9/gICAgICAgICAgH+AgH9PQT49P0RMS0BCQkE5Nzw+Ozw6PT8/QT1AQERDR0JqhYKFhYeHiImJiIiHhoaGiIiIiYqMjYyMi4uKjH9QTVBNS05LSkxJSUpIS0dFR0hISUVFSEZGRUxMTUlKR0dISUpOTU5MTE5LSEZHR0VFQ0ZGRkZERUhIRkNBP0BMbHB0dXZ4eXl5fHx8fX1+fn9+fn19fX1/f35+fn5+f39/f39/f3+AgICAgIB/gICAgICAf1FBPz4/RkdHPTxAQDg3PDs7PDk+QD4/P0FCRURLVn6DhISFhoeHiIiIiIiIh4eIiIiJioyNjIyMjIuKjXFNUU9NTExLTEpJSEZKSkVKSEdLSkhKR0dHS0xOTExISElKTVBOUE5NT0tJR0lKSElESUhIRkZHR0lGQ0JBQ1VucXV2d3l7eHl6enx8fX5+f39+fn1+fX5+fn5/f36Af4B/f3+Af4CAgICAgICAgICAf39/VERBQUJHR0I/OD9AODo7ODw9Oz1BPT4/QURFRk5uhIOEhIWFhoeIiIiIiIeGiIiIiIiJjIyLjIyLi4uLi15SUlBNTk1LSkdGQ0dKR0xKR0tPTEtKSk1NTE9QTkhJS0xPUVFQUU9PSklKSkxKTEZHSEdFR0lGRUVCQEJCXHByd3h5enl5eXp6e3t+fn5/fn59fX19fn9+fn9+f4CAgIB/f39/gICAgICAgICAgIB/f39VRUNFRUdHRUQ7P0E7PTw5Pz0+QEJHRj9ERkRITXWGg4ODhISGiIiIiIiIh4eIiIiIiIqLi4uMjIyMi4uNfFdWUlJUUk9MS0pFRUZLT05PV1ZRUE9RU1JOU1RPTVNMUFNVV1JTUlBMS01NTUtOR0dKRkZISkRERUVCRENjcXV5eXp6ent6e3p7fH59fX9+fX19fXx9fn5/gH9/gICAf39/f3+BgYCAf39/gIB/f39/f1VGRkdHR0dIRj5AQj0/PT1CPkJDRlZNQ0pLSExPeYaDhYWEhIeIiIiIiIiIiIiIiIiJiouKioyMjIyOi4uLZ1ZWa2FFUlFRUEo7O1FTUmB1XVVWVFZZWVNZWFJaZlBVV1pdUlRXUVBOUlBQUFFLS0tHSElIRUZJSUlISWpzdnl5enl6e3t8ent8fXx9f359fX19fX1+f39/f3+AgIB/f39/f4CAgIB/f3+AgH9/f35+VEhKSUlHR0ZFPz9BQEVCQ0ZFREVMWFJMUVFQUlN6hoWHhoWGh4iIiIiIiIiIiIiIiIiIlJyMioqMfWGKi4uGbFtkVTpYWFhTUD9AVlVZXGRgVllicl5dV11aVkVRWVpcWV9UWWdSVVZYVFRWU09PTUpMSklJTE1LT01Tb3R2eHl4d3p6ent6e3x9fH5/fn1+fX19fn1/f39+f4CAgH9/f3+AgICAgH9/gH+Afn9+fn5WSkpJSEdGRERCQT9ITUlNUEtJS1BUU1JWV1ZXVnaFhIWFhYWGh4iHiIiIiIiIiIiIiImcnaCPiY5nO36MiYqLeW5wWFpbWlJTUldWVFpadYNZVX2QYVxYXV5XSVZdXVtbX1lIWVhZXF1YWFlXUlFNUFFNTU9TUVFVUmFzc3Z3d3Z4eXh6e3t8fX19f39+fX59fX1+fn9/gH9/gIB/f3+Af3+AgICAf39/gIB/gHh5fVlNS0pJSUZCREBBOlBRUVdYUFBPUVNUU1dXV1hYbYGCg4WEhYaHh4eHh4iIiIiIiIiIiJaanJeIioFuhomIh4OKfmZZWVxZU1ZUV1JRV1ZjloBRZXJYWldfaFBgZlpbWFxoYkdPWmlnXFtcXV1XU05TUFBRVlZWVllab3N1d3Z2dHd4eHt7fH19fX5/fn59fn18fn9/f3+Af39/gH+AgH9/gICBgYB/gH1yfX9/b3R8XVNPT01LSkVDP0A7UFBaWltTU1FPUlJRVVJVU1ZfdXiAhYSEhYaGhoaHh4eHiIiIh4eIh4ORjomJiIaFiIiGfYB7XFBWWFRSVFJRUUxPTUtmeVpdVFlVVl1aTFRaVFNUXlpYV1dXemtYWlxcXlNQUFBJTk9XVlhbWmRxdHZ2dHR2eHl5e3t8fH19fn99fn1+fX1+f39/gICAf3+Afn56eHd2c3V7f3+AgHRrfn5rcnleXFZVU1JPS0ZDREFNXoNsVlJTTk9RT1FWUlNSUlRjZHaAgoKDhISEhIWFhISDhoaGhoeIhn6JiYiHhoOHh4d5bXFWSUtOTktNS0hKREZIRUM+U2NVf1JQUU5LUlRRTU9ZUU1OUVNVVU1RU1JQTkxMSENJSFJTVFpdbXJ2dnVzc3d7ent7e317fX19fn19fX59fn9/f39/gH99fX5+f39/f4B+e3Zzd31+fmR1fWlxdF9kXV5bWVVRTElMSWFsknRQUVNOUVJRUltSU1JRUlVVYnN7fH+AgYKBgX99e3uAf4OChYaHgoaGhoGEgYaFhnVfXUtDPkNDQ0NCP0RQQ0RAQz5CSEdWQElOTUddaVFIRk9GREVGSEdIQkNIR0hKR0RCQUNATlBNUmR0dXZ1c3R1enx6e3t7fH19fHt+fX19fn5/f3+AgIB/f3x8fX+Af39/f4CBgH12dHt/bWh8Z25xZmllZWJcWFNRUFVSc1dlW09PTkxRU1FVWVNVUVFUUk9WYGtsc3Z6e3h5dXJuc3RzeXh+foOAg4KCgIKAgoGBa0xHPj46Oz5APz8+PmpQSmFFRkhJRUI/SE1NR01RVUpCRT8+PD08PT0/PT9BQ0I/Pzw9Qj5KTUZVb3V2dnN0dnh7fHt9e3x9fX19fH59fXx+fn9/f4B/f39/e3l3eHd2dnh7foB+fXt4dnx1YXhnbHBqbGppZmBbUVFaXFleSUpQUU5LTFFSUVRWVFdRUVdWUFhbYl1hZ21tbG9raGBucmptbHF1e3p9enh6fHx4d3hkQkBAQT06QkNCQUNBW1xOe05PT05LTE1PT1BMS0xXTklHQEI8OTc3NTk5PTs7Ozg5ODk/O0FHPlx0dXZ2dXZ3eXx8fH18fHx9fn58fX19fX9/f39/fn9/f314dXd6e3p3eXh1d3t8eXh1eXdjcWhpcG1ubW1oZl5PUF5cWklHUFJRT01QUU5RUlNWWFNSWVROWVpbV1lcX19gZWBdXnF3a15gZ2t3b29sam9ubmxmYllHRkZIQkFGSUVFRkNMUU9hV1JYUVBTU1JVW09PUVZQTUlDRj46OTY1ODY5Nzk6MzY1Nzk1PEI9ZnR1d3h3eXl7fX18fHt8fX1+fnt9fn19f39/fn5+fn9/e3d1eX18enh8fHx8dHd2d3Z1d2tuaWhxbm9vb2prYFVXXlpXTUtUVFNQUVVPTFJTVFdYVFRYUUxXWVlWWFhWWFldV1dYaHNrXVZgdGthYV9dZGBfXllVUE1PTkxJR0pLSUhGQ1BPU1pXVFROUVNZU1xlVU9TVFFOS0lIQz9BOTk4ODk3ODg0NzU3ODU5OEducnV4eXp7e31+fX18e318fX5+en1+fH1/f359fn59f358dHR1e3hycW9vbnR4cXJzeHZ1cWZkZ3JucHBxbm1kXV9fWVdPUFdWVlNUVk9PVVZXWFlTVVRMS1NVVVVVV1BUVVdUVVJdbl5STllgW1ZZO0RVV1RbZkpMUFJST01NTk5OTEpGUFBVWVNUTkpOT1RTVFxWUlVTU09NTElISEY/Pz06Nzg3NjU5OTY3NjY1V3FxdHh5ent8fX59fnx8fXx+fX15fX18fn5+fXx8fX1+fXxydnF4eHJ1dXFxbnBwb3B1dnRuamRkanBwcXJwbmZlZGNcXlJUWlZXVFNWVFJYWFlZWVJVT0pHT1BPT01SSk9QUFBOTk9UTE1JUFBTVFUyPFhNSUFRPWNgUVNRUE5QUVBOTk1QTlRSUFJMSUxLT1FQUVJTVFFTT0xNS0xMSENCQT06OTg3NjtCNDU2NjtlcHJ2eHl7fHx9fnx9fH19fX18e3h8ent9fX58e3l9fH18e3B1b3d1cHV0b3N2cHFxcHV1dmNqZ2VXaHRycnFuaWlocFZWVFVYVVZVUldWVVpZWFdVUVNGRUFGR0dIRkpESEpIR0VITEhLSUdMTVBNRy9FX1I+M0A+am9hUlJRQEZUUU9QUFFOUU9QT0xKTExPUE5OUFFRTlBPSk1NTUtHRUVEQjs9PTw5PUc2Njc3RG5xdXd6fHt8fX18enx8fX5+fXt5dnh3eXl8fXp6dn17fHp6b3Fud3JwdnFtcHNwb3Bzc3N0ZmdgaFpXa3JzcmxtbWtuYmVQU1RSU1VPV1ZWWVlWUVFRT0A+Oz0/QEJBQ0BCRURBQEdIR0hGRkhKTUxER0NPUkM4RU5TXWdTUVNBR1VQT1JRUE1NTkxKTEtMTk9PUU1PT01ITEtJS0tMS0dGRkVEPEFBPjtARTs8ODlUcXN1eXt7e3x8fHt5fHp6fn58e3V0dXJ2dnp6eHpyfHt8eXltcW94cnF1bm5xcm9vb3Rzc3J1dGtnZ15lam1wa29xbWltY0xPTk1RU0xUVVRXV1VMTEtIPTk4Nzs/QT49PUFAQj0+RUhGREZGSUdKSkBGQUFARkhFSk9IUVJhXFFQUk5TT09QTExPTUtNTE1PTltWS01RT0dJSERJSkxMS0ZGRkQ/Q0M+PUJHP0I+QWRxdHd7ent7fHt6end8d3l+fnt7cXN0cHJzd3R4eHN6e3l2d2xxb3ZxdHRsb3Fybm5vc3ZydHNycmtsZW5zaG1ubWxtbGprSUxISE9RSlFTUVRTT0tIQ0U9OTg3OT9CPzs+QUBAPkFESUVDSEdJR0lFQkI/PjxDQkFHSURNT2FlUE1PTldLTE5LTE1NTExLTk5TZE5KTFJJSUlFQUhKTE1OS0dJRkJCQkA/RUZFSERMb3B3enp5e3t6fHp3c3h0eHx8eXpucXJtbm9ycnZyc3h8eHZ2bXBtc3B1dGxwcHJvb29ydnVyVlZucWdseYRqbXFybm5qaG9ISkNHTE1JTVBNUE9HS0U/Qj05OTk6P0I/PEFCQUFEREdLRkRJSUdHSENDP0I/P0BBPkNFQ0tOUVRLSklNVEZJSUpMSktLSUpMTU9QUlBLR0NMR0NDSkpMTU9NSUpJR0NDQ0RJSk1MSVpzbnh5eHp7e3l8dnJwdXJ0eXl2eGpxb2psbG50dG1zdXtzdHhyb25xb3ZzbnBvcnBvcHN0eWpOYGdzanR8eWdvc3FpcWhlcUhLQ0ZISEdKS0lKTERHQj0+PTo6OjtBQj89QkJDQ0hGSkxKRUlJRkdHQ0M7QUBCPkBAQ0VDSU1PR0hLRkhLREhJS01ISkxISUpMSk1dUklIRE5HQkVLS05NUE5LTUpLRkdHSk1OUU5MY25qd3Z2e3h7en1xbWxza3B0dHR1aHBtamlra3RwbnR0eXByeXRvcnFvd3NvcXB0cnBydXR5a05WbXVscXt2aW5vaWp0aGRwRktDRkVHREVFRkVHQ0NAPTw9Ojs6OkBEQD5CQ0VFSUZKSkxGSUlHRkZDQjtCQ0M+QENDQ0RHTE5IS05IREhFSUxOTUdJTEdGRklJTE5LSkhFT0lDR01NTk1QTk9PTUxJSElPU1FSTlJmZ2Zyb3N4dXt6fGxoam9la3Btc3FmbWxoaWtsdG1wdXR3cW94dG90c3J2c3BxcnRzcnR1dXZ2WFZ1dWtvdHJrb3ZsaG1lX3BHSUNFRkVCQkFFQERCPj8+Ojs7PTs9P0NBP0FDRkdKR0pJTEhHR0dGRUM/PUVFQj5BQ0NDREdJSUdNUElGRkdLTk9LRkhJRkVERElJSEtJRkhQS0RKTUxQTk9OT1BOSkpITVJVVVJPV2RhYW1ncXJvc3l6Z2VoaGNpbGdxbGZsbWdpa2xzbXB2dXRwbnZyb3Nyc3V0cXNzdXRzdXZ2dnl2dXR2bGt1dW1ydnFsbmxlck1HRUVHQ0FAQUQ8QkE+QT06Oj0/Oz4/QEI/QEJFR0pGSkdJR0ZGRkVEQ0FBRkZDQkJCREVFR0dIRkxQTElPSkpMS0lGSEVGRURDSUhIS0pHS1JNQ09PTlFQT09OT09LS0tQVVdWVVNZYF9daWFuaW5ocnNiZWZmZGloZm5pZm1taGtrbXJpcXZ1c3Ftdm5vcXJzd3Nyc3R1dnZ2dnd2d3Z2dHd1a3N1bnV0c3Bya2tzTUZHRUdBQkBDRDxBQUBDPDg6PT46Pz0/Qj9AQERGSEVIRkZIRkVFQ0NEQkRJRkNHRUFFR0VGRkdFSk1LSFFNSktISElFRkhIRUNJSUpLTUtQU05EUlNRUVJOT05OUE1MTlNXVldYVlheWl1kYGhiamlna19kZWZjZ2dna2dna21rbWxwcWd0dHVyc252b3FwcnR4cXNzdXZ1gpF5dnZ0eHV1d3hub3VvcnN1cXFpcHpNR0dHSEJCQkVFPEBDQkQ8Nzo9Pjo+OkBCPj8/Q0VGREZEREdFQ0VDREVGRkpFRUlHQkdIRkdGRUNGSkpHTUtMS0hKS0ZJSEpIRUtLTExOT1JUT0lUVVRRVFBRTU5RTk1RV1pWWllXWl5aWGFgYGBfaGVjYGRlZ2dqaGhqZmhubGxvbXFwaXV1eHJycHVwcHBydXZwdXN1dnV7fn14dnR3dnZ2d3BsdXBtc3Vub3NzeU1ISEdJREFDSEU8QEVCRDw4Oj4+PTw8QkI8QD5BQkZDRUJCSENDREVGRkdHSUZHS0hDSUhHSUdGREhLSUdLSU1LSktMSExKTUtJTkxOTk9SVVZPTFZWVFFUUlJMT1FQT1RZWllcWlpcX19eYGNeXGFja2JgZGdocoVoZ2pmam5ucG9uc3FqdHV4cnNzdHJucHF2cnF1cnV1c355jn11dXZ2dnZ4cml1cWtydGxxd3F1S0lLSEpFQkRHRTxAR0REQDk8PkA/Pj9DQjxAPkJBRkNFRENIREZERkZISEZIR0lLSkVKSEhLSEZGTEhISEpITUxMTExJTUtNTk1PTFBQUVVWV09LVlZVU1NSUUxPUlJRVltbXV5bXV5gYGFgYWVdZGBmZ2BlaGpjc3NmamhnbHBycW9zc25zd3dwdXZ0c21vcnVvcnNwdXJ2cnSBd3V1dXd2dXdzZ3Rya3Fya3J3b3dJSktJS0dCRERFPEBGRERCOz8/QUBAQERBQEI/QUNIQkVERkhFSUVGRUlIRklISkxISEpKSUtKRkpLSElKSkdLS01MSkpNTE1OTk9MT1BSVVdWTU5UVlVTUlFQTU5UU1JXW15eX1xeYGBhYWFgY2RlYmRpY2Rpamd2i2xraWhtb3NxcHFwcHJ5d3J1dXRzbW1zc21xc290dXRzcHN3dHV1d3Z1dXVlcXNrcHFqcnZwd0pMS0tMR0NDQUQ8P0VFRUM9QUFDQkJDRUFDREFBRUdDR0dIRkVJRkNHSkdHSkZJTEhJSk1LTUxHS0lIS0tOUUtSUUxTTUtOTU5QUFBUT1dYWFtOU1FXXFpTVlBOVFVUVFhaX2JiX2RhX2BiX2BmYmFjaW5pY2loaG14dm1oaW1vc3JwcXJycnZ0c3Vzc3Nua3NxbXByb3R2cnJxdXZ1c3d5d3V0dWNtdGtvcGpxdHB3TE1MTExHRUFARD4+REVGQz9DQUVDREZDQ0VHQ0JIRUJISUlISEtGREtKR0hKSElLR0pKTktOS0lMSEpNS1pmSmRcS2xSSE9NX25VbHNbcXBid2NSUGJ2dWh1Y2F2YFhucWJkdmluemZcbHRgbGtVX3d2aWpoaGZnbG1qbW9qbW5zcnBycnFyc3Jzc3J0cm5sdG9ucHFxdXVxcXN0dnZ1dXl3dXR0YGt0a3Bwa3FzcXlLTkpLSkZCP0BCPz1ERUZEQ0NCRUVERkJGRkdEREtEREpMTEpMTUdHTklISktHS0pJS0tOTE1MTExJTExMW3NiZHBebGxVTU5lcl1nZnFsbnRncGlfYVlubWJwcGJrampnb3F0ZXRub1xvdWdxTUtyeXZrYmFrZWVseG1rdmxucHNycHJxcHFycXJycnRybW1zbm5vcHJ1dHFzc3R1dXV0d3h2dXRibXVrcHBscnJxektMSUlHRUQ/QUI/PUJFR0JGQ0VERUVEQkhIR0RFS0hHS01NSk1MRkpOSEpLSklLSkpJSkxNTk1NTUtOTU1bcm9vbnBwbGtOUFFsWE5pYnRycGFtb3ZcWWxQW21tWnFta29teHh0c2lwXGBzbHFqVXV5eG9jXmtmYmdwcGppb3Bwc3NwcXBwcXJycXFycnRsbXJtbW5vcnV0cXRydHV1dHV1enZ1dGVudWtwb2xzcnJ5SktHSEZFRUJBQj0/P0VHQkdESUVFREJGSUhIRUdLSkdNTU5LTU5HTE5JTUtISk1JS0lKSk5PTk5NTE5NTFxoZHVdbHFXbE5PUW5VWmtea2x2YWxkdFRlY05sWWxcdHBraWx4and1aHBdX3NraFdiY3d8b2NgZ2hhY2l0eWtubnFzc3BxcHFwcnFwcHBydWttcW1tbW9xc3Rxc3J0dnZzd3Z6dnV0aG91bHNvbXNydHZJTUdJRUVEQ0FCPEJAQkZDR0ZLR0VDQ0hLSEhGSkxLRk1LTFJSTEdNTUhOSklITkhKSkhITk9OTkxKTU1KWnNwcG9xcW1sT1FTb1lza2dvb3Fxb210Xm5YYXRfbm9wb3Fyb291c3R0altddGN3eHJqbnpoYWFjZmFiam10dXBzdXZzcXBwcW9ydHt/fn13bGtxbmxtbnByc3F0dHN1dXR4eHl5dHVrb3VtdG9uc3N2dEhLSEpDRUVFQEA+Q0NBRkNISU1IRkNGSkxJR0ZLTUxGT0pLV1JLR0tKSk5JSUpMSUtKSUhLTU1NTElLS0tTa2JaaV5famNyclpfWmtvYGVlVWtfY1thYlFgbWhcalxuaWlkWm9lZHBdWlxrW21xY3BzbGRnY2RnYGBrbnBwb3R5cnVxb3BxbnmFiIeHhoWAdnNua21tb25xcnR0cnR1dXZ5eHhzdW5xdW53cXJ1dHdySEhGSURFREZBQEFFRENHQkhKTEdGREdLTElFRkpOS0lPSUxbUUpGSEhLTUlISkpLS0lISkdMS0tLR0hKSkxMTEtJS0xOVFtdVFBVTVFQTk9PVVJQT1FPT1FKSk5QUWRxaVRZVltbXFVZW11YXVxcY2ZhYWZiY2ZfXmZrbWhtdHlydHJvcHB0hoeGhoaFhYaHg3pwbW1sa3FzdHRydHZ0dXl5eHV2cXJ1b3ZydHN1dXNHQ0VHRkZBRUM/Q0dERUdDSUtMSEZER0tMSERHSFBLTE9LTFdNSUZFSElKSElLSExKSUZISEpHR0lFRktISUtOTElPXFdeT1xcYF5PWFlTXFxiXk1ZWk1YYVJLWWFaU2BkXWJYW2RkVlZYXFlaWFxWWVxeY19kYWFfZWhrZ210dHFxdHBxcoGGhoaFhoWFhYaGhoR9cmtpb3Jzc3N0eHl5eHl4d3h0cXhyeHNxcnVydE9CQ0RMTUJDREJESUVHR0ZLSktIRUZKSkpGRUhIUEpMTUpNUklIRUFIRkpJS0tJTEpJR0VKSEVGR0VFSkdCSU1KS1RfWWBYYGFbYFVYWVReXlpfUllcUF5cWU5fXF5TW15jX1pdYGNfWV9iW2BeW1RZWFpfXmRiYmFjZmlla3Jwb3Bwbm93hoaFhYaCe4CFhYaGhYaFf3VxcHJyc3Z5eXp5eXh4eHZyeXZ4cnF4dnR2YVNKSk1JREJCQ0ZHRUdHSUpKSUlER0tKS0ZGSUlOSk5MSExOR0hGPkdHTElLS0pLS0lHRUlFRERFQkZKRD9JS0hOW2NZXl5hX1JUU1dfYFxdWV5RWVxNVl9XS1FZW1FbX2FhXV5jYWBiYmJjY2VaUlhWVlxbXmNgX19jZWJob21tbGxsbHWFf4SDeXV8hIWFhYaGhYWGhoN9d3JydHd5eXl5f359eXV5dnZybnp3dnhYUUpGQ0dFQkVHSEZHSElGR0pHSEZIS0lLRERKSk1NTExISkpISkc/R0ZOSktLTUtLS0lHSEVEQERBSElBPkhJRk9dYVpbZF1fVFFSWF1cXFxfWktXXExSXFlJTV5RUV1fYWNjY2NiXGRjYmRjZlhRVlVTXFhbYV9eX2FhX2Rsa21qa2xudn51gXp8hIWFhYWFhYaGhYaFhoaGgnpyc3V1e4WHh4eGhYSBfnhwend2eFxSTUJASUZDRktJRkZHSUdHSkZGRklMSk5FREpKTE5KTElLSkhJR0JISFFNS0tPTUtLSUhIRUQ/RUJISEFARkVDVF1ZXlhfWF9bXVVYWFBdXVFLSlZeWF5bXVZaYVJSX19iYmBgYmJgY2JiZGRiWE9SUlNcU1xeXV5eX19gZGhnbGpubnB7e3x+e4CCg4SFhYWFhYWEhIWDhISHh4FzcneFh4eHh4eHh4eHh4WDgHx4XFNLQkFHRkRHTVJIRFJLRkhISERGS0lNUEVHSUpLTkxMSUxLSUlHREhLUU9NTFBMTEtLSUlDRUFFQ0hGQUFGREFWVUVcVF5TVmBYTlRVTlpbTUpLVGBhW19YX15iXU9ZYlxgYF9iY2JdYmJXX19UUE9RUllTXlxcXV5fYGJmZmVsZm9vd3x7gHt9f4CEhISEhIWFhYODhYKDgoWFhnpvgYaGhoeHiIeGhoaFhYSFg35JTkZERkZHRElSY1FEV19JR0dIREZNSlBQRklJSktOTExLTUtKSkdFSU5RUU5PT01OTU5IS0FEQUNERkRCQUNEQExIQkxMUE9PTUZNRkZISUhHTExNT1BJTE9QUFNQTFFTUlVaWVdZWFhkVk9TVFBQT05RVVRcWVlbXl5hYWVmY2hka2xxc3N6eX97en+EhISEhISEhIKEgH57gYOBfXuFhIaGh4eHhYWFhISEgoGAfUtJRUVHRkdES01eTUdIWU1HSEpIR05MUVFJS0pLS05NVU5PS0tMR0dLT1NTT1BPTk9PT0hLRmBFRF9MRGZjQ0xbSF5bc21PTVZtWUxDUF9UbFdnSl1XVV5ETVFVTE1TVlFSVFhXVFhVVFxUUGZaaGhkWVRrVFhXVVtcXGBgYWJiYmBnaWdubGhyenx9foGEhISEg4ODgX19enJ7gXp7f4KAg4SEhYWBhIWBg4N/fnp7S0lFRkZIRUVLT1RKS0dgVEdKT0pJT01SUUtNS0xPUlVST09KTE1HSE1RW1lPUFBOT1BQSktRf1FJfFlZcnNXUG1IcW5vYVZQcXF0T0Jrc25xdHBTb19bblhdVlxYVWtoVV1WY1lgWVpfVlVXf2l0dXVfYXZfWWJcXGZbX2FhYWJeYGJnbXBsYHB3dHiBgYKDhIJ/fX6Adnh6bXZ+dHh+gHx+gIGChHyAg3p/gX9+d3dNSUVITU1CRExMR0pMRlJWTExPSExSWFdRTk9PTFFUTk9RUEtLTkdNUFNbWlRRUk9QUFFLSVp4XVR4ZGhZUlNQdmd0bHBibmZrUnJOTHdtanJwc3JxcnBvcIBdZnp1eHFxenF+cn1rdX1iUmd8ZXNzb3NzfH1wfnlvf3JfYGBiYlthYGhrbmtibGZnbXd+gYCDfnt4d4B0dnpocn5udHx+d3h7foCDeHyBdXx/fHxzc05LRmBdR0FFTU1IS0tISlFPTU5KTldeWVVMUVNOWVlMU1NSTkxPSVFSVFlXV1FUUFBRU0xIZ3hsY3hxbVpLTFR5cHVtdWJudlBkZUlldnFtd2+AamZ4eGlYclJpe21panp6fWx4en9wZ29YdXVqdnVwgGFzaH1pbHh8b19fX2NiXF9kZWZpamRnYmNkbGxwcHN0c3NzeXFyeGJsdGdyeXtzcnV5foFzdnpufH15eHJuTUpSdE5DQkVQUElLTEpMUU9PT01QWmBaWEtUV1BhXlJWUVlTTVBKU1RVWFdXUFVQT05TSktyb3V1cXVxZGhhVm5McXBeR2h5V3ZUS2h4fXhgeXtzbmFebW9kU2dydW5teXB3bHZzdHFsbVxzfXprbXl8bHVtfGtwdnV4Xl9fYl5dX2VkaWdoZWVeYmJpaWlqa25va3FubWpwYWNmZG93eG9tcHN5f25xcGp7enRyb21LS1pWSEdFR1JQS0xOS0xRUVBQUFFXXFlVTlZZVWZYUlJZXlRNTkpUVFZXWVdPU09PTlFJUm1IaXdLYGR2dVVXbE5ubHtyYWpnf3ZVS1draH1sbWx4YFtwentfYHpzY3JveHFoZHxpcntdVEtsX3Z1a2l1e3ttfnhrfHBdXl5iW15iZGVnZWVlYlpjY2lra3JzcndnbWloZGdgYWxhZ3NybGhtbXJ8a21oa3t0bW1rbU9HSktISkhIUlFNT1BNTFNTUk9TUldSVlRQV1pWVlRUVGFgUU9OS1RTU1FWVk9PTU5PUUpIUU5QVUxLS1JTUlJST1ZVUVFPUlJYWFFOUFVUWFhYW1tVU1NXW1dYV1tPUlRXV1hRXVhWXVVTT1hSVldXWFpgW2dyXltbW11dX2NaX2NjZWZkY2NiWmNjZ2ZmbW5tdWZmZ2NgZl9dZ2BkbGhmZ2tocHpoZ2drdWpoZ2lsUElLS0xNS0pUUk1SUVBMVlVUUFRVWFVaVVJaXVZVVFdVWVhQT0xOV1RQTlVTTlBOTFFQS0pRUUtRTUpLT1FUUlFRU1JJSU1OT1FSUVFRVFZSWFdcV1NTUVFVVVZUWlFOU1FXVVRZVlRZVVNSVVNUVVhZWF5aX2FdXFtaXV1gY1xdYmNkZ2VkZGFZYGFjYWJoaGluY2FkXl9jXVpkXGJtYV5mZmdtc2RpaGtrZWRkZmhRSktLTk9MTVRRT1RRUU1YV1VUVlhXV1pWVFxgVldWWVVYVFFQS09YU1BOVVFOUk5MU1BNTlVTTlFOTU5RU1BUUVNUVE5MTk9RVFRSUlFWV1VZWltZU1VSVFhXV1lbU09TVFdVVFlVVllUUlJXVVZYXFpbYF1WWV9dXl1cXWBhXltiYmNoZmVkYlhgYGJdYGhlZmRhXl9dXV5aWl9aX2dgXl5dY2hrYWhmaGZkYGJkYlBLTUxQUUxPVFBQVFFPUVpZWFdZWlpYWVZdamRWWFlaV1ZUVE9LT1ZUUE9UUFBRTk1RUU9SWFNRUU9NT1NVTldRVFRVT05OUVRVVVRUUlRYVlpdXFpWVlFSV1hWW1xWUFNVVVVWWFRXV1RSUlhWVltfW15gX1ZfXV5gXFxgYF9fWmJiZGhoZWRiWWJgYl5eZmRjYGJdXFxcXFlaW1hbYVteXV1fYl9fYmRkYmRfX2BcUE1OTlJRTVJTUFNUUU9VXFpaV1tbXFlaW2RxbWhkX1tZVlZYUk1NVlNNTlJPUVJPTVBTUlVaVVNQUExQV1VRVlJTU1hNT1BRVFhVVVVTVVlYW15dXFtWUk9VVlVbW1ZRU1ZVVlhUU1haVFNRWVdXXV9bYF9gVmJcYGFdYGJfXGBdY2FjaGllZmBaY2BhX19lZV9gY1taXFtcWlpZWVdcWlxbYF5gW15eYWBfY1xZYFpRTk9OVlFQVVNQVVRTUFdcXFxZXlxfV1xeanB3eYBjXFtWVllSTk9XU05RUVBSVFJMUVRTWVtXVU9STlNYVVNSVFJSWk9RU1NWW1VWVlRWWlhdXlxcXlZTTlRWVltbVVFTVFZYWFJTWVxUUlJcWFpdXl1hYWBXYltjYl5hY19cYmFiX2RnaWRnXlxlYGFgYWNkX2JfWVpfW1xbWFhZV1daWlphXF1bXVxcWl1gV1tbWlBPT09ZUFVVU1JXUlRQWl1eXVxgXGBVXF1oanJ9c2xoXFVZV1FPUltTUlFUUlRVVEtSVlVaWlpTT1NRVVVVU05VUVJaUlRVVFhdV1hYU1hcWF5dWVpdVVVOVlZXXlpYUVVUWFhYU1ZZXFRSVl1ZXV1hXmNjX1lgW2ViX2RkXl5jY2FeZWZpZWZdXmRhYWFiY2RfYl5YW19bXFtYWFhYV1taW2BdW1tcW1haW15WXlldUE9PUlpQW1VVV1ZUVFReXmBfXmJcYFVdXmJreXVtfWxaVVpWUVFUXFRUVFVUVllXTFJaVlxaXFJQVVNXVVVTT1dRU1dTV1VWW11YW1lVWl5YX15ZXFlSV1JZWFlfWVlTVVVaWVlVV1lcVVRaXVxeYGFgZWRdXl1dZWFiZmReX2RjYFxnZGhmZGJfZGFfYWBiYl9gXldZXlpcXFpZWVdWXVpdXltaW1xbV1lcXVZYV11TT1BXWVBdVVZZV1dVWF9gYWFgY11gVV1eYmVldoJ7aFhZWlRWVFZcWFdXVlZXXVhPVVxZXl1dVFNYUldVU1JTWFJTVlRYWFhdXlhdW1VeX1hfX1hcVlFZVVlaWmFYXFVWV1paWlhZWlpXVl1eX15jYmJlZV1iXGBmYmVmZF9gZGJhW2ZiaGZjZmFmX19hYmFhYF9eVlVdWVtcW1lcWVldW1tbWFhZW1laWl1fXVRZXVVOU1pXVFxVVldZV1ZcYGFhY2FjX19WW2BkYV96dW9oWlxaVlhWWFtaWVtZWFlgVk9UXVtgYVxVVVlQVFZUUlZWUlRVV1tbXF9eWl9cVl9fWl1eWV5WU1lYWVpdYVleVldaW1pbW1tZWlhZX19gYGRjZGVlYmRaYmZjZ2ZlXmFiYGNeY2NpZWRnX2deYmJjYWFgXl9YVFpaWltbWFxYWFxbWltXV1pYV1xbXGBdVl1dU09WWlZWWlZZVVhXWF5gYmFkYWRhXllZYWRiYGtmaF5cXVtXV1laXFxcX1tZW2JWU1deXWFjXFNWWVBWVVVVVlZTVlRYXV1fYGBdYV1XYF5bXlxbXlhWWFhbWl9fWl5YWFxcXV1eW1pcV1pfYV5gZWRkZmZmYlljZmVoZ2ReY2BfZWNdZmlkZWhfZ15jYmNhYWBfX1tYWVtZWlpYWlhXW1taW1dYWlRZXVxaYFxVXmJNUldZVldaWVtcWVdZXmBiYWVhZGFdXllhY2JfYWBhX11dXVhXW1tdXV9fXFpdY1hZV1xgY2RfUllZUFdWV1hXVlZXVl1dXmFiYV9iXllhXV1eWV1eWVhVV1tbYF5cX1lZXV1eXmBcWlpZW19hX2JlZGVmZ2diWmRmZ2lnY19jXmBmZVppaWNmaWNmX2JiY2FgYF9dXVpYW1lZWFhaWVdaW1pZV1hWVVtdXV1gYGJieEtXV1xZV11cXF1aV1xdX2BiZGJjYV1gWGJjYmBjYWNeXF1cWFdbXV9dYF9dW2BkXFxXWmJlY2FSXFlPWFZZW1lZV1paYF5hYmNgYWNfXGJdX11bX15ZWVRYXV1fX15fW1peXmBiYlxcV1tdYGJiY2VkZ2ZlZ2RdZWZoaWZjYWJcY2dgXGlpY2hpZmVgYmFjYV9gX11dXFlcWVhXWFlZV1xbWldWWFBYWl1hY2Zmcmt/SllXXVtaX11cXlxZXVteX2JjYmFhXWJbYmRhX2NiYl1cW1pXWGpxYFxgX11cYWNfXVhZY2VkYlRfWlFZV1xdXFtZW1tjYGNjY2BiZGFgY15gXF5fX1pYVltfXVxhYV9dW2BhYmViXlxTXF9gY2RkZmVnZmVmZV9mZmhoZ2RkYFtmZ15haGhiaGhmY2BiYGNiX19fXV1bWltZWFhYVlpWXFpaVlZVTFhXXGdpa2h1eIF2dnZ2dnZ2dnZ2dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6e3p6ent7e3t7e3t7e3t7e3t7e3x7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHt7e3t8fHx8fHx8fHx8e3t7fHx8fHx7e3t7e3t7fYmIhoqHhYKBgoOCg4OCgoKCgoKCgoKCgoGAgYCBgICAgYCBgYGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t6e3t7e3t7fHx8fHx8fHx8fHx7e3t7e3t7e3t7e3x7e3t7e3t7fHx8fHt7e3t7e3t8iYmHiYaFgoGCgoGCgoKCgYKCgoKCgoKBgYGAgICAgICAgIGBgYB9fHx8e3x8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eHh5eXl5eXl5eXl5eXt7e3t7e3t7e3t7e3t7e3t7e3t6e3t7e3t7e3t8fHx8fHx8fHx8fHx7e3t7e3t7fHx8e3t7e3t7e3t7fHx8fHx7fHt7e3uHiYiJhYSDgYKCgoODgoKCgoKCgoKCgYGBgICAgICAgICAgYKBgH58fHx8fHx8fHx8fHx8fHx2dnV2dnZ2dXZ2d3d3d3d3d3d3d3d3d3h4eHh4eHh4eHh4eHh4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t8e3t7e3x7enp7enp6ent7e3t7fHx8fHx8fHx8fHx8fHx8fHx8e3x8fHx8e3t7e3t7e3x8fHx8fHt7e3t7e4aJiYiFhYOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgIGBgYCAfnx8fHx8fHx8fHx9fX18fHaIi4uLi4uLgX19fX19fYSMi4uLi454KSkqKiopKz0/Pj4+Pj5tgH5+f397pdfT09PT1r2GiYmJiYqHc3FycnJxb6nBvr6+vsGiioyMjIyNiX5/f39/f359fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx8fHx8fHt7e3t7hIuHh4aHgoGDg4GCgoKCgoKCgoKCgoGBgYCAgICAgICAgYCBgIB+fHx8fHx8fHx9fXx8fH19doyQj4+Pj5CDfn9/f39+hpCPj4+Pk3kZGhoaGhocMTMzMzMzMmqCf4CAgHut6eTk5OToyomMjIyMjIlyb29vb29sstDMzMzM0KqNkJCQkJKLf39/f39/f319fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e3uCjYeIh4eDg4SDgYKCgoKCgoOCgoKCgYGBgICAgICAgICAgICAgH58fHx8fHx8fXx8fH19fX12eHh4eHh4eHd3d3d3d3d4eXl5enp6d29wcHBwcHBycnJycnJyd3p5eXp6en6Dg4ODg4SBfHx8fHx8fHp6enp6eXl/g4KCgoKDgHx8fX19fX18fX19fX19fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e4CMhomHh4SDhIKCgoKCgYKCg4KCgoGBgYGBgYCAf4CAgICAgICAfnx8fHx8fHx8fX19fX19fXZ2dnV1dXh2dnZ6e3h7eHd2dnh5eHl6fnx5eXh4eHh5eXl5enp5eXl5enp6eXh4eXl5eXl7e3t7e3t7e3t7e3t7e3p5eXl5eXp7e3t7fHx7fHx8fHx9fX19fX19fX18fH19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8f4uHi4qIhIODgoKCg4KBgoKDgoKCgYGBgYGAgIGAf4CAgH+AgYF+fX18fHx8fHx9fX19fX19d3d3dnZ3fXh3d316eH14d3d3fHt7fHl8e3h3d3d3eHh4eHh5eXl5eXp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fHx8fHx8fHx7e3x8fHx8fHx8fHx+iomMjImFg4SEgoKDgoGCgoKCgoKBgYGBgYCAgICAgICAf4CAgH19fXx8fH19fX19fX19fX13d3d3d3p9eHt4fHx3e3h3d3l+e3l7eHx6eHh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fX19fXx9fX19fX19fX19fX19fHx8fHx8fHt7fHx8fHx8fHx8fH2Kio2NioWDg4OCgoKCgYGCgoKBgoGBgYKBgIGBgICAgIB/gIGAfXx9fX18fX19fX19fX19fXd3d3d3fX55d3d4e3p8eXd3e357eXt3fHl4eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt8fHx8fHx8fHx8fHx8fH19fX18fH18fH18fHx8fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8foqJjo2JhISEg4KDgoKBgYKBgoKCgYGBgoGAgYKAgICAgH+BgIB8fH19fX18fX19fX19fn5+d3d3d3d5fHl7eHx9eXt5enp4e3t5fHh8eHh4eHh4eHh4eXl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt7fHx7fHx8fHx8fHx8fXx8fX19fX19fXx8fHx8fHx8fXx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx/iIeNioeFhoaDg4ODgoGBgoGCgoGBgYGCgYCAgoF/gICAf4CAgHx8fX19fX19fX19fX5+fn53d3d3d3Z4eHl3eXp4enh5eXd4enl5eXl4eHh5eXh4eHh5eXl5enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX18fH18fH19fX19fH19fX19fHx8fHx8fHx8fHx8fX+HiIyIhoeHhIKDhISCgYKBgYKCgoGBgYKBgIGBgYGAgIB/gIGAfHx9fX19fX19fX1+fn5+fnd3d3d3d3d3d3d3eHh4eHh4eHh4eHl5eXl5eXl5eXl5eXl6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fHx8fX19fHx8gIeIi4eHiYaDg4SDg4KBgYGCgoGBgYKCgYGBgIGBgYCAgICBgX97fH19fX19fX19fn5+fn5+d3d3d3d3d3d4eHd4dnl5eHh4eHh5eXl5eXl5eXl5eXl5enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fH19fXx9fXyBhoqKiYmIhIOFhISCgoGBgYGCgYGCgoGBgYCAgYGAgIGAgIGBf3x8fX19fX1+fn5+fn5+f394eHd4eHh4eHZxZGpeam15eXl4eHl5eXl5eXl5enp6enp6enp6enp7e3t8e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIGFiYqJioeEhYWEg4KCgYGBgoKBgYKBgYGBgYCBgYCAgYCBgIF+fH1+fn5+fn5+fn5+fn9/f3h4eHh4eHh5bWRiZV9fXm95eXl5eXl5eXl5eXp6enp6enp6enp6e3t7e3t7fHx8fHx8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goWKiomJhISGhYSDg4KBgYKCgoGBgoGBgYKBgIGBgICAgICBgH58fX5+fn5+fn5+fn9/f39/eHh4eHh4eW5kZWdlZGJeZnh5eXl5enp6enp6enp6enp6enp6e3t7e3t7e3x8fHx8fHt8fHt7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChouJiIqEhYaEg4OEgoGBgYGCgYKCgYGBgYCAgYGBgIB/gIGBf3x8fn5+fn5+fn9/f39/f394eHh4eHl3Z2VkZWZkZWFfaXl6enp6enp6enp6enp6ent7e3t7e3t7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHt8fHx8fHx8fHx9fX19fX19fX19fX19fXx9fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4eJh4SEhoSDg4WBgYGBgYKCgYGBgYKBgICAgYGAgYCAgYF+fHx/f35/f39/f39/f39/gHl5eXl5eWtlYWJlZWFlZV5ieHdze3p6enp6enp6enp6e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fH18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19g4aLhoiFhYaEgoOEhIKBgYGBgoKBgYKBgYGAgYGBgYGAgIGBgn98fH9/f39/f39/f3+AgICAeXl5eXl0Y2NlZGNmY2doZGZsZF5ze3p6enp6enp6enp6ent7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn6DhouGhoaGhYODg4SDgYGBgYGCgoGBgYKBgYCAgYGBgYCAgYGBfnx8f39/f39/gICAgICAgIB5eXl6d2RhY2diYmRdW2VfYV1eYGFoeHp6enp6enp6enp6e3t7e3t7fHx8e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+foSFi4eGhoaGhIODg4KBgYGBgoKCgYKBgoGAgIGBgYGAgYGBgYF+fX1/gH+AgICAgICAgICAgHl5eW9vYmJiZF5jZ19dYWFgXF9kYlttfHp6enp6enp6enp7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7fHx7e3x7fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5/hIiLhoSHhoaEhIODgoGBgYGCgYGBgYKCgYCAgYGBgYGBgYGBgX5+fYCAgICAgICAgICAgICBeXpwXWJlZGJkXmZnZ2BZYmJhY2VfXF1ze3t6enp7e3t7e3t8fHx8fHx8fHt7e3t7e3t7e3t7e3t7fHx8fHx8e3x8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fn19fn5+fn5+fn5+fn5+foCFjIqEhYaGhYODg4SCgYGBgYKBgYGBgoKCgYCBgYGCgICAgIGBf35+gICAgICAgICAgIGBgYF5emxiZGdjYmdmYWBgZGFiZWRjZGNeXGJ1fHt7e3t7e3t7e3x8fHx7e3x8fHx7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/gYeMiYWGhoeFg4SDgoGBgYGBgYKBgoKCg4KBgIGBgYKBgYGCgoF/f36AgICAgICAgIGBgYGBgXp7dGdnZmZkZGZmYF5fYWNlaGRlXmJkYHR8e3t7e3t7fHx8fHx8fHx8fHt7fHt8fHt7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f3+CiYqIhoaIhoWDhIOCgYGBgYGBgoGBgoKCgoGAgYGBgoKBgYKCgX9/f4GBgYGAgYGBgYGBgYGBenptaGNjZ2ZnZWdlZmdiZWRlYmdbYmVgdnx8e3x8fHx8fHx8fHx8e3t8fHx8e3x8fHt7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f39/f4SJioiGiYeFhYSEg4KBgYGBgYGCgYKCgYGBgYGBgYKBgoGBgICBgH9/gYGBgYGBgYGBgYGBgYF7emlpZGNqZmFgZmVjY2NnaWRjYmBiZGJ0fXx8fHx8fHt8fHx8fHx8e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f39+fn9/f39/f39/f3+AhIqMiIeJhoSFhYOCgYGBgYGBgYKBgoGBgYGBgYGBgoKBgYGBgYGAgH+BgYGBgYGBgYGBgYGBgXZzZWRnY2RmZWJlZmdkZmhmZWNgYGNkYHF9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fXx9fX18fHx9fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/fn5+f35+f39/f39/f3+AgICFioyJiIqJhoaDgoKCgYGBgYGBgoGBgoGBgYGBgIGBgYGBgYGCgX+Af35/foCCgoKCgoKCgoKCc3NnZWRkZWlqaGZnZ2NhZmZlZmdmZWVjdX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gICAgICAgIWLioqJioeHhoSCgoGBgYGBgYKCgYKBgYGBgIGBgoKBgYGBgYGAf4B+dHRzdX1/goCAfn5/gYB0cmdkZWNmaWppZWNlY2BmZGRnZ2JiZWFwfXx8fHx8fHx8fHx8fHx8fHx9fX18fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f39/f39/f4CAgICAgIB/houLiouLh4eHhIOCgYGBgYGBgYKBgoKBgYGBgYKCgYCBgYGBgoCAgH5zc3NzdHV4dXV0dHV2dXVwZmNmZWhoaWdoZ2VmZWJfZGVmY2BiZ3d8fHx8fX19fX18fHx8fH19fX19fX19fXx9fXx8fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gIB/f3+AgICAgICAgICHjIyIi4qHh4eEhIKBgYGBgYGBgoGCgoGBgICBgoGBgYKBgoKCgYCAfnNzc3Nzc3NzdHR0dHNzdW9jY2FnZWhoZ2pmZGVnZmhmY2JlYl5ieX18e3t8fX19fX18fHx9fX19fX19e3x9fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn9/fn5+fn5+fn5/f39/f4CAgH9/gICBgICAgICAgYCAf4CAgYGAgIeLi4iNiYiJhoSFgYGBgYGBgYKCgYKCgYGBgIGCgoGBgYKBgoKBgIB+dHNzc3Nzc3Nzc3Nzc3N1cmdlZWRlamhoZ2ZpaGdjZWViZGNoZGd7eHVzc3R2dnl4dnR0dHZ3d3d2dHR0dXV4d3h4d3d6e3x9fXx9fn5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f35/f39/gH9+fHt7fX58eXl2dnZ5fHx6end2d3l7fXt4hIyMioyHh4iEhYSBgYGBgYGBgoGBgoGBgYGAgYKCgYGBgoGBgoGAgH51c3Nzc3Nzc3Nzc3Nzc3VzaGVnaGVrbGhqZ2lqZ2dnZmRkYmVkbnV0dHNzdHNzc3Nzc3Nzc3Nzc3NzdHNzc3Nzc3Nzc3N0dHV1c3V3eHl7fn59fn98f39/f39/f39/f314fH5+fXx4dXZ3eXd4dnRzc3N0dXRzc3Nzc3NzdHNzc3R0c3R0dHODjI2KiYeIhoOGg4GBgYGBgYGBgYGCgYGAgYGDgoKBgYCBgYGBgICAf3VzdHRzc3Nzc3Nyc3NzdnZpY2hqaGpsZWZpbGhgZmVkY2BkZGZ0dXV1dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHRzdHRzc3Nzc3R2dnV1d3V4fH9+fX9+fHp4dXN0dXV1dHNzc3Nzc3N0dHR0dHR0dHR1dXR0dHV1dHR1dXR1dXV1dIaMjYuIhoeEhIWCgYGBgYGBgYGCgoGAgYCBgYKCgoGBgIGBgYGAgIB/dnNzc3Nzc3Nzc3Nzc3N2dnNnZ2pmaGdmaGhmZGlnY2NnZWVmcHZ1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dHR1dHR0dHR0dHRzdHR0dnV1d3Z0c3R0dHR0dHR0dXV1dXV0dXV1dXV1dXV0dHNzc3N0dHNzdHR0dHR1dXR1iY6MjIqHh4SEhYKBgYGBgYGBgYKCgoGBgICAgoKCgoGBgYGBgYCAgH93c3Nzc3NycnJyc3NzcnZ2dW5kXWNnZWlraGVoZ2dqamlnZXB2dXV1dXV0dHRzdHR0dHR0dHV1dXV1dXV0dHV1dHR1dXV1dXV1dXV1dXR0dHV1dXV1dXV0dHV0dHV1dXV1dXV1dXV1dXV1dXV1dXV0dHNzc3Nzc3N0dHNzc3Nzc3R0dHR0dHWKjoyMiYaGhIeFgoGBgYGBgYGBgoKBgYGAgYGCgYKBgYGBgYKBgICAf3hzc3Nzc3JycnJyc3NzdnZ3d2liaGhnamtpaGZkZGVmaWhwdXR0dHRzc3JxcnJ0dXV0dHR0dHR0c3NycXFxcXNzdHR0dHR0dHR0dHV0cnJyc3R0dHR0dXV1dXV1dXR0dXR0dHR0dHR0dHR0dHR0c3Nzc3Nzc3Nzc3Nzc3N0dHN0dHR0dHR0dYuOjImGhYWFh4SCgYGBgYGBgYGBgoKCgYGAgIKCgoGBgYGBgYGBgIB/eXNzc3NycXJycnJzc3N3d3d3bGpoZGhpa3Z6a2VmZWhnbXJzdHN0c3JwcHBxcnN0dXR0c3NycnNycXBvb29vcHFzc3NycnJyc3R0dHNxcHFyc3R0dHR0dHRzc3Rzc3NzdHR0dHRzdHR0dHR0dHRzdHR0c3NycnFxcnJzc3Nyc3NzdHR0dHN2jZCMh4eFhYSEgoGCgoGBgYGBgYGCgoKBgYGAgYGCgoGBgoKBgYGAf395c3NycnFxcnJycnNzc3d3d3dzc2pnaWloeX99cW51bG5wcXJycnFxcG9wcXFxc3Rzc3NycXFwcG5ubm1ubW5ubnBxcnJycnJycnJzcXBvb3BxcnJzc3JxcnJycnJycnJycnJzc3Jzc3Nzc3Nzc3Nzc3Jxb29ubm9vcXJzc3Jyc3NycnNzcnaPj4uHhoWFhYOCgoKBgYGBgYGBgYGBgoGBgYGCgoKBgoGCgYGCgX9/f3hxcHBwcXFycnJyc3Nzd3d2dnd2cnF0c252f352c3hwcHBycnJycXFwcHFxcXFyc3Nzc3FwcXBvb25ubm5ub25vcHBxcXFxcXBwcXJwb25vcHFxcXFxcHBxcXFxcXJycnJycnJycnFxcnFxcnJycnFwb29ubm1ubW5vcXJycnJycnJyc3JxeI+OjYaDg4aEgoOCgoGCgYGBgYKBgYGCgYGBgYKCgoKCgoKBgYKBf4B/d29wb3BxcnJyc3Nzc3J2dnZ2dnZ3dnZ1c3l/fnd3d29wcXFxcXFxcHBwcXJxcnJzc3JycXBwb29wb29vb29vb29wb3Bvb29vcHBxb29vcHBwcHBvcG9wcHFycXFxcnJycnFxcXFxcXFxcHBwcHBxb29ubm5tbW5tbm9wcXFxcXFxcXFxcXB7j42NhoODhYOCgoKCgYKBgYGBgoGCgYGCgoGCg4KBg4KBgYGAgYF/f392bm9wcHBxcXFxcXBwcHZ2dnZ2dXR0c3NxfYB9fX9zb3BxcXFwcHBwcXFwcHBxcnJxcXFwb3Bvb3Bwb29wcG9vb29vb29vb3BxcXBub3Bwb29wb29wcnJycnFxcXBxcnFwcXFxcHBwcHBwcHBwb29ubm1ubm5ubm9ub3BwcHFxcXFxcXFxcIKRjoqEhIOFhIOCgoGBgoKBgYKBgYGBgYGCgoKCgoKCgYGBgYCBgX9/gHVvb29wcXFxcXBwcHBwdnZ2dXRzcnJycnGAgoCBeXBwcHBvcHBwcHFxcXFwcXFxcXFxcG9vcHBwcHBwb3BxcHBvb29wb29vcXFwcG9wcG9vb25vcHFxcHBwb3Bvb3BwcHBwcHBwcHBvb29vb29vbm5tbW1ubm5ub25vb3BvcHBwcHBwcHBwipCMiISDhIaDg4KCgYGCgoKCgYGBgYCAgYGBgoKBgYGBgYGBgIGBgH+AdG5vb3BxcXFwcG9vcG92dnVzcnFxcXFxcICDg39ycHBwcHBwcHBwcHFxcHBxcXFxcXBwcHBwcHBwcHFwcHBwcHBwcHBvcHBxcXBwcHFxb29vbm9wcHBvb29vcHBvb3BwcHBwcHBwcHBvb29vbm5ubm5ubW5ubm1ubm9wcG9vb29vb3BzcXWPj4yJg4KFh4ODgoKBgoGCgoKBgYKBgYGBgYGBgYGBgYCAgYGAgYGAf4B0b29vbm9vb29vb29vb3Z1dHNxcXFxcXJygIKCgXRxcXFxcXFxcXFxcXFxcXFxcXBxcXFxcHFwcXBxcXFwcHBwcHFxcXBxcHBwcXBwcHBwcHBwcHBwcHBwcHFxcXBxcHBwcHFwcHFxcHFxcXFxcXJxcnFwcnRycnR0dHR1dnRzdHR0dXd3gpCPi4mDgoaHhISCg4GBgYKCgoGBgoGBgYKBgYGBgYGAgICBgYCBgYB/gHVvb29vb29vb25vb29vdXRzcnJycnJycnKDg4OCdnFycnFxcXJxcnJxcXJycnFxcXFxcnFxcXJycXFycXFxcXFxcXFxcXFwcXFxcXFxcnNzcnJyc3V1dHR0dHR0dHV2d3d3d3d3eHh4eHd3eHh4d3Z3dnV2dnZ2d3h6e3x7e3t6enp6enyGkI2LiIODiIeHhYODgoGCgYKBgYGBgYKCgoGBgYGAgYCAgYGAgIGBgH+Ad3FxcXFxcG5ucG9wcG92dHV1c3Nzc3NzdYiDgoN5cnNzcnJyc3Jyc3NycnJycnN0cnJzcnNzc3Nzc3Nyc3N0dHV1dXV1dHV3eHd3d3d4eHh3eHh4eXl5eXl4eHl5eXp6e3t7e3t6enp5eXh3d3d1dnV2dnd5enp7fn5+fX1+fn5/f35+gIyPi4qHg4WIi4iEg4SDgYGCgYGBgoGBgoKCgoKAgYGBgYCBgYGAgIGAf4B8enp5eXx5eHh2dXZ2dHl2d3h3d3Z3dnZ6f3x+fnx2dnd3dnV4enh4eHh3d3d2eHx5eXx6eXl8e3l5eXh4eXl6enl5eXh4enp5eXh4eHh3dnd3eHh3eHh5eXp7e3p8fH1+fX9/f359e3t7e3p5enl5e3t/foB/fn5/fn19fX5+f35+fn6AjpCNioeEhoqMiIaGhIOBgoKBgYGCgYGCgoKCgoCBgoKBgYGCgYCBgIF/f4B/fn19fX9/f318e3t7eXh4eHh5eXl4eXh5eXl4enp6enp6e3t7fH1+fHt7ent8e318e3t7e3t7enl4eXh4ent6enp5eXp8fHt6enx8fHp6ent9fHx+fn+AgoGAgYKAgH9/gYGBgIB/f35+fn5/fX1+f4CAf35+f39+fn9/f39/gH+Af4OQjoyHhoWIi4yIh4aFg4GCgYGBgYKBgoKCgoKBgYKDgoGBgYGBgIGBgIB/goOCgoGBgX99f39/f4F6enh4d3h4eHh5eHh5enp5e358enx9fXt8fX19fHx8fnx9fn5+fn59fX9/f3x8fYGDgYCAf318fXx9fXt9fXx8fH19fX1+gYGChISDgoB/gYGBgH9/f4B/f39/f39+fn9/f39/f35+f3+Af39/gICAf4CAgICAhJCPi4eGhoiLi4mKhYaDgoKCgYGBgoGCgYKBgYGBgoOCgYCAgYGAgIGBgH+ChIKCgICAgH9+fn+AgH9/fn18fX19fYB/fX+Af35/gH9/fn9/gIGBgICAf3+BgICAf4CBgn9/f4CAf35+f39+f39/fn5+f39/gYB/f4CBgYCAgYOEgoGCgoGCgH+AgYCBgYGAgH+BgICAf39/gICAgYGBgIGBgYCAgICBgoGBgYCAgYGFjo6MiIaHiYyLi4qGhoOCgoKBgYGCgoOCgoKBgIGBgYKCgICBgYCAgYGAf4KFg4KBgYCAf39+fn+AfX5+fn19fX5/fn9/f35+fn+AgYCAgICAfn9/fn+Af3+AgH9/f35/f39+fn59fn9+fn9/f35/gIGBgoKDg4KCg4KBgYKDg4OCgYGBgYKBgoKCgYKBgoGBgYGBgoKCgYGCgYKCgoGBgoKBgYKCgoKCgYGBgoKCgoaPkY+KiImKjY6NiYaFgoKCgoKBgYKCg4KCgoGBgYGBgYF/gIGBgYCBgIF/gYWEg4KCgoGCgYCAgIB8fHx7fH18fH9+fn9+fn5+f35+f39/f39/f35+foB+fn5+fn9/f39+f39+fn5/gIB/gIB/f39/f3+BgYGCgoCAgYKDg4SDg4ODgoKCgoKCgoKCgoKCgoGCgoKDg4OCg4ODg4KCgYKCgoODg4ODgoKCgoODg4KCh5KTkIuKi4uPj42Lh4SCgoKCgYGBgoKDgoKBgYGBgIGBgICAgYGBgIGAgYCAg4SDg4OEg4ODgoKCgXx9fHx9gn1+f4GCiIGCgoSCgYGDg4GBgYKDgYKBgYCAf39/gICAf3+AgX9/f39/gYCAgICAgH9/f3+AgICAgH9/gYODhYSEg4SDgoKCg4OCgoOCgoODg4ODg4SDg4KEhYWDg4SEgoKDhIOCg4ODg4OCgoODgoCKlJOPioqMjpCPjYuGg4KCgoKBgYGBgoOCgYGBgIGBgoGBgICBgYGAgYCAgH+BgoODg4SEhIOCgoKCfXx8fn6AgYOAg4OChIaFhoaFhIWFg4ODg4SBgYKEhIKCgoeDgoKAgoGBgoKCg4KCg4KDgoODgoGAgIKCgYOCgYKCg4OEhYWEg4OChISEhIOEhISDg4OEg4ODg4OEg4SDhIWDhISDg4ODgoKCgoKCgoKBgYKCgo+UlI+Njo6RkY6KiISCgoKCgYGBgYGCg4GBgIGBgYGBgYCBgIGBgYCBgICAgIKChIKChIOCg4ODgoJ9fX2AgH+AgoGDg4ODhIaEhIOEhYWDg4KBg4OBgIKDgYKFhYWFhoaHhoWGhoeHh4aGhoeHhoaEgoGCg4SDg4ODg4ODhISFhYWDhYSFhISEg4KBg4OCg4SEg4KCg4SCg4ODhIOCgoKCgoKCg4OEhIOFhYWFhoaIk5OTkI+Pj5KRjIqHgoKCgoKBgYGBgYKDgoKBgIGBgYGBgICAgYGBgICAgICAhISEgoKCgoGBgoKBgX+AgYOCgICAf4CCgoGDg4KCgYODg4SEg4KDhYOCgYGBgoSFh4eHh4aGh4eHiIiHh4eIiIiFhIOBgIGBgoKCg4GCg4SEhYSDg4OEg4OEhIOBgYGCg4OEhISDg4ODg4OEhIODgoSDg4ODhIWFhoeHh4eIiIiJiY6TkpKOj46Qko+LiYeCgoKCgoKBgYGBgoKCgoGBgIGBgYGAgICAgYGAgIGAgICDg4KCgYKCgYGAf4CBhYWFhoOCgYB+fn+BgoSCgYKDhIOBgoODg4KChISDg4OCgoSFhISFhYSDg4SFhYKEhIWFg4KBgH9/gIB/gIGEg4OEhYWEgoKCgoOCg4OFhIKDhISEhYaGhoaGhoWFhoeHhYaIh4aHiIeGhoaIiYeGhYaGhoeIkZOSkI6QjpCRjImHhYGBgoKCgoGBgYGBgoOBgYGBgYGBgICAgICBgYCAgICAgISEg4KBgoGAgYGAgYKIh4aHhYSCgH99fX6AgH+AgYGBgYGCgoGBgYKCgoGCgoKBgYGCgYKCg4GBgICAf4GAgH+AgH9+gIGBgYKCg4OEg4OEg4OCgoGBgoODg4SEg4SEhIOFhYaFh4eIh4eHh4eHh4eGhoaGh4WFhYaGhIWEhIWEhYaSk5GOjo+OkI6JiIeEgoKCgoKCgoGBgIGCgoKCgoKCgYGBgYGAgYGBgICAgYGAgoSDg4KDgoGCgYKDg4iHh4iHhYSCgX5+gICAfn5+f4CBgYGCgYCCgoGCgH+AgIB+gIKBgIGCg4OAf39/gICAf4CAgICDg4KDg4ODgoOBgYKCgoOCgYKCgoOCgoSDhISDg4SEhYWFhYaGhoaFhISEhYWEhIWFhYSEhISDhISEhISEipSTkpCQj46NiIaFhIOBgYKCgoKCgYGAgYKCgoKBgoKBgYCBgYCBgYGAgICAgYGAgoOCgoOCgoKBgoOCiImJiYiHhYSDgYKEhIOBgYGCgoSCgoOEgoOEhYaEgoSCgX+AgoGBgoGChIOBgYGBgoOCgoGDg4SDg4SEg4OCg4KDg4ODg4KCgoKCgoGDhISEhYSFhYWFhIWEhIWFhYWDg4OEhISEhYWFhISEhISEg4ODg4OOlZKQkZGOjYyHhYODg4GCgoKCgoKBgYCBgoOCgYCCgYGBgICAgIGBgYCAgICBgICDhYSEhIODg4SDhIOGh4mIhoWDhIODg4WDgoGDgoOFhYODg4SDhIODhISFhISEgoGAgYKDgoKEg4OCgoGBhIWEg4ODgoKDhISDg4ODg4WFhISDg4KCgYKCgoSEhYSFhYWFhYODhYWFhYaFhoWEhIWEhYWGhYWFhIWEhISDhIODhJGUk5OSj4yMioWEhIODgYKCg4KCgoKBgYGCg4KBgYKBgYGBgIGBgIGBgH+AgYGAgYaGhoaGhoaHh4aGhYSDhYaCgIGBgYGHgoB+f4GAgIKBgYCBgYCAgoGCgoKBgYKCgYCCgoKCgoKDg4GCgYKDhYODg4KDg4OEgoKEhIOEhIWEg4OCgoKCgYGCg4ODg4SFhYWFhIOEhYWGhYWEhISEhIOEhIWFhYWFhIODhIOEg4KGlJSSlJKPjYuHhISDg4KBgoODgoKDg4GBgoKBgoKCgYGCgYGBgYCAgYGAgICAgICAhYWFhYaGh4aGhoWGg4ODg4GAgoKCgYKAf35/f4CAf4B/gIGAgH+BgYGBg4GAgYGChIOBgYGBgYKBgYKDgoODgoOCgoKCg4OBg4SDg4ODg4OEhIKCgoKDgoKDg4ODhIWEhISEg4OEhIODg4OEhIODg4ODg4SDg4ODg4KDg4KDgouUk5KTkY2NioaDg4OEgoGCg4ODg4ODgoGBgoGCgoKCgoKBgYGBgICBgYCAf4CAgICDhISFhYSFhYWEhIWCg4KDgoKDg4OBgICAgICAgYCAg4KCg4KBgoKDg4OEgoODg4KAgICCgoKCgoKDg4ODgoODhIKCgoODgoKDg4KCg4KDg4WEg4ODg4SDg4SEhISEhYWEhIWEg4SEhIOEhISEhISEg4SEhYSDg4SEhIODgoKDkJSSkpKPi4yIhoOEg4OBgYKDg4ODg4OCgYGCgoKCgoKDgoGBgoGAgICAgIB/gIGAgISDhYWEhYWFhYSFhYOEhIWDg4SFhIKCgoOCgoSCgYKGhYOFg4OEhIWGhYSEhYJ/fX19foKEg4ODg4OEg4ODhISEg4OEhISEg4SEhIOEg4OFhoWFhYSEhYWFhYSFhoWGhoWFhYWFhYWFhYWGhoWGhoaFhoaGh4aFhYWFg4SEhIeTk5KRkoyKiIWFhYWCgoGBgoODg4OCg4KBgYKDg4ODgoKBgIGAgICAgYCAgH+AgICAhYWFhYWGh4eGhYWFhISFhYSEhISEg4ODg4OEhYOCg4SFhYaFhoaHjYeHhoOBfn9+fn5+f4OEg4OEhISEhISEhISEhISFhYWEhYSGhYWGhYaGhoWGhYWHhYWGhYaGhoaFhIWFhYWFhIWGhoaHhoaGhoaHh4iIiIaFhYaEhYWGjZSTkpGQi4qHhoeGhIGCgoKDg4ODg4KDgoGBgoODg4KAgYGBgYCAgICAgICAf4CAgICHh4eGhoeHiIeHhoaEg4ODhIODg4OEg4ODg4OEhIODg4WFhYSDgYeZjIWBf39/f39/f35/gISFhIWGhoaFhYWFhoaHhoaFhoWFhoeHh4iHh4eGhoaHh4eGhoaHhoaGhYSDhIWFhoSFhYaGh4eHhoaGhoeHh4eIiIeGhoaHh4eRk5KQkZCLiIiFhoSDgoKBgoODg4ODgoKDgoKCgoOCgYCBgICBgICAgIGAgIB/gICAf4aHiIeHh4eIiYmIiIODgoKDgoSEhIWEg4KCg4OEg4OChYaCgH5+fo+Jf39/f39/gIB/f4B/f4WFhoeIiIeHh4eIh4iHiIiIhoaHiIiJiYmIh4aHh4eIiIaHhoeHhoaFhIOEhYaFhYWFhoaGh4eFhoeGh4aHh4eHh4eHh4eFh5OTkY+RkIuHhoWGhIKCgYGCg4ODg4ODgoKCgoGCg4KCgIGBgYCAgICAgICAf3+AgYB/hoiIiIiHh4iJiYmIg4KCg4ODhIWHh4eFg4OFhIODg4OKhn+BgIWBgICCgYGBgYB/gH9/fnt6gIaIiIqKiYmIiImJiYmKi4qIiIiJiouLioqIiIeIiIiHh4iIh4iGh4aEg4OFh4eHhoWFhISDhYWEhYWGhISEhYWFhoWGhYOJlJOQjpGOioaFhoWDgYGBgoKDg4ODgoKCgoKCgoKCgYGBgYGBgYCAgICAgIB/gICBgH+GiYiIiYeIiImJiIiEgoKDg4KDhImKh4eEhIWEg4OFhI+ChYOCgoKCgoKCgH9+fH19fX9+fHt8g4eJi4uKioqIiIqJiImLiomJiImIioqJi4mHhoaGh4WGiIiJiIeGh4SDgoSIiIiIh4WCgoGDg4KDg4SCgoKDgoGEg4SDgY6TkpCPj4uIhYSGg4KBgYGBgoODg4OCgoKCgoKCgoGBgYGBgIGAgICAgICAgH+AgIGAf4WIh4eHhoeIiIiHh4SCg4OCgoOFiYqJh4WHhYSFhYSFkYOEg4OCgoKDgX59fn5+fn5+fXx+fX19g4eJioqHh4WGh4eHh4iHh4mGiIaIh4eJiISDhIOFhISFhYaIh4aFg4KChIWHhoeGhoOCgoOEgoOEhIKBgoGBgYODhIOEkZKRjo+Oi4eFhoaEgoGAgYGDg4ODg4KCgoKCgoKCgYGBgIGBgYCAgIB/gIGAf39/gIB/hYaGhYaGhoeHiIeGgYKEhIOChYaIi4qGhIaEgoaGgYOQhIODg4OCgoF9fH1/gH9+fn59fH19fHp8hIaHhoSDgYODhIWFhYODhYSEhISEhIWEgoKDgoSEgYKDg4WGhYSCgYGCgoODhYOEhIWEhIaDg4SFg4KDgYKDg4SFhIiSkY+Nj4yJhoSFhIWCgYCBgYODg4ODgoKCgoKCgoKBgYGBgYGAgICAf4CAgYB/gICAgICDhIWEhYWFh4eHh4aAgYGFg4OEhYSHiIWCgYCAgX99gIaDg4ODgoKAfX1/gICBf31+fn19fX16enp+g4SEgoGBgIGBgoKBf36BgYGCgYOAgoGCgoKBg4OAf4CAgYOCgICAgICBgYGCgYGChIODhYSCg4SDgoKBgoSDhYWGjJORjo+Pi4iFhYOChIGBgYGBgoODg4KCgoKCgoKCgoGBgYCBgYCBgH9/gIGBgICAgH+AgIKCg4OChIOEhYWGhn+BfoCBgICAf4GDgn9+fn9+fHyAg4OCg4ODgX59fn+AgIGAfn19fX1+fXx6enp/goKBf39/f35/f4B+fYB/f4CAgX+AgIF/f3+BgX59fX+AgX9/foCAgH+AgICBf4CCgICCgYGCgYGAgYGBgYKEg4aPkpCOj42Kh4eGg4OCgYGBgYGCg4ODgoKCgoKCgoOCgYGCgYGBgICAgH+AgICAgICAf39/gYKDhIGCgoOCg4SFgIB/fH19fn1+foCAf31/fn1+f4ODg4KCgYF/fX1+f4CAgH9+fX19fHt7e3p6enqAgIB/f35+fnx+f35/gH9+f3+Af4GAf35+fn9/fn18fn+Af35+f3+Af39/f4B/f4B+f4CBf4B+f39/gH9/f4B/hZKSj46Pi4uHiYWEg4KCgYGBgYKDg4ODg4OCgoKDg4KAgYKBgYGAgICAf3+AgIB/gIF/f36BgYSEgYKBg4OCg4OBgH98fn5/fn6Af4B/foF+foCChIOCgYB/f359fn5/gICAfn19fX17e3x6enl5eXuAgH9/f39+fX5/foCAf35/f4CAgoB/fH5+f35+fXx/f4B/fn9/f4B/f35/foCAf36Af39+fn5/f35+f318fH2Fk5KNjIuKiImIhISEgoKCgYGBgoOCgoODgoODg4ODgYCBgYGBgYCAf39/f4CAgICAgIB/foCBhIOCgYGDhISDhICBgICBgIGAgYKCg4GBgn+Bg4SEgYGBgYCAfn19fn5+f359fX19fXx8fHt6enl5eX2BgICBgYF/f4B/f4F/gICAgYGCgoB+gH5/fn5+foGAgoF/f39/gIB/f4B/gYB+f4CAfn9/fn+Af31+fX17fIaTkYyLioeHioiGhoSDgoGBgYGCg4ODg4OCg4OCgoKBgICBgYGAgH9/f39/gICAgICAgH9+fn+BgYGAgISGh4aHgoSDhYOBg4ODhYSEhISDgYKDg4KCgoKCgX9+fX19fn6AfX19fX19fX18e3p5eXl5eYCCgoKEg4CCg4GAgoCBgYGDgoODgYGCgIGAf4CBg4GEgoCAgYGBgYCAgYCCgn+BgIF/gIB/gICAfn9/fnx8ipOQiomIiIiJiIaGhYSCgoGBgoKDg4ODg4KDg4KCgYCAgIGBgYGAf39/f4CAgIB/gIGBf359fn5/f39+g4aHh4iChYSFg4SFhIWGhoaGhoWFhYCAg4ODgoKAfX19fX19fn59fX19fX19fX18e3l5eXl4fIKDhIWCgYSDgoKDhYaCg4SDgYKCg4OCgoKCgYKFg4iFgoGBgYKCgYGBgYSDgoOCgoKCgIGBgIF/gIGAf36Ok4yHiIaIh4aGhYaGhIKDgoGCgoODg4ODg4OCgYGBgH+AgYCBgYB/gH9/gICAgH+AgYB/fn19fX5+f36Ag4SHiISGhoaFhoaHh4aGh4iHhoeGf32AgIGCgX59fX19fX19fX19fX18fH5+fnx7eXh3eHl5gIODf4ONhIOEhISXl4ODhIF9foGCgoGCgYKBhIaIjIWDgoKBhIKEg4KDhYWEhYOCg4OCg4OCgoKCg4OCgpKQi4iIh4mHhoaEhoWEhISCgYKCg4ODg4ODgoGBgYCAgICBgIGBgH9/fn+AgYCAf4CAgH9/fn1/fn+Bf4CCgYWFhYeGh4eGh4iIhoaHh4aHh4d/fH18fX9+fX19fX19fX19fX19fXx7iJKCe3x6fIZ5eHl8gYF+iZeEg4OEhJSTgIGBf39/fn6Fi4B/gICEhpCJhYSCgoGFhYuDgYKFhYaGhIOFhYOEhIODhIOFhISIko6LiYiIiYeHh4WGhYSFhIKBgoKDg4ODg4OCgYGBgICAgIGAgICAf39/f4CAgICAgYGBf39/f4CAgIGBgYGBg4OGh4aGh4aGiIeGhoaFhISGhYB9fHx8fX18fH19fX19fX19fX18fH+RlZaDe3qElHx4eXp7fH+Cg4GBgIOCgH58fn57iJF8fI6Wf31/f4KGioWDg4SDgYONiX99f4OEhYWDhYaFhIWFg4SFhYaEhI6Rj4uKioyJiImHhYaFg4OCgYGCgoKDhIODgoGBgICBgICAgYGAgIB/f3+AgIB/gICAgX5+f4GBgoKCgoODgoOCgoWGhISEhYSGhIOEg4KBgYOBf319fHx9fXx8fH18fH18fX19fHx8e4uRl4x6e3yBenp6e3x5eX19foB/gH98e3t+fn2ClZF/hIh+fH5/goR8fIGChIKAf4eDfYOBf4KCgIODhISEhISChIOEhYKEkZGOi4yMjoqJiYWFhYODgoKBgoODgoKDg4KCgYGAgIGAgICAgICAgH+Af3+Af357gICBenyAgoKDhYODhIWFhYODg4SCgYKDgoOCgoGBgIB/gX5/fX59fHx8fHx8fHx8fHx8fHx9fHx8fn6Kgnt6e3p4ent7fH17fn1+f319fX18fH+BgX2Gj4F+fYJ+f36Agnx8f3+BgIKAfn17ioJ9gH9+gYCAgYKBgoCAgIGAf4uTj4uLjY6NiIeHhYWEhIOCgoGCg4OCgoODgYGBgICAgICAgH9+fXx7fHx9f3+AgHx6gYF4e4CCgYOFhIOFhYaGhISAhpSIgIKBgYGBgH9/f39/fn5+gHx8fHx8fHx8fHx8fHx9fHx8fHx8fHl7e3t4eHl7enp8gX+Afn+BfH5+f399gIKCgICAgX+CkYF/f4CAfoB+fn9+gIGBfXx9e319fXx9fHx9gH+AgH6Afn6Bk5GMjIyNj4qFhoaFhISFg4ODgoODg4OCgoGBgYGAgICBgICAf4CAf39/fXt6fICAgHh+gXd7gIF/gYKCgoKEhoeGhn6IlYp+gYGAf4B/foB+f39/fn+Bfnx7e3x8fHx8fHx8fH59fHt9fHx8e3x8fHp6eXt8en2Fg4J/gYF+f35/gH6FgoF+gH9+foCFhoKAfn6Dhn9+fH6AgIGAf39+fX19fX57fH1/f3+AfX9+f4uQjYuMjo2Nh4SGhoWEhIODg4OCg4ODg4KBgYGBgYCBgYGAgYGBgYGAgH9/f397en9/e3mAd3p/f31+f3+Af4KDhoaFf3+FgX5/gIB/gH5+f31/gIB/gIB/f319fHx9fn18fX19fX19fH58fXx7fXx8ent6fH19f4aEgoCAgX1+fX5/foyEgYZ+fXx8f36CgX99fX19gHx7fXx+gYSDgYB+fn5+fX1/f399foB+fn6EkYyMi46Ni4qGhIaEhIODg4OCg4KDgoOCgYGBgYGBgYGBgYB/fXx8fH1+f39/f397e399d352eH59fH18fX5+gYGCg4B6fX18fn+AgH6Af35/fn+AgH+AgH9/fn9+fn5+fn1+f399fH59fn19fHt8fHx6e3p9fn+Ag4OCf35/fH18fXx8gYN+jH58e3t9fn1+fn17e3t9e3p7e3uAhoWChIOCf4B+f4KCgn9/goJ/gIuPjIyLjIuKiISEhIOEg4ODgoKCgoKCgoKBgYGAgoGBgYKCf3+AgIB/fn18fH5/fn55fX52e3Z4fXx8fHt9fX6BgICAf31/f31+f39/foB/f39+f3+AgIGBgH99gH9/fn9+fn9/f3yCfn59fX17e319fHp8fH6AgoGAgIB8fH18fHx8fH18fXt/fnt7e3x8fH18e3t7e318enp9en6CfoGDhIKBgoGFhoWFhoaHhoKEkY6Mi4qKh4iFgoOEhISEg4KCgYGCgoKBgoGBgYGBgoGBgoKAgYKBgYCAgH9+e3x+fnx6fnh5dnd8fHx7e318f4GAf35/foB/f35/fn5/gH9/f39/f3+AgYKAfn6BgIB/f39/f39+fYN8fH19fH99fX19e3x+fn9+fn5+fnx8fHx8fHt+fnt8e3x8fHx9fH18fnx9fHx7e3x5e3x7e317fX5+f4CAg4eJiYmLiYuJhYiRjYuIiYeFhYOCgoOEhIODgoKBgYGBgYKBgYGBgYKCgoGCgoCAgX98e3p6eXt9enx+fnl8eXh4dHx8fHt8fHx+gX9/f39/gIB/fn5+fX+AgH9/f3+Af4CDgoB/gIGAgIB/f4CBgH58enx9fX59fX5+jIZ9fX57e4OCfX5+fX18fX19fX1+fH18fXx9fX58fn19fX18e3t7fHt8fHt6e3t6enp7fn6ChYiHiIqLi4uJjJCNjImIhoWEgoKCgoODg4OBgYGBgYGBgYGBgYGCgoOCgYKBgIGBf3+Af356eHl5en5+e3l6eH5zfHx8e3x8fH5+fn5/gH+AgIB/fn9+gIF/f4B/gIGAgoSEgYCAgYGAgX+AgYKBf39+f31+gH57foGRjHx9f4qAjYx+fn19fX59fX59fHx8fX18fXx9fX1+fX1+fnx7e3t8fH18e3p7fHl6eXh5e35/g4OEh4mKiImNj4yKiIiFhISCgYKCgoKCgoGCgoKBgYGCgYKCgoGCgoKBgoKAgYGAfoCAf39+e3p5e319eHx6f3KBfXt7fHx8fn59fYGBf4GBgX9/gH+AgX9/gIGCgYGFg4SCgYGCgYKCgICBg4KAf4F/fX6Afnx/f4iCf36CkISEg4F/fn18jYd9fX59fHx/fnx9fXx9fX5+fX5/fX19e3x9fnx8e3x9enp5eXl5e3t+foCBg4eEiI2MiYmGhYSEg4KBgoKCgoGBgYGCgoKBgoKCgoKCgoKCgoGCgn+AgIB+f39/fn5/ent5fX16enp9cX6Cent8fX19fXp4f4KAgYKCgICBgIGBgICBgoKCgoaFhIKBgYGBg4F/gIKEgX9+gYB9foF+fX5/gIB9fn+EgH5+f31+fX2KhX1+f31+foB/fX19fH5+fn99f4B9fn18fX9/fHx7fH17e3t6enp7e3x9fn6Ag4CJjImLh4WFhYSDg4KCgoKCgYGBgoKBgoKCgoKCgoGBgoKBgYKCf4CAgH9/f39+fn59eXp6fXx5d3t0e4d8dHd9fn17e3Z2foCBg4KBgYKCgoKBgYGDg4OChYaEgoCAgICCgX+AgYOBfn6AgH5+gH59fn6AgH+Bfn+Af39/f398f39/f3+Afn9/gH58fX18fn5+foF/gH2CgHx9gIF9fHx9fXx8e3x8e3t7fHt8fHx9fImJh4iFhoWFhISDgYKBg4KAgIGCg4KCgoOCgoKCgoGCgoGBg4J/gIGAf39/fn5+fn57enp8fHt2e3R3f352cnt+fnt4dnd8gIGCgoKBgoODg4OCgoSDhIOFhoOCgX9/gIOAgICAg4F+foCAfX+AfX1+foCAf4J/gYGAgICBf31/f3+AgIGAgIB/fnx9fX19fn59g32AfoKAfX6AgX98fn59fX17fH58fXx8fHt8e3x+iYWGhIWHhYSFhIKBgoGDgYCAgoKDgoKCg4ODg4KBgYGBgYGCgH6AgYB/fn5+fn5+fn56e3p9goN9dXF6fHpxen19eXh1dICAgoKCg4KDhYOEg4KDhISEhISEgYGAgH6Agn9+f36Bf35/f4B9foB9fX1+gH9/gYCCgYCAgIKBfn6Af4GAf4CAgH9+fX19fnx+fn19gYR/gH9+f4GBf31/f319fn1+fn1+fHt8enx7eoCGgoSEhYSEg4WDgoKBgYKBgICCgoOCgoOEg4SDg4KBgYKBgYOAfoCBf35+fn5+fX5+fnt7en6Jh354cnl9f3F6eHt4eXR1fYKDgoODg4OFhIWDg4OEhIODhIKBgH+Af4CBfn19fn9+fn5/gH19f3x9fX6Af4CAgIKAgIGAgoGAf4B+gIF+gIF/gH9+fn5+fn5/fn6FhYGBgH+Ag4F/foGAf35/foB/fn17ent6fHt6goSAg4KCgoOChIKBgYCAgoGAgIKBg4GBg4SDhIKEgoGBgoGCgn9+gIF/fn1+fn5+fX59fXp7fIWEe3tzeXp8cHd1dnd5dnR6hISBhISDhIWFhoSDg4WEgoODgoCBfn9/f4B9fX1+f31+f39/fn1+fH19foF/gIB/gIB/gIGDgoGAf36AgH+AgYCBgH9/f39/f4CAgIGCgoKBf4GEgX+Ag4J/f4B/gX+Af3x7e3p8e3yBgH+Bf3+BgIKCgYF/f3+BgH6BgoKDgYGDg4KEgoSCgYGBgIGCgH6AgH9/fX5+fX19fn19e3t6gH94fHZ5eXtxdHh3dnh1cnmFhYKEhIKEhYWFhISChIOBg4KAgIF+f4B+gHx9fX6AfX5/f39+fX98fn5+gX+Bf39+f4B/gIODg4B/f4GBgIKBgYGAgICAgICAgIGAgYKDgYF/gISAfYGDhICAgX+BgYKBfXp7e3x8fX99f4B8f399fYGAgH59fYB/foGBgYKBgIKCgoKBg4KCgYB/gYKAfn9/fn99fX1+fX19fX19ent7fHZ9eXh5enJ1eXl2d3dzdYaFg4WFgoSEhYSEhIKDgoGDgX+AgX5/gH6AfX19fn9+f4B+fn99f3x/f3+BgIF/f3x+gH6AgYKDgYCAgoOEgoGAgYB/goCAgYGAgYGCg4KBgX9/g4B+goKEgICCgYKChIJ+e3t8fHx9fX1+fXp+fX14fn9/fHx8fn1+gYCBgYCAgoGBgYGDgoGBf4CAgoB9fn19f319fX59fH19fX16e3p8dnx6d3t4cnZ5e3Z2dnN0hoSEhYSChISFg4OCgYOBgYOBgIGBfX+BfoF9fX1/f39/gH5+f359fYB/gIGBgX9+fH5/fn5/gYJ/gYGCg4eFgX9/fn6Af4CBgICAgIKCgYCAfoCCf36BgoKBgYOCg4OFgn99fX18e3x8eXp7en55e3l4f357e3t+fX1/f4F/gH6BgICAgoOCgYF/gIGBf31+fH1+fX19fX18fn58fXx5e3x4enx3endzeHd6c3d2c3SGhISFg4KDhISDgoKCg4GCgoGAgYF8gIB+gH1+fX5/gICAf35/f3x+gH+BgIGAf359f39+fn+BgH2AgIGDhIN/f359fn5+f4B/gIB/gYKBgH9+f4F+f4CCgoCBhIKEhIaEgH59fHx8fHp5dnl5enl2eXZ+fHt7e358e399gH99fX9/f3+BgoGBgX5/gYF+fX18fX19fX19fXx+jYF8fXl7e3p5fHd4eHR1dXhyd3d0doaEhIWDg4ODg4OCgYKDgoGDgn+Bf35/fn+AfX19fX+AgIB/f4B/fIB/f4GAgYCAf3yAf31+fn9/fX5+gYGCgn5/fn1+fn5+f3+Af32AgIB+fn5/gX5+gIKBf4GDgoOEh4SAgH58fXx8e3x1eXl4eHh5d3t8e3p7foV9fn1/ent+fn59foGAgIGAfX6BgH59fXx9fX19fX18e32Dgnx8ent7e3p7d3Z4dXJzdnF4eXJ4hYWFhYOEg4KCg4KBgYKBgIKBgIF/fn5+foB+fX58foCAgH+AgX98gH6AgH+BgIB/fYB/fn5/f319fX6AgYKBfn9+fn59fX5/fn9+fH+Af35+fn+Cfn6AgIF/gYOCg4OGhICBfnx9fHx7fHh3e3h1eXd3eXx6e3t9kod9fH13en1+fn19f35+gH98foB/fn19fH19fX19fXt8ent9enp4e3x6ent4dHh1cXJ0cHh4cXmEhYaFg4SDgoODgoGBgoKAgYGAgIB9fn5/gH18fn1/gIGAf4CBgHyAf4B+f4GAf399gH9+f39/fX18gICAgYB+f35+fn18fn9/f358fYB/fn1+gIJ/foCAf36BhIKCg4WFgoJ+fX17e3x8eXd7eXd4d3d4e3t6e3yFin17end6fH19fHx9fX1/fnx9fn59fXx8fX5+fX18fHt6enx7e3p5enp7enhzd3VxcXJweHdxe4WGhYWDhYKBg4OBgYGBgoCBgICBgH5/fn+AfXx+fYCAgoGAf4GBfX6Af35/gX+Af3+BgH+Af31+fH1/gICAgH9/f39+fXx+f39/f319f39+fn6CgYF/gIB/foGDgoKEg4SCgn5+fHx6fHt7eXt6d3N2d3h5e3p7eXp/fnt7d3p8fXx8fH59fH19fH19fXx8fX19fX99fXx9e3l7fHx8enp6enp6eHN2dXBwcm93dnJ7hYaEhYOEgoGDgoKCgYGCgYKBgYGAf4B/f399fX9+f4CBgYJ/goF9foF+foCBf4B/gIKAgIB+fH58f3+BgICAf4B/f4B+fX5+f4B/f39/gH9/f4J/gH9/gIB/gYGAgISBgoKAf39+f3x9fn56fYV+dHx9enp6enx5eXp6hoV3eXx8fHx8fXx8fHx8fX19fHx9fX19fn19fX16eX18fH16enp6enp5c3V1b29xb3d0c3yFhoOEgoOCgYKBgoKCgYKBgoGBgYCAgYCAgH59gH+Af4GCgn+Cgn+AgX5/gYF/gICAgn+Bf319f35/f4KAgICAgIB/gIB+fn1/gH9/gIB/f39/gH+AgICAgH+AgYCBgYGCgYCAf39/fn1/fnqBk416fH18e315e3p6eHmBgXh5e3x8fXx8fHx8fHx9fX18fH18fX1+fn59fHp8fHt9fXt5enp6eXlzdXVvb3Fwd3N0fYWGg4OCg4KAgYCCgoKAgYGCgYKBgYCBgIGAfn6Af4GAgYKCgIKCgICCfoCBgX9/gX+BgIF/fH6Af3+Agn+AgICAf3+AgH9+fX6Afn2AgIB/f3+AgICAgYCAf4CAgYCBgYKCgICAf39/fX5+fIGGiXx8fnt7fnl6e3p7jX53d3l7fHt9fHx8fHt9fH19fX18fXx+fn5/f358e3x9e319e3l5e3p5eHN0dW5zcXB4cnV6hYaDg4KDgoCAgIGCgX+CgYKBgoGBgYKAgYF/fn9/gYGCgYKBhIOAgYJ/gYGBf4CAgIB/gX99f4F/gICBgICAf4B+gICAf359foB+fn+Af39/gH9/gICBf4CBgH+BgIGBgoKAgICAgIB9foB9gIOCe35+e3x9e3p8fHyHeXh4eXx8fH17fHx9fX18fH19fn19fX5+f3+Af317fH18fHx7enl7e3l5c3J1bnZycHhxdXaFhYOEg4KCgICAgoF/gIKCgoKDgYGDgoCCgYB/gICCgoKBg4GEhICBgX6BgoB/gICAgH+Cf36AgYCCgICAgIB/gH+AgIB/fn2Af39/f4GAgH+AgH+AgYF/gICAgIGAgIGBgYGAgYCAgH9/gH5/fX59fn57fXx9e3x8d3h1eHh5e3x8fXt8fHx8fX5/f39/fn19foB/gIGAf3x9fHx9e3p7eXp8eHpzcnVud3FxenF2d4WFg4SDg4KBgYKDgH+CgYWDg4SBgYOBgoKBgYCAgYKDgoCCgoSDf4GAfoKDgICBgICAf4CAf4GBgIKAf4CCgH9+gICAgICAf4CAgH+AgICAgICAf4CBgYCAgICAgYGAgoOCgoGCgYGCgYB/f4B/gId+fnx6fXx7fX54d3Z5eXp8fX18fXt8fX19fn5/gIGAfn1+gICAgoGAfH59fX58d3t6ent5eXNxdW53cHV6cXZ5hYWCg4KDg4KDhISAgIKBhoOEg4GChICEg4KCgICCgoSBgYKChIJ/gIB/gYOCgYCBgYCAf4GBgYGAg4F+gIOCf31/goGAgIB+gYCBf4CAgYGBgYCAgIKBgYKBgYCBgYGBgoOCgoOBg4OCgYCBgH+AhH19fXx/fXp9gHp5dnp4eXt7fH19e3x9fX19fn+AgYGAgH+AgICDg4B9f35+fn15eXt6enp5c3J1b3dxd3lzd3uFgoKDgoOEgoOEg4CAgoKGg4ODgoKEgYSDgYKAgIKBhIGCgoGCgX6BgICCgYKBgYKCgIGAgICBgoGEgH6Bg4F/f4CDgoCBfoCCg4KAgYGBgoKDgoGBg4KChIGAgYOBgYKEg4KEhIODhIODgYGBgYCCf4B/fYB8enx/e3t3fHl5eXt6fX59fHx8fH1+fn+BgYCAgIGBgYSEgH2Af39/f357e3t6e3p0cHhyeXR2eHR3e4SCg4KDg4SChIODgYKChIaEgoODg4SBhISAg4CBg4KCgoKCgIKAfoGAgIKBgoGCgoKBgIGBgoOCgoOAfoGDgX9/gYSEgYN/goKBg4KCgoGDg4OEgYKEgoOCgoGCgoOBg4SDhISEhYSFg4SCgYOCgoOBgYGAgH58fIB8fHh8eXp5enx9f3x7fHx9fX18fICAgICAgYGBgYKBfoGAgICAf3t7fHp6enVweHd5dnV8dXZ8gICDgoODg4OEhISAgoOGhYWDg4KDhIGEhYKCgYKDg4GCgoKAgYB9gICBgYKDgoKCgoGAgYKCg4KCg4B/gYOBgICChIODgoGCgoGDgoKDg4SDg4SAgoSDg4OBgX+Bg4KDhYKEhISEhISDhISChIOEhIKBgoGBgHt+gX59eXx6enp9fXyBfXp8fH19fHp7fn5+gIB/gYGAgICAgIGBgIB/fX18fH18dnJ2eHh2dH92dX2Hh4OChIWDg4SFhICChIWEhIOCg4SEgISFg4KCgoODgYOCgoCCgH2AgIGCg4KCgoKEgoGCgoOEgoKBgICBgoGAgYOFhIOCg4CCgoOCg4ODhIOEg4CCg4KEg4KCfoOBgoSEgoODhISEhIOEhIOEg4WEg4ODgoKAe4CBf3x8fXp6e32AfX9/fHx6fH59fX19fn5/f39/gICAgH9+foCBgICAfnx9fX5/fn18e3h2f3Z3f4OHg4KDhYODhIaEgYKFhoWEhIODhISChIWFgoKDg4SCg4KDgoOBfoCAgoKDgoODg4SCgYKCg4OCg4GCgYGDgn+ChISDg4KEf4KEg4ODgoSDg4SCgIOEg4SDg4KCg4KChIOCg4SEhISEhIWEg4OEhYSFhIOBgoB9gYKAfXx8e3x8gH19foB+fn1/fnx8fX19fn5/fn+BgYGBgH99fX6BgYB+fn19fX59fX5+f3+AfH2BgYKCg4OGg4SDhoSBgoiHhYSDg4SEhYGFhYWDg4SDhIODgoOCg4F+gYGDg4SCg4OEhIOCg4KEg4ODgoODgYOCf4KDg4ODgoOAgoWDg4ODhIODhIOAgoSEhYOCgoODgoGEg4GDg4SDhISEhYSEhIWFhYWEg4ODf32BhIB9fXx8fHx/gX5/f39/fX99e3x9fX19fX5+f4CBgIGBgH59fH6Cf39+fn5+fX1/f39/gYCAf4CEhIODhIWDhIOFf36CiouFhISDgoOFgYaGhoOEhISEhIODg4OEgn+BgYODhYSFhIWEg4KEhISFhIODgoODhYKBhISFhYaEgoCDh4SDg4OFhIWFhIGEg4OHgoOCg4GCgYSDgoODhYODhYWEhYWHh4aHhYSEhYSAf4GDf35+fH59fX+BgH9+fHx+f358enx9fX19fX5+fn9/gIGBf319fIB/gH5+fn5+f3+AgYGBgYKAgYWFhIOFhIKEg4aAgoWFiomEhIOEhYWDh4aGhISEhIWEhISEg4SDgYKDg4OEhIaEhYSDg4SEhHyDhHuBhHd5g4F9hH5+cnWDgoF2foOFgX2BdYF6g39/gH6EhIKDg4KBg4SDg4SFg4SFhoSFhn2EeXx+f4N7hYKBhIOAf35+fn19gYOBfXt/fX6Afn18fHx9fX19fH19f4B/gYJ/fX18f4GBgICAgH+BgYGCgYKDg4KChoSEhIaEgYOEhYOEhYSKiIWFhYOFhYSGhoaDhISFhYWEhYWEhIWCgoOEhYWFhoSFhIOEhYWCaICFanx7cXF8gXOGc3R0fYKDdXNxg4Z0cHVyc3SDdnt9dYF/goOBgnZ5hYCDgIR/hYSChYWCaHpyc3N8gHOCg3+Dg32BfX5+fX6Cg4F8f4B9f4B9fXx8fHx9fHx8fn1+gH+BgX99fX2AgYKBgYGBgIGBgYKBgoKCgoSHhIWEhYSBgoSGhoOGg4aIhoaFg4aGh4eGh4OFhYaFg4KFhoSFhYODg4SEhoaGhIaEg4SFhn1xe4FweXZ+g3+CbnlwdXN8dnl5hXKEg3B2eHF2dHR1cnN0dml/gG5yb3R2bnVsd217c26AiHltfXJzdnN2bW14bHB5bHV9f399foGAgX1/fn2Af4B/fX18fHx9fH1+f32Af4CAfnx/foCBgoCBgICAgYCAgIKDgoOEhYiGhoCChYODhIeGg4aFhYaHh4SDhoeIiYaHhIWGiIeEg4WGhYWEhIOFhIKFhoaFhoWEhoWHdnB0e3BydX+HhYNtdW92b3x1coR5eYd4cXR3bndod3pucHWCcoN+b3p5eW1vbnpvb213fXiGcHF6cHJ0ZoF1fm57eXNveX+Af319gX9/fH99fIF+gIB+foCAgYB+fn9/foF/gH9+fYB9f4CBgIB+fn+BgH9+goOCgoSFh4eEfoeEg4OFh4aEhoWFhoaIhISGh4iIhoeEhoaLiYWEhoeHhYOFhYWEgoWFhIWGhYWGhYZxdXByc29zenl+hHSIdHV+iHZugnKEhnluanJ/cW1zd3x/dXR8hH54cXV3bnl1enF2eHV6eYRxam95eHBreXN6b3p3dnZwgYB/fn5/f356fn19f31/f359gIGDg4CCg4GBhIKBgIGBgH1/f4F+f35+f4GAfn6BgoCAgYSHhoODhoSEhYaHhoWFhYWGhoiFhYaFh4eFhoSGhomIhYSJioiFhIaGhYWDhYWEhYaGhoaFg3iLeXKIentwcIWEeIV4eWtzfnl7a3KDh4N6fG17eXl0fYB2bm+AgG90fHV3cXl9fW1+dW+DhYZ6gHJye3x1cG96bHN8bneCgIF+fn99fXt9e3x9fX9/fn1/f4KCf4GDgYGDgYB/gICAfn9+f31/fn1/gH58fYGAfn6Ag4iFhoOFhYWFhoeFhYWFhYeHiIaEhoWHhoaFhIWFhYWFhomJh4aEhoWGhoWGhoSGhoeGhoWGh4eHhoaEhoWGh4iHhYeGhoOHhoWFg4SFhoWGhIaEg4SEhoSDgYODhISFhIWEhYSGg4aHhYaEhIWHhoSEhYaEhX13hYOEhIKBgX1/fnt8e357fHx9f359fH59gIB9f4F/f4GAfn5+gH5+f35+fX99fX5/fHt8f358fH+BiYaFhIaGhoWHhoWFhYWGhoeIhoSGhYaGhYWDhIWGhYSGhoaGhYWGhIWGhoaGhYaGh4eGhYeIiIiIhoSHhYaGiIaFiIeIhYeGhoiFhYaHhYaGhYOChYWGhYWDhYOEhIWEhYWEhYWDhoeGhoWEhoeGhISFhoOFhIKEg4OFg4OCfYB/e3t8fXt8fH1/fnx8fn2Af31+gH5+gH99fXyAfX5+fn5+fnx8fX57fHx/fHt7fX+Ih4SEiIaGhoeGhYWEhoaGhoiHhIWGh4aFhIODhIaFhIeFhYaFhIaEhYaGh4eFh4aJiIaGh4eIiYiFhYiFhoeGh4aHhoeFh4eGh4WFhoeFh4aFgoOFhoaEhIOEhIOEhoSFhYWGhoOGhoWGhYWGhoWEhIWFgoWHhYOCgoWDhIF+gIB8e31+e3x7fX59fHx+fX5+fH9+fX1+fXx9fH98fn58fYGAfHx8fXx8fH56e3t9foiHgoWIh4eGhoaGhISGhoeGiIaEhYSGhoSFh4OEhYSFh4SFhoaFhoSGhoeHhoaHh4mIhoaIh4iKiIWHiIWHh4WHhoeGh4WIiIeHhYaGh4WGhoWBhISFhoWFhISEg4SFhYaGhoWGhIaFhoeFhYaGhYSDhIOChIeDhIGChISDgYCAgHt7fn18fHx9fXx8fH19fH18fn18fX18fHx9fXx+fXt8gX99fH18fnx8fHp6fHx9iIeChoiHhoeGhoaDhYaFhoaGhYOFhIaFhIiJg4GEg4SGhIaGhoaGhIeHiIiHh4eIioiGh4iHiImIhYiHhYeGhoeHh4WHhoiIh4eFh4eIhoaHhIKEg4SGhYeFhISEhISFhoaGhoaFh4WFh4WGhYeFhIOEg4ODh4GDgIKDg4KCgn+Ae31+fXt8fH59fH19fH17fHx8fHx8fXt7e318e358e3x/fX18fX1+fXx6ent7fHyIh4KGhoaGh4aGhYOFhoWFhYWEg4WChoSDiId/enqChYaEhoaFh4aEh4eJiIiHhoiKh4aHh4eIiYeFiIeGiIeGhoeHhYeGiIiHhoWHh4eGhoeDg4SEg4aGh4WFhISEhYaGhoaGhYaHhoaHhoaEhoWDg4ODgoOGgYN+goKDgIOCf398f35+fHx9f318fX18fXp7e3p7fHx8e3t7fnt7fXt7e358fHx8fX5/fXt6fHp8fYmHg4aFhoWGhoWEhIWFhYWFhIOBhYGGhIKEhHyAhn+ChYWGhYWGhYSHh4iIiIaFiYqHhYeGh4eIh4WIhYaHiIaGh4eGh4aIiIeFhoeGh4WFh4OEhoWEhoaHhoWFhIWFhoaGhoaFhoaHhoeHhYOGhYOBg4KAg4WCg36BgYF/g4F/fn5/fn58fH1/fXt9fXx+enl6eXt8fXt7e3t+fHx8fHp7fXx8fHx+fYF8e3t7e3x7iYeEhoSGhIaGhYSFhoWEhIOEgoCDgYWDgYJ/eoSMe4CEhYeGhoaFhIeIh4aHhYWHiYeEh4WGhoiGhYeEhoeJhoaIiIeHhoeIhoSHhoaHhYWHg4SFhIeGhoeFhYSDhYWHhoeGhoWGhoaFhoaEg4WFgoGCgYCDg4OCfYGBgH6DgX5/f4B8f3x9fX59e359fH15eXp5e319enp7e318fXx8ent9fHx9fH5+gHx7e3x+fXyIh4WGhYaEhoSFhYWFhYODgYOBgIKBhYJ/gH9/fXx7gYSFhYaEhYSDh4eGhoaFhIaJhoKGhIaGhoWFh4WHiImGhYiHiYeGhoeFhIaFhYeFhIeDhIWEiIaGh4WFhIKGhYaFh4aHhIaGhoaFhoODg4WAgIGAgIOBg4B8gYB+foKAfYB/gXx/fH1+fX57fn18fHl6enl6fX15enp7fHt8e3t6e319fH18f35+fHt7fX59fIiGhYaGhoSFhYSFhYSDgoKAgoGAgICDgX5+foB5en2Ag4OEhoWEg4OHhoOEhYSChYiFgoSDg4WFhYWHh4aIiIaFiIeJh4aFhoWDhoSFh4OEhoSEhYSHhoWGhYaEg4aFhoaGhoaEhYaGhYWGgoKChH9+gICAgYCDgHuBf31+gn5+gH6Afn99fX59f3t/fXt6eXp6eXp8fXl6ent7enx6e3t7fH19fXyAfn18fH1/fnx7h4WFhoaGhoSFhIWDhYKBgICAgYB+gIKCfX5/f3t/f4KDg4WGhYSDgoaDgYOEgoCFh4WCg4GBhIWEhIaGh4iHhYWIhomHhYOEhIKFg4SGgoOFhISGhIeGhYWFhoOEhYSFhoWGhIOFhIWDhYWBgYODfn5/gH9/gIN/e4B9fX+CfYCBfn6Bfn1+fX1/e398e3p5enp5enp8eXp6e3t7fHp7e3t8fX59fYF9fXx8fYB/fXyGg4aGhoaFg4SChYKFgYGAf3+AgH5/gIF8fn9/foCAgYKChIWDgoGChIGAg4KBgISFhYKBf4CCg4OEhYaIhoWEhoeFh4WFgoOCgoOCgoWBg4WEhYaEhoaHhoaFgoSEg4SGhYWDhISDhIOFhICAgoJ+fX1/fn5/hH57f3x8gIF9gYB9fYN8fn59fX57fnt7enl7enl6ent5enp6e3t8ent8fHt9fn1/gXx9fHx9f4B+gIaEhYWEh4SDg4KGgoOAgYB+fn+AfX9/gnx9f39+fn+BgYKEg4KBgYKCf4CBgoCAgoWEgoB/gIGCgYOFhYeFhISGhoOFg4WBgoGBgoGCg4GChISEhYWGh4eGhYSDg4ODhIaFhIGDgoOChIODgH+AgX59fH5+fH6Dfnx+fHyBgH6Cf31/gnx/fn19fHx8e3t6enp6eXt6enp5eXp6e3x5e317fH5/f4GAfX59fX1/gICAhoSEhYSFgoOCgoSCgoCBgH59fn9+fn6AfX2Af35+foGBgoODgoSHgYF+gICBf3+ChIOBf35/gIJ/goWEhYSCg4WFgoSBg4CBgIGBgYKBgIGEg4OGhYWHh4WEhIWCgoKDhYSCgYGBgoCFg4F/foB/fnx8fn18foN9e358fYF/gIN9fYCBf35/fXx8fH17e3p6enl5e3l6enl6ent7e3p7fXx8f3+BgoB+gH+AgH+AgYDKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzNzc3Nzc3Nzc3NzczMzMvLy8vLy8vLy8vLy8vLzMvLy8vLy8vLy8vLy8vMzMzMzM3Nzc7Oz8/Pz9DQ0NHR0dLS0tLS0tLT09PT0tLS0tLS0tPT09TU1NTU09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tLS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1dXV1NTU1NTT09PT09PT09PT09TU09PU1NTU1NTU1NTU09PT09PS0tLS0tPT09TU1NTU1NPT09LS0tLS0tLR0dHR0dPHhnNlYFtLWWdVTUZIQD03Nzg5Nzw8PDo8Oz42Oj04PDs6OTg3ODs7Oj87PTs8PD47P0E/QkJBQ0RFREE+PTw7QENDQUBDQ0FBR0hHSUtSwtXS09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXVysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMy8vLy8vLy8vLy8vLzMzMy8vLy8vLy8vLy8vLzMzMzc3Nzc3Oz8/P0NDQ0NHR0tLS0tLS09PT09PT09PT09PS09PT09TU1NTU1NTU09PT09PT09PT09PT09PT1NTU1NTU1NTT09PT09LS0tLS0tLT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1NTU1NPT09PT09PT09PU1NPT09TU1NTU1NTU1NPT09PS0tLS0tPT09PU1NTU1NTU09PT09PS0tLS0tLR0dHSzIxyZ2BcTVllUktHSz87Mzc4Ozg5Pj05PDpBOjs9Nzs8PDo6Nzg6Oz0/Oz88PTw/Pj9BPUFBPkNDREJAQT46Oz9DREFDRERCQklHSEhJTr7V0tPT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1crKy8vKysrKysrKy8vLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzMzMzMzMy8vLy8vMzMzMzMzMzMzLy8zMzMzLy8vLzMzMzc3Nzc3Ozs/P0NDQ0NDR0dLS0tLS09PT09PT09PU09PT09PT09TU1NXV1dTU1NTT09PU1NPT09PT09PT1NTU1NTU1NTU1NPT09PS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1tbV1dXV1dTU1NTT09PT09PT09PU1NTU09TU1NTU1NTU1NTT09PT0tLS0tLT09PU1NTU1NTU1NTU09PT09PT0tLS0tHR0s+Sd2hfXk9XZ01LRkw9ODc2NTk5OTw+OT88RDk7PDc5PD07OTc5Ojw9QDs+PT47PD48PT5BQD5EQ0NDP0E9Ojs9QkNFQ0NEQT9FSEpJSky61dPT09TU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8rKysvLy8vLy8vLy8zLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMzMzMzMzMzMzMzMzMzczMzMzMzMzMzMzMzMzMzc3Nzc3Ozs/Pz9DQ0NDQ0dHS0tPT09PT09PT09TU1NTU09TU1NTU1NTV1dXU1NTU1NPU1NTU09PT09TU1NTU1dTU1NTV1dTU09PT09LS0tLS0tLS09PT09TU1dXV1dbW1dXV1dXV1tbW1tXV1dXV1NTU1NTT09PT09PT1NTU1NTU1NTU1NTU1NTU09PT09LS0tLT09PU1NTU1dXV1dTU1NTT09PT09PT0tLS0dHRmn5nYWJOVWpKSElLPzw6OTM3Njc3PTs+OT06Ojo4ODo7Ozg4Ojs7PD46PT09Ojw/PD0/QkA/Q0RDRD5APT08QENEQ0JEQkQ+REhJSUtMttfT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3MzMzMzMzMzMzMzMzNzc3NzczMzMzMzMzMzMzMzc3Nzc3Ozs7Pz8/Q0NDQ0NHS0tLT09PT09PT1NTU1NTU1NTU1NTU1NTV1dXV1NTU1NPT1NTU1NTU1NTU1NTU1dXV1NXV1dXV1NTU09PT09PS0tLT09PT09PU1NXV1dbW1tXV1dbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1NTU1NTU1NXU1NTU1NTT09PT09PT09PU1NTU1dXV1dXV1dTU1NTU09PT09PS0tLR0p+DaV9kU1hsSEhIS0A9Nzg0NzY6Oj87RDw8OTw8OTg6OTo6Ojs8Ojo7OT49Pjk9QDs/QUFCP0JCQUM9Pz8+PEBCRUNDQkBBO0ZJR01MSbLY09TU1NTU1NXV1dXV1dXV1dXW1tbW1tbV1dXW1svLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzM3Nzc3Nzc3Nzc3Ozc3NzczMzMzMzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc3Mzc3Nzs7Ozs7Pz8/P0NDQ0NHS0tLS09PT09PT09TU1NTU1NTU1NTU1NTV1NXV1dTU1NTU1NTU1NTU1NTV1dTU1dXV1dXV1dXV1dTU1NTU1NPT09PT09PT09PU1NXV1dbW1tbW1tbW1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTV1NTU1NXV1dXU1NTU1NTT09PT09PT1NTU1dXV1dXV1dXU1NTU1NTT09PT09LS0tSjiGxfZlJWakdIR0lBPjM2Njo7PDhDPEJBPjxBPDg5Ojw6Ojw8PDk8PTo7PD09PD89QD9AQT9AQUBCPD4+PzxCQ0NDRkBBQT1ISklOTUeu2NPU1NTV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbMzMvLy8vLy8vLy8vLy8vLy8vMzMzNzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzs7Ozs7Oz8/P0NDQ0NHR0dLS0tPT09PT09TU1NTU1NTU1NTU1NTU1NTV1dXV1dTU1NTU1NTU1NTU1dXV1dTV1dXV1dXV1dXU1NTU1NTU09PT09TU1NTU1NXV1dbW1tbW1tbW1tbW1tbX19bW1tXV1dXV1dXV1dXV1dTU1NTU1dXV1dXV1dXU1NTU1NTU09PT09PT1NTU1NXV1dXV1dXV1dXV1NTU1NPT09PT0tLWroprY2VSWGhMSkdJQjg0OTQ6Ozo5QDk/Q0VAPDw5OTk9Oj07PDw6PTw7OTw9Ozs/PUA9PT5AQD9CQT5APD05QERDQkFBQj48SEpLTU5IqNnU1NXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbWzMzR09PT09PT09PT09PT087Ky8vLzMzMzMzMzMzMzM3Nzc3Nzc7Ozs3Nzc3Nzc/Pz8/Pz8/Pz8/Pz9DQ0dHR0dHR0dHR0dHS0tHV2djY2NnZ2dra2tvb29vZ2dnZ2dna2tra2tra2tjW19fX19fX19jX19fX19zd3d3d3d3d3d3d3d3d2tbX19fX19fX1tbW1tbX2tra2tra2tra2trb3NzX1dXV1dXV1dXV1dXW1tbX1tbW1tbV1dXV1dXV1dXV1dTU1dXV1dXV1dXU1NTU1NTU1NTU09PU1NTU1NXV1dXW1dXV1dXV1dTU1NTT09PT09PS1bqKa2hoUlhlSUlMT0A5OTo0O0E8Nz05QUM+QD89ODo6Ozk9Oz4/Ojs8PDo7PDo7Pj1APT8/P0FAQUE/QTw8Oz5BRENBREA9PElJSk1ORqPa09TV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbW1szNhG1wcHBwcHBwcHBwcGqn493d3t7e3t7e3t7e3t3S0NDQ0NDQ0NDQ0NDQ0ci5ubm5ubm5ubm5ubq6t6WkpKSkpKSkpKSkpKSnhmBjY2NjY2NjY2NkZGRlhIuKioqKioqKioqKioemuri4uLi4uLi4uLi4ubR7c3Nzc3Nzc3Nzc3NzcJTAvL29vb29vb29vb2+tIqKioqKioqKioqKiouHvebh4uLi4uLi4uLj4+Pi2NfX1tbW1tbW1tbV1dXV1dXV1dXV1dbW1dXV1dXV1dTU1NTU1NTU1NTV1dXV1dXW1dXV1dXV1dXV1NTU1NTT09PT09XDkXFrak5TYkxMVk48Ojo3Nz5DPjg+Oj8/QTw/QDc7Ojs7PTs+Pjo7PD48Oz07PT8+QDw/Pz1AQEBBPj88PjxAQUVCQkZAQD9HSEpLT0ae2tXV1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19fMzk4mKysrKysrKysrKysiivTr6+rq6urq6urq6uvp1dLS0tLS0tLS0tLS0tTEqaqqqqqqqqqqqqqqq6aGhIWFhYWFhYWFhYWFik4MEhISEhISEhISEhIRE0pUU1NTU1NTU1NTU1NPg6ejo6Ojo6Ojo6Ojo6WaNCkrKysrKysrKysrKyRksKmqqqqqqqqqqqqqrJtTUlNTU1NTU1NTU1NTS6ry6+vr6+vr6+vr6+vr6dnX19fX1tbW1tbW1tbW1dXV1dXV1dbW1tbV1dXV1dXV1dXV1dTU1NTV1dXV1dXW1tXV1dXV1dXV1dXU1NTU1NTU1NPUy5h2bGlKTl9NUlVNPjw8NztAQz42Ojc+Pjs9Qj85PDk9Ozw6PD07PTs9Ozs9PD0+PT07QT08QUBBQT08Pzw7QEJDQURFPUFAQ0ZLS09GmNzV1dXV1dbW1tbW1tbW1tbW1tfX19fX19fX19fXzc5SKzExMTExMTExMTExJ43z6enp6enp6enq6unq6dXS0tLS0tLS0tLS0tLUxaqrq6urq6urq6urq6yoiIeHh4eHh4eHh4eHh41SEhgYGBgYGBgYGBgYFxpOWVdXV1dXV1dXV1dXU4WopKSkpKSkpKSkpKSmnj0uMDAwMDAwMDAwMDAqaLKrq6urq6urq6urq66dWFdXV1dXV1dXV1dXV0+r8erq6urq6urq6urq6unZ19jX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dXV1dXV1dXU1NTU1NTU1NGcenFpSlRdT1JVTkQ+Pzs+QEA4Ojs4PDs7PD86Ozs4Ozk5Ozw7Ojw5Ozs8Ozo9PT0+PUE/Pj8/Pj08PT88PEFBQ0FERTw+QEVGSktNRpPc1dXV1tbW1tbW1tbW1tbW1tfX19fX19fX19fX183PXDk9PT09PT09PT09PTWT8Ofn5+fn5+fn5+fn5+bV0dLS0tLS0tLS0tLS08Wtrq6urq6urq6urq6vq46NjY2NjY2NjY2NjY2SXSInJycnJycoKCgoKCcpWmNiYWJhYmJiYmJiYl6MrKmpqampqampqampq6NLPD4+Pj4+Pj4+Pj4+OXG0r6+vr6+vr6+vr6+xoWJhYmJiYmJiYmJiYmJbr+/p6enp6enp6enp6enn2djY2NjY19fX19fX19fX19fX19bW1tfX19fW1tbW1tbV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbV1dXV1dXU1NTU1NTWo3txZElbYE5OVU9AQT89REI/Oz06OTs6PT07PDs6OTg5OTs8Ozw8Ojo7PDo7QD08PTxAQTxBQTs7PEA/PD1CP0RDQ0U8PkJERkpMTEWN3NXV1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjNzcXCw8PDw8PDw8PDw8PCydDPz8/Pz8/Pz9DQ0NDQz87Ozs7Ozs7Pzs7Oz8/NzMzMzMzMzMzMzMzMzMvJycrKysrKysrKysrKysfCw8PExMTExcXFxsbGxsvMy8zLzMzNzMzMzMzLz9HR0tLS0tLS0tLS0tLRysnKysrKysrJycnJycnN09PS0tLS0tLS0tLT09HNzc3Nzc3Nzc3Nzc3NzdTY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NfX19fX19fX1tfX19fX19bW1tbW1tbW1tXV1dXV1dXV1dbV1dbW1tbW1tbW1tXV1dXV1dTU1NTU169/cF5GXmJQUVdOR0ZDQ0lBPz07PDo8OEBCPD04Ojo4OTg7Pzs8PDs7PDw8PD87PD46Pj44PkI8Pj1BPjw+QkBERUNAPD5APkNJSUtEh9zV1tbW1tbW1tbW1tbX19fX19fX19jY2NjY2NjYzs3P0NDPz8/Pz8/P0NTQ0M7MzczP09LSzs3P0s7Ozs7Ozs7Ozs/RztDU0s/O0NTSz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0NDR0dHR0dHS09PU1NTU1dXV1tbW1tfW1tbX1tfX19fX19fX19bW1tbW1tbW1tbW1tbW1tjX19fX19fY19bX19fX1tXW1dbW1tbW1tbW19bW2NjY2NjZ2dnZ2dnZ2dnY19jY2NjY2NjY2NnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjX19fX19jY19fX1tbW1tbW1tbW1tbW1tbW1dbW1dbW1tbW1tbW1tbW1tXV1dXV1NTV1di4gm9XSl9jUlFaS0hBQTxCPT07Oj4+PD4/PT0/Nzk6OTk3OD48PD47Ozw7PDs/PT0+OTs7OT0+P0A+QD07OkI/QkNCPz0+QD5CRUdKQoDc1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2M7Ozs7Ozs7Nzc3Nzsqfys3Nzc3QuYOEi8fTwJrLz87Ozs7OztHBp9PIlKjS0MaTq9LOzs7Ozs7Ozs7Ozs7Oz8/Pz8/P0NDQ0NDQ0NDR0dHR0tLT09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbV1dXV1dbW1tbV1dXV1dXV1NTU1NXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NfX19fX1tbW1tbW1tbW1tbW1tXV1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXYwIBuVU9gY1dZW0xMQ0A9PTs9Ojw+Qj5CQ0A8Ojg5ODo6Ojc7Pz4/PDw7PDo5Pzw8PTg5PD9BPj09PUFAPTtBQkBCQz47QD9BQUlHSkF629bW1tbW1tbX19fX19fX19jY2NjY2NnZ2djY2dnOzs7Ozs7Ozs7OzdKpj63Rzs7Ozpu3tqSiwJOerNPOzs7Pz8/RnY/AnKubsNCZrZmz0s7Ozs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0dHS0tLT09TU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dbW1tbW1tXV1dXV1dXU1dXV1dXV1dXW1tbW1tbW1tbW1tfX19fX19jX19fY2NjY2NjY2djY2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2dnY2NjZ2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV18h/b1pTYWVeXVxPSkQ9QD8+Ozc6Pjk/RD5BOTg3ODk7Ozw4OT89PTw9PD47OkE7OTs5OzxDQDw7PT5AQT49QkQ/QkM9PT8+Pz5ISUg/ddrW1tbX19fX19fX19fX2NjY2NjZ2dnZ2dnZ2dnZzs7Ozs7Ozs7Ozs/Inrym0tDQzsqgl36Cw6abr6fUz8/Pz8/Tuq+rtZWHnJ7Fk4adnc7Pzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dLS0tPT09TU1dXV1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tbV1dXV1dXW1tbV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2djY2NjY2NnZ2dnZ2dnY2NjY2NfX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dbV1dXV1dfNiHNdWGloXl9gT0lGOkFAPj88PDo2P0JAQzo2NDc6Ozo8Ojk+PD49PTs/PTxBPjw8Ojw8PTw6PEA9QEI+PkFCPUNDPT0+Oz9BRUtIQHDZ1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2c/Pz8/Pz87Ozs7SrKWnqdXAvNLHnY+ey9PJipmq1M/Pz8/P05+xm7++yJiZxr3JlpnG0M/Pz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0dHS0tLS09PT1NTU1dXV1dXV1dbW1tbW1dbW1tbW1tbV1tbW1tbW1tbW1dXV1dXV1dXW1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnY2NjY19fX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0JB1W1tqaWFeXVNOSTxDQEE+QD46OEZBP0M6NzQ5Ojo5Ozs4Oz0/Pj49QT08P0A9Pjw8PDw8Oj1AQD8/PT5CQD9AQkA8QD0+QUVLRz9r19fX19fX19fX2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnPz8/Pz8/Pz8/QzJ2Nl6zQmpfKxZ6ynpbN1q2ZqtTPz8/P0cCciZq905SWn87RkZigztDQ0M/Pz8/Pz8/Pz8/Pz8/P0NDQ0dHS0tLT09PT1NTU1NXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX19fX19fY19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tKUcl5ea2tqZV1PTEc/RENDQDo9OzxCPD49OTY0Ojk5Ojo5Nzs/QDs8PUA8PEE+PD07PTw/PDo8Q0A+PTs9QD5CPkBBPkA9QD9GSUQ/ZtXX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2traz8/Pz8/Pz8/P07GigJuvyaCjv8qcpYynrdiqmarUz8/Pz9SjooGbxLKfwpvaraO/ndXQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1NXV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dbW1tXW1tbW1tbV1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbSk3BgXnBoZmVaUUhHQkVDQEA3Ojo8Pjo8OTc2NTk6Njo8Ozc8QEA8Ojo9Oj0/Pj08OUA8PDo6OT9APj08PUBBQz9APz5BOz9ARkpCP2LS2NfX2NjY2NjY2NjY2dnZ2dnZ2tra29vb29vb28/Pz8/Pz8/P0M6fkGyclteqo9PSrqa1mJ/Vqpmq1M/Q0NHEn4F7lq3Qi5Oex8uIlZ7I0tHR0NDQ0dHQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1dXV1dbW1tbX19bW1tbW1tbW1tbX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfW1tfX19jY2NfX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX1tbW1tbW1tbW1tbW1tbX19fX19fW1tbW1tbX0pNuYFxxZGdkWlVKQENGQ0FCODs/PD07PDw4NTU4OTY4Ozo5PDo+Pzw9PTk8Pz49Ojo+OTw6Ojg+Pzw9PTw+QEFDQT48PDpCRERKRkJd0NnX19jY2NjY2NjY2dnZ2dna2trb29vb29vb29vPz8/Pz8/Pz9G9n8O31pfA09HQ0srSzZeb1KqZq9XRz9DVq6+8wM+UytulmbPQ26KZtdXR0dHR0dHR0dHR0NDR0dHR0dHR0tLT09PU1NTV1dXV1tbW1tfX19fX19bW1tbW1tfX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19fY2NjY2NjY2NjY2NjY2djZ2dnZ2dnZ2dnZ2dnZ2drZ2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fX19fX19fW1tfX1tbX19fX19fX19fX19bW19GRbF1cb2doYl1PRkBISUdFQDw8Pj48PT48NzU2Ojk2OTs6Ojs4QD86PDw5PD49Ozs6Pzk/Ojs5PT49PTs7PTxAQ0I/Pz47Q0ZGR0hEWc3a2NjY2NjZ2dnZ2dnZ2dna2trb29vb29vb29vb0NDQz8/Pz8/Pz5V+e6WS1KKa08ySl6ObodirmavV0pem1cmHf4Wgm5GnmaCtkKiYnrvV0dHR0dHR0dHR0dHR0dHR0tLS0tLS09PU1NTV1dXV1tbW19fX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tbX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2tnZ2dnZ2dnZ2djY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX1tfPjGRWXnBrXGBgTkVITUlJT0M+OkI9PUBCOzU0Nzw6Nzo7Ojo7OT09OTo6OT0+Pz07OT47PDo8Ozk+PD47PD0+QENCPz5BPEFDR0ZGRVXJ29jY2NnZ2dnZ2dnZ2dra2tvb29vb29zc3Nzc3NDQ0NDQ0M/Pz9DR1aeZrcmjqL7KnbGdo7XZqZup2LirocbT09Wcm6WmpKigr6eiqZzQ09LS0tLS0tLS0tLR0dHS0tLT0tPT09PU1NTV1dbW1tbX19fX19fX19fX19fX19fX19fX19bW1tbW1tfX19fX19fW1tbW1tbW1tbX19fW1tbW1tbW1tbX19fX2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2djY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fX19fX19fX19fY2NfX19fX19fYzYZdV2JvZE9dVEtIRlNRS0xAPj1EPD9DRj01NTc7OTY6Ozo8PTo7Pzo6OTg6PT0/Pjs/Oz49Ojs5Pjs9PD0+QURCQD8+PzxAQUVHRURSxdvY2dnZ2dnZ2dnZ2tra2tvb29vb3Nzc3Nzc3NzQ0NDQ0NDQ0NDQ0NO5gL3Tm5bP1LWLkZ/T1LyBu9TOlKDS0dLXqIjMnZGOutWakY6+1tLS0tLS0tLS0tLS0tLS0tLT09PT09PU1NXV1dbW1tfX19fX19fY2NjY19fX19fX19fX19fX19fW1tbX19fX19fW1tbW1tbW1tbW19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2tnZ2tra2tra2tra29ra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2NfX2ct+WlVqaltMX01KTEpVTEZCPD0/R0ZIS0g9NjU3Ojk3OTo7Ojw9OT45OTo4Oz0+PkE+PTk8PDo9Pj46PTk5Oj9FQUA+PT8/QkBHRURFUMHc2dnZ2dnZ2dna2trb29vb29vb3Nzc3Nzc3dzc0NDQ0NDQ0NDQ0NDQ0cHR0crI0tDUxLjS0tHSwtLQ08fM0tHR0s/F1NO5x9bT07jI1dLS0tLS09PT09PT09LS0tPT09PU1NTU1NXV1dbW1tfX19fX19fX2NjY2NjX19fX2NfX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29va2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2djY2NjX19fX19fY2NjY2NjY2NjY2NjY19rHd1xSZ2laTlpOTFBRV0VKPz89P0FFTExBPjc3NTs4ODk5Ojs8Pjw+ODo6OTs+P0A9Pj46NTo6Oz0/Ojs5Ojw+QkJAPz8/P0FCR0RDRE683dnZ2dnZ2dna2tvb29vb29vb3Nzc3Nzc3d3d3dDR0dDQ0NDQ0NDQ0NDS0NDR0dDQ0dPU0dHR0dPR0dHS0tHR0tLT1NLS1dTT09PW1NLS0tPT09PT09PT09PT09PT09PU1NTU1dXV1dbW1tfX19fX2NjY2NjY2NjY2NfX19jY19fX19fX19fX19fX19fX19fX1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tvb2tra2tra2trZ2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2trZ2tra29ra2trZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjbwXNYVWlrU0xSTlBSWVRGSTw+Qz9BQkVKPj43ODY5Njc4OTk7Oz0/QDw9ODk7Ozs/Pjw8OTU6PT47OTk7PD8/P0JCQT1BPUBBQkZCQkJLtd7Z2dra2tra2tvb29vb29vc3Nzc3Nzd3d3d3d3R0dHR0dHR0dHR0dDQ0NDQ0NDQ0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tPT09PT09PT09PT09PT09TU1NPT1NTU1NTU1NXV1dXV1dXW1tbX19fX2NjY2NjY2NjY2NjY19fY2NjX19fX19fX19fX19fX19fX19fX19fW1tbX19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2NjY2NjY3LxvVFRsbExLUkpUUlVLRkQ6PkdEREFERjw/ODk6OTY5OTo3PD07PkA9PTc5Ojs5Pjs5OTY2Oj1AQT47PDk6Pj9DQT4/Qj0+QkNFQkFCSrDe2dra2tvb29vb29vb29vc3Nzc3Nzd3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0tLS0tLS0tLS0tLS0tLS0tPT09PT09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1tbW1tbW19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19fW1tbW1tfW19fX19jY2NjY2NjZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2dnZ2dnY2Ny2a1NbcGtLVVdSXFFXSEQ+PEJKRT1ISj89PDc4ODo1OTg5Njs+PD1APDw1OTk8Oj87OTk0ODw9PUFBPD47Ojw+QD89PkE9PUNGR0I/Qkmq39ra29vb29vb29vb3Nzc3Nzc3N3d3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHS0M/U0M7P0tLT0tLS0tLS0tLS0tPT09TU1NTU1NTU1NTU1NTU1NTU1NTU1NTV1dXV1dXV1dbW1tbW19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19jY2NfX19fX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dndsGRTYXJfT1pUV19RUkdCPUVJTEFBTEQ/Pzs6ODg5Mzg2ODY5Pj0+Pz06Njo7Pjs9PTo5Njg6PTtAQDxAPz0/P0I+PD48PEJFR0lCPkNJpODa29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3t7S0tLS0tLS0tLS0dHR0dHR0dPT0bm7zLqbnLrQyNPT0tLS09PT09PT09PU1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2NjZ2dra2tra2tra2tra2tra2tra2tra2tra29va2tra29va2tvb2tra2tra2tra2tra2trb29vb29va2tra2tra2tra2tra2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ3qpfVWBuW1VZUVpeT0xHQ0ZNSUZEREo7QUE7PDg4NjQ4Njk4Nzw/QT89Ojc8Pz48Pz87OjY4OD09QEE9QD5BQD1AOjs6Pj1BRUdJQkBDR57h29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e0tLS0tLS0tLS0tLS0tLS0tO+wMqaoKKViJGeqpOpz9TT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fY2NjY2NnZ2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dna2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2tvb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2d6iXFVeblheXU5aUFROQ0NMSUlJRkpEPEJBPDs4NzY3OTc3OTk9P0E/PDo5QD88PkI/Ojg3NzY9Pz9APUBBPz88PTs7OD48P0VJSEE/Q0aX4dvb29zc3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3tPT09PT0tLS0tLS0tLS0tTIlZyum5m1iX2TjIKBhMTV09PT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tvb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dndmlpYYW5ZYVdPV01QRUJETElNS0ZJRT5CRDk4ODY3OTc1Njk4PT1BPjo4OT4+PD9APzw1Njc2PD4/PjtAQEA/Pj4/Pjs/PkFCRkdCQENIkeLb29zc3Nzc3d3d3d3d3d3d3d7e3t7e3t7f39/U09PT09PT09PT09LS0tLTz6h+kayPko6MhoCIiYSQo8rU09PT09PU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY19jY2NjY2NjY2NjY2NjX19fX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2tra29vb29ra2tra2tra2tna3JJaWWNuWlpSVV5QTDxAR05IUklIRT47SEY4OTc1Nzg3NTg5ODs+Pj07ODlBPj1AP0E+NzU5Njs+QUI/P0BAQkI/Pj8+QUBEQUZIQj9FSozi3Nzc3Nzc3d3d3d3d3d3e3t7e3t7f39/f39/f1NTU09PT09PT09PT09PWtaWaiIuQhYCFi4iBg4qLf4bC1tTU1NTU1NTV1dXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2dnZ2dna2dra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29ra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb2tra29uIWltnalxYTFpfVkg6TEhMSkpDRUZDQExINzo3Njc4ODU4Nzg5PDw7Ozk4QD89Pj8/PDY3PDQ3P0JCQUBAPz8/QT09P0A+QEBGRT09REuI4tzc3Nzd3d3d3d7e3t7e3t7e3t/f39/f39/f39TU1NTU1NPT09PT09PUxZKCg4WGfYGCfXx5foGCg36k29bU1NTU1NTV1dXV1dXV1tbV1tbW1tbW1tfX19fX19fX19fX19fX19jY2NjY2NjZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vc3Nzc3Nvb29vb29vb29vb29vb2tra2tra29vb29zb29zb29vb29vb29vb29vb29vb29va2tvb29vb29vb29vb29vb29vb2tvZgFpebWhaU0ldW1hKRE1ISlNMR0ZBQD9KQjg7NjY5OTc1ODY4Ozo7Ojw5OD09O0A9Ozo2NTw3Oz1CQEFBPD49QEE9PEA/Pz5CREU+PERLg+Lc3d3d3d3d3t7e3t7e3t7f39/f39/f39/f39/V1dTU1NTU1NPT09PT2LKEkKh9g3l2hIh/e3d5gn5+i67A1dTU1NXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dna2trZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2tra2tra2trb2tra2tvb29vb29vb29vc3Nzc3Nzc29vb29vb29vb29vb29va2trb29vb29zc3Nzc3Nvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc1nlcWmxmWFJPYFFSQUhHSkZYTEZAQENDSz87Ozc4ODc2NTc2ODo5PDw6PTs/PTs9Pjw7ODg8OT0/QkFCQzw8P0FCPj1BQkNCREVDQDtDTH3h3d3d3d3e3t7e3t7e39/f39/f39/f39/g4ODg1dXV1NXU1NTU1NPU0ruen3WKeXuIgICChYGDcnOAhYOMrNfV1NXV1dXW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NnZ2dna2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra29vb29ra2trb3Nzc3Nzc29zc3Nzc3Nzc3Nzb29vb29vb29vb29rb29vb29vb29zc3Nzc3Nzc3Nvb29zc3Nzc3Nvb29vb29vb29vb29vc3Nzc3Nzc3Nvb29vb3dByXV9wZVdLUGNPS0JHQ0pIS0ZBPEE9SFBBOjo3Nzg3Njc4Nzw6OD09PD47QD88Pz07Ojs5Ojk8QEJAQkNAPUFAPz1AQkNDQUBAP0A7RU144N3d3d7e3t/f39/f39/f39/f3+Dg4ODg4ODg4NXV1dXV1dXV1NXU18h4i4V8goh6g4SBfoKCc2l0hYuGkJ3U1tXU1dbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tvb2tvb3Nzc3Nzc3Nvc3Nzc3Nzc3Nzc29zb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb297KalxjcWVST1heSz9HTElPS0VAPkFCP0lPPjk6NzY7NzY6Ozc7Ojg6PDw+Oz09Oz48Ojs4OTo4OUFCQkFAQDtAQj06PkFCQz8+PT4/PUZOdN/e3t7e3t7f39/f39/f4ODg4ODg4ODg4ODg4OHV1dXV1dXV1dXV1s6dhpl+f5OTin+CgXx9gnNxm4mAgoOJwNnat7TQ19bW1tbX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tra2tra2tra2tra29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NvfwGNaW21gVlBTU0pETEhNSEk8PkFEQ0ZORDw8OTc5OjY4Ozk3PDk4OTw9OzlAPjpBPzw3NTc7ODpAQUVBPz45PUI/Oz1CQkI6Pj07PT5GTnHe3t7e3t/f39/f39/g4ODg4ODg4ODg4OHh4eHh1tbW1tbW1tbV1tjLioCHhYOXjHh7e3lvfYF1a3ebdHZ7eInHxpiMrdjZ19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2drZ2dna2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tra29vb3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29zb29vb3Nzc3Nzc3Nzd3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3Nzc3Nzc4LdjV1lrYlJNVVFMSktGS0ZDQD5CQT9FTT4+PTg5OTo3OTo3NT03Nzo+PDs7Qjw5Pz05NjY4PTk6QEJGQD49PEBCREA9QD9DO0A9PD4/Rk9t3N/e3t/f3+Dg4ODg4ODg4ODg4OHh4eHh4eHh4dbW1tbW1tbW1tfVrYZ6d32rn3l4entzdH+Dfm9xe3l6c3t2k4qFgImkzdnY19fX2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tna2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29vb29vc3Nzc3N3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vc3Nzb3Nzc3Nzc3N3d3d3d3d3d3dzc3Nzc3Nzd3d3c3Nzc3Nzc3N3d3d3d3d3d3d3d3dzc3OGtYVtebGJSTVZMTUdLS0RGQkI7QT08RUxDQT44Ojk6Nzc5NjY6NTs+QDs9Oz89PD89Ojk5Ojw5PEVDRkA/PkBDQkQ9OT0/QT1CPz1APkdPadvf3t/f3+Dg4ODg4ODh4eHh4eHh4eHh4eHi4uLW1tbW1tbW1tfQmH+Qh4N9eoN2e3Vzenl6kKqmd3JyfoeHh4CAfoKEhJHJzNnX19jY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra29va2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2djY2NnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vb3Nzc3N3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzb29vb3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3dzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3NzhpV9UYm1iUE9TSUhHRkpJSUJBPkJCPEVFREA+ODo4Ozc3Ojc4ODY+Pz07PDk9PDo+PTs6Njc7NjpEQUY+Pz8/PkNBPzs9PT47REM/PjxIT2fZ4N/f3+Dg4ODg4eHh4eHh4eHh4eLi4uLi4uLi1tbW1tbW19jYyH52doN+fnR2eIaCenl1d5yhu6GEgoCAfoeKinx/gYaMnKjO2NjY2NjY2NjY2djY2NjZ2djY2NjY2dnZ2dra2tra2trb29rb29rb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3d3d3d3c35pbT2drXFBRUElDT0pLR0xHSkJAP0FHREBBPDg8ODg1ODk3Njc3QEA/Ozw5Pj04PTw8Ojc4PTk/RENGPkE/QkBDPzw6Pj0/PkVEPz07S1Fj1+Hf4ODg4ODh4eHh4eHh4uLi4uLi4uLi4uLj49bW1tbW19XB3LRueHJze3B6eXaFiIR7eH2AgZiljH98fnuRhZaLhoGDgY6Rvd3Z2NjY2NjZ2dnZ2dnZ2dnZ2dnY2dnZ2dna2tra2trb29va2tva2tra2trb29ra2tra2tnZ2dnZ2dnZ2dnZ2dna2trZ2dnZ2dra2tra2tnZ2dnZ2dna2tra2tra2tra2tra2tra2trb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t3d3d6NWFdobllQUUtISlNJTUhNSUtBQz9DRkJBRDo6PDg2NDg4NzY2Nj8+Pjo8OTw7Oj09PDw4Ozw7RERERT4/PkI+Qj84PT8/Q0NCQEE+O0xUY9Xh3+Dg4OHh4eHh4eLi4uLi4uLi4uLi4uPj4+PW1tbW1teslLZ6eHJvd5V7dHuLgHh1bn6Fg3t/hYhyfH2bnI6JioJ+g32Hk5rH1NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2trb29vb29vb29vb2tra2tra2tra2tra2tnZ2dnZ2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2trb2tra2tra2tra2trb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d7Zf1lgaGxcUUtHR09LTk5PTURGQkg/Q0hEREA6Ozs4NzU3Nzc4NThAPkA7PDk8Ozw+Ojk7OTk7OUZERUI8QD4/PEBDOz5AP0A/Qj8+OjtKVWPV4eDg4eHh4eHi4uLi4uLi4uLi4uPj4+Pj4+Pj1tbX19vKhYR3cXJubniVhHt4hH95dnB4c3eLkY6CdnN9ioaId3d1d4ODfIiIk8Pb2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2trb2tvb29vb29vb29vb29rb2tra2tra2tra2tra2tnZ2dnZ2dna2tra2tra2tra2trb2tra2tra2tra2tra2trb29vb29ra2trb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f0nVZaGlqVk5KSE1OR01EUElGSD9FPUZMREM+Ozs8OTc3OTY2OTU4Pj4/PTs8QDs9PDo3Ozc5OThHREVCPUE9Qj8+QDw/QUE/QEJAPjs8S1Ri1OLg4eHh4eLi4uLi4uLi4+Pj4+Pj4+Pj4+Pj49fX19fEknuJf29sbnV2foSBg4qGfnVybWVtiIaKjoR7c4OHint4e4OPj4GEioqxztrZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29zc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tvb2tvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3dzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f3t7e4clsW2pqalNOR0dOT0VIRk1JSUA7RD5ISUA9PDo6Ojg2ODo3Nzk0OD08PT07ODw8PDw4Njc4OTo6RUJFQT9APEI/Q0M+PkNEQUBAP0A8PUtRYdPj4OHh4uLi4uLi4uPj4+Pj4+Pj4+Pj4+Pj5OTX19fZqXaFfnx3bHB3eXh8jH2KhYB3anN0d3p9bot7fnl6foR/gIGDfnh8foeGlrbT2tnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra29ra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/e3uO9amFpa2lRTkZNTEtKWE1OR0FAQE9BQz9AOzw4OTk5Njg2NjY4NDs+PD07OTY6Ojk6OTU4OTg5OkJERj8+Pj5AQEBCPzxBQD88Pj9BOT5KT17S4+Hh4eLi4uLi4+Pj4+Pj4+Pj4+Pj4+Tk5OTk19fX2sqKhIB5c29tcXN1d4CUeHaAfHWHhXd1cnWgmXp7d3Z5doR0bWxue3iAmouTu9za2tra2tra2trb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc29vb29vb2tra2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f397js2lpbmloUFBPTExPUk9LU0Y/RURERD48PDg7ODc5OTU2ODY2NzM6Pjs+PTc6Pjk5OTk2Ojo4NzxDRUc/Pzs/PkA9PkE9Oz0+OUFAQDhBTlFc0OTh4eLi4uLj4+Pj4+Pj4+Pj4+Pk5OTk5OTk5NjY2NjauY6AenZ1bmpveHCBfWt0cnZ3hIV5h4d5lY55eXp1d3pza298gHx2fYh8gLLe2tra2tvb29vb29vb29vc3Nzc3Nzc3Nzc3dzc3Nzc3Nzc3Nzb29vb29rb29vb29ra2tra2tra2tra29va29vb29vb29vb29zc3Nzb29vb29vb29vb29vc3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3t7e3t7e3d7e3t3d3t7e3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/f39/f4qpqa2hrZFNQT0ZQVFJOSFJLPkREQ0I7Ozk6Ojg2Nzg1NjY4ODg0Oz88Pzw5PDw3Ozo6Nzo6Nzo9Q0JDPUE+Pzw5PT5BQDs8PDtFQD47Q05TXNDk4eLi4uLj4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTY2NjZ1p5vdntveHh2cG50d3BwdHBzb36Jc3qGhY2EenNtcoB6hn1vg5OBdnx9g4a13drb29vc29vc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29ra2tra2tvb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4N/f3+KgbWhma2ZVVlJHUFFOS0xMRUJIRUc9OD08Ojo3Nzg2Nzc2NTY3NDg+PD09Ojg6OD46Ozc4Nzc6Oj5DRDtDQj49OD1AQUM/Pjw+RTw+PUJNUF/S4+Hi4uLj4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk2NjY3MB2doCCfnp4eHBsdXlya399bHNvdGdoaYB/aWh4c2d+iYl4cIKGe3d9foWKvd3b3Nzc3Nzc3Nzc3Nzc3Nzc3d3c3Nzc3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODflGttZm5mU1NJUFlUTEhGTkZGRUJGPTs+PDs5Nzc4NTc5NjQ1NzU4PDs9Pjo6OztAOTs7ODc6OTlAQkE8QUE/Pzk/QEJFQ0FAQEM7Oz1ES01g1uTi4uLi4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk5NnZ2tmYc3uqhJaCcnR1dn14aGx8d2h4d25rcHR5gIN2dHyBhIJ9c3CAin94gn95g8je3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f4N/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh24tubWdzY1lRTVVbV0hDSUZOS0dCRD8/Qjo7OjY2NzU2NzY0ODc2Ozw7Pj86PDk8Qjg3OTo6Ojk6QUFCQUJDQEE+PT9CQ0NEQUJGOTg9REpOYtjk4uLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXZ2drcqHGCtXiRfnNsem6EgXaCfWtoan+DeHZ8dX2FhXRmcHl9d316gIqFe318foC03tzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3dzc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3Nzd3d3d3d3d3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e397e3t7e39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4ODg4ODg4tiFb3FrdWFWT1VVXE9ETUY+SkdKRUQ8P0I6PDk4Njg0NTY3NDc2NDk7Ozw7OD47PEE4ODo9OD04Oj09QEBAP0FCP0A+QENCQ0FBRTc2O0RMTmPa5OLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXl29ra3Z5sbnNxhY1ybXBuf391hH5rcnZ2enN4gXhzb3VwbWt2fHmFiIB/f392coODsd/c3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eDg4eHh4eHh4eHh4OLXhW1xb3ZeUldTWlpRSkhDQFFAQkQ8OT9BOjw5NzU3NDU2NjQ3NTY9PDo9PTk+OjxAODo6PDY7OTs+PUJCQjtBQkBDQEBEREM8PUA3OjxFS01l3OPi4uPj4+Pj5OTk5OTk5OTk5OTk5OXl5eXl5dPOxsB+cWxveHt2b3VuanNzbZKGeG50dG5vdIZ/b2twboJ0bXZyfY2DdnF/d3mKgabf3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3dzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t/f3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi1oZucG1xYFJZUFdfWUpMTElSP0Q9OTtCRjs6OTc0NTY1NzU0NjY2Pj07Pz45PTk7Pjg9Ozo0ODtAQENCQ0FCRkE/Q0BBQkREOz0+OTs8QkxNZODl4+Pk5OTj4+Tk5OTk5OTk5OTk5eXl5eXl5eW5t7Woc3JscHd6dHd4bXFydXd/hHRyc2xsa3F8bnBudGuBf3GAd32Eg355gHNygYqg2d3c3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh49WHcWxqbF5YWlVXYFZWUE9QTD1BOjs8RkE4Ojg3MzY1Njk2NTg1Nz89Oz8+OT04Ozw5PTs7NTo9Q0JCPENDREREQUE/PkJDQzw9Pjg5PENLS2PN0dnh1sjY4+Tk5OTk5OTk5OTk5eXl5eXl5eXltbW2q3J5cm59f3Z1d2hqaGlwb3Zta2tnZWZxdG15gG5teXd2iHhxa2podXV5dHV/wd/c3d3d3d3d3d3e3t7e3d3d3d7d3d3d3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHi4uHh4ePVhnFwY2lhV1NZV19MUk9STUtAPjg5O0E+ODc5NjQ3Njc6NjY2NDk+Pzo8Pzo/OTo6Nzo9PDk5PEFBPTtBQ0VDRkA+Pj5BRUQ+QEE3OD5GSEpesrW4wbm1u8jg5eXl5OTl5OXl5+fn5+fm5ebm5ra2tbWOfX5weoR1cnZnYmNlbGtyb2ZpbHZtd4Z9hXlsbHd4a3ZwfH14c3V5fHd2h7ng3d3d3d3d3d7e3t7e3t7d3t7e3t7d3d3d3d3d3t7e3t7d3t7e3t7e3t3d3d3d3d3d3d7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4eHj1Yd1bl5uY1pUU1hXS1NLSk1SR0E4Ozs+PDk4NzU2NTY2OTY4NjY5Pzw6PT07Pzo7Ozk8PDs5Oj4+Pjs8PUFEQkNBQEBBP0JDPDw9Nzs+REVKXrG1tLW2t7e2y9rJ3uXl3eDi3tXU1tPU4OPg39+2treuh3t/bnmNenJ1bWNobGxtaXR4enF5enqIh4N6aWh9cWRvcXyGgX55e318e4an2t7d3d3d3d7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4uHh49aGdmxhb19dV1lcWlJQSEpXTEVHPUA9Ozs9OTY0NjU1NTg2NzY3OD87OT09PDw5OTw6Pjw6OTg+Qjs7Pj5AREBDRUFAQD0/QDw9PTU5PEJHRl2xtbW2uLm5ubq9uMPT0r3BwcC6u7y6u8TMxb/Dt7e3hGl1gX1ndYd5Z3Vxa2t5eHB3fH15bWl3e3h3bml1j4FwbHl4d3d9gXuGgnmAoNze3d3d3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODh4OHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4ePXhXJrZ3RhW1hYX15TVVVRVUpMRj9JRDs5PTY2NDc3NTc4Nzc3ODk8PDo+PDg8Oj0+OTs8OTs5P0E8PT9DP0FARUJCQTw9Q0A6Pjw1NDlER0dasbW1tre5ubm5ubm3ubm4uLm5urq6urm5urm6u7e3uX9ucHN6b3B/eXNuc3Vsc3Z4cXFwb2tvcX6Bc2mHhIF9dHOHdW11hYmBgHJ2hafd3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uHj14lxa2xyW1dXXWBUUVVUUFJPSkNATUE9Ozk2NTM0NjQ2ODc3Nzk6Pjs8Pjs5PDo8PDk8PTw7PT0+PUNEREBDQkE/QD48PkE8OD06NjY6QkpIWLG1tLa2uLm5uLi5uLe3uLi5urq5ubi4uLi6uru3uKx7cnhxf3ZzfnBsbXpyZ29sbW50cHt3d3Jyd3pvhpJ2f3x8enZ5fH9zfYdyda3T393d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4eHh4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi49eHb2pxalVWV2FbT1FSUE5XSURESUo/Ojk6NzUzNDk1NzY2Nzg4Ojw7PD46PDo6PTw5PDw9Oz09PDs9REdEQ0E8PDw8Pj5AOzg8ODE1OkFGRVautbW1tre4uLm4uLi4uLe4ubq5uLi3t7i4ubq7t7mqcnB4d3x7e4J3aG5xam9qY2lyf21zcn54dHFsanaAeX2AgH91doB1a4qLgHaR1d/d3d7e39/f3t/f3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f4N/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLi4uPYhm1sdGVWUFxnWE1YU1JRWUVDS1BOOzk4ODc1NTM5NTY2NzY4Nzk+OT0+OTw5OTw7Njg5OTo8QEA9PkBGQEJCQDo+PEE9Pzs7OzYxNjxCR0RQqLa1tba2tre4t7i4uLi4uLm6ubi4t7e3t7e5ure2tIlyd3h9iXxwem99c2hqbGdnbHRscXd0cWx2c3Fxd3FyfHl4g3Z7d2mLkYp9kM7f3d7e3tvY2drZ297f39/e3+De39/f3Nvc3N3e3uDg3+Dg4ODf3t7e39jS397f397e3t/f3t7f3t/f3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLi4eLi4uLi4uLi4uLi4uLj4+Lj4+Li4uPj4+Pi4uLi4+Lk14NoZ3VkVlVkZVdKWllXW1Q9RU1LSD04NzU3NjQzOTQ0Nzc1Njc5PTo9Pjw9PDk7PDk5Oj45PD4/PkFBQ0FFRUQ+OzxBPjw5PDs3Mzc+REhFSqG2tbW1tbW2tre4uLi4t7e4uLi3tra2tra3uLm2traLfXpsbHp/cGx5dm5qaGdlcXp4b2lvb3B1c21zd4Fnb32CgYNyf3lqcHJ6f6ng393Zy8a/vL2/vsLN0tDW3tnc4NfQzcPCw8PH1dfT2dzX1NjX0MfExce9vM/Kz87Y3djO3N3c2t3T0dze39/e397e3t7e4N/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eLi4uLi4uLf4uPi4eLg4d7W29/Sw8rJx9Hb3OLk4eHg2dre1sbExcTN2trf5OHi4trX3st9aWZxYVleZWFNTFRLUlpMO0hNSEZBPTc2NjUzNDY2NDg3NjU2OTw7Pj46Pjk5PDk3OTs7Oj49PEBAQ0RCR0ZCQT08Q0A9OTw7Nzc3P0RGRkaZtrS1tbW2tra4uLi4uLi3uLi3s7W2t7a3t7i5tba3opdxb29waW50dnFmZWNrbmdvcm1mZ2tygWVvdnyAeGRzj39zaHFyaWVlbm+w39HFv7u5ubm5ubq6uru6vc3Gw8e/urq6uru7u8HCvcHFvby/vry7urq5ubq6ubm6w8XDucDDwby/ube/z8/U3tjc3t/g3tLa4N/f4ODg39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eDg4ODg4ODg4ODh4eHh4uLi4eDh4uLi4uHa2t3RwsPCu8XT1uDdydPDrrnAsaqrq6uwtLbJ0sXRxLG4v7Srq6usr7S0vMzE1c60tLureGxtbWBdYl9ZS1NVVFFQREBRTUhEPzo3ODU3MzE1NjQ5ODQ2Njo8Oz08ODw5Njo6ODg5NzU8PDw/QEFAQkRDQkE8PkI/Pz09PTc1OD5DRUNAj7a0tLW1t7i4uLi4uLm5uLe1sautr7Oxs7OztLS0tqaei2tue3ZxeXhnY2hfcXdha25vaG99b25ja2lseHdsa4Z+bHB6dm1scG95sca8uru7urm5ubq6urq6urq6urq6urq6urq7u7q7u7y7urq6ubq7u7q6urq6urq6ubi3t7i4t7e2tbW1tbi3u8e+w8XHzcS4wMnH0tzZ2d/e3uDf39/f4ODh4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh3Nji4uLi4eHh4OHg3tfGxtHQztTe3tPO0t/SuLi8sq2trKysrrG+ua63rKipqamqq6urqqqqq6ysuKyqqqqrq6urra6urq6urryzrayrpHlub21fXl1dVE1SU1xUSkE/UElIPjg5NjgzNzMwNTczNzg1NzY2Ojw/PDg5Ozo6Ojg5OjY1OTs8Pj9EP0NFQkNCP0BAQT9APjw3ODc6QUVEP4W4tLS1tbe4uLm5uLi3t7SurKuqqq2urq6vsLGzs7WjcG5ucm1wg311aWFlaGZkY2Rxc21td25naW1tZXBzb29zcXN8h4F6dX11n7u6uru7urm5ubm6urq6urq6ubq6urq5uLm5ubm6urq6u7q5ubm5ubq6ubm6ubm4uLi3t7e4uLe3t7a2tbW2tra1tbW1tba1t7e3t7rBvrzGycrb3+Dg3tvd3d7h4tDW4uHg4ODg4ODg4ODg4ODg4OHg4OHi0768zNjd3OLg0dnbxL23sLCxsa+zu7uzsLS9s66urq2tra2sq6qqqqmpqKmpqampqqurqqqqqamoqampqampqaqqqqytrq6urq6urq6sraR4aWJxZmFZWlZRUk5cU0Y9QlJEQTc8OzY5NTY1NDU2NTg3NTY1Nzg7Pjw7OTk5Ojg3Nzk3Njg8Oz47RD8/Q0BBREE+P0M9Pjw+Ojo3Nz9DRj54srCztLW2t7i3trKurq2sq6uqqaqtraysrq+xs7S1t4xucnRqaIB5ZmpmZWxdaG5waGxxYmNmcoJ+dmhobGpueoaBhXx4cXF5gK+6ubq6urm5uLm5ubm5ubm5ubm5ubm4uLe3t7e3uLm5ubm5uLe3t7i5ubi4uLi3t7a2tre3t7e3tra2trW0tLW1tbW2trW1tre3t7e3t7e3tre4v8bP0MS+v8DE19e8ydra4OHg4ODh4eDg4ODh4eDb3t7Uzby3tre6wMDJxLfIvrKwsLCwr7Cvrq6ur7Cwr66urq6uraytrKurq6qpqampqampqampqKmpqKmpqampqKmpqKmpqqqrraytra2ur66trK2heWpkbWdiXFhRUFFLVEpCOklRP0E3PDk0OjU2NTQ1NTY4ODY4Njs6OTw9PTs6ODY2ODg6ODY3Pj09PT5BQUVCQkNBQUBBOj09Pz05Ojc9QUc8bKqmqKutsLGwrqupqKqrq6mpqamrrKytra2usLO0tbilgIdvaWdzdGZrcG1qZGxvcm5rbWNrcHyJhG5qbHx4Y3uKfnNqc25rcY+7ubm5ubm5ubi4ubm5ubm5ubq5uLi3t7e3t7e3t7i5ubi4uLe2tra3t7e3t7a2t7a2tra3tra2tbW1tba1tLS0tbW1tra2tra3t7e3t7i4uLe2t7a2uLm4uLe3uL6+uLq9vcfb4OHg2Nnd4eHg3dfKwcPCurm5uLe4uLi3tbS0tLKysbGxsLCvr6+vr6+vr6+vr66ura2srKyrq6yqqqmoqKmppqepqaehpaipqamoop+hoZyip6inqausrK2ur7Cwrq2unXhwbGphY2BZUU1RTFJGQzlNUEU+ODs3Mjc5Njc0NDM1ODg3OTc7OTo9PTw6Ojk3NDo5ODY1OD8/QEI9RENDQ0FDQEJBQDtAP0A/PDw6O0NIPWOopaWlpqioqKenp6ipqqmoqKipqqqsra6wsLCztLW1taWYdn5xZmt4cW9tZmVsaGNsZ2ZpaX11bWlvfXZ5hWZod294b3Fvcninu7m5ubm5ubm4uLm6ubm5ubm5ubi3t7W1tba2tre3t7e3t7a2tbW2tre2tbW1tra3t7e2tbS0tLS0tLS1tLS0tLW1tba2tra2t7e3t7e3t7a2tre2tre3uLe2t7i4t7i4uLi4wMXTyry8w83PyMC9urm5ubq6ubi4uLi4t7W0tLSzs7KysrGwr6+vr66urq+vr6+uraysrKurrKysq6ehoJ6gn5udoaGdlpmkpKaon5mZmZmanZ+gn56fpKqtrq+ura2srJl1cGlrY2FeXVVOU0tSREQ4TktHQTo4NTI2OTY1NDczNzc3ODk3OTo7PT0+ODg4NzU6OTk1OD9AQEFEPkZBQkNAQkNCQT88QEJCQD0+OjpERj5cpqWmpqampqanqKenqKioqKenqaurrKytra2ttLS0tbekc311bnONf3JmanFjaW1jaGZobG51aV9jZ3VzdnpuZ3Bwcn56cYihu7m5ubm6urq6urm2s7a1uLm2trW1tra1tbW1tbW3tra3tra2tbW2tbW1tbS0tLa2t7e3tbS0s7O0tLW1tLS0tbW1tra2tra2t7e3uLe3tra2trW2tbW2tra2tra2tra3tra3uLi3uri4uLi3uLi5ubm5urq6urm4t7e3t7W1tLS0s7OysrKxsbCwr66urq6urq+vra2srKuppaSmpqScmZubmpmampmXl5eXl5aZm5iZmJmZm52en5+dnJ6gpKWko6OioqKQdG5jcGFeXltUU1RIVEo/PFFCRkM7ODYzNzo1NTQ4Mzg5OTc4OTc7OTs9Ozc6NzU2OTk4NTg+Pz9ART5CPz9DPzxBQUI/PT9EQT8+PTk9Q0Y/VaSlpqanqKeoqamop6ioqKioqKiqrKuqqaipq7W1tba5o3eKcXKHhnd0cGh5a2JjYWVsaW5zal9jZWNjZWprYmRqbHaXjX6ovbm3tre5u7u6uLWxrKurqq6wrKyrq62tq6uvsLGvr7CytbW2t7W1trW1tbW1tbW2trSvr7O0tLSvra6vsrW0tbW1tbW2t7e3t7e3t7e3t7e3t7Owsra1tLa2tre3tra2tbW1tra3t7e5uLi4t7e3uLi4ubq6urq5uLi3t7e1tbS0tLS0tLS0s7OysbCvr6+vr66vr62oo6KgnJqampqZmZqbm5qampqbmpmZmZiXl5aYmZmZmpycnZ+foJ+goKChoaCgoJ+fi3RuaXRdYGZeUlRLRFRJPUVTSEVCOzo0NDY5NDQ1NzM4ODg3ODk5Ojs7Pz04OjkzNTg5NjM5PT5AP0A6QEJCQkA/QEJCPz0+QUFCPz06PkVDQFGjpqWlp6inqauqqKaoqKipp6ioqKinp6ioqaq1tbe3t7KZtH99kIx1Z2lqbGZjYGNoZW94cGlicXx5cGpmZmRma3NqhYystrKwra2ttLeysLCtrKuqqaiop6ipqampqKinqKipqaeoqqurra2sqqytraysrq6traunpaSnqqyopKOkpamwsbGztbW2t7i3t7W1tre4t7e3t7Kppaasq6ivtLa1s7W3t7a1tbW2tra3t7e3t7a2t7e3t7m6urq5uLi3t7Wxs7S0tLKxsK6sq6yurrCxsK2rqqmqqKijnJqZmJmYmJiYmZmZmZmZmpqZm5ubnJybmZeYmpqcnJydnJ2foKGhoqKioKGgoKCfnop1amtuWVxhVktPREdVRz5PV0hEPTw4MzQ0ODQ1NDgyODk4ODk6Ojw5OUA8Njk6MzY3OTE0PD8/QEBBOkNGRUJBREJDQTo7P0FCQz9APUBEQ0BPo6empaemqKqqqqakpqenqKioqKimpqaoq6uttba3t7e4rbJ1cHuDdmBiaWtiZWZhZGdmfYh5bHKAfXFvcXhjbW5xZo+srKurq6ysra6urK2trKyqp6WmpaWlpqioqKiopaeoqKioqKeoqampp6Wko6KioqOioKKioaKhoKChoaKjpKOjpaWlqLC0s7OzsKuqqaqztLa3trGopaOioaGipKiqqairs7Sxrq6xs7W2tra3uLi3t7e3t7e3t7a2uLe0sa6ppqerrKmnpqWkpKSkpKWnqaajoJ+enZycm5uampmZmJeXmZmZmJiZmpqampqampqbm5mYmpydnZ2dnZucoKGgoaOjoqCgoKCfnp2FdGtsaFdYU0pHTUVITUdAU1dGRz09OTM2Mzc0NTU3Mzg6Ojo6OTw9OjpBPDY9ODM3ODgzNztAPz9AQDpCRUNAQkRDQT87PEBDQkNBQDxBQ0A9TqKnpqanp6mqq6mkpaWlpaaoqKippqanqKmpqrW2tre3t7izc2h7c2JnamtpaWJhZGloXV1tfHJma3J/fHR8bm1zc36gqamrq6uqq62trKusq6mpqKWjpKampqWmp6eqqaamp6enqKinp6iop6WjpKKhoaGhn56en5+fn56foKGho6Wko6OkpKSmp6enpqWkpaampqeqraumpKKhoaChpKWlpaenpaeoqKalpaivtLa3trW1tra1tbOwrKupqa6rqKWlpqampaSkpaWlpqWkpKSkpaKhoaGgnp2bm5ucm5qamZiXmJiYmJiZmpmZmZmYmZmZmZqZmZydnJycnJybnJ+fn6ChoaKgoKCfnZ2cgHNrbmReU0pITUZETEtFRFFTQ0c9PDgzNjI4NDY0NjQ4OTg6Ozk7Pjw5PTs5PTczNTk2NTY8QD0/QD88P0JDPkJCQj89Pj5CQ0FFQD86PkVAO0+jpqWkpqeoqaelpKWlpKWnp6eoqKanp6alpqa1tba2trW2uYptcW1vfHxxZ2pmYGFsYFROW2hqbm9tgYJ9cWdxdn6aqKeoqqmpqqurrKqqqqimpaWkoqOlpqalpaWmqaqppqWjpKWmpqSjo6KioqKgoJ+fnp6cnJycnJ2dnJ2en6CioaKjo6KhoqKkpaSioqOjpKSjpKSko6Ggn6GipKanp6ipqaelpaSipKSlqK2wsKyrqqusqqmnpaWmpaWlpaalpqioqailpaWkpKSlpKOjpKOioaGhoqKgnp2cnJubm5qZmJiYmJmam5mXl5eWlpeXmJiZmpqcm5qampubm5ucnJ6goKGgnp6enpycm356bnJiXlNNSlBFRk5NQkBPRT5JOz01MzYzODM2Njc1Ojs4OTs5Oj49Ozo5OT03NjY5NjU2PkI+PkE/PT5DQT5DQ0BAO0BAQkJCRUA+Oz5FPzxQoKSjpKOjo6SkoqSlpaSlpqamp6empqalpqaltLW1tbS0tbiBaHx9ZXOCemxwdWFfY1ROT1FbaGxpbGxxbW5xbnScoqSnqKioqauqqqqqqaempaSjo6OjpKSlpqalp6ytqaShnp2eo6Shnp6foKCenJ2dnJycmpqam5ucnJubm5ydnp6foKChoJ+goaOioKGjpKSjoqSlpaWkop+go6SkpKapqainpaGdnJ+jpaipqainqKioqaempaWkpKSlpqampqampqenpaWko6Ojo6KioqGhoqKhoqOkop+enZ2cmpubmpqZmJeXmJaWlZSUlJWVl5iYmpubnJuampqam5ucm5ucnp+fnpucnJyam5p/fnF0YFtUTUdNSEZMSj8/TkM8QDs8NDM4Mzc0NzY3ODs9ODo6OTk7PTs7ODk9Nzc4OTU4OD9APT9BPjs9RD89REA/PzpAQUE/QUVAPjw8Qz88Tp2ioaKioKCipaSkpKWlpqenp6empqampaampbW1tbS0tLS3jHalsXdmc3Jvc2xjZGlYT1JRT09dgG1kYFptkZGSoqKjpaampqenqKiop6alpaSjoqGhoaKjpaempqesrKemoJ2cm6Ghnpuamp2cmZiam5qampmZmZubm5uampqampucnZ6goaCfnp+hoJ6foqOko6Omp6inqKWioKGhoaGkpaWlpKCcmZmbnqOmpqampqanpqempaOlpKWlpqiop6enpaWlpaWkpKOjo6KhoqKioqKhoaKjo6Kgn56enZybnJubmZaUlJSTk5OTk5SUlJWWl5qam5ubm5qZmZqanJ2dnZ2dnZuampqamZqXf3dvc11aTkhKTkdFRklERU5APD09PDQ1OzQ2NDY1Njc5Ozg5OTg5OTw7PDc6Ozc4ODg1ODg/Qj9BQTw+P0A8PEJAQT49QT4/Pz1CQUA6OkA8PE+doqGfoJ+dn6OkpKSlpqeoqKenp6ampqampqW1tLS0tLS0tbSXtqd1Znh2Y2xjY2VjW1JTU1JNXqCMeFhodpajnp6hoaOjo6OjpKSlpqalpKSioaGko6OjoqOlpqWmpqenpp+bmpuioJmWlpWam5mXl5iYmpqYmJqampqbm5qZmZmenZ2goqOjo6KkpKWinqGhoaKjpaampaSjoaCgn5+hoZ+goJ2amJeZmpygpKOjpKWmp6alpaOjpKSkpKWnp6ampqampaWmpKOjo6SjoqKjpKGfoKGhoKGgoaCfn56dnZyamJeVk5KSkpKSkpOTkpOUlZaZmpqbm5qampqbnZ6enp2cnJybm5qamZmZlH10bHReWk9IRUdGQkVORT9GOzo+Pzs0Njo2OTM2NDY4ODo4OTc4ODo8Ozw5Ozs6OjY3ODk5Pj9APjw9QD5AOjlAQT89QT8/QUE+QUE/Ojk9PjpQnaCfnZucnJufoqOlpaWlp6iop6ampqanpqantLS0tLOysrGwsK2rkHiGj36bmn93Yl1TUlFRTGKgootaiKCgn52YmZycnZ2eoaGgpKenpqWkoqGjp6alpaKipaampaanpqagm5mboaCXk5OSl5qcmpeXl5iampmampqam5qYmJmaoKCgoKGfoaKipKamop6gn5+goaOko6Khn56enpyanZuZmpqZmJeZnqChoaKioqKkpaWmpKSkpKKioqKkpaWlpaWlpaalpaOko6KioqGgoKGgnp+fn5+fnp+foJ+cm5qZl5WUlJSTkZCRkpKSkpKSk5SVl5iZmpmZmpqam5+fnp2cnJycmpmZmpiXl5F8cmdxXl1QRj9BRD9KT0JCRjhDRT4+OTg7Nzc0ODQ1OTo6Ozk3OTo8Ozo8PT48PDo2NzY5OD4/QT47Pz49PDg6PkFAQUE/P0FCQERBPjo4PkE8U5ycm5uampycnaGio6KjoqSmp6alpaampqSjo7KysK2rp6amp6alpqiln6iop6qnoXmEXFFST0xcnKCAYpmgnp2clZOVlpeZmp2dnqGmpqampKOioqanp6ajpaampaWmp6amop2cnqGfl5GRkJSXm52YlpaWmJuZmpqampqZl5iam6Ghn56fnpybnJ6goJ6dn56fn6Cio6SjoqCfnp2ZlpeXl5iYmZubnqKioqKioqGio6WlpKOio6SioaGhoqOkpKSko6SkpKSioqKhoqGgn5+gnp2enp2dnZ2dnp6em5mYl5WTk5SUk5KQj5GSkZKSkZKTlJaXl5iYmZqampyenZ2dnJubmpiYmpmXlZaNempmamBiTkY+P0A9SkVAQ0A7QEE8Ozs5Ojc2NTg0Njc4OT04ODs6Oz87Ojs8Ojk6Nzc2ODs7Oz08Ojo8PTw3Oz5DQkRDPz1BQ0FEQT88OkBCO1eZmJqamZmam5ucnp2foqKhoqSlpKSlpqSioJ6op6alpqWlpaemp6ampqakpaanqKehqXJOUU1KVJahenKanJyenJeVlJWWmJiXl5qeoqKhoqOkpKOjpaalpaanpqSlpqalpaOgoKGhn5mSkI+WmpmenJaXl5eZm5ycnJqamZeZm5uen52cnZyZmZqcnZydnp6fn5+hoaCgoaKgn56bl5WVlZeanZ6fn6GhoqKio6OhoaCgoJ2cnaGioqOkpKOioaSlpKOko6SjoqKioqKhoKGfn52cnZ2cnJ2dnJ2enpqXlpaVlJOTkpKSkpCRkpKSkpGSlJWWl5iYmJiam5ycnJycnJ2cm5mYmZiWlJWXi3hsY2RiZFFHQT1DO0tIRDo7Ozw+OTo6OTo3Mzc5NTo4ODg8OTg7OT09Ozo7Ojk8PDc2NDc/PDo9Ozw/Pjw7ODxBQ0FDQkI+P0NAQkFAOj9APztZmZiampqam5ubm5ydoKGhoaGhoqKioqKhn5+dpKWmpqenpaWmp6ampqWkpKalpKSkpaaGUFJQT0+PmHB6mpubnJ6cnJycm5ubmZiYm56dnp6foKOkoqGhoqKio6SkpaalpKOjoaGhnpyalZOUmJuam56amJiYmJqcnpyam5iWmZybnJycnJydmpqbnJ2dnp6dnp6fn52cnJyhoaCblpWVlZacoKGgn5+hoKKjoqOhnZuZlpaWlpicnqCip6ikoaCgoqOjoqKioKCgoJ+fn5+gnp2cm5ucnZydnJmanJuWk5KSkpKUk5KSkpKSkpOSkpKRkpSVlpeYmJiYmZqcm5qbm5ucnJqZmJiXlZWWl4d3ZGdoZGJNQ0U8RDlJSkU5Ojs9PTo6ODg6NjQ3OTU8OTY4OTc5PDs7PDo6PDs6PDw4Nzg3Pj07Pj46Qj86Ojo/QURCQ0FBQD9EQUFAPjpAPj06W5qYmZqbmpubm5uen6CgoaKioKCgn5+enp2dnKWkpaanpqWlpqakoqKio6Oko6Kjo6KnllRYVVJOZ21rgZ6am5udn6Cgn56enp6dnJ2dnJ6enp+goaCfn6CgoKGio6Ojo6OjoqGgnpuZmZiZmZmamZienpiYmZmam5qWlZeWlZicnJ2cm52dnpybnJ2cnZ6bmJqeoaGdm5udoKKhmpWVlpaZoKKgnZueoKGjop+em5eXlJKSlJeYmZ2goqenpaGgn56goaGioaCfnp2cnJubnJubmpqZmpydnJmXmZaVk5GQkJCPkZKSkpKSkZKTk5OTk5OTlJWWlpeXl5manJubnJucnJqamZeXlpaVlZSEcmZsYmRbREJMPT84RktCPEA+Pj05Ozk6PTg1ODg2Ozg1Njo4PDw7Ozw8Ozk8Oj09OTU4Nzw5PD88OkE/Ojo6QEBDQkRBQ0A/Q0FAPj08QD09Ol+al5mamJeYmpycn5+foaGhoJ+fn56foKCenZ2lpKSko6OioqOjoZ+foaGipKOio6SiradXXl1UV19ua42dmpqbnJ6dm5ucnZ+enZycnJydnZ+goKChoaGgoKGgoKGioaGioZ+enJqampqbnJqZmpuZnJ6ZlpaWl5eTjo6QlJabnJuam5udn52cnJycnJ6dlpSZnJ+in5ycnZ+hoJuXl5mZmpycnJubnZ6fnZqXlpaWlJOTlJiampqfoKGmpqWgn56fnqChoaCenJubnJybm5ybm5qZmJmZmZmXl5iVlJKQkJCQj5CSkpKSkZGTk5aYl5STkpSVlJWWlZaZmZmam52cnJyampmXlpaWlpaQgG9vZV5gV0BKSDg/N0lFP0VBPD07Ojo8Ozs3NTs4Njs3NDY6Oj47Oj0+Pj07Ozs+Ozo4Ojk5NkBBPTo8PTo6OT9BQ0JERUM+P0FBPz8+Pj89PDtgl5WXl5aVl5mbnqGhoKGioqCenp6enqCgn52bpaWjpKSioKCfoJ+dnZ+hoqOjo6OkobCjXWVkYGFua4GenJubm5ubmZianJ2enJubm5ycnJ6ipKGeoKGhoqKhoKCgoaGgn5+enJqZmpubm5ybmp2dm5manJiXlZWWkY6Nj5KYnZycm5ycnqCdnJucnJyempWVm56foZ+dnJyenp2cmpqampqampqbm5qXl5aTkpWVlpWTlZaam5qanZ6foqWjnp6fn5+en5+enZ6fnZycm5qcmpqbmpiZmJiYmJiYlZSTkZCRkJCQkZKTk5CRk5SYmZiVk5SVlZWWlZaXmZmXmZqenpyamJiXl5aWl5eYjX1ubV9lVlRFSzw3PjdSRUM+QkE4Ozw7OTg6ODY7Nzc6Njc5Oj0+Ojw8PT49PD06Pz06ODw9OTtAPj4/PT45ODs/QkNAQ0VDPT9DQj5AQD5APTw8YZWSlJWWlpeanJ6goKCgoaCgnp6enp6gn56em6WlpKOioJ+fnp2dm5mbnJydnp+gn56rmGNpbW5pZm2enZybm5ybmpmZmZqam5ucm5uam5ygo6SgnZ6en6CgoKCgn6ChoKCfnpuamZqam5ubm5ufnpyZmJqamJiYmJKOj5OXnJ2bnJ2cnJycnZycnp6dnpqVl5ygoaGfnp2eoJ+cnJuampqbmpqYmpmVk5OTkpOWl5eVlJiYmZucnJydoJ+gnp6enp+fn56en6KjpKKgnp6cm5qampuZmJmZmJeXlpWUlJORkZCQkZKTk5OSkpOUmJmYlpWUlZaWlpaWl5iYmJiXmZqamZeXl5aXlpeWl4l4dmddX1dURUU5OTs8WT5AOEI/OTs7Pjk4Ozg6Ozc5OjU4OTs9PDk9Oz0+PD0+Oz8/Ozk+PDw+Pz5AQUE9ODc7QkNFP0FFQz1AREJBQEQ7Oz47PGKWk5SUlpWUlpiYmZubnJycnZ2cnJ2en56dnJqkpKSkoJ+enpybm5qZmJiYmZucnZ6cpolla3R4bVuFop2dnJydnJqbmpqampydnZ2bmpuboKKinpucnZybnJ2enp2dnZ2fnpyampucnZycm5ycnp6cm5qanZqam5yVkZOXm52dnJ2fnZycnJycnZ6fnp+cl5idn6GhoJ6cn6CfnJubm5qbmpmZmZmZl5WWlZaYl5eXlpaYmZuenp2dn6GhoJ+fnp6fn5+dn5+hoqKhoZ+fn5yZm5qcnZuampmXlpaYl5eXlpWTkpGTlJSTlJSUlJaZmJaVlZeZmJeYl5eXl5eYl5iXl5eXlpaYl5eVl5eDeHZfW11eUT1GOjk4P1VDQTtDQzo8Pz86Ojk3Ozg4ODc0ODk8Ozw4Ozs8PTo9Pjo/QT06PTw+PkA/PUBBPjk2PERDRUBBRUU9PkVERD9COzo8OTpkl5SVlZaUlJSUlJWXmJiamZqcnJydnp6dnZybo6Oko6CenJuamZqZmJiYmZiam5ubm6WJa3F2em9lmp+enp2dnJybnZ6dnJ2enp2dnJydm5ygoJuampubmpudnJqampucnJuZmZycnJ2dnZ2dnZ2dnpybmp+fm5ydm5mZmZudnZ2dn52dn5+dnJydn5+fn5uanZ+goJ+dnJ6gnpubm5ubm5yampuamZudnJqZmJeYmJiYmp2foKCgoJ+hoaGgoJ+en5+fnp6foaKhoJ+enp+enJqam5ubmpqZlpaXmZmYmJiWlJOUlJWVk5OVlZSVlpWVlZSYmZuamZaWl5WWmJiWl5OUlJGRk4yRkJOWfXhqYWJiXFA8QDw2OENWSERCOjg7Oj47Nzc5Nj06OTk2NDc6Ozw9OTo6Oz87PT08QD47Oz46PT89PkBBP0A8NztBQ0U/P0REPj9EREM+Qj07PDs6Z5aTk5OTk5OTlJSVlpeWl5aWl5mbm5ybm5uamaOjoqCfnpuamJeYl5eXmJmYmZybm5qkgGpqb3lzcZegnp2dnJydnp6enp+enp2cnJydnp2bnJuampqam5ubmZiYmpqamZmZmJqdm5ydnZ2dnJ2cnZ2cm5qdn5ucnJubnJubnZ2dnJydnp2enZydnZ2cnJ2dm5uenp6dnZybnpubnJycnJydnJubmpmbmpmYmZmYmpmZmpyfn5+jpaKfoaKioaGfnqCgn5+fnqCioaGhn5+fn52ZmpudnZqZmJWWl5aVlZaTkpOUk5STkJCSk5GUkY+OkJGOlZabmJWYlJmXlJiRjJCPk5yTkoyFjIeDhndxZ2pkW1xRQT44NkJHYEJFR0A+Ozw7Ojg4NjU8ODo4MzQ6Njk9PTk5Ojs9Ozw6PD48Oj5AOj5APjw/QD8+PDg6Q0FEPz5CRD8+Q0VCPUJAPDw8OmeYk5KSk5OSk5SVlJWXl5aWlZaXmZmZmpqampqkoqCfn52bmpmYmJiXl5iZmJmcnZ2cqH1nZXN7enOJop+enp2dnp6enZ2enZ6enp2dnZ6cm5ybmpubm5ucm5iYmJmZmJiZmZmbnZycnZ6enp6enp6dnZybm52bnJybnJ2dnZ2dnJ2dnp+fn52cnZ2dm5qbnJmZnJ2dnZ2dm5uanJ2dnJycnp2dnZybmZeVlZeXmJqam5ubnZ6foqOhoKGhnJucm5ubnZqcmZycn6CfnZiZmZmUkpKUl5SPj4+OkYyNiYuQi4mLjpGRj4mQmJiQkoyNi5KQj5iYoqiqpqWlrKOmoZqep6eyqKKVo6Cfl39wcWlsXFtcTUY8NzdHR1g+SE5URjk+Ojg5ODc1PTk4NzMzOTY6Pjw6Nzo8Ozo6Ojo8PDs/PjtAQD47PT5BPDw2N0A+QkA+QUY+PEFEQT1DQj49PDlmmJSTk5OTkpOUlZOVl5iYmJaXl5iZmZqampqaoqGfnp2cm5mYmJiYmJiYmZmZm5ybnKx/am16f3lxh6Genp2cnZ6enp6enp6dnp2dnZ6enJubnJubm5ubm5uZmJiYmJiYmJmZnJ2dnJyenp6enp+fnp6dnp6dnJydnJ2dnZ6fnZ2fn56goJ+enZ2dnZybnJ2em5qbm52enZ6dm5ubnJ2cnp2cnZqYl5SRjo+QkJGVmJSWlJiZmpudmJuYlY2Mjo6TkpKRj4mQjpGRjo+Ki42NjYiIi4+Lg42NkY+MkI2Qk5WVnJihoJySn6SipKmam5eanKOprb3Bwbq8uL26ucC8ubq3uru7tL2zwbV/bnVmZ1peWUxJRTo7TElTPFZSSUM6QTo7Ozc3NTo6OjgyNTY4Oz08OTk7Ozw5Nzo4Ojw6PT85PD8+PDw9QTs5NTg8O0A/QT9EPTxBQkA8REM9PT06YZOTkZCUlJOTk5OTlJeYlpeZmJmYmZqbmpqamp+gnp+fnJqZmpqampmYl5iZmZmZmZmphXB1e4B3b4mhnp6enp6fn56en56fn56dnp6fnp2dnJ2cm5ubm5ubmpiYmJiZmZiam52cnJ2dnp2dnp6goJ+enZ6hoJ6dnp2enZ6fn56en6CenZ6enJydnZ2cm5qYnJuVmJqamJiYmJmSjJCXlKCXk4+MjYqKiImMiJORh5CPjYqKkJCLjoqMi4+IiImJjpGOjYaFiYaKhoWLiI+SkJCNkJKXlpKamJ2TlJ6kpqaqq7Gsr6+rpquqsbm5tbS0rqyvtMDIxcXBvsbDxMTDurW+t7a0s7C2tb6qcHRyXGZfXV1JRj8/RUtMVklcTEQ/PUI6Qzk5Nzc7OTk3MTc5ODo+ODg6PDw7OTc5OTs9Oj4/OT5BPDs+PD46OTY5PDpBPkNBQT08QkBAPkJEPj8+OVyHhIOHi42KiYaFgYqMkZOVmJiHlZaWkpiampmenZ+gn52ampubm5ycm5iWmJmXl5ibqo56dXZ7f3mCoJ+fnp+goKCfn5+foKCfnp2dnp+enp2dnJqbm5ybm5uYmJiXl5iZm5ucnJydnp6enpybm52dnZycoaGfnZ6dnZ2dnp2dnJiWlpaYlZWSlpmWk5GKjI+PjI+NkIuLj4+WiYiEi5GZjn2Fi42PjYyHioyQm4yRj4+Lio6TjIyNjIiSi4yFiYyPhouIh42KhYyEj4qXkJOYmpWbnKOqoaKknKKrsbe0ubWxs62vsrKlp7O6sbq6vLa3tsDDw729vLa/urq8wbW4wL60r66mqa+3mm58Z1tjWl1fSEU+QUtJU1hZXkFGOTk9OUY/Pzo3Ozs7NjM6Nzo5Pjg6Ojw9OTk4Ozk7PDo+PTtAQDs8QjxAOjg0Nzw7Qj9BQj4+O0NEREBDQz0+PjlhmZWLkYWNj5aSiHl9e3+Fi4OKgoqJhmuAeJCLlpqRnZ2UlJGTlpeampiWk42Sk5KQm5uIdndzcX1/cpGgnZubm5yenZ2eoKGgm5uWlpucmpybnJuYmZqYmJmampqWi5CTlpmYlZiYlpucl5WSkY2SkZCUk5KXm5mYm5ePjpCLjo2Ch4uLi4qLiI2RjIeHhoqIiZGKh4yEhYqNi4qNhI+UkIyDkJOUmZWQi5OTkZWRlpWOj5GMlI2Oj4qIj4ePhoeJiYmNiomJioWNh46JmJKUmpuXmKChp6Cko5qqqbO2sbWwqKmiqK6tn6qvsK21ubi8wr/BxLixtbCutrOwuL68ury+urOzp7G3wpB1gGNiXlpXUk1IRkVQSVlXX1tDUDpCQz1HRj84Nzo6NzU1OTc8OTw5ODo9Pjo6Nzs7Pjs7PTs9P0E7Pz48Pzo4NDM3OkFBQEI+PjpDREM/QUM7PT45Z6mloqKZn6CippeUiI2CiIJ1h4iKiIp7e3Z7enmPeoiSfn18en6CkYWBgH1zfH99fISHfnRweHZzfHaBj4iIiYeIioyMkZicl4iOhIuNi4iNkI+Pi5GPi4yOj5CQjouFhYeLjIyHiIuOi4eMhYaBjYuGiop/iYqGiJiRiIOIg4KFfIuLjIaJi4iKkIyIi42PjI+Wh4mLio6NjY2Wk5OdnJyalpycm56bmpuYnZeTkZWWkJKRi4+LlpSMjYqDi4SEiYyQkIqOio2LipGJjZOTk5SVk5KcmZ6Xn6CfpaKvsamupKSfmKStpqa4t6ysu729wsPAv7+vpa2wsLS3uLO0uLa0ta6stK+4tLaBeXpjZmBeVlBRQUVMT0lcXl9UR0dCS0xCREA9ODg7OTU3Nzk3Ozc9PDk9Pj05Ozg6O0A8Oj06PkJBOD88Oj84NjQyOTtCQD9CPj04QEI/PkBEO0A+N2CloJqXnaGaoaCPl5efl5WCjaCfo6GdmpKOjIxycXBvdnFucG1ucHZub29waHBxcHR+c3FycXd7cnl2d3Jyd3Z6e3l8fXt/iIGEi3+PkYaNi4uGiouLiYaEgYaCgIKJkYOAg4x/ho+LiYWAh32AgZKQhoSEho2DhIyPj4+IjY+Hi4iRkJWRjpCKk5eOj5WYp6SfnZWYlpaln5udq6aqt7W4srGnr6qnpqGfmp2WkpWVkYqPjImTjZuVjYuLhoaJjJWQkJCLmZKVlZSbkJiTlIyNkYyWl5WilZ6mqauno6OqsJucpp+mq6G0vb6zs7+5u7u6uby9rqiusa6wuLyztLGxqrCpqLGxsqild3J0X2hhYFRWUUlKSFZNXl5eVExKRVFKRUdDPTo5OTc0ODY4Mzg4PTo9PD47OTs4Ojs/PDw+OT9DPzg7Ojg8Nzc2Mzc5RT4/Qz89N0BAQT0/RDw+PThUj4yGh4eUjJWZl5yWmZaNlZyWlZydoKCdmpiWeHFubXJ4cXFsbnJwa3FvcG1yc3t1dnd5fnVxeHZ0d3tybn98gX15eH1/eYOGg4WCg5CLkIuLi42Pi4mJhYKBfX9zfYiAfpyQhIWFiYuPinp9fYaOjYqGjZSRi5CXj5SXkpihlp6XlZunpp+goKawq6GjpbW0sqqmqq+isba5vcK7ucO+vLi9uLWxrLCspZuSk5mfm5SPk5WOmp2doJqfn5edo6qsoZ+em62hp6qwqaampJiRkZWUo6SirKSss7Szs6i3tru4sLKvra2yt7a6srW6s7e5u7i8urayr6yxsbKztLOxsa2us7Gzs6yhl3Zxc19jXlJRVE1PSUdYT1pcZFROR1VPRURKRD44Ojg3NTg4ODU5Nzo6PTw/Ojg8ODk5PTs9PTpCPj84Ozo5Ojk4NjI1N0I+P0RAQDY+P0I/PEM8PT46Tn98go6MjJOTl5eaj5SWjZaRkZSXk5qanqGdnHJvcnFxcXFxcG5zcW91dHJxdneAdXd8eYV+d3t8eX1/fICJiYmDfXp/h4GIiYGAgIGGiIGGi4aIhYSIiImEf4J/enx8fX6SkH+IeIGFi4qDhIWKj4yNkZmdlJSUoJqan6Ktsa2ppKWtr6ysrLWuvrmtrqm1sLexq7G2rK+9wsLAvrq8trKutraxtK66u7OurKepp6unoqmtoKmooq+wuLSxvLq6urK0ta+8tLezt7e7t7mtrbCprLW5sbeytLe2sLu7vLu6ury1vLi0wbWsqqqrtLG3uLm1trSzsKymrrCqq7Cxq6yusLKxtK6qo5N4dnJlZ1tMUlBGTUhTV1JlXmdUUExcUUhMUkNBOTk3OTU4ODY2Ozc5Ojs6Pjk4Ozo6Ojw8Pj08RD45Njs7ODg+OTUxNTZCRkREP0A3Pj5DPjpBP0BAO0t/gomXmJSdlpabmIuSlo6XkZGVl5SZl5+bmZx8dHV2dXl1c3RudnJzdHV2d319gX56gXyDfoJ/fYB/hIKFj52RiYF/go+Xjo6HgoCBiIuFfoqQi3+HjYyLioeSioeGjZGTkZGEh319g4iMjouOiomQj46PlJSYkZWbmp2dqK6yr6+1tLOtsrW4sLy1tbGqsKqztbS7t7SztrS1r7i4t62noqassLCvtre3vrW5vLOysa61u7C0r6+yu7axuMC9tLS0s7izvLq2tLrAvbm6ubq+ubm5vrWysa+yr6q1tLGzsbSzrri4tb+vpKaoo6ussa+zrq6wsKytq6qroqKmqKKnrauqpaynoqeYeHlxZmVZT09NSVJNV0xPX15cTlVUYlFEVE07Pzk8ODk1Nzc1Nzk1Ojo6OTs4Ojw8Oj08Pj4/P0I9ODY6Ojk6QDs1MjY2QUZDQz4/Nz49Q0I5P0I/PjtLjpGTmJmVmZGTopiTkpKLk4uOkI+Vl5ablZSbhoJ9enh2dHRzdH53end2gIKDhouMhISFioaQiYeRk5aRjZaalY+IjI+emJaVkpCTl5qamJCdoJ2Tl5qgmZ2bo6CVkJugpKOak42IiIuJkZGOkY6LmJqPj4yUmpecnJufnKSstLm6vK+2tLi0tLK3uLmzq6+qqKy1srK1rrGrrqa3s7OxpaGotbCvrayrtbqyu7q6tLK3ur67ubG4sLmtqLK4u66ttLS3tbu2trm5vLe0r7G0t7a5s7e1pq2pq6ior6yprq2up6KxtLG0q6aop6Cjq66oqq6orLKwr6+pqKGeoaGjpqOgopqlo56ol3J3bmdiVUtUT09KQ1BLX2JYWlFcU19NSFFJQUA5Ojg2Njc3NTg5NDs5Ozk8Nzs+Ojg8PD0/QkBBPTs2OTk5Oj87NjM3OD5GQkJAQjk+PUBDPkBGQj44R5OWkZWTkpSQkZ+ZnZmVkI+Sko6Mk5aWko6RlZGSkIaBeXJzdXuBhI6HhZGTkpicnJiVkJWYo5yaoaeqqZ+clpeVnaKioZyZnpmlqKyvramnqqmop6GlqKirqamvoZufoaOjoJqfoJyUjZiUmKCgoaSem5qkp6Spq66spaOoq6+xtK6qrK6zr6ystLO0ua6urayqrLKwsK2wqKqmsrS0uK6qtrqwr6qurLC3s7i0t7W0u7y4tbWxtauyrKiys7uvrbGytLa1sbG0s7OvrKuvs7a0sayutKqqpqWnrauoqKupqqifqbOwqqeppaOio7CtqaatpairrayppaSioKWipaOYmZyVnqKippdudWVnZFZPWEtLSktTVHBiWWRXX1tcUlpQTEM8ODk6Njk4NzQ3NzQ4Ojw6PDg6PTk3PDw7PkM/QT47OTo5Ojs+PTg0NThBREVEQkM5PjtAPkI/R0Q+N0KSm5SVlZaVj46Wl5qZlZGKk5SSjo+SkYqKiY2Ul5qTjYmCho6VkZSfmpuin5+jnqGhn5ijpKelpaapqa2rqaKmpKilpKGfnqOjra2srairrq6qqqukoaKlqaenqaijopybm6SgpaijoJidmZ+hoqmnoKKirqyrqqetrqilpKmpqammo6iqqaekp66wr7Ovq7Crqq+yr7Czua+rqLCxrrCyubO0r62vtbCss7GurLW1tLSzs7CvrKyqrKusr7G0s7CwrrCwsKyqrauqq6alrrCysKumqbCvqaOkqaunqKaopquwq6mvqaaoqaalo6iwraqpqKKpo6WnpKGhoKKloZ2el5aYlJugpKmUbnNeamlfVVpOUk5QT1JkXGVjW11ZXFBZT0tAPDs5Ojc6ODczNTMzODo9OTo4OTo5Oj08PEBEPkA9OTo8PDw+Oz45NTo8QkFFQUNBOT47P0BEQENCQDdAkZ6YlJeZlpGHi5SSl5GIg4mLk4+OkI2Hh4SFlZmWmJeZlpqeop2anKKkoaCdn5qfoKGgpqGgoKCjo6KlqKmrramqpqOmpaCloKaopqWnqKapqKOnppmcpKWioaChoaCcmJmfoKGkpKKenpagm5qioqChn6CiqKCcn6GloaCmo6KfpKGspp6foaGkrKqnrKivq6e0sa6ur7WyrKqwq6mtrbWwrq6srreup6yqpKivsq+sq7Kvqqqpq6utqa6urrGxraqtqaunp6uoqauinaapqKilqKisqKilpKWop6iopqmsr6+oq6mhoqKlo6Opq6ymqKWjqKKhoKSdnZ+hoZ2bnZ+amZWcnKOqlG9zZm5yZF1dUFVPV09eZGRsaGJiWlpSVE9NQTo9Ojo4Ozk1MTYzMjg4Ozk5OTk7OTk8Oz0/Qz5APTk7Ojs8QD0+PDk5PEFBRUFGQTo9Oz9BQUJBRUI4PYqWlJOYmpaPiISNjpGSjIiIiI+JiZCRjoqKiJubmZygpaKlnqKjoZqeoZyanZ6bnKOop6ugoKOYoJ2XnKGjo6WjoqKkrKilqaCepqmnq6mkn6Kgoqahpq2mpp2fn5+fn5manJyhoKGkn6GbnZqcoJ6hn56eoKOZlpqYo6KipJ+ZnKGhoqCbmp6goaSgnaejqrGorqusqaSqqquorKalrKqws6+rq6mwq6appaWoq6ynpqevq6Wnq6upq6irqqqrrailqKOmpaesqayoopykoaOmo6qpqKano6SnqKanqKepqKupoaKoo5yepqWjqKino6WlpqmgpJ6inpeYnZ+doqKlnpiUlZ6go5d1d2t2d2FfXFVZUVVWW2Necl9oX2NTUVlUSD48PTg7OTo4NTM3MzM0Nzo4OT05Ozo5PDxBQEM9PT44Ozw9PEA/Qz86ODo+P0NAREE6Oz48QD9DQ0VDOTyCmJmenZ2alZKKiZGRl5GQh4SJgoGNj4+Sj42cnZ+hpKmlqaeorK2moqKfmKSmo6Stsa6yp6asm56em5qjp6Cfo5+foq+rqqyoqKuwqaipqKGfoKeprbCyr6yjoqahqaWepKOipqClpKKlo56doJ6fpaKinp+imJWemp6fpKGblZigoZ2enJudnZuZmZWen6Oonp2iqKGaoaOmoqSoqaqoq7CxqKWlp6eopKWpqaqnoqWmqKadnqWloqClpaOlpqCjpaOjpaelqamqpKekpqKmp6SrqaenpKGlqKynpqWlo6OopJWdo5+bnaCjqaeopqGjo6mooKiioJyVkZqfoKGmopuXkpCamqCVfHdvfXlmW1tgX1pcVlxoZG9jbmloYl5QUEA/Ozo4OTg8OzYzNDMzMzc5OTs8OTs7OT49QkBAPTs9ODw9QD08PENBPjo4PT9EP0M+Ojk/PEI/P0FEQjk6gJ6kp6Kem5+gmY+ZnaCWloqGj4iEi4qTl5SRo6Wnqq6trLOys7S4t62pqqevtLKxqq6usbKusa2lq7OssbGpq6+rq6y2sLSwq7GysaOfoqqpp663trS0trOvrKuuq7awqbKxra6npp6io6ObnZyXoqiloZ+eo5ueoZqWnaScm5aZoqefoJ+joJuUlpmWl5qfoJmVnqKZmJ2dpZ2gpKeqqaiqraylqaSlqaeqqaqsp6SkpKOimZmhnpqaoaCfpaWYnqSmpKqooqelpaGqp6mnp6ejqKWmpaGkqKesoqekoaalpaOVl52Ym5mVo6elpaSfnZ2lo6Kqo5+amZiXnJyaoaGakJOTl5ibjX93cnZ4aWJbX15cYllgZG5ta25hX2RgUE9BQDs7OTs4Ojk2MTQzNjQ3Nzc6PTo8Ozk9PUI/Pj89PDo/OTo7PD5BRUA9OTtAQT5DPDs5PzlAQEBAQkM7OXuao6OcoJ2dop2Zn6KioJibmJaYkpSQm5qWl7S0rrW4s7S4tre0uLm3tbm4ub28uKqLnLK4vLS9urW7uru4s7q/uLe5u7G3r6iusq2inJ+qsri8vL27ur+0r7GztbS3t6+1tLWysKikop+gl5Wal6SqpqahpKOkq6WlmKGko52goaKooaOgpaGck5mYmJmco56cmpudl5uZlqWam5+hqKmpqKuvr66pqKmrrKytq6irp6WjoJyfo6Ojn6Cipammmpyip6Spn6GjoqKgpaanpqSooJ+ipKGjoqiop6OloKGopqalo5mbmJuTj6GknqKfmJiVoJuhpaCfm5udnJuamZugmo2YmZiTkYaAdnh5eGNbUllUX19hbGh1a3BnaWliWVNMQDw6Ozg5Nzk3NTU2Mjg1Njc3Ojw7Ozs7QD4/QD0+Pjk6PDk2Nz47QkZCPDg7P0NDRDw+OT43PkFCP0ZDOzhwkpqblJ6bm52Vl52doqajopaXnpaXl6GblJi+t7G4uba3t7i7l5S2vbu9vcDFtaK7mKC3v7+6wcm0nbu2sra/xcGooLazurGqrrSxsLG0tLa8vL68vL3Guri3ur20r7Wxsbq4t7Kzsqqmpp+YpKSnqKSupKurtbWus6CnqqynqqmlpqCnoKGmoZOWmJ2foqSjnZ6coaChnZekmpmdoKaqqqqtrq2tsLGrrK2sqamrrqimpaalpqSkpqaeo6eppKGcoKKjpqCio5+jpJ2foqWgpJyboZ6fo6GhpaSlqaOkpaKkp6ehn52elpOcoJiZko+MjJeWn5uWnJqdnJqTlpSUmJOQmp2YiouHgIB8gnhhXllTYWhgZnNvc2l0ZGlkYltMSz46ODg5ODg5NzM0NTI1NDY2OTw8Oz08P0E/QEA9Pj44OTs4Njc/OUJFQzw7PD5DREM9QDs9Nz1DQ0BFQjw3Z4yRk4qalZiblZWYm6Knq6aVl5iQlZmhnpeXvrWztLu6ubi5woeYt6u4u8DCxbOjw6e4s72/tMTHvbS7uL62wMTErqCworW2tb2+wcPGw8O5vb/AwL2/xL28ur2+tKeqmLHAvbi1ucCzr6+qqqitp6ekr6eqtLyxtLWor7Gwr6yqoqajrJ+fpquXmqifpaWfoJydoKuwsKyiq5yYm6Cor7Kys6uorre1sq2tqaalqKulpaStqaShn6Cnnp6mqKmmnp+anqGlpqmcnaObl6KmmpuanZ+cmqGcmZ2eoKijn6GfnaWioKOioZSZmpmTj4qLhI2Qk5uPjpiVm5eYkJORkomNl5iYk4uKi32AgIVwYGFeXmpiYm53dXZubFtiUVVcTUc7PDk3OTc5Ojc0NDQxNDM3Njg8Ozs8PEBAPUA/Pj8+Ojo5Ojc6Pz5FRUU8PT1AQkJCQUI7PDhAQ0NARD87NV+MjIaFlouUlZeYl5ifpqellpWWkZebn5ual7mxtrO5vLy5urWqsryxvsG0vMe5uLuuv6fGw7/KxsnIxcXJvMLHx7+xsae8vL7FxMbJx8XGu8TAxcbAua+9vMC+vrOrqoyzu760tbfCuq2vsLWqq6aqo62kp7G2q7WyrbOtqK6vp6awr7Ktqq+zpKu1qaeopKCgnqmyuL61tbWqqaausre4t7apq7i8ubexr66noqOop6SfqKOfnqCZoZydoqSnp6GelJuaoKGlnqChnpajnZSQlpiboZqflpORlpSin5qenJudoZ6kn56VnJiPkpOPjImTkJefiZCWkZuUmJGRlZaDjJWXlpKLjIh8f4N/amZoYWtsZm51cXJ1cWZeX1xSSUU/Ojo6Nzg0ODw3NjU0MjMzNjU3PDo7PDs9QD4/QD48PTk5OTs6PDw+QkRFPj49QENDQkREOzo4QUJCQUNAOTJbk4iEjZGKi5GRlZCSmp2fnJOSmJSdnZqXmpW2sbm1tb6+tri1uLO8vMTEusPHwb+0s8XFxr/CzcfLzsvLx8HDxsfIysXExcO7vLzBxcHFxb/DwsbFwLGTvrq/w8K2trqptLO0qauzu7uxn5uxr6ykrK60p6qpqKqtrKmlpZ6pr6uyu7q4u7e5t7O5uLOurLO0qrC1ub3Bur6+vL60urm4u7qysbS8u7q7s7Oyp6Smq6uioaCdmpudmpyXmpuenJygnZaclpuZnZ6io52UnJCNiY6OkZ6bnJWNh5KLmJiWmpybmJybnp6cmp6UjpiYmpSRmZeeoZWYmpKXlJWRlJqYk4+TnZaSi5F+enx/dGtrbmRvbGhxeG95aWlhXGdhUUZEQTw5OTc2NDQ6ODQ2NTMzMjY1Nj05OTs7PT47Pj49Oz05OTs7Oz89QUNBQkFAPEBDQ0NFQjs4OUQ/P0BCPzsyV5uQkZCQh4WSjo2IjZCTlZGPjZSUm5STlpqRs7e4uLi+u7C1sri2tbbAw8G+w8LAvru+u7u8xMzEzNDLxsa/xcfLyNTLysjGv7u7vsS+xcjGxsTEw7i0wLe0vMHCucK3t7/Au66lrre8t62co7ewpq20tayupaWjqKSgoKWZqrOyvsG+urm6uLW0srG0tLO6wL7Av769u7u9vsDCt7a3tru7sru+ubi3u7a3tKyoqamrpqijnpOampyYkZKZl5GRmJqXnpiWk5acm5+elJOJiX6GiIuWlJiZkYmVkZeWlZmbmpaYl5idnpyhmJWZmZyYl5ybn56jnJ6WmJeTl5yZmZyUlp2UlpOJdnl6e3Zua2hndVpmcndzeGZnXWRbUlhJRj87Nzg4NzYxNjk3NDQzMzM2NDY7ODo8Oz08OD0+PDo7PDs9Ozs+PkRBQURCQEBBQkNDREM9OTlCQD8/QD89MkyWmpaSk4yKmJCKi4yOkpKKiIaNkJiKj5CUl7O7tba/vb2xtrjBvby0uL/Bsbi3vsHFvbu8wsbJv8jOyMHEwcfKysbKxczIzcbIxb/DwMvNz8nGw8PEwsS+uL7Bw8DEvsHPz87Gq6+2tLWroKe0s66ruLWzq6mjoq2prKatn6y1tL/Cvrm4vbawrausr7W0ur7Fv7u8urO5u7i5ubWtsLS9u7G/vLiytrmzubu0ra2orKyqqaeXnpualY2MmJSTi5WWlJyZl5WWmZKYn5mQiop+iYqKkY6Vl5OUn5mWkJSZmJmWmJOUm6GeoZiYmp2ZmZaenpibopqdnJuYmpuZlpeXlpyZlJyYfoB4eXV1ZWVpamhdam9teHdjYmBgXlhXRkU4Ojg6OTc5NDQ5NzY2NTEyMzM0Ozo9Pzs9PTo6PTs8Pjo7Pz48QkBDQkJFQj0/Q0NDQ0RFQDk6QkFBQj5CQTVCkJeUlZmSj5qQjpKRjZSVi4qHjI2UiImPkpq2u7S8xsHEwr3BxcLAtLO9v6ywr7rDysPCvs3IxbfByMW/wcLIy8rCwsTJzM3Pz8zDx8bIyMjHycfFycfIx7/Fx8TEx8jK0s/SzLy4trS4uMG+vrq9ury6vKytpqm7urm3wLK1uLLAxrq3t8Gzsa2tqau1s7u2w7a2vbWxt762s7e4sLW2v7uwvbq0q7CxsbO8urOzrqutq62xnaOjoJqQjpiXlZCclpaYlpWSnJmTm5+clpGUjpWQiYyQlZOUm56YmZKSnJedlJmSk5aZmJ2VnJ6do5yVnZ+TnKKcnKCfnaOemJSVl5ebmpmgkH99cXRxb2JhZ3VnaWl0bXhsXWRbVWBZTEhDNjw5OTg4OjUzOjY2NDQxMzUyNTs6PD47Ozw9PDs8PTw7PD49P0E/RUFCQ0M+QEFARUVERUE7Nz5DQkI+Q0I4O4+akZaalJKUjZCUlI6VlI6Pi4yJk4uIkJObt8C6xsXEw8zCwcS9vrWvt7uvr7O6wMfFxMHMy8W2ucDCwsTHytHLwsPExsnFzdDOx8zJwsHGwcvLx8bMyc3FxsbDxsXJzdDNz8zHxMDDwsnNx8XBxMfBu760sbCwwb6/wca/vri3w8K6urbAvrWyrKmvsri+tMC0tLi0t7nEua+8vrm+v8K/tbq2q6qsrq+wt768trSura2utaSlqKimmpycnZyeopydmZOQkp2VmKCdmJiVmZmZl46MlH2QkJefmZmYk5GToI6Nko+VjpCUlaKdnKSem56elpyjoKGipKOkop6amZubnJ2enIN9cnx4cGdgamp2bGlldG5zYlxiVFdUU01HOjc7OTk3Nzo3NDg3ODQ1MjM0MjU7Ojk+Oj08Pz04Oz05OTk9PEBBQEVCQUJBQT9AP0RFREVAPDo+QkNCQENBOjSAoZeUmZiVkImUk5aTiZGMlJGOiJaKi5CXnMXLw8O8wMPHwbm9vbu4tre3rrK3uLzAwsDCx8bHurzAwsXHyMbSycHDxL+/vsTLyMrLyLy7yMfJzcjDyMnJxsXDwsHCx8fJysfMyMfIzcbLz8W3wMDAwLu7vbWzs7+/ub/DucC3u8G8uri7ub27srCvsKy5wri9ube1t7q9xb24xsjCwcLGwr28tamurrCwr7O6t7m2sK+tr7OppquprqannqSlo6OjoqCblZiekZecl5GRlZeZlZmRlJiSlYyYo5qcnp2FiZ+TfJKWlZKUlJennaCipJ+en56foaGkoqKjoaOinJ2fnqOhppl5enl/cm9mZWdjamRham1ubl5YXFZVTlBKRjk5Ozk3Njc3NjM3ODk1NjEzNTI3PDs8QDs/PDw6ODo8OTk4Pj1APz9GP0JBQz89QT5ARENDQTw5PENBQ0RBQDozbKKdlZedlo+PmJiZmIiSjZGVkI+Vjo6TlpbKy7u5urnBu7q3vsG8vLu5sa61uri4u8S6vsC+vru8wMXCxsK+xsG5u8O6uLm8vsHGwca6ucnJw8XEwMTBwsHEwcO+vcLAwMHCy8PGzMvFyNHCsL69uLq7vL63tLC5vrO8vrG5tbi7tryztbm2uba5t7GtusG6vMG/t77Ev8bDw8fHwrvAwr/Cv7iys7O1tLGut7S3tbSxrK2xp6Wlp7CtqJ+nq6ajqKWmpqCgn5SYmZSRkZWUl5OYl5qhnZ6hnKGdoaWglpSbkZeXmJqTnpmZqaSlpKWdoqCanqCkoqOcoqGjoJ6cnp6ppaiVfXuDeG5mYWRiYWJjY2piZmNaWVlcWVFORT07OTo7Nzc5OTY0OTk6NTMxNDUyNzo7OkA9Pzw8OTc3Ozo5Ojw+QD8+RDxCQURAPz49QkRCQkI+OjlCP0FCPT44NVmfnJiTmZaRlZiYmpeQkZCQk5GTlJKSkpSUxce4tbq5wrm5vMPFwri7ubGxtry6tbnAu7u5tre0tLW/u72/ub26urS/uLW3s6+7vLfAt73Cv8G7v8G8u8W+u8HEwL6+uLzBwcu+vcnEwMDKwLHBv7u4u765tbe0uLy0vbi1tLCzvLG3tri/tr25vb65t7q+u7/Axb29y8PGw8TAw762ubq2v7i7v7y4trOyq7CwsrWzs66sq6emnqeurauiqKumpqqjp6iqo5+Ym52bmpicnJiXnJuhpZ2anqGhoKGmoJqbnJiboJ+dnJ+coKiho6SknaKfmqKgop+el6Shop+dmpieqKWhi3x5h31xY2BiYmdqZmZpZWldVlVTWU9TS0U4PzY7Ojc3OTs2NTo7PDYzMTM0MTc7OTg/PT47PDs3Njk5ODo7PUA/PkA9PT9CPjxAQUNDQT9DPTo2PEBBQDw9ODdJlJibj5OUkZWYlZGWkpWRkJGUlZSTkpKYlcHCwLq8ub62uL7EwMKxvbqytLO4vLW3vMC8vbS0sbC1t7W6wbi+uL+8vbe1t7CuuLa5v7vAv7fBvLvDtrrIuLa5u725ura7xcXKvbnFwL+8wb64xr3BwLzFuLa3tLi2tru7uLa0t7q1tLi8vbm/ucPAwLu5vLu+vcjEvcfEw7rAvb62sra4srm0usLCureysaysq62yr7Kur6ijpJ6rrKyqpKakpKiqoqemraihoaGmn6Oiop6bnKKfoKOdnJuhn6KgpKCem5eZn6GdnZ6eoaWkoaKioZ6ho5yinqCZnZijn52eoJqZoKKmnYR6g4B4cG1lZWZvaWVrZ1hYTktLS1JJTEhDOT44PTs2Ojs5Njc8ODk4NjA0MzE3OTk7Pz0+Ojw6ODg5PDg6Ozs7PD1BPj09Q0E8P0NDREA/Pzw6Nz5CREE/QDg4P4mYmoyMkI+Tl5WMkpCakpGXmJaUlJKQmpTDvsbBwby8uLi6v7a8scK2tLyxtLa4s7q9v728sq2vrLGwt7y2u7zAxLm3t7e1urm6u8C9w8C6xMK+x7i5uK23tbi6tLezu8XGy8G7xsDAv728v8nDxMW+xri1srK9uLi4vrq6uby6urS3u7q5v7zEwL+5uri/ubvFxr3Fw8Kyur27sa+2uLO3s7q+wLm2rLGrrqmqqa2qqq6mpKWnrq2ppaOio6GkpaWmoqato6Klo5+ho6Gcmpyhn6CloaCenZygnaWgnpeVmZ2fn52gn6KmpaCknpybn6Ofn5mcmZ2epJyWnKOcnqGcppZ+f4Z8a25wZ3Brc2VibV9cVEhLSkRKQkNHPzk7OD08Nzs7OTc4Ozc8PDYyNzUxNjk8PD08QTs8Ojs6OT45Ojs9PUA+RD89PkRAPz9BRkQ/Pzw9OTc/QUNCQEI5Ojl3nJiLh4uQkpOWjY+TmpOQnZiSkY6QjpiSvbfHvsO+vbu+vL22uri9ure9s7OwuLi1uby8wLeqraSusLe7s72/u8S3tri2t7+/xLzCxcXHx8rJxs/CwbiutbW8vri7sr7ExMrFwcnDwr+/vr3HzMfHxMe9tbW2wb26u7/CusDCv7y2t729vcHBwL+8ube8wru3v8W7wr++tbe8vK+vt7awtLO6ubq7r6mtq62rrKaqoqeuqKWqra2vp6Sgn6ajnqKjqKOjq6Oiop6dm5ublJaZnJyfpZ6fnpmYnpejoJyXmZqZmqOjop6jo6egpqCbnaCjnp2WoJmcoKCblJegn6WcmKKQgYaBcWVsaW50bndjZ2JcY1FLVEhFRUNHQzw7OTg9Ojc6PTo4OTs3PD01MzY1MDY4OTo8O0A9PDo+PDk+OTk9Pjs/PkM8Pz5APz0/P0ZEQEE/Pjo3P0BDQz9BPTo4ZqGYj4uNlZKVlY6PlpmVl5uVjoyMjY+bk7m2wbS/vLm8w8C+wLq1trKywLmvsry8sLe7tru8q6qjsLm9vrO8vrzFuLK4ub3HycrDx8jGxsnIzM7RzMrEtbrAw8i/v7W/wL/Gxr/LxsO/wbzAw8zKx8XGwbm9vMS/wL/CyL3Hx8XFvLrEv7vBv7rAvLu7wMS9t7nCub69t7S2uLqur7WxsLCytre0t6yurKqsrKuoq6Gms6qlra+trKippaOkp5+io6Onoaeiop6cnZyamYyQlpeZnaKZnpuVkp2UoaCdmZ6fmJimpqKfoqKmoqeloqCko6GbnaCbnKKfl5WVnp6kmpafiYGDgXRvbGx0a2xuX2JeYWFOSE0/RUA/REM7Ozo6Ozo4Ozw6OTw+OTo+NDQ1NTE5OTo5PDtAPD89PTw4PDs6PDs7Pz5DPkI+QD89Pz9FRUJBQj87Nj9CRUQ9QUE6OlmfmJOSlZqVmpOQlpeclZuZlpSVkZKTnZm2uLaxuru6vsG5uca7trWypb69tLbBv66zvbS4wbGwsbS8w7y6ur68xL+3vb+9x8zGx8nGxr/ExMrIzMzNysbCw8vOwry5vbq5wMO/yMbEwcG/xcDKycPDw8O5w769ub+8wsbCyc7Hxr66xr26v7m3wLm5vsDCvrW0vLi2u7CvsrK1r7Cvrqyus7CzsrirsbKxqrCrq6yrrLatqKyusqarrKmpoaWgpaakrKSmoaChnqGgnaCMlJeTm5+mmZ6emZOYnZ+gnp2eopuYp62ooqSgoKKqpqmhqKGlm6CgnZ2jn5SYmKKdp6Gfm4J7eod6bW13e19wY1tdX15TST5DRUlCQz5DOz42OTo7Ozs7Ozs7PT05PTU2NjIxODo5Ozs6QTs/PDw+Nzs8Ozw9PTw9Pz5BQUE+PkFCQUVDQkRAPDY+Q0RFPkJEPztTmZuZmJ6dmqCalpyZn5KdlZ2boJWWlJqYur20sLu8wcTCv8XGura5sqO7vbS3xLuwtbq2ucS4tLy2ur3BvLu/tr/Bv7y/usDLwsfIwL+8vL/FwsfLyMHDwMDJysLAu7uwtLu9wMXGxcW/wMK/y8fCwMjAusK7urO6usG+wMrOysS9tby8ub+5ubW1s7/Avre0s7S4rbeqr7CwsrGvq6+nr7ausrG5rra2uLSzsLGttrS6sa6srranrLKsraSjoaenqLKrqqWkp6elpaCml5ujn6SmraKeo6KanaWiop+foaWenrC0sKSlnp+kqaevp6mgq6CiopqipJ2anqGmp6+psZWCe32Cem1zeHNncF1bXlxZUUVEQ01JQUU9Rzo6NTk7Ojw8Ojs7Oz0/Oj01NDUxMjc4ODs8O0I8Pz46OzY6PTo7Pj0/QD87QUFBPj4/QkBBQkJFPjo1OkFCST9AQkA7TJqdnZ6fnZienZmampySoJWbnp+blZGRlsW+urbDvMbCvr/Ixbe1uLe2ubu0r7e2srWzt7m8u7a7u726w7u3vbe5wLu6uLi1xcHCw7u5s7S6wb2/xsC5wLy+xcS9vrmysK64t7/Dx8PEvb2/v8PDvr/HvLy/tLSutbW8vr/OzcvCt7K4uLi9ubuxtrLIwLu2tLGwt6yzqbCtrbO3r6uuqrG1r7Gvt7O6usC/tre2sru6wLWyrbO3rLC6r7KloqWrrK+5s7KosK+xr6qiqKGkraitrLOun6inpqWmq6Sknqaqo6ayuLOrpZyfp6anrquqpbClpaWbpKOYn6exrLW4sLKOhHl/fHZsdXpwbmlcX2BZU1BBRUhHS0BEQ0g8PTY7OTk8Ozo6Ozo9Pzw9NTU2MTM2OTg8QT5AOz1AOzs5PD04Oj08QD46Oj49Pj09PkBCQkJBRD03NDU9REc9Q0I/PEWUnqCgoJyXmpiYlZmdmZ2fmp2bnJaRj5LDwMK9wrzEvLy7xbu3s7e2tru7s6CWtayvsbS0tLa4ucHAt725uLm2tb+ztLK4sbvBwMO3t62wtbi4uMK6tLu3u77Au7u8rq+us7K5wcLEw768v7u6uLbBwrW/urWur62wvcC5z8rJw7GvtbS0vbq+ubq7ysO7uravsL2xuK+ys7C3vbaur66wt7CsrLK2vbzEwrq9t7bAv8G3tbC2srGzurGxr6err6u2v7e1qbqztbmxp6uop7ausrG1uaisrK+qr7CqqKessayytr20saykqKuoqKusq6i2qaaonqadmKOuvLG7wbSmiYF8gnpzdnZ3bnFgX2VcWlVKPD8/RkY9RkNDOTo1Ozk5Pjw8Ojo8Pj4+Pjg4MzE1Nzg5Pj9BPzs6Pz08Oz09OTs8OTs6Nzs+PT1DQT8/QUJEQkE8ODU4PUNGPUREPzw/iZ2en52Xl5WUk5aZnpubmpuYlJ2Uio6Owb7Dwr6+vrm2usCxtbGzt7fCtbOrrbOoqa61r620trnDv7e6t7a2srTAtrK0uLO6wMHDubezsrK0sri+ubO1sry5vLa6vrK0tLSwuL7DxsTAvb+5s6+yvLquu7Szpquorbq+uMvCv76sq7Cvs7q3ub67wMXBu7y3sLXEtb+0uLu0u8PCs7a2sbisqaWrsr23v7+7u7exvL28trGvq6uprbOvsLCrsLSpuMC2sqm0tbC3tq2spqu7s660uMKwsbG1sbK1saywsri4ubi+tLGzrqyxramvrqqyuK6trainoZ6ptr+4ur+wlol9gHxxdHd0dnJsXmJgW11PSEE+PUhDRk1DQDc3NTs6OT48PDk4PT47PT86ODMyNTc2OD8/Qj86OD4+PTw5PDk7Ozo8Ozs6PEA+QkI9QEE/QkI/PDs3OjxBRD5CQz8+QYqgm6GdlJiVlZKYmpyWm5WalY2bj4SIhru0vb+7vLm3s7y8rLOytLS2wLXAr7Kzqqqxt62pubO3wL27vLi2uraxwLq3ubi5u8HBxMO7u7a0tLC2urW0sqy8ubi1uMG6uLOxrLe8wcfDv7m6ta6lrLOwprCtqJ6gn6WttrXCt7a0pairqLC2s7K6tbu7u7W4trC1xLK+vL+8ubrFybq9vraxp6SeoamxrrW5trKxq7S3trGopp6gmaWmpKynq6y2qa+6sa2kpq2lq7GrrKmtuLawsrjBtrGxtbGvu7ayt7W1sry1urKwsbKutLKqrq2nuLWyta2uqqiosrq9wLa0qY6Ce393b3tvdXJuY1xmWFxdUk5NQT5JQkBKSUA2NjU7Nzg+Ojs4Nz4+PDs/OjkzMjc1NzU8PD48PDg+Pjw8OTk5Ozs7Pjs7OTw+P0E9PEJAPz9CQD47Njc6QERBQ0E/QUKJoJ2loJSWmJiVnqCcl5uYmZGMmYmDhoS1r7S7u7S1sLG2uq6wtLOvtbq1urC1s7GttrqurLyyuLm3u7+9ub7AtL+7vLq4vsK8wsrIvsC4uLaytLaytK+tu7q4trnAw7aurqqytry9ubaysa2tn6Snp52jpp2WmZman6muuayrq5+lqKSrrq6nr6yvsbGtsa6usLmwtLy+uLm4x8W8vLu4qaKcmJufp6assq6zqaapqq6popqXl5GcmpijnqKir6ekrKaompqemqGnp6anqa+2squ0trCqsK+xqbm2sbWxrqy3s7avrquuq7S1ra+rq7GtsbKoraurs7W3ur2wq6GLeoJ5cnZzbXVpa11balRdXE9NSERGTEJGTUY4NjY1OjU6Pjg7OTc8PTo7PTo5MjM2Nzc3Pjs9Pjo6Pz48PDw6Ojs5Oz47PTk8Pj1CPDtAP0A/QT8+OjU1OkBFQkRBQEJBiJ+ipqGYm56dmqWpmJudmpmUjJmHhoeGrq2uuLmxsqiur7iyq7CwqrK1ubm+tbK4tLm6tbm7tbWztbu8wLu+wLS/ubm6sbrDvMLKxb+7v7+5tLSzsLGtsLm4try4u7+ysrKusa65r6qrrayjqKGdnZ6XmKGVkpWXkJifqK6ko6Sgoqeio6mpoaanpaqtp6ynqKesq6yyu7SztLm6trK2ramgmpaWm52fq6yrr6Ojo6GpoJuTjo+Qk5KSmZaanaSloJ+ep5iVkpSYnqSjoaWqrK2iqaqppKmtrqW0sa6xraqprq+wraWmqqSos66trKmmpqmrpqqnq7Ksr7Oxq6mWgX+Bd3J4aHRzbmRUYGNXXFFOTEhASFFETUM9ODg3NTo3PD46Ozw4OTw7Ozw7ODI0ODk3ODs7PDs4PD0+Oz08Ojk8Ojs9PTw6OkA9PDw7QD5CQEE/Pjk1ODs8RkFDRD9BQYijpqKjnqCfp6Coqpufm5yZmI6Xi42PjKqpqLGvsK2lp6ayr6mmq6CvsLu1vby4wMG+vLy8ua6sr7Kyurq3t7W1vLOvtKu2urjAxMG7tby9t7Kts7CvrK62trK0ta+qpJ6bnJyeqKieoKipn6GnlpuXl4+dk4+Qlo6Xm6SooKCioqKlpZ2jo6CepaCkrKSmqKSio6OrrLOuqa6urqeqraisoZyamJmYm6moqquepaObo5yVkIyPj5CTkJeVlpifnp6amaaXk4+Slp2ioKWjpqSnoKKko6Ghq6uksq2qrKyno6yuraufoaKkpK+srKmmo6KqpKqqpKmrpqmsq6agiHiDfHZ/eWJ3bG5cUWhUUE5HT01MQk9RQD47PjQ5OjU7OT07Ojk9OTk8Ozw8OzkzNjk5Njo7Pz06ODs6Pjw6PDs5Oz07PDw9PjxAPT88ODtAQEE/Pz45NDk8N0FDQkQ9QEOOqqSjoqGinaulpqimoZ6dmZ2PmJWTkJWnpKGmqKmlpKChp6uhnKKbp6u1sry9wMLCwL7AuLSnpayqqLWysbCur7KnprCkr661wbq1t7K3trO0q7K0rqqrr7Cys66lnpKYlI+YoJ+ioJykpZ+eqJSblpeMl5GNkJeTmJ2iqp+fn6Cjpaicn6ChnKKfo6innKehoKSfrKisrKCpq6agpKimrKOdnp2Zl5qrpqmxo6WonqCclZOQj5GQmJCWlZiWn5ibmZujmZeUlpqdoJ2nqKWgo6Kho56doKmqpa6upqipoaKqrqqnoaCio6msq6eppqShqaKlqaalpKKmpKijkn18gHV1fW1re2RoVVFjTUlIR05STkpORztFQD0yPzc1OTs+Ozk5Ozg6PDs7Ozk5NDg7ODc7Oz48Ojk8Oj07Ozw9OTw8PD49PUE+QEJAPTc6P0FCQEA/ODU1PDpAQ0BEPkFGlq6koqWeo6KpqKipqqWmnp2imJiZmZWbop6bnqOioKOgoZqgmJiXlqGorK62t7q5ure3u66ooKGpoaCtq6qmqaSppKWupaystLy3rbOxr7Guta+vs7Wqp62so5uZlI6RlpeZmZygoqKcnaWemqSXl5eWkJKRkZOal5ugpKqeoaGepqeqop+gp5+dn6SnqZ6jpp+qnaqtqq6nqLClo6Smp6ymoaShm5ier6iusqulqqqgmpiYmJWTlpqTlZWZlpuXl5ignpycl5uhmp6ao6eln6GioqOdm6Gmp6aoraOppZ6kp6mkpaWhpaSsrKmmq6eioKSjpKenoaCgpaKmoIl7gH12eHxkeHlgYlJVX0hJSUtTVElSUEw5PkI2Nz02NTs6PDw5Ozs4Ojw9Ojs4NjU3OjY5Pj0+PDk5PTk9PTw+PTs7PDo+PTw/Pz9APT03Oj5AQEA/Pzg2NT08PkFCRkBAR6CupKaroaOqrK6tp6ypqKCipp6bm56aoJyalZmfn5uen56WlJOXk5OcnqSorq2sq6uvqq+pnpeepZ2epaakoaKfpqCir6usrbWytqavs6upqrSxsbC4raehnJ2alJeampCOkZWRjI6OlJminJejmZqXmJmUmZiWnZufpaapoKajnqeurqumorGjmqSmpqqioaqiqaSosquxsqu5qKarp6urqaysp6Cgo7GusrC0qbGvopmcnZ6hmZubmpiZm5SWm5aYnKShoJqjoZqdmZ+kop6gn6KmnZulpqWkpaijp6OepqOinqaloqWlqKykpq2noJ2dn56gpaGenqWgppmBe4F8dXZzaIJsZVtTWllNUUpOTlVMUkxBNz1CNzg9NzY6PDw9Ojw5ODo7PDo7OTc2Oj01OTw7QD03ODs3PTs9PT06Ozw4Pj09QD5BPj4+ODg8P0BAPT43NTg9Pj1BQEZAQUihqqCrq6GkqquwramtqaelpaWkoKGfnqWXl5SYmZ6YnJ2blo+VmZKSnJihnaqip6Cep6Gln5ySnKKbn6Gjn52goKOgoq+vrK+xrLaorrGwqKaxrq2ssKefnqKgl5GUm6CcmZeSk5+coaSbnpuWn5qfl5uinqWhnqSfpKitraisqKSstLe2sKe0rKKtraOvpaSmoamorrWzsr23vrCssa6tqaq0sbCoq6iytbezuKyxtKSgnaWfrKGhoqCgmpiWlqCbm5ikoaCepKGfnpqcpaCfnZyhqJ+fp6meoaOkoKagnqehn5ymo5+ipaOooKmrpZ+dnZudmqainpyjnqeQgYJ/fHh1aXd1XWxaUmBIUVVIRlVWSkJMRz1LSDhFPDY3Oz49PDo8OTg6Ojs6PDk2Njo8Nzs+PT8+OTc9OT47PEA8OkA6OkA/O0A+QUA9PDk3Oj5APzo+NzU4PT0/QUBEQEJGnKueqamipamprqimqqWmp6aoqqGlpKOmkpOVmJacmpqcmpWTmZuNk56ZqJ2unqeenKGdnpqakpmenKGioKCdoqCfnp+pq6esqaq0rKusysCkq6iqrKqloJ6ZkpKTmJiWlpWMiIuOlZ2dnZ2elp6apqCgqKWxqqeuo6uttrC0srGutri9wLqttbSwt7CutKmmpKWsqbmztbvDvMPBtrq2q6+xube8r7OwtcG8t72zs7WirKKpqLKpq6inqJqZnpqqp5+ZpqCfn6eopaSenaqhop6bn6igpKetmZ+jnp6nnqCmnpycoqGbo6KhnZympaWkn6KZnJukn6CboJyjiYWEfnZxbWl2bWhtXFhbQlZNSkdNR0JGTTw+TD00PDk2Oj0/PDs6Ojg4PDk6Ozs8NTQ6PDg5Pj4/Pjg4Pzk8Oz0/Oz1BPTo/PjxAPj8+Pz08Njs/QT07Pzg1ODw8QERCREFCQ5WqoKapo6mqqKmjoamgpqinrK6lqaWpqpSSl5mUmpqanJiYmZyamJqqoLGit6Owpp+enZ2XmJWZnpuco5+fnaSem52cpaKko6KqsKymqNS0payvrqmrp5+enqGinZ6dmpyclJOVlJ6dmJSFnZqhm6ukq7KwubKysbKxur28vLm2uMO+v8K/trq6wMS5vbusr6exrbHCtrjCxsDIysDKv7C5ub25wr64s7vGw7zDvLezqbOtqrO0r7Ouqq6jnauntrGsoq+loKOvsa2wpKSvo6GgmqGnoaSqqpmdoJmao6CmqKGcnqKemaSenpiYo6OhpZ6mmZuipJ6fm5ubnIeFgXt0cmtrdXJwaFdbUUVUSERJT0g+RUE0RUg5NTs9Njs8Pjw8Ojo4OTw4OTs4Ojo4Ozw3Oz49Pj02OEA5Ozs9QDw9QDk3PD07Pj0+PUI+Pjc6QUA+PD45NTg9Oz1DQEFDQkGRqqGlqqelqqimn6KnnKasp7Gyq62jqayVkpWalJecoqGbnqCinJ+psqu7sr+rr6ylnqChnZyYm5+gm6Cfn5eknZWbm5+bnpyfpaaloKPItLKup6Sko6CepaulnpeclJGZnZiUjIqGiIZ5bYigpKKrrLS8tsO+vrO7wcPCxcC/wsbGxcPIwsDFyM3QyMvDsre1vrK+xbu+zM3FzMzM0se+v8DDvsfGwrfDycnCwMW+ubS5urS7t7C1sqq6sa67t766uqq3rauquLq0vK6uuaOmo56mpaKjqaaZm5+Ymp2nqqegoaGkmJSjlpSakZydn6Sep5+en6KdmJmUmJSIhH16cmtkaG94amRaW0ZLTEVEU0xEQkU3Oj87NTQ5OTc5Pj87PDs7OD48Njo9OTw9OTw9Ojs9Pj4+NztBOj45PT45PT44Nzs6Ojs/Pz1CPj83OkFAPTw9ODY2PDo8QT9BQUE+kqugp66ooqulpKKipaGlqquwsq2upKmmlJWWmpaUm6SmnaGqp6KrrLy8v8PBs7K4p6Ghq6qinZ6hop6cm6CSoJ+SmZ+ZkpqYn5mPiaKxs6igmp2cn56al5iXkoyPlpeTjo2Qi4KDgndzcW5wj6atrrS5xbvNx8u/wszOzczHydHMzczHycXGzNDS1c7Tyb3Av8O7xsXIxdLTzNPQ09PMysLFxsfKx86/yNHMx8XGxMG7w8C+vr61vbOtv7/CwsbEx8SuvriyuLzEwcG6vLy1rqenraigoqmlmpagmpmdqKupo6SknpePm4uQmYmVmJugn6OdnZeempOTi5WPhYB5dHNlYmdyb2ZeWllDTkxDRVBJRENANTU1ODpCPTY4OkE+Ozs+PDk+PTc6PTk6PDg8PDw7Pz8+PD0+Qzw7OkA9Ojs6Ojg4ODk7QT48QD8+ODtBQTs7Pjc4Njo8PkI+Q0FAPpOvn6ivpqiro6KloKampKuoq62qrqKqo5Kcl5ebmJujrJ2frqalsarFxszOzb+wwailqKytqqGdo5+cnZqpk5qgmr6jko6WjIKLmqmwqqOfnaCbmJeUk5SWkZCPjIeEg4iHg4CBgYB5cnJvbHmktrq5vsvB09LTyM3O0dPR0tHQ0dHNzs7Qxc7U1djS183Gx8nMw8XKz8rS19HX0tTV09PIzMfNzcnSzM7TzMXHycrBxcvGyMjFvsKys8jEy8rKzsXKv76/vMHHxMzMyMm/w7+tr7OonqKqo5qTnpyYnqaprKSlppaXipWFkZSHkpKSmZualpiQm5WQjIaRi396cnV2Z2NndmlkVldRRE1GQElRQj1CPDoyMkA8RDw3OTxCPTs9Pzs7Pj05Oj48Oz44Ojk5Oj86Pj1APkA8Pjs+Ozk9PTw5Njo6Pj08PEA/Pjk6QEE6OT44Ojo6Oz4+PEE/QT6QrKKiqaanqKSfop2qqKOso6OnpqyiqZ+To5iWn56dpK6bn7CrqKyxyc3U18/Gu8esrbS4rK6jn6Sjn6CkrJuWp6/LrIyNkYuZr6+mnZ2doaWhnpuVlJaUin13cGtlYmhxb3F7hYqAdnBucXRwhbPCvsXR0NfW1tLWzdTW19TT0dPU1NLP0cPQ09bY1dbSy8nO0cvGzdHJ0tXW2dXX09bYztLKz9HMztDM0s+/x8bKw8zMy87PxcbHtsDKv9HMy8/Fyce/w8PIzszP0M/NysjOuLe7qJ+lq6eemJ6jnp2qpa2pqKiSlYiQhIyRho2MiJOVmZCWjJiSj4aHjIR8eHN2cGNgZXJiXVJcSUpGQUVIST47QDg9NDU4NTs4Njo8QD07Pjw7OUA7OTo8Ozs8Nz09Ozo+Oz08Pjw/Ojo8Ozs5Oz89OTU7PD48PD0/Pz46O0BCOzk/OTg7PT0+PzxBQEQ8hqugnKegp6Oim6CbqaSlqaCfoaGmn6ifmKSimqmmoqarmqOwsamotdDU19rSx8bLtLXCxbG2qKKlpqGiq7Wnmq/ExqWGhqCvrJyVmKCcm6Gin5ydmpWKd2ljYF9fX19eX2BeYmx1c3Fwb2xycXWSxMfG1NXW19fT1s/V1NrU1M7P1dTU0dHM0M7T19bT1dDP0tPRydPRx9DY19jR2NLX2dXWzM/Pyc3Ry87Pv8XCx8XOzdHQ0cjLzMDKy8XTzsvOyMTJxsbIzMrT09HVz9LM0sG5xbGlqLWup5qorKWdsqiws6ysk4+TjoiLjoOPi4SQjpmNk4+Zj4+ChYx7enFzdG1hY2ltX1ZQX0pKQkZDUU0/PD41NDo9NTI4NTU8PEA8Ozw6OTpAOjg7Oj46PTg+Ojo8QD08OTs9Pzk6Pz07PTw9PTo2PD0/QD08PT0+OjxAQjs5PDc0Oj48Pz89RkFEPYKknKClnaWlo5mcnaSeo6OfnZ+doJqnnpyhqZ+vrqqqq52mrrioq7fX1NXZ2dHO0MC8zMm3v6+nq6mjpLG1sqO3y7ublKqroZiWmJqbnaCemZyek35xZWNiX19hX19hYF9gYF9gZm1wcG5rb3J3d5vMwNLV09jY1tnR0tLXz9POy9LN1dTSys/M09bS0dbNz9XV0cbR1MrQ1NXWztLQ2NjY18vIzcPIzszKy7/Jv8fIzc7Py9DNzsvOzsfKz9DKzsrCycbJzMrL0dLM09HRz9DKvci5sK67uLWqtrCtqLits7+7sZqPn5SRjo2IjpCFkY2ZjJGRlY6RgIWIeXZvcG5rYWRucGFXXFpJRkZETVdFO0A8MzM8PTg3ODU1Oz5APTk8PDg8Pjk8QDtAOj04Pjk4Oj88PTg7PkI6Oj08OkE9PTw6Nj08P0A9PDs9Pjg7QEE9Ojw4ODs+PD4+OkVCRT6Bn5mlp6Cfo6eam5+cl56eoZqdmpyappufpKeeuLa1ta2lra6+tLDA2NLX2tzWz83LxNPQwsGxqq2uq6Wysbiqu86vo56clpOXnJ6fn52Ul5iUiWteXl5hZGJgYGFhYGBhXl9fXl1ibXJvb3N0dnZ5pL7L1dHW1NPY1s7O1MvNzsXOytLSz8bOzc3UzM7TzcrX1dDM0dTLzNDR08rO0dXS1dXKwMnBxczCyMnCzMPFyMrKzsrNzNDN08vFyM/MyMfKxMbAxcrLzc/RxtDOzc3Mz8XHwLe4vcPDvcO5s7K+sbvDxLWqmKWimZaRlZWSi5SNmpGUlI+PlIKJhXhwcWttZ2BgcWhYWGhWTEZMSVBQQjtEPjs2Nzo4OTo1Nz09QTs6PD05PD05PT06Pjo8ODs9OTtAPD47Pj5BPDk9Pj1CPTs3NzU/PDw/PDw7PDw4O0FAPDo8OTs7Ozw9QTpFQUU+hJ6bqK2epKSqnJ6fmJKXm5+am56ZmaKVoamppcXDwb+7tbKxx8K4y9XW2drb2MzNz8jW1cXDt7G1qqOtrLi5r7/KoZeOjZiVkJOSkZaWlpCMfGZiYmJgXV5hY2JgX2BgYWFgX11bXWdycXFyc3FtcnmkxtPPy9DP1NXJxcnJxsa/w8bPzsfFx83K0sjLzs3G0dLPzszUysfLzs/Hx8/Sy9DPxbrEvsbJvcLHyc7EwcfAx83Hw8vKy8/Hw8PQyMbBxcfEvsDHy8vLzsLKy8jHzNDExce7x8PIyMLPwb28v7DByce5vaqwsqelnaKcmJCbkKOZl5mRlZiJj4J3bnRka2BeZnFhW1dgR0hIR0lNVEc/Sj02NDM1NT08NDg9PT06Oz08OTo7OT89OTw7PDg6PDo6QD1APD09Pjw6Qz48Pz04ODk6QD4/Pjw7Ozs7ODo+Pzw7Ojc5PD49Oz49RkFDPYOgm6qupa6qq5qdoJeUjpedmpmgmpqcm6WysazJzcrIxL69us3Nx9DV1dna29jQys/Q0tTJxLm9vq+nt6q9uLfDrJKOjpePhoOEhIJ+hYV/dGBcXl5eYF5gY2RjX11dXl9gYF9bWlxha3Jyb29rbG9vfbjRyMnKz8vNxLrAw7u7urq+yMbCw8DDx8rJyMrIwcXMxsjLzcnEwsvJwcLL0MTLyL+5wbvFx72/xs/Lw7/Du8nGyLvIxsTKwL3By8bFxL7FvLy/w8TLxcS8wMnCxcfSxMDIv8rJxsfG0MPDxsOvxMvHw8q3v7y6tKmspKWYn5iso6GlmqOgm5R7dnN0ZmlaYW5tWltYUURMRkJHRExERlNANTQzMzQ/PDM6PDw7OTw8PDg7PTtBPTo8Ojs3Oz05Oz07PTs6OD4+PEI+Oz88OTk7Pz07QD48Ozk5OTk6Oz06PDo2OTw+PDs+O0NCRD5/pZypsqm0rrCdnp6YnImUm5man6Kfmp2ov7i8y8/RzMfCw8fNz8/M1dDW2djZ0MzTzs/QysO3xsC1tbuwv7a4sJGMk5iHeoCFhoB2eHVycV9aW11gYGJkZGRlZGBcXF1dX15gW1laXGJvcm9raWxwb3OPxrzJxczAxsKwtrqysrOyscK8vLy6uMDBwcW+vbm9v7nEysXGwr3GwLi7xMm/wsm7t7u6xcO+vMHNw8a+vrXBvcO6vMa7wrmzvMXEwcK2v7W1vb+6y8O8tbrIur+9y8PBxcLFyMbIxtDGwszHssfJw87NwcXDwL2yt7Cyp6ioubClrbCrrayUeXZ3amRnYGhvY1ZeWUpFSkZISkFFQkVJQDk6NjQ4ODUzOzo7PDk8PDs5Ozk6QD46Ojw6Nzo7Nzo7Oz88OjxAPUA/PT8/Oz07O0A8Pj4+Ojk5ODk3ODo8PDw7OTo8Pjs7PjpAQEU+fqygrLWqt7SyoZ6fl5qNlJaan52mop2et8bCxMjO0svKysfNzs/SydHG1tTW2M7M0MfMyMrEvcnBsbS5trm0rpGNiouFeYCGhoB+hHx0dWRcXF1eYGBiY2FiZWViXV1bXF5cXl1aW11daHNxbWdnbnByeZ29zMDDusG4rrCwp6qtrKe4tLe0srO0urW9sbewta+yu8K8wcS8v7q1s7q+wLjHubS7tsDCvLi9xsHDu7Wusra6vrTEt7u1q7i9vb+9sLq2r7a6ssW8tq67v7S2tMW9vsPFwMPFxsjLxcDGxrvIy7/PysfDxsLDtsO9vba5vse/rLW6tbe2jnh0eGZnZWJrbl5WXmBGS0hISkZCREFFRT88OjU2NTYzMzs6Oz06Ozs6Oz44PEE9PDo7ODc5OTk7PDo+Ozk+Pz1APz5CQD1AOjo+Oz89PTk6Ojo4NTY7PT48PDo7OT49OT86PEBAPIi3pauzsby8sa2foJmUlJiXnqujr6qnpMbLzsjGyc7M0MzOyMvJy8rLxdHO09DPx8nFycTDv7zPvLK3u7i2tZuOh4mJe3l+hoZ3eIJ9dGheXV1dX2BfYGRhXmNlY19fXFteXF1eWltbXV9scG5oZmpubnJ8pMe/uLi1sKusp56iqqeeq6yzramrqbSttrCyqa6mrLK8urbDubq6sau1ubu0wrqwv7G9vLu2vMe5wratqqiwsb+1t7yvsKexs7S7vKuttaWutq66sbCquLCtu667uLu/v725wr/Hw8XBvMbByMu4xcfFv8bDw7nExsK7xsnMy7O5wry6sohydnZraWFibGhZV1dbQUxLTElFQUM/RkE6OTo5OTU4NTQ6Ojk7PD07Ojs+ODtAPD05Ojc5Pjk7PDo4Ozs6Pj45QT0/QD87Pjo7PDo9PDw4OTg5NzY4PDw9Ozw6Ojs+PTs/Ozs+QDyKwKuouLe5w62zqZ2ZlJaZoZymsLWxt6bGztLLw8bCxdDHzsLEx8DGxsTEy8LKy8LDwMa/ubu6ybazuru0s6qRiY+QfHl+ioZ6e4WBd29eXVxdXV9gXl9kY2JjY2JgX11bW1paXVpaWlpcZG5vaGZnaWtucoGtubC1rqalp6eaoKSgmpylq66jp6KrqqyqsKSmn6qttbaxvbmvt6+orre0tLy4tLyvuLm0sbzBscCupaiiq7Gys6e8qquoq6yttLOlqK2hpK6psqWnqK2lqLessLK3ubq7sbu9vr7Ev7XBwMfIt7/AxLfEwr+7v8TCvsTIzMq/vsPAwKmGcnRyamldYW9kV1ZYUEhZUlNLRkZFPj5AOjc4OTc3NjQzNzo5OTo8Ozs8PDc7PTs7Ozw4OT44PTs8Njo9Oz89N0E+P0A/Ojw8Oj05Ojs6Nzc3ODg3OTw7PDs5Ozo8OTc5Pjw+P0E7jMKvrry3usSwtrCbmZWcmKqpsLGztb2vxdHQzcTIurrMwszAvMq4v8XAu8u5wsXEubvCvLi2vMS3tLe5rLCVg4mNgXx+gH54dH98c3dmX11cXV5fYF5fY2NhYmBgX15dXFpYWltbWVhaXF9ma2ZlZ2Voa29yhaqlrKagnKGllJ2km5iSoaOqo6KfpaWnpayfnZukpqyyr7a3p7Csp6q0qrS6sba1rba5sa+6ubG3pJ+kn6axp6uouaqkp6iop7KtoKemn5ukpayen6ekn6Cxra2ssrSytLC1vLa7wcGyur7DwbK5usKzwL2/tbi7vb68wsfEwsO/v8Sgg3dwa2FmX2tvYFVZXkhOZ09UR0VKRjw9QD06Ozs4MjU1MzY5OTk7OTo6PDo3PD88PDs8ODg8OTw6Ozc4Ojo8OTg+Oj89OTg8Ojs9Ojc2NzY3ODg2NjY7Ojo7OTo7PDg1OTw6Pj5AO43ItbW9uLrBu721oJ6UnaGmurars7O7s8TQycvDx7m4ycLNwLnLubzHu7XHurXCxbG8xLq1rre+uq+xtK2hhIeHgn16dnRvbWtqanFpXmBdXFxcXmBfYWNiYGBgYF1cW1xcWFlYWFhWWFteX2RjYmVnZ2dqbW+Inamgl5WaoZabopiWjZ6hoqabn5+jpaGnnpuim5+qsK2xtaKpqqmrq6S0ua23sKyyta6yta6wqp+dnqOisqSmqbitoqamn6isqpmfoJ6ZnZ+lmpqjnJudr6mrp6qrrK2wsrivuLm7sLa7u7qrsrK5sr20trGxtbS/tr3AvcPBuru9l4N6cmtfZV5kZFhUWF1JV1xLUEdJSUZBPD8/QDs/PDA0NTM1Ojs5Ozg5OTw8Nz4/Oz07Ozg4PDg5ODw3ODo7Ozo7Pzo9Ozc4PDo9PDc0Nzc2NzU3NDY2Ozc5Ojs6ODo5ODo7OTo8PzuJyba4vru3wcHBtKSkmZqkpsCyr7astLfG0MjJwce8vMXEz7+7ybq6wbq0xLezwMCywMK7q6izuLWmr7CmioaIgHlzbnBua2JeYmZmXF1eXV1dXF1fYGFiY2NiYV9cW1taWllYWFdXV1hYWFpeYmRkZWZmaGlrco2onZSUlJuYm6GWlpGcoaKonZudpaahpZygoJqYra6trrKgpaKtq6ahtLCxsayor7KnurOmtqGinpujoa2joam1qqKjpp2lpqOWmJ6XmZqdn5qXnZycnKyhq6ajpKatq7OzqrSwsqqyubSvqa+ysrK3s66prK6yuLC6trm9v7eysZSFeXVlXmVeW1lWU1pVS1tRTElFSEtJQj0/QUFAQToyNDUyNDk5ODk7OTo9PDY9Pzs8Pjs3Ozs3Nzc+Njo+Ozo4Oj07PD06Ozw6PTs4Nzk3NDY1NTQ2Nzg1Ojo4Ojk5PDg3Ojg5PkA6gci9t72/tr68v7KdpaOYpbHCtba9rbS4ws3Ix8HGuMLByM+4wsa/tby8tsK5tb2/tLm9uaikr7mvpa+smX2EhYB5cHJ0cWhlZGhlY1xcW1tdXVxbXmBhXl9fYF5cW1pcWllYVldXVlhYWFhWV2FkZWNkZWRkaGp2opyUlI+Ulpefl5mUmJ+eoZyWoaGoo5+eqZyamqqmr7Crm6Ojt6qgn66otqmmp62wo7ewpLefopuYmKqmoZqsuLCioaScoqCgk5WhlJWWm5iXlpeclZ+pnamjoZ2jqqqwrqi0q6qmrbKwpaqusrGvsK6vpqensq6xtK+8tLq3rqOUgXl1ZF5hVllXU1JUS01eTFBLR0dMTEU8QD48Qjw7NzY1MzQ5ODg5OTo5Pjo4Pj47PTw8Nz49Njc2PTc7PTs5Nzk7Ozw+OTk6Ozo4Njc2NTQ1MzEwNDU2Nzk6ODo5Ojo3Ojs5OT1AOnbAvLS5wrG+uL2unaeno6q7wL3Aua60uMLNycbDxL7HucnNtMPEw7C+v7i/wLm+v7i4u7Wlpa65pKafooiAfXlyam1ydHBoaGVkZ2JcXFpZWlxcXF1eXVxbXF5cW1xZW1taWFZXV1ZXWFdXV1VbY2NiYmNiY2RmaoGWk5WLkZSTm5mclpaboJyflaCfpqWkpqeenJ+ln6qvpp+io7aooKGiqLShpaekr6Wwray1nqCdlZSpoaKUrLGxnqKjnZ2Ym5OLoZSRk5eYkpeXmJadppumoaKZo6Wlq6SlsKelo6urraaorq+uq6iqqbOlpquvtLGuvLWxr6+gknp2cmRhXFpdWE5MUkhSYU1WUE9KTU9FQkQ/OT02OTo3NjQ1OTk7OTg4Nzs4OT0+Oz47PDY5Ojc7Njs3Ozs6ODU6Ozo7OzY8Ozg4NDY4NjMzMjEuLzI1NTY7Ojg7Nzg3Njw7Ojs7QTh4u7uxtb2wu7G4rJ6kp623u7zBxbqxubXFysvBxMfHyLfHxbTEwciuubrBu8G/wLy6tri0pKWvs5ufh5eIgHdvZGJnaWlmZ2lnam1gXVxbWlpaWlxdXFtcXl9cWllbWVlaW1dVWFdUVFdWU1RSVWBgX2BhX2BhY2RpgZOTiJCOlJKTnJSVlqOZoJacoKWhraWko6KjoZuqq6WZnqWxqaCgnaWrnqehnqytqaiuraKhopSXo5uckKuosJufop+el5mTip6RjZKTlZCYmJOboaKcpKChlaChpKabo6uloqSqpKuupa2xqaalpqa0pqmorbO1tLm6r6qsnotycG9gW1dWVVFGUU9IWlxPUklUS1NMRUdJQzg7Oz08ODY2Nzo5Ozo5NzY5Nzc6Ozo9PDw2Ozw4PjU5ODo4ODY1OTo7PDk3Pzw5Njc4NDUyMTIxLi4xNDI2Ojg2OTg1OTg5ODk7OUA5e7W0rbS7srCssq2dp6evubmzwMi6tcCvxsnNu8LLzci3y7+zwMbLr7S8xrrAxcK8vbW4s6OorqyaloSNg3x1ampqbGhqbG1ram1lXVxcW1tcWlhaXVtbXmBgXFhYWllYV1hXVFZWVVRVVVJTT1FZXVxdXV5eX19iZG2Oj4SRhpCRjpmTlJKcmqKcm6CnqKqoqqaopaOYpK6klJmlr6mfm5mboJ6vmZuqs5+lpp+jo6GUk5uWlpKoqq2anJ+hoJqUkIyZjouQjJKMlpSQnqGgo5ybopWboKKgmKKoo6Koq6Crr6Stt6WjpKKsraqoq66yt7K9tbOrr5iDc3NoW1hYUlVSRVhMUVtZTVVOUExQUUlOSUI8Pz9BPzw2NTc5OTw8OTg3Ojc5Ojs8PT47Nzs7Oj02Nzo7ODk3Njk4OTo2Oj05OTU3NzU3MTE0MS0rLzQzNDk4ODo6ODo6NzQ4PTg/OX6zrqiztq6pqK+tm6morLe2rLzKu7a/rMzHxrnCz9DItca9ub7Fy7Svu8O7wcPCvL+xtq2kqKypm5ODgXd4b25pbm5ucGhnaWdkXVpbW1tbXFtZWltcXF5fX1xYWFlYV1hXVlVUU1VWVVVUU05QUVlaWlpdXFxeX2Bkfo2Bi36MkIqSjZeRl5mioJufqqmmrqqnr6OnmZ+soJWWpKinnZeQj5qerpaXp6qZn5yUpaGekpCTkpOVp6ulmpmZnZ2WjYyMlIaIjYOQi5KUkKCeoKOXlZ+VmqCinZObpaWnqKigsbCmsLynn6OstKqup7C0sLm1wLGtsauQfXFyYlZUVk5SSUdWUVJSTExYTUpMTlJHTUtBQ0ZEQz5ANzU4ODk7OTo3Ojo3PD06O0A+Ojk7OTo/NzU5Ojk4NzY5NTg3Nzk7ODU1NzY2NjEzMjAtKi4xMDI4Nzc7OTk7ODk0ODs4QDh/s62msbeqpqKwq52qp6mysaS2xrS5urPLxrq7wsvRzLO4ur7AxMa1s7a8sbm6wry/r7GrrqutqJmehWtnbW5yb3FrcGtkZmdlXlpZWllaWlpbWlpaXFxdXFpYWFhZWVdYV1VVVFJTVVNWVVJOTk5SV1hZWVlZXFxdYWqAen92iY2HkIqYiZSUl5uZnaian6mlpKqdp5igpZuSj56impeWhYSSmqOPk6KclZaVh6KampOLjouQmaSonJWVl5uQkoeUjoyBi42AkIqSkpGhmp+ilZSYmJWipZmMmKSmqKahoLSyp7K3oZ2it6ypraSysqa1u7Wrq7GjiHhxbF1OUFFMT0NNTk5QS0ZOTkpKTk1RSU1KQUdLSEdDPTg1ODg4OTo7Njk6Njg7OTk+PDg6Pjk7Pzg3ODk6ODg2ODU3Njg4OTc0NTc3ODIwMzAxKyktLzEyNzc2Ojk5OTk4NDk4OEE3d7anpLawpKejqaWgqaWks6qissO1tbKzx8a4u8TKzce1r7u/t7rDsrGttaGrtMG4uayoqbGsrJyTo3teYGdzcXZxam5pZWhoal9YWFhYWFlZWVpaWVtbXFxZWFhXWVlYVVZSU1JQUVRRU1VRTU1LTFNXV1ZYWFlYW11hb3N2cYWIgoiAkYOOipSRk52gj5qboqGjmKSWoZuVjYeYmoxzjYJ9jZeWhZCZkJOOjnuZjpyMgop/ipifop6Qk5iWhI6Ck35+dImOepCGkpCQnZqZmpCVkJ2OoqOOiZqgoaOjm6K0r6yvrJ+ZpbimpbChsK6csLuqqa+qmYF2cmJVTVJPUE1DU05MUU1CUFFISU5TTUhKSkNKTEZLSjw3NDk4ODg7OzY5Ozc6PDk6Ojs3OT85PkA3OTo8ODk3NjQ0NDU4NzQzMTI1ODUvMDEwMikoLC0xMTc2NDc4OTo6NjU6ODdBN3e3oqO0qKWmqKOmpaamprOnpbTBuK+0sMrFuLrBz8a/tK68w66wxrCspqqUoqy9tq6unaWqqqiTkZ5wV1dgaGdpaGluY2ppZ2JcWFdYWFhZWVlZWVlaW1tbWVlZVldXV1NUUE5QTk9PUFNUUk1NSkhOU1NTVFVVV1lbXWlscm1/hXx0Tlhyj4KXho2cl4uTkJ+XnZWUlpSOlol/k4lfO1dve4uUiYCLkoyPhYZzioSWgXmCeoWTnZSDlo6Qj4OGfZJ4cm+FjX6JgJCNj5eZmJOKj4mch56Xh4iWnpqhoJenr6mtqKeel62zoqatmKyrmKe0oqmto5J9cm1fW05TUlZMRFRKUE1MRk5PSUVMUU1LT0pJTVBGSUk8NzU5OTk5OTo3Ojs6Pj44Oj09Njo/OD4/NTg5Ozc5Njc1MzMzNzYwLi0vMzQ0MTEwLy8oKSsrLTM4NTQ3Nzk8Ojc5Ozg2QTl5t6CjraGmpqqgp6mnoqmwqKe0wbmwtbDIw7i0vs/AurCwt8SprcispqGchZmguKulppSjoqGflIyTZ1FNUlZaWlddXmJnY19ZV1dXWFhYWVpZWFlYWVpaWllYWFZXV1VTUk5MS0hHYlxNT1JNS0hGSE5RUU1QUlRWWFpgbW9pe4J0UEJBf5WRkX2JlIyEio2ajZWVipKIhZWGeIh/YEpRbniKkYR9hI2JhX9/bn5/lHd1dXeEjZlwUY2Iiod8fniTdmh3hYh+ioiVio2QkZaLhIqIlISajIGEkpuWnpyUpKOoqaWjnpuwqqGkpJClqpahqZyipqiIdGxlXltIUVFSTUlVTVNJTEtPSUhGS05MTVRLUVFPRkhCPDc2OTo4Ojs7ODo7OD4/OTk+PTg7PDY7OzQ3ODs2Nzc1MzQ0Njk2LzMvLjEyNTIyMS8sJykrKiw0ODMzOTc5Ojk5Ojo6Oj85d7aboqedn6Guoaeopaeor62qtry2uLezwry3qLrJubaoqba3rLW/qqGakYKOmK+eoJeLnZSWko+IimNNTE5OT0xNUVdbXFpYWlVVVlZWV1lZWFhZWFhZWVlaWFhWVldVU1BNSkVAQJtrc3NJTUtERERJTk9oWU5RU1RVWm6DdHd+amldVY+JlIl0f4eBfIWMkoGSmYuPe4aPgHV/eHNudXB0jY2BeX2KqoV5emh2e45wcm14gYqMknh6gHuAdnNykndndYSEhIR6lYmIioyKgH+Ei4x/lIN7gI+YlZyVkZ+dqZ6foJ2gqaWfnZiMp6SToJ+Wnp6kf3FnYFxcSlZPUkdLWFJPSk1NUkpKSk1QSExRTFJUTUVIQTw3Nzs5OT49Ojs8OThAPzo6Pj03PT03OTkzNzc5NTY3NTI1MjU3Mi8yLiwvLzIwMC8tKygoKS4xMjcyMTk4Nzk4Nzc1Ojw7N3aumKOhmJyftKmvqaWtrLCxqr20sru4tru1sqC3u7OrnZ6tqqu0sqSdlZGXhJKilZuKgZWHjYiEhYFkS0lJSEdGSEhQVFRUV1dTVFVVVVZXV1dYWFhYWFhYWVlXV1VWVVNQS0Y+OTNOPH6eTUhKREA9QURqlH5MT1FSU1ZedYN9eWd3jZeYjo99Z3mBdniAiY98hJiSgXKHj3x2e29rfq18c5CKf3uGkoF9f3RmdnyFbG9oc3yJjIeAbHlxfXBtdY9xaHGAfY5wQ4qEgoOFfnd3eouFfYt6dX6Oko+YipKam6OWmZ2anZ6inZaNiqWbj56XjpaYj3ZtbGViWldXVFFKU1VUT1BOUVZLTktOT0pRTkhOT0tGRDw7Nzk7Ojo/PTk8Ojk5Pz87ODw9Nzw5OTk5MjY2ODU2NjMzNjIxMjI0LiwsLS4uLTAtKyonJyouMTM2Mi84NzY5NjY1Mjc5OTV5ppefn5agpq+srquoqbGvsau8uKy7vrmzraibsaetnJCWnaerpqOanJKHlH2NlJGTf3qIeIOAfX5/ZEpGR0ZBQENESUxMTVFSUFFTVVRUVVZXV1dYV1hZWVlZWVlWVlRTUUtENzhmNzA/qGlOSEM9OzpEioV6WkpOUFFUWF5lcHJtiKeqwH51eWJ7eG58eYiQeXyLhW9tjJF4c3hqaoCCcpaRi4F9loBJkphuaHh+gWxpY2x5hZCShmtzbHxucnuGaG1wfnONiISFen1+e3ZvdHOFgnmBd3B8joyKk4OWl5iakJOVlpmXnpeMg4mfkYqSjYaQln5taG1ubldVV1RSUVlPUlVVU1hVTU5ITkpNTktDSE5HRUA6ODk7OTk6Pjw5PDs6Oj0+Ojg6Ozk/ODY4NzI3NTc1NTQxNDQyLzAyNCorKiotListKigqKCcsLTEyNTAsNTU2NzQ4NUhBODk1d5mRm5manqWtsKKsqqi1r66stL+rvMK/pqKalaWYno6FjJaio5mak5aOdZB9hIqQjnx3fXN8d3R3e2ZORUdEQDw+PkFGRkdLS0tNUFJSUlRUVFRWVldXWFlaWVlaV1ZUU1BMRTFAmjMganNDmW87PDk1PICChl9JTU9PUldaUllcYKeIYpppdHplfnBtf3qLiXaBiIZ0bJqRdHN7amudj015hZKJhI5nMXaGc2x+fYN0ZmV0foSDhYBmaWx1a3B/fGdwcHtuko2Oe3N9fHFwbnVtgn53eXRpeYmCiImDlpOSkIuNkZSUj5eOgHmIl4iGiYaAkId1aWluZ2RXUVpXWVlbTVBVVllZTklIRUpKSEdCQUZEQ0c9OTk4Ozk6OTw6OTs6OjpAPDk6PDk4Pjc4NzcxNTI0NDUzMzY0NTAzMS4qKispLCwrKykoKycpLCwyMjYsKzU3NzU0NzhpTzg7NW6SiJmRmpakqK6esp+muq6rsrDCsbvDx5uWj5WZi42GeoWRmZWPkY2SiXOIhHeKj4x/dnd1d3ZveHNpVEZJRD88Ozk6P0BBRERFR0pMT1FRUVFSU1RVVlZYWlpZWFZVVFNQS0U4MC9cYLNHOVhQOzk0NDGWuotITE1PUFFWTEFJUUlir7OgcXx4bX1scoOBhYF6hIaGeXKglXR4gHN1lIc1cZ2onY6hoYSihHZwhnyGfHOMrY2IgGhmYmlucm1wg3Vpb1h1b46aknZsf3t8bXFtcH96c3ZtYnaEf4aAhZCRiouKkouRjIuPg3V4i4+AfoOBfo95cG9ual5aXF1bWVhgX1NOW1pZWExISkVKRz9DQUJHPkNEPTs5Nz07Ojs7OTo5OTs6Pzw4OD06ODs2NjY1MTEyMTM1MzQ3NTUzMS4vLCwrKSopKSoqKikoKikrLzNETTIxNjY2NDM8dlI3PTdikoGSiJaRnaSnnq+VpbWprbGuwbK7wcaXkIyUkIGJfW6CkZKJhIuIkId2g4Vul4qMf3l6e3F7dHxrb15KUEc+QDc0NDg7Ozw9PkBCRUlMTExNTlBRUlVVVldYWVhWVVRTUExFPDUqnUtbQC1nSTk0Lz+Sg6muX0dMTU5QTDdDTVJTREqGdoB8fHZ+bXeIiHx9hYN/jH52opl5foaBhJmEm5xhhqqfnYqCkI16doh+iYiNc4qXj4N7XGRxdHp7d4psZ2lheG+Fj4J6boF3dIR6cHN5d2tuaV13h32HfIiHj4CLk5eDjYWNh31xhH+EfHV3e32JdW5xcmVmX1taXVNbZl5XUVVYXFZHSktETEc/RkBEQz5BQT06OTc8Ozs9PDo6OTk7Oz0+Nzk+OTk4Njc1NDI0NDAwNDY0NTY1NC0sKSsoJycnJigoKSkoKCsrKy8wMFVxPDIzMzMxRX5XND05XIx4ioCUjJGdnZ+mkaCroLGor8CxusW6lo6RlIh6hXZrgIySg36LhJCOeYOCdKKGjX9/goFzg4F9bHpsU1dMQEUyMTEyNjc2ODg6PD9CRUdGR0pLTU9QUVNUVVdWVlZUU1BNRkA6Mj0gI5ZjjFs1MzExaT9Hb0lGSUxNT1JMS1RdWVJKaYSIe4l5fHF8j4x6fImGfpeHdqGZiIePkpSljaypSIaur6+LgYCTioKLgYSRqIeAmJiKnHNsfIGGh32OaGdneH5uhYaChXGEhUdrgHdxeXZobWtfdn2DiH+IhYx6lZ6ciouIkX97dYt2fHdtb3d+f3JxcGpaXFxbY2NYZ2VcVVBQV1lQRExMRk9JQ0ZDQ0FAQ0E9OTc4Ojo6Ozs6ODg4Ojo/PjY7Pjc1ODU3NzMzNDQyMzY2NTY3Njg7REZMTU1MQzcrIiUnKykrKywvMDArbnUyMjQyMEyBXDU9PF6EdHx+ioWIkY+WmJKXoJ2soaa4r7O9s5eNkouYi310cH+Jk399jIOTlX2Gf4eliImBg4iGeYiLf3WGeV9jVktCNjAuLzIzMTIzNjY4Oj0/P0JFR0hKTE5RU1RVVFRWVVNRT0dDPzgwLCOHWz4/ODQuXZZwc6NVRklLTU5QV2BZcFpcXmqNk4eVgYSChZGTfoWJkYGalYKhoZeVm5qlrZOau7Gnu8fDqIuMoaWOk4mBkHtyg52fkZx+doWFio+HkGlob4OAdIyGhItxhoJ3h4B7doV9bnZ1Z4CUj4aJiIeIh6GropaJjph/e4KJenpvZ2t4fXh8cWljXVpZXWlcYGZfWk9MTlhSUUlQS0ROR0NLRENBRERBPDo4Nz08Ojw6ODg3Nzg6PT04PD02ODY1NjYyMzQ0NDU3Njg2NzxCQj88ODo+Q1FeZVxHMicmLCwtLS4xKD+MWy4zMTBPg180PztudXBneIN7gIyAgZCPi5qapJyhrKarr7CXkZGEoZSEeHeAjJR9f5KGk5Z/ioCSm46EgYKMi4KKjoSAioBscGpdQ0E0LS0vLy4vMDIyMzQ3Nzk7PT9CREhKT1FSU1JTVFRSUE9IREI8ODcvOUQ+PDw2My5sk5dNUEhJS0tLTlZgY39nZ211nZuPmpOTi42OmoiTj52LoKCSo6qlo6yTqLaiqMHDrseveLqUmnyMoZ6YhJKFgo+hn5OYkoSKhY+YkZZscHWJi4GVjI2Pdo+EcWyFgYqWkoOFiHKJoZaGk4qPj5altambjZWig4eThH5/a2prfH5+gHFfXGJeWWZqXGtrXlhLSE9TUU5NTEZJUERETkZCQ0VHQj45OTc9PDo7Ojk4Nzc2Nzs6Nj06Nzg1NDU2MzQ1NTY2NjY4NTU2MzEwLiosLCkoKS46UGFcQCwoLSsrMCwncog3MjQwT4RiM0A8dW5nWXCDcHWHcXaRhn6XlpqUn5+cp6CqlpOYnmdlpJp+hZOReYCRiZGSfYqFmZKRg4CAi42JhpGHhIiFeHh/Z01SPi8uLiwvLi0vMDAwMjEyNDU3Oz9DRk5QUlRQUVJTUU5QSUVEPjs8OkNGPz48NzUyPD9SNUhISExMTU5SXm+KfHOBfaCdm6imopmhl6KVnJ+onqmrn6isqaq1l6u/q7bIyLfJ0c++m6Bwaaupn4STkoWcoZqamaeRkYiVopqad3p+lJeRoZKWl4GUnnt2lZKrs4mNl6B9lJ6cjpOWmaSiprawnZGZqIiXkI6BiGxzc3t9em9mXltfXmBmY2BnZlxSRUtLUE9JSkxGRk1DR01GRkNCR0RBOjg1PDw4OTk5NzU2NTg+NzU9ODQ3NDU3NTQ1MzY5NTg6NjE2ODYzLzAuLSosLy4tJyMqO1hiQigqLDEtKEuXXjA2M1GFZjJBQGlhXlBxdWBufWF3jn18lI6Oip+Sl56WnKqYnqpCRH2HiYeYjXiCjYuOjXuKho+QjoKDgImMioWThYOGiIGAh3dfYlA0NjAtMS8sLjAwLi8uLjAwMTU+QUFNUVJTUFJTVVNOU0xFRUA8Pj1GR0FBQDg2NjI8OTtGSEdJSU1PUVlthpB3lYujp6q1vbilrqysp6i0rLG3srKtu7GzvpyzxKy7ycu4xL+4paOwsqytqqOLlpiFpqagopeCppmNoqqopIeFk6OgoKqgpKmOnLGLlaOnt7uboKOwk6Odo56RpKKrr62ztaKVpaqJmoqTipV6e36DfGVfZltkYF1iY15mZl9bT0RKSFRPRkhMRktHRUZIQUtGQ0ZGQTo4Nz08ODg6OTc0NjU4PDU0PDc2OjQ0NjQ0NzM5PDM4PDIwMjU1MS8xLi0qKi8sLSooKiYlNVhYLywwLCwwhIE4NzFQhWg1QUNbWFRMaWNYanBYeoV2gZSFiIKbg5KQjZPayJ2Wc1aXiI+InI98hoyPiop6iIKHkY6DhYCLhYWIkoaChImGh4eHcW5hQEU2NDwyLzExMC0sKy0xLy00P0RBTVVRUlRVVVdVTVtQR0dEPD4+RkhDREA3Ozw1Qzs9RktJR0hST1BXgZOghK6js6qywcjEq7PFtqyzwLO4vra/tMG2u7ukuMaptsnHtr65tKijtK2wsZuZkpqfiKevqqSUdp+kl6GrsbOYlqmtqK61u7K6rK+1orGssbW8t7WutaCnp6Oom6mwrbK6uLinnLepjaWPkpOghnmBgXNXYGJUZWBgYl9fZV9bVElERUxWUUlKSkRKSEVBQEBLREJNRjw4Njc7PDk3Ojk4NjU1NTcxMTw4ODk1NDY2NDk3Pj0zODkxLjAxMjExMzAsKiwuLCsrKyooJyopRVowMCovK2iSTzYwUodqNkFFV1FKTFtaUWJkV3p1cYGUfYSGk3aGfoCMe7+7o7yCtJSTjpuPhIiPk4mJeYeAjJOMh4WBjn+BiY+Gf4WIhYqHkXp5bl1WQEVOPDY6NDZBQjc2NC8vNkNIQ1FbT1FVV1VcV09fVUlLSkFAP0dLRkVDOz5AN0Q3P0JKSkVHV1RQXo+lraOxtMO2uMHMyra7xL2ztMG3uMK1v7C3dLG0prrFpLDGubGzsbSopLW2qrGgopabopGlsa2lraunpJigrLO6oqiyubW7vsy/xcW9vbPCt7q4v7e6t7mtrbGmsaqtvrC9u8LCrJm7qJWtj5iYqol+gHppVmFfV2ljaWRVW2NZVlRJSEdMUUdESUpBSEQ+P0JCS0BATUQ5OTY2OTo/Njo5OTY2MjQ2LzE5NTk5MzY0NjI3Oz0/NjoxLi81ODo5NjUwKigsLS0tLCwqKCgrKyhFUy8qMDBKj2s1MlCHbTY/RlFMQUxSV1RZVlp3anB/j4SBjoVuenJ4h2K4oZqjiZWUlpOUk42Ql5KHh3uHgY2VioCEgYp6fIuHhn2KgoGLhJV9eHp1ZU9cZEdFTDpRZGFbXlNGPjtIUERaZFFRWVhaZ1pUYGFNU09FQT9JSkhFRkFAQz1FNkI+SEdLTVNaVF6Ur7i1urnJwLu9ysy7vcC7uLW8vLe+tbqyxmB1sqWxmp6rvqqlqKuqpKKytaCrqJ6Vlp6Yn66lp6aln6SToqews6iysry2wb3TycnTxsLFzMLKw8C+vb+7vLe0sLm3t8O6xr7DybCeuqqirI+lqLaJgH1vXWBfXFVgXWhlUlhhVlJWSUVGTUtAPkhEPUtCPUJAPUY+O0hANzk2Mzc5PjQ4OTo1NzA0NS8yNjM4OTM3NDUyNj84QD5HS1JUVFJQT1FSUUpBOS8sLCwqKygoLC0sL1A+KC40OIB9PDJLiHE5PkNLRUBJTVBSTFFdZ21scZCNhZBzbHNyc4jVwLWZoI2VmZqRjpeRlpaOhod9h4ONlot/g3+DeHuLhId7i3mBioKXf3R9emxlcHZZXVxQZWViYGVkXVtYV1xNZG1VUm1uX29fWGdlVVlUSkRBS0tIRkhISEhCSTlEP0hLVFRWXVpck7nAub23xsC7ucrLu7e6tri5s7i1ta62tplkdamerXBeoq2cmKGim6Seq6WUn5+QlI+WmJeon6WfnpqZg6SdrKSqsK23sLy41NDO1s/JzNLMz87Kx8C/wsq9wb3CwMXExsq/yc+0pLuxtbCbrLm9mn13aVteWlhbX1hhYlFbYFNRS0NCRUZFPEBGPkJJQkBEPTpFPj1KPzQ3NTM1Oz00Njg5NzcwMjIvMjQxNjk3NzU1NTVEM0VMTT41MTAwMDY6NDc3QElPSjstJioqKC0uLyxATSsvNTRtiUkwSIl0Pz5CREBDREZLT0RSXFlpYG+XkpGUbmxvdHWHs6yhoZ+LmZyZjY2VkZuShYqKf4iHjJCMiXyBg3N7ioOFe4p0goqGlX9ze3lsbXV8aXNlaWxpZmppaWBmaWhtWm10l62kvIeHZ1tvaF1aWVRISk5QSktRTFRRSExBSkdLUF9fYmdqYpe3x7C5s7u+trHEx7awubGwu6yzsaert6yNtqeenKeaTpqejY6glpGnmKWVipOTiJGJj5GRnZuhmJuVloeemaaarK+or6ezs9PU1NbRy8/T1M7Tz8zGw8rQv8rJy8nSyM3Nw9HSuK/EvMS6pre7xKJ/bGFaW1xXX1dYZFlPXFdOUUNCSUVDSTtBRD5BSD8/Qjg7RD5AST00NjY1NTs6Njg3NjU0LzEwMTQ2Mjc4ODc1MzY3QzVCOD8tMCwxMzQ4PTk3LC4sMTtGTD0pLCguMDAwN0s/LTQ2VIhXMESHd0M7Qj5FQkFDSk0/VVlTZldzkJCZg2hxb3l5g6CqnqaXjZubmIuNlZGajn2JjIWOioqLkIh8hIJwf4eBhnuHcoORi49+cXl1bHB4f3J7bnhzbGmAcG1jaW1weWl3fX7Lv8Lfp21jeG9kW2FgSlBSVU5ZXlBdXU5QTlRRVVRcbm53g3KWrristKiwtqutvcGxq7WmpbmnrK6hrLSkj7Gum5iYjJGUkYSPm4GNp5GciYOLhIqJhIqDk5WYl5SbkZuYmZmenquspKehrKzO0tXRzczS09PQ1NHOyMPU0cjO0tPT1s3S0cXS1sbBz8jIw6m/uNCcd2xjW2BbVV5RXFpPT1RQTkg+QUdCQ0Y8QUI/RkU+QD86PT09PEpBNDU0NjU8ODg4NjY0NDEyLzAzNTI2NzY4NTMzOz08RT1AMTErLzM0OT81OTAxMDIyLTJFTzMpLzMuMzI9TjI0OEN9XzJBhnREOj09ST5AQ0ZIPFZSTU9bdYeGi3dtd3B9foChnp6hi42Zk5OMjJOQloV5hZCQjouKiJGHf4J7cn6Agod6hXaFk5GJgHB3c2xzfHx3fHOCeHFrgHJyaW9xenlze77Lmn6MsYN2coV3aGFqXUNaWltXZmRYZWtUWF1dYGNeY3h7f4uBmaqkpKKgoainqrG5q6a0o6KuoqSuoqexn4mmm5WTkYqSj4iClIlrlaKNmYSBhn6Rg4OTl62LlY2VmY6FkpCdl6ewoqCgpKSox83Px8HL0NPR1NLO083G1tPM1NjW1tjV19XJ1NrNytjW0cqtxMPMiXBtYF5dVlJXUVtPSkdKSUpAOzo7RUNEPENEPkhDP0NCOzs5PDlHQzQ2NTQ0PDU2ODc1NDMyNTAvMjU0Njc0NTU0NDw+PUU/QTYyLy0xNjs9MDgxLzI1NC8tLjtSMDE3LzUzMkVEMjg+bmI1PYF0TTk5QEk8QUQ/QTtQTEZLWXCAdX5pc3lygomBnZWelIWLlomOioiOiI+AeIOUmYuNiIiLiX6DeHN7fYOHd4B7h5GXgYRveHBtdX92eH10hnx5bId2dW59doR1eXudtYw8QYrGpX6NfGplV0lDZWNmY2hqZG95W19maGtuaW6AhIiRjJ6foJ6Rl5ifpKSmsqSls6CipZ6hqaCisZyHn5KSk5GLjouGg4+EfpycjI2ChIV6lH6CqpWjjJKKmJKLfZeKmpGrs5iam6ecp73Dxbm2xc3R0NHPy9LLydTO0dXa19fY1NnYzdjbzsna2tLWv8zNtHV0bGJbWFFTUFhVRUZKSUVFPTo3OkBBQjpHRUBFREJEQTs/Ozs3REM3NTY1NTswNjg5NDQzMzQxMDE0NTU4NzQ0NDQ5QD5EQkM8MzMuNkZUV09RSkFKRj8xKiguQlQyOTI1NC83Szc1PGBiQTxzdlY4N0FIOj9DPjw5UUVDSlRsbm9wYnFxc4aNfJeRnYt+h5KCiYaFioOIfXmFl5eJj4OHhod6hHlxenuEhnV6ho6NnXqMcH1vcHp/cnuAcYSHgG6OenV3fXyCdX98h4mwdFmqwreNkoFwbmM9XmhycHFwbnh3gmVpb3J1eHJ7i4eOk5KblqCWiIyTm6Cbn6qfoaycopqan6afn6yZjJqMkZKOhX2Ih4OFi46gmZOIg4d+bZl5hJmGiJOMjpWMhnubiJOPrqqUlZeemKautbyorb3Gy8jJy8vPycPSytTW2NfY19Tb19PZ29bP29rR1sjVzJN2eGZlWVhOUVJcR0JFSUk+QT49ODo9Pzs+SD1AQkFBREE+Pzo4N0RCNzU1NDc5LjU2NjQzNTUzMjMyMzY0NzU1MzQ1N0VCRENFQjU2PEZOU01bbmZjbnNrYFY+LDRMRzg2NTQzM0JGND1XX2hMdXheODs/Rjw8Qjw6OUQ/Q0dSa19tZGJma3aAiHGRkJuAeYCOfoOCgoV/hHx9hJiOh4t+hoeAd4J5bnt7hoJ0epKejaF2j3aDdHWBfXSAhG+CkIJvkoR1fIGFenaHfIm4xqXDyriClpyPeHBlTmVjgnqBd4aikIt5eXd7g398hHZtlJaUlY+YkYOJj5eal5emnJigl5+TkpejnZmrlpGRi46Sg4yFiYiBhpCRnpyZiYWLgYWXe4iJn5eQiY2Ki4J8oYiQi7yhmJOXmZyopaWtnqe1vsC/uMfJzc7FzcrR1tXU2dXX29TX2drb19va2djO3MaFeHZkZmJdUlZVVExLRE1EOz09PDk6PD45PkE3Pj9APUA+PDk4NjdDQTY0NTU9ODA2NjU1NDc3NDU2MTM4NTQ1NjQ1NTdISD1ESkU3OTI1O0g+Ozo6N0hQXFpSVVhLOVQ+Ozk1MzI3STg9TllNSHh4ZDU9PkM9PEA6Njo+PkBFUV9ZZmFdW2h0enlsiY2Sd3Z6inx+gH+AfYV7foKRioWGeoWIe3V9dW19fYZ+dH+SnZGfg5J8hn14j355i4pvg5uAdJmGfYKKhXx+kXuQqY6Qw6C9jJuknH6KhH2JcoyLf3OmmpyZlIV7j5GJhGlHcaGknYyLkJKFiIuRk5WPnZuTlJGXjYyVn52UoZSSjo6QjH6Qj46LhIiSlpqfn4mMlJGdkIKMf6aZiIWOg4WEgKSGiou4mJ2RlJahpqCdnZ2jrra6tKu/xcrQyMfMz9PS0tjS1dfA19jZ29ja2tnZ19u3d3Z1aGdjVF5ZUk9OSENMQz09Pjk5Ozo5OTw9NkA+Pj09OTo6OzM3REA4Mzc4PjcwNjg4MzU3PDM3ODA0OTc2NzU1NTQ2RlA1RE5JODkzOEFLPTszQ0BJPDlEV048TVRITj85NjMzMz5DO1tYPjVZeXBaPDxBPD0+ODU4OT88RFJTUlheVVhmbW1taYGOinFzeIp7e399gHyIe317i4eDfnWDhnpzenRtgX6EfXeGm6GbnpSSgIyHf5iHgJySboiphXqgi3yRjoOJhJx+mpGJjaOin5Ckr6CLkYuGi4GShldyrYufrJyPg5ickJCOW4OikYKNn5OVjIaIjJKTjJSVlZCMj4qIlpudj5WWkYuTlIaAi4mSjYqKnZeZo6KGk52VoIqKiI6ckIOIj4CDh4WkhYuQs5ickpSXoaGemZKbnaexuKykvMHHzcfGz8zPzM/Xz9HUrtbV2NrY2trX1tnZnW16cmRkWlpWUVVWQ0BJRD8/Pjo0OTo7Nzo7OjM8PD89Pjc7OToxOkc9OjI3PUA1MDY3NzI1NT82NTs1NTg1ODo1NzczNUhSN0dPSzk5ND1FSkI+MUZDTEE5ODpHWEA1SFdJNjYyMjM6RUNlWD8mX3lpX3o+Pjk8Ozk4OjtAO0JRS0tTWVBUY2J4bGJ+koNvbXeLeHp/e4F9hnx7doaFgHNwhYJ7dXd2dISDhX1/kqain6ail4qdkJSXioqnl3KKso2Ep5KEmZSFmoyjlqCYk4mbnqKTqbCgkZWQjo6IlYtujbeEmsTIspyipZudmJaRsZBkpM3IlY6Gh4mQko6Nk5SKhYqKhpaam4+QlJOHlZiEf4+LmYiOkKqXl6SiiJmelZqJj4aXmIqFj42Bf4aPpYiNk6ial5OXmaGYn5mTnJqisrSlo7zBvsfFxcnIycLK08zN1KjS0dbW1tja1NPazoBwfGVgW1xcTUlTWEFCR0Q7QT44Mzc7PDo4PTY0Ojo8OjcyPzk5MjlJOj42N0JDMzI6OTYyNjQ+PTQ7PjY5NDk7NTc5NDRLUTxKUUs5QTdCR0lANjRKRUxGPjs4OEVUQTc+XDg2MjE0OjtFYFhBRmF0aExjWj41Ozo6NTs6PTpFTUZIUldTUkJjgkd2gY99fG1+iHh6fnuCgoN/dnaAg3xtbot/enx4eHyEh4p+i6Ozp6Oqs6KXp5+lpJaVrqKDkbiVkbOajKGhjKWbsKOknZiRp5aomayvpJiVlpWQi5iZl6HAjqPJuaubo6atmZKbnbKdhYWoopyYhYmJjpWNi5OPiIGGh4mTmJWMi5SThpWYhoSRkJx1kZiylpakoYedmpKPipCKl5uJi5aOh32MmJ6JkJCcmpmTmJefk6CdlJ6boLGuoqS3vrTFx8S9w8O/xs3KydKmzs3T0tHW2NPQ2Lpwd3NaXlNeVE9ISU1FQkNENT46Nzc6Pzw8Nz00MzY2OTc3ND01OzU8TDw+OzxCQTc1PDs0Mjc3P0A2P0A3ODQ5ODc7PDU1T01EUFJMOEA9RUFHQTU6SkVORUQ6NkFAQlM+OURPMzIzNTc1PXZcPFJcdGlaTV1TPD04ODU2Nz06SkZER05bXFlKZmA7SISLenpuhYZ6fIR5gYaBfnB4fH59b3KNen6CfHiGi4mGhJKnu6yosr2vpa2zs6ijobCsipq1naK4pZWtpJeprbinpaOfmqmXqaOusKqamZyUlZGXn5eau7uuyqFqtrirsJSZn6Osk5e9o16qsoOKio2Uh5B8jo59g4aOj5SViIiSloyQlY2LjZaYk52ZtJeVq52KnJSSjpGSjJmbipKekIuJlZ+hjZSNmJqdkpyYnpShoJScnaWvqKGls7irwsjEtbq9u8XHx8LRoMbJzc3F19bRy9OgbnhmWlhRXFBORUM+PENBQjg/ODg1P0c9PDY8MzUzNDU0NTRCMzk6Qk06QjtBSEI7OkA8NzQ2PEI5P0BCODc0Ojo2Pjw0N1RLQ1VRSjc8OklBREA0QUpITkJBPzZEQTxKTkQvVD0yNTQ6RUpcWEpaUW1ncHBEaWBLSTY3NTc6PkpAQ0lQZEdiYGJwSj+Lin6Bc4aHfYKJdYOKgn9tfH19f3B3h3eOgod7jY+MhoyZqsLAr73Gu7O0wLy0rauztoyos62tvaubu6Sorbm4q6emoqKkoqmvsrGrnZykmJuYl56ipqWSpLqvqcC8ra2yuaWkqH6IhpytvLCDjIyLkIOOg5GPeoGHkI2NnImIj5eNi5WWlJGal52omrGakaycjpqPko6VkJCWl46RoJGJlJukrJSWj5ScnZOhnZuYn6GUmp6npqSipLCzp8HGw6+wurbFxMK/zabHxMfDvNbRzcTKhnJwX1lXXVlMSkFLQEZHPkE/Qjs6NT5BPT01PDY+MzMzMjQyQTE3QEJOPkdAQ05DQT1DPTs4NkNDNUJJQjo4Nzg7NUI+NzlWS0RXT0Y4PTRLQEM+NEVLSE4+QUE2QkI/QlNFNThQMTQ1Ozw4O0Q+OUxqal07V1JkS2daVU83OUdEP0NGXGVHYGlnWl1ck4yLiHuHjIeDjHWGkYqBb357gX9xfoF7lXqSlJSYkJOVp7PGyb/CzMLDuce8u6+rubuYs7e6ssCupcGkq7C8vauuq6OjnqerrrSwqpygqpyhm5afsLWni6O6urbBvKypnLKlpKiUhY6pxMOkgouPh4iEhpWUjXqDjZGPkaKMjJSSjomXn5iTmZWYpqCunYyqnI6Wj5KRlZWNkJWRj6GUhpefoLKelJqUn6CYpJ+aoJuglJiepaOmpqSvrqXAxMOuqLe1ycK+ts+yxL/EvLPRysjCtHJ2allWWWhQTEhCTEtLSkFBPUNEPDVBRDs7Mz04QjMzMjI2MkEwNUlFTj5JQEhSQEg+Q0A7Pj1GQTVBVUA7OTk4PDdFPjg+VkpDV09HOD80TEBCOzVKS0NMP0I/PEJGPUFITDkrRzwzNjc0NjRBPzdPYU9hRS89PjZrbGpgQDpIPj9FQmVZTmVcZlRjapmNl4qMiJOQhol5h5SQgXKAfI1/eIeCgpB6jqGWqJqamLq9x8jJwdLJysLNvcKzrby+qLq/vbvDt6zCqayzvL6qsKqkpaSsrrOttrWgn6+fpaKYo7O9qZuovcGktrewrJOxraytl4eaqaelkYKMk6WViYF2ipF5hY2SkJ6fk4+UjI+NlKOZlpyUlKOeqp+RpZqMj4+PlZaIfI+VkpKimpWfoZy1pZCel6WjoqWenaaYnpaXm6SjqaeisqyovMDEr6Wyt8y/ua/Es7u+wbiswsPCwJdqd2BWVVpZSUpMSUZEREhDQkFETDo0REg5OzQ8N0UuMTIzNTJCMjVTSE48SkJKUUVLQ0RFOkVMQjw3RVY9Oz04OT88ST86RVVJQVdRRzdBOks6Qjc5Sk1CSUBDPjxERzxCQ089MjBIMzY2MTcwPUI6PWpqSks1UVMzU3BwZE47RD1ARj5qSF9YYVpkZFaej52Ol46ekomKf4qgk4R4hX+Vf3+QiIqQgJahma6mpJjCvcfDx8XTzc7Ny7zCt7C5vLS9y7zDwba3vK2zv7q8rq+ooKmotq2uqbK3m56toqehnqu3uKqlr7/Fsb25tKiqtbSur5eWpayooJGOkrLFp5WOfZKVfYeRmZCqmZiTk4+SlpOlnpKdmZSho6KcmJ+Yi4yPj56IWpCWl5KXpJllmKOfs6WWoZasrKmnm56ml5iWl5WgpKiln7arqrq7w7Sls7XLwLiqtqyyu7muqLi6vbiBaWxYVVNTTURKUk1LP0FIRURISEg5NUVNOz44PUBKLjMyMDI1QzU1T1ZOPExGS1JMT0hHST5JUT86OElTOzs/Nzk+RExCQEhTS0BXUEY6QT9HNkE3O0hNQ0U7Qz00RkU6QkFCRzkvOkEzNjAzPkdEOTQ9dGRNRztFKzpmfGdWOz1AQkZCcEVpSVJlYkxGpZSbl6KXqZaNkIOHppOIgoeCnIODlZCQlI+aop+vvq+hxrzExMbGzs7O0sq+u7axuru7vs+1w724ubeysbWzuLOrppyrrLmqqaivr5ijr6SnpKW1wLCsrLS+w7rAurSoubW5s6+Wpa2urqSLk5WhjXTBmn2XmYSOlpqMsZWbmpWSkpqapaOUoJuXmqmcnKGgmYqNkJacYEqWnJqVmqWWVZewn6+cnqSUr66rpZqgpZSTmJiNnKCnopm0qaqzu7u7qrCyx7+5pqurrbKyo6GysrSkbmtjWlhNT0pET09QUTtIS0lHSUNDPjpLVD9BOj1FTTA3NTQ0OkI0NE1XTzxKS09VTlFKUEhISk9CPD5NUjs+PTg6PENSPkRIUklCV05JQEJBRjM+NThKS0NBPUM7NEVBOkE/PkhANSpCNTIsPmNdZzozNXRkZUBSNyYjM31oVzs6QkNAPVFFV1NzYldGSKqXmaCiqK+ZkZiHi6iWjoiThZ+HhJ2Xjp2hm6Oktci1qca5wsPHysnIzM3Gvrqzrrm5wcHMtce6wbm1urCvr7O1p6SbqrS1qqmmrayapK6lpKisur+orLa3vsK/vrm0s8Syub2so6+1rLmmiJuXppt2v5+EmZ2Ok5mai66XoZycl5SaoKGonqefmZqqmaGnnpiQjZGdg252kqOalZ2inZCusqKqlKiql6qto6OfpKiRkZmbh5Scop6Wsaepq7m2vbOyrr65t6Cjp6ilppybrampi2BjXl5QSUtGR01JVkw9TUVOS0xCQ0Q8UVY9QUFCRE8xOD03Nz9CNzVUV04/SE5RWVNQUVVLUUpKRUFFTVE/Pz04PTtHUjxFRFFCR1lNS0FIREU6OjM5S0lCPkNCOTlDPjxAPjs7RzctMj4tMYJoTnpcLzBraGA8PUJCODZ6Zlc7Oj0uLVJgTVVIf2VeSEWrlZuhn7uvmZSfjJOrm5GSk4mrjYain4ykrZSjo7bGvrTAusLCx8jFws3Iwb65sq+4tMHCyrXFssG8tbqqqa2tsKOjmKq0u6appquqnamvp6Oqq768qK29tLi+x7y3trjBsr7BtKm1t6u+pY+il5Kin7yfiZqgmZeeno+3n6mcpaKbnKGaqKSzoZudppyoqZ6ZlY+Um4uXiYykoZSdop2gta+lpJOvq5mrqp2do6OokJSUn4KPnp6blamkoaGztLq1rai1srOenKKlmpeUmaqhnnVeWl1cSUdFRkxQSE1FR0dDU0xKQkVHQVZSREg9QUdRMTtCNzpCRjc5XFlLQUxQVFVTTVdSTlVKRUBKSk5POUNANT08TlFDPz9QP0VaTUpBS0RHQDUzPUlHPz1FQTk3QTs8QDw8M0A8Lyc7KkiRQjpTSjAsW29XNzE8Kh1CgGRUNDktMTlmXEZDQ5xwYkdFp5ekn57DrZuXpZiaqZyWm5uPqpaVp6aVrayZoqu2xMK8vrfBwsDHw7/Nxru9ubKwuLO/w8i1v7C8t7m3paSrrK2hoZqqqsWipKmrpp6sr6uiqai/uKetvrG4tse2tbm4wLK/wre1s7SvvqOXo5aUm5SuoJCho6Wjo5+QvaSpnqirnZ2gm6WfvaKZo5+iqauhnZaNlZ6TnoePhI2Tn6SgnrWspZuVsaeZr6admaqcn42YlJ6EjaCam5KlpJqYq7G1saqlqq2snJigoJKOkJWonpRmYFhfXE5IR0pNS0hFRElBPlFJQTxHSUhbUk9LPUhPVTRCRjk+SEc1Q2FaS0NOUlVXVlFYVFJVSUA4UlFQTTpHQTRDSFFTSUM7Qz5HVktDQE8+SzwwNjtHRj47RkE0NkA5Oj85OzE1RDAtLC9Ndlw0S1o1LE1uVzwtPSkeI3piUTVDS1E6bVJGPEt4ZWFWS6Kao5yexayhn6yenq6gkqOflqWfpqqsl7axo6qztsTEvb+1v8K7yMK+yse1uLW0sLO0t8HFtr6xuLW4tJ+mrKqsnZ2epaTBpJ+qraCkqa2voqaovbWlsb25trbEsrS4ur+zxMG4uK6ztbWjnaWVkZShrqCZop6oqKujmsKsqZ6srZubnZmmoL2hnaSYq6uspqKZjZqfkp+Jjld/lp+loaC4qqaTmLWjn7Ggnpqulp2NmJOdgY6fl5WOoqOWkKausqupoaGlpZWVnZiLj5GSpJ6JX2JYYl9LSEpKTkVFQUdLPj1KQjk5SkpOXVFRST1MVlw5Rkk9RE1JOEhiW0xDTFBTWVlWV09aXklBPVdRSUs/SD81SE1YU0hBOkBBRFBIPz5RPks3MDk5RkU7OEc/LjY+Nzg+NzcvMT85MSUxUVVtW0pPMTA9Z1dEMTc9LSt3YFM2U1prV3JHRTY9dWVcS06en6GZnsOopaK0op2yp5OrpaCjn62prJ27sKistrHIxcHCssLDvcbDvMTJvK+wtq2wtK++xLS5sbC5tKyZqLCpqpqdpaGowaybrLCcqqOusamkqL22p7e7vq+3xK20s8PAs8e0u7ers7atqqKmlpWUpKyin5+aqKuwr6+7sqagqaiZmZeToqS4oKGjk6+vrKWnn5KhnpWej5CNlZ6aop6ns6amjJizm6OumZ2brJCek5WTmX+RoZWPjZ+hk4umrK+lpqGcoJ6SkpqThYuRjZydf19kWmZkSklLSlJCQ0BJSDs7Rz85OU9NVV5SU0o+T15dPUhQQkxMSTlOY1xMRUxSVFlbU1VPXGJIQT9aUUFIQUtCN0ZFTEtNPztCSEROQj07TkBBMy85N0NCOTdGOys2PDQ2PDM1LS80QDErJ1Z0U2VPPzEwNGJbTTIzPjA8dl1eP1tUXmVxQDg7SJZ3ZUE0n6OgnKDDqaSqs6GktKqWs6ynoqSyrK6pu7GtsLW0xsDEw7XAxL3JxLW/yMG0q7WosLisv8Ozt66strmlmKqyq6qYn6aXrbu0m6ewm62grrSyp6u5s6i6tLiyucCqt7LEvrXGqL+vrba1qaesoZeXkaaloqKYmKWvuK6ytbagn6ikmpWVk6Sgt6KkpZavsbKnqqainpqam5aXqJ+gmKGerrKipoyXrpikqpeZnqSRmoyTl5mFlZ6UjI+cnZOLqKmqoaegmJ6VjI6Zj4GFlYiUnndiZ1xqaU1PTU5UPUNBTkM6Okk/NzdST11eUlZRQVdgXEJKU0hWS0g6VGRcTkZPTltXW1JQUVhdR0FCW1BCRz5OQzlIR0hPUD8/Q0lCTEI8MklBOTQxNzdCPjs3RTcrNjkxNDgwMi0vLjw2LSNCcWdzazIzLzFbYlozMzgwNnBbYkgwNUlwaFZDV0aMeWZDO6SjnaKmv6eor7ChqbWrnbqxq6OqtLaxsLm3sLe4uMS9w8e9vMTBxsC4wMXAuam2pKy7rcDCt7eprLG6oZStsa2ylqWnkaq5qZ+msJ2roLC0s6qptratvK2zs7m3rLmww7u+v6bDq7C3rqmrq6eemJmroaKhkZehsa+zrLC5mpypoJmWkpemobappaOisLG0rLOorJ+boKCbnaWcopedo7Owmp+Pk6Wan6iak6KelJeIk5aSlZack4iQmpmUjqiopp+jm5ebk4aOmIt9jJaFjZlpZ2tgbG1XUFFaVUFCRVRAOztIQTc6WFBkXlBWV0VZX11NTFJOXktKPlpjXk5IUE9cVVlQS1RXWkk/RFhQREY/TkA9SUdHUVBCPURGQk0/OjFEPzc3NTQ3Pz05NUU0Kzc1LzI1MS4tLiwxPSonKz1ccD0+MS4wZFpkQDE2NDdnWWBGKD84bH1nW1Y7iXtjQz2on52iqr2iq7Cro7G4qqW2tKygrbW9rrO4u7q9trbAwr/IxLnEwsDAuMS9wbevtaert7G8vr60qK6xtp6Wq62orpemqI6nu5+krLOerKKxsLOsqra0tb6usLG1rLC0ssG7xberva+xuKytqqOxpp6lqp+kmJCZn7Oqs6uqs5qdp5ualY6gpqW0rqehra2usae0rbKqpJyfqKOelaGZm6i1qZaZkZGdmZ2fnY+rnpaXhJSWip2YnJOJjZaXmpempaKgnZWVl5N/j5SFe46SgouVZGtxZ29xXkZZZlZEQk1YRFo5SEI2PlxRaFxOWV1HW15dTk1SWGRKSkNcYl9QTE1OWFdYUEpWVldMPUVVSkVEQU1AQUZISFFQQTtGREZLPTg3Qj02ODcxOT48NjVEMCs4MC8wNS8qLC8tKj0sLCUyKyo1SzEvJ19fYFUxNTA9YFZeOClDM1lUXGdLNox6ZkxApJqhpKy2pa2qpq+ut6qvtbunprG3xbext73BwrW0usS+zMa5wsC5vrnDt8C5sbSsqbq2urm+tKmtsLWYmKerqqybq6uPq76erK6yo6ufsK2zrq62srm4qq6usai1r7S8vcqzqra1sbSvrqehs6CbqK2gppaWmpqyoq2gpa+XoaSampKOo6aos6mhprOsqralr7G1r6SZna2nmpifmpmrt6KXk5GOl5yhl5aUq56akn+Sl4ydnJmWkImUkp6ZpaKhoJiWkZOVeYqPhXuMioKJkWptd211e2BFYGtZSUhaWj17SkZENkFiVGlbTVxhSltdWlJSUmJhTEtFX2BgUUxJUFdWVU9HV1ZVTjpJVklIP0NLP0VESEhRTkE/SEhIRTw3PT46NzU2MDk/ODY2QiwtOCwvMDQsKCwvLSo3NikoOS4kOks1LiJUYFVgLzUoQ19RXC4rQi9KR1BbSDNjWVVLRJmXobGosaqtpqSvrrapt7W6pKy0t8m7tLq6v7+0s7fDwMzIvMO8tr2/v7e+vLG8raa6ube2wraqrLC3lJanrquoo7CqlK+7pK2xs6eoo7K0sbKxtbG4s6muq7Knt6+2tMTGtqm2tqywramno7agoKexoaSUnJmVsZ6nnKCqjqminpuWmKampbino7K1rKiyp66xtqylmaCsqJucnpyUqbiclI6OipibopePmKWgnJSCkJSPnJuXlpWIlpCYmqeco6CSlpGQlXWEkId7hIGDi4psb3Z0e35cS2VtXEpOY1w/YntHSThHZ1dlXExeYk1YWVdUV1RpXU9PSGFdX1BKSFFWVVJLSFdVVk04TVpORUBGSz9IQkNLU00/P0xPSEA7Oj47NjswNDE8PTQ1OD8pMDcpMS4yKSksLC0rLTkkMDQyJTlCNy4jQU5IZjI3J0diTFYlLUItPUVMUTwzcmtJQ0OQmaWupa2vq6ilsbO0q7eyt6CrtbnJua7Au8K4s7G1wsPOxcDBvbS9v7+6vryyxKepua+2tr+8rqqysZugp7GtpqWvpZ2ytayrsbKtqqm0u6y1s7WttKyqq6isqbmtsrHIwLilurCprKylqK6wpqWjr6SpnJ2cm6+ao6Oio5GsnqOgn6Kqpqa5pKy1tqWrrKitr7auo56jqaqboJqakqSzmY6JjYeQoaCUjJScn5KRg42Skpyal5WTh5eSlZmnm5+ejJKRjZB2fY6FfHt7homIcHJxfXx8XFNkbl5OWWZcRkSWW0c7Tm1YYltMYGJOVlZVV1RZZ11RUkxjWlpUS0dPVFNOR0lWU1xOO1BeSUJESEpBRT8/S1NPPjpOTUM8PD45OjU9KzMyPTYyNDk6KDQ1KS8sMSgpKywtKiY1Ki8mMCkzODoxJiozQmM6NipIZUhKKzpIPzNCSFMsPpBrO0dIj5yqq6KqsaSppbO0sbW1srKiq669zLquwLrHsbSttMLD0cXGvsCyvsHCu763u8SnrLersre7v6+rsayfo6etqqiksKSqsqqvrLCvsK6rs7ynt7GyqbOpq6Wlo626rKqyw7q2rbupqaesqaiypamko66qqKKenKOtlaWemJ6ZrJ2ip6miraakrau4srKhqaKgrK+xrJ6gp6ipmaSZmY+gppeGhI6Ki56fjoqMlZuOjYSGj5SfnJSXlIaWlJOXpJucnIqSkI2Jfn6HhXx3foWEhXJxcIh1a19aYG5iUXNxXEs7hHxFP1d0WGFaTmNbTlZWVVdRXGJfU09OZ1hXVktHTE5SSEVJVlJdYzxQXUQ8RkhIQkc/PUpQTDo+T0o9OT89Mjo3OyoyNT4xMDQ4NSg1LyosLjMwOyksLCclMjM0JCwyLTg2MCkoMTxdSjAuSmdERjg8QjA1RUtYMUCVWj5MRZWYraiiq7Ocqqqwtq25tq+rpquqvcm7sL23wq+xrLPEw87Pw76/tMDCw7q/s8jDq663rbK4vr6yrK2rpKeqsKmnqLGltK6qsK6tsrG0rLS8pLezrKyup6ufo56wt6uqrbu3pbe2pKmnq6uqraGpp6axsqSnpaGhrJeqoZWboKaepKKrpK2jn6exuK6uo6aim6qrrqmdoqWkpJmgmpaPmJySgYKPiIWcn4uKjouYjY+KgouXo5uRkJqLk5KRk6OZm5qKjouLfIaBgYN6dH+CgHxydYukh3hqXmBuZldlh2NOP2eTTEVieVdiWVJlVE1WVVVUT1xdYVVLTWhWVVdJSkhJT0JHSVNRWW9BTVhAOkpHRkVHPj5FUUg4Q0tFODdDNzI6OjoqMzk/Li80NjMpNCsqLCsuIzQuLSsmKCs3OSomNis8LTIsJjA2V1ouMEpnQUE8PEIrOkpPXjREhj5IRkSXkrClo6uxmKuqrbastrKspqyqqbzAwLi4s7u1prKvxMnL0b/Au7m/vsG4wbnAxK2xtbGzur+9srCtrKqrp7aqpq2vqrmwqLGyrrKtt6q3t6e0t6uspKmqnKOes7OoqKS0taC3rqCqqKqoq6egq6ypubapqqmpoqqgrZySqqGdoKSipqOqnp2ntK+opqqio5ilp6eqnKOko6CamKCRjo+YjX6HjIeDnZ2Gg4qKjY2Pi4KFlKKajYyZkJGRj5OflpiWjIuDf3SHgX5/eHSCfnl2foCHnY9vcWdncHdcYXOIa09emVZIbXhVZFZRY09NVVRUUE9YW2JVSFBpVFZTR1BZVUk+SUhPUVB4TE1WPTxLRD9AQTxAQ1VDOUFLPTU7RTEzOzo3KjQ6PSstMzQxKjgqKisqLCkpKC8qJiklMzssJDIpMjAyMSUvMlFiMDI/Zj1OWD5DLD5MVF8vSmk1T0Q7lo6xoaarrpqspa2wtLWwrKawqqm6vrvAsK65rqG3r8jHyNHAvr27vMK9usPAvr+usrKxtby6wbGxsquzqKS1qKWts7O5saOut7Kwsruruq+qrrasqp6qrJ+joLatqKGfsLOitaqeqKepo6qhoqytqL2vrK6soqion6yZkLChmKKgp6eep5uZqrGqo6CtoqGUo6Ojp5iaqaWYmJiejoqHlId9jIaEg6OWhIGAi4aNi5CDg5OgloiQnJCTkI2RnJSXj4qFhnh0gX98dXh5f3pzc3lnf4akdWleZGqAdGeIjH1TWHBeSndzU2RUUV5NTVJaZk5MVllkWEZTaVJRP0NOUWFROklITFNJcVFMUzs8ST87PD07QEBXPDw/SDczQ0IxNTo5My01OjopLTMxLS01KSgrLSw0MiMyKScsJS47LiYxLjAtMTQlLDBMZzo0OF89YWQ/RjFDUFtbKkhNOVVBNJCPsqGkpqykp6Stp7WzsaulsKequL7AvK+nuaqmr7DJx8jRwry/vrm+v7zJusC4sK+0sbq7t8Cys7qsuKyitKenrLK2ubOoqL22rra+sL2nray1rK2cqa+koKWtq6ecnquzpbSomqqnqaOpnqSpqKm9rLSvrZ2qpKCunJuzo5WknKWln6Sbmqmrpp+bqqKbk5yhpZ6Yl6mpkpialJCKgo+Ffo6CgIedj4V+fYuHkI2PhH+TmpOFkqGMlJGLkZuSlYeJfn9ye3p+fGh4fHp0b3B7Z4R4hIhkYWdhcYR6bWd4XV1VQFZ6bFRiUFFYS0xOcnVdSFpbZ1lFVWZQRD5KTkRDQTlIR0tTP2piSlE4PUg8PDw+Ojw/VDY6P0M0NUg+Mjs1OTAyNzw1KC41Ly0xMScvPktIMCUaOTAlLCwwOS8sLCs2JzE3Iy0wR2pJMTRYPWZjQUo3R1NgVSo9OURXPiqPlLKaoKCppqWhq6W4s7OmqrGnrbjBvbWvoritqKiwwsnJzMG2vcC1t7+5yLXCtbOytbK8t7m9ta25tb+toLOnq6uwtbi1rJ++vaqzwbS8oa+ztaqrn62wo5ylqKqjnpulsaewoJ+rqaehqZykqKGtu6iusK2gq6Okr56fraaXn5uho5yfnJqkqqObm6WklpeVn6KWm5emrIyekZGRi4KKgICOgHuZk42Ie36Lho+Ni4qDkpiRhpOiiZKSh5Caj5OAiHx5bH52eXhje3pxb29xdmeAc2qDZ2RnX2xyjWxhaW9gbz5aeGtVXk9QUUpJTVRZV01dXmxXRFhgT15QSE1ERjs3SEVLTzxyaEtLOUFFOzs9PTs7PUo0OUI8MztHPDQ/MTgtNjg7MigwOS8sNC8uPS0qSz4qHTQ5JicuMzQuMCsvNCYsOiQ0MUFoWTEzUz1lX0RMNktWZE8qOzJOWD0jk5mtmqCYp6Sjn6ikuLCvo6+wqqu4wbmzrZ+4r6uotLrIy8i/tsK+sLS9t8S2w7GuubKzv7S6vbeoube9qqO0qKmqsa66saqcvL2lsMG1tqKvt7Wmp6exs6CepKWnoaWZn6yoqZ6gqq6moKaYo6mgsbmfo7CvoayhraScpqapmpqbn6SVnJ2anqmml5ygqZOZlJiek5mWoaqRmoiOj4Z9h36CjX18oIyMiHiCi4SJi4uFh5Oaj4iVnoiRlYKMl4yRfYV7c3B9cXR0YHl4aG5wcG5ofXFje21pZWJeZIV+X1pyanFLSn5oWFpOUExKSFBSUElPXF9uU0RYWlJoT0hLRUY1NkhCTEk1WmVKQDZFQjk6Pj0+OjpDNTk+OjNARjwyQDIzLjo7ODMmMjwwLDg1QiopLUMqLDQ7Tk5AOzczLS4rLTcqKjwlNTM8ZmQyNE0/ZV1GTz1RWmdIKj4vWFY1KJeep5qdlqygoKGkorirsqW0tKqpucO1s62ft62urbC1xsjBt77BubG0vLa/u76vqr2ws76wvMK5qLu6t6antaioq7Gts7Gom763pq28t7KfsbiwqKWnr7GboaSgpKSgl5uvp6Gfo6ivoZ+ilKSkorewoaawq5+so6+YnKqkqJ6Xmp6lk5udmp2mq5qdnaaXlpiUnY6Tl6KoopCIi4+FeoR+hIp6jpaJjYZ4gYeDh4uNhY2TmI2OlpiKj5d+hpeLj3mBenByd29vdF95d2RrbGtoZ4JtZXJra2VoWWFzf15aa3VpWUd8XVtYT05KSEhSVUYyOl5ebFBEWFZZZUxISkVFMDdGP0tCNklKSDs2Rjk0OT49PDk4QDg7ODo3QEk+ODw0LTM8PDc1KDU+MSw7QTEoKzY8IzhSPSoxMTM+RDUsLSc0Mis7KzEzOWNsODRHQmdbSFRDVF1oRS47MV5TLDKWo6KYlZ2pnqaho6G4qrChu7mmrL3Es7CuorWvra2vtMTEvbO+urexs7m4uri6rq2/s7S4r7/Bt6y9urSlorOrqKqzrK6yo53Ctqapt7ern7K7qaalqK+rmaOnnKWmlJihs6aZnqWpqZuhoJSln6S5qKSnraaepaGok5+poaGhmZudoZKbnZegoqucm5qilpOVlpuOk5Ojp6SPiIqOhnmEfIWGfZyMiYqGeICDh4iHkYWVk5KMkJWTjY6Ue4KXjot3fntsdXJtbHNieXVoZ2lnZW2EZ2doZGZoaV5mYmlmWmV6YmBRc1RbW1NLSUdJT1NAIStpXmpMQ1ZVXmBLSEdFQy46QjxGPDZLUEQ4OkQzNTc9PTg5NT86OzQ+OEBMPT45Myk4Pjw6OSo2QDMuRTQoKyw+MC1OPy4rLTctMTE5NSwmLjUtODA1NzZgdEIzQ0RoW0tXR1VgaEIzNzdhTScynqSkko6lppyenp6kta2oqrq3p6zDwLevrKG1rqeur7fBwL2xwbewr7K2tbi3tayqvLSvsrC9wLeuvLyxpJ+2rKamtamrr6GgxKyqp7G0q6y0up6oqauxpZidqp6opZKapq6jmJ2kqqGbop2XoJ2ntqavqa2hoZ6doZWgpp+ioJmbmpySmp6Vpp6topiXn5aUjpWYjI+YmqegkIeKioh4hXeCgoKch4qCiXt+hIiGhJCElpWPj5CRkJGNknuDlY6Gc399Z3lwa2psZ3Vza2JnZGJ0f2FkZWZlaWliZ29ZXlhdbGNgTWdXWmBWSUdIS0xSWD45YGxpR0JVU1xbSUhGRUEuPD85QTg5UkZANzpCMDM3PTc2OTI6PDk3OjlETT1CPDAqPEA7QTwtNUIzNz0rKywwQSpKSy4vKiszNzIyKDU3JCs3LjcyNjg1XHlOMj5IaVpMWkpWYmZBOjNAY0YlNZykoJGMrqCamKCXpbSyo7K+t6Gxxbu5sLGjtqyrrqm5vry7rcCyr6+utq+zubKnq7mxr66ztru2sLm+rKWetaugobGlq6+fpcWhs6WvsrC3rbWerK6srqKZnaeqpZ+VnKemoJmko6mcmqCclZyerbCmuaeuoqGamp6YnqOapZ2WnpiblJqhkqiWramblJ2ck4yVmY6UlJinp42NiomOe4F0goKKmIWHfImIhISKjIiShZOckpKPkJGWjpB/gY2Ng2+Bf2Z5bmhramdxcmtbaGNhcn9gZGdqbmtmamZkbFxsbXZxYFNiaGNlWklGTE1PWFFQVWFlgVRAVlNZVUZHRkVALzw9Nz82PEZOYTg6PzI0OUAzNzgyOD83PTg+RkpARDkyLT1BPUE9MDVAOUAxLSsuMzw7SzYvLissLTI0OjUjMyopNi41NTQ2NVp8XTE6S2pbTVtLWGRjQEExSGNCJzSTopyPjrGdm5ShmqmysJ+5wLags8G7vbmxprawqa6lt7m3uKy7r62rq7eqtLmtpbK1sa+psba2sbO2u6epn7apnZ+qo6qtnavDma+lr7G2taysnrGtr6qim52krKmclZynpJ2ZqaOllZqgnZGco6uqqbqep6Sgl5qanaGPa6KVmJxxg5acpIB2kauonpaWoZGJl5mAl4qfj3iFk42DbWl+d4RybIaKhn2EioZvXWRgZ4SXhmuLkJSSdXeLhH+DkIBmiIBodmlmWF1pdG5OUGpjZnGCZl5kZm5raV1dXomQhYhoT0tDN0RUZ11KSFBQVVVLSFNgb3RlRVtRVVBGR0ZDPjE7PTY9NjwzZlw1Ojw3NTtENDg2MDpCNz86PkZMQ0IzNDM9QEBAPTI4QEU9MSwsMDg+RzcwMS4qLiovNjY4LCMxJzIxNDoyNzZYgWwxNU9rW05cS1tmYj5HMU9hPCsvjaSah5Wxm52ToJyqraujvcWvqbfCuL28rae2saarpLi0srOwua6qp6y0pbC1oqe4trWop6y2s660rrOiqZ+0q56ipZynqJuvvpWop7C0uK2upKitqqumoZ+coaionJehpqacm6eonZKeoJiQn6iqo7Svo6KjnJaYmJejiKGPkpqGoYiUnqF/pX+nrJ6Uk52TiINyeIyOg4egdYiNaZeJZn5zeaBviIeDfox8f6Ggn5l/e4eedIiOdpuKbIeCg25pZWR7bXJiVIZtY21pmHFYaXBuhlddaVtralqIcG15codoh4RZXkZNPkZeTUVSVlZRUFJXVGddTFlLUlJPRUdHPjw0OT05PDc7MDw8Nzk5OjY9RjU4NjA8Qjs8OT1GUUc9LjU8O0A9QD41OUdBODIqLzE8STkvMDEuKi8oLTQ1ODMlJjIxMTU+MTw4WIN0MTVSa1tOXExbZ189SzFVXzcwKI2ml4SdrJ2ZmZ2fq6qoqr/DrrK6vLfAv6qkt7GqrKazta6vs7arqaWxraW1s5ustba0pqeos7Gtsqiunqqhs6mgpKSaoqSdsLeVpaant72mrKepqqunpqKgmaCopJqZp6OkmZylqpaTo5yUlKSmpqG2pKOgpJiVk5iTnIiukJiViamLmKOchrGApK2elJqflXmC1Kh/h5TAm8Z4d7Glt5ZkgMCcv3mEhHmPg3yQkJHKcZa8nMV7cranupB7gWyXsauweWhsWLGub2VpvJK8bmh6bXCP2H5Ta2K2sn6AcZR1mqGqkFZOV2FPVk5GVFtYUVBSi1xXW1BAXEVRTkRGSTw8NTc9Ozo5Oi49Ozg3ODs5PkY2Ojc0PkA+Njk/RVJJOi41PjtCPD9BODpKPjUyKjIyQkUvLjMyLisvKS0vMTg2LSAvNDE2QTE9OleDdzExVGtcT1tNXmdcPkwxWlw0MSGOppOBp6qfl52dpa2yqbHCvbK1v7W4v8KrprStramor7Sqr7a0qKimtqWoua+csrK2qqWkp7KvrbGmq56npLKkoqGfl5yhoLGulZ+joLS6oqqooKytpKKdm5qiqqCYm6mgn5idqKiRnKeblJ6ip6OhsKOen6OWlpKYkpmFsGtqi42qfmeFloetZXGenZWap5ZxrqGkfne6fGuhj3axX2q0W6WAZZyQYGaBemZ/aXhqqWW+cmemjHaxanyxeHWSlGNtbaduXISgRWlnh5ZFdZxgfWZ7o6aCWV+Lq2mAknh6aqg4Sq9bV1NsY1pMT1hfXFdWO06IT1ZWL0lUU0pDRUY9PzQ2Pzs4OjkwPTg5OTk6PTxEODs6Nj1BQDY8QEhRRzkwNzxBQz5ARDhARz0xMy0zM0UzLi41My8rLyguMC46Ni8nJDIwM0IvPTtVgnYyLVZqXE9ZTF9nWTpNNV5YMzEbkqKVgq2npZ6jpKqxt620vb6wtsWyuLrDp6mwrK+pqbGvpLG6sKSlr7OjqbmpnrOysKOloaqtsKyvpqifo6KxnKOdmJWYnZ6wqJecoqC0s6Gqm6GsrJ+empego6qdmZ6loZ2aoaekkJ2jm5ihoKyfpaagmqChlZWRlpGahrWbtXmFqZm1mXeHs5u3f5OWl6uWfmuBpnqBhYaRlJJ3q2dqsVuse46HlHSIcI6GgH+IkJd4g4KLl4yDoI+FsHZ3n3Framx8i0+lWEhjY5l+Y2ilX3lxdVKSh15QqW1jcX2GgGGdL1KibltTa2dfTEtcY1hcWkI+sHdXWEEjTWhGQkRBQEExOT44ODo4NDs6OTw5OkE6RTo6OzY6Q0I4PT9LTkg6NTpBRkJAQUQ8RkQ7MDIwMTtGLDAuODQwLC4oLzMsPjgzMR8vMi1EMTw8U31uMytYalxPWE1fZlc3SjlhVTUwHJaflIizpqahrqmos6yqu7bCsLzCrbi3wqusra+up66zqqKvvKuip7Wto6u2paWys6ijoZ2nqrKosKimnqCgsJagmpaWl5qgr6ObmqSota6hqI+pp6mbnZaYoKapm5+do5+coKOlo5Wbn5ianqOrm6WanJqioJaTkZOTnYTVk5m5cbDCf8aGfNaUnLt8m5amkI2cjKR6jYaigaWCeqx5j51Vr3uJfp9quVq5d4WDfaaCk3yYeqp5jp2Qe7FtjoR0kLuFbpVQr6fFilGgemNgqmJzcoZsl4dfU7W0yIWAiXxjpDNCnXVdUGpoZFBAWGZZZGFKSE1rSlpTT1lmWkNDP0U/MDw8NTk7NzQ8Ozg9OjxDOkY6Oz42OkBDOzZAT0xIPDo8REhDQkNEPEVGODEyMTFEQi4vMDQ4MystKS4zMjM5NzEjJTUqPjM9PVF3ajYqWWlbSltQX2ZUN0c6YVA3MiWcopKYsaippbOqpbSnpLy3wbG6wLK2tb20tqeysaOxs6agr7apm6i6rqOwsqGytLGhpJ6ep6mxqbSppZyenqyXmZmXl5aYoqyem5eprbCoo56OrKKnlp2YnKGmopiioaOhm6Kip5ueoJ6VmZumoZymlJubn6CYkJKVkJ2Ism5otXGriHCOpnK0dHO2e5uYpY2PnI2ifo+fpH6wdYOR0tF1W658hX+kbpuqpmuGhX2tfZeZj3uxc5Odj3izZZZ0hZ5unmaUUsmLWsJcn3liX61fdnOGYpeIXlnKnW+/gHVNS7VTVcZkVFFqY2VYQU9qX2xpUFVGSTk9V1JbVllIQj9KPDI/OzU9PDU2Pjs3Pjw9QztHOTtANzs+RDsuQ1JKRz4/PElKRkNFRD5JSToxNzQ2QD4vLjI0MjUyLSkuMjYsNzQyJh82MDs1Oj1QcWg5J1dpXEFOVF9lUDVHPWFNNjIuop2Rpa+spam6rKa1pae2u7yyu7+4t7W7u7SmtbSisrKjoKywpZinuq6ksrGdtLiqoKWdoaqksqisqqSanZupn5aVmJmSk6OqoZiTp6uwpaGWkqyfpZKUoZykp6CVm6enopqjn66aoZ6ekJacop6cpZSdlZminpWZlpKbhax7d6h2o4+Lh6lvrYqDp4SamaKKkpmLon6Rl4euhX+Cs1xys1KufYKCo35x1313hH6PnYaZmnevhoqRnIh3tGGaZZqCgZVskluwV0uadZh5ZmCtXnZ3h2eYiGpdr3eVn494bDV5yK6yX0JUb11nYEVQbF9wbVZVTS5lYmhTWVA7QURATDo1PzkxPjwxNj85OEA9OkM6Rzs8Pzo+PkU5LUVVSkVAQzpNS0pCSEc+R0s5Nzw0Njo+LzA0MzMzLjIuLjE4Ki4zMiUhMDM3Njc9UGtlPiZWZ1xAPVZfY042R0NgSTo3N6Cdk6C4sZizwayosqeqsrq4tLm+ubiztr62pri0oLWtoKCprKCVp7asqLGxq620pJupn6CoorWnpqqjmZ6VpaKUlJyakpajppuUkKetr6WglJipn6KPkaKaqaahlZqmqZ2dpJ6tnaGcoI2Un5ueoJiYnJaXoaCUmJGmnYapfX2leaGPkIOqcK2MgaaGlqCiipeWiKOBkIeUqnuAi515b7FaqIOCiKB4dNh/dod0p4GOm42SpHyVkJ+Ee7JenGSgfYKUbZNcq1xbk3+Rf2hnqmNye4BqmIZxXataiaCPa25lT0pDoVxaTXRdYmZNWmFfcnRfSlU1SpqSWEhFPUhGQU0zNUE4Ljs+MDVBNzhAPDY9PEY/Ojw2Pz1CNy5IVkpFQEg2S0lOQElLQEVOOjpANC47PjAwMjE1NCsqMDUvNywmMjEoJCQ2NjcxPE9lZEEmVWZbPzFUX2JMN0ZJX0MxPTeinJmZv6yYs8Kuq62oprSwuLG2v7m6s7K4vKq7taCxpZ+mp6eflKqxqbCqtq2qr6GYoaCmpKS6oqOroZebkaOglZWfm5WYoKCQjoupsK+mnZaap6afjZKkmKisqJWYqaien6CkraOhnqGOlaGYn6CSnJeclZ2hlZaPq5uPrm5ytHSpjHeKpnO0eXS0gZOlo5OcjImkh451uG6Le4uia2u2WqGGZZeXaKCip22UcrR0k5h/smqFkoitanW0YZ1mom6GkmuXXK1gTqF8h5FSc6NseX9+bpiGcFyvVjycd2ZUb24uW6dPYlJrZWJsWmJcYHB8Y1NZUT4+bW8yQkJAP005ITdANi47QDM3QzU4Pz8zOzxDREJKRk1JRjYySlRLRUJKNklKUD9IT0NGUD08RTUwOzswMTAvNzUsKywzMjYvIzAwLCwdMjg5LzlOYGVEJ1VkWT4vVV5hTDVGTV45MUE4pZqcnbqinLG/rq2rq6e3qbivtcG1vbKwu7irwbaqq6Gdp6SinZKrq6e2o7Oorqqhl5yooKWruZ2jrZyWmZClo5aOnqGcmJ6fkZOVq7avppmTm6ypl4yUppqlraORl6uypKCeqKuwmaGikJmil6CblpuXoZOcqZ2UkKqZh9OTmrt0scSAw4Z+1ZabuHmJkZiNl4mMp4d5orZ0fXd2woKasmCDunnAfHW4YrWBjIepfZaBrKlxe391vIinoGmdYaaOr6J+jHSHq32+bnO8dLKDdXiAim2aiHFtjaR0vV13fVthebxqWlZbaXpeaWFkZmJteW9ZW1lDQUByP0NHKzVIIic7PzEwPD83OkI5OT1DNDxATlpeYGBfX19aUFBSS0VGSjRITFJASk5FRk9CPEU4ND05MDIwLjg3LSouLzE4MCItMSwzHiw7OjA4TFhhRidUY1g8L1ReYEs1O0xbLTZAOaeZn6K8opexwq+tqaqssai5r7fFsbuzr7ywrsGyraajn6ShnZyRqqWqsqS1p62koJaaq5mnrLmdo62ZlaGQpqCTjZyjnpiempCWkq+5sKuVl6Onp5SQlqWdpK2fkaCoq5+cn6mksp6ipI6nopShmpuXlaSYj7CgkpWpn4WQmbaAkZGNuJV4gpObtXdubG5zb3mPhI6Jcp7Bu7yZeoGyqHCAdJG5g3uGhoqGjXuKho2XfKS7ub2cdXmzo3R2l3V0sHWYnmaGaY22dHJwd7aMXn95fYhng3lteWKLrHB0hX9YW6dpRGRZVGZfY11jUWZmcW11Qk1PTEQ7Wkw/SjM8MCA4PjsuMz1BOTk/PTs8QzZCVFlaWltbWlteYGJgXVNHR0g0RElUQktOR0VPRj9HPDc/NzA3MC85Oi4sLy0qOC8lJjIoNCQoPjcvN0tUX0cnU2JXOCpPXV09KztWVic9OjymnaGhv6aWs8Kzq6qorKuqu6+xxq+1tK+4p7W5rqukoqefoJ2ZlKykrqqmtqion5yWoKOdrKS+p6Gql5WckaKbko+hqKGTnpeSmJSytbasmJ6jpKKLkpKmnKWrnZappaacmqGpp6ajqKGSrJ6Xop6Xlpidno+wqZOcp6KPa35pnKh5iHN+m451emWHe76/wLpukoJxlIVfcmpaXZqJYWSHjpVrYH+UY22bdmKUa4CalZRlXl9icZqJaHKMfIaUZmp+cXR5fn1iW3h0gWhQXG6DfHuKalhseYFySUpvhXBOc01EVlxmYUxbV2ZjXk9abXZqclJPREVNPEhJPEw+MiwyQT84LzU/Qzw5O0A7PUM+UlZWV1laW1tcXWBhYWFgXFVHNURGVUVKT0hGUElJSDs4PTUxOi4xOzouLy03Nj01JiIvKjIsJTs4LTdJUl9JJ1NfVjQpUF5MKDM+W08nPzI+qJ+oocGkmrS5tqOspq6nqLWyrMissLSttqS+sbOnoaSqnaOcmpqsp66kpbWqpJuYlaKbpq2pvqiopZWUm5agmpOYpamnkZ6Qj5icsLK+rJunnaeiiZORqpuopJycrJ+jmpujp6yhn6qimq6blaaglpSdn52XsaWZoqiZnJGenKOlmqejmp2ampqQloJobn1xdpGXk5CDibSpjYWYlY6KjJiWh5OViYOTk5CIjZGUmZOZl5qgoZqblJ+bjYJ6pIVsaXuQfYB1iYuCcoJ4eXZ1ioB7iWpzgXSDdWR3fXZrcHpsX2Jbb2dMWFllal9XWXB6b21mU09GUjlPWk5STygrO0pCNjM1PUBBOTpDPjxFTlNTVFZXWFpaXF1gYmJhX15eW1RLQ1NHS05ER1BMT0k8Ojs0ODksMjs4MjApNklSTzgiKSsvMiM0Oyo3Rk9bSidSXlQxMFReOis9OF1LLDwtQLKgs6K/oqOxsbegqaazp6WwtarJq62yprWmwKi0oZ6lppyllpagq6eto6S3rKCZl5agl62qpsGfq6SWkpyXnpiUlKKenqOokpCZqKeyw6+Zq5yqno+Xlqmeq5yeoa2YoZudoqWvpaGkqJ6rmJemnZmaoZ6enLChnaKnlZiUmZSho5akn5ihjpaUi4qOj5etj3uVm4KRgImpqIWAmJaKhI6fiHuDkIWFmpGGhYmVjpuXjpCYnqOWmZKQnI1+jWWhs66EiYR3e4+Kfnd5em9neZCBgIlrdYF5iHJpc395dYOHgWp0Y3hmX2hkY2Rmalhre3Fqa1xTTFBEX1VGQD8/LDRARjs0NTs+QTs8Pz4+SE5OT1BTVFZWWFpcX2FjYV9eXV1eXVhWSktMQklPTVJKOzw6Nzg2LzM5NjQuKCYkLTEuLikrKjclKzwoNkNNTEQvVFxRMDVNWzE3RTRcRzU8LECzoLmvvqyrrbGyoKqmsq2irLOwxrCrraSzr7yktJygp6KhnZmXqKappqSms7WelJWdmZmwpq6+oKuikZGempmUkpahnJepnYWdqayitMezn6mkqpaWmJqnnqmcoKWrlJ+fnaCqrqiko6uhrJufn6CYpJ6cn5ywpJmfqJOYmZ2SpZqZqZ+bl2aDknxlfo+aj2N4jGxoanqQo6trZJmXfmeFimVlaWh6jaGOameMl5Gid2tqi5iinphya256hIyGeVhlXYWCXmyLioJ2W2hzd3eRgIeCbniCeH9zbXmEc3eIiI6De2mFWF1qc2Rdc4hpa3xxbWNdUU5XSWRYQEozPUY3P0ZENzE8PT9BQzs7REdISElMTk9SUlRXW15gYWFgXV1dXV5fXVpVT0RIT0tTTj0+PT02NTM1NTU0KiYmJSwqJS4rKyc2KiQ7Jy9BSVtJLjZaTzYpRVkvRE8xWUI7Py49pZ+6vLmvrLKwq6Wora6wp66tsL2xqqilrbCwn62YoKSeopqap6ycrKOmqKmzrp6Wo5CjsKa2uaWuo4+PmqGZk5KboJiZppZ7payiqLPDt6Wip6+fnpWeo56jnaSqqJKfoZ6gqq+pqaOqnqebpp6noKyWoZylsaSYnKuWoZ+bk6WYn6uZnn6+g4hytHKFnoWtaHe5xLhxkqGje6aYmHOqgnzLwMC7cYqjh4KefJaYiJ7AvYKWnZ2MnMHAe4F6kYyawr99a6Wyb4yBb8p6f5t3kYOOgHZ5gX95cXuAhnB4hYyTeWx1kWJlXnhjXmWBYl50aG1kYlhMVklRWkhPRDJJRT9EQj4vPD8+QEE6OERDQkNFSElLTU5QU1ZZXl9fYF9eXl5eX19fXVxTTVBHVU5BQD89NjQ2ODI2NiomJSMpKiYuKyopMTAfOSojPkhbTCojQ1AvI0ZbM1BZL1VBQjsvOJaiuMO0sK+/qamUo6+psK+tprK1r6qmp6Wxq6CrmJuioJybqqeinauipailpbSknqOTpq6suLSnr6KSkZmdpZKRoKGXm6Cdh6aqpKutv7+xoamuqZeSn56imaOkqqOToKGenayup6umo6Gln6SknK2okaSbqa2qnJ2rna2il5iml6KkmJ1/zpR5eqWBepaWm1+tj12OqICgoXynlZp0q4KAr15kjKl6qIeFn3SXkoizY4KrhqCNjbNqhK5zfJaHuGGCrVmjzW6QdXvbe3+ZcX6IknV/ZXuIdnZsfYdufYWQkX1rgI1fcGpvZmBfeGRbcWhqY2ZgUlRTV15KT0M1QUhFRDg+NjtAP0E7PThAPj8/QkRERklKTE5QUk9TXF5fX15dXV9gYF9fXVpXT1VKPT8+PDU1NzgxNjQoJyQhJywmJi8oJiszHTYwJDc7U0wrLC1KMCc7XDpMLSFQQEY0LjGtwb+/tLSwt5iekaOqqa20q6ayrayspKymsKqhp5uappicoq+foZ+op6OloZ+wrJuelqaurbCrqKyglJKbn6WTkJ+kl52no56to6uwqL/Gs6ipsa6Wkp6copehqqqflaGenZyurqapqJulpaOhqpKss5aloqqqnqSnp6KxopObp5uhm5WUkZegcIWMmHWEqIdxsHydcqx9oJ+BpY+ed6uCfa1/nHKtfquHhp92mJJ7fJd+qoihi5GLnH2reoiSj59/eq1WnMR6j2+SwX2BlW11cIxtZndlhm9hd25yboiKkY+DbI+OZG1zdW9gZm1kX29oam5mY1dTXGBaUlJDOElJQEM8PjxARkRDRUE9PDw8PkBAQUJFRkdFQENJU1dZWlxdXl5cXl9hX15eXVtaUkM+OzkxNDc4NDUyJiMfHCAxJyAxJx8nNB41LSY3PVdKLTwoPTEpM1ZARiEcRztDMS0rr9PFxrKzoJ2jjqOioq2utq+psaeoqqiuq6umoqOdmqOVn6arn6KmoKmoo5+esK2Ym5aop6+sqKepnpeVmqOikpShrJqdpqOvrKOstam5zbKtpq6slpWcnaKZn66snZahmZ6eqrGnqamaqaejoaqar7GiqKyvppmmq6qrsqSTmKSmm5WShaRqpHWJeql1erJxgqWJmIxwh5+ah6RfYFKrhH+ugpt1roKnhoafepmXhXtmgKOJpJiGgaN9qX6BlIauXnuoVZ2ikoF6o5+AfMOvxYxzr7SzuXFiqa/CdGiMjJeOgWyYkW5seHh3bmtmZGRxcGZ7aWNcVl9pWFhUTExRTENDQUI7Q0FAQkk8PTo5Ojw9Pj4/QT04NjtETFBSVFZYW15eXVxeYGFgX15dXF1bU0lCNjc5OTY2NCwmJCIgKCciKy0iJC4hMy0mQERXSCxHKzU2KjFQS0wjIEE5RDQsJ8LJ1dXAoZmrqKGvop+wtbCvqa2jqKeqq6uppKafm6WfnaanpqSdrJqirKGjn6+jnpuTqqS2sK6gqZucl5Wmo5CaoqefoKabsaajqLGstsiytamsqpWRnJ2imaCltJ2aoZScn6erqaKtmaqnoaGpobOtoqqzsqKcqqiwsLellJekqJmdknyqbJ6Eh3WreXywboKki4iflpWelYHSt7S4yYCBsl5flKmDpIeHoHqYlZl4qslzmaOUp6iQkpqMfpqJmsbGd2WhgqVzgZ+Ogn2vXm+1Y7F1S6OGbadHgpNkjo+ckntvlZB9bnl0fHptW2VqcnFmgWpeYVhjbVxeWUlMTEtFREJCPUE8Qj9KOzc5Nzk5Ojs7OzMuNjxBRklMTU9RU1daW1tbXV5fXl9fXlxcXFxcWE1CNzU3ODUvKSglJiUkJiksNUZOUFBNRkxKVkYqTDAvPi00TlRRHRw7PEYyLCSopMDGua2psq6spaKdsrmsqqGmm6imqqyppqCmpJiro5+uq52moayanqmlnaa1n6KXk6irtrKsm6acoJaQpa2SmpymoqCqpq2hoqepsLTCsbKqraiUiZidpZuipK+ml6GVmZylpamZrpyspqWdq6O2rKCxubCenK+otLS0ppaYqaSboY+CnU54moF/n3qEo3yCpISGpp6cnpSEuHt8ebmCf8zGw7Z3m6GQi59+mpaXiXafl4qkmKSnfq+Em4OehKx9mZRhpWyjcI+FkIF9l4RyrGCkcnGAmmC8fVJVdY6Ro5Z7fJGOh3J5coN9cFxsbndyaoBuWmNfaG5iZF1MTFFTQUhHRkk5OUs+QjEwODg1Njg3Ny0qNT09P0JER0lMTlBUV1lZWltcX19eXV9fXFpaWllVU09IQDc3Mi4sKi4rKicmP1FUVldXV1lYWFdVT1RGPEUyOlBbVBwbNj9HLC0gjIeZqaykq7mrr6CboayztKafoZWlr66uqaadpaWao6egsq6iqaeyoJmppJSjtaOjlZeiqrW5pJyjnaOTkKGymZ6bpqSgoq+tnKOoorWxw7Gtqq2qkYeRnKedo6SdpZeemJmZpaOnmK2hrKOll66lu6yht7eunp61s7mytKiZn7GipZ+Hj9G1w7d5h46FkZOPgKZ4lKJ3i6CShaWCi3GrhoW0bnJpmaOclYmffJeZhoeQc66CpZuijKaKk5yIlJCabXCyXKVzk3qcbJl/e5l+bqlhonFxf59ic7K4aHePk6SYfYqLkIh2e3iNgWxod2l4c25+dFxkZG1tZWhgSlpXWDxIRj9UM0BGPjwqKDYzLjAxMykmNDo7PD0+QENFSUtOUFJUVldXWV1fX15eYGBdWltaWFVSUlFGOjIyMzAvKysoQFFSVFVUU1RWV1dYWFdVVVZUUU9RW1UlITJBSCMpJZJyjYqtv7+8u7Wel6ikrbaho5mVo6mnrqmrmaWhnqahoLWnoqmnsKOUq6OPpK2jnZCamqq0tKSdppypkpSXrqCgnqajnKectZmgqqO1q8KvqaupooyEj5yioKajlpqanJibmKajpZeppqyhpJuspr2slL6wrZ+jsLS7rLWonaqzpamZe6iRfXywd4qBpKWInG2yb6CHrXuhj4OolpmArImFroWglKihopeFn4CZlYB7kn6rgJ2Zloqqd52gj4iTkn95r12jgXymp2SegHyXdGuuXaVrcYWZXWBbjKBtlJClmIKTi5OJeHmBln5qbH1ifXRtf3lfZ2Vwb2dnaEJZX1s9SlMyVDhCQkM3JCQzKycnMywgLzY2NzQzNjpAQ0ZJS01OUVNTU1ZaXV9hYGFhYV5dW1pYU1BPTkk3MDUyLiosQVRWVlZUVFVVVVVUVFVUU1NWV1dYVlVWUUhGSUojKCi8kpqEqcbDtsG0n5qtoK64paOOmqSjoK+uqZ+jnp2tmJ65oKKroK+qmq6hkaqppZaJmo+usKymoKibrZiZj62ioZ2loZmknK2Xn6iltqi/rqSpo5+LgI6bm5+mnpKUmZqUmpqko6OYp6qqoaKeqai9pJfDrKujoqyzu6yvqKK1saqsmXavfpCKnIWHfbqtiZhksIxlla19oY+Dp5abgayKhLCFppmjoaKRhaBbbGqBs2B/rXt6goCxbGdtmZeLiLFafbRbpINryKJln4F7vFl2tVqyfVKvgHqsWIChbZeOp5mJlY+TlHl3jJt8Y3N8YYN4c398YGlmcG1mZWVPVWNcQVRePUgoPjk9NCEhLCQfMi4gKjEvMDQ1Nzk6PEFDRkhKTE5QUFJUV1peYGBgYWJeX1xbWFVQTUpHQzU1My4vQFVZWFdYV1hYV1dYV1ZXV1dXWFdXWFlaWltcWFdXR0I70p+0sbe9u7TBs6Ocraaltqmgi5mgn52zsaieop+dtJigs6iqq56wrZ6sm5WuqKKOiJuOr6yop6Ooma6Tmo+pmqGepZ6Zo6KlmJ6iqbKovK+lqJ6djnyLm5ahoJmQkpqbkZmXqJ6fl6espaOkoqSpup6gxqelqaGstbeur6ihva+urpeBqZKjro6bgIakl5iQgIC4w7qDjp2ThKeYnYKsioKviaecmqWrkX7VvcKqYqS/vX1+o4KD17q3tYWTkoKevb6EaqOBb6uEbp1/erKxx4Nrq7C9rHh3or67dICVjaWajZmOlJp3f4+ZeGF8eWOMZ3iBe2BrZWppYlBiW1NpXEBUYEJMKTw6NS8fHyQeJTIgHSQoMDQ5NjY3ODs+QURGR0pLTU5OUVRXXWFcX19hXmBbXFlUUU1IQz48QT81PVNZWVhZWVpZWlpZWFdXWFlaWllZWFlbW11dXFpWWFRXWruVtLSxv7qyvbOina6mpbOmnYyYpb+ptrCnob+mprGbnrGcuaifra6lp5WUr6yXjIOaka6mo6yhpZyqoJiKo5OmnqebmqCoopidoKysqbitp6Oal5N7iJmSppuTj5GYmI+YlKiZnpaop56ppqGiq7qeqcWjobCkq7S1q7Gror2qsLCcdHaqpLeFZYmfcGesj4qPbm93pJCaoIF1sJqWcJCNcpaoo5uYrqRybG1sZYp4bm2CmXGAemlwaWaJlZWXcWhphYZncIZkXYpjaW9ZXWd+eKZgYnKPkm9mZICNk46hlpWWjpSbeoWNk3RkhndnjGp4fnhkbGNlbGJLZVdKa1k6UGREUCdKOisjHCAaIiwpGBsYLTIuNTo0NTc6PD9BQkRFSEtMTU9RU1ZcV1pcYF9hXV1bVFBMSEQ9OkFCN01YWVpZWVpZWFhZWFdXVldZXV5eXVxcXF1eXV5dW1tVV16ola20qbq5srOqqaKunqSzqpiSvbHDx720qZ6/q6yjoKarn7qjpK2sraWOlq2qkIyFlZetn6Wqop+ko6CRi6WSp5mpmZajqqCWnKWmp6+5qquam5OSe4SWjqaXjpGRmJSNl5Wmk52Wp6KZr6adoqy5n7DCqKS0pqyxsquvram6pbC5l4uhqaW1nImWopiGqZqQlJ2SqrOZm6OsobSXo6GeoaKcoaShlaynjJKTjIeSnJyUkJmTmJCOlYR/pJqXlY2LkpKKj4aEfmeLgHSDdnSHjHGnbXyVkpSTgYGPj4+OnJKflJWUnoCFkotwZ452bol3dXx5aWtkZG9jVWBYQGlaR2JgTlgrRT0rJiE2NDAvHxwhJTIoKjc5OTQ2OTs+P0FCREZKS0tNUFBRV1VWWV5fYWNdXlRRSkVDPjk9QEFTWFtcWVdYWFhYWFlYWFpbW1xeX19gXl5eX19gYGBfWVlgpZapqqS1t66uorCkrZ+gtrGQjqrEu8S5t6mhpZ2bpZ2wqKO2p52ptaankZiso4uIiY+cp5aso6GaqJ6ek5Wjl6iaqZmUpqGjj5qnmaG0uaeqmJqQjXyBlIyhlIqVkZWQj5KXpI6dmKeem7Wjnaart6ivwq+kuKewr7Guqqu1u6KxvpmSpqSmtaKSnaaejaifjJGfo6ywmqGksqqxmaWhnaSrnp6dnJesnpKaopuUkJaqmY2YmJaQlp6Rh6CdlZSFkoyPjZWLgX5mjYd1h3Z5iIR0nGqHkZWVkol9jJaSkpeRoJGalJ6ChpaFeHGUcniJfnF7fmluZF5waWBbX1ltYlBgZE9ZOUdGRT0yPD04LyomKykmHSY0MDY2NTg6PT0/QUFDSEpHSktMTVNTU1VaYGBpYGVWUEpBQ0I7OUVNVlteXltaXFtbW1xdXV9eXV5fYGFhYmFhYWBiYmJkYlxbY5eVpKejsLOsrqOpp62gqLWqkI+co7K6raqroaKZepyisKSlsamWm7imo5SYqZyOhoqJm6KQrp6klqigoZKXmZuui6qWj6iZqIyYqI6euLajpZibjYl5gZSMm5OKlZGTkI2RlqGLnJynnZ63o3+Dr7WisLB0pL+ksqB4e6GstL2Wd66loIqAqX5kXGJ2n46jnYOWfm6UtJyjqK+spGWfoJR0epqXcICZqZhsgKOoimWcpZyQl5iWi5KbkISdmpCUg5KHjo6SiYV3a5CIdodxfIaBgGFpiYuVk4xbdpWRZ2iPjHF5opaWZHeXhoB2l2iCiYJueX5qcGVfdW9ra2dcZWNhYW9SWj1NTU5SRj1AVEI5MS8eHyY0OjMwNjY3ODw7PkBBQkZIQkdGSUtMVFVVWV1gaGdnWFFJPERHPDlWUltgYWJgXmBfYGFhX1xdX19fYWFiY2RhYmFhZWRjaGReXWaclqajobCxrKuppamtpKetpJKWqrSusaWZqaaql3OLna+fqKunk5a4n6CPnKSekH6IiJqejauapJWnop6Ol5GehXSuj4ilmqiRlqOIm7mzp6CZmYuJdXeTjZaTipORkJSMj5OfjZmepZibspaAjJu1nbSNko+9p6F+p6J7pLC5go6Pp5+Ei4WPsamvjImWopl5gIushpydoqirqYiVh5l3pZt6h5yBl6eCgXudsnqKhqCXmZSYloGQlpaEmZpjeYeQhI2PkouDbnGQiHqBcYCBhn+GdIeFlpJ4lmiTdKCadHuZgp2ahJh9kYiBgphpjIyEanh6cHBnZHhtaWxqXGRpaWVyW1xIVExRQEU1LVlUVDYpITA5PT42NDM1Njg7Oj0+Pj9ESUBJRUpLR1JYWlhbYWFoZllRSDlFTDs+YlZeYmRlZGBhYWBiYl9dYGFhYmJiY2ZnY2JhYGVkY2djYWFonZijn6aurquorKCosKenqqWZlK3FvK+glaWntJ2Pg5yrnKaioI2Qvp6ZjZ+aoZB8hY6ZmIisnaOWoaGSjZSJhoCRqI6Hopyjk5adhp65saedmpOPhXB1kImUkIqUj46bi46RnZCVnqOUnauHn7SJtJqui8qIq6+Jt4WNsIOysIWpjqeYjZ18qI9ye3ebjqWWZ5SkebSMn5+nqZOZwoJ/q4iYoXGegJqlfZeFlbKAoX2gk5+PmJeAjpObiZiSi3yFk4aNlJOJg21zkoaAe3KGgYR9hXWGgpiBj8VmgKmHj6JqnYGel4CZgIqMg4iYb42ShGd3dHt2Z2h1cGdoa15ibmxmbFhmRlxRTDJFNDZNYGM3JjQ8REdEOjYzNjU4Ozg+PT0+Qkw/TklKS0NQWl1cV2JeamxcUUU9S01ASmRYXWNmaGdiYmJiY2NgX2JhYmNjY2RpaWNiYmJlY2FmY2JiaZWXop+wqKmopaugpLmxqaummpSeoqSqopWkqbWir3+gppylnp2JlLyZk42gkZ2PeYOWlpGIq5mcm5qihY+Md5ucjqCRiJ6km5WYl4aiuKylmZuNjX9ibY+Lk5CNj4yMl4uPkZ6Nkp6gmKCnfqGnh62doJaukKCenZGGgqCNrLGIpI6rmoyafqJ1gJiTa4GqdEyqeIeNnZKbqamCqqt+hKF7eqdpnn+SbGeXhpi2iZ5+bmBjWIOXf4x7ZGeLc5l9eZZrXXyXbl9TcYVcYGx5g2BZZYJ+hIGYcaeqa4OjbnKlcJ+CnGdknmxabIh6ZVlfgn5hV1BvdmVtdHFqam5eam9sa2hXZ05dWEU5QDRHRF5rNCtJQ1FNTj04NDg1OTs2QDs7PkJPPlFSTE1CSltdX1deX2J2YE1FOk1PTVRiXFtmZmlpYmJkYWRkYmFiYGJkY2FiamtkYmRkZ2RiZ2VhY2iYlp2guaCqo6askaG2vKuuopmWn6Clq6ufnK20oaeRoJ+fppuZjZi0mZCLnoyVi3WBlJGNiqaWlpifnn6ThYaso4eckYqYqZiZmpGHpbCmopWZiImAaW6Ih4uOjomLjJGLj5Ggi5Kdn5uhpX+TgY+joZSgd5yWkKeDoqiAhquvhqV6i32Emn2icHKSh5Z7nYx5bYebi5mRnKmcj4edfIKic3amZp5+d6RemHt9k3Oibpi3tLpzkoiBgLaoZIHGuHtwlbaMcYCbpGN0rKtgfWqds35ufYeDj4KLl3GAo2xzpHOegn2jXpyZs5Zve5ees3RyW56ygmlib3N1cWhuWGtrcnJkW2ddYUtEPUQ1UUFacDI8UkZfSlM9PDM5NTo6NkQ7O0BJUD9UTU5RQEVfXltZWGBge2RJQzhMV1VWYmFaZmZra2JiZWFkY2BhYmBkY19gY2tuY2NkZGhkYmdmY2holJaVo7mZq5yToI6luLWtraCaoZuio6Srm5qxrKqSl6CYoKSZmpSeq5uLiJF4i4VwgJaNio+hkJOUnZd9kYqOqKCHmI+KkqKTm5qMiqinpJ6PloeEfmt7h359j42Di4+PiY6TnoGVm5+coJ+LiXecmKKNoHKii4ipiJynkZeprICujH16oJl5o5N4gHOXiIucfZWfhpuOmZynh6NkoX2JlpCbjGyeaJqNbpqZe4CKp31yZ3Oqg52Cc6pnlJpdm4V2hJ1oqmqBuGZcqXCBnGGVjF6ndnaJioCdaJp1h5OSmI5/nm2ZkGqmmVyofne7an2pWo6EXbNnW25xeHdraVtwaXd4YV5kVmFBUEVPN1ZCUm00SlpZXk5aREAxNTE7OzdIPzpDR1U/WFJYXT5EYl1WYFFhZHxpRUI5TlteWWRmWGZnbm1iYmVfYWFfX2BgZWNeYmRucWBkZWVrZGNpaGdraZWciaq2m6iJY5WcrLqysKudpZuap5+drJmdsKeqnZaimaGfmZaWoKOZhomNaYiAcXuXiIyWloSSlJiPeoqElqOciZWPhoudkZybiI+oop+ajJGKgIBpgYZ5f5aMe4iNjoeOlZl+kqGeoKKTmHJon4qgj4xwkoyCqYiZoKSpoql9sK2koriXdqOzoqN/iJR4nHqqmX+ij56cmImYcqF9hY2wtX1rmpGheH6YtKOjq6iEmHuafJyafnOqWl1ve5eLeJ5iTH97e4VkephCTZ9ZompyfI5ugYqEmXabeYeJsbN/fpqSpnR+nW1xfJRvmXJpo12VdkhlY2BzcHx9bmZfa2h1e2JjX1BdVlxUVkBZRVFnRVJWXGFYX0lEPUI4QEE6SUU4TEVYQVZRWlZERmFcWmBLYG19cUVDPFVeYlplalZnaG1vYmZmXmFgXF1eYGhiX2VkdmxeZWdmbGRlbGhoa2mUnYGxrpmEU1+hp7S6s7OomqKLmqmbnKeSoKujoKeOnp2cmpmVmKGdloeHiXeFgW55lYWQmot9kZOWiHKAiZKgm3KSkIGImZSfmoSOqJuZlYuKinyEbISFcYGhjHiFjYiHkZeTe5Gin56jiK6GfbWEj56de6aWeqmClp6Ri6Kefqdod21+mXOgc3F8nYaZb5KCrXyjg6efm4GkcF6paHWjY2+lYZzTj3x6mXhyc2OihY9+onKijnVrj7OLYIKYinOqsqe8f3eDbX+/pqq0XpxvfnKXb4FzonJepGd0pmBopmya05h6gptudnmXa5t5dpdybKmlZ19keXB/hGtnZmNtdXdmX2FRWmVQUWFIV0lUX1dTW2RqW2VRRUNLTEpLQkpFOFBAUE1YU1hPUlFgZWVpUmR4eXdJRkVjXWVaaGpTaWhqb2NqZmBjX1xdXV9oYmFoZXxkXmRnZGtkamxmaGxomJt/sKxUXEt+qa+ytbCyo5yYhJemoKCjjKSnn5eoiZmXmJOZk5Ggl46IhXtwfYRofY+Dk5qBd5GOj4lwf4ePk5JsmJR8iZGSo5WDjqmak5KLhYl5g3aIgG6BnoZ3gJKFh5iglXmSoqOZoImzoaK2i3qsp6SupXCpgJuRhoGdk32kgKKZhphxnoSira6Jl4t/jKSNlYOvopV2tba1yaJ0lIuCnmGel6lteZWGoJt1oYd3oH2QloqBb0xmo5JwmohzpXt5dGKDgmx+oGxyZGCccn90l2t7arS1tMamc5h+epxqmpqrdIGabHN3l2mZeXSXcVBEfbNeaXVqeIdma2dic3RwbVVcUlhnT1JoSVVMWFJVXGdrblVnV01KQUpNSkhKTkFRSlBkY2ltZXRyc354e251iXp7VFFPbV5oW2tpUmpoaWxnbWZjZV9cXFxfaWJkaGt7X11kZ2NqZm5tZWlsZaKciK+nhWY/lKGzrK+vtaKij3+Wp6Kho4ukppybpYGal5aNl5CPm5OOiIN5anmGZYOMfpafeXWPiIyCaYSFkoOMhZ2NeoyKlaWSgpeol4yRi4CJeoB9i3lwj6CGeYGUhoiVnpR+k6WnnJaWhGdueJxsomR8caV4nJhwaKeCmI18pHqgloOWcp92gImUlY+5bY+KomJ9maKWiW5zaqtrdaBtb6Zgm2mLkGmWh5qVdaKAfZpfi4WMdW+IYmihZZ5/aZt1cGRniIJucqJaX1tjoW5diYxwe390cmSlbniiZGanaJdyi5huoW9SiI9uoF5kp1SLXVSYbW1yanGBbXBoa3hza29RVlVVZVlTbUlYT1xIWGhoc2pZa1ZQUkVWXExYUmFVaGped3V6fHB8fHKCe39zdo2Ag3ZeUXNhZmJxZ1BraGhrbG9oZGdfXV1dYGpiaWl2dV1cY2hjamlybGZrbWOdpZmmemV0bYunrqWqsLGmn4t/lqqcnaSLoaGZoaGAlZiTjZqPi5eQjot7hnGAiGiLinyXmnN0iX2QfGWCh5WKiZaZgnyIhZamkIGhq5CFkIqBin2AgI5zaY+lhH2Fk4yHl5+NhpGppp2JpniWnH6liZaMspmekYOvl5+leZeJeql0po+Emm6looyShIyDvG18pa+Ch4aHlJedoX2me3KolKCWZ55+b6xjloqVkneobKmigYl2h4J3q5GmiGuRsGt2s4ypbIuGb2+gnpGUYX+ri6p3gX+Op593n32FpJWdoGmah3WsZp6tjLZzdr6Mo5NZg6aNq2B1cXNve3VwYmp+bmdsU1VZVWBgXGpMXFFcSV1sbXZgW3FYW19aZ3Nlbm9xY3F0YHd6fnlyeYNyg36Be3uMgYKAdmJ5ZGNuc2RSbGdnb2xyaWZpYV9eXGFqYmxsem9cXGJpYW1pd21nbG5ilaaqnIGAnqSWqqqeqKeuo5iIgZaqmZ2jiZqknKidhIuaj4WckYWSjYyMdIV6iINvjYR9l5NzdYZykYNuf4uShoaUj317goWXpY1/paWNgI2JhJR1goeSb2yLqICCi5ONiJueiIuSqqKgkIB0lJeIfoF5lK+kf4GccY+GeZKMhYB7cqeMcX19epeWm4SNeHt9fYiUlZOLd5GZoKGEe36Ja4yFW3l5c3lwaW5+kopyf3SBj5STcYWDgmWNf1+BgIx3dnSUdW97b2+JboSGXndpeI5mgoOGj6qcf3R9l2qJiG9/dXyEdW1sZoxzd3uXd4Raald5j2htd3Jxb3d4b11shm1pZ1ZZXldcZGtkVWFUXlFfb3d5a2p3ZWpqanV8cHF0c2FvdWJze4F4dXmBdX+Af4B5i4WCfXttf2xkeW5eV25naHVreGppaWRcYFpjaWVscXVuWltia2Rsa3ltaGxvYY6Vuamni6Gim6akmaSdq6Kfg4OWqpGdoIiZppqomIKBm4t+lpSHjoqJjHKCfI99fo+EepeOdHKEcJWGe32Si4aGkIV4foCGmKOMe6egi4WPj4SVgoaOmHdxhKqFjZGcj4eenYaKmqifoKqDiY6Vm39+ipetqJCTp5B4cZ6Tg3uTcH+phnB9lXFqb3yBn4t/kY6LaG5dhIyMnJygj3OWjIhxdGuCdnSAWXJuhpGCfn6LaV1pY3qFg4iAX2l4e5x8g42DdoGHg2l5jIhrYnFyg3dfco2CipColodnjY+DbneLgm+Di3duZGZjeYJ6lVpbaWZtdlt6eHd0bXNygmZcbYpra2JZWF1ZWGtxW15gWV5dZXJ9enNvdGNqaml7fHJ6d3RkbXRobHt+dXp8e3l5f4B+b4WJhHt9c355cn9oVFxyaWx2cHVna2dkXWFZamhranFybVdbZW1sZ3J5b2hqbWCMjKqxoZCjoZqfnpiemaiioX2ClquMnpSHmqGQpJR/e5iEfJKZiIiGhopyfYCLdoWLgYSWinJvgHKYh4N+koOEhoqBeoCDi5qfj4KmoIZ4jZeIlYuLnJeEg3qsgZCXmZOJnZyGh6Gqn6Gio4uIk5udo5mWqqKop6GTnImYkHx5j4+FqH5+kpGSk5yxpZqUnY+NsZKYhKaMjJacoIqRnIOJkoprfI52d2WChpCKfYmdhIeLj4eIgIWEkHd8e3Wbo4mIi5+LhpV/fo2CgXZxdIaFf3iJiIuRp5GEh46Ig4yQi3uFiYeNf3VqgYN7eZlpcWhgc4pwfXp3dm92c4FcXm+HZ25fXllaXFJncVVjW1thbGh0e3xybnBjamlof3tteH5waG9wbGaAe3KBgHd/fX+Ee22DjIZ8enh8fnqDeE5kdmpzbnF7ZWtlYmJgW3NmcGZycWxVXWx0bWh4enBnaWtljYieup+WoqGYlZmYlJikoJ16f5ipjZ6MhZ+cip2WfHiUgnuOmYmGg4SHbXiBgHKAh36Ik4Rta356l4eEg5B+gIaEhn2Hg42bnZGGqZ6CcoqPhZKRi5yRfY16qYONkZeVjpyWhYWbpp+imp2Gg5KamZmQmaagpp6ekJeCk4t4fYiPhaZ8fI+QkYWYqaCck5yOjamNkYCejYmUm6CDj5d/h46DcHiGcXRhfoSPhnWMmICDj4KGhH6FhJVueXZ1k6OMjYabhYWOdYGMfn1yc3yJhHt5jY+Fk6iQh4SPgoOJiYh1hIaGiXptan1/em1oa2xmXnl+Z3x7dnR1dXp3XGBwfW10YGNaW15RZm1TZVpdYWpodXp+cGxsY2pqZ4B/a3J/a2pzbnhug3luhoB2goB9hXZygo2Hfnt6fH97gotgaXtrdWhpg2VqY2BpW2N1aG9idW1rVGJxeWVveXpyZWptbYuKn7iaoaSfkpGWl4uan56denecpZCbiYaklIqYmXh5jYV8iZGDjIKCgmx7f3hygIV9ipB8a2h9gpeJgYiOfH6GhId8j4CPm5uQh6acf2+LioyShqChioWMfKeQh4+SlpOWknaMo6ChnZaaf4GQmpmTjZqioqSbmJGcf4+GeoGFj4ihgH6MjY98l6SgoJKZj5CmjI+Bm5KJlJicfpOTfoeOgXZ0gnB2YH2AjodyipZ8iIxxjH6ChYWPaXhyeY2Zk5CAmH+JjHODiX19cXp8jIV7e5KOhJemlIyGkXyEhYaEdICBhYV4ZHF6fnh5cGtqZl59c2d8dXZzfHN/al5gdHZwd2RjWF1eUmpoVGVYXmBnaXZ4gXFma2NsZ2V/gGptfWdtcGp9d4V6a4uBcoGBfYF0doKMhn98eoCBfX+PanKDbnRpYohpbGJfcVV0b21uYHhobFdqdHZjdHp6cWJrb3mJjZ+zkqWlnI6QmI+GnKCam3t1o5+Nl3+MoYqImpV4e4aHfoOJfoiCgX9wfnp0dYKFfomQd2djfYaXi4KKjXh9gI2DeZaAlZeVjZWfmn1vi4GQk4alm4eMiYOmlYSSipWXkpF2kJ2hoZiUmHp/jpiXj5eanaSemZOUnHuRh4R4hpeOnn6Cio6Mc5einaCSmI2PoYyLg5eYg5OWmn+YjXyJjYF3cn5ue2SAfIuGcIaTgJCCa4eDgYCJhWZ2b32Ik5mNfpR5jIl9gYl9fHKAeYuGeoWSi4yZo5eDhIx3h4OCgXV6f4aDc153d3xzfXdma2NgfmlqdnNzdX1xfGNjYXNudXJtYVlfXVprZFJiV19gaGt0eYZwYmpjbGZofIJraHRobG9of3yBeWyPhXGAgoJ/dHyDjIGAfnqCg358kG11iXR0bWWKbGpiY3VWg2lwbmB4Z2xhanZwZXh7eXBfcWyFhZCdrpimqJ6NjZeHhZ+Slpd8dqibiZh5lpyLjJiPeHuAi318g3uAgoF4c3h5c32Ag3+IioBkXn2LlYh+hYd0fX6Kf36XhJaTloyjoJd+cYd7k5GKpo+MjoqSoJGDkY+Tl5CKgI6XoJqSkJJ0gI2SlImdnZ6nmZiOlZh1j5CLbYaZkJp7h4iQiW+XnZmhk5WKjJ6MhoGTnH+Tk5aHmol8ioqBenJ6a3VsfH+Lfm6FkoOUeG+ChH5+i4Blc2p9gZeYhYCOdJGJhHmIfnZ4gX6HgX2EjoaNlaWReYWCdIiGfH9xc36FgWxfeXR4cHtuYW5iZHthbW92cnd3c3NhdmBvbHVub11bXl1dal1PXFdiYWhtc3qJa19pZWpjaHeHbWZsaGlsZ4B8endukIhzgIOEfXSBhop6g316gYR9fI5yeYt5eG5sh2toX2lyY4docW9ldmdtbGF6aGp8e3dwYXdti4GZmqqgpKidioqRhoqdipSXfHasl4yWfJ6TkZaUiHZ9e4p8e4B2d3+Ab3Rzem+FfYGAiX58YVx+j5GGf4SEc3qAhnqPkYaRkZuSpJqTgXyBfI2KkqOIjYqNl5qNhZGYk5WOiIiLkp2TkIyNboSQj5GJnpmioZeXiZeScIubhWeHmo+Ue4mFkIpwlpqToJGRiIqZjIJ/kp99ko+TjJqPe4qFh3RzdmtxbnZ8i3RuhpGOknF0gHyBgoh8ZXFten6blH6FinWRi4J1iXpvgX+BiH2FjYqGjpaqjnuIfX6KhXd9b21+g4FiZ3dzdG56YV1vYGp0XnBqenl4bHJwZXldbWxzbXNYWl1fYWpaT1dXZGNmcXF/h2VdaWhnYmdxjW5kaWdlaWeAend1bo6Fc4GBg3x1goiFeIV8d4OFeoCKd3+Le3tyeYNqa19waHN/a3FubXFnb2tle2Juf3l3cGt2d4l/o5iiqKGmm4iMioGPnIaSm3SAqZSRjYagjJWTkH9ze3aFd3h/cnN7hWtyb3ltiXZ/gIZucVtZfpKNiICBgXZ1gH9/oIaPipGcl6CTlneJfoCMiJydiY+GkpeWhYiUmI+Wi4uMjYydio6QhG6Ji4+RipyWoZyYloaYiWyGpYVnh56Lkn+MhIyBd5OYkZ2QkIiJlI1+fpCZfJGNkI6akn2LgINvdnBsbW9we4Zpc4OOmIpwd4B1gomDeWdzb3aCm499ioV7lZJ7d4p1cYt8ho17i4eFio+cpYl8hHaBin93d2xpfoB/XHFycW9vd1ldb2Bval5vanx6cG1tam13YHBva3FtWVhgYWFtV1BTWWVmYnVvhIJhXWttZGJma5JtYGZmX2drgXRxcm+LgHR/goB5doCLgHmGf3eHhnaDhXuHjIB7dop/anFifGKFfG9wbHRqaG5sdndfcX54e3R1c3+CfqWVmq2fp5aFjIN+lpSCjp50ip+TkoWKmoyVjYt6cnd0gnByhXNxdYhsbmx1bYh3g31/bW5VUYGrlIeCeIB2coJ5gqCCkYGSkZebkZh3kXqCjJKkmpOOiJSYkoOGlpiLk4uIjo+InoSQin1zi4WIj4icmZ+blpWAlIBph56JaIehiJOFkYSKcYORl4+ajY+Mi4+Nd3uTkXuOi42Slo18iHyBa3dqbmtsbXp/Ynl+jpaBdnqBd4ONfXpodW11iJeMgImHe5SRcnuGcXiOe4uNe4l+hI6Rn5+GfX14gYp8dm9oan+Ad153b21rcHJVXW5hcWFfbG55cGdwZmZzdWhxbGF3ZV1WZWBgcVNQTltlZFx4cIh7XlxocWJiZWWRaV9nZFtnb35va3Fzin12fIWAdXZ/jHl7hoB4iINzhoV+jIyEfHmVeGZxaoNfh35vb2t6YGltdH90X3N8eIZ3c3OFfHmhkJqxnKWOgop/gpmIf4qcfoqYko6EiJeOjo6EdnR2c4Bwb4VzcHGDb2ppdW2Cbn18bXVzUk6C38mS1pN8b3SDdYOfgpF2lJCYm4+Ye5NyhZCfoZOTkImSm5OFfZWVh4yNh5KNiZx/joF4eox/iIyKnJucm5aUeo53aYqTiW2JpYaTiZiDhmOMkZiNlImVi4yJi3B6lYl8jomLk5GKeoV8f218ZXNva2x6eVyAeY+OgHt9fn+Gjnt6aXVrdIyQioOGhn2WjWx/gHCBjYCOiX6Ee4ORlpubjH13eIKPeHJrZW59gWppdG5naHNsU15vZHBaX2xyd2Zra2JneHNvcWNfd2BhVWtfXnVPTUtgZWNceXGKdFxbZXVgYWVkjmNgZmJYaXJzbWtxdot8dHmGgnZ3fotzf4Z+eol/comHgZGKiH1+mXZlc258ZYd/bnBrgFprbnh5cmB2enuNdnJ2inZ5n4ybr5ugkIKFeIiUfnuInIaEnpCOhYyXhJOOh4F0d3B5cG6Eb21ufnJjZHhwfG56fGpobGOkmsHcru+ic2t1g3WEoYSRbpWPlJ+TmoGRcIWLo5eJjpWKkJ2Vg4CUj4SIj4CSioqXfod7dX+JeIaFjpual5mPkHaLd3CIiox+jKWFkoqdhYZei5SXiY6IjYqKhIlsfJeCfYiGipGPhnaFfn5rfWN4dGpveHNYiHqRh4V6f3+AhYx+emZ0aoGLj4uEhICMmIZsgndviZKDkYV/gnuBkZeUm5F1dHiGjHVycGVzd4Bgc21vYWh1ZlJgcGdrVV9udHlhcmNgaX1xcm5bY3JhY1ZuWlx3TExMY2VhXXZzim1bXGR4XmBkZYRfY2NeWWlya25rcneLfXN3hIF4eHyJcYOEfH2Ie3SLiIiVhox/f5hzaHVxeWyLe250cIBXcHl2eXFkdniGjGh2gIlxgJ2Imaeco5KEfHCMlHd4iZyDhJ+NjnyVjH+Zh4R7cndwc2pvgWtpbHx0XmB4dntwdHpnYGV869q1ycPciXNsc4B2ipqIjGmXj46ck5GBiHCFiKCOhIqVioyXk3yNkoiCiI96kYuGj4KAd3iDhHKHgpOblpSYho12h39xhoOKiJqkhJWNn4SJYYOVj4WIhYiMhoCHaH2Uf32ChYmOj4Jxhn9/cndndnJpdHdsWox9koKFfYCDgISKgnZidW2KgpGMg3+Ak5J+boNteoiRiJOFfYJ+gZOUkZiKb3J6jIV0a29pcHZ+XXNoblxpdV9SZHFoZlNfcHZ0YG9gXGiCcXJqV2dpY2lYbVdbdExKTGVmXmFyc4VpW1xleV5eZGd6YGRfXVlrbmVuanR3in5zcoF+e3Z6iHSFg3x/h3Z2ioWPmIGNgnuTdmx3dnl4knVud3p9WHmFcX9uZnh2kYJkdoaFcYqWhpmhm6KKhnNvkotydo2afImZiIl7n3+DmX+BeHF0bm9kcn5oZmx3d1tfeHt6cXF/aWFnYX/Vto6RpnhucXd7cZKQjIZqmI2Im5CKhXtoh4uZhoGSkIaGl417jIyAgImNe5CNfomFenV7g3txhoCVmY6SlIKJdYSIeIWBjJWeoIeWkKB/iGF/k4eDh4OIjH9/gmZ9kYB+f4KMj5B/bYN8gnRrbXd1dHd2a2ONgY5/hH98hH+FiH9wYHRyhn2QjoN9gJKKenGEZ3uFjIiNhHyFf4GVkJKUhW9weYt/dGxtaWp3emFnamlYa3VaUmlyaWJQYnJ4bGJlXlpqg25zYlxnX2VtX25UWm9OR05mZFxmbnKAa1pbY3NfXGNrdmRlXV1abGxibWpzdoaAcW9/fH10eIZ4hYN8gIh2eImBkpV7iYZ2iYFveHl7g5JvbXuAdl6Df3OBbWh6c5RzZ3OHfHKSkYSan5ughoZ1dZR+bXWSln2HkIOKjZl8jJp2fnZxb2xqYXR8Z2JpdXlaYHd7eW1xfmVjaGhXnY9fcnOXvMSEdnGUiI99cZaLhpuSi4dyaoiPloB7lIyBhJqMfIqFfHuJi3+UiHWJhnZ3fYFydYaBnpSFlI+Dg3KAinaGfYuanpqHlY+dgYlmfZOCfoSCiIlxgX1mfox8eX9/h4uPfWmAfYN2Zm95eHN3c2xrjoWKgYqAeIKBhYSBa19zeXt+jouGfIKQgX5zgml6hImMhoV5hH2CmY2RjX5ubXuIfXZ0bmZle3RiW3BiV25xU1NtcmhhTmZ0eGZgXlxZb4Bvc1llYl1qbmBwT1lrUURTZ2Baam5tfG5ZW11tY1picHZkZ1xdYGtpY2xqc3aBg3Btf3x/dHWDeoOCfIGFdn6IgZaQeISLdIGIcnl5fo2Qb297gHFpgXh6fm1se3WVa2p4hHRrk42Fn5igmYSIbn2Mdml3l45+gImClJeJeY+Vb3pzcGxpZGBzemhfZXF6WmByfHlncXphZWWPsbJ3S2JapdnQlnF7kIqPd32TioSYkIuFbmuFkpF6eZKGgYSYinyGf3h3iYqEloBvi4hxdX56anmFg6WQhJONg39vf4R3hXqHnZqVjJSRlYWIcHuSgnyCgoiDboB3aICEeHJ/gIOKh3xlfX6EdmNwc4BpeHBvdZmNhoOKfHZ4gIV6g2tccn9zgomHin6HinuJcoJucoWIj4aGc4R6gpqNjoV5bm9+hH92emRmaHtvXlh2WldwbE5XcXNmYEtsd3RhXVtaWXR9c29XZ11manJgb05XaFI/WGZeWnBraHpxW1pYa2VaY3B5X2hcXmVsaGVraXF3f4hvbH9+gHVvgnp/gn+Cf3aBhIiXiXGCjXF7hnx6eYOTjHVqeX5rb350f31vcnt6k3BvgX54Z5KLg6GZnJGChWaGg29neZWIfX6EgZiJgXyNjGh4cmtsZl9gb3ltX2JveFxka4J6YXF2X2Vl1Oq9izI6PouOf3F4hYeNjXWClYx+kYyLf21shYyMdXyPf4WBlYh8gnhudoeEg5d3boiFbHV7dGZ5goOni4KOi4R+boB2eIV7iJ6SjZGTk46Lh397koZ3foOMgmt/cmiAfnhtfHyCioN3YXmEgXFkcWh+bnVxdYKbi4B/hYBzdX6Bc4FvXG5/dXmLhIt7h4F9iHl7cm2JhJGFjHOCeoCXjIyAdW1rdoCAdXRbZ2d1bldWe1JZcGRLWnJyZVtJcHhvXFtbWV10fnRoWWJbZ2ZvZGpNV2ZRPl1lXF11ZWB1cFpZVG5kWWRxeVpoXV9mbWdpa2lwd32ObWmChH55boB8fIF/gnp1gYGNk4RwgItud32Ae3uHkol/aHp9anN7coV6c3d+fox6eIR9fGuMjYSbnZaMgYBsjX1raH6Ni3p+foOTgn59iohrdXFnaGJbYmdzb19ha3NgaHCIemJzdF5jZJugj25cNVqvtXRpgIh8koZ1hZWFc46KiXZwbIWDh3V5iXiJfJOHeX5yZ3WJfn6Yb3GGfmh2eW5meYeEpIeAhoyJfm5/d4GCfo6biIOVkpmKi4WJfI+IcHp9hHtofmxqgHt6anp3goeAcmB3gX5xZHJndoJtdXuGlZGBfIKBb3d6fHV/bVlwgHd1jYOHeIh2g4l7eXRvi4GRgoZzf35/lImKe29uam2BgXRtXGZkcnBQWnpNW29cT1tyb2RVS3N4aVdZWVphcIB0YF1dYGdkaWlmTlloTUBgY1tgdWFddWxYV1N0YVpkb3JXal5iaGtnbWxocHd8k2xohIp8fHB/fnuBf4J6d4B/iouDcXuIb3F3g397iYyPg2p9e213eHaKd3x4gIGHf4N+fnpthIyImKONhIN6dYt4a2yDh5B4fXqBkX9/foqDcHJwY2ZeWWZfb29fYGdwZmpviXRhdG9bYWRqdnuAv5ympMi4cYWDcpJ8d4aSgnOQi4dxcm+De4N0dId0iHeUiHl5cGN3h3qAk2lyhHZnd3VjanyCiJ2Bf3+Oj31zgHWGeoGTkYR6l4+WkIiCiXuIiGt4eX50Z3poa395c2l6doCDfWhgd4d9amp0aHuAaXaBjJGUfnp+fnB8dnx0f2JWeH5zc4uFgn2EcYeJeHlxcYSDjoB/en59do+GhHdqcWlsh4Fxb1xmYXFtSWR1S11tVVNZcm5iUU90eGFSWFhdYXCCc1thXWhlZWRrZFBbcElDY2BbY3BeXXdoVVZVdl1bZW5oVmteYWlnZW5uaHB3epNtaYiMeX1ye355goGBfHV8g4iGg3B3hHJtd4KCfomLk39wgHt3eXqBi3SDeH6BgYKEeoB1b36Ki5ueiH2FeneFe2d0hYyPeX5/e4iFg3aPf2dvbl9kXFhlWW1yYWBgcGxraIluYXRpWV5kboB3qdqqx4aHsnGJd2+MdHqFjX96kol/dHN0fneAcHF/bYR0lIV4dWtgeoJ5iY9mcYRwZ3ZuW218gJCTf4B5kZN+eXxuiXeCko2FdZeLko+HhYV7f4RsdHZ+bWd2ZG17dW1pd3Z/f3xhYniGemh1dWJ9e2d1ho6NlXt0gHZxgHt9bYBaV3V/cHaFiH+Aem2JhnR6bHaBhIV/fH55fHSLgn50aHRlboqDbHNZaF5zZEdtbUtaYVdWVXdtYlBSdHZYUFZYXmFxhG9cYGNtZGReb2NUXXJGQmVfXWZnXVt7YlFVXHVbW2drYVZqX2BuZWZrcWhwdniOdGuOjXV+dnh+doGDgXtzfYOIh4NvcoB0cXV+hYGJjYp7d393g3t8hYd4h3x9gX6EgHt+c3Z5jI6gjYl6iXZ0g3hefYWYi3iGg3SFhoR3iXpibmxbYltbYVZpc2NgW2dub2aHcWFxZlddY2x/fMrOh7mham1timxxg3F7g4l+epCEeXhzeXV1e2psdmOEdZKCdm9mXn2CeouKZXKCa2pxY1hteoWbiIKBc5eUeH99b4lyhIuNiXOYj5GJhouDe3l9cHBvfGZocWJteHFqa3F4fXx6XWV5gHhpdnhmgndndIeMjpR9codqb36BeW99Xllzf251gYt8gm9wioBxd2l4gIKAgnd+c3t1h317c2dzYW6LgWtxV2lddltHbWpMVlReU1V7a2FPVHVyUFFUV15idIVpXWBsamZjWm9hWGNwR0BnXGBlXlxWe15OVmVwWVtqaF1XaGBecmZrZ3FncHN3hnhulYp0f3p4fnmCh4B1cX+GhY6DcHB7eHZ1eoaFh4yFenx/dIt+fYaEhId/fn59h398eHZ4eJGTn3+MfYttdX94ZIKGlYVzkYpvhYWBeoN0Y25qWV9bXF1UZ3JkYFhkcXJmgXNia2VXW2Bqf3e+rnugtm5ic4Zoc3txeIGEen2Lfnd3cnZve3Zlam9gh3WOgHNqYl5/eHmLhGZxf2hra1pWb3eJo4GEf3GZk3KBeXaEb4KDk4l0loqOiIWJhX14dHFuaHhfamxfbXZqZ2preXd6dlpnfXx4ZXN+boR0ZXWFjYaWf3CMZ2t6hHVudWJdcX1sdX2Me4Jmdod9bnFpdn95f4Bzfm17fIJ7eHFmbGJtiX1sbVVpX3ZVSmlqTlFOaE1Ye2hhTlV2a0xRVFVfZnWDZl5gcWhnYldpXVxraEpEallhZFZZVXlZTVZtallda2RcWWVjXnRmbGRxZ3JwdYF4cJmFdn9+d398hYd9dXKCiICVg25zeXt6c3KFh4mIg3mBfXWPfnyEio6EgoN6fouDe3Z7d3eanZd6iYKGaXZ9e2yDhJJ/cY6BcIWCfoF/cGZsZ1hdW1xbU2RwZF5XYnJ1aXVwZWViV1xcaIBwb3KAc4lkZHh+aXR1c3KBg3eAg3h2c3Vua3pxYmdrZ4Z0jYNuZl1ffXB7iX9pbXlnamRVV3JvjaZ8hHt2lpF0fXN9e299fJKHeJp9iIeDhoN9dW9xbGd0XGxnXmx0ZGdlaXpve3JZZ4F3dWhwgXiCdmJ3hYt8lIFvjGpte4JxZ3NmYW56Z3N4i3x+YneDd2pscnZ7cXt6dH5nf3+AeXdvZGZibYV7bGpVaGJvUkpoak9LTm9HXXtmYU1VdGNKTlNXYWp2fmVdZ3NpZmBWY1dicF1MS2pYY2FVVFVzVkxYdWRZXmtgXFpjZV92Z21icGlzb3J+dXSZgnd/gHd/f4aFenx0goR+l4VucnR8enRxhIWPgYB6i3V0kH98gZWOgIWEfH2Mhnt+gHZ7o6WKeYiFhGt1fHp1g4CLem6Ec3mEfIGDdW5qaGVWXVtaWlNibWRbWGFze2lobWlgYldfW2qAamtvgGdrYGh5eGpzdHNtg4B6f3x1dG16aGp5al9lbmiBdpCEaGVYYndqfod7b2pwZ2ZdVFhvZ46od4F6fJCOenZxf3B0d3qQgXmWdYaDgIWIdmpxdWdnbltsY11tcl9nYWp4aHttW26CcnRqb4F+endhd4WEeI+Fc4hyb3mAcmNxaVxxeGRydIl8eWN0gHFoanp1cm15eHZ5ZIR8f3l3cWRkY258fGpqVGhhZVNKa2dPR1FrRWB4ZmFNU3JdSk1UWmVrdnplXm1xaWRdVmBWbm5XS1NoV2VeWE1VbFRKXHlfW15rXV1bY2VgeWhsYG9vdW5wd3V6mH12f4F5gICHhnp4eYJ+gZOEcXR0f3l2dISIkX2AfJBrc5WAe4KfhX6HfYB+hoKAint2hKuff3qIh4NrcoF5dYB+gHRuhm58f3OKgGpvbWRkWF9aWVpUYWpnW1pedIJpXm1sXGFXXFxsgWVydH1paVxrdnVnc3ZxbIR7fXx4dXJseWdpeGZdZXNneneTgWNjVGVwZ4KFd3dnaWpgV1ZZZ2OPp25+d4CLjntxcn5oenB7jn14kHKEfn9/hm5kdXJkZ2dcamFcb29cZ19tdWR6aF10gG9ya3J8fnV2YnSFi3uIh4GAeHJ1f3VhcG1bcnRjcXOFfHVlc4BtYW17cGtqe3l2c2aGdnt7dnFlYmVtcn1pa1NnXVxUS3FiUEZWYUdidmZhS1RvV0pMWFhna3V6ZGVucWZkWlddWHZlVEpcYldnV1lIV2VQSGJ4Wl1fbFteXGFjXn5pal9udHhtcG52g5d5coGAfH+JjIZ+dXWGeYeMfHR1dYJ5enqCjI59foSJaXOWgXqKnX1+hXqBen98hohzcY+tjHt7h499ZHGHeXN8enVyboVse35sj3picG9iZV1lVllZV2Nma19dXHKFaFhwblteWFpcbHtjcHd1bGJZbHNzZ3R1b2yDeH5/eHZtbnRkaXRlW2d1ZnZ2knlfXVJmZmqDgnR+YmRpXFRXXWJjj6RoeHSDhpF5bXB7aXlufIZ8dopzgXl8eH9oZHZsYGZfXmleXHNrWWVdb29iemVbd3xrbm5veHlzdWRzg5J+h4OJe3dvcn5zYnhkXHBwYnFygn10Z3KAZV5ud2llaHp8dW5vgnV0fXRyYl9mbm58ZGhTZ1hXU0x2X1BKWVhIYnRjYUlUbVNKTVpXaWxxe2JtbHNjYlpaW2F3XFNMY11YaVNXR1lgTUZpdVheYGxbW19iYlyEaWdhbnh5bG9qdoGQeG2Dfn+Bk4iEgXZziHSMhnRydnWCd3x9foyQgH6TfnB3lYN8mZJ5gIB4en6AdIiDdHCYoHp7f4mUeGN1h3hzd3Rrc25+a3h8cJFyXnBvYGdibFRaWldoY21mXFtxiWVTcm5bWlhYYGx2Y2l1amleWW1zcGxzc3NphHx+fnt2bm5sZGlxY1trcmR0do5zW1dTZWFygH9ygl1iY11TWmBcY5GfZXFxhYSRdGxse25wcXt9fXOBd4Bzenp6ZGV1aF1iWWBnWl52aFdiXW9oYXdgW3t2aWpybnhzcnVocYKVg4d+hHZzanF9bmZ3WF1sbmNyc4F6dGdvfltgcHJiYGtyfm1tdX9zcXhrcGFcZWxseWBmUmVUVlFPdFpRT1hRSGNzYmBGVWpQSVBaVWtra3xmbm9xYltaWFlscVdSUGZXVmhTVEZaXE5IcXRYX2NtY1hgYGFdi2pjZG15eGtwaXV5hntrg31/hJp8goR5fIduj4dyb3Z6fXSBgnyLj4KCl3R4gZOFgZ+JdYGAgXR/gnGHgnVvoZZze4aLhnpld4pubXpuZndwemtzdnKMa150bmFnZWtSXVtVZ2Fsa1pccIxkT29uXVZYVWdpdGhidGVkXFhtdG1vdXR4aoZ8f3uHdo9zY2RrbmFcbm1jc3iHa1pUVmNkeH19cYZdY19jU1pfWWKVlWNucIOFinRraHxwZnR4dX1tenV2cHp/dl9lcmNbXVZhY1hhdGVVX2BtZGFxXV1+cGhpc3F0cHV2a22Ek4GJe4Vxc2dwfnFzb1RcZ2tmcXSBd3NjbXZWYnJsW19wZ35mbXd+c3Nza21gWmRqaXZeZlNjVFVQU2xWUFZTT0dkcl9hRVhpTkhXVFZtaGR8aWt4a2JXXVVbdGRTUldoUVhlVFNIWlpQTXd2Wl9lbGlZYmBeXo5uYWZreXVub2l2dn9/bIN/fYeXe4CHgYl+a5OIcmd0gHt1f4J9iI5/i5NyfIqRhYefhnt/hoxzgYZzfYJ2bqSLcoGNi3Z3bHqMYGR7cGZ4cnhsbXF2gmdke2xjZmdoU19eVWdfbG5bXm2NaE5pbWBUVlNuZ3RrZXhkZFxYb3NscXp3cmyHe392m3p4a2FlbG1eYG9qZXB5fmdaVlhgbHh8e3CEX2JeZ1ZYX1djm4hia3CBh314bGt5blx3c217anZ0b3B8gHNYaW1eWFxVYWJXZHBjU15haGFibFpgfmtma3N2b213d2xphYx/iXuIbXJncX1uc25kWmFpaW90gnRzXmltU2VxZVVjb2N7ZHJ3fHdrcG1rYFlhZmd0XGRVYFVSTldkUk5bT09HZG9dYkZZaU1JX0tYbWRgeGlufmRgVV9UXXVcVFNgZk5dYVVTSlxZUFl0dV1fZWxoWGNhW16NcWNnanhxc25odnR6g3KCgnqIjn58iYeNeW6QinVsc4J0f3+HhYaShJWPeX2Mj4eRm4SAfIyFc4CBc3R4cm+Tk5OTk5OTk5OTkpKSkpKSkpKSkpKSk5OTkpKSkpKSkpKSkpKSkZGRkJCPj4+Pj4+Ojo6Pj46OjY2Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2NjYyMjI2NjY2Njo6Ojo6OjY6OjY2Ojo6Oj4+Pjo2NjY2Oj4+Pj4+PjoKAfnp6fX5+fX1/fn59fn5+fn5+fn+Af4CAgIGAgIB/gIGBgYOHjI6Ojo6NjY2NjY2NjY2NjZKSkpOTkpKSkpKSkpKSkpGRkZGSkpKSkpKSkpKSkpKSkpKSkpGRkZCQkI+Pjo6Ojo6NjY6Ojo2NjY2Njo6Njo6OjY2NjY2Njo6Ojo6Ojo6NjYyMjY2MjIyNjY2Njo6Ojo6NjY2NjY2Njo6Ojo6OjY2NjY2Ojo6Ojo+Ogn99ent8fn59fX59fn5+fn5+fn5+f4B/gICAgICAgH+BgYCBg4aMjY6NjY2NjY2NjIyMjIyMkpGRkZGRkZGSkpKSkpKSkZKSkpKSk5KSkpKRkZGRkZKSkpGRkZGQkJCQj4+Ojo6OjY2NjY2Njo6Ojo6NjIyMjIyMjY2NjY2NjY6Ojo6Ojo2NjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Njo6Ojo2NjY2NjY2NjY6Ojo6Cf3x6fHx9fn19fn19fX59fn5+fn5+gH9/gICBgYGAf4CAgICDhouOjo2NjY2NjIyMjIyMjIySkZCQkJCQkJKSkpKSkZGSkpKSkpKSkpGRkZGRkZGRkJCQkJGRkZCQkJCPj46Pjo6Ojo6Ojo6Ojo6Ojo2MjIyMjIyMjY2NjY2Njo6Ojo6OjY2MjIyMjIyMjIyMjY2NjY2NjY2NjY2NjY2Njo6NjY2MjIyNjY2Njo6OjoN/fHp8e31+fH1+fXx9fn59fn5+fn5/f3+BgYGAgICAgYCAgIOGi42NjY2NjIyMjIyMjIyMjJTO2tjY2NjamoGEhISEiF0tMDAwMC1GoaGhoaGhoJqZmpqampqKg4SEhIOEd2VnZmZmaFxDREREREFSzNrY2NjY2rCdoKCgoKOAY2dnZ2dmb4SDg4ODg4OLjIyMjIyMjY2NjYyMjY2NjY2NjY2NjIyMjIyNjY2NjY2OhX19e3t6fX58fH59fX1+fX1+fn5+fn9/f4GBgYCAgICBgICAgoWKjI2MjIyMjIyMjIyMjIyMlNvp5+fn5+qcfoKCgoKGUxgdHR0dGTekpKSkpKSjnJycnJycnImBgoKBgYJyXV9fX19hUjQ1NTU1MkbY6ufn5+fptqCjpKSkp3xcX19fX15qgoGBgYGAgYqLi4yMjIyMjIyMjIyMjIyMjY2NjY2MjIyMjIyMjY2NjY2GfH16e3p8fXt8fn19fX59fX5+fn5/f3+AgYCBgYGAgIGBgYGChYqNjYyMjIyMjIyMjIuLi4uSl5iYmJiZmZKPkJCQkJCMh4eHh4eHiZKTkpKSkpKRkZGRkZGRj46Ojo2NjYuJiYmJiYmIhYaFhYWFhpKUlJSUlJSQj4+Pj4+Pi4iIiIiIiImKioqKioqKi4uLi4uLi4uLjIyLi4yMjIyMjI2NjIyMjIyMjIyMjY2Njoh8f3l6ent8e319fX18fX19fX5+fn9/f4CBgYGBgYGAgYCAgYKFioyMjIyMjIyMjIuLi4uLi5GQj5CQkIuOkZGJh46KkJKSk4+OjI6Oh4+RkZGRkJCQkJCPj4+Pj4+Ojo6Njo6Ojo2Njo2Njo6Ojo6Ni4qLi4uMjIyMjIyMjIyMjY2MjIyMjIuLi4uLiouLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyNjY2NiX59eHh5fH18fX19fHx9fX59fn5+f3+AgICBgYGBgYCBgIGCgoSKjIyMjIyMjIyLi4uLi4qLkJCRkZGPhI6QkIaKj4WNkJCQh4mLhoyGiZCQkJCQkJCQkI+Pj4+Ojo6NjY2NjYyMjIyMjIyMjIyMjIyMjIyMjI2NjIyMjIyMjIyMi4uLi4uLi4uLi4qKiouLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjI2Lfnx3dnh7fXx7fX18fH19fn5+fn5/f4CAgIGBgYGBgIGAgIGChIqMjIyMjIuLi4uLioqKioqQkJCQkIqFjoiOhoaPiY2QkI2EiouGjoWMj4+Pj4+Qj5CPj4+Ojo6OjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLi4uLi4qKioqKi4qKi4qKi4uKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIt+e3d2eHt8fHx9fX19fX1+fn5/fn9/f3+AgIGAgYGAgYCBgYGEiYyMi4uLi4uLioqKioqKipCQkJCPhYOMjpCOiYyJjZCRiYKHjYaMiYmPj4+Pj4+Pj4+Pjo6OjY2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKioqKioqLi4uKioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMin18dnZ4fHx7fH19fH19fn5+fn5+fn9/f4CAgYCBgYGBgIGAgYSJi4yLi4uLi4qKiomJiYmJkJCQkJCMhoyJjoeFjYmOi4yOiIaHhoiGiY+Pjo+Pj4+Pjo6OjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKioqKioqKioqKi4uLioqKioqKioqLi4uLi4uLjIyMjIyMi4uMjIyKf353eHp7enp8fHx8fX1+fn5+fn9+fn9/gICAgICBgICAgYCBhIqMi4uLioqKioqJiYmJiYmPj4+Pj5CMjouPjIqPjI6MjZCOjIqLjImOj46Ojo6Ojo6Ojo6NjYyMjIyLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLjIiAfXh5enp6e318e3t9fn5+fn5/f35+f39/gICBgICAgIGBgIGEiouLioqKioqJiYmJiYmIiI+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Oj46Ojo6Ojo6Ojo2NjYyMjIyLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLioqKi4uLh4B8eHp6eXt8fHt8fH1+fn5+fn9/fn9/f39/gIB/gYGAgIB/gYSJi4qKioqJiYmJiYmJiIiIj4+Pj4+Pj4+Pj46Pj4+Oj4+Ojo6Ojo6Ojo6OjY2NjY2NjY2MjIyMjIuLi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKiYmKioqKioqKioqKioqKioqKioqKi4uHgHt5eXh6fHx6e3t9fX5+fn5+f39+f39/f39/f3+BgYCAgH+BhIiLiomJiYmJiYmJiIiIiIiOjo6Ojo6Pj46MjI+Sj5COjo6Ojo6NjY2NjY2NjY2NjIyMjIyMjIuLi4uLioqKioqLi4uLi4uLi4uLi4uMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKiomKiomJiYqKioqKioqJiYmJioqKioqKioqKioqKioqKioqKi4aBe3h5eHp8ent7fH19fn5+fn5/f35/f39+fn9/f4CAgYCAgIGEiIqJiYmJiYmJiIiIiIeHh46Ojo6Ojo6Ojo+MkJOQkI+Ojo6NjY2NjY2NjYyMjIyMjIyMjIuLi4uLi4qKioqKioqKi4uLi4uLi4uLi4uLi4uMjIyLi4uLi4uLioqKioqKioqKiYmJiYmJiYmJiYmKioqKiomJiYmJiYmJiYqKioqKiomJioqKioqKhYB6eHl5fHt6ent8fH1+fn1+fn9/fX9/f35/f39/gICBgICAgYSIiomJiYiIiIiIiIeHh4eHjY2Ojo6Ojo6Pj4+PjoyNkI2NjY2NjY2MjIyMjIyMjIyMi4uLi4uLioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYmJiYmJiYmKioqJiYmJiYmJiYmJiYmKioqJiYmJiYmJioqFf3l6eXh7e3p7fHx7fn5+fX5+f39+f35/fn+Af3+AgICBgYCChIeKiYmIiIiIh4eHh4eHh4eNjY2Njo6Oi42Nj5WPiYyPjYyNjYyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYR+eXt5ent7eXt9fHt+fn59fn1+f35/fn9+f3+AgICAf4CAgICEh4mIiIiHh4eHh4eHh4aGhoyNjY2NjY+MjImKj42IjJGPjY2NjIyMjIyMjIyLi4uLi4uKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uKioqJiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJg355e3p8e3p7fX17fH9+fn5+fX5/fn9+f3+Af4CAgH+AgH9/f4OGiIiHh4eHh4aGhoaGhoaGjIyMjIyLiYyKiIeJhoyOjJCMjZGOjIyMi4uLi4uLi4uLi4qKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiImJiYmJiYmJiYmJiYmJiYmJiYmIiImJiYmJiYmJiYmJiYiIiIiIiYmCf3h7e3t6enx9fHx9f39+fn19fn9/f39/f4F/gIB/gICAgICAg4aIh4eHhoaGhoaGhoaGhoWMjIyMi4yOjoyKioeEiIuKjIuNjo+Li4uLi4uLi4uLi4uLioqKiomJiYmKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiomJiYmJiYiIiIiIiIiIiImJiYmJiYmJiYmJiIiIiIiIiYmIiIiIiIiIiIiIiIiIiIJ/eHp7enp6e3x8fX1+f35+fX1+f39/fn+AgICAf3+Af4CAgYCDhYiHh4aGhoaGhoaFhYWFhYyMjI2NjJCSjI2Ii4mJi4uLi4mLjIqMi4uLi4uLioqLi4qKiomJiYmJiYmJiYqKioqKioqKioqKioqKioqKioqKioqKiYqJioqJiYmJiYmIiIiIiIiIiIiIiImJiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIiIiIiIiIiHgXx4e3x5enp8fHx9fX9/fn59fX9/f39+fn+Af4B/f3+Af4CAgIKEh4eGhoaGhYWFhYWFhYWFjIyNkY+PjZGJjIaJjIuIiImMiYeNjo+NioqKioqKioqKiomJiYmJiYmJiYmJioqKioqKioqKioqKioqJioqKioqKiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4WAenl9e3t7enx8fHx9f39+fn19f39/f35+f4B/gH9/f4B/gH+AgoSHhoaGhYWFhYWFhYWFhISLi46PjoyLj4iHiYmMjYWFjo2KiYyNi46KioqKiomJiYmJiYmJiYmJiYmJiYmJiYmKioqKioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHhoaHh4eHhH55eX16enp7fXt8fX5+f35+fX5/f39/fX5/f3+Af39/f39/f4CChIaFhoWFhYWFhYWFhISEhIuLjI6MjI2Lh4mIiomGgoiNjoiKi5GTj4uJiYmJiYmJiYmJiYmIiYmJiYmJiYmJiYmKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIeHh4eHh4eIiIiIiIiIiIiIh4eHh4eHhoaGh4aGhoaGhoaGh4eDfXp5e3p5enx8e31+fn5/fn59fn9/fn9+fn+AgICAf35/f39/gIKEhoWFhYWFhISEhISEhISEioqOjYmIiIqKh4iHiomIioiIh4qGi5GPiomJiYmJiYiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHh4iIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGh4J8eXl6eXp7e3t7fX5+fn5+fn59gH9/f39/f4CAgH9/fn9/gICAgoSGhYWFhISEhISEhISEhISKi5CPiYmJi4qHh4WHiYuKiYSLjYmOjYqJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiIiIiImJiYmJiYiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGgXt4enp4e3x7e3x+fn9+fn5+fX1/f39/f3+Af4B/f39/f3+Af4CChIaFhYSEhISEhISEhISEhI+Qj4+IiYuIhoeIiYuLjIuJioqNio6Oj4iJiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoaAe3h5eXh4enp8fX1+f35+fn59fn9/f39/gIB/gICAf39/gIB/gYKDhoiGiIaDhISEhIODg4ODkpKOioeKi4qLh4uNiYqJi4iHiouIio+SioiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhn96eXh4eHl5eXx9fn5/fn5/fn1+f35/f3+Af39/f4CAgH+AgH+BgoOHjo+PjoiHhIWFhoaFhYWSkI6KiYmIiImKioiIh4aKjIiHiYmOkJGNh4iIiIiIiIiIiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4aGh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWGf3l4d3d3eXp5e3x9fn9+f35+fn5+f35+fn+Af4CAgICAf3+Af4GBg4eOjo6Ojo6Mjo2OjY2MjZCQjomHhoiJiYeIiouIiYyJiYaKjY6PkYuIiIiIiIeHh4eIiIiIiIiHh4eHh4iIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhYZ+eXd5d3d6eXl8e31/fn5/fn5+fn5+fn9+f4B/fn+Af39/f39+gIGEiI6Ojo6Ojo6Ojo6Ojo2NkJGOi42JjIiIiYaHiYaIioiHi4yLjpCQiIeIiYmJiIeHh4iIiYmIh4eHh4iIiYiIiIiIh4iIiIiHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhoaFhYaGhoWGhYSEhIWFhoaFhIWFhX55d3l2eHl4e3x7fn5+fn5+fn5+fn5+f39+f39+f39/f35/f3+AgYOGjY2Ojo6OjY6NjY6OjY2Qj42Ni46KhoiKhISLiYeDhYSDi4mLj42JjI6QkI+NjYyLjY6Pj42NjI2Nj4+Pjo6MjYyMjY2KiYiHiImHh4aHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoeHiYqKiIeJi4yNjo2LiImLi42OjYyJiImMgHl3d3Z6eXh7e3t9fn5+fn5+fn5+fn5/f39+fn5/f4B/f4B/f4CBg4aMjY2NjY2NjY2Qj4+Pj46NjI6KiYuMjIeFiY2Lh4aIh4aHh4uNjo6Pj4+Pjo+Pj4+Pj4+Pj4+Pj4+Ojo+Pj4+Pj4+Pj4+Oj46Oj46Mi4uJh4eHh4aIhoaGhoaGhoaGhoeLiYeHiIiLjY2Mi4yLjY2Ojo+Ojo6Pj46Ojo6Ojo6Ojo6Njo6NjY2AeHZ4eHp4enx6fH5+fn5+fn5+fn5+f39/fn59fn9/f39/gH9/gIGDhoyMjIyMjY+QkpOTk5KSjYyMjIqHioyKh4eJiYWCiouIiYWJjpCNjo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjI2NjI2LiYaHh4eHiYqLjY6NjYyNjY6OjY2OjY2NjY2NjY2NjY2NjY2OjIyNj4+OjY2MjIyLi313dXd5enp7e3p+fn5+fn5+f35+fn5/f39+fn1+f39/gICAf3+AgYOFj5KRkJGSk5OTk5OTkpKLi4uLiomMiouLiYuKhoeOjYiIjI6OjIuMjIyNj46Njo6Ojo2NjY2MjY2NjIyMjIyMjIyMjY2NjYyMjI2NjYyMjI2NjIyNjIyMi4yMi4yMjI2MjIyMjIyMjIyMjIyLi4uLi4yNjY6Sk5OSkpSRkJOVlZSTk5COjo6Oe3Z2d3h6ent7e31+fn5+fn5/fn5+fn5/f35+fn9/f39/gIB/f4CBgoSNkpKTkpOSkpOTkZKSkoqJioyJi4qJjIuKioiHiYqKi4mKjY2Mj46Nj5KUlJOUlJOTkpGSkI+Ojo2NjY2Pko+OkZGOjIuKioqLi4qKi5CPjoyMjIqKioqKioqKiouKioqKi4yLi4uMjIyKiouLi46RkpOTk5SUk5STk5SUlJOTk5KSkpKSk5F6dXZ2eHt7e3p6fX5+fn5+fn5+fn5+fX5/fn5+f35/f3+Af39/gIGChIuRkZGRkZKSkpGRkpGRiYmIiIqMiYiJiYuJhoSJhoyKh4ySkpKTk5OUlZWWlZWUk5OUlJSUk5SUlJSVlZWVlZWUlJOTkY+QkZKQjoyRlZWVk5KSjo+QjYqKi4qKi42OjY6RkpCRkpKSkpGRkpKSk5OTk5OTk5OTk5OTkpOSkpKSkpKSkpKSj3h1d3l6e3t7ent9fX19fn5/f35+fX5+fn5+f39/f39/f4B/f3+AgYKEi5GQkJCSkpKRkZGRkZGIiIiIi4uJg4eLi4yMiIeHjYyNkpSSkpOTlJWWlpaVlZSSkpOTlJSUlJWVlZaXlpaWlpWUk5SUlJSVlJSUk5OVlZWUk5KTk5OTkJGSkZGSk5OTk5KSkpOSkpKSkpKSkpKSkpKSk5OTk5SUk5OSkpOTkpKSkpGRkZGPdnJ3enp7e3t8fX59fX1+fn9+fn9+fn5+fn6Af39/f3+Af3+Af4CBgoSKkJCRkZGRkZCQkJCQkIeHh4eIiIiFi4+KjI6Njo+OkJWUk5OTk5SUlZWVlJSVk5KSk5KTlZSUlZaWlpaWlpaWlpSTk5OTk5OUlJOSk5SVlZSTkpKSkpOTk5OTk5OTk5KSkpKSkpKSkpGSkpGRkZGRkZKTlJSUlJSTkpGRkZGRkZGRkZGRkYx0c3d6ent7e3x9fX1+fX5+f35+fn5+fn5+fn9/f39/fn9/f39/f4GDhIqQkJGRkJCQj4+Pj4+Ph4iKi4yNjYuOj42Mjo6RkpGSk5OSkpKSk5SUlJKSk5OTk5OSkpOUk5OTk5WVlZWUlZWUk5OTk5KSk5OUk5KTlJSUk5KSkpKSk5OTkpKSkpKRkZKSkpKSkpKSkpKSkZKRkZGSkpOTlJSUk5OSkZGRkZGQkJCQkZCRinN0dnp8fHp7fXx9fn59f35/f35+fn9+f31+f39+fn59f39/gH+AgYKDipCQkZGQj5CPjo+Pjo+Oj4+Pj4+Pj4+PkI2OjpCRkpKSkpKRkpKTk5OTkpGSkpKRkZKSk5OSk5OSk5STk5OTlJOSk5OTk5OTk5OSk5OTkpKSkpKSkpKSkpGRkZGSkZCRkZGRkpKRkZGRkpGRkZGRkpKSkpKSkpKSkpKRkJCQkJCQkJCQkJGGc3V2e3x8e3x9fX1+fn1/f35/fn5/gH9+fX5/fX5/fn5/f3+Af3+BgYGKkI+PkI+Pj4+Pj4+Pj4+Oj46Oj4+Pj5CQiI2PkJGRkpKSkpOTk5OTkpKSk5KSkZGRkZKSk5KTkpGRkpKSkZKSkpKSkpKTk5KRkZKTkpGRkpKSkpKRkJCQkJGRkZGQkJGSkZGRkZGSkZGRkZGRkZGSkpKSkpKSkZCRkZCPj4+Pj4+Pj4+PkX9ydHh8fHx7fHx9fX5+fn9+fn5/f3+AgH99fn5+f39+f39/f4CAf4GBgYqPj4+Pjo6Ojo+Pj46Ojo6Ojo+PkI+Pj4+GjpCQkJCRkZGRkZGRkZGQkJCQkZGRkZGRkZGRkZGQkJCRkZCQkJGRkZGRkZGRkJCQkZGQkJGRkZGRkI+PkJCQkJGRkJCQkJCRkJCQkJCQkZCQkJCQkJCQkZCQkJCPj4+Pjo+Pj46Ojo+Pj4+PeHJ2eXx9fHp9fH19fn5+f35+f39/f4CAf39/fn5/f35/f39/gIB/gYGAio6Ojo6NjY2Ojo6Ojo6NjY2Oj4+Pj4+PjoiQkZCPj4+QkJCQkJCQkI+PkJCQj4+Pj5CQkJCQkJCPj4+PkI+PkJCQkJCQj4+Oj4+QkI+PkJCQkJCPjo+QkJCPj4+Pj4+PkJCQkI+PkI+Qj4+PkI+PkJCQkI+OkI+Pj46OjoyMjY2NjIqDiYhzc3Z4fX58eX18fX1+fn5/fX5/fn9/f39/f4B/f39/f4CAgH+AgH+BgYCJjY2Ojo6Ojo6OjY2OjoyNjY6Ojo6Ojo2NiJCRkI6Njo6Ojo6Ojo6Pjo6Ojo6Ojo6Pjo6Ojo6Ojo6OjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Pj46Oj4+Pj4+Pj4+Pjo+PjY2MjYyNjoyLi4mJiYiFhYSDgoKEgnR5fXp4dXJrZWltb2xmZmdncHNzd3l9fnl6e3x9fX1+fn59fn9/fn9/f39/gIB/f3+AgIGAgIB/f4CBgImNjY2NjY2MjYyMjIyMi4uLjYyMjIyMjIyGj5GRjIyMjIyMjIyMjIyMjIyMjIyNjY2MjIyMjYyMjY2MjIyNjY2NjYyMjI2MiomKi4uJh4KAh4iEgXt6gH57fXx8fXlzcnJycnV1cG1ramppZ2NkYV9bXF1eWFVXWFlTS0VJSkpLTE1PT0tgdHR3eX19eHp5e3x8fX5+fn1+f39+f35/f4CAgH+AgICBgYCAgICAgIGAf4OEhYSFiIuLjYyMjIuLi4yGiYqKioqKh4OOkJGNiouLi4uMiYmKioqKiouLi4eDi4qIiYmGhYWEhIeJiYWCg397fHl6e3pzcHFxcW1samdsbWdlZmVmZGNlZGVkZWVlZWRkZGNhYV5dXFpYWFdUUFFSU1JTTU1KSUZESEpHR0hHR0xOSWdzdXh5fXp4d3l8fHx8fn5+fn9/fn9/f39+f4CAgIB/gICBgICAgICBgYFnXmBjYWNucX17ent/fXd8fHZ4ent4eHpvcHt4eXt8e3h3e394dXd0dHZ1dHZ3dXFycW5wcnBnaGtsbm9tamlpaGhlZWRkZF9gYWJgYF5dWVhaWltdXV9gX2BfX19gYmFeXl5eWVldXF1bV1dWUlRSU1NOUUpISUZERUhMTEhGR0lLSklNbXJ0eHp7end3eXt6e3x+fn1+f39+f35/f35+gIGAf3+AgIGAgICAgICCgWdYW1pZXFtcY1xaXF5ga3FtcHBvbm5vbmtpbmxrbG9qaWtraWpraWdmZ2dnaGhnbWdqZ2hlaGdjY2JhYmBgXVhbW1dYV1RWUVBUU1NNSkxLTExOTk9UWFhXVVVUUlBQTU1QT05LTE1QUU9MTEpHSUlHSEhJSEhIR0ZHSEpKSEhISUlISVZwc3V5ent5dnZ5enp7fH59fX5/f35/fn5+f3+AgX9+f4B/gICAgICAgIGBbFtYVlZWWVlaWVlYVVZoamxubmxra2poaGloZGVkYlxiZl9fYGNfXF9dYF1eWl5dWVleYmFeXlpZX1xYV1NOTUxLS0tMSUtNTktKS0tMSktQTEtLRkdHSUlGR0lISUZFSEdGRkVERUVEREVJSUlHSEdIRkZLTUtJSUlIR0hLTU1LTExMVXFzdnl6e3h2d3h3ent8fn1+fn9/f39+f3+AgIGAfn5/f4CAf4CAgIB/gYJoUlRVVlNVV1lZWVdXV1tbYWNfXlxbWFZWWVZSVFJRUVVUU1NTUE1KTU5QUk9NUFFRUVFSVlZRUVFUUFBOTk9MSk1MS0xKSktLRklJSkxJR0pISUlFR0dGRkVFSElKR0ZHRkZHR0hKR0dISEpMSkpLSUlISktLSkhKS0pISUtMTU9QUEtUdHR1eHp6eHZ2d3d6enx+fX5+fn5/f35+fn+AgYB/f3+AgYB/gICAgH+AgmlQUlRXVVRWWVdYWFpbVFRTUlBRU1FRUU9OTlBQUU9MTlBPTk5NTEtNTk5QTU9QUFJRUE5OT05PTk9PUFFPTk5PTk5QTk1NS0lISEpJSUlJR0ZHR0dJSkhJSEhJSEhHSEdISElISUxLSklISkpJSkpIR0pMS0pJSUhKSktMTk1NTU9RTFVzcnN3enl3dnR2eHp7fX19fn5+fn9+fn5+gICBgICAf4GBgH+AgICAgICBbE9PTlRZVVVdW1lXV1hOTUpKSUZKT0xKSkdJSk1NS0pMTUpHSUlJSktMRkRGSktLS0hKTExMT01MTE5PT09NTk9MTk5OUFBPTE1MTk1MTEpJSEdJSElISElJS0xLS0pJS0pJSklJSUlJR0dKSUdJSUpKTk1OTEhJSklJSk1PT01MT1JOWXBwcnd4d3d0c3R3enx+fX5+fn5+fn5+fn9/gICAgICAgYCAf39/gICAgIFvS0pNTlFOTlVXVlZSU0lFQ0VFUkREQT5CP0RAQD5CREFAQURHRkVIRUJBQEBDQ0RFQUNFSEtPS0lJSkhHSklKSUlLSkxQTk1MTU1MTU1NTElIREZGR0ZGRklKSUlLSkhMSklKSkpJSEhKS0tIRkdJSklLTU5OSktPTUxLTU1PUE5QT1BgcG9yd3h2dHJzdXd6fX19fn5+fn9+fn1/gICAgICAf4CAgIB/f3+AgICAgXNQUE5OUE1KS1BSUE5RQ0RCQUZRRT1DPT9FSDk6Oz0/PTxBRkA+Ojw+PjxFRD0/RUE/QEFAREVHR0dHQkRERUZFR0dHR0pHSEpLR0NER0pHQ0RFQUFDR0hHSEdISktKSElMS0lISktLTU5MTUxMSkpMS0lLTU9PUFNRT1BQTk9QUlFNUGdwb3N2dXRycXR4eX19fX1+fn5+f4B+foCAgH9/gIB/f4CAgH+Af4B/gICCdlRVUVFQT0xNUFBOT09BQkFAQkE/Oz48Pj8/Ozg5ODs7OkA7Oz48Ozs8PEhMPT1BQT9CQz1BRERGQkZGREdJSEM/QEBAQUFCQUE/Pjw9PkFAQD8+P0BFR0dHSUtMTk1OTUxNTUpLTVBVU05MTlFOTk1OTE1NTk9OTk1LS05OTk1OTkxUbnBwcnR0c3Fydnl5fX19fn1+fn5/gH5+gICAgICAgH9/gICAgH9/gH+BgIJ4UVFSVFJTUVNTUVFST0BAPT4/PD8+QEE/PT45Ozo6Ozg5Ojg3Ojw5Nzg7Oz49Ozs6ODpAQEFCP0E/Q0ZEQkNDPzs+PkBDQ0E/Pj9BPkBAQj9APD9CQEFDRUVFSktQT1BPTU1OTExMT1JRUFJOTExPTUtOT0xMTEtMS0tKS0tKTU1LS1xxcXF1c3VzcXN4eHp9fn1+fn5+f39/fn5/gIGAgH+Af4CAgICAf4CAf4CAgXxSTU9RUFFSUlRSU1NOPDs8Ozs7P0BBQkA9PDk8PTw5Nzk6Ojk4ODo6Nzg6OTo7Ozg3ODk7Ojg8Oz1AQUA9Ozs+PD09QEJDQT9BQkE9Pj09Oz0/Q0RCQD9BREJFR0pKSkpKTE1MTExNTExOVVNLTE1USVBKSU1KSUpLS0pJSEdKS0lKZnJxc3RzdXJydnl5e31+fn5+fX9+f39/f36AgICAf4CAgICAgIF/gIF/gYCBgFZMTlBQTlJRUFBRUU44PT88PDo9PkFAQT8+PkA/Pj07PDw+Pz08PTs6PD09PTw8PDw7Ozo7PD49Pj8/QUA+P0E/QEBBQEBAPT8/PTw6Oz09PD9AQUJCQUBCREZGRkdGR0dISUtMTExLTEtKS0lKSk1MTEpMS0lISUxMSklJSElLR01tcHF1dXV1c3V4eXl8fX5+fn5+fn5/gH9+gIB/f39/gH+AgYCAgYCBgICBgYCCYUtPT05OT1BPT1BQTzo8Pjw9Oz8+PkFBPz0/Q0NDQD48PT9APz89Oz49PkNFPz9APTs9PT08Ozo9PkFBPz5AQD9BPz89PD48PTs7PD0+QUA/QD5AQ0NEQkRFSEVFR0hISEdGSUpJSUlJSUhKSkpKTEtKSklJSEhKSktMS0lLSkpIVnBvcXNzdHR1eXp7e31+f35+fn5+f39/f39/f3+Af4CAgICAf4GBgICAgIGBgIJtTFBRTk9QTk5PUFBPPjw8PT4/P0A+QEA/Pz9DRUQ/PTs8QD46Ozo6OTc6PDk9PUA9Ojw7Ozw7ODk7Pz49PD07PEA9PTw8Pjs9PD0+QUBCQUBAP0JEQ0RFRkZGQ0VHSElJSEhJS0tMTUpKSUpNTUpLSktJSEhISEpJSktKSk5MSUlfcHBycnJ0dXZ6e319fX5/fn5+fn5/f35/f36AgIB/gICAgICAgYGAgICAgIGAgnZNTk5NTk5MTE5QT0w+QTw8PT8+QkM/P0FBQUJBQD08PTs+PTo6Ojw6ODk4ODo7PT8/PDs7PDs6Ojs+Pz89PDg6Pjw9Pj89Oz4/QEJDQkJDQ0FCQkFCQkRCQkRCRENGSUdGRkhJSUtNSklKSktMSkpJSkVESUlGRkhISUpKTEpGRmdwb3FxdHZ1d3t8fH18fn59fX1+fn9/foB+fn+AgH+AgICAgICBgYCAgICAgICBek5JS0tMTExFSUxOTTw/PDw9PkBAQUE7QkNCQ0A/Pz9APT9APjw+QD89PT0/PT0+Q0Q/Ozw9PkA9PT5BQ0A8OTtBPz4+QT07P0JAQkNCQENDQUNBPT0+QD0/QUFBQENFRUBAQ0JDR0dFRENGRUZGR0VEQEFHR0ZDRkRHSEpHQz5IbG9wcHF0dXZ5fHx9fHx+fn1+fn5+fn5+f36Af3+AgICAgICAgIGAf4CAf4CBgIF+UUhLTU1NS0pLTE9RQD8+PkFBQEBBR0FCRENEQT9AQEA/PUA+PD0/P0BAQENAQD9AQD49PD1ARUFCQkZIQz08QERDQUE/Pj1AQT4+Pj88PkBER0VAPkBBP0BDRkVDQkNDQEJEREJERUFCPkFCQkFCQEA9QUJDRENDQUNFR0E/PVZwcHFwcnV1d3p8e3x8fX9+fX19fX1+fX5+fn9/foB/f4CAgICAgYCAgIB/gIGAgX5SSEtNTUxLS05OUlVEQkBDQ0FBQkBCQ0BAQUFAQUA+Oj48Pz08Oj49P0JCRUA/P05hX0pAQ0VJSUlJTU1LRUNGR0hFR0VFRUREQ0E/QD4+QkZKSkdFRUZGRkpOTktKSUdHSEtMSkdHQ0REREVEQUJCQ0BDREVEREVERUZDQkFEZW9wcXF0dnV4e3x6fHx+f319fX19fn59f4B/f39/f39+gIGBf4CBgICAgH+AgICAfVJJSUpKSEpKTE9SU0dGRUdIREdIREA+PDs+QERFRD88QUNEQj8+QT9BREVEQ1d1homKflhHSEpMTE1PT0xIR0hHSElJSEhHR0hIRUNFRUVFRkhKSkZFR0lKTU9PTU1LSktKTU5LSUhHSElIR0ZFRkZGREZIR0VFSEhGSEdIRlFubnBxcnZ2eXt7e3p9fX5/fX19fX1+fn1/f39/fn5/gH+BgYGAgICAgICAf4GBgIB8UEhHSElGR0lKTU5OSkxJSUpLTE5KRkNBQkNGSkhJR0hISUdHQ0RFQ0RDQVV0h4mHh4aHgldJTE1MTU5MSkdHR0dER0dHR0ZIRkhFQ0RERkVEREhIQ0NDR0pKS0xMTExMTElKS0pKSUlJSEpISEdISUhHR0hGRkZISklJSUlIXW9vcXJzd3d6e3t6e319fn59fX19fX5+fYB/f39+fn+BgIGAgYCAgICAgIB/gYCAgHxNR0ZIRkVGR0dKS0pMTUxLTU5NT0tJSEhKS0tMS0pLTEpLSUhGRUdOR09shIeGhoaHh4eHfFBLTEtIR0ZGREVDQ0BBQ0NDQ0ZGRUJAPj5AQUFAQkQ/Pj9ERkhERUdJS0lJR0hJR0lJSkpJSEZKSkpKSUpJSkpKRklMTEpKS0tmb3Bzc3R2eHl7e3t8fH1+fn19fX19fn59f39/f35/f4CAgICAgYCAgIGAgICAgICAfU9GRkdGR0hHRUZHR01NTUtMS0lHQ0NDRElLS0tLS0tOTEtNTEhJT3BwgIaFhISFhoaHh4aKdUlJRkI/P0A/Pz88PDw+Ojo8QUFAPjw5OTg8PD07Pjs5Oz9BQkFBQ0NDQEFCRURCQ0ZISUhISExNTEdJSk1NTk1KSktLSkxNU2xvcXRzc3d5ent7fH19fn9+fX19fX1+fn5/foB/fn9/gICBgIGBgICAgYCAgIB/f39+UUZFRkdJSUdEQ0VGTk1MSklIRT85Oj5ARUhHSUlLTE9RVE9YbHN6gYWEhIWFhoeIiIiJiYyOZkJCPTg4Ojo5ODc4ODk2NDc5Ozw6ODU2Nzc4OTc4NzY4OTs7PD5AOzk5OT09Pjs7PUFERUhKTUxMR0lIT1JRUFBOTE1NT1Fdb3BydHN1eHp7e3x8fn5+f359fX59fX5+f39/gH9/f4CAgICAgYCAgICAgICAgIB/f39RR0ZHSEpIRkVGR0hMTEpJSUdDQjU2OjxDQEJGSEtIS1RwZXyDhIOCgoOEhomKi4uLiomKi4yJVDs4NjU2NzY2NjQ1NzYzNDY4Ojg3NjU2NTY3Nzc3ODo3Nzc4OTs3Njg5OTg5ODc2OjxAR0ZJRklGRUZPU1JTU1JPUFBSVGVwcXN0dHZ5e3x7fH1+fn5/fn19fX19f39/f3+Afn+AgICAgICBgICAgICAgICAgH9/flJISEhJS0lHSUpJSkpLREVIRUJANTc4OD06PERCREZEXXx/goKCgoKChYmKiomJioqKiouJiYqBSDY3NjQ2ODg3NDU3ODQ2NzY5OTc2Njc2NTo6Ozo6PDg5ODk3Nzc3OTo6ODg3ODU4ODtBPT4+QkE/QUtMT1FQUU9PT1FXa3JydHR1d3l7e3t8fX5/fn9+fX19fX5/f4B+fn9/f4CAgH9/gICAgICAgH+AgICAf39+VEhHSUlMTUtKS0tMSUg/QEFAPDo1Nzk4OTc6QTk8RD9mg4KDg4SEhIaJioqIh4iIiIqKjIqJiYx6Pjo4ODs8PT45Ojs8ODk7OTo7Ojk5Ozo5PT09Pzs7Oz06Pjs5Ozs8Ozw8Ojs8ODo6Ozo5OTk8Pzw9QUJESUpNS0pLTFdvcnN1dHZ4e3t7fHt9f39+f359fX19fn9/f35/f39/f3+Bf4CAgICAgICAf4CAgH+Af35URkVGSUxOTkxKSk1CPzo7PDo4OTk4OTk5OTo+PT9ARHeDg4SEhoaHiYiHhoaGiImIiYuMi4mKioxsPDs+QUNFRUFBQUI+QEJAQD89Pj5APz4/QD9APT0/Qj9BQT9BPz1AQEA+P0E8Pjw7Ojs6OTs/PTs7PT1BQUNBQkNBWHFxdHR0dnl7e3x9e31/fn9/fn19fX5+f35+fn9+f4B/f4CAgIB/gIGAf39/gICAf39/flJFQ0FHSk5PTElHSzo4Ojs5Ojo8PDo7Ozw7PT5BQD5ihYOEg4WEhomJiIeGhoaHiImKi4uKioqLiotePkRGSUtKSUZHR0RGSEdFQ0BAQ0VDQkBCQ0I/QERIRUNFREZFQUZFRkRGRkRAQj49QD49P0A+Pz8/Pj8+Pjo7PTxgcXJ0dHV3enp6fX19fn5+f39+fX19fX5/fn5+fn5/gH9/gICAgICAgICAf4CAgIB/f4B+UERAPUNIT01HRkJEOTc6Pjo8Oz4+Pj87Pz1AP0M/S36DhIWGhoaIiYiIh4aGhoeJioqLjI2MjIuKiohXR0xMTUtOSklLSElKSklFQ0RGR0ZEQ0VGREJISUtIR0dGSEdFS0lLSUtLSkNGQ0NEQkFBQ0JEQ0NERENBPTs9QGhwc3R0d3d6eHt8fH19fn5/f359fX1+fn9+fn59fn+Af3+AgH9/gICAgICAgICAgH+AgH9PQT49P0RMS0BCQkE5Nzw+Ozw6PT8+QDw/P0NCRUBohIKFhYeHiImJiIiHhoaGiIiIiYqMjYyMi4uKjH9QTVBNS05LSkxJSUpIS0dFR0hISUVFSEZGRUxMTUlKR0dISUpOTU5MTE5LSEZHR0VFQ0ZGRkZERUhIRkNBP0BMbHB0dXZ4eXl5fHx8fX1+fn9+fn19fX1/f35+fn5+f39/f39/f3+AgICAgIB/gICAgICAf1FBPz4/RkdHPTxAQDg3PDs7PDk9Pz0+PkBBRENJVH6DhYSFhoaHiIiIiIiIh4eIiIiJioyNjIyMjIuKjXFNUU9NTExLTEpJSEZKSkVKSEdLSkhKR0dHS0xOTExISElKTVBOUE5NT0tJR0lKSElESUhIRkZHR0lGQ0JBQ1VucXV2d3l7eHh6enx8fX5+f39+fn1+fX5+fn5/f36Af39/f3+Af4CAgICAgICAgICAf39/VERBQUJHSEI/OD9AODo7ODw9Oj0/PD0+QEJERU1thIOEhISFhoeIiIiIiIeGiIiIiIiJjIyLjIyMi4uLi15SUlBNTk1LSkdGQ0dKR0xKR0tPTEtKSk1NTE9QTkhJS0xPUVFQUU9PSklKSkxKTEZHSEdFR0lGRUVCQEJCXHByd3h5enl5eXp6e3t+fn5/fn59fX19fn9+fn9+f4CAgIB/f39/gICAgICAgICAgH9/f39VRUNFRUdHRUQ7P0E7PTw5Pz09P0FFRT5DRUNHTHWGg4ODhISGiIiIiIiIh4eIiIiIiIqLi4uMjIyMi4uNfFdWUlJUUk9MS0pFRUZLT05PV1ZRUE9RU1JOU1RPTVNMUFNVV1JTUlBMSk1NTUtOR0dKRkZISkRERUVCRENjcXV5eXp6ent6e3p6fH59fX9+fX19fXx9fn5/gH9/gICAf39/f3+BgYCAf39/gIB/f39/f1VGRkdHR0dIRj5AQj0/PT1CPkFBRVVMQklKR0tNeYaDhYWEhYeIiIiIiIiIiIiIiIiJiouKioyMjIyOi4uLZ1ZWa2FFUlFRUEo7O1FTUmB1XVVWVFZZWVNZWFJaZlBVV1pdUlRXUVBOUlBQUFFLS0tHSElIRUZJSUlISWpzdnl5enl6e3t8ent8fXx9gH59fX19fX1+f39/f3+AgIB/f39/f4CAgIB/f3+AgH9/f35+VEhKSUlHR0ZFPz9BQEVCQ0ZFRERLV1FLUFBPUFF5hoWHhoWGh4iIiIiIiIiIiIiIiIiIlJyMioqMfWGKi4uHbFtkVTpYWFhTUD9AVlVZXGRgVllicl5dV11aVkVRWVpcWV9UWWdSVVZYVFRWU09PTUpMSklJTE1LT01Tb3R2eHl4d3p6ent6e3x9fH5/fn1+fX19fn1/f39+f4CAgH9/f3+AgICAgH9/gH+Afn9+fn5WSkpJSEdGRERCQT9ITUlNUEtJSk9TUlFVVlZWVHWFhIWFhYWGh4iHiIiIiIiIiIiIiImcnaCPiY5nO36MiYqLem5wWFpbWlJTUldWVFpadYNZVX2QYVxYXV5XSVZdXVtbX1lIWVhZXF1YWFlXUlFNUFFNTU9TUVFVUmFzc3Z3d3Z4eXh6e3t8fX19f39+fX59fX1+fn9/gH9/gIB/f3+Af3+AgICAf39/gIB/gHh5fVlNS0pJSUZCREBBOlBRUVdYUFBPUVNTUlZXV1dXbIGCg4WEhYaHh4eHh4iIiIiIiIiIiJaanJeIioFuhomIh4OKfmZZWVxZU1ZUV1JRV1ZjloBRZXJYWldfaFBgZlpbWFxoYkdPWmlnXFtcXV1XU05TUFBRVlZWVllab3N1d3Z2dHd4eHt7fH19fX5/fn59fn18fn9/f3+Af39/gH+AgH9/gICBgYB/gH1yfX9/b3R8XVNPT01LSkVDP0A7UFBaWlpSU1FPUlJRVVJVU1ZedXiAhYSEhYaGhoaHh4eHiIiIh4eIh4ORjomJiIaFiIiGfYB7XFBWWFRSVFJRUUxPTUtmeVpdVFlVVl1aTFRaVFNUXlpYV1dXemtYWlxcXlNQUFBJTk9XVlhbWmRxdHZ2dHR2eHl5e3t8fH19fn99fX1+fX1+f39/gICAf3+Afn56eHd2c3V7f3+AgHRrfn5rcnleW1ZVU1JPS0ZDREFNXoNsVlJTTk9RT1FWUlNSUlRjZHaAgoKDhISEhIWFhISDhoaGhoeIhn6JiYiHhoOHh4d5bXFWSUtOTktNS0hKREZIRUM+U2NVf1JRUU5LUlRRTU9ZUU1OUVNVVU1RU1JQTkxMSENJSFJTVFpdbXJ2dnVzc3d7ent7e317fX19fn19fX59fn9/f39/gH99fX5+f39/f4B+e3Zzd31+fmR1fWlxdF9kXV5bWVVRTElMSWFsknRQUVNOUVJQU1tSU1JRUlVVYnN7fH+AgYKBgX99e3uAf4OChYaHgoaGhoGEgYaFhnVfXUtDPkNDQ0NCP0RQQ0RAQz5CSEdWQElOTUddaVFIRk9GREVGSEdIQkNIR0hKR0RCQUNATlBNUmR0dXZ1c3R1enx6e3t7fHx9fHt+fX19fn5/f3+AgIB/f3x8fX+Af39/f4CBgH12dHt/bWh8Z25xZmllZWJcWFNRUFVSc1dlW09PTkxRUlBVWVNVUVFUUk9WYGtsc3Z6e3h5dXJuc3RzeXh+foOAg4OCgIKAgoGBa0xHPj46Oz5APz8+PmpQSmFFRkhJRUI/SE1NR01RVUpCRT8+PD08PT0/PT9BQ0I/Pzw9Qj5KTUZVb3V2dnN0dnh6fHp9e3x9fX19fH59fXx+fn9/f4B/f39/enl3eHd2dnh7foB+fXt4dnx1YXhnbHBqbGppZmBbUVFaXFleSUpQUU5LTFFSUVRVVVdRUVdWUFhbYl1hZ21tbG9raGBucmltbHF1e3p9enh6fHx4d3hkQkBAQT06QkNBQUNBW1xOe05PT05LTE1PT1BMS0xXTklHQEI8OTc3NTk5PTs7Ozg5ODk/O0FHPlx0dXZ2dXZ3eXx8fH18fHx8fn18fX19fX9/f39/fn9/f314dXd6e3p2eXh1d3t8eXh1eXdjcWhpcG1ubW1oZl5PUF5cWklHUFJRT01QUU5RUlNWWFNSWVROWVpbV1lcX15fZWBdXnF3a15gZ2t3b29sam9ubmxmYllHRkZIQkFGSEVFRkNMUU9hV1JYUVBTU1JVW09PUVZQTUlDRj46OTY1ODY5Nzk6MzY1Nzk1PEI9ZnR1d3h3eXl7fX18fHt8fX1+fnt9fn19f39/fn5+fn9/e3d1eX18eXh8fHx8dHd2d3Z1d2tuaWhxbm9vb2prYFVXXlpXTUtUVFNQUVVPTFJTVFdYVFRYUUxXWVlWWFhWWFldV1hYaHNrXVZgdGthYV9dZGBfXllVUE1PTUxJR0pLSUhGQ1BPU1pXVFROUVNZU1xlVU9TVFFOS0lIQz9BOTk4ODk3ODg0NzU3ODU5OEducnV4eXp7e31+fX18e318fX5+en1+fH1/f359fn59f358dHR1e3hycW9vbnR4cXJzeHZ1cWZkZ3JucHBxbm1kXV9fWVdPUFdWVlNUVk9PVVZXWFlTVVRMS1NVVVVVV1BUVVdUVVJdbl5STllgW1ZZO0RVV1RbZkpMUFJST01NTk1NTEpGUFBVWVNUTkpOT1RTVFxWUlVTU09NTElISEY/Pz06Nzg3NjU5OTY3NjY1V3FxdHd5ent8fX59fnx8fXx+fX15fX18fn5+fXx8fX1+fXxydnF4eHJ1dXFxbnBwb3B1dnRuamRkanBwcXJwbmZlZGNcXlJUWlZXVFNWVFJYWFlZWVJVT0pHT1BPT01SSk9QT09OTk9UTE1JUFBTVFUyPFhNSUFRPWNgUVNRUE5QUE9OTk1QTlRSUFJMSUxLT1FQUVJTVFFTT0xNS0xMSENCQT06OTg3NjtCNDU2NjtlcHJ2eHl7fHx9fnx9fH19fX18e3h8ent9fX58e3l9fH18e3B1b3d1cHV0b3N2cHFxcHV1dmNqZ2VXaHRycnFuaWlocFZWVFVYVVZVUldWVVpZWFdVUVNGRUFGR0dIRkpESEpIR0VITEhLSUdMTVBNRy9FX1I+M0A+am9hUlJRQEdUUU9QUFFOUU9QT0xKTExPUE5NUFFRTlBPSkxNTUtHRUVEQjs9PTw5PUc2Njc2RG5xdXd6fHt8fX18enx8fX5+fXt5dnh3eXl8fXp6dn17fHp6b3Fud3JwdnFtcHNwb3Bzc3N0ZmdgaFpXa3JzcmxtbWtuYmVQU1RSU1VPV1ZWWVlWUVFRT0A+Oz0/QEJBQ0BCRURBQEdIR0hGRkhKTUxER0NPUkM4RU5TXWdTUVNBR1VQUFJRUE1NTkxKTEtMTk9QUUxOTk1ITEtJS0tMS0dGRkVEPEFBPjtARTs8ODlUcXN1eXt7e3x8fHt5fHp6fn58e3V0dXJ2dnp6eHpyfHt8eXltcW94cnF1bm5xcm9vb3Rzc3J1dGtnZ15lam1wa29xbWltY0xPTk1RU0xUVVRXV1VMTEtIPTk4Nzs/QT49PUFAQj0+RUhGREZGSUdKSkBGQUFARkhFSk9IUVJhXFFQUk5TT09PTExPTUtNTE1PTltWSk1RT0dJSERJSkxMS0ZGRkQ/Q0M+PUJHP0I+QWRxdHd7ent7fHt6end8d3l+fnt7cXN0cHJzd3R4eHN6e3l2d2xxb3ZxdHRsb3Fybm5vc3ZydHNycmtsZW5zaG1ubWxtbGprSUxISE9RSlFTUVRTT0tIQ0U9OTg3OT9CPzs+QUBAPkFESUVDSEdJR0lFQkI/PjxDQkFHSURNT2FlUE1PTldLTE5LS01NTExLTk5TZE1KTFJJSUlFQUhKTE1OS0dJRkJCQkA/RUZFSERMb3B3enp5e3t6fHp3c3h0eHx8eXpucXJtbm9ycnZyc3h8eHZ2bXBtc3B1dGxwcHJvb29ydnVyVlZucWdseYRqbXFybm5qaG9ISkNHTExJTVBNUE9HS0U/Qj05OTk6P0I/PEFCQUFEREdLRkRJSUdHSENDP0I/P0BBPUNFQ0tOUVRLSklNVEZJSUpMSktLSUpMTU9QUlBLR0NMR0NDSkpMTU9OSUpJR0NDQ0RJSk1MSVpzbnh5eHp7e3l8dnJwdXJ0eXl2eGpxbmpsbG50dG1zdXtzdHhyb25xb3ZzbnBvcnBvcHN0eWpOYGdzanR8eWdvc3FpcWhlcUhLQ0ZHR0dKS0lKTERHQj0+PTo6OjtBQj89QkJDQ0hGSkxKRUlJRkdHQ0M7QUBCPkA/QkVDSU1PR0hLRkhLREhJS01ISkxISUpMSk1dUklIRE5HQkVLS05NUE5LTUpLRkdHSk1OUU5MY25qd3Z2e3h7en1xbWxza3B0dHR1aHBtamlra3RwbnR0eXByeXRvcnFvd3NvcXB0cnBydXR5a05WbXVscXt2aW5vaWp0aGRwRktDRkVGREVFRkVHQ0NAPTw9Ojs6OkBEQT9CQ0VFSUZKSkxGSUlHRkZEQjtCQ0M+P0JDQ0RHTE5IS05IREhESUxOTUdJTEdGRklJTE5LSkhFT0lDR01NTk1QTk9PTUxJSElPU1FSTlJmZ2Zyb3N4dXt6fGxoam9la3Btc3FmbWxoaWtsdG1wdXR3cW94dG90c3J2c3BxcnRzcnR1dXZ2WFZ1dWtvdHJrb3ZsaG1lX3BHSUNFRUVCQkFFQERCPj8+Ojs7PTs9P0NCP0FDRkdKR0pJTEhHR0dGRUM/PUVFQj5BQ0JDRUdISUdNUElGRkZLTk9LRkhJRkVERElJSEtJRkhQS0RKTUxQTk9OT1BOSkpITVJVVVJPV2RhYW1ncXJvc3l6Z2VoaGNpbGdxbGZsbWdpa2xzbXB2dXRwbnZyb3Nyc3V0cXNzdXRzdXZ2dnl2dXR2bGt1dW1ydnFsbmxlck1HREVHQ0FAQUQ8QkE+QT06Oj0/Oz4/QEI/QEJFR0pGSkdJR0ZGRkRDQkFBRkZDQkJCREVFR0dIRkxQTElPSkpMS0lGSEVGRURDSUhIS0pHS1JNQ09PTlFQT09OT09LS0tQVVdWVVRZYF9daWFuaW5ocnNiZWZmZGloZm5pZm1taGtrbXJpcXZ1c3Ftdm5vcXJzd3Nyc3R1dnZ2dnd2d3Z2dHd1a3N1bnV0c3Bya2tzTUZHRUdBQkBDRDxBQUBDPDg6PT46Pz0/Qj9AQERGSEVIRkZIRkVFQ0NFQkRJRkNHRUFFR0VGRkdFSk1LSFFNSktISElFRkhIRUNJSUpLTUtQU05EUlNRUVJOT05OUE1MTlNXVldYVlheWl1kYGhiamlna19kZWZjZ2dna2dna21rbWxwcWd0dHVyc252b3FwcnR4cXNzdXZ1gpF5dnZ0eHV1d3hub3VvcnN1cXFpcHpNR0dHSEJCQkVFPEBDQkQ8Nzo9Pjo+OkBCPj8/Q0VGREZEREdFQ0VDREVGRkpFRUlHQkdIRkdGRUNGSkpHTUtMS0hKS0ZJSEpIRUtLTExOT1JUT0lUVVRRVFBRTU5RTk1RV1pWWllXWl5aWGFgYGBfaGVjYGRlZ2dqaWhqZmhubGxvbXFwaXV1eHJycHVwcHBydXZwdXN1dnV7fn14dnR3dnZ2d3BsdXBtc3Vub3NzeU1ISEdJREFDSEU8QEVCRDw4Oj4+PTw8QkI8QD5BQkZDRUJCR0NDREVGRkdHSUZHS0hDSUhHSUdGREhLSUdLSE1LSktMSExKTUtJTkxOTk9SVVZPTFZWVFFUUlJMT1FQT1RZWllcWlpcX19eYGNeXGFja2JgZGdocoVoZ2pmam5ucG9uc3FqdHV4cnNzdHJucHF2cnF1cnV1c355jn11dXZ2dnZ4cml1cWtydGxxd3F1S0hLSEpFQkRHRTxAR0REQDk8PkA/Pj9DQjxAPkFBRkNFRENIREZERkZISEZIR0lLSkVKSEhKSEZGTEhISEpHTExMTExJTUtNTk1PTFBQUVVWV09LVlZVU1NSUUxPUlJRVltbXV5bXV5gYGFgYWVdZGBmZ2BlaGpjc3NmamhnbHBycW9zc25zd3dwdXZ0c21vcnVvcnNwdXJ2cnSBdnV1dXd2dXd0Z3Rya3Fya3J3b3dJSktJS0dCRERFPEBGRERCOz8/QUBAQERBQEI/QUNIQkVERkdFSUVGRUlIRklISkxISEpKSUtKRkpLSElKSkdLS01MSkpNTE1OTk9MT1BSVVdWTU5UVlVTUlFQTU5UU1JXW15eX1xeYGBhYWFgY2RlYmRpY2Rpamd2i2xraWdtb3NxcHFwcHJ5d3J1dXRzbW1zc21xcm90dXRzcHN3dHV1d3Z1dXRlcXNrcHFqcnZwd0pMS0tMR0NDQUQ8P0VFRUM9QUFDQkJDRUFDREFBRUdDR0dHRkVJRkNHSkdHSkZJTEhJSk1LTUxHS0lIS0tOUUtSUUxTTUtOTU5QUFBUT1dYWFtOU1FXXFpTVlBOVFVUVFhaX2JiX2RhX2BiX2BmYmFjaW5oY2loaG14dmxoaW1vc3JwcXJycnZ0c3Vzc3Nua3NxbXByb3R2cnJxdXZ1c3d5d3V0dWNtdGtvcGpxdHB3TE1MTExHRUFARD4+REVGQz9DQUVDREZDQ0VHQ0JJRUJISUlHSEpGREtKR0hKSElLR0pKTktOS0lMSEpNS1pmSmRcS2xSSE9NX25VbHNbcXBid2NSUGJ2dWh1Y2F2YFhucWJkdmluemZcbHRgbGtVX3d2aWpoaGZnbG1qbW9qbW5zcnBycnFyc3Jzc3J0cm5sdG9ucHFxdXVxcXN0dnZ1dXl3dXR0YGt0a3Bwa3FzcXlLTkpLSkZCP0BCPz1ERUZEQ0NCRUVERkJGRkdDREtEREpMS0lLTEdHTkpISktHS0pJSkpOTE1MTExJTUxMW3NiZHBebGxVTU5lcl1nZXFsbnRncGlfYVlubWJwcGJrampnb3F0ZXRub1xwdWdxTUtyeXZrYWFrZWVseG1rdmxucHNycHJxcHFycXJycnRybW1zbm5vcHJ1dHFzc3R1dXV0d3h2dXRibXVrcHBscnJxektMSUlHRUQ/QUI/PUJFR0JGQ0VERUVEQkhIR0RFS0dHS01NSk1MRkpOSEpLSklLSkpJSkxNTk1NTUtOTU1bcm9vbnBwbGtNUFFsWE5pYnRycGFtb3ZcWWxQW21tWnFta29teHh0c2lwXGBzbHFqVXV5eG9jXmtmYmdwcGppb3Bwc3NwcXBxcXJycXFycnRsbXJtbW5vcnV0cXRydHV1dHV1enZ1dGVudWtwb2xzcnJ5SUtHSEZFRUJBQj0/P0VHQkdESUVFREJGSUhIRUdLSkdNTU5LTU5HTE5JTUtISk1JS0lKSk5PTk5NTE5NTFxoZHVdbHFXbE5PUW5VWmtea2x2YWxkdFRlY05sWWxcdHBraWx4and1aHBdX3NraFdiY3d8b2NgZ2hhY2l0eWtubnFzc3BxcHFwcnFwcHBydWttcW1tbW9xc3Rxc3J0dnZzd3Z6dnV0aG91bHNvbXNydHZITUdJRUVEQ0FCPEJAQkZDR0ZLR0VDQ0hLSEhGSUxLRk1LTFJSTEdNTUhOSklITkhKSkhITk9OTkxKTU1KWnNwcG9xcW1sT1FTb1lza2dvb3Fxb210Xm5YYXRfbm9wb3Fyb291c3R0altddGN3eHJqbnpoYWFjZmFiam10dXBzdXZzcXBwcW9ydHt/fn13bGtxbmxtbnByc3F0dHN1dXR4eHl5dHVrb3VtdG9uc3N2dElLSEpDRUVFQEA+Q0NBRkNISU1IRkNGSkxJR0ZKTUxGT0pLV1JLR0tKSk5JSUpMSUtKSUhLTU1NTElLS0tTa2JaaV5famNyclpfWWtvYGVlVWtfY1thYlFgbWhcalxuaWlkWm9lZHBdWlxrW21xY3BzbGRnY2RnYGBrbXBwb3R5cnVxb3BxbnmFiIeHhoWAdnNua21tb25xcnR0cnR1dXZ5eHhzdW5xdW53cXJ1dHdySUhGSURFREZBQEFFRENHQkhKTEdGREdLTElFRkpOS0lPSUxbUUpGSEhLTUlISkpLS0lISkdMS0tLR0hKSkxMTEtJS0xOVFtdVFBVTVFQTk9PVVJQT1FPT1FKSk9QUWRxaVRZVltbXFVZW11YXVxcY2ZhYWZiY2ZfXmZrbWhtdHhydHJvcHB0hoeGhoaFhYaHg3pwbW1sa3FzdHRydHZ0dXl5eHV2cXJ1b3ZydHN1dXNIQ0VHRkZBRUM/Q0dERUdDSUtMSEZER0tMSERHSFBLTE9LTFdNSUZFSElKSElLSExKSUZISEpHR0lFRktISUtOTElPXFdeT1xcYF5PWFlTXFxiXk1ZWk1YYVJLWWFaU2BkXWJYW2RkVlZYXFlaWFxWWVxeY19kYGFfZWhrZ210dHFxdHBxcoGGhoaFhoWFhYaGhoR9cmtpb3Jzc3N0d3l5eHl4d3h0cXhyeHNxcnVydE9CQ0RMTUJDREJESUVHR0ZLSktIRUZKSkpGREhIUEpMTUpNUklIRUFIRkpJS0tJTEpJR0VKSEVGR0VFSkdCSU1KS1RfWWBYYGFbYFVYWVReXlpfUllcUF5cWU5fXF5TW15jX1pdYGNfWV9iW2BeW1RZWFpfXmRiYmFjZWlla3Jwb3Bwbm93hoaFhYaCe4CFhYaGhYaFf3VxcHJyc3Z5eXp5eXh4eHdyeXZ4cnF4dnR2YVNKSk1JRUNCQ0ZHRUdHSUpKSUlER0tKSkRFSUlOSk5MSExOR0hGPkdHTElLS0pLS0lHRUlFQ0RFQkZKRD9JS0hOW2NZXl5hX1JUU1dfYFxdWV5RWVxNVl9XS1FZW1FbX2FhXV5jYWBiYWJjY2VaUlhWVlxbXmNgX19jZWJob21tbGxsbHWFf4SDeXV8hIWFhYaGhYWGhoN9d3JydHd5eXl5f359eXV5dnZybnp3dnhYUUpGQ0dFQkVHSEZHSElGR0pHSEZIS0lLRERKSk1NTExISkpISkc/R0ZOSktLTUtLS0lHSEREQERBSElBPkhJRk9dYVpbZF1fVFFSWF1cXFxfWktXXExSXFlJTV5RUV1fYWNjY2NiXGRiYWRjZlhRVlVTXFhbYV9eX2FhX2Rsa21qa2xudn51gXp8hIWFhYWFhYaGhYaFhoaGgnpyc3V1e4WHh4eGhYSBfnhwend2eFxSTUJASUZDRktJRkZHSUdHSkZGRklMSk5FREpKTE5KTElLSkhJR0JISFFNS0tPTUtLSUhIRUQ/RUJISEFARkVDVF1ZXlhfWF9bXVVYWFBdXVFLSlZeWF5bXVZaYVJSX19iYmBgYmJgY2JhZGRiWE9SUlNcU1xeXV5eX19gZGhnbGpubnB7e3x+e4CCg4SFhYWFhYWEhIWDhISHh4FzcneFh4eHh4eHh4eHh4WDgHx4XFNLQkFHRkRHTVJIRFJLRkhISERGS0lNUEVHSUpLTkxMSUxLSUlHREhLUU9NTFBMTEtLSUlERUFFQ0hGQUFGREFWVUVcVF5TVmBYTlRVTlpbTUpLVGBhW19YX15iXU9ZYlxgYF9iY2JdYmJXX19UUE9RUllTXlxcXV5fYGFmZmVsZm9vd3x7gHt9f4CEhISEhIWFhYODhYKDgoWFhnpvgYaGhoeHiIeGhoaFhYSFg35JTkZERkZHRElSY1FEV19JR0dIREZNSlBQRklJSktOTExLTUtKSkdFSU5RUU5PT01OTU5IS0FEQUNERkRCQUNEQExIQkxMUE9PTUZNRkZISUhHTExNT1BJTE9QUFNQTFFTUlVaWVdZWFhkVk9TVFBQT05RVVRcWVlbXl5hYWVmY2hka2xxc3N6eX97en+EhISEhISEhIKEgH57gYOBfXuFhIaGh4eHhYWFhISEgoGAfUtJRUVHRkdES01eTUdIWU1HSEpIR01MUVFJS0pLS05NVU5PS0tMR0dLT1NTTlBPTk9PT0hLRmBFRF9MRGZjQ0xbSF5bc21PTlZtWUxDUF9UbFdnSl1XVV5ETFFVTE1TVlFSVFhXVFhVVFxUUGZaaGhkWVRrVFhXVVtcXGBgYWJiYmBnaWdubGhyenx9foGEhISEg4ODgX19enJ7gXp7f4KAg4SEhYWBhIWBg4N/fnp7S0lFRkZIRUVLT1RKS0dgVEhKT0pJT01SUUtNS0xPUlVST09KTE1HSE1RW1lPUFBOT1BQSUtRf1FJfFlZcnNXUG1IcW5vYVZScnF0T0Jrc25xdHBTb19bblhdVlxYVWtoVV1WY1lgWVpfVlVXf2l0dXVfYXZgWWJcXGZbX2FhYWJeYGJnbXBsYHB3dHiBgYKDhIJ/fX6Adnh6bXZ+dHh+gHx+gIGChHyAg3p/gX9+d3dNSUVITU1CRExMR0pMRlJWTExPSEtSWFdRTk9PTVFUTk9RUEtLTkdNUFNbWlRRUk9QUFFLSVp4XVR4ZGhZUlNQdmd0bHBibmdrUXJPTHdtanJwc3JxcnBvcIBdZnp1eHFxenF+cn1rdX1iUmd8ZXNzb3NzfH1vfnlvf3JfYGBiYlthYGhrbmtibGZnbXd+gYCDfnt4d4B0dnpocn5udHx+d3h7foCDeHyBdXx/fHxzc05LRmBdR0FFTU1IS0tISlFPTU5KTlZeWVVMUVNOWVlMU1NSTkxPSVFSVFlXV1FUUFBRU0xIZ3hsY3hxbVpLTFR5cHVtdWJvd1FkZElldnFtd2+AamZ4eGlXclJpe21panp6fWx4en9wZ29YdXVqdnVwgGFzaHxpbHh8b19fX2NiXF9kZWZpamRnYmNkbGxwcHN0c3NzeXFyeGJsdGdyeXtzcnV5foFzdnpufH15eHJuTUpSdE5DQkVQUElLTEpMUU9PT01QWmBaWEtUV1BhXlJWUVlTTVBKU1RVWFdXUFVQT05TSktyb3V1cXVxZGhhVm5McXBeR2h5V3ZUS2h4fXhgeXtzbmFebW9kU2dydW5teXB3bHZzdHFsbVxzfXprbXl8bHVtfGtwdnV4Xl9fYl5dX2VkaWdoZWVeYmJpaWlqa25va3FubWpwYWNmZG93eG9tcHN5f25xcGp7enRyb21LS1pWSEdFR1JQS0xOS0xRUVBQUFFXXFlVTlZZVWZYUlJZXlRNTkpUVFZXWVdPU09PTlFJUm1IaXdLYGR2dVVXbE5ubHtyYWpnf3VUS1draH1sbWx4YFtwentfYHpzY3JveHFoZHxpcntdVEtsX3Z1a2l1e3ttfnhrfHBdXl5iW15iZGVnZWVlYlpjY2lra3JzcndnbWloZGdgYWxhZ3NybGhtbXJ8a21oa3t0bW1rbU9HSktISkhIUlFNT1BNTFNTUk9TUldSVlRQV1pWVlRUVGFgUU9OS1RTU1FWVk9PTU5PUUpIUU5QVUxLS1JTUlJST1ZVUVFPUlJYWFBOUFVUWFhYW1tVU1NXW1dYV1tPUlRXV1hRXVhWXVVTT1hSVldXWFpgW2dyXltbW11dX2NaX2NjZWZkY2NiWmNjZ2ZmbW5tdWZmZ2NgZl9dZ2BkbGhmZ2tocHpoZ2drdWpoZ2lsUElLS0xNS0pUUk1SUVBMVlVUUFRVWFVaVVJaXVZVVFdVWVhQT0xOV1RQTlVTTlBOTFFQS0pRUUtRTUpLT1FUUlBRU1JJSU1OT1FSUFBRVFZSWFdcV1NTUVFVVVZUWlFOUlFXVVRZVlRZVVNRVVNUVVhZWF5aX2FdXFpaXV1gY1xdYmJkZ2VkZGFZYGFjYWJoaGluY2FkXl9jXVpkXGJtYV5mZmdtc2RpaGtrZWRjZmhRSktLTk9MTVRRT1RRUU1YV1VUVlhXV1pWVFxgVldVWVVYVFFQS09YU1BOVVFOUk5MU1BNTlVTTlFOTU5RU1BUUFJUVE5MTk9RVFRRUVFWV1VZWltZU1VSVFhXV1lbU09SVFdVVFlVVllVUVFXVVZYXFpbYF1WWV9dXl1cXWBhXltiYmNoZmVkYlhgYGJdYGhlZmRhXl9dXV5aWl9aX2dgXl5dY2hrYWhmaGZkYGJkYlBLTUxQUUxPVFBQVFFPUVpZWFdZWlpYWVZdamRWWFlaV1ZUVE9LT1ZUUE9UUFBRTk1RUU9SWFNRUU9NT1NVTldRVFRVT05OUVRVVVJSUlRYVlpdXFpWVlFSV1hWW1xWUFNVVVVWWFNXV1RSUVhWVltfW15gX1ZfXV5gXFxgYF9fWmJiZGhoZWRiWWJgYl5eZmRjYGJdXFxcXFlaW1hbYVteXVxfYl9fYmRkYmRfX2BcUE1OTlJRTVJTUFNUUU9VXFpaV1tbXFlaW2RxbWhkX1tZVlZYUk1NVlNNTlJPUVJPTVBTUlVaVVNQUExQV1VRVlJTUlhNT1BRVFhVVFRTVVlYW15dXFtWUk9VVlVbW1ZRU1ZVVlhUU1haVFNRWVdXXV9bYF9gVmJcYGFdYGJfXGBdY2BjZ2llZmBaY2BhX19lZV9gY1taXFtcWlpZWVdcWlxbYF5gW15eYWBfY1xZYFpRTk9OVlFQVVNQVVRTUFdcXFxZXlxfV1xeanB3eYBjXFtWVllSTk9XU05RUVBSVFJMUVRTWVtXVU9STlNYVVNSVFJSWk9RU1NWW1ZWVlRWWlhdXlxcXlZTTlRWVltbVVFUVFZYWFJTWVxUUlJcWFpdXl1hYWBXYltjYl5hY19cYmFiX2RnaWRnXlxlYGFgYWNkX2JfWVpfW1xbWFhZV1daWlphXF1bXVxcWl1gV1tbWlBPT09ZUFVVU1JXUlRQWl1eXVxgXGBVXF1oanJ9c2xoXFVZV1FPUltTUlFUUlRVVEtSVlVaWlpTT1NRVVVVU05VUVJaUlRVVFhdV1hYU1hcWF5dWVpdVFVOVlZXXlpYUVRUWFhYU1ZZXFRSVl1ZXV1hXmNjX1lgW2ViX2RkXl5jY2FeZWZpZWZdXmRhYWFiY2RfYl5YW19bXFtYWFhYV1taW2BdW1tcW1haW15WXlldUE9PUlpQW1VVV1ZUVFReXmBfXmJcYFVdXmJreXVtfWxaVVpWUVFUXFRUVFVUVllXTFJaVlxaXFJQVVNXVVVTT1dRU1dTV1VWW11YW1lVWl5YX15ZXFlSV1JZWFlfWVlSVFVaWVlVV1lcVVRaXVxeYGFgZWRdXl1dZWFiZmReX2RjYFxnZGhmZGJfZGFfYWBiYl9gXldZXlpcXFpZWVdWXVpdXltaW1xbV1lcXVZYV11TT1BXWVBdVVZZV1dVWF9gYWFgY11gVV1eYmVldoJ7aFhZWlRWVFZcWFdXVlZXXVhPVVxZXl1dVFNYUldVU1JTV1FTVlRYWFhdXlhdW1VeX1hfX1hcVlFZVVlaWmFYW1RWV1paWlhZWVpXVl1eX15jYmJlZV1iXGBmYmVmZF9gZGJhW2ZjaGZjZmFmX19hYmFhYF9eVlVdWVtcW1lcWVldW1tbWFhZW1laWl1fXVRZXVVOU1pXVFxVVldZV1ZcYGFhY2FjX19WW2BkYV96dW9oWlxaVlhWWFtaWVtZWFlgVk9UXVtgYVxVVVlQVFZUUlZVUVNVV1tbXF9eWl9cVl9fWl1eWV5WU1lYWVpdYVldVVZaW1pbWlpZWlhZX19gYGRjZGVlYmRaYmZjZ2ZlXmFiYGNeY2NpZWRnX2deYmJjYWFgXl9YVFpaWltbWFxYWFxbWltXV1pYV1xbXGBdVl1dU09WWlZWWlZZVVhXWF5gYmFkYWRhXllZYWRiYGtmaF5cXVtXV1laXFxcX1tZW2JWU1deXWFjXFNWWVBWVVVVVlVTVVRYXV1fYGBdYV1XYF5bXlxbXlhWWFhbWl9fWl5XWFxcXV1dW1pcV1pfYV5gZWRkZmZmYlljZmVoZ2ReY2BfZWNdZmlkZWhfZ15jYmNhYWBfX1tYWVtZWlpYWlhXW1xaW1dYWlRZXVxaYFxVXmJNUldZVldaWVtcWVdZXmBiYWVhZGFdXllhY2JfYWBhX11dXVhXW1tdXV9fXFpdY1hZV1xgY2RfUllZUFdWV1hXVlZXVl1dXmFiYV9iXllhXV1eWV1eWVhVV1tbYF5cX1lZXV1eXmBcWlpZW19iX2JlZGVmZ2diWmRmZ2lnY19jXmBmZVppaWNmaWNmX2JiY2FgYF9dXVpYW1lZWFhaWVdaW1pZV1hWVVtdXV1gYGJieEtXV1xZV11cXF1aV1xdX2BiZGJjYV1gWGJjYmBjYWNeXF1cWFdbXV9dYF9dW2BkXFxXWmJlY2FSXFlPWFZZW1lZV1paYF5hYmNgYWNfXGJdX11bX15ZWVRYXV1fX15fW1peXmBiYlxcV1tdYGJiY2VkZ2ZlZ2RdZWZoaWZjYWJcY2dgXGlpY2hpZmVgYmFjYV9gX11dXFlcWVhXWFlZV1xbWldXWFBYWl1hY2Zmcmt/SllXXVtaX11cXlxZXVteX2JjYmFhXWJbYmRhX2NiYl1cW1pXWGlxYFxgX11cYWNfXVhZY2VkYlRfWlFZV1xdXFtZW1tjYGNjY2BiZGFgY15gXF5fX1pYVltfXVxhYV9dW2BhYmViXlxTXF9gY2RkZmVnZmVmZV9mZmhoZ2RkYFtmZ15haGhiaGhmY2BiYGNiX19fXV1bWltZWFhYVlpWXFpaVlZVTFhXXGdpa2h1eIF2dnZ2dnZ2dnZ2dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6e3p6ent7e3t7e3t7e3t7e3t7e3x7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHt7e3t8fHx8fHx8fHx8e3t7fHx8fHx7e3t7e3t7fYmIhoqHhYKBgoOCg4OCgoKCgoKCgoKCgoGAgYCBgICAgYCBgYGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t6e3t7e3t7fHx8fHx8fHx8fHx7e3t7e3t7e3t7e3x7e3t7e3t7fHx8fHt7e3t7e3t8iYmHiYaFgoGCgoGCgoKCgYKCgoKCgoKBgYGAgICAgICAgIGBgYB9fHx8e3x8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eHh5eXl5eXl5eXl5eXt7e3t7e3t7e3t7e3t7e3x8fHx7fHt6enp6ent7fHx8fHx8fHx8fHx7e3t7e3t7fHx8e3t7e3t7e3t7fHx8fHx7fHt7e3uHiYiJhYSDgYKCgoODgoKCgoKCgoKCgYGBgICAgICAgICAgYKBgH58fHx8fHx8fHx8fHx8fHx2dnZ2dnZ2d3d2d3d3d3d3d3d3d3d3d3h4eHh4eHh4eHh4eHh4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t8e3t7e3t8fX19fXx9fHp6enp6e3t8fHx8fHx8fHx8fHx8fHx8e3x8fHx8e3t7e3t7e3x8fHx8fHt7e3t7e4aJiYiFhYOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgIGBgYCAfnx8fHx8fHx8fHx9fX18fHVwb29vb3Bwen59fX19fYSMi4uLi454KSkqKiopKz0/Pj4+Pj5tgH5+f397pdfT09PT1r2GiYmJiYqHc3FycnJydD4oKysrKiKL29LS0tLWun1+f39/f359fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx8fHx8fHt7e3t7hIuHh4aHgoGDg4GCgoKCgoKCgoKCgoGBgYCAgICAgICAgYCBgIB+fHx8fHx8fHx9fXx8fH19dXBub29vb296gH9/f39+hpCPj4+Pk3kZGhoaGhocMTMzMzMzMmqCf4CAgHut6eTk5OToyomMjIyMjIlyb29vb29yMhcbGxsbEI7v5eXl5enHfX5/f39/f319fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e3uCjYeIh4eDgoSCgYKCgoKCgoOCgoKCgYGBgICAgICAgICAgICAgH58fHx8fHx8fXx8fH19fX12dXV1dXV1dXZ3d3d3d3d4eXl5eXl6eG9wcHBwcHBycnJycnJyd3p5eXp6en6Dg4ODg4SBfHx8fHx8fHp6enp6enp1c3Nzc3NzfYWEhISEhYJ8fX19fX19fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e4CMhomHh4SDhIKCgoKCgYKCg4KCgoGBgYGBgYCAf4CAgICAgICAfnx8fHx8fHx8fX19fX19fXZ2dnZ2dnl3dnZ6e3h7eHd2dnh5enl6fnl5eXh4eHh5eXl5enp5eXl5enp6eXh4eXl5eXl7e3t7e3t7e3t7e3t7e3x9fX19fX17enp6enp6e3x8fHx9fX19fX19fX18fH19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8f4uHi4qIhIODgoKCg4KBgoKDgoKCgYGBgYGAgIGAf4CAgH+AgYF+fX18fHx8fHx9fX19fX19d3d3dnZ3fXh3d316eH14d3d3fHt6fHp9e3h3d3d3eHh4eHh5eXl5eXp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fHx8fHx8fHx7e3x8fHx8fHx8fHx+iomMjImFg4SEgoKDgoGCgoKCgoKBgYGBgYCAgICAgICAf4CAgH19fXx8fH19fX19fX19fX13d3d3d3p9eHt4fHx3e3h3d3l+e3l9eX16eHh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fX19fXx9fX19fX19fX19fX19fHx8fHx8fHt7fHx8fHx8fHx8fH2Kio2NioWDg4OCgoKCgYGCgoKBgoGBgYKBgIGBgICAgIB/gIGAfXx9fX18fX19fX19fX19fXd3d3d3fX55d3d4e3p8eXd3e358eXx6e3p3eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt8fHx8fHx8fHx8fHx8fH19fX18fH18fH18fHx8fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8foqJjo2JhISEg4KDgoKBgYKBgoKCgYGBgoGAgYKAgICAgH+BgIB8fH19fX18fX19fX19fn5+d3d3d3d5fHl7eHx9eXt5enp4e3x8fXt9e3h4eHh4eHh4eXl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt7fHx7fHx8fHx8fHx8fXx8fX19fX19fXx8fHx8fHx8fXx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx/iIeNioeFhoaDg4ODgoGBgoGCgoGBgYGCgYCAgoF/gICAf4CAgHx8fX19fX19fX19fX5+fn53d3d3d3Z4eHl3eXp4enh5eXd4ent6eXt4eHh5eXh4eHh5eXl5enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX18fH18fH19fX19fH19fX19fHx8fHx8fHx8fHx8fX+HiIyIhoeHhIKDhISCgYKBgYKCgoGBgYKBgIGBgYGAgIB/gIGAfHx9fX19fX19fX1+fn5+fnd3d3d3d3d3d3d3eHh4eHh4eHh4eHl5eHl5eXl5eXl5eXl6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fHx8fX19fHx8gIeIi4eHiYaDg4SDg4KBgYGCgoGBgYKCgYGBgIGBgYCAgICBgX97fH19fX19fX19fn5+fn5+d3d3d3d3d3d4eHd4dnl5eHh4eHh5eXl5eXl5eXl5eXl5enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fH19fXx9fXyBhoqKiYmIhIOFhISCgoGBgYGCgYGCgoGBgYCAgYGAgIGAgIGBf3x8fX19fX1+fn5+fn5+f394eHd4eHh4eHZxZGpeam15eXl4eHl5eXl5eXl5enp6enp6enp6enp7e3t8e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIGFiYqJioeEhYWEg4KCgYGBgoKBgYKBgYGBgYCBgYCAgYCBgIF+fH1+fn5+fn5+fn5+fn9/f3h4eHh4eHh5bWRiZV9fXm95eXl5eXl5eXl5eXp6enp6enp6enp6e3t7e3t7fHx8fHx8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goWKiomJhISGhYSDg4KBgYKCgoGBgoGBgYKBgIGBgICAgICBgH58fX5+fn5+fn5+fn9/f39/eHh4eHh4eW5kZWdlZGJeZnh5eXl5enp6enp6enp6enp6enp6e3t7e3t7e3x8fHx8fHt8fHt7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChouJiIqEhYaEg4OEgoGBgYGCgYKCgYGBgYCAgYGBgIB/gIGBf3x8fn5+fn5+fn9/f39/f394eHh4eHl3Z2VkZWZkZWFfaXl6enp6enp6enp6enp6ent7e3t7e3t7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHt8fHx8fHx8fHx9fX19fX19fX19fX19fXx9fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4eJh4SEhoSDg4WBgYGBgYKCgYGBgYKBgICAgYGAgYCAgYF+fHx/f35/f39/f39/f39/gHl5eXl5eWtlYWJlZWFlZV5ieHdze3p6enp6enp6enp6e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fH18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19g4aLhoiFhYaEgoOEhIKBgYGBgoKBgYKBgYGAgYGBgYGAgIGBgn98fH9/f39/f39/f3+AgICAeXl5eXl0Y2NlZGNmY2doZGZsZF5ze3p6enp6enp6enp6ent7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn6DhouGhoaGhYODg4SDgYGBgYGCgoGBgYKBgYCAgYGBgYCAgYGBfnx8f39/f39/gICAgICAgIB5eXl6d2RhY2diYmRdW2VfYV1eYGFoeHp6enp6enp6enp6e3t7e3t7fHx8e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+foSFi4eGhoaGhIODg4KBgYGBgoKCgYKBgoGAgIGBgYGAgYGBgYF+fX1/gH+AgICAgICAgICAgHl5eW9vYmJiZF5jZ19dYWFgXF9kYlttfHp6enp6enp6enp7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7fHx7e3x7fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5/hIiLhoSHhoaEhIODgoGBgYGCgYGBgYKCgYCAgYGBgYGBgYGBgX5+fYCAgICAgICAgICAgICBeXpwXWJlZGJkXmZnZ2BZYmJhY2VfXF1ze3t6enp7e3t7e3t8fHx8fHx8fHt7e3t7e3t7e3t7e3t7fHx8fHx8e3x8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fn19fn5+fn5+fn5+fn5+foCFjIqEhYaGhYODg4SCgYGBgYKBgYGBgoKCgYCBgYGCgICAgIGBf35+gICAgICAgICAgIGBgYF5emxiZGdjYmdmYWBgZGFiZWRjZGNeXGJ1fHt7e3t7e3t7e3x8fHx7e3x8fHx7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/gYeMiYWGhoeFg4SDgoGBgYGBgYKBgoKCg4KBgIGBgYKBgYGCgoF/f36AgICAgICAgIGBgYGBgXp7dGdnZmZkZGZmYF5fYWNlaGRlXmJkYHR8e3t7e3t7fHx8fHx8fHx8fHt7fHt8fHt7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f3+CiYqIhoaIhoWDhIOCgYGBgYGBgoGBgoKCgoGAgYGBgoKBgYKCgX9/f4GBgYGAgYGBgYGBgYGBenptaGNjZ2ZnZWdmZmdiZWRlYmdbYmVgdnx8e3x8fHx8fHx8fHx8e3t8fHx8e3x8fHt7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f39/f4SJioiGiYeFhYSEg4KBgYGBgYGCgYKCgYGBgYGBgYKBgoGBgICBgH9/gYGBgYGBgYGBgYGBgYF7emlpZGNqZmFgZmVjY2NnaWRjYmBiZGJ0fXx8fHx8fHt8fHx8fHx8e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f39+fn9/f39/f39/f3+AhIqMiIeJhoSFhYOCgYGBgYGBgYKBgoGBgYGBgYGBgoKBgYGBgYGAgH+BgYGBgYGBgYGBgYGBgXZzZWRnY2RmZWJlZmdkZmhmZWNgYGNkYHF9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fXx8fHx8fHx9fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/fn5+f35+f39/f39/f3+AgICFioyJiIqJhoaDgoKCgYGBgYGBgoGBgoGBgYGBgIGBgYGBgYGCgX+Af35/foCCgoKCgoKCgoKCc3NnZWRkZWlqaGZnZ2NhZmZlZmdmZWVjdX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fH19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gICAgICAgIWLioqJioeHhoSCgoGBgYGBgYKCgYKBgYGBgIGBgoKBgYGBgYGAf4B+dHRzdX1/goCAfn5/gYB0cmdkZWNmaWppZWNlY2BmZGRnZ2JiZWFwfXx8fHx8fHx8fHx8fHx8fHx9fX18fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f39/f39/f4CAgICAgIB/houLiouLh4eHhIOCgYGBgYGBgYKBgoKBgYGBgYKCgYCBgYGBgoCAgH5zc3NzdHV4dXV0dHV2dXVwZmNmZWhoaWdoZ2VmZWJfZGVmY2BiZ3d8fHx8fX19fX18fHx8fH19fX19fX19fXx9fXx8fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gIB/f3+AgICAgICAgICHjIyIi4qHh4eEhIKBgYGBgYGBgoGCgoGBgICBgoGBgYKBgoKCgYCAfnNzc3Nzc3NzdHR0dHNzdW9jY2FnZWhoZ2pmZGVnZmhmY2JlYl5ieX18e3t8fX19fX18fHx9fX19fX19e3x9fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn9/fn5+fn5+fn5/f39/f4CAgH9/gICBgICAgICAgYCAf4CAgYGAgIeLi4iNiYiJhoSFgYGBgYGBgYKCgYKCgYGBgIGCgoGBgYKBgoKBgIB+dHNzc3Nzc3Nzc3Nzc3N1cmdlZWRlamhoZ2ZpaGdjZWViZGNoZGd7eHVzc3R2dnl4dnR0dHZ3d3d2dHR0dXV4d3h4d3d6e3x9fXx9fn5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f35/f39/gH9+fHt7fX58eXl2dnZ5fHx6end2d3l7fXt4hIyMioyHh4iEhYSBgYGBgYGBgoGBgoGBgYGAgYKCgYGBgoGBgoGAgH51c3Nzc3Nzc3Nzc3Nzc3VzaGVnaGVrbGhqZ2lqZ2dnZmRkYmVkbnV0dHNzdHNzc3Nzc3Nzc3Nzc3NzdHNzc3Nzc3Nzc3N0dHV1c3V3eHl7fn59fn98f39/f39/f39/f314fH5+fXx4dXZ3eXd4dnRzc3N0dXRzc3Nzc3NzdHNzc3R0c3R0dHODjI2KiYeIhoOGg4GBgYGBgYGBgYGCgYGAgYGDgoKBgYCBgYGBgICAf3VzdHRzc3Nzc3Nyc3NzdnZpY2hqaGpsZWZpbGhgZmVkY2BkZGZ0dXV1dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHRzdHRzc3Nzc3R2dnV1d3V4fH9+fX9+fHp4dXN0dXV1dHNzc3Nzc3N0dHR0dHR0dHR1dXR0dHV1dHR1dXR1dXV1dIaMjYuIhoeEhIWCgYGBgYGBgYGCgoGAgYCBgYKCgoGBgIGBgYGAgIB/dnNzc3Nzc3Nzc3Nzc3N2dnNnZ2pmaGdmaGhmZGlnY2NnZWVmcHZ1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dHR1dHR0dHR0dHRzdHR0dnV1d3Z0c3R0dHR0dHR0dXV1dXV0dXV1dXV1dXV0dHNzc3N0dHNzdHR0dHR1dXR1iY6MjIqHh4SEhYKBgYGBgYGBgYKCgoGBgICAgoKCgoGBgYGBgYCAgH93c3Nzc3NycnJyc3NzcnZ2dW5kXWNnZWlraGVoZ2dqamlnZXB2dXV1dXV0dHRzdHR0dHR0dHV1dXV1dXV0dHV1dHR1dXV1dXV1dXV1dXR0dHV1dXV1dXV0dHV0dHV1dXV1dXV1dXV1dXV1dXV1dXV0dHNzc3Nzc3N0dHNzc3Nzc3R0dHR0dHWKjoyMiYaGhIeFgoGBgYGBgYGBgoKBgYGAgYGCgYKBgYGBgYKBgICAf3hzc3Nzc3JycnJyc3NzdnZ3d2liaGhnamtpaGZkZGVmaWhwdXR0dHRzc3JxcnJ0dXV0dHR0dHR0c3NycXFxcXNzdHR0dHR0dHR0dHV0cnJyc3R0dHR0dXV1dXV1dXR0dXR0dHR0dHR0dHR0dHR0c3Nzc3Nzc3Nzc3Nzc3N0dHN0dHR0dHR0dYuOjImGhYWFh4SCgYGBgYGBgYGBgoKCgYGAgIKCgoGBgYGBgYGBgIB/eXNzc3NycXJycnJzc3N3d3d3bGpoZGhpa3Z6a2VmZWhnbXJzdHN0c3JwcHBxcnN0dXR0c3NycnNycXBvb29vcHFzc3NycnJyc3R0dHNxcHFyc3R0dHR0dHRzc3Rzc3NzdHR0dHRzdHR0dHR0dHRzdHR0c3NycnFxcnJzc3Nyc3NzdHR0dHN2jZCMh4eFhYSEgoGCgoGBgYGBgYGCgoKBgYGAgYGCgoGBgoKBgYGAf395c3NycnFxcnJycnNzc3d3d3dzc2pnaWloeX99cW51bG5wcXJycnFxcG9wcXFxc3Rzc3NycXFwcG5ubm1ubW5ubnBxcnJycnJycnJzcXBvb3BxcnJzc3JxcnJycnJycnJycnJzc3Jzc3Nzc3Nzc3Nzc3Jxb29ubm9vcXJzc3Jyc3NycnNzcnaPj4uHhoWFhYOCgoKBgYGBgYGBgYGBgoGBgYGCgoKBgoGCgYGCgX9/f3hxcHBwcXFycnJyc3Nzd3d2dnd2cnF0c252f352c3hwcHBycnJycXFwcHFxcXFyc3Nzc3FwcXBvb25ubm5ub25vcHBxcXFxcXBwcXJwb25vcHFxcXFxcHBxcXFxcXJycnJycnJycnFxcnFxcnJycnFwb29ubm1ubW5vcXJycnJycnJyc3JxeI+OjYaDg4aEgoOCgoGCgYGBgYKBgYGCgYGBgYKCgoKCgoKBgYKBf4B/d29wb3BxcnJyc3Nzc3J2dnZ2dnZ3dnZ1c3l/fnd3d29wcXFxcXFxcHBwcXJxcnJzc3JycXBwb29wb29vb29vb29wb3Bvb29vcHBxb29vcHBwcHBvcG9wcHFycXFxcnJycnFxcXFxcXFxcHBwcHBxb29ubm5tbW5tbm9wcXFxcXFxcXFxcXB7j42NhoODhYOCgoKCgYKBgYGBgoGCgYGCgoGCg4KBg4KBgYGAgYF/f392bm9wcHBxcXFxcXBwcHZ2dnZ2dXR0c3NxfYB9fX9zb3BxcXFwcHBwcXFwcHBxcnJxcXFwb3Bvb3Bwb29wcG9vb29vb29vb3BxcXBub3Bwb29wb29wcnJycnFxcXBxcnFwcXFxcHBwcHBwcHBwb29ubm1ubm5ubm9ub3BwcHFxcXFxcXFxcIKRjoqEhIOFhIOCgoGBgoKBgYKBgYGBgYGCgoKCgoKCgYGBgYCBgX9/gHVvb29wcXFxcXBwcHBwdnZ2dXRzcnJycnGAgoCBeXBwcHBvcHBwcHFxcXFwcXFxcXFxcG9vcHBwcHBwb3BxcHBvb29wb29vcXFwcG9wcG9vb25vcHFxcHBwb3Bvb3BwcHBwcHBwcHBvb29vb29vbm5tbW1ubm5ub25vb3BvcHBwcHBwcHBwiZCMiISDhIaDg4KCgYGCgoKCgYGBgYCAgYGBgoKBgYGBgYGBgIGBgH+AdG5vb3BxcXFwcG9vcG92dnVzcnFxcXFxcICDg39ycHBwcHBwcHBwcHFxcHBxcXFxcXBwcHBwcHBwcHFwcHBwcHBwcHBvcHBxcXBwcHFxb29vbm9wcHBvb29vcHBvb3BwcHBwcHBwcHBvb29vbm5ubm5ubW5ubm1ubm9wcG9vb29vb3BzcXWPj4yJg4KFh4ODgoKBgoGCgoKBgYKBgYGBgYGBgYGBgYCAgYGAgYGAf4B0b29vbm9vb29vb29vb3Z1dHNxcXFxcXJygIKCgXRxcXFxcXFxcXFxcXFxcXFxcXBxcXFxcHFwcXBxcXFwcHBwcHFxcXBxcHBwcXBwcHBwcHBwcHBwcHBwcHFxcXBxcHBwcHFwcHFxcHFxcXFxcXJxcnFwcnRycnR0dHR1dnRzdHR0dXd3gpCPi4iDgoaHhISCg4GBgYKCgoGBgoGBgYKBgYGBgYGAgICBgYCBgYB/gHVvb29vb29vb25vb29vdXRzcnJycnJycnKDg4OCdnFycnFxcXJxcnJxcXJycnFxcXFxcnFxcXJycXFycXFxcXFxcXFxcXFwcXFxcXFxcnNzcnJyc3V1dHR0dHR0dHV2d3d3d3d3eHh4eHd3eHh4d3Z3dnV2dnZ2d3h6e3x7e3t6enp6enyGkI2LiIODiIeHhYODgoGCgYKBgYGBgYKCgoGBgYGAgYCAgYGAgIGBgH+Ad3FxcXFxcG5ucG9wcG92dHV1c3Nzc3NzdYiDgoN5cnNzcnJyc3Jyc3NycnJycnN0cnJzcnNzc3Nzc3Nyc3N0dHV1dXV1dHV3eHd3d3d4eHh3eHh4eXl5eXl4eHl5eXp6e3t7e3t6enp5eXh3d3d1dnV2dnd5enp7fn5+fX1+fn5/f35+gIyQi4qHg4WIi4iEg4SDgYGCgYGBgoGBgoKCgoKAgYGBgYCBgYGAgIGAf4B8enp5eXx5eHh2dXZ2dHl2d3h3d3Z3dnZ6f3x+fnx2dnd3dnV4enh4eHh3d3d2eHx5eXx6eXl8e3l5eXh4eXl6enl5eXh4enp5eXh4eHh3dnd3eHh3eHh5eXp7e3p8fH1+fX9/f359e3t7e3p5enl5e3t/foB/fn5/fn19fX5+f35+fn6AjpCNioeEhoqLiIaGhIOBgoKBgYGCgYGCgoKCgoCBgoKBgYGCgYCBgIF/f4B/fn19fX9/f318e3t7eXh4eHh5eXl4eXh5eXl4enp6enp6e3t7fH1+fHt7ent8e318e3t7e3t7enl4eXh4ent6enp5eXp8fHt6enx8fHp6ent9fHx+fn+AgoGAgYKAgH9/gYGBgIB/f35+fn5/fX1+f4CAf35+f39+fn9/f39/gH+Af4OQjoyHhoWIi4yIh4aFg4GCgYGBgYKBgoKCgoKBgYKDgoGBgYGBgIGBgIB/goOCgoGBgX99f39/f4F6enh4d3h4eHh5eHh5enp5e358enx9fXt8fX19fHx8fnx9fn5+fn59fX9/f3x8fYGDgYCAf318fXx9fXt9fXx8fH19fX1+gYGChISDgoB/gYGBgH9/f4B/f39/f39+fn9/f39/f35+f3+Af39/gICAf4CAgICAhJCPi4eGhoiLi4mKhYaDgoKCgYGBgoGCgYKBgYGBgoOCgYCAgYGAgIGBgH+ChIKCgICAgH9+fn+AgH9/fn18fX19fYB/fX+Af35/gH9/fn9/gIGBgICAf3+BgICAf4CBgn9/f4CAf35+f39+f39/fn5+f39/gYB/f4CBgYCAgYOEgoGCgoGCgH+AgYCBgYGAgH+BgICAf39/gICAgYGBgIGBgYCAgICBgoGBgYCAgYGFjo6MiYaHiYyLi4qGhoOCgoKBgYGCgoOCgoKBgIGBgYKCgICBgYCAgYGAf4KFg4KBgYCAf39+fn+AfX5+fn19fX5/fn9/f35+fn+AgYCAgICAfn9/fn+Af3+AgH9/f35/f39+fn59fn9+fn9/f35/gIGBgoKDg4KCg4KBgYKDg4OCgYGBgYKBgoKCgYKBgoGBgYGBgoKCgYGCgYKCgoGBgoKBgYKCgoKCgYGBgoKCgoaPkY+KiImKjY6NiYaFgoKCgoKBgYKCg4KCgoGBgYGBgYF/gIGBgYCBgIF/gYWEg4KCgoGCgYCAgIB8fHx7fH18fH9+fn9+fn5+f35+f39/f39/f359foB+fn5+fn9/f39+f39+fn5/gIB/gIB/f39/f3+BgYGCgoCAgYKDg4SDg4ODgoKCgoKCgoKCgoKCgoGCgoKDg4OCg4ODgoKCgYKCgoODg4ODgoKCgoODg4KCh5KTkIuKi4uPj42Kh4SCgoKCgYGBgoKDgoKBgYGBgIGBgICAgYGBgIGAgYCAg4SDg4OEg4ODgoKCgXx9fHx9gn1+f4GCiIGCgoSCgYGDg4GBgYKCgIGBgYCAf39/gICAf3+AgX9/f39/gYCAgICAgH9/f3+AgICAgH9/gYODhYSEg4SDgoKCg4OCgoOCgoODg4ODg4SDg4KEhYWDg4SEgoKDhIOCg4ODg4OCgoODgoCKlJOPioqMjpCPjYuGg4KCgoKBgYGBgoOCgYGBgIGBgoGBgICBgYGAgYCAgH+BgoODg4SEhIOCgoKCfXx8fn6AgYOAg4OChIaFhoaFhIWFg4ODg4OBgYKEhIKDgoeDgoKAgoGBgoKCg4KCg4KDgoODgoGAgIKCgYOCgYKCg4OEhYWEg4OChISEhIOEhISDg4OEg4ODg4OEg4SDhIWEhISDg4ODgoKCgoKCgoKBgYKCgo+UlI+Njo6RkY6KiISCgoKCgYGBgYGCg4GBgIGBgYGBgYCBgIGBgYCBgICAgIKChIKChIOCg4ODgoJ9fX2AgH+AgoGDg4ODhIaEhIOEhYWDg4GBgoOBgIKDgYKFhYWFhoaHhoWGhoeHh4aGhoeHhoaEgoGCg4SDg4ODg4ODhISFhYWDhYSFhISEg4KBg4OCg4SEg4KCg4SCg4ODg4OCgoKCgoKCg4OEhIOFhYWFhoaIk5OTkI+Pj5KRjIqIgoKCgoKBgYGBgYKDgoKBgIGBgYGBgICAgYGBgICAgICAhISEgoKCgoGBgoKBgX+AgYOCgICAf4CCgoGDg4KCgYODg4SEg4KDhYOCgYGBgoSFh4eHh4aGh4eHiIiHh4eIiIiFhIOBgIGBgoKCg4GCg4SEhYSDg4OEg4OEhIOBgYGCg4OEhISDg4ODg4OEhIODgoSDg4ODhIWFhoeHh4eIiIiJiY6TkpKOj46Qko+LiYeCgoKCgoKBgYGBgoKCgoGBgIGBgYGAgICAgYGAgIGAgICDg4KCgYKCgYGAf4CBhYWFhoOCgYB+fn+BgoSCgYKDhIOCg4ODg4KChISDg4OBg4SFhISFhYSDg4SFhYKEhIWFg4KBgH9/gIB/gIGEg4OEhYWEgoKCgoOCg4OFhIKDhISEhYaGhoaGhoWFhoeHhYaIh4aHiIeGhoaIiYeGhYaGhoeIkZKSj46QjpCRjImHhYGBgoKCgoGBgYGBgoOBgYGBgYGBgICAgICBgYCAgICAgISEg4KBgoGAgYGAgYKIh4aHhYSCgH99fX6AgH+AgYGBgYGBgoGAgYKCgoGCgoKBgYGCgYKCg4GBgICAf4GAgH+AgH9+gIGBgYKCg4OEg4OEg4OCgoGBgoODg4SEg4SEhIOFhYaFh4eIh4eHh4eHh4eGhoaGh4WFhYaGhIWEhIWEhYaSk5GOjo+OkI6JiIeEgoKCgoKCgoGBgIGCgoKCgoKCgYGBgYGAgYGBgICAgYGAgoSDg4KDgoGCgYKDg4iHh4iHhYSCgX5+gICAfn5+f4CBgYGCgYCCgoGCgH+AgIB+gIKBgIGCg4OAf39/gICAf4CAgICDg4KDg4ODgoOBgYKCgoOCgYKCgoOCgoSDhISDg4SEhYWFhYaGhoaFhISEhYWEhIWFhYSEhISDhISEhISEipSTkpCQj46NiIaFhIOBgYKCgoKCgYGAgYKCgoKBgoKBgYCBgYCBgYGAgICAgYGAg4OCgoOCgoKBgoOCiImJiYiHhYSDgYKEhIOBgYGCgoSCgoOEgoOEhYaEgoSCgX+AgoGBgoGChIOBgYGBgoOCgoGDg4SDg4SEg4OCg4KDg4ODg4KCgoKCgoGDhISEhYSFhYWFhIWEhIWFhYWDg4OEhISEhYWFhISEhISEg4ODg4OOlZKQkZGOjYyHhYODg4GCgoKCgoKBgYCBgoOCgYCCgYGBgICAgIGBgYCAgICBgICDhYSEhIODg4SDhIOGh4mIhoWDhIODg4WDgYCDgoOFhYODg4SDhIODhISFhISEgoGAgYKDgoKEg4OCgoGBhIWEg4ODgoKDhISDg4ODg4SFhISDg4KCgoKCgoSEhYSFhYWFhYODhYWFhYaFhoWEhIWEhYWGhYWFhIWEhISDhIODhJGUk5OSj4yMioWEhIODgYKCg4KCgoKBgYGCg4KBgYKBgYGBgICBgIGBgH+AgIGAgYaGhoaGhoaHh4aGhYSDhYaCgIGBgYGHgoB+f4GAgIKBgX+BgYCAgoGCgoKBgYKCgYCCgoKCgYKDg4GCgYKDhYODg4KDg4OEgoKEhIOEhIWEg4OCgoKCgYKCg4ODg4SFhYWFhIOEhYWGhYWEhISEhIOEhIWFhYWFhIODhIOEg4KGlJOSlJKPjYuHhISEg4KBgoODgoKDg4GBgoKBgoKCgYGCgYGBgYCAgYGAgICAgICAhYWFhYaGh4aGhoWGg4ODg4GAgoKCgYKAf35/f4CAf4B/gIGAgH+BgYGBg4GAgYGChIOBgYGBgYKBgYKDgoODgoOCgoKCg4OBg4SDg4ODg4OEhIKCgoKDgoKDg4ODhIWEhISEg4OEhIODg4OEhIODg4ODg4SDg4ODg4KDg4KDgouUk5KTkY2NioaDg4OEgoGCg4ODg4ODgoGBgoGCgoKCgoKBgYGBgICBgYCAf4CAgICDhISFhYSFhYWEhIWCg4KDgoKDg4OBgICAgICAgYCAg4KCg4KBgoKDg4OEgoODg4KAgICCgoKDgoKDg4ODgoODhIKCgoODgoKDg4KCg4KDg4WEg4ODg4SDg4SEhISEhYWEhIWEg4SEg4OEhISEhISEg4SEhYSDg4SEhIODgoKDkJSSkpKPi4yIhoOEg4OBgYKDg4ODg4OCgYGCgoKCgoKDgoCBgoGAgICAgIB/gICAgISDhYWEhYWFhYSFhYOEhIWDg4SEhIKCgoOCgoSCgYKGhYOFg4OEhISFhYSEhYJ/fX19foKEg4ODg4OEg4ODhISEg4OEhISEg4SEhIOEg4OFhoWFhYSEhoWFhYSFhoWGhoWFhYWFhYWFhYWGhoWGhoaFhoaGh4aFhYWFg4SEhIeTk5KRkoyKiIWFhYWCgoGBgoODg4OCg4KBgYKDg4ODgoKBgIGAgICAgICAgH+AgICAhYWFhYWGh4eGhYWFhISFhYSEhISEg4ODg4OEhYOCg4SFhYaFhoaFhYeHhoOAfn9+fn5+f4OEg4OEhISEhISEhISEhISFhYWEhYSGhYWGhYaGhoWGhYWHhYWGhYaGhoaFhIWFhYWFhIWGhoaHhoaGhoaHh4iIiIaFhYaEhYWGjZSTkpGQi4qHhoeGhIGCgoKDg4ODg4KDgoGBgoODg4KAgYGBgICAgICAgICAf4CAgICHh4eGhoeHiIeHhoaEg4ODhIODg4OEg4ODg4OEhIODg4WFhYWHh4aHh4WBf39/f39/f35/gISFhIWGhoaFhYWFhoaHhoaFhoWFhoeHh4iHh4eGhoaHh4eGhoaHhoaGhYSDhIWFhYSFhYaGhoeHhoaGhoeHh4eIiIeGhoaHh4eRk5KQkZCLiIiFhoSDgoKBgoODg4ODgoKDgoKCgoOCgYCBgICBgICAgIGAgIB/gICAf4aHiIeHh4eIiYmIiIODgoKDgoSEhIWEg4KCg4OEg4OChIWEhYeHhYeDgH9/f39/gIB/f4B/f4WFhoeIiIeHh4eIh4iHiIiIhoaHiIiJiYmIh4aHh4eIiIaHhoeHhoaFhIOEhYaFhYWFhoaGh4eFhoeGh4aGh4eHh4eHh4eFh5OTkY+RkIuHhoWGhIKCgYGCg4ODg4ODgoKCgoGCg4KCgIGBgYCAgICAgICAf3+AgYB/hoiIiIiHh4iJiYmIg4KCg4ODhIWHh4eFg4OFhIODg4KFhIOEgoGBgYGCgYGBgYB/gH9/fnt6gIaIiIqKiYmIiImJiYmKi4qIiIiJiouLioqIiIeIiIiHh4iIh4iGh4aEg4OFh4eHhoWFhISDhYWEhYWGhISEhYWFhoWGhYOJlJOQjpGOioaFhoWDgYGBgoKDg4ODgoKCgoKCgoKCgYGBgYGBgYCAgICAgIB/gICBgH+GiYiIiYeIiImJiIiEgoKDg4KDhImKh4aEhIWEg4OFg4iIg4GBgYKCgoKCgH9+fH19fX9+fHt8g4eJi4uKioqIiIqJiImLiomJiImIioqJi4mHhoaGh4WGiIiJiIeGh4SDgoSIiIiIh4WCgoGDg4KDg4SCgoKDgoGEg4SDgY6TkpCPj4uIhYSGhIKBgYGBgoODg4OCgoKCgoKCgoGBgYGBgIGAgICAgICAgH+AgIGAf4WIh4eHhoeIiIiHh4SCg4OCgoOFiYqJh4WHhYSFhYSDio2CgoKCgoKDgX59fn5+fn5+fX1+fX19g4eJioqHh4WGh4eHh4iHh4mGiIaIh4eJiIODhIOFhISFhYaIh4aFg4KCg4WHhoeGhoOCgoOEgoODhIKBgoGBgYODhIOEkZKRjo+Oi4eEhoaEgoGAgYGDg4ODg4KCgoKCgoKCgYGBgIGBgYCAgIB/gIGAf39/gIB/hYaGhYaGhoeHiIeGgYKEhIOChYaIi4qGhIaEgoaGgoCHhoODg4OCgoF9fH1/gH9+fn59fH19fHp8hIaHhoSDgYODhIWFhYODhYSEhISEhIWEgoKDgYSEgYKDg4WGhYSCgYGCgoODhYOEhIWEhIaDhISFg4KDgYKDg4SFhIeSkY+Nj4yJhoSFhIWCgYCBgYODg4ODgoKCgoKCgoKBgYGBgYGAgICAf4CAgYB/gICAgICDhIWEhYWFh4eHh4aAgYGFg4OEhYSHiIWCgYCAgX99foODg4ODgoKAfX1/gICBf31+fn19fX16enp+g4SEgoGBgIGBgoKBf36BgYGCgYOAgoGCgoKBg4OAf4CAgYOCgICAgICBgYGCgYGChIODhYSCg4SDgoKBgoSDhYWGjJORjo+Pi4iFhYOChIGBgYGBgoODg4KCgoKCgoKCgoGBgYCBgYCBgH9/gIGBgICAgH+AgIKCg4OChIOEhYWGhn+BfoCBgICAf4GDgn9+fn9+fHx/g4OCg4KDgX19fn+AgIGAfn19fX1+fXx6enp/goKBf39/f35/f4B+fYB/f4CAgX+AgIF/f3+BgX59fX+AgX9/foCAgH+AgICBf4CCgICCgYGCgYGAgYGBgYKEg4aPkpCOj42Kh4eGg4OCgYGBgYGCg4ODgoKCgoKCgoOCgYGCgYGBgICAgH+AgICAgICAf39/gYKDhIGCgoOCg4SFgIB/fH19fn1+foCAfn1+fXx9foKDg4KCgYF/fX1+f4CAgH9+fX19fHt7e3p6eXqAgIB+f35+fnx+f35/gH9+f3+Af4GAf359fn9/fn18fn+Af35+f3+Af39/f4B/f4B+f4CBf4B+f39/gH9/f4B/hZKSj46Pi4uHiYWEg4KCgYGBgYKDg4ODg4OCgoKDg4KAgYKBgYGAgICAf3+AgIB/gIF/f36BgYSEgYKBg4OCg4OBgH98fn5/fn6Af4B/foB+fX+BhIOCgYB/f359fn5/gICAfn19fX17e3x6enl5eXuAgH9/f39+fX5/foCAf35/f4CAgoB/fH5+f35+fXx/f4B/fn9/f4B/f35/foCAf36Af39+fn5/f35+f318fH2Fk5KNjIuKiImIhISEgoKCgYGBgoOCgoODgoODg4ODgYCBgYGBgYCAf39/f4CAgICAgIB/foCBhIOCgYGDhISDhICBgICBgIGAgYKCg4GBgX6AgoODgYGBgYCAfX19fn5+f359fX19fXx8fHt6eXl5eX2BgICBgYF/f4B/f4F/gICAgYGCgoB+gH5/fn5+foGAgoF/f39/gIB/f39/gYB+f4CAfn9/fn+Af31+fX17fIaTkYyLioeHioiGhoSDgoGBgYGCg4ODg4OCg4OCgoKBgICBgYGAgH9/f39/gICAgICAgH9+fn+BgYGAgISGh4aHgoSDhYOBg4ODhYSEhISDgYODg4KCgoKCgX5+fX19fn6AfX19fX19fX18e3p6eXl5eYCCgoKEg4CCg4GAgoCBgYGDgoODgYGCgIGAf4CBg4GEgoCAgYCBgYCAgYCCgn+BgIF/gIB/gICAfn9/fnx8ipOQiomIiIiJiIaGhoSCgoGBgoKDg4ODg4KDg4KCgYCAgICBgYGAf39/f4CAgICAgIGBf359fn5/f39+g4aHh4iChYSFg4SFhIWGhoaGhoWFhoGAg4ODgoKAfX19fX19fn59fX19fX19fX18e3l5eXl4fIKDhIWCgYSDgoKDhYaCg4SDgYKCg4OCgoKCgYKFg4iFgoGBgYKCgYGBgYSDgoOCgoKCgYGBgIF/gIGAf36Ok4yHiIaIh4aGhYaGhIKDgoGCgoODg4ODg4OCgYGBgH+AgYCBgYB/gH9/gICAgH+AgYB/fn19fX5+f36Ag4SHiISGhoaFhoaHh4aGh4eHhoeHf32AgIGCgX59fX19fX19fX19fX18fH5+fnx7eXh3eHl5gIODf4ONhIOEhISXl4ODhIF9foGCgoGCgYKBg4aIjIWDgoKBhIKEg4KDhYWEhYOCg4OCg4OCgoKCg4OCgpKQi4iIh4mHhoaEhoWEhISCgYKCg4ODg4ODgoGBgYCAgICBgIGBgH9/fn+AgYCAf4CAgH9/fn1+fn+Bf4CCgYWFhYeGh4eGh4eIhoaHh4aHiId/fH18fX9+fX19fX19fX19fX19fXx7iJKCe3x6fIZ5eHl8gYF+iZeEg4OEhJSTgIGBf39/fn6Fi4B/gICEhpCJhYSCgoGFhYuDgYKFhYaGhIOFhYOEhIODhIOFhISIko6LiYiIiYeHh4WGhYSFhIKBgoKDg4ODg4OCgYGBgICAgIGAgICAf39/f4CAgICAgYGBf39/f4CAgIGBgYGBg4OGh4aGh4aGiIeGhoaFhISGhYB9fHx8fX18fH19fX19fX19fX18fH+RlZaDe3qElHx4eXp7fH+Cg4GBgIOCgH58fn57iJF8fI6Wf31/f4KGioWDg4SDgYONiX9+f4OEhYWDhYaFhIWFg4SFhYaEhI6Rj4uKioyJiImHhYaFg4OCgYGCgoKDhIODgoGBgICBgICAgYGAgIB/f3+AgIB/gICAgX5+f4GBgoKCgoODgoOCgoWGhISFhYSGhIOEg4KBgYOBf319fHx9fXx8fH18fH18fX19fHx8e4uRl4x6e3yBenp6e3x5eX19foB/gH98e3t+fn2ClZF/hIh+fH5/goR8fIGChIKAf4eDfYKBf4KCgIODhISEhISChIOEhYKEkZGOi4yMjoqJiYWFhYODgoKBgoODgoKDg4KCgYGAgIGAgICAgICAgH+Af3+Af357gICBenyAgYKDhYODhYWFhYODg4SCgYODgoOCgoGBgIB/gX5/fX59fHx8fHx8fHx8fHx8fHx9fHx8fn6Kgnt6e3p4ent7fH17fn1+f319fX18fH+BgX2Gj4F+fYJ+f36Agnx8f3+BgIKAfnx7ioJ9gH9+gYCAgYKBgoCAgIGAf4uTj4uLjY2NiIeHhYWEhIOCgoKCg4OCgoODgYGBgICAgICAgH9+fXx7fHx9f3+AgHx6gYF4e4CCgYOFhIOFhIaGhISAhpSIgIKBgYGBgH9/f39/fn5+gHx8fHx8fHx8fHx8fHx9fHx8fHx8fHl7e3t4eHl7enp8gX+Afn+BfH5+f399gIKCgICAgX+CkYF/f4CAfoB+fn9+gIGBfX19e319fXx9fHx9gH+AgH6Afn6Bk5GMjI2Nj4qFhoaFhISFg4ODgoODg4OCgoGBgYGAgICBgICAf4CAf39/fXt6fICAgHh+gXd7gIF/gYKCgoKEhoeGhn6IlYp+gIGAf4B/foB+f39/fn+Bfnx7e3x8fHx8fHx8fH59fHt9fHx8e3x8fHp6eXt8en2Fg4J/gYF+f35/gH6FgoF+gH9+foCFhoKAfn6Dhn9+fH6AgIGAf39+fX19fX57fH1/f3+AfX9+f4uQjYyMjo2Nh4SGhoWEhISDg4OCg4ODg4KBgYGBgYCAgYGAgYGBgYGAgH9/f397en9/e3mAd3p/f31+f3+Af4KDhoaFf3+FgX5/gIB+gH5+f31/gIB/gIB/f319fHx9fn18fX19fX19fH58fXx7fXx8ent6fH19f4aEgoCAgX1+fX5/fouEgYZ+fXx8f36CgX99fX19gHx7fXx+gYSDgYB+fn5+fX1/f399foB+fn6EkYyLi46Ni4qGhIWEhIODg4OCg4KDgoOCgYGBgYGBgYGBgYB/fXx8fH1+f39/f397e399d352eH59fH18fX5+gYGCg4B6fX18fn+AgH6Af35/fn+AgH+AgH9/fn9+fn5+fn1+f399fH59fn19fHt8fHx6e3p9fn+Ag4OCf35/fH18fXx8gYN+jH58e3t9fn1+fn17e3t9e3p7e3uAhoWChIOCf4B+f4KCgn9/goJ/gIuPjIqKjIuKiISEhIOEg4ODgoKCgoKCgoKBgYGAgoGBgYKCf3+AgIB/fn18fH5/fn55fX52e3Z4fXx8fHt9fX6BgICAf31/f31+f39/foB/f39+f3+AgIGBgH99gH9/fn9+fn9/f3yCfn59fX17e319fHp8fH6AgoGAgIB8fH18fHx8fH18fXt/fnt7e3x8fH18e3t7e318enp9en6CfoGDhIKBgoGFhoWFhoaHhoKEkY6MioiKh4iFgoOEhISEg4KCgYGCgoKBgoGBgYGBgoGBgoKAgYKBgYCAgH9+e3x+fnx6fnh5dnd8fHx7e318f4GAf35/foB/f35/fn5/gH9/f39/f3+AgYKAfn6BgIB/f39/f39+fYN8fH19fH99fX19e3x+fn9+fn5+fnx8fHx8fHx+fnt8e3x8fHx9fH18fnx9fHx7e3x5e3x7e317fX5+f4CAg4eJiYmLiYuJhYiRjYuIiIaFhYOCgoOEhIODgoKBgYGBgYKBgYGBgYKCgoGCgoCAgX98e3p6eXt9enx+fnl8eXh4dHx8fHt8fHx+gX9/f39/gIB/fn5+fX+AgH9/f3+Af4CDgoB/gIGAgIB/f4CAgH58enx9fX59fX5+jIZ9fX57e4OCfX19fX18fX19fX1+fH18fXx9fX58fn19fX18e3t7fHt8fHt6e3t6enp7fn6ChYiHiIqLi4uJjJCNjImIhoWEgoKCgoODg4OBgYGBgYGBgYGBgYGCgoOCgYKBgIGBf3+Af356eHl5en5+e3l6eH5zfHx8e3x8fH5+fn5/gH+AgIB/fn9+gIF/f4B/gIGAgoSEgYCAgYGAgX+AgYKBf39+f31+gH57foGRjHx9f4qAjYx+fn19fX59fX59fHx8fX18fXx9fX1+fX1+fnx7e3t8fH18e3p7fHl6eXh5e35/hIOEh4mKiImNj4yKiIiFhISCgYKCgoKCgoGCgoKBgYGCgYKCgoGCgoKBgoKAgYGAfoCAf39+e3p5e319eHx6f3KBfXt7fHx8fn59fYGCf4GBgX9/gH+AgX9/gIGCgYGFg4SCgYGCgYKCgICBg4KAf4F/fX6Afnx+f4iCf36DkISEg4F/fn18jYd9fX59fHx/fnx9fXx9fX1+fX5/fX19e3x9fnx8e3x9enp5eXl5e3t+foCBg4eEiI2MiYmGhYSEg4KBgoKCgoGBgYGCgoKBgoKCgoKCgoKCgoGCgn+AgIB+f39/fn5/ent5fX16enp9cX6Cent8fX19fXp4f4KAgYKCgICBgIGBgICBgoKCgoaFhIKBgYGBg4F/gIKEgX9+gYB9foF+fX5/gIB9fn+EgH5+f31+fX2KhX1+f31+foB/fX19fH1+fn99f4B9fn18fX9/fHx7fH17e3t6enp7e3x9fn2Ag4CJjImLh4WFhYSDg4KCgoKCgYGBgoKBgoKCgoKCgoGBgoKBgYGCf4CAgH9/f39+fn59eXp6fXx5d3t0e4d8dHd9fn17e3Z2fYCBg4KBgYKCgoKBgYGDg4OChYaEgoCAgICCgX+AgYOBfn6AgH1+gH59fn6AgH+Bfn+Af39/f398f39/f3+Afn9/gH58fX18fn5+foF/gH2CgHx9gIF9fHx9fXx8e3x8e3t7fHt8fHx9fImJh4iFhoWFhISDgYKBg4KAgIGCg4KCgoOCgoKCgoGCgoGBgoJ/gIGAf39/fn5+fn57enp8fHt2e3R3f352cnt+fnt4dnd8gIGCgoKBgoODg4OCgoSDhIOFhoOCgX9/gIOAgICAg4F+foCAfX+AfX1+foCAf4J/gYGAgICBf31/f3+AgIGAgIB/fnx9fX19fn59g32AfoKAfX6AgX98fn59fX17fH58fXx8fHp8e3x+iYWGhIWHhYSFhIKBgoGDgYCAgoKDgoKCg4ODg4KBgYGBgYGCgH6AgYB/fn5+fn5+fn56e3p9goN9dXF6fHpxen19eXh0dICAgoKCg4KDhYOEg4KDhISEhIWEgYGAgH6Agn9+f36Bf35/f4B9foB9fX1+gH9/gYCCgYCAgIKBfn6Af4GAf4CAgH9+fX19fnx+fn19gYR/gH9+f4GBf31/f319fn1+fn1+fHt8enx7eoCGgoSEhYSEg4WDgoKBgYKBgICCgoOCgoOEg4SDg4KBgYKBgYOAfoCBf35+fn5+fX5+fnt7en6Jh354cnl9f3F6eHt4eXR1fYKDgoODg4OFhIWEg4OEhIODhIKBgH+Af4CBfn19foB+fn5/gH19f3x9fX6Af4CAgIKAgIGAgoGAf4B+gIF+gIGAgH9+fn5+fn5/fn6FhYGBgH+Ag4F/foGAf35/f4B/fn17ent6fHt6goSAgoKCgoOChIKBgYCAgoGAgIKBg4KBg4SDhIKEgoGBgoGCgn9+gIF/fn1+fn5+fX59fXp7fIWEe3tzeXp8cHd1dnd5dnR6hISBhISDhIWFhoSDg4WEgoODgoCBfn9/f4B9fX1+gH1+f39/fn1+fH19foF/gIB/gIB/gIGDgoGAf36AgH+AgYCBgH9/f39/f4CAgIGCgoKBf4GEgX+Ag4J/f4B/gX+Af3x7e3p8e3yBgH+Bf3+BgIKCgYF/f3+BgH6BgoKDgYGDg4KEgoSCgYGBgIGCgH6AgH9/fX5+fX19fn19e3t6gH94fHZ5eXtxdHh3dnh1cnmFhYKEhIKEhYWGhISChIOBg4KAgIF+f4B+f3x9fX6AfX5/f39+fX98fn5+gX+Bf39+f4B/gIODg4B/f4GBgIKBgYGAgICAgICAgIGAgYKDgYF/gISBfYGDhICAgX+BgYKBfXp7e3x8fX99f4B8f399fYGAgH59fYB/foGBgYKBgIKCgoKBg4KCgYB/gYKAfn9/fn99fX1+fX19fX19ent7fHZ9eXh5enJ1eXl2d3dzdYaFg4WFgoSEhYSEhIKDgoGDgX+AgX5/gH6AfX19fn9+f4B+fn99f3x/f3+BgIF/f3x+gH6AgYKDgYCAgoOEgoGAgYB/goCAgYGAgYGCg4KBgX9/g4B+goKEgICCgYKChIJ+e3t8fHx9fX1+fXp+fX14fn9/fHx8fn1+gYCBgYCAgoGBgYGDgoGBf4CAgoB9fn19f319fX59fH19fX16e3p8dnx6d3t4cnZ5e3Z2dnN0hoSEhYSChISFg4OCgYOBgYOBgIGBfX+BfoF9fX1/f39/gH5+f359fYB/gIGBgX9+fH5/fn5/gYJ/gYGCg4eFgX9/fn6Af4CBgICAgIKCgYCAfoCCf36BgoKBgYOCg4OFgn99fX18e3x8eXp7en55e3l4f357e3t+fX1/f4F/gH6BgICAgoOCgYF/gIGBf31+fH1+fX19fX18fn58fXx5e3x4enx3endzeHd6c3Z2c3SGhISFg4KDhISDgoKCg4GCgoGAgYF8gIB+gH1+fX5/gICAf35/f3x+gH+BgIGAf359f39+fn+BgH2AgIGDhIN/f359fn5+f4B/gIB/gYKBgH9+f4F+f4CCgoCBhIKEhIaEgH59fHx8fHp5dnl5enl2eXZ+fHt7e358e399gH99fX9/f3+BgoGBgX5/gYF+fX18fX19fX19fXx+jYF8fXl7e3p5fHd4eHR1dXhyd3d0doaEhIWDg4ODg4OCgYKDgoGDgn+Bf35/fn+AfX19fX+AgIB/f4B/fIB/f4GAgYCAf3yAf31+fn9/fX5+gYGCgn5/fn1+fn5+f3+Af32AgIB+fn5/gX5+gIKBf4GDgoOEh4SAgH58fXx8e3x1eXl4eHh5d3t8e3p7foV9fn1/ent+fn59foGAgIGAfX6BgH59fXx9fX19fX18e32Dgnx8ent7e3p7d3Z4dXJzdnF3eXJ4hYWFhYOEg4KCg4KBgYKBgIKBgIF/fn5+foB+fX58foCAgH+AgX97gH6AgH+BgYB/fYB/fn5/f319fX6AgYKAfn9+fn59fX5/fn9+fH+Af35+fn+Cfn6AgIF/gYOCg4OGhICBfnx9fHx7fHh3e3h1eXd3eXx6e3t9kod9fH13en1+fn19f35+gH98foB/fn19fH19fX19fXt8ent9enp4e3x6ent4dHh1cXJ0cHh4cXmEhYaFg4SDgoODgoGBgoKAgYGAgIB9fn5/gH18fn1/gIGAf3+BgHyAf4B+f4GAf399gH9+f39+fX18gICAgYB+f35+fn18fn9+f358fYB/fn1+gIJ/foCAf36BhIKCg4WFgoJ+fnx7e3x8eXd7eXd4d3d4e3t6e3yFin17end6fH19fHx9fX1/fnx9fn59fXx8fX5+fX18fHt6enx7e3p5enp7enhzd3VxcXJweHdxe4WGhYWDhYKBg4OBgYGBgoCBgICBgH5/fn9/fXx+fYCAgoGAf4GBfX6Af35/gX+Af3+BgH+Af31+fH1/gICAgH9/f35/fXx+f39/f319f39+fn6CgYF/gIB/foGDgoKEg4SCgn5+fHx6fHt7eXt6d3N2d3h5e3p7eXp/fnt7d3p8fXx8fH59fH19fH19fXx8fX19fX99fXx9e3l7fHx8enp6enp6eHN2dXBwcm93dnJ7hYaEhYOEgoGDgoKCgYGCgYKBgYGAf4B/f399fX9+f4CBgYJ/goF9foF+foCBf4B/gIKAgIB+fH58f3+BgICAf4B/f4B+fX5+f4B/f39/gH9/f4J/gH9/gIB/gYGAgISBgoKAf39+f3x9fn56fYV+dHx9enp6enx5eXp6hoV3eXx8fHx8fXx8fHx8fX19fHx9fX19fn19fX16eX18fH16enp6enp5c3V1b29xb3d0c3yFhoOEgoOCgYKBgoKCgYKBgoGBgYCAgICAgH59gH+Af4GCgn+CgX+AgX5/gYB/gICAgn+Bf319f35/f4KAgICAgIB/gIB+fn1/gH9/gIB/f39/gH+AgICAgH+AgYCBgYGCgYCAf39/fn1/fnuBk416fH18e315e3p6eHmBgXh5e3x8fXx8fHx8fHx9fX18fH18fn1+fn59fHp8fHt8fXt5enp6eXlzdXVvb3Fwd3N0fYWGg4OCg4KAgYCCgoKAgYGCgYKBgYCAgIGAfn6Af4GAgYKCgIKCgICCfoCBgX9/gX+BgIF/fH6Af3+AgoCAgICAf3+AgH9+fX6Afn2AgIB/f3+AgICAgYCAf4CAgYCBgYKCgICAf39/fX5+fIGGiXx8fnt7fnl6e3p7jX53d3l7fHt9fHx8fHt9fH19fX18fXx+fn5/f358enx9e319e3l6e3p5eXN0dW5zcXB4cnV6hYaDg4KDgoCAgIGCgX+CgYKBgoGBgYKAgYF/fn9/gYGCgYKBhIOAgYJ/gYGBf4CAgIB/gX99f4F/gICBgICAf4B+gICAf359foB+fn+Af39/gH9/gICBf4CBgH+BgIGCgoKAgICAgIB9foB9gIOCe35+e3x9e3p8fHuHeXh4eXx8fH17fHx9fX18fH19fn19fX5+f3+Af317fH18fHx7enl7e3l5c3J1bnZycHhxdXaFhYOEg4KCgICAgoF/gIKCgoKDgYGDgoCCgYB/gICCgoKBg4GEhICBgX6BgoF/gICAgH+Cf36AgYCCgICAgIB/gH+AgIB/fn2Af39/f4CAgH+AgH+AgYF/gICAgIGAgYGBgoGAgYCAgH9/gH5/fX59fn57fXx9e3x8d3h1eHh5e3x8fXx8fHx8fX5/f39/fn19fn9/gIGAf3x9fHx9e3p7eXp8eHpzcnVud3FxenF2d4WFg4ODg4KBgYKDgH+CgYWDg4SBgYOAgoOBgYCAgIKDgoCCgoSDf4GAfoKDgICBgICAf4CAf4GBgIKAf4CCgH9+gICAgICAf4CAgH+AgICAgIB/f4CBgYCAgICAgYGAgoOCgoCCgYGCgYB/f4B/gId+fnx6fXx7fX54d3Z5eXl8fXx8fXt8fH19fn5/gIGAfn1+gICAgoGAfH59fX58d3t6ent5eXNxdW53cHV6cXZ5hYWCg4KDg4KDhISAgIKBhoOEg4GChICEg4KCgICCgoSBgYKChIJ/gIB/gYOCgYCBgYCAf4GBgYGAg4F+gIOCf31/goGAgIB+gYCBf4CAgYGBgYCAgIKBgYKBgYCBgYGBgoOCgoOBg4OCgYCBgH+AhH19fXx/fXp9gHp5dnp4eXt7fH19e3x9fX19fn+AgYGAgH+AgICDg4B9f35+fn15eXt6enp5c3J1b3dxd3lzd3uFgoKDgoOEgoOEg4CAgoKGg4ODgoKEgYSDgYKAgIKBhIGCgoGCgX6BgICCgYKBgYKCgICAgICBgoGEgH6Bg4F/f4CDgoCBfoCCg4KAgYGBg4KDgoGBg4KChIGAgYOBgYKEg4KEhIODhIODgYGBgYCCf4B/fYB8enx/e3t3fHl5eXt6fX59fHx8fH1+fn+BgYCAgIGBgYSEgH2Af39/f357e3t6e3p0cHhyeXR2eHR3e4SCg4KDg4SChIODgYKChIaEgoODg4SBhISAg4CBg4KCgoKCgIKAfoGAgIKBgoGCgoKBgIGBgYOCgoOAfoGDgX9/gYSEgYN/goKBg4KCgoGEg4OEgYKEgoOCgoGCgoOBg4SDhISEhISFg4SCgYOCgoOBgYGAgH58fIB8fHh8eXp5enx9f3x7fHx9fX18fICAgICAgYGBgYKBfoGAgICAf3t7e3p6enVweHd5dnV8dXZ8gICDgoODg4OEhISAgoOGhISDg4KDhIGEhYKCgYKDg4GCgoKAgYB9gICBgYKDgoKCgoGAgYKCg4KCg4B/gYOBgICChIODgoGCgoGDgoKDg4ODg4SAgoSDg4OBgX+Bg4KDhYKEhISEhISDhISChIOEhIKBgoGBgHt+gX59eXx6enp9fXyBfXp8fH19fHp7fn5+gIB/gYGAgICAgIGBgIB/fX18fH18dnJ2eHh2dH92dX2Hh4OChIWDg4SFhICChIWEhIOCg4SEgISFg4KCgoODgYOCgoCCgH2AgIGCg4KCgoKEgoGCgoOEgoKBgICBgoGAgYOFhIOCg4CCgoOCg4ODg4OEg4CCg4KEg4KCfoOBgoSEgoODhISEhIOEhIOEg4WEg4ODgoKAe4CBf3x8fXp6e32AfX9/fHx6fH59fH19fn5/f39/gICAgH9+foCBgICAfnx9fX5/fn18e3h2f3Z3f4OHg4KDhYODhIaEgYKFhoWEhIODhISChIWFgoKDg4SCg4KDgoKBfoCAgoKDgoODg4SCgYKCg4OCg4GBgYGDgn+ChISDg4KEf4KEg4ODgoSDg4SCgIOEg4SDg4KCg4KChIOCg4SEhISEhIWEg4OEhYSFhIOBgoB9gYKAfXx8e3x8gH19foB+fn1/fnx8fH19fn5/fn+BgYGBgH99fX6BgYB+fn19fX59fX5+f3+AfH2AgYKCg4OGg4SDhoSBgoiHhYSDg4SEhYGFhYWDg4SDhIODgoOCg4F+gYGDg4SCg4OEhIOCg4KEg4ODgoKDgYOCf4KEg4ODgoOAgoWDg4ODhIODhIOBgoSEhYOCgoODg4GEg4GDg4SDhISEhYSEhIWFhYWEg4ODf32BhIB9fXx8fHx/gX5/f39/fX99e3x9fX19fX5+f4CBgIGBgH59fH6Cf39+fn5+fX1/f39/gICAf4CEhIODhIWDhIOFf36CiouFhISDgoOFgYaGhoOEhISEhIODg4OEgn+BgYODhYSFhIWEg4KEhISFhIODgoSDhYKBhISFhYaEgoCDh4SDg4OFhIWFhIGEg4OHgoOCg4GCgYSDgoODhYODhYWEhYWHh4aHhYSEhYSAf4GDf35+fH59fX+BgH9+fHx+f358enx9fX19fX5+fn9/gIGBf319fIB/gH5+fn5+f3+AgYGBgYKAgYWFhIOFhIKEg4aAgoWFi4mEhIOEhYWDh4aGhISEhIWEhISEg4SDgYKDg4OEhIaEhYSDg4SEg3yDhHuBhHd5g4F9hH5+cnWDgoF2foOEgX2BdYF5g39/gH6EhIKDg4KBg4SDg4SFg4SFhoSFhn2EeXx+f4N7hYKBhIOAf35+fn19gYOBfXt/fX6Afn18fHx9fX19fH19f4B/gYJ/fX18f4GBgICAgH+BgYGCgYKDg4KChoSEhIaEgYOEhYOEhYOKiIWFhYOFhYSGhoaDhISFhYWEhYWEhIWCgoOEhYWFhoSFhIOEhYWCaICFanx7cXF8gXOGc3R0fYKEdXNxg4Z0cHVyc3SDdnt9dYF/goOBgnZ5hYCDgIR/hYSChYWCaHpyc3N8f3OCg3+Dg32BfX5+fX6Cg4F8f4B9f4B9fXx8fHx9fHx8fn1+gH+BgX99fX2AgYKBgYGBgIGBgYKBgoKCgoSHhIWEhYSBgoSGhoOGg4aIhoaFg4aGh4eGh4OFhYaFg4KFhoSFhYODg4SEhoaGhIaEg4SFhn1xe4FweXZ+g3+CbnlwdXN8dnp5hXKEg3B2eHF2dHR1cnN0dml/gG5yb3R2bnVsd217c26AiHltfXJzdnN2bW14bHB5bHV9f399foGAgX1/fn2Af4B/fX18fHx9fH1+f32Af4CAfnx/foCBgoCBgICAgYCAgIKDgoOEhYiGhoCChYODhIeGg4aFhYaHh4SDhoeIiYaHhIWGiIeEg4WGhYWEhIOFhIKFhoaFhoWEhoWHdnB0e3BydX+HhYNtdW92b3x1coR5eYd4cXR3bndod3pucHaCcoN+b3p5eW1vbnpvb213fXiGcHF6cHJ0ZoF1fm57eXNveX+Af319gX9/fH99fIF+gIB+foCAgYB+fn9/foF/gH9+fYB9f4CBgIB+fn+BgH9+goOCgoSFh4eEfoeEg4OFh4aEhoWFhoaIhISGh4iIhoeEhoaLioWEhoeHhYOFhYWEgoWFhIWGhoWGhYZxdXByc29zenl+hHSIdHV+iHZugnKEhnluanJ/cW1zd3x/dXR8hH54cXV3bnl1enF2eHV6eYRxam95eHBreXN6b3p3dnZwgYB/fn5/f356fn19f31/f359gIGDg4CCg4GBhIKBgIGBgH1/f4F+f35+f4GAfn6BgoCAgYSHhoODhoSEhYaHhoWFhYWGhoiFhYaFh4eFhoSGhomIhYSJioiFhIaGhYWDhYWEhYaGhoaFg3iLeXKIentwcIWEeIV4eWtzfnl7a3KDh4N6fG17eXl0fYB2bm+AgG90fHV3cXl9fW1+dW+DhYZ6gHJye3x1cG96bHN8bneCgIF+fn99fXt9e3x9fX9/fn1/f4KCf4GDgYGDgYB/gICAfn9+f31/fn1/gH58fYGAfn6Ag4iFhoOFhYWFhoeFhYWFhYeHiIaEhoWHhoaFhIWFhIWFhomJh4aEhoWGhoWGhoSGhoeGhoWGh4eHhoaEhoWGh4iHhYeGhoOHhoWFg4SFhoWGhIaEg4SEhoSEgYODhISFhIWEhYSGg4aHhYaEhIWHhoSEhYaEhX13hYOEhIKBgX1/fnt8e357fHx9f359fH59gIB9f4F/f4GAfn5+gH5+f35+fX99fX5/fHt8f358fH+BiYaFhIaGhoWHhoWFhYWGhoeIhoSGhYaGhYWDhIWGhYSGhoaGhYWGhIWGhoaGhYaGh4eGhYeIiIiIhoSHhYaGiIaFiIeIhYeGhoiFhYaHhYaGhYOChYWGhYWDhYSEhIWEhYWEhYWDhoeGhoWEhoeGhISFhoOFhIKEg4OFg4OCfYB/e3t8fXt8fH1/fnx8fn2Af31+gH5+gH99fXyAfX5+fn5+f3x8fX57fHx/fHt7fn+Ih4SEiIaGhoeGhYWEhoaGhoiHhIWGh4aFhIODhIaFhIeFhYaFhIaEhYaGh4eFh4aJiIaGh4eIiYiFhYiFhoeGh4aHhoeFh4eGh4WFhoeFh4aFgoOFhoaEhIOEhIOEhoSFhYWGhoOGhoWGhYWGhoWEg4WFgoWHhYOCgoWDhIF+gIB8e31+e3x7fX59fHx+fX5+fH9+fX1+fXx9fH98fn58fYGAfXx8fXx8fH56e3t9foiHgoWIh4eGhoaGhISGhoeGiIaEhYSGhoSFh4OEhYSFh4SFhoaFhoSGhoeHhoaHh4mIhoaIh4iKiIWHiIWHh4WHhoeGh4WIiIeHhYaGh4WGhoWBhISFhoWFhISEg4SFhYaGhoWGhYaFhoeFhYaGhYSDhIOChIeDhIGChISDgYCAgHt7fn18fHx9fXx8fH19fH18fn18fX18fHx9fXx+fXt8gX99fH18fnx8fHp6fHx9iIeChoiHhoeGhoaDhYaFhoaGhYOFhIaFhIiJg4GEg4SGhIaGhoaGhIeHiIiHh4eIioiGh4iHiImIhYiHhYeGhoeHh4WHhoiIh4eFh4eHhYaHhIKEg4SGhYeFhISEhISFhoaGhoaFh4WFh4WGhYeFhIOEg4ODh4GDgIKDg4KCgn+Ae31+fXt8fH59fH19fH17fHx8fHx8fXt7e318e358e3x/fX18fX1/fXx6ent7fHyIh4KGhoaGh4aGhYOFhoWFhYWEg4WChoSDiId/enqChYaEhoaFh4aEh4eJiIiHhoiKh4aHh4eIiYeFiIeGiIeGhoeHhYeGiIiHhoWHhoiGhoeDg4SEg4aGh4WFhISEhYaGhoaGhYaHhoaHhoaEhoWDg4OCgoOGgYN+goKDgIOCf398f35+fHx9f318fX18fXp7e3p7fHx8e3t7fnt7fXt7e358fHx8fX5/fXt6fHp8fYmHg4aFhoWGhoWEhIWFhYWFhIOBhYGGhIKEhHyAhn+ChYWGhYWGhYSHh4iIiIaFiYqHhYeGh4eIh4WIhYaHiIaGh4eGh4aIiIeFhoeGh4WFh4OEhoWEhoaHhoWFg4WFhoaGhoaFhoaHhoeHhYOGhYOBg4KAg4WCg36BgYF/g4F/fn5/fX98fH1/fXt9fXx+enl6eXt8fXt7e3t+fHx8fHp7fXx8fHx+fYF8e3t7e3x7iYeEhoSGhIaGhYSFhoWEhIOEgoCDgYWDgYJ/eoSMe4CEhYeGhoaFhIeIh4aHhYWHiYeEh4WGhoiGhYeEhoeJhoaIh4eHhoeIhoSGhoaHhYWHg4SFhIaGhoeFhYSDhYWHhYeGhoWGhoaFhoaEg4WFgoGCgYCDg4OCfYGBgH6DgX5/f4B8f3x9fX59e359fH15eXp5e319enp7e318fXx8ent9fHx9fH5+gHx7e3x+fXyIh4WGhYaEhoSFhYWFhYODgYOBgIKBhYJ/gH9/fXx7gYSFhoaEhYSDh4eGhoaFhIaJhoKGhIaGhoWFh4WHiImGhYiHiYeGhoeFhIaFhYeFhIeDhIWEiIaGh4WFhIKGhYaFh4aHhIaGhoaFhoODg4WAgIGAgIOBg4B8gYB+foKAfYB/gXx/fH1+fX57fn18fHl6enl6fX15enp7fHt8e3t6e319fH18fn5+fHt7fX59fIiGhYaGhoSFhYSFhYSDgoKAgoGAgICDgX5+foB5en2Ag4OEh4WEg4OHhoOEhYSChYiFgoSDg4WFhYWHh4aIiIaFiIeJh4aFhoWDhoSFh4OEhoSEhYSHhoWGhYaEg4aFhoaFhoaEhYaGhYWGgoKDhH9+gICAgYCDgHuBf31+gn5+gH6Afn99fX59f3t/fXt6eXp6eXp8fXl6ent7enx6e3t7fH19fXx/fn18fH1/fnx7h4WFhoaGhoSFhIWDhYKBgICAgYB+f4KCfX1/f3t/f4KDg4WGhYSDgoaDgYOEgoCFh4WCg4GBg4SEhIaGh4iHhYWIhomHhYOEhIKFg4SGgoOFhISGhIeGhYWFhoOEhYSFhoWGhIOFhIWDhYWBgYODfn5/gH9/gIN/fIB9fX+CfYCBfn6Bfn19fX1/e398e3p5enp5enp8eXp6e3t7fHp7e3t7fX59fYB9fXx8fYB/fXyGg4aGhoaFg4SChYKFgYGAf3+AgH5/gIJ8fn9/foCAgYKChIWDgoGChIGAg4KBgISFhYKBf4CCg4OEhYaIhoWEhoeFh4WFgoOCgoOCgoWBg4WEhYaEhoaHhoaFgoSEg4SGhYWDhISDhIOFhICAgoJ+fX1/fn5/hH57f3x8gIF9gYB9fYN9fn59fX57fnt7enl7enl6ent5enp6e3t8ent8e3t+fn1/gXx9fHx9f4B+gIaEhYWEh4SDg4KGgoOAgYB+fn+AfX9/gnx9f39+fn+BgYKEg4KBgYKCf4CBgoCAgoWEgoB/gIGCgYOFhYeFhISGhoSFg4WBgoGBgoGCg4GChISEhYWGh4eGhYSDg4ODhIaFhIGDgoOChIODgH+AgX59fH5+fH6Dfnx+fHyBgH6Cf31/gnx/fn19fHx8e3t6enp6eXt6enp5eXp6e3x5e317fH5/f4GAfX59fX1/gICAhoSEhYSFgoOCgoSCgoCBgH59fn9+fn6AfX2Af35+foGBgoODgoSHgYF+gICBf3+ChIOBf35/gIJ/goWEhYSCg4WFgoSBg4CBgIGBgYKBgIGEg4OGhYWHh4WEhIWCgoKDhYSCgYGBgoCFg4F/foB/fnx8fn18foN9e358fYF/gIN9fYCBf35/fXx8fH17e3p6enl5e3l6enl6ent7e3p7fXx8f3+BgoB+gH+AgH+AgYDKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzNzc3Nzc3Nzc3NzczMzMvLy8vLy8vLy8vLy8vLzMvLy8vLy8vLy8vLy8vMzMzMzM3Nzc7Oz8/Pz9DQ0NHR0dLS0tLS0tLT09PT0tLS0tLS0tPT09TU1NTU09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tLS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1dXV1NTU1NTT09PT09PT09PT09TU09PU1NTU1NTU1NTU09PT09PS0tLS0tPT09TU1NTU1NPT09LS0tLS0tLR0dHR0dPHhnNlYFtLWWdVTUZIQD03Nzg5Nzw8PDo8Oz42Oj04PDs6OTg3ODs7Oj87PTs8PD47P0E/QkJBQ0RFREE+PTw7QENDQUBDQ0FBR0hHSUtSwtXS09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXVysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMy8vLy8vLy8vLy8vLzMzMy8vLy8vLy8vLy8vLzMzMzc3Nzc3Oz8/P0NDQ0NHR0tLS0tLS09PT09PT09PT09PS09PT09TU1NTU1NTU09PT09PT09PT09PT09PT1NTU1NTU1NTT09PT09LS0tLS0tLT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1NTU1NPT09PT09PT09PU1NPT09TU1NTU1NTU1NPT09PS0tLS0tPT09PU1NTU1NTU09PT09PS0tLS0tLR0dHSzIxyZ2BcTVllUktHSz87Mzc4Ozg5Pj05PDpBOjs9Nzs8PDo6Nzg6Oz0/Oz88PTw/Pj9BPUFBPkNDREJAQT46Oz9DREFDRERCQklHSEhJTr7V0tPT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1crKy8vKysrKysrKy8vLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzMzMzMzMy8vLy8vMzMzMzMzMzMzLy8zMzMzLy8vLzMzMzc3Nzc3Ozs/P0NDQ0NDR0dLS0tLS09PT09PT09PU09PT09PT09TU1NXV1dTU1NTT09PU1NPT09PT09PT1NTU1NTU1NTU1NPT09PS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1tbV1dXV1dTU1NTT09PT09PT09PU1NTU09TU1NTU1NTU1NTT09PT0tLS0tLT09PU1NTU1NTU1NTU09PT09PT0tLS0tHR0s+Sd2hfXk9XZ01LRkw9ODc2NTk5OTw+OT88RDo7PDc5PD07OTc5Ojw9QDs+PT47PD48PT5BQD5EQ0NDP0E9Ojs9QkNFQ0NEQT9FSEpJSky61dPT09TU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8rKysvLy8vLy8vLy8zLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMzMzMzMzMzMzMzMzMzczMzMzMzMzMzMzMzMzMzc3Nzc3Ozs/Pz9DQ0NDQ0dHS0tPT09PT09PT09TU1NTT1NTU1NTU1NTV1dXU1NTU1NPU1NTU09PT09TU1NTU1dTU1NTV1dTU09PT09LS0tLS0tLS09PT09TU1dXV1dbW1dXV1dXV1tbW1tXV1dXV1NTU1NTT09PT09PT1NTU1NTU1NTU1NTU1NTU09PT09LS0tLT09PU1NTU1dXV1dTU1NTT09PT09PT0tLS0dHRmn5nYWJOVWpKSElLPzw6OTM3Njc3PTs+OT06Ojo4ODo7Ozg4Ojs7PD46PT09Ojw/PD0/QkA/Q0RDRD5APT08QENEQ0JEQkQ+REhJSUtMttfT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3MzMzMzMzMzMzMzMzNzc3NzczMzMzMzMzMzMzMzc3Nzc3Ozs7Pz8/Q0NDQ0NHS0tLT09PT09PT1NTU1NTU1NTU1NTU1NTV1dXV1NTU1NPT1NTU1NTU1NTU1NTU1dXV1NXV1dXV1NTU09PT09PS0tLT09PT09PU1NXV1dbW1tXV1dbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1NTU1NTU1NXU1NTU1NTT09PT09PT09PU1NTU1dXV1dXV1dTU1NTU09PT09PS0tLR0p+DaV9kU1hsSEhIS0A9Nzg0NzY6Oj87RDw8OTw8OTg6OTo6Ojs8Ojo7OT49Pjk9QDs/QUFCP0JCQUM9Pz8+PEBCRUNDQkBBO0ZJR01MSbLY09TU1NTU1NXV1dXV1dXV1dXW1tbW1tbV1dXW1svLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzM3Nzc3Nzc3Nzc3Ozc3NzczMzMzMzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc3Mzc3Nzs7Ozs7Pz8/P0NDQ0NHS0tLS09PT09PT09TU1NTU1NTU1NTU1NTV1NXV1dTU1NTU1NTU1NTU1NTV1dTU1dXV1dXV1dXV1dTU1NTU1NPT09PT09PT09PU1NXV1dbW1tbW1tbW1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTV1NTU1NXV1dXU1NTU1NTT09PT09PT1NTU1dXV1dXV1dXU1NTU1NTT09PT09LS0tSjiGxfZlJWakdIR0lBPjM2Njo7PDhDPEJBPjxBPDg5Ojw6Ojw8PDk8PTo7PD09PD89QD9AQT9AQUBCPD4+PzxCQ0NDRkBBQT1ISklOTUeu2NPU1NTV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbMzMvLy8rKysvLy8vLy8vLy8vMzMzNzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzs7Ozs7Oz8/P0NDQ0NHR0dLS0tPT09PT09TU1NTU1NTU1NTU1NTU1NTV1dXV1dTU1NTU1NTU1NTU1dXV1dTV1dXV1dXV1dXU1NTU1NTT0tPU1NTU1NTU1NTV1dbW1tbW1tbW1tbW1tbX19bW1tXV1dXV1dXV1dXV1dTU1NTU1dXV1dXV1dXU1NTU1NTU09PT09PT1NTU1NXV1dXV1dXV1dXV1NTU1NPT09PT0tLWroprY2VSWGhMSkdJQjg0OTQ6Ozo5QDk/Q0VAPDw5OTk9Oj07PDw6PTw7OTw9Ozs/PUA9PT5AQD9CQT5APD05QERDQkFBQj48SEpLTU5IqNnU1NXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbWzMzQ0dDQ0NDQ0dHR0dHR0c3Ky8vLzMzMzMzMzMzMzM3Nzc3Nzc7Ozs3Nzc3Nzc/Pz8/Pz8/Pz8/Pz9DQ0dHR0dHR0dHR0dHS0tHV2djY2NnZ2dra2tvb29vZ2dnZ2dna2tra2tra2tjW19fX19fX19jX19fX2Nzd3d3d3d3d3d3d3d3d2tbX19fX19fX1tbW1tbW09LT09PT09TU1NTU1NbW1dXV1dXV1dXV1dXW1tbX1tbW1tbV1dXV1dXV1dXV1dTU1dXV1dXV1dXU1NTU1NTU1NTU09PU1NTU1NXV1dXW1dXV1dXV1dTU1NTT09PT09PS1bqKa2hoUlhlSUlMT0A5OTo0O0E8Nz05QUM+QD89ODo6Ozk9Oz4/Ojs8PDo7PDo7Pj1APT8/P0FAQUE/QTw8Oz5BRENBREA9PElJSk1ORqPa09TV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbW1szNloSGhoaGhoeHh4eHh4Ky4t3d3t7e3t7e3t7e3t3S0NDQ0NDQ0NDQ0NDQ0ci5ubm5ubm5ubm5ubq6t6WkpKSkpKSkpKSkpKSnhmBjY2NjY2NjY2NkZGRlhIuKioqKioqKioqKioemuri4uLi4uLi4uLi4ubN4c3Nzc3Nzc3Nzc3NzcJTAvL29vb29vb29vb28v9LS0tLS0tLT09PS09PT3OPi4uLi4uLi4uLj4+Pi2NfX1tbW1tbW1tbV1dXV1dXV1dXV1dbW1dXV1dXV1dTU1NTU1NTU1NTV1dXV1dXW1dXV1dXV1dXV1NTU1NTT09PT09XDkXFrak5TYkxMVk48Ojo3Nz5DPjg+Oj8/QTw/QDc7Ojs7PTs+Pjo7PD48Oz07PT8+QDw/Pz1AQEBBPj88PjxAQUVCQkZAQD9HSEpLT0ae2tXV1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19fMzm5QU1NTU1NUVFRUVFNMoPPr6+rq6urq6urq6uvp1dLS0tLS0tLS0tLS0tTEqaqqqqqqqqqqqqqqq6aGhIWFhYWFhYWFhYWFik4MEhISEhISEhISEhIRE0pUU1NTU1NTU1NTU1NPg6ejo6Ojo6Ojo6Ojo6WZMikrKysrKysrKysrKyRksKmqqqqqqqqqqqqqqLDS0tLS0tLS0tLS0tLS0eDs6+vr6+vr6+vr6+vr6dnX19fX1tbW1tbW1tbW1dXV1dXV1dbW1tbV1dXV1dXV1dXV1dTU1NTV1dXV1dXW1tXV1dXV1dXV1dXU1NTU1NTU1NPUy5h2bGlKTl9NUlVNPjw8NztAQz42Ojc+Pjs9Qj85PDk9Ozw6PD07PTs9Ozs9PD0+PT07QT08QUBBQT08Pzw7QEJDQURFPUFAQ0ZLS09GmNzV1dXV1dbW1tbW1tbW1tbW1tfX19fX19fX19fXzM5xVFhXV1dYWFhYWFhXUKHx6enp6enp6enq6unq6dXS0tLS0tLS0tLS0tLUxaqrq6urq6urq6urq6yoiIeHh4eHh4eHh4eHh41SEhgYGBgYGBgYGBgYFxpOWVdXV1dXV1dXV1dXU4WopKSkpKSkpKSkpKSmmzgvMDAwMDAwMDAwMDAqaLKrq6urq6urq6urq6qx0dLS0tLS0tLS0tLS0tHf6+rq6urq6urq6urq6unZ19jX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dXV1dXV1dXU1NTU1NTU1NGcenFpSlRdT1JVTkQ+Pzs+QEA4Ojs4PDs7PD86Ozs4Ozk5Ozw7Ojw5Ozs8Ozo9PT0+PUE/Pj8/Pj08PT88PEFBQ0FERTw+QEVGSktNRpPc1dXV1tbW1tbW1tbW1tbW1tfX19fX19fX19fX183OeF5hYGBgYGFhYWFgYFqk7ufn5+fn5+fn5+fn5+bV0dLS0tLS0tLS0tLS08Wtrq6urq6urq6urq6vq46NjY2NjY2NjY2NjY2SXSInJycnJycoKCgoKCcpWmNiYWJhYmJiYmJiYl6MrKmpqampqampqampq6BFPT4+Pj4+Pj4+Pj4+OXG0r6+vr6+vr6+vr6+uttLS0tPS0tLS0tLS0tLS3+np6enp6enp6enp6enn2djY2NjY19fX19fX19fX19fX19bW1tfX19fW1tbW1tbV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbV1dXV1dXU1NTU1NTWo3txZElbYE5OVU9AQT89REI/Oz06OTs6PT07PDs6OTg5OTs8Ozw8Ojo7PDo7QD08PTxAQTxBQTs7PEA/PD1CP0RDQ0U8PkJERkpMTEWN3NXV1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjNzcfFxcXFxcXFxcXFxcXEy9DPz8/Pz8/Pz9DQ0NDQz87Ozs7Ozs7Ozs/Oz8/NzMzMzMzMzMzMzMzMzMvJycrKysrKysrKysrKysfCw8PExMTExcXFxsbGxsvMy8zLzMzNzMzMzMzLz9HR0tLS0tLS0tLS0tLRysrKysrKysrJycnJycnN09PS0tLS0tLS0tLT0tLV1NTV1dXV1dXW1dbW1tjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NfX19fX19fX1tfX19fX19bW1tbW1tbW1tXV1dXV1dXV1dbV1dbW1tbW1tbW1tXV1dXV1dTU1NTU169/cF5GXmJQUVdOR0ZDQ0lBPz07PDo8OEBCPD04Ojo4OTg7Pzs8PDs7PDw8PD87PD46Pj44PkI8Pj1BPjw+QkBERUNAPD5APkNJSUtEh9zV1tbW1tbW1tbW1tbX19fX19fX19jY2NjY2NjYzs3Pz8/Pz8/Pz8/Pz9PPz87MzczP09LSzs3P0s7Ozs7Ozs7Ozs/RztHU1NPOztPTz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0NDR0dHR0dHS09PU1NTU1dXV1tbW1tfW1tbX1tfX19fX19fX19bW1tbW1tbW1tbW1tbW1tjX19fX19fY19bX19fX1tXW1dbW1tbW1tXW1tbW1dXW1tbX19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjX19fX19jY19fX1tbW1tbW1tbW1tbW1tbW1dbW1dbW1tbW1tbW1tbW1tXV1dXV1NTV1di4gm9XSl9jUlFaS0hBQTxCPT07Oj4+PD4/PT0/Nzk6OTk3OD48PD47Ozw7PDs/PT0+OTs7OT0+P0A+QD07OkI/QkNCPz0+QD5CRUdKQoDc1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2M7Ozs7Ozs7Nzc3Nzsqfys3Nzc3QuYOEi8fTwJrLz87Ozs7OztHBp9Stg4OVz9KkodDOzs7Ozs7Ozs7Ozs7Oz8/Pz8/P0NDQ0NDQ0NDR0dHR0tLT09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbV1dXV1dbW1tbV1dXV1dXV1NTU1NXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NfX19fX1tbW1tbW1tbW1tbW1tXV1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXYwIBuVU9gY1dZW0xMQ0A9PTs9Ojw+Qj5CQ0A8Ojg5ODo6Ojc7Pz4/PDw7PDo5Pzw8PTg5PD9BPj09PUFAPTtBQkBCQz47QD9BQUlHSkF629bW1tbW1tbX19fX19fX19jY2NjY2NnZ2djY2dnOzs7Ozs7Ozs7OzdKpj63Rzs7Ozpu3tqSiwJOerNPOzs7Oz8/RnZC5nLy4mbWzn6Gp0s7Ozs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0dHS0tLT09TU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dbW1tbW1tXV1dXV1dXU1dXV1dXV1dXW1tbW1tbW1tbW1tfX19fX19jX19fY2NjY2NjY2djY2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2dnY2NjZ2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV18h/b1pTYWVeXVxPSkQ9QD8+Ozc6Pjk/RD5BOTg3ODk7Ozw4OT89PTw9PD47OkE7OTs5OzxDQDw7PT5AQT49QkQ/QkM9PT8+Pz5ISUg/ddrW1tbX19fX19fX19fX2NjY2NjZ2dnZ2dnZ2dnZzs7Ozs7Ozs7Ozs/Inrym0tDQzsqgl36Cw6abr6fUz8/Pz8/Tuq+srKaOgI3Gn5iVnMjQzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dLS0tPT09TU1dXV1dXV1dXV1dXV1dbV1dXV1dXV1tbW1tbW1tbV1dXV1dXW1tbV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2djY2NjY2NnZ2dnZ2dnY2NjY2NfX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dbV1dXV1dfNiHNdWGloXl9gT0lGOkFAPj88PTo2P0JAQzo2NDc6Ozo8Ojk+PD49PTs/PTxBPjw8Ojw8PTw6PEA9QEI+PkFCPUNDPT0+Oz9BRUtIQHDZ1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2c/Pz8/Pz87Ozs7SrKWnqdXAvNLHnY+ey9PJipmq1M/Pz8/P05+xnqihiazWupihnbCy08/Pz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0dHS0tLS09PT1NTU1dXV1dXV1dbW1tbW1dbW1tbW1tbV1tbW1tbW1tbW1dXV1dXV1dXW1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnY2NjY19fX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0JB1W1tqaWFeXVNOSTxDQEE+QD46OEZBP0M6NzQ5Ojo5Ozs4Oz0/Pj49QT08P0A9Pjw8PDw8Oj1AQD8/PT5CQD9AQkA8QD0+QUVLRz9r19fX19fX19fX2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnPz8/Pz8/Pz8/QzJ2Nl6zQmpfKxZ6ynpbN1q2ZqtTPz8/P0cCciZ2kqqybpbKZlq+zqtXQ0M/Pz8/Pz8/Pz8/Pz8/P0NDQ0dHS0tLT09PT1NTU1NXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX19fX19fY19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tKUcl5ea2tqZV1PTEc/RENDQDo9OzxCPD49OTY0Ojk5Ojo5Nzs/QDs8PUA8PEE+PD07PTw/PDo8QkA+PTs9QD5CPkBBPkA9QD9GSUQ/ZtXX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2traz8/Pz8/Pz8/P07GigJuvyaCjv8qcpYynrdiqmarUz8/Pz9SjooGeraSclaiQmoWdk6TV0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1NXV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dbW1tXW1tbW1tbV1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbSk3BgXnBoZmVaUUhHQkVDQEA3Ojo8Pjo8OTc2NTk6Njo8Ozc8QEA8Ojo9Oj0/Pj08OUA8PDs6OT9APj08PUBBQz9APz5BOz9ARkpCP2LS2NfX2NjY2NjY2NjY2dnZ2dnZ2tra29vb29vb28/Pz8/Pz8/P0M6fkGyclteqo9PSrqa1mJ/Vqpmq1M/Q0NHEn4F7lq2ns6uff5+phZmk1dHR0NDQ0dHQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1dXV1dbW1tbX19bW1tbW1tbW1tbX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfW1tfX19jY2NfX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX1tbW1tbW1tbW1tbW1tbX19fX19fW1tbW1tbX0pNuYFxxZGdkWlVKQENGQ0FCODs/PD07PDw4NTU4OTY4Ozo5PDo+Pzw9PTk8Pz49Ojo+OTw6Ojg+Pzw9PTw+QEFDQT48PDpCRERKRkJd0NnX19jY2NjY2NjY2dnZ2dna2trb29vb29vb29vPz8/Pz8/Pz9G9n8O31pfA09HQ0srSzZeb1KqZq9XRz9DVq6+8wM+UyNnBnIC8raaYr9bR0dHR0dHR0dHR0NDR0dHR0dHR0tLT09PU1NTV1dXV1tbW1tfX19fX19bW1tbW1tfX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19fY2NjY2NjY2NjY2NjY2djZ2dnZ2dnZ2dnZ2dnZ2drZ2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fX19fX19fW1tfX1tbX19fX19fX19fX19bW19GRbF1cb2doYl1PRkBISUdFQDw8Pj48PT48NzU2Ojk2OTs6Ojs4QD86PDw5PD49Ozs6Pzk/Ozs5PT49PTs7PTxAQ0I/Pz47Q0ZGR0hEWc3a2NjY2NjZ2dnZ2dnZ2dna2trb29vb29vb29vb0NDQz8/Pz8/Pz5V+e6WS1KKa08ySl6ObodirmavV0pem1cmHf4Wgl4+gn5+YqJaYm7vV0dHR0dHR0dHR0dHR0dHR0tLS0tLS09PU1NTV1dXV1tbW19fX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tbX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2tnZ2dnZ2dnZ2djY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX1tfPjGRWXnBrXGBgTkVITUlJT0M+OkI9PUBCOzU0Nzw6Nzo7Ojo7OT09OTo6OT0+Pz07OT47PDo8Ozk+PD47PD0+QENCPz5BPEFDR0ZGRVXJ29jY2NnZ2dnZ2dnZ2dra2tvb29vb29zc3Nzc3NDQ0NDQ0M/Pz9DR1aeZrcmjqL7KnbGdo7XZqZup2LirocbT09Wcm6ylq6Kfw6CrpJzR09LS0tLS0tLS0tLR0dHS0tLT0tPT09PU1NTV1dbW1tbX19fX19fX19fX19fX19fX19fX19bW1tbW1tfX19fX19fW1tbW1tbW1tbX19fW1tbW1tbW1tbX19fX2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2djY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fX19fX19fX19fY2NfX19fX19fYzYZdV2JvZE9dVEtIRlNRS0xAPj1EPD9DRj01NTc7OTY6Ozo8PTo7Pzo6OTg6PT0/Pjs/Oz49Ojs5Pjs9PD0+QURCQD8+PzxAQUVHRURSxdvY2dnZ2dnZ2dnZ2tra2tvb29vb3Nzc3Nzc3NzQ0NDQ0NDQ0NDQ0NO5gL3Tm5bP1LWLkZ/T1LyBu9TOlKDS0dLXqIfPqY6OrdjCj4271dLS0tLS0tLS0tLS0tLS0tLT09PT09PU1NXV1dbW1tfX19fX19fY2NjY19fX19fX19fX19fX19fW1tbX19fX19fW1tbW1tbW1tbW19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2tnZ2tra2tra2tra29ra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2NfX2ct+WlVqaltMX01KTEpVTEZCPD0/R0ZIS0g9NjU3Ojk3OTo7Ojw9OT45OTo4Oz0+PkE+PTk8PDo9Pj46PTk5Oj9FQUA+PT8/QkBHRURFUMHc2dnZ2dnZ2dna2trb29vb29vb3Nzc3Nzc3dzc0NDQ0NDQ0NDQ0NDQ0cHR0crI0tDUxLjS0tHSwtLQ08fM0tHR0s/F1NS/v9XS1cXE1dLS0tLS09PT09PT09LS0tPT09PU1NTU1NXV1dbW1tfX19fX19fX2NjY2NjX19fX2NfX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29va2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2djY2NjX19fX19fY2NjY2NjY2NjY2NjY19rHd1xSZ2laTlpOTFBRV0VKPz89P0FFTExBPjc3NTs4ODk5Ojs8Pjw+ODo6OTs+P0A9Pj46NTo6PD0/Ojs5Ojw+QkJAPz8/P0FCR0RDRE683dnZ2dnZ2dna2tvb29vb29vb3Nzc3Nzc3d3d3dDR0dDQ0NDQ0NDQ0NDS0NDR0dDQ0dPU0dHR0dPR0dHS0tHR0tLT1NLS1NXT09PU1NLS0tPT09PT09PT09PT09PT09PU1NTU1dXV1dbW1tfX19fX2NjY2NjY2NjY2NfX19jY19fX19fX19fX19fX19fX19fX1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tvb2tra2tra2trZ2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2trZ2tra29ra2trZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjbwXNYVWlrU0xSTlBSWVRGSTw+Qz9BQkVKPj43ODY5Nzc4OTk7Oz0/QDw9ODk7Ozs/Pjw8OTU6PT47OTk7PD8/P0JCQT1BPUBBQkZCQkJLtd7Z2dra2tra2tvb29vb29vc3Nzc3Nzd3d3d3d3R0dHR0dHR0dHR0dDQ0NDQ0NDQ0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tPT09PT09PT09PT09PT09TU1NPT1NTU1NTU1NXV1dXV1dXW1tbX19fX2NjY2NjY2NjY2NjY19fY2NjX19fX19fX19fX19fX19fX19fX19fW1tbX19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2NjY2NjY3LxvVFRsbExLUkpUUlVLRkQ6PkdEREFERjw/ODk6OTY5OTo3PD07PkA9PTc5Ojs5Pjs5OTY2Oj1AQT47PDk6Pj9DQT4/Qj0+QkNFQkFCSrDe2dra2tvb29vb29vb29vc3Nzc3Nzd3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0tLS0tLS0tLS0tLS0tLS0tPT09PT09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1tbW1tbW19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19fW1tbW1tfW19fX19jY2NjY2NjZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2dnZ2dnY2Ny2a1NbcGtLVVdSXFFXSEQ+PEJKRT1ISj89PDc4ODo1OTg5Njs+PD1APDw1OTk8Oj87OTg0ODw9PUFBPD47Ojw+QD89PkE9PUNGR0I/Qkmq39ra29vb29vb29vb3Nzc3Nzc3N3d3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHS0M/U0M7P0tLT0tLS0tLS0tLS0tPT09TU1NTU1NPU1NTU1NTU1NTU1NTU1NTV1dXV1dXV1dbW1tbW19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19jY2NfX19fX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dndsGRTYXJfT1pUV19RUkdCPUVJTEFBTEQ/Pzs6ODg5Mzg2ODY5Pj0+Pz06Njo7Pjs9PTo5Njg6PTtAQDxAPz0/P0I+PD48PEJFR0lCPkNJpODa29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3t7S0tLS0tLS0tLS0dHR0dHR0dPT0bm7zLqbnLrQyNPT0tLS09PT09PT09PU1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2NjZ2dra2tra2tra2tra2tra2tra2tra2tra29va2tra29va2tvb2tra2tra2tra2tra2trb29vb29va2tra2tra2tra2tra2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ3qpfVWBuW1VZUVpeT0xHQ0ZNSUZEREo7QUE7PDg4NjQ4Njk4Nzw/QT89Ojc8Pz48Pz87OjY4OD09QEE9QD5BQD1AOjs6Pj1BRUdJQkBDR57h29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e0tLS0tLS0tLS0tLS0tLS0tO+wMqaoKKViJGeqpOpz9TT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fY2NjY2NnZ2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dna2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2tvb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2d6iXFVeblheXU5aUFROQ0NMSUlJRkpEPEJBPDs4NzY3OTc3OTk9P0E/PDo5QD88PkI/Ozg3NzY9Pz9APUBBPz88PTs7OD48P0VJSEE/Q0aX4dvb29zc3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3tPT09PT0tLS0tLS0tLS0tTIlZyum5m1iX2TjIKBhMTV09PT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tvb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dndmlpYYW5ZYVdPV01QRUJETElNS0ZJRT5CRDk4ODY3OTc1Njk4PT1BPjo4OT4+PD9APzw1Njc2PD4/PjtAQEA/Pj4/Pjs/PkFCRkdCQENIkeLb29zc3Nzc3d3d3d3d3d3d3d7e3t7e3t7f39/U09PT09PT09PT09LS0tLTz6h+kayPko6MhoCIiYSQo8rU09PT09PU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY19jY2NjY2NjY2NjY2NjX19fX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2tra29vb29ra2tra2tra2tna3JJaWWNuWlpSVV5QTDxAR05IUklIRT47SEY4OTc1Nzg3NTg5ODs+Pj07ODlBPj1AP0E+NzU5Njs+QUI/P0BAQkI/Pj8+QUBEQUZIQj9FSozi3Nzc3Nzc3d3d3d3d3d3e3t7e3t7f39/f39/f1NTU09PT09PT09PT09PWtaWaiIuQhYCFi4iBg4qLf4bC1tTU1NTU1NTV1dXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2dnZ2dna2dra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29ra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb2tra29uIWltnalxYTFpfVkg6TEhMSkpDRUZDQExINzo3Njc4ODU4Nzg5PDw7Ozk4QD89Pj8/PDY3PDQ3P0JCQUBAPz8/QT09P0A+QEBGRT09REuI4tzc3Nzd3d3d3d7e3t7e3t7e3t/f39/f39/f39TU1NTU1NPT09PT09PUxZKCg4WGfYGCfXx5foGCg36k29bU1NTU1NTV1dXV1dXV1tbV1tbW1tbW1tfX19fX19fX19fX19fX19jY2NjY2NjZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vc3Nzc3Nvb29vb29vb29vb29vb2tra2tra29vb29zb29zb29vb29vb29vb29vb29vb29va2tvb29vb29vb29vb29vb29vb2tvZgFpebWhaU0ldW1hKRE1ISlNMR0ZBQD9KQjg7NjY5OTc1ODY4Ozo7Ojw5OD09O0A9Ozo2NTw3Oz1CQEFBPD49QEE9PEA/Pz5CREU+PERLg+Lc3d3d3d3d3t7e3t7e3t7f39/f39/f39/f39/V1dTU1NTU1NPT09PT2LKEkKh9g3l2hIh/e3d5gn5+i67A1dTU1NXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dna2trZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2tra2tra2trb2tra2tvb29vb29vb29vc3Nzc3Nzc29vb29vb29vb29vb29va2trb29vb29zc3Nzc3Nvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc1nlcWmxmWFJPYFFSQUhHSkZYTEZAQENDSz87Ozc4ODc2NTc2ODo5PDw6PTs/PTs9Pjw7ODg8OT0/QkFCQzw8P0FCPj1BQkNCREVDQDtDTH3h3d3d3d3e3t7e3t7e39/f39/f39/f39/g4ODg1dXV1NXU1NTU1NPU0ruen3WKeXuIgICChYGDcnOAhYOMrNfV1NXV1dXW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NnZ2dna2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra29vb29ra2trb3Nzc3Nzc29zc3Nzc3Nzc3Nzb29vb29vb29vb29rb29vb29vb29zc3Nzc3Nzc3Nvb29zc3Nzc3Nvb29vb29vb29vb29vc3Nzc3Nzc3Nvb29vb3dByXV9wZVdLUGNPS0JHQ0pIS0ZBPEE9SFBBOjo3Nzg3Njc4Nzw6OD09PD47QD88Pz07Ojs5Ojk8QEJAQkNAPUFAPz1AQkNDQUBAP0A7RU144N3d3d7e3t/f39/f39/f39/f3+Dg4ODg4ODg4NXV1dXV1dXV1NXU18h4i4V8goh6g4SBfoKCc2l0hYuGkJ3U1tXU1dbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tvb2tvb3Nzc3Nzc3Nvc3Nzc3Nzc3Nzc29zb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb297KalxjcWVST1heSz9HTElPS0VAPkFCP0lPPjk6NzY7NzY6Ozc7Ojg6PDw+Oz09Oz48Ojs4OTo4OUFCQkFAQDtAQj06PkFCQz8+PT4/PUZOdN/e3t7e3t7f39/f39/f4ODg4ODg4ODg4ODg4OHV1dXV1dXV1dXV1s6dhpl+f5OTin+CgXx9gnNxm4mAgoOJwNnat7TQ19bW1tbX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tra2tra2tra2tra29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NvfwGNaW21gVlBTU0pETEhNSEk8PkFEQ0ZORDw8OTc5OjY4Ozk3PDk4OTw9OzlAPjpBPzw3NTc7ODpAQUVBPz45PUI/Oz1CQkI6Pj07PT5GTnHe3t7e3t/f39/f39/g4ODg4ODg4ODg4OHh4eHh1tbW1tbW1tbV1tjLioCHhYOXjHh7e3lvfYF1a3ebdHZ7eInHxpiMrdjZ19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2drZ2dna2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tra29vb3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29zb29vb3Nzc3Nzc3Nzd3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3Nzc3Nzc4LdjV1lrYlJNVVFMSktGS0ZDQD5CQT9FTT4+PTg5OTo3OTo3NT03Nzo+PDs7Qjw5Pz05NjY4PTk6QEJGQD49PEBCREA9QD9DO0A9PD4/Rk9t3N/e3t/f3+Dg4ODg4ODg4ODg4OHh4eHh4eHh4dbW1tbW1tbW1tfVrYZ6d32rn3l4entzdH+Dfm9xe3l6c3t2k4qFgImkzdnY19fX2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tna2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29vb29vc3Nzc3N3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vc3Nzb3Nzc3Nzc3N3d3d3d3d3d3dzc3Nzc3Nzd3d3c3Nzc3Nzc3N3d3d3d3d3d3d3d3dzc3OGtYVtebGJSTVZMTUdLS0RGQkI7QT08RUxDQT44Ojk6Nzc5NjY6NTs+QDs9Oz89PD89Ojk5Ojw5PEVDRkA/PkBDQkQ9OT0/QT1CPz1APkdPadvf3t/f3+Dg4ODg4ODh4eHh4eHh4eHh4eHi4uLW1tbW1tbW1tfQmH+Qh4N9eoN2e3Vzenl6kKqmd3JyfoeHh4CAfoKEhJHJzNnX19jY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra29va2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2djY2NnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vb3Nzc3N3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzb29vb3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3dzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3NzhpV9UYm1iUE9TSUhHRkpJSUJBPkJCPEVFREA+ODo4Ozc3Ojc4ODY+Pz07PDk9PDo+PTs6Njc7NjpEQUY+Pz8/PkNBPzs9PT47REM/PjxIT2fZ4N/f3+Dg4ODg4eHh4eHh4eHh4eLi4uLi4uLi1tbW1tbW19jYyH52doN+fnR2eIaCenl1d5yhu6GEgoCAfoeKinx/gYaMnKjO2NjY2NjY2NjY2djY2NjZ2djY2NjY2dnZ2dra2tra2trb29rb29rb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3d3d3d3c35pbT2drXFBRUElDT0pLR0xHSkJAP0FHREBBPDg8ODg1ODk3Njc3QEA/Ozw5Pj04PTw8Ojc4PTk/RENGPkE/QkBDPzw6Pj0/PkVEPz07S1Fj1+Hf4ODg4ODh4eHh4eHh4uLi4uLi4uLi4uLj49bW1tbW19XB3LRueHJze3B6eXaFiIR7eH2AgZiljH98fnuRhZaLhoGDgY6Rvd3Z2NjY2NjZ2dnZ2dnZ2dnZ2dnY2dnZ2dna2tra2trb29va2tva2tra2trb29ra2tra2tnZ2dnZ2dnZ2dnZ2dna2trZ2dnZ2dra2tra2tnZ2dnZ2dna2tra2tra2tra2tra2tra2trb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t3d3d6NWFdobllQUUtISlNJTUhNSUtBQz9DRkJBRDo6PDg2NDg4NzY2Nj8+Pjs8OTs7Oj09PDw4Ozw7RERERT4/PkI+Qj84PT8/Q0NCQEE+O0xUY9Xh3+Dg4OHh4eHh4eLi4uLi4uLi4uLi4uPj4+PW1tbW1teslLZ6eHJvd5V7dHuLgHh1bn6Fg3t/hYhyfH2bnI6JioJ+g32Hk5rH1NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2trb29vb29vb29vb2tra2tra2tra2tra2tnZ2dnZ2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2trb2tra2tra2tra2trb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d7Zf1lgaGxcUUtHR09LTk5PTURGQkg/Q0hEREA6Ozs4NzU3Nzc4NThAPkA7PDk8Ozw+Ojk7OTk7OUZERUI8QD4/PEBDOz5AP0A/Qj8+OjtKVWPV4eDg4eHh4eHi4uLi4uLi4uLi4uPj4+Pj4+Pj1tbX19vKhYR3cXJubniVhHt4hH95dnB4c3eLkY6CdnN9ioaId3d1d4ODfIiIk8Pb2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2trb2tvb29vb29vb29vb29rb2tra2tra2tra2tra2tnZ2dnZ2dna2tra2tra2tra2trb2tra2tra2tra2tra2trb29vb29ra2trb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f0nVZaGlqVk5KSE1OR01EUElGSD9FPUZMREM+Ozs8OTc3OTY2OTU4Pj4/PTs8QDs9PDo3Ozc5OThHREVCPUE9Qj8+QDw/QUE/QEJAPjs8S1Ri1OLg4eHh4eLi4uLi4uLi4+Pj4+Pj4+Pj4+Pj49fX19fEknuJf29sbnV2foSBg4qGfnVybWVtiIaKjoR7c4OHint4e4OPj4GEioqxztrZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29zc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tvb2tvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3dzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f3t7e4clsW2pqalNOR0dOT0VIRk1JSUA7RD5ISUA9PDo6Ojg2ODo3Nzk0OD08PT07ODw8PDw4Njc4OTo6RUJFQT9APEI/Q0M+PkNEQUBAP0A8PUtRYdPj4OHh4uLi4uLi4uPj4+Pj4+Pj4+Pj4+Pj5OTX19fZqXaFfnx3bHB3eXh8jH2KhYB3anN0d3p9bot7fnl6foR/gIGDfnh8foeGlrbT2tnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra29ra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/e3uO9amFpa2lRTkZNTEtKWE1OR0FAQE9BQz9AOzw4OTk5Njg2NjY4NDs+PD07OTY6Ojk6OTU4OTg5OkJERj8+Pj5AQEBCPzxBQD88Pj9BOT5KT17S4+Hh4eLi4uLi4+Pj4+Pj4+Pj4+Pj4+Tk5OTk19fX2sqKhIB5c29tcXN1d4CUeHaAfHWHhXd1cnWgmXp7d3Z5doR0bWxue3iAmouTu9za2tra2tra2trb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc29vb29vb2tra2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f397js2lpbmloUFBPTExPUk9LU0Y/RURERD48PDg7ODc5OTU2ODY2NzM6Pjs+PTc6Pjk5OTk2Ojo4NzxDRUc/Pzs/PkA9PkE9Oz0+OUFAQDhBTlFc0OTh4eLi4uLj4+Pj4+Pj4+Pj4+Pk5OTk5OTk5NjY2NjauY6AenZ1bmpveHCBfWt0cnZ3hIV5h4d5lY55eXp1d3pza298gHx2fYh8gLLe2tra2tvb29vb29vb29vc3Nzc3Nzc3Nzc3dzc3Nzc3Nzc3Nzb29vb29rb29vb29ra2tra2tra2tra29va29vb29vb29vb29zc3Nzb29vb29vb29vb29vc3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3t7e3t7e3d7e3t3d3t7e3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/f39/f4qpqa2hrZFNQT0ZQVFJOSFJLPkREQ0I7Ozk6Ojg2Nzg1NjY4Nzg0Oz88Pz05PDw3Ozo6Nzo6Nzo9Q0JDPUE+Pzw5PT5BQDs8PDtFQD47Q05TXNDk4eLi4uLj4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTY2NjZ1p5vdntveHh2cG50d3BwdHBzb36Jc3qGhY2EenNtcoB6hn1vg5OBdnx9g4a13drb29vc29vc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29ra2tra2tvb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4N/f3+KgbWhma2ZVVlJHUFFOS0xMRUJIRUc9OD08Ojo3Nzg3Nzc2NDY3NDg+PD09Ojg6OD46Ozc4Nzc6Oj5DRDtDQj49OD1AQUM/Pjw+RTw+PUJNUF/S4+Hi4uLj4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk2NjY3MB2doCCfnp4eHBsdXlya399bHNvdGdoaYB/aWh4c2d+iYl4cIKGe3d9foWKvd3b3Nzc3Nzc3Nzc3Nzc3Nzc3d3c3Nzc3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODflGttZm5mU1NJUFlUTEhGTkZGRUJGPTs+PDs5Nzc4NTc5NjQ1NzU4PDs9Pjo6OztAOTs7ODc6OTlAQkE8QUE/Pzk/QEJFQ0FAQEM7Oz1ES01g1uTi4uLi4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk5NnZ2tmYc3uqhJaCcnR1dn14aGx8d2h4d25rcHR5gIN2dHyBhIJ9c3CAin94gn95g8je3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f4N/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh24tubWdzY1lRTVVbV0hDSUZOS0dCRD8/Qjo7OjY2NzU2NzY0ODc2Ozw7Pj86PDk8Qjg3OTo6Ojk6QUFCQUJDQEE+PT9CQ0NEQUJGOTg9REpOYtjk4uLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXZ2drcqHGCtXiRfnNsem6EgXaCfWtoan+DeHZ8dX2FhXRmcHl9d316gIqFe318foC03tzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3dzc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3Nzd3d3d3d3d3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e397e3t7e39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4ODg4ODg4tiFb3FrdWFWT1VVXE9ETUY+SkdKRUQ8P0I6PDk4Njg1NTY3NDc2NDk7Ozw7OD47PEE4ODo9OD04Oj09QEBAP0FCP0A+QENCQ0FBRTc2O0RMTmPa5OLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXl29ra3Z5sbnNxhY1ybXBuf391hH5rcnZ2enN4gXhzb3VwbWt2fHmFiIB/f392coODsd/c3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eDg4eHh4eHh4eHh4OLXhW1xb3ZeUldTWlpRSkhDQFFAQkQ8OT9BOjw5NzU3NDU2NjQ3NTY9PDo9PTk+OjxAODo6PDY7OTs+PUJCQjtBQkBDQEBEREM8PUA3OjxFS01l3OPi4uPj4+Pj5OTk5OTk5OTk5OTk5OXl5eXl5dPOxsB+cWxveHt2b3VuanNzbZKGeG50dG5vdIZ/b2twboJ0bXZyfY2DdnF/d3mKgabf3Nzc3d3d3d3d3d3e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3dzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t/f3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi1oZucG1xYFJZUFdfWUpMTElSP0Q9OTtCRjs6OTc0NTY1NzU0NjY2Pj07Pz45PTk7Pjg9Ozo0ODtAQENCQ0FCRkE/Q0BBQkREOz0+OTs8QkxNZODl4+Pk5OTj4+Tk5OTk5OTk5OTk5eXl5eXl5eW5t7Woc3JscHd6dHd4bXFydXd/hHRyc2xsa3F8bnBudGuBf3GAd32Eg355gHNygYqg2d3c3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh49WHcWxqbF5YWlVXYFZWUE9QTD1BOjs8RkE4Ojg3MzY1Njk2NTg1Nz89Oz8+OT04Ozw5PTs7NTo9Q0JCPENDREREQUE/PkJDQzw9Pjg5PENLS2PN0dnh1sjY4+Tk5OTk5OTk5OTk5eXl5eXl5eXltbW2q3J5cm59f3Z1d2hqaGlwb3Zta2tnZWZxdG15gG5teXd2iHhxa2podXV5dHV/wd/c3d3d3d3d3d3e3t7e3d3d3d7d3d3d3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHi4uHh4ePVhnFwY2lhV1NZV19MUk9STUtAPjg5O0E+ODc5NjQ3Njc6NjY2NDk+Pzo8Pzo/OTo6Nzo9PDk5PEFBPTtBQ0VDRkA+Pj5BRUQ+QEE3OD5GSEpesrW4wbm1u8jg5eXl5OTl5OXl5+fn5+fm5ebm5ra2tbWOfX5weoR1cnZnYmNlbGtyb2ZpbHZtd4Z9hXlsbHd4a3ZwfH14c3V5fHd2h7ng3d3d3d3d3d7e3t7e3t7d3t7e3t7d3d3d3d3d3t7e3t7d3t7e3t7e3t3d3d3d3d3d3d7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4eHj1Yd1bl5uY1pUU1hXS1NLSk1SR0E4Ozs+PDk4NzU2NTY2OTY4NjY5Pzw6PT07Pzo7Ozk8PDs5Oj4+Pjs8PUFEQkNBQEBBP0JDPDw9Nzs+REVKXrG1tLW2t7e2y9rJ3uXl3eDi3tXU1tPU4OPg39+2treuh3t/bnmNenJ1bWNobGxtaXR4enF5enqIh4N6aWh9cWRvcXyGgX55e318e4an2t7d3d3d3d7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4uHh49aGdmxhb19dV1lcWlJQSEpXTEVHPUA9Ozs9OTY0NjU1NTg2NzY3OD87OT09PDw5OTw6Pjw6OTg+Qjs7Pj5AREBDRUFAQD0/QDw9PTU5PEJHRl2xtbW2uLm5ubq9uMPT0r3BwcC6u7y6u8TMxb/Dt7e3hGl1gX1ndYd5Z3Vxa2t5eHB3fH15bWl3e3h3bml1j4FwbHl4d3d9gXuGgnmAoNze3d3d3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODh4OHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4ePXhXJrZ3RhW1hYX15TVVVRVUpMRj9JRDs5PTY2NDc3NTc4Nzc3ODk8PDo+PDg8Oj0+OTs8OTs5P0E8PT9DP0FARUJCQTw9Q0A6Pjw1NDlER0dasbW1tre5ubm5ubm3ubm4uLm5urq6urm5urm6u7e3uX9ucHN6b3B/eXNuc3Vsc3Z4cXFwb2tvcX6Bc2mHhIF9dHOHdW11hYmBgHJ2hafd3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uHj14lxa2xyW1dXXWBUUVVUUFJPSkNATUE9Ozk2NTM0NjQ2ODc3Nzk6Pjs8Pjs5PDo8PDk8PTw7PT0+PUNEREBDQkE/QD48PkE8OD06NjY6QkpIWLG1tLa2uLm5uLi5uLe3uLi5urq5ubi4uLi6uru3uKx7cnhxf3ZzfnBsbXpyZ29sbW50cHt3d3Jyd3pvhpJ2f3x8enZ5fH9zfYdyda3T393d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4eHh4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi49eHb2pxalVWV2FbT1FSUE5XSURESUo/Ojk6NzUzNDk1NzY2Nzg4Ojw7PD46PDo6PTw5PDw9Oz09PDs9REdEQ0E8PDw8Pj5AOzg8ODE1OkFGRVautbW1tre4uLm4uLi4uLe4ubq5uLi3t7i4ubq7t7mqcnB4d3x7e4J3aG5xam9qY2lyf21zcn54dHFsanaAeX2AgH91doB1a4qLgHaR1d/d3d7e39/f3t/f3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f4N/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLi4uPYhm1sdGVWUFxnWE1YU1JRWUVDS1BOOzk4ODc1NTM5NTY2NzY4Nzk+OT0+OTw5OTw7Njg5OTo8QEA9PkBGQEJCQDo+PEE9Pzs7OzYxNjxCR0RQqLa1tba2tre4t7i4uLi4uLm6ubi4t7e3t7e5ure2tIlyd3h9iXxwem99c2hqbGdnbHRscXd0cWx2c3Fxd3FyfHl4g3Z7d2mLkYp9kM7f3d7e3tvY2drZ297f39/e3+De39/f3Nvc3N3e3uDg3+Dg4ODf3t7e39jS397f397e3t/f3t7f3t/f3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLi4eLi4uLi4uLi4uLi4uLj4+Lj4+Li4uPj4+Pi4uLi4+Lk14NoZ3VkVlVkZVdKWllXW1Q9RU1LSD04NzU3NjQzOTQ0Nzc1Njc5PTo9Pjw9PDk7PDk5Oj45PD4/PkFBQ0FFRUQ+OzxBPjw5PDs3Mzc+REhFSqG2tbW1tbW2tre4uLi4t7e4uLi3tra2tra3uLm2traLfXpsbHp/cGx5dm5qaGdlcXp4b2lvb3B1c21zd4Fnb32CgYNyf3lqcHJ6f6ng393Zy8a/vL2/vsLN0tDW3tnc4NfQzcPCw8PH1dfT2dzX1NjX0MfExce9vM/Kz87Y3djO3N3c2t3T0dze39/e397e3t7e4N/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eLi4uLi4uLf4uPi4eLg4d7W29/Sw8rJx9Hb3OLk4eHg2dre1sbExcTN2trf5OHi4trX3st9aWZxYVleZWFNTFRLUlpMO0hNSEZBPTc2NjUzNDY2NDg3NjU2OTw7Pj46Pjk5PDk3OTs7Oj49PEBAQ0RCR0ZCQT08Q0A9OTw7Nzc3P0RGRkaZtrS1tbW2tra4uLi4uLi3uLi3s7W2t7a3t7i5tba3opdxb29waW50dnFmZWNrbmdvcm1mZ2tygWVvdnyAeGRzj39zaHFyaWVlbm+w39HFv7u5ubm5ubq6uru6vc3Gw8e/urq6uru7u8HCvcHFvby/vry7urq5ubq6ubm6w8XDucDDwby/ube/z8/U3tjc3t/g3tLa4N/f4ODg39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eDg4ODg4ODg4ODh4eHh4uLi4eDh4uLi4uHa2t3RwsPCu8XT1uDdydPDrrnAsaqrq6uwtLbJ0sXRxLG4v7Srq6usr7S0vMzE1c60tLureGxtbWBdYl9ZS1NVVFFQREBRTUhEPzo3ODU3MzE1NjQ5ODQ2Njo8Oz08ODw5Njo6ODg5NzU8PDw/QEFAQkRDQkE8PkI/Pz09PTc1OD5DRUNAj7a0tLW1t7i4uLi4uLm5uLe1sautr7Oxs7OztLS0tqaei2tue3ZxeXhnY2hfcXdha25vaG99b25ja2lseHdsa4Z+bHB6dm1scG95sca8uru7urm5ubq6urq6urq6urq6urq6urq7u7q7u7y7urq6ubq7u7q6urq6urq6ubi3t7i4t7e2tbW1tbi3u8e+w8XHzcS4wMnH0tzZ2d/e3uDf39/f4ODh4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh3Nji4uLi4eHh4OHg3tfGxtHQztTe3tPO0t/SuLi8sq2trKysrrG+ua63rKipqamqq6urqqqqq6ysuKyqqqqrq6urra6urq6urryzrayrpHlub21fXl1dVE1SU1xUSkE/UElIPjg5NjgzNzMwNTczNzg1NzY2Ojw/PDg5Ozo6Ojg5OjY1OTs8Pj9EP0NFQkNCP0BAQT9APjw3ODc6QUVEP4W4tLS1tbe4uLm5uLi3t7SurKuqqq2urq6vsLGzs7WjcG5ucm1wg311aWFlaGZkY2Rxc21td25naW1tZXBzb29zcXN8h4F6dX11n7u6uru7urq5ubm6urq6urq6ubq6urq5uLm5ubm6urq6u7q5ubm5ubq6ubm6ubm4uLi3t7e4uLe3t7a2tbW2tra1tbW1tba1t7e3t7rBvrzGycrb3+Dg3tvd3d7h4tDW4uHg4ODg4ODg4ODg4ODg4OHg4OHi0768zNjd3OLg0dnbxL23sLCxsa+zu7uzsLS9s66urq2tra2sq6qqqqmpqKmpqampqqurqqqqqamoqampqampqaqqqqytrq6urq6urq6sraR4aWJxZmFZWlZRUk5cU0Y9QlJEQTc8OzY5NTY1NDU2NTg3NTY1Nzg7Pjw7OTk5Ojg3Nzk3Njg8Oz47RD8/Q0BBREE+P0M9Pjw+Ojo3Nz9DRj54srCztLW2t7i3trKurq2sq6uqqaqtraysrq+xs7S1t4xucnRqaIB5ZmpmZWxdaG5waGxxYmNmcoJ+dmhobGpueoaBhXx4cXF5gK+6ubq6urm5uLm5ubm5ubm5ubm5ubm4uLe3t7e3uLm5ubm5uLe3t7i5ubi4uLi3t7a2tre3t7e3tra2trW0tLW1tbW2trW1tre3t7e3t7e3tre4v8bP0MS+v8DE19e8ydra4OHg4ODh4eDg4ODh4eDb3t7Uzby3tre6wMDJxLfIvrKwsLCwr7Cvrq6ur7Cwr66urq6uraytrKurq6qpqampqampqampqKmpqKmpqampqKmpqKmpqqqrraytra2ur66trK2heWpkbWdiXFhRUFFLVEpCOklRP0E3PDk0OjU2NTQ1NTY4ODY4Njs6OTw9PTs6ODY2ODg6ODY3Pj09PT5BQUVCQkNBQUBBOj09Pz05Ojc9QUc8bKqmqKutsLGwrqupqKqrq6mpqamrrKytra2usLO0tbilgIdvaWdzdGZrcG1qZGxvcm5rbWNrcHyJhG5qbHx4Y3uKfnNqc25rcY+7ubm5ubm5ubi4ubm5ubm5ubq5uLi3t7e3t7e3t7i5ubi4uLe2tra3t7e3t7a2t7a2tra3tra2tbW1tba1tLS0tbW1tra2tra3t7e3t7i4uLe2t7a2uLm4uLe3uL6+uLq9vcfb4OHg2Nnd4eHg3dfKwcPCurm5uLe4uLi3tbS0tLKysbGxsLCvr6+vr6+vr6+vr66ura2srKyrq6yqqqmoqKmppqepqaehpaipqamoop+hoZyip6inqausrK2ur7Cwrq2unXhwbGphY2BZUU1RTFJGQzlNUEU+ODs3Mjc5Njc0NDM1ODg3OTc7OTo9PTw6Ojk3NDo5ODY1OD8/QEI9RENDQ0FDQEJBQDtAP0A/PDw6O0NIPWOopaWlpqioqKenp6ipqqmoqKipqqqsra6wsLCztLW1taWYdn5xZmt4cW9tZmVsaGNsZ2ZpaX11bWlvfXZ5hWZod294b3Fvcninu7m5ubm5ubm4uLm6ubm5ubm5ubi3t7W1tba2tre3t7e3t7a2tbW2tre2tbW1tra3t7e2tbS0tLS0tLS1tLS0tLW1tba2tra2t7e3t7e3t7a2tre2tre3uLe2t7i4t7i4uLi4wMXTyry8w83PyMC9urm5ubq6ubi4uLi4t7W0tLSzs7KysrGwr6+vr66urq+vr6+uraysrKurrKysq6ehoJ6gn5udoaGdlpmkpKaon5mZmZmanZ+gn56fpKqtrq+ura2srJl1cGlrY2FeXVVOU0tSREQ4TktHQTo4NTI2OTY1NDczNzc3ODk3OTo7PT0+ODg4NzU6OTk1OD9AQEFEPkZBQkNAQkNCQT88QEJCQD0+OjpERj5cpqWmpqampqanqKenqKioqKenqaurrKytra2ttLS0tbekc311bnONf3JmanFjaW1jaGZobG51aV9jZ3VzdnpuZ3Bwcn56cYihu7m5ubm6urq6urm2s7a1uLm2trW1tra1tbW1tbW3tra3tra2tbW2tbW1tbS0tLa2t7e3tbS0s7O0tLW1tLS0tbW1tra2tra2t7e3uLe3tra2trW2tbW2tra2tra2tra3tra3uLi3uri4uLi3uLi5ubm5urq6urm4t7e3t7W1tLS0s7OysrKxsbCwr66urq6urq+vra2srKuppaSmpqScmZubmpmampmXl5eXl5aZm5iZmJmZm52en5+dnJ6gpKWko6OioqKQdG5jcGFeXltUU1RIVEo/PFFCRkM7ODYzNzo1NTQ4Mzg5OTc4OTc7OTs9Ozc6NzU2OTk4NTg+Pz9ART5CPz9DPzxBQUI/PT9EQT8+PTk9Q0Y/VaSlpqanqKeoqamop6ioqKioqKiqrKuqqaipq7W1tba5o3eKcXKHhnd0cGh5a2JjYWVsaW5zal9jZWNjZWprYmRqbHaXjX6ovbm3tre5u7u6uLWxrKurqq6wrKyrq62tq6uvsLGvr7CytbW2t7W1trW1tbW1tbW2trSvr7O0tLSvra6vsrW0tbW1tbW2t7e3t7e3t7e3t7e3t7Owsra1tLa2tre3tra2tbW1tra3t7e5uLi4t7e3uLi4ubq6urq5uLi3t7e1tbS0tLS0tLS0s7OysbCvr6+vr66vr62oo6KgnJqampqZmZqbm5qampqbmpmZmZiXl5aYmZmZmpycnZ+foJ+goKChoaCgoJ+fi3RuaXRdYGZeUlRLRFRJPUVTSEVCOzo0NDY5NDQ1NzM4ODg3ODk5Ojs7Pz04OjkzNTg5NjM5PT5AP0A6QEJCQkA/QEJCPz0+QUFCPz06PkVDQFGjpqWlp6inqauqqKaoqKipp6ioqKinp6ioqaq1tbe3t7KZtH99kIx1Z2lqbGZjYGNoZW94cGlicXx5cGpmZmRma3NqhYystrKwra2ttLeysLCtrKuqqaiop6ipqampqKinqKipqaeoqqurra2sqqytraysrq6traunpaSnqqyopKOkpamwsbGztbW2t7i3t7W1tre4t7e3t7Kppaasq6ivtLa1s7W3t7a1tbW2tra3t7e3t7a2t7e3t7m6urq5uLi3t7Wxs7S0tLKxsK6sq6yurrCxsK2rqqmqqKijnJqZmJmYmJiYmZmZmZmZmpqZm5ubnJybmZeYmpqcnJydnJ2foKGhoqKioKGgoKCfnop1amtuWVxhVktPREdVRz5PV0hEPTw4MzQ0ODQ1NDgyODk4ODk6Ojw5OUA8Njk6MzY3OTE0PD8/QEBBOkNGRUJBREJDQTo7P0FCQz9APUBEQ0BPo6empaemqKqqqqakpqenqKioqKimpqaoq6uttba3t7e4rbJ1cHuDdmBiaWtiZWZhZGdmfYh5bHKAfXFvcXhjbW5xZo+srKurq6ysra6urK2trKyqp6WmpaWlpqioqKiopaeoqKioqKeoqampp6Wko6KioqOioKKioaKhoKChoaKjpKOjpaWlqLC0s7OzsKuqqaqztLa3trGopaOioaGipKiqqairs7Sxrq6xs7W2tra3uLi3t7e3t7e3t7a2uLe0sa6ppqerrKmnpqWkpKSkpKWnqaajoJ+enZycm5uampmZmJeXmZmZmJiZmpqampqampqbm5mYmpydnZ2dnZucoKGgoaOjoqCgoKCfnp2FdGtsaFdYU0pHTUVITUdAU1dGRz09OTM2Mzc0NTU3Mzg6Ojo6OTw9OjpBPDY9ODM3ODgzNztAPz9AQDpCRUNAQkRDQT87PEBDQkNBQDxBQ0A9TqKnpqanp6mqq6mkpaWlpaaoqKippqanqKmpqrW2tre3t7izc2h7c2JnamtpaWJhZGloXV1tfHJma3J/fHR8bm1zc36gqamrq6uqq62trKusq6mpqKWjpKampqWmp6eqqaamp6enqKinp6iop6WjpKKhoaGhn56en5+fn56foKGho6Wko6OkpKSmp6enpqWkpaampqeqraumpKKhoaChpKWlpaenpaeoqKalpaivtLa3trW1tra1tbOwrKupqa6rqKWlpqampaSkpaWlpqWkpKSkpaKhoaGgnp2bm5ucm5qamZiXmJiYmJiZmpmZmZmYmZmZmZqZmZydnJycnJybnJ+fn6ChoaKgoKCfnZ2cgHNrbmReU0pITUZETEtFRFFTQ0c9PDgzNjI4NDY0NjQ4OTg6Ozk7Pjw5PTs5PTczNTk2NTY8QD0/QD88P0JDPkJCQj89Pj5CQ0FFQD86PkVAO0+jpqWkpqeoqaelpKWlpKWnp6eoqKanp6alpqa1tba2trW2uYptcW1vfHxxZ2pmYGFsYFROW2hqbm9tgYJ9cWdxdn6aqKeoqqmpqqurrKqqqqimpaWkoqOlpqalpaWmqaqppqWjpKWmpqSjo6KioqKgoJ+fnp6cnJycnJ2dnJ2en6CioaKjo6KhoqKkpaSioqOjpKSjpKSko6Ggn6GipKanp6ipqaelpaSipKSlqK2wsKyrqqusqqmnpaWmpaWlpaalpqioqailpaWkpKSlpKOjpKOioaGhoqKgnp2cnJubm5qZmJiYmJmam5mXl5eWlpeXmJiZmpqcm5qampubm5ucnJ6goKGgnp6enpycm356bnJiXlNNSlBFRk5NQkBPRT5JOz01MzYzODM2Njc1Ojs4OTs5Oj49Ozo5OT03NjY5NjU2PkI+PkE/PT5DQT5DQ0BAO0BAQkJCRUA+Oz5FPzxQoKSjpKOjo6SkoqSlpaSlpqamp6empqalpqaltLW1tbS0tbiBaHx9ZXOCemxwdWFfY1ROT1FbaGxpbGxxbW5xbnScoqSnqKioqauqqqqqqaempaSjo6OjpKSlpqalp6ytqaShnp2eo6Shnp6foKCenJ2dnJycmpqam5ucnJubm5ydnp6foKChoJ+goaOioKGjpKSjoqSlpaWkop+go6SkpKapqainpaGdnJ+jpaipqainqKioqaempaWkpKSlpqampqampqenpaWko6Ojo6KioqGhoqKhoqOkop+enZ2cmpubmpqZmJeXmJaWlZSUlJWVl5iYmpubnJuampqam5ucm5ucnp+fnpucnJyam5p/fnF0YFtUTUdNSEZMSj8/TkM8QDs8NDM4Mzc0NzY3ODs9ODo6OTk7PTs7ODk9Nzc4OTU4OD9APT9BPjs9RD89REA/PzpAQUE/QUVAPjw8Qz88Tp2ioaKioKCipaSkpKWlpqenp6empqampaampbW1tbS0tLS3jHalsXdmc3Jvc2xjZGlYT1JRT09dgG1kYFptkZGSoqKjpaampqenqKiop6alpaSjoqGhoaKjpaempqesrKemoJ2cm6Ghnpuamp2cmZiam5qampmZmZubm5uampqampucnZ6goaCfnp+hoJ6foqOko6Omp6inqKWioKGhoaGkpaWlpKCcmZmbnqOmpqampqanpqempaOlpKWlpqiop6enpaWlpaWkpKOjo6KhoqKioqKhoaKjo6Kgn56enZybnJubmZaUlJSTk5OTk5SUlJWWl5qam5ubm5qZmZqanJ2dnZ2dnZuampqamZqXf3dvc11aTkhKTkdFRklERU5APD09PDQ1OzQ2NDY1Njc5Ozg5OTg5OTw7PDc6Ozc4ODg1ODg/Qj9BQTw+P0A8PEJAQT49QT4/Pz1CQUA6OkA8PE+doqGfoJ+dn6OkpKSlpqeoqKenp6ampqampqW1tLS0tLS0tbSXtqd1Znh2Y2xjY2VjW1JTU1JNXqCMeFhodpajnp6hoaOjo6OjpKSlpqalpKSioaGko6OjoqOlpqWmpqenpp+bmpuioJmWlpWam5mXl5iYmpqYmJqampqbm5qZmZmenZ2goqOjo6KkpKWinqGhoaKjpaampaSjoaCgn5+hoZ+goJ2amJeZmpygpKOjpKWmp6alpaOjpKSkpKWnp6ampqampaWmpKOjo6SjoqKjpKGfoKGhoKGgoaCfn56dnZyamJeVk5KSkpKSkpOTkpOUlZaZmpqbm5qampqbnZ6enp2cnJybm5qamZmZlH10bHReWk9IRUdGQkVORT9GOzo+Pzs0Njo2OTM2NDY4ODo4OTc4ODo8Ozw5Ozs6OjY3ODk5Pj9APjw9QD5AOjlAQT89QT8/QUE+QUE/Ojk9PjpQnaCfnZucnJufoqOlpaWlp6iop6ampqanpqantLS0tLOysrGwsK2rkHiGj36bmn93Yl1TUlFRTGKgootaiKCgn52YmZycnZ2eoaGgpKenpqWkoqGjp6alpaKipaampaanpqagm5mboaCXk5OSl5qcmpeXl5iampmampqam5qYmJmaoKCgoKGfoaKipKamop6gn5+goaOko6Khn56enpyanZuZmpqZmJeZnqChoaKioqKkpaWmpKSkpKKioqKkpaWlpaWlpaalpaOko6KioqGgoKGgnp+fn5+fnp+foJ+cm5qZl5WUlJSTkZCRkpKSkpKSk5SVl5iZmpmZmpqam5+fnp2cnJycmpmZmpiXl5F8cmdxXl1QRj9BRD9KT0JCRjhDRT4+OTg7Nzc0ODQ1OTo6Ozk3OTo8Ozo8PT48PDo2NzY5OD4/QT47Pz49PDg6PkFAQUE/P0FCQERBPjo4PkE8U5ycm5uampycnaGio6KjoqSmp6alpaampqSjo7KysK2rp6amp6alpqiln6iop6qnoXmEXFFST0xcnKCAYpmgnp2clZOVlpeZmp2dnqGmpqampKOioqanp6ajpaampaWmp6amop2cnqGfl5GRkJSXm52YlpaWmJuZmpqampqZl5iam6Ghn56fnpybnJ6goJ6dn56fn6Cio6SjoqCfnp2ZlpeXl5iYmZubnqKioqKioqGio6WlpKOio6SioaGhoqOkpKSko6SkpKSioqKhoqGgn5+gnp2enp2dnZ2dnp6em5mYl5WTk5SUk5KQj5GSkZKSkZKTlJaXl5iYmZqampyenZ2dnJubmpiYmpmXlZaNempmamBiTkY+P0A9SkVAQ0A7QEE8Ozs5Ojc2NTg0Njc4OT04ODs6Oz87Ojs8Ojk6Nzc2ODs7Oz08Ojo8PTw3Oz5DQkRDPz1BQ0FEQT88OkBCO1eZmJqamZmam5ucnp2foqKhoqSlpKSlpqSioJ6op6alpqWlpaemp6ampqakpaanqKehqXJOUU1KVJahenKanJyenJeVlJWWmJiXl5qeoqKhoqOkpKOjpaalpaanpqSlpqalpaOgoKGhn5mSkI+WmpmenJaXl5eZm5ycnJqamZeZm5uen52cnZyZmZqcnZydnp6fn5+hoaCgoaKgn56bl5WVlZeanZ6fn6GhoqKio6OhoaCgoJ2cnaGioqOkpKOioaSlpKOko6SjoqKioqKhoKGfn52cnZ2cnJ2dnJ2enpqXlpaVlJOTkpKSkpCRkpKSkpGSlJWWl5iYmJiam5ycnJycnJ2cm5mYmZiWlJWXi3hsY2RiZFFHQT1DO0tIRDo7Ozw+OTo6OTo3Mzc5NTo4ODg8OTg7OT09Ozo7Ojk8PDc2NDc/PDo9Ozw/Pjw7ODxBQ0FDQkI+P0NAQkFAOj9APztZmZiampqam5ubm5ydoKGhoaGhoqKioqKhn5+dpKWmpqenpaWmp6ampqWkpKalpKSkpaaGUFJQT0+PmHB6mpubnJ6cnJycm5ubmZiYm56dnp6foKOkoqGhoqKio6SkpaalpKOjoaGhnpyalZOUmJuam56amJiYmJqcnpyam5iWmZybnJycnJydmpqbnJ2dnp6dnp6fn52cnJyhoaCblpWVlZacoKGgn5+hoKKjoqOhnZuZlpaWlpicnqCip6ikoaCgoqOjoqKioKCgoJ+fn5+gnp2cm5ucnZydnJmanJuWk5KSkpKUk5KSkpKSkpOSkpKRkpSVlpeYmJiYmZqcm5qbm5ucnJqZmJiXlZWWl4d3ZGdoZGJNQ0U8RDlJSkU5Ojs9PTo6ODg6NjQ3OTU8OTY4OTc5PDs7PDo6PDs6PDw4Nzg3Pj07Pj46Qj86Ojo/QURCQ0FBQD9EQUFAPjpAPj06W5qYmZqbmpubm5uen6CgoaKioKCgn5+enp2dnKWkpaanpqWlpqakoqKio6Oko6Kjo6KnllRYVVJOZ21rgZ6am5udn6Cgn56enp6dnJ2dnJ6enp+goaCfn6CgoKGio6Ojo6OjoqGgnpuZmZiZmZmamZienpiYmZmam5qWlZeWlZicnJ2cm52dnpybnJ2cnZ6bmJqeoaGdm5udoKKhmpWVlpaZoKKgnZueoKGjop+em5eXlJKSlJeYmZ2goqenpaGgn56goaGioaCfnp2cnJubnJubmpqZmpydnJmXmZaVk5GQkJCPkZKSkpKSkZKTk5OTk5OTlJWWlpeXl5manJubnJucnJqamZeXlpaVlZSEcmZsYmRbREJMPT84RktCPEA+Pj05Ozk6PTg1ODg2Ozg1Njo4PDw7Ozw8Ozk8Oj09OTU4Nzw5PD88OkE/Ojo6QEBDQkRBQ0A/Q0FAPj08QD09Ol+al5mamJeYmpycn5+foaGhoJ+fn56foKCenZ2lpKSko6OioqOjoZ+foaGipKOio6SiradXXl1UV19ua42dmpqbnJ6dm5ucnZ+enZycnJydnZ+goKChoaGgoKGgoKGioaGioZ+enJqampqbnJqZmpuZnJ6ZlpaWl5eTjo6QlJabnJuam5udn52cnJycnJ6dlpSZnJ+in5ycnZ+hoJuXl5mZmpycnJubnZ6fnZqXlpaWlJOTlJiampqfoKGmpqWgn56fnqChoaCenJubnJybm5ybm5qZmJmZmZmXl5iVlJKQkJCQj5CSkpKSkZGTk5aYl5STkpSVlJWWlZaZmZmam52cnJyampmXlpaWlpaQgG9vZV5gV0BKSDg/N0lFP0VBPD07Ojo8Ozs3NTs4Njs3NDY6Oj47Oj0+Pj07Ozs+Ozo4Ojk5NkBBPTo8PTo6OT9BQ0JERUM+P0FBPz8+Pj89PDtgl5WXl5aVl5mbnqGhoKGioqCenp6enqCgn52bpaWjpKSioKCfoJ+dnZ+hoqOjo6OkobCjXWVkYGFua4GenJubm5ubmZianJ2enJubm5ycnJ6ipKGeoKGhoqKhoKCgoaGgn5+enJqZmpubm5ybmp2dm5manJiXlZWWkY6Nj5KYnZycm5ycnqCdnJucnJyempWVm56foZ+dnJyenp2cmpqampqampqbm5qXl5aTkpWVlpWTlZaam5qanZ6foqWjnp6fn5+en5+enZ6fnZycm5qcmpqbmpiZmJiYmJiYlZSTkZCRkJCQkZKTk5CRk5SYmZiVk5SVlZWWlZaXmZmXmZqenpyamJiXl5aWl5eYjX1ubV9lVlRFSzw3PjdSRUM+QkE4Ozw7OTg6ODY7Nzc6Njc5Oj0+Ojw8PT49PD06Pz06ODw9OTtAPj4/PT45ODs/QkNAQ0VDPT9DQj5AQD5APTw8YZWSlJWWlpeanJ6goKCgoaCgnp6enp6gn56em6WlpKOioJ+fnp2dm5mbnJydnp+gn56rmGNpbW5pZm2enZybm5ybmpmZmZqam5ucm5uam5ygo6SgnZ6en6CgoKCgn6ChoKCfnpuamZqam5ubm5ufnpyZmJqamJiYmJKOj5OXnJ2bnJ2cnJycnZycnp6dnpqVl5ygoaGfnp2eoJ+cnJuampqbmpqYmpmVk5OTkpOWl5eVlJiYmZucnJydoJ+gnp6enp+fn56en6KjpKKgnp6cm5qampuZmJmZmJeXlpWUlJORkZCQkZKTk5OSkpOUmJmYlpWUlZaWlpaWl5iYmJiXmZqamZeXl5aXlpeWl4l4dmddX1dURUU5OTs8WT5AOEI/OTs7Pjk4Ozg6Ozc5OjU4OTs9PDk9Oz0+PD0+Oz8/Ozk+PDw+Pz5AQUE9ODc7QkNFP0FFQz1AREJBQEQ7Oz47PGKWk5SUlpWUlpiYmZubnJycnZ2cnJ2en56dnJqkpKSkoJ+enpybm5qZmJiYmZucnZ6cpolla3R4bVuFop2dnJydnJqbmpqampydnZ2bmpuboKKinpucnZybnJ2enp2dnZ2fnpyampucnZycm5ycnp6cm5qanZqam5yVkZOXm52dnJ2fnZycnJycnZ6fnp+cl5idn6GhoJ6cn6CfnJubm5qbmpmZmZmZl5WWlZaYl5eXlpaYmZuenp2dn6GhoJ+fnp6fn5+dn5+hoqKhoZ+fn5yZm5qcnZuampmXlpaYl5eXlpWTkpGTlJSTlJSUlJaZmJaVlZeZmJeYl5eXl5eYl5iXl5eXlpaYl5eVl5eDeHZfW11eUT1GOjk4P1VDQTtDQzo8Pz86Ojk3Ozg4ODc0ODk8Ozw4Ozs8PTo9Pjo/QT06PTw+PkA/PUBBPjk2PERDRUBBRUU9PkVERD9COzo8OTpkl5SVlZaUlJSUlJWXmJiamZqcnJydnp6dnZybo6Oko6CenJuamZqZmJiYmZiam5ubm6WJa3F2em9lmp+enp2dnJybnZ6dnJ2enp2dnJydm5ygoJuampubmpudnJqampucnJuZmZycnJ2dnZ2dnZ2dnpybmp+fm5ydm5mZmZudnZ2dn52dn5+dnJydn5+fn5uanZ+goJ+dnJ6gnpubm5ubm5yampuamZudnJqZmJeYmJiYmp2foKCgoJ+hoaGgoJ+en5+fnp6foaKhoJ+enp+enJqam5ubmpqZlpaXmZmYmJiWlJOUlJWVk5OVlZSVlpWVlZSYmZuamZaWl5WWmJiWl5OUlJGRk4yRkJOWfXhqYWJiXFA8QDw2OENWSERCOjg7Oj47Nzc5Nj06OTk2NDc6Ozw9OTo6Oz87PT08QD47Oz46PT89PkBBP0A8NztBQ0U/P0REPj9EREM+Qj07PDs6Z5aTk5OTk5OTlJSVlpeWl5aWl5mbm5ybm5uamaOjoqCfnpuamJeYl5eXmJmYmZybm5qkgGpqb3lzcZegnp2dnJydnp6enp+enp2cnJydnp2bnJuampqam5ubmZiYmpqamZmZmJqdm5ydnZ2dnJ2cnZ2cm5qdn5ucnJubnJubnZ2dnJydnp2enZydnZ2cnJ2dm5uenp6dnZybnpubnJycnJydnJubmpmbmpmYmZmYmpmZmpyfn5+jpaKfoaKioaGfnqCgn5+fnqCioaGhn5+fn52ZmpudnZqZmJWWl5aVlZaTkpOUk5STkJCSk5GUkY+OkJGOlZabmJWYlJmXlJiRjJCPk5yTkoyFjIeDhndxZ2pkW1xRQT44NkJHYEJFR0A+Ozw7Ojg4NjU8ODo4MzQ6Njk9PTk5Ojs9Ozw6PD48Oj5AOj5APjw/QD8+PDg6Q0FEPz5CRD8+Q0VCPUJAPDw8OmeYk5KSk5OSk5SVlJWXl5aWlZaXmZmZmpqampqkoqCfn52bmpmYmJiXl5iZmJmcnZ2cqH1nZXN7enOJop+enp2dnp6enZ2enZ6enp2dnZ6cm5ybmpubm5ucm5iYmJmZmJiZmZmbnZycnZ6enp6enp6dnZybm52bnJybnJ2dnZ2dnJ2dnp+fn52cnZ2dm5qbnJmZnJ2dnZ2dm5uanJ2dnJycnp2dnZybmZeVlZeXmJqam5ubnZ6foqOhoKGhnJucm5ubnZqcmZycn6CfnZiZmZmUkpKUl5SPj4+OkYyNiYuQi4mLjpGRj4mQmJiQkoyNi5KQj5iYoqiqpqWlrKOmoZqep6eyqKKVo6Cfl39wcWlsXFtcTUY8NzdHR1g+SE5URjk+Ojg5ODc1PTk4NzMzOTY6Pjw6Nzo8Ozo6Ojo8PDs/PjtAQD47PT5BPDw2N0A+QkA+QUY+PEFEQT1DQj49PDlmmJSTk5OTkpOUlZOVl5iYmJaXl5iZmZqampqaoqGfnp2cm5mYmJiYmJiYmZmZm5ybnKx/am16f3lxh6Genp2cnZ6enp6enp6dnp2dnZ6enJubnJubm5ubm5uZmJiYmJiYmJmZnJ2dnJyenp6enp+fnp6dnp6dnJydnJ2dnZ6fnZ2fn56goJ+enZ2dnZybnJ2em5qbm52enZ6dm5ubnJ2cnp2cnZqYl5SRjo+QkJGVmJSWlJiZmpudmJuYlY2Mjo6TkpKRj4mQjpGRjo+Ki42NjYiIi4+Lg42NkY+MkI2Qk5WVnJihoJySn6SipKmam5eanKOprb3Bwbq8uL26ucC8ubq3uru7tL2zwbV/bnVmZ1peWUxJRTo7TElTPFZSSUM6QTo7Ozc3NTo6OjgyNTY4Oz08OTk7Ozw5Nzo4Ojw6PT85PD8+PDw9QTs5NTg8O0A/QT9EPTxBQkA8REM9PT06YZOTkZCUlJOTk5OTlJeYlpeZmJmYmZqbmpqamp+gnp+fnJqZmpqampmYl5iZmZmZmZmphXB1e4B3b4mhnp6enp6fn56en56fn56dnp6fnp2dnJ2cm5ubm5ubmpiYmJiZmZiam52cnJ2dnp2dnp6goJ+enZ6hoJ6dnp2enZ6fn56en6CenZ6enJydnZ2cm5qYnJuVmJqamJiYmJmSjJCXlKCXk4+MjYqKiImMiJORh5CPjYqKkJCLjoqMi4+IiImJjpGOjYaFiYaKhoWLiI+SkJCNkJKXlpKamJ2TlJ6kpqaqq7Gsr6+rpquqsbm5tbS0rqyvtMDIxcXBvsbDxMTDurW+t7a0s7C2tb6qcHRyXGZfXV1JRj8/RUtMVklcTEQ/PUI6Qzk5Nzc7OTk3MTc5ODo+ODg6PDw7OTc5OTs9Oj4/OT5BPDs+PD46OTY5PDpBPkNBQT08QkBAPkJEPj8+OVyHhIOHi42KiYaFgYqMkZOVmJiHlZaWkpiampmenZ+gn52ampubm5ycm5iWmJmXl5ibqo56dXZ7f3mCoJ+fnp+goKCfn5+foKCfnp2dnp+enp2dnJqam5ubm5uYmJiXl5iZm5ucnJydnp6enpybm52dnZycoaGfnZ6dnZ2dnp2dnJiWlpaYlZWSlpmWk5GKjI+PjI+NkIuLj4+WiYiEi5GZjn2Fi42PjYyHioyQm4yRj4+Lio6TjIyNjIiSi4yFiYyPhouIh42KhYyEj4qXkJOYmpWbnKOqoaKknKKrsbe0ubWxs62vsrKlp7O6sbq6vLa3tsDDw729vLa/urq8wbW4wL60r66mqa+3mm58Z1tjWl1fSEU+QUtJU1hZXkFGOTk9OUY/Pzo3Ozs7NjM6Nzo5Pjg6Ojw9OTk4Ozk7PDo+PTtAQDs8QjxAOjg0Nzw7Qj9BQj4+O0NEREBDQz0+PjlhmZWLkYWNj5aSiHl9e3+Fi4OKgoqJhmuAeJCLlpqRnZ2UlJGTlpeampiWk42Sk5KQm5uIdndzcX1/cpGgnZubm5yenZ2eoKGgm5uWlpucmpybnJuYmZqYmJmampqWi5CTlpmYlZiYlpucl5WSkY2SkZCUk5KXm5mYm5ePjpCLjo2Ch4uLi4qLiI2RjIeHhoqIiZGKh4yEhYqNi4qNhI+UkIyDkJOUmZWQi5OTkZWRlpWOj5GMlI2Oj4qIj4ePhoeJiYmNiomJioWNh46JmJKUmpuXmKChp6Cko5qqqbO2sbWwqKmiqK6tn6qvsK21ubi8wr/BxLixtbCutrOwuL68ury+urOzp7G3wpB1gGNiXlpXUk1IRkVQSVlXX1tDUDpCQz1HRj84Nzo6NzU1OTc8OTw5ODo9Pjo6Nzs7Pjs7PTs9P0E7Pz48Pzo4NDM3OkFBQEI+PjpDREM/QUM7PT45Z6mloqKZn6CippeUiI2CiIJ1h4iKiIp7e3Z7enmPeoiSfn18en6CkYWBgH1zfH99fISHfnRweHZzfHaBj4iIiYeIioyMkZicl4iOhIuNi4iNkI+Pi5GPi4yOj5CQjouFhYeLjIyHiIuOi4eMhYaBjYuGiop/iYqGiJiRiIOIg4KFfIuLjIaJi4iKkIyIi42PjI+Wh4mLio6NjY2Wk5OdnJyalpycm56bmpuYnZeTkZWWkJKRi4+LlpSMjYqDi4SEiYyQkIqOio2LipGJjZOTk5SVk5KcmZ6Xn6CfpaKvsamupKSfmKStpqa4t6ysu729wsPAv7+vpa2wsLS3uLO0uLa0ta6stK+4tLaBeXpjZmBeVlBRQUVMT0lcXl9UR0dCS0xCREA9ODg7OTU3Nzk3Ozc9PDk9Pj05Ozg6O0A8Oj06PkJBOD88Oj84NjQyOTtCQD9CPj04QEI/PkBEO0A+N2CloJqXnaGaoaCPl5efl5WCjaCfo6GdmpKOjIxycXBvdnFucG1ucHZub29waHBxcHR+c3FycXd7cnl2d3Jyd3Z6e3l8fXt/iIGEi3+PkYaNi4uGiouLiYaEgYaCgIKJkYOAg4x/ho+LiYWAh32AgZKQhoSEho2DhIyPj4+IjY+Hi4iRkJWRjpCKk5eOj5WYp6SfnZWYlpaln5udq6aqt7W4srGnr6qnpqGfmp2WkpWVkYqPjImTjZuVjYuLhoaJjJWQkJCLmZKVlZSbkJiTlIyNkYyWl5WilZ6mqauno6OqsJucpp+mq6G0vb6zs7+5u7u6uby9rqiusa6wuLyztLGxqrCpqLGxsqild3J0X2hhYFRWUUlKSFZNXl5eVExKRVFKRUdDPTo5OTc0ODY4Mzg4PTo9PD47OTs4Ojs/PDw+OT9DPzg7Ojg8Nzc2Mzc5RT4/Qz89N0BAQT0/RDw+PThUj4yGh4eUjJWZl5yWmZaNlZyWlZydoKCdmpiWeHFubXJ4cXFsbnJwa3FvcG1yc3t1dnd5fnVxeHZ0d3tybn98gX15eH1/eYOGg4WCg5CLkIuLi42Pi4mJhYKBfX9zfYiAfpyQhIWFiYuPinp9fYaOjYqGjZSRi5CXj5SXkpihlp6XlZunpp+goKawq6GjpbW0sqqmqq+isba5vcK7ucO+vLi9uLWxrLCspZuSk5mfm5SPk5WOmp2doJqfn5edo6qsoZ+em62hp6qwqaampJiRkZWUo6SirKSss7Szs6i3tru4sLKvra2yt7a6srW6s7e5u7i8urayr6yxsbKztLOxsa2us7Gzs6yhl3Zxc19jXlJRVE1PSUdYT1pcZFROR1VPRURKRD44Ojg3NTg4ODU5Nzo6PTw/Ojg8ODk5PTs9PTpCPj84Ozo5Ojk4NjI1N0I+P0RAQDY+P0I/PEM8PT46Tn98go6MjJOTl5eaj5SWjZaRkZSXk5qanqGdnHJvcnFxcXFxcG5zcW91dHJxdneAdXd8eYV+d3t8eX1/fICJiYmDfXp/h4GIiYGAgIGGiIGGi4aIhYSIiImEf4J/enx8fX6SkH+IeIGFi4qDhIWKj4yNkZmdlJSUoJqan6Ktsa2ppKWtr6ysrLWuvrmtrqm1sLexq7G2rK+9wsLAvrq8trKutraxtK66u7OurKepp6unoqmtoKmooq+wuLSxvLq6urK0ta+8tLezt7e7t7mtrbCprLW5sbeytLe2sLu7vLu6ury1vLi0wbWsqqqrtLG3uLm1trSzsKymrrCqq7Cxq6yusLKxtK6qo5N4dnJlZ1tMUlBGTUhTV1JlXmdUUExcUUhMUkNBOTk3OTU4ODY2Ozc5Ojs6Pjk4Ozo6Ojw8Pj08RD45Njs7ODg+OTUxNTZCRkREP0A3Pj5DPjpBP0BAO0t/gomXmJSdlpabmIuSlo6XkZGVl5SZl5+bmZx8dHV2dXl1c3RudnJzdHV2d319gX56gXyDfoJ/fYB/hIKFj52RiYF/go+Xjo6HgoCBiIuFfoqQi3+HjYyLioeSioeGjZGTkZGEh319g4iMjouOiomQj46PlJSYkZWbmp2dqK6yr6+1tLOtsrW4sLy1tbGqsKqztbS7t7SztrS1r7i4t62noqassLCvtre3vrW5vLOysa61u7C0r6+yu7axuMC9tLS0s7izvLq2tLrAvbm6ubq+ubm5vrWysa+yr6q1tLGzsbSzrri4tb+vpKaoo6ussa+zrq6wsKytq6qroqKmqKKnrauqpaynoqeYeHlxZmVZT09NSVJNV0xPX15cTlVUYlFEVE07Pzk8ODk1Nzc1Nzk1Ojo6OTs4Ojw8Oj08Pj4/P0I9ODY6Ojk6QDs1MjY2QUZDQz4/Nz49Q0I5P0I/PjtLjpGTmJmVmZGTopiTkpKLk4uOkI+Vl5ablZSbhoJ9enh2dHRzdH53end2gIKDhouMhISFioaQiYeRk5aRjZaalY+IjI+emJaVkpCTl5qamJCdoJ2Tl5qgmZ2bo6CVkJugpKOak42IiIuJkZGOkY6LmJqPj4yUmpecnJufnKSstLm6vK+2tLi0tLK3uLmzq6+qqKy1srK1rrGrrqa3s7OxpaGotbCvrayrtbqyu7q6tLK3ur67ubG4sLmtqLK4u66ttLS3tbu2trm5vLe0r7G0t7a5s7e1pq2pq6ior6yprq2up6KxtLG0q6aop6Cjq66oqq6orLKwr6+pqKGeoaGjpqOgopqlo56ol3J3bmdiVUtUT09KQ1BLX2JYWlFcU19NSFJJQUA5Ojg2Njc3NTg5NDs5Ozk8Nzs+Ojg8PD0/QkBBPTs2OTk5Oj87NjM3OD5GQkJAQjk+PUBDPkBGQj44R5OWkZWTkpSQkZ+ZnZmVkI+Sko6Mk5aWko6RlZGSkIaBeXJzdXuBhI6HhZGTkpicnJiVkJWYo5yaoaeqqZ+clpeVnaKioZyZnpmlqKyvramnqqmop6GlqKirqamvoZufoaOjoJqfoJyUjZiUmKCgoaSem5qkp6Spq66spaOoq6+xtK6qrK6zr6ystLO0ua6urayqrLKwsK2wqKqmsrS0uK6qtrqwr6qurLC3s7i0t7W0u7y4tbWxtauyrKiys7uvrbGytLa1sbG0s7OvrKuvs7a0sayutKqqpqWnrauoqKupqqifqbOwqqeppaOio7CtqaatpairrayppaSioKWipaOYmZyVnqKippdudWVnZFZPWEtLSktTVHBiWWRXX1tcUlpQTEM8ODk6Njk4NzQ3NzQ4Ojw6PDg6PTk3PDw7PkM/QT47OTo5Ojs+PTg0NThBREVEQkM5PjtAPkI/R0Q+N0KSm5SVlZaVj46Wl5qZlZGKk5SSjo+SkYqKiY2Ul5qTjYmCho6VkZSfmpuin5+jnqGhn5ijpKelpaapqa2rqaKmpKilpKGfnqOjra2srairrq6qqqukoaKlqaenqaijopybm6SgpaijoJidmZ+hoqmnoKKirqyrqqetrqilpKmpqammo6iqqaekp66wr7Ovq7Crqq+yr7Czua+rqLCxrrCyubO0r62vtbCss7GurLW1tLSzs7CvrKyqrKusr7G0s7CwrrCwsKyqrauqq6alrrCysKumqbCvqaOkqaunqKaopquwq6mvqaaoqaalo6iwraqpqKKpo6WnpKGhoKKloZ2el5aYlJugpKmUbnNeamlfVVpOUk5QT1JkXGVjW11ZXFBZT0tAPDs5Ojc6ODczNTMzODo9OTo4OTo5Oj08PEBEPkA9OTo8PDw+Oz45NTo8QkFFQUNBOT47P0BEQENCQDdAkZ6YlJeZlpGHi5SSl5GIg4mLk4+OkI2Hh4SFlZmWmJeZlpqeop2anKKkoaCdn5qfoKGgpqGgoKCjo6KlqKmrramqpqOmpaCloKaopqWnqKapqKOnppmcpKWioaChoaCcmJmfoKGkpKKenpagm5qioqChn6CiqKCcn6GloaCmo6KfpKGspp6foaGkrKqnrKivq6e0sa6ur7WyrKqwq6mtrbWwrq6srreup6yqpKivsq+sq7Kvqqqpq6utqa6urrGxraqtqaunp6uoqauinaapqKilqKisqKilpKWop6iopqmsr6+oq6mhoqKlo6Opq6ymqKWjqKKhoKSdnZ+hoZ2bnZ+amZWcnKOqlG9zZm5yZF1dUFVPV09eZGRsaGJiWlpSVE9NQTo9Ojo4Ozk1MTYzMjg4Ozk5OTk7OTk8Oz0/Qz5APTk7Ojs8QD0+PDk5PEFBRUFGQTo9Oz9BQUJBRUI4PYqWlJOYmpaPiISNjpGSjIiIiI+JiZCRjoqKiJubmZygpaKlnqKjoZqeoZyanZ6bnKOop6ugoKOYoJ2XnKGjo6WjoqKkrKilqaCepqmnq6mkn6Kgoqahpq2mpp2fn5+fn5manJyhoKGkn6GbnZqcoJ6hn56eoKOZlpqYo6KipJ+ZnKGhoqCbmp6goaSgnaejqrGorqusqaSqqquorKalrKqws6+rq6mwq6appaWoq6ynpqevq6Wnq6upq6irqqqrrailqKOmpaesqayoopykoaOmo6qpqKano6SnqKanqKepqKupoaKoo5yepqWjqKino6WlpqmgpJ6inpeYnZ+doqKlnpiUlZ6go5d1d2t2d2FfXFVZUVVWW2Necl9oX2NTUVlUSD48PTg7OTo4NTM3MzM0Nzo4OT05Ozo5PDxBQEM9PT44Ozw9PEA/Qz86ODo+P0NAREE6Oz48QD9DQ0VDOTyCmJmenZ2alZKKiZGRl5GQh4SJgoGNj4+Sj42cnZ+hpKmlqaeorK2moqKfmKSmo6Stsa6yp6asm56em5qjp6Cfo5+foq+rqqyoqKuwqaipqKGfoKeprbCyr6yjoqahqaWepKOipqClpKKlo56doJ6fpaKinp+imJWemp6fpKGblZigoZ2enJudnZuZmZWen6Oonp2iqKGaoaOmoqSoqaqoq7CxqKWlp6eopKWpqaqnoqWmqKadnqWloqClpaOlpqCjpaOjpaelqamqpKekpqKmp6SrqaenpKGlqKynpqWlo6OopJWdo5+bnaCjqaeopqGjo6mooKiioJyVkZqfoKGmopuXkpCamqCVfHdvfXlmW1tgX1pcVlxoZG9jbmloYl5QUEA/Ozo4OTg8OzYzNDMzMzc5OTs8OTs7OT49QkBAPTs9ODw9QD08PENBPjo4PT9EP0M+Ojk/PEI/P0FEQjk6gJ6kp6Kem5+gmY+ZnaCWloqGj4iEi4qTl5SRo6Wnqq6trLOys7S4t62pqqevtLKxqq6usbKusa2lq7OssbGpq6+rq6y2sLSwq7GysaOfoqqpp663trS0trOvrKuuq7awqbKxra6npp6io6ObnZyXoqiloZ+eo5ueoZqWnaScm5aZoqefoJ+joJuUlpmWl5qfoJmVnqKZmJ2dpZ2gpKeqqaiqraylqaSlqaeqqaqsp6SkpKOimZmhnpqaoaCfpaWYnqSmpKqooqelpaGqp6mnp6ejqKWmpaGkqKesoqekoaalpaOVl52Ym5mVo6elpaSfnZ2lo6Kqo5+amZiXnJyaoaGakJOTl5ibjX93cnZ4aWJbX15cYllgZG5ta25hX2RgUE9BQDs7OTs4Ojk2MTQzNjQ3Nzc6PTo8Ozk9PUI/Pj89PDo/OTo7PD5BRUA9OTtAQT5DPDs5PzlAQEBAQkM7OXuao6OcoJ2dop2Zn6KioJibmJaYkpSQm5qWl7S0rrW4s7S4tre0uLm3tbm4ub28uKqLnLK4vLS9urW7uru4s7q/uLe5u7G3r6iusq2inJ+qsri8vL27ur+0r7GztbS3t6+1tLWysKikop+gl5Wal6SqpqahpKOkq6WlmKGko52goaKooaOgpaGck5mYmJmco56cmpudl5uZlqWam5+hqKmpqKuvr66pqKmrrKytq6irp6WjoJyfo6Ojn6Cipammmpyip6Spn6GjoqKgpaanpqSooJ+ipKGjoqiop6OloKGopqalo5mbmJuTj6GknqKfmJiVoJuhpaCfm5udnJuamZugmo2YmZiTkYaAdnh5eGNbUllUX19hbGh1a3BnaWliWVNMQDw6Ozg5Nzk3NTU2Mjg1Njc3Ojw7Ozs7QD4/QD0+Pjk6PDk2Nz47QkZCPDg7P0NDRDw+OT43PkFCP0ZDOzhwkpqblJ6bm52Vl52doqajopaXnpaXl6GblJi+t7G4uba3t7i7l5S2vbu9vcDFtaK7mKC3v7+6wcm0nbu2sra/xcGooLazurGqrrSxsLG0tLa8vL68vL3Guri3ur20r7Wxsbq4t7Kzsqqmpp+YpKSnqKSupKurtbWus6CnqqynqqmlpqCnoKGmoZOWmJ2foqSjnZ6coaChnZekmpmdoKaqqqqtrq2tsLGrrK2sqamrrqimpaalpqSkpqaeo6eppKGcoKKjpqCio5+jpJ2foqWgpJyboZ6fo6GhpaSlqaOkpaKkp6ehn52elpOcoJiZko+MjJeWn5uWnJqdnJqTlpSUmJOQmp2YiouHgIB8gnhhXllTYWhgZnNvc2l0ZGlkYltMSz46ODg5ODg5NzM0NTI1NDY2OTw8Oz08P0E/QEA9Pj44OTs4Njc/OUJFQzw7PD5DREM9QDs9Nz1DQ0BFQjw3Z4yRk4qalZiblZWYm6Knq6aVl5iQlZmhnpeXvrWztLu6ubi5woeYt6u4u8DCxbOjw6e4s72/tMTHvbS7uL62wMTErqCworW2tb2+wcPGw8O5vb/AwL2/xL28ur2+tKeqmLHAvbi1ucCzr6+qqqitp6ekr6eqtLyxtLWor7Gwr6yqoqajrJ+fpquXmqifpaWfoJydoKuwsKyiq5yYm6Cor7Kys6uorre1sq2tqaalqKulpaStqaShn6Cnnp6mqKmmnp+anqGlpqmcnaObl6KmmpuanZ+cmqGcmZ2eoKijn6GfnaWioKOioZSZmpmTj4qLhI2Qk5uPjpiVm5eYkJORkomNl5iYk4uKi32AgIVwYGFeXmpiYm53dXZubFtiUVVcTUc7PDk3OTc5Ojc0NDQxNDM3Njg8Ozs8PEBAPUA/Pj8+Ojo5Ojc6Pz5FRUU8PT1AQkJCQUI7PDhAQ0NARD87NV+MjIaFlouUlZeYl5ifpqellpWWkZebn5ual7mxtrO5vLy5urWqsryxvsG0vMe5uLuuv6fGw7/KxsnIxcXJvMLHx7+xsae8vL7FxMbJx8XGu8TAxcbAua+9vMC+vrOrqoyzu760tbfCuq2vsLWqq6aqo62kp7G2q7WyrbOtqK6vp6awr7Ktqq+zpKu1qaeopKCgnqmyuL61tbWqqaausre4t7apq7i8ubexr66noqOop6SfqKOfnqCZoZydoqSnp6GelJuaoKGlnqChnpajnZSQlpiboZqflpORlpSin5qenJudoZ6kn56VnJiPkpOPjImTkJefiZCWkZuUmJGRlZaDjJWXlpKLjIh8f4N/amZoYWtsZm51cXJ1cWZeX1xSSUU/Ojo6Nzg0ODw3NjU0MjMzNjU3PDo7PDs9QD4/QD48PTk5OTs6PDw+QkRFPj49QENDQkREOzo4QUJCQUNAOTJbk4iEjZGKi5GRlZCSmp2fnJOSmJSdnZqXmpW2sbm1tb6+tri1uLO8vMTEusPHwb+0s8XFxr/CzcfLzszLx8HDxsfIysXExcO7vLzBxcHFxb/DwsbFwLGTvrq/w8K2trqptLO0qauzu7uxn5uxr6ykrK60p6qpqKqtrKmlpZ6pr6uyu7q4u7e5t7O5uLOurLO0qrC1ub3Bur6+vL60urm4u7qysbS8u7q7s7Oyp6Smq6uioaCdmpudmpyXmpuenJygnZaclpuZnZ6io52UnJCNiY6OkZ6bnJWNh5KLmJiWmpybmJybnp6cmp6UjpiYmpSRmZeeoZWYmpKXlJWRlJqYk4+TnZaSi5F+enx/dGtrbmRvbGhxeG95aWlhXGdhUUZEQTw5OTc2NDQ6ODQ2NTMzMjY1Nj05OTs7PT47Pj49Oz05OTs7Oz89QUNBQkFAPEBDQ0NFQjs4OUQ/P0BCPzsyV5uQkZCQh4WSjo2IjZCTlZGPjZSUm5STlpqRs7e4uLi+u7C1sri2tbbAw8G+w8LAvru+u7u8xMzEzNDLxsa/xcfLyNTLysjGv7u7vsS+xcjGxsTEw7i0wLe0vMHCucK3t7/Au66lrre8t62co7ewpq20tayupaWjqKSgoKWZqrOyvsG+urm6uLW0srG0tLO6wL7Av769u7u9vsDCt7a3tru7sru+ubi3u7a3tKyoqamrpqijnpOampyYkZKZl5GRmJqXnpiWk5acm5+elJOJiX6GiIuWlJiZkYmVkZeWlZmbmpaYl5idnpyhmJWZmZyYl5ybn56jnJ6WmJeTl5yZmZyUlp2UlpOJdnl6e3Zua2hndVpmcndzeGZnXWRbUlhJRj87Nzg4NzYxNjk3NDQzMzM2NDY7ODo8Oz08OD0+PDo7PDs9Ozs+PkRBQURCQEBBQkNDREM9OTlCQD8/QD89MkyWmpaSk4yKmJCKi4yOkpKKiIaNkJiKj5CUl7O7tba/vb2xtrjBvby0uL/Bsbi3vsHFvbu8wsbJv8nOyMHEwcfKysbKxczIzcbIxb/DwMvNz8nGw8PEwsS+uL7Bw8DEvsHPz87Gq6+2tLWroKe0s66ruLWzq6mjoq2prKatn6y1tL/Cvrm4vbawrausr7W0ur7Fv7u8urO5u7i5ubWtsLS9u7G/vLiytrmzubu0ra2orKyqqaeXnpualY2MmJSTi5WWlJyZl5WWmZKYn5mQiop+iYqKkY6Vl5OUn5mWkJSZmJmWmJOUm6GeoZiYmp2ZmZaenpibopqdnJuYmpuZlpeXlpyZlJyYfoB4eXV1ZWVpamhdam9teHdjYmBgXlhXRkU4Ojg6OTc5NDQ5NzY2NTEyMzM0Ozo9Pzs9PTo6PTs8Pjo7Pz48QkBDQkJFQj0/Q0NDQ0RFQDk6QkFBQj5CQTVCkJeUlZmSj5qQjpKRjZSVi4qHjI2UiImPkpq2u7S8xsHEwr3BxcLAtLO9v6ywr7rDysPCvs3IxbfByMW/wcLIy8rCwsTJzM3Pz8zDx8bIyMjHycfFycfIx7/Fx8TEx8jK0s/SzLy4trS4uMG+vrq9ury6vKytpqm7urm3wLK1uLLAxrq3t8Gzsa2tqau1s7u2w7a2vbWxt762s7e4sLW2v7uwvbq0q7CxsbO8urOzrqutq62xnaOjoJqQjpiXlZCclpaYlpWSnJmTm5+clpGUjpWQiYyQlZOUm56YmZKSnJedlJmSk5aZmJ2VnJ6do5yVnZ+TnKKcnKCfnaOemJSVl5ebmpmgkH99cXRxb2JhZ3VnaWl0bXhsXWRbVWBZTEhDNjw5OTg4OjUzOjY2NDQxMzUyNTs6PD47Ozw9PDs8PTw7PD49P0E/RUFCQ0M+QEFARUVERUE7Nz5DQkI+Q0I4O4+akZaalJKUjZCUlI6VlI6Pi4yJk4uIkJObt8C6xsXEw8zCwcS9vrWvt7uvr7O6wMfFxMHMy8W2ucDCwsTHytHLwsPExsnFzdDOx8zJwsHGwcvLx8bMyc3FxsbDxsXJzdDNz8zHxMDDwsnNx8XBxMfBu760sbCwwb6/wca/vri3w8K6urbAvrWyrKmvsri+tMC0tLi0t7nEua+8vrm+v8K/tbq2q6qsrq+wt768trSura2utaSlqKimmpycnZyeopydmZOQkp2VmKCdmJiVmZmZl46MlH2QkJefmZmYk5GToI6Nko+VjpCUlaKdnKSem56elpyjoKGipKOkop6amZubnJ2enIN9cnx4cGdgamp2bGlldG5zYlxiVFdUU01HOjc7OTk3Nzo3NDg3ODQ1MjM0MjU7Ojk+Oj08Pz04Oz05OTk9PEBBQEVCQUJBQT9AP0RFREVAPDo+QkNCQENBOjSAoZeUmZiVkImUk5aTiZGMlJGOiJaKi5CXnMXLw8O8wMPHwbm9vbu4tre3rrK3uLzAwsDCx8bHurzAwsXHyMbSycHDxL+/vsTLyMrLyLy7yMfJzcjDyMnJxsXDwsHCx8fJysfMyMfIzcbLz8W3wMDAwLu7vbWzs7+/ub/DucC3u8G8uri7ub27srCvsKy5wri9ube1t7q9xb24xsjCwcLGwr28tamurrCwr7O6t7m2sK+tr7OppquprqannqSlo6OjoqCblZiekZecl5GRlZeZlZmRlJiSlYyYo5qcnp2FiZ+TfJKWlZKUlJennaCipJ+en56foaGkoqKjoaOinJ2fnqOhppl5enl/cm9mZWdjamRham1ubl5YXFZVTlBKRjk5Ozk3Njc3NjM3ODk1NjEzNTI3PDs8QDs/PDw6ODo8OTk4Pj1APz9GP0JBQz89QT5ARENDQTw5PENBQ0RBQDozbKKdlZedlo+PmJiZmIiSjZGVkI+Vjo6TlpbKy7u5urnBu7q3vsG8vLu5sa61uri4u8S6vsC+vru8wMXCxsK+xsG5u8O6uLm8vsHGwca6ucnJw8XEwMTBwsHEwcO+vcLAwMHCy8PGzMvFyNHCsL69uLq7vL63tLC5vrO8vrG5tbi7tryztbm2uba5t7GtusG6vMG/t77Ev8bDw8fHwrvAwr/Cv7iys7O1tLGut7S3tbSxrK2xp6Wlp7CtqJ+nq6ajqKWmpqCgn5SYmZSRkZWUl5OYl5qhnZ6hnKGdoaWglpSbkZeXmJqTnpmZqaSlpKWdoqCanqCkoqOcoqGjoJ6cnp6ppaiVfXuDeG5mYWRiYWJjY2piZmNaWVlcWVFORT07OTo7Nzc5OTY0OTk6NTMxNDUyNzo7OkA9Pzw8OTc3Ozo5Ojw+QD8+RDxCQURAPz49QkRCQkI+OjlCP0FCPT44NVmfnJiTmZaRlZiYmpeQkZCQk5GTlJKSkpSUxce4tbq5wrm5vMPFwri7ubGxtry6tbnAu7u5tre0tLW/u72/ub26urS/uLW3s6+7vLfAt73Cv8G7v8G8u8W+u8HEwL6+uLzBwcu+vcnEwMDKwLHBv7u4u765tbe0uLy0vbi1tLCzvLG3tri/tr25vb65t7q+u7/Axb29y8PGw8TAw762ubq2v7i7v7y4trOyq7CwsrWzs66sq6emnqeurauiqKumpqqjp6iqo5+Ym52bmpicnJiXnJuhpZ2anqGhoKGmoJqbnJiboJ+dnJ+coKiho6SknaKfmqKgop+el6Shop+dmpieqKWhi3x5h31xY2BiYmdqZmZpZWldVlVTWU9TS0U4PzY7Ojc3OTs2NTo7PDYzMTM0MTc7OTg/PT47PDs3Njk5ODo7PUA/PkA9PT9CPjxAQUNDQT9DPTo2PEBBQDw9ODdJlJibj5OUkZWYlZGWkpWRkJGUlZSTkpKYlcHCwLq8ub62uL7EwMKxvbqytLO4vLW3vMC8vbS0sbC1t7W6wbi+uL+8vbe1t7CuuLa5v7vAv7fBvLvDtrrIuLa5u725ura7xcXKvbnFwL+8wb64xr3BwLzFuLa3tLi2tru7uLa0t7q1tLi8vbm/ucPAwLu5vLu+vcjEvcfEw7rAvb62sra4srm0usLCureysaysq62yr7Kur6ijpJ6rrKyqpKakpKiqoqemraihoaGmn6Oiop6bnKKfoKOdnJuhn6KgpKCem5eZn6GdnZ6eoaWkoaKioZ6ho5yinqCZnZijn52eoJqZoKKmnYR6g4B4cG1lZWZvaWVrZ1hYTktLS1JJTEhDOT44PTs2Ojs5Njc8ODk4NjA0MzE3OTk7Pz0+Ojw6ODg5PDg6Ozs7PD1BPj09Q0E8P0NDREA/Pzw6Nz5CREE/QDg4P4mYmoyMkI+Tl5WMkpCakpGXmJaUlJKQmpTDvsbBwby8uLi6v7a8scK2tLyxtLa4s7q9v728sq2vrLGwt7y2u7zAxLm3t7e1urm6u8C9w8C6xMK+x7i5uK23tbi6tLezu8XGy8G7xsDAv728v8nDxMW+xri1srK9uLi4vrq6uby6urS3u7q5v7zEwL+5uri/ubvFxr3Fw8Kyur27sa+2uLO3s7q+wLm2rLGrrqmqqa2qqq6mpKWnrq2ppaOio6GkpaWmoqato6Klo5+ho6Gcmpyhn6CloaCenZygnaWgnpeVmZ2fn52gn6KmpaCknpybn6Ofn5mcmZ2epJyWnKOcnqGcppZ+f4Z8a25wZ3Brc2VibV9cVEhLSkRKQkNHPzk7OD08Nzs7OTc4Ozc8PDYyNzUxNjk8PD08QTs8Ojs6OT45Ojs9PUA+RD89PkRAPz9BRkQ/Pzw9OTc/QUNCQEI5Ojl3nJiLh4uQkpOWjY+TmpOQnZiSkY6QjpiSvbfHvsO+vbu+vL22uri9ure9s7OwuLi1uby8wLeqraSusLe7s72/u8S3tri2t7+/xLzCxcXHx8rJxs/CwbiutbW8vri7sr7ExMrFwcnDwr+/vr3HzMfHxMe9tbW2wb26u7/CusDCv7y2t729vcHBwL+8ube8wru3v8W7wr++tbe8vK+vt7awtLO6ubq7r6mtq62rrKaqoqeuqKWqra2vp6Sgn6ajnqKjqKOjq6Oiop6dm5ublJaZnJyfpZ6fnpmYnpejoJyXmZqZmqOjop6jo6egpqCbnaCjnp2WoJmcoKCblJegn6WcmKKQgYaBcWVsaW50bndjZ2JcY1FLVEhFRUNHQzw7OTg9Ojc6PTo4OTs3PD01MzY1MDY4OTo8O0A9PDo+PDk+OTk9Pjs/PkM8Pz5APz0/P0ZEQEE/Pjo3P0BDQz9BPTo4ZqGYj4uNlZKVlY6PlpmVl5uVjoyMjY+bk7m2wbS/vLm8w8C+wLq1trKywLmvsry8sLe7tru8q6qjsLm9vrO8vrzFuLK4ub3HycrDx8jGxsnIzM7RzMrFtbrAw8i/v7W/wL/Gxr/LxsO/wbzAw8zKx8XGwbm9vMS/wL/CyL3Hx8XFvLrEv7vBv7rAvLu7wMS9t7nCub69t7S2uLqur7WxsLCytre0t6yurKqsrKuoq6Gms6qlra+trKippaOkp5+io6Onoaeiop6cnZyamYyQlpeZnaKZnpuVkp2UoaCdmZ6fmJimpqKfoqKmoqeloqCko6GbnaCbnKKfl5WVnp6kmpafiYGDgXRvbGx0a2xuX2JeYWFOSE0/RUA/REM7Ozo6Ozo4Ozw6OTw+OTo+NDQ1NTE5OTo5PDtAPD89PTw4PDs6PDs7Pz5DPkI+QD89Pz9FRUJBQj87Nj9CRUQ9QUE6OlmfmJOSlZqVmpOQlpeclZuZlpSVkZKTnZm2uLaxuru6vsG5uca7trWypb69tLbBv66zvbS4wbGwsbS8w7y6ur68xL+3vb+9x8zGx8nGxr/ExMrIzMzNy8bCw8vOwry5vbq5wMO/yMbEwcG/xcDKycPDw8O5w769ub+8wsbCyc7Hxr66xr26v7m3wLm5vsDCvrW0vLi2u7CvsrK1r7Cvrqyus7CzsrirsbKxqrCrq6yrrLatqKyusqarrKmpoaWgpaakrKSmoaChnqGgnaCMlJeTm5+mmZ6emZOYnZ+gnp2eopuYp62ooqSgoKKqpqmhqKGlm6CgnZ2jn5SYmKKdp6Gfm4J7eod6bW13e19wY1tdX15TST5DRUlCQz5DOz42OTo7Ozs7Ozs7PT05PTU2NjIxODo5Ozs6QTs/PDw+Nzs8Ozw9PTw9Pz5BQUE+PkFCQUVDQkRAPDY+Q0RFPkJEPztTmZuZmJ6dmqCalpyZn5KdlZ2boJWWlJqYur20sLu8wcTCv8XGura5sqO7vbS3xLuwtbq2ucS4tLy2ur3BvLu/tr/Bv7y/usDLwsfIwL+8vL/FwsfLyMHDwMDJysLAu7uwtLu9wMXGxcW/wMK/y8fCwMjAusK7urO6usG+wMrOysS9tby8ub+5ubW1s7/Avre0s7S4rbeqr7CwsrGvq6+nr7ausrG5rra2uLSzsLGttrS6sa6srranrLKsraSjoaenqLKrqqWkp6elpaCml5ujn6SmraKeo6KanaWiop+foaWenrC0sKSlnp+kqaevp6mgq6CiopqipJ2anqGmp6+psZWCe32Cem1zeHNncF1bXl1ZUUVEQ01JQUU9Rzo6NTk7Ojw8Ojs7Oz0/Oj01NDUxMjc4ODs8O0I8Pz46OzY6PTo7Pj0/QD87QUFBPj4/QkBBQkJFPjo1OkFCST9AQkA7TJqdnZ6fnZienZmampySoJWbnp+blZGRlsW+urbDvMbCvr/Ixbe1uLe2ubu0r7e2srWzt7m8u7a7u726w7u3vbe5wLu6uLi1xcHDw7u5s7S6wb2/x8C5wLy+xcS9vrmysK64t7/Dx8PEvb2/v8PDvr/HvLy/tLSutbW8vr/OzcvCt7K4uLi9ubuxtrLIwLu2tLGwt6yzqbCtrbO3r6uuqrG1r7Gvt7O6usC/tre2sru6wLWyrbO3rLC6r7KloqWrrK+5s7KosK+xr6qiqKGkraitrLOun6inpqWmq6Sknqaqo6ayuLOrpZyfp6anrquqpbClpaWbpKOYn6exrLW4sLKOhHl/fHZsdXpwbmlcX19ZU1BBRUlHS0BEQ0g8PTY7OTk8Ozo6Ozo9Pzw9NTU2MTM2OTg8QT5AOz1AOzs5PD04Oj08QD46Oj49Pj09PkBCQkJBRD03NDU9REc9Q0I/PEWUnqCgoJyXmpiYlZmdmZ2fmp2bnJaRj5LDwMK9wrzEvLy7xbu3s7e2tru7s6CWtayvsbS0tLa4ucHAt725uLm2tb+ztLK4sbvBwMO3t62wtbi4uMK6tLu3u77Au7u8rq+us7K5wcLEw768v7u6uLbBwrW/urWur62wvcC5z8rJw7GvtbS0vbq+ubq7ysO7uravsL2xuK+ys7C3vbaur66wt7CsrLK2vbzEwrq9t7bAv8G3tbC2srGzurGxr6err6u2v7e1qbqztbmxp6uop7ausrG1uaisrK+qr7CqqKessayytr20saykqKuoqKusq6i2qaaonqadmKOuvLG7wbSmiYF8gnpzdnZ3bnFgX2VcWlVKPD8/RkY9RkNDOTo1Ozk5Pjw8Ojo8Pj4+Pjg4MzE1Nzg5Pj9BPzs6Pz08Oz09OTs8OTs6Nzs+PT1DQT8/QUJEQkE8ODU4PUNGPUREPzw/iZ2en52Xl5WUk5aZnpubmpuYlJ2Uio6Owb7Dwr6+vrm2usCxtbGzt7fCtbOrrbOoqa61r620trnDv7e6t7a2srTAtrK0uLO6wMHDubeysrK0sre+urO1sry6vLa6vrK0tLSwuL7DxsTAvb+5s6+yvLquu7Szpquorbq+uMvCv76sq7Cvs7q3ub67wMXBu7y3sLXEtb+0uLu0u8PCs7a2sbisqaWrsr23v7+7u7exvL28trGvq6uprbOvsLCrsLSpuMC2sqm0tbC3tq2spqu7s660uMKwsbG1sbK1saywsri4ubi+tLGzrqyxramvrqqyuK6trainoZ6ptr+4ur+wlol9gHxxdHd0dnJsXmJgW11PSEE/PUhDRk1EQDc3NTs6OT48PDk4PT47PT86ODMyNTc2OD8/Qj86OD4+PTw5PDk7Ozo8Ozs6PEA+QkI9QEE/QkI/PDs3OjxBRD5CQz8+QYqgm6GdlJiVlZKYmpyWm5WalY2bj4SIhru0vb+7vLm3s7y8rLOytLS2wLXAr7Kzqqqxt62pubO3wL27vLi2uraxwLq3ubi5u8HBxMO7u7a0tLC2ura0sqy8ubi1uMG6uLOxrLe8wcfDv7m6ta6lrLOwprCtqJ6gn6WttrXCt7a0pairqLC2s7K6tbu7u7W4trC1xLK+vL+8ubrFybq9vraxp6SeoamxrrW5trKxq7S3trGopp6gmaWmpKynq6y2qa+6sa2kpq2lq7GrrKmtuLawsrjBtrGxtbGvu7ayt7W1sry1urKwsbKutLKqrq2nuLWyta2uqqiosrq9wLa0qY6Ce393b3tvdXJuY1xmWFxdUk5NQT9KQkBKSUA2NjU7Nzg+Ojs4Nz4+PDs/OjkzMjc1NzU8PD48PDg+Pjw8OTk5Ozs7Pjs7OTw+P0E9PEJAPz9CQD47Njc6QERBQ0E/QUKJoJ2loJSWmJiVnqCcl5uYmZGMmYmDhoS1r7S7u7S1sLG2uq6wtLOvtbq1urC1s7GttrqurLyyuLm3u7+9ub7AtL+7vLq4vsK8wsrHvsC4ubaytLaztK+su7q4trnAw7aurqqytry9ubaysa2tn6Snp52jpp2WmZman6muuayrq5+lqKSrrq6nr6yvsbGtsa6usLmwtLy+uLm4x8W8vLu4qaKcmJufp6assq6zqaapqq6popqXl5GcmpijnqKir6ekrKaompqemqGnp6anqa+2squ0trCqsK+xqbm2sbWxrqy3s7avrquuq7S1ra+rq7GtsbKoraurs7W3ur2wq6GLeoJ5cnZzbXVpa11balRdXE9NSERGTEJGTUY4NjY1OjY6Pjg7OTc8PTo7PTo5MjM2Nzc3Pjs9Pjo6Pz48PDw6Ojs5Oz47PTk8Pj1CPDtAP0A/QT8+OjU1OkBFQkRBQEJBiJ+ipqGYm56dmqWpmJudmpmUjJmHhoeGrq2uuLmxsqiur7iyq7CwqrK1ubm9tbK4tLm6tbm7tbWztbu8wLu+wLS/ubm6sbrDvMLKxb+7v7+5tLSzsbGusLm5try4u7+ysrKusa65r6qrrayjqKGdnZ6XmKGVkpWXkJifqK6ko6Sgoqeio6mpoaanpaqtp6ynqKesq6yyu7SztLm6trK2ramgmpaWm52fq6yrr6Ojo6GpoJuTjo+Qk5KSmZaanaSloJ+ep5iVkpSYnqSjoaWqrK2iqaqppKmtrqW0sa6xrauprq+wraWmqqSos66trKmmpqmrpqqnq7Ksr7Oxq6mWgX+Bd3J4aHRzbmRUYGNXXFFOTEhASFFETUM9ODg3NTo3PD46Ozw4OTw7Ozw7ODI0ODk3ODs7PDs4PD0+Oz08Ojk8Ojs9PTw6OkA9PDw7QD5CQEE/Pjk1ODs8RkFDRD9BQYijpqKjnqCfp6Coqpufm5yZmI6Xi42PjKqpqLGvsK2lp6ayr6mmq6CvsLu1vby3wMG+vLy8ua6tr7Kyurq3t7W1vLSvtKu2urjAxMG7try9uLKts7CvrK63trO0ta+qpJ6bnJyeqKifoKipn6GnlpuXl4+dk4+Qlo6Xm6SooKCioqKlpZ2jo6CepaCkrKSmqKSio6OrrLOuqa6urqeqraisoZyamJmYm6moqquepaKbo5yVkIyPj4+TkJaVlpifnp6amaaXk4+Slp2ioKWjpqSnoKKko6Ghq6uksq2qrKyno6yuraufoaKkpK+srKmmo6KqpKqqpKmrpqmsq6agiHiDfHZ/eWJ3bG5cUWhUUE5HT0xMQk9RQD47PjM5OjU7OT07Ojk9OTk8Ozw8OzkzNjk5Njo7Pz06ODs6Pjw6PDs5Oz07PDw9PjxAPT88ODtAQEE/Pz45NDk8N0FDQkQ9QEOOqqSjoqGinaulpqimoZ6dmZ2PmJWTkJWnpKGmqKmlpKChp6uhnKKbp6u1sry9wMLCwL7AuLSnpayqqLWysbCur7KnprCkr661wbq1t7K3trK0q7K0rqqrr7Cys66lnpKYlI+ZoJ+ioJykpZ+eqJSblpeMl5GNkJeTmJ2iqp+fn6Cjpaicn6ChnKKfo6innKehoKSfrKisrKCpq6agpKimrKOdnp2Zl5qrpqqxo6WnnqCclZOQj5GQmJCWlZiXn5ibmZujmZeUlpqdoJ2nqKWgo6Kho56doKmqpa6upqipoaKqrqqnoaCio6msq6eppqShqaKlqaalpKKmpKijkn18gHV1fW1re2RoVVFjTUlIR05STkpORztEQD0yPzg1OTs+Ozk5Ozg6PDs7Ozk5NDg7ODc7Oz48Ojk8Oj07Ozw9OTw8PD49PUE+QEJAPTc6P0FCQEA/ODU1PDpAQ0BEPkFGlq6koqWeo6KpqKipqqWmnp2imJiZmZWbop6bnqOioKOgoZqgmJiXlqGorK62t7q5ure3u66ooKGpoaCtq6qmqaSpo6SupaystLy3rLKxr7Gtta+vs7Wqp62so5yZlI6SlpeZmZygo6KbnaWemqSXl5eWkJKRkZOal5ugpKqeoaGepqeqop+gp5+dn6SnqZ6jpp+qnaqtqq6nqLClo6Smp6ymoaShm5ier6musqulqqqgmpiYmJWTlpqTlZWZlpqXl5ignpycl5uhmp6ao6eln6GioqOdm6Gmp6aoraOppZ6kp6mkpaWhpaSsrKmmq6eioKSjpKenoaCgpaKmoIl7gH12eHxkeHlgYlJVX0hJSUtTVElSUEw4PkI2Nz02NTs6PDw5Ozs4Ojw9Ojs4NjU3OjY5Pj0+PDk5PTk9PTw+PTs7PDo+PTw/Pz9APT03Oj5AQEA/Pzg2NT08PkFCRkBAR6CupKaroaOqrK6tp6ypqKCipp6bm56aoJyalZmfn5uen56WlJOXk5OcnqOorq2sq6uvqq+pn5eepZ6epaakoKKfpqCirqusrbWytqavtKupqrSxsLC4raehnJ2alJiampGOkZWRjI+OlJminJejmZqXmJmUmZiWnZufpaapoKajnqeurqumorGjmqSmpqqioaqiqaSosquxsqu5qKarp6urqaysp6Cgo7GusrG0qbGvopmcnZ6hmZubmpiZm5SVm5aZnKWhoJqjoZqdmZ+kop6gn6KmnZulpqWkpaijp6OepqOinqaloqWlqKykpq2noJ2dn56gpaGenqWgppmBe4F8dXZzaIJsZVtTWllNUUpOTlVMUkxBNz5CNzg9NzY6PDw9Ojw5ODo7PDo7OTc2Oj01OTw7QD03ODs3PTs9PT06Ozw4Pj09QD5BPj4+ODg8P0BAPT83NTg9Pj1BQEZAQUihqqCrq6GkqquwramtqaelpaWkoKGfnqWXl5SYmZ6YnJ2blo+VmZKSnJihnaqip6Cep6Gln5ySnKKbn6Gjnp2gn6Ogoq+vrK+xrLanrbGtpqawrq2ssKign6Kgl5GUnKGcmZiSk5+doqSbnpuWn5qfl5uinqWhnqSfpKitraisqKSstLe2sKe0rKKtraOvpaSmoamorrWzsr23vrCssa6tqaq0sbCoq6iytbezuKyxtKOgnaWgrKGhoqCgmpiWlZ+bm5ikoaCepKGgnpqcpaCfnZyhqJ+fp6meoaOkoKagnqehn5ymo5+ipaOooKmrpZ+dnZudmqainpyjnqeQgYJ/fHh1aXd1XWxaUmBIUVVIRlVWSkJNRz1KSDhFPDY3Oz49PDo8OTg6Ojs6PDk2Njo8Nzs+PT8+OTc9OT47PEA8OkA6OkA/O0A+QUA9PDk3Oj5APzo+NzU4PT0/QUBEQEJGnKueqamipamprqimqqWmp6aoqqGlpKOmkpOVmJacmpqcmpWTmZuOk56ZqJ2unqeenKGdnpqakpmenKKioKCdop+fnp+prKesqaq0q6utq6Wlq6iqrKqloJ6ZkpKUmJmXlpaMiIuOlZ2dnZ2elp6apqCgqKWxqqeuo6uttrC0srGutri9wLqttbSwt7CutKmmpKWsqbmztbvDvMPBtrq2q6+xube8r7OwtcG8t72zs7Whq6KpqLKpqqinqJqZnZqqp5+Zp6Cfn6eopaSenaqiop6bn6igpKetmZ+jnp6nnqCmnpycoqGbo6KhnZympaWkn6KZnJukn6CboJyjiYWEfnZxbWl2bWhtXFhbQlZNSkdNR0JGTTw+TD00PDk2Oj0/PDs6Ojg4PDk6Ozs8NTQ6PDg5Pj4/Pjg4Pzk8Oz0/Oz1BPTo/PjxAPj8+Pz08Njs/QT07Pzg1ODw8QERCREFCQ5WqoKapo6mqqKmjoamgpqinrK6lqaWpqpSSl5mUmpqanJiYmZyamJqqoLGit6OwpqCenZ2XmJaZnpucpJ+fnaSdmp2cpaKko6Kqr6ynqaOgoayurqqrp6CenqKjnp+empyclJOVlJ6emJSGnpqhm6ukq7KwubKysbKxur28vLm2uMO+v8K/trq6wMS5vbusr6exrbHCtrjCxsDIysDKv7C5ub25wr64tLvGxLzCu7ezqbKtqrO0r7Ouqq6jnauntrGsoq+loKOvsa2wpKSvo6GgmqGnoaSqqpmdoJmao6CmqKGcnqKemaSenpiYo6OhpZ6mmZuipJ6fm5ubnIeGgXt0cmtrdXJwaFdbUUVUSERJT0g+RUEzRUg5NTs9Njs8Pjw8Ojo4OTw4OTs4Ojo4Ozw3Oz49Pj02OEA5Ozs9QDw9QDk3PD07Pj0+PUI+Pjc6QUA+PD45NTg9Oz1DQEFDQkGRqqGlqqelqqimn6KnnKasp7Gyq62jqayVkpWalJecoqGbnqCinJ+psqu7sr+rr6ylnqChnZyYm5+gm6Cfn5elnZWbm5+anpyepaannaCgq7Gup6Sko6CepaulnpeclJGZnZiUjIqGiIZ5bYigpKKrrLS8tsO+vrO7wcPCxcC/wsbGxcPIwsDFyM3QyMvDsre1vrK+xbu+zM3FzMzM0se+v8DCvcfGwrfDycjCwMW+ubS5urW7t7C1sqq6sa67t766uqq3rauquLq0vK6uuaOmo56npaKjqaaam5+Ymp2nqqegoaGkmJSjlpSakZydn6Sep5+en6KdmJmUmJSIhH16cmtkaG94amVaW0ZKTEREU0xEQkQ3Oj87NTQ5OTc5Pj87PDs7OD48Njo9OTw9OTw9Ojs9Pj4+NztBOj45PT45PT44Nzs6Ojs/Pz1CPj83OkFAPTw9ODY2PDo8QT9BQUE+kqugp66ooqulpKKipaGlqquwsq2upKmmlJWVmpaUm6SmnaGqp6KrrLy8v8PBs7K4p6Ghq6qinZ6hop6cm6CSn5+Qlp+ZkpqWnZuZo6Gvs6mhmp2dn5+al5iXkoyPlpeTjo2Qi4KDgndzcW5wj6atrrS5xbvNx8u/wszOzczIydHMzczHycXGzNDS1c7Tyb3Av8O7xsXIxdLTzNPQ09PMysLFxsbKx86/ydDLxsTGxMG7w8G+vr61vbOtv7/Cw8bEx8Suv7iyuLzEwcG6vLy1rqenrqigoqmlmpagmpmdqKupo6SknpePm4uQmYmVmJugn6OdnZeempOTi5WPhYB5dHNlYmdyb2ZeWllDTkxDRVBJREJANTU1ODlCPTY4OkE+Ozs+PDk+PTc6PTk6PDg8PDw7Pz8+PD0+Qzw7OkA9Ojs6Ojg4ODk7QT48QD8+ODtBQTs7Pjc4Njo8PkI+Q0FAPpOvn6ivpqiro6KloKampKuoq62qrqKqo5Kcl5ebmJujrJ6frqalsarFxszOzb+wwqmlqK2tqqGdo5+cnZqpk5mhkI6gk42UkpeZpLGxq6SgnaCbmZeUk5SWkZCPjIeEg4iHg4CBgYB5cnJvbHmktrq5vsvB09LTyM3O0dPR0tHQ0dHNzs7Qxc7U1dfS183Gx8nMw8XKz8rT19HX0tTV09PIzMfNzcnSzM7TzcTHycrBxcvGyMjFvsKzs8jEy8rKzsXKv76/vMHHxMzMyMnAw7+tsLOonqKqo5qTnpyYnqaprKSlppaXipWFkZSHkpKSmZualpiQm5WQjIaRi396cnV1Z2NndmlkVldRRE1GQElRQj1CPDoyM0A8RDw3OTxCPTs9Pzs7Pj05Oj48Oz44Ojk5Oj86Pj1APkA8Pjs+Ozk9PTw5Njo6Pj08PEA/Pjk6QEE6OT44Ojo6Oz4+PEE/QT6QrKKiqaanqKSfop2qqKOso6OnpqyiqZ+To5iWn56dpK6bn7CrqKyxyc3U18/Gu8esrbS4rK6jnqSjn6CkrJuWqZaMlo2MjZemsK6lnZ6doaWhnpuVlJaUin13cGtlYmhxb3F7hYqAdnBucXRwhbPCvsXR0NfW1tLWzdTW19TT0dPU1NPP0sPQ09bX1dbSy8nO0cvGzdLK0tXW2dXX09bYztLJztHMztDM0s+/x8bKw8zMy87PxcbHtsDKv9LNy8/Fyci/w8PIzszP0M/MysjOuLe7qJ+lq6efmJ6jnp2qpa2pqKiSlYiQhIyRho2MiJOVmZCWjJiSj4aHjIR8d3N2b2NgZXJiXVJcSUpGQUVIST47QDg9NDU4NTo3Njo8QD07Pjw7OUA7OTo8Ozs8Nz09Ozo+Oz08Pjw/Ojo8Ozs5Oz89OTU7PD48PD0/Pz46O0BCOzk/OTg7PT0+PzxBQEQ8hqugnKegp6Oim6CbqaSlqaCfoaGmn6ifmKSim6mmoqarmqOwsamotdDU19rSx8bLtLbCxbK2qaKlpqGiq7WnmrGgmJ2MkKatq5yVmKGdm6Gin5ydm5WKd2ljYF9fX19eX2BeYmx1c3Fwb2xycXWSxMfG1NXW19fT1s/V1NrU1M/P1dTU0dLM0c7T19bT1dDP0tPRydPRyNDY19jR19LX2dXWzM7Pyc3Ry87Pv8XCx8XOzdHQ0cjLzMDKy8XUzsvOyMTJxsbIzMrT09HVz9LM0sG5xbKlqLWup5qorKWdsqiws6ysk4+TjoiLjoOPi4SQjpmNk4+Zj4+ChYx7enFzdG1hY2ltX1ZQX0pKQkZDUU0/PD40NDo9NTI3NTU8PEA8Ozw6OTpAOjg7Oj46PTg+Ojo8QD08OTs9Pzk6Pz07PTw9PTo2PD0/QD08PT0+OjxAQjs5PDc0Oj48Pz89RkFEPYKknKClnaWlo5mcnaSeo6OfnZ+doJqnnpyhqaCvrqqqrJ6mrrioq7fY1NXZ2dHO0MC8zMm3wK+nq6mjpLG2s6O2qqzDp6mpoZiWmJqbnaGemp2elH5yZWNiX19hYF9hYF9gYF9gZm1wcG5rb3J3d5vMwNLV09jY1tnR0tLXz9POy9PN1dTSys/M09bS0dbNz9XV0cbR1MrR1NXWztLQ2NjY18vIzcPJzszJy7/Iv8jJzc7Py9DNzsvOz8fLz9DKzsrCycbJzMrL0dLM09LRz9DKvci5sK27uLWqtrCtqLits7+7sZqPn5SRjo2IjpCFkY2ZjJGRlY6RgIWIeXZvcG5rYWRucGFXXFpJRkZETFdFO0A8MzM8PTg2ODU1Oz5APTk8PDg8Pjk8QDtAOj04Pjk4Oj88PTg7PkI6Oj08OkE9PTw6Nj09P0A9PDs9Pjg7QEE9Ojw4ODs+PD4+OkVCRT6Bn5mlp6Cfo6eam5+cl56eoZqdmpyappufo6eeuLa1ta2lra6+tLHA2dLX2tzXz83LxNPQwsKyq62urKazsrmrsrzGoqGclpSXm56fn52UlpeViWxeXl5hZGJgYGFhYGBhXl9fXl1ibXJvb3N0dnZ5pL7L1dHW1NPY1s7O1MvNzsXOytLSz8bOzc3UzM7TzcrX1dDM0dTLzNDR08rO0dXS1dXKwMrBxczCyMnCzMPFyMrKzsrNzNDN08vFyM/MyMfKxMfAxcnLzdDRxtDOzc3Mz8XHwLe5vcPDvcO5srO+sbzExLWqmKWimZaRlZaSi5SNmpGUlI+PlIKJhXhwcWtuaGBgcWhZWGhWTUdMSVBQQjtEPjs2Nzo4OTo1Nz09QTs6PD05PD05PT06Pjo8ODs9OTtAPD47Pj5BPDk9Pj1CPTs3NzY/PDw/PDw7PDw4O0FAPDo8OTs7Ozw9QTpFQUU+hJ6bqK2epKSqnJ6fmJKXm5+am56ZmaKVoamppcXDwb+7tbKxx8O5y9XW2drb2M3N0MnW1sXEuLK2qqSurLm5sbLErJaNjZiWkJOSkZaWlpCMfGViYmJgXV5hY2JgX2BgYWFgX11bXWdycXFyc3FtcnmkxtPPy9DP1NXJxcnJxsa/w8bPzsfFx83K0cjLzs3G0dLPzszUysfLzs/Hx8/Sy9DPxrrEvsbJvcLHyc7EwsfAx83Hw8vKy8/Hw8PPyMbBxcjDvsDHy8vMzsLKy8jHy9DExce7x8PIyMLPwL28v7HByse6vaqxsqelnaKdmJCakKSZl5mRlZiJj4J3bnRkbGBeZnFhW1dgR0hIR0lNVEc/Sj02NDM1NT08NDg9PT06Oz08OTo7OT89OTw7PDg6PDo6QD1APD09Pjw6Qz48Pz04ODk6QD4/Pjw7Ozs7ODo+Pzw7Ojc5PD49Oz49RkFDPYOgm6qupa6qq5qdoJeUjpedmpmgmpqcm6WzsazJzcrIxL69us3Nx9DV1tna29jQytDQ0tTKxbq+vrCot6u+ubizpZGOjpaQhoOEhIJ+hYV/dGBbXl5eYF5gY2RjX11dXl9gYF9bWlxha3Jyb29rbG9vfbjRyMnKz8vNxLrAw7u7urq+yMbCw8DDx8rJyMrHwcXMxsjLzcnEwsvJwsLL0MTLyL+5wbvFx72/xs/Lw7/Du8nGyLvIxsTKwL3By8bFxL7FvLy/w8TLxcW8wMnCxcfSxcDIv8rKxsjG0MPDxsOvxMvHxMq3v7y6tKmspaWYn5iso6GlmqOgm5R7dnN0ZmpbYW5tWltYUURMRkJHRExERlNANTQzMzQ/PDM6PDw7OTw8PDg7PTtBPTo8Ojs3Oz05Oz07PTs6OD4+PEI+Oz88OTk7Pz07QD48Ozk5OTk6Oz06PDo2OTw+PDs+O0NCRD5/pZypsqm0rrCdnp6YnImUm5man6Kfmp2ov7i8y8/RzMfCw8fNz8/N1tDW2djZ0M3Uzs/Qy8S4xsG2tbyxwLa6rZGMk5eHe4CFhoB2eHVycF9aW11gYWJjZGRlZGBcXF1dX15gW1laXGJvcm9raWxwb3OPxrzJxczAxsKxtrqysrOyscK8vLu5uMDBwcW+vbm9v7nEysXGwr3GwLi7xMm/wsm7t7u6xcO+vMHNwsa+vrXBvcO6vMa7wrmzvMXDwsK2v7W1vr+6y8O8tbrIur+9y8TBxcLGyMbIxtDGwszIssfKw87NwcXDwL2zt7CzqKioubGlrbCrrayUeXZ3amVoYGhvY1ZeWUpFSkZIS0FGQkVJQDk6NjQ4ODUzOzo7PDk8PDs5Ozk6QD46Ojw6Nzo7Nzo7Oz88OjxAPUA/PT8/Oz07O0A8Pj4+Ojk5ODk3ODo8PDw7OTo8Pjs7PjpAQEU+fqygrLWqt7SyoZ6fl5qNlJaan52mop2et8bCxMjO0svKysfNzs/SydHH1tXW2M7M0MjNyMrFvsrBsrW6t7q2r5GNiouFeYCGhoB+hHx0dWRcXF1eYGBiY2JiZWViXV1bXF5cXl1aW11daHNxbWdnbnByeZ29zMDDusG4rrCwp6qtrKe4tLe0s7KzurW9sbewta+yu8K8wcS8v7u1s7u+wLjHubS7tsDCvLi9xsHDvLWusra6vrTFt7u1q7i8vcC9sLq2r7a6ssW8tq+7v7S2tMW9vsPFwMPFxsjLxsDGxrvIy7/PysfDxsLDt8O+vba5vse/rLW6tbe2jnh0eGdnZWJrbl5WXmBGS0hISkZCQ0FFRT88OjU2NTYzMzs6Oz06Ozs6Oz44PEE9PDo7ODc5OTk7PDo+Ozk+Pz1APz5CQD1AOjo+Oz89PTk6Ojo4NTY7PT48PDo7OT49OT86PEBAPIi3pauzsby8sa2foJmUlJiXnqujr6qnpMbLzsjGyc7M0M3OycvJy8rLxtHP09HPyMrGysbEwL3PvbO4vbm3tpuOh4mJe3l+hoZ3eIJ9dGheXV1dX2BfYGRhXmNlY19fXFteXF1eWltbXV9scG5oZmpubnJ8pMe/uLi1sKusp56iqqeeq6yzramrqbOttrCyqa6mrLK8urbDubq6sau1ubu0wrqwv7G9vbu2vMi5w7etqqiwssC2uLyvsKexs7S7vKuttaautq66sbCqua+tu667uLu/v725wr/Hw8XBvMbByMu4xcfFv8fEw7rExsK7xsnMy7O5wry6sohydnZraWFibGhZWFdbQUxLTUlFQUM/RkE6OTo5OTU4NTQ6Ojk7PD07Ojs+ODtAPD05Ojc5Pjk7PDo4Ozs6Pj05QT0/QD88Pjo7PDo9PDw4OTg5NzY4PDw9Ozw6Ojs+PTs/Ozs+QDyKwKuouLe5w62zqZ2ZlJaZoZymsLWxt6bGztLMxMbBxdDIz8PEx8HGxsXFzMPKzMLEwcfAury7yre0u721tauRiZCQfHl+ioV6e4SBd25eXV1dXV9gX19kYmJjY2JgX15bW1paXVpaWVpdZW5vaGZnaWtucoGtubC1rqalp6eaoKSgmpylq66jp6KrqqyqsKOmn6qttbaxvbmvt6+orri0tLy4s7yvuLm1srzBssGupamiq7Gys6i8qquoq6yttLSmqK6hpK+psqWnqK6lqLessLK3ubq7sby9vr7Ev7XBwcfIt7/AxbfEwr+7v8TDvsTIzMq/vsPAwKmGcnRyamldYW9kV1ZYUEhaUlNLRkZFPj9AOjc4OTc3NjQzNzo5OTo8Ozs8PDc7PTs7Ozw4OT44PTs8Njo9Oz89N0E+P0A/Ojw8Oj05Ojs6Nzc3ODg3OTw7PDs5Ozo8OTc5Pjw+P0E7jMKvrry3usSwtrCbmZWcmKqpsLGztb2vxtHQzcTIu7vMw8zAvcq4v8XAvMy6w8bFurzDvbm3vcW4tbi7rrKVg4mNgXt+gH54dH98c3dmX11cXF5fYF5fY2NhYmBgX15dXFpYWVtbWVhaXF9ma2ZlZ2Voa29yhaqlrKagnKGllJ6km5eRoaOqo6KfpaWnpaygnZukpqyyr7a3p7Csp6q0q7S5sLa0rba5srC6ubG3pJ+jn6axp6uouaqkp6eop7KtoKemn5ukpqyen6ekn6Cxra2ssrSytLC1vLa7wcGyur7DwbK5usKzwL2/tbi7vb68wsfEwsO/v8Sgg3dwa2FmX2tvYFVZX0hOaE9USEVKRjw9QD06Ozs4MjU1MzY5OTk7OTo6PDo3PD88PDs8ODg8OTw6Ozc4Ojo8OTg+Oj89OTg8Ojs9Ojc2NzY3Nzg2NjY7Ojo7OTo7PDg1OTw6Pj5AO43Itba9uLrBu761oJ6VnqGmurars7O7s8XQyczDx7m4ycLOwbrLub3Iu7fHu7bDxrO9xbu2r7i/u7CytrCihIeHgn15dnRvbWtqanFpX2BdXFxdX2BfYWNiYGBgYF1cW1xcWFlYWFhWWFtdXmRjYmVnZ2dqbW+Inamgl5WaoZabopiVjZ6hoqabn5+jpaGnnpuim5+qsK2xtaKpqqmrrKS1uK23r6yzta6zta6wqp+dnqOisqSmqbitoqamn6isq5mfoJ6ZnZ+lmpmjnJudr6mrp6qrrK2wsrivuLm7sLa7u7qrsrK5sr20trGxtbS/tb3AvcPBuru9l4N6cmtfZV5kZFhUWF5JV11LUEdJSkZBPD8/QDs/PDA0NTM1Ojs5Ozg5OTw8Nz4/Oz07Ozg4PDg5ODw3ODo7Ozo7Pzo9Ozc4PDo9PDc0Nzc2NzU3NDY2Ozc5Ojs6ODo5ODo7OTo8PzuJyba4vru3wcHBtKSkmZukpsCyr7astLfG0MnJwce8vMXF0MC8yrq6wru1xbi1wMGzwcO7rKm0ubensLOpi4aIgHlzbnBua2JeYmZmXV1eXV1dXF1fYGFiY2NiYV9cW1taW1lYV1dXV1hYWFteYmRkZWZmaGlrco2onZSUlJuYm6GWlpCcoaGonZudpaahpZygoJqYra6trrKgpaKtq6ehtbCxsayor7OnurOmtqGinpujoa2joam1qqKjpp2lpqOWmJ6XmZqdn5mXnZycm6yhq6ajpKatq7OzqrSwsqqyubSvqa+ysrK3s66prK6xt7C6trm9v7eysZSFeXVlX2VeW1lWU1pVS1tRTElFSEtJQj0/QUFAQDoyNDUyNDk5ODk7OTo9PDY9Pzs8Pjs3Ozs3Nzc+Njo+Ozo4Oj07PD06Ozw6PTs4Nzk3NDY1NTQ2Nzg1Ojo4Ojk5PDg3Ojg5PkA6gci9uL2/tr69v7OdpaOYpbHCtba9rbS4w83JyMHGuMLByNC5w8fAtry9tsO6tr/Atbq+uqmmsLqwp7Gvm32FhYB5cHF0cWhmZGllY1xcW1tdXVxbXmBhXl9fYF5cW1pcWllYVldXVlhXWFhWV2FkZWNkZWRkaGp2opyUlI+Ulpefl5mUmJ+eoZyWoaGoo5+eqZ2bmqqmr7Crm6Ojt6qgn66otqmmp62wpLewpLegopuYmKqmoZqsuLCioaScoZ+gk5WhlJaWm5iXlpeclJ+pnamjoZ2jqqqwrqi0q6qmrbKwpaqusrGvsK6vpqensq6xtK+8tLm3rqOUgXl1ZF5hVllXU1JUS01eTFBLR0dMS0U8QD48Qjw7NzY1MzQ5ODg5OTo5Pjo4Pj47PTw8Nz49Njc2PTc7PTs5Nzk7Ozw+OTk6Ozo4Njc2NTQ1MzEwNDU2Nzk6ODo5Ojo3Ojs5OT1AOnbAvLS5wrG+uLyunqeno6q7wL3Aua60uMLNyMfExb7HusrNtcTFxbG/v7nAwbm/wLm5vLenprC7paigpImBfnhyamxydHBpaGVkZ2JcXFpZWlxcXF1eXVxbXF5cW1xZW1xaWFZXV1ZXWFdXV1VbY2NiYmNiY2RmaoGWk5WLkZSTm5mclpaboJyflaCfpqWkpqefnJ+kn6qvpp+io7aooKGiqLOhpaekr6Wxray1nqCdlZSpoaKUrLGxnqKinZ6Ym5OLoZSRk5eYkpeXmJadppumoaKZo6Wlq6SlsKelo6urraWorq+uq6iqqbOlpquvtLGuvLWxr6+gknp2cmRhXFtdWE5MUUdSYU1XUE9KTU9FQkQ/OT02OTo3NjQ1OTk7OTg4Nzs4OT0+Oz47PDY5Ojc7Njs3Ozs6ODU6Ozo7OzY8Ozg4NDY4NjMzMjEuLzI1NTY7Ojg7Nzg3Njw7Ojs7QTh4u7uxtb2wu7K3rJ6kp623u7zBxbqxubXFysvBxMfHybjIxrXFwsmvurzCu8LAwb27t7m1paaxtZ2hiZiIgHdvZGJnaWhmaGpnam1gXVxbWlpZWlxdXFtcXl9cWllbWVlaW1dVWFdUVFdVU1RSVWBgX2BhX2BhY2RpgZSTiZGOlJKTnJSVlqOZoJacoKWhraWkpKKjoZuqqqWZnqWxqaCgnKSqnaehnqytqaiuraKhopSXo5ucj6upsJufop6el5iTip6SjZKTlY+YmJKboaKcpKChlaChpKabo6uloqSqo6uupK6xqaalpqa0pqmorbO1tLm6r6qsnotycG9gW1dWVVFGUU9IWlxPUkpUS1NMRUdJQzg7Oz08ODY2Nzo5Ozo5NzY5Nzc6Ozo9PDw3Ozw4PjU5ODo4ODY1OTo7PDk3Pzw5Njc4NDUyMTIxLi4xNDI2Ojg2Ojg1OTg5ODk7OUA5e7W0rbS7srCssq2dp6evubmzwMi6tcCvxsnOu8LLzcm3y7+0wMfMsLa9x7vBx8O9vra5tKSqr66cmYeOg3x1aWpqbWhqbG5ra21lXVxcW1tcWlhaXVtbXmBgXFhYWllYV1hXVFZWVVRVVVJTT1FZXVxdXl5fX19iZG2Oj4SRho+Rj5mTlJKcmqKcm6CnqKqoqqaopaOYpK6klJmlr6mfm5iboJ6umZuqs5+lpp+jo6GUk5uWlpKoqq2anKChoJqUkIyZjouQjJKMlpSQnqGgo5ybopWboKKgmKKoo6Koq6Crr6Stt6Wjo6Ksraqoq6+zuLK9tbOrr5iEc3NoW1lZUlVSRllMUFxZTVROUExQUklOSUI8Pz9BPzw2NTc5OTw8OTg3Ojc5Ojs8PT47Nzs7Oj01Nzo7ODk3Njk4OTo2Oj05OTU3NzU3MTE0MS0rLzQzNDk4ODo6ODo6NzQ4PTg/OX6zrqiztq6pqK+tm6morLe2rLzKu7a/rMzHxrnCz9DJtca+ur7Gy7WxvcS8wsTDvcCyuK6lqq6qnZeGgXd4b25pbm5ucWdnaWdkXVpbW1tbXFtZWltcXF5fX1xYWFlYV1hXVlVUU1VWVVVUU05QUVlaWlpdXVxeX2Bkfo2Bi3+LkIqSjZeRl5mioJufqqmmraqnr6OnmZ+soJWWpKinnZeQj5qerpaXp6qZn52UpaGekpCSkpOVp6ulmpmanZ2WjYyMlIaIjYOQi5KUkKCeoKOXlZ+VmqCinpObpaWnqKigsbCmsLynoKOstKuup7C0sLm1wLGtsauQfXFyYlZUVU5SSUdWUVNSTExYTUpMTlJHTUtBQ0ZEQz5ANzU4ODk7OTo3Ojo3PD06O0A+Ojk7OTo/NzU5Ojk4NzY5NTg3Nzk7ODU1NzY2NjEzMjAtKi4xMDI4Nzc7OTk7ODk0ODs4QDh/s62msbeqpqKwq52qp6mysaS2xrS5urPLxrq8w8vRzLO5ur7AxMe2tLe9srq7w73BsLOtsK2vqpuiiGtobm9yb3FrcGtkZmdlXlpZWllaWlpbWlpaXFxdXFpYWFhZWVdYV1VVVFJTVVNWVVJOTk5SV1hZWVlZXFxdYWqAen91iY6HkImYiZSUl5uZnaibn6qlpKqdp5igpZuSj56impeWhYSSmqOPk6KclZaVh6KampOLjouQmaSnnJWVl5uQkoeUjoyBi42AkIqSkpGhmp+hlZSYmJWipZmMmaSmqKahoLSyp7K3oZ2it6yqraSysqa1vLWrq7GjiHhybV1OUFFMT0NNTk5QS0ZOTkpKTk1RSU1KQUdLSEhDPjg1ODg4OTo7Njk6Njg7OTk+PDg6Pjk7Pzg3ODk6ODg2ODU3Njg4OTc0NTc3ODIwMzAxKyktLzEyNzc2Ojk5OTk4NDk4OEE3d7anpLawpKekqaWgqaWks6qissO1tbKzx8e4u8TKzce1r7y/uLzEs7OutqKstMO5uq2pq7Ourp6Wp31eYGdzcXZxam5pZmhoal9YWVhYWFlZWVpaWVtbXFxZWFhXWVlYVVZSU1JQUVRRU1VRTk1LTFNXV1ZYWFlYW11hb3N2cYWIgoeAkYOOipSRk52gj5qcoqGjmKSWoZuVjYeYmoxzjYJ9jZeWhZCZkJOOjnuZjpyMgoqAipifop6Qk5iWhI6Ck35+dImOepCGkpCQnZqZmpCVkJ2OoqOOiZqgoaSjm6K0r6yvrJ+YpbmmpbChsK6csLuqqa+qmYF2cmNWTVJPUE1DU05MUU1DUFBISU5TTUhKSkRKTEZLSz03NDk4ODg7OzY5Ozc6PDk6Ojs3OT85PkA3OTo8ODk3NjQ0NDU4NzQzMTI0ODUvMDEwMikoLC0xMjc2NDc4OTo6NjU6ODdBN3e3oqO0qKWlqKOmpaamprOnpbTBuK+0sMrGubrCz8e/ta+9w6+xx7Ktp6uVpK6/t7Cvn6asrKqVlKJyV1ZfaGdpaGluY2poZ2JcWFhYWFhZWVlZWVlaW1tbWVlZVldXV1NUUE5QTk9PUFNUUU1NSkhOU1NTVFVVV1lbXWlscm1/hXx0Tlhyj4KXho2cl4uTkJ+XnZWUlpSOlol/k4lfO1dve4uUiX+LkYyPhYZzioSWgXmCeoWTnZSDlY6Rj4OGfZN4cm+FjX6JgJCNj5eZmJOKj4mciJ6Xh4iWnpqhoJenr6mtqaifl620oqatmKyrmKe0oqmto5J9cm1fW05TUlZMRFRKUE1MRk9PSUVMUU1LUEpJTVBGSUg9NzU5OTk5OTo3Ojs6Pj44Oj09Njo/OD4/NTg5Ozc5Njc1MzMzNzYwLi0vMzQ0MTEwLy8oKSsrLTM4NTQ3Nzk8Ojc5Ozg2QTl4t6CjrqGmpqqgp6mnoqmwqKe0wbqxtbDJw7m0v8/AurGxuMSrrsmup6Odhpqiuaymp5WlpKOglo6WaVFNUlZaWlddXmJnY19ZV1dXWFhYWVpZWFlYWVpaWllYWFZXV1VTUk5MS0hHYlxNT1JNS0hGSE5RUU1QUlRWWFpgbW9pe4J0UEJAf5WRkX2JlIyEio2bjZaVipKIhpWGeIh/YEpRbniKkoR8hIyJhH9/bn5/lHd1dniEjZlwUY2Iiod8fniUdmh3hYh+ioiVio2QkpaLhIqIlISajIGEkpuWnpyUpKOoqaWjnpuwq6GkpJCmqpahqpyipqiIdGxlXltIUVFSTUlVTVNJTExQSUhGS05MTVRLUVFPRklDPDc2OTo4Ojs7ODo7OD4/OTk+PTc7PDY7OzQ3ODs2Nzc1MzQ0Njk2LzMvLjExNTIyMS8sJykrKiw0ODMzOTc5Ojk5Ojo6Oj85draco6edn6Guoaeopaeor62qtry2uLezwry3qLrJubepqre4rbbAqqKbkoOPmbGfoZmMn5aYlJGKjGVNTE5OT0xNUVdbXFpYWlVVVlZWV1lZWFhZWFhZWVlaWFhWVldVU1BNSkVAQJtrc3NJTUtERERJTk9oWU5RU1RVWm6DdHd+amldVY+JlIl0f4aBe4WMkoGSmYuPe4aPgHV/eHNudXB0jY6BeX2KqoV5emh2e45wcm14gYqMknh6gHuAdnNykndndYSEhIR6lYmIioyLgH+Ei4x/lIN7gI+YlZyVkZ+dqZ6foJ6gqaWfnZiMp6SToKCWnZ6kf3FnYFxcSlZPUUdLWFJPSk1NUkpKSk1QSExRTFJUTUVIQTw3Nzs5OT49Ojs8OThAPzo6Pj03PT03OTkzNzc5NTY3NTI1MjU3Mi8yLiwuLzIwMC8tKygoKS4xMjcyMTk4Nzk4Nzc1Ojw8N3aumKOhmJyes6mvqaWsrLCxqr20sry4trq1sqC3u7OrnZ+tq6y1s6WdlpKYhpOjlpyLgpeJj4mGhoNmSklKSUdGSEhQVFRUV1dTVFVVVVZXV1dYWFhYWFlYWVlXV1VWVVNQS0Y+OTNOPH6eTUhKREA9QURqlH5MT1FSU1ZedYN9eWd3jZeYjo99Z3mBdnh/iY98hJiSgXKHj3x2e29rfq18c5CKf3uGkoF9f3RmdnyFbG9oc3yJjIeAbHlxfXBtdY9xaHGAfY5wQ4qEgoOFfnd3eouFfYt6dX6Oko+YipKam6OWmZ2bnZ6inZaNiqSbj52XjpaYj3ZtbGViWlhYVFFKU1VUT1BOUVZLTktOT0pRT0lPT0tGRDw7Nzk7Ojo/PTk8Ojk5Pz87ODw9Nzw5OTk5MjY2ODU2NjMzNjIxMjI0LiwsLS4uLTAtKyonJyouMTM2Mi84NzY5NjY1Mjc5OTV5ppefnpagpq+srquoqbGvsay8uKy7vrmzraibsaitnJCXnqesp6SbnZOIln6OlZGVgHyKeoWAf3+BZUpHSEZCQENESUxMTVFSUFFTVVRUVVZXV1dYV1lZWVlZWVlWVlRTUUtENzhmNzA/qGlOSEM9OzpEioV6WkpOUFFUWF5lcHJtiKeqwH51eWJ7eG98eYiPeXyLhW9tjJF4c3hqan+CcpaRi4F9lYBKkphuaHd+gWxpY2x5hZCShmtzbHxucnuGaG1wfnONiIOFen1+e3ZvdHSFgnmBd3B8joyKk4OWl5iakJOWl5mXnpeMg4mfkYqSjIaQln5taG1ubldVV1RRUVpPU1VVVFhVTU5ITUpNTktDSU5HRUA6ODk7OTk6Pjw5PDs6Oj0+Ojg6Ozk/ODY4NzI3NTc1NTQxNDQyLzAyNCorKiotListKigqKCcsLTEyNTAsNTU2NzQ4NUhBODk1d5mRm5manqStr6Ksqqi1r66stL+rvMK/pqOalaWYno6FjJaipJuak5ePdpF+hYuRj3x4fnR9eHV3fGZPRUdEQDw+PkFGR0dLS0tNUFJSUlRUVFRWVldXWFlaWVlaV1ZUU1BMRTFAmjMganJBmW87PDk1PICChl9JTU9PUldaUllcYKeIYpppdHplfnBtf3qLiHWBiIZ0bJqRdHN7amudjkx5hJKJhI5nMXaGc2x+fYN0ZmV0foSEhYBmaWx1a3B/fGdwcHtuko2Oe3N9fHFwbnVtgn53eXRpeYmCiImDlpOSkIuNkZSVj5eOgHmIl4iGiYZ/kId1aWluZ2RXUVlXWFlbTVBVVlpZTklJRUpKSEdCQUZEQ0c9OTk4Ozk6OTw6OTs6OjpAPDk6PDk4Pjc4NzcxNTI0NDUzMzY0NTAzMS4qKispLCwrKykoKycpLCwyMjYsKzU3NzU0NzhpTzg7NW6SiJmRmpakqK2esp+muq6rsrDDsrvDx5uXj5SZi46GeoWRmpaPko6SiXSKhHeLj4x/dnd2eXdveHNpVUZJRD88Ozk6P0BBRERFR0pMT1FRUVFSU1RVVlZYWlpZWFZVVFNQS0U4MC9cYLNHOVhQOzk0NDGWuotITE1PUFFWTEFJUUlir7OgcXx4bX1tcYOBhYF5hIaGeXKglXR4gHN1lIc1cZ2onY6hoYSihHZwhnyHfHOMrY2IgGhmYmlucm1wg3Vpb1h1b46akXZsf3p8bXFtcH96c3VtYnaEf4aAhZCRiouKkouRjIuPg3V4i4+AfoKAfY95cG9ual5aXF1bWVhgX1NOW1tZWExISkZKRz9DQUJHP0NEPTs5Nz07Ojs7OTo5OTs6Pzw4OD06ODs2NjY1MTEyMTM1MzQ3NTUzMS4vLCwrKSopKSoqKikoKikrLzNETTIxNjY2NDM8dlI3PTdikoGSiJaRnaSnnq+VpbWprbGuwbO7wcaXkIyUkIGJfW6CkZOKhIuIkIh2hIVvmIqMf3l7e3J8dHxrb15KUEc+QDc0NTg7Ozw9PkBCRUlMTExNTlBRUlVVVldYWVhWVVRTUExFPDUqnUtbQC1nSTk0Lz+Sg6muX0dMTU5QTDdDTVJTREqGdoB8fHZ+bHaIiHx9hYN/jH52opl5foaAhJmFm5xhhqqfnYqCkI16dol+iYiOc4qXj4N7XGRxdHp7d4psZ2lheG+Fj4J6boF3c4R6cHN5d2tuaV13h32HfIiHj4CLk5eDjYaNhn1xhH+EfHV3e32IdG5xcmVmXltaXVNbZl5XUVVZXVZHS0tFTEc/RkBEQz9BQT06OTc8Ozs9PDo6OTk7Oz0+Nzk+OTk4Njc1NDI0NDAwNDY0NTY1NC0sKSsoJycnJigoKSkoKCsrKy8wMFVxPDIzMzMxRX5XND05XIx3iX+UjJGdnZ+mkaCroLGpr8Cyu8a6lo+RlIh6hnZrgIySg36LhZCOeYSCdaKGjX9/goBzg4F9bHlsU1hMQUUzMTEyNjY2ODg6PD9CRUdGR0pLTU9QUVNUVVdWVlZUU1BNRkA6Mj0gI5ZjjFs1MzExaT9Hb0lGSUxNT1JMS1RdWVJLaYSIe4l5e3F8j4x7fImGfpeHdqGZiIePkpSljaypSIetsK+KgICTioKLgoSRqYeAmJiKnHNsfIGGh32OaGdneH5uhYaBhXGEhkdrgHdxeXZobWtfd32DiH+IhYx6lZ6ciouJkX97dYt2fHdtb3d+fnJxcGpbXFxbY2JYZ2VcVVBRWFpRRExMR09JREZDQ0FAQ0E9OTg4Ojo6Ozs6ODg4Ojo/PjY7Pjc1OTU3NzMzNDQyMzY3NTY3Njg7REZMTU1MQzcrIiYnKykrKysvMDArbnUyMjQyMEyBXDU9PF6EdHx+ioWHkY+WmJKXoZ2soaa4r7O9tJeNkouYi310cH+Kk39+jYOUlX2Gf4eliImBg4iGeYmLgHWGeV9jV0xDNjAuLzIzMTIzNjY4Oj0/P0JFR0hKTE5RVFRVVFRWVVNRT0dDPzgwLCOHWz4/OTQuXZZwc6NVRklLTU5QV2BZcFpcX2qNk4eVgISChZGTfoWJkYGaloKgoZiVm5qlrZOZu7Gnu8fDp4qMoaWOk4mBkHxyhJ6fkZ1+doWFi4+HkGlob4OAdIyGhItxhoJ3h397doV9bnZ1Z4GVj4aJiIiJiKKro5aJjpiAe4KJenpvZ2t4fXh8cWljXVpZXWlcYWZfWk9MTlhTUUlRS0ROR0NLRENBRERBPDo4Nz08Ojw6ODg3Nzg6PT04PD02ODc1NjYyMzQ0NTU3Njg2NzxCQj88ODo+Q1FeZVxHMicmLCwtLS4xKD+MWy4zMTBPg180PztudnBneIN7gIyAgZCPi5uapJyhrKarr7CXkpGEoZSEeHeAjZR9f5KGk5Z+ioGSnI6EgYKMi4KKjoSAi4BtcGpeQ0E0LS0vLy8vMDIyMzQ3Nzk7PT9CREhKT1FSU1JTVFRSUE9IREI8ODcvOUM+PDw2My5sk5dNUEhJS0tLTlZgY39nZ251nZuPmpOTi42OmoiTj52LoKGSo6mlo6yTqLaiqMHDrsiveLqUmnyMoZ6YhJOFgo+hn5OZkoSKhY+YkZZscHWJi4GVjI2Pdo+EcWyFgYqWkoOFiHKJoZeHk4mPj5eltqmbjZWig4eThH5/a2prfX5+f3FfW2JeWWZqXGxrX1hLSE9TUU5NTEZJUURETkZCQ0VHQj45OTc9PDo7Ojk4Nzc2Nzs6Nj06Nzg1NDU2MzQ1NTY2NjY4NTU2MzEwLiosLCkoKS46UGFcQCwoLSsrMCwncog3MjQwT4RiM0A8dW5nWXCDcHWHcXaRhn6XlpqUn5+bp6CqlpOYnmhmpJp+hZOSeoGSiZKSfYuFmZKRg4CBi42JhpGHhIiFeHh/aE5SPi8vLiwvLi0vMDAwMjEyNDU3Oz9DRk5QUlRQUVJTUU5QSUVEPjs8OkNGPz48ODUyPD9SNUhISExMTU5SXm+KfHOCfaCdm6emopmhl6KVnJ+onqmrn6isqaq1l6u/q7bIybfJ0c++m6Bwaaupn4STkoWcoZqamqeRkYiVopqad3p+lJeRoZKWl4GUnnt2lZKrs4mNl6B9lZ6cjpOWmqSjp7awnZKaqIiXkI6BiGxzc3x9em5mXltfXmFnZGBnZ1xSRUtLUU9JSk1GRk1DSE1GRkNCR0RBOjg1PDw4OTk5NzU2NTg+NzU9ODQ3NDU3NTQ1NDY5NTg6NjE2ODYzLzAuLSosLy4tJyMqO1hiQigqLDEtKEuXXjA2M1GFZjNBQGliXlBxdWBufWF3jn18lI6Oip+Sl56WnKqYnqpCRH2HiYiYjXmCjYuOjXyKhpCQj4KDgImMiYWThYOGiYGAh3dfYlA0NjAtMS8sLjAwLi8uLjAwMTU+QUFNUVJTUFJTVVNOU0xFRUA8Pj1GSEBBQDg2NjI8OTtGSEdJSU1PUVlthpB3lYujp6q1vbilrqysqKm1rLG3srKtu7GzvpyzxKy7ycu4xL+3paOwsqytqqOLlpiFpqagopiCppmNoqqopIeFk6OgoKqgpKmOnLGLlaOnt7ucoaOwk6Odo56RpKKrsK2ztaKVpqqJmoqTipV6e36DfGVeZlpjYF1iY15mZ19bT0RKSFRPRklMRktHRkZIQUtGQ0ZGQTs4Nz08ODg6OTc0NjU4PDU0PDc2OjU0NjQ0NzM5PDM4PDIwMjU1MS8xLi0qKi8sLSooKiYlNVhYLywwLCwwhIE4NzFQhWg1QUNbWFRMaWNYanBYeoV2gZSFiIKbg5KRjJLayJ2Wc1aXiI+InI98hoyPi4p7iIOHkY+DhYGMhoWIkoaChImGh4eHcW5hQEU2NDwzLzExMC0sKy0xLy00P0RBTlZRUlRVVVdVTVxRR0dEPD4+RkhDREA4Ozw1Qzs9RktJR0hST1BXgZOghK6js6qywcfEq7PFtq20wLO4vra/tMG2u7ukuMaptsnHtr65tKijtK2wsZuZkpqfiaevqqSVd5+kl6GrsbOYlqmtqK61u7K6rK+1orGssrW8uLSutaCoqKOom6mwrbO6uLionLipjaWPkpOgh3mBgXNYX2JVZGBgYl9fZmBbVUpERUxWUUlKS0VKSEVBQEBLREJNRjw4Njc7PDk3Ojk4NjU1NTcxMTw4ODk1NDY2NDk3Pj0zODkxLjAxMjExMzAsKiwuLCsrKyooJyopRVowMCovK2iSTzYwUodqNkFFV1FKTFxaUWJkV3p1cYGVfYSGk3aGfoCNe7+7o7yCtJSTjpuPhIiPk4qJeoeBjJONh4WBjoCBio+GgIaIhYqHkXp5bl1XQEVOPDY6NDZBQjc2NC8vNkNIQ1FcT1FVV1VdV1BfVUlLSkFAP0dLRkZEOz5AN0Q3P0JKSkVHV1RQXo+krqSytMO2uMHMyra7xL2ztMG3uMK1v7C4dLG0prrFpLDGubGzsrSopLa2qrGgopabopKlsa2lraynpJigrLO6oqiyubW7vsy/xcW9vbPCt7q3v7i6uLqtrbGmsaquvrC9vMPDrJm7qJWuj5iZq4l+gHpoVWBfVmhjaWRWW2NZVlRJSEdMUUdESUpBSUQ+P0JCS0BATUQ5OTY2OTo/Njo5OTY2MjQ2LzE5NTk5MzY0NjI3Oz0/NjoxLi81ODo5NjUwKigsLS0tLCwqKCgrKyhFUy8qMDBKj2s1MlCHbTY/RlJMQUxSV1RZVlp3anB/j4SBjoVve3J4iGK5oZmjiZWUlpOUlI6Ql5KHh3uHgo6WioGEgYp7fIuIhnyKgoGLhJV9eHp1Zk9cZEdFTDpRZGBbXlNGPztIUERaY1FRWVlaZ1pUYGFNU09FQT9JSkhFRkFAQz1FNkI/SEdLTVNaVF6Ur7i1u7nJwLu9ys28vcG8uLa8vLe+tbqzxmF1sqWxmp6rvqqlqKuqpKKytaCrqJ6Vlp6Yn66lp6eln6SToqews6iysry2wb3TycnTxsLFzMLKxMC+vsC8vLi0sLm3t8O6xr7EybCeuquirI+lqbeJgHxvXV9fXVVfXWhlU1lhVlJWSUVGTktBPkhFPUtCPUJAPUY+O0hANzk2Mzc5PjQ4OTo1NzA0NS8yNjM4OTM3NDUyNj84QD5HS1JUVFJQT1FSUUpBOS8sLCwqKygoLC0sL1A+KC40OIB9PDJLiHE5PkNLRUBKTVBSTFFdaG1scY+NhpBzbHJydIjVwLWaoI2VmZmRjpeSlpaOhoh9h4ONlot/g4CDeXuLhId7i3mBioKXf3R9emtlcHZZXVxQZWViYGVkXVtYWFxNZG1VUm1uX29fWGdlVVlVS0RCS0tIRkhISEhCSTlEQEhLVFRWXVpck7nAub64xsG7ucrLu7e6trm5tLi1ta62t5lkdamerXBeoq2cmKGim6Seq6WUn5+QlI6WmJeonqafn5qZg6SdrKSqsa23sLy41NDO1s/JzNLMz87Kx8C/wsq+wb3CwMXExsrAyc+0pLyxtbCcrLm9mn12aVteWlhbXlhiYlFbYFNRS0NCRkdFPEBGP0JJQkBEPTpFPj1KPzQ3NTM1Oz00Njg5NzcwMjIvMjQxNjk3NzU1NTVEM0VMTT41MTAwMDY6NDc3QElPSjsuJioqKC0uMCxATSsvNTRtiUkwSIl0Pz5CREBDREdLT0RSXFppYG+XkpGUbmxvdHWHs6yhoZ+LmZyZjY2VkZuShYqKf4iHjJCMiXyBhHN7ioOFe4p0gYqHlX90e3lsbXV8aXNlaWxoZmppaWBmaWltWm10l62kvYiHZ1tvaF5aWVRIS09QSktRTFRRSExBSkdLUF9fYmdqYpe3x7C6tLu+trHFx7awubGxu62zsairuK2NtqienKeaTpqejI+glpGnmKWVipOTiZGJj5GSnZuhmJuVloeemaaarLCor6ezs9PU1NbRy8/T1M7Tz8zGw8rQv8rJy8nSyM3Ow9DSuLDEvcS6pre7xKJ/bGFaW1xXXlZYZFlPXFdOUUNCSUVDSTxBRD5CSD9AQjg7RD5AST01NjY1NTs6Njg3NjU0LzEwMTQ2Mjc4ODc1MzY3QzVCOD8tMCwxMzQ4PTk3LC4sMTtGTD0pLCguMDAwN0s/LTQ2VIhXMESHd0M7Qj5FQkFDSk0/VVlTZldzkJGZg2hyb3l5g6GqnqaXjJubmIuOlZGajn2Ji4WOioqLkIh8hIJwf4eBhnuHcoOSi49+cXl1bHB4f3J7bnhzbGmAcG1jaW5weWl3fX7Lv8Pfp25jeG9kW2FgS1BSVU5ZX1BeXU5RTlRRVVRcbm53g3KWrristaiwtqutvcGyq7WmpbmorK+hrLSkj7Gum5iYjJGUkYSPm4GNp5GciYOLhIqJhIuDlJWXl5SbkJyYmZmenquspKeirKzO0tXRzczS09PQ1NHOyMPU0cjO0tPT183S0cXS1sbBz8jIw6m/uNCcd2xjW2BbVV5RXFpPT1RQTkg+QUdCQ0Y9QUI/RkU+QD86PT09PEpCNDU0NjU8ODg4NjY0NDEyLzAzNTI2NzY4NTMzOz08RT1AMTErLzM0OT81OTAxMDIyLTJFTzMpLzMuMzI9TjI0OEN9XzJBhnREOj09ST5AQ0ZIPFZSTU9bdYeGi3dsd3B9foCgnp6hjI2Zk5SLjJOPloV5hZCQjouKiJGHf4J7cn6Agod6hXaFk5GJgG93c2xzfXx3fHOCeHFrgHJyaXByenlze77Lmn+NsoR2coV3aWFqXUNaWltXZmRYZWtUWF1dYGNeY3h7f4uBmaqkpKKgoammqrG5q6a0o6KuoqSuoqexn4mmm5WTkYqSj4iClIlrlaKNmYSBhn6Rg4OTl6yLlY6Vmo6GkpGdl6ewoqChpaSoyM3Px8LL0NPR1NLO083G1tPN1NjW1tjV19XK1NrNytjW0cutxMPMiXBtYF5dVlJXUlpPSkdKSUpAOzo7RUJEPUNEPkhDP0NCOzw5PDpHQzQ2NTQ0PDU2ODc1NDMyNTAvMjU0Njc0NTU0NDw+PUU/QTYyLy0xNjs9MDgxLzI1NC8tLjtSMDE3LzUzMkVEMjg+bmI1PYF0TTk5QEk8QUQ/QTtQTEZLWXCAdX5pc3lygoqAnZWelIWLlomPiomOiI+AeISUmYuNiIiLiX6DeHN8fYSHd4B7h5GXgYRveHFtdX92eH10hnx5bId2dW59doV2eXudtYw8QYvGpX6NfWplV0lDZWNmY2hqZG95W19maGtuaW6BhImRjJ6foJ6Rl5mgo6SmsqSls6CipZ+hqaGisZyHn5KSk5GLjouHhI+EfpycjI2ChIV6lH+DqpajjJKLmJOLfZeKmpGqs5ibnKecpr3Dxbm2xc3R0NLQy9LLydTP0dXa19fY1NnYzdjbzsna2tLWv8zNtHV0bGJbV1FTUFhVRUZKSUVFPTo3OkBCQzpIRUBFREJEQTs/Ozs3REM3NTY1NTswNjg5NDQzMzQxMDE0NTU4NzQ0NDQ5QD5EQkM8MzMuNkZUV09RSkFKRj8yKiguQlQyOTI1NC83Szc1PGBiQTxzdlY4N0FIOj9DPjw5UUVDSlRsbm9wYnFxdIaNfZeRnox+h5KDiYaFioKIfXiFl5eJj4OHhod6hHlxe3uFhnV6ho6OnXqNcH1wcHqAcnuBcoSHgG6OenV3fX2CdX98h4mwdFmqwreNkoJxbmM9XmhycHFwbnh3gmVpb3J2eHJ7jIePk5KblqCWiIyTnJ+bn6ugoaycopqaoKafn6yZjJqNkZOOhX2IiIOFi46gmZOIg4d+bJl5hJmHiJOMjpWMhnubiJOPrquUlZefmKautbyprb3Gy8jJy8vPycTSytTX2NfY19Tb19PZ29bP29rS1snVzJN1eGZlWFdOUVJcR0JFSUk+QT49ODo+QDw+SD1AQkFBRUE+Pzo4N0RCNzU1NDc5LjU2NjQzNTUzMjMyMzY0NzU1MzQ1OEVCRENFQjU2PEZOU01bbmZjbnNrYFY+LDRMRzg2NTQzM0JGND1XX2hMdXheODs/Rjw8Qjw6OUQ/Q0dSa19tZGJmbHaAiHGRkJuAeYCOfoOBgoV/hHx9hJiOh4t+hoeBd4N5bnt7h4J0epKejqF2j3aDdHWBfnSAhG+BkIJvkoV1fIGFenaHfIm4xqXDyriClpyPeHBmTmVjgnuBd4aikIt5end7hIB8hHVtlJaVlpCYkYOJj5eal5emnZiglp+TkpejnpqrlpGRi46Tg4yFiYmBhpCRnpyZiYWLgYaXe4iJn5eQiY6Ki4J8oYmQi7yhmJOXmpyopqWtnqe1vsC/uMbJzc7FzcrR1tXU2dXX29TX2drb19va2djO28aDdnZkZmFdUlVVVE1LRE1EOz08PDk6PD85PUE3Pj9APT8+PTk4NjdDQTY0NTU9ODA2NjU1NDc3NDU2MTM4NTQ1NjQ1NjdISD1ESkU3OTI1O0g+Ozk6N0hQXFpSVVhLOVQ+Ozk1MzI3STg9TllNSHh4ZDU9PkM9PEA6Njo+PkBFUV9ZZmFdXGl0enlsiY2Sd3Z6inx+gH+AfoV7foKRioWGeoWIfHZ+dW19fYd+dH+SnpGfg5J8h354j355i4pvg5uBdJmGfYKKhXx+kXuQqY+Qw6C9jJuknH6KhH2Jc4yLf3OmmpyYlIV7j5GJhGlHcaGknoyMkZKFiIuQkpWPnZuTlJGXjYyVn52UoZWSjo6RjH+Qj46LhImTlpqfn4mMlJKdkYOMf6aZiIWOg4aEgKWGiou4mJ2RlZahpqCdnZ2jrra6tKvAxsrQyMfNz9PS0tjS1dfA19jZ29ja2tnZ19u2dnV0Z2ZiVF1ZUk9PSENMQz09Pjk5Ozo5OTw9NkA+Pz09OTo6OzM3REA4Mzc4PjcwNjg4MzU3PDM3ODA0OTc2NzU1NTQ2RlA1RE5JODkzOEFLPTszQ0BJPDlEV088TVRITj85NjMzMz5DO1tYPjVZeXBaPDxBPD0+ODU4OT88RFJTUlhfVlhmbW1taYGOinFzeIp7e4B8f3yIe318i4eDfnWEhnpzenNtgX6FfneGm6GbnpSSgIyIf5iHgJySboiphXugjHyRjoOJhJx+m5GKjaOin5Gkr6CLkYuGi4GThldyrYufq5uQg5mckI+OW4OikYKNn5OUjIaIjJKSjJSVlZCMj4qIlpudj5WXkoyTlIaAi4mTjoqKnZeZo6KGk52WoIuKiY6dkIOIj4CDh4WlhYuQs5ickpSXoaCemZKbnaexuKykvcLHzcjGz8zQzM7Xz9HUrtbV2NrY2trX1tnanWx5cWNjWlpWUVVXQ0BJRD8/Pjo0OTo7Nzo7OjM8PD89Pjc7OToxOkc9OjI3PUA1MDY3NzI1NT82NTs1NTg1ODo1NzczNUhSN0dPSzk5ND1FSkI+MUZDTEE5ODpHWEA1SFdJNjYyMjM6RUNlWD8mX3lpX3o+Pjk8Ozk4OjtAO0JRS0tTWVBUY2J4bGJ+kYNvbXeLeHp/e4F9h3x8d4aFgHNwhYJ7dXd2dIWDhX1/kqain6ail4qdkJSXi4qol3KKso2EqJKEmZSFmoyjlqCYk4mbnqKTqbCgkZWRjo6IloxvjbeEmsTIspyippycmJaRsZBkpM3HlY6Gh4mQko2Nk5WKhYqKhpaZm4+QlJOHlpiEgI+LmYiOkKqXl6SiiJmelpqJj4eYmIqFj42Bf4ePpYiNk6ial5SWmKGYn5mTnJqisrSlo7zBvsfGxcnIycLK08zN1KjS0dbW1tja1NPazn9ve2RgW1xbTUlTWUJBR0Q7Qj44Mzc8PDo4PjY0Ojo8OjcyPzo5MjlJOj42N0JDMzI6OTYyNjQ+PTQ7PjY5NDk7NTc5NDRLUTxKUUs5QTdCR0lANjRKRUxGPjs4OEVUQTc+XDg2MjE0OjtFYFhBRmF0aExjWj41Ozo6NTs6PTpFTUZIUldTUkJjgkd2gY59fG1+iHh6fnuCgoN/d3aBg3xtbot/e314eHyFh4p+i6Kzp6Ors6KXp5+lpJaVrqKDkbiVkrOajKKhjKWbsKOknZiRp5aomayvpJiVlpWQi5ial6HAjqPJuKuco6atmJKbnbKdhYaoopyYhYmJjpWMi5OPiIGGh4mTmJWMi5STh5WZhoSRkJx1kZizlpeloYedmpOPi5CKl5uJi5aOhn2MmJ6JkJCcm5qTmJefk6CdlJ6boLGuoqS3vrTFx8S9w8PAxs3KydOmzszT0tHW2NPQ2LpvdnJZXlNeVE5ISU1FQkNENT46Nzc6Pzw8Nz00MjY2OTc3ND41OzU8TDw+OzxCQTc1PDs0Mjc3P0A2P0A3ODQ5ODc7PDU1T01EUFJMOEA9RUFHQTU6SkVORUQ6NkFAQlM+OURPMzIzNTc1PXZcPFJcdGlaTV1TPD04ODU2Nz06SkZER01aXFlKZmA7SISLenpuhYZ6fIR4gYaBfnB4fH59b3KNen6CfHiGi4mGhJKmu62osr2wpa2zs6ijobCsipq1naO4pZWtpZeprbinpKOfmqmYqqSusKqamZyUlZGXoJiau7uuyqFqt7irsJSZn6Osk5e+o16qsoOKio2Uh5B8jo59g4aOj5SViIiTloyQlo2LjZaYk52ZtJeWq52KnJSSjpGSjJmbipKekIuJlp+hjZSNmJqdkpyYnpShoJScnaWvqKGls7iswsjEtrq9vMXHx8LRoMbJzc3F19bRy9OfbXdlWVdQXFBORUM+PENBQjhAODg1P0c9PTY8MzUzNDU0NTRCNDk6Qk06QjtBSEI7OkA8NzQ2PEI5P0BCODc0Ojo2Pjw0N1RLQ1VRSjc8OklBREA0QUpITkJBPzZEQTxKTkQvVD0yNTQ6RUpcWEpaUW1ncHBEaWBLSTY3NTc6PkpAQ0lQZEhiYGJwSkCLin6Ac4aHfYKIdYOKgn9ufXx9f3B3h3eOgod8jY+MhoyZqsLAr73Gu7O0wL20rauztoyos62tvaubu6Worbq4q6emoqKko6mvsrGrnZykmZuYl5+ipqaSpLqvqcC8ra6yuaWkqH6IhpytvbCCi4yLkIOOg5GPeoGIkI2NnImIj5eNi5WWlJGal52omrGakaycjpqPko6VkJCWmI+SoZGJlJukrJSWj5ScnZOhnZuYn6GUmp6npqSipLCzp8HGw6+wurfFxMO/zabHxMfEvdbQzcTKhXFwX1lXXFhMSkFLQUZHP0FAQzs6ND5BPT01PTY+MzQzMjQxQTE3QEJOPkdAQ05DQT1DPTs4NkNDNUJJQjo4Nzg7NUI+NzlWS0RXT0Y4PTRLQEM+NEVLSE4+QUE2QkI/QlNFNThQMTQ1Ozw4O0Q+OUxqal07V1JkS2daVU83OUdEP0NGXGVGYGlnWl1ck4yMiXuHjIeDjHWHkYqBb357gn9xfoF7lXqSlJSYkJOWp7PGyb/CzMLDuce9u6+rubuYs7e6ssCupcGkq7C8vaquq6OjnqerrrSwqpygqpyhnJafsLWojKO6urbBvKypnbOlpKiUhY6pxMOkgouPh4iEhpWUjXmDjZGPkaGMjJSSjomXn5iTmZWYpqCvnYyrnI2Wj5KRlZWOkJWSj6GUhpefoLKelJmToKCYpJ+aoJuglJiepaSmpqSvrqbAxMOuqLe2ycO+ts+yxL/EvLPRysjCtHJ2alpVWWdQTEhCTEtMSkFBPkREPDVBRTs7Mz04QjMzMjI2M0EwNUlFTj5JQEhSQEg+Q0A7Pj1GQTVBVUA7OTk4PDdFPjg+VkpDV09HOD80TEBCOzVKS0NMP0I/PEJGPUFITDkrRzwzNjc0NjRBPzdPYU9hRS89PjZrbGpgQDpIPj9FQmVaTWVcZlRia5mNloqMiJOQhol5h5SQgXKAe41/eIeCgpB6jaGWqJqambq9x8jJwdLJysLNvcKzrby+qLvAvbvDt6zBqayzvL6qsKqkpaSsrrOttrWgn6+fpaKYo7O9qZuovcGktriwrJSyrKysl4eaqaalkYKMk6WWioF1ipJ5hY6SkJ6gk4+TjI+NlKOZlpyVlaOeqp+RpZqMj4+PlZaIfI+Wk5KjmpWfoZy1pZCelqWjoqWenaaYnpWXm6SjqaeisqyovMDDr6Wzt8y/ua/Es7u+wbiswsPCwJdqd19WVVlYSkpMSUZEREhDQ0FETDo0REk6OzQ8OEUuMTIzNTJCMjVTSE48SkJKUUVLQ0RFOkVMQjw3RVY9Oz04OT88ST86RVVJQVdRRzdBOks6Qjc5Sk1CSUBDPjxERzxCQ089MjBIMzY2MTcwPUI6PWpqSks1UVMzU3BwZE47RD1ARj5pSF9YYlpjY1aej5yOl46ekomKf4qgk4R4hX+Wf3+QiIqRgJahma6npJjCvcfDx8XTzc7Ny7zCt7C6vLS9y7zDwba3vK2zv7q9rq+ooKmotq2uqbK3m56to6ihnqu3uKqlsL/Fsr66tKirtrSurpeWpayon5GNkrLFp5aOfJKVfIeSmY+qmZiTk4+SlZOknZOdmZSho6KcmJ+Yi4yPj56IWpCWl5KXpJllmKOfsqWVoZarq6mnm5+ml5iWmJWhpKiln7arqrq7w7SltLXLwLiqtquyu7iuqLi6vbiAaGtYVVNTTUVJUk1LP0FIRUVISEg5NUVNOz44PUBKLjMyMDI1QzU1T1ZOPExGS1JMT0hHST5JUT86OElTOzs/Nzk+RExCQEhTS0BXUEY6QT9HNkE3O0hNQ0U7Qz00RkU6QkFCRzkvOkEzNjAzPkdEOTQ9dGRNRztFKzpmfGdWOz5AQkZCcEVqSVJlYUxGpZScl6KXqZaMkYOIppOIgoeCnISDlZCQlI+aop+vvq+hx7zExMfGzs7O0sq+u7axuru8vs+1w724ubezsbWzuLOrp5yrrLmqqaevr5ijr6WnpKW1wLGsrLS/w7rAurSoura5tK+Wpa2urqSLk5ShjXTCmn2XmYSOl5mMsZWbmpWSkpmZpaOVoJuXmqmdm6GgmYqNkJacYEqWnJqVmqWWVZewoK+cn6SUrq6rpZqgpZSTmJiNnKCnopq0qaqzu7u7qrGyx8C5pqyrrbKyo6GysrSkbWtjWldNT0pET09QUjtHS0lHSUNDPjpLVT9BOj1FTTA3NTM0OkI0NE1XTzxKS09VTlFKUEhISk9CPD5NUjs+PTg6PENSPkRIUklCV05JQEJBRjM+NThKS0NBPUM7NEVBOkE/PkhANSpCNTIsPmNdZzozNXRkZUBSNyYjM31oVzs6QkNAPVFFV1NzYldGSKqWmaCiqLCZkZeHi6iWjoiThaCIhJ2Xj52hm6Oltcm1qca6wsPIysnIzM3Gv7uzrrm5wcHMtce6wbm1urCvr7O1p6SbqrS1qqmmrayapK6lpKisu7+orLa3v8G/vrm0s8Syub6to6+1rLmmiJuXppt2v5+EmZ2Ok5qajK6XoZycl5SboKGonqifmZqqmqGnnpiQjZGdg252kqKalZ2inZGusqOqlKiql6qto6OfpKiRkZmch5Sdop6Wsaepq7m2vbKyrr65tqCjp6ilppybrampi2BjX15PSktGR01KVkw9TUVOS0xCQ0Q8UVY9QUFCRE8xOD03Nz9CNzVVWE8/SE5RWVNQUVVLUUpKRUFFTVE/Pz04PTtHUjxFRFFCR1lNS0FIREU6OjM5S0lCPkNCOTlDPjxAPjs7RzctMj4tMYJoTnpcLzBraGA8PUJCODZ6Zlc7Oj0uLVJgTVVIfmVeSEWrlZuhn7uvmZWfjJOrnJGSk4mrjYahnoyjrZSjpLbGvrTAusLCx8nFws7Iwr65sq+5tcHCyrXFssG8tbqqqK2tsKOjmKq0u6appquqnamvp6Oqq728qK29tbi+x7y3trjBsr7BtKq1t6u+pZCjmJKioL2fiZqgmZeeno+3n6mcpaKbnKGaqKSzoJudppyoqp6YlY+Um4uXiYykopSdop2gta+lpJOvq5mqqp2do6OokJSUn4KPnp6clamkoaGztLq0rai1srOenKOlmpeVmKqhnnVdWl5cSUdFRk1RSU1FR0dCU0xKQkVHQVZTQ0g9QUdRMTtCNzpCRjc5XFlLQUxQVFVTTVdSTlVKRUBKSk5POUNANT08TlFDPz9QP0VaTUpBS0RHQDUzPUlHPz1FQTk3QTs8QDw8M0A8Lyc7KkiRQjpTSjAsW29XNzE8Kh1CgWRUNDktMTlmXEZDQ51wYkdFp5ekn57DrZyXpZiaqpyWm5uPqpaVp6aVrayYoqu2xMK8vrfBwsDHxL/Nxru9ubKwubO/w8i1v7C8trm2pqSrrK2hoZqqq8WipKmrpp6sr6uiqam+uKetv7K4t8e2tbm4wLPAwri1s7SvvqOXo5eUnJSun5Cio6Wjo5+QvaSpnqisnZ2hm6WevaGZo5+iqayhnZeNlZ6TnoePhI2Tn6SgnrWspZyVsaeZrqadmamdn42YlJ6DjqCam5KlpJqYq7G1saqlqq6sm5igoJKPkJWonpRlX1dgXE5IR0pOTEhFRElBPlFJQTxHSUhcUk9LPUhPVTRCRjk+SEc1Q2FbS0JOUlVXVlFYVFJVSUA4UlFQTTpHQTRDSFFTSUM7Qz5HVktDQE8+SzwwNjtHRj47RkE0NkA5Oj85OzE1RDAtLC9Ndlw0S1o1LE1uVzwtPSkeI3piUTVDS1E5bVJGPEt4ZWFWS6Kao5yexayhnqyfnq6gk6OflqSgpqmsmLaxoqqztsXEvb+1v8K7yMK/yse1uLW0sbO0t8HFtr6xuLW5tJ+nrKqsnZ6epaTBpZ+qrqClqa2voqaovbWmsb25t7bEs7S4ur+0xMG5ua6ztbWjnaWVkpShrqCZop6oqKujmsKsqZ6srpubnpmmoL2hnaSYq6yspqKajZqfk56Jjld/lp+loaC4qqaTmLWjnrGgn5qulp2NmJOcgY6fl5WOoqSWkKatsqqpoqKlpZWVnZiLj5GSpJ6JX2JYYl9LSEpKTkZFQUdLPz1KQjk5SkpOXVFRST1MVlw5Rkk9RE1JOEhiXExDTFBTWVlWV09aXklBPVdRSUs/SD81SE1YU0hBOkBBRFBIPz5RPks3MDk5RkU7OEc/LjY+Nzg+NzcvMT85MSUxUVVtW0pPMTA9Z1dEMTc9LSt3YFM2U1prV3JHRTY9dWVcS02en6GZnsSopaK0op2zqJOrpaCjn6yprJ27sKistrHHxcHCssLDvcbEvcTJvK+wtq2wtK+/xLS5sbC5tKyZqLGpqpqdpaGnwq2brLGcqqOusamkqL22p7e7vq+3xK20s8PAtMe0u7istLatqqKmlpWVpKyin6Cbp6uwr6+7sqagqamZmZiToqO4oKGjkq+wrKWnn5KhnpWekJCNlZ6aop6ns6amjJizm6Ktmp2brJCdk5WSmX+RoZaPjZ+hlIumq6+kpqKcoJ6RkZqThYuRjZudf19kWmZkSkhMSlNCQ0BJSDs7Rj85OU9NVV5SU0o+T15dPUhQQkxMSTlNY1xMRUxSVFlbU1VPXGJIQT9aUUFIQUtCN0ZFTEtNPztCSEROQj07TkBBMy85N0NCOTdGOys2PDQ2PDI1LS80QDErJ1Z0U2VPPzEwNGJbTTIzPjA8dl1eP1tUXmVxQDg7SJZ3ZUE0n6OgnKDDqaSqs6KktaqWs62noaSyrK6pu7KtsbW0xsDEw7XAxL7JxLW/yMK0q7WosLmsv8Szt66strmlmKqyq6qYn6aXrbu0m6iwm62grrSyp6u5s6i6tLmzucCqt7LEvrXHqL+vrra1qaesoZiXkqaloqKYmKWvuK6ytbagn6ikmpWVlKSgt6KlpZavsrKnqqainpqam5aYqJ+gmKGerrKipo2Xrpikq5aZnqOQmoySlpiFlZ6UjI+cnZSLqKmqoaehmJ6Vi46Zj4GFlIiTnndiZ1xqaU1PTk5UPkNBTkM7Okk/NzdST11fUlZRQVdgXEJKU0hWS0g6VGRcTkZPTltXW1JQUVhdR0FCW1BCRz5OQzlIR0hPUD8/Q0lCTEI8MklBOTQxNzdCPjs3RTcrNjkxNDgwMS0vLjw2LSNCcWdzazIzLzFbYlozMzgwNnBbYkgwNUlvaFVDV0aMeWZDO6SjnaKmv6enr7GhqbarnrqxrKOrtLaxsLm3sLe4uMS9w8e9vcTCxsC4wMXAuqm2pKy7rcHCt7eprLG6opStsa2ylqSnkaq5qp+msZ2roLC0s6qptratva20s7m4rbmxw7u/v6bEq7G3r6mrq6efmJmroaKhkZiisa+zrLC5mpypoJqXk5inoLappqOisbG0rLOorJ+boKCbnqWcopedo7Owmp+Qk6Wan6iZlKKdlJeIk5aSlZack4iQmpmUjqmopp+jnJebkoWOmYt9i5WEjZlpZ2tgbG1XUFFbVUFCRVRAPDtJQTc6WFBkXlBXV0VZX15NTFJOXktKPlpjXk5IUE9cVVlQS1RXWkk/RFhQREY/TkA9SUdHUVBCPURGQk0/OjFEPzc3NTQ3Pz05NUU0Kzc1LzI2MS0tLiwxPSonKz1ccD0+MS4wZFpkQDE2NDdnWWBGKD84bH1nW1Y7iXtjQz2on52iqr2iqrCspLK4qqa2taygrbW9r7O4u7q+t7bAwr/IxLnFwsC/uMS9wbevtaert7K8vr60qK6xtp6Wq66orpemqI6nu5+lrLOfrKKxsLOsqra0tb6usLG1rLC0s8G7xresvbCxuKytqqOypp6lqp+kl5GaoLOqs6uqs5qdp5yalY6hpqS0rqihra6usai0rbKqpJyfqKSelaKZm6i1qZaZkpKdmZ2fnZCrnZaXhJSWip2YnJOKjZaXmpempaOfnZaVl5J/j5SFe42SgouVZGtxZ29xXkZZZlZEQk1YRFo5SEI2PlxRaFxPWV1HW15dT01SWGRKSkNcYl9QS01OWFdYUEpWVldMPUVVSkVEQU1AQUZISFFQQTtGREZLPTg3Qj02ODcxOT48NjVEMCs4MC8wNS8qLC8tKj0sLCUyKyo1SzEvJ19fYFUxNTA9YFZeOClDM1lVXGdLNox6ZkxApJqhpa23pa2qpq+ut6qvtbunprG3xbextr3BwrW1usS+zMa5w8C5vrnDuMC5srSrqbq2urm+tKqtsLWYmKesqqybq6uPq76erK6yo6ugsa2zrq62srm4qq6vsai1r7W8vcqzqre1sbSvrqehtKCbqK2gppaWmpqyoq2gpq+XoaSampOOo6Wos6mhprOsq7alr7K1r6SZnaynmpifmpmrt6OXk5GOl5yhl5aUqp2akX+Sl4ydnJmWkIqUk56ZpaKioJiWkpOVeouPhXuMioKKkWptd211e2FFYGtZSUhaWj17SkZENkFiVGlbTVxhS1xdWlJSUmJgTEtFX2BgUUxJUFdWVU9HV1ZVTjpJVklIP0NLP0VESEhRTkE/SEhIRTw3PT46NzU2MDk/ODY2QiwtOCwvMDQsKCwvLSo3NikoOS4kOks1LiJUX1RfLzUoQ19RXC4rQi9KR1BbRzNjWVRLRJmXobGpsqqtpqSvrrapt7W6pKy0t8m7tLu6v7+0s7fDwMzIvMO8tr2/v7e/vLG9rae6ube2wrarrLG3lJanrquoo7CqlK+7pK2xs6eoo7K0sbKxtbG4tKmvrLKnt6+3tMTGt6m2tqywramoo7agoKexoaSUnJmVsZ6nnKCqjqmjnpuWmKampbino7K1rKiyp66xtqylmaCsqJucnpyUqbiclI6OipibopePmKWgnJOCkJSPnJuXlpWIlpCYmqecpKCSlpGQlXaEj4d7hIGDi4psb3Z0e35cS2VtXEpOZFw/YntHSThHZ1dlXExeY01YWVdVV1RpXU9PSGBdX1BKSFFWVVJLSFdVVk04TVpORUBGSz9IQkNLU00/P0xPSEA7Oj47NjswNDE8PTQ1OD8pMDcpMS4yKSksLC0rLTkkMDQyJTlCNy4jQU5HZjI3J0diTFYlLUIuPUVMUTwzcmtJQ0ORmqWvpa6vq6ilsbO0q7eyuKGrtbnJua3Bu8K4s7G1wsLOxcDBvbS9v7+6vryyxKepubC2tr+8rquzsZygp7GtpqavpZ2yta2rsbKsqai1u6y1s7WttK2qrKisqbmusrHIwLmlurCprKylqK6xpqWjr6SpnJ2cm6+ao6Ojo5Gtn6SgoKKrpqe5pKy1tqWrrKmtsLauop6jqaqboJubkqS0mY6JjYeQoaCUjJScn5KQg42Skpyal5WTh5eTlZmnm5+ejJKRjZB2fY2FfHt8homIcHJxfXx9XFNkbl5OWWdcRkSWW0c7Tm1YYltMYGJOVldWV1RYZ11RUkxjWVtUS0dPVFNOR0lWU1xOO1BeSUJESEpBRT8/S1NPPjpOTUM8PD45OjU9KzMyPTYyNDk6KDQ1KS8rMSgpKywtKiY1Ki8mMCkzODoxJiozQmM6NipIZUhKKzpIPjNCSFMsPpBrO0dIj5yqq6KqsaWppbO1srW2srKhq669zLqtwLrHsbSttMLD0sXGvsCyvsDCu763u8SnrLessre8wK+rsaygo6etqqiksKOqsqqwrLCvsK6rs7ynt7GyqbOqq6Wlo626raqyw7q2rbupqaesqaiypqqko66qqKKenKOtlaWemJ6ZrJ2ip6miraakrau4srKhqqKgrK+xrJ6gp6epmaOZmY+gppeGhI6Ki56gjoqMlZqOjYSFj5SfnJSXlIaWlJOXpJycnIqSkI2Jf36HhXx2foWEhXJxcIh1a19ZYG5iUXNxXEs7hHxGP1d0WGFaTmRbTlZWVVdRXGFeU09OZ1hXVktHTE5SSEVJVlJdYzxQXUQ8RkhIQkc/PUpQTDo+T0o9OT89Mjo3OyoyNT4xMDQ4NSg1LyosLjMwOyksLCclMjM0JCwyLTg2MCkoMTtcSjAuSmdERjg7QjA1RUtYMUCVWT1MRZWYraiiq7Ocqqqwt624tq+rpqurvcm8sL22wq+xrLPEw87Pw76/tMDCw7q/s8jDq663rbK4vr6yra2rpKeqsKinqLGltK6rsa+tsrG0rLS8pLizrayvqKufo56wt6uqrbu3pbe2pKmnq6uqrqGpp6axsqSnpaGhrJeqoZWboKaepaKrpK2jn6exuK6uo6ajm6qrrqmdoqWkpJifm5aPmJySgYKPiIWcn4uKjouYjY6JgouXopuRkJqLk5KRk6OZm5qKjouLfYaBgYN6c3+CgHxydYukh3hrXmBuZldlh2NOP2eTTEVieVdiWVJlVE1WVVZUT1xdYVVLTmhWVldJSkhJT0JHSVNRWW9BTVhAOkpHRkVHPj5FUUg4Q0tFODdDNzI6OjoqMzk/Li80NjMpNCsqLCsuIzQuLSsmKCs3OSomNis8LTIsJjA2VlouMEpnQUE8PEIrOkpPXjREhj1HRkSXk7Gmo6yxmKuqrbastrKspqyqqbzAwLe4sru1prKvxMnL0b/Au7m/vsG5wbnAxK2xtbGzusC+srCurKqrqLaqpq6vqrmwqLKyr7Ott6q3t6e0t6uspamqnKSetLOpqKS0taC3rqCqqKqoq6egq6ypubWpqqmpoqqgrZyTqqGdoKWipqOqn52ntK+opqqjo5ilp6eqnKKko6CZmKCRjo+YjX6HjIeDnZ2Gg4qKjo2Oi4KFlKKajYyZkJKRj5Ofl5mWjIqDf3SGgX9/eHSCfnl2foCHnY9vcmdncHdcYXOIa09emVZIbXhVZFZRY09NVlRVUE9YW2JVSE9pVFZTR1BZVUk+SUhPUVB4TE1WPTxLRD9AQTxAQ1VDOUFLPTU7RTEzOzo3KjQ6PSstMzQxKjgqKisqLCkpKC8qJiklMzssJDIpMjAyMSYvMlFiMDI/Zj1OWD5DLD5MVF8vSmk1T0Q8lo6xoqarr5qspa2wtLWwrKawqqi6vrvAsK65rqG2sMjHyNHAvr27u8G9usLAvr+usrKxtby7wrGxs6uzqaS1qKWts7O5saOuuLKwsrururCqrrarqp+qrJ+joLatqaGfsLOitaqeqKepo6qhoqytqL2vrK6toqiooKyZkLChmKKgp6eeqJuZqrGqo6CuoqGUo6OjqJiaqKWYl5iej4qHlYh9jYaEhKOWhIGBi4aNi5CDg5OfloiRnJCTkI2RnJSXj4qGhnd0gX98dXh5f3lzc3lnf4akdmlfZWuAdGeIjH1TWG9eSnhzU2RUUV5NTVJaZk5MVllkWEdSaFJRP0JOUWFROklITFNJcVFMUzs8ST87PD07QEBXPDw/SDczQ0IxNTo5My01OjopLTMxLS01KSgrLSw0MiMyKScsJS47LiYxLjAtMTQlLDBMZzo0OF89YWQ/RjFDUFtbKkhNOVVANJGQs6Glp6ykp6Stp7WzsqulsaequL7AvK+nuaqmr7HJx8jRw7y/vri9vrzIusG4sK+0sbq7uMCysrqsuKyitKenrLK2ubOoqL22rra+sL2nrqy1rK2cqa+joKWtq6icnquzpbSom6qnqaOpnqOpqKm9rLSwrp2qpKGunJuzo5aknKWln6Wcm6mrpp+cq6Kck5yipZ6Yl6ipkpialJCKgo+Ffo+DgIidj4V+fYuHkI2Pg3+TmpOFk6KMlJGLkZuSlYeJfn9ye3p+fGh4fHl0b3B7Z4R4hIlkYWdhcoR6bWd4XV5UP1d7bVRiUFFYS0xOcnVdSFpbZ1lFVWVQRD5KT0RDQTlIR0tTP2piSlE4PUg8PDw+Ojw/VDY6P0M0NUg+Mjs1OTAyNzw1KC41Ly0xMScvPktIMCUaOTAlLCwwOS8sLCs2JzE3Iy0wR2pJMTRYPWZjQko3R1NgVSo9OURXPSqQlbKaoKCqpqWhq6W4s7OmqbGmrLjBvbWvoritqKiwwsnJzMG2vcC0t7+6yLXCtbOytbK8t7m9ta25tb+toLOnq6uwtbi1rJ++vaqzwbS8oa+ztaqsn62wo5ymqaqknpulsaewoJ+rqaehqZykqKGtvKiusa6hq6Okr5+fraaXn5uho5yfnJqkq6Ocm6WllpeVoKOXm5elrIyekZGRi4KKgICOgHuZlI2Ie32Lho+Ni4mEkpiQhpSjiZKSh5CakJOBiX15a352eXhjfHpwb29xdmeAc2qEaGVnX2xzjWxhaW9gbz1aeWtVXk9QUUpJTVRaV01dXmxXRFdfT15QSE1ERjs3SEVLTzxyaEtLOUFFOzs9PTs7PUo0OUI8MztHPDQ/MTgtNjg7MigwOS8sNC8uPS0qSz4pHTQ5JicuMzQuMCsvNCYsOiQ0MUFoWTEzUz5lX0RMNktWZE8qOzFOVz0jlJmtmqGYqKWjn6ikuLCvpK+wqau4wbmzrZ+5r6uotLrIy8i/tsK+r7S9t8S2w7KuubKzv7S6vbeoubi9qqO0qKmqsa66saqcvL2lsMG1tqKvtrWnpqews5+epKaooqWZn6yoqZ6gq66moKaYo6igsbmfo7GvoayhraScp6apmpqbn6SVnZ2bnqqnl5yhqpOZlJmfk5mWoamRmomOkIZ8h36CjX18oIyNiHiCi4SJi4uFh5Oaj4mVnoiRlYKMl42RfYV8c3B9cXR0YHp4aG1vcG5ofXFje21pZWJdZYV+X1pzanFKSX9pWFpOUExKSFBSUUlPXF9uU0RYWlJoT0hLRUY1NkhCTEk1WmVKQDZFQjk6Pj0+OjpDNTk+OjNARjwyQDIzLjo7ODMmMjwwLDg1QiopLUIqLDQ7Tk5AOzczLS4rLTcqKjwlNTM8ZmQyNE0/ZV1GTz1RWmdIKj4vV1U1KJeep5qdl62hoaGkoriqsaW0tKmoucS1s62ft62urbC0xsjAtr7BubC0vLa+u76vq72ws76wvMO5qLu6t6entaioq7Gts7GonL+4pq28t7KfsbewqKWnr7GboaSgpaWgl5uwp6Gfo6ivoZ+hlKSkorewoaaxq5+so6+YnKqkqZ+Xmp6lk5udm56nq5qcnqaXlpiWno6Tl6KoopCJi4+GeoR+hIp6jpaJjYZ4gYeDh4uNhY2TmI2PlpmKj5d+hpiMj3qBenByd29vdF95d2Rra2toZ4JtZXJra2RoWGFzf15abHVpWUV9XVtYT09LSEhSVUcyOl5ebFBEV1VZZU1ISkVFMDdGP0tCNklKSDs2Rjk0OT49PDk4QDg7ODo3QEk+ODw0LTM8PDc1KDU+MSw7QTEoKzY8IzhSPSoxMTM+RDUsLSc0Mis7KzEzOWNsODRIQmdbSFRDVF1oRS47MV5RLDKWpKOYlp2qnqaho6G4qa6hu7ilrL3Es7CuorWvra2vtMTEvbO+urews7m4uri6rq2/s7S4r7/Bt6u9urSlorOrqKqzrK6yo53Dt6apt7ern7O7qqemqK+rmaKnnKSnlJihs6aanqWpqZyhoJSln6S5qaSnraaepaGok5+poaGhmZudoZKbnZeho6ycnJqilpOVlpuOk5Ojp6SQiIqOhnmEfIWGfZyNiYqGeICDh4iHkYWVk5KMkZWUjo6Ue4KXj4t3f3xsdXJtbHNieXRoZmlnZW2EZ2doZGZoaV5lYmlmWWV6YmBQc1RbW1NLSUdJT1NAIStpXmpMQ1ZVXmBLSEdFQy46QjxGPDZLUEQ4OkQzNTc9PTg5NT86OzQ+OEBMPT45Myk4Pjw6OSo2QDMuRTQoKyw+MC1OPy4rLTctMTE5NSwmLjUtODA1NzZgdEIzQ0RoW0tXR1VgaEIzNzdhTCcyn6Slk4+lp5yenp6kta2nqrq3p6zDwLevrKK1rqeur7fBwL2xwbewrrK2tbm4tayqvLSvsrG9wLeuvLyxpJ+2rKamtaqrr6Ggxayqp7G1rKy0up6oqauxpZidqp6opZKapq6jmZ6kqqGboZyYoJ2ntqavqq6hoZ6doZWgpp+ioJmcmpyTmp6Vpp+uo5iXn5aVjpWYjI+YmqigkIeKioh4hXeCgoKch4qCiHt/hIiGhJCElpWPj5CRkJGMk3uDlY6Gc399Z3lwa2tsZ3Vza2FnZGJzf2FkZWZlaWliZm9aXlhdbGNhTWdXW2BWSUdIS01SWD85YGxpR0JVU1xbSUhGRUEuPD85QTg5UkZANzpCMDM3PTc2OTI6PDk3OjlETT1CPDAqPEA7QTwtNUIzNz0rKywvQSpKSy4vKiszNzIyKDU3JCs3LjcyNjg1XHlOMj5IaVpMWkpWYmZBOjNAYkYlNZ2koZKMrqCamaCXpbSyo7K+t6Gxxru6sLCjtqyrrqm5vr27rcCyr6+utq6zubOnq7mxr66ztru2r7m+rKaetaugobGlq7CgpsWhs6aws7C3rbWerK6srqKZnaeqpp+VnKemoJmlo6mcmp+clZ2erbCmuaeuoqGamp6Zn6OapZ2Xn5iclZqhk6mXraiblJ6dlI2Vmo6VlJinp42NiomOe4F0goKLmIWGfImIhISKjIiShZOckpGQkJGXj5B/gY2Ng3CCf2d5bmhramdxcmtbaGNhcn9gZGdrbmtmamZkbFxtbXZxYVNiaGNlWklHTE1PWVFQVmFlgVRAVlJaVEZHRkVALzw9Nz82PEZOYTg6PzI0OUAzNzgyOD83PTg+RkpARDkyLT1BPUE9MDVAOUAxLSsuNDw7SzYvLissLTI0OjUjMyopNi41NTQ2NVp8XTE6S2pbTVtLWGRjQEExSGJCJzSUo5yPj7Gdm5Shm6mzsJ+5wLahtMK7vbmxprawqa6luLq4uKy7sK2rq7eqtbmtpbK1sa+psba2sbO2u6epoLapnZ+qo6qunavEma+msLG3taysnrGtr6qim52krKmclZynpJ6ZqqOllZqgnZKco6uqqbqep6Sgl5qanqGPa6OWmZ1xg5ecpYF2kqyonpWXopKKmJmAl4qfj3iFk42DbWl+d4RybIaKhn2EioZvXWRgZ4SXhmuLkJSSdXiLhH+DkIBniIBodmlmWF1pdG5OUGpjZnGCZl5kZm9raV1cXomQhYhoT0tDOEVUZ11KSFBQVVZMSFNhcHRlRltRVVBGR0ZDPjE7PTY9NjwzZlw1Ojw3NTtENDg2MDpCNz86PkZMQ0IzNDM9QEBAPTI4QEU9MSwsMDg+RzcwMS4qLiovNjY4LCMxJzIxNDoyNzZYgWwxNU9rW05cS1tmYj5HMU5hPCsvjqSaiJWxm52ToJyrrqujvcWvqbfCuL68rae2saarpLi0s7Owua6qp6y0pbG1oqe4trWop622s660rrSiqZ+0q56jpZ2nqJuwv5Wop7G0ua2upKitqqumoZ+coaionJehpqacnKeonZOeoJmRn6iqo7Svo6KjnJaYmZejiKGPkpqIoYiVn6J/pYCorZ+UlJ6UiYRyeIyOg4igdYiNaZeJZn5zeaBvh4eDfox8f6Ggn5l/e4eedIiOdpuKbIeCg25pZWR7bXJiVIZtY21pmHFYaXBuhlddaVtralqIcG15codoh4RZXkZNPkZeTUVSVlZRUFJXVGdeTFpMUlJQRUZHPjw0OT05PDc7MDw8Nzk5OjY9RjU4NjA8Qjs8OT1GUUc9LjU8O0A9QD41OUdBODIqLzE8STovMDEuKi8oLTQ1ODMlJjIxMTU+MTw4WIN0MTVSa1tOXExbZ189SzFUXjcvKI2nmISdrJ2ZmZ2fq6qoqr/Dr7K6vLjBv6qkt7GqrKa0ta6vs7arqaWxraW2s5ustba0pqeos7Gtsqiunquhs6mgpKWboqWesbiVpqent76mrKepqqunpqKgmaGopJqZp6OlmZylqpaTo5yVlKSmpqG2pKOgpJiVlJiUnIiukJiViqqMmKOdhrGBpa6elZugl3qC1Kh/h5TAm8Z4d7Glt5ZkgMCcv3mEhHmPg3yQkJHKcZa8nMV7cranupB7gWyXsauxeWhsWLGub2VpvJK8bmh6bXCP2H5Ta2K2sn6AcZR1mqGqkFZOWGFPVk5GVVxYUVBSi1xXW1BAXERQTkNGSTw8NTc9Ozo5Oi49Ozg3ODs5PkY2Ojc0PkA+Njk/RVJJOi41PjtCPD9BODpKPjUyKjIyQkUvLjMyLisvKS0vMTg2LSAvNDE2QTE9OleDdzExVGtcT1tNXmdcPkwxWls0MSGPp5SBp6qfl52epa2yqbHCvbK1wLW4v8KrprStramosLWqsLa0qKimtaWoua+csrK2qqWkp7KvrrGmq56npLKkoqGgl5yioLKvlp+kobW6oqqooKytpKKdm5qjqqCYm6mhn5ieqKiRnKeblJ6ip6OhsKOen6OWl5OYkpmFr2tqi46qf2iFloetZnGfnpabqJdxrqGkfne6fGyhj3axX2q0W6WAZZyQYGaBemZ/aXhqqWW+cmemjHaxanyxeHWRlGNtbaduXISgRWlnh5ZFdZxgfWZ7o6aCWV+Lq2h/kXh6aqg4Sq9bWFRtY1pMT1hfXFdWO06IUFdWL0lTU0pDRUY9PzQ2Pzs4OjkwPTg5OTk6PTxEODs6Nj1BQDY8QEhRRzkwNzxBQz5ARDhARz0xMy0zM0UzLy41My8rLyguMC46Ni8nJDIwM0IvPTtVgnYyLVZqXE9ZTF9nWTpNNV5YMzEbkqKVg62npZ+jpauyuK20vb6wt8WyuLvDp6mwrLCpqrGvpLG6sKWlr7OjqrmpnrOysKOloaqtsKyvpqifo6KxnKOdmZaZnZ6wqZicoqC1s6Gqm6GsrJ+empego6qdmZ6loZ2aoaikkJ2jm5ihoKyfpaagmqChlpWRl5GahrWbtXmGqpq2mXeHs5u3f5SXmKyXf2uBpnqBhYeRlJJ3q2dqsVuse46HlHSIcI6GgH+IkJd4g4KKl4yDoI+FsHZ3n3Fra218i0+lWEhjY5l+Y2ilX3lxdVKSh15QqW5jcXyGgGGdL1KibltUa2dgTEtcZFhcWkI+sHdXWEEjTWlGQkRBQEExOT44ODo4NDs6OTw5OkE6RTo6OzY6Q0I4PT9LTkg6NTpBRkJBQUQ8RkQ7MDIwMTtGLTAuODQwLC4oLzMsPjgzMR8vMi1EMTw8U31uMytYalxPWE1fZlc3SjlhVDUwHJeglImzpqahrqmos6yqu7bCsLzDrbm3wqutra+vp6+zqqKvvKuiqLWto6y2paWys6ijop2nqrOpsKimnqCgsJagmpaWl5ugsKObmqSota+hqI+pp6qbnZaYoKapmp+do6CcoKOlpJabnpianqOrm6WanJqioJaTkZOTnYTVk5m5cbHCf8aHfdaUnLt9nJeoko+djaR7jYaigaWCeqx5j51Wr3uJfp9quVq5d4WEfaaClHyZeqp5jp2Qe7FtjoR0kLuGb5VQr6fFilGgemNgqmJzcodsl4dfUrW0yIV/iXxjpDNCnXVcUGpoZFBAWGZZZGFKSE1rSltTT1lmWkNDP0U/MDw8NTk8NzQ8Ozg9OjxDOkY6Oz42OkBDOzZAT0xIPDo8REhDQkNEPEVGODEyMTFEQi4vMDQ4MystKS4zMjM5NzEjJTUqPjM9PVF3ajYqWWlbSltQX2ZUN0g6YVA3MiWco5OZsaippbOqpbSnpLy3wbC6wLK3tb20tqiysaSys6agr7apm6i6rqOwsqGytLGhpJ6eqKmxqbSppZyenqyXmZmYmJaZoqyem5eprrGpo56OrKKnlp2YnKGnopiioaKhm6KjqJyfoZ6VmZunoZymlJubn6CYkJKVkJ2Ism5otXGriHCOp3O0dXS2e5yZpo6QnY2jfo+eo36wdYOR0tJ1XK58hX+kbpuqpmqGhX2tfZiZkHuxc5Odj3mzZZZ0hZ5un2aUUsmLWsJcn3liX61fdnOGYpeIXlnKnW/AgHRNS7VTVcZkVVFqY2VYQU9qX2xpUFVGSTk9V1JbVllIQj9KPDI/OzU9PDU2Pjs3Pjw9QztHOTtANzs+RDsuQ1JKRz4/PElKRkNFRD5JSToxNzQ2QD4vLjI0MjUyLSkuMjYsNzQyJh82MDs1Oj1QcWg5J1dpXEFOVF9lUDVHPWFNNjIuo56Rpa+tpam6rKa1pae2u7yyu7+4t7W8vLSmtbWjsrKjoKywpZinuq6ksrGdtLiqoKWdoaqlsqisqqWanZupn5aVmZmTlKSqoZiTp6uxpqGWkqyfpZKUoZylp6CVm6anopujoK6aoZ6ekJaco5+cpZSdlZminpWZlpKbhax8eKh2o4+Lh6lwrouEqISamqOLk5qLon2Sl4euhH+Cs1xyslOvfYKCo35x1313hH6PnYaZmnevhoqRnIh3tGGaZZqCgZVskluwV0uadZh5ZmCtXnZ3h2eYiGpdr3eVn494bDV5yK6zX0NUb15nYEVQbF9wbVZVTS5lY2hSWVA7QURATDo1PzkxPjwxNj85OEA9OkM6Rzs8Pzo+PkU5LUVVSkVAQzpNS0pCSEc+R0s5Nzw0Njo+LzA0MzMzLjIuLjE4Ki4zMiUhMDM3Njc9UGtlPiZWZ1xAPVZfY042R0JgSTo3N6CdlJ+3sZmzwayosqeqsrq4tLm+ubizt762prm1obWtoKCprKCVp7asqLGxq620pJupoKCoorWnpqqkmZ6VpaKUlJyZkpWkp5uUkKetsKWglJipn6KPkaKaqaahlZqmqZ6dpJ+tnaGdoI6Vn5yfoJiYnJaXoaCUmJGmnYepfn+meaGPkISqcK2NgqeGl6GiipiXiKOBkIaUqnp/i515cLFaqIOCiKB4dNh/dod0p4GOm42SpHyVkJ+Ee7JenGSgfYKVbpNcq1xbk3+Rf2hnqmNye4BqmIZxXqtaiaCPa25lT0pDoVxaTXRdYmZNWmFfcnRfSlU2SpqRWEhFPUdFQUwzNUE4Ljs+MDVBNzhAPDY9PEY/Ojw2Pz1CNy5IVkpFQEg2S0lOQElLQEVOOjpANC47PjAwMjE1NCsqMDUvNywmMjEoJCQ2NjcxPE9lZEEmVWZbPzFUX2JMN0ZIX0MxPTeinZmYvq2Ys8Kuq62oprSwuLG1v7m6s7K5vKq7tqGypZ+mp6eflKqxqbCqtq2qr6GYoqCmpKS6o6OsoZebkaOglZWempSYoaGQjoypsLCmnZaap6afjZKkmKisqJWYqaifn6CkrqOhnqGOlaGZn6CSnJeclZ2hlZaPq5uPrm5ytHSpjHeLpnS0enW0gpSmpJSdjYmkh451uG6Le4uia2u2WqGGZZeXaKCip22UcrRzk5l/s2qFkoitanW0YZ1mom6GkmuXXK1gTqF8h5FSc6NseX9+bpiGcFyvVjycd2ZUb24uW6dPYlJrZWJsWmJcYHB8Y1NaUT4/bG8yQkJAPk06ITdANi47QDM3QzU4Pz8zOzxDREJKRk1JRjYySlRLRUJKNklKUD9IT0NGUD08RTUwOzswMTAvNzUsKywzMjYvIzAwLCwdMjg5LzlOYGVEJ1VkWT4vVV5hTDVGTV44MUE4pZqbnLqjnLG/rq2rq6e3qbivtcG1vbKxu7irwreqrKGdp6SinZKrq6e2o7Oorqqhl52ooKWruJ2jrZyWmZClo5aOnaCbmJ6gkZOVq7awppmTm6ypl4yUppqlraORl6uypKCeqKywmaGjkJmil6CblpuXoZOcqZ2UkKqZh9SUmrt1scSAxId+1pecuHmKkpmOmIqMp4d5orZ1fXd2woKasmGDunnAfHW4YrWBjIepfZaCrKlxe391vIinoGmdYaaOr6F+jHSHq32+bnO8dLKDdXiBim2aiHFtjaR0vV13fVthebxqWlZbaXleaWFkZmJteW9YW1lDQUBxP0NHKzRIIic7PzEwPD83OkI5OT1DNDxATlpeYGBfX19aUFBSS0VGSjRITFJASk5FRk9CPEU4ND05MDIwLjg3LSouLzE4MCItMSwzHiw7OjA4TFhhRidUY1g8L1ReYEs1PExcLTZAOaean6G7o5ixw6+tqaqssai5r7fFsbuzr7ywrsGyraajn6SinJyRqqWqsqS1p62kn5aaq5mnrbido66ZlaGQpqCTjp2jnpifmpGWk6+5sKuVl6Onp5SQlqWdpK2fkaCoq5+bn6mksp6jpY6nopWimpyXlaSZkLCgkpWqn4WQmbaAkpKNuJZ4g5ObtndubG90b3mPhI6Jcp7Bu7yZeoGyqHCAdJG5g3yGhoqHjXuKho2XfaS7ub2cdXmzo3R2l3V0sHWYnmaGaY22dHJxd7aMXn95fYlng3lteWKLrHB1hX9YW6dpRGRZVGZfY11jUWdmcW11Qk1PTEQ7Wkw/SjM8MCA4PjsuMz1BOTk/PTs8QzZCVFlaWltbWlteYGJgXVNHR0g0RElUQktOR0VPRj9HPDc/NzA3MC85Oi4sLy0qOC8lJjIoNCQoPjcvN0tUX0cnU2JXOCpPXV09KztWVic9OjymnaGhv6eWs8Kzq6qorKuqu6+xxq+1tLC4p7W5rqukoqefoJ2ZlKykrqqmtqion5yWoaSerKW+p6Gql5WckaKbkpCiqKKTnpeSmJSytbasmJ6jpKKLk5KmnKarnZappaacmaCop6ejqaGSrJ6Xop6XlpidnpCwqZScp6KPa39qnKl5iXR/m492e2aHe76/wLpvkoNxlIVfcmpaXZqJYWSHjpVrYH+UY22cdmKUa4CalZRlXmBjcZqJaHKMfIaUZmp+cXR5fn1iW3h0gWhQXG6DfHuKalhseYFySUpvhXBOc01EVlxmYExaV2ZjX09abXZqclJPREVNPEhJPEw+MiwyQT84LzU/Qzw5O0A7PUM+UlZWV1laW1tcXWBhYWFgXFVHNUNGVUVKT0hGUElJSDs4PTUxOi4xOzouLy03Nj01JiIvKjIsJTs4LTdJUl9JJ1NfVjQpUF5MKDM+XE8nPzI+qJ+oocKkmrS5tqOspq6nqLWyrMissLSttqS+sbOnoaSqnaOcmpqsp66kpbWqpJuYlaKcp62pvqippZWUm5agmpOZpqmokZ+Qj5icsLK+rJunnaeiiZOSqZuopJycrJ+jmpqip6yin6qimq6blaagl5Wdn52YsaWZoqiZnZKfnaSmm6ikm52anJuRl4Jobn1yd5GXlJCEibSqjYWYlY6KjJiWh5SViYOTk5CJjZGUmZOZl5qfoZqblJ+bjYJ6pIVsaXuRfYB1iYuCcoJ4eXZ1ioB7iWpzgnSDdWR3fXZrcHpsX2Jbb2dNWFlmal9XWXB6b21mU09GUjlQWk5STygrOktCNjM1PUBBOTpDPjxFTlNTVFZXWFpaXF1gYmJhX15eW1RLQ1NHS05ER1BMT0k8Ojs0ODksMjs4MjApNklSTzgiKSsvMiM0Oyo3Rk9bSidSXlQxMFReOis9OF1LLDwtQLKgs6K/oqOxsbegqaazp6WwtarJq62yprWmwKi0oZ6lppyllpagq6eto6S3rKCZl5agmK2qpsGfrKSWkpyXn5iUlaKfnqOok5GZqKiyw6+Zq5yqno+Wlqmeq5yeoa2YoZucoaWvpqGkqJ6smZemnZmaoZ6enbChnaKnlpmUmpSho5ekoJmhjpeVi4uOkJiuj3yVm4KRgYmpqIaAl5aKhI6fiHuEkYaFmpGHhoqVjpuXjpCYnqOWmZKQnI1/jWWhs66EiYR3e5CKfnd5em9neZCBgIlrdYF5iHJpdH95dYOHgWp0Y3dlX2hkY2Rmalhre3Fqa1xTTFBEX1VGQD8/LDRARjs0NTs+QTs8Pz4+SE5OT1BTVFZWWFpcX2FjYV9eXl1eXVhWSktMQklPTVJKOzw6Nzg2LzM5NjQuKCYkLTEuLikrKjclKzwoNkNNTEQvVFxRMDVNWzE3RTRcRzU8LECzoLmvv62rrbGyoKqmsq2irLOwxrCrraSzr7yktJygqKOhnpmXqKappqSms7WelZWempqwpq6+oayikZGempqUkpainJepnYWdqqyjtMezn6mkqpaWmJqnnqmcoKWrlJ+fnJ+qrqilo6uhrJufn6GYpJ6cn52wpJmfqZSZmZ6TppuZqp+cl2aEk31lf4+bkGN5jGxoanqQo6trZJmXfmeFimVlaWh6jaKOa2iMl5Gid2tqi5min5hzbG56hIyGeVhlXYWCXmyLioJ3XGdzd3eRgIeCb3iCeH9zbXmEc3eIiI6De2mFWF1qc2Rdc4hpa3xxbWNdUU5XSWRYQEozPUY3P0ZENzE8PT9BQzs7REdISElMTk9SUlRXW15gYWFgXV1dXV1fXVpVT0RIT0tTTj0+PT02NTM1NTU0KiYmJSwqJS4rKyc2KiQ7Jy9BSVtKLjZaTzYpRVkvRE8xWUI7Py49pZ+6vbqvrLOwq6Wora6wpq6usL2xqqilrrCwn62YoKSeopqap6ycrKOmqKmzrp6WpJCjsKa2uaWuo4+PmqKak5KboJmZppZ7payiqLTDt6Wip6+fnZWeo56jnaSqqJKfoJ2fqq+pqqOqnqebpp6noKyWoZylsaSXnayWop+blKaZoKyZn369hIlztHOFn4ataHe5xLhxkqGje6aYmHOqgnzLwMC6cYujh4OefZaYiJ7AvYKWnZ2NnMHBfIF6kYyawsB9a6Wyb42Bb8p6f5t3kYOOgHd5gYB5cXuAhnB4hYuTeWx1kWJlXndjX2WAYl50aG1kYlhLVklRWkhPRDJJRT9EQj4vPD8+QEE6OERDQkNFSElLTU5QU1ZZXl9fYV9eXl5eX19fXVxTTVBHVU5BQD89NjQ2ODI2NiomJSMpKiYuKyopMTAfOSojPklbTCojQ1AvI0ZbM1BZL1VBQjsvOJaiucO0sK+/qamUo6+psK+tprK2r6qmp6axq6CrmJujoJybqqeinauipailpbSknqOTpq6suLSnr6KSkZmdppORoKGYm6CeiKarpKutv7+xoamvqZaSn56imaOkqqOToKGdnKyuqKumo6Kln6SlnK2pkaSbqa6qnJ6rna6jl5iml6KkmJ1/zpR6e6WCepaXm1+tj12OqIChoX2nlZt0q4OAr15kjKp7qIeFoHSXk4izY4KrhqCNjbNqhK90fJaHuGGCrlmjzW6Qdnvbe3+ZcX6IknV/ZXuIdnZsfodufYWQkX1rgIxfcGpvZmBfeGRbcWhqY2ZgUlRTV15KT0M1QUhFRDg+NTtAP0E7PThAPj8/QkRERklKTE5QUk9TXF5fX15dXV9gYF9fXVtXT1VKPT8+PDU1NzgxNjQoJyQhJywmJi8oJiszHTYwJDc7U0wrLC1KMCc7XDpMLSFQQEY0LjGswcC/tLSwt5iekaOqqa21rKayrayspKymsKqhp5yappicoq+foZ+op6OmoZ+wrJuelqaurbCrqKyglJKbn6WTkJ+ll52oo56to6qwqL/Fs6ipsa6Wk56copehqqqflaGenJutrqapqJumpqOgqpKss5aloqqqnqSnp6KyopObp5uhm5WUkZegcYaMmHaFqIdxsXydcax9oKCBpY+eeKuCfq1/nXKtf6yHhp92mJJ7fJd+qoihi5GLnH2reoiSj59/eq1WnMR7kHCTwX2BlW11cIxtZndlhm9hd25yboiKkI+DbI+OZG1zdW9gZm1kX29pam5mY1dTXGBaUlJDOUlJQEM8PjxARkRDRUE9PDw8PkBAQUJFRkdFQENJU1dZWlxdXl5cXl9hX15eXVtaUkM+OzkxNDc4NDUyJiMfHCAxJyAxJx8nNB41LSY3PVdKLTwoPTEpM1ZARiEcRztDMS0rr9PGx7Kzn52jj6Oioq2vt6+psaeoqqiuq6unoqSdmqOWn6aroKKmoKioo5+esK2Ym5aop6+sqKepnpeVmqSikpShrZqdp6OvrKKstam5zLGtpq6rlpWcnaKZn66snZahmZ2dqbGnqaibqqijoaqbr7GiqKuuppqnq6urs6STmKSmm5WShaRqpHWKeql1e7JxgqWKmIxwiKCbh6RfYVKrhYCug5x1roKohoafepmXhntmgKOKpJiGgaN9qX+BlIauXnuoVZ2ikoF6o5+AfMSwxYxzr7SzuXJiqa/CdWiMi5eOgWyYkG5seHh3bmtmZGRxcWZ7aWNcVl9pWFhUTExRTENDQUI7Q0BAQkk8PTo5Ojw9Pj4/QT04NjtETFBSVFZYW15eXVxeYGFgX15dXF1bU0lCNjc5OTY2NCwmJCIgJychKy0iJC4hMy0mQERXSCxHKzU2KjFQS0wjIEE5RDQsJ8LJ1dbAoZmrqKGvop+wtbCwqa2jqKeqq6uopKagm6WfnaanpqSdrJqirKGjn6+jnpuTqqS1sK6gqZuclpWnpJGboqifoKacsKWiqLGstsextamsqZWRnZ2imaCltJ2aoZSbnqerqaKtmquooaGporOtoqqzsqKcq6mwsLillJekqJmdknyqbJ6EiHareXywboKki4mflpWeloHSuLS4yYGCsl9hlKmDpYiHoHqYlpp5qsl0mqOUp6iQkpqMfpqJmsbGd2WhgqVzgZ+Ogn2vXm+1Y7F1S6OGbadHg5Nkjo+ckXtvlZB9bnl0fHptW2VqcnFmgGpeYVhjbVxeWUlMTEpFREJBPUE8QT9KOzc5Nzk5Ojs7OzMuNjxBRklMTU9RU1daW1tbXV5fXl9fXlxcXFxcWE1CNzU3ODUvKSglJiUkJiksNUZOUFBNRkxKVkYqTDAvPi00TlRRHRw7PEYyLCSopMDGua2psq6tpaKds7msq6Gmm6imqqyppqCmpZiqo5+urJ2moa2an6mlnae1oKOYlKirtrKsm6acoJaQpq2Smpyno6Cqp66ho6epsLPBsbKpraiUiZidpZuipK+ml6GVl5ulpamZrpyrpqSeq6O2rKGxubCenLCotLS1ppaZqaSboY+CnU54moKAn3qEo3yCpISGpp+cn5SEuHx8ermCf8zGw7Z3m6KRi59+mZeXinafl4qkmKSnfq+Fm4OehKx9mZRhpWyjcI+FkIF9loRyrGCkc3GAmmG8fVJVdY6RopZ7fJGOh3J5coN9cFxsbndyaoBuWmNfaG5iZF1MTFFTQUhHRkg6Oks+QjEwODg1Njg3Ny0qNT09P0JER0lMTlBUV1lZWltcX19eXV9fXFpaWllVU09IQDc3Mi4sKi4rKicmP1FUVldXV1lYWFdVT1RGPEUyOlBbVBwbNj9HLC0gjIeZqaykq7mrr6CboqyztaafoZWlr66uqKeepaWapKehsq6iqaezoJqppJSjtaOjlZehqbW5pJyjnaOTkKKymZ6bpqWhoq+tnKSoorWxwrCtqq2qkYeRnKedo6SdpZeemJiYpaOnmK2hrKKkl6+lu6yit7aunp62s7qztaman7GipZ+Hj9G1w7d6h46FkZOPgKZ4lKJ3jKGShaWDi3Krh4a0bnJpmaSdlYqffZeZh4eQc66CpZuijKaKk5yIlJCabXCyXKVzk3qcbJl/e5l+bqlhonJyfp9ic7K4aHePk6SXfYqLkIh2e3iNgWxod2l4c25+dFxkZG1tZWhgSlpXWDxIRj9TM0BGPjwqKDYzLjAxMykmNDo7PD0+QENFSUtOUFJUVldXWV1fX15eYGBdWltaWFVSUlFGOjIyMzAvKysoQFFSVFVUU1RWV1dYWFdVVVZUUU9RW1UlITJBSCMpJZJyjYquv7+8u7Wel6ikrraio5mVo6mnramqmaWin6ahoLWnoqmnsaSUq6OPpK2knZCamqq0tKSdppypkpSXr6CgnqajnKectZmgqqO1qsKvqaupooyEj5yioaajlpqanJial6WjpZepp6ygo5uspr2slb6wrZ+jsbS7rbapnau0pamZe6iRfXyweIuApKWInG2yb6GHrXyij4Ool5qBrImGrYWglKigo5eFn4GZloF7kn6rgZ2Zloqqd52gj4iTkn95r12jgXymp2SegHyXdGuuXaVscoWZXWBbjKBtlJClmIKTi5OJeHmBln5qbH1ifXRtf3lfZ2VwbmdnaEJZX1o9SlMyUzhBQUM3JCQzKycnMywgLzY2NzQzNjpAQ0ZJS01OUVNTU1ZaXV9hYGFhYV5dW1pYU1BPTkk4MTUyLiosQVRWVlZUVFVVVVVUVFVUU1NWV1dYVlZVUUhGSUojKCi8kpuEqcbDtsG0n5qtoK65pqOOmqOjoK+uqZ+jnp2tmZ65oKOroK+qmq6hkaqppZaJmo+tsKynoKibrZiZj62ioZ2loZmknK2Xn6iltqi+rqSpo5+MgI6bm6CmnpKUmZqTmZmlo6KYp6qqoaOeqai9pJfDraujoqyzu62wqaO1saqsmXavfpCKnIWHfbqtiZhksIxllq19oY+Dp5ecgq2LhbCGp5qkoqKRhaBcbGuCs2B/rXt7goCxbGZumZeLiLFafbRcpINryKJmn4F7u1l2tVqyfVOvgXqsWIChbZeOp5mIlY6TlHl3jJt9Y3N8YoN4dIB8YWpmcG1mZWVPVWNcQVRePUgoPjk9NCEhLCQfMi4gKjEvMDQ1Nzk6PEFDRkhKTE5QUFJUV1peYGBgYWJeX1xbWFVQTUpHQzU1My4vQFVZWFdYV1hYV1dYV1ZXV1dXWFdXWFlaWltcWFdXR0I70p+zsbe9u7TBs6Ocraalt6mgi5mgn52ysaieop+dtZigs6iqq56wrZ6snJWuqKKOiJuOr6ypp6Ooma6Tmo+pmqGepZ6Zo6KlmJ6iqLGou66kqJ6dj32Lm5ahoJmQkZqbkpmXqJ6fl6espaSkoqSpup+gxqemqaGstbeusKmhvrCurpeBqZKjro6bgIakl5iQgIC4w7qDjp2ThKiZnYOsi4Oviqicm6arkX7VvcKqYqS/vX1/o4KD17q3tYSUkoKevb6EaqOBb6uEbp1/erKxx4Nrq7C9rXl4or67dICVjaWajZmOlJp3f4+ZeWJ8emSMZ3mBe2BrZWtqYVBiW1NpXEBUYEJMKTw6NC8fHyQeJTIgHSQoMDQ5NjY3ODs+QURGR0pLTU5OUVRXXWFcX19hXmBbXFlUUU1IQz48QT81PVNZWVhZWVpZWlpZWFdXWFlaWllZWFlbW11dXFpWWFRXWruVtLSxv7qyvbOina6nprOmnYyXpb+ptq+nob+mprKbnrGduaifra+lp5WUr6yXjIOaka6mo6yhpZyqoJiKo5OmnqebmqCoopidoKusqbisp6Oal5N7iJmSppuTj5GYmI+Xk6iYnpaop56opqGiq7qeqcWjobCkq7S1q7Kso76qsLCcdHaqpLeFZYmfcGeskIqPbm53pY+aoIF2sZuXcZGOcpeppJuYr6RybG1tZot4b26DmXGAemlwaWeJlpWXcWhphYZncIZkXYpjaW9aXWd+eKZgYnKPknBmZICNko6hlpWXjpObeoWNk3RkhndojGp4fnlkbGNmbGJLZVdKa1k6UGREUCdKOSsjHCAaIiwpGBsYLTIuNTo0NTc6PD9BQkRFSEtMTU9RU1ZcV1pcYF9hXV1bVFBMSEQ9OkFCN01YWVpZWVpZWFhZWFdXVldZXV5eXVxcXF1eXV5dW1tVV16ola20qbq5srOqqaKun6SzqpmSvbHDx7y0qZ6/q6yjoKeroLqjpK2srKaOlq2qkIyFlZetn6aqop+ko6CRi6WSp5mpmZajqaCWnKWlpq65qqyZmpOSe4SXjqaXjpGRmJSNl5Smk52Wp6KZr6adoqy5oLDCqKW0p6yxsquvrqq8prC5l4uhqaW1nImWopiGqZuQlJ2SqrSZm6OsorSYpKKfoqOdoqWilqynjJKTjYeTnZ2VkJmTmJCOlYR/pJqXlY6Lk5KKj4aEfmeMgXSDd3SHjHGnbX2Wk5SUgYGPj46OnJKelJWTnoCFk4twaI92b4p3dnx5aWxlZG9jVWFYQGlaR2JgTlgrRT0rJiE2NDAvHxwhJTIoKjc5OTQ2OTs+P0FCREZKS0tNUFBRV1VWWV5fYWNdXlRRSkVDPjk9QEFTWFtcWVdYWFhYWFlYWFpbW1xeX19gXl5eX19gYGBfWVlgpZapqqS1t66uorClraCht7GRjqrEvMO5tqmhpJ2bpZ2wqKS3p52ptKWnkZiso4uIiY+cp5atpKGaqJ6ek5Wjl6iaqZmUpqCjj5qnmKC0uaeqmJqQjXyBlYyhlIuVkZWQj5KXpI6dmKeem7Wjnaart6ivwq+kuKewr7Guq6y2vKOxvpmSpqSmtaKSnaaejamfjZKfoq2xmqGksquymqainqWrn5+enZetnpOaopyUkJermY2YmJaQlp6Rh6CelJSFk4yPjZWLgX9mjYh1iHd6iYR0nGqIkpaVkol9jJaRkZeRn5Cak52ChpeFeHGUcnmJf3F7fmpuZF9waWBcX1ltYlBgZE9YOUZGRT0yPD04LyomKykmHSY0MDY2NTg6PT0/QUFDSEpHSktMTVNTU1VaYGBpYGVWUEpBQ0I7OUVNVlteXltaXFtbW1xdXV9eXV5fYGFhYmFhYWBiYmJkYlxbY5iWpKijsLOsrqOpp62gqLWqkI+bo7K5raqroaKZepyisaSmsamWm7ilopSYqZyOhoqJm6KQr56klqigoZKXmZuui6qWj6iYp4yYqI6duLWjpZibjYl5gpSMm5OKlZGTkI2RlqGLnJynnZ63o3+Dr7WjsLB1pL+ksqB4eqKttb6Xd66loIqAqX5kXGJ2n46knoOWfm2UtJyjqK+spWagoZR0epuYcIGZqplsgKOpimWcpZyRl5iWi5KbkISdm5CUg5OHjo6SiYV4a5CIdodxfIaBgWFpiYyVk4xbdpWRZ2iPjXF5oZaVZHiYhYB2l2iDiYJueX9qcGVfdm9ra2dcZWNhYW9SWT1NTU5SRj1AVEI5MS8eHyY0OjMwNjY3ODw7PkBBQkZIQkdHSUtMVFVVWV1gaGZnWFFJPERHPDlVUltgYWJgXmBfYGFhX1xdX19fYWFiY2RhYmFhZWRjaGReXWaclqajobCxrKuqpamupKetpZKWqrSusKWZqaWql3OLna+fqKunlJa5n6CPnKSekX6IiJqejayapJWnop6Ol5GehXWuj4ilmqiRlqOIm7mzp6CYmIuJdXeTjZaTipORkJSMj5OfjZmepZibspaAjJu1nbSNko+9p6F+p6N7pbG6g46Pp5+Ei4WPsamvjImWopp5gIushpyeo6mrqYmWh5l3ppx7iJyBmKeDgXuds3uKhqCYmZWYloGQlpaDmZpieYiRhI6PkouEbnGQiHqCcYGBhoCHdIeFl5N4lmiTdKCadHuZgpyahJh+kYiBgphpjIyEa3h7cXBnZHhuaWxqXGRpaWVyW1xIU0xRQEU1LVlUVDYpITA5PT42NDM1Njg7Oj0+Pj9ESUBJRUpLR1JYWlhbYWFpZllRSDlETDw+YlZeYmRlZGBhYWBiYl9dYGFhYmJiY2ZnY2JhYGVkY2djYWFonZikn6aurquoraCpsaenqaWZlK3FvK+glKWntJ2Pg5yrnKaioI2Qvp6ZjZ+aoZF9ho+Yl4isnaOWoaGSjZSJhoCRqI6Hopyjk5adhp65saedmpOPhXB1kImUkIqUj46bi46RnZCVnqOUnauHn7SJtJqui8qIq6+Kt4WNsISzsYWpjqeYjZ18qI9ye3ecjqaWaJWkebSMoKCoqpOZwoKAq4mZoXKegJulfZeFlbOBoX2hk5+PmJeAjpSciZiSi3yFk4aNlZOKhG50koaAe3OHgYR9hXWGg5iBj8VmgKmHj6JqnYGel4CZgIqLg4iYb42ShGd3dHt2Z2h1cGdoa15jbmxmbFhlRl1RTDJFNDZNYGM3JjM8RUdEOjYzNjU4Ozg+PT0+Qkw/TklKTENQWl1cV2JeamxcUUU9S01ASWRYXWNmaGdiYmJiY2NgX2JhYmNjY2RpaWNiYmJlY2FmY2JiaZWXo6CwqamopqygpbmxqaummpSeoqSpoZSjqbWir3+gppylnp2JlL2ak42gkp2QeYOWlZGIq5mcm5qihY+Md5ucjqCRiJ6jm5aYl4aiuKylmZuNjX9ibY+Lk5CNj4yMl4uPkZ6Nkp6gmKCnfqGnh62doJaukKCenZGHgqCNrbGIpI6rmoyafqJ2gJmUa4GrdU2reIeNnZKcqqmCqqt+hKF8e6dqnoCTbGeXhpi3iZ5+bmBjWIOXf4x7ZGeLc5l9eZdsXXyXbmBTcYVcYG16hGBZZYJ+hYGZcaira4OjbnKlcJ+CnGdknmxabIh6ZVlfgn5hV1BvdmVtdHFqam9eam9sa2hXZ05dWEU5QDRHRF5rNCtJQ1FNTj04NDg1OTs2QDs7PkJPPlFSS01CSltdX1deX2N1YE1FOk1OTVRiXFtmZmlpYmJkYWRkYmFiYGJkY2FiamtkYmRkZ2RiZ2VhY2iYl56guaGqpKaskqK2vauuopmWn6Clq6ufnK20oaeRoJ+fppuZjpm0mZCLnoyVi3WBlJGNiqaWlpifnn6ThYaspIeckYqYqJiZmZGHpa+mopWZiImAaW6Ih4uOjomLjZGLj5Ggi5Kdn5uhpX+TgY+joZSgd5yWkKeDo6mAhqyvh6V6i32Emn2icHOTh5V7nox5bYecjJqSnaqcj4edfYOidHemZ55+d6VemHt9k3Oibpi3tLpzkoiBgLaoZIHGuHxwlbaMcYCbo2N0rKthfmqds35ufoiDj4OMmHGAo2xzpHOegn6jXpyZs5Zve5ees3RyW56ygmlib3N1cWlvWGtrcnJkW2ddYUxEPUQ1UUFacDI8UkdfSlI9PDM5NTo6NkM8O0BJUD9UTk5RQEVfXltZWGBge2RJQzhMV1VWY2FaZmZra2JiZWFkY2BhYmBkY19gY2tuY2NkZGhkYmdmY2holJaVo7mZq5yToI6luLWtraCaoZuio6SsmpqxrKuSl6CYoKSZmpSerJuLiZF4i4VxgJaNio+hkJOUnZd9kYmOqKCHmI+KkqKTm5qMiqinpJ6PloeEfmt7h359j42Di5CQiY6TnoGVm5+coJ+LiXecmKKNoHKhjImpiZ2okZiqrYCujH16oJl5o5N4gHOXiIycfZWfh5yOmp2niKNkoX6KlpCbjW2eaJuOb5qZe4CKp31yaHSqg52Cc6pnlJpdm4V2hZ1oqmqBuGZcqXCBnGGVjF+ndneKioCdaJp1h5OSmI5/nm2ZkGqmmVyofne7an2pWo6EXbNnW25xeHdraVtwaXd4YV5lVmFCUEVPN1ZCUm40SlpaXk5aREAxNTE7OzdIPzpDSFU/WVNYXT5EYl1WYFFhY3xpRUI5TltdWGRmWGZmbm1iYmVfYWFfX2BgZWNeYmRvcWBkZWVrZGNpaGdraZadiaq2nKiJY5WcrLuysKudpZuap5+drJmdsKeqnZaimaGfmZaWoKOZhomNaYiAcnuXh4yWloSSlJiPeoqElqSdiZWQhoudkZybiI+ooZ+ajJGKgIBpgYZ5f5aMe4iNjoiOlZl+kqGeoKKTmHJon4qgj4xwkoyCqYmaoaWqo6p+sK2koriXdqOzoqN/iJR4nXqqmX+ij56dmImYcqF9h42wtX1smpGheH6ZtaOjq6iEmXyafJyafnOqWl1ve5eLeJ5iTX97e4VkephCTZ9ZompzfI5vgoqEmXabeYeJsbN/fpqSpnR+nW1xfJRvmXJpo12VdkhlY2BzcHx9bmZfbGh1e2JjX1BdVlxUVkBZRVFnRVJWXGFYXklEPUI4P0E6SEU4TEVYQVdSWlZFRmFcWmBLYG19cUVDPFVeYlplalZnaG1vYmZmXmFgXF1eYGhiX2VkdmxeZWdmbGRlbGhoa2mUnYGxrpqEU16hp7S6s7OomqKLmqmbm6eSoKujoKePnp2cmpmVmKGdloeHiXeFgW55lYSQm4t9kZOWiHKAiZKhm3KSkIGImJSfmoSOqJuZlYuKinyDbISFcYGhjHiFjYiHkZeTe5Gin56jiK6GfbWEj56de6aWeqmCl56RjKOgfqdod21+mXOgc3F8nYWYb5OCrXyjhKefm4KkcF6paHajZHCmYZzTj3x7mXhyc2OihpB+onKij3Vrj7OLYIKYinSqsqi8f3eDbn+/pqq0Xpxvf3KXcIJzonJepGd0pmBopmya05h6gptudnmXa5t5dpdybKmlZ19keXB/g2xoZmRtdXdmX2FSWmVQUWFIV0lUX1dTW2RqW2RQRUNLTEpLQUpEOFBAUE1YU1hPU1FgZWVpU2R4eXdJRkVjXWVaaGlTaWhqb2NqZmBjX1xdXV9oYmFoZXxkXmRnZGtkamxmaGxomJt/saxUXUt+qa+ytbCyo5yYhJemoKCijKSnn5epiZmXmJOZk5Kgl46HhntwfYRofI+Dk5qCd5GOj4pwgIaPk5JsmJR8iJGSo5WDjqmak5KKhYl5hHaIgG6Bn4Z3gJKFh5iglXmSoqOZoImzoaK2i3qsp6SupXCpgJuRhoGelH2kgaKahphxnoSira6Jl4t/jKSNlYOvo5V3tba2yaJzlIuCn2Cel6lteZaHoJt1oYd3oH6QlouBb0xmo5Jxm4hzpXt6dWKDgm1+oGxyZGCcc390l2t7arS2tMamc5h+epxqmpqrdIGabHN3l2mZeXSXcVBEfbNeanZreIdma2Zic3RwbVVcUlhnT1JoSVVMWFJVXGdrblVnV01KQUpNS0hLTkFRSlBkY2ptZXVzc354e251iXp7VVFPbV5oXGtpUmpoaWxnbWdjZV9cXFxfaWJkaGt7X11kZ2NqZm5sZWltZaKdibCohWVAlKGzrK+vtaKij3+Wp6Kho4ukppybpoKal5aNl5CQm5KOiIN5a3mGZYOMf5efeXWPiIyCaoWFkoSLhZ2NeoyKlaWSgpeol4yRi4CJeoB9i3lwj6CGeYGUhoiVnpR+k6WnnJaWhGdueJxsomR8cqV4nJhwaKeCmY59pXuhl4OWcp92gImUlY+5bY+KomJ9maOXiW5za6trdaBtb6Zgm2mLkGmWh5uVdaKBfppgi4aNdW+IYmihZp5/apt1cGRniIJvcqJbX1tkoW5eiYxxfIB0cmSlbniiZGanaJdyi5dtoW9SiI9uoF5kp1SLXVSYbW1ya3GBbXBoa3hza29RVlVVZVlTbUlYT1xIWGhoc2pZa1ZRUkVWXE1YU2FVaGped3V7fHB9fHKCe39zd46AhHdeUXNhZ2JwZ1BraGhrbG9oZGdfXV1dYGpiaml2dV1cY2hjamlybGZrbWOdpZmmemV0bYunrqWqsLGmn4t/lqqcnaSLoaGaoaGAlZiTjZqPi5eQjop8hnGAiGiLinyXmnN1iX2QfGWDh5WKiZWagnyIhpamj4Chq5CFkIqBin2AgI5zaY+lhH2Fk4yHl5+NhpGppp2JpniWnH6liZaMspmekYSvl5+leZiJe6l1p5CEmm6looyShIyDvG18pa+Ch4aHlZedon6me3KolKCWaJ9+b6xjloqWk3iobaqjgYl1iIJ3q5GmiGuSsWx3s4ypbIuGb2+gnpKVYn+rjKp3gYCOp593n32FpJWdoGiah3WrZp6tjLZzdr6Mo5NZg6aNq2F1cnRve3VwYmp+bmdsU1VZVWBgXGtMXFJcSV1sbXZgW3FYW19aZ3Nlbm9xY3F0YHd6fnlyeYNyg36Be3uNgYKAd2J5ZGNuc2RSbGdnb21yaWdpYV9eXGFqYmxse29cXGJpYm1pd21nbG5ilqarnYGAnqSWqaqeqKeuo5mIgZapmZ2jiZqknKidhIuaj4WckYWSjYyMdIV6iINvjYV+l5NzdYZykYNuf4uSh4aUkH17goWXpI1/paWNgI2JhJR1goeTb2yLqICCi5ONiJueiIuSqqKgkIB0lJeIfoF5lK+kf4KccY+GeZKNhoB7cqiNcX19epeWm4SNeHt9fYiUlZOLd5GZoaKFfH+Ja4yFXHp5c3pxaW9+k4pxgHSCj5STcYaEgmWNf1+BgYx4d3SUdXB6b2+Jb4WGX3dpeI5ngoOGj6qcf3R9l2qJiG9+dXyDdW1sZoxzeHuXd4Raald5j2lud3Jxb3d4b11rhW1pZ1ZZXlZcZGtkVWFVXlFfb3d5a2p3ZWpqanV8cHF0c2FvdWJze4F4dXmCdX+Af4B5i4WCfnxugG1keW5eV25naXVreGppaWRcYFpjaWVscXVuWltia2Rsa3ltaGxvYY6Vuqmni6Gim6akmaSdq6Kgg4OWqpGdoImZppqomIOBm4t+lpSHjoqJjHKCfI58fo+Ee5eOdHKEcJWGfH2Si4aGj4Z5foCGmKOMe6egioWPj4SVg4aOmHdxhKqFjZGcj4eenYaKmqifoKqDiY6Vm39+ipetqJCTqJF4cZ+ThHyUcH+qh3B9lXFqb3yBn4t/kY6LaG5dhI2NnJ2gkHOXjIhxdGuDdnSAWXJvh5GCfn+Mal1pZHuFhIiAYGl4e5x8g42DdoKHhGl6jIlsYnFzg3dfc42DipGolodnjY+DbneLgm+Di3dtZGVjeYJ6lVpbaWZtdlt7eXd0bXNyg2ZcbYpra2JZWF1ZWGtxW15gWV5dZXJ+e3NvdGNqaml7fHJ6d3RkbXRobHt/dXp9e3l5f4B/cIaJhHt9c356cn9oVFxyaWx2cHVna2dkXWFZamhranFybVdbZW1sZ3J5b2hqbWCMjKuxoZCjoZqfnpiemaijoX2ClquMn5SHmqGQpJV/e5iEfJKZiYiGhopyfYCLdoWLgoSWinJvgHKYh4R+k4ODhoqCeoCEipqfj4KmoIZ4jpeIlYuLnJeEg3qsgZCXmZOJnZyGh6Gqn6Gio4uIk5udo5mWq6Kop6GTnImZkH16kJCGqX9/kpGSk5yxpZqUnY+NsZKYhKaNjZadoYqRnYOJkopsfY53d2aDhpGLfImehYeLj4iIgYWEkXd8e3WbpIqIi6CMh5Z/gI2DgXdxdYaFf3mJiIuRp5GEh46Ig4yQi3qFiYeNf3VqgIN8eZlpcWhgc4pwfXt3dm93dIFdXm+HZ25fXllaXFJncVVjW1thbGh0e3xybnBjamlof3tteH5waG9wbGaAe3KCgHd/fX+Ee22DjIZ8enl8fXqDeE5kdmpzbnF7ZWtlYmJgW3NmcGZycWxVXWx0bWh4enBnaWtljYieup+Wo6GYlZmYlJikoJ17f5ipjZ2MhZ+cip2WfHiUgnuOmYmGg4SHbXiAf3KAh36Ik4Rta356l4eEg5B+gIaEh3yHg42bnZGGqZ6DcoqPhpKSi5yRfI17qYONkZeVjpuWhYWbpp+imp2Gg5KamZmQmaahpp6ekJeCk4x4fYmPhad8fY+QkYWYqaCck5yOjamNkoCejYmUm6CEj5h/iI+EcHmGcnVhf4SQh3aMmIGDj4KGhH6GhJVuenZ1lKSMjoabhoaQdYGMfn5zc3yJhXt5jY+FlKiQh4SPgoOJiYh0g4aGiXptanx/e21oa2xnXnl+Z3x8dnR2dXp3XGBwfW10YGNaW11QZm1TZVpdYWpodXp+cGxsY2pqZ4B/a3J/a2p0bnduhHluhoB2goB9hXdyg42Hfnx7fIB7gotgaXtrdmhpg2VqY2BpXGN1Z29idW1rVGJxeWVveXpyZWptbYuKn7iaoaSfk5KWl4uan56cenecpZCbiYakk4qYmXl5jYV8iZGDjIKCgmx7f3hygIV9ipB8a2h9gpeJgYiOfH6GhId9j4CPm5uQiKacf3CLi4yShqChioWMfKeQh46RlpKVkneMo6ChnZaaf4GQmpmTjZqjoqSbmJKcgJCHe4GFj4iigX6NjZB8l6SgoJKZkJCljI+BnJGJlJicf5OTf4iPgnZ1gnF3YX6BjodzipZ9iIxxjH6ChYaPaHhyeY2ak5GAmH+JjHODiX19cnp8jIV7e5KOhJemlI2GkXyEhYaEdICBhYV4ZHF6fnh5cGtqZl59c2d8dXZzfHJ/al5gdHZwd2RjWF1eUmpoVGVYXmBnaXZ4gXFma2NsZ2V/gWptfWducGp9d4V6a4uBcoGBfoF1doKNhn98eoCBfX+PanKDbnRpYohpbGJfcVZ0b2xuYHhobFdqdHZjdHp6cWJrb3mJjZ+zkqWmnY6QmI+GnKCam3x1o5+Nl3+MoYqImpZ3e4aHfoOJfoiCgX9wfnp0dYKFfomQd2djfYaXioKKjXh9gI2DeZaAlZeVjZWfmn1vi4GRk4Wlm4eMiYOmlYSRipWXkpF2kZ2hoZiUmHp/jpiXj5eanaWempSVnXuSiIV5h5eOn3+Cio6Nc5einaCSmI6PoYyMg5eYg5OWmn+Zjn2KjoJ3cn5ue2SAfIuGcYeTgJGCa4eDgYCKhWZ2b32IlJqOfpR5jYt9gol+fHKAeYuGeoWSi4yZo5eDhIx3h4OCgXV6f4aDc153d3xzfXdma2NgfmlqdnNzdX1xfGNjYXNudXJtYVlfXVprZFJiV19gaGt0eYZxYmpjbGZofIJraHRobG9of3yBeWyPhXGAg4N/dHyDjYGAfnqCg358kG11iXR0bWaKbGpiY3VWg2lwbWB5Z2xhanZwZXh7eXBfcWyFhZCdr5inqZ6OjZeHhZ+TlZd8d6ibiZh5lpyLjJmQeHuAi318g3uAgoF4c3h5c32Ag3+IioBkXn2LlYh+hYd0fX+Kf36YhJaTloyjoJd+cod7k5GKpo+MjoqSoJGDkI+Tl5CKgY+YoJqSkJJ0gI6SlIqdnZ6nmZiOlZh1kJGLbYeZkJt7iImQiW+XnZmik5WKjJ2LhoGTnX+Tk5aImop8i4qCenJ6a3ZtfH+Mf26Fk4OUeG+ChH5+i4Flc2p9gpiYhYCOdJKKhXqJf3d5gX6HgX2EjoaNlaWReYWCdIiGfH9xc36FgWxgenR5cHtuYW5iZHthbW92cnd3c3NhdmBvbHVub1xaXl1dal1PXFdiYWhtc3qJa19pZWpjaHeHbWZsaGlsZ4B8endukIhzgIOEfXSBhol6g316gYR9fI5yeYt5eG5sh2toX2lyYodocW9mdmdtbGF6aGp8e3dwYXdti4GZmquhpKmeiouRhomeipSWfHasl4yWfJ6TkZaUiHZ9e4p8e4B2d3+Ab3Rzem+FfYGAiX58YVx+j5GGf4SEc3qAhnqPkYeRkZuSpJuTgX2BfI2KkqOJjYqNlpqMhZCXkpWOiYiMkp2Tj4yNboSQjpGJnpmioZiXipeTcIubhmeImo+UeoqFkYtwlpqToZGSh4mYjIJ/kp99ko+TjJmPfIuGiHRzdmtxb3Z9i3VvhpGOk3J0gHyCgol9ZXFten+blX6FiXSSjIJ1intwgn+CiH2FjYqGjpaqjnuIfX6KhXd9b21+g4FiZ3dzdG56YV5vYGp0XnBqenl4bHJwZXldbWxzbXNYWl1fYWpaT1dXZGNmcXF/h2VdaWhnYmdxjW5jaGhlaWeAend1b46Fc4GBg3x1gomFeIV8eISGeoCJd3+Le3tzeYNqa19waHR/a3FvbXFnb2tle2Juf3p3cGt3d4l/o5mjqKGnm4iMioGPnYaSmnSAqZSRjYagjJWTkIBze3aFd3h/cnN7hWtyb3ltiXZ/gIZucVtZfpKNiICBgXZ1gX9/oIaPipGcl6CTlneJfoCMiJydio+GkpeWhYiUmI6WjIuNjoydio6RhG6Ki4+RipyWoZyZloaZiWyHpYVoiJ6Kkn+MhIyBeJOYkZ2RkIeIlI1/fpCZfJGNkI6akn2LgYRwdnBsbm9xfIdqc4OPmYpxeIB1gomDemdzb3aCm5B9iYV6lZN7eIp1cYt8h457i4eFio+cpYl8hHeBin93d2xpfoB/XHFycW9vd1leb2Bval5vanx6cG1tam13YHBva3FtWVhgYWFtV1BTWWVmYnVvhIJiXWttZGNma5JtYGZmX2dqgXVycm+LgHR/goB5doCLgHmFfneHhnaDhXuHjIB7d4p/anFifGKFfG9wbHVqaG5sdndfcX55e3R1c3+CfqWWm62fp5aFjIN+l5WDjp10ip+TkoWKmoyVjox6cnd0gnByhXNxdYhsbmx0bId2g31/bW5VUYGrlIeCeIB2coN5gqCCkYGSkZebkZl3kXqCjJKkmpOOiJSYkoSFlpiLk4uJjo+HnYSRi31zi4WIj4icmZ+bl5WBlYBqiJ+JaIihiJOFkoSKcYORl4+ajY+Lio6Nd3uTkXuOi42Sl418iX2BbHdqb2xsbXt/Ynp+j5aBd3qBeIONfXpodW11iJeMgImGfJWRcnuGcXiOe4uOe4l+hI6Rn5+GfX14gYp8dm9nan+Ad153b21rcHJVXW5hcWFfbG55cGdwZmd0dWhxbGF3ZV1VZWBgcVJQTltlZF14b4h7XlxocWJiZWWRaV9oZVtnb31va3Fzin12fYWAdXZ/jHl7hoB4h4NzhoV+jIyEfHqVeGdxaoNgh35vb2t7YGltdH90X3R8eIZ4c3OFfHmhkJqxnaaOgop/gpmJf4qcfoqYko6EiJeOjo6Ed3R2c4Bwb4VzcHGDb2ppdW2Cbn18bXVzUk6C38mS1pN8cHSDdYOfgpF2lJCYm4+Ye5NyhZCfoZOTkImSm5OFfZWVh4yNh5KNiJx/joF4e4x/iIyKnJycm5aUeo54aYuUim6KpYaUiZeDhmOMkZiNlImWi4yJi3B6lYl8jomLlJKKeoZ9f218ZXNwa217elyBeZCOgXt+f4CGj3t6aXVrdIyQioOHhn6XjW1/gHCCjoCOiX6Ee4ORlpubjH13eIKPeHJsZW59gWppdG9naHNsU11vZHBaX2xyd2Zra2NneHNvcGNfd2BhVWtfXnVPTktgZmJceHCKdFxbZXZgYWRkjmNgZmJYaXNzbWtxdot8dHmGgnZ3fotzf4Z/eol/cYmHgZGKiH1+mXZlc258ZYd/bm9rgFprbnl5cmB2enuNdnJ2inZ6n4ycr5ugkIKFeIiUfnuInIeEnpCOhYyXhJOOh4F1d3B5cG6Eb21ufnJjZHhwfG56fGpobGKkmsHcru+ic2x1g3WEoYSRbpWPlJ+TmoCRcIWLo5eJjpWKkJ2Vg4CUj4WIj4CSioqXfod7dn+JeIaFjpubl5mPkHaLeHCJi41/jaaGk4udhYZei5SXiY6IjYqKhIlsfJeCfYiGipKQhnaGfn5sfWR4dWpvenRYiHqRh4Z6f3+Aho1/emZ0a4GLj4uEhIGNmIZtg3dviZODkoV/gnuBkZeUm5F1dHiHjHRycGVzd4Bgc21vYWh0ZlJgcGdrVV9udHlhc2NgaX1xcm5bY3JhY1ZuWlx3TU1MY2ZhXXZzim1bXGR4XmBkZoRfY2NeWGlya25rcneLfXN3hIF4eHyJcYOEfX2Ie3SLiIiVhox/f5hzaHVxeWyLe250cIBXcHl2eXFkdnmGjGh2gIlxgJ2ImaicopKEfHCMlHd4iZyDhJ+NjnyVjH+aiIR8c3dwc2pvgWtpbHx0XmB4dntwdHpnYGV869q1ycPciXNsdIB2ipqIjGmXj46bk5GBiHCFiKCOhYuVioyXk3yNkoiCiI96kYuGj4KAd3iDhHKHgpOblpSYho12iIByh4SLiZykhZaOn4SJYYOVj4WIhYiMhoCHaH2Uf32ChYqOj4Jyh3+AcndodnJpdHhtWox9koKGfYCDgYSLg3ZidW2KgpGMg4CAk5J+b4NteoiRiJSFfYJ+gZOUkZiKb3J6jIV0a29pcHZ+XXNoblxpdF9RZHFoZlNfcHZ0YHBgXWiCcXJqV2dpY2lXbVdbdExKTGVmXmFyc4VpW1xleV5eZGd6YGRfXVlrbmVuanR3in5zcoF/e3Z6iHSFg3x/h3Z2ioWPmIGNgnuTdmx3dnl5k3Vud3p9WHmFcYBuZ3h2kYJkdoaFcYqWhpqhm6GKhnNvkotxdo2afYmZiIl7n3+DmX+CeXF0bm9kcn5oZmx3d1tfeHp6cXF/aWFnYX/Vto6RpnhucXd7cZKQjIZqmI2ImpCKhXpoh4uZhoGSkYaGl417jIyAgImNe5CNfomFenV7g3xxhoCVmY6TlIKJdoSIeIWCjZWfoYiXkaB/iGF/k4eDh4OIjH9/gmZ9kYB+f4OMj5F/bYN9g3VsbXd1dHd2bGONgY5/hX98hICFiYBxYHRyhn2QjoN9gJKKenKFZ3uFjIiNhXyFf4GVkJKUhW9weYt/dGxtaWl3emFnamlYa3RZUmhyaWJQYnJ4bGJlXlpqg25zYlxnX2VtX29UWm9OSE5mZFxmbnKAa1pbY3NfXGNrdmRlXV1abGxibWpzdoaAcW9/fH10eIZ4hYN8gIh2eImBkpV7iYZ2iYFveHl7g5JvbXuAdl6Df3SBbWh6c5RzZ3OHfHKSkoSan5ufhod1dZR+bXWSln2HkIOKjZl8jJp2fnZxb2xqYXR8Z2JpdXpaYHd7eW1xfmVkaGhXnY9fcnOXvMSEdnGUiI99cZaLhpuSi4dyaoiPloB7lYyBhJqMfIqFfHuJi3+UiHWJhnZ3foFydYaBnpSFlI+EhHKBineHfoubn5qIlY+dgYlmfZOCfoSCiIlxgX1mfox8eX9/h4yPfWmBfoR2Z3B5eHN3dGxrjoWKgYqAeYKBhYSBbF9zeXt+jouGfIKQgX9zgmp6hYmNh4V5hH2CmY6RjX5ubXuJfXZ0bmZle3RiW3BiV25xU1NtcmhhTmZ0eGZgXl1Zb4Bvc1llYl1qbmBwT1lrUURTZ2Baam5tfG5ZW11tY1picHZjZlxdYGtpY2xqc3aBg3BtfnyAdHWDeoOCfIGFdn6IgZaQeISKdIGIcnl5fo2Qb297gHFpgXh6fm1se3WVa2p4hHRrk42Gn5mgmYSIbn2Mdml3l45+gYqClJeJeY+Vb3p0cWxpZGBzemhfZXF6WmFyfHlncXlgZWWPsbJ3S2JapdnQlnF7kIqPd32TioSYkIuFbmuFkpF6eZKHgYSYinyGf3h3iYqEloBvi4hxdX57anmFg6WQhJONhH9wgIR4hnuInZuWjZWRlYWIcHuSgnyBgoiDboB3aICEeHJ/gIOKiHxlfn+EdmRxc4BpeXFvdZmNhoOLfXd5gYV6g2tccn9zgomHin6HinuJc4JvcoWIkIaGc4V6gpqNjoV5bm9+hH92emRmaHtvXlh2Wlhwa05XcXJmYEtsd3RhXlxbWnV9cm9XZ11manFgb05XaFI/WGZeWm9rZ3pxW1pYa2VaY3B5XmdcXmVsZ2VraXF3f4hvbH9+gHVvgnuAgn+Cf3aBhYiXiXGCjXF7hnx6eYSTjHVqeX5rb350f31vcnt6k29ugX54Z5KLg6GZnJGChWaGg29neZWIfX6EgpiJgXyOjWl4c2trZl9hb3ltX2JveFxka4J6YXF2X2Vl1Oq9izI6PouOf3F4hYeNjXWClox+ko2Mfm1shYyMdXyPf4WBlYh8gnhudoeEg5d3boiFbHV7dWZ5goOni4KPi4R+boF2eYZ8iJ+SjZGTlI6Lh397koZ3foOMgmt/cmiAfnhtfHyCi4N4YnqFgnJkcml+bnVxdYKbi4B/hYBzdn6Bc4JwXG5/dXmLhIt7iIF+iXl7cm2JhJGFjHODeoCXjIyAdW5rdoCAdXNbZ2d1bldWe1JZb2RMWnJyZVtJcHhvXFtbWV10fnRoWWJbZ2VvZGpNV2ZRPV1lXF11ZWB1cFpZVW5jWWRxeVpoXV9nbWdpa2lwd32ObWmChH55boB8fYF/gnl0gYGNk4RwgYtud36Ae3uIkol/aHp9anN7coV6c3Z9fox6eIR9fGuMjYSbnpaMgYBsjX1raH6Ni3p+foOTgn59iohrdnJnaGJbYmdzb19ha3NgaHCIeWJzdF5jZJugj25cNVqvtXRpgIh8koZ1hZWFc46KiXZvbIWDh3V5iXiJfJOHeX5yZ3WJfn6Yb3GGfmh2eW5meYeEpIeAh42Kfm+Ad4KDf46biIOVkpmKi4WJfI+IcHp9hHtofmxqgHt6anp3goiBcmB3gX5yZHJndoJtdXuGlZGBfIKBb3d6fHV/bVlwgHd1jYOHeIh2g4l7eXRvi4GRgoZzgH5/lImKe29uam2BgXRtXGZkcnBQWnpNW25bT1tyb2RVS3N4aVdZWVphcIB0YF1dYWdkaWlmTlloTUBgY1tgdWFddWxYV1N0YVpkb3JXal5iaGpnbWxocHd8k2xohIp8fHB+fnuBgIF6dn9/iouDcXyHb3F3g397iYyPg2p9e213eHaKdnx4f4KHf4N+fXpthYyImaONhIN7dYt4a2yEh5B4fnuCkYCAfouDcHNxY2ZeWWZfb29fYGdwZmpuiHRhdG9bYWRqdnuAv5ympMi4cYSCcpJ8d4aSgnOQi4dycm+De4N0dId0iHeUiHl5cGN3h3qAk2lyhHZnd3VjanyCiJ2BgH+Oj35zgHWHe4KTkYR6l4+WkIiCiXuIiGt4eX50Z3poa395c2l6doCDfWhgeIh9a2t0aHyAaXaBjJGUfnp/f3F8dnx0f2JWeH5zc4uFgn2EcYeKeHlxcYSDjoB/en9+d4+GhHdqcWlsh4Fxb1xmYXFtSWR1S11sVFNZcm5iUU90eGFSWFhdYXCCc1thXGllZWRrZFBbcElEY2BbY3BeXXdoVVdWdl1bZW5oVmteYWlnZW5uaHB2epNtaYiNeH1ye355goGBe3V8g4iGg3B3hHJtd4KCfomLk39wgHt3eXqBjHSCeH6BgYKEeYB1b36Ki5ueiH2FeneFe2d0hYuQeX5/e4iGhHaPgGdwbl9kXFhlWW1yYWBgcGxraIhuYXRpWV5kboB3qdqpx4aHsnGId2+MdHuFjX96kol/dHN0fneAcHF/bYR0lIV4dWtgeoJ5iY9mcYRwZ3ZuW219gJCTf4B5kZN+eXxuineCk42FdZeLko+HhYV7f4RsdHZ+bGd2ZG17dm1pd3d/f3xhYniGeml1dWN+e2d1ho6NlXt0gXdxgHt9boBaV3V/cHaFiH+Aem2JhnR6bHaBhIV/fH56fXSLgX50aHRlbouDbHNZaF5zZEdtbUtaYFdWVXdtYlBSdHZYUFZYXmFxhG9cYGNtZWReb2NUXHJHQmZfXWZnXVt7YlFWXHRbW2drYVZqX2BuZWZrcGdwdniOdGuOjXV+dnh+d4GEgXtzfYOIh4NvcoB0cXV+hYKJjYp7d394g3t8hod3h3x9gX6EgHt+cnV5jI2gjIl5iXV0g3hefYWXi3iGg3OFhoR3iXtibm1cYltbYVZpc2NgW2ducGaHcWFxZlddY2t/fMrOh7mham1timxxg3F8g4l+epCEeXhzeXV1e2psdmOEdZKCdm9mXn2CeouKZXKCa2pxY1hteoWbiIKBc5eUeH99b4pyhIuNiXOYj5GJhouDe3l9cHBvfGZocWJteHFqa3F4fX16XWV6gHhqdnhmg3dndIeMjpR9cohqb36BeW99XVlzf251gYt8gm9wioBxd2l4gIKAgnh+c3x1h317c2dzYW6LgWtxV2lddltHbWpMVlVdU1V7a2FPVHVyUFFUV15idIVpXWBsamZjWm9hWGJwSEFnXGBlXlxWe15OVWVwWVtqaF1XaGBecmVrZ3BncXN3hnhulYt0f3p4fnmDiH91cn+GhY6DcHB7eHd2eYaGh4yGenx/dIt+fYaEg4d+fn59h398eHV4eJGTn3+MfIptdX94ZIOGlYVzkYpvhYWBeoN0ZG5qWV9bXF1UZ3JkYFlkcXJngHJia2VXW2Bqf3e+rnugtm5hc4Voc3txeIGEen2Lfnd3cnZve3Zlam9hh3WOgHNqYl5/eHmLhGZxf2hra1pWb3eJo4GFf3GZk3KBeneEb4KDk4l0loqOiIWJhX14dHFuaHlfamxgbXZqZ2preXd6dlpnfXx5ZnN+bYV0ZXWFjYaWf3CMZ2t7hHVudWJdcX1sdX2Me4Jndod+bnFpdn95f4Bzfm17fIJ7eXFmbGJuiX1sbVZpX3ZVSmlqTlFOZ0xYe2hhTlV1a0xRVFVfZnWDZl5gcWhnYldqXVxraEpEallhZFZZVXlZTVZtallda2RcWWVjXnRlbWRwZnJwdYF4cZmGdn9+d398hYd9dXOCiICVgm5zeXt6c3OFh4mJg3iBfXWPfnyEio2DgYR7fouDe3Z7d3eanZh6iYKGaXZ9e2yDg5J/co6BcIWCf4J/cGdsZ1hdW1xbU2RwZF5XYnJ1anVvZWViV1xcaH9wb3KAc4lkZHl9aXN1c3KBg3eAg3h2cnVua3pxYmdrZ4Z0jYNuZl1ffXB7iX9pbXlnamRVV3JvjaZ8hHt2lpF1fXR+fG99fJKHeJp9iIeDhoN9dW9xbGd0XGxnXmx0ZGdlaXpve3JZaIF3dWhwgXiCdmJ3hYt8lIFvjGtte4JxZ3RmYW56Z3N4i3x+Y3eEd2pscnZ7cXt6dH9nf3+AeXdvZGZiboV7bGpVaGFvUkpoak9LTm9HXXpmYU1VdGRKT1NXYWp2fmVdZ3NpZmBWZFdicF1MS2pYY2FVVFVzVkxYdWRZXmtgXFpjZV92Z21ib2l0b3J+dHSagnd/gHeAf4aEen11goR+l4VucnR8enVxhIWPgYB6i3V0kH98gZWNgIWEfX2Mhnp9gHZ7o6WKeYiFhGt1fHp1g4GLem6Ec3mEfYKDdm9qaWVWXVtaWlNibWRbWGFze2pobWlgYldfW2qAamtvgGdrYGh5eGpyc3Ntg4B6f3x1dG16aGp5al9lbmiBdpCEaGVYYndqfod7b2pwZ2ZdVFhvZ46od4F6fJCOenZxgHF0d3qQgXmWdYaDgIWIdmpxdWdnbltsY11tcl9nYWp4aHtsW26Dc3RqcIF+endhd4WFeZCGdIhyb3mAcmNxaV1xeGVydIl8eWN0gHFoanp1cm15eHZ5ZIR8f3l3cWRkY258fGpqVGhhZVNKa2dPR1FqRWB3ZmFNU3JdSk1UWmVrdnplXm1xaWRdVmFVbm5XS1NoV2ZeWE1VbFRKXHlfW15rXV1aY2VgeWhsYG9vdm5wd3V6mH53f4F5gICHhnp5eoN+gZOEcXR0f3l2dIWIkX2AfJBrc5WBe4Kfhn6HfYB+hoKAint2hKuff3qHh4NrcoF5dYB+gXRuhm58gHOKgGpwbmRkWF9aWVpUYWpnW1pfdYJpXm1sXGFXXFxsgWVydH1paVxrdnVnc3ZxbIR7fXx4dXJseWdpeGZdZXNoeneTgWNjVGVwaIKFeHhnaWphV1ZZZ2OPp25+d4CLjntxcn9penB7jn14kHKEfn9/hm5kdXJkZ2dcamFcb29cZ19tdGV6aF10gG9ya3J8fnV2YnSFi3yJiIGAeHJ1f3VhcG1bcnRjcXOFfHVlc4BtYW17cGtqe3l2c2aGdnt7dnFlYmVtcn1pa1NnXlxUS3FiUEZVYEdidmZhS1RvWEpNWFhna3V6ZGVucWZkWldeWHdlVEpcYldoWFlIV2VQSGJ4Wl1fbFpeXGFjXn5pal9udHhtcG52g5d6coGAfH+JjIZ9dXWGeYeMfHR1dYJ5enqCjI59foSJaXOWgXqKnX5+hXqBen98hohzcY+tjHt7ho99ZHGHeXN8enVyb4Zse35sj3pjcG9iZV1lVllZV2Nma19dXXOFaFhxblteWFpcbHtjcHd1bGJZbHNzZ3R1b2yDeH5/eHZtbnRkaXRlW2d1ZnZ2knlfXVJmZmuDgnR+YmRqXFRXXWJjj6RoeHSDhpF5bnF8aXpufIZ8dopzgXl8eH9oZHZsYGZfXmleXHNrWWVdb29iemVcd3xrbm5weHl0dWRzg5J/iISJe3dvcn5zYnhkXHFxYnFygn10Z3KAZV5ud2llaHp8dW5vgnV0fXRyYl9mbm58ZGhTZ1hYVE12X1BKWVdIYnRjYUlUbVNKTVpXaWxxe2JtbHNjYlpaW2F3XFNMY11YaVNXR1lgTUdpdVheYGxbW19iYlyEaWdhbnh5bW9qdoGQeW2Df4CBk4iEgXZ0iHSMhnRydnWCd3x9foyQgH6TfnB3loN8mZN5gIB4en6AdIiDdHCZoXp6f4mUd2N1h3hzd3RrdG9+a3h8cJFzXnBuYGdibFRaWldoY21mW1xxiWVTcm5bWlhYYGx2Y2l1amleWW1zcGxzc3NphHx+fnt2bm5sZGlxY1trcmR1do5zW1dTZWFygH9ygl1iY11TWmBcY5GfZXFxhYSSdWxse29wcXt9fXOBd4Bzenp6ZGV1aF1iWWBnWl52aFdiXXBoYXdhW3x2aWpyb3h0c3VocYKVg4d/hXZzanF9bmZ3WF1sbmNydIF6dGdwfltgcHJiYGtyfm1tdX9zcnhrcWFcZWxtemBmUmVUV1FQdVtRT1hRSGNzYWBHVmtRSVBaVWtra3xmbm9xYltaWFlscVdSUGZXVmhTVEZaXE5IcXRYX2NsYlhgYGFdi2pjZG15eGxwaXV5h3trg31/hJp8g4R5fIduj4dyb3Z6fXSCgnyLj4OCl3R4gpSFgZ+JdYGAgXR/gnGHgnVvoZZze4aLhnpld4pubXpuZnhwemtzdnONa151bmFnZWtSXVtVZ2Fsa1pccYxkT29uXVZYVWdqdGhidGVkXFhtdG1vdXR4aoZ8f3uHdo9zY2RrbmFcbm1jc3iHa1pUVmNkeH19cYZdZF9jVFpfWWKVlWNucIOFinRraXxwZnR4dX1tenV2cHp/dl9lcmNbXVZhY1hhdGVVX2BtZGFxXV1+cGhpdHF0cXV2a22Ek4GJfIZxc2dwfnFzb1RcZ2tmcnWBd3RjbXZWYnJsW19wZ35mbXd+c3Rza25hWmRqandeZVNjVFVQVGxWUFZSUEdkcl9hRlhpT0lYVFZtaGR8aWt4a2JXXVVbdGRTUldoUVhmVFNIWlpQTXd2Wl9la2lZYWBeXo5uYWZreXVub2l2doB/bIOAfYeYe4CHgYl+a5OIcmd0gHt1gIN9iY9/i5NyfIqRhYefh3t/hox0gYZzfYJ2bqSLcoGNi3Z3bHqMYGR7cGZ5c3hsbXF3g2dkfG1jZmdoU19eVWdfbG5bXm6NaE5pbWBUVlNuZ3RrZXhkZFxYb3NscXp3cmyHe392m3p5a2FlbG1eYG9qZXF5fmdaVlhgbHh8e3CEX2NfZ1ZYX1djm4hia3CBh314bGx6blx3c217anZ0b3B8gHNYaW1eWFxVYWJXZHBjU15iaWFibFphfmxmbHR2b213d2xphYx/iXyJbXJncX1uc25jW2FpaXB0gnRzXmltU2VxZVVjb2N7ZHJ3fHdscG1rYFlhZmd0XGRVYFVSTldkUk9bTk9IZG9cYkdZaU1KX0tYbWRgeGlufmRgVV9UXXVcVFNgZk5dYVVTSlxZUFl0dV1fZWtoWGJhW16NcWNnanhxc25odnR6hHKCg3qIjn58iYeNeW6QinVsc4J0f3+IhYeRhJWPeX2Mj4eRm4WAfIyFc4CBc3R4cm+Tk5OTk5OTk5OTkpKSkpKSkpKSkpKSk5OTkpKSkpKSkpKSkpKSkZGRkJCPj4+Pj4+Ojo6Pj46OjY2Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2NjYyMjI2NjY2Njo6Ojo6OjY6OjY2Ojo6Oj4+Pjo2NjY2Oj4+Pj4+PjoKAfnp6fX5+fX1/fn59fn5+fn5+fn+Af4CAgIGAgIB/gIGBgYOHjI6Ojo6NjY2NjY2NjY2NjZKSkpOTkpKSkpKSkpKSkpGRkZGSkpKSkpKSkpKSkpKSkpKSkpGRkZCQkI+Pjo6Ojo6NjY6Ojo2NjY2Njo6Njo6OjY2NjY2Njo6Ojo6Ojo6NjYyMjY2MjIyNjY2Njo6Ojo6NjY2NjY2Njo6Ojo6OjY2NjY2Ojo6Ojo+Ogn99ent8fn59fX59fn5+fn5+fn5+f4B/gICAgICAgH+BgYCBg4aMjY6NjY2NjY2NjIyMjIyMkpKSkpKSkpKSkpKSkpKSkZKSkpKSk5KSkpKRkZGRkZKSkpGRkZGQkJCQj4+Ojo6OjY2NjY2Njo6Ojo6NjIyMjIyMjY2NjY2NjY6Pj4+Pjo6NjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Njo6Ojo2NjY2NjY2NjY6Ojo6Cf3x6fHx9fn19fn19fX59fn5+fn5+gH9/gICBgYGAf4CAgICDhouOjo2NjY2NjIyMjIyMjIySkpOTk5KTk5KSkpKSkZGSkpKSkpKSkpGRkZGRkZGRkJCQkJGRkZCQkJCPj46Pjo6Ojo6Ojo6Ojo6Ojo2MjIyMjIyMjY2NjY2NjY+Pjo6OjY6MjIyMjIyMjIyMjY2NjY2NjY2NjY2NjY2Njo6NjY2MjIyNjY2Njo6OjoN/fHp8e31+fH1+fXx9fn59fn5+fn5/f3+BgYGAgICAgYCAgIOGi42NjY2NjIyMjIyMjIyMjJFtZmdnZ2dnfYWEhISEiF0tMDAwMC1GoaGhoaGhoJqZmpqampqKg4SEhIOEd2VnZmZmaFxDREREREFSzNrY2NjY2rCdoKCgoKVeKi8vLzAsSIWDg4ODg4OLjIyMjIyMjY2NjYyMjY2NjY2NjY2NjIyMjIyNjY2NjY2OhX19e3t6fX58fH59fX1+fX1+fn5+fn9/f4GBgYCAgICBgICAgoWKjI2MjIyMjIyMjIyMjIyMkWdfYGBgX155g4KCgoKGUxgdHR0dGTekpKSkpKSjnJycnJycnImBgoKBgYJyXV9fX19hUjQ1NTU1MkbY6ufn5+fptqCjpKSkqlYVHBwcHBc6g4GBgYGAgYqLi4yMjIyMjIyMjIyMjIyMjY2NjY2MjIyMjIyMjY2NjY2GfH16e3p8fXt8fn19fX59fX5+fn5/f3+AgYCBgYGAgIGBgYGChYqNjYyMjIyMjIyMjIuLi4uRjo2NjY2NjY+QkJCQkJCMh4eHh4eGiZOTkpKSkpKRkZGRkZGRj46Ojo2NjYuJiYmJiYmIhYaFhYWFhpOUlJSUlJSQj4+Pj4+PiIKDg4KCgoWKioqKioqKi4uLi4uLi4uLjIyLi4yMjIyMjI2NjIyMjIyMjIyMjY2Njoh8f3l6ent8e319fX18fX19fX5+fn9/f4CBgYGBgYGAgYCAgYKFioyMjIyMjIyMjIuLi4uLi5GSkpKSko2RkpGJh46KkJKSk4+Ni4qQiY+RkZGRkJCQkJCPj4+Pj4+Ojo6Njo6Ojo2Njo2Njo6Ojo6Ni4qLi4uMjIyMjIyMjIyNjo6NjY2NjIuLi4uLiouLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyNjY2NiX59eHh5fH18fX19fHx9fX59fn5+f3+AgICBgYGBgYCBgIGCgoSKjIyMjIyMjIyLi4uLi4qLkJCRkZGPhI6QkIaKj4WNkJCQh4iFiYqGiJCQkJCQkJCQkI+Pj4+Ojo6NjY2NjYyMjIyMjIyMjIyMjIyMjIyMjI2NjIyMjIyMjIyMi4uLi4uLi4uLi4qKiouLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjI2Lfnx3dnh7fXx7fX18fH19fn5+fn5/f4CAgIGBgYGBgIGAgIGChIqMjIyMjIuLi4uLioqKioqQkJCQkIqFjoiOhoaPiY2QkI2EiYaGh4WHj4+Pj4+Qj5CPj4+Ojo6OjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLi4uLi4qKioqKi4qKi4qKi4uKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIt+e3d2eHt8fHx9fX19fX1+fn5/fn9/f3+AgIGAgYGAgYCBgYGEiYyMi4uLi4uLioqKioqKipCQkJCPhYOMjpCOiYyJjZCRiYKHjoiEhYiPj4+Pj4+Pj4+Pjo6OjY2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKioqKioqLi4uKioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMin18dnZ4fHx7fH19fH19fn5+fn5+fn9/f4CAgYCBgYGBgIGAgYSJi4yLi4uLi4qKiomJiYmJkJCQkJCMhoyJjoeFjYmOi4yOiIaHhoiEipCPjo+Pj4+Pjo6OjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKioqKioqKioqKi4uLioqKioqKioqLi4uLi4uLjIyMjIyMi4uMjIyKf353eHp7enp8fHx8fX1+fn5+fn9+fn9/gICAgICBgICAgYCBhIqMi4uLioqKioqJiYmJiYmPj4+Pj5CMjouPjIqPjI6MjZCOjIqKjoqOj46Ojo6Ojo6Ojo6NjYyMjIyLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLjIiAfXh5enp6e318e3t9fn5+fn5/f35+f39/gICBgIGAgIGBgIGEiouLioqKioqJiYmJiYmIiI+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pjo+Oj46Ojo6Ojo6Ojo2NjYyMjIyLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLioqKi4uLh4B8eHp6eXt8fHt8fH1+fn5+fn9/fn9/f39/gIB/gYGAgIB/gYSJi4qKioqJiYmJiYmJiIiIj4+Pj4+Pj4+Pj46Pj4+Oj4+Ojo6Ojo6Ojo6OjY2NjY2NjY2MjIyMjIuLi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKiYmKioqKioqKioqKioqKioqKioqKi4uHgHt5eXh6fHx6e3t9fX5+fn5+f39+f39/f39/f3+BgYCAgH+BhIiLiomJiYmJiYmJiIiIiIiOjo6Ojo6Pj46MjI+Sj5COjo6Ojo6NjY2NjY2NjY2NjIyMjIyMjIuLi4uLioqKioqLi4uLi4uLi4uLi4uMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKiomKiomJiYqKioqKioqJiYmJioqKioqKioqKioqKioqKioqKi4aBe3h5eHp8ent7fH19fn5+fn5/f35/f39+fn9/f4CAgYCAgIGEiIqJiYmJiYmJiIiIiIeHh46Ojo6Ojo6Ojo+MkJOQkI+Ojo6NjY2NjY2NjYyMjIyMjIyMjIuLi4uLi4qKioqKioqKi4uLi4uLi4uLi4uLi4uMjIyLi4uLi4uLioqKioqKioqKiYmJiYmJiYmJiYmKioqKiomJiYmJiYmJiYqKioqKiomJioqKioqKhYB6eHl5fHt6ent8fH1+fn1+fn9/fX9/f35/f39/gICBgICAgYSIiomJiYiIiIiIiIeHh4eHjY2Ojo6Ojo6Pj4+PjoyNkI2NjY2NjY2MjIyMjIyMjIyMi4uLi4uLioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYmJiYmJiYmKioqJiYmJiYmJiYmJiYmKioqJiYmJiYmJioqFf3l6eXh7e3p7fHx7fn5+fX5+f39+f39/fn+Af3+AgICBgYCChIeKiYmIiIiIh4eHh4eHh4eNjY2Njo6Oi42Nj5WPiYyPjYyNjYyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYR+eXt5ent7eXt9fHt+fn59fn5+f35/f39+f3+AgICAf4CAgICEh4mIiIiHh4eHh4eHh4aGhoyNjY2NjY+MjImKj42IjJGPjY2NjIyMjIyMjIyLi4uLi4uKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uKioqJiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJg355e3p8e3p7fX17fH9+fn5+fX1/fn9+f3+Af4CAgH+AgH9/f4OGiIiHh4eHh4aGhoaGhoaGjIyMjIyLiYyKiIeJhoyOjJCMjZGOjIyMi4uLi4uLi4uLi4qKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiImJiYmJiYmJiYmJiYmJiYmJiYmIiImJiYmJiYmJiYmJiYiIiIiIiYmCf3h7e3t6enx9fHx9f39+fn19fn9/f39/f4F/gIB/gICAgICAg4aIh4eHhoaGhoaGhoaGhoWMjIyMi4yOjoyKioeEiIuKjIuNjo+Li4uLi4uLi4uLi4uLioqKiomJiYmKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiomJiYmJiYiIiIiIiIiIiImJiYmJiYmJiYmJiIiIiIiIiYmIiIiIiIiIiIiIiIiIiIJ/eHp7enp6e3x8fX1+f35+fX1+f39/fn+AgICAf3+Af4CAgYCDhYiHh4aGhoaGhoaFhYWFhYyMjI2NjJCSjI2Ii4mJi4uLi4mLjIqMi4uLi4uLioqLi4qKiomJiYmJiYmJiYqKioqKioqKioqKioqKioqKioqKioqKiYqJioqJiYmJiYmIiIiIiIiIiIiIiImJiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIiIiIiIiIiHgXx4e3x5enp8fHx9fX9/fn59fX9/f39+fn+Af4B/f3+Af4CAgIKEh4eGhoaGhYWFhYWFhYWFjIyNkY+PjZGJjIaJjIuIiImMiYeNjo+NioqKioqKioqKiomJiYmJiYmJiYmJioqKioqKioqKioqKioqJioqKioqKiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4WAenl9e3t7enx8fHx9f39+fn19f39/f35+f4B/gH9/f4B/gH+AgoSHhoaGhYWFhYWFhYWFhISLi46PjoyLj4iHiYmMjYWFjo2KiYyNi46KioqKiomJiYmJiYmJiYmJiYmJiYmJiYmKioqKioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHhoaHh4eHhH55eX16enp7fXt8fX5+f35+fX1/f39/fX5/f3+Af39/f39/f4CChIaFhoWFhYWFhYWFhISEhIuLjI6MjI2Lh4mIiomGgoiNjoiKi5GTj4uJiYmJiYmJiYmJiYmIiYmJiYmJiYmJiYmKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIeHh4eHh4eIiIiIiIiIiIiIh4eHh4eHhoaGh4aGhoaGhoaGh4eDfXp5e3p5enx8e31+fn5/fn59fn9/fn9+fn+AgICAf35/f39/gIKEhoWFhYWFhYWEhISEhISEioqOjYmIiIqKh4iHiomIioiIh4qGi5GPiomJiYmJiYiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHh4iIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGh4J8eXl6eXp7e3t7fX5+fn5+fn59gH9/f39/f4CAgH9/fn9/gICAgoSGhYWFhISEhISEhISEhISKi5CPiYmJi4qHh4WHiYuKiYSLjYmOjYqJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiIiIiImJiYmJiYiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGgXt4enp4e3x7e3x+fn9+fn5+fX5/f39/f3+Af4B/f39/f3+Af4CChIaFhYSEhISEhISEhISEhI+Qj4+IiYuIhoeIiYuLjIuJioqNio6Oj4iJiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoaAe3h5eXh4enp8fX1+f35+fn59fn9/f39/gIB/gICAf39/gIB/gYKDhoiGiIaDhISEhIODg4ODkpKOioeKi4qLh4uNiYqJi4iHiouIio+SioiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhn96eXh4eHl5eXx9fn5/fn5/fn1+f35/f3+Af39/f4CAgH+AgH+BgoOHjo+PjoiHhIWFhoaFhYWSkI6KiYmIiImKioiIh4aKjIiHiYmOkJGNh4iIiIiIiIiIiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4aGh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWGf3l4d3d3eXp5e3x9fn9+f35+fn5+f35+fn+Af4CAgICAf3+Af4GBg4eOjo6Ojo6Mjo2OjY2MjZCQjomHhoiJiYeIiouIiYyJiYaKjY6PkYuIiIiIiIeHh4eIiIiIiIiHh4eHh4iIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhYZ+eXd5d3d6eXl8e31/fn5/fn5+fn5+fn9+f4B/fn+Af39/f39+gIGEiI6Ojo6Ojo6Ojo6Ojo2NkJGOi42JjIiIiYaHiYaIioiHi4yLjpCQiIeIiYmJiIeHh4iIiYmIh4eHh4iIiYiIiIiIh4iIiIiHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhoaFhYaGhoWGhYSEhIWFhoaFhYWFhX55d3l2eHl4e3x7fn5+fn5+fn5+fn5+f39+f39+f39/f35/f3+AgYOGjY2Ojo6OjY6NjY6OjY2Qj42Ni46KhoiKhISLiYeDhYSDi4mLj42JjI6QkI+NjYyLjY6Pj42NjI2Nj4+Pjo6MjYyMjY2KiYiHiImHh4aHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoeHiYqKiIeJi4yNjo2LiImLi42OjYyJiImMgHl3d3Z6eXh8e3t9fn5+fn5+fn5+fn5/f39+fn5/f4B/f4B/f4CBg4aMjY2NjY2NjY2Qj4+Pj46NjI6KiYuMjIeFiY2Lh4aIh4aHh4uNjo6Pj4+Pjo+Pj4+Pj4+Pj4+Pj4+Ojo+Pj4+Pj4+Pj4+Oj46Oj46Mi4uJh4eHh4aIhoaGhoaGhoaGhoeLiYeHiIiLjY2Mi4yLjY2Ojo+Ojo6Pj46Ojo6Ojo6Ojo6Njo6NjY2AeHZ4eHp4enx6fH5+fn5+fn5+fn5+f39/fn59fn9/f39/gH9/gIGDhoyMjIyMjY+QkpOTk5KSjYyMjIqHioyKh4eJiYWCiouIiYWJjpCNjo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjI2NjI2LiYaHh4eHiYqLjY6NjYyNjY6OjY2OjY2NjY2NjY2NjY2NjY2OjIyNj4+OjY2MjIyLi313dXd5enp7e3p+fn5+fn5+f35+fn5/f39+fn1+f39/gICAf3+AgYOFj5KRkJGSk5OTk5OTkpKLi4uLiomMiouLiYuKhoeOjYiIjI6OjIuMjIyNj46Njo6Ojo2NjY2MjY2NjIyMjIyMjIyMjY2NjYyMjI2NjYyMjI2NjIyNjIyMi4yMi4yMjI2MjIyMjIyMjIyMjIyLi4uLi4yNjY6Sk5OSkpSRkJOVlZSTk5COjo6Oe3Z2d3h6ent7e31+fn5+fn5/fn5+fn5/f35+fn9/f39/gIB/f4CBgoSNkpKTkpOSkpOTkZKSkoqJioyJi4qJjIuKioiHiYqKi4mKjY2Mj46Nj5KUlJOUlJOTkpGSkI+Ojo2NjY2Pko+OkZGOjIuKioqLi4qKi5CPjoyMjIqKioqKioqKiouKioqKi4yLi4uMjIyKiouLi46RkpOTk5SUk5STk5SUlJOTk5KSkpKSk5F6dXZ2eHt7e3p6fX5+fn5+fn5+fn5+fX5/fn5+f35/f3+Af39/gIGChIuRkZGRkZKSkpGRkpGRiYmIiIqMiYiJiYuJhoSJhoyKh4ySkpKTk5OUlZWWlZWUk5OUlJSUk5SUlJSVlZWVlZWUlJOTkY+QkZKQjoyRlZWVk5KSjo+QjYqKi4qKi42OjY6RkpCRkpKSkpGRkpKSk5OTk5OTk5OTk5OTkpOSkpKSkpKSkpKSj3h1d3l6e3t7ent9fX19fn5/f35+fX5+fn5+f39/f39/f4B/f3+AgYKEi5GQkJCSkpKRkZGRkZGIiIiIi4uJg4eLi4yMiIeHjYyNkpSSkpOTlJWWlpaVlZSSkpOTlJSUlJWVlZaXlpaWlpWUk5SUlJSVlJSUk5OVlZWUk5KTk5OTkJGSkZGSk5OTk5KSkpOSkpKSkpKSkpKSkpKSk5OTk5SUk5OSkpOTkpKSkpGRkZGPdnJ3enp7e3t8fX59fX1+fn9+fn9+fn5+fn6Af39/f3+Af3+Af4CBgoSKkJCRkZGRkZCQkJCQkIeHh4eIiIiFi4+KjI6Njo+OkJWUk5OTk5SUlZWVlJSVk5KSk5KTlZSUlZaWlpaWlpaWlpSTk5OTk5OUlJOSk5SVlZSTkpKSkpOTk5OTk5OTk5KSkpKSkpKSkpGSkpGRkZGRkZKTlJSUlJSTkpGRkZGRkZGRkZGRkYx0c3d6ent7e3x9fX1+fX5+f35+fn5+fn5+fn9/f39/fn9/f39/f4GDhIqQkJGRkJCQj4+Pj4+Ph4iKi4yNjYuOj42Mjo6RkpGSk5OSkpKSk5SUlJKSk5OTk5OSkpOUk5OTk5WVlZWUlZWUk5OTk5KSk5OUk5KTlJSUk5KSkpKSk5OTkpKSkpKRkZKSkpKSkpKSkpKSkZKRkZGSkpOTlJSUk5OSkZGRkZGQkJCQkZCRinN0dnp8fHp7fXx9fn59f35/f35+fn9+f31+f39+fn59f39/gH+AgYKDipCQkZGQj5CPjo+Pjo+Oj4+Pj4+Pj4+PkI2OjpCRkpKSkpKRkpKTk5OTkpGSkpKRkZKSk5OSk5OSk5STk5OTlJOSk5OTk5OTk5OSk5OTkpKSkpKSkpKSkpGRkZGSkZCRkZGRkpKRkZGRkpGRkZGRkpKSkpKSkpKSkpKRkJCQkJCQkJCQkJGGc3V2e3x8e3x9fX1+fn1/f35/fn5/gH9+fX5/fX5/fn5/f3+Af3+BgYGKkI+PkI+Pj4+Pj4+Pj4+Oj46Oj4+Pj5CQiI2PkJGRkpKSkpOTk5OTkpKSk5KSkZGRkZKSk5KTkpGRkpKSkZKSkpKSkpKTk5KRkZKTkpGRkpKSkpKRkJCQkJGRkZGQkJGSkZGRkZGSkZGRkZGRkZGSkpKSkpKSkZCRkZCPj4+Pj4+Pj4+PkX9ydHh8fHx7fHx9fX5+fn9+fn5/f3+AgH99fn5+f39+f39/f4CAf4GBgYqPj4+Pjo6Ojo+Pj46Ojo6Ojo+PkI+Pj4+GjpCQkJCRkZGRkZGRkZGQkJCQkZGRkZGRkZGRkZGQkJCRkZCQkJGRkZGRkZGRkJCQkZGQkJGRkZGRkI+PkJCQkJGRkJCQkJCRkJCQkJCQkZCQkJCQkJCQkZCQkJCPj4+Pjo+Pj46Ojo+Pj4+PeHJ2eXx9fHp9fH19fn5+f35+f39/f4CAf39/fn5/f35/f39/gIB/gYGAio6Ojo6NjY2Ojo6Ojo6NjY2Oj4+Pj4+PjoiQkZCPj4+QkJCQkJCQkI+PkJCQj4+Pj5CQkJCQkJCPj4+PkI+PkJCQkJCQj4+Oj4+QkI+PkJCQkJCPjo+QkJCPj4+Pj4+PkJCQkI+PkI+Qj4+PkI+PkJCQkI+OkI+Pj46OjoyMjY2NjIqDiYhzc3Z4fX58eX18fX1+fn5/fX5/fn9/f39/f4B/f39/f4CAgH+AgH+BgYCJjY2Ojo6Ojo6OjY2OjoyNjY6Ojo6Ojo2NiJCRkI6Njo6Ojo6Ojo6Pjo6Ojo6Ojo6Pjo6Ojo6Ojo6OjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Pj46Oj4+Pj4+Pj4+Pjo+PjY2MjYyNjoyLi4mJiYiFhYSDgoKEgnR5fXp4dXJrZWltb2xmZmdncHNzd3l9fnl6e3x9fX1+fn59fn9/fn9/f39/gIB/f3+AgIGAgIB/f4CBgImNjY2NjY2MjYyMjIyMi4uLjYyMjIyMjIyGj5GRjIyMjIyMjIyMjIyMjIyMjIyNjY2MjIyMjYyMjY2MjIyNjY2NjYyMjI2MiomKi4uJh4KAh4iEgXt6gH57fXx8fXlzcnJycnV1cG1ramppZ2NkYV9bXF1eWFVXWFlTS0VJSkpLTE1PT0tgdHR3eX19eHp5e3x8fX5+fn1+f39+f35/f4CAgH+AgICBgYCAgICAgIGAf4OEhYSFiIuLjYyMjIuLi4yGiYqKioqKh4OOkJGNiouLi4uMiYmKioqKiouLi4eDi4qIiYmGhYWEhIeJiYWCg397fHl6e3pzcHFxcW1samdsbWdlZmVmZGNlZGVkZWVlZWRkZGNhYV5dXFpYWFdUUFFSU1JTTU1KSUZESEpHR0hHR0xOSWdzdXh5fXp4d3l8fHx8fn5+fn9/fn9/f39+f4CAgIB/gICBgICAgICBgYFnXmBjYWNucX17ent/fXd8fHZ4ent4eHpvcHt4eXt8e3h3e394dXd0dHZ1dHZ3dXFycW5wcnBnaGtsbm9tamlpaGhlZWRkZF9gYWJgYF5dWVhaWltdXV9gX2BfX19gYmFeXl5eWVldXF1bV1dWUlRSU1NOUUpISUZERUhMTEhGR0lLSklNbXJ0eHp7end3eXt6e3x+fn1+f39+f35/f35+gIGAf3+AgIGAgICAgICCgWdYW1pZXFtcY1xaXF5ga3FtcHBvbm5vbmtpbmxrbG9qaWtraWpraWdmZ2dnaWhnbWdqZ2hlaGdjY2JhYmBgXVhbW1dYV1RWUVBUU1NNSkxLTExOTk9UWFhXVVVUUlBQTU1QT05LTE1QUU9MTEpHSUlHSEhJSEhIR0ZHSEpKSEhISUlISVZwc3V5ent5dnZ5enp7fH59fX5/f35/fn5+f3+AgX9+f4B/gICAgICAgIGBbFtYVlZWWVlaWVlYVVZoamxubmxra2poaGloZGVkYlxiZl9fYGNfXF9dYF1eWl5dWVleYmFeXlpZX1xYV1NOTUxLS0tMSUtNTktKS0tMSktQTEtLRkdHSUlGR0lISUZFSEdGRkVERUVEREVJSUlHSEdIRkZLTUtJSUlIR0hLTU1LTExMVXFzdnl6e3h2d3h3ent8fn1+fn9/f39+f3+AgIGAfn5/f4CAf4CAgIB/gYJoUlRVVlNVV1lZWVdXV1tbYWNfXlxbWFZWWVZSVFJRUVVUU1NTUE1KTU5QUk9NUFFRUVFSVlZRUVFUUFBOTk9MSk1MS0xKSktLRklJSkxJR0pISUlFR0dGRkVFSElKR0ZHRkZHR0hKR0dISEpMSkpLSUlISktLSkhKS0pISUtMTU9QUEtUdHR1eHp6eHZ2d3d6e3x+fX5+fn5/f35+fn+AgYB/f3+AgYB/gICAgH+AgmlQUlRXVVRWWVdYWFpbVFRTUlBRU1FRUU9OTlBQUU9MTlBPTk5NTEtNTk5QTU9QUFJRUE5OT05PTk9PUFFPTk5PTk5QTk1NS0lISEpJSUlJR0ZHR0dJSkhJSEhJSEhHSEdISElISUxLSklISkpJSkpIR0pMS0pJSUhKSktMTk1NTU9RTFVzcnN3enl3dnR2eHp7fX19fn5+fn9+fn5+gICBgICAf4GBgH+AgICAgICBbE9PTlRZVVVdW1lXV1hOTUpKSUZKT0xKSkdJSk1NS0pMTUpHSUlJSktMRkRGSktLS0hKTExMT01MTE5PT09NTk9MTk5OUFBPTE1MTk1MTEpJSEdJSElISElJS0xLS0pJS0pJSklJSUlJR0dKSUdJSUpKTk1OTEhJSklJSk1PT01MT1JOWXBwcnd4d3d0c3R3enx+fX5+fn5+fn5+fn9/gICAgICAgYCAf39/gICAgIFvS0pNTlFOTlVXVlZSU0lFQ0VFUkREQT5CP0RAQD5CREFAQURHRkVIRUJBQEBDQ0RFQUNFSEtPS0lJSkhHSklKSUlLSkxQTk1MTU1MTU1NTElIREZGR0ZGRklKSUlLSkhMSklKSkpJSEhKS0tIRkdJSklLTU5OSktPTUxLTU1PUE5QT1BgcG9yd3h2dHJzdXd6fX19fn5+fn9+fn1/gICAgICAf4CAgIB/f3+AgICAgXNQUE5OUE1KS1BSUE5RQ0RCQUZRRT1DPT9FSDk6Oz0/PTxBRkA+Ojw+PjxFRD0/RUE/QEFAREVHR0dHQkRERUZFR0dHR0pHSEpLR0NER0pHQ0RFQUFDR0hHSEdISktKSElMS0lISktLTU5MTUxMSkpMS0lLTU9PUFNRT1BQTk9QUlFNUGdwb3N2dXRycXR4eX19fX1+fn5+f4B+foCAgH9/gIB/f4CAgH+Af4B/gICCdlRVUVFQT0xNUFBOT09BQkFAQkE/Oz48Pj8/Ozg5OTs7OkA7Oz48Ozs8PEhMPT1BQT9CQz1BRERGQkZGREdJSEM/QEBAQUFCQUE/Pjw9PkFAQD8+P0BFR0dHSUtMTk1OTUxNTUpLTVBVU05MTlFOTk1OTE1NTk9OTk1LS05OTk1OTkxUbnBwcnR0c3Fydnl5fX19fn1+fn5/gH5+gICAgICAgH9/gICAgH9/gH+BgIJ4UVFSVFJTUVNTUVFST0BAPT4/PD8+QEE/PT45Ozo6Ozg5Ojg3Ojw5Nzg7Oz49Ozs6ODpAQEFCP0E/Q0ZEQkNDPzs+PkBDQ0E/Pj9BPkBAQj9APD9CQEFDRUVFSktQT1BPTU1OTExMT1JRUFJOTExPTUtOT0xMTEtMS0tKS0tKTU1LS1xxcXF1c3VzcXN4eHp9fn1+fn5+f39/fn5/gIGAgH+Af4CAgICAf4CAf4CAgXxSTU9RUFFSUlRSU1NOPDs8Ozs7P0BBQkA9PDk8PTw5Nzk6Ojk4ODo6Nzg6OTo7Ozg3ODk7Ojg8Oz1AQUA9Ozs+PD09QEJDQT9BQkE9Pj09Oz0/Q0RCQD9BREJFR0pKSkpKTE1MTExNTExOVVNLTE1USVBKSU1KSUpLS0pJSEdKS0lKZnJxc3RzdXJydnl5e31+fn5+fX9+f39/f36AgICAf4CAgICAgIF/gIF/gYCBgFZMTlBQTlJRUFBRUU44PT88PDo9PkFAQT8+PkA/Pj07PDw+Pz08PTs6PD09PTw8PDw7Ozo7PD49Pj8/QUA+P0E/QEBBQEBAPT8/PTw6Oz09PD9AQUJCQUBCREZGRkdGR0dISUtMTExLTEtKS0lKSk1MTEpMS0lISUxMSklJSElLR01tcHF1dXV1c3V4eXl8fX5+fn5+fn5/gH9+gIB/f39/gH+AgYCAgYCBgICBgYCCYUtPT05OT1BPT1BQTzo8Pjw9Oz8+PkFBPz0/Q0NDQD48PT9APz89Oz49PkNFPz9APTs9PT08Ozo9PkFBPz5AQD9BPz89PD48PTs7PD0+QUA/QD5AQ0NEQkRFSEVFR0hISEdGSUpJSUlJSUhKSkpKTEtKSklJSEhKSktMS0lLSkpIVnBvcXNzdHR1eXt7e31+f35+fn5+f39/f39/f3+Af4CAgICAf4GBgICAgIGBgIJtTFBRTk9QTk5PUFBPPjw8PT4/P0A+QEA/Pz9DRUQ/PTs8QD46Ozo6OTc6PDk9PUA9Ojw7Ozw7ODk7Pz49PD07PEA9PTw8Pjs9PD0+QUBCQUBAP0JEQ0RFRkZGQ0VHSElJSEhJS0tMTUpKSUpNTUpLSktJSEhISEpJSktKSk5MSUlfcHBycnJ0dXZ6e319fX5/fn5+fn5/f35/f36AgIB/gICAgICAgYGAgICAgIGAgnZNTk5NTk5MTE5QT0w+QTw8PT8+QkM/P0FBQUJBQD08PTs+PTo6Ojw6ODk4ODo7PT8/PDs7PDs6Ojs+Pz89PDg6Pjw9Pj89Oz4/QEJDQkJDQ0FCQkFCQkRCQkRCRENGSUdGRUhJSUtNSklKSktMSkpJSkVESUlGRkhISUpKTEpGRmdwb3FxdHZ2d3t8fH18fn59fX1+fn9/foB+fn+AgH+AgICAgICBgYCAgICAgICBek5JS0tMTExFSUxOTTw/PDw9PkBAQUE7QkNCQ0A/Pz9APT9APjw+QD89PT0/Pj0+Q0Q/Ozw9PkA9PT5BQ0A8OTtBPz4+QT07P0JAQkNCQENDQUNBPT0+QD0/QUFBQENFRUBAQ0JDR0dFRENGRUZGR0VEQEFHR0ZDRkRHSEpHQz5IbG9wcHF0dXZ5fHx9fHx+fn1+fn5+fn5+f36Af3+AgICAgICAgIGAf4CAf4CBgIF+UUhLTU1NS0pLTE9RQD8+PkFBQEBBR0FCRUNEQT9AQEA/PUA+PD0/P0BAQENAQD9AQD49PD1ARUFCQkZIQz08QERDQUE/Pj1AQT4+Pj88PkBER0VAPkBBP0BDRkVDQkJDQEJEREJERUFCPkFCQkFCQEA9QUJDRENDQUNFR0E/PVZwcHFwcnV1d3p8e3x8fX9+fX19fX1+fX5+fn9/foB/f4CAgICAgYCAgIB/gIGAgX5SSEtNTUxLS05OUlVEQkBDQ0FBQkBCQ0BAQUFAQUA+Oz48Pz08Oj49P0JCRUA/QE5hX0pAQ0VJSUlJTU1LRUNGR0hFR0VFRUREQ0E/QD4+QkZKSkdFRUZGRkpOTUtKSUdHSEtMSkdHQ0REREVEQUJCQ0BDREVEREVERUZDQkFEZW9wcXF0dnV4e3x6fHx+f319fX19fn59f4B/f39/f39+gIGBf4CBgICAgH+AgICAfVJJSUpKSEpKTE9SU0dGRUdIREdIREA+PDs+QERFRD88QUNEQj89QT9BREVFQ1d1homKflhHSUpMTE5PT0xIR0hHSElJSEhHR0hIRUNFRUVFRkhKSkZFR0lKTU9PTU1LSktKTU5LSUhHSElIR0ZFRkZGREZIR0VFSEhGSEdIRlFub3BxcnZ2eXt7e3p9fX5/fX19fX1+fn1/f39/fn5/gH+BgYGAgICAgICAf4GBgIB8UEhHSElGR0lKTU5OSkxJSUpLTE5KRkNBQkNGSkhJR0hISUdHQkRGRERDQVZ0h4mHh4aIgldJTE1MTU1MSkdHR0dER0dHR0ZIRkhFQ0RERkVEREhIQ0NDR0pKS0xMTEtMTElKS0pKSUlJSEpISEdISUhHR0hGRkZISklJSUlIXW9vcXJ0d3d6e3t6e319fn59fX19fX5+fYB/f39+fn+BgIGAgYCAgICAgIB/gYCAgHxNR0ZIRkVGR0dKS0pMTUxLTU5NT0tJSEhKS0tMS0pLTUpLSUhGRkdGRVBshIeGhoaHh4iHfFBLTEtIR0ZGREVDQ0BBQ0NDQ0ZGRUJAPj5AQUFAQkQ/Pz9ERkhERUdJS0lJR0hJR0lJSkpJSEZKSkpKSUpJSkpKRklMTEpKS0tmb3Bzc3R2eHl7e3t8fH1/f319fX19fn59f39/f35/f4CAgICAgYCAgIGAgICAgICAfU9GRkdGR0hHRUZHR01NTUtMS0lHQ0NDRElLS0tLS0tNTEtNTUlGSlZsgYaFhIWGhoaHiIaKdUlJRkI/P0A/Pz88PDw+Ojo8QUFAPjw5OTg8PD07Pjs5Oz9BQkFBQ0NDQEFCRURBQ0ZISUhISEtNTEdJSk1NTk1KSktLSkxNU2xvcXRzc3d5e3t7fH19fn9+fX19fX1+fn5/foB/fn9/gICBgIGBgICAgYCAgIB/f39+UUZFRkdJSUdEQ0VGTk1MSklIRT85Oj5ARUhHSUlLTE9OTlFOUV5ygYWDhIWFhoeIiIiJiYyOZkJCPjg4Ojo5ODc4ODk2NDc5Ozw6ODU2Nzc4OTc4NzY4OTs7PD5BOzk5OT09Pjs7PUFDRUhKTUxMR0lIT1JRUFBOTE1NT1Fdb3BydHN1eHp7e3x8fn9+f359fX59fX5+f39/gH9/f4CAgICAgYCAgICAgICAgIB/f39RR0ZHSEpIRkVGR0hMTEpJSUdDQjU2OzxDQEJGSEtITEtPVWd7hISDgoOEhomKi4uLiomKi4yJVDs4NjU2NzY2NjU1NzYzNDY4Ojg3NjU2NTY3Nzc3ODo3Nzc4Ojs3Njg5OTg5ODc2OjxAR0ZJRklGRUZPU1JTU1JPUFBSVGVwcXN0dHd5e3x7fH1+f35/fn19fX19f39/f3+Afn+AgICAgICBgICAgICAgICAgH9/flJISEhJS0lHSUpJSkpLREVIRUJANTc4OD06PERCREZGRWZ6g4SCgoOChYmKiomJioqKiouJiYqBSDY3NjQ2ODg3NDU3ODQ2Nzc5OTc2Njc2NTo6Ojo6PDg5ODk5ODc3Ojo5ODg3ODU4OTtBPT4+QkE/QUtMT1FQUU9PUFFXa3JydHR1d3p7e3t9fX5/fn9+fX19fX5/f4B+fn9/f4CAgH9/gICAgICAgH+AgICAf39+VEhHSUlMTUtKS0tMSUg/QEFAPDo1Nzk4OTc6QTk8REBRf4ODg4SEhIaJioqIh4iIiIqKjIqJiYx6Pjo4ODs8PT45Ojs8ODk7OTo7Ojk5Ozo5PT09Pzs7Oz06Pjw6PDs8Ozw7OTo8ODo6Ozo5OTk8Pzw9QUJESUpNS0pLTFdvcnR1dHZ4e3t7fHt9f39+f359fX19fn9/f35/f39/f3+Bf4CAgICAgICAf4CAgH+Af35URkVGSUxOTkxKSk1CPzo7PDo4OTk4OTk5OTo+PT9ARHaDg4SEhYaIiYiHhoaGiImIiYuMi4mKioxsPDs+QkNFRUFBQUI+QENBQD89Pj5APz4/QD9APT0/Qj9BQT9BPz1AQUA/P0E8Pjw7Ojs6OTs/PTs7PT1BQUNBQkNBWHBxdHR0dnl7e3x9e31/fn9/fn19fX5+f35+fn9+f4B/f4CAgIB/gIGAf39/gICAf39/flJFQ0FHSk5PTElHSzo4Ojs5Ojo8PDo7Ozw7PT5BQD5ihYOEg4WEhomJiIeGhoaHiImKi4uLioqLiotePkRHSUtKSUZHR0RGSEdFQ0BAQ0VDQkBCQ0I/QERIRUNFREZFQUZFRkRGRkRAQj89QD49P0A+Pz8/Pj8+Pjo7PTxgcXJ0dHV3enp6fX19fn5+f39+fX19fX5/fn5+fn5/gH9/gICAgICAgICAf4CAgIB/f4B+UERAPUNIT01HRkJEOTc6PTo8Oz4+Pj87Pz1AP0M/Sn6DhIWGhoaIiYiIh4aGhoeJioqLjI2MjIuKiodXR0xMTUtOSUlLSElKSklFQ0RGR0ZEQ0VGREJISUxHR0dGSEdFS0pMSUtLSkNGQ0NEQkFBQ0JEQ0NERENBPTw+QGhwc3R0dnd6eHt8fH19fn5/f359fX1+fn9+fn59fn+Af3+AgH9/gICAgICAgICAgH+AgH9PQT49P0RMS0BCQkE5Nzw+Ozw6Pj8+QD0/P0JCRT9ohIKFhYeHiImJiIiHhoaGiIiIiYqMjYyMi4uKjH9QTVBNS05LSkxJSUpIS0ZER0hISUVFSEZGRUxMTUlKR0dISUpOTU9NTE5LSEZHR0VFQ0ZGRkZERUhIRkNBP0BMbXB0dXZ4eXl5fHx8fX1+fn9+fn19fX1/f35+fn5+f39/f39/f3+AgICAgIB/gICAgICAf1FBPz4/RkdHPTxAQDg3PDo7PDo+Pz0+PkBBRENJU36DhISFhoaHiIiIiIiIh4eIiIiJioyNjIyMjIuKjXFNUU9NTExMTEpJSEZKSURKSEdLSkhKR0dHS01OTExISElKTVBOT05NT0tJR0lKSElESUhIRkZHR0lHQ0JBQ1VvcXZ2eHp7eHh6enx8fn5+f39+fn1+fX5+fn5/f36Af39/f3+Af4CAgICAgICAgICAf39/VERBQUJHSEI/OD9AODo7Nzw9Ojw/PD0+QEJERE1thIOEhIWFhoeIiIiIiIeGiIiIiIiJjIyLjIyMi4uLi15SUlBNTk1LSkdHQ0hKR0xKRktPTEtKSk1NTE9QTkhJS0xPUVFQUU9PSklKSkxKTEZHSEdGR0lGRUVCQEJCXHByd3h5enl5eXp6e3t+fn5/fn59fX19fn9+fn9+f4CAgIB/f39/gICAgICAgICAgH9/f39VRUNFRUdHRUQ7QEE7PTw4Pz09PkBFRT5DRUNHS3WGg4ODhISGiIiIiIiIh4eIiIiIiIqLi4uMjIyMi4uNfFdWUlJUUk9MS0pFRkZLT05PV1ZRUE9RU1JOU1RPTVNMUFNVV1JTUlBMSk1NTUtOR0dKRkZJSkRERUVCRENjcXV5eXp6ent6e3p7fH59fX9+fX19fXx9fn5/gH9/gICAf39/f3+BgYCAf39/gIB/f39/f1VGRkdHR0dIRj5AQj0/PTxBP0FBRVVMQklKR0pMeYaDhYWEhYeIiIiIiIiIiIiIiIiJiouKioyMjIyOi4uLZ1ZWa2FFUlFRUEo7O1FTUmB1XVVWVFZZWVNZWFJaZlBVV1pdUlRXUVBOUlBQUFFLTEtHSEpIRUZJSUlISWpzdnl5enl6e3t8ent8fXx9f359fX19fX1+f39/f3+AgIB/f39/f4CAgIB/f3+AgH9/f35+VEhKSUlHR0ZFPz9BQEVBQ0ZEQ0RLVlBLUFBOUFB5hoWHhoWGh4iIiIiIiIiIiIiIiIiIlJyMioqMfWGKi4uGbFtkVTpYWFhTUD9AVlVZXGRgVllicl5dV11aVkVRWVpcWV9UWWdSVVZYVFRWU09PTUpMSklJTE1LT01Tb3R2eHl4d3p6ent6e3x9fH5/fn1+fX19fn1/f39+f4CAgH9/f3+AgICAgH9/gH+Afn9+fn5WSkpJSEdGRERCQT9ITElNUEtJSk9TUlFVVlVWVHWFhIWFhYWGh4iHiIiIiIiIiIiIiImcnaCPiY5nO36MiYqLem5wWFpbWlJTUldWVFpadYNZVX2QYVxYXV5XSVZeXltbX1lIWVhZXF1YWFlXUlFNUFFNTU9TUVFVUmFzc3Z3d3Z4eXh6e3t8fX19f39+fX59fX1+fn9/gH9/gIB/f3+Af3+AgICAf39/gIB/gHh5fVlOS0pJSUZCREBBOk9RUVdYUFBQUVJTUlZXV1dXbIGCg4WEhYaHh4eHh4iIiIiIiIiIiJaanJeIioFuhomIh4OKfmZZWVxZU1ZUV1JRV1ZjloBRZXJYWldfaFBgZlpaWFxoYkdPWmlnXVtcXV1XUk5TUFBRVlZWVllab3N1d3Z2dHd4eHt7fH19fX5/fn59fn18fn9/f3+Af39/gH+AgH9/gICBgYB/gH1yfX9/b3R8XVNQT01LSkVDP0A7UFBaWlpSU1FPUVJRVVJVU1ZedXiAhYSEhYaGhoaHh4eHiIiIh4eIh4ORjomJiIaFiIiGfYB7XFBWWFRSVFJRUUxPTUtmeVpdVFlVVl1aTFRaVVNUXlpYV1dXemtYWlxcXlRRUVBJTk9XVlhbWmRxdHZ2dHR2eHl5e3t8fX19fn99fn1+fX1+f39/f4CAf3+Afn56eHd2c3V7f3+AgHRrfn5rcnleW1ZVU1JPS0ZDREFNXoNsVlJTTk9RT1FWUlNSUlRjZHaAg4KDhISEhIWFhISDhoaGhoeIhn6JiYiHhoOHh4d5bXFWSUtOTktNS0hKREZIRUM+U2NVf1JQUU5LUlVSTU9ZUU1OUVNVVU1RU1JQT01MSENJR1JTVFpdbXJ2dnV0dHd7ent7e317fX19fn19fX59fn9/f39/gH99fX5+f39/f4B+e3Zzd31+fmR1fWlxdGBkXV5bWVVRTElMSWFsknRQUVNOUVJQU1tSU1JRUlVVYnN7fH6AgYKBgX99e3uAf4OChYaHgoaGhoGEgYaFhnVfXUtDPkJCQ0NCP0RQQ0RAQz5CSEdWQElOTUddaVFIRk9GREVGSEdIQkNIR0hLR0RCQUNATlBNUmR0dXZ1c3R2enx6e3t7fHx9fHt+fX19fn5/f3+AgIB/f3x8fX+Af39/f4CBgH12dHt/bWh8Z25xZmllZWJcWFNRUFVSc1dlW09PTkxRUlBVWVNVUVFUUk9WYGtsc3Z6e3h5dXJuc3RzeXh+foOAg4OCgYKAgoGBa0xHPj46Oj5APz8+PmpQSmFFRkhJRUI/SE1NR01RVUpCRT8+PD08PT0/PT9BQ0NAPzw9Qj5JTUZVb3V1dnN0dnh7fHp9e3x9fX19fH59fXx+fn9/f4B/f39/enl3eHd2dnh7foB+fXt4dnx1YXhnbHBqbGppZmBbUVFaXFleSUpPUE5LTFFSUVRVVVdRUVdWUFhbYl1hZ21tbG9raGBucmltbHF1e3p9e3h6fHx4d3hkQkBAQTw6QkNBQUNBW1xOe05PT05LTE1PT1BMS0xXT0lHQUE8OTc3NTk5PTs7Ozg5ODk/O0FHPlx0dXZ3dXZ3eXx8fH18fHx9fn18fX19fX9/f39/fn9/f314dXd6e3p3eXh1d3t8eXh1eXdjcWhpcG1ubW1oZl5PT15cWklHT1FRT01QUU5RUlNWWFNSWVROWVpbV1lcX15fZWBdXnF3a15gZ2t3b29sam9ubmxmYllHRkZIQkFGSEVFRkNMUU9hV1JYUVBTU1JVW09PUVdQTUpERj46OTY1ODY5Nzk6MzY1Nzk1PEI9ZnR1d3h3eXl7fX18fHt8fX1+fnt9fn19f39/fn5+fn9/e3d1eX18enh8fHx8dHd2d3Z1d2tuaWhxbm9vb2prYFVXXlpXTUtTVFNQUVVPTFJTVFdYU1RYUUxYWVlWWFhWWFldV1hYaHNrXVZgdGthYV9dZGBfXllVUE1PTUxJR0pLSUhGQ1BPU1pXVFROUVNZU1xlVU9TVFFOS0lIQz9BOTk5ODk3ODg0NzU3ODU5OUducnV5eXp7e319fX18e318fX5+en1+fH1/f359fn59f358dHR1e3hycW9vbnR4cXJzeHZ1cWZkZ3JucHBxbm1kXV9fWVdPUFdWVlNUVk9PVVZXWFlTVVRMS1NVVVVVV1BUVVdUVVJdbl5STllgW1ZZO0RVV1RbZkpMUFJST01NTk1NTEpGUFBVWVNUT0pOT1VTVFxWUlVTU09NTElISEY/Pz06Nzg3NjU5OTY3NTY1V3FxdHh6ent8fX19fnx8fXx+fX15fX18fn5+fXx8fX1+fXxydnF4eHJ1dXFxbnBwb3B1dnRuamRkanBwcXJwbmZlZGNcXlJUWlZXVFNWVFJYWFlZWVJVT0pHT1BPT01SSk9QT09OTk9UTE1JUFBTVFUyPFhNSUFRPWNgUVNRUE5QUE9OTk1QTlRSUFJMSUxLT1FQUVJTVFFTT0xNS0xMSENCQT06OTg3NjtCNDU2NjtlcHJ2eHl7fHx9fnx9fH19fX18e3h8ent9fX58e3l9fH18e3B1b3d1cHV0b3N2cHFxcHV1dmNqZ2VXaHRycnFuaWlocFZWVFVYVVZVUldWVVpZWFdVUVNGRkFGR0dIRkpESEpIR0VITEhLSUdMTVBNRy9FX1I+NEA+am9hUlJRQEdUUU9QUFFOUU9QT0xKTExPUE5OUFFRTlBPSkxNTUtHRUVEQjs9PTw5PUc2Njc2RG5xdXd6fHt8fX18enx8fX5+fXt5dnh3eXl8fXp6dn17fHp6b3Fud3JwdnFtcHNwb3Bzc3N0ZmdgaFpXa3JzcmxtbWtuYmVQU1RSU1VPV1ZWWVlWUVFRT0A+Oz0/QEJBQ0BCRURBQEdIR0hGRkhKTUxER0NPUkM4RE1TXWdTUVNBR1VQT1FRUE1NTkxKTEtMTk9PUUxOTk1JTUxJS0tMS0dGRkVEPEFBPjtARTs8ODlUcnN1eXt7e3x8fHt5fHp6fn58e3V0dXJ2dnp6eHpyfHt8eXltcW94cnF1bm5xcm9vb3Rzc3J1dGtnZ15lam1wa29xbWltY0xPTk1RU0xUVVRXV1VMTEtIPTk4Nzs/QT49PUFAQj0+RUhGREZGSUdKSkBGQUFARkdESU9IUVJhXFFQUk9TTk9PTExPTUtNTE1PTltWS01RT0hKSENJSkxMS0ZGRkU/QkM+PUJHP0I/QGRydXd7ent7fHt6end8d3l+fnt7cXN0cHJzd3R4eHN6e3l2d2xxb3ZxdHRsb3Fybm5vc3ZydHNycmtsZW5zaG1ubWxtbGprSUxISE9RSlFTUVRTT0tIQ0U9OTg3OT9CPzs+QUBAPkFESUVDSEdJR0lFQkI/PjxDQUBHSURNT2JlUE1PTVdLTE5LS01NTExLTk5TZE1KTFJJSUlFQklKTE1OSkdJR0JBQkA/RUZFSERMb3B2enl5e3t6e3p3dHh0eHx8eXpucXJtbm9ycnZyc3h8eHZ2bXBtc3B1dGxwcHJvb29ydnVyVlZucWdseYRqbXFybm5qaG9ISkNHTExJTVBNUE9IS0U/Qj05OTk6P0I/PEFCQUFEREdLRkRJSUdHSENDP0I/P0BAPUNFRExNUVRMSklNVEZJSUpMSUpLSUpMTU9QUlBLR0NMR0NDS0pMTk9OSUpJR0NDQ0RJSk1MSVpzbnh5eHp7e3l8dnJwdXJ0eXl2eGpxb2psbG50dG1zdXtzdHhyb25xb3ZzbnBvcnBvcHN0eWpOYGdzanR8eWdvc3FpcWhlcUhLQ0ZHSEdKS0lKTERHQj0+PTo6OjtBQj89QkJDQ0hFSkxKRUlJRkdHQ0Q7QUBCPkA/QkVESU1PR0hKR0hLREhJS01ISkxISUpMSk1dUklIRE5HQkVMS05OUU5MTUpLRkdHSk1OUk5NY25qd3Z3e3l7en1xbWxza3B0dHR1aHBtamlra3RwbnR0eXByeXRvcnFvd3NvcXB0cnBydXR5a05WbXVscXt2aW5vaWp0aGVwRktDRkVGREVFRkVHQ0NAPTw9Ojs6O0FEQT9CQ0VFSUZKSkxGSUlHRkZDQjtCQ0M+P0NDQ0RGTE5ISk5IREhESUxOTUhJTEdGRklJTE5LSkhFT0lDR05NUE5QTk9PTUtJSElPU1FSTlNnZ2Zyb3N4dnt6fGxoam9la3Btc3FmbWxoaWtsdG1wdXR3cW94dG90c3J2c3BxcnRzcnR1dXd2WFZ1dWtvdHJrb3ZsaG1mX3BHSkNFRURCQkFFQERCPj8+Ojs7PTs9P0RCP0FDRkdLRkpJTEhHR0dGRUM/PURFQj5BQ0JDRUdISUdNUElGRkZLTk9LRkhJRkVERUlJSEtJRkhQS0RKTU1RTk9OT1BOSkpJTVJVVVJQWGVhYW1ncXJvcnl6Z2VoaGNpbGZxbGZsbWdpa2xzbXB2dXRwbnZyb3Nyc3V0cXNzdXRzdXZ2dnl2dXR2bGt1dW1ydnFsbmxlck1HRUVGQkFAQUQ8QkE+QT06Oj0/Oz4/QUI/QEJFR0tGSkdJR0ZGRkVEQ0FBRkZDQkJCREVFR0dIRkxQTElPSkpMS0lGSEVGRURDSUhIS0pHS1JNQ09PTlFPT09OT09LS0tQVVdWVlRZYF9daWFuam5ocnNiZWZmZGloZm5pZm1taGtrbXJpcXZ1c3Ftdm5vcXJzd3Nyc3R1dXZ2dnd2d3Z2dHd1a3N1bnV0c3Bya2tzTUdHRUdBQUBDRDxBQUBDPDg6PT46Pz1AQkBAQERGSEVIRkZIRkVFRENEQkRJRkNHRUFFR0VGRkdFSk1LSFFNSktISElFRkhIRUNJSUpLTUtQU05EUlNRUVJOT05PUE1MTlNXVldZVlheWl1kYGhjamlna19kZWZjaGhna2dna21rbWxwcWd0dHVyc252b3FwcnR4cXNzdXZ1gpF5dnZ0eHV1d3hub3VvcnN1cXFpcHpNR0dHSEFBQkVFPEBDQkQ8Nzo9Pjs+O0FCPj8/Q0VGREZEREdFQ0VDREZGRkpFRUlHQkdIRkdGRUNGSkpHTUtMS0hKS0ZJSEpIRUtLTExOT1JUT0lUVVRRVFBRTU5RTk1RV1pWWllXWl5aWGFgYGBeaGVjYGRlZ2dqaGhqZ2hubGxvbXFwaXV1eHJycHVwcHBydXZwdXN1dnV7fn14dnR3dnZ2d3BsdXBtc3Vub3NzeU1ISEdJREFDR0U8QEVCRDw4Oj4+Pjw8QkI9QD5BQkZDRUJCR0NDREVGR0dHSUZHS0hDSUhHSUdGREhLSUdLSE1LSktMSExKTUtJTkxOTk9SVVZPTFZWVFFUUlJMT1FQT1VZWllcWlpcX19eYGNeXGJkbGNgZGdocoVoZ2pmam5ucG9uc3FqdHV4cnNzdHJucHF2cnF1cnV1c355jn11dXZ2dnZ4cml1cWtydGxxd3F1S0lLSEpFQkRHRT1BR0REQDk8PkA/Pj9DQjxAPkFBRkNFRENIREZERkZISEZIR0lLSkVKSEhKSEZGTEhISEpHTExMTExJTUtNTk1PTFBQUVVWV09LVlZVU1NSUUxPUlJRVltbXV5bXV5gYGFgYmVeZGBmaGBlaGpkc3NmamhmbHBycW9zc25zd3dwdXZ0c21vcnVvcnNwdXJ2cnSBdnV1dXd2dXd0Z3Rya3Fya3J3cHdJSktJS0dCRURFPEFGRERCOz8/QUBAQURBQEI+QUNIQkVERkdFSUVGRUlIRklISkxISEpKSUtKRkpLSElKSUdLS01MSkpNS01OTk9MT1BSVVdWTU5UVlVTUlFQTU5UU1JXW15eX11eYGBhYWJgY2RlYmRpY2Rpamd2i2xraWdtb3NxcHFwcHJ5d3J1dXRzbW1zc21xcm90dXVzcHN3dHV1d3Z1dXRlcXNrcHFqcnZwd0pMS0tMR0NDQUU8P0VFRUM9QUFDQkJDRUJDREFBRUdDR0ZIRkVJRkNHSkdHSkZJTEhJSk1KTEtHS0lIS0tOUUtSUUxTTUpOTU5QUFBUT1dYWFtOU1FXXFpTVlBOVFVUVFhaX2JiX2RhXmFjXmBmYmFjaW5oY2loaG14dm1oaW5vc3JwcXJycnZ0c3Vzc3Nua3NxbXByb3R2c3FxdXZ1c3d5d3V0dWNtdGtvcGpxdHB3TE1MTExHRUFARD49REVGQz9DQUVEREZDQkVHQ0NJRUJISklHSEpGREtKR0hKSUlLR0pKT0tNS0lMSEpNS1pmSmRcS2xSR05OX25VbHNbcXBid2NSUGJ2dWh1Y2F2YVhucWJkdmluemZcbHVgbGtVYHh2aWpoaGZnbG1qbW9qbW9zcnBycnFyc3Jzc3J0cm5sdG9ucHFxdXVycXN0dnZ1dXl3dXR0YGt0a3Bwa3FzcXlLTkpLSkZCP0BCPzxERUZEQ0NDRUVERkJGRkdEREpEREpMS0lLTEdHTklISktHS0pJS0pOTExMTExJTUxMW3NiZHBebGxVTE5lcl1nZXFsbnRncGlfYVlubWJwcGJrampnb3F0ZXRublxwdmdxTktyeXZrYWFrZWVseG1rdmxub3NycHJxcHFycXJycnRybW1zbm5vcHJ1dHFzc3R1dXV0d3h2dXRibXVrcHBscnJxektMSUlHRUQ/QUE/PUJFRkJFQ0VERUVEQkhIR0RFS0hHS01NSUxMRkpOSEpLSklLSkpKS01NTk1NTUtOTU1bcnBvbnBwbGtNUFFsWE5pYnRycGFtb3ZcWWxQW21tWnFta29teHh0c2lwXWBzbHFqVXV5eG9jXmtmYmdwcGppb3Bwc3NwcXBxcXJycXFycnRsbXJtbW5vcnV0cXRydHV1dHV1enZ1dGVudWtwb2xzcnJ5SktHSEZFRUJBQj0/P0VHQkdESUVFREJGSUhIREdLSkdNTE5KTE1HTE5JTUtISk1JSkpKSk5PTk5NTE5NTFxoZHVdbHFXbE5PUW1VWmtea2x2YWxkdFRlY05sWWxcdHBraWx4and1aHBdX3NraFdiY3d8b2NgZ2hhY2l0eWtubnFzc3BxcHFwcnFwcHBydWttcW1tbW9xc3Rxc3J0dnZzd3Z6dnV0aG91bHNvbXNydHZJTUdJRUVEQ0FCPEJAQkZDR0ZLR0VDQ0hLSEhGSUxLRk1LS1FRTEhNTUhOSklITkdKSkhITk9NTkxKTU1KWnRwcG9xcW1sT1FSbllza2dvb3Fxb210Xm5YYXRfbm9wb3Fyb291c3R0altedGN3eHJqbnpoYWFjZmFiam10dXBzdXZzcXBwcW9ydHt/fn13bGtxbmxtbnByc3F0dHN1dXR4eHl5dHVrb3VtdG9uc3N2dElLSEpDRUVFQEA+Q0NBRkNISU1IRkNGSkxJR0ZLTUxGT0pLV1JLR0tKSk5JSUpMSUtKSUlLTU1NTElLS0tTa2JaaV5famNyclpfWWtvYGVlVWtfZFthYlFgbWhcalxuaWlkWm9lZHBdWlxrW21xY3BzbGRnY2RnYGBrbXBwb3R5cnVxb3BxbnmFiIeHhoWAdnNua21tb25xcnR0cnR1dXZ5eHhzdW5xdW53cXJ1dHdySUhGSURFREZBQEFFRENHQkhKTEdGREdLTElFRkpPTElPSkxbUUpGSEhLTUlISkpLS0lISkdMS0tLR0hKSkxMTEtJS0xOVFtdVFBVTVFQTk9PVVJQUFFPT1FKSk5QUWRxaVRZVltbXFVZW11YXVxcY2ZhYWZiY2ZfXmZrbWhtdHhydHJvcHB0hoeGhoaFhYaHg3pwbW1sa3FzdHRydHZ0dXl5eHV2cXJ1b3ZydHN1dXNIQ0VHRkZBRUM/Q0dERUdDSUtMSEZER0tMSERHSVFLTE9LTFdNSUZFSElKSElLSExKSUZISEpISEhFRkxISUtOTElPXFdeT1xcYF5PWFlTXFxiXk1ZWk1YYVJLWWFaU2BkXGJYW2RkVlZYXFlaWFxWWVxeY19kYGFfZWhrZ210dHFxdHBxcoGGhoaFhoWFhYaGhoR9cmtpb3Jzc3N0d3l5eHl4d3h0cXhyeHNxcnVydE9CQ0RMTUJDREJESUVHR0ZLSktIRUVKSkpGRUhIUEpMTUpNUklIRUFIRkpJS0tJTEpJR0VKSEVGR0RFSkdCSU1KS1RfWWBYYGFbYFVYWVReXlpfUllcUF5cWU5fXF5TW15kX1pdYGNfWV9iW2BeW1VZWFpfXmRiYmFjZWlla3Jwb3Bwbm93hoaFhYaCe4CFhYaGhYaFf3VxcHJyc3V5eXp5eXh4eHdyeXZ4cnF4dnR2YVNKSk1JRUNCQ0ZHRUdHSUpKSUlERktKSkVGSUlOSk5MSExOR0hGPkdHTElLS0pLS0lHRUlFRERFQUVJRD9JS0hOW2NZXl5hX1JUU1dfYFxdWV5RWVxNVl9XS1FZW1FbX2JhXV5jYWBiYmJjY2VaUllWV11bXmNgX19jZWJob21tbGxsbHWFf4SDeXV8hIWFhYaGhYWGhoN9d3JydHd5eXl5f359eXV5dnZybnp3dnhYUUpGREdFQkVHSEZHSElGR0pHSEZIS0lLRERKSk1NTExISkpISkc/R0ZOSktLTUtLS0lHSEREQERAR0hBPkhJRk9dYVpbZF1fVFFSWF1cXFxfWktXXExSXFlJTV5RUV1fYmNjY2NiXGRjYmRjZVhSV1VUXVlbYV9eX2FhX2Rsa21qa2xudn51gXp8hIWFhYWFhYaGhYaFhoaGgnpyc3V1e4WHh4eGhYSBfnhwend2eFxSTUNASUZDRktJRkdHSUdHSkZGRklMSk5FQ0pKTE5KTElLSklJR0JISFFNS0tPTUtLSUhIRUQ/RUJISEFARkVDVF1ZXlhfWV9bXVVYWFBdXVFLSlZeWF5bXVZaYVJSX19iYmBgYmJgY2JiZGRiWFBSUlNcVFxdXl5eX19gZGhnbGpubnB7e3x+e4CCg4SFhYWFhYWEhIWDhISHh4FzcneFh4eHh4eHh4eHh4WDgHx4XFNLQkFHRkRHTVJIRFJLRkhISERGS0lNUEVHSUpLTkxMSUxLSklHREhLUU9NTFBMTEtLSUpERUFFQ0hGQUFGREFWVUVcVF5TVl9YTlRVTlpbTUpLVGBhW19YX15iXU9YYlxgYF9iY2JdYmJXX19UUVBRUllTXlxcXV5fYGJmZmVsZm9vd3x7gHt9f4CEhISEhIWFhYODhYKDgoWFhnpvgYaGhoeHiIeGhoaFhYSFg35JTkZERkZHRElTY1FFV19JR0dIREZNSlBQRklJSktOTExLTUtKSkdFSU5RUU5PT01OTU5ITEJEQUNDRkRCQUNEQExIQkxMUE9OTEZNRkZISUhHTExNT1BJTE9QUFNQTFFUUlVaWFdZV1hkVk9TVFBRT09RVVRcWVlbXl5hYWVmY2hkbG1xc3N6eX97en+EhISEhISEhIKEgH57gYOBfXuFhIaGh4eHhYWFhISEgoGAfUtJRUVHRkdES01eTUhIWU1HSEpIR01MUVFJS0pLS05NVU5PS0tMR0dLUFRTTlBPTk9PT0hLRmBFRF5MRGZjQ0xbSF5bc21PTVZtWUxDUF9UbFdnSl1XVV5ETFFVTE1TVlFSVFhWVFhVVFxUUGZaaGhlWlRrVFhXVVtcXGBgYWJiYmBnaWdubGhyenx9foGEhISDg4ODgX19enJ7gXp7f4KAg4SEhYWBhIWBg4N/fnp7TElFRkZIRUVLT1RKS0dgVEdKT0pJT01SUUtNS0xPUlVST1BKTE5HSE1RW1lPUFBOT1BQSktRf1FJfFlZcnNXUG1IcW5vYVZQcXF0T0Jrc25xdHBTb19bblhdVlxYVWtoVV1WY1lgWVpfVlVXf2l0dXVfYXZfWWJcXGZbX2FhYWJeYGNnbXBsYHB3dHiBgYKDhIJ/fX6Adnh6bXZ+dHh9gHx+gIGChHyAg3p/gX9+d3dOSUVITU1CRExMR0pMRlJWTEtPSExSWFdRTk9PTVFUTk9RUEtMT0dNUFNbWlRRUk9QUFFLSVp4XVR4ZGhYUVNQdmd0bHBibmZrUnJPTHdtanJwc3JxcnBvcIBdZnp1eHFxenF+cn1rdX1hUmh8ZXNzb3NzfH1wfnhvf3JfYGBiYlthYWhrbmtibGZnbXd+gYCDfnt4d4B0dnpocn5udHx+d3h7foCDeHyBdXx/fHxzc05LRmBdR0FFTU1IS0tISlFPTU5KTlZeWVVMUVNOWVlMU1NSTkxQSVFSVFlXV1FUUFBRU0xIZ3hsY3hxbVpKTFR5cHVtdWJudlBkZElldnFtd2+AamZ4eGlYclJpe21panp6fWx4en9wZ25YdXVqdnVwgGFzaH1pbHh8b19fX2NiXF5kZWZpamVnYmNkbGxwcHN0c3NzeXFyeGJsdGdyeXtzc3V5foFzdnpufH15eHJuTUpSdE5DQkVQUUlLTEpMUU9PT01QWmBaWEtUV1BhXlJWUVlTTVBKU1RVWFdXT1VQT05TSktyb3V1cXVxY2hhVm5McXBeR2h5V3ZUS2h4fXhgeXtzbmFdbW9kU2dydW5teXB3bHZzdHFsbVxzfXprbXl8bHVufGxxdnV4Xl9fYl5dX2VlaWdoZmVeYmJpaWlqa25va3FubWpwYWNmZG93eG9tcHN5f25xcGp7enRyb21LS1pWSEdFR1JRS01OTExRUVBQUFFXXFlVTlZZVWZYUlJZXlRNTkpUVFZXWVdPU09PTlFJUm1IaXdLYGR2dVVXbE5ubHtyYWpnf3VUS1draH1sbWx4X1pwentfYHpzY3JveHFoZHxpcntdVEtsX3Z1bGp2fHttfnlrfHBdXl5iW15iZGVnZmZlY1tjY2lra3JzcndnbWloZGdgYWxhZ3NybGhtbXJ8a21oa3t0bW1rbU9HSktISkhIUlFNT1BNTFNTUk9TU1hSV1RQV1pWVlRUVGFgUU9OS1RTU1FWVk9PTU5PUUpIUU5QVUxLS1JTUlJST1ZVUVFPUlJYWFFOUFVUWFhYW1tVUVJXW1dYV1tPUlRXV1hRXVhWXVVTT1hSV1dYWVpgXGdyX1tbWl1dX2NaX2NjZWdkZGRjWmRiZ2ZmbW5tdWZmZ2NgZl5eZ2BkbGhmZ2tocHpoZ2drdWpoZ2lsUElLS0xNS0pUUk5SUVBMVlZUUFRVWFVaVlJbXVZVVFdVWVhPT0xOV1RQTlVTTlBOTFFQS0pSUUtRTUpKT1FUUlBRU1JJSU1PUFFSUVFRVFVRWFdcV1NSUVFVVVZUWlFOUlJXVVNZVlRZVVNRVVNVVVlZWF5aX2FdXFtaXV1gY1xdYmNkZmRlZWJZYGFjYWJoaGpuY2FkXl9jXVpjXGJtYV5mZmdtc2RpaGtrZWRjZmhRSktLTk9MTVRRT1RRUU1YV1VUVlhXV1pWVFxgVldWWVVYVFFQS09YU1BOVVBOUU5MU1BNTlVTTlFOTU5RU1BUUFJUVE5MTk9SVFRSUlFWVlNYWltZU1VSVFhXV1lbU09TVFdVVFlVVllVUVFXVVZYXFpcYF1XWV9dXl1cXWBhXltiYmNnZmVlYlhgYGJdYGhlZ2VhXl9dXV5aWl9aX2dgXl5dY2hrYWhmaGZkYGJkYlBLTUxQUUxPVFBQVFFPUVpZWFdZWlpYWFZdamRWWFlaV1ZUVE9LT1ZUUE9UUFBRTk1RUU9RWFRRUU9NT1NVTldRVFRVT05OUVRVVVRUUlRXVVpdXFpWVlFSV1hWW1xWUFNVVVVWWFNXV1RSUVhWVltfW19gX1ZfXV5gXFxgYF9fWmJjZGhnZWViWWJgYl5eZmRjYGJdXFxcXFlaW1hbYVteXV1fYl9fYmRkYmRfX2BcUE1OTlJRTVJTUFNUUU9VXFpaV1tbXFlaW2RxbWhkX1tZVlZYUk1OV1NNTVJPUVJPTVBTUVVaVVRQUExQV1VRVlJUU1hNT1BSVVhVVVVTVVhXW15dXFtWUk9VVlZbW1ZRU1ZVVlhUU1daU1NRWVdXXV9bYF9gVmJcYGFdYGJfXGBdY2FjZ2llZmBaY2BhX19lZV9gY1taXFtcWlpZWVdcWlxbYF5gW15eYWBfY1xZYFpRTk9OVlFQVVNQVVRTUFdcXFxZXlxfV1xeanB3eYBjXFtWVllSTlBXU05RUVBSVFJMUVRTWVtXVU9STlNYVlNSVFJSWk9RU1NWW1VWVlRXWlhdXlxcXlZTTlRWVltbVVFUVFZXWFJTWFtTUlJcWFpdXl1hYWBXYltjYl5hY19cYmFiX2RnaWVnXVxlYGFgYWNkX2JfWVpfW1xbWVhZV1daWlphXF1bXVxcWl1gV1tbWlBPT09ZUFVVU1JXUlRQW11eXVxgXGBWXF1oanJ9c2xoXFVZV1FPUltTUlFUUlRVVEtSVlVaWlpTT1NRVVVVU05VUVJaUlRVVFhdV1hYU1hcWF5dWVpdVFVOVlZXXlpYUVRVWFhYU1ZYW1NSVl1ZXV1hXmNjX1lgW2ViX2RkXl5jY2FeZWZpZWZeXmRhYWFiY2RfYl5YW19bXFtYWFhYV1taW2BdW1tcW1haW15WXlldUE9PUlpQWlVWV1ZUVFReXmBfXmJcYFVdXmJreXVtfWxaVVpWUVFUXFRUVFVUVllXTFJaVlxaXFJQVVNXVVVTT1dRU1dTV1VWW15YW1lVWl5YX15ZXFlSV1JZWFhfWVlSVFVaWVlVV1lbVVRaXV1eYWJgZWRdXl1dZWFiZmReX2RjYFxnZWhmZGJgZWFfYWFiYl9gXldZXlpcXFpZWVdWXVpdXltaW1xbV1lcXVZYV11TT1BXWVBdVVZZV1dVWF9gYWFgY11gVV1eYmVldoJ7aFhZWlRWVFZcV1dXVlZXXVhPVVxZXl1dVFNYU1dVU1JTV1FTVlRYWFheXlhdW1VeX1hfX1hcVlFZVVlaWmFYW1RWV1paWlhZWVpXVl1fYF9kY2JlZV5iXGBmYmRmZF9gZGJhW2ZjaGZkZmFmX19hYmFhYF9eVlVdWVtcW1lcWVldW1tbWFhZW1laWl1fXVRZXVVOVFpWVFxVV1dZV1ZcYGFhY2FjX19WW2BkYV96dW9oWlxaVlhWWFtaWVtZWFlgVk9UXVtgYVxVVVlQVFZUUlZVUVNVV1tbXV9fWl9cVl9fWl1eWV5WU1lYWVlcYVldVVZaW1pbWlpZWlhZX19gYGRjZGVlY2RaYmZjZ2ZlXmFiYGNdYmNpZWRoX2deYmJjYWFgXl9YVFpaWltbWFxYWFxbWltXV1pYV1xbXGBdVl1dU09WWlZWWlZZVlhXWF5gYmFkYWRhXllZYWRiYGtmaF5cXVtXV1laXFxcX1tZW2JWU1deXWFjXFNWWVBWVVVVVlVTVlRYXV1fYGBdYV1XYF5bXlxbXlhWWFhbWl9fWl5XWFxcXV1dW1pcV1pfYV5gZWRkZmZnY1ljZmVoZ2ReY2BfZWNdZmlkZWlfZ15jYmNhYWBfX1tYWVtZWllYWlhXW1taW1dYWlRaXVxbYFxVXmJNUldZVldaWVtcWVdZXmBiYWVhZGFdXllhY2JfYWBhX1xdXVhXW1tdXV9fXFpdY1hZWF1gY2RfUlhZUFdWV1hXVlZXVl1dXmFiYV9iXllhXV1eWV1eWVhVV1tbYF5cX1lZXl1eXmBcWlpZW19iX2JlZGVmZ2hjWmVmZ2lnY19jXmBmZVppaWNmaWNmX2JiY2FgYF9dXVpYW1lZWFhaWVdaW1pZV1lWVVtdXV1gYGJieEtXV1xZV11cXF1aV1xdX2BiZGJjYV1gWGJjYmBjYWNeXF1cWFdbXV9dYF9dW2BkXFxYWmJlY2FSXFlPWFZZW1lZV1paYF5hYmNgYWNfXGJdX11bX15ZWVRYXV1fX15fW1peXmBiYlxcV1tdYGJiY2VkZ2ZmZ2VdZWdoaWZjYWJcY2dgXGlpY2hpZmVgYmFjYV9gX11dXFlcWVhXWFlZV1xbWldXWFBYWl1hY2Zmcmt/SllXXVtaX11cXlxZXVteX2JjYmFhXWJbYmRiYGNiYl1cW1pXWGlxYFxgX11cYWNfXllZY2VkYlRfWlFZV1xdXFtZW1tjYGNjY2BiZGFgY15gXF5fX1pYVltfXVxhYV9dW2BhYmViXlxTXF9gY2RkZmVnZ2ZmZmBmZ2hoZ2RkYFtmZ15haGhjaWhmY2BiYGNiX19fXV1bWltZWFhYVlpWXFpaVlZVTFhYXGdpa2h1eIF2dnZ2dnZ2dnZ2dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6e3p6ent7e3t7e3t7e3t7e3t7e3x7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHt7e3t8fHx8fHx8fHx8e3t7fHx8fHx7e3t7e3t7fYmIhoqHhYKBgoOCg4OCgoKCgoKCgoKCgoGAgYCBgICAgYCBgYGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t6e3t7e3t7fHx8fHx8fHx8fHx7e3t7e3t7e3t7e3x7e3t7e3t7fHx8fHt7e3t7e3t8iYmHiYaFgoGCgoGCgoKCgYKCgoKCgoKBgYGAgICAgICAgIGBgYB9fHx8e3x8fHx8fHx8fHx8dnV1dXV1dXV2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eHh5eXl5eXl5eXl5eXt7e3t7e3t7e3t7e3t7e3x8fHx8fHt7e3t7e3t8fHx8fHx8fHx8fHx7e3t7e3t7fHx8e3t7e3t7e3t7fHx8fHx7fHt7e3uHiYiJhYSDgYKCgoODgoKCgoKCgoKCgYGBgICAgICAgICAgYKBgH58fHx8fHx8fHx8fHx8fHx2dXR1dXV1dHV2d3d3d3d3d3d3d3d3d3h4eHh4eHh4eHh4eHh4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t8e3t7e3t8fX19fXx8fHt7e3t7fHx8fHx8fHx8fHx8fHx8fHx8e3x8fHx8e3t7e3t7e3x8fHx8fHt7e3t7e4aJiYiFhYOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgIGBgYCAfnx8fHx8fHx8fHx9fX18fHjF1NLS0tLUk3t9fX19fYSMi4uLi454KSkqKiopKz0/Pj4+Pj5tgH5+f397pdfT09PT1r2GiYmJiYqHc3FycnJydD4oKysrKiVikoyMjY2OiX5/f39/f359fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx8fHx8fHt7e3t7hIuHh4aHgoGDg4GCgoKCgoKCgoKCgoGBgYCAgICAgICAgYCBgIB+fHx8fHx8fHx9fXx8fH19eNXn5OTk5OeZe39/f39+hpCPj4+Pk3kZGhoaGhocMTMzMzMzMmqCf4CAgHut6eTk5OToyomMjIyMjIlyb29vb29yMhcbGxsbFF2Wj4+QkJCLf39/f39/f319fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e3uCjYeIh4eDgoSCgYKCgoKCgoOCgoKCgYGBgICAgICAgICAgICAgH58fHx8fHx8fXx8fH19fX12fn9/f39/gHl3d3d3d3d4eXl5eXl7eG5vb3BwcHBycnJycnJyd3p5eXp6en6Dg4ODg4SBfHx8fHx8fHp6enp6enp1c3Nzc3NyeX19fX5+fX18fX19fX19fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e4CMhomHh4SDhIKCgoKCgYKCg4KCgoGBgYGBgYCAf4CAgICAgICAfnx8fHx8fHx8fX19fX19fXZ0dHR0dHd1dnd6e3h7eHd2dnh5e3p5fXl5eXh4eHh5eXl5enp5eXl5enp6eXh4eXl5eXl7e3t7e3t7e3t7e3t7e3x9fX19fX18e3t7e3t8fHx8fHx9fX19fX19fX18fH19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8f4uHi4qIhIODgoKCg4KBgoKDgoKCgYGBgYGAgIGAf4CAgH+AgYF+fX18fHx8fHx9fX19fX19d3d3dnZ3fXh3d316eH14d3d3fHx9ent9e3h3d3d3eHh4eHh5eXl5eXp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fHx8fHx8fHx7e3x8fHx8fHx8fHx+iomMjImFg4SEgoKDgoGCgoKCgoKBgYGBgYCAgICAgICAf4CAgH19fXx8fH19fX19fX19fX13d3d3d3p9eHt4fHx3e3h3d3l+fHx9fH18eHh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fX19fXx9fX19fX19fX19fX19fHx8fHx8fHt7fHx8fHx8fHx8fH2Kio2NioWDg4OCgoKCgYGCgoKBgoGBgYKBgIGBgICAgIB/gIGAfXx9fX18fX19fX19fX19fXd3d3d3fX55d3d4e3p8eXd3e358eHt9fHx4eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt8fHx8fHx8fHx8fHx8fH19fX18fH18fH18fHx8fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8foqJjo2JhISEg4KDgoKBgYKBgoKCgYGBgoGAgYKAgICAgH+BgIB8fH19fX18fX19fX19fn5+d3d3d3d5fHl7eHx9eXt5enp4e3x8fHt9e3h4eHh4eHh4eXl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt7fHx7fHx8fHx8fHx8fXx8fX19fX19fXx8fHx8fHx8fXx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx/iIeNioeFhoaDg4ODgoGBgoGCgoGBgYGCgX+AgoF/gICAf4CAgHx8fX19fX19fX19fX5+fn53d3d3d3Z4eHl3eXp4enh5eXd4enp6eHt4eHh5eXh4eHh5eXl5enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX18fH18fH19fX19fH19fX19fHx8fHx8fHx8fHx8fX+HiIyIhoeHhIKDhISCgYKBgYKCgoGBgoKBgIGBgYGAgIB/gIGAfHx9fX19fX19fX1+fn5+fnd3d3d3d3d3d3d3eHh4eHh4eHh4eHl5eHl5eXl5eXl5eXl6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fHx8fX19fHx8gIeIi4eHiYaDg4SDg4KBgYGCgoGBgYKCgYGBgIGBgYCAgICBgX97fH19fX19fX19fn5+fn5+d3d3d3d3d3d4eHd4dnl5eHh4eHh5eXl5eXl5eXl5eXl5enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fH19fXx9fXyBhoqKiYmIhIOFhISCgoGBgYGCgYGCgoGBgYCAgYGAgIGAgIGBf3x8fX19fX1+fn5+fn5+f394eHd4eHh4eHZxZGpeam15eXl4eHl5eXl5eXl5enp6enp6enp6enp7e3t8e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIGFiYqJioeEhYWEg4KCgYGBgoKBgYKBgYGBgYCBgYCAgYCBgIF+fH1+fn5+fn5+fn5+fn9/f3h4eHh4eHh5bWRiZV9fXm95eXl5eXl5eXl5eXp6enp6enp6enp6e3t7e3t7fHx8fHx8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goWKiomJhISGhYSDg4KBgYKCgoGBgoGBgYKBgIGBgICAgICBgH58fX5+fn5+fn5+fn9/f39/eHh4eHh4eW5kZWdlZGJeZnh5eXl5enp6enp6enp6enp6enp6e3t7e3t7e3x8fHx8fHt8fHt7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChouJiIqEhYaEg4OEgoGBgYGCgYKCgYGBgYCBgYGBgIB/gIGBf3x8fn5+fn5+fn9/f39/f394eHh4eHl3Z2VkZWZkZWFfaXl6enp6enp6enp6enp6ent7e3t7e3t7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHt8fHx8fHx8fHx9fX19fX19fX19fX19fXx9fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4eJh4SEhoSDg4WBgYGBgYKCgYGBgYKBgICAgYGAgYCAgYF+fHx/f35/f39/f39/f39/gHl5eXl5eWtlYWJlZWFlZV5ieHdze3p6enp6enp6enp6e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fH18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19g4aLhoiFhYaEgoOEhIKBgYGBgoKBgYKBgYGAgYGBgYGAgIGBgn98fH9/f39/f39/f3+AgICAeXl5eXl0Y2NlZGNmY2doZGZsZF5ze3p6enp6enp6enp6ent7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn6DhouGhoaGhYODg4SDgYGBgYGCgoGBgoKBgYCAgYGBgYCAgYGBfnx8f39/f39/gICAgICAgIB5eXl6d2RhY2diYmRdW2VfYV1eYGFoeHp6enp6enp6enp6e3t7e3t7fHx8e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+foSFi4eGhoaGhIODg4KBgYGBgoKCgYKBgoGAgIGBgYGAgYGBgYF+fX1/gH+AgICAgICAgICAgHl5eW9vYmJiZF5jZ19dYWFgXF9kYlttfHp6enp6enp6enp7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7fHx7e3x7fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5/hIiLhoSHhoaEhIODgoGBgYGCgYGBgYKCgYCAgYGBgYGBgYGBgX5+fYCAgICAgICAgICAgICBeXpwXWJlZGJkXmZnZ2BZYmJhY2VfXF1ze3t6enp7e3t7e3t8fHx8fHx8fHt7e3t7e3t7e3t7e3t7fHx8fHx8e3x8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fn19fn5+fn5+fn5+fn5+foCFjIqEhYaGhYODg4SCgYGBgYKBgYGBgoKCgYCBgYGCgICAgIGBf35+gICAgICAgICAgIGBgYF5emxiZGdjYmdmYWBgZGFiZWRjZGNeXGJ1fHt7e3t7e3t7e3x8fHx7e3x8fHx7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/gYeMiYWGhoeFg4SDgoGBgYGBgYKBgoKCg4KBgIGBgYKBgYGCgoF/f36AgICAgICAgIGBgYGBgXp7dGdnZmZkZGZmYF5fYWNlaGRlXmJkYHR8e3t7e3t7fHx8fHx8fHx8fHt7fHt8fHt7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f3+CiYqIhoaIhoWDhIOCgYGBgYGBgoGBgoKCgoGAgYGBgoKBgYKCgX9/f4GBgYGAgYGBgYGBgYGBenptaGNjZ2ZnZWdmZmdiZWRlYmdbYmVgdnx8e3x8fHx8fHx8fHx8e3t8fHx8e3x8fHt7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f39/f4SJioiGiYeFhYSEg4KBgYGBgYGCgYKCgYGBgYGBgYKBgoGBgICBgH9/gYGBgYGBgYGBgYGBgYF7emlpZGNqZmFgZmVjY2NnaWRjYmBiZGJ0fXx8fHx8fHt8fHx8fHx8e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f39+fn9/f39/f39/f3+AhIqMiIeJhoSFhYOCgYGBgYGBgYKBgoGBgYGBgYGBgoKBgYGBgYGAgH+BgYGBgYGBgYGBgYGBgXZzZWRnY2RmZWJlZmdkZmhmZWNgYGNkYHF9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fXx9fX18fHx9fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/fn5+f35+f39/f39/f3+AgICFioyJiIqJhoaDgoKCgYGBgYGBgoGBgoGBgYGBgIGBgYGBgYGCgX+Af35/foCCgoKCgoKCgoKCc3NnZWRkZWlqaGZnZ2NhZmZlZmdmZWVjdX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gICAgICAgIWLioqJioeHhoSCgoGBgYGBgYKCgYKBgYGBgIGBgoKBgYGBgYGAf4B+dHRzdX1/goCAfn5/gYB0cmdkZWNmaWppZWNlY2BmZGRnZ2JiZWFwfXx8fHx8fHx8fHx8fHx8fHx9fX18fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f39/f39/f4CAgICAgIB/houLioqLh4eHhIOCgYGBgYGBgYKBgoKBgYGBgYKCgYCBgYGBgoCAgH5zc3NzdHV4dXV0dHV2dXVwZmNmZWhoaWdoZ2VmZWJfZGVmY2BiZ3d8fHx8fX19fX18fHx8fH19fX19fX19fXx9fXx8fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gIB/f3+AgICAgICAgICHjIyIi4qHh4eEhYKBgYGBgYGBgoGCgoGBgICBgoGBgYKBgoKCgYCAfnNzc3Nzc3NzdHR0dHNzdW9jY2FnZWhoZ2pmZGVnZmhmY2JlYl5ieX18e3t8fX19fX18fHx9fX19fX19e3x9fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn9/fn5+fn5+fn5/f39/f4CAgH9/gICBgICAgICAgYCAf4CAgYGAgIeLi4iNiYiJhYSFgYGBgYGBgYKCgYKCgYGBgIGCgoGBgYKBgoKBgIB+dHNzc3Nzc3Nzc3Nzc3N1cmdlZWRlamhoZ2ZpaGdjZWViZGNoZGd7eHVzc3R2dnl4dnR0dHZ3d3d2dHR0dXV4d3h4d3d6e3x9fXx9fn5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f35/f39/gH9+fHt7fX58eXl2dnZ5fHx6end2d3l7fXt4hIyMioyHh4iEhYSBgYGBgYGBgoGBgoGBgYGAgYKCgYGBgoGBgoGAgH51c3Nzc3Nzc3Nzc3Nzc3VzaGVnaGVrbGhqZ2lqZ2dnZmRkYmVkbnV0dHNzdHNzc3Nzc3Nzc3Nzc3NzdHNzc3Nzc3Nzc3N0dHV1c3V3eHl7fn59fn98f39/f39/f39/f314fH5+fXx4dXZ3eXd4dnRzc3N0dXRzc3Nzc3NzdHNzc3R0c3R0dHODjI2KiYeIhoOGg4GBgYGBgYGBgYGCgYGAgYGDgoKBgYCBgYGBgICAf3VzdHRzc3Nzc3Nyc3NzdnZpY2hqaGpsZWZpbGhgZmVkY2BkZGZ0dXV1dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHRzdHRzc3Nzc3R2dnV1d3V4fH9+fX9+fHp4dXN0dXV1dHNzc3Nzc3N0dHR0dHR0dHR1dXR0dHV1dHR1dXR1dXV1dIaMjYuIhoeEhIWCgYGBgYGBgYGCgoGAgYCBgYKCgoGBgIGBgYGAgIB/dnNzc3Nzc3Nzc3Nzc3N2dnNnZ2pmaGdmaGhmZGlnY2NnZWVmcHZ1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dHR1dHR0dHR0dHRzdHR0dnV1d3Z0c3R0dHR0dHR0dXV1dXV0dXV1dXV1dXV0dHNzc3N0dHNzdHR0dHR1dXR1iY6MjIqHh4SEhYKBgYGBgYGBgYKCgoGBgICAgoKCgoGBgYGBgYCAgH93c3Nzc3NycnJyc3NzcnZ2dW5kXWNnZWlraGVoZ2dqamlnZXB2dXV1dXV0dHRzdHR0dHR0dHV1dXV1dXV0dHV1dHR1dXV1dXV1dXV1dXR0dHV1dXV1dXV0dHV0dHV1dXV1dXV1dXV1dXV1dXV1dXV0dHNzc3Nzc3N0dHNzc3Nzc3R0dHR0dHWKjoyMiYaGhIeFgoGBgYGBgYGBgoKBgYGAgYGCgYKBgYGBgYKBgICAf3hzc3Nzc3JycnJyc3NzdnZ3d2liaGhnamtpaGZkZGVmaWhwdXR0dHRzc3JxcnJ0dXV0dHR0dHR0c3NycXFxcXNzdHR0dHR0dHR0dHV0cnJyc3R0dHR0dXV1dXV1dXR0dXR0dHR0dHR0dHR0dHR0c3Nzc3Nzc3Nzc3Nzc3N0dHN0dHR0dHR0dYuOjImGhYWFh4SCgYGBgYGBgYGBgoKCgYGAgIKCgoGBgYGBgYGBgIB/eXNzc3NycXJycnJzc3N3d3d3bGpoZGhpa3Z6a2VmZWhnbXJzdHN0c3JwcHBxcnN0dXR0c3NycnNycXBvb29vcHFzc3NycnJyc3R0dHNxcHFyc3R0dHR0dHRzc3Rzc3NzdHR0dHRzdHR0dHR0dHRzdHR0c3NycnFxcnJzc3Nyc3NzdHR0dHN2jZCMh4eFhYSEgoGCgoGBgYGBgYGCgoKBgYGAgYGCgoGBgoKBgYGAf395c3NycnFxcnJycnNzc3d3d3dzc2pnaWloeX99cW51bG5wcXJycnFxcG9wcXFxc3Rzc3NycXFwcG5ubm1ubW5ubnBxcnJycnJycnJzcXBvb3BxcnJzc3JxcnJycnJycnJycnJzc3Jzc3Nzc3Nzc3Nzc3Jxb29ubm9vcXJzc3Jyc3NycnNzcnaPj4uHhoWFhYOCgoKBgYGBgYGBgYGBgoGBgYGCgoKBgoGCgYGCgX9/f3hxcHBwcXFycnJyc3Nzd3d2dnd2cnF0c252f352c3hwcHBycnJycXFwcHFxcXFyc3Nzc3FwcXBvb25ubm5ub25vcHBxcXFxcXBwcXJwb25vcHFxcXFxcHBxcXFxcXJycnJycnJycnFxcnFxcnJycnFwb29ubm1ubW5vcXJycnJycnJyc3JxeI+OjYaDg4aEgoOCgoGCgYGBgYKBgYGCgYGBgYKCgoKCgoKBgYKBf4B/d29wb3BxcnJyc3Nzc3J2dnZ2dnZ3dnZ1c3l/fnd3d29wcXFxcXFxcHBwcXJxcnJzc3JycXBwb29wb29vb29vb29wb3Bvb29vcHBxb29vcHBwcHBvcG9wcHFycXFxcnJycnFxcXFxcXFxcHBwcHBxb29ubm5tbW5tbm9wcXFxcXFxcXFxcXB7j42NhoODhYOCgoKCgYKBgYGBgoGCgYGCgoGCg4KBg4KBgYGAgYF/f392bm9wcHBxcXFxcXBwcHZ2dnZ2dXR0c3NxfYB9fX9zb3BxcXFwcHBwcXFwcHBxcnJxcXFwb3Bvb3Bwb29wcG9vb29vb29vb3BxcXBub3Bwb29wb29wcnJycnFxcXBxcnFwcXFxcHBwcHBwcHBwb29ubm1ubm5ubm9ub3BwcHFxcXFxcXFxcIKRjoqEhIOFhIOCgoGBgoKBgYKBgYGBgYGCgoKCgoKCgYGBgYCBgX9/gHVvb29wcXFxcXBwcHBwdnZ2dXRzcnJycnGAgoCBeXBwcHBvcHBwcHFxcXFwcXFxcXFxcG9vcHBwcHBwb3BxcHBvb29wb29vcXFwcG9wcG9vb25vcHFxcHBwb3Bvb3BwcHBwcHBwcHBvb29vb29vbm5tbW1ubm5ub25vb3BvcHBwcHBwcHBwiZCMiISDhIaDg4KCgYGCgoKCgYGBgYCAgYGBgoKBgYGBgYGBgIGBgH+AdG5vb3BxcXFwcG9vcG92dnVzcnFxcXFxcICDg39ycHBwcHBwcHBwcHFxcHBxcXFxcXBwcHBwcHBwcHFwcHBwcHBwcHBvcHBxcXBwcHFxb29vbm9wcHBvb29vcHBvb3BwcHBwcHBwcHBvb29vbm5ubm5ubW5ubm1ubm9wcG9vb29vb3BzcXWPj4yJg4KFh4ODgoKBgoGCgoKBgYKBgYGBgYGBgYGBgYCAgYGAgYGAf4B0b29vbm9vb29vb29vb3Z1dHNxcXFxcXJygIKCgXRxcXFxcXFxcXFxcXFxcXFxcXBxcXFxcHFwcXBxcXFwcHBwcHFxcXBxcHBwcXBwcHBwcHBwcHBwcHBwcHFxcXBxcHBwcHFwcHFxcHFxcXFxcXJxcnFwcnRycnR0dHR1dnRzdHR0dXd3gpCPi4iDgoaHhISCg4GBgYKCgoGBgoGBgYKBgYGBgYGAgICBgYCBgYB/gHVvb29vb29vb25vb29vdXRzcnJycnJycnKDg4OCdnFycnFxcXJxcnJxcXJycnFxcXFxcnFxcXJycXFycXFxcXFxcXFxcXFwcXFxcXFxcnNzcnJyc3V1dHR0dHR0dHV2d3d3d3d3eHh4eHd3eHh4d3Z3dnV2dnZ2d3h6e3x7e3t6enp6enyGkI2LiIODiIeHhYODgoGCgYKBgYGBgYKCgoGBgYGAgYCAgYGAgIGBgH+Ad3FxcXFxcG5ucG9wcG92dHV1c3Nzc3NzdYiDgoN5cnNzcnJyc3Jyc3NycnJycnN0cnJzcnNzc3Nzc3Nyc3N0dHV1dXV1dHV3eHd3d3d4eHh3eHh4eXl5eXl4eHl5eXp6e3t7e3t6enp5eXh3d3d1dnV2dnd5enp7fn5+fX1+fn5/f35+gIyQi4qHg4WIi4iEg4SDgYGCgYGBgoGBgoKCgoKAgYGBgYCBgYGAgIGAf4B8enp5eXx5eHh2dXZ2dHl2d3h3d3Z3dnZ6f3x+fnx2dnd3dnV4enh4eHh3d3d2eHx5eXx6eXl8e3l5eXh4eXl6enl5eXh4enp5eXh4eHh3dnd3eHh3eHh5eXp7e3p8fH1+fX9/f359e3t7e3p5enl5e3t/foB/fn5/fn19fX5+f35+fn6AjpCNioeEhoqLiIaGhIOBgoKBgYGCgYGCgoKCgoCBgoKBgYGCgYCBgIF/f4B/fn19fX9/f318e3t7eXh4eHh5eXl4eXh5eXl4enp6enp6e3t7fH1+fHt7ent8e318e3t7e3t7enl4eXh4ent6enp5eXp8fHt6enx8fHp6ent9fHx+fn+AgoGAgYKAgH9/gYGBgIB/f35+fn5/fX1+f4CAf35+f39+fn9/f39/gH+Af4OQjoyHhoWIi4yIh4aFg4GCgYGBgYKBgoKCgoKBgYKDgoGBgYGBgIGBgIB/goOCgoGBgX99f39/f4F6enh4d3h4eHh5eHh5enp5e358enx9fXt8fX19fHx8fnx9fn5+fn59fX9/f3x8fYGDgYCAf318fXx9fXt9fXx8fH19fX1+gYGChISDgoB/gYGBgH9/f4B/f39/f39+fn9/f39/f35+f3+Af39/gICAf4CAgICAhJCPi4eGhoiLi4mKhoaDgoKCgYGBgoGCgYKBgYGBgoOCgYCAgYGAgIGBgH+ChIKCgICAgH9+fn+AgH9/fn18fX19fYB/fX+Af35/gH9/fn9/gIGBgICAf3+BgICAf4CBgn9/f4CAf35+f39+f39/fn5+f39/gYB/f4CBgYCAgYOEgoGCgoGCgH+AgYCBgYGAgH+BgICAf39/gICAgYGBgIGBgYCAgICBgoGBgYCAgYGFjo6MiYaHiYyLi4qGhoOCgoKBgYGCgoOCgoKBgIGBgYKCgICBgYCAgYGAf4KFg4KBgYCAf39+fn+AfX5+fn19fX5/fn9/f35+fn+AgYCAgICAfn9/fn+Af3+AgH9/f35/f39+fn59fn9+fn9/f35/gIGBgoKDg4KCg4KBgYKDg4OCgYGBgYKBgoKCgYKBgoGBgYGBgoKCgYGCgYKCgoGBgoKBgYKCgoKCgYGBgoKCgoaPkY+KiImKjY6NiYaFgoKCgoKBgYKCg4KCgoGBgYGBgYF/gIGBgYCBgIF/gYWEg4KCgoGCgYCAgIB8fHx7fH18fH9+fn9+fn5+f35+f39/f39/f35+foB+fn5+fn9/f39+f39+fn5/gIB/gIB/f39/f3+BgYGCgoCAgYKDg4SDg4ODgoKCgoKCgoKCgoKCgoGCgoKDg4OCg4ODgoKCgYKCgoODg4ODgoKCgoODg4KCh5KTkIuKiouPj42Lh4SCgoKCgYGBgoKDgoKBgYGBgIGBgICAgYGBgIGAgYCAg4SDg4OEg4ODgoKCgXx9fHx9gn1+f4GCiIGCgoSCgYGDg4GBgYKCgYKBgYCAf39/gICAf3+AgX9/f39/gYCAgICAgH9/f3+AgICAgH9/gYODhYSEg4SDgoKCg4OCgoOCgoODg4ODg4SDg4KEhYWDg4SEgoKDhIOCg4ODg4OCgoODgoCKlJOPioqMjpCPjYuGg4KCgoKBgYGBgoOCgYGBgIGBgoGBgICBgYGAgYCAgH+BgoODg4SEhIOCgoKCfXx8fn6AgYOAg4OChIaFhoaFhIWFg4ODg4OBgYKEhIKDgoeDgoKAgoGBgoKCg4KCg4KDgoODgoGAgIKCgYOCgYKCg4OEhYWEg4OChISEhIOEhISDg4OEg4ODg4OEg4SDhIWEhISDg4ODgoKCgoKCgoKBgYKCgo+UlI+Njo6RkY6KiISCgoKCgYGBgYGCg4GBgIGBgYGBgYCBgIGBgYCBgICAgIKChIKChIOCg4ODgoJ9fX2AgH+AgoGDg4ODhIaEhIOEhYWDg4GBgoOBgIKDgYKFhYWFhoaHhoWGhoeHh4aGhoeHhoaEgoGCg4SDg4ODg4ODhISFhYWDhYSFhISEg4KBg4OCg4SEg4KCg4SCg4ODg4OCgoKCgoKCg4OEhIOFhYWFhoaIk5OTkI+Pj5KRjIqIgoKCgoKBgYGBgYKDgoKBgIGBgYGBgICAgYGBgICAgICAhISEgoKCgoGBgoKBgX+AgYOCgICAf4CCgoGDg4KCgoODg4SEg4KDhYOCgYGBgoSFh4eHh4aGh4eHiIiHh4eIiIiFhIOBgIGBgoKCg4GCg4SEhYSDg4OEg4OEhIOBgYGCg4OEhISDg4ODg4OEhIODgoSDg4ODhIWFhoeHh4eIiIiJiY6TkpKOj46Qko+LiYeCgoKCgoKBgYGBgoKCgoGBgIGBgYGAgICAgYGAgIGAgICDg4KCgYKCgYGAf4CBhYWFhoOCgYB+fn+BgoSCgYKDhIOCg4ODg4KChISDg4OBg4SFhISFhYSDg4SFhYKEhIWFg4KBgH9/gIB/gIGEg4OEhYWEgoKCgoOCg4OFhIKDhISEhYaGhoaGhoWFhoeHhYaIh4aHiIeGhoaIiYeGhYaGhoeIkZKSkI6QjpCRjImHhYGBgoKCgoGBgYGBgoOBgYGBgYGBgICAgICBgYCAgICAgISEg4KBgoGAgYGAgYKIh4aHhYSCgH99fX6AgH+AgYGBgYGBgoGAgYKCgoGCgoKBgYGCgYKCg4GBgICAf4GAgH+AgH9+gIGBgYKCg4OEg4OEg4OCgoGBgoODg4SEg4SEhIOFhYaFh4eIh4eHh4eHh4eGhoaGh4WFhYaGhIWEhIWEhYaSk5GOjo+OkI6JiYeEgoKCgoKCgoGBgIGCgoKCgoKCgYGBgYGAgYGBgICAgYGAgoSDg4KDgoGCgYKDg4iHh4iHhYSCgX5+gICAfn5/f4CBgYGCgYCCgoGCgH+AgIB+gIKBgIGCg4OAf39/gICAf4CAgICDg4KDg4ODgoOBgYKCgoOCgYKCgoOCgoSDhISDg4SEhYWFhYaGhoaFhISEhYWEhIWFhYSEhISDhISEhISEipSTkpCQj46NiIaFhIOBgYKCgoKCgYGAgYKCgoKBgoKBgYCBgYCBgYGAgICAgYGAg4OCgoOCgoKBgoOCiImJiYiHhYSDgYKEhIOBgYGCgoSCgoOEgoOEhYaEgoSCgX+AgoGBgoGChIOBgYGBgoOCgoGDg4SDg4SEg4OCg4KDg4ODg4KCgoKCgoGDhISEhYSFhYWFhIWEhIWFhYWDg4OEhISEhYWFhISEhISEg4ODg4OOlZKQkZGOjYyHhYODg4GCgoKCgoKBgYCBgoOCgYCCgYGBgICAgIGBgYCAgICBgICDhYSEhIODg4SDhIOGh4mIhoWDhIODg4WDgYGDgoOFhYODg4SDhIODhISFhISEgoGAgYKDgoOEg4OCgoGBhIWEg4ODgoKDhISDg4ODg4SFhISDg4KCgoKCgoSEhYSFhYWFhYODhYWFhYaFhoWEhIWEhYWGhYWFhIWEhISDhIODhJGUk5OSj4yMioWEhIODgYKCg4KCgoKBgYGCg4KBgYKBgYGBgICBgIGBgH+AgIGAgYaGhoaGhoaHh4aGhYSDhYaCgIGBgYGHgoB/f4GAgIKBgX+BgYCAgoGCgoKBgYKCgYCCgoKCgoKDg4GCgYKDhYODg4KDg4OEgoKEhIOEhIWEg4OCgoKCgYKCg4ODg4SFhYWFhIOEhYWGhYWEhISEhIOEhIWFhYWFhIODhIOEg4KGlJOSlJKPjYuHhISDg4KBgoODgoKDg4GBgoKBgoKCgYGCgYGBgYCAgYGAgICAgICAhYWFhYaGh4aGhoWGg4ODg4GAgoKCgYKAf39/f4CAf4B/gIGAgH+BgYGBg4GAgYGChIOBgYGBgYKBgYKDgoODgoOCgoKCg4OBg4SDg4ODg4OEhIKCgoKDgoKDg4ODhIWEhISEg4OEhIODg4OEhIODg4ODg4SDg4ODg4KDg4KDgouUk5KTkY2NioaDg4OEgoGCg4ODg4ODgoGBgoGCgoKCgoKBgYGBgICBgYCAf4CAgICDhISFhYSFhYWEhIWCg4KDgoKDg4OBgICAgICBgYCAg4KCg4KBgoKDg4OEgoODg4KAgICCgoKCgoKDg4ODgoODhIKCgoODgoKDg4KCg4KDg4WEg4ODg4SDg4SEhISEhYWEhIWEg4SEg4OEhISEhISEg4SEhYSDg4SEhIODgoKDkJSSkpKPi4yIhoOEg4OBgYKDg4ODg4OCgYGCgoKCgoKDgoCBgoGAgICAgIB/gICAgISDhYWEhYWFhYSFhYOEhIWDg4SFhIKCgoODgoSCgYKGhYSFhIOEhISGhYSEhYJ/fX19foKEg4ODg4ODg4ODhISEg4OEhISEg4SEhIOEg4OFhoWFhYSFhYWFhYSGhoWGhoWFhYWFhYWFhYWGhoWGhoaFhoaGh4aFhYWFg4SEhIeTk5KRkoyLiIWGhYWCgoGBgoODg4OCg4KBgYKDg4ODgoKBgIGAgICAgICAgH+AgICAhYWFhYWGh4eGhYWFhISFhYSEhISEg4SDg4OEhYOCg4SFhYaFhoaFhoeHhoOBfn9+fn5+f4OEg4OEhISEhISEhISEhISFhYWEhYSGhYWGhYaGhoWGhYWHhYWGhYaGhoaFhIWFhYWFhIWGhoaHhoaGhoaHh4iIiIaFhYaEhYWGjZSTkpGQi4qHhoeGhIGCgoKDg4ODg4KDgoGBgoODg4KAgYGBgICAgICAgICAf4CAgICHh4eGhoeHiIeHhoaEg4ODhIODg4OEg4ODg4OEhIODg4WFhYWHh4WFh4WBf39/f39/f36AgISFhIWGhoaFhYWFhoaHhoaFhoWFhoeHh4iHh4eGhoaHh4eGhoaGh4aGhYSDhIWFhoSFhYaGh4eHhoaGhoeHh4eIiIeGhoaHh4eRk5KQkZCLiIiFhoSDgoKBgoODg4ODgoKDgoKCgoOCgYCBgICBgICAgIGAgIB/gICAf4aHiIeHh4eIiYmIiIODgoKDgoSEhIWEg4KCg4OEg4OCg4WEhYeHhYSCgH9/f39/gIB/f4B/f4WFhoeIiIeHh4eIh4iHiImIhoaHiIiJiYmIh4aHh4eIiIaHhoeHhoaFhIOEhYaGhYWFhoaGh4eFhoeGh4aGh4eHh4eHh4eFh5OTkY+RkIuHhoWGhIKCgYGCg4ODg4ODgoKCgoGCg4KCgIGBgYCAgICAgICAf3+AgYB/hoiIiIiHh4iJiYmIg4KCg4ODhIWHh4eFg4OFhIODg4KDhYSEhYSBgIGCgYGBgYB/gH9/fnt6gIaIiIqKiYmIiImJiYmKi4qIiIiJiouLioqIiIeIiIiHh4iIh4iGh4aEg4OFh4eHhoWFhISEhYWEhYWGhISEhYWFhoWGhYOJlJOQjpGOioaFhoWDgYGBgYKDg4ODgoKCgoKCgoKCgYGBgYGBgYCAgICAgIB/gICBgH+GiYiIiYeIiImJiIiEgoKDg4KDhImKh4eEhIWEg4OEhIWFg4OCgYKCgoKCgH9+fH19fX9+fHt8g4eJi4uKioqIiIqJiImLiomJiImIioqJi4mHhoaGh4WGiIiJiIeGh4SDgoSIiIiIh4WCgoGDg4KDg4SCgoKDgoGEg4SDgY6TkpCPj4uIhYSGhIKBgYGBgoODg4OCgoKCgoKCgoGBgYGBgIGAgICAgICAgH+AgIGAf4WIh4eHhoeIiIiHh4SCg4ODgoOFiYqJh4WHhYSFhYSEhoaDgoKCgoKDgX59fn5+fn5+fX1+fX19g4eJioqHh4WGh4eHh4iHiImHiIaIh4eJiISDhIOFhISFhYeIiIaFg4KCg4WHhoeGhoOCgoOEgoOEhIKBgoGBgYODhIOEkZKRjo+Oi4eEhoaDgoGAgYGDg4ODg4KCgoKCgoKCgYGBgIGBgYCAgIB/gIGAf39/gIB/hYaGhYaGhoeHiIeGgoKEhIOChYaIi4qGhYaEgoaGgoCDg4ODg4OCgoF9fH1/gH9+fn59fH19fHp8hIaHhoSDgYKDhIWFhYODhYSEhISFhIWEgoKDgoSEgYKDg4WGhYSCgYGCgoODhYOEhIWEhIaDhISFg4KDgYKDg4SFhIeSkY+NkI2JhoSFhIWCgYCBgYODg4ODgoKCgoKCgoKBgYGBgYGAgICAf4CAgYB/gICAgICDhIWEhYWFh4eHh4aAgYGFg4OEhYSHiIWDgYCAgX9+fYKDg4ODgoKAfX1/gICBf31+fn19fX16enp+g4SEgoGBgIGBgoKBf36BgYGCgYOAgoGCgoKBg4OAf4CAgoKCgICAgIGBgYGCgYGChIODhYSCgoSDgoKBgoSDhYWGjJORjo+Pi4iFhYOChIGBgYGBgoODg4KCgoKCgoKCgoGBgYCBgYCBgH9/gIGBgICAgH+AgIKCg4OChIOEhYWGhn+BfoCBgICAf4GDgn9+fn9+fHx/g4OCg4KDgX19fn+AgIGAfn19fX1+fXx6enp/goKAf39/f35/f4B+fYB/f4CAgX+AgIGAf3+Bgn59fX+AgX9/fn+AgH+AgICBf4CCgICCgoGCgYGAgYGBgYKEg4aPkpCOj42Kh4eGg4OCgYGBgYGCg4ODgoKCgoKCgoOCgYGCgYGBgICAgH+AgICAgICAf39/gYKDhIGCgoODg4SFgIF/fH19fn19foCAfn1+fnx9foKDg4KCgYF/fX1+foCAgH9+fX19fHt7e3p6eXqAgH9+f35+fnx+f35/gH9+f3+Af4CAf35+fn9/fn18fn+Af35+f3+Af39/f4B/f4B+f4CBf4B+f39/gH9/f4B/hZKSj46Pi4uHiYWEg4KCgYGBgYKDg4ODg4OCgoKDg4KAgYKBgYGAgICAf3+AgIB/gIF/f36BgYSEgYKBg4OCg4OBgH98fn5/fn6AgIB/f4B+fX+BhIOCgYB/f359fn5/gICAfn19fX17e3x6enl5eXt/f35/f39+fX5/f4CAf35/f4CAgoB/fH5+f35+fXx/f4B/fn5/f4B/f35/foCAf36Af39+fn5/f35+f318fH2Fk5KNjIuKiImIhISEgoKCgYGBgoOCgoODgoODg4ODgYCBgYGBgYCAf39/f4CAgICAgIB/foCBhIOCgoGDhIWDhICBgICBgIGAgYKCg4GBgX6AgoODgYGBgYCAfX19fn5+f359fX19fXx8fHt6eXl5eX2Af4CBgYF/f4GAf4F/gICAgYGCgoB+gH5/fn5/foGAgoF/f39/gIB/f39/gYB+f4CAfn9/fn+Af31+fX17fIaTkYyLioeHioiGhoSDgoGBgYGCg4ODg4OCg4OCgoKBgICBgYGAgH9/f39/gICAgICAgH9+fn+BgYGAgISGh4aHgoSDhYOBg4ODhYSEhISDgYODg4KCgoGCgX5+fX19fn6AfX19fX19fX18e3p6eXl5eYCCgoKEg4CCg4GAgoCBgYGDgoKDgYGCgIGAf4CBg4GEgoCAgYCBgYCAgYCCgn+BgIF/gIB/gICAfn9/fnx8ipOQiomIiIiJiIaGhYSCgoGBgoKDg4ODg4KDgoKCgYCAgIGBgYGAf39/f4CAgICAgIGBf359fn5/f39+g4aHh4iChYSFg4SFhIWGhoaGhoWFhoGAg4ODgoKAfX19fX19fn59fX19fX19fX18e3l5eXl4fIKDhIWCgYSDgoKDhYaCg4SDgYKCg4OCgoKCgYKFg4iFgoGBgYKCgYGBgYSDgoOCgoKCgIGBgIF/gIGAf36Ok4yHiIeIh4aGhYaGhIKDgoGCgoODg4ODg4OCgYGBgH+AgYCBgYB/gH9/gICAgH+AgYB/fn19fX5+f36Ag4SHiISGhoaFhoaHh4aHh4eHhoeHf32AgIGCgX59fX19fX19fX19fX18fH5+fnx7eXh3eHl5gIKDf4ONhIOEhISXl4ODhIF9foGCgoGCgYKBhIaIjIWDgoKBhIKEg4KDhYWEhYOCg4OCg4OCgoKCg4OCgpKQi4iJh4mHhoaEhoWEhISCgYKCg4ODg4ODgoGBgYCAgICBgIGBgH9/fn+AgYCAf4CAgH9/fn1/fn+Bf4CCgYWFhYaGh4eGh4eIhoeHh4aHh4d/fH18fX9+fX19fX19fX19fX19fXx7iJKCe3x6fIZ5eHl8gYF+iZeEg4OEhJSTgIGBf39/fn6Ei4B/gICEhpCJhYSCgoGFhYuDgYKFhYaGhIOFhYOEhIODhIOFhISIko6LiYiIiYeHh4WGhYSFhIKCgoKDg4ODg4OCgYGBgICAgIGAgICAf39/f4CAgICAgYGBf39/f4CAgIGBgYGBg4OGh4aGh4aGiIeGhoaFhISGhX98fHx8fX18fH19fX19fX19fX18fH+RlZaDe3qElHx4eXp7fH+Cg4GBgIOCgH58fn57iJF8fI6Wf31/f4KGioWDg4SDgYONiX99f4OEhYWDhYaFhIWFg4SFhYaEhI6Rj4yKioyJiYmHhYaFg4OCgYKCgoKDhIODgoGBgICBgICAgYGAgIB/f3+AgIB/gICAgX5+f4GBgoKCg4ODgoOCgoWGhISFhYSGhIOEg4KCgYOBf319fHx9fXx8fH18fH18fX19fHx8e4uRl4x6e3yBenp6e3x5eX19foB/gH98e3t+fn2ClZF/hIh+fH5/goR8fIGChIKAf4eDfYKBgIKCgIODhISEhISChIOEhYKEkZGOi4yMjoqJiYWFhYODgoKBgoODgoKDg4KCgYGAgIGAgICAgICAgH+Af3+Af357gICBenyAgoKDhYOEhYWFhYODg4SCgYODgoOCgoGBgIB/gX9/fn59fHx8fHx8fHx8fHx8fHx9fHx8fn6Kgnt6e3p4ent7fH17fn1+f319fX18fICBgX2Gj4F+fYJ+f36Agnx8f3+BgIKAfn17ioJ9gH9+gYCAgYKBgoCBgIGAf4uTj4yLjY6NiIeIhoWEhIOCgoKCg4OCgoODgYGBgICAgICAgH9+fXx7fHx9f39/gHx6gYF4e4CCgYOFhIOFhIaGhISAhpSIgIGBgYGBgH9/f39/fn5+gHx8fHx8fHx8fHx8fHx9fHx8fHx8fHl7e3t4eHl7enp8gX+Afn+BfH5+f399gIKCgICAgX+CkYF/f4CAfoB+fn9+gIGBfX19e319fXx9fHx9gH+AgH6Afn6ClJGLjI2Nj4qFhoaFhISFg4OCgoODg4OCgoGBgYGAgICBgICAf4CAf39/fXt6fYCAgHh+gXd7gIF/gYKCgoKEhoeGhn6IlYp+gYGAgIB/foB+f39/fn+Bfnx7e3x8fHx8fHx8fH59fHt9fHx8e3x8fHp6eXt8en2Fg4J/gYF+f35/gH6FgoF+gH9+foCFhoKAfn6Dhn9+fX6AgIGAf39+fX19fX57fH1/f3+AfX9+gIyRjYuNjo2Nh4SGhoWEhISDg4OCg4ODg4KBgYGBgYCAgYGAgYGBgYGAgH9/f397en9/e3mAd3p/f31+f3+Af4KDhoaFf3+FgX5/gIB/gH5+f35/gIB/gIB/f318fHx9fn18fX19fX19fH58fXx7fXx8ent6fH19f4aEgoCAgX1+fX5/fouEgYZ+fXx8f36CgX99fX19gXx7fXx+gYSDgYB+fn5+fX1/f399foB+fn6EkoyMi46Ni4qGhIaEhISDg4OCg4KDgoOCgYGBgYGBgYGBgYB/fXx8fH1+f39/f397e399d352eH59fH18fX5+gYGCg4B6fX18fn+AgH6Af35/fn+AgH+AgH9/fn9+fn5+fn1+f399fH59fn19fHt8fHx6fHp9fn+AhIOCf35/fH18fXx8gYN+jH58e3t9fn1+fn17e3t9e3p7e3uAhoSChIOCf4B+f4KCgn9/goJ/gIqPjIqKjIuKiISEhIOEg4ODgoKCgoKCgoKBgYGAgoGBgYKCf3+AgIB/fn18fH5/fn55fX52e3Z4fXx8fHt9fX6BgICAf31/f31+f39/foB/f39/f3+AgIGBgH99gH9/fn9+fn9/f3yCfn59fX17e319fHp8fH6AgoGAgIB8fH18fHx8fH18fXt/fnt7e3x8fH18e3t7e318enp9en6Cf4GDhIKBgoGFhoWFhoaHhYKEkY6MiomKh4iFgoOEhISEg4KCgYGCgoKBgoGBgYGBgoGBgoKAgYKBgYCAgH9+e3x+fnx6fnh5dnd8fHx7e318f4GAf35/foB/f35/fn5/gH9/f39/f3+AgYKAfn6BgIB/f39/f39+fYN8fH19fH99fX19e3x+fn9+fn5+fnx8fHx8fHx+fnt8e3x8fHx9fH18fnx9fHx7e3x5e3x7e317fX5+f4CAg4eJiYmKiYqJhYiRjYuIiIaFhYOCgoOEhIODgoKBgYGBgYKBgYGBgYKCgoGCgoCAgX98e3p6eXt9enx+fnl8eXh4dHx8fHt8fHx+gX9/f39/gIB/fn5+fX+AgH9/f3+Af4CDgoB/gIGAgIB/f4CBgH58enx9fX59fX5+jIZ9fX57e4OCfX19fX18fXx9fX1+fH18fXx9fX58fn19fX18e3t7fHt8fHt6e3t6enp7fn6DhYiHiIqLi4qJjJCNjImIhoWEg4KCgoODg4OBgYGBgYGBgYGBgYGCgoOCgYKBgIGBf3+Af356eHl5en5+e3l6eH5zfHx8e3x8fH5+fn5/gH+AgIB/fn9+gIF/f4B/gIGAgoSEgYCAgYGAgX+AgYKBf39+f31+gH57foGRjHx9f4qAjYx+fn19fX59fX59fHx8fX18fXx9fX1+fX1+fnx7e3t8fH18e3p7fHl6eXh5e35/hIOEh4mKiImNj4yKiIiFhISDgYKCgoKDgoGCgoKBgYGCgYKCgoGCgoKBgoKAgYGAfoCAf39+e3p5e319eHx6f3KBfXt7fHx8fn59fYGBf4GBgX9/gH+AgX9/gIGCgYGFg4SCgYGCgYKCgICBg4KAf4F/fX6Afnx+f4iCf36DkISEg4F/fn18jYd9fX59fHx/fnx9fXx9fX1+fX5/fX19e3x9fnx8e3x9enp5eXp5e3t+foCBg4eEiI2MiYmGhYSEg4KCgoOCgoKBgYGCgoKBgoKCgoKCgoKCgoGCgn+AgIB+f39/fn5/ent5fX16enp9cX6Cent8fX19fXp4f4KAgYKCgICBgIGBgICBgoKCgoaFhIKBgYGBg4F/gIKEgX9+gYB9foF+fX5/gIB9fn+EgH5+f31+fX2KhX1+f31+foB/fX19fH5+fn99f4B9fn18fX9/fHx7fH17e3t6enp7e3x9fn2Ag4CJjImKh4WFhYSDg4KCgoKCgYGBgoKBgoKCgoKCgoGBgoKBgYKCf4CAgH9/f39+fn59eXp6fXx5d3t0e4d8dHd9fn17e3Z2foCBg4KBgYKCgoKBgYGDg4OChYaEgoCAgICCgX+AgYSBfn6AgH5+gH59fn6AgH+Bfn+Af39/gH99fn9/f3+Afn9/gH58fX18fn5+foF/gH2CgHx9gIF9fHx9fXx8e3x8e3t7fHt8fHx9fImJh4eFhoWFhISDgYKBg4KAgIGCg4KCgoOCgoKCgoGCgoGBg4J/gIGAf39/fn5+fn57enp8fHt2e3R3f352cnt+fnt4dnd8gIGCgoKBgoODg4OCgoSDhIOFhoOCgX9/gIOAgICAg4F+foCAfX+AfX1+foCAf4J/gYGAgICBf31/f3+AgIGAgIB/fnx9fX19fn59g32AfoKAfX6AgX98fn59fX17fH58fXx8fHt8e3x+iYWGhIWHhYSFhIKBgoGDgYCAgoKDgoKCg4ODg4KBgYGBgYGCgH6AgYB/fn5+fn5+fn56e3p9goN9dXF6fHpxen19eXh0dICAgoKCg4KDhYOEg4KDhISEhIWEgYGAgH6Agn9+f36Bf35/f4B9foB9fX1+gH9/gYCCgYCAgIKBfn6Af4GAf4CAgH9+fX19fn1+fn19gYR/gH9+f4GBf32Af319f31+fn1+fHt8enx7eoCFgoSEhYSEhIWDgoKBgYKBgICCgoOCgoOEg4SDg4KBgYKBgYOAfoCBf35+fn5+fX5+fnt7en6Jh354cnl9f3F6eHt4eXR1fYKDgoODg4OFhIWEg4OEhIODhIKBgH+Af4CBfn19foB+fn5/gH19f3x9fX6Af4CAgIKAgIGAg4GAf4B+gIF+gIGAgH9+fn5+fn5/fn6FhYGBgH+Ag4F/foGAf36Af4B/fn17ent6fHt6goOAgoKCgoOCg4KBgYCAgoGAgIKBg4GBg4SDhIKEgoGBgoGCgn9+gIF/fn1+fn5+fX59fXp7fIWEe3tzeXt8cHd1dnd5dnR6hISBhISDhIWFhoSDg4WEgoODgoCBfn9/f4B9fX1+gH1+f39/fn1+fH19foF/gIB/gIB/gIGDg4GAf36AgH+AgYCBgH9/f39/f4CAgIGCgoKBf4GEgX+Ag4F/f4B/gX+Af3x7fHp8e3yBgH+Bf3+BgIKCgYF/f3+BgH6BgoKDgYGDg4KEgoSCgYGBgIGCgH6AgH9/fX5+fX19fn1+e3t6gH94fHZ5enxxdHh3dnh1cnmFhYKEhIKEhYWGhISChIOBg4KAgIF+f4B/gHx9fX6AfX5/f39+fX98fn5+gX+Bf39+f4B/gIODg4B/f4GBgIKBgYGAgIGAgICAgIGAgYKDgYF/gISAfYGDhICAgX+BgYKBfXp7e3x8fX99f4B8f39+fYGAgH59fYB/foGBgYKBgIKCgoKBg4KCgYB/gYKAfn9/fn99fX1+fX19fX19ent7fHZ9eXh6enJ1eXl2d3dzdYaFg4WFgoSEhYSEhIKDgoGDgX+AgX5/gH6AfX19fn9+f4B+fn99f3x/f3+BgIF/f3x+gH6AgYKDgYCAgoOEgoGAgYB/goCAgYGAgYGCg4KBgX9/g4B+goKEgICCgYKChIJ+e3t8fHx9fX1+fXp+fX55fn9/fHx8fn1+gYCBgYGAgoGBgYGDgoGBf4CAgoB9fn19f319fX59fH19fX16e3p8dnx6d3t4cnZ5e3Z2dnN0hoSEhYSChISFg4OCgYOBgYOBgIGBfX+BfoF9fX1/f39/gH5+f359fYB/gIGBgX9+fH5/fn5/gYJ/gYGCg4eFgX9/fn6Af4CBgICAgIKCgYCAfoCCf3+BgoKBgYOCg4OFgn99fX18e3x8eXp7en55fHl4f357e3t+fX1/f4F/gH6BgICAgoOCgYF/gIGBf31+fH1+fX19fX18fn58fXx5e3x4enx3endzeHd6c3Z2c3SGhISFg4KDhISDgoKCg4GCgoGAgYF8gIB+gH1+fX5/gICAf35/f3x+gH+BgIGAf359f39+fn+BgH2AgIGDhIN/f359fn5+f4B/gIB/gYKBgH9+gIF+f4CCgoCBhIKEhIaEgH59fHx8fHp5dnl5enl2eXZ+fHt7e359e399gH99fX9/f3+BgoGBgX5/gYF+fX18fX19fX19fXx+jYF8fXl7e3p5fHd4eHR1dXhyd3d0doaEhYWDg4ODg4OCgYKDgoGDgn+BgH9/fn+AfX19fX+AgIB/f4B/fIB/f4GAgYCAf3yAf35+fn9/fX5+gYKCgn5/fn1+fn5+f3+Af32AgYB+fn5/gX5+gIKBf4GDgoOEh4SAgH58fXx8e3x1eXl4eHh5d3t8e3t7foV9fn1/ent+fn59foGAgIGAfX6BgH59fXx9fX19fX18e32DgXx8ent7e3p7d3Z4dXJzdnF3eXJ4hYWFhYOEhIKCg4KBgYKBgIOBgIB/fn5+foB+fX58foCAgH+AgX97gH6AgH+BgIB/fYB/fn5/f319fX6AgYGBfn9+fn59fX5/fn9+fH6Af35+fn+Cfn6AgIF/gYOCg4OGhICBfnx9fHx7fHh3e3h1eXd3eXx6e3t9kod9fH13en1+fn19f35+gH98foB/fn19fH19fX19fXt8ent9enp4e3x6ent4dHh1cXJ0cHh4cXmEhYWFg4SDgoODgoGBgoKAgYGAgIB9fn5/gH18fn1/gIGAf3+CgHyAf4B+f4GAf399gH9+f39/fX18gICAgIB/f35+fn18fn9+f358fYB/fn1+gIJ/foCAf36BhIKCg4WFgoJ+fX17e3x8eXd7eXd4d3d4e3t6e3yFin17end6fH19fHx9fX1/fn19fn59fXx8fX5+fX18fHt6enx7e3p5enp7enhzd3VxcXNweHdxe4WHhYWDhYKBg4OBgYGBgoCBgICBgH5/fn9/fXx+fYCAgoGAf4GBfX6Af35/gX+Af3+BgH+Af35+fH1/gICAgH9/f35/fXx+f39/f319f39+fn6CgYF/gIB/foGDgoKEg4SCgn5+fHx6fHt7eXt6d3N2d3h5e3p7eXp/fnt7d3p8fXx8fH59fH19fH19fXx8fX19fX99fXx9e3l7fHx8enp6enp6eHN2dXBwcm93dnJ7hYeEhYOEgoGDgoKCgYGCgYKBgYGAf4B/f399fX9+f4CBgYF/goF9foF+fn+Bf4B/gIKAgIB+fX58f3+BgICAf4B/f4B+fX5+f4B/f39/gH9/f4J/gH9/gIB/gYGAgISBgoKAf39+f3x9fn56fYV+dHx9enp6enx5eXp6hoV3eXx8fHx8fXx8fHx8fX19fHx9fX19fn19fX16eX18fH16enp6enp5c3V1b29xcHd0c3yFhoOEgoOCgYKBgoKCgYKBgYGCgYCAgICAgH59gH+Af4GCgn+Cgn+AgX5/gYF/gICAgn+Bf319f35/f4KAgICAgIB/gIB+fn1/gH9/gIB/f39/gH+AgICAgH+AgIGBgYGCgYCAf39/fn1/fnuBk416fH18e315e3p6eHmBgXh5e3x8fXx8fHx8fHx9fX18fH18fn1+fn59fHp8fHt8fXt5enp6eXlzdXVvb3Fwd3N0fYWGg4OCg4KAgYCCgoKAgYGCgYKBgYCAgIGAfn6Af4GAgYKCgIKCgICCfoCBgX9/gX+BgIF/fH6Af3+Agn+AgICAf3+AgH9/fX6Afn2AgIB/f3+AgICAgYCAf4CAgYCBgYKCgICAf39/fX5/fIGGiXx8fnt7fnl6e3p7jX53d3l7fHt9fHx8fHt9fH19fX18fXx+fn5/f358enx9e319e3l5e3p5eXN0dW5zcXB4cnV6hYaDg4KDgoCAgIGCgX+CgYKBgoGBgYKAgYF/fn9/gYGCgYKBhIOAgYJ/gYGBf4CAgIB/gX99f4F/gICBgICAf4B+gICAf359f4B+fn+Af39/gH9/gICBf4CBgH+BgIGCgoKAgICAgIB9foB9gIOCe35+e3t9e3p8fHuHeXh4eXx8fH17fHx9fX18fH19fn19fX5+f3+Af317fH18fHx7enl7e3l5c3J1bnZycHhxdnaFhYOEg4KCgICAgoF/gIKCgoKDgYGDgoCCgYB/gICCgoKBg4KEhICBgX6BgoB/gICAgH+Cf36AgYCCgICAgIB/gH+AgIB/fn2Af39/f4CAgH+Af3+AgYF/gICAgIGAgYGBgoGAgYCAgH9/gH5/fX59fn57fXx9e3x8d3h1eHh5e3x8fXx8fHx8fX5/f39/fn19fn9/gIGAf3x9fHx9e3p7eXp8eHpzcnVud3FxenF2d4WFg4ODg4KBgYKDgH+CgYWDg4SBgYOAgoKBgYCAgYKDgoCCgoSDf4GAfoKDgICBgICAf4CAf4GBgIJ/f4CCgH9+gICAgICAf4CAgH+AgICAgIB/f4CBgYCAgICAgYGAgoOCgoCCgYGCgYB/f4B/gId+fnx6fXx7fX54d3Z5eXp8fXx8fXt8fH19fn5/gIGAfn1+gICAgoGAfH59fX58d3t6ent5eXNxdW53cHV6cXZ5hYWCg4KDg4KDhISAgIKBhoODg4GChICEg4KCgICCgoSBgYKChIJ/gIB/gYOCgYCBgYCAgIGBgYGAg4F+gIOCf31/goGAgIB+gYCBf4CAgYGBgYCAgIKBgYKBgYCBgYGBgoOCgoOBg4OCgYCBgH+AhH19fXt/fXp9gHp5dnp4eXt7fH19e3x9fX19fn+AgYGAgH+AgICDg4B9f35+fn15eXt6enp5c3J1b3dxd3lzd3uFgoKDgoOEgoOEg4CAgoKGg4ODgoKEgYSDgYKAgIKBg4GCgoGCgX6BgICCgYKBgYKCgICAgYCBgoGEgH6Bg4F/f4CDgoCBfoCCg4KAgYGBgoKDgoGBg4KChIGAgYOBgYKEg4OEhIODhIODgoGBgYCCf4B/fYB8enx/e3t3fHl5eXt6fX59fHx8fH1+fn+BgYCAgIGBgYSEgH2Af39/f357e3t6e3p0cHhyeXR2eHR3e4SCg4KDg4SChIODgYKChIaEgoODgoSBhISAg4CBg4KCgoKCgIKAfoGAgIKBgoGCgoKBgIGBgYOCgoOAfoGDgX9/gYSEgYN/goKBg4GCgoGDg4OEgYKEgoOCgoGCgoOBg4SDhISEhISFg4SCgYOCgoOBgYGAgH58fIB8fHh8eXp5enx9f3x7fHx9fX18fICAgICAgYGBgYKBfoGAgICAf3p7e3p6enVweHd5dnV8dXZ8gICDgoODg4OEhISAgoKFhYWDg4KDhIGEhYKCgYKDg4GCgoKAgYB9gICBgYKDgoKCgoGAgYKCg4KCg4B/gYOBgICChIODgoGCgoGDgoKDg4SDg4SAgoSDg4OBgX+Bg4KDhYKEhISEhISDhISChIOEhIKBgoGBgHt+gX59eXx6enp9fHyBfnp8fH19fHp7fn5+gIB/gYGAgICAgIGBgIB/fX18fH18dnJ2eHh2dH92dX2Hh4OChIWDg4SFhICChIWEhIOCg4SEgISFg4KCgoODgoOCgoCCgH2AgIGCg4KCgoKEgoGCgoOEgoKBgICBgoGAgYOFhIOCg4CCgoOCg4ODhIOEg4CCg4KEg4KCfoOBgoSEgoODhISEhIOEhIOEg4WEg4ODgoKAe4CBf3x8fXp6e31/fX9/fHx6fH59fH19fn5/f39/gICAgH9+foCBgICAfnx9fX5/fn18e3h2f3Z3f4SHg4KDhYODhIaEgYKFhoWEhIODhISChIWFgoKDg4SCg4KDgoKBfoCAgoKDgoODg4SCgYKCg4OCg4GBgYGDgn+ChISDg4KEf4KEg4ODgoSDg4SCgIOEg4SDg4KCg4KChIOCg4SEhISEhIWEg4OEhYSFhIOCgoB9gYJ/fXx8e3x8gH19foB+fn1/fnx8fH19fn5/fn+BgYGBgH99fX6BgYB+fn19fX59fX5+f39/fH2AgYKCg4OGg4SDhoSBgoiHhYSDg4SEhYGFhYWDg4SDhIODgoOCg4F+gYGDg4SCg4OEhIOCg4KEg4ODgoODgYOCf4KEg4ODgoOAgoWDg4ODhIODhIOBgoSEhYOCgoODgoGEg4GDg4SDhISEhYSEhIWFhYWEg4OEf32BhH99fXx8fHx/gX5+fn9/fX99e3x9fX19fX5+f4CBgIGBgH59fH6Cf39+fn5+fX1/f39/gICAf4CEhIODhIWDhIOFf36CiouFhISDgoSFgYaGhoOEhISEhIODg4OEgn+BgYODhYSFhIWEg4KEhISFhIODgoSDhYKBhISFhYaEgoCDh4SDg4OFhIWFhIGEg4OHgoOCg4GCgYSDgoODhYODhYWEhYWHh4aHhYWFhYSBf4KEf35+fH59fX+BgH9+fHx+f358enx9fX19fX5+fn9/gIGBf319fIB/gH5+fn5+f3+AgYGBgYKAgYWFhIOFhIKEg4aAgoWFiomEhIOEhYWDh4aGhISEhIWEhISEg4SDgYKDg4OEhIaEhYSDg4SEg3yDhHuBhHd5g4F9hH5+cnWDgoF2foOFgX2BdYF6g39/gH6EhIKDg4KBg4SDg4SFg4SFhoSFhn2EeXx+f4R7hYOBhIOAf35+fn19gYOBfXt/fX6Afn18fHx9fX19fH19f4B/gYJ/fX18f4GBgICAgH+BgYGCgYKDg4KChoSEhIaEgYOEhYOEhYSKiIWFhYOFhYSGhoaDhISFhYWEhYWEhIWCgoOEhYWFhoSFhIOEhYWCaICFanx7cXF8gXOGc3R0fYKDdXNxg4Z0cHVyc3SDdnt9dYF/goOBgnZ5hYCDgIR/hYSChYWCaHpyc3N8gHOBg3+Dg32BfX5+fX6Cg4F8f4F9f4B9fXx8fHx9fHx8fn1+gH+BgX99fX2AgYKBgYGBgIGBgYKBgoKCgoSHhIWEhYSBgoSGhoOFg4aIhoaFg4aGh4eGh4OFhYaFg4KFhoSFhYODg4SEhoaGhIaEg4SFhn1xe4FweXZ+g3+CbnlwdXN8dnl5hXKEg3B2eHF2dHR1cnN0dml/gG5yb3R2bnVsd217c26AiHltfXJzdnN2bW14bHB5bHV9f399foGAgX1/fn2Af4B/fX18fH19fH1+f32Af4CAfnx/foCBgoCBgICAgYCAgIKDgoOEhYiGhoCChYODhIeGg4WFhYaHh4SDhoeIiYaHhIWGiIeEg4WGhYWEhIOFhIKFhoaFhoWEhoWHdnB0e3BydX+HhYNtdW92b3x1coR5eYd4cXR3bndod3pucHWCcoN+b3p5eW1vbnpvb213fXiGcHF6cHJ0ZoF1fm57eXNveX+Af319gX9/fH99fIF+gIB+foCAgYB+fn9/foF/gH9+fYB9f4CBgIB+fn+BgH9+goOCgoSFh4eEfoeEg4OFh4aEhoWFhoaIhISGh4eIhoeEhoaLioWEhoeHhYSFhYWEgoWFhYWGhoWGhYZxdXByc29zenl+hHSIdHV+iHZugnKEhnluanJ/cW1zd3x/dXR8hH54cXV3bnl1enF2eHV6eYRxam95eHBreXN6b3p3dnZwgYB/fn5/f356fn19f31/f359gIGDg4CCg4GBhIKBgIGBgH1/f4F+f35+f4GAfn6BgoCAgoSHhoODhoSFhYaHhoWFhYWGhoiFhYaFh4eFhoSGhomIhYSJioiFhIaGhYWDhYWEhYaGhoaFg3iLeXKIentwcIWEeIV4eWtzfnl7a3KDh4N6fG17eXl0fYB2bm+AgG90fHV3cXl9fW1+dW+DhYZ6gHJye3x1cG96bHN8bneCgYF+fn99fXt9e3x9fX9/fX1/f4KCf4GDgYGDgYB/gICAfn9+f31/fn1/gH58fYGAfn6Ag4iFhoOFhYWFhoeFhYWFhoeHiIaEhoWGhoaFhIWFhIWFhomJh4aEhoWGhoWGhoSGhoeGhoWGh4eHhoaEhoWGh4iHhYeGhoOHhoWFg4SGhoWGhIaEg4SEhoSDgYODhISFhIWEhYSGg4aHhYaEhIWHhoSEhYaEhX13hYOEhIOCgX1/fnt8e357fHx9f359fH59gYB9f4F/f4GAfn5+gH5+f35+fX99fX5/fHt8f358fH+BiYaFhIaGhoWGhoWFhYWHhoeIhoSGhYaGhYWDhIWGhYSGhoaGhYWGhIWGhoaGhIaGh4eGhYeIiIiIhoSHhYaGiIaFiIeIhYeGhoiFhYaHhYaGhYOChYWGhYWDhYSEhIWEhYWEhYWEhoeGhoWEhoeGhISFhoOFhIKEg4OFg4OCfYB/e3t8fnt8fH1/fnx8fn2Afn1+gH5+gH99fXyAfX5/fn5+f3x8fX57fHx/fHt7foCIh4SEiIaGhoeGhYWEhoaGhoiHhIWGh4aFhIODhIaFhIeFhYaFhYaEhYaGh4eFh4aJiIaGiIeIiYiFhIiFhoeGh4aIhoeFh4eGh4WFhoeFh4aFgoOFhoaEhIOEhIOEhoSFhYWGhoSGhoWGhYWGhoWFg4WFgoWHhYOCgoWDhIF+gIB8e31+e3x7fX59e3x+fX5+fH9+fX1+fn19fH98fn58fYGAfXx8fXx8fH56e3t9foiHgoWIh4eGhoaGhISGhoeGiIaEhYSGhoSFh4OEhYSFh4SFhoaFhoSGhoeHhoaIh4mIhoaIh4iKiIWHiIWHh4WHhoeGh4WIiIeHhYaGh4WGhoWBhISFhoWFhISEg4SFhYaGhoWGhIaFhoeFhYaGhYSDhIOChIeDhIGChISDgYCAgHt7fn18fHx9fXx8fH19fH18fn18fX18fHx9fXx+fXt8gX99fH18fnx8fHp6fHx9iIeChoiHhoeGhoaEhYaFhoWGhYOFhIaFhIiJg4GEg4SGhIaGhoaGhIeHiIiHh4eIioiGh4iHiImIhYiHhYeGhoeHh4WHhoiIh4eFh4eHhYaHhIKEg4SGhYeFhYSDhISFhoaGhoaGh4aGiIWGhoaFhIKDgoODh4GDgIKDg4KCgn+Ae31+fXt8fH59fH19fH17fHx8fHx8fXt7e318e358e3x/fX18fX1+fXx6ent7fHyIh4KGhoaGh4aGhYOFhoWFhYWEg4WChoSDiId/enqChYaEhoaFh4aEh4eJiIiHhoiKh4aHh4eIiYeFiIeGiIeGhoeHhYeGiIiHhoWHh4eGhoeDg4SEg4aGh4WFhISEhYaGhoaGhYeHh4eIhoaEhoWDgoKCgoOGgYN+goKDgIOCf398f35+fHx9f318fX18fXp7e3p7fHx8e3t7fnt7fXt7e358fHx8fX5/fXt6fHp8fYmHg4aFhoWGhoWEhIWFhYWFhIOBhYGGhIKEhHyAhn+ChYWGhYWGhYSHh4iIiIaFiIqHhYeGh4eIh4WIhYaHiIaGh4eGh4aIiIeFhoeGh4WFh4OEhoWEhoaHhoWFhIWFhoaGhoeFhoaHh4eHhYSGhYOBgYGAg4WCg36BgYF/g4F/fn5/fn58fH1/fXt9fXx9enp7eXt8fXt7e3t+fHx8fHp7fXx8fHx+fYF8e3t7e3x7iYeEhoSGhIaGhYSFhoWEhIOEgoCDgYWCgYJ/eoSMe4CEhYeGhoaFhIeIh4aHhYWHiYeEh4WGh4iGhYeEhoeJhoaIh4eHhoeIhoSGhoaHhoWHg4SFhIaGhoiFhYSDhYWHhYeGh4WGhoeGhoaEg4SFgoCBgICDg4OCfYGBgH6DgX5/f4F8f3x9fX59e359fH15enp5e319enp7e318fXx8ent9fHx9fH5+gHx7e3x+fXyIh4WGhYaEhoWFhYWFhYODgYOBgIGBhYKAgH9/fXx7gYSFhoaEhYSDh4eGhoaFhIaJhoKGhIaGhoWFh4aHiIiGhYiHiYeGhoeFhIaFhYeFhIeDhIWEiIaGh4WFhIKGhYaFh4aHhIaGhoWFhoODg4WBgIGAgISAg4B8gYB+foKAfYB/gXx/fH1+fX57fn18fHl6enl6fX15ent7fHt8e3t6e319fH18fn5+e3t7fX59fIiGhYaGhoSFhYSFhYSDgoKAgoGAgICDgX5+foB5en2Ag4OEh4WEg4OHhoOEhYSChYiFgoSDg4WFhYWHh4aIiIaFiIeJh4aFhoWDhoSFh4OEhoSEhYSHhoWGhYaEg4aFhoaGhoaEhYaGhYWGgoKDhH9+gICAgX+DgHuBf31+gn5+gH6Afn99fX59f3t/fXt6eXp6eXp8fXl6ent7enx6e3t7fH19fXx/fn18fH1/fnx7iIWFhoaGhoSFhIWDhYKBgICAgYB+f4KCfX1/f3t/f4KDg4WGhYSDgoaDgYOEgoCFh4WCg4GBhIWEhIaGh4iHhYWIhomHhYOEhIKFg4SGgoSFhIWGhIeGhYWFhoOEhYSFhoWGhIOEhYWDhYWBgYODf35/gH9/f4N/e4B9fX+CfYCBfX6Bfn19fX1/e398e3p5enp5enp8eXp6e3t7fXp7e3t7fX59fYB9fXx8fYB/fXyGg4aGhoaGg4SChYKFgYGAf3+AgH5/gIJ8fn9/foCAgYKChIWDgoGChIGAg4KBgISFhYKBf4CCg4OEhYaIhoWEhoeFh4WFgoOCgoOCgoWBg4WEhYaEhoaHhoaFgoSEg4SGhYWDhISDhIOFhICAgoJ/fX1/fn6Ag357f3x8gIF9gYB9fYN8fn59fX57fnt7enl7enl6ent5enp6e3t8ent8e3t+fn1/gXx9fHx9f4B+gIaEhYWEh4SDg4KGgoOAgYB+fn+AfX9/gnx9f39+fn+BgYKEg4KBgYKCf4CBgoCAgoWEgoB/gIGCgYOFhYeFhISGhoSFg4WBgoGBgoGCg4GChISEhYWGh4eGhYSDg4ODhIaFhIGDgoOChIODgH+AgX59fH5+fH+DfXx+fHyBgH6Cf31/gnx/fn19fXx8e3t6enp6eXt6enp6enp6e3x5e317fH5/f4GAfX59fX1/gICAhoSEhYSFgoOCgoSCgoCBgH59fn9+fn6AfX2Af35+foGBgoODgoSHgYF+gICBf3+ChIOBf35/gIJ/goWEhoSCg4WFgoSBg4CBgIGBgYKBgIGEg4OGhYWHh4WEhIWCgoKDhYSCgYGBgoCFg4F/foB/fnx8fn18foN9e358fYF/gIN9fYCBf35/fXx8fH17e3p6enl5e3l6enl6ent7e3p7fXx8f3+BgoB+gH+AgH+AgYDKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzNzc3Nzc3Nzc3NzczMzMvLy8vLy8vLy8vLy8vLzMvLy8vLy8vLy8vLy8vMzMzMzM3Nzc7Oz8/Pz9DQ0NHR0dLS0tLS0tLT09PT0tLS0tLS0tPT09TU1NTU09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tLS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1dXV1NTU1NTT09PT09PT09PT09TU09PU1NTU1NTU1NTU09PT09PS0tLS0tPT09TU1NTU1NPT09LS0tLS0tLR0dHR0dPHhnNlYFtLWWdVTUZIQD03Nzg5Nzw8PDo8Oz42Oj04PDs6OTg3ODs7Oj87PTs8PD47P0E/QkJBQ0RFREE+PTw7QENDQUBDQ0FBR0hHSUtSwtXS09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXVysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMy8vLy8vLy8vLy8vLzMzMy8vLy8vLy8vLy8vLzMzMzc3Nzc3Oz8/P0NDQ0NHR0tLS0tLS09PT09PT09PT09PS09PT09TU1NTU1NTU09PT09PT09PT09PT09PT1NTU1NTU1NTT09PT09LS0tLS0tLT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1NTU1NPT09PT09PT09PU1NPT09TU1NTU1NTU1NPT09PS0tLS0tPT09PU1NTU1NTU09PT09PS0tLS0tLR0dHSzIxyZ2BcTVllUktHSz87Mzc4Ozg5Pj05PDpBOjs9Nzs8PDo6Nzg6Oz0/Oz88PTw/Pj9BPUFBPkNDREJAQT46Oz9DREFDRERCQklHSEhJTr7V0tPT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1crKy8vKysrKysrKy8vLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzMzMzMzMy8vLy8vMzMzMzMzMzMzLy8zMzMzLy8vLzMzMzc3Nzc3Ozs/P0NDQ0NDR0dLS0tLS09PT09PT09PU09PT09PT09TU1NXV1dTU1NTT09PU1NPT09PT09PT1NTU1NTU1NTU1NPT09PS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1tbV1dXV1dTU1NTT09PT09PT09PU1NTU09TU1NTU1NTU1NTT09PT0tLS0tLT09PU1NTU1NTU1NTU09PT09PT0tLS0tHR0s+Sd2hfXk9XZ01LRkw9ODc2NTk5OTw+OT88RDo7PDc5PD07OTc5Ojw9QDs+PT47PD48PT5BQD5EQ0NDP0E9Ojs9QkNFQ0NEQT9FSEpJSky61dPT09TU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8rKysvLy8vLy8vLy8zLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMzMzMzMzMzMzMzMzMzczMzMzMzMzMzMzMzMzMzc3Nzc3Ozs/Pz9DQ0NDQ0dHS0tPT09PT09PT09TU1NTT1NTU1NTU1NTV1dXU1NTU1NPU1NTU09PT09TU1NTU1dTU1NTV1dTU09PT09LS0tLS0tLS09PT09TU1dXV1dbW1dXV1dXV1tbW1tXV1dXV1NTU1NTT09PT09PT1NTU1NTU1NTU1NTU1NTU09PT09LS0tLT09PU1NTU1dXV1dTU1NTT09PT09PT0tLS0dHRmn5nYWJOVWpKSElLPzw6OTM3Njc3PTs+OT06Ojo4ODo7Ozg4Ojs7PD46PT09Ojw/PD0/QkA/Q0RDRD5APT08QENEQ0JEQkQ+REhJSUtMttfT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3MzMzMzMzMzMzMzMzNzc3NzczMzMzMzMzMzMzMzc3Nzc3Ozs7Pz8/Q0NDQ0NHS0tLT09PT09PT1NTU1NTU1NTU1NTU1NTV1dXV1NTU1NPT1NTU1NTU1NTU1NTU1dXV1NXV1dXV1NTU09PT09PS0tLT09PT09PU1NXV1dbW1tXV1dbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1NTU1NTU1NXU1NTU1NTT09PT09PT09PU1NTU1dXV1dXV1dTU1NTU09PT09PS0tLR0p+DaV9kU1hsSEhIS0A9Nzg0NzY6Oj87RDw8OTw8OTg6OTo6Ojs8Ojo7OT49Pjk9QDs/QUFCP0JCQUM9Pz8+PEBCRUNDQkBBO0ZJR01MSbLY09TU1NTU1NXV1dXV1dXV1dXW1tbW1tbV1dXW1svLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzM3Nzc3Nzc3Nzc3Ozc3NzczMzMzMzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc3Mzc3Nzs7Ozs7Pz8/P0NDQ0NHS0tLS09PT09PT09TU1NTU1NTU1NTU1NTV1NXV1dTU1NTU1NTU1NTU1NTV1dTU1dXV1dXV1dXV1dTU1NTU1NPT09PT09PT09PU1NXV1dbW1tbW1tbW1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTV1NTU1NXV1dXU1NTU1NTT09PT09PT1NTU1dXV1dXV1dXU1NTU1NTT09PT09LS0tSjiGxfZlJWakdIR0lBPjM2Njo7PDhDPEJBPjxBPDg5Ojw6Ojw8PDk8PTo7PD09PD89QD9AQT9AQUBCPD4+PzxCQ0NDRkBBQT1ISklOTUeu2NPU1NTV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbMzMvLy8vLy8vLy8vLy8vLy8vMzMzNzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzs7Ozs7Oz8/P0NDQ0NHR0dLS0tPT09PT09TU1NTU1NTU1NTU1NTU1NTV1dXV1dTU1NTU1NTU1NTU1dXV1dTV1dXV1dXV1dXU1NTU1NTU09PT09TU1NTU1NXV1dbW1tbW1tbW1tbW1tbX19bW1tXV1dXV1dXV1dXV1dTU1NTU1dXV1dXV1dXU1NTU1NTU09PT09PT1NTU1NXV1dXV1dXV1dXV1NTU1NPT09PT0tLWroprY2VSWGhMSkdJQjg0OTQ6Ozo5QDk/Q0VAPDw5OTk9Oj07PDw6PTw7OTw9Ozs/PUA9PT5AQD9CQT5APD05QERDQkFBQj48SEpLTU5IqNnU1NXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbWzMzLy8vLy8vLy8vLy8vLy8rKy8vLzMzMzMzMzMzMzM3Nzc3Nzc7Ozs3Nzc3Nzc/Pz8/Pz8/Pz8/Pz9DQ0dHR0dHR0dHR0dHS0tHV2djY2NnZ2dra2tvb29vZ2dnZ2dna2tra2tra2tjW19fX19fX19jX19fX2Nzd3d3d3d3d3d3d3d3e29fY19jX19fY19bX19bX2tra2tra2tra2trb3NzX1dXV1dXV1dXV1dXW1tbX1tbW1tbV1dXV1dXV1dXV1dTU1dXV1dXV1dXU1NTU1NTU1NTU09PU1NTU1NXV1dXW1dXV1dXV1dTU1NTT09PT09PS1bqKa2hoUlhlSUlMT0A5OTo0O0E8Nz05QUM+QD89ODo6Ozk9Oz4/Ojs8PDo7PDo7Pj1APT8/P0FAQUE/QTw8Oz5BRENBREA9PElJSk1ORqPa09TV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbW1szMz9DPz8/Pz8/Pz8/Pz8/W3t3d3t7e3t7e3t7e3t3S0NDQ0NDQ0NDQ0NDQ0ci5ubm5ubm5ubm5ubq6t6WkpKSkpKSkpKSkpKSnhmBjY2NjY2NjY2NkZGRlhIuKioqKioqKioqKioemuri4uLi4uLi4uLi4ubN4c3Nzc3Nzc3Nzc3NzcJK7uLi4uLi4uLi4uLi5sIqKioqKioqKioqKiouHvebh4uLi4uLi4uLj4+Pi2NfX1tbW1tbW1tbV1dXV1dXV1dXV1dbW1dXV1dXV1dTU1NTU1NTU1NTV1dXV1dXW1dXV1dXV1dXV1NTU1NTT09PT09XDkXFrak5TYkxMVk48Ojo3Nz5DPjg+Oj8/QTw/QDc7Ojs7PTs+Pjo7PD48Oz07PT8+QDw/Pz1AQEBBPj88PjxAQUVCQkZAQD9HSEpLT0ae2tXV1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19fMzNDS0tLS0tLS0tLS0tLR3uzr6+rq6urq6urq6uvp1dLS0tLS0tLS0tLS0tTEqaqqqqqqqqqqqqqqq6aGhIWFhYWFhYWFhYWFik4MEhISEhISEhISEhIRE0pUU1NTU1NTU1NTU1NPg6ejo6Ojo6Ojo6Ojo6WZMikrKysrKysrKysrKiVhqaSko6Ojo6Ojo6OjpZVTUlNTU1NTU1NTU1NTS6ry6+vr6+vr6+vr6+vr6dnX19fX1tbW1tbW1tbW1dXV1dXV1dbW1tbV1dXV1dXV1dXV1dTU1NTV1dXV1dXW1tXV1dXV1dXV1dXU1NTU1NTU1NPUy5h2bGlKTl9NUlVNPjw8NztAQz42Ojc+Pjs9Qj85PDk9Ozw6PD07PTs9Ozs9PD0+PT07QT08QUBBQT08Pzw7QEJDQURFPUFAQ0ZLS09GmNzV1dXV1dbW1tbW1tbW1tbW1tfX19fX19fX19fXzMzR0tLS0tLS0tLS0tLS0d3q6enp6enp6enq6unq6dXS0tLS0tLS0tLS0tLUxaqrq6urq6urq6urq6yoiIeHh4eHh4eHh4eHh41SEhgYGBgYGBgYGBgYFxpOWVdXV1dXV1dXV1dXU4WopKSkpKSkpKSkpKSmmzgvMDAwMDAwMDAwMDArZaqlpaWkpKSkpKSkpKaXV1dXV1dXV1dXV1dXV0+r8erq6urq6urq6urq6unZ19jX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dXV1dXV1dXU1NTU1NTU1NGcenFpSlRdT1JVTkQ+Pzs+QEA4Ojs4PDs7PD86Ozs4Ozk5Ozw7Ojw5Ozs8Ozo9PT0+PUE/Pj8/Pj08PT88PEFBQ0FERTw+QEVGSktNRpPc1dXV1tbW1tbW1tbW1tbW1tfX19fX19fX19fX183N0NLS0tLS0tLS0dHR0dDc6Ofn5+fn5+fn5+fn5+bV0dLS0tLS0tLS0tLS08Wtrq6urq6urq6urq6vq46NjY2NjY2NjY2NjY2SXSInJycnJycoKCgoKCcpWmNiYWJhYmJiYmJiYl6MrKmpqampqampqampq6BFPT4+Pj4+Pj4+Pj4+OW6vqampqampqampqamrnGJhYmJiYmJiYmJiYmJbr+/p6enp6enp6enp6enn2djY2NjY19fX19fX19fX19fX19bW1tfX19fW1tbW1tbV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbV1dXV1dXU1NTU1NTWo3txZElbYE5OVU9AQT89REI/Oz06OTs6PT07PDs6OTg5OTs8Ozw8Ojo7PDo7QD08PTxAQTxBQTs7PEA/PD1CP0RDQ0U8PkJERkpMTEWN3NXV1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjNzc7Ozs7Ozs7Ozc3Nzc3Nzs/Pz8/Pz8/Pz9DQ0NDQz87Ozs7Ozs7Oz87Oz87NzMzMzMzMzMzMzMzMzMvJycrKysrKysrKysrKysfCw8PExMTExcXFxsbGxsvMy8zLzMzNzMzMzMzLz9HR0tLS0tLS0tLS0tLRysrKysrKysrJycnJycnM0tHR0tLS0tLS0tLS0tDNzc3Nzc3Nzc3Nzc3NzdTY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NfX19fX19fX1tfX19fX19bW1tbW1tbW1tXV1dXV1dXV1dbV1dbW1tbW1tbW1tXV1dXV1dTU1NTU169/cF5GXmJQUVdOR0ZDQ0lBPz07PDo8OEBCPD04Ojo4OTg7Pzs8PDs7PDw8PD87PD46Pj44PkI8Pj1BPjw+QkBERUNAPD5APkNJSUtEh9zV1tbW1tbW1tbW1tbX19fX19fX19jY2NjY2NjYzs3Nzc3Nzc3Nzc3NzdHNzc3NzczP09LSzs3P0s7Ozs7Ozs7Ozs/Rzs7Q09DO0tTV1NDPz8/Pz8/Pz8/Pz8/P0NDQ0NDR0dHR0dHS09PU1NTU1dXV1tbW1tfW1tbX1tfX19fX19fX19bW1tbW1tbW1tbW1tbW1tjX19fX19fY19bX19fX1tbW1tbW1tbW1tbW19fW2NjY2NjZ2dnZ2dnZ2dnY19jY2NjY2NjY2NnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjX19fX19jY19fX1tbW1tbW1tbW1tbW1tbW1dbW1dbW1tbW1tbW1tbW1tXV1dXV1NTV1di4gm9XSl9jUlFaS0hBQTxCPT07Oj4+PD4/PT0/Nzk6OTk3OD48PD47Ozw7PDs/PT0+OTs7OT0+P0A+QD07OkI/QkNCPz0+QD5CRUdKQoDc1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2M7Ozs7Ozs7Nzc3Nzsqfys3Nzc3QuYOEi8fTwJrLz87Ozs7OztHBp9HSuY++1JyChIrGz87Ozs7Ozs7Ozs7Oz8/Pz8/P0NDQ0NDQ0NDR0dHR0tLT09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbV1dXV1dbW1tbV1dXV1dXV1NTU1NXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NfX19fX1tbW1tbW1tbW1tbW1tXV1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXYwIBuVU9gY1dZW0xMQ0A9PTs9Ojw+Qj5CQ0A8Ojg5ODo6Ojc7Pz4/PDw7PDo5Pzw8PTg5PD9BPj09PUFAPTtBQkBCQz47QD9BQUlHSkF629bW1tbW1tbX19fX19fX19jY2NjY2NnZ2djY2dnOzs7Ozs7Ozs7OzdKpj63Rzs7Ozpu3tqSiwJOerNPOzs7Oz8/RnY/DwpSwnLGWuLmvodLOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0dHS0tLT09TU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dbW1tbW1tXV1dXV1dXU1dXV1dXV1dXW1tbW1tbW1tbW1tfX19fX19jX19fY2NjY2NjY2djY2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2dnY2NjZ2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV18h/b1pTYWVeXVxPSkQ9QD8+Ozc6Pjk/RD5BOTg3ODk7Ozw4OT89PTw9PD47OkE7OTs5OzxDQDw7PT5AQT49QkQ/QkM9PT8+Pz5ISUg/ddrW1tbX19fX19fX19fX2NjY2NjZ2dnZ2dnZ2dnZzs7Ozs7Ozs7Ozs/Inrym0tDQzsqgl36Cw6abr6fUz8/Pz8/Tuq+qvqSgi5HDk31+r7DSzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dLS0tPT09TU1dXV1dXV1dXV1dXV1dbV1dXV1dXV1tbW1tbW1tbV1dXV1dXW1tbV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2djY2NjY2NnZ2dnZ2dnY2NjY2NfX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dbV1dXV1dfNiHNdWGloXl9gT0lGOkFAPj88PDo2P0JAQzo2NDc6Ozo8Ojk+PD49PTs/PTxBPjw8Ojw8PTw6PEA9QEI+PkFCPUNDPT0+Oz9BRUtIQHDZ1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2c/Pz8/Pz87Ozs7SrKWnqdXAvNLHnY+ey9PJipmq1M/Pz8/P05+xm7ibh5261NLNnp7D0M/Pz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0dHS0tLS09PT1NTU1dXV1dXV1dbW1tbW1dbW1tbW1tbV1tbW1tbW1tbW1dXV1dXV1dXW1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnY2NjY19fX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0JB1W1tqaWFeXVNOSTxDQEE+QD46OEZBP0M6NzQ5Ojo5Ozs4Oz0/Pj49QT08P0A9Pjw8PDw8Oj1AQD8/PT5CQD9AQkA8QD0+QUVLRz9r19fX19fX19fX2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnPz8/Pz8/Pz8/QzJ2Nl6zQmpfKxZ6ynpbN1q2ZqtTPz8/P0cCciZuwm5CfoNLTwKCg0M/Q0M/Pz8/Pz8/Pz8/Pz8/P0NDQ0dHS0tLT09PT1NTU1NXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX19fX19fY19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tKUcl5ea2tqZV1PTEc/RENDQDo9OzxCPD49OTY0Ojk5Ojo5Nzs/QDs8PUA8PEE+PD07PTw/PDo8Q0A+PTs9QD5CPkBBPkA9QD9GSUQ/ZtXX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2traz8/Pz8/Pz8/P07GigJuvyaCjv8qcpYynrdiqmarUz8/Pz9SjooGeqquvkaG516+iqdTQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1NXV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dbW1tXW1tbW1tbV1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbSk3BgXnBoZmVaUUhHQkVDQEA3Ojo8Pjo8OTc2NTk6Njo8Ozc8QEA8Ojo9Oj0/Pj08OUA8PDo6OT9APj08PUBBQz9APz5BOz9ARkpCP2LS2NfX2NjY2NjY2NjY2dnZ2dnZ2tra29vb29vb28/Pz8/Pz8/P0M6fkGyclteqo9PSrqa1mJ/Vqpmq1M/Q0NHEn4F7mZaimq2bqdijobrU0dHR0NDQ0dHQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1dXV1dbW1tbX19bW1tbW1tbW1tbX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfW1tfX19jY2NfX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX1tbW1tbW1tbW1tbW1tbX19fX19fW1tbW1tbX0pNuYFxxZGdkWlVKQENGQ0FCODs/PD07PDw4NTU4OTY4Ozo5PDo+Pzw9PTk8Pz49Ojo+OTw6Ojg+Pzw9PTw+QEFDQT48PDpCRERKRkJd0NnX19jY2NjY2NjY2dnZ2dna2trb29vb29vb29vPz8/Pz8/Pz9G9n8O31pfA09HQ0srSzZeb1KqZq9XRz9DVq6+8wNGFlabFmKLRnp/J0tHR0dHR0dHR0dHR0NDR0dHR0dHR0tLT09PU1NTV1dXV1tbW1tfX19fX19bW1tbW1tfX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19fY2NjY2NjY2NjY2NjY2djZ2dnZ2dnZ2dnZ2dnZ2drZ2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fX19fX19fW1tfX1tbX19fX19fX19fX19bW19GRbF1cb2doYl1PRkBISUdFQDw8Pj48PT48NzU2Ojk2OTs6Ojs4QD86PDw5PD49Ozs6Pzk/Ozs5PT49PTs7PTxAQ0I/Pz47Q0ZGR0hEWc3a2NjY2NjZ2dnZ2dnZ2dna2trb29vb29vb29vb0NDQz8/Pz8/Pz5V+e6WS1KKa08ySl6ObodirmavV0pem1cmHf4WfoJ+cm5utx5+h0tHR0dHR0dHR0dHR0dHR0dHR0tLS0tLS09PU1NTV1dXV1tbW19fX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tbX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2tnZ2dnZ2dnZ2djY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX1tfPjGRWXnBrXGBgTkVITUlJT0M+OkI9PUBCOzU0Nzw6Nzo7Ojo7OT09OTo6OT0+Pz07OT47PDo8Ozk+PD47PD0+QENCPz5BPEFDR0ZGRVXJ29jY2NnZ2dnZ2dnZ2dra2tvb29vb29zc3Nzc3NDQ0NDQ0M/Pz9DR1aeZrcmjqL7KnbGdo7XZqZup2LirocbT09WcmMOnq6SexbSkptbS0tLS0tLS0tLS0tLR0dHS0tLT0tPT09PU1NTV1dbW1tbX19fX19fX19fX19fX19fX19fX19bW1tbW1tfX19fX19fW1tbW1tbW1tbX19fW1tbW1tbW1tbX19fX2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2djY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fX19fX19fX19fY2NfX19fX19fYzYZdV2JvZE9dVEtIRlNRS0xAPj1EPD9DRj01NTc7OTY6Ozo8PTo7Pzo6OTg6PT0/Pjs/Oz49Ojs5Pjs9PD0+QURCQD8+PzxAQUVHRURSxdvY2dnZ2dnZ2dnZ2tra2tvb29vb3Nzc3Nzc3NzQ0NDQ0NDQ0NDQ0NO5gL3Tm5bP1LWLkZ/T1LyBu9TOlKDS0dLXqIfNzZKQp9e5g7/V0tLS0tLS0tLS0tLS0tLS0tLT09PT09PU1NXV1dbW1tfX19fX19fY2NjY19fX19fX19fX19fX19fW1tbX19fX19fW1tbW1tbW1tbW19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2tnZ2tra2tra2tra29ra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2NfX2ct+WlVqaltMX01KTEpVTEZCPD0/R0ZIS0g9NjU3Ojk3OTo7Ojw9OT45OTo4Oz0+PkE+PTk8PDo9Pj46PTk5Oj9FQUA+PT8/QkBHRURFUMHc2dnZ2dnZ2dna2trb29vb29vb3Nzc3Nzc3dzc0NDQ0NDQ0NDQ0NDQ0cHR0crI0tDUxLjS0tHSwtLQ08fM0tHR0s/F1NTLvdXS0cLT0tLS0tLS09PT09PT09LS0tPT09PU1NTU1NXV1dbW1tfX19fX19fX2NjY2NjX19fX2NfX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29va2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2djY2NjX19fX19fY2NjY2NjY2NjY2NjY19rHd1xSZ2laTlpOTFBRV0VKPz89P0FFTExBPjc3NTs4ODk5Ojs8Pjw+ODo6OTs+P0A9Pj46NTo6PD0/Ojs5Ojw+QkJAPz8/P0FCR0RDRE683dnZ2dnZ2dna2tvb29vb29vb3Nzc3Nzc3d3d3dDR0dDQ0NDQ0NDQ0NDS0NDR0dDQ0dPU0dHR0dPR0dHS0tHR0tLT1NLS09XT09PV0tLS0tPT09PT09PT09PT09PT09PU1NTU1dXV1dbW1tfX19fX2NjY2NjY2NjY2NfX19jY19fX19fX19fX19fX19fX19fX1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tvb2tra2tra2trZ2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2trZ2tra29ra2trZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjbwXNYVWlrU0xSTlBSWVRGSTw+Qz9BQkVKPj43ODY5Nzc4OTk7Oz0/QDw9ODk7Ozs/Pjw8OTU6PT47OTk6PD8/P0JCQT1BPUBBQkZCQkJLtd7Z2dra2tra2tvb29vb29vc3Nzc3Nzd3d3d3d3R0dHR0dHR0dHR0dDQ0NDQ0NDQ0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tPT09PT09PT09PT09PT09TU1NPT1NTU1NTU1NXV1dXV1dXW1tbX19fX2NjY2NjY2NjY2NjY19fY2NjX19fX19fX19fX19fX19fX19fX19fW1tbX19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2NjY2NjY3LxvVFRsbExLUkpUUlVLRkQ6PkdEREFERjw/ODk6OTU5OTo3PD07PkA9PTc5Ojs5Pjs5OTY2Oj1AQT47PDk6Pj9DQT4/Qj0+QkNFQkFCSrDe2dra2tvb29vb29vb29vc3Nzc3Nzd3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0tLS0tLS0tLS0tLS0tLS0tPT09PT09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1tbW1tbW19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19fW1tbW1tfW19fX19jY2NjY2NjZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2dnZ2dnY2Ny2a1NbcGtLVVdSXFFXSEQ+PEJKRT1ISj89PDc4ODo1OTg5Njs+PD1APDw1OTk8Oj87OTg0ODw9PUFBPD47Ojw+QD89PkE9PUNGR0I/Qkmq39ra29vb29vb29vb3Nzc3Nzc3N3d3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHS0M/U0M7P0tLT0tLS0tLS0tLS0tPT09TU1NTU1NPU1NTU1NTU1NTU1NTU1NTV1dXV1dXV1dbW1tbW19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19jY2NfX19fX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dndsGRTYXJfT1pUV19RUkdCPUVJTEFBTEQ/Pzs6ODg5Mzg2ODY5Pj0+Pz06Njo7Pjs9PTo5Njg6PTtAQDxAPz0/P0I+PD48PEJFR0lCPkNJpODa29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3t7S0tLS0tLS0tLS0dHR0dHR0dPT0bm7zLqbnLrQyNPT0tLS09PT09PT09PU1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2NjZ2dra2tra2tra2tra2tra2tra2tra2tra29va2tra29va2tvb2tra2tra2tra2tra2trb29vb29va2tra2tra2tra2tra2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ3qpfVWBuW1VZUVpeT0xHQ0ZNSUZEREo7QUE7PDg4NjQ4Njk4Nzw/QT89Ojc8Pz48Pz87OjY4OD09QEE9QD5BQD1AOjs6Pj1BRUdJQkBDR57h29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e0tLS0tLS0tLS0tLS0tLS0tO+wMqaoKKViJGeqpOpz9TT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fY2NjY2NnZ2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dna2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2tvb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2d6iXFVeblheXU5aUFROQ0NMSUlJRkpEPEJBPDs4NzY3OTc3OTk9P0E/PDo5QD88PkI/Ozg3NzY9Pz9APUBBPz88PTs7OD48P0VJSEE/Q0aX4dvb29zc3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3tPT09PT0tLS0tLS0tLS0tTIlZyum5m1iX2TjIKBhMTV09PT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tvb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dndmlpYYW5ZYVdPV01QRUJETElNS0ZJRT5CRDk4ODY3OTc1Njk4PT1BPjo4OT4+PD9APzw1Njc2PD4/PjtAQEA/Pj4/Pjs/PkFCRkdCQENIkeLb29zc3Nzc3d3d3d3d3d3d3d7e3t7e3t7f39/U09PT09PT09PT09LS0tLTz6h+kayPko6MhoCIiYSQo8rU09PT09PU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY19jY2NjY2NjY2NjY2NjX19fX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2tra29vb29ra2tra2tra2tna3JJaWWNuWlpSVV5QTDxAR05IUklIRT47SEY4OTc1Nzg3NTg5ODs+Pj07ODlBPj1AP0E+NzU5Njs+QUI/P0BAQkI/Pj8+QUBEQUZIQj9FSozi3Nzc3Nzc3d3d3d3d3d3e3t7e3t7f39/f39/f1NTU09PT09PT09PT09PWtaWaiIuQhYCFi4iBg4qLf4bC1tTU1NTU1NTV1dXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2dnZ2dna2dra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29ra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb2tra29uIWltnalxYTFpfVkg6TEhMSkpDRUZDQExINzo3Njc4ODU4Nzg5PDw7Ozk4QD89Pj8/PDY3PDQ3P0JCQUBAPz8/QT09P0A+QEBGRT09REuI4tzc3Nzd3d3d3d7e3t7e3t7e3t/f39/f39/f39TU1NTU1NPT09PT09PUxZKCg4WGfYGCfXx5foGCg36k29bU1NTU1NTV1dXV1dXV1tbV1tbW1tbW1tfX19fX19fX19fX19fX19jY2NjY2NjZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vc3Nzc3Nvb29vb29vb29vb29vb2tra2tra29vb29zb29zb29vb29vb29vb29vb29vb29va2tvb29vb29vb29vb29vb29vb2tvZgFpebWhaU0ldW1hKRE1ISlNMR0ZBQD9KQjg7NjY5OTc1ODY4Ozo7Ojw5OD09O0A9Ozo2NTw3Oz1CQEFBPD49QEE9PEA/Pz5CREU+PERLg+Lc3d3d3d3d3t7e3t7e3t7f39/f39/f39/f39/V1dTU1NTU1NPT09PT2LKEkKh9g3l2hIh/e3d5gn5+i67A1dTU1NXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dna2trZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2tra2tra2trb2tra2tvb29vb29vb29vc3Nzc3Nzc29vb29vb29vb29vb29va2trb29vb29zc3Nzc3Nvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc1nlcWmxmWFJPYFFSQUhHSkZYTEZAQENDSz87Ozc4ODc2NTc2ODo5PDw6PTs/PTs9Pjw7ODg8OT0/QkFCQzw8P0FCPj1BQkNCREVDQDtDTH3h3d3d3d3e3t7e3t7e39/f39/f39/f39/g4ODg1dXV1NXU1NTU1NPU0ruen3WKeXuIgICChYGDcnOAhYOMrNfV1NXV1dXW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NnZ2dna2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra29vb29ra2trb3Nzc3Nzc29zc3Nzc3Nzc3Nzb29vb29vb29vb29rb29vb29vb29zc3Nzc3Nzc3Nvb29zc3Nzc3Nvb29vb29vb29vb29vc3Nzc3Nzc3Nvb29vb3dByXV9wZVdLUGNPS0JHQ0pIS0ZBPEE9SFBBOjo3Nzg3Njc4Nzw6OD09PD47QD88Pz07Ojs5Ojk8QEJAQkNAPUFAPz1AQkNDQUBAP0A7RU144N3d3d7e3t/f39/f39/f39/f3+Dg4ODg4ODg4NXV1dXV1dXV1NXU18h4i4V8goh6g4SBfoKCc2l0hYuGkJ3U1tXU1dbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tvb2tvb3Nzc3Nzc3Nvc3Nzc3Nzc3Nzc29zb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb297KalxjcWVST1heSz9HTElPS0VAPkFCP0lPPjk6NzY7NzY6Ozc7Ojg6PDw+Oz09Oz48Ojs4OTo4OUFCQkFAQDtAQj06PkFCQz8+PT4/PUZOdN/e3t7e3t7f39/f39/f4ODg4ODg4ODg4ODg4OHV1dXV1dXV1dXV1s6dhpl+f5OTin+CgXx9gnNxm4mAgoOJwNnat7TQ19bW1tbX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tra2tra2tra2tra29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NvfwGNaW21gVlBTU0pETEhNSEk8PkFEQ0ZORDw8OTc5OjY4Ozk3PDk4OTw9OzlAPjpBPzw3NTc7ODpAQUVBPz45PUI/Oz1CQkI6Pj07PT5GTnHe3t7e3t/f39/f39/g4ODg4ODg4ODg4OHh4eHh1tbW1tbW1tbV1tjLioCHhYOXjHh7e3lvfYF1a3ebdHZ7eInHxpiMrdjZ19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2drZ2dna2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tra29vb3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29zb29vb3Nzc3Nzc3Nzd3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3Nzc3Nzc4LdjV1lrYlJNVVFMSktGS0ZDQD5CQT9FTT4+PTg5OTo3OTo3NT03Nzo+PDs7Qjw5Pz05NjY4PTk6QEJGQD49PEBCREA9QD9DO0A9PD4/Rk9t3N/e3t/f3+Dg4ODg4ODg4ODg4OHh4eHh4eHh4dbW1tbW1tbW1tfVrYZ6d32rn3l4entzdH+Dfm9xe3l6c3t2k4qFgImkzdnY19fX2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tna2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29vb29vc3Nzc3N3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vc3Nzb3Nzc3Nzc3N3d3d3d3d3d3dzc3Nzc3Nzd3d3c3Nzc3Nzc3N3d3d3d3d3d3d3d3dzc3OGtYVtebGJSTVZMTUdLS0RGQkI7QT08RUxDQT44Ojk6Nzc5NjY6NTs+QDs9Oz89PD89Ojk5Ojw5PEVDRkA/PkBDQkQ9OT0/QT1CPz1APkdPadvf3t/f3+Dg4ODg4ODh4eHh4eHh4eHh4eHi4uLW1tbW1tbW1tfQmH+Qh4N9eoN2e3Vzenl6kKqmd3JyfoeHh4CAfoKEhJHJzNnX19jY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra29va2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2djY2NnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vb3Nzc3N3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzb29vb3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3dzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3NzhpV9UYm1iUE9TSUhHRkpJSUJBPkJCPEVFREA+ODo4Ozc3Ojc4ODY+Pz07PDk9PDo+PTs6Njc7NjpEQUY+Pz8/PkNBPzs9PT47REM/PjxIT2fZ4N/f3+Dg4ODg4eHh4eHh4eHh4eLi4uLi4uLi1tbW1tbW19jYyH52doN+fnR2eIaCenl1d5yhu6GEgoCAfoeKinx/gYaMnKjO2NjY2NjY2NjY2djY2NjZ2djY2NjY2dnZ2dra2tra2trb29rb29rb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3d3d3d3c35pbT2drXFBRUElDT0pLR0xHSkJAP0FHREBBPDg8ODg1ODk3Njc3QEA/Ozw5Pj04PTw8Ojc4PTk/RENGPkE/QkBDPzw6Pj0/PkVEPz07S1Fj1+Hf4ODg4ODh4eHh4eHh4uLi4uLi4uLi4uLj49bW1tbW19XB3LRueHJze3B6eXaFiIR7eH2AgZiljH98fnuRhZaLhoGDgY6Rvd3Z2NjY2NjZ2dnZ2dnZ2dnZ2dnY2dnZ2dna2tra2trb29va2tva2tra2trb29ra2tra2tnZ2dnZ2dnZ2dnZ2dna2trZ2dnZ2dra2tra2tnZ2dnZ2dna2tra2tra2tra2tra2tra2trb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t3d3d6NWFdobllQUUtISlNJTUhNSUtBQz9DRkJBRDo6PDg2NDg4NzY2Nj8+Pjo8OTw7Oj09PDw4Ozw7RERERT4/PkI+Qj84PT8/Q0NCQEE+O0xUY9Xh3+Dg4OHh4eHh4eLi4uLi4uLi4uLi4uPj4+PW1tbW1teslLZ6eHJvd5V7dHuLgHh1bn6Fg3t/hYhyfH2bnI6JioJ+g32Hk5rH1NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2trb29vb29vb29vb2tra2tra2tra2tra2tnZ2dnZ2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2trb2tra2tra2tra2trb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d7Zf1lgaGxcUUtHR09LTk5PTURGQkg/Q0hEREA6Ozs4NzU3Nzc4NThAPkA7PDk8Ozw+Ojk7OTk7OUZERUI8QD4/PEBDOz5AP0A/Qj8+OjtKVWPV4eDg4eHh4eHi4uLi4uLi4uLi4uPj4+Pj4+Pj1tbX19vKhYR3cXJubniVhHt4hH95dnB4c3eLkY6CdnN9ioaId3d1d4ODfIiIk8Pb2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2trb2tvb29vb29vb29vb29rb2tra2tra2tra2tra2tnZ2dnZ2dna2tra2tra2tra2trb2tra2tra2tra2tra2trb29vb29ra2trb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f0nVZaGlqVk5KSE1OR01EUElGSD9FPUZMREM+Ozs8OTc3OTY2OTU4Pj4/PTs8QDs9PDo3Ozc5OThHREVCPUE9Qj8+QDw/QUE/QEJAPjs8S1Ri1OLg4eHh4eLi4uLi4uLi4+Pj4+Pj4+Pj4+Pj49fX19fEknuJf29sbnV2foSBg4qGfnVybWVtiIaKjoR7c4OHint4e4OPj4GEioqxztrZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29zc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tvb2tvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3dzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f3t7e4clsW2pqalNOR0dOT0VIRk1JSUA7RD5ISUA9PDo6Ojg2ODo3Nzk0OD08PT07ODw8PDw4Njc4OTo6RUJFQT9APEI/Q0M+PkNEQUBAP0A8PUtRYdPj4OHh4uLi4uLi4uPj4+Pj4+Pj4+Pj4+Pj5OTX19fZqXaFfnx3bHB3eXh8jH2KhYB3anN0d3p9bot7fnl6foR/gIGDfnh8foeGlrbT2tnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra29ra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/e3uO9amFpa2lRTkZNTEtKWE1OR0FAQE9BQz9AOzw4OTk5Njg2NjY4NDs+PD07OTY6Ojk6OTU4OTg5OkJERj8+Pj5AQEBCPzxBQD88Pj9BOT5KT17S4+Hh4eLi4uLi4+Pj4+Pj4+Pj4+Pj4+Tk5OTk19fX2sqKhIB5c29tcXN1d4CUeHaAfHWHhXd1cnWgmXp7d3Z5doR0bWxue3iAmouTu9za2tra2tra2trb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc29vb29vb2tra2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f397js2lpbmloUFBPTExPUk9LU0Y/RURERD48PDg7ODc5OTU2ODc2NzM6Pjs+PTc6Pjk5OTk2Ojo4NzxDRUc/Pzs/PkA9PkE9Oz0+OUFAQDhBTlFc0OTh4eLi4uLj4+Pj4+Pj4+Pj4+Pk5OTk5OTk5NjY2NjauY6AenZ1bmpveHCBfWt0cnZ3hIV5h4d5lY55eXp1d3pza298gHx2fYh8gLLe2tra2tvb29vb29vb29vc3Nzc3Nzc3Nzc3dzc3Nzc3Nzc3Nzb29vb29rb29vb29ra2tra2tra2tra29va29vb29vb29vb29zc3Nzb29vb29vb29vb29vc3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3t7e3t7e3d7e3t3d3t7e3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/f39/f4qpqa2hrZFNQT0ZQVFJOSFJLPkREQ0I7Ozk6Ojg2Nzg1NjY3Nzg0Oz88Pzw5PDw3Ozo6Nzo6Nzo9Q0JDPUE+Pzw5PT5BQDs8PDtFQD47Q05TXNDk4eLi4uLj4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTY2NjZ1p5vdntveHh2cG50d3BwdHBzb36Jc3qGhY2EenNtcoB6hn1vg5OBdnx9g4a13drb29vc29vc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29ra2tra2tvb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4N/f3+KgbWhma2ZVVlJHUFFOS0xMRUJIRUc9OD08Ojo3Nzg2Nzc2NTY3NDg+PD09Ojg6OD46Ozc4Nzc6Oj5DRDtDQj49OD1AQUM/Pjw+RTw+PUJNUF/S4+Hi4uLj4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk2NjY3MB2doCCfnp4eHBsdXlya399bHNvdGdoaYB/aWh4c2d+iYl4cIKGe3d9foWKvd3b3Nzc3Nzc3Nzc3Nzc3Nzc3d3c3Nzc3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODflGttZm5mU1NJUFlUTEhGTkZGRUJGPTs+PDs5Nzc4NTc5NjQ1NzU4PDs9Pjo6OztAOTs7ODc6OTlAQkE8QUE/Pzk/QEJFQ0FAQEM7Oz1ES01g1uTi4uLi4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk5NnZ2tmYc3uqhJaCcnR1dn14aGx8d2h4d25rcHR5gIN2dHyBhIJ9c3CAin94gn95g8je3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f4N/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh24tubWdzY1lRTVVbV0hDSUZOS0dCRD8/Qjo7OjY2NzU2NzY0ODc2Ozw7Pj86PDk8Qjg3OTo6Ojk6QUFCQUJDQEE+PT9CQ0NEQUJGOTg9REpOYtjk4uLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXZ2drcqHGCtXiRfnNsem6EgXaCfWtoan+DeHZ8dX2FhXRmcHl9d316gIqFe318foC03tzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3dzc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3Nzd3d3d3d3d3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e397e3t7e39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4ODg4ODg4tiFb3FrdWFWT1VVXE9ETUY+SkdKRUQ8P0I6PDk4Njg0NTY3NDc2NDk7Ozw7OD47PEE4ODo9OD04Oj09QEBAP0FCP0A+QENCQ0FBRTc2O0RMTmPa5OLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXl29ra3Z5sbnNxhY1ybXBuf391hH5rcnZ2enN4gXhzb3VwbWt2fHmFiIB/f392coODsd/c3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eDg4eHh4eHh4eHh4OLXhW1xb3ZeUldTWlpRSkhDQFFAQkQ8OT9BOjw5NzU3NDU2NjQ3NTY9PDo9PTk+OjxAODo6PDY7OTs+PUJCQjtBQkBDQEBEREM8PUA3OjxFS01l3OPi4uPj4+Pj5OTk5OTk5OTk5OTk5OXl5eXl5dPOxsB+cWxveHt2b3VuanNzbZKGeG50dG5vdIZ/b2twboJ0bXZyfY2DdnF/d3mKgabf3Nzc3d3d3d3d3d3e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3dzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t/f3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi1oZucG1xYFJZUFdfWUpMTElSP0Q9OTtCRjs6OTc0NTY1NzU0NjY2Pj07Pz45PTk7Pjg9Ozo0ODtAQENCQ0FCRkE/Q0BBQkREOz0+OTs8QkxNZODl4+Pk5OTj4+Tk5OTk5OTk5OTk5eXl5eXl5eW5t7Woc3JscHd6dHd4bXFydXd/hHRyc2xsa3F8bnBudGuBf3GAd32Eg355gHNygYqg2d3c3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh49WHcWxqbF5YWlVXYFZWUE9QTD1BOjs8RkE4Ojg3MzY1Njk2NTg1Nz89Oz8+OT04Ozw5PTs7NTo9Q0JCPENDREREQUE/PkJDQzw9Pjg5PENLS2PN0dnh1sjY4+Tk5OTk5OTk5OTk5eXl5eXl5eXltbW2q3J5cm59f3Z1d2hqaGlwb3Zta2tnZWZxdG15gG5teXd2iHhxa2podXV5dHV/wd/c3d3d3d3d3d3e3t7e3d3d3d7d3d3d3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHi4uHh4ePVhnFwY2lhV1NZV19MUk9STUtAPjg5O0E+ODc5NjQ3Nzc6NjY2NDk+Pzo8Pzo/OTo6Nzo9PDk5PEFBPTtBQ0VDRkA+Pj5BRUQ+QEE3OD5GSEpesrW4wbm1u8jg5eXl5OTl5OXl5+fn5+fm5ebm5ra2tbWOfX5weoR1cnZnYmNlbGtyb2ZpbHZtd4Z9hXlsbHd4a3ZwfH14c3V5fHd2h7ng3d3d3d3d3d7e3t7e3t7d3t7e3t7d3d3d3d3d3t7e3t7d3t7e3t7e3t3d3d3d3d3d3d7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4eHj1Yd1bl5uY1pUU1hXS1NLSk1SR0E4Ozs+PDk4NzU2NTY2OTY4NjY5Pzw6PT07Pzo7Ozk8PDs5Oj4+Pjs8PUFEQkNBQEBBP0JDPDw9Nzs+REVKXrG1tLW2t7e2y9rJ3uXl3eDi3tXU1tPU4OPg39+2treuh3t/bnmNenJ1bWNobGxtaXR4enF5enqIh4N6aWh9cWRvcXyGgX55e318e4an2t7d3d3d3d7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4uHh49aGdmxhb19dV1lcWlJQSEpXTEVHPUA9Ozs9OTY0NjU1NTg2NzY3OD87OT09PDw5OTw6Pjw6OTg+Qjs7Pj5AREBDRUFAQD0/QDw9PTU5PEJHRl2xtbW2uLm5ubq9uMPT0r3BwcC6u7y6u8TMxb/Dt7e3hGl1gX1ndYd5Z3Vxa2t5eHB3fH15bWl3e3h3bml1j4FwbHl4d3d9gXuGgnmAoNze3d3d3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODh4OHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4ePXhXJrZ3RhW1hYX15TVVVRVUpMRj9JRDs5PTY2NDc3NTc4Nzc3ODk8PDo+PDg8Oj0+OTs8OTs5P0E8PT9DP0FARUJCQTw9Q0A6Pjw1NDlER0dasbW1tre5ubm5ubm3ubm4uLm5urq6urm5urm6u7e3uX9ucHN6b3B/eXNuc3Vsc3Z4cXFwb2tvcX6Bc2mHhIF9dHOHdW11hYmBgHJ2hafd3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uHj14lxa2xyW1dXXWBUUVVUUFJPSkNATUE9Ozk2NTM0NjQ2ODc3Nzk6Pjs8Pjs5PDo8PDk8PTw7PT0+PUNEREBDQkE/QD48PkE8OD06NjY6QkpIWLG1tLa2uLm5uLi5uLe3uLi5urq5ubi4uLi6uru3uKx7cnhxf3ZzfnBsbXpyZ29sbW50cHt3d3Jyd3pvhpJ2f3x8enZ5fH9zfYdyda3T393d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4eHh4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi49eHb2pxalVWV2FbT1FSUE5XSURESUo/Ojk6NzUzNDk1NzY2Nzg4Ojw7PD46PDo6PTw5PDw9Oz09PDs9REdEQ0E8PDw8Pj5AOzg8ODE1OkFGRVautbW1tre4uLm4uLi4uLe4ubq5uLi3t7i4ubq7t7mqcnB4d3x7e4J3aG5xam9qY2lyf21zcn54dHFsanaAeX2AgH91doB1a4qLgHaR1d/d3d7e39/f3t/f3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f4N/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLi4uPYhm1sdGVWUFxnWE1YU1JRWUVDS1BOOzk4ODc1NTM5NTY2NzY4Nzk+OT0+OTw5OTw7Njg5OTo8QEA9PkBGQEJCQDo+PEE9Pzs7OzYxNjxCR0RQqLa1tba2tre4t7i4uLi4uLm6ubi4t7e3t7e5ure2tIlyd3h9iXxwem99c2hqbGdnbHRscXd0cWx2c3Fxd3FyfHl4g3Z7d2mLkYp9kM7f3d7e3tvY2drZ297f39/e3+De39/f3Nvc3N3e3uDg3+Dg4ODf3t7e39jS397f397e3t/f3t7f3t/f3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLi4eLi4uLi4uLi4uLi4uLj4+Lj4+Li4uPj4+Pi4uLi4+Lk14NoZ3VkVlVkZVdKWllXW1Q9RU1LSD04NzU3NjQzOTQ0Nzc1Njc5PTo9Pjw9PDk7PDk5Oj45PD4/PkFBQ0FFRUQ+OzxBPjw5PDs3Mzc+REhFSqG2tbW1tbW2tre4uLi4t7e4uLi3tra2tra3uLm2traLfXpsbHp/cGx5dm5qaGdlcXp4b2lvb3B1c21zd4Fnb32CgYNyf3lqcHJ6f6ng393Zy8a/vL2/vsLN0tDW3tnc4NfQzcPCw8PH1dfT2dzX1NjX0MfExce9vM/Kz87Y3djO3N3c2t3T0dze39/e397e3t7e4N/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eLi4uLi4uLf4uPi4eLg4d7W29/Sw8rJx9Hb3OLk4eHg2dre1sbExcTN2trf5OHi4trX3st9aWZxYVleZWFNTFRLUlpMO0hNSEZBPTc2NjUzNDY2NDg3NjU2OTw7Pj46Pjk5PDk3OTs7Oj49PEBAQ0RCR0ZCQT08Q0A9OTw7Nzc3P0RGRkaZtrS1tbW2tra4uLi4uLi3uLi3s7W2t7a3t7i5tba3opdxb29waW50dnFmZWNrbmdvcm1mZ2tygWVvdnyAeGRzj39zaHFyaWVlbm+w39HFv7u5ubm5ubq6uru6vc3Gw8e/urq6uru7u8HCvcHFvby/vry7urq5ubq6ubm6w8XDucDDwby/ube/z8/U3tjc3t/g3tLa4N/f4ODg39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eDg4ODg4ODg4ODh4eHh4uLi4eDh4uLi4uHa2t3RwsPCu8XT1uDdydPDrrnAsaqrq6uwtLbJ0sXRxLG4v7Srq6usr7S0vMzE1c60tLureGxtbWBdYl9ZS1NVVFFQREBRTUhEPzo3ODU3MzE1NjQ5ODQ2Njo8Oz08ODw5Njo6ODg5NzU8PDw/QEFAQkRDQkE8PkI/Pz09PTc1OD5DRUNAj7a0tLW1t7i4uLi4uLm5uLe1sautr7Oxs7OztLS0tqaei2tue3ZxeXhnY2hfcXdha25vaG99b25ja2lseHdsa4Z+bHB6dm1scG95sca8uru7urm5ubq6urq6urq6urq6urq6urq7u7q7u7y7urq6ubq7u7q6urq6urq6ubi3t7i4t7e2tbW1tbi3u8e+w8XHzcS4wMnH0tzZ2d/e3uDf39/f4ODh4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh3Nji4uLi4eHh4OHg3tfGxtHQztTe3tPO0t/SuLi8sq2trKysrrG+ua63rKipqamqq6urqqqqq6ysuKyqqqqrq6urra6urq6urryzrayrpHlub21fXl1dVE1SU1xUSkE/UElIPjg5NjgzNzMwNTczNzg1NzY2Ojw/PDg5Ozo6Ojg5OjY1OTs8Pj9EP0NFQkNCP0BAQT9APjw3ODc6QUVEP4W4tLS1tbe4uLm5uLi3t7SurKuqqq2urq6vsLGzs7WjcG5ucm1wg311aWFlaGZkY2Rxc21td25naW1tZXBzb29zcXN8h4F6dX11n7u6uru7urq5ubm6urq6urq6ubq6urq5uLm5ubm6urq6u7q5ubm5ubq6ubm6ubm4uLi3t7e4uLe3t7a2tbW2tra1tbW1tba1t7e3t7rBvrzGycrb3+Dg3tvd3d7h4tDW4uHg4ODg4ODg4ODg4ODg4OHg4OHi0768zNjd3OLg0dnbxL23sLCxsa+zu7uzsLS9s66urq2tra2sq6qqqqmpqKmpqampqqurqqqqqamoqampqampqaqqqqytrq6urq6urq6sraR4aWJxZmFZWlZRUk5cU0Y9QlJEQTc8OzY5NTY1NDU2NTg3NTY1Nzg7Pjw7OTk5Ojg3Nzk3Njg8Oz47RD8/Q0BBREE+P0M9Pjw+Ojo3Nz9DRj54srCztLW2t7i3trKurq2sq6uqqaqtraysrq+xs7S1t4xucnRqaIB5ZmpmZWxdaG5waGxxYmNmcoJ+dmhobGpueoaBhXx4cXF5gK+6ubq6urm5uLm5ubm5ubm5ubm5ubm4uLe3t7e3uLm5ubm5uLe3t7i5ubi4uLi3t7a2tre3t7e3tra2trW0tLW1tbW2trW1tre3t7e3t7e3tre4v8bP0MS+v8DE19e8ydra4OHg4ODh4eDg4ODh4eDb3t7Uzby3tre6wMDJxLfIvrKwsLCwr7Cvrq6ur7Cwr66urq6uraytrKurq6qpqampqampqampqKmpqKmpqampqKmpqKmpqqqrraytra2ur66trK2heWpkbWdiXFhRUFFLVEpCOklRP0E3PDk0OjU2NTQ1NTY4ODY4Njs6OTw9PTs6ODY2ODg6ODY3Pj09PT5BQUVCQkNBQUBBOj09Pz05Ojc9QUc8bKqmqKutsLGwrqupqKqrq6mpqamrrKytra2usLO0tbilgIdvaWdzdGZrcG1qZGxvcm5rbWNrcHyJhG5qbHx4Y3uKfnNqc25rcY+7ubm5ubm5ubi4ubm5ubm5ubq5uLi3t7e3t7e3t7i5ubi4uLe2tra3t7e3t7a2t7a2tra3tra2tbW1tba1tLS0tbW1tra2tra3t7e3t7i4uLe2t7a2uLm4uLe3uL6+uLq9vcfb4OHg2Nnd4eHg3dfKwcPCurm5uLe4uLi3tbS0tLKysbGxsLCvr6+vr6+vr6+vr66ura2srKyrq6yqqqmoqKmppqepqaehpaipqamoop+hoZyip6inqausrK2ur7Cwrq2unXhwbGphY2BZUU1RTFJGQzlNUEU+ODs3Mjc5Njc0NDM1ODg3OTc7OTo9PTw6Ojk3NDo5ODY1OD8/QEI9RENDQ0FDQEJBQDtAP0A/PDw6O0NIPWOopaWlpqioqKenp6ipqqmoqKipqqqsra6wsLCztLW1taWYdn5xZmt4cW9tZmVsaGNsZ2ZpaX11bWlvfXZ5hWZod294b3Fvcninu7m5ubm5ubm4uLm6ubm5ubm5ubi3t7W1tba2tre3t7e3t7a2tbW2tre2tbW1tra3t7e2tbS0tLS0tLS1tLS0tLW1tba2tra2t7e3t7e3t7a2tre2tre3uLe2t7i4t7i4uLi4wMXTyry8w83PyMC9urm5ubq6ubi4uLi4t7W0tLSzs7KysrGwr6+vr66urq+vr6+uraysrKurrKysq6ehoJ6gn5udoaGdlpmkpKaon5mZmZmanZ+gn56fpKqtrq+ura2srJl1cGlrY2FeXVVOU0tSREQ4TktHQTo4NTI2OTY1NDczNzc3ODk3OTo7PT0+ODg4NzU6OTk1OD9AQEFEPkZBQkNAQkNCQT88QEJCQD0+OjpERj5cpqWmpqampqanqKenqKioqKenqaurrKytra2ttLS0tbekc311bnONf3JmanFjaW1jaGZobG51aV9jZ3VzdnpuZ3Bwcn56cYihu7m5ubm6urq6urm2s7a1uLm2trW1tra1tbW1tbW3tra3tra2tbW2tbW1tbS0tLa2t7e3tbS0s7O0tLW1tLS0tbW1tra2tra2t7e3uLe3tra2trW2tbW2tra2tra2tra3tra3uLi3uri4uLi3uLi5ubm5urq6urm4t7e3t7W1tLS0s7OysrKxsbCwr66urq6urq+vra2srKuppaSmpqScmZubmpmampmXl5eXl5aZm5iZmJmZm52en5+dnJ6gpKWko6OioqKQdG5jcGFeXltUU1RIVEo/PFFCRkM7ODYzNzo1NTQ4Mzg5OTc4OTc7OTs9Ozc6NzU2OTk4NTg+Pz9ART5CPz9DPzxBQUI/PT9EQT8+PTk9Q0Y/VaSlpqanqKeoqamop6ioqKioqKiqrKuqqaipq7W1tba5o3eKcXKHhnd0cGh5a2JjYWVsaW5zal9jZWNjZWprYmRqbHaXjX6ovbm3tre5u7u6uLWxrKurqq6wrKyrq62tq6uvsLGvr7CytbW2t7W1trW1tbW1tbW2trSvr7O0tLSvra6vsrW0tbW1tbW2t7e3t7e3t7e3t7e3t7Owsra1tLa2tre3tra2tbW1tra3t7e5uLi4t7e3uLi4ubq6urq5uLi3t7e1tbS0tLS0tLS0s7OysbCvr6+vr66vr62oo6KgnJqampqZmZqbm5qampqbmpmZmZiXl5aYmZmZmpycnZ+foJ+goKChoaCgoJ+fi3RuaXRdYGZeUlRLRFRJPUVTSEVCOzo0NDY5NDQ1NzM4ODg3ODk5Ojs7Pz04OjkzNTg5NjM5PT5AP0A6QEJCQkA/QEJCPz0+QUFCPz06PkVDQFGjpqWlp6inqauqqKaoqKipp6ioqKinp6ioqaq1tbe3t7KZtH99kIx1Z2lqbGZjYGNoZW94cGlicXx5cGpmZmRma3NqhYystrKwra2ttLeysLCtrKuqqaiop6ipqampqKinqKipqaeoqqurra2sqqytraysrq6traunpaSnqqyopKOkpamwsbGztbW2t7i3t7W1tre4t7e3t7Kppaasq6ivtLa1s7W3t7a1tbW2tra3t7e3t7a2t7e3t7m6urq5uLi3t7Wxs7S0tLKxsK6sq6yurrCxsK2rqqmqqKijnJqZmJmYmJiYmZmZmZmZmpqZm5ubnJybmZeYmpqcnJydnJ2foKGhoqKioKGgoKCfnop1amtuWVxhVktPREdVRz5PV0hEPTw4MzQ0ODQ1NDgyODk4ODk6Ojw5OUA8Njk6MzY3OTE0PD8/QEBBOkNGRUJBREJDQTo7P0FCQz9APUBEQ0BPo6empaemqKqqqqakpqenqKioqKimpqaoq6uttba3t7e4rbJ1cHuDdmBiaWtiZWZhZGdmfYh5bHKAfXFvcXhjbW5xZo+srKurq6ysra6urK2trKyqp6WmpaWlpqioqKiopaeoqKioqKeoqampp6Wko6KioqOioKKioaKhoKChoaKjpKOjpaWlqLC0s7OzsKuqqaqztLa3trGopaOioaGipKiqqairs7Sxrq6xs7W2tra3uLi3t7e3t7e3t7a2uLe0sa6ppqerrKmnpqWkpKSkpKWnqaajoJ+enZycm5uampmZmJeXmZmZmJiZmpqampqampqbm5mYmpydnZ2dnZucoKGgoaOjoqCgoKCfnp2FdGtsaFdYU0pHTUVITUdAU1dGRz09OTM2Mzc0NTU3Mzg6Ojo6OTw9OjpBPDY9ODM3ODgzNztAPz9AQDpCRUNAQkRDQT87PEBDQkNBQDxBQ0A9TqKnpqanp6mqq6mkpaWlpaaoqKippqanqKmpqrW2tre3t7izc2h7c2JnamtpaWJhZGloXV1tfHJma3J/fHR8bm1zc36gqamrq6uqq62trKusq6mpqKWjpKampqWmp6eqqaamp6enqKinp6iop6WjpKKhoaGhn56en5+fn56foKGho6Wko6OkpKSmp6enpqWkpaampqeqraumpKKhoaChpKWlpaenpaeoqKalpaivtLa3trW1tra1tbOwrKupqa6rqKWlpqampaSkpaWlpqWkpKSkpaKhoaGgnp2bm5ucm5qamZiXmJiYmJiZmpmZmZmYmZmZmZqZmZydnJycnJybnJ+fn6ChoaKgoKCfnZ2cgHNrbmReU0pITUZETEtFRFFTQ0c9PDgzNjI4NDY0NjQ4OTg6Ozk7Pjw5PTs5PTczNTk2NTY8QD0/QD88P0JDPkJCQj89Pj5CQ0FFQD86PkVAO0+jpqWkpqeoqaelpKWlpKWnp6eoqKanp6alpqa1tba2trW2uYptcW1vfHxxZ2pmYGFsYFROW2hqbm9tgYJ9cWdxdn6aqKeoqqmpqqurrKqqqqimpaWkoqOlpqalpaWmqaqppqWjpKWmpqSjo6KioqKgoJ+fnp6cnJycnJ2dnJ2en6CioaKjo6KhoqKkpaSioqOjpKSjpKSko6Ggn6GipKanp6ipqaelpaSipKSlqK2wsKyrqqusqqmnpaWmpaWlpaalpqioqailpaWkpKSlpKOjpKOioaGhoqKgnp2cnJubm5qZmJiYmJmam5mXl5eWlpeXmJiZmpqcm5qampubm5ucnJ6goKGgnp6enpycm356bnJiXlNNSlBFRk5NQkBPRT5JOz01MzYzODM2Njc1Ojs4OTs5Oj49Ozo5OT03NjY5NjU2PkI+PkE/PT5DQT5DQ0BAO0BAQkJCRUA+Oz5FPzxQoKSjpKOjo6SkoqSlpaSlpqamp6empqalpqaltLW1tbS0tbiBaHx9ZXOCemxwdWFfY1ROT1FbaGxpbGxxbW5xbnScoqSnqKioqauqqqqqqaempaSjo6OjpKSlpqalp6ytqaShnp2eo6Shnp6foKCenJ2dnJycmpqam5ucnJubm5ydnp6foKChoJ+goaOioKGjpKSjoqSlpaWkop+go6SkpKapqainpaGdnJ+jpaipqainqKioqaempaWkpKSlpqampqampqenpaWko6Ojo6KioqGhoqKhoqOkop+enZ2cmpubmpqZmJeXmJaWlZSUlJWVl5iYmpubnJuampqam5ucm5ucnp+fnpucnJyam5p/fnF0YFtUTUdNSEZMSj8/TkM8QDs8NDM4Mzc0NzY3ODs9ODo6OTk7PTs7ODk9Nzc4OTU4OD9APT9BPjs9RD89REA/PzpAQUE/QUVAPjw8Qz88Tp2ioaKioKCipaSkpKWlpqenp6empqampaampbW1tbS0tLS3jHalsXdmc3Jvc2xjZGlYT1JRT09dgG1kYFptkZGSoqKjpaampqenqKiop6alpaSjoqGhoaKjpaempqesrKemoJ2cm6Ghnpuamp2cmZiam5qampmZmZubm5uampqampucnZ6goaCfnp+hoJ6foqOko6Omp6inqKWioKGhoaGkpaWlpKCcmZmbnqOmpqampqanpqempaOlpKWlpqiop6enpaWlpaWkpKOjo6KhoqKioqKhoaKjo6Kgn56enZybnJubmZaUlJSTk5OTk5SUlJWWl5qam5ubm5qZmZqanJ2dnZ2dnZuampqamZqXf3dvc11aTkhKTkdFRklERU5APD09PDQ1OzQ2NDY1Njc5Ozg5OTg5OTw7PDc6Ozc4ODg1ODg/Qj9BQTw+P0A8PEJAQT49QT4/Pz1CQUA6OkA8PE+doqGfoJ+dn6OkpKSlpqeoqKenp6ampqampqW1tLS0tLS0tbSXtqd1Znh2Y2xjY2VjW1JTU1JNXqCMeFhodpajnp6hoaOjo6OjpKSlpqalpKSioaGko6OjoqOlpqWmpqenpp+bmpuioJmWlpWam5mXl5iYmpqYmJqampqbm5qZmZmenZ2goqOjo6KkpKWinqGhoaKjpaampaSjoaCgn5+hoZ+goJ2amJeZmpygpKOjpKWmp6alpaOjpKSkpKWnp6ampqampaWmpKOjo6SjoqKjpKGfoKGhoKGgoaCfn56dnZyamJeVk5KSkpKSkpOTkpOUlZaZmpqbm5qampqbnZ6enp2cnJybm5qamZmZlH10bHReWk9IRUdGQkVORT9GOzo+Pzs0Njo2OTM2NDY4ODo4OTc4ODo8Ozw5Ozs6OjY3ODk5Pj9APjw9QD5AOjlAQT89QT8/QUE+QUE/Ojk9PjpQnaCfnZucnJufoqOlpaWlp6iop6ampqanpqantLS0tLOysrGwsK2rkHiGj36bmn93Yl1TUlFRTGKgootaiKCgn52YmZycnZ2eoaGgpKenpqWkoqGjp6alpaKipaampaanpqagm5mboaCXk5OSl5qcmpeXl5iampmampqam5qYmJmaoKCgoKGfoaKipKamop6gn5+goaOko6Khn56enpyanZuZmpqZmJeZnqChoaKioqKkpaWmpKSkpKKioqKkpaWlpaWlpaalpaOko6KioqGgoKGgnp+fn5+fnp+foJ+cm5qZl5WUlJSTkZCRkpKSkpKSk5SVl5iZmpmZmpqam5+fnp2cnJycmpmZmpiXl5F8cmdxXl1QRj9BRD9KT0JCRjhDRT4+OTg7Nzc0ODQ1OTo6Ozk3OTo8Ozo8PT48PDo2NzY5OD4/QT47Pz49PDg6PkFAQUE/P0FCQERBPjo4PkE8U5ycm5uampycnaGio6KjoqSmp6alpaampqSjo7KysK2rp6amp6alpqiln6iop6qnoXmEXFFST0xcnKCAYpmgnp2clZOVlpeZmp2dnqGmpqampKOioqanp6ajpaampaWmp6amop2cnqGfl5GRkJSXm52YlpaWmJuZmpqampqZl5iam6Ghn56fnpybnJ6goJ6dn56fn6Cio6SjoqCfnp2ZlpeXl5iYmZubnqKioqKioqGio6WlpKOio6SioaGhoqOkpKSko6SkpKSioqKhoqGgn5+gnp2enp2dnZ2dnp6em5mYl5WTk5SUk5KQj5GSkZKSkZKTlJaXl5iYmZqampyenZ2dnJubmpiYmpmXlZaNempmamBiTkY+P0A9SkVAQ0A7QEE8Ozs5Ojc2NTg0Njc4OT04ODs6Oz87Ojs8Ojk6Nzc2ODs7Oz08Ojo8PTw3Oz5DQkRDPz1BQ0FEQT88OkBCO1eZmJqamZmam5ucnp2foqKhoqSlpKSlpqSioJ6op6alpqWlpaemp6ampqakpaanqKehqXJOUU1KVJahenKanJyenJeVlJWWmJiXl5qeoqKhoqOkpKOjpaalpaanpqSlpqalpaOgoKGhn5mSkI+WmpmenJaXl5eZm5ycnJqamZeZm5uen52cnZyZmZqcnZydnp6fn5+hoaCgoaKgn56bl5WVlZeanZ6fn6GhoqKio6OhoaCgoJ2cnaGioqOkpKOioaSlpKOko6SjoqKioqKhoKGfn52cnZ2cnJ2dnJ2enpqXlpaVlJOTkpKSkpCRkpKSkpGSlJWWl5iYmJiam5ycnJycnJ2cm5mYmZiWlJWXi3hsY2RiZFFHQT1DO0tIRDo7Ozw+OTo6OTo3Mzc5NTo4ODg8OTg7OT09Ozo7Ojk8PDc2NDc/PDo9Ozw/Pjw7ODxBQ0FDQkI+P0NAQkFAOj9APztZmZiampqam5ubm5ydoKGhoaGhoqKioqKhn5+dpKWmpqenpaWmp6ampqWkpKalpKSkpaaGUFJQT0+PmHB6mpubnJ6cnJycm5ubmZiYm56dnp6foKOkoqGhoqKio6SkpaalpKOjoaGhnpyalZOUmJuam56amJiYmJqcnpyam5iWmZybnJycnJydmpqbnJ2dnp6dnp6fn52cnJyhoaCblpWVlZacoKGgn5+hoKKjoqOhnZuZlpaWlpicnqCip6ikoaCgoqOjoqKioKCgoJ+fn5+gnp2cm5ucnZydnJmanJuWk5KSkpKUk5KSkpKSkpOSkpKRkpSVlpeYmJiYmZqcm5qbm5ucnJqZmJiXlZWWl4d3ZGdoZGJNQ0U8RDlJSkU5Ojs9PTo6ODg6NjQ3OTU8OTY4OTc5PDs7PDo6PDs6PDw4Nzg3Pj07Pj46Qj86Ojo/QURCQ0FBQD9EQUFAPjpAPj06W5qYmZqbmpubm5uen6CgoaKioKCgn5+enp2dnKWkpaanpqWlpqakoqKio6Oko6Kjo6KnllRYVVJOZ21rgZ6am5udn6Cgn56enp6dnJ2dnJ6enp+goaCfn6CgoKGio6Ojo6OjoqGgnpuZmZiZmZmamZienpiYmZmam5qWlZeWlZicnJ2cm52dnpybnJ2cnZ6bmJqeoaGdm5udoKKhmpWVlpaZoKKgnZueoKGjop+em5eXlJKSlJeYmZ2goqenpaGgn56goaGioaCfnp2cnJubnJubmpqZmpydnJmXmZaVk5GQkJCPkZKSkpKSkZKTk5OTk5OTlJWWlpeXl5manJubnJucnJqamZeXlpaVlZSEcmZsYmRbREJMPT84RktCPEA+Pj05Ozk6PTg1ODg2Ozg1Njo4PDw7Ozw8Ozk8Oj09OTU4Nzw5PD88OkE/Ojo6QEBDQkRBQ0A/Q0FAPj08QD09Ol+al5mamJeYmpycn5+foaGhoJ+fn56foKCenZ2lpKSko6OioqOjoZ+foaGipKOio6SiradXXl1UV19ua42dmpqbnJ6dm5ucnZ+enZycnJydnZ+goKChoaGgoKGgoKGioaGioZ+enJqampqbnJqZmpuZnJ6ZlpaWl5eTjo6QlJabnJuam5udn52cnJycnJ6dlpSZnJ+in5ycnZ+hoJuXl5mZmpycnJubnZ6fnZqXlpaWlJOTlJiampqfoKGmpqWgn56fnqChoaCenJubnJybm5ybm5qZmJmZmZmXl5iVlJKQkJCQj5CSkpKSkZGTk5aYl5STkpSVlJWWlZaZmZmam52cnJyampmXlpaWlpaQgG9vZV5gV0BKSDg/N0lFP0VBPD07Ojo8Ozs3NTs4Njs3NDY6Oj47Oj0+Pj07Ozs+Ozo4Ojk5NkBBPTo8PTo6OT9BQ0JERUM+P0FBPz8+Pj89PDtgl5WXl5aVl5mbnqGhoKGioqCenp6enqCgn52bpaWjpKSioKCfoJ+dnZ+hoqOjo6OkobCjXWVkYGFua4GenJubm5ubmZianJ2enJubm5ycnJ6ipKGeoKGhoqKhoKCgoaGgn5+enJqZmpubm5ybmp2dm5manJiXlZWWkY6Nj5KYnZycm5ycnqCdnJucnJyempWVm56foZ+dnJyenp2cmpqampqampqbm5qXl5aTkpWVlpWTlZaam5qanZ6foqWjnp6fn5+en5+enZ6fnZycm5qcmpqbmpiZmJiYmJiYlZSTkZCRkJCQkZKTk5CRk5SYmZiVk5SVlZWWlZaXmZmXmZqenpyamJiXl5aWl5eYjX1ubV9lVlRFSzw3PjdSRUM+QkE4Ozw7OTg6ODY7Nzc6Njc5Oj0+Ojw8PT49PD06Pz06ODw9OTtAPj4/PT45ODs/QkNAQ0VDPT9DQj5AQD5APTw8YZWSlJWWlpeanJ6goKCgoaCgnp6enp6gn56em6WlpKOioJ+fnp2dm5mbnJydnp+gn56rmGNpbW5pZm2enZybm5ybmpmZmZqam5ucm5uam5ygo6SgnZ6en6CgoKCgn6ChoKCfnpuamZqam5ubm5ufnpyZmJqamJiYmJKOj5OXnJ2bnJ2cnJycnZycnp6dnpqVl5ygoaGfnp2eoJ+cnJuampqbmpqYmpmVk5OTkpOWl5eVlJiYmZucnJydoJ+gnp6enp+fn56en6KjpKKgnp6cm5qampuZmJmZmJeXlpWUlJORkZCQkZKTk5OSkpOUmJmYlpWUlZaWlpaWl5iYmJiXmZqamZeXl5aXlpeWl4l4dmddX1dURUU5OTs8WT5AOEI/OTs7Pjk4Ozg6Ozc5OjU4OTs9PDk9Oz0+PD0+Oz8/Ozk+PDw+Pz5AQUE9ODc7QkNFP0FFQz1AREJBQEQ7Oz47PGKWk5SUlpWUlpiYmZubnJycnZ2cnJ2en56dnJqkpKSkoJ+enpybm5qZmJiYmZucnZ6cpolla3R4bVuFop2dnJydnJqbmpqampydnZ2bmpuboKKinpucnZybnJ2enp2dnZ2fnpyampucnZycm5ycnp6cm5qanZqam5yVkZOXm52dnJ2fnZycnJycnZ6fnp+cl5idn6GhoJ6cn6CfnJubm5qbmpmZmZmZl5WWlZaYl5eXlpaYmZuenp2dn6GhoJ+fnp6fn5+dn5+hoqKhoZ+fn5yZm5qcnZuampmXlpaYl5eXlpWTkpGTlJSTlJSUlJaZmJaVlZeZmJeYl5eXl5eYl5iXl5eXlpaYl5eVl5eDeHZfW11eUT1GOjk4P1VDQTtDQzo8Pz86Ojk3Ozg4ODc0ODk8Ozw4Ozs8PTo9Pjo/QT06PTw+PkA/PUBBPjk2PERDRUBBRUU9PkVERD9COzo8OTpkl5SVlZaUlJSUlJWXmJiamZqcnJydnp6dnZybo6Oko6CenJuamZqZmJiYmZiam5ubm6WJa3F2em9lmp+enp2dnJybnZ6dnJ2enp2dnJydm5ygoJuampubmpudnJqampucnJuZmZycnJ2dnZ2dnZ2dnpybmp+fm5ydm5mZmZudnZ2dn52dn5+dnJydn5+fn5uanZ+goJ+dnJ6gnpubm5ubm5yampuamZudnJqZmJeYmJiYmp2foKCgoJ+hoaGgoJ+en5+fnp6foaKhoJ+enp+enJqam5ubmpqZlpaXmZmYmJiWlJOUlJWVk5OVlZSVlpWVlZSYmZuamZaWl5WWmJiWl5OUlJGRk4yRkJOWfXhqYWJiXFA8QDw2OENWSERCOjg7Oj47Nzc5Nj06OTk2NDc6Ozw9OTo6Oz87PT08QD47Oz46PT89PkBBP0A8NztBQ0U/P0REPj9EREM+Qj07PDs6Z5aTk5OTk5OTlJSVlpeWl5aWl5mbm5ybm5uamaOjoqCfnpuamJeYl5eXmJmYmZybm5qkgGpqb3lzcZegnp2dnJydnp6enp+enp2cnJydnp2bnJuampqam5ubmZiYmpqamZmZmJqdm5ydnZ2dnJ2cnZ2cm5qdn5ucnJubnJubnZ2dnJydnp2enZydnZ2cnJ2dm5uenp6dnZybnpubnJycnJydnJubmpmbmpmYmZmYmpmZmpyfn5+jpaKfoaKioaGfnqCgn5+fnqCioaGhn5+fn52ZmpudnZqZmJWWl5aVlZaTkpOUk5STkJCSk5GUkY+OkJGOlZabmJWYlJmXlJiRjJCPk5yTkoyFjIeDhndxZ2pkW1xRQT44NkJHYEJFR0A+Ozw7Ojg4NjU8ODo4MzQ6Njk9PTk5Ojs9Ozw6PD48Oj5AOj5APjw/QD8+PDg6Q0FEPz5CRD8+Q0VCPUJAPDw8OmeYk5KSk5OSk5SVlJWXl5aWlZaXmZmZmpqampqkoqCfn52bmpmYmJiXl5iZmJmcnZ2cqH1nZXN7enOJop+enp2dnp6enZ2enZ6enp2dnZ6cm5ybmpubm5ucm5iYmJmZmJiZmZmbnZycnZ6enp6enp6dnZybm52bnJybnJ2dnZ2dnJ2dnp+fn52cnZ2dm5qbnJmZnJ2dnZ2dm5uanJ2dnJycnp2dnZybmZeVlZeXmJqam5ubnZ6foqOhoKGhnJucm5ubnZqcmZycn6CfnZiZmZmUkpKUl5SPj4+OkYyNiYuQi4mLjpGRj4mQmJiQkoyNi5KQj5iYoqiqpqWlrKOmoZqep6eyqKKVo6Cfl39wcWlsXFtcTUY8NzdHR1g+SE5URjk+Ojg5ODc1PTk4NzMzOTY6Pjw6Nzo8Ozo6Ojo8PDs/PjtAQD47PT5BPDw2N0A+QkA+QUY+PEFEQT1DQj49PDlmmJSTk5OTkpOUlZOVl5iYmJaXl5iZmZqampqaoqGfnp2cm5mYmJiYmJiYmZmZm5ybnKx/am16f3lxh6Genp2cnZ6enp6enp6dnp2dnZ6enJubnJubm5ubm5uZmJiYmJiYmJmZnJ2dnJyenp6enp+fnp6dnp6dnJydnJ2dnZ6fnZ2fn56goJ+enZ2dnZybnJ2em5qbm52enZ6dm5ubnJ2cnp2cnZqYl5SRjo+QkJGVmJSWlJiZmpudmJuYlY2Mjo6TkpKRj4mQjpGRjo+Ki42NjYiIi4+Lg42NkY+MkI2Qk5WVnJihoJySn6SipKmam5eanKOprb3Bwbq8uL26ucC8ubq3uru7tL2zwbV/bnVmZ1peWUxJRTo7TElTPFZSSUM6QTo7Ozc3NTo6OjgyNTY4Oz08OTk7Ozw5Nzo4Ojw6PT85PD8+PDw9QTs5NTg8O0A/QT9EPTxBQkA8REM9PT06YZOTkZCUlJOTk5OTlJeYlpeZmJmYmZqbmpqamp+gnp+fnJqZmpqampmYl5iZmZmZmZmphXB1e4B3b4mhnp6enp6fn56en56fn56dnp6fnp2dnJ2cm5ubm5ubmpiYmJiZmZiam52cnJ2dnp2dnp6goJ+enZ6hoJ6dnp2enZ6fn56en6CenZ6enJydnZ2cm5qYnJuVmJqamJiYmJmSjJCXlKCXk4+MjYqKiImMiJORh5CPjYqKkJCLjoqMi4+IiImJjpGOjYaFiYaKhoWLiI+SkJCNkJKXlpKamJ2TlJ6kpqaqq7Gsr6+rpquqsbm5tbS0rqyvtMDIxcXBvsbDxMTDurW+t7a0s7C2tb6qcHRyXGZfXV1JRj8/RUtMVklcTEQ/PUI6Qzk5Nzc7OTk3MTc5ODo+ODg6PDw7OTc5OTs9Oj4/OT5BPDs+PD46OTY5PDpBPkNBQT08QkBAPkJEPj8+OVyHhIOHi42KiYaFgYqMkZOVmJiHlZaWkpiampmenZ+gn52ampubm5ycm5iWmJmXl5ibqo56dXZ7f3mCoJ+fnp+goKCfn5+foKCfnp2dnp+enp2dnJqam5ubm5uYmJiXl5iZm5ucnJydnp6enpybm52dnZycoaGfnZ6dnZ2dnp2dnJiWlpaYlZWSlpmWk5GKjI+PjI+NkIuLj4+WiYiEi5GZjn2Fi42PjYyHioyQm4yRj4+Lio6TjIyNjIiSi4yFiYyPhouIh42KhYyEj4qXkJOYmpWbnKOqoaKknKKrsbe0ubWxs62vsrKlp7O6sbq6vLa3tsDDw729vLa/urq8wbW4wL60r66mqa+3mm58Z1tjWl1fSEU+QUtJU1hZXkFGOTk9OUY/Pzo3Ozs7NjM6Nzo5Pjg6Ojw9OTk4Ozk7PDo+PTtAQDs8QjxAOjg0Nzw7Qj9BQj4+O0NEREBDQz0+PjlhmZWLkYWNj5aSiHl9e3+Fi4OKgoqJhmuAeJCLlpqRnZ2UlJGTlpeampiWk42Sk5KQm5uIdndzcX1/cpGgnZubm5yenZ2eoKGgm5uWlpucmpybnJuYmZqYmJmampqWi5CTlpmYlZiYlpucl5WSkY2SkZCUk5KXm5mYm5ePjpCLjo2Ch4uLi4qLiI2RjIeHhoqIiZGKh4yEhYqNi4qNhI+UkIyDkJOUmZWQi5OTkZWRlpWOj5GMlI2Oj4qIj4ePhoeJiYmNiomJioWNh46JmJKUmpuXmKChp6Cko5qqqbO2sbWwqKmiqK6tn6qvsK21ubi8wr/BxLixtbCutrOwuL68ury+urOzp7G3wpB1gGNiXlpXUk1IRkVQSVlXX1tDUDpCQz1HRj84Nzo6NzU1OTc8OTw5ODo9Pjo6Nzs7Pjs7PTs9P0E7Pz48Pzo4NDM3OkFBQEI+PjpDREM/QUM7PT45Z6mloqKZn6CippeUiI2CiIJ1h4iKiIp7e3Z7enmPeoiSfn18en6CkYWBgH1zfH99fISHfnRweHZzfHaBj4iIiYeIioyMkZicl4iOhIuNi4iNkI+Pi5GPi4yOj5CQjouFhYeLjIyHiIuOi4eMhYaBjYuGiop/iYqGiJiRiIOIg4KFfIuLjIaJi4iKkIyIi42PjI+Wh4mLio6NjY2Wk5OdnJyalpycm56bmpuYnZeTkZWWkJKRi4+LlpSMjYqDi4SEiYyQkIqOio2LipGJjZOTk5SVk5KcmZ6Xn6CfpaKvsamupKSfmKStpqa4t6ysu729wsPAv7+vpa2wsLS3uLO0uLa0ta6stK+4tLaBeXpjZmBeVlBRQUVMT0lcXl9UR0dCS0xCREA9ODg7OTU3Nzk3Ozc9PDk9Pj05Ozg6O0A8Oj06PkJBOD88Oj84NjQyOTtCQD9CPj04QEI/PkBEO0A+N2CloJqXnaGaoaCPl5efl5WCjaCfo6GdmpKOjIxycXBvdnFucG1ucHZub29waHBxcHR+c3FycXd7cnl2d3Jyd3Z6e3l8fXt/iIGEi3+PkYaNi4uGiouLiYaEgYaCgIKJkYOAg4x/ho+LiYWAh32AgZKQhoSEho2DhIyPj4+IjY+Hi4iRkJWRjpCKk5eOj5WYp6SfnZWYlpaln5udq6aqt7W4srGnr6qnpqGfmp2WkpWVkYqPjImTjZuVjYuLhoaJjJWQkJCLmZKVlZSbkJiTlIyNkYyWl5WilZ6mqauno6OqsJucpp+mq6G0vb6zs7+5u7u6uby9rqiusa6wuLyztLGxqrCpqLGxsqild3J0X2hhYFRWUUlKSFZNXl5eVExKRVFKRUdDPTo5OTc0ODY4Mzg4PTo9PD47OTs4Ojs/PDw+OT9DPzg7Ojg8Nzc2Mzc5RT4/Qz89N0BAQT0/RDw+PThUj4yGh4eUjJWZl5yWmZaNlZyWlZydoKCdmpiWeHFubXJ4cXFsbnJwa3FvcG1yc3t1dnd5fnVxeHZ0d3tybn98gX15eH1/eYOGg4WCg5CLkIuLi42Pi4mJhYKBfX9zfYiAfpyQhIWFiYuPinp9fYaOjYqGjZSRi5CXj5SXkpihlp6XlZunpp+goKawq6GjpbW0sqqmqq+isba5vcK7ucO+vLi9uLWxrLCspZuSk5mfm5SPk5WOmp2doJqfn5edo6qsoZ+em62hp6qwqaampJiRkZWUo6SirKSss7Szs6i3tru4sLKvra2yt7a6srW6s7e5u7i8urayr6yxsbKztLOxsa2us7Gzs6yhl3Zxc19jXlJRVE1PSUdYT1pcZFROR1VPRURKRD44Ojg3NTg4ODU5Nzo6PTw/Ojg8ODk5PTs9PTpCPj84Ozo5Ojk4NjI1N0I+P0RAQDY+P0I/PEM8PT46Tn98go6MjJOTl5eaj5SWjZaRkZSXk5qanqGdnHJvcnFxcXFxcG5zcW91dHJxdneAdXd8eYV+d3t8eX1/fICJiYmDfXp/h4GIiYGAgIGGiIGGi4aIhYSIiImEf4J/enx8fX6SkH+IeIGFi4qDhIWKj4yNkZmdlJSUoJqan6Ktsa2ppKWtr6ysrLWuvrmtrqm1sLexq7G2rK+9wsLAvrq8trKutraxtK66u7OurKepp6unoqmtoKmooq+wuLSxvLq6urK0ta+8tLezt7e7t7mtrbCprLW5sbeytLe2sLu7vLu6ury1vLi0wbWsqqqrtLG3uLm1trSzsKymrrCqq7Cxq6yusLKxtK6qo5N4dnJlZ1tMUlBGTUhTV1JlXmdUUExcUUhMUkNBOTk3OTU4ODY2Ozc5Ojs6Pjk4Ozo6Ojw8Pj08RD45Njs7ODg+OTUxNTZCRkREP0A3Pj5DPjpBP0BAO0t/gomXmJSdlpabmIuSlo6XkZGVl5SZl5+bmZx8dHV2dXl1c3RudnJzdHV2d319gX56gXyDfoJ/fYB/hIKFj52RiYF/go+Xjo6HgoCBiIuFfoqQi3+HjYyLioeSioeGjZGTkZGEh319g4iMjouOiomQj46PlJSYkZWbmp2dqK6yr6+1tLOtsrW4sLy1tbGqsKqztbS7t7SztrS1r7i4t62noqassLCvtre3vrW5vLOysa61u7C0r6+yu7axuMC9tLS0s7izvLq2tLrAvbm6ubq+ubm5vrWysa+yr6q1tLGzsbSzrri4tb+vpKaoo6ussa+zrq6wsKytq6qroqKmqKKnrauqpaynoqeYeHlxZmVZT09NSVJNV0xPX15cTlVUYlFEVE07Pzk8ODk1Nzc1Nzk1Ojo6OTs4Ojw8Oj08Pj4/P0I9ODY6Ojk6QDs1MjY2QUZDQz4/Nz49Q0I5P0I/PjtLjpGTmJmVmZGTopiTkpKLk4uOkI+Vl5ablZSbhoJ9enh2dHRzdH53end2gIKDhouMhISFioaQiYeRk5aRjZaalY+IjI+emJaVkpCTl5qamJCdoJ2Tl5qgmZ2bo6CVkJugpKOak42IiIuJkZGOkY6LmJqPj4yUmpecnJufnKSstLm6vK+2tLi0tLK3uLmzq6+qqKy1srK1rrGrrqa3s7OxpaGotbCvrayrtbqyu7q6tLK3ur67ubG4sLmtqLK4u66ttLS3tbu2trm5vLe0r7G0t7a5s7e1pq2pq6ior6yprq2up6KxtLG0q6aop6Cjq66oqq6orLKwr6+pqKGeoaGjpqOgopqlo56ol3J3bmdiVUtUT09KQ1BLX2JYWlFcU19NSFFJQUA5Ojg2Njc3NTg5NDs5Ozk8Nzs+Ojg8PD0/QkBBPTs2OTk5Oj87NjM3OD5GQkJAQjk+PUBDPkBGQj44R5OWkZWTkpSQkZ+ZnZmVkI+Sko6Mk5aWko6RlZGSkIaBeXJzdXuBhI6HhZGTkpicnJiVkJWYo5yaoaeqqZ+clpeVnaKioZyZnpmlqKyvramnqqmop6GlqKirqamvoZufoaOjoJqfoJyUjZiUmKCgoaSem5qkp6Spq66spaOoq6+xtK6qrK6zr6ystLO0ua6urayqrLKwsK2wqKqmsrS0uK6qtrqwr6qurLC3s7i0t7W0u7y4tbWxtauyrKiys7uvrbGytLa1sbG0s7OvrKuvs7a0sayutKqqpqWnrauoqKupqqifqbOwqqeppaOio7CtqaatpairrayppaSioKWipaOYmZyVnqKippdudWVnZFZPWEtLSktTVHBiWWRXX1tcUlpQTEM8ODk6Njk4NzQ3NzQ4Ojw6PDg6PTk3PDw7PkM/QT47OTo5Ojs+PTg0NThBREVEQkM5PjtAPkI/R0Q+N0KSm5SVlZaVj46Wl5qZlZGKk5SSjo+SkYqKiY2Ul5qTjYmCho6VkZSfmpuin5+jnqGhn5ijpKelpaapqa2rqaKmpKilpKGfnqOjra2srairrq6qqqukoaKlqaenqaijopybm6SgpaijoJidmZ+hoqmnoKKirqyrqqetrqilpKmpqammo6iqqaekp66wr7Ovq7Crqq+yr7Czua+rqLCxrrCyubO0r62vtbCss7GurLW1tLSzs7CvrKyqrKusr7G0s7CwrrCwsKyqrauqq6alrrCysKumqbCvqaOkqaunqKaopquwq6mvqaaoqaalo6iwraqpqKKpo6WnpKGhoKKloZ2el5aYlJugpKmUbnNeamlfVVpOUk5QT1JkXGVjW11ZXFBZT0tAPDs5Ojc6ODczNTMzODo9OTo4OTo5Oj08PEBEPkA9OTo8PDw+Oz45NTo8QkFFQUNBOT47P0BEQENCQDdAkZ6YlJeZlpGHi5SSl5GIg4mLk4+OkI2Hh4SFlZmWmJeZlpqeop2anKKkoaCdn5qfoKGgpqGgoKCjo6KlqKmrramqpqOmpaCloKaopqWnqKapqKOnppmcpKWioaChoaCcmJmfoKGkpKKenpagm5qioqChn6CiqKCcn6GloaCmo6KfpKGspp6foaGkrKqnrKivq6e0sa6ur7WyrKqwq6mtrbWwrq6srreup6yqpKivsq+sq7Kvqqqpq6utqa6urrGxraqtqaunp6uoqauinaapqKilqKisqKilpKWop6iopqmsr6+oq6mhoqKlo6Opq6ymqKWjqKKhoKSdnZ+hoZ2bnZ+amZWcnKOqlG9zZm5yZF1dUFVPV09eZGRsaGJiWlpSVE9NQTo9Ojo4Ozk1MTYzMjg4Ozk5OTk7OTk8Oz0/Qz5APTk7Ojs8QD0+PDk5PEFBRUFGQTo9Oz9BQUJBRUI4PYqWlJOYmpaPiISNjpGSjIiIiI+JiZCRjoqKiJubmZygpaKlnqKjoZqeoZyanZ6bnKOop6ugoKOYoJ2XnKGjo6WjoqKkrKilqaCepqmnq6mkn6Kgoqahpq2mpp2fn5+fn5manJyhoKGkn6GbnZqcoJ6hn56eoKOZlpqYo6KipJ+ZnKGhoqCbmp6goaSgnaejqrGorqusqaSqqquorKalrKqws6+rq6mwq6appaWoq6ynpqevq6Wnq6upq6irqqqrrailqKOmpaesqayoopykoaOmo6qpqKano6SnqKanqKepqKupoaKoo5yepqWjqKino6WlpqmgpJ6inpeYnZ+doqKlnpiUlZ6go5d1d2t2d2FfXFVZUVVWW2Necl9oX2NTUVlUSD48PTg7OTo4NTM3MzM0Nzo4OT05Ozo5PDxBQEM9PT44Ozw9PEA/Qz86ODo+P0NAREE6Oz48QD9DQ0VDOTyCmJmenZ2alZKKiZGRl5GQh4SJgoGNj4+Sj42cnZ+hpKmlqaeorK2moqKfmKSmo6Stsa6yp6asm56em5qjp6Cfo5+foq+rqqyoqKuwqaipqKGfoKeprbCyr6yjoqahqaWepKOipqClpKKlo56doJ6fpaKinp+imJWemp6fpKGblZigoZ2enJudnZuZmZWen6Oonp2iqKGaoaOmoqSoqaqoq7CxqKWlp6eopKWpqaqnoqWmqKadnqWloqClpaOlpqCjpaOjpaelqamqpKekpqKmp6SrqaenpKGlqKynpqWlo6OopJWdo5+bnaCjqaeopqGjo6mooKiioJyVkZqfoKGmopuXkpCamqCVfHdvfXlmW1tgX1pcVlxoZG9jbmloYl5QUEA/Ozo4OTg8OzYzNDMzMzc5OTs8OTs7OT49QkBAPTs9ODw9QD08PENBPjo4PT9EP0M+Ojk/PEI/P0FEQjk6gJ6kp6Kem5+gmY+ZnaCWloqGj4iEi4qTl5SRo6Wnqq6trLOys7S4t62pqqevtLKxqq6usbKusa2lq7OssbGpq6+rq6y2sLSwq7GysaOfoqqpp663trS0trOvrKuuq7awqbKxra6npp6io6ObnZyXoqiloZ+eo5ueoZqWnaScm5aZoqefoJ+joJuUlpmWl5qfoJmVnqKZmJ2dpZ2gpKeqqaiqraylqaSlqaeqqaqsp6SkpKOimZmhnpqaoaCfpaWYnqSmpKqooqelpaGqp6mnp6ejqKWmpaGkqKesoqekoaalpaOVl52Ym5mVo6elpaSfnZ2lo6Kqo5+amZiXnJyaoaGakJOTl5ibjX93cnZ4aWJbX15cYllgZG5ta25hX2RgUE9BQDs7OTs4Ojk2MTQzNjQ3Nzc6PTo8Ozk9PUI/Pj89PDo/OTo7PD5BRUA9OTtAQT5DPDs5PzlAQEBAQkM7OXuao6OcoJ2dop2Zn6KioJibmJaYkpSQm5qWl7S0rrW4s7S4tre0uLm3tbm4ub28uKqLnLK4vLS9urW7uru4s7q/uLe5u7G3r6iusq2inJ+qsri8vL27ur+0r7GztbS3t6+1tLWysKikop+gl5Wal6SqpqahpKOkq6WlmKGko52goaKooaOgpaGck5mYmJmco56cmpudl5uZlqWam5+hqKmpqKuvr66pqKmrrKytq6irp6WjoJyfo6Ojn6Cipammmpyip6Spn6GjoqKgpaanpqSooJ+ipKGjoqiop6OloKGopqalo5mbmJuTj6GknqKfmJiVoJuhpaCfm5udnJuamZugmo2YmZiTkYaAdnh5eGNbUllUX19hbGh1a3BnaWliWVNMQDw6Ozg5Nzk3NTU2Mjg1Njc3Ojw7Ozs7QD4/QD0+Pjk6PDk2Nz47QkZCPDg7P0NDRDw+OT43PkFCP0ZDOzhwkpqblJ6bm52Vl52doqajopaXnpaXl6GblJi+t7G4uba3t7i7l5S2vbu9vcDFtaK7mKC3v7+6wcm0nbu2sra/xcGooLazurGqrrSxsLG0tLa8vL68vL3Guri3ur20r7Wxsbq4t7Kzsqqmpp+YpKSnqKSupKurtbWus6CnqqynqqmlpqCnoKGmoZOWmJ2foqSjnZ6coaChnZekmpmdoKaqqqqtrq2tsLGrrK2sqamrrqimpaalpqSkpqaeo6eppKGcoKKjpqCio5+jpJ2foqWgpJyboZ6fo6GhpaSlqaOkpaKkp6ehn52elpOcoJiZko+MjJeWn5uWnJqdnJqTlpSUmJOQmp2YiouHgIB8gnhhXllTYWhgZnNvc2l0ZGlkYltMSz46ODg5ODg5NzM0NTI1NDY2OTw8Oz08P0E/QEA9Pj44OTs4Njc/OUJFQzw7PD5DREM9QDs9Nz1DQ0BFQjw3Z4yRk4qalZiblZWYm6Knq6aVl5iQlZmhnpeXvrWztLu6ubi5woeYt6u4u8DCxbOjw6e4s72/tMTHvbS7uL62wMTErqCworW2tb2+wcPGw8O5vb/AwL2/xL28ur2+tKeqmLHAvbi1ucCzr6+qqqitp6ekr6eqtLyxtLWor7Gwr6yqoqajrJ+fpquXmqifpaWfoJydoKuwsKyiq5yYm6Cor7Kys6uorre1sq2tqaalqKulpaStqaShn6Cnnp6mqKmmnp+anqGlpqmcnaObl6KmmpuanZ+cmqGcmZ2eoKijn6GfnaWioKOioZSZmpmTj4qLhI2Qk5uPjpiVm5eYkJORkomNl5iYk4uKi32AgIVwYGFeXmpiYm53dXZubFtiUVVcTUc7PDk3OTc5Ojc0NDQxNDM3Njg8Ozs8PEBAPUA/Pj8+Ojo5Ojc6Pz5FRUU8PT1AQkJCQUI7PDhAQ0NARD87NV+MjIaFlouUlZeYl5ifpqellpWWkZebn5ual7mxtrO5vLy5urWqsryxvsG0vMe5uLuuv6fGw7/KxsnIxcXJvMLHx7+xsae8vL7FxMbJx8XGu8TAxcbAua+9vMC+vrOrqoyzu760tbfCuq2vsLWqq6aqo62kp7G2q7WyrbOtqK6vp6awr7Ktqq+zpKu1qaeopKCgnqmyuL61tbWqqaausre4t7apq7i8ubexr66noqOop6SfqKOfnqCZoZydoqSnp6GelJuaoKGlnqChnpajnZSQlpiboZqflpORlpSin5qenJudoZ6kn56VnJiPkpOPjImTkJefiZCWkZuUmJGRlZaDjJWXlpKLjIh8f4N/amZoYWtsZm51cXJ1cWZeX1xSSUU/Ojo6Nzg0ODw3NjU0MjMzNjU3PDo7PDs9QD4/QD48PTk5OTs6PDw+QkRFPj49QENDQkREOzo4QUJCQUNAOTJbk4iEjZGKi5GRlZCSmp2fnJOSmJSdnZqXmpW2sbm1tb6+tri1uLO8vMTEusPHwb+0s8XFxr/CzcfLzsvLx8HDxsfIysXExcO7vLzBxcHFxb/DwsbFwLGTvrq/w8K2trqptLO0qauzu7uxn5uxr6ykrK60p6qpqKqtrKmlpZ6pr6uyu7q4u7e5t7O5uLOurLO0qrC1ub3Bur6+vL60urm4u7qysbS8u7q7s7Oyp6Smq6uioaCdmpudmpyXmpuenJygnZaclpuZnZ6io52UnJCNiY6OkZ6bnJWNh5KLmJiWmpybmJybnp6cmp6UjpiYmpSRmZeeoZWYmpKXlJWRlJqYk4+TnZaSi5F+enx/dGtrbmRvbGhxeG95aWlhXGdhUUZEQTw5OTc2NDQ6ODQ2NTMzMjY1Nj05OTs7PT47Pj49Oz05OTs7Oz89QUNBQkFAPEBDQ0NFQjs4OUQ/P0BCPzsyV5uQkZCQh4WSjo2IjZCTlZGPjZSUm5STlpqRs7e4uLi+u7C1sri2tbbAw8G+w8LAvru+u7u8xMzEzNDLxsa/xcfLyNTLysjGv7u7vsS+xcjGxsTEw7i0wLe0vMHCucK3t7/Au66lrre8t62co7ewpq20tayupaWjqKSgoKWZqrOyvsG+urm6uLW0srG0tLO6wL7Av769u7u9vsDCt7a3tru7sru+ubi3u7a3tKyoqamrpqijnpOampyYkZKZl5GRmJqXnpiWk5acm5+elJOJiX6GiIuWlJiZkYmVkZeWlZmbmpaYl5idnpyhmJWZmZyYl5ybn56jnJ6WmJeTl5yZmZyUlp2UlpOJdnl6e3Zua2hndVpmcndzeGZnXWRbUlhJRj87Nzg4NzYxNjk3NDQzMzM2NDY7ODo8Oz08OD0+PDo7PDs9Ozs+PkRBQURCQEBBQkNDREM9OTlCQD8/QD89MkyWmpaSk4yKmJCKi4yOkpKKiIaNkJiKj5CUl7O7tba/vb2xtrjBvby0uL/Bsbi3vsHFvbu8wsbJv8jOyMHEwcfKysbKxczIzcbIxb/DwMvNz8nGw8PEwsS+uL7Bw8DEvsHPz87Gq6+2tLWroKe0s66ruLWzq6mjoq2prKatn6y1tL/Cvrm4vbawrausr7W0ur7Fv7u8urO5u7i5ubWtsLS9u7G/vLiytrmzubu0ra2orKyqqaeXnpualY2MmJSTi5WWlJyZl5WWmZKYn5mQiop+iYqKkY6Vl5OUn5mWkJSZmJmWmJOUm6GeoZiYmp2ZmZaenpibopqdnJuYmpuZlpeXlpyZlJyYfoB4eXV1ZWVpamhdam9teHdjYmBgXlhXRkU4Ojg6OTc5NDQ5NzY2NTEyMzM0Ozo9Pzs9PTo6PTs8Pjo7Pz48QkBDQkJFQj0/Q0NDQ0RFQDk6QkFBQj5CQTVCkJeUlZmSj5qQjpKRjZSVi4qHjI2UiImPkpq2u7S8xsHEwr3BxcLAtLO9v6ywr7rDysPCvs3IxbfByMW/wcLIy8rCwsTJzM3Pz8zDx8bIyMjHycfFycfIx7/Fx8TEx8jK0s/SzLy4trS4uMG+vrq9ury6vKytpqm7urm3wLK1uLLAxrq3t8Gzsa2tqau1s7u2w7a2vbWxt762s7e4sLW2v7uwvbq0q7CxsbO8urOzrqutq62xnaOjoJqQjpiXlZCclpaYlpWSnJmTm5+clpGUjpWQiYyQlZOUm56YmZKSnJedlJmSk5aZmJ2VnJ6do5yVnZ+TnKKcnKCfnaOemJSVl5ebmpmgkH99cXRxb2JhZ3VnaWl0bXhsXWRbVWBZTEhDNjw5OTg4OjUzOjY2NDQxMzUyNTs6PD47Ozw9PDs8PTw7PD49P0E/RUFCQ0M+QEFARUVERUE7Nz5DQkI+Q0I4O4+akZaalJKUjZCUlI6VlI6Pi4yJk4uIkJObt8C6xsXEw8zCwcS9vrWvt7uvr7O6wMfFxMHMy8W2ucDCwsTHytHLwsPExsnFzdDOx8zJwsHGwcvLx8bMyc3FxsbDxsXJzdDNz8zHxMDDwsnNx8XBxMfBu760sbCwwb6/wca/vri3w8K6urbAvrWyrKmvsri+tMC0tLi0t7nEua+8vrm+v8K/tbq2q6qsrq+wt768trSura2utaSlqKimmpycnZyeopydmZOQkp2VmKCdmJiVmZmZl46MlH2QkJefmZmYk5GToI6Nko+VjpCUlaKdnKSem56elpyjoKGipKOkop6amZubnJ2enIN9cnx4cGdgamp2bGlldG5zYlxiVFdUU01HOjc7OTk3Nzo3NDg3ODQ1MjM0MjU7Ojk+Oj08Pz04Oz05OTk9PEBBQEVCQUJBQT9AP0RFREVAPDo+QkNCQENBOjSAoZeUmZiVkImUk5aTiZGMlJGOiJaKi5CXnMXLw8O8wMPHwbm9vbu4tre3rrK3uLzAwsDCx8bHurzAwsXHyMbSycHDxL+/vsTLyMrLyLy7yMfJzcjDyMnJxsXDwsHCx8fJysfMyMfIzcbLz8W3wMDAwLu7vbWzs7+/ub/DucC3u8G8uri7ub27srCvsKy5wri9ube1t7q9xb24xsjCwcLGwr28tamurrCwr7O6t7m2sK+tr7OppquprqannqSlo6OjoqCblZiekZecl5GRlZeZlZmRlJiSlYyYo5qcnp2FiZ+TfJKWlZKUlJennaCipJ+en56foaGkoqKjoaOinJ2fnqOhppl5enl/cm9mZWdjamRham1ubl5YXFZVTlBKRjk5Ozk3Njc3NjM3ODk1NjEzNTI3PDs8QDs/PDw6ODo8OTk4Pj1APz9GP0JBQz89QT5ARENDQTw5PENBQ0RBQDozbKKdlZedlo+PmJiZmIiSjZGVkI+Vjo6TlpbKy7u5urnBu7q3vsG8vLu5sa61uri4u8S6vsC+vru8wMXBxsK+xsG5u8O6uLm8vsHGwca6ucnJw8XEwMTBwsHEwcO+vcLAwMHCy8PGzMvFyNHCsL69uLq7vL63tLC5vrO8vrG5tbi7tryztbm2uba5t7GtusG6vMG/t77Ev8bDw8fHwrvAwr/Cv7iys7O1tLGut7S3tbSxrK2xp6Wlp7CtqJ+nq6ajqKWmpqCgn5SYmZSRkZWUl5OYl5qhnZ6hnKGdoaWglpSbkZeXmJqTnpmZqaSlpKWdoqCanqCkoqOcoqGjoJ6cnp6ppaiVfXuDeG5mYWRiYWJjY2piZmNaWVlcWVFORT07OTo7Nzc5OTY0OTk6NTMxNDUyNzo7OkA9Pzw8OTc3Ozo5Ojw+QD8+RDxCQURAPz49QkRCQkI+OjlCP0FCPT44NVmfnJiTmZaRlZiYmpeQkZCQk5GTlJKSkpSUxce4tbq5wrm5vMPFwri7ubGxtry6tbnAu7u5tre0tLW/ur3Aub26urS/uLW3s6+7vLfAt73Cv8G7v8G8u8W+u8HEwL6+uLzBwcu+vcnEwMDKwLHBv7u4u765tbe0uLy0vbi1tLCzvLG3tri/tr25vb65t7q+u7/Axb29y8PGw8TAw762ubq2v7i7v7y4trOyq7CwsrWzs66sq6emnqeurauiqKumpqqjp6iqo5+Ym52bmpicnJiXnJuhpZ2anqGhoKGmoJqbnJiboJ+dnJ+coKiho6SknaKfmqKgop+el6Shop+dmpieqKWhi3x5h31xY2BiYmdqZmZpZWldVlVTWU9TS0U4PzY7Ojc3OTs2NTo7PDYzMTM0MTc7OTg/PT47PDs3Njk5ODo7PUA/PkA9PT9CPjxAQUNDQT9DPTo2PEBBQDw9ODdJlJibj5OUkZWYlZGWkpWRkJGUlZSTkpKYlcHCwLq8ub62uL7EwMKxvbqytLO4vLW3vMC8vbS0sbC1t7W6wbi+uL+8vbe1t7CuuLa5v7vAv7fBvLvDtrrIuLa5u725ura7xcXKvbnFwL+8wb64xr3BwLzFuLa3tLi2tru7uLa0t7q1tLi8vbm/ucPAwLu5vLu+vcjEvcfEw7rAvb62sra4srm0usLCureysaysq62yr7Kur6ijpJ6rrKyqpKakpKiqoqemraihoaGmn6Oiop6bnKKfoKOdnJuhn6KgpKCem5eZn6GdnZ6eoaWkoaKioZ6ho5yinqCZnZijn52eoJqZoKKmnYR6g4B4cG1lZWZvaWVrZ1hYTktLS1JJTEhDOT44PTs2Ojs5Njc8ODk4NjA0MzE3OTk7Pz0+Ojw6ODg5PDg6Ozs7PD1BPj09Q0E8P0NDREA/Pzw6Nz5CREE/QDg4P4mYmoyMkI+Tl5WMkpCakpGXmJaUlJKQmpTDvsbBwby8uLi6v7a8scK2tLyxtLa4s7q9v728sq2vrLGwt7y2u7zAxLm3t7e1urm6u8C9w8C6xMK+x7i5uK23tbi6tLezu8XGy8G7xsDAv728v8nDxMW+xri1srK9uLi4vrq6uby6urS3u7q5v7zEwL+5uri/ubvFxr3Fw8Kyur27sa+2uLO3s7q+wLm2rLGrrqmqqa2qqq6mpKWnrq2ppaOio6GkpaWmoqato6Klo5+ho6Gcmpyhn6CloaCenZygnaWgnpeVmZ2fn52gn6KmpaCknpybn6Ofn5mcmZ2epJyWnKOcnqGcppZ+f4Z8a25wZ3Brc2VibV9cVEhLSkRKQkNHPzk7OD08Nzs7OTc4Ozc8PDYyNzUxNjk8PD08QTs8Ojs6OT45Ojs9PUA+RD89PkRAPz9BRkQ/Pzw9OTc/QUNCQEI5Ojl3nJiLh4uQkpOWjY+TmpOQnZiSkY6QjpiSvbfHvsO+vbu+vL22uri9ure9s7OwuLi1uby8wLeqraSusLe7s72/u8S3tri2t7+/xLzCxcXHx8rJxs/CwbiutbW8vri7sr7ExMrFwcnDwr+/vr3HzMfHxMe9tbW2wb26u7/CusDCv7y2t729vcHBwL+8ube8wru3v8W7wr++tbe8vK+vt7awtLO6ubq7r6mtq62rrKaqoqeuqKWqra2vp6Sgn6ajnqKjqKOjq6Oiop6dm5ublJaZnJyfpZ6fnpmYnpejoJyXmZqZmqOjop6jo6egpqCbnaCjnp2WoJmcoKCblJegn6WcmKKQgYaBcWVsaW50bndjZ2FcY1FLVEhFRUNHQzw7OTg9Ojc6PTo4OTs3PD01MzY1MDY4OTo8O0A9PDo+PDk+OTk9Pjs/PkM8Pz5APz0/P0ZEQEE/Pjo3P0BDQz9BPTo4ZqGYj4uNlZKVlY6PlpmVl5uVjoyMjY+bk7m2wbS/vLm8w8C+wLq1trKywLmvsry8sLe7tru8q6qjsLm9vrO8vrzFuLK4ub3HycrDx8jGxsnIzM7RzMrEtbrAw8i/v7W/wL/Gxr/LxsO/wbzAw8zKx8XGwbm9vMS/wL/CyL3Hx8XFvLrEv7vBv7rAvLu7wMS9t7nCub69t7S2uLqur7WxsLCytre0t6yurKqsrKuoq6Gms6qlra+trKippaOkp5+io6Onoaeiop6cnZyamYyQlpeZnaKZnpuVkp2UoaCdmZ6fmJimpqKfoqKmoqeloqCko6GbnaCbnKKfl5WVnp6kmpafiYGDgXRvbGx0a2xuX2JeYGFOSE0/RUA/REM7Ozo6Ozo4Ozw6OTw+OTo+NDQ1NTE5OTo5PDtAPD89PTw4PDs6PDs7Pz5DPkI+QD89Pz9FRUJBQj87Nj9CRUQ9QUE6OlmfmJOSlZqVmpOQlpeclZuZlpSVkZKTnZm2uLaxuru6vsG5uca7trWypb69tLbBv66zvbS4wbGwsbS8w7y6ur68xL+3vb+9x8zGx8nGxr/ExMrIzMzNy8bCw8vOwry5vbq5wMO/yMbEwcG/xcDKycPDw8O5w769ub+8wsbCyc7Hxr66xr26v7m3wLm5vsDCvrW0vLi2u7CvsrK1r7Cvrqyus7CzsrirsbKxqrCrq6yrrLatqKyusqarrKmpoaWgpaakrKSmoaChnqGgnaCMlJeTm5+mmZ6emZOYnZ+gnp2eopuYp62ooqSgoKKqpqmhqKGlm6CgnZ2jn5SYmKKdp6Gfm4J7eod6bW13e19wY1tdX15TST5DRUlCQz5DOz42OTo7Ozs7Ozs7PT05PTU2NjIxODo5Ozs6QTs/PDw+Nzs8Ozw9PTw9Pz5BQUE+PkFCQUVDQkRAPDY+Q0RFPkJEPztTmZuZmJ6dmqCalpyZn5KdlZ2boJWWlJqYur20sLu8wcTCv8XGura5sqO7vbS3xLuwtbq2ucS4tLy2ur3BvLu/tr/Bv7y/usDLwsfIwL+8vL/FwsfLyMHDwMDJysLAu7uwtLu9wMXGxcW/wMK/y8fCwMjAusK7urO6usG+wMrOysS9tby8ub+5ubW1s7/Avre0s7S4rbeqr7CwsrGvq6+nr7ausrG5rra2uLSzsLGttrS6sa6srranrLKsraSjoaenqLKrqqWkp6elpaCml5ujn6SmraKeo6KanaWiop+foaWenrC0sKSlnp+kqaevp6mgq6CiopqipJ2anqGmp6+psZWCe32Cem1zeHNncF1bXlxZUUVEQ01JQUQ9Rzo6NTk7Ojw8Ojs7Oz0/Oj01NDUxMjc4ODs8O0I8Pz46OzY6PTo7Pj0/QD87QUFBPj4/QkBBQkJFPjo1OkFCST9AQkA7TJqdnZ6fnZienZmampySoJWbnp+blZGRlsW+urbDvMbCvr/Ixbe1uLe2ubu0r7e2srWzt7m8u7a7u726w7u3vbe5wLu6uLi1xcHDw7u5s7S6wb2/x8C5wLy+xcS9vrmysK64t7/Dx8PEvb2/v8PDvr/HvLy/tLSutbW8vr/OzcvCt7K4uLi9ubuxtrLIwLu2tLGwt6yzqbCtrbO3r6uuqrG1r7Gvt7O6usC/tre2sru6wLWyrbO3rLC6r7KloqWrrK+5s7KosK+xr6qiqKGkraitrLOun6inpqWmq6Sknqaqo6ayuLOrpZyfp6anrquqpbClpaWbpKOYn6exrLW4sLKOhHl/fHZsdXpwbmlcX19ZU1BBRUhHS0BEQ0g8PTY7OTk8Ozo6Ozo9Pzw9NTU2MTM2OTg8QT5AOz1AOzs5PD04Oj08QD46Oj49Pj09PkBCQkJBRD03NDU9REc9Q0I/PEWUnqCgoJyXmpiYlZmdmZ2fmp2bnJaRj5LDwMK9wrzEvLy7xbu3s7e2tru7s6CWtayvsbS0tLa4ucHAt725uLm2tb+ztLK4sbvBwMO3t62wtbi4uMK6tLu3u77Au7u8rq+us7K5wcLEw768v7u6uLbBwrW/urWur62wvcC5z8rJw7GvtbS0vbq+ubq7ysO7uravsL2xuK+ys7C3vbaur66wt7CsrLK2vbzEwrq9t7bAv8G3tbC2srGzurGxr6err6u2v7e1qbqztbmxp6uop7ausrG1uaisrK+qr7CqqKessayytr20saykqKuoqKusq6i2qaaonqadmKOuvLG7wbSmiYF8gnpzdnZ3bnFgX2VdW1RKPD4/RkY9RkNDOTo1Ozk5Pjw8Ojo8Pj4+Pjg4MzE1Nzg5Pj9BPzs6Pz08Oz09OTs8OTs6Nzs+PT1DQT8/QUJEQkE8ODU4PUNGPUREPzw/iZ2en52Xl5WUk5aZnpubmpuYlJ2Uio6Owb7Dwr6+vrm2usCxtbGzt7fCtbOrrbOoqa61r620trnDv7e6t7a2srTAtrK0uLO6wMHDubizsrK0sre+urO1sry6vLa6vrK0tLSwuL7DxsTAvb+5s6+yvLquu7Szpquorbq+uMvCv76sq7Cvs7q3ub67wMXBu7y3sLXEtb+0uLu0u8PCs7a2sbisqaWrsr23v7+7u7exvL28trGvq6uprbOvsLCrsLSpuMC2sqm0tbC3tq2spqu7s660uMKwsbG1sbK1saywsri4ubi+tLGzrqyxramvrqqyuK6trainoZ6ptr+4ur+wlol9gHxxdHd0dnJsXmJgW11OSEE/PUhDRk1EQDc3NTs6OT48PDk4PT47PT86ODMyNTc2OD8/Qj86OD4+PTw5PDk7Ozo8Ozs6PEA+QkI9QEE/QkI/PDs3OjxBRD5CQz8+QYqgm6GdlJiVlZKYmpyWm5WalY2bj4SIhru0vb+7vLm3s7y8rLOytLS2wLXAr7Kzqqqxt62pubO3wL27vLi2uraxwLq3ubi5u8HBxMS7u7a0tLC2ura0sqy8ubi1uMG6uLOxrLe8wcfDv7m6ta6lrLOwprCtqJ6gn6WttrXCt7a0pairqLC2s7K6tbu7u7W4trC1xLK+vL+8ubrFybq9vraxp6SeoamxrrW5trKxq7S3trGopp6gmaWmpKynq6y2qa+6sa2kpq2lq7GrrKmtuLawsrjBtrGxtbGvu7ayt7W1sry1urKwsbKutLKqrq2nuLWyta2uqqiosrq9wLa0qY6Ce393b3tvdXJuY1xmWFxdUk5NQT5KQkBKSUA2NjU7Nzg+Ojs4Nz4+PDs/OjkzMjc1NzU8PD48PDg+Pjw8OTk5Ozs7Pjs7OTw+P0E9PEJAPz9CQD47Njc6QERBQ0E/QUKJoJ2loJSWmJiVnqCcl5uYmZGMmYmDhoS1r7S7u7S1sLG2uq6wtLOvtbq1urC1s7GttrqurLyyuLm3u7+9ub7AtL+7vLq4vsK8wsrIvsC4ubaytLaztK+su7q4trnAw7aurqqytry9ubaysa2tn6Snp52jpp2WmZman6muuayrq5+lqKSrrq6nr6yvsbGtsa6usLmwtLy+uLm4x8W8vLu4qaKcmJufp6assq6zqaapqq6popqXl5GcmpijnqKir6ekrKaompqemqGnp6anqa+2squ0trCqsK+xqbm2sbWxrqy3s7avrquuq7S1ra+rq7GtsbKoraurs7W3ur2wq6GLeoJ5cnZzbXVpa11balRdXE9NSERGTEFGTUY4NjY1OjY6Pjg7OTc8PTo7PTo5MjM2Nzc3Pjs9Pjo6Pz48PDw6Ojs5Oz47PTk8Pj1CPDtAP0A/QT8+OjU1OkBFQkRBQEJBiJ+ipqGYm56dmqWpmJudmpmUjJmHhoeGrq2uuLmxsqiur7iyq7CwqrK1ubm9tbK4tLm6tbm7tbWztbu8wLu+wLS/ubm6sbrDvMLKxb+7v7+5tLSzsbGusLm5try4u7+ysrKusa65r6qrrayjqKGdnZ6XmKGVkpWXkJifqK6ko6Sgoqeio6mpoaanpaqtp6ynqKesq6yyu7SztLm6trK2ramgmpaWm52fq6yrr6Ojo6GpoJuTjo+Qk5KSmZaanaSloJ+ep5iVkpSYnqSjoaWqrK2iqaqppKmtrqW0sa6xraqprq+wraWmqqSos66trKmmpqmrpqqnq7Ksr7Oxq6mWgX+Bd3J4aHRzbmRUYGNXXFFOTEg/SFFETUM9ODg3NTo3PD46Ozw4OTw7Ozw7ODI0ODk3ODs7PDs4PD0+Oz08Ojk8Ojs9PTw6OkA9PDw7QD5CQEE/Pjk1ODs8RkFDRD9BQYijpqKjnqCfp6Coqpufm5yZmI6Xi42PjKqpqLGvsK2lp6ayr6mmq6CvsLu1vby4wMG+vLy8ua6tr7Kyurq3t7W1vLSvtKu2urjAxMG7tby9uLKts7CvrK62trK0tK+qpJ6bnJyeqKifoKipn6GnlpuXl4+dk4+Qlo6Xm6SooKCioqKlpZ2jo6CepaCkrKSmqKSio6OrrLOuqa6urqeqraisoZyamJmYm6moqquepaKbo5yVkIyPj4+TkJeVlpifnp6amaaXk4+Slp2ioKWjpqSnoKKko6Ghq6uksq2qrKyno6yuraufoaKkpK+srKmmo6KqpKqqpKmrpqmsq6agiHiDfHZ/eWJ3bG5cUWhUUE5HT01MQk9RQD47PjM5OjU7OT07Ojk9OTk8Ozw8OzkzNjk5Njo7Pz06ODs6Pjw6PDs5Oz07PDw9PjxAPT88ODtAQEE/Pz45NDk8N0FDQkQ9QEOOqqSjoqGinaulpqimoZ6dmZ2PmJWTkJWnpKGmqKmlpKChp6uhnKKbp6u1sry9wMLCwL7AuLSnpayqqLWysbCur7Knpq+jr661wbq1t7K3trK0q7K0rqqrr7Cys62lnpKYlI+ZoJ+ioJykpZ+eqJSblpeMl5GNkJeTmJ2iqp+fn6Cjpaicn6ChnKKfo6innKehoKSfrKisrKCpq6agpKimrKOdnp2Zl5qrpqmwo6WnnqCclZOQj5GQmJCWlZiXn5ibmZujmZeUlZqdoJ2nqKWgo6Kho56doKmqpa6upqipoaKqrqqnoaCio6msq6eppqShqaKlqaalpKKmpKijkn18gHV1fW1re2RoVVFjTUlIR05STkpORztEQD0yPzg1OTs+Ozk5Ozg6PDs7Ozk5NDg7ODc7Oz48Ojk8Oj07Ozw9OTw8PD49PUE+QEJAPTc6P0FCQEA/ODU1PDpAQ0BEPkFGlq6koqWeo6KpqKipqqWmnp2imJiZmZWbop6bnqOioKOgoZqgmJiXlqGorK62t7q5ure3u66ooKGpoaCtq6qmqaSpo6SupaystLy3rLKxr7Gtta+vs7Wqp62so5yZlI6RlpeZmZygo6KbnaWemqSXl5eWkJKRkZOal5ugpKqeoaGepqeqop+gp5+dn6SnqZ6jpp+qnaqtqq6nqLClo6Smp6ymoaShm5ier6iusqulqqqgmpiYmJWTlpqTlZWZlpuXl5ignpycl5uhmp6ao6eln6GioqOdm6Gmp6aoraOppZ6kp6mkpaWhpaSsrKmmq6eioKSjpKenoaCgpaKmoIl7gH12eHxkeHlgYlJVX0hJSUtTVElSUEw4PkI2Nz02NTs6PDw5Ozs4Ojw9Ojs4NjU3OjY5Pj0+PDk5PTk9PTw+PTs7PDo+PTw/Pz9APT03Oj5AQEA/Pzg2NT08PkFCRkBAR6CupKaroaOqrK6tp6ypqKCipp6bm56aoJyalZmfn5uen56WlJOXk5OcnqOorq2sq6uvqq+pn5eepZ6epaakoKKfpqCirqusrbWytqavtKupqrSxsLC4raehnJ2alJibmpGOkZWRjI+OlJminJejmZqXmJmUmZiWnZufpaapoKajnqeurqumorGjmqSmpqqioaqiqaSosquxsqu5qKarp6urqaysp6Cgo7GtsbG0qbGvopmcnZ6hmZubmpiZm5SWm5aYnKWhoJqjoZqdmZ+kop6gn6KmnZulpqWkpaijp6OepqOinqaloqWlqKykpq2noJ2dn56gpaGenqWgppmBe4F8dXZzaIJsZVtTWllNUUpOTlVMUkxBNz5CNzg9NzY6PDw9Ojw5ODo7PDo7OTc2Oj01OTw7QD03ODs3PTs9PT06Ozw4Pj09QD5BPj4+ODg8P0BAPT83NTg9Pj1BQEZAQUihqqCrq6GkqquwramtqaelpaWkoKGfnqWXl5SYmZ6YnJ2blo+VmZKSnJihnaqip6Cep6Gln5ySnKKbn6Gjnp2gn6Ogoq+urK+xrLanrbGtpqawrq2ssKegn6Kgl5GUnKGcmZeSk5+doqSbnpuWn5qfl5uinqWhnqSfpKitraisqKSstLe2sKe0rKKtraOvpaSmoamorrWzsr23vrCssa6tqaq0sbCoq6iytbezt6yxtKOgnaWgrKGhoqCgmpiWlp+bm5ikoaCepKGgnpqcpaCfnZyhqJ+fp6meoaOkoKagnqehn5ymo5+ipaOooKmrpZ+dnZudmqainpyjnqeQgYJ/fHh1aXd1XWxaUmBIUVVIRlVWSkJNRz1KSDhFPDY3Oz49PDo8OTg6Ojs6PDk2Njo8Nzs+PT8+OTc9OT47PEA8OkA6OkA/O0A+QUA9PDk3Oj5APzo+NzU4PT0/QUBEQEJGnKueqamipamprqimqqWmp6aoqqGlpKOmkpOVmJacmpqcmpWTmZuOk56ZqJ2unqeenKGdnpqZkpmenKKioKCdop+fnp+pq6esqaq0q6utq6Wlq6iqrKqln56ZkpKUmJmWlpaMiIuOlZ2dnZ2elp6apqCgqKWxqqeuo6uttrC0srGutri9wLqttbSwt7CutKmmpKWsqbmztbvDvMPBtrq2q6+xube8r7OwtcG8t72zs7Whq6KpqLKpq6inqJqZnpqqpp+Zp6Cfn6eopaSenaqiop6bn6igpKetmZ+jnp6nnqCmnpycoqGbo6KhnZympaWkn6KZnJukn6CboJyjiYWEfnZxbWl2bWhtXFhbQlZNSkdNR0JGTTw+TD00PDk2Oj0/PDs6Ojg4PDk6Ozs8NTQ6PDg5Pj4/Pjg4Pzk8Oz0/Oz1BPTo/PjxAPj8+Pz08Njs/QT07Pzg1ODw8QERCREFCQ5WqoKapo6mqqKmjoamgpqinrK6lqaWpqpSSl5mUmpqanJiYmZyamJqqoLGit6OwpqCenZ2XmJaZnpucpJ+fnaSdmp2cpKKko6Kqr6ynqaOgoayurqqrpqCenqGjnp6em52clJOVlJ6emJSGnpqhm6ukq7KwubKysbKxur28vLm2uMO+v8K/trq6wMS5vbusr6exrbHCtrjCxsDIysDKv7C5ub25wr64tLvFw7zCu7ezqbKtqrO0r7Ouqq6jnauntrGsoq+loKOvsa2wpKSvo6GgmqGnoaSqqpmdoJmao6CmqKGcnqKemaSenpiYo6OhpZ6mmZuipJ6fm5ubnIeFgXt0cmtrdXJwaFdbUUVUSERJT0g+RUEzRUg5NTs9Njs8Pjw8Ojo4OTw4OTs4Ojo4Ozw3Oz49Pj02OEA5Ozs9QDw9QDk3PD07Pj0+PUI+Pjc6QUA+PD45NTg9Oz1DQEFDQkGRqqGlqqelqqimn6KnnKasp7Gyq62jqayVkpWalJecoqGbnqCinJ+psqu7sr+rr6ylnqChnZyYm5+gm6Cfn5elnZWbm5+anpyepaannaCgq7Gup6Sko6CepaulnpeclJGZnZiUjIqGiIZ5bYigpKKrrLS8tsO+vrO7wcPCxcC/wsbGxcPIwsDFyM3QyMvDsre1vrK+xbu+zM3FzMzM0se+v8DCvcfGwrfDycjCwMW+ubS5urW7t7C1sqq6sq67tr66uqq3rauquLq0vK6tuKOlop6npaKjqaaZm5+Ymp2nqqegoaGkmJSjlpSakZydn6Sep5+en6KdmJmUmJSIhH16cmtkaG94amVaW0ZKTEREU0xEQkQ3Oj87NTQ5OTc5Pj87PDs7OD48Njo9OTw9OTw9Ojs9Pj4+NztBOj45PT45PT44Nzs6Ojs/Pz1CPj83OkFAPTw9ODY2PDo8QT9BQUE+kqugp66ooqulpKKipaGlqquwsq2upKmmlJWVmpaUm6SmnaGqp6KrrLy8v8PBs7K4p6Ghq6qinZ6hop6cm6CSn5+Qlp+ZkpqWnZuZo6Gvs6mhmp2dn5+al5iXkoyPlpeTjo2Qi4KDgndzcW5wj6atrrS5xbvNx8u/wszOzczIydHMzczHycXGzNDS1c7Tyb3Av8O7xsXIxdLTzNPQ09PMysLFxsbKx86/ydDLxsTGxMG7w8G+vr61vbOtv7/Cw8bEx8SuvriyuLzEwcG6vLy1rqenraigoqmlmpagmpmdqKupo6SknpePm4uQmYmVmJugn6OdnZeempOTi5WPhYB5dHNlYmdyb2ZeWllDTkxDRVBJREJANTU1ODlCPTY4OkE+Ozs+PDk+PTc6PTk6PDg8PDw7Pz8+PD0+Qzw7OkA9Ojs6Ojg4ODk7QT48QD8+ODtBQTs7Pjc4Njo8PkI+Q0FAPpOvn6ivpqiro6KloKampKuoq62qrqKqo5Kcl5ebmJujrJ6frqalsarFxszOzb+wwqmlqK2tqqGdo5+cnZqpk5mhkI6gk42UkpeZpLGxq6SgnaCbmZeUk5SWkZCPjIeEg4iHg4CBgYB5cnJvbHmktrq5vsvB09LTyM3O0dPR0tHQ0dHNzs7Qxc7U1djS183Gx8nMw8XKz8rT19HX0tTV09PIzMfNzcnSzM7TzcTHycrBxcvGyMjFvsKzs8fEy8rKzsXKv76/vMHHxMzMyMm/w7+tsLOonqKqo5qTnpyYnqaprKSlppaXipWFkZSHkpKSmZualpiQm5WQjIaRi396cnV1Z2NndmlkVldRRE1GQElRQj1CPDoyM0A8RDw3OTxCPTs9Pzs7Pj05Oj48Oz44Ojk5Oj86Pj1APkA8Pjs+Ozk9PTw5Njo6Pj08PEA/Pjk6QEE6OT44Ojo6Oz4+PEE/QT6QrKKiqaanqKSfop2qqKOso6OnpqyiqZ+To5iWn56dpK6bn7CrqKyxyc3U18/Gu8esrbS4rK6jn6Sjn6CkrJuWqZaNl42MjZemsK6lnZ6doaWhnpuVlJaUin13cGtlYmhxb3F7hYqAdnBucXRwhbPCvsXR0NfW1tLWzdTW19TT0dPU1NPP0sPQ09bX1dbSy8nO0cvGzdLK0tXW2dXX09bYztLJztHMztDM0s+/x8bKw8zMy87PxcbHtr/Jv9LNy8/Fyci/w8LIzszP0M/MysfNuLe7qJ+lq6efmJ6jnp2qpa2pqKiSlYiQhIyRho2MiJOVmZCWjJiSj4aHjIR8d3N2b2NgZXJiXVJcSUpGQUVIST47QDg9NDU4NTo3Njo8QD07Pjw7OUA7OTo8Ozs8Nz09Ozo+Oz08Pjw/Ojo8Ozs5Oz89OTU7PD48PD0/Pz46O0BCOzk/OTg7PT0+PzxBQEQ8hqugnKegp6Oim6CbqaSlqaCfoaGmn6ifmKSim6mmoqarmqOwsamotdDU19rSx8bLtLbCxrK2qaKlpqGiq7WnmrGhlZSMkKatq5yVmKGdm6Gin5ydm5WKd2ljYF9fX19eX2BeYmx1c3Fwb2xycXWSxMfG1NXW19fT1s/V1NrU1M/P1dTU0dLM0c7T19bT1dDP0tPRydPRyNDY19jR19LX2dXWzM7Pyc3Ry87Pv8XCx8XOzdHQ0cjLzMDKy8XTzsvOyMTJxsbIzMrT09HVz9LM0sG5xbGlqLWup5qorKWdsqiws6ysk4+TjoiLjoOPi4SQjpmNk4+Zj4+ChYx7enFzdG1hY2ltX1ZQX0pKQkZDUU0/PD40NDo9NTI3NTU8PEA8Ozw6OTpAOjg7Oj46PTg+Ojo8QD08OTs9Pzk6Pz07PTw9PTo2PD0/QD08PT0+OjxAQjs5PDc0Oj48Pz89RkFEPYKknKClnaWlo5mcnaSeo6OfnZ+doJqnnpyhqaCvrqqqrJ6mrrioq7fY1NXZ2dHO0MC8zMm3wK+nq6mjpLG2s6O2qaiooaqpoZiWmJqbnaGemp2elH5yZWNiX19hYF9hYF9gYF9gZm1wcG5rb3J3d5vMwNLV09jY1tnR0tLXz9POy9PN1dTSys/M09bS0dbNz9XV0cbR1MrR1NXWztLQ2NjY18vIzcPJzszJy7/Iv8jJzc3Py9DNzsvOz8fLz9DKzsrCycbJzMrL0dLM09HQz8/Kvci5sK27uLWqtrCtqLits7+7sZqPn5SRjo2IjpCFkY2ZjJGRlY6RgIWIeXZvcG5rYWRucGFXXFpJRkZETFdFO0A8MzM8PTg2ODU1Oz5APTk8PDg8Pjk8QDtAOj04Pjk4Oj88PTg7PkI6Oj08OkE9PTw6Nj08P0A9PDs9Pjg7QEE9Ojw4ODs+PD4+OkVCRT6Bn5mlp6Cfo6eam5+cl56eoZqdmpyappueo6eeuLa1ta2lra6+tLHA2dLX2tzWz83Lw9PQwsKyq62urKazsbirss65q5+clpSXm56fn52UlpeViWxeXl5hZGJgYGBhYGBhXl9fXl1ibXJvb3N0dnZ5pL7L1dHW1NPY1s7O1MvNzsXOytLSz8bOzc3UzM7TzcrX1dDM0dTLzNDR08rO0dXS1dXKwMrBxczCyMnCzMPFyMrKzsrMzM/N08vFyM/MyMfKxMbAxcnLzdDRxtDOzc3Mz8XHwLe5vcPDvcO5srO+sbzExLWqmKWhmZaRlZWSi5SNm5GUlI+PlIKJhXhwcWtuaGBgcWhZWGhWTUdMSVBQQjtEPjs2Nzo4OTo1Nj09QTs6PD05PD05PT06Pjo8ODs9OTtAPD47Pj5BPDk9Pj1CPTs3NzU/PDw/PDw7PDw4O0FAPDo8OTs7Ozw9QTpFQUU+hJ6bqK2epKSqnJ6fmJKXm5+am56ZmaKVoamppcXDwb+7tbKxx8O5y9XW2drb2MzMz8nW1sXEuLK2qqSurLm5sLbVoZWOjZiWkJOSkZaWlpCMfGViYmJgXV5hY2JgX2BgYWFgX11bXWdycXFyc3FtcnmkxtPPy9DP1NXJxcnJxsa/w8bPzsfFx83K0sjLzs3G0dLPzszUysfLzs/Hx8/Sy9DPxbrEvsbJvcLGyM7EwsfAx83Hw8vJy8/Hw8PPyMbBxsfDvsDHy8vMzsLKy8jHy9DExce7x8PIyMLPwL28v7DByse6vaqxsqelnaKcmJCbkKSZl5mRlZiJj4J3bnRkbGBeZnFhW1dgR0hIR0lNVEc/Sj02NDM1NT08NDg9PT06Oz08OTo7OT89OTw7PDg6PDo6QD1APD09Pjw6Qz48Pz04ODk6QD4/Pjw7Ozs7ODo+Pzw7Ojc5PD49Oz49RkFDPYOgm6qupa6qq5qdoJeUjpedmpmgmpqcm6WzsazJzcrIxL69us3NxtDV1dna29jQytDQ0tTKxbq+vrCot6u+urfBrpGOjpaQhoOEhIJ+hYV/dGBbXl5eYF5gY2RjX11dXl9gYF9bWlxha3Jyb29rbG9vfbjRyMnKz8vNxLrAw7u7urq+yMbCw8DDx8rJyMrIwcXMxsjLzcnEwsvJwsLL0MTLyL+5wbvFx72/xs/Kw7/Du8nGyLrHxsTKwL3By8bFw73FvLy/w8TLxcW8wMnCxcfSxcDIv8rKxsjG0MPDxsOvxMvHxMq3v7y6tKmspaWYn5iso6GlmqOgm5R7dnN0ZmpbYW5tWltYUURMRkJHRExERlNANTQzMzQ/PDM6PDw7OTw8PDg7PTtBPTo8Ojs3Oz05Oz07PTs6OD4+PEI+Oz88OTk7Pz07QD48Ozk5OTk6Oz06PDo2OTw+PDs+O0NCRD5/pZypsqm0rrCdnp6YnImUm5man6Kfmp2ov7i8ys/RzMfCw8fNz87N1dDW2djZ0M3Uzs/Qy8S4xsG2tbyxwLe6sJGMk5eHe4CFhoB2eHVycF9aW11gYWJjZGRlZGBcXF1dX15gW1laXGJvcm9raWxwb3OPxrzJxczAxsKxtrqysrOyscK8vLu5uMDBwcW+vbm9v7nEysXGwr3GwLi7xMm/wsm7t7u6xcO+vMHNwsa+vrXAvcO6vMa7wrmzvMXDwsK2v7W1vr+6y8O8tbrIur+9y8PBxcLGyMbIxtDGwszIssfKw87NwcXCv72yt7Czp6ioubGlrbCrrayUeXZ3amVoYGhvY1ZeWUpFSkZIS0FGQkVJQDk6NjQ4ODUzOzo7PDk8PDs5Ozk6QD46Ojw6Nzo7Nzo7Oz88OjxAPUA/PT8/Oz07O0A8Pj4+Ojk5ODk3ODo8PDw7OTo8Pjs7PjpAQEU+fqygrLWqt7SyoZ6fl5qNlJaan52mop2et8bCxMjO0svKysfNzs/SydHG1tXW2M7M0MjNyMrFvsrBsrW6t7u2sJGNiouFeYCGhoB+hHx0dWRcXF1eYGBiY2JiZWViXV1bXF5cXl1aW11daHNxbWdnbnByeZ29zMDDusG4rrCwp6qtrKe4tLe0s7KzurW9sbewta+yu8K8wcS8v7u1srq+wLjHubS7tsDCvLe9xsDDvLWusra6vrPEt7u1q7i8vcC9sLq1r7a6ssW8tq+7v7S2tMW8vsPFwMPFxsjLxsDGxrvIy7/PysfDxsHDt8O+vba5vsa/rLW6tbe2jnh0eGdnZWJrbl5WXmBGS0hISkZCQ0FFRT88OjU2NTYzMzs6Oz06Ozs6Oz44PEE9PDo7ODc5OTk7PDo+Ozk+Pz1APz5CQD1AOjo+Oz89PTk6Ojo4NTY7PT48PDo7OT49OT86PEBAPIi3pauzsby8sa2foJmUlJiXnqujr6qnpMbLzsjGyc7M0M3OycvJzMrLxtHP09HPyMvGysbEwL3PvbO5vbm4t5yOh4mJe3l+hoZ3eIJ9dGheXV1dX2BfYGRhXmNlY19fXFteXF1eWltbXV9scG5oZmpubnJ8pMe/ubi1sKysp56iqqeeq6yzramrqbOutrCyqa6mrLK8urbDubq6saq1ubu0wrqwv7G9vbu1u8e5wretqqiwscC1uLyvsKexs7S7vKuttaWutq66sbCqua+tu667uLu/v725wr/Hw8XBvMbByMu4xcfFv8fDw7rExsK7xcnMy7O5wry6sohydnZraWFibGhZWFdbQUxLTUlFQUM/RkE6OTo5OTU4NTQ6Ojk7PD07Ojs+ODtAPD05Ojc5Pjk7PDo4Ozs6Pj05QT0/QD87Pjo7PDo9PDw4OTg5NzY4PDw9Ozw6Ojs+PTs/Ozs+QDyKwKuouLe5w62zqZ2ZlJaZoZymsLWxt6bGz9LMxMbBxdDIz8LEx8HGxsXFzMTLzMLEwcjBury7yre0vL22tauRiZCQfHl+ioV6e4SBd25eXV1dXV9gX19kY2JjY2JgX15bW1paXVpaWVpdZW5vaGZnaWtucoGtubC1rqalp6eaoKSgmpylq66jp6KrqqyqsKOmn6qttbaxvbmvuK+orri0tLy4s7yvt7m1sbvBscGupaiirLGys6e8qquoq6yttLSmqK6hpK+psqWnqK6lqLessLK3ubq7sby9vr7Ev7XBwcfIt7/AxbfEwr+7v8TDvsTIzMq/vsPAwKmGcnRyamldYW9kV1ZYUEhaUlNLRkZFPj9AOTc4OTc3NjQzNzo5OTo8Ozs8PDc7PTs7Ozw4OT44PTs8Njo9Oz89N0E+P0A/Ojw8Oj05Ojs6Nzc3ODg3OTw7PDs5Ozo8OTc5Pjw+P0E7jMKvrry3usSwtrCbmZWcmKqpsLGztb2vxtHQzcTIu7vMw8zAvMq5wMbAvMy6w8fFur3Evrq3vca5trm7rrKVg4mNgXt+gH54dH98c3dmX11cXF5fYF5fY2NhYmBgX15dXFpYWltbWVhaXF9ma2ZlZ2Voa29yhaqlrKagnKGllJ6km5eRoaOqo6KfpaWnpaygnZukpqyyr7a3p7Csp6q0q7S5sLa0rLa4sbC6ubG3pJ+jn6exp6uouaqkpqeop7KtoKemn5ukpqyen6ekn6Cxra2ssrSytLC1vLa7wcGyur7DwbK5usKzwL2/tbi7vb68wsfEwsO/v8Sgg3dwa2FlX2tvYFVZX0hOaE9UR0VKRjw9Pz06Ozs4MjU1MzY5OTk7OTo6PDo3PD88PDs8ODg8OTw6Ozc4Ojo8OTg+Oj89OTg8Ojs9Ojc3NzY3ODg2NjY7Ojo7OTo7PDg1OTw6Pj5AO43Itba9uLrBu761oJ6VnqGmurars7O7s8XQyczDx7m4ycLOwbrLub3Iu7fIu7fExrO+xby3sLnAu7Gzt7CihIeHgn15dnRvbWtqanFpX2BdXFxdX2BfYWNiYGBgYF1cW1xcWFlYWFhWWFtdXmRjYmVnZ2dqbW+Inamgl5WaoZabopiVjZ6hoqabn5+jpaGnnpuim5+qsK2xtaKpqqmrrKS1uK23r6yytK6yta6wqp+dnqOisqSlqbitoaamn6isq5mfoJ6ZnZ+lmpmjnJudr6mrp6qrrK2wsrivuLm7sLa7u7qrsrK5sr20trGxtbS/tr3AvcPBuru9l4N6cmtfZV5kZFhUWF5JV11LUEdJSkZBPD8/QDs/PDA0NTM1Ojs5Ozg5OTw8Nz4/Oz07Ozg4PDg5ODw3ODo7Ozo7Pzo9Ozc4PDo9PDc0Nzc2NzU3NDY2Ozc5Ojs6ODo5ODo7OTo8PzuJyba4vru3wcHBtKSkmZukpsCyr7astLfG0MnJwce8vMXF0MC8yru7wbu2xbi1wcGzwsS8raq1ureosbOpi4aIgHlzbnBua2JeYmZmXV1eXV1dXF1fYGFiY2NiYV9cW1taW1lYWFdXV1hYWFteYmRkZWZmaGlrco2onZSUlJuYm6GWlpCcoaGonZudpaahpZygoJqYra6trrKgpaKtq6ehtbCxsaynrrKnurOmtqGinpqjoq2ioam1qqKjpp2lpqOWmJ6XmZqdn5mXnZycm6yhq6ajpKatq7OzqrSwsqqyubSvqa+ysrK3s66prK6yuLC6trm9v7eysZSFeXVlXmVeW1lWU1pVS1tRTElFSEtJQj0/QUFAQDoyNDUyNDk5ODk7OTo9PDY9Pzs8Pjs3Ozs3Nzc+Njo+Ozo4Oj07PD06Ozw6PTs4Nzk3NDY1NTQ2Nzg1Ojo4Ojk5PDg3Ojg5PkA6gci9uL2/tr69v7OdpaOYpbHCtba9rbS4w83JyMHGuMLByNC6w8bAtry9tsO6tr/Btbu/u6qmsbuxqLKvm32FhYB5cHF0cWhmZGllY1xcW1tdXVxbXmBhXl9fYF5cW1pcWllYVldXVlhXWFhWV2FkZWNkZWRkaGp2opyUlI+Ulpefl5mUmJ+eoZyWoaGoo5+eqJybmqqmr7Crm6Ojt6qgn66otqmmpqywo7ewpLegopuYmKqmoZusuK+ioaScoZ+gk5WhlJaWm5iXlpeclJ+pnamjoZ2jqqqwrqi0q6qmrbKwpaqusrGvsK6vpqensq6xtK+8tLm3rqOUgXl1ZF5hVllXU1JUS01eTFBLR0dMS0U8QD48Qjw7NzY1MzQ5ODg5OTo5Pjo4Pj47PTw8Nz49Njc2PTc7PTs5Nzk7Ozw+OTk6Ozo4Njc2NTQ1MzEwNDU2Nzk6ODo5Ojo3Ojs5OT1AOnbAvLS5wrG+uLyunqeno6q7wL3Aua60uMLNyMfExb7HusrNtcTFxbG/wLnAwbrAwLm6vbeoqLG7pqmipYmBfnhyamxydHBpaGVkZ2JcXFpZWlxcXF1eXVxbXF5cW1xZW1xaWFZXV1ZXWFdXV1VbY2NiYmNiY2RmaoGWk5WLkZSTm5mclpaboJyflaCfpqWkpqefnJ+kn6qvpp+io7aooKGiqLOhpaekr6Wwray1nqCdlZSpoaGUrLGwnqKinZ6Ym5OLoZSRk5eYkpeXmJadppumoaKZo6Wlq6SlsKelo6urraWorq+uq6iqqbOlpquvtLGuvLWxr6+gknp2cmRhXFpdWE5MUUdSYU1WUE9KTU9FQkQ/OT02OTo3NjQ1OTk7OTg4Nzs4OT0+Oz47PDY5Ojc7Njs3Ozs6ODU6Ozo7OzY8Ozg4NDY4NjMzMjEuLzI1NTY7Ojg7Nzg3Njw7Ojs7QTh4u7uxtb2wu7K3rJ6kp623u7zBxbqxubXFysvBxMfHybjIxrXFwsmvurzCvMPAwb28t7q2pqeytp6iipmIgHdvZGJnaWhmaGpnam1gXVxbWlpZWlxdXFtcXl9cWllbWVlaW1dVWFdUVFdVU1RSVWBgX2BhX2BhY2RpgZSTiZGOlJKTnJSVlqOZoJacoKWhraWkpKKjoZuqqqWZnqWxqaCgnaSqnaehnqysqaitraKhoZSXo5uckKupsJufop6el5iTip6SjZKTlY+YmJKboaKcpKChlaChpKabo6uloqSqo6uupK6xqaalpqa0pqmorbO1tLm6r6qsnotycG9gW1dWVVFGUU9IWlxPUklUS1NMRUdJQzg7Oz08ODY2Nzo5Ozo5NzY5Nzc6Ozo9PDw3Ozw4PjU5ODo4ODY1OTo7PDk3Pzw5NTc4NDUyMTIxLi4xNDI2Ojg2OTg1OTg5ODk7OUA5e7W0rbS7srCssq2dp6evubmzwMi6tcCvxsnOu8LLzcm3y7+0wMfMsLa9yLvCx8S9v7e6taWrsK6dmoeOg3x1aWpqbWhqbG5ra21lXVxcW1tcWlhaXVtbXmBgXFhYWllYV1hXVFZWVVRVVVJTT1FZXVxdXl5eX19iZG2Oj4SRho+Rj5mTlJKcmqKcm6CnqKqoqqaopKOYpK6klJmlr6mfm5iaoJ6umZuqs5+lpp+jo6GUk5uWlZKoqa2anKChoJqUkIyZjouQjJKMlpSQnaGgo5ybopWboKKgl6Koo6Koq6Crr6Stt6Wjo6Ksramoq6+zuLK9tbOrr5iDcnJoW1hZU1VSRVlMUFxZTVROUExQUklOSUI8Pz9BPz02NTc5OTw8OTg3Ojc5Ojs8PT47Nzs7Oj02Nzo7ODk3Njk4OTo2Oj05OTU3NzU3MDE0MS0rLzQzNDk4ODo6ODo6NzQ4PTg/OX6zrqiztq6pqK+tm6morLe2rLzKu7a/rMzHxrnCz9DJtca+ur7Gy7WxvcW9w8bEvcGzua+mq6+rnpeGgXd4b25pbm5ucWdnaWdkXVpbW1tbXFtZWltcXF5fX1xYWFlYV1hXVlVUU1VWVVVUU05QUVlaWlpdXFxeX2Bkfo2Bi3+LkIqSjZeRl5mioJufqqmmraqnr6KnmZ+soJWWpKinnZePjpmdrpaXp6qZn52UpaGekpCSkpKVp6qkmZmanZ2WjYyLlIaIjYOQi5KUkKCeoKOXlZ+VmqCinpObpaWnqKigsbCmsLynoKOstKutp7C0sLm1wLGtsauQfXByYlZUVU5SSUdWUVNSTExYTUpMTlJHTUtBQ0ZEQz5ANzU4ODk7OTo3Ojo3PD06O0A+Ojk7OTo/NzU5Ojk4NzY5NTg3Nzk7ODU1NzY3NjEzMjEtKi4xMDI4Nzc7OTk7ODk0ODs4QDh/s62msbeqpqKwq52qp6mysaS2xrS5urPLxrq8w8vRzLO5ur7AxMe2tLe9s7u8xL7CsbSusa6xrJyiiGtobm9yb3FrcGtkZmdlXlpZWllaWlpbWlpaXFxdXFpYWFhZWVdYV1VVVFJTVVNWVVJOTk5SV1hZWVlZXFxdYWqAen91iY6HkImYiZSUl5uZnaibn6qlpKqcp5igpZuSj56impeWhIORmqOPk6KclZaVh6KampOLjoqPmaOnnJWVl5uQkoeUjoyBi42AkIqSkpGhmp+hlZOYmJWipZmMmaSmqKahoLSyp7K3oZ2it6yqraSysqa1vLWrq7GjiHhybV1OUFFMT0NOTk5QS0ZOTkpKTk1RSU1KQUdLSEhDPjg1ODg4OTo7Njk6Njg7OTk+PDg6Pjk7Pzg3ODk6ODg2ODU3Njg4OTc0NTc3ODIwMzAxKiktLzEyNzc2Ojk5OTk4NDk4OEE3d7anpLawpKekqaWgqaWks6qissO1tbKzx8e4u8TKzce1r7y/uLzEs7OutqKttcS6u6+qrLSvr6CXqH1eYGdzcXZxam5pZmhoal9YWVhYWFlZWVpaWVtbXFxZWFhXWVlYVVZSU1JQUVRRU1VRTk1LTFNXV1ZYWFlYW11hb3N2cYWIgoeAkYOOipSRk52gjpqcoqGjmKSWoZuVjYeYmoxzjYJ9jZaWhZCZkJOOjnuZjpyMgop/iZifop6Qk5iWhI6Ck35+dImOepCGkpCQnZqZmpCVj52OoqOOiZqgoaSjm6K0r6yvrJ+YpbmmpbChsK6csLuqqa+qmYF2cmJWTFFPUE1DU05MUU1DUFBISU5TTUhKSkRKTEVKSz03NDk4ODg7OzY5Ozc6PDk6Ojs3OT85PkA3OTo8ODk3NjQ0NDU4NzQzMTI0ODUvMDEwMikoLC0xMjc2NDc4OTo6NjU6ODdBN3e3oqO0qKWlqKOmpaamprOnpbTAuLC0sMrGubrCz8e/ta+9w6+xx7Ktp6yVpK6/uLGwn6etrauWlaJyV1ZfaGdpaGluY2poZ2JcWFhYWFhZWVlZWVlaW1tbWVlZVldXV1NUUE5QTk9PUFNUUk1NSkhOU1NTVFVVV1lbXWlscm1/hXx0Tlhyj4KXho2cl4qTkJ+XnZWUlpSOlol/k4lfO1dve4uTiX+LkYyPhYZzioSWgXmCeoWTnZSDlY6Qj4KGfZJ4cW+FjX6JgJCNj5eZmJOKj4iciJ6Xh4iWnpqhoJenr6itqaifl620oqatmKyrmKe0oqmto5J9cW1fWk5TUVZMRFRKUE1MRk9PSUVMUU1LUEpJTVBGSUg9NzU5OTk5OTo3Ojs6Pj44Oj09Njo/OD4/NTg5Ozc5Njc1MzMzNzYwLi0vMzQ0MTEwLy8oKCsrLTM4NTQ3Nzk8Ojc5Ozg2QTl4t6CjrqGmpqqgp6mnoqmwqKe0wbmxtbDJw7m0v8/AurGxuMSrrsmup6Oehpuiuq2nqJampaShl4+WaVFNUlZaWlddXmJnY19ZV1dXWFhYWVpZWFlYWVpaWllYWFZXV1VTUk5MS0hHYlxNT1JNS0hGSE5RUU1QUlRWWFpgbW9pe4J0UEJAf5WRkX2JlIyEio2bjZaVipKIhpWGeYh/YEpRbniKkYR8hIyJhH9/bn5/lHd1dniEjZlwUY2IioZ7fniUdmd3hYh+ioiVio2QkpaLg4mHlISajIGEkpuWnpyUpKOnqaWjnpuwq6GkpJCmqpahqpyipqiIdGtlXVtIUVFTTElVTVNJTExQSUhGS05MTVRLUVFPRklDPDc2OTo4Ojs7ODo7OD4/OTk+PTc7PDY7OzQ3ODs3Nzc1MzQ0Njk2LzMvLjEyNTIyMS8sJykqKiw0ODMzOTc5Ojk5Ojo6Oj85draco6edn6Guoaeopaeor6yqtry2uLazwry3qLrJubepqre4rbbAqqKbk4OPmbKfopqNoJaZlJGLjGVNTE5OT0xNUVdbXFpYWlVVVlZWV1lZWFhZWFhZWVlaWFhWVldVU1BNSkVAQJtrc3NJTUtERERJTk9oWU5RU1RVWm6DdHd+amldVY+JlIl0f4aBe4WMkoGSmYuPe4aPf3V/eHNudXB0jY2BeX2JqoV5emh2e45wcm14gYqMknh6gHuAdnNykndndYSEhIR6lYmIioyLgH+Eiox/lIN7gI+YlJuVkZ+dqJ6foJ6gqaWfnZiMp6SToKCWnZ6kf3FnYFxcSlZPUUdLWFJPSk1NUkpKSk1QSExRTFJUTUVIQTw3Nzs5OT49Ojs8OThAPzo6Pj03PT03OTk0Nzc5NTY3NTI1MjU3Mi8yLiwvLzIwMC8tKygoKS4xMjcyMTk4Nzk4Nzc1Ojw8N3aumKOhmJyes6mvqaWsrLCxqr20sry4trq1sqC3u7OrnZ+tq6y1s6WelpKYhpSklp2Mg5eJj4mGhoNmSklKSUdGSEhQVFRUV1dTVFVVVVZXV1dYWFhYWFlYWVlXV1VWVVNQS0Y+OTNOPH6eTUhKREA9QURqlH5MT1FSU1ZedYN9eWd3jZeYjo99Z3mBdnh/iY98hJiSgXKHj3x2e29rfq18c5CKf3uGkoB9f3RmdnyFbG9oc3yJjIeAbHlxfXBtdY9xaHGAfY5wQ4qEgoOFfnd3eouFfYt6dX6Oko+YipKam6OXmZ2bnZ6inZaNiqSbj52XjpaYjnVta2VhWVdYVFFKUlVUT1BOUVZLTktOT0pRT0lPT0tGRDw7Nzk7Ojo/PTk8Ojk5Pz87ODw9Nzw5OTk5MjY2ODU2NjMzNjIxMjI0LiwsLS4uLTAtKyonJyouMTM2Mi84NzY5NjY1Mjc5OTV5ppefnpagpq+srqunqbCvsay8uKy7vrmzraibsaitnJCXnqesp6SbnZOIln6OlZKVgHyKeoWAf3+BZUpHSEZCQENESUxMTVFSUFFTVVRUVVZXV1dYV1lZWVlZWVlWVlRTUUtENzhmNzA/qGlOSEM9OzpEioV6WkpOUFFUWF5lcHJtiKeqwH51eWJ7eG98eYiPeXyLhW9tjJF4c3hqan+CcpaRi4F9ln9JkphuaHd+gWxpY2x5hZCShmtzbHxucnuGaG1wfnONiIOFen1+e3ZvdHSFgnmBd3B8joyKk4OWl5iakJOWl5mXnpeMg4mfkYqSjIaQln1saG1ubVdVV1RRUVlPU1VVVFhVTU5ITUpNTktDSU5HRUA6ODk7OTk6Pjw5PDs6Oj0+Ojg6Ozk/ODY4NzI3NTc1NTQxNDQyLzAyNCorKiotListKigqKCcsLTEyNTAsNTU2NzQ4NUhBODk1d5mRm5manqStr6Ktqqi1r66stL+rvMK/pqOalaWYno6FjJaipJualJePdpF+hYuQj3x4fnR9eHV3fGZPRUdEQDw+PkFGR0dLS0tNUFNSUlRUVFRWVldXWFlaWVlaV1ZUU1BMRTFAmjMganJBmW87PDk1PICChl9JTU9PUldaUllcYKeIYpppdHplfnBtf3qLiHWBiIZ0bJmRdHN7amudjkx5hJKJhI5nMXaGc2x+fYN0ZmV0foSEhYBmaWx1a3B/fGdwcHtuko2Oe3N9fHFwbnVtgn53eXRpeYmCiImDlpOSkIuNkZSVj5eOgHmIl4iGiYZ/kId1aWluZ2NXUVlXWFlbTVBVVlpZTklJRUpKSEdCQUZEQ0c9OTk4Ozk6OTw6OTs6OjpAPDk6PDk4Pjc4NzcxNTI0NDUzMzY0NTAzMS4qKispLCwrKykoKycpLCwyMjYsKzU3NzU0NzhpTzg7NW6SiJmRmpakqK2esp6muq6rsrDCsrvDx5uXj5SZi46GeoWRmpaPko6SiXSKhHeLj4x/dnd1eHZveHNpVUZJRD88Ozk6P0BBRERFR0pMT1FRUVFSU1RVVlZYWlpZWFZVVFNQS0U4MC9cYLNHOVhQOzk0NDGWuotITE1PUFFWTEFJUUlir7OgcXx4bX1tcYOBhYF5hIaGeXKglHR4gHN1lIc1cZ2onY6hoYSihHZwhnyHfHOMrY2IgGhmYmlucm1wg3Vpb1h1b46akXZsf3p8bXFtcH96c3VtYnaEf4aAhZCRiouKkouRjIuPg3V4i4+AfoKAfY94cG5ual5aW11bWVhgX1NOW1tZWExISkZKRz9DQUJHP0NEPTs5Nz07Ojs7OTo5OTs6Pzw4OD06ODs2NjY1MTEyMTM1MzQ3NTUzMS4vLCwrKSopKSoqKikoKikrLzNETTIxNjY2NDM8dlI3PTdikoGSiJaRnaSnnq+VpbSorbGuwbO6wcaXkIyUkIGJfW6CkZOKhIuIkIh2hIVvmIqMf3l7e3F7dHxrb15KUEc+QDc0NTg7Ozw9PkBCRUhMTExNTlBRUlVVVldYWVhWVVRTUExFPDUqnUtbQC1nSTk0Lz+Sg6muX0dMTU5QTDdDTVJTREqGdoB8fHZ+bHaIiHx9hYN/jH52opl5foaAhJmFm5xhhqqfnYuCkI16dol+iYiOc4qXj4N7XGRxdHp7d4psZ2lheG+Fj4J6boF3c4R6cHN5d2tuaV13h32HfIiHj4CLk5eDjYaNhn1xhH+EfHV3e32IdG1xcmRlXlpaXVNbZl5YUVVZXVZHS0tFTEc/RkBEQz9BQT06OTc8Ozs9PDo6OTk7Oz0+Nzk+OTk4Njc1NDI0NDAwNDY0NTY1NC0sKSsoJycnJigoKSkoKCsrKy8wMFVxPDIzMzMxRX5XND05XIx3iX+UjJGdnZ+mkaCqn7Cpr8Cxu8a6lo+RlIh6hnZrgIySg36LhZCNeYSCdaKGjX5+goBzg4F9bHlsU1hMQUUzMTEyNjY2ODg6PD9CRUdGR0pLTU9QUVNUVVdWVlZUU1BNRkA6Mj0gI5ZjjFs1MzExaT9Hb0lGSUxNT1JMS1RdWVJKaYSIe4l5e3F8j4x7fImGfpeHdqGZiIePkpSljaypSIatr6+KgICTioKLgoSRqIeAmJiKnHNsfIGGh32OaGdneH5uhYaBhXGEhkdrgHdxeXZobWtfd32DiH+IhYx6lZ6ciouJkX97dYt2fHdtb3d+fXFxcGpaW1taY2JXZ2VcVVBRWFpRRExMR09JQ0ZDQ0FAQ0E9OTg4Ojo6Ozs6ODg4Ojo/PjY7Pjc1ODU3NzMzNDQyMzY2NTY3Njg7REZMTU1MQzcrIiUnKykrKywvMDArbnUyMjQyMEyBXDU9PF6EdHx+ioWHkY+WmJKXoJ2soaa4r7O9tJeNkouYi310cH+Kk39+jYOUlX2Gf4elh4mAg4iGeYmLgHWFeV9jVkxDNjAuLzIyMTIzNjY4Oj0/P0JFR0hKTE5RU1RVVFRWVVNRT0dDPzgwLCOHWz4/ODQuXZZwc6NVRklLTU5QV2BZcFpcXmqNk4eVgISChZGTfoWJkYGaloKgoZiVm5qlrZOZu7Gnu8fDp4qMoaWOk4mBkHtyg56fkZx+doWFi4+HkGlob4OAdIyGhItxhoJ3h397doV9bnZ1Z4GUj4aJiIiJiKKro5aJjpiAe4KJenpvZ2t4fXd8cWljXFlZXGhcYWZfWk9MTlhTUUlQS0ROR0NKRENBRERBPDo4Nz08Ojw6ODg3Nzg6PT04PD02ODY1NjYyMzQ0NTU3Njg2NzxCQj88ODo+Q1FeZVxHMicmLCwtLS4xKD+MWy4zMTBPg180PztudnBneIN7gIyAgZCPi5qapJyhrKarr7CXkpGEoZSEeHeAjZR9f5KGk5Z+ioGSm46EgYKMi4KKjoSAioBtcGpeQ0E0LS0vLy8vMDIyMzQ3Nzk7PT9CREhKT1FSU1JTVFRSUE9IREI8ODcvOUM+PDw2My5sk5dNUEhJS0tLTlZgY39nZ211nZuPmpOTi42OmoiTj52LoKGSo6mlo6yTqLaip8HCrsiveLqUmnyMoZ6YhJOFgo+hnpOZkoSKhY+YkZZscHWJi4GVjI2Pdo+EcWyFgYqWkoOFiHKJoZeHk4mPj5eltqmbjZWig4eThH5/a2psfX59f3FfW2JeWWZqXGxrX1hLSE9TUU5NTEZJUURETkZCQ0VHQj45OTc9PDo7Ojk4Nzc2Nzs6Nj06Nzg1NDU2MzQ1NTY2NjY4NTU2MzEwLiosLCkoKS46UGFcQCwoLSsrMCwncog3MjQwT4RiM0A8dW5nWXCDcHWHcXaRhn6XlpqUn5+bp6CqlpOYnmhmpJp+hZOSeoGSiZKSfYuFmZKRg4GBi46JhpGHhIiFeHh/aE5SPi8vLiwvLi0vMDAwMjEyNDU3Oz9DRk5QUlRQUVFTUU5QSUVEPjs8OkNGPz48NzUyPD9SNUhISExMTU5SXm+KfHOBfaCdm6emopmhl6KVnJ+onqmrn6isqaq1l6u/q7bIybfI0c++m6Bwaaupn4STkoWcoJqamaeRkYiVopqad3p+lJeRoZKWl4GUnnt2lZKrs4mNl6B9lZ6cjpOWmqSjp7awnZGZqIiXkI6BiGxzc3t8eW5mXltfXmFnY19nZ1xSRUtLUU9JSk1GRk1DSExGRkNCR0RBOjg1PDw4OTk5NzU2NTg+NzU9ODQ3NDU3NTQ1NDY5NTg6NjE2ODYzLzAuLSosLy4tJyMqO1hiQigqLDEtKEuXXjA2M1GFZjNBQGliXlBxdWBufWF3jn18lI6Oip+Sl56WnKqYnqpCRH2HiYiYjXmCjYuOjXyKho+QjoGDgImMiYWThYKGiYGAh3dfYlA0NjAtMS8sLjAwLi8uLjAwMTU+QUFNUVJTUFJTVVNOU0xFRUA8Pj1GSEBBQDg2NjI8OTtGSEdJSU1PUVlthpB3lYujp6q1vbilrqysqKm1rLG3srKtu7GzvpyzxKy7ycu4w7+3paOwsqytqqOLlpiFpaagopiCppmNoqqopIeFk6OgoKqgpKmOnLGLlaOnt7ucoaOwk6Odo56RpKKrsK2ztaKVpqqJmoqTipV6e36De2VeZlpjYF1iYl5mZ19bT0RKSFRPRkhMRktHRkZIQUtGQ0ZGQTo4Nz08ODg6OTc0NjU4PDU0PDc2OjU0NjQ0NzM5PDM4PDIwMjU1MS8xLi0qKi8sLSooKiYlNVhYLywwLCwwhIE4NzFQhWg1QUNbWFRMaWNXanBYeoV2gZSFiIKbg5KRjJLayJ2Wc1aXiI+InI98hoyPi4p7iIOHkY6DhYGMhoWIkoaChImGh4eHcW5hQEU2NDwzLzExMC0sKy0xLy00P0RBTlZRUlRVVVdVTVxRR0dEPD4+RkhDREA4Ozw1Qzs9RktJR0hST1BXgZOghK6js6qywcfEq7PFtq20wLO4vra/tMG2u7ukuMaptsnHtr65tKijtK2wsZuZkpqfiaevqqSVd5+kl6GrsbOYlqmtqK61u7K6rK+1orGssrW8uLSutaCoqKOom6mwrbO6uLionLipjaWPkpOgh3mBgHJXX2JVZGBgYV5fZmBbVUpERUxWUUlKSkVKSEVBQEBLREJNRjw4Njc7PDk3Ojk4NjU1NTcxMTw4ODk1NDY2NDk3Pj0zODkxLjAxMjExMzAsKiwuLCsrKyooJyopRVowMCovK2iSTzYwUodqNkFFV1FKTFxaUWNkV3p1cYGVfYSGk3aGfoCNe7+7o7yCtJSTjpuPhIiPk4qJeoeBjJONh4WBjoCBio+GgIaIhYqHkXp5bl1XQEVOPDY6NDZBQjc2NC8vNkNIQ1FcT1FVV1VdV09fVUlLSkFAP0dLRkZEOz5AN0Q3P0JKSkVHV1RQXo+kraSytMO2uMHMyra7xL2ztMG3uMK1v7C4dLG0prrFpLDGubGzsrSopLa2qrGgopabopKlsa2lraynpJigrLO6oqiyubW7vsy/xcW9vbPCt7q3v7i6uLqtrbGmsaquvrC9vMPDrJm7qJWuj5iZq4l+gHloVWFfVmhjaGRWW2NZVlRKSEdMUUdESUpBSUQ+P0JCS0BATUQ5OTY2OTo/Njo5OTY2MjQ2LzE5NTk5MzY0NjI3Oz0/NjoxLi81ODo5NjUwKigsLS0tLCwqKCgrKyhFUy8qMDBKj2s1MlCHbTY/RlJMQUxSV1RZVlp3anB/j4SBjoVve3J4iGK5oZmjiZWUlpOUlI6Ql5KHh3uHgY6WioGEgYp6fIuIhnyKgoGLhJV9eHp1Zk9cZEdFTDpRZGBbXlNGPztIUERaY1FRWVlaZ1pTYGFNU09FQT9JSkhFRkFAQz1FNkI/SEdLTVNaVF6Ur7i1u7nJwLu9ys28vMG8uLa8u7e+tbqzxmF1sqWxmp6rvqqlqKuqpKKytaCrp56Vlp6Yn66lp6eln6SToqews6iysry2wb3TycnTxsLFzMLKxMC+vr+8vLi0sLm3t8O6xr7EybCeuquirI+lqbeJgHxuXV9eXFVfXWhlU1hhVlNWSUVGTktBPkhEPUtCPUJAPUY+O0hANzk2Mzc5PjQ4OTo1NzA0NS8yNjM4OTM3NDUyNj84QD5HS1JUVFJQT1FSUUpBOS8sLCwqKygoLC0sL1A+KC40OIB9PDJLiHE5PkNLRUBKTVBSTFFdaG1scY+NhpBzbHJydIjVwLWaoI2VmZmRjpeSlpaOhoh9h4ONlop+gn+DeXuLhId7i3mBioKXf3R9emtlcHZZXVxQZWViYGVkXVtYWFxNZG1VUm1uX29fWGdlVVlUS0RCS0pIRkhISEhCSTlEQEhLVFRWXVpck7nAub64xsG7ucrLu7a6tri5tLi1ta62t5lkdamerXBeoq2cmKGim6Seq6WUn5+QlI6WmJeonqafn5qZg6OdrKSqsa23sLy41NDO1s/JzNLMz87Kx8C/wsq9wb3CwMXExsrAyc+0pLyxtbCcrLm9mn12aVtdWVdbX1hiYlFbYVRSTENCRkdFPEBGP0JJQkBEPTpFPj1KPzQ3NTM1Oz00Njg5NzcwMjIvMjQxNjk3NzU1NTVEM0VMTT41MTAwMDY6NDc3QElPSjsuJioqKC0uMCxATSsvNTRtiUkwSIl0Pz5CREBDREdLT0RSXFppYG+XkpGUbmxvdHWHs6yhoZ+LmZyZjY2VkZuShYqKf4iHjJCLiXyBhHN7ioOFe4p0gYqHlX90e3lsbXV8aXNlaWxoZmppaWBmaWltWm10l62kvYiHZ1tvaF1aWVRIS09QSktQS1RRSExBSkZLUF9fYmdqYpe3x7C6tLu+trHFx7awubGxu62zsairuK2NtqienKeaTpqejI+glpGnmKWVipOTiJGJj5GSnZuhmJuVloeemaaarLCor6ezs9PU1NbRy8/T1M7Tz8zGw8rQv8rJy8nSyM3Ow9DSuLDEvcS6pre7xKJ/bGFaW1tWXlZYZFlPXFhPUUNCSUVDSTxBRD5CSD9AQjg7RD5AST01NjY1NTs6Njg3NjU0LzEwMTQ2Mjc4ODc1MzY3QzVCOD8tMCwxMzQ4PTk3LC4sMTtGTD0pLCguMDAwN0s/LTQ2VIhXMESHd0M7Qj5FQkFDSk0/VVlTZldzkJGZg2hyb3l5g6GqnqaXjJubmIuOlZGajn2Ji4WOioqLkIh8hIJwf4eBhnuHcoOSi49+cXl1bHB4f3J7bnhzbGmAcG1jaW5weWl3fX7Lv8Pfp25jeG5kW2FgS1BSVU5ZXlBeXU5RTlRRVVRcbm53g3KWrristaiwtqutvcGyq7WmpbmnrK+hrLSkj7Gum5iYjJGUkYSPm4GNp5GciYOLhIqJhIuDlJWXl5SbkJyYmZmenquspKeirKzO0tXRzczS09PQ1NHOyMPU0cjO0tPT183S0cXS1sbBz8jIw6m/uNCcd2xjW2BbVF5RXFpPT1NQT0k+QUdCQ0Y9QUI/RkU+QD86PT09PEpCNDU0NjU8ODg4NjY0NDEyLzAzNTI2NzY4NTMzOz08RT1AMTErLzM0OT81OTAxMDIyLTJFTzMpLzMuMzI9TjI0OEN9XzJBhnREOj09ST5AQ0ZIPFZSTU9bdYeGi3dsd3B9foCgnp6hjI2Zk5SLjJOPloV5hZCQjouKiJGHf4J7cn6Agod6hXaFk5GJgG93c2xzfXx3fHOCeHFrgHJyaXByenlye77Lmn+NsoR2coV3aWFpXURaWltXZmRYZWtUWF1dYGNeY3h7f4uBmaqkpKKgoammqrG5q6a0o6KuoqSuoqexn4mmm5WTkYqSj4iClIlrlaKNmYSBhn6Rg4OTl6yLlY6Vmo6FkpCdl6ewoqChpaSoyM3Px8LL0NPR1NLO083G1tPN1NjW1tjV19XK1NrNytjW0cutxMPLiHBtYF5dVlJXUlpPSkdKSkpAOzo7RUJEPUNEPkhDP0NCOzw5PDpHQzQ2NTQ0PDU2ODc1NDMyNTAvMjU0Njc0NTU0NDw+PUU/QTYyLy0xNjs9MDgxLzI1NC8tLjtSMDE3LzUzMkVEMjg+bmI1PYF0TTk5QEk8QUQ/QTtQTEZLWXCAdX5pc3lygoqAnZWelIWLlomPiomOiI+AeISUmYuNiIiLiX6DeHN8fYSHd4B7h5GXgYRveHFtdX92eH10hnx5bId2dW59doV1eXudtYw8QYvGpX6NfWplV0lDZWNmY2hqZG95W19maGtuaW6BhImRjJ6foJ6Rl5mgo6SmsqSlsqCipZ+iqaGisZyHn5KSk5GLjouHhI+EfpycjI2ChIV6lH+CqpajjJKLmJOLfZeKmpGqs5ibnKecpr3Dxbm2xc3R0NLQy9LLydTO0dXa19fY1NnYzdjbzsna2tLWv8zNtHVzbGJbV1FTUFhVRUZKSUZGPTo3OkBCQzpIRUBFREJEQTs/Ozs3REM3NTY1NTswNjg5NDQzMzQxMDE0NTU4NzQ0NDQ5QD5EQkM8MzMuNkZUV09RSkFKRj8yKiguQlQyOTI1NC83Szc1PGBiQTxzdlY4N0FIOj9DPjw5UUVDSlRsbm9wYnFxdIaNfZeRnot+h5KCiYaFioKIfXiFl5eJj4OHhod6hHlxe3uFhnV6ho6OnXqNcH1wcHqAcnuBcoSHgG6OenV3fX2CdX98h4mwdFmqwreNkoFwbmM9XmhycXFwbnd3gmVpb3J2eHJ7jIePk5KblqCWiIyTnJ+bn6ugoaycopqaoKafn6yZjJqNkZOOhX2IiIOFi46gmZOIg4d+bJl5hJmHiJOMjpWMhnubiJOOraqUlZefmKautbyorb3Gy8jJy8vPycTSytTX2NfY19Tb19PZ29bP29rS1snVzJN1d2ZlWFdOUVJcR0JFSUk+Qj49ODo+QDw+SD1AQkFCRUE+Pzo4N0RCNzU1NDc5LjU2NjQzNTUzMjMyMzY0NzU1MzQ1OEVCRENFQjU2PEZOU01bbmZjbnNrYFY+LDRMRzg2NTQzM0JGND1XX2hMdXheODs/Rjw8Qjw6OUQ/Q0dSa19tZGJmbHaAiHGRkJuAeYCOfoKBgoV/hHx9hJiOh4t+hoeBd4N5bnt7h4J0epKejqF2j3aDdHWBfnSAhG+BkIJvkoV1fIGFenaHfIm4xqXDyriClpyPeHBmTmVjgnuCd4WhkIt5end7hIB8hHVtlJaVlpCYkYOJj5eal5emnZigl5+TkpejnpqrlpGRi42Tg4yFiYmBhpCRnpyZiIWLgYWXeoiJn5eQiY6Ki4J8oYmQi7ygmJOXmpyopqWtnqe1vsC/uMbJzc7FzcrR1tXU2dXX29TX2drb19va2djO28aDdnZkZmFdUlVVVE1LRE1EOz08PDk6PD85PUE3Pj9APUA+PTk4NjdDQTY0NTU9ODA2NjU1NDc3NDU2MTM4NTQ1NjQ1NjdISD1ESkU3OTI1O0g+Ozk6N0hQXFpSVVhLOVQ+Ozk1MzI3STg9TllNSHh4ZDU9PkM9PEA6Njo+PkBFUV9ZZmFdXGl0enlsiY2Sd3Z6i3x+gH+AfoV7foKRioWGeoWIfHZ+dW18fYd+dH+SnZGfg5J8h354j355i4pvg5uBdJmGfYKKhXx+kXuQqY+Qw6C9jJuknH6KhH2Jc4yLf3OmmpyYlIV7j5GJhGlHcaGknoyMkZKFiIuQkpWPnZuTlJGXjYyVn52UoZWTjo6QjH+Qj46LhImTlpmfn4iMlJGdkIKMf6aZiIWOg4aEgKWGiou4l52RlJahpqCdnZ2jrra6tKvAxsrQyMfNz9PS0tjS1dfA19jZ29ja2tnZ19u2dnV0Z2ZiVF1ZUk9PSENMQz09Pjk5Ozo5OTw9NkA+Pj09OTo6OzM3REA4Mzc4PjcwNjg4MzU3PDM3ODA0OTc2NzU1NTQ2RlA1RE5JODkzOEFLPTszQ0BJPDlEV088TVRITj85NjMzMz5DO1tYPjVZeXBaPDxBPD0+ODU4OT88RFJTUlhfVlhmbW1taYGOinFzeYp7e4B8f3yIe318i4eDfnWEhnpzenNtgX6FfneGm6GbnpSSgIyIf5iHgJySboiphXugjHyRjoOJhJx+m5GKjaOin5Gkr6CLkYuGi4GThldyrYufq5uQg5mckI+OW4OikYKNn5OUjIaIjJKSjJSVlZCMj4qIlpudj5WWkoyTlIaAi4mTjoqKnZeYo6KGk52VoIuKiY6dkIOIj4CDh4WlhYuQspickpSXoaCemZKbnaexuKykvcLHzcjGz8zQzM7Xz9HUrtbV2NrY2trX1tnanWx5cWNjWlpWUVVXQ0BJRD8/Pjo0OTo7Nzo7OjM8PD89Pjc7OToxOkc9OjI3PUA1MDY3NzI1NT82NTs1NTg1ODo1NzczNUhSN0dPSzk5ND1FSkI+MUZDTEE5ODpHWEA1SFdJNjYyMjM6RUNlWD8mX3lpX3o+Pjk8Ozk4OjtAO0JRS0tTWVBUY2J4bGJ+kYNvbniLeHp/e4F9h3x8d4aFgHNwhYJ7dXd2dIWDhX1/kqain6ail4qdkJSXi4qol3KKso2EqJKEmZSFmoyjlqCYk4mbnqKTqbCgkZWRjo6IloxvjbeEmsTIspyippycmJaRsZBkpM3HlY6Gh4mQko2Nk5WKhYqKhpaZm4+QlJOHlZiEgI+LmYiOkKqXl6SjiJmelpqIj4eXmIqFj42Bf4ePpYiNk6iZl5OWmKGYn5mTnJqisrSlo7zBvsfGxcnIycLK08zN1KjS0dbW1tja1NPazn9ve2RgW1xbTUlTWUJBR0Q7Qj44Mzc8PDo4PjY0Ojo8OjcyPzo5MjlJOj42N0JDMzI6OTYyNjQ+PTQ7PjY5NDk7NTc5NDRLUTxKUUs5QTdCR0lANjRKRUxGPjs4OEVUQTc+XDg2MjE0OjtFYFhBRmF0aExjWj41Ozo6NTs6PTpFTUZIUldTUkJjgkd2gY59fG1+iHh6fnuCgoN/d3aBg3xtbot/e314eHyEh4p+i6Kzp6Ors6KXp5+lpJaVrqKDkbiVkrOajKKhjKWbsKOknZiRp5aomayvpJiVlpWQi5ial6HAjqPJuKuco6atmJKbnbKdhYaoopyYhYmJjpWMi5OPiIGGh4mTmJWMi5STh5SYhoSRkJx1kZmylZakoYecmZKQi5CKl5uJi5aOhn2MmJ6JkJCcmpqTmJefk6CdlJ6boLGuoqS3vrTFx8S9w8PAxs3KydOmzszT0tHW2NPQ2LpvdnJZXlNeVE5ISU1FQkNENT46Nzc6Pzw8Nz00MjY2OTc3ND41OzU8TDw+OzxCQTc1PDs0Mjc3P0A2P0A3ODQ5ODc7PDU1T01EUFJMOEA9RUFHQTU6SkVORUQ6NkFAQlM+OURPMzIzNTc1PXZcPFJcdGlaTV1TPD04ODU2Nz06SkZER01aXFlKZmA7SISLenpuhYZ6fIR4gYaBfnB4fH59b3KNen6CfHiGi4mGhJKmu6yosb2wpa2zs6ijorCsipq1naO4pZWtpZeprbinpKOfmqmYqqSusKqamZyUlZGXoJiau7uuyqFqtrirsJSZn6Osk5e+o16qsoOKio2Uh5B8jo59g4aOj5SViIiTloyQlY2LjZaYk52ZtJaVq52KnJSSjpGSjJibipKekIuJlp+hjZSNmJmdkpuYnpShoJScnaWvqKGls7iswsjEtrq9vMXHx8LRoMbJzc3F19bRy9OfbXdlWVdQXFBORUM+PENBQjhAODg1P0c9PTY8MzUzNDU0NTRCNDk6Qk06QjtBSEI7OkA8NzQ2PEI5P0BCODc0Ojo2Pjw0N1RLQ1VRSjc8OklBREA0QUpITkJBPzZEQTxKTkQvVD0yNTQ6RUpcWEpaUW1ncHBEaWBLSTY3NTc6PkpAQ0lQZEhiYGJwSkCLin6Ac4aHfYKIdYOKgn9ufXx9f3B3h3eOgod8jY+MhoyZqcLAr73Gu7O0wL20rauztoyosq2tvaubu6Worbm4q6amoqKko6mvsrGqnZykmZuYl5+ipqWSpLqvqcC8ra6yuaWkqH6IhpytvbCCi4yLkIOOg5GPeoGIkI2NnImIj5eNi5WWlJGal52omrGakaycjpqPko6VkJCWmI+SoZGJlJukrJSWj5OcnZOgnZuYn6GUmp6npqSio7CypsHGw6+wurfFxMO/zabHxMfEvdbQzcTKhXBvXllXXFhMSkFLQUZHP0FAQzs6ND5BPT01PTY+MzQzMjQxQTE3QEJOPkdAQ05DQT1DPTs4NkNDNUJJQjo4Nzg7NUI+NzlWS0RXT0Y4PTRLQEM+NEVLSE4+QUE2QkI/QlNFNThQMTQ1Ozw4O0Q+OUxqal07V1JkS2daVU43OUdEP0NGXGVGYGlnWl1ck4yMiXuHjIeDjHWHkYqBb357gn9xfoF7lXqSlJSYkJOWp7PGyb/CzMLDuce9u6+rubuYs7e6ssCupcGkq6+8vaquq6OjnqerrrWwqpygq5yhnJafr7Wni6O6urbBvKypnbOlpKiUhY6pxMOkgouPh4iEhpWUjXmDjZGPkaGMjJSSjomXn5iTmZWYpqCvnIyrnI2Wj5KRlZWOkJWSj6GUhpefoLKelJmTn6CYpJ6an5uglJiepaSmpqSvraXAxMOuqLe2ycO+ts+yxL/EvLPRysjCtHF1aVlVWWdQTEhCTEtMSkFBPkREPDVBRTs7Mz04QjMzMjI2M0EwNUlFTj5JQEhSQEg+Q0A7Pj1GQTVBVUA7OTk4PDdFPjg+VkpDV09HOD80TEBCOzVKS0NMP0I/PEJGPUFITDkrRzwzNjc0NjRBPzdPYU9hRS89PjZrbGpgQDpIPj9FQmVaTWVcZlRia5mNloqMiJOQhol5h5SQgXKAe41/eIeCgpB6jaGWqJmambq9x8jJwdLJy8LNvcKzrby+qLq/vbvDt6zBqayzvL6qsKqkpaSsrrOttrWhn6+fpaKYo7O9qpuovcGktrivrJSyrKysl4eaqaalkYKMk6WWioF1ipJ5hY6SkJ6gk4+TjI+NlKOZlpyVlaOeqp6RpZqMj4+PlZaIfI+Wk5KjmpWfoZy1pZCelqSjoaWdnaaYnZWXmqSjqaeisqyou8DDr6Wzt8y/ua/Es7u+wbiswsPCwJdqdl5VVFlYSkpMSUZEREhDQ0FETDo0REk6OzQ8OEUuMTIzNTJCMjZTSE88SkJKUUVLQ0RFOkVMQjw3RVY9Oz04OT88ST86RVVJQVdRRzdBOks6Qjc5Sk1CSUBDPjxERzxCQ089MjBIMzY2MTcwPUI6PWpqSks1UVMzU3BwZE47RD1ARj5pSF9YYlpjY1aej5yOl46ekomKf4qgk4R4hX+Wf3+QiIqRgJahma6npJjCvcfDx8XTzs7Ny7zCt7C6vLS9y7zDwba3vK2zv7q9rq+ooKmotq2uqbK3mp6to6ehnau3uKqlsL/Esr25tKirtrSurpeWpayon5GNkrLFp5aOfJKVfIeSmY+qmZiTk4+SlZOknZOdmZSho6KcmJ+Yi4yPj56IWpCWl5KXpJllmKOfsqWVoZWrq6mmm56mlpiWmJSgpKiln7arqbm7w7SltLXLwLiqtquyu7iuqLi6vbiAaGtXVFJTTUVJUk1LP0FIRUVISEg5NUVNOz44PUBKLjMyMDI1QzU1T1ZOPExGS1JMT0hHST5JUT86OElTOzs/Nzk+RExCQEhTS0BXUEY6QT9HNkE3O0hNQ0U7Qz00RkU6QkFCRzkvOkEzNjAzPkdEOTQ9dGRNRztFKzpmfGdWOz5AQkZCcEVqSVJlYUxGpZScl6KXqZaMkYOIppOIgoeCnISDlZCQlI+aop6vvq+hxrzExMfGz8/O0sq/u7axuru7vs+1w724ubezsbWzuLOrp5yrrLmqqaevsJijr6Wno6W1wLCsrLS/w7rAurSnura5tK+Wpa2urqSLk5ShjXTCmn2XmYSOl5mMsZWbmpWSkpmZpaOVoJuXmqmdm6CgmYqNkJacYEqWnJqVmqWWVZewoK+cn6SUrq2qpJqgpZOTmJiNnKCnopq0qKqzu7u7qrGyx8C5pqyrrbKyo6GysrSkbWpiWVdNT0pET09QUjtHS0lHSUNDPjpLVT9BOj1FTTA3NTM0OkI0NE1XTztKS09VTlFKUEhISk9CPD5NUjs+PTg6PENSPkRIUklCV05JQEJBRjM+NThKS0NBPUM7NEVBOkE/PkhANSpCNTIsPmNdZzozNXRkZUBSNyYjM31oVzs6QkNAPVFFV1NzYldGSKqWmaCiqK+ZkZeHi6iWjoiThaCIhJ2Xj52hmqOktcm1qcW5wsPIysnIzc3Gv7uzrrm5wcHMtce6wbm1urCvr7O1p6SbqrS1qqmmrayapK6lpKisu7+orLa3v8G/vrmzssSyub6to6+1rLmmiJuXppt2v5+EmZ2Ok5qajK6XoZycl5SboKGonqifmpqqmqGnnpiQjZGdg252kqKalZ2inZGusqOqlKiql6mto6KepKeRkZmch5Sdop6Wsaapq7m2vbKyrr65tqCjp6ilppybrampi2BiXl1OSktGR01KVkw9TUVOS0xCQ0Q8UVY9QUFCRE8xOD03Nz9CNzVVWE8/SE5RWVNQUVVLUUpKRUFFTVE/Pz04PTtHUjxFRFFCR1lNS0FIREU6OjM5S0lCPkNCOTlDPjxAPjs7RzctMj4tMYJoTnpcLzBraGA8PUJCODZ6Zlc7Oj0uLVJgTVVIfmVeSEWrlZuin7uvmZSfjJOrm5GSk4mrjYahnoyjrZSjo7bGvrTAucLCx8nFws7Iwr65sq+5tcHCyrXGssK8tbqqqK2tsKOjmKq0u6appquqnamvp6Oqq727qK29tbi+x7y3trjCsr7BtKq1t6u+pY+jmJKioLyfiZqgmZefno+3n6mcpaKbnKGaqKSzoJudppyoqp6YlY+Um4uWiYykoZSdop2gta+lpJKvq5mqqpyco6KokJSUn4KPnp6clamkoaGztLq0rai1srOenKOlmpeVmKqhnnVdWl1bSEdFRkxRSU1FR0dCU0xKQkVHQVZTQ0g9QUdRMTtCNzpCRjc5XFlLQUxQVFVTTVdSTlVKRUBKSk5POUNANT08TlFDPz9QP0VaTUpBS0RHQDUzPUlHPz1FQTk3QTs8QDw8M0A8Lyc7KkiRQjpTSjAsW29XNzE8Kh1CgGRUNDktMTlmXEZDQ51wYkdFp5ejn57DrZyXpZiaqpyWmpqPqpaVp6aVrayYoqu2w8O8vrbBwsDHxL/Nxru9ubKwubO/w8i1v7C8t7m2pqSrrK2hoZmqqsSipKmspp6sr6uiqam+uKetv7K4t8e2tbm4wLPAwri1s7SvvqOXo5eUnJSun5Cio6Wjo6CQvaSpnqirnZ2hm6WevaGZo5+iqayhnZeNlZ6TnoePhI2Tn6SgnrWspZuVsKaZr6WcmaicnoyYlJ6DjqCam5KlpJqXq7G1saqlqq6sm5igoJKPkJWonpRlX1dfW01IR0pOTEhFRElBPlFJQTxHSUhcUk9LPUhPVTRCRjk+SEc1Q2FbS0JOUlVXVlFYVFJVSUA4UlFQTTpHQTRDSFFTSUM7Qz5HVktDQE8+SzwwNjtHRj47RkE1Nj85Oj85OzE1RDAtLC9Ndlw0S1o1LE1uVzwtPSkeI3piUTVDS1E5bVJGPEt4ZWFWS6Kao5yexayhnqyfnq6gkqOflqSgpqmsmLaxoqqztsXEvb+1wMK7yMK/yse1uLW0sbO0t8HFtr6xuLW5tJ+nrKqsnZ6epaTBpZ+qraCkqa2voaaovbWmsb25t7bEsrS4ur+0xMG5ua6ztbWjnaWVkpShrqCZop6pqKyjmsKsqZ6srpubnpmmoL2hnaSYq6yspqKajZqfkp6Jjld/lp+loaC4qqeTmLSinrGfnpmulZ2NmJOcgY6fl5WOoaOVkKWtsqqpoqKlpZWVnZiLj5GSpJ6JX2JYYl9LR0pKTkZFQUdLPz1KQjk5SkpOXVFRST1MVlw5Rkk9RE1JOEhiXExDTFBTWVlWV09aXklBPVdRSUs/SD81SE1YU0hBOkBBRFBIPz5RPks3MDk5RkU7OEc/LjY+Nzg+NzcvMT85MSUxUVVtW0pPMTA9Z1dEMTc9LSt3YFM2U1prV3JHRTY9dWVcS02enqGZn8SopaK0op2zp5OrpaCjn6yprJ27sKistrHHxcHCssPDvcbEvcTJvK+wtq2wtK+/xLS5sbC6tKyZqLGpqpqdpaGnwq2brLGbqqOusKmlqby2p7e7vq+3xK2zs8PAtMe0u7istLatqqKmlpWVpKyin6Cbp6qwr6+7sqagqamZmZiToqO4oKGjkq+wrKWnn5KhnpWej5CNlZ6bop6ns6amjJeym6KtmZyarI+dkpWSmX+RoZaPjZ+gk4umq6+kpqKcoJ6RkZqThYuRjZudf19jWWZkSUhMSlNCQ0BJSDs7Rj85OU9NVV5SU0o+T15dPUhQQkxMSTlNY1xMRUxSVFlbU1VPXGJIQT9aUUFIQUtCN0ZFTEtNPztCSEROQj07TkBBMy85N0NCOTdGOys2PDQ2PDI1LS80QDErJ1Z0U2VPPzEwNGJbTTIzPjA8dl1eP1tUXmVxQDg7SJZ3ZUE0nqOfnKDDqaSqs6KktaqWs6ynoaSyrK6pu7KtsbW0xsDEwrTAxL7JxLW/yMK0q7WosLmsv8Szt66ttrilmKqyq6qYn6aXrbu0m6iwmqygrbSyqKu5sqi6tLmzuMCqt7LEvbXHqL+vrra1qaesoZiXkqaloqKYmKWuuK6ytbagn6ikmpWVlKSgt6KlpZavsrKnqqainpqam5WXqJ+gmKGerrKipoyXrZikq5aYnaKPmoySlpiFlZ6UjI+bnZOKqKmqoaehmJ6Vi46Zj4GFlIiTnndiZ1tqaUxPTk5UPkNBTkM7Okk/NzdST11fUlZRQVdgXEJKU0hWS0g6VGRcTkZPTltXW1JQUVhdR0FCW1BCRz5OQzlIR0hPUD8/Q0lCTEI8MklBOTQxNzdCPjs3RTcrNjkxNDgwMS0vLjw2LSNCcWdzazIzLzFbYlozMzgwNnBbYkgwNUlvaFVDV0aMeWZDO6OjnaGmv6enr7GhqbarnrqxrKOrtLaxsLm3sLe4uMS9w8e9vcTCxsC4wMXAuqm2pKy7rcHCt7eqrbK6opStsa2ylqSnkaq5qp+msJyroK+0s6uptratvK20s7m3rLixw7u/v6bEq7G3r6irq6eemJmroaKhkZihsa+zrLC5mpypoJqXk5inoLappqOisbG0rLOorJ+coKCbnqWcopedo7Owmp+Qk6SZn6iZk6Gdk5aIk5aSlZack4iQmpiUjqmopp+jnJebkoWOmYt9i5WEjZlpZ2tgbG1XUFFbVUFCRVRAPDtJQTc6WFBkXlBXV0VZX15NTFJOXktKPlpjXk5IUE9cVVlQS1RXWkk/RFhQREY/TkA9SUdHUVBCPURGQk0/OjFEPzc3NTQ3Pz05NUU0Kzc1LzI1MS0tLiwxPSonKz1ccD0+MS4wZFpkQDE2NDdnWWBGKD84bH1nW1Y7iXtjQz2nn52iqb2iqrCspLK4qqa2tKygrbW9r7O4u7q+t7bAwr/JxLnEwsC/uMS9wbevtaert7K8vr+0qa6xtp6Wq66orpemqI6nu5+lrLOeq6KxsLOsqba0tb6usbK1rLC0s8G7xresvbCxuKysqqOypp6lqqCkl5Gan7Oqs6urs5qdp5yalY6hpqS0rqihra6usai0rbKqpJyfqKSelaKZm6i1qZaZkpKdmZ2fnZCqnJWWhJSWip2YnJOKjZaWmpampaOfnZaVl5J/j5SFe42SgouVZGtxZm9xXkZZZ1ZEQk1YRFo5SEI2PlxRaFxPWV1HW15dT01SWGRKSkNcYl9QTE1OWFdYUEpWVldMPUVVSkVEQU1AQUZISFFQQTtGREZLPTg3Qj02ODcxOT48NjVEMCs4MC8wNS8qLC8tKj0sLCUyKyo1SzEvJ19fYFUxNTA9YFZeOClDM1lVXGdLNox6ZkxApJqhpa23payqpq+ut6qvtbunprG3xbextr3Bw7W1usS+zMa5w8C5vrnDuMC5srSrqbq2urm+tKqtsLWXmKesqaybq6uOq76erK6yo6ugsa2zrq62srm4qq6usai1r7W8vcqzqre1sbSvrqahtKCbqK2gppaWm5qyoq2gpq+XoaSampOOo6Wos6qhprOtqralr7K1r6SZnaynmpifmpmrt6OXk5COl5ygl5aTqp6akX+Sl4ydm5iVkIqUkp6ZpKKioJiWkpOVeouPhXuMioKKkWptd211e2FGYWtZSUhaWj17SkZENkFiVGlbTVxhS1xdWlJSUmJgTEtFX2BgUUxJUFdWVU9HV1ZVTjpJVklIP0NLP0VESEhRTkE/SEhIRTw3PT46NzU2MDk/ODY2QiwtOCwvMDQsKCwvLSo3NikoOS4kOks1LiJUX1RfLzUoQ19RXC4rQi9KR1BbRzNjWVRLRJmXobGpsqqspqSvrrapt7W6pKy0t8m7tLu6v7+0s7fDwMzIvMO8tr2+v7e/vLG8rae6ube2wrarrLG3lJamrquoo7CplK+7pK2xs6eoo7K0sbKxtbG4tKmvrLKnt6+3tMTGt6m2tqywramno7agoKexoaSVnJqVsZ6nnKCqjqmjnpuWmKampbioo7K1rKiyp66xtaylmaCsqJucnpyUqbiclI6OipebopePl6SgnJOCkJSPnJuXlpWIlo+XmqecpKCRlpGQlXaEj4d7hIGDi4psb3Z0e35cTGZtXEpOZFw/YntHSThHZ1dmXExeYk1YWVdVV1RpXU9PSGBdX1BKSFFWVVJLSFdVVk04TVpORUBGSz9IQkNLU00/P0xPSEA7Oj47NjswNDE8PTQ1OD8pMDcpMS4yKSksLC0rLTkkMDQyJTlCNy4jQU5HZjI3J0diTFYlLUIuPUVMUTwzcmtJQ0ORmaWvpa6vq6ilsbO0q7eyuKGrtbnJua3Bu8K4s7G1wsLOxcDBvbS9v7+6vryyw6epubC2tr+8rquysZugp7GtpqavpZ2yta2rsbKsqai1u6y1s7WttK2qrKisqbmusrHIwLmlurCprKylqK6xpqWjr6SpnJ6dm6+ao6Ojo5Gtn6OgoKKrpqe5pay1t6WrrKmtsLauop6jqaqboJubkqS0mY6KjYeQoaCUjJScn5KQg42Skpyal5WUh5eSlZmmm5+ejJKRjZB2fY2FfHt8hoiIcHJxfXx9XFNkb15OWWdcRkSWW0c7Tm1YYltMYGJOVldWV1RYZ11RUkxjWVtUS0dPVFNOR0lWU1xOO1BeSUJESEpBRT8/S1NPPjpOTUM8PD45OjU9KzMyPTYyNDk6KDQ1KS8rMSgpKywtKiY1Ki8mMCkzODoxJiozQmM6NipIZUhKKzpIPjNCSFMsPpBrO0dIj5yqq6KqsaSppbO1srW2srKhq669zLqtwLrHsbSttMHD0cXGvsCyvsDCu763u8SmrLessre8wK+rsayfo6etqaiksKOqsqqwrLCvsK6rs7ynt7GyqbOqq6Wlo626raqyw7q2rbupqaesqaexpaqko66qqKKfnKOtlaWemJ6ZrJ2ip6miraakray4srKiqqKgrK+xrJ6gp6epmaOZmY+gppeGhI6Ki56gjoqMlZqOjYSFj5SfnJSXlYaWk5OXpJucnIqSkI2Jf36HhXx2foWDhXJxcIh1a19aYG5iUXNxXEs7hHxGP1h1WGBaTmRbTlZWVVdRXGFeU09OZ1hXVktHTE5SSEVJVlJdYzxQXUQ8RkhIQkc/PUpQTDo+T0o9OT89Mjo3OyoyNT4xMDQ4NSg1LyosLjMwOyksLCclMjM0JCwyLTg2MCkoMTtcSjAuSmdERjg7QjA1RUtYMUCVWT1MRZWYraiiq7Ocqqqwt624tq+rpqurvcm8sL22wq+xq7PDw87Pw76/tMDCw7q/s8fDqq63rbK4vr6yra2qpKeqsKinqLGltK6rsa+tsrG0rLS8pLizrayvqKufo56wt6uqrbu3pbe2pKmnq6uqraGpp6axsqSnpaGhrJeqoZWboKaepaKrpK2jn6exuK6upKajm6qrrqmdoqWkpJifm5aPmJySgYKQiYScn4uKjouYjY6JgouXopuQkJuLk5KRk6KZm5mKjouLfYaBgYN6c3+CgHxydYukh3hrX2BuZldlh2NOP2eTTEVieVdiWFJlVE1WVVZUT1xdYVVLTmhWVlZJSkhJT0JHSVNRWW9BTVhAOkpHRkVHPj5FUUg4Q0tFODdDNzI6OjoqMzk/Li80NjMpNCsqLCsuIzQuLSsmKCs3OSomNis8LTIsJjA2VlouMEpnQUE8PEIrOkpPXjREhj1HRkSXk7Cmo6uxmKuqrbastrKspqyqqbzAwLe4sru1pbKvw8nL0b/Au7m/vsG5wbnAxKyxtbGzusC+srGurKqrqLappq6vqrmwqLKyr7Ott6q3t6e0t6uspamqnKOes7OpqKS0taC3rqCqqKqoq6egq6ypubWqqqmpoqqgrZyTqqGdoKWipqOqn52ntK+pp6ujo5ilp6eqnKKko6CZmKCRjo+YjX6HjYeEnZ2Gg4mJjo2Oi4KFlKKajY2akJGRj5Kfl5iWjIqDf3SGgX9/eHSCfnl2fYCHnY9vcmdmcHdcYXOIa09emVZIbnlVZFZRY09NVlRVUE9YW2JVSE9pVFZTR1BZVUk+SUhPUVB4TE1WPTxLRD9AQTxAQ1VDOUFLPTU7RTEzOzo3KjQ6PSstMzQxKjgqKisqLCkpKC8qJiklMzssJDIpMjAyMSUvMlFiMDI/Zj1OWD5DLD5MVF8vSmk1T0Q8lo6xoqarr5qspq2wtLWwrKawqqi6vrvAsK25rqG2r8jHyNHAvr27u8G9usLAvr+usrKytby7wrGxs6qzqaS0qKWts7O5sKOuuLKwsrururCqrrasqp+qrJ+joLatqaGfsLOitaqeqKepo6qhoqytqL2vrK6toqiooKyZkLChmKKgp6eeqJuZqrGqo6CuoqGUo6Ojp5iaqKWYl5iej4qHlIh9jYaEhKOWhIGBi4aNi5CDg5OfloiRnJCTkY2RnJSXj4qGhnd0gX98dXh5f3lzcnhmf4akdmlfZGqAdGeIjH1TWG9eSnhzU2RTUV5NTVJaZk5MVllkWEdSaFJRP0JOUWFROklITFNJcVFMUzs8ST87PD07QEBXPDw/SDczQ0IxNTo5My01OjopLTMxLS01KSgrLSw0MiMyKScsJS47LiYxLjAtMTQlLDBMZzo0OF89YWQ/RjFDUFtbKkhNOVVANJGQs6Glp62kp6Stp7WzsqulsaequL7Au6+nuaqmr7HJx8jRw7y/vri9vrzIusG4sK+0sbq7uMCysrqsuKyitKenrLK3urOoqL22rra+sL2nrqy1rK2cqa+joKWtq6icnquzpbSom6qnqaOonaOpqKm9rLSwrp2qpKCunJuzo5aknKWln6Wcm6mrpp+cq6Kck5yipZ6Yl6ipkpialJCKgo+Ffo+DgIidj4V+fYuHkI2Pg3+TmpOFk6GMlZGLkZuSlYeJfn9ye3p+fGh4fHl0b297ZoR4hIlkYWdhcoR6bWd4XV5UP1d7bVRiUFFYS0xOcnVdSFpbZ1lFVWVQRD5KT0RDQTlIR0tTP2piSlE4PUg8PDw+Ojw/VDY6P0M0NUg+Mjs1OTAyNzw1KC41Ly0xMScvPktIMCUaOTAlLCwwOS8sLCs2JzE3Iy0wR2pJMTRYPWZiQUo3R1NgVSo9OURXPSqQlbKaoKCqpqWhrKW4s7OmqbGmrLjBvbWvoritqKiwwsnJzMG2vcC0t7+6yLXCtbOytbK9uLm9ta25tb6toLOnq6uwtri1rJ++vaqzwbS8oa+ztaqsn62wo5ymqaqknpulsaewoJ+rqaehqZykqKGtvKiusa6hq6Okrp6fraaXn5uho5yfnJqkq6Ocm6WllpeVoKOXm5elrIyekZGRi4KKgICOgHuZlIyIe32Lho+Ni4mEkpiQhpSjiZOSh5GakJOBiH15a352eXhjfHpwb29xdmd/c2mEaGVnX2xzjWxhaW9gbz1aeWtVXk5QUUpJTVRaV01dXmxXRFdfT15QSE1ERjs3SEVLTzxyaEtLOUFFOzs9PTs7PUo0OUI8MztHPDQ/MTgtNjg7MigwOS8sNC8uPS0qSz4pHTQ5JicuMzQuMCsvNCYsOiQ0MUFoWTE0Uz1lX0RMNktWZE8qOzFOVz0jlJmtmqGYqKWkoKikuLCvpK+wqau4wbmyrZ+5r6uotLrIy8i/tsK+r7S9t8S2w7KuubKzwLS6vbeoubi9qqO0qKmqsa+5saucvL2lsMG1tqKvtrWnpqews5+epKaooqWZn6yoqZ6gqq6moKaYo6igsbmfo7GvoayhrKScp6apmpqbn6SVnZ2bnqqnl5yhqpOZlJmfk5mWoamRmomOkIZ8h36CjX18oIyNiHiCi4SJi4uFh5OajomVnoiRlYKLlo2RfIV8c3B9cXR0YHp4aG1vb21ofXFie21pZWJdZYV+X1pzanFKSX9pWFpNUExKSFBSUUlPXF9uU0RYWlJoT0hLRUY1NkhCTEk1WmVKQDZFQjk6Pj0+OjpDNTk+OjNARjwyQDIzLjo7ODMmMjwwLDg1QiopLUIqLDQ7Tk5AOzczLS4rLTcqKjwlNTM8ZmQyNE0/ZV1GTz1RWmdIKj4vV1U1KJeep5qdl62hoaGlorirsqW0tKmoucS1sq2ft62urbC0xsjAtr7BubC0vLa+u76vq72wtL+wvMO5qLu6t6entaioq7GttLGonL+4pq28t7KfsbewqKWnr7GboaSgpaWgl5uwp6Gfo6ivoZ+hk6Skorewoaaxq5+so6+YnKqkqZ+Xmp6lk5udm56nq5qcnqaXlpiWno6Tl6KoopCJi4+GeoR+hIp6j5aJjYZ4gYeDh4uNhY2TmI2PlpmKj5d+hpeMj3mBenByd29vdF95d2Rra2pnZ4JsZXJra2RoWGFzf15abHVpWUV9XVtYT09LSEhSVUcyOl5ebFBEV1VZZU1ISkVFMDdGP0tCNklKSDs2Rjk0OT49PDk4QDg7ODo3QEk+ODw0LTM8PDc1KDU+MSw7QTEoKzY8IzhSPSoxMTM+RDUsLSc0Mis7KzEzOWNsODRIQmZbSFRDVF1oRS47MV5RLDKWpKOYlp2qnqaho6G4qrChu7ilrL3Esq+uorWvra2vtMTEvbO+urews7m4uri6rq2/s7S5rr/Bt6u9urSlorOrqKqzrK6ypJ3Dt6apt7ern7K8qqemqK+rmaOnnKWmlJihs6aanqWpqZyhn5Sln6S5qaSnraaepaGok5+poaGhmZudoZKbnZeho6ycnJujlpOVlpuOk5Ojp6SQiIqOhnmEfIWGfZyNiYqGeICDh4iHkYWVk5KMkZWUjY6Ue4OXj4p3f3xsdXJtbHNieXRoZmlmY22EZmdoZGZoaV5lYmlmWmV6YmBQc1RbW1NLSUdJT1NAIStpXmpMQ1ZVXmBLSEdFQy46QjxGPDZLUEQ4OkQzNTc9PTg5NT86OzQ+OEBMPT45Myk4Pjw6OSo2QDMuRTQoKyw+MC1OPy4rLTctMTE5NSwmLjUtODA1NzZgdEIzQ0RoW0tXR1VgaEIzNzdhTCcyn6Slk4+mp5yfnp6ktq2oqrq3p6zDwLavrKK1rqeur7fBwL2xwbewrrK2tbm4tayqvLSvsrG9wLeuvLyxpJ+2rKamtaqrr6Ggxayqp7G1rKy1up6oqauxpZidqp6npZKZpa6jmZ6kqqGboZyYoJ2ntqavqa6hoZ2doZWgpp+ioJmcmpyTmp6Vpp+uo5iYn5aVjpWYjI+YmqegkIeKioh4hXeCgoKch4qCiXt+hYiGhJCElpWPj5CRkJGNknuDlY6Fc399Z3lwa2tsZ3Vza2FnY2Jzf2FjZWZlaWliZW9ZXlhcbGNhTGdXW2BWSUdIS01SWD45YGxpR0JVU1xbSUhGRUEuPD85QTg5UkZANzpCMDM3PTc2OTI6PDk3OjlETT1CPDAqPEA7QTwtNUIzNz0rKiwvQSpKSy4vKiszNzIyKDU3JCs3LjcyNjg1XHlOMj5IaVpMWkpWYmZBOjNAYkYlNZ2koZKNrqGamaCXpbSyo7K+t6Gxxru5sLCjtqyrrqm5vr27rcCyr6+utq6zubKnq7mxr66ztru2r7m+rKaetaugobKlq7CfpsWhs6aws7C3rrWera6srqKZnaeqpZ6Vm6emoJmlo6mcmp+clZ2erbCmuKeuoqGamp6YnqOapZ2Xn5iclZqhk6mXramclZ6dlI2Vmo6VlJinp42MiomOe4F0goKLmIWGfImIhIWKjIiShZOckpGQkJGXj5B/gY2Ogm+Cf2d5bmhramdxcmtbaGNhcn9gZGdqbmtlaWVjbFxsbHVxYVNiaGNlWklHTE1PWVFQVWFlgVRAVlJaVEZHRkVALzw9Nz82PEZOYTg6PzI0OUAzNzgyOD83PTg+RkpARDkyLT1BPUE9MDVAOUAxLSsuNDw7SzYvLissLTI0OjUjMyopNi41NTQ2NVp8XTE6S2pbTVtLWGRjQEExSGJCJzSUo5yPj7GdnJShm6mzsJ+5wLagtMK7vbmxprawqa6luLq4uKy7sK2rq7eqtbmtpLK1sa+psba2sbO2u6epoLapnZ+qo6qunazEma+msLG3tq2snrGtr6qim52krKmblZynpJ6ZqqOllZqgnZKco6uqqLmep6Sgl5qanaGPa6OWmZ1xg5ecpYF2kqypn5aXopKKmJmAl4qfjniFko2DbWl+d4RxbIaKhn2EioZvXWRgZ4SXhmuLkJSSdXiLhH+DkH9miIBodmlmWF1pdG5OUGpjZnGDZl1kZm5raF1bXYmQhYdoT0tDOEVUZ15KSFBQVVZLSFJhcHRlRltRVVBGR0ZDPjE7PTY9NjwzZlw1Ojw3NTtENDg2MDpCNz86PkZMQ0IzNDM9QEBAPTI4QEU9MSwsMDg+RzcwMS4qLiovNjY4LCMxJzIxNDoyNzZYgWwxNU9rW05bS1tmYj5HMU5hPCsvjqSaiJaym52UoZyqrqujvcWvqbfCuL68rae2saarpLi0s7Owua6qp6y0pbG1oqe4trWop622s660rrSiqZ+0q56jpZ2nqJuwv5Wop7G0ua2upKitqqumoZ+coainm5ihpaacnKeonZOeoJmRn6iqo7Ovo6KjnJaYmJejiKGPkpqIoYiVn6J/pYCorZ+UlJ6UiYRyeIyOg4igdYeNaZeJZn5zeKBvh4eEfox8f6Ggn5l/e4eedIiOdpuKbIeCg21oZGR7bXJiVIZtY21pmHFYaXBuhlddaFpralqIcGx5codoh4RZXkZNPkZeTUVSVlZRUFJXVGdeTFpMUlJQRUZHPjw0OT05PDc7MDw8Nzk5OjY9RjU4NjA8Qjs8OT1GUUc9LjU8O0A9QD41OUdBODIqLzE8STovMDEuKi8oLTQ1ODMlJjIxMTU+MTw4WIN0MTVSa1tOW0xbZ189SzFUXjcvKI2nmISdrJ2amp2fq6qoqr/Dr7K6vLfBv6qkt7GqrKa0ta6vs7arqaWxraW2s5ustba0pqeos7Gtsqiunquhs6mgpKWboqWesbiVpqent76mrKepqqunpqKgmaGoo5mZp6OlmZylqpaTo5yVlKSmpqG2pKOgpJiVk5iTnIiukJiViqqMmaOdhrGBpa6flZuhl3qC1Kh/h5TAm8Z4d7Glt5ZkgMCcv3mEhHmPg3yQkJHKcZa8nMV7cranupB7gWyXsauxeWhsWLGub2VpvJK8bmh6bXGP2H1Sa2K2sn1/cJR1mqGqkFZOWGFPVk5GVVxYUFBTi1tXW1BAXERQTkNGSTw8NTc9Ozo5Oi49Ozg3ODs5PkY2Ojc0PkA+Njk/RVJJOi41PjtCPD9BODpKPjUyKjIyQkUvLjMyLisvKS0vMTg2LSAvNDE2QTE9OleDdzExVGtcT1tNXWdcPkwxWls0MSGPp5SBqKqfmJ2epa2yqbHCvbK1wLW4v8KrprStramosLWqsLa0qKimtaWoua6csrK2qqWkp7KvrrGmq56npLKkoqGgl5yioLKvlp+kobW6o6qooa2tpKKdm5qjqaCYnKmgn5ieqKiRnKeblJ6ip6OhsKOen6OWlpKYkpmFr2tqi46qf2iFloetZnGfnpWbqZdxrqGkfne6fGugj3axX2q0W6WAZZyQYGaBemZ/aXhqqWW+cmemjHaxanyxeHWRlGNtbaduXISgRWlnh5ZFdZxgfWZ7o6aBWF+Lq2h9j3h6aqg4Sq9bWFRtY1pLT1hfXFZWO06HUFdWL0lTU0pDRUY9PzQ2Pzs4OjkwPTg5OTk6PTxEODs6Nj1BQDY8QEhRRzkwNzxBQz5ARDhARz0xMy0zM0UzLy41My8rLyguMC46Ni8nJDIwM0IvPTtVgnYyLVZqXE9ZTF9nWTpNNV5YMzEbkqKVg62npp+jpKuyuK20vb6wt8WyuLvDp6mwrLCpqrGvpLG6sKWlr7OjqrmpnbKysKOloaqtsKyvpqifo6KxnKOdmZaZnZ6wqZicoqC1s6Grm6GtrJ+empego6mdmZ6loJ2aoaikkJ2jm5ehoKyfpaagmqChlpWRlpGahrWbtXmGqZq2mXeHs5u3f5SXmKyXf2uBpnqBhYaRlJJ3q2dqsVuse46HlHSJcI+GgH+IkJd4g4KKl4yDoI+FsHZ3n3Fra218i0+lWEhjY5l+Y2ilX3lxdVKShl1QqW5jcHuFgGGdL1KibltUa2dgTEtcZFhcWkI+sHdXWEEjTWlGQkRBQEExOT44ODo4NDs6OTw5OkE6RTo6OzY6Q0I4PT9LTkg6NTpBRkJBQUQ8RkQ7MDIwMTtGLDAuODQwLC4oLzMsPjgzMR8vMi1EMTw8U31uMytYalxPWE1fZlc3SjlhVDUwHJeglImzpqahrqmos6yqu7bCsLzDrbm3wqutra+vp6+zqqKvvKuiqLatpKy1pKWys6ijop2nqrOpsKimnqCgsJagmpaWl5ugsKScm6Sota+hqI+pp6qbnZaYoKapm5+do6CcoKOlpJabn5ianqOrm6WanJqioJeTkpOTnYTVk5m5cbHCf8aHfdaUnLt9nJeoko+djaR7jYaigaWCeat5j51Wr3uJfp9quVq5d4WEfaaClHyZeqp5jp2Qe7FtjoR0kLuGb5VQr6fFilGgemNgqmJzcodrlodeUrW0yIV+iHxjpDNCnXZdUWpoZFBAWGZZZGFKR0xqSlpTT1lmWkNDP0U/MDw8NTk8NzQ8Ozg9OjxDOkY6Oz42OkBDOzZAT0xIPDo8REhDQkNEPEVGODEyMTFEQi4vMDQ4MystKS4zMjM5NzEjJTUqPjM9PVF3ajYqWWlbSltQX2ZUN0g6YVA3MiWco5OZsaippbOqpbSnpLy3wbC6wLK3tb20tqiysaSys6agr7apm6i6rqSwsaGytLGhpJ6eqKmxqbSppZyenqyXmZmYmJaYo66fnJeorrGpo56OrKKnlp2YnKGnopiioaKhm6KjqJyfoZ6VmZunoZymlJubn6GYkJKVkJ2Ism5otXKsiHCOp3O0dXS2e5yZpo6QnY2jfo+eo36wdYKQ0tJ1XK58hX+kbpuqpmqGhX2tfZiZkHuxc5Odj3mzZZZ0hZ5un2aUUsmLWsJcn3liX61fdnOGYZaIXVnKnW/AgHRNS7VTVcZkVlJqY2VYQU9qX2xpUFVGSDk9V1JbVllIQj9KPDI/OzU9PDU2Pjs3Pjw9QztHOTtANzs+RDsuQ1JKRz4/PElKRkNFRD5JSToxNzQ2QD4vLjI0MjUyLSkuMjYsNzQyJh82MDs1Oj1QcWg5J1dpXEFOVF9lUDVHPWFNNjIuo56Rpa+tpam6rKa1pae2u7yyu7+4t7W8vLSmtbWjsrKjoKywpZinu66lsrGdtLiqoKWdoaqlsqisqqWanZupn5aVmZmTlKSropiTp6uxpqGWkqyfpZKUoZylp6CVm6anopujoK6aoZ6ekJaco5+cpZSdlZmjn5aZlpObhax8eKh3o4+Lh6lwrouEqISamqOLk5qLon2Sl4euhH+Bs1xyslOvfYKCo35x1313hH6PnYaZmnevhoqRnIh3tGGaZZqCgZVskluwV0uadZh5ZmCtXnZ3h2eXiGpdr3eVn493bDV5yK6zYERVb15nYEVQbF9wbVZVTS5lY2hSWVA7QURATDo1PzkxPjwxNj85OEA9OkM6Rzs8Pzo+PkU5LUVVSkVAQzpNS0pCSEc+R0s5Nzw0Njo+LzA0MzMzLjIuLjE4Ki4zMiUhMDM3Njc9UGtlPiZWZ1xAPVZfY042R0JgSTo3N6CdlKC3sZmzwa2osqeqsrq4tLm+ubizt762prm1obWtoKCprKCVqLasqLGyq620pJupoKCoorWnpqqkmZ6VpaKUlJ2akpakqJyUkKetsKWglJipn6KPkaKaqaahlZqmqZ6dpJ+tnaGdoI6Un5yfoJiYnJaXoqCUmJGnnoepfn+meaGPkISqcK2NgqeGl6GiipiXiKOBkIaUqnp/i515cLFaqIOCiKB4dNh/dod0p4GOm42SpHyVkJ+Ee7JenGSgfYKVbpNcq1xbk3+Rf2hnqmNye4BqmIZxXataiaCPa25kT0pDoVxbTXRdYmZNWmFfcnRfSlU1SpqRWEhFPUhGQU0zNUE4Ljs+MDVBNzhAPDY9PEY/Ojw2Pz1CNy5IVkpFQEg2S0lOQElLQEVOOjpANC47PjAwMjE1NCsqMDUvNywmMjEoJCQ2NjcxPE9lZEEmVWZbPzFUX2JMN0ZIX0MxPTeinZqavq2Ys8Guq62oprSwuLG1v7m6s7K5vKq7tqGypZ+mp6efk6uyqbCqtq2qr6GYoqCmpKS6o6OsoZebkaOglZWfm5WZoaGRjoypsLCmnZaap6afjZKkmKisqJWYqaifn6CkrqOhnqGOlaGZn6CSnJeclp6hlpePrJyPrm5ytHSpjHeLpnS0enW0gpSmpJOdjYmkh451uG6Le4uia2u2WqGGZZeXaKCip22UcrRzk5l/s2qFkoitanW0YZ1mom6GkmuXXK1gTqF8h5FSc6NseX9+bpiGb1yvVjycd2VUb24uW6dPYlJrZWJsWWJcYHB8Y1NZUT4/bG8yQkJAP006ITdANi47QDM3QzU4Pz8zOzxDREJKRk1JRjYySlRLRUJKNklKUD9IT0NGUD08RTUwOzswMTAvNzUsKywzMjYvIzAwLCwdMjg5LzlOYGVEJ1VkWT4vVV5hTDVGTV44MUE4pZqcnrqjnLG/rq2rq6e3qbivtcG1vbKxu7irwreqrKGdp6SinZKrq6i2o7Oorqqhl52ooKWruJ2jrZyWmZClo5aOnqGcmZ6fkZOVq7awppmTm6ypl4yUppqlraORl6uypKCeqKywmaGjkJmhl6CblpuXoZSdqZ2UkKuZh9SUmrt1scSAxId+1pecuHmKkpmOmIqMp4d5orZ1fXd2woKasmGDunnAfHW4YrWBjIepfZaCrKlxe391vIinoGmdYaaOr6F+jHSHq32+bnO8dLKDdXiBim2aiHBtjaR0vV13fVthebxqWlZbaXleaWBkZmJteW9YW1lDQUBxP0NHKzVIIic7PzEwPD83OkI5OT1DNDxATlpeYGBfX19aUFBSS0VGSjRITFJASk5FRk9CPEU4ND05MDIwLjg3LSouLzE4MCItMSwzHiw7OjA4TFhhRidUY1g8L1ReYEs1PExbLTZAOaean6K8o5eww6+tqaqssai5r7fFsbuzr7ywrsGyraajn6SinJyRqqWqsqS1p62kn5aaq5mnrbido66ZlaGQpqCTjp2kn5mfmpCWk6+5sauVl6Onp5SQlqWdpK2fkaCoq5+cn6mksp6ipY6moZWhmpyXlaSZkLCgkpWqn4WQmbaAkpKNuJZ4g5ObtndubG90b3mPhI6Jcp7Au7yae4GyqHCAdJG5g3yGhoqHjXuKho2XfaS7ub2cdXmzo3R2l3V0sHWYnmaGaY22dHJxd7aMXn95fYlng3lseWKLrHB0hX5YW6dpRGRZVGZfY11jUWdmcW11Qk1PTEQ7Wkw/SjM8MCA4PjsuMz1BOTk/PTs8QzZCVFlaWltbWlteYGJgXVNHR0g0RElUQktOR0VPRj9HPDc/NzA3MC85Oi4sLy0qOC8lJjIoNCQoPjcvN0tUX0cnU2JXOCpPXV09KztWVic9OjymnaGhv6aVssKzq6qorKuqu6+xxq+1tLC4p7W5rqukoqefoJ2ZlKykrqqmtqion5yWoaSerKW+p6Gql5WckaKbkpCiqKKTnpeSmJSytbasmJ6jpKKLk5KmnKarnZappaacm6Gpp6ejqaGRrJ6Xop6Xlpidno+wqZScp6KPa39qnKl5iXR/m492e2aHe76/wLpvkoNxlIVfcmpaXpuJYWOHjpVrYH+UY22cdmKUa4CalZRlXmBjcZqJaHKMfIaUZmp+cHR4fn1iW3h0gWhQXG6EfHyKalhseYFySUpvhXBOck1EVlxmYExaV2ZjX09abXZqclJPREVNPEhJPEw+MiwyQT84LzU/Qzw5O0A7PUM+UlZWV1laW1tcXWBhYWFgXFVHNUNGVUVKT0hGUElJSDs4PTUxOi4xOzouLy03Nj01JiIvKjIsJTs4LTdJUl9JJ1NfVjQpUF5MKDM+XE8nPzI+qJ+oocGkmbS5tqOspq6nqLWyrMissLSttqS+sbOnoaSqnaOcmpqsp66kpbWqpJuYlaKcp62pvqippZWUm5agmpOZpqmokZ+Qj5icsLK+rJunnaeiiZOSqZuopJycrJ+jmpyjp62in6qimq6blKagl5Wdn52YsaWZoqiZnZKfnaSmm6ikm52anJuRl4Jobn1yd5GXlJCEibSqjYWYlY+KjJiWh5SViYOTk5CJjZGUmZOZl5qfoZqblJ+bjYJ6pIVsaXuQfYB1iYuCcoJ4eXZ2ioB8iWpzgnSDdWR3fXZrb3lsX2Jbb2dNWFlmal9XWXB6b21mU09GUjlQWk5STygrOktCNjM1PUBBOTpDPjxFTlNTVFZXWFpaXF1gYmJhX15eW1RLQ1NHS05ER1BMT0k8Ojs0ODksMjs4MjApNklSTzgiKSsvMiM0Oyo3Rk9bSidSXlQxMFReOis9OF1LLDwtQLKgs6K/oqOwsbegqaazp6WwtarJq62yprWmwKi0oZ6lppyllpagq6eto6S3rKCZl5agmK2qpsGfrKSWkpyXn5iUlaKfnqOok5CYqKiyw6+Zq5yqno+Wlqmeq5yeoa2YoZudoqWvpqGkqJ6smJalnZmaoZ6enbChnaKnlpmUmpSho5ekoJmhjpeVi4uOkJiuj3yVm4KRgYmpqIWAmJaLhI6fiHuEkYaFmpGHhoqVjpuXjpCYnqOWmZKQnI1/jWWhs66EiYR3e5CKfnd5em9neZGBgYlrdYF5iHJoc395dYOGgWp0YnhlX2hkY2Rmalhre3Fqa1xTTFBEX1VGQD8/LDRARjs0NTs+QTs8Pz4+SE5OT1BTVFZWWFpcX2FjYV9eXl1eXVhWSktMQklPTVJKOzw6Nzg2LzM5NjQuKCYkLTEuLikrKjclKzwoNkNNTEQvVFxRMDVNWzE3RTRcRzU8LECzoLmvvq2qrbGyoKqmsq2irLOwxbCrraSzr7yktJygqKOhnpmXqKappqSms7WelZWempqwpq6+oayikZGempqUkpainJepnYSdqaujtMezn6mkqpaWmJqnnqmcoKWrlJ+fnZ+qrqilo6uhq5qen6GYpJ6cn52wpJmfqZSZmZ6TppuZqp+cl2aEk31lf4+bkGN5jGxoanqQo6tqZZqYfmiFimVlaWh6jaKOa2iMl5Gid2tqi5min5hzbG56hIyGeVhlXYWBXmyLioJ3XGdzd3eSgIiCb3iCeH9zbXmEc3aIh42CemiEWF1qc2Rdc4hpa3xxbWNdUU5XSWRYQEozPUY3P0ZENzE8PT9BQzs7REdISElMTk9SUlRXW15gYWFgXV1dXV1fXVpVT0RIT0tTTj0+PT02NTM1NTU0KiYmJSwqJS4rKyc2KiQ7Jy9BSVtKLjZaTzYpRVkvRE8xWUI7Py49pJ66vbmvq7Owq6Wora6wpq6usL2xqqilrrCwn62YoKSeopqap6ycrKOmqKmzrp6WpJCjsKa2uaWuo4+PmqKak5KboJmZppZ7pKuiqLTDt6Whp6+fnZWeo56jnaSqqJKfoZ6gqq+pqqOqnqabpZ6noKyWoZylsaSXnayWop+blKaZoKyZn369hIlztHOFn4ataHe5xLhxkqGjeqaYmXSqgXzLwMC6cYujh4OefZaYiJ7AvYKWnZ2NnMHBfIF6kYyawsB9aqWyb42Bb8p6f5t4koSPgHd5gYB5cXuAhnB3hYuSeGx1kWJlXndjX2WAYl50aG1kYlhLVklRWkhPRDJJRT9EQj4vPD8+QEE6OERDQkNFSElLTU5QU1ZZXl9fYV9eXl5eX19fXVxTTVBHVU5BQD89NjQ2ODI2NiomJSMpKiYuKyopMTAfOSojPklbTCojQ1AvI0ZbM1BZL1VBQjsvOJWiucO0r6+/qamUo6+psK+tprK2r6qmp6axq6CrmJujoJybqqeinauipailpbSknqOTpq6tuLSnr6KSkZmdppORoKGYm6CeiKarpKutv7+xoamvqZaSn56imaOkqqOToKGenayuqKulo6Gkn6SlnK2pkaSbqa6qnJ6rna6jl5iml6KkmJ1/zpR6e6WCepaXm1+tj12OqIChoXynlZt1q4OAr15kjKp7qIeFoHSXk4izY4KrhqCNjbNqhK90fJaHuGGCrVmjzW6Qdnvbe3+ZcX6Ik3Z/ZXuIdnZsfodtfYWPkH1rgIxfcGpvZmBfeGRbcWhqZGZgUlRTV15KT0M1QUhFRDg+NTtAP0E7PThAPj8/QkRERklKTE5QUk9TXF5fX15dXV9gYF9fXVtXT1VKPT8+PDU1NzgxNjQoJyQhJywmJi8oJiszHTYwJDc7U0wrLC1KMCc7WzpMLSFQQEY0LjGswcC/tLSwt5iekaOqqa21rKayrayspKymsKqhp5yappicoq+foZ+op6OmoZ+wrJuelqaurbGrqKyglJKbn6WTkJ+ll52oo56to6qwqL/Fs6ipsa6Wk56copehqqqflaGenZytrqapqJulpaOhqpKss5aloqqqnqSnp6KyopObp5yhnJaVkZehcoWMmHaFqIdxsXydcax9oKCBpY+eeKuCfq1/nXKtf6yHhp92mJJ7fJd+qoiijJGLnH2reoiSj59/eq1WnMR7kHCTwX2BlW11cIxtZndlhm9hd25yboiJj46DbI+NY21zdW9gZm1kX29pam5mY1dTXGBaUlJDOUlJQEM8PjxARkRDRUE9PDw8PkBAQUJFRkdFQENJU1dZWlxdXl5cXl9hX15eXVtaUkM+OzkxNDc4NDUyJiMfHCAxJyAxJx8nNB41LSY3PVdKLTwoPTEpM1ZARiEcRztDMS0rr9PGx7Kzn52jj6Oioq2vt6+psaeoqqiuq6unoqSdmqOVn6aroKKmoKioo5+esK2Ym5aop6+tqKepnpeVmqSikpShrZqdp6OvrKKstam5zLGtpq6rlpWcnaKZn66snZahmZ6eqbGnqKibqqejoqqar7GiqKuuppqnq6urs6STmKSnnJaThaRrpHWKeql1e7JxgqWKmIxwiKCbh6RfYVKrhYCug5x1roKohoafepmXhntmgKOKpJiGgaN9qX+BlIauXnuoVZ2ikoF6o5+AfMSwxYxzr7SzuXJiqa/CdWiLi5aNgGuXkG1reHh3bmtmZGRxcWZ7aWNcVl9pWFhUTExRTENDQUI7Q0BAQkk8PTo5Ojw9Pj4/QT04NjtETFBSVFZYW15eXVxeYGFgX15dXF1bU0lCNjc5OTY2NCwmJCIgJychKy0iJC4hMy0mQERXSCxHKzU2KjFQS0wjIEE5RDQsJ8LJ1dbAoZmrqKGvop+wtLCwqa2jqKeqq6uopKagm6WfnaanpqSdrJqirKGjn6+jnpuTqqS1sK+hqZuclpWnpJGboqifoKacsKWiqLGstsextamsqZWRnZ2imaCls52aoZScnqeqqqKtmqunoKGporKsoaqzsqKcq6mwsLillJelqZqdk32qbZ+EiHareXywboKki4mflpWeloHSuLS4yYGCsl9hlKmDpYiHoHqYlpp5qsl0mqOUqKmQkpqMfpqJmsbGd2WhgqVzgZ+Ogn2vXm+1Y7F1S6OGbadHg5Nkjo+bkXtvlI98bXl0fHptW2VqcnFmgGleYVhjbVxeWUlMTEpFREJBPUE8QT9KOzc5Nzk5Ojs7OzMuNjxBRklMTU9RU1daW1tbXV5fXl9fXlxcXFxcWE1CNzU3ODUvKSglJiUkJiksNUZOUFBNRkxKVkYqTDAvPi00TlRRHRw7PEYyLCSopMDGua2psq6tpaKds7msq6Gmm6imqqyppqCmpZiro5+vrJ2moa2an6mlnae1oKOYlKirtrOsm6acoJaQpq2Smpyno6Cqp66ho6epsLPBsbKpraiUiZidpZuipK+ml6KVmJylpamZrpyspqWdq6O2rKGxubCenLCotLS1ppaZqaWcoZCDnk53moKAn3qEo3yCpISGpp+cn5SEuHx8ermCf8zGw7Z3m6KRi59+mZeXinafl4qkmKSofq+Fm4OehKx9mZRhpWyjcI+FkIF9loRyrGCkc3GAmmG8fVJVdY2RoZV6fJCOh3J5coR+b1tsbndyaoFuWmNfaG5iZF1MTFFTQUhHRkg6Oks+QjEwODg1Njg3Ny0qNT09P0JER0lMTlBUV1lZWltcX19eXV9fXFpaWllVU09IQDc3Mi4sKi4rKicmP1FUVldXV1lYWFdVT1RGPEUyOlBbVBwbNj9HLC0gjIeZqaykq7mrr6CboqyztaafoZWmr66uqKeepaWapKehs66iqaezoJqppJSjtaOjlZehqbW5pJyjnaOTkKKymZ6bpqWhoq+tnKSoorWxwrCtqq2qkYeRnKedo6ScpZeemJiZpaOnmK2hrKOkl66lu6yit7aunp62s7qztaman7GjpqCIkNK1w7d6h46FkZOPgKZ4lKJ3jKGShaWDi3Krh4a0bnJpmaSdlYmffZeZh4eQc66CpZujjaaKk5yIlJCabXCyXKVzk3qcbJl/e5l+bqlhonJyfp9ic7K4aHeOkqSXfImKj4h1e3iNgWxod2l4c25/dFxkZG1tZmhgSlpXWDxIRj9TM0BGPjwqKDYzLjAxMykmNDo7PD0+QENFSUtOUFJUVldXWV1fX15eYGBdWltaWFVSUlFGOjIyMzAvKysoQFFSVFVUU1RWV1dYWFdVVVZUUU9RW1UlITJBSCMpJZJyjYquv7+8u7Wel6ikrraiopmVo6qnramqmaWin6ahoLWnoqmnsaSUq6OPpK2knZCamqq0tKSdpZypkpSXr6CgnqajnKectZmgqqO1qsKvqaupooyEj5yioaajlZqanJiamKajpZepp6ugpJuspryslb2wrZ+jsbS7rbapnau0pqqafKiRfXyweIuApKWInG2yb6GHrXyij4Ool5qBrImGrYWglKigo5eFn4GZloF7kn6rgZ2Zlourd52gj4iTkn95r12jgXymp2SegHyXdGuuXaVscoWZXWBbjKBtlI+kl4GSipOId3mBln5qbH5ifXRtf3lfZ2Vwb2hnaEJZX1o9SlMyUzhBQUM3JCQzKycnMywgLzY2NzQzNjpAQ0ZJS01OUVNTU1ZaXV9hYGFhYV5dW1pYU1BPTkk4MTUyLiosQVRWVlZUVFVVVVVUVFVUU1NWV1dYVlVWUUhGSUojKCi8kpuEqcbDt8G0n5qtoK65pqOOmqOkoK+uqZ+jnp2tmJ65oKKroK+qmq6hkaqppZaKm5CusaynoKibrZiZj62ioZ6loZmknK2Xn6iltqi+rqSpo5+MgI6bm6CmnpKUmZuUmZmlo6KYp6qqoaKeqKi8pJfDraujoq20vK2wqaO1saqtmnevfpGLnIWHfbqtiZhksIxllq59oZCEp5ecgq2LhbCGp5qkoqKRhaBcbGuCs2B/rXx7goCybGZumZeLiLFafbRbpINryKJmn4F7u1l2tVqyfVOvgXqsWIChbZeNppmIlY6Sk3h3jJt8Y3N8YoN3dIB8YWpmcG1mZWVPVWNcQVRdPUgoPjk9NCEhLCQfMi4gKjEvMDQ1Nzk6PEFDRkhKTE5QUFJUV1peYGBgYWJeX1xbWFVQTUpHQzU1My4vQFVZWFdYV1hYV1dYV1ZXV1dXWFdXWFlaWltcWFdXR0I70p+zsbe+u7TBs6Ocraalt6mgi5mgn52ysaieop+dtZigs6iqq56wrZ6snJWuqKKOiZuOr6ypp6Ooma6Tmo+pmqGdpJ6Zo6KlmJ6iqLGou66kqJ6dj32Lm5ahoJmQkZqckZmXqJ6fl6espKOkoqSpup6gxqemqaGstreusKmhvrCvr5eCqpKjr46bgIakl5iQgIC4w7qEj52ThaiZnYOsi4Oviqicm6arkX7VvcKqYqS/vX1/o4KD17q3tYSUkoKevb6EaqOBb6uEbp1/erKxx4Nrq7C9rHl4or67dICVjKSajZmOk5l3f4+ZeWJ8eWSMZniBe2BrZWtqYlBiW1NpXEBUYEJMKTw6NC8fHyQeJTIgHCQoMDQ5NjY3ODs+QURGR0pLTU5OUVRXXWFcX19hXmBbXFlUUU1IQz48QT81PVNZWVhZWVpZWlpZWFdXWFlaWllZWFlbW11dXFpWWFRXWruVtLSxwLqyvbOina6nprOmnYyXpb+ptq+nob+mprGbnrGcuaifra+lp5WUr6yXjIOaka6mo6yhpZyqoJiKo5OmnaebmqCoopidoKusqbisp6Oal5N7iJmSppuTj5CYmY6Xk6iYnpaop56opqCiqrqeqcWjobCkrLS2rLKso76rsbGcdXaqpbeFZYmfcGeskIqPbm53pZCboIJ2sZuXcZGOcpeppJuYr6RybG1tZot4b22DmXGAemlwaWeJlpWXcWhphYZncYZkXYpjaW9aXWd+eKZgYnKQknBmZICNko2glpWXjpOaeoWNk3RkhndnjGp4fnlkbGNmbGJLZVdKa1k6UGREUCdKOSsjHCAaIiwpGBsYLTIuNTo0NTc6PD9BQkRFSEtMTU9RU1ZcV1pcYF9hXV1bVFBMSEQ9OkFCN01YWVpZWVpZWFhZWFdXVldZXV5eXVxcXF1eXV5dW1tVV16ola20qbq6srSqqaKun6SzqpmSvbHDx7y0qZ6/q6yjoKeroLqjpK2sraaOlq2qkIyFlZetn6aqop+ko6CRi6WSppmpmZajqaCWnKWlpq65qqyZmpOSe4SXjqaXjpGQl5SNl5Smk52Wp6KZr6Wdoqu5n7DBqKW0p62xs6yvrqq8p7G6mIyiqaa2nImWopiGqZuQlJ2SqrSanKStorSYpKKfoqOdoqWilqynjJKTjYeTnZ2VkJmTmJCOlYR/pJqXlY6Lk5KKkIeEfmeMgXSDd3SHjHGnbX2Wk5SUgYGPj46Nm5KelJWTnYCFkotwaI92b4l3dnx5aWxlZG9kVWFYQGlaR2JfTVgrRT0rJiE2NDAvHxwgJTIoKjc5OTQ2OTs+P0FCREZKS0tNUFBRV1VWWV5fYWNdXlRRSkVDPjk9QEFTWFtcWVdYWFhYWFlYWFpbW1xeX19gXl5eX19gYGBfWVlgpZapqqS1t6+uorClraCht7GRjqrEvMO5tqmhpJ2bpZ2wqKS3p52ptaeokZiso4uIiY+cp5atpKGaqJ6ek5Wkl6iaqZmUpqCjj5qnmKC0uaeqmJqQjXyBlYyhlIuVkZWQj5KXpI6dmKeemrSjnKart6ivwq+kuKewsLKuq6y2vKOyv5qTp6SmtaKSnaaejamfjZKfoq2xm6Kks6uymqainqWrn5+enZetnpOaopyUkJermY2YmJaQlp6Rh6CelJSFk4yPjZWMgX9mjYh1iHd6iYR0nGqIkpaVkol9jJaRkJaRn5Cak52BhpaFeHGUcnmJf3F7fmpuZF9waWBcX1ltYlBgYk9YOUZGRT0yPD04LyomKykmHSY0MDY2NTg6PT0/QUFDSEpHSktMTVNTU1VaYGBpYGVWUEpBQ0I7OUVNVlteXltaXFtbW1xdXV9eXV5fYGFhYmFhYWBiYmJkYlxbY5iWpKijsLOsrqOpp62gqLWqkI+bo7K5raqroaKZepyhsKSmsaiWm7imo5SYqZyOhoqJm6KQr56klqigoZKXmZyui6qWj6iYp4yYqI6duLWjpZibjYl5gpSMm5OKlZGTkI2RlqGLnJynnZ23on+DrrWisLB1pL+ks6F5e6Kttb6XeK+moYqAqn9kXGJ2n46knoOWfm2UtZ2kqbCspWagoZR0epuYcIGZqplsf6SpimWcpZyRl5iWi5KbkISdm5CUg5OHjo6SioV4a5CIdodxfIaBgWFpiYyVk4xbdpWRZ2eOjHJ5oZaVZHiXhYB2l2iCiYJueX9qcGVfdm9ra2dcZWNhYW1RWT1NTU5SRj1AVEI5MS8eHyY0OjMwNjY3ODw7PkBBQkZIQkdHSUtMVFVVWV1gaGZnWFFJPERHPDlVUltgYWJgXmBfYGFhX1xdX19fYWFiY2RhYmFhZWRjaGReXWaclqajobCxrKuqpamupKetpZKWqrSusKWZqaWql3OLnK+gqKunk5a5oKCPnKSekX6IiJqejayapJWnop6Ol5KehXWuj4ilmqiRlqOIm7mzp6CYmIuJdXeTjZaTipOQkJSMj5KfjZmepZibsZWAjJu1nbSMko+9qKJ+p6N7pbG6g46PqJ+EjIaPsamvjImWopp5gIushp2eo6mrqYmWh5l3ppx7iJyBmKeDgXuds3uKhqCYmZSYloGQlpaDmZpieYiRhI2PkouEbnGQiHqCcYGBhoCHdIeFl5N4lmiTdKCac3uZgpyZhJh+kYiBgphpjIyEanh7cXBnZXhuaWxqXGRpaWVxWlxHU0xRQEU1LVlUVDYpITA5PT42NDM1Njg7Oj0+Pj9ESUBJRUpLR1JYWlhbYWFpZllRSDlETDw+YlZeYmRlZGBhYWBiYl9dYGFhYmJiY2ZnY2JhYGVkY2djYWFonZikn6aurquoraCpsaenqqWZlK3FvK+glKWntJ2Pg5ysnKeioI2Qvp6ZjZ+aoZF9ho+Yl4isnaOWoaGSjZSJhoCRqI6Hopyjk5adhp65saedmpKOhXB1kImVkIqUj46bi42QnZCVnqOUnauHn7SJtJqui8qIq6+Kt4WNsISzsYWpjqmZjZ18qI9ye3ecjqaWaJWkebSMoaCoqpOZwoKAq4mZoXKegJulfZeFlbOBoX2hk5+PmJiAjpSciZiSi3yFlIaNlZOKhG50koaAe3OHgYR9hXWGg5iBj8VmgKmHj6JqnYGel4CZgIqLg4iYb42ShGd3dHt2Z2h1cGdoa15ibmxmbFdkRl1RTDJFNDZNYGM3JjM8RUdEOjYzNjU4Ozg+PT0+Qkw/TklKTENQWl1cV2JeamxcUUU9S01ASWRYXWNmaGdiYmJiY2NfX2JhYmNjY2RpaWNiYmJlY2FmY2JiaZWXo6CwqamopqygpbmxqqummpSeoqSpoZSjqbWir3+gp52lnp2JlL2ak42gkp2QeYOWlZGIq5mcm5qihY+MdpubjqCRiJ6jm5aYl4aiuKylmZuMjH9ibY+Lk5CNj4uMl4uOkJ6Nkp6gmKCnfqGnh62doJaukKCenZGHgqCNrbGIpI6sm4yafqJ2gJmUa4GrdU2reIeNnZOcqqmCqqt+hKF8e6dqnoCTbGeXhpi3iZ5+bmBjWIOXf417ZGeLc5l9eZdsXHyXbmBTcYVcYG16hGBZZYJ+hYGZcaira4OjbnKlcJ+CnGdknmxabIh6ZVlfgn5hV1BvdmVudHFqam9daW9sa2hXZk1dWEU5QTRHQ15rNCtJQ1FNTj04NDg1OTs2QDs7PkJPPlFSS01CSltdX1deX2N1YE1FOk1OTVRiXFtmZmlpYmJkYmRkYmFiYGJkY2FiamtkYmRkZ2RiZ2VhY2iYl56guaGqpKaskqK2vauvopmWn6Clq6ufnK20oaeRoJ+gp5yZjpm0mZCLnoyVi3WBlJGNiqaWlpifnn6ThYWso4eckYqYqJiZmZGHpa+mopWZh4mAaW6IiIuOjomKjZGLjpGgi5Kdn5qhpX+TgY+joZSgd5yWkKeDo6mAhqywh6V6jH6Emn2icHOTh5V7nox5bYeci5qSnKqcj4edfYOidHemZ55+d6VemHt9k3Oibpi3tLpzk4iBgLaoZIHGuHxxlbaMcYCbo2N0rKthfmqds35ufoiDj4OMmHGAo2xzpHOegn6jXpyZs5Zve5ees3RyW56ygmlicHR1cWhvWGprcnJlW2ZcYUxEPUQ1UUFZcDI8UkdfSlI9PDM5NTo6NkM8O0BJUD9UTk5RQEVfXltZWGBge2RJQzhMV1VWY2FaZmZra2JiZWFkY2BhYmBkY19gY2tuY2NkZGhkYmdmY2holJaVo7mZq5yToI6luLatraCaoZuio6SsmpqxrKuSl6CZoaSZmpSerJuLiZF4i4VxgJaNio+hkJOUnZd9kYmOqKCGmI+KkqKTm5qMiqinpJ6PloeEfmt7h399j42Di5CQiY6TnoGVm5+boJ+LiXecmKKNoHKhjImpiZ2okZiqrYCujH56oJl5o5N4gHOXiIycfZWfh5uOmp2oiKNkoX6KlpCbjW2eaJuOb5qZe4CKp31yaHSqg56Dc6pnlJpdm4V2hJ1oqmqBuGZcqXCBnGGVjF+ndneKioCdaJp1h5OSmI1/nm2ZkGqmmVyofne7an2pWo6EXbNnXG5xeHdraVtwaXd4YV5kVmFCUEVPN1ZCUm00SlpaXk5aREAxNTE7OzdIPzpDSFU/WVNYXT5EYl1WYFFhY3xpRUI5TltdWGRmWGZmbm1iYmVfYWFfX2BgZWNeYmRvcV9kZWVrZGNpaGdraZadiaq2nKiJY5WcrLuysKydpZuap5+drJmdsKeqnZejmqKfmZaWoKOZhomNaYiAcnuXh4yWloSSlJiPeoqElqSciZWQhoudkZybiI+ooZ+ai5CKgIBpgYZ5f5eMe4iNjoeOlZl+kqGeoKGTmHJon4qgj4xwkoyCqYmaoaWqo6p+sK2koriXdqOzoqN/iJR4nXqqmX+ij5+dmYmYcqF9h42wtX1smpGheH6ZtaOjq6iEmXyafJyaf3SqWl1ve5eMeJ5iTX97e4VkephCTZ9ZompzfI5vgoqEmXabeYeJsbN/fpqSpnR+nW1xfJRvmXJpo12VdkhlY2BzcH19bmVfa2d1e2JjX1BdVlxUVkBZRVBmRFJWXGFYXklEPUI4P0E6SEU4TEVYQVdSWlZFRmFcWmBLYG19cUVDPFVeYlplalZnaG1vYmZmXmFgXF1eYGhiX2VkdmxeZWdmbGRlbGhoa2mUnYGxrpqEU1+hp7S6s7OpmqKLmqmbm6eSoKujoKePnp2dmpmVmKGdloeHiXeFgW55lYSQm4t9kZOWiHKAiZKhm3KSkIGImJSfmoSOqJuZlYqKinyDbISFcYKhjHiEjIiHkZeTe5Gin56jiK6GfbWEj56de6aWeqmCl56RjKOgf6doeG5+mXOgc3F8nYWYb5OCrXyjhKefm4OkcF6paHajZHCmYZzTj3x7mXhyc2OihpB+onKjkHZrkLOLYIKYinSqsqi8f3eDbn+/pqq0Xpxvf3KXcIJzonJepGd0pmBopmya05h6gptudnmXa5t5dpdybKmlZ19keXF/hGxoZmNtdXdmX2FRWmVQUWFIVklUX1dTW2RqW2RQRUNLTEpLQUpEOFBAUE1YU1hPU1FgZWVpU2R4eXdJRkVjXWVaaGlTaWhqbmNqZmBjX1xdXV9oYmFoZXxkXmRnZGtkamxmaGxomJt/saxUXUt/qrCytbCzopyYhJemoKCijKSnn5epiZmYmJSZk5Kgl42HhXtwfYRofI+Dk5qCd5GOj4pwgIaPk5JsmJR8iJGSo5WDjamZk5KKhIl5g3aIgG6Bn4Z3gJKFh5iglXmRoaKZn4mzoaK2i3qsp6SupXCpgJuRhoGelH2kgaKahphxnoSira6Jl4t/jKSNlYOvo5V3tba2yaJzlIyDn2Cel6lteZaHoJt1oYd3oH6QlouBb01mo5JxmohzpXt6dWKDgm1+oGxyZGCcc390l2t7arS2tMamc5h+epxqmpqrdIGabHN3l2mZeXSXcVBEfbNeanVreIZma2Zic3RwbVVbUlhnT1JnSVVMWFJVXGdrblVnV01KQUpNS0dKTkFRSlBkY2ptZXVzc354e251iXp7VVFPbV5oXGtpUmpoaWxnbWdjZV9cXFxfaWJkaGt7X11kZ2NqZm5tZWlsZaKdibCohWVAlKKyrK+vtaGij3+Wp6Gho4ukppybpoKZl5eOl5CQm5KNh4N5a3mGZYOMf5afeXWPiIyCaoWFkoSLhZ2NeoyKlaWSgpeolouRi4CJeoB9i3lwj6CFeYGUhoiVnpR+kqOmm5WWg2dueJxsomR8cqV4nJhwaKeCmY59pXuhl4OWcp92gImUlY+5bY+KomJ9maOXiW5za6trdaBub6Zgm2mLkGmWh5uVdaKBfppgi4aNdW+IYmihZp5/apt1cGRniIJvcqJbX1tkoW5eiIxxfIB0cmSlbniiZGanaJdyi5dtoW9SiI9uoF5kp1SLXVSYbW1ya3GBbXBoa3dzam9RVlVVZVlTbElYT1xIWGhocmpZa1ZQUkVWXE1YU2FVaGped3V7fHB9fHKCe39zd46AhHdeUXNhZ2JwZ1BraGhrbG9oZGdfXV1dYGpiaml2dV1cY2hjamlybGZrbWOdpZmmemV0bYunrqWpsLGmn4p/lqmcnaOLoaGaoaGAlZmUjpqPi5eQjYl7hnGAiGiLinyXmnN0iX2QfGWDh5WKiZWagnyIhpamj4Chqo+FkIqBin2AgI5zaY+lhH2Fk4yHl5+NhpCopZyJpniWm36liZaMspmekYSvl5+leZiJe6l1p5CEmm6looyShIyDvG18pa+Ch4aHlZedon6me3KolaGWaJ9+b6xjloqWk3iobaqjgYl1iIJ3q5GmiGuSsWx3s4ypbIuGb2+gnpKVYn+rjKp3gYCOp593n32FpJWdoGiah3WrZp6tjLZzdr6Mo5NZg6aNq2F1cnRve3VwYmp9bmdtU1RYVGBgXGtMXFJcSV1sbXZfW3FYW19aZ3NlbW9xY3F0YHd6fnlyeYNyg36Be3uNgYKAd2J5ZGNuc2RSbGdnb21yaWZpYV9eXGFqYmxse29cXGJpYm1pd21nbG5ilqarnYGAnqSWqqqeqKeto5mIgZapmZ2iiZqknKidhIyakIackYWSjYyMdIV6iINvjYV9lpJzdIZykYNuf4uSh4aUkH17goWXpI1/paSNgI6JhJR1goeTbmyLqICCi5ONiJqdiIuSqqKgj4B0lJeIfoF5lK+kf4KccY+GeZKNhoB7cqiNcn19epeWm4SNeHt9fYiUlZOLd5GZoaKFe3+KbIyGXHp5c3pxaW9+k4pxgHSCj5STcYaEgmWNf1+BgYx4dnOUdXB6b2+Jb4WGX3dpeI5mgoOGj6qcf3R9lmqJiG9+dXyDdW1sZoxzeHuXd4Raald5j2lud3Jxb3d4b11rhW5pZ1ZZXlZcZGpjVWBVXlFfb3d5a2p3ZWpqanV8cHF0c2FvdWJze4F4dXmCdX+Af4B5i4WCfnxugG1keW5eV25naHVreGppaWRcYFpjaWVscXVuWltia2Rsa3ltaGxvYY6Vuqmni6Gim6ekmaSdq6Kgg4OWqpCdn4iZppqomIOBnIt+lpSHjoqJjHKCfI58fo+EepaOdHKDcJWGfH2Si4aGj4Z5foCGmKOMe6afioWPj4SVg4aOmHdxhKqFjZGcj4ednIaKmqifoKqDiY2Vm39+ipetqJCTqJF4cZ+ThHyUcH+qh3F+lXFqb3yBn4t/kY6LaG5dhI2NnJ2gkHOXjIlydWyDdnSAWXJvh5GCfn+Mal1pZHuFhIiAYGl4e5x8hI2DdoKHhGl6jIlsYnFzg3dfc42DipGolodnjY6DbneLgm+Di3dtZGVjeYJ6lVpbaWZtdlt7eXd0bnNyg2ZcbYlra2JZWFxZWGpxWl5gWV5dZXJ9enRvdGNqaml7fHJ6dnRkbXRobHt/dXp9e3l5f4B/cIaJhHt9c356cn9oVFxyaWx2cHVna2dkXWFZamhranFybVdbZW1sZ3J5b2hqbWCMjKuxoZCjoZqfn5iemaiioX2ClquMn5OGmqGQpJV/e5iFfJKZiYiGhopyfICLdoWLgoSViXJvgHOYhoR+k4ODhoqCeoCEipqfj4Gln4Z3jpeIlYuLnJeEg3qsgZCXmZOJnJuGh6Gqn6Gio4uIk5udo5mWq6Kop6GTnImZkH56kJCGqX+Ak5GSk5yxpZqUnY+NsZKYhKaNjZadoYqRnYSJk4tsfY53d2aDhpGLfYmehYeLj4iIgYWEkXd8enWbpIqHi6CMh5Z/gI2DgXdxdYaEf3iJiIuRp5GEh46Hg4yQi3qFiYeNf3VqgIN8eZlpcWhgc4pwfXt3dm93dIFdXm+GZ25fXllaXFNncFVjW1thbGhze3tybnBjamlof3tteH5waHBwbGaAe3KCgHd/fX+Ee22DjIZ8enl8fXqDeE5kdmpzbnF7ZGtlYmJgW3NmcGZycWxVXWx0bWh4enBnaWtljYieup+Wo6GYlZmYlJikoJ16fpepjZ2MhZ+cip2WfHiUg3uOmYmGg4SGbXiAf3KAh36IkoNta356l4eEg5B+gIaEh3yHg42bnZGGqZ6CcoqPhpKSi5yRfI17qYONkZeVjpqVhoWbpp+imp2Gg5KamZmQmaahpp6ekJeCk4x4fYmQhqd8fY+QkYaYqaCck5yOjamNkoCejYqUm6CEj5iAiI+EcXmGcnVhf4SQh3aMmYGDj4KGhX+GhJVvenZ1lKSMjYabhoaQdYGMfn5zc3yJhXt5jY+FlKiQh4WPgYKJiYh0g4aGiXltanx/e21oa2xmXnl/aHx8dnR2dHp3XGBwfW50YGNaW15RZmxTZFpdYWpodXl+cGxsY2pqZ4B/a3J/a2t0bnduhHluhoB2goB9hXdyg42Hfnx7fIB7gotgaXtrdWhqg2RqY2BpXGN1Z29idW1rVGJxeWVveXpyZWptbYuKn7iaoaSfk5KWl4uan56cenecpJCbiYakk4qYmXh5jIV7iZGDjIKCgmx7f3hygIV9ipB8a2h9gpeJgYiOfH6FhId8j4CPm5uQiKabf3CLi4yShqChioWMfKeQh46RlpKUkXeMo6ChnZaaf4GQmpmTjZqjoqSbmJKcgJCHe4GFkImhgX6NjY98l6SgoJKZkJCljI+BnJKKlJmdf5OTf4iPgnZ1gnF3YX6BjodzipZ9iIxxjH6ChYaPanlyeo6ak5GAmH+JjHODiX19cnp8jYZ8e5OOhJemlI2GkHyEhYaEdICBhYV4ZHB6fnh5cGtqZl59c2h8dXVzfHJ/al5gdHZwd2RjWF1eUmpoVGVYXmBnaXZ4gXFma2NsZ2V/gGptfWdtcGp9d4V6a4uBcoGBfoF1doKNhn98eoCBfX+PanKDbnRpYohobGJfcVZ0b2xtYHhobFdqc3ZjdHp6cWJrb3mJjZ+zkqWmnY6QmI+GnKCam3t1o56Nl3+MoYqImpZ3eoWHfoOJfoiCgX9wfnp0dYKFfomQd2djfYaXioKKjXh9gI2DeZaAlZeVjZWfmn1vi4GRk4Wlm4eMiYOmlYSRipWWkZB1kZ2hoZiUl3l/jpiXj5eanaWempSVnXuSiIV5h5iPn3+Cio6Mc5einaCSmI6PoYyMg5iYhJSXm3+Zjn2KjoJ4cn5ue2SAfIuGcYeTgJGCa4eDgYCKhWd3cH2IlJqOfpR5jYt9gol+fHKAeYuGeoWSi4yZo5eDhIx3h4OCgXV6f4aDc152d3xzfXZma2NgfmprdnNzdX1we2NjYXNudXJtYVlfXVprZFJiV19gaGt0eYZxYmpjbGZofIJraHRobG9of3yBeWyPhXGAg4N/dHyDjYGAfnqCg358kG11iXR0bWaKbGpiY3VWg2lwbWB5Z2xhanZxZXh7eXBfcWyFhZCdr5inqZ6OjZeHhZ+TlZd8dqiaiZh5lpyLjJmQeHuAi318g3uAgoF4c3h5c32Ag3+IioBkXn2LlId/hYd0fX6Kf36YhJaTloyjoJd+cod7k5GKpo+MjoqSoJGDkI+Tl5CKgI+YoJqSkJF0gI6SlIqdnZ6nmZiOlZd1kJGLbYeakZt8iImQiW+XnZmik5WKjJ2LhoGTnYCUk5aHmYl8i4qCe3F6a3ZtfH+Mf26Fk4OUeG+ChH5+i4FmdGp9gpiYhYCOdZKKhXqJf3d5gX6HgX2Ej4aNlaWReYWCdIiGfH9xc36FgWtgeXR5cHxuYW5iZHtibm92c3h3cnNhdmBvbHVub1xaXl1dal1PXFdiYWhtc3qJa19pZWpjaHeHbWZsaGlsZ4B8endukIhzgIOEfXSBhol6g316gYR9fI5yeYt4eG1sh2toX2lyYodocW9mdmdtbGF6aGp8e3dwYXdtioGZmquhpKmeiouRhomeipSWfHasl4yWfJ6TkZaUiHZ+e4p8e4B2d3+Ab3Rzem+FfYGAiX58YVx+j5KGf4SEcnqAhnqPkYeRkZuSpJuTgX2BfI2KkqOJjYqNlpqMhZCXkpWNiIiMkp2Tj4yNboSQj5GJnpmioZiXipeTcIubhmeIm5CVe4qFkIpwlpqToZGSiIqYjIJ/kp9+k5CTi5mPfIuGiHRzdWtxb3Z9i3VvhpGOk3J0gHyCgol9ZXJuen+blX6FinWSjIJ1intwgn+Ch32GjYuFjpaqjnuIfX6KhHd9bm1+g4FhZndzdG56YV5vYGp0Xm9qenl5bHJwZXldbWxzbXNYWl1fYWpaT1dXZGNmcXF/h2VdaWhnYmdxjW5jaGhlaWeAend1b46Fc4GBg3x1gomFeIV8eISGeoCJd3+Le3pyeYNqa19waHR/a3FvbXFnb2tle2Juf3p3cGt3d4l/o5mjqKGnm4iMioGPnYaSmnR/qJORjYagjJWTkIBzfHaFeHh/cnN7hWtyb3ltiXZ/gIZucVtZfpKNiICBgXZ1gX9/oIaPipGcl6CTlneJfoCMiJydio+GkpeWhYiUmI6Wi4qNjoydio6RhG2Ji4+RipyWoZyZloaZiWyHpYVniJ+Lk4CNhIyBeJOYkZ2RkImJlI1/fpCZfZKOkI2akn2LgYRwdnBsbm9xfIdqc4OPmIpxeIB1gomDemd0cHeCm5B9ioV7lZN7eIp1cot8h457i4eFio+cpYl8hHeBin93d2xpfoB/W3FycW9vdlleb2Bval5vanx6cW5tam13YHBva3FtWVhgYWFtV1BTWWVmYnVvhIJiXWttZGNla5JtYGZmX2dqgXVycm+LgHR/goB5doCLgHmFfneHhnaDhXuHi397dop/anFifGKFfG9wbHVqaG5sd3hfcX55e3N1c3+CfqWWm62fp5eFjIN+lpWDjp10iZ6TkoWKmoyVjox6cnh0gnByhXNxdYhsbmx0bId2g31/bW5VUYGrlIeCeIB2coN5gqCCkIGSkZebkZl3kXqCjJKkmpOOiJSYkoSFlpiLk4uJjo+HnYSRi31yi4WIj4icmZ+bl5WBlYBqiJ+JaIiiiZSFkoSKcYORl4+ajY+Mi4+Nd3uTkXuPjI2Sl4x8iX2BbHdqb2tsbXt/Ynp+j5eBd3qBeIONfXpodW12iZeMgImHfJWRcnuGcXiOe4uOe4l/hI6Rn5+GfX14gYp8dm9nan+Ad112bm1rcHJVXW5hcWFfbG55cGhwZmdzdWhxbGF3ZV1VZWBgcVNQTltlZF14b4h7XlxocWJiZWWRaV9oZVtnb31va3Fzin12fYWAdXZ/jHl7hoB4h4NzhoV+jIyEfHmVeGdxaoNgh35vb2t7YGltdIB0X3R8eIZ3c3OFfHmhkJqxnKaPg4p/gpmJf4qcfoqYko6EiJeOjo6Ed3R2c4Bwb4VzcHGDb2ppdW2Cbn18bXVzUk6C38mS1pN8cHSDdYOfgpF2lJCYm5CZe5NyhZCfoZOTkImSm5OFfZWVh4yNh5KNiJx/joF4e4x/iIyKnJycm5aUeo54aYuUim6KpYaUiZiEhmOMkZiNlImWi4yJi3B6lYl8j4mLk5KKeoZ9f218ZXNwa217elyBepCPgXt+f4CGj3t6aXVrdIyQioOHhn6XjG1/gHCCjoCOiX6Fe4SRlpubjH13eIKPeHJrZW59gWpnc25naHNsU11vZHBaX2xyd2Zsa2JneHNwcGRfd2BhVWtfXnRPTUtfZmNceHCKdFxbZXZgYWRkjmNgZmJYaXNzbWtxdot8dHmGgnZ3fotzf4Z/eol/cYmHgZCKiHx+mXZlc258ZYd/bnBrgFprbnl6cmB2enuNdnJ2inZ6n4ycr5ugkYOFeIiVfnuInIaEnpCOhYyXhJOOh4F1d3B5cG6Eb21ufnJjZHdwfG56fGpobGKkmsHcru+ic2x1g3WEoYSRbpWPlJ+Um4CRcIWLo5eJjpWKkJ2Vg4CUj4WIj4CSioqXfod7dn+JeIaFjpubl5mPkHaLeHCJi41/jaaGk4uehoZei5SXiY6IjYqKhIlsfJeCfoqHipGQhnaGfn5sfWR4dWpvenRYiHuSh4Z6f3+Aho1/emZ0aoGLkIuEhIGNmIZtg3dviZODkoZ/hHuCkpeUmpF1dHiHjHRycGVzd4BgcmxvYWh0ZlJgcGdrVV9udHlhcmNgaX5xcm5bY3JhY1ZuWlx3TExLY2ZhXXZzim1bXGR4XmBkZoRfY2NeWGlya25rcneLfXN3hIF4eHyJcYOEfH2Ie3SLiIeVhYx/f5hzaHVxeWyLe250cIBXcHl2eXFkdnmGjGh2gIlxgJ2Imaico5OFfXGMk3h4iZyDhJ+MjnyVjH+aiIR8c3dwc2pvgWtpbHx0XmB3dntwdHpnYGV869q1ycPciXNsdIB2ipqIjGmXj46clZKBiHCFiKCOhYuVioyXk3yNkoeCiI96kYuGj4KAd3iDhHKHgpOblpSYho12iIByh4SLiZykhZaOoISKYYOVj4WIhYiMhoCHaH2Uf32EhYqOj4Jyh3+AcndodnJpdHhtWo19k4OGfYCDgYSLg3ZidW2KgpGMhICAk5J+b4NteoiRiJSFfYJ/gpOUkpiJb3J6jIV0a29pcHZ/XXFnblxpdF9RZHFoZlNfcHZ0YHBgXWiDcXNqV2dpY2lXbVdbdExKS2VmXmFyc4VpW1xleV5eZGd6YGRfXVlrbmVuanR3in5zcoF/e3Z6iHOFg3x/h3Z2ioWPmIGNgnuTdmx3dnl5k3Vud3p9WHmFcYBuZ3h2kYJkdoaFcYqWhpqhm6GKhnNvkotxdo2afImZiIl7n3+DmX+CeXF0bm9kcn5oZmx2dltfeHt6cXF/aWFnYX/Vto6RpnhucXd7cZKQjIZqmI2ImpCLhXpoh4uZhoGSkYaGl4x7jIyAgImNe5CNfomFenV7g3xxhoCVmY6TlIKJdoSIeIWCjZWfoYiXkaGAiWF/lIeEh4OIjH9/gmZ9kYB+gYSMj5B+bYN9g3VsbXd1dHd2bGOOgo+AhX98hICFiX9wYHRyhn2QjoN9f5KKenKFZ3uFjIiNhXyFgIGVkJGThW9weYt+dGxtaWl3emFnamlYa3RZUmhyaWJQYnJ4bGJlXlpqhG50YlxnX2VtX29UWm5NR05mZFxmbnKAa1pbY3NfXGNrdmRlXV1abGxibWpzdoaAcW9/fH10eIZ4hYN8gId1eImBkpV7iYZ2iYFveHl7g5JvbXuAdl6Df3SBbGh6c5RzZ3OHfHKSkoSan5ufhod1dZN+bXWSln2HkIOKjZl8jJp2fnZxb2xqYXR8Z2Jpc3laYHd7eW1xfmVkaGhXnY9fcnOXvMSEdnGUiI99cZaLhpuSi4dyaoiPloB7lYyBhJqLe4qGfHuJi3+UiHWJhnZ3foFydYaBnpSFlI+EhHKBineHfoubn5qIlY+egYlmfpOCf4WCiIlxgX1mfox8eYCAiIyPfWmBfoR2Z3B5eHN3dGxrjoaLgoqAeYKBhYSBbF9zeXt+jouHfIKQgX9zgmp6hYmNh4V5hX6CmY6RjX5ubXuJfXZ0bmZle3RiW3BiV25xU1NtcmhhTmZ0eGZgXl1Zb4Fvc1plYl1qbmBwT1lqUURTZmBaam5tfG5ZW11tY1picHZjZlxdYGtpY2xqc3aBg3Btfnx/dHWDeoOCfIGFdn6IgZaQeISKdIGIcnl5fo2Qb297gHFpgXh6fm1se3WVa2p4hHRrk42Gn5mgmYSIbn2LdWl3l45+gYqClJeJeY+Vb3p0cWtpZGBzemhgZXB5WmByfHlncXlhZWWPsbJ3S2JapdnQlnF7kIqPd32TioSYkIuFbmuFkpJ6eZKHgYSYiXuGf3d3iYqEloBwi4hxdX57anmFg6WQhJONhH9wgIR4hnuInZuWjZWSloaIcXuTg32CgoiCbYB3aICEeHKAgYOKiHxlfn+EdmRxc4BpeXFvdZmOhoOLfXd5gYV6g2tccn9zgomHin6HinuJc4JvcoWIkIaGc4V7gpqNjoV5bm9+hH92emRmaHtvXlh2Wlhwa05XcXJmYEtsd3RhXlxbWnV+c3BYZ11manJgb05XZ1I/WGZeWm9rZ3pxW1pYa2VZY3B5XmdcXmVsZ2VraXF3f4hvbH9+gHVvgnt/gn+Cf3aBhImXiXGCjXF7hnx6eYSTjHVqeX5rb350f3xvcnt6k29ugX54Z5KLg6GZnJGChWaGg29neZWIfX6EgpiJgXyOjWl4c2trZl9hb3ltX2JveFxka4J5YXF2X2Vl1Oq9izI6PouOf3F4hYeNjXWClox+ko2Lfm1rhIyMdXyPf4WBlIh8gndudoeEg5d3b4iFbHV7dWZ5goOni4KPi4R+boF2eYV8iZ+SjpKTlI6Mh397koZ3foOMgmp/cmiAfnhufH2Ci4R3YnqFgnJkcml+bnVydYKcjIGAhYB0dn6Ac4JvXG5/dXmLhIt8iIF+iXl7cm2KhZGFjHODeoCXjIuAdW5rdoCAdXRbZ2d1bldWe1JZb2RMWnJyZVtJcHhvXFtbWV10fnRoWWJbZ2ZvZGpNV2ZRPV1lXF11ZWB1cFpZVG5jWWRweFloXV9nbWdpa2lwd32ObWmChH95boB8fYF/gXp1goCNk4RwgYtud36Ae3uIkol/aHp9anN7coV6c3Z9fox5eIR9fGuMjYSbnpaMgYBsjX1raH6Ni3p9foOTgn59iohrdnJnaGJbYmdzb19ha3NgaHCIeWJzdF5jZJugj25cNVqvtXRpgIh8kYZ1hZWFc46KiXZvbISChnR5iXiJfJKHeX5yZ3aJfn6Yb3GHf2l2eW5meYeEpIeAh42Kfm+Ad4KDf4+biYSWk5mKjIWJfI+IcHp9hHtofmxqgHt6ant3goiBcmB3gX5yZHJndoNudXuGlpKCfYKBb3d6fHV/bVlwgHd1jYOHeIh2g4l7eXRvi4KRgoZzgH5/lImKfG9uaW2BgXRtXGZkcnBQWnpNW25bT1tyb2RVS3N4aVdZWVphcIB0YF1dYWdkaWlmTlloTUBgY1tgdWFddWxYV1N0YVpkbnFWal5iaGpnbWxocHd8k2xohIp9fXB+fnuBgIF6d39/iouDcXyHb3F3g397iYyPg2p9e213eHaKdnx4f4KGf4N+fXpthYyImaONhIN7dYt4a2yEh5B4fXqCkYCAfouDcHNxY2ZeWWZfb29fYGdwZmpuiHRhdG9bYWRqdnuAv5ympMi4cYSCcpJ7d4WSgnOQi4dycm+De4N0dId0iHeTiHl5cGN3h3qAk2lyhHZnd3VjanyCiJ2BgH+Oj35zgHWHe4KUkoV6mI+WkIiCiXuIiGt4eX50Z3poa395dGl6d4CDfWhgeIh9a2t0aHyBanaBjJGVf3t+f3F8dnx0f2JWeH5zdIuFg32EcYeKeHlxcYWEjoB/en9+d4+GhHdqcWlsh4Fxb1xmYXFtSWR1S11sVFNZcm5iUU90eGFSWFhdYXCCc1thXGllZWRrZFBbcElEY2BbY3BeXXdoVVdWdl1bZW1nVWteYWlnZW5uaHB2epNtaYiNeX1ye355goGBfHZ9g4iGg3B3hHJtd4KCfomLk39wgHt3eHqAjHSCeH6BgYKEeYB1b36Ki5ueiH2FeneFe2d0hYuQeX5/e4iGhHaPgGdwbl9kXFhlWW1yYWBgcGxraIhuYXRpWV9kboB3qdqpx4aHsnGId2+MdHqFjX95kol/dHN0fXd/b3F/bYV0k4V4dGtgeoJ5iY9mcoRwZ3VuW219gJCTf4B4kZN+eXxuiniDk46GdpiMk5CIhoZ7f4RsdHZ+bGd2ZG17dm1qd3d/f3xhYniGeml1dWN+fGd1h4+Nlnx1gXdxgHt9boBaV3V/cHaFiH+Bem2JhnR6bHaBhIV/fH56fXSMgn50aHRlboqDbHNZaF5zZEdtbUtaYFdWVXdtYlBSdHZYUFZYXmFxhG9cYGNtZWReb2NUXHJHQmZfXWZnXVt7YlFWXHRbW2drYVVqX2BuZWZrcWhwdniOdGuOjXV/dnh+d4GEgXt0fYOIh4NvcoB0cXV+hYKJjYp7d394g3t8hYd3h3x9gX6EgHt+cnV5jI2gjIl5iXV0g3hefYWXi3iGg3OFhoR3iXtibm1cYltbYVZpc2NgW2ducGaHcWFxZlddY2t/fMrOh7mham1timxxg3F7g4l+epCEeXhzeHV0e2psdmOEdZGCdm9mX32CeouKZXKCa2pxY1hteoWbiIKBc5eUeH99b4pzhYyOiXSZkJKJhouDfHl9cHBvfGZocWJteHFqbHF4fX16XWV6gHhqdnhmg3dndYiMjpV9cohqb36BeW99XVlzf251gYx8gm9wioBxd2l4gYKBgnh+c3x1h317c2dzYW6LgWtxV2lddltHbWpMVlVdU1V7a2FPVHVyUFFUV15idIVpXWBsamZjWm9hWGJwSEFnXGBlXlxWe15OVWVwWVtqaF1XaGBecmVqaHJocHN3hnhulYt0f3p4fnmDiH91cn+GhY6CcHB7eHd2eYaGh4yGenx/dIt9fYaEg4d+fn59h398eHV4eJGTn3+MfIptdYB4ZIOGlYVzkYpvhYWBeoN0ZG5qWV9bXF1UZ3JkYFlkcXJngHJia2VXW2Bqf3i+rnuft25hc4Voc3pxeIGEen2Lfnd3cnZve3Zlam9hh3WOgHNqYl5+eHmLhGZxf2hra1pWb3eJo4GFf3GZk3KBeneEb4OElIp1l4qOiYWJhX14dHFuaHhfamxgbXZqZ2pseXd6dlpnfXx5ZnN+bYV0ZXWGjYaWgHCMZ2t7hHVudWJdcX1sdX2MfIJndod+bnFpdn95f4B0fm17fIJ7eXFmbGJuiX1sbVZpX3ZVSmlqTlFOZ0xYe2hhTlV1a0xRVFVfZnWDZl5gcWhnYldqXVxraEpEallhZFZZVXlZTVZtallda2RcWWVjXnRlbWRxZ3JwdYF4cZmGdn9+d398hYd9dXOCiICVgm5zeXt6c3OFh4mJg3iBfXWPfnyEio2DgYR7fouDe3Z7d3eanZh6iYKGaXZ8e2yDg5J/co6BcIWCf4J/cGdsZ1hdW1xbU2RwZF5XYnJ1anVvZWVjV1xbaH9wb3KAc4lkZHl9aXN1c3KBg3eAg3h2cnVua3pxYWdrZ4ZzjYNtZl1ffXB7iX9pbXhnamRVV3JvjaZ8hHt2lpF0fXR+fG9+fZOHeJp9iYeDh4N9dXBxbGd0XGxnXmx0ZGdlaXpve3JZaIF3dWhwgXiCdmJ3hot8lYFvjGtte4JxZ3RmYW56Z3N4i3x/YneEd2pscnV8cnt7dH9ogH+AeXdvZGZibYV7bGpVaGFvUkpoak9LTm9HXXpmYU1VdGRKT1NXYWp2fmZdZ3NpZmBWZFdicFxMS2pXY2FVVFVzVkxYdWRZXmtgXFpjZV92Z21icGl0b3J+dHSZgnd/gHiAf4aEen11goR/l4VucnR8enVxhIWPgYB6i3VzkH98gZWNgIWEfX2Mhnp9gHZ7o6WKeYiFhGt0e3p1goCLem6Ec3mEfYKDdm9qaWVWXVtaWlNibmRbWGFze2pobWlgYlhfWml/aWtvgGdsYGh5eGpyc3Ntg4B6f3x1dG16aGp5al9lbmiBdo+EZ2VYYndqfod7b2pwZ2ZdVFhvZ46nd4F6fJCOeXZxgHF1eHuRgXqXdoeDgIWIdmpydWdnbltsY11tcl9nYWp4aHtsW26Dc3RqcIF+enhhd4aFeZCFdIlycHqBc2RyaV1xeGVydIl8eWN0gHFnanl1c215eHZ5ZYR8f3l3cWRkY217fGpqVGdhZVNKa2dPR1FqRWB3ZmFNU3JdSk1UWmVrd3xmXm1xaWRdVmFVbm5WSlNnV2ZeWE1VbFRKW3heW15rXV1aY2VgeWhsYW9vdm5wd3V6mH53f4F5gICHhnp5eoN+gZOEcXR0f3l2dIWIkX2AfJBrcpWAe4KfhX6HfYB+hoKAint2hKuef3qHh4NrcoF5dYB+gHRuhm58gHOKgGpwbmRkWF9aWVpUYmpnW1pfdYJpXm1sXGFXXFxrgWVydH1paVxrdnVnc3ZxbIR7fXx4dXJseWdpeGZdZHNoeneSgWNjVGVwaIKFeHhnaWphV1ZZZ2OOp29+d4CLjntxcn9pe3F8jn14kHOFfn9/hm5kdXJkZ2dcamFcb29cZ19tdGV6aF10gG9ya3F8fnV2YnWGjHuIiIGAeXN1gHZicW5bcnRjcXOFfHVlc4BtYW17cGtqfHp2c2eHdnt6dnFlYmRtcn1pa1NnXVxUS3FiUEZVYEdidmZhS1NvWEpNWFhna3V7ZWVucWZkWldeWHdlVEpcYldoWFlIV2VQSGF3Wl1fbFpeXGFjXn5pamBvdHhtcG52g5d6coCAfH+JjIZ9dXWGeIeMfHR1dYJ5enqCjI59foSJaXOWgXqKnX5+hXqBen98hohzcY+tjHt7ho99ZXGHeXN8enVyb4Zse35sj3pjcG9iZV1lVllZV2Nma19dXXOFaFhxblteWFpcbHticHd1bGFZbHNzZ3R1b2yDeH5/eHZtbnRkaXRlW2d1ZnZ2kXpfXVJmZmuDgnR+YmRqXFRXXWJjj6VoeHSDhpF5bnF8anpvfYd9dop0gnl8eH9oZHZsYGZfXmleXHNrWWVdb29iemVcd3xrbm5weHl0dWVzhJN/iIOJfHdwc390Y3hlXHFxYnFygn10Z3KAZV9ud2plaHp9dW9wg3Z0fXRyYl9mbW58ZGhTZ1dYU012X1BKWVdIYnRjYUlUbVNKTVpXaWxxfGNtbHNjYlpaW2F3XFNLY11YaVNXR1lgTUdpdFheYGxbW19iYlyEaWhhbnh5bW9qdoGQeW2DfoCBk4iEgXZ0iXSMhnRydnaCeH19foyQgH6TfnB3lYN8mJJ5gIB4en6AdIiDdHCZoXp6f4mUd2N0hnhzd3RrdG5+a3h8cJFzXnBuYGdibFRaWldoY21mW1xxiWVTcm5bWlhXYGx2Y2l1amleWW1zcGtzc3NphHx+fnt2bm5sZGlxY1tqcmR0do5zW1dTZWFygH9ygl1iY11TWmBcY5GfZXFxhYSSdWxse29wcnx+fXOCeIBzenp6ZGV1Z11iWWBnWl52aFdiXXBoYXdhW3x2aWpyb3h0c3VpcYKWhId/hXd0a3F+b2d4WF1sbmNydIF6dGdwflxgcHJiYGtyf21udn9zcnhrcWFcZWxsemBmUmVTVlFPdVtRT1hRSGNzYWBHVmpQSVBaVWtra3xlbm9xYltaWFlscVdSUGZWVmhTVEZaXE5IcXRYX2NsYlhgYGFdi2pjZG16eGxwaXV5h3trg31/hJp8g4R5fIdtj4dyb3Z6fHSCgnyLj4OCl3R4gZOFgZ6JdYGAgXR/gnGHgnVvoZZzeoaLhnpkdolubXpuZnhwemtzdnONa151bmFnZWtSXVtVZ2Fsa1pccYxkT29uXVZYVWdpc2hidGVkXFhtdGxvdXR4aoZ8f3uHdo9zY2RrbmFcbm1jc3iHa1pUVmNkeH19cYZdZF9jVFpfWWKVlWNucIOFinRraXxwZ3V4dX1te3V2cHp/dl9mcmNbXVZhY1hhdGVVX2BtZGFxXV1+cGhpdHF0cXV3a22FlIKJfIZyc2dwfnJ0cFRcZ2tmcnWBd3RjbXZWY3JsW19wZ35mbnh+dHRza25hWmRpandeZVNjVFVQU2xWUFZSUEdkcl9hRlhpTklYVFZtaGR8aWt4a2JXXVVbdGRTUldoUVhmVFNIWlpQTXd2Wl9la2lZYWBeXo5uYmZreXVub2l2doB/bIOAfYeYe4CHgYl+a5OIcmd0gHt1gIN9iY9/i5NyfIqRhYefhnt/hoxzgYZzfYJ2bqSLcoCNi3Z3bHmLYGR7cGZ5c3hsbXF3g2dkfG1jZmdoU19eVWdfbG5bXm6NaE5pbWBUVlNvZ3NrZXhkZFxYb3NscXp3cmyHe392m3p5a2FlbG1eYG9qZXB4fmdaVlhgbHh8e3CEX2NfZ1ZYX1djm4hia3CBh314bGx6bl14c258a3Z0b3B8gHNYam5eWFxVYWJXZHBjU15iaWFibFphfmxmbHR2b213d2xphoyAinuJbnJmcn5udG5kW2FpaXB0gXRzXmltU2VxZVZjb2R8ZHN4fXdscG1rYFlhZmd0XGRVYFVSTldkUk9bTk9IZG9cYkdZaU1KX0tYbWRgeGlufmRgVV9UXXVcU1JgZk5dYVVTSlxZUFl0dV1fZWtoWGJhW16NcWNnanhxc25odnR6hHKCg3qIjn58iYeNeW6QinVsc4J0f3+IhYeRhJWPeX2MjoeRm4SAfIyFc3+Bc3R4cm+Tk5OTk5OTk5OTkpKSkpKSkpKSkpKSk5OTkpKSkpKSkpKSkpKSkZGRkJCPj4+Pj4+Ojo6Pj46OjY2Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2NjYyMjI2NjY2Njo6Ojo6OjY6OjY2Ojo6Oj4+Pjo2NjY2Oj4+Pj4+PjoKAfnp6fX5+fX1/fn59fn5+fn5+fn+Af4CAgIGAgIB/gIGBgYOHjI6Ojo6NjY2NjY2NjY2NjZKSkpOTkpKSkpKSkpKSkpGRkZGSkpKSkpKSkpKSkpKSkpKSkpGRkZCQkI+Pjo6Ojo6NjY6Ojo2NjY2Njo6Njo6OjY2NjY2Njo6Ojo6Ojo6NjYyMjY2MjIyNjY2Njo6Ojo6NjY2NjY2Njo6Ojo6OjY2NjY2Ojo6Ojo+Ogn99ent8fn59fX59fn5+fn5+fn5+f4B/gICAgICAgH+BgYCBg4aMjY6NjY2NjY2NjIyMjIyMkpKSkpKSkpKSkpKSkpKSkZKSkpKSk5KSkpKRkZGRkZKSkpGRkZGQkJCQj4+Ojo6OjY2NjY2Njo6Ojo6NjIyMjIyMjY6Ojo2Ojo6Ojo6Ojo2NjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Njo6Ojo2NjY2NjY2NjY6Ojo6Cf3x6fHx9fn19fn19fX59fn5+fn5+gH9/gICBgYGAf4CAgICDhouOjo2NjY2NjIyMjIyMjIySk5OTk5OTk5OSkpKSkZGSkpKSkpKSkpGRkZGRkZGRkJCQkJGRkZCQkJCPj46Pjo6Ojo6Ojo6Ojo6Ojo2MjIyMjIyNjo6Ojo6Ojo6Ojo6OjY2MjIyMjIyMjIyMjY2NjY2NjY2NjY2NjY2Njo6NjY2MjIyNjY2Njo6OjoN/fHp8e31+fH1+fXx9fn59fn5+fn5/f3+BgYGAgICAgYCAgIOGi42NjY2NjIyMjIyMjIyMjJA+LjExMTEvb4eEhISEiF0tMDAwMC1GoaGhoaGhoJqZmpqampqKg4SEhIOEd2VnZmZmaFxDREREREFSzNrY2NjY3W09RERERENYaGdnZ2dmb4SDg4ODg4OLjIyMjIyMjY2NjYyMjY2NjY2NjY2NjIyMjIyNjY2NjY2OhX19e3t6fX58fH59fX1+fX1+fn5+fn9/f4GBgYCAgICBgICAgoWKjI2MjIyMjIyMjIyMjIyMjy0aHR0dHBpohYKCgoKGUxgdHR0dGTekpKSkpKSjnJycnJycnImBgoKBgYJyXV9fX19hUjQ1NTU1MkbY6ufn5+ftZy41NTU1NE1hX19fX15qgoGBgYGAgYqLi4yMjIyMjIyMjIyMjIyMjY2NjY2MjIyMjIyMjY2NjY2GfH16e3p8fXt8fn19fX59fX5+fn5/f3+AgYCBgYGAgIGBgYGChYqNjYyMjIyMjIyMjIuLi4uRiYiIiIiIh42QkJCQkJCMh4eHh4eHiZKTkpKSkpKRkZGRkZGRj46Ojo2NjYuJiYmJiYmIhYWFhYWFhpOUlJSUlJWKhYWFhYWFh4mIiIiIiImKioqKioqKi4uLi4uLi4uLjIyLi4yMjIyMjI2NjIyMjIyMjIyMjY2Njoh8f3l6ent8e319fX18fX19fX5+fn9/f4CBgYGBgYGAgYCAgYKFioyMjIyMjIyMjIuLi4uLi5GTk5OTk46SkpGJh46KkJKSk4+Oj4yOhYqRkZGRkJCQkJCPj4+Pj4+Ojo6Njo6Ojo2Njo2Njo6Ojo6Ni4qLi4uMi42Ojo6Ojo6NjY2MjIyMjIuLi4uLiouLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyNjY2NiX59eHh5fH18fX19fHx9fX59fn5+f3+AgICBgYGBgYCBgIGCgoSKjIyMjIyMjIyLi4uLi4qLkJCRkZGPhI6QkIaKj4WNkJCQh4mIiI2IiZCQkJCQkJCQkI+Pj4+Ojo6NjY2NjYyMjIyMjIyMjIyMjIyMjIyMjI2NjIyMjIyMjIyMi4uLi4uLi4uLi4qKiouLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjI2Lfnx3dnh7fXx7fX18fH19fn5+fn5/f4CAgIGBgYGBgIGAgIGChIqMjIyMjIuLi4uLioqKioqQkJCQkIqFjoiOhoaPiY2QkI2EiIWGj4mMj4+Pj4+Qj5CPj4+Ojo6OjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLi4uLi4qKioqKi4qKi4qKi4uKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIt+e3d2eHt8fHx9fX19fX1+fn5/fn9/f3+AgIGAgYGAgYCBgYGEiYyMi4uLi4uLioqKioqKipCQkJCPhYOMjpCOiYyJjZCRiYOGh4iMiI6Pj4+Pj4+Pj4+Pjo6OjY2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKioqKioqLi4uKioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMin18dnZ4fHx7fH19fH19fn5+fn5+fn9/f4CAgYCBgYGBgIGAgYSJi4yLi4uLi4qKiomJiYmJkJCQkJCMhoyJjoeFjYmOi4yOiIeIhoyIj4+Pjo+Pj4+Pjo6OjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKioqKioqKioqKi4uLioqKioqKioqLi4uLi4uLjIyMjIyMi4uMjIyKf353eHp7enp8fHx8fX1+fn5+fn9+fn9/gICAgICBgICAgYCBhIqMi4uLioqKioqJiYmJiYmPj4+Pj5CMjouPjIqPjI6MjZCOjYyLjYyOj46Ojo6Ojo6Ojo6NjYyMjIyLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLjIiAfXh5enp6e318e3t9fn5+fn5/f35+f39/gICBgICAgIGBgIGEiouLioqKioqJiYmJiYmIiI+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pjo+Ojo6Ojo6Ojo6Ojo2NjYyMjIyLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLioqKi4uLh4B8eHp6eXt8fHt8fH1+fn5+fn9/fn9/f39/gIB/gIGAgIB/gYSJi4qKioqJiYmJiYmJiIiIj4+Pj4+Pj4+Pj46Pj4+Oj4+Ojo6Ojo6Ojo6OjY2NjY2NjY2MjIyMjIuLi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKiYmKioqKioqKioqKioqKioqKioqKi4uHgHt5eXh6fHx6e3t9fX5+fn5+f39+f39/f39/f3+BgYCAgH+BhIiLiomJiYmJiYmJiIiIiIiOjo6Ojo6Pj46MjI+Sj5COjo6Ojo6NjY2NjY2NjY2NjIyMjIyMjIuLi4uLioqKioqLi4uLi4uLi4uLi4uMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKiomKiomJiYqKioqKioqJiYmJioqKioqKioqKioqKioqKioqKi4aBe3h5eHp8ent7fH19fn5+fn5/f35/f39+fn9/f4CAgYCAgIGEiIqJiYmJiYmJiIiIiIeHh46Ojo6Ojo6Ojo+MkJOQkI+Ojo6NjY2NjY2NjYyMjIyMjIyMjIuLi4uLi4qKioqKioqKi4uLi4uLi4uLi4uLi4uMjIyLi4uLi4uLioqKioqKioqKiYmJiYmJiYmJiYmKioqKiomJiYmJiYmJiYqKioqKiomJioqKioqKhYB6eHl5fHt6ent8fH1+fn1+fn9/fX9/f35/f39/gICBgICAgYSIiomJiYiIiIiIiIeHh4eHjY2Ojo6Ojo6Pj4+PjoyNkI2NjY2NjY2MjIyMjIyMjIyMi4uLi4uLioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYmJiYmJiYmKioqJiYmJiYmJiYmJiYmKioqJiYmJiYmJioqFf3l6eXh7e3p7fHx7fn5+fX5+f39+f39/fn+Af3+AgICBgYCChIeKiYmIiIiIh4eHh4eHh4eNjY2Njo6Oi42Nj5WPiYyPjYyNjYyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYR+eXt5ent7eXt9fHt+fn59fn1+f35/fn9+f3+AgICAf4CAgICEh4mIiIiHh4eHh4eHh4aGhoyNjY2NjY+MjImKj42IjJGPjY2NjIyMjIyMjIyLi4uLi4uKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uKioqJiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJg355e3p8e3p7fX17fH9+fn5+fX5/fn9+f3+Af4CAgH+AgH9/f4OGiIiHh4eHh4aGhoaGhoaGjIyMjIyLiYyKiIeJhoyOjJCMjZGOjIyMi4uLi4uLi4uLi4qKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiImJiYmJiYmJiYmJiYmJiYmJiYmIiImJiYmJiYmJiYmJiYiIiIiIiYmCf3h7e3t6enx9fHx9f39+fn19fn9/f39/f4F/gIB/gICAgICAg4aIh4eHhoaGhoaGhoaGhoWMjIyMi4yOjoyKioeEiIuKjIuNjo+Li4uLi4uLi4uLi4uLioqKiomJiYmKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiomJiYmJiYiIiIiIiIiIiImJiYmJiYmJiYmJiIiIiIiIiYmIiIiIiIiIiIiIiIiIiIJ/eHp7enp6e3x8fX1+f35+fX1+f39/fn+AgICAf3+Af4CAgYCDhYiHh4aGhoaGhoaFhYWFhYyMjI2NjJCSjI2Ii4mJi4uLi4mLjIqMi4uLi4uLioqLi4qKiomJiYmJiYmJiYqKioqKioqKioqKioqKioqKioqKioqKiYqJioqJiYmJiYmIiIiIiIiIiIiIiImJiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIiIiIiIiIiHgXx4e3x5enp8fHx9fX9/fn59fX9/f39+fn+Af4B/f3+Af4CAgIKEh4eGhoaGhYWFhYWFhYWFjIyNkY+PjZGJjIaJjIuIiImMiYeNjo+NioqKioqKioqKiomJiYmJiYmJiYmJioqKioqKioqKioqKioqJioqKioqKiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4WAenl9e3t7enx8fHx9f39+fn19f39/f35+f4B/gH9/f4B/gH+AgoSHhoaGhYWFhYWFhYWFhISLi46PjoyLj4iHiYmMjYWFjo2KiYyNi46KioqKiomJiYmJiYmJiYmJiYmJiYmJiYmKioqKioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHhoaHh4eHhH55eX16enp7fXt8fX5+f35+fX5/f39/fX5/f3+Af39/f39/f4CChIaFhoWFhYWFhYWFhISEhIuLjI6MjI2Lh4mIiomGgoiNjoiKi5GTj4uJiYmJiYmJiYmJiYmIiYmJiYmJiYmJiYmKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIeHh4eHh4eIiIiIiIiIiIiIh4eHh4eHhoaGh4aGhoaGhoaGh4eDfXp5e3p5enx8e31+fn5/fn59fn9/fn9+fn+AgICAf35/f39/gIKEhoWFhYWFhYSEhISEhISEioqOjYmIiIqKh4iHiomIioiIh4qGi5GPiomJiYmJiYiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHh4iIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGh4J8eXl6eXp7e3t7fX5+fn5+fn59gH9/f39/f4CAgH9/fn9/gICAgoSGhYWFhISEhISEhISEhISKi5CPiYmJi4qHh4WHiYuKiYSLjYmOjYqJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiIiIiImJiYmJiYiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGgXt4enp4e3x7e3x+fn9+fn5+fX1/f39/f3+Af4B/f39/f3+Af4CChIaFhYSEhISEhISEhISEhI+Qj4+IiYuIhoeIiYuLjIuJioqNio6Oj4iJiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoaAe3h5eXh4enp8fX1+f35+fn59fn9/f39/gIB/gICAf39/gIB/gYKDhoiGiIaDhISEhIODg4ODkpKOioeKi4qLh4uNiYqJi4iHiouIio+SioiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhn96eXh4eHl5eXx9fn5/fn5/fn1+f35/f3+Af39/f4CAgH+AgH+BgoOHjo+PjoiHhIWFhoaFhYWSkI6KiYmIiImKioiIh4aKjIiHiYmOkJGNh4iIiIiIiIiIiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4aGh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWGf3l4d3d3eXp5e3x9fn9+f35+fn5+f35+fn+Af4CAgICAf3+Af4GBg4eOjo6Ojo6Mjo2OjY2MjZCQjomHhoiJiYeIiouIiYyJiYaKjY6PkYuIiIiIiIeHh4eIiIiIiIiHh4eHh4iIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhYZ+eXd5d3d6eXl8e31/fn5/fn5+fn5+fn9+f4B/fn+Af39/f39+gIGEiI6Ojo6Ojo6Ojo6Ojo2NkJGOi42JjIiIiYaHiYaIioiHi4yLjpCQiIeIiYmJiIeHh4iIiYmIh4eHh4iIiYiIiIiIh4iIiIiHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhoaFhYaFhoWGhYSEhIWFhoaFhIWFhX55d3l2eHl4e3x7fn5+fn5+fn5+fn5+f39+f39+f39/f35/f3+AgYOGjY2Ojo6OjY6NjY6OjY2Qj42Ni46KhoiKhISLiYeDhYSDi4mLj42JjI6QkI+NjYyLjY6Pj42NjI2Nj4+Pjo6MjYyMjY2KiYiHiImHh4aHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoeHiYqKiIeJi4yNjo2LiImLi42OjYyJiImMgHl3d3Z6eXh7e3t9fn5+fn5+fn5+fn5/f39+fn5/f4B/f4B/f4CBg4aMjY2NjY2NjY2Qj4+Pj46NjI6KiYuMjIeFiY2Lh4aIh4aHh4uNjo6Pj4+Pjo+Pj4+Pj4+Pj4+Pj4+Ojo+Pj4+Pj4+Pj4+Oj46Oj46Mi4uJh4eHh4aIhoaGhoaGhoaGhoeLiYeHiIiLjY2Mi4yLjY2Ojo+Ojo6Pj46Ojo6Ojo6Ojo6Njo6NjY2AeHZ4eHp4enx6fH5+fn5+fn5+fn5+f39/fn59fn9/f39/gH9/gIGDhoyMjIyMjY+QkpOTk5KSjYyMjIqHioyKh4eJiYWCiouIiYWJjpCNjo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjI2NjI2LiYaHh4eHiYqLjY6NjYyNjY6OjY2OjY2NjY2NjY2NjY2NjY2OjIyNj4+OjY2MjIyLi313dXd5enp7e3p+fn5+fn5+f35+fn5/f39+fn1+f39/gICAf3+AgYOFj5KRkJGSk5OTk5OTkpKLi4uLiomMiouLiYuKhoeOjYiIjI6OjIuMjIyNj46Njo6Ojo2NjY2MjY2NjIyMjIyMjIyMjY2NjYyMjI2NjYyMjI2NjIyNjIyMi4yMi4yMjI2MjIyMjIyMjIyMjIyLi4uLi4yNjY6Sk5OSkpSRkJOVlZSTk5COjo6Oe3Z2d3h6ent7e31+fn5+fn5/fn5+fn5/f35+fn9/f39/gIB/f4CBgoSNkpKTkpOSkpOTkZKSkoqJioyJi4qJjIuKioiHiYqKi4mKjY2Mj46Nj5KUlJOUlJOTkpGSkI+Ojo2NjY2Pko+OkZGOjIuKioqLi4qKi5CPjoyMjIqKioqKioqKiouKioqKi4yLi4uMjIyKiouLi46RkpOTk5SUk5STk5SUlJOTk5KSkpKSk5F6dXZ2eHt7e3p6fX5+fn5+fn5+fn5+fX5/fn5+f35/f3+Af39/gIGChIuRkZGRkZKSkpGRkpGRiYmIiIqMiYiJiYuJhoSJhoyKh4ySkpKTk5OUlZWWlZWUk5OUlJSUk5SUlJSVlZWVlZWUlJOTkY+QkZKQjoyRlZWVk5KSjo+QjYqKi4qKi42OjY6RkpCRkpKSkpGRkpKSk5OTk5OTk5OTk5OTkpOSkpKSkpKSkpKSj3h1d3l6e3t7ent9fX19fn5/f35+fX5+fn5+f39/f39/f4B/f3+AgYKEi5GQkJCSkpKRkZGRkZGIiIiIi4uJg4eLi4yMiIeHjYyNkpSSkpOTlJWWlpaVlZSSkpOTlJSUlJWVlZaXlpaWlpWUk5SUlJSVlJSUk5OVlZWUk5KTk5OTkJGSkZGSk5OTk5KSkpOSkpKSkpKSkpKSkpKSk5OTk5SUk5OSkpOTkpKSkpGRkZGPdnJ3enp7e3t8fX59fX1+fn9+fn9+fn5+fn6Af39/f3+Af3+Af4CBgoSKkJCRkZGRkZCQkJCQkIeHh4eIiIiFi4+KjI6Njo+OkJWUk5OTk5SUlZWVlJSVk5KSk5KTlZSUlZaWlpaWlpaWlpSTk5OTk5OUlJOSk5SVlZSTkpKSkpOTk5OTk5OTk5KSkpKSkpKSkpGSkpGRkZGRkZKTlJSUlJSTkpGRkZGRkZGRkZGRkYx0c3d6ent7e3x9fX1+fX5+f35+fn5+fn5+fn9/f39/fn9/f39/f4GDhIqQkJGRkJCQj4+Pj4+Ph4iKi4yNjYuOj42Mjo6RkpGSk5OSkpKSk5SUlJKSk5OTk5OSkpOUk5OTk5WVlZWUlZWUk5OTk5KSk5OUk5KTlJSUk5KSkpKSk5OTkpKSkpKRkZKSkpKSkpKSkpKSkZKRkZGSkpOTlJSUk5OSkZGRkZGQkJCQkZCRinN0dnp8fHp7fXx9fn59f35/f35+fn9+f31+f39+fn59f39/gH+AgYKDipCQkZGQj5CPjo+Pjo+Oj4+Pj4+Pj4+PkI2OjpCRkpKSkpKRkpKTk5OTkpGSkpKRkZKSk5OSk5OSk5STk5OTlJOSk5OTk5OTk5OSk5OTkpKSkpKSkpKSkpGRkZGSkZCRkZGRkpKRkZGRkpGRkZGRkpKSkpKSkpKSkpKRkJCQkJCQkJCQkJGGc3V2e3x8e3x9fX1+fn1/f35/fn5/gH9+fX5/fX5/fn5/f3+Af3+BgYGKkI+PkI+Pj4+Pj4+Pj4+Oj46Oj4+Pj5CQiI2PkJGRkpKSkpOTk5OTkpKSk5KSkZGRkZKSk5KTkpGRkpKSkZKSkpKSkpKTk5KRkZKTkpGRkpKSkpKRkJCQkJGRkZGQkJGSkZGRkZGSkZGRkZGRkZGSkpKSkpKSkZCRkZCPj4+Pj4+Pj4+PkX9ydHh8fHx7fHx9fX5+fn9+fn5/f3+AgH99fn5+f39+f39/f4CAf4GBgYqPj4+Pjo6Ojo+Pj46Ojo6Ojo+PkI+Pj4+GjpCQkJCRkZGRkZGRkZGQkJCQkZGRkZGRkZGRkZGQkJCRkZCQkJGRkZGRkZGRkJCQkZGQkJGRkZGRkI+PkJCQkJGRkJCQkJCRkJCQkJCQkZCQkJCQkJCQkZCQkJCPj4+Pjo+Pj46Ojo+Pj4+PeHJ2eXx9fHp9fH19fn5+f35+f39/f4CAf39/fn5/f35/f39/gIB/gYGAio6Ojo6NjY2Ojo6Ojo6NjY2Oj4+Pj4+PjoiQkZCPj4+QkJCQkJCQkI+PkJCQj4+Pj5CQkJCQkJCPj4+PkI+PkJCQkJCQj4+Oj4+QkI+PkJCQkJCPjo+QkJCPj4+Pj4+PkJCQkI+PkI+Qj4+PkI+PkJCQkI+OkI+Pj46OjoyMjY2NjIqDiYhzc3Z4fX58eX18fX1+fn5/fX5/fn9/f39/f4B/f39/f4CAgH+AgH+BgYCJjY2Ojo6Ojo6OjY2OjoyNjY6Ojo6Ojo2NiJCRkI6Njo6Ojo6Ojo6Pjo6Ojo6Ojo6Pjo6Ojo6Ojo6OjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Pj46Oj4+Pj4+Pj4+Pjo+PjY2MjYyNjoyLi4mJiYiFhYSDgoKEgnR5fXp4dXJrZWltb2xmZmdncHNzd3l9fnl6e3x9fX1+fn59fn9/fn9/f39/gIB/f3+AgIGAgIB/f4CBgImNjY2NjY2MjYyMjIyMi4uLjYyMjIyMjIyGj5GRjIyMjIyMjIyMjIyMjIyMjIyNjY2MjIyMjYyMjY2MjIyNjY2NjYyMjI2MiomKi4uJh4KAh4iEgXt6gH57fXx8fXlzcnJycnV1cG1ramppZ2NkYV9bXF1eWFVXWFlTS0VJSkpLTE1PT0tgdHR3eX19eHp5e3x8fX5+fn1+f39+f35/f4CAgH+AgICBgYCAgICAgIGAf4OEhYSFiIuLjYyMjIuLi4yGiYqKioqKh4OOkJGNiouLi4uMiYmKioqKiouLi4eDi4qIiYmGhYWEhIeJiYWCg397fHl6e3pzcHFxcW1samdsbWdlZmVmZGNlZGVkZWVlZWRkZGNhYV5dXFpYWFdUUFFSU1JTTU1KSUZESEpHR0hHR0xOSWdzdXh5fXp4d3l8fHx8fn5+fn9/fn9/f39+f4CAgIB/gICBgICAgICBgYFnXmBjYWNucX17ent/fXd8fHZ4ent4eHpvcHt4eXt8e3h3e394dXd0dHZ1dHZ3dXFycW5wcnBnaGtsbm9tamlpaGhlZWRkZF9gYWJgYF5dWVhaWltdXV9gX2BfX19gYmFeXl5eWVldXF1bV1dWUlRSU1NOUUpISUZERUhMTEhGR0lLSklNbXJ0eHp7end3eXt6e3x+fn1+f39+f35/f35+gIGAf3+AgIGAgICAgICCgWdYW1pZXFtcY1xaXF5ga3FtcHBvbm5vbmtpbmxrbG9qaWtraWpraWdmZ2dnaWhnbWdqZ2hlaGdjY2JhYmBgXVhbW1dYV1RWUVBUU1NNSkxLTExOTk9UWFhXVVVUUlBQTU1QT05LTE1QUU9MTEpHSUlHSEhJSEhIR0ZHSEpKSEhISUlISVZwc3V5ent5dnZ5enp7fH59fX5/f35/fn5+f3+AgX9+f4B/gICAgICAgIGBbFtYVlZWWVlaWVlYVVZoamxubmxra2poaGloZGVkYlxiZl9fYGNfXF9dYF1eWl5dWVleYmFeXlpZX1xYV1NOTUxLS0tMSUtNTktKS0tMSktQTEtLRkdHSUlGR0lISUZFSEdGRkVERUVEREVJSUlHSEdIRkZLTUtJSUlIR0hLTU1LTExMVXFzdnl6e3h2d3h3ent8fn1+fn9/f39+f3+AgIGAfn5/f4CAf4CAgIB/gYJoUlRVVlNVV1lZWVdXV1tbYWNfXlxbWFZWWVZSVFJRUVVUU1NTUE1KTU5QUk9NUFFRUVFSVlZRUVFUUFBOTk9MSk1MS0xKSktLRklJSkxJR0pISUlFR0dGRkVFSElKR0ZHRkZHR0hKR0dISEpMSkpLSUlISktLSkhKS0pISUtMTU9QUEtUdHR1eHp6eHZ2d3d6e3x+fX5+fn5/f35+fn+AgYB/f3+AgYB/gICAgH+AgmlQUlRXVVRWWVdYWFpbVFRTUlBRU1FRUU9OTlBQUU9MTlBPTk5NTEtNTk5QTU9QUFJRUE5OT05PTk9PUFFPTk5PTk5QTk1NS0lISEpJSUlJR0ZHR0dJSkhJSEhJSEhHSEdISElISUxLSklISkpJSkpIR0pMS0pJSUhKSktMTk1NTU9RTFVzcnN3enl3dnR2eHp7fX19fn5+fn9+fn5+gICBgICAf4GBgH+AgICAgICBbE9PTlRZVVVdW1lXV1hOTUpKSUZKT0xKSkdJSk1NS0pMTUpHSUlJSktMRkRGSktLS0hKTExMT01MTE5PT09NTk9MTk5OUFBPTE1MTk1MTEpJSEdJSElISElJS0xLS0pJS0pJSklJSUlJR0dKSUdJSUpKTk1OTEhJSklJSk1PT01MT1JOWXBwcnd4d3d0c3R3enx+fX5+fn5+fn5+fn9/gICAgICAgYCAf39/gICAgIFvS0pNTlFOTlVXVlZSU0lFQ0VFUkREQT5CP0RAQD5CREFAQURHRkVIRUJBQEBDQ0RFQUNFSEtPS0lJSkhHSklKSUlLSkxQTk1MTU1MTU1NTElIREZGR0ZGRklKSUlLSkhMSklKSkpJSEhKS0tIRkdJSklLTU5OSktPTUxLTU1PUE5QT1BgcG9yd3h2dHJzdXd6fX19fn5+fn9+fn1/gICAgICAf4CAgIB/f3+AgICAgXNQUE5OUE1KS1BSUE5RQ0RCQUZRRT1DPT9FSDk6Oz0/PTxBRkA+Ojw+PjxFRD0/RUE/QEFAREVHR0dHQkRERUZFR0dHR0pHSEpLR0NER0pHQ0RFQUFDR0hHSEdISktKSElMS0lISktLTU5MTUxMSkpMS0lLTU9PUFNRT1BQTk9QUlFNUGdwb3N2dXRycXR4eX19fX1+fn5+f4B+foCAgH9/gIB/f4CAgH+Af4B/gICCdlRVUVFQT0xNUFBOT09BQkFAQkE/Oz48Pj8/Ozg5ODs7OkA7Oz48Ozs8PEhMPT1BQT9CQz1BRERGQkZGREdJSEM/QEBAQUFCQUE/Pjw9PkFAQD8+P0BFR0dHSUtMTk1OTUxNTUpLTVBVU05MTlFOTk1OTE1NTk9OTk1LS05OTk1OTkxUbnBwcnR0c3Fydnl5fX19fn1+fn5/gH5+gICAgICAgH9/gICAgH9/gH+BgIJ4UVFSVFJTUVNTUVFST0BAPT4/PD8+QEE/PT45Ozo6Ozg5Ojg3Ojw5Nzg7Oz49Ozs6ODpAQEFCP0E/Q0ZEQkNDPzs+PkBDQ0E/Pj9BPkBAQj9APD9CQEFDRUVFSktQT1BPTU1OTExMT1JRUFJOTExPTUtOT0xMTEtMS0tKS0tKTU1LS1xxcXF1c3VzcXN4eHp9fn1+fn5+f39/fn5/gIGAgH+Af4CAgICAf4CAf4CAgXxSTU9RUFFSUlRSU1NOPDs8Ozs7P0BBQkA9PDk8PTw5Nzk6Ojk4ODo6Nzg6OTo7Ozg3ODk7Ojg8Oz1AQUA9Ozs+PD09QEJDQT9BQkE9Pj09Oz0/Q0RCQD9BREJFR0pKSkpKTE1MTExNTExOVVNLTE1USVBKSU1KSUpLS0pJSEdKS0lKZnJxc3RzdXJydnl5e31+fn5+fX9+f39/f36AgICAf4CAgICAgIF/gIF/gYCBgFZMTlBQTlJRUFBRUU44PT88PDo9PkFAQT8+PkA/Pj07PDw+Pz08PTs6PD09PTw8PDw7Ozo7PD49Pj8/QUA+P0E/QEBBQEBAPT8/PTw6Oz09PD9AQUJCQUBCREZGRkdGR0dISUtMTExLTEtKS0lKSk1MTEpMS0lISUxMSklJSElLR01tcHF1dXV1c3V4eXl8fX5+fn5+fn5/gH9+gIB/f39/gH+AgYCAgYCBgICBgYCCYUtPT05OT1BPT1BQTzo8Pjw9Oz8+PkFBPz0/Q0NDQD48PT9APz89Oz49PkNFPz9APTs9PT08Ozo9PkFBPz5AQD9BPz89PD48PTs7PD0+QUA/QD5AQ0NEQkRFSEVFR0hISEdGSUpJSUlJSUhKSkpKTEtKSklJSEhKSktMS0lLSkpIVnBvcXNzdHR1eXt7e3x+f35+fn5+f39/f39/f3+Af4CAgICAf4GBgICAgIGBgIJtTFBRTk9QTk5PUFBPPjw8PT4/P0A+QEA/Pz9DRUQ/PTs8QD46Ozo6OTc6PDk9PUA9Ojw7Ozw7ODk7Pz49PD07PEA9PTw8Pjs9PD0+QUBCQUBAP0JEQ0RFRkZGQ0VHSElJSEhJS0tMTUpKSUpNTUpLSktJSEhISEpJSktKSk5MSUlfcHBycnJ0dXZ6e319fX5/fn5+fn5/f35/f36AgIB/gICAgICAgYGAgICAgIGAgnZNTk5NTk5MTE5QT0w+QTw8PT8+QkM/P0FBQUJBQD08PTs+PTo6Ojw6ODk4ODo7PT8/PDs7PDs6Ojs+Pz89PDg6Pjw9Pj89Oz4/QEJDQkJDQ0FCQkFCQkRCQkRCRENGSUdGRkhJSUtNSklKSktMSkpJSkVESUlGRkhISUpKTEpGRmdwb3FxdHZ1d3t8fH18fn59fX1+fn9/foB+fn+AgH+AgICAgICBgYCAgICAgICBek5JS0tMTExFSUxOTTw/PDw9PkBAQUE7QkNCQ0A/Pz9APT9APjw+QD89PT0/Pj0+Q0Q/Ozw9PkA9PT5BQ0A8OTtBPz4+QT07P0JAQkNCQENDQUNBPT0+QD0/QUFBQENFRUBAQ0JDR0dFRENGRUZGR0VEQEFHR0ZDRkRHSEpHQz5IbG9wcHF0dXZ5fHx9fHx+fn1+fn5+fn5+f36Af3+AgICAgICAgIGAf4CAf4CBgIF+UUhLTU1NS0pLTE9RQD8+PkFBQEBBR0FCRUNEQT9AQEA/PUA+PD0/P0BAQENAQD9AQD49PD1ARUFCQkZIQz08QERDQUE/Pj1AQT4+Pj88PkBER0VAPkBBP0BDRkVDQkNDQEJEREJERUFCPkFCQkFCQEA9QUJDRENDQUNFR0E/PVZwcHFwcnV1d3p8e3x8fX9+fX19fX1+fX5+fn9/foB/f4CAgICAgYCAgIB/gIGAgX5SSEtNTUxLS05OUlVEQkBDQ0FBQkBCQ0BAQUFAQUA+Oz48Pz08Oj49P0JCRUA/QE5hX0pAQ0VJSUlJTU1LRUNGR0hFR0VFRUREQ0E/QD4+QkZKSkdFRUZGRkpOTktKSUdHSEtMSkdHQ0REREVEQUJCQ0BDREVEREVERUZDQkFEZW9wcXF0dnV4e3x7e3x+f319fX19fn59f4B/f39/f39+gIGBf4CBgICAgH+AgICAfVJJSUpKSEpKTE9SU0dGRUdIREdIREA+PDs+QERFRD88QUNEQj8+QT9BREVEQ1d1homKflhHSUpMTE5PT0xIR0hHSElJSEhHR0hIRUNFRUVFRkhKSkZFR0lKTU9PTU1LSktKTU5LSUhHSElIR0ZFRkZGREZIR0VFSEhGSEdIRlFub3BxcnZ2eXt7e3p9fX5+fX19fX1+fn1/f39/fn5/gH+BgYGAgICAgICAf4GBgIB8UEhHSElGR0lKTU5OSkxJSUpLTE5KRkNBQkNGSkhJR0hISUdGQkRGRERDQVV0h4mHh4aIgldJTE1MTU1MSkdHR0dER0dHR0ZIRkhFQ0RERkVEREhIQ0NDR0pKS0xMTExMTElKS0pKSUlJSEpISEdISUhHR0hGRkZISklJSUlIXW9vcXJ0d3d6e3t6e319fn59fX19fX5+fYB/f39+fn+BgIGAgYCAgICAgIB/gYCAgHxNR0ZIRkVGR0dKS0pMTUxLTU5NT0tJSEhKS0tMS0pLTUpLSEhGRkdGRVBshIeGhoaHh4iHfFBLTEtIR0ZGREVDQ0BBQ0NDQ0ZGRUJAPj5AQUFAQkQ/Pz9ERkhERUdJS0lJR0hJR0lJSUpJSEZKSkpKSUpJSkpKRklMTEpKS0tmb3Bzc3R2eHl7e3t8fH1+fn19fX19fn59f39/f35/f4CAgICAgYCAgIGAgICAgICAfU9GRkdGR0hHRUZHR01NTUtMS0lHQ0NDRElLS0tLS0tNTEtNTElGSlZsgYaFhISGhoaHiIaKdUlJRkI/P0A/Pz88PDw+Ojo8QUFAPjw5OTg8PD07Pjs5Oz9BQkFBQ0NDQEFCRURCQ0ZISUhISExNTEdJSk1NTk1KSktLSkxNU2xvcXRzc3d5e3t7fH19fn9+fX19fX1+fn5/foB/fn9/gICBgIGBgICAgYCAgIB/f39+UUZFRkdJSUdEQ0VGTk1MSklIRT85Oj5ARUhHSUlLTE9OTlFOUV5ygYWDhIWFhoeIiIiJiYyOZkJCPTg4Ojo5ODc4ODk2NDc5Ozw6ODU2Nzc4OTc4NzY4OTs7PD5BOzk5OT09Pjs7PUFERUhKTUxMR0lIT1JRUFBOTE1NT1Fdb3BydHN1eHp7e3x8fn9+f359fX59fX5+f39/gH9/f4CAgICAgYCAgICAgICAgIB/f39RR0ZHSEpIRkVGR0hMTEpJSUdDQjU2OzxDQEJGSEtITEtNVGd7hISDgoOEhomKi4uLiomKi4yJVDs4NjU2NzY2NjQ1NzYzNDY4Ojg3NjU2NTY3Nzc3ODo3Nzc4Ojs3Njg5OTg5ODc2OjxAR0ZJRklGRUZPU1JTU1JPUFBSVGVwcXN0dHd5e3x7fH1+f35/fn19fX19f39/f3+Afn+AgICAgICBgICAgICAgICAgH9/flJISEhJS0lHSUpJSkpLREVIRUJANTc4OD06PERCREZFSmJ4hISCgoOChYmKiomJioqKiouJiYqBSDY3NjQ2ODg3NDU3ODQ2Nzc5OTc2Njc2NTo6Ozo6PDg5ODk5ODc3Ojo6ODg3ODU4OTtBPT4+QkE/QUtMT1FQUU9PUFFXa3JydHR1d3p7e3t9fX5/fn9+fX19fX5/f4B+fn9/f4CAgH9/gICAgICAgH+AgICAf39+VEhHSUlMTUtKS0tMSUg/QEFAPDo1Nzk4OTc6QTk8RD9dhIODg4SEhIaJioqIh4iIiIqKjIqJiYx6Pjo4ODs8PT45Ojs8ODk7OTo7Ojk5Ozo5PT09Pzs7Oz06Pjw6PDs8Ozw7OTo8ODo6Ozo5OTk8Pzw9QUJESUpMS0pLTFdvcnR1dHZ4e3t7fHt9f39+f359fX19fn9/f35/f39/f3+Bf4CAgICAgICAf4CAgH+Af35URkVGSUxOTkxKSk1CPzo7PDo4OTk4OTk5OTo+PT8/RHeCg4SEhYaIiYiHhoaGiImIiYuMi4mKioxsPDs+QkNFRUJBQUI+QENBQD89Pj5APz4/QD9APT0/Qj9BQT9BPz1AQUA/P0E8Pjw7Ojs6OTs/PTs7PT1BQUNBQkNBWHBxdHR0dnl7e3x9e31/fn9/fn19fX5+f35+fn9+f4B/f4CAgIB/gIGAf39/gICAf39/flJFQ0FHSk5PTElHSzo4Ojs5Ojo7PDo6Ojw7PT5APz1hhYKEg4WEhomJiIeGhoaHiImKi4uKioqLiotePkRHSUtKSkZHR0RGSEdFQ0BAQ0VDQkBCQ0I/QERIRUNFREVFQUZFRkRGRkRAQj49QD49P0A+Pz8/Pj8+Pjo7PTxgcXJ0dHV3enp6fX19fn5+f39+fX19fX5/fn5+fn5/gH9/gICAgICAgICAf4CAgIB/f4B+UERAPUNIT01HRkJEOTc6PTo8Oj09Pj47Pjw/PkI/Sn6DhIWGhoaIiYiIh4aGhoeJioqLjI2MjIuKiodXR0xMTUtOSUlLSElKSklFQ0RGR0ZEQ0VGREJISUtHSEdGR0dFS0pMSUtLSkNGQ0NEQkFBQ0JEQ0NERENBPTw+QGhwc3R0dnd6eHt8fH19fn5/f359fX1+fn9+fn59fn+Af3+AgH9/f4CAgICAgICAgH+AgH9PQT49P0RMS0BCQkE5Nzs+Ozw6PT8+Pzw/PkJBRD5ohIKFhYeHiImJiIiHhoaGiIiIiYqMjYyMi4uKjH9QTVBNS05LSkxJSUpIS0ZER0hISUVFSEZGRUxMTUlKR0dISUpOTU9NTE5LSEdHR0VFQ0ZGRkZERUhIRkNBP0BMbXB0dXZ4eXl5fHx8fX1+fn9+fn19fX1/f35+fn5+f39/f39/f3+AgICAgIB/gICAgICAf1FBPz4/RkdHPTxAQDg3PDo7PDo9Pzw9PT9AQ0JIU36DhISFhoaHiIiIiIiIh4eIiIiJioyNjIyMjIuKjXFNUU9NTExMTEpISEZKSURKSEdLSkhKR0dHS0xOTExISElKTVBOT05NT0tJR0lKSElESUhIRkZHR0lHQ0JBQ1VvcXV2eHp7eHh6enx8fX5+f39+fn1+fX5+fn5/f36Af39/f3+Af4CAgICAgICAgICAf39/VERBQUJHSEI/OD9AODo7Nzw9Ojw/PDw9P0JDQ0xthIOEhIWFhoeIiIiIiIeGiIiIiIiJjIyLjIyMi4uLi15SUlBNTk1LSkdGQ0hKR0xKR0tPTEtKSk1NTE9QTkhJS0xPUVFQUU9PSklKSkxKTEZHSEdGR0lGRUVCQEJCXHByd3h5enl5eXp6e3t+fn5/fn59fX19fn9+fn9+f4CAgIB/f39/gICAgICAgICAgH9/f39VRUNFRUdHRUQ7P0E7PTw4Pz09PkBFRD1CRENGSnWGg4ODhISGiIiIiIiIh4eIiIiIiIqLi4uMjIyMi4uNfFdWUlJUUk9MS0pFRkZLT05PV1ZRUE9RU1JOU1RPTVNMUFNVV1JTUlBMSk1NTUtOR0dKRkZJSkRERUVCRENjcXV5eXp6ent6e3p7fH59fX9+fX19fXx9fn5/gH9/gICAf39/f3+BgYCAf39/gIB/f39/f1VGRkdHR0dIRj5AQj0/PTxBP0FBRFRLQkhJRklLeIaDhYWEhYeIiIiIiIiIiIiIiIiJiouKioyMjIyOi4uLZ1ZWa2FFUlFRUEo7O1FTUmB1XVVWVFZZWVNZWFJaZlBVV1pdUlRXUVBOUlBQUFFLS0tHSEpIRUZJSUlISWpzdnl5enl6e3t8ent8fXx9f359fX19fX1+f39/f3+AgIB/f39/f4CAgIB/f3+AgH9/f35+VEhKSUlHR0ZFPz9BQEVBQ0ZEQ0RLVlBKT09OUFB5hoWHhoWGh4iIh4iIiIiIiIiIiIiIlJyMioqMfWGKi4uHbFtkVTpYWFhTUD9AVlVZXGRgVllicl5dV11aVkVRWVtcWV9UWWdSVVZYVFRWU09PTUtMSklJTE1LT01Tb3R2eHl4d3l5ent6e3x9fH5/fn1+fX19fn1/f39+f4CAgH9/f3+AgICAgH9/gH+Afn9+fn5WSkpJSEdGRERCQT9ITElNUEtJSk9TUVBUVlVWVHWFhIWFhYWGh4iHiIiIiIiIiIiIiImcnaCPiY5nO36MiYqLem5wWFpbWlJTUldWVFpadYNZVX2QYVxYXV5XSVZeXltbX1lIWVhZXF1YWFlXUlFNUFFNTU9TUVFVUmFzc3Z3d3Z4eXh6e3t8fX19f39+fX59fX1+fn9/gH9/gIB/f3+Af3+AgICAf39/gIB/gHh5fVlOS0pJSUZCREBBOk9RUVdYUFBQUVJTUlZXV1dXbIGCg4WEhYaHh4eHh4iIiIiIiIiIiJaanJeIioFuhomIh4OKfmZZWVxZU1ZUV1JRV1ZjloBRZXJYWldfaFBgZlpaWFxoYkdPWmlnXFtcXV1XUk5TUFBRVlZWVllab3N1d3Z2dHd4eHt7fH19fX5/fn59fn18fn9/f3+Af39/gH+AgH9/gICBgYB/gH1yfX9/b3R8XVNQT01LSkVDP0A7UFBaWlpSU1FPUVJRVVJVU1ZedXiAhYSEhYaGhoaHh4eHiIiIh4eIh4ORjomJiIaFiIiGfYB7XFBWWFRSVFJRUUxPTUtmeVpdVFlVVl1aTFRaVVNUXlpYV1dXemtYWlxcXlRRUVBJTk9XVlhbWmRxdHZ2dHR2eHl5e3t8fH19fn99fX1+fX1+f39/gICAf3+Afn56eHd2c3V7f3+AgHRrfn5rcXleW1ZVU1JPS0ZDREFNXoNsVlJTT09RT1FWUVNSUlRjZHaAg4KDhISEhIWFhISDhoaGhoeIhn6JiYiHhoOHh4d5bXFWSUtOTktNS0hKREZIRUM+U2NVf1JRUU5LUlVSTU9ZUU1OUVNVVU1RU1JQT01MSENJR1JTVFpdbXJ2dnV0dHd7enp7e317fX19fn19fX59fn9/f39/gH99fX5+f39/f4B+e3Zzd31+fmR1fWlxdGBkXV5bWVVRTElMSWFsknRQUVNNUVJQU1tSU1JRUlVVYnN7fH6AgYKBgX99e3uAf4OChYaHgoaGhoGEgYaFhnVfXUtDPkJCQ0NBP0RQQ0RAQz5CSEdWQElOTUddaVFIRk9GREVGSEdIQkNIR0hLR0RCQUNATlBNUmR0dXZ1c3R2eXx6e3t7fH19fHt+fX19fn5/f3+AgIB/f3x8fX+Af39/f4CBgH12dHt/bWh8Z25xZmhlZWJcWFNRUFVSc1dlW09PTkxRUlBVWVNVUVFUUk9WYGtsc3Z6e3h5dXJuc3RzeXh+foOAg4OCgYKAgoGBa0xHPj46Oj5APz4+PmpQSmFFRkhJRUI/SE1NR01RVUpCRT8+PD08PT0/PT9BQ0NAPzw9Qj5JTUZVb3V1dnN0dnh6fHp9e3x9fX19fH59fXx+fn9/f4B/f39/enl3eHd2dnh7foB+fXt4dnx1YXhnbHBqbGppZmBbUVFaXFleSUpPUE5LTFFSUVRVVVdRUVdWUFhbYl1hZ21tbG9raGBucmltbHF1e3p9e3h6fHx4d3hkQkBAQTw6QkNBQUNBW1xOe05PT05LTE1PT1BMS0xXTkhHQUE8OTc3NTk5PTs7Ozg5ODk/O0FHPlx0dXV3dXZ3eXx8fH18fHx8fn18fX19fX9/f39/fn9/f314dXd6e3p3eXh1d3t8eXh1eXdjcWhpcG1ubW1oZl5PT15cWklHT1FRT01QUU5RUlNWWFNSWVROWVpbV1lcX15fZWBdXnF3a15gZ2t3b29sam9ubmxmYllHRkZIQkFGSEVFRkNMUU9hV1JYUVBTU1JVW09PUVdQTUpERj46OTY1ODc5Nzk6MzY1Nzk1PEI9ZnR1d3h3eXl7fX18fHt8fX1+fnt9fn19f39/fn5+fn9/e3d1eX18enh8fHx8dHd2d3Z1d2tuaWhxbm9vb2prYFVXXlpXTUtTVFNQUVVPTFJTVFdYU1RYUUxYWVlWWFhWWFldV1hYaHNrXVZgdGthYV9dZGBfXllVUE1PTUxJR0pLSUhGQ1BPU1pXVFROUVNZU1xlVU9TVFFOS0lIQz9BOTk4ODk3ODg0NzU3ODU5OUducnV5eXp7e319fX18e318fX5+en1+fH1/f359fn59f358dHR1e3hycW9vbnR4cXJzeHZ1cWZkZ3JucHBxbm1kXV9fWVdPUFdWVlNUVk9PVVZXWFlTVVRMS1NVVVVVV1BUVVdUVVJdbl5STllgW1ZZO0RVV1RbZkpMUFJST01NTk1NTEpGUFBVWVNUT0pOT1VTVFxWUlVTU09NTElISEY/Pj06Nzg3NjU5OTY3NTY1V3FxdHh6ent8fX19fnx8fXx+fX15fX18fn5+fXx8fX1+fXxydnF4eHJ1dXFxbnBwb3B1dnRuamRkanBwcXJwbmZlZGNcXlJUWlZXVFNWVFJYWFlZWVJVT0lHT1BPT01SSk9QT09OTk9UTE1JUFBTVFUyPFhNSUFRPWNgUVNRUE5QUE9OTk1QTlRSUFJMSUxLT1JQUVJTVFFTT0xNS0xMSENCQT06OTg3NjtCNDU2NjtlcHJ2eHl7fHx9fnx9fH19fX18e3h8ent9fX58e3l9fH18e3B1b3d1cHV0b3N2cHFxcHV1dmNqZ2VXaHRycnFuaWlocFZWVFVYVVZVUldWVVpZWFdVUVNGRkFGR0dIRkpESEpIR0VITEhLSUdMTVBNRy9FX1I9M0A+am9hUlJRQEdUUU9QUFFOUU9QT0xKTExPUE5NUFFRTlBPSkxNTUtHRUVDQjs9PTw5PUc2Njc2RG5xdXd6fHt8fX18enx8fX5+fXt5dnh3eXl8fXp6dn17fHp6b3Fud3JwdnFtcHNwb3Bzc3N0ZmdgaFpXa3JzcmxtbWtuYmVQU1RSU1VPV1ZWWVlWUVFRT0A+Oz0/QEJBQ0BCRURBQEdIR0hGRkhKTUxER0NPUkI4RE1TXWdTUVNBR1VQT1FRUE1NTkxKTEtMTk9PUUxOTk1JTUxJS0tMS0dGRkVEPEFBPjtARTs8ODlUcnN1eXt7e3x8fHt5fHp6fn58e3V0dXJ2dnp6eHpyfHt8eXltcW94cnF1bm5xcm9vb3Rzc3J1dGtnZ15lam1wa29xbWltY0xPTk1RU0xUVVRXV1VMTEtIPTk4Nzs/QT49PUFAQj0+RUhGREZGSUdKSkBGQUFARUdESU9IUVJhXFFQUk9TTk9PTExPTUtNTE1PTltWS01RT0hKSENJSkxMS0ZGRkU/QkM+PUJHP0I/QGRydXd7ent7fHt6end8d3l+fnt7cXN0cHJzd3R4eHN6e3l2d2xxb3ZxdHRsb3Fybm5vc3ZydHNycmtsZW5zaG1ubWxtbGprSUxISE9RSlFTUVRTT0tIQ0U9OTg3OT9CPzs+QUBAPkFESUVDSEdJR0lFQkI/PjxCQUBHSURNT2JlUE1PTVdLTE5LS01NTExLTk5TZE1KTFJJSUlFQklKTE1OSkdJRkJCQkA/RUZFSERMb3B2enl5e3t6fHp3dHh0eHx8eXpucXJtbm9ycnZyc3h8eHZ2bXBtc3B1dGxwcHJvb29ydnVyVlZucWdseYRqbXFybm5qaG9ISkNHTExJTVBNUE9IS0U/Qj05OTk6P0I/PEFCQUFEREdLRkRJSUdHSENDP0I+Pz9APkNFRExNUVRMSklNVEZJSUpMSUpLSUpMTU9QUlBLR0NLR0NDS0pMTk9OSUpJR0NDQ0RJSk1MSVpzbnh5eHp7e3l8dnJwdXJ0eXl2eGpxbmpsbG50dG1zdXtzdHhyb25xb3ZzbnBvcnBvcHN0eWpOYGdzanR8eWdvc3FpcWhlcUhKQ0ZHSEdKS0lKTERHQjw+PTo6OjtBQj89QkJDQ0hFSkxKRUlJRkdIQ0M7QUBCPkA/QkVESU1PR0hKR0hLREhJS01ISkxISUpMSk1dUkhJRE5HQkVMS05OUU5MTUpLRkdHSk1OUk5NY25qd3Z3e3l7en1xbWxza3B0dHR1aHBtamlra3RwbnR0eXByeXRvcnFvd3NvcXB0cnBydXR5a05WbXVscXt2aW5vaWp0aGVwRkpDRkVGREVFRkVHQ0NAPTw9Ojs6O0FEQT9CQ0VFSUZKSkxGSUlHRkZEQjpBQ0M+P0NDQ0RHS01ISk5IREhESUxOTUhJTEdGRklJTE5LSUhFT0lDR05NUE5QTk9PTUtJSElPU1FSTlNnZ2Zyb3N4dnt6fGxoam9la3Btc3FmbWxoaWtsdG1wdXR3cW94dG90c3J2c3BxcnRzcnR1dXZ2WFZ1dWtvdHJrb3ZsaG1mX3BHSkNFRURCQkFFQERCPj8+Ozs7PTs9P0RCP0FDRkdKRkpJTEhHR0dGRUM/PURFQj5BQ0JDRUdISUdNUElGRkZLTk9LRkhJRkVDRElJSEtJR0hQS0RKTU1RTk9OT1BOSkpJTVJVVVJQWGVhYW1mcHJvcnl6Z2VoaGNpbGZxbGZsbWdpa2xzbXB2dXRwbnZyb3Nyc3V0cXNzdXRzdXZ2dnl2dXR2bGt1dW1ydnFsbmxlck1HRURGQkFAQUQ8QkE+QT06Oj0/Oz4/QUI/QEJFR0pGSkdJR0ZGRkVEQ0FBRUZDQkJCREVFR0dIRkxQTElPSkpMS0lGSEVGRUNDSEhIS0pHS1JNQ09PTlFPT09OT09LS0tQVVdWVlRZYF9daWBtam5ocnNiZWZmZGhoZm5pZm1taGtrbXJpcXZ1c3Ftdm5vcXJzd3Nyc3R1dnZ2dnd2d3Z2dHd1a3N1bnV0c3Bya2tzTUdHRUdBQUBDRDxBQUBDPDg6PT46Pz1AQkBAQERGSEVIRkZIRkVFRENEQkRJRkNHRUFFR0VGRkdFSk1LSFFNSktISElFRkhIRUNJSUpLTUtQU05EUlNRUVJOT01PUE1MTlNXVldZVlheWl1kYGhjamlna19kZWZjaGdna2dna21rbWxwcWd0dHVyc252b3FwcnR4cXNzdXZ1gpF5dnZ0eHV1d3hub3VvcnN1cXFpcHpNR0dHSEFBQkVFPEBDQkQ8Nzo9Pjs+O0FCPj8/Q0VGREZEREdFQ0VDREZGRkpFRUlHQkdIRkdGRUNGSkpHTUtMS0hKS0ZJSEpIRUtLTExOT1JUT0hUVVRRVFBRTU5RTk1RV1pWWllXWl5aWGFgYGBeaGVjYGRlZ2dqaGhqZ2hubGxvbXFwaXV1eHJycHVwcHBydXZwdXN1dnV7fn14dnR3dnZ2d3BsdXBtc3Vub3NzeU1ISEdJREFDR0U8QEVCRDw4Oj4+Pjw8QkM9QD5BQkZDRUNDR0RDREVGR0dHSUZHS0hDSUhHSUdGREhLSUdLSE1LSktMSEtKTUtJTkxOTk9SVVZPTFZWVFFUUlJMT1FQT1RZWllcWlpcX19dYGNeXGJkbGNgZGdocoVoZ2pmam5ucG9uc3FqdHV4cnNzdHJucHF2cnF1cnV1c355jn11dXZ2dnZ4cml1cWtydGxxd3F1S0lLSEpGQkRHRT1BR0REQDk8PkA/Pj9DQjxAPkFBRkNFRENIREZERkZISEZIR0lLSkVKSEhKSEZGTEhISEpHTExMTExJTUpNTk1PTFBQUVVWV09LVlZVU1NSUUxPUlJRVltbXV5bXV5gYGFgYmVeZGBmaGBlaGpkc3NmamhnbHBycW9zc25zd3dwdXZ0c21vcnVvcnNwdXJ2cnSBdnV1dXd2dXd0Z3Rya3Fya3J3cHdJSkxJS0dCRURFPEFGRERCOz8/QUBAQURBQEI+QUNIQkVERkdFSUVGRUlIRklISkxISEpKSUtKRkpLSElKSkdLS01MSklMS01OTk9MT1BSVVdWTU5UVlVTUlFQTU5UU1JXW15eX11eYGBhYWJgY2RlYmRpY2Rpamd2i2xraWdtb3NxcHFwcHJ5d3J1dXRzbW1zc21xcm90dXVzcHN3dHV1d3Z1dXRlcXNrcHFqcnZwd0pMS0tMR0NDQUU8P0VFRUM9QUFDQkJDRUFDREFBRUdDR0dIRkVJRkNHSkdHSkVJTEhJSk1LTUxHS0lIS0tOUUtSUUxTTUpNTU5QUFBUT1dYWFtOU1FXXFpTVlBOVFVUVFhaX2JiX2RhXmFjXmBmYmFjaW5oY2loaG14dm1oaW5vc3JwcXJycnZ0c3Vzc3Nua3NxbXByb3R2c3FxdXZ1c3d5d3V0dWNtdGtvcGpxdHB3TE1MTExHREFARD49REVGQz9DQUVEREZDQkVHQ0NJRUJISklHSEpGREtKR0hKSElLR0pKTktOTElMSEpNS1pmSmRcS2xSR05NX25VbHNbcXBid2NSUGJ2dWh1Y2F2YVhucWJkdmluemZcbHVgbGtVX3d2aWpoaGZnbG1qbW9qbW9zcnBycnFyc3Jzc3J0cm5sdG9ucHFxdXVycXN0dnZ1dXl3dXR0YGt0a3Bwa3FzcXlLTkpLSkZCP0BCPzxERUZEQ0NDRUVERkJFRkdEREpEREpMS0lLTEdHTkpISktHS0pJS0pOTE1NTExJTUxMW3NiZHBebGxVTE5lcl1nZXFsbnRncGlfYVlubWJwcGJrampnb3F0ZXRublxwdmdwTktxeXZrYWFrZWVseG1rdmxub3NycHJxcHFycXJycnRybW1zbm5vcHJ1dHFzc3R1dXV0d3h2dXRibXVrcHBscnJxektMSUlHRUQ/QUE/PUJFRkJFQ0VERUVEQ0hIR0RFS0hHS01NSkxMRkpOSEpLSklLSkpJS01NTk1NTUtOTU1bcnBvbnBwbGtNUFFsWE5pYnRycGFtb3ZcWWxQW21tWnFta29teHh0c2lwXWBzbHFqVXV5eG9jXmtmYmdwcGppb3Bwc3NwcXBxcXJycXFycnRsbXJtbW5vcnV0cXRydHV1dHV1enZ1dGVudWtwb2xzcnJ5SktHR0ZFRUJBQj0/P0VHQkdESUVFREJGSUhIREdLSkdNTE5KTE1HTE5JTUtISk1JSkpKSk5PTk5NTE5NTFxoZHVdbHFXbE5PUW1VWmtea2x2YWxkdFRlY05sWWxcdHBraWx4and1aHBdX3NraFdiY3d8b2NgZ2hhY2l0eWtubnFzc3BxcHFwcnFwcHBydWttcW1tbW9xc3Rxc3J0dnZzd3Z6dnV0aG91bHNvbXNydHZJTUdJRUVEQ0FCPEJAQkZDR0ZLR0VDQ0hLSEhGSUxLRk1LS1JSTEhNTUhOSklITkdKSkhITk9NTkxKTk1KWnRwcG9xcW1sT1FSbllza2dvb3Fxb210Xm5YYXRfbm9wb3Fyb291c3R0altedGN3eHJqbnpoYWFjZmFiam10dXBzdXZzcXBwcW9ydHt/fn13bGtxbmxtbnByc3F0dHN1dXR4eHl5dHVrb3VtdG9uc3N2dElLSEpDRUVFQEA+Q0NBRkNISU1IRkNGSkxJR0ZLTUxGT0pLV1JLR0tKSk5JSUpMSUtKSUlLTE1NTElLS0tTa2JZaV5famNyclpfWWpvX2VlVWtfZFthYlFgbWhcalxuaWlkW29lZHBdWlxrW21xY3BzbGRnY2RnYGBrbXBwb3R5cnVxb3BxbnmFiIeHhoWAdnNua21tb25xcnR0cnR1dXZ5eHhzdW5xdW53cXJ1dHdySEhGSURFREZBQEFFRENHQkhKTEdGREdLTElFRkpPTElPSkxbUUpGSEhLTUlISkpLS0lISkdLS0tLR0hLSkxLTEpJS0xOVFtdVFBVTVFPTk9PVVJQUFFPT1FKSk5QUWRxaVRZVltbXFVZW11YXVxcY2ZhYWZiY2ZfXmZrbWhtdHhydHJvcHB0hoeGhoaFhYaHg3pwbW1sa3FzdHRydHZ0dXl5eHV2cXJ1b3ZydHN1dXNHQ0VHRkZBRUM/Q0dERUdDSUtMSEZER0tMSERHSVBLTE9LTFdNSUZFSElKSElLSExKSUZISEpISEhFRkxISEpOS0hPXFdeT1xcYF5PWFlTXFxiXk1ZWk1YYVJLWWFaU2BkXGFYW2RkVlZYXFlaWFxWWVxeY19kYGFfZWhrZ210dHFxdHBxcoGGhoaFhoWFhYaGhoR9cmtpb3Jzc3N0d3l5eHl4d3h0cXhyeHNxcnVydE9CQ0RMTUFDREJESUVHR0ZLSktIRUVKSkpGREdIUEpMTUpNUklIRUFIRkpJS0tJTEpJR0VKSEVGR0VFSkdCSU1JSlRfWWBYYGFbYFVYWVReXlpfUllcUF5cWU5fXF5TW15kXlpdYGNfWV9iW2BeW1VZWFpfXmRjYmFjZWlla3Jwb3Bwbm93hoaFhYaCe4CFhYaGhYaFf3VxcHJyc3V5enp5eXh4eHdyeXZ4cnF4dnR2YVNKSk1JRUNCQ0ZHRUdHSUpKSUlERktKSkVFSElOSk5MSExOR0hGPkdHTElLS0pLS0lHRUlGQ0RFQkZKRD9JS0lOW2NZXl5hX1JUU1dfYFxdWV5RWVxNVl9XS1FZW1FbX2JhXV5jYWBiYmJjY2VaUllWV11bXmRgX19jZWJob21tbGxsbHWFf4SDeXV8hIWFhYaGhYWGhoN9d3JydHd5eXl5f359eXV5dnZybnp3dnhYUUpGREdFQkVHSEZHSElGR0pHSEZIS0lLRENLSk1NTExISkpISkc/R0ZOSktLTUtLS0lHSUVFQERBSElBPkhJRk9dYVpbZF1fVFFSWF1cXFxfW0tXXExSXFlJTV5RUV1fYmNjY2NiXGRjYmRjZVhSVlVUXVlbYV9eX2FhX2Rsa21qa2xudn51gXp8hIWFhYWFhYaGhYaFhoaGgnpyc3V1e4WHh4eGhYSBfnhwend2eFxSTUNASUZDRktJRkdHSUdHSkZGRklMSk5FQ0tKTE5KTElLSklJR0JISFFNS0tPTUtLSUhIRkU/RUJISEFARkVDVF1ZXlhfWV9bXVVYWFBdXVFLSlZeWF5bXVZaYVJSX19iYmBgYmJfY2JiZGRiWFBSUlNcVFxdXV5eX19gZGhnbGpubnB7e3x+e4CCg4SFhYWFhYWEhIWDhISHh4FzcneFh4eHh4eHh4eHh4WDgHx4XFNLQkFHRkRHTVJIRFJLRkhISERGS0lNUEVHSUpLTkxMSUxLSklHREhLUU9NTFBNTEtLSUpERUFFQ0hGQUFGREFWVUVcVF5TVl9YTlRVTlpbTUpLVGBhW19YX15iXU9YYlxgYF9iY2FdYmJXX19UUVBRUllTXlxbXV5fYGFmZmVsZm9vd3x7gHt9f4CEhISEhIWFhYODhYKDgoWFhnpvgYaGhoeHiIeGhoaFhYSFg35JTkZERkZHRElTY1FFV19JR0dIREZNSlBQRklJSktOTExLTUtKSkdFSU5RUU5PUE1OTU5ITEJEQUNDRkRDQUNEQExIQ0xMUE9OTEZNRkZISUhHTExNT1BJTE9QUFNQTFFUUlVaWFdZV1djVk9TVFBRT09RVVRcWVlbXl5hYWVmY2hkbG1xc3N6eX97en+EhISEhISEhIKEgH57gYOBfXuFhIaGh4eHhYWFhISEgoGAfUtJRUVHRkdES01eTUhIWU1HSEpIR01MUVFJS0pLS05NVU5PS0tMR0dLUFRTTlBQTk9PT0hLRmBFRF5MRGZjQ0xbSF5cc21PTVZtWUxDT19UbFdnSl1XVV5ETFFVTE1TVlFSVFhWVFhUVFxUUGZaaGhlWlRrVFhXVVtcXGBgYWJiYmBnaWdubGhyenx9foGEhISEg4ODgX19enJ7gXp7f4KAg4SEhYWBhIWBg4N/fnp7TElFRkZIRUVLT1RKS0dgVEhKT0pJT01SUUtNS0xPUlVST1BKTE5HSE1RW1lPUFBOT1BQSktRf1FJfFlZcnNXUG1HcW5vYVZQcXF0T0Jqc25xdHBTb19bblhdVlxYVWtoVV1WY1lgWVpeVVVXf2l0dXVfYXZfWWJcXGZbX2FhYWJeYGNnbW9sYHB3dHiBgYKDhIJ/fX6Adnh6bXZ+dHh9gHx+gIGChHyAg3p/gX9+d3dOSUVITU1CRExMR0pMRlJWTEtPSExSWFdRTk9PTVFUTk9RUEtMT0dNUFNbWlRRUk9QUFBLSVp4XVR4ZGhYUlNQdmZ0bHBibmZrUnJOTHdtanJwc3JxcnBvcIBdZXp1eHFxenF+cn1rdX1hUmh8ZXNzb3NzfH1wfnhvf3JgYGBiYlthYWhsbmtibGZnbXd+gYCDfnt4d4B0dnpocn5udHx+d3h7foCDeHyBdXx/fHxzc05LRmBdR0FFTU1IS0tISlFPTU5KTlZeWVVMUVNOWVlMU1JSTkxQSVFSVFlXV1FUUFBRUktIZ3hsY3hxbVpKTFR5cHVtdWJudlBkZEhldnFtd2+AamZ4eGlXclFoem1panp6fWx4en9waG5YdXVqdnVwgGFzaH1pbHh8b19fX2NiXF9kZWdqamVnYmNkbGxwcHN0c3NzeXFyeGJsdGdyeXtzc3V5foFzdnpufH15eHJuTUpSdE5DQkVQUUhLTEpMUU9PT01QWmBaWEtUV1BhXlJWUVlTTVBKU1RVWFdXUFVQT05TSktyb3V1cXVxY2hhVm5McXBeR2h5V3ZUS2h4fXdgeXtzbmFdbW9kU2dydW5teXB3bHZzdHFsbVxzfnprbXl8bHVufGxxdnV4Xl9fYl9dX2VlaWdoZmVeYmJpaWlqa25va3FubWpwYWNmZG93eG9tcHN5f25xcGp7enRyb21LS1pWSEdFR1JRS01OTExRUVBQUFFXXFlVTlZZVWZYUlJZXlRNTkpUVFZXWVdPU09PTlFJUm1IaXdLYGR2dVVXbE5ubHtyYWpnf3VUS1drZ3xsbWx4X1pwentfYHpzY3JveHFoZHxpcntdVEtrX3Z1bGp2fHttfnlrfHBdXl5iW19iZGVnZmZlY1tjY2lra3JzcndnbWloZGdgYWxhZ3NybGdsbXJ8a21oa3t0bW1rbU9HSktISkhIUlFNT1BNTFNTUk9TUlhSV1RQV1pWVlRUVGFgUU9OS1RTU1FWVk9PTU5PUUpIUU1PVUxLS1JTUlJST1ZVUVFPUlJYWFBOUFVUV1hYW1tVUVJXW1dYV1tPUlRXV1hRXVhWXFVUT1hSV1dYWVpgXGdyX1tbWl1dX2NaX2NjZWdkZGRjWmRiZ2ZmbW5tdWZmZ2NgZl5eZ2BkbGhmZ2tocHpoZ2drdWpoZ2lsUElLS0xNS0pUUk5SUVBMVlVUUFRVWFVaVlJbXVZVVFdVWVhPT0xOV1RQTlVTTlBOTFFQS0lRUUtRTUpKT1FUUlBRU1JJSU1PUFFSUFBQVFVSWFdcV1NSUFFVVVVTWlFOUlFXVVNZVlRYVFNRVFNVVVlZWF5aX2FdXFpaXFxgY1xeYmJkZ2VlZWJZYGFjYWJoaGpuY2FkXl9jXVpjXGJtYV5mZmdtc2RpaGtrZWRjZmhRSktLTk9MTVRRT1RRUU1YV1VUVlhXV1pWU1xgVldWWVVYVFFQS09YU1BOVVBOUU5MU1BNTlVTTlFOTU5RU1BUUFJUVE5MTk9SVFRRUVFVV1VZWltaU1VSVFhXVllcU09TVFdVVFlVVlhUUlFXVVZYXFpcYF1XWV9dXl1cXWBhXltiY2NoZ2ZlYlhgYGJdYGhlZ2VhXl9dXV5aWl9aX2dgXl5dY2hrYWhmaGZkYGJkYlBLTUxQUUxPVFBQVFFPUVpZWFdZWlpYWVZdamRWWFlaV1ZTVE9LT1ZUUE9UUFBRTk1SUU9RWFRRUU9NT1JUTldRVFRVT05OUVRVVVJSUlRYVlpdXFpWVlFSV1hVW1tWUFNVVVVWWFNXV1RSUVhWVltfW19gX1ZfXV5gXFxgYF9fWmJjZWloZWViWWJgYl5eZmRjYGJdXFxcXFlaW1hbYVteXV1fYl9fYmRkYmRfX2BcUE1OTlJRTVJTUFNUUU9WXFpaV1tbXFlaW2RxbWhkX1tZVlZYUk1OV1NNTVJPUVJPTVBTUlVaVVRQUExQV1VRVlJTUlhNT1BSVVhVVFRTVFlYW15dXFtWUk9VVlVbW1ZRU1ZUVlhUU1haU1JRWVdXXV9bYF9gVmJcYGFdYGJfXGBdY2FjaGllZmBaY2BhX19lZV9gY1taXFtcWlpZWVdcWlxbYF5gW15eYWBfY1xZYFpRTk9OVlFQVVNQVVRTUFdcXFxZXlxfV1xeanB3eYBjXFtWVllSTlBXU05RUVBSVFJMUVRTWVtXVU9STlNYVlNSVFJSWk9RU1NWW1ZWVlNWWlhdXlxcXlZTTlRWVltbVVFUVFVXWFJTWVxUUlJcWFpdXl1hYWBXYltjYl5hY19cYmFiX2RnaWVnXVxlYGFgYWNkX2JfWVpfW1xbWFhZV1daWlphXF1bXVxcWl1gV1tbWlBPT09ZUFVVU1JXUlRQW11eXVxgXGBVXFxoanJ9c2xoXFVZV1FPUltTUlFUUlRVVEtSVlVaWlpTT1NRVVVVU05VUVJaUlRVVFhdV1hYU1hcWF5dWVpdVVVOVlZXXlpYUVRUV1hYU1ZZXFRSVl1ZXV1hXmNjX1lgW2ViX2RkXl5jY2FeZWZpZWZeXmRhYWFiY2RfYl5YW19bXFtYWFhYV1taW2BdW1tcW1haW15WXlldUE9PUlpQWlVWV1ZUVFReXmBfXmJcYFVdXmJreXVtfWxaVVpWUVFUXFRUVFVUVllXTFJaVlxaXFJQVVNXVVVTT1dRU1hTV1VWW15YW1lVWl5YX15ZXFlSV1JZWFlfWVlSVFVZWVlVV1lcVVRaXV1eYWJgZWRdXl1dZWFiZmReX2RjYFxnZWhmZGJgZWFfYWFiYl9gXldZXlpcXFpZWVdWXVpdXltaW1xbV1lcXVZYV11TT1BXWVBdVVZZV1dVWF9gYWFgY11gVV1eYmVldoJ7aFhZWlRWVFZcWFdXVlZXXVhPVVxZXl1dVFNYU1dVVFJTV1FTVlRYWFheXlhdW1VdX1hfX1hcVlFZVFlaWmFYW1RWV1paWlhZWVpXVl1fYF9kY2JlZV5iXGBmYmRmZF9gZGJhW2ZjaGZkZmFmX19hYmFhYF9eVlVdWVtcW1lcWVldW1tbWFhZW1laWl1fXVRZXVVOVFpWVFxVV1dZV1ZcYGFhY2FjX19WW2BkYV96dW9oWlxaVlhWWFtaWVtZWFlgVk9UXVtgYVxVVVlQVFZVUlZVUVNVV1tbXF9fWl9cVl9fWV1eWV5WU1lXWVlcYVldVVZaW1pbWlpZWlhZX19gYGRjZGVlY2RaYmZjZ2ZlXmFiYGNdYmNpZWRoX2deYmJjYWFgXl9YVFpaWltbWFxYWFxbWltXV1pYV1xbXGBdVl1dU09WWlZWWlZZVlhXWF5gYmFkYWRhXllZYWRiYGtmaF5cXVtXV1laXFxcX1tZW2JWU1deXWFjXFNWWVBWVVVVVlVTVVRYXV1fYGBdYV1XYV5bXlxbXlhWWFdbWl9fWl5XWFxcXF1dW1pcV1pfYV5gZGRkZmZnY1ljZmVoZ2ReY2BfZWNdZmlkZWlfZ15jYmNhYWBfX1tYWVtZWllYWlhXW1taW1dYWlRaXVxbYFxVXmJNUldZVldaWVtcWVdZXmBiYWVhZGFdXllhY2JfYWBhX11dXVhXW1tdXV9fXFpdY1hZWF1gY2RfUlhZUFdVV1hXVlZXVl1dXmFiYV9iXllhXV1eWVxeWVhVVltbYF5cX1lZXl1eXmBcWlpZW19iX2JlZGVmZ2hjWmVmZ2lnY19jXmBmZVppaWNmaWNmX2JiY2FgYF9dXVpYW1lZWFhaWVdaW1pZV1lWVVtdXV1gYGJieEtXV1xZV11cXF1aV1xdX2BiZGJjYV1gWGJjYmBjYWNeXF1cWFdbXV9dYF9dW2BkXFxYWmJlY2FSXFlPWFZZW1lZV1paYF5hYmNgYWNfXGJdX11bXl5ZWVRYXVxfX15fW1peXmBiYlxcV1tdYGJiY2VkZ2ZmZ2VdZWdoaWZjYWJcY2dgXGlpY2hpZmVgYmFjYV9gX11dXFlcWVhXWFlZV1xbWldXWFBYWl1hY2Zmcmt/SllXXVtaX11cXlxZXVteX2JjYmFhXWJbYmRiYGNiYl1cW1pXWGlxYFxgX11cYWNfXllZY2VkYlRfWlFZV1xdXFtZW1tjYGNjY2BiZGFgY15gXF5eX1pYVlteXFxhYV9dW2BhYmZiXlxTXF9gY2RkZmVnZ2ZmZmBmZ2hoZ2RkYFtmZ15haGhjaWhmY2BiYGNiX19fXV1bWltZWFhYVlpXXFtaVlZVTFhYXGdpa2h1eIF2dnZ2dnZ2dnZ2dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6e3p6ent7e3t7e3t7e3t7e3t7e3x7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHt7e3t8fHx8fHx8fHx8e3t7fHx8fHx7e3t7e3t7fYmIhoqHhYKBgoOCg4OCgoKCgoKCgoKCgoGAgYCBgICAgYCBgYGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t6e3t7e3t7fHx8fHx8fHx8fHx7e3t7e3t7e3t7e3x7e3t7e3t7fHx8fHt7e3t7e3t8iYmHiYaFgoGCgoGCgoKCgYKCgoKCgoKBgYGAgICAgICAgIGBgYB9fHx8e3x8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eHh5eXl5eXl5eXl5eXt7e3t7e3t7e3t7e3t7e3t7fHt7e3t6enp6ent7fHx8fHx8fHx8fHx7e3t7e3t7fHx8e3t7e3t7e3t7fHx8fHx7fHt7e3uHiYiJhYSDgYKCgoODgoKCgoKCgoKCgYGBgICAgICAgICAgYKBgH58fHx8fHx8fHx8fHx8fHx2dnV2dnZ2dXZ2d3d3d3d3d3d3d3d3d3h4eHh4eHh4eHh4eHh4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t8e3t7e3x7fHx7e3t7e3p6enp6e3t8fHx8fHx8fHx8fHx8fHx8e3x8fHx8e3t7e3t7e3x8fHx8fHt7e3t7e4aJiYiFhYOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgIGBgYCAfnx8fHx8fHx8fHx9fX18fHaIi4uLi4uLgX19fX19fYSMi4uLi454KSkqKiopKz0/Pj4+Pj5tgH5+f397pdfT09PT1r2GiYmJiYqHc3FycnJycYOKiYmJiYaz1tLS0tLWun1+f39/f359fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx8fHx8fHt7e3t7hIuHh4aHgoGDg4GCgoKCgoKCgoKCgoGBgYCAgICAgICAgYCBgIB+fHx8fHx8fHx9fXx8fH19doyQj4+Pj5CDfn9/f39+hpCPj4+Pk3kZGhoaGhocMTMzMzMzMmqCf4CAgHut6eTk5OToyomMjIyMjIlyb29vb29uhY2MjIyMiL/p5eXl5enHfX5/f39/f319fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e3uCjYeIh4eDgoSCgYKCgoKCgoOCgoKCgYGBgICAgICAgICAgICAgH58fHx8fHx8fXx8fH19fX12eHh4eHh4eHd3d3d3d3d4eXl5enl5d29wcHBwcHBycnJycnJyd3p5eXp6en6Dg4ODg4SBfHx8fHx8fHp6enp6eXp7fXx8fHx7gYSEhISEhYJ8fX19fX19fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e4CMhomHh4SDhIKCgoKCgYKCg4KCgoGBgYGBgYCAf4CAgICAgICAfnx8fHx8fHx8fX19fX19fXZ2dnV1dXh2dnZ6e3h7eHd2dnh5eXp6fnx5eXh4eHh5eXl5enp5eXl5enp6eXh4eXl5eXl7e3t7e3t7e3t7e3t7e3t7e3t7e3t6enp6enp6e3x8fHx9fX19fX19fX18fH19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8f4uHi4qIhIODgoKCg4KBgoKDgoKCgYGBgYGAgIGAf4CAgH+AgYF+fX18fHx8fHx9fX19fX19d3d3dnZ3fXh3d316eH14d3d3fHx9enl8e3h3d3d3eHh4eHh5eXl5eXp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fHx8fHx8fHx7e3x8fHx8fHx8fHx+iomMjImFg4SEgoKDgoGCgoKCgoKBgYGBgYCAgICAgICAf4CAgH19fXx8fH19fX19fX19fX13d3d3d3p9eHt4fHx3e3h3d3l+fH19eXt6eHh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fX19fXx9fX19fX19fX19fX19fHx8fHx8fHt7fHx8fHx8fHx8fH2Kio2NioWDg4OCgoKCgYGCgoKBgoGBgYKBgIGBgICAgIB/gIGAfXx9fX18fX19fX19fX19fXd3d3d3fX55d3d4e3p8eXd3e358fHx6fHl4eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt8fHx8fHx8fHx8fHx8fH19fX18fH18fH18fHx8fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8foqJjo2JhISEg4KDgoKBgYKBgoKCgYGBgoGAgYKAgICAgH+BgIB8fH19fX18fX19fX19fn5+d3d3d3d5fHl7eHx9eXt5enp4e3x8fXp8eHh4eHh4eHh4eXl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt7fHx7fHx8fHx8fHx8fXx8fX19fX19fXx8fHx8fHx8fXx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx/iIeNioeFhoaDg4ODgoGBgoGCgoGBgYGCgYCAgoF/gICAf4CAgHx8fX19fX19fX19fX5+fn53d3d3d3Z4eHl3eXp4enh5eXd4enp7eXl4eHh5eXh4eHh5eXl5enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX18fH18fH19fX19fH19fX19fHx8fHx8fHx8fHx8fX+HiIyIhoeHhIKDhISCgYKBgYKCgoGBgYKBgIGBgYGAgIB/gIGAfHx9fX19fX19fX1+fn5+fnd3d3d3d3d3d3d3eHh4eHh4eHh4eHh5eXl5eXl5eXl5eXl6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fHx8fX19fHx8gIeIi4eHiYaDg4SDg4KBgYGCgoGBgYKCgYGBgIGBgYCAgICBgX97fH19fX19fX19fn5+fn5+d3d3d3d3d3d4eHd4dnl5eHh4eHh5eXl5eXl5eXl5eXl5enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fH19fXx9fXyBhoqKiYmIhIOFhISCgoGBgYGCgYGCgoGBgYCAgYGAgIGAgIGBf3x8fX19fX1+fn5+fn5+f394eHd4eHh4eHZxZGpeam15eXl4eHl5eXl5eXl5enp6enp6enp6enp7e3t8e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIGFiYqJioeEhYWEg4KCgYGBgoKBgYKBgYGBgYCBgYCAgYCBgIF+fH1+fn5+fn5+fn5+fn9/f3h4eHh4eHh5bWRiZV9fXm95eXl5eXl5eXl5eXp6enp6enp6enp6e3t7e3t7fHx8fHx8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goWKiomJhISGhYSDg4KBgYKCgoGBgoGBgYKBgIGBgICAgICBgH58fX5+fn5+fn5+fn9/f39/eHh4eHh4eW5kZWdlZGJeZnh5eXl5enp6enp6enp6enp6enp6e3t7e3t7e3x8fHx8fHt8fHt7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChouJiIqEhYaEg4OEgoGBgYGCgYKCgYGBgYCAgYGBgIB/gIGBf3x8fn5+fn5+fn9/f39/f394eHh4eHl3Z2VkZWZkZWFfaXl6enp6enp6enp6enp6ent7e3t7e3t7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHt8fHx8fHx8fHx9fX19fX19fX19fX19fXx9fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4eJh4SEhoSDg4WBgYGBgYKCgYGBgYKBgICAgYGAgYCAgYF+fHx/f35/f39/f39/f39/gHl5eXl5eWtlYWJlZWFlZV5ieHdze3p6enp6enp6enp6e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fH18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19g4aLhoiFhYaEgoOEhIKBgYGBgoKBgYKBgYGAgYGBgYGAgIGBgn98fH9/f39/f39/f3+AgICAeXl5eXl0Y2NlZGNmY2doZGZsZF5ze3p6enp6enp6enp6ent7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn6DhouGhoaGhYODg4SDgYGBgYGCgoGBgYKBgYCAgYGBgYCAgYGBfnx8f39/f39/gICAgICAgIB5eXl6d2RhY2diYmRdW2VfYV1eYGFoeHp6enp6enp6enp6e3t7e3t7fHx8e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+foSFi4eGhoaGhIODg4KBgYGBgoKCgYGBgoGAgIGBgYGAgYGBgYF+fX1/gH+AgICAgICAgICAgHl5eW9vYmJiZF5jZ19dYWFgXF9kYlttfHp6enp6enp6enp7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7fHx7e3x7fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5/hIiLhoSHhoaEhIODgoGBgYGCgYGBgYKCgYCAgYGBgYGBgYGBgX5+fYCAgICAgICAgICAgICBeXpwXWJlZGJkXmZnZ2BZYmJhY2VfXF1ze3t6enp7e3t7e3t8fHx8fHx8fHt7e3t7e3t7e3t7e3t7fHx8fHx8e3x8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fn19fn5+fn5+fn5+fn5+foCFjIqEhYaGhYODg4SCgYGBgYKBgYGBgoKCgYCBgYGCgICAgIGBf35+gICAgICAgICAgIGBgYF5emxiZGdjYmdmYWBgZGFiZWRjZGNeXGJ1fHt7e3t7e3t7e3x8fHx7e3x8fHx7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/gYeMiYWGhoeFg4SDgoGBgYGBgYKBgoKCg4KBgIGBgYKBgYGCgoF/f36AgICAgICAgIGBgYGBgXp7dGdnZmZkZGZmYF5fYWNlaGRlXmJkYHR8e3t7e3t7fHx8fHx8fHx8fHt7fHt8fHt7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f3+CiYqIhoaIhoWDhIOCgYGBgYGBgoGBgoKCgoGAgYGBgoKBgYKCgX9/f4GBgYGAgYGBgYGBgYGBenptaGNjZ2ZnZWdmZmdiZWRlYmdbYmVgdnx8e3t8fHx8fHx8fHx8e3t8fHx8e3x8fHt7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f39/f4SJioiGiYeFhYSEg4KBgYGBgYGCgYKCgYGBgYGBgYKBgoGBgICBgH9/gYGBgYGBgYGBgYGBgYF7emlpZGNqZmFgZmVjY2NnaWRjYmBiZGJ0fXx8fHx8fHt8fHx8fHx8e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f39+fn9/f39/f39/f3+AhIqMiIeJhoSFhYOCgYGBgYGBgYKBgoGBgYGBgYGBgoKBgYGBgYGAgH+BgYGBgYGBgYGBgYGBgXZzZWRnY2RmZWJlZmdkZmhmZWNgYGNkYHF9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fXx8fX18fHx9fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/fn5+f35+f39/f39/f3+AgICFioyJiIqJhoaDgoKCgYGBgYGBgoGBgoGBgYGBgIGBgYGBgYGCgX+Af35/foCCgoKCgoKCgoKCc3NnZWRkZWlqaGZnZ2NhZmZlZmdmZWVjdX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fH19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gICAgICAgIWLioqJioeHhoSCgoGBgYGBgYKCgYKBgYGBgIGBgoKBgYGBgYGAf4B+dHRzdX1/goCAfn5/gYB0cmdkZWNmaWppZWNlY2BmZGRnZ2JiZWFwfXx8fHx8fHx8fHx8fHx8fHx9fX18fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f39/f39/f4CAgICAgIB/houLioqLh4eHhIOCgYGBgYGBgYKBgoKBgYGBgYKCgYCBgYGBgoCAgH5zc3NzdHV4dXV0dHV2dXVwZmNmZWhoaWdoZ2VmZWJfZGVmY2BiZ3d8fHx8fX19fX18fHx8fH19fX19fX19fXx9fXx8fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gIB/f3+AgICAgICAgICHjIyIi4qHh4eDhYKBgYGBgYGBgoGCgoGBgICBgoGBgYKBgoKCgYCAfnNzc3Nzc3NzdHR0dHNzdW9jY2FnZWhoZ2pmZGVnZmhmY2JlYl5ieX18e3t8fX19fX18fHx9fX19fX19e3x9fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn9/fn5+fn5+fn5/f39/f4CAgH9/gICBgICAgICAgYCAf4CAgYGAgIeLi4eNiYiJhYSFgYGBgYGBgYKCgYKCgYGBgIGCgoGBgYKBgoKBgIB+dHNzc3Nzc3Nzc3Nzc3N1cmdlZWRlamhoZ2ZpaGdjZWViZGNoZGd7eHVzc3R2dnl4dnR0dHZ3d3d2dHR0dXV4d3h4d3d6e3x9fXx9fn5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f35/f39/gH9+fHt7fX58eXl2dnZ5fHx6end2d3l7fXt4hIyMioyHh4iEhYSBgYGBgYGBgoGBgoGBgYGAgYKCgYGBgoGBgoGAgH51c3Nzc3Nzc3Nzc3Nzc3VzaGVnaGVrbGhqZ2lqZ2dnZmRkYmVkbnV0dHNzdHNzc3Nzc3Nzc3Nzc3NzdHNzc3Nzc3Nzc3N0dHV1c3V3eHl7fn59fn98f39/f39/f39/f314fH5+fXx4dXZ3eXd4dnRzc3N0dXRzc3Nzc3NzdHNzc3R0c3R0dHODjI2KiYeIhoOGg4GBgYGBgYGBgYGCgYGAgYGDgoKBgYCBgYGBgICAf3VzdHRzc3Nzc3Nyc3NzdnZpY2hqaGpsZWZpbGhgZmVkY2BkZGZ0dXV1dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHRzdHRzc3Nzc3R2dnV1d3V4fH9+fX9+fHp4dXN0dXV1dHNzc3Nzc3N0dHR0dHR0dHR1dXR0dHV1dHR1dXR1dXV1dIaMjYuIhoeEhIWCgYGBgYGBgYGCgoGAgYCBgYKCgoGBgIGBgYGAgIB/dnNzc3Nzc3Nzc3Nzc3N2dnNnZ2pmaGdmaGhmZGlnY2NnZWVmcHZ1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dHR1dHR0dHR0dHRzdHR0dnV1d3Z0c3R0dHR0dHR0dXV1dXV0dXV1dXV1dXV0dHNzc3N0dHNzdHR0dHR1dXR1iY6MjIqHh4SEhYKBgYGBgYGBgYKCgoGBgICAgoKCgoGBgYGBgYCAgH93c3Nzc3NycnJyc3NzcnZ2dW5kXWNnZWlraGVoZ2dqamlnZXB2dXV1dXV0dHRzdHR0dHR0dHV1dXV1dXV0dHV1dHR1dXV1dXV1dXV1dXR0dHV1dXV1dXV0dHV0dHV1dXV1dXV1dXV1dXV1dXV1dXV0dHNzc3Nzc3N0dHNzc3Nzc3R0dHR0dHWKjoyMiYaGhIeFgoGBgYGBgYGBgoKBgYGAgYGCgYKBgYGBgYKBgICAf3hzc3Nzc3JycnJyc3NzdnZ3d2liaGhnamtpaGZkZGVmaWhwdXR0dHRzc3JxcnJ0dXV0dHR0dHR0c3NycXFxcXNzdHR0dHR0dHR0dHV0cnJyc3R0dHR0dXV1dXV1dXR0dXR0dHR0dHR0dHR0dHR0c3Nzc3Nzc3Nzc3Nzc3N0dHN0dHR0dHR0dYuOjImGhYWFh4SCgYGBgYGBgYGBgoKCgYGAgIKCgoGBgYGBgYGBgIB/eXNzc3NycXJycnJzc3N3d3d3bGpoZGhpa3Z6a2VmZWhnbXJzdHN0c3JwcHBxcnN0dXR0c3NycnNycXBvb29vcHFzc3NycnJyc3R0dHNxcHFyc3R0dHR0dHRzc3Rzc3NzdHR0dHRzdHR0dHR0dHRzdHR0c3NycnFxcnJzc3Nyc3NzdHR0dHN2jZCMh4eFhYSEgoGCgoGBgYGBgYGCgoKBgYGAgYGCgoGBgoKBgYGAf395c3NycnFxcnJycnNzc3d3d3dzc2pnaWloeX99cW51bG5wcXJycnFxcG9wcXFxc3Rzc3NycXFwcG5ubm1ubW5ubnBxcnJycnJycnJzcXBvb3BxcnJzc3JxcnJycnJycnJycnJzc3Jzc3Nzc3Nzc3Nzc3Jxb29ubm9vcXJzc3Jyc3NycnNzcnaPj4uHhoWFhYOCgoKBgYGBgYGBgYGBgoGBgYGCgoKBgoGCgYGCgX9/f3hxcHBwcXFycnJyc3Nzd3d2dnd2cnF0c252f352c3hwcHBycnJycXFwcHFxcXFyc3Nzc3FwcXBvb25ubm5ub25vcHBxcXFxcXBwcXJwb25vcHFxcXFxcHBxcXFxcXJycnJycnJycnFxcnFxcnJycnFwb29ubm1ubW5vcXJycnJycnJyc3JxeI+OjYaDg4aEgoOCgoGCgYGBgYKBgYGCgYGBgYKCgoKCgoKBgYKBf4B/d29wb3BxcnJyc3Nzc3J2dnZ2dnZ3dnZ1c3l/fnd3d29wcXFxcXFxcHBwcXJxcnJzc3JycXBwb29wb29vb29vb29wb3Bvb29vcHBxb29vcHBwcHBvcG9wcHFycXFxcnJycnFxcXFxcXFxcHBwcHBxb29ubm5tbW5tbm9wcXFxcXFxcXFxcXB7j42NhoODhYOCgoKCgYKBgYGBgoGCgYGCgoGCg4KBg4KBgYGAgYF/f392bm9wcHBxcXFxcXBwcHZ2dnZ2dXR0c3NxfYB9fX9zb3BxcXFwcHBwcXFwcHBxcnJxcXFwb3Bvb3Bwb29wcG9vb29vb29vb3BxcXBub3Bwb29wb29wcnJycnFxcXBxcnFwcXFxcHBwcHBwcHBwb29ubm1ubm5ubm9ub3BwcHFxcXFxcXFxcIKRjoqEhIOFhIOCgoGBgoKBgYKBgYGBgYGCgoKCgoKCgYGBgYCBgX9/gHVvb29wcXFxcXBwcHBwdnZ2dXRzcnJycnGAgoCBeXBwcHBvcHBwcHFxcXFwcXFxcXFxcG9vcHBwcHBwb3BxcHBvb29wb29vcXFwcG9wcG9vb25vcHFxcHBwb3Bvb3BwcHBwcHBwcHBvb29vb29vbm5tbW1ubm5ub25vb3BvcHBwcHBwcHBwiZCMiISDhIaDg4KCgYGCgoKCgYGBgYCAgYGBgoKBgYGBgYGBgIGBgH+AdG5vb3BxcXFwcG9vcG92dnVzcnFxcXFxcICDg39ycHBwcHBwcHBwcHFxcHBxcXFxcXBwcHBwcHBwcHFwcHBwcHBwcHBvcHBxcXBwcHFxb29vbm9wcHBvb29vcHBvb3BwcHBwcHBwcHBvb29vbm5ubm5ubW5ubm1ubm9wcG9vb29vb3BzcXWPj4yJg4KFh4ODgoKBgoGCgoKBgYKBgYGBgYGBgYGBgYCAgYGAgYGAf4B0b29vbm9vb29vb29vb3Z1dHNxcXFxcXJygIKCgXRxcXFxcXFxcXFxcXFxcXFxcXBxcXFxcHFwcXBxcXFwcHBwcHFxcXBxcHBwcXBwcHBwcHBwcHBwcHBwcHFxcXBxcHBwcHFwcHFxcHFxcXFxcXJxcnFwcnRycnR0dHR1dnRzdHR0dXd3gpCPi4iDgoaHhISCg4GBgYKCgoGBgoGBgYKBgYGBgYGAgICBgYCBgYB/gHVvb29vb29vb25vb29vdXRzcnJycnJycnKDg4OCdnFycnFxcXJxcnJxcXJycnFxcXFxcnFxcXJycXFycXFxcXFxcXFxcXFwcXFxcXFxcnNzcnJyc3V1dHR0dHR0dHV2d3d3d3d3eHh4eHd3eHh4d3Z3dnV2dnZ2d3h6e3x7e3t6enp6enyGkI2LiIODiIeHhYODgoGCgYKBgYGBgYKCgoGBgYGAgYCAgYGAgIGBgH+Ad3FxcXFxcG5ucG9wcG92dHV1c3Nzc3NzdYiDgoN5cnNzcnJyc3Jyc3NycnJycnN0cnJzcnNzc3Nzc3Nyc3N0dHV1dXV1dHV3eHd3d3d4eHh3eHh4eXl5eXl4eHl5eXp6e3t7e3t6enp5eXh3d3d1dnV2dnd5enp7fn5+fX1+fn5/f35+gIyQi4qHg4WIi4iEg4SDgYGCgYGBgoGBgoKCgoKAgYGBgYCBgYGAgIGAf4B8enp5eXx5eHh2dXZ2dHl2d3h3d3Z3dnZ6f3x+fnx2dnd3dnV4enh4eHh3d3d2eHx5eXx6eXl8e3l5eXh4eXl6enl5eXh4enp5eXh4eHh3dnd3eHh3eHh5eXp7e3p8fH1+fX9/f359e3t7e3p5enl5e3t/foB/fn5/fn19fX5+f35+fn6AjpCNioeEhoqLiIaGhIOBgoKBgYGCgYGCgoKCgoCBgoKBgYGCgYCBgIF/f4B/fn19fX9/f318e3t7eXh4eHh5eXl4eXh5eXl4enp6enp6e3t7fH1+fHt7ent8e318e3t7e3t7enl4eXh4ent6enp5eXp8fHt6enx8fHp6ent9fHx+fn+AgoGAgYKAgH9/gYGBgIB/f35+fn5/fX1+f4CAf35+f39+fn9/f39/gH+Af4OQjoyHhoWIi4yIh4aFg4GCgYGBgYKBgoKCgoKBgYKDgoGBgYGBgIGBgIB/goOCgoGBgX99f39/f4F6enh4d3h4eHh5eHh5enp5e358enx9fXt8fX19fHx8fnx9fn5+fn59fX9/f3x8fYGDgYCAf318fXx9fXt9fXx8fH19fX1+gYGChISDgoB/gYGBgH9/f4B/f39/f39+fn9/f39/f35+f3+Af39/gICAf4CAgICAhJCPi4eGhoiLi4mKhoaDgoKCgYGBgoGCgYKBgYGBgoOCgYCAgYGAgIGBgH+ChIKCgICAgH9+fn+AgH9/fn18fX19fYB/fX+Af35/gH9/fn9/gIGBgICAf3+BgICAf4CBgn9/f4CAf35+f39+f39/fn5+f39/gYB/f4CBgYCAgYOEgoGCgoGCgH+AgYCBgYGAgH+BgICAf39/gICAgYGBgIGBgYCAgICBgoGBgYCAgYGFjo6MiYaHiYyLi4qGhYOCgoKBgYGCgoOCgoKBgIGBgYKCgICBgYCAgYGAf4KFg4KBgYCAf39+fn+AfX5+fn19fX5/fn9/f35+fn+AgYCAgICAfn9/fn+Af3+AgH9/f35/f39+fn59fn9+fn9/f35/gIGBgoKDg4KCg4KBgYKDg4OCgYGBgYKBgoKCgYKBgoGBgYGBgoKCgYGCgYKCgoGBgoKBgYKCgoKCgYGBgoKCgoaPkY+KiImKjY6NiYaFgoKCgoKBgYKCg4KCgoGBgYGBgYF/gIGBgYCBgIF/gYWEg4KCgoGCgYCAgIB8fHx7fH18fH9+fn9+fn5+f35+f39/f39/f35+foB+fn5+fn9/f39+f39+fn5/gIB/gIB/f39/f3+BgYGCgoCAgYKDg4SDg4ODgoKCgoKCgoKCgoKCgoGCgoKDg4OCg4ODgoKCgYKCgoODg4ODgoKCgoODg4KCh5KTkIuKiouPj42Lh4SCgoKCgYGBgoKDgoKBgYGBgIGBgICAgYGBgIGAgYCAg4SDg4OEg4ODgoKCgXx9fHx9gn1+f4GCiIGCgoSCgYGDg4GBgYKCgYKBgYCAf39/gICAf3+AgX9/f39/gYCAgICAgH9/f3+AgICAgH9/gYODhYSEg4SDgoKCg4OCgoOCgoODg4ODg4SDg4KEhYWDg4SEgoKDhIOCg4ODg4OCgoODgoCKlJOPioqMjpCPjYuGg4KCgoKBgYGBgoOCgYGBgIGBgoGBgICBgYGAgYCAgH+BgoODg4SEhIOCgoKCfXx8fn6AgYOAg4OChIaFhoaFhIWFg4ODg4OBgYKEhIKDgoeDgoKAgoGBgoKCg4KCg4KDgoODgoGAgIKCgYOCgYKCg4OEhYWEg4OChISEhIOEhISDg4OEg4ODg4OEg4SDhIWEhISDg4ODgoKCgoKCgoKBgYKCgo+UlI+Njo6RkY6KiISCgoKCgYGBgYGCg4GBgIGBgYGBgYCBgIGBgYCBgICAgIKChIKChIOCg4ODgoJ9fX2AgH+AgoGDg4ODhIaEhIOEhYWDg4GBgoOBgIKDgYKFhYWFhoaHhoWGhoeHh4aGhoeHhoaEgoGCg4SDg4ODg4ODhISFhYWDhYSFhISEg4KBg4OCg4SEg4KCg4SCg4ODg4OCgoKCgoKCg4OEhIOFhYWFhoaIk5OTkI+Pj5KRjIqIgoKCgoKBgYGBgYKDgoKBgIGBgYGBgICAgYGBgICAgICAhISEgoKCgoGBgoKBgX+AgYOCgICAf4CCgoGDg4KCgYODg4SEg4KDhYOCgYGBgoSFh4eHh4aGh4eHiIiHh4eIiIiFhIOBgIGBgoKCg4GCg4SEhYSDg4OEg4OEhIOBgYGCg4OEhISDg4ODg4OEhIODgoSDg4ODhIWFhoeHh4eIiIiJiY6TkpKOj46Qko+LiYeCgoKCgoKBgYGBgoKCgoGBgIGBgYGAgICAgYGAgIGAgICDg4KCgYKCgYGAf4CBhYWFhoOCgYB+fn+BgoSCgYKDhIOCg4ODg4KChISDg4OBg4SFhISFhYSDg4SFhYKEhIWFg4KBgH9/gIB/gIGEg4OEhYWEgoKCgoOCg4OFhIKDhISEhYaGhoaGhoWFhoeHhYaIh4aHiIeGhoaIiYeGhYaGhoeIkZKSkI6QjpCRjImHhYGBgoKCgoGBgYGBgoOBgYGBgYGBgICAgICBgYCAgICAgISEg4KBgoGAgYGAgYKIh4aHhYSCgH99fX6AgH+AgYGBgYGBgoGAgYKCgoGCgoKBgYGCgYKCg4GBgICAf4GAgH+AgH9+gIGBgYKCg4OEg4OEg4OCgoGBgoODg4SEg4SEhIOFhYaFh4eIh4eHh4eHh4eGhoaGh4WFhYaGhIWEhIWEhYaSk5GOjo+OkI6JiIeEgoKCgoKCgoGBgIGCgoKCgoKCgYGBgYGAgYGBgICAgYGAgoSDg4KDgoGCgYKDg4iHh4iHhYSCgX5+gICAfn5+f4CBgYGCgYCCgoGCgH+AgIB+gIKBgIGCg4OAf39/gICAf4CAgICDg4KDg4ODgoOBgYKCgoOCgYKCgoOCgoSDhISDg4SEhYWFhYaGhoaFhISEhYWEhIWFhYSEhISDhISEhISEipSTkpCQj46NiIaFhIOBgYKCgoKCgYGAgYKCgoKBgoKBgYCBgYCBgYGAgICAgYGAg4OCgoOCgoKBgoOCiImJiYiHhYSDgYKEhIOBgYGCgoSCgoOEgoOEhYaEgoSCgX+AgoGBgoGChIOBgYGBgoOCgoGDg4SDg4SEg4OCg4KDg4ODg4KCgoKCgoGDhISEhYSFhYWFhIWEhIWFhYWDg4OEhISEhYWFhISEhISEg4ODg4OOlZKQkZGOjYyHhYODg4GCgoKCgoKBgYCBgoOCgYCCgYGBgICAgIGBgYCAgICBgICDhYSEhIODg4SDhIOGh4mIhoWDhIODg4WDgYGDgoOFhYODg4SDhIODhISFhISEgoGAgYKDgoOEg4OCgoGBhIWEg4ODgoKDhISDg4ODg4SFhISDg4KCgoKCgoSEhYSFhYWFhYODhYWFhYaFhoWEhIWEhYWGhYWFhIWEhISDhIODhJGUk5OSj4yMioWEhIODgYKCg4KCgoKBgYGCg4KBgYKBgYGBgICBgIGBgH+AgIGAgYaGhoaGhoaHh4aGhYSDhYaCgIGBgYGHgoB+f4GAgIKBgX+BgYCAgoGCgoKBgYKCgYCCgoKCgoKDg4GCgYKDhYODg4KDg4OEgoKEhIOEhIWEg4OCgoKCgYKCg4ODg4SFhYWFhIOEhYWGhYWEhISEhIOEhIWFhYWFhIODhIOEg4KGlJOSlJKPjYuHhISEg4KBgoODgoKDg4GBgoKBgoKCgYGCgYGBgYCAgYGAgICAgICAhYWFhYaGh4aGhoWGg4ODg4GAgoKCgYKAfn5/f4CAf4B/gIGAgH+BgYGBg4GAgYGChIOBgYGBgYKBgYKDgoODgoOCgoKCg4OBg4SDg4ODg4OEhIKCgoKDgoKDg4ODhIWEhISEg4OEhIODg4OEhIODg4ODg4SDg4ODg4KDg4KDgouUk5KTkY2NioaDg4OEgoGCg4ODg4ODgoGBgoGCgoKCgoKBgYGBgICBgYCAf4CAgICDhISFhYSFhYWEhIWCg4KDgoKDg4OBgICAgICAgYCAg4KCg4KBgoKDg4OEgoODg4KAgICCgoKCgoKDg4ODgoODhIKCgoODgoKDg4KCg4KDg4WEg4ODg4SDg4SEhISEhYWEhIWEg4SEg4OEhISEhISEg4SEhYSDg4SEhIODgoKDkJSSkpKPi4yIhoOEg4OBgYKDg4ODg4OCgYGCgoKCgoKDgoCBgoGAgICAgIB/gICAgISDhYWEhYWFhYSFhYOEhIWDg4SFhYKBgoOCgoSCgYKGhYOFg4OEhISGhYSEhYJ/fX19foKEg4ODg4ODg4ODhISEg4OEhISEg4SEhIOEg4OFhoWFhYSEhYWFhYSGhoWGhoWFhYWEhYWFhYWGhoWGhoaFhoaGh4aFhYWFg4SEhIeTk5KRkoyLiIWFhYWCgoGBgoODg4OCg4KBgYKDg4ODgoKBgIGAgICAgICAgH+AgICAhYWFhYWGh4eGhYWFhISFhYSEhISEg4SDg4OEhYOCg4SFhYaFhoaFhoeHhoOBfn9+fn5+f4OEg4OEhISEhISEhISEhISFhYWEhYSGhYWGhYaGhoWGhYWHhYWGhYaGhoaFhIWFhYWFhIWGhoaHhoaGhoaHh4iIiIaFhYaEhYWGjZSTkpGQi4qHhoeGhIGCgoKDg4ODg4KDgoGBgoODg4KAgYGBgICAgICAgICAf4CAgICHh4eGhoeHiIeHhoaEg4ODhIODg4OEg4ODg4OEhIODg4WFhYWHh4WFh4WBf39/f39/f36AgISFhIWGhoaFhYWFhoaHhoaFhoWFhoeHh4iHh4eGhoaHh4eGhoaGh4aGhYSDhIWFhYSFhYaGhoeHhoaGhoeHh4eIiIeGhoaHh4eRk5KQkZCLiIiFhoSDgoKBgoODg4ODgoKDgoKCgoOCgYCBgICBgICAgIGAgIB/gICAf4aHiIeHh4eIiYmIiIODgoKDg4SEhIWEg4KCg4OEg4OCg4WEhYeHhYSCgH9/f39/gH9/f4B/f4WFhoeIiIeHh4eIh4iHiIiIhoaHiIiJiYmIh4aHh4eIiIaHhoeHhoaFhIOEhYaGhYWFhoaGh4eFhoeGh4aGh4eHh4eHh4eFh5OTkY+RkIuHhoWGhIKCgYGCg4ODg4ODgoKCgoGCg4KCgIGBgYCAgICAgICAf3+AgYB/hoiIiIiHh4iJiYmIg4KCg4ODhIWHh4eFg4OFhIODg4KEhISEhYSBgIGCgYGBgYB/gH9/fnt6gIaIiIqKiYmIiImJiYmKi4qIiIiJiouLioqIiIeIiIiHh4iIh4iGh4aEg4OFh4eHhoWFhISEhYWEhYWGhISEhYWFhoWGhYOJlJOQjpGOioaFhoWDgYGBgoKDg4ODgoKCgoKCgoKCgYGBgYGBgYCAgICAgIB/gICBgH+GiYiIiYeIiImJiIiEgoKDg4KDhImKh4eEhIWEg4OFg4WDg4OCgYKCgoKCgH9+fH19fX9+fHt8g4eJi4uKioqIiIqJiImLiomJiImIioqJi4mHhoaGh4WGiIiJiIeGh4SDgoSIiIiIh4WCgoGDg4KDg4SCgoKDgoGEg4SDgY6TkpCPj4uIhYSGhIKBgYGBgoODg4OCgoKCgoKCgoGBgYGBgIGAgICAgICAgH+AgIGAf4WIh4eHhoeIiIiHh4SCg4OCgoOFiYqJh4WHhYSFhYSDhoWDgoKCgoKDgX59fn5+fn5+fX1+fX19g4eJioqHh4WGh4eHh4iHh4mGiIaIh4eJiISDhIOFhISFhYaIh4aFg4KCg4WHhoeGhoOCgoOEgoOEhIKBgYGBgYODhIOEkZKRjo+Ni4eEhoaDgoGAgYGDg4ODg4KCgoKCgoKCgYGBgIGBgYCAgIB/gIGAf39/gIB/hYaGhYaGhoeHiIeGgoKEhIOChYaIi4qGhIaEgoaGgoCFhIODg4OCgoF9fH1/gH9+fn59fH19fHp8hIaHhoSDgYODhIWFhYODhYSEhISEhIWEgoKDgoSEgYKDg4WGhYSCgYGCgoODhYOEhIWEhIaDhISFg4KDgYKDg4SFhIeSkY+NkI2JhoSFhIWCgYCBgYODg4ODgoKCgoKCgoKBgYGBgYGAgICAf4CAgYB/gICAgICDhIWEhYWFh4eHh4aAgYGFg4OEhYSHiIWDgYCAgX9+fYKDg4ODgoKAfX1/gICBf31+fn18fX16enp+g4SEgoGBgIGBgoKBf36BgYGCgYOAgoGCgoKBg4OAf4CAgYOCgICAgIGBgYGCgYGChIODhYSCg4SDgoKBgoSDhYWGjJORjo+Pi4iFhYOChIGBgYGBgoODg4KCgoKCgoKCgoGBgYCBgYCBgH9/gIGBgICAgH+AgIKCg4OChIOEhYWGhn+BfoCBgICAf4GDgn9+fn9+fHx/g4OCg4KDgX19fn+AgIGAfn19fX1+fXx6enp/goKAf39/f35/f4B+fYB/f4CAgX+AgIF/f3+BgX59fX+AgX9/fn+AgH+AgICBf4CCgICCgoGCgYGAgYGBgYKEg4aPkpCOj42Kh4eGg4OCgYGBgYGCg4ODgoKCgoKCgoOCgYGCgYGBgICAgH+AgICAgICAf39/gYKDhIGCgoODg4SFgIF/fH19fn19foCAfn1+fXt9foKDg4KCgYF/fX1+f4CAgH9+fX19fHt7e3p6eXqAgH9+f35+fn1+f35/gH9+f3+Af4GAf359fn9/fn18fn+Af35+f3+Af39/f4B/f4B+f4CBf4B+f39/gH9/f4B/hZKSj46Pi4uHiYWEg4KCgYGBgYKDg4ODg4OCgoKDg4KAgYKBgYGAgICAf3+AgIB/gIF/f36BgYSEgYKBg4OCg4OBgH98fn5/fn6Af4B/foB9fX+BhIOCgYB/f359fn5/gICAfn19fXx7e3x6enl5eXt/f35/f39+fX5/f4CAf35/f4CAgoB/fH5+f35+fXx/f4B/fn5/f4B/f35/foCAf36Af39+fn5/f35+f318fH2Fk5KNjIuKiImIhISEgoKCgYGBgoOCgoODgoODg4ODgYCBgYGBgYCAf39/f4CAgICAgIB/foCBhIOCgoGDhISDhICBgICBgIGAgYKCg4GAgX+AgoODgYGBgYCAfX19fn5+f359fX19fXx8fHt6eXl5eX2Af4CBgYF/f4GAf4F/gICAgYGCgoB+gH5/fn5/foGAgoF/f39/gIB/f39/gYB+f4CAfn9/fn+Af31+fX17fIaTkYyLioeHioiGhoSDgoGBgYGCg4ODg4OCg4OCgoKBgICBgYGAgH9/f39/gICAgICAgH9+fn+BgYGAgISGh4aHgoSDhYOBg4ODhYSEhISDgYODg4KCgoGCgX5+fX19fn6AfX19fX19fX18e3p6eXl5eYCCgoKEg4CBg4GAgoCBgYGDgoODgYGCgIGAf4CBg4GEgoCAgYCBgYCAgYCCgn+BgIF/gIB/gICAfn9/fnx8ipOQiomIiIiJiIaGhYSCgoGBgoKDg4ODg4KDg4KCgYCAgICBgYGAf39/f4CAgICAgIGBf359fn5/f39+g4aHh4iChYSFg4SFhIWGhoaGhoWFhoGAg4ODgoKAfX19fX19fn59fX19fX19fX18e3l5eXl4fIKDhIWCgYSDgoKDhYaCg4SDgYKCg4OCgoKCgYKFg4iFgoGBgYKCgYGBgYSDgoOCgoKCgYGBgIF/gIGAf36Ok4yHiIeIh4aGhYaGhIKDgoGCgoODg4ODg4OCgYGBgH+AgYCBgYB/gH9/gICAgH+AgYB/fn19fX5+f36Ag4SHiISGhoaFhoaHh4aHh4eHhoeHf32AgIGCgX59fX19fX19fX19fX18fH5+fnx7eXh3eHl5gIODf4ONhIOEhISXl4ODhIF9foGCgoGCgYKBg4aIjIWDgoKBhIKEg4KDhYWEhYOCg4OCg4OCgoKCg4OCgpKQi4iIh4iHhoaEhoWEhISCgYKCg4ODg4ODgoGBgYCAgICBgIGBgH9/fn+AgYCAf4CAgH9/fn1+fn+Bf4CCgYWFhYaGh4eGh4eIhoeHh4aHh4d/fH18fX9+fX19fX19fX19fX19fXx7iJKCe3x6fIZ5eHl8gYF+iZeEg4OEhJSTgIGBf39/fn6Ei4B/gICEhpCJhYSCgoGFhYuDgYOFhYaGhIOFhYOEhIODhIOEhISIko6LiYiIiYeHh4WGhYSFhIKCgoKDg4ODg4OCgYGBgICAgIGAgICAf39/f4CAgICAgYGBf39/f4CAgIGBgYGBg4OGh4aGh4aGiIeGhoaFhISGhX98fHx8fX18fH19fX19fX19fX18fH+RlZaDe3qElHx4eXp7fH+Cg4GBgIOCgH58fn57iJF8fI6Wf31/f4KGioWDg4SDgYONiX9+f4OEhYWDhYaFhIWFg4SFhYaEhI6Rj4uKioyJiYmHhYaFg4OCgYKCgoKDhIODgoGBgICBgICAgYGAgIB/f3+AgIB/gICAgX5+f4GBgoKCg4SDgoOCgoWGhISFhYSGhIOEg4KBgYOBf319fHx9fXx8fH18fH18fX19fHx8e4uRl4x6e3yBenp6e3x5eX19foB/gH98e3t+fn2ClZF/hIh+fH5/goR8fIGChIKAf4eDfYKBf4KCgIODhISEhISChIOEhYKEkZGNi4yMjoqJiYWFhYODgoKBgoODgoKDg4KCgYGAgIGAgICAgICAgH+Af3+Af357gICBenyAgoKDhYODhYWFhYODg4SCgYODgoOCgoGAgIB/gX5/fn59fHx8fHx8fHx8fHx8fHx9fHx8fn6Kgnt6e3p4ent7fH17fn1+f319fX18fH+BgX2Gj4F+fYJ+f36Agnx8f3+BgIKAfn17ioJ9gH9+gYCAgYKBgoCAgIGAf4uTj4uLjY6NiIeHhYWEhIOCgoGCg4OCgoODgYGBgICAgICAgH9+fXx7fHx9f3+AgHx6gYF4e4CCgYOFhIOFhIaGhISAhpSIgIGBgYGBgH9/f39/fn5+gHx8fHx8fHx8fHx8fHx9fHx8fHx8fHl7e3t4eHl7enp8gX+Afn+BfH5+f399gIKCgICAgX+CkYF/f4CAfoB+fn9+gIGBfXx9e319fX19fHx9gH+AgH6Afn6BlJGLjI2Nj4qFhoaFhISFg4OCgoODg4OCgoGBgYGAgICBgICAf4CAf39/fXt6fICAgHh+gXd7gIF/gYKCgoKDhoeGhn6IlYp+gYGAf4B/foB+f39/fn+Bfnx7e3x8fHx8fHx8fH59fHt8fHx8e3x8fHp6eXt8en2Fg4J/gYF+f35/gH6FgoF+gH9+foCFhoKAfn6Dhn9+fX6AgIGAf39+fX19fX57e31/f3+AfX9+gIyRjYuMjY2Nh4SGhoWEhISDg4OCg4ODg4KBgYGBgYCAgYGAgYGBgYGAgH9/f397en9/e3mAd3p/f31+f3+Af4KDhoaFf3+FgX5/gIB/gH5+f35/gIB/gIB/f319fHx9fn18fX19fX19fH58fXx7fXx8ent6fH19f4aEgoCAgX1+fX5/fouEgYZ+fXx8f36CgX99fX19gHx7fXx+gYSDgYB+fn5+fX1+f399foB+fn6EkoyLi46Ni4qGhIWEhIODg4OCg4KDgoOCgYGBgYGBgYGBgYB/fXx8fH1+f39/f397e399d352eH59fH18fX5+gYGCg4B6fX18fn+AgH6Af35/fn+AgH+AgH9/fn9+fn5+fn1+fn99fH59fn19fHt8fHx6e3p9fn+AhIOCf35/fH18fXx8gYN+jH58e3t9fn1+fn17e3t9fHp7e3uAhoSChIOCf4B+f4KBgn9/goJ/gIqPjIqKjIuKiISEhIOEg4ODgoKCgoKCgoKBgYGAgoGBgYKCf3+AgIB/fn18fH5/fn55fX52e3Z4fXx8fHt9fX6BgICAf31/f31+f39/foB/f39/f3+AgIGBgH99gH9/fn9+fn9/f3yCfn59fX17e319fHp8fH6AgoGAgIB8fH18fHx8fH18fXt/fnt7e3x8fH18e3t7e3x8enp9en6Cf4GDhIKBgoGFhoWFhoaHhYKEkY6MiomKh4iFgoOEhISEg4KCgYGCgoKBgoGBgYGBgoGBgoKAgYKBgYCAgH9+e3x+fnx6fnh5dnd8fHx7e318f4GAf35/foB/f35/fn5/gH9/f39/f3+AgYKAfn6BgIB/f39/f39+fYN8fH19fH99fX19e3x+fn9+fn5+fnx8fHx8fHx+fnt8e3x8fHx9fH18fnx9fHx7e3x5e3x7e317fX5+f4CAg4eJiYmKiYqJhYiRjYuIiIaFhYOCgoOEhIODgoKBgYGBgYKBgYGBgYKCgoGCgoCAgX98e3p6eXt9enx+fnl8eXh4dHx8fHt8fHx+gX9/f39/gIB/fn5+fX+AgH9/f3+Af4CDgoB/gIGAgIB/f4CAgH58enx9fX59fX5+jIZ9fX57e4OCfX19fX18fXx9fX1+fH18fXx9fX58fn19fX18e3t6fHt8fHt6e3t6enp7fn6ChYiHiIqLi4qJjJCNjImIhoWEg4KCgoODg4OBgYGBgYGBgYGBgYGCgoOCgYKBgIGBf3+Af356eHl5en5+e3l6eH5zfHx8e3x8fH5+fn5/gH+AgIB/fn9+gIF/f4B/gIGAgoSEgYCAgYGAgX+AgYKBf39+f31+gH57foGRjHx9f4qAjYx+fn19fX59fX59fHx8fX18fXx9fX1+fX1+fnx7e3t8fH18e3p7fHl6eXh5e35/hIOEh4mKiImNj4yKiIiFhISDgYKCgoKCgoGCgoKBgYGCgYKCgoGCgoKBgoKAgYGAfoCAf39+e3p5e319eHx6f3KBfXt7fHx8fn59fYGBf4GBgX9/gH+AgX9/gIGCgYGFg4SCgYGCgYKCgICBg4KAf4F/fX6Afnx+f4iCf36DkISEg4F/fn18jYd9fX59fHx/fnx9fXx9fX1+fX5/fX19e3x9fnx8e3x9enp5eXp5e3t+foCBg4eEiI2MiYmGhYSEg4KCgoOCgoGBgYGCgoKBgoKCgoKCgoKCgoGCgn+AgIB+f39/fn5/ent5fX16enp9cX6Cent8fX19fXp4f4KAgYKCgICBgIGBgICBgoKCgoaFhIKBgYGBg4F/gIKEgX9+gYB9foF+fX5/gIB9fn+EgH5+f31+fX2KhX1+f31+foB/fX19fH5+fn99f4B9fn18fX9/fHx7fH17e3t6enp7e3x9fn2Ag4CJjImKh4WFhYSDg4KCgoKCgYGBgoKBgoKCgoKCgoGBgoKBgYKCf4CAgH9/f39+fn59eXp6fXx5d3t0e4d8dHd9fn17e3Z2foCBg4KBgYKCgoKBgYGDg4OChYaEgoCAgICCgX+AgYSBfn6AgH1+gH59fn6AgH+Bfn+Af39/gH99fn9/f3+Afn9/gH58fX18fn5+foF/gH2CgHx9gIF9fHx9fXx8e3x8e3t7fHt8fHx9fImJh4eFhoWFhISDgYKBg4KAgIGCg4KCgoOCgoKCgoGCgoGBg4J/gIGAf39/fn5+fn57enp8fHt2e3R3f352cnt+fnt4dnd8gIGCgoKBgoODg4OCgoSDhIOFhoOCgX9/gIOAgICAg4F+foCAfX+AfX1+foCAf4J/gYGAgICBf31/f3+AgIGAgIB/fnx9fX19fn59g32AfoKAfX6AgX98fn59fX17fH58fXx8fHt8e3x+iYWGhIWHhYSFhIKBgoGDgYCAgoKDgoKCg4ODg4KBgYGBgYGCgH6AgYB/fn5+fn5+fn56e3p9goN9dXF6fHpxen19eXh0dICAgoKCg4KDhYOEg4KDhISEhIWEgYGAgH6Agn9+f36Bf35/f4B9foB9fX1+gH9/gYCCgYCAgIKBfX6Af4GAf4CAgH9+fX19fn1+fn19gYR/gH9+f4GBf32Af319f31+fn1+fHt8enx7eoCFgoOEhYSEhIWDgoKBgYKBgICCgoOCgoOEg4SDg4KBgYKBgYOAfoCBf35+fn5+fX5+fnt7en6Jh354cnl9f3F6eHt4eXR1fYKDgoODg4OFhIWEg4OEhIODhIKBgH+Af4CBfn19foB+fn5/gH19f3x9fX6Af4CAgIKAgIGAg4F/f4B+gIF+gIGAgH9+fn5+fn5/fn6FhYCBgH+Ag4F/foGAf36Af4B/fn17ent6fHt6goN/goKCgoOCg4KBgYCAgoGAgIKBg4KBg4SDhIKEgoGBgoGCgn9+gIF/fn1+fn5+fX59fXp7fIWEe3tzeXt8cHd1dnd5dnR6hISBhISDhIWFhoSDg4WEgoODgoCBfn9/f4B9fX1+gH1+f39/fn1+fH19foF/gIB/gIB/gIGDgoGAf36AgH+AgYCBgH9/f39/f4CAgIGCgoKBf4GEgX+Ag4F/f4B/gX+Af3x7e3p8e3yBgH+Bf3+BgIKCgYF/f3+BgH6BgoKDgYGDg4KEgoSCgYGBgIGCgH6AgH9/fX5+fX19fn19e3t6gH94fHZ5enxxdHh3dnh1cnmFhYKEhIKEhYWGhISChIOBg4KAgIF+f4B/gHx9fX6AfX5/f39+fX98fn5+gX+Bf39+f4B/gIODg4B/f4GBgIKBgYGAgIGAgICAgIGAgYKDgYF/gISBfYGDhICAgX+BgYKBfXp7e3x8fX99f4B8f39+fYGAgH59fYB/foGBgYKBgIKCgoKBg4KCgYB/gYKAfn9/fn99fX1+fX19fX19ent7fHZ9eXh6enJ1eXl2d3dzdYaFg4WFgoSEhYSEhIKDgoGDgX+AgX5/gH6AfX19fn9+f4B+fn99f3x/f3+BgIF/f3x+gH6AgYKDgYCAgoOEgoGAgYB/gYCAgYGAgYGCg4KBgX9/g4B+goKEgICCgYKChIF+e3t8fHx9fX1+fXp+fX55fn9/fHx8fn1+gYCBgYGAgoGBgYGDgoGBf4CAgoB9fn19f319fX59fH19fX16e3p8dnx6d3t4cnZ5e3Z2dnN0hoSEhYSChISFg4OCgYOBgYOBgIGBfX+BfoF9fX1/f39/gH5+f359fYB/gIGBgX9+fH5/fn5/gYJ/gYGCg4eFgX9/fn6Af4CBgICAgIKCgYCAfoCCf36BgoKBgYOCg4OFgn99fX18e3x8eXp7en55fHl4f357e3t+fX1/f4F/gH6BgICAgoOCgYF/gIGBf31+fH1+fX19fX18fn58fXx5e3x4enx3endzeHd6c3Z2c3SGhISFg4KDhISDgoKCg4GCgoGAgYF8gIB+gH1+fX5/gICAf35/f3x+gH+BgIGAf359f39+fn+BgH2AgIGDhIN/f359fn5+f4B/gIB/gYKBgH9+f4F+f4CCgoCBhIKEhIaEgH59fHx8fHp5dnl5enl2eXZ+fHt7e358e399gH99fX9/f3+BgoGBgX5/gYF+fX18fX19fX19fXx+jYF8fXl7e3p5fHd4eHR1dXhyd3d0doaEhYWDg4ODg4OCgYKDgoGDgn+BgH9/fn+AfX19fX+AgIB/f4B/fIB/f4GAgYCAf3yAf35+fn9/fX5+gIGCgn5/fn1+fn5+f3+Af32AgYB+fn5/gX5+gIKBf4GDgoOEh4SAgH58fXx8e3x1eXl4eHh5d3t8e3p7foV9fn1/ent+fn59foGAgIGAfX6BgH59fXx9fX19fX18e32Dgnx8ent7e3p7d3Z4dXJzdnF3eXJ4hYWFhYOEhIKCg4KBgYKBgIOBgIB/fn5+foB+fX58foCAgH+AgX97gH6AgH+BgYB/fYB/fn5/f319fX6AgYGBfn9+fn59fX1/fn9+fH6Af35+fn+Cfn6AgIF/gYOCg4OGhICBfnx9fHx7fHh3e3h1eXd3eXx6e3t9kod9fH13en1+fn19f35+gH98foB/fn19fH19fX19fXt8ent9enp4e3x6ent4dHh1cXJ0cHh4cXmEhYWFg4SDgoODgoGBgoKAgYGAgIB9fn5/gH18fn1/gIGAf3+CgHyAf4B+f4GAf399gH9+f39+fX18gICAgIB+f35+fn18fn9+f358fYB/fn1+gIJ/foCAf36Bg4KCg4WFgoJ+fnx7e3x8eXd7eXd4d3d4e3t6e3yFin17end6fH19fHx9fX1/fnx9fn59fXx8fX5+fX18fHt6enx7e3p5enp7enhzd3VxcXNweHdxe4WGhYWDhYKBg4OBgYGBgoCBgICBgH5/fn9/fXx+fYCAgoGAf4GBfX6Af35/gX+Af3+BgH+Af35+fH1/gICAgH9/f35/fXx+f39/f319f39+fn6CgYF/gIB/foGDgoKEg4SCgn5+fHx6fHt7eXt6d3N2d3h5e3p7eXp/fnt7d3p8fXx8fH59fH19fH19fXx8fX19fX99fXx9e3l7fHx8enp6enp6eHN2dXBwcm93dnJ7hYeEhYOEgoGDgoKCgYGCgYKBgYGAf4B/f399fX9+f4CBgYF/goF9foF+fn+Bf4B/gIKAgIB+fX58f3+BgICAf4B/f4B+fX5+f4B/f39/gH9/f4J/gH9/gIB/gYGAgISBgoKAf39+f3x9fn56fYR+dHx9enp6enx5eXp6hoV3eXx8fHx8fXx8fHx8fX19fHx9fX19fn19fX16eX18fH16enp6enp5c3V1b29xb3d0c3yFhoOEgoOCgYKBgoKCgYKBgoGBgYCAgICAgH59gH+Af4GCgn+CgX+AgX5/gYB/gICAgn+Bf319f35/f4KAgICAgIB/gIB+fn1/gH9/gIB/f39/gH+AgICAgH+AgYCBgYGCgYCAf39/fn1/fnuBkox6fH18e315e3p6eHmBgXh5e3x8fXx8fHx8fHx9fX18fH18fn1+fn59fHp8fHt8fXt5enp6eXlzdXVvb3Fwd3N0fYWGg4OCg4KAgYCCgoKAgYGCgYKBgYCAgIGAfn6Af4GAgYKCgIKCgICCfoCBgX9/gX+BgIF/fH6Af3+AgoCAgICAf3+AgH9+fX6Afn2AgIB/f3+AgICAgYCAf4CAgYCBgYKCgICAf39/fX5+fIGGiXx8fnt7fnl6e3p7jX53d3l7fHt9fHx8fHt9fH19fX18fXx+fn5/f358enx9e319e3l6e3p5eXN0dW5zcXB4cnV6hYaDg4KDgoCAgIGCgX+CgYKBgoGBgYKAgYF/fn9/gYGCgYKBg4OAgYJ/gYGBf4CAgIB/gX99f4F/gICBgICAf4B+gICAf359f4B+fn+Af39/gH9/gICBf4CBgH+BgIGCgoKAgICAgIB9foB9gIOCe35+e3x9e3p8fHuHeXh4eXx8fH17fHx9fX18fH19fn19fX5+f3+Af317fH18fHx7enl7e3l5c3J1bnZycHhxdXaFhYOEg4KCgICAgoF/gIKCgoKDgYGDgoCCgYB/gICCgoKBg4GEhICBgX6BgoF/gICAgH+Cf36AgYCCgICAgIB/gH+AgIB/fn2Af39/f4GAgH+AgH+AgYF/gICAgIGAgYGBgoGAgYCAgH9/gH5/fX59fn57fXx9e3x8d3h1eHh5e3x8fXx8fHx8fX5/f39/fn19fn9/gIGAf3x9fHx9e3p7eXp8eHpzcnVud3FxenF2d4WFg4ODg4KBgYODgH+CgYWDg4SBgYOAgoOBgYCAgYKDgoCCgoWDf4GAfoKDgICBgICAf4CAf4GBgIKAf4CBgH9+gICAgICAf4CAgH+AgICAgIB/f4CBgYCAgICAgYGAgoKCgoCCgYGCgYB/f4B/gId+fnx6fXx7fX54d3Z5eXl8fXx8fXt8fH19fn5/gIGAfn1+gICAgoGAfH59fX58d3t6ent5eXNxdW53cHV6cXZ5hYWCg4KDg4KDhISAgIKBhoODg4GChICEg4KCgICCgoSBgYKChIJ/gIB/gYOCgYCBgYCAgIGBgYGAg4F+gIOCf31/goGAgIB+gYCBf4CAgYGBgYCAgIKBgYKBgYCBgYGBgoOCgoOBg4OCgYCBgH+AhH19fXx/fXp9gHp5dnp4eXt7fH19e3x9fX19fn+AgYGAgH+AgICDg4B9f35+fn15eXt6enp5c3J1b3dxd3lzd3uFgoKDgoOEgoOEg4CAgoOGg4ODgoKEgYSDgYKAgIKBg4GCgoGCgX6BgICCgYKBgYOBgICAgYCBgoGEgH6Bg4F/f4CDgoCBfoCCg4KAgYGBg4KDgoGBg4KChIGAgYOBgYKEg4OEhIODhIODgYGBgYCCf4B/fYB8enx/e3t3fHl5eXt6fX59fHx8fH1+fn+BgYCAgIGBgYSEgH2Af39/f357e3t6e3p0cHhyeXR2eHR3e4SCg4KDg4SChIODgYKChIaEgoODg4SBhISAg4CBg4KCgoKCgIKAfoGAgIKBgoGCgoKBgIGBgYOCgoOAfoGDgX9/gYSEgYN/goKBg4KCgoGEg4OEgYKEgoOCgoGCgoOBg4SDhISEhISFg4SCgYOCgoOBgYGAgH58fIB8fHh8eXp5enx9f3x7fHx9fX18fICAgICAgYGBgYKBfoGAgICAf3t7e3p6enVweHd5dnV8dXZ8gICDgoODg4OEhISAgoKFhISDg4KDhIGEhYKCgYKDg4GCgoKAgYB9gICBgYKDgoKCgoGAgYKCg4KCg4B/gYOBgICChIODgoGCgoGDgoKDg4ODg4SAgoSDg4OBgX+Bg4KDhYKEhISEhISDhISChIOEhIKBgoGBgHt+gX59eXx6enp9fHyBfXp8fH19fHp7fn5+gIB/gYGAgICAgIGBgIB/fX18fH18dnJ2eHh2dH92dH2Hh4OChIWDg4SFhICChIWEhIOCg4SEgISFg4KCgoODgoOCgoCCgH2AgIGCg4KCgoKEgoGCgoOEgoKBgICBgoGAgYOFhIOCg4CCgoOCg4ODg4OEg4CCg4KEg4KCfoOBgoSEgoODhISEhIOEhIOEg4WEg4ODgoKAe4CBf3x8fXp6e31/fX9/fHx6fH59fH19fn5/f39/gICAgH9+foCBgICAfnx9fX5/fn18e3h2f3V2f4SHg4KDhYODhIaEgYKFhoWEhIODhISChIWFgoKDg4SCg4KDgoKBfoCAgoKDgoODg4SCgYKCg4OCg4GBgYGDgn+ChISDg4KEf4KEg4ODgoSDg4SCgIOEg4SDg4KCg4KChIOCg4SEhISEhIWEg4OEhYSFhIOBgoB9gYKAfXx8e3x8gH19foB+fn1/fnx8fH19fn5/fn+BgYGBgH99fX6BgYB+fn19fX59fX5+f3+AfHyAgYKCg4OGg4SDhoSBgoiHhYSDg4SEhYGFhYWDg4SDhIODgoOCg4F+gYGDg4SCg4OEhIOCg4KEg4ODgoKDgYOCf4KEg4ODgoOAgoWDg4ODhIODhIOBgoSEhYOCgoODg4GEg4GDg4SDhISEhYSEhIWFhYWEg4ODf32BhH99fXx8fHx/gX59fn9/fX99e3x9fX19fX5+f4CBgIGBgH59fH6Cf39+fn5+fX1/f39/gICAf4CEhIODhIWDhIOFf36CiouFhISDgoOFgYaGhoOEhISEhIODg4OEgn+BgYODhYSFhIWEg4KEhISFhIODgoSDhYKBhISFhYaEgoCDh4SDg4OFhIWFhIGEg4OHgoOCg4GCgYSDgoODhYODhYWEhYWHh4aHhYWEhYSBf4GDf35+fH59fX+BgH9+fHx+f358enx9fX19fX5+fn9/gIGBf319fIB/gH5+fn5+f3+AgYGBgYKAgYWFhIOFhIKEg4aAgoWFi4mEhIOEhYWDh4aGhISEhIWEhISEg4SDgYKDg4OEhIaEhYSDg4SEg3yDhHuBhHd5g4F9hH5+cnWDgoF2foOEgX2BdYF5g39/gH6EhIKDg4KBg4SDg4SFg4SFhoSFhn2EeXx+f4N7hYOAhIOAf35+fn19gYOBfXt/fX6Afn18fHx9fX19fH19f4B/gYJ/fX18f4GBgICAgH+BgYGCgYKDg4KChoSEhIaEgYOEhYOEhYOKiIWFhYOFhYSGhoaDhISFhYWEhYWEhIWCgoOEhYWFhoSFhIOEhYWCaICFanx7cXF8gXOGc3R0fYKDdXNxg4Z0cHVyc3SDdnt9dYF/goOBgnZ5hYCDgIR/hYSChYWCaHpyc3N8f3OCg3+Dg32BfX5+fX6Cg4F8f4F9f4B9fXx8fHx9fHx8fn1+gH+BgX99fX2AgYKBgYGBgIGBgYKBgoKCgoSHhIWEhYSBgoSGhoOFg4aIhoaFg4aGh4eGh4OFhYaFg4KFhoSFhYODg4SEhoaGhIaEg4SFhn1xe4FweXZ+g3+CbnlwdXN8dnl5hXKEg3B2eHF2dHR1cnN0dml/gG5yb3R2bnVsd217c26AiHltfXJzdnN2bW14bHB5bHV9f399foGAgX2Af32Af4B/fX18fHx9fH1+f32Af4CAfnx/foCBgoCBgICAgYCAgIKDgoOEhYiGhoCChYODhIeGg4WFhYaHh4SDhoeIiYaHhIWGiIeEg4WGhYWEhIOFhIKFhoaFhoWEhoWHdnB0e3BydX+HhYNtdW92b3x1coR5eYd4cXR3bndod3pucHaCcoN+b3p5eW1vbnpvb213fXiGcHF6cHJ0ZoF1fm57eXNveX+Af319gX9/fH99fIF+gIB+foCAgYB+fn9/foF/gH9+fYB9f4CBgIB+fn+BgH9+goOCgoSFh4eEfoeEg4OFh4aEhoWFhoaIhISGh4eIhoeEhoaLioWEhoeHhYOFhYWEgoWFhYWGhoWGhYZxdXByc29zenl+hHSIdHV+iHZugnKEhnluanJ/cW1zd3x/dXR8hH54cXV3bnl1enF2eHV6eYRxam95eHBreXN6b3p3dnZwgYB/fn5/f356fn19f31/f359gIGDg4CCg4GBhIKBgIGBgH1/f4F+f35+f4GAfn6BgoCAgYSHhoODhoSEhYaHhoWFhYWGhoiFhYaFh4eFhoSGhomIhYSJioiFhIaGhYWDhYWEhYaGhoaFg3iLeXKIentwcIWEeIV4eWtzfnl7a3KDh4N6fG17eXl0fYB2bm+AgG90fHV3cXl9fW1+dW+DhYZ6gHJye3x1cG96bHN8bneCgIF+fn99fXt9e3x9fX9/fn1/f4KCf4GDgYGDgYB/gICAfn9+f31/fn1/gH58fYGAfn6Ag4iFhoOFhYWFhoeFhYWFhYeHiIaEhoWHhoaFhIWFhIWFhomJh4aEhoWGhoWGhoSGhoeGhoWGh4eHhoaEhoWGh4iHhYeGhoOHhoWFg4SFhoWGhIaEg4SEhoSEgYODhISFhIWEhYSGg4aHhYaEhIWHhoSEhYaEhX13hYOEhIKCgX1/fnt8e357fHx9f359fH59gIB9f4F/f4GAfn5+gH5+f35+fX99fX5/fHt8f358fH+BiYaFhIaGhoWHhoWFhYWGhoeIhoSGhYaGhYWDhIWGhYSGhoaGhYWGhIWGhoaGhYaGh4eGhYeIiIiIhoSHhYaGiIaFiIeIhYeGhoiFhYaHhYaGhYOChYWGhYWDhYSEhIWEhYWEhYWEhoeGhoWEhoeGhISFhoOFhIKEg4OFg4OCfYB/e3t8fXt8fH1/fnx8fn1/f31+gH5+gH99fXyAfX5+fn5+f3x8fX57fHx/fHt7fn+Ih4SEiIaGhoeGhYWEhoaGhoiHhIWGh4aFhIODhIaFhIeFhYaFhYaEhYaGh4eFh4aJiIaGiIeIiYiFhIiFhoeGh4aIhoeFh4eGh4WFhoeFh4aFgoOFhoaEhIOEhIOEhoSFhYWGhoSGhoWGhYSGhoWEg4WFgoWHhYOCgoWDhIF+gIB8e31+e3x7fX59fHx+fX5+fH9+fX1+fn19fH98fn58fYGAfXx8fXx8fH56e3t9foiHgoWIh4eGhoaGhISGhoeGiIaEhYSGhoSFh4OEhYSFh4SFhoaFhoSGhoeHhoaHh4mIhoaIh4iKiIWHiIWHh4WHhoeGh4WIiIeHhYaGh4WGhoWBhISFhoWFhISEg4SFhYaGhoWGhIaFhoeFhYaGhYSDhIOChIeDhIGChISDgYCAgHt7fn18fHx9fXx8fH19fH18fn18fX18fHx9fXx+fXt8gX99fH18fnx8fHp6fHx9iIeChoiHhoeGhoaDhYaFhoaGhYOFhIaFhIiJg4GEg4SGhIaGhoaGhIeHiIiHh4eIioiGh4iHiImIhYiHhYeGhoeHh4WHhoiIh4eFh4eHhYaHhIKEg4SGhYeFhYSDhISFhoaGhoaGh4WFh4WGhoaFhIOEg4ODh4GDgIKDg4KCgn+Ae31+fXt8fH59fH19fH17fHx8fHx8fXt7e318e358e3x/fX18fX1/fXx6ent7fHyIh4KGhoaGh4aGhYOFhoWFhYWEg4WChoSDiId/enqChYaEhoaFh4aEh4eJiIiHhoiKh4aHh4eIiYeFiIeGiIeGhoeHhYeGiIiHhoWHhoeGhoeDg4SEg4aGh4WFhISEhYaGhoaGhYaHhoaHhoaEhoWDg4OCgoOGgYN+goKDgIODf398f35+fHx9f318fX18fXp7e3p7fHx8e3t7fnt7fXt7e358fHx8fX5/fXt6fHp8fYmHg4aFhoWGhoWEhIWFhYWFhIOBhYGGhIKEhHyAhn+ChYWGhYWGhYSHh4iIiIaFiYqHhYeGh4eIh4WIhYaHiIaGh4eGh4aIiIeFhoeGh4WFh4OEhoWEhoaHhoWFg4WFhoaGhoeFh4aHhoeHhYSGhYOBg4KAg4WCg36BgYF/g4F/fn5/fn98fH1/fXt9fXx9enp7eXt8fXt7e3t+fHx8fHp7fXx8fHx+fYF8e3t7e3x7iYeEhoSGhIaGhYSFhoWEhIOEgoCDgYWDgYJ/eoSMe4CEhYeGhoaFhIeIh4aHhYWHiYeEh4WHh4iGhYeEhoeJhoaIh4eHhoeIhoSGhoaHhoWHg4SFhIaGhoeFhYSDhYWHhYeGh4WGhoaFhoaEg4WFgoGCgYCDg4OCfYGBgH6DgX5/f4F8f3x9fX59e359fH15enp5e319enp7e318fXx8ent9fHx9fH5+gHx7e3x+fXyIh4WGhYaEhoWFhYWFhYODgYOBgIKBhYKAgH9/fXx7gYSFhoaEhYSDh4eGhoaFhIaJhoKGhIaGhoWFh4WHiImGhYiHiYeGhoeFhIaFhYaFhIeDhIWEiIaGh4WFhIKGhYaFh4aHhIaGhoaFhoODg4WAgIGAgISAg4B8gYB+foKAfYB/gXx/fH1+fX57fn18fHl6enl6fX15enp7fHt8e3t6e319fH18fn5+fHt7fX59fIiGhYaGhoSFhYSFhYSDgoKAgoGAgICDgX5+foB5en2Ag4OEh4WEg4OHhoOEhYSChYiFgoSDg4WFhYWHh4aIiIaFiIeJh4aFhoWDhoSFh4OEhoSEhYSHhoWGhYaEg4aFhoaGhoaEhYaGhYWGgoKDhH9+gICAgX+DgHuBf31+gn5+gH6Afn99fX59f3t/fXt6eXp6eXp8fXl6ent7enx6e3t7fH19fXx/fn18fH1/fnx7iIWFhoaGhoSFhIWDhYKBgICAgYB+f4KCfX1/f3t/f4KDg4WGhYSDgoaDgYOEgoCFh4WCg4GBg4SEhIaGh4iHhYWIhomHhYOEhIKFg4SGgoOFhISGhIeGhYWFhoOEhYSFhoWGhIOFhIWDhYWBgYODf35/gH9/f4N/fIB9fX+CfYCBfn6Bfn19fX1/e398e3p5enp5enp8eXp6e3t7fXp7e3t7fX59fYB9fXx8fYB/fXyGg4aGhoaGg4SChYKFgYGAf3+AgH5/gIJ8fn9/foCAgoKChIWDgoGChIGAg4KBgISFhYKBf4CCg4OEhYaIhoaFhYeFh4WFgoOCgoOCgoWBg4WEhYaEhoaHhoaFgoSEg4SGhYWDhISDhIOFhICAgoJ/fX1/fn6Ag357f3x8gIF9gYB9fYN8fn59fX57fnt7enl7enl6ent5enp6e3t8ent8e3t+fn1/gXx9fHx9f4B+gIaEhYWEh4SDg4KGgoOAgYB+fn+AfX9/gnx9f39+fn6BgYKEg4KBgYKCf4CBgoCAgoWEgoB/gIGCgYOFhYeFhISGhoSFg4WBgoGBgoGCg4GChISEhYWGh4eGhYSDg4ODhIaFhIGDgoOChIODgH+AgX59fH5+fH+DfXx+fHyBgH6Cf31/gnx/fn19fXx8e3t6enp6eXt6enp6enp6e3x5e317fH9/f4GAfX59fX1/gICAhoSEhYSFgoOCgoSCgoCBgH59fn9+fn6AfX2Af35+foGBgoODgoSHgYF+gICBf3+ChIOBf35/gIJ/goWEhoSCg4WFgoSBg4CBgIGBgYKBgIGEg4OGhYWHh4WEhYWCgoKDhYSCgYGBgoCFg4F/foB/fnx8fn18foN9e358fYF/gIN9fYCBf35/fXx8fH17e3p6enl5e3l6enl6ent7e3p7fXx8f3+BgoB+gH+AgH+AgYDKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzNzc3Nzc3Nzc3NzczMzMvLy8vLy8vLy8vLy8vLzMvLy8vLy8vLy8vLy8vMzMzMzM3Nzc7Oz8/Pz9DQ0NHR0dLS0tLS0tLT09PT0tLS0tLS0tPT09TU1NTU09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tLS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1dXV1NTU1NTT09PT09PT09PT09TU09PU1NTU1NTU1NTU09PT09PS0tLS0tPT09TU1NTU1NPT09LS0tLS0tLR0dHR0dPHhnNlYFtLWWdVTUZIQD03Nzg5Nzw8PDo8Oz42Oj04PDs6OTg3ODs7Oj87PTs8PD47P0E/QkJBQ0RFREE+PTw7QENDQUBDQ0FBR0hHSUtSwtXS09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXVysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMy8vLy8vLy8vLy8vLzMzMy8vLy8vLy8vLy8vLzMzMzc3Nzc3Oz8/P0NDQ0NHR0tLS0tLS09PT09PT09PT09PS09PT09TU1NTU1NTU09PT09PT09PT09PT09PT1NTU1NTU1NTT09PT09LS0tLS0tLT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1NTU1NPT09PT09PT09PU1NPT09TU1NTU1NTU1NPT09PS0tLS0tPT09PU1NTU1NTU09PT09PS0tLS0tLR0dHSzIxyZ2BcTVllUktHSz87Mzc4Ozg5Pj05PDpBOjs9Nzs8PDo6Nzg6Oz0/Oz88PTw/Pj9BPUFBPkNDREJAQT46Oz9DREFDRERCQklHSEhJTr7V0tPT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1crKy8vKysrKysrKy8vLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzMzMzMzMy8vLy8vMzMzMzMzMzMzLy8zMzMzLy8vLzMzMzc3Nzc3Ozs/P0NDQ0NDR0dLS0tLS09PT09PT09PU09PT09PT09TU1NXV1dTU1NTT09PU1NPT09PT09PT1NTU1NTU1NTU1NPT09PS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1tbV1dXV1dTU1NTT09PT09PT09PU1NTU09TU1NTU1NTU1NTT09PT0tLS0tLT09PU1NTU1NTU1NTU09PT09PT0tLS0tHR0s+Sd2hfXk9XZ01LRkw9ODc2NTk5OTw+OT88RDo7PDc5PD07OTc5Ojw9QDs+PT47PD48PT5BQD5EQ0NDP0E9Ojs9QkNFQ0NEQT9FSEpJSky61dPT09TU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8rKysvLy8vLy8vLy8zLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMzMzMzMzMzMzMzMzMzczMzMzMzMzMzMzMzMzMzc3Nzc3Ozs/Pz9DQ0NDQ0dHS0tPT09PT09PT09TU1NTT1NTU1NTU1NTV1dXU1NTU1NPU1NTU09PT09TU1NTU1dTU1NTV1dTU09PT09LS0tLS0tLS09PT09TU1dXV1dbW1dXV1dXV1tbW1tXV1dXV1NTU1NTT09PT09PT1NTU1NTU1NTU1NTU1NTU09PT09LS0tLT09PU1NTU1dXV1dTU1NTT09PT09PT0tLS0dHRmn5nYWJOVWpKSElLPzw6OTM3Njc3PTs+OT06Ojs4ODo7Ozg4Ojs7PD46PT09Ojw/PD0/QkA/Q0RDRD5APT08QENEQ0JEQkQ+REhJSUtMttfT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3MzMzMzMzMzMzMzMzNzc3NzczMzMzMzMzMzMzMzc3Nzc3Ozs7Pz8/Q0NDQ0NHS0tLT09PT09PT1NTU1NTU1NTU1NTU1NTV1dXV1NTU1NPT1NTU1NTU1NTU1NTU1dXV1NXV1dXV1NTU09PT09PS0tLT09PT09PU1NXV1dbW1tXV1dbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1NTU1NTU1NXU1NTU1NTT09PT09PT09PU1NTU1dXV1dXV1dTU1NTU09PT09PS0tLR0p+DaV9kU1hsSEhIS0A9Nzg0NzY6Oj87RDw8OTw8OTg6OTo6Ojs8Ojo7OT49Pjk9QDs/QUFCP0JCQUM9Pz8+PEBCRUNDQkBBO0ZJR01MSbLY09TU1NTU1NXV1dXV1dXV1dXW1tbW1tbV1dXW1svLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzM3Nzc3Nzc3Nzc3Ozc3NzczMzMzMzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc3Mzc3Nzs7Ozs7Pz8/P0NDQ0NHS0tLS09PT09PT09TU1NTU1NTU1NTU1NTV1NXV1dTU1NTU1NTU1NTU1NTV1dTU1dXV1dXV1dXV1dTU1NTU1NPT09PT09PT09PU1NXV1dbW1tbW1tbW1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTV1NTU1NXV1dXU1NTU1NTT09PT09PT1NTU1dXV1dXV1dXU1NTU1NTT09PT09LS0tSjiGxfZlJWakdIR0lBPjM2Njo7PDhDPEJBPjxBPDg5Ojw6Ojw8PDk8PTo7PD09PD89QD9AQT9AQUBCPD4+PzxCQ0NDRkBBQT1ISklOTUeu2NPU1NTV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbMzMvLy8vLy8vLy8vLy8vLy8vMzMzNzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzs7Ozs7Oz8/P0NDQ0NHR0dLS0tPT09PT09TU1NTU1NTU1NTU1NTU1NTV1dXV1dTU1NTU1NTU1NTU1dXV1dTV1dXV1dXV1dXU1NTU1NTT0tPU1NTU1NTU1NTV1dbW1tbW1tbW1tbW1tbX19bW1tXV1dXV1dXV1dXV1dTU1NTU1dXV1dXV1dXU1NTU1NTU09PT09PT1NTU1NXV1dXV1dXV1dXV1NTU1NPT09PT0tLWroprY2VSWGhMSkdJQjg0OTQ6Ozo5QDk/Q0VAPDw5OTk9Oj07PDw6PTw7OTw9Ozs/PUA9PT5AQD9CQT5APD05QERDQkFBQj48SEpLTU5IqNnU1NXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbWzMzR09PT09PT09PT09PT087Ky8vLzMzMzMzMzMzMzM3Nzc3Nzc7Ozs3Nzc3Nzc/Pz8/Pz8/Pz8/Pz9DQ0dHR0dHR0dHR0dHS0tHV2djY2NnZ2dra2tvb29vZ2dnZ2dna2tra2tra2tjW19fX19fX19jX19fX2Nzd3d3d3d3d3d3d3d3e29fY19jX19fY19bX19fW09LT09PT09TU1NTU1NbW1dXV1dXV1dXV1dXW1tbX1tbW1tbV1dXV1dXV1dXV1dTU1dXV1dXV1dXU1NTU1NTU1NTU09PU1NTU1NXV1dXW1dXV1dXV1dTU1NTT09PT09PS1bqKa2hoUlhlSUlMT0A5OTo0O0E8Nz05QUM+QD89ODo6Ozk9Oz4/Ojs8PDo7PDo7Pj1APT8/P0FAQUE/QTw8Oz5BRENBREA9PElJSk1ORqPa09TV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbW1szNhG1wcHBwcHBwcHBwcGqn493d3t7e3t7e3t7e3t3S0NDQ0NDQ0NDQ0NDQ0ci5ubm5ubm5ubm5ubq6t6WkpKSkpKSkpKSkpKSnhmBjY2NjY2NjY2NkZGRlhIuKioqKioqKioqKioemuri4uLi4uLi4uLi4ubN4c3Nzc3Nzc3Nzc3NzcJK7uLi4uLi4uLi4uLi3vdLS0tLS0tLT09PS09PT3OLh4uLi4uLi4uLj4+Pi2NfX1tbW1tbW1tbV1dXV1dXV1dXV1dbW1dXV1dXV1dTU1NTU1NTU1NTV1dXV1dXW1dXV1dXV1dXV1NTU1NTT09PT09XDkXFrak5TYkxMVk48Ojo3Nz5DPjg+Oj8/QTw/QDc7Ojs7PTs+Pjo7PD48Oz07PT8+QDw/Pz1AQEBBPj88PjxAQUVCQkZAQD9HSEpLT0ae2tXV1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19fMzk4mKysrKysrKysrKysiivTr6+rq6urq6urq6uvp1dLS0tLS0tLS0tLS0tTEqaqqqqqqqqqqqqqqq6aGhIWFhYWFhYWFhYWFik4MEhISEhISEhISEhIRE0pUU1NTU1NTU1NTU1NPg6ejo6Ojo6Ojo6Ojo6WZMikrKysrKysrKysrKiVhqaSko6Ojo6Ojo6OjoavS0tLS0tLS0tLS0tLS0d/q6uvr6+vr6+vr6+vr6dnX19fX1tbW1tbW1tbW1dXV1dXV1dbW1tbV1dXV1dXV1dXV1dTU1NTV1dXV1dXW1tXV1dXV1dXV1dXU1NTU1NTU1NPUy5h2bGlKTl9NUlVNPjw8NztAQz42Ojc+Pjs9Qj85PDk9Ozw6PD07PTs9Ozs9PD0+PT07QT08QUBBQT08Pzw7QEJDQURFPUFAQ0ZLS09GmNzV1dXV1dbW1tbW1tbW1tbW1tfX19fX19fX19fXzc5SKzExMTExMTExMTExJ43z6enp6enp6enq6unq6dXS0tLS0tLS0tLS0tLUxaqrq6urq6urq6urq6yoiIeHh4eHh4eHh4eHh41SEhgYGBgYGBgYGBgYFxpOWVdXV1dXV1dXV1dXU4WopKSkpKSkpKSkpKSmmzgvMDAwMDAwMDAwMDArZaqlpaWkpKSkpKSkpKOs0tLS0tLS0tLS0tLS0tHe6urq6urq6urq6urq6unZ19jX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dXV1dXV1dXU1NTU1NTU1NGcenFpSlRdT1JVTkQ+Pzs+QEA4Ojs4PDs7PD86Ozs4Ozk5Ozw7Ojw5Ozs8Ozo9PT0+PUE/Pj8/Pj08PT88PEFBQ0FERTw+QEVGSktNRpPc1dXV1tbW1tbW1tbW1tbW1tfX19fX19fX19fX183PXDk9PT09PT09PT09PTWT8Ofn5+fn5+fn5+fn5+bV0dLS0tLS0tLS0tLS08Wtrq6urq6urq6urq6vq46NjY2NjY2NjY2NjY2SXSInJycnJycoKCgoKCcpWmNiYWJhYmJiYmJiYl6MrKmpqampqampqampq6BFPT4+Pj4+Pj4+Pj4+OW6vqampqampqampqamosNLS0tPS0tLS0tLS0tLR3unp6enp6enp6enp6enn2djY2NjY19fX19fX19fX19fX19bW1tfX19fW1tbW1tbV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbV1dXV1dXU1NTU1NTWo3txZElbYE5OVU9AQT89REI/Oz06OTs6PT07PDs6OTg5OTs8Ozw8Ojo7PDo7QD08PTxAQTxBQTs7PEA/PD1CP0RDQ0U8PkJERkpMTEWN3NXV1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjNzcXCw8PDw8PDw8PDw8PCydDPz8/Pz8/Pz9DQ0NDQz87Ozs7Ozs7Ozs/Oz8/NzMzMzMzMzMzMzMzMzMvJycrKysrKysrKysrKysfCw8PExMTExcXFxsbGxsvMy8zLzMzNzMzMzMzLz9HR0tLS0tLS0tLS0tLRysrKysrKysrJycnJycnM0tHR0tLS0tLS0tLS0tLU1NTV1dXV1dXW1dbW1tjZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NfX19fX19fX1tfX19fX19bW1tbW1tbW1tXV1dXV1dXV1dbV1dbW1tbW1tbW1tXV1dXV1dTU1NTU169/cF5GXmJQUVdOR0ZDQ0lBPz07PDo8OEBCPD04Ojo4OTg7Pzs8PDs7PDw8PD87PD46Pj44PkI8Pj1BPjw+QkBERUNAPD5APkNJSUtEh9zV1tbW1tbW1tbW1tbX19fX19fX19jY2NjY2NjYzs3P0NDPz8/Pz8/P0NTQ0M7MzczP09LSzs3P0s7Ozs7Ozs7Ozs/Rzs/T08/O0NTSz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0NDR0dHR0dHS09PU1NTU1dXV1tbW1tfW1tbX1tfX19fX19fX19bW1tbW1tbW1tbW1tbW1tjX19fX19fY19bX19fX1tbW1tbW1tbW1tbW19fW1dbW1tbX19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjX19fX19jY19fX1tbW1tbW1tbW1tbW1tbW1dbW1dbW1tbW1tbW1tbW1tXV1dXV1NTV1di4gm9XSl9jUlFaS0hBQTxCPT07Oj4+PD4/PT0/Nzk6OTk3OD48PD47Ozw7PDs/PT0+OTs7OT0+P0A+QD07OkI/QkNCPz0+QD5CRUdKQoDc1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2M7Ozs7Ozs7Nzc3Nzsqfys3Nzc3QuYOEi8fTwJrLz87Ozs7OztHBp9LPoZbL0caTq9LOzs7Ozs7Ozs7Ozs7Oz8/Pz8/P0NDQ0NDQ0NDR0dHR0tLT09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbV1dXV1dbW1tbV1dXV1dXV1NTU1NXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NfX19fX1tbW1tbW1tbW1tbW1tXV1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXYwIBuVU9gY1dZW0xMQ0A9PTs9Ojw+Qj5CQ0A8Ojg5ODo6Ojc7Pz4/PDw7PDo5Pzw8PTg5PD9BPj09PUFAPTtBQkBCQz47QD9BQUlHSkF629bW1tbW1tbX19fX19fX19jY2NjY2NnZ2djY2dnOzs7Ozs7Ozs7OzdKpj63Rzs7Ozpu3tqSiwJOerNPOzs7Oz8/RnY/FqqCrn86ZrZmz0s7Ozs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0dHS0tLT09TU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dbW1tbW1tXV1dXV1dXU1dXV1dXV1dXW1tbW1tbW1tbW1tfX19fX19jX19fY2NjY2NjY2djY2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2dnY2NjZ2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV18h/b1pTYWVeXVxPSkQ9QD8+Ozc6Pjk/RD5BOTg3ODk7Ozw4OT89PTw9PD47OkE7OTs5OzxDQDw7PT5AQT49QkQ/QkM9PT8+Pz5ISUg/ddrW1tbX19fX19fX19fX2NjY2NjZ2dnZ2dnZ2dnZzs7Ozs7Ozs7Ozs/Inrym0tDQzsqgl36Cw6abr6fUz8/Pz8/Tuq+rsZ+Vj6G0lYednc7Pzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dLS0tPT09TU1dXV1dXV1dXV1dXV1dbV1dXV1dXV1tbW1tbW1tbV1dXV1dXW1tbV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2djY2NjY2NnZ2dnZ2dnY2NjY2NfX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dbV1dXV1dfNiHNdWGloXl9gT0lGOkFAPj88PDo2P0JAQzo2NDc6Ozo8Ojk+PD49PTs/PTxBPjw8Ojw8PTw6PEA9QEI+PkFCPUNDPT0+Oz9BRUtIQHDZ1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2c/Pz8/Pz87Ozs7SrKWnqdXAvNLHnY+ey9PJipmq1M/Pz8/P05+xnqedn6eZtL/JlpnG0M/Pz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0dHS0tLS09PT1NTU1dXV1dXV1dbW1tbW1dbW1tbW1tbV1tbW1tbW1tbW1dXV1dXV1dXW1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnY2NjY19fX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0JB1W1tqaWFeXVNOSTxDQEE+QD46OEZBP0M6NzQ5Ojo5Ozs4Oz0/Pj49QT08P0A9Pjw8PDw8Oj1AQD8/PT5CQD9AQkA8QD0+QUVLRz9r19fX19fX19fX2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnPz8/Pz8/Pz8/QzJ2Nl6zQmpfKxZ6ynpbN1q2ZqtTPz8/P0cCciZu1pKCLn8PSkZigztDQ0M/Pz8/Pz8/Pz8/Pz8/P0NDQ0dHS0tLT09PT1NTU1NXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX19fX19fY19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tKUcl5ea2tqZV1PTEc/RENDQDo9OzxCPD49OTY0Ojk5Ojo5Nzs/QDs8PUA8PEE+PD07PTw/PDo8QkA+PTs9QD5CPkBBPkA9QD9GSUQ/ZtXX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2traz8/Pz8/Pz8/P07GigJuvyaCjv8qcpYynrdiqmarUz8/Pz9SjooGbxZnFyZTYrKO/ndXQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1NXV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dbW1tXW1tbW1tbV1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbSk3BgXnBoZmVaUUhHQkVDQEA3Ojo8Pjo8OTc2NTk6Njo8Ozc8QEA8Ojo9Oj0/Pj08OUA8PDs6OT9APTw9PUBBQz9APz5BOz9ARkpCP2LS2NfX2NjY2NjY2NjY2dnZ2dnZ2tra29vb29vb28/Pz8/Pz8/P0M6fkGyclteqo9PSrqa1mJ/Vqpmq1M/Q0NHEn4F7l5+ilZWhu82IlZ7I0tHR0NDQ0dHQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1dXV1dbW1tbX19bW1tbW1tbW1tbX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfW1tfX19jY2NfX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX1tbW1tbW1tbW1tbW1tbX19fX19fW1tbW1tbX0pNuYFxxZGdkWlVKQENGQ0FCODs/PD07PDw4NTU4OTY4Ozo5PDo+Pzw9PTk8Pz49Ojo+OTw7Ozg+Pzw9PTw+QEFDQT48PDpCRERKRkJd0NnX19jY2NjY2NjY2dnZ2dna2trb29vb29vb29vPz8/Pz8/Pz9G9n8O31pfA09HQ0srSzZeb1KqZq9XRz9DVq6+8wNN5m7CznaXQ26KZtdXR0dHR0dHR0dHR0NDR0dHR0dHR0tLT09PU1NTV1dXV1tbW1tfX19fX19bW1tbW1tfX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19fY2NjY2NjY2NjY2NjY2djZ2dnZ2dnZ2dnZ2dnZ2drZ2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fX19fX19fW1tfX1tbX19fX19fX19fX19bW19GRbF1cb2doYl1PRkBISUdFQDw8Pj48PT48NzU2Ojk2OTs6Ojs4QD86PDw5PD49Ozs6Pzk/Ozs5PT49PTs7PTxAQ0I/Pj47Q0ZGR0hEWc3a2NjY2NjZ2dnZ2dnZ2dna2trb29vb29vb29vb0NDQz8/Pz8/Pz5V+e6WS1KKa08ySl6ObodirmavV0pem1cmHf4WigqObop2ckaiYnrvV0dHR0dHR0dHR0dHR0dHR0tLS0tLS09PU1NTV1dXV1tbW19fX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tbX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2tnZ2dnZ2dnZ2djY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX1tfPjGRWXnBrXGBgTkVITUlJT0M+OkI9PUBCOzU0Nzw6Nzo7Ojo7OT09OTo6OT0+Pz07OT47PDo8Ozk+PD47PD0+QENCPz5BPEFDR0ZGRVXJ29jY2NnZ2dnZ2dnZ2dra2tvb29vb29zc3Nzc3NDQ0NDQ0M/Pz9DR1aeZrcmjqL7KnbGdo7XZqZup2LirocbT09WcmrKgqaCinqmiqZzQ09LS0tLS0tLS0tLR0dHS0tLT0tPT09PU1NTV1dbW1tbX19fX19fX19fX19fX19fX19fX19bW1tbW1tfX19fX19fW1tbW1tbW1tbX19fW1tbW1tbW1tbX19fX2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2djY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fX19fX19fX19fY2NfX19fX19fYzYZdV2JvZE9dVEtIRlNRS0xAPj1EPD9DRj01NTc7OTY6Ozo8PTo7Pzo6OTg6PT0/Pjs/Oz49Ojs5Pjs9PD0+QUNCQD8+PzxAQUVHRURSxdvY2dnZ2dnZ2dnZ2tra2tvb29vb3Nzc3Nzc3NzQ0NDQ0NDQ0NDQ0NO5gL3Tm5bP1LWLkZ/T1LyBu9TOlKDS0dLXqIjPsI2RpdSakY6+1tLS0tLS0tLS0tLS0tLS0tLT09PT09PU1NXV1dbW1tfX19fX19fY2NjY19fX19fX19fX19fX19fW1tbX19fX19fW1tbW1tbW1tbW19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2tnZ2tra2tra2tra29ra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2NfX2ct+WlVqaltMX01KTEpVTEZCPD0/R0ZIS0g9NjU3Ojk3OTo7Ojw9OT45OTo4Oz0+PkE+PTk8PDk9Pj46PTk5Oj9FQUA+PT8/QkBHRURFUMHc2dnZ2dnZ2dna2trb29vb29vb3Nzc3Nzc3dzc0NDQ0NDQ0NDQ0NDQ0cHR0crI0tDUxLjS0tHSwtLQ08fM0tHR0s/F1NXAvdbU07jI1dLS0tLS09PT09PT09LS0tPT09PU1NTU1NXV1dbW1tfX19fX19fX2NjY2NjX19fX2NfX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29va2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2djY2NjX19fX19fY2NjY2NjY2NjY2NjY19rHd1xSZ2laTlpOTFBRV0VKPz89P0FFTExBPjc3NTs4ODk5Ojs8Pjw+ODo6OTs+P0A9Pj46NTo6PD0/Ojs5Ojw9QkJAPz8/P0FCR0RDRE683dnZ2dnZ2dna2tvb29vb29vb3Nzc3Nzc3d3d3dDR0dDQ0NDQ0NDQ0NDS0NDR0dDQ0dPU0dHR0dPR0dHS0tHR0tLT1NLS1NXT09PW1NLS0tPT09PT09PT09PT09PT09PU1NTU1dXV1dbW1tfX19fX2NjY2NjY2NjY2NfX19jY19fX19fX19fX19fX19fX19fX1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tvb2tra2tra2trZ2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2trZ2tra29ra2trZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjbwXNYVWlrU0xSTlBSWVRGSTw+Qz9BQkVKPj43ODY5Nzc4OTk7Oz0/QDw9ODk7Ozs/Pjw8OTU6PD47Ojg6Oz8/P0JCQT5BPUBBQkZCQkJLtd7Z2dra2tra2tvb29vb29vc3Nzc3Nzd3d3d3d3R0dHR0dHR0dHR0dDQ0NDQ0NDQ0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tPT09PT09PT09PT09PT09TU1NPT1NTU1NTU1NXV1dXV1dXW1tbX19fX2NjY2NjY2NjY2NjY19fY2NjX19fX19fX19fX19fX19fX19fX19fW1tbX19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2NjY2NjY3LxvVFRsbExLUkpUUlVLRkQ6PkdEREFERjw/ODk6OTU5OTo3PD07PkA9PTc5Ojs5Pjs5OTY2Oz1AQT47PDk6Pj9DQT4/Qj0+QkNFQkFCSrDe2dra2tvb29vb29vb29vc3Nzc3Nzd3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0tLS0tLS0tLS0tLS0tLS0tPT09PT09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1tbW1tbW19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19fW1tbW1tfW19fX19jY2NjY2NjZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2dnZ2dnY2Ny2a1NbcGtLVVdSXFFXSEQ+PEJKRT1ISj89PDc4ODo1OTg5Njs+PD1APDw1OTo8Oj87OTk0ODw9PUFBPD47Ojw+QD89PkE9PUNGR0I/Qkmq39ra29vb29vb29vb3Nzc3Nzc3N3d3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHS0M/U0M7P0tLT0tLS0tLS0tLS0tPT09TU1NTU1NPU1NTU1NTU1NTU1NTU1NTV1dXV1dXV1dbW1tbW19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19jY2NfX19fX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dndsGRTYXJfT1pUV19RUkdCPUVJTEFBTEQ/Pzs6ODg5Mzg2ODY5Pj0+Pz06Njo7Pjs9PTo5Njg6PTtAQDxAPz0+P0I+PD48PEJFR0lCPkNJpODa29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3t7S0tLS0tLS0tLS0dHR0dHR0dPT0bm7zLqbnLrQyNPT0tLS09PT09PT09PU1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2NjZ2dra2tra2tra2tra2tra2tra2tra2tra29va2tra29va2tvb2tra2tra2tra2tra2trb29vb29va2tra2tra2tra2tra2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ3qpfVWBuW1VZUVpeT0xHQ0ZNSUZEREo7QUE7PDg4NjQ4Njk4Nzw/QT89Ojc8Pz48Pz87OjY4OD09QEE9QD5BQD1AOjs6Pj1BRUdJQkBDR57h29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e0tLS0tLS0tLS0tLS0tLS0tO+wMqaoKKViJGeqpOpz9TT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fY2NjY2NnZ2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dna2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2tvb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2d6iXFVeblheXU5aUFROQ0NMSUlJRkpEPEJBPDs4NzY3OTc3OTk9P0E/PDo5QD88P0I/Ojg3NzY9Pz9APUBAPz89PTs7OD48P0VJSEE/Q0aX4dvb29zc3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3tPT09PS0tLS0tLS0tLS0tTIlZyum5m1iX2TjIKBhMTV09PT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tvb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dndmlpYYW5ZYVdPV01QRUJETElNS0ZJRT5CRDk4ODY3OTc1Njk4PT1BPjo4OT49PD9APzw1Njc2PD4/PjxAQEA/Pj4/Pjs/PkFCRkdCQENIkeLb29zc3Nzc3d3d3d3d3d3d3d7e3t7e3t7f39/U09PT09PT09PT09LS0tLTz6h+kayPko6MhoCIiYSQo8rU09PT09PU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY19jY2NjY2NjY2NjY2NjX19fX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2tra29vb29ra2tra2tra2tna3JJaWWNuWlpSVV5QTDxAR05IUklIRT47SEY4OTc1Nzg3NTg5ODs+Pj07ODlBPj1AP0E+NzU5Njs+QUE/P0BAQkI/Pj8+QUBEQUZIQj9FSozi3Nzc3Nzc3d3d3d3d3d3e3t7e3t7f39/f39/f1NTU09PT09PT09PT09PWtaWaiIuQhYCFi4iBg4qLf4bC1tTU1NTU1NTV1dXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2dnZ2dna2dra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29ra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb2tra29uIWltnalxYTFpfVkg6TEhMSkpDRUZDQExINzo3Njc4ODU4Nzg5PDw7Ozk4QD89Pj8/PDY3PDQ3P0JCQUBAPz8/QT09P0A+QEBGRT09REuI4tzc3Nzd3d3d3d7e3t7e3t7e3t/f39/f39/f39TU1NTU1NPT09PT09PUxZKCg4WGfYGCfXx5foGCg36k29bU1NTU1NTV1dXV1dXV1tbV1tbW1tbW1tfX19fX19fX19fX19fX19jY2NjY2NjZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vc3Nzc3Nvb29vb29vb29vb29vb2tra2tra29vb29zb29zb29vb29vb29vb29vb29vb29va2tvb29vb29vb29vb29vb29vb2tvZgFpebWhaU0ldW1hKRE1ISlNMR0ZBQD9KQjg7NjY5OTc1ODY4Ozo7Ojw5OD09O0A9Ozo2NTw3Oz1CQEFBPD49QEE9PEA/Pz5CREU+PERLg+Lc3d3d3d3d3t7e3t7e3t7f39/f39/f39/f39/V1dTU1NTU1NPT09PT2LKEkKh9g3l2hIh/e3d5gn5+i67A1dTU1NXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dna2trZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2tra2tra2trb2tra2tvb29vb29vb29vc3Nzc3Nzc29vb29vb29vb29vb29va2trb29vb29zc3Nzc3Nvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc1nlcWmxmWFJPYFFSQUhHSkZYTEZAQENDSz87Ozc4ODc2NTc2ODo5PDw6PTs/PTs9Pjw7ODg8OT0/QkFCQzw8P0FCPj1BQkNCREVDQDtDTH3h3d3d3d3e3t7e3t7e39/f39/f39/f39/g4ODg1dXV1NXU1NTU1NPU0ruen3WKeXuIgICChYGDcnOAhYOMrNfV1NXV1dXW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NnZ2dna2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra29vb29ra2trb3Nzc3Nzc29zc3Nzc3Nzc3Nzb29vb29vb29vb29rb29vb29vb29zc3Nzc3Nzc3Nvb29zc3Nzc3Nvb29vb29vb29vb29vc3Nzc3Nzc3Nvb29vb3dByXV9wZVdLUGNPS0JHQ0pIS0ZBPEE9SFBBOjo3Nzg3Njc4Nzw6OD09PD47QD88Pz07Ojs5Ojk8QENAQ0NAPUFAPz1AQkNDQUBAP0A7RU144N3d3d7e3t/f39/f39/f39/f3+Dg4ODg4ODg4NXV1dXV1dXV1NXU18h4i4V8goh6g4SBfoKCc2l0hYuGkJ3U1tXU1dbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tvb2tvb3Nzc3Nzc3Nvc3Nzc3Nzc3Nzc29zb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb297KalxjcWVST1heSz9HTElPS0VAPkFCP0lPPjk6NzY7NzY6Ozc7Ojg6Ozw+Oz09Oz48Ojs4OTo4OUFBQkFAQDtAQj06PkFCQz8+PT4/PUZOdN/e3t7e3t7f39/f39/f4ODg4ODg4ODg4ODg4OHV1dXV1dXV1dXV1s6dhpl+f5OTin+CgXx9gnNxm4mAgoOJwNnat7TQ19bW1tbX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tra2tra2tra2tra29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NvfwGNaW21gVlBTU0pETEhNSEk8PkFEQ0ZORDw8OTc5OjY4Ozk3PDk4OTw9OzlAPjpBPzw3NTc7ODpAQUVBPz45PUI/Oz1CQkI6Pj07PT5GTnHe3t7e3t/f39/f39/g4ODg4ODg4ODg4OHh4eHh1tbW1tbW1tbV1tjLioCHhYOXjHh7e3lvfYF1a3ebdHZ7eInHxpiMrdjZ19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2drZ2dna2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tra29vb3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29zb29vb3Nzc3Nzc3Nzd3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3Nzc3Nzc4LdjV1lrYlJNVVFMSktGS0ZDQD5CQT9FTT4+PTg5OTo3OTo3NT03Nzo+PDs7Qjs5Pz05NjY4PTk6QEJGQD49PEBCREA9QD9DO0A9PD4/Rk9t3N/e3t/f3+Dg4ODg4ODg4ODg4OHh4eHh4eHh4dbW1tbW1tbW1tfVrYZ6d32rn3l4entzdH+Dfm9xe3l6c3t2k4qFgImkzdnY19fX2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tna2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29vb29vc3Nzc3N3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vc3Nzb3Nzc3Nzc3N3d3d3d3d3d3dzc3Nzc3Nzd3d3c3Nzc3Nzc3N3d3d3d3d3d3d3d3dzc3OGtYVtebGJSTVZMTUdLS0RGQkI7QT08RUxDQT44Ojk6Nzc5NjY6NTs+QDs9Oz89Oz89Ojk5Ojw5O0VDRkA/PkBDQkQ9OT0/QT1CPz1APkdPadvf3t/f3+Dg4ODg4ODh4eHh4eHh4eHh4eHi4uLW1tbW1tbW1tfQmH+Qh4N9eoN2e3Vzenl6kKqmd3JyfoeHh4CAfoKEhJHJzNnX19jY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra29va2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2djY2NnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vb3Nzc3N3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzb29vb3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3dzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3NzhpV9UYm1iUE9TSUhHRkpJSUJBPkJCPEVFREA+ODo4Ozc3Ojc4ODY+Pz07PDk9PDo+PTs6Njc7NjtEQUY+Pz8/PkNBPzs9PT47REM/PjxIT2fZ4N/f3+Dg4ODg4eHh4eHh4eHh4eLi4uLi4uLi1tbW1tbW19jYyH52doN+fnR2eIaCenl1d5yhu6GEgoCAfoeKinx/gYaMnKjO2NjY2NjY2NjY2djY2NjZ2djY2NjY2dnZ2dra2tra2trb29rb29rb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3d3d3d3c35pbT2drXFBRUElDT0pLR0xHSkJAP0FHREBBPDg8ODg1ODk3Njc3QEA/Ozw5Pj04PTw8Ojc4PTk/RENGPkE/QkBDPzw6Pj0/PkVEPz07S1Fj1+Hf4ODg4ODh4eHh4eHh4uLi4uLi4uLi4uLj49bW1tbW19XB3LRueHJze3B6eXaFiIR7eH2AgZiljH98fnuRhZaLhoGDgY6Rvd3Z2NjY2NjZ2dnZ2dnZ2dnZ2dnY2dnZ2dna2tra2trb29va2tva2tra2trb29ra2tra2tnZ2dnZ2dnZ2dnZ2dna2trZ2dnZ2dra2tra2tnZ2dnZ2dna2tra2tra2tra2tra2tra2trb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t3d3d6NWFdobllQUUtISlNJTUhNSUtBQz9DRkJBRDo6PDg2NDg4NzY2Nj8+Pjo8OTw7Oj09PDw4Ozw8RERERT4/PkI+Qj84PT8/Q0NCQEE+O0xUY9Xh3+Dg4OHh4eHh4eLi4uLi4uLi4uLi4uPj4+PW1tbW1teslLZ6eHJvd5V7dHuLgHh1bn6Fg3t/hYhyfH2bnI6JioJ+g32Hk5rH1NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2trb29vb29vb29vb2tra2tra2tra2tra2tnZ2dnZ2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2trb2tra2tra2tra2trb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d7Zf1lgaGxcUUtHR09LTk5PTURGQkg/Q0hEREA6Ozs4NzU3NzY4NThAPkA7PDk8Ozw+Ojo7OTo7OUZERUI8QD4/PEBDOz5AP0A/Qj8+OjtKVWPV4eDg4eHh4eHi4uLi4uLi4uLi4uPj4+Pj4+Pj1tbX19vKhYR3cXJubniVhHt4hH95dnB4c3eLkY6CdnN9ioaId3d1d4ODfIiIk8Pb2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2trb2tvb29vb29vb29vb29rb2tra2tra2tra2tra2tnZ2dnZ2dna2tra2tra2tra2trb2tra2tra2tra2tra2trb29vb29ra2trb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f0nVZaGlqVk5KSE1OR01EUElGSD9FPUZMREM+Ozs8OTc3OTY2OTU4Pj4/PTs8QDs9PDo3Ozc5OThHREVCPUE9Qj8+QDw/QUE/QEJAPjs8S1Ri1OLg4eHh4eLi4uLi4uLi4+Pj4+Pj4+Pj4+Pj49fX19fEknuJf29sbnV2foSBg4qGfnVybWVtiIaKjoR7c4OHint4e4OPj4GEioqxztrZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29zc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tvb2tvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3dzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f3t7e4clsW2pqalNOR0dOT0VIRk1JSUA7RD5ISUA9PDo6Ojg2ODo3Nzk0OD08PT07ODw8PDw4Njc4OTo6RUJFQT9APEI/Q0M+PkNEQUBAP0A8PUtRYdPj4OHh4uLi4uLi4uPj4+Pj4+Pj4+Pj4+Pj5OTX19fZqXaFfnx3bHB3eXh8jH2KhYB3anN0d3p9bot7fnl6foR/gIGDfnh8foeGlrbT2tnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra29ra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/e3uO9amFpa2lRTkZNTEtKWE1OR0FAQE9BQz9AOzw4OTk5Njg2NjY4NDs+PD07OTY6Ojk6OTU4Ojg5OkJERj8+Pj5AQEBCPzxBQD88Pj9BOT5KT17S4+Hh4eLi4uLi4+Pj4+Pj4+Pj4+Pj4+Tk5OTk19fX2sqKhIB5c29tcXN1d4CUeHaAfHWHhXd1cnWgmXp7d3Z5doR0bWxue3iAmouTu9za2tra2tra2trb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc29vb29vb2tra2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f397js2lpbmloUFBPTExPUk9LU0Y/RURERD48PDg7ODc5OTU2ODc2NzM6Pjs+PTc6Pjk5OTk2Ojo4NzxDRUc/Pzs/PkA9PkE9Oz0+OUFAQDhBTlFc0OTh4eLi4uLj4+Pj4+Pj4+Pj4+Pk5OTk5OTk5NjY2NjauY6AenZ1bmpveHCBfWt0cnZ3hIV5h4d5lY55eXp1d3pza298gHx2fYh8gLLe2tra2tvb29vb29vb29vc3Nzc3Nzc3Nzc3dzc3Nzc3Nzc3Nzb29vb29rb29vb29ra2tra2tra2tra29va29vb29vb29vb29zc3Nzb29vb29vb29vb29vc3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3t7e3t7e3d7e3t3d3t7e3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/f39/f4qpqa2hrZFNQT0ZQVFJOSFJLPkREQ0I7Ozk6Ojg2Nzc2NjY4Nzg0Oz87Pj05PDw3Ozo6Nzo6Nzo9Q0JDPUE+Pzw5PT5BQDs8PDtFQD47Q05TXNDk4eLi4uLj4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTY2NjZ1p5vdntveHh2cG50d3BwdHBzb36Jc3qGhY2EenNtcoB6hn1vg5OBdnx9g4a13drb29vc29vc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29ra2tra2tvb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4N/f3+KgbWhma2ZVVlJHUFFOS0xMRUJIRUc9OD08Ojo3Nzg3Nzc2NTY3NDg+PD09Ojg6OD46Ozc4Nzc6Oj5DRDtDQj49OD1AQUM/Pjw+RTw+PUJNUF/S4+Hi4uLj4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk2NjY3MB2doCCfnp4eHBsdXlya399bHNvdGdoaYB/aWh4c2d+iYl4cIKGe3d9foWKvd3b3Nzc3Nzc3Nzc3Nzc3Nzc3d3c3Nzc3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODflGttZm5mU1NJUFlUTEhGTkZGRUJGPTs+PDs5Nzc4Njc5NjQ1NzU4PDs9Pjo6OztAOTs7ODc6OTlAQkE8QUE/Pzk/QEJFQ0FAQEM7Oz1ES01g1uTi4uLi4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk5NnZ2tmYc3uqhJaCcnR1dn14aGx8d2h4d25rcHR5gIN2dHyBhIJ9c3CAin94gn95g8je3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f4N/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh24tubWdzY1lRTVVbV0hDSUZOS0dCRD8/Qjo7OjY2NzU2NzY0ODc2Ozw7Pj86PDk8Qjg3OTo6Ojk6QUFCQUJDQEE+PT9CQ0NEQUJGOTg9REpOYtjk4uLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXZ2drcqHGCtXiRfnNsem6EgXaCfWtoan+DeHZ8dX2FhXRmcHl9d316gIqFe318foC03tzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3dzc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3Nzd3d3d3d3d3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e397e3t7e39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4ODg4ODg4tiFb3FrdWFWT1VVXE9ETUY+SkdKRUQ8P0I6PDk4Njc1NTY3NDc2NDk7Ozw7OD47PEE4ODo9OD04Oj09QEBAP0FCP0A+QENCQ0FBRTc2O0RMTmPa5OLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXl29ra3Z5sbnNxhY1ybXBuf391hH5rcnZ2enN4gXhzb3VwbWt2fHmFiIB/f392coODsd/c3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eDg4eHh4eHh4eHh4OLXhW1xb3ZeUldTWlpRSkhDQFFAQkQ8OT9BOjw5NzU3NDU2NjQ3NjY9PDo9PTk+OjxAODo6PDY7OTs+PUJCQjtBQkBDQEBEREM8PUA3OjxFS01l3OPi4uPj4+Pj5OTk5OTk5OTk5OTk5OXl5eXl5dPOxsB+cWxveHt2b3VuanNzbZKGeG50dG5vdIZ/b2twboJ0bXZyfY2DdnF/d3mKgabf3Nzc3d3d3d3d3d3e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3dzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t/f3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi1oZucG1xYFJZUFdfWUpMTElSP0Q9OTtCRjs6OTc0NTY1NzU0NjY2Pj07Pz45PTk7Pjg9Ozo0ODtAQENCQ0FCRkE/Q0BBQkREOz0+OTs8QkxNZODl4+Pk5OTj4+Tk5OTk5OTk5OTk5eXl5eXl5eW5t7Woc3JscHd6dHd4bXFydXd/hHRyc2xsa3F8bnBudGuBf3GAd32Eg355gHNygYqg2d3c3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh49WHcWxqbF5YWlVXYFZWUE9QTD1BOjs8RkE4Ojg2MzY1Njk2NTg1Nz89Oz8+OT04Ozw5PTs7NTo9Q0JCPENDREREQUE/PkJDQzw9Pjg5PENLS2PN0dnh1sjY4+Tk5OTk5OTk5OTk5eXl5eXl5eXltbW2q3J5cm59f3Z1d2hqaGlwb3Zta2tnZWZxdG15gG5teXd2iHhxa2podXV5dHV/wd/c3d3d3d3d3d3e3t7e3d3d3d7d3d3d3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHi4uHh4ePVhnFwY2lhV1NZV19MUk9STUtAPjg5O0E+ODc4NjM3Njc6NjY2NTk+Pzo8Pzs/OTs6Nzo9PDk5PEFBPTtBQ0VDRkA+Pj5BRUQ+QEE3OD5GSEpesrW4wbm1u8jg5eXl5OTl5OXl5+fn5+fm5ebm5ra2tbWOfX5weoR1cnZnYmNlbGtyb2ZpbHZtd4Z9hXlsbHd4a3ZwfH14c3V5fHd2h7ng3d3d3d3d3d7e3t7e3t7d3t7e3t7d3d3d3d3d3t7e3t7d3t7e3t7e3t3d3d3d3d3d3d7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4eHj1Yd1bl5uY1pUU1hXS1NLSk1SR0E4Ozs+PDk4NzU2NTY2OTY4NjY5Pzw6PT08Pzo7Ozk8PDs5Oj4+Pjs8PUFEQkNBQEBBP0JDPDw9Nzs+REVKXrG1tLW2t7e2y9rJ3uXl3eDi3tXU1tPU4OPg39+2treuh3t/bnmNenJ1bWNobGxtaXR4enF5enqIh4N6aWh9cWRvcXyGgX55e318e4an2t7d3d3d3d7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4uHh49aGdmxhb19dV1lcWlJQSEpXTEVHPUA9Ozs9OTY0NjU1NTg2NzY3OD87OT09PDw5OTw6Pjw6OTg+Qjs7Pj5AREBDRUFAQD0/QDw9PTU5PEJHRl2xtbW2uLm5ubq9uMPT0r3BwcC6u7y6u8TMxb/Dt7e3hGl1gX1ndYd5Z3Vxa2t5eHB3fH15bWl3e3h3bml1j4FwbHl4d3d9gXuGgnmAoNze3d3d3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODh4OHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4ePXhXJrZ3RhW1hYX15TVVVRVUpMRj9JRDs5PTY2NDc3NTc4Nzg3ODk8PDo+PDg8Oj0+OTs8OTs5P0E8PT9DP0FARUJCQTw9Q0A6Pjw1NDlER0dasbW1tre5ubm5ubm3ubm4uLm5urq6urm5urm6u7e3uX9ucHN6b3B/eXNuc3Vsc3Z4cXFwb2tvcX6Bc2mHhIF9dHOHdW11hYmBgHJ2hafd3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uHj14lxa2xyW1dXXWBUUVVUUFJPSkNATUE9Ozk2NTM0NjQ2ODc3ODk6Pjs8Pjs5PDo8PDk8PTw7PT0+PUNEREBDQkE/QD48PkE8OD06NjY6QkpIWLG1tLa2uLm5uLi5uLe3uLi5urq5ubi4uLi6uru3uKx7cnhxf3ZzfnBsbXpyZ29sbW50cHt3d3Jyd3pvhpJ2f3x8enZ5fH9zfYdyda3T393d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4eHh4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi49eHb2pxalVWV2FbT1FSUE5XSURESUo/Ojk6NzUzNDk1NjY2Nzg4Ojw7PT46Ozo6PTw5PDw9Oz09PDs9REdEQ0E8PDw8Pj5AOzg8ODE1OkFGRVautbW1tre4uLm4uLi4uLe4ubq5uLi3t7i4ubq7t7mqcnB4d3x7e4J3aG5xam9qY2lyf21zcn54dHFsanaAeX2AgH91doB1a4qLgHaR1d/d3d7e39/f3t/f3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f4N/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLi4uPYhm1sdGVWUFxnWE1YU1JRWUVES1BOPDk4ODY1NTM5NTY2NzY4Nzk+Oj0+Ojw5OTw7Njg5OTo8QEA9PkBGQEJCQDo+PEE9Pzs7OzYxNjxCR0RQqLa1tba2tre4t7i4uLi4uLm6ubi4t7e3t7e5ure2tIlyd3h9iXxwem99c2hqbGdnbHRscXd0cWx2c3Fxd3FyfHl4g3Z7d2mLkYp9kM7f3d7e3tvY2drZ297f39/e3+De39/f3Nvc3N3e3uDg3+Dg4ODf3t7e39jS397f397e3t/f3t7f3t/f3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLi4eLi4uLi4uLi4uLi4uLj4+Lj4+Li4uPj4+Pi4uLi4+Lk14NoZ3VkVlVkZVdKWllXW1Q9RU1LSD04NzU3NjQzOTU0Nzc1Njc5PTo9Pjs9PDk7PDk5Oj45PD4/PkFBQ0FFRUQ+OzxBPjw5PDs3Mzc+REhFSqG2tbW1tbW2tre4uLi4t7e4uLi3tra2tra3uLm2traLfXpsbHp/cGx5dm5qaGdlcXp4b2lvb3B1c21zd4Fnb32CgYNyf3lqcHJ6f6ng393Zy8a/vL2/vsLN0tDW3tnc4NfQzcPCw8PH1dfT2dzX1NjX0MfExce9vM/Kz87Y3djO3N3c2t3T0dze39/e397e3t7e4N/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eLi4uLi4uLf4uPi4eLg4d7W29/Sw8rJx9Hb3OLk4eHg2dre1sbExcTN2trf5OHi4trX3st9aWZxYVleZWFNTFRLUlpMO0hNSEZBPTc2NjUzNDY2NDg3NjU2OTw7Pj46Pjk5PDk3OTs7Oj49PEBAQ0RCR0ZCQT08Q0A9OTw7Nzc3P0RGRkaZtrS1tbW2tra4uLi4uLi3uLi3s7W2t7a3t7i5tba3opdxb29waW50dnFmZWNrbmdvcm1mZ2tygWVvdnyAeGRzj39zaHFyaWVlbm+w39HFv7u5ubm5ubq6uru6vc3Gw8e/urq6uru7u8HCvcHFvby/vry7urq5ubq6ubm6w8XDucDDwby/ube/z8/U3tjc3t/g3tLa4N/f4ODg39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eDg4ODg4ODg4ODh4eHh4uLi4eDh4uLi4uHa2t3RwsPCu8XT1uDdydPDrrnAsaqrq6uwtLbJ0sXRxLG4v7Srq6usr7S0vMzE1c60tLureGxtbWBdYl9ZS1NVVFFQREBRTUhEPzo3ODU3MzE0NjQ5ODQ2Njo8Oz08ODw5Njo6ODg5NzU8PDw/QEFAQkRDQkE8PkI/Pz09PTc1OD5DRUNAj7a0tLW1t7i4uLi4uLm5uLe1sautr7Oxs7OztLS0tqaei2tue3ZxeXhnY2hfcXdha25vaG99b25ja2lseHdsa4Z+bHB6dm1scG95sca8uru7urm5ubq6urq6urq6urq6urq6urq7u7q7u7y7urq6ubq7u7q6urq6urq6ubi3t7i4t7e2tbW1tbi3u8e+w8XHzcS4wMnH0tzZ2d/e3uDf39/f4ODh4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh3Nji4uLi4eHh4OHg3tfGxtHQztTe3tPO0t/SuLi8sq2trKysrrG+ua63rKipqamqq6urqqqqq6ysuKyqqqqrq6urra6urq6urryzrayrpHlub21fXl1dVE1SU1xUSkE/UElIPjg5NjgzNzMwNDczNzg1NzY2Oj0/PDg5Ozo6Ojg5OjY1OTs8Pj9EP0NFQkNCP0BAQT9APjw3ODc6QUVEP4W4tLS1tbe4uLm5uLi3t7SurKuqqq2urq6vsLGzs7WjcG5ucm1wg311aWFlaGZkY2Rxc21td25naW1tZXBzb29zcXN8h4F6dX11n7u6uru7urq5ubm6urq6urq6ubq6urq5uLm5ubm6urq6u7q5ubm5ubq6ubm6ubm4uLi3t7e4uLe3t7a2tbW2tra1tbW1tba1t7e3t7rBvrzGycrb3+Dg3tvd3d7h4tDW4uHg4ODg4ODg4ODg4ODg4OHg4OHi0768zNjd3OLg0dnbxL23sLCxsa+zu7uzsLS9s66urq2tra2sq6qqqqmpqKmpqampqqurqqqqqamoqampqampqaqqqqytrq6urq6urq6sraR4aWJxZmFZWlZRUk5cU0Y9QlJEQTg8OzY6NTY1MzQ2NTg3NTY1Nzg7Pjw7OTk5Ojg3Nzk3Njg8Oz47RD8/Q0BBREE+P0M9Pjw+Ojo3Nz9DRj54srCztLW2t7i3trKurq2sq6uqqaqtraysrq+xs7S1t4xucnRqaIB5ZmpmZWxdaG5waGxxYmNmcoJ+dmhobGpueoaBhXx4cXF5gK+6ubq6urm5uLm5ubm5ubm5ubm5ubm4uLe3t7e3uLm5ubm5uLe3t7i5ubi4uLi3t7a2tre3t7e3tra2trW0tLW1tbW2trW1tre3t7e3t7e3tre4v8bP0MS+v8DE19e8ydra4OHg4ODh4eDg4ODh4eDb3t7Uzby3tre6wMDJxLfIvrKwsLCwr7Cvrq6ur7Cwr66urq6uraytrKurq6qpqampqampqampqKmpqKmpqampqKmpqKmpqqqrraytra2ur66trK2heWpkbWdiXFhRUFFLVEpCOklRP0E3PDk0OjU2NTQ1NTU4ODY4Njs6OTw9PTs6ODY2ODg6ODY3Pj09PT5BQUVCQkNBQUBBOj09Pz05Ojc9QUc8bKqmqKutsLGwrqupqKqrq6mpqamrrKytra2usLO0tbilgIdvaWdzdGZrcG1qZGxvcm5rbWNrcHyJhG5qbHx4Y3uKfnNqc25rcY+7ubm5ubm5ubi4ubm5ubm5ubq5uLi3t7e3t7e3t7i5ubi4uLe2tra3t7e3t7a2t7a2tra3tra2tbW1tba1tLS0tbW1tra2tra3t7e3t7i4uLe2t7a2uLm4uLe3uL6+uLq9vcfb4OHg2Nnd4eHg3dfKwcPCurm5uLe4uLi3tbS0tLKysbGxsLCvr6+vr6+vr6+vr66ura2srKyrq6yqqqmoqKmppqepqaehpaipqamoop+hoZyip6inqausrK2ur7Cwrq2unXhwbGphY2BZUU1RTFJGQzlNUEU+ODs3Mjc5Njc0NDM1ODg3OTc7OTo9PTw6Ojk3NDo5ODY1OD8/QEI9RENDQ0FDQEJBQDtAP0A/PDw6O0NIPWOopaWlpqioqKenp6ipqqmoqKipqqqsra6wsLCztLW1taWYdn5xZmt4cW9tZmVsaGNsZ2ZpaX11bWlvfXZ5hWZod294b3Fvcninu7m5ubm5ubm4uLm6ubm5ubm5ubi3t7W1tba2tre3t7e3t7a2tbW2tre2tbW1tra3t7e2tbS0tLS0tLS1tLS0tLW1tba2tra2t7e3t7e3t7a2tre2tre3uLe2t7i4t7i4uLi4wMXTyry8w83PyMC9urm5ubq6ubi4uLi4t7W0tLSzs7KysrGwr6+vr66urq+vr6+uraysrKurrKysq6ehoJ6gn5udoaGdlpmkpKaon5mZmZmanZ+gn56fpKqtrq+ura2srJl1cGlrY2FeXVVOU0tSREQ4TktHQTo4NTI2OTY2NDczNzc3ODk3OTo7PT0+ODg4NzU6OTk1OD9AQEFEPkZBQkNAQkNCQT88QEJCQD0+OjpERj5cpqWmpqampqanqKenqKioqKenqaurrKytra2ttLS0tbekc311bnONf3JmanFjaW1jaGZobG51aV9jZ3VzdnpuZ3Bwcn56cYihu7m5ubm6urq6urm2s7a1uLm2trW1tra1tbW1tbW3tra3tra2tbW2tbW1tbS0tLa2t7e3tbS0s7O0tLW1tLS0tbW1tra2tra2t7e3uLe3tra2trW2tbW2tra2tra2tra3tra3uLi3uri4uLi3uLi5ubm5urq6urm4t7e3t7W1tLS0s7OysrKxsbCwr66urq6urq+vra2srKuppaSmpqScmZubmpmampmXl5eXl5aZm5iZmJmZm52en5+dnJ6gpKWko6OioqKQdG5jcGFeXltUU1RIVEo/PFFCRkM7ODYzNzo1NTQ4Mzg5OTc4OTc7OTs9Ozc6NzU2OTk4NTg+Pz9ART5CPz9DPzxBQUI/PT9EQT8+PTk9Q0Y/VaSlpqanqKeoqamop6ioqKioqKiqrKuqqaipq7W1tba5o3eKcXKHhnd0cGh5a2JjYWVsaW5zal9jZWNjZWprYmRqbHaXjX6ovbm3tre5u7u6uLWxrKurqq6wrKyrq62tq6uvsLGvr7CytbW2t7W1trW1tbW1tbW2trSvr7O0tLSvra6vsrW0tbW1tbW2t7e3t7e3t7e3t7e3t7Owsra1tLa2tre3tra2tbW1tra3t7e5uLi4t7e3uLi4ubq6urq5uLi3t7e1tbS0tLS0tLS0s7OysbCvr6+vr66vr62oo6KgnJqampqZmZqbm5qampqbmpmZmZiXl5aYmZmZmpycnZ+foJ+goKChoaCgoJ+fi3RuaXRdYGZeUlRLRFRJPUVTSEVCOzo0NDY5NDQ1NzM4ODg3ODk5Ojs7Pz04OjkzNTg5NjM5PT5AP0A6QEJCQkA/QEJCPz0+QUFCPz06PkVDQFGjpqWlp6inqauqqKaoqKipp6ioqKinp6ioqaq1tbe3t7KZtH99kIx1Z2lqbGZjYGNoZW94cGlicXx5cGpmZmRma3NqhYystrKwra2ttLeysLCtrKuqqaiop6ipqampqKinqKipqaeoqqurra2sqqytraysrq6traunpaSnqqyopKOkpamwsbGztbW2t7i3t7W1tre4t7e3t7Kppaasq6ivtLa1s7W3t7a1tbW2tra3t7e3t7a2t7e3t7m6urq5uLi3t7Wxs7S0tLKxsK6sq6yurrCxsK2rqqmqqKijnJqZmJmYmJiYmZmZmZmZmpqZm5ubnJybmZeYmpqcnJydnJ2foKGhoqKioKGgoKCfnop1amtuWVxhVktPREdVRz5PV0hEPTw4MzQ0ODQ1NDgyODk4ODk6Ojw5OUA8Njk6MzY3OTE0PD8/QEBBOkNGRUJBREJDQTo7P0FCQz9APUBEQ0BPo6empaemqKqqqqakpqenqKioqKimpqaoq6uttba3t7e4rbJ1cHuDdmBiaWtiZWZhZGdmfYh5bHKAfXFvcXhjbW5xZo+srKurq6ysra6urK2trKyqp6WmpaWlpqioqKiopaeoqKioqKeoqampp6Wko6KioqOioKKioaKhoKChoaKjpKOjpaWlqLC0s7OzsKuqqaqztLa3trGopaOioaGipKiqqairs7Sxrq6xs7W2tra3uLi3t7e3t7e3t7a2uLe0sa6ppqerrKmnpqWkpKSkpKWnqaajoJ+enZycm5uampmZmJeXmZmZmJiZmpqampqampqbm5mYmpydnZ2dnZucoKGgoaOjoqCgoKCfnp2FdGtsaFdYU0pHTUVITUdAU1dGRz09OTM2Mzc0NTU3Mzg6Ojo6OTw9OjpBPDY9ODM3ODgzNztAPz9AQDpCRUNAQkRDQT87PEBDQkNBQDxBQ0A9TqKnpqanp6mqq6mkpaWlpaaoqKippqanqKmpqrW2tre3t7izc2h7c2JnamtpaWJhZGloXV1tfHJma3J/fHR8bm1zc36gqamrq6uqq62trKusq6mpqKWjpKampqWmp6eqqaamp6enqKinp6iop6WjpKKhoaGhn56en5+fn56foKGho6Wko6OkpKSmp6enpqWkpaampqeqraumpKKhoaChpKWlpaenpaeoqKalpaivtLa3trW1tra1tbOwrKupqa6rqKWlpqampaSkpaWlpqWkpKSkpaKhoaGgnp2bm5ucm5qamZiXmJiYmJiZmpmZmZmYmZmZmZqZmZydnJycnJybnJ+fn6ChoaKgoKCfnZ2cgHNrbmReU0pITUZETEtFRFFTQ0c9PDgzNjI4NDY0NjQ4OTg6Ozk7Pjw5PTs5PTczNTk2NTY8QD0/QD88P0JDPkJCQj89Pj5CQ0FFQD86PkVAO0+jpqWkpqeoqaelpKWlpKWnp6eoqKanp6alpqa1tba2trW2uYptcW1vfHxxZ2pmYGFsYFROW2hqbm9tgYJ9cWdxdn6aqKeoqqmpqqurrKqqqqimpaWkoqOlpqalpaWmqaqppqWjpKWmpqSjo6KioqKgoJ+fnp6cnJycnJ2dnJ2en6CioaKjo6KhoqKkpaSioqOjpKSjpKSko6Ggn6GipKanp6ipqaelpaSipKSlqK2wsKyrqqusqqmnpaWmpaWlpaalpqioqailpaWkpKSlpKOjpKOioaGhoqKgnp2cnJubm5qZmJiYmJmam5mXl5eWlpeXmJiZmpqcm5qampubm5ucnJ6goKGgnp6enpycm356bnJiXlNNSlBFRk5NQkBPRT5JOz01MzYzODM2Njc1Ojs4OTs5Oj49Ozo5OT03NjY5NjU2PkI+PkE/PT5DQT5DQ0BAO0BAQkJCRUA+Oz5FPzxQoKSjpKOjo6SkoqSlpaSlpqamp6empqalpqaltLW1tbS0tbiBaHx9ZXOCemxwdWFfY1ROT1FbaGxpbGxxbW5xbnScoqSnqKioqauqqqqqqaempaSjo6OjpKSlpqalp6ytqaShnp2eo6Shnp6foKCenJ2dnJycmpqam5ucnJubm5ydnp6foKChoJ+goaOioKGjpKSjoqSlpaWkop+go6SkpKapqainpaGdnJ+jpaipqainqKioqaempaWkpKSlpqampqampqenpaWko6Ojo6KioqGhoqKhoqOkop+enZ2cmpubmpqZmJeXmJaWlZSUlJWVl5iYmpubnJuampqam5ucm5ucnp+fnpucnJyam5p/fnF0YFtUTUdNSEZMSj8/TkM8QDs8NDM4Mzc0NzY3ODs9ODo6OTk7PTs7ODk9Nzc4OTU4OD9APT9BPjs9RD89REA/PzpAQUE/QUVAPjw8Qz88Tp2ioaKioKCipaSkpKWlpqenp6empqampaampbW1tbS0tLS3jHalsXdmc3Jvc2xjZGlYT1JRT09dgG1kYFptkZGSoqKjpaampqenqKiop6alpaSjoqGhoaKjpaempqesrKemoJ2cm6Ghnpuamp2cmZiam5qampmZmZubm5uampqampucnZ6goaCfnp+hoJ6foqOko6Omp6inqKWioKGhoaGkpaWlpKCcmZmbnqOmpqampqanpqempaOlpKWlpqiop6enpaWlpaWkpKOjo6KhoqKioqKhoaKjo6Kgn56enZybnJubmZaUlJSTk5OTk5SUlJWWl5qam5ubm5qZmZqanJ2dnZ2dnZuampqamZqXf3dvc11aTkhKTkdFRklERU5APD09PDQ1OzQ2NDY1Njc5Ozg5OTg5OTw7PDc6Ozc4ODg1ODg/Qj9BQTw+P0A8PEJAQT49QT4/Pz1CQUA6OkA8PE+doqGfoJ+dn6OkpKSlpqeoqKenp6ampqampqW1tLS0tLS0tbSXtqd1Znh2Y2xjY2VjW1JTU1JNXqCMeFhodpajnp6hoaOjo6OjpKSlpqalpKSioaGko6OjoqOlpqWmpqenpp+bmpuioJmWlpWam5mXl5iYmpqYmJqampqbm5qZmZmenZ2goqOjo6KkpKWinqGhoaKjpaampaSjoaCgn5+hoZ+goJ2amJeZmpygpKOjpKWmp6alpaOjpKSkpKWnp6ampqampaWmpKOjo6SjoqKjpKGfoKGhoKGgoaCfn56dnZyamJeVk5KSkpKSkpOTkpOUlZaZmpqbm5qampqbnZ6enp2cnJybm5qamZmZlH10bHReWk9IRUdGQkVORT9GOzo+Pzs0Njo2OTM2NDY4ODo4OTc4ODo8Ozw5Ozs6OjY3ODk5Pj9APjw9QD5AOjlAQT89QT8/QUE+QUE/Ojk9PjpQnaCfnZucnJufoqOlpaWlp6iop6ampqanpqantLS0tLOysrGwsK2rkHiGj36bmn93Yl1TUlFRTGKgootaiKCgn52YmZycnZ2eoaGgpKenpqWkoqGjp6alpaKipaampaanpqagm5mboaCXk5OSl5qcmpeXl5iampmampqam5qYmJmaoKCgoKGfoaKipKamop6gn5+goaOko6Khn56enpyanZuZmpqZmJeZnqChoaKioqKkpaWmpKSkpKKioqKkpaWlpaWlpaalpaOko6KioqGgoKGgnp+fn5+fnp+foJ+cm5qZl5WUlJSTkZCRkpKSkpKSk5SVl5iZmpmZmpqam5+fnp2cnJycmpmZmpiXl5F8cmdxXl1QRj9BRD9KT0JCRjhDRT4+OTg7Nzc0ODQ1OTo6Ozk3OTo8Ozo8PT48PDo2NzY5OD4/QT47Pz49PDg6PkFAQUE/P0FCQERBPjo4PkE8U5ycm5uampycnaGio6KjoqSmp6alpaampqSjo7KysK2rp6amp6alpqiln6iop6qnoXmEXFFST0xcnKCAYpmgnp2clZOVlpeZmp2dnqGmpqampKOioqanp6ajpaampaWmp6amop2cnqGfl5GRkJSXm52YlpaWmJuZmpqampqZl5iam6Ghn56fnpybnJ6goJ6dn56fn6Cio6SjoqCfnp2ZlpeXl5iYmZubnqKioqKioqGio6WlpKOio6SioaGhoqOkpKSko6SkpKSioqKhoqGgn5+gnp2enp2dnZ2dnp6em5mYl5WTk5SUk5KQj5GSkZKSkZKTlJaXl5iYmZqampyenZ2dnJubmpiYmpmXlZaNempmamBiTkY+P0A9SkVAQ0A7QEE8Ozs5Ojc2NTg0Njc4OT04ODs6Oz87Ojs8Ojk6Nzc2ODs7Oz08Ojo8PTw3Oz5DQkRDPz1BQ0FEQT88OkBCO1eZmJqamZmam5ucnp2foqKhoqSlpKSlpqSioJ6op6alpqWlpaemp6ampqakpaanqKehqXJOUU1KVJahenKanJyenJeVlJWWmJiXl5qeoqKhoqOkpKOjpaalpaanpqSlpqalpaOgoKGhn5mSkI+WmpmenJaXl5eZm5ycnJqamZeZm5uen52cnZyZmZqcnZydnp6fn5+hoaCgoaKgn56bl5WVlZeanZ6fn6GhoqKio6OhoaCgoJ2cnaGioqOkpKOioaSlpKOko6SjoqKioqKhoKGfn52cnZ2cnJ2dnJ2enpqXlpaVlJOTkpKSkpCRkpKSkpGSlJWWl5iYmJiam5ycnJycnJ2cm5mYmZiWlJWXi3hsY2RiZFFHQT1DO0tIRDo7Ozw+OTo6OTo3Mzc5NTo4ODg8OTg7OT09Ozo7Ojk8PDc2NDc/PDo9Ozw/Pjw7ODxBQ0FDQkI+P0NAQkFAOj9APztZmZiampqam5ubm5ydoKGhoaGhoqKioqKhn5+dpKWmpqenpaWmp6ampqWkpKalpKSkpaaGUFJQT0+PmHB6mpubnJ6cnJycm5ubmZiYm56dnp6foKOkoqGhoqKio6SkpaalpKOjoaGhnpyalZOUmJuam56amJiYmJqcnpyam5iWmZybnJycnJydmpqbnJ2dnp6dnp6fn52cnJyhoaCblpWVlZacoKGgn5+hoKKjoqOhnZuZlpaWlpicnqCip6ikoaCgoqOjoqKioKCgoJ+fn5+gnp2cm5ucnZydnJmanJuWk5KSkpKUk5KSkpKSkpOSkpKRkpSVlpeYmJiYmZqcm5qbm5ucnJqZmJiXlZWWl4d3ZGdoZGJNQ0U8RDlJSkU5Ojs9PTo6ODg6NjQ3OTU8OTY4OTc5PDs7PDo6PDs6PDw4Nzg3Pj07Pj46Qj86Ojo/QURCQ0FBQD9EQUFAPjpAPj06W5qYmZqbmpubm5uen6CgoaKioKCgn5+enp2dnKWkpaanpqWlpqakoqKio6Oko6Kjo6KnllRYVVJOZ21rgZ6am5udn6Cgn56enp6dnJ2dnJ6enp+goaCfn6CgoKGio6Ojo6OjoqGgnpuZmZiZmZmamZienpiYmZmam5qWlZeWlZicnJ2cm52dnpybnJ2cnZ6bmJqeoaGdm5udoKKhmpWVlpaZoKKgnZueoKGjop+em5eXlJKSlJeYmZ2goqenpaGgn56goaGioaCfnp2cnJubnJubmpqZmpydnJmXmZaVk5GQkJCPkZKSkpKSkZKTk5OTk5OTlJWWlpeXl5manJubnJucnJqamZeXlpaVlZSEcmZsYmRbREJMPT84RktCPEA+Pj05Ozk6PTg1ODg2Ozg1Njo4PDw7Ozw8Ozk8Oj09OTU4Nzw5PD88OkE/Ojo6QEBDQkRBQ0A/Q0FAPj08QD09Ol+al5mamJeYmpycn5+foaGhoJ+fn56foKCenZ2lpKSko6OioqOjoZ+foaGipKOio6SiradXXl1UV19ua42dmpqbnJ6dm5ucnZ+enZycnJydnZ+goKChoaGgoKGgoKGioaGioZ+enJqampqbnJqZmpuZnJ6ZlpaWl5eTjo6QlJabnJuam5udn52cnJycnJ6dlpSZnJ+in5ycnZ+hoJuXl5mZmpycnJubnZ6fnZqXlpaWlJOTlJiampqfoKGmpqWgn56fnqChoaCenJubnJybm5ybm5qZmJmZmZmXl5iVlJKQkJCQj5CSkpKSkZGTk5aYl5STkpSVlJWWlZaZmZmam52cnJyampmXlpaWlpaQgG9vZV5gV0BKSDg/N0lFP0VBPD07Ojo8Ozs3NTs4Njs3NDY6Oj47Oj0+Pj07Ozs+Ozo4Ojk5NkBBPTo8PTo6OT9BQ0JERUM+P0FBPz8+Pj89PDtgl5WXl5aVl5mbnqGhoKGioqCenp6enqCgn52bpaWjpKSioKCfoJ+dnZ+hoqOjo6OkobCjXWVkYGFua4GenJubm5ubmZianJ2enJubm5ycnJ6ipKGeoKGhoqKhoKCgoaGgn5+enJqZmpubm5ybmp2dm5manJiXlZWWkY6Nj5KYnZycm5ycnqCdnJucnJyempWVm56foZ+dnJyenp2cmpqampqampqbm5qXl5aTkpWVlpWTlZaam5qanZ6foqWjnp6fn5+en5+enZ6fnZycm5qcmpqbmpiZmJiYmJiYlZSTkZCRkJCQkZKTk5CRk5SYmZiVk5SVlZWWlZaXmZmXmZqenpyamJiXl5aWl5eYjX1ubV9lVlRFSzw3PjdSRUM+QkE4Ozw7OTg6ODY7Nzc6Njc5Oj0+Ojw8PT49PD06Pz06ODw9OTtAPj4/PT45ODs/QkNAQ0VDPT9DQj5AQD5APTw8YZWSlJWWlpeanJ6goKCgoaCgnp6enp6gn56em6WlpKOioJ+fnp2dm5mbnJydnp+gn56rmGNpbW5pZm2enZybm5ybmpmZmZqam5ucm5uam5ygo6SgnZ6enqCgoKCgn6ChoKCfnpuamZqam5ubm5ufnpyZmJqamJiYmJKOj5OXnJ2bnJ2cnJycnZycnp6dnpqVl5ygoaGfnp2eoJ+cnJuampqbmpqYmpmVk5OTkpOWl5eVlJiYmZucnJydoJ+gnp6enp+fn56en6KjpKKgnp6cm5qampuZmJmZmJeXlpWUlJORkZCQkZKTk5OSkpOUmJmYlpWUlZaWlpaWl5iYmJiXmZqamZeXlpaXlpeWl4l4dmddX1dURUU5OTs8WT5AOEI/OTs7Pjk4Ozg6Ozc5OjU4OTs9PDk9Oz0+PD0+Oz8/Ozk+PDw+Pz5AQUE9ODc7QkNFP0FFQz1AREJBQEQ7Oz47PGKWk5SUlpWUlpiYmZubnJycnZ2cnJ2en56dnJqkpKSkoJ+enpybm5qZmJiYmZucnZ6cpolla3R4bVuFop2dnJydnJqbmpqampydnZ2bmpuboKKinpucnJycnJ2enp2dnZ2fnpyampucnZycm5ycnp6cm5qanZqam5yVkZOXm52dnJ2fnZycnJycnZ6fnp+cl5idn6GhoJ6cn6CfnJubm5qbmpmZmZmZl5WWlZaYl5eXlpaYmZuenp2dn6GhoJ+fnp6fn5+dn5+hoqKhoZ+fn5yZm5qcnZuampmXlpaYl5eXlpWTkpGTlJSTlJSUlJaZmJaVlZeZmJeYl5eXl5eYl5iXl5eXlpaXl5eVl5eDeHZfW11eUT1GOjk4P1VDQTtDQzo8Pz86Ojk3Ozg4ODc0ODk8Ozw4Ozs8PTo9Pjo/QT06PTw+PkA/PUBBPjk2PERDRUBBRUU9PkVERD9COzo8OTpkl5SVlZaUlJSUlJWXmJiamZqcnJydnp6dnZybo6Oko6CenJuamZqZmJiYmZiam5ubm6WJa3F2em9lmp+enp2dnJybnZ6dnJ2enp2dnJydm5ygoJuampubmpudnJqampucnJuZmZycnJ2dnZ2dnZ2dnpybmp+fm5ydm5mZmZudnZ2dn52dn5+dnJydn5+fn5uanZ+goJ+dnJ6gnpubm5ubm5yampuamZudnJqZmJeYmJiYmp2foKCgoJ+hoaGgoJ+en5+fnp6foaKhoJ+enp+enJqam5ubmpqZlpaXmZmYmJiWlJOUlJWVk5OVlZSVlpWVlZSYmZuamZaWl5WWmJiWl5KUlJGRk4yRkJOWfXhqYWJiXFA8QDw2OENWSERCOjg7Oj47Nzc5Nj06OTk2NDc6Ozw9OTo6Oz87PT08QD47Oz46PT89PkBBP0A8NztBQ0U/P0REPj9EREM+Qj07PDs6Z5aTk5OTk5OTlJSVlpeWl5aWl5mbm5ybm5uamaOjoqCfnpuamJeYl5eXmJmYmZybm5qkgGpqb3lzcZegnp2dnJydnp6enp+enp2cnJydnp2bnJuampqam5ubmZiYmpqamZmZmJqdm5ydnZ2dnJ2cnZ2cm5qdn5ucnJubnJubnZ2dnJydnp2enZydnZ2cnJ2dm5uenp6dnZybnpubnJycnJydnJubmpmbmpmYmZmYmpmZmpyfn5+jpaKfoaKioaGfnqCgn5+fnqCioaGhn5+fn52ZmpudnZqZmJWWl5aVlZaTkpOUk5STkJCSk5GUkY+OkJGOlZabmJWYlJmXlJiRjJCPk5yTkoyFjIeDhndxZ2pkW1xRQT44NkJHYEJFR0A+Ozw7Ojg4NjU8ODo4MzQ6Njk9PTk5Ojs9Ozw6PD48Oj5AOj5APjw/QD8+PDg6Q0FEPz5CRD8+Q0VCPUJAPDw8OmeYk5KSk5OSk5SVlJWXl5aWlZaXmZmZmpqampqkoqCfn52bmpmYmJiXl5iZmJmcnZ2cqH1nZXN7enOJop+enp2dnp6enZ2enZ6enp2dnZ6cm5ybmpubm5ucm5iYmJmZmJiZmZmbnZycnZ6enp6enp6dnZybm52bnJybnJ2dnZ2dnJ2dnp+fn52cnZ2dm5qbnJmZnJ2dnZ2dm5uanJ2dnJycnp2dnZybmZeVlZeXmJqam5ubnZ6foqOhoKGhnJucm5ubnZqcmZycn6CfnZiZmZmUkpKUl5SPj4+OkYyNiYuQi4mLjpGRj4mQmJiQkoyNi5KQj5iYoqiqpqWlrKOmoZqep6eyqKKVo6Cfl39wcWlsXFtcTUY8NzdHR1g+SE5URjk+Ojg5ODc1PTk4NzMzOTY6Pjw6Nzo8Ozo6Ojo8PDs/PjtAQD47PT5BPDw2N0A+QkA+QUY+PEFEQT1DQj49PDlmmJSTk5OTkpOUlZOVl5iYmJaXl5iZmZqampqaoqGfnp2cm5mYmJiYmJiYmZmZm5ybnKx/am16f3lxh6Genp2cnZ6enp6enp6dnp2dnZ6enJubnJubm5ubm5uZmJiYmJiYmJmZnJ2dnJyenp6enp+fnp6dnp6dnJydnJ2dnZ6fnZ2fn56goJ+enZ2dnZybnJ2em5qbm52enZ6dm5ubnJ2cnp2cnZqYl5SRjo+QkJGVmJSWlJiZmpudmJuYlY2Mjo6TkpKRj4mQjpGRjo+Ki42NjYiIi4+Lg42NkY+MkI2Qk5WVnJihoJySn6SipKmam5eanKOprb3Bwbq8uL26ucC8ubq3uru7tL2zwbV/bnVmZ1peWUxJRTo7TElTPFZSSUM6QTo7Ozc3NTo6OjgyNTY4Oz08OTk7Ozw5Nzo4Ojw6PT85PD8+PDw9QTs5NTg8O0A/QT9EPTxBQkA8REM9PT06YZOTkZCUlJOTk5OTlJeYlpeZmJmYmZqbmpqamp+gnp+fnJqZmpqampmYl5iZmZmZmZmphXB1e4B3b4mhnp6enp6fn56en56fn56dnp6fnp2dnJ2cmpubm5ubmZiYmJiZmZiam52cnJ2dnp2dnp6goJ+enZ6hoJ6dnp2enZ6fn56en6CenZ6enJydnZ2cm5qYnJuVmJqamJiYmJmSjJCXlKCXk4+MjYqKiImMiJORh5CPjYqKkJCLjoqMi4+IiImJjpGOjYaFiYaKhoWLiI+SkJCNkJKXlpKamJ2TlJ6kpqaqq7Gsr6+rpquqsbm5tbS0rqyvtMDIxcXBvsbDxMTDurW+uLa0s7C2tb6qcHRyXGZfXV1JRj8/RUtMVklcTEQ/PUI6Qzk5Nzc7OTk3MTc5ODo+ODg6PDw7OTc5OTs9Oj4/OT5BPDs+PD46OTY5PDpBPkNBQT08QkBAPkJEPj8+OVyHhIOHi42KiYaFgYqMkZOVmJiHlZaWkpiampmenZ+gn52ampubm5ycm5iWmJmXl5ibqo56dXZ7f3mCoJ+fnp+goKCfn5+foKCfnp2dnp+enp2dnJqam5ubmpuYmJiXl5iZm5ucnJydnp6enpybm52dnZycoaGfnZ6dnZ2dnp2dnJiWlpaYlZWSlpmWk5GKjI+PjI+NkIuLj4+WiYiEi5GZjn2Fi42PjYyHioyQm4yRj4+Lio6TjIyNjIiSi4yFiYyPhouIh42KhYyEj4qXkJOYmpWbnKOqoaKknKKrsbe0ubWxs62vsrKlp7O6sbq6vLa3tsDDw729vLa/urq8wbW4wL6zr66mqa+3mm58Z1tjWl1fSEU+QUtJU1hZXkFGOTk9OUY/Pzo3Ozs7NjM6Nzo5Pjg6Ojw9OTk4Ozk7PDo+PTtAQDs8QjxAOjg0Nzw7Qj9BQj4+O0NEREBDQz0+PjlhmZWLkYWNj5aSiHl9e3+Fi4OKgoqJhmuAeJCLlpqRnZ2UlJGTlpeampiWk42Sk5KQm5uIdndzcX1/cpGgnZubm5yenZ2eoKGgm5uWlpucmpybnJuYmZqYmJmampqWi5CTlpmYlZiYlpucl5WSkY2SkZCUk5KXm5mYm5ePjpCLjo2Ch4uLi4qLiI2RjIeHhoqIiZGKh4yEhYqNi4qNhI+UkIyDkJOUmZWQi5OTkZWRlpWOj5GMlI2Oj4qIj4ePhoeJiYmNiomJioWNh46JmJKUmpuXmKChp6Cko5qqqbO2sbWwqKmiqK6tn6qvsK21ubi8wr/BxLixtbCutrOwuL68ury+urOzp7G3wpB1gGNiXlpXUk1IRkVQSVlXX1tDUDpCQz1HRj84Nzo6NzU1OTc8OTw5ODo9Pjo6Nzs7Pjs7PTs9P0E7Pz48Pzo4NDM3OkFBQEI+PjpDREM/QUM7PT45Z6mloqKZn6CippeUiI2CiIJ1h4iKiIp7e3Z7enmPeoiSfn18en6CkYWBgH1zfH99fISHfnRweHZzfHaBj4iIiYeIioyMkZicl4iOhIuNi4iNkI+Pi5GPi4yPj5CQjouFhYeLjIyHiIuOi4eMhYaBjYuGiop/iYqGiJiRiIOIg4KFfIuLjIaJi4iKkIyIi42PjI+Wh4mLio6NjY2Wk5OdnJyalpycm56bmpuYnZeTkZWWkJKRi4+LlpSMjYqDi4SEiYyQkIqOio2LipGJjZOTk5SVk5KcmZ6Xn6CfpaKvsamupKSfmKStpqa4t6ysu729wsPAv7+vpa2wsLS3uLO0uLa0ta6stK+4tLaBeXpjZmBeVlBRQUVMT0lcXl9UR0dCS0xCREA9ODg7OTU3Nzk3Ozc9PDk9Pj05Ozg6O0A8Oj06PkJBOD88Oj84NjQyOTtCQD9CPj04QEI/PkBEO0A+N2CloJqXnaGaoaCPl5efl5WCjaCfo6GdmpKOjIxycXBvdnFucG1ucHZub29waHBxcHR+c3FycXd7cnl2d3Jyd3Z6e3l8fXt/iIGEi3+PkYaNi4uGiouLiYaEgYaCgIKJkYOAg4x/ho+LiYWAh32AgZKQhoSEho2DhIyPj4+IjY+Hi4iRkJWRjpCKk5eOj5WYp6SfnZWYlpaln5udq6aqt7W4srGnr6qnpqGfmp2WkpWVkYqPjImTjZuVjYuLhoaJjJWQkJCLmZKVlZSbkJiTlIyNkYyWl5WilZ6mqauno6OqsJucpp+mq6G0vb6zs7+5u7u6uby9rqiusa6wuLyztLGxqrCpqLGxsqild3J0X2hhYFRWUUlKSFZNXl5eVExKRVFKRUdDPTo5OTc0ODY4Mzg4PTo9PD47OTs4Ojs/PDw+OT9DPzg7Ojg8Nzc2Mzc5RT4/Qz89N0BAQT0/RDw+PThUj4yGh4eUjJWZl5yWmZaNlZyWlZydoKCdmpiWeHFubXJ4cXFsbnJwa3FvcG1yc3t1dnd5fnVxeHZ0d3tybn98gX15eH1/eYOGg4WCg5CLkIuLi42Pi4mJhYKBfX9zfYiAfpyQhIWFiYuPinp9fYaOjYqGjZSRi5CXj5SXkpihlp6XlZunpp+goKawq6GjpbW0sqqmqq+isba5vcK7ucO+vLi9uLWxrLCspZuSk5mfm5SPk5WOmp2doJqfn5edo6qsoZ+em62hp6qwqaampJiRkZWUo6SirKSss7Szs6i3tru4sLKvra2yt7a6srW6s7e5u7i8urayr6yxsbKztLOxsa2us7Gzs6yhl3Zxc19jXlJRVE1PSUdYT1pcZFROR1VPRURKRD44Ojg3NTg4ODU5Nzo6PTw/Ojg8ODk5PTs9PTpCPj84Ozo5Ojk4NjI1N0I+P0RAQDY+P0I/PEM8PT46Tn98go6MjJOTl5eaj5SWjZaRkZSXk5qanqGdnHJvcnFxcXFxcG5zcW91dHJxdneAdXd8eYV+d3t8eX1/fICJiYmDfXp/h4GIiYGAgIGGiIGGi4eIhYSIiImEf4J/enx8fX6SkH+IeIGFi4qDhIWKj4yNkZmdlJSUoJqan6Ktsa2ppKWtr6ysrLWuvrmtrqm1sLexq7G2rK+9wsLAvrq8trKutraxtK66u7OurKepp6unoqmtoKmooq+wuLSxvLq6urK0ta+8tLezt7e7t7mtrbCprLW5sbeytLe2sLu7vLu6ury1vLi0wbWsqqqrtLG3uLm1trSzsKymrrCqq7Cxq6yusLKxtK6qo5N4dnJlZ1tMUlBGTUhTV1JlXmdUUExcUUhMUkNBOTk3OTU4ODY2Ozc5Ojs6Pjk4Ozo6Ojw8Pj08RD45Njs7ODg+OTUxNTZCRkREP0A3Pj5DPjpBP0BAO0t/gomXmJSdlpabmIuSlo6XkZGVl5SZl5+bmZx8dHV2dXl1c3RudnJzdHV2d319gX56gXyDfoJ/fYB/hIKFj52RiYF/go+Xjo6HgoCBiIuFfoqQi3+HjYyLioeSioeGjZGTkZGEh319g4iMjouOiomQj46PlJSYkZWbmp2dqK6yr6+1tLOtsrW4sLy1tbGqsKqztbS7t7SztrS1r7i4t62noqassLCvtre3vrW5vLOysa61u7C0r6+yu7axuMC9tLS0s7izvLq2tLrAvbm6ubq+ubm5vrWysa+yr6q1tLGzsbSzrri4tb+vpKaoo6ussa+zrq6wsKytq6qroqKmqKKnrauqpaynoqeYeHlxZmVZT09NSVJNV0xPX15cTlVUYlFEVE07Pzo8ODk1Nzc1Nzk1Ojo6OTs4Ojw8Oj08Pj4/P0I9ODY6Ojk6QDs1MjY2QUZDQz4/Nz49Q0I5P0I/PjtLjpGTmJmVmZGTopiTkpKLk4uOkI+Vl5ablZSbhoJ9enh2dHRzdH53end2gIKDhouMhISFioaQiYeRk5aRjZaalY+IjI+emJaVkpCTl5qamJCdoJ2Tl5qgmZ2bo6CVkJugpKOak42IiIuJkZGOkY6LmJqPj4yUmpecnJufnKSstLm6vK+2tLi0tLK3uLmzq6+qqKy1srK1rrGrrqa3s7OxpaGotbCvrayrtbqyu7q6tLK3ur67ubG4sLmtqLK4u66ttLS3tbu2trm5vLe0r7G0t7a5s7e1pq2pq6ior6yprq2up6KxtLG0q6aop6Cjq66oqq6orLKwr6+pqKGeoaGjpqOgopqlo56ol3J3bmdiVUtUT09KQ1BLX2JYWlFcU19NSFFJQUA5Ojg2Njc3NTg5NDs5Ozk8Nzs+Ojg8PD0/QkBBPTs2OTk5Oj87NjM3OD5GQkJAQjk+PUBDPkBGQj44R5OWkZWTkpSQkZ+ZnZmVkI+Sko6Mk5aWko6RlZGSkIaBeXJzdXuBhI6HhZGTkpicnJiVkJWYo5yaoaeqqZ+clpeVnaKioZyZnpmlqKyvramnqqmop6GlqKirqamvoZufoaOjoJqfoJyUjZiUmKCgoaSem5qkp6Spq66spaOoq6+xtK6qrK6zr6ystLO0ua6urayqrLKwsK2wqKqmsrS0uK6qtrqwr6qurLC3s7i0t7W0u7y4tbWxtauyrKiys7uvrbGytLa1sbG0s7OvrKuvs7a0sayutKqqpqWnrauoqKupqqifqbOwqqeppaOio7CtqaatpairrayppaSioKWipaOYmZyVnqKippdudWVnZFZPWEtLSktTVHBiWWRXX1tcUlpQTEM8ODo6Njk4NzQ3NzQ4Ojw6PDg6PTk3PDw7PkM/QT47OTo5Ojs+PTg0NThBREVEQkM5PjtAPkI/R0Q+N0KSm5SVlZaVj46Wl5qZlZGKk5SSjo+SkYqKiY2Ul5qTjYmCho6VkZSfmpuin5+jnqGhn5ijpKelpaapqa2rqaKmpKilpKGfnqOjra2srairrq6qqqukoaKlqaenqaijopybm6SgpaijoJidmZ+hoqmnoKKirqyrqqetrqilpKmpqammo6iqqaekp66wr7Ovq7Crqq+yr7Czua+rqLCxrrCyubO0r62vtbCss7GurLW1tLSzs7CvrKyqrKusr7G0s7CwrrCwsKyqrauqq6alrrCysKumqbCvqaOkqaunqKaopquwq6mvqaaoqaalo6iwraqpqKKpo6WnpKGhoKKloZ2el5aYlJugpKmUbnNeamlfVVpOUk5QT1JkXGRjW11ZXFBZT0tAPDs5Ojc6ODczNTMzODo9OTo4OTo5Oj08PEBEPkA9OTo8PDw+Oz45NTo8QkFFQUNBOT47P0BEQENCQDdAkZ6YlJeZlpGHi5SSl5GIg4mLk4+OkI2Hh4SFlZmWmJeZlpqeop2anKKkoaCdn5qfoKGgpqGgoKCjo6KlqKmrramqpqOmpaCloKaopqWnqKapqKOnppmcpKWioaChoaCcmJmfoKGkpKKenpagm5qioqChn6CiqKCcn6GloaCmo6KfpKGspp6foaGkrKqnrKivq6e0sa6ur7WyrKqwq6mtrbWwrq6srreup6yqpKivsq+sq7Kvqqqpq6utqa6urrGxraqtqaunp6uoqauinaapqKilqKisqKilpKWop6iopqmsr6+oq6mhoqKlo6Opq6ymqKWjqKKhoKSdnZ+hoZ2bnZ+amZWcnKOqlG9zZm5yZF1dUFVPV09eZGRsZ2JiWlpSVE9NQTo9Ojo4Ozk1MTYzMjg4Ozk5OTk7OTk8Oz0/Qz5APTk7Ojs8QD0+PDk5PEFBRUFGQTo9Oz9BQUJBRUI4PYqWlJOYmpaPiISNjpGSjIiIiI+JiZCRjoqKiJubmZygpaKlnqKjoZqeoZyanZ6bnKOop6ugoKOYoJ2XnKGjo6WjoqKkrKilqaCepqmnq6mkn6Kgoqahpq2mpp2fn5+fn5manJyhoKGkn6GbnZqcoJ6hn56eoKOZlpqYo6KipJ+ZnKGhoqCbmp6goaSgnaejqrGorqusqaSqqquorKalrKqws6+rq6mwq6appaWoq6ynpqevq6Wnq6upq6irqqqrrailqKOmpaesqayoopykoaOmo6qpqKano6SnqKanqKepqKupoaKoo5yepqWjqKino6WlpqmgpJ6inpeYnZ+doqKlnpiUlZ6go5d1d2t2d2FfXFVZUVVWW2Necl9oX2NTUVlUSD48PTg7OTo4NTM3MzM0Nzo4OT05Ozo5PDxBQEM9PT44Ozw9PEA/Qz86ODo+P0NAREE6Oz48QD9DQ0VDOTyCmJmenZ2alZKKiZGRl5GQh4SJgoGNj4+Sj42cnZ+hpKmlqaeorK2moqKfmKSmo6Stsa6yp6asm56em5qjp6Cfo5+foq+rqqyoqKuwqaipqKGfoKeprbCyr6yjoqahqaWepKOipqClpKKlo56doJ6fpaKinp+imJWemp6fpKGblZigoZ2enJudnZuZmZWen6Oonp2iqKGaoaOmoqSoqaqoq7CxqKWlp6eopKWpqaqnoqWmqKadnqWloqClpaOlpqCjpaOjpaelqamqpKekpqKmp6SrqaenpKGlqKynpqWlo6OopJWdo5+bnaCjqaeopqGjo6mooKiioJyVkZqfoKGmopuXkpCamqCVfHdvfXlmW1tgX1pcVlxoZG9jbmloYl5QUUA/Ozo4Ojg8OzYzNDMzMzc5OTs8OTs7OT49QkBAPTs9ODw9QD08PENBPjo4PT9EP0M+Ojk/PEI/P0FEQjk6gJ6kp6Kem5+gmY+ZnaCWloqGj4iEi4qTl5SRo6Wnqq6trLOys7S4t62pqqevtLKxqq6usbKusa2lq7OssbGpq6+rq6y2sLSwq7GysaOfoqqpp663trS0trOvrKuuq7awqbKxra6npp6io6ObnZyXoqiloZ+eo5ueoZqWnaScm5aZoqefoJ+joJuUlpmWl5qfoJmVnqKZmJ2dpZ2gpKeqqaiqraylqaSlqaeqqaqsp6SkpKOimZmhnpqaoaCfpaWYnqSmpKqooqelpaGqp6mnp6ejqKWmpaGkqKesoqekoaalpaOVl52Ym5mVo6elpaSfnZ2lo6Kqo5+amZiXnJyaoaGakJOTl5ibjX93cnZ4aWJbX15cYllgZG5ta25hX2RgUE9BQDs7OTs4Ojk2MTQzNjQ3Nzc6PTo8Ozk9PUI/Pj89PDo/OTo7PD5BRUA9OTtAQT5DPDs5PzlAQEBAQkM7OXuao6OcoJ2dop2Zn6KioJibmJaYkpSQm5qWl7S0rrW4s7S4tre0uLm3tbm4ub28uKqLnLK4vLS9urW7uru4s7q/uLe5u7G3r6iusq2inJ+qsri8vL27ur+0r7GztbS3t6+1tLWysKikop+gl5Wal6SqpqahpKOkq6WlmKGko52goaKooaOgpaGck5mYmJmco56cmpudl5uZlqWam5+hqKmpqKuvr66pqKmrrKytq6irp6WjoJyfo6Ojn6Cipammmpyip6Spn6GjoqKgpaanpqSooJ+ipKGjoqiop6OloKGopqalo5mbmJuTj6GknqKfmJiVoJuhpaCfm5udnJuamZugmo2YmZiTkYaAdnh5eGNbUllUX19hbGh1a3BnaWliWVNMQDw6Ozg5Nzk3NTU2Mjg1Njc3Ojw7Ozs7QD4/QD0+Pjk6PDk2Nz47QkZCPDg7P0NDRDw+OT43PkFCP0ZDOzhwkpqblJ6bm52Vl52doqajopaXnpaXl6GblJi+t7G4uba3t7i7l5S2vbu9vcDFtaK7mKC3v7+6wcm0nbu2sra/xcGooLazurGqrrSxsLG0tLa8vL68vL3Guri3ur20r7Wxsbq4t7Kzsqqmpp+YpKSnqKSupKurtbWus6CnqqynqqmlpqCnoKGmoZOWmJ2foqSjnZ6coaChnZekmpmdoKaqqqqtrq2tsLGrrK2sqamrrqimpaalpqSkpqaeo6eppKGcoKKjpqCio5+jpJ2foqWgpJyboZ6fo6GhpaSlqaOkpaKkp6ehn52elpOcoJiZko+MjJeWn5uWnJqdnJqTlpSUmJOQmp2YiouHgIB8gnhhXllTYWhgZnNvc2l0ZGlkYltMSz46ODg5ODg5NzM0NTI1NDY2OTw8Oz08P0E/QEA9Pj44OTs4Njc/OUJFQzw7PD5DREM9QDs9Nz1DQ0BFQjw3Z4yRk4qalZiblZWYm6Knq6aVl5iQlZmhnpeXvrWztLu6ubi5woeYt6u4u8DCxbOjw6e4s72/tMTHvbS7uL62wMTErqCworW2tb2+wcPGw8O5vb/AwL2/xL28ur2+tKeqmLHAvbi1ucCzr6+qqqitp6ekr6eqtLyxtLWor7Gwr6yqoqajrJ+fpquXmqifpaWfoJydoKuwsKyiq5yYm6Cor7Kys6uorre1sq2tqaalqKulpaStqaShn6Cnnp6mqKmmnp+anqGlpqmcnaObl6KmmpuanZ+cmqGcmZ2eoKijn6GfnaWioKOioZSZmpmTj4qLhI2Qk5uPjpiVm5eYkJORkomNl5iYk4uKi32AgIVwYGFeXmpiYm53dXZubFtiUVVcTUc7PDk3OTc5Ojc0NDQxNDM3Njg8Ozs8PEBAPUA/Pj8+Ojo5Ojc6Pz5FRUU8PT1AQkJCQUI7PDhAQ0NARD87NV+MjIaFlouUlZeYl5ifpqellpWWkZebn5ual7mxtrO5vLy5urWqsryxvsG0vMe5uLuuv6fGw7/KxsnIxcXJvMLHx7+xsae8vL7FxMbJx8XGu8TAxcbAua+9vMC+vrOrqoyzu760tbfCuq2vsLWqq6aqo62kp7G2q7WyrbOtqK6vp6awr7Ktqq+zpKu1qaeopKCgnqmyuL61tbWqqaausre4t7apq7i8ubexr66noqOop6SfqKOfnqCZoZydoqSnp6GelJuaoKGlnqChnpajnZSQlpiboZqflpORlpSin5qenJudoZ6kn56VnJiPkpOPjImTkJefiZCWkZuUmJGRlZaDjJWXlpKLjIh8f4N/amZoYWtsZm51cXJ1cWZeX1xSSUU/Ojo6Nzg0ODw3NjU0MjMzNjU3PDo7PDs9QD4/QD48PTk5OTs6PDw+QkRFPj49QENDQkREOzo4QUJCQUNAOTJbk4iEjZGKi5GRlZCSmp2fnJOSmJSdnZqXmpW2sbm1tb6+tri1uLO8vMTEusPHwb+0s8XFxr/CzcfLzszMx8HDx8fIysXExcO7vLzBxcHFxb/DwsbFwLGTvrq/w8K2trqptLO0qauzu7uxn5uxr6ykrK60p6qpqKqtrKmlpZ6pr6uyu7q4u7e5t7O5uLOurLO0qrC1ub3Bur6+vL60urm4u7qysbS8u7q7s7Oyp6Smq6uioaCdmpudmpyXmpuenJygnZaclpuZnZ6io52UnJCNiY6OkZ6bnJWNh5KLmJiWmpybmJybnp6cmp6UjpiYmpSRmZeeoZWYmpKXlJWRlJqYk4+TnZaSi5F+enx/dGtrbmRvbGhxeG95aWlhXGdhUUZEQTw5OTc2NDQ6ODQ2NTMzMjY1Nj05OTs7PT47Pj49Oz05OTs7Oz89QUNBQkFAPEBDQ0NFQjs4OUQ/P0BCPzsyV5uQkZCQh4WSjo2IjZCTlZGPjZSUm5STlpqRs7e4uLi+u7C1sri2tbbAw8G+w8LAvru+u7u8xMzEy9DLxsa/xcfLyNTLysjGv7u7vsS+xcjGxsTEw7i0wLe0vMHCucK3t7/Au66lrre8t62co7ewpq20tayupaWjqKSgoKWZqrOyvsG+urm6uLW0srG0tLO6wL7Av769u7u9vsDCt7a3tru7sru+ubi3u7a3tKyoqamrpqijnpOampyYkZKZl5GRmJqXnpiWk5acm5+elJOJiX6GiIuWlJiZkYmVkZeWlZmbmpaYl5idnpyhmJWZmZyYl5ybn56jnJ6WmJeTl5yZmZyUlp2UlpOJdnl6e3Zua2hndVpmcndzeGZmXWRbUlhJRj87Nzg4NzYxNjk3NDQzMzM2NDY7ODo8Oz08OD0+PDo7PDs9Ozs+PkRBQURCQEBBQkNDREM9OTlCQD8/QD89MkyWmpaSk4yKmJCKi4yOkpKKiIaNkJiKj5CUl7O7tba/vb2xtrjBvby0uL/Bsbi3vsHFvbu8wsXJv8jOyMHEwcfKysbKxczIzcbIxb/DwMvNz8nGw8PEwsS+uL7Bw8DEvsHPz87Gq6+2tLWroKe0s66ruLWzq6mjoq2prKatn6y1tL/Cvrm4vbawrausr7W0ur7Fv7u8urO5u7i5ubWtsLS9u7G/vLiytrmzubu0ra2orKyqqaeXnpualY2MmJSTi5WWlJyZl5WWmZKYn5mQiop+iYqKkY6Vl5OUn5mWkJSZmJmWmJOUm6GeoZiYmp2ZmZaenpibopqdnJuYmpuZlpeXlpyZlJyYfoB4eXV1ZWVpamhdam9teHdiYmBgXlhXRkU4Ojg6OTc5NDQ5NzY2NTEyMzM0Ozo9Pzs9PTo6PTs8Pjo7Pz48QkBDQkJFQj0/Q0NDQ0RFQDk6QkFBQj5CQTVCkJeUlZmSj5qQjpKRjZSVi4qHjI2UiImPkpq2u7S8xsHEwr3BxcLAtLO9v6ywr7rDysPCvs3IxbfByMW/wcLIy8rCwsTJzM3Pz8zDx8bIyMjHycfFycfIx7/Fx8TEx8jK0s/SzLy4trS4uMG+vrq9ury6vKytpqm7urm3wLK1uLLAxrq3t8Gzsa2tqau1s7u2w7a2vbWxt762s7e4sLW2v7uwvbq0q7CxsbO8urOzrqutq62xnaOjoJqQjpiXlZCclpaYlpWSnJmTm5+clpGUjpWQiYyQlZOUm56YmZKSnJedlJmSk5aZmJ2VnJ6do5yVnZ+TnKKcnKCfnaOemJSVl5ebmpmgkH99cXRxb2JhZ3VnaWh0bXhsXWRbVWBZTEhDNjw5OTg4OjUzOjY2NDQxMzUyNTs6PD47Ozw9PDs8PTw7PD49P0E/RUFCQ0M+QEFARUVERUE7Nz5DQkI+Q0I4O4+akZaalJKUjZCUlI6VlI6Pi4yJk4uIkJObt8C6xsXEw8zCwcS9vrWvt7uvr7O6wMfFxMHMy8W2ucDCwsTHytHLwsPExsnFzdDOx8zJwsHGwcvLx8bMyc3FxsbDxsXJzdDNz8zHxMDDwsnNx8XBxMfBu760sbCwwb6/wca/vri3w8K6urbAvrWyrKmvsri+tMC0tLi0t7nEua+8vrm+v8K/tbq2q6qsrq+wt768trSura2utaSlqKimmpycnZyeopydmZOQkp2VmKCdmJiVmZmZl46MlH2QkJefmZmYk5GToI6Nko+VjpCUlaKdnKSem56elpyjoKGipKOkop6amZubnJ2enIN9cnx4cGdgamp2bGlkdG5zYlxiVFdUU01HOjc7OTk3Nzo3NDg3ODQ1MjM0MjU7Ojk+Oj08Pz04Oz05OTk9PEBBQEVCQUJBQT9AP0RFREVAPDo+QkNCQENBOjSAoZeUmZiVkImUk5aTiZGMlJGOiJaKi5CXnMXLw8O8wMPHwbm9vbu4tre3rrK3uLzAwsDCx8bHurzAwsXHyMbSycHDxL+/vsTLyMrLyLy7yMfJzcjDyMnJxsXDwsHCx8fJysfMyMfIzcbLz8W3wMDAwLu7vbWzs7+/ub/DucC3u8G8uri7ub27srCvsKy5wri9ube1t7q9xb24xsjCwcLGwr28tamurrCwr7O6t7m2sK+tr7OppquprqannqSlo6OjoqCblZiekZecl5GRlZeZlZmRlJiSlYyYo5qcnp2FiZ+TfJKWlZKUlJennaCipJ+en56foaGkoqKjoaOinJ2fnqOhppl5enl/cm9mZWdjamRham1ubl5YXFZVTlBKRjk5Ozk3Njc3NjM3ODk1NjEzNTI3PDs8QDs/PDw6ODo8OTk4Pj1APz9GP0JBQz89QT5ARENDQTw5PENBQ0RBQDozbKKdlZedlo+PmJiZmIiSjZGVkI+Vjo6TlpbKy7u5urnBu7q3vsG8vLu5sa61uri4u8S6vsC+vru8wMXBxsK+xsG5u8O6uLm8vsHGwca6ucnJw8XEwMTBwsHEwcO+vcLAwMHCy8PGzMvFyNHCsL69uLq7vL63tLC5vrO8vrG5tbi7tryztbm2uba5t7GtusG6vMG/t77Ev8bDw8fHwrvAwr/Cv7iys7O1tLGut7S3tbSxrK2xp6Wlp7CtqJ+nq6ajqKWmpqCgn5SYmZSRkZWUl5OYl5qhnZ6hnKGdoaWglpSbkZeXmJqTnpmZqaSlpKWdoqCanqCkoqOcoqGjoJ6cnp6ppaiVfXuDeG5mYWViYWJjY2piZmNaWVlcWVFORT07ODo7Nzc5OTY0OTk6NTMxNDUyNzo7OkA9Pzw8OTc3Ozo5Ojw+QD8+RDxCQURAPz49QkRCQkI+OjlCP0FCPT44NVmfnJiTmZaRlZiYmpeQkZCQk5GTlJKSkpSUxce4tbq5wrm5vMPFwri7ubGxtry6tbnAu7u5tre0tLW/ur2/ub26urS/uLW3s6+7vLfAt73Cv8G7v8G8u8W+u8HEwL6+uLzBwcu+vcnEwMHKv7HCv7u4u765tbe0uLy0vbi1tLCzvLG3tri/tr25vb65t7q+u7/Axb29y8PGw8TAw762ubq2v7i7v7y4trOyq7CwsrWzs66sq6emnqeurauiqKumpqqjp6iqo5+Ym52bmpicnJiXnJuhpZ2anqGhoKGmoJqbnJiboJ+dnJ+coKiho6SknaKfmqKgop+el6Shop+dmpieqKWhi3x5h31xY2BiYmdqZmZpZWldVlVTWU9TS0U4PzY6Ojc3OTs2NTo7PDYzMTM0MTc7OTg/PT47PDs3Njk5ODo7PUA/PkA9PT9CPjxAQUNDQT9DPTo2PEBBQDw9ODdJlJibj5OUkZWYlZGWkpWRkJGUlZSTkpKYlcHCwLq8ub62uL7EwMKxvbqytLO4vLW3vMC8vbS0sbC1t7W6wbi+uL+8vbe1t7CuuLa5v7vAv7fBu7vDtrrIuLa5u725ura7xcXKvbnFwL+8wb64xr3BwLzFuLa3tLi2tru7uLa0t7q1tLi8vbm/ucPAwLu5vLu+vcjEvcfEw7rAvb62sra4srm0usLCureysaysq62yr7Kur6ijpJ6rrKyqpKakpKiqoqemraihoaGmn6Oiop6bnKKfoKOdnJuhn6KgpKCem5eZn6GdnZ6eoaWkoaKioZ6ho5yinqCZnZijn52eoJqZoKKmnYR6g4B4cG1lZWZvaWVrZ1hYTktLS1JJTEhDOT44PTs2Ojs6Njc8ODk4NjA0MzE3OTk7Pz0+Ojw6ODg5PDg6Ozs7PD1BPj09Q0E8P0NDREA/Pzw6Nz5CREE/QDg4P4mYmoyMkI+Tl5WMkpCakpGXmJaUlJKQmpTDvsbBwby8uLi6v7a8scK2tLyxtLa4s7q9v728sq2vrLGwt7y2u7zAxLm3t7e1urm6u8C9w8C6xMK+x7i5uK23tbi6tLezu8XGy8G7xsDAv728v8nDxMW+xri1srK9uLi4vrq6uby6urS3u7q5v7zEwL+5uri/ubvFxr3Fw8Kyur27sa+2uLO3s7q+wLm2rLGrrqmqqa2qqq6mpKWnrq2ppaOio6GkpaWmoqato6Klo5+ho6Gcmpyhn6CloaCenZygnaWgnpeVmZ2fn52gn6KmpaCknpybn6Ofn5mcmZ2epJyWnKOcnqGcppZ+f4Z8a25wZ3Brc2VibV9cVEhLSkRKQkNHPzk7OD08Nzs7Ojc4Ozc8PDYyNzUxNjk8PD08QTs8Ojs6OT45Ojs9PUA+RD89PkRAPz9BRkQ/Pzw9OTc/QUNCQEI5Ojl3nJiLh4uQkpOWjY+TmpOQnZiSkY6QjpiSvbfHvsO+vbu+vL22uri9ure9s7OwuLi1uby8wLeqraSusLe7s72/u8S3tri2t7+/xLzCxcXHx8rJxs/CwbiutbW8vri7sr7ExMrFwcnDwr+/vr3HzMfHxMe9tbW2wb26u7/CusDCv7y2t729vcHBwL+8ube8wru3v8W7wr++tbe8vK+vt7awtLO6ubq7r6mtq62rrKaqoqeuqKWqra2vp6Sgn6ajnqKjqKOjq6Oiop6dm5ublJaZnJyfpZ6fnpmYnpejoJyXmZqZmqOjop6jo6egpqCbnaCjnp2WoJmcoKCblJegn6WcmKKQgYaBcWVsaW50bndjZ2FcY1FLVEhFRUNHQzw7OTg9Ojc6PTo4OTs3PD01MzY1MDY4OTo8O0A9PDo+PDk+OTk9Pjs/PkM8Pz5APz0/P0ZEQEE/Pjo3P0BDQz9BPTo4ZqGYj4uNlZKVlY6PlpmVl5uVjoyMjY+bk7m2wbS/vLm8w8C+wLq1trKywLmvsry8sLe7tru8q6qjsLm9vrO8vrzFuLK4ub3HycrDx8jGxsnIzM7RzMrEtbrAw8i/v7W/wL/Gxr/LxsO/wbzAw8zKx8XGwbm9vMS/wL/CyL3Hx8XFvLrEv7vBv7rAvLu7wMS9t7nCub69t7S2uLqur7WxsLCytre0t6yurKqsrKuoq6Gms6qlra+trKippaOkp5+io6Onoaeiop6cnZyamYyQlpeZnaKZnpuVkp2UoaCdmZ6fmJimpqKfoqKmoqeloqCko6GbnaCbnKKfl5WVnp6kmpafiYGDgXRvbGx0a2xuX2JeYGFOSE0/RUA/REM7Ozo6Ozo4Ozw6OTw+OTo+NDQ1NTE5OTo5PDtAPD89PTw4PDs6PDs7Pz5DPkI+QD89Pz9FRUJBQj87Nj9CRUQ9QUE6OlmfmJOSlZqVmpOQlpeclZuZlpSVkZKTnZm2uLaxuru6vsG5uca7trWypb69tLbBv66zvbS4wbGwsbS8w7y6ur68xL+3vb+9x8zGx8nGxr/ExMrIzMzNy8bCw8vOwry5vrq5wMO/yMbEwcG/xcDKycPDw8O5w769ub+8wsbCyc7Hxr66xr26v7m3wLm5vsDCvrW0vLi2u7CvsrK1r7Cvrqyus7CzsrirsbKxqrCrq6yrrLatqKyusqarrKmpoaWgpaakrKSmoaChnqGgnaCMlJeTm5+mmZ6emZOYnZ+gnp2eopuYp62ooqSgoKKqpqmhqKGlm6CgnZ2jn5SYmKKdp6Gfm4J7eod6bW13e19wY1tdX15TST5DRUlCQz5DOz42OTo7Ozs7Ozs7PT05PTU2NjIxODo5Ozs6QTs/PDw+Nzs8Ozw9PTw9Pz5BQUE+PkFCQUVDQkRAPDY+Q0RFPkJEPztTmZuZmJ6dmqCalpyZn5KdlZ2boJWWlJqYur20sLu8wcTCv8XGura5sqO7vbS3xLuwtbu2ucS4tLy2ur3BvLu+tr/Bv7y/usDLwsfIwL+8vMDFwsfLyMHDwMDJy8LAu7uwtLy9wMXGxcW/wMK/y8fCwMjAusK7urO6usG+wMrOysS9tby8ub+5ubW1s7/Avre0s7S4rbeqr7CwsrGvq6+nr7ausrG5rra2uLSzsLGttrS6sa6srranrLKsraSjoaenqLKrqqWkp6elpaCml5ujn6SmraKeo6KanaWiop+foaWenrC0sKSlnp+kqaevp6mgq6CiopqipJ2anqGmp6+psZWCe32Cem1zeHNncF1aXlxZUUVEQ01JQUQ9Rzo6NTk7Ojw8Ojs7Oz0/Oj01NDUxMjc4ODs8O0I8Pz46OzY6PTo7Pj0/QD87QUFBPj4/QkBBQkJFPjo1OkFCST9AQkA7TJqdnZ6fnZienZmampySoJWbnp+blZGRlsW+urbDvMbCvr/Ixbe1uLe2ubu0r7e2srWzt7m8u7a7u726w7u3vbe5wLu6uLi1xcHDw7u5s7S6wb2/x8C5wLy+xcS9vrmysK64t7/Dx8PEvb2/v8PDvr/HvLy/tLSutbW8vr/OzcvCt7K4uLi9ubuxtrLIwLu2tLGwt6yzqbCtrbO3r6uuqrG1r7Gvt7O6usC/tre2sru6wLWyrbO3rLC6r7KmoqWrrK+5s7KosK+xr6qiqKGkraitrLOun6inpqWmq6Sknqaqo6ayuLOrpZyfp6anrquqpbClpaWbpKOYn6exrLW4sLKOhHl/fHZsdXpwbmlbX19ZU1BBRUhHS0BEQ0g8PTY7OTk8Ozo6Ozo9Pzw9NTU2MTM2OTg8QT5AOz1AOzs5PD04Oj08QD46Oj49Pj09PkBCQkJBRD03NDU9REc9Q0I/PEWUnqCgoJyXmpiYlZmdmZ2fmp2bnJaRj5LDwMK9wrzEvLy7xbu3s7e2tru7s6CWtayvsrS0tLa4ucHAt725uLm2tb+ztLK4sbvBwMO3t62wtbi4uMK6tLu3u77Au7u8rq+us7K5wcLEw768v7u6uLbBwrW/urWur62wvcC5z8rJw7GvtbS0vbq+ubq7ysO7uravsL2xuK+ys7C3vbaur66wt7CsrLK2vbzEwrq9t7bAv8G3tbC2srGzurGxr6err6u2v7e1qbqztbmxp6uop7ausrG1uaisrK+qr7CqqKessayytr20saykqKuoqKusq6i2qaaonqadmKOuvLG7wbSmiYF8gnpzdnZ3bnFgX2VdW1RKPD4/RkY9RkNDOTo1Ozk5Pjw8Ojo8Pj4+Pjg4MzE1Nzg5Pj9BPzs6Pz08Oz09OTs8OTs6Nzs+PT1DQT8/QUJEQkE8ODU4PUNGPUREPzw/iZ2en52Xl5WUk5aZnpubmpuYlJ2Uio6Owb7Dwr6+vrm2usCxtbGzt7fCtbOrrbOoqa61r620trnDv7e6t7a2srTAtrK0uLO6wMHDubeysrK0sre+urO1sry6vLa6vrK0tLSwuL7DxsTAvb+5s6+yvLquu7Szpquorbq+uMvCv76sq7Cvs7q3ub67wMXBu7y3sLXEtb+0uLu0u8PCs7a2sbisqaWrsr23v7+7u7exvL28trGvq6uprbOvsLCrsLSpuMC2sqm0tbC3tq2spqu7s660uMKwsbG1sbK1saywsri4ubi+tLGzrqyxramvrqqyuK6trainoZ6ptr+4ur+wlol9gHxxdHd0dnJsXmJgW11OSEE/PUhDRk1EPzc3NTs6OT48PDk4PT47PT86ODMyNTc2OD8/Qj86OD4+PTw5PDk7Ozo8Ozs6PEA+QkI9QEE/QkI/PDs3OjxBRD5CQz8+QYqgm6GdlJiVlZKYmpyWm5WalY2bj4SIhru0vb+7vLm3s7y8rLOytLS2wLXAr7Kzqqqxt62pubO3wL27vLi2uraxwLq3ubi5u8HBxMO7u7a0tLC2ura0sqy8ubi1uMG6uLOxrLe8wcfDv7m6ta6lrLOxprCtqJ6gn6WttrXCt7a0pairqLC2s7K6tbu7u7W4trC1xLK+vL+8ubrFybq9vraxp6SeoamxrrW5trKxq7S3trGopp6gmaWmpKynq6y2qq+6sa2kpq2lq7GrrKmtuLawsrjBtrGxtbGvu7ayt7W1sry1urKwsbKutLKqrq2nuLWyta2uqqiosrq9wLa0qY6Ce393b3tvdXJuY1xmWFxdUk5NQT5KQkBKSUA2NjU7Nzg+Ojs4Nz4+PDs/OjkzMjc1NzU8PD48PDg+Pjw8OTk5Ozs7Pjs7OTw+P0E9PEJAPz9CQD47Njc6QERBQ0E/QUKJoJ2loJSWmJiVnqCcl5uYmZGMmYmDhoS1r7S7u7S1sLG2uq6wtLOvtbq1urC1s7GttrqurLyyuLm3u7+9ub7AtL+7vLq4vsK8wsrHvsC4ubaytLaztK+su7q4trnAw7aurqqytry9ubaysa2tn6Snp52jpp2WmZman6muuayrq5+lqKSrrq6nr6yvsbGtsa6usLmwtLy+uLm4x8W8vLu4qaKcmJufp6assq6zqaapqq6popqXl5GcmpijnqKir6ekrKaompqemqGnp6anqa+2squ0trCqsK+xqbm2sbWxrqy3s7avrquuq7S1ra+rq7GtsbKoraurs7W3ur2wq6GLeoJ5cnZzbXVpa11balRdXE9NSERGTEFGTUY4NjY1OjU6PTg7OTc8PTo7PTo5MjM2Nzc3Pjs9Pjo6Pz48PDw6Ojs5Oz47PTk8Pj1CPDtAP0A/QT8+OjU1OkBFQkRBQEJBiJ+ipqGYm56dmqWpmJudmpmUjJmHhoeGrq2uuLmxsqiur7iyq7CwqrK1ubm+tbK4tLm6tbm7tbWztbu8wLu+wLS/ubm6sbrDvMLKxb67v7+5tLSzsbGusLm5try4u7+ysrKusa65r6qrrayjqKGdnZ6XmKGVkpWXkJifqK6ko6Sgoqeio6mpoaanpaqtp6ynqKesq6yyu7SztLm6trK2ramgmpaWm52fq6yrr6Ojo6GpoJuTjo+Qk5KSmZaanaSloJ+ep5iVkpSYnqSjoaWqrK2iqaqppKmtrqW0sa6xraqprq+wraWmqqSos66trKmmpqmrpqqnq7Ksr7Oxq6mWgX+Bd3J4aHRzbmRUYGNXXFFOTEg/SFFETUM9ODg3NTo3PD46Ozw4OTw7Ozw7ODI0ODk3ODs7PDs4PD0+Oz08Ojk8Ojs9PTw6OkA9PDw7QD5CQEE/Pjk1ODs8RkFDRD9BQYijpqKjnqCfp6Coqpufm5yZmI6Xi42PjKqpqLGvsK2lp6ayr6mmq6CvsLu1vby4wMG+vLy8ua6tr7Kyurq3t7W1vLSvtKu2urjAxMG7try9uLKts7CvrK63trK0tK+qpJ6cnJyeqKifoKipn6GnlpuXl4+dk4+Qlo6Xm6SooKCioqKlpZ2jo6CepaCkrKSmqKSio6OrrLOuqa6urqeqraisoZyamJmYm6qoqquepaObo5yVkIyPj5CTkJaVlpifnp6amaaXk4+Slp2ioKWjpqSnoKKko6GhrKuksq2qrKyno6yuraufoaKkpK+srKmmo6KqpKqqpKmrpqmsq6agiHiDfHZ/eWJ3bG5cUWhUUE5HT01MQk9RQD47PjM5OjU7OT07Ojk9OTk8Ozw8OzkzNjk5Njo7Pz06ODs6Pjw6PDs5Oz07PDw9PjxAPT88ODtAQEE/Pz45NDk8N0FDQkQ9QEOOqqSjoqGinaulpqimoZ6dmZ2PmJWTkJWnpKGmqKmlpKChp6uhnKKbp6u1sry9wMLCwL7AuLSnpayqqLWysbCur7Knpq+jr661wbq1t7K3trK0q7K0rqqrr7Cys62lnpKYlI+ZoJ+ioJykpZ+eqJSblpeMl5GNkJeTmJ2iqp+fn6Cjpaicn6ChnKKfo6innKehoKSfrKisrKCpq6agpKimrKOdnp2Zl5qrpqmwo6WnnqCclZOQj5GRmJCWlZiWn5ibmZujmZeUlZqdoJ2nqKWgo6Oho56doKmqpa6upqipoaKqrqqnoaCio6msq6eppqShqaKlqaalpKKmpKijkn18gHV1fW1re2RoVVFjTUlIR05STkpORztEQD0yPzc0OTs+Ozk5Ozg6PDs7Ozk5NDg7ODc7Oz48Ojk8Oj07Ozw9OTw8PD49PUE+QEJAPTc6P0FCQEA/ODU1PDpAQ0BEPkFGlq6koqWeo6KpqKipqqWmnp2imJiZmZWbop6bnqOioKOgoZqgmJiXlqGorK62t7q5ure3u66ooKGpoaCtq6qmqaSpo6SupaystLy3rLKxr7Gtta+vs7Wqp62so5yZlI6RlpeZmZygo6KbnaWemqSXl5eWkJKRkZOal5ugpKqeoaGepqeqop+gp5+dn6SnqJ6jpp+qnaqtqq6nqLClo6Smp6ymoaShm5ier6iusqulqqqgmpiYmJWTlpqTlZWZlpqXl5ignpycl5uhmp6ao6eln6GioqOdm6Gmp6aoraOppZ6kp6mkpaWhpaSsrKmmq6eioKSjpKenoaCgpaKmoIl7gH12eHxkeHpgYlJVX0hJSUtTVElSUEw4PkI2Nz02NTs6PDw5Ozs4Ojw9Ojs4NjU3OjY5Pj0+PDk5PTk9PTw+PTs7PDo+PTw/Pz9APT03Oj5AQEA/Pzg2NT08PkFCRkBAR6CupKaroaOqrK6tp6ypqKCipp6bm56aoJyalZmfn5uen56WlJOXk5OcnqOorq2sq6uvqq+pn5eepZ6epaakoKKfpqCirqusrbWytqavtKupqrSxsLC4raehnJ2alJibmpGOkZWRjI+OlJminJejmZqXmJmUmZiWnZufpaapoKajnqeurqumorGjmqSmpqqioaqiqaSosquxsqu5qKarp6urqaysp6Cgo7GtsbG0qbGvopmcnZ6hmJubmpiZm5SVmpaYnKWhoJqjoZqdmZ+kop6gn6KmnZulpqWkpKijp6OepqOinqaloqWlqKykpq2noJ2dn56gpaGenqWgppmBe4F8dXZzaIJsZVxTWllNUUpOTlVMUkxBNz5CNzg9NzY6PDw9Ojw5ODo7PDo7OTc2Oj01OTw7QD03ODs3PTs9PT06Ozw4Pj09QD5BPj4+ODg8P0BAPT83NTg9Pj1BQEZAQUihqqCrq6GkqquwramtqaelpaWkoKGfnqWXl5SYmZ6YnJ2blo+VmZKSnJihnaqip6Cep6Gln5ySnKKbn6Gjnp2gn6Ogoq+urK+xrLanrbGtpqawrq2ssKegn6Kgl5GUnKGcmZiSk5+doqSbnpuWn5qfl5uinqWhnqSfpKitraisqKSstLe2sKe0rKKtraOvpaSmoamorrWzsr23vrCssa6tqaq0sbCoq6iytbezt6yxtKOgnaWgrKGhoqCgmpiWlZ+bm5ikoaCepKGgnpqcpaCfnZyhqJ+fp6meoaOkoKagnqehn5ymo5+ipaOooKmrpZ+dnZudmqainpyjnqeQgYJ/fHh1aXd1XW1aUmBIUVVIRlVWSkJNRz1KSDhFPDY3Oz49PDo8OTg6Ojs6PDk2Njo8Nzs+PT8+OTc9OT47PEA8OkA6OkA/O0A+QUA9PDk3Oj5APzo+NzU4PT0/QUBEQEJGnKueqamipamprqimqqWmp6aoqqGlpKOmkpOVmJacmpqcmpWTmZuOk56ZqJ2unqeenKGdnpqZkpmenKKioKCdop+fnp+pq6esqaq0q6utq6Wlq6iqrKqln56ZkpKUmJmWlpaMiIuOlZ2dnZ2elp6apqCgqKWxqqeuo6uttrC0srGutri9wLqttbSwt7CutKmmpKWsqbmztbvDvMPBtrq2q6+xube8r7OwtcG8t72zs7Whq6KpqLKpq6inqJqZnZqqpp+Zp6Cfn6eopaSenaqiop6bn6igpaetmZ+jnp6nnqCmnpycoqGbo6KhnZympaWkn6KYnJukn6CboJyjiYWEfnZxbWl3bWhtXFhbQlZNSkdNR0JGTTw+TD00PDk2Oj0/PDs6Ojg4PDk6Ozs8NTQ6PDg5Pj4/Pjg4Pzk8Oz0/Oz1BPTo/PjxAPj8+Pz08Njs/QT07Pzg1ODw8QERBREFCQ5WqoKapo6mqqKmjoamgpqinrK6lqaWpqpSSl5mUmpqanJiYmZyamJqqoLGit6OwpqCenZ2XmJaZnpucpJ+fnaSdmp2cpKKko6Kqr6ynqaOgoayurqqrpqCenqGjnp6em52clJOVlJ6emJSGnZqhm6ukq7KwubKysbKxur28vLm2uMO+v8K/trq6wMS5vbusr6exrbHCtrjCxsDIysDKv7C5ub25wr64tLvFw7zCu7ezqbKtqrO1r7Ouqq6jnauntrGsoq+loKOvsa2wpKSvo6GgmqGnoaSqqpmdoJmao6CmqKGcnqKemaSenpiYo6KhpJ6mmZuipJ6fm5ubnIeFgXt0cWtrdXJwaFdcUUVUSERJT0g+RUEzRUg5NTs9Njs8Pzw8Ojo4OTw4OTs4Ojo4Ozw3Oz49Pj02OEA5Ozs9QDw9QDk3PD07Pj0+PUI+Pjc6QUA+PD45NTg9Oz1DP0FDQkGRqqGlqqelqqimn6KnnKasp7Gyq62jqayVkpWalJecoqGbnqCinJ+psqu7sr+rr6ylnqChnZyYm5+gm6Cfn5elnZWbm5+anpyfpaannaCgq7Gup6Sko6CepaulnpeclJGZnZiUjIqGiIZ5bYigpKKrrLS8tsO+vrO7wcPCxcC/wsbGxcPIwcDFyM3QyMvDsre1vrK+xbu+zM3FzMzM0se+v8DCvcfGwrfDycjCwMW+ubS5urW6t7C1sqq6sa67tr67uqq3rauquLq0vK6tuKKlop6npaKjqaaam5+Ymp2nqqegoaGkmJSjlpSZkZydn6SeqJ+en6KdmJmUmJSIhH16cmtkaW94amVaW0ZKTEREU0xEQkQ3Oj87NTQ5OTc5PT48PDs7OD48Njo9OTw9OTw9Ojs9Pj4+NztBOj45PT45PT44Nzs6Ojs/Pz1CPj83OkFAPTw9ODY2PDo9QT9BQUE+kqugp66ooqulpKKipaGlqquwsq2upKmmlJWVmpaUm6SmnaGqp6KrrLy8v8PBs7K4p6Ghq6qinZ6hop6cm6CSn5+Qlp+ZkpqWnZuZo6Gvs6mhmp2dn5+al5iXkoyPlpeTjo2Qi4KDgndzcW5wj6atrrS5xbvNx8u/wszOzczIydHMzczHycXGzNDS1c7Tyb3Av8O7xsXIxdLTzNPQ09PMysLFxsbKx86/ydDLxsTGxMG7w8C+vr61vbOtvr/Cw8bEx8SuvriyuLzEwcG6vLy1rqenraigoqmlmpagmpmdqKupo6SknpePm4uQmYmVmJugn6OdnZeempOTi5WPhYB5dHNlYmdyb2ZeWllDTkxDRVBJREJANTU1ODlCPTY4OkE+Ozs+PDk+PTc6PTk6PDg8PDw7Pz8+PD0+Qzw7OkA9Ojs6Ojg4ODk7QT48QD8+ODtBQTs7Pjc4Njo8PkI+Q0FAPpOvn6ivpqiro6KloKampKuoq62qrqKqo5Kcl5ebmJujrJ6frqalsarFxszOzb+wwqmlqK2tqqGdo5+cnZqpk5mhkI6gk42UkpeZpLGxq6SgnaCbmZeUk5SWkZCPjIeEg4iHg4CBgYB5cnJvbHmktrq5vsvB09LTyM3O0dPR0tHQ0dHNzs7Qxc7U1djS183Gx8nMw8XKz8rT19HX0tTV09PIzMfNzcnSzM7TzcTHycrBxcvGyMjFvsKzs8fEy8rKzsXKv76/vMHHxMzMyMm/w7+tsLOonqKqo5qTnpyYnqaprKSlppaXipWFkZSHkpKSmZualpiQm5WQjIaRi396cnV1Z2JndmlkVldRRE1GQElRQj1CPDoyM0A8RDw3OTxCPTw9Pzs7Pj05Oj48Oz44Ojk5Oj86Pj1APkA8Pjs+Ozk9PTw5Njo6Pj08PEA/Pjk6QEE6OT44Ojo6Oz4+PEE/QT6QrKKiqaanqKSfop2qqKOso6OnpqyiqZ+To5iWn56dpK6bn7CrqKyxyc3U18/Gu8esrbS4rK6jn6Sjn6CkrJuWqZaNl42MjZemsK6lnZ6doaWhnpuVlJaUinx3cGtlYmhxb3F7hYqAdnBucXRwhbPCvsXR0dfW1tLWzdTW19TT0dPU1NLP0cPQ09bX1dbSy8nO0cvGzdLK0tXW2dXX09bYztLJztHMz9DM0s+/x8bKw8zMy87PxcbHtr/Jv9LMy8/Fyci/w8LIzszP0M/MysfNuLe7qJ+lq6efmJ6jnp2qpa2pqKiSlYiQhIyRho2MiJOVmZCWjJiSj4aHjIR8d3N2b2NgZXJiXVJcSUpGQUVIST47QDg9NDU4NTo3Njo8QD07Pjw7OUA7OTo8Ozs8Nz09Ozo+Oz08Pjw/Ojo8Ozs5Oz89OTU7PD48PD0/Pz46O0BCOzk/OTg7PT0+PzxBQEQ8hqugnKegp6Oim6CbqaSlqaCfoaGmn6ifmKSim6mmoqarmqOwsamotdDU19rSx8bLtLbCxrK2qaKlpqGiq7WnmrGhlpWMkKatq5yVmKGdm6Gin5ydm5WKd2ljYV9fX19eX2BeYmx1c3Fwb2xycXWSxMfG1NXW19fT1s/V1NrU1M/P1dTU0dHM0c7T19bT1dDP0tPRydPRyNDY19jR19LX2dXWzM7Pyc3Ry87Pv8XCx8XOzdDQ0cjLzMDKy8XTzsvOyMTJxsbIzMrT09HVz9LM0sG5xbGlqLWup5qorKWdsqiws6ysk4+TjoiLjoOPi4SQjpmNk4+Zj4+ChYx7enFzdG1hY2ltX1ZQX0pKQkZDUU0/PD40NDo9NTI3NTU8PEA8Ozw6OTpAOjg7Oj46PTg+Ojo8QD08OTs9Pzk6Pz07PTw9PTo2PD0/QD08PT0+OjxAQjs5PDc0Oj48Pz89RkFEPYKknKClnaWlo5mcnaSeo6OfnZ+doJqnnpyhqZ+vrqqqrJ6mrrioq7fY1NXZ2dHO0MC8zMm3wK+nq6mjpLG2s6S2qp+doaqpoZiWmJqbnaGemp2elH5yZWNiX19hX19hYF9gYF9gZm1wcG5rb3J3d5vMwNLV09jY1tnR0tLXz9POy9PN1dTRys/M09bS0dbN0NXV0cbR1MrR1NXWztLQ2NjY18vIzcPIzszJy7/Iv8jJzc3PytDNzsvOzsfKz9DKzsrCycbJzMrM0dLM09HQz8/Kvci5sK27uLWqtrCtqLits7+7sZqPn5SRjo2IjpCFkY2ZjJGRlY6RgIWIeXZvcG5rYmVucGFXXFpJRkZETFdFO0A8MzQ8PTg2ODU1Oz5APDk8PDg8Pjk8QDtAOj04Pjk4Oj88PTg7PkI6Oj08OkE9PTw6Nj09P0A9PDs9Pjg7QEE9Ojw4ODs+PD4+OkVCRT6Bn5mlp6Cfo6eam5+cl56eoZqdmpyappufpKeeuLa1ta2lra6+tLHA2dLX2tzWz83Lw9PQwsKyq62urKazsbirsbapo5+clpSXm56fn52UlpeViWxeXl5hZGJgYGFhYGBhXl9fXl1ibXJvb3N0dnZ5pL7L1dHW1NPY1s7O1MvNzsXOytLSz8bOzc3UzM7TzcrX1dDM0dPLzNDR08rO0dXS1dXKwMnBxczCyMnCzMLFyMnKzsrMzM/N08vFx8/Mx8fKxMbAxcnLzdDRxs/Ozc3Mz8XHwLe5vcPDvcO5srO+sbzExLWqmKWhmZaRlZWSi5SNmpGUlI+PlIKJhXhwcWtuaGBgcWhYWGhWTUdMSVBQQjtEPjs2Nzo4OTo1Nz09QDs6PD05PD05PT06Pjo8ODs9OTtAPD47Pj5BPDk9Pj1CPTs3NzY/PDw/PDw7PDw4O0FAPDo8OTs7Ozw9QTpFQUU+hJ6bqK2epKSqnJ6fmJKXm5+am56ZmaKVoamppcXDwb+7tbKxx8O5y9XW2drb2M3Mz8nW1sXEuLK2qqSurbi7wcXJoZeOjZiWkJOSkZaWlpCMfGViYmJgXV5hY2JgX2BgYWFgX11bXWdycXFyc3FtcnmkxtPPy9DP1NXJxcnJxsa/w8bPzsfFx83K0cjLzs3G0dLPzszUysfLzs/Hx8/Sy9DPxbrEvsbJvMLGyM7EwsfAxs3Hw8vJy8/Hw8PPyMbBxsfDvsDHy8vLzsLKy8jHy8/Exce7x8PIyMLPwL28v7DByse6vaqxsqelnaKcmJCbkKSZl5mRlZiJj4J3bnRkbGBeZnFhW1dgR0hIR0lNVEc/Sj02NDM1NT08NDg9PT06Oz08OTo7OT89OTw7PDg6PDo6QD1APD09Pjw6Qz48Pz04ODk6QD4/Pjw7Ozs7ODo+Pzw7Ojc5PD49Oz49RkFDPYOgm6qupa6qq5qdoJeUjpedmpmgmpqcm6WzsazJzcrIxL69us3NxtDV1dna29jQytDQ0tTKxbq+vrCot6rF3dbHsZGOjpaQhoOEhIJ+hYV/dGBbXl5eYF5gY2RjX11dXl9gYF9bWlxga3Jyb29rbG9vfbjRyMnKz8vNxLrAw7u7urq+yMbCw8DDx8rJyMrHwcXMxsjLzcnEwsvJwsLL0MTLyL+5wbrFx72/xs/Kw7/DusnHyLrHxsTKwL3By8bFw73FvLy/w8TLxMS8v8nCxcfRxcDIv8rKxsjG0MPDxsOvxMvHxMq3v7y6tKmspaWYn5iso6GlmqOgm5R7dnN0ZmpbYW5tWltYUURMRkJHRExERlNANTQzMzQ/PDM6PDw7OTw8PDg7PTtBPTo8Ojs3Oz05Oz07PTs6OD4+PEI+Oz88OTk7Pz07QD48Ozk5OTk6Oz06PDo2OTw+PDs+O0NCRD5/pZypsqm0rrCdnp6YnImUm5man6Kfmp2ov7i8ys/RzMfCw8fNz87N1dDW2djZ0M3Uzs/Qy8S4xsG2tbyv2MN1fZKMk5eHe4CFhoB2eHVycF9aW11gYWJjZGRlZGBcXF1dX15gW1laXGJvcm9raWxwb3OPxrzJxczAxsKxtrqysrOyscK8vLu5uMDBwcW+vbm9v7nEysXGwr3GwLi7xMm/wsm7t7q6xcK+vMHNwsa+vbXAvcO6vMa7wrmzvMXDwsK2v7W1vr+6y8O8tbrIur+9y8PBxcLGyMbIxtDGwszIssfKw87NwcXCv72yt7Czp6ioubGlrbCrrayUeXZ3amVoYGhvY1ZeWUpFSkZIS0FGQkVJQDk6NjQ4ODUzOzo7PDk8PDs5Ozk6QD46Ojw6Nzo7Nzo7Oz88OjxAPUA/PT8/Oz07O0A8Pj4+Ojk5ODk3ODo8PDw7OTo8Pjs7PjpAQEU+fqygrLWqt7SyoZ6fl5qNlJaan52mop2et8bCxMjO0svKysfNzs/SydHG1tXW2M7M0MjNyMrFvsrBsrW6utNwVo6OiouFeYCGhoB+hHx0dWRcXF1eYGBiY2JiZWViXV1bXF5cXl1aW11daHNxbWdnbnByeZ29zMDDusG4rrCwp6qtrKe4tLe0s7KzurW9sbewta+yu8K8wcS8v7u1srq+wLjHuLS7tcDCvLe9xsDDu7Susra6vrPEt7u1q7i8vcC9sLq1r7a6ssW8tq67v7S2tMW8vsPFwMPFxsjLxsDGxrvIy7/PysfDxsHDt8O+vba5vsa/rLW6tbe2jnh0eGdnZWJrbl5WXmBGS0hISkZCQ0FFRT88OjU2NTYzMzs6Oz06Ozs6Oz44PEE9PDo7ODc5OTk7PDo+Ozk+Pz1APz5CQD1AOjo+Oz89PTk6Ojo4NTY7PT48PDo7OT49OT86PEBAPIi3pauzsby8sa2foJmUlJiXnqujr6qnpMbLzsjGyc7M0M3OycvJzMrLxtHP09HPyMvGysbEwL3PvbO5vb25WH+ShomJe3l+hoZ3eIJ9dGheXV1dX2BfYGRhXmNlY19fXFteXF1eWltbXV9scG1oZmptbnJ8pMe/ubi1sKysp56iqqeeq6yzramrqbOttrCyqa6mrLK8urbDubq6saq1ubu0wrqwv7C9vLu1u8e5wratqqiwscC1uLyvsKexs7S7vKuttaWutq66sbCqua+tu667uLu/v725wr/Hw8XBvMbByMu4xcfFv8fDw7rExsK7xcnMy7O5wry6sohydnZraWFibGhZWFdbQUxLTUlFQUM/RkE6OTo5OTU4NTQ6Ojk7PD07Ojs+ODtAPD05Ojc5Pjk7PDo4Ozs6Pj45QT0/QD88Pjo7PDo9PDw4OTg5NzY4PDw9Ozw6Ojs+PTs/Ozs+QDyKwKuouLe5w62zqZ2ZlJaZoZymsLWxt6bGz9LMxMbBxdDIz8LEx8HGxsXFzMTLzMLEwcjBury7yre0vL23rXeTiY+QfHl+ioV6e4SBd25eXV1dXV9gX19kY2JjY2JgX15bW1paXVpaWlpdZG5vaGZnaWtucoGtubC1rqalp6eaoKSgmpylq66jp6KrqayqsKOmn6qttbaxvbmvuK+orri0tLy4s7yut7m0sbvBscGupamirLGys6e8qquoq6yttLSmqK6hpK6psqWnqK6lqLessLK3ubq7sby9vr7Ev7XBwcfIt7/AxbfEwr+7v8TDvsTIzMq/vsPAwKmGcnRyamldYW9kV1ZYUEhaUlNLRkZFPj9AOjc4OTc3NjQzNzo5OTo8Ozs8PDc7PTs7Ozw4OT44PTs8Njo9Oz89N0E+P0A/Ojw8Oj05Ojs6Nzc3ODg3OTw7PDs5Ozo8OTc5Pjw+P0E7jMKvrry3usSwtrCbmZWcmKqpsLGztb2vxtHQzcTIu7vMw8zAvMq5wMbAvMy6w8fFur3Evrq3vca5trm7r7KShImNgXt+gH54dH98c3dmX11cXF5fYF5fY2NhYmBgX15dXFpYWVtbWVhaXF9ma2ZlZ2Voa29yhaqlrKagnKGllJ6km5eRoaOqo6KfpaWnpKyfnZukpqyyr7a3p7Csp6q0q7S5sLa0rLa4sa+6ubG3pJ+jn6exp6uouaqkpqeop7KtoKemnpukpqyen6ekn6Cxra2ssrSytLC1vLa7wcGyur7DwbK5usKzwL2/tbi7vb68wsfEwsO+v8Ogg3dwa2FlX2tvYFVZX0hOaE9USEVKRjw9Pz06Ozs4MjU1MzY5OTk7OTo6PDo3PD88PDs8ODg8OTw6Ozc4Ojo8OTg+Oj89OTg8Ojs9Ojc2NzY3Nzg2NjY7Ojo7OTo7PDg1OTw6Pj5AO43Itba9uLrBu761oJ6VnqGmurars7O7s8XQyczDx7m4ycLOwbrLub3Iu7fIu7fExrO+xby3sLnAu7Gzt7CjhYeHgn15dnRvbWtqanFpX2BdXFxdX2BfYWNiYGBgYF1cW1xcWFlYWFhWWFtdXmRjYmVnZ2dqbW+Inamgl5WaoZabopiVjZ6hoqabn5+jpaGnnpqim5+qsK2xtaKpqqmrrKS1uK23r6yytK6ytK6wqp+dnqOisqSlqbitoaamn6isq5mfoJ6ZnZ+lmpmjnJudr6mrp6qrrK2wsrivuLm7sLa7u7qrsrK5sr20trGxtbS/tb3AvcPBurq9l4N6cmtfZV5kZFhUWF5JV11LUEdJSkZBPD8/QDs/PDA0NTM2Ojs5Ozg5OTw8Nz4/Oz07Ozg4PDg5ODw3ODo7Ozo7Pzo9Ozc4PDo9PDc0Nzc2NzU3NDY2Ozc5Ojs6ODo5ODo7OTo8PzuJyba4vru3wcHBtKSkmZukpsCyr7astLfG0MnJwce8vMXF0MC8yru7wbu2xbi1wcGzwsS8raq1ureosbOpi4aIgHlzbnBua2JeYmZmXV1eXV1dXF1fYGFiY2NiYV9cW1taW1lYV1dXV1hYWFteYmRkZWZmaGlrco2onZSUlJuYm6GWlpCcoaGonZucpaahpJufoJqYra6trrKgpaKtq6ehtbCxsaynrrKnubOmtaGinpqjoq2ioam1qqKjpp2lpqOWmJ6XmJqdn5mXnZycm6yhq6ajpKatq7OzqrSwsqqyubSvqa+ysrK3s62prK6xt7C6trm9v7aysZSFeXVlXmVeW1lWU1pVS1tRTElFSEtJQj0/QUFAQDoyNDUyNDk5ODk7OTo9PDY9Pzs8Pjs3Ozs3Nzc+Njo+Ozo4Oj07PD06Ozw6PTs4Nzk3NDY1NTQ2Nzg1Ojo4Ojk5PDg3Ojg5PkA6gci9uL2/tr69v7OdpaOYpbHCtba9rbS4w83JyMHGuMLByNC6w8bAtry9tsO6tr/Btbu/u6qmsbuxqLKvm32FhYB5cHF0cWhmZGllY1xcW1tdXVxbXmBhXl9fYF5cW1pcWllYVldXVlhXWFhWV2FkZWNkZWRkaGp2opyUlI+Ulpefl5mUmJ+eoZyWoaGoo5+dqJyamqqmr7Crm6Ojt6qgn66otqmmpqywo7ewo7agopuYmKqmoZusuK+ioaScoZ+gk5WhlJaWm5iXlpeclJ+pnamjoZ2jqqqwrqi0q6qmrbKwpaqusrGvsK6up6ensq6xtK+8tLm2rqOUgXl1ZF5hVllXU1JUS01eTFBLR0dMS0U8QD48Qjw7NzY1MzQ5ODg5OTo5Pjo4Pj47PTw8Nz49Njc2PTc7PTs5Nzk7Ozw+OTk6Ozo4Njc2NTQ1MzEwNDU2Nzk6ODo5Ojo3Ojs5OT1AOnbAvLS5wrG+uLyunqeno6q7wL3Aua60uMLNyMfExb7HusrNtcTFxbG/wLnAwbrAwLm6vbeoqLG7pqmipYmBfnhyamxydHBpaGVkZ2JcXFpZWlxcXF1eXVxbXF5cW1xZW1xaWFZXV1ZXWFdXV1VbY2NiYmNiY2RmaoGWk5WLkZSTm5mclpaboJyflaCfpqWkpaaenJ+kn6qvpp+io7aooKGiqLOhpaekr6WwrKu0nqCdlZSpoaGUrLGwnqKinZ6Ym5OLoZSRk5eYkpeXmJadppumoaKZo6Wlq6SlsKelo6urraWorq+uq6iqqrOlpquvtLGuvLWxr6+gknp2cmRhXFpdWE5MUUdSYU1WUE9KTU9FQkQ/OT02OTo3NjQ1OTk7OTg4Nzs4OT0+Oz47PDY5Ojc7Njs3Ozs6ODU6Ozo7OzY8Ozg4NDY4NjMzMjEuLzI1NTY7Ojg7Nzg3Njw7Ojs7QTh4u7uxtb2wu7K3rJ6kp623u7zBxbqxubXFysvBxMfHybjIxrXFwsmvurzCvMPAwb28t7q2pqeytp6iipmHgHdvZGJnaWhmaGpnam1gXVxbWlpZWlxdXFtcXl9cWllbWVlaW1dVWFdUVFdVU1RSVWBgX2BhX2BhY2RpgZSTiZGOlJKTnJSVlqOZoJacoKWhraWjo6KjoZuqqqWZnqWxqaCgnaSqnaehnqysqaitrKKhoZSXo5uckKupsJufop6el5iTip6SjZKTlY+YmJKboaKcpKChlaChpKabo6uloqSqo6uupK6xqaalpqa0pqmorbO1tLm6r6qsnotycG9gW1dWVVFGUU9IWlxPUklUS1NMRUdJQzg7Oz08ODY2Nzo5Ozo5NzY5Nzc6Ozo9PDw3Ozw4PjU5ODo4ODY1OTo7PDk3Pzw5Njc4NDUyMTIxLi4xNDI2Ojg2Ojg1OTg5ODo7OUA5e7W0rbS7srCssq2dp6evubmzwMi6tcCvxsnOu8LLzcm3y7+0wMfMsLa9yLvCx8S9v7e6taWrsK6dmoeOg3x1aWpqbWhqbG5ra21lXVxcW1tcWlhaXVtbXmBgXFhYWllYV1hXVFZWVVRVVVJTT1FZXVxdXl5fX19iZG2Oj4SRho+Rj5mTlJKcmqKcm6CnqKqnqqWopKOYpK6klJmlr6mfm5iaoJ6umZuqs5+lpp6io6CUk5uWlZKoqa2anKChoJqUkIyZjouQjJKMlpSQnaGgo5ybopWboKKgl6Koo6Koq6Crr6Stt6Wjo6Ksramoq6+zuLK9tbOrr5iDcnJoW1hZU1VSRVlMUFxZTVRPUExQUklOSUI8Pz9BPz02NTc5OTw8OTg3Ojc5Ojs8PT47Nzs7Oj02Nzo7ODk3Njk4OTo2Oj05OTU3NzU3MTE0MS0rLzQzNDk4ODo6ODo6NzQ4PTg/OX6zrqiztq6pqK+tm6morLe2rLzKu7a/rMzHxrnCz9DJtca+ur7Gy7WxvcW9w8bEvcGzua+mq6+rnpeGgXd4b25pbm5ucWdnaWdkXVpbW1tbXFtZWltcXF5fX1xYWFlYV1hXVlVUU1VWVVVUU05QUVlaWlpdXFxeX2Bkfo2Bi3+LkIqSjZeRl5mioJufqqmmraqmr6KnmZ+soJWWpKinnZePjpmdrpaXp6qZn52TpaCdkZCSkpKVp6qkmZmanZ2WjYyLlIaIjYOQi5KUkKCeoKOXlZ+VmqCinZObpaWnqKigsbCmsLynoKOstKutp7C0sLm1wLGtsauQfXByYlZUVU5SSUdWUVNSTExYTUpMTlJHTUtBQ0ZEQz5ANzU4ODk7OTo3Ojo3PD06O0A+Ojk7OTo/NzU5Ojk4NzY5NTg3Nzk7ODU1NzY2NjEzMjAtKi4xMDI4Nzc7OTk7ODk0ODs4QDh/s62msbeqpqKwq52qp6mysaS2xrS5urPLxrq8w8vRzLO5ur7AxMe2tLe9s7u8xL7CsbSusa6xrJyiiGtobm9yb3FrcGtkZmdlXlpZWllaWlpbWlpaXFxdXFpYWFhZWVdYV1VVVFJTVVNWVVJOTk5SV1hZWVlZXFxdYWqAen91iY6HkImYiZSUl5uZnaibn6qkpKqcp5igpZuSj56impeWhIORmqOPk6KclZWWh6GampOLjoqPmaOnnJWVl5uQkoeUjoyBi42AkIqSkpGhmp+hlZOYmJWipZiMmaSmqKahoLSyp7K3oZ2it6yqraSysqa1vLWsq7GjiHhybV1OUFFMT0NOTk5QS0ZOTktKTk1RSU1KQUdLSEhDPjg1ODg4OTo7Njk6Njg7OTk+PDg6Pjk7Pzg3ODk6ODg2ODU3Njg4OTc0NTc3ODIwMzAxKyktLzEyNzc2Ojk5OTk4NDk4OEE3d7anpLawpKekqaWgqaWks6qissO1tbKzx8e4u8TKzce1r7y/uLzEs7OutqKttcS6u6+qrLSvr6CXqH1eYGdzcXZxam5pZmhoal9YWVhYWFlZWVpaWVtbXFxZWFhXWVlYVVZSU1JQUVRRU1VRTk1LTFNXV1ZYWFlYW11hb3N2cYWIgoeAkYOOipSRk52gjpqboqCjmKSWoZuVjYeYmoxzjYJ9jZaWhZCZkJONjnqYjpyMgop/iZifop6Qk5iWhI6Ck35+dImOepCGkpCQnZqZmpCVj52OoqOOiZqgoaSjm6K0r6yvrJ+YpbmmpbChsK6csLuqqa+qmYF2cmJWTFFPUE1DU05MUU1DUFBISU5TTUhKSkRKTEVKSz03NDk4ODg7OzY5Ozc6PDk6Ojs3OT85PkA3OTo8ODk3NjQ0NDU4NzQzMTI0ODUvMDEwMikoLC0xMjc2NDc4OTo6NjU6ODdBN3e3oqO0qKWlqKOmpaamprOnpbTAuLC0sMrGubrCz8e/ta+9w6+xx7Ktp6yVpK6/uLGwn6etrauWlaJyV1ZfaGdpaGluY2poZ2JcWFhYWFhZWVlZWVlaW1tbWVlZVldXV1NUUE5QTk9PUFNUUU1NSkhOU1NTVFVVV1lbXWlscm1/hXx0Tlhyj4KXho2cl4qTkJ6XnJWUlpSOlol/k4lfO1dve4uTiX+LkYyPhYZyioSWgXmCeoWTnZSDlY6Qj4KGfZJ4cW+FjX6JgJCNj5eZmJOKj4iciJ6Xh4eWnpqhoJenr6itqaifl620oqatmKyrmKe0oqmto5J9cW1fWk5TUVZMRFRKUE1MRk9PSkZMUU1LUEpJTVBGSUg9NzU5OTk5OTo3Ojs6Pj44Oj09Njo/OD4/NTg5Ozc5Njc1MzMzNzYwLi0vMzQ0MTEwLy8oKSsrLTM4NTQ3Nzk8Ojc5Ozg2QTl4t6CjrqGmpqqgp6mnoqmwqKe0wbmxtbDJw7m0v8/AurGxuMSrrsmup6Oehpuiuq2nqJampaShl4+WaVFNUlZaWlddXmJnY19ZV1dXWFhYWVpZWFlYWVpaWllYWFZXV1VTUk5MS0hHYlxNT1JNS0hGSE5RUU1QUlRWWFpgbW9pe4J0UEJAf5WRkX2JlIyEio2ajJaVipKIhpWGeYh/YEpRbniKkYR8hIyJhH9/bn5/lHd1dniEjZlwUY2IioZ7fniUdmd3hYh+ioiVio2QkpaLg4mHlISajIGEkpuWnpyUpKOnqaWjnpuwq6GkpJCmqpahqpyipqiIdGtlXVtIUVFTTElVTVNJTExQSUhGS09MTVRLUVFPRklDPDc2OTo4Ojs7ODo7OD4/OTk+PTc7PDY7OzQ3ODs2Nzc1MzQ0Njk2LzMvLjExNTIyMS8sJykrKiw0ODMzOTc5Ojk5Ojo6Oj85draco6edn6Guoaeopaeor6yqtry2uLazwry3qLrJubepqre4rbbAqqKbk4OPmbKfopqNoJaZlJCKjGRNTE5OT0xNUVdbXFpYWlVVVlZWV1lZWFhZWFhZWVlaWFhWVldVU1BNSkVAQJtrc3NJTUtERERJTk9oWU5RU1RVWm6DdHd+amldVY+JlIl0f4aBe4WMkoGSmYuPe4aPf3V/eHNudXB0jY2BeX2JqoV5emh2e45wcm14gIqMknh6gHuAdnNykndndYSEhIR6lYmIioyLgH+Eiox/lIN7gI+YlJuVkZ+dqJ6foJ6gqaWfnZiMp6SToKCWnZ6kf3FnYFxcSlZPUUdLWFJPSkxNUkpKSk1QSExRTFJUTUVIQTw3ODs5OT49Ojs8OThAPzo6Pj03PT03OTkzNzc5NTY3NTI1MjU3Mi8yLiwuLzIwMC8tKygoKS4xMjYyMTk4Nzk4Nzc2Ojw8N3aumKOhmJyes6mvqaWsrLCxqr20sry4trq1sqC3u7OrnZ+tq6y1s6WelpKYhpSklp2Mg5eJj4mFhYJkS0lKSUdGSEhQVFRUV1dTVFVVVVZXV1dYWFhYWFhYWVlXV1VWVVNQS0Y+OTNOPH6eTUhKREA9QURqlH5MT1FSU1ZedYN9eWd3jZeYjo99Z3mBdnh/iY98hJiSgXKHj3x2e29rfq18c5CKf3uGkoB9f3RmdnyFbG9oc3yJjIeAbHlxfXBtdY9xaHGAfY5wQ4qEgoOFfnd3eouFfYt6dX6Oko+YipKam6OXmZ2bnZ6inZaNiqSbj52XjpaYjnVta2VhWVdYVFFKUlVUT1BOUVZLTktOT0pRT0lPT0tGRDw7Nzk7Ojo/PTk8Ojk5Pz87ODw9Nzw5OTk5MjY2ODU2NjMzNjIxMjI0LiwsLS4uLTAtKyonJyouMTM2Mi84NzY5NjY1Mjc5OTV5ppefnpagpq+srqunqbCvsay8uKy7vrmzraibsaitnJCXnqesp6SbnZOIln6OlZKVgHyKeoWAfn5/YkpHSEZCQENESUxMTVFSUFFTVVRUVVZXV1dYV1lZWVlZWVlWVlRTUUtENzhmNzA/qGlOSEM9OzpEioV6WkpOUFFUWF5lcHJtiKeqwH51eWJ7eG98eYiPeXyLhW9tjJF4c3hqan+CcpaRi4F9ln9JkphuaHd+gWxpY2x5hZCShmtzbHxucnuGaG1wfnONiIOFen1+e3ZvdHSFgnmBd3B8joyKk4OWl5iakJOWl5mXnpeMg4mfkYqSjIaQln1saG1ubVdVV1RRUVlPU1VUVFhVTU5ITUpNTktDSU5HRUA6ODk7OTk6Pjw5PDs6Oj0+Ojg6Ozk/ODY4NzI3NTc1NTQxNDQyLzAyNCorKiotListKigqKCcsLTEyNTAsNTU2NzQ4NUhBODk1d5mRm5manqStr6Ktqqi1r66stL+rvMK/pqOalaWYno6FjJaipJualJePdpF+hYuQj3x4fnR9eHR3eWRPRUdEQDw+PkFGR0dLS0tNUFJSUlRUVFRWVldXWFlaWVlaV1ZUU1BMRTFAmjMganJBmW87PDk1PICChl9JTU9PUldaUllcYKeIYpppdHplfnBtf3qLiHWBiIZ0bJmRdHN7amudjkx5hJKJhI5nMXaGc2x+fYN0ZmV0foSEhYBmaWx1a3B/fGdwcHtuko2Oe3N9fHFwbnVtgn53eXRpeYmCiImDlpOSkIuNkZSVj5eOgHmIl4iGiYZ/kId1aWluZ2NXUVlXWFlbTVBVVlpZTklJRUpKSEdCQUZEQ0c9OTk4Ozk6OTw6OTs6OjpAPDk6PDk4Pjc4NzcxNTI0NDUzMzY0NTAzMS4qKispLCwrKykoKycpLCwyMjYtKzU3NzU0NzhpTzg7NW6SiJmRmpakqK2esp6muq6rsrDCsrvDx5uXj5SZi46GeoWRmpaPko6SiXSKhHeLj4x/dnd1eHZveHJoVUZJRD88Ozk6P0BBRERFR0pMT1FRUVFSU1RVVlZYWlpZWFZVVFNQS0U4MC9cYLNHOVhQOzk0NDGWuotITE1PUFFWTEFJUUlir7OgcXx4bX1tcYOBhYF5hIaGeXKglHR4gHN1lIc1cZ2onY6hoYSihHZwhnyHfHOMrY2IgGhmYmlucm1wg3Vpb1h1b46akXZsf3p8bXFtcH96c3VtYnaEf4aAhZCRiouJkYuRjIuPg3V4i4+AfoKAfY94cG5ual5aW11bWVhgX1NOW1pZWExISkZKRz9DQUJHP0NEPTs5Nz07Ojs7OTo5OTs6Pzw4OD06ODs2NjY1MTEyMTM1MzQ3NTUzMS4vLCwrKSopKSoqKikoKikrLzNETTIxNjY2NDM8dlI3PTdikoGSiJaRnaSnnq+VpbSorbGuwbO6wcaXkIyUkIGJfW6CkZOKhIuIkIh2hIVvmIqMf3l7e3F7dHxrb19KUEc+QDc0NTg7Ozw9PkBCRUlMTExNTlBRUlVVVldYWVhWVVRTUExFPDUqnUtbQC1nSTk0Lz+Sg6muX0dMTU5QTDdDTVJTREqGdoB8fHZ+bHaIiHx9hYN/jH52opl5foaAhJmFm5xhhqqfnYuCkI16dol+iYiOc4qXj4N7XGRxdHp7d4psZ2lheG+Fj4J6boF3c4R6cHN5d2tuaV13h32HfIiHj4CLk5eDjYaNhn1xhH+EfHV3e32IdG1xcmRlXlpaXVNbZl5YUVVZXFZHS0tFTEc/RkBEQz9BQT06OTc8Ozs9PDo6OTk7Oz0+Nzk+OTk4Njc1NDI0NDAwNDY0NTY1NC0sKSsoJycnJigoKSkoKCsrKy8wMFVxPDIzMzMxRX5XND05XIx3iX+UjJGdnZ+mkaCqn7Cpr8Cxu8a6lo+RlIh6hnZrgIySg36LhZCNeYSCdaKGjX5+goBzg4F9a3psU1hMQUUzMTEyNjY2ODg6PD9CRUdGR0pLTU9QUVNUVVdWVlZUU1BNRkA6Mj0gI5ZjjFs1MzExaT9Hb0lGSUxNT1JMS1RdWVJKaYSJe4l5e3F8j4x7fImGfpeHdqGZiIePkpSljaypSIatr6+KgICTioKLgoSRqIeAmJiKnHNsfIGGh32OaGdneH5uhYaBhXGEhkdrgHdxeXZobWtfd32DiH+IhYx6lZ6ciouJkX97dYt2fHdtb3d+fXFxcGpaW1taY2JXZ2VcVVBRWFpRRExMR09JQ0ZDQ0FAQ0E9OTg4Ojo6Ozs6ODg4Ojo/PjY7Pjc1OTU3NzMzNDQyMzY3NTY3Njg7REZMTU1MQzcrIiYnKykrKywvMDArbnUyMjQyMEyBXDU9PF6EdHx+ioWHkY+WmJKXoJ2soaa4r7O9tJeNkouYi310cH+Kk39+jYOUlX2Gf4elh4mAg4iGeYmLgHWFeV9jVkxDNjAuLzIyMTIzNjY4Oj0/P0JFR0hKTE5RU1RVVFRWVVNRT0dDPzgwLCOHWz4/ODQuXZZwc6NVRklLTU5QV2BZcFpcXmqNk4eVgISChZGTfoWJkYGaloKgoZiVm5qlrZOZu7Gnu8fDp4qMoaWOk4mBkHtyg56fkZx+doWFi4+HkGlob4OAdIyGhItxhoJ3h397doV9bnZ1Z4GUj4aJiIiJiKKro5aJjpiAe4KJenpvZ2t4fXd8cWljXFlZXGhcYWZfWk9MTlhTUUlQS0ROR0NKRENBRERBPDo4Nz08Ojw6ODg3Nzg6PT04PD02ODc1NjYyMzQ0NTU3Njg2NzxCQj88ODo+Q1FeZVxHMicmLCwtLS4xKD+MWy4zMTBPg180PztudnBneIN7gIyAgZCPi5qapJyhrKarr7CXkpGEoZSEeHeAjZR9f5KGk5Z+ioGSm46EgYKMi4KKjoSAioBtcGpeQ0E0LS0vLy8vMDIyMzQ3Nzk7PT9CREhKT1FSU1JTU1RSUE9IREI8ODcvOUM+PDw2My5sk5dNUEhJS0tLTlZgY39nZ211nZuPmpOTi42OmoiTj52LoKGSo6mlo6yTqLaip8HCrsiveLqUmnyMoZ6YhJOFgo+hnpOZkoSKhY+YkJZscHWJi4GVjI2Pdo+EcWyFgYqWkoOFiHKJoZeHk4mPj5eltqmbjZWig4eThH5/a2psfX59f3FfW2JeWWZqXGxrX1hLSFBTUU5NTEZJUURETkZCQ0VHQj46OTc9PDo7Ojk4Nzc2Nzs6Nj06Nzg1NDU2MzQ1NTY2NjY4NTU2MzEwLiosLCkoKS46UGFcQCwoLSsrMCwncog3MjQwT4RiM0A8dW5nWXCDcHWHcXaRhn6XlpqUn5+bp6CqlpOYnmhmpJp+hZOSeoGSiZKSfYuFmZKRg4GBi46JhpGHhIiFeHh/aE5SPi8vLiwvLi0vMDAwMjEyNDU3Oz9DRk5QUlRQUVFTUU5QSUVEPjs8OkNGPz48NzUyPD9SNUhISExMTU5SXm+KfHOBfaCdm6emopmhl6KVnJ+onqmrn6isqaq1l6u/q7bIybfI0c++m6Bwaaupn4STkoWcoJqamaeRkYiVoZmad3p+lJeRoZKWl4GUnnt2lZKrs4mNl6B9lZ6cjpOWmqSjp7awnZGZqIiXkI6BiGxzc3t8eW5mXltfXmFnY19nZ1xSRUtLUU9JSk1GRk1DSExGRkNCR0RBOjg1PDw4OTk5NzU2NTg+NzU9ODQ3NDU3NTQ1NDY5NTg6NjE2ODYzLzAuLSosLy4tJyMqO1hiQigqLDEtKEuXXjA2M1GFZjNBQGliXlBxdWBufWF3jn18lI6Oip+Sl56WnKqYnqpCRH2HiYiYjXmCjYuOjXyKho+QjoGDgImMiYWThYKGiYGAh3dfYlA0NjAtMS8sLjAwLi8uLjAwMTU+QUFNUVJTUFJTVVNOU0xFRUA8Pj1GSEBBQDg2NjI8OTtGSEdJSU1PUVlthpB3lYujp6q1vbilrqysqKm1rLG3srKtu7GzvpyzxKy7ycu4w7+3paOwsqytqqOLlpiFpaagopiCppmNoqqnpIeFk6OgoKqgpKmOnLGLlaOnt7ucoaOwk6Odo56RpKKrsK2ztaKVpqqJmoqTipV6e36De2VeZlpjYF1iYl5mZ19bT0RJSFRPRkhMRktHRkZIQUtGQ0ZGQTs4Nz08ODg6OTc0NjU4PDU0PDc2OjU0NjQ0NzM5PDM4PDIwMjU1MS8xLi0qKi8sLSooKiYlNVhYLywwLCwwhIE4NzFQhWg1QUNbWFRMaWNXanBYeoV2gZSFiIKbg5KRjJLayJ2Wc1aXiI+InI98hoyPi4p7iIOHkY6DhYGMhoWIkoaChImGh4eHcW5hQEU2NDwzLzExMC0sKy0xLy00P0RBTlZRUlNVVVdVTVxRR0dEPD4+RkhDREA4Ozw1Qzs9RktJR0hST1BXgZOghK6js6qywcfEq7PFtq20wLO4vra/tMG2u7ukuMaptsnHtr65tKijtK2wsZuZkpqfiaevqqSVd5+kl6GrsbOYlqmtqK61u7K6rK+1orGssrW8uLSutaCoqKOom6mwrbO6uLionLipjaWPkpOgh3mBgHJXX2JVZGBgYV5fZmBbVUpERUxWUUlKSkVKSEVBQEBLREJNRjw4Njc7PDk3Ojk4NjU1NTcxMTw4ODk1NDY2NDk3Pj0zODkxLjAxMjExMzAsKiwuLCsrKyooJyopRVowMCovK2iSTzYwUodqNkFFV1FKTFxaUWNkV3p1cYGVfYSGk3aGfoCNe7+7o7yCtJSTjpuPhIiPk4qJeoeBjJONh4WBjoCBio+GgIaIhYqHkXp5bl1XQEVOPDY6NDZBQjc2NC8vNkNIQ1FcT1FVWFVcV09fVUlLSkFAP0dLRkZEOz5AN0Q3P0JKSkVHV1RQXo+kraSytMO2uMHMyra7xL2ztMG3uMK1v7C4dLG0prrFpLDGubGzsrSopLa2qrGgopabopKlsa2lraynpJigrLO6oqiyubW7vsy/xcW9vbPCt7q3v7i6uLqtrbGmsaquvrC9vMPDrJm7qJWuj5iZq4l+gHloVWFfVmhjaGRWW2NZVlRKR0dMUkdESUpBSUQ+P0JCTEBATUQ5OTY2OTo/Njo5OTY2MjQ2LzE5NTk5MzY0NjI3Oz0/NjoxLi81ODo5NjUwKigsLS0tLCwqKCgrKyhFUy8qMDBKj2s1MlCHbTY/RlJMQUxSV1RZVlp3anB/j4SBjoVve3J4iGK5oZmjiZWUlpOUlI6Ql5KHh3uHgY6WioGEgYp6fIuIhnyKgoGLhJV9eHp1Zk9cZEdFTDpRZGBbXlNGPztIUERaY1FRWVlaZ1pTYGFNU09FQT9JSkhFRkFAQz1FNkI/SEdLTVNaVF6Ur7i1u7nJwLu9ys28vMG8uLa8u7e+tbqzxmF1sqWxmp6rvqqlqKuqpKKytaCrp56Vlp6Yn66lp6eln6SToqews6iysry2wb3TycnTxsLFzMLKxMC+vr+8vLi0sLm3t8O6xr7EybCeuquirI+lqbeJgHxuXF5eXFVfXWdmU1lhVlJWSUVGTktBPkhEPUtCPUJAPUY+O0hANzk2Mzc5PjQ4OTo1NzA0NS8yNjM4OTM3NDUyNj84QD5HS1JUVFJQT1FSUUpBOS8sLCwqKygoLC0sL1A+KC40OIB9PDJLiHE5PkNLRUBKTVBSTFFdaG1scY+NhpBzbHJydIjVwLWaoI2VmZmRjpeSlpaOhoh9h4ONlop+gn+DeXuLhId7i3mBioKXf3R9emxlcHZZXVxQZWViYGVkXVtYWFxNZG1VUm1uX29fWGdlVVlUS0RCS0tIRkhISEhCSTlEQEhLVFRWXVpck7nAub64xsG7ucrLu7a6tri5tLi1ta62t5lkdamerXBeoq2cmKGim6Seq6WUn5+QlI6WmJeonqafn5qZg6OdrKSqsa23sLy41NDO1s/JzNLMz87Kx8C/wsq9wb3CwMXExsrAyc+0pLyxtbCcrLm9mn12aVtcWVdbX1hhYlFcYVRSTENCRkdFPEBGPkJJQkBEPTpFPj1KPzQ3NTM1Oz00Njg5NzcwMjIvMjQxNjk3NzU1NTVEM0VMTT41MTAwMDY6NDc3QElPSjsuJioqKC0uMCxATSsvNTRtiUkwSIl0Pz5CREBDREdLT0RSXFppYG+XkpGUbmxvdHWHs6yhoZ+LmZyZjY2VkZuShYqKf4iHjJCLiXyBhHN7ioOFe4p0gYqHlX90e3lsbXV8aXNlaWxoZmppaGBmaWltWm10l62kvYiHZ1tvaF1aWVRIS09QSktQS1RRSExBSkZLUF9fYmdqYpe3x7C6tLu+trHFx7awubGxu62zsairuK2NtqienKeaTpqejI+glpGnmKWVipOTiJGJj5GSnZuhmJuVloeemaaarLCor6ezs9PU1NbRy8/T1M7Tz8zGw8rQv8rJy8nSyM3Ow9DSuLDEvcS6pre7xKJ/a2FaWltWXlZZY1lQXVhPUkNCSUVDSTtBRD5CSD9AQjg7RD5AST01NjY1NTs6Njg3NjU0LzEwMTQ2Mjc4ODc1MzY3QzVCOD8tMCwxMzQ4PTk3LC4sMTtGTD0pLCguMDAwN0s/LTQ2VIhXMESHd0M7Qj5FQkFDSk0/VVlTZldzkJGZg2hyb3l5g6GqnqaXjJubmIuOlZGajn2Ji4WOioqLkIh8hIJwf4eBhnuHcoOSi49+cXl1bHB4f3J7bnhzbGmAcG1jaW5weWl3fX7Lv8Pfp25jeG5kW2FgS1BSVU5ZXlBeXU5RTlRRVVRcbm53g3KWrristaiwtqutvcGyq7WmpbmnrK+hrLSkj7Gum5iYjJGUkYSPm4GNp5GciYOLhIqJhIuDlJWXl5SbkJyYmZmenquspKeirKzO0tXRzczS09PQ1NHOyMPU0cjO0tPT183S0cXS1sbBz8jIw6m/uNCcdmtiWl9bVF5RXFlPUFRQTkk+QUdCQ0Y9QUI/RkU+QD86PT08PEpCNDU0NjU8ODg4NjY0NDEyLzAzNTI2NzY4NTMzOz08RT1AMTErLzM0OT81OTAxMDIyLTJFTzMpLzMuMzI9TjI0OEN9XzJBhnREOj09ST5AQ0ZIPFZSTU9bdYeGi3dsd3B9foCgnp6hjI2Zk5SLjJOPloV5hZCQjouKiJGHf4J7cn6Agod6hXaFk5GJgG93c2xzfXx3fHOCeHFrgHJyaXByenlye77Lmn+NsoR2coV3aWFpXURaWltXZmRYZWtUWF1dYGNeY3h7f4uBmaqkpKKgoammqrG5q6a0o6KuoqSuoqexn4mmm5WTkYqSj4iClIlrlaKNmYSBhn6Rg4OTl6yLlY6Vmo6FkpCdl6ewoqChpaSoyM3Px8LL0NPR1NLO083G1tPN1NjW1tjV19XK1NrNytjW0cutxMPLiG9sX1xcVlJXUlpPSkdJSkpAOzo7RUJEPUNEPkhDP0NCOzw5PDpHQzQ2NTQ0PDU2ODc1NDMyNTAvMjU0Njc0NTU0NDw+PUU/QTYyLy0xNjs9MDgxLzI1NC8tLjtSMDE3LzUzMkVEMjg+bmI1PYF0TTk5QEk8QUQ/QTtQTEZLWXCAdX5pc3lygoqAnZWelIWLlomPiomOiI+AeISUmYuNiIiLiX6DeHN8fYSHd4B7h5GXgYRveHFtdX92eH10hnx5bId2dG59doV1eXudtYw8QYvGpX6NfWplV0lDZWNmY2hqZG95W19maGtuaW6BhImRjJ6foJ6Rl5mgo6SmsqSlsqCipZ+iqaGisZyHn5KSk5GLj4uHhI+EfpycjI2ChIV6lH+CqpajjJKLmJOLfZeKmpGqs5ibnKecpr3Dxbm2xc3R0NLQy9LLydTO0dXa19fY1NnYzdjbzsna2tLWv8zNtHVza2FaV1BTUFhVRUdKSUZFPTo3OkBCQzpIRUBFREJEQTs/Ozs3REM3NTY1NTswNjg5NDQzMzQxMDE0NTU4NzQ0NDQ5QD5EQkM8MzMuNkZUV09RSkFKRj8yKiguQlQyOTI1NC83Szc1PGBiQTxzdlY4N0FIOj9DPjw5UUVDSlRsbm9wYnFxdIaNfZeRnot+h5KCiYaFioKIfXiFl5eJj4OHhod6hHlxe3uFhnV6ho6OnXqNcH1wcHqAcnuBcoSHgG6OenV3fX2CdX98h4mwdFmqwreNkoFwbmM9XmhycHFwbnd3gmVpb3J2eHJ7jIePk5KblqCWiIyTnJ+bn6ugoaycopqaoKafn6yZjJqNkZOOhX2Ih4OFi46gmZOIg4d+bJl5hJmHiJOMjpWMhnubiJOOraqUlZefmKautbyorb3Hy8jJy8vPycTSytTX2NfY19Tb19PZ29bP29rS1snVzJN1d2VkWFdOUVJbR0NGSUg+Qj49ODo+QDw+SD1AQkFBRUE+Pzo4N0RCNzU1NDc5LjU2NjQzNTUzMjMyMzY0NzU1MzQ1OEVCRENFQjU2PEZOU01bbmZjbnNrYFY+LDRMRzg2NTQzM0JGND1XX2hMdXheODs/Rjw8Qjw6OUQ/Q0dSa19tZGJmbHaAiHGRkJuAeYCOfoKBgoV/hHx9hJiOh4x/hoeBd4N5bnt7h4J0epKejqF2j3aDdHWBfnSAhG+BkIJvkoV1fIGFenaHfIm4xqXDyriClpyPeHBmTmVjgnqCd4WhkIt5end7hIB8hHVtlJaVlpCYkYOJj5eal5emnZigl5+TkpejnpqrlpGRi42Tg4yFiYmBho+RnpyZiIWLgYWXeoiJn5eQiY6Ki4J8oYmQi7ygmJOXmpyopqWtnqe1v7+/uMbJzc7FzcrR1tXU2dXX29TX2drb19va2djO28aDdnZkZmFdUlVUVE1LRE1DOz08PDk6PD85PUE3Pj9APT8+PTk4NjdDQTY0NTU9ODA2NjU1NDc3NDU2MTM4NTQ1NjQ1NjdISD1ESkU3OTI1O0g+Ozk6N0hQXFpSVVhLOVQ+Ozk1MzI3STg9TllNSHh4ZDU9PkM9PEA6Njo+PkBFUV9ZZmFdXGl0enlsiY2Sd3Z6i3x+gH+AfoV7foKRioWGe4WIfHV+dW18fYd+dH+SnZGfg5J8h354j355i4pvg5uBdJmGfYKKhXx+kXuQqY+Qw6C9jJuknH6KhX2Jc4yLf3OmmpyYlIV7j5GJhGlHcaGknoyMkZKFiIuQkpWPnZuTlJGXjYyVn52UoZWTjo6QjH+Qj46LhImSlpmfn4iMlJGdkIKMf6aZiIWOg4aEgKWGiou4l52RlJahpqCdnZ2jrra5tKvAxsrQyMfNz9PS0tjS1dfA19jZ29ja2tnZ19u2dnV0Z2ZiVF1ZUk5OSENMQz09Pjk5Ozo5OTw9NkA+Pz09OTo6OzM3REA4Mzc4PjcwNjg4MzU3PDM3ODA0OTc2NzU1NTQ2RlA1RE5JODkzOEFLPTszQ0BJPDlEV088TVRITj85NjMzMz5DO1tYPjVZeXBaPDxBPD0+ODU4OT88RFJTUlhfVlhmbW1taYGOinFzeYp7e4B8f3yIe318i4eDfnWEhnpzenNtgX6FfneGm6GbnpSSgIyIf5iHgJySboiphXugjHyRjoOJhJx+m5GKjaOin5Gkr6CLkYuFi4GThldyrYufq5uQg5mckI+OW4OikYKNn5OUjIaIjJKSjJSVlZCMj4qIlpudj5WWkoyTlIaAjImSjoqKnZeYo6KGk52VoIuKiY6dkIOIj4CDh4WlhYuQspickpSXoaCemZKbnaeyuKylvcLHzcjGz8zQzM7Xz9HUrtbV2NrY2trX1tnanWx5cWNjWlpVUVVWQ0BJQz8/Pjo0ODo7Nzo7OjM8PD89Pjc7OToxOkc9OjI3PUA1MDY3NzI1NT82NTs1NTg1ODo1NzczNUhSN0dPSzk5ND1FSkI+MUZDTEE5ODpHWEA1SFdJNjYyMjM6RUNlWD8mX3lpX3o+Pjk8Ozk4OjtAO0JRS0tTWVBUY2J4bGJ+kYNvbniLeHp/e4F9h3x8d4aFgHNwhYJ7dXd2dIWDhX1/kqain6ail4qdkJSXi4qol3KKso2EqJKEmZSFmoyjlqCYk4mbnqKTqbCgkZWRjo6IloxvjbeEmsTIspyippycmJaRsZBkpM3HlY6Gh4mQko2Nk5WKhYqKhpaZm4+QlJOHlZiEgI+LmYiOkKuXl6SjiJmelpqIj4eXmIqFj42Bf4ePpYiNk6iZl5OWmKGYn5mTnJqisrSlo7zBvsfGxcnIycLK08zN1KjS0dbW1tja1NPazn9ve2RgW1tbTUhTWUJBR0Q7Qj44Mzc7PDo5PjY0Ojo8OjcyPzo5MjlJOj42N0JDMzI6OTYyNjQ+PTQ7PjY5NDk7NTc5NDRLUTxKUUs5QTdCR0lANjRKRUxGPjs4OEVUQTc+XDg2MjE0OjtFYFhBRmF0aExjWj41Ozo6NTs6PTpFTUZIUldTUkJjgkd2gY59fG1+iHh6fnuCgoN/d3aBg3xtb4t/e314eHyEh4p+i6Kzp6Ors6KXp5+lpJaVrqKDkbiVkrOajKGhjKWbsKOknZiRp5aomayvpJiVlpWQi5ial6HAjqPJuKuco6atmJKbnbKdhYaoopyYhYmJjpWMi5OPiIGGh4mTmJWMi5STh5SYhoSRkJx1kZmylZakoYecmZKQi5CKl5uJi5aOhn2MmJ6JkJCcmpqTmJefk6CdlJ6boLGuoqO3vrTFx8S9w8PAxs3KydOmzszT0tHW2NPQ2LpvdnJZXlNdVE5HSU1EQUNENT46Nzc6Pzw8Nz00MjY2OTc3ND41OzU8TDw+OzxCQTc1PDs0Mjc3P0A2P0A3ODQ5ODc7PDU1T01EUFJMOEA9RUFHQTU6SkVORUQ6NkFAQlM+OURPMzIzNTc1PXZcPFJcdGlaTV1TPD04ODU2Nz06SkZER01aXFlKZmA7SISLenpuhYZ6fIR4gYaBfnB4fH59b3ONen6CfHiGi4mGhJKmu6yosb2wpa2zs6ijorCsipq1naO4pZWtpZeprbinpKOfmqmYqqSusKqamZ2UlpGXoJiau7uuyqFqtrirsJSZn6Osk5e+o16qsoOKio2Uh5B8jo59g4aOj5SViIiTloyQlY2LjZaYk52ZtJaVq52KnJSRjpGSjJibipKekIuJlp+hjZSNmJmdkpuYnpShoJScnaWvqKGks7iswsjEtrq9vMXHx8LRoMbJzc3F19bRy9OfbXdlWVdQW09ORUM+PEJBQjhAODg1P0c9PDU8MzUzNDU0NTRCNDk6Qk06QjtBSEI7OkA8NzQ2PEI5P0BCODc0Ojo2Pjw0N1RLQ1VRSjc8OklBREA0QUpITkJBPzZEQTxKTkQvVD0yNTQ6RUpcWEpaUW1ncHBEaWBLSTY3NTc6PkpAQ0lQZEhiYGJwSkCLin6Ac4aHfYKIdYOKgn9ufXx9f3B3h3eOgod8jY+MhoyZqcLAr73Gu7O0wL20rauztoyosq6tvqubu6Wnrbm4q6amoqKko6mvsrGqnZylmZuYl5+ipqWSpLqvqcC8ra6yuaWkqH6IhpytvbCCi4yLkIOOg5GPeoGIkI2NnImIj5eNi5WWlJGal52omrGakaycjpqPko6VkJCWl4+RoJGJlJukrJSWj5OcnZOgnZuYn6GUmp6npqSio7CypsHGw6+wurfFxMO/zabHxMfEvdbQzcTKhXBvXllXXFhMSkFLQUZHP0FAQzs6ND5BPT01PTY+MzMzMjQyQTE3QEJOPkdAQ05DQT1DPTs4NkNDNUJJQjo4Nzg7NUI+NzlWS0RXT0Y4PTRLQEM+NEVLSE4+QUE2QkI/QlNFNThQMTQ1Ozw4O0Q+OUxqal07V1JkS2daVU43OUdEP0NGXGVGYGlnWl1ck4yMiXuHjIeDjHWHkYqBb357gn9xfoF7lXqSlJSYkJOWp7PGyb/BzMLDuce9u6+rubuYs7e6ssGupcCkq6+8vaquq6OjnqerrrWwqpygq5yhnJafr7Wni6O6urbBvKypnbOlpKiUhY6pxMOkgouPh4iEhpWUjXmDjZGPkaGMjJSSjomXn5iTmZWXpqCvnIyrnI2Wj5GRlZWOkZWSj6CUhpefoLKelJmTn6CYpJ6an5uglJiepaSmpqSvraXAxMOuqLe2ycO+ts+yxL/EvLPRysjCtHF1aVlVWWdRTEhCTEtMSkFBPkREPDVBRTs7Mz04QjMzMjI2MkEwNUlFTj5JQEhSQEg+Q0A7Pj1GQTVBVUA7OTk4PDdFPjg+VkpDV09HOD80TEBCOzVKS0NMP0I/PEJGPUFITDkrRzwzNjc0NjRBPzdPYU9hRS89PjZrbGpgQDpIPj9FQmVaTWVcZlRia5mNloqMiJOQhol5h5SQgXKAe41/eIeCgpB6jaGWqJmambq9x8jJwdLJy8LMvcKzrby+qLrAvrvEt6zBqayzvL6qsKqkpaSsrrOttrWhn6+fpaKYo7O9qpuovcGktrivrJSyrKysl4eaqaalkYKMk6WWioF1ipJ5hY6SkJ6gk4+TjI+NlKOZlpyVlKOeqp6RpZqMj4+PlZaIfI+Vk5KjmpWfopy1pZCelqSjoaWdnaaYnZWXmqSjqaeisqyou8DDr6Wzt8y/ua/Es7u+wbiswsPCwJdqdl5VVFlYSkpMSUZEREhDQ0FETDo0REk6OzQ8OEUuMTIyNDJCMjZTSE88SkJKUUVLQ0RFOkVMQjw3RVY9Oz04OT88ST86RVVJQVdRRzdBOks6Qjc5Sk1CSUBDPjxERzxCQ089MjBIMzY2MTcwPUI6PWpqSks1UVMzU3BwZE47RD1ARj5pSF9YYlpjY1aej5yOl46ekomKf4qgk4R4hX+Wf36QiIqRgJahma6npJjCvcfDx8XTzs7Ny7zCt7C6vLS9y7zDwra3vK2zv7q9rq+ooKmotq2uqbK3mp6to6ehnau3uKqlsL/Esr25tKirtrSurpeWpayon5GNkrLFp5aOfJKVfIeSmY+qmZiTk4+SlZOknZOdmZOho6KcmJ+Yi4yPjp2IWpCXl5KXpJllmKKfs6WVoZWrq6mmm56mlpiWmJSgpKiln7arqbm7w7SltLXLwLiqtquyu7iuqLi6vbiAaGtXVFJTTUVJUk1LP0FIRUVJSEg5NUVNOz44PUBKLjMyMDI1QzU1T1ZOPExGS1JMT0hHST5JUT86OElTOzs/Nzk+RExCQEhTS0BXUEY6QT9HNkE3O0hNQ0U7Qz00RkU6QkFCRzkvOkEzNjAzPkdEOTQ9dGRNRztFKzpmfGdWOz5AQkZCcEVqSVJlYUxGpZScl6KXqZaMkYOIppOIgoeCnISDlZCQlI+aop6vvq+hxrzExMbGzs/O0sq/u7axuru7vs+2xL24ubezsbWzuLOrp5yrrLmqqaevsJijr6Wno6W1wLCsrLS/w7rAurSnura5tK+Wpa2vrqSLk5ShjXTCmn2XmYSOl5mMsZWbmpWSkpmZpaOVoJuXmqmdm6CgmYqNj5WcYEqWnJqUmqWWVJavn6+cn6SUrq2qpJqgpZOTmJiNnKCnopq0qKqzu7u7qrGyx8C5pqyrrbKyo6GysrSkbWpiWVdNT0pET09QUjtHS0lHSUNDPjpLVT9BOj1FTTA3NTQ0OkI0NE1XTztKS09VTlFKUEhISk9CPD5NUjs+PTg6PENSPkRIUklCV05JQEJBRjM+NThKS0NBPUM7NEVBOkE/PkhANSpCNTIsPmNdZzozNXRkZUBSNyYjM31oVzs6QkNAPVFFV1NzYldGSKqWmaCiqK+ZkZeHi6iWjoiThaCHhJ2Xj52hmqOktcm1qcW5wsPIysnIzc3Gv7uzrrm5wcHMtce6wbm1urCvr7O1p6SbqrS0qqmmrayapK6lpKisu7+orLa3v8G/vrmzssSyub6to6+1rLmmiJuXppt2v5+EmZ2Ok5qajK6XoZycl5SboKGonqifmZqqmqGnnpiQjZGdg252kqKalZ2inZGusqOqlKiql6mto6KepKeRkZmch5Sdop6Wsaapq7m2vbKyrr65tqCjp6ilppybrampi2BiXl1OSktGR01KVkw9TUVOS0xCQ0Q8UVY9QUFCRE8xOD03Nj9CNzVVWE8/SE5RWVNQUVVLUUpKRUFFTVE/Pz04PTtHUjxFRFFCR1lNS0FIREU6OjM5S0lCPkNCOTlDPjxAPjs7RzctMj4tMYJoTnpcLzBraGA8PUJCODZ6Zlc7Oj0uLVJgTVVIfmVeSEWrlZuin7uvmZSgjJOrm5GSk4mrjYahnoyjrZSjo7bGvrTAucLCx8nFws3Iwr65sq+5tMDCyrXGssK8tbqqqK2tsKOjmKq0u6appquqnamvp6Oqq727qK29tbi+x7y3trjCsr7Btaq1t6u+pY+jmJKioLyfiZqgmZefno+3n6mcpaKbnKGaqKSzoJudppyoqp6YlY+Um4uWiYykoZSdop2gtK+lpJKvq5mqqpyco6KokJSUn4KPnp6blamkoaGztLq0rai1srOenKOlmpeVmKqhnnVdWl1bSEdFRkxRSU1FR0dCU0xKQkVHQVZTQ0g9QUdRMTtCNzpCRjc5XFlLQUxQVFVTTVdSTlVKRUBKSk5POUNANT08TlFDPz9QP0VaTUpBS0RHQDUzPUlHPz1FQTk3QTs8QDw8M0A8Lyc7KkiRQjpTSjAsW29XNzE8Kh1CgWRUNDktMTlmXEZDQ51wYkdFp5ejn57DrZyXpZiaqpyWmpqPqpaVp6aVrayYoqu2w8O8vrbBwsDHxL/Nxru9ubKwubO/wse1v7C8t7m2pqSrq62goZmqqsSipKmspp6sr6uiqam+uKetv7K4t8e2tbm4wLPAwri1s7SvvqOXo5eUnJSun5Cio6Wjo6CQvaWpnamrnZ2hm6WevaGZo5+iqayhnZeNlZ6TnoePhI2Tn6SgnrWsppyVsKaZr6WcmaicnoyYlJ6DjqCZm5KlpJqXq7G1saqlqq6sm5igoJKPkJWonpRlX1dfW01IR0pOTEhFRElBPlFJQTxHSUlcUk9LPUhPVTRCRjk+SEc1Q2FbS0JOUlVXVlFYVFJVSUA4UlFQTTpHQTRDSFFTSUM7Qz5HVktDQE8+SzwwNjtHRj47RkE1Nj85Oj85OzE1RDAtLC9Ndlw0S1o1LE1uVzwtPSkeI3piUTVDS1E5bVJGPEt4ZWFWS6Kao5yexayhnqyfnq6gkqOflqSgpqmsmLaxoqqztsXEvb+1wMK7yMK+yse1uLW0sbO0t8HFtr6xuLW5tJ+nrKqsnZ6epaTBpZ+qraCkqa2voaaovbWmsb25t7bEsrS4ur+0xMG5ua+ztbWjnaWVkpShrqCZop6pqKyjmsKsqZ6srpubnpmmoL2hnaSYq6yspqKajZqfkp6Jjld/lp+loaC4qqeTmLSinrGfnpmulZ2NmJOcgY6fl5WNoaOVkKWtsqqpoqKlpZWVnZiLj5GSpJ6JX2JYYl9LR0pKTkZFQUdLPz1KQjk5SktOXlFRST1MVlw5Rkk9RE1JOEhiXExDTFBTWVlWV09aXklBPVdRSUs/SD81SE1YU0hBOkBBRFBIPz5RPks3MDk5RkU7OEc/LjY+Nzg+NzcvMT85MSUxUVVtW0pPMTA9Z1dEMTc9LSt3YFM2U1prV3JHRTY9dWVcS02enqGZn8SopaG0op2zp5OrpaCjn6yprJ27sKistrHHxcHCssPDvcbEvMTJvK+wtq2wtK++xLS5sbC6tKyZqLGpqpqdpaGnwq2brLGbqqOusKmlqby2p7e7vq+3xK2zs8PAtMe0u7istLatqqKmlpWVpKyin6Cbp6qwr6+7saagqamamZiToqO4oKGjkq+wrKWnn5KhnpWej5CNlZ6bop6ntKemjJeym6KtmZyarI+dkpWSmX+RoJWOjZ+gk4umq6+kpqKcoJ6RkZqThYuRjZudf19jWWZkSUhMSlNCQ0BJSDs7Rj85OU9OVl5SU0o+T15dPUhQQkxMSTlNY1xMRUxSVFlbU1VPXGJIQT9aUUFIQUtCN0ZFTEtNPztCSEROQj07TkBBMy85N0NCOTdGOys2PDQ2PDI1LS80QDErJ1Z0U2VPPzEwNGJbTTIzPjA8dl1eP1tUXmVxQDg7SJZ3ZUE0nqOfnKDDqaSqs6KktaqWs6ynoaSyrK6pu7KtsbW0xsDEwrTAxL7JxLW/yMG0q7Wor7isv8Ozt66ttrilmKqyq6uYn6aXrbu0m6iwmqygrbSyqKu5sqi6tLmzuMCqt7LEvbXHqL+vrra1qaesoZiXkqaloqKYmKWuuK6ytbagn6mkmpWWlKSgt6KlpZavsrKnqqainpqam5WXqJ+gmKGer7KipoyXrZikq5aYnaKPmoySlpiFlZ6Ti5CbnZOKqKmqoaehmJ6Vi46Zj4GFlIiTnndiZ1tqaUxPTk5UPkNBTkM6Okk/NzdST11fUlZRQVdgXEJKU0hWS0g6VGRcTkZPTltXW1JQUVhdR0FCW1BCRz5OQzlIR0hPUD8/Q0lCTEI8MklBOTQxNzdCPjs3RTcrNjkxNDgwMS0vLjw2LSNCcWdzazIzLzFbYlozMzgwNnBbYkgwNUlvaFVDV0aMeWZDO6OjnaGmv6enr7GiqbarnrqxrKOrtLaxsLm3sLe4uMS9w8e9vcTCxsC4wMbAuam2pKy7rcDBt7eqrbK6opStsa2ylqSnkaq5qp+msJyroK+0s6uptratvK20s7m3rLixw7u/v6bEq7G3r6irq6eemJmroaKhkZihsa+zrLC5mpupoJqXk5inoLappqOisbG0rLOorJ+coKCbnqWcopedo7Ovm5+Qk6SZn6iZk6Gdk5aIk5aSlZackoiQmpiUjqmopp+jnJebkoWOmYt9i5WEjZlpZ2tgbG1XUFFbVUFCRVRAOztJQTc6WFBkXlBXV0VZX15NTFJOXktKPlljXk5IUE9cVVlQS1RXWkk/RFhQREY/TkA9SUdHUVBCPURGQk0/OjFEPzc3NTQ3Pz05NUU0Kzc1LzI1MS0tLiwxPSonKz1ccD0+MS4wZFpkQDE2NDdnWWBGKD84bH1nW1Y7iXtjQz2nn52iqb2iqrCspLK5qqa2tKygrbW9r7O4u7q+t7bAwr/JxLnEwsC/t8O9wLeutaert7G7vb60qa6xtp6Wq66nrpemqI6nu5+lrLOeq6KxsLOsqba0tb6usbK1rLC0s8G7xresvbCxuKysqqOypp6lqqCkl5Gan7Oqs6urs5qdp5yalY6hpqS0rqihra6usai0rbKqpJyfqKSelaKZm6i1qZeZkpKdmZ2fnZCqnJWWhJSWip2Ym5OKjZaWmpampaOfnZaVl5J/j5SFe42SgouVZGtxZm9xXkZZZ1ZEQk1YRFo5SEI2Pl1RaFxPWV1HW15dT01SWGRKSkJcYl9QTE1OWFdYUEpWVldMPUVVSkVEQU1AQUZISFFQQTtGREZLPTg3Qj02ODcxOT48NjVEMCs4MC8wNS8qLC8tKj0sLCUyKyo1SzEvJ19fYFUxNTA9YFZeOClDM1lVXGdLNox6ZkxApJqhpa23payqpq+ut6qvtbunprG3xbextr3Bw7W1usS+zMa5w8C5vrnDuMC4srSrqbq2urm+tKmtsLWXmKesqaybq6uOq76erK6yo6ugsa6zrq21srm4qq6usai1r7W7vMqzqre1sbSvrqahtKCbqK2gppaWm5qyo62gpq+XoaSampOOo6Wos6qhprOtqrWlr7K1r6SZnaynmpifmpmrt6OXk5COl5ygl5aTqp6akX+Sl4ydm5iVkIqUkp6ZpaKioJiWkpOVeouPhXuMioKKkWptd211e2FGYWtZSUdaWj17SkZENkFiVGlbTVxhS1xdWlJSUmJgTEtFX2BgUUxJUFdWVU9HV1ZVTjpJVklIP0NLP0VESEhRTkE/SEhIRTw3PT46NzU2MDk/ODY2QiwtOCwvMDQsKCwvLSo3NikoOS4kOks1LiJUX1RfLzUoQ19RXC4rQi9KR1BbRzNjWVRLRJmXobGpsqqspqSvrrapt7W6pKy0t8m7tLu6v7+0s7fDwMzIvMO8tr2+v7e+vLG8rae6ube1wraqrbG3lJamrquoo7CplK+7pK2xs6eoo7K1sbGwtbG4tKmvrLKnt6+3tMTGt6m2tqywramno7agoKexoaSVnJqVsZ6nnKCqjqmjnpuWmKampbioo7K1rKixp66xtaylmaCsqJucnpyUqbiclI6OipebopePl6SgnJOCkJSPnJuXlpWIlpCYmqecpKCRlpGQlXaEj4d7hIGDi4psb3Z0e35cTGZtXEpOY1w+YntHSThHZ1dmXExeYk1YWVdVV1RpXU9PSGBdX1BKSFFWVVJLSFdVVk04TVpORUBGSz9IQkNLU00/P0xPSEA7Oj47NjswNDE8PTQ1OD8pMDcpMS4yKSksLC0rLTkkMDQyJTlCNy4jQU5HZjI3J0diTFYlLUIuPUVMUTwzcmtJQ0ORmaWvpa6vq6ilsbO0q7eyuKGrtbnJua3Bu8K4s7G1wsLOxcDBvbS9v766vryyw6epubC1tb+8rqyysZugp7GtpqavpZ2yta2rsbKsqai1u6y0srWttK2qrKisqbitsrDIwLmlurCprKylqK6xpqWjr6SpnJ6dm7Cao6Ojo5Gtn6SgoKKrpqe5pay2tqWrrKmtsLauop6jqaqboJubkqS0mY6KjYeQoaCUjJScn5KQg42Skpyal5WUh5eSlZmnm5+ejJKRjZB2fY2FfHt8hYiIcHJxfXx9XFNkb15OWGZcRkSWW0c7Tm1YYltMYGJOVldWV1RYZ11RUkxjWVtUS0dPVFNOR0lWU1xOO1BeSUJESEpBRT8/S1NPPjpOTUM8PD45OjU9KzMyPTYyNDk6KDQ1KS8rMSgpKywtKiY1Ki8mMCkzODoxJiozQmM6NipIZUhKKzpIPjNCSFMsPpBrO0dIj5yqq6KqsaSppbO1srW2srKhq669zLqtwLrHsbSttMHD0cXGvsCyvsDCu763u8SmrLarsre7wK+rsayfo6etqaiksKOqsqqwrLCvsK6rs72ntrCyqbOqq6Wlo626raqyw7q2rbupqaesqaexpaqko66qqKKfnKOtlaWemJ6ZrJ2ip6miraakrau4s7KiqqKgrK+xrJ6gp6epmaOZmY+gppeGhI6Ki56gjoqMlZqOjYSFj5SfnJSXlYaWlJOXpJucnIqSkI2Jf36HhXx2foWDhXJxcIh1a19aYG5iUXJwXEs7hHxGP1h1WGBaTmRbTlZWVVdRXGFeU09OZ1hXVktHTE5SSEVJVlJdYzxQXUQ8RkhIQkc/PUpQTDo+T0o9OT89Mjo3OyoyNT4xMDQ4NSg1LyosLjMwOyksLCclMjM0JCwyLTg2MCkoMTtcSjAuSmdERjg7QjA1RUtYMUCVWT1MRZWYraiiq7Ocqqqwt624tq+rpqurvcm8sL22wq+xq7PDw87Pw76/tMDBw7m/s8fDqq62rbK4vr6yra2qpKeqsKinqLGltK6rsa+usrG0rLS8pLezrKyvqKufo56wt6uqrbq3pbe2pKqnq6qqraGpp6axsqSnpaGhrJeqoZWboKaepaKrpK2jn6exuK6upKajm6qrrqmdoqWkpJifm5aPmJySgYKQiYScn4uKjouYjY6JgouXopuQkJuMk5KRk6OZm5mKjouLfYaBgYN6c3+Cf3xydYukh3hrX2BuZldkhmNOP2eTTEVieVdiWFJlVE1WVVZUT1xdYVVLTmhWVlZJSkhJT0JHSVNRWW9BTVhAOkpHRkVHPj5FUUg4Q0tFODdDNzI6OjoqMzk/Li80NjMpNCsqLCsuIzQuLSsmKCs3OSomNis8LTIsJjA2VlouMEpnQUE8PEIrOkpPXjREhj1HRkSXk7Cmo6uxmKuqrbastrKspqyqqbzAwLe4sru1pbKvw8nL0b/Au7m/vsG4wbnAxKyxtLGzur+9srCurKqrqLappq6vqrmwqLKyr7Ott6q4uKa0tquspamqnKOes7OpqKS0tKC3rqCqqKqoq6egq6ypubWqqqmpoqqgrZuSqqGdoKWipqOqn52ntK+pp6ujo5ilp6eqnKKko6CZmKCRjo+YjX6HjYeEnZ2Gg4mJjo2Oi4KFlKKajY2akZKRj5Ofl5iWjIqDf3SGgX+AeHSCfnh2fYCHnY9vcmdmcHdcYHKHak9emVZIbnlVZFZRY09NVlRVUE9YW2JVSE9pVFZTR1BZVUk+SUhPUVB4TE1WPTxLRD9AQTxAQ1VDOUFLPTU7RTEzOzo3KjQ6PSstMzQxKjgqKisqLCkpKC8qJiklMzssJDIpMjAyMSUvMlFiMDI/Zj1OWD5DLD5MVF8vSmk1T0Q8lo6xoqarr5qspa2wtLWwrKawqqi6vrvAsK25rqG2r8jHyNHAvr27u8G9usK/vr+tsbGxtby7wrGxs6qzqaS0qKWts7O5sKOuuLKws7usurCqrrasqp+qrJ+joLatqaGfsLOitaqeqKepo6qhoqytqL2vrK6toqion6yZkLChmKKhqKifqJyZqrGqo6CuoqGUo6Ojp5iaqKWYl5iej4qHlIh9jYaEhKOWhIGBioaOjJCDg5OfloiRnJCTkY2RnJSXj4qGhnd0gX98dXh5f3lycnhmf4akdmlfZGmAdGaIi3xTWG9eSnhzU2RTUV5NTVJaZk5NVllkWEdSaFJRP0JOUWFROklITFNJcVFMUzs8ST87PD07QEBXPDw/SDczQ0IxNTo5My01OjopLTMxLS01KSgrLSw0MiMyKScsJS47LiYxLjAtMTQlLDBMZzo0OF89YWQ/RjFDUFtbKkhNOVVANJGQs6Glp62kp6Stp7WzsqulsaequL7Au6+nuaqmr7HJx8jRw7y/vri9vrzIusC3r6+zsbm7uMCysrqsuKyitKeorLK2ubOoqL22rre+sL6nray1rK2cqa+joKWtq6icnquzpbSomqunqaOonaOpqKm+q7Swrp2qpKGvnJuzo5aknKWmoKWcm6mrpp+cq6Kck5yipZ6Yl6ipkpialJCKgo+Ffo+DgIidj4V+fYuHkY2Pg3+TmpOFk6GMlJGLkZuSlYeJfn9ye3p+fGh4fHlzbm97ZoR4hIlkYWdgcoR6bGZ4XV5UP1d7bVRiUFFYS0xOcnVdSFpbZ1lFVWVQRD5KT0RDQTlIR0tTP2piSlE4PUg8PDw+Ojw/VDY6P0M0NUg+Mjs1OTAyNzw1KC41Ly0xMScvPktIMCUaOTAlLCwwOS8sLCs2JzE3Iy0wR2pJMTRYPWZiQUo3R1NgVSo9OURXPSqQlbKaoKCqpqWhq6W4s7OmqbGmrLjBvbWvoritqKiwwsnJzMG2vcC0t7+6yLXCtLKytLG8uLm9ta25tb6toLOnq6uwtri1rJ++vaqzwbS8oa+ztaqsn62wo5ymqaqknpulsKewoJ+rqaehqZykqKGtvKiusa6hq6Okr56fraaXn5uhpJ2fnJqkq6Ocm6WllpeVoKOXm5elrIyekZGRi4KKgICOgHuZlIyIe32Lho+Ni4mEkpiQhpSjiZOSh5GakJOBiH15a352eXhjfHpwbm9xdmd/c2mEaGVnXmxzjWxgaW9gbz1aeWxVXk5QUUpJTVRaV01dXmxXRFdfT15QSE1ERjs3SEVLTzxyaEtLOUFFOzs9PTs7PUo0OUI8MztHPDQ/MTgtNjg7MigwOS8sNC8uPS0qSz4pHTQ5JicuMzQuMCsvNCYsOiQ0MUFoWTE0Uz1lX0RMNktWZE8qOzFOVz0jlJmtmqGYqKWkoKikuLCvpK+wqau4wbmyrZ+5r6uotLrIy8i/tsK+r7S9t8S2wrGtubGzwLS6vbeoubi9qqO0qKmqsa65saucvL2lsMG2t6KvtrWnpqews5+epKaooqWZn6yoqZ6gq66moKaYo6igsbmfo7GvoayhraScp6apmpqbn6WWnZ2bnqqnl5yhqpOZlJmfk5mWoamRmomOkIZ8h36CjX18oIyNiHiCi4SJi4uFh5OajomVnoiRlYKLlo2RfIV8c3B9cXR0YHp4aG1vb21ofXFie21pZWJcZIR+XllzanFKSX9pWFpNUExKSFBSUUlPXV9uU0RYWlJoT0hLRUY1NkhCTEk1WmVKQDZFQjk6Pj0+OjpDNTk+OjNARjwyQDIzLjo7ODMmMjwwLDg1QiopLUIqLDQ7Tk5AOzczLS4rLTcqKjwlNTM8ZmQyNE0/ZV1GTz1RWmdIKj4vV1U1KJeep5qdl62hoaGlobirsqW0tKmoucS1sq2ft62urbC0xsjAtr7BubC0vLa+u76vqr2wtL+wvMO5qLu6t6entamorLGttLGonL+4pq69t7KfsbewqaWnr7GboaSgpaWgl5uwp6Geo6ivoZ+hk6Skorewoaaxq5+so6+YnKqkqZ+Xmp6llJudm56nq5qcnqaXlpiWno6Tl6KoopCJi4+GeoR+hIp6j5aJjYZ4gYeDh4uNhY2TmI2PlpmKj5d+hpeMj3mBenByd29vdF95d2Rqa2pnZ4JsZXJra2RnV2Fyf15Za3VpWUV9XltYT09LSEhSVUcyOl9ebVBEV1VZZU1ISkVFMDdGP0tCNklKSDs2Rjk0OT49PDk4QDg7ODo3QEk+ODw0LTM8PDc1KDU+MSw7QTEoKzY8IzhSPSoxMTM+RDUsLSc0Mis7KzEzOWNsODRIQmZbSFRDVF1oRS47MV5RLDKWpKOYlp2qnqaho6G4qrChu7ilrL3Esq+uorWvra2vtMTEvbO+urews7m4uri6ra2/s7S4rr/Bt6u9urSlorOrqKqzrK6ypJ3Dt6aquLesn7K8qqelqK+rmaOnnKWmlJihs6aZnqWpqZyhn5Sln6S5qKSnraaepaGpk5+poaGhmZueoZObnZeho6ycnJujlpOVlpuOk5Ojp6SQiIqOhnmEfIWGfZyNiYqGeICDh4iHkYWUk5KMkZWUjY6Ue4OXj4p3f3xsdXJtbHNieXRnZmlmY22EZmdoZGZnaF1kYmllWmV6YmBQc1RbW1NLSUdJT1NAICpqXmpMQ1ZVXmBLSEdFQy46QjxGPDZLUEQ4OkQzNTc9PTg5NT86OzQ+OEBMPT45Myk4Pjw6OSo2QDMuRTQoKyw+MC1OPy4rLTctMTE5NSwmLjUtODA1NzZgdEIzQ0RoW0tXR1VgaEIzNzdhTCcyn6Slk4+mp5yfnp6ktq2oqrq3p6zDwLavrKK1rqevr7fBwL2xwbewrrK2tbm4tayqvLOvsrG9wLeuvLyxpJ+2rKamtaqrr6GgxayqqLK1rK21up6oqquxpZidqp6npZKZpa2jmJ2kqqGboZyXoJ2ntqWvqq2hoZ6dopWgpp+ioJmcm5yTmp6Vpp+uo5iYn5aVjpWYjI+YmqegkIeKioh4hXeCgoKch4qCiHt+hYiGhJCElpWPj5CRkJGNknuDlY6Fc399Z3lwbGtsZ3Vza2FnY2Jzf2FjZWZlaGhhZW5ZXVhcbGNhTGdXW2BWSUdIS01SWD45YGxpSEJVU1xbSUhGRUEuPD85QTg5UkZANzpCMDM3PTc2OTI6PDk3OjlETT1CPDAqPEA7QTwtNUIzNz0rKywvQSpKSy4vKiszNzIyKDU3JCs3LjcyNjg1XHlOMj5IaVpMWkpWYmZBOjNAYkYlNZ2koZKNrqGamaCXpbSyo7K+t6Gxxry5sLCjtqyrr6m5vr27rcCyr6+utq6zubKnq7mxr66ztru2r7m+rKWetaugorKlq7CfpsWhs6aws7C3rrWerK+srqKZnaeqpZ6Vm6emoJmlo6mcmp+blZ2drbCmuaeuoqGamp6Zn6OapZ2Xn5iblZqhk6qXramclZ6dlI2Vmo6VlJinp42MiomOe4F0goKLmIWGfIiIhIWKjIiShZSckpGQkJGXj5B/gY2Ogm+Cf2d5bmhsamdxcmtbaGNhcn9gZGdqbmtlaWVjbFxsbHVwYVNiaGNlWklHTE1PWVFQVWFlgVRAVlJaVEZHRkVALzw9Nz82PEZOYTg6PzI0OUAzNzgyOD83PTg+RkpARDkyLT1BPUE9MDVAOUAxLSsuNDw7SzYvLissLTI0OjUjMyopNi41NTQ2NVp8XTE6S2pbTVtLWGRjQEExSGJCJzSUo5yPj7GdnJShm6mzsJ+4wLagtMK7vbmxprawqa6luLq4uKy7sK2rq7eqtbmtpLK1sa+psba2sbO2u6epoLaqnqCqo6qunazEma+msLG3tq2snrGtr6qim52krKmblZympJ2aqqOllpqgnJKco6uqqbqepqSgl5qanqGPa6OWmZ1xg5ecpYF2kqypn5aXopKKmJmAl4qfjniFko2DbWl+d4RxbIaKhn2EioZvXWRgZ4SYhmuLkJSSdXiLhH+DkH9miIBodmlmWFxpdG5OUGpjZnGDZl1kZm5raF1bXYmQhYdoTktDOEVUZ15KSFBQVVZLSFJhcHRlRltRVVBGR0ZDPjE7PTY9NjwzZlw1Ojw3NTtENDg2MDpCNz86PkZMQ0IzNDM9QEBAPTI4QEU9MSwsMDg+RzcwMS4qLiovNjY4LCMxJzIxNDoyNzZYgWwxNU9rW05bS1tmYj5HMU5hPCsvjqSaiJaym52UoZyqrqyjvcWvqbfCuL68rae3saarpLi0s7Owua6qp6y0pbG1oqe4trWop622s660rrSiqZ+0q56jpZ2nqJuwv5Wop7G0ua2upKitq6uloZ+coainm5ihpaacnKeonZOeoJmQn6iqo7Svo6KjnJaYmZejiKGPkpqIoYiVn6J/pYCorZ+UlJ6UiYRyeIyOg4igdYeNaZeJZn5zeKBvh4eEfox8f6Ggn5l/fIiedIiOdpuKbIeCg21oZGR7bXJiVIZtY21pmHFYaXBuhlddaFpralqIcGx5codoh4RZXkZOPkZeTUVSVlZRUFJXVGdeTFpMUlJQRUZHPjw0OT05PDc7MDw8Nzk5OjY9RjU4NjA8Qjs8OT1GUUc9LjU8O0A9QD41OUdBODIqLzE8STovMDEuKi8oLTQ1ODMlJjIxMTU+MTw4WIN0MTVSa1tOW0xbZ189SzFUXjcvKI2nmISdrJ2amp2fq6qoqr7DrrK6vLfBv6qkuLGqrKazta6vs7arqaWxraW2s5ustba0pqeos7Gtsqiunquhs6qgpaWboqWesbiVpqent76mrKepqqynpaGfmaGoo5mZp6OkmJylqpaTo5yUk6SmpqG2pKOfo5iVlJiUnIiukJiViqqMmaOdhrGBpa6flZuhl3qC1Kh/h5TAm8Z4d7Glt5ZkgMCcv3mEhHmPg3yQkJHKcZa8nMV7cranupB7gWyXsauxeWhsWLGub2VpvJK8bmh6bXGP2H1Sa2K2sn1/cJR1mqGqkFZOWGFPVk5GVVxYUFBTi1tXW1BAXERQTkNGSTw8NTc9Ozo5Oi49Ozg3ODs5PkY2Ojc0PkA+Njk/RVJJOi41PjtCPD9BODpKPjUyKjIyQkUvLjMyLisvKS0vMTg2LSAvNDE2QTE9OleDdzExVGtcT1tNXWdcPkwxWls0MSGPp5SBqKqfmJ2epa2yqrDCvbK1wLW4v8KrprSurqmosLWqr7a0qKimtaWoua6csrK2qqWkp7KvrrGmq56npbOloqKgl5yioLKvlp+kobW6o6qooa2tpKKdmpqjqaCYnKmgn5eeqKiRnKeblJ6ip6OhsKOen6OWl5OYkpmFr2tqi46qf2iFloetZnGfnpWbqZdxrqGkfne6fGugj3axX2q0W6WAZZyQYGaBemZ/aXhqqWW+cmemjHaxanyxeHWRlGNtbaduXISgRWlnh5ZFdZxgfWZ7o6aBWF+Lq2h9j3h6aqg4Sq9bWFRtY1pLT1hfXFZWO06HUFdWL0lTU0pDRUY9PzQ2Pzs4OjkwPTg5OTk6PTxEODs6Nj1BQDY8QEhRRzkwNzxBQz5ARDhARz0xMy0zM0UzLy41My8rLyguMC46Ni8nJDIwM0IvPTtVgnYyLVZqXE9ZTF9nWTpNNV5YMzEbkqKVg62npp+jpauyuK20vb6wt8WyuLvDp6mwrLCpqrGvpLC6sKWlr7OjqrmpnbKysKOloaqtsKyvpqigo6KxnKSemZaZnZ6wqZicoqC1s6Grm6GtrZ+dmZeho6mdmZ6loJyZoaekkJ2jmpehoKyfpqagmp+hlpWRl5GahrWbtXmGqZq2mXeHs5u3f5SXmKyXf2uBpnqBhYaRlJJ3q2dqsVuse46HlHSJcI6GgH+IkJd4g4KKl4yDoI+FsHZ3n3Fra218i0+lWEhjY5l+Y2ilX3lxdVKShl1QqW5jcHuFgGGdL1KibltUa2dgTEtcZFhcWkI+sHdXWEEjTWlGQkRBQEExOT44ODo4NDs6OTw5OkE6RTo6OzY6Q0I4PT9LTkg6NTpBRkJBQUQ8RkQ7MDIwMTtGLDAuODQwLC4oLzMsPjgzMR8vMi1EMTw8U31uMytYalxPWE1fZlc3SjlhVDUwHJeglImzpqahrqmos6yqu7bCsLzDrbm3wqutra+vqK+zqqKvvKuiqLatpKy1pKWys6ijop2nqrOpsKimn6CgsJegm5aWl5ugsKScm6Sota+hqI+pp6qbnZaYoaapmp+do6CcoKOlo5abnpianqOrnKaanJqioJaTkpSTnYTVk5m5cbHCf8aHfdaUnLt9nJeoko6djaR7jYaigaWCeat5j51Wr3uJfp9quVq5d4aEfaaClHyZeqp5jp2Qe7FtjoR0kLuGb5VQr6fFilGgemNgqmJzcoZrlodeUrW0yIV+iHxjpDNCnXVdUGpoZFBAWGZZZGFKR0xqSlpTT1lmWkNDP0U/MDw8NTk8NzQ8Ozg9OjxDOkY6Oz42OkBDOzZAT0xIPDo8REhDQkNEPEVGODEyMTFEQi4vMDQ4MystKS4zMjM5NzEjJTUqPjM9PVF3ajYqWWlbSltQX2ZUN0g6YVA3MiWco5OZsaippbOqpbWopLy3wbC6wLK3tb20tqiysaSys6egr7apm6i6rqSwsaGytLGhpJ6eqKmxqbSpppyen6yYmZmYmJaYo66fnJeorbGpo56PrKKnlZ2XnKGmoZiioaKhm6KiqJyfoJ6UmZunoZynlZubn6CYkJKVkJ2Ism5otXKsiHCPp3K0dXS2e5yZpo6QnY2jfo+eo36wdYKQ0tJ1XK58hX+kbpuqpmqGhX2tfZiZkHuxc5Odj3mzZZZ0hZ5un2aUUsmLWsJcn3liX61fdnOFYZaIXVnKnW/AgHRNS7VTVcZkVVFqY2VYQU9qX2xpUFVGSDk9V1JbVllIQj9KPDI/OzU9PDU2Pjs3Pjw9QztHOTtANzs+RDsuQ1JKRz4/PElKRkNFRD5JSToxNzQ2QD4vLjI0MjUyLSkuMjYsNzQyJh82MDs1Oj1QcWg5J1dpXEFOVF9lUDVHPWFNNjIuo56Rpa+tpam7raa1pae2u7yyu7+4t7W8vLSmtbWjs7KjoKywpZinu66lsrGdtLiqoKWdoaqlsqisqqWanZuqn5aWmZmTlKSropiTpquxpqGVkqufpZKUoZylp6CVm6anopujn66aoJ6ekJaco5+dpZSdlZminpWZlpObhax8eKh3o4+Lh6pwrouEqISamqOLk5qLon2Sl4euhH+Bs1xyslOvfYKCo35x1313hH6PnYaZmnevhoqRnIh3tGGaZZqCgZVskluwV0uadZh5ZmCtXnZ2hmeXiGpdr3eVn493bDV5yK6zX0NUb15nYEVQbF9wbVZVTS5lY2hSWVA7QURATDo1PzkxPjwxNj85OEA9OkM6Rzs8Pzo+PkU5LUVVSkVAQzpNS0pCSEc+R0s5Nzw0Njo+LzA0MzMzLjIuLjE4Ki4zMiUhMDM3Njc9UGtlPiZWZ1xAPVZfY042R0JgSTo3N6CdlKC3sZmzwa2osqeqsrq4tLm+ubizt762prm1obauoKCprJ+VqLasqLGyq620pJupoKCoorWnpqqkmp6WpaKUlJ2akpakqJyUkKetsKWglJmon6KPkaKaqaahlZqmqZ6dpJ+tnaCdoI2Un5yfoZmYnJaXoaCUmJGnnoepfn+meaGPkISqcK2Ng6eGl6GjipiXiKOBkIaUqnp/i515cLFaqIOCiKB4dNh/dod0p4GOm42SpHyVkJ+Ee7JenGSgfYKVbpNcq1xbk3+Rf2hnqmNye4BqmIZxXataiaCPa25kT0pDoVxaTXRdYmZNWmFfcnRfSlU1SpqRWEhFPUdFQUwzNUE4Ljs+MDVBNzhAPDY9PEY/Ojw2Pz1CNy5IVkpFQEg2S0lOQElLQEVOOjpANC47PjAwMjE1NCsqMDUvNywmMjEoJCQ2NjcxPE9lZEEmVWZbPzFUX2JMN0ZIX0MxPTeinZqavq2Ys8Guq6yoprSwuLG1v7m6s7K5vKq7tqGypZ+mp6eek6uyqbCqtq2qr6GYoqCmpKS6o6OsoZeckqOglpWfm5WZoaGRjoypsLCmnZaap6afjZKkmKirqJWYqaifn6CkraOgnqGOlaGZoKCSnJeclZ2hlZePrJyPrm5ytHSpjHeLpnS0enW0gpSnpJOdjYmkh451uG6Le4uia2u2WqGGZZeXaKCip22UcrRzk5l/s2qFkoitanW0YZ1mom6GkmuXXK1gTqF8h5FSc6NseX9+bpiGb1yvVjycd2VUb24uW6dPYlJrZWJsWWJcYHB8Y1NZUT4/bG8yQkJAPk06ITdANi47QDM3QzU4Pz8zOzxDREJKRk1JRjYySlRLRUJKNklKUD9IT0NGUD08RTUwOzswMTAvNzUsKywzMjYvIzAwLCwdMjg5LzlOYGVEJ1VkWT4vVV5hTDVGTV44MUE4pZqcnrqjnLHArq6rq6e3qbivtcG1vbKxu7iswreqrKGdp6SinZKrq6i2o7Oorqqhl52ooKWruJ2jrpyWmZCmo5eOnqGcmZ6fkZOVq7awppiTm6yployTppqlraORl6uypKCeqKywmKGikJmhl6CblpuXoZOcqZ2UkKuZh9SUmrt1scSAxId+1pecuHmKkpmOmIqMp4d5orZ1fXd2woKasmGDunnAfHW4YrWBjIepfZaCrKlxe391vIinoGmdYaaOr6F+jHSHq32+bnO8dLKDdXiBim2aiHBtjaR0vV13fVthebxqWlZbaXleaWBkZmJteW9YW1lDQUBxP0NHKzRIIic7PzEwPD83OkI5OT1DNDxATlpeYGBfX19aUFBSS0VGSjRITFJASk5FRk9CPEU4ND05MDIwLjg3LSouLzE4MCItMSwzHiw7OjA4TFhhRidUY1g8L1ReYEs1PExbLTZAOaean6K8o5eww6+tqqqssai5r7fFsbuzr7ywrsGyraajn6SinJyRq6WqsqW1p62kn5aaq5mnrbido66ZlaGQpqCTjp2jn5mfmpCWk6+5sauVlqOnppSQlqWdpK2fkaCoq5+cn6mksp2ipI6moZWhmZuWlaSZkLCgkpWqn4WQmbaAkpKNuJZ4g5ObtndubG90b3mPhI6Jcp7Au7yae4GyqHCAdJG5g3yGhoqHjXuLho2XfaS7ub2cdXmzo3R2l3V0sHWYnmaGaY22dHJxd7aMXn95fYhng3lseWKLrHB0hX5YW6dpRGRZVGZfY11jUWdmcW11Qk1PTEQ7Wkw+SjM8MCA4PjsuMz1BOTk/PTs8QzZCVFlaWltbWlteYGJgXVNHR0g0RElUQktOR0VPRj9HPDc/NzA3MC85Oi4sLy0qOC8lJjIoNCQoPjcvN0tUX0cnU2JXOCpPXV09KztWVic9OjymnaGhv6aVssKzq6qorKuqu6+xxq+1tLC4p7W5rqukoqefoJ2ZlK2lrqqntqion5yWoaSerKW+p6Gql5WckaKbkpCiqKKTnpeSmJSytbasmJ2jpKKLk5KmnKarnZappaacm6Gpp6eiqKCRrJ6Xop6Xlpidno+wqZScp6KPa39qnKl5iXR/m492e2aIe72+wLpvkoNxlIVfcmpaXpuJYWOHj5ZsYH+UY22cdmKVa4CalZRlXmBjcZqJaHKMfIaUZmp+cHR4fn1iW3h0gWhQXG6EfHyLaldseoFySUpvhXBOck1EVlxmYExaV2ZjX09abXZqclJPRERNPEhJPEw+MiwyQT84LzU/Qzw5O0A7PUM+UlZWV1laW1tcXWBhYWFgXFVHNUNGVUVKT0hGUElJSDs4PTUxOi4xOzouLy03Nj01JiIvKjIsJTs4LTdJUl9JJ1NfVjQpUF5MKDM+XE8nPzI+qJ+oocGkmbS5tqOspq6nqLWyrMissLSttqS+srOooaSqnqOcmpqsp66kpbWqpJuYlaKcp62pvqippZWUm5agmpOZpqmokZ+Qj5icsLK+rJqmnaeiiZOSqZuopJycrJ+jmpyjp62in6mhma6blKagl5Sen52YsaWZoqiZnZKfnaSmm6ikm52anJuRl4Jobn1yd5GXlJCEibSqjYWYlY+KjJiXiJSViYOTk5CJjZKUmZOZl5qfoZqblJ+bjYJ6pIVsaXuQfYB1iYuCcoJ4eXZ2ioB8iWpzgXSDdWR3fXZrb3lsX2Jbb2dNWFlmal9XWXB6b21mU09GUzlQWk5STygrOktCNjM1PUBBOTpDPjxFTlNTVFZXWFpaXF1gYmJhX15eW1RLQ1NHS05ER1BMT0k8Ojs0ODksMjs4MjApNklSTzgiKSsvMiM0Oyo3Rk9bSidSXlQxMFReOis9OF1LLDwtQLKgs6K/oqOwsbegqqazp6WwtarJq62yprWmwKm0oZ+lppyllpahq6eto6S3rKCZl5agmK2qpsGfrKSWkpyXn5iUlaOfnqOok5CYqKiyw6+Zqpyqno+Wlqmeq5yeoa2YoZudoqWvpqGkp56smJalnZmZoZ6enbChnaKnlpmUmpSho5ekoJmhjpeVi4uOkJiuj3yVm4KRgYmpqIWAmJaLhI6fiHuEkYaFmpGHhoqVj5uXjpCYnqOWmZKQnI1/jWWhs66EiYR3e5CKfnd5em9neZGBgYlrdYF5iHJoc395dYOGgWp0YnhlX2hkY2Rmalhre3Fqa1xTTFBEX1VGQD4/LDRARjs0NTs+QTs8Pz4+SE5OT1BTVFZWWFpcX2FjYV9eXl1eXVhWSktMQklPTVJKOzw6Nzg2LzM5NjQuKCYkLTEuLikrKjclKzwoNkNNTEQvVFxRMDVNWzE3RTRcRzU8LECzoLmvvq2qrbGyoKqmsq2irLOwxbCrraSzr7yktJyhqKOhnpqXqKappqSms7WelZWempqwpq6+oayikZGempqUkpainJepnYSdqaujtMezn6mjqpaWmJqnnqmcoKWrlJ+fnZ+qrqikoqugq5qen6GYpJ6cn52wpJmfqZSZmZ6TppuZqp+cl2aEk31lf4+bkGN5jGxoanqQo6tqZZqYfmeFi2VlaWh6jaKOa2iMmJGjeGtqi5mjn5hzbG56hIyGeVhlXYWBXmyLioJ3XGdzd3eSgIiCb3eCeH9zbXmEc3aIh42CemiEWF1qc2Rdc4hpa3xxbWNdUU5WSWRYQEkzPUY3P0ZENzE8PT9BQzs7REdISElMTk9SUlRXW15gYWFgXV1dXV1fXVpVT0RIT0tTTj0+PT02NTM1NTU0KiYmJSwqJS4rKyc2KiQ7Jy9BSVtKLjZaTzYpRVkvRE8xWUI7Py49pJ66vbmvq7Owq6Wora6wpq6usL2xqqilrrCwoK2XoaSeopqap6ycraSmqKmzrp6WpJCjsKa2uaWuo4+PmqKak5KboJmZppZ7pKuiqLTDt6Whpq+enZWeo56jnaSqqJKfoZ6gqq+qqaKqnqabpZ6noKuWoZylsaSXnayWop+blKaZoKyZn369hIlztHOFn4ataHe5xLhxkqGjeqaYmXSrgn3LwMC6cYujh4OefZaYiJ7AvYKWnZ2NnMHBfIF6kYyawsB9aqWyb42Bb8p6f5t4koSPgHZ5gYB5cXuAhnB3hYuSeGx1kWJlXndjX2WAYl50aG1kYlhLVUlRWUhPRDJJRT9EQj4vPD8+QEE6OERDQkNFSElLTU5QU1ZZXl9gYV9eXl5eX19fXVxTTVBHVU5BQD89NjQ2ODI2NiomJSMpKiYuKyopMTAfOSojPklbTCojQ1AvI0ZbM1BZL1VBQjsvOJWiucO0r6+/qamUo7CpsK+tprK2r6qmp6axq6CrmJujoJybqqeinayjpailpbSknqOTpq6tuLSnr6KSkZmdppORoKGYm6CeiKarpKutv7+xoKivqZaRn52imaOkqqOToKGenayuqKqlo6Gkn6OknK2pkaSbqa6qnJ6rna6jl5iml6KkmJ1/zpR6e6WCepaXm1+tj12OqIChoXynlZt1q4OBr15kjKp7qIeFoHSXk4izY4KrhqCNjbNqhK90fJaHuGGCrVmjzW6Qdnvbe3+ZcX6Ik3Z/ZXuIdXZsfodtfYWPkH1rgIxfcGpvZmBfeGRbcWhqZGZgUlRTV15KT0M1QUhFRDg+NTtAP0E7PThAPj8/QkRERklKTE5QUk9TXF9fX15dXV9gYF9fXVtXT1VKPT8+PDU1NzgxNjQoJyQhJywmJi8oJiszHTYwJDc7U0wrLC1KMCc7XDpMLSFQQEY0LjGswcC/tLSwt5iekaOqqa21rKayrayspKymsKqhp5yappicoq+foZ+op6OmoZ+wrJuelqaurbGrqKyglJKbn6WTkJ+ll52oo56to6qwqL/Fsqepsa2Wkp6copehqqqflaGenZytrqapqJulpaKgqpKss5aloqqqnqSnp6KyopObp5yhnJaVkZehcoaMmHaGqIdxsXydcax9oKCBpY+eeKuCfq1/nXKtf6yHhp92mJJ7fJd+qoiijJGLnH2reoiSj59/eq1WnMR7kHCTwX2BlW11cIxtZndlhm9heG5yboiJj46DbI+NY21zdW9gZm1kX29pam5mY1dTXGBaUlJDOUlJQEM8PjxARkRDRUE9PDw8PkBAQUJFRkdFQENJU1dZWlxdXl5cXl9hX15eXVtaUkM+OzkxNDc4NDUyJiMfHCAxJyAxJx8nNB41LSY3PVdKLTwoPTEpM1ZARiEcRztDMS0rr9PGx7Kzn52jj6Oioq2vt6+psaeoqqiuq6unoqSdmqOVn6aroKKmoKioo5+esK2Ym5aop6+tqKepnpeVmqSikpShrZqdp6OvrKKstam5zLGspq2rlpScnaKZn66snZahmZ6eqbGnqKibqqejoaqar7GiqKuuppqnq6urs6STmKSnnJaThaRrpHWKeql1e7JxgqWKmIxwiKCbh6RfYVKrhYCug5x1roKohoafepmXhntmgKOKpJiGgaN9qX+BlIauXnuoVZ2ikoF7o5+AfMSwxYxzr7SzuXJiqa/CdWiLi5aNgGuXkG1reHh3bmtmZGRxcWZ7aWNcVl9pWFhUTExRTENDQUI7Q0BAQkk8PTo5Ojw9Pj4/QT04NjtETFBSVFZYW15eXVxeYGFgX15dXF1bU0lCNjc5OTY2NCwmJCIgJychKy0iJC4hMy0mQERXSCxHKzU2KjFQS0wjIEE5RDQsJ8LJ1dbAoZmrqKGvop+wtLCwqa2jp6eqq6uopKagm6WfnaanpqSdrJqirKGjn6+jnpuTqqS1sK+hqZuclpWnpJGboqifoKacsKWiqLGstsextKirqZWRnZ2imaCls52aoZScnqeqqqKtmqqmoKGporKsoaqzsqKcq6mxsLillJelqZqdk32qbZ+EiHareXywboKki4mflpWeloHSuLS4yYGCsl9hlKmDpYiHoHqYlpp5qsl0mqOUqKmQkpqMfpqJmsbGd2WhgqVzgZ+Ogn2vX2+1Y7F1S6OGbadHg5Nkjo+bkXtvlI98bXl0fHptW2VqcnFmgGleYVhjbVxeWUlMTEpFREJBPUE8QT9KOzc5Nzk5Ojs7OzMuNjxBRklMTU9RU1daW1tbXV5fXl9fXlxcXFxcWE1CNzU3ODUvKSglJiUkJiksNUZOUFBNRkxKVkYqTDAvPi00TlRRHRw7PEYyLCSopMDGua2psq6tpqKds7msq6Glm6imqqyppqCmpZiro5+vrJ2moa2an6mlnae1oKOYlKirtrOsnKacoJaQpq2Smpyno6Cqp66ho6epsLPBsbKprKeUiZidpZuipK+ml6KVmJylpamZrpyrpaSdq6O2rKGxubCenLCotLS1ppaZqaWcoZCDnk53moKAn3qEo3yCpISGpp+cn5SEuHx8ermCf8zGw7Z3m6KRi59+mZeXinafl4qkmKSofq+Fm4OehKx9mZRhpWyjcI+FkIF9loRyrGCkc3GAmmG8fVJVdY2RoZV6fJCOh3J5coR+b1tsbndyaoFuWmNfaG5iZF1MTFFTQUhHRkg6Oks+QjEwODg1Njg3Ny0qNT09P0JER0lMTlBUV1lZWltcX19eXV9fXFpaWllVU09IQDc3Mi4sKi4rKicmP1FUVldXV1lYWFdVT1RGPEUyOlBbVBwbNj9HLC0gjIeZqaykq7mrr6CboqyztaafoZWlr66uqKeepaWapKehs66iqaezoJqppJSjtaOjlZehqbW5pJyjnaOTkKKymZ6bpqWhoq+tnKSoorWxw7CtqaypkYaRnKedo6ScpZeemJiZpaOnmK2hq6Kkl66lu6yit7aunp62tLqztaiaoLGjpqCIkNK1w7d6h46FkZOPgKZ4lKJ3jKGShaWDi3Krh4a0bnJpmaSdlYmffZeZh4eQc66CpZujjaaKk5yIlJCabXCyXKVzk3qcbJl/e5l+bqlhonJyfp9ic7K4aHeOkqSXfImKj4h1e3iNgWxod2l4c25/dFxkZG1tZmhgSlpXWDxIRj9TM0BGPjwqKDYzLjAxMykmNDo7PD0+QENFSUtOUFJUVldXWV1fX15eYGBdWltaWFVSUlFGOjIyMzAvKysoQFFSVFVUU1RWV1dYWFdVVVZUUU9RW1UlITJBSCMpJZJyjYquv7+8u7Wel6ikrraiopmVo6qnramqmaWin6agoLWmoqmnsaSUq6OPpK2knZCamqq0tKSdpZypkpSXr6CgnqajnKectZmgqqO1qsKvqKqooYyEj5yioaajlZqanJiamKajpZepp6ugo5uspryslb2wrZ+jsbW7rbapnqu0pqqafKiRfXyweIuApKWInG2yb6GHrXyij4Ool5qBrImGrYWglKigo5eFn4GZloF7kn6rgZ2Zlourd52gj4iTkn95r12jgXymp2SegHyXdWquXaVscoWZXWBbjKBtlI+kl4GSipOId3mBln5pbH5ifXRtf3lfZ2Vwb2dnaEJZX1o9SlMyUzhBQUM3JCQzKycnMywgLzY2NzQzNjpAQ0ZJS01OUVNTU1ZaXV9hYGFhYV5dW1pYU1BPTkk4MTUyLiosQVRWVlZVVFVVVVVUVFVUU1NWV1dYVlVWUUhGSUojKCi8kpuEqcbDt8G0n5qtoK65pqOOmqOkoK+uqZ+jnp2tmJ65oKOrobCqmq6hkaqppZaKmpCtsaynoKibrZiZj62ioZ6loZmknK2Xn6iltqi+rqSpo5+MgI6bm6CmnpKUmZuUmZmlo6KYp6uqoaKeqKe8pJfDraujoq20vK2wqaO2sautmnevfpGLnIWHfLqtiZhksIxllq59oZCEp5ecgq2LhbCGp5qkoqKRhaBcbGuCs2B/rXx7goGybGZumZeLiLFafbRbpINryKJmn4F8u1l2tVqyfVOvgXqsWIChbZeNppiIlI2Sk3h3jJt9Y3N8YoN3dIB8YWpmb21mZWVPVWNcQVRdPUgoPjk9NCEhLCQfMi4gKjEvMDQ1Nzk6PEFDRkhKTE5QUFJUV1peYGBgYWJeX1xbWFVQTUpHQzU1My4vQFVZWFdYV1dYV1dYV1ZXV1dXWFdXWFlaWltcWFdXR0I70p+zsbe+u7TBs6Ocraalt6mgi5mgn52ysaieop+dtZigs6iqq56wrZ6snJWuqKKOiZuOr6ypp6Oomq6Tmo+pmqGdpZ+Zo6KlmJ6iqLGou66kqJ6dj32Lm5ahoJmQkZqckZmXqJ6fl6etpaOkoqSpup6gxqemqaGstreusKmhv7CwsJiCqpKjr46bgIakl5iQgIC4w7qEj52ThaiZnYOsi4Oviqicm6arkX7VvcKqYqS/vX1/o4KD17q3tYSUkoKevb6EaqOBb6uEbp1/erKxx4Nrq7G9rHl4or67dICVjKSZjZiNk5l3f4+ZeWJ8eWSMZniBe2BrZWpqYlBiW1NpXEBUYEJMKTw6NC8fHyQeJTIgHCQoMDQ5NjY3ODs+QURGR0pLTU5OUVRXXWFcX19hXmBbXFlUUU1IQz48QT81PVNZWVhZWVpZWlpZWFdXWFlaWllZWFlbW11dXFpWWFRXWruVtLSxwLmyvbOina6nprOmnYyXpb+ptq+nob+mprGbnrGcuaifrq+lp5WUr6yXjIOaka6mo6yhpZyqoJiKo5OmnaebmqCoopidoKusqbisp6Oal5N7iJmSppuTj5CYmY6Xk6iYnpaoqJ6opqCiqrqeqcWjobCkrLS2rLKso7+rsrKcdXaqpbeFZYqgcGeskIqPbm53pZCboIJ2sZuXcJGOcpeppJuYr6RybG1tZot4b22DmXGBemlwaWeJlpWXcWhphYZncYZkXYpjaW9aXWd+eKZgYnKQk3BmZICNko2glZWXjZKaeoWNk3RkhndnjGp4fnlkbGNmbGJKZVdKa1k6UGREUCdKOSsjHCAaIiwpGBsYLTIuNTo0NTc6PD9BQkRFSEtMTU9RU1ZcV1pcYF9hXV1bVFBMSEQ9OkFCN01YWVpZWVpZWFhZWFdXVldZXV5eXVxcXF1eXV5dW1tVV16ola20qbq5srSqqaKun6SzqpmSvbHDx7y0qZ6/q6yjoKeroLqjpK6sraaOlq2qkIyFlZatn6aqop+ko6CRi6WSppmpmZajqaCWnKWlpq65qqyZmpOSe4SXjqaXjpGQl5SNl5Smk52Wp6KZr6Wdoqu5n7DBqKW0p62xs6ywrqq8p7G7mIyiqaa2nImXo5iGqZuQlJ2SqrSanKStorSYpKOfoqOeoqWilqynjJKTjYeTnZ2VkJmTmJCNlYR/pJqXlY6Lk5KKkIeEfmeMgXSDd3SHjHGnbX2Wk5SUgYGPj46Nm5Gdk5STnYCFkotwaI92b4l3dnx5aWxlZG9jVWFYQGlaR2JfTVgrRT0rJiE2NDAvHxwgJTIoKjc5OTQ2OTs+P0FCREZKS0tNUFBRV1VWWV5fYWNdXlRRSkVDPjk9QEFTWFtcWVdYWFhYWFlYWFpbW1xeX19gXl5eX19gYGBfWVlgpZapqqS1t6+uorClraCgtrGRjqrEvMO5tqmhpJ2bpZ2wqKS3p52ptaeokZiso4uIiY+cp5atpKGaqJ6fk5Wkl6iaqZmUpqCjj5qnmKC0uaeqmJqQjXyBlYyhlIuVkZWQj5KXpI6dmKiemrSjnKart6ivwq+kuKewsLKvq6y2vaOywJqTp6SmtaKSnaefjamfjZKfoq2xm6Kks6uzmqajnqasoJ+enZetnpOaopyUkJermY2YmZeQlp6Rh6CelJSGk4yPjZWMgX9mjYh1iHd6iYR0nGqIkpaVkol9jJaRkJaQnpCZkp2BhpaFeHGUcnmJf3F7fmpvZF9waWBcX1ltYlBgYk9YOUZGRT0yPD04LyomKykmHSY0MDY2NTg6PT0/QUFDSEpHSktMTVNTU1VaYGBpYGVWUEpBQ0I7OUVNVlteXltaXFtbW1xdXV9eXV5fYGFhYmFhYWBiYmJkYlxbY5iWpKijsLOsrqOpp62gqLWqkI+bo7K5raqroaKZepyhsKSmsamXnLimo5SYqZyOhoqJm6KQr56klqigoZKXmZyui6uWj6iZp4yYqI6duLWjpZibjYl5gpSMm5OKlZGTkI2RlqGLnJ2nnJ23on+DrrWisLB1pL+ks6F5e6Kttb+XeLCmoYqAqn9kXGJ3oI6knoOWfm2UtZ2kqbCspWagoZR0epuYcIGZqplsf6SpimWcpZyRl5iXi5KbkISdm5CUg5OHjo6SioV4a5CIdodxfIaBgWFpiYyVk4xbdpWRZ2eOjHF5oZWVZHiXhYB2l2iCiYJueX9rcGVfdm9ra2dcZWNhYW1RWT1NTU5SRj1AVEI5MS8eHyY0OjMwNjY3ODw7PkBBQkZIQkdHSUtMVFVVWV1gaGZnWFFJPERHPDlVUltgYWJgXl9fYGFhX1xdX19fYWFiY2RhYmFhZWRjaGReXWaclqajobCxrKuqpamuo6etpZKVqrSusKWZqaWql3OLnK+gqKunlJe5oKCPnKSekX6IiJqejayapJWnop6Ol5KehXWuj4immqiRlqOIm7mzp6CYmIuJdXeTjZaTipOQkJSMj5OfjZmepZibsZWAjJu1nbSMko+9qKJ+p6N7pbG6g46PqJ+EjIaPsamvjIqWopp5gIushp2eo6mrqYmWh5p3ppx7iJyBmKeDgXuds3uKhqCYmZSYloGQlpaDmZpieYiRhI6PkouEbnGQiHqCcYGBhoCHdIiFl5N4lmiTdKCac3uZgpyZhJh+kYiBgphpjIyEanh7cXBnZXhuaWxqXGRpaWRxWlxHU0tRQEU1LVlUVDYpITA5PT42NDM1Njg7Oj0+Pj9ESUBJRUpLR1JYWlhbYWFpZllRSDlETDw+YlZeYmRlZGBhYWBiYl9dYGFhYmJiY2ZnY2JhYGVkY2djYWFonZikn6aurquoraCpsaenqqWZk6zEvK+glKWntJ2Pg5ysnKeioI2Qvp6ZjZ+aoZF9ho+Yl4isnaOWoaGSjZSJhoCRqI6Hopyjk5adhp65saedmpKOhXB1kImVkIqUj46bi46RnpCVnqOUnauHn7SJtJqui8qIq6+Kt4WNsISzsoapjqmZjZ18qI9ye3ecjqaWaJWkebSMoaCoqpOZwoKAq4mZoXKegJulfZeFlbOBoX2hk5+PmJiAjpSciZiSi3yFlIaNlZOKhG50koaAe3OHgYR9hXWGg5iBj8VmgKmHj6JqnYGel4CZgIqMg4iYb42ShGd3dHt2Z2h1cGdoa15ibmxmaldkRVxQTDJFNDZNYGM3JjM8RUdEOjYzNjU4Ozg+PT0+Qkw/TklKTENQWl1cV2JeamxcUUU9S01ASWRYXWNmaGdiYmJiY2NfX2JhYmNjY2RpaWNiYmJlY2FmY2JiaZWXo6CwqamopqygpbmxqqummpSeoaSpoZSjqbWir3+gp52lnp2JlL2ak42gkp2QeYOWlZGIq5mcm5qihY+MdpubjqCRiJ6jm5aYl4aiuKylmZuMjH9ibY+Lk5CNj4uMl4uPkZ6Nkp6gmKCnfqGnh62doJaukKCenZGHgqGNrbKIpI6sm4yafqJ2gJmUa4GrdU2reIeNnZOcqqmCqqt+hKF8e6dqnoCTbGeXhpi3iZ5+bmBjWIOXf417ZGeLc5l9eZdsXHyXbmBTcYVcYG16hGBZZYJ+hYGZcaira4OjbnKlb5+CnGdknmxabIh6ZVlfgn5hV1BvdmVudHFqam9daW9samdXZk1cV0U5QTRHQ15rNCtJQ1FNTj04NDg1OTs2QDs7PkJPPlFSS01CSltdX1deX2N1YE1FOk1OTVRiXFtmZmlpYmJkYmRkYmFiYGJkY2FiamtkYmRkZ2RiZ2VhY2iYl56guaGqpKaskqK2vauvopmWnqClq6ufnK20oaeRoJ+gp5yZjpm0mZCLnoyVi3WBlJGNiqaWlpien36ThYWso4eckYqYqJiZmZGHpa+mopWZh4mAaW6IiIuOjomKjZGLj5Ghi5Kdn5qhpX+TgY+joZSgd5yWkKeDo6mAhqywh6V6jH6Emn2icHOTh5V7nox5bYecjJqSnKqcj4edfYOidHemZ55+d6VemHt9k3Oibpi3tLpzk4iBgLaoZIHGuHxxlbaMcYCbo2N0rKthfmqds35ufoiDj4OMmHGAo2xyo3Kegn6jXpyZs5Zve5ees3RyW56ygmlicHR1cWhvWGprcXBkW2ZcYUtEPUQ1UUFZcDI8UkdfSlI9PDM5NTo6NkM8O0BJUD9UTk5RQEVfXltZWGBge2RJQzhMV1VWY2FaZmZra2JiZWFkY2BhYmBkY19gY2tuY2NkZGhkYmdmY2holJaVo7mZq5yToI6luLatraCaoZuio6SsmpqxrKuSl6CZoaWZmpSerJuLiZF4i4VxgJaNio+hkJOUnZd9kYqOqKCGmI+KkqKTm5qMiqinpJ6PloeEfmt7h399j42Di5CQiY6Tn4GVm5+boJ+LiXecmKKNoHKhjImpiZ2okZiqroGujH56oJl5o5N4gHOXiIycfZWfh5uOmp2oiKNkoX6KlpCbjW2eaJuOb5qZe4CKp31yaHSqg56Dc6pnlJpdm4V2hJ1oqmqBuGZcqXCBnGGVjF+ndneKioCdaJp1h5OSmI1+nm2ZkGqmmVyofne7an2pWo6EXbNnXG5xeHdraVtwaXd3YV5jVmFBUEVPN1ZCUm00SlpaXk5aREAxNTE7OzdIPzpDSFU/WVNYXT5EYl1WYFFhY3xpRUI5TltdWGRmWGZmbm1iYmVfYWFfX2BgZWNeYmRvcV9kZWVrZGNpaGdraZadiaq2nKiJY5WcrLuysKydpZuap5+drJmdsKeqnZejmqKgmZaWoKOZhomNaYiAcnuXh4yWloSSlJiPeouElqSciZWQhoudkZybiI+ooZ+ai5CKgIBpgYZ5f5eMe4iNjoeOlZl9kqGeoKGTmHJon4qgj4xwko2DqYmaoaWqo6p+sK2koriXdqOzoqN/iJR4nXqqmX+ij5+dmYmYcqF9h42wtX1smpGheH6ZtaOjq6iEmXyafJyaf3SqWl1ve5eMeJ5iTX97e4VkephCTZ9ZompzfI5vgoqEmXabeYeJsbN/fpqSpnR+nW1xfJRvmXJpo12VdkhlY2BzcH19bmVfa2d1emJiXk9dVlxUVkBZRVBmRFJWXGFYXklEPUI4P0E6SEU4TEVYQVdSWlZFRmFcWmBLYG19cUVDPFVeYlplalZnaG1vYmZmXmFgXF1eYGhiX2VkdmxeZWdmbGRlbGhobGmUnYGxrpqEU1+hp7S6s7OpmqKLmqmbm6eSoKujoKePnp2dmpmVmKGdloeHiXeFgW55lYSQm4t9kZOWiHKBiZKhm3KSkIGImJSfmoSOqJuZlYqKinyDbISFcYKhjHiEjIiGkZiUe5Gin56jiK6GfbWEj56de6aWeqmCl56RjKOgf6doeG5+mXOgc3F8nYWYb5OCrXykhKefm4OkcF6paHajZHCmYZ3Tj3x7mXhyc2OihpB+onKjkHZrkLOLYIKYinSqsqi8f3eDbn+/pqq0Xpxvf3KXcIJzonJepGd0pmBopmya05h6gptudnmXa5t5dpdybKmlZ19keXF/hGxoZmNtdXZmXmBRWmVQUWFIVklUX1dTW2RqW2VQRUNLTEpLQUpEOFBAUE1YU1hPU1FgZWVpU2R4eXdJRkVjXWVaaGlTaWhqbmNqZmBjX1xdXV9oYmFoZXxkXmRnZGtkamxmaGxomJt/saxUXUt/qrCytbCzopyYhJemoKCijKSnn5aoiZmYmZSZk5Kgl46IhXtwfYRofI+Dk5qCd5GOj4pwgIaPk5JsmJR8iJGSo5WDjamZk5KKhIl5g3aIgG6Bn4Z3gJGFh5iglXmSoaOZn4mzoaK2i3qsp6SupXCpgJuRhoGelH6lgaOahphxnoSjra+Jl4t/jKSNlYOvo5V3tba2yaJzlIyDn2Cel6lteZaHoJt1oYd4oH6QlouBb01mo5JxmohzpXt6dWKDgm1+oGxyZGCcc390l2t7arS2tMamc5h9eZxqmpqrdIGabHN3l2mZeXSXcVBEfbNeanVreIZma2Zic3RvbFVbUlhnT1JnSVVMWFJVXGdrblVnV01KQUpNS0dKTkFRSlBkY2ptZXVzc354e251iXp7VFFObV5oXGtpUmpoaWxnbWdjZV9cXFxfaWJkaGt7X11kZ2NqZm5tZWlsZaKdibCohWVAlKKyrK+vtaGij3+Wp6Gho4ukppybpYKZl5eOl5CQm5OOiIN5a3mGZYOMf5afeXWPiIyCaoWFkoSLhZ2NeoyKlaWSgpeolouRi4CJeoB9i3lwj6CFeYGUhoiVnpR+k6Smm5WWg2dueJxsomR8cqV4nJhwaKeCmY59pXuhl4OWcp92gYmUlY+5bY+KomJ9maOXiW5za6trdaBub6Zgm2mLkGmWh5uVdaKBfppgi4aNdW+IYmihZp5/apt1cGRniIJvcqJbX1tkoW5eiIxxfIB0cmSlbniiY2anZ5dyi5dtoW9SiI9uoF5kp1SLXVSYbW1ya3GBbXBoa3dzam5RVlVVZVlTbElYT1xIWGhocmpZa1ZQUkVWXE1YU2FVaGped3V7fHB9fHKCe39zd46Ag3deUXNhZ2JwZ1BraGhrbG9oZGdfXV1dYGpiaml2dV1cY2hjamlybGZrbWOdpZmmemV0bYunrqWpsLGln4t/lqmcnaOLoaGaoaKAlZmTjpqPi5eQjop7hnGAiGiLinyXmnN0iX2QfGWDh5WKiZWagnyIhpamj4Chqo+FkIqBin2AgI5zaY+lhH2FkoyHl5+NhpGppZ2JpniWm36liZaMspmekYSvl5+leZiKe6l1qJCEmm6looyShIyDvG18pa+Ch4aHlZedon6mfHKolaGWaJ9+b6xjloqWk3iobaqjgYl1iIJ3q5GmiGuSsWx3s4ypbIuGb2+gnpKVYn+rjKp3gYCOp593n32FpJWdoGiah3WrZp6tjLZzdr6Mo5NZg6aNq2F1cnRve3VwYmp9bmdsUlRYVGBgXGtMXFJcSV1sbXZfW3FYW19aZ3NlbW9xY3F0YHd6fnlyeYNyg36Be3uNgYKAdmJ5ZGNuc2RSbGdnb21yaWZpYV9eXGFqYmxse29cXGJpYm1pd21nbG5ilqarnYGAnqSWqqqeqKeto5iIgZapmZ2iiZqknKichIyaj4ackYWSjYyMdIV6iINvjYV+l5NzdIZykYNuf4uSh4aUkH17goWXpI1/paSNgI6JhJR1goeTbmyLqICCi5ONiJueiIuSqqKgj4B0lJeIfoF4lK+kf4KccY+GeZOOhoF7c6mNcn19epeWm4SNeHt9fYiUlZOLd5GZoaKFe3+KbIyGXHp5c3pxaW9+k4pxgHSCj5STcYaEgmWNf1+BgYx4dnOUdXB6b2+Jb4WGX3dpeI5mgoOGj6qcf3R9lmmJiG9+dXyDdW1sZoxzeHuXd4Raald5j2lud3Jxb3d4b11rhW5oZ1ZZXlZcZGpjVWBVXlFfb3d5a2p3ZWpqanV8cHF0c2FvdWJze4F4dXmCdX+Af4F5i4WCfXttgG1keW5eV25naHVreGppaWRcYFpjaWVscXVuWltia2Rsa3ltaGxvYY6Vuqmni6Gim6ekmaSdq6Gfg4OWqpCdn4iZppqomIKBnIt+lpSHjoqJjHKCfI58fo+Ee5eOdHKDcJWGfH2Si4aGj4Z5foCGmKOMe6afioWPj4SVg4aOmHdxhKqFjZGcj4eenYaKmqigoKuDiY2Vm39+ipetqJCTqJF4cZ+ThX2UcH+rh3F+lXFqb3yBn4t/kY6LaG5dhI2NnJ2gkHOXjYlydWyDdnSAWXJvh5GCfn+Mal1pZHuFhIiAYGl4e5x8hI2DdoKHhGl6jIlsYnFzg3dfc42DipGolodnjY6CbHaKgm6Di3dtZGVjeoJ6lVpbaWZtdlt7eXd0bnNyg2ZcbYlra2JZWFxZWGpxWl5gWV5dZXJ9enRvdGNqaml7fHJ6dnRkbXRobHt/dXp9e3l5f4B/cIaJg3t9c356cn9oVFxyaWx2cHVna2dkXWFZamhranFybVdbZW1sZ3J5b2hqbWCMjKuxoZCjoZqfn5iemaihoH2ClquMn5OGmqGRpJV/e5iFfJKZiYiGhopyfICLdoWLgoSWinJvgHOYhoR+k4ODhoqCeoCEipqfj4Gln4Z3jpeIlYuLnJeEg3qsgZCXmJOJnZyGh6Gqn6Kio4uIk5udo5mWq6Kop6GTnImZkX56kJCGqX+Ak5GSk5yxpZqUnY+NsZKYhKaOjZadoYqRnYSJk4tsfY53d2aDhpGLfYmehYeLj4iIgYWEkXd8e3WbpIqHi6CMh5Z/gI2DgXdxdYaEf3iJiIuRp5GEh46HgouPinqFiYeNf3VqgIN8eZlpcWhgc4pwfXt3dm93dIFdXm+GZ25fXllaXFNncFVjW1thbGh0e3tybnBjamlof3tteH5waHBwbGaAe3KCgHd/fX+Ee22DjIV8enl8fnqDeE5kdmpzbnF7ZGtlYmJgW3NmcGZycWxVXWx0bWh4enBnaWtljYieup+Xo6GYlZmYlJikoJx6fpepjZ2MhZ+cip2WfHmVg3uOmYmGg4SGbXiAf3KAh36Ik4Rta356l4eEg5B+gIaEh3yHg42bnZKGqZ6CcoqPhpKSi5yRfI17qYONkZeVjpuWhYWbpp+imp2Gg5KamZmQmaahpp6ekJeCk4x4fYmQhqd8fY+QkYaYqqGck5yOjamNkoCejYmUm6CEj5iAiI+EcXmGcnVhf4SQh3aMmYGDj4KGhX+GhJVuenZ1lKSMjYabhoaQdYGMfn5zc3yJhXt5jY+FlKiQh4SPgYKJiIh0goaGiHltanx/e21oa2xmXnl/aHx7dnR2dXt3XGBwfW50YGNaW15RZmxTZFpdYGpodHl+cGxsY2pqZ4B/a3J/a2t0bnduhHluhoB2goB9hXdyg42Hfnt7fIB7gotgaXtrdWhqg2RqY2BpXGN1Z29idW1sVGJxeWVveXpyZWptbYuKn7iaoqSfk5KWl4uan56cenecpJCbiYakk4qYmXl6jYV7ipGDjIKCgmx7f3hygIV9ipB8a2h9gpeJgYiOfH6FhId8j4CPm5uQiKabf3CLi4yShqChioWMfKeQh46RlpKWkneMo6ChnZaaf4GQmpiTjZqjoqSbmJKcgJCHe4GGkYmhgX6NjY98l6SgoJKZkI+ljI+BnJKKlJmdf5OTf4iPgnZ1gnF3YX6BjoZzipZ9iIxxjH6ChYaPaHhyeo6ak5GAmH+JjHODiX19cnp8jYZ8e5OOhJemlI2GkHuEhYaEc3+AhIV4ZHB6fnh5cGtqZl5+c2l8dXVzfHOAal5gdHZwd2RjWF1eUmloU2RYXl9naXV4gXFma2NsZ2V/gGptfWdtcGp9d4V6a4uBcoGBfoF1doKNhn98eoCBfX+PanKDbnRpYohobGJfcVZ0b2xtYHhobFdqdHZjdHp6cWJrb3mJjZ+zkqWmnY6QmI+GnKCam3t1o56Nl3+MoYqImpZ4fIaHfoSKfoiCgX9wfnp0dYKFfomQd2djfYaXioKKjXh9gI2DeZaAlZeVjZafmn1vi4GRk4Wlm4eMiYOmlYSRipWXkpF2kZ2hoZiUl3l/jpiXjpaanaWempSVnXuSiIV5h5iPn3+Cio6Mc5einqCSmI6PoYyMg5iYhJSXmn+Zjn2KjoJ4cn5ue2SAfIuGcYeTgJGCa4eDgYCKhWZ2cH2IlJqOfpR5jYt9gol+fHKAeYuGeoWSi4yZo5eChIt2h4OBgHR4f4aCc152d3xzfXZma2Rgfmprd3NzdX1xfGNjYXNudXJtYVlfXVprY1JiV19fZ2p0eYVwYmpjbGZofIJraHRobG9of3yBeWyPhXGAg4N/dHyDjYGAfnqCg358kG11iXR0bWaKbGpiY3VWg2lwbWB5Z2xhanZwZXh7eXBfcWyFhZCdr5inqZ6OjZeHhZ+TlZd8dqiaiZh5lpyLjJmQeHyBi319hHuAgoF4c3h5c32Ag3+IioBkXn2LlId/hYd0fX6Kf36YhJaTloyjoJd+cod7k5GKpo+MjoqSoJGDkI+Tl5GKgY+YoJqSkJF0gI6SlImdnZ6nmZiOlZd1kJGLbYiakZt8iImQiW+XnZqikpWKjJ2LhoGTnYCUk5aImop9i4qCe3F6a3ZtfH+Mf26Fk4OUeG+ChH5+i4Flc2p9gpiYhYCOdZKKhXqJf3d5gX6HgX2Ej4aNlaWReYWCdIiGe35xcn6EgWtgeXR5cHxuYW5iZXtibm92c3h3c3RhdmBvbHVub1xaXl1daV1PXFdiYGdscnqIal9pZWpjaHeHbWZsaGlsZ4B8endukIhzgIOEfXSBhol6g316gYR9fI5yeYt4eG1sh2toX2lyYodocW9ldmdtbGF6aGp8e3dwYXdtioGZmquhpameiouRhomeipSWfHasl4yWfJ6TkZaUiHZ+e4p8fIB2d3+Ab3Rzem+FfYGAiX58YVx+j5KGf4SEcnqAhnqPkYeRkZuSpJuTgX2BfI2KkqOJjYqNlpqMhZCXkpWNiIiMkp2Tj4yNboSQj5GJnpmioZiXipeTcIubhmeJm5CVe4qFkIpwlpqUoZGRiIqYjIJ/kp9+k5CUjZqQfIuGiHRzdWtxb3Z9jHVvhpGOk3J0gHyCgol9ZXJuen+blX6FinWSjIJ1intwgn+Ch32GjYuFjpaqjnuIfX6KhHZ8bmx9goBhZndzdG56YV5vYGt0XnBqe3l5bHJwZXlebmxzbXNYWl1fYWlaT1ZXZGJncHF/h2VdaWhnYmdxjW5jaGhlaWeAend1b46Fc4GBg3x1gomFeIV8eISGeoCJd3+Le3pyeYNqa19waHR/a3FubXFnb2tle2Juf3p3cGt3d4l/o5mjqKGnm4iMioGPnYaSmnR/qJORjYagjJWTkIBzfHaFeHmAcnN7hWtyb3ltiXZ/gIZucVtZfpKNiICBgXZ1gX9/oIaPipGcl6CTlneJfoCMiJydio+GkpeWhYiUmI6Wi4qNjoydio6RhG2Ji4+RipyWoZyZloaZiWyHpYVniJ+Mk4CNhIyBeJOYkp2RkIiJlI1/fpCZfZKOkY6bk32LgYRwdnBsbm9xfIdqc4OPmIpxeIB1gomDemd0cHeCm5B9ioV7lZN7eIp1cot8h457i4eFio+cpYl8hHaBiX53d2xofX9+W3FycW9vdlleb2Bwal5vanx6cW5tam13YHBva3FtWVhgYWFsV1BSWWVlYnVvhIFhXWttZGNla5JtYGZmX2dqgXVycm+LgHR/goB5doCLgHmFfneHhnaDhXuHi397dop/anFifGKFfG9wbHVqaG5sdndfcX55e3N1c3+CfqWWm62fp5eFjIN+lpWDjp10iZ6TkoaKmoyVjox6cnh0gnByhXRxdYhsbmx0bId2g31/bW5VUYGrlIeCeIB2coN5gqCCkIGTkpibkZl3kXqCjJKkmpOOiJSYkoSFlpiLk4uJjo+HnYSRi31yi4WIj4icmZ+bl5WBlYBqiJ+JaIiiiZSFkoSKcYORl4+ajY+Mi46Nd3uTkXuPjI6TmI18iX2BbHdqb2tsbXuAYnp+j5eBd3qBeIONfXpodW12iZeMgImHfJWRcnuGcXiOe4uOe4l/hI6Rn5+GfXx3gYp8dm9naX5/dl12bm1rcHJVXW5icmFfbW55cGhwZmdzdWhwbGF3ZV1VZWBgcFNQTltlZF14b4h7XlxocWJiZWWRaV9oZVtnb35va3Fzin12fYWAdXZ/jHl7hoB4h4NzhoV+jIyEfHmVeGdyaoNgh35vb2t7YGltdH90X3R8eIZ3c3OFfHmhkJqxnKaPg4p/gpmJf4qcfoqYko6EiJeOjo6Ed3R3c4BwcIVzcHGDb2ppdW2Cbn18bXVzUk6C38mS1pN8cHSDdYOfgpF2lJCYm5CZe5NyhZCfoZOTkImSm5OFfZWVh4yNh5KNiJx/joF4e4x/iIyKnJycm5aUeo54aYuUim6KpYaUiZiEhmOMkZiNlImWi4yJi3B6lYp8jomLk5KKeoZ9f218ZXNwa217elyBepCPgXt+f4CGj3t6aXVrdIyQioOHhn6XjG1/gHCCjoCOiX6Fe4SRlpucjH13eIKOd3JrZG58gGlnc25naHNsU11vZHBaX2xxd2dra2JneHNwcGRgeGBhVWtfXnRPTUpfZmJceHCJdFxbZXVgYWRkjmNgZmJYaXN0bmxxdot8dHmGgnZ3fotzf4Z/eol/cYmHgZCKiHx+mXZlc259ZYd/bnBrgFlrbnl6cmB2enuNdnJ2inZ6n4ycr5ugkYOFeIiVfnuInIaEnpCOhYyXhJOOh4F1d3B5cW+Eb21ufnJjZHdwfG56fGpobGKkmsHcru+ic2x1g3WEoYSRbpWPlJ+Um4CRcIWLo5eJjpWKkJ2Vg4CUj4WIj4CSioqXfod7dn+JeIaFjpyal5mPkHaLeHCJi45/jaaGk4uehoZei5SXiY6IjYqKhIlsfJeDfomGipGQhnaGfn5sfWR4dWpvenRYiHuSh4Z6f3+Aho1/emZ0aoGLkIuEhIGNmIZtg3dviZODkoZ/hHuCkpeUmpF1dHiHi3RycGRydn9fcmxvYWh0ZlJgcGdrVV5uc3lhcmNgaX5xcm5bY3JhY1ZuWlx3TExLY2ZhXXZyiW1bXGR4XmBkZoRfY2NeWGlya25rcneLfXN3hIF4eHyJcYOEfH2Ie3SLiIeVhYx/f5hzaHVyeW2Le250cIBXcHp2eXFkdnmGjGh2gIlxgJ2Imaico5OFfXGMk3h4iZyDhJ+MjnyWjYCaiIR8c3dwc2pvgWxqbXx0XmB3dntwdHpnYGV869q1ycPciXNsdIB2ipqIjGmXj46clZKBiHCFiKCOhYuVioyXk3yNkoeCiI96kYuGj4KAd3iDhHKHgpOblpOYho12iIByh4SMiZykhZaOoISKYYOVj4WIhYiMhoCHaH2UgH6DhYqOj4Jyh3+AcndodnJpdHhtWo19k4OGfYCDgYSLg3ZidW2KgpGMhICAk5J+b4NteoiRiJSFfYJ/gpOUkpiJbnF5i4R0am9pb3Z+XXJobVxpdF9RZHFoZlNfcXZ0YHBgXWiDcXNqWGdpY2lXbVdbdExKS2VmXmFyc4VpW1xleV5eZGd6YGRfXVlrbmVuanR3in5zcoF/e3Z6iHOFg3x/h3Z2ioWPmIGNgnuTdmx3dnl4k3Vud3p9WHmFcYBuZ3h2kYJkdoaFcYqWhpqhm6GKhnNvkotxdo2afImZiIl8n3+EmX+CeXJ0bm9kcn5pZmx3d1tfeHt6cXF/aWFnYX/Vto6RpnhucXd7cZKQjIZqmI2ImpCLhXpoh4uZhoGSkIaGl417jIyAgImNe5CNfomFenV7g3xxhoCVmY6SlIKJdoSIeIaDjZWgoYiXkaGAiWF/lIeEh4OIjH9/gmZ9kYB/gIOMj5B+bYN9g3VsbXd1dHd2a2OOgo+AhX98hICFiX9wYHRyhn2QjoN9f5KKenKFZ3uFjIiNhXyFgIGVkJGThW5veIt+dGxtaGl3emBnaWlYa3RZUmhyaWJQYnJ4bWJlXlpqhG50YlxoYGVtX29UWm5NR05mZFxmbnGAa1pbY3NfXGNrdmRlXV1abGxibGpzdoaAcW9/fH10eIZ4hYN8gId1eImBkpV7iYZ2iYFveHl7hJNvbXuAdl6Df3SBbGh6c5RzZ3OHfHKSkoSan5ufhod1dZN+bXWSln2HkIOKjZp8jJp2fnZxb2xqYXR8Z2JpdXlaYHd7eW1xfmVkaGhXnY9fcnOXvMSEdnGUiI99cZaLhpuSi4dyaoiPloB7lYuBhJqMfIqFfHuJi3+UiHWJhnZ3foFydYaBnpSFlI+Eg3KBineGfoybn5qIlY+egYlmfpOCf4WCiIlxgX1mfox8eX+AiIyPfWmBfoR2Z3B5eHN3dGxrjoaLgoqAeYKBhYSBbF9zeXt+jouHfIKQgX9zgmp6hYmNh4V5hX6CmY6RjX5ubXqIfHVzbWVle3NhW3BiV25xU1NtcmhhTmd1eGZgXl1Zb4Fvc1plYl5qbmBwT1lqUURTZmBaam5tfG5ZW11tY1picHZjZlxdYGtpY2xqc3aBg3Btfnx/dHWDeoOCfIGFdn6IgZaQeISKdIGIcnl5fo2Qb297gHFpgXh6fm1se3WVa2p4hHRrk42Gn5mgmYSHbn2LdWl3l45+gYqClJeKeY+Vb3p0cWxqZGBzemhgZXF6WmByfHlncXlhZWWPsbJ3S2JapdnQlnF7kIqPd32TioSYkIuFbmuFkpJ6eZKGgYSYinyGf3d3iYqEloBwi4hxdX57anmFg6WQhJONhH9wgIR4hnuInpuWjZWSloWIcHuTgn2CgoiCbYB3aICFeXKAgYOKiHxlfn+EdmRxc4BpeXFwdZmOhoOLfXd5gYV6g2tccn9zgomHin6HinuJc4JvcoWIkIaGc4V7gpqNjoV5bm59g351eWNlaHtuXlh2Wldwa05XcXJmYEtsd3RhXlxbWnV+c3BYZ15na3Jgb05XZ1I/WGZeWm9rZ3lxW1pYa2VZY3B5XmdcXmVsZ2ZraXF3f4hvbH9+gHVvgnt/gn+Cf3aBhImXiXGCjXF7hnx6eYSTjHVqeX5rb350f3xvcnt6k29ugX54Z5KLg6GZnJGChWeGg29neZWIfX6EgpiKgXyOjWl4c2trZl9hb3ltX2JveFxka4J5YXF2X2Vl1Oq9izI6PouOf3F4hYeNjXWClox+ko2Lfm1rhIyMdXyPf4WBlIh8gndudoeEg5d3b4iFbHV7dWZ5goOmi4KPi4R+boF2eIV8iZ+SjpKTlI6Mh397koZ3foOMgmp/cmiAfnlufHyCi4R3YnqFgnJkcml+bnZydYKcjIGAhYB0dn6Ac4JvXG6AdXmLhIt8iIF+iXl7cm2KhZGFjHODeoCXjIuAdW1qdoB/dHNbZ2d1bldWe1JZb2RMWnJyZVtJcXhvXFtbWV11fnRoWWJbaGZvZGpNV2VQPV1lXF11ZWB1b1pZVG5jWWNxeVpoXWBnbWdpa2lwd32ObWmChH95boB8fYF/gXp1goCNk4RwgYtud36Ae3uIkol/aHp9anN7coV6c3Z9fox5eIR9fGuMjYSbnpaMgYBsjX1raH6Ni3p9foOTgn59iohrdnFnaGJbYmdzb19ha3NgaHCIeWJzdF5jZJugj25cNVqvtXRpgIh8kYZ1hZWFc46KiXZvbISChnR5iXiJfJKHeX5yZ3aJfn6Yb3GHf2l2eW5meYeEpIaAh42Kfm+Ad4KDf4+biYSWk5mKjIWJfJCIcHp9hHtofmxqgHt6ant3goiBcmB3gX5yZHJndoNudXyGlpKCfYKBb3d6fHV/bVlxgXd1jYOHeIh2hIl7eXRvi4KRgoZzgH5/lImKfG9uaW2BgXRtW2VkcW9QWnpNW25bT1tyb2RVS3N4aVdZWlphcYB0YF1dYGdkaWlmTllnTUBgY1tgdWBddWxYV1N0YFpkb3JXal5iaGpnbWxocHd8k2xohIp9fXB+fnuBgIF6d39/iouDcXyHb3F3g397iYyPg2l9e213eHaKdnx4f4KGf4N+fXpthYyImaONhIN7dYt4a2yEh5B4fXqCkYCAfouDcHJxY2ZeWWZfb29fYGdwZmpuiHRhdG9bYWRqdnuAv5ympMi4cYSCcpJ7d4WSgnOQi4dycm+De4N0dId0iHeTiHl5cGN3h3qAk2lyhHZnd3VjanyCh52BgH+Oj35zgHWHe4KUkoV6mI+WkIiCiXuJiWt4eX50Z3poa395dGl6d4CDfWhgeIh9a2t0aHyBanaCjJGVf3t+f3F8dnx0f2JWeH5zdIuFg32EcYeKeHlxcYWEjoB/en9+do+GhHdqcWlsh4Fxb1xmYHFsSWR1S11sVFNZcm5iUU90eGFSWFhdYXCCc1thXGllZWRrZFBbcElDY2BbY29dXXdoVVdWdl1bZW5oVmteYWpnZW5uaHB2epNtaYiNeX1ye355goGBfHZ9g4iGg3B3hHJtd4KCfomLk39wgHt3eHqAjHSCeH6BgYKEeYB1b36Ki5ueiH2FeneFe2h0hYuQeX5/e4iGhHaPgGdwbl9kXFhlWW1yYWBgcGxraIhuYXRpWV9kboB3qdqpx4aHsnGId2+MdHqFjX95kol/dHN0fXd/b3F/bYV0k4V4dGtgeoJ5iY9mcoRwZ3VuW219gJCTf4B4kZN+eXxuiniDk46GdpiMk5CIhoZ8f4VsdHV+bGd2ZG17dm1qd3d/f3xhYniGeml1dWN+fGh1h4+Nlnx1gXdxgHt9boBaV3V/cHaFiH+Bem2JhnR6bHaChIV/fH56fXSMgn50aHRlboqDbHNaaF1zZEdtbUtaYFdWVXdtYlBSdHZYUFZYXmFyhG9cYGNtZWReb2NUXHFGQmVeXWVnXVt7YlFWXHRbWmdrYFZqX2BvZmZrcWhwdniOdGuOjXZ/dnh+d4GEgXt0fYOIh4NvcoB0cXV+hYKJjYp6dn94g3t8hYd3h3x9gX6EgHt+cnV5jI2gjIl5iXZ0g3hefYWXi3iGg3OFhoR3iXpibm1cYltbYVZpc2NgW2ducGaHcWFxZlddY2t/fMrOh7mham1timxxg3F7g4l+epCEeXhzeHV0e2psdmOEdZGCdm9mX32CeouKZXKCa2pxY1hseoWbiIKBc5eUeH99b4pzhIyOiXSZkJKJhouDe3l9cXBvfGZocWJteHFqbHF4fX16XWV6gHhqdnhmg3dodYmMjpV9cohqb36BeW99XVlzf251gYx8gm9wioBxd2l4gYKBgnh+c3x1h317c2dzYW6LgGtxV2lcdltHbWpMVlVdU1V7a2FPVHVyUFFUV15jdIVpXWBsamZjWm9hWGJvR0FnXGBlXVxWe15OVWVwWVtqaF1XZ2BecmVqaHJocHN3hnhulYt0f3p4fnmDiH91cn+GhY6CcHB7eHd2eYaGh4yGeXt/dIt9fYaEg4d+fn59h398eHV4eJGTn3+MfIptdYB4ZIOGlYVzkYpvhYWBeoN0ZG5qWV9bXF1UZ3JkYFlkcXJngHJia2VXW2Bqf3i+rnuft25hc4Voc3pxeIGEen2Lfnd3cnZve3Zlam9hh3WOgHNqYl5+eHmLhGZxf2hra1pWb3eIooCEf3GZk3KBenaEb4OElIp1l4qOiYWJhX14dHFuaHhfamxgbXZqZ2pseXd6dlpnfXx5ZnN+bYV1ZXWHjYaWgHCMZ2t7hHVudWJdcX1sdX2MfIJndod+bnFpdoB5f4B0fm17fIJ7eXFmbGJuiX1sbFVpX3ZVSmlqTlFOZ0xYe2hhTlV1a0xRVFVfZ3aDZl5gcWhnYldqXVxrZ0pEalliY1ZZVXlZTVZtallda2RcWWVjXnRlbWRxZ3JwdYF4cZmGdn9+d398hYd9dXOCiICVgm5zeXt6c3OFh4mJg3iBfXWPfnyEio2DgYR7fouDe3Z7d3eanZh6iYKGaXZ8e2yDg5J/co6BcIWCf4J/cGdsZ1hdW1xbU2RwZF5XYnJ1anVvZWVjV1xbaH9wb3KAc4lkZHl9aXN1c3KBg3eAg3h2cnVtanpxYWdrZ4ZzjYNtZl1ffXB7iX9pbXhnamRVV3JvjKZ8hHt2lpF0fXR+fG9+fZOIeJt9iYeEh4N9dXBxbGd0XGxnXmx0ZGdlaXpve3JZaIF3dWhwgXiCd2J3hot8lYFvjGpte4JxZ3RmYW56aHN4i3x/Y3eEd2pscnV8cnt7dH9ogH+AeXdvZGZibYV7bGpVaGFvUkpoak9LTm9HXXpmYU1VdGRKT1NXYWt3fmZdZ3NpZmBWZFdicFxLS2pXY2FVVFVzVkxYdWRZXmtgW1pjZV92Z21icGl0b3J+dHSZgnd/gHiAf4aEen11goR/l4VucnR8enVxhIWPgYB6i3VzkH98gZWNgIWEfX2Mhnp9gHd7o6WKeYiFhGt0e3p1goCLem6Ec3mEfYKDdm9qaWVWXVtaWlNibmRbWGFze2pobWlgYlhfWml/aWtvgGdsYGh5eGpyc3Ntg4B6f3x1dG16aGp5al9lbmiBdo+EZ2VYYndqfod7b2pwZ2ZdVFhvZ42ndoB6fJCOenZxgHF1eHuRgXqXdoeDgIaIdmpydWdnbltsZF1tcl9nYWp4aHtsW26Dc3RqcIF+enhhd4aFeZGFdIlycHqBc2RyaV1xeGVydIl8eWN0gHFnanl1c215eHZ5ZYV8f3l3cWRkY217fGpqVGdhZVNKa2dPR1FqRWB3ZmFNU3JdSk1VWmVseHxmX25xaWRdVmFVbm5WSlNnV2VdWE1Va1RKW3lfW19rXV1aYmVgeWhsYW9vdm5wd3V6mH53f4F5gICHhnp5eoN+gZODcXR0fnp2dIWIkX2AfJBrcpWAe4KfhX6HfYB+hoKAint3hKuef3qHh4NrcoF5dYB+gHRuhm58gHOKgGpwbmRkWF9aWVpUYmpnW1pfdYJpXm1sXGFXXFxrgWVydH1paVxrdnVnc3ZxbIR7fXx4dXJseWdpeGZdZHNoeneSgWNjVGVwaIKFeHhnaWphV1ZZZ2OOp29+d4CLjntxcn9pe3F8jn14kHOFfoCAhm5kdXJkZ2dcamFdb29cZ19tdGV6aF10gG9ya3F8fnV2YnSGjHuJiIGBeXN1gHZicW5bcnRjcXOFfHVlc4BtYW17cGtqfHp2dGeHdnt6dnFlYmRtcn1pa1NnXVxUS3FiUEZVYEdidmZhS1NvWEpNWFhoa3Z7ZWVucWZkWldeWHdlVEpcYldnV1lIV2RQSGJ4Wl1fbFpeXGFjXn5pamBvdHhtcG52g5d6coCAfH+JjIZ9dXWGeIeMfHN1dYF5enqCjI59foSJaXOWgXqKnX5+hXqBen98holzcY+tjHt7ho99ZHGHeXN8enVyb4Zse35sj3pjcG9iZV1lVllZV2Nma19dXXOFaFhxblteWFpcbHticHd1bGFZbHNzZ3R1b2yDeH5/eHZtbnRkaHRlW2d1ZnZ2kXpfXVJmZmuDgnR+YmRqXFRXXWJjjqRpeHODhpF5bnF8anpvfYd9dop0gnl9eYBpZHZsYGZfXmlfXXRrWWVdb29iemVcd3xrbm5weHl0dWVzhJOAiIOJe3dwc390Y3hlXHFxYnFygn10Z3KAZV9ud2plaHp9dW9wg3Z0fXRyYl9mbW58ZGhTZ1dYU012X1BKWVdIYnRjYUlUbVNKTVpXamxyfGNtbXNjYlpaW2F3XFNLY11XaFNWRlhgTUdpdVheYGxbW19iYlyEaWhhbnh5bW9qdoGQeW2DfoCBk4iEgXZ0iXSMhnRxdnaBeH19foyQgH6TfnB3lYN8mJJ5gIB4en6AdIiEdHGZoXp6f4mUd2N1h3hzd3RrdG5+a3h8cJFzXnBuYGdibFRaWldoY21mW1xxiWVTcm5bWlhXYGx2Y2l1amleWW1zcGtzc3NphHx+fnp2bm5sZGlxY1tqcmR0do5zW1dTZWFygH9ygl1iY11TWmBcY5GfZXFxhYSSdWxse29wcnx+fXOCeIF0e3p7ZGV1Z11iWWBnW152aFdiXXBoYXdhW3x2aWpyb3h0c3VpcYKWhId/hXd0a3F+b2d4WF1sbmNydIF6dGdwflxgcHJiYGtzf21udn9zcXhrcWFcZWxsemBmUmVTVlFPdVtRT1hRSGNzYWBHVmpQSVBaVmtra31mbm9xYltaWFlscVdSUGZWVmhTVEVZW05IcnVYX2NsYlhgYGFdi2pjZG16eGxwaXV5h3trg31/hJp8g4R5fIdtj4dybnZ6fHSCgnyLj4OCl3R4gZOFgZ6JdYGAgXR/gnGIg3ZwoZZzeoaLhnpld4pubXpuZnhwemtzdnONa151bmFnZWtSXVtVZ2Fsa1pccYxkT29uXVZYVWdpc2hidGVkXFhtdGxvdXR4aoZ8f3uHdo9zY2RrbmFcbm1jc3iHa1pUVmNkeH19cYZdZF9jVFpfWWKVlWNtcIOFinRraXxwZ3V4dX1te3V2cHt/dl9mcmNbXVZhY1hhdWVVX2BtZGFxXV1+cGhpdHF0cXV3a22FlIKJfYdyc2dwf3J0cFRcZ2tmcnWBd3RjbXZWY3JsW19wZ35mbnh+c3Rza25hWmRpandeZVNjVFVQU2xWUFZSUEdkcl9hRlhpTklYVFduaWV9aWx4a2JXXVVbdGRTUldoUVhmVFNHWVlPTXh2W19la2lZYWBeXo5uYmZreXVub2l2doB/bIOAfYeYe4CHgYl+a5OIcmZ0gHt1gIN9iY9/i5NyfIqRhYefhnt/hoxzgYZzfoJ2bqSLcoCNi3Z3bHqMYGR7cGZ5c3hsbXF3g2dkfG1jZmdoU19eVWdfbG5bXm6NaE5pbWBUVlNvZ3NrZXhkZFxYb3NscXp3cmyHe392m3p5a2FlbG1eYG9qZXB4fmdaVlhgbHh8e3CEX2NfZ1ZYX1djm4hia3CBh314bGx6bl14c258a3Z0b3B8gXNYam5eWFxVYWJXZHBjU15iaWFibFphfmxmbHR2b213d2xpho2AinuJbnJmcn5udG5kW2FpaXB0gXRzXmltU2VxZVZjb2R8ZHN4fXdscG1rYFlhZmd0XGRVYFVSTldkUk9bTk9IZG9cYkdZaU1KX0tZbWRgeWlufmRgVV9UXXVcU1JgZk5cYFVSSVtYUFl0dV1fZWtoWGJhW16NcWNnanhxc25odnR7hHKCg3qIjn58iYeNeW6QiXRrc4F0f3+IhYeRhJWPeX2MjoeRm4SAfIyFc3+Bc3R4cm+Tk5OTk5OTk5OTkpKSkpKSkpKSkpKSk5OTkpKSkpKSkpKSkpKSkZGRkJCPj4+Pj4+Ojo6Pj46OjY2Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2NjYyMjI2NjY2Njo6Ojo6OjY6OjY2Ojo6Oj4+Pjo2NjY2Oj4+Pj4+PjoKAfnp6fX5+fX1/fn59fn5+fn5+fn+Af4CAgIGAgIB/gIGBgYOHjI6Ojo6NjY2NjY2NjY2NjZKSkpOTkpKSkpKSkpKSkpGRkZGSkpKSkpKSkpKSkpKSkpKSkpGRkZCQkI+Pjo6Ojo6NjY6Ojo2NjY2Njo6Njo6OjY2NjY2Njo6Ojo6Ojo6NjYyMjY2MjIyNjY2Njo6Ojo6NjY2NjY2Njo6Ojo6OjY2NjY2Ojo6Ojo+Ogn99ent8fn59fX59fn5+fn5+fn5+f4B/gICAgICAgH+BgYCBg4aMjY6NjY2NjY2NjIyMjIyMkpGRkZGRkZGSkpKSkpKSkZKSkpKSk5KSkpKRkZGRkZKSkpGRkZGQkJCQj4+Ojo6OjY2NjY2Njo6Ojo6NjIyMjIyMjY6Ojo2Ojo6Pj4+Pjo6NjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Njo6Ojo2NjY2NjY2NjY6Ojo6Cf3x6fHx9fn19fn19fX59fn5+fn5+gH9/gICBgYGAf4CAgICDhouOjo2NjY2NjIyMjIyMjIySkZCQkJCQkJKSkpKSkZGSkpKSkpKSkpGRkZGRkZGRkJCQkJGRkZCQkJCPj46Pjo6Ojo6Ojo6Ojo6Ojo2MjIyMjIyNjo6Ojo6Njo6Ojo6OjY2MjIyMjIyMjIyMjY2NjY2NjY2NjY2NjY2Njo6NjY2MjIyNjY2Njo6OjoN/fHp8e31+fH1+fXx9fn59fn5+fn5/f3+BgYGAgICAgYCAgIOGi42NjY2NjIyMjIyMjIyMjJTO2tjY2NjamoGEhISEiF0tMDAwMC1GoaGhoaGhoJqZmpqampqKg4SEhIOEd2VnZmZmaFxDREREREFSzNrY2NjY3W09REREREU4Li8vLy8rSIWDg4ODg4OLjIyMjIyMjY2NjYyMjY2NjY2NjY2NjIyMjIyNjY2NjY2OhX19e3t6fX58fH59fX1+fX1+fn5+fn9/f4GBgYCAgICBgICAgoWKjI2MjIyMjIyMjIyMjIyMlNvp5+fn5+qcfoKCgoKGUxgdHR0dGTekpKSkpKSjnJycnJycnImBgoKBgYJyXV9fX19hUjQ1NTU1MkbY6ufn5+ftZy41NTU1NyccHR0dHRg6g4GBgYGAgYqLi4yMjIyMjIyMjIyMjIyMjY2NjY2MjIyMjIyMjY2NjY2GfH16e3p8fXt8fn19fX59fX5+fn5/f3+AgYCBgYGAgIGBgYGChYqNjYyMjIyMjIyMjIuLi4uSl5iYmJiZmZKPkJCQkJCMh4eHh4eHiZKTkpKSkpKRkZGRkZGRj46Ojo2NjYuJiYmJiYmIhYWFhYWFhpOUlJWVlJWKhYWFhYWFhIODg4KCgoSKioqKioqKi4uLi4uLi4uLjIyLi4yMjIyMjI2NjIyMjIyMjIyMjY2Njoh8f3l6ent8e319fX18fX19fX5+fn9/f4CBgYGBgYGAgYCAgYKFioyMjIyMjIyMjIuLi4uLi5GQj5CQkIuOkZGJh46KkJKSk4+OjY2Oh4+RkZGRkJCQkJCPj4+Pj4+Ojo6Njo6Ojo2Njo2Njo6Ojo6Ni4uLi4uMi42Ojo6Ojo6Ojo6NjY2NjIuLi4uLiouLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyNjY2NiX59eHh5fH18fX19fHx9fX59fn5+f3+AgICBgYGBgYCBgIGCgoSKjIyMjIyMjIyLi4uLi4qLkJCRkZGPhI6QkIaKj4WNkJCQh4iHh4uGiZCQkJCQkJCQkI+Pj4+Ojo6NjY2NjYyMjIyMjIyMjIyMjIyMjIyMjI2NjIyMjIyMjIyMi4uLi4uLi4uLi4qKiouLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjI2Lfnx3dnh7fXx7fX18fH19fn5+fn5/f4CAgIGBgYGBgIGAgIGChIqMjIyMjIuLi4uLioqKioqQkJCQkIqFjoiOhoaPiY2QkI2EiIaGjoWMj4+Pj4+Qj5CPj4+Ojo6OjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLi4uLi4qKioqKi4qKi4qKi4uKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIt+e3d2eHt8fHx9fX19fX1+fn5/fn9/f3+AgIGAgYGAgYCBgYGEiYyMi4uLi4uLioqKioqKipCQkJCPhYOMjpCOiYyJjZCRiYOFhoeMiYmPj4+Pj4+Pj4+Pjo6OjY2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKioqKioqLi4uKioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMin18dnZ4fHx7fH19fH19fn5+fn5+fn9/f4CAgYCBgYGBgIGAgYSJi4yLi4uLi4qKiomJiYmJkJCQkJCMhoyJjoeFjYmOi4yOiYaGhoiGiY+Pjo+Pj4+Pjo6OjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKioqKioqKioqKi4uLioqKioqKioqLi4uLi4uLjIyMjIyMi4uMjIyKf353eHp7enp8fHx8fX1+fn5+fn9+fn9/gICAgICBgICAgYCBhIqMi4uLioqKioqJiYmJiYmPj4+Pj5CMjouPjIqPjI6MjZCOjYuKjImOj46Ojo6Ojo6Ojo6NjYyMjIyLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLjIiAfXh5enp6e318e3t9fn5+fn5/f35+f39/gICBgICAgIGBgIGEiouLioqKioqJiYmJiYmIiI+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pjo+Oj46Ojo6Ojo6Ojo2NjYyMjIyLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLioqKi4uLh4B8eHp6eXt8fHt8fH1+fn5+fn9/fn9/f39/gIB/gIGAgIB/gYSJi4qKioqJiYmJiYmJiIiIj4+Pj4+Pj4+Pj46Pj4+Oj4+Ojo6Ojo6Ojo6OjY2NjY2NjY2MjIyMjIuLi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKiYmKioqKioqKioqKioqKioqKioqKi4uHgHt5eXh6fHx6e3t9fX5+fn5+f39+f39/f39/f3+BgYCAgH+BhIiLiomJiYmJiYmJiIiIiIiOjo6Ojo6Pj46MjI+Sj5COjo6Ojo6NjY2NjY2NjY2NjIyMjIyMjIuLi4uLioqKioqLi4uLi4uLi4uLi4uMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKiomKiomJiYqKioqKioqJiYmJioqKioqKioqKioqKioqKioqKi4aBe3h5eHp8ent7fH19fn5+fn5/f35/f39+fn9/f4CAgYCAgIGEiIqJiYmJiYmJiIiIiIeHh46Ojo6Ojo6Ojo+MkJOQkI+Ojo6NjY2NjY2NjYyMjIyMjIyMjIuLi4uLi4qKioqKioqKi4uLi4uLi4uLi4uLi4uMjIyLi4uLi4uLioqKioqKioqKiYmJiYmJiYmJiYmKioqKiomJiYmJiYmJiYqKioqKiomJioqKioqKhYB6eHl5fHt6ent8fH1+fn1+fn9/fX9/f35/f39/gICBgICAgYSIiomJiYiIiIiIiIeHh4eHjY2Ojo6Ojo6Pj4+PjoyNkI2NjY2NjY2MjIyMjIyMjIyMi4uLi4uLioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYmJiYmJiYmKioqJiYmJiYmJiYmJiYmKioqJiYmJiYmJioqFf3l6eXh7e3p7fHx7fn5+fX5+f39+f39/fn+Af3+AgICBgYCChIeKiYmIiIiIh4eHh4eHh4eNjY2Njo6Oi42Nj5WPiYyPjYyNjYyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYR+eXt5ent7eXt9fHt+fn59fn5+f35/fn9+f3+AgICAf4CAgICEh4mIiIiHh4eHh4eHh4aGhoyNjY2NjY+MjImKj42IjJGPjY2NjIyMjIyMjIyLi4uLi4uKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uKioqJiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJg355e3p8e3p7fX17fH9+fn5+fX1/fn9+f3+Af4CAgH+AgH9/f4OGiIiHh4eHh4aGhoaGhoaGjIyMjIyLiYyKiIeJhoyOjJCMjZGOjIyMi4uLi4uLi4uLi4qKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiImJiYmJiYmJiYmJiYmJiYmJiYmIiImJiYmJiYmJiYmJiYiIiIiIiYmCf3h7e3t6enx9fHx9f39+fn19fn9/f39/f4F/gIB/gICAgICAg4aIh4eHhoaGhoaGhoaGhoWMjIyMi4yOjoyKioeEiIuKjIuNjo+Li4uLi4uLi4uLi4uLioqKiomJiYmKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiomJiYmJiYiIiIiIiIiIiImJiYmJiYmJiYmJiIiIiIiIiYmIiIiIiIiIiIiIiIiIiIJ/eHp7enp6e3x8fX1+f35+fX1+f39/fn+AgICAf3+Af4CAgYCDhYiHh4aGhoaGhoaFhYWFhYyMjI2NjJCSjI2Ii4mJi4uLi4mLjIqMi4uLi4uLioqLi4qKiomJiYmJiYmJiYqKioqKioqKioqKioqKioqKioqKioqKiYqJioqJiYmJiYmIiIiIiIiIiIiIiImJiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIiIiIiIiIiHgXx4e3x5enp8fHx9fX9/fn59fX9/f39+fn+Af4B/f3+Af4CAgIKEh4eGhoaGhYWFhYWFhYWFjIyNkY+PjZGJjIaJjIuIiImMiYeNjo+NioqKioqKioqKiomJiYmJiYmJiYmJioqKioqKioqKioqKioqJioqKioqKiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4WAenl9e3t7enx8fHx9f39+fn19f39/f35+f39/gH9/f4B/gH+AgoSHhoaGhYWFhYWFhYWFhISLi46PjoyLj4iHiYmMjYWFjo2KiYyNi46KioqKiomJiYmJiYmJiYmJiYmJiYmJiYmKioqKioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHhoaHh4eHhH55eX16enp7fXt8fX5+f35+fX1/f39/fX5/f3+Af39/f39/f4CChIaFhoWFhYWFhYWFhISEhIuLjI6MjI2Lh4mIiomGgoiNjoiKi5GTj4uJiYmJiYmJiYmJiYmIiYmJiYmJiYmJiYmKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIeHh4eHh4eIiIiIiIiIiIiIh4eHh4eHhoaGh4aGhoaGhoaGh4eDfXp5e3p5enx8e31+fn5/fn59fn9/fn9+fn+AgICAf35/f39/gIKEhoWFhYWFhYWEhISEhISEioqOjYmIiIqKh4iHiomIioiIh4qGi5GPiomJiYmJiYiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHh4iIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGh4J8eXl6eXp7e3t7fX5+fn5+fn59gH9/f39/f4CAgH9/fn9/gICAgoSGhYWFhISEhISEhISEhISKi5CPiYmJi4qHh4WHiYuKiYSLjYmOjYqJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiIiIiImJiYmJiYiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGgXt4enp4e3x7e3x+fn9+fn5+fX5/f39/f3+Af4B/f39/f3+Af4CChIaFhYSEhISEhISEhISEhI+Qj4+IiYuIhoeIiYuLjIuJioqNio6Oj4iJiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoaAe3h5eXh4enp8fX1+f35+fn59fn9/f39/gIB/gICAf39/gIB/gYKDhoiGiIaDhISEhIODg4ODkpKOioeKi4qLh4uNiYqJi4iHiouIio+SioiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhn96eXh4eHl5eXx9fn5/fn5/fn1+f35/f3+Af39/f4CAgH+AgH+BgoOHjo+PjoiHhIWFhoaFhYWSkI6KiYmIiImKioiIh4aKjIiHiYmOkJGNh4iIiIiIiIiIiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4aGh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWGf3l4d3d3eXp5e3x9fn9+f35+fn5+f35+fn+Af4CAgICAf3+Af4GBg4eOjo6Ojo6Mjo2OjY2MjZCQjomHhoiJiYeIiouIiYyJiYaKjY6PkYuIiIiIiIeHh4eIiIiIiIiHh4eHh4iIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhYZ+eXd5d3d6eXl8e31/fn5/fn5+fn5+fn9+f4B/fn+Af39/f39+gIGEiI6Ojo6Ojo6Ojo6Ojo2NkJGOi42JjIiIiYaHiYaIioiHi4yLjpCQiIeIiYmJiIeHh4iIiYmIh4eHh4iIiYiIiIiIh4iIiIiHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhoaFhYaGhoWGhYSEhIWFhoaFhYWFhX55d3l2eHl4e3x7fn5+fn5+fn5+fn5+f39+f39+f39/f35/f3+AgYOGjY2Ojo6OjY6NjY6OjY2Qj42Ni46KhoiKhISLiYeDhYSDi4mLj42JjI6QkI+NjYyLjY6Pj42NjI2Nj4+Pjo6MjYyMjY2KiYiHiImHh4aHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoeHiYqKiIeJi4yNjo2LiImLi42OjYyJiImMgHl3d3Z6eXh8e3t9fn5+fn5+fn5+fn5/f39+fn5/f4B/f4B/f4CBg4aMjY2NjY2NjY2Qj4+Pj46NjI6KiYuMjIeFiY2Lh4aIh4aHh4uNjo6Pj4+Pjo+Pj4+Pj4+Pj4+Pj4+Ojo+Pj4+Pj4+Pj4+Oj46Oj46Mi4uJh4eHh4aIhoaGhoaGhoaGhoeLiYeHiIiLjY2Mi4yLjY2Ojo+Ojo6Pj46Ojo6Ojo6Ojo6Njo6NjY2AeHZ4eHp4enx6fH5+fn5+fn5+fn5+f39/fn59fn9/f39/gH9/gIGDhoyMjIyMjY+QkpOTk5KSjYyMjIqHioyKh4eJiYWCiouIiYWJjpCNjo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjI2NjI2LiYaHh4eHiYqLjY6NjYyNjY6OjY2OjY2NjY2NjY2NjY2NjY2OjIyNj4+OjY2MjIyLi313dXd5enp7e3p+fn5+fn5+f35+fn5/f39+fn1+f39/gICAf3+AgYOFj5KRkJGSk5OTk5OTkpKLi4uLiomMiouLiYuKhoeOjYiIjI6OjIuMjIyNj46Njo6Ojo2NjY2MjY2NjIyMjIyMjIyMjY2NjYyMjI2NjYyMjI2NjIyNjIyMi4yMi4yMjI2MjIyMjIyMjIyMjIyLi4uLi4yNjY6Sk5OSkpSRkJOVlZSTk5COjo6Oe3Z2d3h6ent7e31+fn5+fn5/fn5+fn5/f35+fn9/f39/gIB/f4CBgoSNkpKTkpOSkpOTkZKSkoqJioyJi4qJjIuKioiHiYqKi4mKjY2Mj46Nj5KUlJOUlJOTkpGSkI+Ojo2NjY2Pko+OkZGOjIuKioqLi4qKi5CPjoyMjIqKioqKioqKiouKioqKi4yLi4uMjIyKiouLi46RkpOTk5SUk5STk5SUlJOTk5KSkpKSk5F6dXZ2eHt7e3p6fX5+fn5+fn5+fn5+fX5/fn5+f35/f3+Af39/gIGChIuRkZGRkZKSkpGRkpGRiYmIiIqMiYiJiYuJhoSJhoyKh4ySkpKTk5OUlZWWlZWUk5OUlJSUk5SUlJSVlZWVlZWUlJOTkY+QkZKQjoyRlZWVk5KSjo+QjYqKi4qKi42OjY6RkpCRkpKSkpGRkpKSk5OTk5OTk5OTk5OTkpOSkpKSkpKSkpKSj3h1d3l6e3t7ent9fX19fn5/f35+fX5+fn5+f39/f39/f4B/f3+AgYKEi5GQkJCSkpKRkZGRkZGIiIiIi4uJg4eLi4yMiIeHjYyNkpSSkpOTlJWWlpaVlZSSkpOTlJSUlJWVlZaXlpaWlpWUk5SUlJSVlJSUk5OVlZWUk5KTk5OTkJGSkZGSk5OTk5KSkpOSkpKSkpKSkpKSkpKSk5OTk5SUk5OSkpOTkpKSkpGRkZGPdnJ3enp7e3t8fX59fX1+fn9+fn9+fn5+fn6Af39/f3+Af3+Af4CBgoSKkJCRkZGRkZCQkJCQkIeHh4eIiIiFi4+KjI6Njo+OkJWUk5OTk5SUlZWVlJSVk5KSk5KTlZSUlZaWlpaWlpaWlpSTk5OTk5OUlJOSk5SVlZSTkpKSkpOTk5OTk5OTk5KSkpKSkpKSkpGSkpGRkZGRkZKTlJSUlJSTkpGRkZGRkZGRkZGRkYx0c3d6ent7e3x9fX1+fX5+f35+fn5+fn5+fn9/f39/fn9/f39/f4GDhIqQkJGRkJCQj4+Pj4+Ph4iKi4yNjYuOj42Mjo6RkpGSk5OSkpKSk5SUlJKSk5OTk5OSkpOUk5OTk5WVlZWUlZWUk5OTk5KSk5OUk5KTlJSUk5KSkpKSk5OTkpKSkpKRkZKSkpKSkpKSkpKSkZKRkZGSkpOTlJSUk5OSkZGRkZGQkJCQkZCRinN0dnp8fHp7fXx9fn59f35/f35+fn9+f31+f39+fn59f39/gH+AgYKDipCQkZGQj5CPjo+Pjo+Oj4+Pj4+Pj4+PkI2OjpCRkpKSkpKRkpKTk5OTkpGSkpKRkZKSk5OSk5OSk5STk5OTlJOSk5OTk5OTk5OSk5OTkpKSkpKSkpKSkpGRkZGSkZCRkZGRkpKRkZGRkpGRkZGRkpKSkpKSkpKSkpKRkJCQkJCQkJCQkJGGc3V2e3x8e3x9fX1+fn1/f35/fn5/gH9+fX5/fX5/fn5/f3+Af3+BgYGKkI+PkI+Pj4+Pj4+Pj4+Oj46Oj4+Pj5CQiI2PkJGRkpKSkpOTk5OTkpKSk5KSkZGRkZKSk5KTkpGRkpKSkZKSkpKSkpKTk5KRkZKTkpGRkpKSkpKRkJCQkJGRkZGQkJGSkZGRkZGSkZGRkZGRkZGSkpKSkpKSkZCRkZCPj4+Pj4+Pj4+PkX9ydHh8fHx7fHx9fX5+fn9+fn5/f3+AgH99fn5+f39+f39/f4CAf4GBgYqPj4+Pjo6Ojo+Pj46Ojo6Ojo+PkI+Pj4+GjpCQkJCRkZGRkZGRkZGQkJCQkZGRkZGRkZGRkZGQkJCRkZCQkJGRkZGRkZGRkJCQkZGQkJGRkZGRkI+PkJCQkJGRkJCQkJCRkJCQkJCQkZCQkJCQkJCQkZCQkJCPj4+Pjo+Pj46Ojo+Pj4+PeHJ2eXx9fHp9fH19fn5+f35+f39/f4CAf39/fn5/f35/f39/gIB/gYGAio6Ojo6NjY2Ojo6Ojo6NjY2Oj4+Pj4+PjoiQkZCPj4+QkJCQkJCQkI+PkJCQj4+Pj5CQkJCQkJCPj4+PkI+PkJCQkJCQj4+Oj4+QkI+PkJCQkJCPjo+QkJCPj4+Pj4+PkJCQkI+PkI+Qj4+PkI+PkJCQkI+OkI+Pj46OjoyMjY2NjIqDiYhzc3Z4fX58eX18fX1+fn5/fX5/fn9/f39/f4B/f39/f4CAgH+AgH+BgYCJjY2Ojo6Ojo6OjY2OjoyNjY6Ojo6Ojo2NiJCRkI6Njo6Ojo6Ojo6Pjo6Ojo6Ojo6Pjo6Ojo6Ojo6OjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Pj46Oj4+Pj4+Pj4+Pjo+PjY2MjYyNjoyLi4mJiYiFhYSDgoKEgnR5fXp4dXJrZWltb2xmZmdncHNzd3l9fnl6e3x9fX1+fn59fn9/fn9/f39/gIB/f3+AgIGAgIB/f4CBgImNjY2NjY2MjYyMjIyMi4uLjYyMjIyMjIyGj5GRjIyMjIyMjIyMjIyMjIyMjIyNjY2MjIyMjYyMjY2MjIyNjY2NjYyMjI2MiomKi4uJh4KAh4iEgXt6gH57fXx8fXlzcnJycnV1cG1ramppZ2NkYV9bXF1eWFVXWFlTS0VJSkpLTE1PT0tgdHR3eX19eHp5e3x8fX5+fn1+f39+f35/f4CAgH+AgICBgYCAgICAgIGAf4OEhYSFiIuLjYyMjIuLi4yGiYqKioqKh4OOkJGNiouLi4uMiYmKioqKiouLi4eDi4qIiYmGhYWEhIeJiYWCg397fHl6e3pzcHFxcW1samdsbWdlZmVmZGNlZGVkZWVlZWRkZGNhYV5dXFpYWFdUUFFSU1JTTU1KSUZESEpHR0hHR0xOSWdzdXh5fXp4d3l8fHx8fn5+fn9/fn9/f39+f4CAgIB/gICBgICAgICBgYFnXmBjYWNucX17ent/fXd8fHZ4ent4eHpvcHt4eXt8e3h3e394dXd0dHZ1dHZ3dXFycW5wcnBnaGtsbm9tamlpaGhlZWRkZF9gYWJgYF5dWVhaWltdXV9gX2BfX19gYmFeXl5eWVldXF1bV1dWUlRSU1NOUUpISUZERUhMTEhGR0lLSklNbXJ0eHp7end3eXt6e3x+fn1+f39+f35/f35+gIGAf3+AgIGAgICAgICCgWdYW1pZXFtcY1xaXF5ga3FtcHBvbm5vbmtpbmxrbG9qaWtraWpraWdmZ2dnaWhnbWdqZ2hlaGdjY2JhYmBgXVhbW1dYV1RWUVBUU1NNSkxLTExOTk9UWFhXVVVUUlBQTU1QT05LTE1QUU9MTEpHSUlHSEhJSEhIR0ZHSEpKSEhISUlISVZwc3V5ent5dnZ5enp7fX59fX5/f35/fn5+f3+AgX9+f4B/gICAgICAgIGBbFtYVlZWWVlaWVlYVVZoamxubmxra2poaGloZGVkYlxiZl9fYGNfXF9dYF1eWl5dWVleYmFeXlpZX1xYV1NOTUxLS0tMSUtNTktKS0tMSktQTEtLRkdHSUlGR0lISUZFSEdGRkVERUVEREVJSUlHSEdIRkZLTUtJSUlIR0hLTU1LTExMVXFzdnl6e3h2d3h3ent9fn1+fn9/f39+f3+AgIGAfn5/f4CAf4CAgIB/gYJoUlRVVlNVV1lZWVdXV1tbYWNfXlxbWFZWWVZSVFJRUVVUU1NTUE1KTU5QUk9NUFFRUVFSVlZRUVFUUFBOTk9MSk1MS0xKSktLRklJSkxJR0pISUlFR0dGRkVFSElKR0ZHRkZHR0hKR0dISEpMSkpLSUlISktLSkhKS0pISUtMTU9QUEtUdHR1eHp6eHZ2d3d6enx+fX5+fn5/f35+fn+AgYB/f3+AgYB/gICAgH+AgmlQUlRXVVRWWVdYWFpbVFRTUlBRU1FRUU9OTlBQUU9MTlBPTk5NTEtNTk5QTU9QUFJRUE5OT05PTk9PUFFPTk5PTk5QTk1NS0lISEpJSUlJR0ZHR0dJSkhJSEhJSEhHSEdISElISUxLSklISkpJSkpIR0pMS0pJSUhKSktMTk1NTU9RTFVzcnN3enl3dnR2eHp7fX19fn5+fn9+fn5+gICBgICAf4GBgH+AgICAgICBbE9PTlRZVVVdW1lXV1hOTUpKSUZKT0xKSkdJSk1NS0pMTUpHSUlJSktMRkRGSktLS0hKTExMT01MTE5PT09NTk9MTk5OUFBPTE1MTk1MTEpJSEdJSElISElJS0xLS0pJS0pJSklJSUlJR0dKSUdJSUpKTk1OTEhJSklJSk1PT01MT1JOWXBwcnd4d3d0c3R3enx+fX5+fn5+fn5+fn9/gICAgICAgYCAf39/gICAgIFvS0pNTlFOTlVXVlZSU0lFQ0VFUkREQT5CP0RAQD5CREFAQURHRkVIRUJBQEBDQ0RFQUNFSEtPS0lJSkhHSklKSUlLSkxQTk1MTU1MTU1NTElIREZGR0ZGRklKSUlLSkhMSklKSkpJSEhKS0tIRkdJSklLTU5OSktPTUxLTU1PUE5QT1BgcG9yd3h2dHJzdXd6fX19fn5+fn9+fn1/gICAgICAf4CAgIB/f3+AgICAgXNQUE5OUE1KS1BSUE5RQ0RCQUZRRT1DPT9FSDk6Oz0/PTxBRkA+Ojw+PjxFRD0/RUE/QEFAREVHR0dHQkRERUZFR0dHR0pHSEpLR0NER0pHQ0RFQUFDR0hHSEdISktKSElMS0lISktLTU5MTUxMSkpMS0lLTU9PUFNRT1BQTk9QUlFNUGdwb3N2dXRycXR4eX19fX1+fn5+f4B+foCAgH9/gIB/f4CAgH+Af4B/gICCdlRVUVFQT0xNUFBOT09BQkFAQkE/Oz48Pj8/Ozg5OTs7OkA7Oz48Ozs8PEhMPT1BQT9CQz1BRERGQkZGREdJSEM/QEBAQUFCQUE/Pjw9PkFAQD8+P0BFR0dHSUtMTk1OTUxNTUpLTVBVU05MTlFOTk1OTE1NTk9OTk1LS05OTk1OTkxUbnBwcnR0c3Fyd3l5fX19fn1+fn5/gH5+gICAgICAgH9/gICAgH9/gH+BgIJ4UVFSVFJTUVNTUVFST0BAPT4/PD8+QEE/PT45Ozo6Ozg5Ojg3Ojw5Nzg7Oz49Ozs6ODpAQEFCP0E/Q0ZEQkNDPzs+PkBDQ0E/Pj9BPkBAQj9APD9CQEFDRUVFSktQT1BPTU1OTExMT1JRUFJOTExPTUtOT0xMTEtMS0tKS0tKTU1LS1xxcXF1c3VzcXN4eHp9fn1+fn5+f39/fn5/gIGAgH+Af4CAgICAf4CAf4CAgXxSTU9RUFFSUlRSU1NOPDs8Ozs7P0BBQkA9PDk8PTw5Nzk6Ojk4ODo6Nzg6OTo7Ozg3ODk7Ojg8Oz1AQUA9Ozs+PD09QEJDQT9BQkE9Pj09Oz0/Q0RCQD9BREJFR0pKSkpKTE1MTExNTExOVVNLTE1USVBKSU1KSUpLS0pJSEdKS0lKZnJxc3RzdXJydnl5e31+fn5+fX9+f39/f36AgICAf4CAgICAgIF/gIF/gYCBgFZMTlBQTlJRUFBRUU44PT88PDo9PkFAQT8+PkA/Pj07PTw+Pz08PTs6PD09PTw8PDw7Ozo7PD49Pj8/QUA+P0E/QEBBQEBAPT8/PTw6Oz09PD9AQUJCQUBCREZGRkdGR0dISUtMTExLTEtKS0lKSk1MTEpMS0lISUxMSklJSElLR01tcHF1dXV1c3V4eXl8fX5+fn5+fn5/gH9+gIB/f39/gH+AgYCAgYCBgICBgYCCYUtPT05OT1BPT1BQTzo8Pjw9Oz8+PkFBPz0/Q0NDQD48PT9APz89Oz49PkNFPz9APTs9PT08Ozo9PkFBPz5AQD9BPz89PD48PTs7PD0+QUA/QD5AQ0NEQkRFSEVFR0hISEdGSUpJSUlJSUhKSkpKTEtKSklJSEhKSktMS0lLSkpIVnBvcXNzdHR1eXp7e31+f35+fn5+f39/f39/f3+Af4CAgICAf4GBgICAgIGBgIJtTFBRTk9QTk5PUFBPPjw8PT4/P0A+QEA/Pz9DRUQ/PTs8QD46Ozo6OTc6PDk9PUA9Ojw7Ozw7ODk7Pz49PD07PEA9PTw8Pjs9PD0+QUBCQUBAP0JEQ0RFRkZGQ0VHSElJSEhJS0tMTUpKSUpNTUpLSktJSEhISEpJSktKSk5MSUlfcHBycnJ0dXZ6e319fX5/fn59fn5/f35/f36AgIB/gICAgICAgYGAgICAgIGAgnZNTk5NTk5MTE5QT0w+QTw8PT8+QkM/PkFBQUJBQD08PTs+PTo6Ojw6ODk4ODo7PUA/PDs7PDs6Ojs+Pz89PDg6Pjw9Pj89Oz4/QEJDQkJDQ0FCQkFCQkRCQkRCRENGSUdGRUhJSUtNSklKSktMSkpJSkVESUlGRkhISUpKTEpGRmdwb3FxdHZ1d3t8fH18fn59fX1+fn9/foB+fn+AgH+AgICAgICBgYCAgICAgICBek5JS0tMTExFSUxOTTw/PDw9PkBAQUE7QkNCQ0A/Pj9APT8/Pjw+QD89PT0/PT0+Q0Q/Ozw9PkA9PT9BQ0A8OTtBPz4+QT07P0JAQkNCQENDQUNBPT0+QD0/QUFBQENFRUBAQ0JDR0dFRENGRUZGR0VEQEFHR0ZDRkRHSEpHQz5IbG9wcHF0dXZ5fHx9fHx+fn1+fn5+fn5+f36Af3+AgICAgICAgIGAf4CAf4CBgIF+UUhLTU1NS0pLTE9RQD8+PkFBQEBBR0FCRENEQT9AQEA/PUA+PD0/P0BAQENAQD9AQD49PD1ARUFCQkZIQz08QERDQUE/Pj1AQT4+Pj88PkBER0VAPkBBP0BDRkVDQkJDQEJEREJERUFCPkFCQkFCQEA9QUJDRENDQUNFR0E/PVZwcHFwcnV1d3p8e3x8fX9+fX19fX1+fX5+fn9/foB/f4CAgICAgYCAgIB/gIGAgX5SSEtNTUxLS05OUlVEQkBDQ0FBQkBCQ0BAQUFAQUA+Oz48Pz08Oj49P0JCRUA/P05hX0pAQ0VJSUlJTE1LRUNGR0hFR0VFRUREQ0E/QD4+QkZKSkdFRUZGRkpOTUtKSUdHSEtMSkdHQ0REREVEQUJCQ0BDREVEREVERUZDQkFEZW9wcXF0dnV4e3x7e3x+f319fX19fn59f4B/f39/f39+gIGBf4CBgICAgH+AgICAfVJJSUpKSEpKTE9SU0dGRUdIREdIREA+PDs+QERFRD88QUNEQj8+QT9BREREQ1d1homKflhHSEpMTE5PT0xIR0hHSElJSEhHR0hIRUNFRUVFRkhKSkZFR0lKTU9PTU1LSktKTU5LSUhHSElIR0ZFRkZGREZIR0VFSEhGSEdIRlFub3BxcnZ2eXt7e3p9fX5+fX19fX1+fn1/f39/fn5/gH+BgYGAgICAgICAf4GBgIB8UEhHSElGR0lKTU5OSkxJSUpLTE5KRkNBQkNGSkhJR0hISUdGQkRGRERDQVV0h4mHh4aIgldJTE1MTU1MSkdHR0dER0dHR0ZIRkhFQ0RERkVEREhIQ0NDR0pKS0xMTExMTElKS0pKSUlJSEpISEdISUhHR0hGRkZISklJSUlIXW9vcXJ0d3d6e3t6e319fn59fX19fX5+fYB/f39+fn+BgIGAgYCAgICAgIB/gYCAgHxNR0ZIRkVGR0dKS0pMTUxLTU5NT0tJSEhKS0tMS0pLTUpLSEhGRkdGRVBshIeGhoaHh4iHfFBLTEtIR0ZGREVDQ0BBQ0NDQ0ZGRUJAPj5AQUFAQkQ/Pz9ERkhERUdJS0lJR0hJR0lJSUpJSEZKSkpKSUpJSkpKRklMTEpKS0tmb3Bzc3R2eHl7e3t8fH1+fn19fX19fn59f39/f35/f4CAgICAgYCAgIGAgICAgICAfU9GRkdGR0hHRUZHR01NTUtMS0lHQ0NDRElLS0tLS0tNTEtNTElGSlZsgYaFhISGhoaHiIaKdUlJRkI/P0A/Pz48PDw+Ojo8QUFAPjw5OTg8PD07Pjs5Oz9BQkFBQ0NDQEFCRURCQ0ZISUhISExNS0dJSk1NTk1KSktLSkxNU2xvcnRzc3d5ent7fH19fn9+fX19fX1+fn5/foB/fn9/gICBgIGBgICAgYCAgIB/f4B+UUZFRkdJSUdEQ0VGTk1MSklIRT85Oj5ARUhHSUhLTE9OTlFOUV5ygYWDhIWFhoeIiIiJiYyOZkJCPTg4Ojo5ODc4ODk2NDc5Ozw6ODU2Nzc4OTc4NzY4OTs7PD5BOzk5OT09Pjs7PUFDRUhKTUxMR0lIT1JRUFBOTE1NT1Fdb3BydHN1eHp7e3x8fn9+f359fX59fX5+f39/gH9/f4CAgICAgYCAgICAgICAgIB/f39RR0ZHSEpIRkVGR0hMTEpJSUdDQjU2OjxDQEJGSEtITEtOVGd7hISDgoOEhomKi4uLiomKi4yJVDs4NjU2NzY2NjQ2NzYzNDY4Ojg3NjU2NTY3Nzc3ODo3Nzc4Ojs3Njg5OTg5ODc2OjxAR0ZJRklGRUZPU1JTU1JPUE9SVGVwcXN0dHd5e3x7fH1+f35/fn19fX19f39/f3+Afn+AgICAgICBgICAgICAgICAgH9/flJISEhJS0lHSUpJSkpLREVIRUJANTc4OD06PERCREZDQ1Z4hISCgoOChYmKiomJioqKiouJiYqBSDY3NjQ2ODg3NDU3ODQ2Nzc5OTc2Njc2NTo6Ozo6PDg5ODk5ODc3Ojo6ODg3ODU4OTtBPT4+QkE/QUtMT1FQUU9PUFFXa3JydHR1d3p7e3t9fX5/fn9+fX19fX5/f4B+fn9/f4CAgH9/gICAgICAgH+AgICAf39+VEhHSUlMTUtKS0tMSUg/QEFAPDo1Nzk4OTc6QTk8R1JgfISDg4SEhIaJioqIh4iIiYqKjIqJiYx6Pjo4ODs8PT45Ojs8ODk7OTo7Ojk5Ozo5PT09Pzs7PD06Pjw6PDs8Ozw8Ojo8ODo6Ozs5OTk8Pzw9QUJESUpNS0pLTFdvcnR1dHZ4e3t7fHt9f39+f359fX19fn9/f35/f39/f3+Bf4CAgICAgICAf4CAgH+Af35URkVGSUxOTkxKSk1CPzo7PDo4OTk4OTk5OTo+PT5Pd4GCg4SEhYaIiYiHhoaGiImIiYuMi4mKioxsPDs+QkNFRUJBQUI+QENBQD89Pj5APz4/QD9APT0/Qj9BQT9BPz1AQUA/P0E8Pjw7Ojs6OTs/PTs7PT1BQUNBQkNBWHBxdHR0dnl7e3x9e31/fn9/fn19fX5+f35+fn9+f4B/f4CAgIB/gIGAf39/gICAf39/flJFQkFHSk5PTElHSzo4Ojs5Ojo7PDo6Ojw7PT5APk59goOEg4WEhomJiIeGhoaHiImKi4uKioqLiotePkRHSUtKSkZHR0RGSEdFQ0FAQ0VDQkBCQ0I/QERIRUNFREVFQUZFRkRGRkRAQj49QD49P0A+Pz8/Pj8+Pjo7PTxgcXJ0dHV3enp7fX19fn5+f39+fX19fX5/fn5+fn5/gH9/gICAgICAgICAf4CAgIB/f4B+UERAPUNIT01HRkJEOTc6PTo8Oj09Pj47Pjw/PkI/TH6DhIWGhoaIiYiIh4aGhoeJioqLjI2MjIuKiodXR0xMTUtOSUlLSElKSklGRERGR0ZEQ0VGREJISUtHSEdGR0dFS0pMSUtLSkNGQ0NEQkFBQ0JEQ0NERENBPTw+QGhwc3R0dnd6eHt8fH19fn5/f359fX1+fn9+fn59fn+Af3+AgH9/gICAgICAgICAgH+AgH9PQT49P0RMS0BCQkE5Nzs+Ozw6PT8+Pzw/PkJBRD5ng4KFhYeHiImJiIiHhoaGiIiIiYqMjYyMi4uKjH9QTVBNS05LSkxJSUpIS0dFR0hISUVFSEZGRUxMTUlKR0dISUpOTU9NTE5LSEZHR0VFQ0ZGRkZERUhIRkNBP0BMbXB0dXZ4eXl5fHx8fX1+fn9/fn19fX1/f35+fn5+f39/f39/f3+AgICAgIB/gICAgICAf1FBPz4/RkdHPTxAQDg3PDo7PDo9Pzw9PT9AQ0JIU36DhISFhoaHiIiIiIiIh4eIiIiJioyNjIyMjIuKjXFNUU9NTExMTEpJSEZKSkVKSEdLSkhKR0dHS0xOTExISElKTVBOT05MT0tJR0lKSElESUhIRkZHR0lHQ0JBQ1VvcXV2eHp7eHh6enx8fX5+f39+fn1+fX5+fn5/f36Af39/f3+Af4CAgICAgICAgICAf39/VERBQUJHSEI/OD9AODo7Nzw9Ojw/PDw9P0JDQ0xthIOEhIWFhoeIiIiIiIeGiIiIiIiJjIyLjIyLi4uLi15SUlBNTk1LSkdGQ0hKR0xKR0tPTEtKSkxNTE9QTkhJS0xPUVBQUU9PSklKSkxKTEZHSEdGR0lGRUVCQEJCXHByd3h5enl5eXp6e3t+fn5/fn59fX19fn9+fn9+f4CAgIB/f39/gICAgICAgICAgIB+f39VRUNFRUdHRUQ7P0E7PTw4Pz09PkBFRD1CRENGSnSGg4ODhISGiIiIiIiIh4eIiIiIiIqLi4uMjIyMi4uNfFdWUlJUUk9MS0pFRkZLT05PV1ZRUE9RU1JNU1RPTVNMUFNVV1JTUlBMS01NTUtOR0dKRkZJSkRERUVCRENjcXV5eXp6ent6e3p7fH59fX9+fX19fXx9fn5/gH9/gICAf39/f3+BgYCAf39/gIB/f39/f1VGRkdHR0dIRj5AQj0/PTxBP0FBRFRLQkhJRklLeIaDhYWEhYeIiIiIiIiIiIiIiIiJiouKioyMjIyOi4uLZ1ZWa2FFUlFRUEo7O1FTUmB1XVVWVFZZWVJYWFJaZlBVV1pdUlRXUVBOUlBQUFFLS0tHSEpIRUZJSUlISWpzdnl5enl6e3t8ent8fXx9f359fX19fX1+f39/f3+AgIB/f39/f4CAgIB/f3+AgH9/f35+VEhKSUlHR0ZFPz9BQEVBQ0ZEQ0RLVlBKT09OUFF5hoWHhoWGh4iIiIiIiIiIiIiIiIiIlJyMioqMfWGKi4uHbFtkVTpYWFhTUD9AVlVZXGRgVllicl5dVl1aVkVRWVpcWV9UWWdSVVZYVFRWU09PTUtMSklJTE1LT01Tb3R2eHl4d3l6ent6e3x9fH5/fn1+fX19fn1/f39+f4CAgH9/f3+AgICAgH9/gH+Afn9+fn5WSkpJSEdGRERCQT9ITElNUEtJSk9TUVBUVlVXVXaFhIWFhYWGh4iHiIiIiIiIiIiIiImcnaCPiY5nO36MiYqLem5wWFpbWlJTUldWVFpadYNZVX2QYVxYXV5XSVZeXltbX1lIWVhZXF1YWFlXUlFNUFFNTU9TUVFVUmFzc3Z3d3Z4eXh6e3t8fX19f39+fX59fX1+fn9/gH9/gIB/f3+Af3+AgICAf39/gIB/gHh5fVlOS0pJSUZCREBBOk9RUVdYUFBQUVJTUlZXV1hYbYGCg4WEhYaHh4eHh4iIiIiIiIiIiJaanJeIioFuhomIh4OKfmZZWVxZU1ZUV1JRV1ZjloBRZXJYWldfaFBgZlpaWFxoYkdPWmlnXVtcXV1XU05TUFBRVlZWVllab3N1d3Z2dHd4eHt7fH19fX5/fn59fn18fn9/f3+Af39/gH+AgH9/gICBgYB/gH1yfX9/b3R8XVNQT01LSkVDP0A7UFBaWlpSU1FPUVJRVVJVU1ZfdXiAhYSEhYaGhoaHh4eHiIiIh4eIh4ORjomJiIaFiIiGfYB7XFBWWFRSVFJRUUxPTUtmeVpdVFlVVl1aTFRaVVNUXlpYV1dXemtYWlxcXlNQUFBJTk9XVlhbWmRxdHZ2dHR2eHl5e3t8fH19fn99fn1+fX1+f39/f4CAf3+Afn56eHd2c3V7f3+AgHRrfn5rcXleW1ZVU1JPS0ZDREFNXoNsVlJTT09RT1FWUVNSUlRjZHaAg4KDhISEhIWFhISDhoaGhoeIhn6JiYiHhoOHh4d5bXFWSUtOTktNS0hKREZIRUM+U2NVf1JRUU5LUlVSTU9ZUU1OUVNVVU1RU1JQTkxMSENJR1JTVFpdbXJ2dnV0dHd7enp7e317fX19fn19fX59fn9/f39/gH99fX5+f39/f4B+e3Zzd31+fmR1fWlxdGBkXV5bWVVRTElMSWFsknRQUVNNUVJQU1tSU1JRUlVVYnN7fH6AgYKBgX99e3uAf4OChYaHgoaGhoGEgYaFhnVfXUtDPkJCQ0NBP0RQQ0NAQz5CSEdWQElOTUddaVFIRk9GREVGSEdIQkNIR0hKR0RCQUNATlBNUmR0dXZ1c3R2eXx6e3t7fHx9fHt+fX19fn5/f3+AgIB/f3x8fX+Af39/f4CBgH12dHt/bWh8Z25xZmhlZWJcWFNRUFVSc1dlW09PTkxRUlBVWVNVUVFUUk9WYGtsc3Z6e3h5dHJuc3RzeXh+foOAg4OCgYKAgoGBa0xHPj46Oj5APz4+PmpQS2FFRkhJRUI/SE1NR01RVUpCRT8+PD08PT0/PT9BQ0I/Pzw9Qj5JTUZVb3V1dnR0dnh6fHp9e3x9fX19fH59fXx+fn9/f4B/f39/enl3eHd2dnh7foB+fXt4dnx1YXhnbHBqbGppZmBbUVFaXFleSUpPUE5LTFFSUVRVVVdRUVdWUFhbYl1hZ21tbG5qaGBucmltbHF1e3p9e3h6fHx4d3hkQkBAQTw6QkNBQUNBW1xPe05PT05LTE1PT1BMS0xXTkhHQUE8OTc3NTk5PTs7Ozg5ODk/O0FHPlx0dXZ2dXZ3eXx8fH18fHx9fn18fX19fX9/f39/fn9/f314dXd6e3p3eXh1d3t8eXh1eXdjcWhpcG1ubW1oZl5PT15cWklHT1FRT01QUU5RUlNWWFNSWVROWVpbV1lcX15fZV9dXnF3a15gZ2t3b29sam9ubmxmYllHRkZIQkFGSEVFRkNMUU9hV1JYUVBTU1JVW09PUVdQTUpERj46OTY1ODc5Nzk6MzY1Nzk1PEI9ZnR1d3h3enl7fX18fHt8fX1+fnt9fn19f39/fn5+fn9/e3d1eX18enh8fHx8dHd2d3Z1d2tuaWhxbm9vb2prYFVXXlpXTUtTVFNQUVVPTFJTVFdYU1RYUUxYWVlWWFhWWFldV1hYaHNrXVZgdGthYV9dZGBfXllVUE1PTUxJR0pLSUhGQ1BPU1pXVFROUVNZU1xlVU9TVFFOS0lIQz9BOTk4ODk3ODg0NzU3ODU5OUducnV5eXp7e319fX18e318fX5+en1+fH1/f359fn59f358dHR1e3hycW9vbnR4cXJzeHZ1cWZkZ3JucHBxbm1kXV9fWVdPUFdWVlNUVk9PVVZXWFlTVVRMS1NVVVVVV1BUVVdUVVJdbl5STllgW1ZZO0RVV1RbZkpMUFJST01NTk1NTEpGUFBVWVNUT0pOT1VTVFxWUlVTU09NTElISEY/Pj06Nzg3NjU5OTY3NTY1V3FxdHh6ent8fX19fnx8fXx+fX15fX18fn5+fXx8fX1+fXxydnF4eHJ1dXFxbnBwb3B1dnRuamRkanBwcXJwbmZlZGNcXlJUWlZXVFNWVFJYV1lZWVJVT0lHT1BPT01SSk9QT09OTk9UTE1JUFBTVFUyPFhNSUFRPWNgUVNRUE5QUE9OTk1QTlRSUFJMSUxLT1JQUVJTVFFTT0xNS0xMSENCQT06OTg3NjtCNDU2NjtlcHJ2eHl7fHx9fnx9fH19fX18e3h8ent9fX58e3l9fH18e3B1b3d1cHV0b3N2cHFxcHV1dmNqZ2VXaHRycnFuaWlocFZWVFVYVVZVUldWVVpZWFdWUVNGRkFGR0dIRkpESEpIR0VITEhLSUdMTVBNRy9FX1I9M0A+am9hUlJRQEdUUU9QUFFOUU9QT0xKTExPUE5NUFFRTlBPSkxNTUtHRUVDQjs9PTw5PUc2Njc2RG5xdXd6e3t8fH18enx8fX5+fXt5dnh3eXl8fXp6dn17fHp6b3Fud3JwdnFtcHNwb3Bzc3N0ZmdgaFpXa3JzcmxtbWtuYmVQU1RSU1VPV1ZVWVlWUVFRT0A+Oz0/QEJBQ0BCRURBQEdIR0hGRkhKTUxER0NPUkI4RE1TXWdTUVNBR1VQT1FRUE1NTkxKTEtMTk9PUUxOTk1JTUxJS0tMS0dGRkVEPEFBPjtARTs8ODlUcnN1eXt7e3x8fHt5fHp6fn58e3V0dXJ2dnp6eHpyfHt8eXltcW94cnF1bm5xcm9vb3Rzc3J1dGtnZ15lam1wa29xbWltY0xPTk1RU0xUVVRXV1VMTEtIPTk4Nzs/QT49PUBAQj0+RUhGREZGSUdKSkBGQUFARUdESU9IUVJhXFFQUk9TTk9PTExPTUtNTE1PTltWS01RT0hKSENJSkxMS0ZGRkU/QkM+PUJHP0I/QGRydXd7ent7fHt6end8d3l9fnt7cXN0cHJzd3R4eHN6e3l2d2xxb3ZxdHRsb3Fybm5vc3ZydHNycmtsZW5zaG1ubWxtbGprSUxISE9RSlFTUVRTT0tIQ0U9OTg3OT9CPzs+QUBAPkFESUVDSEdJR0lFQkI/PjxCQUBHSkVNT2JlUE1PTVdLTE5LS01NTExLTk5TZE1KTFJJSUlFQklKTE1OSkdJRkJCQkA/RUZFSERMb3B2enl5ent6fHp3dHh0eHx8eXpucXJtbm9ycnZyc3h8eHZ2bXBtc3B1dGxwcHJvb29ydnVyVlZucWdseYRqbXFybm5qaG9ISkNHTExJTVBNUE9IS0U/Qj05OTk6P0I/PEFCQUFEREdLRkRJSUdHSENDP0I+Pz9APkNFRExNUVRMSklNVEZJSUpMSUpLSUpMTU9QUVBLR0NLR0NDS0pMTk9OSUpJR0NDQ0RJSk1MSVpzbnh5eHp6e3l8dnJwdXJ0eXl2eGpxbmpsbG50dG1zdXtzdHhyb25xb3ZzbnBvcnBvcHN0eWpOYGdzanR8eWdvc3FpcWhlcUhKQ0ZHSEdKS0lKTERHQjw+PTo6OjtBQj89QkJDQ0hFSkxKRUlJRkdIQ0M7QUBCPkA/QkRESU1PR0hKR0hLREhJS01ISkxISUpMSk1dUkhJRE5HQkVMS05OUU5LTUpLRkdHSk1OUk5NY25qd3Z3e3l7en1xbWxza3B0dHR1aHBtamlra3RwbnR0eXByeXRvcnFvd3NvcXB0cnBydXR5a05WbXVscXt2aW5vaWp0aGVwRkpDRkVGREVFRkVHQ0NAPTw9Ojs6O0FEQD9CQ0VFSUZKSkxGSUlHRkZEQjpBQ0M+P0NDQ0RHS05ISk5IREhFSUxOTUhJTEdGRklJTE5LSUhFT0lDR05NUE5QTk5PTUtJSElPU1FSTlNnZ2Zyb3N4dnt6fGxoam9la3Btc3FmbWxoaWtsdG1wdXR3cW94dG90c3J2c3BxcnRzcnR1dXZ2WFZ1dWtvdHJrb3ZsaG1mX3BHSkNFRURCQkFFQERCPj8+Ozs7PTs9P0RCP0FDRkdLR0pJTEhHR0dGRUM/PURFQj5BQ0JDRUdISUdNUElGRkdLTk9LRkhJRkVDRElJSEtJR0hQS0RKTU1RTk9OT1BOSkpJTVJVVVJQWGVhYW1mcHJvcnl6Z2VoaGNpbGZxbGZsbWdpa2xzbXB2dXRwbnZyb3Nyc3V0cXNzdXRzdXZ2dnl2dXR2bGt1dW1ydnFsbmxlck1HRURGQkFAQUQ8QkE+QT06Oj0/Oz4/QUI/QEJFR0pGSUdJR0ZGRkRDQkFBRUZDQkJCREVFR0dIRkxQTElPSkpMS0lGSEVGRUNDSEhIS0pHS1JNQ09PTlFPT09OT09LS0tQVVdWVlRZYF9daWBtaW5ocnNiZWZmZGhoZm5pZm1taGtrbXJpcXZ1c3Ftdm5vcXJzd3Nyc3R1dXZ2dnd2d3Z2dHd1a3N1bnV0c3Bya2tzTUdHRUdBQUBDRDxBQUBDPDg6PT46Pz1AQkBAQERGSEVIRkZIRkVFRENFQkRJRkNHRUFFR0VGRkdFSk1LSFFNSktISElFRkhIRUNJSUpLTUtQU05EUlNRUVJOT01PUE1MTlNXVldZVlheWl1kYGhjamlna19kZWZjaGdna2dna21rbWxwcWd0dHVyc252b3FwcnR4cXNzdXZ1gpF5dnZ0eHV1d3hub3VvcnN1cXFpcHpNR0dHSEFBQkVFPEBDQkQ8Nzo9Pjs+O0FCPj8/Q0VGREZEREdFQ0VDREZGRkpFRUlHQkdIRkdGRUNGSkpHTUtMS0hKS0ZJSEpIREtLTExOT1JUT0hUVVRRVFBRTU5RTk1RV1pWWllXWl5aWGFgYGBeaGVjYGRlZ2dqaGhqZ2hubGxvbXFwaXV1eHJycHVwcHBydXZwdXN1dnV7fn14dnR3dnZ2d3BsdXBtc3Vub3NzeU1ISEdJQ0FDR0U8QEVCRDw4Oj4+Pjw8QkI9QD5BQkZDRUNDR0RDRERGR0dHSUZISkhDSUhHSUdGREhLSUZLSE1LSktLSEtKTUtJTkxOTk9SVVZPTFZWVFFUUlJMT1FQT1RZWllcWlpcX19dX2NeXGJkbGNgZGdocoVoZ2pmam5ucG9uc3FqdHV4cnNzdHJucHF2cnF1cnV1c355jn11dXZ2dnZ4cml1cWtydGxxd3F1S0lLSEpFQkRHRT1BR0REQDk8PkA/Pj9DQjxAPkFBR0NFRENIREVERkZISEZIR0lLSkVKSEhKSEZGTEhISEpHTExMTExJTUpNTk1PTFBQUVVWV09LVlZVU1NSUUxPUlJRVltbXV5bXV5gYGFgYmZdZGBmaGBlaGpkc3NmamhmbHBycW9zc25zd3dwdXZ0c21vcnVvcnNwdXJ2cnSBdnV1dXd2dXd0Z3Rya3Fya3J3cHdJSkxJS0dCRURFPEFGRERCOz8/QUBAQERBQEI+QUNIQkVERkdFSEVGRUlIRklISkxISEpKSUtKRkpLSElKSkdLS01MSUlMS01OTk9MT1BSVVdWTU5UVlVTUlFQTU5UU1JXW15eX11eYGBhYWJgY2RlYWRpY2Rpamd2i2xraWdtb3NxcHFwcHJ5d3J1dXRzbW1zc21xcm90dXVzcHN3dHV1d3Z1dXRlcXNrcHFqcnZwd0pMS0tMR0NDQUU8P0VFRUM9QUFDQkJDRUFDREFBRUdDSEZIRkVJRkNHSkdHSkZJTEhJSk1LTUxHS0lIS0tOUUtSUUxTTUpNTU5QUFBUT1dYWFtOU1FXXFpTVlBOVFVUVFhaX2JiX2RhXmFjXmBmY2FiZ25pY2loaG14dm1oaW5vc3JwcXJycnZ0c3Vzc3Nua3NxbXByb3R2c3FxdXZ1c3d5d3V0dWNtdGtvcGpxdHB3TE1MTExHREFARD49REVGQz9DQUVEREZDQkVHQ0NJRkJISklHSEpGREtKR0hKSUlLR0pKTktOTElMSEpNS1pmSmRcS2xSR05NX25VbHNbcXBid2NSUGJ2dWh1Y2F2YVhucWJkdmluemZcbHVgbGtWYHd1aGpoaGZnbG1qbW9qbW9zcnBycnFyc3Jzc3J0cm5sdG9ucHFxdXVycXN0dnZ1dXl3dXR0YGt0a3Bwa3FzcXlLTkpLSkZCP0BCPzxERUZEQ0NDRUVERkJFRkdEREtFRUpMS0lLTEdHTklISktHS0pJSkpOTE1NTExJTUxMW3NiZHBebGxVTE5lcl1nZXFsbnRncGlfYVlubWJwcGJrampnb3F0ZXRublxwdmdwTkxyeXZrYWFrZWVseG1rdmxub3NycHJxcHFycXJycnRybW1zbm5vcHJ1dHFzc3R1dXV0d3h2dXRibXVrcHBscnJxektMSUlHRUQ/QUE/PUJFRkJGQ0VERUVEQ0hIR0RES0hHS01NSkxMRkpPSEpLSklMSkpJSk1NTk1NTUtOTU1bcnBvbnBwbGtNT1BtWE5pYnRycGFtb3ZcWWxQW21tWnFta29teHh0c2lwXWBzbHFqVXV5eG9jXmtmYmdwcGppb3Bwc3NwcXBxcXJycXFycnRsbXJtbW5vcnV0cXRydHV1dHV1enZ1dGVudWtwb2xzcnJ5SktHR0VFRUJBQj0/P0VHQkdESEVFREJGSUhIRUdLSkdNTE5KTE1HTE5JTUtISk1JSklKSk5PTk5NTE5NTFxoZHVdbHFXbE1PUW5VWmtea2x2YWxkdFRlY05sWWxcdHBraWx4and1aHBdX3NraFdiY3d8b2NgZ2hhY2l0eWtubnFzc3BxcHFwcnFwcHBydWttcW1tbW9xc3Rxc3J0dnZzd3Z6dnV0aG91bHNvbXNydHZJTUdJRUVEQ0FCPEJAQkZDR0ZLR0VDQ0hLSEhGSUxLRk1LS1JSTEhNTUlOSklITkdKSkhJTk9NTkxKTU1KWnRwcG9xcW1sT1FSbllza2dvb3Fxb210Xm5YYXRfbm9wb3Fyb291c3R0alpedGN3eHJqbnpoYWFjZmFiam10dXBzdXZzcXBwcW9ydHt/fn13bGtxbmxtbnByc3F0dHN1dXR4eHl5dHVrb3VtdG9uc3N2dElLSEpDRERFQEA+Q0NBRkNISU1IRkNGSkxJR0ZKTUxGT0pKV1JLR0tKSk5JSUpMSUtKSUlLTE1NTElLS0tTa2JZaV5famNyclpfWWpvX2VlVWtfZFthYlFgbWhcalxuaWlkW29lZHBdWlxrW21xY3BzbGRnY2RnYGBrbXBwb3R5cnVxb3BxbnmFiIeHhoWAdnNua21tb25xcnR0cnR1dXZ5eHhzdW5xdW53cXJ1dHdySEhGSkRFQ0ZBQEFFRENGQkhKTEdGREdLTElFRkpPTElPSkxbUUpGSEhLTUlISkpLS0lISUdLS0tLR0hLSkxLTEpJS0xOVFtdVFBVTVFPTk9PVVJQUFFPT1FKSk5QUWRxaVRZVltbXFVZWl1YXVxcY2ZhYWZiY2ZfXmZrbWhtdHhydHJvcHB0hoeGhoaFhYaHg3pwbW1sa3FzdHRydHZ0dXl5eHV2cXJ1b3ZydHN1dXNHQ0VHRkZARUM/Q0dERUdDSUtMSEZER0tMSERHSVBLTE9LTFdNSUZFSElKSElLSExKSUZISEpISEhFRkxISEpOS0hPXFdeT1xcYF5PWFlTXFxiXk1ZWk1YYVJLWWFaU2BkXGFYW2RkVlZYXFlaWFxWWVxeY19kYGFfZWhrZ210dHFxdHBxcoGGhoaFhoWFhYaGhoR9cmtpb3Jzc3N0d3l5eHl4d3h0cXhyeHNxcnVydE9CQ0RMTUJDREJESUVHR0ZLSktIRUVKSkpGREdIUEpMTUpNUklIRUFIRkpJS0tJTEpJR0VKSEVGR0VFSkdCSU1JSlRfWWBYYGFbYFVYWVRdXlpfUllcUF5cWU5fXF5TW15kXlpdYGNfWV9iW2BeW1VZWFpfXmNjYmFjZWlla3Jwb3Bwbm93hoaFhYaCe4CFhYaGhYaFf3VxcHJyc3V5eXp5eXh4eHdyeXZ4cnF4dnR2YVNKSk1JRUNCQ0ZHRUdHSUpKSUhERktKSkVFSElOSk5MSExOR0hGPkdHTElLS0pLS0lHRUlGQ0RFQkZKRD9JS0hOW2NZXl5hX1JUU1dfX1xdWV5RWVxNVl9XS1FZW1FbX2JhXV5jYWBiYmJjY2VaUllWV11aXmRgX19jZWJob21tbGxsbHWFf4SDeXV8hIWFhYaGhYWGhoN9d3JydHd5eXl5f359eXV5dnZybnp3dnhYUUpGREdFQkVHSEZHSElGR0pHSEZIS0lLRENLSk1NTExISkpISkc/R0ZOS0tLTUtLS0lHSUVFQERBSElBPkhJRk9dYVpbZF1fVFFSWF1cXFxfW0tXXExSXFlJTV5RUV1fYmNjY2NiXGRjYmRjZVhSV1VUXVlbYV9eX2FhX2Rsa21qa2xudn51gXp8hIWFhYWFhYaGhYaFhoaGgnpyc3V1e4WHh4eGhYSBfnhwend2eFxSTUNASUZDRUtJRkdHSUdHSkZGRklMSk5FQ0tKTE5KTElLSklJR0JISFFNS0tPTUtLSUhIRkU/RUJISEFARkVDVF1ZXlhfWV9bXVVYWFBdXVFLSlZeWF5bXVZaYVJSX19iYmBgYmJfY2JiZGRiWFBSUlNcVFxdXV5eX19fZGhnbGpubnB7e3x+e4CCg4SFhYWFhYWEhIWDhISHh4FzcneFh4eHh4eHh4eHh4WDgHx4XFNLQkFHR0RGTVJIRFJLRkhISERGS0lNUEVHSUpLTkxMSUxLSklHREhLUU9NTFBNTEtLSUpERUFFQ0hGQUFGREFWVUVcVF5TVl9YTlRVTlpbTUpLVGBhW19YX15iXU9ZYlxgYF9iY2FdYmJXYF9UUVBRUllTXlxbXV5fYGFmZmVsZm9vd3x7gHt9f4CEhISEhIWFhYODhYKDgoWFhnpvgYaGhoeHiIeGhoaFhYSFg35JTkZERkZIRElTY1FFV19JR0dIREZNSlBQRklJSktOTExLTUtKSkdFSU5RUU5PUE1OTU5JTEJEQUNDRkRDQUNEQExIQ0xMUE9OTEZNRkZISUhHTExNT1BJTE9QUFNQTFFTUlVaWFdZV1djVk5SVFBRUE9RVVRcWVlbXl5hYWVmY2hkbG1xc3N6eX97en+EhISEhISEhIKEgH57gYOBfXuFhIaGh4eHhYWFhISEgoGAfUtJRUVHRkdES05eTUhIWU1HSEpIR01MUVFJS0pLS05NVU5PS0tMR0dLUFRTTlBQTk9PT0hMRmBFRF5MRGZjQ0xbSF5cc21PTVZtWUxDT19UbFdnSl1XVV5ETVFVTE1TVlFSVFhWVFhUVFxUT2VaaGhlWlVrVFhXVVtcXGBgYWJiYmBnaWdubGhyenx9foGEhISDg4ODgX19enJ7gXp7f4KAg4SEhYWBhIWBg4N/fnp7TElFRkZIRUVLUFRKS0dgVEhKT0pJT01SUUtNS0xPUlVST1BKTE5HSE1RW1lPUFBOUFFQSktRf1FJfFlZcnNXUG1HcW5vYVZQcXF0T0Jqc25xdHBTb19bblhdVlxYVWtoVV1WY1lgWVpeVVVXf2l0dXVfYXZfWWJcXGZbX2FhYWJeYGNnbW9sYHB3dHiBgYKDhIJ/fX6Adnh6bXZ+dHh9gHx+gIGChHyAg3p/gX9+d3dOSUVITU1CRExMR0pMRlJWTEtPSExSWFdRTk9PTFFUTk9RUEtMT0dNUFNbWlRRUk9QUFBLSVp4XVR4ZGhYUlNQdmZ0bHBibmZrUnJOTHdtanJwc3JxcnBvb4BdZXp1eHFxenF+cn1rdX1hUmh8ZXNzb3NzfH1wfnhvf3JgYGBiYlthYWhsbmtibGZnbXd+gYCDfnt4d4B0dnpocn5udHx+d3h7foCDeHyBdXx/fHxzc05LRmBdR0FFTU1IS0tISlFPTU5KTlZeWVVMUVNOWVlMU1JSTkxQSVFSVFlXV1BUUFBRUktIZ3hsY3hxbVpKTFR5cHVtdWJudlBkZEhldnFtd2+AamZ4eGlXclFoem1panp6fWx4en9waG5YdXVqdnVwgGFzaH1pbHh8b19fX2NiXF9kZWdqamVoYmNkbGxwcHN0c3NzeXFyeGJsdGdyeXtzc3V5foFzdnpufH15eHJuTUpSdE5DQkVQUUhLTEpMUU9PT01QWmBaWEtUV1BhXlJWUVlTTVBKU1RVWFdXUFVQT05SSktyb3V1cXVxY2hgVW5LcXBeR2h5V3ZUS2h4fXdgeXtzbmFdbW9kU2dydW5teXB3bHZzdHFsbVxzfnprbXl8bHVufGxxdnV4Xl9fYl9dX2VkaWdoZmVeYmJpaWlqa25va3FubWpwYWNmZG93eG9tcHN5f25xcGp7enRyb21LS1pWSEdFR1JRS01OTExRUVBQUFFXXFlVTlZZVWZYUlJZXlRNTkpUVFZXWVdPU09PTlFJUm1IaXdLYGR2dlRWbE5ubHtyYWpnf3VUS1ZrZ3xsbWx4X1pwentfYHpzY3JveHFoZHxpcntdVEtrX3Z1bGp2fHttfnlrfHBdXl5iW19iZGVnZmZlY1tjY2lra3JzcndnbWloZGdgYWxhZ3NybGdsbXJ8a21oa3t0bW1rbU9HSktISkhIUlFNT1BMTFNTUk9TUlhSV1RQV1pWVlRUVGFgUU9OS1RTU1FWVk9PTU5PUUpIUU1PVUxLS1JTUlFST1ZVUVFPUlJYWFBNT1VUV1hYW1tVUVJXW1dYV1tPUlRXV1hRXVhWXFVUT1hSV1dYWVpgXGdyX1tbW11dX2NaX2NjZWdkZGRjWmRiZ2ZmbW5tdWZmZ2NgZl5dZ2BkbGhmZ2tocHpoZ2drdWpoZ2lsUElLS0xNS0pUUk5SUVBMVlZUUFRVWFVaVlJbXVZVVFdVWVhPT0xOV1RQTlVTTlBOTFFQS0lRUUtRTUpKT1FUUVBRU1JKSE1PUFFSUFBQVFZSWFdcV1NSUFFVVVVTWlFOUlFXVVNZVlRYVFNRVFNVVVlZWF5aX2FdXFtaXFxgY1xdYmNkZ2VlZWJZYGFjYWJoaGpuY2FkXl9jXVpjXGJtYV5mZmdtc2RpaGtrZWRjZmhRSktLTk9MTVRRT1RRUk1YV1VUVlhXV1pWU1xgVldWWVVYVFFQS09YU1BOVVBOUU5MU1BNTlVTTlFOTU5RU1BUUFJUVE5LTU9SVFRRUVFVV1VZWltaU1VSVFhXVllcU09TVFdVVFlVVlhUUlFXVVZYXFpcYF1XWV9dXl1cXWBhXltiYmNoZ2ZlYlhgYGJdYGhlZ2VhXl9dXV5aWl9aX2dgXl5dY2hrYWhmaGZkYGJkYlBLTUxQUUxPVFBQVFFPUVpZWFdZWlpYWVZdamRWWFlaV1ZTVE9LT1ZUUE9UUFBRTk1SUU9RWFRRUU9NT1JUTldRU1RVT05OUVRWVVJTUlRYVlpdXFpWVlFSV1hVW1tWUFNVVVVWWFNXV1RSUVhWVltfW15gX1ZfXV5gXVxgX19fWmJjZWhoZWViWWJgYl5eZmRjYGJdXFxcXFlaW1hbYVteXV1fYl9fYmRkYmRfX2BcUE1OTlJRTVJTUFNVUU9WXFpaV1tbXFlaW2RxbWhkX1tZVlZYUk1OV1NNTVJPUVJPTVBTUVVaVVRQUExQV1VRVlJTUlhNT1BSVVhVVFRTVFlYW15dXFtWUk9VVlVbW1ZRU1ZUVlhUU1haU1JRWVdXXV9bYGBgVmJcYGFdYGJfXGBdY2FjaGllZmBaY2BhX19lZV9gY1taXFtcWlpZWVdcWlxbYF5gW15eYWBfY1xZYFpRTk9OVlFQVVNQVVRTUFdcXFxZXlxfV1xeanB3eYBjXFtWVllSTlBXU05RUVBSVFJMUVRTWVtXVU9STlNYVVNRVFFSWU9RU1NWW1VWVlNWWlhdXlxcXlZTTlRWVltbVVFUVFVXWFJTWVxUUlJcWFpdXl1iYWBXYltjYl5hY19cYmFiX2RnaWVnXVxkYGFgYWNkX2JfWVpfW1xbWFhZV1daWlphXV1bXVxcWl1gV1tbWlBPT09ZUFVVU1JYU1RQW11eXVxgXGBVXFxoanJ9c2xoXFVZV1FPUltTUlFUUlRVVEtSVlVaWlpTT1NRVVVUUk5VUVJaUlRVVFhdV1hYU1hcWF5dWVpdVVVOVlZXXlpYUVRUV1hYU1ZZXFRSVl1ZXV1hXmNjX1lgW2ViX2RkXl5jY2FeZWZpZWZeXmRhYWFiY2RfYl5YW19bXFtYWFhYV1taW2BdW1tcW1haW15WXlldUE9PUlpQWlVWV1ZUVFReXmBfXmJdYFVdXmJreXVtfWxaVVpWUVFUXFRUVFVUVllXTFJaVlxaXFJQVVNXVVVST1dRU1dTV1VWW15YW1lVWl5YX15ZXFlSV1JZWFlfWVlSVFVZWVlVV1lcVVRaXV1eYWJgZWRdXl1dZWFiZmReX2RjYFxnZWhmZGJgZWFfYWFiYl9gXldZXlpcXFpZWVdWXVpdXltaW1xbV1lcXVZYV11TT1BXWVFdVVZZV1dVWF9gYWFgY11gVV1eYmVldoJ7aFhZWlRWVFZcWFdXVlZXXVhPVVxZXl1dVFNYU1dVVFJTV1FTVlRYWFheXlhdW1VdX1hfX1hcVlFZVFlaWmFYW1RWWFtZWlhZWVpXVl1fYF9kY2JlZV5iXGBmYmRmZF9gZGJhW2ZjaGZkZmFmX19hYmFhYF9eVlVdWVtcW1lcWVldW1tbWFhZW1laWl1fXVRZXVVOVFpXVFxVV1dZV1ZcYGFhY2FjX19WW2BkYV96dW9oWlxaVlhWWFtaWVtZWFlgVk9UXVtgYVxVVVlQVFZUUlZVUVNVV1tbXF9fWl9cVl9fWV1eWV5WU1lXWVlcYlldVVZaXFpbWlpZWlhZX19gYGRjZGVlY2RaYmZjZ2ZlXmFiYGNdYmNpZWRoX2deYmJjYWFgXl9YVFpaWltbWFxYWFxbWltXV1pYV1xbXGBdVl1dU09WWlZWWlZZVlhXWF1fYmFkYWRhXllZYWRiYGtmaF5cXVtXV1laXFxcX1tZW2JWU1deXWFjXFNWWVBWVVVVVlVTVVRYXV1fYGBdYV1XYV5bXlxbXlhWWFdbWl9fW15XWFxcXF1dW1pcV1pfYV5gZWRkZmZnY1ljZmVoZ2ReY2BfZWNdZmlkZWlfZ15jYmNhYWBfX1tYWVtZWllYWlhXW1taW1dYWlRaXVxbYFxVXmJNUldZVldaWVtcWVdZXmBiYWVhZGFdXllhY2JfYWBhX11dXVhXW1tdXV9fXFpdY1hZWF1gY2RfUlhZUFdVV1hXVlZXVl1dXmFiYV9iXllhXV1eWVxdWVhVVltbYF5cX1lZXl1eXmBcWlpZW19iX2JlZGVmZ2hjWmVmZ2lnY19jXmBmZVppaWNmaWNmX2JiY2FgYF9dXVpYW1lZWFhaWVdaW1pZV1lWVVtdXV1gYGJieEtXV1xZV11cXF1aV1xdX2BiZGJjYV1gWGJjYmBjYWNeXF1cWFdbXF9dYF9dW2BkXFxYWmJlY2FSXFlPWFZZW1lZV1paYF5hYmNgYWNfXGJdX11bXl1ZWVRYXVxfX15fW1peXmBiYltbV1tdYGJiY2VkZ2ZmZ2VdZWdoaWZjYWJcY2dgXGlpY2hpZmVgYmFjYV9gX11dXFlcWVhXWFlZV1xbWldXWFBYWl1hY2Zmcmt/SllXXVtaX11cXlxZXVteX2JjYmFhXWJbYmRiYGNiYl1cW1pXWGpxYFxgX11cYWNfXllZY2VkYlRfWlFZV1xdXFtZW1tjYGNjY2BiZGFgY15gXF5eXlpYVVteXFxhYV9dW2BhYmZiXltTXF9gY2RkZmVnZ2ZmZmBmZ2hoZ2RkYFtmZ15haGhjaWhmY2BiYGNiX19fXV1bWltZWFhYVlpXXFtaVlZVTFhYXGdpa2h1eIF2dnZ2dnZ2dnZ2dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6e3p6ent7e3t7e3t7e3t7e3t7e3x7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHt7e3t8fHx8fHx8fHx8e3t7fHx8fHx7e3t7e3t7fYmIh4mHhYKBgoOCg4OCgoKCgoKCgoKCgoGAgYCBgICAgYCBgYGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t6e3t7e3t7fHx8fHx8fHx8fHx7e3t7e3t7e3t7e3x7e3t7e3t7fHx8fHt7e3t7e3t8iYmHiYaFgoGCgoGCgoKCgYKCgoKCgoKBgYGAgICAgICAgIGBgYB9fHx8e3x8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eHh5eXl5eXl5eXl5eXt7e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx7e3t7e3t7fHx8e3t7e3t7e3t7fHx8fHx7fHt7e3uHiYiJhYSDgYKCgoODgoKCgoKCgoKCgYGBgICAgICAgICAgYKBgH58fHx8fHx8fHx8fHx8fHx2dnZ2dnZ2d3d2d3d3d3d3d3d3d3d3d3h4eHh4eHh4eHh4eHh4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t8e3t7e3x7fHx7e3t7e3t6ent7e3x8fHx8fHx8fHx8fHx8fHx8e3x8fHx8e3t7e3t7e3x8fHx8fHt7e3t7e4aJiYiFhYOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgIGBgYCAfnx8fHx8fHx8fHx9fX18fHVwb29vb3Bwen59fX19fYSMi4uLi454KSkqKiopKz0/Pj4+Pj5tgH5+f397pdfT09PT1r2GiYmJiYqHc3FycnJycYOKiYmJiYqMjY2Njo6OiX9/f39/f359fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx8fHx8fHt7e3t7hIuHh4aHgoGDg4GCgoKCgoKCgoKCgoGBgYCAgICAgICAgYCBgIB+fHx8fHx8fHx9fXx8fH19dXBub29vb296gH9/f39+hpCPj4+Pk3kZGhoaGhocMTMzMzMzMmqCf4CAgHut6eTk5OToyomMjIyMjIlyb29vb29uhY2MjIyMjI6Qj4+QkJCLf39/f39/f319fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e3uCjYeIh4eDgoSCgYKCgoKCgoOCgoKCgYGBgICAgICAgICAgICAgH58fHx8fHx8fXx8fH19fX12dXV1dXV1dXZ3d3d3d3d4eXl5enl6eG9wcHBwcHBycnJycnJyd3p5eXp6en6Dg4ODg4SBfHx8fHx8fHp6enp5eXl7fXx8fHx8fH19fX5+fX18fX19fX19fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e4CMhomHh4SDhIKCgoKCgYKCg4KCgoGBgYGBgYCAf4CAgICAgICAfnx8fHx8fHx8fX19fX19fXZ2dnZ2dnl3dnZ6e3h7eHd2dnh5enp6fnl5eXh4eHh5eXl5enp5eXl5enp6eXh4eXl5eXl7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx9fX19fX19fX18fH19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8f4uHi4qIhIODgoKCg4KBgoKDgoKCgYGBgYGAgIGAf4CAgH+AgYF+fX18fHx8fHx9fX19fX19d3d3dnZ3fXh3d316eH14d3d3fHx9fHp9e3h3d3d3eHh4eHh5eXl5eXp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fHx8fHx8fHx7e3x8fHx8fHx8fHx+iomMjImFg4SEgoKDgoGCgoKCgoKBgYGBgYCAgICAgICAf4CAgH19fXx8fH19fX19fX19fX13d3d3d3p9eHt4fHx3e3h3d3l+fH19eX16eHh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fX19fXx9fX19fX19fX19fX19fHx8fHx8fHt7fHx8fHx8fHx8fH2Kio2NioWDg4OCgoKCgYGCgoKBgoGBgYKBgIGBgICAgIB/gIGAfXx9fX18fX19fX19fX19fXd3d3d3fX55d3d4e3p8eXd3e359fHx6e3p3eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt8fHx8fHx8fHx8fHx8fH19fX18fH18fH18fHx8fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8foqJjo2JhISEg4KDgoKBgYKBgoKCgYGBgoGAgYKAgICAgH+BgIB8fH19fX18fX19fX19fn5+d3d3d3d5fHl7eHx9eXt5enp4e319fHt9e3h4eHh4eHh4eXl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt7fHx7fHx8fHx8fHx8fXx8fX19fX19fXx8fHx8fHx8fXx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx/iIeNioeFhoaDg4ODgoGBgoGCgoGBgYGCgX+AgoF/gICAf4CAgHx8fX19fX19fX19fX5+fn53d3d3d3Z4eHl3eXp4enh5eXd4enp6ent4eHh5eXh4eHh5eXl5enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX18fH18fH19fX19fH19fX19fHx8fHx8fHx8fHx8fX+HiIyIhoeHhIKDhISCgYKBgYKCgoGBgoKBgIGBgYGAgIB/gIGAfHx9fX19fX19fX1+fn5+fnd3d3d3d3d3d3d3eHh4eHh4eHh4eHl5eHl5eXl5eXl5eXl6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fHx8fX19fHx8gIeIi4eHiYaDg4SDg4KBgYGCgoGBgYKCgYGBgIGBgYCAgICBgX97fH19fX19fX19fn5+fn5+d3d3d3d3d3d4eHd4dnl5eHh4eHh5eXl5eXl5eXl5eXl5enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fH19fXx9fXyBhoqKiYmIhIOFhISCgoGBgYGCgYGCgoGBgYCAgYGAgIGAgIGBf3x8fX19fX1+fn5+fn5+f394eHd4eHh4eHZxZGpeam15eXl4eHl5eXl5eXl5enp6enp6enp6enp7e3t8e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIGFiYqJioeEhYWEg4KCgYGBgoKBgYKBgYGBgYCBgYCAgYCBgIF+fH1+fn5+fn5+fn5+fn9/f3h4eHh4eHh5bWRiZV9fXm95eXl5eXl5eXl5eXp6enp6enp6enp6e3t7e3t7fHx8fHx8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goWKiomJhISGhYSDg4KBgYKCgoGBgoGBgYKBgIGBgICAgICBgH58fX5+fn5+fn5+fn9/f39/eHh4eHh4eW5kZWdlZGJeZnh5eXl5enp6enp6enp6enp6enp6e3t7e3t7e3x8fHx8fHt8fHt7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChouJiIqEhYaEg4OEgoGBgYGCgYKCgYKBgYCAgYGBgIB/gIGBf3x8fn5+fn5+fn9/f39/f394eHh4eHl3Z2VkZWZkZWFfaXl6enp6enp6enp6enp6ent7e3t7e3t7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHt8fHx8fHx8fHx9fX19fX19fX19fX19fXx9fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4eJh4SEhoSDg4WBgYGBgYKCgYGBgYKBgICBgYGAgYCAgYF+fHx/f35/f39/f39/f39/gHl5eXl5eWtlYWJlZWFlZV5ieHdze3p6enp6enp6enp6e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fH18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19g4aLhoiFhYaEgoOEhIKBgYGBgoKBgYKBgYGAgYGBgYGAgIGBgn98fH9/f39/f39/f3+AgICAeXl5eXl0Y2NlZGNmY2doZGZsZF5ze3p6enp6enp6enp6ent7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn6DhouGhoaGhYODg4SDgYGBgYGCgoGBgoKBgYCAgYGBgYCAgYGBfnx8f39/f39/gICAgICAgIB5eXl6d2RhY2diYmRdW2VfYV1eYGFoeHp6enp6enp6enp6e3t7e3t7fHx8e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+foSFi4eGhoaGhIODg4KBgYGBgoKCgYKBgoGAgIGBgYGAgYGBgYF+fX1/gH+AgICAgICAgICAgHl5eW9vYmJiZF5jZ19dYWFgXF9kYlttfHp6enp6enp6enp7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7fHx7e3x7fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5/hIiLhoSHhoaEhIODgoGBgYGCgYGBgYKCgYCAgYGBgYGBgYGBgX5+fYCAgICAgICAgICAgICBeXpwXWJlZGJkXmZnZ2BZYmJhY2VfXF1ze3t6enp7e3t7e3t8fHx8fHx8fHt7e3t7e3t7e3t7e3t7fHx8fHx8e3x8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fn19fn5+fn5+fn5+fn5+foCFjIqEhYaGhYODg4SCgYGBgYKBgYGBgoKCgYCBgYGCgICAgIGBf35+gICAgICAgICAgIGBgYF5emxiZGdjYmdmYWBgZGFiZWRjZGNeXGJ1fHt7e3t7e3t7e3x8fHx7e3x8fHx7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/gYeMiYWGhoeFg4SDgoGBgYGBgYKBgoKCg4KBgIGBgYKBgYGCgoF/f36AgICAgICAgIGBgYGBgXp7dGdnZmZkZGZmYF5fYWNlaGRlXmJkYHR8e3t7e3t7fHx8fHx8fHx8fHt7fHt8fHt7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f3+CiYqIhoaIhoWDhIOCgYGBgYGBgoGBgoKCgoKAgYGBgoKBgYKCgX9/f4GBgYGAgYGBgYGBgYGBenptaGNjZ2ZnZWdmZmdiZWRlYmdbYmVgdnx8e3x8fHx8fHx8fHx8e3t8fHx8e3x8fHt7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f39/f4SJioiGiYeFhYSEg4KBgYGBgYGCgYKCgYGBgYGBgYKBgoGBgICBgH9/gYGBgYGBgYGBgYGBgYF7emlpZGNqZmFgZmVjY2NnaWRjYmBiZGJ0fXx8fHx8fHt8fHx8fHx8e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f39+fn9/f39/f39/f3+AhIqMiIeJhoSFhYOCgYGBgYGBgYKBgoGBgYGBgYGBgoKBgYGBgYGAgH+BgYGBgYGBgYGBgYGBgXZzZWRnY2RmZWJlZmdkZmhmZWNgYGNkYHF9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fXx9fX18fHx9fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/fn5+f35+f39/f39/f3+AgICFioyJiIqJhoaDgoKCgYGBgYGBgoGBgoGBgYGBgIGBgYGBgYGCgX+Af35/foCCgoKCgoKCgoKCc3NnZWRkZWlqaGZnZ2NhZmZlZmdmZWVjdX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gICAgICAgIWLioqJioeHhoSCgoGBgYGBgYKCgYKBgYGBgIGBgoKBgYGBgYGAf4B+dHRzdX1/goCAfn5/gYB0cmdkZWNmaWppZWNlY2BmZGRnZ2JiZWFwfXx8fHx8fHx8fHx8fHx8fHx9fX18fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f39/f39/f4CAgICAgIB/houLioqLh4eHhIOCgYGBgYGBgYKBgoKBgYGBgYKCgYCBgYGBgoCAgH5zc3NzdHV4dXV0dHV2dXVwZmNmZWhoaWdoZ2VmZWJfZGVmY2BiZ3d8fHx8fX19fX18fHx8fH19fX19fX19fXx9fXx8fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gIB/f3+AgICAgICAgICHjIyIi4qHh4eEhYKBgYGBgYGBgoGCgoGBgICBgoGBgYKBgoKCgYCAfnNzc3Nzc3NzdHR0dHNzdW9jY2FnZWhoZ2pmZGVnZmhmY2JlYl5ieX18e3t8fX19fX18fHx9fX19fX19e3x9fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn9/fn5+fn5+fn5/f39/f4CAgH9/gICBgICAgICAgYCAf4CAgYGAgIeLi4iNiYiJhYSFgYGBgYGBgYKCgYKCgYGBgIGCgoGBgYKBgoKBgIB+dHNzc3Nzc3Nzc3Nzc3N1cmdlZWRlamhoZ2ZpaGdjZWViZGNoZGd7eHVzc3R2dnl4dnR0dHZ3d3d2dHR0dXV4d3h4d3d6e3x9fXx9fn5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f35/f39/gH9+fHt7fX58eXl2dnZ5fHx6end2d3l7fXt4hIyMioyHh4iEhYSBgYGBgYGBgoGBgoGBgYGAgYKCgYGBgoGBgoGAgH51c3Nzc3Nzc3Nzc3Nzc3VzaGVnaGVrbGhqZ2lqZ2dnZmRkYmVkbnV0dHNzdHNzc3Nzc3Nzc3Nzc3NzdHNzc3Nzc3Nzc3N0dHV1c3V3eHl7fn59fn98f39/f39/f39/f314fH5+fXx4dXZ3eXd4dnRzc3N0dXRzc3Nzc3NzdHNzc3R0c3R0dHODjI2KiYeIhoOGg4GBgYGBgYGBgYGCgYGAgYGDgoKBgYCBgYGBgICAf3VzdHRzc3Nzc3Nyc3NzdnZpY2hqaGpsZWZpbGhgZmVkY2BkZGZ0dXV1dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHRzdHRzc3Nzc3R2dnV1d3V4fH9+fX9+fHp4dXN0dXV1dHNzc3Nzc3N0dHR0dHR0dHR1dXR0dHV1dHR1dXR1dXV1dIaMjYuIhoeEhIWCgYGBgYGBgYGCgoGAgYCBgYKCgoGBgIGBgYGAgIB/dnNzc3Nzc3Nzc3Nzc3N2dnNnZ2pmaGdmaGhmZGlnY2NnZWVmcHZ1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dHR1dHR0dHR0dHRzdHR0dnV1d3Z0c3R0dHR0dHR0dXV1dXV0dXV1dXV1dXV0dHNzc3N0dHNzdHR0dHR1dXR1iY6MjIqHh4SEhYKBgYGBgYGBgYKCgoGBgICAgoKCgoGBgYGBgYCAgH93c3Nzc3NycnJyc3NzcnZ2dW5kXWNnZWlraGVoZ2dqamlnZXB2dXV1dXV0dHRzdHR0dHR0dHV1dXV1dXV0dHV1dHR1dXV1dXV1dXV1dXR0dHV1dXV1dXV0dHV0dHV1dXV1dXV1dXV1dXV1dXV1dXV0dHNzc3Nzc3N0dHNzc3Nzc3R0dHR0dHWKjoyMiYaGhIeFgoGBgYGBgYGBgoKBgYGAgYGCgYKBgYGBgYKBgICAf3hzc3Nzc3JycnJyc3NzdnZ3d2liaGhnamtpaGZkZGVmaWhwdXR0dHRzc3JxcnJ0dXV0dHR0dHR0c3NycXFxcXNzdHR0dHR0dHR0dHV0cnJyc3R0dHR0dXV1dXV1dXR0dXR0dHR0dHR0dHR0dHR0c3Nzc3Nzc3Nzc3Nzc3N0dHN0dHR0dHR0dYuOjImGhYWFh4SCgYGBgYGBgYGBgoKCgYGAgIKCgoGBgYGBgYGBgIB/eXNzc3NycXJycnJzc3N3d3d3bGpoZGhpa3Z6a2VmZWhnbXJzdHN0c3JwcHBxcnN0dXR0c3NycnNycXBvb29vcHFzc3NycnJyc3R0dHNxcHFyc3R0dHR0dHRzc3Rzc3NzdHR0dHRzdHR0dHR0dHRzdHR0c3NycnFxcnJzc3Nyc3NzdHR0dHN2jZCMh4eFhYSEgoGCgoGBgYGBgYGCgoKBgYGAgYGCgoGBgoKBgYGAf395c3NycnFxcnJycnNzc3d3d3dzc2pnaWloeX99cW51bG5wcXJycnFxcG9wcXFxc3Rzc3NycXFwcG5ubm1ubW5ubnBxcnJycnJycnJzcXBvb3BxcnJzc3JxcnJycnJycnJycnJzc3Jzc3Nzc3Nzc3Nzc3Jxb29ubm9vcXJzc3Jyc3NycnNzcnaPj4uHhoWFhYOCgoKBgYGBgYGBgYGBgoGBgYGCgoKBgoGCgYGCgX9/f3hxcHBwcXFycnJyc3Nzd3d2dnd2cnF0c252f352c3hwcHBycnJycXFwcHFxcXFyc3Nzc3FwcXBvb25ubm5ub25vcHBxcXFxcXBwcXJwb25vcHFxcXFxcHBxcXFxcXJycnJycnJycnFxcnFxcnJycnFwb29ubm1ubW5vcXJycnJycnJyc3JxeI+OjYaDg4aEgoOCgoGCgYGBgYKBgYGCgYGBgYKCgoKCgoKBgYKBf4B/d29wb3BxcnJyc3Nzc3J2dnZ2dnZ3dnZ1c3l/fnd3d29wcXFxcXFxcHBwcXJxcnJzc3JycXBwb29wb29vb29vb29wb3Bvb29vcHBxb29vcHBwcHBvcG9wcHFycXFxcnJycnFxcXFxcXFxcHBwcHBxb29ubm5tbW5tbm9wcXFxcXFxcXFxcXB7j42NhoODhYOCgoKCgYKBgYGBgoGCgYGCgoGCg4KBg4KBgYGAgYF/f392bm9wcHBxcXFxcXBwcHZ2dnZ2dXR0c3NxfYB9fX9zb3BxcXFwcHBwcXFwcHBxcnJxcXFwb3Bvb3Bwb29wcG9vb29vb29vb3BxcXBub3Bwb29wb29wcnJycnFxcXBxcnFwcXFxcHBwcHBwcHBwb29ubm1ubm5ubm9ub3BwcHFxcXFxcXFxcIKRjoqEhIOFhIOCgoGBgoKBgYKBgYGBgYGCgoKCgoKCgYGBgYCBgX9/gHVvb29wcXFxcXBwcHBwdnZ2dXRzcnJycnGAgoCBeXBwcHBvcHBwcHFxcXFwcXFxcXFxcG9vcHBwcHBwb3BxcHBvb29wb29vcXFwcG9wcG9vb25vcHFxcHBwb3Bvb3BwcHBwcHBwcHBvb29vb29vbm5tbW1ubm5ub25vb3BvcHBwcHBwcHBwiZCMiISDhIaDg4KCgYGCgoKCgYGBgYCAgYGBgoKBgYGBgYGBgIGBgH+AdG5vb3BxcXFwcG9vcG92dnVzcnFxcXFxcICDg39ycHBwcHBwcHBwcHFxcHBxcXFxcXBwcHBwcHBwcHFwcHBwcHBwcHBvcHBxcXBwcHFxb29vbm9wcHBvb29vcHBvb3BwcHBwcHBwcHBvb29vbm5ubm5ubW5ubm1ubm9wcG9vb29vb3BzcXWPj4yJg4KFh4ODgoKBgoGCgoKBgYKBgYGBgYGBgYGBgYCAgYGAgYGAf4B0b29vbm9vb29vb29vb3Z1dHNxcXFxcXJygIKCgXRxcXFxcXFxcXFxcXFxcXFxcXBxcXFxcHFwcXBxcXFwcHBwcHFxcXBxcHBwcXBwcHBwcHBwcHBwcHBwcHFxcXBxcHBwcHFwcHFxcHFxcXFxcXJxcnFwcnRycnR0dHR1dnRzdHR0dHd3gpCPi4iDgoaHhISCg4GBgYKCgoGBgoGBgYKBgYGBgYGAgICBgYCBgYB/gHVvb29vb29vb25vb29vdXRzcnJycnJycnKDg4OCdnFycnFxcXJxcnJxcXJycnFxcXFxcnFxcXJycXFycXFxcXFxcXFxcXFwcXFxcXFxcnNzcnJyc3V1dHR0dHR0dHV2d3d3d3d3eHh4eHd3eHh4d3Z3dnV2dnZ2d3h6e3x7e3t6enp6enyGkI2LiIODiIeHhYODgoGCgYKBgYGBgYKCgoGBgYGAgYCAgYGAgIGBgH+Ad3FxcXFxcG5ucG9wcG92dHV1c3Nzc3NzdYiDgoN5cnNzcnJyc3Jyc3NycnJycnN0cnJzcnNzc3Nzc3Nyc3N0dHV1dXV1dHV3eHd3d3d4eHh3eHh4eXl5eXl4eHl5eXp6e3t7e3t6enp5eXh3d3d1dnV2dnd5enp7fn5+fX1+fn5/f35+gIyQi4qHg4WIi4iEg4SDgYGCgYGBgoGBgoKCgoKAgYGBgYCBgYGAgIGAf4B8enp5eXx5eHh2dXZ2dHl2d3h3d3Z3dnZ6f3x+fnx2dnd3dnV4enh4eHh3d3d2eHx5eXx6eXl8e3l5eXh4eXl6enl5eXh4enp5eXh4eHh3dnd3eHh3eHh5eXp7e3p8fH1+fX9/f359e3t7e3p5enl5e3t/foB/fn5/fn19fX5+f35+fn6AjpCNioeEhoqLiIaGhIOBgoKBgYGCgYGCgoKCgoCBgoKBgYGCgYCBgIF/f4B/fn19fX9/f318e3t7eXh4eHh5eXl4eXh5eXl4enp6enp6e3t7fH1+fHt7ent8e318e3t7e3t7enl4eXh4ent6enp5eXp8fHt6enx8fHp6ent9fHx+fn+AgoGAgYKAgH9/gYGBgIB/f35+fn5/fX1+f4CAf35+f39+fn9/f39/gH+Af4OQjoyHhoWIi4yIh4aFg4GCgYGBgYKBgoKCgoKBgYKDgoGBgYGBgIGBgIB/goOCgoGBgX99f39/f4F6enh4d3h4eHh5eHh5enp5e358enx9fXt8fX19fHx8fnx9fn5+fn59fX9/f3x8fYGDgYCAf318fXx9fXt9fXx8fH19fX1+gYGChISDgoB/gYGBgH9/f4B/f39/f39+fn9/f39/f35+f3+Af39/gICAf4CAgICAhJCPi4eGhoiLi4iKhoaDgoKCgYGBgoGCgYKBgYGBgoOCgYCAgYGAgIGBgH+ChIKCgICAgH9+fn+AgH9/fn18fX19fYB/fX+Af35/gH9/fn9/gIGBgICAf3+BgICAf4CBgn9/f4CAf35+f39+f39/fn5+f39/gYB/f4CBgYCAgYOEgoGCgoGCgH+AgYCBgYGAgH+BgICAf39/gICAgYGBgIGBgYCAgICBgoGBgYCAgYGFjo6MiYaHiYyLi4qGhoOCgoKBgYGCgoOCgoKBgIGBgYKCgICBgYCAgYGAf4KFg4KBgYCAf39+fn+AfX5+fn19fX5/fn9/f35+fn+AgYCAgICAfn9/fn+Af3+AgH9/f35/f39+fn59fn9+fn9/f35/gIGBgoKDg4KCg4KBgYKDg4OCgYGBgYKBgoKCgYKBgoGBgYGBgoKCgYGCgYKCgoGBgoKBgYKCgoKCgYGBgoKCgoaPkY+KiImKjY6NiYaFgoKCgoKBgYKCg4KCgoGBgYGBgYF/gIGBgYCBgIF/gYWEg4KCgoGCgYCAgIB8fHx7fH18fH9+fn9+fn5+f35+f39/f39/f35+foB+fn5+fn9/f39+f39+fn5/gIB/gIB/f39/f3+BgYGCgoCAgYKDg4SDg4ODgoKCgoKCgoKCgoKCgoGCgoKDg4OCg4ODgoKCgYKCgoODg4ODgoKCgoODg4KCh5KTkIuKiouPj42Lh4SCgoKCgYGBgoKDgoKBgYGBgIGBgICAgYGBgIGAgYCAg4SDg4OEg4ODgoKCgXx9fHx9gn1+f4GCiIGCgoSCgYGDg4GBgYKCgYKBgYCAf39/gICAf3+AgX9/f39/gYCAgICAgH9/f3+AgICAgH9/gYODhYSEg4SDgoKCg4OCgoOCgoODg4ODg4SDg4KEhYWDg4SEgoKDhIOCg4ODg4OCgoODgoCKlJOPioqMjpCPjYuGg4KCgoKBgYGBgoOCgYGBgIGBgoGBgICBgYGAgYCAgH+BgoODg4SEhIOCgoKCfXx8fn6AgYOAg4OChIaFhoaFhIWFg4ODg4OBgYKEhIKDgoeDgoKAgoGBgoKCg4KCg4KDgoODgoGAgIKCgYOCgYKCg4OEhYWEg4OChISEhIOEhISDg4OEg4ODg4OEg4SDhIWEhISDg4ODgoKCgoKCgoKBgYKCgo+UlI+Njo6RkY6KiISCgoKCgYGBgYGCg4GBgIGBgYGBgYCBgIGBgYCBgICAgIKChIKChIOCg4ODgoJ9fX2AgH+AgoGDg4ODhIaEhIOEhYWDg4GBgoOBgIKDgYKFhYWFhoaHhoWGhoeHh4aGhoeHhoaEgoGCg4SDg4ODg4ODhISFhYWDhYSFhISEg4KBg4OCg4SEg4KCg4SCg4ODg4OCgoKCgoKCg4OEhIOFhYWFhoaIk5OTkI+Pj5KRjIqHgoKCgoKBgYGBgYKDgoKBgIGBgYGBgICAgYGBgICAgICAhISEgoKCgoGBgoKBgX+AgYOCgICAf4CCgoGDg4KCgYODg4SEg4KDhYOCgYGBgoSFh4eHh4aGh4eHiIiHh4eIiIiFhIOBgIGBgoKCg4GCg4SEhYSDg4OEg4OEhIOBgYGCg4OEhISDg4ODg4OEhIODgoSDg4ODhIWFhoeHh4eIiIiJiY6TkpKOj46QkY+LiYeCgoKCgoKBgYGBgoKCgoGBgIGBgYGAgICAgYGAgIGAgICDg4KCgYKCgYGAf4CBhYWFhoOCgYB+fn+BgoSCgYKDhIOCg4ODg4KChISDg4OBg4SFhISFhYSDg4SFhYKEhIWFg4KBgH9/gIB/gIGEg4OEhYWEgoKCgoOCg4OFhIKDhISEhYaGhoaGhoWFhoeHhYaIh4aHiIeGhoaIiYeGhYaGhoeIkZKSkI6QjpCRjImHhYGBgoKCgoGBgYGBgoOBgYGBgYGBgICAgICBgYCAgICAgISEg4KBgoGAgYGAgYKIh4aHhYSCgH99fX6AgH+AgYGBgYGBgoGAgYOCgoGCgYKBgYGCgYKCg4GBgICAf4GAgH+AgH9+gIGBgYKCg4OEg4OEg4OCgoGBgoODg4SEg4SEhIOFhYaFh4eIh4eHh4eHh4eGhoaGh4WFhYaGhIWEhIWEhYaSk5GOjo+OkI6JiYeEgoKCgoKCgoGBgIGCgoKCgoKCgYGBgYGAgYGBgICAgYGAgoSDg4KDgoGCgYKDg4iHh4iHhYSCgX5+gICAfn5+f4CBgYGCgYCBgoGCgH+AgIB+gIKBgIGCg4OAf39/gICAf4CAgICDg4KDg4ODgoOBgYKCgoOCgYKCgoOCgoSDhISDg4SEhYWFhYaGhoaFhISEhYWEhIWFhYSEhISDhISEhISEipSTkZCQj46NiIaFhIOBgYKCgoKCgYGAgYKCgoKBgoKBgYCBgYCBgYGAgICAgYGAg4OCgoOCgoKBgoOCiImJiYiHhYSDgYKEhIOBgYGCgoSCgoOEgoOEhYWEgoSCgX+AgoGBgoGChIOBgYGBgoOCgoGDg4SDg4SEg4OCg4KDg4ODg4KCgoKCgoGDhISEhYSFhYWFhIWEhIWFhYWDg4OEhISEhYWFhISEhISEg4ODg4OOlZKRkZGOjYyHhYODg4GCgoKCgoKBgYCBgoOCgYCCgYGBgICAgIGBgYCAgICBgICDhYSEhIODg4SDhIOGh4mIhoWDhIODg4WDgoCDgoOFhYODg4SDhIODhISFhISEgoGAgYKDgoKEg4OCgoGBhIWEg4ODgoKDhISDg4ODg4SFhISDg4KCgoKCgoSEhYWFhYWFhYODhYWFhYaFhoWEhIWEhYWGhYWFhIWEhISDhIODhJGUk5KSj42MioWEhIODgYKCg4KCgoKBgYGCg4KBgYKBgYGBgICBgIGBgH+AgIGAgYaGhoaGhoaHh4aGhYSDhYaCgIGBgYGHgoB+f4GAgIKBgYCBgYCAgoGCgoKBgYKCgYCCgoKCgoKDg4GCgYKDhYODg4KDg4OEgoKEhIOEhIWEg4OCgoKCgYKCg4ODg4SFhYWFhIOEhYWGhYWEhISEhIOEhIWFhYWFhIODhIOEg4KGlJOSlJKPjYuHhISEg4KBgoODgoKDg4GBgoKBgoKCgYGCgYGBgYCAgYGAgICAgICAhYWFhYaGh4aGhoWGg4ODg4GAgoKCgYKAf35/f4CAf4B/gIGAgH+BgYGBg4GAgYGChIOBgYGBgYKBgYKDgoODgoOCgoKCg4OBg4SDg4ODg4OEhIKCgoKDgoKDg4ODhIWEhISEg4OEhIODg4OEhIODg4ODg4SDg4ODg4KDg4KDgouUk5KTkY2NioaDg4OEgoGCg4ODg4ODgoGBgoGCgoKCgoKBgYGBgICBgYCAf4CAgICDhISFhYSFhYWEhIWCg4KDgoKDg4OBgICAgICAgYCAg4KCg4KBgoKDg4OEgoODg4KAgICCgoKCgoKCg4ODgoODhIKCgoODg4KDg4KCg4KDg4WEg4ODg4SDg4SEhISEhYWEhIWEg4SEg4OEhISEhISEg4SEhYSDg4SEhIODgoKDkJSSkpKPi4yIhoOEg4OBgYKDg4ODg4OCgYGCgoKCgoKDgoCBgoGAgICAgIB/gICAgISDhYWEhYWFhYSFhYSDhIWDg4SFhIKCgoOCgoSCgYKGhYOFg4OEhISGhYSEhYJ/fX19foKEg4ODg4ODg4ODhISEg4KEhISEg4SEhIOEg4OFhoWFhYSFhYWFhYSGhoWGhoWFhYWFhYWFhYWGhoWGhoaFhoaGh4aFhYWFg4SEhIeTk5KRkoyLiIWFhYWCgoGBgoODg4OCg4KBgYKDg4ODgoKBgIGAgICAgICAgH+AgICAhYWFhYWGh4eGhYWFhISFhYSEhISEg4SDg4OEhYOCg4SFhYaFhoaFhoeHhoOBfn9+fn5+f4OEg4OEhISEhISEhISEhISFhYWEhYSGhYWGhYaGhoWGhYWHhYWGhoaGhoaFhIWFhYWFhIWGhoaHhoaGhoaHh4iIiIaFhYaEhYWGjZSTkpGQi4qHhoeGhIGCgoKDg4ODg4KDgoGBgoODg4KAgYGBgICAgICAgICAf4CAgICHh4eGhoeHiIeHhoaEg4ODhIODg4OEg4ODg4OEhIODg4WFhYWHh4WFh4WBf39/f39/f35/gISFhIWGhoaFhYWFhoaHhoaFhoWFhoeHh4iHh4eGhoaHh4eGhoaHh4aGhYSDhIWFhoSFhYaGhoeHhoaGhoeHh4eIiIeGhoaHh4eRk5KQkZCLiIiFhoSDgoKBgoODg4ODgoKDgoKCgoOCgYCBgICBgICAgIGAgIB/gIGAf4aHiIeHh4eIiYmIiIODgoKDgoSEhIWEg4KCg4OEg4OChIWEhYeHhYSCgH9/f39/gH9/f4B/f4WFhoeIiIeHh4eIiIiHiIiIhoaHiIiJiYmIh4aHh4eIiIaHhoeHhoeFhIOEhYaGhYWFhoaGh4eFhoeGh4aHh4eHh4eHh4eFh5OTkY+RkIuHhoWGhIKCgYGCg4ODg4ODgoKCgoGCg4KCgIGBgYCAgICAgICAf3+AgYB/hoiIiIiHh4iJiYmIg4KCg4ODhIWHh4eFg4OFhIODg4KEhISEhYSBgIGCgYGBgYB/gH9/fnt6gIaIiIqKiYmIiImJiYmKi4qIiIiJiouLioqIiIeIiIiHh4iHh4iGh4aEg4OFh4eHhoWFhISEhYWEhYWGhISEhYWFhoWGhYOJlJOQjpGOioaFhoWDgYGBgoKDg4ODgoKCgoKCgoKCgYGBgYGBgYCAgICAgIB/gICBgH+GiYiIiYeIiImJiIiEgoKDg4KDhImKh4eEhIWEg4OFg4WEg4OCgYKCgoKCgH9+fH19fX9+fHt8g4eJi4uKioqIiYqJiImLiomJiImIioqJi4mHhoaGh4WGiIiJiIeGh4SDgoSIiIiIh4WCgoGDg4KDg4SCgoKDgoGEg4SDgY6TkpCPj4uIhYSGhIKBgYGBgoODg4OCgoKCgoKCgoGBgYGBgIGAgICAgICAgH+AgIGAf4WIh4eHhoeIiIiHh4SCg4OCgoOFiYqJh4WHhYSFhYSEhYSDgoKCgoKDgX59fn5+fn5+fXx+fX19g4eJioqHh4WGh4eHh4iHiImHiIaIh4eJiISDhIOFhISFhYaIh4aFg4KChIWHhoeGhoSCgoOEgoOEhYKBgoGBgYODhIOEkZKRjo+Ni4eEhoaDgoGAgYGDg4ODg4KCgoKCgoKCgYGBgIGBgYCAgIB/gIGAf39/gIB/hYaGhYaGhoeHiIeGgYKEhIOChYaIi4qGhYaEgoaFgYSFg4ODg4OCgoF9fH1/gH9+fn59fH19fHp8hIaHhoSDgYKDhIWFhYODhYSEhISFhIWEgoKDgoSEgYKDg4WGhYSCgYGCgoODhYOEhIWEhIaDhISFg4KDgYKDg4SFhIeSkY+Nj4yJhoSFhIWCgYCBgYODg4ODgoKCgoKCgoKBgYGBgYGAgICAf4CAgYB/gICAgICDhIWEhYWFhoeIh4aAgYGFg4OEhYSHiIWDgYCAgX+BjIaDg4ODgoKAfX1/gICBf31+fn19fX16enp+g4SEgoGBgIGBgoKBf36BgYGCgYOAgoGCgoKBg4OAf4CAgYOCgICAgIGBgYGCgYGChIODhYSCg4SDgoKBgoSDhYWGjJORjo+Pi4iFhYOChIGBgYGBgoODg4KCgoKCgoKCgoGBgYCBgYCBgH9/gIGBgICAgH+AgIKCg4OChIOEhYWGhn+BfoCBgICAf4GDgn9+fn9+fH+Hg4OCg4KDgX19fn+AgIGAfn19fX1+fXx6enp/goKAf39/f35/f4B+fYB/f4CAgX+AgIF/f3+BgX99fX+AgX9/fn+AgH+AgICBf4CCgICCgoGCgYGAgYGBgYKEg4aPkpCOj42Kh4eGg4OCgYGBgYGCg4ODgoKCgoKCgoOCgYGCgYGBgICAgH+AgICAgICAf39/gYKDhIGCgoOCg4SFgIF/fH19fn19foCAfn1+fXt9foGDg4KCgYF/fX1+foCAgH9+fX19fHt7e3p6eXqAgH9+f35+fn1+f35/gH9+f3+Af4GAf359fn9/fn18fn+Af35+f3+Af39/f4B/f4B+f4CBf4B+f39/gH9/f4B/hZKSj46Pi4uHiYWEg4KBgYGBgYKDg4ODg4OCgoKDg4KAgYKBgYGAgICAf3+AgIB/gIF/f36BgYSEgYKBg4OCg4OBgH98fn5/fn6Af4B/foB9fX+BhIOCgYB/f359fn5/gICAfn19fX17e3x6enl5eXt/f35/f39+fX5/f4CAf35/f4CAgoB/fH5+f35+fXx/f4B/fn5/f4B/f35/foCAf36Af39+fn5/f35+f318fH2FkpKNjIuKiImIhISEgoKCgYGBgoOCgoODgoODg4ODgYCBgYGBgYCAf39/f4CAgICAgH9/foCBhIOCgoGDhISDhICBgICBgIGAgYKCg4GAgX+AgoODgYGBgYCAfX19fn5+f359fX19fXx8fHt6enl5eX2Af4CBgYF/f4GAf4F/gICAgYGCgoB+gH5/fn5+foGAgoF/f39/gIB/f39/gYB+f3+Afn9/fn+Af31+fX17fIaTkYyLioeHioiGhoSDgoGBgYGCg4ODg4OCg4OCgoKBgICBgYGAgH9/f39/gICAgICAgH9+fn+BgYGAgISGh4aHgoSDhYOBg4ODhYSEhISDgYODg4KCgoGCgX5+fX19fn6AfX19fX19fX18e3p5eXl5eYCCgoKFg4CCg4GAgoCBgYGDgoODgYGCgIGAf4CBg4GEgoCAgYCBgYCAgYCCgn+BgIF/gIB/gICAfn9/fnx8ipOQiomIiIiJiIaGhoSCgoGBgoKDg4ODg4KDgoKCgYCAgICBgYGAf39/f4CAgICAgIGBf359fn5/f39+g4aHh4iChYSFg4SFhIWGhoaGhoWFhoGAg4ODgoKAfX19fX19fn59fX19fX19fX18e3l5eXl4fIKDhIWCgYSDgoKDhYaCg4SDgYKCg4OCgoKCgYKFg4iFgoGBgYKCgYGBgYSDgoOCgoKCgYGBgIF/gIGAf36Ok4yHiIeIh4aGhYaGhIKDgoGCgoODg4ODg4OCgYGBgH+AgYCBgYB/gH9/gICAgH+AgYB/fn19fX5+f36Ag4SHiISGhoaFhoaHh4aHh4eHhoeHf32AgIGCgX59fX19fX19fX19fX18fH5+fnx7eXh3eHl5gIODf4ONhIOEhISXl4ODhIF9foGCgoGCgYKBg4aIjIWDgoKBhIKEg4KDhYWEhYOCg4OCg4OCgoKCg4OCgpKQi4iIh4iHhoaEhoWEhISCgYKCg4ODg4ODgoGBgYCAgICBgIGBgH9/fn+AgYCAf4CBgH9/fn1/fn+Bf4CCgYWFhYaGh4eGh4eIhoeHh4aHh4d/fH18fX9+fX19fX19fX19fX19fXx7iJKCe3x6fIZ5eHl8gYF+iZaEg4OEhJSTgIGBf39/fn6Ei4B/gICEhpCJhYSCgoGFhYuDgYKFhYaGhIOFhYOEhIODhIOFhISIko6LiYiIiYeHh4WGhYSFhIKBgoKDg4ODg4OCgYGBgICAgIGAgICAf39/f4CAgICAgIGBf39/f4CAgIGBgYGBg4OGh4aGh4aGiIeGhoaFhISGhX98fHx8fX18fH19fX19fX19fX18fH+RlZaDe3qElHx4eXp7fH+Cg4GCgIOCgH58fn57iJF8fI6Wf31/f4KGioWDg4SDgYONiX99f4OEhYWDhYaFhIWFg4SFhYaEhI6Rj4uKioyJiYmHhYaFg4OCgYKCgoKDhIODgoGBgICBgICAgYGAgIB/f3+AgIB/gICAgX5+f4GBgoKCg4SDgoOCgoWGhISFhYSGhIOEg4KBgYOBf319fHx9fXx8fH18fH18fX19fHx8e4uRl4x6e3yBenp6e3x5eX19foB/gH98e3t+fn2ClZF/hIh+fH5/goR8fIGChIKAf4eDfYKBgIKCgIODhISEhISChIOEhYKEkZGNi4yMjoqJiYWFhYODgoKBgoODgoKDg4KCgYGAgIGAgICAgICAgH+Af3+Af357gICBenyAgoKDhYODhYWFhYODg4SCgYODgoOCgoGAgIB/gX5+fn59fHx8fHx8fHx8fHx8fHx9fHx8fn6Kgnt6e3p4ent7fH17fn1+f319fX18fH+BgX2Gj4F+fYJ+f36Agnx8f3+BgIKAfnx7ioJ9gH9+gYCAgYKBgoCAgIGAf4uTj4uLjY6NiIiHhYWEhIOCgoKCg4OCgoODgYGBgICAgICAgH9+fXx7fHx9f39/gHx6gYF4e4CCgYOFhIOFhIaGhISAhpSIgIGBgYGBgH9/f39/fn5+gHx8fHx8fHx8fHx8fHx9fHx8fHx8fHl7e3t4eHl7enp8gX+Afn+BfH5+f399gIKCgICAgX+CkYF/f4CAfoB+fn9+gIGBfX19e319fX19fHx9gH+AgH6Afn6ClJGLjI2Nj4qFhoaFhISFg4ODgoODg4OCgoGBgYGAgICBgICAf4CAf39/fXt6fYCAgHh+gXd7gIF/gYKCgoKDhoeGhn6IlYp+gYGAf4B/foB+f39/fn+Bfnx7e3x8fHx8fHx8fH59fHt8fHx8e3x8fHp6eXt8en2Fg4J/gYF+f35/gH6FgoF+gH9+foCFhoKAfn6Dh399fH6AgIGAf39+fX19fX57e31/f3+AfX9+gIyRjYuMjY2Nh4SGhoWEhISDg4OCg4ODg4KBgYGBgYCAgYGAgYGBgYGAgH9/f397en9/e3mAd3p/f31+f3+Af4KDhoaFf3+FgX5/gIB/gH5+f35/gIB/gIB/f319fHx9fn18fX19fX19fH58fXx7fXx8ent6fH19f4aEgoCAgX1+fX5/fouEgYZ+fXx8f36CgX99fX19gHx7fXx+gYSDgYB+fn5+fX1+f399foB+fn6EkoyMi46Mi4qGhIaEhIODg4OCg4KDgoOCgYGBgYGBgYGBgYB/fXx8fH1+f39/f397e399d352eH59fH18fX5+gYGCg4B6fX18fn+AgH6Af35/fn+AgH+AgH9/fn9+fn5+fn1+fn99fH59fn19fHt8fHx6e3p9fn+AhIOCf35/fH18fXx8gYN+jH58e3t9fn1+fn17e3t9fHp7e3uAhoSChIOCf4B+f4KCgn9/goJ/gIqPjIqKjIuKiISEhIOEg4ODgoKCgoKCgoKBgYGAgoGBgYKCf3+AgIB/fn18fH5/fn55fX52e3Z4fXx8fHt9fX6BgICAf31/f31+f39/foB/f39/f3+AgIGBgH99gH9/fn9+fn9/f3yCfn59fX17e319fHp8fH6AgoB/gIB8fH18fHx8fH18fXt/fnt7e3x8fH18e3t7e3x8enp9en6Cf4GDhIKBgoGFhoWFhoaHhYKEkY6MiomKh4eFgoOEhISEg4KCgYGCgoKBgoGBgYGBgoGBgoKAgYKBgYCAgH9+e3x+fnx6fnh5dnd8fHx7e318f4GAf35/foB/f35/fn5/gH9/f39/f3+AgYKAfn6BgIB/f39/f39+fYN8fH19fH99fX19e3x+fn9+fn1/fnx8fHx8fHx+fnt8e3x8fHx9fH18fnx9fHx7e3x5e3x7e317fX5+f4CAg4eJiYmKiYqJhYiRjYuHiIaFhYOCgoOEhIODgoKBgYGBgYKBgYGBgYKCgoGCgoCAgX98e3p6eXt9enx+fnl8eXh4dHx8fHt8fHx+gX9/f39/gIB/fn5+fX+AgH9/f3+Af4CDgoB/gIGAgIB/f4CAgH58enx9fX59fX5+jIZ9fX57e4OCfX19fX18fXx9fX1+fH17fXx9fX58fn19fX18e3t6fHt8fHt6e3t6enp7fn6DhYiHiIqLi4qJjJCNjIiIhoWEg4KCgoODg4OBgYGBgYGBgYGBgYGCgoOCgYKBgIGBf3+Af356eHl5en5+e3l6eH5zfHx8e3x8fH5+fn5/gH+AgIB/fn9+gIF/f4B/gIGAgoSEgYCAgYGAgX+AgYKBf39+f31+gH57foGRjHx9f4qAjYx+fn19fX59fX59fHx8fX18fXx9fX1+fX1+fnx7e3t8fH18e3p7fHl6eXh5e35/hIOEh4mKiImNj4yKiIiFhISDgYKCgoKDgoGCgoKBgYGCgYKCgoGCgoKBgoKAgYGAfoCAf39+e3p5e319eHx6f3KBfXt7fHx8fn59fYGBf4GBgX9/gH+AgX9/gIGCgYGFg4SCgYGCgYKBgICBg4KAf4F/fX6Afnx/f4iCf36DkISEg4F/fn18jYd9fX59fHx/fnx9fXx9fX5+fX5/fX19e3x9fnx8e3x9enp5eXp5e3t+foCBg4eEiI2MiYmGhYSEg4KCgoKCgoKBgYGCgoKBgoKCgoKCgoKCgoGCgn+AgIB+f39/fn5/ent5fX16enp9cX6Cent8fX19fXp4f4KAgYKCgICBgIGBgICBgoKCgoWFhIKBgYGBg4F/gIKEgX9+gYB9foF+fX5/gIB9fn+EgH5+f31+fX2KhX1+fn1+foB/fX19fH5+fn99f4B9fX18fX9/fHx7fH17e3t6enp7e3x9fn2Ag4CJjImKh4WFhYSDg4KCgoKCgYGBgoKBgoKCgoKCgoGBgoKBgYKCf4CAgH9/f39+fn59eXp6fXx5d3t0e4d8dHd9fn17e3Z2foCBg4KBgYKCgoKBgYGDg4OChYaEgoCAgICCgX+AgYSBfn6AgH1+gH59fn6AgH+Bfn+Af39/gH99fn9/f3+Afn9/gH58fX18fn5+foF/gH2CgHx9gIF9fHx9fXx8e3x8e3t7fHt8fHx9fImJh4eFhoWFhISDgYKBg4KAgIGCg4KCgoOCgoKCgoGCgoGBg4J/gIGAf39/fn5+fn57enp8fHt2e3R3f352cnt+fnt4dnd8gIGCgoKBgoODg4OCgoSDhIOFhoOCgX9/gIOAgICAg4F+foCAfX+AfX1+foCAf4J/gYGAgICBf31/f3+AgIGAgIB/fnx9fX19fn59g32AfoKAfX6AgX98fn59fX17fH58fXx8fHt8e3x+iYWGhIWHhYSFhIKBgoGDgYCAgoKDgoKCg4ODg4KBgYGBgYGCgH6AgYB/fn5+fn5+fn56e3p9goN9dXF6fHpxen19eXh0dICAgoKCg4KDhYOEg4KDhISEhIWEgYGAgH6Agn9+f36Bf35/f4B9foB9fX1+gH9/gYCCgYCAgIKBfX6Af4GAf4CAgH9+fX19fn1+fn19gYR/gH9+f4GBf32Af319fn1+fn1+fHt8enx7eoCFgoOEhYSEhIWDgoKBgYKBgICCgoOCgoOEg4SDg4KBgYKBgYOAfoCBf35+fn5+fX1+fnt7en6Jh354cnl9f3F6eHt4eXR1fYKDgoODg4OFhIWEg4OEhIODhIKBgH+Af4CBfn19foB+fn5/gH19f3x9fX6Af4CAgIKAgIGAg4F/f4B+gIF+gIF/gH9+fn5+fn5/fn6FhYCBgH+Ag4F/foGAf36AfoB/fn17ent6fHt6goN/goKCgoOCg4KBgYCAgoGAgIKBg4KBg4SDhIKEgoGBgoGCgn9+gIF/fn1+fn5+fX59fXp7fIWEe3tzeXt8cHd1dnd5dnR6hISBhISDhIWFhoSDg4WEgoODgoCBfn9/f4B9fX1+f31+f39/fn1+fH19foF/gIB/gIB/gIGDgoGAf36AgH+AgYCBgH9/f39/f4CAgIGCgoKBf4GEgX+Ag4F/f4B/gX+Af3x7e3p8e3yBgH+Bf3+BgIKCgYF/f3+BgH6BgoKDgYGDg4KEgoSCgYGBgIGCgH6AgH9/fX5+fX19fn19e3t6gH94fHZ5enxxdHh3dnh1cnmFhYKEhIKEhYWGhISChIOBg4KAgIF+f4B/gHx9fX6AfX5/f39+fX98fn5+gX+Bf39+f4B/gIODg4F/f4GBgIKBgYGAgIGAgICAgIGAgYKDgYF/gISBfYGDhICAgX+BgYKBfXp7e3x8fX99f4B8f39+fYGAgH59fYB/foGBgYKBgIKCgoKBg4KCgYB/gYKAfn9/fn99fX1+fX19fX19ent7fHZ9eXh6enJ1eXl2d3dzdYaFg4WFgoSEhYSEhIKDgoGDgX+AgX5/gH6AfX19fn9+f4B+fn99f3x/f3+BgIF/f3x+gH6AgYKDgYCAgoOEgoGAgYB/gYCAgYGAgYGCg4KBgX9/g4B+goKEgICCgYKChIF+e3t8fHx9fX1+fXp+fX55fn9/fHx8fn1+gYCBgYGAgoGBgYGDgoGBf4CAgoB9fn19f319fX59fH19fX16e3p8dnx6d3t4cnZ5e3Z2dnN0hoSEhYSChISFg4OCgYOBgYOBgIGBfX+BfoF9fX1/f39/gH5+f359fYB/gIGBgX9+fH5/fn5/gYJ/gYGCg4eFgX9/fn6Af4CBgICAgIKCgYCAfoCCf36BgoKBgYOCg4OFgn99fX18e3x8eXp7en55fHl4f357e3t+fX1/f4F/gH6BgICAgoOCgYF/gIGBf31+fH1+fX19fX18fn58fXx5e3x4enx3endzeHd6c3Z2c3SGhISFg4KDhISDgoKCg4GCgoGAgYF8gIB+gH1+fX5/gICAf35/f3x+gH+BgIGAf359f39+fn+BgH2AgIGDhIN/f359fn5+f4B/gIB/gYKBgH9+f4F+f4CCgoCBhIKEhYaDgH59fHx8fHp5dnl5enl2eXZ+fHt7e358e399gH99fX9/f3+BgoGBgX5/gYF+fX18fX19fX19fXx+jYF8fXl7e3p5fHd4eHR1dXhyd3d0doaEhYWDg4ODg4OCgYKDgoGDgn+BgH9/fn+AfX19fX+AgIB/f39/fIB/f4GAgYCAf32Af35+fn9/fX5+gYGCgn5/fn1+fn5+f3+Af32AgYB+fn5/gX5+gIKBf4GDgoOEh4SAgH58fXx8e3x1eXl4eHh5d3t8e3p7foV9fn1/ent+fn59foGAgIGAfX6BgH59fXx9fX19fX18e32Dgnx8ent7e3p7d3Z4dXJzdnF3eXJ4hYWFhYOEhIKCg4KBgYKBgIOBgIB/fn5+foB+fX58foCAgH+AgX97gH6AgH+BgYB/fYB/fn5/f319fX6AgYGBfn9+fn59fX1/fn9+fH6Af35+fn+Cfn6AgIF/gYOCg4OGhICBfnx9fHx7fHh3e3h1eXd3eXx6e3t9kod9fH13en1+fn19f35+gH98foB/fn19fH19fX19fXt8ent9enp4e3x6ent4dHh1cXJ0cHh4cXmEhYWFg4SDgoODgoGBgoKAgYGAgH99fn5/gH18fn1/gIGAf3+CgHyAf4B+f4GAf399gH9+f39+fX18gICAgIB+f35+fn18fn9+f358fYB/fn1+gIJ/foCAf36Bg4KCg4WFgoJ+fX17e3x8eXd7eXd4d3d4e3t6e3yFin17end6fH19fHx9fX1/fnx9fn59fXx8fX5+fX18fHt6enx7e3p5enp7enhzd3VxcXNweHdxe4WGhYWDhYKBg4OBgYGBgoCBgICBgH5/fn9/fXx+fYCAgoGAf4GBfX6Af35/gX+Af3+BgH+Af31+fH1/gICAgH9/f39+fXx+f39/f319f39+fn6CgYF/gIB/foGDgoKEg4SCgn5+fHx6fHt7eXt6d3N2d3h5e3p7eXp/fnt7d3p8fXx8fH59fH19fH19fXx8fX19fX99fXx9e3l7fHx8enp6enp6eHN2dXBwcm93dnJ7hYeEhYOEgoGDgoKCgYGCgYKBgYGAf4B/f399fX9+f4CBgYF/goF9foF+fn+Bf4B/gIKAgIB+fX58f3+BgICAf4B/f4B+fX5+f4B/f39/gH9/f4J/gH9/gIB/gYGAgISBgoKAf39+f3x9fn56fYR+dHx9enp6enx5eXp6hoV3eXx8fHx8fXx8fHx8fX19fHx9fX19fn19fX16eX18fH16enp6enp5c3V1b29xb3d0c3yFhoOEgoOCgYKBgoKCgYKBgoGCgYCAgICAgH59gH+Af4GCgn+CgX+AgX5/gYB/gICAgn+Bf319f35/f4KAgICAgIB/gIB+fn1/gH9/gIB/f39/gH+AgICAgH+AgYCBgYGCgYCAf39/fn1/fnuBkox6fH18e315e3p6eHmBgXh5e3x8fXx8fHx8fHx9fX18fH18fn1+fn59fHp8fHt8fXt5enp6eXlzdXVvb3Fwd3N0fYWGg4OCg4KAgYCCgoKAgYGCgYKBgYCAgIGAfn6Af4GAgYKCgIKCgICCfoCBgX9/gX+BgIF/fH6Af3+AgoCAgICAf3+AgH9+fX6Afn2AgIB/f3+AgICAgYCAf4CAgYCBgYKCgICAf39/fX5/fIGGiXx8fnt7fnl6e3p7jX53d3l7fHt9fHx8fHt9fH19fX18fXx+fn5/f358enx9e319e3l6e3p5eXN0dW5zcXB4cnV6hYaDg4KDgoCAgIGCgX+CgYKBgoGBgYKAgYF/fn9/gYGCgYKBg4OAgYJ/gYGBf4CAgIB/gX99f4F/gICBgICAf4B+gICAf359f4B+fn+Af39/gH9/gICBf4CBgH+BgIGCgoKAgICAgIB9foB9gIOCe35+e3t9e3p8fHuHeXh4eXx8fH17fHx9fX18fH19fn19fX5+f3+Af317fH18fHx7enl7e3l5c3J1bnZycHhxdXaFhYOEg4KCgICAgoF/gIKCgoKDgYGDgoCCgYB/gICCgoKBg4GEhICBgX6BgoB/gICAgH+Cf36AgYCCgICAgIB/gH+AgIB/fn2Af39/f4GAgH+AgH+AgYF/gICAgIGAgYGBgoGAgYCAgH9/gH5/fX59fn57fXx9e3x8d3h1eHh5e3x8fXx8fHx8fX5/f39/fn19fn9/gIGAf3x9fHx9e3p7eXp8eHpzcnVud3FxenF2d4WFg4ODg4KBgYKDgH+CgYWDg4SBgYOBgoKCgYCAgIKDgoCCgoWDf4GAfoKDgICBgICAf4CAf4GBgIJ/f4CBgH9+gICAgICAf4CAgH+AgICAgIB/f4CBgYCAgICAgYGAgoKCgoCCgYGCgYB/f4B/gId+fnx6fXx7fX54d3Z5eXl8fXx8fXt8fH19fn5/gIGAfn1+gICAgoGAfH59fX58d3t6ent5eXNxdW53cHV6cXZ5hYWCg4KDg4KDhISAgIKBhoOEg4GChICEg4KCgICCgoSBgYKChIJ/gIB/gYOCgYCBgYCAf4GBgYGAg4F+gIOCf31/goGAgIB+gYCBf4CAgYGBgYCAgIKBgYKBgYCBgYGBgoOCgoOBg4OCgYCBgH+AhH19fXt/fXp9gHp5dnp4eXt7fH19e3x9fX19fn+AgYGAgH+AgICDg4B9f35+fn15eXt6enp5c3J1b3dxd3lzd3uFgoKDgoOEgoOEg4CAgoOGg4ODgoKEgYSDgYKAgIKBg4GCgoGCgX6BgICCgYKCgYKBgICAgICBgoGEgH6Bg4F/f4CDgoCBfoCCg4KAgYGBg4KDgoGBg4KChIGAgYOBgYKEg4OEhIODhIODgoGBgYCCf4B/fYB8enx/e3t3fHl5eXt6fX59fHx8fH1+fn+BgYCAgIGBgYSEgH2Af39/f357e3t6e3p0cHhyeXR2eHR3e4SCg4KDg4SChIODgYKChIaEgoODg4SBhISAg4CBg4KCgoKCgIKAfoGAgIKBgoGCgoKBgIGBgoOCgoOAfoGDgX9/gYSEgYN/goKBg4KCgoGEg4OEgYKEgoOCgoGCgoOBg4SDhISEhISFg4SCgYOCgoOBgYGAgH58fIB8fHh8eXp5enx9f3x7fHx9fX18fICAgICAgYGBgYKBfoGAgICAf3p7e3p6enVweHd5dnV8dXZ8gICDgoODg4OEhISAgoKFhISDg4KDhIGEhYKCgYKDg4GCgoKAgYB9gICBgYKDgoKCgoGAgYKCg4KCg4B/gYOBgICChIODgoGCgoGDgoKDg4ODg4SAgoSDg4OBgX+Bg4KDhYKEhISEhISDhISChIOEhIKBgoGBgHt+gX59eXx6enp9fHyBfXp8fH19fHp7fn5+gIB/gYGAgICAgIGBgIB/fX18fH18dnJ2eHh2dH92dH2Hh4OChIWDg4SFhICChIWEhIOCg4SEgISFg4KCgoODgoOCgoCCgH2AgIGCg4KCgoKEgoGCgoOEgoKBgICBgoGAgYOFhIOCg4CCgoOCg4ODg4OEg4CCg4KEg4KCfoOBgoSEgoODhISEhIOEhIOEg4WEg4ODgoKAe4CBf3x8fXp6e31/fX9/fHx6fH59fH19fn5/f39/gICAgH9+foCBgICAfnx9fX5/fn18e3h2f3V2f4SHg4KDhYODhIaEgYKFhoWEhIODhISChIWFgoKDg4SCg4KDgoKBfoCAgoKDgoODg4SCgoKCg4OCg4GBgYGDgn+ChISDg4KEf4KEg4ODgoSDg4SCgIOEg4SDg4KCg4KChIOCg4SEhISEhISEg4OEhYSEhIOBgoB9gYKAfXx8e3x8gH19foB+fn1/fnx8fH19fn5/fn+BgYGBgH99fX6BgYB+fn19fX59fX5+f3+AfHyAgYKCg4OGg4SDhoSBgoiHhYSDg4SEhYGFhYWDg4SDhIODgoOCg4F+gYGDg4SCg4OEhIOCg4KEg4ODgoKDgYOCf4KDg4ODgoOAgoWDg4ODhIODhIOAgoSEhYOCgoODg4GEg4GDg4SDhISEhYSEhIWFhYWEg4ODf32BhIB9fXx8fHx/gX59fn9/fX99e3x9fX19fX5+f4CBgIGBgH59fH6Cf39+fn5+fX1/f39/gICAf4CEhIODhIWDhIOFf36CiouFhISDgoOFgYaGhoOEhISEhIODg4OEgn+BgYODhYSFhIWEg4KEhISFhIODgoSDhYKBhISFhYaEgoCDh4SDg4OFhIWFhIGEg4OHgoOCg4GCgYSDgoODhYODhYWEhYWHh4aHhYSEhYSBf4GDf359fH59fX+BgH9+fHx+f358enx9fX19fX5+fn9/gIGBf319fIB/gH5+fn5+f3+AgYGBgYKAgYWFhIOFhIKEg4aAgoWFi4mEhIOEhYWDh4aGhISEhIWEhYSEg4SDgYKDg4OEhIaEhYSDg4SEg3yDhHuBhHd5g4F9hH5+cnWDgoF2foOEgX2BdYF6g39/gH6EhIKDg4KBg4SDg4SFg4SFhoSFhn2EeXx+f4N7hYOAhIOAf319fn19gYOBfXt/fX6Afn18fHx9fX19fH19f4B/gYJ/fX18f4GBgICAgH+BgYGCgYKDg4KChoSEhIaEgYOEhYOEhYOKiIWFhYOFhYSGhoaDhISFhYWEhYWEhIWCgoOEhYWFhoSFhIOEhYWCaICFanx7cXF8gXOGc3R0fYKDdXNxg4Z0cHVyc3SDdnt9dYF/goOBgnZ5hYCDgIR/hYSChYWCaHpyc3N8f3OCg3+Dg32BfX5+fX6Cg4F8f4F9f4B9fXx8fHx9fHx8fn1+gH+BgX99fX2AgYKBgYGBgIGBgYKBgoKCgoSHhIWEhYSBgoSGhoOFg4aIhoaFg4aGh4eGh4OFhYaFg4KFhoSFhYODg4SEhoaGhIaEg4SFhn1xe4FweXZ+g3+CbnlwdXN8dnl5hXKEg3B2eHF2dHR1cnN0dml/gG5yb3R2bnVsd217c26AiHltfXJzdnN2bW14bHB5bHV9f399foGAgX2Af32Af4B/fX18fH19fH1+f32Af4CAfnx/foCBgoCBgICAgYCAgIKDgoOEhYiGhoCChYODhIeGg4WFhYaHh4SDhoeIiYaHhIWGiIeEg4WGhYWEhIOFhIKFhoaFhoWEhoWHdnB0e3BydX+HhYNtdW92b3x1coR5eYd4cXR3bndod3pucHaCcoN+b3p5eW1vbnpvb213fXiGcHF6cHJ0ZoF1fm57eXNveX+Af319gX9/fH99fIF+gIB+foCAgYB+fn9+foF/gH9+fYB9f4CBgIB+fn+BgH9+goOCgoSFh4eEfoeEg4OFh4aEhoWFhoaIhISGh4eIhoeEhoaLiYWEhoeHhYOFhYWEgoWFhYWGhYWGhYZxdXByc29zenl+g3SIdHV+iHZugnKEhnluanJ/cW1zd3x/dXR8hH54cXV3bnl1enF2eHV6eYRxam95eHBreXN6b3p3dnZwgYB/fn5/f356fn19f31/f359gIGDg4CCg4GBhIKBgIGBgH1/f4F+f35+f4GAfn6BgoCAgYSHhoODhoSEhYaHhoWFhYWGhoiFhYaFh4eFhoSGhomIhYSJioiFhIaGhYWDhYWEhYaGhoaFg3iLeXKIentwcIWFeIV4eWtzfnl7a3KDh4N6fG17eXl0fYB2bm+AgG90fHV3cXl9fW1+dW+DhYZ6gHJye3x1cG96bHN8bneCgIF+fn99fXt9e3x9fX9/fn1/f4KCf4GDgYGDgYB/gICAfn9+f31/fn1/gH58fYGAfn6Ag4iFhoOFhYWFhoeFhYWFhoeHiIaEhoWHhoaFhIWFhIWFhomJh4aEhoWGhoWGhoSGhoeGhoWGh4eHhoaEhoWGh4iHhYeGhoOHhoWFg4SGhoWGhIaEg4SEhoSEgYODhISFhIWEhYSGg4aHhYaEhIWHhoSEhYaEhX13hYOEhIOCgX1/fnt8e357fHx9f359fH5+gYB9f4F/f4GAfn5+gH5+f35+fX99fX5/fHt8f358fH+BiYaFhIaGhoWHhoWFhYWHhoeIhoSGhYaGhYWDhIWGhYSGhoaGhYWGhIWGhoaGhYaGh4eGhYeIiIiIhoSHhYaGiIaFiIeIhYeGhoiFhYaGhYaGhYOChYWGhYWDhYSEhIWEhYWEhYWEhoeGhoWEhoeGhISEhYOFhIKEg4OFg4OCfYB/e3t8fnt8fH1/fnx8fn2Af31+gH5+gH99fXyAfX5+fn5+fnx8fX57fHx/fHt7fn+Ih4SEiIaGhoeGhYWEhoaGhoiHhIWGh4aFhIODhIaFhIeFhYaFhYaEhYaGh4eFh4aJiIaGiIeIiYiFhIiFhoeGh4aIhoeFh4eGh4WFhoeFh4aFgoOFhoaEhIOEhIOEhoSFhYWGhoSGhoWGhYSGhoWEg4SEg4WHhYOCgoWDhIF+gIB8e31+e3x7fX59fHx+fX5+fH9+fX1+fn19fH98fn58fYGAfHx8fXx8fH56e3t9foiHgoWIh4eGhoaGhISGhoeGiIaEhYSGhoSFh4OEhYSFh4SFhoaFhoSGhoeHhoaHh4mIhoaIh4iKiIWHiIWHhoWHhoeGh4WIiIeHhYaGh4WGhoWBhISFhoWFhISEg4SFhYaGhoWGhIaFhoeFhYaGhYSChIOChIeDhIGChISDgYCAgHt7fn58fHx9fXx8fH19fH18fn18fX18fHx9fXx+fXt8gX99fH18fXx8fHp6fHx9iIeChoiHhoeGhoaDhYaFhoaGhYOFhIaFhIiJg4GEg4SGhIaGhoaGhIeHiIiHh4eIioiGh4iHiImIhYiHhYeGhYeHh4WHhoiIh4eFh4eHhYaHhIKEg4SGhYeFhYSDhISFhoaGhoaGh4WFh4WGhYaFhIKEg4ODh4GDgIKDg4KCgn+Ae31+fXt8fH59fH19fH17fHx8fHx8fXt7e318e358e3x/fX18fX1/fXx6ent7fHyIh4KGhoaGh4aGhYOFhoWFhYWEg4WChoSDiId/enqChYaEhoaFh4aEh4eJiIiHhoiKh4aHh4aIiYeFiIeGiIeGhoeHhYeGiIiHhoWHhoeGhoeDg4SEg4aGh4WFhISEhYaGhoaGhYaHhoaHhoaEhoWDg4OCgoOGgYN+goKDgIODf398f35+fHx9f318fX18fXp7e3p7fHx8e3t7fnt7fXt7e358fHx8fX5/fXt6fHp8fYmHg4aFhoWGhoWEhIWFhYWFhIOBhYGGhIKEhHyAhn+ChYWGhYWGhYSHh4iIiIaFiYqHhYeGh4eIh4WIhYaHiIaGh4eGh4aIiIeFhoeGh4WFh4OEhoWEhoaHhoWFg4WFhoaGhoeFh4aHhoeHhYSFhYOBg4KAg4WCg36BgYF/g4F/f35/fn98fH1/fXt9fXx9enp7eXt8fXt7e3t+fHx8fHp7fXx8fHx+fYF8e3t7e3x7iYeEhoSGhIaGhYSFhYWEhIOEgoCDgYWDgYJ/eoSMe4CEhYeGhoaFhIeIh4aHhYWHioeEh4WGhoiGhYeEhoeJhoaIiIeHhoeIhoSGhoaHhYWHg4SFhIaGhoeFhYSDhYWHhYeGh4WGhoaFhoaEg4SFgYGCgYCDg4OCfYGBgH6DgX5/f4B8f3x9fX59e359fH15enp5e319enp7e318fXx8ent9fHx9fH5+gHx7e3x+fXyIh4WGhYeEhoWFhYWFhYODgYOBgIKBhYKAgH9/fXx7gYSFhoaEhYSDh4eGhoaFhIaJhoKGhIaGhoWFh4aHiImGhYiHiIeGhoeFhIaFhYaFhIeDhIWEiIaGh4WFhIKGhYaFh4aHhIaGhoaFhoODg4SAf4GAgIOAg4B8gYB+foKAfYB/gXx/fH1+fX57fn18fHl6enl6fX15enp7fHt8e3t6e319fH18fn5+fHt7fX59fIiGhYaGhoWFhYSFhYSDgoGAgoGAgICDgX5+foB5en2Ag4OEh4WEg4OHhoOEhYSChYiFgoSDg4WFhYWHh4aIiIaFiIeJh4aFhoWDhoSFh4OEhoSEhYSHhoWGhYaEg4aFhoaGhoaEhYaGhYWGgoKDg39+gICAgX+DgHuBf31+gn5+gH6Afn99fX59f3t/fXt6eXp6eXp8fXl6ent7enx6e3t7fH19fXx/fn18fH1/fnx7iIWFhoaGhoSFhIWDhYKBgICAgYB+f4KCfX1/f3t/f4KDg4WGhYSDgoaDgYOEgoCFh4WCg4GBg4SEhIaGh4iHhYWIhomHhYOEhIKFg4SGgoOFhISGhIeGhYWFhoOEhYSFhoWGhIOFhIWDhYWBgYODf35/gH9/f4N/e4B9fX+CfYCBfX6Bfn1+fX1/e398e3p5enp5enp8eXp6e3t7fXp7e3t8fX59fYF9fXx8fYB/fXyGg4aGhoaGg4SChYKFgYGAf3+AgH5/gIJ8fn9/foCAgoKChIWDgoGChIGAg4KBgISFhYKBf4CCg4OEhYaIhoaFhYeFh4WFgoOCgoOCgoWBg4WEhYaEhoaHhoaFgoSEg4SGhYWDhISDhIOFhICAgoJ/fX1/fn6Ag357f3x8gIF9gYB9fYN8fn59fX57fnt7enl7enl6ent5enp6e3t8ent8fHt+fn1/gXx9fHx9f4B+gIaEhYWEh4SDg4KGgoOAgYB+fn+AfX9/gnx9f39+fn6BgYKEg4KBgYKCf4CBgoCAgoWEgoB/gIGCgYOFhYeFhISGhoSFg4WBgoGBgoGCg4GChISEhYWGh4eGhYSDg4ODhIaFhIGDgoODhIODgH+AgX59fH5+fH+DfXx+fHyBgH6Cf31/gnx/f319fHx8e3t6enp6eXt6enp6enp6e3x5e317fH5/f4GAfX59fX1/gICAhoSEhYSFgoOCgoSCgoCBgH59fn9+fn6AfX2Af35+foGBgoODgoSHgYF+gICBf3+ChIOBf35/gIJ/goWEhoSCg4WFgoSBg4CBgIGBgYKBgIGEg4OGhYWHh4WEhYWCgoKDhYSCgYGBgoCFg4F/foB/fnx8fn18foN9e358fYF/gIN9fYCBf35/fXx7fH17e3p6enl5e3l6enl6ent7e3p7fXx8f3+BgoB+gH+AgH+AgYDKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzNzc3Nzc3Nzc3NzczMzMvLy8vLy8vLy8vLy8vLzMvLy8vLy8vLy8vLy8vMzMzMzM3Nzc7Oz8/Pz9DQ0NHR0dLS0tLS0tLT09PT0tLS0tLS0tPT09TU1NTU09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tLS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1dXV1NTU1NTT09PT09PT09PT09TU09PU1NTU1NTU1NTU09PT09PS0tLS0tPT09TU1NTU1NPT09LS0tLS0tLR0dHR0dPHhnNlYFtLWWdVTUZIQD03Nzg5Nzw8PDo8Oz42Oj04PDs6OTg3ODs7Oj87PTs8PD47P0E/QkJBQ0RFREE+PTw7QENDQUBDQ0FBR0hHSUtSwtXS09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXVysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMy8vLy8vLy8vLy8vLzMzMy8vLy8vLy8vLy8vLzMzMzc3Nzc3Oz8/P0NDQ0NHR0tLS0tLS09PT09PT09PT09PS09PT09TU1NTU1NTU09PT09PT09PT09PT09PT1NTU1NTU1NTT09PT09LS0tLS0tLT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1NTU1NPT09PT09PT09PU1NPT09TU1NTU1NTU1NPT09PS0tLS0tPT09PU1NTU1NTU09PT09PS0tLS0tLR0dHSzIxyZ2BcTVllUktHSz87Mzc4Ozg5Pj05PDpBOjs9Nzs8PDo6Nzg6Oz0/Oz88PTw/Pj9BPUFBPkNDREJAQT46Oz9DREFDRERCQklHSEhJTr7V0tPT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1crKy8vKysrKysrKy8vLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzMzMzMzMy8vLy8vMzMzMzMzMzMzLy8zMzMzLy8vLzMzMzc3Nzc3Ozs/P0NDQ0NDR0dLS0tLS09PT09PT09PU09PT09PT09TU1NXV1dTU1NTT09PU1NPT09PT09PT1NTU1NTU1NTU1NPT09PS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1tbV1dXV1dTU1NTT09PT09PT09PU1NTU09TU1NTU1NTU1NTT09PT0tLS0tLT09PU1NTU1NTU1NTU09PT09PT0tLS0tHR0s+Sd2hfXk9XZ01LRkw9ODc2NTk5OTw+OT88RDk7PDc5PD07OTc5Ojw9QDs+PT47PD48PT5BQD5EQ0NDP0E9Ojs9QkNFQ0NEQT9FSEpJSky61dPT09TU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8rKysvLy8vLy8vLy8zLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMzMzMzMzMzMzMzMzMzczMzMzMzMzMzMzMzMzMzc3Nzc3Ozs/Pz9DQ0NDQ0dHS0tPT09PT09PT09TU1NTU09TU1NTU1NTV1dXU1NTU1NPU1NTU09PT09TU1NTU1dTU1NTV1dTU09PT09LS0tLS0tLS09PT09TU1dXV1dbW1dXV1dXV1tbW1tXV1dXV1NTU1NTT09PT09PT1NTU1NTU1NTU1NTU1NTU09PT09LS0tLT09PU1NTU1dXV1dTU1NTT09PT09PT0tLS0dHRmn5nYWJOVWpKSElLPzw6OTM3Njc3PTs+OT06Ojs4ODo7Ozg4Ojs7PD46PT09Ojw/PD0/QkA/Q0RDRD5APT08QENEQ0JEQkQ+REhJSUtMttfT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3MzMzMzMzMzMzMzMzNzc3NzczMzMzMzMzMzMzMzc3Nzc3Ozs7Pz8/Q0NDQ0NHS0tLT09PT09PT1NTU1NTU1NTU1NTU1NTV1dXV1NTU1NPT1NTU1NTU1NTU1NTU1dXV1NXV1dXV1NTU09PT09PS0tLT09PT09PU1NXV1dbW1tXV1dbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1NTU1NTU1NXU1NTU1NTT09PT09PT09PU1NTU1dXV1dXV1dTU1NTU09PT09PS0tLR0p+DaV9kU1hsSEhIS0A9Nzg0NzY6Oj87RDw8OTw8OTg6OTo6Ojs8Ojo7OT49Pjk9QDs/QUFCP0JCQUM9Pz8+PEBCRUNDQkBBO0ZJR01MSbLY09TU1NTU1NXV1dXV1dXV1dXW1tbW1tbV1dXW1svLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzM3Nzc3Nzc3Nzc3Ozc3NzczMzMzMzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc3Mzc3Nzs7Ozs7Pz8/P0NDQ0NHS0tLS09PT09PT09TU1NTU1NTU1NTU1NTV1NXV1dTU1NTU1NTU1NTU1NTV1NTU1dXV1dXV1dXV1dTU1NTU1NPT09PT09PT09PU1NXV1dbW1tbW1tbW1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTV1NTU1NXV1dXU1NTU1NTT09PT09PT1NTU1dXV1dXV1dXU1NTU1NTT09PT09LS0tSjiGxfZlJWakdIR0lBPjM2Njo7PDhDPEJBPjxBPDg5Ojw6Ojw8PDk8PTo7PD09PD89QD9AQT9AQUBCPD4+PzxCQ0NDRkBBQT1ISklOTUeu2NPU1NTV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbMzMvLy8rKysvLy8vLy8vLy8vMzMzNzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzs7Ozs7Oz8/P0NDQ0NHR0dLS0tPT09PT09TU1NTU1NTU1NTU1NTU1NTV1dXV1dTU1NTU1NTU1NTU1dXV1dXU1dTU1NTU1NXU1NTU1NTU09PT09TU1NTU1NXV1dbW1tbW1tbW1tbW1tbX19bW1tXV1dXV1dXV1dXV1dTU1NTU1dXV1dXV1dXU1NTU1NTU09PT09PT1NTU1NXV1dXV1dXV1dXV1NTU1NPT09PT0tLWroprY2VSWGhMSkdJQjg0OTQ6Ozo5QDk/Q0VAPDw5OTk9Oj07PDw6PTw7OTw9Ozs/PUA9PT5AQD9CQT5APD05QERDQkFBQj48SEpLTU5IqNnU1NXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbWzMzQ0dDQ0NDQ0dHR0dHR0c3Ky8vLzMzMzMzMzMzMzM3Nzc3Nzc7Ozs3Nzc3Nzc/Pz8/Pz8/Pz8/Pz9DQ0dHR0dHR0dHR0dHS0tHV2djY2NnZ2dra2tvb29vZ2dnZ2dna2tra2tra2trZ2dnZ2dnZ2tra2trZ2drb29vb29vb2tvc29vb29zb29vb29vb29vb29vb2tra2tra2tra2trb3NzX1dXV1dXV1dXV1dXW1tbX1tbW1tbV1dXV1dXV1dXV1dTU1dXV1dXV1dXU1NTU1NTU1NTU09PU1NTU1NXV1dXW1dXV1dXV1dTU1NTT09PT09PS1bqKa2hoUlhlSUlMT0A5OTo0O0E8Nz05QUM+QD89ODo6Ozk9Oz4/Ojs8PDo7PDo7Pj1APT8/P0FAQUE/QTw8Oz5BRENBREA9PElJSk1ORqPa09TV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbW1szNloSGhoaGhoeHh4eHh4Ky4t3d3t7e3t7e3t7e3t3S0NDQ0NDQ0NDQ0NDQ0ci5ubm5ubm5ubm5ubq6t6WkpKSkpKSkpKSkpKSnhmBjY2NjY2NjY2NkZGRlhIuKioqKioqKioqKiomSmZiYmJiYmJiYmJiYmJeMi4qKioqKioqKioqKi4aBgoGBgYGBgYGBgYGBg4uKioqKioqKioqKiouHvebh4uLi4uLi4uLj4+Pi2NfX1tbW1tbW1tbV1dXV1dXV1dXV1dbW1dXV1dXV1dTU1NTU1NTU1NTV1dXV1dXW1dXV1dXV1dXV1NTU1NTT09PT09XDkXFrak5TYkxMVk48Ojo3Nz5DPjg+Oj8/QTw/QDc7Ojs7PTs+Pjo7PD48Oz07PT8+QDw/Pz1AQEBBPj88PjxAQUVCQkZAQD9HSEpLT0ae2tXV1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19fMzm5QU1NTU1NUVFRUVFNMoPPr6+rq6urq6urq6uvp1dLS0tLS0tLS0tLS0tTEqaqqqqqqqqqqqqqqq6aGhIWFhYWFhYWFhYWFik4MEhISEhISEhISEhIRE0pUU1NTU1NTU1NTU1NRYmxra2tra2tra2tra2tpVVNTU1NTU1NTU1NTU1RLQ0NEQ0NEQ0NERENDQ0ZTU1NTU1NTU1NTU1NTS6ry6+vr6+vr6+vr6+vr6dnX19fX1tbW1tbW1tbW1dXV1dXV1dbW1tbV1dXV1dXV1dXV1dTU1NTV1dXV1dXW1tXV1dXV1dXV1dXU1NTU1NTU1NPUy5h2bGlKTl9NUlVNPjw8NztAQz42Ojc+Pjs9Qj85PDk9Ozw6PD07PTs9Ozs9PD0+PT07QT08QUBBQT08Pzw7QEJDQURFPUFAQ0ZLS09GmNzV1dXV1dbW1tbW1tbW1tbW1tfX19fX19fX19fXzM5xVFhXV1dYWFhYWFhXUKHx6enp6enp6enq6unq6dXS0tLS0tLS0tLS0tLUxaqrq6urq6urq6urq6yoiIeHh4eHh4eHh4eHh41SEhgYGBgYGBgYGBgYFxpOWVdXV1dXV1dXV1dXVmVwb29vb29vb29vb29vbVlXV1dXV1dXV1dXV1dYUEdISEhISEhISEhISEdKV1dXV1dXV1dXV1dXV0+r8erq6urq6urq6urq6unZ19jX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dXV1dXV1dXU1NTU1NTU1NGcenFpSlRdT1JVTkQ+Pzs+QEA4Ojs4PDs7PD86Ozs4Ozk5Ozw7Ojw5Ozs8Ozo9PT0+PUE/Pj8/Pj08PT88PEFBQ0FERTw+QEVGSktNRpPc1dXV1tbW1tbW1tbW1tbW1tfX19fX19fX19fX183OeF5hYGBgYGFhYWFgYFqk7ufn5+fn5+fn5+fn5+bV0dLS0tLS0tLS0tLS08Wtrq6urq6urq6urq6vq46NjY2NjY2NjY2NjY2SXSInJycnJycoKCgoKCcpWmNiYWJhYmJiYmJiYmFveHd3d3d3d3d3d3d3d3VjYmJiYmJiYmJiYmJiYlxTVFRUVVVVVVVVVVVUVmBiYmJiYmJiYmJiYmJbr+/p6enp6enp6enp6enn2djY2NjY19fX19fX19fX19fX19bW1tfX19fW1tbW1tbV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbV1dXV1dXU1NTU1NTWo3txZElbYE5OVU9AQT89REI/Oz06OTs6PT07PDs6OTg5OTs8Ozw8Ojo7PDo7QD08PTxAQTxBQTs7PEA/PD1CP0RDQ0U8PkJERkpMTEWN3NXV1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjNzcfFxcXFxcXFxcXFxcXEy9DPz8/Pz8/Pz9DQ0NDQz87Ozs7Ozs/Ozs/Oz87NzMzMzMzMzMzMzMzMzMvJycrKysrKysrKysrKysfCw8PExMTExcXFxsbGxsvMy8zLzMzNzMzMzMzLzc7Ozs7Ozs7Ozs7Ozs7NzMzMzMzMzMzMzMvLy8zMy8vLy8vLzMzLy8zMzMvNzc3Nzc3Nzc3Nzc3NzdTY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NfX19fX19fX1tfX19fX19bW1tbW1tbW1tXV1dXV1dXV1dbV1dbW1tbW1tbW1tXV1dXV1dTU1NTU169/cF5GXmJQUVdOR0ZDQ0lBPz07PDo8OEBCPD04Ojo4OTg7Pzs8PDs7PDw8PD87PD46Pj44PkI8Pj1BPjw+QkBERUNAPD5APkNJSUtEh9zV1tbW1tbW1tbW1tbX19fX19fX19jY2NjY2NjYzs3Pz8/Pz8/Pz8/Pz9PPz87MzczP09LSzs3P0s7Ozs7Ozs7R1NTTz87S1M/OztPTz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0NDR0dHR0dHS09PU1NTU1dXV1tbW1tfW1tbX1tfX19fX19fX19bW19fX19fX1tfX19fX1tfX19fX19fX1tbW1tbW1tfX19fX19fX19fX2NjX2NjY2NjZ2dnZ2dnZ2dnY19jY2NjY2NjY2NnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjX19fX19jY19fX1tbW1tbW1tbW1tbW1tbW1dbW1dbW1tbW1tbW1tbW1tXV1dXV1NTV1di4gm9XSl9jUlFaS0hBQTxCPT07Oj4+PD4/PT0/Nzk6OTk3OD48PD47Ozw7PDs/PT0+OTs7OT0+P0A+QD07OkI/QkNCPz0+QD5CRUdKQoDc1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2M7Ozs7Ozs7Nzc3Nzsqfys3Nzc3QuYOEi8fTwJrLz87Ozs7RsIKDk83SqKDQz9GkodDOzs7Ozs7Ozs7Ozs7Oz8/Pz8/P0NDQ0NDQ0NDR0dHR0tLT09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbV1dXV1dbW1tbV1dXV1dXV1NTU1NXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NfX19fX1tbW1tbW1tbW1tbW1tXV1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXYwIBuVU9gY1dZW0xMQ0A9PTs9Ojw+Qj5CQ0A8Ojg5ODo6Ojc7Pz4/PDw7PDo5Pzw8PTg5PD9BPj09PUFAPTtBQkBCQz47QD9BQUlHSkF629bW1tbW1tbX19fX19fX19jY2NjY2NnZ2djY2dnOzs7Ozs7Ozs7OzdKpj63Rzs7Ozpu3tqSiwJOerNPOzs7PyZu6uJuwt56jp9avn6Gp0s7Ozs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0dHS0tLT09TU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dbW1tbW1tXV1dXV1dXU1dXV1dXV1dXW1tbW1tbW1tbW1tfX19fX19jX19fY2NjY2NjY2djY2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2dnY2NjZ2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV18h/b1pTYWVeXVxPSkQ9QD8+Ozc6Pjk/RD5BOTg3ODk7Ozw4OT89PTw9PD47OkE7OTs5OzxDQDw7PT5AQT49QkQ/QkM9PT8+Pz5ISUg/ddrW1tbX19fX19fX19fX2NjY2NjZ2dnZ2dnZ2dnZzs7Ozs7Ozs7Ozs/Inrym0tDQzsqgl36Cw6abr6fUz8/P0cOij3+JxZ6ak53AnpiVnMjQzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dLS0tPT09TU1dXV1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tbV1dXV1dXW1tbV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2djY2NjY2NnZ2dnZ2dnY2NjY2NfX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dbV1dXV1dfNiHNdWGloXl9gT0lGOkFAPj88PDo2P0JAQzo2NDc6Ozo8Ojk+PD49PTs/PTxBPjw8Ojw8PTw6PEA9QEI+PkFCPUNDPT0+Oz9BRUtIQHDZ1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2c/Pz8/Pz87Ozs7SrKWnqdXAvNLHnY+ey9PJipmq1M/Pz9G/noqo076YoZy0mJyinbCy08/Pz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0dHS0tLS09PT1NTU1dXV1dXV1dbW1tbW1dbW1tbW1tbV1tbW1tbW1tbW1dXV1dXV1dXW1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnY2NjY19fX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0JB1W1tqaWFeXVNOSTxDQEE+QD46OEZBP0M6NzQ5Ojo5Ozs4Oz0/Pj49QT08P0A9Pjw8PDw8Oj1AQD8/PT5CQD9AQkA8QD0+QUVLRz9r19fX19fX19fX2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnPz8/Pz8/Pz8/QzJ2Nl6zQmpfKxZ6ynpbN1q2ZqtTPz8/RuqStnKG0mZatuYaelq+zqtXQ0M/Pz8/Pz8/Pz8/Pz8/P0NDQ0dHS0tLT09PT1NTU1NXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX19fX19fY19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tKUcl5ea2tqZV1PTEc/RENDQDo9OzxCPD49OTY0Ojk5Ojo5Nzs/QDs8PUA8PEE+PD07PTw/PDo8Q0A+PTs9QD5CPkBBPkA9QD9GSUQ/ZtXX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2traz8/Pz8/Pz8/P07GigJuvyaCjv8qcpYynrdiqmarUz8/P0cCgnpOpkJuBoJZ4m4Sdk6TV0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1NXV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dbW1tXW1tbW1tbV1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbSk3BgXnBoZmVaUUhHQkVDQEA3Ojo8Pjo8OTc2NTk6Njo8Ozc8QEA8Ojo9Oj0/Pj08OUA8PDo6OT9APj08PUBBQz9APz5BOz9ARkpCP2LS2NfX2NjY2NjY2NjY2dnZ2dnZ2tra29vb29vb28/Pz8/Pz8/P0M6fkGyclteqo9PSrqa1mJ/Vqpmq1M/Q0NDSprCun4CfqIiceZ+phZmk1dHR0NDQ0dHQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1dXV1dbW1tbX19bW1tbW1tbW1tbX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfW1tfX19jY2NfX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX1tbW1tbW1tbW1tbW1tbX19fX19fW1tbW1tbX0pNuYFxxZGdkWlVKQENGQ0FCODs/PD07PDw4NTU4OTY4Ozo5PDo+Pzw9PTk8Pz49Ojo+OTw6Ojg+Pzw9PTw+QEFDQT48PDpCRERKRkJd0NnX19jY2NjY2NjY2dnZ2dna2trb29vb29vb29vPz8/Pz8/Pz9G9n8O31pfA09HQ0srSzZeb1KqZq9XRz9DQ0cnXxJyCuK+mnIq9raaYr9bR0dHR0dHR0dHR0NDR0dHR0dHR0tLT09PU1NTV1dXV1tbW1tfX19fX19bW1tbW1tfX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19fY2NjY2NjY2NjY2NjY2djZ2dnZ2dnZ2dnZ2dnZ2drZ2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fX19fX19fW1tfX1tbX19fX19fX19fX19bW19GRbF1cb2doYl1PRkBISUdFQDw8Pj48PT48NzU2Ojk2OTs6Ojs4QD86PDw5PD49Ozs6Pzk/Ojs5PT49PTs7PTxAQ0I/Pz47Q0ZGR0hEWc3a2NjY2NjZ2dnZ2dnZ2dna2trb29vb29vb29vb0NDQz8/Pz8/Pz5V+e6WS1KKa08ySl6ObodirmavV0pem1cWNnqCfmaeXl52lp5aYm7vV0dHR0dHR0dHR0dHR0dHR0tLS0tLS09PU1NTV1dXV1tbW19fX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tbX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2tnZ2dnZ2dnZ2djY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX1tfPjGRWXnBrXGBgTkVITUlJT0M+OkI9PUBCOzU0Nzw6Nzo7Ojo7OT09OTo6OT0+Pz07OT47PDo8Ozk+PD47PD0+QENCPz5BPEFDR0ZGRVXJ29jY2NnZ2dnZ2dnZ2dra2tvb29vb29zc3Nzc3NDQ0NDQ0M/Pz9DR1aeZrcmjqL7KnbGdo7XZqZup2LirocnBoa2hoMGiq6Sb0J+rpJzR09LS0tLS0tLS0tLR0dHS0tLT0tPT09PU1NTV1dbW1tbX19fX19fX19fX19fX19fX19fX19bW1tbW1tfX19fX19fW1tbW1tbW1tbX19fW1tbW1tbW1tbX19fX2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2djY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fX19fX19fX19fY2NfX19fX19fYzYZdV2JvZE9dVEtIRlNRS0xAPj1EPD9DRj01NTc7OTY6Ozo8PTo7Pzo6OTg6PT0/Pjs/Oz49Ojs5Pjs9PD0+QURCQD8+PzxAQUVHRURSxdvY2dnZ2dnZ2dnZ2tra2tvb29vb3Nzc3Nzc3NzQ0NDQ0NDQ0NDQ0NO5gL3Tm5bP1LWLkZ/T1LyBu9TOlKDT1auNj6nYxZCNt9fCj4281dLS0tLS0tLS0tLS0tLS0tLT09PT09PU1NXV1dbW1tfX19fX19fY2NjY19fX19fX19fX19fX19fW1tbX19fX19fW1tbW1tbW1tbW19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2tnZ2tra2tra2tra29ra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2NfX2ct+WlVqaltMX01KTEpVTEZCPD0/R0ZIS0g9NjU3Ojk3OTo7Ojw9OT45OTo4Oz0+PkE+PTk8PDo9Pj46PTk5Oj9FQUA+PT8/QkBHRURFUMHc2dnZ2dnZ2dna2trb29vb29vb3Nzc3Nzc3dzc0NDQ0NDQ0NDQ0NDQ0cHR0crI0tDUxLjS0tHSwtLQ08fM0tHUwb7V0tTHw9bS1cXE1dLS0tLS09PT09PT09LS0tPT09PU1NTU1NXV1dbW1tfX19fX19fX2NjY2NjX19fX2NfX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29va2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2djY2NjX19fX19fY2NjY2NjY2NjY2NjY19rHd1xSZ2laTlpOTFBRV0VKPz89P0FFTExBPjc3NTs4ODk5Ojs8Pjw+ODo6OTs+P0A9Pj46NTo6Oz0/Ojs5Ojw+QkJAPz8/P0FCR0RDRE683dnZ2dnZ2dna2tvb29vb29vb3Nzc3Nzc3d3d3dDR0dDQ0NDQ0NDQ0NDS0NDR0dDQ0dPU0dHR0dPR0dHS0tHR0dTV0tLS1NXT09PU1NLS0tPT09PT09PT09PT09PT09PU1NTU1dXV1dbW1tfX19fX2NjY2NjY2NjY2NfX19jY19fX19fX19fX19fX19fX19fX1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tvb2tra2tra2trZ2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2trZ2tra29ra2trZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjbwXNYVWlrU0xSTlBSWVRGSTw+Qz9BQkVKPj43ODY5Nzc4OTk7Oz0/QDw9ODk7Ozs/Pjw8OTU6PT47OTk7PD8/P0JCQT1BPUBBQkZCQkJLtd7Z2dra2tra2tvb29vb29vc3Nzc3Nzd3d3d3d3R0dHR0dHR0dHR0dDQ0NDQ0NDQ0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tPT09PT09PT09PT09PT09TU1NPT1NTU1NTU1NXV1dXV1dXW1tbX19fX2NjY2NjY2NjY2NjY19fY2NjX19fX19fX19fX19fX19fX19fX19fW1tbX19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2NjY2NjY3LxvVFRsbExLUkpUUlVLRkQ6PkdEREFERjw/ODk6OTU5OTo3PD07PkA9PTc5Ojs5Pjs5OTY2Oj1AQT47PDk6Pj9DQT4/Qj0+QkNFQkFCSrDe2dra2tvb29vb29vb29vc3Nzc3Nzd3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0tLS0tLS0tLS0tLS0tLS0tPT09PT09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1tbW1tbW19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19fW1tbW1tfW19fX19jY2NjY2NjZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2dnZ2dnY2Ny2a1NbcGtLVVdSXFFXSEQ+PEJKRT1ISj89PDc4ODo1OTg5Njs+PD1APDw1OTk8Oj87OTk0ODw9PUFBPD47Ojw+QD89PkE9PUNGR0I/Qkmq39ra29vb29vb29vb3Nzc3Nzc3N3d3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHS0M/U0M7P0tLT0tLS0tLS0tLS0tPT09TU1NTU1NTU1NTU1NTU1NTU1NTU1NTV1dXV1dXV1dbW1tbW19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19jY2NfX19fX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dndsGRTYXJfT1pUV19RUkdCPUVJTEFBTEQ/Pzs6ODg5Mzg2ODY5Pj0+Pz06Njo7Pjs9PTo5Njg6PTtAQDxAPz0/P0I+PD48PEJFR0lCPkNJpODa29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3t7S0tLS0tLS0tLS0dHR0dHR0dPT0bm7zLqbnLrQyNPT0tLS09PT09PT09PU1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2NjZ2dra2tra2tra2tra2tra2tra2tra2tra29va2tra29va2tvb2tra2tra2tra2tra2trb29vb29va2tra2tra2tra2tra2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ3qpfVWBuW1VZUVpeT0xHQ0ZNSUZEREo7QUE7PDg4NjQ4Njk4Nzw/QT89Ojc8Pz48Pz87OjY4OD09QEE9QD5BQD1AOjs6Pj1BRUdJQkBDR57h29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e0tLS0tLS0tLS0tLS0tLS0tO+wMqaoKKViJGeqpOpz9TT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fY2NjY2NnZ2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dna2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2tvb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2d6iXFVeblheXU5aUFROQ0NMSUlJRkpEPEJBPDs4NzY3OTc3OTk9P0E/PDo5QD88PkI/Ojg3NzY9Pz9APUBBPz88PTs7OD48P0VJSEE/Q0aX4dvb29zc3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3tPT09PT0tLS0tLS0tLS0tTIlZyum5m1iX2TjIKBhMTV09PT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tvb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dndmlpYYW5ZYVdPV01QRUJETElNS0ZJRT5CRDk4ODY3OTc1Njk4PT1BPjo4OT4+PD9APzw1Njc2PD4/PjtAQEA/Pj4/Pjs/PkFCRkdCQENIkeLb29zc3Nzc3d3d3d3d3d3d3d7e3t7e3t7f39/U09PT09PT09PT09LS0tLTz6h+kayPko6MhoCIiYSQo8rU09PT09PU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY19jY2NjY2NjY2NjY2NjX19fX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2tra29vb29ra2tra2tra2tna3JJaWWNuWlpSVV5QTDxAR05IUklIRT47SEY4OTc1Nzg3NTg5ODs+Pj07ODlBPj1AP0E+NzU5Njs+QUI/P0BAQkI/Pj8+QUBEQUZIQj9FSozi3Nzc3Nzc3d3d3d3d3d3e3t7e3t7f39/f39/f1NTU09PT09PT09PT09PWtaWaiIuQhYCFi4iBg4qLf4bC1tTU1NTU1NTV1dXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2dnZ2dna2dra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29ra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb2tra29uIWltnalxYTFpfVkg6TEhMSkpDRUZDQExINzo3Njc4ODU4Nzg5PDw7Ozk4QD89Pj8/PDY3PDQ3P0JCQUBAPz8/QT09P0A+QEBGRT09REuI4tzc3Nzd3d3d3d7e3t7e3t7e3t/f39/f39/f39TU1NTU1NPT09PT09PUxZKCg4WGfYGCfXx5foGCg36k29bU1NTU1NTV1dXV1dXV1tbV1tbW1tbW1tfX19fX19fX19fX19fX19jY2NjY2NjZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vc3Nzc3Nvb29vb29vb29vb29vb2tra2tra29vb29zb29zb29vb29vb29vb29vb29vb29va2tvb29vb29vb29vb29vb29vb2tvZgFpebWhaU0ldW1hKRE1ISlNMR0ZBQD9KQjg7NjY5OTc1ODY4Ozo7Ojw5OD09O0A9Ozo2NTw3Oz1CQEFBPD49QEE9PEA/Pz5CREU+PERLg+Lc3d3d3d3d3t7e3t7e3t7f39/f39/f39/f39/V1dTU1NTU1NPT09PT2LKEkKh9g3l2hIh/e3d5gn5+i67A1dTU1NXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dna2trZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2tra2tra2trb2tra2tvb29vb29vb29vc3Nzc3Nzc29vb29vb29vb29vb29va2trb29vb29zc3Nzc3Nvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc1nlcWmxmWFJPYFFSQUhHSkZYTEZAQENDSz87Ozc4ODc2NTc2ODo5PDw6PTs/PTs9Pjw7ODg8OT0/QkFCQzw8P0FCPj1BQkNCREVDQDtDTH3h3d3d3d3e3t7e3t7e39/f39/f39/f39/g4ODg1dXV1NXU1NTU1NPU0ruen3WKeXuIgICChYGDcnOAhYOMrNfV1NXV1dXW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NnZ2dna2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra29vb29ra2trb3Nzc3Nzc29zc3Nzc3Nzc3Nzb29vb29vb29vb29rb29vb29vb29zc3Nzc3Nzc3Nvb29zc3Nzc3Nvb29vb29vb29vb29vc3Nzc3Nzc3Nvb29vb3dByXV9wZVdLUGNPS0JHQ0pIS0ZBPEE9SFBBOjo3Nzg3Njc4Nzw6OD09PD47QD88Pz07Ojs5Ojk8QEJAQkNAPUFAPz1AQkNDQUBAP0A7RU144N3d3d7e3t/f39/f39/f39/f3+Dg4ODg4ODg4NXV1dXV1dXV1NXU18h4i4V8goh6g4SBfoKCc2l0hYuGkJ3U1tXU1dbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tvb2tvb3Nzc3Nzc3Nvc3Nzc3Nzc3Nzc29zb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb297KalxjcWVST1heSz9HTElPS0VAPkFCP0lPPjk6NzY7NzY6Ozc7Ojg6PDw+Oz09Oz48Ojs4OTo4OUFCQkFAQDtAQj06PkFCQz8+PT4/PUZOdN/e3t7e3t7f39/f39/f4ODg4ODg4ODg4ODg4OHV1dXV1dXV1dXV1s6dhpl+f5OTin+CgXx9gnNxm4mAgoOJwNnat7TQ19bW1tbX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tra2tra2tra2tra29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NvfwGNaW21gVlBTU0pETEhNSEk8PkFEQ0ZORDw8OTc5OjY4Ozk3PDk4OTw9OzlAPjpBPzw3NTc7ODpAQUVBPz45PUI/Oz1CQkI6Pj07PT5GTnHe3t7e3t/f39/f39/g4ODg4ODg4ODg4OHh4eHh1tbW1tbW1tbV1tjLioCHhYOXjHh7e3lvfYF1a3ebdHZ7eInHxpiMrdjZ19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2drZ2dna2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tra29vb3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29zb29vb3Nzc3Nzc3Nzd3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3Nzc3Nzc4LdjV1lrYlJNVVFMSktGS0ZDQD5CQT9FTT4+PTg5OTo3OTo3NT03Nzo+PDs7Qjw5Pz05NjY4PTk6QEJGQD49PEBCREA9QD9DO0A9PD4/Rk9t3N/e3t/f3+Dg4ODg4ODg4ODg4OHh4eHh4eHh4dbW1tbW1tbW1tfVrYZ6d32rn3l4entzdH+Dfm9xe3l6c3t2k4qFgImkzdnY19fX2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tna2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29vb29vc3Nzc3N3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vc3Nzb3Nzc3Nzc3N3d3d3d3d3d3dzc3Nzc3Nzd3d3c3Nzc3Nzc3N3d3d3d3d3d3d3d3dzc3OGtYVtebGJSTVZMTUdLS0RGQkI7QT08RUxDQT44Ojk6Nzc5NjY6NTs+QDs9Oz89PD89Ojk5Ojw5PEVDRkA/PkBDQkQ9OT0/QT1CPz1APkdPadvf3t/f3+Dg4ODg4ODh4eHh4eHh4eHh4eHi4uLW1tbW1tbW1tfQmH+Qh4N9eoN2e3Vzenl6kKqmd3JyfoeHh4CAfoKEhJHJzNnX19jY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra29va2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2djY2NnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vb3Nzc3N3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzb29vb3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3dzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3NzhpV9UYm1iUE9TSUhHRkpJSUJBPkJCPEVFREA+ODo4Ozc3Ojc4ODY+Pz07PDk9PDo+PTs6Njc7NjpEQUY+Pz8/PkNBPzs9PT47REM/PjxIT2fZ4N/f3+Dg4ODg4eHh4eHh4eHh4eLi4uLi4uLi1tbW1tbW19jYyH52doN+fnR2eIaCenl1d5yhu6GEgoCAfoeKinx/gYaMnKjO2NjY2NjY2NjY2djY2NjZ2djY2NjY2dnZ2dra2tra2trb29rb29rb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3d3d3d3c35pbT2drXFBRUElDT0pLR0xHSkJAP0FHREBBPDg8ODg1ODk3Njc3QEA/Ozw5Pj04PTw8Ojc4PTk/RENGPkE/QkBDPzw6Pj0/PkVEPz07S1Fj1+Hf4ODg4ODh4eHh4eHh4uLi4uLi4uLi4uLj49bW1tbW19XB3LRueHJze3B6eXaFiIR7eH2AgZiljH98fnuRhZaLhoGDgY6Rvd3Z2NjY2NjZ2dnZ2dnZ2dnZ2dnY2dnZ2dna2tra2trb29va2tva2tra2trb29ra2tra2tnZ2dnZ2dnZ2dnZ2dna2trZ2dnZ2dra2tra2tnZ2dnZ2dna2tra2tra2tra2tra2tra2trb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t3d3d6NWFdobllQUUtISlNJTUhNSUtBQz9DRkJBRDo6PDg2NDg4NzY2Nj8+Pjo8OTw7Oj09PDw4Ozw7RERERT4/PkI+Qj84PT8/Q0NCQEE+O0xUY9Xh3+Dg4OHh4eHh4eLi4uLi4uLi4uLi4uPj4+PW1tbW1teslLZ6eHJvd5V7dHuLgHh1bn6Fg3t/hYhyfH2bnI6JioJ+g32Hk5rH1NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2trb29vb29vb29vb2tra2tra2tra2tra2tnZ2dnZ2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2trb2tra2tra2tra2trb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d7Zf1lgaGxcUUtHR09LTk5PTURGQkg/Q0hEREA6Ozs4NzU3Nzc4NThAPkA7PDk8Ozw+Ojk7OTk7OUZERUI8QD4/PEBDOz5AP0A/Qj8+OjtKVWPV4eDg4eHh4eHi4uLi4uLi4uLi4uPj4+Pj4+Pj1tbX19vKhYR3cXJubniVhHt4hH95dnB4c3eLkY6CdnN9ioaId3d1d4ODfIiIk8Pb2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2trb2tvb29vb29vb29vb29rb2tra2tra2tra2tra2tnZ2dnZ2dna2tra2tra2tra2trb2tra2tra2tra2tra2trb29vb29ra2trb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f0nVZaGlqVk5KSE1OR01EUElGSD9FPUZMREM+Ozs8OTc3OTY2OTU4Pj4/PTs8QDs9PDo3Ozc5OThHREVCPUE9Qj8+QDw/QUE/QEJAPjs8S1Ri1OLg4eHh4eLi4uLi4uLi4+Pj4+Pj4+Pj4+Pj49fX19fEknuJf29sbnV2foSBg4qGfnVybWVtiIaKjoR7c4OHint4e4OPj4GEioqxztrZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29zc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tvb2tvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3dzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f3t7e4clsW2pqalNOR0dOT0VIRk1JSUA7RD5ISUA9PDo6Ojg2ODo3Nzk0OD08PT07ODw8PDw4Njc4OTo6RUJFQT9APEI/Q0M+PkNEQUBAP0A8PUtRYdPj4OHh4uLi4uLi4uPj4+Pj4+Pj4+Pj4+Pj5OTX19fZqXaFfnx3bHB3eXh8jH2KhYB3anN0d3p9bot7fnl6foR/gIGDfnh8foeGlrbT2tnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra29ra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/e3uO9amFpa2lRTkZNTEtKWE1OR0FAQE9BQz9AOzw4OTk5Njg2NjY4NDs+PD07OTY6Ojk6OTU4OTg5OkJERj8+Pj5AQEBCPzxBQD88Pj9BOT5KT17S4+Hh4eLi4uLi4+Pj4+Pj4+Pj4+Pj4+Tk5OTk19fX2sqKhIB5c29tcXN1d4CUeHaAfHWHhXd1cnWgmXp7d3Z5doR0bWxue3iAmouTu9za2tra2tra2trb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc29vb29vb2tra2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f397js2lpbmloUFBPTExPUk9LU0Y/RURERD48PDg7ODc5OTU2ODY2NzM6Pjs+PTc6Pjk5OTk2Ojo4NzxDRUc/Pzs/PkA9PkE9Oz0+OUFAQDhBTlFc0OTh4eLi4uLj4+Pj4+Pj4+Pj4+Pk5OTk5OTk5NjY2NjauY6AenZ1bmpveHCBfWt0cnZ3hIV5h4d5lY55eXp1d3pza298gHx2fYh8gLLe2tra2tvb29vb29vb29vc3Nzc3Nzc3Nzc3dzc3Nzc3Nzc3Nzb29vb29rb29vb29ra2tra2tra2tra29va29vb29vb29vb29zc3Nzb29vb29vb29vb29vc3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3t7e3t7e3d7e3t3d3t7e3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/f39/f4qpqa2hrZFNQT0ZQVFJOSFJLPkREQ0I7Ozk6Ojg2Nzg1NjY4ODg0Oz88Pzw5PDw3Ozo6Nzo6Nzo9Q0JDPUE+Pzw5PT5BQDs8PDtFQD47Q05TXNDk4eLi4uLj4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTY2NjZ1p5vdntveHh2cG50d3BwdHBzb36Jc3qGhY2EenNtcoB6hn1vg5OBdnx9g4a13drb29vc29vc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29ra2tra2tvb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4N/f3+KgbWhma2ZVVlJHUFFOS0xMRUJIRUc9OD08Ojo3Nzg2Nzc2NTY3NDg+PD09Ojg6OD46Ozc4Nzc6Oj5DRDtDQj49OD1AQUM/Pjw+RTw+PUJNUF/S4+Hi4uLj4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk2NjY3MB2doCCfnp4eHBsdXlya399bHNvdGdoaYB/aWh4c2d+iYl4cIKGe3d9foWKvd3b3Nzc3Nzc3Nzc3Nzc3Nzc3d3c3Nzc3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODflGttZm5mU1NJUFlUTEhGTkZGRUJGPTs+PDs5Nzc4NTc5NjQ1NzU4PDs9Pjo6OztAOTs7ODc6OTlAQkE8QUE/Pzk/QEJFQ0FAQEM7Oz1ES01g1uTi4uLi4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk5NnZ2tmYc3uqhJaCcnR1dn14aGx8d2h4d25rcHR5gIN2dHyBhIJ9c3CAin94gn95g8je3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f4N/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh24tubWdzY1lRTVVbV0hDSUZOS0dCRD8/Qjo7OjY2NzU2NzY0ODc2Ozw7Pj86PDk8Qjg3OTo6Ojk6QUFCQUJDQEE+PT9CQ0NEQUJGOTg9REpOYtjk4uLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXZ2drcqHGCtXiRfnNsem6EgXaCfWtoan+DeHZ8dX2FhXRmcHl9d316gIqFe318foC03tzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3dzc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3Nzd3d3d3d3d3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e397e3t7e39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4ODg4ODg4tiFb3FrdWFWT1VVXE9ETUY+SkdKRUQ8P0I6PDk4Njg0NTY3NDc2NDk7Ozw7OD47PEE4ODo9OD04Oj09QEBAP0FCP0A+QENCQ0FBRTc2O0RMTmPa5OLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXl29ra3Z5sbnNxhY1ybXBuf391hH5rcnZ2enN4gXhzb3VwbWt2fHmFiIB/f392coODsd/c3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eDg4eHh4eHh4eHh4OLXhW1xb3ZeUldTWlpRSkhDQFFAQkQ8OT9BOjw5NzU3NDU2NjQ3NTY9PDo9PTk+OjxAODo6PDY7OTs+PUJCQjtBQkBDQEBEREM8PUA3OjxFS01l3OPi4uPj4+Pj5OTk5OTk5OTk5OTk5OXl5eXl5dPOxsB+cWxveHt2b3VuanNzbZKGeG50dG5vdIZ/b2twboJ0bXZyfY2DdnF/d3mKgabf3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3dzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t/f3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi1oZucG1xYFJZUFdfWUpMTElSP0Q9OTtCRjs6OTc0NTY1NzU0NjY2Pj07Pz45PTk7Pjg9Ozo0ODtAQENCQ0FCRkE/Q0BBQkREOz0+OTs8QkxNZODl4+Pk5OTj4+Tk5OTk5OTk5OTk5eXl5eXl5eW5t7Woc3JscHd6dHd4bXFydXd/hHRyc2xsa3F8bnBudGuBf3GAd32Eg355gHNygYqg2d3c3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh49WHcWxqbF5YWlVXYFZWUE9QTD1BOjs8RkE4Ojg3MzY1Njk2NTg1Nz89Oz8+OT04Ozw5PTs7NTo9Q0JCPENDREREQUE/PkJDQzw9Pjg5PENLS2PN0dnh1sjY4+Tk5OTk5OTk5OTk5eXl5eXl5eXltbW2q3J5cm59f3Z1d2hqaGlwb3Zta2tnZWZxdG15gG5teXd2iHhxa2podXV5dHV/wd/c3d3d3d3d3d3e3t7e3d3d3d7d3d3d3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHi4uHh4ePVhnFwY2lhV1NZV19MUk9STUtAPjg5O0E+ODc5NjQ3Njc6NjY2NDk+Pzo8Pzo/OTo6Nzo9PDk5PEFBPTtBQ0VDRkA+Pj5BRUQ+QEE3OD5GSEpesrW4wbm1u8jg5eXl5OTl5OXl5+fn5+fm5ebm5ra2tbWOfX5weoR1cnZnYmNlbGtyb2ZpbHZtd4Z9hXlsbHd4a3ZwfH14c3V5fHd2h7ng3d3d3d3d3d7e3t7e3t7d3t7e3t7d3d3d3d3d3t7e3t7d3t7e3t7e3t3d3d3d3d3d3d7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4eHj1Yd1bl5uY1pUU1hXS1NLSk1SR0E4Ozs+PDk4NzU2NTY2OTY4NjY5Pzw6PT07Pzo7Ozk8PDs5Oj4+Pjs8PUFEQkNBQEBBP0JDPDw9Nzs+REVKXrG1tLW2t7e2y9rJ3uXl3eDi3tXU1tPU4OPg39+2treuh3t/bnmNenJ1bWNobGxtaXR4enF5enqIh4N6aWh9cWRvcXyGgX55e318e4an2t7d3d3d3d7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4uHh49aGdmxhb19dV1lcWlJQSEpXTEVHPUA9Ozs9OTY0NjU1NTg2NzY3OD87OT09PDw5OTw6Pjw6OTg+Qjs7Pj5AREBDRUFAQD0/QDw9PTU5PEJHRl2xtbW2uLm5ubq9uMPT0r3BwcC6u7y6u8TMxb/Dt7e3hGl1gX1ndYd5Z3Vxa2t5eHB3fH15bWl3e3h3bml1j4FwbHl4d3d9gXuGgnmAoNze3d3d3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODh4OHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4ePXhXJrZ3RhW1hYX15TVVVRVUpMRj9JRDs5PTY2NDc3NTc4Nzc3ODk8PDo+PDg8Oj0+OTs8OTs5P0E8PT9DP0FARUJCQTw9Q0A6Pjw1NDlER0dasbW1tre5ubm5ubm3ubm4uLm5urq6urm5urm6u7e3uX9ucHN6b3B/eXNuc3Vsc3Z4cXFwb2tvcX6Bc2mHhIF9dHOHdW11hYmBgHJ2hafd3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uHj14lxa2xyW1dXXWBUUVVUUFJPSkNATUE9Ozk2NTM0NjQ2ODc3Nzk6Pjs8Pjs5PDo8PDk8PTw7PT0+PUNEREBDQkE/QD48PkE8OD06NjY6QkpIWLG1tLa2uLm5uLi5uLe3uLi5urq5ubi4uLi6uru3uKx7cnhxf3ZzfnBsbXpyZ29sbW50cHt3d3Jyd3pvhpJ2f3x8enZ5fH9zfYdyda3T393d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4eHh4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi49eHb2pxalVWV2FbT1FSUE5XSURESUo/Ojk6NzUzNDk1NzY2Nzg4Ojw7PD46PDo6PTw5PDw9Oz09PDs9REdEQ0E8PDw8Pj5AOzg8ODE1OkFGRVautbW1tre4uLm4uLi4uLe4ubq5uLi3t7i4ubq7t7mqcnB4d3x7e4J3aG5xam9qY2lyf21zcn54dHFsanaAeX2AgH91doB1a4qLgHaR1d/d3d7e39/f3t/f3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f4N/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLi4uPYhm1sdGVWUFxnWE1YU1JRWUVDS1BOOzk4ODc1NTM5NTY2NzY4Nzk+OT0+OTw5OTw7Njg5OTo8QEA9PkBGQEJCQDo+PEE9Pzs7OzYxNjxCR0RQqLa1tba2tre4t7i4uLi4uLm6ubi4t7e3t7e5ure2tIlyd3h9iXxwem99c2hqbGdnbHRscXd0cWx2c3Fxd3FyfHl4g3Z7d2mLkYp9kM7f3d7e3tvY2drZ297f39/e3+De39/f3Nvc3N3e3uDg3+Dg4ODf3t7e39jS397f397e3t/f3t7f3t/f3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLi4eLi4uLi4uLi4uLi4uLj4+Lj4+Li4uPj4+Pi4uLi4+Lk14NoZ3VkVlVkZVdKWllXW1Q9RU1LSD04NzU3NjQzOTQ0Nzc1Njc5PTo9Pjw9PDk7PDk5Oj45PD4/PkFBQ0FFRUQ+OzxBPjw5PDs3Mzc+REhFSqG2tbW1tbW2tre4uLi4t7e4uLi3tra2tra3uLm2traLfXpsbHp/cGx5dm5qaGdlcXp4b2lvb3B1c21zd4Fnb32CgYNyf3lqcHJ6f6ng393Zy8a/vL2/vsLN0tDW3tnc4NfQzcPCw8PH1dfT2dzX1NjX0MfExce9vM/Kz87Y3djO3N3c2t3T0dze39/e397e3t7e4N/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eLi4uLi4uLf4uPi4eLg4d7W29/Sw8rJx9Hb3OLk4eHg2dre1sbExcTN2trf5OHi4trX3st9aWZxYVleZWFNTFRLUlpMO0hNSEZBPTc2NjUzNDY2NDg3NjU2OTw7Pj46Pjk5PDk3OTs7Oj49PEBAQ0RCR0ZCQT08Q0A9OTw7Nzc3P0RGRkaZtrS1tbW2tra4uLi4uLi3uLi3s7W2t7a3t7i5tba3opdxb29waW50dnFmZWNrbmdvcm1mZ2tygWVvdnyAeGRzj39zaHFyaWVlbm+w39HFv7u5ubm5ubq6uru6vc3Gw8e/urq6uru7u8HCvcHFvby/vry7urq5ubq6ubm6w8XDucDDwby/ube/z8/U3tjc3t/g3tLa4N/f4ODg39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eDg4ODg4ODg4ODh4eHh4uLi4eDh4uLi4uHa2t3RwsPCu8XT1uDdydPDrrnAsaqrq6uwtLbJ0sXRxLG4v7Srq6usr7S0vMzE1c60tLureGxtbWBdYl9ZS1NVVFFQREBRTUhEPzo3ODU3MzE1NjQ5ODQ2Njo8Oz08ODw5Njo6ODg5NzU8PDw/QEFAQkRDQkE8PkI/Pz09PTc1OD5DRUNAj7a0tLW1t7i4uLi4uLm5uLe1sautr7Oxs7OztLS0tqaei2tue3ZxeXhnY2hfcXdha25vaG99b25ja2lseHdsa4Z+bHB6dm1scG95sca8uru7urm5ubq6urq6urq6urq6urq6urq7u7q7u7y7urq6ubq7u7q6urq6urq6ubi3t7i4t7e2tbW1tbi3u8e+w8XHzcS4wMnH0tzZ2d/e3uDf39/f4ODh4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh3Nji4uLi4eHh4OHg3tfGxtHQztTe3tPO0t/SuLi8sq2trKysrrG+ua63rKipqamqq6urqqqqq6ysuKyqqqqrq6urra6urq6urryzrayrpHlub21fXl1dVE1SU1xUSkE/UElIPjg5NjgzNzMwNTczNzg1NzY2Ojw/PDg5Ozo6Ojg5OjY1OTs8Pj9EP0NFQkNCP0BAQT9APjw3ODc6QUVEP4W4tLS1tbe4uLm5uLi3t7SurKuqqq2urq6vsLGzs7WjcG5ucm1wg311aWFlaGZkY2Rxc21td25naW1tZXBzb29zcXN8h4F6dX11n7u6uru7urq5ubm6urq6urq6ubq6urq5uLm5ubm6urq6u7q5ubm5ubq6ubm6ubm4uLi3t7e4uLe3t7a2tbW2tra1tbW1tba1t7e3t7rBvrzGycrb3+Dg3tvd3d7h4tDW4uHg4ODg4ODg4ODg4ODg4OHg4OHi0768zNjd3OLg0dnbxL23sLCxsa+zu7uzsLS9s66urq2tra2sq6qqqqmpqKmpqampqqurqqqqqamoqampqampqaqqqqytrq6urq6urq6sraR4aWJxZmFZWlZRUk5cU0Y9QlJEQTc8OzY5NTY1NDU2NTg3NTY1Nzg7Pjw7OTk5Ojg3Nzk3Njg8Oz47RD8/Q0BBREE+P0M9Pjw+Ojo3Nz9DRj54srCztLW2t7i3trKurq2sq6uqqaqtraysrq+xs7S1t4xucnRqaIB5ZmpmZWxdaG5waGxxYmNmcoJ+dmhobGpueoaBhXx4cXF5gK+6ubq6urm5uLm5ubm5ubm5ubm5ubm4uLe3t7e3uLm5ubm5uLe3t7i5ubi4uLi3t7a2tre3t7e3tra2trW0tLW1tbW2trW1tre3t7e3t7e3tre4v8bP0MS+v8DE19e8ydra4OHg4ODh4eDg4ODh4eDb3t7Uzby3tre6wMDJxLfIvrKwsLCwr7Cvrq6ur7Cwr66urq6uraytrKurq6qpqampqampqampqKmpqKmpqampqKmpqKmpqqqrraytra2ur66trK2heWpkbWdiXFhRUFFLVEpCOklRP0E3PDk0OjU2NTQ1NTY4ODY4Njs6OTw9PTs6ODY2ODg6ODY3Pj09PT5BQUVCQkNBQUBBOj09Pz05Ojc9QUc8bKqmqKutsLGwrqupqKqrq6mpqamrrKytra2usLO0tbilgIdvaWdzdGZrcG1qZGxvcm5rbWNrcHyJhG5qbHx4Y3uKfnNqc25rcY+7ubm5ubm5ubi4ubm5ubm5ubq5uLi3t7e3t7e3t7i5ubi4uLe2tra3t7e3t7a2t7a2tra3tra2tbW1tba1tLS0tbW1tra2tra3t7e3t7i4uLe2t7a2uLm4uLe3uL6+uLq9vcfb4OHg2Nnd4eHg3dfKwcPCurm5uLe4uLi3tbS0tLKysbGxsLCvr6+vr6+vr6+vr66ura2srKyrq6yqqqmoqKmppqepqaehpaipqamoop+hoZyip6inqausrK2ur7Cwrq2unXhwbGphY2BZUU1RTFJGQzlNUEU+ODs3Mjc5Njc0NDM1ODg3OTc7OTo9PTw6Ojk3NDo5ODY1OD8/QEI9RENDQ0FDQEJBQDtAP0A/PDw6O0NIPWOopaWlpqioqKenp6ipqqmoqKipqqqsra6wsLCztLW1taWYdn5xZmt4cW9tZmVsaGNsZ2ZpaX11bWlvfXZ5hWZod294b3Fvcninu7m5ubm5ubm4uLm6ubm5ubm5ubi3t7W1tba2tre3t7e3t7a2tbW2tre2tbW1tra3t7e2tbS0tLS0tLS1tLS0tLW1tba2tra2t7e3t7e3t7a2tre2tre3uLe2t7i4t7i4uLi4wMXTyry8w83PyMC9urm5ubq6ubi4uLi4t7W0tLSzs7KysrGwr6+vr66urq+vr6+uraysrKurrKysq6ehoJ6gn5udoaGdlpmkpKaon5mZmZmanZ+gn56fpKqtrq+ura2srJl1cGlrY2FeXVVOU0tSREQ4TktHQTo4NTI2OTY1NDczNzc3ODk3OTo7PT0+ODg4NzU6OTk1OD9AQEFEPkZBQkNAQkNCQT88QEJCQD0+OjpERj5cpqWmpqampqanqKenqKioqKenqaurrKytra2ttLS0tbekc311bnONf3JmanFjaW1jaGZobG51aV9jZ3VzdnpuZ3Bwcn56cYihu7m5ubm6urq6urm2s7a1uLm2trW1tra1tbW1tbW3tra3tra2tbW2tbW1tbS0tLa2t7e3tbS0s7O0tLW1tLS0tbW1tra2tra2t7e3uLe3tra2trW2tbW2tra2tra2tra3tra3uLi3uri4uLi3uLi5ubm5urq6urm4t7e3t7W1tLS0s7OysrKxsbCwr66urq6urq+vra2srKuppaSmpqScmZubmpmampmXl5eXl5aZm5iZmJmZm52en5+dnJ6gpKWko6OioqKQdG5jcGFeXltUU1RIVEo/PFFCRkM7ODYzNzo1NTQ4Mzg5OTc4OTc7OTs9Ozc6NzU2OTk4NTg+Pz9ART5CPz9DPzxBQUI/PT9EQT8+PTk9Q0Y/VaSlpqanqKeoqamop6ioqKioqKiqrKuqqaipq7W1tba5o3eKcXKHhnd0cGh5a2JjYWVsaW5zal9jZWNjZWprYmRqbHaXjX6ovbm3tre5u7u6uLWxrKurqq6wrKyrq62tq6uvsLGvr7CytbW2t7W1trW1tbW1tbW2trSvr7O0tLSvra6vsrW0tbW1tbW2t7e3t7e3t7e3t7e3t7Owsra1tLa2tre3tra2tbW1tra3t7e5uLi4t7e3uLi4ubq6urq5uLi3t7e1tbS0tLS0tLS0s7OysbCvr6+vr66vr62oo6KgnJqampqZmZqbm5qampqbmpmZmZiXl5aYmZmZmpycnZ+foJ+goKChoaCgoJ+fi3RuaXRdYGZeUlRLRFRJPUVTSEVCOzo0NDY5NDQ1NzM4ODg3ODk5Ojs7Pz04OjkzNTg5NjM5PT5AP0A6QEJCQkA/QEJCPz0+QUFCPz06PkVDQFGjpqWlp6inqauqqKaoqKipp6ioqKinp6ioqaq1tbe3t7KZtH99kIx1Z2lqbGZjYGNoZW94cGlicXx5cGpmZmRma3NqhYystrKwra2ttLeysLCtrKuqqaiop6ipqampqKinqKipqaeoqqurra2sqqytraysrq6traunpaSnqqyopKOkpamwsbGztbW2t7i3t7W1tre4t7e3t7Kppaasq6ivtLa1s7W3t7a1tbW2tra3t7e3t7a2t7e3t7m6urq5uLi3t7Wxs7S0tLKxsK6sq6yurrCxsK2rqqmqqKijnJqZmJmYmJiYmZmZmZmZmpqZm5ubnJybmZeYmpqcnJydnJ2foKGhoqKioKGgoKCfnop1amtuWVxhVktPREdVRz5PV0hEPTw4MzQ0ODQ1NDgyODk4ODk6Ojw5OUA8Njk6MzY3OTE0PD8/QEBBOkNGRUJBREJDQTo7P0FCQz9APUBEQ0BPo6empaemqKqqqqakpqenqKioqKimpqaoq6uttba3t7e4rbJ1cHuDdmBiaWtiZWZhZGdmfYh5bHKAfXFvcXhjbW5xZo+srKurq6ysra6urK2trKyqp6WmpaWlpqioqKiopaeoqKioqKeoqampp6Wko6KioqOioKKioaKhoKChoaKjpKOjpaWlqLC0s7OzsKuqqaqztLa3trGopaOioaGipKiqqairs7Sxrq6xs7W2tra3uLi3t7e3t7e3t7a2uLe0sa6ppqerrKmnpqWkpKSkpKWnqaajoJ+enZycm5uampmZmJeXmZmZmJiZmpqampqampqbm5mYmpydnZ2dnZucoKGgoaOjoqCgoKCfnp2FdGtsaFdYU0pHTUVITUdAU1dGRz09OTM2Mzc0NTU3Mzg6Ojo6OTw9OjpBPDY9ODM3ODgzNztAPz9AQDpCRUNAQkRDQT87PEBDQkNBQDxBQ0A9TqKnpqanp6mqq6mkpaWlpaaoqKippqanqKmpqrW2tre3t7izc2h7c2JnamtpaWJhZGloXV1tfHJma3J/fHR8bm1zc36gqamrq6uqq62trKusq6mpqKWjpKampqWmp6eqqaamp6enqKinp6iop6WjpKKhoaGhn56en5+fn56foKGho6Wko6OkpKSmp6enpqWkpaampqeqraumpKKhoaChpKWlpaenpaeoqKalpaivtLa3trW1tra1tbOwrKupqa6rqKWlpqampaSkpaWlpqWkpKSkpaKhoaGgnp2bm5ucm5qamZiXmJiYmJiZmpmZmZmYmZmZmZqZmZydnJycnJybnJ+fn6ChoaKgoKCfnZ2cgHNrbmReU0pITUZETEtFRFFTQ0c9PDgzNjI4NDY0NjQ4OTg6Ozk7Pjw5PTs5PTczNTk2NTY8QD0/QD88P0JDPkJCQj89Pj5CQ0FFQD86PkVAO0+jpqWkpqeoqaelpKWlpKWnp6eoqKanp6alpqa1tba2trW2uYptcW1vfHxxZ2pmYGFsYFROW2hqbm9tgYJ9cWdxdn6aqKeoqqmpqqurrKqqqqimpaWkoqOlpqalpaWmqaqppqWjpKWmpqSjo6KioqKgoJ+fnp6cnJycnJ2dnJ2en6CioaKjo6KhoqKkpaSioqOjpKSjpKSko6Ggn6GipKanp6ipqaelpaSipKSlqK2wsKyrqqusqqmnpaWmpaWlpaalpqioqailpaWkpKSlpKOjpKOioaGhoqKgnp2cnJubm5qZmJiYmJmam5mXl5eWlpeXmJiZmpqcm5qampubm5ucnJ6goKGgnp6enpycm356bnJiXlNNSlBFRk5NQkBPRT5JOz01MzYzODM2Njc1Ojs4OTs5Oj49Ozo5OT03NjY5NjU2PkI+PkE/PT5DQT5DQ0BAO0BAQkJCRUA+Oz5FPzxQoKSjpKOjo6SkoqSlpaSlpqamp6empqalpqaltLW1tbS0tbiBaHx9ZXOCemxwdWFfY1ROT1FbaGxpbGxxbW5xbnScoqSnqKioqauqqqqqqaempaSjo6OjpKSlpqalp6ytqaShnp2eo6Shnp6foKCenJ2dnJycmpqam5ucnJubm5ydnp6foKChoJ+goaOioKGjpKSjoqSlpaWkop+go6SkpKapqainpaGdnJ+jpaipqainqKioqaempaWkpKSlpqampqampqenpaWko6Ojo6KioqGhoqKhoqOkop+enZ2cmpubmpqZmJeXmJaWlZSUlJWVl5iYmpubnJuampqam5ucm5ucnp+fnpucnJyam5p/fnF0YFtUTUdNSEZMSj8/TkM8QDs8NDM4Mzc0NzY3ODs9ODo6OTk7PTs7ODk9Nzc4OTU4OD9APT9BPjs9RD89REA/PzpAQUE/QUVAPjw8Qz88Tp2ioaKioKCipaSkpKWlpqenp6empqampaampbW1tbS0tLS3jHalsXdmc3Jvc2xjZGlYT1JRT09dgG1kYFptkZGSoqKjpaampqenqKiop6alpaSjoqGhoaKjpaempqesrKemoJ2cm6Ghnpuamp2cmZiam5qampmZmZubm5uampqampucnZ6goaCfnp+hoJ6foqOko6Omp6inqKWioKGhoaGkpaWlpKCcmZmbnqOmpqampqanpqempaOlpKWlpqiop6enpaWlpaWkpKOjo6KhoqKioqKhoaKjo6Kgn56enZybnJubmZaUlJSTk5OTk5SUlJWWl5qam5ubm5qZmZqanJ2dnZ2dnZuampqamZqXf3dvc11aTkhKTkdFRklERU5APD09PDQ1OzQ2NDY1Njc5Ozg5OTg5OTw7PDc6Ozc4ODg1ODg/Qj9BQTw+P0A8PEJAQT49QT4/Pz1CQUA6OkA8PE+doqGfoJ+dn6OkpKSlpqeoqKenp6ampqampqW1tLS0tLS0tbSXtqd1Znh2Y2xjY2VjW1JTU1JNXqCMeFhodpajnp6hoaOjo6OjpKSlpqalpKSioaGko6OjoqOlpqWmpqenpp+bmpuioJmWlpWam5mXl5iYmpqYmJqampqbm5qZmZmenZ2goqOjo6KkpKWinqGhoaKjpaampaSjoaCgn5+hoZ+goJ2amJeZmpygpKOjpKWmp6alpaOjpKSkpKWnp6ampqampaWmpKOjo6SjoqKjpKGfoKGhoKGgoaCfn56dnZyamJeVk5KSkpKSkpOTkpOUlZaZmpqbm5qampqbnZ6enp2cnJybm5qamZmZlH10bHReWk9IRUdGQkVORT9GOzo+Pzs0Njo2OTM2NDY4ODo4OTc4ODo8Ozw5Ozs6OjY3ODk5Pj9APjw9QD5AOjlAQT89QT8/QUE+QUE/Ojk9PjpQnaCfnZucnJufoqOlpaWlp6iop6ampqanpqantLS0tLOysrGwsK2rkHiGj36bmn93Yl1TUlFRTGKgootaiKCgn52YmZycnZ2eoaGgpKenpqWkoqGjp6alpaKipaampaanpqagm5mboaCXk5OSl5qcmpeXl5iampmampqam5qYmJmaoKCgoKGfoaKipKamop6gn5+goaOko6Khn56enpyanZuZmpqZmJeZnqChoaKioqKkpaWmpKSkpKKioqKkpaWlpaWlpaalpaOko6KioqGgoKGgnp+fn5+fnp+foJ+cm5qZl5WUlJSTkZCRkpKSkpKSk5SVl5iZmpmZmpqam5+fnp2cnJycmpmZmpiXl5F8cmdxXl1QRj9BRD9KT0JCRjhDRT4+OTg7Nzc0ODQ1OTo6Ozk3OTo8Ozo8PT48PDo2NzY5OD4/QT47Pz49PDg6PkFAQUE/P0FCQERBPjo4PkE8U5ycm5uampycnaGio6KjoqSmp6alpaampqSjo7KysK2rp6amp6alpqiln6iop6qnoXmEXFFST0xcnKCAYpmgnp2clZOVlpeZmp2dnqGmpqampKOioqanp6ajpaampaWmp6amop2cnqGfl5GRkJSXm52YlpaWmJuZmpqampqZl5iam6Ghn56fnpybnJ6goJ6dn56fn6Cio6SjoqCfnp2ZlpeXl5iYmZubnqKioqKioqGio6WlpKOio6SioaGhoqOkpKSko6SkpKSioqKhoqGgn5+gnp2enp2dnZ2dnp6em5mYl5WTk5SUk5KQj5GSkZKSkZKTlJaXl5iYmZqampyenZ2dnJubmpiYmpmXlZaNempmamBiTkY+P0A9SkVAQ0A7QEE8Ozs5Ojc2NTg0Njc4OT04ODs6Oz87Ojs8Ojk6Nzc2ODs7Oz08Ojo8PTw3Oz5DQkRDPz1BQ0FEQT88OkBCO1eZmJqamZmam5ucnp2foqKhoqSlpKSlpqSioJ6op6alpqWlpaemp6ampqakpaanqKehqXJOUU1KVJahenKanJyenJeVlJWWmJiXl5qeoqKhoqOkpKOjpaalpaanpqSlpqalpaOgoKGhn5mSkI+WmpmenJaXl5eZm5ycnJqamZeZm5uen52cnZyZmZqcnZydnp6fn5+hoaCgoaKgn56bl5WVlZeanZ6fn6GhoqKio6OhoaCgoJ2cnaGioqOkpKOioaSlpKOko6SjoqKioqKhoKGfn52cnZ2cnJ2dnJ2enpqXlpaVlJOTkpKSkpCRkpKSkpGSlJWWl5iYmJiam5ycnJycnJ2cm5mYmZiWlJWXi3hsY2RiZFFHQT1DO0tIRDo7Ozw+OTo6OTo3Mzc5NTo4ODg8OTg7OT09Ozo7Ojk8PDc2NDc/PDo9Ozw/Pjw7ODxBQ0FDQkI+P0NAQkFAOj9APztZmZiampqam5ubm5ydoKGhoaGhoqKioqKhn5+dpKWmpqenpaWmp6ampqWkpKalpKSkpaaGUFJQT0+PmHB6mpubnJ6cnJycm5ubmZiYm56dnp6foKOkoqGhoqKio6SkpaalpKOjoaGhnpyalZOUmJuam56amJiYmJqcnpyam5iWmZybnJycnJydmpqbnJ2dnp6dnp6fn52cnJyhoaCblpWVlZacoKGgn5+hoKKjoqOhnZuZlpaWlpicnqCip6ikoaCgoqOjoqKioKCgoJ+fn5+gnp2cm5ucnZydnJmanJuWk5KSkpKUk5KSkpKSkpOSkpKRkpSVlpeYmJiYmZqcm5qbm5ucnJqZmJiXlZWWl4d3ZGdoZGJNQ0U8RDlJSkU5Ojs9PTo6ODg6NjQ3OTU8OTY4OTc5PDs7PDo6PDs6PDw4Nzg3Pj07Pj46Qj86Ojo/QURCQ0FBQD9EQUFAPjpAPj06W5qYmZqbmpubm5uen6CgoaKioKCgn5+enp2dnKWkpaanpqWlpqakoqKio6Oko6Kjo6KnllRYVVJOZ21rgZ6am5udn6Cgn56enp6dnJ2dnJ6enp+goaCfn6CgoKGio6Ojo6OjoqGgnpuZmZiZmZmamZienpiYmZmam5qWlZeWlZicnJ2cm52dnpybnJ2cnZ6bmJqeoaGdm5udoKKhmpWVlpaZoKKgnZueoKGjop+em5eXlJKSlJeYmZ2goqenpaGgn56goaGioaCfnp2cnJubnJubmpqZmpydnJmXmZaVk5GQkJCPkZKSkpKSkZKTk5OTk5OTlJWWlpeXl5manJubnJucnJqamZeXlpaVlZSEcmZsYmRbREJMPT84RktCPEA+Pj05Ozk6PTg1ODg2Ozg1Njo4PDw7Ozw8Ozk8Oj09OTU4Nzw5PD88OkE/Ojo6QEBDQkRBQ0A/Q0FAPj08QD09Ol+al5mamJeYmpycn5+foaGhoJ+fn56foKCenZ2lpKSko6OioqOjoZ+foaGipKOio6SiradXXl1UV19ua42dmpqbnJ6dm5ucnZ+enZycnJydnZ+goKChoaGgoKGgoKGioaGioZ+enJqampqbnJqZmpuZnJ6ZlpaWl5eTjo6QlJabnJuam5udn52cnJycnJ6dlpSZnJ+in5ycnZ+hoJuXl5mZmpycnJubnZ6fnZqXlpaWlJOTlJiampqfoKGmpqWgn56fnqChoaCenJubnJybm5ybm5qZmJmZmZmXl5iVlJKQkJCQj5CSkpKSkZGTk5aYl5STkpSVlJWWlZaZmZmam52cnJyampmXlpaWlpaQgG9vZV5gV0BKSDg/N0lFP0VBPD07Ojo8Ozs3NTs4Njs3NDY6Oj47Oj0+Pj07Ozs+Ozo4Ojk5NkBBPTo8PTo6OT9BQ0JERUM+P0FBPz8+Pj89PDtgl5WXl5aVl5mbnqGhoKGioqCenp6enqCgn52bpaWjpKSioKCfoJ+dnZ+hoqOjo6OkobCjXWVkYGFua4GenJubm5ubmZianJ2enJubm5ycnJ6ipKGeoKGhoqKhoKCgoaGgn5+enJqZmpubm5ybmp2dm5manJiXlZWWkY6Nj5KYnZycm5ycnqCdnJucnJyempWVm56foZ+dnJyenp2cmpqampqampqbm5qXl5aTkpWVlpWTlZaam5qanZ6foqWjnp6fn5+en5+enZ6fnZycm5qcmpqbmpiZmJiYmJiYlZSTkZCRkJCQkZKTk5CRk5SYmZiVk5SVlZWWlZaXmZmXmZqenpyamJiXl5aWl5eYjX1ubV9lVlRFSzw3PjdSRUM+QkE4Ozw7OTg6ODY7Nzc6Njc5Oj0+Ojw8PT49PD06Pz06ODw9OTtAPj4/PT45ODs/QkNAQ0VDPT9DQj5AQD5APTw8YZWSlJWWlpeanJ6goKCgoaCgnp6enp6gn56em6WlpKOioJ+fnp2dm5mbnJydnp+gn56rmGNpbW5pZm2enZybm5ybmpmZmZqam5ucm5uam5ygo6SgnZ6en6CgoKCgn6ChoKCfnpuamZqam5ubm5ufnpyZmJqamJiYmJKOj5OXnJ2bnJ2cnJycnZycnp6dnpqVl5ygoaGfnp2eoJ+cnJuampqbmpqYmpmVk5OTkpOWl5eVlJiYmZucnJydoJ+gnp6enp+fn56en6KjpKKgnp6cm5qampuZmJmZmJeXlpWUlJORkZCQkZKTk5OSkpOUmJmYlpWUlZaWlpaWl5iYmJiXmZqamZeXl5aXlpeWl4l4dmddX1dURUU5OTs8WT5AOEI/OTs7Pjk4Ozg6Ozc5OjU4OTs9PDk9Oz0+PD0+Oz8/Ozk+PDw+Pz5AQUE9ODc7QkNFP0FFQz1AREJBQEQ7Oz47PGKWk5SUlpWUlpiYmZubnJycnZ2cnJ2en56dnJqkpKSkoJ+enpybm5qZmJiYmZucnZ6cpolla3R4bVuFop2dnJydnJqbmpqampydnZ2bmpuboKKinpucnZybnJ2enp2dnZ2fnpyampucnZycm5ycnp6cm5qanZqam5yVkZOXm52dnJ2fnZycnJycnZ6fnp+cl5idn6GhoJ6cn6CfnJubm5qbmpmZmZmZl5WWlZaYl5eXlpaYmZuenp2dn6GhoJ+fnp6fn5+dn5+hoqKhoZ+fn5yZm5qcnZuampmXlpaYl5eXlpWTkpGTlJSTlJSUlJaZmJaVlZeZmJeYl5eXl5eYl5iXl5eXlpaYl5eVl5eDeHZfW11eUT1GOjk4P1VDQTtDQzo8Pz86Ojk3Ozg4ODc0ODk8Ozw4Ozs8PTo9Pjo/QT06PTw+PkA/PUBBPjk2PERDRUBBRUU9PkVERD9COzo8OTpkl5SVlZaUlJSUlJWXmJiamZqcnJydnp6dnZybo6Oko6CenJuamZqZmJiYmZiam5ubm6WJa3F2em9lmp+enp2dnJybnZ6dnJ2enp2dnJydm5ygoJuampubmpudnJqampucnJuZmZycnJ2dnZ2dnZ2dnpybmp+fm5ydm5mZmZudnZ2dn52dn5+dnJydn5+fn5uanZ+goJ+dnJ6gnpubm5ubm5yampuamZudnJqZmJeYmJiYmp2foKCgoJ+hoaGgoJ+en5+fnp6foaKhoJ+enp+enJqam5ubmpqZlpaXmZmYmJiWlJOUlJWVk5OVlZSVlpWVlZSYmZuamZaWl5WWmJiWl5OUlJGRk4yRkJOWfXhqYWJiXFA8QDw2OENWSERCOjg7Oj47Nzc5Nj06OTk2NDc6Ozw9OTo6Oz87PT08QD47Oz46PT89PkBBP0A8NztBQ0U/P0REPj9EREM+Qj07PDs6Z5aTk5OTk5OTlJSVlpeWl5aWl5mbm5ybm5uamaOjoqCfnpuamJeYl5eXmJmYmZybm5qkgGpqb3lzcZegnp2dnJydnp6enp+enp2cnJydnp2bnJuampqam5ubmZiYmpqamZmZmJqdm5ydnZ2dnJ2cnZ2cm5qdn5ucnJubnJubnZ2dnJydnp2enZydnZ2cnJ2dm5uenp6dnZybnpubnJycnJydnJubmpmbmpmYmZmYmpmZmpyfn5+jpaKfoaKioaGfnqCgn5+fnqCioaGhn5+fn52ZmpudnZqZmJWWl5aVlZaTkpOUk5STkJCSk5GUkY+OkJGOlZabmJWYlJmXlJiRjJCPk5yTkoyFjIeDhndxZ2pkW1xRQT44NkJHYEJFR0A+Ozw7Ojg4NjU8ODo4MzQ6Njk9PTk5Ojs9Ozw6PD48Oj5AOj5APjw/QD8+PDg6Q0FEPz5CRD8+Q0VCPUJAPDw8OmeYk5KSk5OSk5SVlJWXl5aWlZaXmZmZmpqampqkoqCfn52bmpmYmJiXl5iZmJmcnZ2cqH1nZXN7enOJop+enp2dnp6enZ2enZ6enp2dnZ6cm5ybmpubm5ucm5iYmJmZmJiZmZmbnZycnZ6enp6enp6dnZybm52bnJybnJ2dnZ2dnJ2dnp+fn52cnZ2dm5qbnJmZnJ2dnZ2dm5uanJ2dnJycnp2dnZybmZeVlZeXmJqam5ubnZ6foqOhoKGhnJucm5ubnZqcmZycn6CfnZiZmZmUkpKUl5SPj4+OkYyNiYuQi4mLjpGRj4mQmJiQkoyNi5KQj5iYoqiqpqWlrKOmoZqep6eyqKKVo6Cfl39wcWlsXFtcTUY8NzdHR1g+SE5URjk+Ojg5ODc1PTk4NzMzOTY6Pjw6Nzo8Ozo6Ojo8PDs/PjtAQD47PT5BPDw2N0A+QkA+QUY+PEFEQT1DQj49PDlmmJSTk5OTkpOUlZOVl5iYmJaXl5iZmZqampqaoqGfnp2cm5mYmJiYmJiYmZmZm5ybnKx/am16f3lxh6Genp2cnZ6enp6enp6dnp2dnZ6enJubnJubm5ubm5uZmJiYmJiYmJmZnJ2dnJyenp6enp+fnp6dnp6dnJydnJ2dnZ6fnZ2fn56goJ+enZ2dnZybnJ2em5qbm52enZ6dm5ubnJ2cnp2cnZqYl5SRjo+QkJGVmJSWlJiZmpudmJuYlY2Mjo6TkpKRj4mQjpGRjo+Ki42NjYiIi4+Lg42NkY+MkI2Qk5WVnJihoJySn6SipKmam5eanKOprb3Bwbq8uL26ucC8ubq3uru7tL2zwbV/bnVmZ1peWUxJRTo7TElTPFZSSUM6QTo7Ozc3NTo6OjgyNTY4Oz08OTk7Ozw5Nzo4Ojw6PT85PD8+PDw9QTs5NTg8O0A/QT9EPTxBQkA8REM9PT06YZOTkZCUlJOTk5OTlJeYlpeZmJmYmZqbmpqamp+gnp+fnJqZmpqampmYl5iZmZmZmZmphXB1e4B3b4mhnp6enp6fn56en56fn56dnp6fnp2dnJ2cm5ubm5ubmpiYmJiZmZiam52cnJ2dnp2dnp6goJ+enZ6hoJ6dnp2enZ6fn56en6CenZ6enJydnZ2cm5qYnJuVmJqamJiYmJmSjJCXlKCXk4+MjYqKiImMiJORh5CPjYqKkJCLjoqMi4+IiImJjpGOjYaFiYaKhoWLiI+SkJCNkJKXlpKamJ2TlJ6kpqaqq7Gsr6+rpquqsbm5tbS0rqyvtMDIxcXBvsbDxMTDurW+t7a0s7C2tb6qcHRyXGZfXV1JRj8/RUtMVklcTEQ/PUI6Qzk5Nzc7OTk3MTc5ODo+ODg6PDw7OTc5OTs9Oj4/OT5BPDs+PD46OTY5PDpBPkNBQT08QkBAPkJEPj8+OVyHhIOHi42KiYaFgYqMkZOVmJiHlZaWkpiampmenZ+gn52ampubm5ycm5iWmJmXl5ibqo56dXZ7f3mCoJ+fnp+goKCfn5+foKCfnp2dnp+enp2dnJqbm5ubm5uYmJiXl5iZm5ucnJydnp6enpybm52dnZycoaGfnZ6dnZ2dnp2dnJiWlpaYlZWSlpmWk5GKjI+PjI+NkIuLj4+WiYiEi5GZjn2Fi42PjYyHioyQm4yRj4+Lio6TjIyNjIiSi4yFiYyPhouIh42KhYyEj4qXkJOYmpWbnKOqoaKknKKrsbe0ubWxs62vsrKlp7O6sbq6vLa3tsDDw729vLa/urq8wbW4wL60r66mqa+3mm58Z1tjWl1fSEU+QUtJU1hZXkFGOTk9OUY/Pzo3Ozs7NjM6Nzo5Pjg6Ojw9OTk4Ozk7PDo+PTtAQDs8QjxAOjg0Nzw7Qj9BQj4+O0NEREBDQz0+PjlhmZWLkYWNj5aSiHl9e3+Fi4OKgoqJhmuAeJCLlpqRnZ2UlJGTlpeampiWk42Sk5KQm5uIdndzcX1/cpGgnZubm5yenZ2eoKGgm5uWlpucmpybnJuYmZqYmJmampqWi5CTlpmYlZiYlpucl5WSkY2SkZCUk5KXm5mYm5ePjpCLjo2Ch4uLi4qLiI2RjIeHhoqIiZGKh4yEhYqNi4qNhI+UkIyDkJOUmZWQi5OTkZWRlpWOj5GMlI2Oj4qIj4ePhoeJiYmNiomJioWNh46JmJKUmpuXmKChp6Cko5qqqbO2sbWwqKmiqK6tn6qvsK21ubi8wr/BxLixtbCutrOwuL68ury+urOzp7G3wpB1gGNiXlpXUk1IRkVQSVlXX1tDUDpCQz1HRj84Nzo6NzU1OTc8OTw5ODo9Pjo6Nzs7Pjs7PTs9P0E7Pz48Pzo4NDM3OkFBQEI+PjpDREM/QUM7PT45Z6mloqKZn6CippeUiI2CiIJ1h4iKiIp7e3Z7enmPeoiSfn18en6CkYWBgH1zfH99fISHfnRweHZzfHaBj4iIiYeIioyMkZicl4iOhIuNi4iNkI+Pi5GPi4yPj5CQjouFhYeLjIyHiIuOi4eMhYaBjYuGiop/iYqGiJiRiIOIg4KFfIuLjIaJi4iKkIyIi42PjI+Wh4mLio6NjY2Wk5OdnJyalpycm56bmpuYnZeTkZWWkJKRi4+LlpSMjYqDi4SEiYyQkIqOio2LipGJjZOTk5SVk5KcmZ6Xn6CfpaKvsamupKSfmKStpqa4t6ysu729wsPAv7+vpa2wsLS3uLO0uLa0ta6stK+4tLaBeXpjZmBeVlBRQUVMT0lcXl9UR0dCS0xCREA9ODg7OTU3Nzk3Ozc9PDk9Pj05Ozg6O0A8Oj06PkJBOD88Oj84NjQyOTtCQD9CPj04QEI/PkBEO0A+N2CloJqXnaGaoaCPl5efl5WCjaCfo6GdmpKOjIxycXBvdnFucG1ucHZub29waHBxcHR+c3FycXd7cnl2d3Jyd3Z6e3l8fXt/iIGEi3+PkYaNi4uGiouLiYaEgYaCgIKJkYOAg4x/ho+LiYWAh32AgZKQhoSEho2DhIyPj4+IjY+Hi4iRkJWRjpCKk5eOj5WYp6SfnZWYlpaln5udq6aqt7W4srGnr6qnpqGfmp2WkpWVkYqPjImTjZuVjYuLhoaJjJWQkJCLmZKVlZSbkJiTlIyNkYyWl5WilZ6mqauno6OqsJucpp+mq6G0vb6zs7+5u7u6uby9rqiusa6wuLyztLGxqrCpqLGxsqild3J0X2hhYFRWUUlKSFZNXl5eVExKRVFKRUdDPTo5OTc0ODY4Mzg4PTo9PD47OTs4Ojs/PDw+OT9DPzg7Ojg8Nzc2Mzc5RT4/Qz89N0BAQT0/RDw+PThUj4yGh4eUjJWZl5yWmZaNlZyWlZydoKCdmpiWeHFubXJ4cXFsbnJwa3FvcG1yc3t1dnd5fnVxeHZ0d3tybn98gX15eH1/eYOGg4WCg5CLkIuLi42Pi4mJhYKBfX9zfYiAfpyQhIWFiYuPinp9fYaOjYqGjZSRi5CXj5SXkpihlp6XlZunpp+goKawq6GjpbW0sqqmqq+isba5vcK7ucO+vLi9uLWxrLCspZuSk5mfm5SPk5WOmp2doJqfn5edo6qsoZ+em62hp6qwqaampJiRkZWUo6SirKSss7Szs6i3tru4sLKvra2yt7a6srW6s7e5u7i8urayr6yxsbKztLOxsa2us7Gzs6yhl3Zxc19jXlJRVE1PSUdYT1pcZFROR1VPRURKRD44Ojg3NTg4ODU5Nzo6PTw/Ojg8ODk5PTs9PTpCPj84Ozo5Ojk4NjI1N0I+P0RAQDY+P0I/PEM8PT46Tn98go6MjJOTl5eaj5SWjZaRkZSXk5qanqGdnHJvcnFxcXFxcG5zcW91dHJxdneAdXd8eYV+d3t8eX1/fICJiYmDfXp/h4GIiYGAgIGGiIGGi4aIhYSIiImEf4J/enx8fX6SkH+IeIGFi4qDhIWKj4yNkZmdlJSUoJqan6Ktsa2ppKWtr6ysrLWuvrmtrqm1sLexq7G2rK+9wsLAvrq8trKutraxtK66u7OurKepp6unoqmtoKmooq+wuLSxvLq6urK0ta+8tLezt7e7t7mtrbCprLW5sbeytLe2sLu7vLu6ury1vLi0wbWsqqqrtLG3uLm1trSzsKymrrCqq7Cxq6yusLKxtK6qo5N4dnJlZ1tMUlBGTUhTV1JlXmdUUExcUUhMUkNBOTk3OTU4ODY2Ozc5Ojs6Pjk4Ozo6Ojw8Pj08RD45Njs7ODg+OTUxNTZCRkREP0A3Pj5DPjpBP0BAO0t/gomXmJSdlpabmIuSlo6XkZGVl5SZl5+bmZx8dHV2dXl1c3RudnJzdHV2d319gX56gXyDfoJ/fYB/hIKFj52RiYF/go+Xjo6HgoCBiIuFfoqQi3+HjYyLioeSioeGjZGTkZGEh319g4iMjouOiomQj46PlJSYkZWbmp2dqK6yr6+1tLOtsrW4sLy1tbGqsKqztbS7t7SztrS1r7i4t62noqassLCvtre3vrW5vLOysa61u7C0r6+yu7axuMC9tLS0s7izvLq2tLrAvbm6ubq+ubm5vrWysa+yr6q1tLGzsbSzrri4tb+vpKaoo6ussa+zrq6wsKytq6qroqKmqKKnrauqpaynoqeYeHlxZmVZT09NSVJNV0xPX15cTlVUYlFEVE07Pzk8ODk1Nzc1Nzk1Ojo6OTs4Ojw8Oj08Pj4/P0I9ODY6Ojk6QDs1MjY2QUZDQz4/Nz49Q0I5P0I/PjtLjpGTmJmVmZGTopiTkpKLk4uOkI+Vl5ablZSbhoJ9enh2dHRzdH53end2gIKDhouMhISFioaQiYeRk5aRjZaalY+IjI+emJaVkpCTl5qamJCdoJ2Tl5qgmZ2bo6CVkJugpKOak42IiIuJkZGOkY6LmJqPj4yUmpecnJufnKSstLm6vK+2tLi0tLK3uLmzq6+qqKy1srK1rrGrrqa3s7OxpaGotbCvrayrtbqyu7q6tLK3ur67ubG4sLmtqLK4u66ttLS3tbu2trm5vLe0r7G0t7a5s7e1pq2pq6ior6yprq2up6KxtLG0q6aop6Cjq66oqq6orLKwr6+pqKGeoaGjpqOgopqlo56ol3J3bmdiVUtUT09KQ1BLX2JYWlFcU19NSFFJQUA5Ojg2Njc3NTg5NDs5Ozk8Nzs+Ojg8PD0/QkBBPTs2OTk5Oj87NjM3OD5GQkJAQjk+PUBDPkBGQj44R5OWkZWTkpSQkZ+ZnZmVkI+Sko6Mk5aWko6RlZGSkIaBeXJzdXuBhI6HhZGTkpicnJiVkJWYo5yaoaeqqZ+clpeVnaKioZyZnpmlqKyvramnqqmop6GlqKirqamvoZufoaOjoJqfoJyUjZiUmKCgoaSem5qkp6Spq66spaOoq6+xtK6qrK6zr6ystLO0ua6urayqrLKwsK2wqKqmsrS0uK6qtrqwr6qurLC3s7i0t7W0u7y4tbWxtauyrKiys7uvrbGytLa1sbG0s7OvrKuvs7a0sayutKqqpqWnrauoqKupqqifqbOwqqeppaOio7CtqaatpairrayppaSioKWipaOYmZyVnqKippdudWVnZFZPWEtLSktTVHBiWWRXX1tcUlpQTEM8ODk6Njk4NzQ3NzQ4Ojw6PDg6PTk3PDw7PkM/QT47OTo5Ojs+PTg0NThBREVEQkM5PjtAPkI/R0Q+N0KSm5SVlZaVj46Wl5qZlZGKk5SSjo+SkYqKiY2Ul5qTjYmCho6VkZSfmpuin5+jnqGhn5ijpKelpaapqa2rqaKmpKilpKGfnqOjra2srairrq6qqqukoaKlqaenqaijopybm6SgpaijoJidmZ+hoqmnoKKirqyrqqetrqilpKmpqammo6iqqaekp66wr7Ovq7Crqq+yr7Czua+rqLCxrrCyubO0r62vtbCss7GurLW1tLSzs7CvrKyqrKusr7G0s7CwrrCwsKyqrauqq6alrrCysKumqbCvqaOkqaunqKaopquwq6mvqaaoqaalo6iwraqpqKKpo6WnpKGhoKKloZ2el5aYlJugpKmUbnNeamlfVVpOUk5QT1JkXGRjW11ZXFBZT0tAPDs5Ojc6ODczNTMzODo9OTo4OTo5Oj08PEBEPkA9OTo8PDw+Oz45NTo8QkFFQUNBOT47P0BEQENCQDdAkZ6YlJeZlpGHi5SSl5GIg4mLk4+OkI2Hh4SFlZmWmJeZlpqeop2anKKkoaCdn5qfoKGgpqGgoKCjo6KlqKmrramqpqOmpaCloKaopqWnqKapqKOnppmcpKWioaChoaCcmJmfoKGkpKKenpagm5qioqChn6CiqKCcn6GloaCmo6KfpKGspp6foaGkrKqnrKivq6e0sa6ur7WyrKqwq6mtrbWwrq6srreup6yqpKivsq+sq7Kvqqqpq6utqa6urrGxraqtqaunp6uoqauinaapqKilqKisqKilpKWop6iopqmsr6+oq6mhoqKlo6Opq6ymqKWjqKKhoKSdnZ+hoZ2bnZ+amZWcnKOqlG9zZm5yZF1dUFVPV09eZGRsZ2JiWlpSVE9NQTo9Ojo4Ozk1MTYzMjg4Ozk5OTk7OTk8Oz0/Qz5APTk7Ojs8QD0+PDk5PEFBRUFGQTo9Oz9BQUJBRUI4PYqWlJOYmpaPiISNjpGSjIiIiI+JiZCRjoqKiJubmZygpaKlnqKjoZqeoZyanZ6bnKOop6ugoKOYoJ2XnKGjo6WjoqKkrKilqaCepqmnq6mkn6Kgoqahpq2mpp2fn5+fn5manJyhoKGkn6GbnZqcoJ6hn56eoKOZlpqYo6KipJ+ZnKGhoqCbmp6goaSgnaejqrGorqusqaSqqquorKalrKqws6+rq6mwq6appaWoq6ynpqevq6Wnq6upq6irqqqrrailqKOmpaesqayoopykoaOmo6qpqKano6SnqKanqKepqKupoaKoo5yepqWjqKino6WlpqmgpJ6inpeYnZ+doqKlnpiUlZ6go5d1d2t2d2FfXFVZUVVWW2Necl9oX2NTUVlUSD48PTg7OTo4NTM3MzM0Nzo4OT05Ozo5PDxBQEM9PT44Ozw9PEA/Qz86ODo+P0NAREE6Oz48QD9DQ0VDOTyCmJmenZ2alZKKiZGRl5GQh4SJgoGNj4+Sj42cnZ+hpKmlqaeorK2moqKfmKSmo6Stsa6yp6asm56em5qjp6Cfo5+foq+rqqyoqKuwqaipqKGfoKeprbCyr6yjoqahqaWepKOipqClpKKlo56doJ6fpaKinp+imJWemp6fpKGblZigoZ2enJudnZuZmZWen6Oonp2iqKGaoaOmoqSoqaqoq7CxqKWlp6eopKWpqaqnoqWmqKadnqWloqClpaOlpqCjpaOjpaelqamqpKekpqKmp6SrqaenpKGlqKynpqWlo6OopJWdo5+bnaCjqaeopqGjo6mooKiioJyVkZqfoKGmopuXkpCamqCVfHdvfXlmW1tgX1pcVlxoZG9jbmloYl5QUEA/Ozo4OTg8OzYzNDMzMzc5OTs8OTs7OT49QkBAPTs9ODw9QD08PENBPjo4PT9EP0M+Ojk/PEI/P0FEQjk6gJ6kp6Kem5+gmY+ZnaCWloqGj4iEi4qTl5SRo6Wnqq6trLOys7S4t62pqqevtLKxqq6usbKusa2lq7OssbGpq6+rq6y2sLSwq7GysaOfoqqpp663trS0trOvrKuuq7awqbKxra6npp6io6ObnZyXoqiloZ+eo5ueoZqWnaScm5aZoqefoJ+joJuUlpmWl5qfoJmVnqKZmJ2dpZ2gpKeqqaiqraylqaSlqaeqqaqsp6SkpKOimZmhnpqaoaCfpaWYnqSmpKqooqelpaGqp6mnp6ejqKWmpaGkqKesoqekoaalpaOVl52Ym5mVo6elpaSfnZ2lo6Kqo5+amZiXnJyaoaGakJOTl5ibjX93cnZ4aWJbX15cYllgZG5ta25hX2RgUE9BQDs7OTs4Ojk2MTQzNjQ3Nzc6PTo8Ozk9PUI/Pj89PDo/OTo7PD5BRUA9OTtAQT5DPDs5PzlAQEBAQkM7OXuao6OcoJ2dop2Zn6KioJibmJaYkpSQm5qWl7S0rrW4s7S4tre0uLm3tbm4ub28uKqLnLK4vLS9urW7uru4s7q/uLe5u7G3r6iusq2inJ+qsri8vL27ur+0r7GztbS3t6+1tLWysKikop+gl5Wal6SqpqahpKOkq6WlmKGko52goaKooaOgpaGck5mYmJmco56cmpudl5uZlqWam5+hqKmpqKuvr66pqKmrrKytq6irp6WjoJyfo6Ojn6Cipammmpyip6Spn6GjoqKgpaanpqSooJ+ipKGjoqiop6OloKGopqalo5mbmJuTj6GknqKfmJiVoJuhpaCfm5udnJuamZugmo2YmZiTkYaAdnh5eGNbUllUX19hbGh1a3BnaWliWVNMQDw6Ozg5Nzk3NTU2Mjg1Njc3Ojw7Ozs7QD4/QD0+Pjk6PDk2Nz47QkZCPDg7P0NDRDw+OT43PkFCP0ZDOzhwkpqblJ6bm52Vl52doqajopaXnpaXl6GblJi+t7G4uba3t7i7l5S2vbu9vcDFtaK7mKC3v7+6wcm0nbu2sra/xcGooLazurGqrrSxsLG0tLa8vL68vL3Guri3ur20r7Wxsbq4t7Kzsqqmpp+YpKSnqKSupKurtbWus6CnqqynqqmlpqCnoKGmoZOWmJ2foqSjnZ6coaChnZekmpmdoKaqqqqtrq2tsLGrrK2sqamrrqimpaalpqSkpqaeo6eppKGcoKKjpqCio5+jpJ2foqWgpJyboZ6fo6GhpaSlqaOkpaKkp6ehn52elpOcoJiZko+MjJeWn5uWnJqdnJqTlpSUmJOQmp2YiouHgIB8gnhhXllTYWhgZnNvc2lzY2lkYltMSz46ODg5ODg5NzM0NTI1NDY2OTw8Oz08P0E/QEA9Pj44OTs4Njc/OUJFQzw7PD5DREM9QDs9Nz1DQ0BFQjw3Z4yRk4qalZiblZWYm6Knq6aVl5iQlZmhnpeXvrWztLu6ubi5woeYt6u4u8DCxbOjw6e4s72/tMTHvbS7uL62wMTErqCworW2tb2+wcPGw8O5vb/AwL2/xL28ur2+tKeqmLHAvbi1ucCzr6+qqqitp6ekr6eqtLyxtLWor7Gwr6yqoqajrJ+fpquXmqifpaWfoJydoKuwsKyiq5yYm6Cor7Kys6uorre1sq2tqaalqKulpaStqaShn6Cnnp6mqKmmnp+anqGlpqmcnaObl6KmmpuanZ+cmqGcmZ2eoKijn6GfnaWioKOioZSZmpmTj4qLhI2Qk5uPjpiVm5eYkJORkomNl5iYk4uKi32AgIVwYGFeXmpiYm53dXZubVtiUVVcTUc7PDk3OTc5Ojc0NDQxNDM3Njg8Ozs8PEBAPUA/Pj8+Ojo5Ojc6Pz5FRUU8PT1AQkJCQUI7PDhAQ0NARD87NV+MjIaFlouUlZeYl5ifpqellpWWkZebn5ual7mxtrO5vLy5urWqsryxvsG0vMe5uLuuv6fGw7/KxsnIxcXJvMLHx7+xsae8vL7FxMbJx8XGu8TAxcbAua+9vMC+vrOrqoyzu760tbfCuq2vsLWqq6aqo62kp7G2q7WyrbOtqK6vp6awr7Ktqq+zpKu1qaeopKCgnqmyuL61tbWqqaausre4t7apq7i8ubexr66noqOop6SfqKOfnqCZoZydoqSnp6GelJuaoKGlnqChnpajnZSQlpiboZqflpORlpSin5qenJudoZ6kn56VnJiPkpOPjImTkJefiZCWkZuUmJGRlZaDjJWXlpKLjIh8f4N/amZoYWtsZm51cXJ1cWZeX1xSSUU/Ojo6Nzg0ODw3NjU0MjMzNjU3PDo7PDs9QD4/QD48PTk5OTs6PDw+QkRFPj49QENDQkREOzo4QUJCQUNAOTJbk4iEjZGKi5GRlZCSmp2fnJOSmJSdnZqXmpW2sbm1tb6+tri1uLO8vMTEusPHwb+0s8XFxr/CzcfLzsvLx8HDxsfIysXExcO7vLzBxcHFxb/DwsbFwLGTvrq/w8K2trqptLO0qauzu7uxn5uxr6ykrK60p6qpqKqtrKmlpZ6pr6uyu7q4u7e5t7O5uLOurLO0qrC1ub3Bur6+vL60urm4u7qysbS8u7q7s7Oyp6Smq6uioaCdmpudmpyXmpuenJygnZaclpuZnZ6io52UnJCNiY6OkZ6bnJWNh5KLmJiWmpybmJybnp6cmp6UjpiYmpSRmZeeoZWYmpKXlJWRlJqYk4+TnZaSi5F+enx/dGtrbmRvbGhxeG95aWlhXGdhUUZEQTw5OTc2NDQ6ODQ2NTMzMjY1Nj05OTs7PT47Pj49Oz05OTs7Oz89QUNBQkFAPEBDQ0NFQjs4OUQ/P0BCPzsyV5uQkZCQh4WSjo2IjZCTlZGPjZSUm5STlpqRs7e4uLi+u7C1sri2tbbAw8G+w8LAvru+u7u8xMzEzNDLxsa/xcfLyNTLysjGv7u7vsS+xcjGxsTEw7i0wLe0vMHCucK3t7/Au66lrre8t62co7ewpq20tayupaWjqKSgoKWZqrOyvsG+urm6uLW0srG0tLO6wL7Av769u7u9vsDCt7a3tru7sru+ubi3u7a3tKyoqamrpqijnpOampyYkZKZl5GRmJqXnpiWk5acm5+elJOJiX6GiIuWlJiZkYmVkZeWlZmbmpaYl5idnpyhmJWZmZyYl5ybn56jnJ6WmJeTl5yZmZyUlp2UlpOJdnl6e3Zua2hndVpmcndzeGZmXWRbUlhJRj87Nzg4NzYxNjk3NDQzMzM2NDY7ODo8Oz08OD0+PDo7PDs9Ozs+PkRBQURCQEBBQkNDREM9OTlCQD8/QD89MkyWmpaSk4yKmJCKi4yOkpKKiIaNkJiKj5CUl7O7tba/vb2xtrjBvby0uL/Bsbi3vsHFvbu8wsbJv8jOyMHEwcfKysbKxczIzcbIxb/DwMvNz8nGw8PEwsS+uL7Bw8DEvsHPz87Gq6+2tLWroKe0s66ruLWzq6mjoq2prKatn6y1tL/Cvrm4vbawrausr7W0ur7Fv7u8urO5u7i5ubWtsLS9u7G/vLiytrmzubu0ra2orKyqqaeXnpualY2MmJSTi5WWlJyZl5WWmZKYn5mQiop+iYqKkY6Vl5OUn5mWkJSZmJmWmJOUm6GeoZiYmp2ZmZaenpibopqdnJuYmpuZlpeXlpyZlJyYfoB4eXV1ZWVpamhdam9teHdiYmBgXlhXRkU4Ojg6OTc5NDQ5NzY2NTEyMzM0Ozo9Pzs9PTo6PTs8Pjo7Pz48QkBDQkJFQj0/Q0NDQ0RFQDk6QkFBQj5CQTVCkJeUlZmSj5qQjpKRjZSVi4qHjI2UiImPkpq2u7S8xsHEwr3BxcLAtLO9v6ywr7rDysPCvs3IxbfByMW/wcLIy8rCwsTJzM3Pz8zDx8bIyMjHycfFycfIx7/Fx8TEx8jK0s/SzLy4trS4uMG+vrq9ury6vKytpqm7urm3wLK1uLLAxrq3t8Gzsa2tqau1s7u2w7a2vbWxt762s7e4sLW2v7uwvbq0q7CxsbO8urOzrqutq62xnaOjoJqQjpiXlZCclpaYlpWSnJmTm5+clpGUjpWQiYyQlZOUm56YmZKSnJedlJmSk5aZmJ2VnJ6do5yVnZ+TnKKcnKCfnaOemJSVl5ebmpmgkH99cXRxb2JhZ3VnaWh0bXhsXWRbVWBZTEhDNjw5OTg4OjUzOjY2NDQxMzUyNTs6PD47Ozw9PDs8PTw7PD49P0E/RUFCQ0M+QEFARUVERUE7Nz5DQkI+Q0I4O4+akZaalJKUjZCUlI6VlI6Pi4yJk4uIkJObt8C6xsXEw8zCwcS9vrWvt7uvr7O6wMfFxMHMy8W2ucDCwsTHytHLwsPExcnFzdDOx8zJwsHGwcvLx8bMyc3FxsbDxsXJzdDNz8zHxMDDwsnNx8XBxMfBu760sbCwwb6/wca/vri3w8K6urbAvrWyrKmvsri+tMC0tLi0t7nEua+8vrm+v8K/tbq2q6qsrq+wt768trSura2utaSlqKimmpycnZyeopydmZOQkp2VmKCdmJiVmZmZl46MlH2QkJefmZmYk5GToI6Nko+VjpCUlaKdnKSem56elpyjoKGipKOkop6amZubnJ2enIN9cnx4cGdgamp2bGlkdG5zYlxiVFdUU01HOjc7OTk3Nzo3NDg3ODQ1MjM0MjU7Ojk+Oj08Pz04Oz05OTk9PEBBQEVCQUJBQT9AP0RFREVAPDo+QkNCQENBOjSAoZeUmZiVkImUk5aTiZGMlJGOiJaKi5CXnMXLw8O8wMPHwbm9vbu4tre3rrK3uLzAwsDCx8bHurzAwsXHyMbSycHDw7+/vsTLyMrLyLy7yMfJzcjDyMnJxsXDwsHCx8fJysfMyMfIzcbLz8W3wMDAwLu7vbWzs7+/ub/DucC3u8G8uri7ub27srCvsKy5wri9ube1t7q9xb24xsjCwcLGwr28tamurrCwr7O6t7m2sK+tr7OppquprqannqSlo6OjoqCblZiekZecl5GRlZeZlZmRlJiSlYyYo5qcnp2FiZ+TfJKWlZKUlJennaCipJ+en56foaGkoqKjoaOinJ2fnqOhppl5enl/cm9mZWdjamRham1ubl5YXFZVTlBKRjk5Ozk3Njc3NjM3ODk1NjEzNTI3PDs8QDs/PDw6ODo8OTk4Pj1APz9GP0JBQz89QT5ARENDQTw5PENBQ0RBQDozbKKdlZedlo+PmJiZmIiSjZGVkI+Vjo6TlpbKy7u5urnBu7q3vsG8vLu5sa61uri4u8S6vsC+vru8wMXBxsK+xsG5u8O6uLm8vsHGwca6ucnJw8XEwMTBwsHEwcO+vcLAwMHCy8PGzMvFyNHCsL69uLq7vL63tLC5vrO8vrG5tbi7tryztbm2uba5t7GtusG6vMG/t77Ev8bDw8fHwrvAwr/Cv7iys7O1tLGut7S3tbSxrK2xp6Wlp7CtqJ+nq6ajqKWmpqCgn5SYmZSRkZWUl5OYl5qhnZ6hnKGdoaWglpSbkZeXmJqTnpmZqaSlpKWdoqCanqCkoqOcoqGjoJ6cnp6ppaiVfXuDeG5mYWRiYWJjY2piZmNaWVlcWVFORT07OTo7Nzc5OTY0OTk6NTMxNDUyNzo7OkA9Pzw8OTc3Ozo5Ojw+QD8+RDxCQURAPz49QkRCQkI+OjlCP0FCPT44NVmfnJiTmZaRlZiYmpeQkZCQk5GTlJKSkpSUxce4tbq5wrm5vMPFwri7ubGxtry6tbnAu7u5tre0tLW/ur3Aub26urS/uLW3s6+7vLfAt73Cv8G7v8G8u8W+u8HEwL6+uLzBwcu+vcnEwMDKwLHBv7u4u765tbe0uLy0vbi1tLCzvLG3tri/tr25vb65t7q+u7/Axb29y8PGw8TAw762ubq2v7i7v7y4trOyq7CwsrWzs66sq6emnqeurauiqKumpqqjp6iqo5+Ym52bmpicnJiXnJuhpZ2anqGhoKGmoJqbnJiboJ+dnJ+coKiho6SknaKfmqKgop+el6Shop+dmpieqKWhi3x5h31xY2BiYmdqZmZpZWldVlVTWU9TS0U4PzY7Ojc3OTs2NTo7PDYzMTM0MTc7OTg/PT47PDs3Njk5ODo7PUA/PkA9PT9CPjxAQUNDQT9DPTo2PEBBQDw9ODdJlJibj5OUkZWYlZGWkpWRkJGUlZSTkpKYlcHCwLq8ub62uL7EwMKxvbqytLO4vLW3vMC8vbS0sbC1t7W6wbi+uL+8vbe1t7CuuLa5v7vAv7fBvLvDtrrIuLa5u725ura7xcXKvbnFwL+8wb64xr3BwLzFuLa3tLi2tru7uLa0t7q1tLi8vbm/ucPAwLu5vLu+vcjEvcfEw7rAvb62sra4srm0usLCureysaysq62yr7Kur6ijpJ6rrKyqpKakpKiqoqemraihoaGmn6Oiop6bnKKfoKOdnJuhn6KgpKCem5eZn6GdnZ6eoaWkoaKioZ6ho5yinqCZnZijn52eoJqZoKKmnYR6g4B4cG1lZWZvaWVrZ1hYTktLS1JJTEhDOT44PTs2Ojs5Njc8ODk4NjA0MzE3OTk7Pz0+Ojw6ODg5PDg6Ozs7PD1BPj09Q0E8P0NDREA/Pzw6Nz5CREE/QDg4P4mYmoyMkI+Tl5WMkpCakpGXmJaUlJKQmpTDvsbBwby8uLi6v7a8scK2tLyxtLa4s7q9v728sq2vrLGwt7y2u7zAxLm3t7e1urm6u8C9w8C6xMK+x7i5uK23tbi6tLezu8XGy8G7xsDAv728v8nDxMW+xri1srK9uLi4vrq6uby6urS3u7q5v7zEwL+5uri/ubvFxr3Fw8Kyur27sa+2uLO3s7q+wLm2rLGrrqmqqa2qqq6mpKWnrq2ppaOio6GkpaWmoqato6Klo5+ho6Gcmpyhn6CloaCenZygnaWgnpeVmZ2fn52gn6KmpaCknpybn6Ofn5mcmZ2epJyWnKOcnqGcppZ+f4Z8a25wZ3Brc2VibV9cVEhLSkRKQkNHPzk7OD08Nzs7OTc4Ozc8PDYyNzUxNjk8PD08QTs8Ojs6OT45Ojs9PUA+RD89PkRAPz9BRkQ/Pzw9OTc/QUNCQEI5Ojl3nJiLh4uQkpOWjY+TmpOQnZiSkY6QjpiSvbfHvsO+vbu+vL22uri9ure9s7OwuLi1uby8wLeqraSusLe7s72/u8S3tri2t7+/xLzCxcXHx8rJxs/CwbiutbW8vri7sr7ExMrFwcnDwr+/vr3HzMfHxMe9tbW2wb26u7/CusDCv7y2t729vcHBwL+8ube8wru3v8W7wr++tbe8vK+vt7awtLO6ubq7r6mtq62rrKaqoqeuqKWqra2vp6Sgn6ajnqKjqKOjq6Oiop6dm5ublJaZnJyfpZ6fnpmYnpejoJyXmZqZmqOjop6jo6egpqCbnaCjnp2WoJmcoKCblJegn6WcmKKQgYaBcWVsaW50bndjZ2FcY1FLVEhFRUNHQzw7OTg9Ojc6PTo4OTs3PD01MzY1MDY4OTo8O0A9PDo+PDk+OTk9Pjs/PkM8Pz5APz0/P0ZEQEE/Pjo3P0BDQz9BPTo4ZqGYj4uNlZKVlY6PlpmVl5uVjoyMjY+bk7m2wbS/vLm8w8C+wLq1trKywLmvsry8sLe7tru8q6qjsLm9vrO8vrzFuLK4ub3HycrDx8jGxsnIzM7RzMrEtbrAw8i/v7W/wL/Gxr/LxsO/wbzAw8zKx8XGwbm9vMS/wL/CyL3Hx8XFvLrEv7vBv7rAvLu7wMS9t7nCub69t7S2uLqur7WxsLCytre0t6yurKqsrKuoq6Gms6qlra+trKippaOkp5+io6Onoaeiop6cnZyamYyQlpeZnaKZnpuVkp2UoaCdmZ6fmJimpqKfoqKmoqeloqCko6GbnaCbnKKfl5WVnp6kmpafiYGDgXRvbGx0a2xuX2JeYGFOSE0/RUA/REM7Ozo6Ozo4Ozw6OTw+OTo+NDQ1NTE5OTo5PDtAPD89PTw4PDs6PDs7Pz5DPkI+QD89Pz9FRUJBQj87Nj9CRUQ9QUE6OlmfmJOSlZqVmpOQlpeclZuZlpSVkZKTnZm2uLaxuru6vsG5uca7trWypb69tLbBv66zvbS4wbGwsbS8w7y6ur68xL+3vb+9x8zGx8nGxr/ExMrIzMzNy8bCw8vOwry5vbq5wMO/yMbEwcG/xcDKycPDw8O5w769ub+8wsbCyc7Hxr66xr26v7m3wLm5vsDCvrW0vLi2u7CvsrK1r7Cvrqyus7CzsrirsbKxqrCrq6yrrLatqKyusqarrKmpoaWgpaakrKSmoaChnqGgnaCMlJeTm5+mmZ6emZOYnZ+gnp2eopuYp62ooqSgoKKqpqmhqKGlm6CgnZ2jn5SYmKKdp6Gfm4J7eod6bW13e19wY1tdX15TST5DRUlCQz5DOz42OTo7Ozs7Ozs7PT05PTU2NjIxODo5Ozs6QTs/PDw+Nzs8Ozw9PTw9Pz5BQUE+PkFCQUVDQkRAPDY+Q0RFPkJEPztTmZuZmJ6dmqCalpyZn5KdlZ2boJWWlJqYur20sLu8wcTCv8XGura5sqO7vbS3xLuwtbq2ucS4tLy2ur3BvLu/tr/Bv7y/usDLwsfIwL+8vL/FwsfLyMHDwMDJysLAu7uwtLu9wMXGxcW/wMK/y8fCwMjAusK7urO6usG+wMrOysS9tby8ub+5ubW1s7/Avre0s7S4rbeqr7CwsrGvq6+nr7ausrG5rra2uLSzsLGttrS6sa6srranrLKsraSjoaenqLKrqqWkp6elpaCml5ujn6SmraKeo6KanaWiop+foaWenrC0sKSlnp+kqaevp6mgq6CiopqipJ2anqGmp6+psZWCe32Cem1zeHNncF1aXlxZUUVEQ01JQUQ9Rzo6NTk7Ojw8Ojs7Oz0/Oj01NDUxMjc4ODs8O0I8Pz46OzY6PTo7Pj0/QD87QUFBPj4/QkBBQkJFPjo1OkFCST9AQkA7TJqdnZ6fnZienZmampySoJWbnp+blZGRlsW+urbDvMbCvr/Ixbe1uLe2ubu0r7e2srWzt7m8u7a7u726w7u3vbe5wLu6uLi1xcHDw7u5s7S6wb2/x8C5wLy+xcS9vrmysK64t7/Dx8PEvb2/v8PDvr/HvLy/tLSutbW8vr/OzcvCt7K4uLi9ubuxtrLIwLu2tLGwt6yzqbCtrbO3r6uuqrG1r7Gvt7O6usC/tre2sru6wLWyrbO3rLC6r7KloqWrrK+5s7KosK+xr6qiqKGkraitrLOun6inpqWmq6Sknqaqo6ayuLOrpZyfp6anrquqpbClpaWbpKOYn6exrLW4sLKOhHl/fHZsdXpwbWhcX19ZU1BBRUhHS0BEQ0g8PTY7OTk8Ozo6Ozo9Pzw9NTU2MTM2OTg8QT5AOz1AOzs5PD04Oj08QD46Oj49Pj09PkBCQkJBRD03NDU9REc9Q0I/PEWUnqCgoJyXmpiYlZmdmZ2fmp2bnJaRj5LDwMK9wrzEvLy7xbu3s7e2tru7s6CWtayvsbS0tLa4ucHAt725uLm2tb+ztLK4sbvBwMO3t62wtbi4uMK6tLu3u77Au7u8rq+us7K5wcLEw768v7u6uLbBwrW/urWur62wvcC5z8rJw7GvtbS0vbq+ubq7ysO7uravsL2xuK+ys7C3vbaur66wt7CsrLK2vbzEwrq9t7bAv8G3tbC2srGzurGxr6err6u2v7e1qbqztbmxp6uop7ausrG1uaisrK+qr7CqqKessayytr20saykqKuoqKusq6i2qaaonqadmKOuvLG7wbSmiYF8gnpzdnZ3bXBgXmVdW1RKPD4/RkY9RkNDOTo1Ozk5Pjw8Ojo8Pj4+Pjg4MzE1Nzg5Pj9BPzs6Pz08Oz09OTs8OTs6Nzs+PT1DQT8/QUJEQkE8ODU4PUNGPUREPzw/iZ2en52Xl5WUk5aZnpubmpuYlJ2Uio6Owb7Dwr6+vrm2usCxtbGzt7fCtbOrrbOoqa61r620trnDv7e6t7a2srTAtrK0uLO6wMHDubeysrK0sre+urO1sry6vLa6vrK0tLSwuL7DxsTAvb+5s6+yvLquu7Szpquorbq+uMvCv76sq7Cvs7q3ub67wMXBu7y3sLXEtb+0uLu0u8PCs7a2sbisqaWrsr23v7+7u7exvL28trGvq6uprbOvsLCrsLSpuMC2sqm0tbC3tq2spqu7s660uMKwsbG1sbK1saywsri4ubi+tLGzrqyxramvrqqyuK6trainoZ6ptr+4ur+wlol9gHxxdHd0dnJsXmJgW11OSEE/PUhDRk1EPzc3NTs6OT48PDk4PT47PT86ODMyNTc2OD8/Qj86OD4+PTw5PDk7Ozo8Ozs6PEA+QkI9QEE/QkI/PDs3OjxBRD5CQz8+QYqgm6GdlJiVlZKYmpyWm5WalY2bj4SIhru0vb+7vLm3s7y8rLOytLS2wLXAr7Kzqqqxt62pubO3wL27vLi2uraxwLq3ubi5u8HBxMO7u7a0tLC2ura0sqy8ubi1uMG6uLOxrLe8wcfDv7m6ta6lrLOwprCtqJ6gn6WttrXCt7a0pairqLC2s7K6tbu7u7W4trC1xLK+vL+8ubrFybq9vraxp6SeoamxrrW5trKxq7S3trGopp6gmaWmpKynq6y2qa+6sa2kpq2lq7GrrKmtuLawsrjBtrGxtbGvu7ayt7W1sry1urKwsbKutLKqrq2nuLWyta2uqqiosrq9wLa0qY6Ce393b3tvdXJtY1xmWFxdUk5NQT5KQkBKSUA2NjU7Nzg+Ojs4Nz4+PDs/OjkzMjc1NzU8PD48PDg+Pjw8OTk5Ozs7Pjs7OTw+P0E9PEJAPz9CQD47Njc6QERBQ0E/QUKJoJ2loJSWmJiVnqCcl5uYmZGMmYmDhoS1r7S7u7S1sLG2uq6wtLOvtbq1urC1s7GttrqurLyyuLm3u7+9ub7AtL+7vLq4vsK8wsrHvsC4ubaytLaztK+su7q4trnAw7aurqqytry9ubaysa2tn6Snp52jpp2WmZman6muuayrq5+lqKSrrq6nr6yvsbGtsa6usLmwtLy+uLm4x8W8vLu4qaKcmJufp6assq6zqaapqq6popqXl5GcmpijnqKir6ekrKaompqemqGnp6anqa+2squ0trCqsK+xqbm2sbWxrqy3s7avrquuq7S1ra+rq7GtsbKoraurs7W3ur2wq6GLeoJ5cnZzbXVpa11aalRdXE9NSERGTEFGTUY4NjY1OjU6Pjg7OTc8PTo7PTo5MjM2Nzc3Pjs9Pjo6Pz48PDw6Ojs5Oz47PTk8Pj1CPDtAP0A/QT8+OjU1OkBFQkRBQEJBiJ+ipqGYm56dmqWpmJudmpmUjJmHhoeGrq2uuLmxsqiur7iyq7CwqrK1ubm+tbK4tLm6tbm7tbWztbu8wLu+wLS/ubm6sbrDvMLKxb+7v7+5tLSzsbGusLm5try4u7+ysrKusa65r6qrrayjqKGdnZ6XmKGVkpWXkJifqK6ko6Sgoqeio6mpoaanpaqtp6ynqKesq6yyu7SztLm6trK2ramgmpaWm52fq6yrr6Ojo6GpoJuTjo+Qk5KSmZaanaSloJ+ep5iVkpSYnqSjoaWqrK2iqaqppKmtrqW0sa6xraqprq+wraWmqqSos66trKmmpqmrpqqnq7Ksr7Oxq6mWgX+Bd3J4aHRzbmRUYGNXXFFOTEg/SFFETUM9ODg3NTo3PD46Ozw4OTw7Ozw7ODI0ODk3ODs7PDs4PD0+Oz08Ojk8Ojs9PTw6OkA9PDw7QD5CQEE/Pjk1ODs8RkFDRD9BQYijpqKjnqCfp6Coqpufm5yZmI6Xi42PjKqpqLGvsK2lp6ayr6mmq6CvsLu1vby4wMG+vLy8ua6tr7Kyurq3t7W1vLSvtKu2urjAxMG7tby9uLKts7CvrK62trK0tK+qpJ6cnJyeqKifoKipn6GnlpuXl4+dk4+Qlo6Xm6SooKCioqKlpZ2jo6CepaCkrKSmqKSio6OrrLOuqa6urqeqraisoZyamJmYm6moqquepaObo5yUkIyOj5CTkJeVlpifnp6amaaXk4+Slp2ioKWjpqSnoKKko6Ghq6uksq2qrKyno6yuraufoaKkpK+srKmmo6KqpKqqpKmrpqmsq6agiHiDfHZ/eWJ3bG5cUGhUUE5HT01MQk9RQD47PjM5OjU7OT07Ojk9OTk8Ozw8OzkzNjk5Njo7Pz06ODs6Pjw6PDs5Oz07PDw9PjxAPT88ODtAQEE/Pz45NDk8N0FDQkQ9QEOOqqSjoqGinaulpqimoZ6dmZ2PmJWTkJWnpKGmqKmlpKChp6uhnKKbp6u1sry9wMLCwL7AuLSnpayqqLWysbCur7Knpq+jr661wbq1t7K3trK0q7K0rqqrr7Cys62lnpKYlI+ZoJ+ioJykpZ+eqJSblpeMl5GNkJeTmJ2iqp+fn6Cjpaicn6ChnKKfo6innKehoKSfrKisrKCpq6agpKimrKOdnp2Zl5qrpqmwo6WnnqCclZOPj5GQmJCWlZiXn5ibmZujmZeUlZqdoJ2nqKWgo6Kho56doKmqpa6upqipoaKqrqqnoaCio6msq6eppqShqaKlqaalpKKmpKijkn18gHV1fW1re2RoVVFjTUlIR05STkpORztEQD0yPzg1OTs+Ozk5Ozg6PDs7Ozk5NDg7ODc7Oz48Ojk8Oj07Ozw9OTw8PD49PUE+QEJAPTc6P0FCQEA/ODU1PDpAQ0BEPkFGlq6koqWeo6KpqKipqqWmnp2imJiZmZWbop6bnqOioKOgoZqgmJiXlqGorK62t7q5ure3u66ooKGpoaCtq6qmqaSpo6SupaystLy3rLKxr7Gtta+vs7Wqp62so5yZlI6RlpeZmZygo6KbnaWemqSXl5eWkJKRkZOal5ugpKqeoaGepqeqop+gp5+dn6SnqZ6jpp+qnaqtqq6nqLClo6Smp6ymoaShm5ier6iusqulqqqgmpiYmJWTlpqTlZWZlpqXl5ignpycl5uhmp6ao6eln6GioqOdm6Gmp6aoraOppZ6kp6mkpaWhpaSsrKmmq6eioKSjpKenoaCgpaKmoIl7gH12eHxkeHpgYlJVX0hJSUtTVElSUEw4PkI2Nz02NTs6PDw5Ozs4Ojw9Ojs4NjU3OjY5Pj0+PDk5PTk9PTw+PTs7PDo+PTw/Pz9APT03Oj5AQEA/Pzg2NT08PkFCRkBAR6CupKaroaOqrK6tp6ypqKCipp6bm56aoJyalZmfn5uen56WlJOXk5OcnqOorq2sq6uvqq+pn5eepZ6epaakoKKfpqCirqusrbWytqavtKupqrSxsLC4raehnJ2alJibmpGOkZWRjI+OlJminJejmZqXmJmUmZiWnZufpaapoKajnqeurqumorGjmqSmpqqioaqiqaSosquxsqu5qKarp6urqaysp6Cgo7GtsbG0qbGvopmcnZ6hmJubmpiZm5SVmpaYnKWhoJqjoZqcmZ+kop6gn6KmnZulpqWkpaijp6OepqOinqaloqWlqKykpq2noJ2dn56gpaGenqWgppmBe4F8dnZzaIJsZVtTWllNUUpOTlVMUkxBNz5CNzg9NzY6PDw9Ojw5ODo7PDo7OTc2Oj01OTw7QD03ODs3PTs9PT06Ozw4Pj09QD5BPj4+ODg8P0BAPT83NTg9Pj1BQEZAQUihqqCrq6GkqquwramtqaelpaWkoKGfnqWXl5SYmZ6YnJ2blo+VmZKSnJihnaqip6Cep6Gln5ySnKKbn6Gjnp2gn6Ogoq+urK+xrLanrbGtpqawrq2ssKegn6Kgl5GUnKGcmZiSk5+doqSbnpuWn5qfl5uinqWhnqSfpKitraisqKSstLe2sKe0rKKtraOvpaSmoamorrWzsr23vrCssa6tqaq0sbCnq6iytbezt6yxtKOgnaWfq6GhoqCfmpiWlZ+bm5ikoaCeo6GgnpqcpaCfnZyhqJ+fp6meoaOkoKagnqehn5ymo5+ipaOooKmrpZ+dnZudmqainpyjnqeQgYJ/fHh1aXd1XWxaUmBIUVVIRlVWSkJNRz1KSDhFPDY3Oz49PDo8OTg6Ojs6PDk2Njo8Nzs+PT8+OTc9OT47PEA8OkA6OkA/O0A+QUA9PDk3Oj5APzo+NzU4PT0/QUBEQEJGnKueqamipamprqimqqWmp6aoqqGlpKOmkpOVmJacmpqcmpWTmZuOk56ZqJ2unqeenKGdnpqZkpmenKKioKCdop+fnp+pq6esqaq0q6utq6Wlq6iqrKqln56ZkpKUmJmWlpaMiIuOlZ2dnZ2elp6apqCgqKWxqqeuo6uttrC0srGutri9wLqttbSwt7CutKmmpKWsqbmztbvDvMPBtrq2q6+xube8r7OwtcG8t72zs7Whq6KpqLGpqqinp5qZnZqqpp+Zp6Cfn6eopaSenaqhop6bn6igpKetmZ+jnp6nnqCmnpycoqGbo6KhnZympaWkn6KZnJukn6CboJyjiYWEfnZxbWl3bWhtXFhbQlZNSkdNR0JGTTw+TD00PDk2Oj0/PDs6Ojg4PDk6Ozs8NTQ6PDg5Pj4/Pjg4Pzk8Oz0/Oz1BPTo/PjxAPj8+Pz08Njs/QT07Pzg1ODw8QERCREFCQ5WqoKapo6mqqKmjoamgpqinrK6lqaWpqpSSl5mUmpqanJiYmZyamJqqoLGit6OwpqCenZ2XmJaZnpucpJ+fnaSdmp2cpKKko6Kqr6ynqaOgoayurqqrpqCenqGjnp6em52clJOVlJ6emJSGnZqhm6ukq7KwubKysbKxur28vLm2uMO+v8K/trq6wMS5vbusrqexrbHCtrjCxsDIysDKv7C5ub25wr24s7vFw7zCu7ezqbKtqrO0r7Ouqa6jnauntrGsoq+loKOvsa2wpKSvo6GgmqGnoaSqqpmdoJmao6CmqKGcnqKemaSenpiYo6OhpZ6mmZuipJ6fm5ubnIeFgXt0cmtrdXJwZ1dcUUVUSERJT0g+RUEzRUg5NTs9Njs8Pjw8Ojo4OTw4OTs4Ojo4Ozw3Oz49Pj02OEA5Ozs9QDw9QDk3PD07Pj0+PUI+Pjc6QUA+PD45NTg9Oz1DQEFDQkGRqqGlqqelqqimn6KnnKasp7Gyq62jqayVkpWalJecoqGbnqCinJ+psqu7sr+rr6ylnqChnZyYm5+gm6Cfn5elnZWbm5+anpyepaannaCgq7Gup6Sko6CepaulnpeclJGZnZiUjIqGiIZ5bYigpKKrrLS8tsO+vrO7wcPCxcC/wsbGxcPIwsDFyM3QyMvDsre1vrK+xbu+zM3FzMvM0se+v8DCvcfGwrfDycjCwMW+ubS5urW6t7C1sqq6sa67tr67uqq3rKqquLq0u66tuKOlop6npaKjqaaZm5+Ymp2nqqegoaGkmJSjlpSakZydn6Sep5+en6KdmJmUmJSIhH16cmtkaW94amVaW0ZKTEREU0xEQkQ3Oj87NTQ5OTc4Pj87PDs7OD48Njo9OTw9OTw9Ojs9Pj4+NztBOj45PT45PT44Nzs6Ojs/Pz1CPj83OkFAPTw9ODY2PDo8QT9BQUE+kqugp66ooqulpKKipaGlqquwsq2upKmmlJWVmpaUm6SmnaGqp6KrrLy8v8PBs7K4p6Ghq6qinZ6hop6cm6CSn5+Qlp+ZkpqWnZuZo6Gvs6mhmp2dn5+al5iXkoyPlpeTjo2Qi4KDgndzcW5wj6atrrS5xbvNx8u/wszOzczHydHMzczHycXGzNDS1c7Tyb3Av8O7xsXIxdHTzNPP09PMysLFxsbKx86/yNDLxsTGxMC7w8C+vr61vbOtvr/Cw8bEx8OtvriyuLzEwcG6vLy1rqenraigoqmlmpagmpmdqKupo6SknpePm4uQmYmVmJugn6OdnZeempOTi5WPhYB5dHNlYmdyb2ZeWllDTkxDRVBJREJANTU1ODlCPTY4OkE+Ozs+PDk+PTc6PTk6PDg8PDw7Pz8+PD0+Qzw7OkA9Ojs6Ojg4ODk7QT48QD8+ODtBQTs7Pjc4Njo8PkI+Q0FAPpOvn6ivpqiro6KloKampKuoq62qrqKqo5Kcl5ebmJujrJ6frqalsarFxszOzb+wwqmlqK2tqqGdo5+cnZqpk5mhkI6gk42UkpeZpLGxq6SgnaCbmZeUk5SWkZCPjIeEg4iHg4CBgYB5cnJvbHmktrq5vsvB09LTyM3O0dPR0tHQ0dHNzs7Qxc7U1djS183Gx8nMw8XKz8rT19HX0tTV09PIzMfNzcnSzM3TzcTHycnAxsvGyMjFvsKzs8fEy8rKzsXJv72/vMHHxMzMyMm/w7+tsLOonqKqo5qTnpyYnqaprKSlppaXipWFkZSHkpKSmZualpiQm5WQjIaRi396cnV1Z2JndmlkVldRRE1GQElRQj1CPDoyM0A8RDw3OTxCPTs9Pzs7Pj05Oj48Oz44Ojk5Oj86Pj1APkA8Pjs+Ozk9PTw5Njo6Pj08PEA/Pjk6QEE6OT44Ojo6Oz4+PEE/QT6QrKKiqaanqKSfop2qqKOso6OnpqyiqZ+To5iWn56dpK6bn7CrqKyxyc3U18/Gu8esrbS4rK6jn6Sjn6CkrJuWqZaNl42MjZemsK6lnZ6doaWhnpuVlJaUin13cGtlYmhxb3F7hYqAdnBucXRwhbPCvsXR0NfW1tLWzdTW19TT0dLU1NLP0cPQ09bX1dbSy8nO0MvGzdLJ0tXW2dXX09bYztLJztHMztDL0s+/x8bJw8vLy87PxcbHtr/Jv9LMy8/Fyce/w8LHzszQ0M/MysfNuLe7qJ+lq6efmJ6jnp2qpa2pqKiSlYiQhIyRho2MiJOVmZCWjJiSj4aHjIR8d3N2b2NgZXJiXVJcSUpGQUVIST47QDg9NDU4NTo3Njo8QD07Pjw7OUA7OTo8Ozs8Nz09Ozo+Oz08Pjw/Ojo8Ozs5Oz89OTU7PD48PD0/Pz46O0BCOzk/OTg7PT0+PzxBQEQ8hqugnKegp6Oim6CbqaSlqaCfoaGmn6ifmKSim6mmoqarmqOwsamotdDU19rSx8bLtLbCxrK2qaKlpqGiq7WnmrGhlpWMkKatq5yVmKGdm6Gin5ydm5WKd2ljYF9fX19eX2BeYmx1c3Fwb2xycXWSxMfG1NXW19fT1s/V1NrU1M7P1dTU0dHM0c7T19bT1dDP0tPRydPRx9DY19jR19LX2dXWzM7PyczRy87Qv8XBx8XNzNDQ0cjLzMDKy8XTzsvOyMTJxsbIy8rT09DVz9LM0sG5xbGlqLWup5qorKWdsqiws6ysk4+TjoiLjoOPi4SQjpmNk4+Zj4+ChYx7enFzdG1hY2ltX1ZQX0pKQkZDUU0/PD40NDo9NTI3NTU8PEA8Ozw6OTpAOjg7Oj46PTg+Ojo8QD08OTs9Pzk6Pz07PTw9PTo2PD0/QD08PT0+OjxAQjs5PDc0Oj48Pz89RkFEPYKknKClnaWlo5mcnaSeo6OfnZ+doJqnnpyhqZ+vrqqqrJ6mrrioq7fY1NXZ2dHO0MC8zMm3wK+nq6mjpLG2s6O2qp+doaqpoZiWmJqbnaGemp2elH5yZWNiX19hX19hYF9gYF9gZm1wcG5rb3J3d5vMwNLV09jY1tnR0tLXz9POy9PN1dTRys/M09bS0dbN0NXV0cXR1MrQ1NXWztLQ2NjY18vIzcPIzszKy7/Jv8fIzc3PytDNzsvOzsfKz9DKzsrCyMbJzMrL0dLM09HQz8/Kvci5sK27uLWqtrCtqLits7+7sZqPn5SRjo2IjpCFkY2ZjJGRlY6RgIWIeXZvcG5rYmVucGFXXFpJRkZETFdFO0A8MzM8PTg2ODU1Oz5APTk8PDg8Pjk8QDtAOj04Pjk4Oj88PTg7PkI6Oj08OkE9PTw6Nj08P0A9PDs9Pjg7QEE9Ojw4ODs+PD4+OkVCRT6Bn5mlp6Cfo6eam5+cl56eoZqdmpyappufpKeeuLa1ta2lra6+tLHA2dLX2tzWz83Lw9PQwsKyq62urKazsbirs7epo5+clpSXm56fn52UlpeViWxeXl5hZGJgYGFhYGBhXl9fXl1ibXJvb3N0dnZ5pL7L1dHW1NPY1s7O08vNzsXOytLSz8bOzc3UzM7TzcrX1dDM0dPLy8/R08nO0dXS1dXKwMnBxczCyMnCzMLFyMnKzsrMzM/N08vFx8/Mx8fKxMbAxcnLzc/Qxs/Ozc3Mz8XHwLe5vcLDvcO5srO+sLvDxLWpmKWhmZaRlZWSi5SNmpGUlI+PlIKJhXhwcWttaGBgcWhYWGhWTUdMSVBQQjtEPjs2Nzo4OTo1Nz09QTs6PD05PD05PT06Pjo8ODs9OTtAPD47Pj5BPDk9Pj1CPTs3NzU/PDw/PDw7PDw4O0FAPDo8OTs7Ozw9QTpFQUU+hJ6bqK2epKSqnJ6fmJKXm5+am56ZmaKVoamppcXDwb+7tbKxx8O5y9XW2drb2M3Mz8nW1sXEuLK2qqSurLm5sbLAoZeOjZiWkJOSkZaWlpCMfGViYmJgXV5hY2JgX2BgYWFgX11bXWdycXFyc3FtcnmkxtPPy9DP1NXJxMnJxsa/w8XOzsfFx83K0cjLzs3G0dLPzszUysfKzc7Hx8/Sy9DPxbrEvsbJvMLGyM7EwsfAxs3Hw8vJy8/Hw8PPyMbBxsfDvsDHy8vLzsLKy8jHy8/Exce7x8LIyMLPwL28v7DByse6vaqwsqelnaKcmJCbkKSZl5mRlZiJj4J3bnRka2BeZnFhW1dgR0hIR0lNVEc/Sj02NDM1NT08NDg9PT06Oz08OTo7OT89OTw7PDg6PDo6QD1APD09Pjw6Qz48Pz04ODk6QD4/Pjw7Ozs7ODo+Pzw7Ojc5PD49Oz49RkFDPYOgm6qupa6qq5qdoJeUjpedmpmgmpqcm6WzsazJzcrIxL69us3NxtDV1dna29jQytDQ0tTKxbq+vrCot6u+ubmzpZKOjpaQhoOEhIJ+hYV/dGBbXl5eYF5gY2RjX11dXl9gYF9bWlxha3Jyb29rbG9vfbjRyMnKz8vNxLq/w7u7urm+yMbCw8DDx8rJyMrHwcXLxsjLzcnEwsrJwcLL0MTLyL+5wbrFx72/xs/Kw7/DusnHyLrHxsTKwL3By8bFw73FvLy/w8TLxMS8v8nCxcfRxcDIv8rJxsfG0MPDxsOvxMvHxMq3v7y6tKmspaWYn5iso6GlmqOgm5R7dnJ0ZmlaYW5tWltYUURMRkJHRExERlNANTQzMzQ/PDM6PDw7OTw8PDg7PTtBPTo8Ojs3Oz05Oz07PTs6OD4+PEI+Oz88OTk7Pz07QD48Ozk5OTk6Oz06PDo2OTw+PDs+O0NCRD5/pZypsqm0rrCdnp6YnImUm5man6Kfmp2ov7i8ys/RzMfCw8fNz87N1dDW2djZ0M3Uzs/Qy8S4xsG2tbyxwLe6rZGMk5eHe4CFhoB2eHVycF9aW11gYWJjZGRlZGBcXF1dX15gW1laXGJvcm9raWxwb3OPxrzJxczAxsGwtrqysrSyscG8u7u5uMDBwcW+vbm9v7nEysXGwr3GwLe7xMm/wsm7t7q6xcK+vMHNwsa+vbXAvcO6vMa7wrmzvMXDwsK2v7W1vr+6y8O8tbrIur+9y8PBxcLFyMXIxdDGwszHssbJw87NwcXCv72yt7Czp6ioubGlrbCrrayUeXZ3amVoYGhvY1ZeWUpFSkZIS0FGQkVJQDk6NjQ4ODUzOzo7PDk8PDs5Ozk6QD46Ojw6Nzo7Nzo7Oz88OjxAPUA/PT8/Oz07O0A8Pj4+Ojk5ODk3ODo8PDw7OTo8Pjs7PjpAQEU+fqygrLWqt7SyoZ6fl5qNlJaan52mop2et8bCxMjO0svKysfNzs/SydHG1tXW2M7M0MjNyMrFvsrBsrW6t7u2sJGNiouFeYCGhoB+hHx0dWRcXF1eYGBiY2JiZWViXV1bXF5cXl1aW11daHNxbWdnbnByeZ29zMDDusC4rbCwp6qtrKe4tLa0s7KzurW9sbewtK6yu8K8wcS8v7q1srq+wLjHuLS7tcDCvLe9xsDDu7Susra6vrPEt7u1q7i8vcC9sLq1r7a6ssW8tq67v7S2tMW8vsPFv8PExcfLxcDGxrvHy7/PycfDxsHDt8O+vba5vsa/rLW6tbe2jnh0eGZnZWJrbl5WXmBGS0hISkZCQ0FFRT88OjU2NTYzMzs6Oz06Ozs6Oz44PEE9PDo7ODc5OTk7PDo+Ozk+Pz1APz5CQD1AOjo+Oz89PTk6Ojo4NTY7PT48PDo7OT49OT86PEBAPIi3pauzsby8sa2foJmUlJiXnqujr6qnpMbLzsjGyc7M0M3OycvJzMrLxtHP09HPyMvGysbEwL3PvbO5vbm4t5yOh4mJe3l+hoZ3eIJ9dGheXV1dX2BfYGRhXmNlY19fXFteXF1eWltbXV9scG5oZmpubnJ8pMe/ubi1sKusp56iqqeeq6yzramrqbOttrCyqK6mrLK8urbDubq5sKu1ubu0wrqwv7C9vLu1u8e5wratqqiwscC1uLyvsKexs7S7vKuttaWutq66sbCqua+tu667uLu/v725wr/GwsXAvMbByMu4xcfFv8fDw7rExsK7xcnMy7O5wry6sohydnZraWFibGhZV1dbQUxLTUlFQUM/RkE6OTo5OTU4NTQ6Ojk7PD07Ojs+ODtAPD05Ojc5Pjk7PDo4Ozs6Pj45QT0/QD87Pjo7PDo9PDw4OTg5NzY4PDw9Ozw6Ojs+PTs/Ozs+QDyKwKuouLe5w62zqZ2ZlJaZoZymsLWxt6bGz9LMxMbBxdDIz8LEx8HGxsXFzMTLzMLEwcjBury7yre0vL22tauRiZCQfHl+ioV6e4SBd25eXV1dXV9gX19kY2JjY2JgX11bW1paXVpaWlpdZG5vaGZnaWtucoGtubC1rqalp6eaoKSgmpylq62jp6KrqayqsKOmn6qttbaxvbmvt6+orri0tLy4s7yut7m0sbvBscGupamirLGys6e8qquoq6yttLSmqK6hpK6psqWnqK6lqLessLK3ubq7sby9vr7Ev7XBwcfIt7/AxbfEwr+7v8TDvsTIzMq/vsPAwKmGcnRyamldYW9kV1ZYUEhaUlNLRkZFPj9AOTc4OTc3NjQzNzo5OTo8Ozs8PDc7PTs7Ozw4OT44PTs8Njo9Oz89N0E+P0A/Ojw8Oj05Ojs6Nzc3ODg3OTw7PDs5Ozo8OTc5Pjw+P0E7jMKvrry3usSwtrCbmZWcmKqpsLGztb2vxtHQzcTIu7vMw8zAvMq5wMbAvMy6w8fFur3Evrq3vca5trm7rrKVg4mNgXt+gH54dH98c3dmX11cXF5fYF5fY2NhYmBgX15dXFpYWVtbWVhaXF9ma2ZlZ2Voa29yhaqlrKagnKGllJ6km5eRoaOqo6KfpaWnpKyfnZukpqyyr7a3p7Csp6q0q7S5sLa0rLa4sa+6ubG3pJ+jn6exp6uouaqkpqeop7KtoKemnpukpqyen6ekn6Cxra2ssrSys7C1vLa7wcGyur7DwbK5usKzwL2/tbi7vb68wsfEwsO+v8Ogg3dwa2FlX2tvYFVZX0hOaE9UR0VKRjw9Pz06Ozs4MjU1MzY5OTk7OTo6PDo3PD88PDs8ODg8OTw6Ozc4Ojo8OTg+Oj89OTg8Ojs9Ojc2NzY3ODg2NjY7Ojo7OTo7PDg1OTw6Pj5AO43Itba9uLrBu761oJ6UnaGmurars7O7s8XQyczDx7m4ycLOwbrLub3Iu7fIu7fExrO+xby3sLnAu7Gzt7CihIeHgn15dnRvbWtqanFpX2BdXFxdX2BfYWNiYGBgYF1bW1tcWFlYWFhWWFtdXmRjYmVnZ2dqbW+Inamgl5WaoZabopiVjZ6hoqabn5+jpaGnnpqim5+qsK2xtaKpqqmrrKS1uK23r6yytK6ytK6wqp+dnqOisqSlqbitoaamn6isq5mfoJ6ZnZ+lmpmjnJudr6mrp6qrrK2wsrivuLm7sLa7u7qrsrK5sr20trGxtbS/tb3AvcPBurq9l4J6cmtfZV5kZFhUWF5JV11LUEdJSkZBPD8/QDs/PDA0NTM1Ojs5Ozg5OTw8Nz4/Oz07Ozg4PDg5ODw3ODo7Ozo7Pzo9Ozc4PDo9PDc0Nzc2NzU3NDY2Ozc5Ojs6ODo5ODo7OTo8PzuJyba4vru3wcHBtKSkmZqkpsCyr7astLfG0MnJwce8vMXF0MC8yru7wbu2xbi1wcGzwsS8raq1ureosbOpi4aIgHlzbnBua2JeYmZmXV1eXV1dXF1fYGFiY2NiYV9cW1taW1lYV1dXV1hYWFteYmRkZWZmaGlrco2onZSUlJuYm6GWlpCcoaGonZucpaahpJufoJqYra6trrKgpaKtq6ehtbCxsaynrrKnubOmtaGinpqjoq2ioam1qqKjpp2lpqOWmJ6XmJqdn5mXnZycm6yhq6ajpKatq7KzqrSwsqqyubSvqa+ysrK3s62prK6xt7C6trm9v7aysZSEeXVlXmVeW1lWU1pVS1tRTElFSEtJQj0/QUFAQDoyNDUyNDk5ODk7OTo9PDY9Pzs8Pjs3Ozs3Nzc+Njo+Ozo4Oj07PD06Ozw6PTs4Nzk3NDY1NTQ2Nzg1Ojo4Ojk5PDg3Ojg5PkA6gci9uL2/tr69v7OdpaOYpbHCtba9rbS4w83JyMHGuMLByNC6w8bAtry9tsO6tr/Btbu/u6qmsbuxqLKvm32FhYB5cHF0cWhmZGllY1xcW1tdXVxbXmBhXl9fYF5cW1pcWllYVldXVlhXWFhWV2FkZWNkZWRkaGp2opyUlI+Ulpefl5mUmJ+eoZyWoaGoo5+dqJyamqqmr7Crm6Ojt6qgn66otqmmpqywo7ewo7agopuYmKqmoZusuK+ioaScoZ+gk5WhlJaWm5iXlpeclJ+pnamjoZ2jqqqwrai0q6qmrbKwpaqusrGvsK6up6ensq6xtK+8tLm2rqOUgXl1ZF5hVllXU1JUS01eTFBLR0dMS0U8QD48Qjw7NzY1MzQ5ODg5OTo5Pjo4Pj47PTw8Nz49Njc2PTc7PTs5Nzk7Ozw+OTk6Ozo4Njc2NTQ1MzEwNDU2Nzk6ODo5Ojo3Ojs5OT1AOnbAvLS5wrG+uLyunaeno6q7wL3Aua60uMLNyMfExb7HusrNtcTFxbG/wLnAwbrAwLm6vbeoqLG7pqmipYmBfnhyamxydHBpaGVkZ2JcXFpZWlxcXF1eXVxbXF5cW1xZW1xaWFZXV1ZXWFdXV1VbY2NiYmNiY2RmaoGWk5WLkZSTm5mclpaboJyflaCfpqWkpaaenJ+kn6qvpp+io7aooKGiqLOhpaekr6WwrKu0nqCdlZSpoaGUrLGwnqKinZ6Ym5OLoZSRk5eYkpeXmJadppumoaKZo6Wkq6SlsKelo6urraWorq+uq6iqqrOlpquvtLGuvLWxr6+gknp2cmRhXFpdWE5MUUdSYU1WUE9KTU9FQkQ/OT02OTo3NjQ1OTk7OTg4Nzs4OT0+Oz47PDY5Ojc7Njs3Ozs6ODU6Ozo7OzY8Ozg4NDY4NjMzMjEuLzI1NTY7Ojg7Nzg3Njw7Ojs7QTh4u7uxtb2wu7K3rJ6kp623u7zBxbqxubXFysvBxMfHybjIxrXFwsmvurzCvMPAwb28t7q2pqeytp6iipmIgHdvZGJnaWhmaGpnam1gXVxbWlpZWlxdXFtcXl9cWllbWVlaW1dVWFdUVFdVU1RSVWBgX2BhX2BhY2RpgZSTiZGOlJKTnJSVlqOZoJacoKWhraWjo6KjoZuqqqWZnqWxqaCgnaSqnaehnqysqaitrKKhoZSXo5uckKupsJufop6el5iTip6SjZKTlY+YmJKboaKcpKChlaCho6Wbo6uloqSqo6uupK2xqaalpqa0pqmorbO1tLm6r6qsnotycG9gW1dWVVFGUU9IWlxPUklUS1NMRUdJQzg7Oz08ODY2Nzo5Ozo5NzY5Nzc6Ozo9PDw2Ozw4PjU5ODo4ODY1OTo7PDk3Pzw5Njc4NDUyMTIxLi4xNDI2Ojg2OTg1OTg5ODk7OUA5e7W0rbS7srCssq2dp6evubmzwMi6tcCvxsnOu8LLzcm3y7+0wMfMsLa9yLvCx8S9v7e6taWrsK6dmoeOg3x1aWpqbWhqbG5ra21lXVxcW1tcWlhaXVtbXmBgXFhYWllYV1hXVFZWVVRVVVJTT1FZXVxdXl5eX19iZG2Oj4SRho+RjpmTlJKcmqKcm6CnqKqnqqWopKOYpK6klJmlr6mfm5iaoJ6umZuqs5+lpp6io6CUk5uWlZKoqa2anKChoJqUkIyZjouQjJKMlpSQnaGgo5ybopWboKKgl6Koo6Koq6Crr6Stt6Wjo6Ksramoq6+zuLK9tbOrr5iDcnJoW1hZU1VSRVlMUFxZTVROUExQUklOSUI8Pz9BPzw2NTc5OTw8OTg3Ojc5Ojs8PT47Nzs7Oj02Nzo7ODk3Njk4OTo2Oj05OTU3NzU3MTE0MS0rLzQzNDk4ODo6ODo6NzQ4PTg/OX6zraiztq6pqK+tm6morLe2rLzKu7a/rMzHxrnCz9DJtca+ur7Gy7WxvcW9w8bEvcGzua+mq6+rnpeGgXd4b25pbm5ucWdnaWdkXVpbW1tbXFtZWltcXF5fX1xYWFlYV1hXVlVUU1VWVVVUU05QUVlaWlpdXFxeX2Bkfo2Bi3+LkIqSjZeRl5mioJufqqmmraqmr6KnmZ+soJWWpKinnZePjpmdrpaXp6qZn52TpaCdkZCSkpKVp6qkmZmanZ2WjYyLlIaIjYOQi5KUkKCeoKOXlZ+VmqCinZObpaWnqKigsbCmsbynn6OstKutp7C0sLi1wLGtsauQfXByYlZUVU5SSUdWUVNSTExYTUpMTlJHTUtBQ0ZEQz5ANzU4ODk7OTo3Ojo3PD06O0A+Ojk7OTo/NzU5Ojk4NzY5NTg3Nzk7ODU1NzY2NjEzMjAtKi4xMDI4Nzc7OTk7ODk0ODs4QDh/s6ymsbeqpqKwq52qp6mysaS2xrS5urPLxrq8w8vRzLO5ur7AxMe2tLe9s7u8xL7CsbSusa6xrJyiiGtobm9yb3FrcGtkZmdlXlpZWllaWlpbWlpaXFxdXFpYWFhZWVdYV1VVVFJTVVNWVVJOTk5SV1haWVlZXFxdYWqAen92iY6HkImYiZSUl5uZnaibn6qkpKqcp5igpZuSj56impeWhIORmqOPk6KclZWWh6GampOLjoqPmaOnnJWVl5uQkoeUjoyBi42AkIqSkpGhmp+hlZOYmJWipZiMmaSmqKahoLSyp7K3oZ2it6yqraSysqa1vLWrq7GjiHhybV1OUFFMT0NOTk5QS0ZOTktKTk1RSE1KQUdLSEhDPTg1ODg4OTo7Njk6Njg7OTk+PDg6Pjk7Pzg3ODk6ODg2ODU3Njg4OTc0NTc3ODIwMzAxKyktLzEyNzc2Ojk5OTk4NDk4OEE3d7anpLawpKekqaWgqaWks6qissO1tbKzx8e4u8TKzce1r7y/uLzEs7OutqKttcS6u6+qrLSvr6CXqH1eYGdzcXZxam5pZmhoal9YWVhYWFlZWVpaWVtbXFxZWFhXWVlYVVZSU1JQUVRRU1VRTk1LTFNXV1ZYWFlYW11hb3N2cISIgoeAkYOOipSRk52gjpqboqCjmKSWoZuVjYeYmoxzjYJ9jZaWhZCZkJONjnqYjpyMgop/iZifop6Qk5iWhI6Ck35+c4mNepCGkpCQnZqZmpCVj52OoqOOiZqgoaSjm6K0r6yvrJ+YpbmmpbChsK6csLuqqa+qmYF2cmJWTFFPUE1DU05MUU1DUFBISU5TTUhKSkRKTEVLSzw3NDk4ODg7OzY5Ozc6PDk6Ojs3OT85PkA3OTo8ODk3NjQ0NDU4NzQzMTI0ODUvMDEwMikoLC0xMjc2NDc4OTo6NjU6ODdBN3e3oaO0qKWlqKOmpaamprOnpbTAuLC0sMrGubrCz8e/ta+9w6+xx7Ktp6yVpK6/uLGwn6etrauWlaJyV1ZfaGdpaGluY2poZ2JcWFhYWFhZWVlZWVlaW1tbWVlZVldXV1NUUE5QTk9PUFNUUk1NSkhOU1NTVFVVV1lbXWlscm1/hXx0Tlhyj4KXho2cl4qTkJ6XnJWUlpSOlol/k4lfO1dve4uTiX+LkYyPhYZyioSWgXmCeoWTnZSDlY6Qj4KGfZJ4cW+FjH2JgJCNj5eZmJOKj4iciJ6Xh4eWnpqhoJenr6itqaielq20oqatmKyrmKezoamto5J9cW1fWk5TUVZMRFRKUE1MRk9PSUVMUU1LT0pJTVBGSUg9NzU5OTk5OTo3Ojs6Pj44Oj09Njo/OD4/NTg5Ozc5Njc1MzMzNzYwLi0vMzQ0MTEwLy8oKSsrLTM4NTQ3Nzk8Ojc5Ozg2QTl4t6CjrqGmpqqgp6mnoqmwqKe0wbmxtbDJw7m0v8/AurGxuMSrrsmup6Oehpuiuq2nqJampaShl4+WaVFNUlZaWlddXmJnY19ZV1dXWFhYWVpZWFlYWVpaWllYWFZXV1VTUk5MS0hHYlxNT1JNS0hGSE5RUU1QUlRWWFpgbW9peoJ0UEJAf5WRkX2JlIyEio2ajJaVipKIhpWGeYh/YEpRbniKkYR8hIyJhH9/bn5/lHd1dniEjZlwUY2IioZ7fniUdmd3hYd+iYiVio2QkpaLg4mHlISajIGEkpuWnpyUpKOnqaWjnpuxq6GkpJCmqpahqZyipqiIdGtlXVtIUVFTTElVTVNJTExQSUdGS05MTVRLUVFPRklDPDc2OTo4Ojs7ODo7OD4/OTk+PTc7PDY7OzQ3ODs2Nzc1MzQ0Njk2LzMvLjExNTIyMS8sJykrKiw0ODMzOTc5Ojk5Ojo6Oj85dracoqedn6Guoaeopaeor6yqtry2uLazwry3qLrJubepqre4rbbAqqKbk4OPmbKfopqNoJaZlJGLjGVNTE5OT0xNUVdbXFpYWlVVVlZWV1lZWFhZWFhZWVlaWFhWVldVU1BNSkVAQJtrc3NJTUtERERJTk9oWU5RU1RVWm6DdHd+amldVY+JlIl0f4aBe4WMkoGSmYuPe4aPf3V/eHNudXB0jY2BeX2JqoV5emh2e45wcm14gIqMknh6gHuAdnJykndndYSEhIR6lYmIioyLgH+Diox/k4N7gI+YlJuVkZ+dqJ6foJ6gqaWfnZiMp6SToJ+VnZ6kf3FnYFxcSlZPUUdLWFJPSkxNUkpKSk1QSExRTFJUTUVIQTw3ODs5OT49Ojs8OThAPzo6Pj03PT03OTkzNzc5NTY3NTI1MjU3Mi8yLiwuLzIwMC8tKygoKS4xMjYyMTk4Nzk4Nzc1Ojw8N3aumKOhmJyes6mvqaWsrLCxqr20sry4trq1sqC3u7OrnZ+tq6y1s6WelpKYhpSklp2Mg5eJj4mGhoNmSklKSUdGSEhQVFRUV1dTVFVVVVZXV1dYWFhYWFlYWVlXV1VWVVNQS0Y+OTNOPH6eTUhKREA9QURqlH5MT1FSU1ZedYN9eWd3jZeYjo99Z3mBdnh/iY98hJiSgXKHj3x2e29rfq18c5CKf3uGkoB9f3RmdnyFbG9oc3yJjIeAbHlxfXBtdY9xaHGAfY5wQ4qEgoOFfnd3eouFfYt6dX6Oko+YipKam6OXmZ2bnZ6inZaNiqSbj52XjpaYjnVta2VhWVdYVFFKUlVUT1BOUVZLTktOT0pRT0lOT0tGRDw7Nzk7Ojo/PTk8Ojk5Pz87ODw9Nzw5OTk5MjY2ODU2NjMzNjIxMjI0LiwsLS4uLTAtKyonJyouMTM2Mi84NzY5NjY1Mjc5OTV5ppefnpagpq+srqunqbCvsay8uKy7vrmzraibsaitnJCXnqesp6SbnZOIln6OlZKVgHyKeoWAf3+BZUpHSEZCQENESUxMTVFSUFFTVVRUVVZXV1dYV1lZWVlZWVlWVlRTUUtENzhmNzA/qGlOSEM9OzpEioV6WkpOUFFUWF5lcHJtiKeqwH51eWJ7eG98eYiPeXyLhW9tjJF4c3hqan+CcpaRi4F9ln9JkphuaHd+gmxpY2x5hZCShmtzbHxucnuGaG1wfnONiIOFen1+e3ZvdHOFgnmBd3B8joyKk4OWl5iakJOWl5mXnpeMg4mfkYqSjIaQln1saG1ubVdVV1RRUVlPU1VUVFhVTU5ITUpNTktDSU5HRT86ODk7OTk6Pjw5PDs6Oj0+Ojg6Ozk/ODY4NzI3NTc1NTQxNDQyLzAyNCorKiotListKigqKCcsLTEyNTAsNTU2NzQ4NUhBODk1d5mRm5manqStr6Ktqqi1r66stL+rvMK/pqOalaWYno6FjJaipJualJePdpF+hYuQj3x4fnR9eHV3fGZPRUdEQDw+PkFGR0dLS0tNUFJSUlRUVFRWVldXWFlaWVlaV1ZUU1BMRTFAmjMganJBmW87PDk1PICChl9JTU9PUldaUllcYKeIYpppdHplfnBtf3qLiHWBiIZ0bJmRdHN7amudjkx5hJKJhI5nMXaGc2x+fYN0ZmV0foSEhYBmaWx1a3B/fGdwcHtuko2Oe3N9fHFwbnVtgn53eXRpeYmCiImDlpOSkIuNkZSVj5eOgHmIl4iGiYZ/kId1aWluZ2NXUVlXWFlbTVBVVlpZTklJRUpKSEdCQUZEQ0c9OTk4Ozk6OTw6OTs6OjpAPDk6PDk4Pjc4NzcxNTI0NDUzMzY0NTAzMS4qKispLCwrKykoKycpLCwyMjYtKzU3NzU0NzhpTzg7NW6SiJmRmpakqK2esp6muq6rsrDCsrvDx5uXj5SZi46GeoWRmpaPko6SiXSKhHeLj4x/dnd1eHZveHNpVUZJRD88Ozk6P0BBRERFR0pMT1FRUVFSU1RVVlZYWlpZWFZVVFNQS0U4MC9cYLNHOVhQOzk0NDGWuotITE1PUFFWTEFJUUlir7OgcXx4bX1tcYOBhYF5hIaGeXKglHR4gHN1lIc1cZ2onY6hoYSihHZwhnyGe3OMrY2IgGhmYmltcW1vg3Vpb1h1b46akXZsf3p8bXFtcH96c3VtYnaEf4aAhZCRiouJkYuRjIuPg3V4i4+AfoKAfY94cG5ual5aW11bWVhgX1NOW1pZWExISkZKRz9DQUJHP0NEPTs5Nz07Ojs7OTo5OTs6Pzw4OD06ODs2NjY1MTEyMTM1MzQ3NTUzMS4vLCwrKSopKSoqKikoKikrLzNETTIxNjY2NDM8dlI3PTdikoGSiJaRnaSnnq+VpbSorbGuwbO6wcaXkIyUkIGJfW6CkZOKhIuIkIh2hIVvmIqMf3l7e3F7dHxrb15KUEc+QDc0NTg7Ozw9PkBCRUlMTExNTlBRUlVVVldYWVhWVVRTUExFPDUqnUtbQC1nSTk0Lz+Sg6muX0dMTU5QTDdDTVJTREqGdoB8fHZ+bHaIiHx9hYN/jH52opl5foaAhJmFm5xhhqqfnYuCkI16dol+iYeOc4qXj4N7XGRxdHp7d4psZ2lheW+Fj4J6boF3c4R6cHN5d2tuaV13h32HfIiHj4CLk5eDjYaNhn1xhH+EfHV3e32IdG1xcmRlXlpaXVNbZl5YUVVZXFZHS0tFTEc/RkBEQz9BQT06OTc8Ozs9PDo6OTk7Oz0+Nzk+OTk4Njc1NDI0NDAwNDY0NTY1NC0sKSsoJycnJigoKSkoKCsrKy8wMFVxPDIzMzMxRX5XND05XIx3iX+UjJGdnZ+mkaCqn7Cpr8Cxu8a6lo+RlIh6hnZrgIySg36LhZCNeYSCdaKGjX5+goBzg4F9bHlsU1hMQUUzMTEyNjY2ODg6PD9CRUdGR0pLTU9QUVNUVVdWVlZUU1BNRkA6Mj0gI5ZjjFs1MzExaT9Hb0lGSUxNT1JMS1RdWVJKaYSIe4l5e3F8j4x7fImGfpeHdqGZiIePkpSljaypSIatr6+KgICTioKLgoSRqIeAmJiKnHNsfIGGh32OaGdneH5thYaBhXGEhkdrgHdxeXZobWtfd32DiH+IhYx6lZ6ciouJkX97dYt2fHdtb3d+fXFxcGpaW1taY2JXZ2VcVVBRWFpRRExMR09JQ0ZDQ0FAQ0E9OTc4Ojo6Ozs6ODg4Ojo/PjY7Pjc1ODU3NzMzNDQyMzY2NTY3Njg7REZMTU1MQzcrIiUnKykrKywvMDArbnUyMjQyMEyBXDU9PF6EdHx+ioWHkY+WmJKXoJ2soaa4r7O9tJeNkouYi310cH+Kk39+jYOUlX2Gf4elh4mAg4iGeYmLgHWFeV9jVkxDNjAuLzIyMTIzNjY4Oj0/P0JFR0hKTE5RU1RVVFRWVVNRT0dDPzgwLCOHWz4/ODQuXZZwc6NVRklLTU5QV2BZcFpcXmqNk4eVgISChZGTfoWJkYGaloKgoZiVm5qlrZOZu7Gnu8fDp4qMoaWOk4mBkHtyg56fkZx+doWFi4+HkGlob4OAdIyGhItxhoJ3h397doV9bnZ1Z4GUj4aJiIeJiKGro5aJjpiAe4KJenpvZ2t4fXd8cWljXFlZXGhcYWZfWk9MTlhTUUlQS0ROR0NKRENBRERBPDo4Nz08Ojw6ODg3Nzg6PT04PD02ODY1NjYyMzQ0NTU3Njg2NzxCQj88ODo+Q1FeZVxHMicmLCwtLS4xKD+MWy4zMTBPg180PztudnBneIN7gIyAgZCPi5qapJyhrKarr7CXkpGEoZSEeHeAjZR9f5KGk5Z+ioGSm46EgYKMi4KKjoSAioBtcGpeQ0E0LS0vLy8vMDIyMzQ3Nzk7PT9CREhKT1FSU1JTU1RSUE9IREI8ODcvOUM+PDw2My5sk5dNUEhJS0tLTlZgY39nZ211nZuPmpOTi42OmoiTj52LoKGSo6mlo6yTqLaip8HCrsiveLqUmnyMoZ6YhJOEgo+hnpOZkoSKhY+YkJZscHWJi4GVjI2Pdo+EcWyFgYqWkoOFiHKJoZeHk4mPkJeltqmbjZWig4eThH5/a2psfX59f3FfW2JeWWZqXGxrX1hLSFBTUU5NTEZJUURETkZCQ0VHQj46OTc9PDo7Ojk4Nzc2Nzs6Nj06Nzg1NDU2MzQ1NTY2NjY4NTU2MzEwLiosLCkoKS46UGFcQCwoLSsrMCwncog3MjQwT4RiM0A8dW5nWXCDcHWHcXaRhn6XlpqUn5+bp6CqlpOYnmhmpJp+hZOSeoGSiZKSfYuFmZKRg4GBi46JhpGHhIiFeHh/aE5SPi8vLiwvLi0vMDAwMjEyNDU3Oz9DRk5QUlRQUVFTUU5QSUVEPjs8OkNGPz48NzUyPD9SNUhISExMTU5SXm+KfHOBfaCdm6emopmhl6KVnJ+onqmrn6isqaq1l6u/q7bIybfI0c++m6BwaaupnoSTkYWcoJqamaeRkYiVoZmad3p+lJiRoZKWl4GUnnt2lZKrs4mNl6B9lZ6cjpOWmqSjp7awnZGZqIiXkI6BiGxzc3t8eW5mXltfXmFnY19nZ1xSRUtLUU9JSk1GRk1DSExGRkNCR0RBOjg1PDw4OTk5NzU2NTg+NzU9ODQ3NDU3NTQ1NDY5NTg6NjE2ODYzLzAuLSosLy4tJyMqO1hiQigqLDEtKEuXXjA2M1GFZjNBQGliXlBxdWBufWF3jn18lI6Oip+Sl56WnKqYnqpCRH2HiYiYjXmCjYuOjXyKho+QjoGDgImMiYWThYKGiYGAh3dfYlA0NjAtMS8sLjAwLi8uLjAwMTU+QUFNUVJTUFJTVVNOU0xFRUA8Pj1GSEBBQDg2NjI8OTtGSEdJSU1PUVlthpB3lYujp6q1vbilrqysqKm1rLG3srKtu7GzvpyzxKy7ycu4w7+3paOwsqytqqOKlpiFpaagopiCppmNoqqnpIeFk6OgoKqhpKmOnLGLlaOnt7ucoaOwk6Odo56RpKKrsK6ztaKVpqqJmoqSipV6e36De2VeZlpjYF1iYl5mZ19bT0RJSFRPRkhMRktHRkZIQUtGQ0ZGQTs4Nz08ODg6OTc0NjU4PDU0PDc2OjQ0NjQ0NzM5PDM4PDIwMjU1MS8xLi0qKi8sLSooKiYlNVhYLywwLCwwhIE4NzFQhWg1QUNbWFRMaWNXanBYeoV2gZSFiIKbg5KRjJLayJ2Wc1aXiI+InI98hoyPi4p7iIOHkY6DhYGMhoWIkoaChImGh4eHcW5hQEU2NDwzLzExMC0sKy0xLy00P0RBTlZRUlNVVVdVTVxRR0dEPD4+RkhDREA4Ozw1Qzs9RktJR0hST1BXgZOghK6js6qywcfEq7PFtq20wLO4vra/tMG2u7ukuMaptsnHtr65tKijtK2wsZuZkpqfiaevqqSVd5+kl6GrsbOYlqmtqK61u7K6rK+1orGssrW8uLWutaCoqKOom6mwrbO6uLionLipjaWPkpOghnmBgHJXX2JVZGBgYV5fZmBbVUpERUxWUUlKSkVKSEVBQEBLREJNRjw4Njc7PDk3Ojk4NjU1NTcxMTw4ODk1NDY2NDk3Pj0zODkxLjAxMjExMzAsKiwuLCsrKyooJyopRVowMCovK2iSTzYwUodqNkFFV1FKTFxaUWNkV3p1cYGVfYSGk3aGfoCNe7+7o7yCtJSTjpuPhIiPk4qJeoeBjJONh4WBjoCBio+GgIaIhYqHkXp5bl1XQEVOPDY6NDZBQjc2NC8vNkNIQ1FcT1FVWFVcV09fVUlLSkFAPkdLRkZEOz5AN0Q3P0JKSkVHV1RQXo+kraSytMO2uMHMyra7xL2ztMG3uMK1v7C4dLG0prrFpLDGubGzsrSopLa2qrGgopabopKlsa2lraynpJigrLO6oqiyubW7vsy/xcW9vbPCt7q4v7i6uLqtrbGmsaquvrC9vMLDrJm7qJWuj5iYq4l+gHloVWFfVmhjaGRWW2NZVlRKR0dMUkdESUpBSUQ+P0JCTEBATUQ5OTY2OTo/Njo5OTY2MjQ2LzE5NTk5MzY0NjI3Oz0/NjoxLi81ODo5NjUwKigsLS0tLCwqKCgrKyhFUy8qMDBKj2s1MlCHbTY/RlJMQUxSV1RZVlp3anB/j4SBjoVve3J4iGK5oZmjiZWUlpOUlI6Ql5KHh3uHgY6WioGEgYp6fIuIhnyKgoGLhJV9eHp1ZU9cZEdFTDpRZGBbXlNGPztIUERaY1FRWVlaZ1pTYGFNU09FQT9JSkhFRkFAQzxENkI/SEdLTVNaVF6Ur7i1u7nJwLu9ys28vMG8uLa8u7e+tbqzxmF1sqWxmp6rvqqlqKuqpKKytaCrp56Vlp6Yn66lp6elnqOToqews6ixsry2wb3TycnTxsLFzMLKw8G+vr+8vLi0sLm3t8O6xr7EybCeuquirI+lqbeJgHxuXF5eXFVfXWdmU1lhVlJWSUVGTktBPkhEPUtCPUJAPUY+O0hANzk2Mzc5PjQ4OTo1NzA0NS8yNjM4OTM3NDUyNj84QD5HS1JUVFJQT1FSUUpBOS8sLCwqKygoLC0rL1A+KC40OIB9PDJLiHE5PkNLRUBKTVBSTFFdaG1scY+NhpBzbHJydIjVwLWaoI2VmZmRjpeSlpaOhoh9h4ONlop+gn+DeXuLhId7i3mBioKXf3R9emtlcHZZXVxQZWViYGVkXVtYWFxNZG1VUm1uX29fWGdlVVlUSkRCS0tIRkhISEhCSTlEQEhLVFRWXVpck7nAub64xsG7ucrLu7a6tri5tLi1ta62t5lkdamerXBeoq2cmKGim6Seq6WUn5+QlI6WmJeonqafn5qZg6OdrKSqsKy3sLy41NDO1s/JzNLMz87Kx8DAwsq9wb3CwMXExsrAyc+0pLyxtbCcrLm9mn12aVtcWVdbX1hhYlFcYVRSTENCRkdFPEBGPkJJQkBEPTpFPj1KPzQ3NTM1Oz00Njg5NzcwMjIvMjQxNjk3NzU1NTVEM0VMTT41MTAwMDY6NDc3QElPSjsuJioqKC0uLyxATSsvNTRtiUkwSIl0Pz5CREBDREdLT0RSXFppYG+XkpGUbmxvdHWHs6yhoZ+LmZyZjY2VkZuShYqKf4iHjJCLiXyBhHN7ioOFe4p0gYqHlX90e3lsbXV8aXNlaWxoZmppaGBmaWltWm10l62kvYiHZ1tvaF1aWVRIS09QSktQTFNRSExBSkZLUF9fYmdqYpe3x7C6tLu+trHFx7awubGxu62zsairuK2NtqienKeaTpqejI+glpGnmKWVipOTiJGJj5GSnZuhmJuUloeemaaarK+or6ezs9TU1NbRy8/T1M7Tz8zFwsrQv8rJy8nSyM3Ow9DSuLDEvcS6pre7xKJ/a2FaWltWXlZZY1lQXVhPUkNCSUVDSTtBRD5CSD9AQjg7RD5AST01NjY1NTs6Njg3NjU0LzEwMTQ2Mjc4ODc1MzY3QzVCOD8tMCwxMzQ4PTk3LC4sMTtGTD0pLCguMDAwN0s/LTQ2VIhXMESHd0M7Qj5FQkFDSk0/VVlTZldzkJGZg2hyb3l5g6GqnqaXjJubmIuOlZGajn2Ji4WOioqLkIh8hIJwf4eBhnuHcoOSi49+cXl1bHB4f3J7bnhzbGmAcG1jaW5weWl3fX7Lv8Pfp25jeG5kW2FgSlBSVU5ZXlBdXU1RTlRRVVRcbm53g3KWrristaiwtqutvcGyq7WmpbmnrK+hrLSkj7Gum5iYjJGUkYSPm4GNp5GciYOLhIqJhIuDlJWXl5SbkJuYmZmenauspKeirKzO0tXRzcvS09PQ1NHOyMPU0cjO0tPT183S0cXS1sbBz8jIw6m/uNCcdmtiWl9bVF5RXFlPUFRQTkk+QUdCQ0Y9QUI/RkU+QD86PT08PEpBNDU0NjU8ODg4NjY0NDEyLzAzNTI2NzY4NTMzOz08RT1AMTErLzM0OT81OTAxMDIyLTJFTzMpLzMuMzI9TjI0OEN9XzJBhnREOj09ST5AQ0ZIPFZSTU9bdYeGi3dsd3B9foCgnp6hjI2Zk5SLjJOPloV5hZCQjouKiJGHf4J7cn6Agod6hXaFk5GJgG93c2xzfXx3fHOCeHFrgHJyaXByenlye77Lmn+NsoR2coV3aWFpXUNaWltXZmRYZWtUWF1dYGNeY3h7f4uBmaqkpKKgoammqrG5q6a0o6KuoqSuoqexn4mmm5WTkYqSj4iClIlrlaKNmYSBhn6Rg4OTl6yLlY6Vmo6FkpCdl6ewoqCgpaSoyM3Px8LL0dPR1NLO083G1tPN1NjW1tjV19XK1NrNytjW0cutxMPLiG9sX1xcVlJXUlpPSkdJSkpAOzo7RUJEPUNEPkhDP0NCOzw5PDpHQjQ2NTQ0PDU2ODc1NDMyNTAvMjU0Njc0NTU0NDw+PUU/QTYyLy0xNjs9MDgxLzI1NC8tLjtSMDE3LzUzMkVEMjg+bmI1PYF0TTk5QEk8QUQ/QTtQTEZLWXCAdX5pc3lygoqAnZWelIWLlomPiomOiI+AeISUmYuNiIiLiX6DeHN8fYSHd4B7h5GXgYRveHFtdX92eH10hnx5bId2dG59doV1eXudtYw8QYvGpX6NfWplV0lDZWNmY2hqZG95W19maGtuaW6Bg4mRjJ6foJ6Rl5mgo6SmsqSlsqCipZ+iqaGisZyHn5KSk5GLj4uHhI+EfpycjI2ChIV6lH+CqpajjJKLmJOLfZeKmpGqs5ianKecpr3Dxbi2xc3R0NLQy9LLydTO0dXa19fY1NnYzdjbzsna2tLWv8zNtHVza2FaV1BTUFhVRUdKSUZFPTo3OkBCQzpIRUBFREJEQTs/Ozs3REM3NTY1NTswNjg5NDQzMzQxMDE0NTU4NzQ0NDQ5QD5EQkM8MzMuNkZUV09RSkFKRj8yKiguQlQyOTI1NC83Szc1PGBiQTxzdlY4N0FIOj9CPjw5UUVDSlRsbm9wYnFxdIaNfZeRnot+h5KCiYaFioKIfXiFl5eJj4OHhod6hHlxe3uFhnV6ho6OnXqNcH1wcHqAcnuBcoSHgG6OenV3fX2CdX98h4mwdFmqwreNkoFwbmM9XmhycHFwbnd3gmVpb3J2eHJ6i4ePk5KblqCWiIyTnJ+bn6ugoaycopqaoKafn6yZjJqNkZOOhX2Ih4OFi46gmZOIg4d+bJl5hJmGiJOMjpWMhnubiJOOraqUlZefmKautbyorb3Hy8jJy8vPycTSytTX2NfY19Tb19PZ29bP29rS1snVzJN1d2VkWFdOUVJbR0NGSUg+Qj49ODo+QDw+SD1AQkFBRUE+Pzo4N0RCNzU1NDc5LjU2NjQzNTUzMjMyMzY0NzU1MzQ1OEVCRENFQjU2PEZOU01bbmZjbnNrYFY+LDRMRzg2NTQzM0JGND1XX2hMdXheODs/Rjw8QTw6OUQ/Q0dSa19tZGJmbHaAiHGRkJuAeYCOfoKBgoV/hHx9hJiOh4x/hoeBd4N5bnt7h4J0epKejqF2j3aDdHWBfnSAhG+BkIJvkoV1fIGFenaHfIm4xqXDyriClpyPeHBlTmVjgnqCd4WhkIt5end7hIB8hHZtlJaVlpCYkYOJj5eal5emnZigl5+TkpejnpqrlpGRi42Tg4yFiYmBho+RnpyZiIWLgYWXeoiJn5ePiY6Ki4J8oYmQiruhmJOXmpyopqWtnqe1v7+/uMbJzc7FzcnR1dXU2dXX29TX2drb19va2djO28aDdnZkZmFdUlVUVE1LRE1DOz08PDk6PD85PUE3Pj9APT8+PTk4NjdDQTY0NTU9ODA2NjU1NDc3NDU2MTM4NTQ1NjQ1NTdISD1ESkU3OTI1O0g+Ozk6N0hQXFpSVVhLOVQ+Ozk1MzI3STg9TllNSHh4ZDU9PkM9PEA6Njo+PkBFUV9ZZmFdXGl0enlsiY2Sd3Z6i3x+gH+AfoV7foKRioWGeoWIfHV+dW18fYd+dH+SnZGfg5J8h354j355i4pvg5uBdJmGfYKKhXx+kXuQqY+Qw6C9jJuknH2JhX2Jc4yLf3OmmpyYlIV7j5GJhGlHcaGknoyMkZKFiIuQkpWPnZuTlJGXjYyVn52UoZWTjo6QjH+Qj46LhImSlpmfn4iMlJGdkIKMf6aZiIWOg4aEgKSGiou3l52RlJahpqCdnZ2jrra5tKvAxsrQyMfMz9PS0tjS1dfA19jZ29ja2tnZ19u2dnV0Z2ZiVF1ZUk5OSENMQz09Pjk5Ozo5OTw9NkA+Pz09OTo6OzM3REA4Mzc4PjcwNjg4MzU3PDM3ODA0OTc2NzU1NTQ2RlA1RE5JODkzOEFLPTszQ0BJPDlEV088TVRITj85NjMzMz5DO1tYPjVZeXBaPDxBPD0+ODU4OT88RFJTUlhfVlhmbW1taYGOinFzeYp7e4B8f3yIe318i4eCfnWDhnpzenNtgX6FfneGm6GbnpSSgIyIf5iHgJySboiphXugjHyRjoOJhJx+m5GKjaOin5Gkr6CLkYuFi4GThldyrYufq5uQg5mckI+OW4OikYKNn5OUjIaIjJKSjJSVlZCMj4qIlpudj5WWkoyTlIaAi4mSjoqKnZeYo6KGk52VoIuKiY6ckIOIj4CDh4WkhIuQspickpSXoaCemZKbnaeyuKylvcLHzcjGz8vPzM7Xz9HUrtbV2NrY2trX1tnanWx5cWNjWlpVUVVWQ0BJQz8/Pjo0ODo7Nzo7OjM8PD89Pjc7OToxOkc9OjI3PUA1MDY3NzI1NT82NTs1NTg1ODo1NzczNUhSN0dPSzk5ND1FSkI+MUZDTEE5ODpHWEA1SFdJNjYyMjM6RUNlWD8mX3lpX3o+Pjk8Ozk4OjtAO0JRS0tTWVBUY2J4bGJ+kYNvbniLeHp/e4F9h3x8d4aFgHNwhYJ7dXd2dIWDhX1/kqain6ail4qdkJSXi4qol3KKso2EqJKEmZSFmoyjlqCYk4mbnqKTqbCgkZWRjo6IloxvjbeEmsTIspyippycmJaRsZBkpM3HlY6Gh4mQko2Nk5WKhYqKhpaZm4+QlJOHlZiEgI+LmYiOkKuXl6SjiJmelpqIj4eXl4qFj42Bf4ePpYiNk6ial5OWmKGYn5mTnJqisrSlo7zBvsfGxcjIycLK08zN1KjS0dbW1tja1NPazn9ve2RgW1tbTUhTWUJBR0Q7Qj44Mzc7PDo5PjY0Ojo8OjcyPzo5MjlJOj42N0JDMzI6OTYyNjQ+PTQ7PjY5NDk7NTc5NDRLUTxKUUs5QTdCR0lANjRKRUxGPjs4OEVUQTc+XDg2MjE0OjtFYFhBRmF0aExjWj41Ozo6NTs6PTpFTUZIUldTUkJjgkd2gY59fG1+iHh6fnuCgoN/d3aAg3xtbot/e314eHyEh4p+i6Kzp6Ors6KXp5+lpJaVrqKDkbiVkrOajKGhjKWbsKOknZiRp5aomayvpJiVlpWQi5ial6HAjqPJuKuco6atmJKbnbKdhYaoo5yYhYmJjpWMi5OPiIGGh4mTmJWMi5STh5SYhoSRkJx1kZmylZakoYecmZKQi5CKl5uJi5aOhn2MmJ6JkJCbmpqTmJefk6CdlJ6boLGuoqO3vrTFx8S9w8PAxs3KydOmzszT0tHW2NPQ2LpvdnJZXlNdVE5HSU1EQUNENT46Nzc6Pzw8Nz00MjY2OTc3ND41OzU8TDw+OzxCQTc1PDs0Mjc3P0A2P0A3ODQ5ODc7PDU1T01EUFJMOEA9RUFHQTU6SkVORUQ6NkFAQlM+OURPMzIzNTc1PXZcPFJcdGlaTV1TPD04ODU2Nz06SkZER01aXFlKZmA7SISLenpuhYZ6fIR4gYaBfnB4fH59b3ONen6CfHiGi4mGhJKmu6yosb2wpa2zs6ijorCsipq1naO4pZWtpZeprbinpKOfmqmYqqSusKqamZyUlpGXoJiau7uuyqFqtrirsJSZn6Osk5e+o16qsoOKio2Uh5B8jo59g4aOj5SViIiTloyQlY2LjZaYk52ZtJaVq52KnJSRjpGSjJmbipKekIuJlp+hjJSNl5mdkpuYnpShoJScnaWuqKGks7iswsjEtbq9vMXHx8LRoMbJzc3F19bRy9OfbXdlWVdQW09ORUM+PEJBQjhAODg1P0c9PDU8MzUzNDU0NTRCNDk6Qk06QjtBSEI7OkA8NzQ2PEI5P0BCODc0Ojo2Pjw0N1RLQ1VRSjc8OklBREA0QUpITkJBPzZEQTxKTkQvVD0yNTQ6RUpcWEpaUW1ncHBEaWBLSTY3NTc6PkpAQ0lQZEhiYGJwSkCLin6Ac4aHfYKIdYOKgn9ufXx9f3B3h3eOgod8jY+MhoyZqcLAr73Gu7O0wL20rauztoyosq6uvaubu6Wnrbm4q6amoqKko6mvsrGqnZykmZuYl5+ipqWSpLqvqcC8ra6yuaWkqH6IhpytvbCCi4yLkIOOg5GPeoGIkI2NnImIj5eNi5WWlJGal52omrGakaycjpqPko6VkJCWl4+RoJGJlJukrJSWj5OcnZOgnZuYn6GUmp6npqSio7CypsHGw6+wurfFxMO/zabHxMfEvdbQzcTKhXBvXllXXFhMSkFLQEVHPkFAQzs6NT5BPT01PTY+MzMzMjQyQTE3QEJOPkdAQ05DQT1DPTs4NkNDNUJJQjo4Nzg7NUI+NzlWS0RXT0Y4PTRLQEM+NEVLSE4+QUE2QkI/QlNFNThQMTQ1Ozw4O0Q+OUxqal07V1JkS2daVU43OUdEP0NGXGVGYGlnWl1ck4yMiXuHjIeDjHWHkYqBb357gn9xfoF7lXqSlJSYkJOWp7PGyb/BzMLDuce9u6+rubuYs7e6ssCupcCkq6+8vaquq6OjnqerrrWwqpygq5yhnJafr7Wni6O6urbBvKypnbOlpKiUhY2qw8OkgouPh4iEhpWUjXmDjZGPkaGMjJSSjomXn5iTmZWXpqCvnIyrnI2Wj5GRlZWNkZWSj6CUhpefoLKelJmTn6CYpJ6an5uglJiepaOmpqSvraXAxMOuqLe2ycO+ts+yxL/EvLPRysjCtHF1aVlVWWdRTEhCTEtLSkFCPUNEPDVBRTs7Mz04QjMzMjI2MkEwNUlFTj5JQEhSQEg+Q0A7Pj1GQTVBVUA7OTk4PDdFPjg+VkpDV09HOD80TEBCOzVKS0NMP0I/PEJGPUFITDkrRzwzNjc0NjRBPzdPYU9hRS89PjZrbGpgQDpIPj9FQmVaTWVcZlRia5mNloqMiJOQhol5h5SQgXKAe41/eIeCgpB6jaGWqJmambq9x8jJwdLJy8LMvcKzrby+qLrAvbvEt6zBqayzvL6qsKqkpaSsrrOttrWhn6+fpaKYo7O9qpuovcGktrivrJSyrKysl4aaqaalkYKMk6WWioF1ipJ5hY6SkJ6gk4+TjI+NlKOZlpyVlKOeqp6RpZqMj4+PlZaIfI+Vk5KjmpWfopy1pZCelqSjoaWdnaaYnZWXmqSjqaeisqyou8DDr6Wzt8y/ua/Es7u+wbiswsPCwJdqdl5VVFlYSkpMSUZEREhDQ0FETDo0REk6OzQ8OEUuMTIyNDJCMjZTSE88SkJKUUVLQ0RFOkVMQjw3RVY9Oz04OT88ST86RVVJQVdRRzdBOks6Qjc5Sk1CSUBDPjxERzxCQ089MjBIMzY2MTcwPUI6PWpqSks1UVMzU3BwZE47RD1ARj5pSF9YYlpjY1aej5yOl46ekomKf4qgk4R4hX+Wf36QiIqRgJahma6npJjCvcfDx8XTzs7Ny7zCt7C6vLS9y7vDwra3vK2zv7q9rq+ooKmotq2uqbK3mp6to6ehnau3uKqlsL/Esr25tKirtrSurpeWpayon5GNkrLFp5aOfJKVfIeSmY+qmZiTk4+SlZOknZOdmZOho6KcmJ+Yi4yPjp2IWpCXl5KXpJllmKKfs6WVoZWrq6mmm56mlpiWmJSho6ilnrarqbm7w7SltLXLwLiqtquyu7iuqLi6vbiAaGtXVFJTTUVJUkxLP0FIRUVIR0c5NUZNOz43PUBKLjMyMDI1QzU1T1ZOPExGS1JMT0hHST5JUT86OElTOzs/Nzk+RExCQEhTS0BXUEY6QT9HNkE3O0hNQ0U7Qz00RkU6QkFCRzkvOkEzNjAzPkdEOTQ9dGRNRztFKzpmfGdWOz5AQkZCcEVqSVJlYUxGpZScl6KXqZaMkYOIppOIgoeCnISDlZCQlI+aop6vvq+hxrzExMbGzs/O0sq+u7axuru7vs+1w724ubezsbWzuLOrp5yrrLmqqaevsJijr6Wno6W1wLCsrLS/w7rAurSnura5tK+Wpa2urqSLk5ShjXTCmn2XmYSOl5mMsZWbmpWSkpmZpaOVoJuXmqmdm6CgmYqNj5WcYEqWnJqUmqWWVJavn6+cn6SUrq2qpJqgpZOTmJiNnJ+nopm0qKqzu7u7qrGyx8C5pqyrrbKyo6GysrSkbWpiWVdNT0pET09QUjtIS0lHSUNDPjpLVT9BOj1FTTA3NTQ0OkI0NE1XTztKS09VTlFKUEhISk9CPD5NUjs+PTg6PENSPkRIUklCV05JQEJBRjM+NThKS0NBPUM7NEVBOkE/PkhANSpCNTIsPmNdZzozNXRkZUBSNyYjM31oVzs6QkNAPVFFV1NzYldGSKqWmaCiqK+ZkZeHi6iWjoiThaCHhJ2Xj52hmqOktcm1qcW5wsPIysjIzM3Gv7uzrrm5wcHMtce6wbm1urCvr7O1p6SbqrS0qqmmrayapK6lpKisu7+orLa3v8G/vrmzssSyub6to6+1rLmmiJuXppt2v5+EmZ2Ok5qajK6XoZycl5SboKGonqifmZqqmqGnnpiQjZGdg252kqKalZ2inZGusqOqlKiql6mto6KepKeRkZmch5Sdop6Wsaapq7m2vbKyrr65tqCjp6ilppybrampi2BiXl1OSktGR01KVkw9TUVOS0xCQ0Q8UVY9QUFCRE8xOD03Nj9CNzVVWE8/SE5RWVNQUVVLUUpKRUFFTVE/Pz04PTtHUjxFRFFCR1lNS0FIREU6OjM5S0lCPkNCOTlDPjxAPjs7RzctMj4tMYJoTnpcLzBraGA8PUJCODZ6Zlc7Oj0uLVJgTVVIfmVeSEWrlZuin7uvmZSfjJOrm5GSk4mrjYahnoyjrZSjo7bGvrTAucLCx8nFws3Iwb65sq+5tMDCybXGssK8tbqqqK2tsKOjmKq0u6appquqnamvp6Oqq727qK29tbi+x7y3trjCsr7Btaq1tqu+pY+jmJKioLyfiZqgmZefno+3n6mcpaKbnKGaqKSzoJudppyoqp6YlY+Um4uWiYykoZSdop2gtK+lpJKvq5mqqpyco6KokJSUn4KPnp6blamkoaGztLq0rai1srOenKOlmpeVmKqhnnVdWl1bSEdFRkxQSU1FR0dCU0xKQkVHQVdTQ0g9QUdRMTtCNzpCRjc5XFlLQUxQVFVTTVdSTlVKRUBKSk5POUNANT08TlFDPz9QP0VaTUpBS0RHQDUzPUlHPz1FQTk3QTs8QDw8M0A8Lyc7KkiRQjpTSjAsW29XNzE8Kh1CgGRUNDktMTlmXEZDQ51wYkdFp5ejn57DrZyXpZiZqZyWmpqPqpaVp6aVrayYoqu2w8O8vrbBwsDHxL/Nxru9ubKwubO/wse1v7C8t7m2pqSrq62goZmqqsSipKmrpp6sr6uiqam+uKetv7K4t8e2tbm4wLLAwre1s7SvvaOXo5eUnJSun5Cio6Wjo6CQvaWpnamrnJyhm6WevaGZo5+iqauhnZeNlZ6TnoePhI2Tn6SgnrWsppyVsKaZr6WcmaicnoyYlJ6DjqCZm5KlpJqXq7G1saqlqq6sm5igoJKPkJWonpRlX1dfW01IR0lOTEhFRElBPlFJQTxHSUlcUk9LPUhPVTRCRjk+SEc1Q2FbS0JOUlVXVlFYVFJVSUA4UlFQTTpHQTRDSFFTSUM7Qz5HVktDQE8+SzwwNjtHRj47RkE1Nj85Oj85OzE1RDAtLC9Ndlw0S1o1LE1uVzwtPSkeI3piUTVDS1E5bVJGPEt4ZWFWS6Kao5yexayhnqyfna6gkqOflqSgpqmsmLaxoqqztsXEvb+1wMK7yMK+yse1uLW0sbO0t8HFtr6xuLW5tJ+nrKqsnZ6epaTBpZ+praCkqa2voaaovbWmsb25t7bEsrS4ur+0xMG4ua6ztbWjnaWVkpShrqCZop6pqKyjmsKsqZ6srpubnpmmoL2hnaSYq6uspqGajZqfkp6Jjld/lp+loaC4qqeTmLSinrGfnpmulZ2NmJOcgY6fl5WNoaOVkKWtsqqpoqKlpZWVnZiLj5GSpJ6JX2JYYl9LR0pKTkZFQUdLPz1KQjk5SktOXVFRST1MVlw5Rkk9RE1JOEhiXExDTFBTWVlWV09aXklBPVdRSUs/SD81SE1YU0hBOkBBRFBIPz5RPks3MDk5RkU7OEc/LjY+Nzg+NzcvMT85MSUxUVVtW0pPMTA9Z1dEMTc9LSt3YFM2U1prV3JHRTY9dWVcS02enqGZn8SopaG0op2zp5OrpaCjn6yprJ27sKistrHHxcHCssPDvcbEvMTJvK+wtq2wtK++xLS5sbC6tKyZqLGpqpqdpaGnwa2brLGbqqOusKmlqby2p7e7vq+3xK2zs8PAtMe0u7ess7atqqKmlpWVpKyin6Cbp6qwr6+7saagqaiamZiToqO4oKGjkrCvrKWmn5KhnpWej5CNlZ6bop6ntKemjJeym6KtmZyarI+dkpWSmX+RoJWOjZ+gk4umq6+kpqKcoJ6RkZqThYuRjZudf19jWWZkSUhMSVNBQ0BJSDs7Rj85OU9OVl5SU0o+T15dPUhQQkxMSTlNY1xMRUxSVFlbU1VPXGJIQT9aUUFIQUtCN0ZFTEtNPztCSEROQj07TkBBMy85N0NCOTdGOys2PDQ2PDI1LS80QDErJ1Z0U2VPPzEwNGJbTTIzPjA8dl1eP1tUXmVxQDg7SJZ3ZUE0nqOfnKDDqaSqs6KktaqWs6ynoaSyrK6pu7KtsbW0xsDEwrTAxL7JxLW/yMG0q7Wor7isv8Ozt66ttrilmKqyq6uYn6aXrbu0m6iwmqygrbSyqKu5sqi6tLmzuMCqt7LEvbXGqL+vrba1qaesoZiXkqaloqKYmKWuuK6ytbagn6mkmpSWlKSgt6KlpZavsbKnq6ainpqam5WXqJ+gmKGer7KipoyXrZikq5aYnaKPmoySlpiFlZ6Ti5CbnZOKqKmqoaehmJ6Vi46Zj4GFlIiTnndiZ1tqaUxPTU5UPUJBTkM6Okk/NzdST11eUlZRQVdgXEJKU0hWS0g6VGRcTkZPTltXW1JQUVhdR0FCW1BCRz5OQzlIR0hPUD8/Q0lCTEI8MklBOTQxNzdCPjs3RTcrNjkxNDgwMS0vLjw2LSNCcWdzazIzLzFbYlozMzgwNnBbYkgwNUlvaFVDV0aMeWZDO6OjnaGmv6enr7GiqbWrnrqxrKOrtLaxsLm3sLe4uMS9w8e9vcTCxsC4wMbAuam2pKy7rcDBt7eqrbK6opStsa2ylqSnkaq5qp+msJyroK+0s6uptratvK20s7m3rLixw7u/v6bDq7C2rqirq6eemJmroaKhkZihsa+zrLC5mpupn5qXk5inoLappqOisLG0rLOnrJ+coKCbnqWcopedo7Ovm5+Qk6SZn6iZk6Gdk5aIk5aSlZackoiQmpiUjqmopp+jnJebkoWOmYt9i5WEjZlpZ2tgbG1XUFFbVUFCRVRAOztJQTc6WFBkXlBXV0VZX15NTFJOXktKPlljXk5IUE9cVVlQS1RXWkk/RFhQREY/TkA9SUdHUVBCPURGQk0/OjFEPzc3NTQ3Pz05NUU0Kzc1LzI1MS0tLiwxPSonKz1ccD0+MS4wZFpkQDE2NDdnWWBGKD84bH1nW1Y7iXtjQz2nn52iqb2iqrCspLK5qqa2tKygrbW9r7O4u7q+t7bAwr/JxLnEwsC/t8O9wLeutaert7G7vb60qa6xtp6Wq66nrpemqI6nu5+krLOeq6KxsLOsqba0tb6usbK1rLC0s8G6xbesvbCxt6usqqOypp6lqqCkl5Gan7Oqs6urs5qdp5yalY6hpqS0rqihra6usai0rbKqpJyfqKSelaKZm6i1qZeZkpKdmZ2fnZCqnJWWhJSWip2Ym5OKjZaWmpampaOfnZaVl5J/j5SFe42SgouVZGtxZm9xXkZZZ1ZEQk1YRFo5SEI2Pl1RaFxOWl1HW15dT01SWGRKSkJcYl9QTE1OWFdYUEpWVldMPUVVSkVEQU1AQUZISFFQQTtGREZLPTg3Qj02ODcxOT48NjVEMCs4MC8wNS8qLC8tKj0sLCUyKyo1SzEvJ19fYFUxNTA9YFZeOClDM1lVXGdLNox6ZkxApJqhpa23payqpq+ut6qvtbunprG3xbextr3Bw7W1usS+zMa5w8C5vrnDuMC4srSrqbq2urm+tKmtsLWXmKesqaybq6uOq76eq62yo6ugsa6zrq21srm4qq6usai1r7W7vMqzqre1sbSvrqahtKCbqK2gppaWm5qyo62gpq+XoaSampOOo6Wns6qhprOtqrWlr7K1r6SZnaynmpifmpmrt6OXk5COl5ygl5aTqp6akX+Sl4ydm5iVkIqUkp6ZpKKioJiWkpOVeouPhXuMioKKkWptd2x1emFGYWtZSUdaWj17SkZENkFiVGlbTVxhS1xdWlJSUmJgTEtFX2BgUUxJUFdWVU9HV1ZVTjpJVklIP0NLP0VESEhRTkE/SEhIRTw3PT46NzU2MDk/ODY2QiwtOCwvMDQsKCwvLSo3NikoOS4kOks1LiJUX1RfLzUoQ19RXC4rQi9KR1BbRzNjWVRLRJmXobGpsqqspqSvrrapt7W6pKy0t8m7tLu6v7+0s7fDwMzIvMO8tr2+v7e+vLG8rae6ube1wraqrbG3lJamrquoo7CplK+7pK2xs6eoo7K1sbGwtbG4tKmvrLKnt6+3tMTGt6m2tqywramno7agoKeyoaSVnJqVsZ6nnKCqjqmjnpuWmKampbioo7K1rKixp66xtaylmaCsqJucnpyUqbiblI6OipebopePl6SgnJOCkJSPnJuXlpWIlo+XmqecpKCRlpGQlXaEj4d7hIGDi4psb3Z0e35cTGZtXEpOY1w+YntHSThHZ1dmXExeYk1YWVdVV1RpXU9PSGBdX1BKSFFWVVJLSFdVVk04TVpORUBGSz9IQkNLU00/P0xPSEA7Oj47NjswNDE8PTQ1OD8pMDcpMS4yKSksLC0rLTkkMDQyJTlCNy4jQU5HZjI3J0diTFYlLUIuPUVMUTwzcmtJQ0ORmaWvpa6vq6ilsbO0q7eyuKGrtbnJua3Bu8K4s7G1wsLOxcDBvbS9v766vryyw6epubC1tb+8rqyysZugp7GtpqavpZ2yta2qsbGsqai1u6y0srWttK2qrKisqbitsrDIwLmlurCprKylqK6xpqWjr6SpnJ6dm6+ao6Ojo5GtnqOgoKKrpqa5pay2tqWrrKmtsLauop6jqaqboJubkqOzmY6KjYeQoaCUjJScn5KQg42Skpyal5WUh5eSlZmnm5+ejJKRjZB2fY2FfHt8hYiIcHJxfXx9XFNkb15OWGZcRkSWW0c7Tm1YYltMYGJOVldWV1RYZ11RUkxjWVtUS0dPVFNOR0lWU1xOO1BeSUJESEpBRT8/S1NPPjpOTUM8PD45OjU9KzMyPTYyNDk6KDQ1KS8rMSgpKywtKiY1Ki8mMCkzODoxJiozQmM6NipIZUhKKzpIPjNCSFMsPpBrO0dIj5yqq6KqsaSppbO1srW2srKhq669zLqtwLrHsbSttMHD0cXGvsCyvsDCu763u8SmrLarsre7wK+rsayfo6etqaiksKOqsqqwq7CvsK6rs72ntrCyqbOqq6Wlo626raqyw7q2rbupqaesqaexpaqlo66qqKKfnKOtlaWemJ6ZrJ2ip6miraakrau4s7KiqqKgrK+xrJ6gp6epmaOZmY+gppeGhI6Ki56gjoqMlZqOjYSFj5SfnJSXlYaWlJOXpJucnIqSkI2Jf36HhXx2foWDhHJxcIh1a19aYG5iUXJwXEs7hHxGP1h1WGBaTmRbTlZWVVdRXGFeU09OZ1hXVktHTE5SSEVJVlJdYzxQXUQ8RkhIQkc/PUpQTDo+T0o9OT89Mjo3OyoyNT4xMDQ4NSg1LyosLjMwOyksLCclMjM0JCwyLTg2MCkoMTtcSjAuSmdERjg7QjA1RUtYMUCVWT1MRZWYraiiq7Ocqqqwt624tq+rpqurvcm8sL22wq+xq7PDw87Pw76/tMDBw7m/s8fDqq62rbK4vr6yra2qpKeqsKinqLGltK6qsa6usrG0rLS8pLezrKyvqKufo56wt6uqrbq3pbe2pKqnq6qqraGpp6eysqSnpaGhrJeqoZWboKaepaKrpK2in6exuK6upKajm6qrrqmdoqWkpJifm5aPmJySgYKQiYScn4uKjouYjY6JgouXopuQkJuMk5KRk6OZm5mKjouLfYaBgYN6c3+Cf3xydYukh3hrX2BuZldkhmNOP2eTTEVieVdiWFJlVE1WVVZUT1xdYVVLTmhWVVZJSkhJT0JHSVNRWW9BTVhAOkpHRkVHPj5FUUg4Q0tFODdDNzI6OjoqMzk/Li80NjMpNCsqLCsuIzQuLSsmKCs3OSomNis8LTIsJjA2VlouMEpnQUE8PEIrOkpPXjREhj1HRkSXk7Cmo6uxmKuqrbastrKspqyqqbzAwLe4sru1pbKvw8nL0b/Au7m/vsG4wbnAxKyxtLGzur+9srCurKqrqLappq6vqrmwqLKyr7Ktt6q4uKaztquspamqnKOes7OpqKS0tKC3rqCqqKqoq6egq6ypuraqqqmpoqqgrZuSqqGdoKWipqOqn52ntK+pp6ujo5ilp6eqnKKko6CZmKCRjo+YjX6HjYeEnZ2Gg4mJjo2Oi4KFlKKajY2akZKRj5Ofl5iWjIqDf3SGgX+AeHSCfnh2fYCHnY9vcmdmcHdcYHKHak9emVZIbXlUZFZRY09NVlRVUE9YW2JVSE9pVFZTR09YVUk+SUhPUVB4TE1WPTxLRD9AQTxAQ1VDOUFLPTU7RTEzOzo3KjQ6PSstMzQxKjgqKisqLCkpKC8qJiklMzssJDIpMjAyMSUvMlFiMDI/Zj1OWD5DLD5MVF8vSmk1T0Q8lo6xoqarr5qspa2wtLWwrKawqqi6vrvAsK25rqG2r8jHyNHAvr27u8G9usK/vr+tsbGxtby7wrGxs6qzqaS0qKWts7O5sKOuuLKws7usurCprbarqp+qrJ+joLatqaGfsLOitaqeqKepo6qhoq2tqL2vrK6toqion6yZkLChmKKhqKifqJuZqrGqo6CuoqGUo6Ojp5iaqKWYl5iej4qHlIh9jYaEhKOWhIGBioWOi5CDg5OfloiRnJCTkI2RnJSXj4qGhnd0gX98dXh5f3lycnhmf4akdmlfZGmAdGaIi3xTWG9eSnhzU2RTUV9NTVJaZk5NVllkWEdSaFFRP0JOUWFROklITFNJcVFMUzs8ST87PD07QEBXPDw/SDczQ0IxNTo5My01OjopLTMxLS01KSgrLSw0MiMyKScsJS47LiYxLjAtMTQlLDBMZzo0OF89YWQ/RjFDUFtbKkhNOVVANJGQs6Glpq2kp6Stp7WzsqulsaequL7Au6+nuaqmr7HJx8jRw7y/vri9vrzIusC3r6+zsbm7uMCysrqsuKyitKeorLK2ubOoqL22rre+sL6nray1q62cqa+joKWtq6icnquzpbSomqqnqaOonaOpqKm+q7Swrp2qpKGvnJuzo5aknKWmoKWcm6mrpp+cq6Kck5yipZ6Yl6ipkpialJCKgo+Ffo+DgIidj4V+fYuHkI2Og3+TmpOFk6GMlJGLkZuSlYeJfn9ye3p+fGh4fHlzbm97ZoR4hIlkYWdgcoR6bGZ4XV5UP1d7bFRhUFFZS0xOcnVdSFpbZ1lFVWVQRD5KTkRDQTlIR0tTP2piSlE4PUg8PDw+Ojw/VDY6P0M0NUg+Mjs1OTAyNzw1KC41Ly0xMScvPktIMCUaOTAlLCwwOS8sLCs2JzE3Iy0wR2pJMTRYPWZiQUo3R1NgVSo9OURXPSqQlbKaoKCqpqWhq6W4s7OmqbGmrLjBvbWvoritqKiwwsnJzMG2vcC0t7+6yLXCtLKytLG8uLm9ta25tb6toLOnq6uwtri1rJ+/vaqzwbS8oa+ytaqsn62wo5ymqaqknpulsKewoJ+rqaehqZylqaGtvKiusa6hq6Okr56fraaXn5qhpJ2fnJqkq6Ocm6WllpeVoKOXm5elrIyekZGRi4KKgICOgHuZlIyIe36LhY+Ni4mEkpiQhpSjiZOSh5GakJOBiH15a352eXhjfHpwbm9xdmd/c2mEaGVnXmxzjWxgaW9gbz1aeGxVXU5QUktJTVRaV01dXmxXRFdfT15QSE1ERjs3SEVLTzxyaEtLOUFFOzs9PTs7PUo0OUI8MztHPDQ/MTgtNjg7MigwOS8sNC8uPS0qSz4pHTQ5JicuMzQuMCsvNCYsOiQ0MUFoWTE0Uz1lX0RMNktWZE8qOzFOVz0jlJmtmqCYqKWkoKikuLCvpK+wqau4wbmyrZ+5r6uotLrIy8i/tsK+r7S9t8S2wrGtubGzwLS6vbeoubi9qqO0qKmqsa65saucvL2lsMG2t6KvtrWnpqews5+epKaooqWZn6yoqZ6gqq6moKaYpKmgsbmfo7GvoayhraScp6apmpqbn6WWnZ2bnqqnl5yhqpOZlJmfk5mWoamRmomOkIZ8h36CjX18oIyNiHiCi4SJi4uFh5OajomVnoiRlYKLl42RfYV8c3B9cXR0YHp4aG1vb21ofXFie21pZWJcZIR+XllzanFKSX5pWFlNUExKSFBSUUlPXV9uU0RYWlJoTkdLRUY1NkhCTEk1WmVKQDZFQjk6Pj0+OjpDNTk+OjNARjwyQDIzLjo7ODMmMjwwLDg1QiopLUIqLDQ7Tk5AOzczLS4rLTcqKjwlNTM8ZmQyNE0/ZV1GTz1RWmdIKj4vV1U1KJeep5qdl66hoaGlobirsqW0tKmoucS1sq2ft62urbC0xsjAtr7BubC0vLa+u76vqr2wtL+wvMO5qLu6t6entamorLGttLGom7+3pq69t7KfsbewqaWnr7GboaSgpaWgl5uwp6Geo6ivoZ+hk6Wlo7ewoaaxq5+so6+YnKqkqZ+Xmp6llJudm56nq5qcnqaXlpiWno6Tl6KoopCJi4+GeoR+hIp6j5aJjYZ4gYeDh4uNhY2TmI2PlpmKj5d+hpeMj3mCenByd29vdF95d2Rqa2pnZ4JsZXJra2RnV2Fyf15Za3VpWUV9XltYT09LSEhSVUcyOl9ebVBEV1VZZUxISkVFMDdGP0tCNklKSDs2Rjk0OT49PDk4QDg7ODo3QEk+ODw0LTM8PDc1KDU+MSw7QTEoKzY8IzhSPSoxMTM+RDUsLSc0Mis7KzEzOWNsODRIQmZbSFRDVF1oRS47MV5RLDKWpKOYlp2rnqaho6G4qrChu7ilrL3Esq+uorWvra2vtMTEvbO+urews7m4uri6ra2/s7S4rr/Bt6u9urSlorOrqKqzrK6yo53Dt6aquLesn7K7qqelqK+rmaOnnKWmlJihs6aZnqSpqZyhn5SmoKS5qKSnraaepaGpk5+poaGhmZueoZObnZeho6ycnJujlpOVlpuOk5Ojp6SQiIqOhnmEfIWGfZyNiYqGeICDh4iHkYWVk5KMkZWUjY6Ue4OXj4p3f3xsdXJtbHNieXRnZmlmY22EZmdoZGZnaF1kYmllWmV6YmBQclRbW1JLSkdJT1NAICpqXmpMQ1ZVXmBLSEdFQy46QjxGPDZLUEQ4OkQzNTc9PTg5NT86OzQ+OEBMPT45Myk4Pjw6OSo2QDMuRTQoKyw+MC1OPy4rLTctMTE5NSwmLjUtODA1NzZgdEIzQ0RoW0tXR1VgaEIzNzdhTCcyn6Slk4+mp5yfnp6ktq2oqrq3p6vDwLavrKK1rqevr7fBwL2xwLaxrrK2tbm4tayqvLOvsrC9wLeuvLywpJ+2rKamtaqrr6GhxaypqLK1rKy0uZ2oqquxpZidqp6npZKZpa2jmJ2kqqGboZyYoZ6nt6avqq2hoZ6dopWgpp+ioJmcm5yUmp6Vpp+uo5iYn5aVjpWYjI+YmqegkIeKioh4hXeCgoKch4qCiHt+hYiGhJCDlpWPj5CRkJGNknuDlY6Fc399Z3lwbGtsZ3Vza2FnY2Jzf2FjZWZlaGhhZW5ZXVhcbGNhTGdXWmBWSUdIS01SWD45YGxpSEJVU1xbSEhGRUEuPD85QTg5UkZANzpCMDM3PTc2OTI6PDk3OjlETT1CPDAqPEA7QTwtNUIzNz0rKywvQSpKSy4vKiszNzIyKDU3JCs3LjcyNjg1XHlOMj5IaVpMWkpWYmZBOjNAYkYlNZ2koZKMrqGamaCXpbSyo7K+t6Gxxbu5sLCjtqyrrqm5vr27rcCyrq+utq6zubKnq7mwr660tru2r7m+rKadtaugobKlq7CfpsWhs6awsrG3rbSdrK+srqKZnaeqpZ6Vm6emoJmlo6icmp6blZ2drbCmuaeuoqGamp6Zn6OapZ2Xn5iblpuhk6qXramclZ6dlI2Vmo6VlJinp42MiomOe4F0goKLmIWGfIiIhIWKjIiShZSckpGQkJGXj5B/gY2Ogm+Cf2d5bmlramdxcmtbaGNhcX9gZGdqbmtlaWVjbFxsbHVwYVNiaGNlWklGTE1PWVFQVWFlgVRAVlJaVEZHRkVALzw9Nz82PEZOYTg6PzI0OUAzNzgyOD83PTg+RkpARDkyLT1BPUE9MDVAOUAxLSsuMzw7SzYvLissLTI0OjUjMyopNi41NTQ2NVp8XTE6S2pbTVtLWGRjQEExSGJCJzSUo5yPj7GdnJWhm6mzsJ+4wLagtMG7vbmxprawqa6luLq4uKy7r6yrq7eqtbmtpLO1sa+psba2sbO2u6epoLaqnp+qo6qunazEma+msLG3tqyrnrCtr6qim52krKmblZympJ2aqqOklpqgnJKco6yrqbqepqSgl5qanqGPa6OWmZ1xg5idpYF2kqypn5aXopKKmJmAl4qfjniFko2DbWl+d4RxbIaKhn2EioZvXWRgZ4SYhmuLkJSSdXiLhH+DkH9miIBodmlmV1xpdG5OUGpjZXGDZl1kZm5raF1bXYmQhYdoTktDOEVUZ15KSFBQVVZLSFJhcHRlRltRVVBGR0ZDPjE7PTY9NjwzZlw1Ojw3NTtENDg2MDpCNz86PkZMQ0IzNDM9QEBAPTI4QEU9MSwsMDg+RzcwMS4qLiovNjY4LCMxJzIxNDoyNzZYgWwxNU9rW05bS1tmYj5HMU5hPCsvjqSaiJaym52UoZyqrqyjvcWvqbfCuL68rae3saarpLi0s7Owua2pp6y0pbG1oqe4trWop622s660rrSiqZ+0q56jpZ2nqJuwv5Wop7C1ua2to6isq6uloZ+coainm5ihpaacnKeonZOen5mQn6irpLSvo6KjnJaYmZejiKGPkpuIoYiVn6KApYCorZ+UlJ6UiYRyeIyOg4igdYeNaZeJZn5zeKBvh4eEfox8f6Ggn5l/fIefdIiOdpuKbIeCg21oZGR7bXJiVIZtY21pmHFYaW9uhlddaFpralqIcGx5codoh4RZXkZOPkZeTUVSVlZRUFJXVGdeTFpMUlJQRUZHPjw0OT05PDc7MDw8Nzk5OjY9RjU4NjA8Qjs8OT1GUUc9LjU8O0A9QD41OUdBODIqLzE8STovMDEuKi8oLTQ1ODMlJjIxMTU+MTw4WIN0MTVSa1tOW0xbZ189SzFUXjcvKI2nmISerJ2amp2fq6qoqr7Dr7K5vLfBv6qkt7GqrKazta6vs7arqaWxraW2s5ustba1paaps7Gtsqiunqqhs6mgpKWboqWesbiVpqent72mrKapqaynpaGfmaGoo5mZp6OkmJylqpaUopyUk6Smp6G2pKOfo5iVlJiUnIiukJiViqqMmaOdhrGBpa6flZuhl3qC1Kh/h5TAm8Z4d7Glt5ZkgMCcv3mEhHmPg3yQkJHKcZa8nMV7cranupB7gWyXsauxeWhsWLGubmVpvJK8bmh5bXGP2H1Sa2K2sn1+cJR1mqGqkFZOV2FPVk5GVVxYUFBTi1tXW1BAXERQTkNGSTw8NTc9Ozo5Oi49Ozg3ODs5PkY2Ojc0PkA+Njk/RVJJOi41PjtCPD9BODpKPjUyKjIyQUUvLjMyLisvKS0vMTg2LSAvNDE2QTE9OleDdzExVGtcT1tNXWdcPkwxWls0MSGPp5SBqKqfmJ2epa2yqrDCvbK1wLW3v8KrprSuramosLWqr7a0qKimtaWoua6csrK2qqWkp7KvrrGmq56npbKloqKgl5yioLKvlp+kobW6o6mooKytpKKdmpqjqaCYnKmgn5eeqKiRnKeblJ6ip6OhsKOen6OWl5OYkpmFr2tqjI6qf2iFloetZnGfnpWbqZdxrqGkfne6fGugj3axX2q0W6WAZZyQYGaBemZ/aXhqqWW+cmemjHaxanyxeHWRlGNtbaduXISgRWlnh5ZFdZxgfWZ7o6aBWF+Lq2h9j3h6aqg4Sq9bWFRsY1pLT1hfXFZWO06HUFdWL0lTU0pDRUY9PzQ2Pzs4OjkwPTg5OTk6PTxEODs6Nj1BQDY8QEhRRzkwNzxBQz5ARDhARz0xMy0zM0UzLy41My8rLyguMC46Ni8nJDIwM0IvPTtVgnYyLVZqXE9ZTF9nWTpNNV5YMzEbkqKVg62npp+jpauyuK20vb6wt8WyuLrDp6mwrLCpqrGvpLG6sKSlr7OjqrmpnbKysKOkoKqtsKyvpqifo6KxnKSemZaZnZ6wqZicoqC1s6Gqm6GtrZ+dmZeho6mdmZ6loJyZoaikj5yimpehoKyfpqagmp+hlpWRl5GahrWbtXmHqZq2mXeHs5u3f5SXmKyXf2uBpnqBhYaRlJJ3q2dqsVuse46HlHSJcI6GgH+IkJd4g4KKl4yDoI+FsHZ3n3Fra218i0+lWEhjY5l+Y2ilX3lxdVKShl1QqW5jcHqFgGGdL1KibltUa2dgTEtcZFhcWkI+sHdXWEEjTWlGQkRBQEExOT44ODo4NDs6OTw5OkE6RTo6OzY6Q0I4PT9LTkg6NTpBRkJBQUQ8RkQ7MDIwMTtFLDAuOTQwLC4oLzMsPjgzMR8vMi1EMTw8U31uMytYalxPWE1fZlc3SjlhVDUwHJeglImzpqahrqmos6yqu7fCsLzDrbm2wqusra+vqK+zqqKvvKuiqLatpKy1pKWys6ijop2nqrOpsKimn6CgsJegm5aWl5ugsKScm6Sota+hqI6pp6qbnZaYoaapmp+do6CcoKOlo5abnpianqOrnKaanJqioJeTkZOTnYTVk5m5cbHCf8aHfdaUnLt9nJeoko+djaR7jYaigaWCeat5j51Wr3uJfp9quVq5d4aEfaaClHyZeqp5jp2Qe7FtjoR0kLuGb5VQr6fFilGgemNgqmJzcoZrlodeUrW0yIV+iHxjpDNCnXVdUGpoZFBAWGZZZGFKR0xqSlpTT1lmWkNDP0U/MDw8NTk8NzQ8Ozg9OjxDOkY6Oz42OkBDOzZAT0xIPDk7REhDQkNEPEVGODEyMTFEQi4wMDQ4MystKS4zMjM5NzEjJTUqPjM9PVF3ajYqWWlbSltQX2ZUN0g6YVA3MiWco5OZsaippbOqpbWopLy4wbC6wLK3tL20tqiysaSys6egr7apm6i6rqSwsaGytLGhpJ6eqKmxqbSpppyen6yYmZmYmJaYo66fnJeorbGpo56PrKKnlZ2XnKGmoZiioaKhm6KiqJyfoJ6VmZunoZynlZuan6GYkJKVkJ2Ism5otXKsiHCPp3K0dXS2e5yZpo6QnY2jfo+eo36wdYKQ0tJ1XK58hX+kbpuqpmqGhX2tfZiZkHuxc5Odj3mzZZZ0hZ5un2aUUsmLWsJcn3liX61fdnOFYZaIXVnKnW/AgHRNS7VTVcZkVVFqY2VYQU9qX2xpUFVGSDk9V1JbVllIQj9KPDI/OzU9PDU2Pjs3Pjw9QztHOTtANzs+RDsuQ1JKRz4/PElKRkNFRD5JSToxNzQ2QD4vLjI0MjUyLSkuMjYsNzQyJh82MDs1Oj1QcWg5J1dpXEFOVF9lUDVHPWFNNjIuo56Rpa+tpam7raa1pai2u7yzu7+4t7W8vLSmtbWjs7KkoKywpZinu66lsrGdtLiqoKWdoaqlsqisqqWanZuqn5aWmZmTlKSropiTpquxpqGVkqufpZKUoZylp6CVm6anopujn66aoJ6ekJaco5+dpZSdlZmjnpWZlpObhax8eKh3o4+Lh6pwrouFqISamqOLk5qLon2Sl4euhH+Bs1xyslOvfYKCo35x1313hH6PnYaZmnevhoqRnIh3tGGaZZqCgZVskluwV0uadZh5ZmCtXnZ2hmeXiGpdr3eVn493bDV5yK6zX0NUb15nYEVQbF9wbVZVTS5lY2hSWVA7QURATDo1PzkxPjwxNj85OEA9OkM6Rzs8Pzo+PkU5LUVVSkVAQzpNS0pCSEc+R0s5Nzw0Njo+LzA0MzMzLjIuLjE4Ki4zMiUhMDM3Njc9UGtlPiZWZ1xAPVZfY042R0JgSTo3N6CdlKC3sZmzwa2osqeqsrq3tbm+ubizt761prm1obatoKCprJ+VqLasqLGyq620pJupoKCoorWnpqqkmp6WpaGUlJ2akpakqJyUkKetsKWglJmon6KPkaKaqaahlZqmqZ6dpJ+tnaCdoI2Un5yfoZmYnJWWoqCUmJGmnYapfn+meaGPkISqcK2Ng6eGl6GjipiXiKOBkIaUqnp/i515cLFaqIOCiKB4dNh/dod0p4GOm42SpHyVkJ+Ee7JenGSgfYKVbpNcq1xbk3+Rf2hnqmNye4BqmIZxXataiaCPa25kT0pDoVxaTXRdYmZNWmFfcnRfSlU1SpqRWEhFPUdFQUwzNUE4Ljs+MDVBNzhAPDY9PEY/Ojw2Pz1CNy5IVkpFQEg2S0lOQElLQEVOOjpANC47PjAwMjE1NCsqMDUvNywmMjEoJCQ2NjcxPE9lZEEmVWZbPzFUX2JMN0ZIX0MxPTeinZqavq2Ys8Guq6yop7WxuLG1v7m6s7K5vKq7tqGypZ+mp6eek6uyqbCqtq2qr6GYoqCmpKS6o6OsoZeckqOglpWfm5WZoaGRjoypsLCmnZaap6afjZKkmKirqJWYqaifn6CkraOgnqGOlaGZoKCSnJeblZ6hlpePq5yPrm5ytHSpjHeLpnS0enW0gpSnpJOdjYmkh451uG6Le4uia2u2WqGGZZeXaKCip22UcrRzk5l/s2qFkoitanW0YZ1mom6GkmuXXK1gTqF8h5FSc6NseX9+bpiGb1yvVjycd2VUb24uW6dPYlJrZWJsWWJcYHB8Y1NZUT4/bG8yQkJAPk06ITdANi47QDM3QzU4Pz8zOzxDREJKRk1JRjYySlRLRUJKNklKUD9IT0NGUD08RTUwOzswMTAvNzUsKywzMjYvIzAwLCwdMjg5LzlOYGVEJ1VkWT4vVV5hTDVGTV44MUE4pZqcnrqjnLHArq6rq6i3qrivtcG1vbKxu7iswreqrKGcp6SinZKrq6i2o7Oorqqhl52ooKWruJ2jrpyWmZCmo5eOnqGcmZ6fkZOVq7awppiTm6yployTppqlraORl6uypKCeqKywmKGikJmhl6CblpuXoZOdqZ2UkKuZh9OUmrt1scSAxId+1pecuHmKkpmOmIqMp4d5orZ1fXd2woKasmGDunnAfHW4YrWBjIepfZaCrKlxe391vIinoGmdYaaOr6F9jHSHq32+bnO8dLKDdXiBim2aiHBtjaR0vV13fVthebxqWlZbaXleaWBkZmJteG9YW1lDQUBxP0NHKzRIIic7PzEwPD83OkI5OT1DNDxATlpeYGBfX19aUFBSS0VGSjRITFJASk5FRk9CPEU4ND05MDIwLjg3LSouLzE4MCItMSwzHiw7OjA4TFhhRidUY1g8L1ReYEs1PExcLTZAOaean6K8o5eww6+tqqqtsai5r7fFsbuzr7ywrsGyraajn6SinJyRq6WqsqW1p62kn5aaq5mnrbido66ZlaGRpqCTjp2jn5mfmpCWk6+5sauVlqOnppSQlqWdpK2fkaCoq6Ccn6mksp2ipI6moZWhmZuWlaSZkLCgkpWqn4WQmbaAkpKNuJZ4g5ObtndubG90b3mPhI6Jcp7Au7yae4GyqHCBdJG5g3yGhouGjHuKh4yXfaS7ub2cdXmzo3R1l3V0sHWYnmaGaY22dHJxd7aMXn95fYhng3lseWKLrHB0hX5YW6dpRGRZVGZfY11jUWdmcW11Qk1PTEQ7Wkw+SjM8MCA4PjsuMz1BOTk/PTs8QzZCVFlaWltbWlteYGJgXVNHR0g0RElUQktOR0VPRj9HPDc/NzA3MC85Oi4sLy0qOC8lJjIoNCQoPjcvN0tUX0cnU2JXOCpPXV09KztWVic9OjymnaGhv6aVssKzq6qorKuqu6+xxq+1tLC4qLW5rqukoqefoJ2ZlK2lrqqntqion5yWoaSerKW+p6Gql5WckaKbkpCiqKKTnpeSmJSytbasmJ2jpKKLk5KmnKarnZappaadm6Gpp6eiqKCRrJ6Xop6Xlpidno+wqZScp6KPa39qnKl5iXR/m492e2aIe72+wLpvkoNxlIVfcmpaXpuJYWOHj5ZsYH+UY22cdmKVbICZlZRlXmBjcZqJaHKMe4aUZmp+cHR4fn1iW3h0gWhQXG6EfHyKaldseoFySUpvhXBOck1EVlxmYExaV2ZjX09abXZqclJPRERNPEhJPEw+MiwyQT84LzU/Qzw5O0A7PUM+UlZWV1laW1tcXWBhYWFgXFVHNUNGVUVKT0hGUElJSDs4PTUxOi4xOzouLy03Nj01JiIvKjIsJTs4LTdJUl5JJ1NfVjQpUF5MKDM+XE8nPzI+qJ+oocGkmbS5tqOspq6nqLWyrMissLSttqS+srOooaSqnqOcmpqsp66kpbWqpJuYlaKcp62pvqippZWUm5agmpOZpqmokZ+Qj5icsLK+rJqmnaeiiZOSqZuopJycrKCjmpyjp62in6mhma6blKagl5Sen52YsaWZoqiZnZKfnaSmm6ikm52anJuRl4Jobn1yd5GXlJCEibSqjYWYlY+KjJiXiJSViYOTk5CJjZKUmZOZl5qfoZqblJ+bjYF5pIVsaXuQfYB1iYuCcoJ4eXZ2in98iWpzgXSDdWR3fXZrb3lsX2Jbb2dNWFlmal9XWXB6b21mU09GUzlQWk5STygrOktCNjM1PUBBOTpDPjxFTlNTVFZXWFpaXF1gYmJhX15eW1RLQ1NHS05ER1BMT0k8Ojs0ODksMjs4MjApNklSTzgiKSsvMiM0Oyo3Rk9bSidSXlQxMFReOis9OF1LLDwtQLKgs6K/oqOwsbegqqazp6awtarJq62yprWmwKm0oZ+lppyllpWhq6eto6S3rKCZl5agmK2qpsGfrKSWkpyXn5iUlaOfnqOok5CYqKiyw6+Zqpyqno+Wlqmeq5yeoa2YoZudoqWvpqGkp56smJalnZmZoZ6enbChnaKnlpmUmpSho5ekn5mhjpiVi4uOkJiuj3yVm4KRgYmpqIWAmJaLhI6fiHuEkYWFmpGHhoqVj5uXjpCYnqOWmZKQnI1+jWWhs66EiYR3e5CKfnd5em9neZGAgYhqdYF5iHJoc395dYOGgWp0YnhlX2hkY2Rmalhre3Fqa1xTTFBEX1VGQD4/LDRARjs0NTs+QTs8Pz4+SE5OT1BTVFZWWFpcX2FjYV9eXl1eXVhWSktMQklPTVJKOzw6Nzg2LzM5NjQuKCYkLTEuLikrKjclKzwoNkNNTEQvVFxRMDVNWzE3RTRcRzU8LECzoLmvvq2qrbGyoKqmsq2jrLOwxbCrraSzr7yktJyhqKOhnpqXqKappqSms7WflZWempqwpq6+oayikZGempqUkpainJepnYSdqaujtMezn6mjqpaWmJqnnqmcoKWslJ+fnZ+qrqikoqugq5qen6GYpJ6cn52wpJmfqZSZmZ6TppuZqp+cl2aFk31lf4+bkGN5jGxoanqQo6tqZZqYfmeFi2VlaWh6jaKOa2iMmJGid2tqi5mjn5hza216hIyGeVhlXYWBXmyLioJ3XGdzd3eSgIiBbneCeH9zbXmEc3aIh42CemiEWF1qc2Rdc4hpanxxbWNdUU5WSWRYQEkzPUY3P0ZENzE8PT9BQzs7REdISElMTk9SUlRXW15gYWFgXV1dXV1fXVpVT0RIT0tTTj0+PT02NTM1NTU0KiYmJSwqJS4rKyc2KiQ7Jy9BSVtKLjZaTzYpRVkvRE8xWUI7Py49pJ66vbmvq7Owq6Wora6wp66usL2xqqilrrCwoK2XoaSeopqapqycraSmqKmzrp6WpJCjsKa2uaWuo4+PmqKak5KboJmZppZ7pKuiqLTDt6Whpq+enZWeo56jnaSqqZKfoZ6gqq+qqaKqnqabpZ6noKuWoZylsaSXnayWop+blKaZoKyZn369hIlztHOFn4ataHe5xLhxkqGjeqaYmXSrgn3LwMC6cYujh4OefZaYiJ7AvYKWnZ2NnMHBe4F6kYyawsB9aqWyb42Bb8p6f5t4koSPgHZ5gYB5cXuAhnB3hYuSeGx1kWJlXndjX2WAYl50aG1kYlhLVUlRWUhPRDJJRT9EQj4vPD8+QEE6OERDQkNFSElLTU5QU1ZZXl9gYV9eXl5eX19fXVxTTVBHVU5BQD89NjQ2ODI2NiomJSMpKiYuKyopMTAfOSojPklbTCojQ1AvI0ZbM1BZL1VBQjsvOJWiucO0r6+/qamUo7CqsK+uprK1r6qmp6axq6CrmJujoJybqqeinayjpailpbSknqOTpq6tuLSnr6KSkZmdppORoKGYm6CeiKarpKutv7+xoKivqZaRn52imaOkqqOToaGenayuqKqlo6Gkn6OknK2pkaSbqa6qnJ6rna6jl5iml6KkmJ5/zpR6e6WCepaXm1+tj12OqIChoXynlZt1q4OBr15kjKp7qIeFoHSXk4izY4KrhqCNjbNqhK90fJaHuGGCrVmjzW6Qdnvbe3+ZcX6Ik3Z/ZXuIdXZsfodtfYWPkH1rgIxfcGpvZmBfeGRbcWhqZGZgUlRTV15KT0M1QUhFRDg+NTtAP0E7PThAPj8/QkRERklKTE5QUk9TXF9fX15dXV9gYF9fXVtXT1VKPT8+PDU1NzgxNjQoJyQhJywmJi8oJiszHTYwJDc6U0wrLC1KMCc7WzpMLSFQQEY0LjGswcC/tLSwt5iekaOqqa21q6ayrayspKymsKqhp5yappicoq+foZ+op6OmoZ+wrJuelqaurbGrqKyglJKbn6WTkJ+ll52oo56to6qwqL/Fsqepsa2Wkp6copehqqqflaGenZytrqapqJulpaKgqpKss5aloqqqnqSnp6KyopObp5yhnJaVkZehcoaMmHaGqIdxsXydcax9oKCBpY+eeKuCfq1/nXKtf6yHhp92mJJ7fJd+qoiijJGLnH2reoiSj59/eq1WnMR7kHCSwX2BlW11cIxtZndlhm9heG5yboiJj46DbI+NY21zdW9gZm1kX29pam5mY1dTXGBaUlJDOElJQEM8PjxARkRDRUE9PDw8PkBAQUJFRkdFQENJU1dZWlxdXl5cXl9hX15eXVtaUkM+OzkxNDc4NDUyJiMfHCAxJyAxJx8nNB41LSY3PVdKLTwoPTEpM1ZARiEcRztDMS0rr9PGx7Kzn52jj6Oioq2vt6+psaeoqqiuq6unoqSdmqOVn6aroKKmoKioo5+esK2Ym5aop6+tqKepnpeVmqSikpShrZudp6OvrKKstam5zLGspq2rlpScnaKZn66snZahmZ6eqbGnqKibqqejoaqar7GiqKuuppqnq6urs6STmKSnnJaThaRrpHWKeql1e7JxgqWKmIxwiKCbh6RfYVKrhYCug5x1roKohoafepmXhntmgKOKpJiGgaN9qX+BlIauXnuoVZ2ikoF7o5+AfMSwxYxzr7SzuXJiqa/CdGiLi5aNgGuXkG1reHh3bmtmZGRxcWZ7aWNcVl9pWFhUTExRTENDQUI7Q0BAQkk8PTo5Ojw9Pj4/QT04NjtETFBSVFZYW15eXVxeYGFgX15dXF1bU0lCNjc5OTY2NCwmJCIgJychKy0iJC4hMy0mQERXSCxHKzU2KjFQS0wjIEE5RDQsJ8LJ1dbAoZmrqKGvop+wtLCwqa2jp6eqq6uopKagm6WfnaanpqSdrJqirKGjn6+jnpuTqqS1sK+hqZuclpWnpJGboqifn6acsKWiqLGstsextKirqZWRnZ2hmaCls52aoZScnqeqqqKtmqqmoKGporKsoaqzsqKcq6mxsLillJelqpqdk32qbZ+DiHareXywboKki4mflpWeloHSuLS4yYGCsl9hlKmDpYiHoHqYlpp5qsl0mqOUqKmQkpqMfpqJmsbGd2WhgqVzgZ+Ogn2vX2+1Y7F1S6OGbadHg5Nkjo+bkXtvlI98bXl0fHptW2VqcnFmgGleYVhjbVxeWUlMTEpFREJBPUE8QT9KOzc5Nzk5Ojs7OzMuNjxBRklMTU9RU1daW1tbXV5fXl9fXlxcXFxcWE1CNzU3ODUvKSglJiUkJiksNUZOUFBNRkxKVkYqTDAvPi00TlRRHRw7PEYyLCSopMDGua2psq6tpqKcsrmsq6Glm6imqqyppqCmpZiro5+vrJ2moa2an6mlnae1oKOYlKirtrOsnKacoJaQpq2Smpyno6Cqp66ho6epsLPBsbKprKeUiZidpZuipK+ml6KVmJylpamZrpyrpaSdq6O2rKGxubCenLCotLS1ppaZqqacoZCDnk53moKAnnqEo3yCpISGpp+cn5SEuHx8ermCf8zGw7Z3m6KRi59+mZeXinafl4qkmKSnfq+Fm4OehKx9mZRhpWyjcI+FkIF9loRyrGCkc3GAmmG8fVJVdY2RoZV6fJCOh3J5coR+b1tsbndyaoFuWmNfaG5iZF1MTFFTQUhHRkg6Oks+QjEwODg1Njg3Ny0qNT09P0JER0lMTlBUV1lZWltcX19eXV9fXFpaWllVU09IQDc3Mi4sKi4rKicmP1FUVldXV1lYWFdVT1RGPEUyOlBbVBwbNj9HLC0gjIeZqaykq7mrr6CboqyztaafoZWlr66uqKeepaWapKehs66iqaezoJqppJSjtaOjlZehqbW5pJyjnaOTkKKymZ6bpqWgoq+tnKSoorWxw7CtqaypkYaRnKedo6ScpZeemJiZpaOnmK2hq6Kkl66lu6yit7aunp62tLqztaiaoLGkpqCIkNK1w7d5h46FkZOPgKZ4lKJ3jKGShaWDi3Krh4a0bnJpmaSdlYmffZeZh4eQc66CpZujjaaKk5yIlJCabXCyXKVzk3qcbJl/e5l+bqlhonJyfqBic7K4aHeOkqSXfImKj4h1e3iNgWxod2l4c25/dFxkZG1tZmhgSlpXWDxIRj9TM0BGPjwqKDYzLjAxMykmNDo7PD0+QENFSUtOUFJUVldXWV1fX15eYF9dWltaWFVSUlFGOjIyMzAvKysoQFFSVFVUU1RWV1dYWFdVVVZUUU9RW1UlITJBSCMpJZJyjYquv7+8u7Wel6ikrraiopmVo6qnramqmaWin6agoLWmoqmnsaSUq6OPpK2knZCamqq0tKSdpZypkpSXr6CgnqajnKectZmgqqO1qsKvqKqooYyEj5yioaajlZqanJiamKajpZepp6ugo5uspryslb2wrZ+jsbW7rbapnau0pquafKiRfXyweIuApKWInG2yb6GHrXyij4Ool5qBrImGrYWglKigo5eFn4GZloF7kn6rgZ2Zlourd52gj4iTkn95r12jgXymp2SegHyXdWquXaVscoWZXWBbjKBtlI+kl4GSipOId3mBln5pbH5ifXRtf3lfZ2Vwb2dnaEJZX1o9SlMyUzhBQUM3JCQzKycnMywgLzY2NzQzNjpAQ0ZJS01OUVNTU1ZaXV9hYGFhYV5dW1pYU1BPTkk4MTUyLiosQVRWVlZUVFVVVVVUVFVUU1NWV1dYVlVWUUhGSUojKCi8kpuEqcbDt8G0n5qtoK65pqOOmqOkoK+uqZ+jnp2tmJ65oKOrobCqmq6hkaqppZaKmpCtsaynoKibrZiZj62ioZ2loZmknK2Xn6iltqi+rqSpo5+Lf46bm6CmnpKUmZuUmZmlo6KYp6uqoaKeqKe8pJfDraujoq20vK2wqaO2sautmnevfpGLnIaHfLqtiZhksIxllq59oZCEp5ecgq2LhbCGqJqkoqKRhaBcbGuCs2B/rXx7goGybGZumZeLiLFafbRbpINryKJmn4F8u1l2tVqyfVOvgXqsWIChbZeNppiIlI2Sk3h3jJt8Y3N8YoN3dIB8YWlmb21mZWZPVWNcQVRdPUgoPjk9NCEhLCQfMi4gKjEvMDQ1Nzk6PEFDRkhKTE5QUFJUV1peYGBgYWJeX1xbWFVQTUpHQzU1My4vQFVZWFdYV1hYV1dYV1ZXV1dXWFdXWFlaWltcWFdXR0I70p+zsbe+u7TBs6Ocraalt6mgi5mgn52ysaieop+dtZigs6iqq56wrZ6snJWuqKKOiZuOr6ypp6Oomq6Tmo+pmqGdpZ+Zo6KlmJ6iqLGou66kqJ6djnyLmpahoJmQkZqckZmXqJ6fl6etpaOkoqSpup6gxqemqaGstreusKmhv7CwsJiCqpKjr46bgIakl5iQgIC4w7qEj52ThaiZnYOsi4OviqmdmqarkX7VvcKqYqS/vX1/o4KD17q3tYSUkoKevb6EaqOBb6uEbp1/erKxx4Nrq7G9rHl4or67dICVjKSZjZiNk5l3f4+ZeWJ8eWSMZniBe2BrZWpqYlBiW1NpXEBUYEJMKTw6NC8fHyQeJTIgHCQoMDQ5NjY3ODs+QURGR0pLTU5OUVRXXWFcX19hXmBbXFlUUU1IQz48QT81PVNZWVhZWVpZWlpZWFdXWFlaWllZWFlbW11dXFpWWFRXWruVtLSxwLmyvbOina6nprOmnYyXpb+ptq+nob+mprGbnrGcuaifrq+lp5WUr6yXjIOaka6mo6yhpZyqoJiKo5OmnaebmqCoopidoKusqbisp6Oal5J7h5mRppuSj5CYmY6Xk6iYnpaoqJ6opqCiqrqeqcWjobCkrLS1rLKso7+rsrKcdXaqpbeGZYqgcGeskIqPbm53pZCboIJ2sZuXcJGOcpeqpJuZr6RybG1tZot4b22DmXGAemlwaWeJlpWXcWhphYZncYZkXYpjaW9aXWd+eKZgYnKQknBmZICNko2glZWXjZKaeoWNk3RkhndnjGp4fnlkbGNmbGJKZFdJalk6UGREUCdKOSsjHCAaIiwpGBsYLTIuNTo0NTc6PD9BQkRFSEtMTU9RU1ZcV1pcYF9hXV1bVFBMSEQ9OkFCN01YWVpZWVpZWFhZWFdXVldZXV5eXVxcXF1eXV5dW1tVV16ola20qbq5srSqqaKun6SzqpmSvbHDx7y0qZ6/q6yjoKeroLqjpK6sraaOlq2qkIyFlZatn6aqop+ko6CRi6WSppmpmZajqaCWnKWlpq65qqyZmpOSe4SXjaaXjZGQl5SNl5Smk52Wp6KZr6Wdoqu5n7DBqKW0p62xs6ywrqq8p7G7mIyiqaa1nImXo5iGqZuQlJ2SqrSanKStorSYpKOfoqOeo6Wil6ynjJKTjYeTnZ2VkJmTmJCNlYR/pJqXlY6Lk5KKkIeEfmeMgXSDd3SHjHGnbX2Wk5SUgYGPj46Nm5Gdk5STnYCFkotwaI92b4l3dXx5aWtkZG9jVWFYQGlaR2JfTVgrRT0rJiE2NDAvHxwgJTIoKjc5OTQ2OTs+P0FCREZKS0tNUFBRV1VWWV5fYWNdXlRRSkVDPjk9QEFTWFtcWVdYWFhYWFlYWFpbW1xeX19gXl5eX19gYGBfWVlgpZapqqS1t6+uorClraCgtrGRjqrEvMO5tqmhpJ2bpZ2wqKS3p52ptaeokZiso4uIiY+cp5atpKGaqJ6fk5Wkl6iaqZmUpqCjj5qnmKC0uaeqmJqQjHuBlIyhlIqVkZWQj5KXpI6dmKiemrSjnKart6ivwq+kuKewsLKvq6y2vaOywJqTp6SmtaKSnaefjamfjZKfoq2xm6Kks6uzmqajnqasoJ+enZitnpOaopyUkJermY2YmZeQlp6Rh6CelJSGk4yPjZWMgX9mjYh1iHd6iYR0nGqIkpaVkol9jJaRkJaQnpCZkp2BhpaFeHGUcnmJf3F7fmpuZF9waWBcX1ltYlBgYk9YOUZGRT0yPD04LyomKykmHSY0MDY2NTg6PT0/QUFDSEpHSktMTVNTU1VaYGBpYGVWUEpBQ0I7OUVNVlteXltaXFtbW1xdXV9eXV5fYGFhYmFhYWBiYmJkYlxbY5iWpKijsLOsrqOpp62gqLWqkI+bo7K5raqroaKZepyhsKSmsamXnLimo5SYqZyOhoqJm6KQr56klqigoZKXmZyui6uWj6iZp4yYqI6duLWjpZibjYh5gpOMm5OJlZGTkI2RlqGLnJ2nnJ23on+DrrWisLB1pL+ks6B5e6Kttb+XeLCmoYqAqn9kXGJ3oI6knoOWfm2UtZ2kqbCspWagoZR0epuZcIGZqplsf6SpimWcpZyRl5iXi5KbkISdm5CUg5OHjo6SioV4a5CIdodxfIaBgWFpiYyVk4xbdpWRZ2eOjHF5oZWVZHiXhYB2l2iCiYJueX9rcGRfdm9ra2dbZWNhYW1RWT1NTU5SRj1AVEI5MS8eHyY0OjMwNjY3ODw7PkBBQkZIQkdGSUtMVFVVWV1gaGZnWFFJPERHPDlVUltgYWJgXl9fYGFhX1xdX19fYWFiY2RhYmFhZWRjaGReXWaclqajobCxrKuqpamuo6etpZKVqrSusKWZqaWql3OLnK+gqKunlJe5oKCPnKSekX6IiJqejayapJWnop6Ol5KehXWuj4immqiRlqOIm7mzp6CYmIuJdHaSjZaTiZOQkJSMj5OfjZmepZibsZWAjJu1nbSMko+9qKJ+p6N7pbG6g46PqJ+EjIaPsamvjIqWopp5gIushp2eo6mrqYmWh5p3pZx7iJyBmKeDgXuds3uKhqCYmZSYloGQlpaDmZpieYiRhI2PkouEbnGQiHqCcYGBhoCHdIiFl5N4lmiTdKCac3uZgpuZhJh+kYiBgphpjIyEanh7cXBmZXhuaWxqW2RpaWRxWlxHU0tRQEU1LVlUVDYpITA5PT42NDM1Njg7Oj0+Pj9ESUBJRUpLR1JYWlhbYWFpZllRSDlETDw+YlZeYmRlZGBhYWBiYl9dYGFhYmJiY2ZnY2JhYGVkY2djYWFonZikn6aurquoraCpsaenqqWZk6zEvK+glKWntJ2Pg5yrnKeioI2Qvp6ZjZ+aoZF9ho+Yl4isnaOWoaGSjZSJhoCRqI6Hopyjk5adhp65saedmpKOhXB1j4mVkIqUj46bi46RnpCVnqOUnauHn7SJtJqui8qIq6+Kt4WNsISzsoapjqmZjZ18qI9ye3ecjqaWaJWkebSMoaCoqpOZwoKAq4mZoXKegJulfZeFlbOBoX2hk5+PmJiAjpSciZiSi3yFlIaNlZOKhG50koaAe3OHgYR9hXWGg5iBj8VmgKmHj6JqnYGdl4CZgIqMg4iYb42ShGd3dHt2Z2h1cGdoa15ibmxmaldkRVxQTDJFNDZNYGM3JjM8RUdEOjYzNjU4Ozg+PT0+Qkw/TklKTENQWl1cV2JeamxcUUU9S01ASWRYXWNmaGdiYmJiY2NfX2JhYmNjY2RpaWNiYmJlY2FmY2JiaZWXo6CwqamopqygpbmxqaummpSeoaSpoZSjqbWir3+gpp2lnp2JlL2ak42gkp2QeYOWlZGIq5mcm5qihY+MdpubjqCRiJ6jm5aYl4aiuKylmZuMjH5ibY+Lk5CMj4uMl4uPkZ6Nkp6gmKCnfqGnh62doJaukKCenZGHgqGNrbKIpI6sm4yafqJ2gJmUa4GrdU2reIeNnZOcqqmCqqt+hKF8e6dqnoCTbGeXhpi3iZ5+bmBjWIOXf417ZGeLc5l9eZdsXHyXbmBTcYVcYG16hGBZZYJ+hYGZcaiqa4OjbnKlb5+Bm2dknmxabIh6ZVlfgn5hV1BvdmVudHFqam9daW9samdXZk1cV0U4QTRHQ15rNCtJQ1FNTj04NDg1OTs2QDs7PkJPPlFSS01CSltdX1deXmN1YE1FOk1OTVRiXFtmZmlpYmJkYmRkYmFiYGJkY2FiamtkYmRkZ2RiZ2VhY2iYl56guaGqpKaskqK2vauvopmWnqClq6ufnK20oaeRoJ+gp5yZjpm0mZCLnoyVi3WBlJGNiqaWlpien36ThYWso4eckYqYqJiZmZGHpa+mopWZh4mAaW6IiIuOjomKjZGLj5Ghi5Kdn5qhpX+TgY+joZSgd5yWkKeDo6mAhqywh6V6jH6Emn2icHOTh5V7nox5bYeci5qSnKqcj4edfYOidHemZ55+d6VemHt9k3Oibpi3tLpzk4iBgLaoZIHGuHxxlbaMcYCbo2N0rKthfmqds35ufoiDj4OMmHGAo2xyo3Kegn2jXpyZs5Vve5ees3RyW56ygmlicHR1cWhvWGprcXBkW2ZcYUtDPUQ1UUFZcDI8UkdfSlI9PDM5NTo6NkM8O0BJUD9UTk5RQEVfXltZV2Bge2RJQzhMV1VWY2FaZmZra2JiZWFkY2BhYmBjY19gY2tuY2NkZGhkYmdmY2holJaVo7mZq5yToI6luLWtraCaoZuio6SsmpqxrKuSl6CZoaWZmpSerJuLiZF4i4VxgJaNio+hkJOUnZd9kYqOqKCGmI+KkqKTm5qMiqinpJ6PloeEfmt7hn99j42Di5CQiY6Tn4GVm5+boJ+LiXecmKKNoHKhjImpiZ2okZiqroGujH56oJl5o5N4gHOXiIycfZWfh5uOmp2oiKNkoX6KlpCbjW2eaJuOb5qZe4CKp31yaHSqg56Dc6pnlJpdm4V2hJ1oqmqBuGZcqXCBnGGVjF+ndneKioCdaJp1h5OSmI1+nmyYj2qmmVyofne7an2pWo6EXbNnXG5xeHdraVtwaXd3YV5jVmFBUEVON1ZCUm00SlpaXk5aREAxNTE7OzdIPzpDSFU/WVNYXT5EYl1WYFFhZHxpRUI5TltdWGRmWGZmbm1iYmVfYWFfX2BgZWNeYmRvcV9kZWVrZGNpaGdraZWdiaq2nKiJY5WcrLuysKydpZuap5+drJmdsKeqnZejmqKfmZaWoKOZhomNaYiAcnuXh4yWloSSlJiPeouElqSciZWQhoudkZybiI+ooZ+ai5CKgIBpgYZ5f5aMe4iNjoeOlZl9kqGeoKGTmHJon4qgj4xwko2CqYmaoaWqoqp+sK2koriXdqOzoqN/iJR4nXqqmX+ij5+dmYmYcqF9h42wtX1smpGheH6ZtaOjq6iEmXyafJyaf3SqWl1ve5eMeJ5iTX97e4VkephCTZ9ZompzfI5vgoqEmXabeYeJsbN/fpqSpnN9nW1wfJRvmXJpo12VdkhlY2BzcH19bmVfa2d1emJiXk9dVlxUVkBZRVBmRFJWXGFYXklEPUI4P0I6SEU4TEVYQVdSWlZFRmFcWmBLYG19cUVDPFVeYlplalZnaG1vYmZmXmFgXF1eYGhiX2VjdmxeZWdmbGRlbGhobGmUnYGxrpqEVF+hp7S6s7OpmqKLmqmbm6eSoKujoKePnp2dmpmVmKGdloeHiXeFgW55lYSQm4t9kZOWiHKBiZKhm3KSkIGImJSfmoSOqJuZlYqKinyDbISFcYKhjHeEjIiGkZiUe5Gin56jiK6GfbWEj56de6aWeqmCl56RjKOgf6doeG5+mXOgc3F8nYWYb5OCrXykhKefm4KkcF6paHajZHCmYZzTj3x7mXhyc2OihpB+onKjkHZrkLOLYIKYinSqsqi8f3eDbn+/pqq0Xpxvf3KXcIJzonJepGd0pmBopmyb05h5gZpudnmXa5t5dpdybKmlZ19keXF/hGxoZmNtdXZmXmBRWmVQUWFIVklUX1dTW2RqW2VQRUNLTEpLQUpEOFBAUE1YU1hPU1FgZWVqU2R4eXdJRkVjXWVaaGlTaWhqbmNqZmBjX1xdXV9oYmFoZXxkXmRnZGtkamxmaGxomJt/saxUXUt/qrCytbCzopyYhJemoKCijKSnn5aoiZmYmZSZk5Kgl46IhXtwfYRofI+Dk5qCd5GOj4pwgIaPk5JsmJR8iJGSo5WDjamZk5KKhYl5g3aIgG6Bn4Z3gJGFh5ihlXiSoaOZn4mzoaK2i3qsp6SupXCpgJuRhoGelH6lgaOahphxnoSira+Jl4t/jKSNlYOvo5V3tba2yaJzlIyDn2Gdl6lteZaHoJt1oYd3oH6QlouBb01mo5JxmohzpXt6dWKDgm1+oGxyZGCcc390l2t7arS2tMamc5h9eZxqmpmrc4GabHN3l2mZeXSXcVBEfbNeanVreIZma2Zic3RvbFVbUlhnT1FnSVVMWFJVXGdrblVnV01KQUlNSkdKTkFRSlBkY2ptZXVzc354e250iXp7VFFObV5oXGtpUmpoaWxnbWdjZV9cXFxfaWJkaGt7X11kZ2NqZm5tZWlsZaKdibCohWU/lKKyrK+vtaGij3+Wp6Gho4ukppybpYKZl5eOl5CQm5OOiIN5a3mGZYOMf5afeXWPiIyCaoWFkoSLhZ2NeoyKlaWSgpeolouRi4CIeoB9i3lwkKCFeYGUhoiVnpR+k6Smm5aWg2dueJxsomR8cqV4nJhwaKeCmY59pXuhl4OWcp92gYmUlY+5bY+KomJ9maOXiW5za6trdaBub6Zhm2mLkGmWh5uVdaKBfppgi4aNdW+IYmihZp5/apt1cGRniIJvcqJbX1tkoW5eiIxxfIB0cmSlbniiY2anZ5dxi5dtoW9SiI9uoF5kp1SLXVSYbW1ya3GBbXBoa3dzam5RVlVVZVlTbElYTltIV2hocmpZa1ZQUkVWXE1YU2FVaGped3V7fHB9fHKCe39zd42Ag3deUXNhZ2JwZ1BraGhrbG9oZGdfXV1dYGpiaml2dV1cY2hjamlybGZrbWOdpZmmemV0bYunrqWpsLGln4t/lqmcnaOLoaGaoaKAlZmTjpqPi5eQjop7hnGAiGiLinyXmnN0iX2QfGWDh5WKiZWagnyIhpamj4Chqo+FkIqBiX2AgI5zaY+lg32FkoyHl56Nh5GppZ2JpniWm36liZaMspmekYSvl5+leZiKe6l1qJCEmm6looyShIyDvG18pa+Ch4WHlZeeon6mfHKolaGWaJ9+b6xjloqWk3iobaqjgYl1iIJ3q5GmiGuSsWx3s4ypbIuGb2+gnpKVYn+rjKp3gYCOp593n32FpJWdoGeZh3WsZp6tjLZzdr6Mo5NZg6aNq2F1cnRve3VwYmp9bmdsUlRYVGBgXGtMW1FbSV1sbXZfW3FZW19aZ3NkbW9xY3F0YHd6fnlyeYNzg36Be3uMgYKAdmJ5ZGNuc2RSbGdnb21yaWZpYV9eXGFqYmxse29cXGJpYm1pd21nbG5ilqarnYGAnqSWqqqeqKeto5iIgZapmZ2iiZqknKichIyaj4ackYWSjYyMdIV6iINvjYV+l5NzdIZykYNuf4uSh4aUkH17goWXpI1/paSNgI6JhJR1goeTbmyLqICCi5ONiJueiIuSqqKgj4B0lJeIfoF4lK+kf4KccY+GeZOOhoF7c6mNcn19epeWm4SNeHt9fYiUlZOLd5GZoaKFe3+KbIyGXHp5c3pxaW5+k4pxgHSCj5STcYaEgmWNf1+BgYx4dnOUdXB6b2+Jb4WGX3dpeI5mgoOGj6qcf3R9lmmJiG9+dXuCdG1sZoxzd3uXd4Raald5j2lud3Jxb3d4b11rhW5oZ1ZZXlZcZGpjVWBUXVFeb3d5a2p3ZGlqanV8cHF0c2FvdWJze4F4dXmCdX+Af4F5i4WCfXttgG1keW5eV25naHVreGppaWRcYFpjaWVscXVuWltia2Rsa3ltaGxvYY6Vuqmni6Gim6ekmaSdq6Gfg4OWqpCdn4iZppqomIKBnIt+lpSHjoqJjHKCfI58fo+Ee5eOdHKDcJWGfH2Si4aGj4Z5foCGmKOMe6afioWPj4SVgoaOmHdxhKqFjZGcj4eenYaLm6efoKuDiY2Vm39+ipetqJCTqJF4cZ+ThX2UcH+rh3F+lXFqb3yBn4t/kY6LaG5dhI2NnJ2gkHOXjYlydWyDdnSAWXJvh5GCfn+Mal1pZHuFhIiAYGl4e5x8hI2DdoKHhGl6jIlsYnFzg3dfc42DipGolodnjY6CbHaKgm6CindtZGVjeYJ6lVpbaWZtdlt7eXd0bnNyg2ZcbYlra2JZWFxZWGpxWl5gWV1dZHJ9enRvdGJqaml7fHF6dnRkbXRobHt/dXp9e3l6gIB/b4aJg3t9c356cn9oVFxyaWx2cHVna2dkXWFZamhranFybVdbZW1sZ3J5b2hqbWCMjKuxoZCjoZqfn5iemaihoH2ClquMn5OGmqGRpJV/e5iFfJKZiYiGhopyfICLdoWLgoSWinJvgHOYhoR+k4ODhoqCeoCEipqfj4Gln4Z3jpeIlYqLnJeEg3msgZCXmJOJnZyGh6GqnqKio4uIk5udo5mWq6Kop6GTnImZkX56kJCGqX+Ak5GSk5yxpZqUnY+NsZKYhKaNjZadoYqRnYSJk4tsfY53d2aChpGLfYmehYeLj4iIgYWEkXd8e3WbpIqHi6CMh5Z/gI2DgXdxdYaEf3iJiIuRp5GEh46HgouPinqDiIaMf3VqgIN8eZlpcWhgc4pwfXt3dm93dIFdXm+GZ25fXllaXFNncFVjW1tgbGd0e3tybm9jamlof3tteH5waHBwbGaAe3KCgHd/fX+Ee22DjIV8enl8fnqDeE5kdmpzbnF7ZGtlYmJgW3NmcGZycWxVXWx0bWh4enBnaWtljYieup+XoqGYlZmYlJikoJx6fpepjZ2MhZ+cip2WfHmVg3uOmYmGg4SGbXiAf3KAh36Ik4Rta356l4eEg5B+gIaEh3yHg4yanJKGqZ2CcoqPhZKRi5yRfI16qYONkZeVjpuWhYWbpp+imp2Gg5KamZmQmaahpp6ekJeCk414fYmQhqd8fY+QkYaYqqGck5yOjamNkoCejYmVm6CEj5iAiI+EcXmGcnVhf4SQh3aMmYGDj4KGhX+GhJVuenZ1lKSMjYabhoaQdYGMfn5zc3yJhXt5jY+FlKiQh4SPgYKJiIh0goWGiHltanx/e21oa2xmXnl/Z3x7dnR2dXt3XGBwfW50YGNaW15RZmxTZFpdYGpodHl+cGxsY2pqZ4B/a3J/a2t0bnduhHluhoB2goB9hXdxgo2Hfnt7fIB7gotgaXtrdWhqg2RqY2BpXGN1Z29idW1sVGJxeWVveXpyZWptbYuKn7iaoaSfk5KWl4uan56cenecpJCbiYakk4qYmXl6jYV7ipGDjIKCgmx7f3hygIV9ipB8a2h9gpeJgYiOfH6FhId8j4COm5uQh6abf3CKiouShqChioWMfKeQh46RlpKWkneMo6ChnZaaf4GQmpiTjZqjoqSbmJKcgJCHe4GGkYmhgX6NjY98l6SgoJKZkI+ljI+BnJKKlZmdf5OTf4iPg3V1gnF3YX2BjoZzipZ9iIxxjH6ChYaPaHhyeo6ak5GAmH+JjHODiX19cnp8jYZ8e5OOhJemlI2GkHuEhYaEc3+AhIV3ZHB6fnh5cGtqZl5+c2h8dXVzfHOAal5gdHZwd2RjWF1eUmloU2RYXmBnaXV4gXFma2NsZ2V/gGptfWdtcGp9d4V6a4uBcoGBfoF1doKNhn98eoCBfX+PanKDbnRpYohobGJfcVZ0b2xtYHhobFdqc3ZjdHp6cWJrb3mJjZ+zkqWmnY6QmI+GnKCam3t1o56Nl3+MoYqImpZ4fIaHfoSKfoiCgX9wfnp0dYKFfomQd2djfYaXioKKjXh9gI2DeZaAlZeVjJWemn1vi4GQk4Wlm4eMiYOmlYSRipWXkpF2kZ2hoZiUl3l/jpiXjpaanaWempSVnXuSiYV5h5iPn3+Cio6Mc5einqCSmI6PoYyMg5iYhJSXmn+Zjn2KjoJ3cn5ue2SAfIuGcYeTgJGCa4eDgYCKhWZ2cH2IlJqOfpR5jYt9gol+fHKAeYuGeoWSi4yZo5eChIt2h4OBgHR4f4aCc152d3xzfXZma2Rgfmlqd3NzdX1xfGNjYXNudXJtYVlfXVprY1JiV19fZ2p0eYVwYmpjbGZofIJraHRobG9of3yBeGyPhXGAg4N/dHyDjIGAfnqCg358kG11iXR0bWaKbGphY3VWg2lwbWB5Z2xhanZwZXh7eXBfcWyFhZCdr5inqZ6OjZeHhZ+TlZd8dqiaiZh5lpyLjJmQeHyBi319hHuAgoB4c3h5c32Ag3+IioBkXn2LlId/hYd0fX6Kf36YhJaTloyjoJd+cYZ7k5GKpo+MjoqSoJGDkI+Tl5GKgY+YoJqSkJF0gI6SlImdnZ6nmZiOlZd1kJGLbYiakZt8iImQiW+XnZqikpWKjJ2LhoGTnYCUlJaImop9i4qCe3F6a3Zte3+Mf26Fk4OUeG+ChH5+i4Flc2p9gpiYhYCOdZKKhXqJf3d5gX6HgX2Ej4aNlaWReYWCdIiGe35xcn6EgWtgeXR5cHxuYG1iZXtibm92c3h3c3RhdmBvbHVub1xaXl1daV1PXFdiYGdscnqIa19pZGpjaHeHbWZsaGlsZ4B8endukIhzgIOEfXSBhol6g316gYR9fI5yeYt4eG1sh2toX2lxYodocW9ldmdtbGF6aGp8e3dwYXdtioGZmquhpKmeiouRhomeipSWfHasl4yWfJ6TkZaUiHZ+e4p8fIB2d3+AcHRzem+FfYGAiX58YVx+j5KGf4SEcnqAhnqPkYeRkZuRpJqTgX2AfI2KkqOJjYqNlpqMhZCXkpWNiIiMkp2Tj4yNboSQj5GJnpmioZiXipeTcIychmeJm5CVe4qFkIpwlpqUoZGRiIqYjIJ/kp99k5GUjZqQfIuGiHRzdWtxb3V9i3VvhpGOk3J0gHyCgol9ZXJuen+blX6FinWSjIJ1intwgn+Ch32GjYuFjpaqjnuIfX6KhHZ8bmx9goBhZndzdG56YV5vYGt0XnBqenl5bHJwZXlebmxzbXNYWl1fYWlaT1ZXZGJlcHF/h2VdaWhnYmdxjW5jaGhlaWeAend1b46Fc4GBg3x1gomFeIV8eISGeoCJd3+Le3pyeYNra19vaHR/a3FubXFnb2tle2Ftf3p3cGt3d4l/o5mjqKGmm4iMioGPnYaSmnR/qJORjYagjJWTkIBzfHaFeHmAcnN6hmxyb3ltiXZ/gIZucVtZfpKNiICBgXZ1gX9/oIaPipGbl6CSlneJfoCMiJydio+GkpeWhYiUmI6Wi4qNjoydio6RhG2Ji4+RipyWoZyZloaZiWyHpoVniJ+Mk4CNhIyBeJOYkp2RkIiJlI1/fpCZfZKOkY6bk32LgYRwdnBsbm9wfIZpc4OPmIpxeIB1gomDemd0cHeCm5B9ioV7lZN7eIp1cot8h457i4eFio+cpYl8hHaBiX53d2xofX9+W3FycW9vdlleb2Bwal5vanx6cW5tam13YHBva3FtWVhgYWFsV1BSWWVlYXRvhIFhXGttZGNla5JtYGZmX2dqgXVycm+LgHR/goB5doCLgHmFfneHhnaDhXuHi397dop/anFjfGKFfG9wbHVqaG5sd3dfcX55e3N1c3+CfqWVm62fp5aFjIN+lpWDjp10iZ6TkoaKmoyVjox6cnh0gnByhXRxdYhsb2x0bId2g31/bW5VUYGrlIeCeIB2coN5gqCCkIGSkpibkZh3kHqCjJKkmpOOiJSYkoSFlpiLk4uJjo+HnYSRi31yi4WIj4icmZ+bl5WBlYBqiJ+KaIiiiZSFkoSKcYORl4+ajY+Mi46Nd3uTkXuQjI6TmI18iX2BbHdqb2tsbXuAYnp+j5eBd3qBeIONfXpodW12iZeMgImHfJWRcnuGcXiOe4uOe4l/hI6Rn5+GfXx3gYp8dm9naX5/dl12bm1rcHJVXW5icmFfbW55cGhwZmdzdWhwbGF3ZV1VZWBgcVNQTltlY1x3b4h7XlxocWJiZWWRaV9oZVtnb35va3Fzin12fYWAdXZ/jHl7hoB4h4NzhoV+jIyEfHmVeGZya4Ngh35vb2p7YGltdIB0XnN8eIZ3c3OFfHigkJuxnaaOgop/gpmJf4qcfoqYko6Eh5eOjo6Ed3R3c4BwcIVzcHGDb2ppdW2Cbn18bXVzUk6C38mS1pN8cHSDdYOfgpF2lJCYm4+Ye5NyhZCfoZOTkImSm5OFfZWVh4yNh5KNiJx/joF4e4x/iIyKnJycm5aUeo54aYuUim6KpYaUiZiEhmOMkZiNlImWi4yJi3B6lYp8j4mLk5KKeod9f218ZXNva217elyBeZCPgXt+f4CGj3t6aXVrdIyQioOHhn6XjG1/gHCCjoCOiX6Fe4SRlpucjH13eIKOd3JrZG58gGlnc25naHNsU11vZHBaX2xxd2dra2JneHNwcGRgeGBgVWtfXnRPTUtfZmJbd3CJdFxbZXVgYWRkjmNgZmJYaXN0bmtxdot8dHmGgnZ3fotzf4Z/eol/cYmHgZCKiHx+mXZlc258ZYd+bm9rf1lrbnl6cmB2enuNdnJ2inZ5n4ycr5ugkIKFeIiVfnuInIaEnpCOhYyXhJOOh4F1d295cW+Db21ufnJjZHdwfG56fGpobGKkmsHcru+ic2x1g3WEoYSRbpWPlJ+TmoCRcIWLo5eJjpWKkJ2Wg4CUj4WIj4CSioqXf4d7dn+JeIaFjpyal5mPkHaLeHCJi45/jaaHlIuehoZei5SXiY6IjYqKhIlsfJeDfomGipGQhnaHfn5sfWR4dWpveXRYiHuSh4Z6f3+Aho1/emd0aoGLkIuEhIGNmIZtg3dviZODkoZ/hHuCkpeUmpF1dHiHi3RycGRydn9fcmxvYWh0ZlJgcGdrVV9uc3lhcmNgaX5xcm5bY3JhYlZuWlx3TExLY2ZgXXVyiW1bXGR5XmBkZoRfY2NeWGlya25rcneLfXN3hIF4eHyJcYOEfH2Ie3SLiIeVhYx/f5hzaHVyeW2Lem5zcIBXcHp2eXFkdnmGjGh2gIlxgJ2HmaicopKEfXGMk3h4iZyDhJ+MjnyWjYCaiIR8c3Zwc2pvgWxqbXx0XmB3dntwdHpnYGV869q1ycPciXNsdIB2ipqIjGmXj46bk5GBiHCFiKCOhYuVioyXk3uNkoeCiJB6kYuGj4KAd3iDhHKHgpKblpOYho12iIByh4SMiZykhZaOoISKYYOVj4WIhYiMhoCHaH2UgH6DhYqOj4Jyh3+AcndodnJpdHhtWox9k4OGfYCDgYSLg3didW2KgpGMg4CAk5J+b4NteoiRiJSFfYJ/gpOUkpiJbnF5i4R0am9pb3Z+XXJobVxpdF9RZHFoZlNfcXZ0YHBgXWiDcXJqV2dpY2hXbVdbdExKS2VmXmFxc4VpW1xleV5eZGd6YGRfXVlrbmVuanN3in1zcoF/e3Z6iHOFg3x/h3Z2ioWPmIGNgnuTdmx3dnl4k3Rud3p9WHmFcYBuZ3h2kYJkdoaFcYqXhpqhm6GKhnNvkotxdo2afImZiIl8n3+EmX+CeXJzbm9kcn5pZmx3d1tfeHt6cXF/aWFnYX/Vto6RpnhucXd7cZKQjIZqmI2ImpCKhXpoh4qZh4GSkIaGl418jIyAgImNe5CNfYmFenV7g3xxhoCVmY6SlIKJdoSIeIaDjZWgoYiYkaGAiWF/lIeEh4OIjH9/gmZ9kYB/gIOMj5B+bYN9g3VsbXd1dHd2a2OOgo+AhX98hICFiX9wYHRyhn2QjoN9f5KKenKFZ3uFjIiNhXyFgIGVkJGThW5veIt+dGxtaGl3emBnaWlYa3RZUmhyaWJQYnJ4bWJlXlpqhG50YlxoYGVtX29UWm5NR05mZFtmbXGAa1pbY3NfXGNrdmRlXV1abGxibGpzdoZ/cW9/fH10eIZ4hYN8gId1eImBkpV7iYZ2iYFveHl7hJJvbXqAdl6Df3SBbGh6c5RzZ3OHfHKSkoSan5ufhod1dZN+bXWSln2HkIOKjZp8jJp2fnZxb2xqYXR8Z2JpdXlaYHd7eW1xfmVkaGhXnY9fcnOXvMSEdnGUiI99cZaLhpuSi4dyaoiOloB7lYuBhJqLfIqFfHuJi3+UiHWJhnZ3foFydYaBnZOFlI+Eg3KBineGfoybn5uIlY+egYlmfpOCf4WCiIlxgX1mfox8eX+AiIyPfWmBfoR2Z3B5eHN3dGxrjoaLgouAeYKBhYSBbF9zeXt+jouGfIKQgX9zgmp6hYmNh4V5hX6CmY6RjX5ubXqIfHVzbWVle3NhW3BiV25xU1NtcmhhTmd1eGZgXl1Zb4Fvc1plYl5qbmBwT1lqUURTZmBZam1tfG5ZW11tY1picHZjZlxdYGtpY2xqc3aBg3Ftfnx/dHWDeoOCfIGFdn6IgZaQeISKdIGIcnh5fo2Qb296gHFpgXh6fm1se3WVa2p4hHRrk42Gn5mgmYSHbn2LdWl3l45+gYqClJeKeY+Vb3p0cWtqZGBzemhfZXF6WmByfHlncXlhZWWPsbJ3S2JapdnQlnF7kIqPd32TioSYkIuFbmuFkpJ6eZKGgYSYinyGf3d3iYqEloBvi4hxdX57anmFg6SQhJONhH9wgIR4hnuInpuXjZWSloWIcHuTgn2CgoiCbYB2aICFeXKAgYOKiHxlfn+FdmRxc4BpeXFwdZmOhoOLfXd5gYV6g2tccn9zgomHin6HinuJc4JvcoWIkIaGc4V7gpqNjoV5bm59g351eWNlaHtuXlh2Wldwa05XcXJmYEtsd3RhXlxbWnV+c3BYZ11nanJgb05XZ1I/WGZeWm9qZ3lxWlpYa2VZY3B5XmdcXmVsZ2ZraXF3f4dubH9+gHVwgnt/gn+Cf3aBhImXiXGCjXF7hnx6eYOTjHVqeX5rb350f3xvcnt6k29ugX54Z5KLgqGZnJGChWeGg29neZWIfX6EgpiKgXyNjWl4c2trZl9hb3ltX2JveFxka4J5YXF2X2Vl1Oq9izI6PouOf3F4hYeNjXWClox+ko2Lfm1rhIyMdXyPf4WBlIh8gndudoeEg5d3boiFbHV7dWZ5goOmi4KPi4R+boF2eIV8iZ+Sj5KTlI6Mh397koZ3foOMgmp/cWiAfnlufHyCi4R3YnqFgnJkcml+bnVydYKcjIGAhYB0dn6Ac4JvXG6AdXmLhIt8iIF+iXl7cm2KhZGFjHODeoCXi4uAdW1qdoB/dHNbZ2d1bldWe1JZb2RMWnJyZVtJcXhvXFtbWV11f3VpWWJbaGZvZGpNV2VQPV1lXF11ZWB0b1pZVG5jWWNxeVpoXWBnbWdpa2lwd32ObGmChH95boB8fIF/gXp1goCNk4RwgYtud36Ae3uIkol/aHp9anN7coV6c3Z9fox5eIR9fGuMjYObnpaMgYBsjH1raH6Ni3p9foOUgn59iohrdnFnaGJbYmdyb2Bha3NgaHCIeWJzdF5jZJugj25cNVqvtXRpgIh8kYZ1hZWFc46KiXZvbISCh3R5iXiJfJKHeX5yZ3aJfn6Yb3GHf2l2eW5meYeEpIaAh4yKfm+Ad4KDgI+ciYSWk5mKjIWJfJCIcHp9hHtofmxqgHt6ant3goiBcmB3gX5yZHJndoNudXyGlpKCfYKBb3d6fHV/bVlwgHd1jYOHeIh2g4l7eXRvi4KRgoZzgH5/lImKfG9uaW2BgXRtW2VkcW9QWnpNW25bT1tyb2RVS3N4aVdZWlphcYF1YV5dYGdkaWlmTllnTUBgY1tgdWBddWxXV1N0YFpkb3JXal5iaGpnbWxocHd8kmtohIp9fG9+fnuBgIF6d39/iouDcXyHb3F3g397iYyPg2l9e213eHaKdnx4f4KGf4N+fXpthIyImaONhIN7dYt4a2yEh5B4fXqCkYCAfouDcHJxY2ZeWWZfcHBfYGdwZmpuiHRhdG9bYWRqdnuAv5ympMi4cYSCcpJ7d4WSgnOQi4dycm+De4NzdIZ0iHeTiHl5cGN3h3qAk2lyhHZnd3VjanyCh52BgH+Oj35zgHWHe4KVkoV7mI+WkIiCiXuJiWt4eX50Z3poa395dGl6d4CDfWhgeIh9a2t0aHyBaXaCjJGVf3t+f3F8dnx0f2JWeH5zdIuFgn2EcYeKeHlxcYWEjoB/en9+do+Gg3dqcWhsh4Fxb1xmYHFsSWR1S11sVFNZcm5iUU90eGFSWFhdYXCDdFxhXGllZWRrZFBbcElDY2BbY29dXXhnVFdWdl1bZW5oVmteYWpnZW5uaHB2epJtaYiMeX1ye355goGBfHZ9g4iGg3B3hHJtd4KCfomLk39wgHt3eHqAjHSCeH6BgYKEeYB1b36Ki5ueiH2FeneFe2d0hYuQeX5/e4iGhHaPgGdwbl9kXFhlWW1zYWBgcGxraIhuYXRpWV9kboB3qdqpx4aHsnGId2+MdHqFjX95kol/dHN0fXd/b3F/bYV0k4V4dGtgeoJ5iY9mcoRwZ3VuW219gJCTf4B4kZN+eXxuiniDk42Gd5iMk5CIhoV8f4VsdHZ+bGd2ZG17dm1qd3d/f3xhYniGeml1dWN+fGh1h4+Nlnx1gXdxgHt9boBaV3V/cHaFiH+BeW2JhnR6bHaChIV/fH56fXSMgn10aHRlboqDbHNaaF1zZEdtbUtaYFdWVXdtYlBSdHZYUFZYXmByhG9dYGNtZWReb2NUXHFGQmVeXWVnXVt6YlFWXHRbWmdrYFZqX2BvZmZrcWhwdniOdGqOjXV+dnh9d4GEgXt0fYOIh4NvcoB0cXV+hYKJjYp6dn94g3t8hYd3h3x9gX6EgHt+cnV5jI2gjIl5iXZ0gnhefYWXi3iGg3OFhoR3iXpibm1cYltbYVZpc2NgW2ducGaHcWFxZlddY2t/fMrOh7mham1timxxg3F7g4l+epCEeXhzeHV0e2psdmOEdZGCdm9mX32CeoyKZXKCa2pxY1hseoWbiIKBcpaUd399b4pzhY2OinSZkJKJhouDe3l9cHBvfGZocWFteHFqbHF4fX16XWV6gHhqdnhmg3dodIiMjpV9cohqb36BeW99XVlzf250gYt8gm9vioBxd2l4gYKBgnh+c3x1h317c2dzYW6LgGtxV2lcdltHbWpMVlVdU1V7a2FPVHVyUFFUV15jdYZpXWBsamZjWm9hWGJvR0FnXGBlXVxWe11OVWVwWVtqaF1XZ2BecmVqaHJncHN3hnhulYt0f3p4fnmDiH91cn+GhY6CcHB7eHd2eYaFh4yGeXt/dIt9fYaEg4d+fn59h398eHV4eJGTn3+MfIptdX94ZIOGlYVzkYpvhYWBeoN0ZG5qWV9bXF1UZ3NlYFhjcXJngHJia2VXW2Bqf3i+rnuft25hc4Voc3pxeIGEen2Lfnd3cnZve3Zlam9hh3WOgHNqYl5+eHmLhGZxf2hra1pWb3eIooCEf3GZk3KBenaEb4OElIp1l4qOiYWJhX14dHFuaHhfamxgbXZqZ2preXd6dlpnfXx5ZnN+bYV1ZXWGjYaXgHCMZ2t7hHVudWJdcX1sdX2Me4JndYd+bnFpdoB5f4B0fm17fIJ7eHFmbGFtiX1sbFVpX3ZVSmlqTlFOZ0xYe2hhTlV1a0xRVFVfZ3aEZ15hcWhnYldqXVxrZ0pEalliY1ZZVXlZTVZtallda2RcWWRiXnRlbWRxZ3JwdYB3cJmGdn9+d398hYd9dXOCiICVgm5zeXt6c3KEh4mIg3iBfXWPfnyEio2DgYR7fouDe3Z7d3eanZh6iYKGaXZ8e2yDg5J/co6BcIWCf4J/cGdsZ1hdW1xbU2RwZF5XYnJ1anVvZWVjV1xbaH9wb3KAc4lkZHl9aXN1c3KBg3eAg3h2cnVtanpxYWdrZ4ZzjYNtZl1ffXB7iX9pbXhnamRVV3JvjKZ8hHt2lpF0fXR+fG9+fZOIeJt9iYeDh4N9dXBxbGd0XGxnXmx0ZGdlaXpve3JZZ4F3dWhwgXiCd2J3hot8lYJvjGpte4JxZ3RmYW56aHN4int+YnaEd2pscnV8cnt7dH9ogH+AeXdvZGZibYV7bGpVaGFvUkpoak9LTm9HXXpmYU1VdGRKT1NXYWt3f2ZdZ3RpZmBWZFdicFxLS2pXY2FVVFVzVkxYdWRZXmtgW1pjZF92Z21icGl0b3J+dHSZgnd+gHiAf4aEen11goR/l4VucnR8enVxhIWPgYB6i3VzkH98gZWNgIWEfX2Mhnp9gHd7o6WKeYiFhGt0e3p1goCLem6Ec3mEfYKDdm9qaWVWXVtaWlNibmRbWGFze2pobWlgYlhfWml/aWtvgGdsYGh5eGpyc3Ntg4B6f3x1dG16aGp5al9lbmiBdo+EZ2VYYndqf4d7b2pwZ2ZdVFhvZ42ndoB6fJCOenZxgHF1eHuSgnqXdoaEgIaIdmpydWdnbltsY11tcl9nYWp4aHtsW26DcnRqcIF+enhhd4aFeZCFdIlycHqBcmNyaV1xeGVydIh8eWN0gHFnanl1c215eXZ5ZYV8f3l3cWRkY217fGpqVGdhZVNJa2ZPR1FqRWB3ZmFNU3JdSk1VWWVseHxmX25xamVdVmFVbm5WSlNnV2VdWE1Va1RKW3lfW19rXV1aYmVfeWhsYW9vdm5wd3V6mH52f4F5gICHhnp5eoN+gZODcXR0fnp2dISIkX2AfJBrcpWAe4KfhX6HfYB+hoKAint3hKuef3qHh4NrcoF5dYB+gHRuhm58gHOKgGpwbmRkWF9aWVpUYmpnW1pfdYJpXm1sXGFXXFxrgWVydH1paVxrdnVnc3ZxbIR7fXx4dXFseWdpeGZdZHNoeneSgWNjVGVwaIKFeHhnaWphV1ZZZ2OOp29+d4CLjntxcn9pe3F8jn14kHOFfoCAhm5kdXJkZ2dcamFdb29bZ15tdGV6aF10gG9ya3F8fnV2YnSGjHuJiIGBeXN1gHZicW5bcnRjcXOFfHVlc4BtYW17cGtqfHp2dGeHdnt7dnFlYmRtcn1pa1NnXVxUS3FiUEZVYEdidmZhS1NvWEpNWFhoa3Z7ZWVucWdkWldeWHdlVEpcYldnV1lIV2RQSGJ4Wl1fbFpeXGJjXX5pamBvdHhtcG52g5d6coCAfH+JjIZ9dXWGeIeMfHN1dYF5enqBjI58foSJaXOWgXqKnX5+hXqBen98holzcY+tjHt7ho99ZHGHeXN8enVyboZse35sj3pjcG9iZV1lVllZV2Nma19dXHOFaFhxblteWFpcbHticHd1bGFZbHNzZ3R1b2yDeH5/eHZtbnNkaHRlW2d1ZnZ2kXpfXVJmZ2uDgnR+YmRqXFRXXWJjjqRpeHODhpF5bnF8anpvfoh9dop0gnl9eYBpZHZsYGZfXmlfXXRrWWVcb29iemVcd3xrbm5weHl0dWVzhJOAiIOJe3dwc390Y3hlXHFxYnFygnx0Z3KAZV9ud2plaHp9dW9wg3Z0fXNyYl9mbW58ZGhTZ1dYU012XlBJWVdIYnRjYUlUbVNKTVpXamxyfGNtbXNjYlpaW2F3XFNLY11XaFNWRlhgTUdpdVheYGxbW19hYlyEaWhhbnh5bW9qdoGQeW2CfoCBk4iEgXZ0iXSMhnRxdnaBeH19foyQf36TfnB3lYN8mJJ5gIB4en6AdIiEdHGZoXp6f4mUd2N1h3hzd3RrdG9+a3h8cJFzXnBuYGdibFRaWldoY21mXFxxiWVTcm5bWlhXYGx2Y2l1amleWW1zcGtzc3NphHx+fnp2bm1rZGlxY1tqcmR0do5zW1dTZWFygH9ygl1iY11TWmBcY5GfZXFxhYSSdWxse29wcnx9fXOCeIF0e3p6ZGV1Z11iWWBnW152aFdiXXBoYXdhW3x2aWpyb3h0c3VpcYKWhId/hXd0a3F+b2d4WF1sbmNyc4B6c2dwflxgcHJiYGtzf21udn9zcXhrcGFcZWxsemBmUmVTVlFPdVpRT1hRSGNzYWBHVmpQSVBaVmtra31mbm9yYltaWFlscVdSUGZWVmhTVEVZW05IcXRYX2NsYlhgYGFdi2pjZG16eGxwaXV5h3trg31/hJp8g4R5fIdtj4dybnZ6fHSCgnyLj4KCl3R4gZOFgZ6JdYGAgXR/gnGIg3ZwoZZzeoaLhnpld4pubXpuZnhwemtzdnONa151bmFnZWtSXVtVZ2Fsa1pccYxkT29uXVZYVWdpc2hidGVkXFhtdGxvdXR4aoZ8f3uHdo9yY2RrbmFcbm1jc3iHa1pUVmNkeH19cYZdZF9jVFpfWWKVlWNtcIOFinRraXxwZ3V5dX1te3V2cHt/dV9mcmNbXVZhY1hhdGVVX2BtZGFxXV1+cGhpdHF0cXV3a22FlIKJfYdyc2dwf3J0cFRcZ2tmcnSAdnNjbXZWY3JsW19wZ35mbnh+c3Rzam1hWmRpandeZVNjVFVQU2xWUFZSUEdkcl9hRlhpTklYVFduaWV9aWx4bGJXXVVbdGRTUldoUVhmVFNHWVlPTXd2Wl9la2lZYWBeXY5uYmZreXVub2l2doB/bIOAfYeYe4CHgYl+a5OIcmZ0gHt1gIN9iY5/i5NyfIqRhYefhnt/hoxzgYZzfoJ2bqSLcoCNi3Z3bHqMYGR7cGZ5c3hsbXF3g2dkfG1jZmdoU19eVWdfbG5bXm6NaE5pbWBUVlNvZ3NrZXhkZFxYb3NscXp3cmyHe392m3p5a2FlbG1eYG9qZXB4fmdaVlhgbHh8e3CEX2NfZ1ZYX1djm4hia3CBh314bGx6bl14c218a3Z0b3B8gXNYam5eWFxVYWJXZHBjU15iaWFibFphfmxmbHR2b213d2xpho2AinuJbnJmcn5udG5kW2FpaXB0gXRzXmltU2VxZVZjb2R8ZHN4fXdscG1rYFlhZmd0XGRVYFVSTldkUU9bTk9IZG9cYkdZaU1KX0tZbWRgeWlufmVgVV9UXXVcU1JgZk5cYFVSSVtYUFl0dV1fZWtoWGJgW16NcWNnanhxc25odnR7hHKCg3qIjn58iYeNeW6QiXRrc4F0f3+IhYeRhJWPeX2MjoeRm4SAfIyFc3+Bc3R4cm+Tk5OTk5OTk5OTkpKSkpKSkpKSkpKSk5OTkpKSkpKSkpKSkpKSkZGRkJCPj4+Pj4+Ojo6Pj46OjY2Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2NjYyMjI2NjY2Njo6Ojo6OjY6OjY2Ojo6Oj4+Pjo2NjY2Oj4+Pj4+PjoKAfnp6fX5+fX1/fn59fn5+fn5+fn+Af4CAgIGAgIB/gIGBgYOHjI6Ojo6NjY2NjY2NjY2NjZKSkpOTkpKSkpKSkpKSkpGRkZGSkpKSkpKSkpKSkpKSkpKSkpGRkZCQkI+Pjo6Ojo6NjY6Ojo2NjY2Njo6Njo6OjY2NjY2Njo6Ojo6Ojo6NjYyMjY2MjIyNjY2Njo6Ojo6NjY2NjY2Njo6Ojo6OjY2NjY2Ojo6Ojo+Ogn99ent8fn59fX59fn5+fn5+fn5+f4B/gICAgICAgH+BgYCBg4aMjY6NjY2NjY2NjIyMjIyMkpKSkpKSkpKSkpKSkpKSkZKSkpKSk5KSkpKRkZGRkZKSkpGRkZGQkJCQj4+Ojo6OjY2NjY2NjY2NjY2OjY2NjY2NjY2NjY2Njo6Ojo6Ojo2NjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Njo6Ojo2NjY2NjY2NjY6Ojo6Cf3x6fHx9fn19fn19fX59fn5+fn5+gH9/gICBgYGAf4CAgICDhouOjo2NjY2NjIyMjIyMjIySkpOTk5KTk5KSkpKSkZGSkpKSkpKSkpGRkZGRkZGRkJCQkJGRkZCQkJCPj46Pjo6Ojo6NjYyMjIyMjI2NjY2NjY2NjY2Ojo6Ojo6Ojo6OjY2MjIyMjIyMjIyMjY2NjY2NjY2NjY2NjY2Njo6NjY2MjIyNjY2Njo6OjoN/fHp8e31+fH1+fXx9fn59fn5+fn5/f3+BgYGAgICAgYCAgIOGi42NjY2NjIyMjIyMjIyMjJFtZmdnZ2dnfYWEhISEiF0tMDAwMC1GoaGhoaGhoJqZmpqampqKg4SEhIOEd2VnZmZmY4C+u7u7u72zbWZnZ2dnZ21ubm5ubm9qZmdnZ2dmb4SDg4ODg4OLjIyMjIyMjY2NjYyMjY2NjY2NjY2NjIyMjIyNjY2NjY2OhX19e3t6fX58fH59fX1+fX1+fn5+fn9/f4GBgYCAgICBgICAgoWKjI2MjIyMjIyMjIyMjIyMkWdfYGBgX155g4KCgoKGUxgdHR0dGTekpKSkpKSjnJycnJycnImBgoKBgYJyXV9fX19bfsjExMTExrtnXl9fX19fZWdnZ2dnaGNfX19fX15qgoGBgYGAgYqLi4yMjIyMjIyMjIyMjIyMjY2NjY2MjIyMjIyMjY2NjY2GfH16e3p8fXt8fn19fX59fX5+fn5/f3+AgYCBgYGAgIGBgYGChYqNjYyMjIyMjIyMjIuLi4uRjo2NjY2NjY+QkJCQkJCMh4eHh4eHiZOTkpKSkpKRkZGRkZGRj46Ojo2NjYuJiYmJiYmMkpGRkZGRkImIiYmJiYmJioqKioqKiYiIiIiIiImKioqKioqKi4uLi4uLi4uLjIyLi4yMjIyMjI2NjIyMjIyMjIyMjY2Njoh8f3l6ent8e319fX18fX19fX5+fn9/f4CBgYGBgYGAgYCAgYKFioyMjIyMjIyMjIuLi4uLi5GSkpKSko2RkpGJh46KkJKTjoiOjo2RiI+RkZGRkJCQkJCPj4+Pj4+Ojo6Njo6Ojo2NjoyLi4uLi4uLjY2Njo6Ojo2NjY2NjY2NjY2MjIyMjIuLi4uLiouLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyNjY2NiX59eHh5fH18fX19fHx9fX59fn5+f3+AgICBgYGBgYCBgIGCgoSKjIyMjIyMjIyLi4uLi4qLkJCRkZGPhI6QkIaKj4WNkJGKho2HhomFiJCQkJCQkJCQkI+Pj4+Ojo6NjY2NjYyMjIyMjIyMjIyMjIyMjIyMjI2NjIyMjIyMjIyMi4uLi4uLi4uLi4qKiouLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjI2Lfnx3dnh7fXx7fX18fH19fn5+fn5/f4CAgIGBgYGBgIGAgIGChIqMjIyMjIuLi4uLioqKioqQkJCQkIqFjoiOhoaPiY2QkYqEiYaFhYWHj4+Pj4+Qj5CPj4+Ojo6OjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLi4uLi4qKioqKi4qKi4qKi4uKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIt+e3d2eHt8fHx9fX19fX1+fn5/fn9/f3+AgIGAgYGAgYCBgYGEiYyMi4uLi4uLioqKioqKipCQkJCPhYOMjpCOiYyJjZCQj42FhIeEhoiPj4+Pj4+Pj4+Pjo6OjY2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKioqKioqLi4uKioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMin18dnZ4fHx7fH19fH19fn5+fn5+fn9/f4CAgYCBgYGBgIGAgYSJi4yLi4uLi4qKiomJiYmJkJCQkJCMhoyJjoeFjYmOi4yLhYiGhoiDio+Pjo+Pj4+Pjo6OjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKioqKioqKioqKi4uLioqKioqKioqLi4uLi4uLjIyMjIyMi4uMjIyKf353eHp7enp8fHx8fX1+fn5+fn9+fn9/gICAgICBgICAgYCBhIqMi4uLioqKioqJiYmJiYmPj4+Pj5CMjouPjIqPjI6MjY2JjYyLjomOj46Ojo6Ojo6Ojo6NjYyMjIyLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLjIiAfXh5enp6e318e3t9fn5+fn5/f35+f39/gICBgICAgIGBgIGEiouLioqKioqJiYmJiYmIiI+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Ojo6Oj46Ojo6Ojo6Ojo2NjYyMjIyLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLioqKi4uLh4B8eHp6eXt8fHt8fH1+fn5+fn9/fn9/f39/gIB/gYGAgIB/gYSJi4qKioqJiYmJiYmJiIiIj4+Pj4+Pj4+Pj46Pj4+Oj4+Ojo6Ojo6Ojo6OjY2NjY2NjY2MjIyMjIuLi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKiYmKioqKioqKioqKioqKioqKioqKi4uHgHt5eXh6fHx6e3t9fX5+fn5+f39+f39/f39/f3+BgYCAgH+BhIiLiomJiYmJiYmJiIiIiIiOjo6Ojo6Pj46MjI+Sj5COjo6Ojo6NjY2NjY2NjY2NjIyMjIyMjIuLi4uLioqKioqLi4uLi4uLi4uLi4uMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKiomKiomJiYqKioqKioqJiYmJioqKioqKioqKioqKioqKioqKi4aBe3h5eHp8ent7fH19fn5+fn5/f35/f39+fn9/f4CAgYCAgIGEiIqJiYmJiYmJiIiIiIeHh46Ojo6Ojo6Ojo+MkJOQkI+Ojo6NjY2NjY2NjYyMjIyMjIyMjIuLi4uLi4qKioqKioqKi4uLi4uLi4uLi4uLi4uMjIyLi4uLi4uLioqKioqKioqKiYmJiYmJiYmJiYmKioqKiomJiYmJiYmJiYqKioqKiomJioqKioqKhYB6eHl5fHt6ent8fH1+fn1+fn9/fX9/f35/f39/gICBgICAgYSIiomJiYiIiIiIiIeHh4eHjY2Ojo6Ojo6Pj4+PjoyNkI2NjY2NjY2MjIyMjIyMjIyMi4uLi4uLioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYmJiYmJiYmKioqJiYmJiYmJiYmJiYmKioqJiYmJiYmJioqFf3l6eXh7e3p7fHx7fn5+fX5+f39+f35/fn+Af3+AgICBgYCChIeKiYmIiIiIh4eHh4eHh4eNjY2Njo6Oi42Nj5WPiYyPjYyNjYyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYR+eXt5ent7eXt9fHt+fn59fn1+f35/fn9+f3+AgICAf4CAgICEh4mIiIiHh4eHh4eHh4aGhoyNjY2NjY+MjImKj42IjJGPjY2NjIyMjIyMjIyLi4uLi4uKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uKioqJiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJg355e3p8e3p7fX17fH9+fn5+fX5/fn9+f3+Af4CAgH+AgH9/f4OGiIiHh4eHh4aGhoaGhoaGjIyMjIyLiYyKiIeJhoyOjJCMjZGOjIyMi4uLi4uLi4uLi4qKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiImJiYmJiYmJiYmJiYmJiYmJiYmIiImJiYmJiYmJiYmJiYiIiIiIiYmCf3h7e3t6enx9fHx9f39+fn19fn9/f39/f4F/gIB/gICAgICAg4aIh4eHhoaGhoaGhoaGhoWMjIyMi4yOjoyKioeEiIuKjIuNjo+Li4uLi4uLi4uLi4uLioqKiomJiYmKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiomJiYmJiYiIiIiIiIiIiImJiYmJiYmJiYmJiIiIiIiIiYmIiIiIiIiIiIiIiIiIiIJ/eHp7enp6e3x8fX1+f35+fX1+f39/fn+AgICAf3+Af4CAgYCDhYiHh4aGhoaGhoaFhYWFhYyMjI2NjJCSjI2Ii4mJi4uLi4mLjIqMi4uLi4uLioqLi4qKiomJiYmJiYmJiYqKioqKioqKioqKioqKioqKioqKioqKiYqJioqJiYmJiYmIiIiIiIiIiIiIiImJiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIiIiIiIiIiHgXx4e3x5enp8fHx9fX9/fn59fX9/f39+fn+Af4B/f3+Af4CAgIKEh4eGhoaGhYWFhYWFhYWFjIyNkY+PjZGJjIaJjIuIiImMiYeNjo+NioqKioqKioqKiomJiYmJiYmJiYmJioqKioqKioqKioqKioqJioqKioqKiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4WAenl9e3t7enx8fHx9f39+fn19f39/f35+f4B/gH9/f4B/gH+AgoSHhoaGhYWFhYWFhYWFhISLi46PjoyLj4iHiYmMjYWFjo2KiYyNi46KioqKiomJiYmJiYmJiYmJiYmJiYmJiYmKioqKioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHhoaHh4eHhH55eX16enp7fXt8fX5+f35+fX5/f39/fX5/f3+Af39/f39/f4CChIaFhoWFhYWFhYWFhISEhIuLjI6MjI2Lh4mIiomGgoiNjoiKi5GTj4uJiYmJiYmJiYmJiYmIiYmJiYmJiYmJiYmKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIeHh4eHh4eIiIiIiIiIiIiIh4eHh4eHhoaGh4aGhoaGhoaGh4eDfXp5e3p5enx8e31+fn5/fn59fn9/fn9+fn+AgICAf35/f39/gIKEhoWFhYWFhISEhISEhISEioqOjYmIiIqKh4iHiomIioiIh4qGi5GPiomJiYmJiYiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHh4iIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGh4J8eXl6eXp7e3t7fX5+fn5+fn59gH9/f39/f4CAgH9/fn9/gICAgoSGhYWFhISEhISEhISEhISKi5CPiYmJi4qHh4WHiYuKiYSLjYmOjYqJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiIiIiImJiYmJiYiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGgXt4enp4e3x7e3x+fn9+fn5+fX1/f39/f3+Af4B/f39/f3+Af4CChIaFhYSEhISEhISEhISEhI+Qj4+IiYuIhoeIiYuLjIuJioqNio6Oj4iJiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoaAe3h5eXh4enp8fX1+f35+fn59fn9/f39/gIB/gICAf39/gIB/gYKDhoiGiIaDhISEhIODg4ODkpKOioeKi4qLh4uNiYqJi4iHiouIio+SioiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhn96eXh4eHl5eXx9fn5/fn5/fn1+f35/f3+Af39/f4CAgH+AgH+BgoOHjo+PjoiHhIWFhoaFhYWSkI6KiYmIiImKioiIh4aKjIiHiYmOkJGNh4iIiIiIiIiIiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4aGh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWGf3l4d3d3eXp5e3x9fn9+f35+fn5+f35+fn+Af4CAgICAf3+Af4GBg4eOjo6Ojo6Mjo2OjY2MjZCQjomHhoiJiYeIiouIiYyJiYaKjY6PkYuIiIiIiIeHh4eIiIiIiIiHh4eHh4iIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhYZ+eXd5d3d6eXl8e31/fn5/fn5+fn5+fn9+f4B/fn+Af39/f39+gIGEiI6Ojo6Ojo6Ojo6Ojo2NkJGOi42JjIiIiYaHiYaIioiHi4yLjpCQiIeIiYmJiIeHh4iIiYmIh4eHh4iIiYiIiIiIh4iIiIiHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhoaFhYaGhoWGhYSEhIWFhoaFhIWFhX55d3l2eHl4e3x7fn5+fn5+fn5+fn5+f39+f39+f39/f35/f3+AgYOGjY2Ojo6OjY6NjY6OjY2Qj42Ni46KhoiKhISLiYeDhYSDi4mLj42JjI6QkI+NjYyLjY6Pj42NjI2Nj4+Pjo6MjYyMjY2KiYiHiImHh4aHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoeHiYqKiIeJi4yNjo2LiImLi42OjYyJiImMgHl3d3Z6eXh7e3t9fn5+fn5+fn5+fn5/f39+fn5/f4B/f4B/f4CBg4aMjY2NjY2NjY2Qj4+Pj46NjI6KiYuMjIeFiY2Lh4aIh4aHh4uNjo6Pj4+Pjo+Pj4+Pj4+Pj4+Pj4+Ojo+Pj4+Pj4+Pj4+Oj46Oj46Mi4uJh4eHh4aIhoaGhoaGhoaGhoeLiYeHiIiLjY2Mi4yLjY2Ojo+Ojo6Pj46Ojo6Ojo6Ojo6Njo6NjY2AeHZ4eHp4enx6fH5+fn5+fn5+fn5+f39/fn59fn9/f39/gH9/gIGDhoyMjIyMjY+QkpOTk5KSjYyMjIqHioyKh4eJiYWCiouIiYWJjpCNjo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjI2NjI2LiYaHh4eHiYqLjY6NjYyNjY6OjY2OjY2NjY2NjY2NjY2NjY2OjIyNj4+OjY2MjIyLi313dXd5enp7e3p+fn5+fn5+f35+fn5/f39+fn1+f39/gICAf3+AgYOFj5KRkJGSk5OTk5OTkpKLi4uLiomMiouLiYuKhoeOjYiIjI6OjIuMjIyNj46Njo6Ojo2NjY2MjY2NjIyMjIyMjIyMjY2NjYyMjI2NjYyMjI2NjIyNjIyMi4yMi4yMjI2MjIyMjIyMjIyMjIyLi4uLi4yNjY6Sk5OSkpSRkJOVlZSTk5COjo6Oe3Z2d3h6ent7e31+fn5+fn5/fn5+fn5/f35+fn9/f39/gIB/f4CBgoSNkpKTkpOSkpOTkZKSkoqJioyJi4qJjIuKioiHiYqKi4mKjY2Mj46Nj5KUlJOUlJOTkpGSkI+Ojo2NjY2Pko+OkZGOjIuKioqLi4qKi5CPjoyMjIqKioqKioqKiouKioqKi4yLi4uMjIyKiouLi46RkpOTk5SUk5STk5SUlJOTk5KSkpKSk5F6dXZ2eHt7e3p6fX5+fn5+fn5+fn5+fX5/fn5+f35/f3+Af39/gIGChIuRkZGRkZKSkpGRkpGRiYmIiIqMiYiJiYuJhoSJhoyKh4ySkpKTk5OUlZWWlZWUk5OUlJSUk5SUlJSVlZWVlZWUlJOTkY+QkZKQjoyRlZWVk5KSjo+QjYqKi4qKi42OjY6RkpCRkpKSkpGRkpKSk5OTk5OTk5OTk5OTkpOSkpKSkpKSkpKSj3h1d3l6e3t7ent9fX19fn5/f35+fX5+fn5+f39/f39/f4B/f3+AgYKEi5GQkJCSkpKRkZGRkZGIiIiIi4uJg4eLi4yMiIeHjYyNkpSSkpOTlJWWlpaVlZSSkpOTlJSUlJWVlZaXlpaWlpWUk5SUlJSVlJSUk5OVlZWUk5KTk5OTkJGSkZGSk5OTk5KSkpOSkpKSkpKSkpKSkpKSk5OTk5SUk5OSkpOTkpKSkpGRkZGPdnJ3enp7e3t8fX59fX1+fn9+fn9+fn5+fn6Af39/f3+Af3+Af4CBgoSKkJCRkZGRkZCQkJCQkIeHh4eIiIiFi4+KjI6Njo+OkJWUk5OTk5SUlZWVlJSVk5KSk5KTlZSUlZaWlpaWlpaWlpSTk5OTk5OUlJOSk5SVlZSTkpKSkpOTk5OTk5OTk5KSkpKSkpKSkpGSkpGRkZGRkZKTlJSUlJSTkpGRkZGRkZGRkZGRkYx0c3d6ent7e3x9fX1+fX5+f35+fn5+fn5+fn9/f39/fn9/f39/f4GDhIqQkJGRkJCQj4+Pj4+Ph4iKi4yNjYuOj42Mjo6RkpGSk5OSkpKSk5SUlJKSk5OTk5OSkpOUk5OTk5WVlZWUlZWUk5OTk5KSk5OUk5KTlJSUk5KSkpKSk5OTkpKSkpKRkZKSkpKSkpKSkpKSkZKRkZGSkpOTlJSUk5OSkZGRkZGQkJCQkZCRinN0dnp8fHp7fXx9fn59f35/f35+fn9+f31+f39+fn59f39/gH+AgYKDipCQkZGQj5CPjo+Pjo+Oj4+Pj4+Pj4+PkI2OjpCRkpKSkpKRkpKTk5OTkpGSkpKRkZKSk5OSk5OSk5STk5OTlJOSk5OTk5OTk5OSk5OTkpKSkpKSkpKSkpGRkZGSkZCRkZGRkpKRkZGRkpGRkZGRkpKSkpKSkpKSkpKRkJCQkJCQkJCQkJGGc3V2e3x8e3x9fX1+fn1/f35/fn5/gH9+fX5/fX5/fn5/f3+Af3+BgYGKkI+PkI+Pj4+Pj4+Pj4+Oj46Oj4+Pj5CQiI2PkJGRkpKSkpOTk5OTkpKSk5KSkZGRkZKSk5KTkpGRkpKSkZKSkpKSkpKTk5KRkZKTkpGRkpKSkpKRkJCQkJGRkZGQkJGSkZGRkZGSkZGRkZGRkZGSkpKSkpKSkZCRkZCPj4+Pj4+Pj4+PkX9ydHh8fHx7fHx9fX5+fn9+fn5/f3+AgH99fn5+f39+f39/f4CAf4GBgYqPj4+Pjo6Ojo+Pj46Ojo6Ojo+PkI+Pj4+GjpCQkJCRkZGRkZGRkZGQkJCQkZGRkZGRkZGRkZGQkJCRkZCQkJGRkZGRkZGRkJCQkZGQkJGRkZGRkI+PkJCQkJGRkJCQkJCRkJCQkJCQkZCQkJCQkJCQkZCQkJCPj4+Pjo+Pj46Ojo+Pj4+PeHJ2eXx9fHp9fH19fn5+f35+f39/f4CAf39/fn5/f35/f39/gIB/gYGAio6Ojo6NjY2Ojo6Ojo6NjY2Oj4+Pj4+PjoiQkZCPj4+QkJCQkJCQkI+PkJCQj4+Pj5CQkJCQkJCPj4+PkI+PkJCQkJCQj4+Oj4+QkI+PkJCQkJCPjo+QkJCPj4+Pj4+PkJCQkI+PkI+Qj4+PkI+PkJCQkI+OkI+Pj46OjoyMjY2NjIqDiYhzc3Z4fX58eX18fX1+fn5/fX5/fn9/f39/f4B/f39/f4CAgH+AgH+BgYCJjY2Ojo6Ojo6OjY2OjoyNjY6Ojo6Ojo2NiJCRkI6Njo6Ojo6Ojo6Pjo6Ojo6Ojo6Pjo6Ojo6Ojo6OjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Pj46Oj4+Pj4+Pj4+Pjo+PjY2MjYyNjoyLi4mJiYiFhYSDgoKEgnR5fXp4dXJrZWltb2xmZmdncHNzd3l9fnl6e3x9fX1+fn59fn9/fn9/f39/gIB/f3+AgIGAgIB/f4CBgImNjY2NjY2MjYyMjIyMi4uLjYyMjIyMjIyGj5GRjIyMjIyMjIyMjIyMjIyMjIyNjY2MjIyMjYyMjY2MjIyNjY2NjYyMjI2MiomKi4uJh4KAh4iEgXt6gH57fXx8fXlzcnJycnV1cG1ramppZ2NkYV9bXF1eWFVXWFlTS0VJSkpLTE1PT0tgdHR3eX19eHp5e3x8fX5+fn1+f39+f35/f4CAgH+AgICBgYCAgICAgIGAf4OEhYSFiIuLjYyMjIuLi4yGiYqKioqKh4OOkJGNiouLi4uMiYmKioqKiouLi4eDi4qIiYmGhYWEhIeJiYWCg397fHl6e3pzcHFxcW1samdsbWdlZmVmZGNlZGVkZWVlZWRkZGNhYV5dXFpYWFdUUFFSU1JTTU1KSUZESEpHR0hHR0xOSWdzdXh5fXp4d3l8fHx8fn5+fn9/fn9/f39+f4CAgIB/gICBgICAgICBgYFnXmBjYWNucX17ent/fXd8fHZ4ent4eHpvcHt4eXt8e3h3e394dXd0dHZ1dHZ3dXFycW5wcnBnaGtsbm9tamlpaGhlZWRkZF9gYWJgYF5dWVhaWltdXV9gX2BfX19gYmFeXl5eWVldXF1bV1dWUlRSU1NOUUpISUZERUhMTEhGR0lLSklNbXJ0eHp7end3eXt6e3x+fn1+f39+f35/f35+gIGAf3+AgIGAgICAgICCgWdYW1pZXFtcY1xaXF5ga3FtcHBvbm5vbmtpbmxrbG9qaWtraWpraWdmZ2dnaGhnbWdqZ2hlaGdjY2JhYmBgXVhbW1dYV1RWUVBUU1NNSkxLTExOTk9UWFhXVVVUUlBQTU1QT05LTE1QUU9MTEpHSUlHSEhJSEhIR0ZHSEpKSEhISUlISVZwc3V5ent5dnZ5enp7fH59fX5/f35/fn5+f3+AgX9+f4B/gICAgICAgIGBbFtYVlZWWVlaWVlYVVZoamxubmxra2poaGloZGVkYlxiZl9fYGNfXF9dYF1eWl5dWVleYmFeXlpZX1xYV1NOTUxLS0tMSUtNTktKS0tMSktQTEtLRkdHSUlGR0lISUZFSEdGRkVERUVEREVJSUlHSEdIRkZLTUtJSUlIR0hLTU1LTExMVXFzdnl6e3h2d3h3ent8fn1+fn9/f39+f3+AgIGAfn5/f4CAf4CAgIB/gYJoUlRVVlNVV1lZWVdXV1tbYWNfXlxbWFZWWVZSVFJRUVVUU1NTUE1KTU5QUk9NUFFRUVFSVlZRUVFUUFBOTk9MSk1MS0xKSktLRklJSkxJR0pISUlFR0dGRkVFSElKR0ZHRkZHR0hKR0dISEpMSkpLSUlISktLSkhKS0pISUtMTU9QUEtUdHR1eHp6eHZ2d3d6enx+fX5+fn5/f35+fn+AgYB/f3+AgYB/gICAgH+AgmlQUlRXVVRWWVdYWFpbVFRTUlBRU1FRUU9OTlBQUU9MTlBPTk5NTEtNTk5QTU9QUFJRUE5OT05PTk9PUFFPTk5PTk5QTk1NS0lISEpJSUlJR0ZHR0dJSkhJSEhJSEhHSEdISElISUxLSklISkpJSkpIR0pMS0pJSUhKSktMTk1NTU9RTFVzcnN3enl3dnR2eHp7fX19fn5+fn9+fn5+gICBgICAf4GBgH+AgICAgICBbE9PTlRZVVVdW1lXV1hOTUpKSUZKT0xKSkdJSk1NS0pMTUpHSUlJSktMRkRGSktLS0hKTExMT01MTE5PT09NTk9MTk5OUFBPTE1MTk1MTEpJSEdJSElISElJS0xLS0pJS0pJSklJSUlJR0dKSUdJSUpKTk1OTEhJSklJSk1PT01MT1JOWXBwcnd4d3d0c3R3enx+fX5+fn5+fn5+fn9/gICAgICAgYCAf39/gICAgIFvS0pNTlFOTlVXVlZSU0lFQ0VFUkREQT5CP0RAQD5CREFAQURHRkVIRUJBQEBDQ0RFQUNFSEtPS0lJSkhHSklKSUlLSkxQTk1MTU1MTU1NTElIREZGR0ZGRklKSUlLSkhMSklKSkpJSEhKS0tIRkdJSklLTU5OSktPTUxLTU1PUE5QT1BgcG9yd3h2dHJzdXd6fX19fn5+fn9+fn1/gICAgICAf4CAgIB/f3+AgICAgXNQUE5OUE1KS1BSUE5RQ0RCQUZRRT1DPT9FSDk6Oz0/PTxBRkA+Ojw+PjxFRD0/RUE/QEFAREVHR0dHQkRERUZFR0dHR0pHSEpLR0NER0pHQ0RFQUFDR0hHSEdISktKSElMS0lISktLTU5MTUxMSkpMS0lLTU9PUFNRT1BQTk9QUlFNUGdwb3N2dXRycXR4eX19fX1+fn5+f4B+foCAgH9/gIB/f4CAgH+Af4B/gICCdlRVUVFQT0xNUFBOT09BQkFAQkE/Oz48Pj8/Ozg5ODs7OkA7Oz48Ozs8PEhMPT1BQT9CQz1BRERGQkZGREdJSEM/QEBAQUFCQUE/Pjw9PkFAQD8+P0BFR0dHSUtMTk1OTUxNTUpLTVBVU05MTlFOTk1OTE1NTk9OTk1LS05OTk1OTkxUbnBwcnR0c3Fydnl5fX19fn1+fn5/gH5+gICAgICAgH9/gICAgH9/gH+BgIJ4UVFSVFJTUVNTUVFST0BAPT4/PD8+QEE/PT45Ozo6Ozg5Ojg3Ojw5Nzg7Oz49Ozs6ODpAQEFCP0E/Q0ZEQkNDPzs+PkBDQ0E/Pj9BPkBAQj9APD9CQEFDRUVFSktQT1BPTU1OTExMT1JRUFJOTExPTUtOT0xMTEtMS0tKS0tKTU1LS1xxcXF1c3VzcXN4eHp9fn1+fn5+f39/fn5/gIGAgH+Af4CAgICAf4CAf4CAgXxSTU9RUFFSUlRSU1NOPDs8Ozs7P0BBQkA9PDk8PTw5Nzk6Ojk4ODo6Nzg6OTo7Ozg3ODk7Ojg8Oz1AQUA9Ozs+PD09QEJDQT9BQkE9Pj09Oz0/Q0RCQD9BREJFR0pKSkpKTE1MTExNTExOVVNLTE1USVBKSU1KSUpLS0pJSEdKS0lKZnJxc3RzdXJydnl5e31+fn5+fX9+f39/f36AgICAf4CAgICAgIF/gIF/gYCBgFZMTlBQTlJRUFBRUU44PT88PDo9PkFAQT8+PkA/Pj07PDw+Pz08PTs6PD09PTw8PDw7Ozo7PD49Pj8/QUA+P0E/QEBBQEBAPT8/PTw6Oz09PD9AQUJCQUBCREZGRkdGR0dISUtMTExLTEtKS0lKSk1MTEpMS0lISUxMSklJSElLR01tcHF1dXV1c3V4eXl8fX5+fn5+fn5/gH9+gIB/f39/gH+AgYCAgYCBgICBgYCCYUtPT05OT1BPT1BQTzo8Pjw9Oz8+PkFBPz0/Q0NDQD48PT9APz89Oz49PkNFPz9APTs9PT08Ozo9PkFBPz5AQD9BPz89PD48PTs7PD0+QUA/QD5AQ0NEQkRFSEVFR0hISEdGSUpJSUlJSUhKSkpKTEtKSklJSEhKSktMS0lLSkpIVnBvcXNzdHR1eXp7e31+f35+fn5+f39/f39/f3+Af4CAgICAf4GBgICAgIGBgIJtTFBRTk9QTk5PUFBPPjw8PT4/P0A+QEA/Pz9DRUQ/PTs8QD46Ozo6OTc6PDk9PUA9Ojw7Ozw7ODk7Pz49PD07PEA9PTw8Pjs9PD0+QUBCQUBAP0JEQ0RFRkZGQ0VHSElJSEhJS0tMTUpKSUpNTUpLSktJSEhISEpJSktKSk5MSUlfcHBycnJ0dXZ6e319fX5/fn5+fn5/f35/f36AgIB/gICAgICAgYGAgICAgIGAgnZNTk5NTk5MTE5QT0w+QTw8PT8+QkM/P0FBQUJBQD08PTs+PTo6Ojw6ODk4ODo7PT8/PDs7PDs6Ojs+Pz89PDg6Pjw9Pj89Oz4/QEJDQkJDQ0FCQkFCQkRCQkRCRENGSUdGRkhJSUtNSklKSktMSkpJSkVESUlGRkhISUpKTEpGRmdwb3FxdHZ1d3t8fH18fn59fX1+fn9/foB+fn+AgH+AgICAgICBgYCAgICAgICBek5JS0tMTExFSUxOTTw/PDw9PkBAQUE7QkNCQ0A/Pz9APT9APjw+QD89PT0/PT0+Q0Q/Ozw9PkA9PT5BQ0A8OTtBPz4+QT07P0JAQkNCQENDQUNBPT0+QD0/QUFBQENFRUBAQ0JDR0dFRENGRUZGR0VEQEFHR0ZDRkRHSEpHQz5IbG9wcHF0dXZ5fHx9fHx+fn1+fn5+fn5+f36Af3+AgICAgICAgIGAf4CAf4CBgIF+UUhLTU1NS0pLTE9RQD8+PkFBQEBBR0FCRENEQT9AQEA/PUA+PD0/P0BAQENAQD9AQD49PD1ARUFCQkZIQz08QERDQUE/Pj1AQT4+Pj88PkBER0VAPkBBP0BDRkVDQkNDQEJEREJERUFCPkFCQkFCQEA9QUJDRENDQUNFR0E/PVZwcHFwcnV1d3p8e3x8fX9+fX19fX1+fX5+fn9/foB/f4CAgICAgYCAgIB/gIGAgX5SSEtNTUxLS05OUlVEQkBDQ0FBQkBCQ0BAQUFAQUA+Oz48Pz08Oj49P0JCRUA/P05hX0pAQ0VJSUlJTU1LRUNGR0hFR0VFRUREQ0E/QD4+QkZKSkdFRUZGRkpOTktKSUdHSEtMSkdHQ0REREVEQUJCQ0BDREVEREVERUZDQkFEZW9wcXF0dnV4e3x7e3x+f319fX19fn59f4B/f39/f39+gIGBf4CBgICAgH+AgICAfVJJSUpKSEpKTE9SU0dGRUdIREdIREA+PDs+QERFRD87QUNEQj8+QT9BREVEQ1d1homKflhHSEpMTE1PT0xIR0hHSElJSEhHR0hIRUNFRUVFRkhKSkZFR0lKTU9PTU1LSktKTU5LSUhHSElIR0ZFRkZGREZIR0VFSEhGSEdIRlFubnBxcnZ2eXt7e3p9fX5/fX19fX1+fn1/f39/fn5/gH+BgYGAgICAgICAf4GBgIB8UEhHSElGR0lKTU5OSkxJSUpLTE5KRkNBQkNGSkhJR0hISUdGQkRGRERDQVV0h4mHh4aIgldJTE1MTU5MSkdHR0dER0dHR0ZIRkhFQ0RERkVEREhIQ0NDR0pKS0xMTExMTElKS0pKSUlJSEpISEdISUhHR0hGRkZISklJSUlIXW9vcXJzd3d6e3t6e319fn59fX19fX5+fYB/f39+fn+BgIGAgYCAgICAgIB/gYCAgHxNR0ZIRkVGR0dKS0pMTUxLTU5NT0tJSEhKS0tMS0pLTUpLSEhGRkdGRVBshIeGhoaHh4iHfFBLTEtIR0ZGREVDQ0BBQ0NDQ0ZGRUJAPj5AQUFAQkQ/Pz9ERkhERUdJS0lJR0hJR0lJSkpJSEZKSkpKSUpJSkpKRklMTEpKS0tmb3Bzc3R2eHl7e3t8fH1+f319fX19fn59f39/f35/f4CAgICAgYCAgIGAgICAgICAfU9GRkdGR0hHRUZHR01NTUtMS0lHQ0NDRElLS0tLS0tNTEtNTElGSlZsgYaFhISGhoaHiIaKdUlJRkI/P0A/Pz88PDw+Ojo8QUFAPjw5OTg8PD07Pjs5Oz9BQkFBQ0NDQEFCRURCQ0ZISUhISExNTEdJSk1NTk1KSktLSkxNU2xvcXRzc3d5ent7fH19fn9+fX19fX1+fn5/foB/fn9/gICBgIGBgICAgYCAgIB/f39+UUZFRkdJSUdEQ0VGTk1MSklIRT85Oj5ARUhHSUlLTE9OTlFOUV5ygYWDhIWFhoeIiIiJiYyOZkJCPTg4Ojo5ODc4ODk2NDc5Ozw6ODU2Nzc4OTc4NzY4OTs7PD5BOzk5OT09Pjs7PUFERUhKTUxMR0lIT1JRUFBOTE1NT1Fdb3BydHN1eHp7e3x8fn9+f359fX59fX5+f39/gH9/f4CAgICAgYCAgICAgICAgIB/f39RR0ZHSEpIRkVGR0hMTEpJSUdDQjU2OjxDQEJGSEtITEtOVGd7hISDgoOEhomKi4uLiomKi4yJVDs4NjU2NzY2NjQ1NzYzNDY4Ojg3NjU2NTY3Nzc3ODo3Nzc4Ojs3Njg5OTg5ODc2OjxAR0ZJRklGRUZPU1JTU1JPUFBSVGVwcXN0dHd5e3x7fH1+f35/fn19fX19f39/f3+Afn+AgICAgICBgICAgICAgICAgH9/flJISEhJS0lHSUpJSkpLREVIRUJANTc4OD06PERCREZGRFZ4hISCgoOChYmKiomJioqKiouJiYqBSDY3NjQ2ODg3NDU3ODQ2Nzc5OTc2Njc2NTo6Ozo6PDg5ODk5ODc3Ojo6ODg3ODU4OTtBPT4+QkE/QUtMT1FQUU9PT1FXa3JydHR1d3p7e3t9fX5/fn9+fX19fX5/f4B+fn9/f4CAgH9/gICAgICAgH+AgICAf39+VEhHSUlMTUtKS0tMSUg/QEFAPDo1Nzk4OTc6QTk8RD9QfYSDg4SEhIaJioqIh4iIiIqKjIqJiYx6Pjo4ODs8PT45Ojs8ODk7OTo7Ojk5Ozo5PT09Pzs7Oz06Pjw6PDs8Ozw8Ojo8ODo6Ozo5OTk8Pzw9QUJESUpNS0pLTFdvcnN1dHZ4e3t7fHt9f39+f359fX19fn9/f35/f39/f3+Bf4CAgICAgICAf4CAgH+Af35URkVGSUxOTkxKSk1CPzo7PDo4OTk4OTk5OTo+PT8/Q3aEg4SEhYaIiYiHhoaGiImIiYuMi4mKioxsPDs+QkNFRUJBQUI+QENBQD89Pj5APz4/QD9APT0/Qj9BQT9BPz1AQUA/P0E8Pjw7Ojs6OTs/PTs7PT1BQUNBQkNBWHBxdHR0dnl7e3x9e31/fn9/fn19fX5+f35+fn9+f4B/f4CAgIB/gIGAf39/gICAf39/flJFQ0FHSk5PTElHSzo4Ojs5Ojo7PDo6Ojw7PT5APz1hhYOEg4WEhomJiIeGhoaHiImKi4uKioqLiotePkRHSUtKSkZHR0RGSEdFQ0BAQ0VDQkBCQ0I/QERIRUNFREVFQUZFRkRGRkRAQj49QD49P0A+Pz8/Pj8+Pjo7PTxgcXJ0dHV3enp6fX19fn5+f39+fX19fX5/fn5+fn5/gH9/gICAgICAgICAf4CAgIB/f4B+UERAPUNIT01HRkJEOTc6PTo8Oj09Pj47Pjw/PkI/Sn6DhIWGhoaIiYiIh4aGhoeJioqLjI2MjIuKiodXR0xMTUtOSUlLSElKSklFQ0RGR0ZEQ0VGREJISUtHSEdGR0dFS0pMSUtLSkNGQ0NEQkFBQ0JEQ0NERENBPTw+QGhwc3R0dnd6eHt8fH19fn5/f359fX1+fn9+fn59fn+Af3+AgH9/gICAgICAgICAgH+AgH9PQT49P0RMS0BCQkE5Nzs+Ozw6PT8+Pzw/PkJBRD5ohIKFhYeHiImJiIiHhoaGiIiIiYqMjYyMi4uKjH9QTVBNS05LSkxJSUpIS0ZER0hISUVFSEZGRUxMTUlKR0dISUpOTU9NTE5LSEZHR0VFQ0ZGRkZERUhIRkNBP0BMbXB0dXZ4eXl5fHx8fX1+fn9+fn19fX1/f35+fn5+f39/f39/f3+AgICAgIB/gICAgICAf1FBPz4/RkdHPTxAQDg3PDo7PDo9Pzw9PT9AQ0JIU36DhISFhoaHiIiIiIiIh4eIiIiJioyNjIyMjIuKjXFNUU9NTExMTEpJSEZKSURKSEdLSkhKR0dHS0xOTExISElKTVBOT05MT0tJR0lKSElESUhIRkZHR0lGQ0JBQ1VvcHV3eHp7eHh6enx8fX5+f39+fn1+fX5+fn5/f36Af39/f3+Af4CAgICAgICAgICAf39/VERBQUJHSEI/OD9AODo7Nzw9Ojw/PDw9P0JDQ0xthIOEhIWFhoeIiIiIiIeGiIiIiIiJjIyLjIyMi4uLi15SUlBNTk1LSkdGQ0hKR0xKR0tPTEtKSkxNTE9QTkhJS0xPUVFQUU9PSklKSkxKTEZHSEdGR0lGRUVCQEJCXHByd3h5enl5eXp6e3t+fn5/fn59fX19fn9+fn9+f4CAgIB/f39/gICAgICAgICAgH9/f39VRUNFRUdHRUQ7P0E7PTw4Pz09PkBFRD1CRENGSnWGg4ODhISGiIiIiIiIh4eIiIiIiIqLi4uMjIyMi4uNfFdWUlJUUk9MS0pFRkZLT05PV1ZRUE9RU1JNU1RPTVNMUFNVV1JTUlBMSk1NTUtOR0dKRkZISkRERUVCRENjcXV5eXp6ent6e3p6fH59fX9+fX19fXx9fn5/gH9/gICAf39/f3+BgYCAf39/gIB/f39/f1VGRkdHR0dIRj5AQj0/PTxBP0FBRFRLQkhJRklLeIaDhYWEhYeIiIiIiIiIiIiIiIiJiouKioyMjIyOi4uLZ1ZWa2FFUlFRUEo7O1FTUmB1XVVWVFZZWVJYWFJaZlBVV1pdUlRXUVBOUlBQUFFLS0tHSEpIRUZJSUlISWpzdnl5enl6e3t8ent8fXx9gH59fX19fX1+f39/f3+AgIB/f39/f4CAgIB/f3+AgH9/f35+VEhKSUlHR0ZFPz9BQEVBQ0ZEQ0RLVlBKT09OUFB5hoWHhoWGh4iIiIiIiIiIiIiIiIiIlJyMioqMfWGKi4uHbFtkVTpYWFhTUD9AVlVZXGRgVllicl5dVl1aVkVRWVpcWV9UWWdSVVZYVFRWU09PTUtMSklJTE1LT01Tb3R2eHl4d3l6ent6e3x9fH5/fn1+fX19fn1/f39+f4CAgH9/f3+AgICAgH9/gH+Afn9+fn5WSkpJSEdGRERCQT9ITElNUEtJSk9TUVBUVlVWVHWFhIWFhYWGh4iHiIiIiIiIiIiIiImcnaCPiY5nO36MiYqLem5wWFpbWlJTUldWVFpadYNZVX2QYVxYXV5XSVZeXltbX1lIWVhZXF1YWFlXUlFNUFFNTU9TUVFVUmFzc3Z3d3Z4eXh6e3t8fX19f39+fX59fX1+fn9/gH9/gIB/f3+Af3+AgICAf39/gIB/gHh5fVlOS0pJSUZCREBBOk9RUVdYUFBQUVJTUlZXV1dXbIGCg4WEhYaHh4eHh4iIiIiIiIiIiJaanJeIioFuhomIh4OKfmZZWVxZU1ZUV1JRV1ZjloBRZXJYWldfaFBgZlpaWFxoYkdPWmlnXFtcXV1XU05TUFBRVlZWVllab3N1d3Z2dHd4eHt7fH19fX5/fn59fn18fn9/f3+Af39/gH+AgH9/gICBgYB/gH1yfX9/b3R8XVNQT01LSkVDP0A7UFBaWlpSU1FPUVJRVVJVU1ZedXiAhYSEhYaGhoaHh4eHiIiIh4eIh4ORjomJiIaFiIiGfYB7XFBWWFRSVFJRUUxPTUtmeVpdVFlVVl1aTFRaVVNUXlpYV1dXemtYWlxcXlNQUFBJTk9XVlhbWmRxdHZ2dHR2eHl5e3t8fH19fn99fX1+fX1+f39/gICAf3+Afn56eHd2c3V7f3+AgHRrfn5rcnleW1ZVU1JPS0ZDREFNXoNsVlJTT09RT1FWUVNSUlRjZHaAg4KDhISEhIWFhISDhoaGhoeIhn6JiYiHhoOHh4d5bXFWSUtOTktNS0hKREZIRUM+U2NVf1JRUU5LUlVSTU9ZUU1OUVNVVU1RU1JQTkxLR0NJR1JTVFpdbXJ2dnV0dHd7enp7e317fX19fn19fX59fn9/f39/gH99fX5+f39/f4B+e3Zzd31+fmR1fWlxdGBkXV5bWVVRTElMSWFsknRQUVNNUVJQU1tSU1JRUlVVYnN7fH6AgYKBgX99e3uAf4OChYaHgoaGhoGEgYaFhnVfXUtDPkJCQ0NBP0RQQ0NAQz5CSEdWQEhOTUddaVFIRk9GREVGSEdIQkNIR0hKR0NCQUNATlBNUmR0dXZ1c3R2eXx6e3t7fHx9fHt+fX19fn5/f3+AgIB/f3x8fX+Af39/f4CBgH12dHt/bWh8Z25xZmhlZWJcWFNRUFVSc1dlW09PTkxRUlBVWVNVUVFUUk9WYGtsc3Z6e3h5dHJuc3RzeXh+foOAg4OCgIKAgoGBa0xHPj46Oj5APz4+PmpQS2FFRkhJRUI/SExNR01RVUpCRT8+PD08PT0/PT9BQ0I/Pjw9Qj5JTUZVb3V1dnN0dnh6fHp9e3x9fX19fH59fXx+fn9/f4B/f39/enl3eHd2dnh7foB+fXt4dnx1YXhnbHBqbGppZmBbUVFaXFleSUpPUE5LTFFSUVRVVVdRUVdWUFhbYl1hZ21tbG5qaGBucmltbHF1e3p9e3h6fHx4d3hkQkBAQTw6QkNBQUNBW1xPe05PT05LTE1PT1BMS0xXTkhHQUE8OTc3NTk5PTs7Ozg5ODk/O0FHPlx0dXV2dXZ3eXx8fH18fHx8fn18fX19fX9/f39/fn9/f314dXd6e3p3eXh1d3t8eXh1eXdjcWhpcG1ubW1oZl5PT15cWklHT1FRT01QUU5RUlNWWFNSWVROWVpbV1lcX15fZV9dXnF3a15gZ2t3b29sam9tbmxmYllHRkZIQkFGSEVFRkNMUU9hV1JYUVBTU1JVW09PUVdQTUlERj45OTY1ODc5Nzk6MzY1Nzk1PEI9ZnR1d3h3enl7fX18fHt8fX1+fnt9fn19f39/fn5+fn9/e3d1eX18enh8fHx8dHd2d3Z1d2tuaWhxbm9vb2prYFVXXlpXTUtTVFNQUVVPTFJTVFdYU1RYUUxYWVlWWFhWWFldV1hYaHNrXVZgdGthYV9dZGBfXllVUE1PTUxJR0pLSUhGQ1BPU1pXVFROUVNZU1xlVU9TVFFOS0lIQz9BOTk4ODk3ODg0NzU3ODU5OUducnV5eXp7e319fX18e318fX5+en1+fH1/f359fn59f358dHR1e3hycW9vbnR4cXJzeHZ1cWZkZ3JucHBxbm1kXV9fWVdPUFdWVlNUVk9PVVZXWFlTVVRMS1NVVVVVV1BUVVdUVVJdbl5STllgW1ZZO0RVV1RbZkpMUFJST01NTk1NTEpGUFBVWVNUT0pOT1VTVFxWUlVTU09NTElISEY/Pj06Nzg3NjU5OTY3NTY1V3FxdHh6ent8fX19fnx8fXx+fX15fX18fn5+fXx8fX1+fXxydnF4eHJ1dXFxbnBwb3B1dnRuamRkanBwcXJwbmZlZGNcXlJUWlZXVFNWVFJYV1lZWVJVT0lHT1BPT01SSk9QT09OTk9UTE1JUFBTVFUyPFhNSUFRPWNgUVNRUE5QUE9OTk1QTlRSUFJMSUxLT1JQUVJTVFFTT0xNS0xMSENCQT06OTg3NjtCNDU2NjtlcHJ2eHl7fHx9fnx9fH19fX18e3h8ent9fX58e3l9fH18e3B1b3d1cHV0b3N2cHFxcHV1dmNqZ2VXaHRycnFuaWlocFZWVFVYVVZVUldWVVpZWFdWUVNGRkFGR0dIRkpESEpIR0VITEhLSUdMTVBNRy9FX1I9M0A+am9hUlJRQEdUUU9QUFFOUU9QT0xKTExPUE5NUFFRTlBPSkxNTUtHRUVDQjs9PTw5PUc2Njc2RG5xdXd6e3t8fX18enx8fX5+fXt5dnh3eXl8fXp6dn17fHp6b3Fud3JwdnFtcHNwb3Bzc3N0ZmdgaFpXa3JzcmxtbWtuYmVQU1RSU1VPV1ZVWVlWUVFRT0A+Oz0/QEJBQ0BCRURBQEdIR0hGRkhKTUxER0NPUkI4RE1TXWdTUVNBR1VQT1FRUE1NTkxKTEtMTk9PUUxOTk1JTUxJS0tMS0dGRkVEPEFBPjtARTs8ODlUcnN1eXt7e3x8fHt5fHp6fn58e3V0dXJ2dnp6eHpyfHt8eXltcW94cnF1bm5xcm9vb3Rzc3J1dGtnZ15lam1wa29xbWltY0xPTk1RU0xUVVRXV1VMTEtIPTk4Nzs/QT49PUFAQj0+RUhGREZGSUdKSkBGQUFARUdESU9IUVJhXFFQUk9TTk9PTExPTUtNTE1PTltWS01RT0hKSENJSkxMS0ZGRkU/QkM+PUJHP0I/QGRydXd7ent7fHt6end8d3l+fnt7cXN0cHJzd3R4eHN6e3l2d2xxb3ZxdHRsb3Fybm5vc3ZydHNycmtsZW5zaG1ubWxtbGprSUxISE9RSlFTUVRTTktIQ0U9OTg3OT9CPzs+QUBAPkFESUVDSEdJR0lFQkI/PjxCQUBHSkVNT2JlUE1PTVdLTE5LS01NTExLTk5TZE1KTFJJSUlFQklKTE1OSkdJRkJCQkA/RUZFSERMb3B2enl5e3t6fHp3c3h0eHx8eXpucXJtbm9ycnZyc3h8eHZ2bXBtc3B1dGxwcHJvb29ydnVyVlZucWdseYRqbXFybm5qaG9ISkNHTExJTVBNUE9HS0U/Qj05OTk6P0I/PEFCQUFEREdLRkRJSUdHSENDP0I+Pz9APUNFRExNUVRMSklNVEZJSUpMSUpLSUlMTU9QUVBLR0NLR0NDS0pMTk9OSUpJR0NDQ0RJSk1MSVpzbnh5eHp6e3l8dnJwdXJ0eXl2eGpxbmpsbG50dG1zdXtzdHhyb25xb3ZzbnBvcnBvcHN0eWpOYGdzanR8eWdvc3FpcWhlcUhKQ0ZHSEdKS0lKTERHQjw+PTo6OjtBQj89QkJDQ0hFSkxKRUlJRkdIQ0M7QUBCPkA/QkRESU1PR0hKR0hLREhJS01ISkxISUpMSk1dUkhJRE5HQkVMS05OUU5LTUpLRkdHSk1OUk5NY25qd3Z3e3l7en1xbWxza3B0dHR1aHBtamlra3RwbnR0eXByeXRvcnFvd3NvcXB0cnBydXR5a05WbXVscXt2aW5vaWp0aGVwRkpDRkVGREVFRkVHQ0NAPTw9Ojs6O0FEQD9CQ0VFSUZKSkxGSUlHRkZEQjpBQ0M+P0NDQ0RHS01ISk5IREhFSUxOTUhJTEdGRklJTE5LSUhFT0lDR05NUE5QTk5PTUtJSElPU1FSTlNnZ2Zyb3N4dnt6fGxoam9la3Btc3FmbWxoaWtsdG1wdXR3cW94dG90c3J2c3BxcnRzcnR1dXZ2WFZ1dWtvdHJrb3ZsaG1mX3BHSkNFRURCQkFFQERCPj8+Ozs7PTs9P0RCP0FDRkdKRkpJTEhHR0dGRUM/PURFQj5BQ0JDRUdISUdNUElGRUZLTk9LRkhJRkVDRElJSEtJR0hQS0RKTU1RTk9OT1BOSkpJTVJVVVJQWGVhYW1mcHJvcnl6Z2VoaGNpbGZxbGZsbWdpa2xzbXB2dXRwbnZyb3Nyc3V0cXNzdXRzdXZ2dnl2dXR2bGt1dW1ydnFsbmxlck1HRURGQkFAQUQ8QkE+QT06Oj0/Oz4/QUI/QEJFR0pGSkdJR0ZGRkRDQkFBRUZDQkJCREVFR0dIRkxQTEhOSUpMS0lGSEVGRUNDSEhIS0pHS1JNQ09PTlFPT09OT09LS0tQVVdWVlRZYF9daWBtaW5ocnNiZWZmZGhoZm5pZm1taGtrbXJpcXZ1c3Ftdm5vcXJzd3Nyc3R1dnZ2dnd2d3Z2dHd1a3N1bnV0c3Bya2tzTUdHRUdBQUBDRDxBQUBDPDg6PT46Pz1AQkBAQERGSEVIRkZIRkVFRENFQkRJRkNHRUFFR0VGRkdFSU1LSFFMSktISElFRkhIRUNJSUpLTUtQU05EUlNRUVJOT01PUE1MTlNXVldZVlheWl1kYGhjamlna19kZWZjaGdna2dna21rbWxwcWd0dHVyc252b3FwcnR4cXNzdXZ1gpF5dnZ0eHV1d3hub3VvcnN1cXFpcHpNR0dHSEFBQkVFPEBDQkQ8Nzo9Pjs+O0FCPj8/Q0VGREZEREdFQ0VDREZGRkpFRUlHQkdIRkdGRUNGSkpHTUpMS0hKS0ZJSEpIRUtLTExOT1JUT0hUVVRRVFBRTU5RTk1RV1pWWllXWl5aWGFgYGBeaGVjYGRlZ2dqaGhqZ2hubGxvbXFwaXV1eHJycHVwcHBydXZwdXN1dnV7fn14dnR3dnZ2d3BsdXBtc3Vub3NzeU1ISEdIQ0FDR0U8QEVCRDw4Oj4+Pjw8QkI9QD5BQkZDRUNDR0NDRERGR0dHSUZHS0hDSUhHSUdGREhLSUZLSE1LSktLSEtKTUtJTkxOTk9SVVZPTFZWVFFUUlJMT1FQT1RZWllcWlpcX19dX2NeXGJkbGNgZGdocoVoZ2pmam5ucG9uc3FqdHV4cnNzdHJucHF2cnF1cnV1c355jn11dXZ2dnZ4cml1cWtydGxxd3F1S0lKSEpFQkRHRT1BR0REQDk8PkA/Pj9DQjxAPkFBRkNFRENIREVERkZHSEZIR0lLSkVKSEhKSEZGTEhISEpHTEtMTExJTUpNTk1PTFBQUVVWV09LVlZVU1NSUUxPUlJRVltbXV5bXV5gYGFgYmZdZGBmZ2BlaGpkc3NmamhnbHBycW9zc25zd3dwdXZ0c21vcnVvcnNwdXJ2cnSBdnV1dXd2dXd0Z3Rya3Fya3J3cHdJSktJS0dCRURFPEFGRERCOz8/QUBAQERBQEI+QUNIQkVERkdFSEVGRUlIRklISkxISEpKSUtKRkpLSElKSkdLSkxMSUlMS01OTk9MT1BSVVdWTU5UVlVTUlFQTU5UU1JXW15eX11eYGBhYWJgY2RlYWRpYmRpamd2i2xraWdtb3NxcHFwcHJ5d3J1dXRzbW1zc21xcm90dXVzcHN3dHV1d3Z1dXRlcXNrcHFqcnZwd0pMTEtMR0NDQUU8P0VFREM9QUFDQkJDRUFDREFBRUdDR0dIRkVJRkNHSkdHSkZJTEhJSk1LTUxHS0lIS0tOUUtSUExTTUpNTU5QUFBUT1dYWFtOU1FXXFpTVlBOVFVUVFhaX2JiX2RhXmFjXmBmY2FiZ25oYmloaG14dm1oaW5vc3JwcXJycnZ0c3Vzc3Nua3NxbXByb3R2c3FxdXZ1c3d5d3V0dWNtdGtvcGpxdHB3TE1MTExHREFARD49REVGQz9DQUVEREZDQkVHQ0JIRkJISklHSEpGREtKR0hKSElLR0pKTktOTElMSEpNS1pmSmRbS2xSR05NX25VbHNbcXBid2NSUGJ2dWh1Y2F2YVhucWJkdmluemZcbHVgbGtWYHd1aGpnaGZnbG1qbW9qbW9zcnBycnFyc3Jzc3J0cm5sdG9ucHFxdXVycXN0dnZ1dXl3dXR0YGt0a3Bwa3FzcXlLTkpLSkZCP0BCPzxEREZEQ0NCRUVERkJFRkdEREpFRUpMS0lLTEdHTkpISktHS0pJSkpOTE1NTExJTUxMW3NiZHBebGxVTE5lcl1nZXFsbnRncGlfYVlubWJwcGJraWpnb3F0ZXRublxwdmdwTkxyeXZrYWFrZWVseG1rdmxub3NycHJxcHFycXJycnRybW1zbm5vcHJ1dHFzc3R1dXV0d3h2dXRibXVrcHBscnJxektMSUlHRUQ/QUE/PUJFRkJFQ0VERUVEQ0hIR0RES0hHS01NSkxMRkpOSEpLSklMSkpJSk1NTk1NTUtOTU1bcnBvbnBwa2pMT1BtWE5pYnRycGFtb3ZcWWxQW21tWnFta29teHh0c2lwXWBzbHFqVXV5eG9jXmtmYmdwcGppb3Bwc3NwcXBxcXJycXFycnRsbXJtbW5vcnV0cXRydHV1dHV1enZ1dGVudWtwb2xzcnJ5SktHR0VFRUJBQj0/P0VHQkdESEVFREJGSUhIRUdLSkdNTE5KTE1HTE5JTUtISk1JSklKSk5PTk5NTE5NTFxoZHVdbHFWa01PUW5VWmtea2x2YWxkdFRlY05sWWxcdHBraWx4and1aHBdX3NraFdiY3d8b2NgZ2hhY2l0eWtubnFzc3BxcHFwcnFwcHBydWttcW1tbW9xc3Rxc3J0dnZzd3Z6dnV0aG91bHNvbXNydHZJTUdJRUVEQ0FCPEJAQkZDR0ZLR0VDQ0hLSEhGSUxLRk1LS1JSTEhNTUlOSklITkdKSkhJTk9NTkxKTU1KWnRwcG9xcWxrT1FSbllza2dvb3Fxb210Xm5YYXRfbm9wb3Fyb291c3R0alpedGN3eHJqbnpoYWFjZmFiam10dXBzdXZzcXBwcW9ydHt/fn13bGtxbmxtbnByc3F0dHN1dXR4eHl5dHVrb3VtdG9uc3N2dElLSEpDRERFQEA+Q0NBRkNISU1IRkNGSkxJR0ZKTUxGT0pKV1JLR0tKSk5JSUpMSUtKSUlLTE1NTElLS0tTa2JZaV5famNyclpfWWpvX2VlVWtfY1thYVFgbWhcalxuaWlkW29lZHBdWlxrW21xY3BzbGRnY2RnYGBrbXBwb3R5cnVxb3BxbnmFiIeHhoWAdnNua21tb25xcnR0cnR1dXZ5eHhzdW5xdW53cXJ1dHdySEhGSkRFQ0ZBQEFFRENGQkhKTEdGQ0ZLTElFRkpPTElPSkxbUUpGSEhLTUlISkpLS0lISUdLS0tLR0hLSkxLTEpJS0xOVFtdVFBVTVFPTk9PVlFPUFFOT1FKSk5QUWRxaVRZVltbXFVZWl1YXVxcY2ZhYWZiY2ZfXmZrbWhtdHhydHJvcHB0hoeGhoaFhYaHg3pwbW1sa3FzdHRydHZ0dXl5eHV2cXJ1b3ZydHN1dXNHQ0VHRkZARUM+Q0dERUdDSUtMR0ZER0pMSERHSVBLTE9LTFdNSUZFSElKSElLSExKSUZISEpISEhFRkxJSEpOS0hPXFdeT1xcYF5PWFlTXFxiXk1YWk1YYVJLWWFaU2BkXGFYW2RkVlZYXFlaWFxWWVxeY19kYGFfZWhrZ210dHFxdHBxcoGGhoaFhoWFhYaGhoR9cmtpb3Jzc3N0d3l5eHl4d3h0cXhyeHNxcnVydE9CQ0RMTEFDREFESUVHR0ZLSktHRUVKSkpGREdIUEpMTUpNUklIRUFIRkpJS0tJTEpJR0VKSEVGR0VFSkdCSUxJSlRfWWBYYGFbYFVYWVRdXlpfUllcUF5cWU5fXF5TW15kXlpdYGNfWV9iW2BeW1VZWFpfXmNjYmFjZWlla3Jwb3Bwbm93hoaFhYaCe4CFhYaGhYaFf3VxcHJyc3V5enp5eXh4eHdyeXZ4cnF4dnR2YVNKSk1IRENCQ0ZHRUdHSUpKSUhERktLS0VFSElOSk5MSExOR0hGPkdHTElLS0pLS0lHRUlGQ0RFQkZKRD9JSkhOWmJZXl5hX1JUU1dfX1xdWV5RWVxNVl9XS1FZW1FbX2JhXV5jYWBiYmJjY2VaUllWV11aXmRgX19jZWJob21tbGxsbHWFf4SDeXV8hIWFhYaGhYWGhoN9d3JydHd5eXl5f359eXV5dnZybnp3dnhYUUpGREdFQkVHSEZHSElGR0pHSEZIS0lLRENLSk1NTExISkpISkc/R0ZOSktLTUtLS0lHSUVFQERBSElBPkhJRk9dYFpbZF1fVFFSWF1cXFxfW0tXXExSXFlJTV5RUV1fYmNjY2NiXGRjYmRjZVhSV1VUXVlbYV9eX2FhX2Rsa21qa2xudn51gXp8hIWFhYWFhYaGhYaFhoaGgnpyc3V1e4WHh4eGhYSBfnhwend2eFxSTUNASUZDRUtJRkdHSUdHSkZGRklMSk5FQ0tKTE5KTElLSklJR0JISFFNS0tPTUtLSUhIRkU/RUJISEFARkVDU11ZXlhfWV9bXVVYWE9cXFFLSlZeWF5bXVZaYVJSX19iYmBgYmJfY2JiZGRiWFBSUlNcVFxdXV5eX19fZGhnbGpubnB7e3x+e4CCg4SFhYWFhYWEhIWDhISHh4FzcneFh4eHh4eHh4eHh4WDgHx4XFNLQkFHR0RGTVJIRFJLRkhISERGS0lNUEVHSUpLTkxMSUxLSklHREhLUU9NTFBNTEtLSUpERUFFQ0hGQUFGQ0FVVUVcVF5TVl9YTlRVTVlaTEpLVGBhW19YX15iXU9ZYlxgYF9iY2FdYmFXYF9UUVBRUllTXlxbXV1eYGJmZmVsZm9vd3x7gHt9f4CEhISEhIWFhYODhYKDgoWFhnpvgYaGhoeHiIeGhoaFhYSFg35JTkZERkZIRElTY1FFV19JR0dIREZNSlBQRklISktOTExLTUtKSkdFSk5RUU5OUE1OTU5JTEJEQUNDRkNCQENEQExIQ0xMUE9OTEZNRkZISUdGTEtNT1BJTE9QUFNQTFFTUlVaWFdZV1djVk5SVFBRUE9RVVRcWVlbXVxhYWVmY2hkbG1xc3N6eX97en+EhISEhISEhIKEgH57gYOBfXuFhIaGh4eHhYWFhISEgoGAfUtJRUVHRkdES05eTUhIWU1HSEpIR01MUVFJS0pLS05NVU5PS0tMR0dLUFNTTlBQTk9PT0hMRmBFRF5MRGZiQ0xaSF5cc21PTVZtWEtDT19Ua1ZnSV1XVV5ETFFVTE1TVlFSVFhWVFhUVFxUT2VaaGhlWlVrVFhXVVtcW2BgYWJiYmBnaWdubGhyenx9foGEhISEg4ODgX19enJ7gXp7f4KAg4SEhYWBhIWBg4N/fnp7TElFRkZIRUVLUFRKS0dgVEhKT0pJT01SUUtNS0xPUlVST1BKTE5HSE1RW1lPUFBOUFFQSktRf1FJfFlZcnNXUG1HcW5vYVZQcXF0T0Jqc25xc3BTb19bblhdVlxYVWtoVV1WY1lgWVpeVVVXf2l0dXVfYXZfWGJcXGZbX2FhYWJeYGNnbW9sYHB3dHiBgYKDhIJ/fX6Adnh6bXZ+dHh9gHx+gIGChHyAg3p/gX9+d3dNSUVITU1CRExMR0pMRlJWTEtPSExSWFdRTk9PTVFUTk9RUEtMT0dNUFNbWlRRUk9QUFBLSVp4XVR4ZGhYUlNQdmZ0bHBibmZrUnJOTHdtanJwc3JxcnBvb4BdZXp1eHFxenF+cn1rdX1hUmh8ZXNzb3NzfH1vfnhvf3JgYGBiYlthYWhsbmtibGZnbXd+gYCDfnt4d4B0dnpocn5udHx+d3h7foCDeHyBdXx/fHxzc01LRmBdR0FFTU1IS0tISlBPTU5KTlZeWVVMUVNOWVlMU1JSTkxQSVFSVFlXV1FUUFBQUktIZ3hsY3hxbVpKS1R5cHVtdWJudlBkZEhldnFtd2+AamZ4eGlXclFoem1panp6fWx4en9waG5YdXVqdnVwgGFzaH1pbHh8b19fX2NiXF9kZWdqamVnYmNkbGxwcHN0c3NzeXFyeGJsdGdyeXtzc3V5foFzdnpufH15eHJuTUlSdE5DQkVQUUhLTEpMUU9PT01QWmBaWEtUV1BhXlJWUVlTTVBKU1RVWFdXUFVQT05TSktyb3V1cXVxY2hgVm5LcXBeR2h5V3ZUS2h4fXdgeXtzbmFdbW9kU2dydW5teXB3bHZzdHFsbVxzfnprbXl8bHVufGxxdnV4Xl9fYl9dX2VlaWdoZmVeYmJpaWlqa25va3FubWpwYWNmZG93eG9tcHN5f25xcGp7enRyb21LS1pWSEdFR1JRS01OTExRUVBQUFFXXFlVTlZZVWZYUlJZXlRNTkpUVFZXWVdPU09PTlJJUm1IaXdLYGR2dlRWbE5ubHtyYWpnf3VUS1drZ3xsbWx4X1pwentfYHpzY3JveHFoZHxpcntdVEtrX3Z1bGp2fHttfnlrfHBdXl5iW19iZGVnZmVlY1tjY2lra3JzcndnbWloZGdgYWxhZ3NybGdsbXJ8a21oa3t0bW1rbU9HSktISkhIUlFNT1BMTFNTUk9TUlhSV1RQV1pWVlRUVGFgUU9OS1RTU1FWVk9PTU5PUUpIUU1PVUxLS1JTUlFST1ZVUVFPUlJYWFBNT1VUV1hYW1tVUVJXW1dYV1tPUlRXV1hRXVhWXFVUT1hSV1dYWVpgXGdyX1tbWl1dX2NaX2NjZWdkZGRjWmRiZ2ZmbW5tdWZmZ2NgZl5dZ2BkbGhmZ2tocHpoZ2drdWpoZ2lsUElLS0xNS0pUUk5SUVBMVlVUUFRVWFVaVlJbXVZVVFdVWVhPT0xOV1RQTlVTTlBOTFFQS0lRUUtRTUpKT1FUUVBRU1JKSE1PUFFSUFBQVFVSWFdcV1NSUFFVVVVTWlFOUlFXVVNZVlRYVFNRVFNVVVlZWF5aX2FdXFpaXFxgY1xeYmJkZ2VlZWJZYGFjYWJoaGpuY2FkXl9jXVpjXGJtYV5mZmdtc2RpaGtrZWRjZmhRSktLTk9MTVRRT1RRUk1YV1VUVlhXV1pWU1xgVldWWVVYVFFQS09YU1BOVVBOUU5MU1BNTlVTTlFOTU5RU09UUFJUVE5LTU9SVFRRUVFVV1VZWltZUlVSVFhXVllcU09TVFdVVFlVVlhUUlFXVVZYXFpcYF1XWV9dXl1cXWBhXltiY2NoZ2ZlYlhgYGJdYGhlZ2VhXl9dXV5aWl9aX2dgXl5dY2hrYWhmaGZkYGJkYlBLTUxQUUxPVFBQVFFPUVpZWFdZWlpYWVZdamRWWFlaV1ZTVE9LT1ZUUE9UUFBRTk1SUU9RWFRRUU9NT1JUTVdRU1RVT05OUVRWVVJSUlRYVlpdXFpWVlFSV1hVW1tWUFNVVVVWWFNXV1RSUVhWVltfW19gX1ZfXV5gXVxgX19fWmJjZWloZWViWWJgYl5eZmRjYGJdXFxcXFlaW1hbYVteXV1fYl9fYmRkYmRfX2BcUE1OTlJRTVJTUFNVUU9WXFpaV1tbXFlaW2RxbWhkX1tZVlZYUk1NV1NNTVJPUVJPTVBTUlVaVVRQUExQV1VQVlJTUlhNT1BSVVhVVFRTVFlYW15dXFtWUk9VVlVbWlZRU1ZUVlhUU1haU1JRWVdXXV9bYGBgVmJcYGFdYGJfXGBdY2FjaGllZmBaY2BhX19lZV9gY1taXFtcWlpZWVdcWlxbYF5gW15eYWBfY1xZYFpRTk9OVlFQVVNQVVRTUFdcXFxZXlxfV1xeanB3eYBjXFtWVllSTlBXU05RUVBSVFJMUlRTWVtXVU9STlNYVVNRVFFRWU9RU1NWW1ZWVlNWWlhdXlxcXlZTTlRWVltbVVFUVFVXWFJTWVxUUlJcWFpdXl1iYWBXYltjYl5hY19cYmFiX2RnaWVnXVxkYGFgYWNkX2JfWVpfW1xbWFhZV1daWlphXV1bXVxcWl1gV1tbWlBPT09ZUFVVU1JYUlRQW11eXVxgXGBVXFxoanJ9c2xoXFVZV1FPUltTUlFUUlRVVEtRVlVaWlpTT1NRVVVUUk5VUVJaUlRVVFhdV1hYU1hcWF5dWVpdVVVOVlZXXlpXUVRUV1hYU1ZZXFRSVl1ZXV1hXmNjX1lgW2ViX2RkXl5jY2FeZWZpZWZeXmRhYWFiY2RfYl5YW19bXFtYWFhYV1taW2BdW1tcW1haW15WXlldUE9PUlpQWlVWV1ZUVFReXmBfXmJcYFVdXmJreXVtfWxaVVpWUVFUXFRUVFVUVllXTFJaVlxaXFJQVVNXVVVST1dRU1dTV1VWW15YW1lVWl5YX15ZXFlSV1JZWFlfWVlSVFVZWVlVV1lcVVRaXV1eYWJgZWRdXl1dZWFiZmReX2RjYFxnZWhmZGJgZWFfYWFiYl9gXldZXlpcXFpZWVdWXVpdXltaW1xbV1lcXVZYV11TT1BXWVFcVVZZV1dVWF9gYWFgY11gVV1eYmVldoJ7aFhZWlRWVFZcWFdXVlZXXVhPVVxZXl1dVFNYUlZVU1FSV1FTVlRYWFheXlhdW1VdX1hfX1hcVlFYVFlaWmFYW1RWWFtZWldYWVpXVl1eYF9kY2JlZV5iXGBmYmRmZF9gZGJhW2ZjaGZkZmFmX19hYmFhYF9eVlVdWVtcW1lcWVldW1tbWFhZW1laWl1fXVRZXVVOVFpWVFxVV1dZV1ZcYGFiY2FjX19WW2BkYV96dW9oWlxaVlhWWFtaWVtZWFlgVk9UXVtgYVxVVVlQVFZUUlVVUVNVV1tbXF9fWl9cVl9fWV1eWV1WUlhXWVlcYlldVVZaXFpbWlpZWlhZX19gYGRjZGVlY2RaYmZjZ2ZlXmFiYGNdYmNpZWRoX2deYmJjYWFgXl9YVFpaWltbWFxYWFxbWltXV1pYV1xbXGBdVl1dU09WWlZWWlZZVlhXWF1fYmFkYWRhXllZYWRiYGtmaF5cXVtXV1laXFxcX1tZW2JWU1deXWFjXFNWWVBWVVVVVVVTVVRYXV1fYGBdYV1XYV5bXlxbXlhVWFdbWl9fW15XWFxcXF1dW1pcV1pfYV5gZGRkZmZnY1ljZmVoZ2ReY2BfZWNdZmlkZWlfZ15jYmNhYWBfX1tYWVtZWllYWlhXW1taW1dYWlRaXVxbYFxVXmJNUldZVldaWVtcWVdZXmBiYWVhZGFdXllhY2JfYWBhX11dXVhXW1tdXV9fXFpdY1hZWF1gY2RfUlhZUFdVV1hXVlZXVl1dXmFiYV9iXllhXV1eWVxdWVhVVltbYF5cX1lZXl1eXmBcWlpZW19iX2JlZGVmZ2hjWmVmZ2lnY19jXmFmZVppaWNmaWNmX2JiY2FgYF9dXVpXW1lZWFhaWVdaW1pZV1hWVVtdXV1gYGJheEtXV1xZV11cXF1aV1xdX2BiZGJjYV1gWGJjYmBjYWNeXF1cWFdbXF9dYF9dW2BkXFxYWmJlY2FSXFlPWFZZW1lZV1laYF5hYmNgYWNfXGJdX11bXl1ZWVRYXVxfX15fW1peXmBiYltbV1tdYGJiY2VkZ2ZmZ2VdZWdoaWZjYWJbY2dgXGlpY2hpZmVgYmFjYV9gX11dXFlcWVhXWFlZV1xbWldWWFBYWl1hY2Zmcmt/SllXXVtaX11cXlxYXVteX2JjYmFhXWJbYmRiYGNiYl1cW1pXWGpxYFxgX11cYWNfXllZY2VkYlRfWlFZV1xdXFtZW1tjYGNjY2BiZGFgY15gXF5eXlpYVVteXFxhYV9dW2BhYmZiXltTXF9gY2RkZmVnZ2ZmZmBmZ2hoZ2RkYFtlZ15haGhjaWhmY2BiYGNiX19fXV1bWltZWFhYVlpXXFtaVlZVTFhYXGdpa2h1eIF2dnZ2dnZ2dnZ2dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6e3p6ent7e3t7e3t7e3t7e3t7e3x7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHt7e3t8fHx8fHx8fHx8e3t7fHx8fHx7e3t7e3t7fYmIhomHhYKBgoOCg4OCgoKCgoKCgoKCgoGAgYCBgICAgYCBgYGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t6e3t7e3t7fHx8fHx8fHx8fHx7e3t7e3t7e3t7e3x7e3t7e3t7fHx8fHt7e3t7e3t8iYmHiYaFgoGCgoGCgoKCgYKCgoKCgoKBgYGAgICAgICAgIGBgYB9fHx8e3x8fHx8fHx8fHx8dnV1dXV1dXV2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eHh5eXl5eXl5eXl5eXp7e3p6e3p6enp6enp6ent7e3t6enp6enp6ent7fHx8fHx8fHx8fHx7e3t7e3t7fHx8e3t7e3t7e3t7fHx8fHx7fHt7e3uHiYiJhYSDgYKCgoODgoKCgoKCgoKCgYGBgICAgICAgICAgYKBgH58fHx8fHx8fHx8fHx8fHx2dXR1dXV1dHV2d3d3d3d3d3d3d3d3d3h4eHh4eHh4eHh4eHh4eHh4eHl5eXl5eXl5eXl5enp6e3t6enp6enp6enp7e3p7enp6enp6enp6e3t8fHx8fHx8fHx8fHx8fHx8e3x8fHx8e3t7e3t7e3x8fHx8fHt7e3t7e4aJiYiFhYOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgIGBgYCAfnx8fHx8fHx8fHx9fX18fHjF1NLS0tLUk3t9fX19fYSMi4uLi454KSkqKiopKz0/Pj4+Pj5tgH5+f397pdfT09PT08/ExcXFxcXH0tTU1NPT08S+vr6+vr7K09LS0tLWun1+f39/f359fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx8fHx8fHt7e3t7hIuHh4aHgoGDg4GCgoKCgoKCgoKCgoGBgYCAgICAgICAgYCBgIB+fHx8fHx8fHx9fXx8fH19eNXn5OTk5OeZe39/f39+hpCPj4+Pk3kZGhoaGhocMTMzMzMzMmqCf4CAgHut6eTk5OTl4NTU1NTU1Nbj5eXl5eTl0svMzczNzNvm5eXl5enHfX5/f39/f319fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e3uCjYeIh4eDgoSCgYKCgoKCgoOCgoKCgYGBgICAgICAgICAgICAgH58fHx8fHx8fXx8fH19fX12fn9/f39/gHl3d3d3d3d4eXp6enp6eG9vb3BwcHBycnJycnJyd3p5eXp6en6Dg4ODg4ODgoKDg4OCg4SEhISEg4OCgoKCgoKChISEhISEhYJ8fX19fX19fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e4CMhomHh4SDhIKCgoKCgYKCg4KCgoGBgYGBgYCAf4CAgICAgICAfnx8fHx8fHx8fX19fX19fXZ0dHR0dHd1dnd6e3h7eHd2eXx6enp5fXl5eXh4eHh5eXl5enp5eXl5enp6eXh4eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXp6enp6enp6e3x8fHx9fX19fX19fX18fH19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8f4uHi4qIhIODgoKCg4KBgoKDgoKCgYGBgYGAgIGAf4CAgH+AgYF+fX18fHx8fHx9fX19fX19d3d3dnZ3fXh3d316eH14d3Z6fHl9fXt9e3h3d3d3eHh4eHh5eXl5eXp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fHx8fHx8fHx7e3x8fHx8fHx8fHx+iomMjImFg4SEgoKDgoGCgoKCgoKBgYGBgYCAgICAgICAf4CAgH19fXx8fH19fX19fX19fX13d3d3d3p9eHt4fHx3e3h3dnp+e319fX58eHh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fX19fXx9fX19fX19fX19fX19fHx8fHx8fHt7fHx8fHx8fHx8fH2Kio2NioWDg4OCgoKCgYGCgoKBgoGBgYKBgIGBgICAgIB/gIGAfXx9fX18fX19fX19fX19fXd3d3d3fX55d3d4e3p7eHd3eHl9fXt9fnx4eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt8fHx8fHx8fHx8fHx8fH19fX18fH18fH18fHx8fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8foqJjo2JhISEg4KDgoKBgYKBgoKCgYGBgoGAgYKAgICAgH+BgIB8fH19fX18fX19fX19fn5+d3d3d3d5fHl7eHx9eXt4enp6fHx8fHt+e3h4eHh4eHh4eXl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt7fHx7fHx8fHx8fHx8fXx8fX19fX19fXx8fHx8fHx8fXx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx/iIeNioeFhoaDg4ODgoGBgoGCgoGBgYGCgYCAgoF/gICAf4CAgHx8fX19fX19fX19fX5+fn53d3d3d3Z4eHl3eXp4enh5eXl7eHp6eXx4eHh5eXh4eHh5eXl5enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX18fH18fH19fX19fH19fX19fHx8fHx8fHx8fHx8fX+HiIyIhoeHhIKDhISCgYKBgYKCgoGBgYKBgIGBgYGAgIB/gIGAfHx9fX19fX19fX1+fn5+fnd3d3d3d3d3d3d3eHh4eHh4eHh4eHl5eHl5eXl5eXl5eXl6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fHx8fX19fHx8gIeIi4eHiYaDg4SDg4KBgYGCgoGBgYKCgYGBgIGBgYCAgICBgX97fH19fX19fX19fn5+fn5+d3d3d3d3d3d4eHd4dnl5eHh4eHh5eXl5eXl5eXl5eXl5enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fH19fXx9fXyBhoqKiYmIhIOFhISCgoGBgYGCgYGCgoGBgYCAgYGAgIGAgIGBf3x8fX19fX1+fn5+fn5+f394eHd4eHh4eHZxZGpeam15eXl4eHl5eXl5eXl5enp6enp6enp6enp7e3t8e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIGFiYqJioeEhYWEg4KCgYGBgoKBgYKBgYGBgYCBgYCAgYCBgIF+fH1+fn5+fn5+fn5+fn9/f3h4eHh4eHh5bWRiZV9fXm95eXl5eXl5eXl5eXp6enp6enp6enp6e3t7e3t7fHx8fHx8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goWKiomJhISGhYSDg4KBgYKCgoGBgoGBgYKBgIGBgICAgICBgH58fX5+fn5+fn5+fn9/f39/eHh4eHh4eW5kZWdlZGJeZnh5eXl5enp6enp6enp6enp6enp6e3t7e3t7e3x8fHx8fHt8fHt7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChouJiIqEhYaEg4OEgoGBgYGCgYKCgYGBgYCAgYGBgIB/gIGBf3x8fn5+fn5+fn9/f39/f394eHh4eHl3Z2VkZWZkZWFfaXl6enp6enp6enp6enp6ent7e3t7e3t7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHt8fHx8fHx8fHx9fX19fX19fX19fX19fXx9fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4eJh4SEhoSDg4WBgYGBgYKCgYGBgYKBgICAgYGAgYCAgYF+fHx/f35/f39/f39/f39/gHl5eXl5eWtlYWJlZWFlZV5ieHdze3p6enp6enp6enp6e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fH18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19g4aLhoiFhYaEgoOEhIKBgYGBgoKBgYKBgYGAgYGBgYGAgIGBgn98fH9/f39/f39/f3+AgICAeXl5eXl0Y2NlZGNmY2doZGZsZF5ze3p6enp6enp6enp6ent7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn6DhouGhoaGhYODg4SDgYGBgYGCgoGBgYKBgYCAgYGBgYCAgYGBfnx8f39/f39/gICAgICAgIB5eXl6d2RhY2diYmRdW2VfYV1eYGFoeHp6enp6enp6enp6e3t7e3t7fHx8e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+foSFi4eGhoaGhIODg4KBgYGBgoKCgYKBgoGAgIGBgYGAgYGBgYF+fX1/gH+AgICAgICAgICAgHl5eW9vYmJiZF5jZ19dYWFgXF9kYlttfHp6enp6enp6enp7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7fHx7e3x7fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5/hIiLhoSHhoaEhIODgoGBgYGCgYGBgYKCgYCAgYGBgYGBgYGBgX5+fYCAgICAgICAgICAgICBeXpwXWJlZGJkXmZnZ2BZYmJhY2VfXF1ze3t6enp7e3t7e3t8fHx8fHx8fHt7e3t7e3t7e3t7e3t7fHx8fHx8e3x8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fn19fn5+fn5+fn5+fn5+foCFjIqEhYaGhYODg4SCgYGBgYKBgYGBgoKCgYCBgYGCgICAgIGBf35+gICAgICAgICAgIGBgYF5emxiZGdjYmdmYWBgZGFiZWRjZGNeXGJ1fHt7e3t7e3t7e3x8fHx7e3x8fHx7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/gYeMiYWGhoeFg4SDgoGBgYGBgYKBgoKCg4KBgIGBgYKBgYGCgoF/f36AgICAgICAgIGBgYGBgXp7dGdnZmZkZGZmYF5fYWNlaGRlXmJkYHR8e3t7e3t7fHx8fHx8fHx8fHt7fHt8fHt7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f3+CiYqIhoaIhoWDhIOCgYGBgYGBgoGBgoKCgoGAgYGBgoKBgYKCgX9/f4GBgYGAgYGBgYGBgYGBenptaGNjZ2ZnZWdmZmdiZWRlYmdbYmVgdnx8e3x8fHx8fHx8fHx8e3t8fHx8e3x8fHt7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f39/f4SJioiGiYeFhYSEg4KBgYGBgYGCgYKCgYGBgYGBgYKBgoGBgICBgH9/gYGBgYGBgYGBgYGBgYF7emlpZGNqZmFgZmVjY2NnaWRjYmBiZGJ0fXx8fHx8fHt8fHx8fHx8e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f39+fn9/f39/f39/f3+AhIqMiIeJhoSFhYOCgYGBgYGBgYKBgoGBgYGBgYGBgoKBgYGBgYGAgH+BgYGBgYGBgYGBgYGBgXZzZWRnY2RmZWJlZmdkZmhmZWNgYGNkYHF9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fXx8fHx8fHx9fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/fn5+f35+f39/f39/f3+AgICFioyJiIqJhoaDgoKCgYGBgYGBgoGBgoGBgYGBgIGBgYGBgYGCgX+Af35/foCCgoKCgoKCgoKCc3NnZWRkZWlqaGZnZ2NhZmZlZmdmZWVjdX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fH19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gICAgICAgIWLioqJioeHhoSCgoGBgYGBgYKCgYKBgYGBgIGBgoKBgYGBgYGAf4B+dHRzdX1/goCAfn5/gYB0cmdkZWNmaWppZWNlY2BmZGRnZ2JiZWFwfXx8fHx8fHx8fHx8fHx8fHx9fX18fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f39/f39/f4CAgICAgIB/houLiouLh4eHhIOCgYGBgYGBgYKBgoKBgYGBgYKCgYCBgYGBgoCAgH5zc3NzdHV4dXV0dHV2dXVwZmNmZWhoaWdoZ2VmZWJfZGVmY2BiZ3d8fHx8fX19fX18fHx8fH19fX19fX19fXx9fXx8fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gIB/f3+AgICAgICAgICHjIyIi4qHh4eEhIKBgYGBgYGBgoGCgoGBgICBgoGBgYKBgoKCgYCAfnNzc3Nzc3NzdHR0dHNzdW9jY2FnZWhoZ2pmZGVnZmhmY2JlYl5ieX18e3t8fX19fX18fHx9fX19fX19e3x9fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn9/fn5+fn5+fn5/f39/f4CAgH9/gICBgICAgICAgYCAf4CAgYGAgIeLi4iNiYiJhoSFgYGBgYGBgYKCgYKCgYGBgIGCgoGBgYKBgoKBgIB+dHNzc3Nzc3Nzc3Nzc3N1cmdlZWRlamhoZ2ZpaGdjZWViZGNoZGd7eHVzc3R2dnl4dnR0dHZ3d3d2dHR0dXV4d3h4d3d6e3x9fXx9fn5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f35/f39/gH9+fHt7fX58eXl2dnZ5fHx6end2d3l7fXt4hIyMioyHh4iEhYSBgYGBgYGBgoGBgoGBgYGAgYKCgYGBgoGBgoGAgH51c3Nzc3Nzc3Nzc3Nzc3VzaGVnaGVrbGhqZ2lqZ2dnZmRkYmVkbnV0dHNzdHNzc3Nzc3Nzc3Nzc3NzdHNzc3Nzc3Nzc3N0dHV1c3V3eHl7fn59fn98f39/f39/f39/f314fH5+fXx4dXZ3eXd4dnRzc3N0dXRzc3Nzc3NzdHNzc3R0c3R0dHODjI2KiYeIhoOGg4GBgYGBgYGBgYGCgYGAgYGDgoKBgYCBgYGBgICAf3VzdHRzc3Nzc3Nyc3NzdnZpY2hqaGpsZWZpbGhgZmVkY2BkZGZ0dXV1dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHRzdHRzc3Nzc3R2dnV1d3V4fH9+fX9+fHp4dXN0dXV1dHNzc3Nzc3N0dHR0dHR0dHR1dXR0dHV1dHR1dXR1dXV1dIaMjYuIhoeEhIWCgYGBgYGBgYGCgoGAgYCBgYKCgoGBgIGBgYGAgIB/dnNzc3Nzc3Nzc3Nzc3N2dnNnZ2pmaGdmaGhmZGlnY2NnZWVmcHZ1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dHR1dHR0dHR0dHRzdHR0dnV1d3Z0c3R0dHR0dHR0dXV1dXV0dXV1dXV1dXV0dHNzc3N0dHNzdHR0dHR1dXR1iY6MjIqHh4SEhYKBgYGBgYGBgYKCgoGBgICAgoKCgoGBgYGBgYCAgH93c3Nzc3NycnJyc3NzcnZ2dW5kXWNnZWlraGVoZ2dqamlnZXB2dXV1dXV0dHRzdHR0dHR0dHV1dXV1dXV0dHV1dHR1dXV1dXV1dXV1dXR0dHV1dXV1dXV0dHV0dHV1dXV1dXV1dXV1dXV1dXV1dXV0dHNzc3Nzc3N0dHNzc3Nzc3R0dHR0dHWKjoyMiYaGhIeFgoGBgYGBgYGBgoKBgYGAgYGCgYKBgYGBgYKBgICAf3hzc3Nzc3JycnJyc3NzdnZ3d2liaGhnamtpaGZkZGVmaWhwdXR0dHRzc3JxcnJ0dXV0dHR0dHR0c3NycXFxcXNzdHR0dHR0dHR0dHV0cnJyc3R0dHR0dXV1dXV1dXR0dXR0dHR0dHR0dHR0dHR0c3Nzc3Nzc3Nzc3Nzc3N0dHN0dHR0dHR0dYuOjImGhYWFh4SCgYGBgYGBgYGBgoKCgYGAgIKCgoGBgYGBgYGBgIB/eXNzc3NycXJycnJzc3N3d3d3bGpoZGhpa3Z6a2VmZWhnbXJzdHN0c3JwcHBxcnN0dXR0c3NycnNycXBvb29vcHFzc3NycnJyc3R0dHNxcHFyc3R0dHR0dHRzc3Rzc3NzdHR0dHRzdHR0dHR0dHRzdHR0c3NycnFxcnJzc3Nyc3NzdHR0dHN2jZCMh4eFhYSEgoGCgoGBgYGBgYGCgoKBgYGAgYGCgoGBgoKBgYGAf395c3NycnFxcnJycnNzc3d3d3dzc2pnaWloeX99cW51bG5wcXJycnFxcG9wcXFxc3Rzc3NycXFwcG5ubm1ubW5ubnBxcnJycnJycnJzcXBvb3BxcnJzc3JxcnJycnJycnJycnJzc3Jzc3Nzc3Nzc3Nzc3Jxb29ubm9vcXJzc3Jyc3NycnNzcnaPj4uHhoWFhYOCgoKBgYGBgYGBgYGBgoGBgYGCgoKBgoGCgYGCgX9/f3hxcHBwcXFycnJyc3Nzd3d2dnd2cnF0c252f352c3hwcHBycnJycXFwcHFxcXFyc3Nzc3FwcXBvb25ubm5ub25vcHBxcXFxcXBwcXJwb25vcHFxcXFxcHBxcXFxcXJycnJycnJycnFxcnFxcnJycnFwb29ubm1ubW5vcXJycnJycnJyc3JxeI+OjYaDg4aEgoOCgoGCgYGBgYKBgYGCgYGBgYKCgoKCgoKBgYKBf4B/d29wb3BxcnJyc3Nzc3J2dnZ2dnZ3dnZ1c3l/fnd3d29wcXFxcXFxcHBwcXJxcnJzc3JycXBwb29wb29vb29vb29wb3Bvb29vcHBxb29vcHBwcHBvcG9wcHFycXFxcnJycnFxcXFxcXFxcHBwcHBxb29ubm5tbW5tbm9wcXFxcXFxcXFxcXB7j42NhoODhYOCgoKCgYKBgYGBgoGCgYGCgoGCg4KBg4KBgYGAgYF/f392bm9wcHBxcXFxcXBwcHZ2dnZ2dXR0c3NxfYB9fX9zb3BxcXFwcHBwcXFwcHBxcnJxcXFwb3Bvb3Bwb29wcG9vb29vb29vb3BxcXBub3Bwb29wb29wcnJycnFxcXBxcnFwcXFxcHBwcHBwcHBwb29ubm1ubm5ubm9ub3BwcHFxcXFxcXFxcIKRjoqEhIOFhIOCgoGBgoKBgYKBgYGBgYGCgoKCgoKCgYGBgYCBgX9/gHVvb29wcXFxcXBwcHBwdnZ2dXRzcnJycnGAgoCBeXBwcHBvcHBwcHFxcXFwcXFxcXFxcG9vcHBwcHBwb3BxcHBvb29wb29vcXFwcG9wcG9vb25vcHFxcHBwb3Bvb3BwcHBwcHBwcHBvb29vb29vbm5tbW1ubm5ub25vb3BvcHBwcHBwcHBwiZCMiISDhIaDg4KCgYGCgoKCgYGBgYCAgYGBgoKBgYGBgYGBgIGBgH+AdG5vb3BxcXFwcG9vcG92dnVzcnFxcXFxcICDg39ycHBwcHBwcHBwcHFxcHBxcXFxcXBwcHBwcHBwcHFwcHBwcHBwcHBvcHBxcXBwcHFxb29vbm9wcHBvb29vcHBvb3BwcHBwcHBwcHBvb29vbm5ubm5ubW5ubm1ubm9wcG9vb29vb3BzcXWPj4yJg4KFh4ODgoKBgoGCgoKBgYKBgYGBgYGBgYGBgYCAgYGAgYGAf4B0b29vbm9vb29vb29vb3Z1dHNxcXFxcXJygIKCgXRxcXFxcXFxcXFxcXFxcXFxcXBxcXFxcHFwcXBxcXFwcHBwcHFxcXBxcHBwcXBwcHBwcHBwcHBwcHBwcHFxcXBxcHBwcHFwcHFxcHFxcXFxcXJxcnFwcnRycnR0dHR1dnRzdHR0dXd3gpCPi4iDgoaHhISCg4GBgYKCgoGBgoGBgYKBgYGBgYGAgICBgYCBgYB/gHVvb29vb29vb25vb29vdXRzcnJycnJycnKDg4OCdnFycnFxcXJxcnJxcXJycnFxcXFxcnFxcXJycXFycXFxcXFxcXFxcXFwcXFxcXFxcnNzcnJyc3V1dHR0dHR0dHV2d3d3d3d3eHh4eHd3eHh4d3Z3dnV2dnZ2d3h6e3x7e3t6enp6enyGkI2LiIODiIeHhYODgoGCgYKBgYGBgYKCgoGBgYGAgYCAgYGAgIGBgH+Ad3FxcXFxcG5ucG9wcG92dHV1c3Nzc3NzdYiDgoN5cnNzcnJyc3Jyc3NycnJycnN0cnJzcnNzc3Nzc3Nyc3N0dHV1dXV1dHV3eHd3d3d4eHh3eHh4eXl5eXl4eHl5eXp6e3t7e3t6enp5eXh3d3d1dnV2dnd5enp7fn5+fX1+fn5/f35+gIyQi4qHg4WIi4iEg4SDgYGCgYGBgoGBgoKCgoKAgYGBgYCBgYGAgIGAf4B8enp5eXx5eHh2dXZ2dHl2d3h3d3Z3dnZ6f3x+fnx2dnd3dnV4enh4eHh3d3d2eHx5eXx6eXl8e3l5eXh4eXl6enl5eXh4enp5eXh4eHh3dnd3eHh3eHh5eXp7e3p8fH1+fX9/f359e3t7e3p5enl5e3t/foB/fn5/fn19fX5+f35+fn6AjpCNioeEhoqLiIaGhIOBgoKBgYGCgYGCgoKCgoCBgoKBgYGCgYCBgIF/f4B/fn19fX9/f318e3t7eXh4eHh5eXl4eXh5eXl4enp6enp6e3t7fH1+fHt7ent8e318e3t7e3t7enl4eXh4ent6enp5eXp8fHt6enx8fHp6ent9fHx+fn+AgoGAgYKAgH9/gYGBgIB/f35+fn5/fX1+f4CAf35+f39+fn9/f39/gH+Af4OQjoyHhoWIi4yIh4aFg4GCgYGBgYKBgoKCgoKBgYKDgoGBgYGBgIGBgIB/goOCgoGBgX99f39/f4F6enh4d3h4eHh5eHh5enp5e358enx9fXt8fX19fHx8fnx9fn5+fn59fX9/f3x8fYGDgYCAf318fXx9fXt9fXx8fH19fX1+gYGChISDgoB/gYGBgH9/f4B/f39/f39+fn9/f39/f35+f3+Af39/gICAf4CAgICAhJCPi4eGhoiLi4mKhYaDgoKCgYGBgoGCgYKBgYGBgoOCgYCAgYGAgIGBgH+ChIKCgICAgH9+fn+AgH9/fn18fX19fYB/fX+Af35/gH9/fn9/gIGBgICAf3+BgICAf4CBgn9/f4CAf35+f39+f39/fn5+f39/gYB/f4CBgYCAgYOEgoGCgoGCgH+AgYCBgYGAgH+BgICAf39/gICAgYGBgIGBgYCAgICBgoGBgYCAgYGFjo6MiYaHiYyLi4qGhoOCgoKBgYGCgoOCgoKBgIGBgYKCgICBgYCAgYGAf4KFg4KBgYCAf39+fn+AfX5+fn19fX5/fn9/f35+fn+AgYCAgICAfn9/fn+Af3+AgH9/f35/f39+fn59fn9+fn9/f35/gIGBgoKDg4KCg4KBgYKDg4OCgYGBgYKBgoKCgYKBgoGBgYGBgoKCgYGCgYKCgoGBgoKBgYKCgoKCgYGBgoKCgoaPkY+KiImKjY6NiYaFgoKCgoKBgYKCg4KCgoGBgYGBgYF/gIGBgYCBgIF/gYWEg4KCgoGCgYCAgIB8fHx7fH18fH9+fn9+fn5+f35+f39/f39/f35+foB+fn5+fn9/f39+f39+fn5/gIB/gIB/f39/f3+BgYGCgoCAgYKDg4SDg4ODgoKCgoKCgoKCgoKCgoGCgoKDg4OCg4ODgoKCgYKCgoODg4ODgoKCgoODg4KCh5KTkIuKiouPj42Kh4SCgoKCgYGBgoKDgoKBgYGBgIGBgICAgYGBgIGAgYCAg4SDg4OEg4ODgoKCgXx9fHx9gn1+f4GCiIGCgoSCgYGDg4GBgYKCgYKBgYCAf39/gICAf3+AgX9/f39/gYCAgICAgH9/f3+AgICAgH9/gYODhYSEg4SDgoKCg4OCgoOCgoODg4ODg4SDg4KEhYWDg4SEgoKDhIOCg4ODg4OCgoODgoCKlJOPioqMjpCPjYuGg4KCgoKBgYGBgoOCgYGBgIGBgoGBgICBgYGAgYCAgH+BgoODg4SEhIOCgoKCfXx8fn6AgYOAg4OChIaFhoaFhIWFg4ODg4OBgYKEhIKDgoeDgoKAgoGBgoKCg4KCg4KDgoODgoGAgIKCgYOCgYKCg4OEhYWEg4OChISEhIOEhISDg4OEg4ODg4OEg4SDhIWEhISDg4ODgoKCgoKCgoKBgYKCgo+UlI+Njo6RkY6KiISCgoKCgYGBgYGCg4GBgIGBgYGBgYCBgIGBgYCBgICAgIKChIKChIOCg4ODgoJ9fX2AgH+AgoGDg4ODhIaEhIOEhYWDg4GBgoOBgIKDgYKFhYWFhoaHhoWGhoeHh4aGhoeHhoaEgoGCg4SDg4ODg4ODhISFhYWDhYSFhISEg4KBg4OCg4SEg4KCg4SCg4ODg4OCgoKCgoKCg4OEhIOFhYWFhoaIk5OTkI+Pj5KRjIqIgoKCgoKBgYGBgYKDgoKBgIGBgYGBgICAgYGBgICAgICAhISEgoKCgoGBgoKBgX+AgYOCgICAf4CCgoGDg4KCgYODg4SEg4KDhYOCgYGBgoSFh4eHh4aGh4eHiIiHh4eIiIiFhIOBgIGBgoKCg4GCg4SEhYSDg4OEg4OEhIOBgYGCg4OEhISDg4ODg4OEhIODgoSDg4ODhIWFhoeHh4eIiIiJiY6TkpKOj46QkY+LiYeCgoKCgoKBgYGBgoKCgoGBgIGBgYGAgICAgYGAgIGAgICDg4KCgYKCgYGAf4CBhYWFhoOCgYB+fn+BgoSCgYKDhIOCg4ODg4KChISDg4OBg4SFhISFhYSDg4SFhYKEhIWFg4KBgH9/gIB/gIGEg4OEhYWEgoKCgoOCg4OFhIKDhISEhYaGhoaGhoWFhoeHhYaIh4aHiIeGhoaIiYeGhYaGhoeIkZKSkI6QjpCRjImHhYGBgoKCgoGBgYGBgoOBgYGBgYGBgICAgICBgYCAgICAgISEg4KBgoGAgYGAgYKIh4aHhYSCgH99fX6AgH+AgYGBgYGBgoGAgYKCgoGCgoKBgYGCgYKCg4GBgICAf4GAgH+AgH9+gIGBgYKCg4OEg4OEg4OCgoGBgoODg4SEg4SEhIOFhYaFh4eIh4eHh4eHh4eGhoaGh4WFhYaGhIWEhIWEhYaSk5GOjo+OkI6JiYeEgoKCgoKCgoGBgIGCgoKCgoKCgYGBgYGAgYGBgICAgYGAgoSDg4KDgoGCgYKDg4iHh4iHhYSCgX5+gICAfn5+f4CBgYGCgYCCgoGCgH+AgIB+gIKBgIGCg4OAf39/gICAf4CAgICDg4KDg4ODgoOBgYKCgoOCgYKCgoOCgoSDhISDg4SEhYWFhYaGhoaFhISEhYWEhIWFhYSEhISDhISEhISEipSTkpCQj46NiIaFhIOBgYKCgoKCgYGAgYKCgoKBgoKBgYCBgYCBgYGAgICAgYGAg4OCgoOCgoKBgoOCiImJiYiHhYSDgYKEhIOBgYGCgoSCgoOEgoOEhYWEgoSCgX+AgoGBgoGChIOBgYGBgoOCgoGDg4SDg4SEg4OCg4KDg4ODg4KCgoKCgoGDhISEhYSFhYWFhIWEhIWFhYWDg4OEhISEhYWFhISEhISEg4ODg4OOlZKQkZGOjYyHhYODg4GCgoKCgoKBgYCBgoOCgYCCgYGBgICAgIGBgYCAgICBgICDhYSEhIODg4SDhIOGh4mIhoWDhIODg4WDgYCDgoOFhYODg4SDhIODhISFhISEgoGAgYKDgoKEg4OCgoGBhIWEg4ODgoKDhISDg4ODg4SFhISDg4KCgoKCgoSEhYSFhYWFhYODhYWFhYaFhoWEhIWEhYWGhYWFhIWEhISDhIODhJGUk5OSj4yMioWEhIODgYKCg4KCgoKBgYGCg4KBgYKBgYGBgICBgIGBgH+AgIGAgYaGhoaGhoaHh4aGhYSDhYaCgIGBgYGHgoB+f4GAgIKBgX+BgYCAgoGCgoKBgYKCgYCCgoKCgoKDg4GCgYKDhYODg4KDg4OEgoKEhIOEhIWEg4OCgoKCgYKCg4ODg4SFhYWFhIOEhYWGhYWEhISEhIOEhIWFhYWFhIODhIOEg4KGlJOSlJKPjYuHhISEg4KBgoODgoKDg4GBgoKBgoKCgYGCgYGBgYCAgYGAgICAgICAhYWFhYaGh4aGhoWGg4ODg4GAgoKCgYKAf35/f4CAf4B/gIGAgH+BgYGBg4GAgYGChIOBgYGBgYKBgYKDgoODgoOCgoKCg4OBg4SDg4ODg4OEhIKCgoKDgoKDg4ODhIWEhISEg4OEhIODg4OEhIODg4ODg4SDg4ODg4KDg4KDgouUk5KTkY2NioaDg4OEgoGCg4ODg4ODgoGBgoGCgoKCgoKBgYGBgICBgYCAf4CAgICDhISFhYSFhYWEhIWCg4KDgoKDg4OBgICAgICAgYCAg4KCg4KBgoKDg4OEgoODg4KAgICCgoKDgoKDg4ODgoODhIKCgoODgoKDg4KCg4KDg4WEg4ODg4SDg4SEhISEhYWEhIWEg4SEg4OEhISEhISEg4SEhYSDg4SEhIODgoKDkJSSkpKPi4yIhoOEg4OBgYKDg4ODg4OCgYGCgoKCgoKDgoCBgoGAgICAgIB/gICAgISDhYWEhYWFhYSFhYOEhIWDg4SFhIKCgoOCgoSCgYKGhYOFg4OEhISGhYSEhYJ/fX19foKEg4ODg4OEg4ODhISEg4OEhISEg4SEhIOEg4OFhoWFhYSEhoWFhYSFhoWGhoWFhYWFhYWFhYWGhoWGhoaFhoaGh4aFhYWFg4SEhIeTk5KRkoyKiIWFhYWCgoGBgoODg4OCg4KBgYKDg4ODgoKBgIGAgICAgICAgH+AgICAhYWFhYWGh4eGhYWFhISFhYSEhISEg4SDg4OEhYOCg4SFhYaFhoaFhoeHhoOBfn9+fn5+f4OEg4OEhISEhISEhISEhISFhYWEhYSGhYWGhYaGhoWGhYWHhYWGhYaGhoaFhIWFhYWFhIWGhoaHhoaGhoaHh4iIiIaFhYaEhYWGjZSTkpGQi4qHhoeGhIGCgoKDg4ODg4KDgoGBgoODg4KAgYGBgICAgICAgICAf4CAgICHh4eGhoeHiIeHhoaEg4ODhIODg4OEg4ODg4OEhIODg4WFhYWHh4WFh4WBf39/f39/f35/gISFhIWGhoaFhYWFhoaHhoaFhoWFhoeHh4iHh4eGhoaHh4eGhoaHhoaGhYSDhIWFhYSFhYaGhoeHhoaGhoeHh4eIiIeGhoaHh4eRk5KQkZCLiIiFhoSDgoKBgoODg4ODgoKDgoKCgoOCgYCBgICBgICAgIGAgIB/gICAf4aHiIeHh4eIiYmIiIODgoKDgoSEhIWEg4KCg4OEg4OCg4WEhYeHhYSCgH9/f39/gH9/f4B/f4WFhoeIiIeHh4eIh4iHiIiIhoaHiIiJiYmIh4aHh4eIiIaHhoeHhoaFhIOEhYaGhYWFhoaGh4eFhoeGh4aGh4eHh4eHh4eFh5OTkY+RkIuHhoWGhIKCgYGCg4ODg4ODgoKCgoGCg4KCgIGBgYCAgICAgICAf3+AgYB/hoiIiIiHh4iJiYmIg4KCg4ODhIWHh4eFg4OFhIODg4KEhISEhYSBgIGCgYGBgYB/gH9/fnt6gIaIiIqKiYmIiImJiYmKi4qIiIiJiYuLioqIiIeIiIiHh4iIh4iGh4aEg4OFh4eHhoWFhISEhYWEhYWGhISEhYWFhoWGhYOJlJOQjpGOioaFhoWDgYGBgoKDg4ODgoKCgoKCgoKCgYGBgYGBgYCAgICAgIB/gICBgH+GiYiIiYeIiImJiIiEgoKDg4KDhImKh4eEhIWEg4OFg4WEg4OCgYKCgoKCgH9+fH19fX9+fHt8g4eJi4uKioqIiIqJiImLiomJiImIioqJi4mHhoaGh4WGiIiJiIeGh4SDgoSIiIeIh4WCgoGDg4KDg4SCgoKDgoGEg4SDgY6TkpCPj4uIhYSGhIKBgYGBgoODg4OCgoKCgoKCgoGBgYGBgIGAgICAgICAgH+AgIGAf4WIh4eHhoeIiIiHh4SCg4OCgoOFiYqJh4WHhYSFhYSDhYSDgoKCgoKDgX59fn5+fn5+fX1+fX19g4eJioqHh4WGh4eHh4iHh4mGiIaIh4eJiISDhIOFhISFhYaIh4aFg4KCg4WHhoeGhoOCgoOEgoODhIKBgoGBgYODg4OEkZKRjo+Ni4eEhoaDgoGAgYGDg4ODg4KCgoKCgoKCgYGBgIGBgYCAgIB/gIGAf39/gIB/hYaGhYaGhoeHiIeGgYKEhIOChYaIi4qGhIaEgoaGgoCDg4ODg4OCgoF9fH1/gH9+fn59fH19fHp8hIaHhoSDgYODhIWFhYODhYSEhISEhIWEgoKDgYSEgYKDg4WGhYSCgYGCgoODhYOEhIWEhIaDhISFg4KDgYKDg4SFhIeSkY+Nj4yJhoSFhIWCgYCBgYODg4ODgoKCgoKCgoKBgYGBgYGAgICAf4CAgYB/gICAgICDhIWEhYWFh4eHh4aAgYGFg4OEhYSHiIWDgYCAgX9+fYKDg4ODgoKAfX1/gICBf31+fn19fX16enp+g4SEgoGBgIGBgoKBf36BgYGCgYOAgoGCgoKBg4OAf4CAgYOCgICAgIGBgYGCgYGChIODhYSCg4SDgoKBgoSDhYWGjJORjo+Pi4iFhYOChIGBgYGBgoODg4KCgoKCgoKCgoGBgYCBgYCBgH9/gIGBgICAgH+AgIKCg4OChIOEhYWGhn+BfoCBgICAf4GDgn9+fn9+fHx/g4OCg4KDgX19fn+AgIGAfn19fX1+fXx6enp/goKAf39/f35/f4B+fYB/f4CAgX+AgIF/f3+BgX59fX+AgX9/fn+AgH+AgICBf4CCgICCgYGCgYGAgYGBgYKEg4aPkpCOj42Kh4eGg4OCgYGBgYGCg4ODgoKCgoKCgoOCgYGCgYGBgICAgH+AgICAgICAf39/gYKDhIGCgoOCg4SFgIF/fH19fn19foCAfn1+fXt9foKDg4KCgYF/fX1+f4CAgH9+fX19fHt7e3p6eXqAgH9+f35+fnx+f35/gH9+f3+Af4GAf359fn9/fn18fn+Af35+f3+Af39/f4B/f4B+f4CBf4B+f39/gH9/f4B/hZKSj46Pi4uHiYWEg4KCgYGBgYKDg4ODg4OCgoKDg4KAgYKBgYGAgICAf3+AgIB/gIF/f36BgYSEgYKBg4OCg4OBgH98fn5/fn6Af4B/foB9fX+BhIOCgYB/f359fn5/gICAfn19fX17e3x6enl5eXt/f35/f39+fX5/f4CAf35/f4CAgoB/fH5+f35+fXx/f4B/fn5/f4B/f35/foCAf36Af39+fn5/f35+f318fH2FkpKNjIuKiImIhISEgoKCgYGBgoOCgoODgoODg4ODgYCBgYGBgYCAf39/f4CAgICAgIB/foCBhIOCgYGDhISDhICBgICBgIGAgYKCg4GAgX+AgoODgYGBgYCAfX19fn5+f359fX19fXx8fHt6eXl5eX2Af4CBgYF/f4GAf4F/gICAgYGCgoB+gH5/fn5+foGAgoF/f39/gIB/f39/gYB+f4CAfn9/fn+Af31+fX17fIaTkYyLioeHioiGhoSDgoGBgYGCg4ODg4OCg4OCgoKBgICBgYGAgH9/f39/gICAgICAgH9+fn+BgYGAgISGh4aHgoSDhYOBg4ODhYSEhISDgYODg4KCgoGCgX5+fX19fn6AfX19fX19fX18e3p6eXl5eYCCgoKEg4CCg4GAgoCBgYGDgoODgYGCgIGAf4CBg4GEgoCAgYCBgYCAgYCCgn+BgIF/gIB/gICAfn9/fnx8ipOQiomIiIiJiIaGhoSCgoGBgoKDg4ODg4KDg4KCgYCAgICBgYGAf39/f4CAgICAgIGBf359fn5/f39+g4aHh4iChYSFg4SFhIWGhoaGhoWFhoGAg4ODgoKAfX19fX19fn59fX19fX19fX18e3l5eXl4fIKDhIWCgYSDgoKDhYaCg4SDgYKCg4OCgoKCgYKFg4iFgoGBgYKCgYGBgYSDgoOCgoKCgYGBgIF/gIGAf36Ok4yHiIeIh4aGhYaGhIKDgoGCgoODg4ODg4OCgYGBgH+AgYCBgYB/gH9/gICAgH+AgYB/fn19fX5+f36Ag4SHiISGhoaFhoaHh4aHh4eHhoeHf32AgIGCgX59fX19fX19fX19fX18fH5+fnx7eXh3eHl5gIODf4ONhIOEhISXl4ODhIF9foGCgoGCgYKBg4aIjIWDgoKBhIKEg4KDhYWEhYOCg4OCg4OCgoKCg4OCgpKQi4iIh4iHhoaEhoWEhISCgYKCg4ODg4ODgoGBgYCAgICBgIGBgH9/fn+AgYCAf4CAgH9/fn1+fn+Bf4CCgYWFhYaGh4eGh4eIhoeHh4aHh4d/fH18fX9+fX19fX19fX19fX19fXx7iJKCe3x6fIZ5eHl8gYF+iZeEg4OEhJSTgIGBf39/fn6Ei4B/gICEhpCJhYSCgoGFhYuDgYKFhYaGhIOFhYOEhIODhIOFhISIko6LiYiIiYeHh4WGhYSFhIKBgoKDg4ODg4OCgYGBgICAgIGAgICAf39/f4CAgICAgYGBf39/f4CAgIGBgYGBg4OGh4aGh4aGiIeGhoaFhISGhX98fHx8fX18fH19fX19fX19fX18fH+RlZaDe3qElHx4eXp7fH+Cg4GBgIOCgH58fn57iJF8fI6Wf31/f4KGioWDg4SDgYONiX9+f4OEhYWDhYaFhIWFg4SFhYaEhI6Rj4uKioyJiYmHhYaFg4OCgYKCgoKDhIODgoGBgICBgICAgYGAgIB/f3+AgIB/gICAgX5+f4GBgoKCg4SDgoOCgoWGhISFhYSGhIOEg4KBgYOBf319fHx9fXx8fH18fH18fX19fHx8e4uRl4x6e3yBenp6e3x5eX19foB/gH98e3t+fn2ClZF/hIh+fH5/goR8fIGChIKAf4eDfYKBf4KCgIODhISEhISChIOEhYKEkZGNi4yMjoqJiYWFhYODgoKBgoODgoKDg4KCgYGAgIGAgICAgICAgH+Af3+Af357gICBenyAgYKDhYODhYWFhYODg4SCgYODgoOCgoGAgIB/gX5/fn59fHx8fHx8fHx8fHx8fHx9fHx8fn6Kgnt6e3p4ent7fH17fn1+f319fX18fH+BgX2Gj4F+fYJ+f36Agnx8f3+BgIKAfnx7ioJ9gH9+gYCAgYKBgoCAgIGAf4uTj4uLjY6NiIeHhYWEhIOCgoKCg4OCgoODgYGBgICAgICAgH9+fXx7fHx9f3+AgHx6gYF4e4CCgYOFhIOFhIaGhISAhpSIgIGBgYGBgH9/f39/fn5+gHx8fHx8fHx8fHx8fHx9fHx8fHx8fHl7e3t4eHl7enp8gX+Afn+BfH5+f399gIKCgICAgX+CkYF/f4CAfoB+fn9+gIGBfX19e319fXx9fHx9gH+AgH6Afn6ClJGLjI2Nj4qFhoaFhISFg4ODgoODg4OCgoGBgYGAgICBgICAf4CAf39/fXt6fICAgHh+gXd7gIF/gYKCgoKDhoeGhn6IlYp+gYGAf4B/foB+f39/fn+Bfnx7e3x8fHx8fHx8fH59fHt9fHx8e3x8fHp6eXt8en2Fg4J/gYF+f35/gH6FgoF+gH9+foCFhoKAfn6Dh399fH6AgIGAf39+fX19fX57e31/f3+AfX9+gIyRjYuMjY2Nh4SGhoWEhISDg4OCg4ODg4KBgYGBgYCAgYGAgYGBgYGAgH9/f397en9/e3mAd3p/f31+f3+Af4KDhoaFf3+FgX5/gIB/gH5+f35/gIB/gIB/f319fHx9fn18fX19fX19fH58fXx7fXx8ent6fH19f4aEgoCAgX1+fX5/fouEgYZ+fXx8f36CgX99fX19gHx7fXx+gYSDgYB+fn5+fX1+f399foB+fn6EkoyLi46Mi4qGhIaEhIODg4OCg4KDgoOCgYGBgYGBgYGBgYB/fXx8fH1+f39/f397e399d352eH59fH18fX5+gYGCg4B6fX18fn+AgH6Af35/fn+AgH+AgH9/fn9+fn5+fn1+fn99fH59fn19fHt8fHx6e3p9fn+Ag4OCf35/fH18fXx8gYN+jH58e3t9fn1+fn17e3t9e3p7e3uAhoSChIOCf4B+f4KCgn9/goJ/gIqPjIqKjIuKiISEhIOEg4ODgoKCgoKCgoKBgYGAgoGBgYKCf3+AgIB/fn18fH5/fn55fX52e3Z4fXx8fHt9fX6BgICAf31/f31+f39/foB/f39/f3+AgIGBgH99gH9/fn9+fn9/f3yCfn59fX17e319fHp8fH6AgoF/gIB8fH18fHx8fH18fXt/fnt7e3x8fH18e3t7e3x8enp9en6CfoGDhIKBgoGFhoWFhoaHhYKEkY6MiomKh4eFgoOEhISEg4KCgYGCgoKBgoGBgYGBgoGBgoKAgYKBgYCAgH9+e3x+fnx6fnh5dnd8fHx7e318f4GAf35/foB/f35/fn5/gH9/f39/f3+AgYKAfn6BgIB/f39/f39+fYN8fH19fH99fX19e3x+fn9+fn1/fnx8fHx8fHx+fnt8e3x8fHx9fH18fnx9fHx7enx5e3x7e317fX5+f4CAg4eJiYmKiYqJhYiRjYuHiIaFhYOCgoOEhIODgoKBgYGBgYKBgYGBgYKCgoGCgoCAgX98e3p6eXt9enx+fnl8eXh4dHx8fHt8fHx+gX9/f39/gIB/fn5+fX+AgH9/f3+Af4CDgoB/gIGAgIB/f4CAgH58enx9fX59fX5+jIZ9fX57e4OCfX19fX18fXx9fX1+fH17fXx9fX58fn19fX18e3t6fHt8fHt6e3t6enp7fn6ChYiHiIqLi4qJjJCNjIiIhoWEg4KCgoODg4OBgYGBgYGBgYGBgYGCgoOCgYKBgIGBf3+Af356eHl5en5+e3l6eH5zfHx8e3x8fH5+fn5/gH+AgIB/fn9+gIF/f4B/gIGAgoSEgYCAgYGAgX+AgYKBf39+f31+gH57foGRjHx9f4qAjYx+fn19fX59fX59fHx8fX18fXx9fX1+fX1+fnx7e3t8fH18e3p7fHl6eXh5e35/hIOEh4mKiImNj4yKiIiFhISDgYKCgoKDgoGCgoKBgYGCgYKCgoGCgoKBgoKAgYGAfoCAf39+e3p5e319eHx6f3KBfXt7fHx8fn59fYGBf4GBgX9/gH+AgX9/gIGCgYGFg4SCgYGCgYKCgICBg4KAf4F/fX6Afnx+f4iCf36DkISEg4F/fn18jYd9fX59fHx/fnx9fXx9fX1+fX5/fX19e3x9fnx8e3x9enp5eXp5e3t+foCBg4eEiI2MiYmGhYSEg4KCgoKCgoKBgYGCgoKBgoKCgoKCgoKCgoGCgn+AgIB+f39/fn5/ent5fX16enp9cX6Cent8fX19fXp4f4KAgYKCgICBgIGBgICBgoKCgoaFhIGBgYGBg4F/gIKEgX9+gYB9foF+fX5/gIB9fn+EgH5+f31+fX2KhX1+f31+foB/fX19fH5+fn99f4B9fX18fX9/fHx7fH17e3t6enp7e3x9fn2Ag4CJjImKh4WFhYSDg4KCgoKCgYGBgoKBgoKCgoKCgoGBgoKBgYKCf4CAgH9/f39+fn59eXp6fXx5d3t0e4d8dHd9fn17e3Z2foCBg4KBgYKCgoKBgYGDg4OChYaEgoCAgICCgX+AgYSBfn6AgH1+gH59fn6AgH+Bfn+Af39/gH99fn9/f3+Afn9/gH58fX18fn5+foF/gH2CgHx9gIF9fHx9fXx8e3x8e3t7fHt8fHx9fImJh4eFhoWFhISDgYKBg4KAgIGCg4KCgoOCgoKCgoGCgoGBg4J/gIGAf39/fn5+fn57enp8fHt2e3R3f352cnt+fnt4dnd8gIGCgoKBgoODg4OCgoSDhIOFhoOCgX9/gIOAgICAg4F+foCAfX+AfX1+foCAf4J/gYGAgICBf31/f3+AgIGAgIB/fnx9fX19fn59g32AfoKAfX6AgX98fn59fX17fH58fXx8fHt8e3x+iYWGhIWHhYSFhIKBgoGDgYCAgoKDgoKCg4ODg4KBgYGBgYGCgH6AgYB/fn5+fn5+fn56e3p9goN9dXF6fHpxen19eXh0dICAgoKCg4KDhYOEg4KDhISEhIWEgYGAgH6Agn9+f36Bf35/f4B9foB9fX1+gH9/gYCCgYCAgIKBfX6Af4GAf4CAgH9+fX19fn1+fn19gYR/gH9+f4GBf32Af319fn1+fn1+fHt8enx7eoCFgoOEhYSEhIWDgoKBgYKBgICCgoOCgoOEg4SDg4KBgYKBgYOAfoCBf35+fn5+fX5+fnt7en6Jh354cnl9f3F6eHt4eXR1fYKDgoODg4OFhIWEg4OEhIODhIKBgH+Af4CBfn19foB+fn5/gH19f3x9fX6Af4CAgIKAgIGAg4F/f4B+gIF+gIGAgH9+fn5+fn1/fn6FhYCBgH+Ag4F/foGAf36AfoB/fn17ent6fHt6goN/goKCgoOCg4KBgYCAgoGAgIKBg4KBg4SDhIKEgoGBgoGCgn9+gIF/fn1+fn5+fX59fXp7fIWEe3tzeXt8cHd1dnd5dnR6hISBhISDhIWFhoSDg4WEgoODgoCBfn9/f4B9fX1+f31+f39/fn1+fH19foF/gIB/gIB/gIGDgoGAf36AgH+AgYCBgH9/f39/f4CAgIGCgoKBf4GEgX+Ag4F/f4B/gX+Af3x7e3p8e3yBgH+Bf3+BgIKCgYF/f3+BgH6BgoKDgYGDg4KEgoSCgYGBgIGCgH6AgH9/fX5+fX19fn19e3t6gH94fHZ5enxxdHh3dnh1cnmFhYKEhIKEhYWGhISChIOBg4KAgIF+f4B/gHx9fX6AfX5/f39+fX98fn5+gX+Bf39+f4B/gIODg4B/f4GBgIKBgYGAgIGAgIB/gIGAgYKDgYF/gISBfYGDhICAgX+BgYKBfXp7e3x8fX99f4B8f39+fYGAgH59fYB/foGBgYKBgIKCgoKBg4KCgYB/gYKAfn9/fn99fX1+fX19fX19ent7fHZ9eXh6enJ1eXl2d3dzdYaFg4WFgoSEhYSEhIKDgoGDgX+AgX5/gH6AfX19fn9+f4B+fn99f3x/f3+BgIF/f3x+gH6AgYKDgYCAgoOEgoGAgYB/gYCAgYGAgYGCg4KBgX9/g4B+goKEgICCgYKChIF+e3t8fHx9fX1+fXp+fX55fn9/fHx8fn1+gYCBgYGAgoGBgYGDgoGBf4CAgoB9fn19f319fX59fH19fX16e3p8dnx6d3t4cnZ5e3Z2dnN0hoSEhYSChISFg4OCgYOBgYOBgIGBfX+BfoF9fX1/f39/gH5+f359fYB/gIGBgX9+fH5/fn5/gYJ/gYGCg4eFgX9/fn6Af4CBgICAgIKCgYCAfoCCf36BgoKBgYOCg4OFgn99fX18e3x8eXp7en55fHl4f357e3t+fX1/f4F/gH6BgICAgoOCgYF/gIGBf31+fH1+fX19fX18fn58fXx5e3x4enx3endzeHd6c3Z2c3SGhISFg4KDhISDgoKCg4GCgoGAgYF8gIB+gH1+fX5/gICAf35/f3x+gH+BgIGAf359f39+fn+BgH2AgIGDhIN/f359fn5+f4B/gIB/gYKBgH9+f4F+f4CCgoCBhIKEhIaEgH59fHx8fHp5dnl5enl2eXZ+fHt7e358e399gH99fX9/f3+BgoGBgX5/gYF+fX18fX19fX19fXx+jYF8fXl7e3p5fHd4eHR1dXhyd3d0doaEhIWDg4ODg4OCgYKDgoGDgn+BgH9/fn+AfX19fX+AgIB/f4B/fIB/f4GAgYCAf3yAf35+fn9/fX5+gYGCgn5/fn1+fn5+f3+Af32AgYB+fn5/gX5+gIKBf4GDgoOEh4SAgH58fXx8e3x1eXl4eHh5d3t8e3p7foV9fn1/ent+fn59foGAgIGAfX6BgH59fXx9fX19fX18e32Dgnx8ent7e3p7d3Z4dXJzdnF3eXJ4hYWFhYOEhIKCg4KBgYKBgIOBgIB/fn5+foB+fX58foCAgH+AgX97gH6AgH+BgYB/fYB/fn5/f319fX6AgYGBfn9+fn59fX1/fn9+fH6Af35+fn+Cfn6AgIF/gYOCg4OGhICBfnx9fHx7fHh3e3h1eXd3eXx6e3t9kod9fH13en1+fn19f35+gH98foB/fn19fH19fX19fXt8ent9enp4e3x6ent4dHh1cXJ0cHh4cXmEhYWFg4SDgoODgoGBgoKAgYGAgIB9fn5/gH18fn1/gIGAf3+BgHyAf4B+f4GAf399gH9+f39+fX18gICAgIB+f35+fn18fn9+f358fYB/fn1+gIJ/foCAf36Bg4KCg4WFgoJ+fnx7e3x8eXd7eXd4d3d4e3t6e3yFin17end6fH19fHx9fX1/fnx9fn59fXx8fX5+fX18fHt6enx7e3p5enp7enhzd3VxcXNweHdxe4WGhYWDhYKBg4OBgYGBgoCBgICBgH5/fn9/fXx+fYCAgoGAf4GAfX6Af35/gX+Af3+BgH+Af31+fH1/gICAgH9/f35/fXx+f39/f319f39+fn6CgYF/gIB/foGDgoKEg4SCgn5+fHx6fHt7eXt6d3N2d3h5e3p7eXp/fnt7d3p8fXx8fH59fH19fH19fXx8fX19fX99fXx9e3l7fHx8enp6enp6eHN2dXBwcm93dnJ7hYeEhYOEgoGDgoKCgYGCgYKBgYGAf4B/f399fX9+f4CBgYF/goF9foF+fn+Bf4B/gIKAgIB+fX58f3+BgICAf4B/f4B+fX5+f4B/f39/gH9/f4J/gH9/gIB/gYGAgISBgoKAf39+f3x9fn56fYR+dHx9enp6enx5eXp6hoV3eXx8fHx8fXx8fHx8fX19fHx9fX19fn19fX16eX18fH16enp6enp5c3V1b29xb3d0c3yFhoOEgoOCgYKBgoKCgYKBgYGBgYCAgICAgH59gH+Af4GCgn+CgX+AgX5/gYB/gICAgn+Bf319f35/f4KAgICAgIB/gIB+fn1/gH9/gIB/f39/gH+AgICAgH+AgYCBgYGCgYCAf39/fn1/fnuBkox6fH18e315e3p6eHmBgXh5e3x8fXx8fHx8fHx9fX18fH18fn1+fn59fHp8fHt8fXt5enp6eXlzdXVvb3Fwd3N0fYWGg4OCg4KAgYCCgoGAgYGBgYKBgYCAgIGAfn6Af4GAgYKCgIKCgICCfoCBgX9/gX+BgIF/fH6Af3+AgoCAgICAf3+AgH9+fX6Afn2AgIB/f3+AgICAgYCAf4CAgYCBgYKCgICAf39/fX5+fIGGiXx8fnt7fnl6e3p7jX53d3l7fHt9fHx8fHt9fH19fX18fXx+fn5/f358enx9e319e3l6e3p5eXN0dW5zcXB4cnV6hYaDg4KDgoCAgIGCgX+CgYKBgoGBgYKAgYF/fn9/gYGCgYKBg4OAgYJ/gYGBf4CAgIB/gX99f4F/gICBgICAf4B+gICAf359f4B+fn+Af39/gH9/gICBf4CBgH+BgIGCgoKAgICAgIB9foB9gIOCe35+e3x9e3p8fHuHeXh4eXx8fH17fHx9fX18fH19fn19fX5+f3+Af317fH18fHx7enl7e3l5c3J1bnZycHhxdXaFhYOEg4KCgICAgoF/gIKCgoKDgYGDgoCCgYB/gICCgoKBg4GEhICBgX6BgoF/gICAgH+Cf36AgYCCgICAgIB/gH+AgIB/fn2Af39/f4GAgH+AgH+AgYF/gICAgIGAgYGBgoGAgYCAgH9/gH5/fX59fn57fXx9e3x8d3h1eHh5e3x8fXx8fHx8fX5/f39/fn19fn9/gIGAf3x9fHx9e3p7eXp8eHpzcnVud3FxenF2d4WFg4ODg4KBgYKDgH+CgYWDg4SBgYOAgoOBgYCAgIKDgoCCgoWDf4GAfoKDgICBgICAf4CAf4GBgIKAf4CBgH9+gICAgICAf4CAgH+AgICAgIB/f4CBgYCAgICAgYGAgoKCgoCCgYGCgYB/f4B/gId+fnx6fXx7fX54d3Z5eXl8fXx8fXt8fH19fn5/gIGAfn1+gICAgoGAfH59fX58d3t6ent5eXNxdW53cHV6cXZ5hYWCg4KDg4KChISAgIKBhoKEg4GChICEg4KCgICCgoSBgYKChIJ/gIB/gYOCgYCBgYCAf4GBgYGAg4F+gIOCf31/goGAgIB+gYCBf4CAgYGBgYCAgIKBgYKBgYCBgYGBgoOCgoOBg4OCgYCBgH+AhH19fXx/fXp9gHp5dnp4eXt7fH19e3x9fX19fn+AgYGAgH+AgICDg4B9f35+fn15eXt6enp5c3J1b3dxd3lzd3uFgoKDgoOEgoOEg4CAgoOGg4ODgoKEgYSDgYKAgIKBg4GCgoGCgX6BgICCgYKBgYOBgICAgICBgoGEgH6Bg4F/f4CDgoCBfoCCg4KAgYGBg4KDgoGBg4KChIGAgYOBgYKEg4OEhIODhIODgYGBgYCCf4B/fYB8enx/e3t3fHl5eXt6fX59fHx8fH1+fn+BgYCAgIGBgYSEgH2Af39/f357e3t6e3p0cHhyeXR2eHR3e4SCg4KDg4SChIODgYKChIaEgoODg4SBhISAg4CBg4KCgoKCgIKAfoGAgIKBgoGCgoKBgIGBgYOCgoOAfoGDgX9/gYSEgYN/goKBg4KCgoGEg4OEgYKEgoOCgoGCgoOBg4SDhISEhISFg4SCgYOCgoOBgYGAgH58fIB8fHh8eXp5enx9f3x7fHx9fX18fICAgICAgYGBgYKBfoGAgICAf3t7e3p6enVweHd5dnV8dXZ8gICDgoODg4OEhISAgoKFhISDg4KDhIGEhYKCgYKDg4GCgoKAgYB9gICBgYKDgoKCgoGAgYKCg4KCg4B/gYOBgICChIODgoGCgoGDgoKDg4ODg4SAgoSDg4OBgX+Bg4KDhYKEhISEhISDhISChIOEhIKBgoGBgHt+gX59eXx6enp9fHyBfXp8fH19fHp7fn5+gIB/gYGAgICAgIGBgIB/fX18fH18dnJ2eHh2dH92dH2Hh4OChIWDg4SFhICChIWEhIOCg4SEgISFg4KCgoODgoOCgoCCgH2AgIGCg4KCgoKEgoGCgoOEgoKBgICBgoGAgYOFhIOCg4CCgoOCg4ODg4OEg4CCg4KEg4KCfoOBgoSEgoODhISEhIOEhIOEg4WEg4ODgoKAe4CBf3x8fXp6e31/fX9/fHx6fH59fH19fn5/f39/gICAgH9+foCBgICAfnx9fX5/fn18e3h2f3V2f4SHg4KDhYODhIaEgYKFhoWEhIODhISChIWFgoKDg4SCg4KDgoKBfoCAgoKDgoODg4SCgYKCg4OCg4GBgYGDgX+ChISDg4KEf4KEg4ODgoSDg4SCgIOEg4SDg4KCg4KChIOCg4SEhISEhIWEg4OEhYSEhIOBgoB9gYKAfXx8e3x8gH19foB+fn1/fnx8fH19fn5/fn+BgYGBgH99fX6BgYB+fn19fX59fX5+f3+AfHyAgYKCg4OGg4SDhoSBgoiHhYSDg4SEhYGFhYWDg4SDhIODgoOCg4F+gYGDg4SCg4OEhIOCg4KEg4ODgoKDgoOBf4KEg4ODgoOAgoWDg4ODhIODhIOBgoSEhYOCgoODg4GEg4GDg4SDhISEhYSEhIWFhYWEg4ODf32BhIB9fXx8fHx/gX59fn9/fX99e3x9fX19fX5+f4CBgIGBgH59fH6Cf39+fn5+fX1/f39/gICAf4CEhIODhIWDhIOFf36CiouFhISDgoOFgYaGhoOEhISEhIODg4OEgn+BgYODhYSFhIWEg4KEhISFhIODgoSDhYGBhISFhYaEgoCDh4SDg4OFhIWFhIGEg4OHgoOCg4GCgYSDgoODhYODhYWEhYWHh4aHhYSEhYSBf4GDf359fH59fX+BgH9+fHx+f358enx9fX19fX5+fn9/gIGBf319fIB/gH5+fn5+f3+AgYGBgYKAgYWFhIOFhIKEg4aAgoWFi4mEhIOEhYWDh4aGhISEhIWEhISEg4SDgYKDg4OEhIaEhYSDg4SEg3yDhHuBhHd5g4F9hH5+cnWDgoF2foOEgX2BdYF5g39/gH6EhIKDg4KBg4SDg4SFg4SFhoSFhn2EeXx+f4N7hYOAhIOAf319fn19gYOBfXt/fX6Afn18fHx9fX19fH19f4B/gYJ/fX18f4GBgICAgH+BgYGCgYKDg4KChoSEhIaEgYOEhYOEhYOKiIWFhYOFhYSGhoaDhISFhYWEhYWEhIWCgoOEhYWFhoSFhIOEhYWCaICFanx7cXF8gXOGc3R0fYKDdXNxg4Z0cHVyc3SDdnt9dYF/goOBgnZ5hYCDgIR/hYSChYWCaHpyc3N8f3OCg3+Dg32BfX1+fX6Cg4F8f4F9f4B9fXx8fHx9fHx8fn1+gH+BgX99fX2AgYKBgYGBgIGBgYKBgoKCgoSHhIWEhYSBgoSGhoOFg4aIhoaFg4aGh4eGh4OFhYaFg4KFhoSFhYODg4SEhoaGhIaEg4SFhn1xe4FweXZ+g3+CbnlwdXN8dnl5hXKEg3B2eHF2dHR1cnN0dml/gG5yb3R2bnVsd217c26AiHltfXJzdnN2bW14bHB5bHV9f359foGAgX2Afn2Af4B/fX18fHx9fH1+f32Af4CAfnx/foCBgoCBgICAgYCAgIKDgoOEhYiGhoCChYODhIeGg4WFhYaHh4SDhoeIiYaHhIWGiIeEg4WGhYWEhIOFhIKFhoaFhoWEhoWHdnB0e3BydX+HhYNtdW92b3x1coR5eYd4cXR3bndod3pucHaCcoN+b3p5eW1vbnpvb213fXiGcHF6cHJ0ZoF1fm57eXNveX+Af319gX9/fH99fIF+gIB+foCAgYB+fn9/foF/gH9+fYB9f4CBgIB+fn+BgH9+goOCgoSFh4eEfoeEg4OFh4aEhoWFhoaIhISGh4eIhoeEhoaLioWEhoeHhYOFhYWEgoWFhYWGhoWGhYZxdXByc29zenl+hHSIdHV+iHZugnKEhnluanJ/cW1zd3x/dXR8hH54cXV3bnl1enF2eHV6eYRxam95eHBreXN6b3p3dnZwgYB/fn5/f356fn19f31/f359gIGDg4CCg4GBhIKBgIGBgH1/f4F+f35+f4GAfn6BgoCAgYSHhoODhoSEhYaHhoWFhYWGhoiFhYaFh4eFhoSGhomIhYSJioiFhIaGhYWDhYWEhYaGhoaFg3iLeXKIentwcIWEeIV4eWtzfnl7a3KDh4N6fG17eXl0fYB2bm+AgG90fHV3cXl9fW1+dW+DhYZ6gHJye3x1cG96bHN8bneCgIF+fn99fXt9e3x9fX9/fn1/f4KCf4GDgYGDgYB/gICAfn9+f31/fn1/gH58fYGAfn6Ag4iFhoOFhYWFhoeFhYWFhYeHiIaEhoWHhoaFhIWFhIWFhomJh4aEhoWGhoWGhYSGhoeGhoWGh4eHhoaEhoWGh4iHhYeGhoOHhoWFg4SFhoWGhIaEg4SEhoSEgYODhISFhIWEhYSGg4aHhYaEhIWHhoSEhYaEhX13hYOEhIKCgX1/fnt8e357fHx9f359fH59gIB9f4F/f4GAfn5+gH5+f35+fX99fX5/fHt8f358fH+BiYaFhIaGhoWHhoWFhYWGhoeIhoSGhYaGhYWDhIWGhYSGhoaGhYWGhIWGhoaGhYaGh4eGhYeIiIiIhoSHhYaGiIaFiIeIhYeGhoiFhYaHhYaGhYOChYWGhYWDhYSEhIWEhYWEhYWEhoeGhoWEhoeGhISEhYOFhIKEg4OFg4OCfYB/e3t8fXt8fH1/fnx8fn1/f31+gH5+gH99fXyAfX5+fn5+f3x8fX57fHx/fHt7fn+Ih4SEiIaGhoeGhYWEhoaGhoiHhIWGh4aFhIODhIaFhIeFhYaFhYaEhYaGh4eFh4aJiIaGiIeIiYiFhIiFhoeGh4aIhoeFh4eGh4WFhoeFh4aFgoOFhoaEhIOEhIOEhoSFhYWGhoSGhoWGhYSGhoWEg4SEg4WHhYOCgoWDhIF+gIB8e31+e3x7fX59fHx+fX5+fH9+fX1+fn19fH98fn58fYGAfHx8fXx8fH56e3t9foiHgoWIh4eGhoaGhISGhoeGiIaDhISGhoSFh4OEhYSFh4SFhoaFhoSGhoeHhoaHh4mIhoaIh4iKiIWHiIWHh4WHhoeGh4WIiIeHhYaGh4WGhoWBhISFhoWFhISEg4SFhYaGhoWGhIaFhoeFhYaGhYSChIOChIeDhIGChISDgYCAgHt7fn18fHx9fXx8fH19fH18fn18fX18fHx9fXx+fXt8gX99fH18fnx8fHp6fHx9iIeChoiHhoeGhoaDhYaFhoaGhYOFhIaFhIiJg4GEg4SGhIaGhoaGhIeHiIiHh4eIioiGh4iHiImIhYiHhYeGhoeHh4WHhoiIh4eFh4eHhYaHhIKEg4SGhYeFhYSDhISFhoaGhoaGh4WFh4WGhYaFhIKEg4ODh4GDgIKDg4KCgn+Ae31+fXt8fH59fH19fH17fHx8fHx8fXt7e318e358e3x/fX18fX1/fXx6ent7fHyIh4KGhoaGh4aGhYOFhoWFhYWEg4WChoSDiId/enqChYaEhoaFh4aEh4eJiIiHhoiKh4aHh4aIiYeFiIeGiIeGhoeHhYeGiIiHhoWHhoeGhoeDg4SEg4aGh4WFhISEhYaGhoaGhYaHhoaHhoaEhoWDg4OCgoOGgYN+goKDgIODf398f35+fHx9f318fX18fXp7e3p7fHx8e3t7fnt7fXt7e358fHx8fX5/fXt6fHp8fYmHg4aFhoWGhoWEhIWFhYWFhIOBhYGGhIKEhHyAhn+ChYWGhYWGhYSHh4iIiIaFiYqHhYeGh4eIh4WIhYaHiIaGh4eGh4aIiIeFhoeGh4WFh4OEhoWEhoaHhoWFg4WFhoaGhoeFh4aHhoeHhYSFhYOBg4KAg4WCg36BgYF/g4F/f35/fn98fH1/fXt9fXx9enp7eXt8fXt7e3t+fHx8fHp7fXx8fHx+fYF8e3t7e3x7iYeEhoSGhIaGhYSFhoWEhIOEgoCDgYWDgYJ/eoSMe4CEhYeGhoaFhIeIh4aHhYWHiYeEh4WHhoiGhYeEhoeJhoaIh4eHhoeIhoSGhoaHhoWHg4SFhIaGhoeFhYSDhYWHhYeGh4WGhoaFhoaEg4SFgYGCgYCDg4OCfYGBgH6DgX5/f4B8f3x9fX59e359fH15enp5e319enp7e318fXx8ent9fHx9fH5+gHx7e3x+fXyIh4WGhYaEhoWFhYWFhYODgYOBgIKBhYKAgH9/fXx7gYSFhoaEhYSDh4eGhoaFhIaJhoKGhIaGhoWFh4WHiImGhYiHiYeGhoeFhIaFhYaFhIeDhIWEiIaGh4WFhIKGhYaFh4aHhIaGhoaFhoODg4WAf4GAgISAg4B8gYB+foKAfYB/gXx/fH1+fX57fn18fHl6enl6fX15enp7fHt8e3t6e319fH18fn5+fHt7fX59fIeGhYaGhoWFhYSFhYSDgoGAgoGAgICDgX5+foB5en2Ag4OEh4WEg4OHhoOEhYSChYiFgoSDg4WFhYWHh4aIiIWFiIeJh4aFhoWDhoSFh4OEhoSEhYSHhoWGhYaEg4aFhoaGhoaEhYaGhYWGgoKDhH9+gICAgX+DgHuBf31+gn5+gH6Afn99fX59f3t/fXt6eXp6eXp8fXl6ent7enx6e3t7fH19fXx/fn18fH1/fnx7h4WFhoaGhoSFhIWDhYKBgICAgYB+f4KCfX1/f3t/f4KDg4WGhYSDgoaDgYOEgoCFh4WCg4GBg4SEhIaGh4iHhYWIhomHhYOEhIKFg4SGgoOFhISGhIeGhYWFhoOEhYSFhoWGhIOFhIWDhYWBgYODf35/gH9/f4N/fIB9fX+CfYCBfn6Bfn19fX1/e398e3p5enp5enp8eXp6e3t7fXp7e3t7fX59fYB9fXx8fYB/fXyGg4aGhoaGg4SChYKFgYGAf3+AgH5/gIJ8fn9/foCAgoKChIWDgoGChIGAg4KBgISFhYKBf4CCg4OEhYaIhoWEhYeFh4WFgoOCgYOCgoWBg4WEhYaEhoaHhoaFgoSEg4SGhYWDhISDhIOFhICAgoJ/fX1/fn6Ag357f3x8gIF9gYB9fYN8fn59fX57fnt7enl7enl6ent5enp6e3t8ent8e3t+fn1/gXx9fHx9f4B+gIaEhYWEh4SDg4KGgoOAgYB+fn+AfX9/gnx9f39+fn6BgYKEg4KBgYKCf4CBgoCAgoWEgoB/gIGCgYOFhYeFhISGhoSFg4WBgoGBgoGCg4GChISEhYWGh4eGhYSDg4ODhIaFhIGDgoODhIODgH+AgX59fH5+fH+DfXx+fHyBgH6Cf31/gnx/fn19fHx8e3t6enp6eXt6enp6enp6e3x5e317fH5/f4GAfX59fX1/gICAhoSEhYSFgoOCgoSCgoCBgH59fn9+fn6AfX2Af35+foGBgoODgoSHgYF+gICBf3+ChIOBf35/gIJ/goWEhoSCg4WFgoSBg4CBgIGBgYKBgIGEg4OGhYWHh4WEhYWCgoKDhYSCgYGBgoCFg4F/foB/fnx8fn18foN9e358fYF/gIN+fYCBf35/fXx7fH17e3p6enl5e3l6enl6ent7e3p7fXx8f3+BgoB+gH+AgH+AgYDKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzNzc3Nzc3Nzc3NzczMzMvLy8vLy8vLy8vLy8vLzMvLy8vLy8vLy8vLy8vMzMzMzM3Nzc7Oz8/Pz9DQ0NHR0dLS0tLS0tLT09PT0tLS0tLS0tPT09TU1NTU09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tLS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1dXV1NTU1NTT09PT09PT09PT09TU09PU1NTU1NTU1NTU09PT09PS0tLS0tPT09TU1NTU1NPT09LS0tLS0tLR0dHR0dPHhnNlYFtLWWdVTUZIQD03Nzg5Nzw8PDo8Oz42Oj04PDs6OTg3ODs7Oj87PTs8PD47P0E/QkJBQ0RFREE+PTw7QENDQUBDQ0FBR0hHSUtSwtXS09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXVysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMy8vLy8vLy8vLy8vLzMzMy8vLy8vLy8vLy8vLzMzMzc3Nzc3Oz8/P0NDQ0NHR0tLS0tLS09PT09PT09PT09PS09PT09TU1NTU1NTU09PT09PT09PT09PT09PT1NTU1NTU1NTT09PT09LS0tLS0tLT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1NTU1NPT09PT09PT09PU1NPT09TU1NTU1NTU1NPT09PS0tLS0tPT09PU1NTU1NTU09PT09PS0tLS0tLR0dHSzIxyZ2BcTVllUktHSz87Mzc4Ozg5Pj05PDpBOjs9Nzo8PDo6Nzg6Oz0/Oz88PTw/Pj9BPUFBPkNDREJAQT46Oz9DREFDRERCQklHSEhJTr7V0tPT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1crKy8vKysrKysrKy8vLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzMzMzMzMy8vLy8vMzMzMzMzMzMzLy8zMzMzLy8vLzMzMzc3Nzc3Ozs/P0NDQ0NDR0dLS0tLS09PT09PT09PU09PT09PT09TU1NXV1dTU1NTT09PU1NPT09PT09PT1NTU1NTU1NTU1NPT09PS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1tbV1dXV1dTU1NTT09PT09PT09PU1NTU09TU1NTU1NTU1NTT09PT0tLS0tLT09PU1NTU1NTU1NTU09PT09PT0tLS0tHR0s+Sd2hfXk9XZ01LRkw9ODc2NTk5OTw+OT88RDo7PDg6PD47OTc5Ojw9QDs+PT47PD48PT5BQD5EQ0NDP0E9Ojs9QkNFQ0NEQT9FSEpJSky61dPT09TU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8rKysvLy8vLy8vLy8zLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMzMzMzMzMzMzMzMzMzczMzMzMzMzMzMzMzMzMzc3Nzc3Ozs/Pz9DQ0NDQ0dHS0tPT09PT09PT09TU1NTT1NTU1NTU1NTV1dXU1NTU1NPU1NTU09PT09TU1NTU1dTU1NTV1dTU09PT09LS0tLS0tLS09PT09TU1dXV1dbW1dXV1dXV1tbW1tXV1dXV1NTU1NTT09PT09PT1NTU1NTU1NTU1NTU1NTU09PT09LS0tLT09PU1NTU1dXV1dTU1NTT09PT09PT0tLS0dHRmn5nYWJOVWpKSElLPzw6OTM3Njc3PTs+OT06Ojs4OTo7Ozg4Ojs7PD46PT09Ojw/PD0/QkA/Q0RDRD5APT08QENEQ0JEQkQ+REhJSUtMttfT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3MzMzMzMzMzMzMzMzNzc3NzczMzMzMzMzMzMzMzc3Nzc3Ozs7Pz8/Q0NDQ0NHS0tLT09PT09PT1NTU1NTU1NTU1NTU1NTV1dXV1NTU1NPT1NTU1NTU1NTU1NTU1dXV1NXV1dXV1NTU09PT09PS0tLT09PT09PU1NXV1dbW1tXV1dbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1NTU1NTU1NXU1NTU1NTT09PT09PT09PU1NTU1dXV1dXV1dTU1NTU09PT09PS0tLR0p+DaV9kU1hsSEhIS0A9Nzg0NzY6Oj87RDw8OTw8OTc6OTo6Ojs8Ojo7OT49Pjk9QDs/QUFCP0JCQUM9Pz8+PEBCRUNDQkBBO0ZJR01MSbLY09TU1NTU1NXV1dXV1dXV1dXW1tbW1tbV1dXW1svLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzM3Nzc3Nzc3Nzc3Ozc3NzczMzMzMzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc3Mzc3Nzs7Ozs7Pz8/P0NDQ0NHS0tLS09PT09PT09TU1NTU1NTU1NTU1NTV1NXV1dTU1NTU1NTU1NTU1NTV1NTU1dXV1dXV1dXV1dTU1NTU1NPT09PT09PT09PU1NXV1dbW1tbW1tbW1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTV1NTU1NXV1dXU1NTU1NTT09PT09PT1NTU1dXV1dXV1dXU1NTU1NTT09PT09LS0tSjiGxfZlJWakdIR0lBPjM2Njo7PDhDPEJBPjxBPDg5Ojw6Ojw8PDk8PTo7PD09PD89QD9AQT9AQUBCPD4+PzxCQ0NDRkBBQT1ISklOTUeu2NPU1NTV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbMzMvLy8vLy8vLy8vLy8vLy8vMzMzNzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzs7Ozs7Oz8/P0NDQ0NHR0dLS0tPT09PT09TU1NTU1NTU1NTU1NTU1NTV1dXV1dTU1NTU1NTU1NTU1dXV1dXU1dTU1NTU1NXU1NTU1NTT0tPU1NTU1NTU1NTV1dbW1tbW1tbW1tbW1tbX19bW1tXV1dXV1dXV1dXV1dTU1NTU1dXV1dXV1dXU1NTU1NTU09PT09PT1NTU1NXV1dXV1dXV1dXV1NTU1NPT09PT0tLWroprY2VSWGhMSkdJQjg0OTQ6Ozo5QDk/Q0VAPDw5OTk9Oj07PDw6PTw7OTw9Ozs/PUA9PT5AQD9CQT5APD05QERDQkFBQj48SEpLTU5IqNnU1NXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbWzMzLy8vLy8vLy8vLy8vLy8rKy8vLzMzMzMzMzMzMzM3Nzc3Nzc7Ozs3Nzc3Nzc/Pz8/Pz8/Pz8/Pz9DQ0dHR0dHR0dHR0dHS0tHV2djY2NnZ2dra2tvb29vZ2dnZ2dna2tra2tra2trZ2dnZ2dnZ2tra2trZ2drb29vb29vb2tvc29vb29zb29vb29vb29vb29va09LT09PT09TU1NTU1NXW1dXV1dXV1dXV1dXW1tbX1tbW1tbV1dXV1dXV1dXV1dTU1dXV1dXV1dXU1NTU1NTU1NTU09PU1NTU1NXV1dXW1dXV1dXV1dTU1NTT09PT09PS1bqKa2hoUlhlSUlMT0A5OTo0O0E8Nz05QUM+QD89ODo6Ozk9Oz4/Ojs8PDo7PDo7Pj1APT8/P0FAQUE/QTw8Oz5BRENBREA9PElJSk1ORqPa09TV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbW1szMz9DPz8/Pz8/Pz8/Pz8/W3t3d3t7e3t7e3t7e3t3S0NDQ0NDQ0NDQ0NDQ0ci5ubm5ubm5ubm5ubq6t6WkpKSkpKSkpKSkpKSnhmBjY2NjY2NjY2NkZGRlhIuKioqKioqKioqKiomSmZiYmJiYmJiYmJiYmJeMi4qKioqKioqKioqKi4aBgoGBgYGBgYGBgYF/j9PS0tLS0tLT09PS09PS3ePi4uLi4uLi4uLj4+Pi2NfX1tbW1tbW1tbV1dXV1dXV1dXV1dbW1dXV1dXV1dTU1NTU1NTU1NTV1dXV1dXW1dXV1dXV1dXV1NTU1NTT09PT09XDkXFrak5TYkxMVk48Ojo3Nz5DPjg+Oj8/QTw/QDc7Ojs7PTs+Pjo7PD48Oz07PT8+QDw/Pz1AQEBBPj88PjxAQUVCQkZAQD9HSEpLT0ae2tXV1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19fMzNDS0tLS0tLS0tLS0tLR3uzr6+rq6urq6urq6uvp1dLS0tLS0tLS0tLS0tTEqaqqqqqqqqqqqqqqq6aGhIWFhYWFhYWFhYWFik4MEhISEhISEhISEhIRE0pUU1NTU1NTU1NTU1NRYmxra2tra2tra2tra2tpVVNTU1NTU1NTU1NTU1RLQ0NEQ0NEQ0NERENDP13S09LS0tLS0tLS0tLS0ODs6+vr6+vr6+vr6+vr6dnX19fX1tbW1tbW1tbW1dXV1dXV1dbW1tbV1dXV1dXV1dXV1dTU1NTV1dXV1dXW1tXV1dXV1dXV1dXU1NTU1NTU1NPUy5h2bGlKTl9NUlVNPjw8NztAQz42Ojc+Pzs9Qj85PDk9Ozw6PD07PTs9Ozs9PD0+PT07QT08QUBBQT08Pzw7QEJDQURFPUFAQ0ZLS09GmNzV1dXV1dbW1tbW1tbW1tbW1tfX19fX19fX19fXzMzR0tLS0tLS0tLS0tLS0d3q6enp6enp6enq6unq6dXS0tLS0tLS0tLS0tLUxaqrq6urq6urq6urq6yoiIeHh4eHh4eHh4eHh41SEhgYGBgYGBgYGBgYFxpOWVdXV1dXV1dXV1dXVmVwb29vb29vb29vb29vbVlXV1dXV1dXV1dXV1dYUEdISEhISEhISEhISERg0dPS0tLS0tLS0tLS0tDf6+rq6urq6urq6urq6unZ19jX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dXV1dXV1dXU1NTU1NTU1NGcenFpSlRdT1JVTkQ+Pzs+QEA4Ojs4PDs7PD86Ozs4Ozk5Ozw7Ojw5Ozs8Ozo9PT0+PUE/Pj8/Pj08PT88PEFBQ0FERTw+QEVGSktNRpPc1dXV1tbW1tbW1tbW1tbW1tfX19fX19fX19fX183N0NLS0tLS0tLS0dHR0dDc6Ofn5+fn5+fn5+fn5+bV0dLS0tLS0tLS0tLS08Wtrq6urq6urq6urq6vq46NjY2NjY2NjY2NjY2SXSInJycnJycoKCgoKCcpWmNiYWJhYmJiYmJiYmFveHd3d3d3d3d3d3d3d3VjYmJiYmJiYmJiYmJiYlxTVFRUVVVVVVVVVVVRa9LT0tLS0tLS0tLS0tLS3unp6enp6enp6enp6enn2djY2NjY19fX19fX19fX19fX19bW1tfX19fW1tbW1tbV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbV1dXV1dXU1NTU1NTWo3txZElbYE5OVU9AQT89REI/Oz06OTs6PT07PDs6OTg5OTs8Ozw8Ojo7PDo7QD08PTxAQTxBQTs7PEA/PD1CP0RDQ0U8PkJERkpMTEWN3NXV1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjNzc7Ozs7Ozs7Ozc3Nzc3Nzs/Pz8/Pz8/Pz9DQ0NDQz87Ozs7Ozs/Ozs7Oz87NzMzMzMzMzMzMzMzMzMvJycrKysrKysrKysrKysfCw8PExMTExcXFxsbGxsvMy8zLzMzNzMzMzMzLzc7Ozs7Ozs7Ozs7Ozs7NzMzMzMzMzMzMzMvLy8zMy8vLy8vLzMzLy8zMy83U1NTV1dXV1dXW1dbW1tjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NfX19fX19fX1tfX19fX19bW1tbW1tbW1tXV1dXV1dXV1dbV1dbW1tbW1tbW1tXV1dXV1dTU1NTU169/cF5GXmJQUVdOR0ZDQ0lBPz07PDo8OEBCPD04Ojo4OTg7Pzs8PDs7PDw8PD87PD46Pj44PkI8Pj1BPjw+QkBERUNAPD5APkNJSUtEh9zV1tbW1tbW1tbW1tbX19fX19fX19jY2NjY2NjYzs3Nzc3Nzc3Nzc3NzdHNzc3NzczP09LSzs3P0s7Ozs7Ozs7R1NTTz87R0s7P0tTV1NDPz8/Pz8/Pz8/Pz8/P0NDQ0NDR0dHR0dHS09PU1NTU1dXV1tbW1tfW1tbX1tfX19fX19fX19bW19fX19fX1tfX19fX1tfX19fX19fX1tbW1tbW1tfX19fX19fX19fX2NjX1tbW1tbX19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjX19fX19jY19fX1tbW1tbW1tbW1tbW1tbW1dbW1dbW1tbW1tbW1tbW1tXV1dXV1NTV1di4gm9XSl9jUlFaS0hBQTxCPT07Oj4+PD4/PT0/Nzk6OTk3OD48PD47Ozw7PDs/PT0+OTs7OT0+P0A+QD07OkI/QkNCPz0+QD5CRUdKQoDc1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2M7Ozs7Ozs7Nzc3Nzsqfys3Nzc3QuYOEi8fTwJrLz87Ozs7RsIOEk87TuJ7P0ZyChIrGz87Ozs7Ozs7Ozs7Oz8/Pz8/P0NDQ0NDQ0NDR0dHR0tLT09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbV1dXV1dbW1tbV1dXV1dXV1NTU1NXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NfX19fX1tbW1tbW1tbW1tbW1tXV1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXYwIBuVU9gY1dZW0xMQ0A9PTs9Ojw+Qj5CQ0A8Ojg5ODo6Ojc7Pz4/PDw7PDo5Pzw8PTg5PD9BPj09PUFAPTtBQkBCQz47QD9BQUlHSkF629bW1tbW1tbX19fX19fX19jY2NjY2NnZ2djY2dnOzs7Ozs7Ozs7OzdKpj63Rzs7Ozpu3tqSiwJOerNPOzs7PyZu7uJ2vt5eZubqVuLmvodLOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0dHS0tLT09TU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dbW1tbW1tXV1dXV1dXU1dXV1dXV1dXW1tbW1tbW1tbW1tfX19fX19jX19fY2NjY2NjY2djY2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2dnY2NjZ2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV18h/b1pTYWVeXVxPSkQ9QD8+Ozc6Pjk/RD5BOTg3ODk7Ozw4OT89PTw9PD47OkE7OTs5OzxDQDw7PT5AQT49QkQ/QkM9PT8+Pz5ISUg/ddrW1tbX19fX19fX19fX2NjY2NjZ2dnZ2dnZ2dnZzs7Ozs7Ozs7Ozs/Inrym0tDQzsqgl36Cw6abr6fUz8/P0cOij4CJyZ2jqLLRkn1+r7HSzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dLS0tPT09TU1dXV1dXV1dXV1dXV1dbV1dXV1dXV1tbW1tbW1tbV1dXV1dXW1tbV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2djY2NjY2NnZ2dnZ2dnY2NjY2NfX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dbV1dXV1dfNiHNdWGloXl9gT0lGOkFAPj88PDo2P0JAQzo2NDc6Ozo8Ojk+PD49PTs/PTxBPjw8Ojw8PTw6PEA9QEI+PkFCPUNDPT0+Oz9BRUtIQHDZ1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2c/Pz8/Pz87Ozs7SrKWnqdXAvNLHnY+ey9PJipmq1M/Pz9G/noqn0NPChpq11dPNnp7E0M/Pz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0dHS0tLS09PT1NTU1dXV1dXV1dbW1tbW1dbW1tbW1tbV1tbW1tbW1tbW1dXV1dXV1dXW1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnY2NjY19fX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0JB1W1tqaWFeXVNOSTxDQEE+QD46OEZBP0M6NzQ5Ojo5Ozs4Oz0/Pj49QT08P0A9Pjw8PDw8Oj1AQD8/PT5CQD9AQkA8QD0+QUVLRz9r19fX19fX19fX2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnPz8/Pz8/Pz8/QzJ2Nl6zQmpfKxZ6ynpbN1q2ZqtTPz8/RuqSsnJ7R1qOYtNTTwKCg0NDQ0M/Pz8/Pz8/Pz8/Pz8/P0NDQ0dHS0tLT09PT1NTU1NXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX19fX19fY19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tKUcl5ea2tqZV1PTEc/RENDQDo9OzxCPD49OTY0Ojk5Ojo5Nzs/QDs8PUA8PEE+PD07PTw/PDo8Q0A+PTs9QD5CPkBBPkA9QD9GSUQ/ZtXX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2traz8/Pz8/Pz8/P07GigJuvyaCjv8qcpYynrdiqmarUz8/P0cCgnpOlt9iimbXU1bCiqdXQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1NXV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dbW1tXW1tbW1tbV1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbSk3BgXnBoZmVaUUhHQkVDQEA3Ojo8Pjo8OTc2NTo6Njo8Ozc8QEA8Ojo9Oj0/Pj08OUA8PDo6OT9APj08PUBBQz9APz5BOz9ARkpCP2LS2NfX2NjY2NjY2NjY2dnZ2dnZ2tra29vb29vb28/Pz8/Pz8/P0M6fkGyclteqo9PSrqa1mJ/Vqpmq1M/Q0NDSpq+um6bZopm11NWkobnU0dHR0NDQ0dHQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1dXV1dbW1tbX19bW1tbW1tbW1tbX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfW1tfX19jY2NfX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX1tbW1tbW1tbW1tbW1tbX19fX19fW1tbW1tbX0pNuYFxxZGdkWlVKQENGQ0FCODs/PD07PDw4NTU4OTY4Ozo5PDo+Pzw9PTk8Pz49Ojo+OTw6Ojg+Pzw9PTw+QEFDQT48PDpCRERKRkJd0NnX19jY2NjY2NjY2dnZ2dna2trb29vb29vb29vPz8/Pz8/Pz9G9n8O31pfA09HQ0srSzZeb1KqZq9XRz9DQ0cnXxJig2aKattTOnp/J0tHR0dHR0dHR0dHR0NDR0dHR0dHR0tLT09PU1NTV1dXV1tbW1tfX19fX19bW1tbW1tfX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19fY2NjY2NjY2NjY2NjY2djZ2dnZ2dnZ2dnZ2dnZ2drZ2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fX19fX19fW1tfX1tbX19fX19fX19fX19bW19GRbF1cb2doYl1PRkBISUdFQDw8Pj48PT48NzU2Ojk2OTs6Ojs4QD86PDw5PD49Ozs6Pzk/Ozw5PT49PTs7PTxAQ0I/Pz47Q0ZGR0hEWc3a2NjY2NjZ2dnZ2dnZ2dna2trb29vb29vb29vb0NDQz8/Pz8/Pz5V+e6WS1KKa08ySl6ObodirmavV0pem1cWNnqCdqNqjmrXXw5+h0tHR0dHR0dHR0dHR0dHR0dHR0tLS0tLS09PU1NTV1dXV1tbW19fX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tbX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2tnZ2dnZ2dnZ2djY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX1tfPjGRWXnBrXGBgTkVITUlJT0M+OkI9PUBCOzU1Nzw6Nzo7Ojo7OT09OTo6OT0+Pz07OT47PDo8Ozk+PD47PD0+QENCPz5BPEFDR0ZGRVXJ29jY2NnZ2dnZ2dnZ2dra2tvb29vb29zc3Nzc3NDQ0NDQ0M/Pz9DR1aeZrcmjqL7KnbGdo7XZqZup2LirocnBoa2hoL/Yopu02bKkptbS0tLS0tLS0tLS0tLR0dHS0tLT0tPT09PU1NTV1dbW1tbX19fX19fX19fX19fX19fX19fX19bW1tbW1tfX19fX19fW1tbW1tbW1tbX19fW1tbW1tbW1tbX19fX2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2djY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fX19fX19fX19fY2NfX19fX19fYzYZdV2JvZE9dVEtIRlNRS0xAPj1EPD9DRj01NTc7OTY6Ozo8PTo7Pzo6OTg6PT0/Pjs/Oz49Ojs5Pjs9PD0+QURCQD8+PzxAQUVHRURSxdvY2dnZ2dnZ2dnZ2tra2tvb29vb3Nzc3Nzc3NzQ0NDQ0NDQ0NDQ0NO5gL3Tm5bP1LWLkZ/T1LyBu9TOlKDT1auNj6nV1rKExta5g7/V0tLS0tLS0tLS0tLS0tLS0tLT09PT09PU1NXV1dbW1tfX19fX19fY2NjY19fX19fX19fX19fX19fW1tbX19fX19fW1tbW1tbW1tbW19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2tnZ2tra2tra2tra29ra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2NfX2ct+WlVqaltMX01KTEpVTEZCPD0/R0ZIS0g9NjU3Ojk3OTo7Ojw9OT45OTo4Oz0+PkE+PTk8PDo9Pj47PTk5Oj9FQUA+PT8/QkBHRURFUMHc2dnZ2dnZ2dna2trb29vb29vb3Nzc3Nzc3dzc0NDQ0NDQ0NDQ0NDQ0cHR0crI0tDUxLjS0tHSwtLQ08fM0tHUwb3V0tLRxNXR0cLT0tLS0tLS09PT09PT09LS0tPT09PU1NTU1NXV1dbW1tfX19fX19fX2NjY2NjX19fX2NfX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29va2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2djY2NjX19fX19fY2NjY2NjY2NjY2NjY19rHd1xSZ2laTlpOTFBRV0VKPz89P0FFTExAPjc3NTs4ODk5Ojs8Pjw+ODo6OTs+P0A9Pj46NTo6Oz0/Ojs5Ojw+QkJAPz8/P0FCR0RDRE683dnZ2dnZ2dna2tvb29vb29vb3Nzc3Nzc3d3d3dDR0dDQ0NDQ0NDQ0NDS0NDR0dDQ0dPU0dHR0dPR0dHS0tHR0dTV0tLS09XT09PV0tLS0tPT09PT09PT09PT09PT09PU1NTU1dXV1dbW1tfX19fX2NjY2NjY2NjY2NfX19jY19fX19fX19fX19fX19fX19fX1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tvb2tra2tra2trZ2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2trZ2tra29ra2trZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjbwXNYVWlrU0xSTlBSWVRGSTw+Qz9BQkVKPj43ODY5Nzc4OTk7Oz0/QDw9ODk7Ozs/Pjw8OTU6PT47OTk7PD8/P0JCQT1BPUBBQkZCQkJLtd7Z2dra2tra2tvb29vb29vc3Nzc3Nzd3d3d3d3R0dHR0dHR0dHR0dDQ0NDQ0NDQ0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tPT09PT09PT09PT09PT09TU1NPT1NTU1NTU1NXV1dXV1dXW1tbX19fX2NjY2NjY2NjY2NjY19fY2NjX19fX19fX19fX19fX19fX19fX19fW1tbX19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2NjY2NjY3LxvVFRsbExLUkpUUlVLRkQ6PkdEREFERjw/ODk6OTU5OTo3PD07PkA9PTc5Ojs5Pjs5OTY2Oj1AQT47PDk6Pj9DQT4/Qj0+QkNFQkFCSrDe2dra2tvb29vb29vb29vc3Nzc3Nzd3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0tLS0tLS0tLS0tLS0tLS0tPT09PT09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1tbW1tbW19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19fW1tbW1tfW19fX19jY2NjY2NjZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2dnZ2dnY2Ny2a1NbcGtLVVdSXFFXSEQ+PEJKRT1ISj89PDc4ODo1OTg5Njs+PD1APDw1OTk8Oj87OTk0ODw9PUFBPD47Ojw+QD89PkE9PUNGR0I/Qkmq39ra29vb29vb29vb3Nzc3Nzc3N3d3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHS0M/U0M7P0tLT0tLS0tLS0tLS0tPT09TU1NTU1NPU1NTU1NTU1NTU1NTU1NTV1dXV1dXV1dbW1tbW19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19jY2NfX19fX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dndsGRTYXJfT1pUV19RUkdCPUVJTEFBTEQ/Pzs6ODg5Mzg2ODY5Pj0+Pz06Njo7Pjs9PTo5Njg6PTtAQDxAPz0/P0I+PD48PEJFR0lCPkNJpODa29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3t7S0tLS0tLS0tLS0dHR0dHR0dPT0bm7zLqbnLrQyNPT0tLS09PT09PT09PU1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2NjZ2dra2tra2tra2tra2tra2tra2tra2tra29va2tra29va2tvb2tra2tra2tra2tra2trb29vb29va2tra2tra2tra2tra2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ3qpfVWBuW1VZUVpeT0xHQ0ZNSUZEREo7QUE7PDg4NjQ4Njk4Nzw/QT89Ojc8Pz48Pz87OjY4OD09QEE9QD5BQD1AOjs6Pj1BRUdJQkBDR57h29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e0tLS0tLS0tLS0tLS0tLS0tO+wMqaoKKViJGeqpOpz9TT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fY2NjY2NnZ2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dna2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2tvb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2d6iXFVeblheXU5aUFROQ0NMSUlJRkpEPEJBPDs4NzY3OTc3OTk9P0E/PDo5QD88PkI/Ojg3NzY9Pz9APUBBPz88PTs7OD48P0VJSEE/Q0aX4dvb29zc3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3tPT09PT0tLS0tLS0tLS0tTIlZyum5m1iX2TjIKBhMTV09PT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tvb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dndmlpYYW5ZYVdPV01QRUJETElNS0ZJRT5CRDk4ODY3OTc1Njk4PT1BPjo4OT4+PD9APzw1Njc2PD4/PjtAQEA/Pj4/Pjs/PkFCRkdCQENIkeLb29zc3Nzc3d3d3d3d3d3d3d7e3t7e3t7f39/U09PT09PT09PT09LS0tLTz6h+kayPko6MhoCIiYSQo8rU09PT09PU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY19jY2NjY2NjY2NjY2NjX19fX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2tra29vb29ra2tra2tra2tna3JJaWWNuWlpSVV5QTDxAR05IUklIRT47SEY4OTc1Nzg3NTg5ODs+Pj07ODlBPj1AP0E+NzU5Njs+QUI/P0BAQkI/Pj8+QUBEQUZIQj9FSozi3Nzc3Nzc3d3d3d3d3d3e3t7e3t7f39/f39/f1NTU09PT09PT09PT09PWtaWaiIuQhYCFi4iBg4qLf4bC1tTU1NTU1NTV1dXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2dnZ2dna2dra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29ra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb2tra29uIWltnalxYTFpfVkg6TEhMSkpDRUZDQExINzo3Njc4ODU4Nzg5PDw7Ozk4QD89Pj8/PDY3PDQ3P0JCQUBAPz8/QT09P0A+QEBGRT09REuI4tzc3Nzd3d3d3d7e3t7e3t7e3t/f39/f39/f39TU1NTU1NPT09PT09PUxZKCg4WGfYGCfXx5foGCg36k29bU1NTU1NTV1dXV1dXV1tbV1tbW1tbW1tfX19fX19fX19fX19fX19jY2NjY2NjZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vc3Nzc3Nvb29vb29vb29vb29vb2tra2tra29vb29zb29zb29vb29vb29vb29vb29vb29va2tvb29vb29vb29vb29vb29vb2tvZgFpebWhaU0ldW1hKRE1ISlNMR0ZBQD9KQjg7NjY5OTc1ODY4Ozo7Ojw5OD09O0A9Ozo2NTw3Oz1CQEFBPD49QEE9PEA/Pz5CREU+PERLg+Lc3d3d3d3d3t7e3t7e3t7f39/f39/f39/f39/V1dTU1NTU1NPT09PT2LKEkKh9g3l2hIh/e3d5gn5+i67A1dTU1NXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dna2trZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2tra2tra2trb2tra2tvb29vb29vb29vc3Nzc3Nzc29vb29vb29vb29vb29va2trb29vb29zc3Nzc3Nvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc1nlcWmxmWFJPYFFSQUhHSkZYTEZAQENDSz87Ozc4ODc2NTc2ODo5PDw6PTs/PTs9Pjw7ODg8OT0/QkFCQzw8P0FCPj1BQkNCREVDQDtDTH3h3d3d3d3e3t7e3t7e39/f39/f39/f39/g4ODg1dXV1NXU1NTU1NPU0ruen3WKeXuIgICChYGDcnOAhYOMrNfV1NXV1dXW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NnZ2dna2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra29vb29ra2trb3Nzc3Nzc29zc3Nzc3Nzc3Nzb29vb29vb29vb29rb29vb29vb29zc3Nzc3Nzc3Nvb29zc3Nzc3Nvb29vb29vb29vb29vc3Nzc3Nzc3Nvb29vb3dByXV9wZVdLUGNPS0JHQ0pIS0ZBPEE9SFBBOjo3Nzg3Njc4Nzw6OD09PD47QD88Pz07Ojs5Ojk8QEJAQkNAPUFAPz1AQkNDQUBAP0A7RU144N3d3d7e3t/f39/f39/f39/f3+Dg4ODg4ODg4NXV1dXV1dXV1NXU18h4i4V8goh6g4SBfoKCc2l0hYuGkJ3U1tXU1dbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tvb2tvb3Nzc3Nzc3Nvc3Nzc3Nzc3Nzc29zb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb297KalxjcWVST1heSz9HTElPS0VAPkFCP0lPPjk6NzY7NzY6Ozc7Ojg6PDw+Oz09Oz48Ojs4OTo4OUFCQkFAQDtAQj06PkFCQz8+PT4/PUZOdN/e3t7e3t7f39/f39/f4ODg4ODg4ODg4ODg4OHV1dXV1dXV1dXV1s6dhpl+f5OTin+CgXx9gnNxm4mAgoOJwNnat7TQ19bW1tbX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tra2tra2tra2tra29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NvfwGNaW21gVlBTU0pETEhNSEk8PkFEQ0ZORDw8OTc5OjY4Ozk3PDk4OTw9OzlAPjpBPzw3NTc7ODpAQUVBPz45PUI/Oz1CQkI6Pj07PT5GTnHe3t7e3t/f39/f39/g4ODg4ODg4ODg4OHh4eHh1tbW1tbW1tbV1tjLioCHhYOXjHh7e3lvfYF1a3ebdHZ7eInHxpiMrdjZ19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2drZ2dna2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tra29vb3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29zb29vb3Nzc3Nzc3Nzd3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3Nzc3Nzc4LdjV1lrYlJNVVFMSktGS0ZDQD5CQT9FTT4+PTg5OTo3OTo3NT03Nzo+PDs7Qjw5Pz05NjY4PTk6QEJGQD49PEBCREA9QD9DO0A9PD4/Rk9t3N/e3t/f3+Dg4ODg4ODg4ODg4OHh4eHh4eHh4dbW1tbW1tbW1tfVrYZ6d32rn3l4entzdH+Dfm9xe3l6c3t2k4qFgImkzdnY19fX2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tna2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29vb29vc3Nzc3N3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vc3Nzb3Nzc3Nzc3N3d3d3d3d3d3dzc3Nzc3Nzd3d3c3Nzc3Nzc3N3d3d3d3d3d3d3d3dzc3OGtYVtebGJSTVZMTUdLS0RGQkI7QT08RUxDQT44Ojk6Nzc5NjY6NTs+QDs9Oz89PD89Ojk5Ojw5PEVDRkA/PkBDQkQ9OT0/QT1CPz1APkdPadvf3t/f3+Dg4ODg4ODh4eHh4eHh4eHh4eHi4uLW1tbW1tbW1tfQmH+Qh4N9eoN2e3Vzenl6kKqmd3JyfoeHh4CAfoKEhJHJzNnX19jY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra29va2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2djY2NnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vb3Nzc3N3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzb29vb3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3dzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3NzhpV9UYm1iUE9TSUhHRkpJSUJBPkJCPEVFREA+ODo4Ozc3Ojc4ODY+Pz07PDk9PDo+PTs6Njc7NjpEQUY+Pz8/PkNBPzs9PT47REM/PjxIT2fZ4N/f3+Dg4ODg4eHh4eHh4eHh4eLi4uLi4uLi1tbW1tbW19jYyH52doN+fnR2eIaCenl1d5yhu6GEgoCAfoeKinx/gYaMnKjO2NjY2NjY2NjY2djY2NjZ2djY2NjY2dnZ2dra2tra2trb29rb29rb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3d3d3d3c35pbT2drXFBRUElDT0pLR0xHSkJAP0FHREBBPDg8ODg1ODk3Njc3QEA/Ozw5Pj04PTw8Ojc4PTk/RENGPkE/QkBDPzw6Pj0/PkVEPz07S1Fj1+Hf4ODg4ODh4eHh4eHh4uLi4uLi4uLi4uLj49bW1tbW19XB3LRueHJze3B6eXaFiIR7eH2AgZiljH98fnuRhZaLhoGDgY6Rvd3Z2NjY2NjZ2dnZ2dnZ2dnZ2dnY2dnZ2dna2tra2trb29va2tva2tra2trb29ra2tra2tnZ2dnZ2dnZ2dnZ2dna2trZ2dnZ2dra2tra2tnZ2dnZ2dna2tra2tra2tra2tra2tra2trb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t3d3d6NWFdobllQUUtISlNJTUhNSUtBQz9DRkJBRDo6PDg2NDg4NzY2Nj8+Pjo8OTw7Oj09PDw4Ozw7RERERT4/PkI+Qj84PT8/Q0NCQEE+O0xUY9Xh3+Dg4OHh4eHh4eLi4uLi4uLi4uLi4uPj4+PW1tbW1teslLZ6eHJvd5V7dHuLgHh1bn6Fg3t/hYhyfH2bnI6JioJ+g32Hk5rH1NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2trb29vb29vb29vb2tra2tra2tra2tra2tnZ2dnZ2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2trb2tra2tra2tra2trb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d7Zf1lgaGxcUUtHR09LTk5PTURGQkg/Q0hEREA6Ozs4NzU3Nzc4NThAPkA7PDk8Ozw+Ojk7OTk7OUZERUI8QD4/PEBDOz5AP0A/Qj8+OjtKVWPV4eDg4eHh4eHi4uLi4uLi4uLi4uPj4+Pj4+Pj1tbX19vKhYR3cXJubniVhHt4hH95dnB4c3eLkY6CdnN9ioaId3d1d4ODfIiIk8Pb2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2trb2tvb29vb29vb29vb29rb2tra2tra2tra2tra2tnZ2dnZ2dna2tra2tra2tra2trb2tra2tra2tra2tra2trb29vb29ra2trb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f0nVZaGlqVk5KSE1OR01EUElGSD9FPUZMREM+Ozs8OTc3OTY2OTU4Pj4/PTs8QDs9PDo3Ozc5OThHREVCPUE9Qj8+QDw/QUE/QEJAPjs8S1Ri1OLg4eHh4eLi4uLi4uLi4+Pj4+Pj4+Pj4+Pj49fX19fEknuJf29sbnV2foSBg4qGfnVybWVtiIaKjoR7c4OHint4e4OPj4GEioqxztrZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29zc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tvb2tvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3dzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f3t7e4clsW2pqalNOR0dOT0VIRk1JSUA7RD5ISUA9PDo6Ojg2ODo3Nzk0OD08PT07ODw8PDw4Njc4OTo6RUJFQT9APEI/Q0M+PkNEQUBAP0A8PUtRYdPj4OHh4uLi4uLi4uPj4+Pj4+Pj4+Pj4+Pj5OTX19fZqXaFfnx3bHB3eXh8jH2KhYB3anN0d3p9bot7fnl6foR/gIGDfnh8foeGlrbT2tnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra29ra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/e3uO9amFpa2lRTkZNTEtKWE1OR0FAQE9BQz9AOzw4OTk5Njg2NjY4NDs+PD07OTY6Ojk6OTU4OTg5OkJERj8+Pj5AQEBCPzxBQD88Pj9BOT5KT17S4+Hh4eLi4uLi4+Pj4+Pj4+Pj4+Pj4+Tk5OTk19fX2sqKhIB5c29tcXN1d4CUeHaAfHWHhXd1cnWgmXp7d3Z5doR0bWxue3iAmouTu9za2tra2tra2trb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc29vb29vb2tra2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f397js2lpbmloUFBPTExPUk9LU0Y/RURERD48PDg7ODc5OTU2ODY2NzM6Pjs+PTc6Pjk5OTk2Ojo4NzxDRUc/Pzs/PkA9PkE9Oz0+OUFAQDhBTlFc0OTh4eLi4uLj4+Pj4+Pj4+Pj4+Pk5OTk5OTk5NjY2NjauY6AenZ1bmpveHCBfWt0cnZ3hIV5h4d5lY55eXp1d3pza298gHx2fYh8gLLe2tra2tvb29vb29vb29vc3Nzc3Nzc3Nzc3dzc3Nzc3Nzc3Nzb29vb29rb29vb29ra2tra2tra2tra29va29vb29vb29vb29zc3Nzb29vb29vb29vb29vc3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3t7e3t7e3d7e3t3d3t7e3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/f39/f4qpqa2hrZFNQT0ZQVFJOSFJLPkREQ0I7Ozk6Ojg2Nzg1NjY4Nzg0Oz88Pz05PDw3Ozo6Nzo6Nzo9Q0JDPUE+Pzw5PT5BQDs8PDtFQD47Q05TXNDk4eLi4uLj4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTY2NjZ1p5vdntveHh2cG50d3BwdHBzb36Jc3qGhY2EenNtcoB6hn1vg5OBdnx9g4a13drb29vc29vc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29ra2tra2tvb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4N/f3+KgbWhma2ZVVlJHUFFOS0xMRUJIRUc9OD08Ojo3Nzg2Nzc2NTY3NDg+PD09Ojg6OD46Ozc4Nzc6Oj5DRDtDQj49OD1AQUM/Pjw+RTw+PUJNUF/S4+Hi4uLj4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk2NjY3MB2doCCfnp4eHBsdXlya399bHNvdGdoaYB/aWh4c2d+iYl4cIKGe3d9foWKvd3b3Nzc3Nzc3Nzc3Nzc3Nzc3d3c3Nzc3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODflGttZm5mU1NJUFlUTEhGTkZGRUJGPTs+PDs5Nzc4NTc5NjQ1NzU4PDs9Pjo6OztAOTs7ODc6OTlAQkE8QUE/Pzk/QEJFQ0FAQEM7Oz1ES01g1uTi4uLi4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk5NnZ2tmYc3uqhJaCcnR1dn14aGx8d2h4d25rcHR5gIN2dHyBhIJ9c3CAin94gn95g8je3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f4N/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh24tubWdzY1lRTVVbV0hDSUZOS0dCRD8/Qjo7OjY2NzU2NzY0ODc2Ozw7Pj86PDk8Qjg3OTo6Ojk6QUFCQUJDQEE+PT9CQ0NEQUJGOTg9REpOYtjk4uLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXZ2drcqHGCtXiRfnNsem6EgXaCfWtoan+DeHZ8dX2FhXRmcHl9d316gIqFe318foC03tzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3dzc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3Nzd3d3d3d3d3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e397e3t7e39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4ODg4ODg4tiFb3FrdWFWT1VVXE9ETUY+SkdKRUQ8P0I6PDk4Njg0NTY3NDc2NDk7Ozw7OD47PEE4ODo9OD04Oj09QEBAP0FCP0A+QENCQ0FBRTc2O0RMTmPa5OLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXl29ra3Z5sbnNxhY1ybXBuf391hH5rcnZ2enN4gXhzb3VwbWt2fHmFiIB/f392coODsd/c3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eDg4eHh4eHh4eHh4OLXhW1xb3ZeUldTWlpRSkhDQFFAQkQ8OT9BOjw5NzU3NDU2NjQ3NTY9PDo9PTk+OjxAODo6PDY7OTs+PUJCQjtBQkBDQEBEREM8PUA3OjxFS01l3OPi4uPj4+Pj5OTk5OTk5OTk5OTk5OXl5eXl5dPOxsB+cWxveHt2b3VuanNzbZKGeG50dG5vdIZ/b2twboJ0bXZyfY2DdnF/d3mKgabf3Nzc3d3d3d3d3d3e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3dzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t/f3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi1oZucG1xYFJZUFdfWUpMTElSP0Q9OTtCRjs6OTc0NTY1NzU0NjY2Pj07Pz45PTk7Pjg9Ozo0ODtAQENCQ0FCRkE/Q0BBQkREOz0+OTs8QkxNZODl4+Pk5OTj4+Tk5OTk5OTk5OTk5eXl5eXl5eW5t7Woc3JscHd6dHd4bXFydXd/hHRyc2xsa3F8bnBudGuBf3GAd32Eg355gHNygYqg2d3c3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh49WHcWxqbF5YWlVXYFZWUE9QTD1BOjs8RkE4Ojg3MzY1Njk2NTg1Nz89Oz8+OT04Ozw5PTs7NTo9Q0JCPENDREREQUE/PkJDQzw9Pjg5PENLS2PN0dnh1sjY4+Tk5OTk5OTk5OTk5eXl5eXl5eXltbW2q3J5cm59f3Z1d2hqaGlwb3Zta2tnZWZxdG15gG5teXd2iHhxa2podXV5dHV/wd/c3d3d3d3d3d3e3t7e3d3d3d7d3d3d3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHi4uHh4ePVhnFwY2lhV1NZV19MUk9STUtAPjg5O0E+ODc5NjQ3Njc6NjY2NDk+Pzo8Pzo/OTo6Nzo9PDk5PEFBPTtBQ0VDRkA+Pj5BRUQ+QEE3OD5GSEpesrW4wbm1u8jg5eXl5OTl5OXl5+fn5+fm5ebm5ra2tbWOfX5weoR1cnZnYmNlbGtyb2ZpbHZtd4Z9hXlsbHd4a3ZwfH14c3V5fHd2h7ng3d3d3d3d3d7e3t7e3t7d3t7e3t7d3d3d3d3d3t7e3t7d3t7e3t7e3t3d3d3d3d3d3d7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4eHj1Yd1bl5uY1pUU1hXS1NLSk1SR0E4Ozs+PDk4NzU2NTY2OTY4NjY5Pzw6PT07Pzo7Ozk8PDs5Oj4+Pjs8PUFEQkNBQEBBP0JDPDw9Nzs+REVKXrG1tLW2t7e2y9rJ3uXl3eDi3tXU1tPU4OPg39+2treuh3t/bnmNenJ1bWNobGxtaXR4enF5enqIh4N6aWh9cWRvcXyGgX55e318e4an2t7d3d3d3d7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4uHh49aGdmxhb19dV1lcWlJQSEpXTEVHPUA9Ozs9OTY0NjU1NTg2NzY3OD87OT09PDw5OTw6Pjw6OTg+Qjs7Pj5AREBDRUFAQD0/QDw9PTU5PEJHRl2xtbW2uLm5ubq9uMPT0r3BwcC6u7y6u8TMxb/Dt7e3hGl1gX1ndYd5Z3Vxa2t5eHB3fH15bWl3e3h3bml1j4FwbHl4d3d9gXuGgnmAoNze3d3d3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODh4OHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4ePXhXJrZ3RhW1hYX15TVVVRVUpMRj9JRDs5PTY2NDc3NTc4Nzc3ODk8PDo+PDg8Oj0+OTs8OTs5P0E8PT9DP0FARUJCQTw9Q0A6Pjw1NDlER0dasbW1tre5ubm5ubm3ubm4uLm5urq6urm5urm6u7e3uX9ucHN6b3B/eXNuc3Vsc3Z4cXFwb2tvcX6Bc2mHhIF9dHOHdW11hYmBgHJ2hafd3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uHj14lxa2xyW1dXXWBUUVVUUFJPSkNATUE9Ozk2NTM0NjQ2ODc3Nzk6Pjs8Pjs5PDo8PDk8PTw7PT0+PUNEREBDQkE/QD48PkE8ODw6NjY6QkpIWLG1tLa2uLm5uLi5uLe3uLi5urq5ubi4uLi6uru3uKx7cnhxf3ZzfnBsbXpyZ29sbW50cHt3d3Jyd3pvhpJ2f3x8enZ5fH9zfYdyda3T393d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4eHh4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi49eHb2pxalVWV2FbT1FSUE5XSURESUo/Ojk6NzUzNDk1NjY2Nzg4Oj07PD46PDo6PT05PDw9PD09PDs9REhEQ0E8PDw8Pj5AOzg8ODE1OkFGRVeutbW1tre4uLm4uLi4uLe4ubq6uLi3t7i4ubq7t7mqcnB4d3x7e4J3aG5xam9qY2lyf21zcn54dHFsanaAeX2AgH91doB1a4qLgHaR1d/d3d7e39/f3t/f3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f4N/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLi4uPYhm1sdGVWUFxnWE1YU1JRWUVDS1BOOzk4ODc1NTM5NTY2NzY4ODk+OT0+OTw5OTw7Njg5OTo8QEA9PkBGQEJCQDo+PEE9Pzs7OzYxNjxCR0RQqLa1tba2tre4t7i4uLi4uLm6ubi4t7e3t7e5ure2tIlyd3h9iXxwem99c2hqbGdnbHRscXd0cWx2c3Fxd3FyfHl4g3Z7d2mLkYp9kM7f3d7e3tvY2drZ297f39/e3+De39/f3Nvc3N3e3uDg3+Dg4ODf3t7e39jS397f397e3t/f3t7f3t/f3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLi4eLi4uLi4uLi4uLi4uLj4+Lj4+Li4uPj4+Pi4uLi4+Lk14NoZ3VkVlVkZVdKWllXW1Q9RU1LSD04NzU3NjQzOTQ0Nzc1Njc5PTo9Pjw9PDk7PDk5Oj45PD4/PkFBQ0FFRUQ+OzxBPjw5PDs3Mzc+REhFSqG2tbW1tbW2tre4uLi4t7e4uLi3tra2tra3uLm2traLfXpsbHp/cGx5dm5qaGdlcXp4b2lvb3B1c21zd4Fnb32CgYNyf3lqcHJ6f6ng393Zy8a/vL2/vsLN0tDW3tnc4NfQzcPCw8PH1dfT2dzX1NjX0MfExce9vM/Kz87Y3djO3N3c2t3T0dze39/e397e3t7e4N/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eLi4uLi4uLf4uPi4eLg4d7W29/Sw8rJx9Hb3OLk4eHg2dre1sbExcTN2trf5OHi4trX3st9aWZxYVleZWFNTFRLUlpMO0hNSEZBPTc2NjUzNDY2NDg3NjU2OTw7Pj46Pjk5PDk3OTs7Oj49PEBAQ0RCR0ZCQT08Q0A9OTw7Nzc3P0RGRkaZtrS1tbW2tra4uLi4uLi3uLi3s7W2t7a3t7i5tba3opdxb29waW50dnFmZWNrbmdvcm1mZ2tygWVvdnyAeGRzj39zaHFyaWVlbm+w39HFv7u5ubm5ubq6uru6vc3Gw8e/urq6uru7u8HCvcHFvby/vry7urq5ubq6ubm6w8XDucDDwby/ube/z8/U3tjc3t/g3tLa4N/f4ODg39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eDg4ODg4ODg4ODh4eHh4uLi4eDh4uLi4uHa2t3RwsPCu8XT1uDdydPDrrnAsaqrq6uwtLbJ0sXRxLG4v7Srq6usr7S0vMzE1c60tLureGxtbWBdYl9ZS1NVVFFQREBRTUhEPzo3ODU3MzE1NjQ5ODU2Njo8Oz08ODw5Njo6ODg5NzU8PDw/QEFAQkRDQkE8PkI/Pz09PTc1OD5DRUNAj7a0tLW1t7i4uLi4uLm5uLe1sautr7Oxs7OztLS0tqaei2tue3ZxeXhnY2hfcXdha25vaG99b25ja2lseHdsa4Z+bHB6dm1scG95sca8uru7urm5ubq6urq6urq6urq6urq6urq7u7q7u7y7urq6ubq7u7q6urq6urq6ubi3t7i4t7e2tbW1tbi3u8e+w8XHzcS4wMnH0tzZ2d/e3uDf39/f4ODh4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh3Nji4uLi4eHh4OHg3tfGxtHQztTe3tPO0t/SuLi8sq2trKysrrG+ua63rKipqamqq6urqqqqq6ysuKyqqqqrq6urra6urq6urryzrayrpHlub21fXl1dVE1SU1xUSkE/UElIPjg5NjgzNzMwNTczNzg1NzY2Ojw/PDg5Ozo6Ojg5OjY1OTs8Pj9EP0NFQkNCP0BAQT9APjw3ODc6QUVEP4W4tLS1tbe4uLm5uLi3t7SurKuqqq2urq6vsLGzs7WjcG5ucm1wg311aWFlaGZkY2Rxc21td25naW1tZXBzb29zcXN8h4F6dX11n7u6uru7urq5ubm6urq6urq6ubq6urq5uLm5ubm6urq6u7q5ubm5ubq6ubm6ubm4uLi3t7e4uLe3t7a2tbW2tra1tbW1tba1t7e3t7rBvrzGycrb3+Dg3tvd3d7h4tDW4uHg4ODg4ODg4ODg4ODg4OHg4OHi0768zNjd3OLg0dnbxL23sLCxsa+zu7uzsLS9s66urq2tra2sq6qqqqmpqKmpqampqqurqqqqqamoqampqampqaqqqqytrq6urq6urq6sraR4aWJxZmFZWlZRUk5cU0Y9QlJEQTc8OzY5NTY1NDU2NTk3NTY1Nzg7Pjw7OTk5Ojg3Nzk3Njg8Oz47RD8/Q0BBREE+P0M9Pjw+Ojo3Nz9DRj54srCztLW2t7i3trKurq2sq6uqqaqtraysrq+xs7S1t4xucnRqaIB5ZmpmZWxdaG5waGxxYmNmcoJ+dmhobGpueoaBhXx4cXF5gK+6ubq6urm5uLm5ubm5ubm5ubm5ubm4uLe3t7e3uLm5ubm5uLe3t7i5ubi4uLi3t7a2tre3t7e3tra2trW0tLW1tbW2trW1tre3t7e3t7e3tre4v8bP0MS+v8DE19e8ydra4OHg4ODh4eDg4ODh4eDb3t7Uzby3tre6wMDJxLfIvrKwsLCwr7Cvrq6ur7Cwr66urq6uraytrKurq6qpqampqampqampqKmpqKmpqampqKmpqKmpqqqrraytra2ur66trK2heWpkbWdiXFhRUFFLVEpCOklRP0E3PDk0OjU2NTQ1NTU4ODY4Njs6OTw9PTs6ODY2ODg6ODY3Pj09PT5BQUVCQkNBQUBBOj09Pz05Ojc9QUc8bKqmqKutsLGwrqupqKqrq6mpqamrrKytra2usLO0tbilgIdvaWdzdGZrcG1qZGxvcm5rbWNrcHyJhG5qbHx4Y3uKfnNqc25rcY+7ubm5ubm5ubi4ubm5ubm5ubq5uLi3t7e3t7e3t7i5ubi4uLe2tra3t7e3t7a2t7a2tra3tra2tbW1tba1tLS0tbW1tra2tra3t7e3t7i4uLe2t7a2uLm4uLe3uL6+uLq9vcfb4OHg2Nnd4eHg3dfKwcPCurm5uLe4uLi3tbS0tLKysbGxsLCvr6+vr6+vr6+vr66ura2srKyrq6yqqqmoqKmppqepqaehpaipqamoop+hoZyip6inqausrK2ur7Cwrq2unXhwbGphY2BZUU1RTFJGQzlNUEU+ODs3Mjc5Njc0NDM1Nzg3OTc7Ojo9PTw6Ojk3NDo5ODY1OD8/QEI9RENDQ0FDQEJBQDtAP0A/PDw6O0NIPWOopaWlpqioqKenp6ipqqmoqKipqqqsra6wsLCztLW1taWYdn5xZmt4cW9tZmVsaGNsZ2ZpaX11bWlvfXZ5hWZod294b3Fvcninu7m5ubm5ubm4uLm6ubm5ubm5ubi3t7W1tba2tre3t7e3t7a2tbW2tre2tbW1tra3t7e2tbS0tLS0tLS1tLS0tLW1tba2tra2t7e3t7e3t7a2tre2tre3uLe2t7i4t7i4uLi4wMXTyry8w83PyMC9urm5ubq6ubi4uLi4t7W0tLSzs7KysrGwr6+vr66urq+vr6+uraysrKurrKysq6ehoJ6gn5udoaGdlpmkpKaon5mZmZmanZ+gn56fpKqtrq+ura2srJl1cGlrY2FeXVVOU0tSREQ4TktHQTo4NTI2OTY1NDczNzc3ODk3OTo7PT0+ODg4NzU6OTk1OD9AQEFEPkZBQkNAQkNCQT88QEJCQD0+OjpERj5cpqWmpqampqanqKenqKioqKenqaurrKytra2ttLS0tbekc311bnONf3JmanFjaW1jaGZobG51aV9jZ3VzdnpuZ3Bwcn56cYihu7m5ubm6urq6urm2s7a1uLm2trW1tra1tbW1tbW3tra3tra2tbW2tbW1tbS0tLa2t7e3tbS0s7O0tLW1tLS0tbW1tra2tra2t7e3uLe3tra2trW2tbW2tra2tra2tra3tra3uLi3uri4uLi3uLi5ubm5urq6urm4t7e3t7W1tLS0s7OysrKxsbCwr66urq6urq+vra2srKuppaSmpqScmZubmpmampmXl5eXl5aZm5iZmJmZm52en5+dnJ6gpKWko6OioqKQdG5jcGFeXltUU1RIVEo/PFFCRkM7ODYzNzo1NTQ4Mzg5OTc4OTc7OTs9Ozc6NzU2OTk4NTg+Pz9ART5CPz9DPzxBQUI/PT9EQT8+PTk9Q0Y/VaSlpqanqKeoqamop6ioqKioqKiqrKuqqaipq7W1tba5o3eKcXKHhnd0cGh5a2JjYWVsaW5zal9jZWNjZWprYmRqbHaXjX6ovbm3tre5u7u6uLWxrKurqq6wrKyrq62tq6uvsLGvr7CytbW2t7W1trW1tbW1tbW2trSvr7O0tLSvra6vsrW0tbW1tbW2t7e3t7e3t7e3t7e3t7Owsra1tLa2tre3tra2tbW1tra3t7e5uLi4t7e3uLi4ubq6urq5uLi3t7e1tbS0tLS0tLS0s7OysbCvr6+vr66vr62oo6KgnJqampqZmZqbm5qampqbmpmZmZiXl5aYmZmZmpycnZ+foJ+goKChoaCgoJ+fi3RuaXRdYGZeUlRLRFRJPUVTSEVCOzo0NDY5NDQ1NzM4ODg3ODk5Ojs7Pz04OjkzNTg5NjM5PT5AP0A6QEJCQkA/QEJCPz0+QUFCPz06PkVDQFGjpqWlp6inqauqqKaoqKipp6ioqKinp6ioqaq1tbe3t7KZtH99kIx1Z2lqbGZjYGNoZW94cGlicXx5cGpmZmRma3NqhYystrKwra2ttLeysLCtrKuqqaiop6ipqampqKinqKipqaeoqqurra2sqqytraysrq6traunpaSnqqyopKOkpamwsbGztbW2t7i3t7W1tre4t7e3t7Kppaasq6ivtLa1s7W3t7a1tbW2tra3t7e3t7a2t7e3t7m6urq5uLi3t7Wxs7S0tLKxsK6sq6yurrCxsK2rqqmqqKijnJqZmJmYmJiYmZmZmZmZmpqZm5ubnJybmZeYmpqcnJydnJ2foKGhoqKioKGgoKCfnop1amtuWVxhVktPREdVRz5PV0hEPTw4MzQ0ODQ1NDgyODk4ODk6Ojw5OUA8Njk6MzY3OTE0PD8/QEBBOkNGRUJBREJDQTo7P0FCQz9APUBEQ0BPo6empaemqKqqqqakpqenqKioqKimpqaoq6uttba3t7e4rbJ1cHuDdmBiaWtiZWZhZGdmfYh5bHKAfXFvcXhjbW5xZo+srKurq6ysra6urK2trKyqp6WmpaWlpqioqKiopaeoqKioqKeoqampp6Wko6KioqOioKKioaKhoKChoaKjpKOjpaWlqLC0s7OzsKuqqaqztLa3trGopaOioaGipKiqqairs7Sxrq6xs7W2tra3uLi3t7e3t7e3t7a2uLe0sa6ppqerrKmnpqWkpKSkpKWoqaajoJ+enZycm5uampmZmJeXmZmZmJiZmpqampqampqbm5mYmpydnZ2dnZucoKGgoaOjoqCgoKCfnp2FdGtsaFdYU0pHTUVITUdAU1dGRz09OTM2Mzc0NTU3Mzg6Ojo6OTw9OjpBPDY9ODM3ODgzNztAPz9AQDpCRUNAQkRDQT87PEBDQkNBQDxBQ0A9TqKnpqanp6mqq6mkpaWlpaaoqKippqanqKmpqrW2tre3t7izc2h7c2JnamtpaWJhZGloXV1tfHJma3J/fHR8bm1zc36gqamrq6uqq62trKusq6mpqKWjpKampqWmp6eqqaamp6enqKinp6iop6WjpKKhoaGhn56en5+fn56foKGho6Wko6OkpKSmp6enpqWkpaampqeqraumpKKhoaChpKWlpaenpaeoqKalpaivtLa3trW1tra1tbOwrKupqa6rqKWlpqampaSkpaWlpqWkpKSkpaKhoaGgnp2bm5ucm5qamZiXmJiYmJiZmpmZmZmYmZmZmZqZmZydnJycnJybnJ+fn6ChoaKgoKCfnZ2cgHNrbmReU0pITUZETEtFRFFTQ0c9PDgzNjI4NDY0NjQ4OTg6Ozk7Pjw5PTs5PTczNTk2NTY8QD0/QD88P0JDPkJCQj89Pj5CQ0FFQD86PkVAO0+jpqWkpqeoqaelpKWlpKWnp6eoqKanp6alpqa1tba2trW2uYptcW1vfHxxZ2pmYGFsYFROW2hqbm9tgYJ9cWdxdn6aqKeoqqmpqqurrKqqqqimpaWkoqOlpqalpaWmqaqppqWjpKWmpqSjo6KioqKgoJ+fnp6cnJycnJ2dnJ2en6CioaKjo6KhoqKkpaSioqOjpKSjpKSko6Ggn6GipKanp6ipqaelpaSipKSlqK2wsKyrqqusqqmnpaWmpaWlpaalpqioqailpaWkpKSlpKOjpKOioaGhoqKgnp2cnJubm5qZmJiYmJmam5mXl5eWlpeXmJiZmpqcm5qampubm5ucnJ6goKGgnp6enpycm356bnJiXlNNSlBFRk5NQkBPRT5JOz01MzYzODM2Njc1Ojs4OTs5Oj49Ozo5Oj43NjY5NjU2PkI+PkE/PT5DQT5DQ0BAO0BAQkJCRUA+Oz5FPzxQoKSjpKOjo6SkoqSlpaSlpqamp6empqalpqaltLW1tbS0tbiBaHx9ZXOCemxwdWFfY1ROT1FbaGxpbGxxbW5xbnScoqSnqKioqauqqqqqqaempaSjo6OjpKSlpqalp6ytqaShnp2eo6Shnp6foKCenJ2dnJycmpqam5ucnJubm5ydnp6foKChoJ+goaOioKGjpKSjoqSlpaWkop+go6SkpKapqainpaGdnJ+jpaipqainqKioqaempaWkpKSlpqampqampqenpaWko6Ojo6KioqGhoqKhoqOkop+enZ2cmpubmpqZmJeXmJaWlZSUlJWVl5iYmpubnJuampqam5ucm5ucnp+fnpucnJyam5p/fnF0YFtUTUdNSEZMSj8/TkM8QDs8NDM4Mzc0NzY3ODs9ODo6OTk7PTs7ODk9Nzc4OTU4OD9APT9BPjs9RD89REA/PzpAQUE/QUVAPjw8Qz88Tp2ioaKioKCipaSkpKWlpqenp6empqampaampbW1tbS0tLS3jHalsXdmc3Jvc2xjZGlYT1JRT09dgG1kYFptkZGSoqKjpaampqenqKiop6alpaSjoqGhoaKjpaempqesrKemoJ2cm6Ghnpuamp2cmZiam5qampmZmZubm5uampqampucnZ6goaCfnp+hoJ6foqOko6Omp6inqKWioKGhoaGkpaWlpKCcmZmbnqOmpqampqanpqempaOlpKWlpqiop6enpaWlpaWkpKOjo6KhoqKioqKhoaKjo6Kgn56enZybnJubmZaUlJSTk5OTk5SUlJWWl5qam5ubm5qZmZqanJ2dnZ2dnZuampqamZqXf3dvc11aTkhKTkdFRklERU5APD09PDQ1OzQ2NDY1Njc5Ozg5OTg5OTw7PDc6Ozc4ODg1ODg/Qj9BQTw+P0A8PEJAQT49QT4/Pz1CQUA6OkA8PE+doqGfoJ+dn6OkpKSlpqeoqKenp6ampqampqW1tLS0tLS0tbSXtqd1Znh2Y2xjY2VjW1JTU1JNXqCMeFhodpajnp6hoaOjo6OjpKSlpqalpKSioaGko6OjoqOlpqWmpqenpp+bmpuioJmWlpWam5mXl5iYmpqYmJqampqbm5qZmZmenZ2goqOjo6KkpKWinqGhoaKjpaampaSjoaCgn5+hoZ+goJ2amJeZmpygpKOjpKWmp6alpaOjpKSkpKWnp6ampqampaWmpKOjo6SjoqKjpKGfoKGhoKGgoaCfn56dnZyamJeVk5KSkpKSkpOTkpOUlZaZmpqbm5qampqbnZ6enp2cnJybm5qamZmZlH10bHReWk9IRUdGQkVORT9GOzo+Pzs0Njo2OTM2NDY4ODo4OTc4ODo8Ozw5Ozs6OjY3ODk5Pj9APjw9QD5AOjlAQT89QT8/QUE+QUE/Ojk9PjpQnaCfnZucnJufoqOlpaWlp6iop6ampqanpqantLS0tLOysrGwsK2rkHiGj36bmn93Yl1TUlFRTGKgootaiKCgn52YmZycnZ2eoaGgpKenpqWkoqGjp6alpaKipaampaanpqagm5mboaCXk5OSl5qcmpeXl5iampmampqam5qYmJmaoKCgoKGfoaKipKamop6gn5+goaOko6Khn56enpyanZuZmpqZmJeZnqChoaKioqKkpaWmpKSkpKKioqKkpaWlpaWlpaalpaOko6KioqGgoKGgnp+fn5+fnp+foJ+cm5qZl5WUlJSTkZCRkpKSkpKSk5SVl5iZmpmZmpqam5+fnp2cnJycmpmZmpiXl5F8cmdxXl1QRj9BRD9KT0JCRjhDRT4+OTg7Nzc0ODQ1OTo6Ozk3OTo8Ozo8PT48PDo2NzY5OD4/QT47Pz49PDg6PkFAQUI/P0FCQERBPjo4PkE8U5ycm5uampycnaGio6KjoqSmp6alpaampqSjo7KysK2rp6amp6alpqiln6iop6qnoXmEXFFST0xcnKCAYpmgnp2clZOVlpeZmp2dnqGmpqampKOioqanp6ajpaampaWmp6amop2cnqGfl5GRkJSXm52YlpaWmJuZmpqampqZl5iam6Ghn56fnpybnJ6goJ6dn56fn6Cio6SjoqCfnp2ZlpeXl5iYmZubnqKioqKioqGio6WlpKOio6SioaGhoqOkpKSko6SkpKSioqKhoqGgn5+gnp2enp2dnZ2dnp6em5mYl5WTk5SUk5KQj5GSkZKSkZKTlJaXl5iYmZqampyenZ2dnJubmpiYmpmXlZaNempmamBiTkY+P0A9SkVAQ0A7QEE8Ozs5Ojc2NTg0Njc4OT04ODs6Oz87Ojs8Ojk6Nzc2ODs7Oz08Ojo8PTw3Oz5DQkRDPz1BQ0BEQT88OkBCO1eZmJqamZmam5ucnp2foqKhoqSlpKSlpqSioJ6op6alpqWlpaemp6ampqakpaanqKehqXJOUU1KVJahenKanJyenJeVlJWWmJiXl5qeoqKhoqOkpKOjpaalpaanpqSlpqalpaOgoKGhn5mSkI+WmpmenJaXl5eZm5ycnJqamZeZm5uen52cnZyZmZqcnZydnp6fn5+hoaCgoaKgn56bl5WVlZeanZ6fn6GhoqKio6OhoaCgoJ2cnaGioqOkpKOioaSlpKOko6SjoqKioqKhoKGfn52cnZ2cnJ2dnJ2enpqXlpaVlJOTkpKSkpCRkpKSkpGSlJWWl5iYmJiam5ycnJycnJ2cm5mYmZiWlJWXi3hsY2RiZFFHQT1DO0tIRDo7Ozw+OTo6OTo3Mzc5NTo4ODg8OTg7OT09Ozo7Ojk8PDc2NDc/PDo9Ozw/Pjw7ODxBQ0FDQkI+P0JAQkFAOj9APztZmZiampqam5ubm5ydoKGhoaGhoqKioqKhn5+dpKWmpqenpaWmp6ampqWkpKalpKSkpaaGUFJQT0+PmHB6mpubnJ6cnJycm5ubmZiYm56dnp6foKOkoqGhoqKio6SkpaalpKOjoaGhnpyalZOUmJuam56amJiYmJqcnpyam5iWmZybnJycnJydmpqbnJ2dnp6dnp6fn52cnJyhoaCblpWVlZacoKGgn5+hoKKjoqOhnZuZlpaWlpicnqCip6ikoaCgoqOjoqKioKCgoJ+fn5+gnp2cm5ucnZydnJmanJuWk5KSkpKUk5KSkpKSkpOSkpKRkpSVlpeYmJiYmZqcm5qbm5ucnJqZmJiXlZWWl4d3ZGdoZGJNQ0U8RDlJSkU5Ojs9PTo6ODg6NjQ3OTU8OTY4OTc5PDs7PDo6PDs6PDw4Nzg3Pj07Pj46Qj86Ojo/QURCQ0FBQD9EQUFAPjpAPj06W5qYmZqbmpubm5uen6CgoaKioKCgn5+enp2dnKWkpaanpqWlpqakoqKio6Oko6Kjo6KnllRYVVJOZ21rgZ6am5udn6Cgn56enp6dnJ2dnJ6enp+goaCfn6CgoKGio6Ojo6OjoqGgnpuZmZiZmZmamZienpiYmZmam5qWlZeWlZicnJ2cm52dnpybnJ2cnZ6bmJqeoaGdm5udoKKhmpWVlpaZoKKgnZueoKGjop+em5eXlJKSlJeYmZ2goqenpaGgn56goaGioaCfnp2cnJubnJubmpqZmpydnJmXmZaVk5GQkJCPkZKSkpKSkZKTk5OTk5OTlJWWlpeXl5manJubnJucnJqamZeXlpaVlZSEcmZsYmRbREJMPT84RktCPEA+Pj05Ozk6PTg1ODg2Ozg1Njo4PDw7Ozw8Ozk8Oj09OTU4Nzw5PD88OkE/Ojo6QEBDQkRBQ0A/Q0FAPj08QD09Ol+al5mamJeYmpycn5+foaGhoJ+fn56foKCenZ2lpKSko6OioqOjoZ+foaGipKOio6SiradXXl1UV19ua42dmpqbnJ6dm5ucnZ+enZycnJydnZ+goKChoaGgoKGgoKGioaGioZ+enJqampqbnJqZmpuZnJ6ZlpaWl5eTjo6QlJabnJuam5udn52cnJycnJ6dlpSZnJ+in5ycnZ+hoJuXl5mZmpycnJubnZ6fnZqXlpaWlJOTlJiampqfoKGmpqWgn56fnqChoaCenJubnJybm5ybm5qZmJmZmZmXl5iVlJKQkJCQj5CSkpKSkZGTk5aYl5STkpSVlJWWlZaZmZmam52cnJyampmXlpaWlpaQgG9vZV5gV0BKSDg/N0lFP0VBPD07Ojo7Ozs3NTs4Njs3NDY6Oj47Oj0+Pj07Ozs+Ozo4Ojk5NkBBPTo8PTo7OT9BQ0JERUM+P0FBPz8+Pj89PDtgl5WXl5aVl5mbnqGhoKGioqCenp6enqCgn52bpaWjpKSioKCfoJ+dnZ+hoqOjo6OkobCjXWVkYGFua4GenJubm5ubmZianJ2enJubm5ycnJ6ipKGeoKGhoqKhoKCgoaGgn5+enJqZmpubm5ybmp2dm5manJiXlZWWkY6Nj5KYnZycm5ycnqCdnJucnJyempWVm56foZ+dnJyenp2cmpqampqampqbm5qXl5aTkpWVlpWTlZaam5qanZ6foqWjnp6fn5+en5+enZ6fnZycm5qcmpqbmpiZmJiYmJiYlZSTkZCRkJCQkZKTk5CRk5SYmZiVk5SVlZWWlZaXmZmXmZqenpyamJiXl5aWl5eYjX1ubV9lVlRFSzw3PjdSRUM+QkE4Ozw7OTg6ODY7Nzc6Njc5Oj0+Ojw8PT49PD06Pz06ODw9OTtAPj4/PT45OTs/QkNAQ0VDPT9DQj5AQD5APTw8YZWSlJWWlpeanJ6goKCgoaCgnp6enp6gn56em6WlpKOioJ+fnp2dm5mbnJydnp+gn56rmGNpbW5pZm2enZybm5ybmpmZmZqam5ucm5uam5ygo6SgnZ6en6CgoKCgn6ChoKCfnpuamZqam5ubm5ufnpyZmJqamJiYmJKOj5OXnJ2bnJ2cnJycnZycnp6dnpqVl5ygoaGfnp2eoJ+cnJuampqbmpqYmpmVk5OTkpOWl5eVlJiYmZucnJydoJ+gnp6enp+fn56en6KjpKKgnp6cm5qampuZmJmZmJeXlpWUlJORkZCQkZKTk5OSkpOUmJmYlpWUlZaWlpaWl5iYmJiXmZqamZeXl5aXlpeWl4l4dmddX1dURUU5OTs8WT5AOEI/OTs7Pjk4Ozg6Ozc5OjU4OTs9PDk9Oz0+PD0+Oz8/Ozk+PDw+Pz5AQUE9ODc7QkNFP0FFQz1AREJBQEQ7Oz47PGKWk5SUlpWUlpiYmZubnJycnZ2cnJ2en56dnJqkpKSkoJ+enpybm5qZmJiYmZucnZ6cpolla3R4bVuFop2dnJydnJqbmpqampydnZ2bmpuboKKinpucnZybnJ2enp2dnZ2fnpyampucnZycm5ycnp6cm5qanZqam5yVkZOXm52dnJ2fnZycnJycnZ6fnp+cl5idn6GhoJ6cn6CfnJubm5qbmpmZmZmZl5WWlZaYl5eXlpaYmZuenp2dn6GhoJ+fnp6fn5+dn5+hoqKhoZ+fn5yZm5qcnZuampmXlpaYl5eXlpWTkpGTlJSTlJSUlJaZmJaVlZeZmJeYl5eXl5eYl5iXl5eXlpaYl5eVl5eDeHZfW11eUT1GOjk4P1VDQTtDQzo8Pj86Ojk3Ozg4ODc0ODk8Ozw4Ozs8PTo9Pjo/QT06PTw+PkBAPUBBPjk2PERDRUBBRUU9PkVERD9COzo8OTpkl5SVlZaUlJSUlJWXmJiamZqcnJydnp6dnZybo6Oko6CenJuamZqZmJiYmZiam5ubm6WJa3F2em9lmp+enp2dnJybnZ6dnJ2enp2dnJydm5ygoJuampubmpudnJqampucnJuZmZycnJ2dnZ2dnZ2dnpybmp+fm5ydm5mZmZudnZ2dn52dn5+dnJydn5+fn5uanZ+goJ+dnJ6gnpubm5ubm5yampuamZudnJqZmJeYmJiYmp2foKCgoJ+hoaGgoJ+en5+fnp6foaKhoJ+enp+enJqam5ubmpqZlpaXmZmYmJiWlJOUlJWVk5OVlZSVlpWVlZSYmZuamZaWl5WWmJiWl5OUlJGRk4yRkJOWfXhqYWJiXFA8QDw2OENWSERCOjg7Oj47Nzc5Nj06OTk2NDc6Ozw9OTo6Oz87PT08QD47Oz46PT89PkBBP0A8NztBQ0U/P0REPj9EREM+Qj07PDs6Z5aTk5OTk5OTlJSVlpeWl5aWl5mbm5ybm5uamaOjoqCfnpuamJeYl5eXmJmYmZybm5qkgGpqb3lzcZegnp2dnJydnp6enp+enp2cnJydnp2bnJuampqam5ubmZiYmpqamZmZmJqdm5ydnZ2dnJ2cnZ2cm5qdn5ucnJubnJubnZ2dnJydnp2enZydnZ2cnJ2dm5uenp6dnZybnpubnJycnJydnJubmpmbmpmYmZmYmpmZmpyfn5+jpaKfoaKioaGfnqCgn5+fnqCioaGhn5+fn52ZmpudnZqZmJWWl5aVlZaTkpOUk5STkJCSk5GUkY+OkJGOlZabmJWYlJmXlJiRjJCPk5yTkoyFjIeDhndxZ2pkW1xRQT44NkJHYEJFR0A+Ozw7Ojg4NjU8ODo4MzQ6Njk9PTk5Ojw9Ozw6PD48Oj5AOj5APjw/QD8+PDg6Q0FEPz5CRD8+Q0VCPUJAPDw8OmeYk5KSk5OSk5SVlJWXl5aWlZaXmZmZmpqampqkoqCfn52bmpmYmJiXl5iZmJmcnZ2cqH1nZXN7enOJop+enp2dnp6enZ2enZ6enp2dnZ6cm5ybmpubm5ucm5iYmJmZmJiZmZmbnZycnZ6enp6enp6dnZybm52bnJybnJ2dnZ2dnJ2dnp+fn52cnZ2dm5qbnJmZnJ2dnZ2dm5uanJ2dnJycnp2dnZybmZeVlZeXmJqam5ubnZ6foqOhoKGhnJucm5ubnZqcmZycn6CfnZiZmZmUkpKUl5SPj4+OkYyNiYuQi4mLjpGRj4mQmJiQkoyNi5KQj5iYoqiqpqWlrKOmoZqep6eyqKKVo6Cfl39wcWlsXFtcTUY8NzdHR1g+SE5URjk+Ojg5ODc1PTk4NzMzOTY6Pjw6Nzo8Ozo6Ojo8PDs/PjtAQD47PT5BPDw2N0A+QkA+QUY+PEFEQT1DQj49PDlmmJSTk5OTkpOUlZOVl5iYmJaXl5iZmZqampqaoqGfnp2cm5mYmJiYmJiYmZmZm5ybnKx/am16f3lxh6Genp2cnZ6enp6enp6dnp2dnZ6enJubnJubm5ubm5uZmJiYmJiYmJmZnJ2dnJyenp6enp+fnp6dnp6dnJydnJ2dnZ6fnZ2fn56goJ+enZ2dnZybnJ2em5qbm52enZ6dm5ubnJ2cnp2cnZqYl5SRjo+QkJGVmJSWlJiZmpudmJuYlY2Mjo6TkpKRj4mQjpGRjo+Ki42NjYiIi4+Lg42NkY+MkI2Qk5WVnJihoJySn6SipKmam5eanKOprb3Bwbq8uL26ucC8ubq3uru7tL2zwbV/bnVmZ1peWUxJRTo7TElTPFZSSUM6QTo7Ozc3NTo6OjgyNTY4Oz08OTk7Ozw6Nzo4Ojw6PT85PD8+PDw9QTs5NTg8O0A/QT9EPTxBQkA8REM9PT06YZOTkZCUlJOTk5OTlJeYlpeZmJmYmZqbmpqamp+gnp+fnJqZmpqampmYl5iZmZmZmZmphXB1e4B3b4mhnp6enp6fn56en56fn56dnp6fnp2dnJ2cm5ubm5ubmpiYmJiZmZiam52cnJ2dnp2dnp6goJ+enZ6hoJ6dnp2enZ6fn56en6CenZ6enJydnZ2cm5qYnJuVmJqamJiYmJmSjJCXlKCXk4+MjYqKiImMiJORh5CPjYqKkJCLjoqMi4+IiImJjpGOjYaFiYaKhoWLiI+SkJCNkJKXlpKamJ2TlJ6kpqaqq7Gsr6+rpquqsbm5tbS0rqyvtMDIxcXBvsbDxMTDurW+t7a0s7C2tb6qcHRyXGZfXV1JRj8/RUtMVklcTEQ/PUI6Qzk5Nzc7OTk3MTc5ODo+ODg6PDw7OTc6Ojs9Oj4/OT5BPDs+PD46OTY5PDpBPkNBQT08QkBAPkJEPj8+OVyHhIOHi42KiYaFgYqMkZOVmJiHlZaWkpiampmenZ+gn52ampubm5ycm5iWmJmXl5ibqo56dXZ7f3mCoJ+fnp+goKCfn5+foKCfnp2dnp+enp2dnJqbm5ubm5uYmJiXl5iZm5ucnJydnp6enpybm52dnZycoaGfnZ6dnZ2dnp2dnJiWlpaYlZWSlpmWk5GKjI+PjI+NkIuLj4+WiYiEi5GZjn2Fi46PjYyHioyQm4yRj4+Lio6TjIyNjIiSi4yFiYyPhouIh42KhYyEj4qXkJOYmpWbnKOqoaKknKKrsbe0ubWxs62vsrKlp7O6sbq6vLa3tsDDw729vLa/urq8wbW4wL60r66mqa+3mm58Z1tjWl1fSEU+QUtJU1hZXkFGOTk9OUY/Pzo3Ozs7NjM6Nzo5Pjg6Ojw9OTk4Ozk7PDo+PTtAQDs8QjxAOjg0Njw7Qj9BQj4+O0NEREBDQz0+PjlhmZWLkYWNj5aSiHl9e3+Fi4OKgoqJhmuAeJCLlpqRnZ2UlJGTlpeampiWk42Sk5KQm5uIdndzcX1/cpGgnZubm5yenZ2eoKGgm5uWlpucmpybnJuYmZqYmJmampqWi5CTlpmYlZiYlpucl5WSkY2SkZCUk5KXm5mYm5ePjpCLjo2Ch4uLi4qLiI2RjIeHhoqIiZGKh4yEhYqNi4qNhI+UkIyDkJOUmZWPi5STkZWRlpWOj5GMlI2Oj4qIj4ePhoeJiYmNiomJioWNh46JmJKUmpuXmKChp6Cko5qqqbO2sbWwqKmiqK6tn6qvsK21ubi8wr/BxLixtbCutrOwuL68ury+urOzp7G3wpB1gGNiXlpXUk1IRkVQSVlXX1tDUDpCQz1HRj84Nzo6NzU1OTc8OTw5ODo9Pjo6Nzs7Pjs7PTs9P0E7Pz48Pzo4NTM3OkFBQEI+PjpDREM/QUM7PT45Z6mloqKZn6CippeUiI2CiIJ1h4iKiIp7e3Z7enmPeoiSfn18en6CkYWBgH1zfH99fISHfnRweHZzfHaBj4iIiYeIioyMkZicl4iOhIuNi4iNkI+Pi5GPi4yPj5CQjouFhYeLjIyHiIuOi4eMhYaBjYuGiop/iYqGiJiRiIOIg4KFfIuLjIaJi4iKkIyIi42PjI+Wh4mLio6NjY2Wk5OdnJyalpycm56bmpuYnZeTkZWWkJKRi4+LlpSMjYqDi4SEiYyQkIqOio2LipGJjZOTk5SVk5KcmZ6Xn6CfpaKvsamupKSfmKStpqa4t6ysu729wsPAv7+vpa2wsLS3uLO0uLa0ta6stK+4tLaBeXpjZmBeVlBRQUVMT0lcXl9UR0dCS0xCREA9ODg7OTU3Nzk3Ozc9PDk9Pj05Ozg6O0A8Oj06PkJBOD88Oj84NjQyOTtCQD9CPj04QUI/PkBEO0A+N2CloJqXnaGaoaCPl5efl5WCjaCfo6GdmpKOjIxycXBvdnFucG1ucHZub29waHBxcHR+c3FycXd7cnl2d3Jyd3Z6e3l8fXt/iIGEi3+PkYaNi4uGiouLiYaEgYaCgIKJkYOAg4x/ho+LiYWAh32AgZKQhoSEho2DhIyPj4+IjY+Hi4iRkJWRjpCKk5eOj5WYp6SfnZWYlpaln5udq6aqt7W4srGnr6qnpqGfmp2WkpWVkYqPjImTjZuVjYuLhoaJjJWQkJCLmZKVlZSbkJiTlIyNkYyWl5WilZ6mqauno6OqsJucpp+mq6G0vb6zs7+5u7u6uby9rqiusa6wuLyztLGxqrCpqLGxsqild3J0X2hhYFRWUUlKSFZNXl5eVExKRVFKRUdDPTo5OTc0ODY4Mzg4PTo9PD47OTs4Ojs/PDw+OT9DPzg7Ojg8Nzc2Mzc5RT4/Qz89N0BAQT0/RDw+PThUj4yGh4eUjJWZl5yWmZaNlZyWlZydoKCdmpiWeHFubXJ4cXFsbnJwa3FvcG1yc3t1dnd5fnVxeHZ0d3tybn98gX15eH1/eYOGg4WCg5CLkIuLi46Pi4mJhYKBfX9zfYiAfpyQhIWFiYuPinp9fYaOjYqGjZSRi5CXj5SXkpihlp6XlZunpp+goKawq6GjpbW0sqqmqq+isba5vcK7ucO+vLi9uLWxrLCspZuSk5mfm5SPk5WOmp2doJqfn5edo6qsoZ+em62hp6qwqaampJiRkZWUo6SirKSss7Szs6i3tru4sLKvra2yt7a6srW6s7e5u7i8urayr6yxsbKztLOxsa2us7Gzs6yhl3Zxc19jXlJRVE1PSUdYT1pcZFROR1VPRURKRD44Ojg3NTg4ODU5Nzo6PTw/Ojg8ODk5PTs9PTpCPj84Ozo5Ojk4NjI1N0I+P0RAQDY+P0I/PEM8PT46Tn98go6MjJOTl5eaj5SWjZaRkZSXk5qanqGdnHJvcnFxcXFxcG5zcW91dHJxdneAdXd8eYV+d3t8eX1/fICJiYmDfXp/h4GIiYGAgIGGiIGGi4eIhYSIiImEgIJ/enx8fX6SkH+IeIGFi4qDhIWKj4yNkZmdlJSUoJqan6Ktsa2ppKWtr6ysrLWuvrmtrqm1sLexq7G2rK+9wsLAvrq8trKutraxtK66u7OurKepp6unoqmtoKmooq+wuLSxvLq6urK0ta+8tLezt7e7t7mtrbCprLW5sbeytLe2sLu7vLu6ury1vLi0wbWsqqqrtLG3uLm1trSzsKymrrCqq7Cxq6yusLKxtK6qo5N4dnJlZ1tMUlBGTUhTV1JlXmdUUExcUUhMUkNBOTk3OTU4ODY2Ozc5Ojw6Pjk4Ozo6Ojw8Pj08RD45Njs7ODg+OTUxNTdCRkREP0A3Pj5DPjpBP0BAO0t/gomXmJSdlpabmIuSlo6XkZGVl5SZl5+bmZx8dHV2dXl1c3RudnJzdHV2d319gX56gXyDfoJ/fYB/hIKFj52RiYF/go+Xjo6HgoCBiIuFfoqQjH+HjYyLi4eSioeGjZGTkZGEh319g4iMjouOiomQj46PlJSYkZWbmp2dqK6yr6+1tLOtsrW4sLy1tbGqsKqztbS7t7SztrS1r7i4t62noqassLCvtre3vrW5vLOysa61u7C0r6+yu7axuMC9tLS0s7izvLq2tLrAvbm6ubq+ubm5vrWysa+yr6q1tLGzsbSzrri4tb+vpKaoo6ussa+zrq6wsKytq6qroqKmqKKnrauqpaynoqeYeHlxZmVZT09NSVJNV0xPX15cTlVUYlFEVE07Pzk8ODk1Nzc1Nzk1Ojo6OTs4Ojw8Oj08Pj4/P0I9ODY6Ojk6QDs1MjU2QUZDQz4/Nz49Q0I5P0I/PjtLjpGTmJmVmZGTopiTkpKLk4uOkI+Vl5ablZSbhoJ9enh2dHRzdH53end2gIKDhouMhISFioaQiYeRk5aRjZaalY+IjI+emJaVkpCTl5qamJCdoJ2Tl5qgmZ2bo6CVkJugpKOak42IiIuJkZGOko6LmJqPj4yUmpecnJufnKSstLm6vK+2tLi0tLK3uLmzq6+qqKy1srK1rrGrrqa3s7OxpaGotbCvrayrtbqyu7q6tLK3ur67ubG4sLmtqLK4u66ttLS3tbu2trm5vLe0r7G0t7a5s7e1pq2pq6ior6yprq2up6KxtLG0q6aop6Cjq66oqq6orLKwr6+pqKGeoaGjpqOgopqlo56ol3J3bmdiVUtUT09KQ1BLX2JYWlFcU19NSFFJQUA5Ojg2Njc3NTg5NDs5Ozk8Nzs+Ojg8PD0/QkBBPTs2OTk5Oj87NjM3OD5GQkJAQjk+PUBDPkBGQj44R5OWkZWTkpSQkZ+ZnZmVkI+Sko6Mk5aWko6RlZGSkIaBeXJzdXuBhI6HhZGTkpicnJiVkJWYo5yaoaeqqZ+clpeVnaKioZyZnpmlqKyvramnqqmop6GlqKirqamvoZufoaOjoJqfoJyUjZiUmKCgoaSem5qkp6Spq66spaOoq6+xtK6qrK6zr6ystLO0ua6urayqrLKwsK2wqKqmsrS0uK6qtrqwr6qurLC3s7i0t7W0u7y4tbWxtauyrKiys7uvrbGytLa1sbG0s7OvrKuvs7a0sayutKqqpqWnrauoqKupqqifqbOwqqeppaOio7CtqaatpairrayppaSioKWipaOYmZyVnqKippdudWVnZFZPWEtLSktTVHBiWWRXX1tcUlpQTEM8ODk6Njk4NzQ3NzQ4Ojw6PDg6PTk3PDw7PkM/QT47OTo5Ojs+PTg0NThBREVEQkM5PjtAPkI/R0Q+N0KSm5SVlZaVj46Wl5qZlZGKk5SSjo+SkYqKiY2Ul5qTjYmCho6VkZSfmpuin5+jnqGhn5ijpKelpaapqa2rqaKmpKilpKGfnqOjra2srairrq6qqqukoaKlqaenqaijopybm6SgpaijoJidmZ+hoqmnoKKirqyrqqetrqilpKmpqammo6iqqaekp66wr7Ovq7Crqq+yr7Czua+rqLCxrrCyubO0r62vtbCss7GurLW1tLSzs7CvrKyqrKusr7G0s7CwrrCwsKyqrauqq6alrrCysKumqbCvqaOkqaunqKaopquwq6mvqaaoqaalo6iwraqpqKKpo6WnpKGhoKKloZ2el5aYlJugpKmUbnNeamlfVVpOUk5QT1JkXGRjW11ZXFBZT0tAPDs5Ojc6ODczNTMzODo9OTo4OTo5Oj08PEBEPkA9OTo8PDw+Oz45NTo8QkFFQUNBOT47P0BEQENCQDdAkZ6YlJeZlpGHi5SSl5GIg4mLk4+OkI2Hh4SFlZmWmJeZlpqeop2anKKkoaCdn5qfoKGgpqGgoKCjo6KlqKmrramqpqOmpaCloKaopqWnqKapqKOnppmcpKWioaChoaCcmJmfoKGkpKKenpagm5qioqChn6CiqKCcn6GloaCmo6KfpKGspp6foaGkrKqnrKivq6e0sa6ur7WyrKqwq6mtrbWwrq6srreup6yqpKivsq+sq7Kvqqqpq6utqa6urrGxraqtqaunp6uoqauinaapqKilqKisqKilpKWop6iopqmsr6+oq6mhoqKlo6Opq6ymqKWjqKKhoKSdnZ+hoZ2bnZ+amZWcnKOqlG9zZm5yZF1dUFVPV09eZGRsZ2JiWlpSVE9NQTo9Ojo4Ozk1MTYzMjg4Ozk5OTk7OTk8Oz0/Qz5APTk7Ojs8QD0+PDk5PEFBRUFGQTo9Oz9BQUJBRUI4PYqWlJOYmpaPiISNjpGSjIiIiI+JiZCRjoqKiJubmZygpaKlnqKjoZqeoZyanZ6bnKOop6ugoKOYoJ2XnKGjo6WjoqKkrKilqaCepqmnq6mkn6Kgoqahpq2mpp2fn5+fn5manJyhoKGkn6GbnZqcoJ6hn56eoKOZlpqYo6KipJ+ZnKGhoqCbmp6goaSgnaejqrGorqusqaSqqquorKalrKqws6+rq6mwq6appaWoq6ynpqevq6Wnq6upq6irqqqrrailqKOmpaesqayoopykoaOmo6qpqKano6SnqKanqKepqKupoaKoo5yepqWjqKino6WlpqmgpJ6inpeYnZ+doqKlnpiUlZ6go5d1d2t2d2FfXFVZUVVWW2Necl9oX2NTUVlUSD48PTg7OTo4NTM3MzM0Nzo4OT05Ozo5PDxBQEM9PT44Ozw9PEA/Qz86ODo+P0NAREE6Oz48QD9DQ0VDOTyCmJmenZ2alZKKiZGRl5GQh4SJgoGNj4+Sj42cnZ+hpKmlqaeorK2moqKfmKSmo6Stsa6yp6asm56em5qjp6Cfo5+foq+rqqyoqKuwqaipqKGfoKeprbCyr6yjoqahqaWepKOipqClpKKlo56doJ6fpaKinp+imJWemp6fpKGblZigoZ2enJudnZuZmZWen6Oonp2iqKGaoaOmoqSoqaqoq7CxqKWlp6eopKWpqaqnoqWmqKadnqWloqClpaOlpqCjpaOjpaelqamqpKekpqKmp6SrqaenpKGlqKynpqWlo6OopJWdo5+bnaCjqaeopqGjo6mooKiioJyVkZqfoKGmopuXkpCamqCVfHdvfXlmW1tfXlpcVlxoZG9jbmloYl5QUEA/Ozo4OTg8OzYyNDMzMzc5OTs8OTs7OT49QkBAPTs9ODw9QD08PENBPjo4PT9EP0M+Ojk/PEI/P0FEQjk6gJ6kp6Kem5+gmY+ZnaCWloqGj4iEi4qTl5SRo6Wnqq6trLOys7S4t62pqqevtLKxqq6usbKusa2lq7OssbGpq6+rq6y2sLSwq7GysaOfoqqpp663trS0trOvrKuuq7awqbKxra6npp6io6ObnZyXoqiloZ+eo5ueoZqWnaScm5aZoqefoJ+joJuUlpmWl5qfoJmVnqKZmJ2dpZ2gpKeqqaiqraulqaSlqqeqqaqsp6SkpKOimZmhnpqaoaCfpaWYnqSmpKqooqelpaGqp6mnp6ejqKWmpaGkqKesoqekoaalpaOVl52Ym5mVo6elpaSfnZ2lo6Kqo5+amZiXnJyaoaGakJOTl5ibjX93cnZ4aWJbX15cYllgZG5ta25hX2RgUE9BQDs7OTs4Ojk2MTQzNjQ3Nzc6PTo8Ozk9PUI/Pj89PDo/OTs7PD5CRUA9OTtAQT5DPDs5PzlAQEBAQkM7OXuao6OcoJ2dop2Zn6KioJibmJaYkpSQm5qWl7S0rrW4s7S4tre0uLm3tbm4ub28uKqLnLK4vLS9urW7uru4s7q/uLe5u7G3r6iusq2inJ+qsri8vL27ur+0r7GztbS3t6+1tLWysKikop+gl5Wal6SqpqahpKOkq6WlmKGko52goaKooaOgpaGck5mYmJmco56cmpudl5uZlqWam5+hqKmpqKuvr66pqKmrrKytq6irp6WjoJyfo6Ojn6Cipammmpyip6Spn6GjoqKgpaanpqSooJ+ipKGjoqiop6OloKGopqalo5mbmJuTj6GknqKfmJiVoJuhpaCfm5udnJuamZugmo2YmZiTkYaAdnh5eGNbUllUX19hbGh1a3BnaWliWVNMQDw6Ozg5Nzk3NTU2Mjg1Njc4Ojw7Ozs7QD4/QD0+Pjk6PDk2Nz47QkZCPDg7P0NDRDw+OT43PkFCP0ZDOzhwkpqblJ6bm52Vl52doqajopaXnpaXl6GblJi+t7G4uba3t7i7l5S2vbu9vcDFtaK7mKC3v7+6wcm0nbu2sra/xcGooLazurGqrrSxsLG0tLa8vL68vL3Guri3ur20r7Wxsbq4t7Kzsqqmpp+YpKSnqKSupKurtbWus6CnqqynqqmlpqCnoKGmoZOWmJ2foqSjnZ6coaChnZekmpmdoKaqqqqtrq2tsLGrrK2sqamrrqimpaalpqSkpqaeo6eppKGcoKKjpqCio5+jpJ2foqWgpJyboZ6fo6GhpaSlqaOkpaKkp6ehn52elpOcoJiZko+MjJeWn5uWnJqdnJqTlpSUmJOQmp2YiouHgIB8gnhhXllUYWhgZnNvc2l0Y2lkYltMSz46ODg5ODg5NzM0NTI1NDY2OTw8Oz08P0E/QEA9Pj44OTs4Njc/OUJFQzw7PD5DREM9QDs9Nz1DQ0BFQjw3Z4yRk4qalZiblZWYm6Knq6aVl5iQlZmhnpeXvrWztLu6ubi5woeYt6u4u8DCxbOjw6e4s72/tMTHvbS7uL62wMTErqCworW2tb2+wcPGw8O5vb/AwL2/xL28ur2+tKeqmLHAvbi1ucCzr6+qqqitp6ekr6eqtLyxtLWor7Gwr6yqoqajrJ+fpquXmqifpaWfoJydoKuwsKyiq5yYm6Cor7Kys6uorre1sq2tqaalqKulpaStqaShn6Cnnp6mqKmmnp+anqGlpqmcnaObl6KmmpuanZ+cmqGcmZ2eoKijn6GfnaWioKOioZSZmpmTj4qLhI2Qk5uPjpiVm5eYkJORkomNl5iYk4uKi32AgIVwYGFeXmpiYm53dXZubVtiUVVcTUc7PDk3OTc5Ojc0NDQxNDM3Njg8Ozs8PEBAPUA/Pj8+Ojo5Ojc6Pz5FRUU8PT1AQkJCQUI7PDhAQ0NARD87NV+MjIaFlouUlZeYl5ifpqellpWWkZebn5ual7mxtrO5vLy5urWqsryxvsG0vMe5uLuuv6fGw7/KxsnIxcXJvMLHx7+xsae8vL7FxMbJx8XGu8TAxcbAua+9vMC+vrOrqoyzu760tbfCuq2vsLWqq6aqo62kp7G2q7WyrbOtqK6vp6awr7Ktqq+zpKu1qaeopKCgnqmyuL61tbWqqaausre4t7apq7i8ubexr66noqOop6SfqKOfnqCZoZydoqSnp6GelJuaoKGlnqChnpajnZSQlpiboZqflpORlpSin5qenJudoZ6kn56VnJiPkpOPjImTkJefiZCWkZuUmJGRlZaDjJWXlpKLjIh8f4N/amZoYWtsZm51cXJ1cWZeX1xSSUU/Ojo6Nzg0ODw3NjU0MjMzNjU3PDo7PDs9QD4/QD48PTk5OTs6PDs+QkRFPj49QENDQ0REOzo4QUJCQUNAOTJbk4iEjZGKi5GRlZCSmp2fnJOSmJSdnZqXmpW2sbm1tb6+tri1uLO8vMTEusPHwb+1s8XFxr/CzcfLzsvLx8HDxsfIysXExcO7vLzBxcHFxb/DwsbFwLGTvrq/w8K2trqptLO0qauzu7uxn5uxr6ykrK60p6qpqKqtrKmlpZ6pr6uyu7q4u7e5t7O5uLOurLO0qrC1ub3Bur6+vL60urm4u7qysbS8u7q7s7Oyp6Smq6uioaCdmpudmpyXmpuenJygnZaclpuZnZ6io52UnJCNiY6OkZ6bnJWNh5KLmJiWmpybmJybnp6cmp6UjpiYmpORmZeeoZWYmpKYlJWRlJqYk4+TnZaSi5F+enx/dGtrbmRvbGhxeG95aWlhXGdhUUZEQTw5OTc2NDQ6ODQ2NTMzMjY1Nj05OTs7PT47Pj49Oz05OTs7Oz89QUNBQkJAPUBDQ0NFQjs4OUQ/P0BCPzsyV5uQkZCQh4WSjo2IjZCTlZGPjZSUm5STlpqRs7e4uLi+u7C1sri2tbbAw8G+w8LAvru+u7u8xMzEzNDLxsbAxcfLyNTLysjGv7u7vsS+xcjGxsPEw7i0wLe0vcHCucK3t7/Au66lrre8t62co7ewpq20tayupaWjqKSgoKWZqrOyvsG+urm6uLW0srG0tLO6wL7Av769u7u9vsDCt7a3tru7sru+ubi4u7a3tKyoqamrpqijnpOampyYkZKZl5GRmJqXnpiWk5acm5+elJOJiX6GiIuWlJiZkYmVkZeWlZmbmpaYl5idnpyhmJWZmZuYl5ybn56jnJ6WmJeTl5yZmZyUlp2UlpOJdnl6e3Zua2lndVpmcndzeGZmXWRbUlhJRj87Nzg4NzYxNjk3NTQzMzM2NDY7ODo8Oz08OD0+PDo7PDo9Ozs+PkRBQUNCQEBBQkNDREM9OTlCQD8/QD89MkyWmpaSk4yKmJCKi4yOkpKKiIaNkJiKj5CUl7O7tba/vb2xtrjBvby0uL/Bsbi3vsHFvbu8wsbJv8nOycHEwcfKysbKxczIzcbIxb/DwMvNz8nGw8PEwsS9uL7Bw8DEvsHPz87Gq6+2tLWroKe0s66ruLWzq6mjoq2prKatn6y1tL/Cvrm4vbawrausr7W0ur7Fv7u8urO5u7i5ubWtsLS9u7G/vLiytrmzubu0ra2orKyqqaeXnpualY2MmJSTi5WWlJyZl5WWmZKYn5mQiop+iYqKkY6Vl5OUn5mWkJSZmJmWmJOUm6GeoZiYmp2ZmZaenpibopqdnJuYmpuZlpeXlpyZlJyYfoB4eXV1ZWVpamhdam9teHdiYmBgXVhXRkU4Ojg6OTc5NDQ5NzY2NTEyMzM1Ozo9Pzs9PTo6PTs8Pjo7Pz48QkBDQkJFQj0/Q0NDQ0RFQDk6QkFBQj5CQTVCkJeUlZmSj5qQjpKRjZSVi4qHjI2UiImPkpq2u7S8xsHEwr3BxcLAtLO9v6ywr7rDysPCvs3IxbfByMW/wcLIy8rCwsTJzM3Pz8zDx8bIyMjHycfFycfIx7/Fx8TEx8jK0s/SzLy4trS4uMG+vrq9ury6vKytpqm7urm3wLK1uLLAxrq3t8Gzsa2tqau1s7u2w7a2vbWxt762s7e4sLW2v7uwvbq0q7CxsbO8urOzrqutq62xnaOjoJqQjpiXlZCclpaYlpWSnJmTm5+clpGUjpWQiYyQlZOUm56YmZKSnJedlJmSk5aZmJ2VnJ6do5yVnZ+TnKKcnKCfnaOemJSVl5ebmpmgkH99cXRxb2JhZ3VnaWh0bXhsXWRbVV9ZTEhENjw5OTg4OjUzOjY2NDQxMzUyNTs6PD47Ozw9PDs8PTw7PD89P0I/RUFCQ0M+QEFARUVERUE7Nz5DQkI+Q0I4O4+akZaalJKUjZCUlI6VlI6Pi4yJk4uIkJObt8C6xsXEw8zCwcS9vrWvt7uvr7O6wMfFxMHMy8W2ucDCwsTHytHLwsPExsnFzdDOx8zJwsHGwcvKyMbMyc3FxsXDxsXJzdDNz8zHxMDDwsnNx8XBxMfBu760sbCwwb6/wca/vri3w8K6urbAvrWyrKmvsri+tMC0tLi0t7nEua+8vrm+v8K/tbq2q6qsrq+wt768trSura2utaSlqKimmpycnZyeopydmZOQkp2VmKCdmJiVmZmZl46MlH2QkJefmZmYk5GToI6Nko+VjpCUlaKdnKSem56elpyjoKGipKOkop6amZubnJ2enIN9cnx4cGdgamp2bGlkdG5zYlxiVFdUU01HOjc7OTk3Nzo3NDg3ODQ1MjM0MjU7Ojk+Oj08Pz04Oz05OTk9PEBBQEVCQUJBQT9AP0RFREVAPDo+QkNCQENBOjSAoZeUmZiVkImUk5aTiZGMlJGOiJaKi5CXnMXLw8O8wMPHwbm9vbu4tre3rrK3uLzAwsDCx8bHurzAwsXHyMbSycHDw7+/vsTLyMrLyLy7yMfJzcjDyMnJxcXDwsHCx8fJysfMyMfIzcbLz8W3wMDAwLu7vbWzs7+/ub/DucC3u8G8uri7ub27srCvsKy5wri9ube1t7q9xb24xsjCwcLGwr28tamurrCwr7O6t7m2sK+tr7OppquprqannqSlo6OjoqCblZiekZecl5GRlZeZlZmRlJiSlYyYo5qcnp2FiZ+TfJKWlZKUlJennaCipJ+en56foaGkoqKjoaOinJ2fnqOhppl5enl/cm9mZWdjamRham1ubl5YXFZVTlBKRjk5Ozk3Njc3NjM3ODk1NjEzNTI3PDs8QDs/PDw6ODo8OTk4Pj1APz9GP0JBQz89QT5ARENDQTw5PENBQ0RBQDozbKKdlZedlo+PmJiZmIiSjZGVkI+Vjo6TlpbKy7u5urnBu7q3vsG8vLu5sa61uri4u8S6vsC+vru8wMXBxsK+xsG5u8O6uLm8vsHGwca6ucnJw8XEwMTBwsHEwcO+vsLAwMHCy8PGzMvFyNHCsL69uLq7vL63tLC5vrO8vrG5tbi7tryztbm2uba5t7GtusG6vMG/t77Ev8bDw8fHwrvAwr/Cv7iys7O1tLGut7S3tbSxrK2xp6Wlp7CtqJ+nq6ajqKWmpqCgn5SYmZSRkZWUl5OYl5qhnZ6hnKGdoaWglpSbkZeXmJqTnpmZqaSlpKWdoqCanqCkoqOcoqGjoJ6cnp6ppaiVfXuDeG5mYWRiYWJjY2piZmJaWVlcWFFORT07OTo7Nzc5OTY0OTk6NTMxNDUyNzo7OkA9Pzw8OTc3Ozs6Ojw+QD8+RDxCQURAPz49QkRCQkI+OjlCP0FCPT44NVmfnJiTmZaRlZiYmpeQkZCQk5GTlJKSkpSUxce4tbq5wrm5vMPFwri7ubGxtry6tbnAu7u5tre0tLW/ur3Aub26urS/uLW3s6+7vLfAt77Cv8G7v8C8u8W+u8HEwL6+uLzBwcu+vcnEwMDKwLHBv7u4u765tbe0uLy0vbi1tLCzvLG3tri/tr25vb65t7q+u7/Axb29y8PGw8TAw762ubq2v7i7v7y4trOyq7CwsrWzs66sq6emnqeurauiqKumpqqjp6iqo5+Ym52bmpicnJiXnJuhpZ2anqGhoKGmoJqbnJiboJ+dnJ+coKeho6SknaKfmqKgop+el6Shop+dmpieqKWhi3x5h31xY2BiYmdqZmZpZWldVVVTWU9TS0U4PzY7Ojc3OTs2NTo7PDYzMTM0MTc7OTg/PT47PDs3Njk5ODo8PUA/PkA9PT9CPjxAQUNDQT9DPTo2PEBBQDw9ODdJlJibj5OUkZWYlZGWkpWRkJGUlZSTkpKYlcHCwLq8ub62uL7EwMKxvbqytLO4vLW3vMC8vbS0sbC1t7W6wbi+uL+8vbe1t7CuuLa5v7vAwLfBvLvDtrrIuLa5u725ura7xcXKvbnFwL+8wb64xr3BwLzFuLa3tLi2tru7uLa0t7q1tLi8vbm/ucPAwLu5vLu+vcjEvcfEw7rAvb62sra4srm0usLCureysaysq62yr7Kur6ijpJ6rrKyqpKakpKiqoqemraihoaGmn6Oiop6bnKKfoKOdnJuhn6KgpKCem5eZn6GdnZ6eoaWkoaGioZ6ho5yinqCZnZijn52eoJqZoKKmnYR6g4B4cG1lZGZvaWVrZ1hYTktLSlJJTEhDOT44PTs2Ojs5Njc8ODk4NjA0MzE3OTk7Pz0+Ojw6ODg5PDg6Ozs7PD1BPj09Q0E8P0NDREA/Pzw5Nz5CREE/QDg4P4mYmoyMkI+Tl5WMkpCakpGXmJaUlJKQmpTDvsbBwby8uLi6v7a8scK2tLyxtLa4s7q9v728sq2vrLGwt7y2vLzAxLm3t7e2urm6u8C9w8C6xMK+x7i5uK23tbi6tLezu8XGy8G7xsDAv728v8nDxMW+xri1srK9uLi4vrq6uby7urS3u7q5v7zEwL+5uri/ubvFxr3Fw8Kyur27sa+2uLO3s7q+wLm2rLGrrqmqqa2qqq6mpKWnrq2ppaOio6GkpaWmoqato6Klo5+ho6Gcmpyhn6CloaCenZygnaWgnpeVmZ2fn52gn6KmpaCknpybn6Ofn5mcmZ2epJyWnKOcnqGcppZ+f4Z8a25wZ3Brc2VibF9bVEhLSkRKQkNHPzk7OD08Nzs7OTc4Ozc8PDYyNzUxNjk8PD08QTs8Ojs6OT45Ojs9PUA+RD89PkRAPz9BRkQ/Pz09OTc/QUNCQEI5Ojl3nJiLh4uQkpOWjY+TmpOQnZiSkY6QjpiSvbfHvsO+vbu+vL22uri9ure9s7OwuLi1uby8wLeqraSusLe7s72/u8S3tri2t8C/xLzCxcXHx8rJxs/CwbiutrW8vri7sr7ExMrFwcnDwr+/vr3HzMfHxMe9tbW2wb26u7/Cur/Bv722t729vcHBwL+8ube8wru3v8W7wr++tbe8vK+vt7awtLO6ubq7r6mtq62rrKaqoqeuqKWqra2vp6Sgn6ajnqKjqKOjq6Oiop6dm5ublJaZnJyfpZ6fnpmYnpejoJyXmZqZmqOjop6jo6egpqCbnaCjnp2WoJmcoKCblJegn6WcmKKQgYaBcWVsaW50bndjZ2FbYlBLVEhFRUNHQzw7OTg9Ojc6PTo4OTs3PD01MzY1MDY4OTo8O0A9PDs+PDk+OTk9Pjs/PkM8Pz5APz0/P0ZEQEE/Pjo3P0BDQz9BPTo4ZqGYj4uNlZKVlY6PlpmVl5uVjoyMjY+bk7m2wbS/vLm8w8C+wLq1trKywLmvsry8sLe7tru8q6ujsLm9vrO8vrzFuLK4ub3HycrDx8jGxsnIzM7RzMrEtbrAw8i/v7W/wL/Gxr/LxsO/wbzAw8zKx8XGwbm9vMS/wL/CyL3Hx8XFvLrEv7vBv7rAvLu7wMS9t7nCub69t7S2uLqur7WxsLCytre0t6yurKqsrKuoq6Gms6qlra+trKippaOkp5+io6Onoaeiop6cnZyamYyQlpeZnaKZnpuVkp2UoaCdmZ6fmJimpqKfoqKmoqeloqCko6GbnaCbnKKfl5WVnp6kmpafiYGDgXRvbGx0a2xuX2JeYWFNSE0/RUA/REM7Ozo6Ozo4Ozw6OTw+OTo+NDQ1NTE5OTo5PDtAPD89PTw4PDs6PDs7Pz5DPkI+QD89Pz9FRUJBQj87Nj9CRUQ8QUE6OlmfmJOSlZqVmpOQlpeclZuZlpSVkZKTnZm2uLaxuru6vsG5uca7trWypb69tLbBv62zvbS4wbGwsbS8w7y6ur68xL+3vb+9x8zGx8nGxr/ExMrIzMzNy8bCw8vOwry5vbq5wMO/yMbEwcG/xcDKycPDw8O5w769ub+8wsbCyc7Hxr66xr26v7m3wLm5vsDCvrW0vLi2u7CvsrK1r7Cvrqyus7CzsrirsbKxqrCrq6yrrLatqKyusqarrKmpoaWgpaakrKSmoaChnqGgnaCMlJeTm5+mmZ6emZOYnZ+gnp2eopuYp62ooqSgoKKqpqmhqKGlm6CgnZ2jn5SYmKKdp6Gfm4J7eod6bW13e19wY1tdX15TST5CRUlCQz5DOz42OTo7Ozs7Ozs7PT05PTU2NjIxODo5Ozs6QTs/PDw+Nzs8Ozw9PTw9QD5BQUE+PkFCQUVDQkRAPDY+Q0RFPkJEPztTmZuZmJ6dmqCalpyZn5KdlZ2boJWWlJqYur20sLu8wcTCv8XGura5sqO7vbS3xLuwtbq2ucS4tby2ur3BvLu/tr/Bv7y/usDLwsfIwL+8vL/FwsfLyMHDwMDJysLAu7uwtLu9wMXGxcW/wMK/y8fCwMjAusK7urO6usG+wMrOysS9tby8ub+5ubW1s7/Avre0s7S4rbeqr7CwsrGvq6+nr7ausrG5rra2uLSzsLGttrS6sa6srranrLKsraSjoaenqLKrqqWkp6elpaCml5ujn6SmraKeo6KanaWiop+foaWenrC0sKSlnp+kqaevp6mgq6CiopqipJ2anqGmp6+psZWCe32Cem1zeHNncF1aXlxZUUVEQ01JQUQ9Rzo6NTk7Ojw8Ojs7Oz0/Oj01NDUxMjc4ODs8O0I7Pz46OzY6PTo7Pj0/QD87QUFBPj4/QkBBQkJFPjo1OkFCST9AQkA7TJqdnZ6fnZienZmampySoJWbnp+blZGRlsW+urbDvMbCvr/Ixbe1uLe2ubu0r7e2srWzt7m8u7a7u726w7u3vbe5wLu6uLi1xcHDw7u5s7S6wb2/x8C5wLy+xcS9vrmysK64t7/Dx8PEvb2/v8PDvr/HvLy/tLSutbW8vr/OzcvCt7K4uLi9ubuxtrLIwLu2tLGwt6yzqbCtrbO3r6uuqrG1r7Gvt7O6usC/tre2sru6wLWyrbO3rLC6r7KmoqWqrK+5s7KosK+xr6qiqKGkraitrLOun6inpqWmq6Sknqaqo6ayuLOrpZyfp6anrquqpbClpaWbpKOYn6exrLW4sLKOhHl/fHZsdXpwbWhcX19ZU1BBRUhHS0BEQ0g8PTY7OTk8Ozo6Ozo9Pzw9NTU2MTM2OTg8QT5AOz1AOzs5PD04Oj08QD46Oj49Pj09PkBCQkJBRD03NDU9REc9Q0I/PEWUnqCgoJyYmpiYlZmdmZ2fm52bnJaRj5LDwMK9wrzEvLy7xbu3s7e2tru7s6CWtayvsbS0tLa4ucHAt725uLm2tb+ztLK4sbvBwMO3t62wtbi4uMK6tLu3u77Au7u8rq+us7K5wcLEw768v7u6uLbBwrW/urWur62wvcC5z8rJw7GvtbS0vbq+ubq7ysO7uravsL2xuK+ys7C3vbaur66wt7CsrLK2vbzEwrq9t7bAv8G3tbC2srGzurGxr6err6u2v7e1qbqztbmxp6uop7ausrG1uaisrK+qr7CqqKessayytr20saykqKuoqKusq6i2qaaonqadmKOuvLG7wbSmiYF8gnpzdnZ3bXBgXmVdW1RKPD4/RkY9RkNDOTo1Ozk5Pjw8Ojo8Pj4+Pjg4MzE1Nzg5Pj9BPzs6Pz08Oz09OTs8OTs6Nzs+PT1DQT8/QUJEQkE8ODU4PUNGPUREPzw/iZ2en52Xl5WUk5aZnpubmpuYlJ2Uio6Owb7Dwr6+vrm2usCxtbGzt7fCtbOrrbOoqa61r620trnDv7e6t7a2srTAtrK0uLO6wMHDubeysrK0sre+urO1sry6vLa6vrK0tLSwuL7DxsTAvb+5s6+yvLquu7Szpquorbq+uMvCv76sq7Cvs7q3ub67wMXBu7y3sLXEtb+0uLu0u8PCs7a2sbisqaWrsr23v7+7u7exvL28trGvq6uprbOvsLCrsLSpuMC2sqm0tbC3tq2spqu7s660uMKwsbG1sbK1saywsri4ubi+tLGzrqyxramvrqqyuK6trainoZ6ptr+4ur+wlol9gHxxdHd0dnFsXmJgW11OSEE/PUhDRk1EQDc3NTs6OT48PDk4PT47PT86ODMyNTc2OD8/Qj86OD4+PTw5PDk7Ozo8Ozs6PEA+QkI9QEE/QkI/PDs3OjxBRD5CQz8+QYqgm6GdlJiVlZOYmpyWm5WalY2bj4SIhru0vb+7vLm3s7y8rLOytLS2wLXAr7Kzqqqxt62pubO3wL27vLi2uraxwLq3ubi5u8HBxMO7u7a0tLC2ura0sqy8ubi1uMG6uLOxrLe8wcfDv7m6ta6lrLOwprCtqJ6gn6WttrXCt7a0pairqLC2s7K6tbu7u7W4trC1xLK+vL+8ubrFybq9vraxp6SeoamxrrW5trKxq7S3trGopp6gmaWmpKynq6y2qa+6sa2kpq2lq7GrrKmtuLawsrjBtrGxtbGvu7ayt7W1sry1urKwsbKutLKqrq2nuLWyta2uqqiosrq9wLa0qY6Ce393b3xvdXJtY1xmWFxdUk5NQT5KQkBKSUA2NjU7Nzg+Ojs4Nz4+PDs/OjkzMjc1NzU8PD48PDg+Pjw8OTk5Ozs7Pjs7OTw+P0E9PEJAPz9CQD47NjY6QERBQ0E/QUKJoJ2loJSWmJiVnqCcl5uYmZGMmYmDhoS1r7S7u7S1sLG2uq6wtLOvtbq1urC1s7GttrqurLyyuLm3u7+9ub7AtL+7vLq4vsK8wsrHvsC4ubaytLaztK+su7q4trnAw7aurqqytry9ubaysa2tn6Snp52jpp2WmZman6muuayrq5+lqKSrrq6nr6yvsbGtsa6usLmwtLy+uLm4x8W8vLu4qaKcmJufp6assq6zqaapqq6popqXl5GcmpijnqKir6ekrKapmpqemqGnp6anqa+2squ0tq+qsK+xqbm2sbWxrqy3s7avrquuq7S1ra+rq7GtsbKoraurs7W3ur2wq6GLeoJ5cnZzbXRpa11balRdXE9NSERGTEFGTUY4NjY1OjU6Pjg7OTc8PTo7PTo5MjM2Nzc3Pjs9Pjo6Pz48PDw6Ojs5Oz47PTk8Pj1CPDtAP0A/QT8+OjU1OkBFQkRBQEJBiJ+ipqGYm56dmqWpmJudmpmUjJmHhoeGrq2uuLmxsqiur7iyq7CwqrK1ubm9tbK4tLm6tbm7tbWztbu8wLu+wLS/ubm6sbrDvMLKxb+7v7+5s7SzsbGusLm5try4u7+ysrKusa65r6qrrayjqKGdnZ6XmKGVkpWXkJifqK6ko6Sgoqeio6mpoaanpaqtp6ynqKesq6yyu7SztLm6trK2ramgmpaWm52fq6yrr6Ojo6GpoJuTjo+Qk5KSmZaanaSloJ+ep5iVkpSYnqSjoaWqrK2iqaqppKmtrqW0sa6xraqprq+wraWmqqSos66trKmmpqmrpqqnq7Ksr7Oxq6mWgX+Bd3J4aHRzbmRUYGNXXFFOTEg/SFFETUM9ODg3NTo3PD46Ozw4OTw7Ozw7ODI0ODk3ODs7PDs4Oz0+Ozw8Ojk8Ojs9PTw6OkA9PDw7QD5CQEE/Pjk1ODs8RkFDRD9BQYijpqKknqCfp6Coqpufm5yZmI6Xi42PjKqpqLGvsK2lp6ayr6mmq6CvsLu1vby4wMG+vLy8ua6tr7Kyurq3t7W1vLSvtKu2urjAxMG7tby9uLKts7CvrK63trK0ta+qpJ6bnJyeqKifoKipn6GnlpuXl4+dk4+Qlo6Xm6SooKCioqKlpZ2jo6CepaCkrKSmqKSio6OrrLOuqa6urqeqraisoZyamJmYm6moqquepaObo5yVkIyPj5CTkJaVlpifnp6amaaXk4+Slp2ioKWjpqSnoKKko6Ghq6uksq2qrKyno6yuraufoaKkpK+srKmmo6KqpKqqpKmrpqmsq6agiHiDfHZ/eWJ3bG5cUGhUUE5HT0xMQ09RQD47PjM5OjU7OT07Ojk9OTk8Ozw8OzkzNjk5Njo7Pz06ODs6Pjw6PTs5Oz07PDw9PjxAPT88ODtAQEE/Pz85NDk8N0FDQkQ9QEOOqqSjoqGinaulpqimoZ6dmZ2PmJWTkJWnpKGmqKmlpKChp6uhnKKbp6u1sry9wMLCwL7AubWnpayqqLWysbCur7Knpq+jr661wbq1t7K3trK0q7K0rqqrr7CytK6lnpKYlI+ZoJ+ioJykpZ+eqJSblpeMl5GNkJeTmJ2iqp+fn6Cjpaicn6ChnKKfo6innKehoKSfrKisrKCpq6agpKimrKOdnp2Zl5qrpqmwo6WnnqCclZOQj5GQmJCWlZiXn5ibmZujmZeUlZqdoJ2nqKWgo6Kho56doKmqpa6upqipoaKqrqqnoaCio6msq6eppqShqaKlqaalpKKmpKijkn18gHV1fW1re2RoVVFjTUlIR05STUpNRztEQDwyPzg1OTs+Ozk5Ozg6PDs7Ozk5NDg7ODc7Oz48Ojk8Oj07Ozw9OTw8PD49PUE+QEJAPTc6P0FCQEA/ODU1PDpAQ0BEPkFGlq6koqWeo6KpqKipqqWmnp2imJiZmZWbop6bnqOioKOgoZqgmJiXlqGorK62t7q5ure3u66ooKGpoaCtq6qmqaSpo6SupaystLy3rLKxr7Gtta+vs7Wqp62so5yZlI6RlpeZmZ2go6KbnaWemqSXl5eWkJKRkZOal5ugpKqeoaGepqeqop+gp5+dn6SnqZ6jpp+qnaqtqq6nqLClo6Smp6ymoaShm5ier6iusqulqqqgmpiYmJWTlpqTlZWZlZqXl5ignpycl5uhm56ao6eln6GioqOcm6Gmp6aoraOppZ6kp6mkpaWhpaSsrKmmq6eioKSjpKenoaCgpaKmoIl7gH12eHxkeHpgYlJVX0hJSUtTVElSUEw5PkE2Nz02NTs6PDw5Ozs4Ojw9Ojs4NjU3OjY5Pj0+PDk5PTk9PTw+PTs7PDo+PTw/Pz9APT03Oj5AQEA/Pzg2NT08PkFCRkBAR6CupKaroaOqrK6tp6ypqKCipp6bm56aoJyalZmfn5uen56WlJOXk5OcnqOorq2sq6uvqq+pn5eepZ6epaakoKKfpqCirqusrbWytqavtKupqrSxsLC4raehnJ6alJibmpGOkZaRjI+OlJminJejmZqXmJmUmZiWnZufpaapoKajnqeurqumorGjmqSmpqqioaqiqaSosquxsqu6qKarp6urqaysp6Cgo7GtsbG0qbGvopmcnZ6hmZubmpiZm5SVmpaYnKShoJqjoZqcmZ+kop6gn6KmnZulpqWkpaijp6OepqOinqaloqWlqKykpq2noJ2dn56gpaGenqWgppmBe4F8dnZzaIJsZVxTWllNUUpOT1RMUkxBNz5CNjg8NzY6PDw9Ojw5ODo7PDo7OTc2Oj01OTw7QD03ODs3PTs9PT06Ozw4Pj09QD5BPj4+ODg8P0BAPT83NTg9Pj1BQEZAQUihqqCrq6GkqquwramtqaelpaWkoKGfnqWXl5SYmZ6YnJ2blo+VmZKSnJihnaqip6Cep6Gkn5ySnKKbn6Gjnp2gn6Ogoq+urK+xrLanrbGtpqawrq2ssKegn6Kgl5GUnKGcmZiSk5+doaSbnpuWn5qfl5uinqWhnqSfpKitraisqKSstLe2sKe0rKKtraOvpaSmoamorrWzsr23vrCssa6tqaq0sbCnq6iytbezt6yxtKOgnaWgrKGhoqCfmpiWlZ+bm5ikoaCeo6GgnpucpaCfnZyhqJ+fp6meoaOkoKagnqehn5ymo5+ipaOooKmrpZ+dnZudmqainpyjnqeQgYJ/fHh1aXd1XW1aUmBIUVVIRlVWSkJNRz1KSDhFPDY3Oz49PDo8OTg6Ojs6PDk2Njo8Nzs+PT8+OTc9OT47PEA8OkA6OkA/O0A+QUA9PDk3Oj5APzo+NzU4PT0/QUBEQEJGnKueqamipamprqimqqWmp6aoqqGlpKOmkpOVmJacmpqcmpWTmZuOk56ZqJ2unqeenKGdnpqakpienKKioKCdop+fnp+pq6esqaq0q6utq6WlqqirrKqln56ZkpKUmJmWlpaMiIuPlZ2dnZ2elp6apqCgqKWxqqeuo6uttrC0srGutri9wLqttbSwt7CutKmmpKWsqbmztbvDvMPBtrq2q6+xube8r7OwtcG8t72zs7Whq6KpqLKpqqinp5qZnpmppqCZp6Cfn6eopaSenaqhop6bn6igpKetmZ+jnp6nnqCmnpycoqGbo6KhnZympaWkn6KZnJukn6CboJyjiYWEfnZxbWl2bWhtXFhbQlZNSkdNR0JGTTw+TD00PDk2Oj0/PDs6Ojg4PDk6Ozs8NTQ6PDg5Pj4/Pjg4Pzk8Oz0/Oz1BPTo/PjxAPj8+Pz08Njs/QT07Pzg1ODw8QERCREFCQ5WqoKapo6mqqKmjoamgpqinrK6lqaWpqpSSl5mUmpqanJiYmZyamJqqoLGit6OwpqCenZ2XmZaZnpucpJ+fnaSdmp2cpKKko6Kqr6ynqaOgoayvrqqrp6Cen6Kjnp+em52clJSVlZ6emJSGnZqhm6ukq7KwubKysbKxur28vLm2uMO+v8K/trq6wMS5vbusrqexrbHCtrjCxsDIysDKv7C5ub25wr24s7vFw7zCu7ezqbKtqrO0r7Ouqa6jnauntrGsoq+loKOvsa2wpKSvo6GgmqGmoaSqqpmdoJmao6CmqKGcnqKemaSenpiYo6OhpJ6mmZuipJ6fm5ubnIeGgXt0cmtrdXJwaFdcUUVUSERJUEg+RUE0RUg5NTs9Njs8Pjw8Ojo4OTw4OTs4Ojo4Ozw3Oz49Pj02OEA5Ozs9QDw9QDk3PD07Pj0+PUI+Pjc6QUA+PD45NTg9Oz1DQEFDQkGRqqGlqqelqqimn6KnnKasp7Gyq62jqayVkpWalJecoqGbnqCinJ+psqu7sr+rr6ylnqChnZyYm5+gm6Cfn5elnZWbm5+anp2fpaannaCgrLGvp6Sko6Gfpqymn5eclJGZnZmVjIqGiIZ5bYigpKKrrLS8tsO+vrO7wcPCxcC/wsbGxcPIwsDFyM3QyMvDsre1vrK+xbu+zM3FzMvM0se+v8DCvcfGwrfDycjCwMW9ubO5urS7t7C1sqq6sa67tr66uqq3rKqquLq0u66tuKOlop6npaKjqaaZm5+Ymp2nqqegoaGkmJSjlpSakZydn6Sep5+en6KdmJmUmJSIhH56cmtkaW94amVaW0ZKTEREU0xEQkQ3Oj87NTQ5OTc5Pj87PDs7OD48Njo9OTw9OTw9Ojs9Pj4+NztBOj45PT45PT44Nzs6Ojs/Pz1CPj83OkFAPTw9ODY2PDo8QT9BQUE+kqugp66ooqulpKKipaGlqquwsq2upKmmlJWVmpaUm6SmnaGqp6KrrLy8v8PBs7K4p6Ghq6qinZ6hop6cm6CSn5+Qlp+ZkpqWnZuZo6Gvs6mhm52dn5+al5iYk42PlpeTjo2QjIKDgndzcW5wj6atrrS5xbvNx8u/wszOzczIydHMzczHycXGzNDS1c7Tyb3Av8O7xsXIxdLTzNPP09PMysLFxsbKx86/yNDLxsXGxMC7wsC+vr61vbOtvr/Cw8bExsOtvriyuLzDwcG6vLy1rqenraigoqmlmpagmpmdqKupo6SknpePm4uQmYmVmJugn6OdnZeempOTi5WPhYB5dHNlYmdyb2ZeWllDTkxDRVBJREJANTU1ODlCPTY4OkE+Ozs+PDk+PTc6PTk6PDg8PDw7Pz8+PD0+Qzw7OkA9Ojs6Ojg4ODk7QT48QD8+ODtBQTs7Pjc4Njo8PkI+Q0FAPpOvn6ivpqiro6KloKampKuoq62qrqKqo5Kcl5ebmJujrJ6frqalsarFxszOzb+wwqmlqK2tqqGdo5+cnZqpk5mhkI6gk42UkpeZpLGxq6SgnaCcmZeVk5SXkZCPjIeEg4iHg4CBgYB5cnJvbHmktrq5vsvB09LTyM3O0dPR0tHQ0dHNzs7Qxc7U1dfS183Gx8nMw8XKz8rT19HX0tXV09PIzMfNzcnSzM3TzcTHycnAxcvHyMjFvsKzs8fEy8rKzsXJv72/vMHGxMzMyMm/w7+tr7KonqKqo5qTnpyYnqaprKSlppaXipWFkZSHkpKSmZualpiQm5WQjIaRi397cnV2Z2Jod2lkVldRRE1GQElRQj1CPDoyM0A8RDw3OTxCPTs9Pzs7Pj05Oj48Oz44Ojk5Oj86Pj1APkA8Pjs+Ozk9PTw5Njo6Pj08PEA/Pjk6QEE6OT44Ojo6Oz4+PEE/QT6QrKKiqaanqKSfop2qqKOso6OnpqyiqZ+Uo5iWn56dpK+boLCrqKyxyc3U18/Gu8esrbS4rK6jn6Sjn6CkrJuWqZaNl42MjZemsK6lnZ6doaWinpuWlZaUin13cGtlYmhxb3F7hYqAdnBucXRwhbPCvsXR0NfW1tLWzdTW19TT0dPU1NLP0cPQ09bX1dbSy8nO0MvGzdLK0tXW2dXX09bYztLJztHMztDL0s+/x8bJwsvLy87PxcbHtr/Kv9LMy8/Fyce/w8LIzszP0M7MysfNuLe7qJ+mq6efmJ6jnp2qpa2pqKiSlYiQhIyRho2MiJOVmZCWjJiSj4aHjIR8eHN2cGNgZXJiXVJcSUpGQUVIST47QDg9NDU4NTo3Njo8QD07Pjw7OUA7OTo8Ozs8Nz09Ozo+Oz08Pjw/Ojo8Ozs5Oz89OTU7PD48PD0/Pz46O0BCOzk/OTg7PT0+PzxBQEQ8hqugnKegp6Oim6CbqaSlqaCfoaGmn6ifmKSim6mmoqasmqSwsamotdDU19rSx8bLtLbCxrK2qaKlpqGiq7WnmrGhlpWMkKatq5yVmaGdm6Gin52em5aKeGlkYV9fX19eX2BeYmx1c3Fwb2xycXWSxMfG1NXW19fT1s/V1NrU1M/P1dTU0dHM0c7T19bT1dDP0tPRydPRyNDY19jR19LX2dXWzM7PyczRy87Qv8XBxsXOzNDQ0cjLzMDKy8XTzsvOx8PJxsbIy8rU09DUz9LM0sG5xbGlqLWup5qorKWdsqiws6ysk4+TjoiLjoOPi4SQjpmNk4+Zj4+ChYx7enFzdG1hY2ltX1ZQX0pKQkZDUU0/PD40NDo9NTI3NTU8PEA8Ozw6OTpAOjg7Oj46PTg+Ojo8QD08OTs9Pzk6Pz07PTw9PTo2PD0/QD08PT0+OjxAQjs5PDc0Oj48Pz89RkFEPYKknKClnaWlo5mcnaSeo6OfnZ+doJqnnpyhqZ+vrquqq52mrrioq7fY1NXZ2dHO0MC8zMm3wK+nq6mjpLG2s6O2qp+doaqpoZiWmJqbnaGemp2elH5yZmNjX19hYF9hYF9gYF9gZm1wcG5rb3J2d5vMwNLV09jY1tnR0tLXz9POy9PN1dTRys/M09bS0dbN0NXV0cbR1MrR1NXWztLQ2NjY18vIzsPIzsvKzL/Jv8fIzc3PytDNzsvOz8fKz9DKzsrByMbJzMrL0dLM09HRz8/Kvce5sK27uLWqtrCtqLits7+7sZqPn5SRjo2IjpCFkY2ZjJGRlY6RgIWIeXZvcG9rYmVucGFXXFpJRkZETFdFO0A8MzM8PTg2ODU1Oz5APTk8PDg8Pjk8QDtAOj04Pjk4Oj88PTg7PkI6Oj08OkE9PTw6Nj08P0A9PDs9Pjg7QEE9Ojw4ODs+PD0+OkVCRT6Bn5mlp6Cfo6eam5+cl56eoZqdmpyappufpKeeuLa1ta2lra6+tbHA2dPX2tzWz83Lw9PQwsKyq62urKazsrmrs7epo5+clpSXnJ6fn56VlpiVimxfX15hZGJgYGFhYGBhXl9fXl1ibXJvb3N0dXZ5pL7L1dHW1NPY1s7O08vNzsXOytLSz8bOzc3UzM7TzcrX1dDM0dTLzM/R08rN0dXS1dXKwMnBxczCyMnCzMLFx8rKzsrMzNDN08vFx8/Mx8fKxMbAxcnLzc/Qxs/Ozc3Mz8XHwLe5vcLDvcO5srO+sLvDxLaqmKWhmZaRlZWSi5SNmpGUlI+PlIKJhXhwcmttaGBgcWhYWGhWTUdMSVBQQjtEPjs2Nzo4OTo1Nj09QTw6PD05PD05PT06Pjo8ODs9OTtAPD47Pj5BPDk9Pj1CPTs3NzU/PDw/PDw7PDw4O0FAPDo8OTs7Ozw9QTpFQUU+hJ6bqK2epKSqnJ6fmJKXm5+am56ZmaKVoamppcXDwb+7tbKxx8O5y9XW2drb2MzNz8nW1sXEuLK2qqSurbm5sbLAoZeOjZiWkJSSkZaXlpGMfWZiY2JgXV5hY2JgX2BgYWFgX11bXWdycXFyc3FtcnmkxtPPy9DP1NXJxMnJxsa/w8XOzsfFx83K0cjLzs3G0dLPzszUysfKzc7Hxs/Sy9DPxbrEvsbJvMLGyM7EwsfAxs3Hw8vJy8/Hw8PPyMbBxsfDv8DHy8vLzsLKy8jHzNDExce6x8PIyMLPwL28v7DByse6vaqxsqelnaKcmJCbkKSZl5mRlZiJj4J3bnRka2BeZnFhW1dgR0hIR0lNVEc/Sj02NDM1NTw8NDg9PT06Oz08OTo7OT89OTw7PDg6PDo6QD1APD09Pjw6Qz48Pz04ODk6QD4/Pjw7Ozs7ODo+Pzw7Ojc5Oz49Oz49RkFDPYOgm6qupa6qq5qdoJeUjpedmpmgmpqcm6WzsazJzcrIxL69us3NxtDV1dna29jQytDQ0tTKxbq+vrCpt6u/urmzpZKOjpaQhoOEhIJ+hYWAdGBbXl5eYF5gY2RjX11dXl9gYF9bWlxha3Jyb29rbG9vfbjRyMnKz8vNxLq/w7u7urm+yMbCw8DDx8rJyMrHwcXLxsjLzcnEwcnJwcHL0MTLyL+5wbrFx72/xc7Kw7/DusnHyLrHxsTKwL3By8bFw73FvLy/w8TLxMS7v8nCxcfSxcHIvsrJxsfG0MPDxsOvxMvHxMq3v7y6tKmspaWYn5iso6GlmqOgm5R7dnJ0ZmlaYW5tWltYUURMRkJHRExDRlI/NTQzMzQ/PDM6PDw7OTw8PDg7PTtBPTo8Ojs3Oz05Oz07PTs6OD4+PEI+Oz88OTk7Pz07QD48Ozk5OTk6Oz06PDo2OTw+PDs+O0NCRD5/pZypsqm0rrCdnp6YnImUm5man6Kfmp2ov7i8y9DRzMfCw8fNz87N1dDW2djZ0MzUzs/Qy8S4xsG2tbyxwLa6rJGMk5eHe4CFhoB2eHVzcV9aW11gYWJjZGRlZGBcXF1dX15gW1laXGJvcm9raWxwb3OPxrzJxczAxsGwtrqysrSyscG8u7u5uMDBwcW+vbm9v7nEysXGwr3GwLe7xMm/wsm7t7q6xcK+vMHNwsa+vbXAvcO6vMa7wrmzvMXDwsK2v7a1vr+6y8K8tbrIur+9y8PBxcLFyMXIxdDGwszHssbJw87NwcXCv72yt7Czp6ioubGlrbCrrayUeXZ3amVoYGhvY1ZeWUpFSkZIS0FFQkVJQDk6NjQ4ODUzOzo7PDk8PDs5Ozk6QD46Ojw6Nzo7Nzo7Oz88OjxAPUA/PT8/Oz07O0A8Pj4+Ojk5ODk3ODo8PDw7OTs8Pjs7PjpAQEU+fqygrLWqt7SyoZ6fl5qNlJaan52mop2et8bCxMjO0svKysfNzc/SydHG1tXW2M/M0MjNyMrFvcrBsrW6t7u2r5GNioyFeYCGhoB+hHx0dWRcXF1eYGBiY2JiZWViXV1bXF5cXl1aW11daHNxbWdnbnByeZ29zMDDusC4rbCwp6qtrKe4tLa0s7KzurW9sbewtK6yu8K8wcS8v7q1srq+wLjHuLO7tcDCvLe9xsDDu7Wusra6vrPEt7q1q7i8vcC9sLq2r7a6ssW8tq67v7S2tMW8vsLFv8PExcfLxcDGxrvHy8DPycfDxsHDt8O+vra5vsa/rLW6tbe2jnh0eGZnZWJrbl5WXmBGS0hISkZCQ0FERT88OjU2NTYzMzs6Oz06Ozs6Oz44PEE9PDo7ODc5OTk7PDo+Ozk+Pz1APz5CQD1AOjo+Oz89PTk6Ojo4NTY7PT48PDo7OT49OT86PEBAPIi3pquzsby8sa2foJmUlJiXnqujr6qnpMbLzsjGyc7M0M3OycvJzMrLxtHP09HPx8rGysXEwLzPvbO5vbm4t5uOh4mKe3l+h4Z3eIF9dGheXV1dX2BfYGRhXmNlY19fXFteXF1eWltbXV9scG1oZmpubnJ8pMe/ubi1sKusp56iqqeeq6yzramrqbOttrCyqK6mrLK8urbDubq5sKu1ubu0wrmvv7C9vLu1u8e5wratqqiwscC1uLyvsKexs7S7vKuttaWutq66sbCqua+tu627uLu/v725wr/GwsXAvMbByMu4xcfFv8fDw7rExsK7xcnMy7O5wry6sohydnZraWFibGhZV1dbQUxLTUlFQUM/RkE7OTo5OTU4NTQ6Ojk7PD07Ojs+ODtAPD05Ojc5Pjk7PDo4Ozs6Pj45QT0/QD87Pjo7PDo9PDw4OTg5NzY4PDw9Ozw6OTs+PTs/Ozs+QDyKwKuouLe5w62zqZ2ZlJaZoZymsLWxt6bGz9LMxMbCxdDIz8PEx8HGxsXFzMPKzMPEwcfAury7yre0u721tauRiZCQfHl+ioZ6e4SBeG5eXV1dXV9gX19kY2JjY2JgX15bW1paXVpaWlpdZG1vaGdnaWtucoGtubC1rqalp6eaoKSgmpylq62jp6KrqayqsKOmn6qttbaxvbmvt6+orri0tLu3s7yut7m0sbvBscGupaiiq7Gys6e8qquoq6yttLSmqK6hpK+psqWnqK6lqLessLK3ubq7sby9vr7Ev7XBwcfIt7/AxbfEwsC7v8TDvsTIzMq/vsPAwKmGcnNyamldYW9kV1ZYUEhaUlNLRkZFPj9AOjc4OTc3NjQzNzo5OTo8Ozs8PDc7PTs7Ozw4OT44PTs8Njo9Oz89N0E+P0A/Ojw8Oj05Ojs6Nzc3ODg3OTw7PDs5Ozo8OTc5Pjw+P0E7jMKvrry3usSwtrCbmZWcmKqpsLGztb2vxtHQzcTIu7vMw8zAvcq5wMXAvMy6w8fFur3Evrq3vcW4tri7rrGVg4mNgXt+gH94dH98c3dmX11dXF5fYF5fY2NhYmBgX15dXFpYWVtbWVhaXF9ma2ZlZ2Voa29yhaqlrKagnKGllJ6jm5eRoaOqo6KfpaWnpa2fnZukpauyr7a3p7Csp6q0q7S5sLa0rLa4sa+6ubG3pJ+jn6axp6unuaqkpqeop7KtoKemnpqkpqyen6ekn6Cxra2ssbOys7C1vLa7wcGyur7DwbG5ucKzwL2/tbi7vb68wsbEwsO+v8Ogg3dwa2FlX2tvYFVZX0hOaE9UR0VKRjw9QD06Ozs4MjU1MzY5Ojg7OTo6PDo3PD88PDs8ODg8OTw6Ozc4Ojo8OTg+Oj89OTg8Ojs9Ojc2NzY3Nzg2NjY7Ojo7OTs7PDg1OTw6Pj5AO43Itba9uLrBu761oJ6UnaGmurars7O7s8XQyczDx7m4ycLOwbrLub3Iu7bHu7fExrO+xby3sLm/u7Cztq+ihIeHgn15dnRwbWtqanFpX2BdXFxdX2BfYWNiYGBgYF1cW1xcWFlYWFhWWFtdXmRjYmVnZ2dqbW+Inamgl5WaoZabopiVjZ6hoqabn5+jpaGnnpqim5+qsKyxtaKpqqmrrKS1uK23r6yytK6zta6xqp+dnqOisqSlqbitoaamn6isq5mfoJ6ZnZ+lmpmjnJudr6mrp6qrrK2wsriuuLm7sLa7u7qrs7K5sr20trGxtbS/tb2/vcLBurq9l4N6cmtfZV5kZFhUWF5JV11LUEdJSkZBPD8/QDs/PDA0NTM1Ojs5Ojg5OTw8Nz4/Oz07Ozg4PDg5ODw3ODo7Ozo7Pzo9Ozc4PDo9PDc0Nzc2NzU3NDY2Ozc5Ojs6ODo5ODo7OTo8PzuJyba4vru3wcHBtKSkmZqkpsCyr7astLfG0MnJwce8vMXF0MG8yru7wbu1xbi1wcGzwsS8raq1ubensbKpi4aIgHlzbnBua2NeYmZmXV1eXV1dXF1fYGFiY2NiYV9cW1taW1lYWFdXV1hYWFteYmRkZWZmaGlrco2onZSUlJuXm6GWlpCcoaGonZucpaahpJufoJqYra2tr7KgpaKtq6ehtbCxsaynrrKnubOmtqGinpqjoa2ioam1qqKjpp2lpqOWmJ6XmJudn5mXnZycm6yhq6aio6Wtq7KzqrSwsqqyubSvqa+ysrK3s62prK6xt7C6tbm9vrazsZSEeXVlXmVeW1lWU1pVTFxRTEpFSEtJQj0/QUFAQDoyNDUyNDk5ODk7OTo9PDY9Pzs8Pjs3Ozs3Nzc+Njo+Ozo4Oj07PD06Ozw6PTs4Nzk3NDY1NTQ2Nzg1Ojo4Ojk5PDg3Ojg5PkA6gci9uL2/tr69v7OdpaOYpbHCtba9rbW4w83JyMHGuMLByNC6w8bAtry9tsO6tr/Btbu/u6qmsbqxp7Gvmn2FhYB5cHF0cWhlZGllY1xcW1tdXVxbXmBhXl9fYF5cW1pcWllYVldXVlhXWFhWV2FkZWNkZWRkaGp2opyUlI+Vl5efl5mUmJ+eoZyWoaGoo5+dqJybmqqmrrCrm6Ojt6qgn66otqmmpqywo7ewo7agopuYmKumoZusuK+ioaScoZ+gk5WhlJaWm5iXlpeclJ+pnamjoZyjqqqwrai0q6qmrbKwpaqusrGvsK6vpqensq6xtK+7s7m3raOUgXl1ZF5hVllXU1JUS01eTFBMR0hMS0U8QD48Qjw7NzY1MzQ5ODg5OTo5Pjo4Pj47PTw8Nz49Njc2PTc7PTs5Nzk7Ozw+OTk6Ozo4Njc2NTQ1MzEwNDU2Nzk6ODo5Ojo3Ojs5OT1AOnbAvLS5wrG+uLyunaeno6q7wL3Aua60uMLNyMfExb7HusrNtcTFxLG/v7nAwbrAwLm6vbeoqLG7pqihpImBfnhyamxydHBpaGVkZ2JcXFpZWlxcXF1eXVxbXF5cW1xaW1xaWFZXV1ZXWFdXV1VbY2NiYmNiY2RmaoGWk5WLkpSTm5iclpaboJyflaCfpqWkpaaenJ+kn6qvpp+io7aooKGiqLOhpaekr6WwrKu0nqCdlZSpoaGUrLGwnqKjnZ6Ym5OLoZSRk5eYkpeXmJadppumoaKZpKSkq6OlsKelo6urraWorq6uq6ipqbOlpquvtLGuu7Wwr66fknl2cmVhXFpdWE5MUUdSYU1WUE9KTU9FQkQ/OT02OTo3NjQ1OTk7OTg4Nzw4OT0+Oz47PDY5Ojc7Njs3Ozs6ODU6Ozo7OzY8Ozg4NDY4NjMzMjEuLzI1NTY7Ojg7Nzg3Njw7Ojs7QTh4u7uxtb2wu7K3rJ6kpq23u7zBxbqxubbFysvBxMfHybjIxrXFwsiuurzCvMLAwb28t7q2pqeytZ6iipiHgHdvZGJnaWhmaGpnam1gXVxbWlpZWlxdXFtcXl9cWllbWVlZW1dVWFdUVFdVU1RSVWBgX2BhX2BhY2RpgZSTiZGOk5KTnJSVlqOZoJacoKWhraWjo6KjoZuqqqWZnqWxqaCgnaSqnaehnaysqaitraKhopSXopqcj6upsJufop+el5iTip6SjZKSlY+YmJOboaKcpKChlaCho6Sao6uloqSqo6uupa2xqaalpqa1pqmorbO1tLm6r6msnotycG9gW1dWVVFGUU9IWlxPUkpUS1NMRUdJQzg7Oz08ODY2Njo5Ozo6NzY5Nzc6Ozo9PD02Ozw4PjU5ODo4ODY1OTo7PDk3Pzw5Njc4NDUyMTIxLi4xNDI2Ojg2OTg2OTg5ODo7OUA5e7W0rbS7srCssq2dp6evubmzv8i6tsCvxsnOvMLLzcm3y8C0wMfMsLa9x7vBx8O9v7e6taSqr66dmYeOg3x1aWpqbWhqbG5ra21lXVxcW1tcWlhaXVtbXmBgXFhYWllYV1hXVFZWVVRVVVJTT1FZXVxdXl9fX19iZG2Oj4SRho+RjpmTlJKcmqKcm6CnqKqnqqWopKKYpK6klJmlr6mfm5iaoJ6umZupsp+kpp+jpKCUk5uWlZGpqa2anKChoJqUkIyZjouQjJKMlpSQnaGgopybopWboKKgl6Goo6Koq6Crr6Stt6Wio6Ksramoq6+zuLK9tbOrr5iDcnJoW1lZU1VSRVlMUVxZTVROUExRUklOSUI8Pz9BPz02NTc5OTw8OTg3Ojc5Ojs8PT47Nzs7Oj02Nzo7ODk3Njk4OTo2Oj05OTU3NzU3MTE0MS0rLzQzNDk4ODo6ODo6NzQ4PTg/OX6zrqiztq6op6+tm6morLe2rLvKu7a/rMzHxrnCz9DJtca+ur7GzLWxvcS8wsXDvcGzua+lqq+rnpeGgXd4b25pbm5ucWdnaWdkXVpbW1tbXFtZWltcXF5fX1xYWFlYV1hXVlVUU1VWVVVUU05QUVlaWlpdXFxeX2Bkfo2Bi3+LkIqSjZeRlpmioJufqqmmraqmr6KnmZ+soJSVpKinnZePjpmdrpaXpqmYnpyTpaGekZCSkpKVp6qkmZmanZ2WjoyLlIaIjYOQipGUkKCdoKOXlZ+VmqChnZKbpaWnqKigsbCmsbymn6OstKutp7C0sLm1v7GtsauQfHByYlZUVU5SSUdWUVJSTExYTUpMTlJHTUtBQ0ZEQz5ANzU4ODk7OTo3Ojo3PD06O0A+Ojk7OTo/NzU5Ojo4NzY5NTg3Nzk7ODU1NzY2NjEzMjAtKi4xMDI4Nzc7OTk7ODk0ODs4QDh/s62msbeqpaKwq52qp6mysKS2xrS5urPLxrq8w8vRzLO5ur7Axce2tLe8srq7xL7CsbOtsK6wrJyiiGtobW9yb3FrcGtkZmdlXlpZWllaWlpbWlpaXFxdXFpYWFhZWVdYV1VVVFJTVVNWVVJOTk5SV1hZWVlZXFxdYWqAen92iY2HkImYiZSTmJqYnaibn6qkpKqcp5mgpZuSj56impeWhIORmqOPk6KclZWWh6KampOLjoqPmaOnnJWVl5uQkoeUjoyBi42AkIqRkpGgmZ+hlZOYmJShpJiMmaSmqKahoLSyp7K3oJyit6yqraSysqa1vLWrq7GjiHhybV1OUFFMT0NOTk5QTEZOTktKTk5RSE1KQUdLSEhDPTg1ODg4OTo7Njk6Njg7OTk+PDg6Pjk7Pzg3ODk6ODg2ODU3Njg4OTc0NTc3ODIwMzAxKyktLzEyNzc2Ojk5OTk4NDk4OEE3d7anpLawpKejqaWgqaWks6qissO1tbKzx8e4u8TKzce1r7y/uLzEs7OutqKstcS6u6+qrLSvr6CXqH1eYGdzcXZxam5pZmhoal9YWVhYWFlZWVpaWVtbXFxZWFhXWVlYVVZSU1JQUVRRU1VRTk1LTFNXV1ZYWFlYW11hb3N2cISIgoeAkYOOipSQk52gjpqboqCjmKSWoZuVjIeYmoxzjYJ9jJaWhZCZkJONjnqZj5yMgol/iZifop6Qk5iWhI6Ck35+dImOepCGkpCQnJqZmZCVj52NoqKNiZqgoaSjm6K0r6yvrJ+YpbmmpbChsa6csLuqqa+qmYF2cmJWTFFPUE1DU05MUU1DUFBISE1TTUhKSkRKTEVKSjw3NDk4ODg7OzY5Ozc6PDk6Ojs3OT85PkA3OTo8ODk3NjQ0NDU4NzQzMTI1ODUvMDEwMikoLC0xMjc2NDc4OTo6NjU6ODdBN3e3oqO0qKWlqKOmpaalprOnpbTBuLC0sMrGubrCz8e/ta+9w6+xx7Ktp6yVo62/uLGwoKitrKqWlaJyV1ZgaGdpaGluY2poZ2JcWFhYWFhZWVlZWVlaW1tbWVlZVldXV1NUUE5QTk9PUFNUUU1NSkhOU1NTVFVVV1lbXWlscmx/hXx0Tlhyj4KXho2cl4qTkJ6XnJWUlpSOloh/k4lfO1dve4qTiX+LkYyPhYZyioSWgXmCeoWTnZSDlY6Qj4KGfZJ4cW+FjX6JgJCNj5eZmJOKj4ich56XhoeWnpqhoJenr6itqaielq20oqatmayrmKezoamto5J8cW1fWk5TUVZMRFRKUE1NRk9PSkVMUU1LT0pJTU9GSUg9NzU5OTk5OTo3Ojs6Pj44Oj09Njo/OD4/NTg5Ozc5Njc1MzMzNzYwLi0vMzQ0MTEwLy8oKSsrLTM4NTQ3Nzk8Ojc5Ozg2QTl4t6CiraGmpqmgp6inoqmwqKe0wrmxtbDJw7m0v8/AurGxuMSrrsmup6KdhZqiuq2nqJampaOgl4+WaVBOUlZaWlddXmJnY19ZV1dXWFhYWVpZWFlYWVpaWllYWFZXV1VTUk5MS0hHYlxNT1JNS0hGSE5RUU1QUlRWWFpgbW9peoJ0UEJAf5WRkX2JlIyEio2ajJaVipKIhpWFeIh/YEpRbniKkYR8hIyJhH5/bn5/lHd1dniEjZlwUY2IioZ7fniUdmd3hYh+ioiVio2QkZaLg4mHlISai4GEkpuWnpyUpKOnqaWjnpuxq6GkpJGmqpahqZyipqiHc2tlXVtIUVFTTUlVTVNJTExQSUdGSk5MTVRLUVFPRklDPDc2OTo4Ojs7ODo7OD4/OTk+PTc7PDY7OzQ3ODs2Nzc1MzQ0Njk2LzMvLjExNTIyMS8sJykrKiw0ODMzOTc5Ojk5Ojo6Oj85dracoqadn6Guoaeopaanr6yqtry2uLazwry3qLvJubepqre4rbbAqqKbkoKPmbKfopqNoJaYlJGLjGVNTE5OT0xNUVdbXFpYWlVVVlZWV1lZWFhZWFhZWVlaWFhWVldVU1BNSkVAQJtrc3NJTUtERERJTk9oWU5RU1RVWm6DdHd+amldVY+JlIl0f4aBe4WMkoCRmYuPe4aPf3V/eHNudXB0jY2BeX2JqoR5emh2e45wcm14gIqMknh6gHuAdnJyknhndYSEhIR6lYmIioyKgH+Diox/k4N6gI+YlJuVkZ+dqJ6fn52gqaWfnZiNqKSToJ+Vnp6kf3FmYFxcSlZPUUdLWFJPSk1NU0pKSkxQSExRTFJUTUVIQTw3ODs5OT49Ojs8OThAPzo6Pj03PT03OTkzNzc5NTY3NTI1MjU3Mi8yLiwvLzIwMC8tKygoKS4xMjYyMTk4Nzk4Nzc1Ojw8N3aumKOhmJyes6mvqaWsq7Cxqr20sry4tru1s6C4u7OrnZ+tq6y1s6WelpGYhpSklp2Mg5eJj4mGhoNmSklKSUdGSEhQVFRUV1dTVFVVVVZXV1dYWFhYWFlYWVlXV1VWVVNQS0Y+OTNOPH6eTUhKREA9QURqlH5MT1FSU1ZedYN9eWd3jZeYjo99Z3mAdnh/iY98hJiSgXKHj3x2e29rfq18c5CKf3uGkoB9f3RmdnyFbG9oc3yJjIeAbHlxfXBtdY9yaHGAfY5wQ4qEgoOEf3d3eoqEfYt6dH6Oko+YipKam6OXmZ2anZ6inZaNi6Wbj52XjpaYjnVta2VhWVdYVFFKU1ZUT1BPUVdLTktPT0pRT0lPT0tGRDw7Nzk7Ojo/PTk8Ojk5Pz87ODw9Nzw5OTk5MjY2ODU2NjMzNjIxMjI0LiwsLS4uLTAtKyonJyouMTM2Mi84NzY5NjY1Mjc5OTV5ppefnpagprCsrqunqbCvsay8uKy7vrm0rqmbsaitnJCXnqesp6SbnZOHln2OlZKVgHyKeoWAf3+BZUpHSEZCQENESUxMTVFSUFFTVVRUVVZXV1dYWFlZWVlZWVlWVlRTUUtENzhmNzA/qGlOSEM9OzpEioV6WkpOUFFUWF5lcHJtiKeqwH51eWJ7d298eYiPeXyLhW9tjJF4c3hqan+CcpaRi4F9ln9JkphuaHd+gmxpY2x5hZCShmtzbHxucnuFaW1wfnONiIOFen1+enZvdHSFgXmBd3B8joyKk4OWl5iakJOWl5mXnpeMg4mfkoqSjYaQln1saG1ubVdVV1RSUVlPU1VVVFlWTU5ITktOTktDSU5HRT86ODk7OTk6Pjw5PDs6Oj0+Ojg6Ozk/ODY4NzI3NTc1NTQxNDQyLzAyNCorKiotListKigqKCcsLTEyNTAsNTU2NzQ4NUhBODk1d5mRm5manqStr6Ktqqi1r66stL+rvMK/pqOalaWYn46FjJaipJublJaPdpF9hIuQj3x4fnR9eHV3fGZPRUdEQDw+PkFGR0dLS0tNUFJSUlRUVFRWVldXWFlaWVlaV1ZUU1BMRTFAmjMganJBmW87PDk1PICChl9JTU9PUldaUllcYKeIYpppdHplfm9tf3qLiHWBiIZ0bJmRdHN8amudjkx5hJKJhI5nMXaGc2x+fYN0ZmV0foSEhYBmaWx1a3B/e2dwcHtuko2Oe3N9fXFwbnVtgn53eXRqeYmCiImDlpOSkIuNkZSVj5eOgHmIl4iGiYZ/kId1aWluZ2NXUVlXWFlcTlBWV1pZT0lJRUpKSEdCQUZEQ0c9OTk4Ozk6OTw6OTs6OjpAPDk6PDk4Pjc4NzcxNTI0NDUzMzY0NTAzMS4qKisqLCwrKykoKycpLCwyMjYtKzU3NzU0NzhpTzg7NW6SiJmRmpakqK2esp6muq6rsrDCsrvDx5uXj5SZi46GeoWRmpaPko6SinOJhHeLj4x/dnd1eHZveHNpVUZJRD88Ozk6P0BBRERFR0pMT1FRUVFSU1RVVlZYWlpZWFZVVFNQS0U4MC9cYLNHOVhQOzk0NDGWuotITE1PUFFWTEFJUUlir7OgcXx4bX1scYOBhYF5g4aGeXKglHR4gHN1lIc1cZ2onY6hoYSihHZwhnuGe3OMrY2IgGhmYmltcW1vgnVpb1h1b46akXZsf3t8bXJucH96c3VtYnaEf4aAhZCRiouKkouRjIuPg3Z5i4+AfoOAfY54cG5ual5aW11bWVhhYFNPXFtZWExISkZKRz9DQUJHPkNEPTs5Nz07Ojs7OTo5OTs6Pzw4OD06ODs2NjY1MTEyMTM1MzQ3NTUzMS4vLCwrKSopKSoqKikoKikrLzNETTIxNjY2NDM8dlI3PTdikoGSiJaRnaSnnq+VpbSorbCuwbO6wcaXkIyUkIGJfW6CkZOKhIuJkIh3hIVumIqMf3l7e3F7dHxrb15KUEc+QDc0NTg7Ozw9PkBCRUlMTExNTlBRUlVVVldYWVhWVVRTUExFPDUqnUtbQC1nSTk0Lz6Sg6muX0dMTU5QTDdDTVJTREqGdoB8fHZ+bHeHh3x9hYJ/jH52opl5foaAhJmFm5xhhqqfnYuCkI16doh+iYeOc4qXj4N7XGRxdHp7d4ptZ2lheW+Fj4J6boF3c4R6cXN5d2tuaV13h32HfIiHj4CLk5eDjYaNh31xhYCEfHV3e3yHdG1xcmRlXlpaXVNbZ15YUVZZXVdHS0tFTEc/RkBEQz5BQT07OTc8Ozs9PDo6OTk7Oz0+Nzk+OTk4Njc1NDI0NDAwNDY0NTY1NC0sKSsoJycnJigoKSkoKCsrKy8wMFVxPDIzMzMxRX5XND05XIx3iX+UjJGdnZ+mkaCqn7Cpr8Cxu8W6lo+RlIh6hnZrgIySg36LhZCNeYSCdKKFjX9/g4Fzg4F9bHlsU1hMQUUzMTEyNjc2ODg6PD9CRUdGR0pLTU9QUVNUVVdWVlZUU1BNRkA6Mj0gI5ZjjFs1MzExaT9Hb0lGSUxNT1JMS1RdWVJKaYSIe4l5fHJ8j4t6fIiGfpeHdqGZiIePkpSljaypSIatr6+KgICTioGLgYSRqIeAmJiKnHNsfIGGh32OaGdneH5thYaBhXGEhUdrgHhxeXZobWtfd32DiH+IhYx6lZ6ciouJkoB7dYt2fHhtb3d+fXFxcGpaXFtaY2NXZ2ZcVlBRWFpRRExMR09JREZDQ0FAQ0E9OTc4Ojo6Ozs6ODg4Ojo/PjY7Pjc1OTU3NzMzNDQyMzY2NTY3Njg7REZMTU1MQzcrIiUnKykrKywvMDArbnUyMjQyMEyBXDU9PF6EdHx+ioWHkY+WmJKXoJ2soKe5r7O9tJeNkouYi310cX+Kk39+jYOUlX2Hf4alh4mAg4iGeYmKgHWFeV9jVkxDNjAuLzIzMTMzNjY4Oj0/P0JFR0hKTE5RVFRVVFRWVVNRT0dDPzgwLCOHWz4/ODQuXZZwc6NVRklLTU5QV2BZcFpcXmqNk4eVgISChZGTfoWJkYCaloKgoZiVm5qlrZOZu7Gnu8jEp4qMoaSOk4mAkHtyg56fkZx+doWFi4+HkGlob4OAdIyGhItxhoJ2h4B7doV9bnZ1Z4GUj4aJiYiJiKKro5aJj5iAe4KKe3pvZ2t4fXd8cWljXFlZXGldYWdgWk9MTlhTUklRS0ROR0NLRENBRERBPDo4Nz08Ojw6ODg3Nzg6PT04PD02ODc1NjYyMzQ0NTU3Njg2NzxCQj88ODo+Q1FeZVxHMicmLCwtLS4xKD+MWy4zMTBPg180PztudnBneIN7gIyAgZGPi5qapJyhrKarr7CXkpGEoZSEeHeAjZR9f5KGk5Z/i4GSm46EgYKMjIKKjoWAioBtcGpeQ0E0LS0vLy8vMDIyMzQ3Nzk7PT9CREhKT1FSU1JTU1RSUE9IREI8ODcvOUM+PDw2My5sk5dNUEhKS0xLTlZgY39nZ211nZuPmpOTi46PmoiTj52LoKGSo6mlo6yTqLaip8HCrsiveLqUmnyMoZ6ZhJKEgo+hnpOZkoSKhY+YkJZscHWJi4GVjI2Pdo+EcWyFgYqXkoOFiHKJoZeHk4qPkJeltqmbjZaig4eThX6Aa2prfX59f3FfW2JeWWZqXGxsX1hLSE9TUU5OTEZJUURETkZCQ0VHQj46OTc9PDo7Ojk4Nzc2Nzs6Nj06Nzg1NDU2MzQ1NTY2NjY4NTU2MzEwLiosLCkoKS46UGFcQCwoLSsrMCwncog3MjQwT4RiM0A8dW5oWXCDcHWHcXaRhn6XlpqUn5+bp6CqlpOYnmhmpJp9hZOSeoGSiZKSfYuFmZKRg4CBi46JhpKIhImFeHh/aE5SPi8vLiwvLi0vMDAwMjEyNDU3Oz9DRk5QUlRQUVFTUU5QSUVFPjs8OkNGPz48NzUyPD9SNUhISExMTU5SXm+KfHOBfaCdm6emopmhl6KVnJ+onqmrn6isqaq1l6u+q7bIybfI0c++m6Bwaaqon4STkYWcoJqamaeRkYiVoZmad3p+lJiRoZKWl4GUnnt2lZKrs4mNl6B9lZ6cjpOWmqSjp7awnpGaqIiXkI6CiWxzc3t8eW5mXltfX2FnY2BnZ11SRUtLUU9KSk1GRk1DSE1GRkNCR0RBOjg1PDw4OTk5NzU2NTg+NzU9ODQ3NDU3NTQ1NDY5NTg6NjE2ODYzLzAuLSosLy4tJyMqO1hiQigqLDEtKEuXXjA2M1GFZjNBQGliX1BxdWBufWF3jn18lI6Oip+Sl56VnKqYnqpCRH2HiYiYjXmCjYuOjXyKhpCRj4KDgYmMioWThYKGiYGAh3dfYlA0NjAtMS8sLjAwLi8uLjAwMTU+QUFNUVJTUFJUVVNOU0xFRUA8Pj1GSEBBQDg2NjI8OTtGSEdJSk5PUVlthpB3lYujp6q1vbilrqysqKm1rLG3srKtu7Gzvpyzw6y7ycu4w7+3paOwsqysqqOKlpiFpaagopiCppmNoqqnpIeFk6OgoKqhpKmOnLCLlaSnuLucoaOwk6Odo56RpKKssK2ztqOVpquJmoqTi5V6e36De2VeZlpjYF1iY15mZ2BbT0RJSFRPRkhMRktHRkdIQUtGQ0ZGQTs4Nz08ODg6OTc0NjU4PDU0PDc2OjU0NjQ0NzM5PDM4PDIwMjU1MS8xLi0qKi8sLSooKiYlNVhYLywwLCwwhIE4NzFQhWg1QUNbWFRMaWNXanBYeoV2gpOFiIKcg5KRjJLayJ2Wc1aXiI+InI98hoyPi4p7iYOHkY+DhYGMhoWIkoaChImGh4eHcW5hQEU2NDwzLzExMC0sKy0xLy00P0RBTlZRUlNVVVdVTVxRR0dEPD4+RkhDREE4Ozw1Qzs9RktJR0hST1BXgZOghK6js6qywcfEq7PFtq20wLO4vra/tcG2u7ukuMaptsnHtr65tKijtK2wsJuZkpqfiaevqqSVd5+kl6GrsbOYlqmtqK61u7K6rK+1orGssrW8uLWutaCnqKOom6mwrrO6uLmonLiqjaWPkpSghnqBgHJXX2JVZGBgYV9fZmBcVUpERUxWUklKS0VKSEVBQEBLREJNRjw4Njc7PDk3Ojk4NjU1NTcxMTw4ODk1NDY2NDk3Pj0zODkxLjAxMjExMzAsKiwuLCsrKyooJyopRVowMCovK2iSTzYwUodqNkFFV1FKTFxaUWNkV3p1cYGUfYSGk3aGfoCNe7+7o7yCtJSTjpuPhIiPk4qJeoeBjJONiIWCjoCBiY+Gf4aIhYqHkXp5b11XQEVOPDY6NDZBQjc2NC8vN0NIQ1FcT1FVWFVcV09fVUlLSkFAPkdLRkZEOz5AN0Q3P0JKSkVHV1RQXo+kraSytMO2uMHMyre8xL2ztMG3uMK1v7C4dLG0prrFpLDGubGzsrSopLa2qrCgopabopKlsa2lraynpJigrLO6oqmyubW7vsy/xcW9vbPCuLq4v7i7uLqtrbGmsaquvrG9vMPDrZm7qZWuj5iZq4l+gHloVWFgV2ljaWVWW2RaV1VKR0dMUkhESUtBSUQ+P0JCTEBATUQ5OTY2OTo/Njo5OTY2MjQ2LzE5NTk5MzY0NjI3Oz0/NjoxLi81Nzo6NjUwKigsLS0tLCwqKCgrKyhFUy8qMDBKj2s1MlCHbTY/RlJMQUxSV1RZVlp3anB/j4SBjoRve3J4iGK5oZqjiZWUlpOUlI6Ql5KHh3yHgY6WioGEgYp6fIuIhnyKgoGLhJV9eHp1ZlBcZEdFTDpRZGBbXlNGPztIUEVbY1FRWVlaZ1pTYGFNU09FQT9JSkhFRkFAQzxENkI/SEdLTVRaVF6Ur7i1u7nJwLu9ys28vcG8uLa8u7e+tbqyxmF1sqWxmp6rvqqlqKuqpKKztaCrp56Vlp6Yn66lp6elnqOUoqews6eysry2wb3TycnTxsLFzMLKw8G+vr+8vLi1sLm3t8O6xr7EybGeuquirI+mqbeKgHxvXV5eXFVgXWhmU1liV1NXSUVGT0tAPkhEPUtCPUJAPUY+O0hANzk2Mzc5PjQ4OTo1NzA0NS8yNjM4OTM3NDUyNj84QD5HS1JUVFJQUFFSUUpBOS8sLCwqKygoLC0rL1A+KC40OIB9PDJLiHE5PkNLRUBKTVBSTFFdaG1scZCNhpBzbHJyc4jVwLaaoI2VmZmRjpeSlpaOhoh9h4ONlop/g4CCeXuLhId7i3mBioKXf3R9emxmcHZZXVxQZWViYGVkXVtYWFxOZG1VUm1uX29fWGdlVVlUSkRCS0tIRkhISEhCSTlEQEhLVFRWXVpbk7nAub64xsG7ucrLu7a6tri5tLi1ta63t5lkdamerXBeoq2cmKGim6Seq6WUn5+QlI6WmJionqafn5qZg6OdrKSqsKy3sLy41NDO1s/JzNLMz87Kx8DAwsq9wb3BwcXExsrAyc+0pLyxtbCcrLm9mn13aVtdWVdbX1hhYlFcYVRSTENCRkhGPEBGPkJJQkBEPTpFPj1KPzQ3NTM1Oz00Njg5NzcwMjIvMjQxNjk3NzU1NTVEM0VMTT41MTAwMDY6NDc3QElPSjsuJioqKC0uLyxATSsvNTRtiUkwSIl0Pz5CREBDREdLT0RSXFppYHCXk5GUbmxvdHWHs6yhoZ+LmZyZjY2VkZuShYqKf4mHjJCMiXyBg3N7ioOFe4p0gYqHlX90e3lsbXV8aXNlaWxoZmppaGBmaWltWm50l62kvYiHZ1tvaF1aWVRIS09QSktQTFNRSExBSkZLUF9fYmdqYpi4x7C6tLu+trHFx7awubGxu62zsqisuK2NtqienKeaTpqejI+glpGnmKWVipOTiJGJkJGSnZuhmJuVloeemaaarK+or6ezs9TU1NbRy8/T1M7Tz8zFwsrQv8rJy8nSyM3Ow9DSuLDEvcS6pre7xaJ+bGFaWltWXlZZZFpQXVhPUkNCSEZESjtBRD5CSD9AQjg7RD5AST01NjY1NTs6Njg3NjU0LzEwMTQ2Mjc4ODc1MzY3QzVCOD8tMCwxMzQ4PTk3LC4sMTtGTD0pLCguMDAwN0s/LTQ2VIhXMESHd0M7Qj5FQkFDSk0/VVlTZldzkJGZgmhycHl5g6GqnqaXjJubmIuOlZGajn2Ji4aOi4uLkIh8hYJwf4eChnuHcoOSjI9+cXl1bHF4f3J7bnhzbGmAcG1jaW5weWl4fX7Lv8Pfp25jeG5kW2FgS1BSVU5ZXlBdXU1RTlRRVVRcbm53g3KXrristaiwtqutvcGyq7WmpbmnrK+irLSkj7Gum5iYjJGUkYSPm4GNp5KciYOLhIqJhIuElJWXl5SbkJyYmZmenauspKeirKzO0tXRzcvS09PQ1NHOyMPU0cjO0tPT1s3S0cXS1sbBz8jIw6m/uNCcdmtiWl9bVV5RXFpQUFVRT0k+QUdCQ0Y9QUI/RkU+QD86PT08PEpBNDU0NjU8ODg4NjY0NDEyLzAzNTI2NzY4NTMzOz08RT1AMTErLzM0OT81OTAxMDIyLTJFTzMpLzMuMzI9TjI0OEN9XzJBhnREOj09ST5AQ0ZIPFZSTU9bdYeGi3dsd3B9foCgnp6hjI2Zk5SLjJOPloV5hZCRj4yKiJGHf4N7cn6Agod6hXaFk5GJgG93c2xzfXx3fHOCeHFrgHJyaXByenlye77Lm3+NsoR2coV3aWFpXURaWltXZmRYZWtUWF1dYWNeY3h7f4yCmaqkpKKgoammqrG5q6a0o6KuoqSuo6eyoImmm5WTkYqSj4iClIlrlaONmYSBhn6Rg4OUl62LlY6Vmo6FkpCdl6evoaCgpaSoyM3Px8LL0dPR1NLO083G1tPN1NjW1tjV19XK1drNytjW0cutxMPMh29rYF1cVlJXUltQSkhKSktAOzo7RUJEPUNEPkhDP0NCOzw5PDpHQjQ2NTQ0PDU2ODc1NDMyNTAvMjU0Njc0NTU0NDw+PUU/QTYyLy0xNjs9MDgxLzI1NC8tLjtSMDE3LzUzMkVEMjg+bmI1PYF0TTk5QEk8QUQ/QTtQTEZLWXGAdn5pc3lygoqAnZWelIWLlomPiomOiI+AeISUmYuNiYiLiX+EeXN7fYOHd4B7h5GXgYRveHFudn92eH10hnx5bId2dW59doR1eXyeto08QYvGpX6NfWplV0lDZWNmY2hqZG95W19maGxuaW6Bg4mSjJ6foJ6Rl5mgo6SmsqSlsqCipZ+iqaKjspyHn5KSk5GLj4uHhI+EfpycjI2ChIV6lH+CqpajjJKLmJOLfZeKmpGqs5ianKecpr3Dxbi2xc3R0NLQy9LLydTO0dXa19fY1NnYzdjbzsna2tLWv8zNtHRza2FaV1BTUFhVRUdLSkZGPjo3OkBCQzpHRUBFREJEQTs/Ozs3REM3NTY1NTswNjg5NDQzMzQxMDE0NTU4NzU0NDQ5QD5EQkM8MzMuNkZUV09RSkFKRj8yKiguQlQyOTI1NC83Szc1PGBiQTxzdlY4N0FIOj9CPjw5UUVDSlRsbm9wYnFxdIaNfZeRnot/h5KDiYaFioKIfXiFl5eJj4OHhod7hXlxe3uEhnZ7ho6OnnqNcH1wcHqAcnuBcoSHgG6OenV3fX2DdYB9h4mwdFmqwreNkoFwbmM9XmhycXFwbnd3gmZpb3J2eXJ6i4ePlJKblqCWiIyTnJ+bn6ugoaycopqaoKafoKyajJqNkZOOhX2Ih4OFi46gmZSIg4d+bJl6hJmHiJOMjpWMhnubiJOPrquTlZefmKautbyorb3Hy8jJy8vPycTSytTX2NfY19Tb19Pa29bQ2trS1snVzJN1d2ZlWFdOUVJcR0NGSUk/Qj49ODo+QDw+ST1AQkFBRUE+Pzo4N0RCNzU1NDc5LjU2NjQzNTUzMjMyMzY0NzU1MzQ1OEVCRENFQjU2PEZOU01bbmZjbnNrYFY+LDRMRzg2NTQzM0JGND1XX2hMdXheODs/Rjw8QTw6OUQ+Q0dSa19tZGJmbHaAiHGRkJuAeYCOfoOBgoV/hHx9hJiOh4x/hoeBd4N5b3t7h4J0epKejqF2kHaDdHWBfnSAhG+BkIJvkoV1fYKFeneHfIm4xqXDyriClpyPeHBmTmVjgnqCd4WhkYt5eXd7hIB8hHZtlJaVlpCYkYOJj5eal5emnZigl5+Tk5ijnpuslpGRi42Tg4yFiYmBho+RnpyaiIWMgYaXe4iJn5ePiY6Li4J8oIiQirygmJOXmpyopqWtnqe1v7+/uMfJzc7FzcnR1dXU2dXX29TX2drb19va2djO28aDdnZkZmFdUlVVVE1LRE5EOz09PTk6PD85PkE3Pj9APT8+PTk4NjdDQTY0NTU9ODA2NjU1NDc3NDU2MTM4NTQ1NjQ1NTdISD1ESkU3OTI1O0g+Ozk7N0lQXFpSVVhLOVQ+Ozk1MzI3STg9TllNSHh4ZDU9PkM9PEA6Njo+PkBFUV9ZZmFdXGl0enlsiY2Sd3Z6inx+gH+AfoZ7foKRioWGeoWIfHZ+dW59fYd+dH+SnpGgg5J8hn54j355i4pvg5uBdJmHfoKKhXx+kXuQqY+Qw6C9jJuknH6KhX2Jc4yLgHOmmpyYlIV7j5GJhGlHcKGknoyMkZKFiIuRk5WPnZuTlJGXjYyWn52UoZWTjo6RjH6Qj46LhImSlpmfn4iMlJGdkYOMf6aZiIWOg4aEgKSFiou3l52RlJahpqCdnZ2jrra5tKvAxsrQyMfMz9PS0tjS1dfA19jZ29ja2tnZ19u3dXV0Z2ZiVF1ZUk9OSERMQz49Pzk5Ozo6Ojw+NkE+Pz09OTo7OzM3REA4Mzc4PjcwNjg4MzU3PDM3ODA0OTc2NzU1NTQ2RlA1RE5JODkzOEFLPTszQ0BJPDpEV048TVRITj85NjMzMz5DO1tYPjVZeXBaPDxBPD0+ODU4OT89RFJTUlheVlhmbW1taYGOinFzeIp7e4B8f3yIe318i4eCfnWDhnpzenRtgX6EfneFm6GbnpSTgIyIf5iHgJySboiphXuhjH2RjoOJhZ1/m5GKjaOin5Gkr6CLkYuFi4GThldyrYufq5yQg5mckJCOW4KikYKNn5OVjIeIjJKSjJSVlZCMj4qIlpydj5aXkoyTlIaAjImSjoqKnZeYo6OGk52VoIuKiY6ckIOJj4CDh4WkhIuQspickpSXoaCemZKbnaeyuKylvcLHzcjGz8vPzM7Xz9HUrtbV2NrY2trX1tnanWx5cWNjWlpVUVVXQ0BJRD8/Pzo0OTo7Nzo8OzQ8PD89Pjc7OjoxOkc9OjI3PUA1MDY3NzI1NT82NTs1NTg1ODo1NzczNUhSN0dPSzk5ND1FSkI+MUZDTEI5ODpHWEA1SFdJNjYyMjM6RUNlWD8mX3lpX3o+Pjk8Ozg4OzxAO0JRS0tTWVBUY2J5bWJ+kYNvbniLeXp/e4F9h3x8d4aFgHNwhYJ7dXd2dIWChH1/kqain6ail4qdkJSXi4qol3KKs42EqJKEmZSFmo2jlqCYk4mbnqKTqbCfkZWRjo6IloxvjbeEmsTIsp2ipp2cmJaRspBkpM3HlY6Gh4mQko2Nk5WKhYqKhpaanI+RlZOHlZiEgJCMmYiOkKuXl6SjiJmelZqJj4eYl4qFj42Bf4ePpIiNk6ial5OWmKGYn5mTnJuisrSlo73BvsfGxcjIycLK08zN1KjS0dbW1tja1NPazn9ve2RgW1tbTEhUWkJCSEQ8Qj44Mzc8PDo5PjY0Ojo8OjcyPzo5MjlJOj42N0JDMzI6OTYyNjQ+PTQ7PjY5NDk7NTc5NDRLUTxKUUs5QTdCR0lANjRKRUxGPjs4OEVUQTc+XDg2MjE0OjtFYFhBRmF0aExjWj41Ozo6NTs6PTpFTUZIU1dTUkJjgkd2gY59fG1+iHl7fnuCgoN/d3eAg3xtbot/e314eHyFh4p+iqKzp6Oqs6KXp6ClpJaVrqKDkbiVkrOajaKhjKWcsKOknZmRp5aomayvpJiVlpWQi5ial6HAjqPJuKuco6aumJKbnbKdhYaoopyYhYmJjpWMi5OPiIGGh4mTmJWMjJSTh5SYhoSSkJx1kZmylpeloYecmZKPi5GKl5uJi5eOhn6MmJ6JkJCbmpqTmJeflKCdlJ6boLGuoqS4vrTFx8S9w8PAxs3KydOmzs3U0tDW2NPQ2LpvdnJZXlNdVU5HSU5FQUNFNT87Nzc6Pzw8Nz00MzY2OTc3ND41OzU8TDw+OzxCQTc1PDs0Mjc3P0A2P0A3ODQ5ODc7PDU1T01EUFJMOEA9RUFHQTU6SkVORUQ6NkFAQlM+OURPMzIzNTc1PXZcPFJcdGlaTV1TPD04ODQ2Nz06SkZER05aXFlKZmA7SYSLenpuhYZ6fYR4gYaBfnB4fX59b3ONen6CfHmGi4mGhJKmu6yosb2vpa2zs6mkorCsipq1naO5ppWtpZaqrbinpKOgmqmYqqSusKqamZyUlpGXoJiau7uuyqFqt7irsJWZnqOsk5e+o16qsoOKio2Uh5F8jo59g4aOkJSViIiTloyQlY2LjZeYk52ZtJeVq52KnJSRjpGSjJmbi5OekIuKlp+hjJSNl5mdkpuYnpShoJScnaWuqKGktLirwsjEtbq9vMXHx8LRocbKzc3F19bRy9SfbXdlWVdRXFBORUM/PUNCQjhAODg1P0c9PDY8MzUzNDU0NTRCNDk6Qk06QjtBSEM7OkA8NzQ2PEI5P0BCODc0Ojo2Pjw0N1RLQ1VRSjc8OklBREA0QUpITkJBPzZEQTxKTkQvVD0yNTQ6RUpcWEpaUW1ncHBEaWBLSTY3NTc6PkpAQ0lQZEhiYGJwSUCLin6Bc4aHfYKIdYOKgn9ufXx9f3B3h3eOgod8jY+MhoyZqcHAr73Gu7O0wL21rauztouosq6uvqubu6Worbm5q6emoqKko6qvsrGqnpykmZuYmJ+jpqWSpLqvqcC8ra6yuaWkqH6Ih5ytvbCCi4yLkIOOg5GPeoGIkI2NnImIj5eNjJWXlJGal52om7GakaycjpqPko6UkJCWl4+RoJGJlZujrJSWj5ScnZKgnZuYn6GUmp6mpaSio7CypsHGw6+wurfFxMO/zabHxMfEvdbRzcXKhXBvXllXXFlMSkJLQUZIP0FAQzs6NT5BPj01PTc+MzMzMjQxQTE3QEJOPkdAQ05DQT1DPTs4NkNDNUJJQjo4Nzg6NUI+NzlWS0RXT0Y4PTRLQEM+NEVLSE4+QkE2QkI/QlNFNThQMTQ1Ozw4O0Q+OUxqal07V1JkS2daVU43OUdEP0NGXGVGYGlnWl1dk4yMiXuHjIeDjHWHkYqBb357gn9xfoF6lXqSlJSYkJOWp7PGyb/BzMLDuce9u6+ruruYs7e6ssCupcCkq7C7vaquq6OjnqerrrWwqpygq5yhnJafsLWnjKO7u7bBvKypnbOlpKiUhY6qxMOkgouPh4iEhpWUjXqDjZGPkaGMjJSSjomXn5iTmZWXpqCvnIyrnI2Wj5GRlZWOkZWSj6CUh5efobOelJmTn6CXpJ6an5uglJiepaOmpqSvraXAxMOuqLe2ycO+ts+yxL/EvLPRysjCtHF1aVlVWWdRTEhDTUtMSkFCPkRFPDVBRTw7Mz04QjMzMjI2M0EwNUlFTj5JQEhSQEg+Q0A7Pj1GQTVBVUA7OTk4PDdFPjg+VkpDV09HOD80TEBCOzVKS0NMP0I/PEJGPUFITDkrRzwzNjc0NjRBPzdPYU9hRS89PjZrbGpgQDpIPj9FQmVaTWVcZVRiapmNloqMiJOQhol5h5SQgXKAe41/eIeCgpB5jaGWqJmambq9x8jJwdLJysLNvcKzrby+qLrAvbvEt6zBqayzvL+qsKqkpaSsrrOttrWhoLCfpaKZo7S9qpypvcKktrevrJSyrKysl4eaqqalkYKMk6WWioF1ipJ5hY6SkJ6gk4+Ti4+NlKOZl5yVlKOeqp6RpZqMj4+PlZaIfI+Vk5KjmpWgopy1pZCelqSjoaWdnaWYnZWXm6Sjqaeisqyou8DDr6Wzt8zAua/Es7u+wrmtwsPCwJdpdl5VVFlYSkpMSUZERElEQ0JETDo0REk6OzQ9OEYuMTIyNDJCMjZTSE88SkJKUUVLQ0RFOkVMQjw3RVY9Oz04OT88ST86RVVJQVdRRzdBOks6Qjc5Sk1CSUBDPjxERzxCQ089MjBIMzY2MTcwPUI6PWpqSks1UVMzU3BwZE47RD1ARj5pSF9YYVpjY1aej52Ol46ekomKf4qgk4R4hX+Vf3+QiIqRgJahma6npJjCvcfDx8XTzs7Ny7zCuLC6vLS9y7vDwra3vK2zv7m9rq+ooKmotq6tqbK3m5+toqehnqu3uKqlr7/Fsr26s6irtrSurpeWpaynn5GNkrLFp5aOfJKVfIeSmY+qmZiTk4+SlZOlnZOdmZOho6KcmJ+Yi4yPjp2IWpCXl5KXpJllmKKfsqWVoZWqq6mmmp6ml5iWmJSgo6ilnrarqbm7w7SltLbLwLiqtquyu7iuqLi6vbd/aGtXVFJTTUVKUk1LP0JIRUVJSEc5NkZNOz43PkFLLjMyMDI1QzU1T1ZOPExGS1JMT0hHST5JUT86OElTOzs/Nzk+RExCQEhTS0BXUEY6QT9HNkE3O0hNQ0U7Qz40RkU6QkFCRzkvOkEzNjAzPkdEOTQ9dGRNRztFKzpmfGdWOz5AQkZCcEVqSVJlYUxGpZScl6KXqZaMkYOIppOIgoeCnISDlZCQlI+aop6vvq+hxrzExMbGzs7O0sq/u7ayu7u7vs+1xL65ubezsbWzuLOrp5yrrLmqqKevsJikr6SnpKW1wLGsrLS/w7rAurSoura5tK+Wpa2vrqSLk5ShjXTCmn2XmoSOl5mMsZWbmpWSkpmZpaOVoJqWmqmdm6CgmYqNj5WcYEqWnJqUmqWWVJavn6+cnqOUrq2qpJmgpZOTmJiNm5+nopm0qKqzu7u7qrCyyMC5pqyrrbKyo6GysrSkbWtjWVdNT0pET1BQUjtIS0lISkNEPjpLVT9BOj1FTTA3NTQ0OkI0NE1XTztKS09VTlFKUEhISk9CPD5NUjs+PTg6PENSPkRIUklCV05JQEJBRjM+NThKS0NBPUM7NUVBOkE/PkhANSpCNTIsPmNdZzozNXRkZUBSNyYjM31oVzs6QkNAPVFFV1NzYldGSKqXmaCiqK+ZkZeHi6iWjoiThaCHhJ2Xj52gmqOktcm1qcW5wsTIysnIzM3Hv7uzrrm5wcHMtci6wrm1urCvr7O1pqObqrS1qqmmrayapa6lpKisur+orLa4v8LAvrmzs8Wyub6tpK+1rLmmiJuXppt2v5+EmZ6Ok5qajK6XoZybl5San6GpnqifmZqqmqGnnpiQjZGdg252kqKalZ2inZGusqOrlKepl6qso6KepKeSkZmch5Scop2Wsaapq7m2vbKyrr65t6Cjp6ilppybrampi19iXl1PSktGR01KVk09TkZPS01CREQ8UVY9QUFCRE8xOD03Nj9CNzVVWE8/SE5RWVNQUVVLUUpKRUFFTVE/Pz04PTtHUjxFRFFCR1lNS0FIREU6OjM5S0lCPkNCOTlDPjxAPjs7RzctMj4tMYJoTnpcLzBraGA8PUJCODZ6Zlc7Oj0uLVJgTVVIfmVeSEWrlZuin7uvmZSgjJOrm5GSk4mrjYahnoyjrJSjpLbGvrTAucLCx8nFws3Iwr65sq+6tcHCyrXGssK8tbqqqK2tsKKjmKq0u6appquqnamvp6Oqq727qK29tbi+x7y3trnCsr/Btaq2t6y+pY+jmJKioL2fiZqhmZefno+3n6mcpqKbnKGaqKSzoJudppyoqp6YlZCUm4uWiYykoZSdop2gtK+lpZKvqpmqqZycoqKokJSUn4KPnp6blamkoaGztLq0rai2srOenaOlm5eUmKqhnnVcWl1cSEdFRkxQSU5FR0hDU0xKQkVHQVdTQ0g9QUdRMTtCNzpCRjc5XFlLQUxQVFVTTVdSTlVKRUBKSk5POURANT08TlFDPz9QP0VaTUpBS0RHQDUzPUlHPz1FQTk3QTs8QDw8M0A8Lyc7KkiRQjpTSjAsW29XNzE8Kh1CgGRUNDktMTlmXEZDQ51wYkdFp5ekn57DrZyXpZiaqpyWmpqPqpaVp6aVrayZoqu2xMO8vrbBwsDHxL/Mxbu9ubKwubO/wse1v7C8t7m2pqSrq62goZmqqsSipKmrpp6sr6uiqam+t6etv7K5t8e2tbm5wLPAw7i2s7SwvaOXo5eUnJSuoJCio6Wjo6CQvaWpnamrnJyhm6WevaKZo5+iqayhnZeOlp6TnoePhI2Tn6SgnrWsppyVsKaZrqWcmaicn4yYlJ6DjqCZm5KlpJqYq7G1saqlqq6sm5igoJKOkJWonpRlX1dfW01IR0lOTEhGRElBPlFJQTxHSUlcUk9LPUlPVTVCRjk+SEc1Q2FbS0JOUlVXVlFYVFJVSUA4UlFQTTpHQTRDSFFTSUM7Qz5HVktDQE8+SzwwNjtHRj47RkE1NT85Oj85OzE1RDAtLC9Ndlw0S1o1LE1uVzwtPSkeI3piUTVDS1E5bVFGPEt4ZWFWS6Kao5yexayhn6yfnq6gkqOflqSgpqmsmLaxo6qztsXEvb+1wMK7yMK+yce2uLW0sbO0t8HFtr6xuLW5tJ+mrKqsnZ6epaTBpZ+praCkqa2voqaovLWmsb25t7bEsrS4u8C0xcK5ua+ztbWjnaWVkpShrqCZop6pqKyjmsKsqZ6srpubnpmmoL2hnaSYq6uspqGajZqfkp6Jjld/lp+loaC4qqaTmLSinrCfnZmulZ2NmJOcgY6fl5WNoaOWkKWtsaupoqKlpZWVnZiLjpGSpJ6IXmFYYl9LR0pKTkZFQUdLPz1KQjk5SktOXVFRST1MV1w5Rkk9RE1JOEhiXExDTFBTWVlWV09aXklBPVdRSkw/SD81SExYU0hBOkBBRFBIPz5RPks3MDk5RkU7OEc/LjY+Nzg+NzcvMT85MSUxUVVtW0pPMTA9Z1dEMTc9LSt3YFM2U1trV3FHRTY9dWVcS02enqGZn8SopqG0op2zqJOrpaCjn6yprJ27sKistrHHxcHCssPDvcbDvMTJvK+wtq2wta++xLS5srC6tKyZqLGpqpqdpaGnwa2brLGbqqOusKmkqLy2p7e7vrC3xK2zs8PAtMi0vListLatqqKmlpWVpKyin6Cbp6uwr6+7saagqaiamZiToqO4oKGjkrCwrKWmn5OinpWej5CNlZ6bop6ntKemjJeym6KtmZyarI+dk5WSmX+RoJWOjZ+glIulq6+lpqKcoJ6RkpqThYqRjZudfl9kWWZkSUhMSVNBQ0BJSDs7Rj85OU9OVl5SU0o/UF5dPUhQQkxMSTlOY1xMRUxSVFlbU1VPXGJIQT9aUUFIQUtCN0ZFTEtNPztCSEROQj07TkBBMy85N0NCOTdGOys2PDQ2PDI1LS80QDErJ1Z0U2VPPzEwNGJbTTIzPjA8dl1eP1tUXWVwQDg7SJZ3ZUE0nqOfnKDDqaSqs6KktaqWs6ynoaSyrK6pu7KtsbW0xsDEwrTAxL7JxLW/x8G0q7WosLmsv8OzuK+ttrmlmKqyq6uYn6aXrbu0m6iwmqygrbSyp6u5sqi6tLmzucCqt7LEvrbHqMCvrre1qaesoZiXkqaloqKYmaWvuK6ytbagn6mkmpSWlKSgt6KlpZawsrKnq6ain5qam5WXqJ+gmKGer7Kipo2WrZikqpaXnaKPmoySlpiFlZ6Ti5CbnZOKqKiqoqahmJ6Vi46Zj4GFlIiTnndhZ1tqaUxPTU5UPUNBTkM6Okk/NzdST11eUlZRQVdgXEJKU0hWS0g6VWRcTkZPTltXW1JQUVhdR0FCW1BCRz5OQzlIR0hPUD8/Q0lCTEI8MklBOTQxNzdCPjs3RTcrNjkxNDgwMS0vLjw2LSNCcWdzazIzLzFbYlozMzgwNnBbYkgwNElvZ1VDV0aMeWZDO6OjnaGmv6eor7GiqrWrnrqxrKOrtLaxsLm3sLe4uMW9w8e9vcTCxsC4wMXAuam2pKy7rcDBt7eqrbK6opStsa2ylqSnkaq5qp+msJyroK+0s6uptbatvK20s7m3rLixw7vAwKfEq7G3r6mrq6eemJmroaKhkZihsa+zrLC5mpupn5qXk5inoLeppqOisbG0rLOoraCcoKCbnqWcopedo7Ovm5+Qk6SZn6eZk6Gdk5eIk5aSlZackoiQmpiUjqiopp+inJebkoWOmYt9i5WEjZloZmtgbG1XUFFbVUFCRVRAOztJQTc6WFBkXlBXV0VZX15OTVJOXktKPlljXk5IUE9cVVlQS1RXWkk/RFhQREY/TkA9SUdHUVBCPURFQk0/OjFEPzc3NTQ3Pz05NUU0Kzc1LzI1MS0tLiwxPSonKz1ccD0+MS4wZFpkQDE2NDdnWWBGKD84bH1nW1Y7iXtjQz2nn52iqr2iqrCspLK5qqa2tayhrbW9r7O4u7q+t7fAwr/JxLnEw8C/t8O8wLautaert7G7vb60qa6xtp6Wq66nrpemqI6nu5+krLOeq6KxsLOsqbW0tb2usbK1rLC0s8G7xresvbCxuKytqqOypp6lqqCkl5Can7Oqs6urs5qdp5yblo6hpqW0rqihra6usai0rbKqpJyfqKSelaKZm6i1qZeZkZGdmZ2fnY+qnJWXhJSWip2Ym5OKjZaWmpampaOgnZaVl5N/j5SFe42SgouUZGpxZm9xXkZZZ1ZEQ01XRFo5SEI2Pl1RaFxOWl1HW15eT05SWGRKSkJcYl9QTE1PWFdYUEpWVldMPUVVSkVEQU1AQUZISFFQQTtHREZLPTg3Qj02ODcxOT48NjVEMCs4MC8wNS8qLC8tKj0sLCUyKyo1SzEvJ19fYFUxNTA9YFZeOCpDM1lVXGdLNox6ZkxApJqhpa23payqpq+ut6qvtryop7G3xrextr3Bw7W1usS+zMa5w8C5vrnDt8C4srSsqbq2urm+tKmtsLWXmKesqaybq6uOq76dq62xo6ugsa2zrq21sri4qq6vsai1r7W7vMqzqre2sbSvrqahtKCbqa2gppaWm5qyo66hpq+XoaSampOOo6aos6qip7Otq7alr7G1r6OZnaynmpefm5mrt6KXk5COmJyhl5aTqp2akn+Rl4ydm5iWkIqUkp6ZpKKioJiWkpOVeouPhXuMioKKkWptd2x0e2FGYWtZSUdaWj17SkZENkFiVGlbTVxiS1xdW1JTUmJgTEtFX2BgUUxJUFdWVU9HV1ZVTjpJVklIP0NLP0VESEhRTkE/SEhIRTw3PT46NzU2MDk/ODY2QiwtOCwvMDQsKCwvLSo3NigoOS4kOks1LiJVX1RfLzUoQ19RXC4qQS9KR1BbRzNjWVVLRJmXobKpsqqspqSvrraquLa6pay0t8q7tLu6v7+1s7fDwMzIvMO8tb2/v7e+vLG8rae6ube1wraqrbC3lJanrqupo7CplK+6pKyxs6eoo7K0sbKwtLG3s6mvrLKnt6+3tMTGt6m2t6yxramno7agoKiyoaWVnJqVsp6onKCqjqmjnpuWmKampbioo7K1rKiyqK6xtaukmaCrqJucnpyUqbiclI6OipebopePl6Sfm5SCkJWPnJuXlpWIlo+XmqecpKCRlpGQlXaEj4d7hIGDi4psb3Z0e35cTGZtXEtOY1w+YntHSThHZ1dmXExeY01ZWVdVWFRpXU9PSGBdX1BKSFFWVVJLSFdVVk04TVpORUBGSz9IQkNLU00/P0xPSEA7Oj47NjswNDE8PTQ1OD8pMDcpMS4yKSksLC0rLTkkMDQyJTlCNy4jQU5HZTI3J0diTFYlLUEuPUVMUTwzcmtJQ0ORmaWvpa2vq6ilsbO0q7iyuKGstbnJua3Bu8K4s7G1wsLOxb/BvbO8v766vryyw6ipubC1tb+8rquysZugp7GtpqavpZ2yta2qsbGsqai1u620srSts62qrKisqbitsrDIwbmlurGpra2lqK6xpqWkr6SpnJ6dm7Cao6Ojo5Gtn6SgoKKrpqe6pay2tqarrKmtsLWuo56jqKqboJubkqOzmY+JjYaQoZ+UjJSbnpGRg42Skpyal5WUh5eSlZmnnKCejJORjpB3fY6FfHt8hYiIcHJxfXx8XFNkb15OWGZcRkSWW0c7Tm1YYlxNYGJOVldWV1RYZ11RUkxjWVtUS0dPVFNOR0lWU1xOO1BeSUJESEpBRT8/S1NPPjpOTUM8PD45OjU9KzMyPTYyNDk6KDQ1KS8rMSgpKywtKiY1Ki8mMCkzODoxJiozQmM6NipIZUhKKzpHPjNCSFMsPpBrO0dIj5yqrKKqsaSppbS1srW2srKirK69zLqtwLrHsbSttMHD0cXGvsCyvsDCu763u8SnrLassre8wK+rsayfo6etqamlsKOqsqqwq6+usK6rs7yntrCyqbKpq6Wlo626raqyw7q2rbupqaisqaexpaqlo6+qqKKfnKOtlaWemJ6ZrJ2ip6miraakrqy4s7KiqqOgq6+wrJ2fpqepmaSZmY+fppiHhI6Ji52gjoqMlZqNjYSFj5SfnJSXlYaWlJOXpJydnIuSkY6Jfn6HhXx2foWDhHJxcId0bF9aYW5iUXJwXEs8hXxGP1h1WGFaTmRcTlZWVVdRXGFeU09OZ1hWVktHTE5SSEVJVlJdYzxQXUQ8RkhIQkc/PUpQTDo+T0o9OT89Mjo3OyoyNT4xMDQ4NSg1LyosLjMwOyksLCclMjM0JCwyLTg2MCkoMTtcSjAuSmdERjg8Qi80RUtYMkCVWT1MRZaYramiq7Ocqqqxt625t6+spqurvcm8sL22wq+xrLPDw87Pw76/s8DBw7m/s8fDq6+3rbK4v76xrK2rpKeqsKioqbGltK6qsa6tsbG0rLS8pLezrKyuqKugo56wt6uqrbq3pbe2pKqnrKuqraGpp6eysqSnpqGhrJeqoZWboKaepaKqpK2joKexuK6upKajm6qsramcoaSjpJigm5aPl5yTgoOPiIWboIuKjouXjY6JgouXo5uQkJuMk5KRk6Oam5qKj4uLfIaBgYN6c3+Cf3xydYukh3hrX2BtZVdkhmNOP2eTTEVieVdiWVJlVU5WVVZUT1xdYVVLTmhWVVZJSkhJT0JHSVNRWW9BTlhAOkpHRkVHPj5FUUg4Q0tFODdDNzI6OjoqMzk/Li80NjMpNCsqLCsuIzQuLSsmKCs3OSomNis8LTIsJjA2VlouMEpnQUE8PEIrOkpPXjREhz1HRkSXk7Cmo6uxmKuqrrast7OspqyqqbzAwLe4sry1prKww8nL0b/Auri/vsG5wbnAxKyxtLGzusC+srCurKurqLaqp66vqrmwqLKxrrKtt6q4uKa0tquspKmqnaSes7OpqKS0tKC3rqCqqKqoq6egq6ypuraqq6qqoqqgrZuSqqGdoKWipqOqn52ota+ppqujpJmlqKepm6Kjo5+ZmaCQjY+YjX6HjIeDnZ2Gg4mJjYyOi4KFlaKajY2akJKRj5Ofl5mWjIuDf3WHgX+AeHSCfnh2fYCHnY9vcWdmb3dcYHKHak9emVZIbnlVZVdRY1BNVlRVUE9YWmJVSE9pVFZTR09YVUk+SUhPUVB4TE5XPTxLRD9AQTxAQ1VDOUFLPTU7RTEzOzo3KjQ6PSstMzQxKjgqKisqLCkpKC8qJiklMzssJDIpMjAyMSUvMVBiMDI/Zj1OWD5DLD5MVF8wSmk1T0Q8l4+xoqasr5qspq2wtLWwrKawqqm6vrvAsK25rqG2sMnHyNHAvry6u8G9usK/vr+tsbGxtby7wbGxs6qzqaS0qaaus7O5saOuuLKws7usu7Cprbasqp6qq5+joLauqaGfsLOitqqeqKeqo6qhoq2tqL2vrK6toqiooKyZkLChmKKhp6ifqJuaq7Gqo6CuoqGUoqSjp5iaqKWYl5iej4qHlIh9jYaEhKOWhIGBioWOi5CDg5OfloiRnJCTkI2RnJSXj4qGhnh0gn98dXh5f3lycnhmf4akdmlfZGmAdGaIi3xSWHBfSnhzU2RUUV9NTVNaZk5MVllkWEdSaFJRP0JOUWFROklITFNJcVFMUzs8ST87PD07QEBXPDw/SDczQ0IxNTo5My01OjopLTMxLS01KSgrLSw0MiMyKScsJS47LiYxLjAtMTQlLDBLZzo0OF89YWQ/RjFDUFtbKkhMOVVANJKQs6Glp62kp6Stp7WzsqulsaequL7Au6+nuaqmr7HJx8jRw7y/vri9vrzIusC3r6+zsbm7uMCzsrqsuKyitKeorbO3urOoqL62r7e+sL+nray1q62cqa+joKWtrKicnquzpbSomqqnqaOonaOpqKm+q7Swrp2qpKGvnJuzo5aknKWmoKWbm6qspqCcq6Kck5yipp2Yl6ipkpialJCKgo+Ffo+DgIidj4V+fYuHkI2Pg3+TmpOFk6GMlJGLkZuSlYeJf4Bye3p+fGl4fHlzbm97ZoR3hYpkYWdfcoR6bGZ4XV5UP1d7bFRhUFFZTExOcnVdSFpbZ1lFVWVPQz5KTkRDQTlIR0tTP2phSVE4PUg8PDw+Ojw/VDY6P0M0NUg+Mjs1OTAyNzw1KC41Ly0xMScvPktIMCUaOTAlLCwwOS8sLCs2JzE3Iy0wR2pJMTRYPWZiQUo3R1NgVSo9OUNWPSqQlbKaoKGqpqWiq6W4s7SmqrGmrLjBvbWvormtqKiwwsrJzMG2vcC0t7+6yLTCtLKxtLG8uLm9ta24tb6sobOnq6yxtri1rJ+/vaqzwrS9oa+ytaqsn62wo5ymqaqknpulsaewoJ+rqaehqZylqaGtvKiusa6hq6Okr5+fraaYn5uhpJ2gnZukq6Obm6WllpeVoKOXm5alrIyekZGRi4KKgICOgXuZlIyIe36Lho+Ni4mEkpiQhpSjiZOSh5GakZOAiX15bH52eXhjfHpwbm9xdmd/cmqEZ2VnXWxzjWxgaHBgbz1beGxVXU5QUktKTVRaV01cXmxXRFdfT15PSE1ERjs3SEVLTzxyaEtLOUFFOzs9Pjs7PUo0OUI8MztHPDQ/MTgtNjg7MigwOS8sNC8uPS0qSz4pHTQ5JicuMzQuMCsvNCYsOiQ0MUFoWTE0Uz1lX0RMNktWZE8qOzFOVz0jlJqtmqCYqKSkoKikuLCvpK+wqau4wbmyrZ+5r6uotLrIy8i+tsK+r7S9t8S2wrGtuLGzwLS7vbeoube9qqO0qKmrsq+6saucvb6msMG2t6KutrWnpqews6CepaaooqWZn62oqp6gqq6moKaYpKmgsbmfo7GvoayhraWcp6epmpqbn6WWnZ2bn6unl52hqpOalJmflJmWoamRmomOkIZ8h36CjX18oIyNiHiCi4SJi4uFh5OajomVnoiRlYKLl46RfYV8c3B+cnR0YHp4aG1vb21ofXFje21pZWFcZIR+XllzanJJSH5pWFlNUExLSFBSUUlPXF9uU0RYWlJnTkdLRUY1NkhCTEk1WmVKQDZFQjk6Pj0+OjpDNTk+OjNARjwyQDIzLjo7ODMmMjwwLDg1QiopLUIqLDQ7Tk5AOzczLS4rLTcqKjwlNTM8ZmQyNE0/ZV1GTz1RWmdIKj0vV1Q1KJefp5qdl66hoaGlobersqa0tKqoucS0sq2gt62urbC1xsjAtr7BubC0vLe+u72vqr2wtL+wvcO5qbu6t6entamorLKttLGonL+4pq69uLOfsbewqaWnr7GboaShpaWgl5uvpqGeo6ivoZ+hk6Wlo7ewoaaxq5+so6+YnKqlqZ+Xmp6mlJudm56orJqdn6aXl5iWno6Tl6KoopCJi4+GeoR+hIt6j5eJjYZ4gYeDh4uNhY2TmI2PlpmKj5d+hpeNj3mBenByd3BwdF95d2Rqa2pnZ4JsZXJqa2RnV2Fyf15Za3VpWEV9XltYT09LSEhSVUcyOV5ebVBEV1VZZUxISkVFMDdGP0tCNklKSDs2Rjk0OT49PDk4QDg7ODo3QEk+ODw0LTM8PDc1KDU+MSw7QTEoKzY8IzhSPSoxMTM+RDUsLSc0Mis7KzEzOWNsODRIQmZbSFRDVF1oRS46MV1RLDKXpKOYlp2rnqaho6G4qrChu7ilrL3Esq+uorWwrK2vtcTEvbO+urews7m4uri6rq2/s7S4r7/BuKu9urSlorOrqau0ra6zpJ7Et6equLesn7K7qqelqK+rmaOnnKSmlJihsqWZnqSpqZyhn5SmoKS5qKSnraaepaGok6CpoaGhmZueoZOcnZeho6ycnJujlpOWlpyOlJOjp6SQiYqOhnmEfIWGfZ2NiYqGeICDh4iIkYWUk5KMkZWUjY6Ue4OXkIt3f3xtdXNtbXRieXRoZmlmY22EZmdoZGZnaF1kYmllWmV6YmBQclRbW1JLSkhJT1NAICppXmpMQ1ZVXmBLSEdFQy46QjxGPDZLUEQ4OkQzNTc9PTg5NT86OzQ+OEBMPT45Myk4Pjw6OSo2QDMuRTQoKyw+MC1PPy4rLTctMTE5NSwmLjUtODA1NzZgdEIzQ0RoW0tXR1VgaEIzNzdgTCcyn6Slk4+mp5yfnp6ktq2oqrq3p6zDwLavrKK1rqevr7fBwL2xwbexrrK2tbm4tayqvLOvsrG9wLeuvLywpZ+2rKantaqrr6GhxayqqLK1ray0uZ2oqquxpZidqp+npZKZpa2imJ2kqqGboZyYoZ6nt6avqq2hoZ6dopWhpp+ioJmcmp2Um56Vpp+uo5mYn5aVj5WZjI+YmqegkIeKioh4hXeCgoKdh4qCiHt/hYiGhZCElpWPj5CRkJGNknuDlY+Fc39+Z3lwbGtsZ3VzamFmY2Fzf2FkZWZkaGhhZW5ZXVhcbGNhTWdXWmBWSUhJS01SWD45YGxpSEJVU1xaSUdGRUEuPD85QTg5UkdANzpCMDM3PTc2OTM6PDk3OjlETT1CPDAqPEA7QTwtNUIzNz0rKywvQSpKSy4vKiszNzIyKDU3JCs3LjcyNjg1XHlOMj5IaVpMWkpWYmZBOjNAYUUlNZ2loZKNrqGamaCXpbSyo7K+t6Gxxbu5sLGjt6urrqm5vr27rcCyrq+utq+zubKnq7mwr660tru2r7m+raaetaugobKmq7CgpsWhs6awsrG3rbSdrK+srqKZnairpp+Vm6emoJmlo6mdmp+blZ2drbGmuqiuoqGam56Zn6SapZ2Xn5iblpqhlKqXramclZ6dlI2Vmo6VlJinp42MiomOe4F0goKLmIWGfIiIhIWKjIiThZSck5KQkJGXj5B/gY2Og2+Cf2d5bmlsamdxcmtaaGNhcX9gZGdqbmtlaWVjbFxsbHVxYlNiaWNlWklHTE1PWVFQVWFlgVRAVlJaVUZHRkVALzw9Nz82PEZOYTg6PzI0OUAzNzgyOD83PTg+RkpARDkyLT1BPUE9MDVAOUAxLSsuMzw7SzYvLissLTI0OjUjMyopNi41NTQ2NVp8XTE6TGpbTVtLWGRjQEExR2BBJzSUo5yPj7GdnJWhm6mzsJ+4wLagtMG7vbmxprawqa6luLq4uK27sK2rq7eqtbmtpLO1sa+psba2sbO2u6epoLaqnp+ro6qunazEma+msLG3tqyrnrCtr6qim52kramblZ2npJ2aqqOllpqgnJKco6yrqbuepqSgl5qanqGPa6OWmZ1xg5idpYB2kqypn5aXopKKmJmAl4qfjniFko2CbGl+d4RxbIaKhn2Ei4ZvXWRhZ4SYhmyLkJSSdXmLhH+DkH9miIFodmpmWFxpdG5NT2liZXCDZl1kZm5raF1bXImQhIhoT0tEOEZUZ15KSFFQVVZLSFJhcHRlRltRVVBGR0ZDPjE7PTY9Njw0Zlw1Ojw3NTtENDg2MDpCNz86PkZMQ0IzNDM9QEBAPTI4QEU9MSwsMDg+RzcwMS4qLiovNjY4LCMxJzIxNDoyODZYgWwxNU9rXE5bS1tmYj5HMU5fOysuj6SbiJaxm52UoZyqrqyjvcWvqbfCuL68rae3saarpLi0s7Swua6pp6y0prG1oqe4trWop622s660rrSiqp+0q56jpp2nqZywv5Wop7C1ua2to6isq6uloZ+coaiom5iipqacnKeonZOen5mQn6irpLWwo6KjnJaYmZijiKGPkpqHoYiVn6KApYCorZ+UlJ6UiYRyeI2Og4igdYeMaZaIZn5zeKBvh4eEfox8f6GgoJmAfIefdIiOdpuKa4eCg25pZWR7bXJiVIZtZG1pmHFYaW9thlddaFpralqIcGt5codoh4RZXkZOPkZeTUZSVlZRUFJXVGdeTVpMUlJQRUZHPjw0OT05PDc7MDw8Nzk5OjY9RjU4NjA8Qjs8OT1GUUc9LjU8O0A9QD41OUdBODIqLzE8STovMDEuKi8oLTQ1ODMlJjIxMTU+MTw4WIN0MTVSa1tPW0xbZ189SzFUXTcvKI6nmISerJ2amp2fq6qoqr7Dr7K5vLfBv6qkt7GqrKa0ta6vs7erqaWyraW2s5ustba1paaps7GtsqivnqqhsqmgpaWcoqWesbiVpqent72mrKapqaynpaGfmaGopJqZp6OkmJylqpeUopyUk6Smp6G3paOfo5iVlJiUnYiukJiViqqMmaSdhrGBpa6flZuhl3qC1KiAh5TAm8Z4d7Glt5dkgMCcv3mEhHmPg3yQkJHKcZa8nMV7cranupB7gmyXsauxeWlsWLGub2ZqvJO8bmd5bXGP2H5Sa2K2sn1+cJV1mqGqkFZOV2FPVk5HVlxYUFBTi1xXW1BBXERQTkNGSTw8NTc9Ozo5Oi49Ozg3ODs5PkY2Ojc0PkA+Njk/RVJJOi41PjtCPD9BODpKPjUyKjIyQUUvLjMyLisvKS0vMTg2LSAvNDE2QTE9OleDdzExVGtcT1tNXWdcPkwxWVo0MSGPp5SBqKqfmJ2epa2yqrDCvbK1wLW3v8KrprSuramosLWqsLa0qKimtqaoua6csrK2qqWkp7KvrrGnq56npbKloqKgmJyiobKvlp+kobW6o6mooKytpKKdmpqjqaCYm6mgn5eeqKiRnaeblJ6ip6OhsKOen6OWl5OYkpmFr2tqjI6qf2iFloetZnGfnpWbqZdxrqGkf3e6fGugj3axX2q0W6WAZZyQYGaBemZ/aXhrqmW+c2emjHaxanyxeHWSlGNtbaduXISgRWlniJZFdZxffWZ7o6eCWV+Lq2h8jHd7aqg4Sq9bWFRsY1pLT1lgXFZWO06IUFdWMElTU0pDRUY9PzQ2Pzs4OjkwPTg5OTk6PTxEODs6Nj1BQDY8QEhRRzkwNzxBQz5ARDhARz0xMy0zM0UzLy41My8rLyguMC46Ni8nJDIwM0IvPTtVgnYyLVZqXE9ZTF9nWTpONV1XMzEbkqOWg62npp+jpauyuK20vb6wt8WyuLrDp6mwrLCpqrGvpLG7saWlr7OjqrmpnbKysKOkoKqtsKyvp6igo6OxnKSemZeZnp+wqZicoqC1s6Gqm6GtrZ+dmpeho6mdmZ6loJyZoaekkJ2impehoKyfpqagmp+hlpWRl5GbhrWbtXmHqZq2mXiItJu3f5SXmKyXf2uBpnuBhYaRlJJ3q2dqsVuse46HlHSJcI6GgX+IkZd4g4OLl4yDoI+FsHZ3n3Jra218i0+lWEhkZJl+Y2imX3hxdFKShl1QqW5jcHqFgGGdL1OibltUa2dgTEtdZFhcWkI+sHdXWEEjTWlFQkRBQEExOT44ODo4NDs6OTw5OkE6RTo6OzY6Q0I4PT9LTkg6NTpBRkJBQUQ8RkQ7MDIwMTtFLDAuOTQwLC4oLzMsPjgzMR8vMi1EMTw8U31uMytYalxPWE1fZlc3SjlgVDUwHJeglYm0pqehramos6yqu7fCsLzDrbm2wqutra+vqK+zqqKwvKuiqLato6y1pKWys6ijop2oq7OpsKimn6CgsJegm5eWl5uhsaWcm6Sotq+hqI6pp6qbnZaYoKapm5+dpKCcoKOlo5abnpianqOrnKaanJqioJeTkZSTnYTVk5m5cbHCf8aHfdaUnLt9nJeoko+djaR7jYahgKWCeat5j51Wr3uJfp9quVq5d4eEfaaDlHyZe6l5jp2Qe7FtjoR1kLyGb5VQr6fFilGgemNgqmFzcoZrlodeUrW0yIV+iXxjpDRDnXVdUGpoZFBAWGdZZGFKSE1qSlpTT1lmWkNEP0U/MDw8NTk8NzQ8PDg9OjxDOkY6Oz42OkBDOzZAT0xIPDo8REhDQkNEPEVGODEyMTFEQi4wMDQ4MystKS4zMjM5NzEjJTUqPjM9PVF3ajYqWWlbSltQX2ZUN0g6YVA3MiWco5OZsqippbOqpbWopLy4wbC6wLK3tL20tqiysaSytKegr7apm6m7rqOxsqGytLGhpJ6eqKqxqbSppp2en6yYmZmYmJeZpK6fnJeorbGpo56Oq6KnlZ2Ym6GnoZiioqOhm6KiqJyeoJ6VmZunoZynlZuan6GYkJKVkJ2Ism5otXKsiHCPp3K0dnS2e5yapo6QnY2jfo+eo32wdYKQ0tJ1XK58hX+kbpuqpmuHhX2tfZiZkHuxc5Odj3mzZZZ0hZ5vn2aUUsmLWsJcn3liX61fdnOFYZaIXVnKnW+/fnJNS7VTVcZkVVFqY2VYQU9rX2xpUFVGSDk9V1JbV1hIQj9KPDI/OzU9PDU2Pjs3Pjw9QztHOTtANzs+RDsuQ1JKRz4/PElKRkNFRD5JSToxNzQ2QD4vLjI0MjUyLSkuMjYsNzQyJh82MDs1Oj1QcWg5J1dpXEFOVF9lUDVHPWFNNjIuo56RprCtpam7raa1pae2u7yzu7+4uLW8vLSmtbWjs7KjoKywpZiou66lsrGctLiqoKWdoaqlsqisqqWanZupn5aWmpqTlaWropiTpquxpqGVkqyfpZKUoZylp6CVm6anopujoK6aoJ6dkJabo5+dppSdlZmjnpWZlpKbhax8eKh3o4+Lh6pwrYyFqISam6OLk5uLon6Rl4euhH+Bs1xyslOvfYKCo35x1313hX6PnoeZmnevhoqRnIh3tGGaZZuCgpVskluwV0uadZh5ZmCtXnZ2hmeXiGpdr3aVno93azV5yK6zX0NUb15nYEVQbF9wbVZVTS5lY2hSWVE7QUNATDo1PzkxPjwxNj85OEA9OkM6Rzs8Pzo+PkU5LUVVSkVAQzpNS0pCSEc+R0s5Nzw0Njo+LzA0MzMzLjIuLjE4Ki4zMiUhMDQ3Njc9UGtlPiZWZ1xAPVZfY042R0JgSTo3N6CdlKG3sZmzwa2osqeqs7q3tbm/urizt762pri1obauoKCprJ+VqbarqbKyq620pJupoKCoorWnpqqkmZ6VpaGUlJ2ak5elqJyUkKetsKWglJmon6KPkaKaqaWhlZqmqZ6dpJ+tnKCdn42UnpyfoZmYnJWWoqCUmJGnnYepfn+meaGPkISqcK2Ng6eGl6Gji5iXiKOBkIaUqnp/i515cLFaqIOCiKB4dNh/dod0qIKPm42SpHyWkJ+Ee7JenGSgfoKVbpNdq1xbk3+Rf2hnqmNye4BqmIZxXataiaCPa21kT0pDoVxaTXRdYmZNWmFfcnRfSlU1SpqRWEhFPUdFQUwzNUE4Ljs+MDVBNzhAPDY9PEY/Ojw2Pz1CNy5IVkpFQEg2S0lOQElLQEVOOjpANC47PjEwMjE1NCsqMDUvNywmMjEoJCU2NjcxPE9lZEEmVWZbPzFUX2JMN0ZIX0MxPTeinZqav62Ys8Kuq6yop7WxuLG1v7q7s7K4vKq7tqGypZ+mqKifk6yxqbCrt62qr6GYoqCmpaS6o6OsoZeckqOglpWfm5WaoqGRjoypsLCmnZaap6afjZKkmKerqJaYqaifoKGkrqOgnqGOlaGZoKCSnJeblZ6hlpaPrJyPrm5ytHSpjHeLpnS0enW0gpSnpJSdjYmkh451uG+Le4uia2u2WqGGZZeXaKCip22UcrR0k5l/s2qGkoitanW0YZ1mom+HkmuYXa1gTqF8h5FSc6NseX9+bpiGb1yvVjycd2VUb24uW6dPYlJrZWJsWmJcYHB8Y1NZUT4/bG8yQkJAPk06ITdANi47QDM3QzU4Pz8zOzxDREJKRk1JRjYySlRLRUJKNklKUD9IT0NGUD08RTUwOzswMTAvNzUsKywzMjYvIzAwLCwdMjg5LzlOYGVEJ1VkWT4vVV5hTDVGTV44MUE4pZqcnrqkm7HArq6rq6i3qrivtcG1vbKxu7iswreqrKGdp6SinZKsq6i2pLSorqqhl52ooKWruJ2jrZyWmZCmo5eOnqGcmZ+fkZSVq7awppiTm6yployUppqlraOSmKuzpKCeqKywmKGikJmhl6CblpuXoZOdqZ2UkKuZh9SUmrt1scSAxId+1pecuHmKkpmOmIqMp4d5orZ1fXd2wYOasmGDunnAfHW4YrWBjIepfZWCrKlxe391vIinoGmdYaaPr6J+jXWHq32+bnO8dLKDdXiBim2aiHBtjaR0vV13fVthebxqWlZbaXleaWFjZmJteG9YW1lDQUBxP0NHKzRIIic7PzEwPD83OkI5OT1DNDxATlpeYGBfX19aUFBSS0VGSjRITFJASk5FRk9CPEU4ND05MDIwLjg3LSouLzE4MCItMSwzHiw7OjA4TFhhRidUY1g8L1ReYEs1PExcLTY/Oaean6K8o5eww6+tqqqtsai5r7fFsbuzr7ywrsKyraajn6WinZyRq6Wqs6W1p62koJaaq5mnrbmdo66YlaGRpqCTjp2jnpmfmpCWk6+5sauVlqOnppSQlqWdpK2fkaGorKCcn6mksp2ipI6moZWhmpyXlaSZkLCgkpWqnoWQmbaAkpKNuJZ5g5ObtndubG90b3mPhI6Jcp7Au7yae4GyqHCBdJG5g3yGhouGjXuKh4yXfaS7ub2cdXmzo3R1l3V0sHWZnmaHao22dHNxd7aMXoB5fYhng3lsemKLrHB0hX5XW6dpRGRZVGZfY11jUWdmcW11Qk1PTEQ7Wkw+SjI7MCA4PjsuMz1BOTk/PTs8QzZCVFlaWltbWlteYGJgXVNHR0g0RElUQUtOR0VPRj9HPDc+NzA3MC85Oi4sLy0qOC8lJjIoNCQoPjcvN0tUX0cnU2JXOCpPXV09KztWVic9OjymnaGhv6aVssKzq6qorauqu6+xxq+1tLC5qLW5rqukoqefoJ2ZlK2lrquntqion5yWoaSerKW+p6Gql5WckaKbkpCiqKKUn5eSmJSytbasl52jo6KLkpKmnKarnZappaacm6GqpqaiqKGRrJ6Xop6XlpidnpCwqZScp6KPa39qnap6iXR/nI92e2aIe72+wLpvkoNxlIVfcmpaXpuKYWSHj5ZsYH+VY22cdmKVbICZlZRmXmBjcZuJaHKMfIaUZmp+cXR4f35jXHh1gWhQXG6EfHyKaldseoJySUpvhXBOcU1EVlxmYExaV2ZjX09bbXVqcVJPRERNPEhIPEw/MSwyQT84LzU/Qzw5O0A7PUM+UlZWV1laW1tcXWBhYWFgXFVHNUNGVUVLT0hGUElJSDs4PTUxOi4xOzouLy03Nj01JiIvKjIsJTs4LTdJUl5JJ1NfVjQpUF5MKDM+XE8nPzI+qJ+posGkmrO5tqOspq+mqLayrMissLSttqS+srOnoaSqnaOcmpqsp66kpbaqpZuYlqKcp62pvqippZWUm5agmpOZpqmokp+Qj5icsLK+q5qmnaeiiZORqZuppJycrKCjmpujp6yin6mhma6blKagl5Sdn52YsaWZoqiZnZKfnaSmm6ikm56bnJuRl4Job35xd5GXlJCEibSqjYWYlY+KjJmXiJSViYOTk5GJjpKUmJSZl5qfoZqblJ+bjYF6pIVranyRfYF1iouDcoJ4enZ2i398iWpzgXSDdWR3fXZrb3hsX2Jbb2dNWFlmal9XWW95bm1mU09GUzlQWk5STycqO0tCNjM1PUBBOTpDPjxFTlNTVFZXWFpaXF1gYmJhX15eW1RLQ1NHS05ER1BMT0k8Ojs0ODksMjs4MjApNklSTzgiKSsvMiM0Oyo3Rk9bSSdSXlQxMFReOis9OF1LLDwtQLKgs6K/oqOwsbegqqazp6WwtarJq62yp7amwai1oZ+lppyllpWhrKetpKS3rKCZl5ehmK2qpsGfrKSWkpyXn5iUlaOenaOok5CYqKiywq+Zqpyqno+Vlqmeqpyeoa2YoZudoqWvpqGjp56smJalnZmaoZ6enbChnaKnlpmUmpWipJikoJmij5iVi4uOkJiukHyVnIKRgYmpqIWAmJeLhI+giHuEkYWFmpGHhoqVj5uXjpGYnqOWmZKQnI1+jWWhs66FioR3e5CLfnh5enBneZGBgYhrdYF5iHJoc395dYOGgWp0YnhlX2hkY2Rmallre3BqalxTTFBEX1VGQD4+LDRARjs0NTs+QTs8Pz4+SE5OT1BTVFZWWFpcX2FjYV9eXl1eXVhWSktMQklPTVJKOzw6Nzg2LzM5NjQuKCYkLTEuLikrKjclKzwoNkNNTEQvVFxRMDVNWzE3RTRcRzU8LECyn7mvvq2rrbGyoKqmsq2jrLOwxbCrrqSzr7yltZyhqKOhnpmXqaeqpqWms7aflZWempqwpq6/oayikZGempqUkpainZepnYSdqaujtMezn6mjqpaVl5qnnqmcoKWslJ+fnZ+qrqikoqqhq5qen6GYpZ+cn52wpJmfqZSZmZ6Sppyaqp+cmGaFk31lf4+bkGN6jW1oanqQo6tqZZqYfmeFi2VlaWh6jaKOa2iMmJGid2tqi5mjn5hzbG56hIyGeVhlXYaCXmyLi4N3XGh0d3eSgIeBb3eCeH9zbXmEc3aIh42CemiEWF1qc2Rdc4lpanxybWNdUU5WSmRYQEkzPUY4P0ZENzE8PT9BQzs7REdISElMTk9SUlRXW15gYWFgXV1dXV1fXVpVT0RIT0tTTj0+PT02NTM1NTU0KiYmJSwqJS4rKyc2KiQ7Jy9CSVtKLjZaTzYpRVkvRE8xWUI7Py49pJ66vLmvq7Kwq6Wora+xp66usL2xqqmlrrCxoK2XoaSeopqapqydraSmqKqzrp6WpJCjsKa3uaWuo4+PmqKak5KboJmZppZ7pKuiqLTDt6Shpq6enZSeo5+knaSqqZKfoJ6gqq+pqaKpnqabpZ6noKyXopylsaWYnayWop+bk6eZoayaoH+9hIlztHOFn4ataHe5xLhxkqGjeqaZmXSrgn3LwMC6cYujh4OefZaYiJ7AvYKWnZ2NnMHBfIF6kYyawsB9aqWycI6Cb8p6gJt4koOOgHZ5gYB5cXuAhnB4hIqSeGx1kWJlXndjX2WBYl10aG1kYlhLVUlRWUhPRDJJRT9EQj4vPD8+QEE6OERDQkNFSElLTU5QU1ZZXl9gYV9eXl5eX19fXlxTTVBHVU5BQD89NjQ2ODI2NiomJSMpKiYuKyopMTAfOSojPklbTCojQ1AvI0ZbM1BZL1VBQjsvOJWhucO0r6+/qamUo7CqsK+uprK1r6ump6axq6CrmJujoJybqqejnqyjpamlpbSknqOUpq6tuLSnr6KSkZmdppORoKKYnKCeiKarpKutv7+woKiuqJaRn52imaOkqqOToaGdnayuqKqlo6Kkn6OknK2pkqSbqa6qnJ6rna6jl5inmKOkmZ5/zpR6e6WCepaXm1+tj12OqIChoXynlZt1q4OBr15kjKp7qIeFoHSXk4izY4KrhqCNjbNqhK90fJaHuGGCrVmjzW6Rdnvbe3+ZcX6IknV/ZXuIdnZsfodtfYSOkH1rgIxfcGpvZmBfeGRbcWhqY2ZgUlRTV15KT0M0QUhFRDg+NTtAP0E7PThAPj8/QkRERklKTE5QUk9TXF9fX15dXV9gYF9eXltXT1VKPT8+PDU1NzgxNjQoJyQhJywmJi8oJiszHTYwJDc7U0wrLC1KMCc7XDpMLSFQQEY0LjGswcDAtLSwt5iekaSqqa21q6ayrKyspaymsKqhp5yappicoq+foZ+op6OmoZ+xrJyelaaurbGrqKyglJKbn6WTkJ+ll52opJ6to6qwqL/Fsqepsa2Wkp6copehqqqflaGenZytrqapqJulpaKgqpKss5aloquqnqSop6OyopSbqJyhnJaVkZehcoaMmHaGqIdxsHydcax9oKCCpY+eeKuCfq1/nXKtf6yHhp92mJJ7fJd/qoiijJGMnH2reoiTj59/eq1WnMR7kHCTwX2BlW11cIxtZndlh25heG5yboeJj46CbI6NY25zdW9gZm1kX29pam5mY1hTXGBaUlJDOElIQEM8PjxARkRDRUE9PDw8PkBAQUJFRkdFQENJU1dZWlxdXl5cXl9hX15eXVtaUkM+OzkyNDc4NDUyJiMfHCAxJyAxJx8nNB41LSY3PVdKLTwoPTEpM1ZARiEcRztDMS4rr9PGx7Kzn52jj6Ojoq6vt6+psaeoqqmuq6ynoqSdmqOVn6aroKKmoKioo5+esK2Ym5aop6+tqKepnpeVmqSikpShrpqdp6OurKKstam5zLGspq2rlpScnaKZn66snZahmZ6eqbGoqKibqqajoaqar7GiqKyvppqnrKurs6STmaWnnJaThaRrpHWKeql1e7JxgqWKmItxiKCbh6RfYVKrhYCug5x1roKohoafepmXhntmgKOKpJiGgqN9qX+BlIauXnuoVZ2ikoJ7o5+AfMSwxYxzr7SzuXJiqa/CdGiLi5WNgGuWj21seHd3bmtmZWRxcWZ8aWNdVl9pWFhUTExQTENDQUI7Q0BAQkk8PTo5Ojw9Pj4/QT04NjtETFBSVFZYW15eXVxeYWFgX15dXF1bU0lCNjc5OTY2NCwmJCIgJychKy0iJC4hMy0mQERXSCxHKzU2KjFQS0wjIEE5RDQsJ8HJ1tbAoZmrqKGvop+xtLCvqayjp6erq6uppaagm6WfnaanpqSdrJqirKGkoK+jnpuTqqS1sK+hqZuclpWnpJGboqifn6acsKWiqLGstsextKmrqZWRnZ2hmaCls52aoZScnqeqqqKtmqqmoKGporKsoaqzsqGcq6qxsbmmlJilqZqdk32qbZ+EiHareXywboKki4iflpWeloHSuLS4yYGCsl9glKmDpYiHoHqYlpp5qsl0mqOUqKmQkpqMfpqJmsbGd2WhgqV0gqCOgn2vX2+1Y7F1S6OHbadHg5NkjY+ckHpulI58bnl0fHptW2ZqcnFngWleYVhjbVxeWUlMTEpFREJCPUE8QT9KOzc5Nzk5Ojs7OzMuNjxBRklMTU9RU1daW1tbXV5fXl9gXlxcXFxcWE1CNzU3ODUvKSglJiUkJiksNUZOUFBNRkxKVkYqTDAvPi00T1RRHRw7PEYyLSSnpMDHua2psq6tpaOcs7msq6Glm6imq6yppqCmpZiro5+vrJ2moa2an6mlnae2oKOYlKirtrOsnKacoJaQpq2Smpyno6Cqpq2goqapsLPBsbKprKeTiZedpZuipK+ml6KVmJylpamZrpyrpaSdq6O2rKGxubCenLCotbW2p5aZqqacoZCDnk53moKAn3uEo3yCpIOGpp+cn5SEuHx9ermDgM3Gw7Z4m6KSi59+mZeXinafl4qkmKSofq+FnIOehKx9mZRhpWyjcZCFkIF9loRyrGCkc3GAmmG8fVJVdY2RoZR6e4+NhnJ5c4R+b1tsbndzaoFuWmRfaG5iZF1LS1FTQUdHRkg6Oks+QjEwODg1Njg3Ny0qNT09P0JER0lMTlBUV1lZWltcX19eXV9fXFpaWllVU09IQDc3Mi4sKi4rKicmP1FUVldXV1lYWFdVT1RGPEUyOlBbVBwbNj9HLC0hi4eZqaykq7mrr6Ccoa2ztKafoZWlr66uqaeepaWapKehs66iqaezoJqppJSjtaOjlpehqbW5pJujnaOTkKKymZ6bpqWgoq+sm6OnorWxw7CtqaypkYeQnKedo6ScpZeemJiZpaOomK2hq6Kkl66lu6yit7aunp62tLqztqmaoLKjpqCIkNK1w7d6h46GkZOPgKZ3lKJ3jKGShaWDjHKriIa0bnNqmqSdloqffZeZh4eQc66CpZujjaaKk52IlJCabXCyXKVzk3qcbJl/e5l+bqlhonJzfp9ic7K4aHeOkqOWe4mJjod1e3iNgWxod2h4c26AdF1kZG1tZmhgSllXVzxHRj9TM0BGPjwqKDYzLjAxMykmNDo7PD0+QENFSUtOUFJUVldXWV1fX15eYGBdWltaWFVSUlFGOjIyMzAvKysoQFFSVFVUU1RWV1dYWFdVVVZUUU9RW1UlITJBSCQqJZJyjYqtv7+8u7Wel6ikrraiopmVo6qorqmrmaWin6agoLWmoqmnsaSUq6OPpK2knpGamqq0tKSdpZypkpSXr6CgnqajnKecs5ifqaO1qsKvqKqooYyDj52ioaajlZqanJiamKajpZepp6ugo5uspryslb2wrZ+jsrW7rbepnqy1pquafKiSfXyweIuApKWInG2xb6CHrXyij4Ool5qCrIqGrYahlaiho5iGn4GZloF7kn6rgZ2Zlourd52gj4iTkn96r12jgX2mp2WegHyXdWquXaVscoaZXWBbjKBtlI+jloCRiZKIeHmBln5pbH5ifXRtgHlgZ2Vwb2dnaEJYX1o9SlMyUzhBQUM3JCQzKycnMywgLzY2NzQzNjpAQ0ZJS01OUVNTU1ZaXV9hYGFhYV5dW1pYU1BPTkk4MTUyLiosQVRWVlZVVFVVVVVUVFVUU1NWV1dYVlVWUUhGSUokKSm8kpqEqcbDt8G0n5utoK65pqOOmqOkoK+uqZ+jnp2tmJ65oKOrobCqmq6hkaqppZeKmpCusa2noKibrZiZj62ioZ2loZmlnK2Xn6iltqi+rqSpo5+Lf46bmqCmnpKTmZqTmpmlo6KYp6uqoaKeqKi8pJfDrKujoq20u62wqaO2sayumnevf5CKnIaHfLqtiZhksIxklq59oZCEp5ecgq2MhrCHqJqkoqOShaBcbGuCs2B/rXx7goGybGdumZeLh7FafbVcpINryKJmn4F8u1l2tVqyfVOvgXqsWIChbZaNpZiIlI2Sk3l3jJt8Y3N8YoN3dIB8YWlmb25mZWZPVGJbQVNdPUgoPjk9NCEhLSQfMS4gKjEvMDQ1Nzk6PEFDRkhKTE5QUFJUV1peYGBgYWJfX1xbWFVQTkpHQzU1My4vQFVZWFdYV1hYV1dYV1ZXV1dXWFdXWFlaWltcWFdXR0I70p+zsbe+u7TCs6Ocraelt6mgi5mgn52ysaieop+dtZigs6iqq56wrZ6snJWvqaOOiZuOr6ypp6Oomq6Tmo+pmqGdpZ+ZpKKlmJ6iqLGou66kqJ6djnyLm5ahoJmPkZmbkZmXqJ6fl6etpaSkoqSoup+gxqemqaGstreusKmhv7CwsJiCqpOjro6bgIakl5iQgYC4w7qEj52UhaiZnoOsjISviqmdmqarkn/WvcKqYqS/vX1/o4KD17u4tYSUkoKevb6Ea6OCcKuFb51/erKxx4Nrq7G9rHl4or67dICUjKOZjZiNk5l3f4+ZeWJ8eWSMZniBe2BrZWpqYlBiW1JpXD9TYEJMKTw6NC8fHyQeJTIgHSQoMDQ5NjY3ODs+QURGR0pLTU5OUVRXXWFcX19hXmBbXFlUUU1JQz48QT81PVNZWVhZWVpZWlpZWFdXWFlaWllZWFlbW11dXFpWWFRXWruVtLSywLqyvrOina+nprOnnYyXpb+ptq+nob+mprGbnrGcuaifrq+lp5WUr6yXjIOaka6mo6yhpZyqoJiKo5OmnaebmqCoopidoKysqbitp6Oal5J7h5mRp5uTjo+XmI+Yk6mYnpaoqJ6opqCiqrqeqcWjobCkrLS1rLKso7+rs7KddXaqpLaFZYqgcGeskIqPbm53pZCboYJ2spyYcZGOcpeqpJuZsKVybW1tZot4b22DmnGBempxaWeJlpWXcmlphYdncYdkXotjaW9aXWd+eKZgYnKQknBmZICMkY6flZWXjZKaeoWNk3RkhndnjGp4fnlkbGNlbGJKZFdJalk5T2NETydKOSsjHCAbIiwpGBsYLTIuNTo0NTc6PD9BQkRFSEtMTU9RU1ZcV1tcYGBhXV1bVFBMSEQ9OkFCN01YWVpZWVpZWFhZWFdXVldZXV5eXVxcXF1eXV5dW1tVV16ola20qbq6srOrqaKun6S0qpmSvbHDx7y0qZ6/q6yjoKeroLqjpK6sraaOlq2qkIyFlZetn6arop+kpKCSi6WSppmpmpajqaCVnKWlpq65qquZmpOSe4SXjaaXjZGQl5SOl5Wmk52Wp6KZr6Wdoau5n7DBqKW0p62xs6ywrqq8p7K7mIyjqaW1nImXo5iHqZuQlJ2SqrSanKSuorWZpaOgo6Seo6Wil6ynjZOTjYeTnZ2VkJmTmJGPlYV/pJqXlo6MlJOKkIiFf2iMgXSDd3SHjHGnbX2Wk5SUgYGPj46Om5Gek5STnYCFk4twaI92b4l3dXx5aWtlY29jVWFYP2haR2FeTVcrRT0rJiE2NDAuHxwgJTIoKjc5OTQ2OTs+P0FCREZKS0tNUFBRV1VWWV5gYWJdXlVRS0VDPjk9QEFTWFtcWVdYWFhYWFlYWFpbW1xeX19gXl5eX19gYGBfWVlgpZapqqS1uK6vorClrqCht7GRjqrEvMO5tqmhpJ2bpZ2wqKS3p52ptaeokZiso4yIio+cp5atpKGaqJ6fk5akl6iaqZmUpqCjj5qnmKC0uaeqmJqQjXuBlYuhlIqVkZWQj5KXpI6emKeemrSjnKart6ivwq+kuKewsLKvq6y2vaOywJqTp6WmtKKSnaefjqmgjZKfoq2xm6Kls6uzmqajn6esoJ+enZitnpOaopyUkJermY2ZmpeQl5+Rh6CelZSGlI2QjpaNgn9mjoh1iHd6iYR0nGqIkpaVkol9jJaRkpaQnpCZkp2BhpeFeHGUcnmJf3F7fmpuZF5waWBcX1hsYk9fYk5YOUZGRD0yPD03LiolKykmHSY0MDY2NTg6PT0/QUFDSEpHSktMTVNTU1VaYGFpYWVWUEpBQ0I7OUVNVlteXltaXFtbW1xdXV9eXV5fYGFhYmFhYWBiYmJkYlxbY5iWpKijsLSsr6Oqp66gqLaqkY+bo7K5raqroaKZepyhsKSmsamXnLimo5SYqZyOhoqJnKOQr5+klqmgoZOXmZyui6uWj6iZp4yYqI6duLWjpZebjYl5gpOMm5OKlZGTkI6RlqGLnJ2nnZ23on+DrrWisLB1pL+ks6B5e6Kttb+Xd6+moYqAqn5kXGJ3oI+knoOWfm2UtZ2lqbGtpmagopV1e5yZcIGZqpltgKSpimWcpZyRmJmXjJOckYSdm5CVhJSIj4+Ti4Z5bJGIdodxfIaBgWFpiYyVk4xbdpWQZmiOjHF5oZWVZHiXhYB2l2iCiYJueX9rcGVgdm9ra2hbZGNhYGxQWT1NTU1SRj0/U0I5MC8eHyY0OjMwNjY3ODw7PkBBQkZIQkdHSUtMVFVVWV1fZ2dnWFFKPERIPDlWUltgYWJgXl9fYGFhX1xdX19fYWFiY2RhYmFhZWRjaGReXWaclqajobCxrKuqpqmuo6etpZKVqrSusKWZqaWqlnSLnK+gqKunlJe5oKCPnKSekX6IiZuejqyapJWoop6Ol5KehXWuj4immqiRlqOIm7mzp5+YmIuJdXeSjZeTiZOQkJOMj5KfjZmepZibsZWAjJu1nbSMko+9p6J+p6N7pbG6g46PqaCEjIWPsaqvjIqWo5p5gYushp2fo6mrqomWiJt3pZx7iJyBmKeEgnues3uKhqCYmZWYl4KRl5aEmppieYiShY6Qk4uEbnKRiHqCcYGBhoCHdIiGl5N4lmiTdKCadHuZgpuZhJh+kYiBgphpjIyEanh7cXBnZXhtaWxqW2NpaGRwWltIU0tQQEU1LVlTVDYpITA5PT42NDM1Njg7Oj0+Pj9ESUBJRUpLR1NYW1hbYWFpZllRSDlFTDw/YlZeYmRlZGBhYWBiYl9dYGFhYmJiY2ZnY2JhYGVkY2djYWFonZikoKaurquoraCpsaanqqWZk6zEvK+glKWntJ2Qg52snaeioI2Qvp6ZjZ+aoZF9ho6Yl4isnaOWoaGSjZSJhoCRqI6GoZyjk5adhp65saedmpKOhXB1j4mVkIqUj46bi46RnZCVnqOUnauHn7SJtJqui8qIq6+Kt4WNsISzsYapj6qajZ18qI9ye3ecjqaWaJWkebSMoaCoqpSawoOBq4mZoXKegJulfpeGlrKBoX2hk5+PmJiAj5SbiZmSi3yFlIeNlpSKhW50k4aAe3OHgoR9hXWGg5iCj8VmgKmHj6JqnYGdl4CZgIqMg4iYb42ShGd3dHt2Z2l2cGdoa15ibmxmaldkRlxRTDJFNDZNYGM3JjM8RUdEOjYzNjU4Ozg+PT0+Qkw/TklKTENRWl1cV2JeamxbUUU9S01ASWRYXWNmaGdiYmJiY2NfX2JhYmNjY2RpaWNiYmJlY2FmY2JiaZWXoqCwqamopqygpbmxqaummpSeoaSpoZSjqbaisH+gp52lnp2JlL2ak42gkp2QeYOWlpGIq5mcm5qihY+MdpubjqCRh52jm5aYl4aiuKylmZuMjH5ibY+Lk5CMkIyMl4uPkZ6Nkp6gmKGnfqGnh62doJaukKCenZGHgqGNrbKJpI+snIyafqJ2gJmUa4KrdU2reIeNnZOcqqmCqqt/haJ8e6dqnoCTbGeXhpi3iZ5+bmBjWIOYf418ZGeMc5l9eZdsXX2Yb2FUcoZdYG16hGBZZYJ+hYGZcqiqa4OjbnKlb5+Bm2dknmxabIl7ZVlfgn5hV1BvdmVvdHFqam9daW9samdXZk1cV0U4QTRHQ15rNCtJQ1FNTj04NDg1OTs2QDs7PkJPPlFSS01CSlxdX1deXmN1X01EOk1OTVRiXFxmZmlpYmJkYmRkYmFiYGJkY2FiamtkYmRkZ2RiZ2VhY2iYl52huaGqpKaskqK2vKuvopmWnqClq6ufnK20oqiSoKChp5yZjpi0mZCLnoyVi3WBlJKNiqaWlpien36ThYWso4eckYqYqJeZmpGHpa+mopWZh4mAaW6IiIuOjomLjJGLj5GhipKdn5qhpH+TgY+joZSgd5yWkKeDo6mAh6yvh6V6jX+Emn2icHOTh5V7nox5bYeci5qSnaqcj4edfoSidHemZ55+d6VfmHt9k3Oibpi3tLp0k4iCgLaoZIHGuHxxlbaMcoGbpGR0rKthfmqds35ufomEj4OMmHGAo2xyo3Kegn2jXpyZs5VwfJees3RyW56ygmlicXR1cWhvWGprcXBkW2dcYUtDPUQ1UUFZcTI8U0dfSlI9PDM5NTo6NkM8O0BJUD9UTk5RQERfXltaV2Bge2RJQzdMV1VWY2FaZmZra2JiZWFkY2BhYmBkZF9gY2tuY2NkZGhkYmdmY2holJaVpLmZq5yToI6luLatrqCaoZuio6SsmpqxrKuTl6GZoaWampSerJuLiZF4i4VxgJaNiZChkJOUnZd9kYqOqKCGmI6JkaKTm5qMi6inpJ6PloeEfmt7hn99j42Di5CQiY6Tn4GVm5+coJ+LiXecmKKNoHKhjImpiZ2okpmqroGujX56oJl5o5N4gHOXh4ycfZWfh5uOmp2oiKNkoX6Ml5CbjW2eaJuOb5qZe4CKp31yaHSrg56Dc6pnlJpdm4V2hJ1oqmqAuWZcqXCBnGGVjF+ndneKi4CdaJp1h5OSmI1+nmyYj2qmmVyofne7an2pWo6EXbNnW25yeHdraVtwaXd3YV5kVmFBUERONlZCUm00SlpaXk5aREAxNTE7OzdIPzpDSFU/WVNYXT5EYl1WYFFhZHxpRkI5TltdWGVmWGZmbm1iYmVfYWFfX2BgZWNeYmRvcV9kZWVrZWNpaGdraZadiaq2nKiJY5WcrLuysKydpZuap5+drJmdsKernpejmqKgmZaWoKSZhomNaYiAcnuXiIuWloSSlZiPeouElqSciZWPhoqdkpybiI+ooZ+ai5CKgIBpgYZ5f5aMe4iNjoeOlZl9kqGen6GTmHJon4qgj4xwko2CqYmaoaWroqp/sa6koriXd6OzoqN/iJR4nXqqmX+ij5+dmYmYcqF+iI6wtX1smpGheH6ZtaOjq6iEmXybfZybf3SqWl1ve5eLeJ5iTX97e4ZlephCTZ9ZompzfY9vgoqEmXabeYeJsbN/fpqSpnN9nW1wfJRvmXJpo12VdkhlY190cXx9bmVfa2d1emJjX1BdV1xTVkBZRVFnRFJWXGFYXklEPUI4P0E6SEU4TEVYQVdSWlZFRmJcWmBLYG19cUVDPFZeYlplalZnaG1vYmZmXmFgXF1eYGhiX2VjdmxeZWdmbGRlbGhpbGmUnoGxrpqEU1+hp7S6s7OomqKLmqmbm6eSoKujoKiPnp6dmpmVmKCdloeHiXeFgW54lYWQm4t9kZOWiHKBiZKhm3KSkICImJSfmoSOqJuZlYqKinyDbISFcYKhjHiFjIiHkZiUepGjn56jiK6GfbWEj56de6aWeqmCl5+RjKOff6dpeG5+mXSgc3F8nYWYb5OCrXykhKefm4OkcF6paHajZHCmYZzTj3x7mXhyc2OihpF+onKjkHZrkLOMYIOYinSqsqi8f3eEb3+/pqq0Xpxvf3KXcIJ0o3JepGd0pmBopmyb05h5gZpudnmXa5t5dpdybKmlZ19leXF/hGxoZmNtdXZmXmFRWmVQUWFIVklUX1dTW2VqW2VQRUNLTEpLQUpEOFBAUU5YU1hPU1FgZWVqU2R4eXdKR0VkXWVaaGlTaWhqbmNqZmBjX1xdXV9pYmFoZXxkXmRnZGtkamxmaG1omJt/sKxUXUt+qq+xtLCzopyYhJemoKCijKSnn5epipmYmZSak5KgmI6IhXtwfYNofY+Ck5qBd5GOj4pwgIaPk5JsmJN8iJGSo5WDjqmZk5KKhYl5g3aIgG6Bn4Z3gJGFh5ihlniSoaOZn4mzoaK2i3qsp6SupXGpgJuRhoKflX6lgaObhphxnoSira6Jl4t/jKSNlYOvo5V3tba2yaJ0lI2Dn2Cdl6lteZaHoJt1oYd3oH6Rl4uBb01mo5Nym4l0pXt6dWKEg25+oW1yZGCcc390mGt7arS2tMamc5h9eZxqmpmrc4CabHN3l2mZeXSYcVBEfbNeanZreIdma2Zic3RvbFVbUlloT1FoSVVMWFJVXGdrblVnV01KQUpNS0hKTkFRSlBlY2ptZXVzc354e250iXp7VVFObV5oXGtpUmpoaWxnbWZjZV9cXFxfaWJkaGt7X11kZ2NqZm5tZWltZaKdibCohWVAlKKyq6+vtaGij3+Wp6Gho4ukpp2cpoKZl5eOl5CQm5OOiIN5a3mGZYOMf5efeXWPiIyCaoWFkoSLhZ2NeoyKlaWSgpeolouRi4CIeoB9i3lwj6CFeYGUhoiVnpR+k6Smm5WWg2dueJxsomR8cqV4nJhwaKeDmo59pXuil4OWcp92gImUlY+5bpCKomJ9maOXiW5za6trdaBucKdhm2qLkGmWh5uVdaKBfppgi4aNdW+IYmihZp5/apt1cWVniYJvc6JbX1tkoW5eiY1xfIB0cmSlbniiY2anZ5dxi5dtoW9SiI9uoF5kp1SLXVSYbW1ya3GBbXBoa3dzam5RVlVVZVhTbElYTltIV2hoc2pZa1ZQUkVWXE1YUmFVaGped3V7fHB9fHKCe39zd42Ag3deUXNhZ2JwZ1BraGhrbG9oZGdfXV1dYGpiaml2dV1cY2hjamlybGZrbWOdpZmmemV0bYynrqWpsLGln4t/lqmcnaOLoaGaoqKAlZmTjpqQi5eRjop7hnGAiGiLinyXmnN1iX2QfGWDh5WKiZWagnyIhpamj4Chqo+FkIqBiX2AgI5zaY+mg32FkoyHl5+NhpGppZ2JpniWm36liZaMspmekYSvl5+lepiJe6l1qJCEmm6looyShIyDvG18pa+Ch4WHlZieon6mfHOolaGWaZ9/cKxjloqWk3iobaqjgYl2iYN3q5GmiGuSsWx3s42pbIuGb2+gnpKVYn+rjKp4gYCOp593n32FpJadoGiZh3WsZp6tjLZzdr6MpJNZg6aNq2F1cnRve3VwYmp9bmdsUlRYVGBgXGtMXFFbSV1sbXZfW3FYW19aZ3Nlbm9xY3F0YHd6fnlyeYNzg36Be3uMgYKAdmJ5ZGNuc2RSbGdnb21yaWZpYV9eXGFqYmxsem9cXGJpYm1pd21nbG9ilqarnYGAn6WWqqqep6eto5iIgZapmZ2iiZqknKidhIyaj4ackYWSjYyMdIV6iINvjYV+l5N0dYZykYNuf4uSh4aUj3x7gYWXpI1/paSNgI6JhJR1goeTbmyLqICCi5ONiJueiIuSqqKgkIB0lJeIfoF5lK+kf4KdcY+GeZOOh4F7c6mNcX19epiWm4SNeHt9fYeTlZOLd5KaoaKEe3+LbY2GXHp5c3txaW5+k4pygHSCj5STcYaEg2aNf1+CgYx4d3SVdnB6b3CJboWGX3dpeI5ngoOGj6qcf3R9lmmJiG99dXuCdGxsZoxzeHuXd4Rba1d5j2lud3Jxb3d4b11rhW5pZ1ZZXlZcZWpjVWBUXVFeb3d5a2p2ZGlqanV8cHF0c2FvdGJ0e4F4dXmCdX+Af4F5i4WCfntugG1keW5eV25naHVreGppamRcYFpjaWVscXVuWltia2Rsa3ltaGxvYY6Vuqmni6Gjm6akmaSdq6Gfg4OWqpGdn4iZppqomYOBnIt+lpSHjoqJjHKCfI58fo+Ee5eOdHOEcJWGfH2Si4aGj4V4foCGmKOMe6afioWPj4SVgoaOmHdxhKqFjZGcj4eenYeLmqefoKuDiY2Vm39+ipetqJCTqJF5cZ+UhX2VcICrh3F+lXFqb3yBn4t/kY2KZ21dhI2OnZ6gkHOXjYpzdWyDd3SBWXJvh5GCfn+Mal1pZHuFhImAYGl5fJx8hI2Ed4KIhWp6jYlsYnFzg3dgdI2DipGolodnjY6CbHaKgW6CindtY2VjeYN6lVpcaWdudlt7eXd0bXNyg2ZcbYpra2JZWFxZWGtxW15gWV1dZXJ9enRvdGJqamp7fHF6dnRkbXRobXt+dXp9e3l6gIB/b4aJg3t9c396c39oVFxyaWx2cHVnbGdkXWFZamhranFybVdbZW1sZ3J5b2hqbWCMjKuyopCjoZqenpidmaihoH2ClquMn5OGmqKRpZV/e5iFfJKZiYiGhopyfYCKdoSLgoSWinJvgHOYhoR+k4ODhoqCeoCDipqfj4GloIZ4jpeIlYqLnJeEg3msgZCXmJOJnZyGh6GqnqKipIuHk5udo5qWq6KoqKKTnYmZkX56kZCGqoB/k5GSk5yxpZqUno6MsJGYhKaOjpadoYqRnYSKk4tsfY93eGaChpGLfYmehIiMj4iIgYWEkXh8e3WcpIqIjKCMh5aAgI6DgXdxdYaFgHmJiIuRp5GEh46HgouPinqDiIaMf3RqgYN8eZlpcmhgdIpxfnt3dm92dIFdXm+HZ25fXllaXFNncVVjW1tgbGd0e3tybm9jampof3tteH5waG9va2aAe3KCgHd/fX+Fe22DjIV8enl8fXqEeE5kdmpzbnF7ZWxlYmJgW3NmcGZycW1VXWx0bWh4enBnaWtljYieu5+Xo6GYlZmYlJikoJx6fpepjZ2MhZ+ci56XfXiVg3uOmYmHg4SGbXiAf3KAh36Ik4RtbH56l4eEg5B+gIaEh3yHg4yanZKGqZ2CcoqPhZKRi52RfI17qYONkZeVjpuWhYWbpp+imp6Gg5KamZmQmaahpp6ekJeClI15foqQhqd8fY+QkYaYqqGckpyOjamNkYCejoqVnKCEj5iAiJCEcHmHcnVhf4SQiHeMmYGEj4GGhX+GhJVuenZ1lKSMjYechoaPdYKMfn5zc3yKhXx6jo+FlKiQh4SPgYKJh4dzgoWGiHltan1/e21oa2xnXnl/Z317dnV2dXt3XGBwfW50YGNaW11RZmxTZFpdYGpodXl+cGxsY2tqZ4B/a3J/a2t0bndthHluhoB2goB9hXdxgo2Hfnt7fYB7gotgaXtrdWhqg2VqY2BpXGN1Z29idW1sVGJxeWVveXpyZWptbYuKn7iaoqSfk5KWl4uan56cenebpJCbiYaklIuYmnl6joV8ipGDjIKCgmx7f3hygIV9ipB9a2h9gpeJgYiOfH6FhId8j4GPm5uQiKabf2+KiouShqChioWMfKiQh46RlpKWkneMo6ChnZabgIGQmpiTjZqjoqSbmJKcf5CIe4KGkImhgX6NjY98l6SgoJGZkI+ljI+BnJKKlJmdf5OTf4iQg3V1gnF3YX6BjohzipZ9iYxxjX+DhoePaHhyeo6ak5GBmYCJjHODiX1+cnp8jYZ8e5OOhJemlIyGkHuEhYWCc3+AhIV4ZHB6f3h5cGxqZl5+c2h8dXZ0fHOAal5gdHdwd2RjWF1eUmloVGRYXmBnaXV5gXFmamNsZ2V/gGptfWdtcGp9d4Z6a4uBcoGBfoF1doKNhn98e4CBfX+PanKDbnRpYohpbGJfcVZ0b2xtYHhobVdqc3ZjdHp6cWJrb3mJjZ+zkqWmnY6QmI+FnKGam3x1o5+Nl3+MoYqIm5Z4fIaHfoSKfoiCgH9wfnt0dYKFfomQd2djfYaXioKKjXh9gIyDeZaAlZeVjZWemX1vi4GQk4Wlm4eMiYOmlYSSipWXkpF2kZ2hoZiUmHp/j5iXjpaanaWempSVnXuSiYV6iJiPn3+Ci46Mc5einqCRl46OoYyMg5iYhJSXmn+Zjn2KjoJ4cn5ue2SBfYuHcYeUgJGCa4eDgoCLhmZ2cH2IlJqOfpV5jYt9gol+fXKAeYuHe4aSi4yZpJeChIx2h4OAf3R4f4aCc152d31zfXZmbGVhf2lqd3N0dX1xfGNkYXNudXJtYVlfXVprY1JiV19fZ2p0eYVwYmpia2ZofIJraHRobG5of3yCeWyPhXGAg4N/dHyDjIGAfnqCg358kG11iXR0bWaKbGphY3VWg2lwbmB4Z2xhanZwZnh7eXFfcWyFhZCdr5inqZ6OjZeHhZ+TlZd8d6ibiph5lpyLjJmQeXyBjH19g3uAg4B4c3h5c32Ag3+Ii4BkXn2LlYd/hYh0fX6Jf36YhJaUloyjoJZ+cYZ7k5GKpo+MjoqSoJGDkI+Tl5GKgY+XoJqSkJJ0gI6SlImdnZ6nmZmOlZd1kZKMbYiakZt7iImQiW+XnZqikZSKi52LhoGTnYCUlJaImop9i4qCe3F6a3ZtfH+Mf26Fk4OVeHCChH5/jIFlc2p9gpiYhYCPdZKKhXqJf3d4gX6Hgn6Fj4eNlaWReYWCdIiGe35xcn6EgWtgeXR5cHxuYW5jZXtibm92c3h3dHRhd2BvbHVucF1aXl1daV1PXFdiYGdscnqIa19pZGljaHeHbWZsaGlsZ4B8endukIhzgIOFfXSBhol6g316gYR9fI5yeYt4eG5siGtoX2lxYodocW9ldmdtbGF6aGp8e3hwYXdti4GZmquhpamei4uRhomdi5SWfHasmIyWfJ6TkZeUiXd+e4p9fIB2eH+AcHRzem+FfYGAiX58YVx+j5GHgISEcnp/hnqPkYeRkZuSpJqTgXyBfI2KkqSJjYqNlpqMhZCXkpWNiIiMkp2Tj4yNboSQj5GJnpmioZiYipeTcIychmiJm5CVe4mFkIpwlpqUoZCQiIqYjIJ/kp99k5GUjZqQfIuGiXVzdWtxbnV9i3VvhpGOknJ0gHyCgop+ZXJuen+blX6FinWSjIJ1intwgn+CiH6GjouGjparjnuIfX6KhHZ8bmx+goBhZndzdG56Yl5vYWt0XnBqenl5bXRxZXpebmxzbXNZWV1fYGlaT1ZXZGJlcHF/h2VdaWhmYmdxjW5jaGhlaWiBend1b46Fc4GCg3x2g4mFeIV8eISGeoCJd3+Le3tzeYRra19vaHR/a3FvbXFnb2tle2Ftf3l3cGx3d4l/o5mjqKGnm4iLioGOnIaSmnR/qJSSjYagjJaUkYF0fHaFeHh/cnN6hmxyb3htiXaAgIducVtZfpKNiICBgXZ1gH9/oIaPipKcl6CSlneJfoCMiJyeio+GkpeWhYiTmI6Wi4qNjoydio6RhG2Ji4+RipyWoZyZloaZiWyIpoVoiZ+Mk4CNhYyBeJOYkp2Qj4iIk41/fpCZfZKOkY6bk32LgYVwdnBsbm9xfIdqc4OPmYtyeIB1gomEemd0cHeCm5B9ioV7lZN7eIp1cot8h458jIiFio+cpYl8hHaBiX53d2xofX9+W3FycW9vd1pecGBwa15vanx6cW5tam13YHBva3FuWVhgYGBsV1BTWWVlYXRvhIJhXWtsZGJma5JuYGZmX2dqgXVycm+LgHR/g4F5doGLgHmGf3iHhnaDhXuHi398d4t/anFjfGKFfG9wbHRqaG5sd3dfcX55e3R1c3+CfqWVm62fp5eFjIN+lpWDjp10iZ6TkoaLmoyWjox6cnh0gnByhHRxdYhsb2x0bId2g31/bW5VUYGrlIeCeIB2coJ5gaCCkIGSkpiakZh3kHqCjJKjmpOOiJSYkoSFlpiLk4uJjo+InYSRi31yi4WIj4icmp+bl5aBlYBqiZ+KaYmiiZSFkoSKcYORl4+ajI6Li46Nd3uTkXuQjI6TmI18iX6CbHdqb2xsbXuAYnp+kJeCd3qCeIONfXpodW12iJeMgImHfJWScnyGcniOe4yOfIp/hY6Rn6CGfXx3gYp8dm9naX5/dl12bm1rcHJVXW5icmFfbW55cGhwZmd0dmlxbGF3Zl1VZWBfcVNQTltlY1x3b4h7XlxocGFiZWaRal9nZFtnb35vbHFzin12fIaBdXZ/jHl8hoB4h4NzhoV+jIyEfHqVeGdya4Ngh35vb2t7YGltdIB0XnN8eIZ4dHOFfHmhkJqxnKWPg4p/gpmIf4mbfoqYko6EiJiOj4+Ed3R3c4BwcIV0cHGDb2ppdW2Cbn18bXVzUk6C38mS1pN8b3SDdYOfgpF2lJCYm4+Ye5NyhZCfoZOTkImSm5OFfZWVh4yNh5KNiZx/joF4e41/iIyJnJycm5aUeo54aYuUim6KpYaUiZiEhmOMkZiNlImWi4yJi3B6lYp8j4mLk5KKeod9f218ZXNva217elyBepCQgXt+f4CGj3t6aXVrdIyQi4OHhn6XjW2AgHCCjoCOiX6FfISRlpucjH13eIKOd3JrZG58gGlnc25naXNsU11uZHBZX2xxd2dra2JneXRwcGRgeGFgVWtfXnRPTUtfZmJbd3CJdFxbZHVgYmVljmNgZmJYaXNzbWtxdot8dHmHgnZ3fotzgId/eol/comHgZCKiH1+mXZlc258ZYd+bm9rf1lsbnl6cmB2enuNdnJ2iXZ5n4ycr5ugkIKEeIeUfnuIm4aEnpCOhYyXhJOPiIF1d3B5cW+DcG1ufnJjZHdwfG56fGpobGKkmsHcru+ic2x2g3WEoYSRbpWPlZ+TmoCRcIWLo5eJjpWKkJ2Wg4CUj4WIj4CSioqXf4d7dn+KeIaFjZubl5mQkHaLeHCJi45/jaaGk4uehoZei5SXiY6IjYqKhIlsfJeDfomGipGQhnaHfn5sfWR4dWpvenRYiXuSiIZ6f3+Aho1/emd0aoGKj4uEhIGNmIdtg3dwiZKDkoaAhHyBkpeUm5F1dHiHi3Ryb2Rydn9fcmxvYWh0ZlJgcGdrVV9uc3lhcmNgaX5xc25bY3NiY1ZuWlx3TExLY2ZgXXVyiW1bXGR4XmBkZYRfY2NeWGlya25rcneLfXN3hIF5eHyJcYOFfX2Ie3SLiYeVho1/fphzZ3VxeW2Lem5zcIBXcXp2eXFkdnmGjGh2gIlxgJ2Imaico5KEfXCLk3d4iZuDhJ+MjnyWjX+aiIV8c3dwc2pvgWxqbXx0XmB3dntwdHpnYGV869q1ycPciXNsdIF2ipqIjGmXj4+blJKBiHCFiKCNhYuVioyXk3uNkoeCiI96kYuGj4KAd3iDhHKHgpKblpOYh4x2iIByh4SMiZykhZaOoISKYYOVj4WIhYiMhoCHaH2UgH6DhYqOj4Jyh3+AcndodnJpdXhtWo19k4OGfYCDgYSLg3didW2KgpGMg3+AlJN/cINteoiRiJSGfYN/gZOUkZiJbnF5i4R0am9pb3V+XXJobVxpdF9RZHFoZlNfcXZ0YHBgXWiEcXNqV2dpZGlYbVdbdExKS2VmXmFxc4VpW1xleF1eZGd6YGRfXVlrbmVuanN3in5zc4J/e3Z6iHOFhHx/h3Z2ioaPmIGNgnuTdmx3dnl4k3Rud3p8WHmGcYBuZ3h2kYJkdoaFcIqXhpqhm6KKhnNukYpydo2afImZiIl8n3+Emn+CeXJzbm9kcn5pZmx3d1tfeHt6cXF/aWFnYX/Vto6RpnhucXd7cJKQjIZqmI2ImpCLhXpoh4uZhoGSkIaGl418jIyAgImNe5CNfomFenV7g3xxhoCVmY2SlIKJdoSIeIaDjZWgoYiXkaGAiWF/lIeEh4OIjH9/gmZ9kYB/gIOMj5B+bYN9g3VsbXd1dHh2a2OOgo+BhX98hICFiX9wYHRyhn2QjoN9gJKKe3KFZ3uFjImOhX2GgIGVkJGUhW5veIt+dGxtaGh3eV9naWlYa3RZUmhyaWJQYnJ4bWJlXlpqhG50Y1xoYGVtX29UWm5NR05mZFtmbXGAa1pbYnJfXGNsdmRlXV1abGxibGpzdoZ/cW9/fH10eIZ4hYN9gId1eImBkpV8iYZ2iYFveHl6hJJvbXqAdl6Df3SBbGh6c5RzZ3KHfHGSkoSan5ugh4Z1dZN+bXWSlX2HkIOKjZp9jJp2fndyb2xqYXR8Z2JpdXlaYHd7eW1xfmVkaGhXnY9fcnOXvMSEdXGUiI99cZaLhpuSi4dyaYiOlYB7lYuBhJqLfIqFfHuJi3+UiHWJhnZ3foFydYWBnZSFlI+EhHKBineGfoybn5qIlY+egYlmfpOCf4WCiIhxgX1mfox8eX+AiIyPfWmBfoR2Z3B5eHR4dGxqj4aLgouAeYKBhYSBbF9zeXt+jouGfIOQgn9zg2p6hYmNiIZ5hX6CmY6RjX5ubXqIfHVzbWZlenNhW3BiV25xU1NtcmhhTmd1eGZgXl1Zb4FvdFpmYl5rbmBwT1lqUURTZmBZam1tfG5ZW11sYlpib3ZkZ1xdYGtpY2tqc3aBg3Fuf3yAdHWDeoODfYGFdn6IgZaQeISKdIGIcnh5fo2Qb296gHFpgXh6fm1se3WVamp3hHNsk42Gn5mfmYWHbn2LdWl3lo1+gYqClJeKepCWb3t0cWtqZGBze2hgZXF6WmByfHlncXlgZWWPsbJ3S2JapdnQlnF6kIqPd32TioSYkIuFbmuFkZF6eZKGgYSYinyGf3d3iYqEloBvi4hxdX57anmFg6SQg5ONhIBwgIR4hnuInpuWjZWRloWIcHuTgn2CgoiCbYF2aICFeHKAgYOKiHxlfn+FdmRxc4BpeXFwdZmOhoOKfXd5gYV6g2tccn9zgomGin6HinyJc4JucoaIkYeHdIZ7gpqNjoV5bm59g351eWNlZ3puXVh2Wldwa05XcXJmYEtsd3RhXlxbWnV+c3BYZ15nanJgb05XZ1I/WGZeWm9qZ3lxW1pYamVZY3B4X2dcXmVsZ2ZraXF3f4dvbH9+gHVwgnuAgn+Cf3aBhIiXiXGCjXF7hnx6eYSUjHVqeX5rb350f3xvcnt6k29ugX54Z5KLgqGZnJGChWaGgm9neZSIfX6EgpiKgXyOjWh4c2trZl9hb3htX2JveFxka4J5YXF1X2Vl1Oq9izI6PouOf3F5hYeNjXWClox+ko2Lfm1rhIyMdX2Pf4WBlIh8gndudoeEg5d3boiFbHV7dWZ5goOmi4KOi4R+boF2eIV8iZ+Sj5KTlI6Mh397koZ3foOMgmt/cWiAfnlufHyCi4R3YnqFgnJkcml+bnVydYKcjIGAhoB0dn+BdIJwXG6AdXmMhIt8iIF+iXl7cm2KhZKFjXSDeoCYjIuAdW1qdoB/dHNbZ2d1bldWfFNZb2RMWnJyZVtJcXhvXFtbWV11f3VpWmJbaGZvZGpNV2VQPV1lXF11ZWB0b1pZVW5jWWRxeVpoXWBnbWdpa2lwd32ObGmChH95boB8fYF/gnp1goGNk4RwgYtueH6Ae3uIk4l/aHp9anN7coZ6c3Z9fox5eIR9fGuLjYObnpaLgYBsjH1qaH6Ni3p9foOUgn59iohrdXFnaGJbYmdybl9ha3NgaHCIeWJzc15jZJugj25dNlqvtXRpgIh8kYZ1hZWFc46KiXZvbISChnR5iXiJfJKHeX5yZ3aJfn6Yb3GHf2l2eW5meYeEpIeAh4yKf2+Ad4KDgI+ciYSWk5mKjIWJfJCIcHp9hHtofmxqgHt6ant3goiBcmB3gX5yZHJndoNudXyGlpKCfYOBcHh6fHWAbVlwgHd1jYOHeIh2hIl8eXRvi4KSgodzgH5/lImKfG9uaW2BgXRtW2VkcW9QWnpOW25bT1tyb2RVS3N4aVdZWlphcYF1YV5dYGdkaWlmTllnTUBgY1tgdWBddWxXV1N0YFpkb3JXal5iaGtnbWxpcHd8kmtohIp9fG9+fnuBgIF6d4B/iouDcXyHb3J4g397iYyPg2l9e213eHaLdnx4f4KGf4N+fXpthIuHmKOMhIN7dYp4amyDh5B4fXqCkYCAfouDcHJwY2ZeWWdfcG9fYGdwZmpuiXRhdG9bYWRqdXqAv5ympMi4cYSCcpJ7d4WSgnOQi4dycm+De4NzdId0iHeTiHl5cGN3h3qAk2lyhHdnd3VjanyCh52BgH+Oj35zgHWHe4KVkoV7mI+WkIiCiXuJiWt4eX50Z3poa395dGl6d4CDfWhgeIh9a2t0aHyBaXaCjJKVf3x/gHF8d3x0gGNWeH5zdIuFgn2EcoiKeXlycYWDj4CAen9+d5CGhHdqcWhsh4Fxb1xmYHFsSWR1S11sVFNZcm5iUU90eGFSWFhdYXCCdF1iXGllZWRrZFBbcElDY2BbY29dXXhnVFdWdl5bZm5oVmteYWpnZW5uaXB3epJtaYiMeX1ye355goGBfHZ9g4iGg3B3hHJud4KCfoiLk39wgHt4eXqBjHSCeH+BgYKEeoB1b36Ki5ueh32FeXeFemd0hYuQeX5/e4iFhHeQgGdwbl9kXFhlWWxyYWBgcGxraIluYHNoWV5jbn93qdqpx4aHsnGId2+MdHqFjX95kol/dHN0fXd/cHF/bYR0k4V4dGtgeoJ5iY9mcoRwaHVuW219gJCTf4B4kZN+eXxuiniDk42Gd5iMk5CIhoV8f4VsdHZ+bGd2ZG17dm1qd3d/f3xhYniGeml1dWN+fGh1h4+Nln12gXdxgHt9boFaV3V/cHaFiH+Aem2Kh3V5bHaChIV/fX56fXSMgn50aHRlboqDbHJZaF1zZEZtbUtaYFdWVXdtYlBSdHZYUFZYXmByhHBeYWNtZWReb2NUXHFGQmVeXWVnXVt6YlFWXHRbW2drYFZqX2BvZmZrcGhwdniOdGuOjXV/dnh9d4GEgXt0fYOIh4NvcoB0cXV+hYGJjYp6dn94g3t8hod3h3x9gX2EgHt+cnV5i42gjIh5iHZ0gnhefYWXi3iGg3SFhoR4intibmxbYltbYVZpc2JgW2ducGaHcmFxZVdcYmt/fMrOh7mham1timxxg3F7g4l+epCEeXhzeHV0e2psdmOEdZGCdm9mX32CeoyKZXKCa2pxY1hseoWbiIKBcpaVd399b4pzhY2OinSZkJKJhouDe3l9cHBvfGZncWFteHFqbHF4fX16XWV6gHhqdnhmg3dodIiMjpZ+c4lrb36CeW99Xllzf250gYt8gm9wioByd2l4gYKBg3h/c3t1iH17c2dzYW6LgGtwVmlcdltHbWpNVlVdU1V7a2FPVHVyUFFUV15jdYZpXWBsamZjWm9hWGJvR0FnXGBlXlxWe11OVWVwWVtqaF1XZ2BfcmZrZ3FncHN3hnhulYt0f3p4fnmDiH91cn+HhY6DcHB8eHd2eoWFh4yGeXt/dIt9fYaEg4d/fn59hn58eXV4d5GTn36LfIptdX94Y4KGlYZzkYpvhYWBe4R1Y25qWV9bXF1UZ3NkYFhjcXJngHJia2RWWl9qf3i+rnuft25hc4Voc3pxeIGFen2Lfnd3cnZve3Zlam9hh3WOgHNqYl5+eXmLhGZxf2hra1pWb3eJo4GFf3CZk3KBenaEb4OElIp1l4qOiYWJhX14dHFuaHhfamxgbXZqZ2pseXd6dlpnfXx5ZnN+bYV1ZXWGjoaXgHGNaGt7hHVudmNdcX1sdX2Me4Jndoh+b3Jpd4B6gIF0fm17fIN7eHFmbGFtiX1rbFVpX3ZVSmlqTlJOZ0xYe2hhTlV1a0xQVFVfZ3aEZ15hcWhnYlhpXVxrZ0pEalliY1ZZVXlZTVZtallda2RcWWRiXnRmbGRxZ3JwdYF3cZmGdn9+d398hYd9dXOCiICVg25zeXt6dHOEhomJg3iBfXWPfnyFio2DgoR7foqDe3d8d3eanJd6iIKGaXZ8e2yDg5KAco6BcYaCf4OAcGZsZ1hdW1xbU2RwZF5XYnJ1aXVvZWViV1tbaH9wb3KAc4lkZHl9aXN1c3KBg3eAg3h2cnVtanpxYWdrZ4ZzjYNtZl1ffXB7iX9pbXhnamRVV3JvjKZ8hHt2lpF0fXR+fG9+fZOIeJt9iYeDh4N9dXBxbGd0XGxnXmx0ZGdmaXpve3JZZ4F3dWhwgXiCd2J3hot8lYJvjWtue4NyZ3RmYW56aHN4i3t+Y3eEd2tscnV8cnt7dX9of4CAeXdvZGZibYV7bGpVaGFvUkpoak9LTm9HXnpmYU1VdGRKT1NXYWt3f2ZdZ3RpZmBXZFdicFxLS2pXY2FVVFVyVktYdWRaX2tgW1pjZF92Z21icGl0b3J/dXSZgnd/gHiAf4aEenx1goR+l4VucnR8enVxhIWPgYB6i3ZzkH98gZWNgIWEfX2Mhnp+gHd7o6WKeYeFg2t0e3p1goCLem6Ec3mEfYKDdm9qaWVWXVtaWlNibmRbWGFze2pobWlgYlheWml/aWtwgGdsYGh5eGpyc3Ntg4B6f3x1dG16Z2l5al9lbmiBdo+EZ2VYYndqfod7b2pwZ2ZdVFhvZ42ndoB6fJCOenZxgHF1eHyTgnqXdoaEgIaIdmpydWdnbltsZF1tcl9oYWp5aHtsW26DcnRqcIF+enhhd4aFeZCFdIlycHqBc2Nyal1xeGVydIh8eWN0gXFnanl1c215eHZ5ZYR8gHl3cWRkY217fGpqVGdhZVNKa2ZPR1FqRWF4ZmFNU3JdSk5VWWVseHxmX25xamVdVmFVbm5WSlNnV2VdWE1Va1RJW3lfW19qXV1aYmVfeWhsYW9vdm5weHV6mH53f4F5gICHhnp4eYN+gZODcXR0fnp2dISIkX2BfJFrcpWAe4OfhX6HfYB+hoKAint3hKuef3qHh4JqcoB5dYB+gXRuhm59gHOKgGpwbmRkWV9aWVpUYmpnW1pfdYJpXm1sXGFXW1trgWVxdH1paVxrdnVnc3ZxbIR7fXx4dXJseWZpd2ZdZHNoeneSgWNjVGVwaIKFeHhnaWphV1ZZZ2OOp29+d4CLjntxcn9pe3F9j354kHOFfoCAhm5kdnJkZ2dcamFdb29baF9tdWV6aF10gG9ya3J8fnV2YnWGjHuJiIGBeXN1gHZicW5bcnRjcXOFfHVlc4BtYW17cGtqfHp2dGeHd3t6dnFlYmRtcn1palNnXVxUS3FiUEZWYEdjdmZhS1NvWEtNWFhoa3Z7ZWVucWdkW1ddWHdlVEpcYldnV1lIV2RPR2F4Wl1fbFpeXGJjXn5pamBvdHhtcG92g5h6coCAfH+JjIZ9dXWFeYeMfHN1dYF5enqBjI58foWJaXOWgXqKnH5+hXqBe399holzcY+ti3t7ho98ZXGHeXN8enVyboVse35sj3pjcG9iZV5lVllZV2Nma19dXHOFaFhxblteWFpba3picHd2bGFZbHNzZ3R1b2yDeH5/eHZtbnNkaHRlW2d1ZnZ2kXpfXVJmZ2uDgnR+YmRqXFRXXWJjjqRpeHODhpF5bnF8anpvf4l+dop0gnl9eYBpZHZtYGZfXmlfXXRrWWZdb29iemVcd3xrbm9weHl0dWVzhJOAiIOJe3dwc350Y3hlXHFxYnFygnx0Z3OBZV9ud2plaHp9dW9wg3Z0fXNyYl9mbW58ZGhTZldYU012XlBJWVdIYnRjYUlUbVNKTlpXamxyfGNtbXNjYlpaW2F3XFNLY11XaFNWRlhfTUZpdVheYGxbW19hYl2EaWhhbnh5bXBrdoGQeW2CfoCBk4iEgXZ0iHSMhnRxdnaBeH19foyQf36UfnB3lYN9mZJ5gIB4en1/dIiEdHGZoHp6foeUd2N0h3hyd3RrdG9+a3h8cJFzXnBvYGdibFRaWldoY21mXFxxiWVTcm5bWVhXX2t2ZGl1amldWW1zcGtzc3NphHx+fnp2bm1rZGlwY1tqcmR0do5zW1ZTZWFygH9ygl1iY11TWmBcY5GfZXFxhYSSdWxse29wcn1/fnOCeIF0e3p6ZGV1Z11iWWBnW152aFdiXXBpYXdhW3x2aWpyb3h0c3VpcYKWhId/hXd0a3F+b2d4WF1sbmNyc4B6dGdwflxgcHJiYGtzf21udn9zcXhrcGFcZWxsemBmUmVUV1FPdVpRT1hRSGNzYWBHVmpRSVFaVmtra31mbm9yYltaWFlscVdSUGZWVmhTVEVZW05IcXRYX2NsYlhgYGBdi2pjZG16eGxwaXV5h3trg32AhJp8g4R5fIhuj4dybnZ6fHSCgnyLj4KDmHR4gZOFgZ6JdYGAgnR/gnGIg3ZwoZZzeYWKhnpkdopubnpuZnhweWtydnONa151b2FnZWtSXVtVZ2Fsa1pccYxkT29uXFZXVGZpc2hidGVkXFhudGxvdXR4aoZ8f3uHdo9zY2RrbmBcbm1jc3iHa1pUVmNkeH19cYZdZF9jVFpfWWKVlWNtcIOFinRraXxwZ3V5dn5te3V2cHt/dV9mc2NbXVZhY1hhdGVVX2BtZGFxXV1+cGhpdHF0cXV3a22FlIKJfYdyc2dwf3J0cFRcZ2tmcnSAdnRjbXdWY3JsW19wZ35mbnh+c3Rzam1hWmRpandeZVNjVFVQU2xWUFZTUEdkcl9hRlhpT0lYVFduaWV9amx4bGJXXVVbdGRTUldoUVhmVFNHWVlPTXd2Wl9la2lZYWBdXo5uYmZreXZub2l2doB/bIOAfYeYe4CHgIl/a5OIcmZ0gHt1gIN9iY5/jJNyfIqRhIefhnt/ho10gYZzfoN2bqSLcoCMinZ2bHmLYGR7cGZ5c3hsbXJ3g2dkfG1jZmdoU19eVWdfa29bXm6NaE5pbWBVVlNuZnNrZXhlZFxYb3NscXp3cmyHe392m3p5a2FlbG1eYG9qZXF4fmdaVlhgbHh8e3CEX2NeZ1ZYX1djm4hia3CBh314bGx6bl14dG58a3Z0b3B8gXNYam5fWVxVYWJXZHBiU19iaWJibFphfmxmbHR2b213d2xpho2AinuJbnJmcn5udG5kW2FpaXB0gXRzX2ltU2VxZVZjb2R8ZHN4fXdscG1rYFlhZmd0XGRVYFVSTldkUU9bTk9IZG9cYkdZaU1KX0tZbWRgeWlufmVgVV9UXXVcU1JgZk5cYFVSSVtYUFl0dV1fZWtoWGJgWl6NcWNnanhxc25odnR7hHKCg3qIjn58iYiNeW6QiXRrc4F0f3+IhYeRhJaPeX2Mj4eRm4SAfI2Fc4CBc3R5c2+Tk5OTk5OTk5OTkpKSkpKSkpKSkpKSk5OTkpKSkpKSkpKSkpKSkZGRkJCPj4+Pj4+Ojo6Pj46OjY2Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2NjYyMjI2NjY2Njo6Ojo6OjY6OjY2Ojo6Oj4+Pjo2NjY2Oj4+Pj4+PjoKAfnp6fX5+fX1/fn5+fn5+fn5+fn+Af4CAgIGAgIB/gIGBgYOHjI6Ojo6NjY2NjY2NjY2NjZKSkpOTkpKSkpKSkpKSkpGRkZGSkpKSkpKSkpKSkpKSkpKSkpGRkZCQkI+Pjo6Ojo6NjY6Ojo2NjY2Njo6Njo6OjY2NjY2Njo6Ojo6Ojo6NjYyMjY2MjIyNjY2Njo6Ojo6NjY2NjY2Njo6Ojo6OjY2NjY2Ojo6Ojo+Ogn99ent8fn59fX59fn5+fn5+fn5+f4B/gICAgICAgH+BgYCBg4aMjY6NjY2NjY2NjIyMjIyMkpKSkpKSkpKSkpKSkpKSkZKSkpKSk5KSkpKRkZGRkZKSkpGRkZGQkJCQj4+Ojo6OjY2NjY2NjY2NjY2OjY2NjY2NjY2NjY2Njo6Pj4+Pjo6NjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Njo6Ojo2NjY2NjY2NjY6Ojo6Cf3x6fHx9fn19fn19fX59fn5+fn5+gH9/gICBgYGAf4CAgICDhouOjo2NjY2NjIyMjIyMjIySk5OTk5OTk5OSkpKSkZGSkpKSkpKSkpGRkZGRkZGRkJCQkJGRkZCQkJCPj46Pjo6Ojo6NjYyMjIyMjI2NjY2NjY2NjY2Ojo6Ojo+Pj46Ojo2MjIyMjIyMjIyMjY2NjY2NjY2NjY2NjY2Njo6NjY2MjIyNjY2Njo6OjoN/fHp8e31+fH1+fXx9fn59fn5+fn5/f3+BgYGAgICAgYCAgIOGi42NjY2NjIyMjIyMjIyMjJA+LjExMTEvb4eEhISEiF0tMDAwMC1GoaGhoaGhoJqZmpqampqKg4SEhIOEd2VnZmZmY4C+u7u7u72zbWZnZ2dnZ21ubm5ub3JKLDAwLy8sSYWDg4ODg4OLjIyMjIyMjY2NjYyMjY2NjY2NjY2NjIyMjIyNjY2NjY2OhX19e3t6fX58fH59fX1+fX1+fn5+fn9/f4GBgYCAgICBgICAgoWKjI2MjIyMjIyMjIyMjIyMjy0aHR0dHBpohYKCgoKGUxgdHR0dGTekpKSkpKSjnJycnJycnImBgoKBgYJyXV9fX19bfsjExMTExrtnXl9fX19fZWdnZ2doaz0aHR0cHBg7g4GBgYGAgYqLi4yMjIyMjIyMjIyMjIyMjY2NjY2MjIyMjIyMjY2NjY2GfH16e3p8fXt8fn19fX59fX5+fn5/f3+AgYCBgYGAgIGBgYGChYqNjYyMjIyMjIyMjIuLi4uRiYiIiIiIh42QkJCQkJCMh4eHh4eHiZKTkpKSkpKRkZGRkZGRj46Ojo2NjYuJiYmJiYmMkpGRkZGRkImIiYmJiYmKioqKioqKhoODg4KCgoSKioqKioqKi4uLi4uLi4uLjIyLi4yMjIyMjI2NjIyMjIyMjIyMjY2Njoh8f3l6ent8e319fX18fX19fX5+fn9/f4CBgYGBgYGAgYCAgYKFioyMjIyMjIyMjIuLi4uLi5GTk5OTk46SkpGJh46KkJKTj4iNjo6OhYqRkZGRkJCQkJCPj4+Pj4+Ojo6Njo6Ojo2NjoyLi4uLi4uLjY2Njo6Ojo2NjY2NjY2Njo6NjY2NjIuLi4uLiouLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyNjY2NiX59eHh5fH18fX19fHx9fX59fn5+f3+AgICBgYGBgYCBgIGCgoSKjIyMjIyMjIyLi4uLi4qLkJCRkZGPhI6QkIaKj4WNkJGKho6JiY6IiZCQkJCQkJCQkI+Pj4+Ojo6NjY2NjYyMjIyMjIyMjIyMjIyMjIyMjI2NjIyMjIyMjIyMi4uLi4uLi4uLi4qKiouLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjI2Lfnx3dnh7fXx7fX18fH19fn5+fn5/f4CAgIGBgYGBgIGAgIGChIqMjIyMjIuLi4uLioqKioqQkJCQkIqFjoiOhoaPiY2QkYqEi42JkImLj4+Pj4+Qj5CPj4+Ojo6OjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLi4uLi4qKioqKi4qKi4qKi4uKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIt+e3d2eHt8fHx9fX19fX1+fn5/fn9/f3+AgIGAgYGAgYCBgYGEiYyMi4uLi4uLioqKioqKipCQkJCPhYOMjpCOiYyJjZCQj42IjIiPh42Pj4+Pj4+Pj4+Pjo6OjY2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKioqKioqLi4uKioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMin18dnZ4fHx7fH19fH19fn5+fn5+fn9/f4CAgYCBgYGBgIGAgYSJi4yLi4uLi4qKiomJiYmJkJCQkJCMhoyJjoeFjYmOi4yLhomMiI2Gj4+Pjo+Pj4+Pjo6OjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKioqKioqKioqKi4uLioqKioqKioqLi4uLi4uLjIyMjIyMi4uMjIyKf353eHp7enp8fHx8fX1+fn5+fn9+fn9/gICAgICBgICAgYCBhIqMi4uLioqKioqJiYmJiYmPj4+Pj5CMjouPjIqPjI6MjY2JjY2LjYuOj46Ojo6Ojo6Ojo6NjYyMjIyLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLjIiAfXh5enp6e318e3t9fn5+fn5/f35+f39/gICBgICAgIGBgIGEiouLioqKioqJiYmJiYmIiI+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Ojo6Ojo6Ojo6Ojo6Ojo2NjYyMjIyLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLioqKi4uLh4B8eHp6eXt8fHt8fH1+fn5+fn9/fn9/f39/gIB/gYGAgIB/gYSJi4qKioqJiYmJiYmJiIiIj4+Pj4+Pj4+Pj46Pj4+Oj4+Ojo6Ojo6Ojo6OjY2NjY2NjY2MjIyMjIuLi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKiYmKioqKioqKioqKioqKioqKioqKi4uHgHt5eXh6fHx6e3t9fX5+fn5+f39+f39/f39/f3+BgYCAgH+BhIiLiomJiYmJiYmJiIiIiIiOjo6Ojo6Pj46MjI+Sj5COjo6Ojo6NjY2NjY2NjY2NjIyMjIyMjIuLi4uLioqKioqLi4uLi4uLi4uLi4uMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKiomKiomJiYqKioqKioqJiYmJioqKioqKioqKioqKioqKioqKi4aBe3h5eHp8ent7fH19fn5+fn5/f35/f39+fn9/f4CAgYCAgIGEiIqJiYmJiYmJiIiIiIeHh46Ojo6Ojo6Ojo+MkJOQkI+Ojo6NjY2NjY2NjYyMjIyMjIyMjIuLi4uLi4qKioqKioqKi4uLi4uLi4uLi4uLi4uMjIyLi4uLi4uLioqKioqKioqKiYmJiYmJiYmJiYmKioqKiomJiYmJiYmJiYqKioqKiomJioqKioqKhYB6eHl5fHt6ent8fH1+fn1+fn9/fX9/f35/f39/gICBgICAgYSIiomJiYiIiIiIiIeHh4eHjY2Ojo6Ojo6Pj4+PjoyNkI2NjY2NjY2MjIyMjIyMjIyMi4uLi4uLioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYmJiYmJiYmKioqJiYmJiYmJiYmJiYmKioqJiYmJiYmJioqFf3l6eXh7e3p7fHx7fn5+fX5+f39+f35/fn+Af3+AgICBgYCChIeKiYmIiIiIh4eHh4eHh4eNjY2Njo6Oi42Nj5WPiYyPjYyNjYyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYR+eXt5ent7eXt9fHt+fn59fn1+f35/fn9+f3+AgICAf4CAgICEh4mIiIiHh4eHh4eHh4aGhoyNjY2NjY+MjImKj42IjJGPjY2NjIyMjIyMjIyLi4uLi4uKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uKioqJiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJg355e3p8e3p7fX17fH9+fn5+fX5/fn9+f3+Af4CAgH+AgH9/f4OGiIiHh4eHh4aGhoaGhoaGjIyMjIyLiYyKiIeJhoyOjJCMjZGOjIyMi4uLi4uLi4uLi4qKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiImJiYmJiYmJiYmJiYmJiYmJiYmIiImJiYmJiYmJiYmJiYiIiIiIiYmCf3h7e3t6enx9fHx9f39+fn19fn9/f39/f4F/gIB/gICAgICAg4aIh4eHhoaGhoaGhoaGhoWMjIyMi4yOjoyKioeEiIuKjIuNjo+Li4uLi4uLi4uLi4uLioqKiomJiYmKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiomJiYmJiYiIiIiIiIiIiImJiYmJiYmJiYmJiIiIiIiIiYmIiIiIiIiIiIiIiIiIiIJ/eHp7enp6e3x8fX1+f35+fX1+f39/fn+AgICAf3+Af4CAgYCDhYiHh4aGhoaGhoaFhYWFhYyMjI2NjJCSjI2Ii4mJi4uLi4mLjIqMi4uLi4uLioqLi4qKiomJiYmJiYmJiYqKioqKioqKioqKioqKioqKioqKioqKiYqJioqJiYmJiYmIiIiIiIiIiIiIiImJiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIiIiIiIiIiHgXx4e3x5enp8fHx9fX9/fn59fX9/f39+fn+Af4B/f3+Af4CAgIKEh4eGhoaGhYWFhYWFhYWFjIyNkY+PjZGJjIaJjIuIiImMiYeNjo+NioqKioqKioqKiomJiYmJiYmJiYmJioqKioqKioqKioqKioqJioqKioqKiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4WAenl9e3t7enx8fHx9f39+fn19f39/f35+f4B/gH9/f4B/gH+AgoSHhoaGhYWFhYWFhYWFhISLi46PjoyLj4iHiYmMjYWFjo2KiYyNi46KioqKiomJiYmJiYmJiYmJiYmJiYmJiYmKioqKioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHhoaHh4eHhH55eX16enp7fXt8fX5+f35+fX1/f39/fX5/f3+Af39/f39/f4CChIaFhoWFhYWFhYWFhISEhIuLjI6MjI2Lh4mIiomGgoiNjoiKi5GTj4uJiYmJiYmJiYmJiYmIiYmJiYmJiYmJiYmKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIeHh4eHh4eIiIiIiIiIiIiIh4eHh4eHhoaGh4aGhoaGhoaGh4eDfXp5e3p5enx8e31+fn5/fn59fn9/fn9+fn+AgICAf35/f39/gIKEhoWFhYWFhYWEhISEhISEioqOjYmIiIqKh4iHiomIioiIh4qGi5GPiomJiYmJiYiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHh4iIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGh4J8eXl6eXp7e3t7fX5+fn5+fn59gH9/f39/f4CAgH9/fn9/gICAgoSGhYWFhISEhISEhISEhISKi5CPiYmJi4qHh4WHiYuKiYSLjYmOjYqJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiIiIiImJiYmJiYiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGgXt4enp4e3x7e3x+fn9+fn5+fX1/f39/f3+Af4B/f39/f3+Af4CChIaFhYSEhISEhISEhISEhI+Qj4+IiYuIhoeIiYuLjIuJioqNio6Oj4iJiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoaAe3h5eXh4enp8fX1+f35+fn59fn9/f39/gIB/gICAf39/gIB/gYKDhoiGiIaDhISEhIODg4ODkpKOioeKi4qLh4uNiYqJi4iHiouIio+SioiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhn96eXh4eHl5eXx9fn5/fn5/fn1+f35/f3+Af39/f4CAgH9/gH+BgoOHjo+PjoiHhIWFhoaFhYWSkI6KiYmIiImKioiIh4aKjIiHiYmOkJGNh4iIiIiIiIiIiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4aGh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWGf3l4d3d3eXp5e3x9fn9+f35+fn5+f35+fn+Af4CAgICAf3+Af4GBg4eOjo6Ojo6Mjo2OjY2MjZCQjomHhoiJiYeIiouIiYyJiYaKjY6PkYuIiIiIiIeHh4eIiIiIiIiHh4eHh4iIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhYZ+eXd5d3d6eXl8e31/fn5/fn5+fn5+fn9+f4B/fn+Af39/f39+gIGEiI6Ojo6Ojo6Ojo6Ojo2NkJGOi42JjIiIiYaHiYaIioiHi4yLjpCQiIeIiYmJiIeHh4iIiYmIh4eHh4iIiYiIiIiIh4iIiIiHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhoaFhYaGhoWGhYSEhIWFhoaFhYWFhX55d3l2eHl4e3x7fn5+fn5+fn5+fn5+f39+f39+f39/f35/f3+AgYOGjY2Ojo6OjY6NjY6OjY2Qj42Ni46KhoiKhISLiYeDhYSDi4mLj42JjI6QkI+NjYyLjY6Pj42NjI2Nj4+Pjo6MjYyMjY2KiYiHiImHh4aHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoeHiYqKiIeJi4yNjo2LiImLi42OjYyJiImMgHl3d3Z6eXh7e3t9fn5+fn5+fn5+fn5/f39+fn5/f4B/f4B/f4CBg4aMjY2NjY2NjY2Qj4+Pj46NjI6KiYuMjIeFiY2Lh4aIh4aHh4uNjo6Pj4+Pjo+Pj4+Pj4+Pj4+Pj4+Ojo+Pj4+Pj4+Pj4+Oj46Oj46Mi4uJh4eHh4aIhoaGhoaGhoaGhoeLiYeHiIiLjY2Mi4yLjY2Ojo+Ojo6Pj46Ojo6Ojo6Ojo6Njo6NjY2AeHZ4eHp4enx6fH5+fn5+fn5+fn5+f39/fn59fn9/f39/gH9/gIGDhoyMjIyMjY+QkpOTk5KSjYyMjIqHioyKh4eJiYWCiouIiYWJjpCNjo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjI2NjI2LiYaHh4eHiYqLjY6NjYyNjY6OjY2OjY2NjY2NjY2NjY2NjY2OjIyNj5COjY2MjIyLi313dXd5enp7e3p+fn5+fn5+f35+fn5/f39+fn1+f39/gICAf3+AgYOFj5KRkJGSk5OTk5OTkpKLi4uLiomMiouLiYuKhoeOjYiIjI6OjIuMjIyNj46Njo6Ojo2NjY2MjY2NjIyMjIyMjIyMjY2NjYyMjI2NjYyMjI2NjIyNjIyMi4yMi4yMjI2MjIyMjIyMjIyMjIyLi4uLi4yNjY6Sk5OSkpSRkJOVlZSTk5COjo6Oe3Z2d3h6ent7e31+fn5+fn5/fn5+fn5/f35+fn9/f39/gIB/f4CBgoSNkpKTkpOSkpOTkZKSkoqJioyJi4qJjIuKioiHiYqKi4mKjY2Mj46Nj5KUlJOUlJOTkpGSkI+Ojo2NjY2Pko+OkZGOjIuKioqLi4qKi5CPjoyMjIqKioqKioqKiouKioqKi4yLi4uMjIyKiouLi46RkpOTk5SUk5STk5SUlJOTk5KSkpKSk5F6dXZ2eHt7e3p6fX5+fn5+fn5+fn5+fX5/fn5+f35/f3+Af39/gIGChIuRkZGRkZKSkpGRkpGRiYmIiIqMiYiJiYuJhoSJhoyKh4ySkpKTk5OUlZWWlZWUk5OUlJSUk5SUlJSVlZWVlZWUlJOTkY+QkZKQjoyRlZWVk5KSjo+QjYqKi4qKi42OjY6RkpCRkpKSkpGRkpKSk5OTk5OTk5OTk5OTkpOSkpKSkpKSkpKSj3h1d3l6e3t7ent9fX19fn5/f35+fX5+fn5+f39/f39/f4B/f3+AgYKEi5GQkJCSkpKRkZGRkZGIiIiIi4uJg4eLi4yMiIeHjYyNkpSSkpOTlJWWlpaVlZSSkpOTlJSUlJWVlZaXlpaWlpWUk5SUlJSVlJSUk5OVlZWUk5KTk5OTkJGSkZGSk5OTk5KSkpOSkpKSkpKSkpKSkpKSk5OTk5SUk5OSkpOTkpKSkpGRkZGPdnJ3enp7e3t8fX59fX1+fn9+fn9+fn5+fn6Af39/f3+Af3+Af4CBgoSKkJCRkZGRkZCQkJCQkIeHh4eIiIiFi4+KjI6Njo+OkJWUk5OTk5SUlZWVlJSVk5KSk5KTlZSUlZaWlpaWlpaWlpSTk5OTk5OUlJOSk5SVlZSTkpKSkpOTk5OTk5OTk5KSkpKSkpKSkpGSkpGRkZGRkZKTlJSUlJSTkpGRkZGRkZGRkZGRkYx0c3d6ent7e3x9fX1+fX5+f35+fn5+fn5+fn9/f39/fn9/f39/f4GDhIqQkJGRkJCQj4+Pj4+Ph4iKi4yNjYuOj42Mjo6RkpGSk5OSkpKSk5SUlJKSk5OTk5OSkpOUk5OTk5WVlZWUlZWUk5OTk5KSk5OUk5KTlJSUk5KSkpKSk5OTkpKSkpKRkZKSkpKSkpKSkpKSkZKRkZGSkpOTlJSUk5OSkZGRkZGQkJCQkZCRinN0dnp8fHp7fXx9fX59f35/f35+fn9+f31+f39+fn59f39/gICAgYKDipCQkZGQj5CPjo+Pjo+Oj4+Pj4+Pj4+PkI2OjpCRkpKSkpKRkpKTk5OTkpGSkpKRkZKSk5OSk5OSk5STk5OTlJOSk5OTk5OTk5OSk5OTkpKSkpKSkpKSkpGRkZGSkZCRkZGRkpKRkZGRkpGRkZGRkpKSkpKSkpKSkpKRkJCQkJCQkJCQkJGGc3V2e3x8e3x9fX1+fn1/f35/fn5/gH9+fX5/fX5/fn5/f3+Af3+BgYGKkI+PkI+Pj4+Pj4+Pj4+Oj46Oj4+Pj5CQiI2PkJGRkpKSkpOTk5OTkpKSk5KSkZGRkZKSk5KTkpGRkpKSkZKSkpKSkpKTk5KRkZKTkpGRkpKSkpKRkJCQkJGRkZGQkJGSkZGRkZGSkZGRkZGRkZGSkpKSkpKSkZCRkZCPj4+Pj4+Pj4+PkX9ydHh8fHx7fHx9fX5+fn9+fn5/f3+AgH99fn5+f39+f39/f4CAf4GBgYqPj4+Pjo6Ojo+Pj46Ojo6Ojo+PkI+Pj4+GjpCQkJCRkZGRkZGRkZGQkJCQkZGRkZGRkZGRkZGQkJCRkZCQkJGRkZGRkZGRkJCQkZGQkJGRkZGRkI+PkJCQkJGRkJCQkJCRkJCQkJCQkZCQkJCQkJCQkZCQkJCPj4+Pjo+Pj46Ojo+Pj4+PeHJ2eXx9fHp9fH19fn5+f35+f39/f4CAf39/f35/f35/f39/gIB/gYGAio6Ojo6NjY2Ojo6Ojo6NjY2Oj4+Pj4+PjoiQkZCPj4+QkJCQkJCQkI+PkJCQj4+Pj5CQkJCQkJCPj4+PkI+PkJCQkJCQj4+Oj4+QkI+PkJCQkJCPjo+QkJCPj4+Pj4+PkJCQkI+PkI+Qj4+PkI+PkJCQkI+OkI+Pj46OjoyMjY2NjIqDiYhzc3Z4fX58eX18fX1+fn5/fX5/fn9/gH9/f4B/f39/f4CAgH+AgH+BgYCJjY2Ojo6Ojo6OjY2OjoyNjY6Ojo6Ojo2NiJCRkI6Njo6Ojo6Ojo6Pjo6Ojo6Ojo6Pjo6Ojo6Ojo6OjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Pj46Oj4+Pj4+Pj4+Pjo+PjY2MjYyNjoyLi4mJiYiFhYSDgoKEgnR5fXp4dXJrZWltb2xmZmdncHNzd3l9fnl6e3x9fX5+fn59fn9/fn9/f39/gIB/gH+AgIGAgIB/f4CBgImNjY2NjY2MjYyMjIyMi4uLjYyMjIyMjIyGj5GRjIyMjIyMjIyMjIyMjIyMjIyNjY2MjIyMjYyMjY2MjIyNjY2NjYyMjI2MiomKi4uJh4KAh4iEgXt6gH57fXx8fXlzcnJycnV1cG1ramppZ2NkYV9bXF1eWFVXWFlTS0VJSkpLTE1PT0tgdHR3eX19eHp5e3x8fX5+fn1+f39+f35/f4CAgH+AgICBgYCAgICAgIGAf4OEhYSFiIuLjYyMjIuLi4yGiYqKioqKh4OOkJGNiouLi4uMiYmKioqKiouLi4eDi4qIiYmGhYWEhIeJiYWCg397fHl6e3pzcHFxcW1samdsbWdlZmVmZGNlZGVkZWVlZWRkZGNhYV5dXFpYWFdUUFFSU1JTTU1KSUZESEpHR0hHR0xOSWdzdXh5fXp4d3l8fHx8fn5+fn9/fn9/f39+f4CAgIB/f4CBgICAgICBgYFnXmBjYWNucX17ent/fXd8fHZ4ent4eHpvcHt4eXt8e3h3e394dXd0dHZ1dHZ3dXFycW5wcnBnaGtsbm9tamlpaGhlZWRkZF9gYWJgYF5dWVhaWltdXV9gX2BfX19gYmFeXl5eWVldXF1bV1dWUlRSU1NOUUpISUZERUhMTEhGR0lLSklNbXJ0eHp7end3eXt6e3x+fn1+f39+f35/f35+gIGAf3+AgIGAgICAgICCgWdYW1pZXFtcY1xaXF5ga3FtcHBvbm5vbmtpbmxrbG9qaWtraWpraWdmZ2dnaWhnbWdqZ2hlaGdjY2JhYmBgXVhbW1dYV1RWUVBUU1NNSkxLTExOT09UWFhXVVVUUlBQTU1QT05LTE1QUU9MTEpHSUlHSEhJSEhIR0ZHSEpKSEhISUlISVZwc3V5ent5dnZ5enp7fH59fX5/f35/fn5/f3+AgX9+f4B/gICAgICAgIGBbFtYVlZWWVlaWVlYVVZoamxubmxra2poaGloZGVkYlxiZl9fYGNfXF9dYF1eWl5dWVleYmFeXlpZX1xYV1NOTUxLS0tMSUtNTktKS0tMSktQTEtLRkdHSUlGR0lISUZFSEdGRkVERUVEREVJSUlHSEdIRkZLTUtJSUlIR0hLTU1LTExMVXFzdnl6e3l2d3h3ent8fn1+fn9/f39+f3+AgIGAfn5/f4CAf4CAgIB/gYJoUlRVVlNVV1lZWVdXV1tbYWNfXlxbWFZWWVZSVFJRUVVUU1NTUE1KTU5QUk9NUFFRUVFSVlZSUVFUUFBOTk9MSk1MS0xKSktLRklJSkxJR0pISUlFR0dGRkVFSElKR0ZHRkZHR0hKR0dISEpMSkpLSUlISktLSkhKS0pISUtMTU9QUEtUdHR1eHp6eHZ2d3d6e3x+fX5+fn5/f35+fn+AgYB/f3+AgYB/gICAgH+AgmlQUlRXVVRWWVdYWFpbVFRTUlBRU1FRUU9OTlBQUU9MTlBPTk5NTEtNTk5QTU9QUFJRUE5OT09PTk9PUFFPTk5PTk5QTk1NS0lISEpJSUlJR0ZHR0dJSkhJSEhJSEhHSEdISElISUxLSklISkpJSkpIR0pMS0pJSUhKSktMTk1NTU9RTFVzcnN3enl3dnR2eHp7fX19fn5+fn9+fn5+gICBgICAf4GBgH+AgICAgH+BbE9PTlRZVVVdW1lXV1hOTUpKSUZKT0xKSkdJSk1NS0pMTUpHSUlJSktMRkRGSktLS0hKTExMT01MTE5PT09NTk9MTk5OUFBPTE1MTk1MTEpJSEdJSElISElJS0xLS0pJS0pJSklJSUlJR0dKSUdJSUpKTk1OTEhJSklJSk1PT05MT1JOWXBwcnd4d3d0dHR3enx+fX5+fn5+fn5+fn9/gIGAgICAgYCAf39/gICAgIFvS0pNTlFOTlVXVlZSU0lFQ0VFUkREQT5CP0RAQD5CREFAQURHRkVIRUJBQEBDQ0RFQUNFSEtPS0lJSkhHSklKSUlLSkxQTk1MTU1MTU1NTElIREZGR0ZGRklKSUlLSkhMSklKSkpJSEhKS0tIRkdJSklLTU5OSktPTUxLTU1PUE5QT1BgcHByeHh2dHJzdXd6fX19fn5+fn9+fn1/gICAgICAf4CAgIB/f3+Af4CAgXNQUE5OUE1KS1BSUE5RQ0RCQUZRRT1DPT9FSDk6Oz0/PTxBRkA+Ojw+PjxFRD0/RUE/QEFAREVHR0dHQkRERUZFR0dHR0pHSEpLR0NER0pHQ0RFQUFDR0hHSEdISktKSElMS0lISktLTU5MTUxMSkpMS0lLTU9PUFNRT1BQTk9QUlFNUGdwb3N2dXRycXR4eX19fX1+fn5+f4B+foCAgH9/gIB/f4CAgH+Af4B/gICCdlRVUVFQT0xNUFBOT09BQkFAQkE/Oz48Pj8/PDg5OTs7OkA6Oz48Ozs8PEhMPT1BQT9CQz1BRERGQkZGREdJSEM/QEBAQUFCQUE/Pjw9PkFAQD8+P0BFR0dHSUtMTk1OTUxNTUpLTVBVU05MTlFOTk1OTE1NTk9OTk1LS05OTk1OTkxUbnBwcnR0c3Fyd3h5fX19fn1+fn5/gH5+gICAgICAgH9/gICAgH9/gH+BgYJ4UVFSVFJTUVNTUVFST0BAPT4/PD8+QEE/PT45Ozo6Ozg4Ojg3Ojw5Nzg7Oz49Ozs6ODpAQEJCP0E/Q0ZEQkNDPzs+PkBDQ0E/Pj9BPkBAQj9APD9CQEFDRUVFSktQT1BPTU1OTExMT1JRUFJOTExPTUtOT0xMTEtMS0tKS0tKTU1LS1xxcXF1c3VzcXR4eHp9fn1+fn5+f39/fn5/gIGAgH+Af4CAgICAf4CAf4CAgXxSTU9RUFFSUlRSU1NOPDs8Ozs8P0BBQkA9PDk8PTw5Nzk6Ojk4OTo6Nzg6OTo7Ozg3ODk7Ojg8Oz1AQUA9Ozs+PD09QEJDQT9BQkE9Pj09Oz0/Q0RCQD9BREJFR0pKSkpKTE1MTExNTExOVVNLTE1USVBKSU5KSUpLS0pJSEdKS0lKZnJxc3RzdXJydnl5e31+fn5+fX9+f39/f36AgICAf4B/gICAgIF/gIF/gYGBgFZMTlBQTlJRUFBRUU44PT89PDo9PkFAQT8+PkA/Pj07PDw+Pz08PTs6PD09PTw8PDw7PDo7PD49Pj8/QUA+P0E/QEBBQEBAPT8/PTw6Oz09PD9AQUJCQUBCREZGRkdGR0dISUtMTExLTEtKS0lKSk1MTEpMS0lISUxMSklJSElLR01tcHF1dXV1c3V4eXl8fX5+fn5+fn5/gH9+gICAf39/gH+AgYCAgYCBgICBgYCCYUtPT05OT1BPT1BQTzo8Pjw9Oz8+PkFCPz0/Q0NDQD48PT9APz89Oz49PkNFPz9APTs9PT08Ozo9PkFBPz5AQD9BPz89PD48PTs7PD0+QUA/QD5AQ0NEQkRFSEVFR0hISEdGSUpJSUlJSUhKSkpKTEtKSklJSEhKSktMS0lLSkpIVnBvcXNzdHR1eXp7e3x+f35+fn5+f39/f39/f3+Af4CAgICAf4GBgICAgIGBgIJtTFBRTk9QTk5PUFBPPjw8PT4/P0A+QEA/Pz9DRUQ/PTs8QD46Ozo6OTc6PDk9PUA9Ojw7Ozw7ODk7Pz49PD07PEA9PTw8Pjs9PD0+QUBCQUFAP0JEQ0RFRkZGQ0VHSElJSEhJS0tMTUpKSUpNTUpLSktJSEhISEpJSktKSk5MSUlfcHBycnJ0dXZ6e319fX5/fn5+fn5/f35/f36AgIB/gICAgICAgYGAgICAgIGAgnZNTk5NTk5MTE5QT0w+QTw8PT8+QkM/P0FBQUJBQD08PTs+Pjo6Ojw6ODk4ODo7PUA/PDs7PDs6Ojs+Pz89PDg6Pjw9Pj89Oz4/QEJDQkJDQ0FCQkFCQkRCQkRCRENGSUdGRkhJSUtNSklKSktMSkpJSkVESUlGRkhISUpKTEpGRmdwb3FxdHZ2d3t8fH18fn59fX1+fn9/foB+fn+AgH+AgICAgICBgYCAgICAgICBek5JS0tMTExFSUxOTTw/PDw9PkBAQUA7QkNCQ0A/Pz9APT9APjw+QD89PT0/PT0+Q0Q/Ozw9PkA9PT5BQ0A8OTtBPz4+QT07P0JAQkNCQENDQUNBPT0+QD0/QUFBQENFRUBAQ0JDR0dFRENGRUZGR0VEQEFHR0ZDRkRHSEpHQz5IbHBwcHF0dXZ5fHx9fHx+fn1+fn5+fn5+f36Af3+AgICAgICAgIGAf4CAf4CBgIF+UUhLTU1NS0pLTE9RQD8+PkFBQEBBR0FCRENEQT9AQEA/PUA+PD0/P0BAQENAQD9AQD49PD1ARUFCQkZIQz08QERDQUE/Pj1AQT4+Pj88PkBER0VAPkBBP0BDRkVDQkJDQEJEREJERUFCPkFCQkFCQD89QUJDRENDQUNFR0E/PVZwcHFwcnV1d3p8fHx8fX9+fX19fX1+fX5+fn9/foB/f4CAgICAgYCAgIB/gIGAgX5SSEtNTUxLS05OUlVEQkBDQ0FBQkBCQ0BAQUFAQUA+Oz48Pz08Oj49P0JCRUA/P05hX0pAQ0VJSUlJTU1LRUNGR0hFR0VFRUREQ0E/QD4+QkZKSkdFRUZGRkpOTUtKSUdHSEtMSkdHQ0REREVEQUJCQ0BDREVEREVERUZDQkFFZW9wcXF0dnV4e3x7fHx+f319fX19fn59f4B/f39/f39+gIGBf4CBgICAgH+AgICAfVJJSUpKSEpKTE9SU0dGRUdIREdIREA+PDs+QERFRD88QUNEQj8+QT9BREVEQ1d1homKflhHSEpMTE1PT0xIR0hHSElJSEhHR0hIRUNFRUVFRkhKSkZFR0lKTU9PTU1LSktKTU5LSUhHSElIR0ZFRkZGREZIR0VFSEhGSEdIRlFub3BxcnZ2eXt7e3p9fX5/fX19fX1+fn1/f39/fn5/gH+AgYGAgICAgICAf4GBgIB8UEhHSElGR0lKTU5OSkxJSUpLTE5KRkNBQkNGSUhJR0hISUdGQkRGRERDQVV0h4mHh4aIgldJTE1MTU5MSkdHR0dER0dHR0ZIRkhFQ0RERkVEREhIQ0NDR0pKS0xMTEtMTElKS0pKSUlJSEpISEdISUhHR0hGRkZISklJSUlIXW9vcXJ0d3d6e3t6e359fn59fX19fX5+fYB/f39+fn+BgIGAgYCAgICAgIB/gYCAgHxNR0ZIRkVGR0dKS0pMTUxLTU5NT0tJSEhKS0tLS0pLTUpLSEhGRkdGRVBshIeGhoaHh4iHfFBLTEtIR0ZGREVDQ0BBQ0NDQ0ZGRUJAPj5AQUFAQkQ/Pz9ERkdERUdJS0lJR0hJR0lJSUpJSEZKSkpKSUpJSkpKRklMTEpKS0tmb3Bzc3R2eHl7e3t8fH1/fn19fX19fn59f39/f35/f4CAgICAgYCAgIGAgICAgICAfU9GRkdGR0hHRUZHR01NTUtMS0lHQ0NDRElLS0tLS0tNTEtNTElGSlZsgYaFhISGhoaHiIaKdUlJRkI/P0A/Pz88PDw+Ojo8QUFAPjw5OTg8PD07Pjs5Oz9BQkFBQ0NDQEFCRURCQ0ZISUhISExNTEdJSk1NTk1KSktLSkxNU2xvcXRzc3d5e3t7fH19fn9+fX19fX1+fn5/foB/fn9/gICBgIGBgICAgYCAgIB/f39+UUZFRkdJSUdEQ0VGTk1MSklIRT85Oj5ARUhHSUhLTE9OTlFOUV5ygYWEhIWFhoeIiIiJiYyOZkJCPTg4Ojo5ODc4ODk2NDc5Ozw6ODU2Nzc4OTc4NzY4OTs8PD5BOzk5OT09Pjs7PUFERUhKTUxMR0lIT1JRUFBOTE1NT1Fdb3BydHN1eHp7e3x8fn5+f359fX59fX5+f39/gH9/f4CAgICAgYCAgICAgICAgIB/f39RR0ZHSEpIRkVGR0hMTEpJSUdDQjU2OjxDQEJGSEtITEtOVGd7hISDgoOEhomKi4yLiomKi4yJVDo4NjU2NzY2NjQ2NzYzNDY4Ojg3NjU2NTY3Nzc3ODo3Nzg4Ojs3Njg4OTg5ODc2OjxAR0ZJRklGRUZPU1JTU1JPUFBSVGVwcXN0dHd5e3x7fH1+f35/fn19fX19f39/f3+Afn+AgICAgICBgICAgICAgICAgH9/flJISEhJS0lHSUpJSkpLREVIRUJANTc4OD06PURCREZGRFZ4hISCgoOChomKiomJioqKiouJioqBSDY3NjQ2ODg3NDU3ODQ2Nzc5OTc3Njc2NTo6Ozo6PDg5OTk5ODc3Ojo6ODg3ODU4OTtBPT4+QkE/QUtMT1FQUU9PUFFXa3FydHR1d3p7e3t9fX5/fn9+fX19fX5/f4B+fn9/f4CAgH9/gICAgICAgH+AgICAf39+VEhHSUlMTUtKS0tMSUg/QEFAPDo1Nzk4OTc6QTk8RD9QfYSDg4SEhIaJioqIh4iIiYqKjIqJiYx6Pjo4ODs8PT45Ojs8ODk7OTo7Ojo5Ozo6Pj09Pzs7PD06Pjw6PDs8PD08Ojo8ODo6Ozo5OTk8Pzw9QUJESUlMS0pLTFdvcnN1dHZ4e3t7fHt9f39+f359fX19fn9/f35/f39/f3+Bf4CAgICAgICAf4CAgH+Af35URkVGSUxOTkxKSk1CPzs7PDo4OTk4OTk5OTo+PT8/Q3aEg4SFhYaIiYiHhoaGiImIiYuMi4mKioxsPDs+QkNFRUJBQUI+QENBQD89Pj5APz8/QD9APT0/Qj9BQT9BPz1BQUA/P0E8Pjw7Ojs6OTs/PTs7PT1BQUNBQkNBWHBxdHR0dnl7e3x9e31/fn9/fn19fX5+f35+fn9+f4B/f4CAgIB/gIGAf39/gICAf39/flJFQkFHSk5PTElHSzo4Ojs5Ojo8PDo6Ojw7PT5APz1hhYOEhIWEhomJiIeGhoaHiImKi4uKioqLiYtePkRHSUtKSkZHR0RGSEdFQ0FAQ0VDQ0BCQ0I/QERIRUNFREVFQUZFRkRGRkRAQj49QD49P0A+Pz8/Pj8+Pjo7PTxgcXJ0dHV3enp6fX19fn5+f39+fX19fX5/fn5+fn5/gH9/gICAgICAgICAf4CAgIB/f4B+UERAPUNIT01HRkJEOTc5PTo8Oz49Pj47Pjw/P0M+Sn6DhIWGhoaIiYiIh4aGhoeJioqLjI2MjIuKiodXR0xMTUtOSUlLSElKSklGRERGR0ZEQ0ZHRUJISUtHSEdGR0dFS0pMSUpLSkNGQ0NEQkFBQ0JEQ0NERENBPTs9QGhwc3R0dnd6eHt8fH19fn5/f359fX1+fn9+fn59fn+Af3+AgH9/gICAgICAgICAf3+AgH9PQT49P0RMS0BCQkE5Nzs+Ozw6PT8+Pzw/PkJBRT9ohIKFhYeIiImJiIiHhoaGiIiIiYqMjYyMi4uKjH9QTVBNS05LSkxJSUpIS0dFR0hISUVFSUdGRUxMTUlKR0dISUpOTU9NTE5LSEdHR0VFQ0ZGRkZERUhIRkNBP0BMbXB0dXZ4eXl5fHx8fX1+fn9+fn19fX1/f35+fn5+f39/f39/f3+AgICAgIB/gICAgICAf1FBPz4/RkdHPTxAQDg3PDo7PDo9Pzw9PT9AQ0JIU36DhISFhoeHiIiIiIiIh4eIiIiJioyNjIyMjIuKjXFNUU9NTExMTElISEZKSkVKSEdLSklKSEhHS0xOTExISElKTVBOT05NT0tJR0lKSElESUhIRkZHR0lHQ0JBQ1VvcXV3eHp7eHl6enx8fX5+f39+fn1+fX5+fn5/f36Af4B/f3+Af4CAgICAgICAgICAf39/VERBQUJHR0I/OD9AODo7Nzw9Ojw/PD0+QEJDQ0xthIOEhIWFhoeIiIiIiIeGiIiIiImJjIyLjIyMi4uLi15SUlBNTk1LSkdGQ0hLR0xKRktPTEtKSkxNTE9QTkhJS0xPUVFQUU9PSklKSk1LTEZHSEdGR0lGRUVCQEJCXHByd3h5enl5eXt6e3x+fn5/fn59fX19fn9+fn9+f4CAgIB/f39/gICAgICAgICAgH9/f39VRUNFRUdHRUQ7P0E7PTw4Pz09PkBFRD5CRENGSnSGg4ODhISGiIiIiIiIh4eIiIiIiIqLi4uMjIyMi4uNfFdWUlJUUk9MS0tFRkZLT05PV1ZRUE9SU1JNU1RPTVNMUFNVV1JTUlBMSk1NTUxOR0dKRkZISkRERUVCRENjcXV5eXp6ent6e3p6fH59fX9+fX19fXx9fn5/gH9/gICAf39/f3+BgYCAf39/gIB/f39/f1VGRUdHR0dIRj5AQj0/PTxBP0FBRFRLQkhJRklLeIaDhYWEhYeIiIiIiIiIiIiIiIiJiouKioyMjIyOi4uLZ1ZWa2FFUlFRUEs7O1FTUmB1XVVWVFZZWVJYWFJaZlBVV1pdUlRXUVBOUlBQUVFLS0tHSEpIRUZJSUlISWpzdnl5enl6e3t8ent8fXx9f359fX19fX1+f39/f3+AgIB/f39/f4CAgIB/f3+AgH9/f35+VEhKSUlHRkZFPz9BQEVBQ0ZEQ0RLVlBKUFBOUFB5hoWHhoWGh4iIiIiIiIiIiIiIiIiIlJyMioqMfWGKi4uHbFtkVTpYWFhTUT9AVlVZXGRgVllicl5dVl1aVkVRWVpcWV9UWWdSVVZYVFRWU09PTUtMSklJTE1LT01UcHR2eHl4eHp5ent6e3x9fH5/fn1+fX19fn1/f39+f4CAgH9/f3+AgICAgH9/gH+Afn9+fn5WSkpJSEdGRERCQT9ITElNUEtJSk9TUlFUVlVWVHWFhIWFhYWGh4iHiIiIiIiIiIiIiImcnaCPiY5nO36MiYqLem5wWFpbWlJTUldWVFpadYNZVX2QYVxYXV5XSVZeXltbX1lIWVhZXF1YWFlXUlFNUFFNTU9TUVFVUmJ0c3Z3d3Z4eHh6e3t8fX19f39+fX59fX1+fn9/gH9/gIB/f3+Af3+AgICAf39/gIB/gHh5fVlOS0pJSUZCREBBOk9RUVdYUFBQUVJTUlZXV1dXbIGCg4WEhYaHh4eHh4iIiIiIiIiIiJaanJeIioFuhomIh4OKfmZZWVxZU1ZUV1JRV1ZjloBRZXJYWldfaFBgZlpaWFxoYkdPWmlnXFtcXV1XU05TUFBRVlZWVllab3N0d3Z2dHd4eHt7fH19fX5/fn59fn19fX9/f3+Af39/gH+AgH9/gICBgYB/gH1yfX9/b3R8XVNQT01LSkVDP0A7UFBaWlpSU1FPUVJRVVJVU1ZedXiAhYSEhYaGhoaHh4eHiIiIh4eIh4ORjomJiIaFiIiGfYB7XFBWWFRSVFJRUUxPTUtmeVpdVFlVVl1aTFRaVVNUXlpYV1dXemtYWlxcXlNQUE9JTk9XVlhaWmRxdHd2dHR2eHl5e3t8fX19fn99fX1+fX1+f39/f4CAf3+Afn56eHd2c3V7f3+AgHRrfn5rcnleW1ZVU1JPS0ZDREFNXoNsVlJTT09RT1FWUVNSUlRjZHaAg4KDhISEhIWFhISDhoaGhoeIhn6JiYiHhoOHh4d5bXFWSUtOTktNS0hKREZIRUM+U2NVf1JRUU5LUlVSTU9ZUU1OUVNVVU1RU1JQTkxLSENJR1JTVFldbXJ2d3V0dHd7enp7e318fX19fn19fX59fn9/f3+AgH99fX5+fn9/gIB+e3Zzd31+fmR1fWlxdGBkXV1bWVVRTEhMSWFsknRQUVNNUVJQU1tSU1JRUlVVYnN7fH6AgYKBgX99e3uAf4OChYaHgoaGhoGEgYaFhnVfXUtDPkJCQ0NBP0RQQ0NAQz5CSEdWQEhOTUddaVFIR09GREVGSEdIQkNIR0hKR0RBQUNATlBNUmR0dXZ1dHR2eXx7e3t7fX19fHt+fX19fn5/f3+AgIB/f3x8fX+Af39/f4CBgH12dHt/bWh8Z25xZmllZGJcWFNRUFVSc1dlW09PTkxSUlBVWVNVUVFUUk9WYGtsc3Z6e3h5dHJuc3RzeXh+foOAg4OCgIKAgoGBa0xHPj46Oj5APz4+PmpQS2FFRkhJRUI/R0xNR01RVUpCRT8+PD08PT0/PT9BQ0I/Pjw9Qj5JTUZVb3V1dnN0dnh7fHt9e3x9fX19fH59fXx+fn9/f4B/f39/enl3eHd2dnh7foB+fXt4dnx1YXhnbHBqbGppZmBbUVFaXFleSUpPUE5LTFFSUVRWVVdRUVdWUFhbYl1hZ21tbG5qaGBucmltbHF1e3p9e3h6fHx4d3hkQkBAQTw6QkNBQUNBW1xPe05PT05LTE1PT1BMS0xXTklHQUE8OTc3NTk5PTs7Ozg5ODk/O0JHPlx0dXZ2dXZ3eXx8fH18fH19fn18fX19fX9/f39/fn9/f314dXd6e3p3eXh1d3t8eXh1eXdjcWhpcG1ubW1oZl5PT15cWklHT1FRT01QUU5RUlRWWFNSWVROWVpbV1lcX15fZV9dXnF3a15gZ2t3b29sam9tbmxmYllHRkZIQkFGSEVFRkNMUU9hV1JYUVBTU1JVW09PUVZQTUlERj45OTY1ODc5Nzk6MzY1Nzk1PEI9ZnR1d3h3enl7fX18fHt8fX5+fnt9fn19f39/fn5+fn9/e3d1eX18enh8fHx8dHd2d3Z1d2tuaWhxbm9vb2prYFVXXlpXTUtTVFNQUVVPTFJTVFdYU1RYUUxYWVlWWFhWWFldV1hYaHNrXVZgdGthYV9dZGBfXllVUE1PTkxJR0pLSUhGQ1BPU1pXVFROUVNZU1xlVU9TVFFOS0lIQz9BOTk4ODk3ODg0NzU3ODU5OUducnV5eXp7e319fX18e318fX5+en1+fH1/f359fn59f358dHR1e3hycW9vbnR4cXJzeHZ1cWZkZ3JucHBxbm1kXV9fWVdPUFdWVlNUVk9PVVZXWFlTVVRMS1NVVVVVV1BUVVdUVVJdbl5STllgW1ZZO0RVV1NbZkpMUFJST01NTk1NTEpGUFBVWVNUT0pOT1VTVFxWUlVTUk5NTElISEY/Pj06Nzg3NjU5OTY3NjY1WHFxdHh6ent8fX19fnx8fXx+fX15fX18fn5+fXx8fX1+fXxydnF4eHJ1dXFxbnBwb3B1dnRuamRkanBwcXJwbmZlZGNcXlJUWlZXVFNWVFJYV1lZWVJVT0lHT1BPT01SSk9QT09OTk9UTE1JUFBTVFUyPFhNSUBRPWNgUVNRUE1QUE9OTk1QTlRSUFJMSUxLT1JQUVJSVFFST0xNS0xMSENCQT06OTg3NjtCNDU2NjtlcHJ2eHl7fHx9fnx9fH19fX18e3h8ent9fX58e3l9fH18e3B1b3d1cHV0b3N2cHFxcHV1dmNqZ2VXaHRycnFuaWlocFZWVFVYVVZVUldWVVpZWFdWUVNGRkFGR0dIRkpESEpIR0VITEhLSUdMTVBNRy9FX1I+NEA+am9hUlJRQEdUUU9QUFFOUU9QT0xKTExQUE5NUFFRTlFPSkxNTUtHRUVDQjs9PTw5PUc2Njc2RW5xdXd6e3t8fX18enx8fX5+fXt5dnh3eXl8fXp6dn17fHp6b3Fud3JwdnFtcHNwb3Bzc3N0ZmdgaFpXa3JzcmxtbWtuYmVQU1RSU1VPV1ZVWVlWUVFRT0A+Oz0/QEJBQ0BCRURBQEdIR0hGRkhKTUxER0NPUkM4RE1TXWdTUVNBR1VQT1FRUE1NTkxKTEtMTk9PUUxPTk1JTEtJS0tMS0dGRkVEPEFBPjtARTs8ODlUcnN1eXt7e3x8fHt5fHp6fn58e3V0dXJ2dnp6eHpyfHt8eXltcW94cnF1bm5xcm9vb3Rzc3J1dGtnZ15lam1wa29xbWltY0xPTk1RU0xUVVRXV1VMTEtIPTk4Nzs/QT89PUFAQj09RUhGREZGSUdKSkBGQUFARkdESU9IUVJhXFFQUk9TTk9PTExPTUtNTE1PTltWS01RT0dJSENJS0xMS0ZGRkU/QkM+PUJHP0I/QGRydXd7ent7fHt6end8eHl+fnt7cXN0cHJzd3R4eHN6e3l2d2xxb3ZxdHRsb3Fybm5vc3ZydHNycmtsZW5zaG1ubWxtbGprSUxISE9RSlFTUVRTT0tIQ0U9OTg3OT9CPzs+QUBAPkFFSkVDSEdJR0lFQkI/PjxCQEBHSkVNT2JlUE1PTVdLTE5LTE1NTExLTk5TZE1KTFJJSUlGQkpLTE1OSkdJRkJCQkA/RUZFSERMb3B2enl5e3t6fHp3c3h1eHx8eXpucXFtbm9ycnZyc3h8eHZ2bXBtc3B1dGxwcHJvb29ydnVyVlZucWdseYRqbXFybm5qaG9ISkNHTExJTVBNUE9IS0U/Qj05OTo6P0I/PEFCQUFERUdLRkRJSUdHSENDP0I+P0BAPUNFRExNUVRMSklNVEZJSUpMSUpLSUlMTU9QUVBLR0NLSENDS0tMTk9OSUpJR0NDQ0RJSk1MSVpzbnh5eHp6e3l8dnJwdXJ0eXl2eGpxb2tsbG50dG1zdntzdHhyb25xb3ZzbnBvcnBvcHN0eWpOYGdzanR8eWdvc3FqcWhlcUhLQ0ZHSEdKS0lKTERHQjw+PTo6OjtBQj89QkJDQ0hFSkxKRUlJRkdIQ0M7QUBCPkA/QkRESU1PR0hKR0hLREhJS01ISkxISUpMSk1dUkhJRE5HQkVMTE5OUE5LTUpLRkdHSk1OUk5NY25qd3Z3e3l7en1xbWxza3B0dHR1aHBtamlra3RwbnR0eXByenRvcnFvd3NvcXB0cnBydXR5a05WbXVscXt2aW5vaWt0aGVwRkpDRkVGREVFRkVHQ0NAPTw9Ojs6O0FEQD9CQ0VFSUZKSkxGSUlHRkZEQjpBQ0M+P0NDQ0VHS01ISk5IREhFSUxOTUhJTEdGRklJTE5LSUhFT0lDR05NT01QTk5PTUtJSElPU1FSTlNnZ2Zyb3N4dnt6fGxoam9la3Btc3FmbWxoaWtsdG1vdXR3cW94dG90c3J2c3BxcnRzcnR1dXZ2WFZ1dWtvdHJrb3ZsaG1mX3BHSkNFRURCQkFFQERCPj8+Ozs7Pjs9P0RCP0FDRkdLR0pJTEhHR0dGRUM/PURFQj5BQ0JDRUdISUdNUElFRkdLTk9LRkhJRkVDRElKSEtJR0hQS0RKTkxRTk9OT1BPSkpJTVJVVVJQWGVhYW1mcHJvcnl6Z2VoaGNpbGZxbGZsbWdpa2xzbXB3dXRwbnZyb3Nyc3V0cXNzdXRzdXZ2dnl2dXR2bGt1dW1ydnFsbmxlck1HRURGQkFAQUQ8QkE+QT06Oj0/Oz4/QUI/QEJFR0pGSkdJR0ZGRkRDQkFBRUZDQkJCREVFR0dIRkxQTEhOSkpMS0lGSEVGRUNDSElIS0pHS1JOQ09PTlFQT09OT1BLS0tQVVdWVlRZYF9daWBuaW5ocnNiZWZmZGhoZm5pZm1taGtrbXJpcXZ1c3Ftdm5vcXJzd3Nyc3R1dnZ2dnd2d3Z2dHd1a3N1bnV0c3Fza2tzTUdHRUZBQkBERTxBQUBDPDg6PT46QD1AQ0BAQURGSUVIRkZIRkVFRENFQkRJRkNHRUFFR0VGRkdFSU1LSFFNSktISElFRkhIRUNJSUlLTUtQU05EUlNSUVNOUE1PUE1MTlNXVlhZVlheWl1kYGljamlna19kZWZjaGdna2dna21rbWxwcWd0dHVyc252b3FwcnR4cXNzdXZ1gpF5dnZ0eHV1d3hub3VvcnN1cXFpcHpNR0dHSEJCQkVFPEBDQkQ8Nzo+Pjs+O0FCPj8/Q0VHREZEREdFQ0VDREZGRkpFRUlHQkdIRkdGRUNGSkpHTUtMS0hKS0ZJSEpIRUtLTExOT1JUT0hUVVRRVFBSTU5RT01RV1pWWllXWl5aWGFgYWBeaGVjYGRlZ2dqaGhqZ2hubGxvbXFwaXV1eHJycHVwcHBydXZwdXN1dnV7fn14dnR3dnZ2d3BsdXBtc3Vub3NzeU5ISEdJREJDSEU9QEVCRD04Oj4+PTw8QkI9QD5BQkZDRUNDR0NDRERGR0dHSUZISkhDSUhHSUdGREhLSUdLSE1LSktMSEtKTUtJTkxPTk9SVVZPTFZWVFFUUlJMT1FQT1RaWllcWlpcX19dX2NfXGJkbGNgZGdocoVoZ2pmam5ucG9uc3FqdHV4cnNzdHJucHF2cnF1cnV1c355jn11dXZ2dnZ4cml1cWtydGxxd3F1TElKSEpGQkRHRT1BR0REQDo8PkA/Pj9DQjxAPkFBR0NFRENIREVERkZHSEZIR0lLSkVKSEhKSEZGTEhISEpHTEtMTExJTUpNTk1PTFBQUlVWV09LVlZVU1NSUUxPUlJRVltbXV5bXV5gYGFgYmZdZGBmZ2BlaWpkc3NmamhmbHBycW9zc25zd3dwdXZ0c21vcnVvcnNwdXJ2cnSBdnV1dXd2dXdzZ3Rya3Fya3J3cHdKSktJS0dCRURFPEFGRERCOz8/QUBAQURBQEI+QUNIQkVERkdFSEVGRUlIRklISkxISEpKSUtKRkpLSElLSkdLS0xMSUlNS01OTk9MT1FSVVdWTU5UVlVTUlFQTU5UU1JXW15eX11eYGBhYmJgZGRlYmRpYmRpamd2i2xraWdtb3NxcHFwcHJ5d3J1dXRzbW1zc21xcm90dXVzcHN3dHV1d3Z1dXVmcXNrcHFqcnZwd0pMTEtMR0NDQUU8QEVFREM9QUFDQkJDRUFDREFBRUdDR0dIRkVJRkNHSkdHSkZJTEhJSk1KTUxHS0lITEtOUUtSUExSTEpNTU5QUFBVT1dYWFtOU1FXXFpTVlBOVFVUVFhaX2JiX2RhXmFjX2FmY2FiaG5oYmloaG14dm1oaW5vc3JwcXJycnZ0c3Vzc3Nua3NxbXByb3R2c3FxdXZ1c3d5d3V0dWNtdGtvcGpxdHF3TE1MTExHREFARD4+REVGQz9DQUVEREZDQkVHQ0JIRkJISklHSEpGREtKR0hKSElLR0pKTktOTElMSEpNSlpmSmRbSmxSR05NX25VbHNbcXBid2NSUGJ2dWh1Y2F2YVhucWJkdmltemZcbHRgbGtWYHd2aWpnaGZnbG1qbW9qbW9zcnBycnFyc3Jzc3J0cm5sdG9ucHFxdXVycXN0dnZ1dXl3dXR0YGt0a3Bwa3FzcnlMTkpLSkZCP0BCPzxEREZEQ0NDRUVERkJFRkdEREpFRUpMS0lLTEdHTklISktHS0pJSkpOTE1NTExJTU1MW3NiZHBdbGxVTE5lcl1nZXFsbnRncGlfYVlubWJwcGJrampnb3F0ZXRub1xwdmdwT0xyeXZrYWFrZWVseG1rdmxucHNycHJxcHFycXJycnRybW1zbm5vcHJ1dHFzc3R1dXV0d3l2dHRibXVrcHBscnJye0tMSUhHRUQ/QUE/PUJFRkJFQ0VERUVEQ0hIR0RES0hHS01NSkxMRkpPSEpLSklLSkpJSk1NTk1NTUtOTU5bcnBvbnBwa2pMT1BtWE5pYnRycGFtb3ZcWWxQW21tWnFta3BseHh0c2lwXGBzbHFrVXV5eG9jXmtmYmdwcGppb3Bwc3NwcXBxcXJycXFycnRsbXJtbW5vcnV0cXRydHV1dHV1enZ1dGVudWtwb2xzcnJ5SktHR0VFREJBQj0/P0VHQkdESEVFREJGSUhIRUdLSkdNTE5KTE1HTE5JTUtISU1JSklKSk5PTk5NTE5NTFxoZHVdbHFWa01PUW5VWmtea2x2YWxkdFRlY05sWWxcdG9samx4and1aHBdX3NraFdiY3d8b2NgZ2hhY2l0eWtubnFzc3BxcHFwcnFwcHBydWttcW1tbW9xc3Ryc3J0dnZzd3Z6dnV0aG91bHNvbXNydHZJTUZJRUVEQ0FCPEJAQkZDR0ZLR0VDQ0hLSEhGSUxLRk1LS1JSTEhNTUlOSklHTUdKSkhJTk9NTkxKTU1KWnRwcG9xcWxrT1FSbllza2dvb3Fxb210Xm5YYXRfbm9wb3Fzb291c3R0alpedGN3eHJqbnpoYWFjZmFiam10dXBzdXZzcXBwcW9ydHt/fn13bGtxbmxtbnByc3F0dHN1dXR4eHl5dHVrb3VtdG9uc3N2dElLSEpDRERFQEA+Q0NBRkNISU1IRkNGSkxJR0ZKTUxGT0pKV1JLR0xLS05JSUpMSUtKSUlLTE1NTElLS0pTa2JZaV5famNyclpfWWpvX2VlVWtfY1thYVFgbWhcalxuaWpkW29lZHBdWlxrW21xY3BzbGRnY2RnYGBrbXBwb3R5cnVxb3BxbnmFiIeHhoWAdnNua21tb25xcnR0cnR1dXZ5eHhzdW5xdW52cXJ1dHdySEhGSkRFQ0ZBQEFFRENGQkhKTEdGQ0ZLTElFRkpPTElPSkxbUUpGSElMTUlISkpLS0lISUdLS0tLR0hKSUtLTEpJS0xOVFtdVFBVTVFPTk9PVlFPUFFOT1FKSk5QUWRxaVRZVltbXFVZWl1YXVxcY2ZhYWZiY2ZfXmZrbWhtdHlydHJvcHB0hoeGhoaFhYaHg3pwbW1sa3FzdHRydHZ0dXl5eHV2cXJ1b3ZydHN1dXNIQ0VHRkZARUM/Q0dERkdDSUtMR0ZER0pMSERHSVBLTE9LTFdNSUZFSEpKSElLSExKSUdISEpISEhFRktISEpOS0hPXFdeT1xcYF5PWFlTXFxiXk1ZWk1YYVJLWWFaU2BkXGFYW2RkVlZYXFlaWFxWWVxeY19kYGFfZWhrZ210dHFxdHBxcoGGhoaFhoWFhYaGhoR9cmtpb3Jzc3N0d3l5eHl4d3h0cXhyeHNxcnVydFBCQ0RMTUFDQ0JESUVHR0ZLSktIRUVKSkpGRUhIUEpMTUpNUklIRUFIRkpJS0tJTEpJR0ZKSEVGR0VFSkZCSUxJSlNfWWBYYGFbYFVYWlRdXlpfUllcUF5cWU5fXF5TW15kXlpdYGNfWV9iW2BeW1VZWVpfXmNjYmFjZWlla3Jwb3Bwbm93hoaFhYaCe4CFhYaGhYaFf3VxcHJyc3V5enp5eXh4eHdyeXZ4cnF4dnR2YVNKSk1JRENBQ0ZHRUdHSUpKSUlERktLS0VGSUlOSk5MSExOR0hGPkhHTElLS0pLS0lHRUlGQ0RFQkZKRD9JS0hOWmJZXl5hX1JUU1dfX1xdWV5RWVxNVl9XS1FZW1FbX2JhXV5jYWBiYWJjY2VaUlpXV11aXWRgX19jZWJob21tbGxsbHWFf4SDeXV8hIWFhYaGhYWGhoN9d3JydHd5eXl5f359eXV5dnZybnp3dnhZUUpGREdFQkRISEZHSElGR0pHSEZIS0lLRERKSk1NTExISkpISkdAR0ZOS0tLTUtLS0lHSUVFQERBSElBPkhJRk9dYFpbZF1fVFFSWF1cXFxfW0tXXExSXFlJTV5RUV1fYmNjY2NiXGRiYWRjZlhSV1VUXFhbYV9eX2FhX2Rsa21qa2xudn51gXp8hIWFhYWFhYaGhoaFhYaGgnpyc3V1e4WHh4eGhYSBfnhwend2eFxSTUNASUZDRUtJRkdHSUdHSkdGRklMSk5FQ0pKTE5KTElLS0lJR0NISFFNS0tPTUtLSUhIRkU/RUJISEFARkVDU11ZXlhfWF9bXVVYWE9dXFFLSlZeWF5bXVZaYVJSX19iYmBgYmJfY2JhZGRhWFBSUlNcU1xdXV5eX19fZGlnbGtubnB7e3x+e4CCg4SFhYWFhYWEhIWDhIWHh4FzcneFh4eHh4eHh4eHh4WDgHx4XFNLQkFHRkRHTVJIRFJLRkhISERGS0lNUEVHSUpLTkxMSkxMSklHREhLUU9NTFBNTUtMSUpERUFFQ0hGQUFGQ0FVVUVcVF5TV2BYTlRVTVlaTEpLVGBhW19YX15iXU9ZYlxgYF9iY2FdYmFXYF9VUVBRUllTXlxbXV1eYGJmZmZsZm9vd3x7gHt9f4CEhISEhIWFhYODhYKDgoWFhnpvgYaGhoeHiIeGhoaFhYSFg35JTkZERkZIRElTY1FFV19JR0dIREZNSlBQRklJSktOTExLTUxKSkdFSk5RUU5OUE1OTU5JTEJFQUNDRkNCQENEP0xHQ0xMUE9PTUZNRkZISUdGTEtNT1BJTE9QUFNQTFFUU1VaWFdZV1djVk5SVFBRUE9RVlRcWVlbXVxhYWVmZGhkbG1xc3N6eX97en+EhISEhISEhIKEgH57gYOBfXuFhIaGh4eHhYWFhISEgoGAfUtJRUVHRkdES05eTUhIWU1HSEpIR01MUVFJS0pLS05NVU5PS0tMR0dLUFNTTlBQTk9PT0lMRmFFRF5MRGZiQ0xaR15cc21PTVZuWUtDUF9Ua1ZnSl1YVV5ETFFVTE1TVlFSVFhWVFhUVFxUT2VaaGhlWlVrVFhXVVtcW2BgYWJiY2FnaWdubGhzenx9foGEhISDg4ODgX19enJ7gXp7f4KAg4SEhYWBhIWBg4N/fnp7TElFRkZIRUVMUFRKS0dgVEhKT0pJT01SUUtNS0xPUlVST1BKTE5HSE1RW1lPUFBOUFFQSktRf1FJfFlZcnNXUG1HcW5vYVZQcXF0T0Jrc21xc3BTb19bblhdVlxYVWtoVV1WY1lgWVpeVVVXf2l0dXVgYXZfWWJcXGZbX2FhYWJfYWNnbW9tYHB3dHiBgYKDhIJ/fX6Adnh6bXZ+dHh9gHx+gIGChHyAg3p/gX9+d3dOSUVITU1CRExMR0pMRlJWTEtPSExSWFdRTk9PTVFUTk9RUExMT0dNUFNbWlRRUk9QUFFMSVp4XVR4ZGhYUlNQdmZ0bHBibmZrUnJOTHdtanJwc3JxcnBvb4BdZXp1eHFxenF+cn1rdX1hUmh8ZXNzcHNzfH1wfnhvf3JgYGBiYltiYWhsbmtibGZnbXd+gYCDfnt4d4B0dnppcX5udHx+d3h7foCDeHyBdXx/fHxzc05LRmBdR0FETU1IS0tIS1BPTU5KTlZeWVVMUVNOWVlMU1NTTkxQSVFSVFlXV1BUUFBQU0xIZ3hsY3hxbVpKS1R5cHVtdWJudlBkZEhldnFtd2+AamZ4eGlXclFoem1panp6fmx4en9waG5YdXVqdnVxgWFzaH1pbHh8b19fX2NiXF9jZWdqamVnYmNkbG1wcHN0c3NzeXFyeGJtdGdyeXtzc3V5foFzdnpufH15eHJuTUpSdE5DQkVQUUhLTEpMUU9PT01QWmBaWEtTV1BhXlJWUVlTTVBKU1RWWFdXT1VQT05SS0xyb3V1cXVxY2hgVW5LcXBeR2h5V3ZUS2h4fXdgeXtzbmFdbW9kU2dydW5teXB3a3VzdHFsbVxzfnprbXl8bHVufGtxd3V4Xl9fYl9eYGVkaWdoZmVeYmJpaWlqa25va3FubWpwYWNmY293eG9tcHN5f25xcGp7enRyb21LS1pWSEdFR1JRS01OTExRUVBQUFFXXFlVTlZZVWZYUlJZXlRNTkpUVFdXWVdPU09PTlJJUm1IaXdLYGR2dlRWbE5ubHtyYWpnf3VUS1drZ3xsbWx4X1pwentfYHpzY3JveHFnY3xpcntdVEtsX3Z1bGp2fHtuf3lsfHBdXl5iW19jZWVnZmVlY1tjY2lra3JzcndnbWloZGdgYWxhZ3NybGdsbXJ8a21oa3t0bW1rbU9HSktISkhIUlFNT1BMTFNTUk9TUlhSV1RQV1pWVlRUVGFgUU9OS1RTU1FWVk9PTU5PUUtIUU5QVUxLS1JTUlFST1ZVUVFPUlJYWFBNT1VUV1hYW1tVUVJXW1dYV1tPUlRXV1hRXVhWXFVUT1hSV1dYWVpgXGhzX1xbW11dX2NaX2RkZWdkZGRjWmRiZ2ZmbW5tdWZmZ2NgZl5dZ2BkbGhmZ2tocHpoZ2drdWpoZ2lsUElLS0xNS0pUUk5SUVBMVlZUUFRVWFVaVVJaXVVVVFdVWVhPT0xOV1RQTlVTTlBOTFFQS0lRUUtRTUpKT1FUUVBRU1JKSE1PUFFSUFBQVFVSWFdcV1NTUFFVVVZTWlFOUlJXVFJYVVNYVFNRVVNVVVlZWF5aX2FdXFtaXFxgY1xeYmNkZ2VlZWNaYGFkYWJoaGpuY2FkXl9jXVpjXGJtYV5mZmdtc2RpaGtrZWRjZ2hRSktLTk9MTVRRT1RRUk1YV1VUVlhXV1pWU1xgVldWWVVYVFFQS09YU1BOVVBOUU9MU1BNT1VTTlFOTU5RU1BUUFFUVE5LTU9SVFRRUVFVV1VZWltZUlVSVFhXVllcU09TVFdUU1lUVlhUUlFXVlZYXFpcYF1XWV9dXl1cXWFhXltiY2NoZ2ZkY1hgYGJeYGhlZ2VhXl9dXV5aWl9aX2dgXl5dY2hrYWhmaGZkYGJkYlBLTUxQUUxQVVBQVFFPUVpZWFdZWlpYWFZdamRWWFlaV1ZTVE9LT1ZUUE9UUFBRT01SUU9SWFRRUU9NT1JUTVdRU1RVT05OUVRWVVJSUlRYVlpdXFpWVlFSV1hVW1tWUFNVVVVVWFNXWFRSUVhWVltfW15gX1ZfXV5gXVxgX19fWmNjZWhoZWViWWJgYl5fZmRjYGJdXFxcXFlaW1hbYVteXV1fYl9fYmRkYmRfX2BcUE1OTlJRTVJTUFNUUU9WXFpaV1tbXFlaW2RxbWhkX1tZVlZYUk1NV1NNTVJPUlNPTVBTUlVbVVRQUExQV1VQVlFSUlhNT1BSVVhVVFRTVFlYW15dXFtWUk9VV1VbWlZRU1ZUVVdVU1haU1JRWldXXV9bYGBgVmJcYGFdYGJfXGBdY2FjaGllZ2FaY2BhX19lZV9gY1taXFtcWlpZWVdcWlxaYF5fW15eYWBfY1xZYFpRTk9OVlFQVVNQVVVTUFdcXFxZXl1fV1xeanB3eYBjXFtWVllSTlBXU05RUVBSVFJMUlRUWVtXVU9STlNYVVNRUlBSWk9RU1RWW1ZWVlNWWlhdXlxcXlZTTlRWVltbVVFUVVVXWFJTWVtTUlJcWFpeX11iYWBXYltjYl5hY19cYmFiX2RnaWVnXlxkYGFgYWNkX2JfWVpfW1xbWFhZV1daWlphXV1bXVxcWl1gV1tbWlBPT09ZUFVVU1JXUlRQW11eXVxgXGBVXFxoanJ9c2xoXFVZV1FPU1tTUlFTUlVVVUtSV1ZaWlpTT1NRVVVUUk1UUFJaUlRVVFhdV1hYU1hcWF5dWVpdVVVOVlZXXlpXUVRVV1hYU1ZZW1RSVl1ZXV5hXmNjX1lgW2ViX2RkXl5jY2FeZWZpZWdfXmRhYWFiY2RfYl5YW19bXFtYWFhYV1taW2BdW1tcW1haW15WXlldUE9PUltQWlVWV1ZTVFReXmBfXmJcYFVdXmJreXVtfWxaVVpWUVFUXFRUVFZUVllXTFJaVlxbXFJQVVNXVVVST1ZQU1hTV1VWW15YW1lVWl5YX15ZXFlSV1JZWFlfWVlSVFVZWVlVV1lbVVRaXV1eYWJgZWRdXl1dZWFiZmReX2RjYFxnZWhmZWJgZWFfYWFiYl9gXlZZXlpcXFpZWVdWXVpdXltaW1xbV1lcXVZYV11TT1BXWVFdVVdZV1dVWF9gYWFgY11gVV1eYmVldoJ7aFhZWlRWVFZcWFdXVldXXVhPVVxZXl1dVFNYUlZVU1FSV1FTVlRYWFheXlhdW1VdX1hfX1hcVlFYVFpaWmFYW1RWV1pZWldYWVlXVl1eYF9kY2JmZV5iXGBmYmRmZF9gZGJhW2ZjaGZkZmFmX19iYmFhYF9eVlVdWltcW1lcWVldW1tbWFhZW1paWl1fXVRZXVVOVFpWVFxVV1dZV1ZcYGFiY2FjX19WW2BkYV96dW9oWlxaVlhWWFtaWVtZWFlgVk9VXVtgYVxVVVlQVFZUUlVVUVRVV1tbXF9fWl9cVl9fWV1eWV1WUlhXWllcYlldVVZaW1pbWlpYWlhZX19gYGRjZGVlY2RaYmZjZ2ZlXmFiYGNdYmNpZWRnYGheYmJjYWFgXl9ZVFtaWltbWFxYWFxbWltXV1pYWFxbXGBdVl1dU09WWlZWWlZZVlhXWF5gYmFkYWRhXllZYWRiYGtmaF5cXVtXWFlaXFxcX1taW2JWU1deXWFjXFNWWVBWVVVVVVVTVVRYXV1fYGBdYV1XYV5bXlxbXlhVWFdbWl9fW15XWFxcXF1dW1pcV1pfYV5gZGRlZmZnY1ljZmVoZ2ReY2BfZWNdZmlkZWlgZ15jYmNhYWBfX1xYWVtZWllZWlhXW1taW1dYWlRaXVxbYFxVXmJNUldaV1daWVtcWFdZXmBiYWRhZGFdXllhY2JfYWBhX1xdXVhXW1tdXV9fXFpdY1hZWF1gY2RfUlhZUFdVV1hXVlZXVl1dXmFiYV9iXllhXV1eWV1dWVhVVltbYF5dX1lZXl1eXmBcWlpZW19iX2NmZGZnZmhjWmVmZ2lnY19jXmFmZVppaWNmamRmX2JiY2FgYF9dXVpXW1lZWFhaWVdaW1pZV1hWVVxdXV1gYGJieEtXV1xZV11cXF1aV1xdX2BiZGJjYV1gWGJjYmBjYWNeXF1cWFdbXV9dYF9dW2BkXFxYWmJlY2FSXFlPWFZZW1lZV1laYF5hYmNgYWNfXGJdX11bXl1ZWVRYXVxfX15fW1peXmBiYltbV1tdYGJiZGZkZ2ZmaGVdZWdoaWZjYWJbY2dgXGlpY2hqZ2VgYmFjYV9gX11dXFlcWVhXWFlZV1xbWldWWFBYWl1hY2Zmcmt/SllXXVtaX11cXlxZXVteX2JjYmFhXWJbYmRiYGNiYl1dW1pXWGpxYFxgX11cYWNfXllZY2VkYlRfWlFZV1xdXFtZW1tjYGNjY2BiZGFgY15gXF5eXlpYVVteXFxhYV9dW2BhYmZiXltTXF9gY2RkZmVnZmZnZl9mZ2hoZ2RkYFtlZ15haGhjaGlnZGBiYGNiX19fXV1bWltZWFhYVlpWXFtaVlZVTFhYXGdpa2h1eIF2dnZ2dnZ2dnZ2dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6e3p6ent7e3t7e3t7e3t7e3t7e3x7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHt7e3t8fHx8fHx8fHx8e3t7fHx8fHx7e3t7e3t7fYmIh4mHhYKBgoOCg4OCgoKCgoKCgoKCgoGAgYCBgICAgYCBgYGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t6e3t7e3t7fHx8fHx8fHx8fHx7e3t7e3t7e3t7e3x7e3t7e3t7fHx8fHt7e3t7e3t8iYmHiYaFgoGCgoGCgoKCgYKCgoKCgoKBgYGAgICAgICAgIGBgYB9fHx8e3x8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eHh5eXl5eXl5eXl5eXp7e3p6e3p6enp6enp6ent7e3t6ent7e3t7e3t8fHx8fHx8fHx8fHx7e3t7e3t7fHx8e3t7e3t7e3t7fHx8fHx7fHt7e3uHiYiJhYSDgYKCgoODgoKCgoKCgoKCgYGBgICAgICAgICAgYKBgH58fHx8fHx8fHx8fHx8fHx2dnV2dnZ2dXZ2d3d3d3d3d3d3d3d3d3h4eHh4eHh4eHh4eHh4eHh4eHl5eXl5eXl5eXl5enp6e3t6enp6enp6enp7e3p7enp6ent7e3t7fHx8fHx8fHx8fHx8fHx8fHx8e3x8fHx8e3t7e3t7e3x8fHx8fHt7e3t7e4aJiYiFhYOBgoKCg4ODgoKCgoKCgoKBgYGAgICAgICAgIGBgYCAfnx8fHx8fHx8fHx9fX18fHaIi4uLi4uLgX19fX19fYSMi4uLi454KSkqKiopKz0/Pj4+Pj5tgH5+f397pdfT09PT08/ExcXFxcXH0tTU1NPT08S+vr6+vsKiioyMjIyNiX5/f39/f359fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx8fHx8fHt7e3t7hIuHh4aHgoGDg4GCgoKCgoKCgoKCgoGBgYCAgICAgICAgYCBgIB+fHx8fHx8fHx9fXx8fH19doyQj4+Pj5CDfn9/f39+hpCPj4+Pk3kZGhoaGhocMTMzMzMzMmqCf4CAgHut6eTk5OTl4NTU1NTU1Nbj5eXl5eTl0svMzczN0KqNkJCQkJKLf39/f39/f319fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e3uCjYeIh4eDgoSCgYKCgoKCgoOCgoKCgYGBgICAgICAgICAgICAgH58fHx8fHx8fXx8fH19fX12eHh4eHh4eHd3d3d3d3d4eXl6enl5d29wcHBwcHBycnJycnJyd3p5eXp6en6Dg4ODg4ODgoKDg4OCg4SEhISEg4OCgoODg4KDgHx8fX19fX18fX19fX19fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e4CMhomHh4SDhIKCgoKCgYKCg4KCgoGBgYGBgYCAf4CAgICAgICAfnx8fHx8fHx8fX19fX19fXZ2dnV1dXh2dnZ6e3h7eHd2eHx6eXl6fnx5eXh4eHh5eXl5enp5eXl5enp6eXh4eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXp7e3t7fHx7fHx8fHx9fX19fX19fX18fH19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8f4uHi4qIhIODgoKCg4KBgoKDgoKCgYGBgYGAgIGAf4CAgH+AgYF+fX18fHx8fHx9fX19fX19d3d3dnZ3fXh3d316eH14d3Z6fXl7e3l8e3h3d3d3eHh4eHh5eXl5eXp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fHx8fHx8fHx7e3x8fHx8fHx8fHx+iomMjImFg4SEgoKDgoGCgoKCgoKBgYGBgYCAgICAgICAf4CAgH19fXx8fH19fX19fX19fX13d3d3d3p9eHt4fHx3e3h3dnp+enl7eHt6eHh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fX19fXx9fX19fX19fX19fX19fHx8fHx8fHt7fHx8fHx8fHx8fH2Kio2NioWDg4OCgoKCgYGCgoKBgoGBgYKBgIGBgICAgIB/gIGAfXx9fX18fX19fX19fX19fXd3d3d3fX55d3d4e3p7eHd3eHl8enx3fHl4eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt8fHx8fHx8fHx8fHx8fH19fX18fH18fH18fHx8fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8foqJjo2JhISEg4KDgoKBgYKBgoKCgYGBgoGAgYKAgICAgH+BgIB8fH19fX18fX19fX19fn5+d3d3d3d5fHl7eHx9eXt4enp6fXx6fHh8eHh4eHh4eHh4eXl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt7fHx7fHx8fHx8fHx8fXx8fX19fX19fXx8fHx8fHx8fXx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx/iIeNioeFhoaDg4ODgoGBgoGCgoGBgYGCgYCAgoGAgICAf4CAgHx8fX19fX19fX19fX5+fn53d3d3d3Z4eHl3eXp4enh5eXl7eXl6eXl4eHh5eXh4eHh5eXl5enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX18fH18fH19fX19fH19fX19fHx8fHx8fHx8fHx8fX+HiIyIhoeHhIKDhISCgYKBgYKCgoGBgYKBgIGBgYGAgIB/gIGAfHx9fX19fX19fX1+fn5+fnd3d3d3d3d3d3d3eHh4eHh4eHh4eHl5eXl5eXl5eXl5eXl6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fHx8fX19fHx8gIeIi4eHiYaDg4SDg4KBgYGCgoGBgYKCgYGBgIGBgYCAgICBgX97fH19fX19fX19fn5+fn5+d3d3d3d3d3d4eHd4dnl5eHh4eHh5eXl5eXl5eXl5eXl5enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fH19fXx9fXyBhoqKiYmIhIOFhISCgoGBgYGCgYGCgoGBgYCAgYGAgIGAgIGBf3x8fX19fX1+fn5+fn5+f394eHd4eHh4eHZxZGpeam15eXl5eXl5eXl5eXl5enp6enp6enp6enp7e3t8e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIGFiYqJioeEhYWEg4KCgYGBgoKBgYKBgYGBgYCBgYCAgYCBgIF+fH1+fn5+fn5+fn5+fn9/f3h4eHh4eHh5bWRiZV9fXm94eXl5eXl5eXl5eXp6enp6enp6enp6e3t7e3t7fHx8fHx8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goWKiomJhISGhYSDg4KBgYKCgoGBgoGBgYKBgIGBgICAgICBgH58fX5+fn5+fn5+fn9/f39/eHh4eHh4eW5kZWdlZGJeZnh5eXl5enp6enp6enp6enp6enp6e3t7e3t7e3x8fHx8fHt8fHt7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChouJiIqEhYaEg4OEgoGBgYGCgYKCgYGBgYCAgYGBgIB/gIGBf3x8fn5+fn5+fn9/f39/f394eHh4eHl3Z2VkZWZkZWFfaXl6enp6enp6enp6enp6ent7e3t7e3t7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHt8fHx8fHx8fHx9fX19fX19fX19fX19fXx9fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4eJh4SEhoSDg4WBgYGBgYKCgYGBgYKBgICAgYGAgYCAgYF+fHx/f35/f39/f39/f39/gHl5eXl5eWtlYWJlZWFlZV5ieHdze3p6enp6enp6enp6e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fH18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19g4aLhoiFhYaEgoOEhIKBgYGBgoKBgYKBgYGAgYGBgYGAgIGBgn98fH9/f39/f39/f3+AgICAeXl5eXl0Y2NlZGNmY2doZGZsZF5ze3p6enp6enp6enp6ent7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn6DhouGhoaGhYODg4SDgYGBgYGCgoGBgYKBgYCAgYGBgYCAgYGBfnx8f39/f39/gICAgICAgIB5eXl6d2RhY2diYmRdW2VfYV1eYGFoeHp6enp6enp6enp6e3t7e3t7fHx8e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+foSFi4eGhoaGhIODg4KBgYGBgoKCgYKBgoGAgIGBgYGAgYGBgYF+fX1/gH+AgICAgICAgICAgHl5eW9vYmJiZF5jZ19dYWFgXF9kYlttfHp6enp6enp6enp7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7fHx7e3x7fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5/hIiLhoSHhoaEhIODgoGBgYGCgYGBgYKCgYCAgYGBgYGBgYGBgX5+fYCAgICAgICAgICAgICBeXpwXWJlZGJkXmZnZ2BZYmJhY2VfXF1ze3t6enp7e3t7e3t8fHx8fHx8fHt7e3t7e3t7e3t7e3t7fHx8fHx8e3x8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fn19fn5+fn5+fn5+fn5+foCFjIqEhYaGhYODg4SCgYGBgYKBgYGBgoKCgYCBgYGCgICAgIGBf35+gICAgICAgICAgIGBgYF5emxiZGdjYmdmYWBgZGFiZWRjZGNeXGJ1fHt7e3t7e3t7e3x8fHx7e3x8fHx7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/gYeMiYWGhoeFg4SDgoGBgYGBgYKBgoKCg4KBgIGBgYKBgYGCgoF/f36AgICAgICAgIGBgYGBgXp7dGdnZmZkZGZmYF5fYWNlaGRlXmJkYHR8e3t7e3t7fHx8fHx8fHx8fHt7fHt8fHt7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f3+CiYqIhoaIhoWDhIOCgYGBgYGBgoKBgoKCgoGAgYGBgoKBgYKCgX9/f4GBgYGAgYGBgYGBgYGBenptaGNjZ2ZnZWdmZmdiZWRlYmdbYmVgdnx8e3x8fHx8fHx8fHx8e3t8fHx8e3x8fHt7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f39/f4SJioiGiYeFhYSEg4KBgYGBgYGCgYKCgYGBgYGBgYKBgoGBgICBgH9/gYGBgYGBgYGBgYGBgYF7emlpZGNqZmFgZmVjY2NnaWRjYmBiZGJ0fXx8fHx8fHt8fHx8fHx8e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f39+fn9/f39/f39/f3+AhIqMiIeJhoSFhYOCgYGBgYGBgYKBgoGBgYGBgYGBgoKBgYGBgYGAgH+BgYGBgYGBgYGBgYGBgXZzZWRnY2RmZWJlZmdkZmhmZWNgYGNkYHF9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fXx9fX18fHx9fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/fn5+f35+f39/f39/f3+AgICFioyJiIqJhoaDgoKCgYGBgYGBgoGBgoGBgYGBgIGBgYGBgYGCgX+Af35/foCCgoKCgoKCgoKCc3NnZWRkZWlqaGZnZ2NhZmZlZmdmZWVjdX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gICAgICAgIWLioqJioeHhoSCgoGBgYGBgYKCgYKBgYGBgIGBgoKBgYGBgYGAf4B+dHRzdX1/goCAfn5/gYB0cmdkZWNmaWppZWNlY2BmZGRnZ2JiZWFwfXx8fHx8fHx8fHx8fHx8fHx9fX18fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f39/f39/f4CAgICAgIB/houLioqLh4eHhIOCgYGBgYGBgYKBgoKBgYGAgYKCgYCBgYGBgoCAgH5zc3NzdHV4dXV0dHV2dXVwZmNmZWhoaWdoZ2VmZWJfZGVmY2BiZ3d8fHx8fX19fX18fHx8fH19fX19fX19fXx9fXx8fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gIB/f3+AgICAgICAgICHjIyIi4qHh4eEhYKBgYGBgYGBgoGCgoGBgYCBgoGBgYKCgoKCgYCAfnNzc3Nzc3NzdHR0dHNzdW9jY2FnZWhoZ2pmZGVnZmhmY2JlYl5ieX18e3t8fX19fX18fHx9fX19fX19e3x9fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn9/fn5+fn5+fn5/f39/f4CAgH9/gICBgICAgICAgYCAf4CAgYGAgIeLi4iNiYiJhoSFgYGBgYGBgYKCgYKCgYGBgIGCgoGBgYKBgoKBgIB+dHNzc3Nzc3Nzc3Nzc3N1cmdlZWRlamhoZ2ZpaGdjZWViZGNoZGd7eHVzc3R2dnl4dnR0dHZ3d3d2dHR0dXV4d3h4d3d6e3x9fXx9fn5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f35/f39/gH9+fHt7fX58eXl2dnZ5fHx6end2d3l7fXt4hIyMioyHh4iEhYSBgYGBgYGBgoGBgoGBgYGAgYKCgYGBgoGBgoGAgH51c3Nzc3Nzc3Nzc3Nzc3VzaGVnaGVrbGhqZ2lqZ2dnZmRkYmVkbnV0dHNzdHNzc3Nzc3Nzc3Nzc3NzdHNzc3Nzc3Nzc3N0dHV1c3V3eHl7fn59fn98f39/f39/f39/f314fH5+fXx4dXZ3eXd4dnRzc3N0dXRzc3Nzc3NzdHNzc3R0c3R0dHODjI2KiYeIhoOGg4GBgYGBgYGBgYGCgYGAgYGDgoKBgYCBgYGBgICAf3VzdHRzc3Nzc3Nyc3NzdnZpY2hqaGpsZWZpbGhgZmVkY2BkZGZ0dXV1dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHRzdHRzc3Nzc3R2dnV1d3V4fH9+fX9+fHp4dXN0dXV1dHNzc3Nzc3N0dHR0dHR0dHR1dXR0dHV1dHR1dXR1dXV1dIaMjYuIhoeEhIWCgYGBgYGBgYGCgoGAgYCBgYKCgoGBgIGBgYGAgIB/dnNzc3Nzc3Nzc3Nzc3N2dnNnZ2pmaGdmaGhmZGlnY2NnZWVmcHZ1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dHR1dHR0dHR0dHRzdHR0dnV1d3Z0c3R0dHR0dHR0dXV1dXV0dXV1dXV1dXV0dHNzc3N0dHNzdHR0dHR1dXR1iY6MjIqHh4SEhYKBgYGBgYGBgYKCgoGBgICAgoKCgoGBgYGBgYCAgH93c3Nzc3NycnJyc3NzcnZ2dW5kXWNnZWlraGVoZ2dqamlnZXB2dXV1dXV0dHRzdHR0dHR0dHV1dXV1dXV0dHV1dHR1dXV1dXV1dXV1dXR0dHV1dXV1dXV0dHV0dHV1dXV1dXV1dXV1dXV1dXV1dXV0dHNzc3Nzc3N0dHNzc3Nzc3R0dHR0dHWKjoyMiYaGhIeFgoGBgYGBgYGBgoKBgYGAgYGCgYKBgYGBgYKBgICAf3hzc3Nzc3JycnJyc3NzdnZ3d2liaGhnamtpaGZkZGVmaWhwdXR0dHRzc3JxcnJ0dXV0dHR0dHR0c3NycXFxcXNzdHR0dHR0dHR0dHV0cnJyc3R0dHR0dXV1dXV1dXR0dXR0dHR0dHR0dHR0dHR0c3Nzc3Nzc3Nzc3Nzc3N0dHN0dHR0dHR0dYuOjImGhYWFh4SCgYGBgYGBgYGBgoKCgYGAgIKCgoGBgYGBgYGBgIB/eXNzc3NycXJycnJzc3N3d3d3bGpoZGhpa3Z6a2VmZWhnbXJzdHN0c3JwcHBxcnN0dXR0c3NycnNycXBvb29vcHFzc3NycnJyc3R0dHNxcHFyc3R0dHR0dHRzc3Rzc3NzdHR0dHRzdHR0dHR0dHRzdHR0c3NycnFxcnJzc3Nyc3NzdHR0dHN2jZCMh4eFhYSEgoGCgoGBgYGBgYGCgoKBgYGAgYGCgoGBgYKCgYGAf395c3NycnFxcnJycnNzc3d3d3dzc2pnaWloeX99cW51bG5wcXJycnFxcG9wcXFxc3Rzc3NycXFwcG5ubm1ubW5ubnBxcnJycnJycnJzcXBvb3BxcnJzc3JxcnJycnJycnJycnJzc3Jzc3Nzc3Nzc3Nzc3Jxb29ubm9vcXJzc3Jyc3NycnNzcnaPj4uHhoWFhYOCgoKBgYGBgYGBgYGBgoGBgYGCgoKBgoGCgoGCgX9/f3hxcHBwcXFycnJyc3Nzd3d2dnd2cnF0c252f352c3hwcHBycnJycXFwcHFxcXFyc3Nzc3FwcXBvb25ubm5ub25vcHBxcXFxcXBwcXJwb25vcHFxcXFxcHBxcXFxcXJycnJycnJycnFxcnFxcnJycnFwb29ubm1ubW5vcXJycnJycnJyc3JxeI+OjYaDg4aEg4OCgoGCgYGBgYKBgYGCgYGBgYKCgoKCgoKBgYKBf4B/d29wb3BxcnJyc3Nzc3J2dnZ2dnZ3dnZ1c3l/fnd3d29wcXFxcXFxcHBwcXJxcnJzc3JycXBwb29wb29vb29vb29wb3Bvb29vcHBxb29vcHBwcHBvcG9wcHFycXFxcnJycnFxcXFxcXFxcHBwcHBxb29ubm5tbW5tbm9wcXFxcXFxcXFxcXB7j42NhoODhYOCgoKCgYKBgYGBgoGCgYGCgoGCg4KBg4KBgYGAgYF/f392bm9wcHBxcXFxcXBwcHZ2dnZ2dXR0c3NxfYB9fX9zb3BxcXFwcHBwcXFwcHBxcnJxcXFwb3Bvb3Bwb29wcG9vb29vb29vb3BxcXBub3Bwb29wb29wcnJycnFxcXBxcnFwcXFxcHBwcHBwcHBwb29ubm1ubm5ubm9ub3BwcHFxcXFxcXFxcIKRjoqEhIOFhIOCgoGBgoKBgYKBgYGBgYGCgoKCgoKCgYGBgYCBgX9/gHVvb29wcXFxcXBwcHBwdnZ2dXRzcnJycnGAgoCBeXBwcHBvcHBwcHFxcXFwcXFxcXFxcG9vcHBwcHBwb3BxcHBvb29wb29vcXFwcG9wcG9vb25vcHFxcHBwb3Bvb3BwcHBwcHBwcHBvb29vb29vbm5tbW1ubm5ub25vb3BvcHBwcHBwcHBwiZCMiISDhIaDhIKCgYGCgoKCgYGBgYCAgYGBgoKBgYGBgYGBgIGBgH+AdG5vb3BxcXFwcG9vcG92dnVzcnFxcXFxcICDg39ycHBwcHBwcHBwcHFxcHBxcXFxcXBwcHBwcHBwcHFwcHBwcHBwcHBvcHBxcXBwcHFxb29vbm9wcHBvb29vcHBvb3BwcHBwcHBwcHBvb29vbm5ubm5ubW5ubm1ubm9wcG9vb29vb3BzcXWPj4yJg4KFh4ODgoKBgoGCgoKBgYKBgYCBgoGBgYGBgYCAgYGAgYGAf4B0b29vbm9vb29vb29vb3Z1dHNxcXFxcXJygIKCgXRxcXFxcXFxcXFxcXFxcXFxcXBxcXFxcHFwcXBxcXFwcHBwcHFxcXBxcHBwcXBwcHBwcHBwcHBwcHBwcHFxcXBxcHBwcHFwcHFxcHFxcXFxcXJxcnFwcnRycnR0dHR1dnRzdHR0dXd3gpCPi4iDgoaHhISCg4GBgYKCgoGBgoGBgYKBgYGBgYGAgICBgYCBgYB/gHVvb29vb29vb25vb29vdXRzcnJycnJycnKDg4OCdnFycnFxcXJxcnJxcXJycnFxcXFxcnFxcXJycXFycXFxcXFxcXFxcXFwcXFxcXFxcnNzcnJyc3V1dHR0dHR0dHV2d3d3d3d3eHh4eHd3eHh4d3Z3dnV2dnZ2d3h6e3x7e3t6enp6enyGkI2LiIODiIeHhYODgoGCgYKBgYGBgYKCgoGBgYGAgYCAgYGAgIGBgH+Ad3FxcXFxcG5ucG9wcG92dHV1c3Nzc3NzdYiDgoN5cnNzcnJyc3Jyc3NycnJycnN0cnJzcnNzc3Nzc3Nyc3N0dHV1dXV1dHV3eHd3d3d4eHh3eHh4eXl5eXl4eHl5eXp6e3t7e3t6enp5eXh3d3d1dnV2dnd5enp7fn5+fX1+fn5/f35+gIyQi4qHg4WIi4iEg4SDgYGCgYGBgoGBgoKDgoKAgYGBgYCBgYGAgIGAf4B8enp5eXx5eHh2dXZ2dHl2d3h3d3Z3dnZ6f3x+fnx2dnd3dnV4enh4eHh3d3d2eHx5eXx6eXl8e3l5eXh4eXl6enl5eXh4enp5eXh4eHh3dnd3eHh3eHh5eXp7e3p8fH1+fX9/f359e3t7e3p5enl5e3t/foB/fn5/fn19fX5+f35+fn6AjpCNioeEhoqMiIaGhIOBgoKBgYGCgYGCgoKCgoCBgoKBgYGBgYCBgIF/f4B/fn19fX9/f318e3t7eXh4eHh5eXl4eXh5eXl4enp6enp6e3t7fH1+fHt7ent8e318e3t7e3t7enl4eXh4ent6enp5eXp8fHt6enx8fHp6ent9fXx+fn+AgoGAgYKAgH9/gYGBgIB/f35+fn5/fX1+f4CAf35+f39+fn9/f39/gH+Af4OQjoyHhoWIi4yIh4aFg4GCgYGBgYKBgoKCgoKBgYKDgoGBgYGBgIGBgIB/goOCgoGBgX99f39/f4F6enh4d3h4eHh5eHh5enp5e358enx9fXt8fX19fHx8fnx9fn5+fn59fX9/f3x8fYGDgYCAf318fXx9fXt9fXx8fH19fX1/gIGChISDgoB/gYGBgH9/f4B/f39/f39+fn9/f39/f35+f3+Af39/gICAf4CAgICAhJCPi4eGhoiLi4mKhoaDgoKCgYGBgoGCgYKBgYGBgoOCgYCBgYGAgIGBgH+ChIKCgICAgH9+fn+AgH9/fn18fX19fYB/fX+Af35/gH9/fn9/gIGBgICAf3+BgICAf4CBgn9/f4CAf35+f39+f39/fn5+f39/gYB/f4CBgYCAgYOEgoGCgoGCgH+AgYCBgYGAgH+BgICAf39/gICAgYGBgIGBgYCAgICBgoGBgYCAgYGFjo6MiIaHiYyLi4qGhYOCgoKBgYGCgoOCgoKBgIGBgoKCgICBgYCAgYGAf4KFg4KBgYCAf39+fn+AfX5+fn19fX5/fn9/f35+fn+AgYCAgICAfn9/fn+Af3+AgH9/f35/f39+fn59fn9+fn9/f35/gIGBgoKDg4KCg4KBgYKDg4OCgYGBgYKBgoKCgYKBgoGBgYGBgoKCgYGCgYKCgoGBgoKBgYKCgoKCgYGBgoKCgoaPkY+Kh4iKjY6NiYaFgoKCgoKBgYKCg4KCgoGBgYGBgYF/gIGBgYCBgIF/gYWEg4KCgoGCgYCAgIB8fHx7fH18fH9+fn9+fn5+f35+f39/f39/f35+foB+fn5+fn9/f39/f39+fn5/gIB/gIB/f39/f3+BgYGCgoCAgYKDg4SDg4ODgoKCgoKCgoKCgoKCgoGCgoKDg4OCg4ODgoKCgYKCgoODg4ODgoKCgoOEg4KCh5KTkIuKiouPj42Kh4SCgoKCgYGBgoKDgoKBgYGBgIGBgICAgYGBgIGBgYCAg4SDg4OEg4ODgoKCgXx9fHx9gn1+f4GCiIGCgoSCgYGDg4GBgYKCgYKBgYCAf39/gICAf3+AgX9/f39/gYCAgICAgH9/f3+AgICAgH9/gYODhYSEg4SDgoKCg4OCgoOCgoODg4ODg4SDg4KEhYWDg4SEgoKDhIOCg4ODg4OCgoODgoCKlJOPioqMjpCPjYuGg4KCgoKBgYGBgoOCgYGBgIGBgoGBgICBgYGAgYCAgH+BgoODg4SEhIOCgoKCfXx8fn6AgYOAg4OChIaFhoaFhIWFg4ODg4OBgYKEhIKDgoeDgoKAgoGBgoKCg4KCg4KDgoODgoGAgIKCgYOCgYKCg4OEhYWEg4OChISEhIOEhISDg4OEg4ODg4OEg4SDhIWEhISDg4ODgoKCgoGCgoKBgYKCgo+UlI+Njo6RkY6KiISCgoKCgYGBgYGCg4GBgIGBgYGBgYCBgIGBgYCBgICAgIKChIKChIOCg4ODgoJ9fX2AgH+AgoGDg4ODhIaEhISEhYWDg4KBgoOBgIKDgYOFhYWFhoaHhoaGhoeHh4aGhoeHhoaEgoGCg4SDg4ODg4ODhIWFhIWDhYSFhISEg4KBg4OCg4SEg4KCg4SCg4ODg4OCgoKCgoKCg4OEhIOFhYWFhoaIk5OTkI+Pj5KRjIqHgoKCgoKBgYGBgYKDgoKBgIGBgYGBgICAgYGBgICAgICAhISEgoKCgoGBgoKBgX+AgYOCgICAf4CCgoKDg4KCgYODg4SEg4KDhYOCgYGBgoSFh4eHh4aGh4eHiIiHh4eIiIiFhIOBgIGBgoKCg4GCg4SEhYSDg4OEg4OEhIOBgYGCg4OEhISDg4ODg4OEhIODgoSDg4ODhIWFhoeHh4eIiIiJiY6TkpKOkI6QkY+LiYeCgoKCgoKBgYGBgoKCgoGBgYGBgYGAgICAgYGAgIGAgICDg4KCgYKCgYGAf4CBhYWFhoOCgYB+fn+BgoSCgYKDhIOCg4ODg4KChISDg4OCg4SFhISFhYSDgoSFhYKEhIWFg4KBgH9/gIB/gIGEg4OEhYWEgoKCgoOCg4OFhIKDhISEhYaGhoaGhoWFhoeHhYaIh4aHiIeGhoaIiIeGhYaGhoeIkZKSkI6QjpCRjImHhYGBgoKCgoGBgYGBgoOBgYGBgYGBgICAgICBgYCAgICAgISEg4KBgoGAgYGAgYKIh4aHhYSCgH99fX6AgH+AgYGBgYGCgoGAgYOCgoGCgoKBgYGCgYKCg4GBgICAf4GAgH+AgH9+gIGBgYKCg4OEg4OEg4OCgoGBgoODg4SEg4SEhIOFhYaFh4eIh4eHh4eHh4eGhoaGh4WFhYaGhIWEhIWEhYaSk5GOjo+OkI6JiIeEgoKCgoKCgoGBgIGCgoKCgoKCgoGBgYGBgYGBgICAgYGAgoSDg4KDgoKCgYKDg4iHh4eHhYSCgX5+gICAfn5+f4CBgYGCgYCCgoGCgH+AgIB+gIKBgIGCg4OAf39/gICAf4CAgICDg4KDg4ODgoOBgYKCgoOCgYKCgoOCgoSDhISDg4SEhYWFhYaGhoaFhISEhYWEhIWFhYSEhISDhISEhISEipSTkZCQj46NiIaFhIOBgYKCgoKCgYGAgYKCgoKBgoKBgYCBgYCBgYGAgICAgYGAg4OCgoOCgoKBgoOCiImJiYmHhYSDgYKEhIOBgYGCgoOCgoOEgoOEhYWEgoSCgX+AgoGBgoGChIOBgYGBgoOCgoGDg4SDg4SEg4OCg4KDg4ODg4KCgoKCgoGDhISEhYSFhYWFhIWEhIWFhYWDg4OEhISEhYWFhISEhISEg4ODg4OOlZKRkZGOjYyHhYODg4GCgoKCgoKBgYCBgoOCgYCCgYGBgICAgIGBgYCAgICBgICDhYSEhIODg4SDhIOGh4mIhoWDhIOEhISDgoGDgoOFhYODg4SDhIODhYSFhISEgYGAgYKDgoKEg4OCgoGBhIWEg4ODgoKDhISDg4ODg4SFhISDg4KCgoKCgoSEhYSFhYaFhYODhYWFhYaFhoWEhIWEhYWGhYWFhIWEhISDhIODhJGUk5OSj4yMioWEhIODgYKCg4KCgoKBgYGCg4KBgoKBgYGBgICBgIGBgH+AgIGAgYaGhoaGhoaHh4aGhYSDhYaCgIGBgYGHgoB+f4GAgIKBgYCBgYCAgoGCgoKBgYKCgYCBgoKCgoKDg4GCgYKDhYODg4KDg4OEgoKEhIOEhIWEg4OCgoKCgYGCg4ODg4SFhIWFhIOEhYWGhYWFhISEhIOEhIWFhYWFhIODhIOEg4KGlJSSlJKPjYuHhISDg4KBgoODgoKDg4GBgoKCgoKCgYGCgYGBgYCAgYGAgICAgICAhYWFhYaGh4eGhoWGg4ODg4GAgoKCgYKAf35/f4CAf4B/gIGAgH+BgYGBg4GAgYGChIOBgYGBgYKBgYKDgoODgoOCgoKCg4OBg4SDg4ODg4OEhIKCgoKDgoKDg4ODhIWEhISEg4OEhIODg4OEhIODg4ODg4SDg4ODg4KDg4KDgouUk5KTkY2NioaDg4OEgoGCg4ODg4ODgoGBgoGCgoKCgoKBgYGBgICBgYCAf4CAgICDhISFhYSFhYWEhYWCg4KDgoKDg4OBgICAgICAgYCAg4KCg4GBgoKDg4OEgoODg4KAgICCgoKDgoKDg4ODgoODhIKCgoODgoKDg4KCg4KDg4WEg4ODg4SDg4SEhISEhYWEhIWEg4SEg4OEhISEhISEg4SEhYSDg4SEhIODgoKDkJSSkpKPi4yIhoOEg4OBgYKDg4ODg4OCgYGCgoKCgoKDgoCBgoGAgICAgIB/gICAgISDhYWEhYWFhYSFhYOEhIWDg4SFhYKBgoOCgoSCgYKGhYSEg4OEhISGhYSEhYJ/fX19foKEg4ODg4OEg4ODhISEg4OEhISEg4SEhIOEg4OFhoWFhYSEhYWFhYSFhoWGhYWFhYWFhYWFhYWGhoWGhoaFhoaGh4aFhYWFg4SEhIeTk5KRkoyLiIWFhYWCgoGBgoODg4OCg4KBgYKDg4ODgoKBgIGAgICAgYCAgH+AgICAhYWFhYWGh4eGhYWFhISFhYSEhISEg4SDg4OEhYOCg4SFhYaFhoaFhoeHhoOBfn9+fn5+f4OEg4OEhISEhISEhISEhISFhYWEhYSGhYWGhYaGhoWGhYWHhYWGhYaGhoaFhIWFhYWFhYWGhoaHhoaGhoaHh4iIiIaFhYaEhYWGjZSTkpGQi4qHhoeGhIGCgoKDg4ODg4KDgoGBgoODg4KAgYGBgICAgICAgICAf4CAgICHh4eGhoeHiIeHhoaEg4ODhIODg4OEg4ODg4OEhIODg4WFhYWHh4WFh4WBf39/f39/f35/gISFhIWGhoaFhYWFhoaHhoaFhoWFhoeHh4iHh4eGhoaHh4eGhoaGhoaGhYSDhIWFhYSFhYaGh4eHhoaGhoeHh4eIiIeGhoaHh4eRk5KQkZCLiIiFhoSDgoKBgoODg4ODgoKDgoKCgoOCgYCBgICBgICAgIGAgIB/gICAf4aHiIeHh4eIiYmIiIODgoKDg4SEhIWEg4KCg4OEg4OChIWEhYeHhYSCgH9/f39/gH9/f4B/f4WFhoeIiIeHh4eIh4iHiIiIhoaHiIiJiYmIh4aHh4eIiIaHhoeIhoeFhIOEhYaGhYWFhoaGh4eFhoeGh4aGh4eHh4eHh4eFh5OTkY+RkIuHhoWGhIKCgYGCg4ODg4ODgoKCgoGCg4KCgIGBgYCAgICAgICAf3+AgYB/hoiIiIiHh4iJiYmIg4KCg4ODhIWHh4eFg4OFhIODg4KEhISEhYSBgIGCgYGBgYB/gH9/fnt6gIaIiIqKiYmIiImJiYmKi4qIiIiJiouLiomIiIeIiIiHh4iHh4iGh4aEg4OFh4eHhoWFhISEhYWEhYWGhISEhYWFhoWGhYOJlJOQjpGOioaFhoWDgYGBgYKDg4ODgoKCgoKCgoKCgYGBgYGBgYCAgICAgIB/gICBgH+GiYiIiYeIiImJiIiEgoKDg4ODhImKh4eEhIWEg4OEg4WEg4OCgYKCgoKCgH9+fH19fX9+fHt8g4eJi4uKioqIiIqJiImLiomJiImIioqJi4mHhoaGh4WGiIiJiIeGh4SDgoWIiIiHh4WCgoGDg4KDg4SCgoKDgoGEg4SDgY6TkpCPj4uIhYSGhIKBgYGBgoODg4OCgoKCgoKCgoGBgYGBgIGAgICAgICAgH+AgIGAf4WIh4eHhoeIiIiHh4SCg4OCg4OFiYqJh4WHhYSFhYSDhYSDgoKCgoKDgX59fn5+fn5+fX1+fX19g4eJioqHh4WGh4eHh4iHh4mGiIaIh4eJiISDhIOFhISFhYaIh4aFg4KChIWHhoeGhoOCgoOEgoOEhIKBgYGBgYODhIOEkZKRjo+Ni4eEhoaDgoGAgYGDg4ODg4KCgoKCgoKCgYGBgIGBgYCAgIB/gIGAf3+AgIB/hYaGhYaGhoeHiIeGgYKEhIODhYaIi4qGhYaEgoaGgoCDg4ODg4OCgoF9fH1/gH9+fn59fH19fHp8hIaHhoSDgYODhIWFhYODhYSEhISFhIWEgoKDgoSEgYKDg4WGhYSCgYGCgoODhYOEhIWEhIaDhISFg4KDgYKDg4SFhIeSkY+Nj4yJhoSFhIWCgYCBgYODg4ODgoKCgoKCgoKBgYGBgYGAgICAf4CAgYB/gICAgICEhIWEhYWFh4eHh4aAgYGFg4OFhYSHiIWDgYCAgX9+fYKDg4ODgoKAfX1/gICBf31+fn19fX16enp+g4SEgoGBgIGBgoKBf36BgYGCgYOBgoGCgoKBg4OAf4CAgYOCgICAgIGBgYGCgYGChIODhYSCgoSDgoKBgoSDhYWGjJORjo+Pi4iFhYOChIGBgYGBgoODg4KCgoKCgoKCgoGBgYCBgYCBgH9/gIGBgICAgH+AgIKCg4OChIOEhYWGhn+BfoCBgICAf4GDg39+fn9+fHx/g4OCg4KDgX59fn+AgIGAfn19fX1+fXx6enp/goKAf39/f35/gIB+fYB/f4CAgX+AgIGAf3+BgX99fX+AgX9/fn+AgH+AgICBf4CCgICCgYGCgYGAgYGBgYKEg4aPkpCOj42Kh4eGg4OCgYGBgYGCg4ODgoKCgoKCgoOCgYGCgYGBgICAgH+AgICAgICAf39/gYKDhIGCgoOCg4SFgIF/fH19fn19foCAfn1+fXx9foKDg4KCgYF/fX1+foCAgH9+fX19fHt7e3p6eXqAgH9+f35+fnx+f35/gH9+f3+Af4CAf35+fn9/fn18fn+Af35+f3+Af39/f4B/f4B+f4CBf4B+f39/gH9/f4B/hZKSj46Pi4uHiYWEhIKCgYGBgYKDg4ODg4OCgoKDg4KAgYKBgYGAgICAf3+AgIB/gIF/f36BgYSEgYKBg4OCg4OBgH98fn5/fn6Af4B/foB9fX+BhIOCgYB/f359fn5/gICAfn19fX17e3x6enl5eXt/f35/f39+fX5/f4CAf35/f4CAgoB/fH5+f35+fXx/f4B/fn5/f4B/f39/foCAf36Af39+fn5/f35+f318fH2FkpKNjIuKiImIhIWEgoKCgYGBgoOCgoODgoODg4ODgYCBgYGBgYCAf39/f4CAgICAgH9/foCBhIOCgYGDhISDhICBgYCBgIGAgYKCg4GAgX+AgoODgYGBgYCAfn19fn5+f359fX19fXx8fHt6eXl5eX2Af4CBgYF/f4GAf4F/gICAgYGCgoB+gH5/fn5+foGBgoF/f39/gIB/f4B/gYB+f4CAfn9/fn+Af31+fX17fIaTkYyLioiHioiGhoSDgoGBgYGCg4ODg4OCg4OCgoKBgICBgYGAgH9/f39/gICAgICAgH9+fn+BgYGAgISGh4aHgoSDhYOBg4ODhYSEhISDgYOCg4KCgoGCgX9+fX19fn6AfX19fX19fX18e3p6eXl5eYCCgoOFg4CBg4GAgoCBgYGDgoKDgYGCf4GAf4CBg4GEgoCAgYCBgYCAgYCCgn+BgIF/gIB/gICAfn9/fnx8ipOQiomIiIiJiIaGhoSCgoGBgoKDg4ODg4KDg4KCgYCAgIGBgYGAf39/f4CAgIB/gIGBf359fn5/f39+g4aHh4iChoSFhISFhIWGhYaGhoWFhoGAg4ODgoKAfX19fX19fn59fX19fX19fX18e3l5eXl4fIODhIWCgYSDgoKDhYaCg4SDgYKCg4OBg4KCgYKFg4iFgoGBgYKCgYGBgYSDgoOCgoKCgIGBgIF/gIGAf36Ok4yHiIeIh4aGhYaGhIKDgoGCgoODg4ODg4OCgYGBgH+AgYCBgYB/f39/gICAgH+AgYB/fn19fX5+f36Ag4SHiISGhoaFhoaHh4aGh4eHhoeHf32AgIGCgX59fX19fX19fX19fX18fH5+fnx7eXh3eHl5gIKDf4ONhIOEhISXl4ODhIF9foGCgoGCgYKBg4aIjIWDgoKBhIKEg4KDhYWEhYOCg4OCg4OCgoKCg4OCgpKQi4iIh4iHhoaEhoWEhISCgYKCg4ODg4ODgoGBgYCAgICBgIGBgH9/fn+AgYCAf4CBgH9/fn1/fn+Bf4CCgYWFhYaGh4eGh4eIhoeHh4aGiId/fH18fX9+fX19fX19fX19fX19fXx7iJKCe3x6fIZ5eHl8gYF+iZeEg4OEhJSTgIGBf39/fn6Ei4B/gICEhpCJhYSBgoGFhYuDgYKFhYaGhIOFhYOEhIODhIOEhISIko6LiYiIioeIh4WGhYSFhIKBgoKDg4ODg4OCgYGBgICAgIGAgIB/f39/f4CAgICAgIGBf39/f4CAgIGBgYGBg4OGh4aGh4aGiIeGhoaFhISGhX98fHx8fX18fH19fX19fX19fX18fH+RlZaDe3qElHx4eXp7fH+Cg4GBgIOCgH58fn57iJF8fI6Wf31/f4KGioWDg4SDgYONiX99f4OEhYWDhYaFhIWFg4SFhYaEhI6Rj4uKioyKiYqHhYaFg4OCgYKCgoKDhIODgoGBgICBgICAgYGAgIB/f3+AgIB/gICAgX5+f4GBgoKCg4SDgoOCgoWGhISFhYSGhIOEg4KBgYOBf319fHx9fXx8fH18fH18fX19fHx8e4uRl4x6e3yAenp6e3x5eX19foB/gH98e3t+fn2ClZF/hIh+fH5/goR8fIGChIKAf4eDfYKBf4KCgIODhISEhISChIOEhYKEkZGNi4yMjoqJiYaFhYODgoKBgoODgoKDg4KCgYGAgIGAgICAgICAgH+Af3+Af357gICBenyAgoKDhYOEhYWFhYODg4SCgYODgoOCgoGAgIB/gX5/fn59fHx8fHx8fHx8fHx8fHx9fHx8fn6Kgnt6e3p4ent7fH17fn1+f319fX18fH+BgX2Gj4F+fYJ+f36Agnx8gH+CgIGAfn17ioJ9gH9+gYCAgYKBgoCAgIGAf4uTj4uLjY6MiIeIhYWEhIOCgoKCg4OCgoODgYGBgICAgICAgH9+fXx7fHx9f3+AgHx6gYF4e4CCgYOFhIOFhIaGhISAhpSIgIGBgYGBgH9/f39/fn5+gHx8fHx8fHx8fHx8fHx9fHx8fHx8fHl7e3t4eHl7e3p8gX+Afn+BfH5+f399gIKCgICAgX+CkYF/f4CAfoB+fn9+gIGBfX19e319fX19fHx9gH+AgH6Afn6Ck5GLjIyNj4qFhoaFhISFg4ODgoODg4OCgoGBgYGAgICBgICAgICAf39/fXt6fICAgHh+gXd7gIF/gYKCgoKDhoeGhn6IlYp+gYGAgIB/foB+f39/fn+Bfnx7e3x8fHx8fHx8fH59fHt9fHx8e3x8fHp6eXt8en2Fg4J/gYF+f35/gH6FgoF+gH9+foCFhoKAfn6Dh399fH6AgIGAf39+fX19fX57fH1/f3+AfX9+gIyRjYuNjo2Nh4SGhoWEhIODg4OCg4ODg4KBgYGBgICBgYGAgYGBgYGAgH9/f397en9/e3mAd3p/f31+f3+Af4KEhoaFf3+FgX5/gIB/gH5+f31/gIB/gIB/f319fHx9fn18fX19fX19fH58fXx7fXx8ent6fH19f4aEgoCAgX1+fX5/foyEgYZ+fXx8f36CgX99fX19gHx7fXx+gYSDgYB+fn5+fX1/f399foB+fn6EkoyMi46Ni4qGhIaEhIODg4OCg4KDgoOCgYGBgYGAgYGBgYB/fXx8fH1+f39/f397e399d352eH59fH18fX5+gYGCg4B7fn18fn6AgH6Af35/fn+AgH+AgH9/fn9+fn5+fn1+fn99fH59fn19fHt8fHx7fHp9fn+Ag4OCf35/fH18fXx9gYN+jH58e3t9fn1+fn17e3t9e3p7e3uAhoSChIOCf4B+f4KCgn9/goJ/gIqPjIqKjIuKiISEhIOEg4ODgoKCgoKCgoKBgYGAgoGBgYKCf3+AgIB/fn18fH5/fn55fX52e3Z4fXx8fHt9fX6BgICAf35/f31+f39/foB/f39/f3+AgIGBgH99gH9/fn9+fn9/f3yCfn59fX17e319fHp8fH6AgoF/gIB8fH18fHx8fH18fXt/fnt7e3x8fH18e3t7e3x8enp9en6CfoGDhIKBgoGFhoWFhoaHhoKEkI6MiomKhoeFgoOEhISEg4KCgYGCgoKBgoGBgYGBgoGBgoKAgYKBgYCAgH9+e3x+fnx6fnh5dnd8fHx7e318f4GAf35/foB/f35/fn5/gH9/f39/f3+AgoKAfn6BgIB/f39/f39+fYN8fH19fH99fX19e3x+fn9+fn1/fnx8fHx8fHx+fnt8e3x8fHx9fH18fnx9fHx7e3x5e3x7e317fX5+f4CAg4eJiYmKiYuJhYiQjYuIiIaFhYOCgoOEhIODgoKBgYGBgYKBgYGBgYKCgoGCgoCAgX98e3p6eXt9enx+fnl8eXh4dHx8fHt8fHx+gX9/f39/gIB/fn5+fX+AgH9/f3+Af4CDg4B/gIGAgIB/f4CAgH58enx9fX59fX5+jIZ9fX57e4OCfX19fX18fXx9fX1+fH17fXx9fX58fn19fX18e3t6fHt8fHt6e3t6enp7fn6ChYiHiIuLi4qJjJCNjImHhoWEg4KCgoODg4OBgYGBgYGBgYGBgYGCgoOCgYKBgIGBf3+Af356eHl5en5+e3l6eH5zfHx8e3x8fH5+fn9/gH+AgIB/fn9+gIF/f4CAgIGAgoSDgYCAgYGAgX+AgYGBf39+f31+gH57foGRjHx9f4qAjYx+fn19fX59fX59fHx8fX18fXx9fX1+fX1+fnx7e3t8fH18e3p7fHl6eXh5e35/hIOEiImKiImNj4yKh4iFhISDgYKCgoKDgoGCgoKBgYGCgYKCgoGCgoKBgoKAgYGAfoCAf39+e3p5e319eXx6f3KBfXt7fHx8fn59fYGCf4GBgX9/gH+AgX9/gIGCgYGFg4SCgYGCgYKCgICBg4KAf4F/fX6Afnx/f4iCf36DkISEg4F/fn18jYd9fX59fHx/fnx9fXx9fX1+fX5/fX19e3x9fnx8e3x9enp5eXp5e3t+foGBg4eEiI2MiomFhYSEg4KCgoKCgoKBgYGCgoKBgoKCgoKCgoKCgoGCgn+AgIB+f39/fn5/ent5fX16enp9cX6Cent8fX19fXp4foKAgYKCgICBgIGBgICBgoKCgoaFhIGBgYGBg4F/gIKEgX9+gYB9foF+fX9/gIB9fn+EgH5+f31+fX2KhX1+f31+foB/fX19fH5+fn99f4B9fX18fX9/fHx7fH17e3t6enp7e3x9fn2Ag3+IjImKh4WFhYSDgoKCgoKCgYGBgoKBgoKCgoKCgoGBgoKBgYKCf4CAgH9/f39+fn59eXp6fXx5d3t0e4d8dHd9fn17e3Z2foCBg4KBgYKCgoKBgYGDg4OChYaEgoCAgICCgX+AgYSBfn6AgH1+gH59fn6AgH+Bfn+Af39/gH99fn9/f3+Afn9/gH58fX18fn5+foF/gH2CgHx9gIF9fHx9fXx8e3x8e3t7fHt8fHx9fIiJh4eFhoWFhISDgYKBg4KAgIGCg4KCgoOCgoKCgoGCgoGBg4J/gIGAf39/fn5+fn57enp8fHt2e3R3f352cnt+fnt4dXd8gIGCgoKBgoODg4OCgoSDhIOFhoOCgX9/gIOAgICAg4F+foCAfX+AfX1+foCAf4J/gYGAgICBf31/f3+AgIGAgIB/fnx9fX19fn59g32AfoKAfX6BgX98fn59fX17fH58fXx8fHt8e3x9iIaGhIWHhYSFhIKBgoGDgYCAgoKDgoKCg4ODg4KBgYGBgYGCgH6AgYB/fn5+fn5+fn56e3p9goN9dXF6fHpxen19eXh0dICAgoKCg4KDhYOEg4KDhISEhIWEgYGAgH6Agn9+f36Bf35/f4B9foB9fX1+gH9/gYCCgYCAgIKBfX6Af4GAf4CAgH9+fX19fn1+fn19gYR/gH9+f4GBf32Af319fn1+fn1+fHt8enx7eoCFgoOEhYSEhIWDgoKBgYKBgICCgoOCgoOEg4SDg4KCgYKBgYOAf4CBf35+fn5+fX5+fnt7en6Jh354cnl9f3F6eHt4eXR1fYKDgoODg4OFhIWEg4OEhIODhIKBgH+Af4CBfn19foB+fn5/gH19f3x9fX6Af4CAgIKAgIGAg4F/f4B+gIF+gIGAgH9+fn5+fn1/fn6FhYCBgH+Ag4F/foGAf36AfoB/fn17ent6fHt6goN/goKCgoOCg4KBgYCAgoGAgIKBg4KBg4SDhIKEgoGBgoGCgoB+gIF/fn1+fn5+fX59fXp7fIWEe3tyeXt8cHd1dnd5dnR6hISBhISDhIWFhoSDg4WEgoODgoCBf4B/f4B9fX1+f31+f39/fn1+fH19foF/gIB/gIB/gIGDgoGAf36AgH+AgYCBgH9/f39/f4CAgIGCgoKBf4GEgX+Ag4F/f4B/gX+Af3x7e3p8e3yBgH+Bf3+BgYGCgYF/f3+BgH6BgoKDgYGDg4KEgoSCgYGBgIGCgH6AgH9/fX5+fX19fn19e3t6gH94fHZ5enxxdHh3dnh1cnmFhYKEhIKEhYWGhISChIOBg4KAgIF+f4B/gHx9fX6AfX5/f39+fX98fn5+gX+BgH9+f4B/gIODg4B/f4GBgIKBgYGAgIGAgICAgIGAgYKDgYF/gISBfYGDhICAgX+BgYKBfXp7e3x8fX99f4B8f39+fYGAgH59fYB/foGBgYKBgIKCgoKBg4KCgYB/gYKAfn9/fn99fX1+fX19fX19ent7fHZ9eXh6enJ1eXl2d3dzdYaFg4WFgoSEhYSEhIKDgoGDgX+AgX5/gH6AfX19fn9+f4B+fn59f3x/f3+BgIF/f3x+gH6AgYKDgYCAgoOEgoGAgYB/gYCAgYGAgYGCg4KBgX9/g4B+goKEgICCgYKChIJ+e3t8fHx9fX1+fXp+fX55fn9/fHx8fn1+gYCBgYGAgoGBgYGDgoGBf4CAgoB9fn19f319fX59fH19fX16e3p8dnx6d3t4cnZ5e3Z2dnN0hoSEhYSChISFhIOCgYOBgYOBgIGBfX+BfoF9fX1/f39/gH5+fn19fYB/gIGBgX9+fH6Afn9/gYJ/gYGCg4eFgYB/fn6Af4CBgICAgIGCgYCAfoCCf3+BgoKBgYOCg4OFgn99fX18e3x8eXp7en55fHl4f357e3t+fX1/f4F/gH6BgICAgoOCgYF/gIGBf31+fH1+fX19fX18fn58fXx5e3x4enx3endzeHd6c3d2c3SGhISFg4KDhISDg4KCg4GCgoGAgYF8gIB+gH1+fX5/gICAf35/f3x+f3+BgIGAf359f39+fn+BgH2AgIGDhIN/f359fn5+f4B/gIB/gYKBgH9+gIF+f4CCgoCBhIKEhYaDgH59fHx8fHp5dnl5enl2eXZ+fHt7e359e399gH99fX9/f3+BgoGBgX5/gYF+fX18fX19fX19fXx+jYF8fXl7e3p5fHd4eHR1dXhyd3d0doaEhIWDg4ODgoOCgYKDgoGDgn+BgH9/fn+AfX19fH+AgIB/f39/fIB/f4GAgYCAf32Af35+fn9/fX5+gYKCgn5/fn1+fn5+f3+Af32AgYB+fn5/gX5+gIKBf4GDgoOEh4SAgH58fXx8e3x1eXl4eHh5d3t8e3p7foZ9fn1/ent+fn59foGAgIGAfX6BgH59fXx9fX19fX18e32Dgnx8ent7e3p7d3Z4dXJzdnF4eXJ4hYWFhYOEhIKCg4KBgYKBgIOBgIB/fn5+foB+fX58f4CAgH+AgX97gH6AgH+BgIB/fYB/fn5/f319fX6AgYKBfn9+fn59fX1/fn9+fH6Af35+fn+Cfn6AgIF/gYOCg4OGhICBfnx9fHx7fHh3e3h1eXd3eXx6e3t9kod9fH13en1+fn19f35+gH98foB/fn19fH19fX19fXt8ent9enp4e3x6ent4dHh1cXJ0cHh4cXmEhYWFg4SDgoODgoGBgoKAgoCAgIB9fn5/gH18fn1/gIGAf3+BgHyAf4B+f4GAf399gH9+f39+fX18gICAgIB+f35+fn18fn9/f358fYB/fn1+gIJ/foCAf36Bg4KChIWFgoJ+fX17e3x8end7eXd4d3d4e3t6e3yFin17end6fH19fHx9fX1/fnx9fn59fXx8fX5+fX18fHt6enx7e3p5enp7enhzd3VxcXNweHdxe4WGhYWDhYKBg4OBgYGBgoCBgICBgH5/fn9/fXx+fYCAgoGAf4GAfX6Af35/gX+Af3+BgH+Af31+fH1/gICAgH9/f39+fXx+f39/f319f399fn6CgYF/gIB/foGDgoKEg4SCgn5+fHx6fHt7eXt6d3N2d3h5e3p7eXp/fnt7d3p8fXx8fH59fH19fH19fXx8fX19fX99fXx9e3l7fHx8enp6enp6eHN2dXBwcm93dnJ7hYeEhYOEgoGDgoKCgYGCgYKBgYGAf4B/f399fX9+f4CBgYF/goF9foF+fn+Af4B/gIKAgIB+fX58f3+BgYCAf4B/f4B+fX5+f4B/f39/gH9/f4J/gH9/gIB/gYGAgISBgoKAf39+f3x9fn56fYR9dHx9enp6enx5eXp6hoV3eXx8fHx8fXx8fHx8fX19fHx9fX19fn19fX16eX18fH16enp6enp5c3V1b29xb3d0c3yFhoOEgoOCgYKBgoKCgYKBgoGBgYCAgICAgH59gH+Af4GCgn+Cgn+AgX5/gYB/gICAgn+Bf319f35/f4KAgICAgIB/gIB+fn1/gH9/f4B/f39/gH+AgICAgH+AgYGBgYGCgYCAf39/fn1/fnqBkot6fH18e315e3p6eHmBgXh5e3x8fXx8fHx8fHx9fX18fH18fn1+fn59fHp8fHt8fXt5enp6eXlzdXVvb3Fwd3N0fYWHg4OCg4KAgYCCgoGAgYGBgYKBgYCAgIGAfn6Af4GAgYKCgIKCgICCfoCBgX9/gX+BgIF/fH6Af3+Agn+AgICAf3+AgH9/fX6Afn2AgH9/f3+AgICAgYCAf4CAgYCBgYKCgICAf39/fX5/fIGGiHx8fnt7fnl6e3p7jX53d3l7fHt9fHx8fHt9fH18fX18fXx+fn5/f358enx9e319e3l6e3p5eHN0dW5zcXB4cnV6hYaDg4KDgoCAgIGCgX+CgYKBgoGBgYKAgYF/fn9/gYGCgYKBg4OAgYJ/gYGBf4CAgIB/gX99f4F/gICBgICAf4B+gICAf359f4B+fn+Af39/gH9/gICBf4CBgH+BgIGCgoKAgICAgIB9foB9gIOCe35+e3x9e3p8fHuHeXh4eXx8fH17fHx9fX18fH19fn19fX5+f3+Af317fH18fHx7enl7e3l5c3J1bnZycHhxdXaFhYOEg4KCgICAgoF/gIKCgoKDgYGDgoCCgYB/gICCgoKBg4GEhICBgX6BgoF/gICAgH+Cf36AgYCCgICAgIB/gH+AgIB/fn2Af35/f4CAgH+AgH+AgYGAgICAgIGAgYGBgoGAgYCAgH9/gH5/fX59fn57fXx9fHx8d3h1eHh5e3x8fXt8fHx8fX5/f39/fn19foB/gIGAf3x9fHx9e3p7eXp8eHpzcnVud3FxenF2d4WFg4SDg4KBgYODgH+CgYWDg4SBgYOBgoKBgYCAgIKDgoCCgoWDf4CAfoKDgYCBgICAf4CAf4GBgIKAf4CCgH9+gICAgICAf4CAgH+AgICAgIB/f4CBgYCAgICAgYGAgoKCgoCCgYGCgYB/f4B/gId+fnx6fXx7fX54d3Z5eXl8fXx8fHt8fH19fn5/gIGAfn1+gICAgoGAfH59fX58d3t6ent5eXNxdW53cHV6cXZ5hYWCg4KDg4KDhISAgIKBhoODg4GChICEg4KCgICCgoSBgYKChIJ/gIB/gYOCgYCBgYCAf4GBgYGAg4F+gIOCf31/goGAgIB+gYCBf4CAgYGBgYCAgIKBgYKBgYCBgYGBgoOCgoOBg4OCgYCBgH+AhH19fXx/fXp9gHp5dnp4eXt7fH19e3x9fX19fn+AgYGAgH+AgICDg4B9f35+fn15eXt6enp5c3J1b3dxd3lzd3uFgoKDgoOEgoOEg4CAgoOGg4ODgoKEgYSDgYKAgIKBg4GCgoGCgX6BgICCgYKCgYKBgIGAgICBgoGEgH6Bg4J/foCDgoCBfoCCg4KAgYGBg4KDgoGBg4KChIGAgYOBgYKEg4OEhIODhIODgoGBgYCCf4B/fYB8enx/e3t3fHl5eXt6fX59fHx8fH1+fn+BgYCAgIGBgYOEgH2Af39/f357e3t6e3p0cHhyeXR2eHR3e4SCg4KDg4SChIODgYKChIaEgoODg4SBhISAg4CBg4KCgoKCgIKAfoGAgIKBgoGCgoKBgIGBgYOCgoOAfoGDgX9/gYSEgYN/goKBg4KCgoGEg4OEgYKEgoOCgoGCgoOBg4SDhISEhISFg4SCgYOCgoOBgYGAgH58fIB8fHh8eXp5enx9f3x7fHx9fX18fICAgICAgYGBgYKBfoGAgICAf3t7fHp6enVweHd5dnV8dXZ8gICDgoODg4OEhISAgoKFhISDg4KDhIGEhYKCgYKDg4GCgoKAgYB9gICBgYKDgoKCgoGAgYKCg4KCg4B/gYKBgICChIODgoGCgoGDgoKDg4ODg4SAgoSDg4OBgX+Bg4KDhYKEhISEhISDhISChIOEhIKBgoGBgHt+gX59eXx6enp9fHyBfXp8fH19fHp7fn5+gH9/gYGAgICAgIGBgIB/fX18fH18dnJ2eHh2dH92dH2Hh4OChIWDg4SFhICChIWEhIOCg4SEgISFg4KCgoODgoOCgoCCgH2AgIGCg4KCgoKEgoGCgoOEgoKBgICBgoGAgYOFhIOCg4CCgoOCg4ODg4OEg4CCg4KEg4KCfoOBgoSEgoODhISEhIOEhIOEg4WEg4ODgoKAe4CBf3x8fXp6e31/fX9/fHx6fH59fX19fn5/f39/gICAgH9+foCBgICAfnx9fX5/fn18e3h2f3V2f4SHg4KDhYODhIaEgYKFhoWEhIODhISChIWFgoKDg4SCg4KDgoOBfoCAgoKDgoODg4SCgYKCg4OCg4GCgYGDgX+BhISDg4KEf4KEg4ODgoSDg4SCgIOEg4SDg4KCg4KChIOCg4SEhISEhIWEg4OEhYSEhIOBgoB9gYKAfXx8e3x8gH19foB+fn1/fnx8fX19fn5/fn+BgYGBgH99fX6BgYB+fn19fX59fX5+f3+AfHyBgYKCg4OGg4SDhoSBgoiHhYSDg4SEhYKEhYWDg4SDhIODgoOCg4F+gYGDg4SCg4OEhIOCg4KEg4ODgoKDgoOBf4GDg4ODgoOAgoWDg4ODhIODhIOBgoSEhYOCgoODg4GEg4GDg4SEhISFhYSEhIWFhYWEg4ODf32BhH99fXx8fHx/gX59fn9/fX99e3x9fX19fX5+f4CBgIGBgH59fH6Cf39+fn5+fX1/f39/gICAf4CEhIODhIWDhIOFf36CiouFhISDgoOFgYaGhoOEhISEhIODg4OEgn+BgYODhYSFhIWEg4KEhISFhIODgoSDhYGBg4SFhYaEgoCDh4SDg4OFhIWFhIGEg4OHgoOCg4GCgYSDgoODhYODhYWEhYWHh4aHhYSEhYSBf4GDf35+fH59fX+BgH9+fHx+f358enx9fX19fX5+fn9/gIGBf319fIB/gH5+fn5+f3+AgYGBgYKAgYWFhIOFhIKEg4aAgoWFiomEhIOEhYWDh4aGhISEhIWEhYSEg4SEgYKDg4OEhIaEhYSDg4SEg3yDhHuBhHd5g4F9hH5+cnWDgoF2foOEgX2BdYF6g39/gH6EhIKDg4KBg4SDg4SFg4SFhoSFhn2EeXx+f4N7hYOAhIOBf359fn19goOBfXt/fX6Afn17fHx9fX19fH19f4B/gYJ/fX18f4GBgICAgH+BgYGCgYKDg4KChoSEhIaEgYOEhYOEhoSKiIWFhYOFhYSGhoaDhISFhYWEhYWEhIWCgoOEhYWFhoSFhIOEhYWCaICFanx7cXF8gXOGc3R0fYKEdXNxg4Z0cHVyc3SDdnt9dYF/goOBgnZ5hYCDgIR/hYSChYWCaHpyc3N8gHOCg3+Dg32BfX1+fX6Cg4F8f4F9f4B9fXx8fHx9fHx8fn1+gH+BgX99fX2AgYKBgYGBgIGBgYKBgoKCgoSHhIWEhYSBgoSGhoOFg4aIhoaFg4aGh4eGh4OFhYaFg4KFhoSFhYODg4SEhoaGhIaEg4SFhn1xe4FweXZ+g3+CbnlwdXN8dnp5hXKEg3B2eHF2dHR1cnN0dml/gG5yb3R2bnVsd217c26AiHltfXJzdnN2bW14bHB5bHV9f359foGAgX2Afn2Af4B/fX18fH19fH1+f32Af4CAfnx/foCBgoCBgICAgYCAgIKDgoOEhYiGhoCChYODhIeGg4WFhYaHh4SDhoeIiYaHhIWGiIeEg4WGhYWEhIOFhIKFhoaFhoWEhoWHdnB0e3BydX+HhYNtdW92b3x1coR5eYd4cXR3bndod3pucHaCcoN+b3p5eW1vbnpvb213fXiGcHF6cHJ0ZoF1fm57eXNveX+Af319gYB/fH99fIF+gIB+foCAgYB+fn9/foF/gH9+fYB9f4CBf4B+fn+BgH9/goOCgoSFh4eEfoeEg4OFh4aEhoWFhoaIhISGh4iIhoeFhoaLioWEhoeHhYSFhYWEgoWFhYWGhYWGhYZxdXByc29zenl+g3SIdHV+iHZugnKEhnluanJ/cW1zd3x/dXR8hH54cXV3bnl1enF2eHV6eYRxam95eHBreXN6b3p3dnZwgYB/fn5/f356fn19f31/f359gIGDg4CCg4GBhIGBgIGBgH1/f4F+gH59foGAfn6BgoCAgYSHhoODhoSEhYaHhoWFhYWGhoiFhIaFh4aFhoSGhomIhYSJioiFhIaGhYWDhYWEhYaGhoaFg3iLeXKIentwcIWFeIV4eWtzfnl7a3KDh4N6fG17eXl0fYB2bm+AgG90fHV3cXl9fW1+dW+DhYZ6gHJye3x0cG96bHN8bneCgIF+fn99fXt9e3x9fX9/fn1/f4KCf4GDgYGDgYB/gICAfn9+f31/fn1/gH58fYGAfn6Ag4iFhoOFhYWFhoeFhYWFhYeHiIaEhoWGhoaFhIWFhYWFhomJh4WEhoWGhoWGhoSGhoeGhoWGh4eHhoaEhoWGh4iHhYeGhoOGhoWFg4SGhoWGhIaEg4SEhoSEgYSDhISFhIWEhYSGg4aHhYaEhIWHhoSEhYWEhX13hYSEhIOCgX1/fnt8e357fHx9f359fH5+gIB9f4F/f4GAfn5+gH5+f35+fX99fX5/fHt8f358fH+BiYaFhIaGhoWHh4WFhYWGhoeIhoSGhYaGhYWDhYWGhYSGhoaGhYWGhIWGhoaGhYaGh4eGhYeIiIiIhoSHhYaHiIaFiIeIhYeGhoiFhYaHhYaGhYSDhYWGhYWDhISEhIWEhYWEhYWEhoeGhoWEhoeGhISFhoOFhIKEg4OFg4OCfYB/e3t8fXt8fH1/fnx8fn2Af31+gH5+gH99fXyAfX5+fn5+fnx8fX57fHx/fHt7fn+Ih4SEiIaGhoeGhYWEhoaGhoiHhIWGh4aFhIODhIaFhIeFhYaFhYaEhYaGh4eFh4aJiIaGiIeIiYiFhIiFhoeHh4aIhoeFh4eGh4WFhoeFh4aFgoOFhoaEhIOEhIOEhoSFhYWGhoSGhoWGhYSGhoWEg4WFgoWHhYOCgoWDhIF+gIB8e31+e3x7fX59fHx+fX5+fH9+fX1+fn19fH98fn58fYGAfHx8fXx8fH56e3t9foiHgoWIh4eGhoaGhISGhoeGiIaDhYSHhoSFh4OEhYSFh4SFhoaFhoSGhoeHhoaIh4mIhoaIh4iKiIWHiIWHh4aHhoeGh4WIiIeHhYaGh4WHh4WBhISFhoWFhISEg4SFhYaGhoWGhIeGhoeFhYaGhYSDhIOChIeDhIGChISDgYCAgHt7fn58fHx9fXx8fH19fH18fn18fX18fHx9fXx+fXt8gX99fH18fnx8fHp6fHx9iIeChoiHhoeGhoaEhYaFhoaGhYOFhIaFhIiJg4GEg4SGhIaGhoaGhIeHiIiHh4eIioiGh4iHiImIhYiHhYeGhYeHh4WHhoiIh4eFh4eHhYaHhIKEg4SGhYeFhYSDhISFhoaGhoaGh4aGiIWGhYaFhIKDgoODh4GDgIKDg4KCgn+Ae31+fnt8fH59fH19fH17fHx8fHx8fXt7e318e358e3x/fX18fX1/fXx6ent7fHyIh4KGhoaGh4aGhYSFhoWFhYWEg4WChoSDiId/enqChYaEhoaFh4aEh4eJiIiHhoiKh4aHh4eIiYeFiIeGiIeGhoeHhYeGiIiHhoWHhoeGhoeDg4SEg4aGh4WFhISEhYaGhoaGhYeHh4eIhoaEhoWDg4KCgoOGgYN+goKDgIODf398f35+fHx9f318fX18fXp7e3p7fHx8e3t7fnt7fXt7e358fHx8fX5/fXt6fHp8fYmHg4aFhoWGhoWFhIWFhYWFhIOBhYGGhIKEhHyAhn+ChYWGhYWGhYSHh4iIiIaFiYqHhYeGh4eIh4WIhYaHiIaGh4eGh4aIiIeFhoeGh4WFh4OEhoWEhoaHhoWFg4WFhoaGhoeFh4aHh4eHhYSFhYOBgoGAg4WCg36BgYF/g4F+f35/fn98fH1/fXt9fXx9enp7eXt8fXt7e3t+fHx8fHp7fXx8fHx+fYF8e3t7e3x7iYeEhoSGhIaGhYSFhYWEhIOEgoCDgYWCgYJ/eoSMe4CEhYeGhoaFhIeIh4aHhYWHioeEh4WHhoiGhYeEhoeJhoaIiIeHhoeIhoSGhoaHhoWHg4SFhIaGhoeFhYSDhYWHhYeGh4WGhoeGhoaEg4SFgYCBgYCDg4OCfYGBgH6DgX5/f4B8f3x9fX59e359fH15enp5e319enp7e318fXx8ent9fHx9fH5+gHx7e3x+fXyIh4WGhYaEhoWFhYWFhYODgYOBgIGBhYKAgH9/fXx7gYSFhoaEhYSDh4eGhoaFhIaJhoKGhIaGhoWFh4WHiImGhYiHiYeGhoeFhIaFhYaFhIeDhIWEiIaGh4WFhIKGhYaFh4aHhIaGhoWFhoODg4SAf4GAgISAg4B8gYB+foKAfYB/gXx/fH1+fX57fn18fHl6enl6fX15enp7fHt8e3t6e319fH18fn5+fHt7fX59fIiGhYaGhoSFhYSFhYSDgoKAgoGAgICDgX5+foB5en2Ag4OFh4WEg4OHhoOEhYSChYiFgoSDg4WFhYWHh4aIiIWFiIeJh4aFhoWDhoSFh4OEhoSEhYSHhoWGhYaEg4aFhoaGhoaEhYaHhYWGgoKDg39+gICAgX+DgHuBf31+gn5+gH6Afn99fX59f3t/fXt6eXp6eXp8fXl6ent7enx7e3t7fH19fXx/fn18fH1/fnx7iIWFhoaGhoSFhIWDhYKBgICAgYB+gIKCfX1/f3t/f4KDg4WGhYSDg4aDgYOEgoCFh4WCg4GBg4SEhIWGh4iHhYWIhomHhYOEhIKFg4SGgoOFhYWGhIeGhYWFhoOEhYSFhoWGhIOFhYaDhYWBgYODf35/gH9+f4N/e4B9fX+CfYCBfn6Bfn19fX1/e398e3p5enp5enp8eXp6ent7fHp7e3t8fX59fYF9fXx8fYB/fXyGg4aGhoaFg4SDhYKFgYGAf3+AgH5/gIF8fn9/foCAgoKChIWDgoGChIGAg4KBgISFhYKBf4CCg4OEhYaIhoWEhYeFh4WFgoOCgYOCgoWBg4WEhYaEhoaHhoaFgoSEg4SGhYWDhISDhIOFhICAgoJ/fX1/fn6AhH57f3x8gIF9gYB9fYN8fn59fX57fnt7enl6enl6ent5enp6e3t8ent8e3t9fn1/gXx9fHx9f4B+gIaEhYWEh4SDg4KGgoOAgYB+fn+AfX9/gXx9f39+fn6BgYKEg4KBgYKCf4CBgoCAgoWEgoB/gIGCgYOFhYeGhISGhoSFg4WBgoGBgoGCg4GChISEhYWGh4eGhYSDg4ODhIaFhIGDgoOChIODgH+AgX59fH5+fH+DfXx+fHyBgH6Cf31/gnx/fn18fHx8e3t6enp6eXt6enp6enp6e3x5e318fH5/f4GAfX59fX1/gICAhoSEhYSFgoOCgoSCgoCBgH59fn9+fn6AfX2Af35+foGBgoODgoSHgYF+gICBf3+ChIOBf35/gIJ/goWEhoSDg4WFgoSBg4CBgIGBgYKBgIGEg4OGhYWHh4WEhYWCgoKDhYSCgYGBgoCFg4F/foB/fnx8fn18foN9e358fYF/gIN+fYCBf35/fXx8fH17e3p6enl5e3l6enl6ent7e3p7fXx8f3+BgoB+gH+AgH+AgYDKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzNzc3Nzc3Nzc3NzczMzMvLy8vLy8vLy8vLy8vLzMvLy8vLy8vLy8vLy8vMzMzMzM3Nzc7Oz8/Pz9DQ0NHR0dLS0tLS0tLT09PT0tLS0tLS0tPT09TU1NTU09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tLS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1dXV1NTU1NTT09PT09PT09PT09TU09PU1NTU1NTU1NTU09PT09PS0tLS0tPT09TU1NTU1NPT09LS0tLS0tLR0dHR0dPHhnNlYFtLWWdVTUZIQD03Nzg5Nzw8PDo8Oz42Oj04PDs6OTg3ODs7Oj87PTs8PD47P0E/QkJBQ0RFREE+PTw7QENDQUBDQ0FBR0hHSUtSwtXS09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXVysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMy8vLy8vLy8vLy8vLzMzMy8vLy8vLy8vLy8vLzMzMzc3Nzc3Oz8/P0NDQ0NHR0tLS0tLS09PT09PT09PT09PS09PT09TU1NTU1NTU09PT09PT09PT09PT09PT1NTU1NTU1NTT09PT09LS0tLS0tLT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1NTU1NPT09PT09PT09PU1NPT09TU1NTU1NTU1NPT09PS0tLS0tPT09PU1NTU1NTU09PT09PS0tLS0tLR0dHSzIxyZ2BcTVllUktHSz87Mzc4Ozg5Pj05PDpBOjs9Nzo8PDo6Nzg6Oz0/Oz88PTw/Pj9BPUFBPkNDREJAQT46Oz9DREFDRERCQklHSEhJTr7V0tPT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1crKy8vKysrKysrKy8vLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzMzMzMzMy8vLy8vMzMzMzMzMzMzLy8zMzMzLy8vLzMzMzc3Nzc3Ozs/P0NDQ0NDR0dLS0tLS09PT09PT09PU09PT09PT09TU1NXV1dTU1NTT09PU1NPT09PT09PT1NTU1NTU1NTU1NPT09PS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1tbV1dXV1dTU1NTT09PT09PT09PU1NTU09TU1NTU1NTU1NTT09PT0tLS0tLT09PU1NTU1NTU1NTU09PT09PT0tLS0tHR0s+Sd2hfXk9XZ01LRkw9ODc2NTk5OTw+OT88RDk7PDg6PD07OTc5Ojw9QDs+PT47PD48PT5BQD5EQ0NDP0E9Ojs9QkNFQ0NEQT9FSEpJSky61dPT09TU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8rKysvLy8vLy8vLy8zLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMzMzMzMzMzMzMzMzMzczMzMzMzMzMzMzMzMzMzc3Nzc3Ozs/Pz9DQ0NDQ0dHS0tPT09PT09PT09TU1NTT1NTU1NTU1NTV1dXU1NTU1NPU1NTU09PT09TU1NTU1dTU1NTV1dTU09PT09LS0tLS0tLS09PT09TU1dXV1dbW1dXV1dXV1tbW1tXV1dXV1NTU1NTT09PT09PT1NTU1NTU1NTU1NTU1NTU09PT09LS0tLT09PU1NTU1dXV1dTU1NTT09PT09PT0tLS0dHRmn5nYWJOVWpKSElLPzw6OTM3Njc3PTs+OT06Ojo4OTo7Ozg4Ojs7PD46PT09Ojw/PD0/QkA/Q0RDRD5APT08QENEQ0JEQkQ+REhJSUtMttfT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3MzMzMzMzMzMzMzMzNzc3NzczMzMzMzMzMzMzMzc3Nzc3Ozs7Pz8/Q0NDQ0NHS0tLT09PT09PT1NTU1NTU1NTU1NTU1NTV1dXV1NTU1NPT1NTU1NTU1NTU1NTU1dXV1NXV1dXV1NTU09PT09PS0tLT09PT09PU1NXV1dbW1tXV1dbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1NTU1NTU1NXU1NTU1NTT09PT09PT09PU1NTU1dXV1dXV1dTU1NTU09PT09PS0tLR0p+DaV9kU1hsSEhIS0A9Nzg0NzY6Oj87RDw8OTw8OTc6OTs6Ojs8Ojo7OT49Pjk9QDs/QUFCP0JCQUM9Pz8+PEBCRUNDQkBBO0ZJR01MSbLY09TU1NTU1NXV1dXV1dXV1dXW1tbW1tbV1dXW1svLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzM3Nzc3Nzc3Nzc3Ozc3NzczMzMzMzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc3Mzc3Nzs7Ozs7Pz8/P0NDQ0NHS0tLS09PT09PT09TU1NTU1NTU1NTU1NTV1NXV1dTU1NTU1NTU1NTU1NTV1NTU1dXV1dXV1dXV1dTU1NTU1NPT09PT09PT09PU1NXV1dbW1tbW1tbW1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTV1NTU1NXV1dXU1NTU1NTT09PT09PT1NTU1dXV1dXV1dXU1NTU1NTT09PT09LS0tSjiGxfZlJWakdIR0lBPjM2Njo7PDhDPEJBPjxBPDg5Ojw6Ojw8PDk8PTo7PD09PD89QD9AQT9AQUBCPD4+PzxCQ0NDRkBBQT1ISklOTUeu2NPU1NTV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbMzMvLy8vLy8vLy8vLy8vLy8vMzMzNzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzs7Ozs7Oz8/P0NDQ0NHR0dLS0tPT09PT09TU1NTU1NTU1NTU1NTU1NTV1dXV1dTU1NTU1NTU1NTU1dXV1dXV1NXV1dXV1dXU1NTU1NTU09PT09TU1NTU1NXV1dbW1tbW1tbW1tbW1tbX19bW1tXV1dXV1dXV1dXV1dTU1NTU1dXV1dXV1dXU1NTU1NTU09PT09PT1NTU1NXV1dXV1dXV1dXV1NTU1NPT09PT0tLWroprY2VSWGhMSkdJQjg0OTQ6Ozo5QDk/Q0VAPDw5OTk9Oj07PDw6PTw7OTw9Ozs/PUA9PT5AQD9CQT5APD05QERDQkFBQj48SEpLTU5IqNnU1NXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbWzMzR09PT09PT09PT09PT087Ky8vLzMzMzMzMzMzMzM3Nzc3Nzc7Ozs3Nzc3Nzc/Pz8/Pz8/Pz8/Pz9DQ0dHR0dHR0dHR0dHS0tHV2djY2NnZ2dra2tvb29vZ2dnZ2dna2tra2tra2trZ2dnZ2dnZ2tra2trZ2drb29vb29vb2tvc29zb2dfX19fX19fX1tbW1tbX2tra2tra2tra2trb3NzX1dXV1dXV1dXV1dXW1tbX1tbW1tbV1dXV1dXV1dXV1dTU1dXV1dXV1dXU1NTU1NTU1NTU09PU1NTU1NXV1dXW1dXV1dXV1dTU1NTT09PT09PS1bqKa2hoUlhlSUlMT0A5OTo0O0E8Nz05QUM+QD89ODo6Ozk9Oz4/Ojs8PDo7PDo7Pj1APT8/P0FAQUE/QTw8Oz5BRENBREA9PElJSk1ORqPa09TV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbW1szNhG1wcHBwcHBwcHBwcGqn493d3t7e3t7e3t7e3t3S0NDQ0NDQ0NDQ0NDQ0ci5ubm5ubm5ubm5ubq6t6WkpKSkpKSkpKSkpKSnhmBjY2NjY2NjY2NkZGRlhIuKioqKioqKioqKiomSmZiYmJiYmJiYmJiYmJeMi4qKioqKioqKioqKiKC/vL29vb29vb29vb2+tIqKioqKioqKioqKiouHvebh4uLi4uLi4uLj4+Pi2NfX1tbW1tbW1tbV1dXV1dXV1dXV1dbW1dXV1dXV1dTU1NTU1NTU1NTV1dXV1dXW1dXV1dXV1dXV1NTU1NTT09PT09XDkXFrak5TYkxMVk48Ojo3Nz5DPjg+Oj8/QTw/QDc7Ojs7PTs+Pjo7PD48Oz07PT8+QDw/Pz1AQEBBPj88PjxAQUVCQkZAQD9HSEpLT0ae2tXV1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19fMzk4mKysrKysrKysrKysiivTr6+rq6urq6urq6uvp1dLS0tLS0tLS0tLS0tTEqaqqqqqqqqqqqqqqq6aGhIWFhYWFhYWFhYWFik4MEhISEhISEhISEhIRE0pUU1NTU1NTU1NTU1NRYmxra2tra2tra2tra2tpVVNTU1NTU1NTU1NTU056r6qqqqqqqqqqqqqqrJtTUlNTU1NTU1NTU1NTS6ry6+vr6+vr6+vr6+vr6dnX19fX1tbW1tbW1tbW1dXV1dXV1dbW1tbV1dXV1dXV1dXV1dTU1NTV1dXV1dXW1tXV1dXV1dXV1dXU1NTU1NTU1NPUy5h2bGlKTl9NUlVNPjw8NztAQz42Ojc9Pzs9Qj85PDk9Ozw6PD07PTs9Ozs9PD0+PT07QT08QUBBQT08Pzw7QEJDQURFPUFAQ0ZLS09GmNzV1dXV1dbW1tbW1tbW1tbW1tfX19fX19fX19fXzc5SKzExMTExMTExMTExJ43z6enp6enp6enq6unq6dXS0tLS0tLS0tLS0tLUxaqrq6urq6urq6urq6yoiIeHh4eHh4eHh4eHh41SEhgYGBgYGBgYGBgYFxpOWVdXV1dXV1dXV1dXVmVwb29vb29vb29vb29vbVlXV1dXV1dXV1dXV1dTfrCsq6urq6urq6urq66dWFdXV1dXV1dXV1dXV0+r8erq6urq6urq6urq6unZ19jX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dXV1dXV1dXU1NTU1NTU1NGcenFpSlRdT1JVTkQ+Pzs+QEA4Ojs4PDs7PD86Ozs4Ozk5Ozw7Ojw5Ozs8Ozo9PT0+PUE/Pj8/Pj08PT88PEFBQ0FERTw+QEVGSktNRpPc1dXV1tbW1tbW1tbW1tbW1tfX19fX19fX19fX183PXDk9PT09PT09PT09PTWT8Ofn5+fn5+fn5+fn5+bV0dLS0tLS0tLS0tLS08Wtrq6urq6urq6urq6vq46NjY2NjY2NjY2NjY2SXSInJycnJycoKCgoKCcpWmNiYWJhYmJiYmJiYmFveHd3d3d3d3d3d3d3d3VjYmJiYmJiYmJiYmJiXoWyr6+vr6+vr6+vr6+xoWJhYmJiYmJiYmJiYmJbr+/p6enp6enp6enp6enn2djY2NjY19fX19fX19fX19fX19bW1tfX19fW1tbW1tbV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbV1dXV1dXU1NTU1NTWo3txZElbYE5OVU9AQT89REI/Oz06OTs6PT07PDs6OTg5OTs8Ozw8Ojo7PDo7QD08PTxAQTxBQTs7PEA/PD1CP0RDQ0U8PkJERkpMTEWN3NXV1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjNzcXCw8PDw8PDw8PDw8PCydDPz8/Pz8/Pz9DQ0NDQz87Ozs7Ozs/Ozs7Oz8/NzMzMzMzMzMzMzMzMzMvJycrKysrKysrKysrKysfCw8PExMTExcXFxsbGxsvMy8zLzMzNzMzMzMzLzc7Ozs7Ozs7Ozs7Ozs7NzMzMzMzMzMzMzMvLy8vP09PS0tLS0tLS0tLT09HNzc3Nzc3Nzc3Nzc3NzdTY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NfX19fX19fX1tfX19fX19bW1tbW1tbW1tXV1dXV1dXV1dbV1dbW1tbW1tbW1tXV1dXV1dTU1NTU169/cF5GXmJQUVdOR0ZDQ0lBPz07PDo8OEBCPD04Ojo4OTg7Pzs8PDs7PDw8PD87PD46Pj44PkI8Pj1BPjw+QkBERUNAPD5APkNJSUtEh9zV1tbW1tbW1tbW1tbX19fX19fX19jY2NjY2NjYzs3P0NDPz8/Pz8/P0NTQ0M7MzczP09LSzs3P0s7Ozs7Ozs7R1NTTztDU0s/O0NTSz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0NDR0dHR0dHS09PU1NTU1dXV1tbW1tfW1tbX1tfX19fX19fX19bW19fX19fX1tfX19fX1tfX19fX19fX1tbW1tbW1dXW1dbW1tbW1tbW19bW2NjY2NjZ2dnZ2dnZ2dnY19jY2NjY2NjY2NnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjX19fX19jY19fX1tbW1tbW1tbW1tbW1tbW1dbW1dbW1tbW1tbW1tbW1tXV1dXV1NTV1di4gm9XSl9jUlFaS0hBQTxCPT07Oj4+PD4/PT0/Nzk6OTk3OD48PD47Ozw7PDs/PT0+OTs7OT0+P0A+QD07OkI/QkNCPz0+QD5CRUdKQoDc1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2M7Ozs7Ozs7Nzc3Nzsqfys3Nzc3QuYOEi8fTwJrLz87Ozs7RsIOEk8/JlKjS0MaTq9LOzs7Ozs7Ozs7Ozs7Oz8/Pz8/P0NDQ0NDQ0NDR0dHR0tLT09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbV1dXV1dbW1tbV1dXV1dXV1NTU1NXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NfX19fX1tbW1tbW1tbW1tbW1tXV1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXYwIBuVU9gY1dZW0xMQ0A9PTs9Ojw+Qj5CQ0A8Ojg5ODo6Ojc7Pz4/PDw7PDo5Pzw8PTg5PD9BPj09PUFAPTtBQkBCQz47QD9BQUlHSkF629bW1tbW1tbX19fX19fX19jY2NjY2NnZ2djY2dnOzs7Ozs7Ozs7OzdKpj63Rzs7Ozpu3tqSiwJOerNPOzs7PyZu6uJ2snqubsNCZrZmz0s7Ozs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0dHS0tLT09TU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dbW1tbW1tXV1dXV1dXU1dXV1dXV1dXW1tbW1tbW1tbW1tfX19fX19jX19fY2NjY2NjY2djY2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2dnY2NjZ2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV18h/b1pTYWVeXVxPSkQ9QD8+Ozc6Pjk/RD5BOTg3ODk7Ozw4OT89PTw9PD47OkE7OTs5OzxDQDw7PT5AQT49QkQ/QkM9PT8+Pz5ISUg/ddrW1tbX19fX19fX19fX2NjY2NjZ2dnZ2dnZ2dnZzs7Ozs7Ozs7Ozs/Inrym0tDQzsqgl36Cw6abr6fUz8/P0cOij3+KwpSHnJ7Fk4adnc7Pzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dLS0tPT09TU1dXV1dXV1dXV1dXV1dbV1dXV1dXV1tbW1tbW1tbV1dXV1dXW1tbV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2djY2NjY2NnZ2dnZ2dnY2NjY2NfX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dbV1dXV1dfNiHNdWGloXl9gT0lGOkFAPj88PDo2P0JAQzo2NDc6Ozo8Ojk+PD49PTs/PTxBPjw8Ojw8PTw6PEA9QEI+PkFCPUNDPT0+Oz9BRUtIQHDZ1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2c/Pz8/Pz87Ozs7SrKWnqdXAvNLHnY+ey9PJipmq1M/Pz9G/noqo0NS7yJiZxr3JlpnG0M/Pz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0dHS0tLS09PT1NTU1dXV1dXV1dbW1tbW1dbW1tbW1tbV1tbW1tbW1tbW1dXV1dXV1dXW1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnY2NjY19fX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0JB1W1tqaWFeXVNOSTxDQEE+QD46OEZBP0M6NzQ5Ojo5Ozs4Oz0/Pj49QT08P0A9Pjw8PDw8Oj1AQD8/PT5CQD9AQkA8QD0+QUVLRz9r19fX19fX19fX2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnPz8/Pz8/Pz8/QzJ2Nl6zQmpfKxZ6ynpbN1q2ZqtTPz8/RuqWtnJ7S0ZSWn87RkZigztDQ0M/Pz8/Pz8/Pz8/Pz8/P0NDQ0dHS0tLT09PT1NTU1NXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX19fX19fY19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tKUcl5ea2tqZV1PTEc/RENDQDo9OzxCPD49OTY0Ojk5Ojo5Nzs/QDs8PUA8PEE+PD07PTw/PDo8Q0A+PTs9QD5CPkBBPkA9QD9GSUQ/ZtXX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2traz8/Pz8/Pz8/P07GigJuvyaCjv8qcpYynrdiqmarUz8/P0cCgn5OlvLOfwpvaraO/ndXQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1NXV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dbW1tXW1tbW1tbV1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbSk3BgXnBoZmVaUUhHQkVDQEA3Ojo8Pjo8OTc2NTk6Njo8Ozc8QEA8Ojo9Oj0/Pj08OUA8PDo6OT9APj08PUBBQz9APz5BOz9ARkpCP2LS2NfX2NjY2NjY2NjY2dnZ2dnZ2tra29vb29vb28/Pz8/Pz8/P0M6fkGyclteqo9PSrqa1mJ/Vqpmq1M/Q0NDSpq+um6fQi5Oex8uIlZ7I0tHR0NDQ0dHQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1dXV1dbW1tbX19bW1tbW1tbW1tbX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfW1tfX19jY2NfX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX1tbW1tbW1tbW1tbW1tbX19fX19fW1tbW1tbX0pNuYFxxZGdkWlVKQENGQ0FCODs/PD07PDw4NTU4OTY4Ozo5PDo+Pzw9PTk8Pz49Ojo+OTw6Ojg+Pzw9PTw+QEFDQT48PDpCRERKRkJd0NnX19jY2NjY2NjY2dnZ2dna2trb29vb29vb29vPz8/Pz8/Pz9G9n8O31pfA09HQ0srSzZeb1KqZq9XRz9DQ0cnXxJih0NqlmbPQ26KZtdXR0dHR0dHR0dHR0NDR0dHR0dHR0tLT09PU1NTV1dXV1tbW1tfX19fX19bW1tbW1tfX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19fY2NjY2NjY2NjY2NjY2djZ2dnZ2dnZ2dnZ2dnZ2drZ2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fX19fX19fW1tfX1tbX19fX19fX19fX19bW19GRbF1cb2doYl1PRkBISUdFQDw8Pj48PT48NzU2Ojk2OTs6Ojs4QD86PDw5PD49Ozs6Pzk/Ojs5PT49PTs7PTxAQ0I/Pz47Q0ZGR0hEWc3a2NjY2NjZ2dnZ2dnZ2dna2trb29vb29vb29vb0NDQz8/Pz8/Pz5V+e6WS1KKa08ySl6ObodirmavV0pem1cWNnqCeoJKnmaCtkKiYnrvV0dHR0dHR0dHR0dHR0dHR0tLS0tLS09PU1NTV1dXV1tbW19fX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tbX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2tnZ2dnZ2dnZ2djY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX1tfPjGRWXnBrXGBgTkVITUlJT0M+OkI9PUBCOzU1Nzw6Nzo7Ojo7OT09OTo6OT0+Pz07OT47PDo8Ozk+PD47PD0+QENCPz5BPEFDR0ZGRVXJ29jY2NnZ2dnZ2dnZ2dra2tvb29vb29zc3Nzc3NDQ0NDQ0M/Pz9DR1aeZrcmjqL7KnbGdo7XZqZup2LirocnBoa2ho6WmpKigr6eiqZzQ09LS0tLS0tLS0tLR0dHS0tLT0tPT09PU1NTV1dbW1tbX19fX19fX19fX19fX19fX19fX19bW1tbW1tfX19fX19fW1tbW1tbW1tbX19fW1tbW1tbW1tbX19fX2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2djY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fX19fX19fX19fY2NfX19fX19fYzYZdV2JvZE9dVEtIRlNRS0xAPj1EPD9DRj01NTc7OTY6Ozo8PTo7Pzo6OTg6PT0/Pjs/Oz49Ojs5Pjs9PD0+QURCQD8+PzxAQUVHRURSxdvY2dnZ2dnZ2dnZ2tra2tvb29vb3Nzc3Nzc3NzQ0NDQ0NDQ0NDQ0NO5gL3Tm5bP1LWLkZ/T1LyBu9TOlKDT1auNj6rWnJGOutWakY6+1tLS0tLS0tLS0tLS0tLS0tLT09PT09PU1NXV1dbW1tfX19fX19fY2NjY19fX19fX19fX19fX19fW1tbX19fX19fW1tbW1tbW1tbW19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2tnZ2tra2tra2tra29ra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2NfX2ct+WlVqaltMX01KTEpVTEZCPD0/R0ZIS0g9NjU3Ojk3OTo7Ojw9OT45OTo4Oz0+PkE+PTk8PDo9Pj46PTk5Oj9FQUA+PT8/QkBHRURFUMHc2dnZ2dnZ2dna2trb29vb29vb3Nzc3Nzc3dzc0NDQ0NDQ0NDQ0NDQ0cHR0crI0tDUxLjS0tHSwtLQ08fM0tHUwb7V09O5x9bT07jI1dLS0tLS09PT09PT09LS0tPT09PU1NTU1NXV1dbW1tfX19fX19fX2NjY2NjX19fX2NfX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29va2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2djY2NjX19fX19fY2NjY2NjY2NjY2NjY19rHd1xSZ2laTlpOTFBRV0VKPz89P0FFTExAPjc3NTs4ODk5Ojs8Pjw+ODo6OTs+P0A9Pj46NTo6Oz0/Ojs5Ojw+QkJAPz8/P0FCR0RDRE683dnZ2dnZ2dna2tvb29vb29vb3Nzc3Nzc3d3d3dDR0dDQ0NDQ0NDQ0NDS0NDR0dDQ0dPU0dHR0dPR0dHS0tHR0dTV0tLS1dTT09PW1NLS0tPT09PT09PT09PT09PT09PU1NTU1dXV1dbW1tfX19fX2NjY2NjY2NjY2NfX19jY19fX19fX19fX19fX19fX19fX1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tvb2tra2tra2trZ2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2trZ2tra29ra2trZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjbwXNYVWlrU0xSTlBSWVRGSTw+Qz9BQkVKPj43ODY5Nzc4OTk7Oz0/QDw9ODk7Ozs/Pjw8OTU6PT47OTk7PD8/P0JCQT1BPUBBQkZCQkJLtd7Z2dra2tra2tvb29vb29vc3Nzc3Nzd3d3d3d3R0dHR0dHR0dHR0dDQ0NDQ0NDQ0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tPT09PT09PT09PT09PT09TU1NPT1NTU1NTU1NXV1dXV1dXW1tbX19fX2NjY2NjY2NjY2NjY19fY2NjX19fX19fX19fX19fX19fX19fX19fW1tbX19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2NjY2NjY3LxvVFRsbExLUkpUUlVLRkQ6PkdEREFERjw/ODk6OTU5OTo3PD07PkA9PTc5Ojs5Pjs5OTY2Oj1AQT47PDk6Pj9DQT4/Qj0+QkNFQkFCSrDe2dra2tvb29vb29vb29vc3Nzc3Nzd3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0tLS0tLS0tLS0tLS0tLS0tPT09PT09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1tbW1tbW19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19fW1tbW1tfW19fX19jY2NjY2NjZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2dnZ2dnY2Ny2a1NbcGtLVVdSXFFXSEQ+PEJKRT1ISj89PDc4ODo1OTg5Njs+PD1APDw1OTk8Oj87OTg0ODw9PUFBPD47Ojw+QD89PkE9PUNGR0I/Qkmq39ra29vb29vb29vb3Nzc3Nzc3N3d3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHS0M/U0M7P0tLT0tLS0tLS0tLS0tPT09TU1NTU1NPU1NTU1NTU1NTU1NTU1NTV1dXV1dXV1dbW1tbW19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19jY2NfX19fX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dndsGRTYXJfT1pUV19RUkdCPUVJTEFBTEQ/Pzs6ODg5Mzg2ODY5Pj0+Pz06Njo7Pjs9PTo5Njg6PTtAQDxAPz0/P0I+PD48PEJFR0lCPkNJpODa29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3t7S0tLS0tLS0tLS0dHR0dHR0dPT0bm7zLqbnLrQyNPT0tLS09PT09PT09PU1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2NjZ2dra2tra2tra2tra2tra2tra2tra2tra29va2tra29va2tvb2tra2tra2tra2tra2trb29vb29va2tra2tra2tra2tra2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ3qpfVWBuW1VZUVpeT0xHQ0ZNSUZEREo7QUE7PDg4NjQ4Njk4Nzw/QT89Ojc8Pz48Pz87OjY4OD09QEE9QD5BQD1AOjs6Pj1BRUdJQkBDR57h29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e0tLS0tLS0tLS0tLS0tLS0tO+wMqaoKKViJGeqpOpz9TT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fY2NjY2NnZ2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dna2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2tvb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2d6iXFVeblheXU5aUFROQ0NMSUlJRkpEPEJBPDs4NzY3OTc3OTk9P0E/PDo5QD88PkI/Ojg3NzY9Pz9APUBBPz88PTs7OD48P0VJSEE/Q0aX4dvb29zc3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3tPT09PT0tLS0tLS0tLS0tTIlZyum5m1iX2TjIKBhMTV09PT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tvb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dndmlpYYW5ZYVdPV01QRUJETElNS0ZJRT5CRDk4ODY3OTc1Njk4PT1BPjo4OT4+PD9APzw1Njc2PD4/PjtAQEA/Pj4/Pjs/PkFCRkdCQENIkeLb29zc3Nzc3d3d3d3d3d3d3d7e3t7e3t7f39/U09PT09PT09PT09LS0tLTz6h+kayPko6MhoCIiYSQo8rU09PT09PU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY19jY2NjY2NjY2NjY2NjX19fX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2tra29vb29ra2tra2tra2tna3JJaWWNuWlpSVV5QTDxAR05IUklIRT47SEY4OTc1Nzg3NTg5ODs+Pj07ODlBPj1AP0E+NzU5Njs+QUI/P0BAQkI/Pj8+QUBEQUZIQj9FSozi3Nzc3Nzc3d3d3d3d3d3e3t7e3t7f39/f39/f1NTU09PT09PT09PT09PWtaWaiIuQhYCFi4iBg4qLf4bC1tTU1NTU1NTV1dXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2dnZ2dna2dra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29ra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb2tra29uIWltnalxYTFpfVkg6TEhMSkpDRUZDQExINzo3Njc4ODU4Nzg5PDw7Ozk4QD89Pj8/PDY3PDQ3P0JCQUBAPz8/QT09P0A+QEBGRT09REuI4tzc3Nzd3d3d3d7e3t7e3t7e3t/f39/f39/f39TU1NTU1NPT09PT09PUxZKCg4WGfYGCfXx5foGCg36k29bU1NTU1NTV1dXV1dXV1tbV1tbW1tbW1tfX19fX19fX19fX19fX19jY2NjY2NjZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vc3Nzc3Nvb29vb29vb29vb29vb2tra2tra29vb29zb29zb29vb29vb29vb29vb29vb29va2tvb29vb29vb29vb29vb29vb2tvZgFpebWhaU0ldW1hKRE1ISlNMR0ZBQD9KQjg7NjY5OTc1ODY4Ozo7Ojw5OD09O0A9Ozo2NTw3Oz1CQEFBPD49QEE9PEA/Pz5CREU+PERLg+Lc3d3d3d3d3t7e3t7e3t7f39/f39/f39/f39/V1dTU1NTU1NPT09PT2LKEkKh9g3l2hIh/e3d5gn5+i67A1dTU1NXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dna2trZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2tra2tra2trb2tra2tvb29vb29vb29vc3Nzc3Nzc29vb29vb29vb29vb29va2trb29vb29zc3Nzc3Nvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc1nlcWmxmWFJPYFFSQUhHSkZYTEZAQENDSz87Ozc4ODc2NTc2ODo5PDw6PTs/PTs9Pjw7ODg8OT0/QkFCQzw8P0FCPj1BQkNCREVDQDtDTH3h3d3d3d3e3t7e3t7e39/f39/f39/f39/g4ODg1dXV1NXU1NTU1NPU0ruen3WKeXuIgICChYGDcnOAhYOMrNfV1NXV1dXW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NnZ2dna2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra29vb29ra2trb3Nzc3Nzc29zc3Nzc3Nzc3Nzb29vb29vb29vb29rb29vb29vb29zc3Nzc3Nzc3Nvb29zc3Nzc3Nvb29vb29vb29vb29vc3Nzc3Nzc3Nvb29vb3dByXV9wZVdLUGNPS0JHQ0pIS0ZBPEE9SFBBOjo3Nzg3Njc4Nzw6OD09PD47QD88Pz07Ojs5Ojk8QEJAQkNAPUFAPz1AQkNDQUBAP0A7RU144N3d3d7e3t/f39/f39/f39/f3+Dg4ODg4ODg4NXV1dXV1dXV1NXU18h4i4V8goh6g4SBfoKCc2l0hYuGkJ3U1tXU1dbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tvb2tvb3Nzc3Nzc3Nvc3Nzc3Nzc3Nzc29zb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb297KalxjcWVST1heSz9HTElPS0VAPkFCP0lPPjk6NzY7NzY6Ozc7Ojg6PDw+Oz09Oz48Ojs4OTo4OUFCQkFAQDtAQj06PkFCQz8+PT4/PUZOdN/e3t7e3t7f39/f39/f4ODg4ODg4ODg4ODg4OHV1dXV1dXV1dXV1s6dhpl+f5OTin+CgXx9gnNxm4mAgoOJwNnat7TQ19bW1tbX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tra2tra2tra2tra29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NvfwGNaW21gVlBTU0pETEhNSEk8PkFEQ0ZORDw8OTc5OjY4Ozk3PDk4OTw9OzlAPjpBPzw3NTc7ODpAQUVBPz45PUI/Oz1CQkI6Pj07PT5GTnHe3t7e3t/f39/f39/g4ODg4ODg4ODg4OHh4eHh1tbW1tbW1tbV1tjLioCHhYOXjHh7e3lvfYF1a3ebdHZ7eInHxpiMrdjZ19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2drZ2dna2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tra29vb3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29zb29vb3Nzc3Nzc3Nzd3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3Nzc3Nzc4LdjV1lrYlJNVVFMSktGS0ZDQD5CQT9FTT4+PTg5OTo3OTo3NT03Nzo+PDs7Qjw5Pz05NjY4PTk6QEJGQD49PEBCREA9QD9DO0A9PD4/Rk9t3N/e3t/f3+Dg4ODg4ODg4ODg4OHh4eHh4eHh4dbW1tbW1tbW1tfVrYZ6d32rn3l4entzdH+Dfm9xe3l6c3t2k4qFgImkzdnY19fX2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tna2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29vb29vc3Nzc3N3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vc3Nzb3Nzc3Nzc3N3d3d3d3d3d3dzc3Nzc3Nzd3d3c3Nzc3Nzc3N3d3d3d3d3d3d3d3dzc3OGtYVtebGJSTVZMTUdLS0RGQkI7QT08RUxDQT44Ojk6Nzc5NjY6NTs+QDs9Oz89PD89Ojk5Ojw5PEVDRkA/PkBDQkQ9OT0/QT1CPz1APkdPadvf3t/f3+Dg4ODg4ODh4eHh4eHh4eHh4eHi4uLW1tbW1tbW1tfQmH+Qh4N9eoN2e3Vzenl6kKqmd3JyfoeHh4CAfoKEhJHJzNnX19jY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra29va2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2djY2NnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vb3Nzc3N3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzb29vb3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3dzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3NzhpV9UYm1iUE9TSUhHRkpJSUJBPkJCPEVFREA+ODo4Ozc3Ojc4ODY+Pz07PDk9PDo+PTs6Njc7NjpEQUY+Pz8/PkNBPzs9PT47REM/PjxIT2fZ4N/f3+Dg4ODg4eHh4eHh4eHh4eLi4uLi4uLi1tbW1tbW19jYyH52doN+fnR2eIaCenl1d5yhu6GEgoCAfoeKinx/gYaMnKjO2NjY2NjY2NjY2djY2NjZ2djY2NjY2dnZ2dra2tra2trb29rb29rb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3d3d3d3c35pbT2drXFBRUElDT0pLR0xHSkJAP0FHREBBPDg8ODg1ODk3Njc3QEA/Ozw5Pj04PTw8Ojc4PTk/RENGPkE/QkBDPzw6Pj0/PkVEPz07S1Fj1+Hf4ODg4ODh4eHh4eHh4uLi4uLi4uLi4uLj49bW1tbW19XB3LRueHJze3B6eXaFiIR7eH2AgZiljH98fnuRhZaLhoGDgY6Rvd3Z2NjY2NjZ2dnZ2dnZ2dnZ2dnY2dnZ2dna2tra2trb29va2tva2tra2trb29ra2tra2tnZ2dnZ2dnZ2dnZ2dna2trZ2dnZ2dra2tra2tnZ2dnZ2dna2tra2tra2tra2tra2tra2trb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t3d3d6NWFdobllQUUtISlNJTUhNSUtBQz9DRkJBRDo6PDg2NDg4NzY2Nj8+Pjo8OTw7Oj09PDw4Ozw7RERERT4/PkI+Qj84PT8/Q0NCQEE+O0xUY9Xh3+Dg4OHh4eHh4eLi4uLi4uLi4uLi4uPj4+PW1tbW1teslLZ6eHJvd5V7dHuLgHh1bn6Fg3t/hYhyfH2bnI6JioJ+g32Hk5rH1NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2trb29vb29vb29vb2tra2tra2tra2tra2tnZ2dnZ2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2trb2tra2tra2tra2trb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d7Zf1lgaGxcUUtHR09LTk5PTURGQkg/Q0hEREA6Ozs4NzU3Nzc4NThAPkA7PDk8Ozw+Ojk7OTk7OUZERUI8QD4/PEBDOz5AP0A/Qj8+OjtKVWPV4eDg4eHh4eHi4uLi4uLi4uLi4uPj4+Pj4+Pj1tbX19vKhYR3cXJubniVhHt4hH95dnB4c3eLkY6CdnN9ioaId3d1d4ODfIiIk8Pb2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2trb2tvb29vb29vb29vb29rb2tra2tra2tra2tra2tnZ2dnZ2dna2tra2tra2tra2trb2tra2tra2tra2tra2trb29vb29ra2trb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f0nVZaGlqVk5KSE1OR01EUElGSD9FPUZMREM+Ozs8OTc3OTY2OTU4Pj4/PTs8QDs9PDo3Ozc5OThHREVCPUE9Qj8+QDw/QUE/QEJAPjs8S1Ri1OLg4eHh4eLi4uLi4uLi4+Pj4+Pj4+Pj4+Pj49fX19fEknuJf29sbnV2foSBg4qGfnVybWVtiIaKjoR7c4OHint4e4OPj4GEioqxztrZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29zc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tvb2tvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3dzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f3t7e4clsW2pqalNOR0dOT0VIRk1JSUA7RD5ISUA9PDo6Ojg2ODo3Nzk0OD08PT07ODw8PDw4Njc4OTo6RUJFQT9APEI/Q0M+PkNEQUBAP0A8PUtRYdPj4OHh4uLi4uLi4uPj4+Pj4+Pj4+Pj4+Pj5OTX19fZqXaFfnx3bHB3eXh8jH2KhYB3anN0d3p9bot7fnl6foR/gIGDfnh8foeGlrbT2tnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra29ra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/e3uO9amFpa2lRTkZNTEtKWE1OR0FAQE9BQz9AOzw4OTk5Njg2NjY4NDs+PD07OTY6Ojk6OTU4OTg5OkJERj8+Pj5AQEBCPzxBQD88Pj9BOT5KT17S4+Hh4eLi4uLi4+Pj4+Pj4+Pj4+Pj4+Tk5OTk19fX2sqKhIB5c29tcXN1d4CUeHaAfHWHhXd1cnWgmXp7d3Z5doR0bWxue3iAmouTu9za2tra2tra2trb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc29vb29vb2tra2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f397js2lpbmloUFBPTExPUk9LU0Y/RURERD48PDg7ODc5OTU2ODc2NzM6Pjs+PTc6Pjk5OTk2Ojo4NzxDRUc/Pzs/PkA9PkE9Oz0+OUFAQDhBTlFc0OTh4eLi4uLj4+Pj4+Pj4+Pj4+Pk5OTk5OTk5NjY2NjauY6AenZ1bmpveHCBfWt0cnZ3hIV5h4d5lY55eXp1d3pza298gHx2fYh8gLLe2tra2tvb29vb29vb29vc3Nzc3Nzc3Nzc3dzc3Nzc3Nzc3Nzb29vb29rb29vb29ra2tra2tra2tra29va29vb29vb29vb29zc3Nzb29vb29vb29vb29vc3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3t7e3t7e3d7e3t3d3t7e3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/f39/f4qpqa2hrZFNQT0ZQVFJOSFJLPkREQ0I7Ozk6Ojg2Nzg1NjY4Nzg0Oz88Pz05PDw3Ozo6Nzo6Nzo9Q0JDPUE+Pzw5PT5BQDs8PDtFQD47Q05TXNDk4eLi4uLj4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTY2NjZ1p5vdntveHh2cG50d3BwdHBzb36Jc3qGhY2EenNtcoB6hn1vg5OBdnx9g4a13drb29vc29vc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29ra2tra2tvb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4N/f3+KgbWhma2ZVVlJHUFFOS0xMRUJIRUc9OD08Ojo3Nzg2Nzc2NTY3NDg+PD09Ojg6OD46Ozc4Nzc6Oj5DRDtDQj49OD1AQUM/Pjw+RTw+PUJNUF/S4+Hi4uLj4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk2NjY3MB2doCCfnp4eHBsdXlya399bHNvdGdoaYB/aWh4c2d+iYl4cIKGe3d9foWKvd3b3Nzc3Nzc3Nzc3Nzc3Nzc3d3c3Nzc3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODflGttZm5mU1NJUFlUTEhGTkZGRUJGPTs+PDs5Nzc4NTc5NjQ1NzU4PDs9Pjo6OztAOTs7ODc6OTlAQkE8QUE/Pzk/QEJFQ0FAQEM7Oz1ES01g1uTi4uLi4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk5NnZ2tmYc3uqhJaCcnR1dn14aGx8d2h4d25rcHR5gIN2dHyBhIJ9c3CAin94gn95g8je3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f4N/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh24tubWdzY1lRTVVbV0hDSUZOS0dCRD8/Qjo7OjY2NzU2NzY0ODc2Ozw7Pj86PDk8Qjg3OTo6Ojk6QUFCQUJDQEE+PT9CQ0NEQUJGOTg9REpOYtjk4uLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXZ2drcqHGCtXiRfnNsem6EgXaCfWtoan+DeHZ8dX2FhXRmcHl9d316gIqFe318foC03tzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3dzc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3Nzd3d3d3d3d3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e397e3t7e39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4ODg4ODg4tiFb3FrdWFWT1VVXE9ETUY+SkdKRUQ8P0I6PDk4Njg0NTY3NDc2NDk7Ozw7OD47PEE4ODo9OD04Oj09QEBAP0FCP0A+QENCQ0FBRTc2O0RMTmPa5OLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXl29ra3Z5sbnNxhY1ybXBuf391hH5rcnZ2enN4gXhzb3VwbWt2fHmFiIB/f392coODsd/c3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eDg4eHh4eHh4eHh4OLXhW1xb3ZeUldTWlpRSkhDQFFAQkQ8OT9BOjw5NzU3NDU2NjQ3NTY9PDo9PTk+OjxAODo6PDY7OTs+PUJCQjtBQkBDQEBEREM8PUA3OjxFS01l3OPi4uPj4+Pj5OTk5OTk5OTk5OTk5OXl5eXl5dPOxsB+cWxveHt2b3VuanNzbZKGeG50dG5vdIZ/b2twboJ0bXZyfY2DdnF/d3mKgabf3Nzc3d3d3d3d3d3e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3dzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t/f3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi1oZucG1xYFJZUFdfWUpMTElSP0Q9OTtCRjs6OTc0NTY1NzU0NjY2Pj07Pz45PTk7Pjg9Ozo0ODtAQENCQ0FCRkE/Q0BBQkREOz0+OTs8QkxNZODl4+Pk5OTj4+Tk5OTk5OTk5OTk5eXl5eXl5eW5t7Woc3JscHd6dHd4bXFydXd/hHRyc2xsa3F8bnBudGuBf3GAd32Eg355gHNygYqg2d3c3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh49WHcWxqbF5YWlVXYFZWUE9QTD1BOjs8RkE4Ojg3MzY1Njk2NTg1Nz89Oz8+OT04Ozw5PTs7NTo9Q0JCPENDREREQUE/PkJDQzw9Pjg5PENLS2PN0dnh1sjY4+Tk5OTk5OTk5OTk5eXl5eXl5eXltbW2q3J5cm59f3Z1d2hqaGlwb3Zta2tnZWZxdG15gG5teXd2iHhxa2podXV5dHV/wd/c3d3d3d3d3d3e3t7e3d3d3d7d3d3d3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHi4uHh4ePVhnFwY2lhV1NZV19MUk9STUtAPjg5O0E+ODc5NjQ3Njc6NjY2NDk+Pzo8Pzo/OTo6Nzo9PDk5PEFBPTtBQ0VDRkA+Pj5BRUQ+QEE3OD5GSEpesrW4wbm1u8jg5eXl5OTl5OXl5+fn5+fm5ebm5ra2tbWOfX5weoR1cnZnYmNlbGtyb2ZpbHZtd4Z9hXlsbHd4a3ZwfH14c3V5fHd2h7ng3d3d3d3d3d7e3t7e3t7d3t7e3t7d3d3d3d3d3t7e3t7d3t7e3t7e3t3d3d3d3d3d3d7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4eHj1Yd1bl5uY1pUU1hXS1NLSk1SR0E4Ozs+PDk4NzU2NTY2OTY4NjY5Pzw6PT07Pzo7Ozk8PDs5Oj4+Pjs8PUFEQkNBQEBBP0JDPDw9Nzs+REVKXrG1tLW2t7e2y9rJ3uXl3eDi3tXU1tPU4OPg39+2treuh3t/bnmNenJ1bWNobGxtaXR4enF5enqIh4N6aWh9cWRvcXyGgX55e318e4an2t7d3d3d3d7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4uHh49aGdmxhb19dV1lcWlJQSEpXTEVHPUA9Ozs9OTY0NjU1NTg2NzY3OD87OT09PDw5OTw6Pjw6OTg+Qjs7Pj5AREBDRUFAQD0/QDw9PTU5PEJHRl2xtbW2uLm5ubq9uMPT0r3BwcC6u7y6u8TMxb/Dt7e3hGl1gX1ndYd5Z3Vxa2t5eHB3fH15bWl3e3h3bml1j4FwbHl4d3d9gXuGgnmAoNze3d3d3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODh4OHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4ePXhXJrZ3RhW1hYX15TVVVRVUpMRj9JRDs5PTY2NDc3NTc4Nzc3ODk8PDo+PDg8Oj0+OTs8OTs5P0E8PT9DP0FARUJCQTw9Q0A6Pjw1NDlER0dasbW1tre5ubm5ubm3ubm4uLm5urq6urm5urm6u7e3uX9ucHN6b3B/eXNuc3Vsc3Z4cXFwb2tvcX6Bc2mHhIF9dHOHdW11hYmBgHJ2hafd3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uHj14lxa2xyW1dXXWBUUVVUUFJPSkNATUE9Ozk2NTM0NjQ2ODc3Nzk6Pjs8Pjs5PDo8PDk8PTw7PT0+PUNEREBDQkE/QD48PkE8OD06NjY6QkpIWLG1tLa2uLm5uLi5uLe3uLi5urq5ubi4uLi6uru3uKx7cnhxf3ZzfnBsbXpyZ29sbW50cHt3d3Jyd3pvhpJ2f3x8enZ5fH9zfYdyda3T393d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4eHh4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi49eHb2pxalVWV2FbT1FSUE5XSURESUo/Ojk6NzUzNDk1NzY2Nzg4Ojw7PD46PDo6PTw5Ozw9Oz09PDs9REdEQ0E8PDw8Pj5AOzg8ODE1OkFGRVautbW1tre4uLm4uLi4uLe4ubq6uLi3t7i4ubq7t7mqcnB4d3x7e4J3aG5xam9qY2lyf21zcn54dHFsanaAeX2AgH91doB1a4qLgHaR1d/d3d7e39/f3t/f3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f4N/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLi4uPYhm1sdGVWUFxnWE1YU1JRWUVDS1BOOzk4ODc1NTM5NTY2NzY4ODk+OT0+OTw5OTw7Njg5OTo8QEA9PkBGQEJCQDo+PEE9Pzs7OzYxNjxCR0RQqLa1tba2tre4t7i4uLi4uLm6ubi4t7e3t7e5ure2tIlyd3h9iXxwem99c2hqbGdnbHRscXd0cWx2c3Fxd3FyfHl4g3Z7d2mLkYp9kM7f3d7e3tvY2drZ297f39/e3+De39/f3Nvc3N3e3uDg3+Dg4ODf3t7e39jS397f397e3t/f3t7f3t/f3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLi4eLi4uLi4uLi4uLi4uLj4+Lj4+Li4uPj4+Pi4uLi4+Lk14NoZ3VkVlVkZVdKWllXW1Q9RU1LSD04NzU3NjQzOTQ0Nzc1Njc5PTo9Pjw9PDk7PDk5Oj45PD4/PkFBQ0FFRUQ+OzxBPjw5PDs3Mzc+REhFSqG2tbW1tbW2tre4uLi4t7e4uLi3tra2tra3uLm2traLfXpsbHp/cGx5dm5qaGdlcXp4b2lvb3B1c21zd4Fnb32CgYNyf3lqcHJ6f6ng393Zy8a/vL2/vsLN0tDW3tnc4NfQzcPCw8PH1dfT2dzX1NjX0MfExce9vM/Kz87Y3djO3N3c2t3T0dze39/e397e3t7e4N/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eLi4uLi4uLf4uPi4eLg4d7W29/Sw8rJx9Hb3OLk4eHg2dre1sbExcTN2trf5OHi4trX3st9aWZxYVleZWFNTFRLUlpMO0hNSEZBPTc2NjUzNDY2NDg3NjU2OTw7Pj46Pjk5PDk3OTs7Oj49PEBAQ0RCR0ZCQT08Q0A9OTw7Nzc3P0RGRkaZtrS1tbW2tra4uLi4uLi3uLi3s7W2t7a3t7i5tba3opdxb29waW50dnFmZWNrbmdvcm1mZ2tygWVvdnyAeGRzj39zaHFyaWVlbm+w39HFv7u5ubm5ubq6uru6vc3Gw8e/urq6uru7u8HCvcHFvby/vry7urq5ubq6ubm6w8XDucDDwby/ube/z8/U3tjc3t/g3tLa4N/f4ODg39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eDg4ODg4ODg4ODh4eHh4uLi4eDh4uLi4uHa2t3RwsPCu8XT1uDdydPDrrnAsaqrq6uwtLbJ0sXRxLG4v7Srq6usr7S0vMzE1c60tLureGxtbWBdYl9ZS1NVVFFQREBRTUhEPzo3ODU3MzE1NjQ5ODQ2Njo8Oz08ODw5Njo6ODg5NzU8PDw/QEFAQkRDQkE8PkI/Pz09PTc1OD5DRUNAj7a0tLW1t7i4uLi4uLm5uLe1sautr7Oxs7OztLS0tqaei2tue3ZxeXhnY2hfcXdha25vaG99b25ja2lseHdsa4Z+bHB6dm1scG95sca8uru7urm5ubq6urq6urq6urq6urq6urq7u7q7u7y7urq6ubq7u7q6urq6urq6ubi3t7i4t7e2tbW1tbi3u8e+w8XHzcS4wMnH0tzZ2d/e3uDf39/f4ODh4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh3Nji4uLi4eHh4OHg3tfGxtHQztTe3tPO0t/SuLi8sq2trKysrrG+ua63rKipqamqq6urqqqqq6ysuKyqqqqrq6urra6urq6urryzrayrpHlub21fXl1dVE1SU1xUSkE/UElIPjg5NjgzNzMwNTczNzg1NzY2Ojw/PDg5Ozo6Ojg5OjY1OTs8Pj9EP0NFQkNCP0BAQT9APjw3ODc6QUVEP4W4tLS1tbe4uLm5uLi3t7SurKuqqq2urq6vsLGzs7WjcG5ucm1wg311aWFlaGZkY2Rxc21td25naW1tZXBzb29zcXN8h4F6dX11n7u6uru7urq5ubm6urq6urq6ubq6urq5uLm5ubm6urq6u7q5ubm5ubq6ubm6ubm4uLi3t7e4uLe3t7a2tbW2tra1tbW1tba1t7e3t7rBvrzGycrb3+Dg3tvd3d7h4tDW4uHg4ODg4ODg4ODg4ODg4OHg4OHi0768zNjd3OLg0dnbxL23sLCxsa+zu7uzsLS9s66urq2tra2sq6qqqqmpqKmpqampqqurqqqqqamoqampqampqaqqqqytrq6urq6urq6sraR4aWJxZmFZWlZRUk5cU0Y9QlJEQTc8OzY5NTY1NDU2NTg3NTY1Nzg7Pjw7OTk5Ojg3Nzk3Njg8Oz47RD8/Q0BBREE+P0M9Pjw+Ojo3Nz9DRj54srCztLW2t7i3trKurq2sq6uqqaqtraysrq+xs7S1t4xucnRqaIB5ZmpmZWxdaG5waGxxYmNmcoJ+dmhobGpueoaBhXx4cXF5gK+6ubq6urm5uLm5ubm5ubm5ubm5ubm4uLe3t7e3uLm5ubm5uLe3t7i5ubi4uLi3t7a2tre3t7e3tra2trW0tLW1tbW2trW1tre3t7e3t7e3tre4v8bP0MS+v8DE19e8ydra4OHg4ODh4eDg4ODh4eDb3t7Uzby3tre6wMDJxLfIvrKwsLCwr7Cvrq6ur7Cwr66urq6uraytrKurq6qpqampqampqampqKmpqKmpqampqKmpqKmpqqqrraytra2ur66trK2heWpkbWdiXFhRUFFLVEpCOklRP0E3PDk0OjU2NTQ1NTY4ODY4Njs6OTw9PTs6ODY2ODg6ODY3Pj09PT5BQUVCQkNBQUBBOj09Pz05Ojc9QUc8bKqmqKutsLGwrqupqKqrq6mpqamrrKytra2usLO0tbilgIdvaWdzdGZrcG1qZGxvcm5rbWNrcHyJhG5qbHx4Y3uKfnNqc25rcY+7ubm5ubm5ubi4ubm5ubm5ubq5uLi3t7e3t7e3t7i5ubi4uLe2tra3t7e3t7a2t7a2tra3tra2tbW1tba1tLS0tbW1tra2tra3t7e3t7i4uLe2t7a2uLm4uLe3uL6+uLq9vcfb4OHg2Nnd4eHg3dfKwcPCurm5uLe4uLi3tbS0tLKysbGxsLCvr6+vr6+vr6+vr66ura2srKyrq6yqqqmoqKmppqepqaehpaipqamoop+hoZyip6inqausrK2ur7Cwrq2unXhwbGphY2BZUU1RTFJGQzlNUEU+ODs3Mjc5Njc0NDM1Nzg3OTc7Ojo9PTw6Ojk3NDo5ODY1OD8/QEI9RENDQ0FDQEJBQDtAP0A/PDw6O0NIPWOopaWlpqioqKenp6ipqqmoqKipqqqsra6wsLCztLW1taWYdn5xZmt4cW9tZmVsaGNsZ2ZpaX11bWlvfXZ5hWZod294b3Fvcninu7m5ubm5ubm4uLm6ubm5ubm5ubi3t7W1tba2tre3t7e3t7a2tbW2tre2tbW1tra3t7e2tbS0tLS0tLS1tLS0tLW1tba2tra2t7e3t7e3t7a2tre2tre3uLe2t7i4t7i4uLi4wMXTyry8w83PyMC9urm5ubq6ubi4uLi4t7W0tLSzs7KysrGwr6+vr66urq+vr6+uraysrKurrKysq6ehoJ6gn5udoaGdlpmkpKaon5mZmZmanZ+gn56fpKqtrq+ura2srJl1cGlrY2FeXVVOU0tSREQ4TktHQTo4NTI2OTY1NDczNzc3ODk3OTo7PT0+ODg4NzU6OTk1OD9AQEFEPkZBQkNAQkNCQT88QEJCQD0+OjpERj5cpqWmpqampqanqKenqKioqKenqaurrKytra2ttLS0tbekc311bnONf3JmanFjaW1jaGZobG51aV9jZ3VzdnpuZ3Bwcn56cYihu7m5ubm6urq6urm2s7a1uLm2trW1tra1tbW1tbW3tra3tra2tbW2tbW1tbS0tLa2t7e3tbS0s7O0tLW1tLS0tbW1tra2tra2t7e3uLe3tra2trW2tbW2tra2tra2tra3tra3uLi3uri4uLi3uLi5ubm5urq6urm4t7e3t7W1tLS0s7OysrKxsbCwr66urq6urq+vra2srKuppaSmpqScmZubmpmampmXl5eXl5aZm5iZmJmZm52en5+dnJ6gpKWko6OioqKQdG5jcGFeXltUU1RIVEo/PFFCRkM7ODYzNzo1NTQ4Mzg5OTc4OTc7OTs9Ozc6NzU2OTk4NTg+Pz9ART5CPz9DPzxBQUI/PT9EQT8+PTk9Q0Y/VaSlpqanqKeoqamop6ioqKioqKiqrKuqqaipq7W1tba5o3eKcXKHhnd0cGh5a2JjYWVsaW5zal9jZWNjZWprYmRqbHaXjX6ovbm3tre5u7u6uLWxrKurqq6wrKyrq62tq6uvsLGvr7CytbW2t7W1trW1tbW1tbW2trSvr7O0tLSvra6vsrW0tbW1tbW2t7e3t7e3t7e3t7e3t7Owsra1tLa2tre3tra2tbW1tra3t7e5uLi4t7e3uLi4ubq6urq5uLi3t7e1tbS0tLS0tLS0s7OysbCvr6+vr66vr62oo6KgnJqampqZmZqbm5qampqbmpmZmZiXl5aYmZmZmpycnZ+foJ+goKChoaCgoJ+fi3RuaXRdYGZeUlRLRFRJPUVTSEVCOzo0NDY5NDQ1NzM4ODg3ODk5Ojs7Pz04OjkzNTg5NjM5PT5AP0A6QEJCQkA/QEJCPz0+QUFCPz06PkVDQFGjpqWlp6inqauqqKaoqKipp6ioqKinp6ioqaq1tbe3t7KZtH99kIx1Z2lqbGZjYGNoZW94cGlicXx5cGpmZmRma3NqhYystrKwra2ttLeysLCtrKuqqaiop6ipqampqKinqKipqaeoqqurra2sqqytraysrq6traunpaSnqqyopKOkpamwsbGztbW2t7i3t7W1tre4t7e3t7Kppaasq6ivtLa1s7W3t7a1tbW2tra3t7e3t7a2t7e3t7m6urq5uLi3t7Wxs7S0tLKxsK6sq6yurrCxsK2rqqmqqKijnJqZmJmYmJiYmZmZmZmZmpqZm5ubnJybmZeYmpqcnJydnJ2foKGhoqKioKGgoKCfnop1amtuWVxhVktPREdVRz5PV0hEPTw4MzQ0ODQ1NDgyODk4ODk6Ojw5OUA8Njk6MzY3OTE0PD8/QEBBOkNGRUJBREJDQTo7P0FCQz9APUBEQ0BPo6empaemqKqqqqakpqenqKioqKimpqaoq6uttba3t7e4rbJ1cHuDdmBiaWtiZWZhZGdmfYh5bHKAfXFvcXhjbW5xZo+srKurq6ysra6urK2trKyqp6WmpaWlpqioqKiopaeoqKioqKeoqampp6Wko6KioqOioKKioaKhoKChoaKjpKOjpaWlqLC0s7OzsKuqqaqztLa3trGopaOioaGipKiqqairs7Sxrq6xs7W2tra3uLi3t7e3t7e3t7a2uLe0sa6ppqerrKmnpqWkpKSkpKWoqaajoJ+enZycm5uampmZmJeXmZmZmJiZmpqampqampqbm5mYmpydnZ2dnZucoKGgoaOjoqCgoKCfnp2FdGtsaFdYU0pHTUVITUdAU1dGRz09OTM2Mzc0NTU3Mzg6Ojo6OTw9OjpBPDY9ODM3ODgzNztAPz9AQDpCRUNAQkRDQT87PEBDQkNBQDxBQ0A9TqKnpqanp6mqq6mkpaWlpaaoqKippqanqKmpqrW2tre3t7izc2h7c2JnamtpaWJhZGloXV1tfHJma3J/fHR8bm1zc36gqamrq6uqq62trKusq6mpqKWjpKampqWmp6eqqaamp6enqKinp6iop6WjpKKhoaGhn56en5+fn56foKGho6Wko6OkpKSmp6enpqWkpaampqeqraumpKKhoaChpKWlpaenpaeoqKalpaivtLa3trW1tra1tbOwrKupqa6rqKWlpqampaSkpaWlpqWkpKSkpaKhoaGgnp2bm5ucm5qamZiXmJiYmJiZmpmZmZmYmZmZmZqZmZydnJycnJybnJ+fn6ChoaKgoKCfnZ2cgHNrbmReU0pITUZETEtFRFFTQ0c9PDgzNjI4NDY0NjQ4OTg6Ozk7Pjw5PTs5PTczNTk2NTY8QD0/QD88P0JDPkJCQj89Pj5CQ0FFQD86PkVAO0+jpqWkpqeoqaelpKWlpKWnp6eoqKanp6alpqa1tba2trW2uYptcW1vfHxxZ2pmYGFsYFROW2hqbm9tgYJ9cWdxdn6aqKeoqqmpqqurrKqqqqimpaWkoqOlpqalpaWmqaqppqWjpKWmpqSjo6KioqKgoJ+fnp6cnJycnJ2dnJ2en6CioaKjo6KhoqKkpaSioqOjpKSjpKSko6Ggn6GipKanp6ipqaelpaSipKSlqK2wsKyrqqusqqmnpaWmpaWlpaalpqioqailpaWkpKSlpKOjpKOioaGhoqKgnp2cnJubm5qZmJiYmJmam5mXl5eWlpeXmJiZmpqcm5qampubm5ucnJ6goKGgnp6enpycm356bnJiXlNNSlBFRk5NQkBPRT5JOz01MzYzODM2Njc1Ojs4OTs5Oj49Ozo5Oj43NjY5NjU2PkI+PkE/PT5DQT5DQ0BAO0BAQkJCRUA+Oz5FPzxQoKSjpKOjo6SkoqSlpaSlpqamp6empqalpqaltLW1tbS0tbiBaHx9ZXOCemxwdWFfY1ROT1FbaGxpbGxxbW5xbnScoqSnqKioqauqqqqqqaempaSjo6OjpKSlpqalp6ytqaShnp2eo6Shnp6foKCenJ2dnJycmpqam5ucnJubm5ydnp6foKChoJ+goaOioKGjpKSjoqSlpaWkop+go6SkpKapqainpaGdnJ+jpaipqainqKioqaempaWkpKSlpqampqampqenpaWko6Ojo6KioqGhoqKhoqOkop+enZ2cmpubmpqZmJeXmJaWlZSUlJWVl5iYmpubnJuampqam5ucm5ucnp+fnpucnJyam5p/fnF0YFtUTUdNSEZMSj8/TkM8QDs8NDM4Mzc0NzY3ODs9ODo6OTk7PTs7ODk9Nzc4OTU4OD9APT9BPjs9RD89REA/PzpAQUE/QUVAPjw8Qz88Tp2ioaKioKCipaSkpKWlpqenp6empqampaampbW1tbS0tLS3jHalsXdmc3Jvc2xjZGlYT1JRT09dgG1kYFptkZGSoqKjpaampqenqKiop6alpaSjoqGhoaKjpaempqesrKemoJ2cm6Ghnpuamp2cmZiam5qampmZmZubm5uampqampucnZ6goaCfnp+hoJ6foqOko6Omp6inqKWioKGhoaGkpaWlpKCcmZmbnqOmpqampqanpqempaOlpKWlpqiop6enpaWlpaWkpKOjo6KhoqKioqKhoaKjo6Kgn56enZybnJubmZaUlJSTk5OTk5SUlJWWl5qam5ubm5qZmZqanJ2dnZ2dnZuampqamZqXf3dvc11aTkhKTkdFRklERU5APD09PDQ1OzQ2NDY1Njc5Ozg5OTg5OTw7PDc6Ozc4ODg1ODg/Qj9BQTw+P0A8PEJAQT49QT4/Pz1CQUA6OkA8PE+doqGfoJ+dn6OkpKSlpqeoqKenp6ampqampqW1tLS0tLS0tbSXtqd1Znh2Y2xjY2VjW1JTU1JNXqCMeFhodpajnp6hoaOjo6OjpKSlpqalpKSioaGko6OjoqOlpqWmpqenpp+bmpuioJmWlpWam5mXl5iYmpqYmJqampqbm5qZmZmenZ2goqOjo6KkpKWinqGhoaKjpaampaSjoaCgn5+hoZ+goJ2amJeZmpygpKOjpKWmp6alpaOjpKSkpKWnp6ampqampaWmpKOjo6SjoqKjpKGfoKGhoKGgoaCfn56dnZyamJeVk5KSkpKSkpOTkpOUlZaZmpqbm5qampqbnZ6enp2cnJybm5qamZmZlH10bHReWk9IRUdGQkVORT9GOzo+Pzs0Njo2OTM2NDY4ODo4OTc4ODo8Ozw5Ozs6OjY3ODk5Pj9APjw9QD5AOjlAQT89QT8/QUE+QUE/Ojk9PjpQnaCfnZucnJufoqOlpaWlp6iop6ampqanpqantLS0tLOysrGwsK2rkHiGj36bmn93Yl1TUlFRTGKgootaiKCgn52YmZycnZ2eoaGgpKenpqWkoqGjp6alpaKipaampaanpqagm5mboaCXk5OSl5qcmpeXl5iampmampqam5qYmJmaoKCgoKGfoaKipKamop6gn5+goaOko6Khn56enpyanZuZmpqZmJeZnqChoaKioqKkpaWmpKSkpKKioqKkpaWlpaWlpaalpaOko6KioqGgoKGgnp+fn5+fnp+foJ+cm5qZl5WUlJSTkZCRkpKSkpKSk5SVl5iZmpmZmpqam5+fnp2cnJycmpmZmpiXl5F8cmdxXl1QRj9BRD9KT0JCRjhDRT4+OTg7Nzc0ODQ1OTo6Ozk3OTo8Ozo8PT48PDo2NzY5OD4/QT47Pz49PDg6PkFAQUI/P0FCQERBPjo4PkE8U5ycm5uampycnaGio6KjoqSmp6alpaampqSjo7KysK2rp6amp6alpqiln6iop6qnoXmEXFFST0xcnKCAYpmgnp2clZOVlpeZmp2dnqGmpqampKOioqanp6ajpaampaWmp6amop2cnqGfl5GRkJSXm52YlpaWmJuZmpqampqZl5iam6Ghn56fnpybnJ6goJ6dn56fn6Cio6SjoqCfnp2ZlpeXl5iYmZubnqKioqKioqGio6WlpKOio6SioaGhoqOkpKSko6SkpKSioqKhoqGgn5+gnp2enp2dnZ2dnp6em5mYl5WTk5SUk5KQj5GSkZKSkZKTlJaXl5iYmZqampyenZ2dnJubmpiYmpmXlZaNempmamBiTkY+P0A9SkVAQ0A7QEE8Ojs5Ojc2NTg0Njc4OT04ODs6Oz87Ojs8Ojk6Nzc2ODs7Oz08Ojo8PTw3Oz5DQkRDPz1BQ0BEQT88OkBCO1eZmJqamZmam5ucnp2foqKhoqSlpKSlpqSioJ6op6alpqWlpaemp6ampqakpaanqKehqXJOUU1KVJahenKanJyenJeVlJWWmJiXl5qeoqKhoqOkpKOjpaalpaanpqSlpqalpaOgoKGhn5mSkI+WmpmenJaXl5eZm5ycnJqamZeZm5uen52cnZyZmZqcnZydnp6fn5+hoaCgoaKgn56bl5WVlZeanZ6fn6GhoqKio6OhoaCgoJ2cnaGioqOkpKOioaSlpKOko6SjoqKioqKhoKGfn52cnZ2cnJ2dnJ2enpqXlpaVlJOTkpKSkpCRkpKSkpGSlJWWl5iYmJiam5ycnJycnJ2cm5mYmZiWlJWXi3hsY2RiZFFHQT1DO0tIRDo7Ozw+OTo6OTo3Mzc5NTo4ODg8OTg7OT09Ozo7Ojk8PDc2NDc/PDo9Ozw/Pjw7ODxBQ0FDQkI+P0JAQkFAOj9APztZmZiampqam5ubm5ydoKGhoaGhoqKioqKhn5+dpKWmpqenpaWmp6ampqWkpKalpKSkpaaGUFJQT0+PmHB6mpubnJ6cnJycm5ubmZiYm56dnp6foKOkoqGhoqKio6SkpaalpKOjoaGhnpyalZOUmJuam56amJiYmJqcnpyam5iWmZybnJycnJydmpqbnJ2dnp6dnp6fn52cnJyhoaCblpWVlZacoKGgn5+hoKKjoqOhnZuZlpaWlpicnqCip6ikoaCgoqOjoqKioKCgoJ+fn5+gnp2cm5ucnZydnJmanJuWk5KSkpKUk5KSkpKSkpOSkpKRkpSVlpeYmJiYmZqcm5qbm5ucnJqZmJiXlZWWl4d3ZGdoZGJNQ0U8RDlJSkU5Ojs9PTo6ODg6NjQ3OTU8OTY4OTc5PDs7PDo6PDs6PDw4Nzg3Pj07Pj46Qj86Ojo/QURCQ0FBQD9EQUFAPjpAPj06W5qYmZqbmpubm5uen6CgoaKioKCgn5+enp2dnKWkpaanpqWlpqakoqKio6Oko6Kjo6KnllRYVVJOZ21rgZ6am5udn6Cgn56enp6dnJ2dnJ6enp+goaCfn6CgoKGio6Ojo6OjoqGgnpuZmZiZmZmamZienpiYmZmam5qWlZeWlZicnJ2cm52dnpybnJ2cnZ6bmJqeoaGdm5udoKKhmpWVlpaZoKKgnZueoKGjop+em5eXlJKSlJeYmZ2goqenpaGgn56goaGioaCfnp2cnJubnJubmpqZmpydnJmXmZaVk5GQkJCPkZKSkpKSkZKTk5OTk5OTlJWWlpeXl5manJubnJucnJqamZeXlpaVlZSEcmZsYmRbREJMPT84RktCPEA+Pj05Ozk6PTg1ODg2Ozg1Njo4PDw7Ozw8Ozk8Oj09OTU4Nzw5PD88OkE/Ojo6QEBDQkRBQ0A/Q0FAPj08QD09Ol+al5mamJeYmpycn5+foaGhoJ+fn56foKCenZ2lpKSko6OioqOjoZ+foaGipKOio6SiradXXl1UV19ua42dmpqbnJ6dm5ucnZ+enZycnJydnZ+goKChoaGgoKGgoKGioaGioZ+enJqampqbnJqZmpuZnJ6ZlpaWl5eTjo6QlJabnJuam5udn52cnJycnJ6dlpSZnJ+in5ycnZ+hoJuXl5mZmpycnJubnZ6fnZqXlpaWlJOTlJiampqfoKGmpqWgn56fnqChoaCenJubnJybm5ybm5qZmJmZmZmXl5iVlJKQkJCQj5CSkpKSkZGTk5aYl5STkpSVlJWWlZaZmZmam52cnJyampmXlpaWlpaQgG9vZV5gV0BKSDg/N0lFP0VBPD07Ojo7Ozs3NTs4Njs3NDY6Oj47Oj0+Pj07Ozs+Ozo4Ojk5NkBBPTo8PTo7OT9BQ0JERUM+P0FBPz8+Pj89PDtgl5WXl5aVl5mbnqGhoKGioqCenp6enqCgn52bpaWjpKSioKCfoJ+dnZ+hoqOjo6OkobCjXWVkYGFua4GenJubm5ubmZianJ2enJubm5ycnJ6ipKGeoKGhoqKhoKCgoaGgn5+enJqZmpubm5ybmp2dm5manJiXlZWWkY6Nj5KYnZycm5ycnqCdnJucnJyempWVm56foZ+dnJyenp2cmpqampqampqbm5qXl5aTkpWVlpWTlZaam5qanZ6foqWjnp6fn5+en5+enZ6fnZycm5qcmpqbmpiZmJiYmJiYlZSTkZCRkJCQkZKTk5CRk5SYmZiVk5SVlZWWlZaXmZmXmZqenpyamJiXl5aWl5eYjX1ubV9lVlRFSzw3PjdSRUM+QkE4Ozw7OTg6ODY7Nzc6Njc5Oj0+Ojw8PT49PD06Pz06ODw9OTtAPj4/PT45OTs/QkNAQ0VDPT9DQj5AQD5APTw8YZWSlJWWlpeanJ6goKCgoaCgnp6enp6gn56em6WlpKOioJ+fnp2dm5mbnJydnp+gn56rmGNpbW5pZm2enZybm5ybmpmZmZqam5ucm5uam5ygo6SgnZ6en6CgoKCgn6ChoKCfnpuamZqam5ubm5ufnpyZmJqamJiYmJKOj5OXnJ2bnJ2cnJycnZycnp6dnpqVl5ygoaGfnp2eoJ+cnJuampqbmpqYmpmVk5OTkpOWl5eVlJiYmZucnJydoJ+gnp6enp+fn56en6KjpKKgnp6cm5qampuZmJmZmJeXlpWUlJORkZCQkZKTk5OSkpOUmJmYlpWUlZaWlpaWl5iYmJiXmZqamZeXl5aXlpeWl4l4dmddX1dURUU5OTs8WT5AOEI/OTs7Pjk4Ozg6Ozc5OjU4OTs9PDk9Oz0+PD0+Oz8/Ozk+PDw+Pz5AQUE9ODc7QkNFP0FFQz1AREJBQEQ7Oz47PGKWk5SUlpWUlpiYmZubnJycnZ2cnJ2en56dnJqkpKSkoJ+enpybm5qZmJiYmZucnZ6cpolla3R4bVuFop2dnJydnJqbmpqampydnZ2bmpuboKKinpucnZybnJ2enp2dnZ2fnpyampucnZycm5ycnp6cm5qanZqam5yVkZOXm52dnJ2fnZycnJycnZ6fnp+cl5idn6GhoJ6cn6CfnJubm5qbmpmZmZmZl5WWlZaYl5eXlpaYmZuenp2dn6GhoJ+fnp6fn5+dn5+hoqKhoZ+fn5yZm5qcnZuampmXlpaYl5eXlpWTkpGTlJSTlJSUlJaZmJaVlZeZmJeYl5eXl5eYl5iXl5eXlpaYl5eVl5eDeHZfW11eUT1GOjk4P1VDQTtDQzo8Pj86Ojk3Ozg4ODc0ODk8Ozw4Ozs8PTo9Pjo/QT06PTw+PkBAPUBBPjk2PERDRUBBRUU9PkVERD9COzo8OTpkl5SVlZaUlJSUlJWXmJiamZqcnJydnp6dnZybo6Oko6CenJuamZqZmJiYmZiam5ubm6WJa3F2em9lmp+enp2dnJybnZ6dnJ2enp2dnJydm5ygoJuampubmpudnJqampucnJuZmZycnJ2dnZ2dnZ2dnpybmp+fm5ydm5mZmZudnZ2dn52dn5+dnJydn5+fn5uanZ+goJ+dnJ6gnpubm5ubm5yampuamZudnJqZmJeYmJiYmp2foKCgoJ+hoaGgoJ+en5+fnp6foaKhoJ+enp+enJqam5ubmpqZlpaXmZmYmJiWlJOUlJWVk5OVlZSVlpWVlZSYmZuamZaWl5WWmJiWl5OUlJGRk4yRkJOWfXhqYWJiXFA8QDw2OENWSERCOjg7Oj47Nzc5Nj06OTk2NDc6Ozw9OTo6Oz87PT08QD47Oz46PT89PkBBP0A8NztBQ0U/P0REPj9EREM+Qj07PDs6Z5aTk5OTk5OTlJSVlpeWl5aWl5mbm5ybm5uamaOjoqCfnpuamJeYl5eXmJmYmZybm5qkgGpqb3lzcZegnp2dnJydnp6enp+enp2cnJydnp2bnJuampqam5ubmZiYmpqamZmZmJqdm5ydnZ2dnJ2cnZ2cm5qdn5ucnJubnJubnZ2dnJydnp2enZydnZ2cnJ2dm5uenp6dnZybnpubnJycnJydnJubmpmbmpmYmZmYmpmZmpyfn5+jpaKfoaKioaGfnqCgn5+fnqCioaGhn5+fn52ZmpudnZqZmJWWl5aVlZaTkpOUk5STkJCSk5GUkY+OkJGOlZabmJWYlJmXlJiRjJCPk5yTkoyFjIeDhndxZ2pkW1xRQT44NkJHYEJFR0A+Ozw7Ojg4NjU8ODo4MzQ6Njk9PTk5Ojw9Ozw6PD48Oj5AOj5APjw/QD8+PDg6Q0FEPz5CRD8+Q0VCPUJAPDw8OmeYk5KSk5OSk5SVlJWXl5aWlZaXmZmZmpqampqkoqCfn52bmpmYmJiXl5iZmJmcnZ2cqH1nZXN7enOJop+enp2dnp6enZ2enZ6enp2dnZ6cm5ybmpubm5ucm5iYmJmZmJiZmZmbnZycnZ6enp6enp6dnZybm52bnJybnJ2dnZ2dnJ2dnp+fn52cnZ2dm5qbnJmZnJ2dnZ2dm5uanJ2dnJycnp2dnZybmZeVlZeXmJqam5ubnZ6foqOhoKGhnJucm5ubnZqcmZycn6CfnZiZmZmUkpKUl5SPj4+OkYyNiYuQi4mLjpGRj4mQmJiQkoyNi5KQj5iYoqiqpqWlrKOmoZqep6eyqKKVo6Cfl39wcWlsXFtcTUY8NzdHR1g+SE5URjk+Ojg5ODc1PTk4NzMzOTY6Pjw6Nzo8Ozo6Ojo8PDs/PjtAQD47PT5BPDw2N0A+QkA+QUY+PEFEQT1DQj49PDlmmJSTk5OTkpOUlZOVl5iYmJaXl5iZmZqampqaoqGfnp2cm5mYmJiYmJiYmZmZm5ybnKx/am16f3lxh6Genp2cnZ6enp6enp6dnp2dnZ6enJubnJubm5ubm5uZmJiYmJiYmJmZnJ2dnJyenp6enp+fnp6dnp6dnJydnJ2dnZ6fnZ2fn56goJ+enZ2dnZybnJ2em5qbm52enZ6dm5ubnJ2cnp2cnZqYl5SRjo+QkJGVmJSWlJiZmpudmJuYlY2Mjo6TkpKRj4mQjpGRjo+Ki42NjYiIi4+Lg42NkY+MkI2Qk5WVnJihoJySn6SipKmam5eanKOprb3Bwbq8uL26ucC8ubq3uru7tL2zwbV/bnVmZ1peWUxJRTo7TElTPFZSSUM6QTo7Ozc3NTo6OjgyNTY4Oz08OTk7Ozw6Nzo4Ojw6PT85PD8+PDw9QTs5NTg8O0A/QT9EPTxBQkA8REM9PT06YZOTkZCUlJOTk5OTlJeYlpeZmJmYmZqbmpqamp+gnp+fnJqZmpqampmYl5iZmZmZmZmphXB1e4B3b4mhnp6enp6fn56en56fn56dnp6fnp2dnJ2cm5ubm5ubmpiYmJiZmZiam52cnJ2dnp2dnp6goJ+enZ6hoJ6dnp2enZ6fn56en6CenZ6enJydnZ2cm5qYnJuVmJqamJiYmJmSjJCXlKCXk4+MjYqKiImMiJORh5CPjYqKkJCLjoqMi4+IiImJjpGOjYaFiYaKhoWLiI+SkJCNkJKXlpKamJ2TlJ6kpqaqq7Gsr6+rpquqsbm5tbS0rqyvtMDIxcXBvsbDxMTDurW+t7a0s7C2tb6qcHRyXGZfXV1JRj8/RUtMVklcTEQ/PUI6Qzk5Nzc7OTk3MTc5ODo+ODg6PDw7OTc5Ojs9Oj4/OT5BPDs+PD46OTY5PDpBPkNBQT08QkBAPkJEPj8+OVyHhIOHi42KiYaFgYqMkZOVmJiHlZaWkpiampmenZ+gn52ampubm5ycm5iWmJmXl5ibqo56dXZ7f3mCoJ+fnp+goKCfn5+foKCfnp2dnp+enp2dnJqbm5ubm5uYmJiXl5iZm5ucnJydnp6enpybm52dnZycoaGfnZ6dnZ2dnp2dnJiWlpaYlZWSlpmWk5GKjI+PjI+NkIuLj4+WiYiEi5GZjn2Fi42PjYyHioyQm4yRj4+Lio6TjIyNjIiSi4yFiYyPhouIh42KhYyEj4qXkJOYmpWbnKOqoaKknKKrsbe0ubWxs62vsrKlp7O6sbq6vLa3tsDDw729vLa/urq8wbW4wL60r66mqa+3mm58Z1tjWl1fSEU+QUtJU1hZXkFGOTk9OUY/Pzo3Ozs7NjM6Nzo5Pjg6Ojw9OTk4Ozk7PDo+PTtAQDs8QjxAOjg0Nzw7Qj9BQj4+O0NEREBDQz0+PjlhmZWLkYWNj5aSiHl9e3+Fi4OKgoqJhmuAeJCLlpqRnZ2UlJGTlpeampiWk42Sk5KQm5uIdndzcX1/cpGgnZubm5yenZ2eoKGgm5uWlpucmpybnJuYmZqYmJmampqWi5CTlpmYlZiYlpucl5WSkY2SkZCUk5KXm5mYm5ePjpCLjo2Ch4uLi4qLiI2RjIeHhoqIiZGKh4yEhYqNi4qNhI+UkIyDkJOUmZWPi5STkZWRlpWOj5GMlI2Oj4qIj4ePhoeJiYmNiomJioWNh46JmJKUmpuXmKChp6Cko5qqqbO2sbWwqKmiqK6tn6qvsK21ubi8wr/BxLixtbCutrOwuL68ury+urOzp7G3wpB1gGNiXlpXUk1IRkVQSVlXX1tDUDpCQz1HRj84Nzo6NzU1OTc8OTw5ODo9Pjo6Nzs7Pjs7PTs9P0E7Pz48Pzo4NTM3OkFBQEI+PjpDREM/QUM7PT45Z6mloqKZn6CippeUiI2CiIJ1h4iKiIp7e3Z7enmPeoiSfn18en6CkYWBgH1zfH99fISHfnRweHZzfHaBj4iIiYeIioyMkZicl4iOhIuNi4iNkI+Pi5GPi4yOj5CQjouFhYeLjIyHiIuOi4eMhYaBjYuGiop/iYqGiJiRiIOIg4KFfIuLjIaJi4iKkIyIi42PjI+Wh4mLio6NjY2Wk5OdnJyalpycm56bmpuYnZeTkZWWkJKRi4+LlpSMjYqDi4SEiYyQkIqOio2LipGJjZOTk5SVk5KcmZ6Xn6CfpaKvsamupKSfmKStpqa4t6ysu729wsPAv7+vpa2wsLS3uLO0uLa0ta6stK+4tLaBeXpjZmBeVlBRQUVLT0lcXl9UR0dCS0xCREA9ODg7OTU3Nzk3Ozc9PDk9Pj05Ozg6O0A8Oj06PkJBOD88Oj84NjQyOTtCQD9CPj04QUI/PkBEO0A+N2CloJqXnaGaoaCPl5efl5WCjaCfo6GdmpKOjIxycXBvdnFucG1ucHZub29waHBxcHR+c3FycXd7cnl2d3Jyd3Z6e3l8fXt/iIGEi3+PkYaNi4uGiouLiYaEgYaCgIKJkYOAg4x/ho+LiYWAh32AgZKQhoSEho2DhIyPj4+IjY+Hi4iRkJWRjpCKk5eOj5WYp6SfnZWYlpaln5udq6aqt7W4srGnr6qnpqGfmp2WkpWVkYqPjImTjZuVjYuLhoaJjJWQkJCLmZKVlZSbkJiTlIyNkYyWl5WilZ6mqauno6OqsJucpp+mq6G0vb6zs7+5u7u6uby9rqiusa6wuLyztLGxqrCpqLGxsqild3J0X2hhYFRWUUlKSFZNXl5eVExKRVFKRUdDPTo5OTc0ODY4Mzg4PTo9PD47OTs4Ojs/PDw+OT9DPzg7Ojg8Nzc2Mzc5RT4/Qz89N0BAQT0/RDw+PThUj4yGh4eUjJWZl5yWmZaNlZyWlZydoKCdmpiWeHFubXJ4cXFsbnJwa3FvcG1yc3t1dnd5fnVxeHZ0d3tybn98gX15eH1/eYOGg4WCg5CLkIuLi46Pi4mJhYKBfX9zfYiAfpyQhIWFiYuPinp9fYaOjYqGjZSRi5CXj5SXkpihlp6XlZunpp+goKawq6GjpbW0sqqmqq+isba5vcK7ucO+vLi9uLWxrLCspZuSk5mfm5SPk5WOmp2doJqfn5edo6qsoZ+em62hp6qwqaampJiRkZWUo6SirKSss7Szs6i3tru4sLKvra2yt7a6srW6s7e5u7i8urayr6yxsbKztLOxsa2us7Gzs6yhl3Zxc19jXlJRVE1PSUdYT1pcZFROR1VPRURKRD44Ojg3NTg4ODU5Nzo6PTw/Ojg8ODk5PTs9PTpCPj84Ozo5Ojk4NjI1N0I+P0RAQDY+P0I/PEM8PT46Tn98go6MjJOTl5eaj5SWjZaRkZSXk5qanqGdnHJvcnFxcXFxcG5zcW91dHJxdneAdXd8eYV+d3t8eX1/fICJiYmDfXp/h4GIiYGAgIGGiIGGi4aIhYSIiImEgIJ/enx8fX6SkH+IeIGFi4qDhIWKj4yNkZmdlJSUoJqan6Ktsa2ppKWtr6ysrLWuvrmtrqm1sLexq7G2rK+9wsLAvrq8trKutraxtK66u7OurKepp6unoqmtoKmooq+wuLSxvLq6urK0ta+8tLezt7e7t7mtrbCprLW5sbeytLe2sLu7vLu6ury1vLi0wbWsqqqrtLG3uLm1trSzsKymrrCqq7Cxq6yusLKxtK6qo5N4dnJlZ1tMUlBGTUhTV1JlXmdUUExcUUhMUkNBOTk3OTU4ODY2Ozc5Ojw6Pjk4Ozo6Ojw8Pj08RD45Njs7ODg+OTUxNTZCRkREP0A3Pj5DPjpBP0BAO0t/gomXmJSdlpabmIuSlo6XkZGVl5SZl5+bmZx8dHV2dXl1c3RudnJzdHV2d319gX56gXyDfoJ/fYB/hIKFj52RiYF/go+Xjo6HgoCBiIuFfoqQi3+HjYyLioeSioeGjZGTkZGEh319g4iMjouOiomQj46PlJSYkZWbmp2dqK6yr6+1tLOtsrW4sLy1tbGqsKqztbS7t7SztrS1r7i4t62noqassLCvtre3vrW5vLOysa61u7C0r6+yu7axuMC9tLS0s7izvLq2tLrAvbm6ubq+ubm5vrWysa+yr6q1tLGzsbSzrri4tb+vpKaoo6ussa+zrq6wsKytq6qroqKmqKKnrauqpaynoqeYeHlxZmVZT09NSVJNV0xPX15cTlVUYlFEVE07Pzk8ODk1Nzc1Nzk1Ojo6OTs4Ojw8Oj08Pj4/P0I9ODY6Ojk6QDs1MjY2QUZDQz4/Nz49Q0I5P0I/PjtLjpGTmJmVmZGTopiTkpKLk4uOkI+Vl5ablZSbhoJ9enh2dHRzdH53end2gIKDhouMhISFioaQiYeRk5aRjZaalY+IjI+emJaVkpCTl5qamJCdoJ2Tl5qgmZ2bo6CVkJugpKOak42IiIuJkZGOkY6LmJqPj4yUmpecnJufnKSstLm6vK+2tLi0tLK3uLmzq6+qqKy1srK1rrGrrqa3s7OxpaGotbCvrayrtbqyu7q6tLK3ur67ubG4sLmtqLK4u66ttLS3tbu2trm5vLe0r7G0t7a5s7e1pq2pq6ior6yprq2up6KxtLG0q6aop6Cjq66oqq6orLKwr6+pqKGeoaGjpqOgopqlo56ol3J3bmdiVUtUT09KQ1BLX2JYWlFcU19MSFFJQUA5Ojg2Njc3NTg5NDs5Ozk8Nzs+Ojg8PD0/QkBBPTs2OTk5Oj87NjM3OD5GQkJAQjk+PUBDPkBGQj44R5OWkZWTkpSQkZ+ZnZmVkI+Sko6Mk5aWko6RlZGSkIaBeXJzdXuBhI6HhZGTkpicnJiVkJWYo5yaoaeqqZ+clpeVnaKioZyZnpmlqKyvramnqqmop6GlqKirqamvoZufoaOjoJqfoJyUjZiUmKCgoaSem5qkp6Spq66spaOoq6+xtK6qrK6zr6ystLO0ua6urayqrLKwsK2wqKqmsrS0uK6qtrqwr6qurLC3s7i0t7W0u7y4tbWxtauyrKiys7uvrbGytLa1sbG0s7OvrKuvs7a0sayutKqqpqWnrauoqKupqqifqbOwqqeppaOio7CtqaatpairrayppaSioKWipaOYmZyVnqKippdudWVnZFZPWEtLSktTVHBiWWRXX1tcUlpQTEM8ODk6Njk4NzQ3NzQ4Ojw6PDg6PTk3PDw7PkM/QT47OTo5Ojs+PTg0NThBREVEQkM5PjtAPkI/R0Q+N0KSm5SVlZaVj46Wl5qZlZGKk5SSjo+SkYqKiY2Ul5qTjYmCho6VkZSfmpuin5+jnqGhn5ijpKelpaapqa2rqaKmpKilpKGfnqOjra2srairrq6qqqukoaKlqaenqaijopybm6SgpaijoJidmZ+hoqmnoKKirqyrqqetrqilpKmpqammo6iqqaekp66wr7Ovq7Crqq+yr7Czua+rqLCxrrCyubO0r62vtbCss7GurLW1tLSzs7CvrKyqrKusr7G0s7CwrrCwsKyqrauqq6alrrCysKumqbCvqaOkqaunqKaopquwq6mvqaaoqaalo6iwraqpqKKpo6WnpKGhoKKloZ2el5aYlJugpKmUbnNeamlfVVpOUk5QT1JkXGRjW1xZXFBZT0tAPDs5Ojc6ODczNTMzODo9OTo4OTo5Oj08PEBEPkA9OTo8PDw+Oz45NTo8QkFFQUNBOT47P0BEQENCQDdAkZ6YlJeZlpGHi5SSl5GIg4mLk4+OkI2Hh4SFlZmWmJeZlpqeop2anKKkoaCdn5qfoKGgpqGgoKCjo6KlqKmrramqpqOmpaCloKaopqWnqKapqKOnppmcpKWioaChoaCcmJmfoKGkpKKenpagm5qioqChn6CiqKCcn6GloaCmo6KfpKGspp6foaGkrKqnrKivq6e0sa6ur7WyrKqwq6mtrbWwrq6srreup6yqpKivsq+sq7Kvqqqpq6utqa6urrGxraqtqaunp6uoqauinaapqKilqKisqKilpKWop6iopqmsr6+oq6mhoqKlo6Opq6ymqKWjqKKhoKSdnZ+hoZ2bnZ+amZWcnKOqlG9zZm5yZF1dUFVPV09eZGRsZ2JhWlpSVE9NQTo9Ojo4Ozk1MTYzMjg4Ozk5OTk7OTk8Oz0/Qz5APTk7Ojs8QD0+PDk5PEFBRUFGQTo9Oz9BQUJBRUI4PYqWlJOYmpaPiISNjpGSjIiIiI+JiZCRjoqKiJubmZygpaKlnqKjoZqeoZyanZ6bnKOop6ugoKOYoJ2XnKGjo6WjoqKkrKilqaCepqmnq6mkn6Kgoqahpq2mpp2fn5+fn5manJyhoKGkn6GbnZqcoJ6hn56eoKOZlpqYo6KipJ+ZnKGhoqCbmp6goaSgnaejqrGorqusqaSqqquorKalrKqws6+rq6mwq6appaWoq6ynpqevq6Wnq6upq6irqqqrrailqKOmpaesqayoopykoaOmo6qpqKano6SnqKanqKepqKupoaKoo5yepqWjqKino6WlpqmgpJ6inpeYnZ+doqKlnpiUlZ6go5d1d2t2d2FfXFVZUVVWW2NecmBoX2NTUVhUSD48PTg7OTo4NTM3MzM0Nzo4OT05Ozo5PDxBQEM9PT44Ozw9PEA/Qz86ODo+P0NAREE6Oz48QD9DQ0VDOTyCmJmenZ2alZKKiZGRl5GQh4SJgoGNj4+Sj42cnZ+hpKmlqaeorK2moqKfmKSmo6Stsa6yp6asm56em5qjp6Cfo5+foq+rqqyoqKuwqaipqKGfoKeprbCyr6yjoqahqaWepKOipqClpKKlo56doJ6fpaKinp+imJWemp6fpKGblZigoZ2enJudnZuZmZWen6Oonp2iqKGaoaOmoqSoqaqoq7CxqKWlp6eopKWpqaqnoqWmqKadnqWloqClpaOlpqCjpaOjpaelqamqpKekpqKmp6SrqaenpKGlqKynpqWlo6OopJWdo5+bnaCjqaeopqGjo6mooKiioJyVkZqfoKGmopuXkpCamqCVfHdvfXlmW1tfXlpcVlxoZG9jbWloYl5QUEA/Ozo4OTg8OzYzNDMzMzc5OTs8OTs7OT49QkBAPTs9ODw9QD08PENBPjo4PT9EP0M+Ojk/PEI/P0FEQjk6gJ6kp6Kem5+gmY+ZnaCWloqGj4iEi4qTl5SRo6Wnqq6trLOys7S4t62pqqevtLKxqq6usbKusa2lq7OssbGpq6+rq6y2sLSwq7GysaOfoqqpp663trS0trOvrKuuq7awqbKxra6npp6io6ObnZyXoqiloZ+eo5ueoZqWnaScm5aZoqefoJ+joJuUlpmWl5qfoJmVnqKZmJ2dpZ2gpKeqqaiqraylqaSlqaeqqaqsp6SkpKOimZmhnpqaoaCfpaWYnqSmpKqooqelpaGqp6mnp6ejqKWmpaGkqKesoqekoaalpaOVl52Ym5mVo6elpaSfnZ2lo6Kqo5+amZiWnJyaoaGakJOTl5ibjX93cnZ4aWJbX15cYllgZG5ta21hX2RgUE9BQDw7OTs4Ojk2MTQzNjQ3Nzc6PTo8Ozk9PUI/Pj89PDo/OTo7PD5CRUA9OTtAQT5DPDs5PzlAQEBAQkM7OXuao6OcoJ2dop2Zn6KioJibmJaYkpSQm5qWl7S0rrW4s7S4tre0uLm3tbm4ub28uKqLnLK4vLS9urW7uru4s7q/uLe5u7G3r6iusq2inJ+qsri8vL27ur+0r7GztbS3t6+1tLWysKikop+gl5Wal6SqpqahpKOkq6WlmKGko52goaKooaOgpaGck5mYmJmco56cmpudl5uZlqWam5+hqKmpqKuvr66pqKmrrKytq6irp6WjoJyfo6Ojn6Cipammmpyip6Spn6GjoqKgpaanpqSooJ+ipKGjoqiop6OloKGopqalo5mbmJuTj6GknqKfmJiVoJuhpaCfm5udnJuamZugmo2YmZiTkYaAdnh5eGNbUllUX19hbGh1a3BnaWliWVNMQDw6Ozg5Nzk3NTU2Mjg1Njc4Ojw7Ozs7QD4/QD0+Pjk6PDk2Nz47QkZCPDg7P0NDRDw+OT43PkFCP0ZDOzhwkpqblJ6bm52Vl52doqajopaXnpaXl6GblJi+t7G4uba3t7i7l5S2vbu9vcDFtaK7mKC3v7+6wcm0nbu2sra/xcGooLazurGqrrSxsLG0tLa8vL68vL3Guri3ur20r7Wxsbq4t7Kzsqqmpp+YpKSnqKSupKurtbWus6CnqqynqqmlpqCnoKGmoZOWmJ2foqSjnZ6coaChnZekmpmdoKaqqqqtrq2tsLGrrK2sqamrrqimpaalpqSkpqaeo6eppKGcoKKjpqCio5+jpJ2foqWgpJyboZ6fo6GhpaSlqaOkpaKkp6ehn52elpOcoJiZko+MjJeWn5uWnJqdnJqSlpSUmJOQmp2YiouHgIB8gnhhXVlTYWhgZnNvc2l0Y2lkYltMSz46ODg5ODg5NzM0NTI1NDY2OTw8Oz08P0E/QEA9Pj44OTs4Njc/OUJFQzw7PD5DREM9QDs9Nz1DQ0BFQjw3Z4yRk4qalZiblZWYm6Knq6aVl5iQlZmhnpeXvrWztLu6ubi5woeYt6u4u8DCxbOjw6e4s72/tMTHvbS7uL62wMTErqCworW2tb2+wcPGw8O5vb/AwL2/xL28ur2+tKeqmLHAvbi1ucCzr6+qqqitp6ekr6eqtLyxtLWor7Gwr6yqoqajrJ+fpquXmqifpaWfoJydoKuwsKyiq5yYm6Cor7Kys6uorre1sq2tqaalqKulpaStqaShn6Cnnp6mqKmmnp+anqGlpqmcnaObl6KmmpuanZ+cmqGcmZ2eoKijn6GfnaWioKOioZSZmpmTj4qLhI2Qk5uPjpiVm5eYkJORkomNl5iYk4uKi32AgIVwYGFeXmpiYm53dXZubFtiUVVcTUc7PDk3OTc5Ojc0NDQxNDM3Njg8Ozs8PEBAPUA/Pj8+Ojo5Ojc6Pz5FRUU8PT1AQkJCQUI7PDhAQ0NARD87NV+MjIaFlouUlZeYl5ifpqellpWWkZebn5ual7mxtrO5vLy5urWqsryxvsG0vMe5uLuuv6fGw7/KxsnIxcXJvMLHx7+xsae8vL7FxMbJx8XGu8TAxcbAua+9vMC+vrOrqoyzu760tbfCuq2vsLWqq6aqo62kp7G2q7WyrbOtqK6vp6awr7Ktqq+zpKu1qaeopKCgnqmyuL61tbWqqaausre4t7apq7i8ubexr66noqOop6SfqKOfnqCZoZydoqSnp6GelJuaoKGlnqChnpajnZSQlpiboZqflpORlpSin5qenJudoZ6kn56VnJiPkpOPjImTkJefiZCWkZuUmJGRlZaDjJWXlpKLjIh8f4N/amZoYWtsZm51cXJ1cWZeX1xSSUU/Ojo6Nzg0ODw3NjU0MjMzNjU3PDo7PDs9QD4/QD48PTk5OTs6PDw+QkRFPj49QENDQ0REOjo4QUJCQUNAOTJbk4iEjZGKi5GRlZCSmp2fnJOSmJSdnZqXmpW2sbm1tb6+tri1uLO8vMTEusPHwb+0s8XFxr/CzcfLzsvLx8HDxsfIysXExcO7vLzBxcHFxb/DwsbFwLGTvrq/w8K2trqptLO0qauzu7uxn5uxr6ykrK60p6qpqKqtrKmlpZ6pr6uyu7q4u7e5t7O5uLOurLO0qrC1ub3Bur6+vL60urm4u7qysbS8u7q7s7Oyp6Smq6uioaCdmpudmpyXmpuenJygnZaclpuZnZ6io52UnJCNiY6OkZ6bnJWNh5KLmJiWmpybmJybnp6cmp6UjpiYmpORmZeeoZWYmpKXlJSRlJqYk4+TnZaSi5F+enx/dGtsbmNvbGhxd255aWlhXGdhUUZEQTw5OTc2NDQ6ODQ2NTMzMjY1Nj05OTs7PT47Pj49Oz05OTs7Oz89QUNBQkFAPEBDQ0NFQjs4OUQ/P0BCPzsyV5uQkZCQh4WSjo2IjZCTlZGPjZSUm5STlpqRs7e4uLi+u7C1sri2tbbAw8G+w8LAvru+u7u8xMzEzNDKxsbAxcfLyNTLysjGv7u7vsS+xcjGxsPEw7i0wLe0vMHCucK3t7/Au66lrre8t62co7ewpq20tayupaWjqKSgoKWZqrOyvsG+urm6uLW0srG0tLO6wL7Av769u7u9vsDCt7a3tru7sru+ubi4u7a3tKyoqamrpqijnpOampyYkZKZl5GRmJqXnpiWk5acm5+elJOJiX6GiIuWlJiZkYmVkZeWlZmbmpaYl5idnpyhmJWZmZuYl5ybn56jnJ6WmJeTl5yZmZyUlp2UlpOJdnl6e3Zua2lndVpmcndzeGVmXWRbUlhJRj87Nzg4NzYxNjk3NDQzMzM2NDY7ODo8Oz08OD0+PDo7PDo9Ozs+PkRBQURCQEBBQkNDREM9OTlCQD8/QD89MkyWmpaSk4yKmJCLi4yNkpKKiIaNkJiKj5CUl7O7tba/vb2xtrjBvby0uL/Bsbi3vsHFvbu8wsbJv8jOycHEwcfKysbKxczIzcbIxb/DwMvNz8nGw8PEwsS9uL7Bw8DEvsHPz87Gq6+2tLWroKe0s66ruLWzq6mjoq2prKatn6y1tL/Cvrm4vbawrausr7W0ur7Fv7u8urO5u7i5ubWtsLS9u7G/vLiytrmzubu0ra2orKyqqaeXnpualY2MmJSTi5WWlJyZl5WWmZKYn5mQiop+iYqKkY6Vl5OUn5mWkJSZmJmWmJOUm6GeoZiYmp2ZmZaenpibopqdnJuYmpuZlpeXlpyZlJyYfoB4eXV1ZWVpaWddaW9teHdiYmBgXVhXRkU4Ojg6OTc5NDQ5NzY2NTEyMzM0Ozo9Pzs9PTo6PTs8Pjo7Pz48QkBDQkJFQj0/Q0NDQ0RFQDk6QkFBQj5CQTVCkJeUlZmSj5qQjpKRjZSVi4qHjI2UiImPkpq2u7S8xsHEwr3BxcLAtLO9v6ywr7rDysPCvs3IxbfByMW/wcLIy8rCwsTJzM3Pz8zDx8bIyMjHycfFycfIx7/Fx8TEx8jK0s/SzLy4trS4uMG+vrq9ury6vKytpqm7urm3wLK1uLLAxrq3t8Gzsa2tqau1s7u2w7a2vbWxt762s7e4sLW2v7uwvbq0q7CxsbO8urOzrqutq62xnaOjoJqQjpiXlZCclpaYlpWSnJmTm5+clpGUjpWQiYyQlZOUm56YmZKSnJedlJmSk5aZmJ2VnJ6do5yVnZ+TnKKcnKCfnaOemJSVl5ebmpmgkH99cXRxb2JgZ3VnaWl0bXhsXWRbVV9ZTEhDNjw5OTg4OjUzOjY2NDQxMzUyNTs6PD47Ozw9PDs8PTw7PD89P0I/RUFCQ0M+QEFARUVERUE7Nz5DQkI+Q0I4O4+akZaalJKUjZCUlI6VlI6Pi4yJk4uIkJObt8C6xsXEw8zCwcS9vrWvt7uvr7O6wMfFxMHMy8W2ucDCwsTHytHLwsPExsnFzdDOx8zJwsHGwcvKyMbMyc3FxsXDxsXJzdDNz8zHxMDDwsnNx8XBxMfBu760sbCwwb6/wca/vri3w8K6urbAvrWyrKmvsri+tMC0tLi0t7nEua+8vrm+v8K/tbq2q6qsrq+wt768trSura2utaSlqKimmpycnZyeopydmZOQkp2VmKCdmJiVmZmZl46MlH2QkJefmZmYk5GToI6Nko+VjpCUlaKdnKSem56elpyjoKGipKOkop6amZubnJ2enIN9cnx4cGdgamp2bGlkdG5zYlxiVFdUU01HOjc7OTk3Nzo3NDg3ODQ1MjM0MjU7Ojk+Oj08Pz04Oz05OTk9PEBBQEVCQUJBQT9AP0RFREVAPDo+QkNCQENBOjSAoZeUmZiVkImUk5aTiZGMlJGOiJaKi5CXnMXLw8O8wMPHwbm9vbu4tre3rrK3uLzAwsDCx8bHurzAwsTHyMbSycHDw7+/vsTLyMrLyLy7yMfJzcjDyMnJxcXDwsHCx8fIysfMyMfIzcbMz8W3wMDAwLu7vbWzs7+/ub/DucC3u8G8uri7ub27srCvsKy5wri9ube1t7q9xb24xsjCwcLGwr28tamurrCwr7O6t7m2sK+tr7OppquprqannqSlo6OjoqCblZiekZecl5GRlZeZlZmRlJiSlYyYo5qcnp2FiZ+TfJKWlZKUlJennaCipJ+en56foaGkoqKjoaOinJ2fnqOhppl5enl/cm9mZWdjamRham1ubl5YXFZVTlBKRjk5Ozk3Njc3NjM3ODk1NjEzNTI3PDs8QDs/PDw6ODo8OTk4Pj1APz9GP0JBQz89QT5ARENDQTw5PENBQ0RBQDozbKKdlZedlo+PmJiZmIiSjZGVkI+Vjo6TlpbKy7u5urnBu7q3vsG8vLu5sa61uri4u8S6vsC+vru8wMXBxsK+xsG5u8O6uLm8vsHGwca6ucnJw8XEwMTBwsHEwcO+vcLAwMHCy8PGzMvFyNDCsL69uLq7vL63tLC5vrO8vrG5tbi7tryztbm2uba5t7GtusG6vMG/t77Ev8bDw8fHwrvAwr/Cv7iys7O1tLGut7S3tbSxrK2xp6Wlp7CtqJ+nq6ajqKWmpqCgn5SYmZSRkZWUl5OYl5qhnZ6hnKGdoaWglpSbkZeXmJqTnpmZqaSlpKWdoqCanqCkoqOcoqGjoJ6cnp6ppaiVfXuDeG5mYWRiYWJjY2piZmJaWVlcWFFORT07OTo7Nzc5OTY0OTk6NTMxNDUyNzo7OkA9Pzw8OTc3Ozo5Ojw+QD8+RDxCQURAPz49QkRCQkI+OjlCP0FCPT44NVmfnJiTmZaRlZiYmpeQkZCQk5GTlJKSkpSUxce4tbq5wrm5vMPFwri7ubGxtry6tbnAu7u5tre0tLW/ur2/ub26urS/uLW3s6+7vLfAt77Cv8G7v8C8u8W+u8HEwL6+uLzBwcu+vcnEwMDKwLHBv7u4u765tbe0uLy0vbi1tLCzvLG3tri/tr25vb65t7q+u7/Axb29y8PGw8TAw762ubq2v7i7v7y4trOyq7CwsrWzs66sq6emnqeurauiqKumpqqjp6iqo5+Ym52bmpicnJiXnJuhpZ2anqGhoKGmoJqbnJiboJ+dnJ+coKiho6SknaKfmqKgop+el6Shop+dmpieqKWhi3x5h31xY2BiYmdqZmZpZWldVVVTWU9TS0U4PzY7Ozc3OTs2NTo7PDYzMTM0MTc7OTg/PT47PDs3Njk5ODo7PUA/PkA9PT9CPjxAQUNDQT9DPTk2PEBBQDw9ODdJlJibj5OUkZWYlZGWkpWRkJGUlZSTkpKYlcHCwLq8ub62uL7EwMKxvbqytLO4vLW3vMC8vbS0sbC1t7W6wbi+uL+8vbe1t7CuuLa5v7vAwLfBvLvDtrrIuLa5u725ura7xcXKvbnFwL+8wb64xr3BwLzFuLa3tLi2tru7uLa0t7q1tLi8vbm/ucPAwLu5vLu+vcjEvcfEw7rAvb62sra4srm0usLCureysaysq62yr7Kur6ijpJ6rrKyqpKakpKiqoqemraihoaGmn6Oiop6bnKKfoKOdnJuhn6KgpKCem5eZn6GdnZ6eoaWkoaKioZ6ho5yinqCZnZijn52eoJqZoKKmnYR6g4B4cG1lZWZvaWVrZ1hYTktLSlJJTEhDOT44PTs2Ojs5Njc8ODk4NjA0MzE3OTk7Pz0+Ojw6ODg5PDg6Ozs7PD1BPj09Q0E8P0NDREA/Pzw6Nz5CREE/QDg4P4mYmoyMkI+Tl5WMkpCakpGXmJaUlJKQmpTDvsbBwby8uLi6v7e8scK2tLyxtLa4s7q9v728sq2vrLGwt7y2u7zAxLm3t7e2urm6u8C9w8C6xMK+x7i5uK23tbi6tLezu8XGy8G7xsDAv728v8nDxMW+xri1srK9uLi4vrq6uby7urS3u7q5v7zEwL+5uri/ubvFxr3Fw8Kyur27sa+2uLO3s7q+wLm2rLGrrqmqqa2qqq6mpKWnrq2ppaOio6GkpaWmoqato6Klo5+ho6Gcmpyhn6CloaCenZygnaWgnpeVmZ2fn52gn6KmpaCknpybn6Ofn5mcmZ2epJyWnKOcnqGcppZ+f4Z8a25wZ3Brc2VibF9bVEhLSkRKQkNHPzk7OD08Nzs7OTc4Ozc8PDYyNzUxNjk8PD08QTs8Ojs6OT45Ojs9PUA+RD89PkRAPz9BRkQ/Pzw9OTc/QUNCQEI5Ojl3nJiLh4uQkpOWjY+TmpOQnZiSkY6QjpiSvbfHvsO+vbu+vL22uri9ure9s7OwuLi1uby8wLeqraSusLe7s72+u8S3tri2t8C/xLzCxcXHx8rJxs/CwbivtbW8vri7sr7ExMrFwcnDwr+/vr3HzMfHxMe9tbW2wb26u7/Cur/Bv722t729vcHBwL+8ube8wru3v8W7wr++tbe8vK+vt7awtLO6ubq7r6mtq62rrKaqoqeuqKWqra2vp6Sgn6ajnqKjqKOjq6Oiop6dm5ublJaZnJyfpZ6fnpmYnpejoJyXmZqZmqOjop6jo6egpqCbnaCjnp2WoJmcoKCblJegn6WcmKKQgYaBcWVsaW50bndjZ2FbYlBLVEhFRUNHQzw7OTg9Ojc6PTo4OTs3PD01MzY1MDY4OTo8O0A9PDo+PDk+OTk9Pjs/PkM8Pz5APz0/P0ZEQEE/Pjo3P0BDQz9BPTo4ZqGYj4uNlZKVlY6PlpmVl5uVjoyMjY+bk7m2wbS/vLm8w8C+wLq1trKywLivsry8sLe7tru8q6qjsLm9vrO8vrzFuLK4ub3HycrDx8jGxsnIzM7RzMrFtbrAw8i/v7W/wL/Gxr/LxsO/wbzAw8zKx8XGwbm9vMS/wL/CyL3Hx8XFvLrEv7vBv7rAvLu7wMS9t7nCub69t7S2uLqur7WxsLCytre0t6yurKqsrKuoq6Gms6qlra+trKippaOkp5+io6Onoaeiop6cnZyamYyQlpeZnaKZnpuVkp2UoaCdmZ6fmJimpqKfoqKmoqeloqCko6GbnaCbnKKfl5WVnp6kmpafiYGDgXRvbGx0a2xuX2JeYWFNSE0/RUA/REM7Ozo6Ozo4Ozw6OTw+OTo+NDQ1NTE5OTo5PDtAPD89PTw4PDs6PDs7Pz5DPkI+QD89Pz9FRUJBQj87Nj9CRUQ9QUE6OlmfmJOSlZqVmpOQlpeclZuZlpSVkZKTnZm2uLaxuru6vsG5uca7trWypb69tLbBv62zvbS4wbGwsbS8w7y6ur68xL+3vb+9x8zGx8nGxr/ExMrIzMzNy8bCw8vOwry5vbq5wMO/yMbEwcG/xcDKycPDw8O5w769ub+8wsbCyc7Hxr66xr26v7m3wLm5vsDCvrW0vLi2u7CvsrK1r7Cvrqyus7CzsrirsbKxqrCrq6yrrLatqKyusqarrKmpoaWgpaakrKSmoaChnqGgnaCMlJeTm5+mmZ6emZOYnZ+gnp2eopuYp62ooqSgoKKqpqmhqKGlm6CgnZ2jn5SYmKKdp6Gfm4J7eod6bW13e19wY1tdX15TST5CRUlCQz5DOz42OTo7Ozs7Ozs7PT05PTU2NjIxODo5Ozs6QTs/PDw+Nzs8Ozw9PTw9QD5BQUE+PkFCQUVDQkRAPDY+Q0RFPkJEPztTmZuZmJ6dmqCalpyZn5KdlZ2boJWWlJqYur20sLu8wcTCv8XGura5sqO7vbS3xLuwtbq1ucS4tLy2ur3BvLu/tr/Bv7y/usDLwsfIwL+8vL/FwsfLyMHDwMDJysLAu7uwtLu9wMXGxcW/wMK/y8fCwMjAusK7urO6usG+wMrOysS9tby8ub+5ubW1s7/Avre0s7S4rbeqr7CwsrGvq6+nr7ausrG5rra2uLSzsLGttrS6sa6srranrLKsraSjoaenqLKrqqWkp6elpaCml5ujn6SmraKeo6KanaWiop+foaWenrC0sKSlnp+kqaevp6mgq6CiopqipJ2anqGmp6+psZWCe32Cem1zeHNncF1aXlxZUUVEQ01JQUQ9Rzo6NTk7Ojw8Ojs7Oz0/Oj01NDUxMjc4ODs8O0I8Pz46OzY6PTo7Pj0/QD87QUFBPj4/QkBBQkJFPjo1OkFCST9AQkA7TJqdnZ6fnZienZmampySoJWbnp+blZGRlsW+urbDvMbCvr/Ixbe1uLe2ubu0r7e2srWzt7m8u7a7u726w7u3vbe5wLu6uLi1xcHDw7u5s7S6wb2/x8C5wLy+xcS9vrmysK64t7/Dx8PEvb2/v8PDvr/HvLy/tLSutbW8vr/OzcvCt7K4uLi9ubuxtrLIwLu2tLGwt6yzqbCtrbO3r6uuqrG1r7Gvt7O6usC/tre2sru6wLWyrbO3rLC6r7KloqWrrK+5s7KosK+xr6qiqKGkraitrLOun6inpqWmq6Sknqaqo6ayuLOrpZyfp6anrquqpbClpaWbpKOYn6exrLW4sLKOhHl/fHdsdXpwbWhcX19ZU1BBRUhHS0BEQ0g8PTY7OTk8Ozo6Ozo9Pzw9NTU2MTM2OTg8QT5AOz1AOzs5PD04Oj08QD46Oj49Pj09PkBCQkJBRD03NDU9REc9Q0I/PEWUnqCgoJyXmpiYlZmdmZ2fmp2bnJaRj5LDwMK9wrzEvLy7xbu3s7e2tru7s6CWtayvsbS0tLa4ucHAt725uLm2tb+ztLK4sbvBwMO3t62wtbi4uMK6tLu3u77Au7u8rq+us7K5wcLEw768v7u6uLbBwrW/urWur62wvcC5z8rJw7GvtbS0vbq+ubq7ysO7uravsL2xuK+ys7C3vbaur66wt7CsrLK2vbzEwrq9t7bAv8G3tbC2srGzurGxr6err6u2v7e1qbqztbmxp6uop7ausrG1uaisrK+qr7CqqKessayytr20saykqKuoqKusq6i2qaaonqadmKOuvLG7wbSmiYF8gnpydnZ3bXBgXmVdW1RKPD4/RkY9RkNDOTo1Ozk5Pjw8Ojo8Pj4+Pjg4MzE1Nzg5Pj9BPzs6Pz08Oz09OTs8OTs6Nzs+PT1DQT8/QUJEQkE8ODU4PUNGPUREPzw/iZ2en52Xl5WUk5aZnpubmpuYlJ2Uio6Owb7Dwr6+vrm2usCxtbGzt7fCtbOrrbOoqa61r620trnDv7e6t7a2srTAtrK0uLO6wMHDubeysrK0sre+urO1sry6vLa6vrK0tLSwuL7DxsTAvb+5s6+yvLquu7Szpquorbq+uMvCv76sq7Cvs7q3ub67wMXBu7y3sLXEtb+0uLu0u8PCs7a2sbisqaWrsr23v7+7u7exvL28trGvq6uprbOvsLCrsLSpuMC2sqm0tbC3tq2spqu7s660uMKwsbG1sbK1saywsri4ubi+tLGzrqyxramvrqqyuK6trainoZ6ptr+4ur+wlol9gHxxc3d0dnFsXmJgW11OSEE/PUhDRk1EQDc3NTs6OT48PDk4PT47PT86ODMyNTc2OD8/Qj86OD4+PTw5PDk7Ozo8Ozs6PEA+QkI9QEE/QkI/PDs3OjxBRD5CQz8+QYqgm6GdlJiVlZOYmpyWm5WalY2bj4SIhru0vb+7vLm3s7y8rLOytLS2wLXAr7Kzqqqxt62pubO3wL27vLi2uraxwLq3ubi5u8HBxMO7u7a0tLC2ura0sqy8ubi1uMG6uLOxrLe8wcfDv7m6ta6lrLOwprCtqJ6gn6WttrXCt7a0pairqLC2s7K6tbu7u7W4trC1xLK+vL+8ubrFyLq9vraxp6SeoamxrrW4trKwq7S3trGopp6gmaWmpKynq6y2qa+6sa2kpq2lq7GrrKmtuLawsrjBtrGxtbGvu7ayt7W1sry1urKwsbKutLKqrq2nuLWyta2uqqiosrq9wLa0qY6Ce392b3tvdXJtYlxmWFxdUk5NQT5KQkBKSUA2NjU7Nzg+Ojs4Nz4+PDs/OjkzMjc1NzU8PD48PDg+Pjw8OTk5Ozs7Pjs7OTw+P0E9PEJAPz9CQD47Njc6QERBQ0E/QUKJoJ2loJSWmJiVnqCcl5uYmZGMmYmDhoS1r7S7u7S1sLG2uq6wtLOvtbq1urC1s7GttrqurLyyuLm3u7+9ub7AtL+7vLq4vsK8wsrHvsC4ubaytLaztK+su7q4trnAw7aurqqytry9ubaysa2tn6Snp52jpp2WmZman6muuayrq5+lqKSrrq6nr6yvsbGtsa6usLmwtLy+uLm4x8W8vLu4qaKcmJufp6assa6yqaapqq6popqXl5GcmpijnqKir6ekrKaompqemqGnp6anqa+2squ0tq+qsK+xqbm2sbWxrqy3s7avrquuq7S1ra+rq7GtsbKoraurs7W3ur2wq6GLeoJ5cXZzbXRpa11balRcXE9NSERGTEFGTUY4NjY1OjU6Pjg7OTc8PTo7PTo5MjM2Nzc3Pjs9Pjo6Pz48Ozw6Ojs5Oz47PTk8Pj1CPDtAP0A/QT8+OjU1OkBFQkRBQEJBiJ+ipqGYm56dmqWpmJudmpmUjJmHhoeGrq2uuLmxsqiur7iyq7CwqrK1ubm+tbK4tLm6tbm7tbWztbu8wLu+wLS/ubm6sbrDvMLKxb+7v7+5s7SzsbGusLm5try4u7+ysrKusa65r6qrrayjqKGdnZ6XmKGVkpWXkJifqK6ko6Sgoqeio6mpoaanpaqtp6ynqKesq6yyu7SztLm6trK2ramgmpaWm52fq6yrr6Ojo6GpoJuTjo+Qk5KSmZaanaSloJ+ep5iVkpSYnqSjoaWqrK2iqaqppKmtrqW0sa6xraqprq+wraWmqqSos66trKmmpqmrpqqnq7Ksr7Oxq6mWgX+Bd3J4aHRzbmRUYGNXXFFOTEg/SFFDTUM9ODg3NTo3PD46Ozw4OTw7Ozw7ODI0ODk3ODs7PDs4PD0+Oz08Ojk8Ojs9PTw6OkA9PDw7QD5CQEE/Pjk1ODs8RkFDRD9BQYijpqKjnqCfp5+oqpufm5yZmI6Xi42PjKqpqLGvsK2lp6ayr6mmq6CvsLu1vby3wMG+vLy8ua6tr7Kyurq3t7W1vLSvtKu2urjAxMG7tby9uLKts7CvrK63trK0tK+qpJ6bnJyeqKifoKipn6GnlpuXl4+dk4+Qlo6Xm6SooKCioqKlpZ2jo6CepaCkrKSmqKSio6OrrLOuqa6urqeqraisoZyamJmYm6moqquepaKbo5yUkIyOj5CTkJaVlpifnp6amKaXk4+Slp2ioKWjpqSnoKKko6Ghq6uksq2qrKyno6yuraufoaKkpK+srKmmo6KqpKqqpKmrpqmsq6agiHmDfHZ/eWJ2bG5cUGhUUE5HT0xMQ09RQD47PjM5OjU7OT07Ojk9OTk8Ozw8OzkzNjk5Njo7Pz06ODs6Pjw6PDs5Oz07PDw9PjxAPT88ODtAQEE/Pz45NDk8N0FDQkQ9QEOOqqSjoqGinaqkpqimoZ6dmZ2PmJWTkJWnpKGmqKmlpKChp6uhnKKbp6u1sry9wMLCwL7AubWnpayqqLWysbCur7Knpq+jr661wbq1t7K3trK0q7K0rqqrr7CytK6lnpKYlI+ZoJ+ioJykpZ+eqJSblpeMl5GNkJeTmJ2iqp+fn6Cjpaicn6ChnKKfo6innKehoKSfrKisrKCpq6agpKimrKOdnp2Zl5qrpqmwo6WnnqCclZOPj5GQmJCWlZiXn5ibmZujmZeUlZqdoJ2nqKWgo6Kho56doKmqpa6upqipoaKqrqqnoaCio6msq6eppqShqaKlqaalpKKmpKijkn19gHV1fW1re2RoVVFjTUlIR05STUpNRztEQDwyPzg1OTs+Ozk5Ozg6PDs7Ozk5NDg7ODc7Oz48Ojk8Oj07Ozw9OTw8PD49PUE+QEJAPTc6P0FCQEA/ODU1PDpAQ0BEPkFGlq6koqWeo6KpqKipqqWmnp2imJiZmZWbop6bnqOioKOgoZqgmJiXlqGorK62t7q5ure3u66ooKGpoaCtq6qmqaSpo6SupaystLy3rLKxr7Gtta+vs7Wqp62so5yZlI6RlpeZmZ2go6KbnaWemqSXl5eWkJKRkZOal5ugpKqeoaGepqeqop+gp5+dn6SnqZ6jpp+qnaqtqq6nqLClo6Smp6ymoaShm5ier6iusaqlqqqgmpiYmJWTlpqTlZWZlZqXl5ignpycl5uhmp6aoqeln6GioqOcm6Gmp6aoraOppZ6kp6mkpaWhpaSsrKmmq6eioKSjpKenoaCgpaKmoIl7gH12eHxkeHlgYlJVX0hJSUtTVElSUEw5PkE2Nz02NTs6PDw5Ozs4Ojw9Ojs4NjU3OjY5Pj0+PDk5PTk9PTw+PTs7PDo+PTw/Pz9APT03Oj5AQEA/Pzg2NT08PkFCRkBAR6CupKaroaOqrK6tp6ypqKCipp6bm56aoJyalZmfn5uen56WlJOXk5OcnqOorq2sq6uvqq+pn5eepZ6epaakoKKfpqCirqusrbWytqavtKupqrSxsLC4raehnJ6alJiampGOkpaRjI+OlJminJejmZqXmJmUmZiWnZufpaapoKajnqeurqumorGjmqSmpqqioaqiqaSosquxsqu6qKarp6urqaysp6Cgo7GtsrC0qbGvopmcnZ6hmJubmpiZm5SVmpaYnKShoJqjoJqcmZ+kop6gn6KmnZulpqWkpaijp6OepqOinqaloqWlqKykpq2noJ2dn56gpaGenqWgppmBe4F8dnZzaIJsZVtTWllNUUpOT1RMUkxBNz5CNjg8NzY6PDw9Ojw5ODo7PDo7OTc2Oj01OTw7QD03ODs3PTs9PT06Ozw4Pj09QD5BPj4+ODg8P0BAPT83NTg9Pj1BQEZAQUihqqCrq6GkqquwramtqaelpaWkoKGfnqWXl5SYmZ6YnJ2blo+UmZKSnJihnaqipqCep6Gkn5ySnKKbn6Gjnp2gn6Ogoq+urK+xrLanrbGtpqawrq2ssKefn6Ogl5GUnKGcmpiSk5+doaSbnpuWn5qfl5uinqWhnqSfpKitraisqKSstLe2sKe0rKKtraOvpaSmoamorrWzsr22vrCssa6tqaq0sbCnq6iytbezt6yxtKOgnaWfq6GhoqCfmpiVlZ+bm5ikoaCdo6GgnpucpaCfnZyhqJ+fp6meoaOkoKagnqehn5ymo5+ipaOooKmrpZ+dnZudmqainpyjnqeQgYJ/fHh1aXd1XWxaUmBIUVVIRlVWSkJNRz1KSDhFPDY3Oz49PDo8OTg6Ojs6PDk2Njo8Nzs+PT8+OTc9OT47PEA8OkA6OkA/O0A+QUA9PDk3Oj5APzo/NzU4PT4/QUBEQEJGnKueqamipamprqimqqWmp6aoqqGlpKOmkpOVmJacmpqcmpWTmZuOk56ZqJ2unqeem6GdnpqakpienKKioKCdop+fnp+pq6esqaq0q6utq6WlqqirrKqloJ+akpKUmJmWlpaMiIuPlZ2dnZ2elp6apqCgqKWxqqeuo6uttrC0srGutri9wLqttbSwt7CutKmmpKWsqbmztbvDvMPBtrq2q6+xube8r7OwtcG8t7yysrShq6KpqLGpqqinp5qYnZmppqCZp6CfnqenpaSenaqhop6bn6igpKetmZ+jnp6nnqCmnpycoqGbo6KhnZympaWkn6KZnJukn6CboJyjiYWEfnZxbWl2bWhtXFhbQlZNSkdNR0JGTTw+TD00PDk2Oj0/PDs6Ojg4PDk6Ozs8NTQ6PDg5Pj4/Pjg4Pzk8Oz0/Oz1BPTo/PjxAPj8+Pz08Njs/QT07Pzg2Nzw8QERCREFCQ5WqoKapo6mqqKmjoamgpqinrK6lqaWpqpSSl5mUmpqanJiYmZyamJqqoLGit6OwpqCenZ2XmZaZnpucpJ+fnaSdmp2cpKKko6Kqr6ynqaOgoayvrqqrp6Cfn6Kjnp+em52blJSVlZ6emJSGnZqhm6ukq7KwubKysbKxur28vLm2uMO+v8K/trq6wMS5vbusrqexrbHCtrjCxsDIysDKv7C5ub25wr24s7vFw7zCurazqbKtqrK0r7Ouqa6jnaumtbGsoq+loKKvsa2wpKSvo6GgmqGnoaSqqpmdoJmao6CmqKGcnqKemaSenpiYo6OhpJ6mmZuipJ6fm5ubnIeFgXt0cmtrdXJwaFdbUUVUSERJUEg+RUE0RUg5NTs9Njs8Pjw8Ojo4OTw4OTs4Ojo4Ozw3Oz49Pj02OEA5Ozs9QDw9QDk3PD07Pj0+PUI+Pjc6QUA+PD45NTg9Oz1DQEFDQkGRqqGlqqelqqimn6KnnKasp7Gyq62jqayVkpWalJecoqGbnqChnJ+psqu7sr+rr6ylnqChnZyYm5+gm6Cfn5eknZWbm56anpyfpaannaCgrLGvp6Sko6Gfpqynn5eclZKanZmVjIqGiIZ5bYigpKKrrLS8tsO+vrO7wcPCxcC/wsbGxcPIwsDFyM3QyMvDsre1vrK+xbu+zM3FzMvL0sa+v8DCvcfGwrfDycjCwMW9ubO5urS7t7C1sqq6sa66tr66uqq3rKqquLq0u66tuKOmop6npaKjqaaZm5+Ymp2nqqegoaGkmJSjlpSakZydn6Sep5+en6KdmJmUmJSIhH16cmtkaW94amVaW0ZKTEREU0xEQkQ3Oj87NTQ5OTc5Pj87PDs7OD48Njo9OTw9OTw9Ojs9Pj4+NztBOj45PT45PT44Nzs6Ojs/Pz1CPj83OkFAPTw9ODY2PDo8QT9BQUE+kqugp66ooqulpKKipaGlqquwsq2upKmmlJWVmpaUm6SmnaGqp6KrrLy8v8PBs7K4p6Ghq6qinZ6hop6cm6CSn5+Qlp+ZkpqWnZuZo6Gvs6mhm52dn5+al5iYk42PlpeUj42Qi4KDgndzcW5wj6atrrS5xbvNx8u/wszOzczIydHMzczHycXGzNDS1c7Tyb3Av8O7xsXIxdHTzNPP0tPMysLFxsbKx86/yNDLxsTGxMC7wsC+vr61vbOtvr/CwsbExsOtvrixuLzDwcG6vLy1rqenraigoqmlmpagmpmdqKupo6SknpePm4uQmYmVmJugn6OdnZeempOTi5WPhYB5dHNlYmdyb2ZeWllDTkxDRVBJREJANTU1ODlCPTY4OkE+Ozs+PDk+PTc6PTk6PDg8PDw7Pz8+PD0+Qzw7OkA9Ojs6Ojg4ODk7QT48QD8+ODtBQTw7Pjc4Njo8PkI+Q0FAPpOvn6ivpqiro6KloKampKuoq62qrqKqo5Kcl5ebmJujrJ6frqalsarFxszOzb+wwqmlqK2tqqGdo5+cnZqpk5mhkI6gk42UkpeZpLGxq6SgnaCcmZeVk5SXkpCPjIeEhImHg4CBgYB5cnJvbHmktrq5vsvB09LTyM3O0dPR0tHQ0dHNzs7Qxc7U1djS183Gx8nMw8XKzsrT19HX0tTV09PIzMbMzcnSzM3TzcTGycnAxcvHyMjFvsKzs8fEy8rKzsXJv72+vMHHxMzMyMnAw7+tr7KonqKqo5qTnpyYnqaprKSlppaXipWFkZSHkpKSmZualpiQm5WQjIaRi397cnV2Z2Jod2lkVldRRE1GQElRQj1CPDoyM0A8RDw3OTxCPTs9Pzs7Pj05Oj48Oz44Ojk5Oj86Pj1APkA8Pjs+Ozk9PTw5Njo6Pj08PEA/Pjk6QEE7OT45Ojo6Oz4+PEE/QT6QrKKiqaanqKSfop2qqKOso6OnpqyiqZ+Uo5iWn56dpK+boLCrqKyxyc3U18/Gu8esrbS4rK6jn6SjnqCkrJuWqZaNl42MjZemsK6lnZ6doaWinpuWlZaUin13cGtlYmhxb3F7hYqAdnBucXRwhbPCvsXR0NfW1tLWzdTW19TT0dPU1NLP0cPQ09bX1dbSy8nO0MvGzdHJ0dXW2dXX0tbYztLJztHMztDL0s++xsbJwsvLy87PxcbGtr/JvtLMy8/Fyce+wsLHzszP0M7MysfNuLe7qJ+mq6efmJ6jnp2qpa2pqKiSlYiQhIyRho2MiJOVmZCWjJiSj4aHjIR8eHN2cGNgZXJiXVJcSUpGQUVIST47QDg9NDU4NTo3Njo8QD07Pjw7OUA7OTo8Ozs8Nz09Ozo+Oz08Pjw/Ojo8Ozs5Oz89OTU7PD48PD0/Pz46O0BCOzk/OTg7PT0+PzxBQEQ8hqugnKegp6Oim6CbqaSlqaCfoaGmn6ifmKSim6mmoqasmqSwsamotdDU19rSx8bLtLbCxrK2qaKlpqGiq7WnmrGhlpWMkKatq5yVmKGdm6Gin52em5aKeGlkYV9fX19eX2BeYmx1c3Fwb2xycXWSxMfG1NXW19fT1s/V1NrU1M/P1dTU0dHM0c7T19bT1dDP0tPRydPQx9DY19jQ19LX2dXVzM7PyczRy87Pv8XBxsXOzNDQ0cjLy7/Jy8XTzcvOx8PJxsbIy8rU09DUz9LM0sG5xbGlqLWup5qorKWdsqiws6ysk4+TjoiLjoOPi4SQjpmNk4+Zj4+ChYx7enFzdG1hY2ltX1ZQX0pKQkZDUU0/PD40NDo9NTI3NTU8PEA8Ozw6OTpAOjg7Oj46PTg+Ojo8QD08OTs9Pzk6Pz07PTw9PTo2PD0/QD08PT0+OjxAQjs6PTc0Oj48Pz89RkFEPYKknKClnaWlo5mcnaSeo6OfnZ+doJqnnpyhqZ+vrquqq52mrrioq7fY1NXZ2dHO0MC8zMm3wK+nq6mjpLG2s6O2qp+doaqpoZiWmJqbnaGemZ2elH5yZmNjX19hYF9hYF9gYF9gZm1wcG5rb3J3d5vMwNLV09jY1tnR0tLXz9POy9PN1dTRys/M09bS0dbN0NXV0cXR1MrQ1NXVzdHQ2NfX18vIzsPIzszJzL/IvsfIzc3PytDNzsvOzsfKz8/KzsrByMbJzMnL0dLM09HRz8/Kvce5sK27uLWqtrCtqLits7+7sZqPn5SRjo2IjpCFkY2ZjJGRlY6RgIWIeXZvcG9rYmVucGFXXFpJRkZETFdFO0A8MzM8PTg2ODU1Oz5APTk8PDg8Pjk8QDtAOj04Pjk4Oj88PTg7PkI6Oj08OkE9PTw6Nj08P0A9PDs9Pjg7QEE9Ojw4ODs+PD0+OkVCRT6Bn5mlp6Cfo6eam5+cl56eoZqdmpyappufpKeeuLa1ta2lra6+tbHA2dLX2tzWz83Lw9PQwsKyq62urKazsbirs7epo5+clpSXm56fn56VlpiVimxfX15hZGJgYGBhYGBhXl9fXl1ibXJvb3N0dXZ5pL7L1dHW1NPY1s7O08vNzsXOytLSz8bOzc3UzM7TzcrX1dDM0dPKy9DR08nN0dXS1dXKwMnBxczCx8nCzMLFx8rKzsrMzM/N08vFx8/Mx8fKxMbAxcnLzM/Qxs/Ozc3Mz8XHwLe5vcLDvcO5srO+sLvDxLaqmKWhmZaRlZWSi5SNmpGUlI+PlIKJhXhwcmttaGBgcWhYWGhWTUdMSVBQQjtEPjs2Nzo4OTo1Nz09QDs6PD05PD05PT06Pjo8ODs9OTtAPD47Pj5BPDk9Pj1CPTs3NzU/PDw/PDw7PDw4O0FAPDo8OTs6Ozw9QTpFQUU+hJ6bqK2epKSqnJ6fmJKXm5+am56ZmaKVoamppcXDwb+7tbKxx8K5y9XW2drb2MzNz8nW1sXEuLK2qqOurbi5sbLAoZeOjZiWkJSSkZaXlpGMfWZiY2JgXV5hY2JgX2BgYWFgX11bXWdycXFyc3FtcnmkxtPPy9DP1NXJxMnJxsa/w8XOzsfFx83K0cjLzs3G0dLPzszUysfKzc7Hxs/Sy9DPxbrEvsbJvMLGyM7EwsfAxs3Hw8vJys/Hw8PPyMbBxsfDv8DGy8vLzsLKy8jHzNDExce6x8PIyMLPwL28v7DByse5vaqwsqelnaKcmJCbkKOZl5mRlZiJj4J3bnRka2BeZnFhW1dgR0hIR0lNVEc/Sj02NDM1NTw8NDg9PT06Oz08OTo7OT89OTw7PDg6PDo6QD1APD09Pjw6Qz48Pz04ODk6QD4/Pjw7Ozs7ODo+Pzw7Ojc5PD49Oz49RkFDPYOgm6qupa6qq5qdoJeUjpedmpmgmpqcm6WzsazJzcrIxL69us3NxtDV1dna29jQytDQ0tTKxbq+vrCot6q+ubmzpZKOjpaQhoOEhIJ+hYWAdGBbXl5eYF5gY2RjX11dXl9gYF9bWlxha3Jyb29rbG9vfbjRyMnKz8vNxLq/w7u7urm+yMbCw8DDx8rJyMrHwcXLxsjLzcnEwcnJwcHL0MTLyL+5wbrFx72/xc7Kwr/DusnHyLrHxcTKv73By8bFw77FvLy/wsTLxMS7v8nCxcfSxcHIvsrJxsfG0MPDxsOvxMvHw8q3v7y6tKmspaWYn5iso6ClmqOgm5R7dnJ0ZmlaYW5tWltYUURMRkJHRExDRlI/NTQzMzQ/PDM6PDw7OTw8PDg7PTtBPTo8Ojs3Oz05Oz07PTs6OD4+PEI+Oz88OTk7Pz07QD48Ozk5OTk6Oz06PDo2OTw+PDs+O0NCRD5/pZypsqm0rrCdnp6YnImUm5man6Kfmp2ov7i8y9DSzMfCw8fNz87N1dDW2djZ0MzUzs/Qy8S4xsG2tbyxwLa6rJGMk5eHe4CFhoB2eHVzcV9aW11gYWJjZGRlZGBcXF1dX15gW1laXGJvcm9raWxwb3OPxrzJxczAxsGwtrqysrSyscG8u7u5uMDBwcW+vbm9v7nEysXFwr3GwLe7xMm/wsm7t7q6xcO+vMHNwsa+vbXAvcO6vMa6wrmzu8XDwsK2v7a1vr+6y8K8tbrIur+9y8PBxcLFyMXIxdDGwszHssbJw87NwMXCv72yt7Czp6ioubGlrbCrrayUeXZ3amVoYGhvY1ZeWUpFSkZIS0FFQkVJQDk6NjQ4ODUzOzo7PDk8PDs5Ozk6QD46Ojw6Nzo7Nzo7Oz88OjxAPUA/PT8/Oz07O0A8Pj4+Ojk5ODk3ODo8PDw7OTo8Pjs7PjpAQEU+fqygrLWqt7SyoZ6fl5qNlJaan52mop2et8bCxMjO0svKysfNzc/SydHG1tXW2M/M0MjNyMrFvcrBsrW6t7q2r5GNioyFeYCGhoB+hHx0dWRcXF1eYGBiY2JiZWViXV1bXF5cXl1aW11daHNxbWdnbnByeZ29zMDDusC4rbCwp6qtrKe4tLa0s7KzurW9sbewtK6yu8K7wcS8v7q1srq+wLjHuLO7tcDCvLe9xsDDu7Svsra6vrPEtrq1rLi8vcC9sLm2rra6ssW8tq67v7S2tMW8vsLFv8PExcfLxcDGxrvHy8DPycfDxsHDt8O+vra5vsa/rLW6tbe2jnh0eGZnZWJrbl5WXmBGS0hISkZCQ0FERT88OjU2NTYzMzs6Oz06Ozs6Oz44PEE9PDo7ODc5OTk7PDo+Ozk+Pz1APz5CQD1AOjo+Oz89PTk6Ojo4NTY7PT48PDo7OT49OT86PEBAPIi3pquzsby8sa2foJmUlJiXnqujr6qnpMbLzsjGyc7M0M3OycvJy8rLxtHP09HPx8rGysXEwLzPvbO5vbm4t5uOh4mKe3l+hoZ3eIF9dGheXV1dX2BfYGRhXmNlY19fXFteXF1eWltbXV9scG5oZmpubnJ8pMe/ubi1sKusp56iqqeeq6yzramrqbOttrCyqK6nrLK7urbCubq5sKu1ubu0wrmvv7C9vLu1u8e5wratqqiwscC1uLyvsKexs7S7vKuttaWutq66sbCqua+tu627uLu/v725wr/GwsXAvMbBx8u4xcfFv8fDw7rExsK7xcnMy7O5wry6sohydnZraWFibGhZV1dbQUxLTUlFQUM/RkE7OTo5OTU4NTQ6Ojk7PD07Ojs+ODtAPD05Ojc5Pjk7PDo4Ozs6Pj45QT0/QD87Pjo7PDo9PDw4OTg5NzY4PDw9Ozw6Ojs+PTs/Ozs+QDyKwKuouLe5w62zqZ2ZlJaZoZymsLWxt6bGz9LMxMbCxdDIz8PEx8HGxsXFzMPKzMPEwcfAuru7yre0u721tauRiZCQfHl+ioV6e4SBeG5eXV1dXV9gX19kY2JjY2JgX15bW1paXVpaWlpdZG5vaGZnaWtucoGtubC1rqalp6eaoKSgmpylq62jp6KrqayqsKOmn6qttLaxvbmvt6+orri0tLu3s7yut7m0sbvBscGupKiiq7Gys6e8qquoq6yttLOlqK2gpK+psqWnqK6lp7assLK3ubq7sby9vr7Ev7XBwMfIt7/AxLfEwsC7v8TDvsTIzMq/vsPAwKmGcnNyamldYW9kV1ZYUEhaUlNLRkZFPj9AOjc4OTc3NjQzNzo5OTo8Ozs8PDc7PTs7Ozw4OT44PTs8Njo9Oz89N0E+P0A/Ojw8Oj05Ojs6Nzc3ODg3OTw7PDs5Ozo8OTc5Pjw+P0E7jMKvrry3ucSwtrCbmZWcmKqpsLGztb2vxtHQzcTIu7vMw8zAvcq5wMXAvMy6w8bFurzEvbm2vMW4tri7rrGVg4mNgXt+gH94dH98c3dmX11cXF5fYF5fY2NhYmBgX15dXFpYWVtbWVhaXF9ma2ZlZ2Voa29yhaqlrKagnKGllJ6jm5eRoaOqo6KfpKSnpKyfnZukpauyr7a3p7Csp6q0q7S5sLa0rLa4sa+6ubC3pJ+jn6axp6unuaqkpqeop7KtoKemnpqkpqyen6ekn6CwrKyssbOys7C1vLa7wcGyur7DwbG5ucKzwL2/tbi7vb68wsbEwsO+v8Ogg3dwbGFlX2tvYFVZX0hOaE9UR0VKRjw9Pz06Ozs4MjU1MzY5OTk7OTo6PDo3PD88PDs8ODg8OTw6Ozc4Ojo8OTg+Oj89OTg8Ojs9Ojc2NzY3ODg2NjY7Ojo7OTo7PDg1OTw6Pj5AO43Itba9uLrBu761oJ6UnaGmurars7O7s8XQyczDx7m4ycLOwbrLub3Iu7bHu7fDxrO+xbu2r7i/u7Cztq+ihIeHgn15dnRwbWtqanFpX2BdXFxdX2BfYWNiYGBgYF1cW1xcWFlYWFhWWFtdXmRjYmVnZ2dqbW+Inamgl5WaoZabopiVjZ6hoqabnp+jpaCnnpqim5+qsKyxtaKpqqmrrKS1uK22r6yytK6yta6wqp+dnqOisqSlqbitoaamn6isq5mfn52ZnZ+lmpmjnJudr6irp6qrrK2wsriuuLm6sLa7u7qrs7K5sr20trGxtbS/tb2/vcLBurq9l4N6cmtfZV5kZFhUWF5JV11LUEdJSkZBPD8/QDs/PDA0NTM2Ojs5Ozg5OTw8Nz4/Oz07Ozg4PDg5ODw3ODo7Ozo7Pzo9Ozc4PDo9PDc0Nzc2NzU3NDY2Ozc5Ojs6ODo5ODo7OTo8PzuJyba4vru3wcHBtKSkmZqkpsCyr7astLfG0MnJwce8vMXF0MG8yru7wbu1xbi1wcGzwsO7rKm0ubensbKpi4aIgHlzbnBua2NeYmZmXV1eXV1dXF1fYGFiY2NiYV9cW1taW1lYWFdXV1hYWFteYmRkZWZmaGlrco2onZSUlJuXm6GWlpCcoaGonZucpaWgpJufoJqYra2tr7KgpaKtq6ahtbCxsaynrrKnubKmtqCinpqjoa2ioam1qqKjpp2lpqOWmJ2XmJudn5mXnZycm6yhq6aio6Wtq7KzqrSwsqqyuLOuqa+ysrK3s62prK6xt7C6tbm9vrazsZSEeXVlXmVeW1lWU1pVTFxRTEpFSEtJQj0/QUFAQDoyNDUyNDk5ODk7OTo9PDY9Pzs8Pjs3Ozs3Nzc+Njo+Ozo4Oj07PD06Ozw6PTs4Nzk3NDY1NTQ2Nzg1Ojo4Ojk5PDg3Ojg5PkA6gci9uL2/tr69v7OdpaOYpbHCtba9rbW4w83JyMHGuMLByNC6w8bAtry9tsO6tr/Btbu/uqqmsLqxp7Gvmn2FhYB5cHF0cWhlZGllY1xcW1tdXVxbXmBhXl9fYF5cW1pcWllYVldXVlhXWFhWV2FkZWNkZWRkaGp2opyUlI+Vl5efl5mUmJ+doZuWoKGoo5+dqJybmqqmrrCrm6Ojtqmgn66otammpqywo7avo7agopuYmKumoZusuK+ioaOcoZ+gk5WhlJaWm5iXlpeclZ+onamjoZyjqqqwraezq6qmrLKwpaqusrGvsK6vpqensq6xtK+7s7m3raOUgXl1ZF5hVllXU1JUS01eTFBMR0hMS0U8QD48Qjw7NzU1MzM5ODg5OTo5Pjo4Pj47PTw8Nz49Njc2PTc7PTs5Nzk7Ozw+OTk6Ozo4Njc2NTQ1MzEwNDU2Nzk6ODo5Ojo3Ojs5OT1AOnbAvLW5wrG+uLyunaeno6q7wL3Aua60uMLNyMfExb7HusrNtcTFxLG/v7nAwbq/v7m5vLenprC7pqihpImBfnhyamxydHBpaGVkZ2JcXFpZWlxcXF1eXVxbXF5cW1xZW1xaWFZXV1ZXWFdXV1VbY2NiYmNiY2RmaoGWk5WLkpSTm5iclpaboJyflaCfpaSjpaaenJ+kn6qvpp+ipLWnoKGip7OhpaekrqSwrKu0nqCdlJSpoaGUrLGwnqKjnZ6Ym5OLoZSRk5eYkpeXmJadppumoaKZpKSkq6SksKaloqqrrKWorq6uq6ipqbOlpquus7Guu7Wwr66fknl2cmVhXFpdWE5MUUdSYU1WUE9KTU9FQkQ/OT02OTo3NTQ1OTk7OTg4Nzw4OT0+Oz47PDY5Ojc7Njs3Ozs6ODU6Ozo7OzY8Ozg4NDY4NjMzMjEuLzI1NTY7Ojg7Nzg3Njw7Ojs7QTh4u7uxtb2wu7K3rJ6kpq23u7zBxbqxubbFysvBxMfHybjIxrXFwsiuurzCvMLAwb28t7q2paextZ2iipiIgHdvZGJnaWhmaGpnam1gXVxbWlpZWlxdXFtcXl9cWllbWVlZW1dVWFdUVFdVU1RTVWBgX2BhX2BhY2RpgZSTiZGOk5KTnJSVlqSZoJacn6ShrKWjo6KjoZuqqqWZnqWwqZ+fnKSqnaehnaurqaitraKhoZSXopqcj6qosJufop+el5iTip6SjZKSlY+YmJOboKKcpKChlaCho6SboqqkoqSqoqutpa2xqaalpqa1pqqorbO1tLm6r6msnotycG9gW1dWVVJGUU9IWlxPUkpUS1NMRUdJQzg7Oz08ODY2Njo5Ozo6NzY5Nzc6Ozo9PDw2Ozw4PjU5ODo4ODY1OTo7PDk3Pzw5Njc4NDUyMTIxLi4xNDI2Ojg2Ojg1OTg5ODo7OUA5e7W0rbS7srCssq2dp6evubmzv8i6tsCvxsnOvMLLzcm3y8C0wMfMsLW8x7vBx8O9vra6taSqr66dmYeOg3x1aWpqbWhqbG5ra21lXVxcW1tcWlhaXVtbXmBgXFhYWllYV1hXVFZWVVRVVVJTT1FZXVxdXl9fX19iZG2Oj4SRho+RjpmTlJKcmqKcm6CnqKqnqqWopKKYpK6klJmlr6mfm5iaoJ6umZupsp+kpp+jo6CUk5uWlZGoqayanKChoJqUkIyZjouQjJKMlpSQnaGgopybopWboKKgl6GooqKoq6Crr6Stt6Wio6Ksramoq6+zuLK9tbOrr5iDcnJoW1hZU1VSRVlMUVxZTVROUExRUklOSUI8Pz9BPz02NTc5OTw8OTg3Ojc5Ojs8PT47Nzs7Oj02Nzo7ODk3Njk4OTo2Oj05OTU3NzU3MTE0MC0rLzQzNDk4ODo6ODo6NzQ4PTg/OX6zrqiztq6op6+tm6morLe2rLvKu7a/rMzHxrnCz9DJtca+ur7Gy7SwvcS8wsTDvMCyua+lqq+rnpeGgXd4b25pbm5ucWdoaWdkXVpbW1tbXFtZWltcXF5fX1xYWFlYV1hXVlVUU1VWVVVUU05PUVlaWlpdXFxeX2Bkfo2Bi3+LkIqSjZeRlpmioJufqqqmraqmr6KnmZ+soJSVpKinnZePjpmdrpaXpqmYnpyTpaCdkZCSkpKVp6qkmZmZnZ2WjoyLk4aIjYOQipGUkKCdoKOXlZ+VmqChnZKbpaWnqKigsbCmsbymn6Ostautp7C0sLm1v7GtsauQfHByYlZUVU5SSUdWUFNSTExYTUpMTlJHTUtBQ0ZEQz5ANzU4ODk7OTo3Ojo3PD06O0A+Ojk7OTo/NzU5Ojo4NzY5NTg3Nzk7ODU1NzY2NjEzMjAtKi4xMDI4Nzc7OTk7ODk0ODs4QDh/s62msbeqpaKwq52qp6mysKS2xrS5urPLxrq8w8vRzLS5ur7AxMe1tLa8srq7w77BsLOtsK6wq5uiiGtobW9yb3FrcGtkZmdlXlpZWllaWlpbWlpaXFxdXFpYWFhZWVdYV1VVVFJTVVNWVVJOTk5SV1hZWVlZXFxdYWqAen92iY2HkImYiZSTmJqYnaibn6qkpKucppigpZuSj56impeWhIORmqOPk6KclZWWh6GampOLjoqPmaOnnJWVl5uQkoeUjoyAi42AkIqRkpGgmZ+hlZOYmJShpJiMmaSmp6agn7Syp7K3oJyit6yqraSysqa1vLWrq7GjiHhybV1OUFFMT0ROTk5QTEZOTktKTk5RSE1KQUdLSEhDPTg1ODg4OTo7Njk6Njg7OTk+PDg6Pjk7Pzg3ODk6ODg2ODU3Njg4OTc0NTc3ODIwMzAxKiktLzEyNzc2Ojk5OTk4NDk4OEE3d7anpLawpKejqaWgqaWks6qissO1tbKzx8e4u8TKzce1r7y/uLzEs7KutqKstcO6uq6qq7Svr5+Xp31eYGdzcXZxam5pZmhoal9YWVhYWFlZWVpaWVtbXFxZWFhXWVlYVVZSU1JQUVRRU1VRTk1LTFNXV1ZYWFlYW11hb3N2cISIgoeAkYOOipSQk52hjpqboqCil6SWoZuVjIeYmoxzjYJ9jJaWhZCZkJONjnqZjpuLgol/iZifop6Qk5iWhI6Bk35+c4mOepCGkpCQnJqZmZCVj52NoqKNiZqgoaOjm6K0r6yvrJ+YpbimpbChsa6csLuqqa+qmYF2cmJWTFFPUE1DU05MUU1DUFBISU5TTUhKSkRKTEVKSjw3NDk4ODg7OzY5Ozc6PDk6Ojs3OT85PkA3OTo8ODk3NjQ0NDU4NzQzMTI1ODUvMDEwMikoLC0xMjc2NDg4OTo6NjU6ODdBN3e3oqO0qKWlqKOmpaalprOnpbTBuLC0sMrGubrCz8e/tK+9w6+xx7Ktp6yVo62/t7Cvn6esrKqWlKJyV1ZgaGdpaGluY2poZ2JcWFhYWFhZWVlZWVlaW1tbWVlZVldXV1NUUE5QTk9PUFNUUk1NSkhOU1NTVFVVV1lbXWlscmx/hXx0Tlhyj4KXho2cl4qTkJ6XnJWUlZOOloh/k4lfO1dve4qTiX+LkYyPhYZyioSWgXiCeoWTnZSDlY6Rj4KGfJJ4cW+FjX6JgJCNj5eZmJOKj4ich56XhoeWnpqgoJenr6itqaielq20oqatmayrmKezoamto5J8cW1fWk5TUVZMRFRKUE1NRk9PSkVMUU1LT0pJTU9GSUg9NzU5OTk5OTo3Ojs6Pj44Oj09Njo/OD4/NTg5Ozc5Njc1MzMzNzYwLi0vMzQ0MTEwLy8oKSsrLTM4NDQ4Nzk8Ojc5Ozg2QTl4t6CiraGmpqmgp6inoqmwqKe0wrmxtbDJw7m0v8/AurGxuMSrrsmup6KdhZqiuq2mp5WlpKOglo6WaVBNUlZaWlddXmJnY19ZV1dXWFhYWVpZWFlYWVpaWllYWFZXV1VTUk5MS0hHYlxNT1JOS0hGSE5RUU1QUlRWWFpgbW9peoJ0UEJAf5WRkX2JlIyEio2ajJaVipKHhZWFeIh/YEpRbniKkYR8hIyJhH5/bn5/k3d1dniEjZlwUY2Iiod7fniUdmd3hYh+ioiVio2QkZaLg4mHlISai4GEkpuWnpyUpKOnqaWjnpuxq6GkpJGmqpahqZyipqiHc2tlXVtIUVFTTUlVTVNJTExQSUdGS05MTVRLUVFPRklDPDc2OTo4Ojs7ODo7OD4/OTk+PTc7PDY7OzQ3ODs2Nzc1MzQ0Njk2LzMvLjExNTIyMS8sJykrKiw0ODMzOTc5Ojk5Ojo6Oj85dracoqadn6Guoaeopaanr6yqtry2uLazwry3qLvJubepqre4rbbAqqKbkoKPmbGfoZmMn5aYlJGKjGVNTE5OT0xNUVdbXFpYWlVVVlZWV1lZWFhZWFhZWVlaWFhWVldVU1BNSkVAQJtrc3NJTUtERERJTk9oWU5RU1RVWm6DdHd+amldVY+JlIl0f4aAe4WMkoCRmYuPe4aPf3V/eHNudXB0jY2BeX2JqoR5emh2e45wcm14gIqMknh6gHuAdnJxknhndYSDhIR6lYmIioyKgH+Diox/k4N6gI+YlJuVkZ+dqJ6fn52gqaWfnZiNqKSToJ+Vnp6kf3FmYFxcSlZPUUdLWFJPSk1NU0pKSk1QSExRTFJUTUVIQTw3ODs5OT49Ojs8OThAPzo6Pj03PT03OTkzNzc5NTY3NTI1MjU3Mi8yLiwuLzIwMC8tKygoKS4xMjYyMTk4Nzk4Nzc2Ojw8N3aumKOhmJyetKmvqaWsq7Cxqr20sry4tru1s6C4u7OrnZ+tq6y1s6WelpGYhpOklpyMgpaIj4mGhoNmSklKSUdGSEhQVFRUV1dTVFVVVVZXV1dYWFhYWFlYWVlXV1VWVVNQS0Y+OTNOPH6eTUhKREA9QURqlH5MT1FSU1ZedYN9eWd3jZeYjo99Z3mAdnh/iY98hJiSgXKGj3t2em9rfq18c5CKf3uGkoB9f3RmdnyFbG9nc3yJjIeAbHlxfXBtdY9yaHGAfY5wQ4qEgoOEf3d3eoqEfYt6dH6Oko+YipKbm6OXmZ2anZ6inZaNi6Wbj52XjpaYjnVta2VhWVdYVFFKU1ZUT1BPUVdLTktPT0pRT0lPT0tGRDw7Nzk7Ojo/PTk8Ojk5Pz87ODw9Nzw5OTk5MjY2ODU2NjMzNjIxMjI0LiwsLS4uLTAtKyonJyouMTM2Mi84NzY5NjY1Mjc5OTV5ppefnpagprCsrqunqbCvsay8uKy7vrm0rqmbsaitnJCXnqesp6SbnZOHln2OlZGUgHuKeoSAfn6AZUpHSEZCQENESUxMTVFSUFFTVVRUVVZXV1dYV1lZWVlZWVlWVlRTUUtENzhmNzA/qGlOSEM9OzpEioV6WkpOUFFUWF5lcHJtiKeqwH51eWJ7d298eYiPeXyLhW9tjJF4c3hqan+CcpaRi4F9ln9JkphuaHd+gmxpY2x5hZCShmtzbHxucnuFaW1wfnOMiIOFen1+enZvdHSFgXmBd3B8joyKk4OWl5iakJOWl5mXnpeMg4mfkoqSjYaQln1saG1ubVdVV1RSUVlPU1VVVFlWTU5ITktOTktDSU5HRT86ODk7OTk6Pjw5PDs6Oj0+Ojg6PDk/ODY4NzI3NTY1NTQxNDQyLzAyNCorKiotListKigqKCcsLTEyNTAsNTU2NzQ4NUhBODk1d5mRm5manqStsKKtqqi1r66stL+rvMK/pqOalaWYn46FjJaipJublJaPdpF9hIuQj3x4fnR9d3R3fGZPRUdEQDw+PkFGR0dLS0tNUFJSUlRUVFRWVldXWFlaWVlaV1ZUU1BMRTFAmjMganJBmW87PDk1PICChl9JTU9PUldaUllcYKeIYpppdHplfm9tf3qLiHWBiIZ0bJmRc3N8amudjkx5hJKJhI5nMXaGc2x+fYN0ZmV0foSEhYBmaWx1a3B/e2dwcHtuko2Oe3N9fXFwbnVtgn53eXRqeYmCiImDlpOSkIuNkZSVj5eOgHmIl4iGiYZ/kId1aWluZ2NXUVlXWFlcTlBWV1pZT0lJRUpKSEdCQUZEQ0c9OTk4Ozk6OTw6OTs6OjpAPDk6PDk4Pjc4NzcxNTI0NDUzMzY0NTAzMS4qKisqLCwrKykoKycpLCwyMjYtKzU3NzU0NzhpTzg7NW6SiJmRmpakqK6esp6muq6rsrDCsrvDx5uXj5SZi46GeoWRmpaPko6SinOJhHeLj4x/dnd1eHZveHNpVUZJRD88Ozk6P0BBRERFR0pMT1FRUVFSU1RVVlZYWlpZWFZVVFNQS0U4MC9cYLNHOVhQOzk0NDGWuotITE1PUFFWTEFJUUlir7OgcXx4bX1scYOBhYF5g4aGeXGflHN4gHN1lIc1cZ2onY6hoYSihHZwhnuGe3OMrY2IgGhmYmltcW1vgnVpb1h1b42akXZsf3t8bXJucH96c3VtYnaEf4aAhpGRiouKkouRjIuPg3Z5i4+AfoOAfY54cG5ual5aW11bWVhhYFNPXFtZWExISkZKRz9DQUJHPkNEPTs5Nz07Ojs7OTo5OTs6Pzw4OD06ODs2NjY1MTEyMTM1MzQ3NTUzMS4vLCwrKSopKSoqKikoKikrLzNETTIxNjY2NDM8dlI3PTdikoGSiJaRnaSnnq+VpbSorbCuwbO6wcaXkIyUkIGJfW6CkZOKhIuJkIh3hIVul4qMf3l7e3F7dHxrb15KUEc+QDc0NTg7Ozw9PkBCRUlMTExNTlBRUlVVVldYWVhWVVRTUExFPDUqnUtbQC1nSTk0Lz6Sg6muX0hMTU5QTDdDTVJTREqGdoB8fHZ+bHeHh3x9hYJ/jH51oZl5foaAhJmFm5xhhqqfnYuCkI16doh+iYeOc4qXj4N7XGRxdHp7d4ptZ2lheW6Fj4J6boF3c4R6cXN5d2tuaV13h32HfIiIj4CLk5eDjYaNh31xhYCEfHV3e3yHdG1xcmRlXlpaXVNbZ15YUVZZXVdHS0tFTEc/RkBEQz5BQT07OTc8Ozs9PDo6OTk7Oz0+Nzk+OTk4Njc1NDI0NDEwNDY0NjY1NC0sKSsoJycnJigoKSkoKCsrKy8wMFVxPDIzMzMxRX5XND05XIx3iX+UjJGdnZ+mkaCqn7Cpr8Cxu8W6lo+RlIh6hnZrgIySg36LhZCNeYSCdKKFjX9/g4Bzg4F9bHlsU1hMQUUzMTEyNjc2ODg6PD9CRUdGR0pLTU9QUVNUVVdWVlZUU1BNRkA6Mj0gI5ZjjFs1MzExaT9Hb0lGSUxNT1JMS1RdWVJKaYSIe4l5fHJ8j4t6fIiGfpeHd6GZiIaPkpSljaypSIatr6+KgICTioGLgYSRqIeAmJiKnHNsfIGGh32OaGdneH5thYaBhXGEhUdrgHhxeXZobWtfd32DiH+IhYx6lZ6ciouJkn97dYt2fHhtb3d+fXFxcGpaXFtaY2NXZ2ZdVlBRWFpRRExMR09JREZDQ0FAQ0E9OTc4Ojo6Ozs6ODg4Ojo/PjY7Pjc1OTU3NzMzNDQyMzY2NTY3Njg7REZMTU1MQzcrIiUnKykrKywvMDArbnUyMjQyMEyBXDU9PF6EdHx+ioWHkY+WmJKXoJ2soKe5r7O9tJeNkouYi310cX+Kk39+jYOUlX2Hf4alh4mAg4iGeYiKgHWFeV9jVkxDNjAuLzIzMTIzNjY4Oj0/P0JFR0hKTE5RU1RVVFRWVVNRT0dDPzgwLCOHWz4/ODQuXZVwc6NVRklLTU5QV2BZcFpcXmqNk4eVgISChZGTfoWIkICaloKgoJeVm5qlrZOZu7Gnu8jDp4qMoaSOk4mAkHtyg56fkZx+doWFi4+HkGlob4OAdIyGhItxh4J2h4B7doV9bnZ1Z4GUj4aJiYiJiKKro5aJj5iAe4KKe3pvZ2t5fnd7cGljXFlZXGldYWdgW1BNTllTUklRS0ROR0NLREJARERBPDo4Nz08Ojw6ODg3Nzg6PT04PD02ODc1NjYyMzQ0NTU3Njg2NzxCQj88ODo+Q1FeZVxHMicmLCwtLS4xKD+MWy4zMTBPg180PztudnBneIN7gIyAgZGPi5qapJyhrKarr7CXkpGEoZSEeHeAjZR9f5KGk5Z/i4GSm46EgIKMi4KJjoWAioBtcGpeQ0E0LS0vLy8vMDIyMzQ3Nzk7PT9CREhKT1FSU1JTU1RSUE9IREI8ODcvOUM+PDw2My5sk5dNUUlJS0xLTlZgY39nZ211nZuPmpOTi46PmoiTj52LoKGSo6mko6yTqLaip8HCrseveLqUmnyMoZ6ZhJKEgo+hnpOZkoSKhY+YkJVsb3WJi4GVjI2Pd5CEcWyFgYqXkoOFiHKJoZeHk4qPkJeltqmbjZaig4eThX6Aa2prfX59f3FfW2JeWWZqXGxsX1lMSFBTUU5OTUdJUURETkZBQ0VHQj46OTc9PDo7Ojk4Nzc2Nzs6Nj06Nzg1NDU2MzQ1NTY2NjY4NTU2MzEwLiosLCkoKS46UGFcQCwoLSsrMCwncog3MjQwT4RiM0A8dW5oWXCDcHWHcXaRhn6XlpqUn5+bp6CqlpOYnmhmpJp+hZSSeoCRiZKSfYuFmZKRg4CBi46JhpKIhImFeHh/aE5SPi8vLiwvLi0vMDAwMjEyNDU3Oz9DRk5QUlRQUVFTUU5QSUVFPjs8OkNGPz48NzUyPEBSNUhISExMTU5SXm+KfHOBfaCdm6emopmhl6KVnJ+onqmrn6isqaq1l6u+q7bIybfI0c++m6Bwaaqon4STkYWcoJqamaeRkYiVoZmad3p+lJiRoZKXl4GUnnt2lZKrs4mNl6B9lZ6cjpOWmqSjp7awnpGaqIiXkI6CiWxzc3x8eW5mXltfX2FnY2BnZ11SRUtLUU9KSk1HR01DSE1GRkNCR0RBOjg1PDw4OTk5NzU2NTg+NzU9ODQ3NDU3NTQ1NDY5NTg6NjE2ODYzLzAuLSosLy4tJyMqO1hiQigqLDEtKEuXXjA2M1GFZjNBQGliX1BxdWBufWF3jn18lI6Oip+Sl56VnKqYnqpCRH2HiYiZjnmCjYuOjXyKhpCRj4KDgYmMioWThYKGiYGAh3dfYlA0NjAtMS8sLjAwLi8uLjAwMTU+QUFNUVJTUFJUVVNOU0xFRUA8Pj1GSEBBQDg2NjI8OTxGSEdJSk5PUVlthpB3lYujp6q1vbilrqysqKm0rLC3srKtu7Gzvpyzw6y7ycu4w7+3paOwsqysqqOKlpiFpaagopiCppmNoqqnpIeFk6OgoKqhpKmOnLCLlaSnuLucoaOwk6Odo56RpKKssK2ztaOVpquJmoqTi5V6e36De2VeZlpjYF1iY15mZ2BbUERKSFRPRkhMR0tIRkdIQUtGQ0ZGQTo4Nz08ODg6OTc0NjU4PDU0PDc2OjU0NjQ0NzM5PDM4PDIwMjU1MS8xLi0qKi8sLSooKiYlNVhYLywwLCwwhIE4NzFQhWg1QUNbWFRMaWNXanBYeoV2gpOFiIKcg5KRjJLayJ2Wc1aXiI+InI99hoyPi4p7iYOHkY6DhYGMhoWIkoaChImGh4eHcW5hQEU2NDwzLzExMC0sKy0xLy00P0RBTlZRUlNVVVdVTVxRR0dEPD4+RkhDREA4Ozw1Qzs9RktKR0hST1BXgZOghK6js6qywcfEq7PFtq2zwLO4vra/tcG2u7ukuMaptsnHtr65tKijtK2wsJuZkpqfiaevqqSVd5+kl6GrsbKYlqmtqK61u7K6rK+1orGssrW8uLWutaCnqKOom6mwrrO6t7monLiqjaWPkpSghnqBgHJYX2JVZGBgYV9fZmBcVUpERUxWUklKS0VLSEVBQEBLREJNRjw4Njc7PDk3Ojk4NjU1NTcxMTw4ODk1NDY2NTk3Pj0zODkxLjAxMjExMzAsKiwuLCsrKyooJyopRVowMCovK2iSTzYwUodqNkFFV1FKTFxaUWNkV3p1cYGUfYSGk3aGfoCNe7+7o7yCtJSTjpuPhIiPk4qJeoeBjJONiIWCjoCBiY+Gf4aIhYqHkXp5b11XQEVOPDY6NDZBQjc2NC8vN0NIQ1FcT1FVWFVcV09fVUlLSkFAPkdLRkZEOz5AN0Q3P0JKS0VGV1RQXo+kraSytMO2uMHMyre8xL2ztMK4uMK1v7C4dLG0prrFpLDGubGzsrSopLa2qrCgopabopKlsa2lraynpJigrLO5oaixubW7vsy/xcW9vLPCuLq4v7i7uLqtrbGmsaquvrG9vMLCrZm7qZWuj5iZq4l+gHloVWFfVmhjaWVWW2RaV1VKSEdNUkhESUtBSUQ+P0JCTEBATUQ5OTY2OTo/Njo5OTY2MjQ2LzE5NTk5MzY0NjI3Oz0/NjoxLi81ODo6NjUwKigsLS0tLCwqKCgrKyhFUy8qMDBKj2s1MlCHbTY/RlJMQUxSV1RZVlp3anB/j4SBjoRve3J4iGK5oZqjiZWUlpOUk42Pl5KHh3uHgY2VioGEgYp6fIuIhnyKgoGLhJV9eHp1ZlBcZEdFTDpRZGBbXlNGPztIUEVbY1FRWVlaZ1pTYGFNU09FQT9JSkhFRkFAQzxENkI/SEdKTFRaVF6Ur7i1u7nJwLu9ys28vcG8uLa8vLe+tbqyxmB1sqWxmp6rvqqlqKuqpKKztaCrp56Vlp6Yn66lp6elnqOUoqews6eysry2wb3TycnTxsLFzMLKw8G+vr+8vbi1sLm3t8O6xr7EybGeuquirI+mqbeKgHxvXF5eXFVgXWhmU1liV1NXSkZGTktBPkhEPUtCPUJAPUY+O0hANzk2Mzc5PjQ4OTo1NzA0NS8yNjM4OTM3NDUyNj84QD5HS1JUVFJQUFFSUUpBOS8sLCwqKygoLC0rL1A+KC40OIB9PDJLiHE5PkNLRUBKTVBSTFFdaG1scZCNhpBzbHJyc4jVwLaaoI2VmZmRj5eSlpaOhoh9h4OMlop/goCCeXuLhId7i3mBioKXf3R9emxmcHZZXVxQZWViYGVkXVtYWFxOZG1VUm1uX29fWGdlVVlUSkRCS0tIRkhISEhCSTlEQEhLVFRWXVpbk7nAub64xsG7ucrLu7e6tri5tLi1ta63t5lkdamerXBeoq2dmKGim6Seq6WUn5+QlI6WmJionqafn5qZg6OdrKSqsKy3sLy41NDO1s/Jy9HMz87Kx8DAwsq+wb3BwcXExsrAyc+0pLyxtbCcrLm9mn13aVtcWVdbX1hhYlFcYVRSTERCRkhGPEBGPkJJQkBEPTpFPj1KPzQ3NTM1Oz00Njg5NzcwMjIvMjQxNjk3NzU1NTVEM0VMTT41MTAwMDY6NDc3QElPSjsuJioqKC0uLyxATSsvNTRtiUkwSIl0Pz5CREBDREdLT0RSXFppYHCXk5GUbmxvdHWHs6yhoZ+LmZyZjY2WkZuShYqKf4mGjJCMiXyBg3N7ioOFe4p0gYqHlX90e3lsbXV8aXNlaWxoZmppaGBmaWltWm50l62kvYiHZ1tvaF1aWVRIS09QSktQTFNRSExBSkZLUF9fYmdqYpi4x7C6tLu+trHFx7awubGxu62zsqisuK2NtqienKeaTpuejY+glpGnmKWVipOTiJGJkJGSnZuhmJuVloeemaaarK+or6ezs9TU1NbRy8/T1M7Tz8zFwsrQv8rJy8nSyM3Ow9DSuLDEvcS6pre7xaJ+bGFZWltWXlZZZFpQXVhPUkNDSUZESjtBRD5CSD9AQjg7RD5AST01NjY1NTs6Njg3NjU0LzEwMTQ2Mjc4ODc1MzY3QzVCOD8tMCwxMzQ4PTk3LC4sMTtGTD0pLCguMDAwN0s/LTQ2VIhXMESHd0M7Qj5FQkFDSk0/VVlTZldzkJGZgmhycHl5g6GqnqaXjJubmIuOlZGajn2Ji4aOioqLkIh8hYJwf4eChnuHcoOSi49+cXl1bHF4f3J7bnhzbGmAcG1jaW5weWl4fX7Lv8Pfp25jeG5kW2FgS1BSVU5ZXlBdXU1RTlRRVVRcbm53g3KXrristaiwtqutvcGyq7WmpbmnrK+irLSkj7Gum5iYjJGUkoWPm4GNp5KciYOLhIqJhIuElJWXl5SbkJyYmZmenauspKeirKzO0tXRzcvS09PQ1NHOyMPU0cjO0tPT1s3S0cXS1sbBz8jIw6m/uNCcdmtiWl9bVV5RXFpQUFVRT0k+QUdCQ0Y9QUI/RkU+QD86PT08PEpBNDU0NjU8ODg4NjY0NDEyLzAzNTI2NzY4NTMzOz08RT1AMTErLzM0OT81OTAxMDIyLTJFTzMpLzMuMzI9TjI0OEN9XzJBhnREOj09ST5AQ0ZIPFZSTU9bdYeGi3dsd3B9foCgnp6hjI2Zk5SLjJOPloV5hZCRj4yKiJGHf4N7cn6Agod6hXaFk5GJgG93c2xzfHx3fHOCeHFrgHJyaXByenlye77Lm3+NsoR2coV3aWFpXURaWltXZmRYZWtUWF1dYWNeY3h7f4yCmaqkpKKgoammqrK6q6a0o6KuoqSuo6eyoImmm5WTkYqSj4mClIlrlaONmYSBhn6Rg4OUl62LlY6Vmo6FkpCdl6evoaCgpaSoyM3Px8LL0NPR1NLO083G1tPN1NjW1tjV19XK1drNytjW0cutxMPMh29rX11cVlJXUltQSkhKSktAOzo8RUNFPUNEPkhDP0NCOzw5PDpHQjQ2NTQ0PDU2ODc1NDMyNTAvMjU0Njc0NTU0NDw+PUU/QTYyLy0xNjs9MDgxLzI1NC8tLjtSMDE3LzUzMkVEMjg+bmI1PYF0TTk5QEk8QUQ/QTtQTEZLWXGAdn5pc3lygoqAnZWelIWLlomPiomOiI+AeISUmYuNiYiLiX+EeXN7fYOHd4B7h5GXgYRveHFudYB2eH10hnx5bId2dW59doR1eXyeto08QYvGpX6NfWplV0lDZWNmY2hqZG95W19maGtuaW6Bg4mSjJ6foJ6Rl5mgo6Sns6WksqCipZ+iqaKjspyHn5KSk5GLj4uHhI+EfpycjI2ChIV6lH+CqpajjJKLmJOLfZeKmpGqs5ianKecpr3Dxbi2xc3R0NLQy9LLydTO0dXa19fY1NnYzdjbzsna2tLWv8zNtHRzamFZVlBTUFhVRUdLSkZGPjo3OkBCQzpHRUBFREJEQTs/Ozs3REM3NTY1NTswNjg5NDQzMzQxMDE0NTU4NzQ0NDQ5QD5EQkM8MzMuNkZUV09RSkFKRj8yKiguQlQyOTI1NC83Szc1PGBiQTxzdlY4N0FIOj9CPjw5UUVDSlRsbm9wYnFxdIaNfZeRnot/h5KDiYaFioKIfXiFl5eJj4OIhod7hXlxe3uEhXV6hY6NnnqNcH1wcHqAcnuBcoSHgG6OenV3fX2DdYB9h4mwdFmqwreNkoFwbmM9XmhycXFwbnd3gmZpb3J1eXJ6i4ePlJKblqCWiIyTnJ+bn6ugoaycopqaoKafoKyajJqNkZOOhX2IiIOFi46gmZSIg4d+bJl6hJmHiJOMjpWMhnubiJOPrquTlZeemKautbyorb3Gy8jJy8vPycPSytTX2NfY19Tb19PZ29bP29rS1snVzJJ0d2VkWFdOUVJcR0NGSUk/Qj49ODo+QDs+ST1AQkFCRUE+Pzo4N0RCNzU1NDc5LjU2NjQzNTUzMjMyMzY0NzU1MzQ1OEVCRENFQjU2PEZOU01bbmZjbnNrYFY+LDVMRzg2NTQzM0JGND1XX2hMdXheODs/Rjw8QTw6OUQ+Q0dSa19tZGJmbHaAiHGRkJuAeYCOfoOBgoV/hHx9hJiOh4x/hoeBd4N5b3t7h4J0epKejqF2kHaDdHWBfnSAhG+BkIJvkoV1fYKFeneHfIm4xqXDyriClpyPeHBmTmVjgnqCd4WhkYt5eXd7hIB8hHZtlJaVlpCYkYOJj5eal5emnZigl5+Tk5ijnpuslpGQi46Tg4yFiYmChpCRnpyaiIWMgYaYe4iJn5ePiY6Li4J8oIiQirygmJOXmZyopqWtnqe1v7+/uMfJzc7EzcrR1dXU2dXX29TX2drb19va2djO28aCdXVjZWFdUlVVVE1LRE5EOz09PDk6PD85PkE2Pj9APT8+PTk4NjdDQTY0NTU9ODA2NjU1NDc3NDU2MTM4NTQ1NjQ1NTdISD1ESkU3OTI1O0g+Ozk7N0lQXFpSVVhMOVQ+Ozk1MzI3STg9TllNSHh4ZDU9PkM9PEA6Njo+PkBFUV9ZZmFdXGl0enlsiY2Sd3Z6inx+gH+AfoZ7foKRioWGeoWIfHZ+dW19fYd+dH+SnpGgg5J8hn54j355i4pvg5uBdJmHfoKKhXx+kXuQqY+Qw6C9jZyknH6KhX2Jc4yLgHOmmpyYlIV7j5GJhGlHcKGknoyMkZKFiIuRk5WPnZuTlJGXjYyWn52UoZWSjo6RjH6Qj46LhImSlpmfn4iMlJGdkIOMf6aZiIWOg4aEgKSFiou3l52RlJWhpqCdnZ2jrra5tKvAxsrQx8fMz9PS0tjS1dfA19jZ29ja2tnZ19y2dHRzZmZiVF1ZUk9OSERMQz49Pjk5Ozo6Ojw9NkE+Pz09OTo7OzM3REA4Mzc4PjcwNjg4MzU3PDM3ODA0OTc2NzU1NTQ2RlA1RE5JODkzOEFLPTszQ0BJPDpEV088TVRITj85NjMzMz5DO1tYPjVZeXBaPDxBPD0+ODU4OT89RFJTUlheVlhmbW1taYGOinFzeIp7e4B8f3yIe318i4eCfnWDhnpzenRtgX6FfneGm6GbnpSTgIyIf5iHgJySboiphXuhjH2RjoOJhZ1/m5GKjaOin5Gkr6CLkYuFi4GThldyrYufq5yQg5mckJCOW4KikYKNn5OVjIeIjJKSjJSVlZCMj4qIlpydj5aXkoyTlIaAjImSjouKnZeYo6OGk52VoIqKiI6ckIOJj4CDh4WkhIuQspickpSXoaCemZKbnaeyuKylvcLHzcfGz8vPzM7W0NHUrdbV2NrY2trX1tnZnGt4cGNjWVlVUVVXQ0BJRD8/Pzo0ODo7Nzo8OzQ8PD89Pjc7OjoxOkc9OjI3PUA1MDY3NzI1NT82NTs1NTg1ODo1NzczNUhSN0dPSzk5ND1FSkI+MUZDTEI5ODpHWEA1SFdJNjYyMjM6RUNlWD8mX3lpX3o+Pjk8Ozg4OzxAO0JRS0tTWVBUY2J5bWJ+kYNvbniLeXp/e4F9h3x8d4aFgHNwhYJ7dXd2dISChX1/kqain6ail4qdkJSXi4qol3KKs42EqJKEmZSFmo2jlqCYk4mbnqKTqbCfkZWRjo6IloxvjbeEmsTIsp2ipp2cmJaRspBkpM3HlY6Gh4mQko2Nk5WKhYqKhpaanI+RlZOHlZiEgJCMmYmOkKuXl6SjiJmelZqJj4eXl4qFj42Bf4ePpIiNk6ial5OWmKGYnpmTnJuisrSlo73BvsfFxcjIycLK0s3N1KjS0dbW1tja1NPazn9uemRfW1pbTEhUWkJCSEQ7Qj44Mzc8PDo5PjY0Ojo8OjcyPzo5MjlJOj42N0JDMzI6OTYyNjQ+PTQ7PjY5NDk7NTc5NDRLUTxKUUs5QTdCR0lANjRKRUxGPjs4OEVUQTc+XDg2MjE0OjtFYFhBRmF0aExjWj41Ozo6NTs6PTpFTUZIU1dTUkJjgkd2gY59fG1+iHl7fnuCgoN/d3eAg3xtbot/e314eHyEh4p+i6Kzp6Oqs6KXp6ClpJaVrqKDkbiVkrOajaKhjKWcsKOknZmRp5apmqyvpJiVlpWQi5ial6HAjqPJuKuco6aumJKbnbKdhYaoopyYhYmJjpWMi5OPiIGGh4mTmJWMjJSTh5SYhoSSkJx1kpmzlpeloYecmZKPipGKl5uJi5eOhn6MmJ6JkJCbmpqTmJefk6CdlJ6boLGuoqS4vrTFx8S9w8PAxs3KydKmzs3U0tDW2NPQ2LludXFZXVJdVU5HSU5FQUNFNT47Nzc6Pzw8Nz00MzY2OTc3ND41OzU8Szw+OzxCQTc1PDs0Mjc3P0A2P0A3ODQ5ODc7PDU1T01EUFJMOEA9RUFHQTU6SkVORUQ6NkFAQlM+OURPMzIzNTc1PXZcPFJcdGlaTV1TPD04ODQ2Nz06SkZER05aXFlKZmA7SYSLenpuhYZ6fYR4gYaBfnB4fX59b3ONen6CfHiGi4mGhJKmu6yosb2vpa2zs6mkorCsipq1naO5ppWtpZaqrbinpKOgmqmYqqSusKqamZyUlpGXoJiau7uuyqFqt7irsJWZnqOsk5e+o16qsoOKio2Uh5F8jo59g4aOkJSViIiTloyQlY2LjZeZk52ZtJeVq52KnJSRjZCSjJmbi5OekIuKlp+hjJSNl5mdkpuYnpShoJScnaWuqKGktLiswsjFtbq9vMXHyMLRoMbKzc3F19bRy9SebHZkWVdQW1BORUM/PUNCQjhAODg1P0c9PDY8MzUzNDU0NTRCNDk6Qkw6QjtBSEM7OkA8NzQ2PEI5P0BCODc0Ojo2Pjw0N1RLQ1VRSjc8OklBREA0QUpITkJBPzZEQTxKTkQvVD0yNTQ6RUpcWEpaUW1ncHBEaWBLSTY3NTc6PkpAQ0lQZEhiYGJwSUCLin6Bc4aHfYKIdYOKgn9ufX19f3B3h3eOgod8jY+MhoyZqsLAr73Gu7O0wL21rauztoyosq6tvaubu6Worbm5q6emoqKko6qvsrGqnpykmZuYmJ+jpqWSo7qvqb+8ra6yuaWlqH6Ih5ytvbCDjIyLkIOOg5GPeoGIkI2OnIiIj5eNi5WXlJGalp2omrGakaycjpqPko6UkJCWl4+SoJKJlZujrJSWj5ScnZKgnZuYn6CTmp6mpaSio7CypsHGw7Cwu7fFw8O/zabHxMfEvdbRzcXKhW9vXllXXFlMSkJLQUZIP0FAQzs6NT5BPj41PDc9MzMzMjQxQTE3QEJNPkdAQ05DQT1DPTs4NkNDNUJJQjo4Nzg6NUI+NzlWS0RXT0Y4PTRLQEM+NEVLSE4+QkE2QkI/QlNFNThQMTQ1Ozw4O0Q+OUxqal07V1JkS2daVU43OUdEP0NGXGVGYGlnWl1dk4yMiXuHjIeDjHWHkYqBb357gn9xfoF6lXqSlJSYkJOWp7PGyb/BzMLDuce9u6+ruruYs7e6ssCupsCkq7C7vaquq6OjnqerrrWwqZugqpyhnJafsLWnjKO7urbBvKypnbSlpamUhY6qxMOkgouPh4iEhpWUjXqDjZGPkaGMjJSSjomXn5iTmZWXpqCvnIyrnI2Wj5GRlZWOkZWSkKGUh5efobOelJmTn6CXpJ6an5uflJiepaOmpqSvraXAxMOuqLe2ycO9ts+yxL/EvLPRysjCtHB1aVlVWWdQS0hDTUtMSkFCPkRFPDVBRTw7Mz05QjMzMjI2M0EwNUlFTj5JQEhSQEg+Q0A7Pj1GQTVBVUA7OTk4PDdFPjg+VkpDV09HOD80TEBCOzVKS0NMP0I/PEJGPUFITDkrRzwzNjc0NjRBPzdPYU9hRS89PjZrbGpgQDpIPj9FQmVaTWVcZVRiapmNloqLiJOQhol5h5SQgXKAe41/eIeCgpB5jaGWqJmambq9x8jJwdLJysLNvcKzrby+p7rAvbvEt6zBqayzvL+qsKqkpaSsrrOttrWgoK+fpaKZo7S9qZypvcKjtrevrJSyrKytl4eaqqalkYKMk6WWioF1ipJ5hY6SkJ2fk4+Ui4+NlKOZl5yUlKOeqp6RpZqMj4+PlZaIfI+Wk5Ojm5Wgopy1pZCelqSjoaWdnaWYnZWXm6Sjqaeisqyou8DEr6Wzt8y/ua/Es7u+wrmtwsPCwJdodV5WVFhYSUpMSUZERElEQ0JETDo0REk6OzQ9OEUuMTIyNDJCMjZTSE88SkJKUUVLQ0RFOkVMQjw3RVY9Oz04OT88ST86RVVJQVdRRzdBOks6Qjc5Sk1CSUBDPjxERzxCQ089MjBIMzY2MTcwPUI6PWpqSks1UVMzU3BwZE47RD1ARj5pSF9YYVpjY1aej52Ol46ekomKf4qgk4R4hX+Vf3+QiIqRgJahma2npJjCvcfDx8XTzs7Ny7zCuLC6vLS9y7vDwra2vK2zv7m9rq+ooKmotq6tqbK3mp6toqehnqu3uKqlr7/Fsb26s6irt7Svr5eWpayooJGOk7LFp5aOfJKVfIeSmY+pmJeTk4+SlZOlnZOdmZOho6KcmJ+Yi4yPjp2IWpCXl5KXpJllmKKfsqWVoZWqq6mmmp6ml5iWmJSgo6ilnrarqbm7w7SltLbLwLiqtquyu7iuqLi6vbd/Z2pXVFJTTUVKUk1LP0JIRUVJSEc5NkZNOz43PkFKLjMyMDI1QzU1T1ZOPExGS1JMT0hHST5JUT86OElTOzs/Nzk+RExCQEhTS0BXUEY6QT9HNkE3O0hNQ0U7Qz40RkU6QkFCRzkvOkEzNjAzPkdEOTQ9dGRNRztFKzpmfGdWOz5AQkZCcEVqSVJlYUxGpZScl6KXqZaMkYOIppOIgoeCnISDlZCQlI+aop6vvq+hxrzExMbGzs7O0sq/u7ayu7u7vs+1xL65ubezsbWzuLOrp5yrrLmqqKevr5ikr6SnpKW1wLCsrLS/w7nAurSoure5tLCWpa2vrqSLk5WhjXTCmn2XmoSOl5mMsJWampWSkpmZpaOVoJqWmqmdm6CgmYqNj5WcYEqWnJuVmqWWVJavn6+cnqOUrq2qpJmgpZOTmJiNm5+nopm0qKqzu7u7q7CyyL+4pqyrrbKyo6GysrSkbWpiWVdNT0pET1BQUjtIS0lISkNEPjpLVT9BOj1FTTA3NTQ0OkI0NE1XTztKS09VTlFKUEhISk9CPD5NUjs+PTg6PENSPkRIUklCV05JQEJBRjM+NThKS0NBPUM7NUVBOkE/PkhANStDNTIsPmNdZzozNXRkZUBSNyYjM31oVzs6QkNAPVFFV1NzYldGSKqXmaCiqK+ZkZeHi6iWjoiThaCHhJ2Xj52gm6OktMm1qcW5wsTIysnIzM3Hv7uzrrm5wcHMtci6wrm1urCvr7O1pqObqrS1qqmmrayapa6lpKisur+orLa3v8LAvrmzs8Wzur6tpK+1rLmmiJuYppt2v5+EmZ6Ok5qajK6XoZybl5San6ConqifmZqqmqGnnpiQjZGdg252kqKalZ2inZGusqOrlKepl6qso6KepKeSkZmch5Scop2Wsaapq7m2vbKyrr65tqCjp6ilppybrampi19iXl1PSktGR01KVk09TkZPS01CREQ8UVY9QUFCRE8xOD03Nj9CNzVVWE8/SE5RWVNQUVVLUUpKRUFFTVE/Pz04PTtHUjxFRFFCR1lNS0FIREU6OjM5S0lCPkNCOTlDPjxAPjs7RzctMj4tMYJoTnpcLzBraGA8PUJCODZ6Zlc7Oj0uLVJgTVVIfmVeSEWrlZuhn7uvmZSgjJOrnJGSk4mrjYahnoyjrJSjpLbGvrTAucLCx8nFws3Iwr65sq+6tcHCybXGssK8tbqqqK2tsKKjmKq0u6appquqnamvp6Oqq727qKy9tbi+x7y3trnCs7/Btaq2t6y+pY+jmJKioL2fiZqhmZefno+3n6mcpaKbnKGaqKSzoJudppyoqp6YlZCUm4uWiYykoZSdop2gtK+lpZKvqpmqqZycoqKokJSUn4KPnp6blamkoaGztLq0rai2srKenaOlm5eUmKqhnnVcWV1cSEdFRkxQSU5FR0hDU0xKQkVHQVdTQ0g9QUdRMTtCNzpCRjc5XFlLQUxQVFVTTVdSTlVKRUBKSk5POURANT08TlFDPz9QP0VaTUpBS0RHQDUzPUlHPz1FQTk3QTs8QDw8M0A8Lyg7KkiRQjpTSjAsW29XNzE8Kh1CgGRUNDktMTlmXEZDQ51wYkdFp5ejn57DrZyXpZiaqpyXm5qPqpaVp6aVrayZoqu2xMO8vrbBwsDHw7/Mxbu9ubKwubO/wse1v7C8t7m2paSrq62goZmqqsSipKmrpZ6sr6uiqam+t6etv7K5t8e2tbm5wLPAw7i2s7SwvaOXo5eUnJSun5Cio6Wjo6CQvaWpnamrnJyhm6WevaKZo5+iqayhnZeOlp6TnoePhI2Tn6SgnrWsppyVsKaZrqWcmaicn4yYlJ6DjqCZm5KlpJqYq7G1saqlqq2snJigoJKOkJWonpRlX1dfXE1IR0lOTEhGRElCPlFJQTxHSUlcUk9LPUlPVTVCRjk+R0c1Q2FaS0JOUlVXVlFYVFJVSUA4UlFQTTpHQTRDSFFTSUM7Qz5HVktDQE8+SzwwNjtHRj47RkE1NT85Oj85OzE1RDAtLC9Ndlw0S1o1LE1uVzwtPSkeI3piUTVDS1E5bVFGPEt4ZWFWS6Kao5yexayhn6yfnq6gk6OflqWgpqmsmLaxo6qztsXEvb+1wMK7yMG+yce2uLW0sbO0t8HFtr6xuLW4tJ+mrKqsnZ6epaTBpZ+prZ+kqq2voqaovLWmsb25t7bEsrS4u8C0xcK5ua+ztbWjnaWVkpShrp+Zop6pqKyjmsKsqZ6srpubnpmloL2hnaSYq6uspqGajZqfkp6Jjld/lp+loaC4qqaTmLSinrCfnZmtlZ2OmJOcgY6fl5WNoaOWkKWtsaupoaKlpJWVnZiKjpGSpJ6IXmFYYl9LSEpKTkZFQUdLPz5LQjo5SktOXVFRST1MV1w5Rkk9RE1IOEhiW0tDTFBTWVlWV09aXklBPVdRSkw/SD81SExYU0hBOkBBRFBIPz5RPks3MDk5RkU7OEc/LjY+Nzg+NzcvMT85MSUxUVVtW0pPMTA9Z1dEMTc9LSt3YFM2U1trV3FHRTY9dWVcS02enqGZn8SopqG0op2zqJSrpaCkn62prJ27sKistrHHxcHCssPDvcbDvMTJvK+wtq2wtK++w7S5srC6tKyZqLGpqpqdpaGnwa2brLCbqqOusamkqLy2p7e7vrC3xK2zs8PAtMi0vListLatqqKmlpWVo6yhn6Cbp6uwr6+7saagqaiamZiToqO4oKGjkrCwrKWmn5OinpWej5CNlZ6bop6ntKemjJeym6KtmZyaq4+dkpWSmX+RoJWOjZ+glIulq6+lpqGcoJ2RkZqThYqRjZudfl9kWWZlSUhMSVNBQ0BJSDs7Rz85OU9OVl5SU0o/UF5dPUhQQkxMSTlOY1xMRUxSVFlbU1VPXGJIQT9aUUFIQUtCN0ZFTEtNPztCSEROQj07TkBBMy85N0NCOTdGOys2PDQ2PDI1LS80QDErJlZ0U2VPPzEwNGJbTTIzPjA8dl1eP1tUXWVwQDg7SJZ3ZUE0nqOfm6DDqaSqs6KktaqWs62noqSyrK6pu7KtsbW0xsDEwrTAxL3JxLW/x8G0q7Wor7isv8OzuK+ttrmlmKqyq6uYn6aXrbu0m6iwmq2grbSyp6u5sqi6tLmzucCqt7LEvrbHqMCvrre1qaesoZiXkqaloqKYmaWvuK6ytbagn6mkmpSWlKSgt6KlpZawsrKnq6ain5qam5WXqJ+gmKGer7Kipo2WrZikqpaXnKKPmoySlpiFlZ6Ti5CbnZOKqKiqoqagmZ2Vi46Zj4GFlIiTnndhZ1tqaUxPTU5UPUNBTkM7OklANzdST11eUlZRQVdgXEJKU0hWS0g6VGRcTkZPTltXW1JQUVhdR0FCW1BCRz5OQzlIR0hPUD8/Q0lCTEI8MklBOTQxNzdCPjs3RTcrNjkxNDgwMS0vLjw2LSNCcWdzazIzLzFbYloyMzgwNnBbYkgwNElvZ1VDV0aMeWZDO6OjnaGmwKeor7GiqrWrnrqxrKSrtLaxsLm3sLe4uMW9w8e9vcTCxb+4wMXAuam2pKy7rcDBt7eqrbG6oZOtsa2ylqSnkaq5qp+msZyroK+0s6uptbatvK20s7m3rLixw7vAwKfEq7G3r6mrq6eemJmroaKhkZihsa+zrLC5mpupn5qXk5inoLappqOisbG0rLOoraCcoKCbnqWcopedo7Ovm5+Qk6SZn6eZk6Gdk5eIk5aSlZackoiQmpiUjqiopp+im5ibkoWNmYp9i5WEjZloZmtgbG1XUFFbVUFCRVRAPDtJQTg6WFBkXlBXV0VZX15OTVJOXktKPlljXk9IUE9cVVlQS1RXWkk/RFhQREY/TkA9SUdHUVBCPURFQk0/OjFEPzc3NTQ3Pz05NUU0Kzc1LzI1MS0tLiwxPSonKz1ccD0+MS4wZFpjPzE2NDdnWWBGKD84bH1nW1Y7iXtjQz6nn52iqr2iqrCspLK5qqa2tayhrbW9r7O4u7u+t7bAwr/JxLnEw7+/t8O8wLautaart7G7vb60qa6xtp6Wq66nrpemqI6nu5+krLOerKKxsLOsqbW0tb2usbK1rLC0s8G7xresvbCxuKytqqOypp6lqqCkl5Can7Oqs6urs5qdp5yblo6hpqS0rqihra6usai0rbOqpJyfqKSelaKZm6i1qZeZkZGdmZ2fnY+pnJWXhJSWip2Ym5OKjZaWmpampaOgnJaVlpJ/j5SFeo6SgouUZGpxZm9xXkZZZ1ZEQ01XRFs5SEM2Pl1RaFxOWl1HW15eT05SWGRKSkJcYl9RTE1PWFdYUEpWVldMPUVVSkVEQU1AQUZISFFQQTtHREZLPTg3Qj02ODcxOT48NjVEMCs4MC8wNS8qLC8tKj0sLCUyKyo1SzEvJ19eX1QxNTA9YFZeOCpDM1lVXGdLNox6ZkxApJqhpa23pKyqpq+ut6qvtryop7G3xrextr3Bw7W1usS+zMa5w8C5vrnDt8C4sbOrqbq2urm+tKmtsLWXmKesqaybq6uOq76dq62xo6ugsa2zrq21sri4qq6vsai1r7W7vMqzqre2sbSvrqahtKCbqa2gppaWm5qyo66hpq+XoaSampOOo6aos6qip7Otq7alr7K2r6OZnaynmpefm5mrt6KXk5COmJygl5aSqZ2akn+Rl4ycm5iWkIqUkp6ZpKGioJiWkpKVeouPhXqMioKKkWptd2x0e2FGYWtZSUdaWj17SkZENkFiVGlbTVxiS1xdW1JTUmJgTEtFX2BfUUxJUFdWVU9HV1ZVTjpJVklIP0NLP0VESEhRTkE/SEhIRTw3PT46NzU2MDk/ODY2QiwtOCwvMDQsKCwvLSo3NigoOS4kOks1LiJVX1RfLzUoQ19RXC4qQS9KR1BbRzNjWVVLRJmXobKpsqqtpqSvrraquLa6pay0t8q7tLu6v7+1s7fDwMzIvMO8tr2/v7e+u7C7raa5uba1wraqrbC3lJanrqupo7CplK+6pKyxs6eoo7K0sbKwtLG3s6mvrLKnt6+3tMTGt6m2t6yxramno7agoKiyoaWVnJqVsp6onKCqjqmjnpuWmKampbioo7K1rKiyqK6ytqukmaCrqJucnpyUqbiclI6OipeboZePlqSfm5SCkJSPnJqXlpWIlo+XmqecpJ+Rl5GQlXaDj4d7hIGDi4psb3Z0e35cTGZtW0tOY1w+YntHSThHZ1dmXExeY01ZWVdVWFRpXU9PSGBcXlBKSFFWVVJLSFdVVk04TVpORUBGSz9IQkNLU00/P0xPSEA7Oj47NjswNDE8PTQ1OD8pMDcpMS4yKSksLC0rLTkkMDQyJTlCNy4jQU5HZTI3J0diTFYlLEEuPUVMUTwzcmtJQ0ORmaWvpa6vq6ilsbO0q7iyuKGstbnJua7Bu8O4s7G1wsLOxcDBvbS9v766vryyw6eouLC1tb+8rquysZugp7GtpqavpZ2yta2qsbGsqai1u620srSts62qrKisqbitsrDIwbmlurGpra2lqK6xpqWkr6SpnJ6dm7Cao6Ojo5Gtn6SgoKKrpqe6pay2tqarrKmtsbauo56jqKqboJubkqOzmY+JjYaQoZ+UjJObnpGRg4ySkpyZl5WUh5eSlZmnm6CejJORjpB3fY2FfHt8hoiIcHJxfXx8XFNkb11OWGVcRkSWW0c7Tm1YYlxNYGJOVldWV1RYZ11RUkxjWVpUS0dPVFNOR0lWU1xOO1BeSUJESEpBRT8/S1NPPjpOTUM8PD45OjU9KzMyPTYyNDk6KDQ1KS8rMSgpKywtKiY1Ki8mMCkzODoxJiozQmM6NipIZUhKKjpHPjNCSFMsPpBrO0dIj5yqrKOqsaSppbS1srW2srKirK69zLquwLrHsbSttMLD0cXGvsCyvsDCu763u8Smq7arsra8wK+rsayfo6etqamlsKOqsqqvrLCvsK6stL2ntrCyqbKpq6Wlo626raqyw7q2rbupqaisqaexpaqlo6+qqKKfnKOtlaWemJ6ZrJ2ip6miraakrqy4s7KiqqOgq6+xrJ6fpqepmaSZmY+fppiHhI6Ji52gjoqLlJqNjYSFj5SenJSXlYaWlJOXpJydm4uSkI6Jfn6HhXx2foWDhHJxcId0bF9aYG1hUXJwXEs8hXxGP1h0WGFaTmRcTlZWVVdRXGFeU09OZ1hWVktHTE5SSEVJVlJdYzxQXUQ8RkhIQkc/PUpQTDo+T0o9OT89Mjo3OyoyNT4xMDQ4NSg1LyosLjMwOyksLCclMjM0JCwyLTg2MCkoMTtcSjAuSmdFRjY7Qi80RUtYMkCVWT1MRZaYramiq7Ocqqqxt625t6+spqurvcm8sL22wq+xq7PDw87Pw7+/tMDBw7m/s8fDqq62rbK4v76xrK2rpKeqsKioqbGltK6qsa6usrG0rrW9pLezrKyuqKugo56wt6uqrbq3pbe2pKqnrKuqraGpp6eysqSnpqGhrJeqoZWboKaepaKqpK2joKexuK6upKajm6qsraqdoqSjpJigm5aPl5yTgoOPiIWboIuJjYqXjY6JgouXopqQkJuMk5KRk6Oam5qJj4uLfIaAgYN6c3+Cf3xydYukh3hrX2BsZVdkhmNOP2eTTEVieVdjWVJlVU5WVVZUT1xdYVVLTWhWVVZJSkhJT0JHSVNRWW9BTlhAOkpHRkVHPj5FUUg4Q0tFODdDNzI6OjoqMzk/Li80NjMpNCsqLCsuIzQuLSsmKCs3OSomNis8LTIsJjA2VlkuMEpnQUE7O0IrOkpPXjREhz1HRkSXk7Cmo6uxmKuqrrast7OspqyqqbzAwLe4sry1prKww8nL0cDAu7m/vsG5wbnAw6yxtLGzusC+srCurKurqLaqp66vqrmwqLKyr7Ott6u5uKa0t6uspKmqnaSes7OpqKS0tKC3rqCqqKqoq6egq6ypubaqqqqqoqqgrZySqqGdoKWipqOqn52ota+ppqujpJmlqKeqnKKjo5+ZmaCQjY+YjX6HjIeDnZ2Gg4iJjYyOi4KFlaGZjY2akJKRj5Ofl5mWjIuDf3WHgX9/eHSCfnh2fYCHnY9vcWdmb3dcX3KIak9emVZIbnlVZVdRY1BNVlRVUE9YWmJVSE9pVFVTR09YVUk+SUhPUVB4TE5XPTxLRD9AQTxAQ1VDOUFLPTU7RTEzOzo3KjQ6PSstMzQxKjgqKisqLCkpKC8qJiklMzssJDIpMjAyMSUvMVBhMDI/Zj1OWD9DLD5MVF8wSmk1T0Q8l4+xoqasr5qspq2wtLWwrKawqqm6vru/sK25rqK2r8nHyNHAvr27u8G9usO/vr+tsbGxtby7wbGws6qzqaS0qaWus7O5saOuuLKxs7uru7Cqrrarqp6qq5+joLauqaGfsLKhtqqeqKeqo6qhoq2tqL6wrK6toqiooKyZkLChmKKgp6ifqJuaq7Gqo6CuoqGUoqSjp5iaqKWYl5iej4qHlIh9jYaEhKOWhIGBioWNi5CDg5OfloeRnZCTkI2RnJSXj4qGhnh1gn98dXh5f3lycXdmfoakdmlfY2mAdGaIjHxSWHBfS3hzU2RUUV9NTVNaZk5MVllkWEdSaFJRP0JOUWFROklITFNJcVFMUzs8ST87PD07QEBXPDw/SDczQ0IxNTo5My01OjopLTMxLS01KSgrLSw0MiMyKScsJS47LiYxLjAtMTQlLDBLZzo0OF89YWQ/RjFDUFtbKkhMOVVANJKQs6Glp62kp6Stp7WzsqulsKeqt73Au6+nuaqmrrDJx8jRw7y/vri9vrzIusC3r6+zsbq6t8CysrqsuKyitKeorbO3urOoqL62r7e+sL+nray1q62cqa+jn6StrKicnqqypLSom6unqaOonaOpqKm+rLSwrp2qpKCunJuzopWkm6SmoKWbm6qspqCcq6Kck5yipp2Yl6ipkpialJCKgo+Ffo+DgIidj4V+fYuGkI2Pg3+TmpKFk6KMlJGLkZuSlYeJf4Bye3p+fGl4fHlzbm56ZoN3hYpkYWZfcYN5bGZ4XV5UP1d7bVRiUFFZTExOcnVdSFpbZ1lFVWVPQz5KTkRDQTlIR0tTP2phSVE4PUg8PDw+Ojw/VDY6P0M0NUg+Mjs1OTAyNzw1KC41Ly0xMScvPktIMCUaOTAlLCwwOS8sLCs2JzE3Iy0wR2lJMjRYPWZiQUo3R1NgVSo9OUNWPSqQlbKaoKGqpqWiq6W4s7SmqrGmrLfBvbWvormsp6ewwsrJzMG2vcC0t7+6yLTCtLKxtLG9t7m9ta24tb6sobOnq6yxtri1rJ+/vaqzwbS8oa+ztaqsn62wo5ylqaqknpyksKWwoJ+rqaehqZylqaGtvKiusa6hq6Okrp6fraaXn5uhpJ2gnZukq6Obm6WllpeVoKOXm5alrIyekZGRi4KKgICOgXuZlIyIe36LhY6Ni4mEkpeQhpSjipOSh5GakZOAiX15bH52eXhjfHpwbm5wdWZ/cmqEaGRmXWtyjGxgaHBgbz1beWxVXk5QUktKTVRaV01cXmxXRFdfT15PSE1ERjs3SEVLTzxyaEtLOUFFOzs9Pjs7PUo0OUI8MztHPDQ/MTgtNjg7MigwOS8sNC8uPS0qSz4pHTQ5JicuMzQuMCsvNCYsOiQ0MUFnWTE0Uz1lX0RMNktWZE8qOzFOVz0jlJqtmqCYqKSkoKikuLCvpK+vqau4wbmyrZ+5r6uotLrIy8i+tsK+r7S9t8S2wrGtuLGywLS7vbeoube9qqO0qKmrsq+6saucvb6msMG2t6KvtrWnpqews5+epaaooqaZn6yoqZ6hqq6moKaYpKmgsbmfpLGvoayhrKScp6eomZqbn6WWnZ2bn6unl52hqpOalJmflJmWoamRmomOkIZ8h36CjX18oIyNiHiCi4SJi4uFh5OajomVn4mRlYKLl46RfYV8c3B+cnR0YHp4aG1ubm1nfXFje21pZGBbZIR+XllzanJJSX9pWFpNUExLSFBSUUlPXF9uU0RYWlJnTkdLRUY1NkhCTEk1WmVKQDZFQjk6Pj0+OjpDNTk+OjNARjwyQDIzLjo7ODMmMjwwLDg1QiopLUIqLDQ7Tk5AOzczLS4rLTcqKjwlNTM8ZWMyNE0/ZV1GTz1RWmdIKj0vV1Q1KJefp5qdl66hoaGlobersqa0tKmoucO0sq2guK2urbC1xsjAtr7BubC0vLe+u72vqr2wtL+xvcO5qbu6t6entamorLKutLGonL+4pq69uLOgsbewqKWnr7GboaSgpaWgl5yvpqGeo6ivoZ+hlKWloriwoaaxq5+so6+YnKqlqJ6Xmp6llJudm56orJqdn6aXl5iWno6Tl6KoopCJi4+GeoR+hIt6j5eJjYZ4gYaDh4uNhY2TmI2OlpmKj5d+hpeNj3mBenByd3BwdF95d2Rra2pnZoJsZXJqa2RnV2Byf15Za3VpWEV+XlpYT09LSEhSVUcyOV5ebVBEV1VZZUxISkVFMDdGP0tCNklKSDs2Rjk0OT49PDk4QDg7ODo3QEk+ODw0LTM8PDc1KDU+MSw7QTEoKzY8IzhSPSoxMTM+RDUsLSc0Mis7KzEzOWNsODRIQmZbSFRDVF1oRS46MV1RLDKXpKOYlp2rnqaho6G4qrChu7ilrL3Dsq+uorWwrK2vtcXEvbO+urews7m4uri6rq2/s7W4r7/BuKu9urSlorOrqau0ra6zpJ7DtqequLesoLO8qqelqK+rmaKnnKSmlJihsqWZnqSpqZyhn5SmoKS5qKSnraaepaGok6CpoaGgmZueoZOcnZeho6ycnJujlpOWlpyOlJOjp6SQiYqOhnmEfIWGfZ2NiYqGeICEh4eIkYWUk5KMkJWUjY6Ue4OXkIt3f3xtdXNtbXRieHRoZmlmY22DZmdoZGZnaF1kYWhlWmV6YmBQc1RbW1NLSkhJT1NAICppXmpMQ1ZVXmBLSEdFQy46QjxGPDZLUEQ4OkQzNTc9PTg5NT86OzQ+OEBMPT45Myk4Pjw6OSo2QDMuRTQoKyw+MC1PPy4rLTctMTE5NSwmLjUtODA1NzZgc0IzQ0RoW0tXR1VgaEIzNzdgTCcyn6Slk4+mp5yfnp6ktq2oqrq3p6zDwLavrKK2rqevr7fAwLyxwbexrrK2tbm4tayqvLOvsrG9v7euvLywpZ+2rKantaqrr6GhxayqqLK1rK20up2nqauxpZedqp+npZKZpa2imJ2kqqGboZyYoZ6nt6Wwq62hoZ6doZWhpp+ioJmcmpyUm56Vpp+uo5mYn5aVj5WZjI+YmqegkIeKioh4hXeCgoKdh4qCiHt/hYiFhZCElpWPj5CRkJGNknuDlY+Fc39+Z3lwbGtsZ3Vza2FmY2FzfmFkZWZkaGhiZW5ZXVhcbGNhTGdXWmBWSUdJS01SWD45YGxpSEJVU1xaSUdGRUEuPD85QTg5UkZANzpCMDM3PTc2OTI6PDk3OjlETT1CPDAqPEA7QTwtNUIzNz0rKywvQSpKSy4vKiszNzIyKDU3JCs3LjcyNjg1XHlOMj5IaVpMWkpWYmZBOjNAYUUlNZ2loZKMr6GamaCXpbSyo7K+t6Gxxbu5sLGjt6urrqm5vby7rcCyrq+utq+zubKnq7mwr660tru2r7m+raaetaugobKmq7CgpsWhs6awsrG3rbSdq66srqKZnairpp+Vm6emoJmlo6mdmp+blZ2drbGluqiuoqGam56Zn6SapZ2Xn5iclpqhlKqXraqclZ6dlI2Vmo6VlJinp42MiomOe4F0goKLmIWGfIiIhIWKjIiShZSck5KQkJGXj5B/gY2Og2+Cf2d5bmlsamdxcmtaaGNhcX9gZGdqbWpkaGVjbFxsbHVxYlNiaWNlWklHTE1PWVFQVWFlgVRAVlJaVEZHRkVALzw9Nz82PEVNYTg6PzI0OUAzNzgxOD83PTg+RkpARDkyLT1BPUE9MDVAOUAxLSsuMzw7SzYvLissLTI0OjUjMyopNi41NTQ2NVp8XTE6TGpbTVtLWGRjQEExR2BBJzSUo52Pj7KdnJWhm6mzsJ+4wLagtMG7vbmxprawqa6luLm3t627sK2rq7eqtbmtpLO1sa+psba2sbO2u6epoLaqnp+ro6qunazEma+nsLK4tayrnrCtr6qim52kramblZ2npJ2aqqOllpqgnJKco6yrqbuepqSgl5qanaGPa6OWmZ1xg5idpYB2kqypnpeYopOKmJmAl4qfjniFko2CbGl+d4RxbIaKhn2Ei4ZvXWRhZ4SYhmyLkJSSdXiLhH+DkH9miIFodmpmWFxpdG5NT2liZXCDZV1kZm5qZ1xbXImQhIhoT0tEOEZUZ15KSFFQVVZLSFJhcHRlRltRVVBFR0ZDPjE7PTY9Njw0Zlw1Ojw3NTtENDg2MDpCNz86PkZMQ0IzNDM9QEBAPTI4QEU9MSwsMDg+RzcwMS4qLiovNjY4LCMxJzIxNDoyODZYgWwxNU9rXE5bS1tmYj5HMU5fOysuj6SbiJaym52UoZyqrqyjvcWvqbfCuL68rae3saarpLi0srOxua6pp6y0prG1oqe4trWop622s660rrSiqp+0q56jpp2nqZywv5WoqLG1ua2tpKisqquloZ+coaiom5iipqacnKeonZOen5mQn6irpLWwo6KjnJaYmZejiKGPkpqHoYiVn6KApYCorZ+VlJ6UiYRyeI2Og4igdYeMaZaIZn5zeKBvh4eEfox8f6GgoJmAfIefdIiOdpuKa4eCg25pZWR7bXJiVIZtZG1pmHFYaW9thlZdaFpraVmHcGt5codoh4RZXkZOPkZeTUZTVlZRUFJXVGdeTVpMUlJQRUZHPjw0OT05PDc7MDw8Nzk5OjY9RjU4NjA8Qjs8OT1GUUc9LjU8O0A9QD41OUdBODIqLzE8STovMDEuKi8oLTQ1ODMlJjIxMTU+MTw4WIN0MTVSa1tPW0xbZ189SzFUXTcvKI6nmISerZ2amZ2fq6qoqr7DrrK5vLfBv6qkt7GqrKazta+vs7erqaWyraW2tJustba1paaps7KtsqivnqqhsqmgpKWcoqWesbiVpqiot76mraapqaynpaGfmaGopJqZp6OkmJylqpeUopyUk6Smp6G3paOfo5iVk5iUnYiukJiViqqMmaSdhrGBpa+glZuhl3qC1KiAh5TAm8Z4d7Glt5dkgMCcv3mEhHmPg3yQkJHKcZa8nMV7cranupB7gWyXsauxeWlsWLGub2ZqvJO8bmd5bXGO2H1SamK2snx+cJV1mqGqkFZOV2FPVk1GVlxYUFBTi1xXW1BBXERQTkRGSTw8NTc9Ozo5Oi49Ozg3ODs5PkY2Ojc0PkA+Njk/RVJJOi41PjtCPD9BODpKPjUyKjIyQUUvLjMyLisvKS0vMTg2LSAvNDE2QTE9OleDdzExVGtcT1tNXWdcPkwxWVo0MSGPp5SBqKqfmJ2epa2yqrDCvbK1wLW3v8KrprSuramor7SqsLa0qKimtqaoua+csrK2qqWkp7KvrrGnq56npbKloqKgmJyiobKvlp+kobW6o6qooKytpKGdm5qjqaCYm6mgn5eeqKiRnaeblJ6ip6OhsKOen6OWlpOYkpmFr2tqjI6qf2iFloetZnKgn5abqZdxrqGkf3e6fGugj3axX2q0W6WAZZyQYGaBemZ/aXhrqmW+c2emjHaxanyxeHWSlGNtbaduXISgRWlniJZFdZxffWZ7o6aBWF6Kq2d8jHd7aqg4Sq9bWFRsY1pLT1lgXFZWO06IUFdWMElTU0pDRUY9PzQ2Pzs4OjkwPTg5OTk6PTxEODs6Nj1BQDY8QEhRRzkwNzxBQz5ARDhARz0xMy0zM0UzLy41My8rLyguMC46Ni8nJDIwM0IvPTtVgnYyLVZqXE9ZTF9nWTpONV1XMzEbkqOWg62npZ+jpauyuK20vb6wt8WyuLrDp6mwrLCpqrGvpLG7saWlr7OjqrmpnbOzsaOkoKqtsKyvp6igo6OxnKSemZaZnZ6wqZico6C1s6GrmqGsrJ+dmpego6mdmZ6loJyZoaekkJ2im5ehoKyfpqagmp+hlZSRl5GbhrWbtXmHqZq2mXiHtJu3f5WYmKyXf2uBpnuBhYaRlJJ3q2dqsVuse46HlHSJcI6GgX+IkZd4g4OLl4yDoI+FsHZ3n3Jra218i0+lWEhkZJl+Y2imX3hxdFKShl1PqW1ib3qFgGGdL1OibltUa2dgTEtdZFhcWkI+sHdXWEEjTWlFQkRBQEExOT44ODo4NDs6OTw5OkE6RTo6OzY6Q0I4PT9LTkg6NTpBRkJBQUQ8RkQ7MDIwMTtFLDAuOTQwLC4oLzMsPjgzMR8vMi1EMTw8U31uMytYalxPWE1fZlc3SzlgVDUwHJeglYm0p6ehramos6yqu7fCsLzCrbm2wqutra+vqK+zqqKwvKuiqLato6y1pKWztKijop2oqrKosKimn6CgsJegm5aWl5uhsaWcm6Wptq+hqI6pp6mbnZaYoKapm5+dpKCcoKOlo5abnpianqOrnKaanJqioJaTkZOTnYTVk5m5cbHCf8aHfdaUnLt9nJeoko+djaR7jYahgKWCeat5j51Wr3uJfp9quVq5d4eEfaaDlHyZe6l5jp2Qe7FtjoR1kLyGb5VQr6fFilGgemNgqmFzcoZrlodeUrW0yIV+iXxjpDRDnXVdUWloZFBAWGdZY2FKSE1qSlpTT1lmWkNEP0U/MDw8NTk7NzQ8PDg9OjxDOkY6Oz42OkBDOzZAT0xIPDo8REhDQkNEPEVGODEyMTFEQi4wMDQ4MystKS4zMjM5NzEjJTUqPjM9PVF3ajYqWWlbSltQX2ZUN0g6YVA3MiWco5OZsqippbOqpbWopLy4wbC6wLK3tL20tqeysaSytKegr7apm6m7rqOxsqGytLGhpJ6eqKmwqbSppp2en6yYmZmYmJaYo66gnJeprrGpo56OrKKnlZ2Xm6GnoZiioqOhm6KiqJyeoJ6VmZunoZynlJuan6GYkJKVkJ2Ism5otXKsiHCPp3K0dnS2e5yapo6QnY2jfo+eo32wdYKQ0tJ1XK58hX+kbpuqpmuHhX2tfZiZkHuxc5Odj3mzZZZ0hZ5un2aUUsmLWsJcn3liX61fdnOEYZaIXVnKnW+/fnJNS7VTVcZkVVFqY2VYQU9rX2xoUFVGSDk9V1JbV1hIQj9KPDI/OzU9PDU2Pjs3Pjw9QztHOTtANzs+RDsuQ1JKRz4/PElKRkNFRD5JSToxNzQ2QD4vLjI0MjUyLSkuMjYsNzQyJh82MDs1Oj1QcWg5J1dpXEJNVF9lUDVHPWFNNjIuo56RprCtpam7raa0pae2u7yzu764uLW8vLSmtbWjs7KjoKywpZiou66lsrGctLiqoKWdoaqlsqisqqWanZupn5aWmZmTlKWropiUp6uxpqGVkqyfpZKUoZylp6CVm6anopujoK6aoJ6dkJabo5+cpZSdlZmjnpWZlpKbhax8eKh3o4+Lh6pwrYyFqISam6OLk5uLon6Rl4euhH+Bs1xyslOvfYKCo35x1313hX6PnoeZmnevhoqRnIh3tGGaZZuBgZVskluwV0uadZh5ZmGtXnZ2hWaXiGpdr3aVno93azV5yK6zYERVb11nYEVQbF9wbVZVTS5lY2hSWVE7QUNATDo1PzkxPjwxNj85OEA9OkM6Rzs8Pzo+PkU5LUVVSkVAQzpNS0pCSEc+R0s5Nzw0Njo+LzA0MzMzLjIuLjE4Ki4zMiUhMDQ3Njc9UGtlPiZWZ1xAPFVfY042R0JgSTo3N6CdlKG3sZmzwa2osqeqs7q3tbm+urizt762pri1obauoKCprJ+VqbarqbKyq620pJupoKCoorWnpqqkmZ6VpaGUlJ2akpalqJyUkaitsKWglJmonqKPkaKaqaWhlZqmqZ6dpJ+tnKCdn42UnpyfoZmYm5WWoqCUmJGnnYepfn+meaGPkISqcK2Ng6eGl6Gji5iXiKOBkIaUqnp/i515cLFaqIOCiKB4dNh/dod0qIKPm42SpHyWkJ+Ee7JenGSgfYKVbpNdq1xbk3+Rf2hnqmNyeoBqmIZxXataiaCPa21kT0pDoVxbTXRdYmZNWmFfcnRgSlU1SpqRWEhFPUdFQUwzNUE4Ljs+MDVBNzhAPDY9PEY/Ojw2Pz1CNy5IVkpFQEg2S0lOQElLQEVOOjpANC47PjEwMjE1NCsqMDUvNywmMjEoJCU2NjcxPE9lZEEmVWZbPzBUX2JMN0ZIX0MxPTeinZqav62Ys8Kuq6yop7WxuLG1vrq7s7K5vKq7tqGypZ+mqKifk6yxqbCrt62qr6GYoqCmpaS5o6OsoZeckqOglpWfm5WZoqGRjoyqsLCmnZaap6afjJKkmKerqJaYqaifoKGkrqOgnqGOlaGZoKCSnJeblZ6hlpaPrJyPrm5ytHSpjHeLpnS0enW0gpSnpJSdjYmkh451uG+Le4uia2u2WqGGZZeXaKCip22UcrR0k5l/s2qGkoitanW0YZ1mom+GkmuYXa1gTqF8h5FSc6NseX59bpiGb1yvVjycd2VUb24uW6dPY1JrZWJsWmJcYHF8Y1NZUT4/bG8yQkJAPk06ITdANi47QDM3QzU4Pz8zOzxDREJKRk1JRjYySlRLRUJKNklKUD9IT0NGUD08RTUwOzswMTAvNzUsKywzMjYvIzAwLCwdMjg5LzlOYGVEJ1VkWT4uVV5iTDVGTV44MUE4pZqcnrqkm7HArq2rq6i3qrivtcC1vbKxu7iswreqrKGdp6SinZKsq6i2pLSorqqhl52ooKWruJ2jrZyWmZCmo5eOnqGcmZ+gkZSVrLawppiTm6yployUppmlraOSl6uzpKCeqKywmKGikJmhl6CblpuXoJSdqZ2UkKuZh9SUmrt1scSAxId+1pecuHmKkpmOmIqMp4d5orZ1fXd2wYOasmGDunnAfHW4YrWBjIepfZWCrKlxe391vIinoGmdYaaOr6J+jXWHq32+bnO8dLKDdXiAiW2aiHBtjaR0vV13fVthebxqWlZcanpeaWFjZmJueW9YW1lDQUBxP0NHKzRIIic7PzEwPD83OkI5OT1DNDxATlpeYGBfX19aUFBSS0VGSjRITFJASk5FRk9CPEU4ND05MDIwLjg3LSouLzE4MCItMSwzHiw7OjA4TFhhRidUY1g8L1NdYEs1PExbLTY/Oaean6K8o5eww6+tqautsai5r7fEsbuzr7ywrsKyraajn6WinZyRq6Wqs6W1p62koJaaq5mnrLido66YlaGRpqCTjp2jnpmfmpCWk7C5sauVlqOnp5SQlqWdpK2fkaGorKCcn6mksp2ipI6moZWhmZuWlaOZkLCgkpWqnoWQmbaAkpKNuJZ5g5ObtndubG90b3mPhI6Jcp7Au7yae4GyqHCBdJG5g3yGhouGjXuKh4yXfaS7ub2cdXmzo3R1l3V0sHWZnmaHao22dHNxd7aLXoB5fIhng3lsemKLrHB0hX5XW6dpRGRaVGZfY11iUGdmcW51Qk1PTEQ7Wkw+SjI7MCA4PjsuMz1BOTk/PTs8QzZCVFlaWltbWlteYGJgXVNHR0g0RElUQUtOR0VPRj9HPDc/NzA3MC85Oi4sLy0qOC8lJjIoNCQoPjcvN0tUX0cnU2JXOCpPXV09KztWVic9OjymnaGhv6aVssKzrKqorauqu6+wxq+1tLC4p7W5rqukoqefoJ2ZlK2lrquntqion5yWoaSerKS9p6Gql5WckaKbkpCiqKKUn5eSmJSytbasl52jo6KLkpKmm6WrnJappaacm6GqpqaiqKGRrJ6Xop6Xlpedno+wqZScp6KPa39qnap6iXR/nI92e2aIe72+wLpvkoNxlIVfcmpaXpuKYWOHj5ZsYH+VY22cdmKVbICZlZRmXmBjcZuJaHKMfIaUZmp+cXR4f35jXHh1gWhQXG6EfHyKalhseoJxSEpvhXBOcU1EVlxmYUxbV2ZjXk9bbXVrclJPRERNPEhIPEw/MSwyQT84LzU/Qzw5O0A7PUM+UlZWV1laW1tcXWBhYWFgXFVHNUNGVEVKT0hGUElJSDs4PTUxOi4xOzouLy03Nj01JiIvKjIsJTs4LTdJUl5JJ1NfVjQpUF5MKDM+XE8nPzI+qJ+posGkmrO5tqOspq+mqLayrMissLSttqS+srOnoaSqnaOcmpqsp66kpbaqpZuYlqKcp62pvqippZWUm5agmpOZpqmokp+Qj5icsLK+q5qmnaeiiZORqZuopJycrKCjmpujp6yin6mhma6blKaglpSdn52XsaWZoqiZnZKfnaWmm6ikm56bnJuSl4Job35xd5GXlJCEibSqjYWYlY+KjJmXiJSViYOTk5GJjpKUmJSZl5qfoZqblJ+bjYF6pIVranyRfYF1iouDcoJ3eXZ2i398iWpzgXSEdGN2fXZrb3hsX2Jbb2dNWFlmal9XWW96b25mU09GUjlQWk5STycqO0tCNjM1PUBBOTpDPjxFTlNTVFZXWFpaXF1gYmJhX15eW1RLQ1JHS05ER1BMT0k8Ojs0ODksMjs4MjApNklSTzgiKSsvMiM0Oyo3Rk9bSSdSXlQxMFReOis9OF1LLDwtQLKgs6K/oqOwsbegqqazp6WwtarIq62zp7amwai1oZ+lppyllpWhrKetpKS3rKCZl5ahmK2qpcGfrKSWkpyXn5iUlaOenaOok5CYqKiywq+Zqpyqno+Vlqmeqpyeoa2ZoZudoqWvpqGjp56smJalnZmaoZ6enbChnaKnlpmUmZSipJikoJmij5iVjIuOkJiukHyVnIKRgYmpqIWAmJeLhI+giHuEkYWFmpGHhoqVj5uXjpGYnqOWmZKQnI1+jWWhs66FioR3e5CLfnh5em9meZGBgYhrdYF5iXFoc395dYOGgGpzYndlX2hlY2Rmallre3FqalxSS1BEX1VGQD4+LDRARjs0NTs+QTs8Pz4+SE5OT1BTVFZWWFpcX2FjYV9eXl1eXVhWSktMQklPTVJKOzw6Nzg2LzM5NjQuKCYkLTEuLikrKjclKzwoNkNNTEQvVFxRMDVNWzE3RTRcRzU8LECyn7mvvq2rrbGyoKqmsq2jrLOwxbCrrqSzr7yltZyhqKOhnpmXqaeqpqWms7aflZWempqwpq6+oayikZGempqUkpahm5epnYSdqaujtMezn6mjqpaVl5qnnqicoKSslJ+fnZ+qrqikoqqhq5qen6CYpZ+cnp2wpJmfqZSamZ6Sppyaqp+cmGaFlH1lf4+bkGN6jW1oanqQo6tqZZqYfmeFi2VlaWh6jaKOa2iMmJGid2tqi5mjn5hzbG16hIyGeVhlXYaCXmyLi4N3XGh0d3eSgIeBb3iCeIBybXiEc3aIh46DemiEWF1qdGRdc4hoanxxbWNdUU1XSmRYQEkzPUY4P0ZENzE8PT9BQzs7REdISElMTk9SUlRXW15gYWFgXV1dXV1fXlpUT0RIT0tTTj0+PT02NTM1NTU0KiYmJSwqJS4rKyc2KiQ7Jy9CSVtKLjZaTzYpRVkvRE8xWUI7Py49pJ66vLmvq7Kwq6Wora+xp66usL2xqqmlrrCxoK2XoaSeopqapqydraSmqKq0rp6WpJCjsKa3uaWuo4+PmqKak5KboJiYppZ7pKuiqLTDt6Shpq6enZSeo5+jnaSqqZOfoJ6gqq+pqaKpnqabpZ6noKyXoZulsaWYnayWo5+bk6eZoKyan3+9hIp0tHOFn4ataHe5xLhxkqGjeqaZmXSrgn3LwMC6cYujh4OefZaYiJ7AvYKWnZ2NnMHBfIF6kYyawsB9aqWycI6Cb8p6gJt4koOOgHd5gYB5cHt/hnB4hIqSeGx1kWFlXnhkX2WBYl10aG1kYlhMVUlRWUhPRDJJRT9EQj4vPD8+QEE6OERDQkNFSElLTU5QU1ZZXl9gYV9eXl5eX19fXlxTTVBHVU5BPz89NjQ2ODI2NiomJSMpKiYuKyopMTAfOSojPklbTCojQ1AvI0ZbM1BZL1VBQjsvOJWhucO0r6+/qamUo7CqsK+uprK1r6qnp6axq6CrmJujoJybqqejnqyjpamlpbSknqOUpq6suLSnr6KSkZmdppORoKGXm6CeiKarpKutv7+woKiuqJaRn52imaKkqqSUoaGdnayuqKqloqKkn6OknK2pkqSaqK6qnJ6rna6jl5inmKOkmZ5/zpR6e6WCepaXm1+tj12OqIChoXynlZt1q4OBr15kjKp7qIeFoHSXk4izY4KrhqCNjbNqhK90fJaHuGGCrVmjzW6Rdnvbe3+ZcX6IknZ/ZXuIdXZrfYdtfYSOkH5rgIxecGpwZ2BfeGRbcWhqY2VgUlRTV15KT0M0QUhFRDg+NTtAP0E7PThAPj8/QkRERklKTE5QUk9TXF9fX15dXV9gYF9eXltXT1VKPT8+PDU1NzgxNjQoJyQhJywmJi8oJiszHTYwJDc7U0wrLC1KMCc7XDpMLSFQQEY0LjGswcDAtLSwt5iekaSqqa21q6ayrKyspa2msKqhp5yappicoq+foZ+op6OmoZ+xrJyflaaurbGrqKyglJKbn6WTkJ+ll52opJ6to6qwqL/Fsqepsa2Wkp6copehqqqflaGenZytrqapp5umpaKgqpKss5aloquqnqSop6OyopObqZyinJaVkZehcoaMmHaGqIdxsHydcax9oKCCpY+eeKuCfq1/nXKtf6yHhp92mJJ7fJd/qoiijJGMnH2reoiTj59/eq1WnMR7kHCTwX2BlW11cIxtZndlh25heG5yboeJj46CbI6NY25zdW9gZm1kX29pam5mY1hTXGBaUlJDOElIQEM8PjxARkRDRUE9PDw8PkBAQUJFRkdFQENJU1dZWlxdXl5cXl9hX15eXVtaUkM+OzkyNDc4NDUyJiMfHCAxJyAxJx8nNB41LSY3PVdKLT0oPjEpM1ZARiEcRztDMS4rr9PGx7KzoJ2jj6Ojoq6vt6+psaeoqqmuq6ynoqSdmqOVn6aroKKmoKioo5+esKyYm5aop6+tqKepnpeVmqSikpShrpqdp6OurKKstam5zLGspq2rlpScnaKZn66snZahmZ6eqbGnqKiaqqajoaqarrGiqKuvppqnrKurs6STmaWnnJaThaRrpHWKeql1e7JxgqWKmItxiKCbh6RfYVKrhYCug5x1roKohoafepmXhntmgKOKpJiGgqN9qX+BlIauXnuoVZ2ikoJ7o5+AfMSwxYxzr7SzuXJiqa/CdGiLi5WNgGuWj21seHd3bmtmZWRxcWZ8aWNdVl9pWFhUTExQTENDQUI7Q0BAQkk8PTo5Ojw9Pj4/QT04NjtETFBSVFZYW15eXVxeYWFgX15dXF1bU0lCNjc5OjY2NCwmJCIgJychKy0iJC4hMy0mQERXSCxHKzY2KjFQS0wjIEE5RDQsJ8HJ1tbAoJmrqKGvop+xtLCvqayjp6erq6uppaagm6WfnaanpqSdrJqirKGkoK+jnpuTqqS1sK+hqZuclpWnpJGboqifn6acsKWiqLGstsextKmrqZWRnZ2hmaCls52aoZScnqeqqqKsmaqmoKGpobKtoamysqGcq6qxsLimlJimqpqdk32qbZ+EiHareXywboKki4iflpWeloHSuLS4yYGCsl9glKmDpYiHoHqYlpp5qsl0mqOUqKmQkpqMfpqJmsbGd2WhgqV0gqCOgn2vX2+1Y7F1S6OHbadHg5NkjY+ckHpulI58bnl0fHptW2ZqcnFngWleYVdjbVxeWUlMTEpFREJCPUE8QT9KOzc5Nzk5Ojs7OzMuNjxBRklMTU9RU1daW1tbXV5fXl9gXlxcXFxcWE1CNzU3ODUvKSglJiUkJiksNUZOUFBNRkxKVkYqTDEvPS00T1RRHRw7PEYyLCSnpMDHua2psq6tpaOcs7msq6Glm6imq6yppqCmpZiro5+vrJ2moa2an6mlnae1oKSYlKirtrOsnKacoJaQpq2Smpyno6Cqpq2go6epsLPBsbKprKeTiZedpZuipK+ml6KVmJylpamZrZyrpaSdq6O2q6CxuLCenLCotbW2p5aZqqacoZCDnk53moKAn3uEo3yCpIOGpp+cn5SEuHx9ermDgM3Gw7Z4m6KSi59+mZeXinafl4qkmKSofq+FnIOeg6x9mZRhpWyjcZCFkIF9loRyrGCkc3GAmmG8fVJVdY2RoZR6e4+NhnJ5c4V/cFtsbndzaoFuWmReZ25iZF1LS1FTQUdHRkg6Oks+QjEwODg1Njg3Ny0qNT09P0JER0lMTlBUV1lZWltcX19eXV9fXFpaWllVU09IQDc3Mi4sKi4rKicmP1FUVldXV1lYWFdVT1RGPEUyOlBbUxwbNj9HLC0gi4eZqaukq7mrr6Ccoa2ztKafoZWlr66uqaeepaWapKehs66iqaezoJqppJSjtaOjlpehqbW5pJujnaOTkKKymZ6bpqWgoq+snKSoorWxw7CtqaypkYeQnKedo6ScpZeemJiZpaOomKyhq6Kkl66kuqyhtraunp62tLqztqmaoLKkpqCIkNK1w7d6h46GkZOPgKZ3lKJ3jKGShaWDjHKriIa0bnNqmqSdloqffZeZh4eQc66CpZujjaaKk52IlJCabXCyXKVzk3qcbJl/e5l+bqlhonJzfp9ic7K4aHeOkqOWe4mJjod1e3iOgmxod2h4c26AdF1kY21tZmhgSllXVzxHRj9TM0BGPjwqKDYzLjAxMykmNDo7PD0+QENFSUtOUFJUVldXWV1fX15eYGBdWltaWFVSUlFGOjIyMzAvKysoQFFSVFVUU1RWV1dYWFdVVVZVUU9RW1UlITJBSCMqJZJyjYqtv7+8u7Wel6ikrraiopmVo6qorqmrmaWin6agoLWmoqmnsaSUq6OPpK2knpGamqq0tKSdpZypkpSXr6CgnqajnKecs5mgqqO1qsKvqKqooYyDj52ioaajlZqanJiamKajpZeppqugo5uspryslL2wrZ+jsbW7rbepnqu1p6uafKiSfXyweIuApKWInG2xb6CHrXyij4Ool5qCrIqGrYahlaiho5iGn4GZloF7kn6rgZ2Zlourd52gj4iTkn96r12jgX2mp2WegHyXdWquXaVscoaZXWBbjKBtlI+jloCRiZKIeHmBl39qbH5ifXRtgHlgaGVvb2hnaEJYX1o9SlMyUzhBQUM3JCQzKycnMywgLzY2NzQzNjpAQ0ZJS01OUVNTU1ZaXV9hYGFhYV5dW1pXU1BPTkk4MTUyLiosQVRWVlZVVFVVVVVUVFVUU1NWV1dYVlVVUUhGSUojKCi8kpqEqcbDt8G0n5utoK65pqOOmqOkoK+uqZ+jnp2tmJ65oKOrobCqmq6hkaqppZeKmpCtsa2noKibrZiZj62ioZ2loZmknK2Xn6iltqi+rqSpo5+Lf46bmqCmnpKUmZqTmpmko6KYp6qqoKKep6e8pJfCrKujoq20u62wqaO2sqyumnevf5CKnIWHfLqtiZhksIxklq59oZCEp5ecgq2MhbCHqJqkoqOShaBcbGuCs2B/rXx7goGybGdumZeLh7FafbVcpINryKJmn4F7u1l2tVqyfVOvgXqsWIChbZaNpZiHlI2Rknl3jJx9Y3N8YoN3dIB8YWpmb25mZWZPVGJbQVNdPUgoPjk9NCEhLCQfMS4gKjEvMDQ1Nzk6PEFDRkhKTE5QUFJUV1peYF9gYWJeX1xbWFVQTUpHQzU1My4vQFVZWFdYV1dYV1dYV1ZXV1dXWFdXWFlaWltcWFdXR0I70p+zsbe+u7TCs6Ocraelt6mgi5mgn52ysaieop+dtZigs6iqq56wrZ6snJWvqaOOiZuOrqypp6Oomq6Tmo+pmqGdpJ+Zo6KlmJ6iqLGou66kqJ6djnyLm5ahoJmQkpqbkZmXqJ6fl6espKOkoqOoup6fxqemqaGstreusaqhv7GwsJiCqpOjro6bgIakl5iQgIC4w7qEj52UhaiZnoOsjISviqmdm6arkn/VvcKqYqS/vX1/o4KD17u4tYSUkoKevb6Ea6OCcKuEb52AerKxx4Nrq7G9rHl4or67dICUjKOZjJiNkpl3f4+ZeWJ8eWSMZniBe2BrZWpqYlBiW1JpXD9TYEJMKTw6NC8fHyQeJTIgHSQoMDQ5NjY3ODs+QURGR0pLTU5OUVRXXWFcX19hXmBbXFlUUU1IQz48QT81PVNZWVhZWVpZWlpZWFdXWFlaWllZWFlbW11dXFpWWFRXWruVtLSywLqyvrOina6npbOnnYyXpb+ptq+nob+mprGbnrGcuaifrq+lp5WUr6yXjIOaka6mo6yhpZyqoJiKo5OmnaabmqCoopidoKysqbitp6Oal5J7h5mRp5uTj5CXmI+Yk6mYnpaop56opqChqrqdqMWjobCkrLS1rLKso7+rs7KddXaqpLaFZYmfcGeskIqPbm53pZCboYJ2spyYcZGOcperpJuZr6VybW1tZot4b22DmnGBempxaWeJlpWXcmlphYdncYdkXotjanBaXWd+eKZgYnKQknBmZICMkY6flJSWjZKaeoSNk3RkhndnjGp4fnlkbGNlbGJKZFdJalk5T2NETydKOSsjHCAbIiwpGBsYLTIuNTo0NTc6PD9BQkRFSEtMTU9RU1ZcV1tcYGBhXV1bVFBMSEQ9OkFCN01YWVpZWVpZWFhZWFdXVldZXV5eXVxcXF1eXV5dW1tVV16ola20qbq6srOrqaKun6OzqpiSvbHDx7y0qZ6/q6yjoKeroLqjpK6sraaOlq2qkIyFlZatn6arop+kpKCSi6WSppmpmpaiqaCVnKWlpq65qquZmpOSe4SXjaaXjZGQl5SOl5Wmk52WpqGZrqWcoau4nrDBqKW0p62xs6ywrqq8p7K8mIyjqaW1nImWopiHqZuPlJ2SqrSanKSuorWZpaSgo6SfpKailqynjZOTjYeTnZ2VkJmTmJGPlYV/pJqXlo6MlJOKkIiFf2iMgXWDd3WHjHGnbX2Wk5SUgYGPj46Om5CdkpOSnX+Fk4xwaI92b4l3dXx5aWtlY29jVWFYP2haR2JfTlcrRT0rJiE2NDAuHxwgJTIoKjc5OTQ2OTs+P0FCREZKS0tNUFBRV1RWWV5gYWJdXlVQS0VDPjk9QEFTWFtcWVdYWFhYWFlYWFpaW1xeX19gXl5eX19gYGBfWVlgpZapqqS1uK6vorClrqCgt7GQjqrEvMO5tqmhpJ2bpZ2wqKS3p52ptaeokZiso4yIio+cp5atpKGaqJ6fk5akl6iaqJmTpaCjj5qnmKC0uaeqmJqQjXuBlYuhlIqVkZWQj5KXpI6dmKeemrOinKWqtqeuwa+kuKewsLKvrK22vqSzwZqTp6WmtKKSnaaejqmgjJKfoq2xm6Kls6uzmqajn6esoKCenpitnpOaopyUkJermY2ZmpeQl5+Rh6CdlZSGlI2QjpaNgn9mjoh2iHd6iIR0nGqIkpaVkol9jJaRkpaQnY6Ykp2BhZeGenGUcnmJf3F7fmpuZF5waWBcX1hsYk9fY09YOUZGRD0yPD03LiolKykmHSY0MTY2NTg6PT0/QUFDSEpHSktMTVNTU1VaYGFpYWVVUEpBQ0I7OUVNVlteXltaXFtbW1xdXV9eXV5fYGFhYmFhYWBiYmJkYlxbY5iWpKijsLSsr6Oqp66gp7WqkY+bo7K5raqroaKZepyhsKSmsamXnLimo5SYqZyOhoqJnKKQr5+klqmgoZOXmZyui6qWjqeYp4yYqI6duLWjpZebjYl5gpOMm5OKlZGTkI6RlqGLnJ2mnJ22on6DrrSisK91pL+ks6B5e6OttcCYeLCmoYqAqn5kXGJ2n4+knoOWfm2UtZ2lqbGtpmagopV1e5yZcYGZqpltgKSpimWcpZyRmJmXjJOckYWdm5CVhJSIj4+Ti4Z5bJGIdohyfIaBgWFpiYyVk4xbdpWQZmiOi3F4n5WUZHeXhoF3l2iCiYJueX9rcGVgdm9ra2hbZGNhYW1RWT1NTU1SRj0/U0I5MC8eHyY0OjMwNjY3ODw7PkBBQkZIQkdGSUtMVFVVWV1fZ2dnV1FJPERIPDlWUltgYWJgXl9fYGFhX1xdX19fYWFiY2RhYmFhZWRjaGReXWaclqajobCxrKuqpqmuo6etpZKVqrSusKWZqaWqlnOLnK+gqKunlJe5oKCPnKSekX6IiZqejayapJWoop6Ol5KehXWuj4ilmaiRlqOImrizp5+YmIuJdHeSjZeTiZOQkJOMj5KfjJmepJibsJSAjJu1nbSMko+9p6J+p6N7pbK7hI6QqaCEjIWPsaqvjImWo5p5gIushp2fo6mrqomWiJt3pZx7iJyBmKeEgnues3uKhqCYmZWYl4GRl5aEmppieYiShY6Qk4uEbnKRiHqCcoGBhoCHdIiGl5N4lmiTdKCadHuZgZuYhJh+kImBgpdpjIyEanh7cXBnZXhtaWxqW2NpaGRxWltIU0tQQEU1LVlTVDYpITA5PT43NDM1Njg7Oj0+Pj9ESUBJRUpLR1NYW1hbYWFpZllRSDlFTDw/YlZeYmRlZGBhYWBiYl9dYGFhYmJiY2ZnY2JhYGVkY2djYWFonZikoKaurquoraCpsaanqqWZk6zEvK+glKWns5yPg52snaeioI2Qvp6ZjZ+aoZF9ho6Yl4isnaOWoaGSjZSJhoCRqI6GoZyjk5adhZ64saidmpKPhXB1kImVkIqTj46bi46RnZCVnqKUnaqGn7SJtJqui8qIq6+Kt4WNsISzs4epj6qajZ17qI9ye3ecjqaWaJWkebSMoaCoqpSawoKBq4mZoXKegJulfpeGlrKBoX2hk5+PmJiAj5SbiZmSi32GlIeNlpSKhW50k4aAe3OHgoR9hXWGg5iCj8VmgKmHj6JpnYGdloCZgIqLg4iYb42ShGd3dHx3Z2l2cGdoa15ibmxmaldkRlxRTDJFNDZNYGM3JjM8RUdEOjYzNjU4Ozg+PT0+Qkw/TklKTENRWl1cV2JeamxbUUU9S01ASmRYXWNmaGdiYmJiY2NfX2JhYmNjY2RpaWNiYmJlY2FmY2JiaZWXoqCwqamopqygpbmxqaummpSeoaSpoZSjqLWhr3+gp52lnp2JlL2ak42gkp2QeYOWlpGIq5mcm5qihY+Md5ucjqCRh52jm5aYl4WhuK2lmZuMjH5ibY+Lk4+Mj4yMl4uPkZ6Nkp6fl6CmfaGnh62doJaukKCenZGHgqGNrrOJpI+snIyafaJ1gJmUa4KrdU2reIeNnZOcqqmCqqt/haJ8e6dqnoCTbGeXhpi3iZ5+bmBjWIOYf418ZGeMc5l+ephsXX2Yb2FUcoddYG16hGBZZYJ+hYGZcqiqa4OjbnKlb5+BmmdknmxabIl7ZVlfgn5hV1BwdmVvdHFqam9daW9samdXZk1cV0U4QTRGQ15rNCtJQ1FNTj04NDg1OTs2QDs7PkJPPlFSS01CSlxdX1deXmN1X01EOk1PTlRiXFxmZmlpYmJkYmRkYmFiYGJkY2FiamtkYmRkZ2RiZ2VhY2iYl52huaGqpKaskqK2vKquopmWnqClq6ufnK20oaeRoKChp5yZjpi0mZCLnoyVi3WBlJGNiqaWlpien36ThYaspIeckYqYqJeZmpGHpK+mopWZh4mAaW6IiIuOjYmKjZGLj5GhipKcnpqho3+TgY+joZSgd5yWkKeDo6mAh6yxiKV6jX+EmnyicHKTh5V7nox5bYebi5qSnaqcj4edfoSidHemZ55+d6VfmHt9k3Oibpi3tLp0k4iCgLaoZIHFuXxxlbaMcoGbpGR1rKthfmqds35ufomEj4OMmHGAo2tyo3KegXyjXpyZs5VwfJees3RyW56yg2picXR1cWhvWGprcXBkW2dcYUtDPUQ2UUFZcTI8U0dfSlI9PDM5NTo5NkM8O0BJUD9UTk5RQEVfXltZV2Bge2RJQzdMV1VWY2FaZmZra2JiZWFkY2BhYmBkZF9gY2tuY2NkZGhkYmdmY2holJaVpLmZq5yToI6luLWsraCaoZuio6SsmpqxrKuTmKGZoaWampSerJuLiZF4i4VxgJWMiZChkJOUnZd9kYqOqKCHmI6JkaKTm5qMiqinpJ6PloeEfmp6hn59j42Dio+QiY6Tn4GUnJ6bn56LiXecmKKNoHKhjImpiZ2okpmrroKujX56oJl5o5N4gHOXh4ycfZSehpuOmp2oiKNkoX6Ml5CbjW2eaJuOb5qZe4CKp31yaHSrg56Dc6pnlJpdm4V3hZ5oqmqAuWZcqXCBnGGVjF+ndneKi4CdaJp1h5OSmI19nmyYj2qmmVyofne7an2pWo6EXbNnW25yeHdraVtwaXd3YV5kVmFBUERON1VCUW00SlpaXk5aREAxNTE8OzdIPzpDSFU/WVNYXT5EYl1WYFFhZHxpRkI5TltdWWVmWGZmbm1iYmVfYWFfX2BgZWNeYmRvcV9kZWVrZWNpaGdraZadiaq2nKiJY5WcrLuxr6udpZuap5+drJmdsKernpejmqKgmZaWoKSZhomNaYiAcnqWiIuWloSSlJiPeouElqSciZWPhoqdkpybiI+oop+ai5CKgIBpgIV5f5aLeoiNjoeOlZl9kqGdn6GSl3Jon4qgj4xwko2CqYmaoaWqo6t/sK6koriXdqOzoqN/iJR4nXqpmH+ij5+dmYmYcqB9iI6wtX1smpGheH6ZtaOjq6iEmXybfZybf3SqWl1ve5eMeZ5jTX97e4ZlephCTZ9ZompzfY9vgoqEmXabeYeJsbN/fZmSpnN9nW1wfJRvmXJpo12VdkhlY190cXx9bmVfa2d1emJjX1BdV1xTVkBZRVBnRFJWXGFYXklEPUI4P0I6SUU3TEVYQVdSW1ZFRmJcWmBLYG19cUVDPFZeYlplalZnaG1vYmZmXmFgXF1eYGhiX2VjdmxeZWdmbGRlbGhpbGmUnoGwrpqEU1+hp7S6srKomqKLmqmbm6eSoKujoKiPnp6dmpmVmKCdloeHiXeFgW54lISPm4t9kZOWiHKBiZKhm3KSkICImJSfmoSOqJyalYqKinyDbISFcYKhi3eEjIiHkZiUepGin52ih62GfbWEj56de6aWeqmCl5+RjKShgKdpeG5+mXOgc3F8nYWYb5OCrHujhKefm4OkcF+paHajZHCmYZzTj3x7mXhyc2OihpF+onKjkHZrkLOMYIOYi3Wrs6i8f3eEb3+/pqq0Xpxvf3KXcIJ0o3JepGd0pmBopmua05h5gZpudnmXa5t5dpdybKmlZ19leXF/hGxoZmNtdXZmX2FRWmVQUWFIVklUX1dTW2VqW2VQRUNLTElLQktFOFBAUU5YU1hPU1FgZWRpU2R4eXdKR0VkXWVaaGlTaWhqbmNqZmBjX1xdXV9oYmFoZXxkXmRnZGtkamxnaG1omJt/sKxUXUt+qq+xtLCyopyYhJemoKCijKSnn5epipmYmZSak5KgmI6HhXtwfYNofI+Ck5qBd5GOj4pwgIaPk5FrmJN8iJGSo5WCjaiZk5KKhYl5g3aIgG6Bn4Z3f5GFhpeglXiRoKKZn4izoaK2i3qsp6SupXGpgJuRhoKflX6lgaObhphxnoSira+Kl4t/jKSNlYOvo5V3tba2yqJ0lI2Dn2Cdl6lteZaHoJt1oYd3oH6Rl4uBb01mo5Nxm4l0pXt6dWKEg25+oG1yZGCcc390mGt7arS2tMamc5h9eZxqmpmrc4CabHN3l2mZeXSYcVBEfbNeaXZreIZma2Zic3RvbFVbUlloT1FnSVVMWFJVXGdrblVnV01KQUlNS0hKTkFRSlBlY2ptZXVzc395e250iXp7VVFObV5oW2tpUmpoaWxnbWZjZV9cXFxfaWJkaGt7X11kZ2NqZm5sZWltZaKdiK+nhWVAlKKyq6+vtaGij3+Wp6Gho4ukpp2cpoKZl5eOl5CQm5OOiIN5a3mGZYOMf5egeXWPiIyCaoWFkoSLhZ2NeoyKlaWSgpeoloyRi4CIeoB9i3lwj6CFeYCUhoiVnpR+kqSmm5WWhGZueJxsomR8cqV4nJhwaKeDmo59pXuil4OWcp92gYmUlo+5bpCKomJ9mqOXiW50a6trdaBucKdhm2qLkGmWh5uVdaKBfppgi4aNdW+IYmihZp5/apt1cWVniYJvc6JbX1tkoW5eiY1xfIB0cmSlbniiY2anZ5dxipdtoW9SiI9uoF5kp1SLXVSYbW1za3GBbXBoa3dzam5RVlVVZVhSbElYT1tIV2hoc2pZa1ZQUkVWXExYUmFVaGped3V7fHB9fHKDe39zd42Ag3deUXNhZ2JwZ1BraGhrbG9oZGdfXV1dYGpiaml2dV1cY2hjamlybGZrbWOdppmme2V0bYynrqWpsLGln4t/lamcnaOLoaGaoqKAlZmTjpqQi5eRjop7hnGAiGiKinyXm3N1iX2QfGWDh5WKiZWagnyIhpamkIChqo+EkIqBiX2AgI5zaY+mg32FkoyHl5+NhpGopZyIpniVm36liZaMspmekYSvl5+lepiJe6l1qJGEmm6looyShIyDvG18pa+Ch4WHlZieo36mfHOolaGWaZ9/cKxjloqWk3iobaqjgYl2iYN3q5GmiGuSsWx3s42pbIuGb2+gnpKVYn+rjKp4gYCOp593n32FpJadoGeZhnSrZp6tjLZzdr6MpJNZg6aNq2F2cnRve3VwYmp+bmdsUlRYVGBgXGpMXFFbSF1sbXZfW3FYW19aZ3Nlbm9xY3F0YHd6fnlyeYNzhH6Be3uMgYKAdmJ5ZGNuc2RSbGdnb21yaWZpYV9eXGFqYmxsem9cXGJpYm1pd21nbG9ilqaqnYGAn6WWqqqep6eto5iIgZapmZ2iiZqknKidhIyaj4ackYWSjYyMdIV6iINvjIR+l5N0dYZykYNuf4uShoWUj3x7gYWXpI1/pKSNgI2JhJR1goeTbmyLqICCipONiJudiIqSqaKfj390k5eIfoF5lK+kf4KdcY+GeZOOhoF7c6mNcX19epeWm4WOeHt9fYaTlZOLd5KaoaOFfH+LbY2GXHp5c3txaW5+k4pygHSCj5STcYaEg2aNf1+CgYx4d3SVdnB6b3CJboWGX3dpeI5ngoOGj6qcf3R9lmmJiG99dXuCdGxsZoxzeHuXd4Rba1d5j2lud3Jyb3d4b1xrhW5pZlZZXlZcZWpjVWBUXVBeb3d5a2p2ZGlqanV7cHF0c2FvdGJ0e4F4dXqCdX+Af4F5i4WCfntugG1keW5eV25oaHVreGppamRcYFpjaWVscXVuWltia2Rsa3ltaGxvYI6Uuamni6Gjm6akmaSdq6Gfg4OWqZGdn4iZppqomYOBnIt+lpSHjoqJjXKCfI58fo6Ee5eOdHOEcJWGfH2Si4aGj4V4foCGmKOMe6afioSPj4SVgoaOmHdxhKqFjZGbjoednYaKmqafoKuDiI2Um39+ipetqJCTqJF5cZ+UhXyVcICsh3F+lXFqcH2Bn4t/kY2KZ21dhIyOnZ6hkXSXjopzdWyDd3SBWXJvh5GCfn+Mal1pZHuFhImAYGl5fJx8hI2Ed4KIhWp6jYlsYnFzg3dgdI2DipGolodnjY6CbHaKgW2CinZtY2VjeYN6lVpcaWdudlt7eXd1bnNyg2ZbbIlra2JZWFxZWGtxW15fWV1cZXJ9enRvdGJqaml7e3F6dnRkbXRobXt+dXp9e3l6gIB/b4aJg3t9c396c39oVFxyaWx2b3VnbGdkXWFZamhranFybVdbZW1sZ3J5b2hqbWCMjKuxopCjoZqenpidmaihoH2ClquMn5OGmqKRpZV/e5iFfJKZiYiHh4pxfYCKdoSLgYSWinJvgHOYh4R+k4ODhoqCeoCDipqfj4Gln4Z3jpeIlYqLnJeEg3msgZCXmJOJnZyFh6CpnqGio4uHkpudo5qWq6KoqKKTnYmZkX56kZCGqn9/k5GSk52yppqUno6MsJGYhKeOjpadoouSnYWKk4tsfY93eGaChpGLfYmehIiMj4iIgYWEkXh8e3WcpIqIjKCMh5aAgI6DgXdxdYaFgHmKiIuRp5GEh46HgouPinmDiIWMf3RqgYN8eZlpcmhhc4pxfnt3d3B3dIFdXW6GaG5fXllaXFNncVVjW1pga2d0e3tybm9jampofntseH5waG9va2aAe3KCgHd/fX+Ee22DjIV8enl8fXqEeU9kd2tzbnB6ZWxlYmJgW3NmcGZycW1VXWx0bWh4enBnaWtljYieu5+Xo6GYlZmYlJikoJx6fpepjZ2MhZ+ci56XfXiVg3uOmYmGg4SGbXiAf3KAh36Ik4Rta356l4eEg5B+gIaEh3yHgoyanZKGqZ2CcoqPhZKRi52RfI17qYONkZaUjZuVhYWapZ+imp6Gg5KamZmQmaagpp6ekJeClI15foqQhqd8fY+QkYaYqqGdk52OjaiMkYCfjoqVnKGEkJmAiI+EcHmHcnVhf4SQiHeMmYGEj4GGhX+GhJVuenZ1lKSMjoechoaQdoKNfn50c3yKhXx6jo+FlKiQh4SPgYKJiIhzgoWFiHltan1/e21oa2xnXnl/Z317dnV2dXt3XF9wfW10YGNaW15QZmxTZFpdYGpodHl+cGxsY2tqZ4B/a3J/a2t0bndthHluhoB2goB9hXZxgo2Hfnt7fYB7gotgaXxrdWhpg2VqY2BpXGN1Z29idW1sVGJxeWVveXpyZWptbYuKn7iaoqSfk5KWl4uan56cenebpJCbiYaklIuYmnl6jYZ8ipKDjIKCgm17fndygIV9ipB9a2h9gZeJgYiOfH6FhId8j4GPm5uQiKabf3CLiouShqChioWMfKiQh46RlZGUkXeMo6ChnZabgIGQmpiTjZqioqSbmJKcf5CIe4KGkYmjgX6NjY98mKSgoJKakI+li4+BnJKKlJmdgJSUf4iPgnV1gnF3YX6BjohzipZ9iYxxjX+DhoePaHhyeo6alJGBmYCKjXSEin5/c3t8jYZ8e5OOhJemlIyGkHuEhYaDc36AhIV4ZHB6f3d5cGxqZl59c2h8dXZ0fHOAal5gdHdwd2RjWF1eUmlnVGRYXmBnaXV4gXBma2NsZ2V/gWptfWdtcGp8d4Z6a4uBcoGBfoF1doKNhn98e4CBfX+PanKEbnRpYohpbGJfcVZ0b2xtYHhobVdqc3ZjdHp6cWJrb3mJjZ+zkqWmnY6QmI+FnKGam3x1op6Nl3+MoYqIm5Z4fIaIfoSKfoiCgX9wf3pzdYKFfomQd2djfYaXioKKjXh9gIyDeZaAlZeVjZWemX1vi4GQk4Wlm4eMiYOmlISRiZSVkZB1kZ2hoZiUmHp/j5iXjpaanaWempSVnXuSiYV6iJmPoH+Ci46Mc5ijnqCSmI6OoIuLg5iYhJSXm4Caj32JjoJ3cn5ue2SAfYuHcYeUgJGCa4eDgoCLhmZ2cH2IlJqOf5V5jot+gol+fXOBeYuHe4aSi4yZpJeDhIt2h4OBgHN4f4aCc152d31yfXZmbGVgf2lqd3N0dX1xfGNkYXNvdXJtYVlfXVpqY1JiV19fZ2p0eIZwYmpia2ZofIJraHRobG9of3yBeWyPhXGAg4N/dHyDjIGAfnqCg358kG11iXR0bWaKbGpiY3VWg2lwbmB4Z2xhanZwZnh7eXFfcWyFhZCdr5inqZ6OjZeHhZ+TlZd8dqebiph5l5yLjJmQeXyBjH19g3uAgoB4c3h5c32Ag3+Ii4BkXn2LlYd/hYh0fX6Jf36YhJaUloyjoJZ+cYZ7k5GKpo+MjoqSoJCCj46TlpCKgI+XoJqSkJJzgI6SlImdnZ6nmZmOlZd1kZKMbYiakpx8iImQiW+YnZqikpWKi52LhoGTnYCUlJeIm4p9ioqCe3F6a3ZtfH+Mf26Fk4OVeHCChH5/jIFlc2p9gpiYhoGPdZKLhnuJf3d6gn+Ign6Fj4eNlaWReYWCdIiGe35xcn6EgGtgeXR5cHtuYW5jZXtibm92c3h3dHRhd2BvbHVucF1aXl1daV1PXFdiYGdscnqIal9pZGljaHeHbWZsaGlsZ4B8enduj4hzgIOFfXSBhol6g316gYR9fI5yeYt5eG5sh2toX2lyYodocW9ldmdtbGF6aGp8e3hwYXdti4GZmauhpamei4uRhomdi5SWfHasmIyWfJ+TkZeUiXd+e4p8fIB2eH+Ab3Nzem+FfICAiX58YFt+j5GHgISEcnp/hnqPkYeRkZuSpJqTgXyBfI2KkqSJjYqNlpqMhI+XkZSNiIiMkp2TkIyNboSQj5GJnpmioZiYipeTcIychmiKm5GWe4mFkIpwlpqUoZGRiIqYjIJ/kp99k5GUjZqQfIuGiHVzdWtxbnV9i3VvhpGOknJ0gHyCgop+Z3Nuen+blX6GinaSjYN1intxg4CDiX6GjouGjparjnuIfH6KhHZ8bmx9goBhZndzdG56YV5vYWt0XnBqenl5bXRxZXpebmxzbXNZWV1fYGlaT1ZXZGJlcHB+h2VdaWhmYmdwjW5jaGhlaGeAend0b46Fc4GCg3x2g4mFeIV8eISGeoCJd3+LfHtzeYNqal9waHR/a3FvbXFnb2tle2Ftf3l3cGx3d4l/o5ijqKGnm4iLioGOnIaSmnR/qJSRjYehjZaUkYF0fHaFeHh/cnN6hWxxb3hsiXZ/gIZucVtZfpKNiICBgXZ1gH9/oIaPipKcl6CSlneJfoCMiJydio+GkpeWhYiTmI6Wi4qNjoydio6Rg22Ji4+RipyWoZyZloaZiWyIpoVoiaCMk4CNhYyBeJSYkp2RkIiIk41/fpCZfZKOkY+bk32LgYVwdnBsbm9wfIZqc4OPmYtyeIB1gomDemh1cHeCm5B9ioZ7lpN8eIp2cox9iI98jIiFio+cpYl8hHaBin53d2tofn9+W3FycW9vd1pecGFwa15vanx6cW5tam13YHBva3FuWVhgYGBsV1BSWWVlYXRvhIFhXWtsZGJma5JuYGZmX2ZqgXVxcm+LgHR/g4F5doGLgHmGf3iHhnaDhXuGi4B7d4t/anBjfGKFfG9wbHRqaG5sd3dfcX55e3R1c3+CfqWVm62fp5eFjIN+lpWDjp10iZ6TkoWLm4yWjox6cnh0gnByhHRxdYhsbmx0bId2gn1/bW5VUYGrlIeCeIB2coJ5gqCCkIGSkpiakZh3kHqCjJKjmpOOiJSYkoOFlZiKkouJjo+InYSRi31yioWIj4icmZ6bl5aBlYBpiZ+KaYmjipSGkoSKcYORmI+ajY+Li46Nd3uTkXuQjI6Tl459iX6CbHdqb2xsbXuAYnp+kJeCd3uCeIONfXppdm12iJeMgImIfZWSc3uGcnmPfIyPfIp/hY6Rn6CHfXx3gYp8dm9naX5/dl12bm1rcHJVXW5icmFfbW55cGhwZmd0dmlxbGF3Zl1VZWBfcVNQTVtlY1x3b4h7XlxocGFiZWaRal9nZFtnb31vbHFziX12fIaBdXZ/jHl8hoB4h4NzhoV+jIyEfHqVeGdxaoNgh35vb2t7YGltdIB0XnN8eIZ4dHOFfHmhkJqxnKWPg4p/gpmIf4mbfomYko6EiJiOj4+Ed3R3c4Bwb4R0cHGDb2ppdW2Cbnx8bXRzUk6C38mS1pN8b3SDdYOfgpF2lJCYm4+Ye5NyhY+doZOTkImSmpOFfZWVh4yNh5KNiZx/joF4e41/iIyJnJycm5aUe453aYyUim6LpoeVipiEhmOMkZiOlImWi4yJi3B6lYp8jomLlJKLe4d9gG18ZXNva217eluBepCQgXt+f4CGj3t6aXVrdIyQi4OHhn6XjW2AgHCCjoCOiX6FfISRlpucjH13eIKOd3FrZG58gGlnc25naXNsU15vZXBZX2xxd2dra2JneXRwcGRgeGFgVWtfXXRPTUtfZWJbd3CJc1xbZHVgYmVljmNgZmJYaXNzbWtxdot8c3mGgnZ3fotzgId/eol/comHgZCJiX1+mXZlc258ZYd+bm9rf1lsbnl6cmB2enuNdnJ2iXZ5n4ycr5ugkIKEeIeUfnuIm4aEnZCOhYyXhJOPiIF1d3B5cW+EcG1tfnJjZHdwfG15fGpobGOkmsHcru+ic2x2g3WEoYSQbpWPlZ+TmoCRcIWKoZaJjpWKkJyVgoCUj4WIj4CSioqXf4d7dn+KeIaFjZubl5mQkHeMd3CKi46AjaeHlIuehoZei5SXio6IjYqKhIlsfJeDfomGi5OQh3eHf39sfWR4dWpvenRYiXuSiIZ7f3+Aho1/emd0aoGKj4uEhIGNmIdtg3dwiZKDkoaAhHyBkpeUm5F1dHiHi3RycGRydn9fcmxvYWh0ZlJgcWdrVV9uc3lhcmNgaX5xc25bY3NhY1ZuWlt2TExLYmVgXXVyiW1bXGR4XmBkZYRfY2NeWGlya25rcneLfXN2hIF4eHyJcYOFfX2Ie3SLiIeVhYx/f5hzaHVxeW2Lem5zcIBXcXp2eXFkdnmGjGh2gIlxgJ2Imaico5KEfXCLk3d4iZuDhJ+NjnyWjX+aiIV8c3dwc2pvgWxqbHx0XmB3dntwdHpnYGV869q1ycPciXNsdIF2iZmIjGiXj4+blJKBiHCFiJ+NhYuVioyXk3uMkoeCiI96kYuGj4KAd3iDhHKHgpKblpOYh412iH9xiIWMip2lhpeOoISKYYSVj4aIhYiMhoCHaH2UgH6DhYuPj4NyiICAcndodnJpdXdsWo19k4OGfoGEgYSLg3didW2KgpGMg3+AlJN/cINteoiRiJSGfYN/gZOUkZiKbnF5i4V0am9pb3V+XXJobVxpdF9SZHFpZlNfcXZ0YHBgXWiEcXNqV2dpZGlXbVdbc0tJS2RlXWFxcoVpW1xleF1eZGd6YGRfXVlrbmVuanN3in5zc4F+e3Z6iHOFhHx/h3Z2iYWPmIGMgnyUdmx3dnl4k3Rud3p8WHmGcYBuZ3h2kYJkdoaFcIqXhpqhm6KKhnNukYpydo2afYqZiIl8n3+Emn+CeXJzbm9kcn5pZmx3d1tfeHp6cXF/aWFnYX/Vto6RpnhucXd7cJKQjIVpmI2ImpCLhXpoh4uZhoGSkIaGl417jIyAgImNe5CNfomFenV7g3xxhoCVmY2SlIKJdoWIeYaDjpagoomYkqGAiWF/lIeEh4OIjH9/gmZ9kYB/gIOOkJF/boR+hHVsbXd1dHh2a2OOgo+Bhn99hYCFiX9wYHRyhn2QjoN9gJKKe3KFZ3uFjImOhX2GgIGVkJGUhW5veIt+dGxtaGl4emBnaWlYa3VZUmlyaWJRYnJ4bWJlXlpqhG50YlxoYGVtXm5UWm1NR05lY1tmbXB/a1lbYnJfXGNsdmRlXV1abGxibGpzdoZ/cW9/fH10eIZ4hYN9gId1eImAkpV8iYZ3iYFveHl6hJJvbXqAdl6Df3SBbGh6c5RzZ3KHfHGSkoSan5ugh4Z1dZN+bXWSlX2Hj4SKjZp9jJp2fndyb2xqYXR8Z2JpdXlaYHd7eW1wfmVkaGhXnY9fcnOXvMSEdXGUiI99cZaLhpuSi4dyaYiOlYB7lYuBhJqLe4qGfHqJi3+UiHWJhnZ3foFydYWBnZSFlI+EhHOBineHf4ycoJyJlo+egYlmfZOCf4WCiIhxgX1mfox8eX+AiY2QfmqBfoV2ZnB5eHR4dGxqj4aLgouBeYOBhYSBbF9zeXt+jouGfIOQgn9zg2p6hYmNiIZ5hX6CmY6RjX5ubXqIfHVzbWZle3RiW3BiV25xU1Nuc2hhTmd1eGZgXl1Zb4FvdFpmYl5rbmBwUFlqUURSZmBZam1se25ZW11sYlpib3ZkZ1xdYGtpY2tqc3aBgnBufnyAdHWDeoODfYGFdn2IgZaQeISLdYGIcnh5fo2Qb296gHFpgXh6fm1se3WVa2p3hHNsk42Gn5mfmYWHbn2LdWl3lo1+gImDlZeKepCWb3t0cWtqZGBzemhfZXF6WmFyfHlncHlhZWSPsbJ3S2JapdnQlnF6kIqPd3yTioSYkIuFbmuFkZF6eZKGgYSYiXuGf3d3iYqEloBvi4hxdX57anmFg6WQg5ONhIBwgIV4hnyJn5yYjpaSloWIcHuTgn2CgoiCbYF2aICFeXKAgYWLiH1mfn+FdmRxc4BpeXBwdZmOhoOLfXd5gYR6g2tccn9zgomGin6HinyJc4JucoaIkYeHdIZ7gpqNjoV5bm59g351eWNmaHtvXlh2WldwbE5XcXNnYEtsd3RhXlxbWnV+c3BYZ15nanFgb05XZ1E+WGVdWW5qZ3lwWlpYamVZY3B4X2dcXmVsZ2ZraXF3f4dubH9+gHVwgnuAgn+Cf3aBhIiXiXGCjXF7hnx6eYSUjHVqeX5rb350f3xvcnt6k29vgX54Z5KLgqGZnJGChWaGgm9neZSIfX6EgpiJgXyOjWh4c2trZl9gb3htX2JveFxka4J6YHF1X2Vl1Oq9izI6PouOf3F5hYeNjHWClox+ko2Lfm1rhIyMdX2Pf4SBlIh7gndtdYaEg5d3boiFbHV7dWZ5gYOmi4KPi4R+boF2eYZ9iaCTj5OUlY6Mh397koZ4f4OMgmt/cWiAfnlufHyDi4R4YnqFgnJlcml/bnVydYKcjIGAhoB0dn+BdIJwW26AdXmMhIt8iIF+iXl7cm2KhZKFjXSDeoCYjIuAdW5qdoB/dHNbZ2d1bldWfFNZb2RLWnJyZVtJcXhvXFtbWV11f3RpWmJbaGZvY2pNV2VQPV1lXFx1ZWB0b1pYVG5jWWRxeVpoXWBnbWdpa2lwd32ObGmChH95boB8fYKAgnp1goCNk4RwgItueH6Ae3uIk4p/aHp9anN7coZ6c3Z9fox5eIR9fGuLjYObnpaLgYBsjH1qaH6Ni3p9foOUgn59iohrdXFnaGJbYmZybl9ha3NgaHCIeWJzc15jZJugj25dNlqvtXRpgIh8kYZ1hZWFc46KiXZva4SCh3R5iXiIfJKHeX5yZnWIfn6Yb3GHf2l2eW5meYeEpIaAh4yKf2+AeIKEgJCcioWXk5qKjIWJfJCIcXt9hHtofmxqgHt6ant3g4iBc2B4gn9yZXNndoNudXyGlpKCfYOBcHh6fHWAbVhwgHd1jYOHeIh2hIl8eXRvi4KSgodzgH5/lImKfG9uaW2BgXRtW2VkcW9QWnpOW29bTltyb2RVS3N4aVdZWlphcYF1YV5dYGdkaWlmTllnTUBgY1tgdWBddWxXV1N0YFpkb3JXal1iaGtnbWxocHd8kmtohIp9fG9+fnyCgIF6d4B/iouDcXyHb3J4g397iYyPg2p9e212eHaKdnx4f4KGf4N+fXpthIuHmKOMhIN7dYp4amyDh5B4fXqCkYCAfouDcHJwY2ZeWWZfcG9fYGdvZmpuiXRhdG9bYWRqdXqAv5ympMi4cYWCcpJ7d4WSgnOQi4dycm+DeoNzdId0h3eTh3h5cGJ2h3qAk2lyhHdnd3VjanyCh52BgH+Oj35zgXWHfIOWk4Z7mZCXkIiCiXuJiWt4eX50Z3poa395c2l6d4GEfmhgeIl+bGt0aHyBaXaCjJKVf3x/gHF8d3x0gGJWeH5zdIuFgn2EcoiKeXlycYWDj4CAen9+d4+GhHdqcWhsh4Fxb1xmYHFsSWR1S11tVVNZc25iUU90eGFSWFhdYXCDc1xiXGllZWRrZFFbcElDY2BbY29dXXhnVFZVdl5bZW5oVmtdYGpnZW5uaHB3epJtaYiMeX1ye355goGBfHZ9g4iGg293hHJud4KCfoiLk39wgHx3eHqBjHSCeH+BgYKEeoB1b36Ki5ueh32FeXeFemd0hYuQeX5/e4iFhHeQgGdwbl9kXFhkWWxyYWBgcGxraIluYHNoWV5jbn93qdqpx4aHsnGId2+MdHqFjX95kol/dHNzfXZ/b3F/bYRzk4V4dGtgeYJ5iY9mcoRwaHVuW219f5CSf4B4kZN+eXxviniElI6Hd5mNk5CIhoV8gIVtdHV+bGZ2ZG17dm5rd3eAgH1hY3mHeml2dmN+fGh1h4+Nln12gXdxgHt9boFaV3V/cHaFiH+Aem2Kh3V5bHaChIV/fX56fXSMgn50aHRlboqDbHJZaF1zZEZtbUtaYVdWVXhtYlBSdHZYUFZYXmByhG9dYWNtZWReb2NUXHFGQmVeXWVnXVt6YlFVW3RbWmdrYFZqXmBvZmZrcWhwdniOdGuOjXV/dnh+d4GEgXt0fYOIh4NvcoB0cXV+hYGJjYt7d4B4gnt8hYd3h3x9gX2EgHt+cnV5i42gjIh5iHZ0gnhefYWXi3iFg3SFhoR4intibmxbYltbYFZpc2JgW2dub2aHcmFxZVdcYmt/fMrOh7mham1tiWtxg3F7g4l+epCEeXhzeHR0e2psdWKDdZGBdm5mX32CeoyKZXKCa2pxY1hseoSbiIGBcpaVd399cItzhY2PinSakJKJhouDe3l+cXBvfGRncGFteHFrbXF4fn56XWZ7gXhqdnlmg3dodIiMjpZ+c4lrb36CeW99Xll0gG10gYt8gm9wioByd2l4gYKBg3h/c3t1iH17c2dyYW6LgGtwVmlcdltHbWpNVlVdU1V7a2FPVHVyUFFUV15jdYVpXWBsamZjWm9hWGJvR0FnXGBlXlxWe11OVWRvWVpqaF1XZ2BfcmZqaHJncHN3hnhulYt0f3p3fnqDiH91cn+HhY6CcHB8eHZ2eoWFh4yGent/dIp9fYaEg4d/fn59hn58eXV4d5GTn36LfIptdX94Y4KGlYZzkYpvhYWBe4R1Y25qWV9aXF1UZ3NkYFhkcXJngHJia2RWWl9qf3i+rnuftm1hc4Rnc3pxeIGFen2Lfnd3cnVve3Zlam5ghnWOgHNpYV5+eXmLhGZxf2hra1pWb3eJooCEf3CZk3KBeneFcIWFlYt2mIuOiYWJhX15dHJvaHhfaWxgbXZraGtreXh7d1tnfn15ZnN+bYV1ZXWGjoaXgHGNaGt7hHVudmNdcn5sdX2Me4Jndoh+b3Jpd4B6gIF0fm17fIN7eHFmbGFtiX1rbFVpX3ZVSmlqTlJOZ0xYfGhhTlV1a0xQVFVfZ3aDZ15hcWhnYlhpXVxrZ0pEalliY1ZZVXlZTVZtaVlda2RcWWRiXnRmbGRxZ3JwdYF3cJmGdn9+d399hYd9dXOCiICUgm5zeXt6dHOEhomJg3mBfnWOfnyEio2DgoR7foqDe3d8d3eanJd6iIKGaXZ8e2yDg5J/co6BcYaCf4OAcGZsZlddW1xaU2RwZF5XYnJ1aXVvZWViV1tbaH9wb3KAc4lkZHl8aHN1c3KBg3eAgnh2cnVtanpxYWdrZoZzjYNtZl1ffXB7iX9pbXhnamRVV3JvjKV8hHt2lpF0fXR+fXB/fpSIeZt+iYeDh4N9dXBxbGd0W2tnXmx0ZGhmaXpvfHJaaIF3dWlxgXiCd2J3hot8lYJwjWtue4NyZ3RmYW97Z3N4inx+Y3eEd2tscnZ8cnx7dX9of4CAeXdvZGZibYV7bGpVaGFvUkpoaU9LTm9HXnpmYU1VdGRKT1NXYWt3f2ZdZ3RpZmBXZFdicFxLS2pXY2FVVFVyVktYdWRZXmtgW1pjZF92Zm1icGl0b3J/dXSZgnd/gHd/f4aEen11goR+l4VtcnR8enVxhIWPgYB6i3ZzkH98gZWNgIWEfX2Mhnp+gXd7o6WKeYeFg2t0e3p1goCLeW6Ec3mEfYKDdm9qaGVWXVtaWVNibmRbWGFze2pobGlgYlheWml/aWtwgGdsYGd5d2lyc3Nsg4B5fnt1dG16Z2l5al9lbmiAdo+EZmVYYndqf4d7b2pwZ2ZdVFhvZ42ndoB6fJCOenZxgHF1eHyTg3uXdoaEgIaIdmpydWdnbltsZF1tcl9oYWp5aHxtW26Dc3VrcIF+enhhd4aFeZGGdIlycXqBc2Nyal1weGVydIh8eWN0gXFnanp1c216eXZ5ZYR8gHl3cWRkY217fGpqVGdhZVNKa2ZPR1FqRWF4ZmFNU3JdSk5VWWVseHtmX25xamRdVmFVbm5WSlNnV2VdWE1Va1RJW3heW19rXV1aYmVfeWhsYW9vdm5weHV6mH53f4F5gICHhnp5eoN+gZODcXR0f3p3dISIkX2BfJFrcpWAe4KfhX6HfYB+hoKAiXt3hKuef3qHh4JqcoB5dYB+gHRuhm59gHOKgGpvbWRkWV9aWVlUYmpnW1pfdYJpXm1sXGFXW1trgWVxdH1paVxqdnRmc3Zxa4N6fXx4dXJseWZpd2ZdZHJneXeSgGJiVGVwaIKFeHhnaWphV1ZZZ2KOp29+d4CLjntxcn9pe3F9j395kXOFfoCAhm5kdnJkZ2dcamFdb29baF9tdWV7aF51gW9ya3J8fnV2YnWGjHuJiIKBeXN2gHZicW5bcnRjcXKFfHVlc4BtYW17cWtqfHt2c2eHd3t6dnFlYmRtcn1palNnXVxUS3FhUEZWYEdjdmZhS1NvWEtNWFhoa3Z7ZWVucWdkWlhdWHdlVEpcYldnV1lIV2RPR2F4Wl1fbFteXGFjXn5pamBvdHhtcG92g5h6coCAfH+JjIZ9dnaGeIeMfHN1dYJ5e3qCjI58foWJaXOWgXqKnH5+hXqBe399holzcY+ti3t7ho98ZXGHeXN8enVyboVse35sj3pjcG9iZV1lVllZVmNma19dXHOFaFhwblpeWFpba3picHd2bGFZbHJyZnR1b2uDd35/eHZtbnNkaHRlW2d0ZXV2kXleXFJmZ2uDgnR+YmRqXFRXXWFijqRpeHODhpF5bnF8anpvf4l+d4t0gnl9eYBpZHZtYGZfXmlfXXRrWWZdb29jemVceH1sb29weHl0dWVzhJOAh4SKfHhwc350Y3hlXHFxYnFygXx0Z3OBZV9ud2plaHt9dW9wg3Z0fXNyYl9mbW58ZGhTZldYU012XlBJWVdIYnRjYUlTbFNKTlpXamxyfGRtbXNjYVpaW2F3XFNLY11XaFNWRlhfTUZpdVheYGxbW15hYl2EaWhhbnh5bXBrdoCQeW2CfoCBk4iEgXZ0iXSMhnRxdnWCeH19foyQf36UfnB3lYN9mZJ5gIB4en1/dIiEdHCZoHp6foeUd2N0h3hyd3RrdG9+a3h8cJFzXnBvYGdibFRaWldoY21mXFxxiWVTcW5bWlhXX2t2ZGl1amleWWxyb2tzc3JohHx+f3t2bm1rZGlwY1trcmR0do5zWlZUZWFygH9ygl1iY11TWWBbY5CfZXFxhYSSdWxse29wcn1/fnOCeIF0e3p6ZGV1Z11iWWBnW152aFdiXXBpYXhhXHx2amtyb3h0c3VpcYKWhIeAhXd0a3J+b2d4WF1sbmNyc4B6dGdwflxgcXNjYWtzgG1udn9zcnhrcGFcZWxsemBmUmVUV1FPdVpQT1hRSGNzYWBGVWpRSlFaVmtra31mbm9yYltaWFlscVdSUGZWVmhTVEVZW05IcXRYX2NsYlhgYGBdi2pjZG16eGxwaXV5h3trg32AhJp8g4R5fIhuj4dybnZ6fXSCgnyLj4KDmHR4gZOFgZ6JdYGAgnR/gnGIg3ZwoZZzeYWKhnpkdopubnpuZnhweWtydnONa150bmFnZWtSXVtVZ2Fsa1pccYxkT29tXFZXVGZpc2hidGVkXFhtdGxvdXR4aoV8f3uHdo9zY2RrbmBcbW1jc3iHa1lUVmNkeH19cYZdZF9jVFpfWGKVlWNtcIOFinRraXxwZ3V5dn5te3V2cHt/dV9mc2NbXVZhY1hhdGVVX2BtZGFxXV1+cGhpdHF0cXV3a22FlIKJfYdyc2hwf3F0cFRcZ2tmcXSAdnNjbXdWY3NsXGBwaH9nbnh+c3Nzam1hWmRpandeZVNjVFVQU2xWUFZTUEdkcl9gRVdpT0lYVFduaWV9aWx4bGJXXVVbdGRTUldoUVhmVFNHWVlPTXd1Wl9la2lZYWBdXo5uYmZreXZub2l1doB/bIOAfYeYe4CHgIl/a5OIcmZ0gHt1gIN9iY9/jJNyfIqRhIefhnt/ho10gYZzfoJ2bqSLcoCMinZ2bHmLYGR7cGZ5c3hsbXJ3g2dke2xiZmdoU19eVWdfa29bXm6NaE1pbGBVVlNuZnNrZXhlZFxYb3NrcXp3cmuHen92nHp5a2FlbG1eYG5qZXF4fmdZVlhgbHh8e3CEX2NeZ1ZYX1djm4hia3CBh314bGx6bl14c259a3Z0b3B8gXNYam5fWVxVYWJXZHBiU19iaWJibFphfmxmbHR2b213d2xpho2AinyJbnJncX5udG5kW2FpaW90gHRyX2ltU2VyZVZkcGR8ZXN4fXdrcG1rYFlhZmd0XGRVYFVSTldkUU5bTk9IZG9cYkZZaU1KX0tZbWRgeWlufmVgVV9UXXVcU1JgZk5cYFVSSVtYUFl0dV1fZWtoWGJgWl6NcWNnanhxc25odnN7g3KCg3qIjn58iYeNeW6QiXRrc4F0f3+IhYeShJaPeX2Mj4eRm4SAfI2Fc4CBc3R4c2+Tk5OTk5OTk5OTkpKSkpKSkpKSkpKSk5OTkpKSkpKSkpKSkpKSkZGRkJCPj4+Pj4+Ojo6Pj46OjY2Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2NjYyMjI2NjY2Njo6Ojo6OjY6OjY2Ojo6Oj4+Pjo2NjY2Oj4+Pj4+PjoKAfnp6fX5+fX1/fn5+fn5+fn5+fn+Af4CAgIGAgIB/gIGBgYOHjI6Ojo6NjY2NjY2NjY2NjZKSkpOTkpKSkpKSkpKSkpGRkZGSkpKSkpKSkpKSkpKSkpKSkpGRkZCQkI+Pjo6Ojo6NjY6Ojo2NjY2Njo6Njo6OjY2NjY2Njo6Ojo6Ojo6NjYyMjY2MjIyNjY2Njo6Ojo6NjY2NjY2Njo6Ojo6OjY2NjY2Ojo6Ojo+Ogn99ent8fn59fX59fn5+fn5+fn5+f4B/gICAgICAgH+BgYCBg4aMjY6NjY2NjY2NjIyMjIyMkpGRkZGRkZGSkpKSkpKSkZKSkpKSk5KSkpKRkZGRkZKSkpGRkZGQkJCQj4+Ojo6OjY2NjY2NjY2NjY2OjY2NjY2NjY2NjY2NjY6Ojo6Ojo2NjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Njo6Ojo2NjY2NjY2NjY6Ojo6Cf3x6fHx9fn19fn19fX59fn5+fn5+gH9/gICBgYGAf4CAgICDhouOjo2NjY2NjIyMjIyMjIySkZCQkJCQkJKSkpKSkZGSkpKSkpKSkpGRkZGRkZGRkJCQkJGRkZCQkJCPj46Pjo6Ojo6NjYyMjIyMjI2NjY2NjY2NjY2NjY2Njo6Ojo6OjY2MjIyMjIyMjIyMjY2NjY2NjY2NjY2NjY2Njo6NjY2MjIyNjY2Njo6OjoN/fHp8e31+fH1+fXx9fn59fn5+fn5/f3+BgYGAgICAgYCAgIOGi42NjY2NjIyMjIyMjIyMjJTO2tjY2NjamoGEhISEiF0tMDAwMC1GoaGhoaGhoJqZmpqampqKg4SEhIOEd2VnZmZmY4C+u7u7u72zbWZnZ2dnZZChoKCgoKOAY2dnZ2dmb4SDg4ODg4OLjIyMjIyMjY2NjYyMjY2NjY2NjY2NjIyMjIyNjY2NjY2OhX19e3t6fX58fH59fX1+fX1+fn5+fn9/f4GBgYCAgICBgICAgoWKjI2MjIyMjIyMjIyMjIyMlNvp5+fn5+qcfoKCgoKGUxgdHR0dGTekpKSkpKSjnJycnJycnImBgoKBgYJyXV9fX19bfsjExMTExrtnXl9fX19dkKWjpKSkp3xcX19fX15qgoGBgYGAgYqLi4yMjIyMjIyMjIyMjIyMjY2NjY2MjIyMjIyMjY2NjY2GfH16e3p8fXt8fn19fX59fX5+fn5/f3+AgYCBgYGAgIGBgYGChYqNjYyMjIyMjIyMjIuLi4uSl5iYmJiZmZKPkJCQkJCMh4eHh4eHiZOTkpKSkpKRkZGRkZGRj46Ojo2NjYuJiYmJiYmMkpGRkZGRkImIiYmJiYmOj5CQj4+Pi4iIiIiIiImKioqKioqKi4uLi4uLi4uLjIyLi4yMjIyMjI2NjIyMjIyMjIyMjY2Njoh8f3l6ent8e319fX18fX19fX5+fn9/f4CBgYGBgYGAgYCAgYKFioyMjIyMjIyMjIuLi4uLi5GQj5CQkIuOkZGJh46KkJKTj4iNjI6PiI+RkZGRkJCQkJCPj4+Pj4+Ojo6Njo6Ojo2NjoyLi4uLi4uLjY2Njo6Ojo2MjIyMjIyMjY2MjIyMjIuLi4uLiouLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyNjY2NiX59eHh5fH18fX19fHx9fX59fn5+f3+AgICBgYGBgYCBgIGCgoSKjIyMjIyMjIyLi4uLi4qLkJCRkZGPhI6QkIaKj4WNkJGKh46Lh42HipCQkJCQkJCQkI+Pj4+Ojo6NjY2NjYyMjIyMjIyMjIyMjIyMjIyMjI2NjIyMjIyMjIyMi4uLi4uLi4uLi4qKiouLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjI2Lfnx3dnh7fXx7fX18fH19fn5+fn5/f4CAgIGBgYGBgIGAgIGChIqMjIyMjIuLi4uLioqKioqQkJCQkIqFjoiOhoaPiY2QkYqEjIuGj4aMj4+Pj4+Qj5CPj4+Ojo6OjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLi4uLi4qKioqKi4qKi4qKi4uKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIt+e3d2eHt8fHx9fX19fX1+fn5/fn9/f3+AgIGAgYGAgYCBgYGEiYyMi4uLi4uLioqKioqKipCQkJCPhYOMjpCOiYyJjZCQj42HjYaMiYmPj4+Pj4+Pj4+Pjo6OjY2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKioqKioqLi4uKioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMin18dnZ4fHx7fH19fH19fn5+fn5+fn9/f4CAgYCBgYGBgIGAgYSJi4yLi4uLi4qKiomJiYmJkJCQkJCMhoyJjoeFjYmOi4yLhYeHhoiGiY+Pjo+Pj4+Pjo6OjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKioqKioqKioqKi4uLioqKioqKioqLi4uLi4uLjIyMjIyMi4uMjIyKf353eHp7enp8fHx8fX1+fn5+fn9+fn9/gICAgICBgICAgYCBhIqMi4uLioqKioqJiYmJiYmPj4+Pj5CMjouPjIqPjI6MjY2JjYqLjImOj46Ojo6Ojo6Ojo6NjYyMjIyLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLjIiAfXh5enp6e318e3t9fn5+fn5/f35+f39/gICBgICAgIGBgIGEiouLioqKioqJiYmJiYmIiI+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Oj46Oj46Ojo6Ojo6Ojo2NjYyMjIyLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLioqKi4uLh4B8eHp6eXt8fHt8fH1+fn5+fn9/fn9/f39/gIB/gYGAgIB/gYSJi4qKioqJiYmJiYmJiIiIj4+Pj4+Pj4+Pj46Pj4+Oj4+Ojo6Ojo6Ojo6OjY2NjY2NjY2MjIyMjIuLi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKiYmKioqKioqKioqKioqKioqKioqKi4uHgHt5eXh6fHx6e3t9fX5+fn5+f39+f39/f39/f3+BgYCAgH+BhIiLiomJiYmJiYmJiIiIiIiOjo6Ojo6Pj46MjI+Sj5COjo6Ojo6NjY2NjY2NjY2NjIyMjIyMjIuLi4uLioqKioqLi4uLi4uLi4uLi4uMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKiomKiomJiYqKioqKioqJiYmJioqKioqKioqKioqKioqKioqKi4aBe3h5eHp8ent7fH19fn5+fn5/f35/f39+fn9/f4CAgYCAgIGEiIqJiYmJiYmJiIiIiIeHh46Ojo6Ojo6Ojo+MkJOQkI+Ojo6NjY2NjY2NjYyMjIyMjIyMjIuLi4uLi4qKioqKioqKi4uLi4uLi4uLi4uLi4uMjIyLi4uLi4uLioqKioqKioqKiYmJiYmJiYmJiYmKioqKiomJiYmJiYmJiYqKioqKiomJioqKioqKhYB6eHl5fHt6ent8fH1+fn1+fn9/fX9/f35/f39/gICBgICAgYSIiomJiYiIiIiIiIeHh4eHjY2Ojo6Ojo6Pj4+PjoyNkI2NjY2NjY2MjIyMjIyMjIyMi4uLi4uLioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYmJiYmJiYmKioqJiYmJiYmJiYmJiYmKioqJiYmJiYmJioqFf3l6eXh7e3p7fHx7fn5+fX5+f39+f35/fn+Af3+AgICBgYCChIeKiYmIiIiIh4eHh4eHh4eNjY2Njo6Oi42Nj5WPiYyPjYyNjYyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYR+eXt5ent7eXt9fHt+fn59fn1+f35/fn9+f3+AgICAf4CAgICEh4mIiIiHh4eHh4eHh4aGhoyNjY2NjY+MjImKj42IjJGPjY2NjIyMjIyMjIyLi4uLi4uKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uKioqJiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJg355e3p8e3p7fX17fH9+fn5+fX5/fn9+f3+Af4CAgH+AgH9/f4OGiIiHh4eHh4aGhoaGhoaGjIyMjIyLiYyKiIeJhoyOjJCMjZGOjIyMi4uLi4uLi4uLi4qKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiImJiYmJiYmJiYmJiYmJiYmJiYmIiImJiYmJiYmJiYmJiYiIiIiIiYmCf3h7e3t6enx9fHx9f39+fn19fn9/f39/f4F/gIB/gICAgICAg4aIh4eHhoaGhoaGhoaGhoWMjIyMi4yOjoyKioeEiIuKjIuNjo+Li4uLi4uLi4uLi4uLioqKiomJiYmKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiomJiYmJiYiIiIiIiIiIiImJiYmJiYmJiYmJiIiIiIiIiYmIiIiIiIiIiIiIiIiIiIJ/eHp7enp6e3x8fX1+f35+fX1+f39/fn+AgICAf3+Af4CAgYCDhYiHh4aGhoaGhoaFhYWFhYyMjI2NjJCSjI2Ii4mJi4uLi4mLjIqMi4uLi4uLioqLi4qKiomJiYmJiYmJiYqKioqKioqKioqKioqKioqKioqKioqKiYqJioqJiYmJiYmIiIiIiIiIiIiIiImJiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIiIiIiIiIiHgXx4e3x5enp8fHx9fX9/fn59fX9/f39+fn+Af4B/f3+Af4CAgIKEh4eGhoaGhYWFhYWFhYWFjIyNkY+PjZGJjIaJjIuIiImMiYeNjo+NioqKioqKioqKiomJiYmJiYmJiYmJioqKioqKioqKioqKioqJioqKioqKiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4WAenl9e3t7enx8fHx9f39+fn19f39/f35+f4B/gH9/f4B/gH+AgoSHhoaGhYWFhYWFhYWFhISLi46PjoyLj4iHiYmMjYWFjo2KiYyNi46KioqKiomJiYmJiYmJiYmJiYmJiYmJiYmKioqKioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHhoaHh4eHhH55eX16enp7fXt8fX5+f35+fX1/f39/fX5/f3+Af39/f39/f4CChIaFhoWFhYWFhYWFhISEhIuLjI6MjI2Lh4mIiomGgoiNjoiKi5GTj4uJiYmJiYmJiYmJiYmIiYmJiYmJiYmJiYmKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIeHh4eHh4eIiIiIiIiIiIiIh4eHh4eHhoaGh4aGhoaGhoaGh4eDfXp5e3p5enx8e31+fn5/fn59fn9/fn9+fn+AgICAf35/f39/gIKEhoWFhYWFhYSEhISEhISEioqOjYmIiIqKh4iHiomIioiIh4qGi5GPiomJiYmJiYiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHh4iIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGh4J8eXl6eXp7e3t7fX5+fn5+fn59gH9/f39/f4CAgH9/fn9/gICAgoSGhYWFhISEhISEhISEhISKi5CPiYmJi4qHh4WHiYuKiYSLjYmOjYqJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiIiIiImJiYmJiYiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGgXt4enp4e3x7e3x+fn9+fn5+fX1/f39/f3+Af4B/f39/f3+Af4CChIaFhYSEhISEhISEhISEhI+Qj4+IiYuIhoeIiYuLjIuJioqNio6Oj4iJiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoaAe3h5eXh4enp8fX1+f35+fn59fn9/f39/gIB/gICAf39/gIB/gYKDhoiGiIaDhISEhIODg4ODkpKOioeKi4qLh4uNiYqJi4iHiouIio+SioiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhn96eXh4eHl5eXx9fn5/fn5/fn1+f35/f3+Af39/f4CAgH+AgH+BgoOHjo+PjoiHhIWFhoaFhYWSkI6KiYmIiImKioiIh4aKjIiHiYmOkJGNh4iIiIiIiIiIiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4aGh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWGf3l4d3d3eXp5e3x9fn9+f35+fn5+f35+fn+Af4CAgICAf3+Af4GBg4eOjo6Ojo6Mjo2OjY2MjZCQjomHhoiJiYeIiouIiYyJiYaKjY6PkYuIiIiIiIeHh4eIiIiIiIiHh4eHh4iIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhYZ+eXd5d3d6eXl8e31/fn5/fn5+fn5+fn9+f39/fn+Af39/f39+gIGEiI6Ojo6Ojo6Ojo6Ojo2NkJGOi42JjIiIiYaHiYaIioiHi4yLjpCQiIeIiYmJiIeHh4iIiYmIh4eHh4iIiYiIiIiIh4iIiIiHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhoaFhYaFhoWGhYSEhIWFhoaFhIWFhX55d3l2eHl4e3x7fn5+fn5+fn5+fn5+f39+f39+f39/f35/f3+AgYOGjY2Ojo6OjY6NjY6OjY2Qj42Ni46KhoiKhISLiYeDhYSDi4mLj42JjI6QkI+NjYyLjY6Pj42NjI2Nj4+Pjo6MjYyMjY2KiYiHiImHh4aHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoeHiYqKiIeJi4yNjo2LiImLi42OjYyJiImMgHl3d3Z6eXh7e3t9fn5+fn5+fn5+fn5/f39+fn5/f4B/f4B/f4CBg4aMjY2NjY2NjY2Qj4+Pj46NjI6KiYuMjIeFiY2Lh4aIh4aHh4uNjo6Pj4+Pjo+Pj4+Pj4+Pj4+Pj4+Ojo+Pj4+Pj4+Pj4+Oj46Oj46Mi4uJh4eHh4aIhoaGhoaGhoaGhoeLiYeHiIiLjY2Mi4yLjY2Ojo+Ojo6Pj46Ojo6Ojo6Ojo6Njo6NjY2AeHZ4eHp4enx6fH5+fn5+fn5+fn5+f39/fn59fn9/f39/gH9/gIGDhoyMjIyMjY+QkpOTk5KSjYyMjIqHioyKh4eJiYWCiouIiYWJjpCNjo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjI2NjI2LiYaHh4eHiYqLjY6NjYyNjY6OjY2OjY2NjY2NjY2NjY2NjY2OjIyNj5COjY2MjIyLi313dXd5enp7e3p+fn5+fn5+f35+fn5/f39+fn1+f39/gICAf3+AgYOFj5KRkJGSk5OTk5OTkpKLi4uLiomMiouLiYuKhoeOjYiIjI6OjIuMjIyNj46Njo6Ojo2NjY2MjY2NjIyMjIyMjIyMjY2NjYyMjI2NjYyMjI2NjIyNjIyMi4yMi4yMjI2MjIyMjIyMjIyMjIyLi4uLi4yNjY6Sk5OSkpSRkJOVlZSTk5COjo6Oe3Z2d3h6ent7e31+fn5+fn5/fn5+fn5/f35+fn9/f39/gIB/f4CBgoSNkpKTkpOSkpOTkZKSkoqJioyJi4qJjIuKioiHiYqKi4mKjY2Mj46Nj5KUlJOUlJOTkpGSkI+Ojo2NjY2Pko+OkZGOjIuKioqLi4qKi5CPjoyMjIqKioqKioqKiouKioqKi4yLi4uMjIyKiouLi46RkpOTk5SUk5STk5SUlJOTk5KSkpKSk5F6dXZ2eHt7e3p6fX5+fn5+fn5+fn5+fX5/fn5+f35/f3+Af39/gIGChIuRkZGRkZKSkpGRkpGRiYmIiIqMiYiJiYuJhoSJhoyKh4ySkpKTk5OUlZWWlZWUk5OUlJSUk5SUlJSVlZWVlZWUlJOTkY+QkZKQjoyRlZWVk5KSjo+QjYqKi4qKi42OjY6RkpCRkpKSkpGRkpKSk5OTk5OTk5OTk5OTkpOSkpKSkpKSkpKSj3h1d3l6e3t7ent9fX19fn5/f35+fX5+fn5+f39/f39/f4B/f3+AgYKEi5GQkJCSkpKRkZGRkZGIiIiIi4uJg4eLi4yMiIeHjYyNkpSSkpOTlJWWlpaVlZSSkpOTlJSUlJWVlZaXlpaWlpWUk5SUlJSVlJSUk5OVlZWUk5KTk5OTkJGSkZGSk5OTk5KSkpOSkpKSkpKSkpKSkpKSk5OTk5SUk5OSkpOTkpKSkpGRkZGPdnJ3enp7e3t8fX59fX1+fn9+fn9+fn5+fn6Af39/f3+Af3+Af4CBgoSKkJCRkZGRkZCQkJCQkIeHh4eIiIiFi4+KjI6Njo+OkJWUk5OTk5SUlZWVlJSVk5KSk5KTlZSUlZaWlpaWlpaWlpSTk5OTk5OUlJOSk5SVlZSTkpKSkpOTk5OTk5OTk5KSkpKSkpKSkpGSkpGRkZGRkZKTlJSUlJSTkpGRkZGRkZGRkZGRkYx0c3d6ent7e3x9fX1+fX5+f35+fn5+fn5+fn9/f39/fn9/f39/f4GDhIqQkJGRkJCQj4+Pj4+Ph4iKi4yNjYuOj42Mjo6RkpGSk5OSkpKSk5SUlJKSk5OTk5OSkpOUk5OTk5WVlZWUlZWUk5OTk5KSk5OUk5KTlJSUk5KSkpKSk5OTkpKSkpKRkZKSkpKSkpKSkpKSkZKRkZGSkpOTlJSUk5OSkZGRkZGQkJCQkZCRinN0dnp8fHp7fXx9fX59f35/f35+fn9+f31+f39+fn59f39/gH+AgYKDipCQkZGQj5CPjo+Pjo+Oj4+Pj4+Pj4+PkI2OjpCRkpKSkpKRkpKTk5OTkpGSkpKRkZKSk5OSk5OSk5STk5OTlJOSk5OTk5OTk5OSk5OTkpKSkpKSkpKSkpGRkZGSkZCRkZGRkpKRkZGRkpGRkZGRkpKSkpKSkpKSkpKRkJCQkJCQkJCQkJGGc3V2e3x8e3x9fX1+fn1/f35/fn5/gH9+fX5/fX5/fn5/f3+Af3+BgYGKkI+PkI+Pj4+Pj4+Pj4+Oj46Oj4+Pj5CQiI2PkJGRkpKSkpOTk5OTkpKSk5KSkZGRkZKSk5KTkpGRkpKSkZKSkpKSkpKTk5KRkZKTkpGRkpKSkpKRkJCQkJGRkZGQkJGSkZGRkZGSkZGRkZGRkZGSkpKSkpKSkZCRkZCPj4+Pj4+Pj4+PkX9ydHh8fHx7fHx9fX5+fn9+fn5/f3+AgH99fn5+f39+f39/f4CAf4GBgYqPj4+Pjo6Ojo+Pj46Ojo6Ojo+PkI+Pj4+GjpCQkJCRkZGRkZGRkZGQkJCQkZGRkZGRkZGRkZGQkJCRkZCQkJGRkZGRkZGRkJCQkZGQkJGRkZGRkI+PkJCQkJGRkJCQkJCRkJCQkJCQkZCQkJCQkJCQkZCQkJCPj4+Pjo+Pj46Ojo+Pj4+PeHJ2eXx9fHp9fH19fn5+f35+f39/f4CAf39/f35/f35/f39/gIB/gYGAio6Ojo6NjY2Ojo6Ojo6NjY2Oj4+Pj4+PjoiQkZCPj4+QkJCQkJCQkI+PkJCQj4+Pj5CQkJCQkJCPj4+PkI+PkJCQkJCQj4+Oj4+QkI+PkJCQkJCPjo+QkJCPj4+Pj4+PkJCQkI+PkI+Qj4+PkI+PkJCQkI+OkI+Pj46OjoyMjY2NjIqDiYhzc3Z4fX58eX18fX1+fn5/fX5/fn9/gH9/f4B/f39/f4CAgH+AgH+BgYCJjY2Ojo6Ojo6OjY2OjoyNjY6Ojo6Ojo2NiJCRkI6Njo6Ojo6Ojo6Pjo6Ojo6Ojo6Pjo6Ojo6Ojo6OjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Pj46Oj4+Pj4+Pj4+Pjo+PjY2MjYyNjoyLi4mJiYiFhYSDgoKEgnR5fXp4dXJrZWltb2xmZmdncHNzd3l9fnl6e3x9fX5+fn59fn9/fn9/f39/gIB/gH+AgIGAgIB/f4CBgImNjY2NjY2MjYyMjIyMi4uLjYyMjIyMjIyGj5GRjIyMjIyMjIyMjIyMjIyMjIyNjY2MjIyMjYyMjY2MjIyNjY2NjYyMjI2MiomKi4uJh4KAh4iEgXt6gH57fXx8fXlzcnJycnV1cG1ramppZ2NkYV9bXF1eWFVXWFlTS0VJSkpLTE1PT0tgdHR3eX19eHp5e3x8fX5+fn1+f39+f35/f4CAgH+AgICBgYCAgICAgIGAf4OEhYSFiIuLjYyMjIuLi4yGiYqKioqKh4OOkJGNiouLi4uMiYmKioqKiouLi4eDi4qIiYmGhYWEhIeJiYWCg397fHl6e3pzcHFxcW1samdsbWdlZmVmZGNlZGVkZWVlZWRkZGNhYV5dXFpYWFdUUFFSU1JTTU1KSUZESEpHR0hHR0xOSWdzdXh5fXp4d3l8fHx8fn5+fn9/fn9/f35+f4CAgIB/gICBgICAgICBgYFnXmBjYWNucX17ent/fXd8fHZ4ent4eHpvcHt4eXt8e3h3e394dXd0dHZ1dHZ3dXFycW5wcnBnaGtsbm9tamlpaGhlZWRkZF9gYWJgYF5dWVhaWltdXV9gX2BfX19gYmFeXl5eWVldXF1bV1dWUlRSU1NOUUpISUZERUhMTEhGR0lLSklNbXJ0eHp7end3eXt6e3x+fn1+f39+f35/fn5+gIGAf3+AgIGAgICAgICCgWdYW1pZXFtcY1xaXF5ga3FtcHBvbm5vbmtpbmxrbG9qaWtraWpraWdmZ2dnaWhnbWdqZ2hlaGdiY2JhYmBgXVhbW1dYV1RWUVBUU1NNSkxLTExOTk9UWFhXVVVUUlBQTU1QT05LTE1QUU9MTEpHSUlHSEhJSEhIR0ZHSEpKSEhISUlISVZwc3V5ent5dnZ5enp7fH59fX5/f35/fn5+f3+AgX9+f4B/gICAgICAgIGBbFtYVlZWWVlaWVlYVVZoamxubmxra2poaGloZGVkYlxiZl9fYGNfXF9dYF1eWl5dWVleYmFeXlpZX1xYV1NOTUxLS0tMSUtNTktKS0tMSktQTEtLRkdHSUlGR0lISUZFSEdGRkVERUVEREVJSUlHSEdIRkZLTUtJSUlIR0hLTU1LTExMVXFzdnl6e3l2d3h3ent8fn1+fn9/f39+f3+AgIGAfn5/f4GAf4CAgIB/gYJoUlRVVlNVV1lZWVdXV1tbYWNfXlxbWFZWWVZSVFJRUVVUU1NTUE1KTU5QUk9NUFFRUVFSVlZSUFFUUFBOTk9MSk1MS0xKSktLRklJSkxJR0pISUlFR0dGRkVFSElKR0ZHRkZHR0hKR0dISEpMSkpLSUlISktLSkhKS0pISUtMTU9QUEtUdHR1eHp6eHZ2d3d6e3x+fX5+fn5/f35+fn+AgYB/f3+AgYB/gICAgH+AgmlQUlRXVVRWWVdYWFpbVFRTUlBRU1FRUU9OTlBQUU9MTlBPTk5NTEtNTk5QTU9QUFJRUE5OT09PTk9PUFFPTk5PTk5QTk1NS0lISEpJSUlJR0ZHR0dJSkhJSEhJSEhHSEdISElISUxLSklISkpJSkpIR0pMS0pJSUhKSktMTk1OTU9RTFVzcnN3enl3dnR2eHp7fX19fn5+fn9+fn5+gICBgICAf4GBgH+AgICAgICBbE9PTlRZVVVdW1lXV1hOTUpKSUZKT0xKSkdJSk1NS0pMTUpHSUlJSktMRkRGSktLS0hKTExMT01MTE5PT09NTk9MTk5OUFBPTE1MTk1MTEpJSEdJSElISElJS0xLS0pJS0pJSklJSUlJR0dKSUdJSUpKTk1OTEhJSklJSk1PT01LT1JOWXBwcnd4d3d0dHR3enx+fX5+fn5+fn5+fn9/gIGAgICAgYCAf39/gICAgIFvS0pNTlFOTlVXVlZSU0lFQ0VFUkREQT5CP0RAQD5CREFAQURHRkVIRUJBQEBDQ0RFQUNFSEtPS0lJSkhHSklKSUlLSkxQTk1MTU1MTU1NTElIREZGR0ZGRklKSUlLSkhMSklKSkpJSEhKS0tIRkdJSklLTU5OSktPTUxLTU1PT05QT1BgcG9yd3h2dHJzdXd6fX19fn5+fn9+fn1/gICAgICAf4CAgIB/f3+AgICAgXNQUE5OUE1KS1BSUE5RQ0RCQUVRRT1DPT9FSDk6Oz0/PTxBRkA+Ojw+PjxFRD0/RUE/QEFAREVHR0dHQkRERUZFR0dHR0pHSEpLR0NER0pHQ0RFQUFDR0hHSEdISktKSElMS0lISktLTU5MTUxMSkpMS0lLTU9PUFNRT1BQTk9QUlFNUGdwb3N2dXRycXR4eX19fX1+fn5+f4B+foCAgH9/gIB/f4CAgH+Af4B/gICCdlRVUVFQT0xNUFBOT09BQUFAQkE/Oz48Pj8/PDg5ODs7OkA6Oz48Ozs8PEhMPT1BQT9CQz1BRERGQkZGREdJSEM/QEBAQUFCQUE/Pjw9PkFAQD8+P0BFR0dHSUtMTk1OTUxNTUpLTVBVU05MTlFOTk1OTE1NTk9OTk1LS05OTk1OTkxUbnBwcnR0c3Fydnl5fX19fn1+fn5/gH5+gICAgICAgH9/gICAgH9/gH+BgIJ4UVFSVFJTUVNTUVFST0BAPT4/PD8+QEE/PT45Ozo6Ozg4Ojg3Ojw5Nzg7Oz49Ozs6ODpAQEFCP0E/Q0ZEQkNDPzs+PkBDQ0E/Pj9BPkBAQj9APD9CQEFDRUVFSktQT1BPTU1OTExMT1JRUFJOTExPTUtOT0xMTEtMS0tKS0tKTU1LS1xxcXF0c3VzcXR4eHp9fn1+fn5+f39/fn5/gIGAgH+Af4CAgICAf4CAf4CAgXxSTU9RUFFSUlRSU1NOPDs8Ozs8P0BBQkA9PDk8PTw5Nzk6Ojk4ODo6Nzg6OTo7Ozg3ODk7Ojg8Oz1AQUA9Ozs+PD09QEJDQT9BQkE9Pj09Oz0/Q0RCQD9BREJFR0pKSkpKTE1MTExNTExOVVNLTE1USVBKSU1KSUpLS0pJSEdKS0lKZnJxc3RzdXJydnl5e31+fn5+fX9+f39/f36AgICAf4B/gICAgIF/gYF/gYCBgFZMTlBQTlJRUFBRUU44PT88PDo9PkFAQT8+PkA/Pj07PDw+Pz08PTs6PD09PTw8PDw7PDo7PD49Pj8/QUA+P0E/QEBBQEBAPT8/PTw6Oz09PD9AQUJCQUBCREZGRkdGR0dISUtMTExLTEtKS0lKSk1MTEpMS0lISUxMSklJSElLR01tcHF1dXV1c3V4eXl8fX5+fn5+fn5/gH9+gIB/f39/gH+AgYCAgYCBgICBgYCCYUtPT05OT1BPT1BQTzo8Pjw9Oz8+PkFBPz0/QkNDQD48PT9APz89Oz49PkNFPz9APTs9PT08Ozo9PkFBPz5AQD9BPz89PD48PTs7PD0+QUA/QD5AQ0NEQkRFSEVFR0hISEdGSUpJSUlJSUhKSkpKTEtKSklJSEhKSktMS0lLSkpIVnBvcXNzdHR1eXp7e3x+f35+fn5+f39/f39/f3+Af4CAgICAf4GBgICAgIGBgIJtTFBRTk9QTk5PUFBPPjw8PT4/P0A+QEA/Pz9DRUQ/PTs8QD46Ozo6OTc6PDk9PUA9Ojw7Ozw7ODk7Pz49PD07PEA9PTw8Pjs9PD0+QUBCQUBAP0JEQ0RFRkZGQ0VHSElJSEhJS0tMTUpKSUpNTUpLSktJSEhISEpJSktKSk5MSUlfcHBycnJ0dXZ6e319fX5/fn5+fn5/f35/f36AgIB/gICAgICAgYGAgICAgIGAgnZNTk5NTk5MTE5QT0w+QTw8PT8+QkM/PkFBQUJBQD08PTs+PTo6Ojw6ODk4ODo7PT8/PDs7PDs6Ojs+Pz89PDg6Pjw9Pj89Oz4/QEJDQkJDQ0FCQkFCQkRCQkRCRENGSUdGRUhJSUtNSklKSktMSkpJSkVESUlGRkhISUpKTEpGRmdwb3FxdHZ2d3t8fH18fn59fX1+fn9/foB+fn+AgH+AgICAgICBgYCAgICAgICBek5JS0tMTExFSUxOTTw/PDw9PkBAQUE7QkNCQ0A/Pz9APT8/Pjw+QD89PT0/PT0+Q0Q/Ozw9PkA9PT5BQ0A8OTtBPz4+QT07P0JAQkNCQENDQUNBPT0+QD0/QUFBQENFRUBAQ0JDR0dFRENGRUZGR0VEQEFHR0ZDRkRHSEpHQz5IbHBwcHF0dXZ5fHx9fHx/fn1+fn5+fn5+f36Af3+AgICAgICAgIGAf4CAf4CBgIF+UUhLTU1NS0pLTE9RQD8+PkFBQEBBR0FDRENEQT9AQEA/PUA+PD0/P0BAQENAQD9AQD49PD1ARUFCQkZIQz08QERDQUE/Pj1AQT4+Pj88PkBER0VAPkBBP0BDRkVDQkJDQEJEREJERUFCPkFCQkFCQEA9QUJDRENDQUNFR0E/PVZwcHFwcnV1d3p8fHx8fX9+fX19fX1+fX5+fn9/foB/f4CAgICAgYCAgIB/gIGAgX5SSEtNTUxLS05OUlVEQkBDQ0FBQkBCQ0BAQUFAQUA+Oz48Pz08Oj49P0JCREA/P05hX0pAQ0VJSUlJTU1LRUNGR0hFR0VFRUREQ0E/QD4+QkZKSkdERUdGRkpOTktKSUdHSEtMSkdHQ0REREVEQUJCQ0BDREVEREVERUZDQkFFZW9wcXF0dnV4e3x6fHx+f319fX19fn59f4B/f39/f39+gIGBf4CBgICAgH+AgICAfVJJSUpKSEpKTE9SU0dGRUdIREdIREA+PDs+QERFRD88QUNEQj89QT9BREVEQ1d1homKflhHSEpMTE1PT0xIR0hHSElJSEhHR0hIRUNFRUVFRkhKSkZFR0lKTU9PTU1LSktKTU5LSUhHSElIR0ZFRkZGREZIR0VFSEhGSEdIRlFubnBxcnZ2eXt7e3p9fX5/fX19fX1+fn1/f39/fn5/gH+AgYGAgICAgICAf4GBgIB8UEhHSElGR0lKTU5OSkxJSUpLTE5KRkNBQkNGSUhJR0hISUdGQkRGRERDQVV0h4mHh4aIgldJTE1MTU5MSkdHR0dER0dHR0ZIRkhFQ0RERkVEREhIQ0NDRkpKS0xMTExMTElKS0pKSUlJSEpISEdISUhHR0hGRkZISklJSUlIXW9vcXJ0d3d6e3t6e359fn59fX19fX5+fYB/f39+fn+BgIGAgYCAgICAgIB/gICAgHxNR0ZIRkVGR0dKS0pMTUxLTU5NT0tJSEhKS0tLS0pLTUpLSEhGRkdGRVBshIeGhoaHh4eHfFBLTEtIR0ZGREVDQ0BBQ0NDQ0ZGRUJAPj5AQUFAQkQ/Pz9ERkdERUdJS0lJR0hJR0lJSkpJSEZKSkpKSUpJSkpKRklMTEpKS0tmb3Bzc3R2eHl7e3t8fH1/fn19fX19fn59f39/f35/f4CAgICAgYCAgIGAgICAgICAfU9GRkdGR0hHRUZHR01NTUtMS0lHQ0NDRElLS0tLS0tNTEtNTElGSlVsgYaFhISGhoaHiIaKdUlJRkI/P0A/Pz88PDw+Ojo8QUFAPjw5OTg8PD07Pjs5Oz9BQkFBQ0NDQEFCRURCQ0ZISUhISExNTEdJSk1NTk1KSktLSkxNU2xvcXRzc3d5e3t7fH19fn9+fX19fX1+fn5/foB/fn9/gICBgIGBgICAgYCAgIB/f39+UUZFRkdJSUdEQ0VGTk1MSklIRT85Oj5ARUhHSUhLTE9OTlFOUV5ygYWEhIWFhoeHiIiJiYyOZkJCPTg4Ojo5ODc4ODk2NDc5Ozw6ODU2Nzc4OTc4NzY4OTs8PD5BOzk5OT09Pjs7PUFERUhKTUxMR0lIT1JRUFBOTE1NT1Fdb3BydHN1eHp7e3x8fn5+f359fX59fX5+f39/gH9/f4CAgICAgYCAgICAgICAgIB/f39RR0ZHSEpIRkVGR0hMTEpJSUdDQjU2OjxDQEJGSEtITEtOVGd7hISDgoOEhomKi4uLiomKi4yJVDs4NjU2NzY2NjQ1NzYzNDY4Ojg3NjU2NTY3Nzc3ODo3Nzg4Ojs3Njg4OTg5ODc2OjxAR0ZJRklGRUZPU1JTU1JPUFBSVGVwcXN0dHd5e3x7fH1+f35/fn19fX19f39/f3+Afn+AgICAgICBgICAgICAgICAgH9/flJISEhJS0lHSUpJSkpLREVIREJANTc4OD06PERCREZGRFZ4hISCgoODhYmKiomJioqKiouJioqBSDY3NjQ2ODg3NDU3ODQ2Nzc5OTc3Njc2NTo6Ozo6PDg5OTk5ODc3Ojo6ODg3ODU4OTtBPT4+QkE/QUtMT1FQUU9PUFFXa3FydHR1d3p7e3t9fX5/fn9+fX19fX5/f4B+fn9/f4CAgH9/gICAgICAgH+AgICAf39+VEhHSUlMTUtKS0tMSUg/QEE/PDo1Nzk4OTc6QTk8RD9QfYSDg4SEhIaJioqIh4iIiIqKjIqJiY16Pjo4ODs8PT45Ojs8ODk7OTo7Ojo5Ozo6Pj09Pzs7Oz06Pjw6PDs8PD07Ojo8ODo6Ozo5OTk8Pzw9QUJESUpMS0pLTFdvcnN1dHZ4e3t7fHt9f39+f359fX19fn9/f35/f39/f3+Bf4CAgICAgICAf4CAgH+Af35URkVGSUxOTkxKSk1CPzs7PDo4OTk4OTk5OTo+PT8/Q3aEg4SFhYaIiYiHhoaGiImIiYuMi4mKioxsPDs+QkNFRUJBQUI+QENBQD89Pj5APz8/QD9APT0/Qj9BQT9BPz1BQUA/P0E8Pjw7Ojs6OTs/PTo7PT1BQUNBQkNBWHBxdHR0dnl7e3x9e31/fn9/fn19fX5+f35+fn9+f4B/f4CAgIB/gIGAf39/gICAf39/flJFQ0FHSk5PTElHSzo4OTs5Ojo8PDo6Ojw7PT5APz1hhYOEhIWFhomJiIeGhoaHiImKi4uKioqLiYtePkRHSUtKSkZHR0RGSEdFQ0BAQ0VDQ0FCQ0I/QERIRUNFREVFQUZFRkRGRkRAQj49QD49P0A+Pj4/Pj8+Pjo7PTxgcXJ0dHV3enp6fX19fn5+f39+fX19fX5/fn5+fn5/gH9/gICAgICAgICAf4CAgIB/f4B+UERAPUNIT01HRkJEOTc5PTo8Oz49Pj47Pjw/P0M+Sn6DhIWGhoaIiYiIh4aGhoeJioqLjI2MjIuKiodXR0xMTUtOSUlLSElKSklFQ0RGR0ZEQ0ZHRUJISUtHSEdGR0dFS0pMSUpLSkNGQ0NEQkFBQ0JEQ0NERENBPTs9QGhwc3R0dnd6eHt8fH19fn5/f359fX1+fn9+fn59fn+Af3+AgH9/gICAgICAgICAf3+AgH9PQT49P0RMS0BCQkE5Nzs+Ozw6PT8+Pzw/PkJBRT9ohIKFhYeHiIiJiIiHhoaGiIiIiYqMjYyMi4uKjH9QTVBNS05LSkxJSUpIS0ZER0hISUVFSUdGRUxMTUlKR0dISUpOTU9NTE5LSEZHR0VFQ0ZGRkZERUhIRkNBP0BMbXB0dXZ4eXl5fHx8fX1+fn9/fn19fX1/f35+fn5+f39/f39/f3+AgICAgIB/gICAgICAf1FBPz4/RkdHPTxAQDg3PDo7PDo9Pzw9PT9AQ0JIU36DhISFhoeHiIiIiIiIh4eIiIiJioyNjIyMjIuKjXFNUU9NTExMTElISEZKSURKSEdLSklKSEhHS0xOTExISElKTVBOT05NT0tJR0lKSElESUhIRkZHR0lGQ0JBQ1VvcXV3eHl7eHl6enx8fX5+f39+fn1+fX5+fn5/f36Af39/f3+Af4CAgICAgICAgICAf39/VERBQUJHR0I/OD9AODo7Nzw9Ojw/PD09QEJDRExthIOEhIWFhoeIiIiIiIeGiIiIiIiJjIyLjIyMi4uLi15SUlBNTk1LSkdGQ0hKR0xKR0tPTEtLSkxNTE9QTkhJS0xPUVFQUU9PSklKSk1LTEZHSEdGR0lGRUVCQEJCXHByd3h5enl5eXt6e3x+fn5/fn59fX19fn9+fn9+f4CAgIB/f39/gICAgICAgICAgIB+f39VRUNFRUdHRUQ7P0E7PTw4Pz09PkBFRD5DRENGSnWGg4ODhISGiIiIiIiIh4eIiIiIiIqLi4uMjIyMi4uNfFdWUlJUUk9MS0tFRkZLT05PV1ZRUE9SU1JNU1RPTVNMUFNVV1JTUlBMSk1NTUxOR0dKRkZISkRERUVCRENjcXV5eXp6ent6e3p6fH59fX9+fX19fXx9fn5/gH9/gICAf39/f3+BgYCAf39/gIB/f39/f1VGRkdHR0dIRj5AQj0/PTxBP0FBRFRLQkhJRklMeYaDhYWEhYeIiIiIiIiIiIiIiIiJiouKioyMjIyOi4uLZ1ZWa2FFUlFRUEs7OlFTUmB1XVVWVFZZWVJYWFJaZlBVV1pdUlRXUVBOUlBQUVFLS0tHSEpIRUZJSUlISWpzdnl5enl6e3t8ent8fXx9f359fX19fX1+f39/f3+AgIB/f39/f4CAgIB/f3+AgH9/f35+VEhKSUlHRkZFPz9BQEVBQ0ZEQ0RLVlBKUFBOT1B5hoWHhoWGh4iIiIiIiIiIiIiIiImIlJyMioqMfWGKi4uHbFtkVTpYWFhTUT5AVlVZXGRgVllicl5dVl1aVkVRWVpcWV9UWWdSVVZYVFRWU09PTUtMSklJTE1LT01UcHR2eHl4d3l5ent6e3x9fH5/fn1+fX19fn1/f39+f4CAgH9/f3+AgICAgH9/gH+Afn9+fn5WSkpJSEdGRERCQT9ITElNUEtJSk9TUlFUVlVWVHWFhIWFhYWGh4iHiIiIiIiIiIiIiImcnaCPiY5nO36MiYqLem5wWFpbWlJTUlZWVFpadYNZVX2QYVxYXV5XSVZeXltbX1lIWVhZXF1YWFlXUlFNUFFNTU9TUVFVUmJ0c3Z3d3Z4eHh6e3t8fX19f39+fX59fX1+fn9/gH9/gIB/f3+Af3+AgICAf39/gIB/gHh5fVlOS0pJSUZCREBBOk9RUVdYUFBQUVJTUlZXV1dXbIGCg4WEhYaHh4eHh4iIiIiIiIiIiJaanJeIioFuhomIh4OKfmZZWVxZU1ZUV1JRV1ZjloBRZXJYWldfaFBgZlpaWFxoYkdPWmlnXFtcXV1XU05TUFBRVlZWVllab3N0d3Z2dHd4eHt7fH19fX5/fn59fn18fn9/f3+Af39/gH+AgH9/gICBgYB/gH1yfX9/b3R8XVNQT01LSkVDP0A7UFBaWlpSU1FPUVJRVVJVU1ZedXiAhYSEhYaGhoaHh4eHiIiIh4eIh4ORjomJiIaFiIiGfYB7XFBWWFRSVFJRUUxPTUtmeVpdVFlVVl1aTFRaVVNUXlpZV1dXemtYWlxcXlNQUE9JTk9XVlhaWmVxdHd2dHR2eHl5e3t8fX19fn99fn1+fX1+f39/f4CAf3+Afn56eHd2c3V7f3+AgHRrfn5rcnleW1ZVU1JPS0ZDREFNXoNsVlJTT09RT1FWUVNSUlRjZHaAg4KDhISEhIWFhISDhoaGhoeIhn6JiYiHhoOHh4d5bXFWSUtOTktNS0hKREZIRUM+U2NVf1JRUU5LUlVSTU9ZUk5PUVNVVU1RU1JQTkxLSENJR1JTVFldbXJ2d3V0dHd7enp7e317fX19fn19fX59fn9/f39/gH99fX5+f39/gIB+e3Zzd31+fmR1fWlxdGBkXV1bWVVRTEhMSWFsknRQUVNNUVJQU1tSU1JRUlVVYnN7fH6AgYKBgX99e3uAf4OChYaHgoaGhoGEgYaFhnVfXUtDPkJCQ0NBP0RQQ0NAQz5CSEdWQEhOTUddaVFIRk9GRUZGSEdIQkNIR0hKR0RBQUNATlBNUmR0dXZ1dHR2eXx7ent7fH19fHt+fX19fn5/f3+AgIB/f3x8fX+Af39/f4CBgH12dHt/bWh8Z25xZmllZGJcWFNRUFVSc1dlW09PTkxRUlBVWVNVUVFUUk9WYGtsc3Z6e3h5dHJuc3RzeXh+foOAg4OCgIKAgoGBa0xHPj46Oj5APz4+PmpQS2FFRkhJRUI/R0xNR01RVUpCRT8/PT08PT0/PT9BQ0I/Pjw9Qj5JTUZVb3V1dnN0dnh7fHp8e3x9fX19fH59fXx+fn9/f4B/f39/enl3eHd2dnh7foB+fXt4dnx1YXhnbHBqbGppZmBbUVFaXFleSUpPUE5LTFFSUVRWVVdRUVdWUFhbYl1hZ21tbG5qaGBucmltbHF1e3p9e3h6fHx4d3hkQkBAQTw6QkNBQUNBW1xPe05PT05LTE1PT1BMS0xXTklHQUE8OTc3NTk5PTs7Ozg5ODk/O0FHPlx0dXV2dXZ3eXx8fH18fH18fn18fX19fX9/f39/fn9/f314dXd6e3p3eXh1d3t8eXh1eXdjcWhpcG1ubW1oZl5PT15cWklHT1FRT01QUU5RUlRWWFNSWVROWVpbV1lcX15fZV9dXnF3a15gZ2t3b29sam9tbmxmYllHRkZIQkFGSEVFRkNMUU9hV1JYUVBTU1JVW09PUVZQTUlERj45OTY1ODY5Nzk6MzY1Nzk1PEI9ZnR1d3h3enl7fX18fHt8fX1+fnt9fn19f39/fn5+fn9/e3d1eX18enh8fHx8dHd2d3Z1d2tuaWhxbm9vb2prYFVXXlpXTUtTVFNQUVVPTFJTVFdYU1RYUUxYWVlWWFhWWFldV1hYaHNrXVZgdGthYV9dZGBfXllVUE1PTkxJR0pLSUhFQ1BPU1pXVFROUVNZU1xlVU9TVFFOS0lIQz9BOTk4ODk3ODg0NzU3ODU5OUducnV5eXp7e319fX18e319fX5+en1+fH1/f359fn59f358dHR1e3hycW9vbnR4cXJzeHZ1cWZkZ3JucHBxbm1kXV9fWVdPUFdWVlNUVk9PVVZXWFlTVVRMS1NVVVVVV1BUVVdUVVJdbl5STllgW1ZZO0RVV1NbZkpMUFJST01NTk1NTEpFUFBVWVNUT0pOT1VTU1xWUlVTUk5NTElISEY/Pz06Nzg3NjU5OTY3NjY1WHFxdHh6ent8fX19fnx8fXx+fX15fX18fn5+fXx8fX1+fXxydnF4eHJ1dXFxbnBwb3B1dnRuamRkanBwcXJwbmZlZGNcXlJUWlZXVFNWVFJYV1lZWVJVT0lHT1BPT01SSk9QT09OTk9UTE1JUFBTVFUyPFhNSUBRPWNgUVNRUE1QUE9OTUxQTlRSUFJMSUxLT1JQUVJSVFFST0xNS0xMSENCQT06OTg3NjtCNDU2NjtlcHJ2eHl7fHx9fnx9fH19fX18e3h8ent9fX58e3l9fH18e3B1b3d1cHV0b3N2cHFxcHV1dmNqZ2VXaHRycnFuaWlocFZWVFVYVVZVUldWVVpZWFdWUVNGRkFGR0dIRkpESEpIR0VITEhLSUdMTVBNRy9FX1I+NEA+am9hUlJRQEdUUE9QT1FOUU9QT0xKTExPUE5NUFFRTlFPSkxNTUtHRUVDQjs9PTw5PUc2Njc2RW5xdXd6e3t8fX18enx8fX5+fXt5dnh3eXl8fXp6dn17fHp6b3Fud3JwdnFtcHNwb3Bzc3N0ZmdgaFpXa3JzcmxtbWtuYmVQU1RSU1VPV1ZVWVlWUVFRT0A+Oz0/QEJBQz9CRURBQEdIR0hGRkhKTUxER0NPUkM4RU1TXWdTUVNBR1VPT1FQUE1NTkxKTEtMTk9PUUxPTk1JTEtJS0tMS0dGRkVEPEFBPjtARTs8ODlUcnN1eXt7e3x8fHt5fHp6fn58e3V0dXJ2dnp6eHpyfHt8eXltcW94cnF1bm5xcm9vb3Rzc3J1dGtnZ15lam1wa29xbWltY0xPTk1RU0xUVVRXV1VMTEtIPTk4Nzs/QT88PUFAQj09RUhGREZGSUdKSkBGQUFARkdESU9IUVJhXFFQUk9TT09PTE1PTUtNTE1PTltWS01RT0dJSENJS0xMS0ZGRkU/QkQ+PUJHP0I/QGRydXd7ent7fHt6end8d3l+fnt7cXN0cHJzd3R4eHN6e3l2d2xxb3ZxdHRsb3Fybm5vc3ZydHNycmtsZW5zaG1ubWxtbGprSUxISE9RSlFTUVRTT0tIQ0U9OTg3OT9CPzs+QUBAPkFFSkVDSEdJR0lFQkI/PjxCQUBHSkVNT2JlUE1PTVZLTE5LTE1NTExLTk5TZE1KTFJJSUlGQkpLTE1OSkdJRkJCQkA/RUZFSERMb3B2enl5ent6fHp3c3h0eHx8eXpucXFtbm9ycnZyc3h8eHZ2bXBtc3B1dGxwcHJvb29ydnVyVlZucWdseYRqbXFybm5qaG9ISkNHTExJTVBNUE9IS0U/Qj05OTo6P0I/PEFCQUFERUdLRkRJSUdHSENDP0I+P0BBPUNFRExNUVRMSklNVEZJSUpMSUpLSUlMTU9QUlBLR0NLSENDS0pMTk9OSUpJR0RDQ0RJSk1MSVpzbnh5eHp6e3l8dnJwdXJ0eXl2eGpxb2tsbG50dG1zdntzdHhyb25xb3ZzbnBvcnBvcHN0eWpOYGdzanR8eWdvc3FqcWhlcUhLQ0ZHSEdKS0lKTERHQjw+PTo6OjtBQj89QkJDQ0hFSkxKRUlJRkdIQ0M7QUBCPkA/QkRESU1PR0hKR0hLREhJS01ISkxISUpMSk1dUkhJRE5HQkVMS05OUE5LTUpLRkdHSk1OUk5NY25qd3Z3e3l7en1xbWxza3B0dHR1aHBtamlra3RwbnR0eXByenRvcnFvd3NvcXB0cnBydXR5a05WbXVscXt2aW5vaWt0aGVwRkpDRkVGREVFRkVHQ0NAPTw9Ojs6O0FEQD9CQ0VFSUZKSkxGSUlHRkZEQjpBQ0M+P0NDQ0VHS01ISk5IREhFSUxOTUhJTEdGRklJTE5LSUhFT0lDR05NT01QTk5PTUtJSElPU1FSTlNnZ2Zyb3N4dnt6fGxoam9la3Btc3FnbmxoaWtsdG1vdXR3cW94dG90c3J2c3BxcnRzcnR1dXZ2WFZ1dWtvdHJrb3ZsaG1mX3BHSkNFRURCQkFFQERCPj8+Ozs7Pjs9P0NCP0FDRkdKR0pJTEhHR0dGRUM/PURFQj5BQ0JDRUdISUdNUElFRkdLTk9LRkhJRkVDRElJSEtJR0hQS0RKTkxQTk9OT1BPSkpJTVJVVVJPWGVhYW1mcHJvcnl6Z2VoaGNpbGZxbGZsbWdpa2xzbXB3dXRwbnZyb3Nyc3V0cXNzdXRzdXZ2dnl2dXR2bGt1dW1ydnFsbmxlck1HRUVGQkFAQUQ8QkE+QT06Oj0/Oz4/QUI/QEJFR0pGSkdJR0ZGRkRDQkFBRUZDQkJCREVFR0dIRkxQTEhOSkpMS0lGSEVGRUNDSEhIS0pHS1JOQ09PTlFQT09OT1BLS0tQVVdWVVRZYF9daWFuaW5ocnNiZWZmZGhoZm5pZm1taGtrbXJpcXZ1c3Ftdm5vcXJzd3Nyc3R1dnZ2dnd2d3Z2dHd1a3N1bnV0c3Fza2tzTUdHRUdBQkBERTxBQUBDPDg6PT46QD1AQ0BAQURGSUVIRkZIRkVFRENFQkRJRkNHRUFFR0VGRkdFSU1LSFFNSktISElFRkhIRUNJSUlLTUtQU05EUlNSUVNOUE1PUE1MTlNXVlhZV1leW11kYGljamlna19kZWZjaGdna2dna21rbWxwcWd0dHVyc252b3FwcnR4cXNzdXZ1gpF5dnZ0eHV1d3hub3VvcnN1cXFpcHpNR0dHSEJCQkVFPEBDQkQ8Nzo+Pjs+O0BCPj8/Q0VHREZEREdFQ0VDREZGRkpFRUlHQkdIRkdGRUNGSkpHTUpMS0hKS0ZJSEpIRUtLTExOT1JUT0hUVVRRVFBSTU5ST01RV1pWWllXW15aWGFgYGBeaGVjYGRlZ2dqaGhqZ2hubGxvbXFwaXV1eHJycHVwcHBydXZwdXN1dnV7fn14dnR3dnZ2d3BsdXBtc3Vub3NzeU1ISEdJREJDSEU9QEVCRD04Oj4+PTw8QkI9QD5BQkZDRUNDR0NDRERGR0dHSUZIS0hDSUhHSUdGREhLSUdKSE1LSktMSEtKTUtJTkxPTk9SVVZPTFZWVFFUUlJMT1FQT1RaWllcWlpdYF9dX2NfXGJkbGNgZGdocoVoZ2pmam5ucG9uc3FqdHV4cnNzdHJucHF2cnF1cnV1c355jn11dXZ2dnZ4cml1cWtydGxxd3F1TElKSEpGQkRHRT1BR0REQDo8PkA/Pj9DQjxAPkFBRkNFRERHREVERkZISEZIR0lLSkVKSEhLSEVGTEhISEpHTEtMTExJTUpNTk1PTFBQUlVWV09LVlZVU1NSUUxPUlJRVltbXV5bXV5gX2FgYmZdZGBmaGBlaWpkc3NmamhnbHBycW9zc25zd3dwdXZ0c21vcnVvcnNwdXJ2cnSBdnV1dXd2dXdzZ3Rya3Fya3J3cHdKSktJS0dCRURFPEFGRERCOz8/QUBAQURBQEI+QUNIQkVERkdFSERGRUlIRklISk1ISEpKSUxKRUpLSElKSkdLSkxMSUlNS01OTk9MT1FSVVdWTU5UVlVTUlFQTU5UU1JXW15eX11eYGBhYWJgZGRlYmRpYmRpamd2i2xraWdtb3NxcHFwcHJ5d3J1dXRzbW1zc21xcm90dXVzcHN3dHV1d3Z1dXVmcXNrcHFqcnZwd0pMTEtMR0NDQUU8QEVFREM9QUFDQkJDRUFDREFBRUdDR0dIRkVJRUNHSUdHSkZJTEhJSk1LTUxGS0lIS0tOUUtSUExSTEpNTU5QUFBVT1dYWFtOU1FXXFpTVlBOVFVUVFhaX2JiX2RhXmFjX2FmY2FiaG5oYmloaG14dm1oaW5vc3JwcXJycnZ0c3Vzc3Nua3NxbXByb3R2c3FxdXZ1c3d5d3V0dWNtdGtvcGpxdHF3TE1LTExHREFARD4+REVGQz9DQUVEREZDQkVHQ0JIRkJISUlHSEpGREtKR0hKSElLR0pKTktOTElMSEtMSlpmSmRbSmxSR05NX25VbHNbcXBid2NSUGJ2dWh1Y2F2YVhucWJkdmltemZcbHRgbGtWYHd2aWpnaGZnbG1qbW9qbW9zcnBycnFyc3Jzc3J0cm5sdG9ucHFxdXVycXN0dnZ1dXl3dXR0YGt0a3Bwa3FzcnlMTkpKSkZCP0BDPzxEREZEQ0NDRUVERkJFRkdEREpFRUlLS0lLTEdHTkpISktHS0pJSkpOTE1NTExJTU1MW3NiZG9dbGxVTE5lcl1nZXFsbnRncGlfYVlubWJwcGJrampnb3F0ZXRub1xwdmdwT0xyeXZrYWFrZWVseG1rdmxub3NycHJxcHFycXJycnRybW1zbm5vcHJ1dHFzc3R1dXV0d3l2dHRibXVrcHBscnJye0tMSUhHRUQ/QUE/PUJFRkJFQ0VERUVEQkhIR0RES0hHS01NSkxMRkpOSEpLSklLSkpJSk1NTk1NTUtOTU1bcnBvbnBwa2pMT1BtWE5pYnRycGFtb3ZcWWxQW21tWnFta3BseHh0c2lwXWBzbHFrVXV5eG9jXmtmYmdwcGppb3Bwc3NwcXBxcXJycXFycnRsbXJtbW5vcnV0cXRydHV1dHV1enZ1dGVudWtwb2xzcnJ5SktHR0VFREJBQj0/P0VHQkdESEVFREJGSUhIRUdLSkdNTE5KTE1HTE5JTUtISU1JSklKSk5PTk5NTE5NTFxoZHVdbHFWa01PUW5VWmtea2x2YWxkdFRlY05sWWxcdG9samx4and1aG9dYHNraFdiY3d8b2NgZ2hhY2l0eWtubnFzc3BxcHFwcnFwcHBydWttcW1tbW9xc3Ryc3J0dnZzd3Z6dnV0aG91bHNvbXNydHZJTUZJRUVEQ0FCPEJAQkZDR0ZLR0VDQ0hKSEhGSUxLRk1LS1JSTEhNTUlOSklHTUdKSkhJTk9NTkxKTU1KWnRwcG9xcWxqT1FSbllza2dvb3Fxb210Xm5YYXRfbm9wb3Fzb291c3R0altedGN3eHJqbnpoYWFjZmFiam10dXBzdHZzcXBwcW9ydHt/fn13bGtxbmxtbnByc3F0dHN1dXR4eHl5dHVrb3VtdXBuc3N2dElLSEpDRERFQEA9Q0NBRkNISU1IRkNGSkxJR0ZKTUxGT0pKV1JLR0tKSk5JSElLSUtKSUlLTE1NTElLS0pTa2JZaV5eaWJyclpfWWpvX2VlVWtfY1thYVFgbWhcalxuaWpkW29lZHBcWlxrW21xY3BzbGRnY2RnYGBrbXBwb3R5cnVxb3BxbnmFiIeHhoWAdnNua21tb25xcnR0cnR1dXZ5eHhzdW5xdW53cXJ1dHdySEhGSkRFQ0ZBQEFFRENGQkhKTEdGQ0ZLTElFRkpPTElPSkxbUUpGSEhLTUlISklLS0lISUdLS0tLR0hKSUtLTEpJSkxNU1tdVFBVTVFPTk9PVlFPUFFOT1FKSk5QUWRxaVRZVltbXFVZW11YXVxcY2ZhYWZiY2ZfXmZrbWhtdHhydHJvcHB0hoeGhoaFhYaHg3pwbW1sa3FzdHRydHZ0dXl5eHV2cXJ1b3ZydHN1dXNIQ0VHRkZARUM/Q0dERkdDSUtMR0ZER0pMSERHSVBLTE9LTFdNSUZFR0lKSElKSExKSUdISEpISEhFRUtISEpOS0hPXFZdT11cYF5PWFlTXFxiXk1ZWk1YYVJLWWFaU2BkXGFYW2RkVlZYXFlaWFxWWVxeY19kYGFfZWhrZ210dHFxdHBxcoGGhoaFhoWFhYaGhoR9cmtpb3Jzc3N0d3l5eHl4d3h0cXhyeHNxcnVydFBCQ0RMTUFDQ0JESUVHR0ZLSktHRUVKSkpGRUhIUEpMTUpNUklIRUFIRkpJS0tJTEpJR0ZKSEVGR0VFSkZCSUxJSlRfWV9YYGFbYFVYWlRdXlpfUllcUF5cWU5fXF5TW15kXlpdYGNfWV9iW2BeW1VZWVpfXmNjYmFjZWlla3Jwb3Bwbm93hoaFhYaCe4CFhYaGhYaFf3VxcHJyc3V5enp5eXh4eHdyeXZ4cnF4dnR2YVNKSk1JRENBQ0ZHRUdHSUpKSUlERktLS0VGSUlOSk5MSExOR0hGPkhHTElLS0pLS0lHRUlGRERFQkZKRD9JS0hOWmJZXl5hX1JUU1dfX1xdWV5RWVxNVl9XS1FZW1FbX2JhXV5jYWBiYWJjY2VaUlpXV11aXWRgX19jZWJob21tbGxsbHWFf4SDeXV8hIWFhYaGhYWGhoN9d3JydHd5eXl5f359eXV5dnZybnp3dnhZUUpGQ0dFQkRISEZHSElGR0pHSEZIS0lLRERKSk1NTExISkpISUdAR0ZOSktLTUtLS0lHSUVFQERBSElBPkhJRk9dYFpbZF1fVFFSWF1cXFxfW0tXXExSXFlJTV5RUV1fYmNjY2NiXGRiYWRjZlhSV1VUXFhbYV9eX2FhX2Rsa21qa2xudn51gXp8hIWFhYWFhYaGhoaFhYaGgnpyc3V1e4WHh4eGhYSBfnhwend2eFxSTUJASUZDRUtJRkdHSUdHSkZGRklMSk5FQ0pKTE5KTElLS0lJR0NISFFNS0tPTUtLSUhIRkVARUJISEFARkVDU11ZXlhfWF9bXVVYWFBdXFFLSlZeWF5bXVZaYVJSX19iYmBgYmJfY2JhZGRhWFBSUlNcU1xdXV5eX19fZGlnbGtubnB7e3x+e4CCg4SFhYWFhYWEhIWDhIWHh4FzcneFh4eHh4eHh4eHh4WDgHx4XFNLQkFHRkRHTVJIRFJLRkhISERGS0lNUEVHSUpLTkxMSkxMSklHREhLUU9NTFBNTUtMSUpERUFFQ0hGQUFGQ0FVVUVcVF5TVmBYTlRVTVlaTEpLVGBhW19YX15iXU9ZYlxgYF5iY2FdYmFXYF9VUVBRUllTXlxbXV1eYGJmZmZsZm9vd3x7gHt9f4CEhISEhIWFhYODhYKDgoWFhnpvgYaGhoeHiIeGhoaFhYSFg35JTkZERkZHRElTY1FFV19JR0dIREZNSlBQRklJSktOTExLTUxKSkdFSk5RUU5OUE1OTE5JTEJFQUNDRkNCQENEP0xHQ0xMT09PTUZNRkZISUdGTEtNT1BJTE9QUFNQTFFUU1VZWFdZV1djVk5SVFBRUE9RVlRcWVlbXVxhYWVmZGhkbG1xc3N6eX97en+EhISEhISEhIKEgH57gYOBfXuFhIaGh4eHhYWFhISEgoGAfUtJRUVHRkdES05eTUhIWU1HSEpIR01MUVFJS0pLS05NVU5PS0tMR0dLUFNTTlBQTk9PT0lMRmFFRF5MRGZiQ0xaR15cc21PTFZuWUtDT19Ua1ZnSV1XVV5ETFFVTE1TVlFTVFhWVFhUVFxUT2VaaGhlWlVrVFhXVVtcW2BgYWJiY2FnaWdubGhyen19foGDhISEg4ODgX19enJ7gXp7f4KAg4SEhYWBhIWBg4N/fnp7TElFRkZIRUVMUFRKS0dgVEhKT0pJT01SUUtNS0xPUlVST1BKTE5HSU1RW1lPUFBOUFFQSktRf1FJfFlZcnNXUG1HcW5vYVZRcXF0T0Jqc25xc3BTb19bblhdVlxYVWtoVV1WY1lgWVpeVVVXf2l0dXVgYXZfWWJcXGZbX2FhYWJfYWNnbW9tYHB3dHiBgYKDg4J/fX6Adnh6bXZ+dHh9gHx+gIGChHyAg3p/gX9+d3dOSUVITU1CRExMR0pMRlJWTEtPSExSWFdRTk9PTVFUTk9RUExMT0hOUFNbWlRRUk9QUFFMSVp4XVR4ZGhYUlNQdmZ0bHBibmZrUnJOTHdtanJwc3JxcnBvb4BdZXp1eHFxenF+cn1rdX1hUmh8ZXNzcHNzfH1wfnhvf3JgYGBiYltiYWhsbmtibGZnbXd+gYCDfnt4d4B0dnppcX5udHx+d3h7foCDeHyBdXx/fHxzc05LRmBdR0FETU1IS0tIS1BPTU5KTlZeWVVMUVNOWVlMU1NTTkxQSVJSVFlXV1FUUFBQUkxIZ3hsY3hxbVpKS1R5cHVtdWJudlBkZEhldnFtd2+AamZ4eGlXclFoem1panp6fWx4en9waG5YdXVqdnVxgWFzaH1pbHh8b19fX2NiXF9kZWdqamVnYmNkbGxwcHN0c3NzeXFyeGJtdGdyeXtzc3V5foFzdnpufH15eHJuTUpSdE5DQkVQUUhLTEpMUU9PT01QWWBaWEtUV1BhXlJWUVlTTVBKU1RWWFdXUFVQT05SSkxyb3V1cXVxY2hgVm5LcXBeR2h5V3ZUS2h4fXdgeXtzbWBdbW9kU2dydW5teXB3a3VzdHFsbVxzfnprbXl8bHVufGtxd3V4Xl9fYl9eYGVkaWdoZmVeYmJpaWlqa25va3FubWpwYWNmZG93eG9tcHN5f25xcGp7enRyb21LS1pWSEdFR1JRSk1OTExRUVBQUFFXXFlVTlZZVWZYUlJZXlRNTkpUVFdXWVdPU09PTlFJUm1IaXdLYGR2dlRWbE5ubHtyYWpnf3VUS1ZrZ3xsbWx3XlpwentfYHpzY3JveHFnY3xpcntdVEtsX3Z1bGp2fHtuf3lsfHBdXl5iW19jZWVnZmVlY1tjY2lra3JzcndnbWloZGdgYWxhZ3Nya2dsbXJ8a21oa3t0bW1rbU9HSktISkhIUlFNT1BMTFNTUk9TUlhSV1RQV1pWVlRUVGFgUU9OS1RTU1FWVk9PTU5PUUtIUU5QVUxLS1JTUlFST1ZVUVFPUlJYWFBNT1VUV1hYWlpUUVJXW1dXV1tPUlRXV1hRXVhWXFVUT1hSV1hYWVpgXGhzX1xbWVxdX2NaX2RkZWdkZGNiWmRiZ2ZmbW5tdWZmZ2NgZl5dZ2BkbGdlZ2tocHpoZ2drdWpoaGlsUElLS0xNS0pUUk5SUVBMVlVUUFRVWFVaVlJbXVZVVFdVWVhPT0xOV1RQTlVTTlBOTFFQS0lRUUtRTUpKT1FUUVBRU1JKSE1PUFFRUFBQU1VSWFdcV1JSUFFVVVZTWlFOUlJXVFNYVVNYVFNRVVRVVllZWF5aX2FdXFtaXFxgY1xeYmNkZ2VlZWNaYGFkYWJoaGpuY2FkXl9jXVpjXGJtYV5mZmdtc2RpaGtrZWRjZmhRSktLTk9MTVRRT1RRUk1YV1VUVlhXV1pWU1xgVldWWVVYVFFQS09YU1BOVVBNUU9MU1BNT1VTTlFOTU5RU1BUUFFUVE5LTU9SVFRRUVFVVlNYWltZUlVSVFhXVllcU09TVFdUU1lUVlhUUlFXVlZYXFpcYF1WWV9dXl1cXWFhXltiY2NoZ2ZkY1hgYGJeYGhlZ2VhXl9dXV5aWl9aX2dgXl5dY2hrYWhmaGZkYGJkYlBLTUxQUUxQVVBQVFFPUVpZWFdZW1pYWVZdamRWWFlaV1ZTVE9LT1ZUUE9UUFBRT01SUU9SWFRRUU9NT1JUTVdRU1RVT01OUVRWVVJSUlRXVVpdXFpWVlFSV1hVW1tWUFNVVVRVWFNXWFRSUVhWVltfW19gX1ZfXV5gXVxgX19fWmNjZWhoZWViWWJgYl5fZmRjYGJdXFxcXFlaW1hbYlxeXV1fYl9fYmRkYmRfX2BcUE1OTlJRTVJTUFNUUU9WXFpaV1tbXFlaW2RxbWhkX1tZVlZYUk1NV1NNTVJPUlJPTFBTUlVbVVRQUExPV1VQVlJTUlhNT1BSVVhVVFRSVFhYW15dXFtWUk9VV1VbWlZRU1ZUVVdVU1haU1JRWldXXV9bYGBgVmJcYGFdYGJfXGBdY2FjaGllZ2FaY2BhX19lZV9gY1taXFtcWlpZWVdcWlxaYF5gW15eYWBfY1xZYFpRTk9OVlFQVVNQVVVTUFdcXFxZXlxfV1xeanB3eYBjXFtWVllSTlBXU05RUVBSVFJMUlRUWVtXVU9STlJXVVJSVFFSWU9RU1RWW1ZWVlNWWlhdXlxcXlZTTlRWVltbVVFUVVVXWFJTWVtTUlJcWFpeX11iYWBXYltjYl5hY15cYmFiX2RnaWVnXlxkYGFgYWNkX2JfWlpeW1xbWFhZV1daWlphXV1bXVxcWl1gV1tbWlBPT09ZUFVVU1JYUlRQW11eXVxgXGBVXFxoanJ9c2xoXFVZV1FPU1tTUlFTUlVVVUtSV1ZaWlpTT1NRVVVUUk5WUVJaUlRVVFhdV1hYU1dcWF5dWVpdVVVOVlZXXlpXUVRVV1hYU1ZZW1RSVl1ZXV5hXmNjX1lgW2ViX2RkXl5jY2FeZWZpZWdfXmRhYWFiY2RfYl5YW19bXFtYWFhYV1taW2BdW1tcW1haW15WXlldUE9PUltQWlVWV1ZUVFReXmBfXmJcYFVdXmJreXVtfmxbVVpWUVFUXFRUVFVUVllXTFJaVlxbXFJQVVNXVVVST1dRU1dTV1VWW15YW1lVWl5YX15ZXFlSV1JZWVlfWVlSVFVZWVlVV1lbVVRaXV1eYWJgZWRdXl1dZWFiZmReXmRjYFxnZWhmZWJgZWFfYWFiYl9gXldZXlpcXFpZWVdWXVpdXltaW1xbV1lcXVZYV11TT1BXWVFdVVdZV1dVWF9gYWFgY11gVV1eYmVldoJ7aVlZWlRWVFZcWFdXVldXXVhPVVxZXl1dVFNYUlZVU1FTV1FTVlRYWFheXlhdW1ZdX1hfX1hcVlFYVFpaWmFYW1RWV1pZWldYWVlXVl1fYF9kY2JmZV5iXGBmYmRmZF9gZGJhW2ZjaGZkZmFmX19hYmFhYF9eVlVdWVtcW1lcWVldW1tbWFhZW1paWl1fXVRZXVVOVFpWVFxVV1dZV1ZcYGFiY2FjX19WW2BkYV96dXBpWlxaVlhWWFtaWVtZWFlgVk9VXVtgYVxUVVlQVFZUUlVVUVNVV1tbXF9fWl9cVl9fWV1eWV1WUlhXWllcYVldVVZaW1pbWlpYWlhZX19gYGRjZGVlY2RaYmZjZ2ZlXmFiYGNdYmNpZWRnYGheYmJjYWFgXl9ZVFtaWltbWFxYWFxbWltXV1pYWFxbXGBdVl1dU09WWlZWWlZZVlhXWF5gYmFkYWRhXllZYWRiYGtmaF9dXVtXWFlaXFxcX1taW2JWU1deXWFjXFNWWVBWVVVVVVVTVVRYXV1fYGBdYV1XYV5bXlxbXlhVWFdbWl9fWl5XWFxcXF1dW1pcV1pfYV5gZGRlZmZnY1ljZmVoZ2ReY2BfZWNdZmlkZWlgZ15jYmNhYWBfX1xYWVpZWllYWlhXW1taW1dYWlRaXVxbYFxVXmJNUldaV1daWVtcWFdZXmBiYWVhZGFdXllhY2JfYWBhX1xdXVhYXFtdXV9fXFpdY1hZWF1gY2RfUlhZUFdVV1dXVlZXVl1dXmFiYV9iXllhXV1eWV1dWVhVVltbYF5cX1lZXl1eXmBcWlpZW19iX2NmZGZnZmhjWmVmZ2lnY19jXmFmZVppaWNmaWNmX2JiY2FgYF9dXVpXW1lZWFhaWVdaW1pZV1lWVVtdXV1gYGJieEtXV1xZV11cXF1aV1xdX2BiZGJjYV1gWGJjYmBjYWNeXF1cWFhcXF9dYF9dW2BkXFxYWmJlY2FSXFlPWFZYWVhZV1laYF5hYmNgYWNfXGJdX11bXl1ZWVRYXVxfX15fW1peXmBiYltbV1tdYGJiZGZkZ2ZmaGVdZWdoaWZjYWJbY2dgXGlpY2hpZmVgYmJjYV9gX11dXFlcWVhXWFlZV1xbWldWWFBYWl1hY2Zmcmt/SllXXVtaX11cXlxZXVteX2JjYmFhXWJbYmRiYGNiYl1dW1pXWGpxYFxgX11cYWNfXllZY2VkYVRfWlFZV1tcW1tZW1tjYGNjY2BiZGFgY15gXF5eXllYVVteXFxhYV9dW2BhYmZiXltTXF9gY2RkZmVnZmZnZl9mZ2hoZ2RkYFtlZ15haGhjaWhmY2BiYWNiX19fXV1bWltZWFhYVlpWXFtaVlZWTVhYXGdpa2h1eIF2dnZ2dnZ2dnZ2dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6e3p6ent7e3t7e3t7e3t7e3t7e3x7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHt7e3t8fHx8fHx8fHx8e3t7fHx8fHx7e3t7e3t7fYmIhoqHhYKBgoOCg4OCgoKCgoKCgoKCgoGAgYCBgICAgYCBgYGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t6e3t7e3t7fHx8fHx8fHx8fHx7e3t7e3t7e3t7e3x7e3t7e3t7fHx8fHt7e3t7e3t8iYmHiYaFgoGCgoGCgoKCgYKCgoKCgoKBgYGAgICAgICAgIGBgYB9fHx8e3x8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eHh5eXl5eXl5eXl5eXp7e3p6e3p6enp6enp6e3x8fHx7fHt6enp6ent7fHx8fHx8fHx8fHx7e3t7e3t7fHx8e3t7e3t7e3t7fHx8fHx7fHt7e3uHiYiJhYSDgYKCgoODgoKCgoKCgoKCgYGBgICAgICAgICAgYKBgH58fHx8fHx8fHx8fHx8fHx2dnZ2dnZ2d3d2d3d3d3d3d3d3d3d3d3h4eHh4eHh4eHh4eHh4eHh4eHl5eXl5eXl5eXl5enp6e3t6enp6enp6enp7fX19fXx9fHp6enp6e3t8fHx8fHx8fHx8fHx8fHx8e3x8fHx8e3t7e3t7e3x8fHx8fHt7e3t7e4aJiYiFhYOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgIGBgYCAfnx8fHx8fHx8fHx9fX18fHVwb29vb3Bwen59fX19fYSMi4uLi454KSkqKiopKz0/Pj4+Pj5tgH5+f397pdfT09PT08/ExcXFxcXH0tTU1NPT2FolKysrKiKL29LS0tLWun1+f39/f359fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx8fHx8fHt7e3t7hIuHh4aHgoGDg4GCgoKCgoKCgoKCgoGBgYCAgICAgICAgYCBgIB+fHx8fHx8fHx9fXx8fH19dXBub29vb296gH9/f39+hpCPj4+Pk3kZGhoaGhocMTMzMzMzMmqCf4CAgHut6eTk5OTl4NTU1NTU1Nbj5eXl5eXrVBMbGxsbEI/v5eXl5enHfX5/f39/f319fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e3uCjYeIh4eDgoSCgYKCgoKCgoOCgoKCgYGBgICAgICAgICAgICAgH58fHx8fHx8fXx8fH19fX12dXV1dXV1dXZ3d3d3d3d4eXl6enl6d29wcHBwcHBycnJycnJyd3p5eXp6en6Dg4ODg4ODgoKDg4OCg4SEhISEg4R3c3Nzc3NyfIWEhISEhYJ8fX19fX19fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e4CMhomHh4SDhIKCgoKCgYKCg4KCgoGBgYGBgYCAf4CAgICAgICAfnx8fHx8fHx8fX19fX19fXZ2dnZ2dnl3dnZ6e3h7eHd2eXx6enl5fXl5eXh4eHh5eXl5enp5eXl5enp6eXh4eXl5eXl5eXl5eXl5eXl5eXl5eXx9fX19fX17enp6enp6e3x8fHx9fX19fX19fX18fH19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8f4uHi4qIhIODgoKCg4KBgoKDgoKCgYGBgYGAgIGAf4CAgH+AgYF+fX18fHx8fHx9fX19fX19d3d3dnZ3fXh3d316eH14d3Z6fXp6e3l8e3h3d3d3eHh4eHh5eXl5eXp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fHx8fHx8fHx7e3x8fHx8fHx8fHx+iomMjImFg4SEgoKDgoGCgoKCgoKBgYGBgYCAgICAgICAf4CAgH19fXx8fH19fX19fX19fX13d3d3d3p9eHt4fHx3e3h3dnp+enl9eHx6eHh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fX19fXx9fX19fX19fX19fX19fHx8fHx8fHt7fHx8fHx8fHx8fH2Kio2NioWDg4OCgoKCgYGCgoKBgoGBgYKBgIGBgICAgIB/gIGAfXx9fX18fX19fX19fX19fXd3d3d3fX55d3d4e3p7eHd3eHl9eXx6e3p3eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt8fHx8fHx8fHx8fHx8fH19fX18fH18fH18fHx8fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8foqJjo2JhISEg4KDgoKBgYKBgoKCgYGBgoGAgYKAgICAgH+BgIB8fH19fX18fX19fX19fn5+d3d3d3d5fHl7eHx9eXt4enp6fHx8fXt9e3h4eHh4eHh4eXl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt7fHx7fHx8fHx8fHx8fXx8fX19fX19fXx8fHx8fHx8fXx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx/iIeNioeFhoaDg4ODgoGBgoGCgoGBgYGCgYCAgoF/gICAf4CAgHx8fX19fX19fX19fX5+fn53d3d3d3Z4eHl3eXp4enh5eXl7eXp6eXt4eHh5eXh4eHh5eXl5enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX18fH18fH19fX19fH19fX19fHx8fHx8fHx8fHx8fX+HiIyIhoeHhIKDhISCgYKBgYKCgoGBgYKBgIGBgYGAgIB/gIGAfHx9fX19fX19fX1+fn5+fnd3d3d3d3d3d3d3eHh4eHh4eHh4eHl5eHl5eXl5eXl5eXl6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fHx8fX19fHx8gIeIi4eHiYaDg4SDg4KBgYGCgoGBgYKCgYGBgIGBgYCAgICBgX97fH19fX19fX19fn5+fn5+d3d3d3d3d3d4eHd4dnl5eHh4eHh5eXl5eXl5eXl5eXl5enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fH19fXx9fXyBhoqKiYmIhIOFhISCgoGBgYGCgYGCgoGBgYCAgYGAgIGAgIGBf3x8fX19fX1+fn5+fn5+f394eHd4eHh4eHZxZGpeam15eXl4eXl5eXl5eXl5enp6enp6enp6enp7e3t8e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIGFiYqJioeEhYWEg4KCgYGBgoKBgYKBgYGBgYCBgYCAgYCBgIF+fH1+fn5+fn5+fn5+fn9/f3h4eHh4eHh5bWRiZV9fXm94eXl5eXl5eXl5eXp6enp6enp6enp6e3t7e3t7fHx8fHx8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goWKiomJhISGhYSDg4KBgYKCgoGBgoGBgYKBgIGBgICAgICBgH58fX5+fn5+fn5+fn9/f39/eHh4eHh4eW5kZWdlZGJeZnh5eXl5enp6enp6enp6enp6enp6e3t7e3t7e3x8fHx8fHt8fHt7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChouJiIqEhYaEg4OEgoGBgYGCgYKCgYGBgYCAgYGBgIB/gIGBf3x8fn5+fn5+fn9/f39/f394eHh4eHl3Z2VkZWZkZWFfaXl6enp6enp6enp6enp6ent7e3t7e3t7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHt8fHx8fHx8fHx9fX19fX19fX19fX19fXx9fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4eJh4SEhoSDg4WBgYGBgYKCgYGBgYKBgICAgYGAgYCAgYF+fHx/f35/f39/f39/f39/gHl5eXl5eWtlYWJlZWFlZV5ieHdze3p6enp6enp6enp6e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fH18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19g4aLhoiFhYaEgoOEhIKBgYGBgoKBgYKBgYGAgYGBgYGAgIGBgn98fH9/f39/f39/f3+AgICAeXl5eXl0Y2NlZGNmY2doZGZsZF5ze3p6enp6enp6enp6ent7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn6DhouGhoaGhYODg4SDgYGBgYGCgoGBgYKBgYCAgYGBgYCAgYGBfnx8f39/f39/gICAgICAgIB5eXl6d2RhY2diYmRdW2VfYV1eYGFoeHp6enp6enp6enp6e3t7e3t7fHx8e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+foSFi4eGhoaGhIODg4KBgYGBgoKCgYKBgoGAgIGBgYGAgYGBgYF+fX1/gH+AgICAgICAgICAgHl5eW9vYmJiZF5jZ19dYWFgXF9kYlttfHp6enp6enp6enp7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7fHx7e3x7fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5/hIiLhoSHhoaEhIODgoGBgYGCgYGBgYKCgYCAgYGBgYGBgYGBgX5+fYCAgICAgICAgICAgICBeXpwXWJlZGJkXmZnZ2BZYmJhY2VfXF1ze3t6enp7e3t7e3t8fHx8fHx8fHt7e3t7e3t7e3t7e3t7fHx8fHx8e3x8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fn19fn5+fn5+fn5+fn5+foCFjIqEhYaGhYODg4SCgYGBgYKBgYGBgoKCgYCBgYGCgICAgIGBf35+gICAgICAgICAgIGBgYF5emxiZGdjYmdmYWBgZGFiZWRjZGNeXGJ1fHt7e3t7e3t7e3x8fHx7e3x8fHx7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/gYeMiYWGhoeFg4SDgoGBgYGBgYKBgoKCg4KBgIGBgYKBgYGCgoF/f36AgICAgICAgIGBgYGBgXp7dGdnZmZkZGZmYF5fYWNlaGRlXmJkYHR8e3t7e3t7fHx8fHx8fHx8fHt7fHt8fHt7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f3+CiYqIhoaIhoWDhIOCgYGBgYGBgoGBgoKCgoGAgYGBgoKBgYKCgX9/f4GBgYGAgYGBgYGBgYGBenptaGNjZ2ZnZWdmZmdiZWRlYmdbYmVgdnx8e3t8fHx8fHx8fHx8e3t8fHx8e3x8fHt7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f39/f4SJioiGiYeFhYSEg4KBgYGBgYGCgYKCgYGBgYGBgYKBgoGBgICBgH9/gYGBgYGBgYGBgYGBgYF7emlpZGNqZmFgZmVjY2NnaWRjYmBiZGJ0fXx8fHx8fHt8fHx8fHx8e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f39+fn9/f39/f39/f3+AhIqMiIeJhoSFhYOCgYGBgYGBgYKBgoGBgYGBgYGBgoKBgYGBgYGAgH+BgYGBgYGBgYGBgYGBgXZzZWRnY2RmZWJlZmdkZmhmZWNgYGNkYHF9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fXx8fX18fHx9fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/fn5+f35+f39/f39/f3+AgICFioyJiIqJhoaDgoKCgYGBgYGBgoGBgoGBgYGBgIGBgYGBgYGCgX+Af35/foCCgoKCgoKCgoKCc3NnZWRkZWlqaGZnZ2NhZmZlZmdmZWVjdX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fH19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gICAgICAgIWLioqJioeHhoSCgoGBgYGBgYKCgYKBgYGBgIGBgoKBgYGBgYGAf4B+dHRzdX1/goCAfn5/gYB0cmdkZWNmaWppZWNlY2BmZGRnZ2JiZWFwfXx8fHx8fHx8fHx8fHx8fHx9fX18fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f39/f39/f4CAgICAgIB/houLioqLh4eHhIOCgYGBgYGBgYKBgoKBgYGAgYKCgYCBgYGBgoCAgH5zc3NzdHV4dXV0dHV2dXVwZmNmZWhoaWdoZ2VmZWJfZGVmY2BiZ3d8fHx8fX19fX18fHx8fH19fX19fX19fXx9fXx8fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gIB/f3+AgICAgICAgICHjIyIi4qHh4eDhYKBgYGBgYGBgoGCgoGBgYCBgoGBgYKCgoKCgICAfnNzc3Nzc3NzdHR0dHNzdW9jY2FnZWhoZ2pmZGVnZmhmY2JlYl5ieX18e3t8fX19fX18fHx9fX19fX19e3x9fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn9/fn5+fn5+fn5/f39/f4CAgH9/gICBgICAgICAgYCAf4CAgYGAgIeLi4eNiYiJhYSFgYGBgYGBgYKCgYKCgYGBgIGCgoGBgYKBgoKBgIB+dHNzc3Nzc3Nzc3Nzc3N1cmdlZWRlamhoZ2ZpaGdjZWViZGNoZGd7eHVzc3R2dnl4dnR0dHZ3d3d2dHR0dXV4d3h4d3d6e3x9fXx9fn5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f35/f39/gH9+fHt7fX58eXl2dnZ5fHx6end2d3l7fXt4hIyMioyHh4iEhYSBgYGBgYGBgoGBgoGBgYGBgYKCgYGBgoGBgoGAgH51c3Nzc3Nzc3Nzc3Nzc3VzaGVnaGVrbGhqZ2lqZ2dnZmRkYmVkbnV0dHNzdHNzc3Nzc3Nzc3Nzc3NzdHNzc3Nzc3Nzc3N0dHV1c3V3eHl7fn59fn98f39/f39/f39/f314fH5+fXx4dXZ3eXd4dnRzc3N0dXRzc3Nzc3NzdHNzc3R0c3R0dHODjI2KiYeIhoOGg4GBgYGBgYGBgYGCgYGAgYGDgoKBgYCBgYGBgICAf3VzdHRzc3Nzc3Nyc3NzdnZpY2hqaGpsZWZpbGhgZmVkY2BkZGZ0dXV1dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHRzdHRzc3Nzc3R2dnV1d3V4fH9+fX9+fHp4dXN0dXV1dHNzc3Nzc3N0dHR0dHR0dHR1dXR0dHV1dHR1dXR1dXV1dIaMjYuIhoeEhIWCgYGBgYGBgYGCgoGAgYCBgYKCgoGBgIGBgYGAgIB/dnNzc3Nzc3Nzc3Nzc3N2dnNnZ2pmaGdmaGhmZGlnY2NnZWVmcHZ1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dHR1dHR0dHR0dHRzdHR0dnV1d3Z0c3R0dHR0dHR0dXV1dXV0dXV1dXV1dXV0dHNzc3N0dHNzdHR0dHR1dXR1iY6MjIqHh4SEhYKBgYGBgYGBgYKCgoGBgICAgoKCgoGBgYGBgYCAgH93c3Nzc3NycnJyc3NzcnZ2dW5kXWNnZWlraGVoZ2dqamlnZXB2dXV1dXV0dHRzdHR0dHR0dHV1dXV1dXV0dHV1dHR1dXV1dXV1dXV1dXR0dHV1dXV1dXV0dHV0dHV1dXV1dXV1dXV1dXV1dXV1dXV0dHNzc3Nzc3N0dHNzc3Nzc3R0dHR0dHWKjoyMiYaGhIeFgoGBgYGBgYGBgoKBgYGAgYGCgYKBgYGBgYKBgICAf3hzc3Nzc3JycnJyc3NzdnZ3d2liaGhnamtpaGZkZGVmaWhwdXR0dHRzc3JxcnJ0dXV0dHR0dHR0c3NycXFxcXNzdHR0dHR0dHR0dHV0cnJyc3R0dHR0dXV1dXV1dXR0dXR0dHR0dHR0dHR0dHR0c3Nzc3Nzc3Nzc3Nzc3N0dHN0dHR0dHR0dYuOjImGhYWFh4SCgYGBgYGBgYGBgoKCgYGAgIKCgoGBgYGBgYGBgIB/eXNzc3NycXJycnJzc3N3d3d3bGpoZGhpa3Z6a2VmZWhnbXJzdHN0c3JwcHBxcnN0dXR0c3NycnNycXBvb29vcHFzc3NycnJyc3R0dHNxcHFyc3R0dHR0dHRzc3Rzc3NzdHR0dHRzdHR0dHR0dHRzdHR0c3NycnFxcnJzc3Nyc3NzdHR0dHN2jZCMh4eFhYSEgoGCgoGBgYGBgYGCgoKBgYGAgYGCgoGBgYKBgYGAf395c3NycnFxcnJycnNzc3d3d3dzc2pnaWloeX99cW51bG5wcXJycnFxcG9wcXFxc3Rzc3NycXFwcG5ubm1ubW5ubnBxcnJycnJycnJzcXBvb3BxcnJzc3JxcnJycnJycnJycnJzc3Jzc3Nzc3Nzc3Nzc3Jxb29ubm9vcXJzc3Jyc3NycnNzcnaPj4uHhoWFhYOCgoKBgYGBgYGBgYGBgoGBgYGCgoKBgoGCgoGCgX9/f3hxcHBwcXFycnJyc3Nzd3d2dnd2cnF0c252f352c3hwcHBycnJycXFwcHFxcXFyc3Nzc3FwcXBvb25ubm5ub25vcHBxcXFxcXBwcXJwb25vcHFxcXFxcHBxcXFxcXJycnJycnJycnFxcnFxcnJycnFwb29ubm1ubW5vcXJycnJycnJyc3JxeI+OjYaDg4aEgoOCgoGCgYGBgYKBgYGCgYGBgYKCgoKCgoKBgYKBf4B/d29wb3BxcnJyc3Nzc3J2dnZ2dnZ3dnZ1c3l/fnd3d29wcXFxcXFxcHBwcXJxcnJzc3JycXBwb29wb29vb29vb29wb3Bvb29vcHBxb29vcHBwcHBvcG9wcHFycXFxcnJycnFxcXFxcXFxcHBwcHBxb29ubm5tbW5tbm9wcXFxcXFxcXFxcXB7j42NhoODhYOCgoKCgYKBgYGBgoGCgYGCgoGCg4KBg4KBgYGAgYF/f392bm9wcHBxcXFxcXBwcHZ2dnZ2dXR0c3NxfYB9fX9zb3BxcXFwcHBwcXFwcHBxcnJxcXFwb3Bvb3Bwb29wcG9vb29vb29vb3BxcXBub3Bwb29wb29wcnJycnFxcXBxcnFwcXFxcHBwcHBwcHBwb29ubm1ubm5ubm9ub3BwcHFxcXFxcXFxcIKRjoqEhIOFhIOCgoGBgoKBgYKBgYGBgYGCgoKCgoKCgYGBgYCBgX9/gHVvb29wcXFxcXBwcHBwdnZ2dXRzcnJycnGAgoCBeXBwcHBvcHBwcHFxcXFwcXFxcXFxcG9vcHBwcHBwb3BxcHBvb29wb29vcXFwcG9wcG9vb25vcHFxcHBwb3Bvb3BwcHBwcHBwcHBvb29vb29vbm5tbW1ubm5ub25vb3BvcHBwcHBwcHBwiZCMiISDhIaDg4KCgYGCgoKCgYGBgYCAgYGBgoKBgYGBgYGBgIGBgH+AdG5vb3BxcXFwcG9vcG92dnVzcnFxcXFxcICDg39ycHBwcHBwcHBwcHFxcHBxcXFxcXBwcHBwcHBwcHFwcHBwcHBwcHBvcHBxcXBwcHFxb29vbm9wcHBvb29vcHBvb3BwcHBwcHBwcHBvb29vbm5ubm5ubW5ubm1ubm9wcG9vb29vb3BzcXWPj4yJg4KFh4ODgoKBgoGCgoKBgYKBgYCBgoGBgYGBgYCAgYGAgYGAf4B0b29vbm9vb29vb29vb3Z1dHNxcXFxcXJygIKCgXRxcXFxcXFxcXFxcXFxcXFxcXBxcXFxcHFwcXBxcXFwcHBwcHFxcXBxcHBwcXBwcHBwcHBwcHBwcHBwcHFxcXBxcHBwcHFwcHFxcHFxcXFxcXJxcnFwcnRycnR0dHR1dnRzdHR0dXd3gpCPi4iDgoaHhISCg4GBgYKCgoGBgoGBgYKBgYGBgYGAgICBgYCBgYB/gHVvb29vb29vb25vb29vdXRzcnJycnJycnKDg4OCdnFycnFxcXJxcnJxcXJycnFxcXFxcnFxcXJycXFycXFxcXFxcXFxcXFwcXFxcXFxcnNzcnJyc3V1dHR0dHR0dHV2d3d3d3d3eHh4eHd3eHh4d3Z3dnV2dnZ2d3h6e3x7e3t6enp6enyGkI2LiIODiIeHhYODgoGCgYKBgYGBgYKCgoGBgYGAgYCAgYGAgIGBgH+Ad3FxcXFxcG5ucG9wcG92dHV1c3Nzc3NzdYiDgoN5cnNzcnJyc3Jyc3NycnJycnN0cnJzcnNzc3Nzc3Nyc3N0dHV1dXV1dHV3eHd3d3d4eHh3eHh4eXl5eXl4eHl5eXp6e3t7e3t6enp5eXh3d3d1dnV2dnd5enp7fn5+fX1+fn5/f35+gIyQi4qHg4WIi4iEg4SDgYGCgYGBgoGBgoKCgoKAgYGBgYCBgYGAgIGAf4B8enp5eXx5eHh2dXZ2dHl2d3h3d3Z3dnZ6f3x+fnx2dnd3dnV4enh4eHh3d3d2eHx5eXx6eXl8e3l5eXh4eXl6enl5eXh4enp5eXh4eHh3dnd3eHh3eHh5eXp7e3p8fH1+fX9/f359e3t7e3p5enl5e3t/foB/fn5/fn19fX5+f35+fn6AjpCNioeEhoqLiIaGhIOBgoKBgYGCgYGCgoKCgoCBgoKBgYGCgYCBgIF/f4B/fn19fX9/f318e3t7eXh4eHh5eXl4eXh5eXl4enp6enp6e3t7fH1+fHt7ent8e318e3t7e3t7enl4eXh4ent6enp5eXp8fHt6enx8fHp6ent9fXx+fn+AgoGAgYKAgH9/gYGBgIB/f35+fn5/fX1+f4CAf35+f39+fn9/f39/gH+Af4OQjoyHhoWIi4yIh4aFg4GCgYGBgYKBgoKCgoKBgYKDgoGBgYGBgIGBgIB/goOCgoGBgX99f39/f4F6enh4d3h4eHh5eHh5enp5e358enx9fXt8fX19fHx8fnx9fn5+fn59fX9/f3x8fYGDgYCAf318fXx9fXt9fXx8fH19fX1+gYGChISDgoB/gYGBgH9/f4B/f39/f39+fn9/f39/f35+f3+Af39/gICAf4CAgICAhJCPi4eGhoiMi4iKhoaDgoKCgYGBgoGCgYKBgYGBgoOCgYCAgYGAgIGBgH+ChIKCgICAgH9+fn+AgH9/fn18fX19fYB/fX+Af35/gH9/fn9/gIGBgICAf3+BgICAf4CBgn9/f4CAf35+f39+f39/fn5+f39/gYB/f4CBgYCAgYOEgoGCgoGCgH+AgYCBgYGAgH+BgICAf39/gICAgYGBgIGBgYCAgICBgoGBgYCAgYGFjo6MiIaHiYyLi4qGhYOCgoKBgYGCgoOCgoKBgIGBgYKCgICBgYCAgYGAf4KFg4KBgYCAf39+fn+AfX5+fn19fX5/fn9/f35+fn+AgYCAgICAfn9/fn+Af3+AgH9/f35/f35+fn59fn9+fn9/f35/gIGBgoKDg4KCg4KBgYKDg4OCgYGBgYKBgoKCgYKBgoGBgYGBgoKCgYGCgYKCgoGBgoKBgYKCgoKCgYGBgoKCgoaPkY+Kh4iKjY6NiYaFgoKCgoKBgYKCg4KCgoGBgYGBgYF/gIGBgYCBgIF/gYWEg4KCgoGCgYCAgIB8fHx7fH18fH9+fn9+fn5+f35+f39/f39/f35+foB+fn5+fn9/f39+f39+fn5/gIB/gIB/f39/f3+BgYGCgoCAgYKDg4SDg4ODgoKCgoKCgoKCgoKCgoGCgoKDg4OCg4ODgoKCgYKCgoODg4ODgoKCgoODg4KCh5KSkIuKi4uPj42Kh4SCgoKCgYGBgoKDgoKBgYGBgIGBgICAgYGBgIGAgYCAg4SDg4OEg4ODgoKCgXx9fHx9gn1+f4GCiIGCgoSCgYGDg4GBgYKCgYKBgYCAf39/gICAf3+AgX9/f39/gYCAgICAgH9/f3+AgICAgH9/gYODhYSEg4SDgoKCg4OCgoOCgoODg4ODg4SDg4KEhYWDg4SEgoKDhIOCg4ODg4OCgoODgoCKlJOPioqMjpCPjYuGg4KCgoKBgYGBgoOCgYGBgIGBgoGBgICBgYGAgYCAgH+BgoODg4SEhIOCgoKCfXx8fn6AgYOAg4OChIaFhoaFhIWFg4ODg4OBgYKEhIKCgoeDgoKAgoGBgoKCg4KCg4KDgoODgoGAgIKCgYOCgYKCg4OEhYWEg4OChISEhIOEhISDg4OEg4ODg4OEg4SDhIWEhISDg4ODgoKCgoKCgoKBgYKCgo+UlI+Njo6RkY6KiISCgoKCgYGBgYGCg4GBgIGBgYGBgYCBgIGBgYCBgICAgIKChIKDhIOCg4ODgoJ9fX2AgH+AgoGDg4ODhIaEhIOEhYWDg4GBgoOBgIKDgYKFhYWFhoaHhoaGhoeHh4aGhoeHhoaEgoGCg4SDg4ODg4ODhISFhYWDhYSFhISEg4KBg4OCg4SEg4KCg4SCg4ODg4OCgoKCgoKCg4OEhIOFhYWFhoaIk5OTkI+Pj5KRjIqHgoKCgoKBgYGBgYKDgoKBgIGBgYGBgICAgYGBgICAgICAhISEgYKCgoGBgoKBgX+AgYOBgICAf4CCgoKDg4KCgYODg4SDg4KDhYOCgYGBgoSFh4eHh4aGh4eHiIiHh4eIiIiFhIOBgIGBgoKCg4GCg4SEhYSDg4OEg4OEhIOBgYGCg4OEhISDg4ODg4OEhIODgoSDg4ODhIWFhoeHh4eIiIiJiY6TkpKOj46QkY+LiYeCgoKCgoKBgYGBgoKCgoGBgYGBgYGAgICAgYGAgIGAgICDg4KCgYKCgYGAf4CBhYWFhoOCgYB+fn+BgoSCgYKDhIOCg4ODg4KChISDhIOCg4SFhISFhYSDgoSFhYKEhIWFg4KBgH9/gIB/gIGEg4OEhYWEgoKCgoOCg4OFhIKDhISEhYaGhoaGhoWFhoeHhYaIh4aHiIeGhoaIiIeGhYaGhoeIkZKSkI6QjpCRjImHhYGBgoKCgoGBgYGBgoOBgYGBgYGBgICAgICCgICAgICAgISEg4KBgoGAgYGAgYKIh4aHhYSCgH99fX6AgH+AgYGBgYGBgoGAgYKCgoGCgoKBgYGCgYKCg4GBgICAf4GAgH+AgH9+gIGBgYKCg4OEg4OEg4OCgoGBgoODg4SEg4SEhIOFhYaFh4eIh4eHh4eHh4eGhoaGh4WFhYaGhIWEhIWEhYaSk5GOjo+OkI6JiYeEgoKCgoKCgoGBgIGCgoKCgoKCgoGBgYGAgYGBgICAgYGAgoSDg4KDgoGCgYKDg4iHh4eHhYSCgX5+gICAfn5+f4CBgYGCgYCCgoGCgH+AgIB+gIKBgIGCg4OAf39/gICAf4CAgICDg4KDg4ODgoOBgYKCgoOCgYKCgoOCgoSDhISDg4SEhYWFhYaGhoaFhISEhYWEhIWFhYSEhISDhISEhISEipSTkpCQj46NiIaFhIOBgYKCgoKCgYGAgYKCgoKBgoKBgYCBgYCBgYGAgICAgYGAg4OCgoOCgoKBgoOCiImJiYiHhYSDgYKEhIOBgYGCgoOCgoOEgoOEhYWEgoSCgX+AgoGBgoGChIOBgYGBgoOCgoGDg4SDg4SEg4OCg4KDg4ODg4KCgoKCgoGDhISEhYSFhYWFhIWEhIWFhYWDg4OEhISEhYWFhISEhISEg4ODg4OOlZKQkZGOjYyHhYODg4GCgoKCgoKBgYCBgoOCgYCCgYGBgICAgIGBgYCAgICBgICDhYSEhIODg4SDhIOGh4mIhoWDhIOEg4WDgYGDgoOFhYODg4SDhIODhYSFhISEgYGAgYKDgoKEg4OCgoGBhIWEg4ODgoKDhISDg4ODg4SFhISDg4KCgYKCgoSEhYSFhYWFhYODhYWFhYaFhoWEhIWEhYWGhYWFhIWEhISDhIODhJGUk5KSj4yMioWEhIODgYKCg4KCgoKBgYGCg4KBgYKBgYGBgICBgIGBgH+AgIGAgYaGhoaGhoaHh4aGhYSDhYaCgIGBgYGHgoB+f4GAgIKBgYCBgYCAgoGCgoKBgoKCgYCCgoKCgoKDg4GCgYKDhYODg4KDg4OEgoKEhIOEhIWEg4OCgoKCgYGCg4ODg4SFhYWFhIOEhYWGhYWEhISEhIOEhIWFhYWFhIODhIOEg4KGlJOSlJKPjYuHhISEg4KBgoODgoKDg4GBgoKBgoKCgYGCgYGBgYCAgYGAgICAgICAhYWFhYaGhoaGhoWGg4ODg4GAgoKCgYKAf35/f4CAf4B/gIGAgH+BgYGBg4CAgYGChIOBgYGBgYKBgYKDgoODgoOCgoKCg4OBg4SDg4ODg4OEhIKCgoKDgoKDg4ODhIWEhISEg4OEhIODg4OEhIODg4ODg4SDg4ODg4KDg4KDgouUk5KTkY2NioaDg4OEgoGCg4ODg4ODgoGBgoGCgoKCgoKBgYGBgICBgYCAf4CAgICDhISFhYSFhYWEhIWCg4KDgoKDg4OBgICAgICAgYCAg4KCg4GBgoKDg4OEgoODg4KAgICCgoKDgoKDg4ODgoODhIKCgoODgoKDg4KCg4KDg4WEg4ODg4SDg4SEhISEhYWEhIWEg4SEg4OEhISEhISEg4SEhYSDg4SEhIODgoKDkJSSkpKPi4yIhoSEg4OBgYKDg4ODg4OCgYGCgoKCgoKDgoCBgoGAgICAgIB/gICAgISDhYWEhYWFhYSFhYOEhIWDg4SFhIKCgoOCgoSCgYKGhYOEg4OEhISGhYSEhYJ/fX19foKEg4ODg4OEg4ODhISEg4OEhISEg4SEhIOEg4OFhoWFhYSFhYWFhYSFhoWGhoWFhYWFhYWFhYWGhoWGhoaFhoaGh4aFhYWFg4SEhIeTk5KRkoyLiIWGhYWCgoGBgoODg4OCg4KBgYKDg4OCgoKBgIGAgICAgICAgH+AgICAhYWGhYWGh4eGhYWFhISFhYSEhISEg4SDg4OEhYOCg4SFhYaFhoaFhoeHhoOBfn9+fn5+f4OEg4OEhISEhISEhISEhISFhYWEhYSGhYWGhYaGhoWGhYWHhYWGhYaGhoaFhIWFhYWFhIWGhoaHhoaGhoaHh4iIiIaFhYaEhYWGjZSTkpGQi4qHhoeGhIGCgoKDg4ODg4KDgoGBgoODg4KAgYGBgICAgICAgICAf4CAgICHh4eGhoeHiIeHhoaEg4ODhIODg4OEg4ODg4OEhIODg4WFhYWHh4WFh4WBf39/f39/f35/gISFhIWGhoaFhYWFhoaHhoaFhoWFhoeHh4iHh4eGhoaHh4eGhoaHhoaGhYSDhIWFhYSFhYaGhoeHhoaGhoeHh4eIiIeGhoaHh4eRk5KQkZCLiIiFhoSDgoKBgoODg4ODgoKDgoKCgoOCgYCBgICBgICAgIGAgIB/gICAf4aHiIeHh4eIiYmIiIODgoKDg4SEhIWEg4KCg4OEg4OCg4WEhYeIhYOCgH9/f39/gIB/f4B/f4WFhoeIiIeHh4eIh4iHiIiIhoaHiIiJiYmIh4aHh4eIiIaHhoeIhoaFhIOEhYaGhYWFhoaGh4eFhoeGh4aGh4eHh4eHh4eFh5OTkY+RkIuHhoWGhIKCgYGCg4ODg4ODgoKCgoGCg4KCgIGBgYCAgICAgICAf4CAgYB/hoiIiIiHh4iJiYmIg4KCg4ODhIWHh4eFg4OFhIODg4KEhISEhYSBgIGCgYGBgYB/gH9/fnt6gIaIiIqKiYmIiImJiYmKi4qIiIiJiYuLioqIiIeIiIiHh4iIh4iGh4aEg4OFh4eHhoWFhISEhYWEhYWGhISEhYWFhoWGhYOJlJOQjpGOioaFhoWDgYGBgYKDg4ODgoKCgoKCgoKCgYGBgYGBgYCAgICAgIB/gICBgH+GiYiIiYeIiImJiIiEgoKDg4ODhImKh4eEhYWEg4OFg4WEg4OCgYKCgoKCgH9+fH19fX9+fHt8g4eJi4uKioqIiIqJiImLiomJiImIioqJi4mHhoaGh4WGiIiJiIeGhoSDgoSIiIiIh4WCgoGDg4KDg4SCgoKDgoGEg4SDgY6TkpCPj4uIhYSGhIKBgYGBgoODg4OCgoKCgoKCgoGBgYGBgIGAgICAgICAgH+AgIGAf4WIh4eHhoeIiIiHh4SCg4OCg4OFiYqJh4WHhYSFhYSDhYSDgoKCgoKDgX59fn5+fn5+fX1+fX19g4eJioqHh4WGh4eHh4iHh4mHiIaIh4eJiISDhIOFhISFhYaIh4aFg4KCg4WHhoeGhoOCgoOEgoOEhIKBgYGBgYODhIOEkZKRjo+Ni4eEhoaDgoGAgYGDg4ODg4KCgoKCgoKCgYGBgIGBgYCAgIB/gIGAf39/gIB/hYaGhYaGhoeHiIeGgYKEhIOChYaIi4qGhYaEgoaGgoCDg4ODg4OCgoF9fH1/gH9+fn59fH19fHp8hIaHhoSDgYODhIWFhYODhYSEhISEhIWEgoKDgoSEgYKDg4WGhYSCgYGCgoODhYOEhIWEhIaDg4SFg4KDgYKDg4SFhIeSkY+Nj4yJhoSFhIWCgYCBgYODg4ODgoKCgoKCgoKBgYGBgYGAgICAf4CAgYB/gICAgICDhIWEhYWFh4eHh4aAgYGFg4OFhYSHiIWDgYCAgX9+fYKDg4ODgoKAfX1/gICBf31+fn19fX16enp+g4SEgoGBgIGBgoKBf36BgYGCgYOBgoGCgoKBg4OAf4CAgYOCgICAgIGBgYGCgYGChIODhYSCg4SDgoKBgoSDhYWGjJORjo+Pi4iFhYOChIGBgYGBgoODg4KCgoKCgoKCgoGBgYCBgYCBgH9/gIGBgICAgH+AgIKCg4OChIOEhYWGhn+BfoCBgICAf4GDgn9+fn5+fHx/g4OCg4KDgX19fn+AgIGAfn19fX1+fXx6enp/goKAf39/f35/f4B+fYB/f4CAgX+AgIF/f3+BgX59fX+AgX9/fn+AgH+AgICBf4CCgICCgYGCgYGAgYGBgYKEg4aPkpCOj42Kh4eGg4OCgYGBgYGCg4ODgoKCgoKCgoOCgYGCgYGBgICAgH+AgICAgICAf39/gYKDhIGCgoOCg4SFgIF/fH19fn19foCAfn1+fnt9foKDg4KCgYF/fX1+f4CAgH9+fX19fHt7e3p6eXqAgH9+f35+fnx+f35/gH9+f3+Af4GAf35+fn9/fn18fn+Af35+f3+Af39/f4B/f4B+f4CBf4B+f39/gH9/f4B/hZKSj46Pi4uHiYWEg4KBgYGBgYKDg4ODg4OCgoKDg4KAgYKBgYGAgICAf3+AgIB/gIF/f36BgYSEgYKBg4OCg4OBgH98fn5/fn6Af4B/foB9fX+BhIOCgYB/f359fn5/gICAfn19fXx7e3x6enl5eXt/f35/f39+fX5/f4CAf35/f4CAgoB/fH5+f35+fXx/f4B/fn5/f4B/f39/foCAf36Af39+fn5/f35+f318fH2FkpKNjIuKiImIhIWEgoKCgYGBgoOCgoODgoODg4ODgYCBgYGBgYCAf39/f4CAgICAgH9/foCBhIOCgYGDhISDhICBgYCBgIGAgYKCg4GAgX6AgoODgYGBgYCAfX19fn5+f359fX19fXx8fHt6eXl5eX2Af4CBgYF/f4GAf4F/gICAgYGCgoB+gH5/fn5+foGAgoF/f39/gIB/f4B/gYB+f4CAfn9/fn+Af31+fX17fIaTkYyLioeHioiGhoSDgoGBgYGCg4ODg4OCg4OCgoKBgICBgYGAgH9/f4B/gICAgICAgH9+fn+BgYGAgISGh4aHgoSDhYOBg4ODhYSEhISDgYODg4KCgoGCgX5+fX19fn6AfX19fX19fX18e3p6eXl5eYCCgoKEg4CBg4GAgoCBgYGDgoODgYGCgIGAf4CBg4GEgoCAgYCBgYCAgYCCgn+BgIF/gIB/gICAfn9/fnx8ipOQiomIiIiJiIaGhoSCgoGBgoKDg4ODg4KDg4KCgYCAgICBgYGAf39/gICAgICAgIGBf359fn5/f39+g4aHh4iChoSFg4SFhIWGhoaGhoWFhoGAg4ODgoKAfX19fX19fn59fX19fX19fX18e3l5eXl4fIKDhIWCgYSDgoKDhYaCg4SDgYKCg4OBg4KCgYKFg4iFgoGBgYKCgYGBgYSDgoOCgoKCgYGBgIF/gIGAf36Ok4yHiIaIh4aGhYaGhIKDgoGCgoODg4ODg4OCgYGBgH+AgYCBgYB/f39/gICAgH+AgYB/fn19fX5+f36Ag4SHiISGhoaFhoaHh4aGh4eHhoeHf32AgIGCgX59fX19fX19fX19fX18fH5+fnx7eXh3eHl5gIKDf4ONhIOEhISXl4ODhIF9foGCgoGCgYKBg4aIjIWDgoKBhIKEg4KDhYWEhYOCg4OCg4OCgoKCg4OCgpKQi4iIh4mHhoaEhoWEhISCgYKCg4ODg4ODgoGBgYCAgICBgIGBgH9/fn+AgYCAf4CBgH9/fn1/fn+Bf4CCgYWFhYaGh4eGh4eIhoeHh4aHh4d/fH18fX9+fX19fX19fX19fX19fXx7iJKCe3x6fIZ5eHl8gYF+iZeEg4OEhJSTgIGBf39/fn6Ei4B/gICEhpCJhYSCgoGFhYuDgYKFhYaGhIOFhYOEhIODhIOFhISIko6LiYiIiYeIh4WGhYSFhIKBgoKDg4ODg4OCgYGBgICAgICAgIB/f39/f4CAgICAgIGBf39/f4CAgIGBgYGBg4OGh4aGh4aGiIeGhoaFhISGhX98fHx8fX18fH19fX19fX19fX18fH+RlZaDe3qElHx4eXp7fH+Cg4GBgIOCgH58fn57iJF8fI6Wf31/f4KGioWDg4SCgYONiX9+f4OEhYWDhYaFhIWFg4SFhYaEhI6Rj4uKioyKiYqHhYaFg4OCgYKCgoKDhIODgoGBgICBgICAgYGAgIB/f3+AgIB/gICAgX5+f4GBgoKCg4SDgoOCgoWGhISFhYSGhIOEg4KBgYOBf319fHx9fXx8fH18fH18fX19fHx8e4uRl4x6e3yAenp6e3x5eX19foB/gH98e3t+fn2ClZF/hIh+fH5/goR8fIGChIKAf4eDfYKBf4KCgIODhISEhISChIOEhYKEkZGNi4yMjoqJiYaFhYODgoKBgoODgoKDg4KCgYGAgIGAgICAgICAgH+Af3+Af357gICBenyAgYKDhYODhYWFhYODg4SCgYODgoOCgoGAgIB/gX5/fn59fHx8fHx8fHx8fHx8fHx9fXx8fn6Kgnt6e3p4ent6fH17fn1+f319fX18fH+BgX2Gj4F+fYJ+f36Agnx8f3+BgIKAfn17ioJ9gH9+gYCAgYKBgoCAgIGAf4uTj4uLjY6NiIeIhoWEhIOCgoKCg4OCgoODgYGBgICAgICAgH9+fXx7fHx9f3+AgHx6gYF4e4CCgYOFhIOFhIaGhISAhpSIgIKBgYGBgH9/f39/fn5+gHx8fHx8fHx8fHx8fHx9fHx8fHx8fHl7e3t4eHl7e3p8gX+Afn+BfH5+f399gIKCgICAgX+CkYF/f4CAfoB+fn9+gIGBfXx9e319fXx9fHx9gH+AgH6Afn6BlJGLjIyNj4qGhoaFhISFg4ODgoODg4OCgoGBgYGAgICBgICAf4CAf39/fXt6fICAgHh+gXd7gIF/gYKCgoKDhoeGhn6IlYp+gYGAgIB/foB+f39/fn+Bfnx7e3x8fHx8fHx8fH59fHt9fHx8e3x8fHp6eXt8en2Fg4J/gYF+f35/gH6FgoF+gH9+foCFhoKAfn6Dh399fH6AgIGAf39+fX19fX16fH1/f3+AfX9+gIyRjYyNjo2Nh4SGhoWEhIODg4OCg4ODg4KBgYGBgICBgYGAgYGBgYGAgH9/f397en9/e3mAd3p/f31+f3+Af4KEhoaFf3+FgX5/gIB/gH5+f35/gIB/gIB/f318fHx9fn18fX19fX19fH58fXx7fXx8ent6e319f4aEgoCAgX1+fX5/fYuEgYZ+fXx8f36CgX99fX19gHx7fXx+gYSDgYB+fn5+fXx+f399foB+fn6EkoyMi46Ni4qGhIaEhIODg4OCg4KDgoOCgYGBgYGAgYGBgYB/fXx8fH1+f39/f397e399d352eH59fH18fX5+gYGCg4B7fn18fn6AgH6Af35/fn+AgH+AgH9/fn9+fn5+fn1+fn99fH59fn19fHt8fHx6e3p9fn+Ag4OCf35/fH18fXx9gYN+jH58e3t9fn1+fn17e3t9e3p7e3uAhoSChIOCf4B+f4KCgn9/goJ/gIqPi4qKjIuKiISEhYOEg4ODgoKCgoKCgoKBgYGAgoKBgYKCf3+AgIB/fn18fH5/fn55fX52e3Z4fXx8fHt9fX6BgICAf35/f31+fn9/foB/f39/f3+AgIGBgH99gH9/fn9+fn9/f3yCfn59fX17e319fHp8fH6AgoF/gIB8fH18fHx8fH18fXt/fnt7e3x8fH18e3t7e3x8enp9en6CfoGDhIKBgoGFhoWFhoaHhoKEkI2LiomKhoeFgoOEhISEg4KCgYGCgoKBgoGBgYGBgoGBgoKAgYKBgYCAgH9+e3x+fnx6fnh5dnd8fHx7e318f4GAf35/foB/f35/f35/gH9/f39/f3+AgoKAfn6BgIB/f39/f39+fYN8fH19fH99fX19e3x+fn9+fn1/fnx8fHx8fHx+fnt8e3x8fHx9fH18fnx9fHx7e3x5e3x7e317fX5+f4CAg4eJiYmKiYuJhYiQjIqIiIaFhYOCgoOEhIODgoKBgYGBgYKBgYGBgYKCgoGCgoCAgX98e3p6eXt9enx+fnl8eXh4dHx8fHt8fHx+gX9/f39/gIB/fn5+fX+AgH9/f3+Af4CDg4B/gIGAgIB/f4CAgH58enx9fX59fX5+jIZ9fX57e4OCfX19fX18fXx9fX1+fH17fXx9fX58fn19fX18e3t6fHt8fHt6e3t6enp7fn6ChYiHh4uLi4qJjJCNjImHhoWEg4KCgoODg4OBgYGBgYGBgYGBgYGCgoOCgYKBgIGBf3+Af356eHl5en5+e3l6eH5zfHx8e3x8fH5+fn9/gH+AgIB/fn9+gIF/f4B/gIGAgoSDgYCAgYGAgX+AgYGBf39+f31+gH57foGRjHx9f4qAjYx+fn19fX59fX59fHx8fX18fXx9fX1+fX1+fnx7e3t8fH18e3p7fHl6eXh5e35/hIKEiImKiImNj4yKh4iFhISDgYKCgoKDgoGCgoKBgYGCgYKCgoGCgoKBgoKAgYGAfoCAf39+e3p5e319eXx6f3KBfXt7fHx8fn59fYGCf4GBgX9/gH+AgX9/gIGCgYGFg4SCgYGCgYKCgICBg4KAf4F/fX6Afnx/f4iCf36DkISEg4F/fn18jYd9fX59fHx/fnx9fXx9fX1+fX5/fX19e3x9fnx8e3x9enp5eXp5e3t+foCBg4eEiI2MiYmFhYSEg4KCgoKCgoKBgYGCgoKBgoKCgoKCgoKCgoGCgn+AgIB+f39/fn5/ent5fX16enp9cX6Cent8fX19fXp4foKAgYKCgICBgIGBgICBgoKCgoaFhIGBgYGBg4F/gIKEgX9+gYB9foF+fX9/gIB9fn+EgH5+f31+fX2KhX1+f31+foB/fX19fH5+fn99f4B9fX18fX9/fHx7fH17e3t6enp7e3x9fn2Ag3+IjImJh4WFhYSDgoKCgoKCgYGBgoKBgoKCgoKCgoGBgoKBgYKCf4CAgH9/f39+fn59eXp6fXx5d3t0e4d8dHd9fn17e3Z2foCBg4KBgYKCgoKBgYGDg4OChYaEgoCAgICCgX+AgYSBfn6AgH1+gH19fn6AgH6Bfn+Af39/gH99fn9/f3+Afn9/gH58fX18fn5+foF/gH2CgHx9gIF9fHx9fXx8e3x8e3t7fHt8fHx9fIiJh4eFhoWFhISDgYKBg4KAgIGCg4KCgoOCgoKCgoGCgoGBg4J/gIGAf39/fn5+fn57e3p8fHt2e3R3f352cnt+fnt4dXd8gIGCgoKBgoODg4OCgoSDhIOFhoOCgX9/gIOAgICAg4F+foCAfX+AfX1+foCAf4J/gYGAgICBf31/f3+AgIGAgIB/fnx9fX19fn59g32AfoKAfX6BgX98fn59fX17fH58fXx8fHt8e3x9iIWGhIWHhYSFhIKBgoGDgYCAgoKDgoKCg4ODg4KBgYGBgYGCgH6AgYB/fn5+fn5+fn56e3p9goN9dXF6fHpxen19eXh0dICAgoKCg4KDhYOEg4KDhISEhIWEgYGAgH6Agn9+f36Bf35/f4B9foB9fX1+gH9/gYCCgYCAgIKBfX6Af4GAf4CAgH9+fX19fn1+fn19gYR/gH9+f4GBf32Af319fn1+fn1+fHt8enx7eoCFgoOEhYSEhIWDgoKBgYKBgICCgoOCgoOEg4SDg4KCgYKBgYOAf4CBf35+fn5+fX5+fnt7en6Jh354cnl9f3F6eHt4eXR1fYKDgoODg4OFhIWEg4OEhIODhIKBgH+Af4CBfn19foB+fn5/gH19f3x9fX6Af4CAgIKAgIGAg4F/f4B+gIF+gIGAgH9+fn5+fn1/fn6FhYCBgH+Ag4F/foGAf36AfoB/fn17ent6fHt6goN/goKCgoOCg4KBgYCAgoGAgIKBg4KBg4SDhIKEgoGBgoGCgoB+gIF/fn1+fn5+fX59fXp7fIWEe3tyeXt8cHd1dnd5dnR6hISBhISDhIWFhoSDg4WEgoODgoCBf4B/f4B9fX1+f31+f39/fn1+fH19foF/gIB/gIB/gIGDgoGAf36AgH+AgYCBgH9/f39/f4CAgIGCgoKBf4GEgX+Ag4F/f4B/gX+Af3x7e3p8e3yBgH+Bf3+BgYGCgYF/f3+BgH6BgoKDgYGDg4KEgoSCgYGBgIGCgH6AgH9/fX5+fX19fn19e3t6gH94fHZ5enxxdHh3dnh1cnmFhYKFhIKEhYWGhISChIOBg4KAgIF+f4B/gHx9fX6AfX5/f39+fX98fn5+gX+Bf39+f4B/gIODg4B/f4GBgIKBgYGAgIGAgICAgIGAgYKDgYF/gISBfYGDhICAgX+BgYKBfXp7e3x8fX99f4B8f399fYGAgH59fYB/foGBgYKBgIKCgoKBg4KCgYB/gYKAfn9/fn99fX1+fX19fX19ent7fHZ9eXh6enJ1eXl2d3dzdYaFg4WFgoSEhYSEhIKDgoGDgX+AgX5/gH6AfX19fn9+f4B+fn99f3x/f3+BgIF/f3x+gH6AgYKDgYCAgoOEgoGAgYB/gYCAgYGAgYGCg4KBgX9/g4B+goKEgICCgYKChIJ+e3t8fHx9fX1+fXp+fX15fn9/fHx8fn1+gYCBgYGAgoGBgYGDgoGBf4CAgoB9fn19f319fX59fH19fX16e3p8dnx6d3t4cnZ5e3Z2dnN0hoSEhYWBhISFhIOCgYOBgYOBgIGBfX+BfoF9fX1/f39/gH5+fn19fYB/gIGBgX9+fH6Afn9/gYJ/gYGCg4eFgYB/fn6Af4CBgICAgIGCgYCAfoCCf3+BgoKBgYOCg4OFgn99fX18e3x8eXp7en55e3l4f357e3t+fX1/f4F/gH6BgICAgoOCgYF/gIGBf31+fH1+fX19fX18fn58fXx5e3x4enx3endzeHd6c3Z2c3SGhISFg4KDhISDgoGCg4GCgoGAgYF8gH9+gH1+fX5/gICAf35/fnx+f3+BgIGAf359f39+fn+BgH2AgIGDhIN/f359fn5+f4B/gIB/gYKBgH9+f4F+f4CCgoCBhIKEhIaEgH59fHx8fHp5dnl5enl2eXZ+fHt7e359e399gH99fX9/f3+BgoGBgX5/gYF+fX18fX19fX19fXx+jYF8fXl7e3p5fHd4eHR1dXhyd3d0doaEhIWDg4ODgoOCgYKDgoGDgn+BgH9/fn+Afn19fH+AgIB/f4B/fIB/f4GAgYCAf3yAf35+fn9/fX5+gIGCgn5/fn1+fn5+f3+Af32AgYB+fn5/gX5+gIKBf4GDgoOEh4SAgH58fXx8e3x1eXl4eHh5d3t8e3p7foZ9fn1/ent+fn59foGAgIGAfX6BgH59fXx9fX19fX18e32Dgnx8ent7e3p7d3Z4dXJzdnF3eXJ4hYWFhYOEhIKCg4KBgYKBgIOBgIB/fn5+foB+fX58f4CAgH+AgX97gH6AgH+BgYB/fYB/fn5/f319fX6AgYKBfn9+fn59fX1/fn9+fH6Af35+fn+Cfn6AgIF/gYOCg4OGhICBfnx9fHx7fHh3e3h1eXd3eXx6e3t9kod9fH13en1+fn19f35+gH98foB/fn19fH19fX19fXt8ent9enp4e3x6ent4dHh1cXJ0cHh4cXmEhYWFg4SDgoODgoGBgoKAgYCAgIB9fn5/gH18fn1/gIGAf3+BgHyAf4B+f4GAf399gH9+f39+fX18gICAgIB+f35+fn18fn9+f358fYB/fn1+gIJ/foCAf36Bg4KCg4WFgoJ+fX17e3x8eXd7eXd4d3d4e3t6e3yFin17end6fH19fHx9fX1/fnx9fn59fXx8fX5+fX18fHt6enx7e3p5enp7enhzd3VxcXNweHdxe4WGhYWDhYKBg4OBgYGBgoCBgICBgH5/fn9/fXx+fYCAgoGAf4GAfX6Af35/gX+Af3+BgH+Af31+fH1/gICAgH9/f35/fnx+f39/f319f399fn6CgYF/gIB/foGDgoKEg4SCgn5+fHx6fHt7eHp6d3N2d3h5e3p7eXp/fnt7d3p8fXx8fH59fH19fH19fXx8fX19fX99fXx9e3l7fHx8enp6enp6eHN2dXBwcm93dnJ7hYeEhYOEgoGDgoKCgYGCgYKAgYGAf4B/f399fX9+f4CBgYF/goF9foF+fn+Af4B/gIKAgIB+fX58f3+BgICAf4B/f4B+fX5+f4B/f39/gH9/f4J/gH9/gIB/gYGAgISBgoKAf39+f3x9fn56fYR9dHx9enp6enx5eXp6hoV3eXx8fHx8fXt8fHx8fX19fHx9fX19fn19fX16eX18fH16enp6enp5c3V1b29xb3d0c3yFhoOEgoOCgYKBgoKCgYKBgoCBgYCAgICAgH59gH+Af4GCgn+CgX+AgX5/gYB/gICAgn+Bf319f35/f4KAgICAgIB/gIB+fn1/gH9/f4B/f39/gH+AgICAgH+AgIGBgYGCgYCAf39/fn1/fnqBkYt6fH18e315e3p6eHmBgXh5e3x8fXx8e3x8fHx9fX18fH18fn1+fn59fHp8fHt8fXt5enp6eXlzdXVvb3Fwd3N0fYWHg4OCg4KAgYCCgoGAgYGBgYKBgYCAgIGAfn6Af4GAgYKCgIKCgICCfoCBgX9/gX+BgIF/fH6Af3+AgoCAgICAf3+AgH5/fX6Afn2AgH9/f3+AgICAgYCAf4CAgYCBgYKCgICAf39/fX5/fIGGiHx8fnt7fnl6e3p7jX53d3l7fHt9fHx8fHt9fH18fX18fXx+fn5/f358enx9e319e3l6e3p5eXN0dW5zcXB4cnV6hYaDg4KDgoCAgIGBgX+CgYKBgoGBgYKAgYF/fn9/gYGCgYKBg4OAgYJ/gYGBf4CAgIB/gX99f4F/gICBgICAf4B+gICAf359f4B+fn+Af39/gH9/gICBf4CBgH+BgIGCgoKAgICAgIB9foB9gIOCe35+e3x9e3p8fHuHeXh4eXx8fH17fHx9fX18fH19fn19fX5+f3+Af317fH18fHx7enl7e3l5c3J1bnZycHhxdXaFhYOEg4KCgICAgoF/gIKCgoKDgYGDgoCCgYB/gICCgoKBg4GEhICBgX6BgoF/gICAgH+Cf36AgYCCgICAgIB/gH+AgIB/fn2Af39/f4GAgH+AgH+AgYF/gICAgIGAgYGBgoGAgYCAgH9/gH5/fX59fn57fXx9e3x8d3h1eHh5e3x8fXx8fHx8fX5/f39/fn19fn9/gIGAf3x9fHx9e3p7eXp8eHpzcnVud3FxenF2d4WFg4SDg4KBgYKDgH+CgYWDg4SBgYOBgoKCgYB/gIKDgoCCgoWDf4CAfoKDgICBgICAf4CAf4GBgIKAf4CBgH9+gICAgICAf4CAgH+AgICAgIB/f4CBgYCAgICAgYGAgoKCgoCCgYGCgYB/f4B/gId+fnx6fXx7fX54d3Z5eXl8fX18fXt8fH19fn5/gIGAfn1+gICAgoGAfH59fX58d3t6ent5eXNxdW53cHV6cXZ5hYWCg4KDg4KDhISAgIKBhoODg4GChICEg4KCgH+CgoSBgYKChIJ/gIB/gYOCgYGBgYCAf4GBgYGAg4F+gIOCf31/goGAgIB+gYCBf4CAgYGBgYCAgIKCgYKBgYCBgYGBgoOCgoOBg4OCgYCBgH+AhH19fXx/fXp9gHp5dnp4eXt7fH19e3x9fX19fn+AgYGAgH+AgICDg4B9f35+fn15eXt6enp5c3J1b3dxd3lzd3uFgoKDgoOEgoOEg4CAgoOGg4ODgoKEgYSDgYKAgIKBg4GCgoGCgX6BgICCgYKBgYOBgICAgICBgoGEgH6Bg4F+f4CDgoCBfoCCg4KAgYGBgoKDgoGBg4KChIGAgYOBgYKEg4OEhIODhIODgYKBgYCCf4B/fYB8enx/e3t3fHl5eXt6fX59fHx8fH1+fn+BgYCAgIGBgYSEgH2Af39/f357e3t6e3p0cHhyeXR2eHR3e4SCg4KDg4SChIODgYKChIaEgoODgoSBhISAg4CBg4KCgoKCgIKAfoGAgIKBgoGCgoKBgIGBgYOCgoOAfoGDgX5/gYSEgYN/goKBg4KCgoGDg4OEgYKEgoOCgoGCgoOBg4SDhISEhISFg4SCgYOCgoOBgYGAgH58fIB8fHh8eXp5enx9f3x7fHx9fX18fICAgICAgYGBgYKBfoGAgICAf3t7e3p6enVweHd5dnV8dXZ8gICDgoODg4OEhISAgoKFhISDg4KDhIGEhYKCgYKDg4GCgoKAgYB9gICBgYKDgoKCgoGAgYKCg4KCg4B/gYOBf4CChIODgoGCgoGDgoKDg4SDg4SAgoSDg4OBgX+Bg4KDhYKEhISEhISDhISChIOEhIKBgoGBgHt+gX59eXx6enp9fHyBfXp8fH19fHp7fn5+gH9/gYGAgICAgIGBgIB/fX18fH18dnJ2eHh2dH52dX2Hh4OChIWDg4SFhICChIWEhIOCg4SEgISFg4KCgoODgoOCgoCCgH2AgIGCg4KCgoKEgoGCgoOEgoKBgICBg4F/gYOFhIOCg4CCgoOCg4ODhIOEg4CCg4KEg4KCfoOBgoSEgoODhISEhIOEhIOEg4WEg4ODgoKAe4CBf3x8fXp6e31/fX9/fHx6fH59fH19fn5/f39/gICAgH9+foCBgICAfnx9fX5/fn18e3h2f3Z2f4SHg4KDhYODhIaEgYKFhoWEhIODhISChIWFgoKDg4SCg4KDgoKBfoCAgoKDgoODg4SCgYKCg4OCg4GBgYGDgX6BhISDg4KEf4GEg4ODgoSDg4SCgIOEg4SDg4KCg4KChIOCg4SEhISEhIWEg4OEhYSEhIOBgoB9gYJ/fXx8e3x8gH19foB+fn1/fnx8fH19fn5/fn+BgYGBgH99fX6BgYB+fn19fX59fX5+f3+AfHyAgYKCg4OGg4SDhoSBgoiHhYSDg4SEhYKEhYWDg4SDhIODgoOCg4F+gYGDg4SCg4OEhIOCg4KEg4ODgoKDgoOBf4GEg4ODgoN/gYWDg4ODhIODhIOAgoSEhYOCgoODg4GEg4GDg4SDhISEhYSEhIWFhYWEg4ODf32BhH99fXx8fHx/gX59fn9/fX99e3x9fX19fX5+f4CBgIGBgH59fH6Cf39+fn5+fX1/f39/gICAf4CEhIODhIWDhIOFf36CiouFhISDgoOFgYaGhoOEhISEhIODg4OEgn+BgYODhYSFhIWEg4KEhISFhIODgoSDhYGBg4SFhYaEgoCDh4SDg4OFhIWFhIGEg4OHgoOCg4GCgYSDgoODhYODhYWEhYWHh4aHhYSEhYSBf4GDf35+fH59fX+BgH9+fHx+f358enx9fX19fX5+fn9/gIGBf319fIB/gH5+fn5+f3+AgYGBgYKAgYWFhIOFhIKEg4aAgoWFi4mEhIOEhYWDh4aGhISEhIWEhISEg4SEgYKDg4OEhIaEhYSDg4SEg3yDhHuBhHd5g4F9hH5+cnWDgoF2foOFgX2BdYF5g39/gH6EhIKDg4KBg4SDg4SFg4SFhoSFhn2EeXx+f4R7hYOAhIOAf359fn19gYOBfXt/fX6Afn18fHx9fX19fH19f4B/gYJ/fX18f4GBgICAgH+BgYGCgYKDg4KChoSEhIaEgYOEhYOEhYSKiIWFhYOFhYSGhoaDhISFhYWEhYWEhIWCgoOEhYWFhoSFhIOEhYWCaICFanx7cXF8gXOGc3R0fYKEdXNxg4Z0cHVyc3SDdnt9dYF/goOAgnZ5hYCDgIR/hYSChYWCaHpyc3N8gHOBg3+Dg32BfX1+fX6Cg4F8f4F9foB9fXx8fHx9fHx8fn1+gH+BgX99fX2AgYKBgYGBgIGBgYKBgoKCgoSHhIWEhYSBgoSGhoOFg4aIhoaFg4aGh4eGh4OFhYaFhIKFhoSFhYOCg4SEhoaGhIaEg4SFhn1xe4FweXZ+g3+CbnlwdXN8dnp5hXKEg3B2eHF2dHR1cnN0dml/gG5yb3R2bnVsd217c26AiHltfXJzdnN2bW14bHB5bHV9f359foGAgX2Afn2Af4B/fX18fHx9fH1+f32Af4CAfnx/foCBgoCBgICAgYCAgIKDgoOEhYiGhoCChYODhIeGg4WFhYaHh4SDhoeIiYaHhIWGiIiFg4WGhYWEhIOFhIKFhoaFhoWEhoWHdnB0e3BydX+HhYNtdW92b3x1coR5eYd4cXR3bndod3pucHaCcoN+b3p5eW1vbnpvb213fXiGcHF6cHJ0ZoF1fm57eXNveX+Af319gX9/fH99fIB+gIB+foCAgYB+fn9/foF/gH9+fYB9f4CBgIB+fn+BgH9/goOCgoSFh4eEfoeEg4OFh4aEhoWFhoaIhISGh4iIhoeEhoaLiYWEhoeHhYOFhYWEgoWFhYWGhoWGhYZxdXByc29zenl+hHSIdHV+iHZugnKEhnluanJ/cW1zd3x/dXR8hH54cXV3bnl1enF2eHV6eYRxam95eHBreXN6b3p3dnZwgYB/fn5/f356fn19f31/f359gIGDg4CCg4GBhIKBgIGBgH1/f4F+f35+f4GAfn6BgoCAgYSHhoODhoSEhYaHhoWFhYWGhoiFhIaFh4aFhoSGhomIhYSJioiFhIaGhYWDhYWEhYaGhoaFg3iLeXKIentwcIWEeIV4eWtzfnl7a3KDh4N6fG17eXl0fYB2bm+AgG90fHV3cXl9fW1+dW+DhYZ6gHJye3x0cG96a3N8bneCgIF+fn99fXt9e3x9fX9/fn1/f4KCf4GDgYGDgYB/gICAfn9+f31/fn1/gH58fYGAfn6Ag4iFhoOFhYWFhoeFhYWFhYeHiIaEhoWHhoaFhIWFhIWFhomJh4aEhoWGhoWGhoSGhoeGhoWGh4eHhoaEhoWGh4iHhYeGhoOHhoWFg4SGhoWGhIaEg4SEhoSEgYSDhISFhIWEhYSGg4aHhYaEhIWHhoSEhYWEhX13hYOEhIOCgX1/fnt8e357fHx9f359fH5+gYB9f4F/f4GAfn5+gH5+f35+fX99fX5/fHt8f358fH+BiYaFhIaGhoWHhoWFhYWGhoeIhoSGhYaGhYWDhIWGhYSGhoaGhYWGhIWGhoaGhYaGh4eGhYeIiIiIhoSHhYaHiIaFiIeIhYeGhoiFhYaGhYaGhYOChYWGhYWDhISEhIWEhYWEhYWEhoeGhoWEhoeGhISFhoOFhIKEg4OFg4OCfYB/e3t8fXt8fH1/fnx8fn2Af31+gH5+gH99fXyAfX5+fn5+f3x9fX57fHx/fHt7fn+Ih4SEiIaGhoeGhYWEhoaGhoiHhIWGh4aFhIODhIaFhIeFhYaFhYaEhYaGh4eFh4aJiIaGiIeIiYiFhIiFhoeGh4aIhoeFh4eGh4WFhoeFh4aFgoOFhoaEhIOEhIOEhoSFhYWGhoSGhoWGhYSGhoWEg4WFgoWHhYOCgoWDhIF+gIB8e319e3x7fX59fHx+fX5+fH9+fX1+fn19fH98fn58fYGAfHx8fXx8fH56e3t9foiHgoWIh4eGhoaGhISGhoeGiIaDhISGhoSFh4OEhYSFh4SFhoaFhoSGhoeHhoaIh4mIhoaIh4iKiIWHiIWHh4aHhoeGh4WIiIeHhYaGh4WHh4WBhISFhoWFhISEg4SFhYaGhoWGhIeGhoeFhYaGhYSDhIOChIeDhIGChISDgYCAgHt7fn17fHx9fXx8fH19fH18fn18fX18fHx9fXx+fXt8gX99fH18fnx8fHp6fHx9iIeChoiHhoeGhoaEhYaFhoaGhYOFhIaFhIiJg4GEg4SGhIaGhoaGhIeHiIiHh4eIioiGh4iHiImIhYiHhYeGhoeHh4WHhoiIh4eFh4eHhYaHhIKEg4SGhYeFhYSDhISFhoaGhoaGh4WFh4WGhYaFhIKDgoODh4GDgIKDg4KCgn+Ae3x+fnx8fH59fH19fH17fHx8fHx8fXt7e318e358e3x/fX18fX1/fXx6ent7fHyIh4KGhoaGh4aGhYSFhoWFhYWEg4WChoSDiId/enqChYaEhoaFh4aEh4eJiIiHhoiKh4aHh4aIiYeFiIeGiIeGhoeHhYeGiIiHhoWHhoeGhoeDg4SEg4aGh4WFhISEhYaGhoaGhYeHhoaHhoaEhoWDg4KCgoOGgYN+goKDgIODf398f35+fHx9f318fX18fXp7e3p7fHx8e3t7fnt7fXt7e358fHx8fX5/fXt6fHp8fYmHg4aFhoWGhoWFhIWFhYWFhIOBhYGGhIKEhHyAhn+ChYWGhYWGhYSHh4iIiIaFiIqHhYeGh4eIh4WIhYaHiIaGh4eGh4aIiIeFhoeGh4WFh4OEhoWEhoaHhoWFg4WFhoaGhoeFh4aHhoeHhYSFhYOBgoGAg4WCg36BgYF/g4F+f35/fX98fH1/fXt9fXx9enp7eXt8fXt7e3t+fHx8fHp7fXx8fHx+fYF8e3t7e3x7iYeEhoSGhIaGhYSFhoWEhIOEgoCDgYWDgYJ/eoSMe4CEhYeGhoaFhIeIh4aHhYWHiYeEh4WHhoiGhYeEhoeIhoaIiIeHhoeIhoSGhoaHhoWHg4SFhIaGhoeFhYSDhYWHhYeGh4WGhoaFhoaEg4SFgYCBgYCDg4OCfYGBgH6DgX5/f4B8f3x9fX59e359fH15enp5e319enp7e318fXx8ent9fHx9fH5+gHx7e3x+fXyIh4WGhYaEhoWFhYWFhYODgYOBgIKBhYKAgH9/fXx7gYSFhoaEhYSDh4eGhoaFhIaJhoKGhIaGhoWFh4aHiImGhYiHiYeGhoeFhIaFhYaFhYeDhIWEiIaGh4WFhIKGhYaFh4aHhIaGhoWFhoODg4WAf4GAgIOBg4B8gYB+foKAfYB/gXx/fH1+fX57fn18fHl5enl6fX15enp7fHt8e3t6e319fH18fn5+fHt7fX59fIiGhYaGhoSFhYSFhYSDgoKAgoGAgICDgX5+foB5en2Ag4SFh4WEg4OHhoOEhYSChYiFgoSDg4WFhYWHh4eIiIWFiIeJh4aFhoWDhoSFh4OEhoSEhYSHhoWGhYaEg4aFhoaGhoaEhYaHhYWGgoKDhH9+gICAgYCDgHuBf31+gn5+gH6Afn99fX59f3t/fXt6eXp6eXp8fXl6ent7enx7e3t7fH19fXx/fn18fH1/fnx7iIWFhoaGhoSFhIWDhYKBgICAgYB+f4KCfX1/f3t/f4KDg4WGhYSDgoaDgYOEgoCFh4WCg4GBg4SEhIaGh4eHhYWIhomHhoSEhIKFg4SGgoOFhISGhIeGhYWFhoOEhYSFhoWGhIOFhYaDhYWBgYODf35/gH9/gIN/fIB9fX+CfYCBfn6Bfn19fX1/e398e3p5enp5enp8eXp6e3t7fXp7e3t8fX59fYB9fXx8fYB/fXyGg4aGhoaFg4SChYKFgYGAf3+AgH5/gIJ8fn9/foCAgoKCg4SDgoGChIGAg4KBgISFhYKBf4CCg4OEhYaIhoWEhYeFh4WFgoOCgYOCgoWBg4WEhYaEhoaHhoaFgoSEg4SGhYWDhISDhIOFhICAgoJ/fX1/fn6AhH57f3x8gIF9gYB9fYN8fn59fX57fnt7enl6enl6ent5enp6e3t8ent8fHx+fn1/gXx9fHx9f4B+gIaEhYWEh4SDg4KGgoOAgYB+fn+AfX9/gnx9f39+fn6BgYKDg4KBgYKCf4CBgoCAgoWEgoB/gIGCgYOFhYeGhISGhoSFg4WBgoGBgoGCg4GChISEhYWGh4eGhYSDg4ODhIaFhIGDgoOChIODgH+AgX59fH5+fH+DfXx+fHyBgH6Cf31/gnx/fn18fHx8e3t6eXp6eXt6enp6enp6e3x5e318fH9/f4GAfX59fX1/gICAhoSEhYSFgoOCgoSCgoCBgH59fn9+fn6AfX2Af35+foGBgoODgoSHgYF+gICBf3+ChIOBf35/gIJ/goWEhoSDg4WFgoSBg4CBgIGBgYKBgIGEg4OGhYWHh4WFhYWCgoKDhYSCgYGBgoCFg4F/foB/fnx8fn18foN9e357fYF/gIN+fYCBf35/fXx8fH17e3p5enl5e3l6enl6ent7e3p7fXx8f3+BgoB+gH+AgH+AgYAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfYWFjX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHouYWFjIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX2FhY19zdGVyZW9fMTI4a2Jwc180ODAwMGh6LmFhYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzExMDJkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX2FhY19zdGVyZW9fMTI4a2Jwc180ODAwMGh6LmFhYwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfYWFjX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHouaW5mbyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9hYWNfc3RlcmVvXzEyOGticHNfNDgwMDBoei5pbmZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmY2RhMGIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfYWFjX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHouaW5mbwpAQCAtMCwwICsxLDQ2OSBAQAorNSAzMiAwCis1IDMyIDAKKzMzNyAxIDAKKzMyMiAxIDIxMzMzCisyNzkgMSA0MjY2NgorMjgwIDEgNjQwMDAKKzI4MyAxIDg1MzMzCiszMTcgMSAxMDY2NjYKKzMxOCAxIDEyODAwMAorMzIxIDEgMTQ5MzMzCiszMTMgMSAxNzA2NjYKKzMxMiAxIDE5MjAwMAorMzE3IDEgMjEzMzMzCiszMzAgMSAyMzQ2NjYKKzM1MCAxIDI1NjAwMAorMzU1IDEgMjc3MzMzCiszMzMgMSAyOTg2NjYKKzMyNSAxIDMyMDAwMAorMzc2IDEgMzQxMzMzCiszMzUgMSAzNjI2NjYKKzM1MSAxIDM4NDAwMAorMzUwIDEgNDA1MzMzCiszMzkgMSA0MjY2NjYKKzMyOSAxIDQ0ODAwMAorMzUwIDEgNDY5MzMzCiszMzAgMSA0OTA2NjYKKzM1OSAxIDUxMjAwMAorMzE2IDEgNTMzMzMzCiszNDUgMSA1NTQ2NjYKKzM1NyAxIDU3NjAwMAorMzI1IDEgNTk3MzMzCiszMzYgMSA2MTg2NjYKKzMzOSAxIDY0MDAwMAorMzEyIDEgNjYxMzMzCiszNTAgMSA2ODI2NjYKKzMzOCAxIDcwNDAwMAorMzUzIDEgNzI1MzMzCiszNDAgMSA3NDY2NjYKKzMzMiAxIDc2ODAwMAorMzQwIDEgNzg5MzMzCiszMzkgMSA4MTA2NjYKKzMzMyAxIDgzMjAwMAorMzMzIDEgODUzMzMzCiszNDUgMSA4NzQ2NjYKKzM0MCAxIDg5NjAwMAorMzQzIDEgOTE3MzMzCiszMzUgMSA5Mzg2NjYKKzMzOSAxIDk2MDAwMAorMzQyIDEgOTgxMzMzCiszNDggMSAxMDAyNjY2CiszNTAgMSAxMDI0MDAwCiszNTEgMSAxMDQ1MzMzCiszNDIgMSAxMDY2NjY2CiszNjYgMSAxMDg4MDAwCiszNDAgMSAxMTA5MzMzCiszNTQgMSAxMTMwNjY2CiszNDAgMSAxMTUyMDAwCiszMzQgMSAxMTczMzMzCiszMzggMSAxMTk0NjY2CiszNDAgMSAxMjE2MDAwCiszNTEgMSAxMjM3MzMzCiszNDYgMSAxMjU4NjY2CiszMzEgMSAxMjgwMDAwCiszMjEgMSAxMzAxMzMzCiszNDMgMSAxMzIyNjY2CiszNDIgMSAxMzQ0MDAwCiszNDUgMSAxMzY1MzMzCiszMjYgMSAxMzg2NjY2CiszNDIgMSAxNDA4MDAwCiszNTYgMSAxNDI5MzMzCiszNTEgMSAxNDUwNjY2CiszNDMgMSAxNDcyMDAwCiszNDcgMSAxNDkzMzMzCiszNDkgMSAxNTE0NjY2CiszNTAgMSAxNTM2MDAwCiszMzAgMSAxNTU3MzMzCiszNDEgMSAxNTc4NjY2CiszNDAgMSAxNjAwMDAwCiszMzAgMSAxNjIxMzMzCiszNDAgMSAxNjQyNjY2CiszMzUgMSAxNjY0MDAwCiszNDQgMSAxNjg1MzMzCiszNTkgMSAxNzA2NjY2CiszMzcgMSAxNzI4MDAwCiszNDYgMSAxNzQ5MzMzCiszMzAgMSAxNzcwNjY2CiszNTEgMSAxNzkyMDAwCiszNTUgMSAxODEzMzMzCiszNTIgMSAxODM0NjY2CiszMjUgMSAxODU2MDAwCiszNDIgMSAxODc3MzMzCiszMjcgMSAxODk4NjY2CiszNDkgMSAxOTIwMDAwCiszMjYgMSAxOTQxMzMzCiszMzcgMSAxOTYyNjY2CiszNzggMSAxOTg0MDAwCiszMjEgMSAyMDA1MzMzCiszMTkgMSAyMDI2NjY2CiszNDYgMSAyMDQ4MDAwCiszNTIgMSAyMDY5MzMzCiszNDkgMSAyMDkwNjY2CiszMzEgMSAyMTEyMDAwCiszMzAgMSAyMTMzMzMzCiszMjkgMSAyMTU0NjY2CiszMzMgMSAyMTc2MDAwCiszNjcgMSAyMTk3MzMzCiszNjIgMSAyMjE4NjY2CiszMzcgMSAyMjQwMDAwCiszMzcgMSAyMjYxMzMzCiszNjAgMSAyMjgyNjY2CiszMzMgMSAyMzA0MDAwCiszMTcgMSAyMzI1MzMzCiszNDQgMSAyMzQ2NjY2CiszMzUgMSAyMzY4MDAwCiszMzcgMSAyMzg5MzMzCiszNDkgMSAyNDEwNjY2CiszMzYgMSAyNDMyMDAwCiszNDggMSAyNDUzMzMzCiszNDkgMSAyNDc0NjY2CiszNDIgMSAyNDk2MDAwCiszNTkgMSAyNTE3MzMzCiszNDAgMSAyNTM4NjY2CiszNDAgMSAyNTYwMDAwCiszNDggMSAyNTgxMzMzCiszMzQgMSAyNjAyNjY2CiszMjggMSAyNjI0MDAwCiszNDEgMSAyNjQ1MzMzCiszMzkgMSAyNjY2NjY2CiszMzcgMSAyNjg4MDAwCiszNTAgMSAyNzA5MzMzCiszMjYgMSAyNzMwNjY2CiszNjAgMSAyNzUyMDAwCiszNDQgMSAyNzczMzMzCiszNDAgMSAyNzk0NjY2CiszNDMgMSAyODE2MDAwCiszNjEgMSAyODM3MzMzCiszMjkgMSAyODU4NjY2CiszNDUgMSAyODgwMDAwCiszNDUgMSAyOTAxMzMzCiszMzAgMSAyOTIyNjY2CiszNDIgMSAyOTQ0MDAwCiszNDQgMSAyOTY1MzMzCiszMzAgMSAyOTg2NjY2CiszMjkgMSAzMDA4MDAwCiszMzUgMSAzMDI5MzMzCiszNjYgMSAzMDUwNjY2CiszMjggMSAzMDcyMDAwCiszNDkgMSAzMDkzMzMzCiszMzkgMSAzMTE0NjY2CiszNDAgMSAzMTM2MDAwCiszMzUgMSAzMTU3MzMzCiszMjcgMSAzMTc4NjY2CiszNDggMSAzMjAwMDAwCiszMzkgMSAzMjIxMzMzCiszMzQgMSAzMjQyNjY2CiszNTAgMSAzMjY0MDAwCiszMjUgMSAzMjg1MzMzCiszNjEgMSAzMzA2NjY2CiszMzggMSAzMzI4MDAwCiszNTAgMSAzMzQ5MzMzCiszNTMgMSAzMzcwNjY2CiszMjcgMSAzMzkyMDAwCiszNDYgMSAzNDEzMzMzCiszNDggMSAzNDM0NjY2CiszMzkgMSAzNDU2MDAwCiszNDIgMSAzNDc3MzMzCiszMzQgMSAzNDk4NjY2CiszNTAgMSAzNTIwMDAwCiszNTQgMSAzNTQxMzMzCiszNjMgMSAzNTYyNjY2CiszMjIgMSAzNTg0MDAwCiszMzcgMSAzNjA1MzMzCiszNTUgMSAzNjI2NjY2CiszMjkgMSAzNjQ4MDAwCiszMjQgMSAzNjY5MzMzCiszMzggMSAzNjkwNjY2CiszNTYgMSAzNzEyMDAwCiszMzAgMSAzNzMzMzMzCiszMjEgMSAzNzU0NjY2CiszMzcgMSAzNzc2MDAwCiszNDUgMSAzNzk3MzMzCiszMzUgMSAzODE4NjY2CiszNDggMSAzODQwMDAwCiszNDIgMSAzODYxMzMzCiszNDggMSAzODgyNjY2CiszMzUgMSAzOTA0MDAwCiszNDQgMSAzOTI1MzMzCiszNTcgMSAzOTQ2NjY2CiszNjggMSAzOTY4MDAwCiszMjQgMSAzOTg5MzMzCiszNDMgMSA0MDEwNjY2CiszNDEgMSA0MDMyMDAwCiszMjkgMSA0MDUzMzMzCiszNTYgMSA0MDc0NjY2CiszMTcgMSA0MDk2MDAwCiszNTEgMSA0MTE3MzMzCiszNDAgMSA0MTM4NjY2CiszNDAgMSA0MTYwMDAwCiszMzIgMSA0MTgxMzMzCiszNTUgMSA0MjAyNjY2CiszNTcgMSA0MjI0MDAwCiszMjcgMSA0MjQ1MzMzCiszMzggMSA0MjY2NjY2CiszMjMgMSA0Mjg4MDAwCiszNDYgMSA0MzA5MzMzCiszNTIgMSA0MzMwNjY2CiszNDcgMSA0MzUyMDAwCiszNDMgMSA0MzczMzMzCiszMTEgMSA0Mzk0NjY2CiszMzggMSA0NDE2MDAwCiszNjUgMSA0NDM3MzMzCiszNDkgMSA0NDU4NjY2CiszMjcgMSA0NDgwMDAwCiszNTUgMSA0NTAxMzMzCiszMTkgMSA0NTIyNjY2CiszNDkgMSA0NTQ0MDAwCiszNTEgMSA0NTY1MzMzCiszMzcgMSA0NTg2NjY2CiszNDAgMSA0NjA4MDAwCiszNDkgMSA0NjI5MzMzCiszMTYgMSA0NjUwNjY2CiszNDQgMSA0NjcyMDAwCiszMzQgMSA0NjkzMzMzCiszNDQgMSA0NzE0NjY2CiszNDcgMSA0NzM2MDAwCiszNDggMSA0NzU3MzMzCiszMzQgMSA0Nzc4NjY2CiszMzggMSA0ODAwMDAwCiszMzEgMSA0ODIxMzMzCiszNDQgMSA0ODQyNjY2CiszNDIgMSA0ODY0MDAwCiszMzYgMSA0ODg1MzMzCiszMjYgMSA0OTA2NjY2CiszNjQgMSA0OTI4MDAwCiszNTAgMSA0OTQ5MzMzCiszNTAgMSA0OTcwNjY2CiszNjMgMSA0OTkyMDAwCiszNTggMSA1MDEzMzMzCiszMDUgMSA1MDM0NjY2CiszNDQgMSA1MDU2MDAwCiszNDYgMSA1MDc3MzMzCiszNDIgMSA1MDk4NjY2CiszMzAgMSA1MTIwMDAwCiszMTggMSA1MTQxMzMzCiszNjEgMSA1MTYyNjY2CiszNTQgMSA1MTg0MDAwCiszMTMgMSA1MjA1MzMzCiszMzAgMSA1MjI2NjY2CiszNTAgMSA1MjQ4MDAwCiszNDcgMSA1MjY5MzMzCiszNDYgMSA1MjkwNjY2CiszNTcgMSA1MzEyMDAwCiszMjUgMSA1MzMzMzMzCiszMzUgMSA1MzU0NjY2CiszMzEgMSA1Mzc2MDAwCiszNjYgMSA1Mzk3MzMzCiszMjkgMSA1NDE4NjY2CiszNDkgMSA1NDQwMDAwCiszNzEgMSA1NDYxMzMzCiszMjYgMSA1NDgyNjY2CiszMzMgMSA1NTA0MDAwCiszMTkgMSA1NTI1MzMzCiszMjcgMSA1NTQ2NjY2CiszNTMgMSA1NTY4MDAwCiszNTYgMSA1NTg5MzMzCiszNDggMSA1NjEwNjY2CiszMzggMSA1NjMyMDAwCiszMzEgMSA1NjUzMzMzCiszNDEgMSA1Njc0NjY2CiszNjIgMSA1Njk2MDAwCiszMjYgMSA1NzE3MzMzCiszNTkgMSA1NzM4NjY2CiszMTUgMSA1NzYwMDAwCiszNzYgMSA1NzgxMzMzCiszNDMgMSA1ODAyNjY2CiszNTQgMSA1ODI0MDAwCiszNTMgMSA1ODQ1MzMzCiszNDQgMSA1ODY2NjY2CiszMzQgMSA1ODg4MDAwCiszNDUgMSA1OTA5MzMzCiszNTUgMSA1OTMwNjY2CiszMjIgMSA1OTUyMDAwCiszMzQgMSA1OTczMzMzCiszNTMgMSA1OTk0NjY2CiszMzggMSA2MDE2MDAwCiszNTEgMSA2MDM3MzMzCiszMzQgMSA2MDU4NjY2CiszMzkgMSA2MDgwMDAwCiszNDUgMSA2MTAxMzMzCiszNDcgMSA2MTIyNjY2CiszNTUgMSA2MTQ0MDAwCiszMTIgMSA2MTY1MzMzCiszNTIgMSA2MTg2NjY2CiszNTQgMSA2MjA4MDAwCiszMTggMSA2MjI5MzMzCiszNDQgMSA2MjUwNjY2CiszNjMgMSA2MjcyMDAwCiszMjEgMSA2MjkzMzMzCiszMzkgMSA2MzE0NjY2CiszNTYgMSA2MzM2MDAwCiszMzQgMSA2MzU3MzMzCiszNTQgMSA2Mzc4NjY2CiszMjUgMSA2NDAwMDAwCiszMjEgMSA2NDIxMzMzCiszNDEgMSA2NDQyNjY2CiszMzcgMSA2NDY0MDAwCiszNTEgMSA2NDg1MzMzCiszNDMgMSA2NTA2NjY2CiszNDEgMSA2NTI4MDAwCiszNDQgMSA2NTQ5MzMzCiszNDEgMSA2NTcwNjY2CiszNjQgMSA2NTkyMDAwCiszMTkgMSA2NjEzMzMzCiszNDggMSA2NjM0NjY2CiszMzIgMSA2NjU2MDAwCiszMzMgMSA2Njc3MzMzCiszNDMgMSA2Njk4NjY2CiszNDggMSA2NzIwMDAwCiszNDcgMSA2NzQxMzMzCiszNTAgMSA2NzYyNjY2CiszNDIgMSA2Nzg0MDAwCiszNDEgMSA2ODA1MzMzCiszMjYgMSA2ODI2NjY2CiszNTEgMSA2ODQ4MDAwCiszMjkgMSA2ODY5MzMzCiszMjMgMSA2ODkwNjY2CiszNTAgMSA2OTEyMDAwCiszNjEgMSA2OTMzMzMzCiszMjYgMSA2OTU0NjY2CiszNDUgMSA2OTc2MDAwCiszNDUgMSA2OTk3MzMzCiszMTEgMSA3MDE4NjY2CiszNDkgMSA3MDQwMDAwCiszNTggMSA3MDYxMzMzCiszNTIgMSA3MDgyNjY2CiszNDcgMSA3MTA0MDAwCiszNjQgMSA3MTI1MzMzCiszMjggMSA3MTQ2NjY2CiszMTggMSA3MTY4MDAwCiszNTEgMSA3MTg5MzMzCiszNDAgMSA3MjEwNjY2CiszNDEgMSA3MjMyMDAwCiszNTUgMSA3MjUzMzMzCiszMzYgMSA3Mjc0NjY2CiszNTIgMSA3Mjk2MDAwCiszNDEgMSA3MzE3MzMzCiszMzQgMSA3MzM4NjY2CiszNDggMSA3MzYwMDAwCiszNDIgMSA3MzgxMzMzCiszMzUgMSA3NDAyNjY2CiszNDIgMSA3NDI0MDAwCiszNTkgMSA3NDQ1MzMzCiszNDkgMSA3NDY2NjY2CiszMjkgMSA3NDg4MDAwCiszNTYgMSA3NTA5MzMzCisyOTIgMSA3NTMwNjY2CiszMTYgMSA3NTUyMDAwCiszMTggMSA3NTczMzMzCiszMjAgMSA3NTk0NjY2CiszNDIgMSA3NjE2MDAwCisyODUgMSA3NjM3MzMzCiszMjYgMSA3NjU4NjY2CiszNTIgMSA3NjgwMDAwCiszOTIgMSA3NzAxMzMzCiszNjQgMSA3NzIyNjY2CiszODQgMSA3NzQ0MDAwCiszMzQgMSA3NzY1MzMzCiszMTcgMSA3Nzg2NjY2CiszMjYgMSA3ODA4MDAwCiszNzMgMSA3ODI5MzMzCiszNTQgMSA3ODUwNjY2CiszMjkgMSA3ODcyMDAwCiszNDcgMSA3ODkzMzMzCiszNTMgMSA3OTE0NjY2CiszMzggMSA3OTM2MDAwCiszMTcgMSA3OTU3MzMzCiszNTQgMSA3OTc4NjY2CiszNDUgMSA4MDAwMDAwCiszNTAgMSA4MDIxMzMzCiszNTEgMSA4MDQyNjY2CiszMzIgMSA4MDY0MDAwCiszNTggMSA4MDg1MzMzCiszMTUgMSA4MTA2NjY2CiszMzYgMSA4MTI4MDAwCiszNTggMSA4MTQ5MzMzCiszNDMgMSA4MTcwNjY2CiszMTkgMSA4MTkyMDAwCiszNzAgMSA4MjEzMzMzCiszNDQgMSA4MjM0NjY2CiszNjEgMSA4MjU2MDAwCiszNDMgMSA4Mjc3MzMzCiszMzcgMSA4Mjk4NjY2CiszNTQgMSA4MzIwMDAwCiszMzIgMSA4MzQxMzMzCiszNDggMSA4MzYyNjY2CiszMjggMSA4Mzg0MDAwCiszNDUgMSA4NDA1MzMzCiszNDAgMSA4NDI2NjY2CiszNDYgMSA4NDQ4MDAwCiszNDEgMSA4NDY5MzMzCiszNDQgMSA4NDkwNjY2CiszNDIgMSA4NTEyMDAwCiszNDEgMSA4NTMzMzMzCiszNDUgMSA4NTU0NjY2CiszMzcgMSA4NTc2MDAwCiszMzUgMSA4NTk3MzMzCiszMzUgMSA4NjE4NjY2CiszNDAgMSA4NjQwMDAwCiszNDUgMSA4NjYxMzMzCiszNDEgMSA4NjgyNjY2CiszNDIgMSA4NzA0MDAwCiszMzggMSA4NzI1MzMzCiszNDMgMSA4NzQ2NjY2CiszMzYgMSA4NzY4MDAwCiszMzggMSA4Nzg5MzMzCiszNTMgMSA4ODEwNjY2CiszMzkgMSA4ODMyMDAwCiszMjkgMSA4ODUzMzMzCiszNDkgMSA4ODc0NjY2CiszMjMgMSA4ODk2MDAwCiszNTEgMSA4OTE3MzMzCiszNTkgMSA4OTM4NjY2CiszNTcgMSA4OTYwMDAwCiszNDEgMSA4OTgxMzMzCiszMzMgMSA5MDAyNjY2CiszMzUgMSA5MDI0MDAwCiszMjggMSA5MDQ1MzMzCiszNDcgMSA5MDY2NjY2CiszNDMgMSA5MDg4MDAwCiszNjkgMSA5MTA5MzMzCiszMzEgMSA5MTMwNjY2CiszNDQgMSA5MTUyMDAwCiszMzAgMSA5MTczMzMzCiszNDYgMSA5MTk0NjY2CiszMzcgMSA5MjE2MDAwCiszNDEgMSA5MjM3MzMzCiszMzggMSA5MjU4NjY2CiszMjkgMSA5MjgwMDAwCiszNjAgMSA5MzAxMzMzCiszMzYgMSA5MzIyNjY2CiszNDEgMSA5MzQ0MDAwCiszNDEgMSA5MzY1MzMzCiszNDUgMSA5Mzg2NjY2CiszNTEgMSA5NDA4MDAwCiszNDkgMSA5NDI5MzMzCiszMzYgMSA5NDUwNjY2CiszMjYgMSA5NDcyMDAwCiszNDkgMSA5NDkzMzMzCiszNDMgMSA5NTE0NjY2CiszNTcgMSA5NTM2MDAwCiszNDIgMSA5NTU3MzMzCiszMjUgMSA5NTc4NjY2CiszNDYgMSA5NjAwMDAwCiszMjYgMSA5NjIxMzMzCis0MDIgMSA5NjQyNjY2CiszMzEgMSA5NjY0MDAwCiszMzkgMSA5Njg1MzMzCiszNzEgMSA5NzA2NjY2CiszMTQgMSA5NzI4MDAwCiszMTAgMSA5NzQ5MzMzCiszNjQgMSA5NzcwNjY2CiszMzggMSA5NzkyMDAwCiszMzkgMSA5ODEzMzMzCiszMzcgMSA5ODM0NjY2CiszNTUgMSA5ODU2MDAwCiszNTEgMSA5ODc3MzMzCiszMzIgMSA5ODk4NjY2CiszMTYgMSA5OTIwMDAwCis0NzQgMSA5OTQxMzMzCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfYW1yd2JfMWNoXzE0a2Jwc18xNjAwMGh6LmFtcndiIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX2FtcndiXzFjaF8xNGticHNfMTYwMDBoei5hbXJ3YgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDgyNTkzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX2FtcndiXzFjaF8xNGticHNfMTYwMDBoei5hbXJ3YgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfYW1yd2JfMWNoXzE0a2Jwc18xNjAwMGh6LmluZm8gYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfYW1yd2JfMWNoXzE0a2Jwc18xNjAwMGh6LmluZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZhNjFkNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9hbXJ3Yl8xY2hfMTRrYnBzXzE2MDAwaHouaW5mbwpAQCAtMCwwICsxLDQ5NCBAQAorNDEgMSAwCis0MSAxIDIwMDAwCis0MSAxIDQwMDAwCis0MSAxIDYwMDAwCis0MSAxIDgwMDAwCis0MSAxIDEwMDAwMAorNDEgMSAxMjAwMDAKKzQxIDEgMTQwMDAwCis0MSAxIDE2MDAwMAorNDEgMSAxODAwMDAKKzQxIDEgMjAwMDAwCis0MSAxIDIyMDAwMAorNDEgMSAyNDAwMDAKKzQxIDEgMjYwMDAwCis0MSAxIDI4MDAwMAorNDEgMSAzMDAwMDAKKzQxIDEgMzIwMDAwCis0MSAxIDM0MDAwMAorNDEgMSAzNjAwMDAKKzQxIDEgMzgwMDAwCis0MSAxIDQwMDAwMAorNDEgMSA0MjAwMDAKKzQxIDEgNDQwMDAwCis0MSAxIDQ2MDAwMAorNDEgMSA0ODAwMDAKKzQxIDEgNTAwMDAwCis0MSAxIDUyMDAwMAorNDEgMSA1NDAwMDAKKzQxIDEgNTYwMDAwCis0MSAxIDU4MDAwMAorNDEgMSA2MDAwMDAKKzQxIDEgNjIwMDAwCis0MSAxIDY0MDAwMAorNDEgMSA2NjAwMDAKKzQxIDEgNjgwMDAwCis0MSAxIDcwMDAwMAorNDEgMSA3MjAwMDAKKzQxIDEgNzQwMDAwCis0MSAxIDc2MDAwMAorNDEgMSA3ODAwMDAKKzQxIDEgODAwMDAwCis0MSAxIDgyMDAwMAorNDEgMSA4NDAwMDAKKzQxIDEgODYwMDAwCis0MSAxIDg4MDAwMAorNDEgMSA5MDAwMDAKKzQxIDEgOTIwMDAwCis0MSAxIDk0MDAwMAorNDEgMSA5NjAwMDAKKzQxIDEgOTgwMDAwCis0MSAxIDEwMDAwMDAKKzQxIDEgMTAyMDAwMAorNDEgMSAxMDQwMDAwCis0MSAxIDEwNjAwMDAKKzQxIDEgMTA4MDAwMAorNDEgMSAxMTAwMDAwCis0MSAxIDExMjAwMDAKKzQxIDEgMTE0MDAwMAorNDEgMSAxMTYwMDAwCis0MSAxIDExODAwMDAKKzQxIDEgMTIwMDAwMAorNDEgMSAxMjIwMDAwCis0MSAxIDEyNDAwMDAKKzQxIDEgMTI2MDAwMAorNDEgMSAxMjgwMDAwCis0MSAxIDEzMDAwMDAKKzQxIDEgMTMyMDAwMAorNDEgMSAxMzQwMDAwCis0MSAxIDEzNjAwMDAKKzQxIDEgMTM4MDAwMAorNDEgMSAxNDAwMDAwCis0MSAxIDE0MjAwMDAKKzQxIDEgMTQ0MDAwMAorNDEgMSAxNDYwMDAwCis0MSAxIDE0ODAwMDAKKzQxIDEgMTUwMDAwMAorNDEgMSAxNTIwMDAwCis0MSAxIDE1NDAwMDAKKzQxIDEgMTU2MDAwMAorNDEgMSAxNTgwMDAwCis0MSAxIDE2MDAwMDAKKzQxIDEgMTYyMDAwMAorNDEgMSAxNjQwMDAwCis0MSAxIDE2NjAwMDAKKzQxIDEgMTY4MDAwMAorNDEgMSAxNzAwMDAwCis0MSAxIDE3MjAwMDAKKzQxIDEgMTc0MDAwMAorNDEgMSAxNzYwMDAwCis0MSAxIDE3ODAwMDAKKzQxIDEgMTgwMDAwMAorNDEgMSAxODIwMDAwCis0MSAxIDE4NDAwMDAKKzQxIDEgMTg2MDAwMAorNDEgMSAxODgwMDAwCis0MSAxIDE5MDAwMDAKKzQxIDEgMTkyMDAwMAorNDEgMSAxOTQwMDAwCis0MSAxIDE5NjAwMDAKKzQxIDEgMTk4MDAwMAorNDEgMSAyMDAwMDAwCis0MSAxIDIwMjAwMDAKKzQxIDEgMjA0MDAwMAorNDEgMSAyMDYwMDAwCis0MSAxIDIwODAwMDAKKzQxIDEgMjEwMDAwMAorNDEgMSAyMTIwMDAwCis0MSAxIDIxNDAwMDAKKzQxIDEgMjE2MDAwMAorNDEgMSAyMTgwMDAwCis0MSAxIDIyMDAwMDAKKzQxIDEgMjIyMDAwMAorNDEgMSAyMjQwMDAwCis0MSAxIDIyNjAwMDAKKzQxIDEgMjI4MDAwMAorNDEgMSAyMzAwMDAwCis0MSAxIDIzMjAwMDAKKzQxIDEgMjM0MDAwMAorNDEgMSAyMzYwMDAwCis0MSAxIDIzODAwMDAKKzQxIDEgMjQwMDAwMAorNDEgMSAyNDIwMDAwCis0MSAxIDI0NDAwMDAKKzQxIDEgMjQ2MDAwMAorNDEgMSAyNDgwMDAwCis0MSAxIDI1MDAwMDAKKzQxIDEgMjUyMDAwMAorNDEgMSAyNTQwMDAwCis0MSAxIDI1NjAwMDAKKzQxIDEgMjU4MDAwMAorNDEgMSAyNjAwMDAwCis0MSAxIDI2MjAwMDAKKzQxIDEgMjY0MDAwMAorNDEgMSAyNjYwMDAwCis0MSAxIDI2ODAwMDAKKzQxIDEgMjcwMDAwMAorNDEgMSAyNzIwMDAwCis0MSAxIDI3NDAwMDAKKzQxIDEgMjc2MDAwMAorNDEgMSAyNzgwMDAwCis0MSAxIDI4MDAwMDAKKzQxIDEgMjgyMDAwMAorNDEgMSAyODQwMDAwCis0MSAxIDI4NjAwMDAKKzQxIDEgMjg4MDAwMAorNDEgMSAyOTAwMDAwCis0MSAxIDI5MjAwMDAKKzQxIDEgMjk0MDAwMAorNDEgMSAyOTYwMDAwCis0MSAxIDI5ODAwMDAKKzQxIDEgMzAwMDAwMAorNDEgMSAzMDIwMDAwCis0MSAxIDMwNDAwMDAKKzQxIDEgMzA2MDAwMAorNDEgMSAzMDgwMDAwCis0MSAxIDMxMDAwMDAKKzQxIDEgMzEyMDAwMAorNDEgMSAzMTQwMDAwCis0MSAxIDMxNjAwMDAKKzQxIDEgMzE4MDAwMAorNDEgMSAzMjAwMDAwCis0MSAxIDMyMjAwMDAKKzQxIDEgMzI0MDAwMAorNDEgMSAzMjYwMDAwCis0MSAxIDMyODAwMDAKKzQxIDEgMzMwMDAwMAorNDEgMSAzMzIwMDAwCis0MSAxIDMzNDAwMDAKKzQxIDEgMzM2MDAwMAorNDEgMSAzMzgwMDAwCis0MSAxIDM0MDAwMDAKKzQxIDEgMzQyMDAwMAorNDEgMSAzNDQwMDAwCis0MSAxIDM0NjAwMDAKKzQxIDEgMzQ4MDAwMAorNDEgMSAzNTAwMDAwCis0MSAxIDM1MjAwMDAKKzQxIDEgMzU0MDAwMAorNDEgMSAzNTYwMDAwCis0MSAxIDM1ODAwMDAKKzQxIDEgMzYwMDAwMAorNDEgMSAzNjIwMDAwCis0MSAxIDM2NDAwMDAKKzQxIDEgMzY2MDAwMAorNDEgMSAzNjgwMDAwCis0MSAxIDM3MDAwMDAKKzQxIDEgMzcyMDAwMAorNDEgMSAzNzQwMDAwCis0MSAxIDM3NjAwMDAKKzQxIDEgMzc4MDAwMAorNDEgMSAzODAwMDAwCis0MSAxIDM4MjAwMDAKKzQxIDEgMzg0MDAwMAorNDEgMSAzODYwMDAwCis0MSAxIDM4ODAwMDAKKzQxIDEgMzkwMDAwMAorNDEgMSAzOTIwMDAwCis0MSAxIDM5NDAwMDAKKzQxIDEgMzk2MDAwMAorNDEgMSAzOTgwMDAwCis0MSAxIDQwMDAwMDAKKzQxIDEgNDAyMDAwMAorNDEgMSA0MDQwMDAwCis0MSAxIDQwNjAwMDAKKzQxIDEgNDA4MDAwMAorNDEgMSA0MTAwMDAwCis0MSAxIDQxMjAwMDAKKzQxIDEgNDE0MDAwMAorNDEgMSA0MTYwMDAwCis0MSAxIDQxODAwMDAKKzQxIDEgNDIwMDAwMAorNDEgMSA0MjIwMDAwCis0MSAxIDQyNDAwMDAKKzQxIDEgNDI2MDAwMAorNDEgMSA0MjgwMDAwCis0MSAxIDQzMDAwMDAKKzQxIDEgNDMyMDAwMAorNDEgMSA0MzQwMDAwCis0MSAxIDQzNjAwMDAKKzQxIDEgNDM4MDAwMAorNDEgMSA0NDAwMDAwCis0MSAxIDQ0MjAwMDAKKzQxIDEgNDQ0MDAwMAorNDEgMSA0NDYwMDAwCis0MSAxIDQ0ODAwMDAKKzQxIDEgNDUwMDAwMAorNDEgMSA0NTIwMDAwCis0MSAxIDQ1NDAwMDAKKzQxIDEgNDU2MDAwMAorNDEgMSA0NTgwMDAwCis0MSAxIDQ2MDAwMDAKKzQxIDEgNDYyMDAwMAorNDEgMSA0NjQwMDAwCis0MSAxIDQ2NjAwMDAKKzQxIDEgNDY4MDAwMAorNDEgMSA0NzAwMDAwCis0MSAxIDQ3MjAwMDAKKzQxIDEgNDc0MDAwMAorNDEgMSA0NzYwMDAwCis0MSAxIDQ3ODAwMDAKKzQxIDEgNDgwMDAwMAorNDEgMSA0ODIwMDAwCis0MSAxIDQ4NDAwMDAKKzQxIDEgNDg2MDAwMAorNDEgMSA0ODgwMDAwCis0MSAxIDQ5MDAwMDAKKzQxIDEgNDkyMDAwMAorNDEgMSA0OTQwMDAwCis0MSAxIDQ5NjAwMDAKKzQxIDEgNDk4MDAwMAorNDEgMSA1MDAwMDAwCis0MSAxIDUwMjAwMDAKKzQxIDEgNTA0MDAwMAorNDEgMSA1MDYwMDAwCis0MSAxIDUwODAwMDAKKzQxIDEgNTEwMDAwMAorNDEgMSA1MTIwMDAwCis0MSAxIDUxNDAwMDAKKzQxIDEgNTE2MDAwMAorNDEgMSA1MTgwMDAwCis0MSAxIDUyMDAwMDAKKzQxIDEgNTIyMDAwMAorNDEgMSA1MjQwMDAwCis0MSAxIDUyNjAwMDAKKzQxIDEgNTI4MDAwMAorNDEgMSA1MzAwMDAwCis0MSAxIDUzMjAwMDAKKzQxIDEgNTM0MDAwMAorNDEgMSA1MzYwMDAwCis0MSAxIDUzODAwMDAKKzQxIDEgNTQwMDAwMAorNDEgMSA1NDIwMDAwCis0MSAxIDU0NDAwMDAKKzQxIDEgNTQ2MDAwMAorNDEgMSA1NDgwMDAwCis0MSAxIDU1MDAwMDAKKzQxIDEgNTUyMDAwMAorNDEgMSA1NTQwMDAwCis0MSAxIDU1NjAwMDAKKzQxIDEgNTU4MDAwMAorNDEgMSA1NjAwMDAwCis0MSAxIDU2MjAwMDAKKzQxIDEgNTY0MDAwMAorNDEgMSA1NjYwMDAwCis0MSAxIDU2ODAwMDAKKzQxIDEgNTcwMDAwMAorNDEgMSA1NzIwMDAwCis0MSAxIDU3NDAwMDAKKzQxIDEgNTc2MDAwMAorNDEgMSA1NzgwMDAwCis0MSAxIDU4MDAwMDAKKzQxIDEgNTgyMDAwMAorNDEgMSA1ODQwMDAwCis0MSAxIDU4NjAwMDAKKzQxIDEgNTg4MDAwMAorNDEgMSA1OTAwMDAwCis0MSAxIDU5MjAwMDAKKzQxIDEgNTk0MDAwMAorNDEgMSA1OTYwMDAwCis0MSAxIDU5ODAwMDAKKzQxIDEgNjAwMDAwMAorNDEgMSA2MDIwMDAwCis0MSAxIDYwNDAwMDAKKzQxIDEgNjA2MDAwMAorNDEgMSA2MDgwMDAwCis0MSAxIDYxMDAwMDAKKzQxIDEgNjEyMDAwMAorNDEgMSA2MTQwMDAwCis0MSAxIDYxNjAwMDAKKzQxIDEgNjE4MDAwMAorNDEgMSA2MjAwMDAwCis0MSAxIDYyMjAwMDAKKzQxIDEgNjI0MDAwMAorNDEgMSA2MjYwMDAwCis0MSAxIDYyODAwMDAKKzQxIDEgNjMwMDAwMAorNDEgMSA2MzIwMDAwCis0MSAxIDYzNDAwMDAKKzQxIDEgNjM2MDAwMAorNDEgMSA2MzgwMDAwCis0MSAxIDY0MDAwMDAKKzQxIDEgNjQyMDAwMAorNDEgMSA2NDQwMDAwCis0MSAxIDY0NjAwMDAKKzQxIDEgNjQ4MDAwMAorNDEgMSA2NTAwMDAwCis0MSAxIDY1MjAwMDAKKzQxIDEgNjU0MDAwMAorNDEgMSA2NTYwMDAwCis0MSAxIDY1ODAwMDAKKzQxIDEgNjYwMDAwMAorNDEgMSA2NjIwMDAwCis0MSAxIDY2NDAwMDAKKzQxIDEgNjY2MDAwMAorNDEgMSA2NjgwMDAwCis0MSAxIDY3MDAwMDAKKzQxIDEgNjcyMDAwMAorNDEgMSA2NzQwMDAwCis0MSAxIDY3NjAwMDAKKzQxIDEgNjc4MDAwMAorNDEgMSA2ODAwMDAwCis0MSAxIDY4MjAwMDAKKzQxIDEgNjg0MDAwMAorNDEgMSA2ODYwMDAwCis0MSAxIDY4ODAwMDAKKzQxIDEgNjkwMDAwMAorNDEgMSA2OTIwMDAwCis0MSAxIDY5NDAwMDAKKzQxIDEgNjk2MDAwMAorNDEgMSA2OTgwMDAwCis0MSAxIDcwMDAwMDAKKzQxIDEgNzAyMDAwMAorNDEgMSA3MDQwMDAwCis0MSAxIDcwNjAwMDAKKzQxIDEgNzA4MDAwMAorNDEgMSA3MTAwMDAwCis0MSAxIDcxMjAwMDAKKzQxIDEgNzE0MDAwMAorNDEgMSA3MTYwMDAwCis0MSAxIDcxODAwMDAKKzQxIDEgNzIwMDAwMAorNDEgMSA3MjIwMDAwCis0MSAxIDcyNDAwMDAKKzQxIDEgNzI2MDAwMAorNDEgMSA3MjgwMDAwCis0MSAxIDczMDAwMDAKKzQxIDEgNzMyMDAwMAorNDEgMSA3MzQwMDAwCis0MSAxIDczNjAwMDAKKzQxIDEgNzM4MDAwMAorNDEgMSA3NDAwMDAwCis0MSAxIDc0MjAwMDAKKzQxIDEgNzQ0MDAwMAorNDEgMSA3NDYwMDAwCis0MSAxIDc0ODAwMDAKKzQxIDEgNzUwMDAwMAorNDEgMSA3NTIwMDAwCis0MSAxIDc1NDAwMDAKKzQxIDEgNzU2MDAwMAorNDEgMSA3NTgwMDAwCis0MSAxIDc2MDAwMDAKKzQxIDEgNzYyMDAwMAorNDEgMSA3NjQwMDAwCis0MSAxIDc2NjAwMDAKKzQxIDEgNzY4MDAwMAorNDEgMSA3NzAwMDAwCis0MSAxIDc3MjAwMDAKKzQxIDEgNzc0MDAwMAorNDEgMSA3NzYwMDAwCis0MSAxIDc3ODAwMDAKKzQxIDEgNzgwMDAwMAorNDEgMSA3ODIwMDAwCis0MSAxIDc4NDAwMDAKKzQxIDEgNzg2MDAwMAorNDEgMSA3ODgwMDAwCis0MSAxIDc5MDAwMDAKKzQxIDEgNzkyMDAwMAorNDEgMSA3OTQwMDAwCis0MSAxIDc5NjAwMDAKKzQxIDEgNzk4MDAwMAorNDEgMSA4MDAwMDAwCis0MSAxIDgwMjAwMDAKKzQxIDEgODA0MDAwMAorNDEgMSA4MDYwMDAwCis0MSAxIDgwODAwMDAKKzQxIDEgODEwMDAwMAorNDEgMSA4MTIwMDAwCis0MSAxIDgxNDAwMDAKKzQxIDEgODE2MDAwMAorNDEgMSA4MTgwMDAwCis0MSAxIDgyMDAwMDAKKzQxIDEgODIyMDAwMAorNDEgMSA4MjQwMDAwCis0MSAxIDgyNjAwMDAKKzQxIDEgODI4MDAwMAorNDEgMSA4MzAwMDAwCis0MSAxIDgzMjAwMDAKKzQxIDEgODM0MDAwMAorNDEgMSA4MzYwMDAwCis0MSAxIDgzODAwMDAKKzQxIDEgODQwMDAwMAorNDEgMSA4NDIwMDAwCis0MSAxIDg0NDAwMDAKKzQxIDEgODQ2MDAwMAorNDEgMSA4NDgwMDAwCis0MSAxIDg1MDAwMDAKKzQxIDEgODUyMDAwMAorNDEgMSA4NTQwMDAwCis0MSAxIDg1NjAwMDAKKzQxIDEgODU4MDAwMAorNDEgMSA4NjAwMDAwCis0MSAxIDg2MjAwMDAKKzQxIDEgODY0MDAwMAorNDEgMSA4NjYwMDAwCis0MSAxIDg2ODAwMDAKKzQxIDEgODcwMDAwMAorNDEgMSA4NzIwMDAwCis0MSAxIDg3NDAwMDAKKzQxIDEgODc2MDAwMAorNDEgMSA4NzgwMDAwCis0MSAxIDg4MDAwMDAKKzQxIDEgODgyMDAwMAorNDEgMSA4ODQwMDAwCis0MSAxIDg4NjAwMDAKKzQxIDEgODg4MDAwMAorNDEgMSA4OTAwMDAwCis0MSAxIDg5MjAwMDAKKzQxIDEgODk0MDAwMAorNDEgMSA4OTYwMDAwCis0MSAxIDg5ODAwMDAKKzQxIDEgOTAwMDAwMAorNDEgMSA5MDIwMDAwCis0MSAxIDkwNDAwMDAKKzQxIDEgOTA2MDAwMAorNDEgMSA5MDgwMDAwCis0MSAxIDkxMDAwMDAKKzQxIDEgOTEyMDAwMAorNDEgMSA5MTQwMDAwCis0MSAxIDkxNjAwMDAKKzQxIDEgOTE4MDAwMAorNDEgMSA5MjAwMDAwCis0MSAxIDkyMjAwMDAKKzQxIDEgOTI0MDAwMAorNDEgMSA5MjYwMDAwCis0MSAxIDkyODAwMDAKKzQxIDEgOTMwMDAwMAorNDEgMSA5MzIwMDAwCis0MSAxIDkzNDAwMDAKKzQxIDEgOTM2MDAwMAorNDEgMSA5MzgwMDAwCis0MSAxIDk0MDAwMDAKKzQxIDEgOTQyMDAwMAorNDEgMSA5NDQwMDAwCis0MSAxIDk0NjAwMDAKKzQxIDEgOTQ4MDAwMAorNDEgMSA5NTAwMDAwCis0MSAxIDk1MjAwMDAKKzQxIDEgOTU0MDAwMAorNDEgMSA5NTYwMDAwCis0MSAxIDk1ODAwMDAKKzQxIDEgOTYwMDAwMAorNDEgMSA5NjIwMDAwCis0MSAxIDk2NDAwMDAKKzQxIDEgOTY2MDAwMAorNDEgMSA5NjgwMDAwCis0MSAxIDk3MDAwMDAKKzQxIDEgOTcyMDAwMAorNDEgMSA5NzQwMDAwCis0MSAxIDk3NjAwMDAKKzQxIDEgOTc4MDAwMAorNDEgMSA5ODAwMDAwCis0MSAxIDk4MjAwMDAKKzQxIDEgOTg0MDAwMAorNDEgMSA5ODYwMDAwCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfYXZjXzE3NngxNDRfMzAwa2Jwc182MGZwcy5oMjY0IGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX2F2Y18xNzZ4MTQ0XzMwMGticHNfNjBmcHMuaDI2NApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTFlNzVkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX2F2Y18xNzZ4MTQ0XzMwMGticHNfNjBmcHMuaDI2NApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfYXZjXzE3NngxNDRfMzAwa2Jwc182MGZwcy5pbmZvIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX2F2Y18xNzZ4MTQ0XzMwMGticHNfNjBmcHMuaW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDU2MzA5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX2F2Y18xNzZ4MTQ0XzMwMGticHNfNjBmcHMuaW5mbwpAQCAtMCwwICsxLDYyIEBACisyOCAzMiAwCisxMCAzMiAwCis0NzgwIDEgMzMzMzMKKzk2MCAwIDEwMDAwMAorNDgwIDAgNjY2NjYKKzI0NiAwIDUwMDAwCisyNjQgMCA4MzMzMworMTE2MCAwIDE2NjY2NgorNDA0IDAgMTMzMzMzCisyMzcgMCAxMTY2NjYKKzE5MyAwIDE1MDAwMAorOTM2IDAgMjMzMzMzCiszODQgMCAyMDAwMDAKKzE5OSAwIDE4MzMzMworMjc1IDAgMjE2NjY2CisxMDg2IDAgMzAwMDAwCis1MjAgMCAyNjY2NjYKKzMwMSAwIDI1MDAwMAorMjcwIDAgMjgzMzMzCisxMjMyIDAgMzY2NjY2Cis1NTkgMCAzMzMzMzMKKzI4NyAwIDMxNjY2NgorMjc0IDAgMzUwMDAwCisxMDg0IDAgNDMzMzMzCis0ODUgMCA0MDAwMDAKKzMwNyAwIDM4MzMzMworMjg0IDAgNDE2NjY2CisxMDUyIDAgNTAwMDAwCis1MDQgMCA0NjY2NjYKKzI5OCAwIDQ1MDAwMAorMzI3IDAgNDgzMzMzCisxMTg5IDAgNTY2NjY2CiszNTggMCA1MzMzMzMKKzE3MiAwIDUxNjY2NgorMTg1IDAgNTUwMDAwCisxMTE1IDAgNjMzMzMzCis0NjMgMCA2MDAwMDAKKzIxOCAwIDU4MzMzMworMjU1IDAgNjE2NjY2CisxMTU1IDAgNzAwMDAwCis2MjIgMCA2NjY2NjYKKzM1NiAwIDY1MDAwMAorMzQxIDAgNjgzMzMzCisxMjQwIDAgNzY2NjY2Cis2MTAgMCA3MzMzMzMKKzM0MSAwIDcxNjY2NgorMzgwIDAgNzUwMDAwCisxMzI2IDAgODMzMzMzCis2MjAgMCA4MDAwMDAKKzM5NiAwIDc4MzMzMworMzUzIDAgODE2NjY2CisxMTk2IDAgOTAwMDAwCis2MjMgMCA4NjY2NjYKKzM3NSAwIDg1MDAwMAorMzYyIDAgODgzMzMzCisxMTkyIDAgOTY2NjY2Cis2NTQgMCA5MzMzMzMKKzM1OSAwIDkxNjY2NgorMzUyIDAgOTUwMDAwCis4MjggMCAxMDE2NjY2Cis0MzYgMCA5ODMzMzMKKzQwMSAwIDEwMDAwMDAKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9hdmNfNjQweDM2MF83NjhrYnBzXzMwZnBzLmgyNjQgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfYXZjXzY0MHgzNjBfNzY4a2Jwc18zMGZwcy5oMjY0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkOGM2OGYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfYXZjXzY0MHgzNjBfNzY4a2Jwc18zMGZwcy5oMjY0CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9hdmNfNjQweDM2MF83NjhrYnBzXzMwZnBzLmluZm8gYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfYXZjXzY0MHgzNjBfNzY4a2Jwc18zMGZwcy5pbmZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1ZjNiOWIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfYXZjXzY0MHgzNjBfNzY4a2Jwc18zMGZwcy5pbmZvCkBAIC0wLDAgKzEsMjQyIEBACisyOSAzMiAwCis5IDMyIDAKKzM4NDY5IDEgNjY2NjYKKzMyNzAgMCAyMDAwMDAKKzQ0MyAwIDEzMzMzMworMjQ2IDAgMTAwMDAwCisyMTQgMCAxNjY2NjYKKzIyODAgMCAzMDAwMDAKKzM2OCAwIDIzMzMzMworMjM4IDAgMjY2NjY2Cis2ODggMCA0MzMzMzMKKzI4NyAwIDM2NjY2NgorMjM0IDAgMzMzMzMzCisxNzIgMCA0MDAwMDAKKzEzNjMgMCA1NjY2NjYKKzI3MyAwIDUwMDAwMAorMTY2IDAgNDY2NjY2CisxODIgMCA1MzMzMzMKKzM3MzEgMCA3MDAwMDAKKzM0OSAwIDYzMzMzMworMjE2IDAgNjAwMDAwCisyMjkgMCA2NjY2NjYKKzYwNjEgMCA4MzMzMzMKKzQwOCAwIDc2NjY2NgorMjcxIDAgNzMzMzMzCisyNDEgMCA4MDAwMDAKKzcwMDQgMCA5NjY2NjYKKzQ0MiAwIDkwMDAwMAorMjYxIDAgODY2NjY2CisyMjkgMCA5MzMzMzMKKzczNTQgMCAxMTAwMDAwCis0MDQgMCAxMDMzMzMzCisyNjQgMCAxMDAwMDAwCisxOTggMCAxMDY2NjY2Cis0NTQyIDAgMTIzMzMzMworMjg2IDAgMTE2NjY2NgorMjA1IDAgMTEzMzMzMworMTMxIDAgMTIwMDAwMAorMzMyOSAwIDEzMzMzMzMKKzIxNiAwIDEyNjY2NjYKKzEzNiAwIDEzMDAwMDAKKzIzNTMgMCAxMzY2NjY2Cis5ODYgMCAxNDAwMDAwCis4MDggMCAxNDMzMzMzCiszMTggMCAxNDY2NjY2Cis2MiAwIDE1MDAwMDAKKzU1NjQ5IDEgMTUzMzMzMworMTYwNiAwIDE1NjY2NjYKKzI5MzUgMCAxNjAwMDAwCiszNTY0IDAgMTYzMzMzMworMzMyNCAwIDE2NjY2NjYKKzQ1NDMgMCAxNzAwMDAwCisxNzQwIDAgMTczMzMzMworMjczNyAwIDE3NjY2NjYKKzI3NjIgMCAxODAwMDAwCiszMTg1IDAgMTgzMzMzMworMzIzOCAwIDE4NjY2NjYKKzMzOTUgMCAxOTAwMDAwCiszNDIxIDAgMTkzMzMzMworMzQ4MiAwIDE5NjY2NjYKKzMzNzAgMCAyMDAwMDAwCiszNjU2IDAgMjAzMzMzMworMzUwOSAwIDIwNjY2NjYKKzM2ODQgMCAyMTAwMDAwCiszNzMyIDAgMjEzMzMzMworMzM2NiAwIDIxNjY2NjYKKzMzNzQgMCAyMjAwMDAwCiszMjAyIDAgMjIzMzMzMworMzQ0OSAwIDIyNjY2NjYKKzMzNjAgMCAyMzAwMDAwCiszMzcyIDAgMjMzMzMzMworMzQ2MCAwIDIzNjY2NjYKKzM1MTEgMCAyNDAwMDAwCiszNDcxIDAgMjQzMzMzMworMzMzMCAwIDI0NjY2NjYKKzMzNzcgMCAyNTAwMDAwCiszNzQ0IDAgMjUzMzMzMworMzY2NyAwIDI1NjY2NjYKKzM4NjcgMCAyNjAwMDAwCiszNzc2IDAgMjYzMzMzMworMzMyOSAwIDI2NjY2NjYKKzM4NzYgMCAyNzAwMDAwCiszMzg1IDAgMjczMzMzMworMzU2NiAwIDI3NjY2NjYKKzMzMDEgMCAyODAwMDAwCiszNTcwIDAgMjgzMzMzMworMzEzMiAwIDI4NjY2NjYKKzM0ODcgMCAyOTAwMDAwCiszMjcwIDAgMjkzMzMzMworMzQ3MiAwIDI5NjY2NjYKKzM0ODcgMCAzMDAwMDAwCiszNTAzIDAgMzAzMzMzMworMzQ0MyAwIDMwNjY2NjYKKzM1MjggMCAzMTAwMDAwCiszMjU4IDAgMzEzMzMzMworMzcwNyAwIDMxNjY2NjYKKzMxMjAgMCAzMjAwMDAwCiszMzQ3IDAgMzIzMzMzMworMzM3MiAwIDMyNjY2NjYKKzMxNjEgMCAzMzAwMDAwCiszMzkzIDAgMzMzMzMzMworMzM5OSAwIDMzNjY2NjYKKzI5MDUgMCAzNDAwMDAwCiszNTQzIDAgMzQzMzMzMworMzEwMyAwIDM0NjY2NjYKKzMwOTkgMCAzNTAwMDAwCiszNDU3IDAgMzUzMzMzMworMzE5MSAwIDM1NjY2NjYKKzMyOTAgMCAzNjAwMDAwCiszMzEyIDAgMzYzMzMzMworMjk1NSAwIDM2NjY2NjYKKzMzNDEgMCAzNzAwMDAwCiszMTAyIDAgMzczMzMzMworMzE4NiAwIDM3NjY2NjYKKzMxODAgMCAzODAwMDAwCisyODM5IDAgMzgzMzMzMworMzA4OSAwIDM4NjY2NjYKKzMxMTAgMCAzOTAwMDAwCiszMTY1IDAgMzkzMzMzMworMjY4NCAwIDM5NjY2NjYKKzMwODIgMCA0MDAwMDAwCisyNjk0IDAgNDAzMzMzMworMzA1MSAwIDQwNjY2NjYKKzMwMDIgMCA0MTAwMDAwCisyOTI5IDAgNDEzMzMzMworMjY3NiAwIDQxNjY2NjYKKzI0MTEgMCA0MjAwMDAwCisyODc0IDAgNDIzMzMzMworMjU3MiAwIDQyNjY2NjYKKzI0MjAgMCA0MzAwMDAwCisyNTAwIDAgNDMzMzMzMworMjEzNyAwIDQzNjY2NjYKKzIzNDQgMCA0NDAwMDAwCisyMDI4IDAgNDQzMzMzMworMTc1NCAwIDQ0NjY2NjYKKzE2MjcgMCA0NTAwMDAwCisxMzc1IDAgNDUzMzMzMworMTA2OSAwIDQ1NjY2NjYKKzgwMSAwIDQ2MDAwMDAKKzIxNjg5IDEgNDYzMzMzMworMjYxIDAgNDczMzMzMworNzYgMCA0NjY2NjY2Cis0NSAwIDQ3MDAwMDAKKzMzNCAwIDQ4MDAwMDAKKzYxIDAgNDc2NjY2NgorMTU3NyAwIDQ5MzMzMzMKKzI4MCAwIDQ4NjY2NjYKKzcyIDAgNDgzMzMzMworNDc5IDAgNDkwMDAwMAorMjE4MSAwIDUwNjY2NjYKKzkxOSAwIDUwMDAwMDAKKzM0OSAwIDQ5NjY2NjYKKzUzNCAwIDUwMzMzMzMKKzQ4NjAgMCA1MTY2NjY2Cis3NTkgMCA1MTAwMDAwCis2NzcgMCA1MTMzMzMzCiszMTAxIDAgNTMwMDAwMAorNDk4IDAgNTIzMzMzMworMzI3IDAgNTIwMDAwMAorMjEzIDAgNTI2NjY2NgorMTY0MCAwIDU0MzMzMzMKKzI1OSAwIDUzNjY2NjYKKzE2MiAwIDUzMzMzMzMKKzE0OCAwIDU0MDAwMDAKKzIxMzAgMCA1NTY2NjY2CiszOTcgMCA1NTAwMDAwCisxOTEgMCA1NDY2NjY2CisxODAgMCA1NTMzMzMzCisxNzU3IDAgNTcwMDAwMAorMzM4IDAgNTYzMzMzMworMTk0IDAgNTYwMDAwMAorMTQxIDAgNTY2NjY2NgorMTEwMyAwIDU4MzMzMzMKKzI4OSAwIDU3NjY2NjYKKzE0OSAwIDU3MzMzMzMKKzE0OCAwIDU4MDAwMDAKKzM5MTQgMCA1OTY2NjY2CisxMDI1IDAgNTkwMDAwMAorNzE0IDAgNTg2NjY2NgorNDI4IDAgNTkzMzMzMworNDYwNCAwIDYxMDAwMDAKKzE0NTYgMCA2MDMzMzMzCis2OTkgMCA2MDAwMDAwCis4OTIgMCA2MDY2NjY2Cis0NTM1IDAgNjIzMzMzMworMTMwMSAwIDYxNjY2NjYKKzcwOCAwIDYxMzMzMzMKKzU5MiAwIDYyMDAwMDAKKzIxNzUgMCA2MzMzMzMzCis2MDMgMCA2MjY2NjY2Cis0MTEgMCA2MzAwMDAwCisxODEzIDAgNjM2NjY2NgorNTA1NSAwIDY0NjY2NjYKKzE1MzggMCA2NDAwMDAwCisyMjAxIDAgNjQzMzMzMworNjI0OSAwIDY1MzMzMzMKKzE0MjAgMCA2NTAwMDAwCisyMjU0IDAgNjU2NjY2NgorMjQ0MSAwIDY2MzMzMzMKKzI5MyAwIDY2MDAwMDAKKzIwNjIgMCA2NzAwMDAwCisyMTMgMCA2NjY2NjY2CisyNDU1IDAgNjgwMDAwMAorMzQ0IDAgNjczMzMzMworMjA0IDAgNjc2NjY2NgorMzkyMCAwIDY5MzMzMzMKKzc1MSAwIDY4NjY2NjYKKzM3NiAwIDY4MzMzMzMKKzMzNyAwIDY5MDAwMDAKKzI4ODIgMCA3MDY2NjY2Cis0NTcgMCA3MDAwMDAwCisyMjIgMCA2OTY2NjY2CisxODQgMCA3MDMzMzMzCisyNzM0IDAgNzIwMDAwMAorNDcyIDAgNzEzMzMzMworMTg1IDAgNzEwMDAwMAorMjUwIDAgNzE2NjY2NgorMjczNSAwIDczMzMzMzMKKzMwMSAwIDcyNjY2NjYKKzMwNyAwIDcyMzMzMzMKKzEwOSAwIDczMDAwMDAKKzE4NTIgMCA3NDY2NjY2CiszMjIgMCA3NDAwMDAwCisxNTMgMCA3MzY2NjY2CisxOTUgMCA3NDMzMzMzCisxNTA2IDAgNzYwMDAwMAorMzUwIDAgNzUzMzMzMworMTcwIDAgNzUwMDAwMAorMTQ1IDAgNzU2NjY2NgorMjEyMyAwIDc3MzMzMzMKKzQzMCAwIDc2NjY2NjYKKzM2NCAwIDc2MzMzMzMKKzE5MCAwIDc3MDAwMDAKKzEyOTYgMCA3ODAwMDAwCisxOTYgMCA3NzY2NjY2Cis4NTggMCA3ODMzMzMzCiszODY1IDAgNzkzMzMzMworNjkzIDAgNzg2NjY2NgorMTYwNiAwIDc5MDAwMDAKKzQ4ODQgMCA3OTY2NjY2CisyODIxIDAgODAzMzMzMworMjIxMSAwIDgwMDAwMDAKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9mbGFjX3N0ZXJlb182ODBrYnBzXzQ4MDAwaHouZmxhYyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9mbGFjX3N0ZXJlb182ODBrYnBzXzQ4MDAwaHouZmxhYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjk0ZDhlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX2ZsYWNfc3RlcmVvXzY4MGticHNfNDgwMDBoei5mbGFjCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9mbGFjX3N0ZXJlb182ODBrYnBzXzQ4MDAwaHouaW5mbyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9mbGFjX3N0ZXJlb182ODBrYnBzXzQ4MDAwaHouaW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzU1Mjk1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX2ZsYWNfc3RlcmVvXzY4MGticHNfNDgwMDBoei5pbmZvCkBAIC0wLDAgKzEsNDE1IEBACis0MiAzMiAwCisxMzg2IDEgMAorMjQwMSAxIDI0MDAwCisyMzIxIDEgNDgwMDAKKzIzNjcgMSA3MjAwMAorMjM3MCAxIDk2MDAwCisyMzM0IDEgMTIwMDAwCisyMzk2IDEgMTQ0MDAwCisyMzc1IDEgMTY4MDAwCisyNDMxIDEgMTkyMDAwCisyNDI4IDEgMjE2MDAwCisyMzM0IDEgMjQwMDAwCisyMjYxIDEgMjY0MDAwCisyMTI0IDEgMjg4MDAwCisyMTUyIDEgMzEyMDAwCisyMjk1IDEgMzM2MDAwCisyMTgzIDEgMzYwMDAwCisyMzkzIDEgMzg0MDAwCisyNDAwIDEgNDA4MDAwCisyMjQ2IDEgNDMyMDAwCisyMjg5IDEgNDU2MDAwCisyNDAwIDEgNDgwMDAwCisyMzM1IDEgNTA0MDAwCisyMjk0IDEgNTI4MDAwCisyMjYwIDEgNTUyMDAwCisyMjA2IDEgNTc2MDAwCisyMTg1IDEgNjAwMDAwCisyMTU1IDEgNjI0MDAwCisyMTE4IDEgNjQ4MDAwCisyMDk0IDEgNjcyMDAwCisyMDUwIDEgNjk2MDAwCisyMDU5IDEgNzIwMDAwCisyMDMwIDEgNzQ0MDAwCisyMDIyIDEgNzY4MDAwCisyMDc4IDEgNzkyMDAwCisyMDgyIDEgODE2MDAwCisyMDk0IDEgODQwMDAwCisyMTExIDEgODY0MDAwCisyMDQzIDEgODg4MDAwCisyMDIzIDEgOTEyMDAwCisyMDI0IDEgOTM2MDAwCisyMDU2IDEgOTYwMDAwCisyMTA4IDEgOTg0MDAwCisyMTM4IDEgMTAwODAwMAorMjE0MCAxIDEwMzIwMDAKKzIxMTEgMSAxMDU2MDAwCisyMTEwIDEgMTA4MDAwMAorMjEzNyAxIDExMDQwMDAKKzIxNTcgMSAxMTI4MDAwCisyMTc0IDEgMTE1MjAwMAorMjIwMCAxIDExNzYwMDAKKzIyMDMgMSAxMjAwMDAwCisyMjM3IDEgMTIyNDAwMAorMjI2MSAxIDEyNDgwMDAKKzIyMTUgMSAxMjcyMDAwCisyMTMzIDEgMTI5NjAwMAorMjA5MSAxIDEzMjAwMDAKKzIwODggMSAxMzQ0MDAwCisyMTIyIDEgMTM2ODAwMAorMjEzOSAxIDEzOTIwMDAKKzIxNDYgMSAxNDE2MDAwCisyMjMxIDEgMTQ0MDAwMAorMjI4MiAxIDE0NjQwMDAKKzIyNzMgMSAxNDg4MDAwCisyMzA0IDEgMTUxMjAwMAorMjI5MiAxIDE1MzYwMDAKKzIyNTUgMSAxNTYwMDAwCisyMTgxIDEgMTU4NDAwMAorMjA4MSAxIDE2MDgwMDAKKzIwMTIgMSAxNjMyMDAwCisyMDExIDEgMTY1NjAwMAorMjA2NiAxIDE2ODAwMDAKKzIwNjkgMSAxNzA0MDAwCisyMTIwIDEgMTcyODAwMAorMjE0MSAxIDE3NTIwMDAKKzIxNDggMSAxNzc2MDAwCisyMTgxIDEgMTgwMDAwMAorMjE3NiAxIDE4MjQwMDAKKzIyNDAgMSAxODQ4MDAwCisyMjk3IDEgMTg3MjAwMAorMjMyNSAxIDE4OTYwMDAKKzIzMzYgMSAxOTIwMDAwCisyMzI5IDEgMTk0NDAwMAorMjI5OSAxIDE5NjgwMDAKKzIzMjIgMSAxOTkyMDAwCisyMzQ3IDEgMjAxNjAwMAorMjI4NyAxIDIwNDAwMDAKKzIyODYgMSAyMDY0MDAwCisyMjY5IDEgMjA4ODAwMAorMjMyMCAxIDIxMTIwMDAKKzIzMDUgMSAyMTM2MDAwCisyMzg0IDEgMjE2MDAwMAorMjQyOSAxIDIxODQwMDAKKzIzNzAgMSAyMjA4MDAwCisyMzY1IDEgMjIzMjAwMAorMjM2MSAxIDIyNTYwMDAKKzIzNzAgMSAyMjgwMDAwCisyMzkzIDEgMjMwNDAwMAorMjM0MiAxIDIzMjgwMDAKKzIzMjUgMSAyMzUyMDAwCisyMzM0IDEgMjM3NjAwMAorMjMxNiAxIDI0MDAwMDAKKzIzMTcgMSAyNDI0MDAwCisyMzA1IDEgMjQ0ODAwMAorMjM2MCAxIDI0NzIwMDAKKzIzMzEgMSAyNDk2MDAwCisyMzMyIDEgMjUyMDAwMAorMjM2MSAxIDI1NDQwMDAKKzI0MTcgMSAyNTY4MDAwCisyNDM4IDEgMjU5MjAwMAorMjQwMyAxIDI2MTYwMDAKKzIzODYgMSAyNjQwMDAwCisyMzgyIDEgMjY2NDAwMAorMjM1MCAxIDI2ODgwMDAKKzIzNTUgMSAyNzEyMDAwCisyMzgzIDEgMjczNjAwMAorMjM4NCAxIDI3NjAwMDAKKzIzODMgMSAyNzg0MDAwCisyMzczIDEgMjgwODAwMAorMjM3NCAxIDI4MzIwMDAKKzIzNDcgMSAyODU2MDAwCisyMzUzIDEgMjg4MDAwMAorMjM4MSAxIDI5MDQwMDAKKzI0MDEgMSAyOTI4MDAwCisyNDAxIDEgMjk1MjAwMAorMjM4NSAxIDI5NzYwMDAKKzIzODIgMSAzMDAwMDAwCisyMzI4IDEgMzAyNDAwMAorMjMwMyAxIDMwNDgwMDAKKzIyNzIgMSAzMDcyMDAwCisyMjcwIDEgMzA5NjAwMAorMjMxMiAxIDMxMjAwMDAKKzIyNzMgMSAzMTQ0MDAwCisyMzMwIDEgMzE2ODAwMAorMjMzOSAxIDMxOTIwMDAKKzIyOTYgMSAzMjE2MDAwCisyMzE3IDEgMzI0MDAwMAorMjQ0MCAxIDMyNjQwMDAKKzIzNTMgMSAzMjg4MDAwCisyMzQ2IDEgMzMxMjAwMAorMjMwMyAxIDMzMzYwMDAKKzIzMDggMSAzMzYwMDAwCisyMjg3IDEgMzM4NDAwMAorMjMxNiAxIDM0MDgwMDAKKzIzNjcgMSAzNDMyMDAwCisyMzM1IDEgMzQ1NjAwMAorMjM1MCAxIDM0ODAwMDAKKzIzOTUgMSAzNTA0MDAwCisyNDA4IDEgMzUyODAwMAorMjQxMyAxIDM1NTIwMDAKKzI0MTUgMSAzNTc2MDAwCisyNDY4IDEgMzYwMDAwMAorMjQzNyAxIDM2MjQwMDAKKzIzNzIgMSAzNjQ4MDAwCisyMzcxIDEgMzY3MjAwMAorMjM0MSAxIDM2OTYwMDAKKzIzMjggMSAzNzIwMDAwCisyMjczIDEgMzc0NDAwMAorMjI0NCAxIDM3NjgwMDAKKzIyMzMgMSAzNzkyMDAwCisyMjI5IDEgMzgxNjAwMAorMjI1MiAxIDM4NDAwMDAKKzIyMzYgMSAzODY0MDAwCisyMjE3IDEgMzg4ODAwMAorMjE3OSAxIDM5MTIwMDAKKzIyNTEgMSAzOTM2MDAwCisyMTkyIDEgMzk2MDAwMAorMjE5OSAxIDM5ODQwMDAKKzIyMTIgMSA0MDA4MDAwCisyMTkwIDEgNDAzMjAwMAorMjEwMiAxIDQwNTYwMDAKKzIxMjAgMSA0MDgwMDAwCisyMTY3IDEgNDEwNDAwMAorMjAyNCAxIDQxMjgwMDAKKzIwMTAgMSA0MTUyMDAwCisyMDY3IDEgNDE3NjAwMAorMjAzNSAxIDQyMDAwMDAKKzIwNTEgMSA0MjI0MDAwCisyMDEyIDEgNDI0ODAwMAorMjA2NiAxIDQyNzIwMDAKKzIwMjUgMSA0Mjk2MDAwCisxOTg3IDEgNDMyMDAwMAorMTk3MiAxIDQzNDQwMDAKKzE5NjYgMSA0MzY4MDAwCisxOTk5IDEgNDM5MjAwMAorMTk4NyAxIDQ0MTYwMDAKKzE5MjIgMSA0NDQwMDAwCisyMDIwIDEgNDQ2NDAwMAorMjA3MiAxIDQ0ODgwMDAKKzIwMjEgMSA0NTEyMDAwCisyMDE3IDEgNDUzNjAwMAorMjA5OSAxIDQ1NjAwMDAKKzIwNjQgMSA0NTg0MDAwCisyMTA5IDEgNDYwODAwMAorMjA5MyAxIDQ2MzIwMDAKKzIwOTAgMSA0NjU2MDAwCisyMTQ4IDEgNDY4MDAwMAorMjE4NCAxIDQ3MDQwMDAKKzIxNzkgMSA0NzI4MDAwCisyMTUyIDEgNDc1MjAwMAorMjE0MyAxIDQ3NzYwMDAKKzIxNTkgMSA0ODAwMDAwCisyMTIzIDEgNDgyNDAwMAorMjEyOSAxIDQ4NDgwMDAKKzIxNDcgMSA0ODcyMDAwCisyMTkyIDEgNDg5NjAwMAorMjA1MSAxIDQ5MjAwMDAKKzIxMTYgMSA0OTQ0MDAwCisyMTI0IDEgNDk2ODAwMAorMjA4OCAxIDQ5OTIwMDAKKzIwNzMgMSA1MDE2MDAwCisyMTQ2IDEgNTA0MDAwMAorMjEzMyAxIDUwNjQwMDAKKzIwNzMgMSA1MDg4MDAwCisyMDU5IDEgNTExMjAwMAorMjA0NCAxIDUxMzYwMDAKKzIwMTIgMSA1MTYwMDAwCisyMDM0IDEgNTE4NDAwMAorMjA1MyAxIDUyMDgwMDAKKzIwMTMgMSA1MjMyMDAwCisxOTgxIDEgNTI1NjAwMAorMjA5NCAxIDUyODAwMDAKKzIwNzYgMSA1MzA0MDAwCisxOTY4IDEgNTMyODAwMAorMjAyOCAxIDUzNTIwMDAKKzIwMzEgMSA1Mzc2MDAwCisyMDIwIDEgNTQwMDAwMAorMjAxOSAxIDU0MjQwMDAKKzIwMzAgMSA1NDQ4MDAwCisyMDE1IDEgNTQ3MjAwMAorMTk2MiAxIDU0OTYwMDAKKzIwNzAgMSA1NTIwMDAwCisyMDg3IDEgNTU0NDAwMAorMTk2NCAxIDU1NjgwMDAKKzIwNjkgMSA1NTkyMDAwCisyMDM0IDEgNTYxNjAwMAorMTk5NCAxIDU2NDAwMDAKKzE5ODUgMSA1NjY0MDAwCisyMDMwIDEgNTY4ODAwMAorMjA2NiAxIDU3MTIwMDAKKzE5NTQgMSA1NzM2MDAwCisxNzMzIDEgNTc2MDAwMAorMTY0OSAxIDU3ODQwMDAKKzE2NTIgMSA1ODA4MDAwCisxNjMxIDEgNTgzMjAwMAorMTY1NiAxIDU4NTYwMDAKKzE2NzIgMSA1ODgwMDAwCisxNjY3IDEgNTkwNDAwMAorMTY5NiAxIDU5MjgwMDAKKzE2NzIgMSA1OTUyMDAwCisxNzAxIDEgNTk3NjAwMAorMTY1MSAxIDYwMDAwMDAKKzE2NzQgMSA2MDI0MDAwCisxNjk1IDEgNjA0ODAwMAorMTcwMiAxIDYwNzIwMDAKKzE3MDcgMSA2MDk2MDAwCisxNjk0IDEgNjEyMDAwMAorMTcyNyAxIDYxNDQwMDAKKzE3MzAgMSA2MTY4MDAwCisxNzA4IDEgNjE5MjAwMAorMTcwNCAxIDYyMTYwMDAKKzE3MzUgMSA2MjQwMDAwCisxNzU4IDEgNjI2NDAwMAorMTc1MyAxIDYyODgwMDAKKzE3NDggMSA2MzEyMDAwCisxNzYzIDEgNjMzNjAwMAorMTczNyAxIDYzNjAwMDAKKzE3ODMgMSA2Mzg0MDAwCisxODM5IDEgNjQwODAwMAorMTg2MSAxIDY0MzIwMDAKKzE4MzIgMSA2NDU2MDAwCisxOTQ3IDEgNjQ4MDAwMAorMTkzOSAxIDY1MDQwMDAKKzE5MjYgMSA2NTI4MDAwCisxODk2IDEgNjU1MjAwMAorMTkwOSAxIDY1NzYwMDAKKzE4NjkgMSA2NjAwMDAwCisxOTAwIDEgNjYyNDAwMAorMTg5NiAxIDY2NDgwMDAKKzE4ODMgMSA2NjcyMDAwCisxOTAzIDEgNjY5NjAwMAorMTg5NSAxIDY3MjAwMDAKKzE4NjUgMSA2NzQ0MDAwCisxODc4IDEgNjc2ODAwMAorMTg4MSAxIDY3OTIwMDAKKzE4NjEgMSA2ODE2MDAwCisxNzkxIDEgNjg0MDAwMAorMTc4NyAxIDY4NjQwMDAKKzE3OTggMSA2ODg4MDAwCisxODExIDEgNjkxMjAwMAorMTgyNCAxIDY5MzYwMDAKKzE4OTUgMSA2OTYwMDAwCisyMDc5IDEgNjk4NDAwMAorMjAzNCAxIDcwMDgwMDAKKzIwMzggMSA3MDMyMDAwCisyMDE4IDEgNzA1NjAwMAorMjAzMCAxIDcwODAwMDAKKzIwNjcgMSA3MTA0MDAwCisxOTgyIDEgNzEyODAwMAorMTkxMSAxIDcxNTIwMDAKKzE5MDQgMSA3MTc2MDAwCisxODc0IDEgNzIwMDAwMAorMTg3NiAxIDcyMjQwMDAKKzE5NDQgMSA3MjQ4MDAwCisxOTc3IDEgNzI3MjAwMAorMTk3NyAxIDcyOTYwMDAKKzE5NzkgMSA3MzIwMDAwCisyMDEyIDEgNzM0NDAwMAorMTk2MSAxIDczNjgwMDAKKzE3NzMgMSA3MzkyMDAwCisxNzgwIDEgNzQxNjAwMAorMTgwMSAxIDc0NDAwMDAKKzE4OTIgMSA3NDY0MDAwCisxODY5IDEgNzQ4ODAwMAorMTkzNiAxIDc1MTIwMDAKKzIxNTQgMSA3NTM2MDAwCisyMjI2IDEgNzU2MDAwMAorMjE1OSAxIDc1ODQwMDAKKzIyNTMgMSA3NjA4MDAwCisyMjg2IDEgNzYzMjAwMAorMjIxNCAxIDc2NTYwMDAKKzIxMTEgMSA3NjgwMDAwCisyMDI3IDEgNzcwNDAwMAorMTk5NCAxIDc3MjgwMDAKKzE4ODIgMSA3NzUyMDAwCisxODg3IDEgNzc3NjAwMAorMTk5MyAxIDc4MDAwMDAKKzE5NjIgMSA3ODI0MDAwCisxOTgyIDEgNzg0ODAwMAorMTk2NiAxIDc4NzIwMDAKKzE5NjIgMSA3ODk2MDAwCisxOTI4IDEgNzkyMDAwMAorMTg3OCAxIDc5NDQwMDAKKzE4NTcgMSA3OTY4MDAwCisxODg1IDEgNzk5MjAwMAorMTkxOSAxIDgwMTYwMDAKKzE5MDQgMSA4MDQwMDAwCisxOTA5IDEgODA2NDAwMAorMTkwOSAxIDgwODgwMDAKKzE5MzMgMSA4MTEyMDAwCisxODI0IDEgODEzNjAwMAorMTc1NiAxIDgxNjAwMDAKKzE3MzMgMSA4MTg0MDAwCisxNzA1IDEgODIwODAwMAorMTc1NSAxIDgyMzIwMDAKKzE3NTYgMSA4MjU2MDAwCisxNzI1IDEgODI4MDAwMAorMTc2MSAxIDgzMDQwMDAKKzE3MzYgMSA4MzI4MDAwCisxNzA2IDEgODM1MjAwMAorMTY2MiAxIDgzNzYwMDAKKzE2MDQgMSA4NDAwMDAwCisxNjEzIDEgODQyNDAwMAorMTY5MiAxIDg0NDgwMDAKKzE3MzYgMSA4NDcyMDAwCisxNzc5IDEgODQ5NjAwMAorMTc2OCAxIDg1MjAwMDAKKzE3NTggMSA4NTQ0MDAwCisxNzA4IDEgODU2ODAwMAorMTY0MiAxIDg1OTIwMDAKKzE2NDUgMSA4NjE2MDAwCisxNTgxIDEgODY0MDAwMAorMTY1MSAxIDg2NjQwMDAKKzE3MzEgMSA4Njg4MDAwCisxNzQzIDEgODcxMjAwMAorMTcxNyAxIDg3MzYwMDAKKzE3MTUgMSA4NzYwMDAwCisxNjQ2IDEgODc4NDAwMAorMTU1MSAxIDg4MDgwMDAKKzE1NjMgMSA4ODMyMDAwCisxNjQ5IDEgODg1NjAwMAorMTc0MiAxIDg4ODAwMDAKKzE3MjQgMSA4OTA0MDAwCisxNjc2IDEgODkyODAwMAorMTY2NCAxIDg5NTIwMDAKKzE1ODcgMSA4OTc2MDAwCisxNDk3IDEgOTAwMDAwMAorMTUwMyAxIDkwMjQwMDAKKzE2NDQgMSA5MDQ4MDAwCisxNjU4IDEgOTA3MjAwMAorMTY4MCAxIDkwOTYwMDAKKzE2MTEgMSA5MTIwMDAwCisxNjk0IDEgOTE0NDAwMAorMTY2OCAxIDkxNjgwMDAKKzE2NzcgMSA5MTkyMDAwCisxNjA0IDEgOTIxNjAwMAorMTU2NyAxIDkyNDAwMDAKKzE2MzkgMSA5MjY0MDAwCisxNTUyIDEgOTI4ODAwMAorMTQ4NiAxIDkzMTIwMDAKKzE0OTQgMSA5MzM2MDAwCisxNDgwIDEgOTM2MDAwMAorMTUwOSAxIDkzODQwMDAKKzE0NTcgMSA5NDA4MDAwCisxNDIzIDEgOTQzMjAwMAorMTQ1OSAxIDk0NTYwMDAKKzE0NDQgMSA5NDgwMDAwCisxNDI0IDEgOTUwNDAwMAorMTQxMyAxIDk1MjgwMDAKKzE0OTggMSA5NTUyMDAwCisxNDU1IDEgOTU3NjAwMAorMTM5MyAxIDk2MDAwMDAKKzE2MzggMSA5NjI0MDAwCisxOTE5IDEgOTY0ODAwMAorMTk3OSAxIDk2NzIwMDAKKzE4OTQgMSA5Njk2MDAwCisyMDAyIDEgOTcyMDAwMAorMjA2MiAxIDk3NDQwMDAKKzIwOTggMSA5NzY4MDAwCisxOTE5IDEgOTc5MjAwMAorMTczOCAxIDk4MTYwMDAKKzE4OTAgMSA5ODQwMDAwCisxOTcxIDEgOTg2NDAwMAorMjQyOSAxIDk4ODgwMDAKKzE4NjEgMSA5OTEyMDAwCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfZzcxMWFsYXdfMWNoXzhraHouaW5mbyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9nNzExYWxhd18xY2hfOGtoei5pbmZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2ZTU0ODAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfZzcxMWFsYXdfMWNoXzhraHouaW5mbwpAQCAtMCwwICsxLDEwIEBACis4MTkyIDEgMAorODE5MiAxIDEwMjQwMDAKKzgxOTIgMSAyMDQ4MDAwCis4MTkyIDEgMzA3MjAwMAorODE5MiAxIDQwOTYwMDAKKzgxOTIgMSA1MTIwMDAwCis4MTkyIDEgNjE0NDAwMAorODE5MiAxIDcxNjgwMDAKKzgxOTIgMSA4MTkyMDAwCis1NDYyIDEgOTIxNjAwMApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9nNzExYWxhd18xY2hfOGtoei5yYXcgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfZzcxMWFsYXdfMWNoXzhraHoucmF3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmYzRhMTEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfZzcxMWFsYXdfMWNoXzhraHoucmF3CkBAIC0wLDAgKzEgQEAKK2tvZ0/HxdjVSnZDdXNY09VJdkp+fUt1WV3ByMT09PTK2ElydEJSVPP5x9rG1lTF+ezs4//VT2Vifdn+7enr4cFbc2dnRPTl4ODg5cZeTExLf2VaUUnZ9/HzUHZ4bm1wVeTt5P7cYGgXFGZ2+ejv5ufDdWdtf3Rld1hb319Y2MTUz8/YwVjQ1nllf2dxUtv45f/h+FRHZXNGfE/C9cnQWd9ZdcLm75XmyEprEBFrd/jrkJfnx3diaW1M+eTm7OTYQ3p8eWJww+Xj5+Ho+Ft2eHhKQvT/9f70XXFnYXVf3fvg4+XCxlZlfFXBVE9wSXBgZHHQ9MH35NhMQkZLcmV2dHlzZ2Z9c0/UQnFS3NxGcdzNTk5NcXdawvvn5fv02XNpYdj74+jq7f1bZWJm3OTpl5Xo7/hZeGR4fEr35+TolOri2HN4Z2ZmecT82VBMZGZ7T9rM9vHRQHFgb3pAzuX/y9pffWJsQ/Dl5/ndRmZpbWJkW83k5VZGSHJ8fGR2XNjHX0Xb1klwYX7Q9vrj5/BSfH9gb3Dx7ZTt+PREZG5rZN3kl5aV6+791XBwQ0TY9vHNycT28d1bx8NTf3tS09zMz1TcU1fUUNXOycjVdkZFVvf4zV1xS3JjZ1Xk7efG1Ehga25jfnfD+8lTQUN3eGNmZHh+e2ZnZ3xMZGZ80/XF1fb30E1/Z2dnRufpl5GRl+FCfUzc7ZeTnJOV7dR4fHX05fXx/NLF28DxU3VccWZne1jEQXNLd1tXTV5Yc3ZyYX1FzeD48f9Tcn1gZXJP5eng5/ZcdGoQamTZ4eb6zHZmb2pgQ9Hz8FNOc3p/eGNnYH3Z38Hn5OfIeHp8QPzk5eL/2FVzf0jW5O7o6uLm4fjYXlHE9vfCxvHy89jQzM7Pw0R5Z2ZzRNny/ubu58dfWt9XTXZ9T9NYRNzJyFd4YmttTN/+5cBOZGkXExVz1tvdTXZOf2RjenVHUM79/PnwUHZ+ZUDM5OHk//vC1dN1UPD3z8b04P/QXXljZHDN7e3v4fBcZGFFyvrm+dBEWl5UxuCU6uT1WnVyZHxXxPrj65fg/PBQe2FjSMzw+cRLc2NraRVid9bSV17UfG5rahVrYUHNw99dU2Rsbn3F9//6ykF1fnJyWPzn9cjD/ef95OTx10RFx9XP4e3gykZCREnW1sbC293dU1XT3Vx1SkJcX11VXkBQ2Pj6zMvMRH1nSOXtlZbq7+Tx+v/x5efm5P7h7uD7235rFWJayfrs7vBnFh0QF2tnc3lkbxQREhFvYXFX1NFGfGEVF2llUsD3//z3SWRlcETdwcvXd3RIXMbB9+f48Mfd21d2fGZlVfLl+/vn5VFKS1P24JWX78NAc3ly1OWUlOzj5OTj5vfA1fDk4eiXle/7wvbA2sTFU1hxUsPc3FpxfXtjYmx6TkpzeW8Va2BxX1VBe2lrFxRjSEB9ZmRf2sjN1FdRckHX383Iz15+TsbR2vbx/f7z91pD0fDm5fT1+cJOdlzXV8X44eDi5UdmbWJF5euRkJGV/MjGQdPk7eji4Oz3UFNTzPdRUMTP2sXC32doYmV8dkVxeGNua29tfEZGd2R8dWZoZHpzcEtQS39HU0F0YWRNwtvEwchGfHRc8u2V4MxZVlPf38PLzcLYy/j7wMrSfW1hSNnO5+zt4M5NfHFySlrEx8vk4eTl5PHS9ePv6JSX7v1fS1/P99jYwtpT2MVRSUV3ZWRkeHh9f2FvY2R+c3p7Sn1uExJqbXhQ9v7y3EdKSV7F8eXw0vTNUVpERtb15efN0NtIZGxpe15c2/rl80R5cmJufVtVwN704+bn+1fXx8TtlJedk+n6w8jm5efp5Pn918HN1N7zztx3ekVeSFJOd0F9cEFzeH5sahVqfEB3XE96eHp0XHNmZWZ+S0j3+8NRQU9Y1vb48vXHW0N2Z0nZ9vnzx9BGddHWQFLcVNdUx/bwUHlndnFN9v3+5+Dt4d5AcHNOV8vl5Pr9y/HBzOX8xP76/srN1lTX3fP55vrK01p4ZXBe31XW21hLUnZ/TVdXydNYR0pBfmBgYmJY8OX5xtNQZWF2cdH/ycLPcWNmZGZlZX9zStJVcmxqaGdN/eHJ1dd2TXdsZlBVwPPG2sD+7+vj+sDa8/rj4/n44fri7Ofg48jN8NFMXcX45fTxyP7z0d/DTtfJ2PdbZnlyYH58Z2ZLXtrSTkpIQHN8fH9qYXdxdEh82tlkTHFmcFhf/vdTcXl+enfN/P/t/VBkaGlzWcnm/cXFysj+3nd30FRV8Pvzx9FGWUpwQ/Pz9sxFSVzS8+Dl5ebj/cvOWHXFzMP/8Pzj4PdfeXl1z+2UlOdGcnxlTFFEz/jb2N5/ZmV/S0J3c3x1QnRCfWBySXxZWUL01n5zYGplQVTQWkJNRt1WXs1YdVZGd1tzfEBPQtZMctjJ8fjOQFtSzv7/+tZE2NTF4+HvlODyzlzG5+Tj/tZAWdr/5+zj8vPVZWB6ekXY9/jk98XO38ZVdXBG2frk90B+dnB2195W9sxQS2VmcEhJcnl2dUx8YW1rExEUamBleH1/Y21tY2RT/+flyUh4eX7X8fXM5uD7/vP95uDt6u/n+ebh+vD95ePo75WU7ePgydLFxfDl5OX6wEJydnB5eH1JXN7K8lNnZ3J0Ud7f9vj30VB3c1/KwkNzZWd6entwZWV9e2R6ZXxzYGxjZ2xoYXthYGJqFWxhfn1nc9L+4Ob22sXH8+Tl/efp7uDh4ePo6urq6ePs6O/m+f7l5+Hi7uP5/8RNfXxlZXJxRER9YWF+fH9JRNz1+/rPfGxhen53R1fN9M3aWX5zTEdDRNFQRUZOdnx/dd7N2thbc2Rvbm1pFGhgYWJpFRYWFWlhZ2RwX9VQREtN0f3i6ezt6pGWkZCTnZ2cnJ+SkJCW6ODn5+Dj4fvJdWdncEnfzt3W1FJGfGNgZH5zdU/Uw/b2wVB9c1fe1dxRRVTT3srfQE5zf3l5ZGRmZmFjYmJ6X1xERXxnZmBmfGBsYm5uaRVrbmxnfHNwQlPD3N/eXtHP8Pnk8/3h5/rk5Ozu65aTkJeU7ujo6pSVlpGXleTb1NrEw/TL8/H/+dx0fXBczfPx+f3MzFRWTXNJX0x1S3x6emRnbWlvbGdkYGwVEREVbmNmZHpmbGkVFGl+TFNWRVjR3dVYQEdU8uTl98bGz8TC8v3w8vP1ydjR3PfL9vz8/P/m4eX2zsj0/Obj4+Pp6pXv/vnh7ebl5frl4O7v5/Py5+bk5/3z9c/CVX1taBUVaG1vahVqaBUQFhVpbmpqFhYUb3xMdkJTVNdfc3tkfVnX31Jc0VZQWXFwTdz55/bH9fz65OHn+P777Ojj/sTc0VPQ1Njx5ef+V3RHWsnm4O3m+Pr000dG2/fz5eHl//P8+fTx8Pvs7Oji/vLLysBedHpnenl/cGdhfHtwc2R+Z2xpFBcTHRAXa21vYmFtbWJvYmF3197DQXRFcVrfRF7TxuXn/fD08/b3/NlQyv7h4vvy8vD+5uDn/uT4++fx9Pzx+u/s7O7ole3zRHpcw/Dt5M7I0VfHVNH85OPi4+H1y8VYWHFkfHFwTHVhahRuZ3RyY2BuFxUXF2tteHllYWlsZmNhZmltfn1GQH19ZGRke3xyVvPk4OXbV9jO/+Tk/s/w8/b82cXz+umV4//x9cv198rw4eLj6fvP/vv7/fTLyfHKw/fP2v3l5ef99vrk7ejj8V9RVVvRU3Fxcnl0dH58d0Z3YWoRFxcWahcSExEUb2NhYWZkYmNmYnHBwMjYUdHRUNbUTEpRzvz7915OSnBcxcrPzfXZVllG1P3m7OP8+efn4ub55+bi7eno4Obm+/HMx8P8++b698JCWtH0/vX++vnm/dZbUtre0V5JZ2BibHhnZnl9R3VnYWNgYWFgYWZleX5IfmRzSl1eTnBldkhzcXdwe2d7SXdzd0lU1k5/ZEnfxPP311tS3v/n/vT1/PLCyPf74uHm5Pz+/OTol5Xh4+Dn5Pry+pWVl5aU6OTm5uflyfX0wsd3YGJ8f3x0Z20UFxRoYWtrY2RxZnh4dUR5ZGluYmR1WMV1c3FhfGV+dl/J2t5DfmNgT9f23VjUdkV2e3xwUFHKzUJxfVpdx83L5fnh5uTg+uLj4+3n5uTn4uns4O3n4Ob45v35+vrlwFNf9ePv7OH+VX95fF9GQVRfSW4REhdnfUNCcHB4ZGFkfnp8cEF0ZGdlU0R1T3xweXh8RlJN0sH0x0xxedbJ9MxaW39kYWVGS1pc3cFacHrXysr9xc9USVTT+vnw+fjlz8Pe/+Pj7+fh4fH3yebt4+Lg7OT02/Tt65Xj5PJX1lbf29bTUtJYeG1obWBlYWR1f3hkdkB2fGRwdGRtaWJ7dXlne2NjZnxFUcPUX1hyf3te8OX5UUFwYWZ/VdPRREDWSnJ6dMz18/XCztnawP/l5uPn4eTk/vbh4+7u4OHl5+Tt7ubm+/jxxl1B8/n/+NnWQFtbUvfAxMdQd31ka2FzTMNQdX97eXPd1URHc2dgYGlnQXRNcWJra2luckNJWHVyc3Z4dc738vZQSElCfUhBc13e3NLVc2V0TvXj5uXyw1Da8cf0/fH9/85Q8ubi6uL4+ubn4uvi7ez68cr2wfjh/+TJdn5+eXfI9/T900dMcGBhd3bdwUBCdmRifnRz1dFZXVxxZHx6dkR6ZGdhYmJnY3lDS3Rwe2N0UtH3UEF2eGdmQkpMQH1/e3pjeV/A4Of99/H8/e/u7ez6/czM1N355O3g7evrlezr6+Lv4+D788VSzPb7/tpacn1lc1NWxNFUTX5haXpMwPP1xkVNfXJBQE1CSEhxcXt+QFPVQ0xwcmRsY2BgYGR6c3BkZUfRxNFGcmBjYnhIcHNEWExKdXXD5OPp4//Dw1XW8Pr5+f3C00J5QMn0+uzr7e3h5+3h5+Po7uPi8vT6/vzaTWFme2RC01BE3MvaxEh229LS1dpCfEp/QVTU2cD3TXF+YH1zR1TWQmFkb29gYWVlRkN1fWJlS9XBwsR0TXZ0WnB4ZHFJeGVie3VC28H9xMD3yfv7+OTl5/HAXEff2vj45+T65/vj7+/i7+vp5vLHysPxzl9xbGdnf3Re3dr3/ffUXtP95+Tx+d1HeHh0R111UVp5bG5pY3JbQ1B2emRke35bcUfQ13R5Z2VC1ktAWnN3dF1LU3VD3FJ2ZX1xXvD1xMRHTE3d0+Xs+uXJ1ExPUMLj7OTn9VNGyf/77eTv7+TLwfH94unl/VdyZX9Icc3I9c5WS3DV3vbj+/bZfGBgSV3D9MnMXHJkdU9extrVT2djYXF1QdLRVHBjFWppZVbQXnZmbWBK0sDJzd9KZmtmStH88/PZfWxvcMb67+zs/NNCU9LE4Ovq4PHXWsX84JWVlpbu/NrN9efg5PZbZWJmdkXD9c7GSn5+TNf04ODzVn1kZ3fZ9/RNeGJvaW97RvD723dgaxRuc1rb19FeeGIVYHfb+MhccXxzfNn+7eL+9NrYR1zF9Pv3X3B7ZGBN9fPwyc3e09Ha8fvj4vBYdkBAX/b+5uXz/Pz33snh4Offcnl7f3DL5ufy2sbdVNzE/v3480FyeHFL2fDL3kpOTXVLd8Xxydx7Zm1sYmVDR0JLdHxmYXtLTHBAfWdjZEtW2MfaUkJDXNbTxdjT3E9/ZXlL3vj8w1FZUF1T9+Ds4uPlw0ZNx/Lh5uHm8vX38/jh7eD+yNdMe31x2/3Jw97I9Mn2+OTwxc3EQ3pxdEVZZXh7eX9+Q0bRwV1Cc2Vien9y3UZyZWd/ZHFE2PFEdEF2Z2RNU/b019ZDX9z55vzn8NhaeWdnd3dXw0F2fE9c1ffy7ebD3V9AQtLO8OXyzNbWxPLk++Tn8MzT0lTbz/Ph5cNAXMDw/vrj4/zZWV51Q9zL/cBbeGFkd97w5+fxRWNpaWJycUFJe24UbHhC0NPSRHlnenR9TFLT0k54Y2Va3fH3w8vFW3VBQtHbXVFMcGd418rm7e3j/N7W9fL+4u3v5s9YTtz04e7g5/7DXkJHRtvCwtlAfmZw0f7h5fj1VUxO1NTNydPXc2ZgZUTa//PI1k53fHVGWVB0cHptaW97R8FVR0dCWV/bwtrG3NtFeXp5Wt/85OT+w9VERl/RxlZHcmBsb3rV++bl899FdUjRzfXP8cB1e3hG0/Pn5+f88eX55ebg5vvyz8bawPLn+sdV1UdF0cnl+vTc0XRkZX9ZzPH399p3cUxzSEFDfWVsFhdqb3LVQHdIcnhwfV3O3lRWWHlld03Q8czR0nV4X9zC/OTy0Vt4fndw1//+z8LIyuXk5O3s5fX310hSUdL9+fX38sD0+fzl5P7N0EVxQEh33PbXSnRydFXb8uHl3FFAemBnc9L2xsv2213Q0VzX1HR9YGpqaW5vcEp8d0lexvT85+fxys7AxtDV18LYQUdCdFrHw97eX0t+ZWV4eGVO0VZFRlzH2tzL+vjN1VJNcHxwVPDxyvnk+uXn7e3m+fDy+f33zcL3zVxNWFffxfX1yNxB18LZUlzS0lBGWMff0sH3z1FOeWRhbW1vbG96cWd6c0pW29zewVJ1RkZIeH9JRF90T1JHW93aV9JQc0tQVNva2/f99sn+5ebh4e3i5/fE9tF2d0hS2V1ExMLB/vr6+cn19PHP3t9dTnBzcndDSFfY3c703Vjd1lhTUNDfV8DE1F3WzsHSQEpxeWRjZH9lcExHQ3VM3NNBXNPf28POwtVYSXFwc0TX0sbF3VTXS3BAQUh0SE93QN/Gzcf0/f7n+vDT2MBPdnFd3t7Q1czK8P//+vz99v/n8PXw/cReX1DW0EVVV9fSQEB0VMTX2N7aVdjCV8/Y2MXd301xeH54YmFkent6fmR7cnBHRV3W3NxdxdtdU09xeH9+cFNb19LPyldaQlfNzsj38/3z9sHw5fjn5Pnxy8DU1lTW2tvM1dVVXlFeQVvcwsba0MPKUkdOd01IT3dydUBGUsTczM3B/vry9srD29FS2PDywN1VSHphZ3p3dXRCTXZ3T0hLX1LS0lfRU1TezcPWUlldWnd9f0VCTEdIQExCRV9SW1BHQVxQ0sLz9vPyzsLcU9XD8PfDVFTDzsTM/Prk4fjw/PD85Pr1291TTnZxQ1NbWdBQXdPQ097Jzs3aW05T1tDYV1hXWHdweWR4cH1+fXx4fHx6ZHpzWkB3SlXc0srKzNldQkNBRl9QU0VNTFzZ2dLA8/D0ysb3++Hj5/r7/sJXW0Rf199TTndAUFXfxcnx8/HM3tjd093H9cnFVkFzdklwdEtaRkNR3NjE9P78y93ay/3yzNtVU3Rxcn10Q1pNdn1/fHNLR0ZV3NBSd3ZZ1sTbzvDfTnRMQE1BX1N3cXB9eWR6d1JW2M3NyvfwzMXMw8PE11Tbw9vExNnXU1vExdDP/Pnz+Pv++Ofg5ub9xldxdE1HQNHTUdFeWFxW3Nr28MLf3MTLwV7bz1t1Q3FnYWNnZGd4eXN2dHV0dU5wfEt3fELT2vXy9dRCdUBfX1bGwcTRXnVzcUJR2sv18/zx/fzy+uX88v3N2VVUVVhBTnZ0X9LY3d/dUkRT3d7G8f3z8sjYVFtZW1BU0tPb0EN1d0/Xzf/h5/n88vbK3NjDw9hTSH9nYGdleHxzcENKdkFKSkNbX1fdyfPL3l1AdH58TFNT1F9AWXFycH57dNHO98HBw8TEzcDJ8PL93U9HS1jc2snw88nA3NdbXFTHzMn9/Pjz8fjy9MDWUVXY39jdVdRRQUBfUMbJ9cTQ0lfE9c3T28/MXnF/ZWBsYGRle3N3cnJ/fENGUFXZy8BX1dJXxdJSR0xR0Vda195dRXRGX9Lz/v/8yd31x9HDyPP4/c3HUVhfQF9Q0N1fQ1hDd0RAXcLbxs/GXl9Q0cjQVNbBxdfc3NbRx9Ze1FTZ9PHw8MHK/vL98fDwysRCZGR8eXxMXl1Pc3lwfXZBQVhe11VATHd0XNFRWk51R0FMQERZV9NTTUJRUkHS2lfRwvHyy8L3zcfa3tPY39DGw/bAQdddUd3Sx9jY1MDWU9ZRwfby9s3U0cRUw99UxNjc0NVe2cTJ9MPOzc/a3FHV3EhCd3Nye2VlfWV9ZWNgYHl3SUfX0d7J2MvD2PH/zNRFdVNaW1FQX11cSUpxSl3Wzsz2+eX/+Pv08vDC3FZbUF1IUNnd1UN0cHRQ2FXd3VHHxtLW1NbMzVlOd3VR39La9uXlyNrQXdPZwvbw8f7wzcvN2cTSQE5OdnB5fnd0dHR9fnx0R3V8dkxCW0ZGU9jB98NBdH99Sk1HV8TB0V5DQkTQ2dDYzcXS0N3JyNrw+PP29MHQUF3a98nGUlbLxNnSRVnW19vc1vf/wsfUTUFZVdnfwfDM3N9IckN1WtjL+P7Z3sfZyMvaxtBSVXFlf2dnfWdhZGd/SnN2fGVD0NzAzfbl8svz00dfS0DT0cbLU0JMdEBSVNjAyvPF2ffK/eTxw/Pw8fRadkh1WtPRXFhW1V9HWHVAWHdJ2Mvy+d9TXnZ3RlzX9fP1xdrAxsrH3cX9+vnyVl9QUNjIydLC0UpLSnZ1WEx3eXNPSHd9fnl9fXVDQVFQWlBURdHdQEBZwP/20EFxeXd1XsfF9vzaUNfd9//++/jn4eXPxNVS0NDCwlBeVndxUVdV1ltJRMHy8MTF2lRHQFTY2sr83VTfWVbXWU3a9PT33lVcWlnSy8nTX0Z4ZHN9dEpycEp8e395ZX92c0tMX13fw9Pbz/XP311dwMLJ991AQ0tzQFfazsv129zbw87w8vvj5vjl9tXTUEdbWF9RRn1zdENZW0FJTlbb0M/L1sfSUkdPXsDO08r0x9vbw8nz5+bz8M5bQExHWVPU1017cnJ+d1lWWdXE33dxdHp7f3J+fHFPSHZBREhAVlZS0sr99fbK2VVZRE5fUMHHVdDZ1V/e9/P74ef89Mbex87L9PTI9d9GSFhBS1dUQU1T0tDd3drVX1FRQ01U3FZVx9nezcrJ9PTY0FN0SnVF1MXEyvLAXHRIdXZHV1FTX0xLem1hZGV/d3dKdENfX1XfxMfJw8zKxM/QXllNdkrR38DNy8FTVtjA2PLl+vzK/8vU0MPA2vbKydDRX09aXNXUzMDUWEZcS3ZJWkNB0sHZXVXWU1fE9M7M/eTy9PTbX0hFUlTG8svR1U1yfE1FQ9XE0XR3T35hYXJ9eEhVWXNycnZ0SU9IXdHR1FdXWkxH1VBE2/PIxcHG29zBzs/15eHl//z+ycT28fb65fb33tTVVtDVVdbB0UR1eXhlfFpHX87y9MRX0sfV08TBwvb28MdDTHdwSndN0trVUlnV1VhTX0xXx93cX3ZyZWNlenFFREdPcXJ0Wl1OQcv3y/TYUlVDQVVaVtnY39bcwsz1y9jA8fLk+vTM9cTNysPw+PDE39vUW1BYcHRXxMZQTHd5Zn13ddL398HS0dTZyNtXw/rk/fDxxl1E115E1d/HVVLHxdFSd31zRVdQWkB0fWVhY2Z8d0lyfEN1dkt2c07N9vXY31l0c3RIStf39tHZ//H0x8XS2ffB9vDz8v3zyNjf+OH68vDm5f/DUEVBxdLVWXV2e21iYWVFw/f09PP1wt3UV8P488/O9d9dc318flxVREbVysLeU0Fwd1pHWkJ3SUN5bW5if3B9TlBXW1hHQ0HS9/P+/czdXXd+clrJ9M/O9fD0zlBHVt7x9fH7+vr9z1dbWsLx9P3w5eX+w1FeRdRbWddedXNkY2d4XdfZ8vb32dNdW1ja+fT2/fL32l93T3ZH11Lf3czN3llIdnBGSENZcXBze2dkZHdGd0JHSnx/eXF0WsnD8/jGRXZye3t50ffH9fH98creUFBV9fb44Ofn5fHe1lTK+OXg5vv5+ffVUN/KxdjSQXF6YWBkZElWV8Tbwc/IyMfByf7/9sdU30dyZGBmcE1E0t/LyMbUSUFGVNHS1UJJe2dtaWF0TUZfdUp3SnR13cr4/fLxz99SSX5/fFpQ28DQyPP0VlrV3cr25ODh4Of0XE1NVcH2+f39/MraVNL3/c3YxUROdmVmZHxCVl1RRV3b2NLd9P7wwsHO38jLUU11S0FTVcLK9PfbUnRJXV1XUVFESWVubm1nd15fUEF2cH17fV/Ewdrf2dBRR0hOTl/X1FJX1VJW0FtMRVlR2PDm7e/v4fDCyc72++Hg4eT/xNXGxtrZUVJEdHN5en11SkVZTENfUdjZwv778MjZ0FVZXldOdXZzRkRWxM3EydRJRE5xTkpbXUlyZWBnenlEVFHSV1hSdnfX0FXa0F1fQVhbSltVWdbe1N7R08/XR1FYXsHN8uPt7OP48MPQzfHz5eT+9ldS2FNR01xbUEVASHZDRE5BRHV0QlTM9fzk//LxzNrdV1ZWSUxKd0Vf1cb2ysTS1VB2cURR3NZTSmdjYWZgfnV1dEhNSHdKQVxZWl9ASEZeWVTGU1zVWVpZV9bW01ZZSExUzuXg6+7h5vvHyfP44+3t7ef3x9xXWEXd39HfUEZHTHBfUklDdnJHXdTMyMHb2MzF2M3UXlNOeXZxSlVR3/fZW0R2cnd1V9HYUn96ZWNhcnJLRUdd1VBT1lFT3t1V193R19jc11dSQF9cRVHT11NQTHVE08X/4eHi5fnKxcvy5uTg4/r10tNNX1lERVreV1Vd1t1cVlNEfHl0dF7azMnDxNPewM7y8cnBVkdMXVRSxcPYQ3J+eX98RFLeycJFf3dyeX90Q31xT3R2cndaREFYdX1MSH9P1lZeW1BeX9XawMTfU1xIQNZW/e7u4ufk+OX6++Ls7OPm+czC3VJSXk1D1FVXVFbEztNTX092QkhzXt9UT0xPS1TF29PR2UVIdEHUXsD32lxKSnlwdHFexcBDcXB/eGV/d0JaQEVB0tzWwd/FUEVfWll1TVNXQHBKQEXQ38TE29FDRl3Sz/zj4eTk/PXH9/H8+uT6zM7H2tFU0VbfxdJfQN3f1dnc3FFMc393Q1vd297R0d/J9srxysxUQ3Zw3MPcxcTLVENwcFNEU9DfRHJ8ZXl5ZX52S3ZxcHdaRkJCWNVTRnJzWklwd05wenZKWVDf9sTdR0VH3Pvk5uDs7OHm5OHg7+3l5f/13NjF39LCyMbMw93C9MHE1dDQcWVlcXVyc3Bwd01a18PA9MRaX0J8c1Lb11PWVkxKd3VS1tXRTEp2YWVxdHF2QEh0d0dc08/Yxt/Z00NNTkBHQFBJdnZ2W1DFwdJQQE5/dtTA//nn4+Pj4e3j4uPn+sDdWEFZdV7Q1NbfzdHe9fPz9cvF01xMTXd2dXNwf3F2WNv0+P/3xdnVT01aXtVRU1dXW0lC0NJeXkZ3fX9zdnB1cnlxdHZxQNzSRFBUTUdBTnVxcXB9c3Nyc0PXz83Q31hAR0ZXwPLy/+fi7e3v7uvv4eP82MjL2tTT3Vfdzff09f76+/TA0kFdRXN+c35hZ2BldkvSzffD38RHT0p3Sk5YQ1LS0NvRU9/E1UFbc35KfnNwf2dkcXJIX9zP9MvSxNxWwdZWVHV+eH9lfklWxsHM115NfndGQdLOzPb4++Xi7+/s7+Dk/8DPwNPY1UpK0NdUzv34+Ob59vfT1NBFQ05lbWdgb35Hwfb//8ny31bS1t/a3XVc10pAVd/Q2dlEXkp+c3BzcmVjZn1hYU1WVMTK1dXRU0ReXU52ZGBnYGB8WVNWwlFaR0hPU8b25fvl4OPj4+nq6JXr4Ofk//by9cXfWN3cVMXw5OTj5/P0x1F0SExlYW9raGljf1PR2/fb29RbXFzXUVJIcXV8cUxT3NP320BFdnN1S3x7fmFlZmZwQ9Tb8/TD9cDS1FBAcU1lYmRnfEJXXNrJUtBWTtDMzvX48Mnl5+bi6e7pleD65MrFycRXxd1LQ0dO1v/n5uLh/v3FWlBHeX9/bGhgZnpGXVLGyMDGxNTJ8d3EzVJ0TENG0sDFwd5PcHZ4eHNlYXpnbmxjYXZXVMfIx9dUUEVFS3N2eG9uZmZ5TF7WwNrUxtnA//j9/Of4+OPi65eWlJXu5+T7//v79MDP1k1HWNb8+v7l+M3YVEVWU095YWNpaW5tenNxQlVeR9ndzPPAU1XXQnVDUMXPwtJRdmV+eXlCQH54eWBiZX5Yx8nIzsRbRVBS2M3VcH95YWFmZXRHXtDa1d3Mzv3l+PX2+fz55+Lplevm5P7P9fHx//DfU1dacUTD/fj4+fLL21fWx8n1XX1/ZWJiZmV3X1TT2NvQyP//9cjG1NlRW9fQ2sZHd3JyZWRleHx4Z2NiYm5kQ17c1VNZRE51Q9TaVEl9emRuY2BnS1tFU8bY1c79/Pv45+Hj4O3rlZaW7u3j5//9/vb0983E2tTR9/z45/LMwNNbQlnWVEV8Zm9pa2psZkXQQ9nA2VfG9MXL2t9RQ093TNXY20NJRE98fnJ8cnJlYWF6fnBQxc/S0tdYXl/a9c7FWX1kYW1ge03Q2FdX3NrDwPL5/+f49cvx+/jt6O7j5+TwztjPytvM0EXT2sj25uPn5fXdUVLVVtjXRHJiY29vZ0rZwfXfUs/D3s3+/8zER3R0cFDfz8dVWHxwZWJkc3xiYmkUYmNkRd/T09NzfE1H2Pf1V3Z4bG9tYU/f0V/cSXTI9fHm7eLh+svP/ubolpSU6+fK8/nK+eH/0VtGRcj+5O7u4ufYdXVERVTN1X9tahQVbGRSwVNbcGVKwffy/v/MTGVnZXxXwfDaVFhmZmV9dEddeWwVFGJ/0/P++P3Mdn5Cxfz88NB2ZG9sY3LR2sVBd3pnWs/h4uHi+cVHXMrm6pXq4vrLTFLO+eb+91BzfEjY/+uV6+/kyUxxVcDw9NpMZGJuYXtV8PfHQkt0Sdn35+f00nd6ZGR03fXyyUF2f2BkcUBceW4WEBRuYUL3//Zcd059fd338cdTfWNjYGZIwtrUcWF8TF7E+O3i5/bH8frk4paVlej58vLy/eDv5clafEjN8/LolOrtzNDbxtPN8NNBcm0VaWZnQ9JDTmRhfUNU0vLx2ERlZn9eRtzCVtBJemVzQFHTRHhhahVsckbV/fPz3H9xUFbF8vHQUHNhYHlE0cpSQnFjZ3RWwfjl9vbVR9T3+ufp7+bk98HM9v/j7cdaS3NIU//h6+vm5/POzPL8/frbQn17Z2N11c/xQUt0cHBDy/Hk8FBAdnF+183RwF10cn95fVBaVnBtaxYVFWN0TNPVQ3VLT171wsbL1X1sZ3h7UtzH0ndlZ3JOx/T/4f7JUM38+e/u6Oro+Mr5/+Hi4uz43ndJ0cX74uni5czY98n65PT3xXdsa2JgfURTQ3xma2xmc8LM8cJCf2V2cdb3xNtRTGdhf3HB3EBNfmMUaGN/xMDE29dHQN/S+ubN9tNJYWZydM3D1dBdfG9ld93l/OT8xlZRy/fm7+zj+vBQV8734uDh5dtEc0PQ8uzv4/j+8Mv65u/u4fRIc2FifUfY30B8ZWBsZUjb8ffMWE1KcljFz/bGcX9/YmdKWdNeSWdvaBVsenF0d3h4f3tI1dLJ9cNBd3FkeEFSVldCeWRmeVjZ+ufl+f748+Xi7+/u4P368cDy+OHj7OfOwFbR9+Tk5uH/+/L94uzv4vvITnFlY2RxfXp6bGpoaWd3Wt7f0l5MTklXz8xXX0V/fXZxV8fPxVh8bGJgYXRHS3VAcHNT08v//vffUUhLSnxFX010fWFtenJCyfLy9Pbx9fn65uLm8vbN19jF3PD5+vLIxdDPwvT5/PL+8Pf45uPt6e368MVZT3F/dHdyemZgZntxQ1Xd3NlXR1hX1d3B1FdVW0ZPTE9aXEl/YW9ubWJhfH1/dnJzQlbX1sXbUUBxcnJ+cnV2c3x/eXNIU9j2+f//8+Tm4O3i7ODg4fnz8/zz8/3Px8/K9PH9/Pr6+/n45eTj7+Dn+cvBXE93c3lkZ29vb2htY2V6eHdJS0FSUd3RU1TX1NZXXlBFdX12fWV7e3t7ZX9IQkhORVjW3tvS39pZWE92dUh0fHR2e3J9cV1UxPXyz8Hw/+fh5uTm5v77/PH+y9rV1VdZ2t7G8/Tx+uDk+uHm7ezt4ebmytpTTFpDfn5xfmR6e31KdFtfVV9KWV3X2NnDzc7RX1xEXkByZ2FmbWBjYX55eHl2c3hzQkFcR0FWUkx0T3RBT313cn16Z3NJXdvJ9P/5++fi7+vo7unj5fnz8PDw2lJXV97ZwPH8+f378vP8/efj7Ob55PXdV0dKf3ljbGloYmNmf3RAdndLSllGXtHfVdn03dJQW9zRUkp/f2ZmZHp9cUdGQXZD1VPb2c3HX1tLcUNNXkFIcXx8eHN9WNja2tFU1MH85OPm4+/i5vj49cvA1VFTSEtJXdj1/vrm5/r4+/rm4eDt4Pjw9Pf398pZdH1kY2Blf3JOXl1QXlLZ9fHN39JcQk50c3J2cH99c3thYGZgYWBnYGZhYGRwTHddzdheX0J1c3ZzfWR6fHp+dNjG9vz98fP85+zo7+no4OH65uf68fXA1dZV0tfbzvbz8PT++Pn64+Dl4efl+fHLzV9xcH5hZ2dhZn52d0FCQUZGWUVY0NbTUl5aSExPSUpJfmR8eHpzcXB0S3R1cHN3dUdY1drb3sXd2l90cnJ+ZHlyd3RX3sn1zsvx/uT+/+X+/vz8y8DAwdTZzN7U3tjF3FjYx87198/x//vj6e7g4OT6/P3DV0h2cX1zS15OW1XQRFhNRVfcU1PS1tRXU0J3f3dxcGRnZmBkemRgZmBmemVkfXJwSlJQUVNdRU9MdnB9fHZOT1XHxM//+fX19/H55+Hj7Ozi4uPh+PD0wFRfU1xU28vP9fL88f3w9/74+ufm+PD9/PDJ2NdNc3JxdXdJcH1zdXZzdE1xTNBWVNZQREd0f2Rlf35+eXhze3pzfXN3cXNLT0ha11FZUEVPREJKSEpJTXdLUlNT1NRVw8Lew/f1zfz65Obm5Of+9sj1wNLcRkxGREfW3Mf2/fb9+fn7+uTn5/788/z29srFx9xQ38zQ0dRTREVKS0h2dFpW3MnA39HXdXN+ZmxibWlgZGVkeWV/cH9/d3Bwcnl3cHJxRUJ2d0N0S1td0NnZXFbQ08XLz8n1+eDm4Ozs4+Hm5P3z98jG29jHxN1QVMXa9fDz+Pvl+v328Pb1w8jM2NrE2lZQU9VRXnRDXnZ2dEx0S05LT0dT3MXVV0ZDSnB+ZGZmZHt+ZHp8cnZOTV9UXUVRXU9GRkFZRHZ2cHJ0XcPE39NXUtNWVldV2cj+/f7/5f798PHK2sfE0ExYVtZcRE5d3MDy5eDm5Prn+PT098P0//j88Pf39vHzw9hdUtTcUEdG0dZbU19eR1FWV19BcXd2eWRhYG1jY2JjZWd6fn13T3dwS0l9e3JzdXdxc3FwWF3Z38XN19/E3tDYxvL75f7k4ebl5uf4/Pf++fLCwcLb1V9LQ1vU9fL++ebk++T8zsHf09/e0N3FzvbMyc3dQU9FTEp0c0lFTHZKXEJZW1ZYTUxDT3x+f35nYWFmZn1zWtVEUNnYQENBSnB3d0p3cnVeUNDe3dFcVtbQW0ZcxNPO9cjJyP375/Hy9vbOyM/OxNBSVll2WkRU3cjy+ufk5OTzzvD98/L3zsr1+Prn/fLyzMTEWUxZQVPQ1nFMXkZe21VGQk9NSXZmZ3tkZ2dsb2liZHF2c0NJd3V2Z3t6eWV/ZWZ4S0bVxdXTUNVQx9VR3Mnx/v30/vn45+7h5efh5OX/yM7LxdbSQXVB3srw/OXk+c7199DSwMzYzfTMyvLN/f/c1dVeTE1NdXRHQ1BYcUpdWFTdU0RBR3NIdmV6c3pkeWVnZHl5RVNeU0Z3dnRwdHdzcE5xdkNBQ9ffUVRdW17WXVfT39L08cr8+P385Pr4/Mray8/Z2N1aTEBDRdRS3Pb5/P7/wvX39/H89fT9/Pz68/b++fj9/cPH2NvQ2lZBX1tBV8RU0NLeWFp1fHpnYWFhb29iZ2d4e3BKS3BKcGZkenpme2V6fnx8RkNIR91WRNDc0lZU0Pf19fPm5+Ds7u7v7Obi+/bK9tvT3NxfXVxZysXCyPRTUtPc1tzT3vPGxvXz2svx98/OxN/009fWU0BRWUZCXE5TyVTb0UFydUhzfH9meHJkf3J+eUlEUtVdcEpCcXd2cnxwcHNxdXlIX1PUXERGXdHW0tdWz87B9P3w9uXm5ub/9/D029NWRU1BW0FeXdzN9fbxxVlY08fcwsjw/Pz55OXw8Pj5/fn7+//y98jE28DJ0FDf2N/Y2tZScGdkeGFsYGZmYWdnf3lkfnRwfHN7en5kZ3N8fnNxen9JT0JbXlHRUdLf2d3N9/74+v/n7eXl4ebk4OHn5/rAwc3QVlFZQlXbwszFWVFQTXZPc3BY18PKzNT198Lf2NfO9v35/87U9MnMy8RBVNnf3tpFQl5xcnNkb2BhfnJ9eHdLdUZecXxOS19EdGVwdkld1HByQEfT1Fldx1LW3lJ2XN3b9/H38vrw/PL10cz39/fCUV5GS9fQXEtQ1Mnyztzf1VRVX0xzTVzN8//0/P38/fP08Pr45uHk/OX6+v779tDW3NHV115bQHRlZWJraGNnZGV6eX1/fHNlZmd+ZHh4Z3pyf3RfdXJwT3VTxs/IyNzZwN3b9f/94ePm4efy/uX98PLL09BUU1TQ0MTSUdbb28L3w8XTTHdOcn1IQVve9cPIwcXO8fXy8MLN8fHx//D3/vzDx9FTX9/R1l13eGVjY2R6eHBJdk9bQE1ZQElJcGdlfnlxQUxBUVpYRltPUN/YxsdUXNZV0dv1wvP98vPy9MDLzdjd10hxfXdIUllaV1xZ2c3byPfM0NRPcU5GQd3DxMvx8/T55Ofh5+Xk+/z45eX64OHl+/3Mw8DX0tRGeWRiaWlsY2ZkZXtkeHxxcnNxcnpkYWBgZn53RExJSUJLWdbCwMvKxtHc2cfI9uXn5uTm5Prl5fP0wtRFQ3RxWFfV3NlSUtXT3Nvb0FRFdnJ8eHJNR1tWVllc087//v7+//Lx8v78/OTh4+bk//f3ycvCVUx9Z2BgZGR7eXl/cHJxQVlaQ0FJc3x7ZWV4cnRMQkJNTlxU3c7AwMfc1FfZwc72/fj+/PbL9vXG31NOdH57fXZxQkdEUlRSVtvFxN3dU0VLd0pYUdzc38DCzsv55Ofm5+fh5frk5uDm4ePs4Of6/8rN1kFyZGJubGJhZmRgZGV6e313dXB+eXhnYmdmZ2V+fnN1SVDE2szw9cv39MHMyPzl+/jn4OHn5+f78cPAVUZ0SE50d3dxdnVJWdDTxM/SUVpFdXxwTERFRF5HWlHQ9PHx9vHz8vL45efh5+Xk5+Hh5OTl89pVT356ZGZle2Vken57c3VJQEB3cnx+f357c3RycHd1SETUwfX39vDxy8z19vTx8ffz8/36/Mj0zNZEcXl7ZWV7f3hnZHt4eUNX0dvT1NdASltHQFXZxMzNy/bz8/zl5Prl5/nl4+zv7+Hn5uX4+/ny98rMVnV8ZWRkZmRkYGZnZ3txdnd2f3plZGFlf312S3d8dHV1U9vYy/H08ffI9//y8vLz8uXl5OHm+vPx3lhfRUtDTHd0dnJ8c3N2R19BSXV2d3N4f31ycUBAQFlT0sDNzvbx9PXy+Pvk5ufk5eXg4frk4OT89cfYV090dn5kZX95ZXJCRF9aQkl9en1/fn13QERISV9SUVHG9vf0/P7z/v74+vDM9MjMz/Tx9vTL00J1cHJ/e3t+ZGdnYWFlen92c31yfXJwcnVMRURDRVRQVMDI8vz4+/j+5efm5uHj7ePm4+Dh4Ob69NNdUEBwcnR3fmVnZ2Vke3R3fnJ3cnp/fXN0cXB0d3BOXlLU9v/8/v744eT64ODm5OT6+f7l5uDl8ff10FtdT3VMSnVLeHlwfnlyd3N6Z2ZgZmd4d3d6eXd5ZGd7dnVxR1hEUN7Mys72+f78+eXk4eHt4//z99nVRVvc31RTUFhbS0haWV7VUVZHQ1BVXVtAQ0R1SEBb18vz/PL28Pz38/rm4+Tl5uX++/L3zVVT1099dnd1SHF/fnpnZXt6fk1YdX57e35yeXdFdHFFQXd2TFPX1FDWxNVTxcn29PfDxMj2/uf5/Pj8z1NNf3h2T1ldd0tZREpJXVJbRUJOQ0tDVtJcXFZJcnJ8Tdbey/jk+ufn/vrg7e/s4uDs7uPt4vn88sPY1F5UwcXT1Edwf2VnenxycnR8ZHpmY2VlZX5+e2R6ZHt/eHt/fnxwS0dV98j3ytrBytrBwcXbx83d1lpBXlVeXVtcU1HdxvD0zdrfXFJdUdXc2MHKVUBLQEdTVNrP8vz45Pn7+ubl+vn65eHm4Ob8yt/XdEtAUdPY08Pa1UZMWnF9fHN9cn9zdEl9SVFOSnJ9d01IRVJZdktPfHF0QVHY39/PxlHE2EVbR0RfQHN3THZyTHZ6emV/SlhGV8dXQlRQRdVQVsfD3MbFVl9XWVXR1MPw+Pvh4uHn4OTk5f345+T/5Of99vXGyM/A8f3/8PPzyMzbUl1Nc3dLSndEWlpYT3B9emd6f3B3QXZzcnhlf3llcnJJRVNe1lFfQEFJcEtLQVlRXdDUUk1EdXZER1fb0lbTVFxGVEdHU13Tw9BW1FJeRdxX0dje8Of6//7/8PTwzMnK9vvn/cr1983AytrFxNrN8dnWwMBSXlJeV9bTw/LMzPb229nR0dRRUN/PU0FSU0RSXkJOTkPQ2VhIQEh+eWVmYGFmf3B4eHBzf3x+fHdOQNLSWEJZRE1NdXBxS0xV11ZW39Dd39ZS19zH9vb09ffPz8zA2sv08f7+8vz4+ufm+v389/P98cr12dnG21BR3NPDw8HGyMPA3NZCXlFf1FNaVtZCX1ZZS1tHX9Lf28/ZQ0BBQX5/eX9xd3N3cGR5cHxlcHNaUVNc1lBFU1lCc0pKTUlaRtZQdExcRUZRXNHX0dDeWklNW0dLTUBEUNFVzMDE9fHE2sHI9/Dz8vn0zs3x8fH8/vH5++Th5fn/+vj/8czZyszNzdvew8vH2MzE3/XCwN9TWFJZSnRCfHt+enx9ZWZkZGdlcmR5cXRLd3h7cHRwdkp+QF5cXURLRV9GRFtFSVRd3MTSUdBdXl1VUUBUXMHKzMH0wcnLy9FQ1tX0ztrby8DKz8HQ1tLF8vH38//39M7M2sHS2vbDwfT1yfHx9/T3zfP68Pb3xtra1lJFWUXS31tBRHVIQHV3dXB+SnB+c3F/dndxSk1LdFleWVheQFtaQE1KcHFNd3dzfXx2dnd9fnN1T0hGQV1YX1NQWEZT0d7Fzcv2y/Xz/PDw+eXm4+H6/vfx//DO9/Px+f/w8P785eXxy/f3wvXOy/TK2MbbVlXe01bSXFhTQU9X0VhHTHJ8f2V5f3p5d3B5fnx/dkl0TV5CQV1ASkRBTl5eRVdcdUJSR0NeXlpQUFHSV0ddVEJ0dHFwSUpORE90QV9FXdTaxs/awcPb38H1z8nK9s7w/eTh5+bi4uHm5eX++/3+88jPysrDwMPL2sHdwMTSxcPZ1dfS11hSX9rZVldeQEp0dHZwQk5ZT319cnN8c3x+fn17fGRneXp+fXJ/eHlycU1OQURBRkNaRENAWF3dWUVcWdHf3tHUUNTc2dDW3dvH3dve2MD2/vr6+uX7+vjk5fv74eHn5Pj5/v7w+v/09/3xz9tQXlFSQFNDdkpRUFZSWkReRUBWX0JGU0BMS3RIW0FNRUx2QlZW1lVUVFVETHZ9endcWk50SndKcnNwfXhKQk5xfHByfXl7ZXpncUZaSUdGR1lc1trBx/z6+vDw8/f18fHx/Pb45/7x/fz75OTl5fvz+fjwyfby9sr139Le1s7wy/Xx98rNwdBRUl3X1VtHQUdLdn1kZGR6cXF9dnZ2f3p6ZHhxWNZQWV9aRktIQU1a18Tb1ldUX19PTkh2c3dKcH95fHJwfnF0dktR3d1V1dnBwtr29s/D9vTx8fLk4Obl4uHk/vv8/PP8+PvaXtRPdEfX1djFx8/DU9HEVNTD9vbJ8Pb881FW29Peys7PzMDc98V3c315ckReRHdKc0x/ZHxweH1Kc3R9cHJccX13QHV3dnNzfXFzRHlleH5lcUpPdU9GT1xCXFZdTVzd2dDN8Pz68/37+v3+5+Dh6eji4vvy+/3x5eXl5fr8/f/2ysbY0Nra19HGVFBedklYRVjb3N3E3lTQX0tJRHVKVUFIdUpwRkJNV9VAWtNQVFNEdU9zfXZyZH9LfU1HRUJaSnBKcGV9cmV/eH5+d3JwR3FzQ1tH1t3TVNxU3c7d0MHJzf78/ffy9ff8wvT75/nn5fjw9s7w997C8/nw+Pn89PTD9/bL9fL//OT4+/P13s3C0NTY0VHRQXVzfXdOcH54cHx/T3ZyeHh7fH95eXJydEZOSHR1d0dcTEVfdUZBcX17ZGZlZGZmentKRE9KdHV0UFBaUNLT8/z39Pf0wvj+/P/7/ODi5+bm+vLm//3wztv3ydrXU05109XW3dre8c3T3cRaUcHFyd7Dwvb3wsDPWVDJ0NXXREPVRXFMd2dzd3ZbdUhCRlp2RUp5T09DSH11Ql5WW9RBdk1JSnJmZ2RnZGR4YGBgZ355fElCW1pfVEpIQNTG3sP28v/l4eHl5uDt7ODg4ebh5uX/zszE9fTx8ffPw8HY315TUVRcUFRFWFbayM3A9fHJxMPeRktJd052eXxJcnRcQE5LS3VFSnZ9cmR/TnF+d3B1XUlF1VJ2WUR0cn16cntjbG1ibHNIdHFweHd0dXdGdHdW09jG29n39/z74eXn7+ju4Pr45Pv4/uXz+ufk+/VW1dJU3dbUWdTW3txXQNPDyPL88cHz/eX+9N7Y1Vfa31xa0tLK9tJCWE1d111KdEdHX19we3FyQNVccHZBTk53ZWFibmBnZWBmZWZnZGlramptZmBgfXd1d0ZPQF7S9uf48OTh5+bt4ebg7uqXleqV6unp7+f/8f/95c/EwdNNWNxVVtfBwfHGwcbHVd/FUFpT2sj99PX39drPwdNHRV5ZUEBeVllBVtZTWVhEXFNYXVhBTUx3d3R3dEZZWFJETE1LeWdgYWZhY21hbWhvY2NkeHdaVdbe2dLQ01bXw8DO/ODj6JWV6uru7OLn5Ob7/eX9zcjyyvTF3MPIwvfzzsLYzF1bz9/S+PP67eLm7O3k/vL8yvDGz/RecEVJd0tzSVtdR9NUd3t6bG5paWBhZnhCT3V3RnV1cH12c3llcnlmYGVkf35lSHV2Q9dQXlVSQ1pEUcfY2v3k+eXi4uDs4O3t4+bh4Pv98ffx/vX8+/338MrXRkBxeXt6cXZ1RcfPw8/2w87MwvL+//H5+fTJys3z9/T4/8razN9aQXdlemZjZmZmenxlZXFyZXh5fXZ2fnp5eHlzcHJwfnlzfGV7emdmZmJsYGR4fnBB2NrB8P398vD08Pz/5ODj7Ovr6ujs4+zt5+bn/vz/9dZXRVjR0UVX1l3d29NW0t3ewd5X2cfXV97Sw8PcxcrKxsnb2NPVR099fXxwcHBNSXRCW3R2f397c357e3l+cHdycH5+ZXd5ZH1yZXl4YWFhYGByenp0Q3VW3lfVVEBGxl5a3d7d/v7x5+3g75Tu6JTo4e/h8vz68fP8yPn49M7O1FfdRXdfXEhTVUVRwNj3+PL84eX/5v7N8vPZw8BcWdd3cE18Z3pkZ3N8YGd6bWFlY2Z5ZXlLdnl1TnNaXn52RHRwdHhlfGZgfHZ/Skl1SkNzfEpxfkhbQN7Y3cL99/Tx9/X5+ff++/v9+v339cnZ9/bHzMjP28rH1tFRTVlVUVfe3dz++PDl5/L6+vH28/Xa9vbI9svcy8jczfHD0d9YcHR8Zn5xcXB7Ym1mbW9nYmttYmNnZWBgeX95cX54TURR3drc1tNUVtlQQ1XCw8Pf2drFwcv9yMXGysjO29vE8fbx//f18vj98PX30d7V0VNKeXdPdnZ0THBBTkZHQ0rVw/by8v/85Pj5//D84+Li7e7s4uzh5/NXV8DX1Nfa3dVedHVKfn98f394emR6fGR+eWF+eX9+dnZ/eXB/fGVhdk1BQd3bxfXxw/P9/fn//fD7+fDy/czxyvf88vD2+fbH2NFfUUhOW11cVMr0zPTD3ttU0t7QXl/RVFfeVFtd0dDW39be9vfGzsjI9PH9+/v75eHk++T58/L6+/DMwcXA0FFURnZ3RFtbRVpGX1t2c3Z3SkxNTEJBUcfc0NdQWVNQQXRIQ0tARFhaQk9GXlhc1dHd2tfUUVHVUVRUVMfAz/D2zNDT1NFXWlzc11TS0snPyMr2/P/k4Obn+fzx9PDIwMLYzfXP8/LyyNJRVl1QQVtfU9xU2drN2t3GyNvMw8HEU17Vw8bSQk9aXUNNR0dPWlFHQURCWFRNS1jV08zH29va1dTe1FJXcWd/emRkZGVwcnxKRnl5cHJ8fX1xRUZKTVRGVcHf38/08f79wc/21dLDzM/O9f3y987+5fXx8vD88vT1yszFw8XB/fHLwsH1zsRcQVt2fUt3R09LUddeUtn09cXSUtlUX1NAdUVV2NnfU9bYUFlSWUpOdHNnZ2F6ZGN8R3VJTEteWkVkZHx3TnRlenx9fHt4ZXF3RcXCUVRT1VxEQVrZzvD45eXm5/r49tjB9fX0zNjH29/TVVTUUdTF/f73ycDMx9xcRE1E1thdUtfU2NdST0FBX11Hd3Jd3FBxfHBFQUZWzfT8//bKXnR1SXVa1t/D9M3Z105wfHhmZGVgYGFnfmVvbWdmZ3N0SFpPSEB0Z2FnZ3hKcE7b28b331jTVUVTxtDB9sr9+vHJ/fXN++T+4eLm4+L9zsje3MvYVfbz9/3w1F1QTHdEdHJbV1TX1nV/fmdld3xL0VFBdHJ+e2RkfXVLX8T18c3R2tFSUNZRQkdc3/XWUtRe11fQV97MxsDAQnVxZ2BjbW1kfnZQVEte1UpPQ3J8cXJzUFl2UVt1QUNIXNjey+X328rH09xdVcr28+Xg+Pnh5/rk98/w8Mv45P36/PfCx1Pez8fVydxBTHV8cn5lSnRMX9Jf1N3eVlN3eX9nZH5wf0pPTk1ad0xTR0XQ0tfcV15FQ3xPSX9D3dj1/P7/8/bU1Vt1RV9SWdDW1sVQXldQVsz3/fPM9cJdR01SU17S2sv1w8rAVNjcUFJR18X0w9zx8MTLytna0Fb08cjO+vHH98jAwdjSyfH0/+DwyfRUTXRlekJGTdTCWV3fWHVDc1vD0FtRRH9+c2RneGRM0sXE8shZW0Bxc3Z8Qt3X0s7N1sH1w/H39frh5eT7+PPw8MXf09LH9vT/5eXl5f3J39ncxtXF9MD239DSUnBCQUhAdHVGXkhFUVNzRlrXwc/08fzOwdVTRdbRws3z+Obg5OXw98H39cvAwdveXE90cnl4d0vUU8fK8czf1Fp2ZXN2dHZJR9JU0dZeREdX0N5d1snwz9/AwVBX0dj99uXv6+3g4fn09PX2+/nk7ezm+PXUXd5UV8FQV/X3ycvfcH5xfUFVXML7xEBLfGJtZ2Nlc31S89nZxNnfzNhVychUwvLC9PXfWN/cwvv6/ePn9P7xVVpbfHl/e2FKSXRdQk3UV0pa11Ff8NzQztNOSnd9XcfC8OT2/eb9z8JVRt71xcrl8vrl8PT0xt3198ny+cr/8sFSUVhD08Lax9ZIRkF3eX15fUhJcVtUXtnA3ExFdXN3dn9zf3l9cWRncHJ2W1Rb28zZwffcXVdKcE5PdlbQ3//h8cz30UZcVktbUETWWWRnZGZkdnR23Mff9vLTU1xcRdVWUff1yf32xszWXVDJ2VXNzMPCV1tbQdTW9dvX31tf1VdQXFNRQVBQUNXS9cXawFFGcXx0cHZKcEp/Sk1/cHd0S01CS3ZMc0t9YWJpampraGJ5cH5FSXFwcU9DRlDR0tVax9LFx8fA8/n4/P///Pv1y9jb1tRbWFFSQlpRXFh1WtTdVdvTVlFWUVfd1tVWUlheQUxHUVFadHl8eHtld0NEVcTCx9REU9DQVt7Q2MzKzMrKwc7D3tLEUVXE30xyeGV6emV6c3l8SkJLd3N/S059eXphY2Njb25tbWZ7eXNNT9TPy9vczN/PyMnN9vH85ub7+Pv+4eb68/DOxdjA1tfH0VFDdXxwc0fX105PW0RHTk59R0FJWdVPWVxX2VJAW1BDWNBUd0TSW1zX3FfTzfzIw93V38RQ1cRX0dnC3tpXVtHZRFlZdnR0Sn1Pc3ZFQXNZUkJa3dNAXHd9dndlcnthYXh5f0BNQdj02/b2ys329fT98fnm+vb7+/Hy+vbw/vX18cjd0V9EWUR1WlVY1dNBSFJCQlbR3dvNzfXbVlDa39HEwdnAxdHMzsHb1E1ERnVLUl5a0VJXxt1MX19GWlNZwPHF9P/88fjyyPDN1sbP0dHRTHRESk9X28fx/djOzURwTHJ7e3h+dUpySE1wSNPTV/bx9+T+8M/I0MTM8/T45P7k9PH99tHB9srbx83E9MjxycXb3s7B0NNRU9zH2tLd3tHa111UUdDQwPTK0FLX2lJZ09zS3srPyNrS3d1W3cXT28XE01BGTkNfXc73/Prn5ubn9cTeX1vW093Q39/T0VBU1tLD8MnT011Nc3ZkeH54dURNS1HAyPny8/T7xvTHyd3xy8728fDy+Nv0ysTdz8Xawc/1/d9W2vpHzvDY/PfXWlF8fHRGXlBe08PQXtbdV1XHwtjEws/Z0MDL39PP8fPw/PD1wN7S215NRV5U1Vx1XNxdw/D3/+fg5/3x9M/f2fbETV7F0t7c09/H29rOU0hMdnRRWHVzTExF1HR/cHVNRUVTU1te9fLZU93dx/Dy+f3KyMrHX1JcX8Lw9s71w8jywNbQUNbA1k1LfWdyTndzd3RDXF1Q0lBAVFde1djXxMrPy/bK2cLBwPXY08VQSE9HdnZZWllZSnZIQULW2tPMxlTQ39bVVNHFysj2/MrBxdPTVHVzcnVIcHF0Snd/cXR1X1XY1ldfc3ROdEF0TtHE2sP12EVeWFvZUnV8TFpCSElY3tDU20ZKRl7dUVl0eHF0TXVyc3VbVMfOw9raxMzI0VxX2/fx/Pz/8/38/v3K2MP1wdNwe2d8eGdnZmZ/cnx2eGBnfH9zZWBjZXp6cn18cnJwXVVZ1sHY9vTTVNrN2cvNw/z5+OX/ztjH1MDAQHVGV13H9cDPwlPcwV1TVktPTX5kYGVkfHR5QUdAUcxXcXBkYWViFWlqb2Fwf3B1cn9NRkjZ29zH9cXeyPfK/OXm7uzg4ung5+b65+Xx0tDG0sz32V5JfWRzfmFkYW9tYmJtYWdgeHl5T09lfHxkeXR6ZWRgYWZ8fdXeUt7fX9fI19bfRU9X017QztjJ+eXs6+3v6uzg7+zh+vHZ28nIyPLI28NRWcHTTER8enhnY2JsFWpjbGB5Z21sY21nZGR4Zmd8T1Hd987b9MnC/vL38/P2/Pz8//jl+uPs7Ojv5PLxxMX0zd5XS0NAUFfQzlBFX0tOdn9yYWJjY2diYGVhZ3ZIWFdEd0NMcnRycn9mZmF+SHBc3FnQ2dvy+uHn5+bj7OPi4u3j7JWX6uvg5efl+P/9y9rf11rUWlxdcGV6fGR+cmVgYmJhYWd6cUJJ2vDw98TU097VVtDGU1PU1fX9+eT5/v75+v77ztVFQFBQ0UBG1tXc8PH+/8/Dx9hU1F1FTENe3czL88nQUlNW1dPQXEd2dkdNd3h/f3BDU9reWVvQVFzcx8bYyPL67ezi4uT++uX75OT98vDM8Pj6/P/6/vz4+P/23dJfS0hJTH16cHNb2szxzcDYzfTBy91aU3ZLQUNDcFtQX93E8PLGz8fXWEZPfmRlenFa1s/b11TXwNjCxEbXU1Pc38xV3s3G8v7k4OTl/vzKyPzI28DGz/b28vHAVl5ZWF5ZdnBwckBT0tXX3N/3/P7n5eX89MFR31BAXdzb9fnn4eH6/fnzw9FFdndye31BXVjV0lTG9/3z/Pv88t5U1Ut2Q0daUtXf2c7QTltSXFpFT3N4ZWV/ZGR/eHN1XVJfzdxV301HTEtAUPTL9f/+4+L65+fk//T21lPUUcn38PPDy8/G317ZXHJNcXNxfHZlT9BRx8T1/MLI9vXAxfVSTlBFWNRRVkxHVtDM3s/P3srGTXdxfWFhf3l0TFfZVdzNwsXGytNf0tDZwvD9z9vHxMvAxcRfRF5EXl5BfHxMSnd0QkN/dkJcVkFHfWV4cnZ2TUVIQ9feyv32yMHO9M7F2FFAckpQ3cXG9c/D9fPxzt1fcnlySllPQ0Z2RtHeyNvbwdPY09XeX0d0e3FDQEhIXk1BVNnAX05Lfn5wd3xme2ZgfnJHQHRaS0VVVN/T2tBc1dPPysnxycH2++f798JTW9bbwFTX0kXWxtjF19NSQURHTXd3fGZme3l6fk11SVDcw8DCVUNzc31keHl4enNS1lHAx9TT09VJQVhNSnd1SXZD1kdMWN7ZwPbI3dNTUFbT2E1OTVhSWdzWQVxdXkxA1EF3cXxkZ2dlZWV/c3FPUEx4eX9nZXNycndbVtvw5+Dl+fr8yfP89PDz/8r19snx8fXM3Mnw8cbHzFNS3NRIcHZ9f0ddUtdZVFB1R9BSVEVPeXl9Z2V9SHR3X1ZWWU11Z2BnZmZmeXplSNbZ2vXMU1lZUdLK8PTAw/H1yPX92lLQ2szx8/P09vbDzFVefWR4enRDRVl0SHdzQFDB101LfX1PU1BX1MXM/OTzytjc00FQw8RWUdjH/Prz/czHwNDH8vrzwsbQ2Mv0/fXE19Db8+X89vbwwsnCVFx2fnl/SU1FQnZ3cUpMSXZmYmBtYmRlf3h7eXTezNBcdXVwcVNa38XdyPPm5Pnn/P76+Ofh7+Lm/v/4+/P098nU3cbDyM/EVdfZyF5IQ3Z9fkh0cV1eW1Zc3Nz38sFFc0NDTNzF0FdQ39LHxtzX197ZVVzSXUlbVdrL8//3/f3/++fi4Pv29cv2+/7L2djOyfb39NvRVlNfdH14ZmBtYmdkdnh4emdPVsHUR0hwR9XF8/P28fX+5eb6/fD38Pv8/fz19NrHyvf2xsjG1vXx/PDP9NFQ3cry3NrZ1MzK+P318sjay/DPX052f3NCUFxGW1l2QdrZUkpbdHB1TFxITUpwSFDA2NHbVND1//3Dy8rOzPf88/Dx//jk4+3m+uX+zNLQ3MfT09LG9c7A28fG3NnO2FVCcn1xTENATXdNRUXc1dVVQFBR0dRQ2NbY1F/DX0RcTEVCVttc0EVDX1rK9VfBxMbP9uf85+b/+/Pk/1DewcXc0P7MwPXE99LHzHd2cWRgbXlnYmFvYm1lXn1lcH1/f1ZWckVfXNVW//TWxsbPxvvg//vl/8vO5/rFVtfE3fT78v7/8srL5/jYW1HXVNrw8cr29d9e9fDZU053ZGZxdXZweGRgfkp+YWJmYWd9fWRmZHt6f0pHWE92fHt1Vdva2lBSV8jz8PfNw8P39PLl4Obx/f365M7eW0LWUNLYwcdLT1taUF5Zc2BmYWV3Sl5zeHJ6SlpPcGB9dHh0QV9/ZXB4d1pTVnl+dX1D3creTFBWUfTk5PfO/fL44O7p5uDn/fjg4PfHysfby/r4zthaSHBKXH1nbBVqamFkYmNuahVseWFiYWBhZEzQXER0c3xK2dtQUExxT9X/8PX11lpe8f7L88JQVMX6/v799s7I+uTw9sddVsLy++X+8VFIVsPZVF99YWV/cXRwfGZsY2djZmFoamhhZXlweXlnf0JBWUdOd07SwPfl5/vP9f7l5ebh5fjk4eLi7eLl/vPx8/DPV1nU1dHIz8HWW15Md3R3cXple393cU9LcHZnZmdmeWRleWVxdENHQEFBSEhCdUpydnh9QlPQ0FhPTdHR2svy4fry5ebs4uDh/vvl5OX7+v78/Pjk+v/10U12dHB/cnJ+f3hlcUpIdmBvbW1ubWFnZmd4fndLd3d6fFhNXF5dVEHd9Pzl8/HcxPzz5Ofg4vvk4Ozu7ePywfP9//rw/v3y5+Dh5/7BSUpKdnF/cn5ySEdYSVBEZmZhYWJoY2FhZH5IdVlGf3xydHRzQ3VxRND2yMrw1t3DxffO+OPm4OLo7+Pt+v7/9fXSzfTD8P3k5/vlw0VNSkt4f3N+cV5cQE1fQHd8ZXthY2ZgZ3RASHZZSXJISkRARllJRFb0/Pfg5/TIw/PM8eX54e2Vl+qV6uni5uH/+fr08uTt7Ofn5PHP0kZxeHlnYWd9QEtbVUd0eGZsbGFsbWF7SHRGWkZBSUJwSFFLQ1Ld9MHw8czM3dxJS9zW3PD+5+Du6u/u7eby3/Xzz/P/5OfslOzh+//ERtPRRlpf1ElG2FVcW1xxY2dkYGxjZ21hfndxeHN+YGV3TU1b3tHR5O/j5ubh8vT75efj6OrulJCQl5SU5vH89fXKzcdUxvj68cbBWWRnfGRkcHpkfEleQklHd2RnemdnfXB/e3Vec3VNeGRhfnF+SnVxSVD1yMj31UV1TlZR9P774eOUlJWWle7i5Of55OHx/Prn4Obh+/TfQURBTFlwen9wdX52d2Rgb25pb2FgYXh7fXhxQn1mZmRkdtRRWtz2/P7n4eX3zMVSRc35/eXt7+zolJXp4P7C0Pb/yMrz+P767OL8xFZacFhUS3RwTnd+dkp+ZWdjFRViYm9tbWNhZHFkb2lpFRduZ2d+S1TczOX2xdFeQXde9Mj2++Pp6ZeX6ejv5P3x/fzOyfX39fLh8MLHW0pzQ15GXkpNRndRWn54YW1uaWZgYWVneHp5e2NtaG5oFWB7e3J3VsL1+MTSV3NIdk/LzvP45+nokZbqleLn5/7n+vbD0M/fxvHB2Vp1SHBKTkhOfHFKfXR+YWIVFRQUYmZkfnZGQkJJcHlnZmNje05Mc0fHyvX0z9xST051StfWV/f45Obj7eDl+fbKx8T3093D3szx/vnC2dna19bGVV9aTkxxdnRkZ2BuFRRsYGF8eXNCcn16Ym1oamlkdndB1Mn85eTl/vzJ2N/G8vH85efg7e3t7eHn/PHwzsjPxd9X0sPYwVRZRUhc0NbG2tZGSlNJcXB/cmdmemVwdEJbTd9TfX17emJrb29hf3xLcUdVR19aTXJmfnRJ1M7z8uTv7O3o6ujn5+Hl5Pr899r08vD4+fzE38rJyP3K1EZKTnF8c3pjYmNhZ0zRWVhZVFJDd3B4Z2BmZnh0dEpE2cfX1NxLcXx4cnRQ3N3B/ef6+uzm+OTl+OTn+Pbw/fjh4e7u4OPg5uDi4/nwyFVfXl5BZGNhYmBmfXBwcH54fnxmb2tpFWppZ3lkfEHVx8HYUEpXRndA18DHw/zn5+Hj4eX6+vDw5/v3xd7Gx/Tz/fP8+Pr64OPk/f38w9jA2NFZT0xJWVRU2MXdVEJeW2VmZmNib2Bnekh9enNY10F9dk1KSFtWVNjH9f344eLi6+vs7OHt4Obh+/rk4eLl5OPk5uDt7ebl//ffRUVweHhgZ2Vle3lcUE1edUxPen9haW1sYmFlcWV4cnZRQ3ZLdk5LTl1VzdjVxvT4+vri5uDt4+zj4+H//v/k4ufi4frg5eTi4ub2z91S0lxZTH53cUpdVsPWQFt0Q0FyeW1sbW5kfnJ1fXZLQ9vdX0x2dXZDU9vF0N1e0+Xl+uX75OTu6eLu4ffP9vrl5+Hl5uLv7uno5/LOU9zVUVl8f2RhenxDdHh/Z3p/eXliahUXamlvbG5sbWB5SlNZSEBIWVDf9NjH2VHdzfjm+ufh5ebj4uD69NrN9fD6//P9+eT44OD898zG11LJ2kVMdXdwTdVXXlTY1kbc1nBkYGJibWFgb29tYWBwRXxlfnN8Z393cnZ0SnJDwvfK/+Tn5eHv4uPt4uTn4uPh5uTk+/jh5fHzyNBcV1dLdnJ4ZmJjY2Nkfnl5eXJnYGNjYGJvbGliZmJne3F0fXBMdXR0S3Z0X0tIR1pHRdj9/fj/8M7Yzs3C8P3J28P0wMry8/fL9vz8+fvO1dnGUVZUUXB6cE9V28nUcnR3eH5kemJqa2htYHt3ZHpIdUdf0dRPWlPVzPT+zFDE38z/5uP/9PbO/ODs5MjyycTGzcjeV9VTUdzLx0p3fHl1RE1weGRnf0TOzlZGcWRlS0VwfnpgYXpCXENJf359QN9cXEhkeHPc9N3FRXVB3/vy/uTPwMz/4+fm/NdGXPXIxfHRQF/Y/vzy9UR0dlTZT15wZmZ918HMwEt6ZEnWQVRXdGZlT1nRzV94ZUrS3/f3VnFL0/H45/zQSFXx9PHl+9rE8P7m6e/lwsr+/Pvh59hE3N/D//jGfmF+cHR+emdiZmV9X9JSem1hZXZNdXpgZmBkWsH1U3lxW93K8s1bU9nb/eTk9FNBWNL0+ubx09TH5ePj5PLO1NfH9PPA011dyPL5/MHYWl7B8PBXWFFJXszDzdV1fnxMX9NYdXRhZkpZV1hJZG1yQU5Ad3R/f1HJ8MXZ2EHR/efh5OT2x/vi6e7i58jA9vjk/P7OUN3w/PbLwE90W1TF1lhHcXPf8fTc3HF6c0HGwvXAWE9C1MjEz0V4eH5IQk5wZ3p2W9vU21x3WVLBzsXFQUlAXPHy+/rexfX85uHi5PL1x/bz98JZW1bXyc72213S2PfwytlNc3J4fXZeX3R1cUfb2vTbXVhwTE1XUnF3dUJUxMHFV9fTw/X8+trT1F3c9fj69cLZxPbx//XawV9EVtHcXlpNXtrJ9snHwVBTw9rQT399ZX9MUsbS1ldEwvH09N9SdX10TEVDdnFxT9LaxMz1wtbI//3+99JbT9DcwfTax0VZy8z0w8RTdlNFQFZJdnB+TlBc0NBedkTUUt7KXXN9c0nRysfMRkfF28vx9NxISkp3WFtdTV/Exfb3//fWx8Hz+fT81UvX1Pbn5+TD2N3I+Mj9w0xKeXZPRVB7cHVx10FOR35wcEFRTEZ7Y2dgfURRVEp9ckP0/f/1UEVxQNvYyNdOTU/Xxs3M3tnV2/Pw8sJfRkXeyv303lNCQ8b++PDBX3dCVsXH0k90d03dxNZcRHV3XsXcX3BkZ2RyT0BJdXJ/R8LxwtVTSHF2T0F3fGd7cMD/8fbCw9vw4e3h9FdNUs3L98jEwFxU9Pr699lRR1/Rw85YcHt6d01EQXZMQ1nCwdlaeWRgd0RTUXFyfX9fwc7I01B2c3B/cnhmYGxkTV/XU9FcSUVNWVN3fn93wMvG2NHfU8X+5OLm98NF0VxEUEVadkzV2MbL29zX0MbTxNB1fnl3SkZdXlhOWff+5fvxzUVDdn1KdXB8cktARcTe0ldcUUhNQEx1cEFS2/f1zNze9PXz//TFWV1fUcD09NNFR0Fdxd7XQUZFR1ZQRH1le2R+TVzaxdLKz//h+czWX1twRFdeQnBLRtXMzNr02tdPRt1HcHt5cHba98D01l5BW/XAUNVFRXVG9FxCRndyeUdddFHRXk1Q+fPIwNxXTtj91c3yzc/87OLl5fLYQE/eUFzF10p0yspV3cbXRV7OzNnRVl5a8uf19vn019fy983B2t11WNnUVEVLZW1/fXp/fU1yTcPc1lhLdn1U0lfW2M/SwOHn5ebl89zT2VRTWEFMc1jeR0FYR3VJVFxZ0VBaW9v1393HxNjN9vfFyvTd2/f09vDx0kRMdkN9en1+S9bHxtDfRH91TVFbTVJcUMD85ff9/MXDwvHHU9lZSFxc2NPFzdXN9PLJ1MRHSNba8srO9NzM3/T+yvn2xPHx+/HN9VJbREJIfnR8YXBA0/fD98VeW0xdQ1/WdVnayuX4+vzBx9Pc0VpdTEtHd0lxdEB2cnJxX1pSR3VFTFnE9fP2yffJ9Pf1ztr39Mr5+/fb1VVBdk1FXkF1dXJG3sPG1ddRUNnfwcXUy8j+4eDi5vvywsrywNlAdHR0RE1RWHd+bWF5eXZydn9kc3FT3NbH1Njy9P74+Prz+eXk5vj21VbRU9HXRHBmeXB3QExMc2RwSl7B2cBWVNzO+eTm5PL29Pb38fzY0NTUyvP82Xd+eXF2Z3lyfXxhe0XYU318dkRWUcTKxVBLWsz+/8VXRUle19j11tVdUcv/895dSE5EVc30w91XVsHy/v3xwNBSxM7awVt3f39AU1XZ0VlISFtT1FFOQ1DE9vfM2FdaRldX0sXC317Y8c31xVp3fnB+fkhxeXt7dl5QQFt1c09BWd/eVl/S8fLl5+bk8vf/8/3ly1RZ11fU2NJMfH13cHN0dXphfn5yT1hfcXF1XtnN8cvI8fPg7Ozj+PHG3cDYw9NJdXVIVVBBdHp/fnhlZHlkZX1wUtvxyNnfUsHJ9Pv2zMfaz/b889rTRkZS11FYQnR2fHBxd3RId0tETlxdU97fxfD5+vbO9/T09szz/fXJQ0Pc01NYQVl0fXx6cHVOQHdAWEVPRtTR3NxQXVhSXFhdUFfeXVBOQdTXVVpZ1VFHX3RJSnVbSExZWFdfUdJUwMDc0dLZ29DX28/AxN7A9/n5ydra39RV0Pf98PPx9PbIydjW01JW11zWVVhAdU5STUZKfnd8fnx8eX5nYWNnck5bQV5aQV3H9fbx8PH///L4/Pz79fTx9PXE3dxCdmZgYW1nYW9mdVxZXcbww8zw/Pv9+Pr85ODj5uHv4Pv1987VRX9nY25uaxVobGdkZn9/f3ZlTENxU1lR01P0/PP/8eTg++Pp7OfH2E98f3lmYHhxWdPbycfcxMrx8fbOU3R3SEZHTNbUWMf0++f4yklke39yfXhzeXNa0PfP0FdM1fT3+/72zFNdRNXG29xSV9rJ+/nx3Xd9fn19e3h8fUxF1Mr9+Pb95fv98PDN1VXdUkJU3lFT3fHx2lZZemBnemZnfnJxZX9aVNDU2lDe9sz29cXA0ML1xvHx3trY9PD199ZLfX9Adnh0fWVlckZRzP3w9fPl/Pj7/fDcxMre8/71zdPFwMfQTHJ9ZWNjYmRkYWV4d0Hc8PfF9fXx5OHi4Pnn5P/55+3g5Ofm5+Tx98JbcWdia2tubm9hcXVFUklKSVteWNPSQXd8ck9yX9Hd9vL4+cjIydVbWkNCSl9cTEdR19rTXUR1cVpW08TS3tVZXlDdyPTz5e3r4uDh8P7y8f/Lyfff2/b8+/70y1BZ1VDdRXZ1emR2fXdNdk5LTMbEX01/ZGZhZWdld05HTUPT1sXf09rKzvPl5efl8vHJ8+fh5P7y5+T68tpXcGFjaG9gYHpnZXZ1W93H9Mjy+ubt7+zj5Prl+uTh5P365f/y1193YW1uFRQUam5uZmVhe3x0XdTS3tTf28XK9PTxx8za3sPO9PH13VpxTEd8eGR5S1j19sHM1dva0uTn5ezg5OT85PnCy8/a2Vjbyt/9wUZURd3Ydkh9e3F9Rl50SHxmcHdczNPT11fcUND0x8z0xcfH9+T689xNQ3J6fHt+d3ZLRE1dT3d0dERZV8DEysjf2sby+/7l5fz/8eXh+/fXdHBwcXdIdHZ8cHx7dHB+eGR7fHBNWEx0dnNPT0RFQlZTUd3P//r9xNVHQE9GXERZ1FTZ9P/h4+Di4+3i4Of20tBHSkFLcHFkZHt5fH1ER3F9d3BwfGRyfnlZRdDEzfb09vrl5eXn5vvK9ffA3V5dTnJJTUtISk1HfnB0fUhJc2VjZHh7dE3RV0TUzvfw+OTk9sryysfI9fVXV8XXxM3NwU9DUnF+d0plaBVjZmR6dFpzdtHewvf/5fj35ODm4uHm/MLxys3w9vfXSN/R391MWkl5dnF6eX5mYmB0QH5+dFlxfUdRTkXcVkxJUsBTXtjbVEDR/Mzb3NFFQkXf3Nz3+fb28fPz9/nzzPfy/P7Kzvr2zvX3z1JAVENAUNHVTn12fWd5YWBjZVtAdEN2TnZOwPHx8fX3/vzl+fT2ycv52sTDUdNyZGV8cWdvaBVoYmNmZWVwcXZU2cTdwM7O+ebg5+T65fzM4ejq6PreVndaTnJ1SkZNdEZeRUh3XUBLxcfe3NFaWUxE38L3xcryz8XcTHx1e3N9fUVA1/H2yc7y+vL28cPSRkBcS0JeTHZ/YWdtY3J9enppbWJuYXp+SV/1/fT45uXn5+iXl5CTlOnj5uf77Ojm//Xk4fPB1npjYm1uFBZuaGppa2NnZXF9ZX56fXRFzcDWWVP0+fD4/Ofs6+7i+8HZU0NMRd7L9sJAdHZ0RVFXU1FdS3deXFNX19nO8vr8/f/88VBbWEbQ1k11dExX2Pfx8ffexM/EysnCzdhV0l1OS0x0ZGZ+SFlOfmdtFWxneX1xRdbR8vj64ePr6ezqlpfq6ezh+Prk+PrL3VFJRld1cn5gaWtpaGhiZnl5en5EX1TT2NNV3cDG0NPbX1xFxPbA9P/w8f//9/TO9fTL2/f+/vH5/fTL8PXGwMXdX0BNT0FbdXJzdHB0d13Fx8pdTEdyTk1ydnJ1V1bA2VzS01PZ0sP0wc3F18bYx/X3+c5f1d7O891Ac2ZgY2JhbWJtaWNlcExC1tBdw/fz4efh7uLs7+3o7unu5ubg5PlUdn5uaRQXFBcXaWoVbm9meH5zWV3S9/7h5+Pm8vrk4e/h5uDm7OL/+MnQ0EZ1dnh0TUh3fXZPTFlc0dtWdU5wdnFmYGxuYm9mfnXc0XNzcEJQTFbRWsX95Ons6ejj5Ofi6eLg+MnN1kbWQk1KZ2FiYXR4bW9oa21ifH5+TXB019L75P/89cnz8Ofh5e7j5eTl7Of09dFUwsrE1nB6YW9sbmN6YWdjY2FgZ35hZXJ8SnFEzNze0FHL/vvm5uXi4ub7//jw2d9KenJ0X9BA0F1Cw8n28dTJ1UlU3M3xUNrCUNjL+u3k4fzF19Jf3HRzTEZTUFT30dDB28zz/O3n8fvb0Fd3TUh6emBtemd+Z2luFGtjb2FjaWFjYHdDVNZZxvbm6pSXluqXle7u7e3i8fDk4ePh+flXWF9eW3J9Q3xlYWB6e2ZmY2ZhZnhxSV9FWEJd3sT2ytnGyfz//OX65/7K3NnH98/e2dzdVUdJdU9KS01bW1JPcH59cUB1SEXXx8ffXVlTUkdcRltSUdPawv3z+vr75+X8//H8/fb03l3VRkZxc3F8e3R9fnljZ2BvZ2FwUlHNzNv28P/g6JSV6ZSUlevg7OTC/f/D009SS3d2d3Z4eHhkaW5saG9jZ2RhZ2VmZ2VMQnFJW1FZRVdZdFTO9Pb67pXt5uHj7eyU7+T75u3t5uDk9NjG9NpFRXBmY21kZGBlen5yen59dMb10dZc291fxMvA9vfl+/T8+snQWM389/H59tpPQ1x1XsLSdWZwWnB9fXBkYmB5YG9mf3tkfVLQwvL64OHj6u/plJTq4OTl+vDx/c/D3spcT3BzZGsXFGpqb2RhbG1kcEhV/+T7/Pzk+vrg4frl5PjK0c/1xVVGR1VbU1R3fXVBRkdXxF5CfnJFWNvzxVJHcXFzfHN4ZWJsenlDUENxcEBc09rw8vv5/uf65+Dk5Of75Pn+5crCVktNd0lSRXN7ZH58e3R1fWBrb2JjcUFES35OX1Hc3trbUtXax8r7+v/w5+zt4OPt7eb6/Mr1yMFfdnx8emFjbWxrFGprbGd+eGZkfHVNXtrMVFJRz/7h6OPl+Pvk/8nLx1BGSkFaRNRCd0dF2cdX2t1FdHlxXlDdVFtQWtDJ38jB0NNHdkFX9PTF9vT3+Pjn5uX5+P39+PrKVNREd3dyemBpaGoWFhcVFBdraG5kcUN0dF5UUdPx4OHg6+ns7+nr4vrn+vXByfrw2fX12MHL88JaRV5McU/QVXF2TH9+c0R1cnNxf2Rndkp1d0ZORNX28szby8Lfyv3z8/rm/PX0+fDeU1dSSnRUVkh3TE5zfUZAdHVOV151UFhCTkdRWFjD98ZZTlTd1sbOx8DL8vz98/Pa1FLQ0l9UwtrcxkR0c3N3eGdgYHpmZE1OT1DMwsr44uzl++fh5+Ts7/vx+ufn+Of50HZ2T3Nle3B6YGR8enplcHJmYX97ZHhzc355dnd1QFTRXE1ZUUBd3sfczPrl5+Dv7+Ht6e3+9v3x2dfOzNrAz8tafXVIe2R8dnpgendLdE3cUdP35+TxyMzB3tj3+uXz+/bAxNrOwtFUXkBB08nz21NKdnB2SXRLf2NoaWNhcklFcWR+dkFQ0svVTkpZwvTw/+X5++bt7ezs4fPR3fXzysj010t3d0Nd01VUR3dJTV9HRtDF38L/5uHn9dBISlpYVFxDSU1HV8fx8MvCzcDA983C1UJR9fb98s3ddXBIdGRhaWsQExYUYnpzTk5GxfX+/vP6+Ofs7pSRlJTp4O/olZXi4fRdUnx8TXV1fGZ3cn9zZXx7Y3hwSlpMRkd3WVfRycP1UH1KUFPQ1VXVStfKyPD84eLw/Pvl5vP0yFdAWlXRUURbcG1sZmFhYXl5fWVleXx3Q1LL3Mf9/OXk5OX6//nk5PveV9pIfXhyT3J9dVtWU8L03UFc3VtzdFDRQF3d9v33+uTxz/Tk99bZyN9b38bG0lbG9PD29PfVcEtEXEVAUlBAd3ZwcHlke2RmYGxkYGNlfklMddnbVdXK8MJYR1JJQlpW2V3a5uDn5eLi9sv2yPXY9fn99Pj85OXw5P/W3NVWT2dgYmluaWxgZ3h2f3pkeXZfxvby+vP18/L99/Hl8MP29sry8vb00ddASnVheHxvFWtiZGVzSHBzdVjV39n19MtVR9bV1sz3/vr//MPTwsv1z8DN98DA9/T0xN5UVNRHVtxMfGV9d31PVl5QXUJV01b3z95YcURadF7H8/v9yfXOw8/0zV1McHJMSFLUSlpES9Rc0/H3VEV6YWZte3N/cWZhcHt5WNHYWEdS11fG//71wPfy+/j74+TCzsj45uHs4vzC1kdMcHRXQ39nY2Flclhc0dBcXlHc28HSQXZxSNz3w/T80dVfV/D2/+bxVl3d9/fK/fvDW3RLSnNGRn1gbm1hYWV8dnpsYGdzW1BET39lSlr05+bv4vj++/7/5uX+yF1OTVbVwfbyxltMXVbfx9JWdVPJ3/Pw8/tTdN/D9Obk989JU9FZyfz4w1hyeWV6TlBbQHV3SkHc//LOUnl7emdCSWFtahRtYH3H2FFWTHHVXML/zMnU2Mf0/eDj4efk+fr6/uTx1U5NTN3O/+H3W1tDUMLz5PzGVldTVNjM/stXSX5len5yeH1mZmVnfFrcx9dOXVNS9Pzy8lXTwsj64e7p5vfHXklX2FJGfGBkZGZ+WVTeV3RMe3fY39JYdVtAXfX5/fdRd3B5Wfb0ztxD0cPJ+eDi4efbXUNay8zNydLRx9/c8P7B3XN4enJSXUVCfmVwddP75uf/3dXH9O3g+fLI1FtFTcPKVdFxZmRmfGVnZ21ua29gfUN3cWFse07XxsfzzNzVwcj54uD7yNpd08n39f7z/v/45OPs4/nK31JczMLbXHR4ZHfXwc7RW3FhbWVAUkFMSUpQ1cTYzPT78cPYwv3LxMPYWVXf0lfZ2dhBZ2xjcE5OR0BxfHJ/dtnEwF5zfX9aX3dBUVZT0NrT/Pn9yEBPRsDPwfLz2l9X9P3i7uPxWXN9XdXY2EZ0TkffwPb7yl1S1VH18sDIxXBP2d/c8fDK3nlnfnZFXVpFSHNNUVLcztFAcX94dFZaSEx0X/TE0dreQ3lhY2VwQl5NXVh3QdPd9Obm/dlZ1cf3/PL6/fbl4frm4PvEXEJM09BUWlhET1rRxcn69txOc2Zmc1/WVNtQQEBY3v7EUkNxe3lFXFZeXVHN5e/o6+fGQndzdtnYV0NOfmR4ckvRVnB7ZmNpZXROfHFOTVBXz//9xF3Vw9H3+/7F0lVU2Nz55PZVR3F8fEbE2MLl5+Tk5Ozo4vnJ19VaWsbeR1dQX9rE9vnfcmFob2Njc0ZJQVJGVtr84OXJ1kl2cGR/dntlcnlLSkbFRmNvbmhjeljUSXVeRtHx5emV+s/b0VZXzvDx8eHj5uHg7eP101RQVF3UVNRaVsXy5e3r7/R1fmduam1gYG1heXVB0/fxXXdBW0twVN/cVdPI++fvlevk13R2c3hEQHB7Z2RzfXfS3F51e2VwfktfXljT9eTk+OPg8tVJd3B+dkJ3dUJ1Vsvz7+rh9FBJQUtbwcvM9PH55ufu7uTNUllMf2V6fHB/d1T3yfHk99Ncd39zd05U3lBYXMfN/+3kxF5weGZjYWdkYWVK09DO5flTfHl8ZWdkckl/dN3C/ODrlfrXWHZ+f2Z9WnVZ8eTtlJGX4+Hg5vHTW3Z1c3fT8fPn4eTJR319YG9sYn9yZ3Xc3vLk4OTwVNxYTUlFwUJIRMjw/uX4wNVOcX1lZGVxdklez8j05ef89NV1ZWxhZ2d8QEPb3Nr0/vLfSX51cGR/T1vQ3vfm7uqUlOjhx1Ref3ZR0MzXW1f35e3h9PRedX9meXRYV9XYzuXm4uDwx1FMZW9pYG1memBlXMT3+fzn/d9MYGNxYXdSSUrB/PD/8/PE1XBkYGBgZ3l4clLKzfPz+f/62NDTwvHe8vD9++f75+Dh5eD1d3JyT09HQNHF9/bAzfbb2V16e2NiZ01fXVPNw9fw/PX2UmBjbW5jf0hY3PX/+ODt4u3t8VhHfXZ0eXxIUdDX08RZTHVla25uZHJ8fXBYVtvN8/z/8t58TVVT39nYy/3w5uf5+vr0Wn51VERTRnXB+f3n4u7j5+XOU0RIcHx2cF3J3tTC9NHf21VEd2VjaGlsYXN3WM/3xvf89NBLSnR1c3dIcHx8SFNeVM5RcmVlZUxARVd0Wl3UzvXz4f3AXk5RxMFTxMbByPnj6JXq4PZVTUlH0UhU0VNdV9rO8vPCS3x7ZmZsa2JhbXp12crw/sj13FFBX1hfX1VWU9/18fT32MnXR3F9dnByTnVNUEJBW9nWVEB2dHJKTFpFT1PdxdjJ4eb5wHR9e2BgeFpXwfb//ebr7+3j9czAXlpJSnRBXdzC/O/h5ebyVUV3fk9OZXl7cUNGxMTcw1VLXltxdXR8d3FGxVbe01/QTnTe9F5OSXlxQ1/e2/XHVcDTdHN0enJBe39N1/P898/Qz/zKzP738PLVRlTI5Ofn7eHn/sza8/Tf3sbQTHZIRVNeR1ZOc3HVXE51TF7e2NDYUkZ3cWdmZ09CSVtcR1VW3/j85PP/yFRXUEB3WdFWWtrI/vjwXFJ8YmNhcnh4f2FheXxFy/j28fbd2vXz9vjl/fr+9vjv6PrBUH5xWV7XwMZfR0lZ0P3kzcVTe35Q0ML398XW9MnZyv731lx4a2JjbWVkYGFzdnZB//zX0llfxs/e/PXRQEJASlb18dRXR093cmR9SnRzdU93QVDH3dLbyvPk5ePo7efk/PDl4ezkz8XG39tV3/fbdUtKcEtC3dlUdV1WX1pF29NKdVhGUt7Gxddxd0/X9PX/z05xfWF4QFHS00NMVVnHwvPNXNXVREzS3EZwZmZ0QFPb8vnDXUNGT9729cFOcEbexvzk5uT6+fP1/ef+/c7Pwcje9Pry9cfMx9Pe+PXTW01eWUTb+/TJ1UB3fHxEWkpLcHd3dk1dX9ZVU0p0QF1WXEB+fnJKX871zsBZd0pSz/DC3EFBXl3Y/Pvz8czcVlfaxtvG2crz8Pz5+PD2zdfSx8jB0tJWU0Ld/efn+eX0T3R3SnZ+c2RneHJOU9xUzsxUVlhdU1vcUUFBV1BXw/TyzdRJdETZ01RTSnZDQlvc0PXEXk50SVt2cV1EXNzEwsdcx9RLd3FzfHRS1dRSRNzB/f3y+8jYz8TeVVrWTH/UwtDP2sPK09TfVVRdTndPS0DYXVJV2/TP295XUMzY0t/Y29tXV1lHUU5xd05xfHxxSkDUzNjF39nJ111eRUN/f3N5dE5YXlTV1PVQdHd8eGRnf3xIRMbK8fD14eXk4OT598TD311dVdfQVNL98t1HeWdmbWVze39OSljVVMjx9/f//Pv19PTB9Pz95+Tz+/fG0lpnZmNgZGFhfnxyQlvG9cVfWE53eGR8eHlaR1zf1vXDydj1/P7dcXR8e311SVRVzMvyyNvR1VVdx8rMzcJS09bXVdLMzdvc2tTb115fWdXKwsDZ3NZX0tXXXFFU2tdbX9jZ0vb58NlBQ0xhZ3txQ1FOT0V1Sn9yeHx0SnF9eXh7eXRJWM34//Px897R0Mfw5eTw38388vbExt/TTEtT10ZLVFxXw/L6/dBdR0RBdUtAVtTGVVHVXsb3/+T69F10YWF4Z2BhenVNWsTHUVFYT1XZ9PZbdUBDWkXTxsLYVFZ0c3NPd0tfW0Bzfk/bzs7Cy8H388f19dDFws755uPh+81SSkxKTlvVwtZGRHVKUNfdxsBeTnV9fXx+cE5MX1TRxN1UUV9d2dnTX0RSWEJW9fT998zGW0hDR1vWz/P8yMrIy83Z3ddYS0t/ZGd4cHZ0R8H55+Dm8s1EcUxbSkXb31Bc0/f9+uHi5slUXddbTklBdHFZ01BJdXx6fkRR01l3THZzc3bT8vDw/M/V0c/xzPnj4uD78P76/snc0VBAcHdLcXJ8ZGFC3tPSW3RzfHJ5cXdMU8PP28z65fnj7+7u4+X2wcNU1MnFzVBDcXRJdHhmeXB2V8RV0VPG29nw8vPK0EFHXFXf9Pnn5OX4++fg5tNdQ31+Z2NiY2dkclD19v7lyMDJ8/TcxMvB39nbzvHz/f/28Pb003FwfmdibGdxc3xycXN4StjHzvz988jW2fT9/vD+88/0zcZQzvz7//n/zMRVUV9CX0t1QHxken58dlvPyMr7+/r4yd7S3s7M29nT2/HYXtfay8LP2FtaxMBaSXFOWVfXQkp3dnF8eHl0VFl3Q0dZV/fh4+D799LYwNvbxPfy/Pvz5ebk+ffMwsbf0k12SUxGXNnL/+X9V1XdRnZxSXFxcnJ+f0Zd1M/I9/LI1tzK9dpGUtlX39tcdk5GQFJFXMzIxU1xeX99dEdOQEhxc3t9XcL8+/vh5/D7+uXm5fXC3VBaTkx5fU9TWUTU1tFdQkxY3/3h5/n2291Uw/Pl/83XXURJQHRzd3RCX0RY1NB2Z2FleXdaUlhUUXx2XN3Gyv/30VFHTFLfwsTT19fdz95HV19YV9ZSdn92dn50U8TL+uf/989aT1hTzcr12UJ0QEle3s31yvPCx//4zt1WV1pAXEt/emRtbmxmZHB0d3VzZWV/SFXdzt9bX13dyfD45+Xg+83BV9RFfXBwfXB2fHhkZ3p1Wtbbw1ZMQ3RC0v3k+Pn59cTb9uX6x9VGSUl+emZgZGR5dktBVkJNXVrC8P378PHAQHB2f3ROTU11XUV2cXRJ1VZW19fAxt/J0lHBxPTIxdpeTUZ1X9jRycNYWVhxcGV1xNHH3kRxfXBxdkVFXtRW19VHRFpR29zG9sjWRHdze3FPd0FEdX54QEdMRd5YXt7QUELd9vHh4frn+/3xycVTRVJAd0RWQEpwcnFZy83R8M7TXHJ4eElIdV/RV1VRV9jG9PPO9Pryzt1SX1/U1UTY3kZHd3plcF/SR0pwYGNtbGd7eXtwV1ZRysvC+eDr6emU7uHm9s3OxNnE8cJe1dF2TkVHRUdHRXJ7f2VwT9XG9vzz8PLw9P/++/7x9t5bQU9NWVlGXl1ASXZ9ZGRyTU1A0VBKSnZ4fHN/dkZKfXBLdV/z5Ofh7ezj5/7y9sjMw8bY2dvWVFfXx8HJ8PZQcHd0QNRX087J8fz8/Pz9+vj4/Pv6yNXX1VPfU9DwzFdHfGdnZH19fHVKdnN8fXBzdkpbWFbHwcLG9eTg5u/o7uL+w91UXE50dH50QExAQFD09fX5/P330lZYQNfY9f7998rA387y//Ty/fLyzd/Q0FdXVVFf2NJZcGd+dXda31xXXnR0SXJwT3R+enJwdU1UyeXm7ezu7uH7yd1bUlNfWFtOd394d0BGW0dxQkBKS0p3RVHa9v7j7u/h5uDg+uTm/vfB19BSQVLSTtZ8S1BmdE9ORt3W0cbP1UZ3eGV9fXdOdkN2Q9zE/+Lv7+Dk5PPMXXJwfHt8dkNHSEXV0cv1yMJe1lZa1kZB0FHV1tfQ2sbM0dn58vj7//7bXEVM193Q1UZ2fGRlfXpA1FpfQVpQTHR8ZH1yfU7XyffN9vrm7OLi4uH8xF1OcXNxc399fXJ0QlZW3dnW0dFXT3dBRkdWw8r08v/59c71z/L58fDI2FNDdHJ9fXd8f39xcXxK1dDRUVzdV0BzeHt+eXN9fXF2XdDZzPzg7umU6uLy0tLG3tzXS1pDdnF3SFFX19RB3VxNdn51Rk3czPf6/f3l/f/n+eX29PLdSX5ySkpKdXx/eGFnf3p8WdBVTVhYcWVgZn95c3N8R0NOVtXG+Obg5uTg/9NPcXZHV1FEXlVEV8bEwvr68cPC2l92ck9EVFXV08za3cXB1Mfh7OHg4PPYXlLVwfXG1NVScHl8cn9PR3d+cHxgbGhqFWNmZHh2Tk1e1sz94unu7OPwytnTV1XaXE5PXUxGTE1L1c7A2t/UTE95ZUrE9P/y9vb19/Py/uPk+PnlyddYfXh/d39/f31/fHN3WNPQVFhHS3h5ZGdmZWdleXJNcH1OQFXw+OXn5fPP2dbfyMjGz9vQVF3R2NDRR0pISnR4ZGNjZmRxQcTfw8j29vzh7+js7efl+crA2t3cVF9YT0ZJfmRnfXRwfX59cWdoamhjeHlHRkvV0Mfz5u3t4u7p4PzCzNJBR1NASHVASnx+SkRZX0ZCTUZ9fnJ9c0fTxNnXwt7Rw/Lz9vH38Pzwx9DS2dj38M9ZXVVId0pBd3BBRktyeGBoFWttenZwfkFSSlr35ubs7u3h5OT/zN3C8fP1013a0FZfXkhxTXR9ZHpkYGF+R8DNwsjL+P/l4ebk4OLm+vz69FVFTEpDSnR4eGdneHJ+Z3Z0Q0l1cHx/eX1NVVBSV9fd9/jl/+Ht4OPg5v/38f318vLMztvR2MHSR3ZR3VjV1k11c3FCW8zA1tjez8rJ8vPz5OX/+v7w+crDVkVRdXh4fntyeWRlZXlmZmRiaG9mZXpyQ0JZ1PHn4O/o7urq7ens5+X68/3C3FRLRkF0dnJzd3F1dVhWUkVX3cbB0s/29/7k5eX65+Hk5Obg5vr7883JVHV0emR+fnF9fnF2SE12fnhlYWJmemZ5f2Z8RNTX1Pfn//ri4u3s7u7h7eDy88vSzMbcUnJ0f2BlemV4eXp6dtBDcdPWwP/k7OzolpWVlpXp7uT8z8jFZWNjbm9gY2JvbWZjeE52cHZ9cnt8fHp0SEbd9fP98/rl+Pr8/+X68/Dx99JCT3R9SltFWFpZQUZTUEJBTk5DWtZeWV3R38v38/n75OPu6ZWV6u7t5vLDX3B9cHJ3f2djYmxoamxhY2JtY2NkZWZ6TVXa+O3plZfq7unr7uHn5PLKyVxweX95Z2BibG1neXJPVVle1tZTXt7X19j0//7n5/j65Pvl5OHj4+bxXURyY2JiYGVwcHZOTEhxcHF/eWRlZ2NkZGBmcUNY1dfM+OTm7Ovq6pXq6e3i5cJdUd1ZSGViYmxoa2lhZ2d4enl0d3xwQtvy5+zulZCRlpaUlOnv7fvIVXltaxVqFWpqFmpuaGZydUJNQEpIREVYWF/b9PPn5fL5y8bD9f375ub//MpdS3N0RFnW30Rd01RQUFZU39VZWUxwfGdjZ3x3SEdBwPHy5OLql5Tr7+zm88VES091fmZtFRcQHRITERYXFhVubmhrZnbF/OTol5SRl+qVlZXqlOjs595Kd3pibWgXa2pqbGxmcEdT3dbezvXLwP7l5OPt7+/h5v755+fh5/bWXHJiaxQVb2BnZ3J9f3ZwfX99cU1EREFIeGBjY2Z+en50TlDU2cz64+/p6OuUlent4efwyNZAcGVtaGtuYWZkZ2Vke2Jgfl7B8eHtlZeXl5WVlJSV6+zk+dl0Z2JtahUUFxEWFhYWFxVpYmFlTNHdx8745eTg5+Tn+/3y9fX85fnDWk5wemRnf3xydH13QkRBdEpW9Pf098rxx1JISkNN18bG8fL/+uDt7+7j4u3p7uD4z83TS35nbGgVFxEQERRob2xjYGBnfVTA8uXh7+/u4uDh5OPs7O3h/vDLXUt4Z2RmYGJiaGlsYmd9TEnUyPHk7e3h4O/s7OLj4uPm5ub75//N2Vh2e2RmZmRyeWVzS3J+YWJgZ3BJX1hHSnZyfXBKWV9VzMfewMr55+Dm4ujr6Ovp4v3b2E9/Z2Fia2hvbWN6fHJNT3BB1dLK5eDt7pWUlZSUlZXqle7m/shfSXxmb21vFBUVFhIdEBYUb2FwUc3l4urr6ujo6O7v7+f/+fHE0ddJdnZ2dnd0T01b1VBSUdVQ0Mr1xvD6+v33z9ZET3VH09PBysvBwvjk/vbw+f7l4eb7yMBSdnd+ZmNvFWtoaxRobG5pb2RyTlHM9fT95+bh4ODs6Ojp6e/t5+Tz20h9cWVhYmNta2tpaWJgZUbZ8+Dp7u7rlevu7uqU6Ons7eD6+PfDWHN8fH5/cH1mZXx7emFgYGBhe3l0dnZaWURMQEdd39nfx93bzc3R1tBUxPDy5Of/9fb8xdba0dHZ111GWdXWVkVOUtdX38/y8sr45+Ps7uuVlJGRlurv4uTNWkt5YWxoFxYQEhMSHRMWFG5hcFTb9fzn4Ofn5ubm5OX/8/fP29J0eHt5fX5OSnZ0SFNfdHRb09/B8vnk5OHn8tLawd/czfP0yPT85Pr54ePg5Ofg5vnz/vLTT0t1dmVlZmJoFGoUFhEUb2xtek5dUdzx5fv45u3i65aU7uTm5MFecHZ2YWxubm8VbmFhYGZ3Q1L15Obl5+Lv4+Dj7+ni4eLv4uHn8t5SRV1JSkhxf2ZlemRmY2d+ZWd6dHF5cEFJdXFA311aQ0xJdEdWWVpaVtVARdbJyNv1z8nD19rE01VTWXdJW059ZXhwcHlzcUVITdHQwc7+7OvqlpGWlZWX6+H68MBTe2ZtaRQUFRcQEBEXaGhjZXh/X/f8/Pz65Pr6+ufk/uX90EJxcHRzfn9lYG1kc359SFhVV9jz+v7+5frw9fzl4fjLx1B1ddTH3dDFzcDFy/758fb0wNZRWFJddHF8e2NgZG8VFRQUamhjfn15en9wTNP24e3i7Ozn++bm9dzT1VFHdnV2eWZhZGd6fnZHdEtSU1XB/eT4/v7++f3/5uf75Ob49//z9PbKzcdFdnV1fWd6eHl6enNJcmZjYWJsZ3p2QkFbQE9OW93HV9DQ21BTzcre1VdeQkHS0MHG29jVU1HbxEV3dHdwdNLw/cDa2N3d9vvg7u+VlpSV6uri88vE3V1FX1ZIZmkUFWpsb2BhbG9iYWZwRU1LR11U08ry/PP0wdZFRkN1dmRkZGdkfkJJf3l2RFbB/uPu5v33wMHIyv/58vf09vXNw1dYX9DGzvL65+Lh++Xy+uPg5vv+8sLd3dxdcmwVFBATFhdqb25tY2ZxRMD9++Ps7unr6OPz0XRzfnNDQEx3emNtYmR8dHRIT3VFxvvn+Pvn4+ztlZSWle/s5//9/fz92dRES0hPXlp0fWdkcUlXxfbKxEV3S052cUp3cHN2dtTTWEBxf3F2RdbYUHV1cXN0XM/89/H/8vP95OTx0UpwcXJ/dlpDTHR2TF9Vxf35/f/h7euUl5Xv5/r5+frk5ffO1kJ3T0BBS3hmZ2NsYGZibGBheHZbzeXl5eT75eX5/P320UxLeXt/fmV7emdldlfN8fHy9sP18vn5/Pjy9PXB8+f7yPXD3NDewf/m//fPx8T3/vrk/8z3yNr18dhbSmRgYGBtYG1uaGpqbHhLXN3Zwfz8+ePhyMPeWkZKT1bSQnRLTUtIX9HH1nVAVVbEzsFV3sXD9PPy4Ozn+/jk5uHn5+T49ffMyf/yxkRYXlNW1cL7/srFx11JQnRlYG1uYWxuYWVkYWVxRdfRxPL0w97SV8fx8vb3xNHD39vI10dOdnd2dUNRUkNaUF9YxvP+//7l4ezrl5GU7+Dn+vL38f731URYQ0pBXFlOfXt8eXh4ZG1paW9gZHxLXVxEU1dR0PTw21NAT0p9dEBwYWNnfHZLRtLOxcTy+f755uf898XIzdLf3ER2dE1Tx873//70zfD/++bs7+Lt4+/t4Ob7w1JaWUxxfGR6YRQWFWoVaGxtbWdz383O+Of48fbyy9zU1txGeXp9emRnZGdnZ31EQEReWUxe0tvK+efi4+Tl5uPh4uzi5/j55/nCwMPVSE9fU1BfUtvXXV7HzNrb11hyZ2dlYWxubGoXFWljeHZCXFpEUNZbVlZZTUhG2sFQTURNZWR/d3F3d0NHcXBaXkJbXV1YWNz+5ufk4+Ll++bg5ubh4OTzzvbC0tVTQHVH1NjWREhIZWNgf3F5cEBBcXl+d3F1WVZGQkTQ1Ux2d0t/YWRwfHx8dUx2QVfQ3N7MzV9S0Mv12sfeWEt3QFJcxf/n+uTg7+Pk5uDn/f7m4+f99M7WTHRfWE1JdXBnYGBgYWBjZ2JpYmVIR1/Hy8LN9P/xy8vAXkpOQXdkYGBvFBRvZ2R5cXV0d0vcyfDn4O3g5uLi4Obn5+Tx9cvDzdNXX1tWVNrOycr3y8/x+Ofn/vPw2UdGRUJ1cXxhbGtqb25sZn9KTFbJyMfd2MHQV97F3dRZTXF9eWV+eX5xdn5+fXBwTlDfwNvAyPTw5eLolZXo6ejv6Ovs4Obh5/PI3FxPemd6eXB1S3VzfGV+c3VcVEVDTkpDdXVLSE90dUpzf3J/YWJhZXt7enl4ZHp2Xlffw8TbUkxW28n2/OX+/PbCzcPFwsLM8+Ti4OX+8vn48vrn5ubk+P39/PL39vT32lJfR0lxfX56ZWFjY21iZElEXNvDxMDCxd5XX0ZFTUlxZWBta2tob2NnfnN1cXZD08j8+uTm7O7s7+/t4+b7+f78+Of78ff08fbw/fDH0NTY9fb8+ffO3dbSUl5aQk10fHx+ZXt/e2ZkckJT0NJTTndwdk5AW1FQdXBwc31/e3hkYWFmeHBwd05PRdf08/jm4u7p65SXlerr7uLm5OX/8vPwyt9VV1dV1dnxzMfL9vn78czHzcjcXFpAXdFTRHdxSk1AQkl1d3B9e3p8cXJlZmZnZX91QE9zfnJLdXRbV9bexMn2/vr88cnG9fjh7e/p7u/i4+LplJXo4ubh4ODl88PaVUBNWdHWR3N9fHhleHJ0dHdPWFfH9MLQRUlyemZmZmRlZGRgY2Jsb25vbWBkeXZCRVtTUcf1+eDp6uqVlZXq6Ojo7u/v7+Pk5OTk+/PKzsL2//nn5+bl++Dg4eXzwFJ1dHZ8eWZtaBcXFxVubGNmZ2BvY2Z5f31ycHd0QUJHTn96YWF6d1pR1cHNwvzl4OLj4+Tk4+mVlJeU6Ozj4OPj5vv+/fb38PTQUlpNT0tOQUZCcWVnY2lqbmFgZmRlZWV4eH54enpkZWVkZHp/cndCXlbc3tbZwM7GyP74+fj//f/5/v/65+fm5P7x8P/4+fr7/8va295TQnB8cHB3dEpxcX5kZWR4cUpKd3N5ZX93dHJ8cn9zfXFGQkJbWVlZR1LVUVZW3VHVz8vN0lxaUNPH8f/9//vy//zz/v/4/PPw9///98LZX1pTWVtPcmdnZHt/dkxATUpOWkNJXdPE01lZWUJ0S0dAdUdEWl1SVtHS0tvAzvT0xszMwsj39/f3xtDW1EVwfXh6fHJ4fHx6fHdEXVlY0NBS08DY1F/U0FbT0sDB0UVFTUhH1sXGzcf0zcn/+Pn4+//1xMLCwMDIw95dXdnJxlZfU1Jyf3xlZm1tYm1nfkpFdHJ1R0hKXtnWVlNWUk9CSXVAS3V1dkNF19nc3cjx8eXh4Ofh4OPn+ubn5Pvy8s7B9ff58cLA3F52S1tOcHdwcmRjY2JtaG5uaGxgZntkYWdmZmRzSElPS0lzfnNIQFteWVta3cDx+fz+5ODm4ezi4+Ph5/j8+f3w9NjVRFfa8fr58Pb39vfw88DTRUB0eGVhbWlqahQUamhtb2hubG5vYmF7e3p+d3RPWF1V09vLyfbk4Onrlero7ujo7uzg5+fl+eXk+vL9/fH08/r6+PbO2FZBRERNSHJ/e2FhZ2dkY2FhbG9tYWdhYGFnY2xjZ2RhYmZhY2V3WlxE0Nrcxf3j7e3v6Ovv7Ono7OHh4efk5OXk//f3wNLV3MDY29/V1UVf2tBEdUlPT1Pc28BST0ZDdHBMSX16Z2V4ZHhKcmZ6dXNw0cH18MLL9/T09vLz8Pbx/vzy+Pry9PX0wvDl+Pv598j0wN/a21BaRltZQFtaTXJ9f39wdE1PTEt9c3x+cUJTU1nW2cD2/eX/8/L8//zl5uf+9sLN10deU0d0S1dcTV3W2lZbXV5dX83zyt5WVNVEQV1dWHVDUUJN1ddQSXF2cn91UlNETEtfUk5b0sfNz/b4+uHu6pXp7+/i4u/u7ef/8PHC0sbOx1ZXxdNQ1t7TTn95Z2NjZmdnYGxiY29uY2NgYHp0d0lXx8PRUdzSUd/L9/fG1NvH38bIyMr25Obl4ePg4ebk5f3+5ebn+vvl5Pvx98rT1FTZ00RSV1BbSXVyZ2d7fmVkenh6YWBmZmNjZnlnZH10SXdxdnB4dFT2/fD++/795ODi4eLp7uLslZXv4+3v4Prk5+Hl+f732tvPycXS3NFZdUhOTH16ZWRib2xjYGxsbWNsbG1ib25sYGZhenNycHRaVlnUyf//+uPi5OTm4eLj4OLi4eTn4fv8/vvn5fv6+fH3887d2t5RRU1NdXV0SkdDSU9BUV9LSEl2fHx+Y21mYWFnZ2RnZGRySXZNUNHY09fDy830/uX39Pzw8P38/vj5/OTn5Ofk5+bk+P/2wdLVSXtzc3x+eHplZWRldElzcHx+f31ycXN/c0Z3ckRfUdXZwfX12sv+98zIzszBwNrH31td1kRQ29Pf2dzEzdvdzMPRU15fU1hYQkt1d3F2d0XRV1Td2NjCV0VSWEp1SHZKT3R3dn1zSnF8dNDd2vfz+uTl+eTk5eTk+vvl/ffGwcD1x8Hx9Nnb2sfUXUVJdHtkZGRjY2JsYm9pbWFhZnt+c3RKTHFzc3RJfHh/ZXp3cXdEUtfI/fLn7+zv7+vr7u7s7eDl+/j3yvDxysTZz8/A2cLE0d5URH1nYWBjYmlvbmtubWFkeXp5fXZKX19DT0RSRnFPd35kZnl8cXRE0c7K9vr6+efi4+Dt7ujt4+Lg4fj9/PP++vn4//D8/fbIy/dVRkF3f2dhY29paGhpaWxsbG1jYmNjbmtsY25iYWV6ZH9OWEFAWdzK9P3h4Ofm4uLn5Ozs4eDj4+X45fjz8PHw9c30yvfC2tdZR0tNQ05CSHZ1Sk3Q29PeVVpMRlxfUkN0cnpgb29tbW1tYGBjZX1wdE5DXFTN8/n6+eT6+frk4ePh5vj7+vjm4Ob6+Pjy9fH3zN9UXU1Nd31wdnNxcUlITFlLfXt+cnpkZXhkZWdiY2NjZHNydlnRzff/+vr//fv69sj28c/CwMHc3NHZyMza2tdbXFfa3VxNRkF3dkxWX11aQ0BX0839+fLw9vP/8vzNWFpXWnRNW1pcXUx/dUNcwPPw8fz89vT7//fOzvTB2dzTxMTVWU51TlTXUFJEQUdaU9ZOd3J/TUt/dUh3dXdOQXRLW01HT05HQEZHdXx6e3ZMRllW3drC/OTj7+7u7e/v6ejv7Ozh+PLw8vTG3d1UV1TVU1pKSnF7ZGd/ZWBnZGBvbmJgZ3h0RlPUV9PZV9fcUV1FV99bRlFfQU5bXFDexfHl5eTm4O3i7uns7e3p7+Dh4OTzz8rIz8j0/Pzw9PXLzNLdWnRxe3x+ZmRkY2lpbG9ibmNke2BuYm1sYnpnZmV4cUhxdEJRVcLx8fjl4OPv7urq6urqle7i5uHg5OT6/dtWxsbHxMPG3VdQUFtOTUdIcH1wTlJHR15GTV5SXVFR3VBMdHd0cXh8eWRgY2d+dnVd3sXY9/P//Pvl+ubi7Ozi4eH9/fHx98L1z/fw9cj1zNvaycnbwcLNzNBTVl5ZW1BEQU5MW0FwcEdLfXl7enh7c3N8eHl/eX9PW1PX2vby/fb45Pv65fr+/OXm5ufk5fbWQkRfVV1XX091e3xydU90dHVzd0jVwcLH0VJcUdvIw/Dz++X88vLw983eVl1TXtTf2tzf0trGzMj39s798/b/983HVUVOR1PUV0VMS0NEXFNbS3F6ZWRnenJKcXlnZGRySkZZUEp9eXRAWkRf1F5TXdXEy8jZ3dfX38TD9fzk+PL8+efm4unu7O3l/PX99sbe1NzWTXJ6ZWdgZmNjbhQUFxEXFWlsY3l+eXllcExaWUXW0VTa2cr88/bO29vQwMzy+PXB3sLI9PL75+Dn4eHh6Ojp7Of+9cn28ubn+fDYXHd3T0N0eWdhaRQVFRUXFxUVamhpYm1paxQXF2ppbGNmcnZ5fnREWV7a9PP8+ODj5OTh7e7ol5GWl5WU6u/t7+H+/fnz++X8/s9TTUBEQkRDeWRjbmloaGxibGppbGFlZ2VnZ2BiZ2V5S1pWQHZwdklFxfDzyPf/8OXn5Obl5ufm5eTt7u3g5OT68frn+vH3+/r8/f3wysHXWHFleH15ZmZgYG9vYGJsb2JgYGFme2RtZ2VnYXpc0EVORFFTUfXxxF9TUdzN8uHj5ufj4ubl4O3v5fb/8sjIy8nUQUVS3dTd9vTRR0B0Z2Bke3pjYXx7fH1wcXp7dl1bTcf2w1FTVNnTyf3z8cz95fjy+/r03NDezPbw5OHl8PX00lhc2sNcQFBeS0JEWEtLVlHd3sL8891SRXV6Y21jYm9vY21vbmxuFWtsYWZnT9bR1MX08/P74OPj4O3p6e7p6e3n/vDx9PH4+/Tb015xent/emZleXplc3RwfXB0SE1E3vXER0x0ZGJuaG9ubmNzcXZeUEFB18H28fHh6eHk7Ont7OqVlerrlZeUlJfr4f71zdtVVNHTUkBDcXhkZ398ZWdwWXdLQXR9fElbdHp+dX1nZ2duFxMTEBMQFhVuZHl3S0hHxPP08ebs4uDu7uzp6pCQkJCQkpCQkpHr4vr000lOWkh5fn57ZWZ4cXBzfH95eXBHdn9yTtJCcH13d3dxfnhhYmJtYmFjYWZ9VlZaRVHJ/fzn4OPs6uqV6uiVl5GQk5CRkZaX6OfxwtR2fnllemZlcHJ5f3RBQ1fA2V9YxdpNemFmYGJtbG9ua29tb2liYGBhenZzckzFys3Fzc/J8eTm7env6+rr6Ojv7OuU6+3k5eDlztREcnl7eXt/fnh+fWV7cn5zQlBcdX53T0tyfmRmek5ZVsXe39rE2MzF1tPM8fTNw/H5+P/7/fDx5OPt7u7t7eTl5vz0++b5/ff18PHRRHR+entkZ3twdHF0fntlZGF7ZGZ+Zm1jZmkVbGBjfnZAUNjM8v795OT4+Pzz98D3++fh5ufm4eLg7uvt7u/g+PHKwfTC1FxEQkVZ1FN0cHhib2huY2d7ZXx7ZHt8e3t9cn15fHRBcHBW0VpU3PT44O6Vlenv7+3m5P38++Ti6e/i7O/j4+Hm+/H0yMZXWF5WWEBNdUNDXVBFdHllYWkVamhrbmJjbG5taG9hYG4VFWhsZHFNUdvP9vjm7e/s7e/j5+fk5Prn4eDj4u/qle/ole3nwd7d1VXX2Fff0VBVV9dZdntmZ2ZvbWBtbWJmZWZheH9mc0Fcc2BnZmFhckHa9PH65OXk/v/7/Pz/5eTn4uLu6ejo6evi6ZeU4vj+3Vp1T1nT297BwsjEXURFcWRtbmtpbmoVahUUamsUa2F5YGhoaWtobGBkZUjdzfP//v32z8rDxMv45+bh7O/o6ujs6pGW7/j68cRYTU51SE1c3NvFUFDXXXZ/ZWRkY2Blenpxdnpmc1nSf2xnb2kUbmV/eHRWwPT09f74//L+//3w+eT55O3o6unsl5eU48fbWnF+fHFJcXB3QVtTUFrUVENwcUl2f3lnYm9gYWZpaWVmY2oWFhYWFmlmZntPVML/+/7y8PL19M32/fXx++Th7eLt4+zp7OjnzsFQdHlzdnN3cU1YTkNZ01J0eXhkYGNgZXl4dUt8YWZ0dHZ5YG5raG9gZH9JXlXP8+fh4+/u5vP95Ofm4Ozi4uLu7O2V6O7h9MjSWF9CRE9yZXl3WltERUplYGdnYWNvb29pb29jYWBnZmxqFBQUFxVraGtsenBc0fH//+Hj4eTh4+nv5uPs7O7u6+Pt4eDs//n89MBW0dZISkpBUUdLSkVDdXNxe2BgZ3plZHhydnp5c394Z2VkYG5tZGR6fnF3dVn0/ebu6JXq6JXqlZeWl5Tr7unv7+/p4ub6/vbZy/fMwNRR01FWVdVRTnxnZmNgZ2BiaBUVFRVpb25ib2JibW1tYGZmYWdzdkXZz8zx5uHg4uzt6pTq6+3h4O/g4eD7++Tg7+7s4+Ph/vHy8fby9sjJxVJdWU52eGRnZGdlfmRlZX56e2RmZHllYGdhY2R5fUpM1M754emU6+nr65WUlZSUl+nv7eHh4uzg5OX+8/Py5OH49vb09/X2/fHCRHV2e3pyeWVjbW9pYmNlf3llZmBsb2lvYmsUaWNmc1LSxfT85OLo6pSWlOvo6Ozi4ODl8fLn5P745OTzyMbczvby++Xzyff0zMreUUd/ZXlkeXZPT3J6YGV9SkNMSnJ4emRjYHp/cHBax/bg6ZSXlenp6pWVlZXu7eH7zMr/8fbN0d3A9PL89s7B1lfW2tvZ0VtDdXx7f3tnYmgUFW5sY2xtYm1iYGR+d3Z5fHJwSkTVz/X0yPDn4OiVl5eV7+Pk/vPz9MTe2sfM8/jl//7K9/3z//zz9NhbTnVOd3N9e319eHl7f35kY2pobGBkZXx+ZXt+f3F3TkZf3vT74ezo6e/i4ePolJSV6u/l8Mffwtvf2tDP8vvh4eDk9FJKSlnU1tNfc2dhYmJjb25tbG5vZmNtb2oXEBMRaWJmcnR7YWZ8cUxH1/fy5+3qlZWV4v3A0MTz+Pry9MzF0tvL8Pzl5Ofj4uDl8sFTfGFkfXVLXVFHcmRkZ2ZgYGZibGR4eWRjbWgWERcVbGV5d3V0Td385uDs7+qXkJKQl+vh9lJGVNDJ8fL++/L9+Obk+f30zM3//s5SSXtpFxdrb2Bne3llbmhpaxUXFxUVFW9ibG5qFxMSFmtjZXNfyvz2++Pj4ODg4+bn4fvxxlB1fHJe2/jm7JSXlOju4fjK3FNfQVzcR3d9emBpb2RyR0xJXUN3cntkY21vbG1nd0t4Z2ZtbG1ldNX08efv7+no7uzm+/Py++Tg4f7xzNrUVdv25+Pj7O3k5PffRnlgbhVqbmZnYmNsbxUUb2Z6enJ0cmRnZ2Jobm9uYH9D1VtPT3R0c0Ldz/364ePh5/j9ydvY09/E+eDg5/j/5+X2/uHt7+zg5fVURXBnbGhpaG5kcX15e3hwf35IR3VxdXV0cnN1fWVkf0hZz+Xh4OT5+//38eXk/uTn5uDk5OT++OXm5+Xs6Ons5+Tn/M/A8vXJz9dQW3Z6YhUXERcWFG9tYG5vYmNgYGZ7YWR5eHBzdnV2dnRf2snk4+/v4+b49dxQVltD0MH2/uTh4frn4+/p6ZWVlent5v3I2VTQVNHf3t3W01JxeGVhYWJiZ3h9eWVhbWNmZHl2d05d1t/NwNfQw/b54OmUlOni4Pr/+f3w9vf2+uTl4O3s4uzv7+np7u/k8PTQTHZ6YWJgY2Fle312c3lnY2xsbW9tYmlsYGNhZX9xTFPf9/H8/v7//f3y8fXx/fzww/LwyfP5+Ofh5uPj7e/p6ezj4+Hn5OT6+M7F29VaS0FNd35xSUVfTnRKdHJ8eXJ8c3p7ZWVzcXZCVcHy/eHg4eDn5+T5/vDPzMj5+vP09/3x8/rg7+/u6unv7u3i5f/2wcTf3t1adnh6Z2FnZmFmZ353ZWdmZmFgYGNhZ2R8cXBycEBQ08DA9PP3+eXz9vXB01DWU1zQyvP98Pb9/uTj7e3v7+/p7OHk/PVXR19eQV1Q0d9TR052dkp9fU5bRER1c3N8entxdnN0SUTW38LJzsv08ffJy/H9/vzz/fbL2tDfwM3K8/fx/uX4+fz5/c709PXb1NZdd3tnZmNvbWdnZHt5ZG9oaGxsYmFmZ2ZlfmV6ZmFnZHlM38fYwfTFXFhHWdTXyvbKyffwyMPFx8THyuXk+vn7/sBWXFfRUVTFx9RWVVBHcX9/ZXpwQkxwfHN9Z2BmeHx5e3J7ZX1wfWVlcnR0RsvwzcnI987R3szNzM3Iw9vOyPb29/L8/fTy//D2wMfcUE5PT0lKfHJ8f3x8enp7e2Fib21hbWJgYm9ubGZjZGV5eGdnZ3t+cnVId3FxRFNT0NZRWUdFV9XA9P//8P7n4eHk5vvKxtbS1NHbx8fb2NfRyvfP115d1FJ9ZXFGTnNkeHRMSHB6Z2R6ZmFkdlBEdUna887Yzc/08M3D3sTNxdZBQVZS2c754OH6/OTn+P723cPC98fcwtnQWEFCdXBLTEBfdH9lZGBiZ2dhZ2ZkZmFkZGdlZ2RneEVU11JaWFNYdnRYXEROWFxQVdbGxvXx9/T/4eLg5ubn5/Lw+fr65eT7/fLy/PfZ39RYQ13S3t7QXEZeSE1KdENJdnBIRFtRR0FUUlXA9PP29sPcw8PQU13R3dJdUc318/v6+Pjl5OHt4ubn/Pbyyc3e0sBUUFtBQnZ1SXV1dnFLQVl0SU1wcntlf2VneX9/f3JLS3VPTUJPWVHTxVfZ0llfU1PWUF3e2MHGyfHx++Tl5uTn4ODj7e7t4Obk+/v88PLL3tzd29vAy/XBwvbxy8LfU15PdHdAVlpYXENHU9HHzPf0ycnDwMHUV1BYRHdxSFrFyfb88fPw8/L9/fHy9/P78fD+88jQ197VXVxcRFhUU1zU01hIS0p0cXV9f3tmZ2FgYGNmenl4fndKXNPS0VxaQ3FJTUtLTlpdXtD38+Xg7OzvlZSXkZaWlpeXlJXq7+3g/8veV1ffx8zPz/b39fbK3tJTWV5LdHNzcXlmY2JibGNmZHl6dnVyc3J/e39zdEfQz8j38fP8/vvm4ef4+vrm4OLv4fr4/vP28/P8+P38/c7a0V9GSn17Znh/fn97ZmNtb2lobWBlZ2V+eX13SnN+ZXtzSnBLT3R1WNHW38v+5uzu6pWVl5CQkZeXl5SU6+nj+cvO29HU0tHa29zJ9czBzFdYSUtweGVgYm8VFhYXFhYVa2xvbWdhYGRkZ2RlcVpXwfbx8fXx+f7y9/Py8//75frk5vj/8fby/vjl5uXl+/LzycbGXUx2eXt6ZWVmb2sVFRVqaG1ke358f318eXN8eXh/f3l6e35zfH5zT0Zdwvvg5uPv6uvu6unt4uHk/8DF3FlycXV8e3BCW0JDXlBcWFJZTnd0cXlmYGZuFxEWFBcVY3pwfH55eX13T0FfUlbSx87398zf0tjO9PHz8v3K29/b39jT19bY9PL29/n9wF3X2tpRXlXb1V5Cc3Jzc3tgYGd6e2d6d3VYXVxW0MHC3NRcW1lPd3Fzf3xwcHh9d05H1vb98f76+uT6/8Pb13R/ZWRjbmxsYGdkfnZ0SVbO9/D++vnxw9ZGc2VhbG5oYGdiYmZ/d05ERV9SyOXj7ebk+PH29sjT0dxUXtPPxtPA2lXd2MX3//76/Pv//PPOzNrF2sT19cTBwtRTXl1dQkFDc3h9eHJ9d1pBXlXA987S3t9UU1haQ3F0dndkZ3tmeH1IW0dWwvb28//zysvBxd9STk53fHh8fXF0dnFxQ9r3/ubk+fv7//z03lRER0p/en5/cEhLdXVxTsPy8v/l4OLg4+Dl8/XLwt/b3tfc2cTa2sHN8P/n7ejq6uvo7OHg5/zw8c3F3V9SQklCQUVeRE5HWVpYRkJ1cU1PQFpYWEh0fH12fWdnenl+f3h5cn9ydnZ3XtXf8f/65uX55f3KyPL13NZdSX18emV/cUXE8fDk7O7p6+ju4Pr89M3QXEl/ZXt9fXF3S0ZMVvXw5ebg4u/v4+zi4+b6//bNwsTX19LS1drA9f3k5Obm4eHi7OP68M3Z1F5TQnF+YWZ5f3lkZGRhZ3tmZ2RmYWZle35xd3ZCSnRCSU1PT1Fb1tRb3dzZ29BWVNnJ/OT6//7x/fzy/vP0wtrXU012eWdkZHt/dkJE3cD85/v75OXk5eXw01BNdn9/c3F2QtLazfTw5+Pj7pXq7+zt7ezj5/DeVFhESFteRV9CU8fGx/X9/fn//fff01J1cHpgb2tqFBcXFW5tY2Z6Z2BmenRCQVdcT0hcUFtQUFVdT05eUNfC2NrPw/Hy9vnl+/rl5+fj5uXk/vL88M3b0FJPd316Z3h6YGNlfUrUwM70//j44OLt7+Hk/cvYUE9CS3dxcHZORV1U2vT85+Pu6ejr6ejs5/zOUkplYGdhYG1sbG1vb2Z7QFdQ3t7S0lxFTnhnYGxsb2xvYmBjYGFhZ3h8cXRHXFjQwNzR0cTIzsvP3ddSRNX18ff0zsHaw8DO/OT///3/9sHBwvXx987C3NRSWNbQWUJJSUVcUkZbVNbM9/Hz9/b5+f3499hVVEJ3WVBIRFVc09jZ2NrF3d/B98rI29LUT3Z8YWJjb2lubmsVFBdoY2F7R9rP8Pnx9fTB1VBWX3BhZmNmemFnZ2Zke01SwMHZ9vXy+8z08cDH2cbGUF1PTklIQldQ1d3C9vPw9PDy+ODm5OH58vD2/fHP2t/BxdZcW3R8e2V6f3t6c03c9/fw9+fg+eTg/srfREhxZWFjb25obmNmYWRlfkRRT0TQ0MDIxNZZdXBwfWRlZGNtYm1mZWV4fHJS9/35+/jl5f7wyt9XXlJZTnNyZWB7cXN3QVNcWdHCxN7EwPTz9srMx9Lcz8Xd09DUxv/l4ebm4efi6ejo6ePl5eXx3lFFTUlIWFhH1NfU299QRU90dk1HUF1OdnFP1EBwemdkZmZhY2xoFWptY2JmfEHZ9f/l5+Hl/+Hm8PXcWVp0fHhnZGRmeUxFVtLH9uXm4+/u7+Pi7+P6ytFGcGRhYGFjYGdwT0RTUdrx++Tj7+ns4ePj5vr29/3yysPKxtzf1tbJ8fD18fj//OTolpHq7O7p7fv3XUlESXpsahQVaG9vaBRqY3lxcnN0TUVWWXV0dUxKcX14fHN9cHtlf3FLdUXW9//65+Tn4ODg4+H498HB10B0fHxxfXFBU1Zf087x//P95ebg5vr9wNvUWVhBWFlJXFJT0s3w8/jk4O7r7unp4OTy9cVVUk1zd0xBRljSwPH+5eHi4uDi4Obk//fP0Vt4ZmdhaBUUFhcXERAXa2ltYWN+TVpUxvbKzcDa3FzVRnVNfmd7e3h/c0xHW9PK8eTm4ezu7OPu7Ob68vHC31FzcnF5e2RnfkhATVTB///l7ezv6eju7eDg5/L2xFJeQ05eQUxGUF5b0Mb9//rk5Pjn4ODh+/LL3lFbS3FyeGRhZmRkZHl9SkNCXNFZTlJUU05zcXp7eWZibGZnYWV8c3FxdU5BTkNS1VHT/f3GwszE08HDVVVRXEBLWtHHxdrI8OT45+Hk5OXl88nD2tjdVVJZWdXXVNzY28vM9+Tl5eHh5Pvk5fv7+fDKw9xRWEx1dEpPW/Ty8vL//fDl4Of+/cRfQ0t8Zm1uFRcXEREVampub2hpbGRzTMP29vz4+P7/8/XD0EVCfHtnYWFgYXlycUpMUtDa9vXCycPG2NLK8s7HxtBUR0RfdHFyf3ZeTUfcwvT74eDol5To6Onj5vr/01RdS0pGX092d0x1R9Pex/Hz/fv65+Hj4uPm+8jRVlhMcHlgbWxtZX9+fHJ7ent+cHN/ZGxvbmhob21vYmRneXd1dnZ2f3lxT0lAVNDdzPDz9f778/bF39Hf0UxKdnJzWlfW2dvf2cXP2VRfdXZKRlzZwMP18fP38vn5+Pv8/f/9/Pjm5ubh4eTk5P702EJyfHF2d0tOTV7R3NPey8D18PPxyNxV0FpPdU5Ke2djbG9vb2sVaGhubWBkcVLTw8j19PH598XUTXF7Z2djYWBjZ3txRFdXVFlS1N318PbI9ff3/fj4+vr0ycvC2VxCSHB5Z2dxUFHA9/X85ebh4Ozi5+X6+/L4+/33xNVR1VReQ0l1dVPBxvLn5+Hj4+Ht7eP69M1cdnlnZ2dnYGJsbG1neHxyc2RjZmR/eGV+cHdKVV5PU1BbW1bUdXpkc1vGxV9CSVPK/uX13F1Q3dZUdXlzRFJSTX9ldVTWVVNQXNHe2cfWVdrC/efh7O/s7O3g4Obk+PXNy/Xy+//3zs3Z1FdS1tnSwNvCwMTMyM3L9MXM8PT28fbMwPTHwPHNxdrZUUV0ZWFtaWoVFBYWFBVraWJnS8PIyPX19PTa9fzdUlxIW1t1dXVbXEJMXVRT0t7I8/Pz9/f2zcT2/vb39NzT1UBxcnRLfnhyfHJBUdj09ff8+Obg7euU6uvr6JSU6eb/9cFX1d5RXlXQ2c3Jy97Iysn38ufj4eT49vfaRVlSQk92c3F+ZWVhbWJsaGxlfXBDR3BGU0XSx1dPSXF4fnhlZ2ZkZ2VL0ddX3MTA28/0z/b38Pv5ytFXQXZ2cUhH0djX0NLa2tzUxc/MyMr2/fv6+Pz3ysHB8/r+//Pw8/P0yMLWXFzbxsD3/f//5OTn4eH6/vv/98rJ9/DN0lHU1EVCW0R0eWVne3Z8YWJvaW5vbWBmZGR4dENT3tvZ3VZR2/XI21FdRF9QSU1bW0x2cXJ2TFzXUVNTUtLF2NvDx1TU38vx9/bE01x0SEpITnZ0QtzP9/H2//rn4O/q6Onv7OLm/M7TUUt2c39yd3ZLWk1HXVXewvLn4eHh4ezu4eT6/vH0ysRQSnlhYGBvbm5vbG1tbWJnYGJjZHFLQ3ZwdXNwSk5KdHdKRkddXU5FUVFW18HbxcHC983eUVxHSkFBSXJzR0VcWUh0cXdMT1ne01JHVMn98Pz/+/v8//rh4+Hk//zxw95X1ddZW1TZwffw8fL19vXYwMRUVkVEXFxBRUFIT0TQxd3e0lFHdEFKS3R8fnpkYGBtYWBhZHt2dUdeUVTZV1TfVVdbS3d2f2Vken1kZnhwdV/c0tvQ1M3CzfD2zcTU38TYUddZfXJyd0BMdEh2TFpV0Nbf2PTx5Obl5efg5/rk5Pj0x8bWV17U2dTd39bWV1HS1tz08/Xw5OPj4Obk/srKzNZdSnN6bGgVFBYWFxQVFWxhZ3JOQ15TxPTx9vf19Pbf0FdQ1UFLdnVNT0xYX1ZWx/H0xtPTUUd2cnFxdnF1TEBGQV/T1FdXUNjK9PP59svH08HM28DI9P/6/Pz7+uXw8/nKzcDZ39vBxcbf1tbQxcTD9vL/+fr9/uXl+PL4/PHDVVlYXUZYSnF2dXd2fmBmZ2ZkZ2BmZmNjY2BnZWR9cUpWzvLw8/HI9/L98vL99vH0zd3S3VZGQ1JdUcfJ9fb398jLwNrW0lp/cXJ+dnNwdnd1Qtvw8/bx+Prk4+3plZXp4+Xw8PP10FxQR0ZASE9IWtbX0s32/eXl5ef68P/59/D2yPfw98fXUlx1fH95emBibWxtYmBkeHxySEZe3djGyPT2x9dQVFZRQ3B7YW1mZXxKS0TUxcXJ9Pb9/frn5uPm+PTC319GQUt1dHVLWlfUwPX8/fLx9fX1yttW1FdS3d7M983GwffK9ffy/vXI9/398M/D2Nfb9MnIwVTd3drE0ldX3dHe0tTRV1FRW3FmYmJiY2Bme2dkZnpzc099f0JMXNbXUl1cX9fM99jc0N3Az/bM18FRdVbQVk92dnt7eXN3Tk1MXdzE0NHBz8rwzPX29cH0/MVUVnVLXcbb0sjx+Prj6e7i+P/7/PfF0k1+YW5tZGdmfk/fz8vx//7k4OPv7ODg4fjG11t1SXRwe2FtFRcUaGlvZ2RneHJ0dUl2eXN9T1Xd119SVlVc2cve1lxBXlpVVVxaSnRwW9zS2sbYwfTI9vLIxNdEQk90cXhhYmFnZ311R13T2dPFzvP/5OPj4uno7uzj/8HdUUVIWl5FQlxeUcH28vLKyPTO3VNfWXZ4e3t7c0NPTlndxvTz8snE0t1fdXR8ZGNiYG9raGtsaWtiZHxKU9zK9/Lk5+T6/cRUV0x8cU9IdEBGQlJU1tLGyc7BwPXK3tBFSVxHQ1PSVVfHw8HJyd/ezN9XWdbXRkRQ2djGzMrx/vP2/f39/Pn5+/j89cj39dtX0ddSX9HY2vf9+f7n4OHg4OTzzd9eTn1jahcRExAWFGtuYWRyXd7M9P3z9fTw88rFxddRV0NDRUx5enlycUhS1s3z8vb08vHK9cHUXVt1ckxCcXBxdU1TxPP++fHFzv333VDX0dRV38r38f/k4eDg5uHn8MDZzMddSHJ3S3J7fkzVV1Tc0Nvx8Pjg7+7g5eT7+P/88MbYX1jVWXVKcX5/fHBweHpkYWRnbGsVamtsZn11VsH0//vi7+/v7ebl//Ta01JPdX9mYGBhZHlLXVld19jH9P7+//30y8PB0UdJcnJ8fX57d3B20/P65uLs7+3i7ef7+fP0wMRX1MXa29hUU9Dbx8vCxMRUVNbbz83a1VBR0czIysDHycj0zthQV1BCQEN0SnN7ZHhycn19d0pPQFvX3s7Oy/feXk90cH1/ent5f0ld09PRx/f64eLt5/v92tZTS3xnYGBne393SUN0SFfG9PTw8/by8/78//HExdnXU19d1cXe3trI+f3+5Pv5//DOxsDbUEFNSkJYXFRV1N/L//n7+vLz9MLbWkt+ZmNibWxjY2xpbmNlcnF0VsLBw/P8+OTl+v7/8/XKws7F19FfWF1HWU1wcXB+eH9lZWR+fXZDQVvU0tvK/Prm4OX8ycDaWXRwcnhkZHlzcXVFU9XJ/uHj4u/s5ubk8PXDV1tcf2ZgY2R+fXBxQdHP9/zg4O3j4eHy+vHJ9NzUR3Z+SnRlYGxhent4ZGNtbWNhZ2RhZnpxdX12SkJW9P/z/fvh4OTyxPXy+fVYWF3dV3NwWl11fHJ2SXd9dnVCQ3R0Skhzck5YWV3d2tjTwPH65+T48/XOxvf89M3H1VFdUVhJQkN1QlTbxd7CzNjZ1V5QWE5BWVhbXV9ZRV5TXtPJzszAwNvTVlFHSnZ5ZWdhZmdlZWV+eXl2Wl3TxdrF3MLw987C2lZbQXZKSHZ8ZXxKXlTd3tnJy830/P3x/fbN9vfK3VdHdnd0SUhxT0t8cHF2TUxNWlHXx/b75Prn5Pj5/v3Jy8jOy9Pf2FJJcHd1cnNJT05ZWNDN9v/98vL198rGwcNWd3V2c3lnZmFgZmFjYHh9cEBf0N7Q0djHwPby+/j++vz39MvA3URbRk1BTUlLS010f35yfHh4d1pU0dTT2sLz+fn6+ubn++Xl/MvMwsPAz9vXU1hFWl9YVtTWVNPMxtLV0dzcyfXNwMDf091XRE9KSEFe1d3O9M/H28baxMr39srKwVFcW19FTnVzcn5/e35/ZWZgYHp+cndA1tvAzvL+///8+uTm5P33wd9U1dfXUUdNQUZATXV3c3JzdE1c3t7cVkVGW1fX1V9T19fT1Nfe3NnA9//75eTk5Pj7+Pn7+v/29c7M2ddQRE10cXRycnV2c3N2SF7X2svMy/T29cPb0VJMT1lSU1RSQHd8fXBxSnVyfH58cn1zd05NRlTGzPb88vTAxcHNzc3a2Nzf0F5XV1NGTlnX11fXXUZLTlHYw/T39/T08fXB0Fdad3RCRURcXVpOS0BBR9XZ28bP9/Hw8v3/8vL65uHm5v7O0tVcWllFTXRwS1pfUVFSXkRW39Pd2dFYT0FfXFBXUVBZR05xeWZgYmxtYWdlfElNRtLL/eTj4uDn5Pr//fXG1l9CTFtdXlxPfn9zcXZ1TE1BRVBU0d/f09LaxM3MwM3G1tfexsfFx8HPwcbB39nfVl1ZW1bdxM7K2dXS3trCycPZV19EQEVBSElGWd3I8fP998/18PfOwszE0dfUUV5FT3J8eHp6enh+e2FgZmd6cklYX1xYV9/DycLH2sD09vL5//TA9fH29M7C0VNYR0t0cXh8cHRGWVDU1FVcV9DX1t709/X1yMff31VRXVxXV9zAwszS1sTL8f3l+vjz9PTMwtBHdH1/fHBJQEZOTkRc1FZX0NZXWVhHWF5aVtnNzM71ysPSUV5ASnN/e2VkZ3p+cExGWVfR28j8+/vwzMPY0t/BwcTe1tRXUVNaS3ZxfX1xSkZfX9LNz8DOwsbZ2Mbf19HR1VbT393cxcbF29vb3tzf3N7S1VRRX1vU3FfW2tjYxMfF1l9YWkZW1tLDx8fP98nCwNddREBHTVpTWUdYXVhbXF9eRkJKcX17eHt6fnxyfXFPW1xS397FycLOzcbNwMHM9/f38fbz//7/8snSXVlRXUJDS3V1SkVGRlxbWdTS2sDL9cvNycjQXkdCRkFNQ0dGRERHWlldUFDQxc738PP29MnB2NDW0dfb29Dc19fY3t3f2dHd1tfQ0d3T0tXW3dVSSXFxfH94ZWdmZX5+eHNId0hfVNfcw87L9vTKyPT1yPX2/P388vH28PfZ0FZBQUdMSXdIQUx1TEBGQExNWlLQ29vExsPB3t3d0NXV39zf3trBw8PMzcLA3tPTVFFbQFpFR0RJdURQ1tr38vz++uT6/fbFRnJ/emR7eHl+c0lGX9bX3MPCwc3M2tZdSXZzc3Z1TkFQ1N3Y3t/Gzs/JzsTG39VU1VbV0dfT2VFfQktMTUdBXFJT1N7Y11FRTExBW1/Rwcj09PTKwvb29fH8+P31xtjW09RbXlxbV1bdxsDL8PfB2txQWE11dnF0cHJ3Q0FS1VBfRUZfUdbYwvXz9PTxyczMxd3SV1lPSEBMSkFCTltX1NPYzMvK9/fbU0F2fnplZ2d7fHN0Ut/YwsjGxsrN2sXY0lTUV1ZSVNbSx8/O8f/98/P//vzy98XWUkBPQEZEW11QV1lfUlpFXkFYV9dUV9fVRk1fRkJYU9DN8/r65eX48/32zM/B0FNNcX9yd3VMRFlcVlRUVl1W11xbW0B0cnh6ZXt5cnZJQV/e29fW19Td2MPL8P798fDwzt3WVkRMTUJISkxPWtfd2sLPyM3AzsDCzcTb29PUVFFeRkxFU11V2N7d01RASnRzcHJ0S0XYxcbIyM/CyfT08/7++frl5OTl//fB2t1XREJ1dHRxT0NGR3V3cnpkZGRhZmZnZX5zfH5xdEPU9P7l5+fl+fnzwN1TQUFbXl3R3cfM9PH29vfD39fc0FTXVFZQUlJHSXVzc3J/c3d0dnF0d3RLSEJZ1dvHy/Ly9PT2yNrD9/P85eTl4ePh5uf78snb0FZcWURGXlleUV9DdXB2dXF0SXdKSUhLT3dwcnp+cHVWVVXQUV1QXEVYUdHbxsjJwvTK2t/a11ZdQUFAUt/F9PL8/fXD10R3eWdgYWFnfXF2dnVKSkJc083y+Pj65f/3z9lU193Hwsz1zvT9/f7+/MvH31FSUFxBT1LR3cXfV1tBQU5CU93YwMrw9s/bXnR+en12QFlHUFFSWF5WUdfX1tDW3lVYXVJYXV5AT3V3dndCX9fFzsPExd/Q0FBbR0xJSk1aXEB2fWdkZWV9SlvRx8jy8c3CyPT19fTJyc7AzvH7+vr7//D198r19MvOw8bTRE53c3xyd3Z1Rl9U0tnSVkZMSUBcV9HZwcXT39HU39nDwM/Kw8z08v3+5fnx219PfGdjYHt9c3VCT0tJQEFAREFCSUpKcX1/Z2JvbWZ6c3VY2c738vrl+uTl5fr///bI8f764eLh5PPP31ZZR0Zc0NXX0VJaTXNzd3dxcnZCR0BcVV1fWEVW0sb08f399c719MrLwsHB31JS19nGwvHy9s3TXU1wf35ydU9MWlhaXVJSXkdAT0pDREdZQXRxcnlkent4fnNIT0BR19738/L////++eXm4eHh+v/010RNdHRNWNfT3djf38HD2tneU0FNT0RHTE91TExOQ1tYXt3H2MTI9MjD9cLSVVBFRV3RzfTx8vDz8cnA2VfRwsbZ2d3VUVtRVF1Ad3J9eXl9cnx8f3Jxcnx+ZWV5eXFYVNDZwPb39Mr09/D85OPt4Obl/PfdXkN0d3VLQ0ZBRkVEX9HaxdBXVF1dXERAQE9ITE9NTk5DXNbE9PLl+v/4+/P32tHdVtHb2MTY0dXVWkFaRF9W1tjGxM/B3dreWElxc31/fXZ2cUhKTkxKTkRCSEZT1N/aw8XFzcbY2N7bzvL5+fj6+P79yd7XXXR8dkp0SUxBQkxaXkZOSEhMWVhbWURFSHRITkxDT1vXxMr9/vz5/PL+98rKyc3N28TC2trb0NRfRkF1dUBZUt7Y38HDxtVAQ0p3cXR2cHRJTE1MQUhJWkVf3fTz8/Hz8crL31JX1tLZw8nIyPXx9c3B3dZcRF5SV1NdQU9HWVhBT3VKTURAT0ZDSHROX15GT0tLQlLR28DExMb19cTc2s3F08fI9/HIxMXeVERNQ0xOWNfFzcPNycDVU1VU1F9HQ3d2fXxyc3N8cXR3TVHf09r09fH998zAz/Xx8Pz98vn7//Ly8c3Z0FTQ0N5WW0VLdH15ZWd6eXByfXJ9cXZ0R1HRVFBQ0cfMys/Lzc/0wdPW19Dc3t/excP1w8fB39ZfR0NPTEBeRVpX0NRDdUpPRF9BSkJNS0JFR0x3cXdxS1pX28LByf3l+ffK8PHw//v5+P/9/v33y8PY0FHV3Nre1V9T1VxNSnZwfXN0cH9wfXJwdUlDX1xeXdvNz/b2yvf1zdNSX1FdVNVZX9Dc0NDe2NbV1FFdV1BeXVlFVtHSRU5ARENBQkpOT3RKS013eX58eX1PWlXd0sT19cvEwfDy8Pvn5+fn5fjy8MnY39FSVt7cVVJR11ZfXFpHW0FORl5FRVxQWE1DQExIQFzU2cXGyvXNxN/WV1TX0tPV19LGwsff3tjQVlxV11NfWFtdUF1cQ3Z9eGVlZGVxdEpOTEJPdXR0dVtX1sDMzPX1yMjAxcjJycjK8f78/f3w8fTMw9BV1tZRVlNQ3NLUXUVHQHRLRV/WxsXY3tZRWkFFT0ZW3cXGw8POw8TExvXKzc/MwsbD2FRfVNZU1FJGQ0dBQEZeUdbR1VNbQnB7f31ydE1Icn18ZWRlZ2R8TFvUwc/L9cjJyfD98vDx8v38/PHKyvb39fXC39PZ3dHfx8TdUEZLcXJ9fEtd1trY3dbRUVpAT01HV8TY2sfax9jaw8rx8/D2/Pn+/vPKzvf0wN1UTH15cn58c3FxfH1/fHNwc3FF0dDWV1xNSXRzfX94fHVHVtPcwNrW28L38PXPz8POzs3M9Mv19MDA31TS0tbFyvTJ319BcXJxS0BT09zTXVJQX1NBdEtbVN/P9vfMx8XT0djHwcz19fT9/PHLyvDy/P313lRWX1lR1VlPdHF+ZX99f3N3RF9GT3V2cnN/e2VmZH59dEBTVVNR19bb9/Tw/vz65+fn+vj+98zG1kRTXUNbVdjQWF9Ednd1dkPV0tjd2dnV0cXWXlpBRFbR2MPC9M3bxsXfxdzTw/Tw/PLz8M3Az8bG3lZSU15Y1dFWTnFxfHJxdk5AUNTR19FTQEFMS3dxc3t6eXlyT0NLT0pDWF7R2s3z/Pnl5OT6/fT1zdnF19fSUNfTVFZEd05McXda1trExM/Owsna0tdBSUFGXFfV3NJU0ddU0VRdVNv18v/6+v/99sjKysPGxd7e29jWRU50fX9/fHJyd0JMQVhBTE12c3Nxcnh7fXRIWVXQ2tjc29/awM/x+fP/+/zy9vXLwdnR1FJQUkZBSk9GSUt2cXF3Rlbd19rCwc/J9MrA0UNGXlXfxMPc1t/c111XUlPYy/L85eXy9vX29vHIVFdUUF5GTHZ9fHx/eH12SkJGRV5cVl9CQk1OSHF4fnB1SktaU9XVVdfexMPw8/L++/j+8PT29/XO0lHW2NBZQFhfWlxaT0JIdUNBU1RX097W3vX0xFRZX13Q2lVf1VNfU15ZWVpd1tfK//z98PDz8fHy9tnS397eWVtbT0h2f31xf3lycE1ARl5BTENPd3N9e3h9cHBlcUVAWNXEwc73/fj85eX7+/3z/PnzzczPwtrc1kdYVlJUUlpBT3Zwd3VbXVhdXNPNwN3U1tTR0dnfVNHZ38XN2N3F09fbyfXIwvT1zPb2yc7NwNtVXll0cHd4eXdzfHNzSklEV1JAXkVJRE52cX1wc3t4fH5ySEbVwcXAysvz8v7+88r09cry9s729/b1w8DeVldUXlXTUl9eRVle0dNcW1NR1sbJxsfGztBT01RcRFtQXlBdXlte0dvK9vHx9vz/8vLw8fX1xdHSVlpJdndxc31zc3N2dkhxf3x4eHp5fH5/cnF5fnNzdE9T3Nj39vTw+eX4+vr88ffx9MrKzsHBw9jUUFRbTEVcU11cR0xGR0JBX1hZ0cbO8fD8/fH1x9zX1FdU0VTU1VNfU9na28H1z8fIx8bMxsPS2dhURFlcdXR2dk11S09MWEF3d0pzf3NzdEp2QnV0d354f3F3RFJUxNnP8/3///Lx9cHBxNjCzM329Pfxwtne01FSWlzXU1JQX1lCSkhJQFHQ2cr39ff1zsdRWF9RUVJdXV1ZXd3C9vfK8f3z/fH29vf19/32yNhXUVpLc3J2c31wSnVxfXl7e2V6eHt/eXp5d315f3J3TF/d3M309P/k5+f7//D1wMnJwcnI9/Dy8/Te01RaWlxGV9RbWEN1TkpwdEVT2cDJ/ffx8MzA2lRX3dHW2VfR0F/Rxcz1w8TOycvKzM32yPTwycDeUlxHdXZ0dnF3cXRITnVyfHFxcHZ3cHZ0cHN9fHJ+eXxxSV5QXN3K8P7l5fDIzMDCy/Dx/fj5+f/y8MFeRFNbRVxfUkVBWkJIdXdBUNbBy87w88/CwdzT1F9bW1FUR1pX0tvB9M3Ax/X3yPDw8PL9/PHz9s/SWUVGX0d3cH1ycHJ8e3pkZX5+eWV+f3p6ZXB2fH19dk9XU1LEzPz65Of4/v31yvHy8vny8PL08fXQW3R2dHd3d3R3dXdKQktbVd3P9/375Pv4/fT3zNjdVlFUW1tQU9zNxsHG093ax8Da2sDb0tzc299QUlxAXlRfREZEX1ZYWkFJSkpPS3Z3dn57eHpycXx7ZX9zcHZJXNfF9/bx8/bDz/XP9f38/PPz/fD3w9dZR05JSE5HWkdGQlpdVd719/Ty/vnz8PDN3tvQR09IfXJ2dVjSwM/By8rP9fLw9/bx/PHL9MLd291QVNZX1llNTE1Cd399cn9zcH9+emRlZmd4eXx0c3l9c3RLRlTN/OX7+Pr+9vD29/D9//3298vB2NNeTUNMd3Jzd0tOSXd1QFjVxsnw8Pz4/fz5/fDM2ddbdHFzcExF3MvO9M7HzsvI9crBz8fd3tLR1llfVFJW09RTX0VRVFNWR09HTEtKSHN/eGR7fnJxeHpnYGR5fXdb0M/08fLy8/D09Pbw/f3x98zP9sbX3NRX11hHTExBS3RNR1vUxc339fPy9PTKz/f1VkdMSnR9cndNXNbFwPf19/P2/f/9//3OwsXcxdxW1dPc2t3R1F1aT0lPSHZISHBzfnx/ZGRleHl8f3pkZmRkZXBPXN/A9ff28vz9//n9+Pv5/Pb99MDC3FRU1l1BSUJeTEJbQ0NZU9PazMjI9PH29PL2wsVeX1BERkBfVtTXx8/N98vI8Pf198He0UTV0Fhd1l3R2FfTVlTTWlvT1FzVWUVfdUpwen94ZH56Z2VkZmdmYXp6f0p3XN/e9/Hx++T65fnx8vf198vMyMDFw9nf3FPQ1V/Z3tLa3NbewcDAxsHOxcTE1FRFT0RCTkRYWVBeU9jD9PD/+fr7/vL0zsfb01JcVlHV1dfT1tBXX1xaTUxCSktxcHB+ZXp4entnZmRnentlfHNwcXF3WF3U9fPz+vrk5fLz8fXw9szKy8fG39XRXVdUR0fR0NTY0sbKxc/MzPfI9PH0wNrb2N5QRFZWVlh1WlZR1trL/fLLzsTc1EVT11ZGXdve0lfQ2NjD39zIxtNU19zWXUFJcHl4ZGdmYWNsYWRmZ2RleXtlenBIR1TI/OXk5fn+/PT19/fy8fXz8srP29zGxdJU2MbS08L29crK2s7C1tVV1ldHW9TXXkVaQEJNT0tb2N7N+eTl+P/298je2sbA2NHfx8fQUVFWV1XQ1FdRRkFcWVlESn94eWdnZ2FjbWFnZH55fH58cHROWdzYzPD9/v7/8MrPzszDzsva2sXZx1FX0NXTUNLf2sLM8f35/vD8y97Cx97a3tPEzdDaVUhEQEp3QFHTx8b0yvX02NJSWdHY2sfOwvbAUt9WUdXVV8XO3cXGVcXG0FJPfWR4emFhYGNjYWNjZmZkYWF6dk1F1N/P/fz//v7Mz/f198729PP338PF3snTV93MxcT32sz7//Hx9dLVUV5DSlpAXFdQw9VQ1nVKSdxb1/fe8Pvz/s7C21ZW1s/Qx/HOx9HWWkNYSkdU0FbX1VDe0FdXdE9ycmdnZG9hZmJmYGZkZWRmdHFP1VTZ9P7z8PzJy/b3w8LDw8jF0tRF0V5A1NPPwMzC2Mrw+Pn6/vf898zeUF1f01xXxd/CVU9eU15b0dLZ9vXz8c/JwNFSV9ja28v0xd7bV1xFW0NexdFRUs/AUsbfV1BacHlzZm1iYmBjbW1sYmxsYmZ5fHRd9fH18/Xx9MPN//7O9/v/8fT13V/Q0V3G88vE9fbIyvv9yvr8zs7+VErWSn1SX0bS3EpX1H9SwUfa/cv9+8rw8NDI9FbH8d7GzsvNXFzRSnXSTU3a1EFaxN5fXttddtBIZ3l4bmh+ZmlnZG1mZm1+SntZyF/L+93M89ba9szy/tj3+cbNxNbWQV/YV8blwN3xyc325/vP8OHx2OXDdFfTcnbGU3daRX5xX1vGyV3J+tPI+1LW81NW8Nvx+9fN8llT3lxfQ1Xy31f+X0zw2kRYwdp1d01kYmRtaWJhYm5gZxVteWZyRF3WxfDAVMLDRcH3zPD45/Px5cZV/FFxws3Hy/P93Nb7y1rl5NTx48Nbzcx2dtxHdNrAfXPURH7W/dZR5/hb8+RcRfnPdc7mwc/lxk3D3nFK305DzN1e09pTW9dXd1DNQ3ZZcmxlf2lpcHkVZ3VpaE51bEH2WFvlzHHf+Ul05/5f++7PzuDHTMj1c9Xlw9/k/9v65sX04/DJ5+fN9PBHQ8bXfVT0cH5RdWVW0nZV5N1e/8B1WcpJWf7J1uTgxc391kzH1nfY8F1E9tpP2/VOQM1BdsLFZndTY250fmtkdhUUfG0UfVxgcvzTTfL2c1LkU03j5lXn6NZR4cN5yf911u/1X+Pg1Ofu0s7u8NXn5EHe+ENz9Nh73v57ZPJdZ83lSFfu9Hz5/GZN5UR94PlI5eB0VuBRZPDBesL+fnf+TGH832xR9mFx83pgzX8USkgXZF0UFlpiEUFRa0nmfXPg3Gbw5XrR7sVZ6fl78ON5S+FCeuD7c/nrVsqU81Lr41vg6ETP7kBx5FBm8/RtSvBlfOVYeuTlds7mfXb8TWf083bK41db4PRJ/vZ70eZMcefXZPD3YETzen7yQmH1xWJ9XW5tR2YXZWYQYHdqb95MYcPKZdDlT3Xn8Ubg40Lz4l5G5tZk8PNxzOZTzen+V+HmU/vs1M3u9UTk9HvL/H9I8XFnytpnV/lNRufefvTDZVn2TFLg/lny5tXe4dtM//1PweRNRv5feFBSZ3bDSn/L0HlfX2JkX2Joc2QVYXNoaXZ+ZlDTf1j0WFv2yl/65FPF5NNM8cB9xf90RufGSOfiUcrtwNHj+tPl7MDC4cRL8/BwRPV0fsZQe9H0dV/+V3zB2n9Z80Jb4PFY+edc2uTUXeXyTM7kT0vyXWdNWGF2wXd9zdF/WtJkelNma3x+FWBwFWt9emNB3np18lx0/vla8OFX1//FdN7eeET+XHf++Ujx4FPb7f9Q5+zB9e7+XPjlRNLnUn3Dy3xJxkpzysV53/tyc/5Uesz6ddHmxELl5XLf51TW4vZ1/OR3W/B2Z9xWZ0bwcXD+UWBfxmRmWGQUZEhrFHhjF3tYbGXIX2XN/0HP7sJG5Ph80v59evLDcfTlRNDs/0rz7drN7vhf4e9VxuzHQOX6f1v8dH731mBf+31w/FRz9fd/W/9UTP76QcHjVHfzzXHy4t/d4f9MxftzePJRYlvxZ3vzWG1Fy2Vi0XMWeFEUF01jEGREbmD2UGfC5HdA7vB0+uBaWfpTY9v5f0rhxnjk403H6fZb7exb9pX0Q+LhQPXo1n748WVY+ndjzPdgdeTUf/H/ek/g0Xv+4XZA49hkzvp/1uzHSePtSVHiWXrPxWNz/3Fhystndfx0bEZKFW1GbxBkfxFrRnppXMhkdfradvvhRsXvxXLzymF2/lx9+edFwOn11+zsV8rv9t/j5t3I7fPU5/5LVvN1fthHZljPcULl9XXI/311+dVy8/ta2OfYcsfDdlj/xF7l5VLC+NVz00Jgd9NyecFfZFXMfH/TZWl8fBQVZGoRenZicMFLf87IdNjmwUz950fW/0lh19xnRvlVSOTm0Pvo9t/u4cTjlfDJ4/LG7O3UwOfXc9pQYnJXfXHy8UD1/XZ089B9zfxLU+b2Qvb1fUX/1EHk5Vb25tZT/9xnQMpzc/VRe1vZeVvOc2N0fxQVYRQWYWBpc1FkfcZDf9r3X8Xn0EL4/31O9HF6ycZ90ODb0uPh2/ru9/Tp5sTk4NfQ4/1V/vZwRMx9bHdwYkn3QUXm/3Tb/l5B8tp3x/1Z0eTWd8n0dNb43VHl/UPH+1VN91dl1MF7ed1KZlnRZX1XemtkZhAVf29oSkhmRvZDdfz3S9n+Rlj63nzdyX1K9VRzxPVZ9eLC3u3kzO2V++SV/lH458fJ4cZB/sF6R9ZnYlBXe1n2X1L9zHf05EN3z1F89PV5WvheZfbydMPmwVfl8XX1+kpM/MBy18Vmfsp2bVxEb2dLaBZnbBFhcBRi0Hxn9c503uXVdfPNS8HCfUf733DB/EHW4/FW4ODX+Or58ZXszOfgQN/tx3L880zR93d+0UplVcJ2ReT0Xvrg18Xg1X34/XfT51V15/J/2uFAWO3MePH2fF/zR3L31GRcUmF7zXhvXkJpeUprFXVkEWBGb2LZUHDz+1nH51Z189Z/UNB6dPFNZ8bAT9znVUXl8V/h6f36luNW4+Jc2ubfT/r/WMn5S3T1TWRQ0mVR+9RU5/lO2PJ0TPLQcfb2Tt3k1nbz8UXB/VhE88dz3/NNUMhBd99DZERFY2ZCeGh+fhRic2oXfX9pcs1CdfPMTvflWNLn33HIy3XdzUpe5cJb+/pO3OfDVuPj2efpx93i/3fX8k9Z/NlJ9MJ9XcxGftLUTf3y3PPmU0T7x1v55V/b4stC/vx3Xf7UfcTSe05Wcn7dUmRF0npw3XVkXXRhSkRhYkx4b317aGRFZmf33H/S83RH+8xO9vBzQshKZV9Ef1TKRNXw20D3/NDz4/bw6eH07+zcyuDNUPv/Xtrn1EL52nxTzXRC9tRJ39h2UfnHRuXh1cvhwFLn9Ur0+kZO9196Vt1kdsR7Z8xTe0fZdnHVfGd2cW5gd2NofnprZ0dlZsdCYlHwdFrh91jm7UfQ4UJ69MxzxuRGVvzZR/3zQM3l3sTi59r/5N7N4c1L8fNK1frYU/Pde9r6dU7/0HzFyU3059rA7+HA5ORUVPvNdcrxf3LFf2JFdGx7RmZl30Nm3vd4Q/BAZVNJYndEYWFGZW9PUGd/2HJn3dhzxOHE0eb5WMfEekr1dXzx9HtR+1lB5MB59OLcw+nl9ezmw+bj1dPm9UXz+0dc8Uly9VBhXtxnfMdNc/PlWfaV89Tg+kv14tFR+9d9VNhkc9ZmbURJY03YZUT2SXf3UWBLWWFmRmEVcHEUZERjZ1B6YfXUe8LjyMDo59b68HHW5U1O+dZ/zPF2UftbffXJd83g2cPu88vs5U735kPW4cFx9vV52ft1c/LRZcTwdNbgw8Xq7cjl41Pd4MlL8816dcRnY9R7FH52amfUZWTP3XPC/3JO8Epl2lhvclJvZld6Z1ZDYEDDckbzX1Hi+UP/5XpF/H1699RiU/x8W/tQfMnMcfTi3fGU5vyV6Mrk7cL27clf+8hkXP18fPRzbdveZk34QUXg8MTs5Fr95kHO7VdC5tZnzsNictZubN98bt3WZlfxe3DxcmPaT2lPWRViRmhrXXhqUt9jXPh1TeL8X+/vXPPsTnH60H7IwXpRznxI9XFlxlF/zv9b9+nOwez7VOf+0+DmV/v6dtLmTHfn0Hry8GXZ5EXe7/fO6P9d+/dwzP1J0PNze9Zxb3VyamV2a3nMenr8UXvwxX/K8Hpf8mR622ZtVXFpXdNsXsljTft3Wu/KUuLaf/1WbNPEYFz/ZELkd3L8Wn3l9Eji4FPh6Nr66FfG6ddH7Mh0+MVn9/Zm2/FhRPxlceBBcOz9XO7iQf7hedbiRtLvWn35d2/ZdhVdWGteyGNE/mRy/n5m90pp1FsUc9QUY95sbct/bftSbeX3ZOaVWuSXT1btfXnkWn77XGH53230wG/U/2fE6UjQlcZS6/Nw7fxg5OBw/OxzV+pcT+r0fOTae+TleeTrTv+VX83ocnHgQXDiX2HxWxRbQBZ3ThF+2m565Xlk5HBt5UZo9N5rW/VqdvNicvJkev98Y/xNYPr1eOHiffHkYU7wYXPkemD6SGHg3mb7+Hv270P5ldD9lvHH68tw48B44/9k/Phk9+dlx+Bkded6ZOJQe+n8ce3gcvbgZcDvcFHtS3n5dG3LSGvZQWpB2GNKxntx0WJhUWdmX35sXklvStp6dM5wd/FYcfDOWuTn3uHkdPT8ZVDxc0L0cHT2dHf3dH3LxXbK/F715trZ+t9S99dZ98vQ8crd+fnO/fzbyfTHw87E2Pjyyvj8283RdVvFd1vFdUTDQH9Hc2Z1dnh2cnxOU3R11kl0QXJ2TXR3QHV8WEBB01xC0NBMXt1OUMXV2/zx0cnRfVtDc0RfdUDe0VfdXNz2zMT08cPK/ff38MDP8crNycPPzN3R0sXDxNnAwtrPz9fexdnC9PXM8P7E0MfF383FU9rGVtbXTEpHWEBBdH1zc2VhZ2d7fnt8dnJzcnt/fX9zRVhCXdrN2dn1zPfy9vTz/sjf29FFRVdDTFFTW1BfTkJbXdfd19LY2NVWVlpS2c708vz8/fbK/fP78PXOyfDP8vzw8/35///wws7EWV1XWl9FQ0paUE13T3ByT01GTXR2cXllemd8d3RLR1XVRU9ISUl1WdBTXlfe1dzUUt7Mx9PHz9ZeQnRIRklPR0dFXFHU09Xbwff08czP9sVR0NRd1s709vnl8vL13tLb28XF0lfZ2VDO29v1/f3w/8HLxlfb2PT01sNR199D2VdM1FdWUl9DeH5mbGtpY2F6eHheSXNMfXl/c0Je2V3Sws3x2PH/9+TN9fTTwkRaVlpdVldfTFhaXUVHX9zGVFfbRE1Zd31wSlvfy/f+/vrh9fP+8ufx+fb0+cb0/sv38vj/8cvd29FNQV/GUtfTeFzRSnJHX05S10laRHF4ZmdhYmV4fExJWUNKdEd3dVTX19/0y1LBw9TTysTdwM1GQUNydnJDR0lbQUBbXdNe0MT99MHMwd9RWVZORlFeVMjw9Pb49M318PDz/PH09/XYx9Pawc3Y9P3H2MdUXNr1xcjw2l3aw1JWxcbdx9xcTHV9Zm1vb2xpYGFkZXt7YWR+eH9Y39DO+fDP/f/x/fj+/vjyzttVRENEREJeR0VBR0Z1WF5dwdNE11t3dkBxfndGddnLwfT//Pjm5OHp4ePt4eTn+/H3wcnx9cDH21dSQ1pRWFTQUEVaWXN2W0FJ19rUWNdCeXdzZmVlZXlycUhzZ39yZXl0QtXC9ffw8/zzwc30zsPFVFFTW052c3J1QHxDRllZ0dnRzvvx0sPWX9FdRUl2VMjUUcbDzcHG1cz+/fn4++b8//P02VbD3d3G09TdxdFWzvHH3s7aytFA0FHVyt3Rzt9ZSHR4YGBsbmJtZ2ZgYmJgaG1gbH1f3PP75OTt4uXl5vj68tnGy8HZWHBKdHZzdHBlcElKX1DTxtFWS0ZCTUhnZUJMXlHTzff2yP7l5Ofi4e3o4ePt+s3z8NDaVlhfX9RZRl/WVEda3Ed2RXFwWFJU28zE29ZfWVplYXxkZHZyYHp8YmNnZXp+TVPa8ubk//jk8PT49kdW3V5NQEZ+f3l7cXNC0UJO1MnG9/v22/XI0VxLd3RwWkJC3sHb38b39uXk4eHn4OTk5/vw9s7DR0BXWl3TWNfAxNTdxNTXVEVcX0/SwsHI/8LWzXRgYWdiaWRkY3hjYmBoYGlicn1X0vjh5+7s7+Dk/8vI9d7f3VPUTE9JeH12enFKSEpXz9v08N7C0HF3fXx4SnNx2V7Z9PXw9eDl+ZTk6pT+luTmlUWUZ8fBYvdj9WZfS9FH2ENfRnjAYcZl81vA+N7k0c1FfEpkZXtkfWR9fX1lemZgfmRyTVfFyOX88+LM/fZ0/nfQzWX4bsF2etdjxmfbdMdR/czh8v7h2Pp992BJcWRBZERLRthZ2M735fLh5Obn7OHg4vjlysVeQFR0Stdzz9Ja53L2UUP6b+Zy2PRU5lvk1/d8WGN0aHx6bWVq0xZzbWllaHBgfN9z8vzz4+Ht5uH//PXIwdtVRVtAT3hzek54dllx3l7O/FzN5WXJ0mn/bGD1FvBmf+lq7tXMkUOd8Onu5JD86OHs5frU/UhQd31IYdl89UpfS1pbTFhM2EfJ2Nvf8fDW1kZOQ2B1QBdQf2n2F39bF/oXcMkX62P/5meTdOvVxeB68HHFdlLcxGTGZNdPev9k5kHgzeXzwedH+3lSRWDHan19bMhlTNh3/sPZ7N3m79aW9vmUyOznXuPZfu9v9stjkWDK+GyVY13kFZd42ONqlWL0wmrsF0ZyEfEfcXwQ8B/NbWfMFPxhzsRT59jj/+L45OHT51r1wU7O0tJdc0hPZ1Jwd8Rx9Nd09VhI82zAXRXhFl5EEeBoVfhvkUDll3Ke3+yRcZ5O6pdlnmDhyheUEPxIbekR4Xp89mr+ZtLRX/NL8d/4XPLU1slmzW9If27BFEt+aPQX0XVq4BT5X2aXZpTb2et84XDOVE32Rf1G9HTCc3HZZfNw9PRx533lz3vjbMhxauET1n4V5hDndUPicOrR5OX748Lt+Ojw7v725HTkc8beQuJ7+MR44GjyWGzuauNdYZVr6XRI4Wv6Y0p7a3IUf2hmYX9he017WWX2SVb9VOrB4ONR7VjR5mf79H7rZ8v3bvZgc1dmS8h2dvN/3NJ5zk5kzHl59W/GVm3sf8XifZTwxJFBlO5OntLvlUGWRtT5RlPLTUT6etLFbtd/b/Rif+Zv/fdml3/SlGjjw2CUFtDPHeITfsce4BF0wBPsaVn9b5d85uF+l2ngx22WFezHZ5Zt+MVh+mRx/3r0y2buZNz6au9vW/MW6WlMwxfiFd/abZRo4vx4nGKU7VCeTJTrVpXFz+xP5uZ4lHvB+Bfoanj3EOtpTuAX6GlX5haXavP+F5YS9WQW8hvIamfBFuZuycZ4lGXq/9+SZpFZwu5ukWbl9njuFf53cPYX+mN182jsasLUa+EV53F05GXiZcDWd/Rm/kT99EzrSuLhVJLR6OtallT55ETm1c5Tz1530xXaZ2/CEcB+Yu1i9Ppm7F5Z71LO4lPQ8m1TRRPVbxXYFnJREdxCe+Fxx+119+Rk58h763df7GP422DnenXgetDweeb0Ye1Df+JtUudi+/hu4nRq6BR45hPkymiWYFyTbOjvd5/0w5xZ/pZz6uxgltdllRRc5B/hehfrFsX4EJR0YpZr8+cXk3R+lxD4Qx3hHXxHE/lqWl1m4WTjysmUdpbcRpZt7slkkG3b5xfvYGzvEctYaZRr9PZp72nH1G/nYvlfde5s5XFy4xTgQVrpb+zwSehd5e7V7+fS4830+N/x08BLWtJuXmJnQhHHYHDJaexZdepI5OdN6svV4ELXUXp9ZGVpcmcUUGtKTGjmZM38fZd91+Nk+tBx5llF/9RD90J0zXNZ91BV/f5D/vRx/ENk8Fhi9lhg9XRkynpmy3968ktC50D24t/h7Pvk7eT57eT37v116sVl+nthUWhsw29h+WZz7Xj27mDs/W3qU2fjb3zlEXdEFtlrbvMVR8ht4lRdkF74lnLk5WXpUn3vcVH5bdLNFtBIa/xjdOxq8eBu7U1+4mre/mj5RnLjY/T0ZuZkUvth51PY4HTp/PPsVJXcyO5J7NNc7XrZyG3DYm1WEUByY/Bh8PTR4tTu/tPpTubffeNmTVRrVWxqRRB+f2r0Y9T9ZOPXzuB359PB+HDmVM/KduB2Rvxl2Ndz5dRK4cBa+9Rd9H1H2mVz1H1BUGRXS2RdfEBxc/lfWOH39OLx5Orf5ZXU4ele7ed18sl9Q1ZmZ0JiZFRiefteceL/defxcv/eZP/QYMJabnBzFHx/FEVRY8DmT/zuVPPiU1TsT0PiTXbmTnb4c3nwdGPKQ2f0W3v523L7x3rEymFY/Gff/XnP+GZE+WRl5353633WlEDMlkXTlnPKl2b47Wn8ym7/dm72YWjwbWf9a8L8Z+ryw5dY4O174N1L52Tc12xYbGNmFUtuedNj8E5K73/y/XvuXk/idtn5cM7lTNLhSFficd/mfdv7T1zgUGXlcWPKZ3vPeFvbftRyYsFgY/h7XORG+Pfd49rl5l3o5duV9f7hVf/d1cl09HN78GJEQmz1Zl/leObBcuJxdPp8VvlKQ8hhZ9wVY1FpdttwRf/JQuf9fPr4TMnxXNfdzVpZ9XRc8XddR9BEYPFPYeDefOXSZdzRZEL/T0vtxXbmyWDPyW/Z4GXY7nFGlVZ8ldJll91l6thk7shh59hh51Rm8Vpg0Fhg09tw+M5W5MHCw0f810fhXHPCemR+YmdjfXZhWlRn1vZ8RP9QROXAcPjKfuXke/3odNvqWVPrQHrtVmbsz2nk2hf0VhfNw27y+mzD9W1ZUWFQznHc9k79zkzmX9vtTfrmUu3x0e7DXuPbQOVDcflyeMZlesN0c/REc8hRc8nRdvPV1f1+211s22Rn2WZBxmRU+X1R+H/F5XzH/nne+EjH+kDE51fa+l7S/3Bc1XL9cHDzYV3RY9JHZ83JSOf+duTJevbQfvDEecbAdsnNcMHPdfLwQfnf0eZ1/OVK5MNE81ZE9lt/wHV29nfV837Y8HBT9Fld+N1e/tV/119jct1mZMlzYdxHZVzdSkDP0UvDy1fJyfL11+X3XPn72c3lVlD2SHfXdGNKRm9xUGFB8ERS/tJP1dtLccvWfd7KXnHe9H1f/ldT/vjc+ez1wuf+TPfhZUXhdH300GVf02ZJ2GZ5w39mzVl79fJM2fjSX8dcSE1aRHZbz1p49Nhuz/9gRP9Ac+TydPL9S/Tlc1jnQXH4x3XAxX11WHB5c3Z5eXfVRVfj0EeV8X//+HNJ+kh75d5mysRtXflhUe1z1OvI1u3Pdvr2Y/fmYNDtZU7ieXHhZHjmfmfmcGPlRnPmRELhUXHw12TH3WfFVm301GrR0GtRzGPB+3/86HXWlUhx7l944v194Odl/eBtTeRmYfV/aNVObPTKY/vnZ/zlYtTnZlrnZ1LhZk7kZn32fVrj3PWR+sGUykLtTGT4SnrmUmf43m/awm5ayWh19G5y43Jl7ctl4+d4+8pk+M5m/fNhzf9jXfFpTvxuR5VxU+lcWP5xSfR6eeRPfuNUe+PWbeXEb/fYaVfHYdz1cfvkd+buZsbvZkDuZXbhd2T9QW5RUWpE5HvN60L36nBW7Htl40Rl7NBl40Nm59Fi5cxi+9xh+txm5/Bn+OZh0+VmQP97TPZhcvl7Yf94aMhwZubKcennfu3+ZPnIZvr5fOHkZvbkYd//ZlH1bkf2aXPxeXD2WHb9R3r+WWXl9mX053nc+mFY9WxF+HDe6fXE6v9a4N9m9thj9v9jRfRgTvdiW/BuRvhjfeZ/f+JbTutBdOlCZ+zwZOTzZ/n7Y8j6anXkaXvjcHzt0H7j1GL7VGrP/GBU5WFa42V17nBk7tBi5cJt/fln+OBk8exnROhyf+12ZeJLYeB1FPTRFVDyYFbic8TrSkLuTWfgymb6/GzK/m/D4GHW70h34th65c9m5/Bg++RvV+BkfeZ5ZOVLZ+RfbvHFFNHlbFzsfN/pclzuQHjj/Gfl52Pw52DY4WJP4npn4XZv/1Ft/Mls9eVvVu1hSe5/cu5bSO9dZvvEac3nYNDsdNfpUF/sXXrhz233+ml3+Wxl/2Bk4XBg4sFg5/pk/uZ+/e1k2+xhd+x2c+DUcuPbZ+XAaMvxFUXlbEnnZHDnfmTjVm3n82735GzZ42JT7GFN6Hlh7V1h7chm7/Rs5vsV9OBuVu9mXOhlceljYu1lauZFaebNbuX/bvjtYvbqZETvZHjtZWToQWHuymPj5GDn72P87m/A7ml37WNn4Hlm4k1g4t9o5fAVxvtq3+ZpUeJpTpV9c5bZcpXNYe/0buD8av3lad/lbkrgYHDsZWbscWjkXm/gw2Lj/2Hh5mPE4WdP4WRy7HN673Rt4tFj4f1n5ftszfwUTfprZON6fu58e5VccJf0e+36YfL4bcrmY9jtZV6VTkrvR3jnTW33SmraUxdSwGhd5WLd639E6HZ871Zx7dZ74MFj8vBh9+N81uN0dfh/Z/hNY+X1Yf3kZMblY0XkbXr4Znnhd2DnWWLnzWfg53vm8WPk02ngT2ztdnfuetPqYeHuY+vybe5hZ+kV2uYR7FpikWBQlBTj9xWWbXnrE8LAEetkZJRr5+xul9BhlGB1623B7WzV9G7e+WHP+mZV/mdw9X9y/Flx5PdI8/pwU+ZcfvXdZ1nzd3PxVGdGyX5x+/JzXeRFYN/9ZmL+yWxF79Vh4ZRAd5TuZ3XuUGrQ60Zt/ex9Y+XtfXjg52Fi+v5hYvbBam32wGhm5+Rlc+/if37h4XB84O90YMfnQGXO7dNmWOVSbXD8wGF++Pp0fvblRGXc51BgefTZZnj2/n1n0v5aesPi9HBH//R8e9/wRX1T8MR2UeXk0Vr85NJ/Xs5RcnXOyU530vVUQMX78NVXzvfVT1DERX9wWV9xd8T33V7b98BDTdPZ0V3Vx1B3StPcWUlSxFhzSdPEXkbN/drQz/HJ0dfNyFZERVZRdXdaVVh3d0ZZdFrX0VRFX1BYdHVYXVBAUdnR3sLz/vH2/fDH3trS0tbV3NDc1VXf2sfEwcfFV1jW1V51dUJ0c31KW0RYUN/T1sbB2d/byMjA3tvTXl3QVF9T11BYXFdV1VVUX0fX3FZR09reUVRRUF5eWkBDTEFeQVleV9Lb3lVU1FJHT0JBU1BcUdTW0sPMzs3BzcfY28Tc1dLWUlXd1FNU38POyvT3z8jIzNhUUUJ0dHVJTVhYU1JU0NRUVFNYU1RR1F5ZU1tYXFTT11JS1FXU29vS093Gx9rBwMbexcTWUlfTU0BfXERLSkJCdk5fRnRJR0N1dXVGQUFYWVxX0d/By/L//vzw987Dw87dXNzF3VXd2MbMzMvMwsfE2dHVX0x2cXZ8dE1YRklZVVFTUN7f38DPxt3e01ZRXdXT1t/d01fW2d1TWV1YRFBSVNfX0NRTUt3RVl9fXVhbUFNTXlNQXERHR0lNWUlKRVJYRkRQ0dXQx/XLy/Twyd/Z3FJFX9XQ0Nva3cXK8MvM9vPzyvbxzNZdXEJ0dERESktBRFtTUFpcUlRfXVFeQ0BCWl1X3tvb3d3e2sRW193X0N/b2MPDxNnQ3FBX1VdSXl5R1VpOWkRAcHJxfHh9cHZwTltHTUdfQFjd38Px+uX4+Pzz9M7cU19Wx8LHw/X29/TPysrG2sXf0tzVWkl3c3BJTHR1dE9cXUTUzcPYxcTA09VVU1xX3dvb29nQ1d/UWlhSU15ZXNfVUdTVXFNTU1xfVFdRVNdUXVVX0F1CSXdxcXB2SEJMW1pCRlpEWFPE9Mz0/PTH2MfSXkdU0t3N9Pbz//n58vP58Pf28fXE2dxfd3FKd3N9c3d2dkBNRlHV1dBXUV9GRltZVdDbxtnQ28bUUlTd2d/NysHfw8Ld19DUWExYWkJDXlBHT0dWRUhEdXx4e39/eXNDQ0JaUVBbXt3Y2vbl5f798vDM3NjQ19rMyM3K8v70yvL0xcXMwldbVddMdUJPSnROdHBLQXVLWNPZwcn39N7U1tHXVNPGwNVX09ddWlhbRVTS11TU11BeXVRURVzVWU9BVNRSVtbf0dLe1l5aRHN7fXdxdkZHS3VbU0dFUdfSx/X1zcHa19RV3c7x8Pb9/Pjk5Prw9vP9ys3A2tVbW11YRV9DcHN3THZ2dnV1SFHRVNXVRkVcVdve09zQ1t/DxlpWV13dz831xdHaUFhWUt3VWkB1T05AR0hGX1ddWlJGdXF8fXNKdUJCQUBPUNDR09TE9vX08f7x0VLYwNnL/8/O8fnw9PH/9sbO8MHRV19EdnBOUl9NQFtZdElbX0FFV9TX38neV9PIxd/Nz9pW0MReT15WQHRH19FXUN1WQ0JCV1dX3NxXVNhPRdNVxFhdzcdUUNZad311QXRyd1lEenZcQURKXcXdyszMWnbWV97+5Pbz/uX/8Pvg/PDl5P7389teVEhfWHFPQ3FzfXRxc3NfQ3J7TFVASlJXd1L0zlDT9P7OWFVXU1LBy9bxysDleEr9w3BL9szCxnB5XkZ1cE9H01l10l9ycllHS3pb219bcXZRV9/VR13bwtne9MrV0dvw/NPC/vXJ5OX7/PHwwdv39F1K11TXdUndX09eUNFNT1hcW0Nd0VZdXlVWQtTaVl7FyVHXU9XUdEbRUUPCUUBbUttWd1zFVF/Y9d1aXFRVSEdbVlHUVlBRRFzcS3HXWEZNcUxDdnJfWXXaxdVTVdfWUcLbyv745OT64e3g5ubm/fDz883Txs/QRVfTSHBOQndxTVlPdUJOU0B1dXJ1dnNLTNXS0tPb393XX93W1tnM8djExt3FVlFFQFhY1FxbWVFERUxKSXJzdX1zT0NLdHd1RkZMRXVARlhUU1NYU9JdUlff1FPayfT//v/5++fj4eTl+Pn19Mjf39dW0V9U3VNdTljS2sBWXF7T21xaQF1HZXJPTUpNUVx2dVxQSUBd3cXC9crW1NPE0FheVNBaXlfA0MXAycNYVURPSUBfQEdCWkl2SnR9fXNKTnF2TEhaWEl1dUZOckHW3dX35uf75+zm5uHj4+P/+Pf00NX20dTS0dpJe1nRXlPc0FpG111MTHdDfGdkcXNzSVlCR/TGWV3K2vX44+T+9sD0zNvQx95PSH9yQc5VUdbQw9h+d1F1c3RWTnJ3e3NwRtVMV0R3V1xHUEHUdFBZfHd0ddH7+/nh4+X5xvrm//Hb9MnXU19RVkZMzNBCR3bCUUXFzdLG2dpEd19ETUddQEJ2ckBNfHR3Xn1wWV/3+cL+0s303FZz0nV28dD72PnFSvDL/c/0y8Ba9NpdWEzXT3V2ZXhDZkpGdl12Uk99WHFKeGRydFfDy/Lm5/jn5v3+++X98/f4/f1cTVBb2Ux3eX9GdlJbRFZF1UFBWHB6QkNzVXdFWEBMTVZWW1lSWMH+5+T84Pj08N3T9dLYycXPwt9R1lRT31nTUUJGc0dCcUh0THV3TnR1S0VSW0LWQ01XX19eTEhOQl3A9vb+/Ofn+f7l+uT//Pb658fTX1bfx9LfX1LVX9PQ2dDb0lRYRVhwfn5+eXxJcHNMSkZISEt2cETYx8j08fHHxPXEwNDR9PTAxd7JyNFUxPFQ0VdSVExeSEFye3l8eXxlfHR2fXVFTXRwRk90dEtxSkPUxsTK//zz5efj5OTg+/jk5PDzwcPLwNzFxVxTVFDVXkrUQFxGXlRddElxcERBRUVeQFJR11lKWNPR0tn1//DIyMdU39HUU13WxdnWXdTeUVdRU3VOW11Pc09KcXZKdHVLcXNLS1/UXlJZRVpYX0J0dnZNUNDH9cj8+Pfy5OD65eTl/PH28cXd28HM0dbZUVtbX1DV0VPU2NRWUl9IdUlNTk5aQ0lGRkh1cU1PSkFU1dzaxsTGzMHS0sTb0tzNzMHH9PXAxcbTU1hHQHV3dHd9cHdwfGRkfHt5d090d3Z1TnJwdnZ0SFfSxPbl5Ofh7Onp7Ozs4+Dh4f/y9/bOwNnUV1NFTkhIQEFNR1JER0ZPdHVORVpMW1pZQUFaU0VZ0NXUUNjBxN/M9MxV0dBETV7RUllX2NvT19reWElMdXxzcnNxdHZNSU13dEFHWF1QUllERk1OdEp0SkJBWNLHxvH65Pvk4ef4/Pv7/fT8/PbE9PTfVtDYV1pc11JaUNzSVlfXU1xYU19ST3dBQE5LQEVHQltZWVlSUdbf28zMxN1VUdVSVtPZ0tzM9czF2sXXT0lMdXx7fXB8fnd0fXhwSHdwS0l3c3BxdnZwdEhBTVzb9Pz54e3t7O7i4ebg5eTl+PjO89rW3k1YUEhfS3FSREB1W1dCSEdTV1hSV1BaTFlfQ0JR1VBSVdLa39nPxdvH2NBcR1hHQUdbVtRS09jf39bVX0BOQ0NKdnZ1SU9JWFlaR05YWElPQ09yfHBzfGV9cXN0RN7w/eXm4ebn4+Hk+uTk+vrn5f/1yffB1NDXV19YUNHWWVbXUERMWVNFQEFMTnV2TUZ1SVteXFlQ39nQ2s3Ax9HX1FxdVtTW1dHe2dTdw93WVFVSTElERXVyck93cUNdWEtKTkN0fXBxcn9+c3FzfHxKW1jd8vv7+ubg5ubh4Ob75eXk+P/89MHS0dDVUFTUXVlTU1pNT0RASkNfX0NKRV1BT1JTRUFJXVZW1sXGxtndxd5RX1hbW1pQ0dfW09Ld0tPS1VFRU1JdX19YQnR1QFtRV9XXW0xARUJ2cnN9eHt+eWRkfHVEUcP28//75Ofn5Ofn+/nk5+b6/vjy9fTJwsHY2djQ1lRZWkB0S0NITUpxdHRMRk1CRVpAQktDV1DTxdrD29/E39bV19DU1dfFx9/Y3NDWV1RcQF5WUkVNTndyfXR1TkdfWURMd0p1cXF7e3l6f35/dU1f3trP9vDy5eXm4ODj5f/64Obl++X/zvT0wsbYwMXS119HQU9MdHVNT0xKTEdYW1JTWEZEQUJCR1nV39PR0tbUUVBTXVxERF5R197Bx99SV9NQWFtQ3tPUVVZZTkxEXVpFVFxYRkBFdXdzf3l4f3pkZX93TV/V2NrJ9/7l5Ofn5Pjl5+Hh4Obh5uT4/fHw8/Hz8cHXUF5MdXVLdHJ8c3Nxc3d1QEh3WllBdUFW1FFV0NDT0d/O2MXf0dZU28XEw8LE1lDRXEVDRFPVX0NPSHB/fXdIcHVPR0p3dUJ0fXx9c359d01PRFHf39zE9/Lz+eXl+vj+5Ofn5Ofk5fz9/cvJ9fD2z8La1FxYRkp2dkpNSklBXVpAR1dSTUVTV11T195QUFbQVFJeV9RaRV9VV1Tcz8/PxMDTW0dFXFJXVNRXXkVZRERCS05NQ19eSnV2dnx4eX1/ZXt0TUhPX9FS0cX28/X3/fzz/frn4eHh4uDg5uT49vf88svLxt9XRExKc3BzdnFwdktKdkJJQ0pMXlxHX19eWVxQVNZcXVfd0VTX2d3X2MzI9c/Z3lxGQ1JETUdHRU9AQE10dEpNTkRSXEtxdnZxc3F1SXZLXldfVtbd09DYyvTMy/D88fD45fv65Obm+vv588nK98rBwczFVVpHR0x0T0FBdElBRUxOWlZcSETc3EVeVNRYRV9XTXVPWlhJR1fW1tPG9PXP2NlbSEdQXkBHU9VaWl9QQnRAUURGX1JLcnZ0SXJ+cXZxdkxTWkVY099WUdnK3NDM8fb28vrn5+bj7eb++Pry9PTw9srPzcNUWF5ZRkJMWk52c0tBSkpbU0xC1d1ZQUXU1FhfVF1AQFLVX1pQ0tHV3vP9zd3eVUFPTUNLd3RdX0BDWVpNQV3fUkJJQnRzcEhwZGV2dUpJQ1ZWU9PO2t7ZwM7Nz/Dy9fTw5eTl5OH4/P////H18PLJxsPN3VJZVF1fRUBASnN0RkNIdUFZUVPV0VZZV9ZSRF9QR1hfXFBTWVNX19rPyMDfVNRTRnRPRkNPWFZbWVlTV11T3dBdTEBCSXRwfHh5eXF3dnFAXVTU38fF09HEw8HFyMzP9fnl5fr6+vn//PP39/H/8fTLyNrQVtXT1F5HXERDQERDSHRNQVpERkVZXFlcUlVTR1pTUlBeWFpaVtfY2sDZxMXaVF9ZRENORlNUUlNRVdbc0dVcWUZERk90c3B9cn13dnN2S0Je0MPG2cnLzs3Jz8fTx/X38Pjl+/v+5fv5/fH39s7D98jcVlXWUUdS0VBMWllbT0pAQ01PRlpUWkVYXltZXVhcXFxRWEFERl9EXdDe0d3a2FRFUVRFdUZSW0dHRdTUVlTR3Fxe11ZKd3VLeXp8SndwQ0dcX1fEycXZzffA3NjB3FbSz/H2/frk8vz65Pjw8/zxzsr39N7W3NBZUdHb3VFR0tNDSUBad3JD1VJCQFFZTkbV1kVNQ0N1cHdBRENH08Tf3sDOVVxW0FJHVtFRQ13R0F1d1ddSU1DcWXF8cnJ6ZXx0fX9wQ0FaXNvLxNr09sjc0NtSWNPw8vz64ePm5Obm+fP18vPJwffCU0VfVERHUdFeR1hSRk9NREh1TFzVWEdH1VdfXN7dUV5YWEt1TllYWVDZw8zawcTRUlpWU1hR1FpHXFdTU1hQ0VZRVtVGc3lyfHp8SkdPd0NTXlHd29Pb38TG1FBZW1tT2Pf08uTm5uTk5+T9yvTx9fTNz9tUXVdUVtfBx9VRUVFFREJPdU9aU1pOTUVcWUdb1VJPd0l0cnFPRUJe0MbH3tnY1lxeV9XZxcXE1NHS1F5HUdPVU11fT3N/eH57ZXBOTE5CU1REWdPQ1t/H3tHV09VW38HL+eXl4+Lg5uTn+fTz/PfHwcbYVFpcXFldU9fQXlpRXEBCQUZBQVtYTkhCQEREW9HWU1hZW092T15ZW93C3dXR3FZYRF9R1tzEx9nW1VReQUJTVlhBXkVKdnBwc3Z0RFBTXVTRVENd09DXU9DfV13R11bQwvfz/vrh4eT7+vnx9fL9yMLAx9JV3sTY3NLFxd/UV1dbTUBbWEJJWEl9c0tPd05CR1paWFlASnF0Wl/U3NjZ1VHX1FJW2cXFyff2w9PQ0FNaX9dZSEFBSnNyc3x8c3RCW1BWV1ZeWlpSUFzU3tde1NrY2cz3//n65+fn+Pzz/PDx9vbI2dfT0VHV3dHV19Pf1lZUXUZMRlddQE9ATHdHRURAQ9fe393RUF9DS0JGRlxUVF5MQkFOTkVd0dzZxsfF31ZQU1lbXFNDdHVCTU5CT01EU1RQV9zRVlJZW1bXVFBZUkdY1t3S3sny+Pv65fny9vfz//7y98/HxtrHx9rEwc7D0tjfVlhcWkp1T1tLc3FxfHNwdkpPRFFX1VdHQUxITltQ19bS3VdQ0tPW3tjN9M/My8DeVlBRWVtNSnR2cnZ3d3Z0T0hHR0dRUlhTUFfV29lVXVLX1tPYyPf08Pjl+v/y9sv1z/bz9sr1wsXe39Pe29nFxNre291RQEdHRkxIT0B0d0BNQllWU1FeUlJeUklKd0pJQ0VYREZBQE1AUNTX3M3198zA2N/UV9VXRklOTkJ1TkNeW1taX19dU1JfR13X0FpdUFhNTkdYXdTazMr3//j48fT19Mr09/bx9v3z8fT39vbOzsv3yMbQ0NVETU5CdnxwdHx+dkNHR0FHQk5AT0hxSkJNTUBYU19fUtTdVN/GwtvBy/H0xtnZ1EZBQEJ1dXVxfHBxSkt0SEFaRVtEU1ZW1drTV1zU0Vpc2svKyPX2yvD9/PTL9Mja2sDPwsfPw8nBxM/P297M8vDH3NLaV1pHRk5ITURMRV3U0NTRVVhNSnFxc3Z1dXRxcE9bdXRF0NRXVMLPwcv3ycbFxd5dX1xTWVZYXVhMWlJaTENfUENMUtFdWljVXExLQEhxRlDf3dPHzsfK9fb39/bx9MPNz/TIz/T+/fHw8vD19/zwwsfe2V9DT0t0cXBwdEtJQVJZW01HdHx5c3JzdnV1cE5FXVtUwfT1yMrx987Jy/TG2d3WXk1OWFxaSUBbQnV3dXd1TUZMRllTU1NVVFlBQUZaRFffws3NwfTwyM/28v3w8fDN2t7b1t3ZwcHbxMDNzvX198jAwMLcVkNCR0BNRF9TUFPR01RZRXdxc3BwfH1yfnh2SnVIXtPaxc3DzMnNwMzKzsPZ3NdSWVVRUFfX11FWX0dNWFhHWlxSXFhcXUd1dnR2dnREXVJR3cXMzcn38PL8/vv59czPyNvG9fTJy/f39fb98Pb09s7bVkdIdXRKdEhNTV1QWE9GQUp9fXFzeXlzdn5+d0BCTNfN9/X38//wz/T3ysbY399fRFteRUxFVVFbWEF0d01BREhY1dRcVtRRT3ZOQ0dMWdHE39PL8MzP9/399vD/8dva2t5QVtjCx9/EzsnNz/L49/by8cVeQVhCdklcUFfT3NtQXV1EdHFwdnxle3hlZHt8dHdP187H38Tx8djG8fHCwcPP3FPU0NTR3cTB3FVRXURFT1hbQ1lQWE5OTHV8eXN0cHRDVFRS0MzOyfb/+/v+/Pnzy8DLycLByvHLyPXz9vT9+v7xys7RRXV3SnBwdFpYX1hcRE9KSHVwfHJ0cn5+cnl5ck1eUNbJ9/TL9PD39cr29M3e0NBXWF1VV1RRUVJbSUJ2dnF3SERFXVNGR3d1dEtxTUxBX1Tc3N3b9fby/f75//bx9M/AxMHF3t3FwsPFw8j39fHy/vzxz95XRkdOQEVdVdTc0V1bR0NMdnFzc3hkZmFnZ3pydElDXtfQ1tPE2MLDzvf19M3b2cbGxMDPwsDdxN9SXEFIdHVLW19aS3R0dHJ2S3R1S0FEWkNS1NHGyPD45fr///3x9vX3y8rKz/T3yPfy8v3z8/z99cVRX0VId3RMTUlLQUNKS0xLSnRxd05xenpleHl9dUdc1tnFx8DNwsDFx8DLys3Y2tHU28Xb29vYVV9ZR0J0cXNwdUlaRUJCQVxSR1tWXERYUFJfUN3e3tvL8/3x9fP2zcDAx9jdxcTaxc/PzvX3/fz9//D0ztzc31BEXdVTWkVQUV5TX1pGSndxfmZhYWZkZH9KTUBfVdVV1NPf0NvI9Pb19PD0w8j0ysrJzcTT0NzURHR2cHJ/cnZ2cHB3T0p2TFhLcXVDWEFGVcHN9fz7+P/9//Lw8PL89s7L8PT28vD3yfTx9cfexd1TR0VbT3NxSnV3SlpZTkxdUlxaTXVyeHp4fXF3R1ZVVNnA29HU0tzZ2MHAxsDOzs3F2sff1NXS0FRXVllIdE5KdnF0Q0ZHQV5TXEFHXEdJTVJSWVbawMPCy/T1z8bByPTDzM7Cwcn39vb38/L88vD38fTIwNrT0dFcWFpcUF5eU1lHQUZOS3B4e2ZhYGR4f3xxQkdbWl9dXFXZxcD18fz7/vLz8vDJ9cvPxsDOxt1XQXV2c3J/cXZzcnFKdUh1dXZ2d3VNR1LV38709/Dz8vT29PD88vH38v/8//zz8fX0ycrJxcbDwN1UVFBHREdERURFQUBHW0BDQElxdnF8fH1xdnVCRkRQU1BT1VXV09fQ3cP09vX0ycHGw8fY2N3W09PVV1xETE5OdUlOTkh1S0JATXVPTEpLTFxRVdbCyMzGzvTOwc3L9vf19v388fLy8fTK8fH19ff2yszJ2tDW0ldTVFBTXUVPTnRzfH5+e2VlZXt6eHJ2d3FOQlpFQVbZ0tjM9M7J8vL88vzw8vDIy/P0w9vF01pGXFh2dnZKfXxyfXh4fnh/f3lzSnN0X8XH28jy9/Tw8v3w8v/7/f3++uX58fD9yMnLy9rHz8/c0NDR11BeXFVeW0ZaSHd0Qnd5fnN9ZXh8cHN3d3VMQUNcV19H1M3e0N7Lw9rL8vTO9/D1ycjNzcfYUFfTVV5UV0RCRU1xcnBxf31yc3JycHRKdExf0dRU2/H1z/Tw9vbw8vH28vL5+v72+fny9vL89MbIyt3WwcfUV1DUWVhBdHZJdnxyf2Vke2RkZXx9f3NKdHdNWl1FUMXMw8DA9/PwyvL/8fHw/Pb09Mnc0lFfXlxbT0JAQnR0cH55dn14fnJ+ZX52dkpZUNXRxs/28vzw//r58/3+8fD/+v3y+fj98vP29/TP3tjZ1FHVU1hbXEBKSklJSVhASnF2cnl5f3h8cH1zTkFISUVYRFbZxNPS2sfP9/T18PPw9fz+9MHMxFNW11BZWkVATVtAS3RLcXN2dHFycn56eXR3dVnWUlTEyvfK8f3+/fPz/vz0yvz+/P/l5fLw/fDPzsDc19ZZR1leTU9GT3RPXEJIQEZ3cnZxe3tzc35wT3VITUxKRFXV0Mz0wsf39M73/f798/Dw9vTA0t/TXkVTW0NOT0pKTEZJSU13cHVIcHx+f3h9d0hH0dnX2/T39fH//Pb9+P/8+fP38vn+//r68vTw9MPBxNVTUV5DTVtCd0heQUNSUERETXZ+f39lZXh7ZHxxcXN3d0pBUNPdwc7L9PPw8f77/P35+vLw8cHV09lQUNddQU1CTEtAQ3BwdHJ5cHd7YWVyeGV3T05f0NzH9vT38fz88vjk+Pz4+/j65Ofk5eX99/fJ2dvXWV9eTndCRkt2QlpMTFtFTHV2c31zf3t+fXl5dEF2cUFbRlDMys3L8fT18PDx8fPx9vP99MLF0VlW1lFFXl5DT0VcR01IdHZ1cn1xcXt6fHN9c05FX9TZx8j39vH//PPy+Pry8vjy9/zl+/77/MrAzMfQ3tZcX19HQF5URElfV0dNX1p3cHRwf3l6Z2V4e35LQndKWVdc0s/Owsn29PX39/by/fPy/vbHwcdXX9bcXVvU1VhaXEFOSHZ9c3F5enxzZGd5fmV+S0ZCV8PDyvz7/vrk+vvk5/j8+vv9++fk//L2wdHQU0ZFWUFFV1dbWl5DS0RcQk5HQnZ2dHB/e3t7fHZxdkVSRF/ay8fGy/bO9ffJw8LGwPbz98v0z91V119GWVdSXdTWWE1DT3d0SHZ2dXZ9cnF5e3J2cHBDXlDczPTx//r5++Tk/vv78c738fTw/v33y8DWU1NERlxU19LE311eUVZYV9dESENJc39+ZWZkemV+d3BxR1RQ1cHIx8X09s7PzdnR28LD9fL2yPfK0FXb3FDU2N/U1lBPdXZwc3Z0cnxwcnp6fnllfXZzdF/V18Lw/f7l5Ofg4+fl5Pj09/789Pf89sLY1kBPQUxOXFVdUNFQQkJfRktEXk53T3V9fHJ8eXxxcEtZWVjXx8LC8fP19fDK3NLWXVzU0t/DyMDGx9dbUNZQXtTZ0FBRUVpBRkt1QkJ1dEh3f3FJcXJIQklEVdDSxvT39vrn5eTl//b0yNrayMvD9PzO0dLQX1pR19TT2d7Ew9xV191QQUVSTXJyc3pkeHh7fHBwdERHQ1HZ38fx8/T19MVU0dnVUdnNz8r2ydjH2ldVx9Jc1dhQQF1Zd3BIdHx2S3J/c3B/fXRxfUhZTE7Vx9nC/Prk4O3m5+Dk/P399Mn09s3ExVVBTUBJSkVdQUDV39HS1l1W09VYXNVGdEhPdnZOT3VKQEZEUlRS1M/KyfT3w9/b3FpEUVlHVNvS0MTeVlDX113V0VZV3NBSUFVYSUVTTHVEWklOQ0p1T09xdkxLdVrV19v2+fjl5uTl5frxz/XLzMzO29DRUEBAX0VBWNfU0MzOxMTA29Pd0VhAWkZ0d3d8eXJyfn10THdKWVDVxM3Bzc7Nxcfa0FDW39PbzM3Ax8fG3tjYVFHX0VXVVltERkRMdU5KdEpJdUp1dHd3dXR3SEJGUdvI8f7l5uHg4OTl+/P29PXPxMXWXUdBSXZKdXRBV9fW0d7Y09/f1VFQUlhfX0BOTk9xcUJHQEZbXVTR2MXHxsbExdnQU19cXV9W093S0FRU0ddRWVNR1ddV0dbVUVbVUFBTUFdSW1tFQ05KcXB2dnF1QUVQ2Mz3/OXk5fr7/vH39PXLwsbb0tZTRVhaQ0BR09zEwcLPz8zE3dHUU1tcXkB0d3dzfX1wcHZ2SlhSXFfd2sXZ3N3T19TW1NzYxM/PzsLPw8Xe0NFX191XUdVWX15FR0NAREJORkx3d3RxcHBwc3x1W13XzMr3/OTm5ubh5Pj+8PTx9Mbe3NRYR0ZKc3dOTVpTVVbW0tzZ2NtWUlRcXldQQU1FQ0hJRUdAXVZV0tjf0NvF1lPW0UdGW1tHXNLX1tzT1NfWVlPVVFbV397X2drRV9HfUV3VVVBfWk5LdXN8fHx+dkRcUtfGzcjx/v/9/P/29PfKyPXP2trH0ldQUV5BXNfW3NrGwdjZxdre1FlaUkZITEpxfH1xcHFOQEdeVtPY3Nja0NVV19DXUFHVVFTdw8jFxMPE3dPS0VdQU1dXVVVdUl5AQUZBQkxDSHRKSXRwcXBxSVrV287K9fL4+fnk5P788vPKzMvA39DQV1tbQUlISkxBVlZT19Lc19LY0FNeUlBSWVtaT0tPTUVZUtTf2NrCw8HG2tzW1FBeWEFOdU9GRVxXVVZT0dDVVNVXUNXZ2tnEw8XR1VXX11dWUllHSEhOdHBzdktJR1TS09jByfT28PH09fTKw9ne2NzU0NLT19bXXVxW1dzEwsbEyczF2N3UUlNSRkJCdXNwd3ROR0VaU9fU1tjZ1VTX1VNQVVBZWUFHUNfU1d7F3trMxdTc3V9W2djW0d7RU1JQWFhcQ0pIS3FzSktxdkRFWtLb0sb38ffz/vLw/fL19/HH3NreVl5VVUVEXEJLWkVNXt3RUd3H1lfS015W0FBaW1tMTVFVU9bFxcbIw97AzttXUVdBTFpBdElNSHVNRkZd0dBU1N1RXVZTXdLPw9vCy8HFxd9V0N5TQEdGQkxBQEtOXlxcUFXW2MDE2MXCzcXAwNjAxt3U1tDQ0t3Y1ldUVVFSVNzAzc3Iy/XP39zXX1lZQnd3S05NQFtaXNVUVNVV0NTVV11fVdFRUVBTUdTUUdXYw8fFwtvd1F1aR1PV1dDS3t3YxFRYW0VNdHd2d05CTEJeUdTS2dzZzfXLzcn09Pf1yMvJz9nQ01RX0dNWXlNcR0NJdUNcXF/XxcPGwMDZ3d/TVVZTW1jX2dXUxMDZ0Nze3thVXl5ZQU9HRUJOQ0RDTkNaWVHVUFfQ0V5aXFxW2cbBzfXLyfb1xNrZUUNDWkNCRFtPTVhEWlFWXVfZ3VHU2tNV0N3SxcPc0NrE39rJztPW3VVSWV1X09vexM/0z8bO2tVXUVhDQUJOQ19YQFBXREZcV1fXVVxeVldbX9ZTXdTQVl3c2t7YxdzX3tFHQVxZRlHZ2d/Fx9Ld3lRcXkBxc05NSkhfXltXVl3Xx9jTxszExcrIxsDDxdvG39bT2tJW3dhXWFtNcXdOSU5R0FfeyM7GyvfG39nQUlTT1FHS2tPRxdlQVNzVXVFRR01FT3VCRnR0Qk9LRVZRVNbWVFZUX1zX3NbdzM7J9fHKw/XP09fQWkhEREhIRVtOT0BNQ1BXXl3VVVxS3t3U28Hf08HDxs3D2NvAx9ZXUFtFUlFU3trb2MfPwMDN2tVTV1lEXFtAR1FfTVlRWVtXV19X1FNYUVNbXtRRRl/UVFbd293exd1TUFZYW1FVV9PZ3NzF29HW01dGR15ET01GQUVYR1pfXl1V3NzR3cTFxM3Mw8DE3tDf2dPR0tfU0tNQXllHTUJfWVtU0NHQxMzGxdrY1tPY09fQ1NXW3NPV191VXlZWXkRaW1lfWVtATU11SUdBQFtW1dTV1tfU3NLT2NnS3cbDw8/Jw9nE2VZRUUdIQlpMSENEQkxZXlpdX0RZ0tnewMrYUdzG09ba2dfS3tzfxd9SV9nc0dzcVVfd39LFzdxT09lRUNdRW0VaWl9UUkFR3FVS1NVYWlJUUFXQX0BcUkZbVVJaVtnT1N7YV9LM31Xd3FFc0N9WVdjUW9TTXUVeQUtMWUFIWF9PW9dWX1XQ1t7I9cn39sXUxsHWVNdRW1HTVVfT1UdT2FRaV9BfXd/Z1dzC1lPaxVdVxdxS1dvfVdnF19LH1FlX1UVb0NdHRVVFdEBGSkxEQEdU3dVX28fd28zfV93TXFPe3lDSzNLRz8NQXVxDQkVaS3VcXU5EV0RCXtVU0Mv3wMP1x93B2F5ZVFBe1N1VVMfC3NjG2dHR111R3txX1dJU1d3WXV3WUV7W3VfXxsbR0t7XUFFWW1fZUUZaU0VCXlJBQlFTW1bWUNTCzN7cx95QUFBGWdfUUlTEx9ja29VYXkROQkBMRFxZTUdRUl3R2sDK8/bNzvXD29/VW0VfR0FeUFJR2drU3MPcUlDXUFDR1lPUxNxU0tPW39zd0NnOwd/E29fU1tVcXVBTVlFdRlpfT0xFR0RFRUNGXVXX0dnZ0Nzc1ldXVFbV39/cz8jG2MTE1FFcTUhOTUxNQExMQ0deXNLBw8/Nyc3Awsfd19RSWFpGRVbV1d/e2Mfc0VRS1NbU1VDW3dDQ3NDR39Hd3dXQ29/W1NHWV11TUlPX1lVUVldXXF9dWF9RW1pYRVpc1dHV09nRV9VXXVZVV1HV3NjexdjZ2d3VWVpFQ0JEWkBARUVHW1LUx87MwM7Jw8PB2tzR1F5BRERHWFJQUFXW1FBWVFDQ2dHR2Nrf2cfA2tvE0dXd39LS3dRXVNRWW1bVUVXXVllfXVtaUlNZWFJEQ1tHRF9SVFfU3dbRxd7R09zQ1Nzb2NjA2dbS0VhFWFtGRFlGT0BAT0NSV1ffxd/TxcDFxczE09zTUF5TU1lfUl1cVlVcVtDd19HZ3dDZxd7b2tPW0NLU1N/d1tPRUFNQXVtT0dbV0NNTUFRQXVxQXVtSU0RDREFAWFNTUFTR1NDE29Pf3NfQ3d3d0FVSXlNQWV5QXVPVUV9bRVtDW1TV1tzf0N3YxcfHxdzQ3NVbWV9FRFtYWVldUFNT1NbW3NjZ2sPAwcfa3dPf3dfc2tPW09ZWUFdUV1fUUFxTXl9SVlFdVlFSXF1ZQEJNSEJdUVDR397FxsPBwcTZ2drE3NDXXVlYU1JaXl5FWl5eRVpYRFtcUlPV1FZX1NLZxsLBx9vf1tRUU15aWV1RV1dU1dbQ3dvF3tjb0tDc2t/c2dLQ0tLQ0NZUV1BcX1FVV1JdUVdV19bV1dHd1tFVXkRDTE9GXlxRV1ZV3MfHx8PE2Njf09RVXUVGWkVYXl9fXFTX1VVUXFtRV1JW09BU0dzS3sPD2Nnc0VddX0ZGRVtaRVNRU1FUVdbY2NzHxN/bwcba28Xb39/f09vB0tRVVFxYXltAQ1hFW9VVV9Db3FTX0FBGQU11RlNT1NLe3cTJzsXCy8TYxtnQ1lReQkBGTE9YW0FSVV1ZXl5HRVxHQlbXXFHQ0t7Bzc3Hx9jd39xWUdDVXFxWVFfU01Fd11de1dJXVNPTVdTY01Tfxd3cwd9XVlRWXVZVXlhXUFxV3dzZw8Lb3tnXWVtaTElBRV/V19TcwcDe28PE0tnZ1tVRRU1OTElPX9RSUd3UU9TWUl1UUVpc0tVd093X3cHHxMTb01TUVF5cVF9EXFZeWVHVU1bf11Tf0lTR3NfW28fY2cDA2sHH0NXWVFtaUV1BWVFERFfVVt3B29/G21FeUUVNXFdTVdnc1t7Ax9nCyd7cxNFeUlNHSUJBT0BcRUdWVV5d0FFbX1FYWlFUX1Hc0NLO9M7DzcHc0NBQUtDXWF5UWUNaUlhe0dxX1NdaRlZWU9Xf2N3YxtrexsfX0dnXVlRUWUVTUURe0dTQws/Hw8fc1VJcWltU1VxfVlNR19jbxc/C09fTWEZdXERFXF1YWFpGWldRWVLR119dV1xYUlFTV9/FwPf0xsTH2dVTUFBdUVxBQ0JMQkRSUdfYxNRYUlxcVtfR3sfH2dnExsTGwd3W3dnRUl9ZRVteRUXX3tPS29re3N1XXF1RUFJQWEVQ09DSzfXOwsPcUFXUXV9TUkVbW090TEVCQFxTXlZVWUZdUVtc19ZUx/fJw8vIxMXb1FJV011aUltMRVZYWNTdVlLXXExYVFlY09nR1N3VV8TJxdrIw9PY2FBbVtVbRdVUX97G0dTbwt/d2tVYVNFbRFNdRlPQ0d7P9dLV2t1R0dJdWFXVRUBBSndBWE1F1NVfXlxFRlNVWFLe09HEz9rby8zS0t7VX9VVWltVV0dZUV9fVVRaW9RRWlxWWVnT0lFX09bXx8rPzfXO3dPSVlNUVF1Q3NNQVNRW18bF0tPcVFpcUFhf1lFFUNDS3MTH0dfH29XQ01ZWV11BRl9HSkxeWl7VUEVEXVNfUtZVV97TVNbf2sfF2dDX0tFdUldTUlVRUFZWUFlYUlNQ11BaXVVUV1RUVlXd39PEycPaxdnXVdHRUVbQ0FXX1V5eVdPU0Nre1tDRU1DQ0FBR1tbR09zS3cXa09DS11BVVURDRUdGRUdMQ11ZTUZYWkZeU1LX2dPX1tHV1sPA3MfP29be2tHS29ZeV9hUWl1bTUdTXUFaXURaUFBbUtBUVt3HxcTOz9zYwsTe2cfaxcPc1NLSV1HX1FDV11xFWVJYXVZfWVfS1VbT3tLexdNX0tvWV9BUXFHUU1lU1F5aWFpARFxFQ1/XUV1XXkFbV1ZT0N7c097WVt3Y1lbR3dHc2NBWVdZUUVZQXl1VXVtX1VFV1tfQ2sXR19zdV9DZ1tTYxd3Q0NRR1N9VV9ndVtTd1lfQ2VRT0t7W3dnW197F0lfW119QVFlFWERDR1hZX1ZQQUJFRURZWFhQV1VTUNZQWlbW1N3E29zd3t3fw9tV0Nrf0dLc1F1eX0dBW1pDR1hZUtXUVtfe2dzExd7bxsTbxMbF3t/f0dbQ1tXR09PS0VdfVldbRVBWUlNWVVXS09Hd3dPV1NDVUVdV1FZRUlJXUF9fUVZfXVZTU19YWFlbWlheWUREWlxSUVBQ1NbT3dPbxNva2sXBx9vf0tRUU0dFWltdUtXW1N3Y2dzd097b2N3c2djQUVRUUNXUV9Xc3t3c2NLW0tLWV1RX19LWV9fe3tfQ2N3V1FVfXldXXVNSWltfRk9BREVYV9RdUdddQUReWlhSUlhS09RQ19RSVNzd3drD2t/Gx9zFzsXU19FTW0dNdUhERF/U0NXT3FRU3sTFxszDxMDG11NUVF1W1tZV3MTf0Nzd0dzcVlxUVF5bUFBSV9HQ097e1VBQXFLU3dPW09BWX0VBQVxSXNXd11ZQWUNBRVpFWltaWVxYR15QXVJU1VRV0tHX3MTFxM3DxcbG0lBcXFhYXV1d1tLV1dRTUNHe29jYx9nQVF9cV1ZT1Nzc0tzb29/EwdzaxNPc2NdcUtfQ1tHe39jB3VdUUlpZUldfWVFfTkpLdUxaWllT1VFbREVBWFJcU1VUUFFXUl3U3NdX3d3X1tZWUdfZ3trG29vB21VfUltCQV9cWVTXUl9XVdTS2N7exsHc09RX1N/f0N/a3tbW3NLR2dnS0t3WVFBdQUVU1VbQ3t/FwdnQ3dzVUNTWVtXWU1tbWVlcUF1cVtVZQ0BATUFeXl5SUVpHXlhYV9bVVdDd1lZWUFDX09PZx8HBwcbY0NPRU1leX1hdX0RYUVNfV9ZU1NBXXl5dU1Tc39/ex9vQ3cTG2sfAwcbMw93Q0VfU3NzQ38XZ3MXE39PTUV9dU11bRUBNQVhbW1lZWlleRE1EWVpaU9dXVddWUNTR0dLe3NzY29FSXFJcUlTV097e11fR0VZU1VNbX1xaRlhZXVXQVFHW09bU1VZQ1dLd2MPNx9ra3t3a29HU0tjZ2d7UXVJTU1fR0NLZ3NfQxcbb3tLQ0NDWV1fXVFbU1FBZXF9BQEFHWFJdWVxUVFtbXV9ZU1ZSVdDc09HRUF/V0NXU397S3dLR0d/cVFfR11VUUFlaWVNcXlJeWF9ZQENeUlHW38XawsHe28Xb2NvY3N3fxNvf3t/d393W3cXa3dLf3dDZ39fR3NdSUl1cXVXUXV1cRUBAQUlIRVNd19jTVNRXXlPT01BQ1tHQ3tnRVVdWUFbT1FXRVV9eUlBRVlFTV9PWUFdRXF1W1VddXVlFRVtYU9zf09rLy8DAxtvYw9rW09FVX1NVX1lV0FZU39LX0tLX1d/Z1tzH2tna2NHR39jd0t/WUVBeTElHRkNEV1RX0FReRkZBRFJdRkZSUFhd1FVSVlRV0MTb19LZ1tfb2NVX0tLW3tjR19zUXlNRWU5OT3F2QVle0cfaxczN39/Axdfd2tFUVVBbWVZXVt3a09/Cwdzcxdnd3tnW0cXd1NLQU1LW0VdU1lJER0dPQlJTXdbH2tbd3FBYX0dMQURNTFlZQFjU1V1Q1VfV0NNVVNDRVdPTVFTS3dbcxtrS39xWVlZaT0JGQ0Bf19Hezc7CwMXS09LVXF1UXUZAREJGU1fX39rY2cbB29jCwNvbxsHHw8bb2MTf0dLc1VFVU1tHRVpARF5eUtbXXkVHTUp1dXZ2Skh1TVtYUNPe39/bxN/f2t7dxcTd3dnZ39vH2NnE31RV1lNbRk90dnVOT0dV0t3Bwtjd3N1UV9VRXFZRW19VV1fSxcTFx8PExcLCx8HA2dnHxN/c29JR1NZTV9LVUFZRX0VZXkVY1dRV0NdcRkNMd3N3dnB1T0tDUlJc1dzQVdLcVdTY39zEwNvaw8Pf2MPE093cVNXRUVpbX0NLRkVBX9zb2cTG3NDQUUdZUVlHXlJZXdfT0cXPwcXNw8XHyszHzMvCwcjB09vFVVDW0NXX3NZQVVVZRlhaRltXUF9TU0FJT3dydnVxcU9BQ1lUV1HQ3NbQ2Njf2MXZ28zKycPDxd3ZxdLV0dZWUVZeR0ZDS0tHXlHS3dbW3N/WUVxYRlpcX1LU1tfT3sTHyfXCwc/IycrIwcPOzMbF2NLVV1ZQ1dHS0tbXV1FWU1hEW15fXV1cUVFeQE9JdHV3dnVITERfXVxQ1VZTV1RV0N3d38TDyM7H2tzT09bW1tLT1tRWU1BTWURbWkVW1NXQ2d/Q1VVSWV5FQEVfUVfQ39zYwM3Bwc7Mws7JzM73yMfHxdDQ3dFV19PW0dve1tHf1F9SXVpGRkFCRV9BSUNBdXRPSnZ1SU5DXFxaUNReWFTQ19DY28TI9czAz83c2MTc09zf1dXd1FJQVERCWVtCWFZSVt/ZV1PVXUZEWUVa1dVW0sTZ09rP2sXK9cn38crO9s7c3NjUX1HVUFXc0dfYxdBU0dVaRFhBTkZbQEFfREhNRkt3Q0dKQllaRVJQRkZeWEZT11FU2MfexcjPx8HMxNrC2tbd2dVX28bd091XRVpaQlpXUFPW3tDV1VZbWllBR1JWXFfZ3NfT29jcxsHHzvTLz8jM3tnG39fS01NT1tbR28bY397RXVtET0tARkxCRENISUl0dUBAdU9aR0ZeXkdEWVpaVtDX08bG2cHLzszOzsLO9cHd0tNVVN3d0dbXX0daWkJHUF1bUdZWUlddR1lSXltWVFJU39DW3d7a2MHMyfX39c/MzMTa293V1dVSX11RVtDS19bQVFlbREFAWlhaRFlaTUxNQ0NEWUVGW15fWVlARkRDQ0VcXVbT2NnFxsPNwcbBwdrS0NZUVdHZ39/Z39RQXVBQUdXV0NHW1VVWUlBWXVlYXFlaUdRVV9Dc39/c28fMwcHCzsDEw8zE3tLWU15dXVHW0tDc3ddQXEZNR0RDTUVETUxAQEBGQENNTU9JQERBT0FeRFpR11fW29nZxszCzM/MwszC2tPQ1FNW0t7R0dzTUFBX1VfVV9XXVVJSVV1ZUFVdXlZXXlxU11TU2MXExs3AyPTPw8rM3d/G21XR3tZdUFFcXFRUVFdTW0deWkNEUltAWFJGQFlcW1hRX0ZDQkxBQExOR1lHWlTXV9PFwNjBzcPGxMfZ297XVdRWU9Xb39LZ21VTVNZVVNDQ0dTQ1NDTVFBVVltbV9VdUdLS193b2N/Z2MTGx8PCztjdxcHZ0t7a1lxW1FRTUVBRXFhHWkRDTERbQVpSUV5QVVVfWV5ESHR1dUp1SEZZWlpS09bU3sDF2MbAxsXGwcLE2dPS0FTV3Nve2cfF19XW11xT1NHV1dTU09HXVNVeWlxWUl1Q1tFX0N/c097HzcDCzMnA3NLFwN/bxsTT1VdXXFtaRUFJSk9DSU5NR0VeU9VWXdfTVF9cX1hNT01DT0xBWVtBX9bT1Nzawd7d2MXf39jFxdLS3txXV9PE29zaxdHV1VXUVNPYxdvZ2sDY1tbWUkVdV1ZcUdTVUlBU1NTV1NDY2d/YxN7R38Pb3N/F2tLX0dBXUlJSWkxMRk11Tl9UUVTexddV1tVaQ0ZFQnV1QEJ0dU9EQVtX1tXQ2MXY0N3GxtvEw8zG28XA2NHfxMXT0N7b1FJQ1FVR1cfZ0NjA3lJT1VVERFNVXF5W1lRQ0MTF09LHwtLWxcHc3sHD2NjBwtrT09LRU1tZREh0S0t3c0tbW1lV2Nve0lVXUV5bWlhNSUNAdXdNW1tZVdbQ09nc3d/c3Nre0dPax9PW3sfS0tze1NHU3NNWVtPb3dDC9MDZxMFWWFHQU0BZ1VFERl/UU1zRx9zU0sfWWlba29XYz8bdxc/B3drBx9JRUlNeTElCT0pKRlxd1NvA21VTWV9FQk5BQndxdXRycEZZQEbV3tVT0dre3cH1yNjfzsnQ1sPI3tHbxtbV2MXVUtfd0VbR2sXe39dUX1teX15ZX15aQUFHXNfc39vMwNzX397W08jLx9v19dvRx87f1NLfU0FHU0Bxd0NCd3VYUFtT3NJaQl5RRkJSV0dISE5IdExbW1tQ1NVXVNTX3cTCxMfCx93Q28fe2sLZV9Xa3ldR0tJWVtrNxN7DztxQ0dvUWVDQV1pYU0d0TFNRWFPd3lNfVNPU1sHIwtrN9M3Z2NraxNrc3d/TVVBTX0ZGWVxZRFzWVllYUllAT0RGdXRCdHh/S052SlJQQURU11Jd2M7H38/w9cfEz83d3szD09HE2FVV0tBVVdTW1tPQ1VRdXFfU19TXUVxdW0dbUlBZX9bQ19PE39fYy8nDy/D1zMr1zNvfwcVRX9TRW05EXkBLXtdfQl5XWUlGUl1ZXlJcWURGRk9KQ1pEQERfXlteUl1R0d/c2Nnf2MXeVFXa2tfR2t9VV9DTUF3TxtvW0sPG1VXa29HTxtrUUNPTWUdcUFJZW19aQUJEWEVc0sbHxsj09PT1zsLCwsfHx9vT0tzVXVbR1VNW0NdeRV9YQUNYXUBLT0F3fHNKdXRPW0RBW15fXl9X3NvEwsnKysrKy8zIy8/Awdjc0dDVXVfVUFLVVVNeWVpERVDX19fV0tFSWVFXUFLV1VJfVlFYWFHW0sPI9cr19MvIyMvJwNjY3NNWUlxBQkRSXl5U0VBfXVBcX1BQX15dXFxHQ0NGWl5TUFxbWUdCQ1lSVtTS39zZ3NLT0tHc2sbExcTZ0VVVVdDXVdTf3dfQ3tJX0dja0tjDxNZWVlJeX1ZSWURaR0x0SkJPQFPc28bOy8PDz8vKysvMwMfb0dfW1VZU19bT0NFXUV1dUtVSRVpeREhLdXZwd0tOT0RbWkZMTURZWdDYxcXNyMDFzPTOyfT39cvNxtLU1lXUV1NdUVxaRV5eX1JXV1Xd3NLV1VxdUVRdU1RQWkZaRkFYV1Xfwcr09MrGw87LzcjIwd3TUUVEXkRNR1tZX1ZQXV9WV1FUXV9RVF5HQENOQkFAQ1hWXlpFWkZFX1Nd193Z3dHU1djF29vDwsDGwdjS2NjT19DR1tTUUFfQ397Z2tnawMPe1tTUUFBSX19ZQUp3dnF3TkNHUtzbxMbAw8zIyMr09vXDxd1UV1RQXl1V19HR1tTUVlNXUVlEXF5ASkl1dnNwcXd1S05CQEdfU1ZU09rb3tvFx8DOysnKyvXOyMHb2trT1NHQ1VBRXVhYXVJXUFTR39/X0dzdUVXd01TU1FJATUZCQENbUtfQ3sfNx8DIyMLNysnH3t9WXVhFT0JbRFpdVF1S1dZQV9TQ19RVU11eW0FASHVKQkt3T1hET1tdXFpRVVVW0dnExtrHzczbxMPD2djF2NHYwdvS1tFXVVTVVNzY2NrCxtLS3dddUFBfRkFPSU5Kd0hATUZT09HfwvTIy/bx9cj1ys/Y2N3QUFlZUVhEUldSWFBRX1tSUllaW0ZAQ0JDSHV3d3F0dEhDW1tTVFfW09PQxMbAw/TLws71y8PNwsPZ3d7Z1tHW1FBfX15cXlDW3tPYwMLfxcDa0tfXUFhEWVpBTUZGQUZeUdXR28jKysv0zMXb2tLR1VdcWF5HR0dYRV5TVlHV0d/d0dPQ0VRXUlNaR0ZNd3F0dXR3TkJATEVZW0Rc1NHR3MDDxsTJy8zGz87BxMzLwNvZx9nc0dbXVVTR0tze2MbE2dDf3NZdW0BNSnVPT0t1Q0RaR1LR3NnP8PLx9vH0zcfDwdxWVNFWWFxRU1lZV1BeWlNXU1pYU11aRFpFQUlMS3dxdEtMT0xEXlhHX1ZWXVXYx9rC9fXNwvX0zMTDzcHfxcbZ1NTf01NfVNdQUt3a3NHbxtjS38XeVlheWUBITUBDTEFFW1lS1tLZx8j39MnDzMDd1NPSV1JRVFBeV9HXVdTS0FVU3N/RVlXUUkReUVtMTEFPcXFLS3FxSUBMSk9GRkFYVNDc2MPJyM7Oyc/NzMvPz87OwsXY29rdVNTS0lTV28bY09ja01BU0VFEQFpFTnVJT3V0Q1hERFHf397M8fDKyvfIxdLb2tzQ09/T11TT39ZU1dHUUVdXU19eUlxYRkVETkhISXVxd0tId3REWURPW1NfXlfGzc3P9/HOzcjJwdvDzcHF29rQ19DT1F1QV1BdU9Hf3NDS3tDXVdHTUFxcU1hBQkFFQ01HWVNSVNzb28H1y8LF2NjW0dLW1FTXVFBSVN3R1tDe29HQ3d/XVlVXUV9dU1lFQklPSUp0dHZ1S3R0dEhPSEBe193bw8/Kw8HDzMvCw8j3y8HMwsLa3tjc3NfV0dDd3d/Q0dJXUlBVV1hYUldYTENDQ0p1T0JGRFDSxcbAysvKy8PH28Hb3d/bx9FU1dfWUFHU0NFRVldUXVpYWVtBQ0dFWk9PTUNASU5OT01OTUNFRUZbU9Pd3cXJ98/Az8jP2sfCw9jS2NnZ0NHT19FUUlJR1lTU0dze1dXU3NJV0N/a0FBQU11BTUZbWERfVNLd0NvExN7R09Ld1NXT3dzVVl1dV1JR1dnZ19DZ2tFQ1dRWW0VfXFxEW15bQUtISnVxcXR1T05JQkBaW1LW2cLBwM/19Mr19Pb0w8PNycHZx8bb1FXS3dFX1tDT11FQXVJcW1xQVFBbWkVbTklDRkVBWlDT3N3Ay/XNx8HDwtvYxsDB0tPR1FZZUdXVVlbX1NVWXV5FWkZDQERbRkZYXFtNQkNAT3dKQ1pCT0VZXFhQ38bAwMvKysv19/XKzMTF2dve09DT39RV19PdV1NV3NBQ1dPQUFPQ0NZRU1ZSXFpYWFhFQFpdV9bQ0tjHxNnc3sXc0tjEx9PX1tdWWFPR0tRU097f19XXVF1aWF9ZWV5TX15dX1tAQE13dnVMSnRIRllERFHf3tbdwvXKyvDy9srJy8LF3tjb3tne2dnFxdPVVd3fV1NQ1FBbXlFUWUZYXkFLQ1laQ0NfUFNQ19zexMXb2sbNwMDAw8zG2t7e0lNW1NdRXlNVVFhFXVBcQENZWVlFWV9YWlpeRUFMTk5KSExCQVhTXllW28Dd3830ys708PfPwcDG3NXV39PXVdPf3tzR1VXW1FdW19PXUFTR0lRdXV1aT0JaXlpEUtTVXVxV0dZV1tnFxsHAx8TGxd/R09dSXlFVV1DV1tVeWFPVV1tZVlZSWV9QUl5YW0ZGTnR0dEp1S01bWkFaXNbf0t/Ezs/HzPbz9M7K987Y3MXY09fc29jf0t3T1lRU1dfQVVJTV9RQWFpcWUp1R19EQF9UVFxS0d7d0N3EwcbFx8LMxtrF2d7XXV5TV1NSUFBXXkBGXl5BWFXQV19Q1FVZR1paRk5KTUZCSUNDQkNBQURTVFTW2MLAxMPI98nMz8vO2N/aw8XT3dnY3dfS393X0d7H2tLd3dHVUVJcXF5DSUJbRkNaXldfW1fS01ZQ0Nrf0sbOz8PBwsba3NVRVNVWUFbVVF5EW19cWV1W1lRcUlZWWEBHW0dJdEhNTnRLQEZAQkFZUVBX0tvGwM3LyvTLyc7JycbaxM3B3dPZ2NPU1NLY3dHf29vUV1RVU1tYXVJEQUVEWkRBWlxTXl9Q1dFV1NDYxdnFws/D2dnb2tBU19HXUlJRVFFbWFldXVlQVdHVU1TUVVNfWUVBSUtITk1OT0BFRE9NRVxYXtXYwsLAyfT1zM3Mw8Tc28bG2tjb2Njc0NHf2NDW38XF09XU1lZYRVhcWkBGWV1ZWFJUV1hbUlBQXl1V0NPS3sfB2t/Z29vf0tPQ11NcUtXVUl1X1FdSVd3d1FbU1VRSXl5FQEhLTExJSk5ARVpARFtfXltd0MXa2MD19M/MyMvC28XBwdrf2sTa3t/b2d/WVdbT3dRXVNVXWEdaXkVCR1xXXVzX0VRfX1JTUlhcVd3S1t7Hw9rc3tnZ09TW0NddX1NUUV9SV9bXV9Tc29BX1tDUWUVZWEFOTUZFR0JBR0BDQ0ZFXltEXtXc0dHewM/Gx83Iz8THw8zG28bNwsTEwMbb09HQ3dzR1tzc1l1aRFtFQENbUFNcUNRUWURZX0RPR1JUUVLW2djd0tnY2N7d3d3c0VXU0NPR19bS1lZU09JVU1fT1VhBWFlaQUdYWVtGR0dGQUFaWV5eXlNX1dfU3MTCw8PP9crAxsLLzNrbwcbe3sTb3VVV1tdVUVfQ11FcXF9eXlhcUVfVXVNU1VFdUFZWWFtdUFxbUdPc0FXR3dBXV9HT0dXX09Ld1tXX1NHX19HQ1lbU0dZTWlxSUFleVldSRERHQUNDRkRHRkZFRVteXNXc28XHw8PAxcfL9MjCzsjIwtvBw8Xc0tnT1tVX1lVQXVxcXF9YXlFWXFlcX11fWl1XUFlEWV1cXlHc29zQ3tjS19TS2N/R0Nnc0FRW1NTVVldXUlNZXVZRU1hfU1BcXFTWUUVEWV5bR1pfXkVCRVlZWVLW38Xb2sHGxN7Zx8/MxcXAxtjS2cXb39TQ3dZVV9TVVFNR1VRUVtXW0VVSUdRVU15dUlxATUZERUZY1ddUU1HR19XX3cfF3d3e39NUVNHS09PR0NFVXF1QU1FTUFRUUVBX1FVfRF5eRE9DR0BJdUlDRFpfVdza2dnHwcDEwM7Ly83Czc3A3tvBx9nT39nQUVLV1VNfUlBdXVtfUlBXXVTVV1NeXlpEQUJHXlNTU9Td0FdX0tzT09jExMXd39/Q1VfR0dfUVdVQWUdFX1leXVFU0NdW19DT1VdXVVFFQUZATU5ORlhFWlHW1tfX39nb29nHxsfFxcfHxdnbwcbB29na3tBU1dHUVFfX0NBXV9PT1lXU1FZeREdNQ0xJQVpbWF5TVldRUFXS3t/Yw8Pa3tnaxN3Q2d/d3dHX1FFZWVxcXFhSVlFRUlTW19BUVlZcR05PSUlIT0FFW0dcVFXR1NnFxsDFzc/MwcfDwMPAwcTY29LT09ZVUlHVVFZQVlRUVlLV0NHU19NVXUVaRUZGQFtcU1JSVVTV1dfc3t/S2cTb2NDR0NbX1NbT0FRRV1ZdWV9cXFJTUdTU1tTT3tnZ1tLWUFlHWkRBQk9AQUFNR15eWFlV397e3Nvb29jdxMHGx8fCxsbZ3tnT0VXW1tXWV1Xd1tDc0N3Y1tfSVlNGQ0FNTUhOQkFGQ1lTUlBU0Nna2drAxNre2dvY3tHc2dPWVNfWV1NcU1JRXV1XVNRWV9ZVVVFVXFxcR0RNQUNJRkZDQEdfXVJR097c28XEw8fFx8PNzMbbxd/Z0dBV1VVeXFZTVFJR19ZV1d/T3dLW0tVWUlxdXkRDRkRFWFhQUFJWVtTT3t/S2dnb0tbe09HU1tzX1VHV1VdWXFRVVVdU39Pf0t3Z09HU1VRQU1hbXlpBTExLSUhOREdEWV9U0N3T39vY2NjBw8HAzc7AxsXf2Nzd0VbRVdfV0dzS39DT39PQV9RWX1tHREBOSEhCSUJBWFJSVFfR3tjb3MfGxsfbwcfc0NDe39DU1dJRUl1R1VxWVtXQVdbV1lXVVV1RX19eWF1YXkBHREFHRl1XV1ZR1t3d097Gxdrf2cbYx9raxN/e19HUUFFT1VdX0dfc39nS0tne09TX0VRVXVJcREFPRkJCW0VQUlZUVNPQ0NPQ3N/S0dLc0NFV3dDU1FfU0VRUV9xQ0MTSwVfe3dHY1VdfUFxcWUZZWURCSEJCTk1HXVtfX1XU1tDXxtrAxd7EwMzAx8zBxNjc2dDXUdXQ0dzT39ze3NLb3dRSXERRU1lbQUBJdUhIQEZFXVZW1dHd39/T3sDFxMXYxdrZ097F2dBU1NVXVlLX11VUV9bWV1ZX1FZcWkVeR1taWFxbR01BRFxeWdbQ1tXU3tzT0NnF3t/d28Ta3tnY3NPXVNdWUFBT1tfT1tPf3d7T3tnT1lZWV1FTUFZcWEdDRUREW11UV1RWV9dVVVFV19XXVNHT09PX3N7Q1NTQ11RV09jc0tLYxtjT0NzQVlBfUlxcWFtZQENLSEFPTEFZUFxZWVDVV1fU2dnd2djAwMHAws3F2N7a3tfS0N3Y3t/S39ne09bc1lNZRV5aR0RFRUBNTEZGRl5dUVZRV1fW0NLR3dvf2NzbwcTHxcDAxNnW09VRV1bW11ZQVtVWUlJRVlxeWF5SXFlbWFhaRFtdUlBQVtdUVlFX0NbW0tnb3dzc2Nrf397Y39DXVddWV1dU0NfW0dDS0NPR39nQ1lTR1lZQUNVTXV9fU1hZWFtfWlleXVJeXV5QUVHU1dLe3NzYwcfY3dze0NbT2sTY29jZ0tfQ1NPRVFdTUVtERkJBTkxOTUZDQ0BaWF9cXVVRVNXR397Z2MfBwc3BzM7BwsfBwdjf3N/S0NZU0FVXV1JXU11YW1tBRkNFWkVbW11ZWlpaXVhcUFfR0dLS3Nve2N7EwMXGxcHH2t7T0lRWUFPVUVJTUFFTUFJUUVJRWVJdWFlFX19eWFxWX19dUFdQVFXU1FTR1NHd0dHQ0NfW1tbT1NfX0dLQ0tDc393Q19DT0N3c2Nje3dLTVFRQUFFdUl5eWkdBTEBCTEJCW15eXl1UVFRX19zd3tnFwMbGxsDBx8bHxsTa2N3Y3NDQ0NBVV19dUkVBQk1OSU51S3VLSE1FRFlZXFdX1dfd2Nna2sbMwsDBzMPAwdrHxMTb09PXVVZRVVRWU9XVUVNeUlJYR0FYWFtERkVER0ZFX15cUdHS0tzS2trb29nEx9vZ2cXF2Nzf3dHWVlBTUlBTVlRWVlfVVlJTUFZQU1lYUFJZWl5cWFhaWVldVFfU0NbX19PX09fX3NDT1tDR3tXU0NPT19bQ3dDQ0Njf3trAxMTD2Nnf3FFeU11eRERaRkJMT0JMQEdbUlBRU9VV19TX39Pe3tjDwcfFxcfG2tjFxtvZ393W3NnDycVQ3V9ZVE5ATUxBTndOTFtIdUxBQVJfXtZS01TY3FPGwMbaxt/c3dLC0NDawtzc0N/f11ZW2FbQ3VPV3ldZVVBbR0Nf1EVAXVhCWEBV3lFWwcHFwdrNzNzex9rN28HNzNnG29LF1FHE0lFUWFZeXF/f1lLD1FdRU9FaX15fSlZacFxxW3RG1lBVXFFe3NZW3VvV2FRUUdlX1VFUVVVV2NHW2t9X2sVT2MfL2cT1yt/F9N5V1dLX1VxdSUFDdERyQlted0FWQ0dS1HfTwEXRw9vAClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX2c3MTFtdWxhd18xY2hfOGtoei5pbmZvIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX2c3MTFtdWxhd18xY2hfOGtoei5pbmZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwMGI5Y2QKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfZzcxMW11bGF3XzFjaF84a2h6LmluZm8KQEAgLTAsMCArMSwxMCBAQAorODE5MiAxIDAKKzgxOTIgMSAxMDI0MDAwCis4MTkyIDEgMjA0ODAwMAorODE5MiAxIDMwNzIwMDAKKzgxOTIgMSA0MDk2MDAwCis4MTkyIDEgNTEyMDAwMAorODE5MiAxIDYxNDQwMDAKKzgxOTIgMSA3MTY4MDAwCis4MTkyIDEgODE5MjAwMAorNTQ2MiAxIDkyMTYwMDAKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9nNzExbXVsYXdfMWNoXzhraHoucmF3IGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX2c3MTFtdWxhd18xY2hfOGtoei5yYXcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM4ZjFjYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9nNzExbXVsYXdfMWNoXzhraHoucmF3CkBAIC0wLDAgKzEgQEAKKz9DS17l5ur9XFhgWlRq8v5dWFtQU1xba2/j3OXZ2trc6l1UWmBwfNXP5ejk+Hvnz8TEx9H+Xk1GU+vQxcHAyeNpVUtLZtrNyMjIzeRsXl5cUU1odl3r2dfVdFhPQkVWfczFzNDuSEA8PUpYz8DDysvhW0tFUVpNWWlp7G1q6eX73t7p42r1909NUUtXcOnPzdHJz31lTVVkUl7g2930a+xrW+DKwr7K3Fw/OTo/Wc/AubzL5VlGQUVfz8zKxMzqYU1RT0ZW4c3Hy8nAzmhXTk9bYNrR29Dab1dLSVts787Ix83g43dNUn3ifF5WXVZITFfz2ePYzOpfYGNcVE1YWk9VS0pTVV79YFdw7u5kV+7fXV1fV1lo4M7Lzc7a6lVBSerOx8C/xdNoTUZK7szAvL7Aw89rT0xPUlzZy8zAvL/G6lVOSkpKT+bS6nRfTEpOXuff2Nf3YldIQ01i3c3R3OdsU0ZEYdbNy8/vY0pBRUZMaN/MzXdjXVRSUkxXberkbGbp+F1WSVD02M7Hy9ZwUVFIQ1bWxb3Fz9pmTEI/TO7MvLu+v8LT/lZVYGbp2Nbf3ebY1+5p5eFzUU5w8u7e3n3ucnn8dP7d3d3/WGRneNnP329XXFRHS37MxMvk+11IP0JHUFnhzt1xY2BYT0dJTE9QTkpLSlJfTEpS8tvn/tjZ9F9RS0tLZMvBvLq6vMlgU17uxby4tbi+xfxPUlvazNvW0vDn6eLXcltuV0pLTmrmYlVcWWl6X2xqVVhUSVJn38jP19FxU1JITVRezcHIy9htWj85P0zqycrO31dKQz9IYffV1XFeVU1RT0dLSFPr7ePLzMvcT01RYdLMzcbR6n1UUV35zMLAvsbKyc/pbHXm2Nng49fT1er0397e4WZPS0pVZurU0MrBy+VsaO17X1hTXvJqZe7d3XpPRj9FX+3QzeFeTEE8OD5V+OnuX1heUUxHTVpldd7T0s/Vc1hQTWLfzMnM0c7g/vNbddbY3uTZyNHzb09HTFbfxcXDydZuTEln3M7Kz/NlZ2x95Mi9vsvbaFtUTFJ65c7Gv7zH0tV1TklHXd/Vz+ZcVUdAQD1GWfjweWz7UkI/Pj4/SWLf4e1ucUxEQlPn2dHO3GNaUFRUatLL293h0svSzMzX+2Zn5f7eycXI3GRgZl33+OPg6O/ucX7x725bW2BubW9+bGJ06c/O39zfZlNKXc3Fvru+w8vXztHXzMvKzNDJwsjO6VBAPUZo3c7EwtZLOzY5PD9LVU9MQz06NjpDSVd6/fZkUkk+PEFNcOLZ0dLZXUxNVmbv4tz6WVpcbePj2cvO1uXu6XlYUkpNfdTNzs7LzXVcXHLYyL68w+BiVVBT/M29vcTHzMzHytnh/tbMycC8vsPO4Nji6ObncmpWcOHu7mhXU05HRkROXltVT0M+QEhXbH5iTkE/PD1HXWFTSkxt59zf/Xp3VGP67N/d3mxQXuT36NjX09DV2Whh9tXKzdrbz+BeWG76eufOycjGzWVJRUZmzb+6ubq+0tzjY/PMxcDGyMTZdHJz39h1dOXe6Obg7UtARkxSV2dXT0dCQENFUmRkWUxSW0pATE5VVVx0XFFlcWJaSUxf4Onm49xkUllu1MW+yN9rd3Ht7OHc3+Dq3M/O4dzwU0VIXevdy8TFyN5fUlZUXGjm5dzMyMzNzNfw28fDwL28wtNtXG3e2enp4Ohz6uZ2XWdZTUxMT09SUUlDR0xQVU5OW1NCODc/RU902NDU7mVbXWzn183W8NrfdWhlY/jazcvf8+ldTERBTmxt6c7N1WZPU0ZBUml94uzax8nLznr65ebEvby2uMHO4dzKzcvBzM/T+ePf++zV3e5ZTmZrXXBeWWNTVmNVT1BDPz4+UmJZbl5OT05ablVKTUpQXF3ZzuB2Y15q+NjP1NvkaWFYS13r2M/V5fRkW/f5YnDufPt75djWdU9LV1df2NPQy8jFyetiVlVde9zNzM3T3Nfj383S5tDN0Nvf+Hv679XPys7c8mhPTVZs7X736WlccFdRX3l63fFpZFtjUEhIRkZq1s3P5PF0TUlYV/bR3eDeV0dKTEpNTVFUXPF+U0Q/QEtf08nd//tXX1lESnR+4tXk6OLQw7/HzuLo1c3Hx8/Pyc7GxMvIx93f1vZfb+fPzdrW3NDV9+3hXvnd6dhpSU9USFBSS0pcbOjwXlxdYVVSUlA/SVlXWlxS5+pMX1dKVWps0NhzV09QTVnf0tHF03RMQEFVa93K0ubn3N3Q7FlY83x+1s7V5fZka1xWYdXV2N5nXW7w1cjNzcrH09zdalrn3+HR1tLHyNlsT09b3sW9vctkVFJNX3Zm3s/p6uxRSk1RXGBZVVJbYFpgU0hUXVJramDa+FBVSD9NY3z0aGBfY+54bN9qW3hkWWhVUWJeYPhfVOrd18/eYmlw3tDQzvhm6fznxsnCvcjT3W3ky8zH0Pdia+jRy8TH1NT/TUhNTmfp2c/M2efd7eR9W1Vk6s3M2GJQWFZY+ux41990XE1KVl1dVE9YW19RSEU/ODo9P0hNT1NRR0VFR0xx0MvN3V1PT1D619vfysjO0NXTysjFvsPLz8rJztbTzcfAw769xcfI3fDm5tbNzM3O4mBUWFZPT1Ndbuzb1HFLS1Raduzt2M/Z9nNZVW3b4GFVTUtNTk5WTU1TTktOTVJVSERGS0RASU5JSEY+PkRJUFNLVfDQyMnY6Ofl1MzN08vBwsjJycfAvr6/wcfEwMPKz9DNy8nGwsfP0eVfU1JNTVRXZWZSSUlQUVFdZu7bzs3eUkRJTVBZZHvf2t/na1BVX2VhZvVzZmNeWFJRW+zf6OlpVUxDQkVBPUBISUZBPjs7PkBJS0xWbf9zZlxf99PGwcTFv7q7uri4tra1tbS3ubm7wMfLy8jHyc7dW0tLVl3s3u/4+3BkUkdITFBVW1774djY43RTVXrs/u13Z3zy7NvtYl5VUU9PTExKSklHRkZObW1mZ1JLSkhKUkhERkJCQT4/QURLUlVWYHLh7uzsbPfe1c/M1dPJy87MzMTCv7u4uby9wsDAv72+u7q8vszp/Ofm4dnc1dfRz+5aU1Zu39XXz9Pf33x4X1VdbV9aXFJOTUxLRUFDREtMSEQ+Ojk+QkdKTE5KREE+PUFQX3J3Z2r37/5qYmV71MzN2OTk3ubg1NPW1NXb3er17tnc2NLS0tHKyc3Y3t3Z0srHx8bBv77C0M/JxcrNzc3NyMHDy9XTy8rMy9PV297gfVNFQD4+QEVDPz4/QD45Oj5BQj8+Ozs9Q1JeV2Bye/ptVU5MU2v67XBu9nh1a1dWX+7Py9jk29LOzMnLz9DOxMDH0Obu93P0++rXzcvQe1plaN3KyMXKz87a82Vk6dnVzcnN0dXS0NnX1s7Ew8DG0NTc3OJsWk1LTk9RVUtIUk5WVUxQS0RBPTw4Njk8P0VDRklFRUZDRklZ++zgY1pmV2jtZmzy5M3L09ba1djZ0ut03NDJxs7U1NbQysjL0MzPzsvW2tLXzsPExMLAvsXVZk5u4dbFzN3d9Xrke/bSzMfGx8nb3OdpaldMUldWX1tJPz1CS1pUR0hCPD48PEBFT09NSUFESkdJSkFFUFJkYlNTTExMTlJUeNXMyM3peure0czM0N7W1djS6+bVzsG+x9HX29zb2dzWycbHwc7e0M7O09rc3dfc4dne59PNzcvT2M7MxcDH1213fmn2clZXVE9aWlBRWWRYST86PDw7Pzw3ODo9Q0dJSUpMRkdKRlfj4t3qd/b3dPj8Xlx23tHO2WxdW1Zu59ze39rqeGtk/NPKxMfSz8vLxsrQy8rGxcHAyMrKztff5eHSzsrN2eBgaPba0NvQzs/K0/docejs9WxdSkhFRE5KSk9TZVtLSUdISUlISUpNT1BcUExVW29sXlZMWFxUV1lVTktOXVlVWV18915RTF3s5tXZ+Wlw7NHL0Nrb0tTg3dnOxsnKzNLQ0szAvL7Jx8jLzM7Tzr6+vLu9wMzKycvN3dra4OVZSEZSUVJaS0U8PD1AST8/R0xXSk9PW2ZPTEFCRkxbaeZbVVdJUk1QWGzd6OxhUEdIXvnY72r8WGZYTlJWdHXc32BXU2hu5N/czc/JyczHzcbHx8XLyszKxsDEyMXLyMrPytPPzs7N4nJs28fDxMnQfVFQUm1kYnttXUI6NzxLUmBgVlZOTElMUE5SVmNaTEtNcmVbXlFWT09SY3Bf8ePa5V9XT/jd2t9oaVFMSU1kXGdu7+NoVk7629zT5t58XX3yzs/Wz8/N3uHr0cfHw8vJydfZ3crFx8bIxMza6dnFwL7HzNR6+Xjt6fnycPBqTkVARUhNSUxbUU9MWGJXUkxWWkxFQUZOWk9LTkdHSlJnd+H7bWpUUU5s1s3Pd2NVSUlRfvH1ZmL4W1ROWt/b1Nvg3evo4tHNysfLyczM0NjJx8LCyMjNy8zFwsrKzs7W5G5i1c/Rz+r4YmlpcNni5eV1WVNMQElVX+F0WlFOT1Xv/WVkVEtISEFLY1pfVkZAP0FCVGFdaltUVVhPW97Z1Nh0XV1gU11iVW/s7vH9VU1ZXtvHys3U4XTo1+Xa09fT0d1z1MrGv8bPzsrLxr/GxcTO19vY48/J0czdWFBQT1nd2drT82VfVkhJWVfv4mFgWExGUFpV/vVrbm5XTFJOWGVOTEtJRkZKR09hXFpWTkdacPbZc2NYT0tKYFtfYlNRTk5HUG3iyMrT2dfS0sPCxcTN0t7f/e/Py8XIxb+/vsS/v8bDx8jO1OZx39jO0OhoVFNNVHJ55vV9X1BJQU1f4tXb42dfU1RjYl9gXV1XV05QYnL9YV9WVExER0hISExOVVZMTWX15fVkVEhGRk9dVlVmal9bW1vhzMfBx9Hh4H341s7Pz9Pg82BPYd3azsS/xcXJy8XJy8fAwsfG1NrO0NLoX0lKTkxg8nRm7dzn5lxY6fDw/uhgUltRY3386+LZX1dQSFNUZXv5YElMQ0NISU1NZGFbUkZNXP7i4OZaX1haaFZPTFddT01GTltg6ePT5eHZ3c7OzszNy9fibmTs6M/Py8zOys7Gw8PGw7/BytTl3ODX3m1XREtKUVps7+fZ09n9bPLTyszXz+9lT09aZW9bdWdPREJBR1RpYXRYTUxMTlBoVmX0+lpPS01g+FxiaFVZWW5ccVtg7nBXTVNXbNbb5uVlX1/v8czEzs3d+19edODHxMzL23Fj3dHOxczDw8zc49fTxsHN03tUTFFdV9/d2954XFb+7NfHztjrUkhIXW/h2t3fblRMW15s4+f/XktHSVdaY/H2e1ZHPj9BTXj0bFdKRUhc8OLd3+xcSkBKW/bS1dTqUkRDVuTNw8TE0vJgcfDmyL+/yNf6aOfSyL6+u7vC0uff28vIzNdpTUVKWGfh2t7kW1BQX/rayMjVd1NMS1nr2dpfT0ZDQUNOZNbO6VlIPz1CVWfp+vdsT0Y+SFnpz91uVlJVUuvQxcbQ2ufqZW7m2c7ZbVZOTEhf2tXW3d/s8vfo187HxtZqWGJibNjQys3V0tLZ693JyMvtVE9OUVbcysvU5+TvfO7m0NPP1GNUT1dc6tbc7FxeX1tcWefX3e5OSkVERk1hZWBcWVJKSE5cXlViU0tHS1x56uXocWBgbvjz5+ny7l5RTU9c68/S4HZrdG5z2cjExsfN4WNf5NTJysnK1NvY1c/JxcjQ3flfTlNX6dPd4ezc2t3Yz8zW5t/mYU1WWWdqTU9OUFFQYWT1429gVU1GTVFU72RTTUtRTFdm6tdmWmNYS0tfctfa+vlhbe7PytLL1upoT0tLWVl74WNYUl5u/tnUxcrg721iYPDe1s3U3/j45dTMzsvL1t/x8Hzo3tXJzeFibuLW0M3Hx9Lra2xbYe7c0uJoT0lMWOvWysvXZ0dBQUZUV2JdTkI9RE9g9PHxZk9LTlpTX3Dy8F5PR01o7tfZ4dzmaVtjYPbpbnZfVktP+tvKxcXH0ev429TQxsXDyt5qXu3ayMLIy9DhbGBlZOng4OtiUEpV99DJzc/bfl9d/P3f3fH5VUpITWbn0dXd+F5ZUltka3NaVk1FQUNOZON9ZWVga23p4Ojk7ulnT05QZ+zSy8zQ4f9mZG325HhlVEhEQ039zsrM1exnW13139ve1+FbTk5k8tXLy8vS183PzcrIys7U3uTo4dTLzuR+/mVn993Nzdru9VpMTVFr39fZ2ehZV19VXGJhU01EOzw/Q1T+YlhdVE9WU2/e6315aU9NWV/019/38FtPbe7g0svU9mlPUFlW+tHQ3uDd3M3MzMXDzdvZ+V1xdvDTz9vZ1OHaz9LNzNDf9GZXYV1Z7tj6XFlUWn7o1MnN7XdiTUhLVfDY5NzY6W/19W77/FpTSD8/QUJDVlxSWV1s5NrSy8vX3N7i5PX+++DqY2VgWmjl4ezrbVxQTU1PT01e93hnZG7l5+7czs/f/nBfVlJWfNbX3M/Mzs3LxcXKz9bUz9PZ3+DZ325faXrt59vb3O5i++DrcW7w8HRjauXt8OPY3nVeT0xJRUVDRENOV0tOVVx56e7s4nBbZGRdT1FdZm1aXnBlae7oevB0VVxzfOno6dnT2N3QzcrJycTGy9nm2PZYWF1w629m5uDj0M7Oz93b2dfe7O1vXlZVVFhhXHrq797a72rv+Gpzc/PseeHm/G733uPwYlxXT0tHTFFNVV9lYVpf7vJjbfHt6eHe4P1qXVdWVWb58OTn73v6XFZiYlxaXV5ZYu3k3+Xa0tDLzdXx6eJeWFdu6+z0/t7b1tDRzdLT2NHL1dvW0+VsbXP482d+efnwYmJae+b56uvofunget7q6ubv7V9XT1BPRklMTk5NUExOVFZlZ2/37u5u5+lvc15WT1FQVnNo+fDe3HloYHrf3t3Y1dPV1+LWzc7LzM/X3OL8+X336Onf/f5+bHVrYmjt4OPo9eDccGVeWV9cXllUW2JjcObt39/j0M3U2Nvg6fVw6tbU4u59XU5JS01ZW1pgX1dZXlxcbXHx8Hn2cnvr3+D4cWtvaFlTUGdgX2VdYV5gZ21xaHNlY2508eDV2NXU3uDtcv7h1tnhfH3h3ubf0s3Lyc/W0tbSzM7b6O5yXlhWYXJpavR1bvL08+zd3t/oaF5z+PPqemp6allWT0tPVlNQU1JPUlJNTE1VaGJYXH7u8Nzb3+tvYGFjZG1zcWdfXm7q6/Hi1dba2+TZzsnHy87O0OB6aGVs+uxxXllidH3t593X1dff7Orv8e/l293neWNVV11WWlxnZGB27erm2tDS3O/n3NPU3+l9clpWVFNaYWdfWFNRUlVcZGR+7vRwWVhq+Obp3tbtXlpfYl9jbXJZVlZTT0xOWXB56t/f3NnW3+ff4eHm+nvo4Onm5uv5cWnm5/Te0s/Vz87Qz8vIysrT43pXWl9lYvbxdfZram137ufY1uDt7eXc42zo3mlbYVdLSUdLTEtPT1VYWltaW15WUlxZUmDy6NvU2/xgW2FtbHnj4+b1a1tVV2B36Nza1dLX09HUzs3S1NPf6317fmpjXlhabfDq7+3vcGZy7uzk19PV1N3qe2hraHV98fHo9GBbWV7639HJy8/S1Njc7urg4epxXVFLSEtMT1FVVmBbWGNcXGFpbHnv3dXc625iWlBSX3Jy/G1ha1dUVlBOWvfe2ePi4eXm3+Hd1tTT715lXGru6N3W1d3i7vtpbXvl393T0s/V187U2eH5dX7q7envfvx2Y2JsdOTd2+b18Xvm29/y6N7fbFdQTUhESExNTlVZVFRRUmFkdX7q3OJ5/vB65/BwZV929npo+exvZ1lkbfDU0NHR3e7b5fbh3dXP09/ld2ltYmx08+5tYWlhWWZibuDo5N7jbG119d30fPji5/vt7vf15flr/Hzr2tfW1eLb0NTS19bW3OZgTExST1JfbG9eVU9VU1hiY2ps+n5iX1labvZ2aF5aZWNfYmZre/NzX2B3cGPw6Hr14NfU3ODY3+Xn6/Lq7fPj4djiY/pvdu7w5erq++L5c/h14tjU2N/99+V84e185ert9P9r6ubd2uHd397o7nb+7l1gWFVTTk1NU01TTUdISE9YXWX59uzd6dzh6dfR3/xnW3JoaXZ1bG9uXVtXXG/43t7Yz83Rz87a09bg7ndpc25ddOvv/mFaVlp06n3u73Xl5PH4+/jf32teWVp27fDo2M3N3ejzb/Hr4NjW1tDV39zf6+XxYl5dWFZPUFhaWlpTUFJaZVpSWF9gaGRkceri2OBjWlFTXF9leebj9WtgYGb06/Tp3+fw8+/d3efWz9TY2uP1c2/n2d3kcHfc5uvwZ2v5+uju99nR4OX8X2Nrfuvt4tbf7uxdVGFbZ+rcz9Dq7OXr3dzo5PVxfVdNUUtLU0tJS0tRXFVYUU1h9O7i39jN1NzV8mVsXGLy9+TccWBfWmJwfOni3NXn69nb08zX4NXW19pnWFxbaPL2bmp4/21laltialld6tzUz+xybFhYY27629Xb5ujh5Nzl7ufTzs/Ud210dOrc3fHg91tcXFhbal5ZT1VeXVlTUE9TU1thY3d0aHN7Z/fvYmFr4tHY9WNXT1lbbOXn2NLodPnv2NHQzs/Lyc3e5v1x8/Tg4HRseFlXdnp++GhdZuLU1eXn6HtlYnzq6NvS733ta3n6a1/n2trZ7H5uZ2vw3N3ybGRPTFVTWlxUVlxSTlFPTVBYVVxfbG/t4fPp3tve7W9v4eDd2e9iYVxVYnro3tzb6O7p4N7W1M7Hys/N2P3ydWVpam11ZFNVWmBraWJdXnjp9d7c+OXwcGVea+Le8tza5Onp4d3Vy8rV1t1pYl9la3L8+l9OVFRQWGp3a/3l7VlWWk1OUVRQUldeXVhjZV1ieHhw8NvT29jb635qZl5sdOPlffTq/mzs2dXOycrS2uTs5d3c2tnd2+1kXWpiXHl8Yl9y8PXu7uj+bXd2YV977Xl+5evs39zd2trq9HJaW1pm/Ofm3NThblpdW1hkenZxbV9cTUVJTE1RWVlcWmFtbX7t5uXd4d/c5t71bGtfWFz37eHf3ONxd+ri6tTNztLb0Nz79eHi6Njc3fX2bV5obv/83+L8amNuXFhdaGFi8OLrb375cnrl2t7f08zU2trpbV1mcXvk1Nz2/19UUl9nYf7m9lpZXlBJSVRTTlx+a1VUVFhaXV5db/f1/Ht5aF9l/nNl6NXd5+Pk6O7j3t7bzcnN0dLQ3eXY1tjNzdjZ7Pv+ePP/ffjj9mZbT09NUmhlbN7U2uZ58eT+8ebj4NjX1uRhX1lWW1lf8Oj+cGr+/mpzbV575e7ubVhUTUdNTldnZmVeV1RaaG9eY9zZ3NrpcH5gYn5oeOvp7fju4N/b3Orh19PMztrf2+bf2+HWz9bm7en8aHVqVlp65uN0XllPSlNYW/HZ2ePw9fzr3el64c7M09bX429m+mxm/u3lfnDl5vVwWVNVZ3p1Z2JaU01JR0pSWV1UUWFbWFxYVV3f2Nvq7WpaVVpdXPnZ2PXr0dfa5efx69nj2NbV1NPV3entz8nN1NbKzdHhc2dj5/H9a1tYTkVGSE1n4dnZ2tXb4O/8eeHP1d7e2+1uVVNSUG5+ZmT/2+DscmJVWWhkaGBZXWFPREJGUVZTXnR5aWllYWPw2NXQ097vb1lQVGjd2t7d29Xa3XNld+vX29fOzc7T3nppaODX2tPWzc3Q4HVrZ/1pa/tsW1VMR0tPbvnr09jZ6/JuaWroz9rY09TZ6G1ZXlhk+3Ht79/f7GtdWFZkXWBrVlZVTktMTFlkWWBlW1JQT1dZaN3g1M/kZ1hUTk5P99nl29fT19vsdHR+29fOyMvLzdfr+Hzbz83Iys7Pz9n+c+zb5+nwYldOSUhMTF14eubo4t7c3eXj3dDR2OV77WVTTEhKVV9m8O3c3eT8XWNkfPbx/mBdTkpFQUlaX2RtW1tZXFpb79zP09TX3u1wXVBRUmdz6eH13dXad2j/79zXzMjJyMvabl9ffuLYz9PS0tznfPDZ09/p52VdWE1KTFJgd252Z2/p6vDv2tDW4OPe7d3cdl9bXGNyfuDb2tnpcFpdbm95d3VmXU1CQkVKWWxtdGNYVlNOU23l4+jt6/R1ZF1eXm36/HF7/XF482lfZ2t36tbKxMPDydbg3d3YzsnIyczR5v3k5OfqdnBlWlVPTlNbW2drX2Fsderr4NDO1tzr9X5rbHpeW1hVY2Z45d/l3fxdZV1XXltob11UTUhLTk9lfHXweWpwWFn79H7o9G9tY2lpXGl+a/fr/Oz38975ZXdqbOPf08fFxMfP1uHz39bVzczQ2Hpw6nF38m1pdGdhXVhhZl5jZVtaYH3e2tLM0dTX3+jvenh4XV9bWGds/uPX2+bx/XRYV2Z17vdzW0tHSUpIUFtbWl1fXFhbYm1raG1iXWRsa3vkc27+a2hre/j48XhrXV983s3Iv8LJys7l3dXPx8XFxcvZ5e55aWfv7PbsdGNlX1ZtcF1hWFRlb/vf3ePp6t/n6d/9bHJeT1hXXH527dnqaWZYVFlbevbqcFFOTUdIVFNcZ2Vv/3Rx+XVy6+9++u/1+eru+npxYW1uZ3by+3J0X1pm8ufRycnGzc/c59zUyszIx87b8PJfbWpmZ2fsen1v+e5ueHJmUU9aWmvo393h5vPs4t7U193ieGVeb3tw5uHqYVRQT1FSZnDs3eBnUVlTT1FaYVNXXlpYVFloZWNpW1NeXVFe+HlsaXNrbf3n4ubtcW5cYvh508HCxsvMz8zOzsbExMfJz9/g73Bwa19h/H16fXjl3fJzbV5YYF1VbO18Xl9eXHvn6PP162ZdWWP8a+LZ525bW09WWVds5+JhVlZRT01RWWBnYmdi8O744+3ndGZtZ2tbX3N6YlZcYmb17eXm6fZgZG7w3tLHyczM0trl2dfSzszO397l6PZ89nns5/BtYe/t/+vu7XVfVVFZYGnv6ez29uzd2NvX3N99YVhW7uDt5+bce2FWVnJmc/TsZlRSTU9PTFBYXFdXVllnZGBgav9yZFRVZ11VWV5WTVhba3Tt2ObvZWdk7s7MysjExMnKzMnIw8XNzdDb7urn7PDg3ePe4e/g2uPm//XzV01NVlpTVVVWWF9o+uHi2uZobWBSVXHp+nL4d19cWVtw9/32X1xYSUxXWlZXYl1aWWVu8t7q5O3r8mFfXmJlYnNdWFhYaHXn4/B0Yl5RWP3h0c/Lx8fHycXHxsbLzuLvaWNrW2vz/Pjt3/bs29XV29zn8m5fX1lYW1VWUVdYaunaz9HZ5+r9Xl9oa/12c3l7aV1g9PBsbGNZU1FVWFZbVE9XWlhXYu7wZnR9X2RjXltXV1ZTVVVUVWD63t/z7WpiZWN54dTU0cvGxcXDwr/CycfS6dzc6P3x73ru39na29DOztrh8GJvZlVQVVBJS0hNV1zx39ng7OZlXlxYXF5pYHDw9en2cu3m/WNoVVBbUFVWUUtMV1Rdbe7e2dzx5u544/l4e1tQT1FNUF144+Pf+2xfUFlkY/Hd39jPzs3Gw8PEw8jM0eLe4fLq/Vxb9fp83tPPz8rP2Nny/fVnYF1NRUtHQ1Bl4tjR0d3U7Hjw+Ozo71tu+Vxifu3z6upmbFxQVVZVVE1HSlNJSV93e+bc/v72cWZrb15YTEhLSEhSanJ54HZoZV1ec+TYzc7NyMfHx8G/wL6/yMvM0djT2uftau/ufOfWzMzHy9Ta5XZaXV9NSUNAQEFHUXH26Nnp6f1pbm76d3BdV1tSV15y7vHZ6WJnWFVbXFJOUElMSkpWYfvp1drh2+Lx/HViV19NRkxLUWB6bejdcPN5XvTe3tvP1d3Ny8rGwcHBvsjOzNzn3eZ55+9cYGVe99HLysbJ0NPnaHVlUFFRREBISk5kb3Dk3eLk5v3d1u7m33BaX2Fk8OLn4+xeVlhPT1VNSU5LQkRHSVh7e+Td5fp7dGdmXFVYT0NCSkpPX2z44uj85Orh0c/S0svPz8fGv7y7vb7Cy8zO0c7O2uLe919lavjSztDNzt/qfWZ4cV5PSUdBQEJFTlVXYH1sZerv39Xic337YFthc+be4PB2WE1QT09gYlBPT0hGTVBq5N3d3uZpZ3Rw6t/+VlFPSUlKTVplbPPo/u/f3tPNz9vYz9HPy8bBvr/KzNDe29fX0dbsc3pnV2bh08/Oz9Tc6Xn45N3bblNRTUZGSk1ZbX3y6unz3dHR293k/Op3afv06ORlWVNUTUxNT1JOS0dGRkJMYWzt/nFrZl5bYf3nfF1TTUxCR0hLXGlnceTq/t7T0s7Py8jHyMXAvru7wsXHy9HT0Nja2d/m6Pv32NLPytTe4vFpYGv5e2ZRSkNBPz9ESmf0Yevi63vk2ubc6O13YV5YX/7q6WFdZV5SUFNSVFRNSUlNUFZ0597x8PpqbG3o297ma1NMSUVITl/06np67ujg4dTP0cvP2tzXzs/FwMLHy8zW3ere2+nf82bz6N3YysfLzdvvdnH+eOr5ZlRGRkNDS1zq4trscN7g7N/Q0d/mZVpaVnTt3uR+aVJWTEZMVVFFRkE9RkdMZ+3y8vJVUl9l6tnbelhPRENFSV7s923uXVrd29fKxcbJztze0MrAu7y9v8vc1c/cz8nR9WlkZt3QzMLCxsvqW1pmZnzf/lFFPz0+RExw43NpVk1c49nU0NHfX01LTVJ549bnfGpKSk1TWWVvT0Q+PUZQ8tXQz9PfWFBg59LS1vRYTENER1T35+djWU5LZ97JxsnGz+ZlbdzKv76/xs3cX3Ddz8rQ2XRVUl3q0b++v8PM3V9WfeLW2uhfTEVCSU5+1tjkYFxaXevZy8vZ8FlOTExa79vU3WJXUUhMV2JuT0I7OT1CSWDZ0dhuWV5TUu/Z1+VzU0dHSEpd4Of8V0lSX2vlz8XGy9jl187Mxru9vsDP1NTU08jDzd1oUl3f1dTAvb7F3vPp5PHf1vJjVEQ+QUpLYPBhXkxJU2B88NTX6WZNSlFrY+3gefRdTU1VYnbyZk9JPz5EVGT+09TV7lFXdHjn1Nf1dFVJSE9m9dxwYFdGS1p548/N2Nj+Zf3ZzcvBw8rM2ePf2NHHxOVnXFVdcdDJv7/Ky9Xe39TS0s3pYFNOS0db/97XY1xaVlZg3NfM1nViWFdQ+d/34m9aU1FPU3Rod1ZEPzs+PkdaX/H+YFtcXmvb4OTc/1JES09Oce7l8FlNS1Re5NrRydDddd/Sz8PCwL/Az9zP0cnGxsTP61ld9+fOxsHGzd/q2d3OzNrZ51lEP0ZIU2ZxYVJKP0RKVeDf1+BgUU1YV/jY5uh2X0tJUFbj7mJfUEc9QEZR5uHm6PllYu3wzsrf2PJdSUpUWt/h/vVvUUNNWe/N0szS5Hh23NjKw8THztZ0et3ZxsjIzelmVWH11MTCx87Q1tzOysPCydpdVUlGU2Xp7WJSTUhETV3p1tnfal9bVGrm3tjkV1FRRktba/JsXUtDQD5ETldaWU9PUU5d//Dd2+FiWVZMT2Nwd3pgT0xKT2rrzsvNz9DP1M3Gw8PCyNPO1uLUz8nHxMve4nn22czMysnRztTTxsTDxs7dXldNR0xXU05NRD9AQUtYaOvt8GxeXl153t57bWdRU1dXeuXe52pSREZISVpkXFthVlVx8tzR0Njtdl1cXFJmbF9ZU0lFTVNg3dTT2tjX28/NysXK1Njf+ern7tbPztTd5/Te4NrP0tTQ1tjPysfFwcXO1edrXldRWllTTUpISk5XYX7v7up5ZWp5/+7j/Hp9aWNeX15obl1QSUNCRUZJUlJRWFRVYHj6+OfpdWJXU1RQVFtYVVJRT1VccurXz9HR1czKyMXGxMjIyM/V1dLV1dPe5d7c2tfS0c3Ozs/PzczHw8jLz9zibl5ZVU9MS0NDQkBFR01OT1ldXGJwdu/2cX36/Pl6a3RnW1NYU01OTk5OTVFdYFxeZmr46+nx7Ohral5YWl1aUlpXTlRTV2975dvU3uPW0cvJyszJytDO0dbQ3Oj+/Xpr6Ozk1drXzsjMzsnKxcTFycrK2+hyXmhgUFBXUExOTlNbWmltfm1cam/66uvh3971bG1mbGFUS0lKRUhHSVBPT09YVE9VYGJuZWN5cF5aXlpjXlNZU1NOS1Vdb+nd2tHQzsvGw7/AwsHHzc/U1tbW6HB5euzr4tfSz9LO1NXS08vHxMrPzNvvemRbUU9HREFARkdKUVpiWFlcXGpka/fsfuvZ7vF1ae71cFxRUUpKTE5SV2RjY1hh/nLp69/lbWlcV2Bfa2NdV1JST1VTaurn6PV9/OPSzMfKx8PGys/P29zh/nZyXVxdbunb0M3Ky83Pzs7KycjFyM/V2tjZ2dtrWVNLR0dNUVRdbG90bHDq29ff7fBuYF5aVFRYVlFTVU5JSEpISUhLSEpJSExWX1hv3+prbWBbVVhVU0xOUk1QWunk2NLT19XSy8TAw8HAyMnOysvO19vi/vl+8Prp3tjV1dnQz8/Nx8jNycvNz9fc321XVlBJSktJSlBYWGNgYmRka2Zq9PjycGxoXV9eXVxdUExRT05VV1ZaXFpaVVVZW2Vq/+jp6+fv6GxaVFRQTE9UWVp77N3b3dzX0MzQ0c3Q0NLS3OHi4v3r3+z86+rn7mrp5d7b2d7X0c7HwcLIyMzN0tPhel1XVlNVXGteaH71ZWlfZ3rtcXLw+fx5cWBZUVlWVkxLSkhMTUtISkhKTk1MU1RWW3B1dnNvZ15eWFZTUlheXn7l5t7Rz9va2NfQy8nHxMTGxcfJz9ba4nxtcm196dze29PS19PV2dDPzsvKztbT0tbd6vpfVVRXW1ldVlNVW1hUWl9XX/N3e/h0ZWVaUUxNUVBQT09UTk5VU1VZV1RcXl1o+nZrdGZeZmBcXFtdX1lccXJx/Px+4ODs4Nna39LNzMrKzMvQ2Nzb4vDuZF5kZmX37uXY09jTz8/OzczLy9DS1dLX2Nzm5e517d709vtxZmdbXF1XWmh57d3i7fb6W1VQSkRGRUFITE1MT01QVlFRWVZVVE9ZVlRXZmBYWWFaXGlu9Ovrbnnz8ufc3t3bz8jKyMTEx8nJzNPV2d3k6Onl5u91e+fo29bUz87NztPX1tjb4d3f6efl6Hl0c/52bFphbFhYWl9aXF5cXmRy7uf+e2RgXFZQTEpKTE5QTE5SVFheX218b2d2b15kY2NrZlhYVlRab+Hl7PF6cfN4eHp+69zQ09DRzdDT1tfc6OTl9V9qePhuZl5v7uLTzcjKzM7Lztra2eHa0c/S1dnZ2NfV4Opucfzuc2Vk9/dpc21sZXd4e2xiVllYT0tJSEVGR0ZHTUtOUFNZXllWXF1TTlRVW1lXVVZWaW/q7eff++3m7PTp5NTOzdDMycrNysvP0tnQz9Tg4+Do/m1cYWn729TQz8nMzszR3uPt8+zs9e/n3dfe3d/vY15mX1taVV1nX1dcbWBqaXhqX19gXlJQUVBLSUlKSlNVaP1mdOvqYWFjXFZZWVxZVFtsc/Ps7/VuePnzaWRu5vLd293d3dPOy9fU2Nje3d7e5vVweGtYaGZ9793UzcvMzMvV3tbT1dTZ3tzbz87L09TU3+bma19qYnL191dfbGRs6X1jYF5fXVhJS05MS0pEQ0FGTFZYVWFdWVtYS05OT01RTUpPXGP/5/7xdP905f937t3X0NPZ0M/Py8LJzcvJzM3R3d3c5/jwYltj7NvW0s3Mz93b2fXw4d7q39rf3NTf09Hu/f5sX19fW1plYHNqV1xvan3uc2ZiZVVdWE1OVU5MT01LTE9QZnJscmRYWFpWWllVVV5XWGFjYfvtdXtvaWv4b3nx7PDa19vSz9PSzM3P0dvn3N7r6u9nX2FhZ/xx7tjP0tDR4NrZ2dfS29rT0tLO1djQz8/T0+Hl6un06HljbWljeuZ79PDsaWhbUk5KSUlJQ0NGS0tPTlVcXFZcVkpMTk5KTk1OUFJRZGFdZe55ZvPu8Xl889nb2tTKy8jEwsLDxMrGztjc2Onx7u5sb25q3Ofg3dpxcPHu9+7z7NTk5NvV6NzX2d7d5uza8vr4cmJ1a2Rgbl1y3Xvp9mJUW11VUlFKT1RMUVRQT11mcf5vVlxgV1lYVFJWVlVWW09dbXL8bWZjb/f38ft43t7j2tPV183KysrR2Nba6fF4Zl9iaWJrb+7f29jX52tq8+Xu4N3W0tLPzM3W1s7P09DOztHU2d3m6eLd9XTs6u3q6PhwVktMT0lESEpKSUtLUU9MUFpWUVROTlBMS1VSUFVXTVFdXmBpbHf1d/Ht6+/f2dDPzdHLxc3MycrMyMnLy87i49/zeXZrYH7p4N/na3d0X1heVVZq++Hb3/zb2ODt6fne2NPP0d792t3f3OZjfOvt6+hnYGxXVFVMQ0hJUFRST1lcW2RsV1JeXGxmWk1WWF1v/VZUYmTy+2tu5XD37HBYbe/p2dfZ1M7W0tTb9t/Z2NjgdmxkXPr0blx0/N3U3e7t/nt9bV5VX23f1dHa0tPS09XZ1s7PysnM0s3NztDO2PP37vb9+mtpYlpNTUZAQEdLTE1OT1NRUlVNSktQTE9OS05UUVltW1RWXltz5N7d3e3r4u/p2tHSyMbKycvU0M3T1tTc8vR8cnz08+bxdvfp6ODZ4efzX1hdVFNdY2ns2+Hd4+fe19vU1uDf19fX0dbZ0NLg5fdxbe32929ZT01HR0xNT1ZdWF5pYl9rYl1dVktMUE9XY19jdWhqZGhec+3q5OR9bvl+9unb4NXT1NXU2uHc3+ru+11XU1lccGpneW5r6t/p3dne9PteV15kY+/h5tzX1drPy8vJy83MztLPzc3NyMnMztPf4eL78PtkUExGQUFERkpMTU5MT1JXVFVXVE1MSEhISlBZZV9dXWBca/fg4tzb5PXu6+Td2M3LyszKzM7NzdXZ4PxnYVpXanr+7utwcP7x7unp9HxmWFRRT1RfZGl3eWtt8d3R0NDQ0dTX1NDR0szJx8rM0dnZ3dzgfV9TS0hITExOT09RVlNXY2tnYGNdVVJOTU1PVFpfYGBfXm197t3i4eTu/Xrr4t7Y08/Q0djc2Nvk7HJeWlBOU1hXYGVmcHxweOnn5u/uc2dcWFxqdu7u7OLg3dzPzMvKy8vJzc3MysjKycfEyMvN0dzf92JUTEVCREZJSktITE1OTlNZW1ZQT09LRktKS01QUFVbXXXm6N/W2tzZ2ePf3dLNzs/Kx8nLy8vO1+HifmRaXV5aWVlXWFtda/Ty5t7wd2hnW1JWXmVmZmxlaHX02tfX2NfU1NTOzcvJy83My8nJzMzN1Oh+XlBOTEpNTk1LTlBOVVtdYWJZVFJQUVBOVVlUVllbXWb849vZ2NXX3N/b2NrX19nV1dPN0t3a3/hmV09OTU1OUU9LTE5PT2B69ujz+/piXGlkYn7q5t/f3NjV1dLMzM3Ny8/Nx8TDw8nLys3Pzs/U2dzfeFtSTUxMSkxMSEpLS05XWFlYUU1NTElNUVNYXFlSWlpbcunq3Nfa19jd2dHU1NTV1M3NzMnKztXX7GltZ1xhX1laWFRSVFVYZG1iXVtYWVVPUVNUV2JiYmtz8OLf3tjX2tvUz87MysvMzc3Iyc3MyMzS2+Xqel5aWFBMTVFPTVRgZW1nYF1TTlNRUFNZYmZdXWxwdnbj2Nna0tDV0NDPztbf2tzf3trX2Nnc8WBbVlRRTk5QTEtLSUlNTlFYVVNUU1RWVFtfZ2ZhZ3t1feLc09LPzs/QzcvKysnHxcfKx8jJyMnN2vFvc2JWVFlZUE1LS0xMTllZUFRZVE5RU1VZV1ZZWVZda3D82NHS0NDPycvOyMjKzMzOz9DNysjN19nb9GhuXltfXFtcT09WUE9UWVVOS0pISktPWVlNT1lPS0tOV1tXZWpmdOze3N7Yz9DRz83MycnFx9HV2Or9Z2nu7HtxdGppXF1oamz/dXdlYXN9b2hhYGZbXWFo+tzU0tTY1tLZ1c7Kx8zNys3QztPZ335x+l5TWFlaXVZRUE5LTE5OUF9qWlBOTlBUT1lnWVZnYllYX3L6+3X45f9y593Y2tnh5t3Y0MvP0s/S3nNfUU9YXmtvWVxrZlxdbnFoZmBeYVxgefBtbnhdVFRSX/js3M7MzsvL0M7IxcPExsjEwsfExs/S1OHq/Wx84+fy+2RWUU1LTVJTU1pRTE5KR01NTFBQTkxNTE5RT05RUFJWXGR+2d3Z2+ji2+fi4+fp5d/v+GhjbH5sb2lucXfv5Nba3+jtbnBvdf7u6uPbfmJcYWVyfeje1NLPzM/OzsrNzs/NzcnKyMrR3Oz5WlxhdfHq8eDn/WRfZ1dTUlVTVFFVWl1TXXZeW1RTWV9dZ3BrWFxeUldaY3fq7e3e5Hbl6mZpZGZtYlVZX1hUXlhNTk1RXGlkeeR5YH10Z/9zeeTh7eTnd2x7a371++DWz87JxsnLyMzMzdPPy8zRzMvT2Nvj3d7h19PR1tXV3d/pcG9fVVlcXFllaGhpXlZTTktOUVZZY1hVVE9NUU9NVFRdZ3Jr93VtYmNdVlxcYmt2bvP7cF9mW1hmZHrp8Hjye21ke2VkcW/y4fN3/HBsZu559urr1svO0dDQ1tnV393b2M7K09zb2d/i3Ojn5ujf1+r54uFxbHFse/jy4dTf39jY6er29vx3de3ec2JwcmZwa2BdXmH062pdYl1QT01JSElKUVZPT1ZVUVJQUlleYvDwamBrZl9fW1ZXXF99+nh47PPv7flx+u7l2Nfa29je3t7i6Nza1tDQ1NLPzsvKzdPS2dXT1tzb6uvk6XR37vPg4eLj3eHi7vdgbHdt/HJnePhgbHhrXGlkbfDt6d7rYWJjYlBRT1FXWVVZVkxPVlJNVlVndnFu+HRncmtgVVxcX11oZPh1Wl9uZ2R1bvb79/XsaF1faWVcX2Fldfd93+Lm29fm6OPd2dbU1M/a3d/X1tfS0NfPzszJzc/Rzs/R19/q3N/f3+js4dzl6d/m7dvg4u1xanBrXFpgUk5QTlFTTUpLTEtNVExPV1lcWU9OVlpWV1xQYmxtb2ZcZ21kZmlmXX1v7ubwdfNubG9+d2J9buPb3+Pa493c3PZ09//a3ejp3OLc3uP19/Dm1NfZ1dHZ2t7f6OPx6Njh49rb3dbX2drZ39XO1tjZ5Ofo+XBna2fx7WljZltdYltYW1ZQXFZQVVdRWFhXXF9cWmpsampsYWhnYl9bVldfWVlVU1JYWFlTUFVbXl1kY29qbXJ1amNx9ezn39zY3NvV0tbVz83Kx8nO0NnX0dbe2dXXz9HV1tDSzc3X3NnZ4Nve3Nrc6uTpeH7r8njwbmpxY1569mllX1RSUU1PUU5PWVZPUFJRWF1ZX2tgY29hXGZjXmxsZntuW2BwZWFrbGd0dHfxe2VvfWBZWldWXVxdZl5aY21mb/zo5N7n4+Hp7ePb3t3b2N3V08zJy8rGxsnKzc3QztPQ1d3e3Nzh4uHc5+Pu4ebw5+Hr/frw+WlwbOjreHtsYlxaWlhWYF5rXlNTVFVSVVJQUFNOUkxLT05QU1RRT09UV19dY2ZjZGFnZmFiaW/ua2dta/bt6/f8dPvt6/P37+nk7+ns6eLY0M7Ozc3Ozc/Mzc7OycnLzM7Q0NDVztHa2dLX3uhzbHVwYnJhWFt2dXlwaGZsZ2F4bGBkcmJeXFpcaWNfZ19YYHh4+X19fH1mX1hTTlhuaF5aXFlcVFVWU09cYF5XUlZUUk9OTU5LV2RnXWRkZWtu9+jj5dLOztbW1dnb1tfW0tfPy9DX0tLOzMzNzc7Vz8/W3djU2Nvb7fDs+N3W3NrX2dzf4/N2cG77/2lkYmVcV1NMTExOV1ZTWFhYUU5OTE9Xavh0a2xoZFxdY19n+ebo+Hl9bWxeXlxYVVlbVlFPUlRWUFdZWFx37+99/evi4OjY2N7h2NrX19PMyMrNxsnM0M7S0tXSz87obPteWmX7/ern5N7hcvXmfPzh2Njd1tjS1XV46fLs3N7e3+Hu2edZVVNPVGZsZllcVV9RS1JWT1NbVVpTVlRuV1NZYltZWFVVU1dVZk9NT1BNV1xeW15kXm5gbnlvX27v6/Tf1tLO1dPOzdPQy8jJwcDGxs7UztPWzc3Nzc7S09HX3OTq9Ojo+vbke3RsWF1pZ2rp7u/m63v0bVxdZVtcfWNcW1xWY2Bfef5iaPJ1e3JmWl5VU1hUTFBcU19lZ2BoXFZcVk1SVE1RT1BQWVRWZVdVYWll9+/xfO58797u9OPd39DS09nU29nS4NrOy8/Lzc/W2N3W2ezg1M/Wz8/S2drh2djc29TR0szPztXb69/g9Pzq93b2Y1tVU1ldVlBPVlJRXlhUT09OUlFPT1RUWmReXVpbWWVtXmdtWmRjVlNOTEpNTElKTk5cZl5bWltadXRodPDx1dLY2tna4M/Q0tHO0sjGy8rKztTK0dPW3unZ3ej6c11b8v747ujs19/z7+ZnduPn3ezg4NjZ4OLea3Xd9P36ZmH+Z1dfWUtVWFhpW11gZGhYZ1tPXl5hXVNbYGt3afxiWF9dXFRJS0xLTExPSEhIS1BPUl1gaWhse1tdYvzk7OHY1NDNycnNycjExMjIycrJyszR3t/m29nX19ne4eLq7WxydnxudXtnanfo3d/i29fd5uHrY1xdWV5YT1JdVFptYV5cXFtnXFhTVExRXldQWVZbb11n/XBYa2VaVFNNU05HREVFRFRdWldWT1laW1lkWll48erk6evZ2dLOyc3Lw8DCyM3PzM7O0M3VzcvLztt5/fF87/j7a/v47O55YvLh3NTS1+LV083Q2uvp/3vo7W5o8fDc2PBgaV9u+m9cWmRlbW1WTldUYv9tVlhiXV5ZTUlGQkhLTUhKTUpLTEE/Pz9FSkhIU1laWWReYWvx18rP1szJysrFycrIwr+8vr++vsDBw8vR1tHTzd7l4/Nfau1+efvj4tfk4+Tlfu3ndGhy6N3T2tvZ2+fe4/JlZ2trdGJseGtiePlxa2pmbnJpb2pjX19ZWVlZWmRranBmX19cT0tISUpJR0VJRUBDR0dMT1lofvjs6/Dz8Xj64eLe0sjHwL6+v7/CxMbLzMrO083T39zU3Nrn7uHd4NjV3uDq329p3u3xz9XOxcbKxMXM0NTS29bk3tpsVmZdWVxVXWlvZfJ8WU5OREJBQUhJSk9gXltZZFtbVlJYVU9NU09KSE1MUVBNXVtYYft1bH1xYWhmduXp6NPMz83GxsjEx8XFx8rJyM7S1tnX0NvSztPZ1dv5ZGJXT05NV1haZ+Te4d7Y4d3f4NTQ0dfQz9nd3N/V2drP0dvo3u1oYllNTUpHSkpKTVJNTVdTTE9PU1hYUE1QT09VVlRWUFBUUk1OTktKSkZESExPUFZj6ufj1tLT1Nba1tLRzMjHxMC/v8DEx8TFy8rL0NLR2/h5Z2n29md6+W/v6fJ48O/s4+x66+X7e+zx4OHu59zb5N3p6vP+ZF5TU1JVVlZfXVpgaVpYUVFOVVBOTk9QVllUVlBQTVlPTFJUTU9PSUlJSEhUTk5aYFt47Hv+e2Jk5Gxo7+vv0NDWy8XIw7zCwL3AycPJ1NLN19XS3M/P2d7e+3rvZ1lsblxyfWd24urZz9PSyM3RytDf09Xr4eJta/lZVl9RSk5MS1VSSEtNRUlMR0pPTU9cV09bXlVoa1BYZlpWWk9NUkpIUlhRW11bXGFVUlxXUF1pYuzq7+DT2drX2drPz9nQzs7TztPZ293r2dfl393e6dzl+fd2X2t+dXns7+3Qz9XMy9TNzdfY1dvo2Nfd2Nzu3Nzt39fg9u1pVVpSSlBXV1VORkVKRUNLRj9FRkdLTUhIT1FPV1BPX2Z27uft9/N8eOtzYX7g4eHt6+fn49zT3Obk29ze6enm19jX0djb1M/T1tvZ9ez+9nJbT1leWFhaX1ZiXmRlYFz+4djU1NDSzM/P0dbSx8bGxcLExsTJy9R6e+L6/fno7v5sWltcUFFSUVFPTkxOUkxQT0lQT1FQV1hRT1ZQUk1JWF9jY+/p59vW4dXS0s/R09bOz9bU09/X29nS1NbYz9fl6vdtdl1daW9ue9za39nh6+l88Oz0bG31fXnse2lv9vX37ffs2Njk3dzc2tfTzs7OzMnMzszP1dTNztbf4+fi9Xd8ZFhZZmhpZ2hjbWlYVVdZW19fXmBjdeTu8/t0anJ1Y1pdYVxiZmpoYF5kbGpu/ffv6Pr7dnb+dXx8fOXi3tbY3/Tx/fd5aG7u+3vx8d3e3dvY0tHMyMrL0NLW2tbd4uDp39ve1dTT3fB2d290Y2ltcu576ujf5+/k3enf4eLmc2v+4ePwYF5nb2FfZWVeaHZkY2VganxfXGr/8t7l6Ojo/vzr+3B7V0tRTkxMTE1WVFJcZFBPVlRSU1NXZ2RbX3xjfuPt7d7a19DS497Y/vDg397e29LU2d7QzdvX1NbS1Nrb29/n4Ofi09fc4OPa3uZuY2hXU1xZZV5cdvpscOva2+fxcep7bXJiW2d+6urtcvjqdGtwa1xeWlVLS0lOTEdSZFtdX1xraGdMTFFZXlpMTVJTUU5PTVdZZufgd3tz/m5mY2jr3tbPzc3Ky83P2Orj29va3+rl6e3yfnv8dv3n09DZ3eLf5e5uZl9l+epucPr86vpwXmNjbG9kWVRv7XRXUlZnY2N439rS0djcbFpbXVto+O3g2t/q+V5VUk9KTE1ISElLUE1DREtKS1VaXWheXWJaS0lLS09bVl3o6eTY7WryfmZz4/Tj2NzTztfd09vfzszQycbKx8bT3t3s7tzqftjV2dPV/G90X1lmWlRpenv6+FtQUEtNWVFc9XVjWlRQTkxMU1tcbOba19/26PdwdPh1YGRu7dv4cf1s+3v0euzf4+HiYFtWS0hHRUVMUFd1fVxs/1xeYVRRV1RVdGtYdWlbY2Bcbunr3M3Z6Nvl8+5vftvX1c3Iz9DJys7M2d7W1tzPzNPN0dng5XLs3uX93e5jX1tSVFBNXFpfbfFs++/sd3JZT1FLTFBWUVxeXV9nWF9zZGf18PrtemxnYVJeXVFh7+ra0tDQ1dj9/mlbZ21wavT4+OdzbHlzd9/Z09Xf2+BvZV9wcmvx6Nzb4dvhfOruc3B2+uba4e7X1ubc3Orn83na1tzeztfl2d3i4+rw3dfa0cjW3dp8X1pNTmBkX/zga2/talthVWng9Gl1ZlFQVUxLT0xe8Ofm1N1raGJXVVhSYO/78N7f9+Lb4NfZ283JzczOz9XW1uft8/Hl2NrQzc3NzNPd7evt5P7n2uLY7fTwcFZgY1xiWVtjbFxmdXJVY2j6497Z19Ld4/9zZ/f34N/Vz8rIzM3W2ePZ29zi4+nsbl5aVE9PWVz8cuTb19/t/GhYTVRYWlddZfB89/hsZmV79Oxv+N3W3u3h4nV59+rT183Dv8TIyc/a2tvYzs/MxcTKz9v8but8e+NzetvZ3dztVlBXU2N9buDO5WJcUkZFS0dMVVJw1err5uvt3+p+3d174NTg2tvsau3u4M7N08fL2dDXfWdoUk9RTklcXVpvYF/8eVto+ndt1u703fJeXFlTb+Xg1szY08rT3uB9ZOzb59zN1M7N1tra5O/b2N3T0NvR1OJwdmph8+Do5fhdZGNYT1NPU11dV2l7bOvi7V9nW1VYV1FVUU9TV0xLVlRYaHto6d/r49nub3tbVV1eWHnz7dHJ19/Z9WNtd1xpdGb4a0xLTEpMWFpY7eTs2NTxcW5uZ/94d9nb3dPY5N/5b3Td637f3+Dge2lpY/z52+n67Glt/3p0bXF3Y3NzdP/x2+fo4XdkV1JaVlhbVlxRXF9RVllaXF9gXFhfVVxSSUZBPz8/QEZPVlBmXVdWV15hZHT28P1o5fDm5eXi1c/O0tHR0s7a3Orp9/tpanZwYGh2bWpbaPvvfunyd3Z4d3vu+P15cGlsY15ldnZoWk9ST05NWWFmfubg5ftlcfT0d+v06d/b39vb497h6/Dmd37l7F5UT01OTk1NVU9SXGBcWFVQXF5TT01JR0dHQkJFRUpOT1VfXvze3Onu3+ze3d3f2NbSysrOz87QycrO1Nbd5+ri+Pvl9nVhW1JWVWT7+l5eaWVlXl1TZGNda/9eam1763BiaXRgafV9WWbwaW767Xny39Hd4e797eZ0/eZ59uvg7Oh6ePbrZmtrWFpZW1NeVVhnY1VrcGBo7/JibllTV1lNU05JSU9PUWJfYura6djY3N/Y2trT19DKzdjOztfUztjV0Nvb193v9mxmamZbaH5q/vNjXXBgYHn27+jf39vpeHTo7PXl4+ri5/Xe3ePo/V9mZFtccGxo93F64+9ebW1kaHFr4dfn2tHS18/U3dXf9+Te9vb2X1lmXF566OXX0+rd32ZWX1ROTk9QW1xUXV9WXPPzetjX2czQ1t7d9Obf1drPzNDM2tfT1/Xj2Nvo5d/m2t3X3efp7N3i8/N3cu7l6PDv6/bo+m99dfP04trc9HD66HBr8e3w7Nve3Ojw7u937+fx6ebm8nRkXmFtb97Z0s7LysrL2+brbWn48u/z7ezy9XV8+fDg1d3y825fVVhMTlBPWmZfXHbi3c/U1dnO49rl3e/X3N7Y19bUz+na2+bv3ubo497a0+146M5l3tbq0tn7Z3VSUlpkbHRs8eH0bPfveX7l4Orm4N7r8+Lc7fHe19XW0tbb4ezx6WxfZ2t8/m5bbe5u4dbZ0cvIy9PX2t7t69jmX2zm8Ozu8uzk6ejecl1fWFp1altVX15n/VpRVltfZ2dycWlr29Pqcu/v5NbUz9Pc3dvkbXFubeDW2N7b4dzT4fjzdPjh919cU0tUXlhVWVlhbm908HRhfHpr/er75tze3Njc6+Dj4trq8uZ0XV5lV1hqZ2trW1hdY2D46PLe43v17Pf+fPbn3N3X0tzj5/PzfFpUVFtdVldaXFhRV1pbbH7q93ttVVpeWmNaXvbm6OHb6mdsamnrcVtSXmdgXF1p7PX86WRcZGzudmtaT1daX1tTVVtpfOXe4ejo5d/d9W176dnX0tLR1dPR0NPb6uHa4vJWTktST0tLSUpRVFJYT0hLUVBVTUhHTU5OVFNSVFRWb35r+OPq19rxe+ff6tzf4NLPz83R3unl/OLhYlpkem/l2+He4HLu429xeVxeX1BMSE1MUlpPYmVidt57VlVMSU1GPkE/Q0lWUVZbVFBfY13r6e7k2+fs3dnc0s3KwsTIxsHIy8rOy83X8PTk8N/Z62xdU0xVUElMSENFRkVFSUtIT09QXl5NUlJMT1pOTUxISUpSU/7rcOzsbfvd+/ntZ15682z03urdz83EwMXDv8TIw8TJztfq6N3d3NTc6eF3a+PzX2VSTU9KR0ZEPj9HREhPS0VER0VLTExPSktSXnXv2d7p2t3g0NTZ1dXX0tLS0c7MzsfExMDDzNTX5ufa3+x6XGFidHr03nRnbVxeV1FUSUZHR0tGR01JS1ddaXpmWWFfVFpUVFFKSklQXVZt7Wr06+nTzcnLy8rHxMfGxsTHxL28vr/IzcvNz9HT3Ojt+mj9aG5vVU1NUkxQVE1IRkZJSUtOVmBd6NXW2eb88ez/d/XkcnL8/tvTz8zP0NDPztDO3v9nYnVz9mFj+f/u1tfQ0d7h5el9/G9nXmFs79/c1d30cXN5/vL0bWVYWGVfWU9RUVZgcejsa2j0e27u5eTq3NTOxcTGxszQzs3OzMvT1Nbe1s/O0tHO0NHPz9HY7/BtXF1dX1NOVlVo6N/X3+Hq39rj3O9oclhcY2FhVmh0be/m1dTk3uX7amReUExNTVdo+N7p+3v54ung5mT7cnPu7d9+69/k1NDMyMzN0NLc3NLd6eHk3tfX09fieWtramtrV1ZWVGJx8f777uzZ0tDLzc3S2uN17XNhbu7p28/LyMnO0tDV4fZmWFhUTlNjb2r98Hzk2dPV0s7S1Ot9/VxYYWVocP/t6970XmhwbmhnXlVPTU1RTExRT1Vab3Bt3+5+7V9lX1xhc9rc29HQx8bOy8vM0drY+HL8dt3Z1dXg3N7k7GzqblRfV1VXUlhNXvR25Obb0uDc2Nvi59txXnNnavx2eF9ld/Pf7N7e7NvkX1lXU0lJUU9aXnrrfu7f4Ofk2/Jt8PPr4NbT3unl5tzi5uZtZmxmbGxjUlJfXFlaYGFQWGBtd2JlU01PVFhYX2dcYPnr3NPY3OPe2d7n6ndiVFx17+fk297g29XX3u9tVE9UXGteYWRXY/br3enp4/Lq8f7sbWVaTldhYl1dbF9je+vibV5cUFBVWVJKTkpIUFRlYlpoXGd+fe3y6PRu/vLe3N3X3ePYzsvO2OByaffp4n378Gf55Onn+vFxYmZlX1hZUkpKTk9OUF9bXXTt4OLgfmFVVVNMT1BPTlRx+Hbi5Pvz8f9dY2pfW1lbXVhh+GRfaezq4tjd7vJxdHfy6l9eX2lxau75Y25vbF9h+2JYV1JMS0tNTU1RVVdec19PT1FLTVVUVFlpeOnWy8jNz83S3dTS2tbV0dzb2N3X19vf7t3W1uPl3nFw7vtdVlhTUGVvcPtre3RbZPRwe2ZeUE9TS01TXVpYbXd4a19bS0hLSkpKT05NXPnr59vecmtrdvDc1trh4dfb3dvT53Dz6N7X1dXa2Njh331sU0xPTVphZ2taXVlUYnTj+V9cU1NecXV6/Obf0szV3Oru82J14eZ4durl0s3V0t/l4vXl1M7V4OTz6tza09vm+/Xp1c3S2NjW4N3gfG5YUE9RXV9nYFhYV1xfXVdKRkhFRkxNUU5OT1rs3/NuW1tWV3Jo7ebu3NXKzNDL0tDOz8vJw8bK0NHPztTa2d397+Th3d7lfvrr3WxdYVhTUFxaVm9saXht7e3Z0+NnVWFhX+7m83p07fDl4+36+ezrfW3wb11ofujc1NHZ09LRzsvGyM7Y29zYztDc6+nd3djZ2un3eXJtWlNPSkhFRkpMWE9PTUteeeP8ZF1WZf3n1dXX19vQzcrO09bZ1s7S09La2ujk29jY5N3k+NvX0tbe2vd079zU7ejq/d/bz9Pb1N3o3NbebF1YUVVgdW5kaWtYY+jrcFtpWlZbX25cX1tWXXXi6vbpe/Tb0dPg3Nze3tnS1dbX0c/Mx8TKzc3Q3/H07uTy8/Dk297i6eTk7uve6n1gU1NXX2FiX1hfZ2fu/v1+YnR29vxz6vjp/GzhbWVtXmdgeOlu82dhbGjc2nrj5uTe2MvSysrQztTM0XXr4ufu9NDf4tvl2PDl31lXVkxIRU9LRklDRkVNbFNNVlNQUXl3VGdtbv140dr45OTe5M7I0c7N0dzey87nePnm7trO1NDR1Nvcy8/qaXf6fOjW19vY2+xr29brcV5ZTEpXW1dWT0xIUFxQSUZKSUtTU0tKTE5OUVxlaV5YUk5bfunn6HVwet3V1tnf4ODZ2tTNyMrX09LOzN7raWD4dPDq4+VcXmhndWxrVUhKSU1ZXGtUT1RNXGheVkhTWk9aY2xRTVZPWWdyeE9QW1Nh79zrX3R4ddrMy9ne09TPyMLBycjL0s/Ix9nl3OXp3M7P3upoXVZbbVNKRD4+PklMRkdCPz5DT0lGSUhJTF/0bmZaVVJb6+lzdF9XXv7R1tvb+Gds19Dc1eB1e+bO0NDT2N7czszW2OVud+DUzs3Q1ndceOHrfWxTSU1RV1pWUkpER0tHSklAP0BJTU9WT09LUWBja2VeWV3w4tnNy87e29DNzcrJzc/MycXGxcbN0NTX1dXeeWr8/vfd3uP3aWxfWVpYV05NTlFYV15cVlhLSktKT0xNT01XWmFlYmNiXV1gW1tUWE9TYHLz9GpeX/f259zUyc3UzcrExsjJ0M7NzMzOztDS0c/MztHb9V9XWlZRVFRQUU5NV1xdWEhDRUVCRUlLSktPUFlcWFlOUmpfbmxve2Pu2dLN1dft5dLVzMvIxs7MyMTCxcfU4tXT0M7W0NPUy8jJy9DjXVtcWFdRU1BUXWRqXXNmSklJSUZAR0hJTFBcW2tkUVJUWlpVYVtXZvXY3NzW9+/h5tndz8fKyMXAw8fFzdDR29vx39rh1tPMy87N4WdfXFxPUVRQV2tuYl9tYllSTU5IRkpISlphXFhrXVRdXGViZGpdZnna0tnIy9rc4dTf183PycW+vL++v8HGysnRz87a1MzFxMvLzNfe8GNXT09LSUtTYVxpfmRaTkpERElDRUlOXVpkZ2RjXWBWXXZcYXDu2uPW19/f7u1dXO347dbQysjCv8LCxcrU7dvV3tXRzMvEvcTJztDmZPP1ZGdt/V1k6X5uaG5XR0tMSERHSkVJUFlXTlRQSExYX19p7Pf1zMPHysrJ1NnOzcvHwL/Cvbi5vL29ytfS29vc3+V75M7O1+Tja0xLUkxMVk5MUl1rYF1lWUxLTktLU1ZRTltsVVtfT0xJUFdQW1tXXXTb3dzZ/2dbXXh32tDOyce9vb67vsLGzMvPzMnX0s7Lx8rJztrtY2VjX2tWTlBWW1BYWExIQ0FBQ0lISU9OU05XYFNKSkxLWPx2Z+7Y0tDLyc3Z3+dwZ9/P083Fw8TAvb7ByNDg89jR3dzVz9DNxMbS5nloVmp9XFpVXVlQWFxQTUtHPj5GRkNFRUdJTFdLQ0BBPjtCS0tQXHvu383X5vZsYlls2t3YzsfBwby8wcDDzNLX09Ld3dvY2tTJ1uDlaVtVYWxja1tfZFl2Z1BPSUVCQUpISU1LT05PTkdFQEJAPkhOTlRYeODbz+bwelVdV17c3tXPy8HAuru/vsbLy9DLztjh9N7t49bj62hbXVZcXl1eUldcU1lQSUY+Pj09RkpMUFhkYGBdVlBLSkdHTl5eVWXk3Nva3u5wXl1bW/r3etjPzMrHxcjNz9jc5ebZ8e7g69/X0M/g6+ro+fnjfmxoXV9XV1pMS0hCPj1ESElRT1VgVFNNRkVAP0FMWFlj+93SzczN0NLd6u3j1NbSzcvHxcXFxcnL0tfW3t3e5+158ODp431rZl1u9Pjk6PhkXHJdV1ZRVEpJTk1WWmBoX+1yU1JOTUY/Q0NJUVJcV2V+ZW1oX1RKUFpd/d7V1MzDxMXAv8DLy8nNzM7S2eja1NbP0NLl7dzd3dPb/WRcXldRVU5HRkdJS1/1a2pre3BhWVZPS0hJSk9aWlxm6+T6/O5cV1JPU1p17u/i08vOzsTKz8zNzszLz9jW087JycLCyMfIysjGx8/W3X5sa2xiTEdJRkhKU1ZWVlBPUFJKQ0BBPj9BS09MUmP+5eLqdFt7Y1hi++Lk4dHLy8nHyc3NztbWy87Z5+vj5drV09XSz87OyMfM0tLS4Ori6vVrXl9da3176ubue2BsaU1KSkdGQ0hLTlxSTlVq+mJTV19bXWl4e+nl29POycbGv7/ExMnFyMrJzs7MycbNzMfMysjFxcrN0dntZmdWT09IS01NTk9udV9sW19eTlFJQEVERkhNV01PVFh1YVhcWF5cXm9+3+r95NrPzs3GysjFx8THx8nR0NHMxsvGyc7IzczGxsrY3u9x8G5rX1BZV1tveeH5YmlaYGNTT0VERUJMUFRbUldcYejvbV9YW1dhcejn9e9s8c3Nzs3OzMzCwcbCydne187Ny8nMysbDwsHAy9Tecu7+d2tSUUxJTlJgWk9QS01RUE9GPz48PkFCREJERUhPW3FrXWJda3Ps2url63bv38/KzsvJzcrHxsjN2ujf29bO0NXTz8zPyMjS2N7j+3Hd6GdfW1lVX/55bHzq92Tu+VZMSEZGRUlIQ0NFSUhWZ1JNUFVSS1FZVFhaXFRh4Nnc0czLzcnDxsfFxszLxsfJyszMzs/JzdfV3fRtentcWFRPSkZHR0dMUE9QT1RLSEdHSEZDREFGSkZLTldaU1ZfW1paXFhabVxdZWdlZurS0s/R1t7q3t/g1tPd6eHa4tvU1dnc2NHSz87d/+rkd3l7dlVOVl596d39VFpZT1BMTkU+P0BFSE5ZTE5dWmRt9fteaHL939rQ33Tm7d/RysfR2tje0sjEzN3U3eXj393sev5xdu7c5VtYUk9bZl9WT0xLUWbe3nhkV0xNXGdWUE1ISU5gbmBdUVBTYu1ubl1MT1Xu2u/nZltj7M7U0Mze4t7Qx8vK0vlkbdvd5tf2Ym3q0NLU22ZaWH3rXmxWSkpT+uPf4lxOTF33Ynx7WkpNXmv332xPTVvw7dnZeFdc8dfOy9L0XX3X2tfNzujl1tDKwcPN4NvQ0s7Jy+lm7u3g0c/kUElQVlpQTUtGSk1SbfFwTkVJTVhfW01ISkhMaOLbcVBXae7b1N9pcevp08zM2nFjavHazsrX8/zlzcfHzNTd/Prk2dXi8W5v3dTP0uPqaGzj1tV6aXZdbN/g3/1aUFJfbPNqW1pJSltrempdTEVTY15iWVpRUHbd1ufr6mP208vJzMzY5c7FwcLGy9zh2M/M0tDede/W0tjc4l5aaHzn+WplV1Xt19ru7VdOVWPk4Nvial5g/N3l3mdPT1BdYF1WS01Yaen76G5Za3Dj3ebmY11ibtbTzs7s5tvSysnGzNTb5djV2eBraXj63d7Y6W/w6tnV3OpfVFRPU1hsbVpbV2Xp59rob2pWXl96cFdZW2B95uLme/rz4NvRzejz/G/u28/O2+Dr5tjX0dro421md/btbGhfa+jd2N3l43Nz4efzXlFTTVBfcOTx+Xpm4Nfa2u1wW1NZX2dgWFdXXvDo5d/a4Pjc0dPQ2fBoXvTt49ro5WZr3N/a4OZyWHJnYnldWFZQXnNu9PRsWGb8cOzcb1VTVV323OXeY2Tn6NzX2e5cW1xZamlvX23m59jZ0dn55ePVz9rS/Vz5/NjLy8zh6e7dz93T4F9cT1heZnROVVtX+2NeZVBWVWN3XmNOR0tIU2Z3fFtTU2Da09HbdGdXYunq3PpeX1765N/f7Or96NXW1OBtZGfs3NPa63NgYeTQz9bibFlgd+fk8F5ZWV/v5vluZltZbOfubVZMS0xUXmJdW1RRZeDX4P5yXVdYXmNZUktOVuLR19jg4OjWycTJ2nlfcN/c2dzl4W582c7O2ep2ZW334d5pVk5NWV9mY1hfYWvg4+toT0xIWWZydldUU1Ft497d8nNYVFZRVE9KSERMX236cvZuXWZfa3JZUFFZ4tzk6fbscufQzMbK2eFn9m5mdGdoWF796uPc6e768+Py5vRaUE9ZXGNvbGlea9nQzc7X32ZgWFNcW1ZSU1xhZubs8HltdV1fYl9aVmNw6dnb3+3s2tvV0drna25td+La2vJmZWNv5+z6Y2RmZXh1ZlNNTkxQX27o5/Dc3tHJz9/4bWlWZnpsYFZcZP7e3+ja6PleY+5lVk5PVljn2eHa92xjadvidf5nZ1tj2m5gZFlUT2RvWnb2bF9zz9Xd4e55XurT/t/U397SxMbNzdTqYl7rc27n+lxa3Nt+7+T6Z2ze3+r1eGxo1Mva2M/a+/rU2d/j5+9bauv9fGdcTUVRU05RU19UX+Hu+GpcWFJ78Hr46t7w4snLzcrN1e7x631yaWNfVWrsZWNpZVtdfG5r93Roaena7e7l5urf2Nnn3Nrv6dna2NbX8GZeWGFTTlNQXPjl5PTsZlFaX3ZpX3BtdOLSzdnT0ufg4NflcutqXG5u6vLn3/7f2dTd/OZlXfjo1Nve2u7f7drQ3M/Y5tfXztff23BpZWBdUFpSSVVi89ng2edraF9vYG34W2vn3M3PztLi5fLu92hvX1xlWV1XWmJYVFRXbGdwZFtnX2rm29XY3dnd2tnb3ujZ2tzPztno/X5jWF9nbGNbW1Rj7OHk/vt1dert4+f83NzQyMjFys7U4NvU4utiWlpaZV92aVlQRUlPT1hUV1BMVFdy7vfl/erU2tDPz87Vz8zMys/Y/Xj3cvX6ZVZKT1ZZYV9fVUxWXGzi6+F3e+7ez8zKzNTX2djZ19Lp9P3929XS61lQT1dYS09UUlJJTmbqclNSWGV4deXc53VcaN7Q0eZ7Z11s++nb+f5vdtzQ1exvXF5mfd/a4e96eOPU0NPW4vRw5t3o42lZUVFicn3r9mtdXWly/XZdYXTm2Nnf6npoZHl58Ofg7Wvq19/b52dZUFZQUF1XT05OWGxzYmlbVV5ja+zseG3w19TNy8nM1NnR1dPN3Htr+Xv86vBfUlNZVlVaW05JUFBUXmltV1daa+vf19zd19TIxMTHz9fk7uLq4PFdW1tdfnRjWk5RUE9NTE9LTVJWcejX3evtcOPd2s7Y3+Xo3tjS1OjzZGRw+nZqYFpYUlVXWFpdWVxmXW5vcuvt59XPztjd2Nra2N7V09vdYWHu83FqY2taU1JNVlpeYVliamdeY/z27u5zb2pxbmpuc3vsb3ReY/z5fmhr/3VkbFpdW1ppXV5qanptd/B74uLu9/Dr6fT66d7h5uzi2c/P3ejn7f1+9NnT1tTX2tfd3en58nB3+235fmliW15wX2RcUFlSUFJST1BLSUdLVF5pYmtoYm/l29jX1tfR0dTP0tLO29rX2drm7+5gV0pISUVLSUNKWm5rbuTW4N7W0s7Tzs7SzMjHysnDyM7b2d3+Z1FLR0JCPz5AREtMSlFRUVhNXmFXcWp183La0dTR18zIzsfBw8vl6l5SUU9JSE9Xa/Hp3eXu5dzW1tjec1lZXGRkXvj8auXazsvP3F1MTlFUU09VT1Vo89ne9Htf/drYztDY33NvZv7k6e5weujdzs/X71lTUFNTTk9SU15n/dvSz9fTzc7T1tbf/n3vcGB87HVy7tfX53hqTkhLTkpLUFRWTVFoe/P86HPs2N/Y2+bi9ODb5NfX7Ojq2tXb2flcU1FhWE9aU01NVGN33tPW29XN0s/O09bu5dzs1dDb3/Pn4eXzX1RTTUdHRkxMSU1PWWPu1tnn29vXy8nGyM/LzNHPy8XIzMvKy8zX2eBpV0tGQD9CQkNJV1tncF1bXWhsavLwY1lSVF5TbPXv19TPz93d3f1oaGFgXGxuXmV2+ujxbmVbV2d58+bx6/5rbHTv3drVzcW/xsjJ1dDU19Hc3dns6djSztDa3HRr/3PvZ1hbTUxYU1lfWF5cX+PmbV9RTEpJTUtNWV5lX2Hz9+bs8+jc3dXNzcvN1Nfd1cvJzNDUy8zO1Oh6VklHQENISE5LTVhbae/l2tzUzcrFw8THy83NzszJzNPOzdHU+m1YSUVCPj09P0JCSU1JTlFabvzw7Pzt6efb2trX5d/o6+Dd2tfb7mhXX2VST0xPXGra2OPf/eno8MzLzcTIzMzSzM/g3N7o62no2+zT42N9Z+/pWF1TTldTZGxZXFFKVllu3/Py+3ruc/Pa5d/a5+Tl2czO1e5fYFNNUk5QWVhcZV9vXllZWmZqeuHm3N3t5+TUztDNzdLR183Jztn5WVZWV1ldWlhSVlJOWVZQT0xOUlZfal9ZWFVeXmVmYHdyde/e0c7T5f9kYV5kbmZr/Hvr2tHJx8jGx8XGyMvY8fRlXGJcVldMTE5PUVJlZFdTWVZWUkxUUE9rZ/Tm39jZ2M7Nzc3Lys7c29ni72tuXVRdX1xcXF9lUFZaU11dVU1HTE9OWV/2e2b83djWz8zM2NvU2+Td29t7eeb75d/f415hcFdQWVxNQD5GSkxOWmhUWPfs4NnRzc/ZzMjKxsnK0eDX3N/W2Nj6Xe327e5faF1PWFZOT1BKRkdaYlBQWmpXU2V3XmbueF9dceJxbOrofGL10t7p7fZnYGft7u7Zz9jY19XV2c/U39nU0dDc3c7Y3dvZ3nFifGFic/f9XVNYU0tPSUhGTWlhWmBYXVhe4dfX19vZ0NLNz9nY3dzP6ObgdfFUTE1SV0tDQD5ARkdKTU1WV1h96+Xv4t3dz8rIy8zNzdLfycC/wM7seFloXVRaW2RfWmRsZ1xZbmJc5+Ts7vdna19l7eDZ5tzU3ufuX1JbTlVTU2di+tfX3d3UzdTY1+HwY2JuXGBsX1hRSUtFR1RTTk1BRUZCSU5QXW3b09rPys3Ly8C8vLm4vcHHysvOxMDK0drMydXi+E5HRkVCPDtCQD9BP0dLTVZTTVBNU1ln3+L5anLaz9bP0crEwMHGzuPrcmFfZ+zc2OBiWlhaZ3Z6c3VvXFlsbXJ6++vd1M7S09HR13VoaWT1+V9aWl976tnX19nr5t7m3N3g3+p98G9eXF5aTEpQXWtdUEtFPkRLT1NXZ/n208/Oyce/wcS/u7y+wcTJz87Mz87c73VdZHpbVFBIQT9BQEBGSk9PTVBmbX3y6fJ97+Lk9fHpbG5n5tji2tHV19HR2dre29rc6dnQ0NfP09rc1tvk4ubvbWJfXmNpW1RVWlZaWW/n5dtvX2RUXl9UWFNbenfi6m7x8nPr8OHa49/n+eTq5drZz91t/+ze1e9iVEpIR0ZJRUZFQUdNVl9g+fRv4dnUycvJwsbEw8XAwsHCysrHzNB8WFBCQT08PTw8QT8+QkNKT1BVam/w2dDJy8bK1M7MycPJysjKxMbRz9319GRbWE9aX11ZU1heX2pt9el4W11WV1dKSERCRkNKUFvu9lVVVmB1X3j2aOfTzMHEwcDHzMvGwcbIz93f+GT4YF9bS0lGSVpPRUNAP0RGUlBQX1Za+/HOzNHS293U1crIzcLHzczNxMva2/d84Nvm+VZOSUNEQkdOSUpHR0lIS1BJTFRSW1dm3+7s9Hbc0M7Kys3GxsrO0c/W6+1cTVRabPNh9G9g4d3Y1/zd/l187t/XdOjgc+nczsXMydLn+vBt7lpVXmRxdHzZ9fPi6N7V0sXL187p83pZX11OTkhFTUtQS0FCPT9HQ0lHQUlHSFlhfflq5NjKv728u7+8vsLCxcTG19XMycfJ0M96aW1saFRTYFJNSUhOTklKR0pJSk5XXWxnamBu7OXY2+rk3dLQ0s3Oy9Dc7uvl2d7r6+7vfWRdW15cXF9paXFeVlBTV2JbXWf75eXsb2pxcGVuY2lxdvLo4NPVzc7Oy83R0dfS09fa7G/9ZGRXVVdSTlpSUE9HS0hDS0lWcHbf3+nY1tHIwL2+wL29vr/IxMzg09Hh8V5wXFlYWVhPT09MQUJEQENHS0xJS01KS01fYFddaHZrZ3trWnve2tjOwr7FysnHxcS9w8zOysXFysjM2urj2uhnZ1VKR0RMTEhNTlBUTlBTWuTb9vlu6O5s5tzi2NjNztrSzd30at/S2dfP1+heYW5bbODwW0pWaFZTU1ZMRkhQSENKUE5MU3D14NTNyMnHv8PBvb2/yMzNztbX097h7NxuXlZVTD88PT8/Q0xJREVMVlx90czO0tLMzc3Iyc3MzM/c9t7b5n5jZH1pcXtZUltjZGV65WxgUFNmaunV53BlV1dVUlROTUZETk9hdGFXVmFu8ejW1M7P0MvNy8jMzMvOzM/QzdzgeVxfWV1wZ1VOTFBSTlpbU0g/Q0ZHV2NlXFBdbXbu6+jpcf/o5NvOztHWy8TEyMfFxcrO0dzb3ONtWFJSTUlHRUQ/PT8/REtQTkpMUltfbOjffXB23tDJwMfNzs7M0d3c5XRjW2NnZvtgWWVn6+V65+5nWU9XbHPvfWl0aPTd7N3i9PJlWGJ62trn2NrZz8/Lys3Pz9PTzs7bfftmWVlUTUhBQD87Ozw+PTw/QEJMV2BaWmx7d/HXyMnIv8HEw8G/xs7Lztvi3c7W69rb6uPc1eBoZ2xfV170fldYX1FQVWVaVFVXUUxLV1taWWReZv7Y1N7p3ODt29PV1M7J0tvZz9bscXtwW1p7d11ZXl5VU2RiWlteeWxbc2pgXmR2amnh2eRrXX3v+eTe5eLc1NLT1dXo/XH08G184Oju5GZaVVVZT0tISE1KTF9eXnTf4NzPxcTNzsvJy8vEw87XzcrLzsrP9VdYXlVNTlZOR0xSTk5NVlRKSVFOTE9VVVBPWFlbYnz2bl9rd2Fv7OTu387Ny8jDw8nFwcXQ2NLX6/re3+fi3txoU1tdTkxSWE5ITllcWl/udvLYy8zX3d7j7OrZzc3Vztjh5ujd4PZ8bGJj8d3V6HJcWFZYXVpcUUZAQUdJVF1mV0xQV2Nz8dz/Xlxr4NnW0M3PzsrFxcPEydX279vU3Nza+1xZWWFv8X58ZFldX2xlZPTn7eDRysnL2/VdXGhqfW5hXV9keeXX1tzg3+Li2d/g/mB129jT1N/vW1ZcWkxJQT84ODs9Rk1UXl5k59vQ0NXOz8vEwr26vb3ByMPAvr7GydlvcFJSX1tbUkpYU1FVTVJOR05WXGhfZGVZa3r23eHadFNcc3H1/339W/nc3dbRycbW0s7NytXa3XpiaH33dmVpVkVESUlJSU9PU01MT1JZYXDc7uXT0s3MzMzN0c/MzM7seuhcUk9UXlRSWml4c+Da72Nt72hVWnT2Ym7u2NPYzszX3trM2fnr3e1p7eTk8Hfk2tbY2dn+VlxlbmdicXRiWVhWVlBMTkxKSENMSEdMUF1fW+vpff7b1uBqZXBdYGh3627oysjLzcbG2NzY3Nvq28/T2s/SzM3WzNH57f94XktIRkFCQURIS05XUU5MUFht49jTztTb1dPT2dfN1uDX2NvU1NjZ9vtiXFtJTlJDPj9GTE1VXVZVW2n/7evb2tx+Zff++d/Z0M7R0uHx4Nzb3uLf2eLh2drZ5ex8fP1leO5fUU1TWVJed2x0b2B+8XjZ3uxqV2ZoWmzl1c7T3dvd4d7a325fVlRfXXD9XGhmXP1t8tfZfGZOSUpETlVRVkpJVk5PavbqamRw+nrj0dDb4tnUzs/Ox8zg3t3PysnExtLg+WRfVlp7YVFLR0lNVGpu9vVubHbu6ePwY1hXXe7Z4drS9v5tetbY0crXd2/v2dnc087haVpcXFVjZFNIQUVISUxSV05ESEtUaXRlXlBNW2fay8rDxc/QztDRys3Q3G5dX3n+49jU42hfb3ft5PF5W3Ld7dXV1c5zWu3g2srM2d5dcfZr3dLP4WlUT01NXnRpYltYW2Lt0dTecU9OTktgXUlFPz1ESFPk6nZ5X1b+beDR3t376uXa08jHycvMz87O0MzX/V5fX+/e0cnZaWlgdODVzNLjeHpxferf0Nx6XVBNTVBUT1NKSk1LUmju5fpeb3Fx2tLU1H3x4N3OycLBytnkbF156nBkUUhMS0pQa3zseVpfTlnp7PBqW2lib9vP09h1WVZPatja3u1h9uDdz8jGyMvpb2Bn3N/f3fH25e3u1tDj71VPTVRwb2dgUE1WWvLOysvR7/7l2sXIz9Td/WlnX+DcfvVXSkxKUk1LS0VCP0NIU2FZVklETl375OXV3+3+4t3PxcjO3ehu8d3Z2tDV0NHPzMfEx8/c7XBu3+DpblpPTFn64t73aVdJRU1hcGJfXVt0/ebq39nO1+Dq4NLc5eHqan7s8Xnr6+pjS0RHVl5eZWJXUlRRWOrm4WxVU1FobVlidnly9Ojx0s/T3WFeY+Le4tTU6G162tPGwsfXa1VSb/7q6mRZXmXt4dfO3G9w/Xbb1OLc51Ze6+3u1tbb7E9LUFhmbmhmXVVfdnHu3vVhVlFPWnloXV5abNrl9ejsYU9JR01WYGxfb2lZYvLv2srK0+pr/uTZ0tTO09jNyc7KyM7mbmBf8vR8aGpmXmj3593O2O5eVUpKVW34fOl0YmFp7NDlcGFXTk9nbnhrb3ffzcPAwMvkYFlVWOvqe2BeUExPVFz1eVZOSkdBTVleUlZdX3N53tDT5m/94ffZztDn8H186u3Py9h+ZFdSUmTm6eDNy8zMzMTAxs/d+/9oZ+PsZHp1bejm2M/tU0lAQ0dHVWNdYnFjeejSyM3d911YVkxRWE5NVE9cXGTnZEdDQkBHTmn7XVtsY/XXzcG+zt7p9nh53tbX18nHysnIxcfb8nt0fW/7fPxoeOfTzcW/w9pbUEtCP0VHSEVJT1tj89jWb1ljaFxWfezuffHczsvDvr/M+llYVU9mYVZOS0xVU1nx7mxbTk1WUFxsbGry28zMz8fI1P5dWVZQWGBZW2BbeNzVw7/J2nRdYlxp49ze2tfPysvCwszfcGteUU1OUlVRWXzZ3dfM2fNuWVFUWV597HRpbuXf0cXM5mxVT0pHSUtMSU1b8fTdzc9yUk9STUtMU11QWu/g0ci/vs36alhQUEpTaFtr18zFvbq7x8nIytfxaVhbVVnx19XLyczdZVNSSENERlFUS1vu69PMyMzWe+1pX11n42BdZtzV0M3P4v5dV1NNTExXWF1s3t3azcvS2v1bTURJS0tSYWHp7uja0NTtXVBbVUxRXmj07NnKwr+9vcDJ5XxsUVh389/5aHrZzcXJ2dpsW1FKT1ppef7q3c3KxsjW5XZfTUNASEVKTkhNbubY0NHL0+1eSEdXSVlwXVvj0tbR1dXm/1ZMSEdIS09OVHHc39XVz9HO6vPy4Nfs1NbTzsvOy8jJzMjbWVRUXl5lYvXn2dfi39jo6m9NTkdFS19sbnHf4PrW0tvYcUhHRUJHUVxq7tvRz8jFxsXF12plUlhaT1Jdd/P58uZrX1tNP0FCTFRSU1ZqeOnf1dLR1OtSX31y7Ovq3NPWysvPzc3aaFBbfGZxZFvjz9PLxcLHy83ecWVdVlJYVm7d7Pzg2vbt6X1mWU1HQEFESVVZat7Y49nS2fVcXFpbVVldVlJSXXFrfN52VE1NTV9iZ3paaG/93dvVydPhbF525uJz5uTi3M/HwL6/yNh9X11k9l189nNve+fe1NXgXFJOSkpEQEVJRU5b6tvW0Nzb7XZjbGptbH55c+3b19rZ6t35ZVdTWFZUXltfdWBjaev5fWJYWVRcX2hmXnLu5+rdycrP4llTTkdIT2d749jR08q/w8XH29/ha2hdW1pibu3g0sPJzcrUfWdZUF5eTU9OVmBk5ubu4X5cbGlWW1lSWVdk53fs8mz0Xlrr2mxeXVBXYW3r6NvlfeLyWlVaTlRjTlFf+tXS2d703tLb39DZ1tT/ZHvdzMvLxcnL0N7o1drt7OT0X1ddZnNsZXdeVVf+bl5aX2zr6fXqcGRZV0tJS15gXWluZH557c/SzNXR3Xx7dGJZa/d4aOjd0M7VbnBSRkdJU09PUUlJT1Jm3M/X1tjv6NrV2M/N087Q2M/DwM7jdVBXa2z64uRtZV1r89PM3+dyTlB09ODZ2ef42t3r3NDZ+G1PQEZHRU1MSElVWFhj0dL68Wtt5N7s0tv1YWBiXHjb1/x7ZV5ZVExTXFlUW15ZY3Pl7/Dp29XMzcfAxcvM0tbNyMTM3ufk7el+7dnpWlxbVVxg7+t8W294bGhn6fJbW2pkcOzk5/pXWV762dvR3l5WU0lPYnXx8WFffWvl4NXfbv7+ZV/w7mRWSkpaYnLo1M/hbmBjXuzY2+JdVmTs5NLMyszNz9Xb0svQ0t3e493r2s3U2+Xe5fLrz9vxaF9ra2boztnd/mJYUlFmaFxcVVlZWF9vbPh9cVtaYm95bWFQUFRcbN7b3eJrWVxw3tbg7mNja2/q0s7V19/ueXro4+nk69vU1dLPz9bX3/vx5d3j8fB4c2Du08vLz83aXlpZW1dQVUxLT1Recu593t58d2pvc2ntdWNjenV64drU3/xdWmbr8n1zW1hhYGnu9NrmbF5ZXWhYV29mbu3m4OVu5fxcWVdVUlpw/v1wZu7i09PUzt3q3ubrfWf4X1H84PXe6OHc8/ztfnxvXlleXGHqb3F96dre6ex7dN/p8O3q6Oh6empldl5XWF5XUlFWW2L73+nn7erd+m9sZ2BRUVVPWl1qbHz+/Nt1WVlRT0xLUFJdZeTc19bbyc3MyMzP2eXh7W9vfvrzfPDT1O9kT0tJRU1VTlFdXGn+fd3X2dnR0s7b2trj2tLTy8zVztnk8GhLSkdITEhJUFJUYGnk2+dsal5ZT0xST1BnZW7t+Nvh3erb0tDvV1pSTlNaXXt+3tzU3ej2/35v5Nzf3+Bw8/f6ffHe3+nt6Pvp+2tta/7b4OLr7vd58f/6bnV86PlpbOrq8djP1epjYV9JS05XYXZdXmdbXFFUT1JaXFdTUE9OT1pdat/P0NXX1ev29eTWzczW7d/S1Njm5O3yX1xz+mRcfG554dTN0/RuZGVjW1xiePzkfXf+bOTZ0czO2m9aSUlPS0hJTltfaObldXVqXn3r2thpW2JgZ2fy5ODqfHhaVVVeWVxtaWJVUF7p3d7g3OPZ1eXb2vPn4N7QysfJzt9wW15cXmn+4PhkZltcc/nv5OJsXlpTU1JQVl5fbXz35u59dm1v6+rybWZwaWB529rT2d/jaV1hZWn53tXS3dzd3N/r7/pqXFxRTEpPVlhaZeLQy8jK1N9mV15pW2fp7XRt8tnTzsnGyt17b/tpXl1jWldr8nVdW1JNUGZ28mtZXlhVVVjx1NbW0t799t7W38/HxsjO1dDN0N3u9nRiVllcV1RSTElg7PHwaFpVUVRPV1lfcuHe6N/OzdDHw8LCx83Y4+F9/d3m33RgV1pdWk9KT1ZYeuZ+9nLk6evW1NXc9GNlbX3s2s/LzM3PzsvIyvFvYVNQS0dGRktMVHTb2NDN3eLd1dru5dzi7evp3tfV09HX1tfa8ldWUEtFREtXVVJUV1VPXOrl3dLT1d3569rT0NbQ1d7a3+R13tLO0dDQ3+Z+dm1gbVxbYlJMTlBSWGne3NvOzs7O3ezx7N7f6Ovx6NfqbPro3ODe6mlo5uJnXVZea3r6YFxYWFdSTk9afGtZYWRqednJx8jO2fDq4ujp5tjU0c7VzcrMz9nf4OPt8V9YXV9kbuvc0c3Te33vZFhXXVdXVFNQUWRv+97d2dTc+O7c2+hkcOt67OluWF5kYXBmbt/d519XT1FTWmVeYlxXVU5Tb+DSzs7Jy9bOzs3Kzdvg73NoXl9PU15ya2X79/ZuYF9q7dPJys/Y6e584NTN0d/5b2ZdYlpVWVpgbWVp/fVYS0lNT1locGl8dVJYbu/k3NHZ9nZlXnDt4Obz+vrv3utleW1qevlwWFFYV1BacubczsvR2d5nXmlz39vb6mBaYl1s69/b3NTg5dHP3u54eWhiblxQTUxFQkRKTFZaWVtVTUxRXX7v3u1pbW/v3dbPy83Hzt/jevxnU1ZWU1ZYUk9MS05baPjp4HhfYVpg8NPMz8/P2ubp2M3N5f1kXV1QTkpITExPWFxieWBfbmfg1tPO1dfhYlZYUVpeX19bbmdYV1ld/nd3+frh5O3d8Hbi5trd5+hsX2Rbber23eFqa2pXVk1b5vbl7GVXUlZXV2dnbPt4+/5lZWh36e3k2N35ZllVTldeWWNmW1BPYmRfZ+xqa+z0dGDv19fJyc3LztPX3edyZ3BiWWZ4YVtWVFdr3N/11t7zbVRPT11dW2z1e312eerj2tTe2s7T3u5wbW37/WXq7GRlWU5NVm3wZVxWSEdFREtOT05WeXd33Nzgz8i/wcG9wcnK2N/e5urm1+Br/fZYXmdlZ2VlZ1ROUU1WXv3k2NHV1tTW2tDQztDX2OxpY15fa2tjbG9iXVhTTExUX19h9XVcXFhPUVVRV2RcUlVcW23VzMvJxcPHy9DU2N3e4ePq6uj4e3v65eLd1thzVllaYvx6897d19LS0tLTzs/P0s7O3P76/nPtcvPW33plUktLTFNTUlpbWFVSU1ZVWFxoannl4+Dj28zIysPAwsbQ4e98bl5aWVBaYl9hYnTa29vP0tPZ8HhqYvvq29DT2dzi7d7U0drU09TU3+3z9Hp6fnZt6vFrVktQW1lo7W56bFpaXVRWXlpQTlRVW1983c3KxcPCwsnO3e9pcHFsamheWVFPWWJkaWRXYGJcXFtZZ3fo2NDHwsPJysjIzszK0Nnj+vNwY3DxXvhSXHVKWl5eZO/49+Te/mNZTk1TU1leWGFYYO7l0cbDw8jMzNXeb1RWUk5SWGFkXWf/99zb3OBs93ho+WRj83b++fv16OTe9+vP1M/O0dDpbWdf+u/1/2RXUkxNU05i/GdtY2h0XlpSTFNUU1363dnf2M7KxMbGxsnS5m9eV1VXVVFSU1RZYHh47+v49vZ6XlljZGR54dzZ1NHP2t3b3tTP1tbd6XJhWlRTU1lSUVFXVlJb//T3dW7veWJVT05QT1RTU1dYb/Tr39HIwsG9v8bU8PDk6+77XGhgWFdYXXZ6+/tj725fWFBbZF/u39nO09PN09HLz83Y2tTuXVBUXFtbW1JRTklLUU1Sa/R+X2pqV01ISlFPVVVSZWFed//jz8rIyszI0fJeV1hleXdma35meePl4M7N1+Hg6G1YVF5mfH7/89/o7+fj/OXJxMnIyNXqbHH+49vk/f9wVVBSVFFeZVlQVlJIREA/PkdKTE9YXl9s+N/TxcHCxMfW3OvyeX3nbV5eb19kX19c/d7i5+38X15PTVzm2tHU19fb2dXU0MfMz8/N3fpqUk9RWVFRUVNRUlVZavLzfGllXE9PTEtKTUtNT1RfVlNeYn3Wz83LzdXe6vjs3d3j3uj1fG/26vP1ZVxdW1pPTEdHSUxXY+bt4d3Y2NLJw8DExcvNz9vh6O/ufW1qXmNdUExLU1pWU1BSV0tAP0BGTk9kZFz+9eXUysXFxsLByNLg3vBjZXJhXVthW1JQW2ZqbWRgX2RTUFRSVWTz5ev74Oz24dTU2NfZ1tLW5PXw6+nZ1t5rbn5dWVxjWVZjZFxUT0hAPj9FTlhWUGJxXGfZysrEwsXIzMzR3u7g19Xb8W7o9HltbF1XX1pTS05MSElQZeLf4N3cz9HMycrMyMbKztHO2n5nX1thXFpPTktLTlRQS1haYF1bVlJRT1NffnVwe/rv2c7N0cnFyMfIytHZ19Pa1NTf3un16uLwZVd272r9+V9bVFdgad7i+Orr3tzd1NXVzM3RztDWz9zgeGd1W09PUE5UT0xNTE9KSkxGQENKTU5TYWBr+9fLyMPAwr+/xMHEy83O1dPg7XxcY2NaWFRVWVdbW2p5cGd67+Ti8N7Y2dDMzc3Oy8nMzMrIys3O1d/de1paTkxQUFdTUFdYXV9YUE9NSUZKTklQUUlSZfz6/NnL0c3GxsTEwsLJxcjU1dzw3+PucFRZUUhNTk1PT05OWPVhV/L34tHMxMTAu76+u77BwszS3t3nTUdHQkNIR0ZDRUpHTl1YVlhTVE5SUU5aXWTv2tXT1c3Mz87S0c3N1dbX2fBgXlpTXGhmamhrY2NydGBjXl5haPlsam/27dzY1c/OzMfCwL6+v8LFytThbVZTVlRZUUpHRkRAP0RJR0ZFR0dMTUpOX33oz8XBvry+wsHAwsnKzNTc3W5WT1FQS0hGREVLT1RefWts9/hza+z7++ra0dDLy87OzM7NzMnGx8rXb2ZUR0ZGSE1WVlheX11XVldRT0xNS0dMTEhKVmFq/vrfz8zKxL++vr6/wcXGzeBvde9rXU1GRURAQEBJS0tPTk9ZWVJWYOnUy8TCvrm6u7u9vcHDxc7cfk9FPz4/Pj8/Oz5BQEpUW2BfYlxdZmdqamzp2tXLzdTP3OTh29POysrR0ttuXFVaZmv37GVv8nx0dXl97P1ral5WUktHS1JZXWVj4tfUzMa/vL2/w8TK1edmXF5bUEpFPjw5Njc4Ojs8Oz5CQkA/Sljn0szAvL26vL++vr6/vcDEyutcWU5GRUA8Pz4+RERKVmVx7/jr3tvc4tDNzMfFw8PJytDPy8vJy9j4bVRFQD0+Q0hLS1RTUVhWU1FTV19mZmNdT0hHR0pQTlBaXnT86t/Ox8PBwL+9vcHFycvW3PliVk1FQD9CSUpMS01MTkZIUGzj18nFvry8vL6+vb2+v8TMz+taS0ZFPz49PDo7Ozs7PD5BRklNX/bu5d7PzczIy8zLztPU29vSzc/haF5WTkxLUFJUWlNYYGZjWlx42tnZ2dvX5HBdXGFf+uTk19TQzsfFw8LHxsXBwsjP3t/xXFBKREA+Ozo5Oj1AQ0RHSEhLU3vh1M3Jw8PCxsjJy8fExMXJ0Nbcb1xPS0xKR0ZGQEFERktTX1393dfMxMXJyMPDxMbHxsfKysrOy9Df62pYTkxKSkxUT01VXFRQSUZIS1ZdbWllXFhUU1Zba21+3uXr4tzPy8jKxsC/wL/AxtPp6l5RS0lGP0BDRUdOUlNfXlZj/vHczcjFwb69vr29vr6/vsLJ0NxsXVJKQ0VDPT49Ozc2OTs9Q0lWdt/Nxr6/v8DAwMLDw8vRz9fl9fldWFhYWFlZXl9p/3Vwdv509Nzb5NbNztLY3vllXltk8vLj3Nzj4M/M0NjWz9DNycrO3eJwWFlQSkdDPj9APz1AREJBQ0xUXXbf29rSysrJyMjEwMDAwcPFy8zV6V1TVk1JRkdFPz9BQUZITWTr1cjBwsK/vr/Cwr+9wMHExcjOz9nhalVSUVBRVlNKTVJOTUlISEdJTk9aWFhoa2VfYmVu7Ovt5e/p39/29/N85tbUzMvR2tjS5/fo9vbq+m5ka/34eGdecfp67N7U09zPy8fEwsC+vbq6u77DxszfaFxPSUNAPDs5Nzg3Njg7PUJJVnvo29HLyMvLysrKzM3R1dne6fBaT05PU1BdXFdaXXNsWlpo8+3i1M/MzMnL1PDo4+3u39Xa3dnSzM3PycfIzMvIys/V0NTzXlxbWE1NSkZAPT89Ozo9QkRFTl5ude3Wzc7PysXGv7u9wszKzONsVlhYSURCQkM+QkhJSEpZYXDbzMrNy8bDx8jHw8HGycbDxsnL1OtwZ29dW1xXUUpNTkxKR0tQTEtOWVdPVmNdWldi7W9oYV9dWWV3a2dnd/9hZvfd3ejb3t3h++jl835yalldaV5TTU9WVU9VV2ZdX/X0493QxMC+u7q7vr68wMjN1uFxTklFQD09Pjw5OTo8QEBHTU5RbNnS0tLOzM3OzsvM0M3S9GBXVllVUFFNSEVMVVBSXWp+e+rUztDQzM7W29LNyc7c5HRbWvzk7vTn3+Hn3NDQ1tja4vd2anBvWldSTkdITEM+Pj09P0BHUFNPTlFWX/HYycXGxMTLzsrK2+3y/3ZkWFtYT0pJTEtOUFhkWlxwcn7j08zP0NDQz9PRysvOzMrP2dHU2tjc3+RnWFtaU0tNT09OTlVdVEpHSUZES05YYGNpYl5eaO7levT06XRx39zs/npsYGPw8+Pj6On9cnbp5WdYWllWWvDW0+Hn6u/v187IwsO+u72+v77F1dzm729nbXhdSUE9Pj9EQ0hJRENGSUpWZ19cZW9989vU0tTa4/lmZGFaWExMTEtMUGBdUU9XZnjj0MfCytLY4uPd3NHP1Nna2Nvf4XpqbfXj3dTOy8bJzs3UzcfIys7Q0+Dv7+5vVEQ+PTk4Ojw/Q0JFR0pWZuLTzsfEwsHAwMfV9lpVUFRhYl9ZTUdFRkxSWlpcXlpn5M7Kz87Lx8TFvry7vsPEy9HT0tLT6/xmXFxebGdaU0tMVl1559jc5mdZXF5YV1xZVlVYWPzyamJWUVdYZ/fqdFtbV1Vabt7S2dfR09XTzMzX9VxWV1RRWGhhX1pYX21959PQ09DJxb+9vL7Dy83Pz87Mzdne+GBZXmJjXE9KS0dESEpGREhJT1hp383NzczOzc3P0tPX9l9cT05RUExOTktNWHrf19bU2OHb1NDP0s/U2dvj1cvO3dvh7fPs49HK0dne5ObZ0M7M0d7Z3eja1+poXExISEdFSEVCQD4/RE5cbu/r49HSz8fJ3eHsaGRcXnfwYFpcX1xcbffl+Vtifnnl3eJ+7Ofh2tXUyMTLzs/MysnLy8vP29nf3dHU5GZqbHJ4/eDO0Nzn5W9dYFlNSERCSERCSU1LSU1XZvv25dTa4ezweuXW1NjZ5fbh7ejd+2VeWFlYW2F3cWFodG1q5NXQ0dDNycS/vLq8w8jLztTZ19DY/2ZqYVxjbWtdU05ST09PS0VAQENITFJcb21lcXp289rV6XNhXlxSWmJWSUZLUlhcY/De5+bUz9DPysvS2Ofd3/Hs7mZYWV9y5d7Z0dDa39bRzsrDw8bFxsPFyMrO4XFoa19XUkxNST07Pj8+QERFRUtU7N/ez8vP19jU3O79+O5jT05TTkxLTEtLS1NmYmVsa15s8Oncz8vGx8zNysfJxsTGy87Py9Dg4uH9XV5tc3RtcOn6b2zl3ujp+2lTS0tNSURCRD88PkFHT1hgbmhldPdoeHhrX11k5+J0X2ZfTUxRWVdZWWFlV1ZobGBpbm9pau7QysvMx8bNzsrIysrJyMzV3tjg8P5xYVtl++r4Zl1dTUdIUVdPVWJiV09QWVdba3ljYGb0/V9YWVxRSUxWUlJSW19YY3v07uvf321w9Nzb6OTsalxZYnFu5tDLzszIw8fMycjL0tDKx8vT2t73X1ptal9dWlZLR0hISUhHSkZBRk1cZW3k3ODf2tHX3NzibFtdY1lMSEhDPT1DSkxPV1taWVzt3dbLyMXIysbGyMrLysvX29zh3/F6bGl5e+jd3dzZ3N7Xz8vL0NXV62VkZ2BbV1FJRD8+Q0JDSlFbXnnd3OXu6uP0e+zn7/xqX1dTT01QUFBXWFBQU1ZVXnPt4uni3NrWzcbAvr7AwcDCwL/EyMrJy9Tc7m5eTkpOT1ZbXFtVUk1QVFtufGdgXVxhW1tcXV5aW1tVUVRRSUZJTU5OTk9PTE5Ya3rt4ebocV946d3Y0s3Q0tjg3+Hn4ODf1czGyM3Q1NDP1M3LysrLz9PT0tTZ2NrZ6HBtZF1XU1BOTUlHR0VGTF1mbunh5eLg5+x5bGRmX11XTUhEPz9AQ0dLUFVbV1hh8d3SzszJxMLEw8PFx8rOz9DSzsvO19na19fW0tbk9Pzq29jSz9ne7/fwcGxnYF9aUlJQTU5RTkpMVGBx8/FxXVlWWF1iaXZzW1ZWVVNRTk9MSUlKTlZWWV5eZ/va1c/KxsLBv728vr6/wsbKzM3Q1NXW2+x+e3l9/+vX3+Tc2NDO19/k39ztbmhib/ZxZllWW19hYF1bWVZSTk5SV1RNSkpKTVFbYl5UUFRcW1loevfs5t3Y0M7R193k28/JxcPBwsPGx8bBvb7AxsrJyMjN1eDofWJfa/b5ZVRTUk9NT1NaWlleanrk2uD0Z11UTUpKSktNTExIRkZEQ0JDRUhMUFhgZ2lyduXbz8jBv7++vr6/wMDAwsPDw8fMzMzMztXc3uDY0c/Ly8rNzsjIyc3V4nBbWlhST0lFQDw8PD5CREdKS0hDR0pQUVNUVllaY2BkXVFOSUlOWWh3/+Pf4NLNyMbHx8zMx8G+vby9wMTHyMfHys7Q09fZ1trzcGdfXlxeY2RgV01LR0E/QklISkxNTU1PT1BPTk5MTU1MTE1RVFlga3jt7Pjq4t7k3dDPz8/R09HP0NHOy8vKzNDW1tDO0M7O0dzo6etzYFZSVlZZWlxXV1BMTUxPV1tcWVVPTVFZWlRSU1FVUldkYGBpa2tqZXD+dnd573b+3tzf8G5odfHk19HT0c7U0NLV0NDP0dXW2dHR2eDrbWhyamleVEtLTE5RWF9iX1xeaGFdb/Lm8mpra2BaXGVhW2VmZ29wePXx8Oni3tra49/f4NzZ2djZ5PX4/WZWUk9OUlNPUlJOUlllbmpq8/Nx8uHq/Wz99Xnx8OHj9mdnX11l9+fk3+Xa393Rz9DPztHb5uDg4uLd4exub+rd43hscnBUUVFNSkVFRkVLUFtnWlNbZV1cbOv3eHF4cF5gXVtiXFtbWGFn+uvu7t3X183JyMvJyMfLzcrLzM7U1N3j29nP1+Dh7mxYXGheVllWVExHR0ZFQEJCQERISk5MSUtKSkxVXF1eXF1VUFVdYWlsa2ho7+HXz9HQzMjKycTGx8fJy8/Sz9LW2ur+Znno187P1tjY2NnW1OLzZ2JaT01JRUE/Pj09P0BFQ0BCREJDRklOTk1QWVpeam9+8ujc3dfMyMG/vr7AwsDAwsTIy8vMz83MztTT0tfa1c7Nz9jd6nljZmZfXVNRTklJSktMR0lJRENESUtJSElLR0RHS0xJRklJR01ZaG1m9Oju59LHxcXDwMDDxMHAxMnJycvMzM3M0dnZ4fD+7eLq6e39/mdt6PRmW11eXnLu6eJwXmRhWlZfXVNOS01PTE9cVEpOW1RW9uPb1uDc2dna2NPV1tjW0NLUz87U2dra4NbNz87P2d3a4ezo6XRoZGlrYmhnX1RSUVFWWl9eX1xTVVJQVmBycmv46+HY083Q1dTS0dLNysvQ2ODf+mRsc2VaXHtuX2736Hhpb2tvbd/V3Ox4e/1lY29valtgdmBf/vl1XVZYU1BacHFmXlxtcF5p8OXf3tjPzsnCvr7Bw8PGxsPCxcvR1tfg8OPe5Xh75/Fz+ezyXlFPS0dHSktKSERGR0JCR0dISE1aWV165eH1de7xdu3c2djk/enl7eTd3dvYzMrMycfIycrMzdLQzcrLzs7NzM7X2dzx/Xvq8WZweXVpXVtUS0tOUE1MTk9OSUhKSkdHSk9LTFNaXVlXWFZPWn3Y09bQztDTzMjGycbBwsbEvr7Dx8XCyM7My8nNz9DZ5+ne3efx7vZrW11eX1NOTUxGQ0RHSERERUdDREVGQ0JESEpJTlVUVlpoeWr83dHRzsfGzMzKycbHyMbGyczLyc7S0M7Lzc7Oz9fZ1N7v6Ox3Zl9fWltZXGVhXV5jdW1cXV1YUlJQR0VKSElLS0tLTExTXVhfdffq8fnh3N/a0M3Y2tLW1tPS0M/P0czLzMvMy8rMz9DY4/D+XU5VVVJQT05NTUxNWl1VVlFQUVNUV1VRVWRZVGZtdv7r49ra6NzQ2d/d3t7j4ejl7Wlu+GVz6fPt6+7m3+nu3uD2cmttcmpqYFxbWFdYWWf2e3vv6urgemdwaltaXVhcXlpZWFNVW1dSWvXv59nVzczNz8zMzcvMzs7N09nk4+Lb5OPW2uvp5+X8b2ddWk5LTExHR0ZERkNBRUhJSk5QVVpbX1dVVFpdUk5RTU5ZV1lmcPvd09PLw8PDwr+/wsLExcfNzs/Z29bX3Obr3t7h6+Dm9ut9ZlNLSUhHRkFDQj9CRUlMT01PU1hcbW1gXmZxZFdeWVBMSk9RV1lm997c2M7Oz8vGx8jFwsDFx8bHyc/T0tXQzs/P0NbS09jd3Nl9Y2NZUUtJR0NBQEBBQUREREVHRkdHQj9ER0FGSE1NTFFdamNia+7c2tPJyMvKxsbLzMTEyMjHx83Pzc/V1tfW29/a3Nng6PlrZVxfYV5gXVhbW1/06fHsfmdeZG5scGFaVE5IQ0NFRUVFSEhHTVNWWl5hbXzf1c/Nz8zO0M3MycfJys/Ozs/KyMrOz8/U2tfZ3+x9bl9fWVNWV1VWV11dXmtcU05QVE1MTU5MTUtGR0dHTFVUWGv239nRzs7R087O19zY197g4uPu7fXq3N/o6Plpbnvo725fZGNZWF94bG5oYGJ589/Tz9PW2NXR1NLfaWd6aFpfaWhubl9RW2Ft4tXV19LS2NrO0dne3trj6+7y5eb+al5bXnz7dXBmY2VncvldWVNRX1xRWlxZW1heY1pcaV9lXl5lYWRkWlJOTlhfZGt57+fg0szHw8LCxMPDwMDDxMTJz9TW09rk7+57eXz+cmdcW1dOTEtRTUhKTEhDQkVIS09aZHL7evLrevrtdW9neu1oZHVtY15pbXPs59fNzczKyMXGwsDExcTBw8jJyMzU3tzd3t3a0tHW2tvc3/DvZ1lXTlJQSkxMR0FBRENGQkdMTkhCRkVERk1LSk1OV11XWmB1fuDX18/NyMfDwr6/v7++vsLGysnIy8zO0+h44+Pl5uDj73tzdWleX2VdVlNWXnBlZWxkX2xwb3Z273ReWllaV09ST0xIR0tQWFtv7Ofq2dXR0c7NzsrGxMTGycnT09fX2eDb3tnW293a3+jo3d3p4+Df3/RzeGxraXRmYl1faGNWVmVcU09OTk9OVVVST09RT1FeaHL559jU09jPzM7Ozc7Q0s3KysvMzdj3YGZtfm97bV5bTlJTW15aWltVWV394+Dl9nFud+nc4dbVzs3S1NPW2d/sd29xa/zs5+7t8efj3t3Z2N7T1djR2d/lfWdeZXP8e2dfXGBlbXJpXFdNTUxLTlRbV09LTExUXGNrdVxTT1lhaGVt/Gtzb/7m3Nzq7/v67ebh29LMz9PSz8vKxsDCxMXN0tvT2OTs++73X1ROTUtISkdHQj09PDo8PkFER09QT09NVl5oa2f39nzn69vS1Nje6enz4t/Uztrj7ODd2tTOy8jLycnIwMDBxMvQ293Y1MrLz9bqbVlZXmFZT0tJQT0+Pj48PD0+P0BBRkVBQD08PD9BREdKVFhPUFpla2vo2tXSz8jHzMzJxcLAvLq7vL69vsPFw8nQ08/Vzs3S0N5xX2FlYGZhT0xHQkFAQERFRD9BRElNS0xLS0hGS01PXGh3YlhWWF1m5tbV3dnR1s3LzMrNysvKzczFwcXIzMzO1s7LztfZzs7S0tPV3OP5aldNT1NPSkpIR0NDSEZEQ0ZISElJTkxFS0xLSU5t82deZXZydtvX5m1xdu3f1MnHysvHxsnMyMXDzdjR093c3N39Y2dw7/3v2Nr3ZGJaS0hMTk1HSVJOUlNWV05OWG5pX+XY4Xdxfevy3dPU19/Tzc/Tzs7a7vTr39jWzMnM1tva8Wpu6OFuYnNsXGBlalxceXbu7ODS1e9wZ1tOR0VHRkJDR0VCQkRCPkBESUpLXvj2/Ofa1dXOyMfHyMXBwMLBwcXL0NbX2tfPztrp8mxXTU5QTUpNT01NVVpWU1ZaXV9l7NvmZV9ZTEZCQENCQkdUV1hsc2Nj+uLY19fJwMnMxMHFxL++vr/Avry9vby/ydDb3+l+e/fycGFhV09MS1FSTUtWa1lcY1pTUl1pWk5QWlNLS0tCPDg4OTg5Oz5CTE9ZXFxl5tXa18rExsjCwsTBv7m5ubm5t7m5t7rAxs7a8l1eaFxPUFBOTUpPVlZVUlFPT1ZlWFFUXfFgVlNZWVhXUE5JRkZFRklGSUpTeXloZ3fd09LLyMfEvr++v8C+vLq5uLi5uru8wMvX4PxYUE9NTUpNVlRPUVpjYXvh621q5+dfTklKSEZFRENCQENFQkFGSEhJTldVVF7n29/n397d18zKxcHDv7/AwMDDxL+9v8XMzcjM3vxmVE9OT05RUE5QU01OU1BVYHVuW1BZXlxTUExKTl1qeOfs7ejm6d7n9/Lf19rf4dfPz9HO09bWy8fFwsLFxczNytHazsrP09na1tb2ZVpQTk5MS05WWldaUE5NTElOTEpQSkVHSkE+REdHUFhhc+re1NDTzMzPz9LV2OLZzsvJysvJycbIwr/FwsPIz9bc49rg/W5lYGdr+3NaVk9GQ0BCR0tOTVJOTE5STk5TVFNPUlpjVlZ592d87drPyMG+vsHCw8XKzNPSzszGwcPGw8PHx8nJztfa3eN6amx4aWFfW2Bgb3VmWk9NSUE+P0A/QkZHREJFQENJSEI+PkBETFdfduje2M7KxcPExcPHy8vMy87LycjHxsO/vsPAvsXL4uvu/n766nvt9XV+evprWE5KS0lCRUhFRUZKTUpJT1FKVWNtVUhLSklJVGPo2tbOy83M0NHO0tLQzczLxsbCwcDAwL/Gwby9xs/Q72hbXmry6evj4N3mb2ZnV0xFQkBBQj8+Pz49Pz89P0lPSEBAQT9AREhMTV3u39XR0NPY3tzh5dzPy8rJxMPAv8DEv7q7w8/O1+ZpX15bXF9u7unmc3P7b1hRTUxMR0hNTU5XWE5KVWrxUURLQ0E9Qk1RT1p34tra29DP0dTQ0NPVz8zPzMXAv8HDvLy9x+XpaFdQUlddV1VZY2lyc2j8fGFWV11YUE9LRkNISUpBQU1KRz87Ozs7O0FKSk5efODRztDT1tTb2t/Y0tvXzszJxcbFx8PBw8DL3eN0WlBVWFVZV19qXmBr83BaUE9MSEdITU9PW1xSSUpaWlhPSEI/QENHTFFdbH7e1MvJx8PCytXTzMvKyMTGxsbCxMW+wMLJ2d3waW1gZl5UTU9ZZ2hlZ1tNSEtKSUdDQ0NBQ0NHSEhLSkQ/PT09PD5AQD9ETlZu99fR0cnHyczJxsHDysfExMLCwMfFycjD0c/S2uF49fddW1xidWVcXGdgW1VXTkhIS01NTE5UV01QVVBOS01MSEJFTExOUFdZW2va08rCwL6/wL6/vry7vL2/wsHDwsPBxsrO0Njr3Nnf4fx38nd4ff91XlJLSkdIS0hGQD4+Pj5BQ0JGQ0ZGRUVESEpKSUtVV2fr3t7WycnIxsTFv72/wMTJyMPIycjOzszIw8LEx8fJ0NfU19jU2N3d53Bva15YTkxLTEtNUExNTVBOTkxKTFBNSEtJR0xPU1xf/N7PycG9v8C/v769vr29vMHDxMnJxsTIy83Q1NXUzMnP2Nja2dvY09bgZltYTk5TUE1HRUNBRkdMUU9NSkhEQ0FDRj89QUdKVXDw59rSzMbAv727vb/AwMTGyMjN19TLzNDOzMzV3OTt3tjUzs3V3dnZ39zrdmVQTU9MT1heXlROSE1TW2FfXFROTUxHSE5RVlZo5djIwb28vsHBv76+vr7CxcnO3tzR19ff9e/i2tPS2N3j+Xn46Onr9mlhW1JOUU5LRkA9PkJER0RERkVGSExQWFhPUlRWW2X93tva3NbLx8C+vLy+wsfM0NXV2eXs6OXe1c/N0dDb2dPV0NLV2uppXVteWVVTTlNTT09OUVBMRz9AREdMTVFQTU5QUVdZXmNt7NnOyMTAwcPGycfAvb2+v8PN1uXt4Ojs6PTe1M7JycjM2nBcW2v8+fJsVUtIRkZHQ0JFREJDSkdFQz88OTg6QUZKVFpOSUpRV19l+9nUy8W/vr6+xtPh9OXVz87U2t7n8Onc1tLNzMvHxsjN1ONyUklMU1tcb3ZlVExMS0pISElGRExPT0xHRUA7Ojw+RE1PWVtaX+/SysjEw768uLe5vL/I2HBke/Xd19TQztTTz8rMz9La39/R0N1wXU5BPDw/Q0hLTk9NQkBBPz48PD4+PkNGREI/PDg3O0BHTVVs3NLYzsfHx8jIx8rLyc7X5HVbUlRr6c/KxL28vcDCyc/c7nNsY27uZFlTTkhBQ0xUZF9db2FZVE5MR0VDREVLWVxOS0pFREVNWv7a18vDw8HAwsTKztXUzszIydDX3+f9fenYy8fHxMXMzNntY09IQj4/QklLRkdEQz49Q0pNTVRaVExLS0ZAQkNCSFFh/WleXllaVGDv3tPOycfJy87T3ejq8+3lz8jHy87Ry8zY0MnFw8TIzdt8Z1ZLREBBQEJMV1NPTk9WUVBdZVtXW1taVFVbU01MUV1r3s3JyMvPztHY183M0MzLysjMzMzQz83Ky83DwMHEy8zL0t7i1Nvd3vtzaVdORj48Ojw7PUNFSEJDRkdISEpOSUxPT1ZVWFtYWFpt6N3Mx8PDx8rP2+51eWlg8+PY0MzJyc3Lx8LBwb6+vsHFytPd63z0ffft7O/48XBXT01JSUZGSk9TT01IRUdKTE9YWV1v9+zf4vn04dfPyMG9vcHGyM3Rz9PW2NjYzczNyMXExsTDw8HBwsPM1trzX1hOSUZIR0lNTlJYVU9LR0RERUNFRkFESEdJTVFXX3Ht2dfS0NDR09PU19vX09LW4NTW3dXPzsvJysfHxcPBwcTHx8nLzMzNz93n6P9nXGNfWVBXXWdtXVpcWlRST1RSVU5OTE1VV1hgfuPU0snIycjLy8zQ0NXe3t3QztTa2dPX1c3Iw8LCv8DDwsXGzdHY4uXt7O9oWE9OS0lKSklKS1BZTUpKSklISEdJS0xSV1ZUVmJ08eHi2tXZz83V2Nvj8nT3c23z3NXT1tjT0MzHxcXDw8PBxMnM0tt6ZW1sY2509u1yZF5YV1tTU15oZmZbVVRSTk5XWFVaXWb37eDd3tza19nd3NfT0NLV09jc6PXs4d/c1djX0M3O0NLP093a2dvp+/lvWU5LSUdDRUtLTE5PTENAQERERklKS0pNUE1NSklLTE9f7eXq49rnbmpla/z63Njb3dnW3eHn5eXl3M3Lzs/O0OJ5bnr2dn3n5f14fXNlV1FQTU1WYF9WUlVTS0hKT1JPTlROTVNWUk1MVFlaY9zW393c2d337N7f3t/d4end3djY2dTS09rT0dbY4uXudV1eXl1cUlRSUVFRTk5OTklGQ0VJRUZIRkNCREpHTE1PT0tLS05QVFtdWFdXZnJy9Pl2a2Vnef/i2tHR1tDLycnMys7c5Pfx/PXp5eXp6vv23Nne+Wtu+3BTTVdkXlVMT1lfXVZNS0xNSklMWHVmW13o1d7q397a1t/h6+bf5/ljY3hx697PyMnO0szLztDX7uHg2eXu4Ov0aWNgW1ZcXmFtWlFNTEhGS0pJS0pMSklMTEtNS0xLT2d9+XFoaXJqWFppbmZeaW50fvjj5NvX2dnRycbIysrLy9TW0M7NzczO09TU0tnr7PxqYG/w6+z0bmRsXV9bWmFdWFZdZWh1ZWN8cH7i2tXY2OHu4eH0cm/27/Bvdd/b1c7Oz8/NzMnFxsrK0tfU3d/s8OJ7c2liYFhbXVtbV1dcYmtaXV9VVE5NUU1LT1FRUVRcXFpeX2Bea3bx53rr8WttcnP3dG/s6ePk3dfXzszMyszLyMjHxcLEyMrMzs7R1tTc7O7v6eji3Nvj4NfX3ODtcWxeWVlieGhqbmFlc/bl39na3d3h4uL8e3RqZllXXWjn3djS19XW1NTT09fU2dXO19bQ1d30++z9b25uZml7cW788WpdXFxaV1tSUU5KS0lHSEdKTk9PUFlbbvLw9W5nYVddX1xcXmhvbPTZ1c3IxMTDvb28uru7u7y8vb2/w8XI0dzseXrt5N/e3tjZ29jc6/Bxa2tcWlVVV09KR0ZGREdKTE9OV1tUVVRRTlFVWmX03t3Z19XS0M7KycvPzs3KyMbDyc7P0NTY1dXSz9PS097o9m1kW1NOSk9RUFFOSkdFQ0FARUhNS01QT1NYXFVQTU5VXFZcXllbafb37dzQysTCv76+vLm5ury8vL29v8HHz9ze6fb88Pbo6O7d29/j33pqXVxWT01IRkM+Ozs8Ozs+P0RDRUtJSExLS0xMV2d749fX19vXz9DU2dXU1NHOzc7Mys/R19jU0M7Nys3NztPV3ePkbl9YUE5OTU1KQz8+Pj4+QEVMTlBSUVNST1RST09RUU9OTlBUUlBVXmRu4M7IycfDvr/BvsHFxsnM0eLm7mtUVltSTlZgaGBha3VuaXBrXllaV09KSEpCPDo7PTw+R01WUlBPT1NZXmNtcHnw5N3Z2d/s8Ore2tbV1NPc6e3p7Ory+fjp2tTY2c/T4W/66Oh2bH7p/WtgVVRVVE5ISEtOTktOWVtpbm559OPg7v1uaWpeWFdVUVFWVk9TWV5l99jT19DOzszO0eDp+VpRTUxHQkRESEtLUFhaXXje2dXQzdDX4fdkVU1JREJAR0tGRUpRWV5mZ21x3c3HxcrMz9fY2N3y9e57a/Le5PLh6H7u6ubZ0dDO0s7R0tXe3ujm6Obb2+Xj4PxzbG5vYGJhVU9TT1RTWWhja33i2d7w7O19cmpoYFdaWFlMS05KT1NdaWV54NjY1NHV29zj5+xwXl5ZUk9SU1daWFdXYOjY0MrMz87O0dLa7HxmZVtQTlBRVl1cW1tXXuHT1NHNyMbIx8jN1dvc4O3o7Pvu6+bn6OPf1tDLxcC/v7/AxMnIy9HW19/n721wYF1gY2ZrZV1la2hpY2BbV19eYmhqaV1aUlNYU0tLTk9QUU9PVFFUWFhZbP/t19HOys3PzdPc3dTb7vhvXVNSTU1RV2fm19XMxMLBv8DCyM7R2t/0bl1RTU5TU1ZZXGRfeNvWzcrIxsPDx8TGx8rO0djf4Ob6+vDw/+jh2tPMzMrKycnGxMfO1t/q/WtyYFdQSUpPUVBMTExJS05KS0xKSUpNTlBXWVhgXFpgXV9eXnVp+Pxp7+3r6fV5fOvd0szO0dDX09LU0NXa4Oj6cV9YT0tMTE5QWGBm7+LSy87OzM3Mzc3W8nVfWFFRVFdYYPDo39rWy8fHwr6/w8TFxcPHy9bsfWpmXGlsZ21gcuXj5dvT09DQ09ns8nBbVk5IQj8+PTw8PkJFR0pNS0hKTllgY3puXl1tdGlzdH5vXl5sdPng6uje4dfU2M/Nzs3Ny8vHys3M0NTS1t/o9HBeWVNNS09NSEdNU1z84t3a0c/PyMbFw8nM09zpdF5gXFlXVVheZ25759nSy8fCwcC/wcDEy9LecFxNSEtJSEVEREVDQ0pOYXpz7Ozw8W5nXk9LSEREQ0RDRkhHSElJS09RV1plbmrz4e319+bd3dze7/twZf3b19na3uPo4eLe0szR0dPR1+Lj4NvX2d7g7vtwavj0a2BdXWZucGRofPje2dfV2djP0NLP2el+e2BZa3VdZX1u8urr6ujn7+3j2dzd6fH7XldSSUZHQ0FCQj8+PDxAR0lOZefe1s/X2tnj/3V4bVVJSkdKTUlLS0pLTl9w4uPr2NvUzt/a1+Lk6uTkdG9eXl1dYHl0/e/g2NTV2tbUz8jKzMnP1NbY09fe6Ozi5/ltaVpSTk1NUU5NVV/u2djW2cvH0MzI0NzsZl1WTUlHQ0JAQkdKSUxNUGZ2Xmb18+Ld5vdrW1ZWU0xNTEdFRkVKTU1PUlRw2dPPzs7NzdDW3O16bHFrXlVTTUhOVlVZY3Jua/fg5ezm4drV2Nze5fDu3ubv8fT849HNycrKycvGwcDAwMfNzM3X63ZnX11daWpl/Pv86e1zZ15aWF9ldG9eV1Ze/WFWTktLSkpJR0RAPj9ER0ZKUmPq29HNy8nN0MnK1tvuamhaUk9LTExKT19md/Dl183Kx8PCw8fGw8fO3PZkVkxJSElHSEtWXmVydujXzszHw8HEycfGys7Y2dPU2+Db4+7s9/nd19bb18/R0svAu7q+xMLBxc7Yb11lXU5EPj0+QENDQD0/R09XVFVZX2Z4altaW19cV1JPUlVTVU5NUVdcW2f42dHOy8zLyMjHx8nP2ePj+WJaUlJXU1djcndt8t7W0dXTzcrIys7T4un7a2ljampdbnBy8N/W1c/Mx8K/wsHByMzT2+d9cF9VWV9iZGrw4tfQzcnGxsjGyMrM0dje9mlPSktJQD49Ozw8Ojk8P0FFSUdQX2h849fb3+Lo7m7+ZFtfUEtOTk9RVF9lafHb18zKycTCw8bCxMrN1Nfg7XVVU1dPTkxLUF1iX3zj0dDNxcTDwcDCxcjIy9TY5nBsYV5sY19kdGxo8+TT0c7MzM/LyMjJztTc7HdpXFdUT0xJSkxMTE9TW2FgbvZrXnF8c11VV01OT0pGREpLSU1RVVdXW11jXWBx/Xbz09Pk4N/m8+Phfn52bmFcaPfl5+jd1szPy8nMzM3N1N3h6OrvfXBra/76fe7q6dzf2czNzcnIzM7Lzc7O0Nbb4O52al9bWlteadrU09TR0tXNx8vQ0+ZsYVxSSkRCPjw8Ojo+Pz9CQ0BBRExVX+DX2NLPz9DR1dvh9GdgUk5LSUlISE9UV1xfcPTo2Nvg3eDk6vDc1N3k5PV7ZWZtWVdUUFdrX2Xu4NrOycjAvL3AwMHHys3R8XtuXFxkbV5YWV9aZfPs5dbV087Ny8nHxsfKzt31eGpfVk9HRURFTVFQUlROTk5QVlVRTERDQkBAQ0RDRktLT1lbWFhYUU9XXl1iffTv39bV29DO1Njn7fft9l9bWFRVZ3v36+nt6+fe63ttW1hcZG7r4uHb19XY1M/Pzs7S09HT0s/JysrJyczMy9Da6WBTUlZYWVxeX2v17vLs3OHb1tXW3e1+9GdeW15cTktHRENDQz8+QEBCRUhMV3Dy4d3b2tfP2ef8X1dOS0tHSUhHSk5XZnp6fGtx/O7a1djd29nZ08/Pzs7a3dzg625gXVZQS0tXc3Xi2dvSzcrJyMTGy83OztTPztPY5f53/XxsYV1bW3Hj5NPLy8nHx8nFxcfO2t9uWE9LS0tLSEZEREVLTlJUVUtHSkxRT01QVllcfmxecXVpaXf8Wk1MVWjk521gXXLc0M3b7m907/h8W09VZnBwX1FNW3z4fXF1bvXs6+X4fujg08vJxMPExMXIyMrMz9rf3NvTztHY3t/q/Hpw9+vw4eng4uXe3d/c2uff1trX19ff4trl4tff5ujrd2daTUlFQT8+PTs7PT5AQUZLXODd3drb2trn29LvcW5daWlbW1tobmBfbnxx8Ovd1dTV2dnY3+bY0NjZ2u7y/2FXVFpcUE9UUlRidera29nSz8rIxb+9v7+/wL29wcrR2+N7/ex2a37z6t/d3Ovd293Z08vHyczP2NnoZ2twYF5YVFdQTUxJRUZEQERNU1ZhZVZjcWfw5XleXVdPUE9NSkpMS01c9fp57eXi6d7a3tjZ1s7P2/Z7Y1dXV1xl9er79PDo6O785t7f3dzY087Oz9LY3OPj1c7Q0NXW1dXa3eD3bW7p4+LZ09HRzMzLyMnO0M7R2dzd2dbf8Xf8+2ZgaGVaT0xLTlhSSUZDQUJDRUhKTExPWmFx7Onr7nl16dvc6XdvZmx0XV9oaV9XV1RYX275d3FzcPDm6eng5Xz87dzX2Njm825aXVtcXVhaYO7e2dfY0c3KyMO/wMHDxMbK0d7ydlxYVVFUWVhcZ19lb33s4NTLycnJycPCyczO0Nfa3OV1XE9JSEhDQkJDREVFRUZLSEZHTFdcYFhWW1RWW15cWllbY2Vvbl5ndXd4++Po5uPg2N/sd25kW2NjXVRVZGdua11aVllfXmvs8nFlfd3T1tLQzs7S0c3Jx8nM0dLX4et6/vpqaHzr49nW19Tb2Nvq4uZ9eGdmbm5jZ2NdXmbz5+7s8HZkWmJcXFpSUE5MSEhFSEhJTE5YW2RsdnvreXvsfnpoXFlYUU1MTVNMSk9WW23u8enz/d/g39XY3+b87ebqdvprU1RUWWFfWV1YX2h+9Pjt6trXzMrNzcvIy87MzM/a5eP4emz86vzv7fj4eXXw+O7a1dvWzMfHyMrM0Nvb3vdvXFVNREA+PTs7PD0+PkRJS1ReYWxx5trX2Nnb2tjt9Xl0/mNcWFtfXl9qbXl55NfZ5PPzd2RYVFdXWFdbX2FkY23y+3l6dOnb2tXP2Nzl8+Pf6eLd2tHO0tLOzs3W1c/c3+Lq7eni5uTs9/n05+Xg2NPQz87T0M3Nz9PP0tfhfmtqbmRpXFdYW1lYUEhKS0pMS0hKSUdHR0hLTUxTV1x43tTW1dfd2dTT1NTT2Nfa3+/w73hkYHBvdeXd29jZ2dzc4uj48WdRV1RQWFVWWFlbYOnW1NjXz87Mx8XBvr7Bx83V1tXb9G1zZGRiXV5daPj58d/X0s3NzcvN1tHP2NbX3djW2eX5cG5bUlFPTkhGRURFRkhMT1JUXWRs7+rj3drY5fpzfHh3YFZOSUVKTVFcXGb85ufd2tfS083LysfJz9rg7G1kYlxbWlpcaHr94trR09TX29vb2+l3+3pw7+ze2d/j4tnc2tjU0Nvd2dPT1t7g6frp2t3d433v7+jm8Hp67/Xs8Pz2e3Z3aVdKRkZGRkhKTktMSk1VVV5TUWBfbvf6cG5ubfrf2eru9O/h3tjf++N2W3fzeF5XWE5OT1VYXl9fb+3m9fbj3tzW3tvY2+PZ0ud9eFtcbuPp8N3Xz83HwcLGz9HO0tjn8F9QSEJFTEtKUF7t3tzX0NDMyMfDxMjIyM/j+mlbXVpWTklFPjw9QEFDS0xLT1RaW11XT1VSXn7u+21weX5u69zr+G5jbGh+fW5nXFpWae7x6OPq49rd2NTd5vplYF5aV09JRklLS1JbZG/z6/Ln3dXQzMfHxsHAwsTH0ePvdWddaGxnYG1rduPY1NTb3Nre73Jta1hPTk5OVWFeXmvu49rV1N3m8O9tW1lSTEdGSEM/QEBEQD9GTFFccu3b2dTMy8zO0+Z9eV9SV15cWmJkYHF8+PDk3d7i4tvc6/RnXW5lYHLwfXrl4ePd3e3s3u16a/j6ZGZ06+rk39zX0NXY0tPS0dDPzs/S293Z2ul69vpwbffq6NnT0NDLyMnIyMzV3+1rXlNHPzw6ODk7PT9CSUxUb+ze2tPV29rW1dzn5/t1eWFhZ15PTk9UV11x+N/V09fa1Nfc2+P8b2lbVF5gV1ZWW19z5tXQz9fn3tPZ7nT79fx+7dzZ19HMycjIysnL1uHq3+VvXVRZXFROUF7+eXzu8+nX1s/Iw8HIzczOz9HS1uTqbWr/a1pcVlBQUlZVT05MSUxLRD8+Pz9ESlJbd+Pa0c7Gw8PDxcnN0dro83BeW1FKSEhJTFBcb2tv+url2tDQ0dPa3OHj9WVdVFRSU1BOWVZY8tXNysbEw8XGxcvOz9Xa4uZ7/efo6Op8c/To5dzg5uZ7e/jo3t/o/XR29t/d3OLl3d3a3el0eXRgYmFaW1VOTE9TVFNTWVteYmn57N3e3NnsbF5ZVlNRTk5PUV1v8fL15NjOycbFy87T6PdyXFJLSEhLTlFZXWFaXXrk2trW1djU1NDS0dfl5+v5cm1v/ufs6+jdz9PQzM7Q0dbe5OLpdGNfXGBqbnx+/e3c0c/OztPV2uDoaFxQSkdGRURHR0RBQUdNVFdaeeDj4NXSz8zNztDR1dvc4N3n+/dtam5ka19WV1ZQT1FNTUxQU1dhY2n88enb0s7KyM3S3eLoa1pVVE9MTE9VV1pnc/7d0MnHxsPEysrM1trhe2luUUpIR0xQU1ZXY/Xe2dLIyMXHycnUzdfd2u38ZVhQXFpNSERJTU5PTEdFRUdJS0xJSk5XWlNYXGB42tHV087JyMzU5dvUz9tqam7velVVZ29bUlRYXVlTWFtgYFpaXF1VVF5qa27v6Onx4dfOyszP1Nve5NnS2t/l/3dudWpdYGFbYHzp5uzg3+rr/mt0al5ja2lpb21rZ2xybPHd3t/i4unyeHdlW1hQTUtJSktNTU1QT09YaG/x5+jn7uDW2d7g6HlpY1hcXVhSTVJcbH3v6+vd3N/a0tLW09ff2Nnc7nplWFlaXV1XXlxSVldYX15fZ3b65djOzM7LzM/P0NPd3N3d3PHt6nBdVllaU1VdXl5ravPf2NHS1NTb2Nvk4+F3WVtYVE9LSklISklHSE9TVmJt8+v19erl4djUzs/QztHZ2tzh72ZpZF9jX11cXF9aUVBUUk9PWGd89vzy6ODVz8/OzsrLzs3M0tze4OHi3uj7c2pnZ2xqeP34ffLe4/D+9u7t3dvf4eLt8u95Zl5cXWNr/e/d2t7l6ePo5tzZ2Nzb43ZuaW1mXlpVVFBRTlBRTEpISE5QVFlh9+ni3tTQ0dHSzczKzNPZ4+18/fr5dmVfY2RiX1tZVVNVWl9u7OzueGdkaHr5/W1y+vvy/Prr7uvi2dHOzMzMzM/Oz8/OztHY297f6/p1Zl9aV1lUVFtYVVVYXGz56Nzf3NrY2+Hp9XBfXmtwc3txYllSU1ZXW1tUUlBSVFNVWF5fZHzk39jS1Nnh5uLf39/o6u7t9Wx5enNkXmv6+nv6bmRcXnbq4NrZ2NrZ19vj83pnWVpgZ2ZubmdeXGFjZf/r6eTe2dfW1NPR1NTOysnKytDe8P1uZ2tnX1pWXGdsdnZwbGV57PLu6vZqXmNsbnR5dnRrZF5XT0pHRkRFSUtNUl1fY/Dc08zHxsjLzM7Q09rj+G1gX2hubG5eUFFVV1dbX19jZ3R89uzt8/Do5d/e4t/k9/nr5OTm5ePe4+Tj7OrteW9raXjv5t7c6/3x7Ofg3eDqem1lYWZjXV1ka+/c19XT2d7b1tnd4N/m9vv7d2xnXlRST05OTU9QTklHSktNVF1qbW1peu3g3eDl6OLa2NTQ0dnh29fY2t3g9nNqZVxaV09RVlpka3P8+35tevT5+eza2dvb3eXt7X52b216e+7h4N7w+Obc1tPNzc/V2trf4PRlWlJRUlVdYWNdXmZu/Hh69Ph5amplamtoeOvf3t7b3ODwd2xiXFVRTk1MS01QVl9kanr16N3Szs7W3uHq8Ozj4+bs9/16dnJoXFhWU1NXW2RtbfDf3uLe4OTr6uTs+/f1/njz7e/u5+Tn6Onp6+3t7ezw/nt3bGj97nn35+rp5uXn+G1qaGR5+PDg5eXe2d3g4vpuZmJlX2hza2Vqb2ppbm1rZGBbV1NOT05OUFJUU1ZeaW5w7ezm3eDe3+Tf4uLf2dnZ19jV0dDR1N3xb2t3bmBgXFtbXGZkY25pa/zw6OHc29zf3d30a2VgZGNfYWVkZmZkaGtvdHX1593Z1tXX2d3j6fX59vnp6fTu+frq6+/t6/bv+Pv19+7y8P337/5wXVZXUlFOTUtKTVBQT1VdWVxtffvu4N7c2Nrb3drb3drY0tPS09fY1tnr83ljY2RfXVldY19bXmFkYl9faHD16enm5ODj7O7v9P/97e7t7Ofj4eHf3+Di7PHzfHZpYmhmZWZdW2Z0+OfZ1NHQzczO0tjnZFRQTUxOT09QVV1jbfj67uHg49/e6PhuXVhVVVhbXmJ0/O7q7Ozk3t7d3ebk7f58/3j/9/rx63ZsYFxfX2RjbXFy/ezq+nZ2X19jaW3349za2trc4NjY29bSz9Pb4+n48vtpbG5peXju5OLc1tni5+50al9bWFZZVlRZYWJx/nRsZ2Rtd/jq4NvV2trX3d/f5+/we2teXGJeXGNgXWl7/PPp39zc2dnpc2JYUE1NS0tOUlRacO3q4N3j49zf6Ofp8H39eXhwfPjx5d7e19HT1dXQ0NLU2ef4cWFeYWNmaG9zeWttcWhnbGNpevl9evr+ZF9sZGBqc/Xf1c7Nzc3P1dPY397j9HJfVlFTWVteZmpueX18d294+m5paWJZVE9NTU5QVFhdYm3s6fr3+f3v6eHc1tDS19bW3u/3eGVfX2BcXF5eaPvv5+De3d/i3eLg3+bo6fL8fXdsZF9ncm9+6evv8ntiW1pVVlRaXGfq5uTd3N7g3dra1dDQz87NzMzN0dnj6O97ZWBbWlpXXmFkZFtZVE5LTExJSkpLTVBVUlBXWmH82dDNy8vNz8/V4e9yYmNpa2737+Xf2tfY2Nnh7fvu9Hz6fHhzcHFlXVtVVVRRVFlZWFdaWVpcXGBq/unl3NTU2trY3Ofh2dTSzczNycfJysvO1N3o9HhtamVkbGtsdm1hWlZYWldaXVlcXV1cXllVU05QVlt3fn71dW90bmdqd/fp493d4Nrb6O3n+nhvY2NicO3m2tTS09vg+mVZT0tISUlLU1dYWFtcXGBu8d/Uz8/NzdHY3up7+e/l4N/b3drT09DQ0tzl7XZwdG5jXnD17+fsemljY15gc+/q4tvW2N7pbFpQTVJYYmpldHZwamt4d/r5+PT57H5pb3Bqb2xiXltZWFlgbfrn3uDl5+z09HNpZV5dXF9obWJYU0tMTU1TW2j35d3U19/g3dnb29rd3d7i3tfOzs3O0dbb2dvb2tze4eTyZl5ZVFJUWVdbZGx88evweGRfXWJuefXq4+fx7ff77evh4d7b4d/a1NPQzdDX6GxeUktHSE5TVVtgXlxdYmJiZmJgXVxcV1NRS0ZDRUpOVVtq697Z1M7NzczNzc3Q0djc19DOycbJzNXe7XlrZWRu9P/79XBoX1VVWVlXVFdgZWJufW5tamd38OPa19PT297b2tzc4OPj7XFw+evj4NfU2N/xb19WUVBUW15eaGlnb3Bwa2ViXlxgZmVqYlpXVE9MTk5PUFRdXmJ3+ezZ1dTR0dHQz83KycnJztHZ+mZfWlpfavvy7urt7eLg6OrscWJfXmZkX15bX19eYWhqbO/l6uXd2t3h2+DxfnRnZ2/239rX1NXU193i63r14OTr6+/9dml2fW5iWVRTT09TVFJSUVRXVFJQTU1PT1dpffPr4tjY2tza2dbSzMbFyMrN0tnvbGFaWVtcYWRiZGdmbffo5vR5fG9vbmZiYV5cX15fXl5hbvjm2tTNztHPztTZ6PbvePXp6ubq9v7/aGNoZm139+rk5t7i7+fsal1XVFNRU1hYV1xcXl9cXmVgXWRx/O3o4ebn3+Pq6uvo3tTPz8/Oz9DT3ez5b1pSWFxaXV9jYF9obGReXV1fa2poa2ZnXVpdXl9gXmn75dvT0NLP0tPQ2Nvc3d/f6Obg6Ojo9PtsY2NbW2Fqcezp7ePh4/1iYFxZV1pYVlpdX19fY11daGZt7trV1dfV19zc7XB6+PHr4N3d3dvX29/j7/huZmxwenJuY15la2pjXltbX2ZiXmRhXFpebWtkXlxcYHD26OHm5uTb2+bu6N/n8uTd2dfc5efrfGVfYV9eavrn3+Hf3eH/cn59/G1lYVlYU1JUVVVSV1pZX3bs8eja29fT2d7i3tvX1tLT1M/O0dTU19/r9X308+x4aGdcWlNPTUtNT1ZUUlRTV1haZXf3fHR19eXf3N7c397a4/H5+vXu7O3s5uHb4OXj7PhsZGBeX2JrZ2h68/1hW1teZW1jW2BfXGBnZV9ZV1lXXGh76eDj3dLNz9nb1tfW0c7Pz9HT0NPZ3OHq83b/7ujs/mxx/W5fW1hWU1VaVlFWU1RWW11gbW1rbunf3tjX3Nnb3/JwbXZvff9rbfXt9PPr6vn//HVvenNsb2pmefbxZ15hZmFiYFteXlpcXF9ZUFBST1NeaH3u8eba29zm49XU1s7Ly8vLzc/U1t3q7fZxeOzufnF1+3htbmhlaWNeY2xnZ250aV9hYl9dYm786+fk29rf5u34eX368PL/+fDk4OTt7Or1eG5++3JtamhvdG9uYVhTT01NTE1XWlteX2BeW1paWml69+Le39vb3d3i5t3d3d3c19DS09PW19rf4fR+9/h3eHF17vD8bmdlYlpcZ2345Ofq7Ph1aGJnXmR57+fk4eHd4Obl5Nrc397f4OTh6nxte/h9/HBkYWVjYmNsd/f2/XJpYFZOUVNUWV9cVFJSTUxNS0xSX2n8497c293d3dbT1NbX1NPS0tfb3NjZ29vg7fLq7vXt5ebuc2RcV1RTUVxv+Ofq7/j3dmhiXl9leuXq6OXn5ero4NzX1dbY0s/Q0NXb3tna4e58XlNPVFBSVVdXUlNRUVVWVVdm9vT3e25fXVpVU1FPUltlePLu4uj56ODZ1tve3uHe3d/f2tza2uLh7Xzw8ffm3Nrd7W1iV1RXXGJy8u3yb3F0bXFjWlxpfO3e2Nnf5eby9url497b29rT0dfc29bU0tPb6313bWt2/mteWldQTVFTUVVZZmxkXltXVFRRTk1KTFBTWmJzfnJ2+vjp2dnW0NLOy8vLzs/Q2N7j+GZyb2Fofen1amxmWFlbWGD+8Orv6+v/9ef4bGhjZXj26uHg2t/p4+fs5+7z4drW0dTV1t/i3uTk63dwcWtq/fV4XlZXUlRXWF5idfv2+vdyYmJeXFlXVU5OT09TXmFcXlxhamz259/V0c/NzMzO09rb3+vn+/nwdPrzfHdmWV5fV1lo+Ofm5d7e4N3o8PpiXWNkbXr+7vB99fp79nxve+jb1NHOzdHT2N3c3OHk5uzr6er3Z11aU1FRUlRUWWBfY2ljX19YVFVXVE9OU1lda3306Oru6O3o4d7Xz9TRztLU2Nvc4+v3/XB1cWNjXF5jXVxYV1dZY3nv+ejg497d2tzh92FkbH7t5eHt9+3u+m97cHHp3NTSzc3U2NvY2NfcfHt9dGtjX1hTUlJRT1NYXGBkZ2xud21gYF9eXVZPUFZbW1xnc/79fvvs5uHW1NTQzs/Q1tnX2dre8Xb56vRqYWptZ25oXmBcWmFicn178uz569va5XtrbG/16H5t/nNtcmxqa2hv+Prc0dHT1tXV19fU2Ovw7evsa2lpXlxYUVNXUU9UVl9iY2tiX2BeWVVTTk9TVlZNV2diaf7m497Z08/Szc3OztLV0s/V39/e4Ofu+WRqeXB8cGhjXlhVWVppb2pvbvPf4u/9+fz29+vsfPbr7eff6e/m8vnp3dvd4Nrb39fY3d7f4uh9bGtaVVlPT1lUUlVVXF1menBhbGddZV5YV1NWVU5PUlBUXGT+4+fh29zV09DQ1dva29zU2N7Y2djb4eLsd3l8bH7ycG1sZ2ts9/JtaXF3+ePd5OXj3vNx83xtZml1bHRubGls9unc2NfX2NLR1NTW19vb5/bxeGhdWFlXVFJVVVVYWF1XUFFPT05PUVBRVFdPUFVVWl5z7unZ2NrVz83Pzs7S19nX2tzb3uPj4en7dHxpX2ducm9uZV9kZGBjbGpr9eTd19bS09fb5e75/Xp89nz9/nNscern6ePb3uXd5eTf4+Hw6+p9ZmtuW1pYWF9aXF5famNYWFtVUVVVWlxYYFtaWVBPUVdZZnF85uve1dPR0dTX2+Pi5erg3t/Y2tjX4Ovs8ndwaG36c3BzbWtgXFxdYnb169zZ29nb3uV2aWx2d3Bvbm5rbu/g2Nnc19PV09fY19nb2dPX3ep6dWhcVVRYVVNWXFpXU09OTk1OT05RUE1PWVNPUVRZX23u7t/a2dHMy8vO0dXb4t3d493d2dbU1Nrr8XxoZ25kef1pamFbXltWWmdy6+Ld09nX1t7i6Hx67/b463v282335t/b4eXe3dzb3t/Y3NrW3eHscG5lW1haWFdZVlpcXltUUVdXVlhZVVhaVlVSUlRQT1JXXWxzbu7b1tDNzdbd3+Hg3NbW08/Pz9HU1eNrZnNpZ21tcGZiaGBdW1ljdPfj3N3W1d7g4u3y/GxpaXd7ZGh68enj2t/i5NvZ3NbW1tTT0tfV2N7wa2ZkbWVYVlNUVlRSTk5MTVBQUE1QUU1OTVZYUlNTWF56cXHm39LOzMvP0NPa29bU1NDU1tTZ19v0aVpYWllZWVpZW1lcYFxpfu/e2NPOzM7P09rZ3unvd3V8aWh1c+7f5OPk8e/n5eLn5+Lp8O7u6e1zcG1ia3xtZmRmbXhpaGJdXFteXFhZWFBOT05UV1JOTVFVVVhdbvnn2djW1djg3tve29PS0tTV09bZ4ftqZV5dXV1laGVkYGdvfezb2drT0M/V1tbf7On1ZF5dUlRYWmrw4d7j3Nve29TW2djX0tbc2uDv6e90fPh6+GtfX19gWVFSVFFVVlFQTUxNSktPT1JaVVBTVVlcY3zf0s3Oz87Q2NbY2dbS0dPY2dzj6vFsX2FeWVRVWVxeXVlbYmr+5N3W1tLP09LP0tbf6vtpWldVVl9n7tzd2t3l3dzd29zi3uXv7PD1+GttfHB58f1ybWd2fXJ4ZV5lX1xbXFVRT0xOUFRXT05LSExQUllo9N7a19TU1dba2tjW09PX2N/e2OT57v15+mllX19jXFpfZWj859/Z29XU2trc3tnbd2VfXFpTU1lfbvjn4tnb2dXX09HT0dPe4Oft5+14/vPu6O73/W9oXl1eXFhdXVZVUFJRTExNTk9SUU5MSkxMTVZebuzi29jY1NLT0c/Tz87Q0tfT2uLg7nx9+G5jXWBsX2BpYWFqcfLo39zc2tfY2tTY4OdsbXRmY2JsePv65N7f2dzd1tjb2eLs9mb99Wpv+G726nrxeXvxZ2jy/G7/a2dtW1xWTlFPTFBOS01MSUtKSU1NUVtZbe3s2dbXzszNzdDX1Nnb2dze3eHn4evs7nLz/23r7PDn7vjr4+Hi5OPd5ubl/HxnXmZgXmZqa3Vscunh2tbRz87O0NPa3eXp8nFueHb//vry+fV6bG5oX19gXFxXVlZQTU1PTk5LSkxLTk5NUlVWV1ZYam/729XVzs3MzNTV19vW19/b3OXk7f/1b3p8ZWX29Pvp8ePc5t7f39jd2tfa4ufo6exzZnh3eWpbaHd2+Ojc09Tc3uXt/Gdz+Xhkb+ns8Hv16erg7e7d5PN7+u74b2NdVk9PTEtKSUdESUxKS0xNT05NTlZdZXvd0s3Mzc/Q0trb2djU19vV1Nve6e7k5/F96uTw8+DY29vc6N7g+P99+HlkaPz7bGZnYmBfXlxp6uzfz8zNz9HY2dzs6OTi6vbt5OX0dXZ4en70/Hl2ZGNua2plW1FPT0tLS0lHRUlLTFBPUlBSVlpeau7q39bT0NDR1tze3d/g3tzo5+fq5XZ69f/xdPDt6ODe19PP0NbS3Ovg5evo7PPm3/TnfV1mYVtZYnby5eTa29va6vFwa/Xq5+Te4NjicO14d/3+eufd7+fkfubk9HFeU0xPTUlJSEdHSUdHSkpMSUlNWF9n/O3e09HR0NDe3tnb2d7Y2tXZ7eHn7N3zee/f5+bZ6N/O0dfW2/D/d2xgW2hibnlz4P50+FtbXe5o+dnr1c7V0N7g6Xl5+d705dfe5ff4aGFqXGV783j5/nPs9Xt6Wl5UVEtLTENJSkZKSEpMTUxKWlde/nzr2tDV1tLd3NjZ4eDg4d3n8Pxm9Wti+/He4t/g6tzVz8/N0NnS2d/rdW9s82155+3gfV5scmxp9vDr2NvV197d4vdweurn6dzZ5+zpe21naWFs5/Z3cN7icOTtenVnVk9USkVGRkhHRUVERkRERkpPUlpu29ba1dvW2uHf0dDe2c7R1tra72309m7k1dzm2tjd287S287S3t7QfFv5W1NwbGPw7Vt5+1Fx42Xn09zTztzV1vTd2njl1+vk3tzfbm73XFvxX1/o/GNo5uxsbOluWPNdS09PQkBQSkFLTEVKSkVQXE5q3W3czu/f1ffo2N7U0OrZz+Tf5vf5Y23qeuTN4u/X3d/Yy87e1snX6s3gWnrxVFjkcVloZlBXbGnk3W/dzvPdznD31XJ41ujXzvrf1Gtx625tYX7U7XnQbV/W6GZq4+hbWV9MRkxFQUZJRkJISz5FT0pUZW/359XifeDhZ+PY3tbPy9XXzeR90nZX4N/l3NXT7fnO3GfMzPzXx+Fo399YWO5kWujiU1X9ZVD40/h2y89o1cxuZs/eW97K4t7N5F/h7Fdc7F5h3+9s8+dzaft5WXTfYFhqVERNUUFBVk8+S1tBQF5aRGLYaWjN31ftz11ay9BszsLe3sjlX93bVf3N4e3M0enNyubax9bdy8vf2tZlYeP6UnzaVlB2W0158Fh+zO9s0eJba9xda9Dd+czI59/S+V/l+Fnq1m5m2Ohe6NteYt9jV+DnSlhxR0JaUD9MWD49UkU9Um5IU9LyX9TXVXDMcl/Hyn7LwPh3yeFQ3dFb+MPabcfI/cvC8N7C1v7LzGPrz2FU2upO69BOTNRvS9/NXHvC2lLP0kpfzWZTyM9dzMhad8h2TNbjTuDQUFnQX0nS7ER22ElX1U5I31E9XF08TG89O2dGOmJ2P13KU1XI7UrWzU72wudrwc9O1sdQXMlgTsjOVM+/edy91XC/x2nIwGbewmFXy3RK1dpFXNZNUs1qTszNWN7KU1jRX0va1Vjcx3tpyNpd0NhO9spfV8v6TNXZSGXVTlDUYEnb50ZTb0JFZUo8TUo5SFk/Q+xfSeHbTfPNXlvL12TIx2DVxmxjyvhM1dVX38px38HQesnKcc7E/N/C22bM2k7c0lFc11dL3OhLe89fZMvsUNrgTWvYX3DI0GvUyf7ryelf0dNe48xfZNBtTnRwS1jhW1Hc9E9sbUVMbUZAVUw+SVVAQVhQSnTyUWrZamnX3G3OzHLnzPFf1+JT59FaY8vkXcvGddzE4vbHzvLNxOLgyeZc1dZWZdtaUOR0TvXZWm3QelLi6FFq1WBoyNZqz8tu6Mz9b83UXt7MXlzUb0tfaklY41lT3/VRaPFMTnJKP1FQPkhWPj9TTUZj7E1b1G5a0M9o1sl6+tDnWuvsT2XQblnQz13XyHLpxdFzy8Pi28LQbs/NZfDLcFPh3FJd5FtV3OZP7M5UVdB8Td/OW/bK5mDNzVTty3z5xthb0sxZaNVYS+14S2TVV1bQdkht5ExKaUw9TFw/PU9HPE5pREzcbU3f0WPewuBjzM5S8NBTTtPhV9nNZvTE0VvVxeffws9tycN+5MTkYs3OUWnSWlDZ+EhtzlNV0ntV29lQaNF8X9DOY+PGfFnV31fUxu3vydFf5s5VT9R3RmnXS07VakVm3E1F9VU7Tnc9PF9GOUxmQkjYdEvgzFliwtZazchna85yR+nPUVzI5E/Mx1/lwddoxcRp2L7aYMbJYtvA+FDP101pzllG39lIW8v8UdfRTV7I9U7QyVhix+pM3s5R98TkXcfFXXXGa07e50ZV0VZJ3NxLWtJaRGNcPkVkQzlMUTo/ZE5Bbt1MWs7oV87JZOfD51TV3ElY0G5Tz8tm4cHb+8TEetzD2O3Hyu/dxdX8y9BceNVbUOplSmreV2DN21vd0VNaz/9U1c5o6svpVOXgWGnR5mzMzXDgz/5V82BIWfNUT+JtTH7fUlHxTUFSUjw+TD46TlhGVuNcUd7dWerK41/Ty2T40V1J++5LZM99XczK9M7A2OzCyebHvtbdxtTkxMX84sv7Ved0RlN7UlbU12Lb01ha1fVT39JccsrYYNjbU2bR/GPMzXfYyvly0e1LYdtVVdt1TmjrUGneVUdaUT0+ST07SUhBVXVMU+RhUejZbefL82DP0VNd2ldN3eRT9Mjo8MbJ6M3C2drByubMyPv0x9N+0NhWZd9TRFlWRl3ZY2bK0Vrp0Gxj1OhZ5dNr9cz5Wd3aWvjP73bN02Hlzn5f2XtN/ONOUO9cSmv2TVN7Tj9MSjg+UENAXFxKY9hhW9HZXOrQZGrN7FLu3VNc231V5dtq28bg7MXM38W+zsy+0HfPy+XdyeRj0ONNZfhLRnV6TmvYbXDT31nazGBZ3nVS2dtPZ89rTdjUWuHK43rN11vbzlxf0eFU+uZKUNxYRW5mQ0tcQDtLRDpIVj1G9FJL2t5a7Mz/W9XfXOPgU2XO7Vbj0mP4x9d4yMj5z77P1r7E38vIYu3F5VTS1V/12FlQ9VxNfuBYZ8zabM3I+ebI/lPP0lnzy35by9RR58lhasXfT9fYUm3VZVTZ/ExtcUlO309DbGBBUFw/PlpMOkhkQ0brdVbVzmrly3hb1fhRdPRNWtdfS+ThXu7LfmfN12zJwdPOu8d4x8Zt6MrtXs7Rat3PXFrbX0t08Ex3zvt8y89e6tRaX9T0V9jYXe7M+FjV12fj0mpm1eVV7dVfc91jWe1hTGZmR0pgT0BQUD1GVT88U1FBVN9gWtTfXtnNavHL7Ffd3Fvv31trzeBozs5e7svgd8fH6svB5e/G0Fn7015q0utd2uBTb99kUPH9X9LT7tXKcWbO5WnPzW3pxtxg0NJYb9D8UubxTl53VFDvcExn8E5W71tMb1pJXGZJRl5PQ1NOQExnSkvY7lHw1Vplzt9e2NVVYN1bTW1mUHvbZf/W6WLY0vPVx9jWwcjaw8Tu3Mjfdc7RbOjL/GDP6FFx31pg2Ptd7elYds/kY83J/tzJ4nDL21vazmRe2G1NeO9MWOZOS95yTmTqWFf+UUtXVkFIWUdAUE4/S2VNSuVgRnbVWmjJ2WrKxWX0yWBN2t9V48xkeNLrZdPVYt/N7ObGy+jRzOzfyd9c19Vb/c7qcdXvTujOW17R9VLn3V/ay+fhw8nhzMx9e87fW9zXUVPnUUZnWUROZEpN7WFK7NlPYdZiTHJdRllmSUljTUNec0tR6lRL7upV5snm9srPauXmTlvbW1LX2k52zmtjy+JP2sbu4cHN28TJ4crH//HK22fVzmRu111U23VJbO5LUuVfVdXNa9i+1fzIzlzbxvd2zvtTfOpMVfdKRWZdR1/qTGXYXVnZd0hca0lKZEk+Vlc9TGZHS3ROSdv8TuDH3eLAy/jO1lf5zV9ez/lR39dXds5pU9vdWd/I6+DC1dzEzV7ZymH5yeNX2NtP6s5bVdT2TebWWffI4Oa/xd3Nx3PvyN1c1d9OWuZLR/xOPVBYP0v7TUze7lXg0VRe1ltN52pDVHBDSntNS3dhSGHhVGTVbXXGz2DRzU5n0lNO2fxGcdJSaM50Ut3eV9rG7te9ytG+wNzMxeDYxd1tzt1MbtNRUtpURensSl/PY2fI1uXDzGjTymPexXlgyvhL3uFGU/dCRO1SQu/4SnvXTlbXVEfnXkFeaj5GZEA/b08/cOxHbs9bX8bSbcPDbtXEXlfO9FDd40533VFd21dN5HdR3dFo2cHd48TOe8vQ8cjKes7OWPDKX1nL9E3U1k3rzGbsw9newNFuztlW39Nd9dVVTvhWQ1tUP01XQE/fTk3Sd07W51Db1k5t1ExO6EpFfVdBb/NEbN1HX85ZaMPbcMboUdN5RPHlSG7RTGDMWFTSaFLN2l3Gx3PJwOjOwHrkwPllxN1Zz+dL2dhK6ddJZtFNV8hjVsPTbcLGYtDJT/jFZPDDaFPPWUPrVz5uaj9s3Udl0ExU0FBK2FxB/Gg9Vfw9R+tERdxRRc5xRc3ZTMq+aMy8XnjFU0/MaFDObknP7UXa4kP80EvmwVz0vuRwv9VWxdJIzMhV0sRVe79uXr/ZUszoTszNT8y/XtC+bN/AVFfIY1bGbUnWaD1pYjtZXjpQ6EJOzVBMzFZFzWRA2uw/ads/WNVGVNRMTtFSR9FfSM7bTsnFU9fMSV7WSVXMTUjNXEnI60rOz07Yw2DQvvTTu9fkwNxVx+FOx9FM0s9M2ctN5chMW8tOTMZ0TsHSV8XIVNjITeLDVnfFXE/PWkXcXUDrYj9j6kdc405X90ZJdktKbVBEa11DW+dNWt5VWddqV9beaMzL7MnMWdrSTXTXVWDaVlrYWVnZWlPc51jc0mvayujrzu1x2fpr2dzz19zvz8/d09Lp3drl4d7m6s/U28/S6d/1W2nmWWjnW2bhYlFlVUpbV09YVFFecVpb+F1aY1NYX1pZYltSaWFj8m1g9PVfbO9edOb96dLX9t32U2lgVWZsW2Ls9Xvubu7Y3uXa1uHc09nZ1uLe19vf3eDe3+718efh5eri4Oje3vns5+vg2tve1tDm9OXn7d/ncujkd/n7X1tlamJjWlNUVU1JSktOUE5SWFRVVE5RU1FVZmlgb+jf6+vb39nU2NrV0Nzt6fZmZ3phX3dyaXNsXWBpb/rv+/Dp6v14d2hx697a1NLS09jc09XO1tre3dbe1NLW1dLP0dDW4N7ma295aG1nYFxnc19ZXlZUXl9kX1pYV09NTUtSWVpcZH79Z15cXV1bavRxbHrs/e38cOvf5fLl3vhrYFldY11eZGVnbnb78/7p49na19/e1+d19fxv997a2M/N1NPb7PHp6efn8Hvr6nXe6enb09PV0ePc5Hrp6tra+eB3+uxg63lf/Xp4cW1hT1BKREBBR0lNTk9sXVVfU09RVWBs627w4N/X6dfR2czf2tnz4GVoeWdueHpsX2pob2dlbe7jfHnpZV9rWVNWW2nt3NjQ0M3J29XQ08vWz9jaz+Ta0NzZ1M/R19zu6PVfYm3kcPryT272XFRlbV1w+V1oZldPSktJRk1PUl9da2BbWmVZW336+u3a3HHj4P3y3Obv4d9kY2FUWFRhZV1pY2FobvJs9ebT2uPe4+x3a3ldY3VrfN3W2tfP2t/b1tbV0tfZ2drp5PLo49/q2tPl6uV9bujb593W52/o4XB35+Tv5e5tX1tTSkVDQ0RBSElMTU5OSUxQT1Bq7fXez9be09HX087Q0M/U3ul+ZWFmZmBsZWdiZWNbamxu4/Fl+mlZWGJXUFlkW+rc4tnR0s/JzMnBycfFyczLztfZ4t3X2uLl6XpwYWh2an30c2doa1VYaWNd++f9avpgT1lVSk1NTU9UV11VS1FUTU9ZYP3g29nW1dLV4t/a3eHmfHZyaF1YVVRbYVJhZGtr9ev33s7X8OD4bfVvZ11YfNz8duTh3+Pk/t7Q08/PzsrS0dXa63fh7+/k8/3u5/V43tfl697o3PZh83b+3O/23uxrXVpPSEhDQkZFS0pIRkZIQEVIRFNs7tXOzMzFxs3Nys7N1Ork3OPraVZbWlhVWVZNVl1cbXTz5PZ3XGRgX11LTWBfbHby39nY3dDNzMvGycXAycfEzt/U1vToeGltbfxrZG34e2Ro7mVYZ1dWanB96d/m6fltamdNSVJMTFdUSE5SRkdLTU5QX3Lo1MrM0c/M1trP2GV47mxfYWRQUVBOV1Rg9WBe/N3k2c7Y6dvd921cWVpWaGBg7OLp7OTZ2M3MycnLyMzMys7W197gZGJ6aG/yavni5f3v5vv5fGdubF7x4OPd0eD431pISUtGQUxMR09HRkhASEFFVFN68M/Jy8LEw8jM0dzd2+zs7nP8Xl5dT1NYTldbXVx63una1uzg9VdZUlJPW1VX62vr2tvW28jNz73Mv73Qu8zKvme9S+XjRdlH20psXPZl6mFtZE/iSeNN1Wniz+vL9t9mUVxMTU5LU0xTUlNNTkpIUExUX3nn3M3S1cbf0tha0Fn0303PQuNYTfpH5EvpWuR209/J1NDJ6s5T2UhdV0xjTGZcY+pq6t7ZzdTJzMrKxMnIxs/N3OdsYntaXPpU3vFny1TYd2DOQ8pU6tp9ymnM+tlSakdaQFJORE0/8jtVREFNQFZIUu1V1NLVx8nFysnQ0tvd4+l+Z2liXk9VTl5PV2tX7Gzd0m7fzU3d8EHQQ0jbO9ZKUME/wv7fumG21cHCzLjSwMjEzc380110WVNdSetS21tsXGhoX2lf6WXd6unt19b4+WReYUhbYTx0UEHYPFBpPM48Vt08v0fRyku4Wr/+5shO1lfnWHDu5kzkS/leTtFLyWPI383V48tlzk9xZkjlP1NSRN1NX+lZ0OHrxO/Kw/e718+93MTLbMfrUMND2NxHukfbz0S+R2/MPbxP6cc/vkba4D/EPGNUOtc0V1I51jTfRUvePdJJ3uVyy+rH0cbPzMnzy2jb417d8PFuVV1eS3BWWeZX2vla22pc1UTibz3JO2xmOshAfc5DumHNvFSz7cS6V7NdvrxNs0jJ2zy9OdJdRcE6yU1S1z/QSvD2bNVc1+3PbtT9+d1K30NdUULjPVxQQNo891s/yD3PbEq8Sb3o679RyVbee1/YZ9Nk2lrgVVfrTdVV2dpXylPN3k7HRN1XP8k491A+yjnLW2HGVr72y83Ox+DFz8DWwtDYzFrMVeTsYMZOz+ZPyEDTaUTCP8dvSb4/wVpdyUDOR1tOP1Q9UEBKSVFJTl9Oa03XXXfTfL/iyMd3xWr3yUvO2lC/S9zZQtdIVXlKXN1YWNVQ7fFP3l5M309P20LkeEXEUefGU73W5rpjvcJds/DCvmO7Y/zPY3LcX2bOTvDnQvlRQ9pGUcpD09lKvFHwvUDH4Ui9O/PeNcU4UOUyyDpa4TfEQWrTQ7xSyslQvEHI5UW7PsTlS7tFz+dJzkxX0U7a3ErCTO3OP8NDadQ7wUFf4DzGPuzoRb1AxtJPtUa9xXOzX72/d77n3sReyspPvU7jzzvAP0/ZOb9BXsg8wEF6yju8PtTQPLs320w70zDdPkriO8pC3eRPvU2/0ey3Srpr4MJCukrN2E/CPtBYVtg8zkda1UDEP+D9P8k+y1dazE3GTeL3WNlK0GbT2l+/W8bJe7f3wMBou33PzGXK/d1y3mxZ8T7oS0PgOuFQRsVG2s5KxGxrw3DexnL11EVxZzj9Qz7qOlR3Ou5gTslX5MVb2cxMy9xOv1ltxEfP6UjLTVvITvTWT8raScVgUcZFcMtGzs9Cxlo/wD1PyjjM3EC7SG64RMDDWLTa4bVr0LtVv8RIu/pNvj1uzDTJTTy/O+fOOb1aRrs/1cs8uFpQvDnPYTbJNlJlOM8/aG9KyEzH3N29WLvuZLtFwt1MuEXpyzzDSETDOtxpQb0/2thBw0Hl/EPLRtBtW8JEzVdUxz3IYmfBQ8TWXcBuzcL9w8vwx9/az+3X8uJcaPFCbEZLYDrkSFXdQcRqW79dzMpfv9z/yGD7d01TTE1BVEs9dT9bX0DKTN/SU7xT+8dMzvVXymtn0ftg2WBa31Vr2XR909Bh0NpW0mBM1mpG2GpI2lpL3E5K3FFN1Fxgy2HYxu3JxM7MxczPxczZwtNbvudNzk5IdkBE4UNJz0pVxU/YwkjE00S/ckvHQ1LNOllmO+s/QtQ+ZdxFxnxvuWzPu1TMzEzBcFPDVnbPRfDfO/NdP9JHWsQ/18hCxF9Qxj7s0EDPZFTHR9raSspMcc5Jy3Lqx1rB0tTEfL7t3cJdxPJtxU7r3UXhRkV4OmJUR9ZJ1tr1xvzC0PPBXsrsU8ZKX3s/fkQ/ZzlQUT/aRvzTTMf63sdZy/Ljz1bKe97cWMhYZNJN6vlVzf1cyeJozvtv2lNk6E1V+1JjdEx6XExvUmJXVc9tasnY2sbWzL7szb79ycFsxctb1N1TYXhKS2BGTHtGT85sV8bRW8vXVNHsTNH0R+BoQlZVPVJRPWd2R+LKXtLCfNXGcnvEXmHGX1jKXljPVU/WWkfbYUvaaU7P6VTO5E7m3Elq0Uvt00/ez0pmz0xNy1BZv1P4vWLfu2fxu1XbvErPxUHR3ELRV0LYSUDWRUvSP+DSS7/U4LxqyMVOyO9cy0vu+kRqREdKPlxCT/FH1l5cw1DU007CbF7FWOvPVt7NX/HJXXrGV+3KU+jOXm3Ic03NV0fcS07eT2joUPxTRuNIR89Obsxkz9nvx+fNym/Azem+2tDJftHv/t1a2lVO1kZmYETbSm3NT8rjU8ZXWs5Sec9cYd1JS+4+R3dBWOhWZ9DdYMvTUs3PXt3Xbvvv32hq21pu11lvZfRmSNdeScjsUs3wTe31TGDRXlzF51jK3Uje3UPryE3pwldkvnlSvvFNvO9NvupLwt1Jy+pJy3xK12dI9WpI8ulWz914zOPg4GXS+mXJblXgTkxQRktHU1hJaHxL+NhSZdF0Zs3iVc/bUM3MTtPAWum/a3O/Yk7FeErE3kHM6DzaeDzf4ULTzUTh20VrdUlz3lfu2F3T3l7KbOnFX83KcMXX9sLhbMfpYs1hVs9UT+RNTuBZVdpmVN12Vd33WNX+/9NQ6W5E6UxL60pi5Ex90FJ1z1HnzVLk0E/sz1zlzWLmy3vnzmzx0VZu/VTTVlbVSW/3R/BlS9/dXcvQWMzdTdj0UNbmT+ThV93fVuPeW9TWY9Ds9cpb0c1czOBm1Xhl2GhR4ltY2Fj91VDq1lZx2mtvzu5r0P5R+2xHVO9KTN1USe1lTW7vXGHe9Vzh3Hrd3dTb+s3Zbc/O69/NeXTYXVn5WkdcZENXdElj1mVx0PBe/+lcV9z4U+zca1fs2lNt0Hpz0M/uz8Tb4MvQX9nJTWfJWlPa9E1t8kpd6kpP4VFK32tO29Rf687xbeRuXV9oZVho3mhP2upC3tFIZdFiVczUWtTTXNrNVGnLYlfP5Vvi51JbaVZQVVhPT1n/Z3rH9WW+11DRzlVdzV1OzexK3OZFb89JdcVV/L/c+cXeV83YR9nKSPTFTV7GT1fJS0/KUEvKVkfNZFXKZWDJd1fV+0zl7kvnd0Xa/D/28z9330fjzlDSwFv4vl1Xwm1OxdNTyMtN0shFX8xKSdtRQP5eRNrbR87LS9LNRvvLSmjLS3DJSl7MSlPYU2jH7du6zeO93GDFX0vPW07KcEvP7EPo4EJo3UBb2UJUx1RNxdxNx8tPzttMz91K09VJ39FHb9dBXtJCZb5XcsFtadBXXdpOT8xeUMd8Tsb4RczmQ9nqQXvlSO7bV87MWcrCSuTDSmLCTVjJWUzTY0F3dj5mzE7fv2DZvlZ5xE5Nx2ZNxPRNx2FKy/VGzd9Gzu1Jze1Ky9ZLz8pJ8c1KYtFOX9hJU89OSdFOQNxWSsrbV8HLUMXQTM/cSs7PUsnMStjMSe3RSnfbQmXYQVXXT1bXaljTZU7Qa03N2EzZy0/uzklq20Rnz1bswdvmv9FoyOxK2OlH2NBHZ9pIXdlGadZCZM9HU8pRUcZoXr9iWsFgS8TWTMzVS8/OR9zOPlvMQU7HVVLF9VDH/EbOfT/e0kh7zUlox01awlZMwvRGzeBF089Kz8hM1sRKZsBUUcVYTcZcSchbPdr3PnTUSHjGVea/W2DCX0vI3ErO0kTc0EPhyEn5w11ZxupOzd5Ky9VIzstDe8dMU8pPTM1cSsxtQdfnPffNQ27EUe3BVG7CYU/G0kvMy0fVy0jqyUZexk5LyVhD0XZF0t1E281DeMVJXcFRVMFpXMNvSs7mQd/LSPPEWvrBc2zEb07J3kTZzkFZz0RN0UhMyVZIxuNIy85M0MpQ08VM6MNJWcRYVcj8VMfpS83hQNzXPmfNRF3LTFbLUEzHeEXK1ULZzETrx0ZyxElfwE9JxW9JxdxKw9pEys4+2shCeMNKbsBNV8FHRsVNP8pmQcrfQs3RQs7FRti/TGbDTE/FTUzAY0nC20fHzEjLw0fSwkPhwkFZxUZLyE9Kxl9Ixe1AzdY+5M4+7cpBdsZBXr5TVbvqVL7fScPaQsjSP9PMQe3NQlzISFbETUrDV0DMbEPH4UbH0UjJykfmyUteyUxUxFVOw1pFxfZHydNLzc5E39I9X80/TMZOUMJSTr1uVrzaTsXOSdTORdzKR+rFTWu+XlzDZU/LX0XZXD/ocTxx4kBvzUbvv1FlwFhSw3hXxfhOyONH1NZJ2cdS+cdaW85RS89fR83bSdPMS+TNR2fMRU3PSk/IWUjLakbK30vIy07K10fM8kHIXkTFWFnCTfG/ScjCR7/URcJJS8E+58o6xGhGukh1vT3G2T27RU+/OODhOr9MTL0/ysRCvPRJvUhbv0TixUT92ULsz0nezUp+0EtW21BU0mtXzNld1c5WccptUNvuS2rVWVXXfEtk3VBXztRVb8xnSOzTSkbQ3URnw/9Jyb1iWb3CS1vCdT/0v2RF08RTR83FU07Iy0lGztBJRtjiP0XY4kBKy8xNVcPGUVDJyVVSx8NaSOXLYU3exfJKac1xRVbS4klQz85aUNjNZk3uy3NIT9rrSk/Y0FNL8NBoTuHG2lZl0NpRTu3WZ1Ny1uZYds3M9mjSzPFRbN52VFve3V5Z8Nt7YufO1v953tn9XnTmZ1FWa2xXWeXY72zo2eJgX/Lr92/95HRZW/Lta11w5mlVXfLma2Pf0+j03tfd9/rf3XhmZ3d2W1lofmpZWWRrWmj69nxnbXRqWltqbnRhduv17ODV0NfY09bl7Ojw8Pn97vXu/n7t5+Xm4+Tne2r4/mxbW2BaVVNcaWZqdezy9+Pj6+zo3d3i6+nybG7zfG1y+3Vqbnp+/X58bWX77nh38+jrd3t3dGtraGJhX2NrYmtse/Dp7H19/HBlXmBicnVudfz48eHf3d/j3+Tq6ebu/fD4cX7v/HN77eDe3NrZ3t3d3+p8dWBaWltdX2ppcnB89P17e3Jpcn13/Wxqcmlqbnzy+nBw/H376ejw8+/k5eji4uTs5+X4cHrxcmJtbmZcXGBgWF5tZFpdZWFbW1tkY2Npam569e3j3NTR0NLW2d7h4N3vbe7m737u6uTf39ze4OXm6/b/bV9YV1hSWV9qY11rfnZxdezt7eHe5O7r8nh2bv7z+Ozv8nr46+5ya25qZnNwfPr59PtycO71eG1tb2ppdHFxa3J0bmVlZF1fa11cZ3BqY2Zz9/7z5dvc3NnW3e3q7nFmbf/09Ono7ufc1tzf19XV3NjX3/hubmBaWWZmW1xjZmlxdWhtcH1tb3VsYWFgaG967Ojp7u/r6OZ3++/78+3o6eHh5ur07nR6/XlwbGx1/mhdZ2ZhVlRXUk9TVVhWXmllX2VtYmnv7eHXzs3Pz9LV2t7ucm145eDl4dvX2dre3Nvj6Oft8O7+aF1ZVVZdX1pbWl5ubmb73+Hq5+bi8v5+cm567+jp6ev0/e38aGpwcmxqbvr+dv3+bXFyc25tfHp1fPp7b3559G9gXVlXV1ZYXGBfaWdgZGhmanHm2t7a0trl6uXwbGR88e/f2djV0c/P09XP1tnY19rm6+5sWVdcWVVTVVlYWGJfZHf//vR6d21kZGhqfvTp5Ov06eT7cXzu6+3f2+Ps4eDu+/T8al5qaGBgbHRlXmV4Z11mWlFPTlFRT1VhYWBodnVpbO7q6NjNzdDT1NXe7urz+ujf3d/b09DZ3NTa5uff4HppfftfW2BeW1leWlZcY1tcavHq493Z2uz7+Pf6fPLk4v568vpuaGpoZ33w+Xz7+nRsb3t8Z27/al5ifPxwePft9vHr92xoZlVOU1hXV2RlXFtoc2Vndvrx5Nvb3+Po+vx97t7X1tjS0s/MzM7W2NXT29/i5/9oaG5qZm1hVVVZX1hYWFtaXXb2ff//ZGdufuns8u30+e3h5Gh4eW7u3t/a5/XndWl4cO7/Z2JbXl5iZVxkbXpvZ3BjW1dSU1VcW2BgYmJedfT18/zm2Nva19DW9nHq4uvc0d7e18/W2tfQ2OPe1uL1em1mV1ZdcW1fYmlrWl1pbWNnef367N3revPc5+3f3uh49eVrXmx4Ylpl+fZ7dO94YWBgeXl67u15e+peZvF+5Wpv3+R7dfhoWVNbY1pUWWpmTlhtYmVcbubv29/faFf5euzQzNjV0M3R1c7I0tbNzNDZ1ehsfV1saldeYVdVU1pXVVVsYVNOX31iXHB7WHDZ3nTy2dDean56c3Dj3PnX3OHNT1zS4VZc2N/g41ZPa2RaVl5l8mpb8G1UU2tlXE5p6W1oV1h3e+3+ZG/p4Ovs2tv/9unW0vLg0NvdzM3O0tfV4unZ2m9c+Xz6W13vbV5sdfdfXmpuaWFu93hvbH54YP3oeGvm3XX5c/78WmT3dmHgdmJpcOl4WW7ne23p2+9obnx9XWRpeHb8d3R2Zm7uXFf5aWNfVl5hWFRsa1vn5v5yffr4duDp29DPzMzOycXIysnK0tbV1d/y5N7zZnvzXVZeYFlXX2peWmBec2JaW1RbWFVcXv/w8PHo7e/6be/4+erf1+nm5O7md3dnYmpq+25pandmZ19cXVRVWlNVXmFcWVlbY2RfZltiZGp7c3JqcvBvcHrt/XHo3drR0NHPzsvHyczNz8/a2t3t7fl39m197nJvXmrw5+F5bmvz6W5oYm9kTVReX1xfd25YW250XWFv7+fg29v4/PLm9WpsffVobHrh8+fi3eFqfmVeXWJtYmVgaF1YXFpTU1VcXVdYXl1nal1aW2NeU2L57//ZysvOy8TKysnHx8fRz9na9P7Y9fvx9+hdTmv2a3Lu82dk+m5fXllhUktMVlRVXWtgZdrka2/b6NrPx8zQ2OLa3+n05OxeXFFUY95+dfn14epQWXZbVVp3XlRZTlVWZP9eeWZZe25lc2P8WnRqUllaW/bOztDJx8zP5M7K0dbp2t36c213eGRe3/RgZVjgdmfn3/Hk6+hmWW1mX2RvYmBYVGJfUllZbFNWa2zZ0ODQ8N/a7nlV8FtX1/XO6s/nXNbc097a3OJo2udual/7XltYTU9gSltjWG9YcF5TaldcTkxUWnrg3NTKy8/KytPQzs3T1dnP09NtX3Vo619ZUFFkWHBoZXhn/WNjalZOYGFVfllnamJfX3d3aWtwauPQy8zSx8/a1u7y2/Dp3efe4O12+Hxy7WrydmBkVWRgVlxaX1tYXlpbXGdwaGD4YV95bW1sX11dYG/i2NjQ0svLz9DNzszR0tjOy+XxbHjs5fDtbHD/bfL06/Xp8HtqZ2lWUFBQT1JdVlVfW2RdXVxYVmbp5d3a19fl5tvm4vP22tri5uzd3fV85td09ntwfV5rXWNUTk9ST1JNUllYU1tmX1pWZF5aWlxXXGH94+bc0dLVzcvHy8zIzs/MzNbU4+Dc4u7n525xfHT+bFz7YW5kbH1uWl1XVmZiZ2drYnB1+2pcafL28Orb0dbd3OV77fX7c2745+v5bvzsdXp2cVtdaG9eVV5bV1hbWltcV1VcXG39bHBrZmhqbWBaWFhfdPXl293Sz9nUzMjOzczN0tfY1+fv6ePf9fjqdmlobXT+93H86vx3cW1dW11fXl5oYV1kZF1bV19eXGN8/u7n5Obk3+Pw8Obp8O7f3+Pl2tri5+TycmplYltZWllSVllWUkxLUU5PWV5ZWVhbXlRVWFdaXHrw5tjNzMvJxMHBxMTEx8jJydHU2dje4ev9eXFmXl1dYmNfZXFmZGReWlteZmhfaWhrY2Nncmdr8//8dOri5u3e2t9+9vRmX2z3cGp56enz++fsal1fW1JUVFVXWlhfXV9YWmNlam91cGpmZF9eWlxaXGBjavDl5NfOzM7MycvO0s7O09nS0tjl2trtd/TqeWdt+3FndO7xd3r7c21pcm1wXlljYl1cYmZlYGlra2txdvjt6d/f5u99dv5wd/Lq8O7e29/n6Of6Xl1fW1JOU1ZSUFlaU09VXVlWXF1ZVVZXWFhWWl1jX27p2tLPycXFxMLGycrHzczNz8/e1ej4619qc11tXFdwZmJaaHtgXWRye2lxenVnX2ttYWB2/3RwfvDo7ere5unk6vNuZWllY2Rpeftw8ers7fj/bWJeYWBbWFhbXV5damtoZV5qaV1eYV5UUlZVUk1TV1VaZuzW083KycrLx8nMzczMzs7LzdHb3dnj+/X5em1qdfb5a3n6dGZfanJnYmNfXlpYX2NbXWlrbmt07ev16N/h5fX6+25veP33/fbs6/3v4e/5fH5xXl1mZltUVF5ZV2FualxcXmFaU1ZXVFFQVFdVUVFcaWru1M7OzcrIysrJyMrOzc3MztHR2uPw9vT+dHz9b2tzc2hfXmViXGFsbWFbZ29jXnFyZ2Ndb3h4+Obj5Ovv5+x2bWlpaGh19fr48vDv8PLx/XZ2cXBubW1qYFpbYml3ev/5aV9iZ2BYVFVTT05QT0xMUltmdeHY1dHOzMvKzMvLzs/My8rO0M/U29rd4OPp6ur1+HtqaGJaXGFcX1xXWlpfZF9gZ2hiYFxhenPy5ufh6ezm7fj9+/P7/frm5ezp7vX4e3ttYWx4cGdfXllUU1pbXmVsamZfWVtbV1dOTlBOUVBRW19t7Oje2NbUzc3KyMjHzdHOyMrNzs3Q3dra4OPq4ebw+m1lYl5fWltfXl9bX2VqaXByamRmY2BgZWr+7PH28Pf8dXNybm5mZmx3+ezj5e1we/N0amh07PP9fndrXl9mb2hme25qZGJnW1lVUU9PUU5MTVBZX2396ufd2dDNzMvLzM7Ny8nJyMrJyszP09fW1dfV1+P5dGxfW1tcWlRSVVVXVVlbYl1ZZ2tjW2N4/HV+9PPy9+3d6uft9/h86Obm4eDm+XX2bmdhZXL9bGFeXVZRU1hdVlteZVtZW2BaU1JTVVBTWV9eZnbt7e7m2dPVz83Nzs/QzMrLzMvMzdLT09zd29bY3uDo/G1qZFxXWFxfXF1jbmdiZHpxX2ZzeW9y+uxzc3j0fHFsevtoZ219enzu3t7e5uHyaWVnbnB6ffx6bGdqZmVgXF1fYW1sXFtXWFJPT1NRTU5aX11ebfdw9ufY1dvZ09LV087LycnJxsjIyszP19nS09zc5O16Zl9bVVZVV1ZWWFxcWGBdYVxfbG5kbW1sa211ffdub3vv93z66+/66d/d297r7G5jYXBmX2VlZl5hYl9aWVxfXmVwblxXWFhWVVZaXVhca3psefnv8vPq3Nre3NbS19bPzc7OzMrKzs7P1d3c2dvj49/nfWhlZF5aXmNjWl1jZl9eaHduXWXu7mdsff1qZ216X1peaGpdZHr4+fPj2tve6uppXGRzbGJlcf5naG1zYFpidWZjbXBcVFhaXVNQV1hXWF9yaGdq8ux4duvc7vXe19jY1M7Ly8rHxMrQz83U2trW2Nze3+F7amxqZGBfaF5YVVxjXFtocl5g/u9rY2f7+2lte25hYnD+bWh08Pb+69XS3+/sfmJeX2FcWFpvbWJha2hfYm7tcGBdYFlVVlxWTE1YW1xdYXh3c/Pe6Ovr4d7f3tbU29rVzczNzMnP0tHQ0dfb1tTd4+Df73BqfG9tZ2FhW1VaY2FcW2NrdnP99nhre/dwZm1zZWptbnRxa3J5+uje3eLsffxyZFpeZGBeanhpamtxem9x7/NuX2JgXVlWUk9PT1dZWFdibnv97OXn8/bm4ePm3d/e28/Nzc3Ozs/R0tXY2dfR19rc3ej0eP7z/GxlbmZgYWZhXVpfY2dmY2drbmpucH5yZGhycHRsamhoePrq5+Lr5ufnfW1rZWFdZHN7cHN3fvft9/5ua2NmY15ZVVZSVFNZWFVYXGBs9OHk6t3c3t/d3uTx5NvZ1s/Nzs7Qzc7P0tfZ2N3h2d3td334dmVw9nRfaGppXlxiYV9eZGd7Z2dqa2hqb2pubm12amNmZG1lb/Ps9+/o6ntmdnxnWmRwaWVlZ/z8eHv37m5s+ndbWVtcT01SXFlWYGVubXvm3ebq39nh7urj7nfw3tfX087M1NLNzM7W1dLX3tvZ2uz47vVrdvfp73Z28PNgXWJnWVRh/nBgYnZqXmP992dfYWBbVlljZWFl8+Xt7OHefW559HBld/Z2YW71825u/vlxcnTua1ZSVFNOTVFaU1BWYWNnbunc5efa2N3u9elxavLW1NLOycfKy8rKz9Xb1NXd49ngcWdte2Zld/dsZWpwY15fZVxaX279amRl/3ltbuzvd2tqalxaXWtqa3Pr4d7o4+b3cWh3cWl1+2dkbntxcWlz9Xh2d/5kVU9UUk5SXGVeWWFybHfv6fHp7ebk/HRqaWly6dna1MzKysvMy8zT29rX29rf3ul9b3l8ePrj5f51dnVmZmBeW15nc2heX2duamVp/nBeWV1aVFdeZmBs8+Tl6+rq+G5sef3r5ufm/Pbw/WxldvL+cm9tXlVRT1BOTVZeX11gc3xla/Pz+O3l6/X+8/537eLcz83Nx8bIyszLz9rV0tnl4+Tpe2hubmtvcvrza2h1bmFgYmRjY2lpXV1gYmZlaff3cmlqaV5YXmxrae/g7/717nhpZmx1+O7l5ev4/31sY2BxeGpibGdcWFZWVVhaZnRyb333fGFv8fT6cvPtem/3+3j04NjV0M3JyczOzs/X29TT3eDi5fB97OXp7vDn5+37eXppX2JpamBdal1TVVxeWV5gZWdoaWthW1daaG387unq/nb6/HF46+fn3dnY4fL09HFobflrXWNjW1VUVVJRVVpgaHV4e3hsZ2hwdW397Pls++fq6t/Z0M/NysvLz9LV0tbX2Njc6vrx9nb97/b++vHs+Hh9b2NfZHtvYV5iX1hlZ2ViYPnr7e71dG1hXGBkZG58e2xfYGNeXWdv9+7r4+Xn7Xh0c2pobXFhWltgX15gXl9mc3t1eu72eHBraXj5fHNrcGVp+O/w7N3Uz87Ozc/U2NnV0dDT2d7l5Ojl5efl493h8OrteGpuZ1xbXmlcVVdXUVVWWFxeZnV7/nplY19dXWl1+vfw73pz8fH37Orf2t7f3OHsd3V3a2hfW1pYVFhZWVhaXl1lZWV1cGpxdHv+6Ot9b3D7+PHp3dna1s/NztHU2Nzb3tjV19zb4Obs7fPs6Ovn5ufs6O92YmVlZF9dXmFaWWFfYGp5c3dscHFscF1cWVtdYGZpZmRjYl9idPz67d/b2d/i6uz8ef16ZF1dXmBbXmFsaWlobW1vcnBtZW/69WhvdWlfXmRqbv3o39zZ0M/P19rb2tza2djX2NPV19rZ2Nfd3tzY3eTz8/5mX15gWFJWWlJQV2FlZWNkYF5iXlxXXGBfX2Fqcm1tcPzvfe3k4Ojj3Nfa5Ovr/GRjYmBbW1tXUlZXW1xZXWNoZ2lmcnh5/ujye27892hu6Nzb3dvY29bS0trc2d3o5+Le4OXe4d3j5t7e6ezf09bk7vDoeWhlZF5dX2ZfZm/78/z2fWpfXFdXVVhbW1pXVl5pW1ln9Px6e+De49zZ3ePn5+xubW5ya3lqb2pfaHBoXmFtdGFfcPVuaGr9bl9cYlxXZHTt7/Hl3uXc29jZ2djX2eHf3trc3trQ09fW1NXb2dLW4OXs6m1hXlxaV1ZWWlxdYnBraV9lWlJPVVRUWFtbVl1mb2l849rb3NvW2d3d3Nrk6+/3bF9eaW5nXWFpYFtZW1lbX2RfZGtzcXJ9fWtjY2RoZnrt4N/f49rW3d7X1NPV19bf6Ovo+O/q4+Lp5uHf3tvb2dzi4uDteGFgZWJfZm1ydHL38n1rZ1lXVVVWUlNUUE9XW1tca/Ho59/h3t3f4t/b3uHr7fpwa312dXr6+XV5bGVfamllZ21wbmpub2VbWFpYWFpmb3B37+fe393Z1tTS0M7P2t/e3enk2trd3NnZ29jT1djZ197peGVdW1pcWl1fX250al5kY1tTU1dVUE9VWFBQWWJgXvnf2NvZ1dHW3trZ2+Pq7O1tZWlsZl9nfnZpaWJaWV9iZl1p/fttefx1XldeYWRfa/fm7fHc1t/e2dPT2NbQ1+jo5+t1eOrg5e3l3t3f3tTP2djU1udsYmpgWF1tc3vz7el0bm9mWldWV1JNTk9NTE5SWVle+97l7OXX1urk1tfg4+De7nL79Pz17+bj7X51b2VmXmppYWt0al5eX1tST1VaVlphfHtx9N/d3djRzs7Q0s/V3OHc3eDj3Nfc3dvV2NnTztDX2972Z1tZXFZWWmhpbWptZl5cXVpWUlRaVFBQVE9QVF9sc/nd2drc2tbZ29vY2t/s9PN6am9+e3x1d3BpXWBYWFdZXWVnbnFkZVlbWlxXX15ibXvu7u/p29jU09DQ0djX2t7i5uPn7O/n4OHn4d3Z29fU0NLX3ux7ZGVeYmdufvvt9m5pZWBfWFdVVU9MSklLS05UWl1hbPr19/Ll6eDg3dnb2t/p6+Pk5uLe4OHu5uxxbmNdWltcaGxoXFpaWlRYXFpbXGNmaGFx/fXk3dbPzc7R0dPX19vY3Nvc3trZ3dnU1NPV1NLT2ud2bGddWVpfX11cY2BcXF9cXFpXWV5XTk1NT09TW2Vu+Ovn5eLf4OHm5eLc3N/q6PX96efp6ejqfmxrZWBaVlRWW11oZ2BgY21wZWl3bmVqc3Ftde7s7Onc1dPX29XY3+Li5eru5ubo597e3tvZ0tLT0dba3u7t7XVmb/5yZ2d0dmxxbWhjXFlXUEpJSUlLTFFcX2Jtff5+/PHt9Ojd2tjb2tba4d3a29zd3+by9O39ZVpYVlRQVFhYVlZZXlxYX2pcV1thaWNkfuPf29LOz9HT0dTW1tTS2N7c1trY09bZ3drX2+Xr5+9yZWdoXlRXXFtZW2hrXl5vcG5oX1tUT01PU1dZZXh9fevi6ff88O7r6uLi4+Hd3d/n5+Xt+//w83t6eGtdWl1cWFdaYWNlYmxzbWJkbmRdX3Bwa3jo4uDg3Nrb3uTi3drh397g493Z19jZ1dTS1NbZ1trd4ujy9fduamhudWxscWtkY2RdXFZPTkpJSExPUVJXYGVoZ21vbn3q5uLb1tLO0NTU1Nbd29ze4+Ld5O97Y1tYVFRRV1hVVFdcW11aW1hYWVpfZXD97N3a2dXV1NrX2tbS1NfZ1NDS0dLV19va3dvd5+Th4e98fXNlZmVmZ2ZnY2JlaWJhYV1XWFdSUlNXWFtgZGZ0cnRy/37/8vr17+Ha2Nra3ePk4eXq6u/48/H+eW1mXl1dW11eXl1bXGBiX1teXltcXm51fffg3N/k3tre49/c2Nnb2NPR19PU1trb19fb29nY297d6PP48Htye3NxbmdeXVpVUlBQTk1NTU5OT1RYWVdeYGhnY3nr8Orf2t7d1NPS1NLW1Nbd3NXa4Onn8WhjbWlYWFhbU1JUU09PUE9RUU9VXFVabebl6d3U2NrW09LW1NHO09PQzs3P19bT3d3c3Ojl3t7u9fP3+nRrbX5saGRoXVlaYFlPUFVTTU9SVlVZWVtfY2Fue21l/N/s9Ozc4ejc1Nre2dba3d3f3+TqdHryfmt8eWZgZ19XVFZXUVNUVVRUVlpcWl9t9vx86dfb3trW2NjW1NbX1NTPzdDYz8/U2NPS2uTd3O/34uX8e3X9ampjWlhdWFJUUUxMTkxMTVJTUVVbWVlfaG9ndOff4eHi2dXW3NTR19fW0tja2t3u8HZtbG5pXmBiYFpaVVBPWFNPUFRQTVBYV1trdf325N7Y1NLW0c7P1dPQ19bQztPUz8/T1NXY2dre7Orr+3X+cmlpbmJcW11dXWphW1dXVE9PUE9SVlNVXmNcXWZqZnnr5vPx6OXe2dnb1tXV29LQ2uPf5nJ3+3NraGdhX2liXFpcV1VYWlZUVFBOT1pZW2v4cHvm29nc19PQ09XV0NLa29LQ0tHNzdTW09be3uLu+vhrZWtsX15kXlpebmBdYmRZVFhXTk5UVVBWXltdX15bZn3+9N/Z4OXZ2d7Z09DT1dbW2Nri8O3xa2dxaGBeXlxbXmRdXV9ZVltdVlFQUU9TWV1l9ev66drZ2tfR0tjTz9HSz9XZ1M/Q0c7N1NrW2uHj5v5zdmxgX2lgWV1sY2FxdGZmX1hQUVFNTU9OTFJWV1VYWVxjdPPv4t3c2tXW19DO0tLPztTW1uP+8et1dftvYl9gXlxiYVZWWlRPVllOSU1UTk1ZXl5t8+7l19rZ19LS1M/Mz9LPzs/OzMvMzc3T2dnd6+n6a2xsXVlgZFxYYGhfX2lnX1tYVVNVUU5QU09PWmJYV2NpZHTf3N/c19rb1tXX19TX2NTT2uDm9Wt493dna2xhXmduZF9dWlhbVFJXV05OUlVSVV5nbfzr5N3Z2NfR0dTUz87U08/U2dLNztDO0tvh3+X07PhubWxlYmx9Zl1temVfbGhZVlpWUU9OS01PTlBcYFlcanpu8d7d4N3Y2tvZ2djU09TT0Njk4+V7bfjub2j8/mlobmNeXVhSVVdQTVJVTEtPUE1QXGRge+Hh29LO0M7Mzc7Ly8/Szc7TzsvM0dTY4/X1c2Rna2NnentpaGxhXGVuYF5lYFhYWlVRTk5OUlhXWGdwZm3n3OXk3Njd29jd4ODj4tjV2dza3u9++m1ka3lwb/z3aV9hXlhaXVhYW1hTVFdPTlRYVlZgbHTu39rX0M7PzszM0M7O193Z19rV0NPZ3OH3cnNlY217+fDm7W9rdnhqevtmXWFdVVBQTUpMTk1QWVZXZXt0/+Pd5eba2N7e3+v26eDh29TY3dnc9H3p7XX96u37+HReWlhWVVdaVFJWVE5OUE9NUlhVWmz++eDW09DMzMvIx8vNzM/Z2dDS2tnS2ODp+WJeYl9dbX5vc/V1YGBtZFxmbF5ZXltTUlRST1JXVlxqa2r55eDg19Xb29bb7vH5b2798O3h3eHk5ftpdfl0bPzr83R1dmhiZFxaYGBbWlxZUVZdV1RdYF1mffXx49rZ2M7LzczN0dfa3ejn3dzh2tLe9vDzbWh2+fzy6+zm4e5++u9zY2dwX1RUVU5MT09OUlZVWmZkYXbr7OXX1drb2ud89ev+d+vf3tvY3erk6Hp+5fBt/+p0Ym9rWVZdWlJYXFRRVVZRU1pXU11rXl3+5evg0s7MyMXKysjM0tPT2d3a2N/l5n1iX2JdXGZvY2L/7ffw92948f1qbv9jWlxeWFheXltbYmRmcHxw+97c3drZ4e3o7WhmdmtlfOjw8+bseHX5+27+9Xh97fVwdX5qXWdyX1tlaF1eYVxbXl5XV19cW2j9+unYz8/NyszNzc7X3tvc39/e6fT1dGJibWdjafr89N/e5ubi6fLu9mpiaGRaWVlST1NUUFJaX1lba3P+5d/j397f5uXo9XX47PLp39/i5eXk7Onqe3b5937+eGhmY2VfW11cWlxdW1xbWVlZW1pZXWBkdujd19DNysnIyMzNztXY2tve5uf5bmVjXVhbW1pievr59ezq8uzt/3Z0cWpsbWJdXl5XV2BlYmNpb3z26ufl5OTm5+vzcmxtb2148u/w83t99vp3a3F3/vl+9/j9dnj9dHRzdHtwaWlnYV5bV1ZXWFdbY2d06d/Z0s3Mzc7O0NbZ2dvc4OPp8PdyZ2loYGF28+3m4+De3t/l7/f8cmlubGFZWVlVU1NWVlhYXGpwbnnv5+fr7e/y+vv3/O7q5t7e3uDe4efs8/d5+u96dv54bGtnZGFiZmBeY19ZWVpXVlZWVFJbaW7539zZ0szKysrJzM7Q1tnX2uTr7fxqZGRcVVleX2hzfnj48e3r6ul4cHxtbHp0Y19mYV1dZmVibnd+8Ort9Ojn93L59mVkaWllbvD5+O3x+/v5eHL9fHj+7ez56+j2evbtd2/+fnNtZ15cW1VSUlJQWGVucPrk393W0NDT0tHX2tnc3dve5+jl8HtzdWxjbvv47ejj4urr5+js/GtocGRdXltXUlNXVVdeYmVsefHp7uro9P19+vP6dHb/e33v4d3m5uHm7vPw93p0cnt7fn5vcGthY2RjYF9gXFpbXVpWV1VXXWj+6d7b2tTPz8/MzNDS1NXc3tzi7PX1e2lpY11dXF9jeXhz+/Dt+/Dp9HNrcHRwa2loXlxeX2ZrcPzt6ujg4eLk6O35/XRsaWJdWl5jZ255fndz9vT+ff96c/3r6Orm4ef1/X76+3t3cGtlXVxeWlVVWFxdZXzw8eri3drX1tfa29rc4Ors6e779PDz+/f6b254/u7m4OTm3d/n6e/8cHNwY2BgW1RWWVpeZWdocvr9+Orq/Xv6/3N0fnRra2NldPr8/evn7Ojf5/zu72146+r49+z2c3B0ampuYVxdXFdVW1xXWGVnZ/Dp8OTZ1tnV0NTW09Tb2dfk7ujseGx+fWdmbmBcZ2dfbO/1d+/l93nw8mx39XRoaWlfX3V+cfnm5+Td4ezi3ul7d3pjX2hjWl1fXVtfZGRv9/R8/O92b3lyb/De4Ojg3OLn5+x+8+xzYmVkYF9iYlxea25tdH346uHl6efg3+fi4uni5O799/Pz8O7q93p8fnVwe+7i39/d3Nve7e76bWtqYFlZXF5fYWlobv58ff9+9fz+e29tfvZ1dXVydfz9dv7q4eXn4Onv/W9nZXH+/fPw7O/q5X1qaGdfWllYWV5gX2Brdvzw6+3r39vc393a2tnb3Nzd3uv18Xt69vF4a3JuZWFdW2Ftbm375+Hj4uLq7+zxfXlyaWn66/795uLq9e7s7Ol+bGxrY15lZ2BeYWZgXmFna3b9c3vz9Wxobm536+Tj39vc3djb5ufrdmFhaGFgZmleX2lmZ3V5b3rr73b85/J98+/w5+Hu9Ojl7ejd3vP37n5wa2958ujs5t7a3uTe6P95d2phY2BdYW1qYnR7ZmRuenr6fW1seHppbfhxb/3zeW7u6Ozq5+767PdlY25rZHfr6+3n5PHv7H1ubGJXVV1fXF1tbGl6d2755ery5N7m59zd5OLg5unj7Pnx6PB37up6aWlfV1leXV539Xvs3d7k3Nnk7ev0cHvx/Xbw6PP35+t1fO39b3Z3ZV9nXltgY1laYF5cZ3l3fPj4fXl9bW357vfv397d2tfc4dve8/v0aF1mZl1cZmldXmJfYXR6bG/+fm5x7O/86ePt8eLh49/g6eji5fh6dGlncHV77Ojp6uXe4uLf5/5xeWtmbmhiZXZtX2t2a2l6em16/HJqdnNpa/12Y239fXju6e/s5+9zdHhqaXV+evHr7u7n6ff483tkZGxmXl9kY2dqZWdtbG5+7u727+bn5t/f4eLm7PPt6/H28Pn98fJ0bGtkX2Bta2l89fb05t/k5ufq+fLq8/r1+//47vL++u99bHd4bGZnaGpsamliX19bXWRjYmh3/fz/+Pn77vDx6uvw7+Ph4d7d4evm63h1d2VdYGhfXWBmYF9rbGhubWZr8evs4tzqde7k8fjo6/vw7O3t5+1weuvt9u3ufnvv7fDn3+5y8ut3c/l3aWZoaG18cGN17n5w+/1paHB8c37zbWJucWRpfnBoeOvz/Ozqe/Hf7H7v7nZu8+x4fur8af3ybmdsY1xea2JcaW1eafl3bX3z+Ozd2t3Z1+f95OP4fPp2aXfzfnry/mRy6ntoe/Rsb+3r/e7g93Lo53t95+5w/+ntfuvn+/Dl+2t7/Wdp9PtlZ31mWWJkW15lYmV97/976eTv6d7teu/ybnPr7HXw3/D33uF1b25hYGdoXFtub15memZgbP599NzZ4uHa5e/j6mtrfHNs/O9+feXg7urk6/b3+2927O56//F8/u/4b2/4d2v473r65OT18Ov5c3Z3aXrrd2RocWdga3BjYHZzaXn4dfzg3uzu5et1dXRka/n9cH3m5Oro6f5pa2VeYGJfZm5rX2V3cG735+Lb1djf3dvg6e39aWdtZWJsdHB16+j77uHtcHT5dXT1+XP85u188PL57O3v8+re4+3m6fn79/1ubnVxd3dvZGhtXl5mZWVnZ2Fkb3779+rr9O7u+Xt5fHn97e3t3t3k6ubm+3ZtX11dX19fYl9fYGVsbfDj4d7f3d/i4OXv+vxwamdkZ3f+/u3s6eXu9Xtw+/j7/XX57/P07fT27fXv7/706e34+/f4em9ycHP5+H18d3p6bm1uam11aWdpZ2hu/vb+8+v2ev56b3d9enb/7urs5+nr6+//amdmYWBmaGJiZ2dlaXD95d7f4t7d4eHj6O32/GxjZWZlanBzdH74/HR3fHT16vf36ujt6+Th6Onm9f7v7PDw7vt6fP14aHn9dn77d2ttb2lncHJraXBmYWhlZWxwe3v87/j25uv38e71/e3o6uri6/jw92pmamljZmtkXmFiXmBwe3rt5+3x5+Ln597m8u7ydGtycmttcG9ueH1uePTu+vbr7/Xr5+zp6PL49PD8/e3v9/L3dHNzb2ly9vf+9PNzdH1zb251b2lwcmZhZmJhanJxc332+/Tm6fLs7vr17+/v835xbHNza2xzb3H+dm1pZ2hhaX3++e7t9O/q5+Tk5+3z7v5pa21nZmlqa2tvc3Fy/fj57urr5+Hi4+Xo7vPs7/nu6PH58fd4dXp8eXn8dW5xbGxweXZveHZwbm9rYmBfXWBudnT27evn4+Hj4+br6+jl7fT6b2pqcnBobGxmaGtsZ2hqZmlucXL/+3h6+/Dr5ODj5ent9/17cWxoa293eXt8/vjz7+nn6+ro8PXt6O3u6/D08PDz9Ph7eXNtbXV+eXBvdnp++vj+/vXv+fd+a2ZhX15kbG52e3l+7uXk5ODm6unt8vt9b2dkZ2dqbGxtbXz5/n18bml2eXB58fR79u7w7OHh6urt9XpvbWNkZ2hoZ3F3cXZ7fvfq6u7k5e3p4+To6ebp7e3t8unj8Pt+fG1qbGliYWlnaP5+e/To7Xz59HRjYl9bZHJy/PDs7ubd3ubg3Obq5Ovz+XxsYGJkXl5qaWNwfW9ra2xkZm5lYHn6bnb18Ozj39/l5enu7e54dfX/bm54fHr883Zv+nps//F7fPLyfv3p8n3t5+/u4+x7d3x4b3l+bGp5c2197+7r4eDp7Or7a2hoXl1jZ23/+fvu4uHs6eDm8Ovr9/92Z19eX11ebfxwd+/9cvz3cG97dmhu8P9v8+767+Pl5ubp83z8fWtufW1mbXlsa3f+cnjt+33t8Hv27vr56eXp6+Hh6OPl9f75fGlodW5janZmZnv+ee/j6e3j6XVsdWZfbXtxfuvu+ezi5evg3ezu5vVscHJkXWBjXmJuZmV3fmxv9HZpbXVpZ3V7bXbu9PDd2t3h3+Pu9PV1cPT7amt7a2FocGpr9e56/fpnY3l5cf7s6u7q5Ojs4+X69uv6eXx9a2ZydmZs9/304N7k4eXt/nBuaGh8/25seXN2+uno5t7g8vrzaWRvbmZnbW5qamhkaHl3a3D2+21vem5pcHZye+3n4tna5Obl6/5zc3RvdW5iYWBfYGZwd/vq5f1qcG5tefv36+Xl6urm5Obk4+/57uv3cG1rZmlsZ2f77PLw6ejr7u96bW93dHB1amd08fTw39ve4OHudH78b21xcWdpaV5aX2dgYm5xbHh+a2RvdWlt+fh85dnd4dzd5ufo/XB+8W9ocGhfZ3dqaf3veXD7bV9pfGtq8uv2++/9eubd5+jd4fHq6nRpeP1pZv18bezk9v3o4Ozu6P5pfPZoZnJvZHP09uze2/H+6O929vBvan39ZmFjXFljal9n/P1tbG5nZHJ+aXDs8vbm3ufp3N/w8Oz+bf5+Z2l+emVrdm1tfntoafx1aG14a2vx8Hd58vn55dze39re7/LweXN8fG5z7vN0fPt4+eTm8PPtfGhtdWlt+HVmc/Px7ebl9/rl6f7z8nh4e25jZG1kXF9saGv/dGdmb3JscPh9euzxfPjt6OXm6/X68PZvcHpxcX53dHh3dGtqcHJz+nRob359eX18d37v7fPm3eDo5+v6ffX2dnnz9X75/WxsfvL89Ojs+PP2cXT19HN1+fj28u3w7+bo8vTw+3R9fWZhZ2VkZmVfYW9rX2NqZ2NscnD66/P69/b9+OHi7uXe6Pfs6Pfw6fhseup8aG9oX2Vzb2Nob2ZodHVpcPN8d+7l5+Xe3u7q4Obr6uTo5+Hu/PHxenX5/HP++W1na3Bqb3htanvw/3fz6/Ds5/N78On5evV7bnb7c2t9/GxoamhhZm5nYW36dW57bGNpe3hy9evu8uz4eO7q+Hj27vXu6fN4fvl8dnl0bG9+b2l7/nd++Pn16Of2+u7vevPr+Pzq5+/09Pt1/e1+eevveP3v+Hvz631y8Ov47+v3+uzn8Hv4+m1zfWtmamVhZGprbXlzY2BnZ2Zqampze35ydPh0aHj4/O/m6O7v7O/t4Ol99ejt9vDt/G9sbWViaWdhZWlrcP77ePns6+7l5+zo4+bo5eTn7O3t9fj0+P718/Hw9XpteHlpZ3V4cHJ5fn7w8fbv7/P+/PX+d3t++3l1cHB6c2xtd3htbnlzc21qamtpaGpsamZlaG5wdXV0/fjy7/Lo5uno5+fj5ent8fx9cWVnZ2lvcP34/e/q6+3v8ezp6u7u6+r1dnx7dP/7e/3u7O/u6vD38PD5ent6+/D3efvr7Pr16u/+/H1tbHl5b3JwaGltZF5iZmZqevxvdfpvY2VsaGpwcWlw8v11+/xwfO7v7+fh6Ozk5O3n3uf8+fZyaWVfW11mZmz89f/y7n177OXm5N/h5uLk+XN8e2549/l+7uXt9O7u9+7ueW17fGxodHNxe/X08uzr/3VzbnD87vL48/R5bWZjYm5wbf7v+3dza2BiZ2hnaGloam5qZGx1bnB8/3x+8Pb77ubm5t/h5+Pk8HVtbWlpb25v+PD9/vxxc/fs6erq5er0e21tendy++7t8O7o6ezm4+7o5vHu6vpucPrz+Pbs7erj73t8cGhrcXttandtXltcW19oaGtz/ndoZmdjanBucn59c3Z6cG/87vp57u/5+fd4dfrq7Ojk6Onj6X1tcGlgY21uanz6cG17fvzw6uzs4+Pu8vx5/ezt9O3o6/n37fH16+vw8O/4e3VvY2d8/nj17O3n4+vz7+79dPz3eP75cmhpa2pudG5uef5rYGFiX2JsbGxwdmhlbGpqevf+ffPv+Xh5c3T58vLr5eLi4+Tp9PL2c2tsbWpubWZpdnFtevh7+/N5a2xvc3vu7O3s5enz7+bj6OXi4+Tf4e/z9Xn87u717efr7ufm7PLzdmxvcm9pZ2JfY2lpaGtraGtsZl9ma2docft6fft3dP319vDs7u7q6fZwbnFucXz+8uvs+nr29Xh7/nJpbW5oZGlrb371fXb48/f9/Xhz/vDv6uDf5ejn6+/o6fX98Orr6+z9b3Bycnv39PDr7fvz5+Tp7PD19fT3enr7fXn9/HVrbmxjYmNkaXBvam58fWlpbm1rcXhwffPu8fb3dG3/8//87Ozw7/D29e3tfXn1+X58dWpoanFubHBsam1rYmBrcHf57efo4OPs6efp6unq7e/t5unt6+3v7e/37+fo7/Ds7/Pq7fr27vpwcW9tb337b29uZ2JiYl1dZ3Fv++rye/t7bHLy8nVz+fX07Ov1fnp3c3ny/H32fm1scXR2eXZzevL5dXp3bm95/nlvb2tnZ2lqc+7t8+jc3OHi4+np4ej48/V9bXN+bWt99Xh87fD58fD7/u3r+O7l6Ovn6vf37Orv8Oz4dnRsX11kZGFmenx7831rZGRjZnBvZGRxc2pv+35weHx+8+Xp+/Hr9/np6v968PD57On2++77bHJ2a15eXldYY2ts9eXn597f7e3i5/ru5/d8fnNpa3h7eO/o8u3g4u7t5+vv6+v39ubv+/DzcXD49Xp8+XBmZWReYHFyb/fl6Pfu7nRpbWVfY2ZfXmprYmr9/m51/Xr/9fJ+fPT3ffLye33w7vfu5Ofw7e55eHdoXmBkYGJt+ffr397g4ufw8/D+bm58bmNhZmBkcnv67Ofq6uTj6Ong4uno4+Pl4ePp6ubt9/Hu/XZ9c2hkZ2diZmtscPf5bGdlX1tbW1hYW11bX2lqdPLs7e3p5u3t5+vv5+Xu7+vr7ejl6uvm7Xt++XJpZF5aWFteXmV98O7j4Onv7u98ev51bnh3aGx+enrx5+bn5OHm5+Dg5ePi6uvl5e3t6fB3/Pdze/D+dXd2bGdrbGdq/vx+9fptZGFfWFVZWFZaXlxhcHFt/u70fvDufvzq7O3l4ujo4eHt6uHl8u/ufP72dmdpbWFcY2djbe7p6uXk7vP1dWVqdmtkbHBrb/nx9efe4+ff4efk3N/l3tzg493j8ejnfXX48//67fd1fn5rY2loY2l5dG1zcmNdXlhUV1tXV15jYWt8e3b07vf06urs6ufq6N/b3eDh5+/r5vH+9vh4dndrZWRgXFxlbHbw7vf37u33dm1qZGhtbHD8+Pnz6+bl3dvg497d3dvd4+Hd3+Tn6vD9e3h0//bw8fn6end5cmlmaGxsb29udXdsYl5dWlpZWFtdX2Ztb251/3hyeXx+9O/u7eXh3d7l6O7x8vn49/Hz+f14cXRzamZpaGd4/P/16+3z/n1wa2tnYmZtdnr07e7q4t/j497e4N7d393Z3OXk5vX07vd9+/P49uns+Pft+21xbmhkY2NgZ21iXWFjW1peXFhbXV1hbm5odPxsan31+vTp6ebd297h3t/t6uXu8u7t/v3u/HF0e2Zga2lganlweO3reXP+b2Rla2Zo/f548OXq8eje6Ofb293Z19zd2N7u7un7bHb/c37t9vrq5/V89v5oZWpiXWNoYmNtZV1fY1xZYWRbYGtoZ3F0ZGRsamRy+3Z86uXr593e5ePf5ujg6Pju6/576eTv8+95Z2hoYGd6dHP36/X9/nhoZ2tiZHB4bXrr7vry6eru5OLl3drc3tzf6+vk7frx8nNx+Pj36eTq7ev2b2lmXlxhY19gZmFdXV1ZWmJiW15oZGRsbGVma2dod/X78uPk6uPc3t/d3uDd2+Pv8fN+fO/v9/j7bGVoaGBkc29odvl4cHlvZWtwbGl4e3B77fT57+vn6uLf3dvZ2t7e3ubo6O/+//5wbW92d/Pw+fj0e2tpZmJiaGpoZmtoX19fYWBla2dkaGtsamthZGZgYWZubnjz6urn5OHf4+Ti4ujw8/d9fvXr7Ozr7fxzb3Vzd/7/9fb3/X54cHN4b2tqbWtod/x+e/Pu7Ozt6eTf4+Pg3uLl4d/l7PH3cWtvb3b48PTt7/pzbmNfZGZhX2dmX19iYWFkYmFfX15dYmViXmNsZmh1+3r56err5N7g397f4N7g6PH0/HJ38Oz29+3zdHR7/nr/e/75fnBxfm5rdH1ubHl6bG59+Xz76ebm49/i3dre4dzf7+3j6H337PhvdHZubnx8fHpxaWVrZ2FmcGlianBkYmtuaWl1bWRgYF9jYl5eZWtkaHv6evHn4urj3+Dk5eXq6Oz6fvt4cf7p7fDq6X5xfPh+e/Tz9/z1/PTyfHR9eGlpev5ud/Hw++/p6u3r6ubj5OHg3urv5+Pq8Ovn9254/HtydnV2bmplaGZhX2ZpY2hwdmx0fn5sa2xmXVpbW1xbXWRraGdx8vj86+Hn6uPi5Ofj4+Dm6/Lw833+7enr6+Xm+//4+m5y+/b//vv88/b6ff5saG14cG50+PZ79O3t8+zl3+Lg393i7fHn4u3p4+bz/Xp6bmhnZ2JdXF5hXV5fZWdscf55b/rxe21ubWpfXl9hXl5jamljbfny/e3n4+zv6ufs7Orm5/Hw7O17evLm6e7o5vb//n79fPLq5+nr6OLq+fn5cGdue3ludvz+cHR9/Pv//PTp6+zq5uz27eHp7u3n6PD69/N6cHBwZ19fZF9bXm19dXvs5/t+9/5oYWRnYFtbYmBaW15mY2l7+P706ubq9O/k4+jl4d/k6efi6vft5ufx9Ozp/HB0+351/eXq9eri7HBx/X1mZnN+bmx593119OXn8vDl4PD45+Pu7OLg6unj4Ofz8vH3cmlrZl1aXFxYVVxoaWt96ens8X57d2tpaGpfXWFiW1lfaGhqffjz8+vu7+3u7ejs9fLo5fL47OXx8e3s/Pb77fN4d/Lp7vTg2eLr5uN4anb1c2Jq/XZmZG38cW715O798eT5aHjn6f/p3uPv597j7+jj5fF1cXFsX11gXltcY25v/eni6X1ya21mYF1jYFlWW1pUVmRrYmT/6/5y9+fs7+Pb3ers3t30+ODc7Pbo5Pf+6ub9cPru93j26Ofr7ft9bWlsbWxrbGxoY2Nlbvnu7enf4u367Ov58dzc5ejb2un25d7s/PDscWNlcmJXWWBgWVppc2hx7vBoYGx1ZGBxemVdXV5dWl5paWl0/f95e/v57+bg5eTg5e/z6eXs6ODqe/3o7Ht38PF4eejf5uvg3u509+n8a3T1emhqcmRaX3N1aXHv7HJsffH9+OLc4Off2t/r6ufo5ufu7+3yfnVxbWRka21rZm74eGpqcGtiXmZkW1pgWk9RXF1YW3B0Y2Z7+XBv6t3l7N7W2uXm3t/v7N7g8/Xm6n1+8PV+fv349/L0/ntvbnr9+f36dW5uaWVocHRqbfj0+vLl7fvq3N3h3Nbb39zb3uns4+d1bPz1aF5mbGFcbPlsYGx7a11kcG9rbHBua2ZkZF5bYWdmYmZtbGlscW529e3t6uvs6ebrfH7n6Pr16O19evPxdG/y5On38ODk/37o6Pbz5Of8dPLya2RtdHFraW1oYmBmamZt8ePl49za2trb3uDg4OXl5eny8O39b3j2/3J49ftrZ21qY2BpbmJcXmJZUlVbW1peaWZjaWxtbG167unm4N3c3Nzc3N7d3N7i4+ru9vX+b3n/c3D+fnNsamhmZ3P6+vr98PZwand6dHD+/nBteHZqanb38OHd29vb2tzd3dzd4enp7fJ4cG1jYGVwbGx79nNtb3RtbXRzbWtvbW5kYWFjaGxxdW5pa2RgYGtwePvw7e7r7fHx8Pfu6OTl5+Xr9X59fvT5ffzt7/r16/B79+no8Ong5vh5eXBsbXhwa2ZnZF5aXGBeYnHu6eTe3ODh3tzc29zf4eTp9/v3/nd9+vny9fd5d29vcP9wZmhsZl1cWlhWWVxeXmVpaGRfX2Zqa/Tp5+ff3eLn39rd3drZ29zf5PD8+X79enNvdm5oZmxrbXF7e37v7vD+/m5vdntvcXx0aGNoY2NqeX7t4tza2tzj4d7c393d4+/zdWdma2ZfZWlrbXh1b213enZ7b212fWxlYmFeYGNiYWp5a2hnaGRnbXFv++/r7vb8/urm6Ojh4OLk4+rw6enx+fT3+Pv7c3r07evr6Orn4eHs+Pv8dXNwbW1rY1tZWFZZXWFlcO7p5uTi4d/d3dza2Nvh5u98eXx1bG99+fb39/z8d3J5dmtmbmthXF1bWFVWV1laXF1gYmVtcnh78ujo7Onn5eLe293c29vd3eLp6Ojx/Pf0/nN2bmpqb3F5dHv27ez69u7vdn7v8Xz8/HBiX2RgYmFocPn07OXf5eLd3eDf293k7O14b2pnXmBpZmhufW5w//lzefz0+v1+cm9saGNiXVtcYFxZXmplXmlvbWh3fX159uvl5Ojl39/p5uHh6+nm6vXq4+jx+Pd6fXz+fe3q6efg5PDw7/lvc3NsZGNeXV5cWVxiX2Ry8vft4Nrd3NjX2t3b297p6u71c2trdmplcHpxanV2bWlxcGtoaWRiYWBhXVtZWVdaWl1haGlxe3n48fL05uTi4drc4N7b3ODf4OHr7+zr+fX4/HRtbGxubHP57PLq4uDs5+Ln8Pn7c2pma2djX2RjY2Rsdv716d3c3Nza3+fp6PD2/nluamtlZWVqZ2xyd3b+9+3v9fH19nx7cHJoZWRfWVdaW1lYXWBiX2dqaWZu/ff37uLh4+bd3N/k3t7j5t/c4enr5evu9vn7fXz18O7s6uTm6/Tt7vhvaGJfXFteXlxbYWVoZXD27eve1tTX2Nfa3+Xg4+53ffd4am13c2treXNsaHJ5cmhqcm5oZmhnYl1eXFlXWVxeXl9ma2llbHh3b37q5ejg2tvf4Nva3+bh3+Pt5uPr/fzt8XJtfPt0ce/o7vbo5Orw7efseWpsamJdX2JhX2NnaWtx+fDr5d3Z2t3g3+Lv/PLwenF2fXRsevb5fvzx9H187u32eX77cWZsdWleXmNeV1dcXFdXXWJeXF5jY2Jqe/Tu6uHd3d7e3d7f39ze3t7e4Ofq6ejvffzw8H3+6eTq8uro83R79XVmYmhnXlpdXltaYGpmZnbs7eve19bb3Nnc5/Hp6O708uzx+3zx7fh8/vb8dnp5cm1scG5qY2dmXVxcXVtXWFxdWFpma2VeaHJsa3rk39/e2dfe393d4+nh3+Pn6ejz+vTy/G91e3RvcvXt7fTw7PT7fvbydG1tcWpiYGJnYV9la3JwfO3p6ePb3ODn6er59vD4/Xv7fHNwe+73+PTr6Pfz7+36eH56d21vcWtnYF1eXVxaWlhaXFpaWl1eXWJs+e/p4d7c4ePh39zg4NzZ3OPf4ODo7Oru7vr99/Pv7u309/B6cHR+e2ppcXppX2FhYVxbXmBjZXTw5+Pi29zc3OHl6ePo7+3p5fV9//r3dHb88/Z1eHp7b2hqamljYWVnaF5eX2BiXV5dXl9dX2FnZ2Rpc/Lv7ubd2d7h3t3e5+Xg4Orw6urr8/bz+vd7cHF3+Hz79e3s/v787fB+9O3o9HV0cW9jX2NpamVtfPHu9Onm5ev38fDv/P/z7+7+d29veXB3/evq+vPr5/d1//t3aGdtbm5laWxpY1xdXFtXV1lbXl5dYGFoaXD56uDi4t7b2tzb2tja4OHf3ePr5eTp/X7x7/Z5+PPz+nZ1b3BtaW50fHNpZ2doXl1gZGZjaHXz7u/h3Nvf5OLg4Onp5OHj8PP1+3hrdv3+d3f6/f14bmxnaGRhYmZpZGRqbWlfYGFiXllcYGhgXmdrbmp07eTi4tzc3Nzb2dvc3+bn6uns8vTx7ft9+/HuenJ+7fR0//L0dHL18/l2c3hxbmhpaWlnYmhvefj18Ork5uvt6+fu8Onm5fL6+Pp5anP38fx88evs+v/6e29nam1qa2xxbWtvbWliYl9ZWFteXFpdZGpmZnbt7Pju4Nvb29XU19zd3ODn7Onp7Ors6+vn5/L/fu/te3N1/XVpbHV9a2RqbGJcYWtnYWFsdHN1+u3s5efp6OTf4uLh4d/k6Ozs8HJ4/fl3bHJ+fGlnb3RuYmFra2tna21qaGhrZ2NfXl5cXV9gYmpzbGt46eLv7d/a297a1tne4+Lk7f/+7fH5ffPs7O33/n74+3l3+/H6dX328H1ubm9nXmBobGdmcPz9b25+9vl++evm4+Pi5eXk5+318/pwbHZ+enX+9/9sanH+e2lreHhwa211cGxpaWRkXlpaWlxbXF9oaGNobvnt8O3m3t7l39jV2t7c2d7q7efq8vru6Ont8O/z+Ht8/vv0fnFyevx0amhtaltbZW1lYW19fG5w9uzu9e/m4+Tm5eDf4+jn6+z6b2xxenNxc3R5bGJkbGxian71eWxz+31rZWhoZF1cX2NgXWBhYGFiY2VyfXv46uDi5uHd2d3f3tze6u3o4Oby7+vq7/nx7e/69uzl6PHv7/X9dnBtbWxgXWBpZGFobHptaXnx8nd08+jt8OTe3uHj4OTn7v53e/15c3j/fWxmaW1ua253+XxtcHh5aWFlaWVdWl1fXlpcYWRiYGNqdnR78Onk4t/c3Nrc3d7d3eTn5t/j7/Lr6fL9+/Hq7/bt6On7enx+cmlqb3BmY2ZmaGVjaG5zbG1z/fZ+/PPq5+vn4N7h6+vp5/V8+fX7cHB1fHVpaWtvb2t1fvb9c3z9fXFta2djXVxdXl9eXmFmZl5fZ25qbP7q4ODi3drb39/e4Obu6eTk5+rp6unu9Pft6vX37Ofn8f79+HlpZ2ptaGJka29ranB8emppcXR0bG5+9PHx6+Xj5+3r6Ont8PLz+nJtcP/+cG95+3pwfu/u/Hj9/n1xbGxmYl1cX19dXF5hZ2diZWltbGlv9Ofo6uHb2t7f3dzg6Ofj4+jt6Obo7O3p6+33fvny7/t5fP57aWRoa2dgZW55b27693xtbXFzcGltfu/x+Ozl4efu7Ovr8fz49ftvbXJ7d21wefj6ef3u6PR6+PT7a2draWNeX2RmZGBjZGJhYWNma2hmbP/u9fXr4t7j5N/c3uXl4N7k6ePf4Obm4uTp8vf07+719+7t+W5nZWlmYmFodXNudP17a2ZqbWZeZXB8d3H56+rv8Orq6uvv7+7u9X789fP2+vfw+Hd78/F+cXvz/WpjamtnY2Vqa2lkZGVkY2NoamtsbHJ6/fr77uXg4eDe29zh5ODc3+fp4uTr6+bo735++Pl+d3r1+nVtbW1rbGludnr/b3N7/nZvdHl3aWlvc25pdfPt9H337/R6evbz9v758/Dv+P76/fb5+/f1+Hj89/lyZ21wdGpseHlxZmZlYmBhY2VkZGRnZ2lsbv3u6Obl4OHi5+Tc2t3g3t3c4Oni4efu8Ovz9/96+H10b21tbmxqbHZ3bWtubW9tZ296dWpmam9ua3fu6e707Onw+fzw6uz29Ovu9Hx4/f3/eHp6cHJrb3h2cmptc3Nubnz5d2dma2xoZWdtbGdgZ2pra3D37Ofp6OLk5uzr5d7f5+fi5Orw6+fo7fvz7/d9ev3/fHN2/X18ef749n5wdvx9cmtvcG1iX2RmZ2Rq/vt9c3b2+v767+Xn7+/s7PN8e/fw8/P39PV+bm91cnZxdXx7d3R5/H5tZmxsZl5hZGJdW11hZmdsfe3o6uvl4+Ll4t3c3N/g39/i7Oni5evy7ev0d3D+/3FtcHRvb2htcXV6b33+eXFsbGhmY2Bla3Nxc/zv9Hp68O7x8urm5efu7e30/Xr39/n8fv1za2VnbGtsbnV89Pt4+vPx/np7fnVnY2RiX15eZGlmZ3X5+Pn67evp6Ovl4+Tn5uTl5uvp4+Tj6evo7PV8/vb8fHr59PV6e/Hy+X77/XlrZmVfYF5dYmhoaWxxeHp2dH7w7O3q4eHn7Ovo5u/06+zv7/X7/XVra21tbmpweXd3cHz4+/V7eHhuZV5eXV1cXmNnaWVufH73++vn5OLn397e4+Xh4uDi4ubq6fDz8fh+cHb+fXh0d3x8eHD+9PX8+vJ9b2doZ2NkYmlucXBwfnz+/frt7O3w6+bp6vT28/f5/fjy9Xx1enhva21ubnBxdvv79/zy7Orr9/D3dGpkaGZjYF5iYmJfZGxsamt+7evs7uno6erv5eLk5eTg5OTq7Ovy9n75+f/4eX3v9/Tu9O/q+PvweHFkYGNfX1xeYGJkYWtzcHN79evn6+ji5ujs6+jp7Pbu6/H3fPr4enJucXB2b295e/x5efh+fnZ+bW5uZWZfY2FdZGRgYmVtbnB18+vu6Ofm4OXm5eDf3uPo5+3r9vV+/n5sbnhyfHB1+/l+/e3z7/D38P14cG5vbGZgZGZnampzdHF4ePvz7Ozw6+vp8Pjs8/f9+O75/nf//Xl3bXx+fnl87fLt8O/q8/X7/nx1cmppbGhjX19cXV1dZmVma2x99O/x7enp6urj4OPi397i4+bt6e7u9nf2fvn+9u7w7PTy7fL1ev15bWllZmJeXV1gXWBjanBxfHn27Orp7eXj5OXp4+Tu9PXr7fT7/vB2cG51/m53eP30ffj++H7+fm52bWxsam9qbGJlZmNlZG96end3+e7v8ezk5+fs6+Tp5efo5u3s+vX8c3Vy/3l69vnu7Ovw8evs8fz59n19b3BuZWJeZGBgaWd1cHd8fPL18/H07u3w9vDu9PZ+7/T9/Hn89318eu5z8+bw43rs7/Xq/nptdW5ua2Rra2ZgXGBgXV9lb2ltbX78+PT55Oji5+zm4t/i5d7j5unu6/T7df309u7y7O7s7vHo7/twbmZ2cWtpY2JdW11dYWNnb3h5//bv7ezy7OLn5ufq5+jr8uzm6vV7/P55eHD5+n19evj4enh7/HduaGdrZWlnaW5pZV9jZm5sa/fz+f787O3y9Ovn6+zu6ebo7Ovp7fL6fPp5dXRy9/vz+PLs7+zz7Ovx+Hl5enZzdXhuaWVhZmVmaG58eX13efl+fnV9+v77fPfy8vL57ez0/Pv1+nx+8urt8fDq4+nz9e30eXRscG5uamlqYmFcXWJeX2Jrc21ra3X+enn86+vu6+ri4ePi4N/m6uzo7Pnw9O/q7O3w7Ovs8vju+XJrZmtnZWZnZ2FfX2RkZGtvdnh2enr39PD27uns6u7o4+bl5+Li5uv38f52eXj4+3h0d/94cXF1eW5samxxbmtpampoZmhvcHR0d/t8eXV59Pj58ero7u7u6ujs7ezq7fP6fvp5ent79Pr49vXx8/L27ev1+Hv293d0c/5yb21scWlramltaGtrb3Bsb2t0dXf8/fDs7e7q4+Xq7u3s9Pfz6Obq6Orr8Pr1/PP3e3pzdmlmY2BjXl5eX2RgYWJnamxub351e/327ezr6uXi49/j397i4OTj4+rt7uzw9Pl79H17enB6cm9qaWliZGFnaGdoaW5raGhnb2pudXn29vDw7unr6uzm4ebk5+Pl6Ozx8H13c3P+dnFyc3VxdXB7d3F2anBvamtnbG1sam53bGxvdHtze379/H32/Pbv9fX09fn39/jy/Pr79vDz8fPu7e/1+/Px9e7u6urs7/DzfHxzdHdvcGxsZ2VjX2JgX2BgaGtsa298e3x6++3v7Orm4uTk5OLj5eTl5Obo6u/q7vT09PV9em1vcGdjYF9eXV5bXFtcXV9nZmtrbnp6/vru6uvo6OTf4OLi3+Hi4+jl5ubp8/P5fnh2fnx4c//+d3FscHBqZWNqamhmZGdlZWNnbGxudffw8O7w5+jo6evl5enr6+fn6e7t7/b4d3RzcHRyeHt5eXv9d3FxdXh1cmtqdHBraGxuaWpoa2tve3r88/n5+fL58vv67vXy+PT17P779PLz+vjz7vT09Ort7Ofi5ebg6uvs7XZscm9sZmZoZGBeXmBfYWVpcHV3cv5++vv77fLs6+rh4+Tm5uXk6Onn5Onr7e/47uvh3ed072xrfV5iX15iXlleX2hcW19jY3BsbPdx8nvp7nLk4uTo5Ozu7/Dg9PTo4O7u9e3t+nh46nj073H+63trfnRpZWFt/Gdhb2pgamJ+7Hd44+Pn4+jf3+3s5ejf6ePf3+vj6fDm/Xbm8Hd8anhrbm3t+XDh/Xp2c/VobWxtXHlnVm5XaFpj+HN+bXZs7fd372n+6n18dut7/3Z9fX5+6vf46O156Odx6uXc6ubb3O3m2ux+/vD7/21vXWJhWmZUYGlsWWN3YWRw/Vnz4mb24ejiClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX2dzbV8xY2hfOGtoel8xM2ticHMuaW5mbyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9nc21fMWNoXzhraHpfMTNrYnBzLmluZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRmYmUzMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9nc21fMWNoXzhraHpfMTNrYnBzLmluZm8KQEAgLTAsMCArMSwxNyBAQAorOTc1IDEgMAorOTc1IDEgNjAwMDAwCis5NzUgMSAxMjAwMDAwCis5NzUgMSAxODAwMDAwCis5NzUgMSAyNDAwMDAwCis5NzUgMSAzMDAwMDAwCis5NzUgMSAzNjAwMDAwCis5NzUgMSA0MjAwMDAwCis5NzUgMSA0ODAwMDAwCis5NzUgMSA1NDAwMDAwCis5NzUgMSA2MDAwMDAwCis5NzUgMSA2NjAwMDAwCis5NzUgMSA3MjAwMDAwCis5NzUgMSA3ODAwMDAwCis5NzUgMSA4NDAwMDAwCis5NzUgMSA5MDAwMDAwCis1MjAgMSA5NjAwMDAwCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfZ3NtXzFjaF84a2h6XzEza2Jwcy5yYXcgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfZ3NtXzFjaF84a2h6XzEza2Jwcy5yYXcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY5MDNhOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9nc21fMWNoXzhraHpfMTNrYnBzLnJhdwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfaDI2M18zNTJ4Mjg4XzMwMGticHNfMTJmcHMuaDI2MyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9oMjYzXzM1MngyODhfMzAwa2Jwc18xMmZwcy5oMjYzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1MjU4MWYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfaDI2M18zNTJ4Mjg4XzMwMGticHNfMTJmcHMuaDI2MwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfaDI2M18zNTJ4Mjg4XzMwMGticHNfMTJmcHMuaW5mbyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9oMjYzXzM1MngyODhfMzAwa2Jwc18xMmZwcy5pbmZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1YmZjYjYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfaDI2M18zNTJ4Mjg4XzMwMGticHNfMTJmcHMuaW5mbwpAQCAtMCwwICsxLDEyMiBAQAorMjYzNjIgMSAwCisxMjAyMyAwIDgzMzMzCisxMDY0NyAwIDE2NjY2NgorMTAyNjkgMCAyNTAwMDAKKzExMDc2IDAgMzMzMzMzCisxMTEwNCAwIDQxNjY2NgorNTkwOSAwIDUwMDAwMAorNDI5MSAwIDU4MzMzMworNTE0OSAwIDY2NjY2NgorNTM1MyAwIDc1MDAwMAorNTE4NSAwIDgzMzMzMworMjczNiAwIDkxNjY2NgorMjE1NzUgMSAxMDAwMDAwCisyMTk2IDAgMTA4MzMzMworNDM0MCAwIDExNjY2NjYKKzMxMDkgMCAxMjUwMDAwCis0NDEwIDAgMTMzMzMzMworMTczMSAwIDE0MTY2NjYKKzQ1NTcgMCAxNTAwMDAwCiszMzc2IDAgMTU4MzMzMworMTM1MiAwIDE2NjY2NjYKKzI4NDQgMCAxNzUwMDAwCisxNzg3IDAgMTgzMzMzMworMTA4OCAwIDE5MTY2NjYKKzM2ODQzIDEgMjAwMDAwMAorMjUyMCAwIDIwODMzMzMKKzM3NDkgMCAyMTY2NjY2CiszNzg0IDAgMjI1MDAwMAorMzQwMiAwIDIzMzMzMzMKKzM3OTUgMCAyNDE2NjY2CisyMzQ1IDAgMjUwMDAwMAorMzE0MiAwIDI1ODMzMzMKKzI5NDggMCAyNjY2NjY2CisyMDE4IDAgMjc1MDAwMAorNTEzMyAwIDI4MzMzMzMKKzIyNzYgMCAyOTE2NjY2CisyMzQ2OCAxIDMwMDAwMDAKKzE1MjIgMCAzMDgzMzMzCisyMjk5IDAgMzE2NjY2NgorMzI3MyAwIDMyNTAwMDAKKzI2MzAgMCAzMzMzMzMzCisyOTE1IDAgMzQxNjY2NgorMzAzMiAwIDM1MDAwMDAKKzE4OTAgMCAzNTgzMzMzCiszNzE4IDAgMzY2NjY2NgorMTk5MCAwIDM3NTAwMDAKKzMxMzkgMCAzODMzMzMzCisxODA2IDAgMzkxNjY2NgorMjMyMDggMSA0MDAwMDAwCisxNDE5IDAgNDA4MzMzMworMjI2MyAwIDQxNjY2NjYKKzMxMzEgMCA0MjUwMDAwCisyNjQ1IDAgNDMzMzMzMworMTg4MCAwIDQ0MTY2NjYKKzIyMzkgMCA0NTAwMDAwCiszNjM3IDAgNDU4MzMzMworMTk0MSAwIDQ2NjY2NjYKKzE1NzcgMCA0NzUwMDAwCiszNzc3IDAgNDgzMzMzMworMTgxNiAwIDQ5MTY2NjYKKzE5NjAxIDEgNTAwMDAwMAorMTEwNCAwIDUwODMzMzMKKzI4MDggMCA1MTY2NjY2CisyNDExIDAgNTI1MDAwMAorMjE1OSAwIDUzMzMzMzMKKzI0MTEgMCA1NDE2NjY2CisyNDA4IDAgNTUwMDAwMAorMjM4OCAwIDU1ODMzMzMKKzI0MTggMCA1NjY2NjY2CisxNDgxIDAgNTc1MDAwMAorMTkyNiAwIDU4MzMzMzMKKzkwMjIgMSA1OTE2NjY2CisyOTIgMCA2MDAwMDAwCis3MDEgMCA2MDgzMzMzCis3NDcgMCA2MTY2NjY2CisyMDU5IDAgNjI1MDAwMAorMTY5MyAwIDYzMzMzMzMKKzIwNzggMCA2NDE2NjY2CisyOTc1IDAgNjUwMDAwMAorMTMxNyAwIDY1ODMzMzMKKzE3NDIgMCA2NjY2NjY2CisxMDE5IDAgNjc1MDAwMAorMTA1MyAwIDY4MzMzMzMKKzE0MTgzIDEgNjkxNjY2NgorMTQ2NyAwIDcwMDAwMDAKKzk5NCAwIDcwODMzMzMKKzE3MDkgMCA3MTY2NjY2Cis4MzggMCA3MjUwMDAwCisxMzI4IDAgNzMzMzMzMworMjI5MiAwIDc0MTY2NjYKKzE4MjkgMCA3NTAwMDAwCisxNzI4IDAgNzU4MzMzMworMjQzNiAwIDc2NjY2NjYKKzE4NTIgMCA3NzUwMDAwCisyMTkwIDAgNzgzMzMzMworMTUxNjcgMSA3OTE2NjY2CisxMTg4IDAgODAwMDAwMAorMjA3MCAwIDgwODMzMzMKKzMzMTYgMCA4MTY2NjY2CisyNjM2IDAgODI1MDAwMAorOTUwIDAgODMzMzMzMworMTI2MCAwIDg0MTY2NjYKKzkwNiAwIDg1MDAwMDAKKzEyOTQgMCA4NTgzMzMzCisxMjk4IDAgODY2NjY2NgorMTg5NyAwIDg3NTAwMDAKKzEzNDggMCA4ODMzMzMzCisxMzE5NCAxIDg5MTY2NjYKKzEwNDIgMCA5MDAwMDAwCisxMjU4IDAgOTA4MzMzMworMTQ1NyAwIDkxNjY2NjYKKzk5MCAwIDkyNTAwMDAKKzkwMCAwIDkzMzMzMzMKKzk2MyAwIDk0MTY2NjYKKzM0NDggMCA5NTAwMDAwCis3NzQgMCA5NTgzMzMzCisxMDc1IDAgOTY2NjY2NgorNzUwIDAgOTc1MDAwMAorMTA1NCAwIDk4MzMzMzMKKzEzMTM5IDEgOTkxNjY2NgorMzEwNCAwIDEwMDAwMDAwCiszMzY2IDAgMTAwODMzMzMKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9oZXZjXzE3NngxNDRfMTc2a2Jwc182MGZwcy5oZXZjIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX2hldmNfMTc2eDE0NF8xNzZrYnBzXzYwZnBzLmhldmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjgyMjM2ZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9oZXZjXzE3NngxNDRfMTc2a2Jwc182MGZwcy5oZXZjCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9oZXZjXzE3NngxNDRfMTc2a2Jwc182MGZwcy5pbmZvIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX2hldmNfMTc2eDE0NF8xNzZrYnBzXzYwZnBzLmluZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQzNTdjZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9oZXZjXzE3NngxNDRfMTc2a2Jwc182MGZwcy5pbmZvCkBAIC0wLDAgKzEsNjEgQEAKKzE2OTUgMzIgMAorMTkzOCAxIDMzMzMzCis0NzEgMCA4MzMzMworMTUzIDAgNjY2NjYKKzk5IDAgNTAwMDAKKzY1NyAwIDE1MDAwMAorMjYwIDAgMTE2NjY2CisxMTUgMCAxMDAwMDAKKzk5IDAgMTMzMzMzCis2MjIgMCAyMTY2NjYKKzIxMSAwIDE4MzMzMworNzkgMCAxNjY2NjYKKzk1IDAgMjAwMDAwCis1OTcgMCAyODMzMzMKKzI4OCAwIDI1MDAwMAorMTQ1IDAgMjMzMzMzCisxNDcgMCAyNjY2NjYKKzY3NiAwIDM1MDAwMAorMjg0IDAgMzE2NjY2CisxNDQgMCAzMDAwMDAKKzEzMSAwIDMzMzMzMworNjU4IDAgNDE2NjY2CisyNzAgMCAzODMzMzMKKzEwMSAwIDM2NjY2NgorMTUxIDAgNDAwMDAwCis1MjkgMCA0ODMzMzMKKzI1NyAwIDQ1MDAwMAorOTggMCA0MzMzMzMKKzE2MCAwIDQ2NjY2NgorNjY0IDAgNTY2NjY2CisxODYgMCA1MzMzMzMKKzE0NyAwIDUwMDAwMAorNjcgMCA1MTY2NjYKKzc4IDAgNTUwMDAwCis1NzUgMCA2MzMzMzMKKzIzMCAwIDYwMDAwMAorMTM0IDAgNTgzMzMzCisxMTQgMCA2MTY2NjYKKzYyOSAwIDcwMDAwMAorMjI0IDAgNjY2NjY2CisxMzggMCA2NTAwMDAKKzEyOSAwIDY4MzMzMworNjQ1IDAgNzUwMDAwCisyNjQgMCA3MzMzMzMKKzE0NSAwIDcxNjY2NgorNzA1IDAgODE2NjY2CiszNjUgMCA3ODMzMzMKKzE1NiAwIDc2NjY2NgorMTYwIDAgODAwMDAwCis3MjUgMCA4ODMzMzMKKzMzMCAwIDg1MDAwMAorMTM4IDAgODMzMzMzCisxNjIgMCA4NjY2NjYKKzYzOCAwIDk1MDAwMAorMzM3IDAgOTE2NjY2CisxNzAgMCA5MDAwMDAKKzEzMyAwIDkzMzMzMworNDMyIDAgMTAxNjY2NgorMjg3IDAgOTgzMzMzCisxMzAgMCA5NjY2NjYKKzEzNiAwIDEwMDAwMDAKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9oZXZjXzY0MHgzNjBfMTYwMGticHNfMzBmcHMuaGV2YyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9oZXZjXzY0MHgzNjBfMTYwMGticHNfMzBmcHMuaGV2YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTFmN2NmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX2hldmNfNjQweDM2MF8xNjAwa2Jwc18zMGZwcy5oZXZjCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9oZXZjXzY0MHgzNjBfMTYwMGticHNfMzBmcHMuaW5mbyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9oZXZjXzY0MHgzNjBfMTYwMGticHNfMzBmcHMuaW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTk0OTFhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX2hldmNfNjQweDM2MF8xNjAwa2Jwc18zMGZwcy5pbmZvCkBAIC0wLDAgKzEsMzAyIEBACisxMDc1IDMyIDAKKzEwNzUgMzIgMAorNjg2MTMgMSA2NjY4NworMTkwMjUgMCAxOTk2ODcKKzI0MDUgMCAxMzM2ODcKKzc3NyAwIDk5Njg3Cis2ODEgMCAxNjY2ODcKKzIwMjU0IDAgMzMzNjg3CisyOTI3IDAgMjY2Njg3Cis3NjYgMCAyMzM2ODcKKzY1OCAwIDI5OTY4NworMjA3ODYgMCA0NjY2ODcKKzQyMTQgMCAzOTk2ODcKKzYwOSAwIDM2NjY4NworNjYxIDAgNDMzNjg3CisyMDgzOCAwIDU5OTY4NworNDIwOSAwIDUzMzY4NworNTA2IDAgNDk5Njg3Cis1ODYgMCA1NjY2ODcKKzIwNDE1IDAgNzMzNjg3Cis0MjA3IDAgNjY2Njg3Cis0MjcgMCA2MzM2ODcKKzUxNCAwIDY5OTY4NworMjQ0NTcgMCA4OTk2ODcKKzE5MDQgMCA4MzM2ODcKKzkyMSAwIDc2NjY4NworOTkyIDAgNzk5Njg3Cis1NDMgMCA4NjY2ODcKKzI0MzQyIDAgMTA2NjY4NworMTgyMiAwIDk5OTY4NworODQwIDAgOTMzNjg3Cis4OTIgMCA5NjY2ODcKKzcxNSAwIDEwMzM2ODcKKzIyODkzIDAgMTIzMzY4NworMTYxOCAwIDExNjY2ODcKKzg4MSAwIDEwOTk2ODcKKzg5MCAwIDExMzM2ODcKKzc5NCAwIDExOTk2ODcKKzI0MjkyIDAgMTM5OTY4NworMTY3MyAwIDEzMzM2ODcKKzc1NSAwIDEyNjY2ODcKKzgxMCAwIDEyOTk2ODcKKzU4OCAwIDEzNjY2ODcKKzE5ODI4IDAgMTUzMzY4NworMTUzOCAwIDE0NjY2ODcKKzg5NCAwIDE0MzM2ODcKKzkzMyAwIDE0OTk2ODcKKzE5ODUzIDAgMTY2NjY4NworMjAxMSAwIDE1OTk2ODcKKzk4MSAwIDE1NjY2ODcKKzkwMCAwIDE2MzM2ODcKKzIyODY5IDAgMTgzMzY4NworMTU2MiAwIDE3NjY2ODcKKzg0MiAwIDE2OTk2ODcKKzc2NSAwIDE3MzM2ODcKKzY2NSAwIDE3OTk2ODcKKzIyMzQ2IDAgMTk2NjY4NworMjI0NSAwIDE4OTk2ODcKKzUxNiAwIDE4NjY2ODcKKzYwNCAwIDE5MzM2ODcKKzI0MzMzIDAgMjA5OTY4NworMTc2NSAwIDIwMzM2ODcKKzMxOCAwIDE5OTk2ODcKKzMyMCAwIDIwNjY2ODcKKzE4NTc3IDAgMjE5OTY4NworMTEyMyAwIDIxNjY2ODcKKzMzNyAwIDIxMzM2ODcKKzE3NTA5IDAgMjI5OTY4NworODY5IDAgMjI2NjY4NworOTAxIDAgMjIzMzY4NworMjMzNjYgMCAyNDMzNjg3CisxMjE3IDAgMjM2NjY4NworMzgwIDAgMjMzMzY4NworMzQ3IDAgMjM5OTY4NworMTk1NDIgMCAyNTMzNjg3CisxODg3IDAgMjQ5OTY4NworNDY3IDAgMjQ2NjY4NworMTg5MzkgMCAyNjY2Njg3CisyODYzIDAgMjU5OTY4NworMzE3IDAgMjU2NjY4NworMjcyIDAgMjYzMzY4NworMTkzNTMgMCAyNzk5Njg3CisyMDkyIDAgMjczMzY4NworMjAzIDAgMjY5OTY4NworMzEwIDAgMjc2NjY4NworMTg4MDAgMCAyOTMzNjg3CisyMDM4IDAgMjg2NjY4NworMjQyIDAgMjgzMzY4NworMTk5IDAgMjg5OTY4NworMTc0NTIgMCAzMDk5Njg3CisxMDYwIDAgMzAzMzY4NworMzAxIDAgMjk2NjY4NworNDUyIDAgMjk5OTY4NworMjU2IDAgMzA2NjY4NworMjEzNTIgMCAzMTk5Njg3Cis0MDkgMCAzMTY2Njg3CisxNzMgMCAzMTMzNjg3CisxOTE0MiAwIDMyOTk2ODcKKzY0MiAwIDMyNjY2ODcKKzQ2OCAwIDMyMzM2ODcKKzE5MDY2IDAgMzQzMzY4NworNjM1IDAgMzM2NjY4NworMTk3IDAgMzMzMzY4NworMTkwIDAgMzM5OTY4NworMTg4MTMgMCAzNTY2Njg3Cis5NjkgMCAzNDk5Njg3CisxNjUgMCAzNDY2Njg3CisyMDMgMCAzNTMzNjg3CisxNzM2MiAwIDM3MzM2ODcKKzI0NiAwIDM2NjY2ODcKKzIzNiAwIDM1OTk2ODcKKzE3NCAwIDM2MzM2ODcKKzE2NCAwIDM2OTk2ODcKKzE3MDgxIDAgMzg5OTY4NworMzUzIDAgMzgzMzY4NworMjIyIDAgMzc2NjY4NworMTgxIDAgMzc5OTY4NworMTQ4IDAgMzg2NjY4NworMTA4MzUgMCAzOTk5Njg3CisxODUgMCAzOTY2Njg3CisxMzkgMCAzOTMzNjg3Cis3NTEwIDAgNDEzMzY4NworMTQ5IDAgNDA2NjY4NworMTI5IDAgNDAzMzY4NworMTMyIDAgNDA5OTY4NworMTA2MyAwIDQxNjY2ODcKKzgwNSAwIDQyNjY2ODcKKzE1NyAwIDQyMzM2ODcKKzM5NCAwIDQxOTk2ODcKKzkwODQwIDAgNDM5OTY4NworNjE1OSAwIDQzMzM2ODcKKzE3NTIgMCA0Mjk5Njg3Cis5ODUgMCA0MzY2Njg3CiszMTMzOCAwIDQ1MzM2ODcKKzMzOTAgMCA0NDY2Njg3Cis3NzIgMCA0NDMzNjg3Cis3ODEgMCA0NDk5Njg3CiszMTA4NCAwIDQ2NjY2ODcKKzM0OTggMCA0NTk5Njg3Cis4MTggMCA0NTY2Njg3Cis4ODEgMCA0NjMzNjg3CiszMDQxNiAwIDQ3OTk2ODcKKzMyNjUgMCA0NzMzNjg3Cis4MTUgMCA0Njk5Njg3Cis3OTAgMCA0NzY2Njg3CiszMTA1MyAwIDQ5MzM2ODcKKzMxMDYgMCA0ODY2Njg3Cis3MDggMCA0ODMzNjg3Cis3MTMgMCA0ODk5Njg3CiszMDIzMCAwIDUwNjY2ODcKKzMyMTQgMCA0OTk5Njg3Cis2MzkgMCA0OTY2Njg3Cis3NjggMCA1MDMzNjg3CisyOTY1NyAwIDUxOTk2ODcKKzMwMTMgMCA1MTMzNjg3Cis2MjIgMCA1MDk5Njg3Cis3MjAgMCA1MTY2Njg3CisyOTM0NCAwIDUzMzM2ODcKKzMxOTYgMCA1MjY2Njg3Cis3MTMgMCA1MjMzNjg3Cis3NzUgMCA1Mjk5Njg3CiszMDQyMCAwIDU0NjY2ODcKKzMzNzQgMCA1Mzk5Njg3Cis4MDMgMCA1MzY2Njg3Cis3MTcgMCA1NDMzNjg3CisyOTk2MCAwIDU1OTk2ODcKKzMyODMgMCA1NTMzNjg3Cis3OTMgMCA1NDk5Njg3Cis3OTAgMCA1NTY2Njg3CiszMTAxMSAwIDU3MzM2ODcKKzMzOTcgMCA1NjY2Njg3Cis4MDkgMCA1NjMzNjg3Cis4MzEgMCA1Njk5Njg3CiszMTE5NCAwIDU4NjY2ODcKKzM0MDEgMCA1Nzk5Njg3Cis4MDcgMCA1NzY2Njg3Cis4MjcgMCA1ODMzNjg3CiszMDMyNiAwIDU5OTk2ODcKKzMxODYgMCA1OTMzNjg3Cis4MTggMCA1ODk5Njg3Cis4NjMgMCA1OTY2Njg3CiszMTU1OSAwIDYxMzM2ODcKKzMzNjQgMCA2MDY2Njg3Cis4NDAgMCA2MDMzNjg3Cis5MTkgMCA2MDk5Njg3CiszMjAxMyAwIDYyNjY2ODcKKzM0OTUgMCA2MTk5Njg3Cis4NzEgMCA2MTY2Njg3Cis4MDMgMCA2MjMzNjg3CiszMDI5NCAwIDYzOTk2ODcKKzMxNTMgMCA2MzMzNjg3Cis3MTYgMCA2Mjk5Njg3Cis4MTIgMCA2MzY2Njg3CisyOTk1MiAwIDY1MzM2ODcKKzMyOTkgMCA2NDY2Njg3Cis4MDEgMCA2NDMzNjg3Cis3NDkgMCA2NDk5Njg3CiszMDU5OCAwIDY2NjY2ODcKKzM1MzYgMCA2NTk5Njg3Cis4ODcgMCA2NTY2Njg3Cis4NTAgMCA2NjMzNjg3CisxNzI0NiAwIDY2OTk2ODcKKzMxMTEwIDAgNjgzMzY4NworMzE5OCAwIDY3NjY2ODcKKzgwOSAwIDY3MzM2ODcKKzgzNiAwIDY3OTk2ODcKKzI5Nzg0IDAgNjk2NjY4NworMzE1NSAwIDY4OTk2ODcKKzg1OSAwIDY4NjY2ODcKKzk1OCAwIDY5MzM2ODcKKzMwNjY2IDAgNzA5OTY4NworMzM3MSAwIDcwMzM2ODcKKzg4NiAwIDY5OTk2ODcKKzg2MSAwIDcwNjY2ODcKKzMwNDE2IDAgNzIzMzY4NworMzM1MCAwIDcxNjY2ODcKKzkxNyAwIDcxMzM2ODcKKzk4NyAwIDcxOTk2ODcKKzI5NTA5IDAgNzM2NjY4NworMzU3NCAwIDcyOTk2ODcKKzk3MiAwIDcyNjY2ODcKKzg4NSAwIDczMzM2ODcKKzMwODcyIDAgNzQ5OTY4NworMzM5OSAwIDc0MzM2ODcKKzg5OCAwIDczOTk2ODcKKzEwMjcgMCA3NDY2Njg3CiszMTE1NSAwIDc2MzM2ODcKKzM0NTQgMCA3NTY2Njg3Cis5NjUgMCA3NTMzNjg3Cis4NDEgMCA3NTk5Njg3CisyODQ4NyAwIDc3NjY2ODcKKzM2MTYgMCA3Njk5Njg3Cis5MjEgMCA3NjY2Njg3Cis5OTEgMCA3NzMzNjg3CisyMzIwOCAwIDc4OTk2ODcKKzM1NTEgMCA3ODMzNjg3Cis5MTggMCA3Nzk5Njg3Cis4OTQgMCA3ODY2Njg3CisxNjk4MiAwIDgwMzM2ODcKKzM0NTggMCA3OTY2Njg3Cis4NDQgMCA3OTMzNjg3Cis5NDMgMCA3OTk5Njg3CiszMDM5NiAwIDgxOTk2ODcKKzQ5NjMgMCA4MTMzNjg3CisxNDE2IDAgODA2NjY4NworMTYzOSAwIDgwOTk2ODcKKzUyNCAwIDgxNjY2ODcKKzEzNjggMCA4Mjk5Njg3Cis1NjUgMCA4MjY2Njg3CiszOTIgMCA4MjMzNjg3Cis0MTMxNyAxIDgzOTk2ODcKKzE4NSAwIDgzNjY2ODcKKzQ3NyAwIDgzMzM2ODcKKzUzNDIgMCA4NTMzNjg3CisxMjc1IDAgODQ2NjY4NworMTIxIDAgODQzMzY4NworOTgyIDAgODQ5OTY4NworNjQ2NSAwIDg2OTk2ODcKKzI2MDYgMCA4NjMzNjg3CisxMTYzIDAgODU2NjY4NworOTQzIDAgODU5OTY4NworMTE4NiAwIDg2NjY2ODcKKzExNTkzIDAgODgzMzY4NworMzEyMiAwIDg3NjY2ODcKKzEyNzggMCA4NzMzNjg3CisxNTkzIDAgODc5OTY4NworOTA5OSAwIDg5OTk2ODcKKzk3OCAwIDg5MzM2ODcKKzc0OCAwIDg4NjY2ODcKKzgzNSAwIDg4OTk2ODcKKzM2NCAwIDg5NjY2ODcKKzQ3OTkgMCA5MDk5Njg3CiszNjUgMCA5MDY2Njg3CisyMTUgMCA5MDMzNjg3Cis0MzY3IDAgOTE5OTY4NworMzAyIDAgOTE2NjY4NworNDgwIDAgOTEzMzY4NworNjE4MCAwIDkzMzM2ODcKKzc3MSAwIDkyNjY2ODcKKzI0NiAwIDkyMzM2ODcKKzI4MSAwIDkyOTk2ODcKKzQ2MzYgMCA5Mzk5Njg3CisyMTEgMCA5MzY2Njg3Cis0MDM3IDAgOTQ5OTY4NworMzgyIDAgOTQ2NjY4NworNDg2IDAgOTQzMzY4NworMzk3NSAwIDk1OTk2ODcKKzMxMiAwIDk1NjY2ODcKKzQ3NCAwIDk1MzM2ODcKKzY4ODAgMCA5NzMzNjg3CisxMTE2IDAgOTY2NjY4NworMjA2IDAgOTYzMzY4NworNjk4IDAgOTY5OTY4NworNjI1NCAwIDk4OTk2ODcKKzI1ODEgMCA5ODMzNjg3CisxMzAzIDAgOTc2NjY4NworOTg1IDAgOTc5OTY4NworOTY3IDAgOTg2NjY4NworNjQ4NiAwIDEwMDMzNjg3CiszNTU1IDAgOTk2NjY4NworMTQzMCAwIDk5MzM2ODcKKzE2MDUgMCA5OTk5Njg3CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfbXAzX3N0ZXJlb18xOTJrYnBzXzQ4MDAwaHouaW5mbyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9tcDNfc3RlcmVvXzE5MmticHNfNDgwMDBoei5pbmZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxZmJmZDQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfbXAzX3N0ZXJlb18xOTJrYnBzXzQ4MDAwaHouaW5mbwpAQCAtMCwwICsxLDQxNCBAQAorNTc2IDEgMAorNTc2IDEgMjQwMDAKKzU3NiAxIDQ4MDAwCis1NzYgMSA3MjAwMAorNTc2IDEgOTYwMDAKKzU3NiAxIDEyMDAwMAorNTc2IDEgMTQ0MDAwCis1NzYgMSAxNjgwMDAKKzU3NiAxIDE5MjAwMAorNTc2IDEgMjE2MDAwCis1NzYgMSAyNDAwMDAKKzU3NiAxIDI2NDAwMAorNTc2IDEgMjg4MDAwCis1NzYgMSAzMTIwMDAKKzU3NiAxIDMzNjAwMAorNTc2IDEgMzYwMDAwCis1NzYgMSAzODQwMDAKKzU3NiAxIDQwODAwMAorNTc2IDEgNDMyMDAwCis1NzYgMSA0NTYwMDAKKzU3NiAxIDQ4MDAwMAorNTc2IDEgNTA0MDAwCis1NzYgMSA1MjgwMDAKKzU3NiAxIDU1MjAwMAorNTc2IDEgNTc2MDAwCis1NzYgMSA2MDAwMDAKKzU3NiAxIDYyNDAwMAorNTc2IDEgNjQ4MDAwCis1NzYgMSA2NzIwMDAKKzU3NiAxIDY5NjAwMAorNTc2IDEgNzIwMDAwCis1NzYgMSA3NDQwMDAKKzU3NiAxIDc2ODAwMAorNTc2IDEgNzkyMDAwCis1NzYgMSA4MTYwMDAKKzU3NiAxIDg0MDAwMAorNTc2IDEgODY0MDAwCis1NzYgMSA4ODgwMDAKKzU3NiAxIDkxMjAwMAorNTc2IDEgOTM2MDAwCis1NzYgMSA5NjAwMDAKKzU3NiAxIDk4NDAwMAorNTc2IDEgMTAwODAwMAorNTc2IDEgMTAzMjAwMAorNTc2IDEgMTA1NjAwMAorNTc2IDEgMTA4MDAwMAorNTc2IDEgMTEwNDAwMAorNTc2IDEgMTEyODAwMAorNTc2IDEgMTE1MjAwMAorNTc2IDEgMTE3NjAwMAorNTc2IDEgMTIwMDAwMAorNTc2IDEgMTIyNDAwMAorNTc2IDEgMTI0ODAwMAorNTc2IDEgMTI3MjAwMAorNTc2IDEgMTI5NjAwMAorNTc2IDEgMTMyMDAwMAorNTc2IDEgMTM0NDAwMAorNTc2IDEgMTM2ODAwMAorNTc2IDEgMTM5MjAwMAorNTc2IDEgMTQxNjAwMAorNTc2IDEgMTQ0MDAwMAorNTc2IDEgMTQ2NDAwMAorNTc2IDEgMTQ4ODAwMAorNTc2IDEgMTUxMjAwMAorNTc2IDEgMTUzNjAwMAorNTc2IDEgMTU2MDAwMAorNTc2IDEgMTU4NDAwMAorNTc2IDEgMTYwODAwMAorNTc2IDEgMTYzMjAwMAorNTc2IDEgMTY1NjAwMAorNTc2IDEgMTY4MDAwMAorNTc2IDEgMTcwNDAwMAorNTc2IDEgMTcyODAwMAorNTc2IDEgMTc1MjAwMAorNTc2IDEgMTc3NjAwMAorNTc2IDEgMTgwMDAwMAorNTc2IDEgMTgyNDAwMAorNTc2IDEgMTg0ODAwMAorNTc2IDEgMTg3MjAwMAorNTc2IDEgMTg5NjAwMAorNTc2IDEgMTkyMDAwMAorNTc2IDEgMTk0NDAwMAorNTc2IDEgMTk2ODAwMAorNTc2IDEgMTk5MjAwMAorNTc2IDEgMjAxNjAwMAorNTc2IDEgMjA0MDAwMAorNTc2IDEgMjA2NDAwMAorNTc2IDEgMjA4ODAwMAorNTc2IDEgMjExMjAwMAorNTc2IDEgMjEzNjAwMAorNTc2IDEgMjE2MDAwMAorNTc2IDEgMjE4NDAwMAorNTc2IDEgMjIwODAwMAorNTc2IDEgMjIzMjAwMAorNTc2IDEgMjI1NjAwMAorNTc2IDEgMjI4MDAwMAorNTc2IDEgMjMwNDAwMAorNTc2IDEgMjMyODAwMAorNTc2IDEgMjM1MjAwMAorNTc2IDEgMjM3NjAwMAorNTc2IDEgMjQwMDAwMAorNTc2IDEgMjQyNDAwMAorNTc2IDEgMjQ0ODAwMAorNTc2IDEgMjQ3MjAwMAorNTc2IDEgMjQ5NjAwMAorNTc2IDEgMjUyMDAwMAorNTc2IDEgMjU0NDAwMAorNTc2IDEgMjU2ODAwMAorNTc2IDEgMjU5MjAwMAorNTc2IDEgMjYxNjAwMAorNTc2IDEgMjY0MDAwMAorNTc2IDEgMjY2NDAwMAorNTc2IDEgMjY4ODAwMAorNTc2IDEgMjcxMjAwMAorNTc2IDEgMjczNjAwMAorNTc2IDEgMjc2MDAwMAorNTc2IDEgMjc4NDAwMAorNTc2IDEgMjgwODAwMAorNTc2IDEgMjgzMjAwMAorNTc2IDEgMjg1NjAwMAorNTc2IDEgMjg4MDAwMAorNTc2IDEgMjkwNDAwMAorNTc2IDEgMjkyODAwMAorNTc2IDEgMjk1MjAwMAorNTc2IDEgMjk3NjAwMAorNTc2IDEgMzAwMDAwMAorNTc2IDEgMzAyNDAwMAorNTc2IDEgMzA0ODAwMAorNTc2IDEgMzA3MjAwMAorNTc2IDEgMzA5NjAwMAorNTc2IDEgMzEyMDAwMAorNTc2IDEgMzE0NDAwMAorNTc2IDEgMzE2ODAwMAorNTc2IDEgMzE5MjAwMAorNTc2IDEgMzIxNjAwMAorNTc2IDEgMzI0MDAwMAorNTc2IDEgMzI2NDAwMAorNTc2IDEgMzI4ODAwMAorNTc2IDEgMzMxMjAwMAorNTc2IDEgMzMzNjAwMAorNTc2IDEgMzM2MDAwMAorNTc2IDEgMzM4NDAwMAorNTc2IDEgMzQwODAwMAorNTc2IDEgMzQzMjAwMAorNTc2IDEgMzQ1NjAwMAorNTc2IDEgMzQ4MDAwMAorNTc2IDEgMzUwNDAwMAorNTc2IDEgMzUyODAwMAorNTc2IDEgMzU1MjAwMAorNTc2IDEgMzU3NjAwMAorNTc2IDEgMzYwMDAwMAorNTc2IDEgMzYyNDAwMAorNTc2IDEgMzY0ODAwMAorNTc2IDEgMzY3MjAwMAorNTc2IDEgMzY5NjAwMAorNTc2IDEgMzcyMDAwMAorNTc2IDEgMzc0NDAwMAorNTc2IDEgMzc2ODAwMAorNTc2IDEgMzc5MjAwMAorNTc2IDEgMzgxNjAwMAorNTc2IDEgMzg0MDAwMAorNTc2IDEgMzg2NDAwMAorNTc2IDEgMzg4ODAwMAorNTc2IDEgMzkxMjAwMAorNTc2IDEgMzkzNjAwMAorNTc2IDEgMzk2MDAwMAorNTc2IDEgMzk4NDAwMAorNTc2IDEgNDAwODAwMAorNTc2IDEgNDAzMjAwMAorNTc2IDEgNDA1NjAwMAorNTc2IDEgNDA4MDAwMAorNTc2IDEgNDEwNDAwMAorNTc2IDEgNDEyODAwMAorNTc2IDEgNDE1MjAwMAorNTc2IDEgNDE3NjAwMAorNTc2IDEgNDIwMDAwMAorNTc2IDEgNDIyNDAwMAorNTc2IDEgNDI0ODAwMAorNTc2IDEgNDI3MjAwMAorNTc2IDEgNDI5NjAwMAorNTc2IDEgNDMyMDAwMAorNTc2IDEgNDM0NDAwMAorNTc2IDEgNDM2ODAwMAorNTc2IDEgNDM5MjAwMAorNTc2IDEgNDQxNjAwMAorNTc2IDEgNDQ0MDAwMAorNTc2IDEgNDQ2NDAwMAorNTc2IDEgNDQ4ODAwMAorNTc2IDEgNDUxMjAwMAorNTc2IDEgNDUzNjAwMAorNTc2IDEgNDU2MDAwMAorNTc2IDEgNDU4NDAwMAorNTc2IDEgNDYwODAwMAorNTc2IDEgNDYzMjAwMAorNTc2IDEgNDY1NjAwMAorNTc2IDEgNDY4MDAwMAorNTc2IDEgNDcwNDAwMAorNTc2IDEgNDcyODAwMAorNTc2IDEgNDc1MjAwMAorNTc2IDEgNDc3NjAwMAorNTc2IDEgNDgwMDAwMAorNTc2IDEgNDgyNDAwMAorNTc2IDEgNDg0ODAwMAorNTc2IDEgNDg3MjAwMAorNTc2IDEgNDg5NjAwMAorNTc2IDEgNDkyMDAwMAorNTc2IDEgNDk0NDAwMAorNTc2IDEgNDk2ODAwMAorNTc2IDEgNDk5MjAwMAorNTc2IDEgNTAxNjAwMAorNTc2IDEgNTA0MDAwMAorNTc2IDEgNTA2NDAwMAorNTc2IDEgNTA4ODAwMAorNTc2IDEgNTExMjAwMAorNTc2IDEgNTEzNjAwMAorNTc2IDEgNTE2MDAwMAorNTc2IDEgNTE4NDAwMAorNTc2IDEgNTIwODAwMAorNTc2IDEgNTIzMjAwMAorNTc2IDEgNTI1NjAwMAorNTc2IDEgNTI4MDAwMAorNTc2IDEgNTMwNDAwMAorNTc2IDEgNTMyODAwMAorNTc2IDEgNTM1MjAwMAorNTc2IDEgNTM3NjAwMAorNTc2IDEgNTQwMDAwMAorNTc2IDEgNTQyNDAwMAorNTc2IDEgNTQ0ODAwMAorNTc2IDEgNTQ3MjAwMAorNTc2IDEgNTQ5NjAwMAorNTc2IDEgNTUyMDAwMAorNTc2IDEgNTU0NDAwMAorNTc2IDEgNTU2ODAwMAorNTc2IDEgNTU5MjAwMAorNTc2IDEgNTYxNjAwMAorNTc2IDEgNTY0MDAwMAorNTc2IDEgNTY2NDAwMAorNTc2IDEgNTY4ODAwMAorNTc2IDEgNTcxMjAwMAorNTc2IDEgNTczNjAwMAorNTc2IDEgNTc2MDAwMAorNTc2IDEgNTc4NDAwMAorNTc2IDEgNTgwODAwMAorNTc2IDEgNTgzMjAwMAorNTc2IDEgNTg1NjAwMAorNTc2IDEgNTg4MDAwMAorNTc2IDEgNTkwNDAwMAorNTc2IDEgNTkyODAwMAorNTc2IDEgNTk1MjAwMAorNTc2IDEgNTk3NjAwMAorNTc2IDEgNjAwMDAwMAorNTc2IDEgNjAyNDAwMAorNTc2IDEgNjA0ODAwMAorNTc2IDEgNjA3MjAwMAorNTc2IDEgNjA5NjAwMAorNTc2IDEgNjEyMDAwMAorNTc2IDEgNjE0NDAwMAorNTc2IDEgNjE2ODAwMAorNTc2IDEgNjE5MjAwMAorNTc2IDEgNjIxNjAwMAorNTc2IDEgNjI0MDAwMAorNTc2IDEgNjI2NDAwMAorNTc2IDEgNjI4ODAwMAorNTc2IDEgNjMxMjAwMAorNTc2IDEgNjMzNjAwMAorNTc2IDEgNjM2MDAwMAorNTc2IDEgNjM4NDAwMAorNTc2IDEgNjQwODAwMAorNTc2IDEgNjQzMjAwMAorNTc2IDEgNjQ1NjAwMAorNTc2IDEgNjQ4MDAwMAorNTc2IDEgNjUwNDAwMAorNTc2IDEgNjUyODAwMAorNTc2IDEgNjU1MjAwMAorNTc2IDEgNjU3NjAwMAorNTc2IDEgNjYwMDAwMAorNTc2IDEgNjYyNDAwMAorNTc2IDEgNjY0ODAwMAorNTc2IDEgNjY3MjAwMAorNTc2IDEgNjY5NjAwMAorNTc2IDEgNjcyMDAwMAorNTc2IDEgNjc0NDAwMAorNTc2IDEgNjc2ODAwMAorNTc2IDEgNjc5MjAwMAorNTc2IDEgNjgxNjAwMAorNTc2IDEgNjg0MDAwMAorNTc2IDEgNjg2NDAwMAorNTc2IDEgNjg4ODAwMAorNTc2IDEgNjkxMjAwMAorNTc2IDEgNjkzNjAwMAorNTc2IDEgNjk2MDAwMAorNTc2IDEgNjk4NDAwMAorNTc2IDEgNzAwODAwMAorNTc2IDEgNzAzMjAwMAorNTc2IDEgNzA1NjAwMAorNTc2IDEgNzA4MDAwMAorNTc2IDEgNzEwNDAwMAorNTc2IDEgNzEyODAwMAorNTc2IDEgNzE1MjAwMAorNTc2IDEgNzE3NjAwMAorNTc2IDEgNzIwMDAwMAorNTc2IDEgNzIyNDAwMAorNTc2IDEgNzI0ODAwMAorNTc2IDEgNzI3MjAwMAorNTc2IDEgNzI5NjAwMAorNTc2IDEgNzMyMDAwMAorNTc2IDEgNzM0NDAwMAorNTc2IDEgNzM2ODAwMAorNTc2IDEgNzM5MjAwMAorNTc2IDEgNzQxNjAwMAorNTc2IDEgNzQ0MDAwMAorNTc2IDEgNzQ2NDAwMAorNTc2IDEgNzQ4ODAwMAorNTc2IDEgNzUxMjAwMAorNTc2IDEgNzUzNjAwMAorNTc2IDEgNzU2MDAwMAorNTc2IDEgNzU4NDAwMAorNTc2IDEgNzYwODAwMAorNTc2IDEgNzYzMjAwMAorNTc2IDEgNzY1NjAwMAorNTc2IDEgNzY4MDAwMAorNTc2IDEgNzcwNDAwMAorNTc2IDEgNzcyODAwMAorNTc2IDEgNzc1MjAwMAorNTc2IDEgNzc3NjAwMAorNTc2IDEgNzgwMDAwMAorNTc2IDEgNzgyNDAwMAorNTc2IDEgNzg0ODAwMAorNTc2IDEgNzg3MjAwMAorNTc2IDEgNzg5NjAwMAorNTc2IDEgNzkyMDAwMAorNTc2IDEgNzk0NDAwMAorNTc2IDEgNzk2ODAwMAorNTc2IDEgNzk5MjAwMAorNTc2IDEgODAxNjAwMAorNTc2IDEgODA0MDAwMAorNTc2IDEgODA2NDAwMAorNTc2IDEgODA4ODAwMAorNTc2IDEgODExMjAwMAorNTc2IDEgODEzNjAwMAorNTc2IDEgODE2MDAwMAorNTc2IDEgODE4NDAwMAorNTc2IDEgODIwODAwMAorNTc2IDEgODIzMjAwMAorNTc2IDEgODI1NjAwMAorNTc2IDEgODI4MDAwMAorNTc2IDEgODMwNDAwMAorNTc2IDEgODMyODAwMAorNTc2IDEgODM1MjAwMAorNTc2IDEgODM3NjAwMAorNTc2IDEgODQwMDAwMAorNTc2IDEgODQyNDAwMAorNTc2IDEgODQ0ODAwMAorNTc2IDEgODQ3MjAwMAorNTc2IDEgODQ5NjAwMAorNTc2IDEgODUyMDAwMAorNTc2IDEgODU0NDAwMAorNTc2IDEgODU2ODAwMAorNTc2IDEgODU5MjAwMAorNTc2IDEgODYxNjAwMAorNTc2IDEgODY0MDAwMAorNTc2IDEgODY2NDAwMAorNTc2IDEgODY4ODAwMAorNTc2IDEgODcxMjAwMAorNTc2IDEgODczNjAwMAorNTc2IDEgODc2MDAwMAorNTc2IDEgODc4NDAwMAorNTc2IDEgODgwODAwMAorNTc2IDEgODgzMjAwMAorNTc2IDEgODg1NjAwMAorNTc2IDEgODg4MDAwMAorNTc2IDEgODkwNDAwMAorNTc2IDEgODkyODAwMAorNTc2IDEgODk1MjAwMAorNTc2IDEgODk3NjAwMAorNTc2IDEgOTAwMDAwMAorNTc2IDEgOTAyNDAwMAorNTc2IDEgOTA0ODAwMAorNTc2IDEgOTA3MjAwMAorNTc2IDEgOTA5NjAwMAorNTc2IDEgOTEyMDAwMAorNTc2IDEgOTE0NDAwMAorNTc2IDEgOTE2ODAwMAorNTc2IDEgOTE5MjAwMAorNTc2IDEgOTIxNjAwMAorNTc2IDEgOTI0MDAwMAorNTc2IDEgOTI2NDAwMAorNTc2IDEgOTI4ODAwMAorNTc2IDEgOTMxMjAwMAorNTc2IDEgOTMzNjAwMAorNTc2IDEgOTM2MDAwMAorNTc2IDEgOTM4NDAwMAorNTc2IDEgOTQwODAwMAorNTc2IDEgOTQzMjAwMAorNTc2IDEgOTQ1NjAwMAorNTc2IDEgOTQ4MDAwMAorNTc2IDEgOTUwNDAwMAorNTc2IDEgOTUyODAwMAorNTc2IDEgOTU1MjAwMAorNTc2IDEgOTU3NjAwMAorNTc2IDEgOTYwMDAwMAorNTc2IDEgOTYyNDAwMAorNTc2IDEgOTY0ODAwMAorNTc2IDEgOTY3MjAwMAorNTc2IDEgOTY5NjAwMAorNTc2IDEgOTcyMDAwMAorNTc2IDEgOTc0NDAwMAorNTc2IDEgOTc2ODAwMAorNTc2IDEgOTc5MjAwMAorNTc2IDEgOTgxNjAwMAorNTc2IDEgOTg0MDAwMAorNTc2IDEgOTg2NDAwMAorNTc2IDEgOTg4ODAwMAorNTc2IDEgOTkxMjAwMApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX21wM19zdGVyZW9fMTkya2Jwc180ODAwMGh6Lm1wMyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9tcDNfc3RlcmVvXzE5MmticHNfNDgwMDBoei5tcDMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjgzYTQ0MTMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfbXAzX3N0ZXJlb18xOTJrYnBzXzQ4MDAwaHoubXAzCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9tcGVnMl8xNzZ4MTQ0XzEwNWticHNfMjVmcHMuaW5mbyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9tcGVnMl8xNzZ4MTQ0XzEwNWticHNfMjVmcHMuaW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTQwNjQyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX21wZWcyXzE3NngxNDRfMTA1a2Jwc18yNWZwcy5pbmZvCkBAIC0wLDAgKzEsMjQ5IEBACis2NDU4IDEgNDAwMDAKKzQwNDAgMCA4MDAwMAorMzI1NSAwIDEyMDAwMAorMzAyNiAwIDE2MDAwMAorMzI5MyAwIDIwMDAwMAorMzA4OSAwIDI0MDAwMAorMzMwNSAwIDI4MDAwMAorMTc5NCAwIDMyMDAwMAorMTg0OCAwIDM2MDAwMAorMTI4OCAwIDQwMDAwMAorMTUxMSAwIDQ0MDAwMAorMTUyNyAwIDQ4MDAwMAorNjE0NiAxIDUyMDAwMAorMTI0MyAwIDU2MDAwMAorMTA5OSAwIDYwMDAwMAorMTM1NCAwIDY0MDAwMAorMTM2NiAwIDY4MDAwMAorMTA0MiAwIDcyMDAwMAorMTYwMCAwIDc2MDAwMAorODc1IDAgODAwMDAwCisxNzI4IDAgODQwMDAwCisxMjU0IDAgODgwMDAwCis5OTQgMCA5MjAwMDAKKzE1OTEgMCA5NjAwMDAKKzYyNjUgMSAxMDAwMDAwCisxMDE4IDAgMTA0MDAwMAorODI1IDAgMTA4MDAwMAorODY5IDAgMTEyMDAwMAorOTIxIDAgMTE2MDAwMAorOTc1IDAgMTIwMDAwMAorOTI0IDAgMTI0MDAwMAorODM0IDAgMTI4MDAwMAorMTA2NiAwIDEzMjAwMDAKKzc5MyAwIDEzNjAwMDAKKzg4OSAwIDE0MDAwMDAKKzIwNTAgMCAxNDQwMDAwCis2Mjc2IDEgMTQ4MDAwMAorODgxIDAgMTUyMDAwMAorMjYwIDAgMTU2MDAwMAorNzMwIDAgMTYwMDAwMAorNDMxIDAgMTY0MDAwMAorMzUxIDAgMTY4MDAwMAorMzIxIDAgMTcyMDAwMAorMzgwMiAwIDE3NjAwMDAKKzE0NiAwIDE4MDAwMDAKKzY0NjIgMCAxODQwMDAwCiszMjQ2IDAgMTg4MDAwMAorNTMzIDAgMTkyMDAwMAorNjIzMSAxIDE5NjAwMDAKKzEzNzggMCAyMDAwMDAwCis3MTkgMCAyMDQwMDAwCis4MTggMCAyMDgwMDAwCis4NTYgMCAyMTIwMDAwCis5MzcgMCAyMTYwMDAwCis2MTEgMCAyMjAwMDAwCiszMDMxIDAgMjI0MDAwMAorMTA0MSAwIDIyODAwMDAKKzYwNCAwIDIzMjAwMDAKKzcxNCAwIDIzNjAwMDAKKzEyODMgMCAyNDAwMDAwCis3NTY1IDEgMjQ0MDAwMAorNjAyIDAgMjQ4MDAwMAorNTMwIDAgMjUyMDAwMAorMjU3OSAwIDI1NjAwMDAKKzExNSAwIDI2MDAwMDAKKzEwNTggMCAyNjQwMDAwCis2ODkgMCAyNjgwMDAwCisxMTE5IDAgMjcyMDAwMAorNjk4IDAgMjc2MDAwMAorMTAwNiAwIDI4MDAwMDAKKzU0NSAwIDI4NDAwMDAKKzE2MTcgMCAyODgwMDAwCis5MTIzIDEgMjkyMDAwMAorNTI3IDAgMjk2MDAwMAorMTU3NiAwIDMwMDAwMDAKKzQ2NSAwIDMwNDAwMDAKKzc0MSAwIDMwODAwMDAKKzUyMSAwIDMxMjAwMDAKKzEzMjIgMCAzMTYwMDAwCis3NzUgMCAzMjAwMDAwCis4NjMgMCAzMjQwMDAwCis5MTAgMCAzMjgwMDAwCis5MTUgMCAzMzIwMDAwCis5MjYgMCAzMzYwMDAwCis3NTU2IDEgMzQwMDAwMAorNzQxIDAgMzQ0MDAwMAorNTI3IDAgMzQ4MDAwMAorMjUxNiAwIDM1MjAwMDAKKzQ1OSAwIDM1NjAwMDAKKzQwNCAwIDM2MDAwMDAKKzUwOSAwIDM2NDAwMDAKKzEyMjcgMCAzNjgwMDAwCisxNTYxIDAgMzcyMDAwMAorNDkwIDAgMzc2MDAwMAorNzEyIDAgMzgwMDAwMAorODAzIDAgMzg0MDAwMAorNzUyNCAxIDM4ODAwMDAKKzczMCAwIDM5MjAwMDAKKzQ2MSAwIDM5NjAwMDAKKzI1MjYgMCA0MDAwMDAwCis0NTMgMCA0MDQwMDAwCis2MzIgMCA0MDgwMDAwCis3ODMgMCA0MTIwMDAwCis4NDMgMCA0MTYwMDAwCis5MTggMCA0MjAwMDAwCis5NjEgMCA0MjQwMDAwCis5NDggMCA0MjgwMDAwCis5NTkgMCA0MzIwMDAwCis3NTk4IDEgNDM2MDAwMAorNjc4IDAgNDQwMDAwMAorNTY5IDAgNDQ0MDAwMAorODkzIDAgNDQ4MDAwMAorNjI0IDAgNDUyMDAwMAorNzU1IDAgNDU2MDAwMAorMjIzNCAwIDQ2MDAwMDAKKzU1NiAwIDQ2NDAwMDAKKzk0NCAwIDQ2ODAwMDAKKzczOSAwIDQ3MjAwMDAKKzg2MiAwIDQ3NjAwMDAKKzkzOCAwIDQ4MDAwMDAKKzc1NzQgMSA0ODQwMDAwCis2OTkgMCA0ODgwMDAwCis3MDEgMCA0OTIwMDAwCis1MzAgMCA0OTYwMDAwCis2ODkgMCA1MDAwMDAwCis3NzggMCA1MDQwMDAwCis4NTYgMCA1MDgwMDAwCis5MzAgMCA1MTIwMDAwCis5NzUgMCA1MTYwMDAwCisxMDIxIDAgNTIwMDAwMAorMTA3NCAwIDUyNDAwMDAKKzk3OCAwIDUyODAwMDAKKzgwMjEgMSA1MzIwMDAwCis3MDQgMCA1MzYwMDAwCis2MTAgMCA1NDAwMDAwCis2OTcgMCA1NDQwMDAwCis3MTEgMCA1NDgwMDAwCis4MjAgMCA1NTIwMDAwCis4NDMgMCA1NTYwMDAwCisyNTEgMCA1NjAwMDAwCiszMzY3IDAgNTY0MDAwMAorNTA3IDAgNTY4MDAwMAorMzE2OCAxIDU3MjAwMDAKKzc3OSAwIDU3NjAwMDAKKzMxNiAwIDU4MDAwMDAKKzYzNSAwIDU4NDAwMDAKKzIwNCAwIDU4ODAwMDAKKzk3OCAwIDU5MjAwMDAKKzEyNyAwIDU5NjAwMDAKKzU4OSAwIDYwMDAwMDAKKzYwNCAwIDYwNDAwMDAKKzY2NiAwIDYwODAwMDAKKzU4MiAwIDYxMjAwMDAKKzcyOSAwIDYxNjAwMDAKKzQxNTIgMSA2MjAwMDAwCis4NTggMCA2MjQwMDAwCis3MzkgMCA2MjgwMDAwCis4ODUgMCA2MzIwMDAwCis3NDkgMCA2MzYwMDAwCis5NTAgMCA2NDAwMDAwCis1OTMgMCA2NDQwMDAwCis3NzEgMCA2NDgwMDAwCis2NzggMCA2NTIwMDAwCis1MjkgMCA2NTYwMDAwCis4MzUgMCA2NjAwMDAwCiszOTEgMCA2NjQwMDAwCis0NjkyIDEgNjY4MDAwMAorNDczIDAgNjcyMDAwMAorNzI0IDAgNjc2MDAwMAorMzgxIDAgNjgwMDAwMAorOTA5IDAgNjg0MDAwMAorMzk0IDAgNjg4MDAwMAorNjU5IDAgNjkyMDAwMAorMzY3IDAgNjk2MDAwMAorNjU4IDAgNzAwMDAwMAorNTIzIDAgNzA0MDAwMAorNTU0IDAgNzA4MDAwMAorNTUzIDAgNzEyMDAwMAorNjA4MCAxIDcxNjAwMDAKKzQ5NiAwIDcyMDAwMDAKKzc2MyAwIDcyNDAwMDAKKzkzOSAwIDcyODAwMDAKKzcxNSAwIDczMjAwMDAKKzY3MiAwIDczNjAwMDAKKzYxNCAwIDc0MDAwMDAKKzgxMSAwIDc0NDAwMDAKKzkxNiAwIDc0ODAwMDAKKzExNTMgMCA3NTIwMDAwCis5NDAgMCA3NTYwMDAwCiszMjIgMCA3NjAwMDAwCis2NjEzIDEgNzY0MDAwMAorODUxIDAgNzY4MDAwMAorMTAwNyAwIDc3MjAwMDAKKzUyMCAwIDc3NjAwMDAKKzQ1NiAwIDc4MDAwMDAKKzYzOSAwIDc4NDAwMDAKKzc1OCAwIDc4ODAwMDAKKzg3OSAwIDc5MjAwMDAKKzExNTIgMCA3OTYwMDAwCisxMDYxIDAgODAwMDAwMAorOTQ2IDAgODA0MDAwMAorODU5IDAgODA4MDAwMAorMzYxMCAxIDgxMjAwMDAKKzg3MSAwIDgxNjAwMDAKKzc0NiAwIDgyMDAwMDAKKzM2NyAwIDgyNDAwMDAKKzM5NyAwIDgyODAwMDAKKzkzMCAwIDgzMjAwMDAKKzMzNyAwIDgzNjAwMDAKKzQxOCAwIDg0MDAwMDAKKzc0MCAwIDg0NDAwMDAKKzYzNyAwIDg0ODAwMDAKKzY2NiAwIDg1MjAwMDAKKzYyNyAwIDg1NjAwMDAKKzQzMzggMSA4NjAwMDAwCis3NDUgMCA4NjQwMDAwCis3ODMgMCA4NjgwMDAwCis0NjUgMCA4NzIwMDAwCis0NjAgMCA4NzYwMDAwCis0NTUgMCA4ODAwMDAwCis1MDYgMCA4ODQwMDAwCis0OTIgMCA4ODgwMDAwCis0ODUgMCA4OTIwMDAwCis1MTcgMCA4OTYwMDAwCis1MzQgMCA5MDAwMDAwCiszOTUgMCA5MDQwMDAwCis1NjI2IDEgOTA4MDAwMAorMTE2OSAwIDkxMjAwMDAKKzU2NCAwIDkxNjAwMDAKKzI2MSAwIDkyMDAwMDAKKzMyNyAwIDkyNDAwMDAKKzMwMyAwIDkyODAwMDAKKzExNDUgMCA5MzIwMDAwCisyNTcgMCA5MzYwMDAwCis0OTggMCA5NDAwMDAwCis0NjUgMCA5NDQwMDAwCis0MTQgMCA5NDgwMDAwCis1NTMgMCA5NTIwMDAwCis1NjE3IDEgOTU2MDAwMAorMTA1MiAwIDk2MDAwMDAKKzU5MiAwIDk2NDAwMDAKKzMyMyAwIDk2ODAwMDAKKzQ5NyAwIDk3MjAwMDAKKzQ2NyAwIDk3NjAwMDAKKzcwNSAwIDk4MDAwMDAKKzEwODYgMCA5ODQwMDAwCisxMjUzIDAgOTg4MDAwMAorMTI1MiAwIDk5MjAwMDAKKzc3NiAwIDk5NjAwMDAKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9tcGVnMl8xNzZ4MTQ0XzEwNWticHNfMjVmcHMubTJ2IGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX21wZWcyXzE3NngxNDRfMTA1a2Jwc18yNWZwcy5tMnYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RmOTBjMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9tcGVnMl8xNzZ4MTQ0XzEwNWticHNfMjVmcHMubTJ2CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9tcGVnMl8zNTJ4Mjg4XzFtYnBzXzYwZnBzLmluZm8gYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfbXBlZzJfMzUyeDI4OF8xbWJwc182MGZwcy5pbmZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxN2NhZjkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfbXBlZzJfMzUyeDI4OF8xbWJwc182MGZwcy5pbmZvCkBAIC0wLDAgKzEsNjAgQEAKKzE2NjgwIDEgMTY2NjYKKzE3MDE3IDAgMzMzMzMKKzEwNTM0IDAgNTAwMDAKKzEwMjg5IDAgNjY2NjYKKzM2OTggMCA4MzMzMworMjc3NiAwIDEwMDAwMAorMTkzNiAwIDExNjY2NgorMTQ5MyAwIDEzMzMzMworMTIxNyAwIDE1MDAwMAorOTkzIDAgMTY2NjY2Cis4MDUgMCAxODMzMzMKKzg1NyAwIDIwMDAwMAorNTA4MiAxIDIxNjY2NgorODEyIDAgMjMzMzMzCis3MTggMCAyNTAwMDAKKzc0NiAwIDI2NjY2NgorNzYyIDAgMjgzMzMzCis4NjUgMCAzMDAwMDAKKzc4MiAwIDMxNjY2NgorODMzIDAgMzMzMzMzCis3NTAgMCAzNTAwMDAKKzgxOSAwIDM2NjY2NgorODI2IDAgMzgzMzMzCis4NDYgMCA0MDAwMDAKKzQ1MjIgMSA0MTY2NjYKKzY3OCAwIDQzMzMzMworNzE4IDAgNDUwMDAwCis4MDMgMCA0NjY2NjYKKzc2OSAwIDQ4MzMzMworNzYyIDAgNTAwMDAwCis1ODcgMCA1MTY2NjYKKzYzNSAwIDUzMzMzMworNjU4IDAgNTUwMDAwCis3MTQgMCA1NjY2NjYKKzY3NyAwIDU4MzMzMworNjk5IDAgNjAwMDAwCis0NjE2IDEgNjE2NjY2Cis4MDAgMCA2MzMzMzMKKzgzMSAwIDY1MDAwMAorOTI4IDAgNjY2NjY2Cis4NjkgMCA2ODMzMzMKKzkzMSAwIDcwMDAwMAorOTMwIDAgNzE2NjY2Cis5NzQgMCA3MzMzMzMKKzk3OCAwIDc1MDAwMAorOTMyIDAgNzY2NjY2Cis5MTggMCA3ODMzMzMKKzk3OCAwIDgwMDAwMAorNDY1NSAxIDgxNjY2NgorODk3IDAgODMzMzMzCis4OTYgMCA4NTAwMDAKKzg4MyAwIDg2NjY2NgorOTQ5IDAgODgzMzMzCis5NjUgMCA5MDAwMDAKKzk1MSAwIDkxNjY2NgorOTAxIDAgOTMzMzMzCis5NjUgMCA5NTAwMDAKKzk1NSAwIDk2NjY2NgorOTQ4IDAgOTgzMzMzCis5NjggMCAxMDAwMDAwCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfbXBlZzJfMzUyeDI4OF8xbWJwc182MGZwcy5tMnYgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfbXBlZzJfMzUyeDI4OF8xbWJwc182MGZwcy5tMnYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmY2N2MyYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9tcGVnMl8zNTJ4Mjg4XzFtYnBzXzYwZnBzLm0ydgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfbXBlZzRfMzUyeDI4OF81MTJrYnBzXzMwZnBzLmluZm8gYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfbXBlZzRfMzUyeDI4OF81MTJrYnBzXzMwZnBzLmluZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjliYTliMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9tcGVnNF8zNTJ4Mjg4XzUxMmticHNfMzBmcHMuaW5mbwpAQCAtMCwwICsxLDI0MSBAQAorNDcgMzIgMAorMjExMTUgMSAwCisxNjQ1NiAwIDMzMzMzCisxMTg4MCAwIDY2NjY2CisxMjE1NSAwIDEwMDAwMAorMTE0MDIgMCAxMzMzMzMKKzUzNDUgMCAxNjY2NjYKKzI5ODYgMCAyMDAwMDAKKzE5MjQgMCAyMzMzMzMKKzIyNzUgMCAyNjY2NjYKKzI3OTMgMCAzMDAwMDAKKzI3NTYgMCAzMzMzMzMKKzI5MzMgMCAzNjY2NjYKKzIxMTAwIDEgNDAwMDAwCisxMzAyIDAgNDMzMzMzCisyMjA2IDAgNDY2NjY2CisxNTk5IDAgNTAwMDAwCisyNTU4IDAgNTMzMzMzCisyNzg0IDAgNTY2NjY2CisyNDU4IDAgNjAwMDAwCisyNDgwIDAgNjMzMzMzCisxNDQ2IDAgNjY2NjY2CiszMTA5IDAgNzAwMDAwCis5NDQgMCA3MzMzMzMKKzMxMzQgMCA3NjY2NjYKKzIxMzQyIDEgODAwMDAwCis2NTIgMCA4MzMzMzMKKzE3MDggMCA4NjY2NjYKKzIyMDIgMCA5MDAwMDAKKzE2OTUgMCA5MzMzMzMKKzE2NjEgMCA5NjY2NjYKKzE2NTIgMCAxMDAwMDAwCisxNjc5IDAgMTAzMzMzMworMTY5MCAwIDEwNjY2NjYKKzE4MjQgMCAxMTAwMDAwCisxODAzIDAgMTEzMzMzMworMTU5OCAwIDExNjY2NjYKKzIxNTQwIDEgMTIwMDAwMAorMjA1IDAgMTIzMzMzMworMTEyNCAwIDEyNjY2NjYKKzEwNjkgMCAxMzAwMDAwCis4MzggMCAxMzMzMzMzCis3NjUgMCAxMzY2NjY2Cis0MjY1IDAgMTQwMDAwMAorOTQgMCAxNDMzMzMzCisyMDQ2MyAwIDE0NjY2NjYKKzEwMjggMCAxNTAwMDAwCisxNDc1IDAgMTUzMzMzMworMzYzMCAwIDE1NjY2NjYKKzI4MzczIDEgMTYwMDAwMAorNzI1IDAgMTYzMzMzMworMTExOSAwIDE2NjY2NjYKKzE0MjcgMCAxNzAwMDAwCisxNjc5IDAgMTczMzMzMworMTg2NiAwIDE3NjY2NjYKKzExOTcgMCAxODAwMDAwCisxNTcyIDAgMTgzMzMzMworMTY1MSAwIDE4NjY2NjYKKzE2NzggMCAxOTAwMDAwCisxNjg4IDAgMTkzMzMzMworMTY1OSAwIDE5NjY2NjYKKzE5OTAwIDEgMjAwMDAwMAorNTg0IDAgMjAzMzMzMworMTQ3NSAwIDIwNjY2NjYKKzE2NzggMCAyMTAwMDAwCisxMDEwIDAgMjEzMzMzMworMTQzNSAwIDIxNjY2NjYKKzE2MTIgMCAyMjAwMDAwCisxNjAyIDAgMjIzMzMzMworMTcwOSAwIDIyNjY2NjYKKzE3MzcgMCAyMzAwMDAwCisxODM1IDAgMjMzMzMzMworOTI2IDAgMjM2NjY2NgorMjAwOTAgMSAyNDAwMDAwCis2MzEgMCAyNDMzMzMzCisxNTc2IDAgMjQ2NjY2NgorOTQxIDAgMjUwMDAwMAorMjM0OSAwIDI1MzMzMzMKKzExMTIgMCAyNTY2NjY2CisxNTY2IDAgMjYwMDAwMAorMTc3MyAwIDI2MzMzMzMKKzk3OSAwIDI2NjY2NjYKKzIyNDYgMCAyNzAwMDAwCis5MDQgMCAyNzMzMzMzCisxMzQyIDAgMjc2NjY2NgorMjAxNDcgMSAyODAwMDAwCis2MzAgMCAyODMzMzMzCis5ODIgMCAyODY2NjY2CisyMDg5IDAgMjkwMDAwMAorMTAyMSAwIDI5MzMzMzMKKzE1MDYgMCAyOTY2NjY2CisxNjQyIDAgMzAwMDAwMAorOTY4IDAgMzAzMzMzMworMTI2MiAwIDMwNjY2NjYKKzIyNzAgMCAzMTAwMDAwCis4NjQgMCAzMTMzMzMzCisxMjUyIDAgMzE2NjY2NgorMjAxNDUgMSAzMjAwMDAwCis1OTUgMCAzMjMzMzMzCis5MTggMCAzMjY2NjY2CisxMTY3IDAgMzMwMDAwMAorMTM0NyAwIDMzMzMzMzMKKzE1OTcgMCAzMzY2NjY2CisxNjM2IDAgMzQwMDAwMAorOTQ0IDAgMzQzMzMzMworMTI5NSAwIDM0NjY2NjYKKzEzOTcgMCAzNTAwMDAwCisxNDEzIDAgMzUzMzMzMworMTQzMiAwIDM1NjY2NjYKKzIwMTgwIDEgMzYwMDAwMAorNTI1IDAgMzYzMzMzMworMTA2OCAwIDM2NjY2NjYKKzEyMzAgMCAzNzAwMDAwCisxNDI4IDAgMzczMzMzMworOTE2IDAgMzc2NjY2NgorMTk0OCAwIDM4MDAwMDAKKzk2NiAwIDM4MzMzMzMKKzEzNDIgMCAzODY2NjY2CisxMzM4IDAgMzkwMDAwMAorMTM3OSAwIDM5MzMzMzMKKzEyOTYgMCAzOTY2NjY2CisxNzM3OCAxIDQwMDAwMDAKKzU4MyAwIDQwMzMzMzMKKzkzNiAwIDQwNjY2NjYKKzE3NDUgMCA0MTAwMDAwCis5ODcgMCA0MTMzMzMzCisxMzkzIDAgNDE2NjY2NgorMTQ5NSAwIDQyMDAwMDAKKzg2OSAwIDQyMzMzMzMKKzE5MzggMCA0MjY2NjY2Cis4MjggMCA0MzAwMDAwCisxODUxIDAgNDMzMzMzMworODM0IDAgNDM2NjY2NgorMTcyODAgMSA0NDAwMDAwCis1ODAgMCA0NDMzMzMzCis4NjkgMCA0NDY2NjY2CisxNjA1IDAgNDUwMDAwMAorODQzIDAgNDUzMzMzMworNjE0NyAxIDQ1NjY2NjYKKzIyMCAwIDQ2MDAwMDAKKzExMDYgMCA0NjMzMzMzCiszOTUgMCA0NjY2NjY2CiszMDQgMCA0NzAwMDAwCisxOTQ2IDAgNDczMzMzMworMTU0IDAgNDc2NjY2NgorNDgyIDAgNDgwMDAwMAorOTQ5IDAgNDgzMzMzMworMTA4OCAwIDQ4NjY2NjYKKzk3NCAwIDQ5MDAwMDAKKzg3NiAwIDQ5MzMzMzMKKzkxNjQgMSA0OTY2NjY2CisxMDE5IDAgNTAwMDAwMAorOTgzIDAgNTAzMzMzMworMTM3NSAwIDUwNjY2NjYKKzEwNDEgMCA1MTAwMDAwCis3ODkgMCA1MTMzMzMzCisxMDM3IDAgNTE2NjY2NgorODEyIDAgNTIwMDAwMAorNzMyIDAgNTIzMzMzMworOTcyIDAgNTI2NjY2NgorNzA4IDAgNTMwMDAwMAorNjIzIDAgNTMzMzMzMworMTA2NjcgMSA1MzY2NjY2Cis0NjMgMCA1NDAwMDAwCis5MTEgMCA1NDMzMzMzCis4NjEgMCA1NDY2NjY2Cis1MDcgMCA1NTAwMDAwCisxMDE1IDAgNTUzMzMzMworNTAxIDAgNTU2NjY2NgorOTM0IDAgNTYwMDAwMAorODEyIDAgNTYzMzMzMworODU1IDAgNTY2NjY2NgorODA0IDAgNTcwMDAwMAorNzgzIDAgNTczMzMzMworMTA2MTAgMSA1NzY2NjY2Cis5NTAgMCA1ODAwMDAwCisxMjkyIDAgNTgzMzMzMworMTAwMiAwIDU4NjY2NjYKKzcyOCAwIDU5MDAwMDAKKzk2MCAwIDU5MzMzMzMKKzEyMzAgMCA1OTY2NjY2CisxMzE1IDAgNjAwMDAwMAorMTI0OCAwIDYwMzMzMzMKKzk5NSAwIDYwNjY2NjYKKzE0MDEgMCA2MTAwMDAwCis5MDUgMCA2MTMzMzMzCis5MzI2IDEgNjE2NjY2NgorNzI2IDAgNjIwMDAwMAorNjY3IDAgNjIzMzMzMworODMzIDAgNjI2NjY2NgorMTAwNyAwIDYzMDAwMDAKKzExNzIgMCA2MzMzMzMzCisxOTEwIDAgNjM2NjY2NgorMTk1NCAwIDY0MDAwMDAKKzE0OTggMCA2NDMzMzMzCisxMTg4IDAgNjQ2NjY2NgorNzg0IDAgNjUwMDAwMAorMTAwNSAwIDY1MzMzMzMKKzEwMDMwIDEgNjU2NjY2NgorNDUyIDAgNjYwMDAwMAorNzYzIDAgNjYzMzMzMworNjM5IDAgNjY2NjY2NgorNjcxIDAgNjcwMDAwMAorODY3IDAgNjczMzMzMworOTYzIDAgNjc2NjY2NgorOTgyIDAgNjgwMDAwMAorOTk1IDAgNjgzMzMzMworOTgyIDAgNjg2NjY2NgorNzQ3IDAgNjkwMDAwMAorNTc0IDAgNjkzMzMzMworMTIzNTMgMSA2OTY2NjY2Cis0NzQgMCA3MDAwMDAwCis5NjkgMCA3MDMzMzMzCis2MzMgMCA3MDY2NjY2Cis3MjMgMCA3MTAwMDAwCisxMjIxIDAgNzEzMzMzMworNjc0IDAgNzE2NjY2NgorNzc2IDAgNzIwMDAwMAorNTcyIDAgNzIzMzMzMworOTEyIDAgNzI2NjY2NgorNTY0IDAgNzMwMDAwMAorNTk0IDAgNzMzMzMzMworMTY2NjEgMSA3MzY2NjY2Cis1MTggMCA3NDAwMDAwCis2NTYgMCA3NDMzMzMzCis2MjUgMCA3NDY2NjY2Cis1ODMgMCA3NTAwMDAwCis1ODQgMCA3NTMzMzMzCisxMDI3IDAgNzU2NjY2NgorODEyIDAgNzYwMDAwMAorNzI5IDAgNzYzMzMzMworNzY2IDAgNzY2NjY2NgorOTAxIDAgNzcwMDAwMAorOTYwIDAgNzczMzMzMworMTIzMzYgMSA3NzY2NjY2Cis5NDQgMCA3ODAwMDAwCisxMzk4IDAgNzgzMzMzMworMTYyNSAwIDc4NjY2NjYKKzIxMDMgMCA3OTAwMDAwCisxNjMwIDAgNzkzMzMzMworMTIyOCAwIDc5NjY2NjYKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9tcGVnNF8zNTJ4Mjg4XzUxMmticHNfMzBmcHMubTR2IGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX21wZWc0XzM1MngyODhfNTEya2Jwc18zMGZwcy5tNHYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdlYWQwMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9tcGVnNF8zNTJ4Mjg4XzUxMmticHNfMzBmcHMubTR2CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9vcHVzX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHouaW5mbyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9vcHVzX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHouaW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2VkMTJiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX29wdXNfc3RlcmVvXzEyOGticHNfNDgwMDBoei5pbmZvCkBAIC0wLDAgKzEsNDk5IEBACisxOSAzMiAwCis4IDMyIDAKKzggMzIgMAorNTI5IDEgMAorMzI5IDEgMTM1MDAKKzM0OSAxIDMzNTAwCiszMzYgMSA1MzUwMAorMzgzIDEgNzM1MDAKKzM1OSAxIDkzNTAwCiszNDQgMSAxMTM1MDAKKzM0MyAxIDEzMzUwMAorMzMyIDEgMTUzNTAwCiszMjAgMSAxNzM1MDAKKzMxOSAxIDE5MzUwMAorMzIzIDEgMjEzNTAwCiszMjAgMSAyMzM1MDAKKzMyOCAxIDI1MzUwMAorMzQwIDEgMjczNTAwCiszMTggMSAyOTM1MDAKKzMxOSAxIDMxMzUwMAorMzM1IDEgMzMzNTAwCis1MTEgMSAzNTM1MDAKKzM5NSAxIDM3MzUwMAorMzI3IDEgMzkzNTAwCis0NzkgMSA0MTM1MDAKKzMzMiAxIDQzMzUwMAorMzIwIDEgNDUzNTAwCiszMjEgMSA0NzM1MDAKKzMxMCAxIDQ5MzUwMAorMzEwIDEgNTEzNTAwCiszMTAgMSA1MzM1MDAKKzMyNiAxIDU1MzUwMAorMzMwIDEgNTczNTAwCiszMTggMSA1OTM1MDAKKzMwOSAxIDYxMzUwMAorMzA0IDEgNjMzNTAwCisyOTggMSA2NTM1MDAKKzI5NCAxIDY3MzUwMAorMzAwIDEgNjkzNTAwCiszMTQgMSA3MTM1MDAKKzMwNCAxIDczMzUwMAorMzA3IDEgNzUzNTAwCiszMjEgMSA3NzM1MDAKKzMzMyAxIDc5MzUwMAorMzM1IDEgODEzNTAwCiszMDYgMSA4MzM1MDAKKzMxNSAxIDg1MzUwMAorMzIwIDEgODczNTAwCiszMTUgMSA4OTM1MDAKKzMwOCAxIDkxMzUwMAorMzIwIDEgOTMzNTAwCiszMTEgMSA5NTM1MDAKKzMxMSAxIDk3MzUwMAorMzEzIDEgOTkzNTAwCiszMTQgMSAxMDEzNTAwCiszMDggMSAxMDMzNTAwCiszMDcgMSAxMDUzNTAwCiszMTcgMSAxMDczNTAwCiszMjggMSAxMDkzNTAwCiszMTcgMSAxMTEzNTAwCiszMTIgMSAxMTMzNTAwCiszMDggMSAxMTUzNTAwCiszMTUgMSAxMTczNTAwCiszMjAgMSAxMTkzNTAwCiszMjIgMSAxMjEzNTAwCiszMjMgMSAxMjMzNTAwCiszMjIgMSAxMjUzNTAwCiszMjIgMSAxMjczNTAwCiszMDEgMSAxMjkzNTAwCiszMDMgMSAxMzEzNTAwCiszMDggMSAxMzMzNTAwCisyOTkgMSAxMzUzNTAwCisyOTcgMSAxMzczNTAwCisyOTMgMSAxMzkzNTAwCisyOTUgMSAxNDEzNTAwCisyOTcgMSAxNDMzNTAwCiszMDAgMSAxNDUzNTAwCisyOTQgMSAxNDczNTAwCisyOTkgMSAxNDkzNTAwCisyOTYgMSAxNTEzNTAwCiszMDMgMSAxNTMzNTAwCiszMTMgMSAxNTUzNTAwCiszMDYgMSAxNTczNTAwCiszMDMgMSAxNTkzNTAwCiszMTEgMSAxNjEzNTAwCiszMDcgMSAxNjMzNTAwCiszMTAgMSAxNjUzNTAwCiszMzkgMSAxNjczNTAwCiszMjUgMSAxNjkzNTAwCiszMjAgMSAxNzEzNTAwCiszMTUgMSAxNzMzNTAwCiszMTYgMSAxNzUzNTAwCiszMzggMSAxNzczNTAwCiszMjUgMSAxNzkzNTAwCiszMjUgMSAxODEzNTAwCiszMjggMSAxODMzNTAwCiszMDQgMSAxODUzNTAwCisyOTcgMSAxODczNTAwCiszMjIgMSAxODkzNTAwCiszMTEgMSAxOTEzNTAwCiszMDcgMSAxOTMzNTAwCiszMDAgMSAxOTUzNTAwCiszMDEgMSAxOTczNTAwCiszMDkgMSAxOTkzNTAwCiszMDAgMSAyMDEzNTAwCiszMDYgMSAyMDMzNTAwCiszMDUgMSAyMDUzNTAwCisyOTggMSAyMDczNTAwCisyOTEgMSAyMDkzNTAwCiszMDEgMSAyMTEzNTAwCiszMDAgMSAyMTMzNTAwCis0MzkgMSAyMTUzNTAwCisyOTIgMSAyMTczNTAwCiszMDggMSAyMTkzNTAwCiszMDUgMSAyMjEzNTAwCisyOTggMSAyMjMzNTAwCisyOTcgMSAyMjUzNTAwCisyOTMgMSAyMjczNTAwCis0MDggMSAyMjkzNTAwCisyOTggMSAyMzEzNTAwCis0NTIgMSAyMzMzNTAwCisyOTcgMSAyMzUzNTAwCiszMDMgMSAyMzczNTAwCiszMDAgMSAyMzkzNTAwCiszMTAgMSAyNDEzNTAwCisyOTkgMSAyNDMzNTAwCiszMDYgMSAyNDUzNTAwCiszMTYgMSAyNDczNTAwCiszMDggMSAyNDkzNTAwCiszMTMgMSAyNTEzNTAwCiszMDkgMSAyNTMzNTAwCiszMTAgMSAyNTUzNTAwCiszMTUgMSAyNTczNTAwCiszMDkgMSAyNTkzNTAwCiszMTcgMSAyNjEzNTAwCiszMTEgMSAyNjMzNTAwCiszMjggMSAyNjUzNTAwCiszMzMgMSAyNjczNTAwCiszMjYgMSAyNjkzNTAwCiszMjMgMSAyNzEzNTAwCiszMTYgMSAyNzMzNTAwCiszMjUgMSAyNzUzNTAwCiszMTYgMSAyNzczNTAwCiszMTkgMSAyNzkzNTAwCiszMjYgMSAyODEzNTAwCiszMjAgMSAyODMzNTAwCiszMjggMSAyODUzNTAwCiszMTIgMSAyODczNTAwCiszMTQgMSAyODkzNTAwCiszMDkgMSAyOTEzNTAwCiszMDYgMSAyOTMzNTAwCisyOTUgMSAyOTUzNTAwCiszMDQgMSAyOTczNTAwCiszMjYgMSAyOTkzNTAwCisyOTEgMSAzMDEzNTAwCisyOTkgMSAzMDMzNTAwCisyOTMgMSAzMDUzNTAwCisyODggMSAzMDczNTAwCisyOTQgMSAzMDkzNTAwCisyOTIgMSAzMTEzNTAwCisyOTIgMSAzMTMzNTAwCisyODggMSAzMTUzNTAwCiszMDggMSAzMTczNTAwCiszMDQgMSAzMTkzNTAwCisyOTIgMSAzMjEzNTAwCiszODIgMSAzMjMzNTAwCiszODEgMSAzMjUzNTAwCisyOTkgMSAzMjczNTAwCiszMTYgMSAzMjkzNTAwCiszMDggMSAzMzEzNTAwCiszMDEgMSAzMzMzNTAwCisyOTcgMSAzMzUzNTAwCisyOTkgMSAzMzczNTAwCisyOTQgMSAzMzkzNTAwCisyOTUgMSAzNDEzNTAwCiszMTcgMSAzNDMzNTAwCisyOTcgMSAzNDUzNTAwCiszMDkgMSAzNDczNTAwCiszMTMgMSAzNDkzNTAwCiszMjAgMSAzNTEzNTAwCiszMjkgMSAzNTMzNTAwCiszMzAgMSAzNTUzNTAwCiszMjQgMSAzNTczNTAwCiszMjQgMSAzNTkzNTAwCiszMDkgMSAzNjEzNTAwCiszMDQgMSAzNjMzNTAwCiszMTMgMSAzNjUzNTAwCiszMTIgMSAzNjczNTAwCisyOTkgMSAzNjkzNTAwCisyOTUgMSAzNzEzNTAwCiszMDEgMSAzNzMzNTAwCisyOTUgMSAzNzUzNTAwCisyOTcgMSAzNzczNTAwCiszMDIgMSAzNzkzNTAwCisyOTggMSAzODEzNTAwCisyOTkgMSAzODMzNTAwCisyOTYgMSAzODUzNTAwCisyOTIgMSAzODczNTAwCiszMDcgMSAzODkzNTAwCiszMDMgMSAzOTEzNTAwCiszMTMgMSAzOTMzNTAwCiszMTggMSAzOTUzNTAwCiszMTMgMSAzOTczNTAwCiszNTMgMSAzOTkzNTAwCiszNzEgMSA0MDEzNTAwCisyOTIgMSA0MDMzNTAwCiszMDAgMSA0MDUzNTAwCiszODEgMSA0MDczNTAwCisyOTQgMSA0MDkzNTAwCiszMDEgMSA0MTEzNTAwCiszMDUgMSA0MTMzNTAwCisyOTkgMSA0MTUzNTAwCiszMDUgMSA0MTczNTAwCiszMjIgMSA0MTkzNTAwCiszMTUgMSA0MjEzNTAwCiszMjYgMSA0MjMzNTAwCiszMzggMSA0MjUzNTAwCiszMjAgMSA0MjczNTAwCiszMTkgMSA0MjkzNTAwCiszMjcgMSA0MzEzNTAwCiszMzAgMSA0MzMzNTAwCiszMTAgMSA0MzUzNTAwCiszMDMgMSA0MzczNTAwCisyOTkgMSA0MzkzNTAwCisyOTMgMSA0NDEzNTAwCisyOTMgMSA0NDMzNTAwCisyOTQgMSA0NDUzNTAwCisyOTUgMSA0NDczNTAwCisyOTUgMSA0NDkzNTAwCiszMjMgMSA0NTEzNTAwCiszMDkgMSA0NTMzNTAwCiszMDkgMSA0NTUzNTAwCiszMDEgMSA0NTczNTAwCis0NzMgMSA0NTkzNTAwCisyOTEgMSA0NjEzNTAwCisyOTcgMSA0NjMzNTAwCisyOTQgMSA0NjUzNTAwCisyOTMgMSA0NjczNTAwCiszMDQgMSA0NjkzNTAwCisyOTIgMSA0NzEzNTAwCiszMDIgMSA0NzMzNTAwCisyOTYgMSA0NzUzNTAwCisyOTggMSA0NzczNTAwCiszMDEgMSA0NzkzNTAwCiszMDcgMSA0ODEzNTAwCisyODUgMSA0ODMzNTAwCisyOTQgMSA0ODUzNTAwCiszMDQgMSA0ODczNTAwCisyOTQgMSA0ODkzNTAwCisyOTUgMSA0OTEzNTAwCiszMjUgMSA0OTMzNTAwCiszMTkgMSA0OTUzNTAwCiszMjMgMSA0OTczNTAwCiszMTMgMSA0OTkzNTAwCiszMDMgMSA1MDEzNTAwCisyOTYgMSA1MDMzNTAwCisyOTUgMSA1MDUzNTAwCisyOTAgMSA1MDczNTAwCisyOTcgMSA1MDkzNTAwCisyOTYgMSA1MTEzNTAwCisyOTYgMSA1MTMzNTAwCisyOTIgMSA1MTUzNTAwCisyOTUgMSA1MTczNTAwCisyODcgMSA1MTkzNTAwCisyOTQgMSA1MjEzNTAwCisyOTAgMSA1MjMzNTAwCisyOTcgMSA1MjUzNTAwCisyOTcgMSA1MjczNTAwCisyOTcgMSA1MjkzNTAwCisyOTIgMSA1MzEzNTAwCisyOTcgMSA1MzMzNTAwCisyOTAgMSA1MzUzNTAwCisyOTMgMSA1MzczNTAwCisyOTMgMSA1MzkzNTAwCisyOTEgMSA1NDEzNTAwCisyOTIgMSA1NDMzNTAwCisyOTAgMSA1NDUzNTAwCisyOTEgMSA1NDczNTAwCisyOTYgMSA1NDkzNTAwCisyOTUgMSA1NTEzNTAwCiszMjcgMSA1NTMzNTAwCisyOTMgMSA1NTUzNTAwCisyOTEgMSA1NTczNTAwCisyOTEgMSA1NTkzNTAwCiszMTEgMSA1NjEzNTAwCisyOTEgMSA1NjMzNTAwCisyOTQgMSA1NjUzNTAwCisyOTYgMSA1NjczNTAwCisyOTUgMSA1NjkzNTAwCisyODkgMSA1NzEzNTAwCisyOTUgMSA1NzMzNTAwCisyOTUgMSA1NzUzNTAwCisyOTcgMSA1NzczNTAwCisyOTIgMSA1NzkzNTAwCisyOTcgMSA1ODEzNTAwCisyOTIgMSA1ODMzNTAwCisyOTUgMSA1ODUzNTAwCisyOTYgMSA1ODczNTAwCisyOTUgMSA1ODkzNTAwCiszMDMgMSA1OTEzNTAwCiszMDQgMSA1OTMzNTAwCiszMDEgMSA1OTUzNTAwCiszMDcgMSA1OTczNTAwCiszMDQgMSA1OTkzNTAwCiszMTAgMSA2MDEzNTAwCiszMTAgMSA2MDMzNTAwCiszMDUgMSA2MDUzNTAwCiszMDEgMSA2MDczNTAwCiszMDIgMSA2MDkzNTAwCiszMDUgMSA2MTEzNTAwCisyOTggMSA2MTMzNTAwCiszMDAgMSA2MTUzNTAwCiszMDAgMSA2MTczNTAwCisyOTIgMSA2MTkzNTAwCisyOTcgMSA2MjEzNTAwCiszMDEgMSA2MjMzNTAwCisyOTcgMSA2MjUzNTAwCisyOTcgMSA2MjczNTAwCisyOTggMSA2MjkzNTAwCisyOTcgMSA2MzEzNTAwCiszMDAgMSA2MzMzNTAwCisyOTMgMSA2MzUzNTAwCisyOTMgMSA2MzczNTAwCisyOTcgMSA2MzkzNTAwCisyOTQgMSA2NDEzNTAwCiszMDcgMSA2NDMzNTAwCiszMDIgMSA2NDUzNTAwCiszMDcgMSA2NDczNTAwCiszMjAgMSA2NDkzNTAwCiszMzAgMSA2NTEzNTAwCiszMzMgMSA2NTMzNTAwCiszMzcgMSA2NTUzNTAwCiszMzEgMSA2NTczNTAwCiszMjMgMSA2NTkzNTAwCiszMTIgMSA2NjEzNTAwCiszMjYgMSA2NjMzNTAwCiszMjggMSA2NjUzNTAwCiszMzIgMSA2NjczNTAwCiszMzMgMSA2NjkzNTAwCiszNDAgMSA2NzEzNTAwCiszMzYgMSA2NzMzNTAwCiszMjQgMSA2NzUzNTAwCiszMTIgMSA2NzczNTAwCiszMDEgMSA2NzkzNTAwCisyODkgMSA2ODEzNTAwCiszMDIgMSA2ODMzNTAwCisyOTYgMSA2ODUzNTAwCisyOTkgMSA2ODczNTAwCisyODkgMSA2ODkzNTAwCisyOTUgMSA2OTEzNTAwCisyOTkgMSA2OTMzNTAwCiszNzQgMSA2OTUzNTAwCiszOTEgMSA2OTczNTAwCiszNjUgMSA2OTkzNTAwCiszNDAgMSA3MDEzNTAwCiszMzAgMSA3MDMzNTAwCiszMzcgMSA3MDUzNTAwCiszMjggMSA3MDczNTAwCiszMjkgMSA3MDkzNTAwCiszMTkgMSA3MTEzNTAwCiszMTIgMSA3MTMzNTAwCiszMDggMSA3MTUzNTAwCiszMDQgMSA3MTczNTAwCiszMTIgMSA3MTkzNTAwCiszMTEgMSA3MjEzNTAwCiszMTYgMSA3MjMzNTAwCisyOTkgMSA3MjUzNTAwCiszMzAgMSA3MjczNTAwCiszMzAgMSA3MjkzNTAwCiszMzAgMSA3MzEzNTAwCiszNDIgMSA3MzMzNTAwCis0MzkgMSA3MzUzNTAwCiszMjIgMSA3MzczNTAwCisyOTggMSA3MzkzNTAwCisyOTMgMSA3NDEzNTAwCiszMTAgMSA3NDMzNTAwCiszMDMgMSA3NDUzNTAwCiszMTcgMSA3NDczNTAwCis0NTMgMSA3NDkzNTAwCiszNzcgMSA3NTEzNTAwCiszNzQgMSA3NTMzNTAwCisyOTIgMSA3NTUzNTAwCisyOTUgMSA3NTczNTAwCisyNzQgMSA3NTkzNTAwCisyOTIgMSA3NjEzNTAwCisyOTEgMSA3NjMzNTAwCiszNjcgMSA3NjUzNTAwCisyOTUgMSA3NjczNTAwCisyOTggMSA3NjkzNTAwCisyOTcgMSA3NzEzNTAwCiszMDEgMSA3NzMzNTAwCisyOTIgMSA3NzUzNTAwCiszNDQgMSA3NzczNTAwCisyOTYgMSA3NzkzNTAwCisyOTcgMSA3ODEzNTAwCiszMDYgMSA3ODMzNTAwCiszMDggMSA3ODUzNTAwCiszMDUgMSA3ODczNTAwCiszMTMgMSA3ODkzNTAwCiszMDYgMSA3OTEzNTAwCiszMjIgMSA3OTMzNTAwCiszMTMgMSA3OTUzNTAwCiszMDUgMSA3OTczNTAwCiszMDQgMSA3OTkzNTAwCiszMTMgMSA4MDEzNTAwCiszMjQgMSA4MDMzNTAwCiszMTIgMSA4MDUzNTAwCiszMTggMSA4MDczNTAwCiszMTEgMSA4MDkzNTAwCiszMDIgMSA4MTEzNTAwCiszMDUgMSA4MTMzNTAwCiszMTIgMSA4MTUzNTAwCiszMTMgMSA4MTczNTAwCiszMTIgMSA4MTkzNTAwCiszMzUgMSA4MjEzNTAwCiszMzMgMSA4MjMzNTAwCiszNDYgMSA4MjUzNTAwCiszMzkgMSA4MjczNTAwCiszMzcgMSA4MjkzNTAwCiszNDEgMSA4MzEzNTAwCiszMzUgMSA4MzMzNTAwCiszMjUgMSA4MzUzNTAwCiszMjQgMSA4MzczNTAwCiszMTcgMSA4MzkzNTAwCiszMTUgMSA4NDEzNTAwCiszMDMgMSA4NDMzNTAwCiszMTcgMSA4NDUzNTAwCis0NTIgMSA4NDczNTAwCiszMjQgMSA4NDkzNTAwCiszMjEgMSA4NTEzNTAwCiszMzUgMSA4NTMzNTAwCiszMjcgMSA4NTUzNTAwCiszMTUgMSA4NTczNTAwCiszMjEgMSA4NTkzNTAwCiszMTkgMSA4NjEzNTAwCiszMDggMSA4NjMzNTAwCiszMTQgMSA4NjUzNTAwCiszMjIgMSA4NjczNTAwCiszMjggMSA4NjkzNTAwCiszMjAgMSA4NzEzNTAwCiszMjQgMSA4NzMzNTAwCiszMzEgMSA4NzUzNTAwCiszMzAgMSA4NzczNTAwCiszMjggMSA4NzkzNTAwCiszMTggMSA4ODEzNTAwCiszMTQgMSA4ODMzNTAwCiszMTggMSA4ODUzNTAwCiszMTggMSA4ODczNTAwCiszMjUgMSA4ODkzNTAwCiszMzggMSA4OTEzNTAwCiszNDEgMSA4OTMzNTAwCiszMzMgMSA4OTUzNTAwCiszMzAgMSA4OTczNTAwCiszMzggMSA4OTkzNTAwCiszMzMgMSA5MDEzNTAwCiszMzAgMSA5MDMzNTAwCiszNDQgMSA5MDUzNTAwCis0NzkgMSA5MDczNTAwCis0NzMgMSA5MDkzNTAwCiszMzMgMSA5MTEzNTAwCiszMzcgMSA5MTMzNTAwCis0OTUgMSA5MTUzNTAwCiszNTMgMSA5MTczNTAwCiszNTIgMSA5MTkzNTAwCiszNDQgMSA5MjEzNTAwCiszMzYgMSA5MjMzNTAwCiszMjQgMSA5MjUzNTAwCiszMjEgMSA5MjczNTAwCiszNTAgMSA5MjkzNTAwCiszNDcgMSA5MzEzNTAwCiszNDMgMSA5MzMzNTAwCiszNDUgMSA5MzUzNTAwCiszMzcgMSA5MzczNTAwCiszMzUgMSA5MzkzNTAwCiszMzMgMSA5NDEzNTAwCiszMzYgMSA5NDMzNTAwCiszMzQgMSA5NDUzNTAwCiszMzMgMSA5NDczNTAwCiszMzEgMSA5NDkzNTAwCiszMjkgMSA5NTEzNTAwCiszMTkgMSA5NTMzNTAwCiszMjEgMSA5NTUzNTAwCiszMTYgMSA5NTczNTAwCiszMjIgMSA5NTkzNTAwCis0NDggMSA5NjEzNTAwCiszMTIgMSA5NjMzNTAwCiszMDYgMSA5NjUzNTAwCiszMDEgMSA5NjczNTAwCiszMDMgMSA5NjkzNTAwCisyOTYgMSA5NzEzNTAwCiszMDAgMSA5NzMzNTAwCisyOTUgMSA5NzUzNTAwCiszMDAgMSA5NzczNTAwCisyOTcgMSA5NzkzNTAwCiszMDAgMSA5ODEzNTAwCisyOTcgMSA5ODMzNTAwCis1MTIgMSA5ODUzNTAwCisyOTIgMSA5ODczNTAwCis0NjggMSA5ODkzNTAwCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfb3B1c19zdGVyZW9fMTI4a2Jwc180ODAwMGh6Lm9wdXMgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfb3B1c19zdGVyZW9fMTI4a2Jwc180ODAwMGh6Lm9wdXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI2Yjg3MAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9vcHVzX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHoub3B1cwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfcmF3XzFjaF8xNmtoel9zMTZsZS5yYXcgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfcmF3XzFjaF8xNmtoel9zMTZsZS5yYXcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGEyZjQxYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9yYXdfMWNoXzE2a2h6X3MxNmxlLnJhdwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfcmF3XzFjaF84a2h6X3MxNmxlLnJhdyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9yYXdfMWNoXzhraHpfczE2bGUucmF3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxNDllYjIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfcmF3XzFjaF84a2h6X3MxNmxlLnJhdwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfcmF3XzFjaF84a2h6X3MzMmxlLmluZm8gYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfcmF3XzFjaF84a2h6X3MzMmxlLmluZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBlMjRjYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9yYXdfMWNoXzhraHpfczMybGUuaW5mbwpAQCAtMCwwICsxLDEwIEBACisxNjM4NCAxIDAKKzE2Mzg0IDEgMTAyNDAwMAorMTYzODQgMSAyMDQ4MDAwCisxNjM4NCAxIDMwNzIwMDAKKzE2Mzg0IDEgNDA5NjAwMAorMTYzODQgMSA1MTIwMDAwCisxNjM4NCAxIDYxNDQwMDAKKzE2Mzg0IDEgNzE2ODAwMAorMTYzODQgMSA4MTkyMDAwCisxMDkyNCAxIDkyMTYwMDAKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9yYXdfMWNoXzhraHpfczMybGUucmF3IGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX3Jhd18xY2hfOGtoel9zMzJsZS5yYXcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ5MWI0NgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9yYXdfMWNoXzhraHpfczMybGUucmF3CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9yYXdfMmNoXzQ4a2h6X3MxNmxlLnJhdyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9yYXdfMmNoXzQ4a2h6X3MxNmxlLnJhdwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OThiMmVjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX3Jhd18yY2hfNDhraHpfczE2bGUucmF3CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl92b3JiaXNfc3RlcmVvXzEyOGticHNfNDgwMDBoei5pbmZvIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX3ZvcmJpc19zdGVyZW9fMTI4a2Jwc180ODAwMGh6LmluZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDlhNmQzMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl92b3JiaXNfc3RlcmVvXzEyOGticHNfNDgwMDBoei5pbmZvCkBAIC0wLDAgKzEsNTIwIEBACiszMCAzMiAwCis0MTQwIDMyIDAKKzMzIDMyIDAKKzUyIDEgMAorNTggMSAyNjY2Cis2MSAxIDUzMzMKKzU2IDEgODAwMAorNTkgMSAxMDY2NgorNjMgMSAxMzMzMworNjYgMSAxNjAwMAorNzEgMSAxODY2NgorNzYgMSAyMTMzMworMzc0IDEgMjQwMDAKKzM2NiAxIDM2MDAwCiszNzggMSA1NzMzMworMzkzIDEgNzg2NjYKKzM5MyAxIDEwMDAwMAorMzg2IDEgMTIxMzMzCiszNzUgMSAxNDI2NjYKKzM4OCAxIDE2NDAwMAorMzc4IDEgMTg1MzMzCiszNzkgMSAyMDY2NjYKKzM3NCAxIDIyODAwMAorMzU2IDEgMjQ5MzMzCiszNTggMSAyNzA2NjYKKzMzMiAxIDI5MjAwMAorMzM1IDEgMzEzMzMzCiszNjMgMSAzMzQ2NjYKKzM0MSAxIDM1NjAwMAorMzYwIDEgMzc3MzMzCiszNDEgMSAzOTg2NjYKKzMzNSAxIDQyMDAwMAorMzU3IDEgNDQxMzMzCiszNTUgMSA0NjI2NjYKKzM2MyAxIDQ4NDAwMAorMzgyIDEgNTA1MzMzCiszNzEgMSA1MjY2NjYKKzM1NyAxIDU0ODAwMAorMzUzIDEgNTY5MzMzCiszNTAgMSA1OTA2NjYKKzMyNyAxIDYxMjAwMAorMzE1IDEgNjMzMzMzCiszMDcgMSA2NTQ2NjYKKzMwMyAxIDY3NjAwMAorMjk1IDEgNjk3MzMzCiszMTIgMSA3MTg2NjYKKzMxNiAxIDc0MDAwMAorMzE1IDEgNzYxMzMzCiszMTggMSA3ODI2NjYKKzMzMCAxIDgwNDAwMAorMzE4IDEgODI1MzMzCiszMTUgMSA4NDY2NjYKKzMyMiAxIDg2ODAwMAorMzE1IDEgODg5MzMzCiszMTAgMSA5MTA2NjYKKzMxNSAxIDkzMjAwMAorMzE0IDEgOTUzMzMzCiszMDIgMSA5NzQ2NjYKKzMxMyAxIDk5NjAwMAorMzIyIDEgMTAxNzMzMworMzIzIDEgMTAzODY2NgorMzE5IDEgMTA2MDAwMAorMzI1IDEgMTA4MTMzMworMzI4IDEgMTEwMjY2NgorMzMwIDEgMTEyNDAwMAorMzMzIDEgMTE0NTMzMworMzMwIDEgMTE2NjY2NgorMzQ0IDEgMTE4ODAwMAorMzMxIDEgMTIwOTMzMworMzQyIDEgMTIzMDY2NgorMzM5IDEgMTI1MjAwMAorMzE0IDEgMTI3MzMzMworMjg1IDEgMTI5NDY2NgorMjk1IDEgMTMxNjAwMAorMzAyIDEgMTMzNzMzMworMzA1IDEgMTM1ODY2NgorMzA5IDEgMTM4MDAwMAorMzI3IDEgMTQwMTMzMworMzA0IDEgMTQyMjY2NgorMzM2IDEgMTQ0NDAwMAorMzUwIDEgMTQ2NTMzMworMzQ2IDEgMTQ4NjY2NgorMzUyIDEgMTUwODAwMAorMzQxIDEgMTUyOTMzMworMzQzIDEgMTU1MDY2NgorMzUxIDEgMTU3MjAwMAorMzE5IDEgMTU5MzMzMworMzI4IDEgMTYxNDY2NgorMzI4IDEgMTYzNjAwMAorMzI0IDEgMTY1NzMzMworMzM4IDEgMTY3ODY2NgorMzE3IDEgMTcwMDAwMAorMzI4IDEgMTcyMTMzMworMzM1IDEgMTc0MjY2NgorMzQxIDEgMTc2NDAwMAorMzM1IDEgMTc4NTMzMworMzQ4IDEgMTgwNjY2NgorMzYyIDEgMTgyODAwMAorMzYxIDEgMTg0OTMzMworMzQ0IDEgMTg3MDY2NgorMzQwIDEgMTg5MjAwMAorMzMzIDEgMTkxMzMzMworMzI5IDEgMTkzNDY2NgorMzI4IDEgMTk1NjAwMAorMzIzIDEgMTk3NzMzMworMzEwIDEgMTk5ODY2NgorMzE4IDEgMjAyMDAwMAorMzEyIDEgMjA0MTMzMworMjk1IDEgMjA2MjY2NgorMzI5IDEgMjA4NDAwMAorMzE4IDEgMjEwNTMzMworMzExIDEgMjEyNjY2NgorMzE3IDEgMjE0ODAwMAorNjIgMSAyMTY5MzMzCis3NSAxIDIxODEzMzMKKzczIDEgMjE4NDAwMAorMzMyIDEgMjE4NjY2NgorMzI3IDEgMjE5ODY2NgorMzMyIDEgMjIyMDAwMAorMzI1IDEgMjI0MTMzMworMzI5IDEgMjI2MjY2NgorMzMwIDEgMjI4NDAwMAorNjEgMSAyMzA1MzMzCis2MSAxIDIzMTczMzMKKzcwIDEgMjMyMDAwMAorNzAgMSAyMzIyNjY2CiszMTkgMSAyMzI1MzMzCiszMDMgMSAyMzM3MzMzCisyOTIgMSAyMzU4NjY2CiszMTMgMSAyMzgwMDAwCiszMTggMSAyNDAxMzMzCiszNDYgMSAyNDIyNjY2CiszMjggMSAyNDQ0MDAwCiszMTYgMSAyNDY1MzMzCiszNDEgMSAyNDg2NjY2CiszMjggMSAyNTA4MDAwCiszMzggMSAyNTI5MzMzCiszNDEgMSAyNTUwNjY2CiszMzcgMSAyNTcyMDAwCiszNDcgMSAyNTkzMzMzCiszODQgMSAyNjE0NjY2CiszNTggMSAyNjM2MDAwCiszNjMgMSAyNjU3MzMzCiszNjMgMSAyNjc4NjY2CiszNTggMSAyNzAwMDAwCiszMzkgMSAyNzIxMzMzCiszNjkgMSAyNzQyNjY2CiszNDMgMSAyNzY0MDAwCiszNDggMSAyNzg1MzMzCiszNjMgMSAyODA2NjY2CiszNTAgMSAyODI4MDAwCiszNTggMSAyODQ5MzMzCiszNTIgMSAyODcwNjY2CiszMzggMSAyODkyMDAwCiszMzUgMSAyOTEzMzMzCiszNDIgMSAyOTM0NjY2CiszMzggMSAyOTU2MDAwCiszNDAgMSAyOTc3MzMzCisyOTIgMSAyOTk4NjY2CisyNzkgMSAzMDIwMDAwCisyOTkgMSAzMDQxMzMzCiszMDMgMSAzMDYyNjY2CisyOTggMSAzMDg0MDAwCisyOTcgMSAzMTA1MzMzCisyODAgMSAzMTI2NjY2CisyOTcgMSAzMTQ4MDAwCisyOTAgMSAzMTY5MzMzCiszMDYgMSAzMTkwNjY2CiszMDEgMSAzMjEyMDAwCiszMDYgMSAzMjMzMzMzCisyODkgMSAzMjU0NjY2CiszMTEgMSAzMjc2MDAwCiszMTcgMSAzMjk3MzMzCiszNDQgMSAzMzE4NjY2CiszMDggMSAzMzQwMDAwCiszMDQgMSAzMzYxMzMzCiszMDQgMSAzMzgyNjY2CiszMTIgMSAzNDA0MDAwCiszMDUgMSAzNDI1MzMzCisyOTkgMSAzNDQ2NjY2CiszMDEgMSAzNDY4MDAwCiszMTggMSAzNDg5MzMzCiszMTMgMSAzNTEwNjY2CiszMzAgMSAzNTMyMDAwCiszMjUgMSAzNTUzMzMzCiszMjUgMSAzNTc0NjY2CiszMjEgMSAzNTk2MDAwCiszNDkgMSAzNjE3MzMzCisyODggMSAzNjM4NjY2CiszMDAgMSAzNjYwMDAwCiszMTIgMSAzNjgxMzMzCiszMDIgMSAzNzAyNjY2CisyNzggMSAzNzI0MDAwCisyODQgMSAzNzQ1MzMzCisyODYgMSAzNzY2NjY2CisyNzQgMSAzNzg4MDAwCisyOTUgMSAzODA5MzMzCisyODEgMSAzODMwNjY2CisyODggMSAzODUyMDAwCisyNzggMSAzODczMzMzCiszMDYgMSAzODk0NjY2Cis2MiAxIDM5MTYwMDAKKzU5IDEgMzkyODAwMAorNjEgMSAzOTMwNjY2Cis1NSAxIDM5MzMzMzMKKzcwIDEgMzkzNjAwMAorNzIgMSAzOTM4NjY2CiszMjQgMSAzOTQxMzMzCiszMDkgMSAzOTUzMzMzCiszMDEgMSAzOTc0NjY2CiszMDEgMSAzOTk2MDAwCisyOTEgMSA0MDE3MzMzCisyODkgMSA0MDM4NjY2CiszMDYgMSA0MDYwMDAwCiszMDUgMSA0MDgxMzMzCisyODYgMSA0MTAyNjY2CisyOTQgMSA0MTI0MDAwCisyOTAgMSA0MTQ1MzMzCisyOTcgMSA0MTY2NjY2CiszMDggMSA0MTg4MDAwCisyOTYgMSA0MjA5MzMzCisyOTIgMSA0MjMwNjY2CisyODcgMSA0MjUyMDAwCisyOTEgMSA0MjczMzMzCisyOTggMSA0Mjk0NjY2CisyOTUgMSA0MzE2MDAwCisyOTQgMSA0MzM3MzMzCisyOTUgMSA0MzU4NjY2CisyNzUgMSA0MzgwMDAwCisyODAgMSA0NDAxMzMzCisyODggMSA0NDIyNjY2CisyODUgMSA0NDQ0MDAwCisyNzQgMSA0NDY1MzMzCisyOTggMSA0NDg2NjY2CiszMDEgMSA0NTA4MDAwCiszMDAgMSA0NTI5MzMzCiszMDUgMSA0NTUwNjY2CisyOTcgMSA0NTcyMDAwCis1OSAxIDQ1OTMzMzMKKzU2IDEgNDYwNTMzMworNTcgMSA0NjA4MDAwCis1NSAxIDQ2MTA2NjYKKzU4IDEgNDYxMzMzMworNTcgMSA0NjE2MDAwCis1OCAxIDQ2MTg2NjYKKzY4IDEgNDYyMTMzMworNjcgMSA0NjI0MDAwCis3MSAxIDQ2MjY2NjYKKzI4OSAxIDQ2MjkzMzMKKzI4MiAxIDQ2NDEzMzMKKzI3MyAxIDQ2NjI2NjYKKzI3OSAxIDQ2ODQwMDAKKzI4NiAxIDQ3MDUzMzMKKzI4MiAxIDQ3MjY2NjYKKzI4NCAxIDQ3NDgwMDAKKzI3OCAxIDQ3NjkzMzMKKzI4MSAxIDQ3OTA2NjYKKzI4MCAxIDQ4MTIwMDAKKzI2MyAxIDQ4MzMzMzMKKzI2MCAxIDQ4NTQ2NjYKKzI3MSAxIDQ4NzYwMDAKKzI3MyAxIDQ4OTczMzMKKzI4MiAxIDQ5MTg2NjYKKzI3OSAxIDQ5NDAwMDAKKzI5NyAxIDQ5NjEzMzMKKzI5MSAxIDQ5ODI2NjYKKzMwOSAxIDUwMDQwMDAKKzI4MyAxIDUwMjUzMzMKKzI5MiAxIDUwNDY2NjYKKzMwNCAxIDUwNjgwMDAKKzI5NiAxIDUwODkzMzMKKzI5MyAxIDUxMTA2NjYKKzI4MiAxIDUxMzIwMDAKKzI3MyAxIDUxNTMzMzMKKzI4NCAxIDUxNzQ2NjYKKzI4MSAxIDUxOTYwMDAKKzI2NSAxIDUyMTczMzMKKzI3MiAxIDUyMzg2NjYKKzI3NyAxIDUyNjAwMDAKKzI4MCAxIDUyODEzMzMKKzI3NiAxIDUzMDI2NjYKKzI3MyAxIDUzMjQwMDAKKzI3OCAxIDUzNDUzMzMKKzI4MCAxIDUzNjY2NjYKKzI4MCAxIDUzODgwMDAKKzI2OCAxIDU0MDkzMzMKKzI4MiAxIDU0MzA2NjYKKzI3NyAxIDU0NTIwMDAKKzI3NCAxIDU0NzMzMzMKKzI3NSAxIDU0OTQ2NjYKKzI3MCAxIDU1MTYwMDAKKzI4MiAxIDU1MzczMzMKKzI3OSAxIDU1NTg2NjYKKzI2MCAxIDU1ODAwMDAKKzI3MiAxIDU2MDEzMzMKKzI3NSAxIDU2MjI2NjYKKzI3MyAxIDU2NDQwMDAKKzI3NiAxIDU2NjUzMzMKKzI4OCAxIDU2ODY2NjYKKzI5NCAxIDU3MDgwMDAKKzI3MSAxIDU3MjkzMzMKKzI3NyAxIDU3NTA2NjYKKzI4OCAxIDU3NzIwMDAKKzI3NiAxIDU3OTMzMzMKKzI4MiAxIDU4MTQ2NjYKKzI3NiAxIDU4MzYwMDAKKzI3NSAxIDU4NTczMzMKKzI2OCAxIDU4Nzg2NjYKKzI3MCAxIDU5MDAwMDAKKzI2NiAxIDU5MjEzMzMKKzI2OCAxIDU5NDI2NjYKKzI4MiAxIDU5NjQwMDAKKzI3OSAxIDU5ODUzMzMKKzI3OSAxIDYwMDY2NjYKKzI4NyAxIDYwMjgwMDAKKzI4NiAxIDYwNDkzMzMKKzI4MCAxIDYwNzA2NjYKKzI5MCAxIDYwOTIwMDAKKzI2NiAxIDYxMTMzMzMKKzI5MiAxIDYxMzQ2NjYKKzI2NCAxIDYxNTYwMDAKKzI3MSAxIDYxNzczMzMKKzI3NyAxIDYxOTg2NjYKKzI5MiAxIDYyMjAwMDAKKzI5OCAxIDYyNDEzMzMKKzI4NCAxIDYyNjI2NjYKKzI4NyAxIDYyODQwMDAKKzI3NSAxIDYzMDUzMzMKKzI5MSAxIDYzMjY2NjYKKzI4NyAxIDYzNDgwMDAKKzI4MyAxIDYzNjkzMzMKKzI4NCAxIDYzOTA2NjYKKzI3MSAxIDY0MTIwMDAKKzI4MiAxIDY0MzMzMzMKKzI3NyAxIDY0NTQ2NjYKKzI4MiAxIDY0NzYwMDAKKzI4NSAxIDY0OTczMzMKKzI4MCAxIDY1MTg2NjYKKzI3MSAxIDY1NDAwMDAKKzI4OSAxIDY1NjEzMzMKKzI4NyAxIDY1ODI2NjYKKzI5NCAxIDY2MDQwMDAKKzI3NyAxIDY2MjUzMzMKKzI4MSAxIDY2NDY2NjYKKzI3NCAxIDY2NjgwMDAKKzI3MSAxIDY2ODkzMzMKKzI3OSAxIDY3MTA2NjYKKzI4OCAxIDY3MzIwMDAKKzI4MCAxIDY3NTMzMzMKKzI4NCAxIDY3NzQ2NjYKKzI3OCAxIDY3OTYwMDAKKzI3NiAxIDY4MTczMzMKKzI3NSAxIDY4Mzg2NjYKKzI2MyAxIDY4NjAwMDAKKzI2NiAxIDY4ODEzMzMKKzI0NyAxIDY5MDI2NjYKKzI2OSAxIDY5MjQwMDAKKzI2MyAxIDY5NDUzMzMKKzI4MyAxIDY5NjY2NjYKKzI4MCAxIDY5ODgwMDAKKzI4MSAxIDcwMDkzMzMKKzI5OSAxIDcwMzA2NjYKKzI4NSAxIDcwNTIwMDAKKzI4OCAxIDcwNzMzMzMKKzI5OSAxIDcwOTQ2NjYKKzI4OCAxIDcxMTYwMDAKKzI3OSAxIDcxMzczMzMKKzI3NiAxIDcxNTg2NjYKKzI3NyAxIDcxODAwMDAKKzI4MiAxIDcyMDEzMzMKKzI4NSAxIDcyMjI2NjYKKzI5NSAxIDcyNDQwMDAKKzI5NCAxIDcyNjUzMzMKKzMwNCAxIDcyODY2NjYKKzI4MiAxIDczMDgwMDAKKzI5OSAxIDczMjkzMzMKKzI4MyAxIDczNTA2NjYKKzI4MiAxIDczNzIwMDAKKzI4NyAxIDczOTMzMzMKKzMwNiAxIDc0MTQ2NjYKKzMwNCAxIDc0MzYwMDAKKzI4OSAxIDc0NTczMzMKKzI5OSAxIDc0Nzg2NjYKKzI4MSAxIDc1MDAwMDAKKzI4MSAxIDc1MjEzMzMKKzY2IDEgNzU0MjY2NgorNjMgMSA3NTU0NjY2CisyODkgMSA3NTU3MzMzCisyNzAgMSA3NTY5MzMzCisyNTcgMSA3NTkwNjY2CisyNDYgMSA3NjEyMDAwCisyNjQgMSA3NjMzMzMzCisyODAgMSA3NjU0NjY2CisyNzMgMSA3Njc2MDAwCisyODUgMSA3Njk3MzMzCisyNjcgMSA3NzE4NjY2CisyNzUgMSA3NzQwMDAwCisyNzggMSA3NzYxMzMzCisyOTMgMSA3NzgyNjY2CisyODEgMSA3ODA0MDAwCisyOTcgMSA3ODI1MzMzCisyOTQgMSA3ODQ2NjY2CisyODYgMSA3ODY4MDAwCisyOTAgMSA3ODg5MzMzCisyOTAgMSA3OTEwNjY2CisyODkgMSA3OTMyMDAwCisyODYgMSA3OTUzMzMzCisyODIgMSA3OTc0NjY2CiszMDYgMSA3OTk2MDAwCisyODcgMSA4MDE3MzMzCiszMTIgMSA4MDM4NjY2CiszMTIgMSA4MDYwMDAwCiszMDcgMSA4MDgxMzMzCisyOTMgMSA4MTAyNjY2CisyODkgMSA4MTI0MDAwCisyODUgMSA4MTQ1MzMzCisyOTAgMSA4MTY2NjY2CisyODUgMSA4MTg4MDAwCiszMTEgMSA4MjA5MzMzCiszMDcgMSA4MjMwNjY2CiszMTQgMSA4MjUyMDAwCiszMTggMSA4MjczMzMzCiszMTkgMSA4Mjk0NjY2CiszMTUgMSA4MzE2MDAwCiszMDAgMSA4MzM3MzMzCisyOTUgMSA4MzU4NjY2CisyOTEgMSA4MzgwMDAwCisyODIgMSA4NDAxMzMzCisyOTUgMSA4NDIyNjY2CisyOTYgMSA4NDQ0MDAwCisyODggMSA4NDY1MzMzCiszMDQgMSA4NDg2NjY2CisyOTkgMSA4NTA4MDAwCisyOTggMSA4NTI5MzMzCiszMDUgMSA4NTUwNjY2CisyOTUgMSA4NTcyMDAwCisyOTYgMSA4NTkzMzMzCisyOTUgMSA4NjE0NjY2CisyODcgMSA4NjM2MDAwCisyOTIgMSA4NjU3MzMzCiszMDggMSA4Njc4NjY2CisyODcgMSA4NzAwMDAwCiszMDcgMSA4NzIxMzMzCisyOTUgMSA4NzQyNjY2CisyOTIgMSA4NzY0MDAwCisyOTIgMSA4Nzg1MzMzCisyNzkgMSA4ODA2NjY2CisyODkgMSA4ODI4MDAwCiszMDMgMSA4ODQ5MzMzCiszMDcgMSA4ODcwNjY2CiszMTAgMSA4ODkyMDAwCiszMDAgMSA4OTEzMzMzCisyOTkgMSA4OTM0NjY2CisyOTkgMSA4OTU2MDAwCisyODggMSA4OTc3MzMzCisyOTAgMSA4OTk4NjY2CisyOTEgMSA5MDIwMDAwCiszMDQgMSA5MDQxMzMzCisyOTkgMSA5MDYyNjY2CiszMDQgMSA5MDg0MDAwCisyOTAgMSA5MTA1MzMzCiszMDkgMSA5MTI2NjY2CiszMDEgMSA5MTQ4MDAwCisyOTYgMSA5MTY5MzMzCisyODggMSA5MTkwNjY2CiszMDUgMSA5MjEyMDAwCiszMTcgMSA5MjMzMzMzCisyOTIgMSA5MjU0NjY2CiszMDAgMSA5Mjc2MDAwCiszMDEgMSA5Mjk3MzMzCisyOTUgMSA5MzE4NjY2CisyODIgMSA5MzQwMDAwCisyOTYgMSA5MzYxMzMzCisyOTUgMSA5MzgyNjY2CisyODcgMSA5NDA0MDAwCisyOTIgMSA5NDI1MzMzCiszMDEgMSA5NDQ2NjY2CiszMTEgMSA5NDY4MDAwCiszMDEgMSA5NDg5MzMzCiszMDcgMSA5NTEwNjY2CiszMDAgMSA5NTMyMDAwCiszMDkgMSA5NTUzMzMzCisyOTggMSA5NTc0NjY2CiszMDQgMSA5NTk2MDAwCis2MCAxIDk2MTczMzMKKzU5IDEgOTYyOTMzMworNjQgMSA5NjMyMDAwCis2NCAxIDk2MzQ2NjYKKzc3IDEgOTYzNzMzMworNzIgMSA5NjQwMDAwCiszMDYgMSA5NjQyNjY2CisyOTcgMSA5NjU0NjY2CisyOTQgMSA5Njc2MDAwCisyOTUgMSA5Njk3MzMzCiszMDggMSA5NzE4NjY2CiszMDMgMSA5NzQwMDAwCiszMDggMSA5NzYxMzMzCisyODkgMSA5NzgyNjY2CiszMDAgMSA5ODA0MDAwCiszMDQgMSA5ODI1MzMzCiszMDggMSA5ODQ2NjY2Cis2NCAxIDk4NjgwMDAKKzYzIDEgOTg4MDAwMAorNjQgMSA5ODgyNjY2Cis2NCAxIDk4ODUzMzMKKzYwIDEgOTg4ODAwMAorNzQgMSA5ODkwNjY2Cis2OSAxIDk4OTMzMzMKKzY4IDEgOTg5NjAwMAorNjEgMSA5ODk4NjY2Cis3MSAxIDk5MDEzMzMKKzc2IDEgOTkwNDAwMAorNzMgMSA5OTA2NjY2Cis3MCAxIDk5MDkzMzMKKzcyIDEgOTkxMjAwMAorNjAgMSA5OTE0NjY2Cis2OSAxIDk5MTczMzMKKzgyIDEgOTkyMDAwMAorMjc4IDEgOTkyMjY2NgorMzAgMSA5OTM0NjY2CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfdm9yYmlzX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHoudm9yYmlzIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX3ZvcmJpc19zdGVyZW9fMTI4a2Jwc180ODAwMGh6LnZvcmJpcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDRjNWY4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX3ZvcmJpc19zdGVyZW9fMTI4a2Jwc180ODAwMGh6LnZvcmJpcwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfdnA4XzE3NngxNDRfMjQwa2Jwc182MGZwcy5pbmZvIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX3ZwOF8xNzZ4MTQ0XzI0MGticHNfNjBmcHMuaW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDFlYTQ1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX3ZwOF8xNzZ4MTQ0XzI0MGticHNfNjBmcHMuaW5mbwpAQCAtMCwwICsxLDYwIEBACisxMDI3MSAxIDAKKzEwNiAwIDE3MDAwCisxMzQgMCAzMzAwMAorMTQ5IDAgNTAwMDAKKzE1MiAwIDY3MDAwCisxNTkgMCA4MzAwMAorMTE0IDAgMTAwMDAwCis3MjMgMCAxMTcwMDAKKzE3NSAwIDEzMzAwMAorMTg2IDAgMTUwMDAwCisyMDEgMCAxNjcwMDAKKzI3MCAwIDE4MzAwMAorMzgzIDAgMjAwMDAwCisyNTUgMCAyMTcwMDAKKzI4NiAwIDIzMzAwMAorMjczIDAgMjUwMDAwCisxMjI0IDAgMjY3MDAwCisyMjAgMCAyODMwMDAKKzIzMSAwIDMwMDAwMAorMTkyIDAgMzE3MDAwCisxODIgMCAzMzMwMDAKKzI4OSAwIDM1MDAwMAorMjA0IDAgMzY3MDAwCisyMzcgMCAzODMwMDAKKzE4NyAwIDQwMDAwMAorODk4IDAgNDE3MDAwCisyMzEgMCA0MzMwMDAKKzI2NiAwIDQ1MDAwMAorMjc4IDAgNDY3MDAwCisyMDUgMCA0ODMwMDAKKzI1NSAwIDUwMDAwMAorMTY5IDAgNTE3MDAwCisyMzMgMCA1MzMwMDAKKzEwMTEgMCA1NTAwMDAKKzIwMiAwIDU2NzAwMAorMjUxIDAgNTgzMDAwCisyMjMgMCA2MDAwMDAKKzI4MyAwIDYxNzAwMAorMzYyIDAgNjMzMDAwCisyMTcgMCA2NTAwMDAKKzI0NSAwIDY2NzAwMAorOTYwIDAgNjgzMDAwCisyMzMgMCA3MDAwMDAKKzI4NiAwIDcxNzAwMAorMjcyIDAgNzMzMDAwCisyNTQgMCA3NTAwMDAKKzMzMSAwIDc2NzAwMAorMjE4IDAgNzgzMDAwCisyNjEgMCA4MDAwMDAKKzk4MSAwIDgxNzAwMAorMjI2IDAgODMzMDAwCisyMjYgMCA4NTAwMDAKKzI3OSAwIDg2NzAwMAorMjI1IDAgODgzMDAwCisyOTUgMCA5MDAwMDAKKzE3NSAwIDkxNzAwMAorMjQ5IDAgOTMzMDAwCis5OTYgMCA5NTAwMDAKKzE2OSAwIDk2NzAwMAorMjI0IDAgOTgzMDAwCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfdnA4XzE3NngxNDRfMjQwa2Jwc182MGZwcy52cDggYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfdnA4XzE3NngxNDRfMjQwa2Jwc182MGZwcy52cDgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmViYTU2YwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl92cDhfMTc2eDE0NF8yNDBrYnBzXzYwZnBzLnZwOApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfdnA4XzY0MHgzNjBfMm1icHNfMzBmcHMuaW5mbyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl92cDhfNjQweDM2MF8ybWJwc18zMGZwcy5pbmZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljMDBjNzcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfdnA4XzY0MHgzNjBfMm1icHNfMzBmcHMuaW5mbwpAQCAtMCwwICsxLDMwMCBAQAorODY5ODAgMSAwCis2NzQxIDAgMzMwMDAKKzk0MzMgMCA2NzAwMAorOTM2MyAwIDEwMDAwMAorODY3MSAwIDEzMzAwMAorOTAwMyAwIDE2NzAwMAorNzc1MSAwIDIwMDAwMAorMTMyMDcgMCAyMzMwMDAKKzg1NDIgMCAyNjcwMDAKKzkzNDQgMCAzMDAwMDAKKzgwNjkgMCAzMzMwMDAKKzg1ODggMCAzNjcwMDAKKzEyMDg3IDAgNDAwMDAwCis3MzE1IDAgNDMzMDAwCis5NjU0IDAgNDY3MDAwCisxMzEwMCAwIDUwMDAwMAorNzgzMiAwIDUzMzAwMAorMTAwNjAgMCA1NjcwMDAKKzg1NDAgMCA2MDAwMDAKKzg2NjcgMCA2MzMwMDAKKzg1MzIgMCA2NjcwMDAKKzYwMTggMCA3MDAwMDAKKzg1MjAgMCA3MzMwMDAKKzE1MzUwIDAgNzY3MDAwCis2MTEwIDAgODAwMDAwCis3ODc2IDAgODMzMDAwCis2MTMzIDAgODY3MDAwCis5NDc2IDAgOTAwMDAwCisxMTAwMiAwIDkzMzAwMAorNzQ4NCAwIDk2NzAwMAorODc2MCAwIDEwMDAwMDAKKzE2NTE1IDAgMTAzMzAwMAorNzQ4MiAwIDEwNjcwMDAKKzY5ODMgMCAxMTAwMDAwCis3NTYxIDAgMTEzMzAwMAorODI2MyAwIDExNjcwMDAKKzEwNjgyIDAgMTIwMDAwMAorODEwOCAwIDEyMzMwMDAKKzc5MjQgMCAxMjY3MDAwCis4NjkzIDAgMTMwMDAwMAorMTQxOTAgMCAxMzMzMDAwCis3MzkzIDAgMTM2NzAwMAorNjg2NCAwIDE0MDAwMDAKKzk0MzEgMCAxNDMzMDAwCis3Njc0IDAgMTQ2NzAwMAorODQ1OCAwIDE1MDAwMDAKKzU4OTkgMCAxNTMzMDAwCis4MjU5IDAgMTU2NzAwMAorNzk2MyAwIDE2MDAwMDAKKzE0Nzc5IDAgMTYzMzAwMAorNjg3NyAwIDE2NjcwMDAKKzcyNjggMCAxNzAwMDAwCis4NTI2IDAgMTczMzAwMAorODQ2NyAwIDE3NjcwMDAKKzExMjAwIDAgMTgwMDAwMAorNzI2MSAwIDE4MzMwMDAKKzgyODAgMCAxODY3MDAwCis2NzE4IDAgMTkwMDAwMAorMTc3NDIgMCAxOTMzMDAwCis1MjA2IDAgMTk2NzAwMAorNTcwMCAwIDIwMDAwMDAKKzU4NzIgMCAyMDMzMDAwCis3OTE1IDAgMjA2NzAwMAorODQ5MyAwIDIxMDAwMDAKKzY1NDUgMCAyMTMzMDAwCis5MDcyIDAgMjE2NzAwMAorMTMyMDAgMCAyMjAwMDAwCis5NjMyIDAgMjIzMzAwMAorMTAwMTYgMCAyMjY3MDAwCis3ODI0IDAgMjMwMDAwMAorMTA2MjggMCAyMzMzMDAwCisxMDQwMSAwIDIzNjcwMDAKKzEwODkyIDAgMjQwMDAwMAorOTAyMyAwIDI0MzMwMDAKKzEwNzM0IDAgMjQ2NzAwMAorMTUwNDUgMCAyNTAwMDAwCis3OTQwIDAgMjUzMzAwMAorOTY1NyAwIDI1NjcwMDAKKzg3NDMgMCAyNjAwMDAwCis4MDc0IDAgMjYzMzAwMAorOTQ0NSAwIDI2NjcwMDAKKzY0OTQgMCAyNzAwMDAwCis4NjAxIDAgMjczMzAwMAorMTM0NzggMCAyNzY3MDAwCis2OTQyIDAgMjgwMDAwMAorODAwMiAwIDI4MzMwMDAKKzc5NDAgMCAyODY3MDAwCis4MzIwIDAgMjkwMDAwMAorMTIyMTUgMCAyOTMzMDAwCis2NjY4IDAgMjk2NzAwMAorMTEzODQgMCAzMDAwMDAwCis4Mzc4IDAgMzAzMzAwMAorMTI5MDggMCAzMDY3MDAwCis4NDIwIDAgMzEwMDAwMAorNzUwMiAwIDMxMzMwMDAKKzg0ODIgMCAzMTY3MDAwCisxMDk2OCAwIDMyMDAwMDAKKzEyMzM4IDAgMzIzMzAwMAorODY1NyAwIDMyNjcwMDAKKzEwNDY4IDAgMzMwMDAwMAorMTM4NzggMCAzMzMzMDAwCis5Mzc0IDAgMzM2NzAwMAorOTg1NyAwIDM0MDAwMDAKKzEwMzgxIDAgMzQzMzAwMAorOTk4NCAwIDM0NjcwMDAKKzk5NTYgMCAzNTAwMDAwCis4OTA1IDAgMzUzMzAwMAorODY3MiAwIDM1NjcwMDAKKzgxMjIgMCAzNjAwMDAwCis5Njc3IDAgMzYzMzAwMAorOTgxMiAwIDM2NjcwMDAKKzk2MjIgMCAzNzAwMDAwCis5MDIzIDAgMzczMzAwMAorNzE0NyAwIDM3NjcwMDAKKzkxNDYgMCAzODAwMDAwCis3NDg4IDAgMzgzMzAwMAorMTA4MTIgMCAzODY3MDAwCis4MzQwIDAgMzkwMDAwMAorMTMyODAgMCAzOTMzMDAwCis1MTY3IDAgMzk2NzAwMAorNjk5MSAwIDQwMDAwMDAKKzY1NDMgMCA0MDMzMDAwCis1OTUyIDAgNDA2NzAwMAorNTE2NCAwIDQxMDAwMDAKKzQwMTEgMCA0MTMzMDAwCiszNzk0IDAgNDE2NzAwMAorMTI5NTkgMCA0MjAwMDAwCis3MTAyMCAxIDQyMzMwMDAKKzUzNTEgMCA0MjY3MDAwCis2MjgzIDAgNDMwMDAwMAorNTA4MCAwIDQzMzMwMDAKKzY3MDcgMCA0MzY3MDAwCis1ODU3IDAgNDQwMDAwMAorNTIyMSAwIDQ0MzMwMDAKKzEwOTcyIDAgNDQ2NzAwMAorNzAyMyAwIDQ1MDAwMDAKKzY5MDcgMCA0NTMzMDAwCis3ODUxIDAgNDU2NzAwMAorNDg0MyAwIDQ2MDAwMDAKKzYwODUgMCA0NjMzMDAwCis0ODY4IDAgNDY2NzAwMAorNTA5MyAwIDQ3MDAwMDAKKzEyODA3IDAgNDczMzAwMAorNjMzMCAwIDQ3NjcwMDAKKzQyMDkgMCA0ODAwMDAwCis0NTk2IDAgNDgzMzAwMAorNjMxNiAwIDQ4NjcwMDAKKzQ5NTQgMCA0OTAwMDAwCis1NTMzIDAgNDkzMzAwMAorNzc0OSAwIDQ5NjcwMDAKKzEyNDg2IDAgNTAwMDAwMAorNTQ2OCAwIDUwMzMwMDAKKzQzNTMgMCA1MDY3MDAwCis1Nzg2IDAgNTEwMDAwMAorNTU1MSAwIDUxMzMwMDAKKzY3MTEgMCA1MTY3MDAwCis1Njg4IDAgNTIwMDAwMAorNjI1OCAwIDUyMzMwMDAKKzEyOTc1IDAgNTI2NzAwMAorNDg3MyAwIDUzMDAwMDAKKzQ1NTIgMCA1MzMzMDAwCis0ODQ0IDAgNTM2NzAwMAorNDc3NCAwIDU0MDAwMDAKKzUwMjUgMCA1NDMzMDAwCis1MjA0IDAgNTQ2NzAwMAorNDgxNCAwIDU1MDAwMDAKKzE0ODM1IDAgNTUzMzAwMAorNTM0MyAwIDU1NjcwMDAKKzQ4MDggMCA1NjAwMDAwCis1MDcxIDAgNTYzMzAwMAorNjMyNCAwIDU2NjcwMDAKKzUyNDMgMCA1NzAwMDAwCis0OTk1IDAgNTczMzAwMAorNTEzNCAwIDU3NjcwMDAKKzExMDU0IDAgNTgwMDAwMAorNDgwNyAwIDU4MzMwMDAKKzUxMTggMCA1ODY3MDAwCis2NDI0IDAgNTkwMDAwMAorNDk4NCAwIDU5MzMwMDAKKzcxODcgMCA1OTY3MDAwCis1NTA1IDAgNjAwMDAwMAorNjk0MSAwIDYwMzMwMDAKKzExNTE3IDAgNjA2NzAwMAorNTY0NiAwIDYxMDAwMDAKKzY4MzIgMCA2MTMzMDAwCis1Mjk0IDAgNjE2NzAwMAorNjIwMCAwIDYyMDAwMDAKKzYzMjggMCA2MjMzMDAwCis0MzQ4IDAgNjI2NzAwMAorNDYwNyAwIDYzMDAwMDAKKzEyOTU4IDAgNjMzMzAwMAorNDMwOCAwIDYzNjcwMDAKKzYwODQgMCA2NDAwMDAwCis0NDk0IDAgNjQzMzAwMAorNTMzOCAwIDY0NjcwMDAKKzU3NDIgMCA2NTAwMDAwCis1NDcyIDAgNjUzMzAwMAorODQ1OSAwIDY1NjcwMDAKKzEzMDc1IDAgNjYwMDAwMAorODk4NiAwIDY2MzMwMDAKKzk1ODMgMCA2NjY3MDAwCis4NzkyIDAgNjcwMDAwMAorOTAwNCAwIDY3MzMwMDAKKzk2MzIgMCA2NzY3MDAwCis5MzkzIDAgNjgwMDAwMAorOTI1OSAwIDY4MzMwMDAKKzExOTI3IDAgNjg2NzAwMAorMTAzMjMgMCA2OTAwMDAwCisxNTI0OCAwIDY5MzMwMDAKKzExMjQ0IDAgNjk2NzAwMAorMTU1NTggMCA3MDAwMDAwCis2MTk3IDAgNzAzMzAwMAorODA0NCAwIDcwNjcwMDAKKzExNDMyIDAgNzEwMDAwMAorODczNyAwIDcxMzMwMDAKKzEzODg1IDAgNzE2NzAwMAorMTExNTggMCA3MjAwMDAwCisxNTE1MiAwIDcyMzMwMDAKKzcwMjUgMCA3MjY3MDAwCis4MDI1IDAgNzMwMDAwMAorMTMzNjIgMCA3MzMzMDAwCis4MDkwIDAgNzM2NzAwMAorMTM2MzcgMCA3NDAwMDAwCis2MTQ4IDAgNzQzMzAwMAorOTI3MCAwIDc0NjcwMDAKKzg2MzMgMCA3NTAwMDAwCisxMDY3MyAwIDc1MzMwMDAKKzE0MjA4IDAgNzU2NzAwMAorODA4NCAwIDc2MDAwMDAKKzEzNzgzIDAgNzYzMzAwMAorMTA2NjAgMCA3NjY3MDAwCis3NDY2IDAgNzcwMDAwMAorMTQ0MzMgMCA3NzMzMDAwCisxMDkzNCAwIDc3NjcwMDAKKzcyMzkgMCA3ODAwMDAwCisxMjU0OCAwIDc4MzMwMDAKKzY1NjQgMCA3ODY3MDAwCisxMDc2MSAwIDc5MDAwMDAKKzEwOTkyIDAgNzkzMzAwMAorMTI5MjQgMCA3OTY3MDAwCisxMjM0OCAwIDgwMDAwMDAKKzY3NzAgMCA4MDMzMDAwCisxNDI4OCAwIDgwNjcwMDAKKzI5MzQ1IDEgODEwMDAwMAorMTgyMiAwIDgxMzMwMDAKKzEwODcgMCA4MTY3MDAwCisxMTA5IDAgODIwMDAwMAorMjAwNyAwIDgyMzMwMDAKKzE3OTggMCA4MjY3MDAwCisxNjM1IDAgODMwMDAwMAorMTk2MDcgMCA4MzMzMDAwCis5MTkgMCA4MzY3MDAwCisyMzU3IDAgODQwMDAwMAorMzU3OCAwIDg0MzMwMDAKKzQ0OTcgMCA4NDY3MDAwCis0MzE0IDAgODUwMDAwMAorMzg1MSAwIDg1MzMwMDAKKzM4MjIgMCA4NTY3MDAwCis0MjUyIDAgODYwMDAwMAorNDc3NSAwIDg2MzMwMDAKKzEyMjAzIDAgODY2NzAwMAorNTA3OCAwIDg3MDAwMDAKKzU4NzYgMCA4NzMzMDAwCis2MTI0IDAgODc2NzAwMAorNDQ5MCAwIDg4MDAwMDAKKzM1MzggMCA4ODMzMDAwCiszNDUwIDAgODg2NzAwMAorMzYxMSAwIDg5MDAwMDAKKzI4NDcgMCA4OTMzMDAwCisyNjA1IDAgODk2NzAwMAorMTIyNDMgMCA5MDAwMDAwCisxOTQ2IDAgOTAzMzAwMAorMTg0NyAwIDkwNjcwMDAKKzIwMzUgMCA5MTAwMDAwCisyNTcyIDAgOTEzMzAwMAorMjMyNiAwIDkxNjcwMDAKKzI2NDUgMCA5MjAwMDAwCisyOTM4IDAgOTIzMzAwMAorMjQ5NSAwIDkyNjcwMDAKKzI2MDkgMCA5MzAwMDAwCis5NzQ0IDAgOTMzMzAwMAorMTc5NiAwIDkzNjcwMDAKKzE5ODUgMCA5NDAwMDAwCisxNzU5IDAgOTQzMzAwMAorMjI1OSAwIDk0NjcwMDAKKzIyMzMgMCA5NTAwMDAwCisyMDQ0IDAgOTUzMzAwMAorMjUwMiAwIDk1NjcwMDAKKzIzMDcgMCA5NjAwMDAwCisyNzM5IDAgOTYzMzAwMAorMTE3MDcgMCA5NjY3MDAwCis1MTY4IDAgOTcwMDAwMAorNDQ4MyAwIDk3MzMwMDAKKzMwNDQgMCA5NzY3MDAwCis0MjQxIDAgOTgwMDAwMAorNDM5MiAwIDk4MzMwMDAKKzQ5MzQgMCA5ODY3MDAwCis1OTM0IDAgOTkwMDAwMAorNTY0NyAwIDk5MzMwMDAKKzUzMjYgMCA5OTY3MDAwCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfdnA4XzY0MHgzNjBfMm1icHNfMzBmcHMudnA4IGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX3ZwOF82NDB4MzYwXzJtYnBzXzMwZnBzLnZwOApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWM0NjBjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX3ZwOF82NDB4MzYwXzJtYnBzXzMwZnBzLnZwOApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfdnA5XzE3NngxNDRfMjg1a2Jwc182MGZwcy5pbmZvIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX3ZwOV8xNzZ4MTQ0XzI4NWticHNfNjBmcHMuaW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTFhMDNjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX3ZwOV8xNzZ4MTQ0XzI4NWticHNfNjBmcHMuaW5mbwpAQCAtMCwwICsxLDYwIEBACis2OTM5IDEgMAorNjgxOCAwIDE3MDAwCiszMTAgMCAzMzAwMAorMjczIDAgNTAwMDAKKzI2NyAwIDY3MDAwCisyMzkgMCA4MzAwMAorMjMyIDAgMTAwMDAwCisyMjIgMCAxMTcwMDAKKzE4NiAwIDEzMzAwMAorMTk0IDAgMTUwMDAwCisxODkgMCAxNjcwMDAKKzE4IDAgMTgzMDAwCisyMDE0IDAgMjAwMDAwCisyOTcgMCAyMTcwMDAKKzI4NyAwIDIzMzAwMAorMjM3IDAgMjUwMDAwCisyNjMgMCAyNjcwMDAKKzIzOCAwIDI4MzAwMAorMjU3IDAgMzAwMDAwCisyMjkgMCAzMTcwMDAKKzE4NyAwIDMzMzAwMAorMTkxIDAgMzUwMDAwCisxOCAwIDM2NzAwMAorMjIwMyAwIDM4MzAwMAorMjY1IDAgNDAwMDAwCisyMjQgMCA0MTcwMDAKKzI1NCAwIDQzMzAwMAorMjUyIDAgNDUwMDAwCisyNzMgMCA0NjcwMDAKKzIwOCAwIDQ4MzAwMAorMTU0IDAgNTAwMDAwCisxODIgMCA1MTcwMDAKKzEzOCAwIDUzMzAwMAorMTggMCA1NTAwMDAKKzI1MDIgMCA1NjcwMDAKKzI4NiAwIDU4MzAwMAorMzA0IDAgNjAwMDAwCiszNDEgMCA2MTcwMDAKKzI1OSAwIDYzMzAwMAorMjc1IDAgNjUwMDAwCisyMjIgMCA2NjcwMDAKKzI1NCAwIDY4MzAwMAorMjUzIDAgNzAwMDAwCisyMjUgMCA3MTcwMDAKKzE4IDAgNzMzMDAwCisyNTAxIDAgNzUwMDAwCisyODIgMCA3NjcwMDAKKzI5OCAwIDc4MzAwMAorMjUyIDAgODAwMDAwCisyNDIgMCA4MTcwMDAKKzI1MCAwIDgzMzAwMAorMjYwIDAgODUwMDAwCisyMTggMCA4NjcwMDAKKzIxMyAwIDg4MzAwMAorMTQ0IDAgOTAwMDAwCisxOCAwIDkxNzAwMAorMjMzIDAgOTMzMDAwCisyNTQgMCA5NTAwMDAKKzIyOSAwIDk2NzAwMAorMjM5IDAgOTgzMDAwCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfdnA5XzE3NngxNDRfMjg1a2Jwc182MGZwcy52cDkgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfdnA5XzE3NngxNDRfMjg1a2Jwc182MGZwcy52cDkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjYzM2M4YQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl92cDlfMTc2eDE0NF8yODVrYnBzXzYwZnBzLnZwOQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfdnA5XzY0MHgzNjBfMTYwMGticHNfMzBmcHMuaW5mbyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl92cDlfNjQweDM2MF8xNjAwa2Jwc18zMGZwcy5pbmZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmZTk2NzkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfdnA5XzY0MHgzNjBfMTYwMGticHNfMzBmcHMuaW5mbwpAQCAtMCwwICsxLDMwMCBAQAorNTQ5MTggMSAwCis0NjI4MCAwIDMzMDAwCisyMDA2IDAgNjcwMDAKKzI4NDEgMCAxMDAwMDAKKzMwNDQgMCAxMzMwMDAKKzM0MjkgMCAxNjcwMDAKKzMxOTYgMCAyMDAwMDAKKzI5MjYgMCAyMzMwMDAKKzI4MjEgMCAyNjcwMDAKKzExNTAgMCAzMDAwMDAKKzM2IDAgMzMzMDAwCiszODA4NCAwIDM2NzAwMAorMzY4OSAwIDQwMDAwMAorMzQ3MyAwIDQzMzAwMAorMzAxMSAwIDQ2NzAwMAorMzA5MCAwIDUwMDAwMAorMjUxNiAwIDUzMzAwMAorMjc3MSAwIDU2NzAwMAorMzI1MCAwIDYwMDAwMAorMTE1OSAwIDYzMzAwMAorMzQgMCA2NjcwMDAKKzM5NjkwIDAgNzAwMDAwCiszNjE1IDAgNzMzMDAwCisyNDk0IDAgNzY3MDAwCisyODkzIDAgODAwMDAwCiszMzI5IDAgODMzMDAwCisyOTM5IDAgODY3MDAwCisyMzUyIDAgOTAwMDAwCisyNzMyIDAgOTMzMDAwCisxNzQ2IDAgOTY3MDAwCiszMyAwIDEwMDAwMDAKKzQxNTAxIDAgMTAzMzAwMAorMjk5NyAwIDEwNjcwMDAKKzI2NjYgMCAxMTAwMDAwCiszNTgyIDAgMTEzMzAwMAorMjYxNiAwIDExNjcwMDAKKzI5MjMgMCAxMjAwMDAwCisyNjk2IDAgMTIzMzAwMAorMTYyOCAwIDEyNjcwMDAKKzE4ODcgMCAxMzAwMDAwCiszMyAwIDEzMzMwMDAKKzQyODc2IDAgMTM2NzAwMAorMjU4OCAwIDE0MDAwMDAKKzMzMTYgMCAxNDMzMDAwCisyMjg3IDAgMTQ2NzAwMAorMzM3NSAwIDE1MDAwMDAKKzIxMDggMCAxNTMzMDAwCisyOTYxIDAgMTU2NzAwMAorMTczMCAwIDE2MDAwMDAKKzE4MDAgMCAxNjMzMDAwCiszNCAwIDE2NjcwMDAKKzQzNzk3IDAgMTcwMDAwMAorMjQ4NCAwIDE3MzMwMDAKKzI1NTYgMCAxNzY3MDAwCisyNjcxIDAgMTgwMDAwMAorMjMzOCAwIDE4MzMwMDAKKzMxMzMgMCAxODY3MDAwCisyMDAyIDAgMTkwMDAwMAorMTc5NCAwIDE5MzMwMDAKKzEyNzkgMCAxOTY3MDAwCiszMiAwIDIwMDAwMDAKKzQyNjQyIDAgMjAzMzAwMAorMjY4NiAwIDIwNjcwMDAKKzIyMDIgMCAyMTAwMDAwCisyMTQ1IDAgMjEzMzAwMAorMjU2NiAwIDIxNjcwMDAKKzIxOTAgMCAyMjAwMDAwCisxNTgwIDAgMjIzMzAwMAorMTcxMSAwIDIyNjcwMDAKKzY0OCAwIDIzMDAwMDAKKzMyIDAgMjMzMzAwMAorNDA0MDkgMCAyMzY3MDAwCisyNjI4IDAgMjQwMDAwMAorMTk3MyAwIDI0MzMwMDAKKzIzNjAgMCAyNDY3MDAwCiszMDQzIDAgMjUwMDAwMAorMTczMCAwIDI1MzMwMDAKKzE0NTYgMCAyNTY3MDAwCisyMzEyIDAgMjYwMDAwMAorMzY5IDAgMjYzMzAwMAorMzIgMCAyNjY3MDAwCis0MTM5MSAwIDI3MDAwMDAKKzI5NjcgMCAyNzMzMDAwCisyNDU0IDAgMjc2NzAwMAorMTgyNSAwIDI4MDAwMDAKKzE4NTMgMCAyODMzMDAwCisxNzQ2IDAgMjg2NzAwMAorMjM0NyAwIDI5MDAwMDAKKzEzNjIgMCAyOTMzMDAwCis0NDEgMCAyOTY3MDAwCiszNCAwIDMwMDAwMDAKKzQyNTAzIDAgMzAzMzAwMAorMTg3NyAwIDMwNjcwMDAKKzE2OTAgMCAzMTAwMDAwCisxMzY3IDAgMzEzMzAwMAorMTUyMCAwIDMxNjcwMDAKKzEyNDAgMCAzMjAwMDAwCisxMDk0IDAgMzIzMzAwMAorNzM5IDAgMzI2NzAwMAorMzkyIDAgMzMwMDAwMAorMzMgMCAzMzMzMDAwCiszNTEwNCAwIDMzNjcwMDAKKzE0NjMgMCAzNDAwMDAwCisyMDI5IDAgMzQzMzAwMAorMTYyNiAwIDM0NjcwMDAKKzE5NTYgMCAzNTAwMDAwCis3OTkgMCAzNTMzMDAwCis1NTYgMCAzNTY3MDAwCis1ODQgMCAzNjAwMDAwCisxOTEgMCAzNjMzMDAwCiszNiAwIDM2NjcwMDAKKzM3NjUyIDAgMzcwMDAwMAorODYyIDAgMzczMzAwMAorNTI0IDAgMzc2NzAwMAorNjQxIDAgMzgwMDAwMAorNTg0IDAgMzgzMzAwMAorMzYwIDAgMzg2NzAwMAorMzY1IDAgMzkwMDAwMAorMzYxIDAgMzkzMzAwMAorMTU0IDAgMzk2NzAwMAorMzYgMCA0MDAwMDAwCisxMjU3NDAgMCA0MDMzMDAwCiszMzIgMCA0MDY3MDAwCiszODEgMCA0MTAwMDAwCis0MjAgMCA0MTMzMDAwCis0NjQgMCA0MTY3MDAwCisyODggMCA0MjAwMDAwCisyNjYwIDAgNDIzMzAwMAorMTI3NTY0IDEgNDI2NzAwMAorMzA2OTYgMCA0MzAwMDAwCiszNDIzIDAgNDMzMzAwMAorMzMxMCAwIDQzNjcwMDAKKzM1MTMgMCA0NDAwMDAwCiszNzM1IDAgNDQzMzAwMAorMzM1OCAwIDQ0NjcwMDAKKzMxMDggMCA0NTAwMDAwCisyODAwIDAgNDUzMzAwMAorMTc1MSAwIDQ1NjcwMDAKKzQxIDAgNDYwMDAwMAorMzk4NjIgMCA0NjMzMDAwCiszNzM5IDAgNDY2NzAwMAorMzc1NSAwIDQ3MDAwMDAKKzM0MDggMCA0NzMzMDAwCiszNzgzIDAgNDc2NzAwMAorMzQyMyAwIDQ4MDAwMDAKKzI4MDEgMCA0ODMzMDAwCisyNTQ5IDAgNDg2NzAwMAorMTQ2MSAwIDQ5MDAwMDAKKzQwIDAgNDkzMzAwMAorNDE2NjcgMCA0OTY3MDAwCiszNjIzIDAgNTAwMDAwMAorMzM1NiAwIDUwMzMwMDAKKzM0MjQgMCA1MDY3MDAwCiszNTQ4IDAgNTEwMDAwMAorMzExOSAwIDUxMzMwMDAKKzI5MDUgMCA1MTY3MDAwCisyNzcyIDAgNTIwMDAwMAorMTYyMyAwIDUyMzMwMDAKKzQzIDAgNTI2NzAwMAorNDY3ODMgMCA1MzAwMDAwCiszNDYyIDAgNTMzMzAwMAorMzQ3MCAwIDUzNjcwMDAKKzM2NzcgMCA1NDAwMDAwCiszNjg0IDAgNTQzMzAwMAorMzI2NiAwIDU0NjcwMDAKKzMxMjcgMCA1NTAwMDAwCisyODA5IDAgNTUzMzAwMAorMTc1MCAwIDU1NjcwMDAKKzQwIDAgNTYwMDAwMAorNDYyMTUgMCA1NjMzMDAwCiszNTk5IDAgNTY2NzAwMAorMzU1OCAwIDU3MDAwMDAKKzM1NDQgMCA1NzMzMDAwCiszNjMyIDAgNTc2NzAwMAorMzU0OCAwIDU4MDAwMDAKKzI5NjggMCA1ODMzMDAwCisyNzE1IDAgNTg2NzAwMAorMTcyOSAwIDU5MDAwMDAKKzQxIDAgNTkzMzAwMAorNDU5NTggMCA1OTY3MDAwCiszNzc2IDAgNjAwMDAwMAorMzUyNSAwIDYwMzMwMDAKKzM2NDQgMCA2MDY3MDAwCiszNzg2IDAgNjEwMDAwMAorMzIyMiAwIDYxMzMwMDAKKzI5MjMgMCA2MTY3MDAwCisyNzUyIDAgNjIwMDAwMAorMTU5MiAwIDYyMzMwMDAKKzQxIDAgNjI2NzAwMAorNDYwMzEgMCA2MzAwMDAwCiszNTIwIDAgNjMzMzAwMAorMzM4MCAwIDYzNjcwMDAKKzMzNzEgMCA2NDAwMDAwCiszNDI3IDAgNjQzMzAwMAorMzEzNSAwIDY0NjcwMDAKKzI5ODggMCA2NTAwMDAwCisyNzMwIDAgNjUzMzAwMAorMTY3MSAwIDY1NjcwMDAKKzQxIDAgNjYwMDAwMAorNDU4NDYgMCA2NjMzMDAwCiszNTM1IDAgNjY2NzAwMAorMzUwNyAwIDY3MDAwMDAKKzM0MjkgMCA2NzMzMDAwCiszNDkxIDAgNjc2NzAwMAorMzMyNSAwIDY4MDAwMDAKKzI5NzkgMCA2ODMzMDAwCisyODAwIDAgNjg2NzAwMAorMTYxMCAwIDY5MDAwMDAKKzQwIDAgNjkzMzAwMAorNDU5NTggMCA2OTY3MDAwCiszNzYyIDAgNzAwMDAwMAorMzI1NCAwIDcwMzMwMDAKKzM0MDggMCA3MDY3MDAwCiszODYwIDAgNzEwMDAwMAorMzE5OCAwIDcxMzMwMDAKKzI5NjYgMCA3MTY3MDAwCisyODgyIDAgNzIwMDAwMAorMTc2MyAwIDcyMzMwMDAKKzQyIDAgNzI2NzAwMAorNDYxMzAgMCA3MzAwMDAwCiszNTkzIDAgNzMzMzAwMAorMzUyMyAwIDczNjcwMDAKKzM5MzkgMCA3NDAwMDAwCiszOTgwIDAgNzQzMzAwMAorMzQ3MCAwIDc0NjcwMDAKKzMxOTEgMCA3NTAwMDAwCisyOTY5IDAgNzUzMzAwMAorMTc0MCAwIDc1NjcwMDAKKzQxIDAgNzYwMDAwMAorNDYzMDAgMCA3NjMzMDAwCiszNzM5IDAgNzY2NzAwMAorMzc4MSAwIDc3MDAwMDAKKzM5NjQgMCA3NzMzMDAwCis0MDIzIDAgNzc2NzAwMAorMzQ4MCAwIDc4MDAwMDAKKzMwNjUgMCA3ODMzMDAwCisyOTM0IDAgNzg2NzAwMAorMTgwNSAwIDc5MDAwMDAKKzQyIDAgNzkzMzAwMAorMzgxNjYgMCA3OTY3MDAwCis0MDYyIDAgODAwMDAwMAorMzg0NCAwIDgwMzMwMDAKKzQ1NDcgMCA4MDY3MDAwCis5MzQgMCA4MTAwMDAwCiszNjUgMCA4MTMzMDAwCisxODEgMCA4MTY3MDAwCis0NjMgMCA4MjAwMDAwCis0MTkgMCA4MjMzMDAwCiszOCAwIDgyNjcwMDAKKzk3MDIgMCA4MzAwMDAwCiszNDQgMCA4MzMzMDAwCisyNzYgMCA4MzY3MDAwCisxMzUwIDAgODQwMDAwMAorMTcwMyAwIDg0MzMwMDAKKzE4NDMgMCA4NDY3MDAwCisxMjI4IDAgODUwMDAwMAorMzU1ODAgMSA4NTMzMDAwCisyNzQ1OCAwIDg1NjcwMDAKKzIxNDQgMCA4NjAwMDAwCisyNDgyIDAgODYzMzAwMAorMjAwNCAwIDg2NjcwMDAKKzI4MjIgMCA4NzAwMDAwCisyNTcwIDAgODczMzAwMAorMTcyNiAwIDg3NjcwMDAKKzEyNDggMCA4ODAwMDAwCis4NDQgMCA4ODMzMDAwCiszNSAwIDg4NjcwMDAKKzE0MjA3IDAgODkwMDAwMAorMTAzNyAwIDg5MzMwMDAKKzc0OSAwIDg5NjcwMDAKKzgyOSAwIDkwMDAwMDAKKzkxNSAwIDkwMzMwMDAKKzY4NSAwIDkwNjcwMDAKKzc2NyAwIDkxMDAwMDAKKzc5OCAwIDkxMzMwMDAKKzM0MiAwIDkxNjcwMDAKKzMxIDAgOTIwMDAwMAorMTI1OTAgMCA5MjMzMDAwCis5MjMgMCA5MjY3MDAwCis4MTkgMCA5MzAwMDAwCis3NzYgMCA5MzMzMDAwCis4NjMgMCA5MzY3MDAwCis3MjkgMCA5NDAwMDAwCis0NzEgMCA5NDMzMDAwCis2MzggMCA5NDY3MDAwCisyNzYgMCA5NTAwMDAwCiszOCAwIDk1MzMwMDAKKzE3MjcyIDAgOTU2NzAwMAorODU2IDAgOTYwMDAwMAorMTE1OCAwIDk2MzMwMDAKKzIxNzIgMCA5NjY3MDAwCisyNzUxIDAgOTcwMDAwMAorMjE0MiAwIDk3MzMwMDAKKzEyNjcgMCA5NzY3MDAwCisxOTY1IDAgOTgwMDAwMAorMTUxMCAwIDk4MzMwMDAKKzM0IDAgOTg2NzAwMAorMjY5MiAwIDk5MDAwMDAKKzI3NzggMCA5OTMzMDAwCisyNTg1IDAgOTk2NzAwMApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX3ZwOV82NDB4MzYwXzE2MDBrYnBzXzMwZnBzLnZwOSBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl92cDlfNjQweDM2MF8xNjAwa2Jwc18zMGZwcy52cDkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFlMjAwMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl92cDlfNjQweDM2MF8xNjAwa2Jwc18zMGZwcy52cDkKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvc2luZV9hbXJuYl8xY2hfMTJrYnBzXzgwMDBoei5hbXJuYiBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL3NpbmVfYW1ybmJfMWNoXzEya2Jwc184MDAwaHouYW1ybmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RhZjJlMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL3NpbmVfYW1ybmJfMWNoXzEya2Jwc184MDAwaHouYW1ybmIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvc2luZV9hbXJuYl8xY2hfMTJrYnBzXzgwMDBoei5pbmZvIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvc2luZV9hbXJuYl8xY2hfMTJrYnBzXzgwMDBoei5pbmZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzNmU4MTMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9zaW5lX2Ftcm5iXzFjaF8xMmticHNfODAwMGh6LmluZm8KQEAgLTAsMCArMSw4MzMgQEAKKzMyIDEgMAorMzIgMSAyMDAwMAorMzIgMSA0MDAwMAorMzIgMSA2MDAwMAorMzIgMSA4MDAwMAorMzIgMSAxMDAwMDAKKzMyIDEgMTIwMDAwCiszMiAxIDE0MDAwMAorMzIgMSAxNjAwMDAKKzMyIDEgMTgwMDAwCiszMiAxIDIwMDAwMAorMzIgMSAyMjAwMDAKKzMyIDEgMjQwMDAwCiszMiAxIDI2MDAwMAorMzIgMSAyODAwMDAKKzMyIDEgMzAwMDAwCiszMiAxIDMyMDAwMAorMzIgMSAzNDAwMDAKKzMyIDEgMzYwMDAwCiszMiAxIDM4MDAwMAorMzIgMSA0MDAwMDAKKzMyIDEgNDIwMDAwCiszMiAxIDQ0MDAwMAorMzIgMSA0NjAwMDAKKzMyIDEgNDgwMDAwCiszMiAxIDUwMDAwMAorMzIgMSA1MjAwMDAKKzMyIDEgNTQwMDAwCiszMiAxIDU2MDAwMAorMzIgMSA1ODAwMDAKKzMyIDEgNjAwMDAwCiszMiAxIDYyMDAwMAorMzIgMSA2NDAwMDAKKzMyIDEgNjYwMDAwCiszMiAxIDY4MDAwMAorMzIgMSA3MDAwMDAKKzMyIDEgNzIwMDAwCiszMiAxIDc0MDAwMAorMzIgMSA3NjAwMDAKKzMyIDEgNzgwMDAwCiszMiAxIDgwMDAwMAorMzIgMSA4MjAwMDAKKzMyIDEgODQwMDAwCiszMiAxIDg2MDAwMAorMzIgMSA4ODAwMDAKKzMyIDEgOTAwMDAwCiszMiAxIDkyMDAwMAorMzIgMSA5NDAwMDAKKzMyIDEgOTYwMDAwCiszMiAxIDk4MDAwMAorMzIgMSAxMDAwMDAwCiszMiAxIDEwMjAwMDAKKzMyIDEgMTA0MDAwMAorMzIgMSAxMDYwMDAwCiszMiAxIDEwODAwMDAKKzMyIDEgMTEwMDAwMAorMzIgMSAxMTIwMDAwCiszMiAxIDExNDAwMDAKKzMyIDEgMTE2MDAwMAorMzIgMSAxMTgwMDAwCiszMiAxIDEyMDAwMDAKKzMyIDEgMTIyMDAwMAorMzIgMSAxMjQwMDAwCiszMiAxIDEyNjAwMDAKKzMyIDEgMTI4MDAwMAorMzIgMSAxMzAwMDAwCiszMiAxIDEzMjAwMDAKKzMyIDEgMTM0MDAwMAorMzIgMSAxMzYwMDAwCiszMiAxIDEzODAwMDAKKzMyIDEgMTQwMDAwMAorMzIgMSAxNDIwMDAwCiszMiAxIDE0NDAwMDAKKzMyIDEgMTQ2MDAwMAorMzIgMSAxNDgwMDAwCiszMiAxIDE1MDAwMDAKKzMyIDEgMTUyMDAwMAorMzIgMSAxNTQwMDAwCiszMiAxIDE1NjAwMDAKKzMyIDEgMTU4MDAwMAorMzIgMSAxNjAwMDAwCiszMiAxIDE2MjAwMDAKKzMyIDEgMTY0MDAwMAorMzIgMSAxNjYwMDAwCiszMiAxIDE2ODAwMDAKKzMyIDEgMTcwMDAwMAorMzIgMSAxNzIwMDAwCiszMiAxIDE3NDAwMDAKKzMyIDEgMTc2MDAwMAorMzIgMSAxNzgwMDAwCiszMiAxIDE4MDAwMDAKKzMyIDEgMTgyMDAwMAorMzIgMSAxODQwMDAwCiszMiAxIDE4NjAwMDAKKzMyIDEgMTg4MDAwMAorMzIgMSAxOTAwMDAwCiszMiAxIDE5MjAwMDAKKzMyIDEgMTk0MDAwMAorMzIgMSAxOTYwMDAwCiszMiAxIDE5ODAwMDAKKzMyIDEgMjAwMDAwMAorMzIgMSAyMDIwMDAwCiszMiAxIDIwNDAwMDAKKzMyIDEgMjA2MDAwMAorMzIgMSAyMDgwMDAwCiszMiAxIDIxMDAwMDAKKzMyIDEgMjEyMDAwMAorMzIgMSAyMTQwMDAwCiszMiAxIDIxNjAwMDAKKzMyIDEgMjE4MDAwMAorMzIgMSAyMjAwMDAwCiszMiAxIDIyMjAwMDAKKzMyIDEgMjI0MDAwMAorMzIgMSAyMjYwMDAwCiszMiAxIDIyODAwMDAKKzMyIDEgMjMwMDAwMAorMzIgMSAyMzIwMDAwCiszMiAxIDIzNDAwMDAKKzMyIDEgMjM2MDAwMAorMzIgMSAyMzgwMDAwCiszMiAxIDI0MDAwMDAKKzMyIDEgMjQyMDAwMAorMzIgMSAyNDQwMDAwCiszMiAxIDI0NjAwMDAKKzMyIDEgMjQ4MDAwMAorMzIgMSAyNTAwMDAwCiszMiAxIDI1MjAwMDAKKzMyIDEgMjU0MDAwMAorMzIgMSAyNTYwMDAwCiszMiAxIDI1ODAwMDAKKzMyIDEgMjYwMDAwMAorMzIgMSAyNjIwMDAwCiszMiAxIDI2NDAwMDAKKzMyIDEgMjY2MDAwMAorMzIgMSAyNjgwMDAwCiszMiAxIDI3MDAwMDAKKzMyIDEgMjcyMDAwMAorMzIgMSAyNzQwMDAwCiszMiAxIDI3NjAwMDAKKzMyIDEgMjc4MDAwMAorMzIgMSAyODAwMDAwCiszMiAxIDI4MjAwMDAKKzMyIDEgMjg0MDAwMAorMzIgMSAyODYwMDAwCiszMiAxIDI4ODAwMDAKKzMyIDEgMjkwMDAwMAorMzIgMSAyOTIwMDAwCiszMiAxIDI5NDAwMDAKKzMyIDEgMjk2MDAwMAorMzIgMSAyOTgwMDAwCiszMiAxIDMwMDAwMDAKKzMyIDEgMzAyMDAwMAorMzIgMSAzMDQwMDAwCiszMiAxIDMwNjAwMDAKKzMyIDEgMzA4MDAwMAorMzIgMSAzMTAwMDAwCiszMiAxIDMxMjAwMDAKKzMyIDEgMzE0MDAwMAorMzIgMSAzMTYwMDAwCiszMiAxIDMxODAwMDAKKzMyIDEgMzIwMDAwMAorMzIgMSAzMjIwMDAwCiszMiAxIDMyNDAwMDAKKzMyIDEgMzI2MDAwMAorMzIgMSAzMjgwMDAwCiszMiAxIDMzMDAwMDAKKzMyIDEgMzMyMDAwMAorMzIgMSAzMzQwMDAwCiszMiAxIDMzNjAwMDAKKzMyIDEgMzM4MDAwMAorMzIgMSAzNDAwMDAwCiszMiAxIDM0MjAwMDAKKzMyIDEgMzQ0MDAwMAorMzIgMSAzNDYwMDAwCiszMiAxIDM0ODAwMDAKKzMyIDEgMzUwMDAwMAorMzIgMSAzNTIwMDAwCiszMiAxIDM1NDAwMDAKKzMyIDEgMzU2MDAwMAorMzIgMSAzNTgwMDAwCiszMiAxIDM2MDAwMDAKKzMyIDEgMzYyMDAwMAorMzIgMSAzNjQwMDAwCiszMiAxIDM2NjAwMDAKKzMyIDEgMzY4MDAwMAorMzIgMSAzNzAwMDAwCiszMiAxIDM3MjAwMDAKKzMyIDEgMzc0MDAwMAorMzIgMSAzNzYwMDAwCiszMiAxIDM3ODAwMDAKKzMyIDEgMzgwMDAwMAorMzIgMSAzODIwMDAwCiszMiAxIDM4NDAwMDAKKzMyIDEgMzg2MDAwMAorMzIgMSAzODgwMDAwCiszMiAxIDM5MDAwMDAKKzMyIDEgMzkyMDAwMAorMzIgMSAzOTQwMDAwCiszMiAxIDM5NjAwMDAKKzMyIDEgMzk4MDAwMAorMzIgMSA0MDAwMDAwCiszMiAxIDQwMjAwMDAKKzMyIDEgNDA0MDAwMAorMzIgMSA0MDYwMDAwCiszMiAxIDQwODAwMDAKKzMyIDEgNDEwMDAwMAorMzIgMSA0MTIwMDAwCiszMiAxIDQxNDAwMDAKKzMyIDEgNDE2MDAwMAorMzIgMSA0MTgwMDAwCiszMiAxIDQyMDAwMDAKKzMyIDEgNDIyMDAwMAorMzIgMSA0MjQwMDAwCiszMiAxIDQyNjAwMDAKKzMyIDEgNDI4MDAwMAorMzIgMSA0MzAwMDAwCiszMiAxIDQzMjAwMDAKKzMyIDEgNDM0MDAwMAorMzIgMSA0MzYwMDAwCiszMiAxIDQzODAwMDAKKzMyIDEgNDQwMDAwMAorMzIgMSA0NDIwMDAwCiszMiAxIDQ0NDAwMDAKKzMyIDEgNDQ2MDAwMAorMzIgMSA0NDgwMDAwCiszMiAxIDQ1MDAwMDAKKzMyIDEgNDUyMDAwMAorMzIgMSA0NTQwMDAwCiszMiAxIDQ1NjAwMDAKKzMyIDEgNDU4MDAwMAorMzIgMSA0NjAwMDAwCiszMiAxIDQ2MjAwMDAKKzMyIDEgNDY0MDAwMAorMzIgMSA0NjYwMDAwCiszMiAxIDQ2ODAwMDAKKzMyIDEgNDcwMDAwMAorMzIgMSA0NzIwMDAwCiszMiAxIDQ3NDAwMDAKKzMyIDEgNDc2MDAwMAorMzIgMSA0NzgwMDAwCiszMiAxIDQ4MDAwMDAKKzMyIDEgNDgyMDAwMAorMzIgMSA0ODQwMDAwCiszMiAxIDQ4NjAwMDAKKzMyIDEgNDg4MDAwMAorMzIgMSA0OTAwMDAwCiszMiAxIDQ5MjAwMDAKKzMyIDEgNDk0MDAwMAorMzIgMSA0OTYwMDAwCiszMiAxIDQ5ODAwMDAKKzMyIDEgNTAwMDAwMAorMzIgMSA1MDIwMDAwCiszMiAxIDUwNDAwMDAKKzMyIDEgNTA2MDAwMAorMzIgMSA1MDgwMDAwCiszMiAxIDUxMDAwMDAKKzMyIDEgNTEyMDAwMAorMzIgMSA1MTQwMDAwCiszMiAxIDUxNjAwMDAKKzMyIDEgNTE4MDAwMAorMzIgMSA1MjAwMDAwCiszMiAxIDUyMjAwMDAKKzMyIDEgNTI0MDAwMAorMzIgMSA1MjYwMDAwCiszMiAxIDUyODAwMDAKKzMyIDEgNTMwMDAwMAorMzIgMSA1MzIwMDAwCiszMiAxIDUzNDAwMDAKKzMyIDEgNTM2MDAwMAorMzIgMSA1MzgwMDAwCiszMiAxIDU0MDAwMDAKKzMyIDEgNTQyMDAwMAorMzIgMSA1NDQwMDAwCiszMiAxIDU0NjAwMDAKKzMyIDEgNTQ4MDAwMAorMzIgMSA1NTAwMDAwCiszMiAxIDU1MjAwMDAKKzMyIDEgNTU0MDAwMAorMzIgMSA1NTYwMDAwCiszMiAxIDU1ODAwMDAKKzMyIDEgNTYwMDAwMAorMzIgMSA1NjIwMDAwCiszMiAxIDU2NDAwMDAKKzMyIDEgNTY2MDAwMAorMzIgMSA1NjgwMDAwCiszMiAxIDU3MDAwMDAKKzMyIDEgNTcyMDAwMAorMzIgMSA1NzQwMDAwCiszMiAxIDU3NjAwMDAKKzMyIDEgNTc4MDAwMAorMzIgMSA1ODAwMDAwCiszMiAxIDU4MjAwMDAKKzMyIDEgNTg0MDAwMAorMzIgMSA1ODYwMDAwCiszMiAxIDU4ODAwMDAKKzMyIDEgNTkwMDAwMAorMzIgMSA1OTIwMDAwCiszMiAxIDU5NDAwMDAKKzMyIDEgNTk2MDAwMAorMzIgMSA1OTgwMDAwCiszMiAxIDYwMDAwMDAKKzMyIDEgNjAyMDAwMAorMzIgMSA2MDQwMDAwCiszMiAxIDYwNjAwMDAKKzMyIDEgNjA4MDAwMAorMzIgMSA2MTAwMDAwCiszMiAxIDYxMjAwMDAKKzMyIDEgNjE0MDAwMAorMzIgMSA2MTYwMDAwCiszMiAxIDYxODAwMDAKKzMyIDEgNjIwMDAwMAorMzIgMSA2MjIwMDAwCiszMiAxIDYyNDAwMDAKKzMyIDEgNjI2MDAwMAorMzIgMSA2MjgwMDAwCiszMiAxIDYzMDAwMDAKKzMyIDEgNjMyMDAwMAorMzIgMSA2MzQwMDAwCiszMiAxIDYzNjAwMDAKKzMyIDEgNjM4MDAwMAorMzIgMSA2NDAwMDAwCiszMiAxIDY0MjAwMDAKKzMyIDEgNjQ0MDAwMAorMzIgMSA2NDYwMDAwCiszMiAxIDY0ODAwMDAKKzMyIDEgNjUwMDAwMAorMzIgMSA2NTIwMDAwCiszMiAxIDY1NDAwMDAKKzMyIDEgNjU2MDAwMAorMzIgMSA2NTgwMDAwCiszMiAxIDY2MDAwMDAKKzMyIDEgNjYyMDAwMAorMzIgMSA2NjQwMDAwCiszMiAxIDY2NjAwMDAKKzMyIDEgNjY4MDAwMAorMzIgMSA2NzAwMDAwCiszMiAxIDY3MjAwMDAKKzMyIDEgNjc0MDAwMAorMzIgMSA2NzYwMDAwCiszMiAxIDY3ODAwMDAKKzMyIDEgNjgwMDAwMAorMzIgMSA2ODIwMDAwCiszMiAxIDY4NDAwMDAKKzMyIDEgNjg2MDAwMAorMzIgMSA2ODgwMDAwCiszMiAxIDY5MDAwMDAKKzMyIDEgNjkyMDAwMAorMzIgMSA2OTQwMDAwCiszMiAxIDY5NjAwMDAKKzMyIDEgNjk4MDAwMAorMzIgMSA3MDAwMDAwCiszMiAxIDcwMjAwMDAKKzMyIDEgNzA0MDAwMAorMzIgMSA3MDYwMDAwCiszMiAxIDcwODAwMDAKKzMyIDEgNzEwMDAwMAorMzIgMSA3MTIwMDAwCiszMiAxIDcxNDAwMDAKKzMyIDEgNzE2MDAwMAorMzIgMSA3MTgwMDAwCiszMiAxIDcyMDAwMDAKKzMyIDEgNzIyMDAwMAorMzIgMSA3MjQwMDAwCiszMiAxIDcyNjAwMDAKKzMyIDEgNzI4MDAwMAorMzIgMSA3MzAwMDAwCiszMiAxIDczMjAwMDAKKzMyIDEgNzM0MDAwMAorMzIgMSA3MzYwMDAwCiszMiAxIDczODAwMDAKKzMyIDEgNzQwMDAwMAorMzIgMSA3NDIwMDAwCiszMiAxIDc0NDAwMDAKKzMyIDEgNzQ2MDAwMAorMzIgMSA3NDgwMDAwCiszMiAxIDc1MDAwMDAKKzMyIDEgNzUyMDAwMAorMzIgMSA3NTQwMDAwCiszMiAxIDc1NjAwMDAKKzMyIDEgNzU4MDAwMAorMzIgMSA3NjAwMDAwCiszMiAxIDc2MjAwMDAKKzMyIDEgNzY0MDAwMAorMzIgMSA3NjYwMDAwCiszMiAxIDc2ODAwMDAKKzMyIDEgNzcwMDAwMAorMzIgMSA3NzIwMDAwCiszMiAxIDc3NDAwMDAKKzMyIDEgNzc2MDAwMAorMzIgMSA3NzgwMDAwCiszMiAxIDc4MDAwMDAKKzMyIDEgNzgyMDAwMAorMzIgMSA3ODQwMDAwCiszMiAxIDc4NjAwMDAKKzMyIDEgNzg4MDAwMAorMzIgMSA3OTAwMDAwCiszMiAxIDc5MjAwMDAKKzMyIDEgNzk0MDAwMAorMzIgMSA3OTYwMDAwCiszMiAxIDc5ODAwMDAKKzMyIDEgODAwMDAwMAorMzIgMSA4MDIwMDAwCiszMiAxIDgwNDAwMDAKKzMyIDEgODA2MDAwMAorMzIgMSA4MDgwMDAwCiszMiAxIDgxMDAwMDAKKzMyIDEgODEyMDAwMAorMzIgMSA4MTQwMDAwCiszMiAxIDgxNjAwMDAKKzMyIDEgODE4MDAwMAorMzIgMSA4MjAwMDAwCiszMiAxIDgyMjAwMDAKKzMyIDEgODI0MDAwMAorMzIgMSA4MjYwMDAwCiszMiAxIDgyODAwMDAKKzMyIDEgODMwMDAwMAorMzIgMSA4MzIwMDAwCiszMiAxIDgzNDAwMDAKKzMyIDEgODM2MDAwMAorMzIgMSA4MzgwMDAwCiszMiAxIDg0MDAwMDAKKzMyIDEgODQyMDAwMAorMzIgMSA4NDQwMDAwCiszMiAxIDg0NjAwMDAKKzMyIDEgODQ4MDAwMAorMzIgMSA4NTAwMDAwCiszMiAxIDg1MjAwMDAKKzMyIDEgODU0MDAwMAorMzIgMSA4NTYwMDAwCiszMiAxIDg1ODAwMDAKKzMyIDEgODYwMDAwMAorMzIgMSA4NjIwMDAwCiszMiAxIDg2NDAwMDAKKzMyIDEgODY2MDAwMAorMzIgMSA4NjgwMDAwCiszMiAxIDg3MDAwMDAKKzMyIDEgODcyMDAwMAorMzIgMSA4NzQwMDAwCiszMiAxIDg3NjAwMDAKKzMyIDEgODc4MDAwMAorMzIgMSA4ODAwMDAwCiszMiAxIDg4MjAwMDAKKzMyIDEgODg0MDAwMAorMzIgMSA4ODYwMDAwCiszMiAxIDg4ODAwMDAKKzMyIDEgODkwMDAwMAorMzIgMSA4OTIwMDAwCiszMiAxIDg5NDAwMDAKKzMyIDEgODk2MDAwMAorMzIgMSA4OTgwMDAwCiszMiAxIDkwMDAwMDAKKzMyIDEgOTAyMDAwMAorMzIgMSA5MDQwMDAwCiszMiAxIDkwNjAwMDAKKzMyIDEgOTA4MDAwMAorMzIgMSA5MTAwMDAwCiszMiAxIDkxMjAwMDAKKzMyIDEgOTE0MDAwMAorMzIgMSA5MTYwMDAwCiszMiAxIDkxODAwMDAKKzMyIDEgOTIwMDAwMAorMzIgMSA5MjIwMDAwCiszMiAxIDkyNDAwMDAKKzMyIDEgOTI2MDAwMAorMzIgMSA5MjgwMDAwCiszMiAxIDkzMDAwMDAKKzMyIDEgOTMyMDAwMAorMzIgMSA5MzQwMDAwCiszMiAxIDkzNjAwMDAKKzMyIDEgOTM4MDAwMAorMzIgMSA5NDAwMDAwCiszMiAxIDk0MjAwMDAKKzMyIDEgOTQ0MDAwMAorMzIgMSA5NDYwMDAwCiszMiAxIDk0ODAwMDAKKzMyIDEgOTUwMDAwMAorMzIgMSA5NTIwMDAwCiszMiAxIDk1NDAwMDAKKzMyIDEgOTU2MDAwMAorMzIgMSA5NTgwMDAwCiszMiAxIDk2MDAwMDAKKzMyIDEgOTYyMDAwMAorMzIgMSA5NjQwMDAwCiszMiAxIDk2NjAwMDAKKzMyIDEgOTY4MDAwMAorMzIgMSA5NzAwMDAwCiszMiAxIDk3MjAwMDAKKzMyIDEgOTc0MDAwMAorMzIgMSA5NzYwMDAwCiszMiAxIDk3ODAwMDAKKzMyIDEgOTgwMDAwMAorMzIgMSA5ODIwMDAwCiszMiAxIDk4NDAwMDAKKzMyIDEgOTg2MDAwMAorMzIgMSA5ODgwMDAwCiszMiAxIDk5MDAwMDAKKzMyIDEgOTkyMDAwMAorMzIgMSA5OTQwMDAwCiszMiAxIDk5NjAwMDAKKzMyIDEgOTk4MDAwMAorMzIgMSAxMDAwMDAwMAorMzIgMSAxMDAyMDAwMAorMzIgMSAxMDA0MDAwMAorMzIgMSAxMDA2MDAwMAorMzIgMSAxMDA4MDAwMAorMzIgMSAxMDEwMDAwMAorMzIgMSAxMDEyMDAwMAorMzIgMSAxMDE0MDAwMAorMzIgMSAxMDE2MDAwMAorMzIgMSAxMDE4MDAwMAorMzIgMSAxMDIwMDAwMAorMzIgMSAxMDIyMDAwMAorMzIgMSAxMDI0MDAwMAorMzIgMSAxMDI2MDAwMAorMzIgMSAxMDI4MDAwMAorMzIgMSAxMDMwMDAwMAorMzIgMSAxMDMyMDAwMAorMzIgMSAxMDM0MDAwMAorMzIgMSAxMDM2MDAwMAorMzIgMSAxMDM4MDAwMAorMzIgMSAxMDQwMDAwMAorMzIgMSAxMDQyMDAwMAorMzIgMSAxMDQ0MDAwMAorMzIgMSAxMDQ2MDAwMAorMzIgMSAxMDQ4MDAwMAorMzIgMSAxMDUwMDAwMAorMzIgMSAxMDUyMDAwMAorMzIgMSAxMDU0MDAwMAorMzIgMSAxMDU2MDAwMAorMzIgMSAxMDU4MDAwMAorMzIgMSAxMDYwMDAwMAorMzIgMSAxMDYyMDAwMAorMzIgMSAxMDY0MDAwMAorMzIgMSAxMDY2MDAwMAorMzIgMSAxMDY4MDAwMAorMzIgMSAxMDcwMDAwMAorMzIgMSAxMDcyMDAwMAorMzIgMSAxMDc0MDAwMAorMzIgMSAxMDc2MDAwMAorMzIgMSAxMDc4MDAwMAorMzIgMSAxMDgwMDAwMAorMzIgMSAxMDgyMDAwMAorMzIgMSAxMDg0MDAwMAorMzIgMSAxMDg2MDAwMAorMzIgMSAxMDg4MDAwMAorMzIgMSAxMDkwMDAwMAorMzIgMSAxMDkyMDAwMAorMzIgMSAxMDk0MDAwMAorMzIgMSAxMDk2MDAwMAorMzIgMSAxMDk4MDAwMAorMzIgMSAxMTAwMDAwMAorMzIgMSAxMTAyMDAwMAorMzIgMSAxMTA0MDAwMAorMzIgMSAxMTA2MDAwMAorMzIgMSAxMTA4MDAwMAorMzIgMSAxMTEwMDAwMAorMzIgMSAxMTEyMDAwMAorMzIgMSAxMTE0MDAwMAorMzIgMSAxMTE2MDAwMAorMzIgMSAxMTE4MDAwMAorMzIgMSAxMTIwMDAwMAorMzIgMSAxMTIyMDAwMAorMzIgMSAxMTI0MDAwMAorMzIgMSAxMTI2MDAwMAorMzIgMSAxMTI4MDAwMAorMzIgMSAxMTMwMDAwMAorMzIgMSAxMTMyMDAwMAorMzIgMSAxMTM0MDAwMAorMzIgMSAxMTM2MDAwMAorMzIgMSAxMTM4MDAwMAorMzIgMSAxMTQwMDAwMAorMzIgMSAxMTQyMDAwMAorMzIgMSAxMTQ0MDAwMAorMzIgMSAxMTQ2MDAwMAorMzIgMSAxMTQ4MDAwMAorMzIgMSAxMTUwMDAwMAorMzIgMSAxMTUyMDAwMAorMzIgMSAxMTU0MDAwMAorMzIgMSAxMTU2MDAwMAorMzIgMSAxMTU4MDAwMAorMzIgMSAxMTYwMDAwMAorMzIgMSAxMTYyMDAwMAorMzIgMSAxMTY0MDAwMAorMzIgMSAxMTY2MDAwMAorMzIgMSAxMTY4MDAwMAorMzIgMSAxMTcwMDAwMAorMzIgMSAxMTcyMDAwMAorMzIgMSAxMTc0MDAwMAorMzIgMSAxMTc2MDAwMAorMzIgMSAxMTc4MDAwMAorMzIgMSAxMTgwMDAwMAorMzIgMSAxMTgyMDAwMAorMzIgMSAxMTg0MDAwMAorMzIgMSAxMTg2MDAwMAorMzIgMSAxMTg4MDAwMAorMzIgMSAxMTkwMDAwMAorMzIgMSAxMTkyMDAwMAorMzIgMSAxMTk0MDAwMAorMzIgMSAxMTk2MDAwMAorMzIgMSAxMTk4MDAwMAorMzIgMSAxMjAwMDAwMAorMzIgMSAxMjAyMDAwMAorMzIgMSAxMjA0MDAwMAorMzIgMSAxMjA2MDAwMAorMzIgMSAxMjA4MDAwMAorMzIgMSAxMjEwMDAwMAorMzIgMSAxMjEyMDAwMAorMzIgMSAxMjE0MDAwMAorMzIgMSAxMjE2MDAwMAorMzIgMSAxMjE4MDAwMAorMzIgMSAxMjIwMDAwMAorMzIgMSAxMjIyMDAwMAorMzIgMSAxMjI0MDAwMAorMzIgMSAxMjI2MDAwMAorMzIgMSAxMjI4MDAwMAorMzIgMSAxMjMwMDAwMAorMzIgMSAxMjMyMDAwMAorMzIgMSAxMjM0MDAwMAorMzIgMSAxMjM2MDAwMAorMzIgMSAxMjM4MDAwMAorMzIgMSAxMjQwMDAwMAorMzIgMSAxMjQyMDAwMAorMzIgMSAxMjQ0MDAwMAorMzIgMSAxMjQ2MDAwMAorMzIgMSAxMjQ4MDAwMAorMzIgMSAxMjUwMDAwMAorMzIgMSAxMjUyMDAwMAorMzIgMSAxMjU0MDAwMAorMzIgMSAxMjU2MDAwMAorMzIgMSAxMjU4MDAwMAorMzIgMSAxMjYwMDAwMAorMzIgMSAxMjYyMDAwMAorMzIgMSAxMjY0MDAwMAorMzIgMSAxMjY2MDAwMAorMzIgMSAxMjY4MDAwMAorMzIgMSAxMjcwMDAwMAorMzIgMSAxMjcyMDAwMAorMzIgMSAxMjc0MDAwMAorMzIgMSAxMjc2MDAwMAorMzIgMSAxMjc4MDAwMAorMzIgMSAxMjgwMDAwMAorMzIgMSAxMjgyMDAwMAorMzIgMSAxMjg0MDAwMAorMzIgMSAxMjg2MDAwMAorMzIgMSAxMjg4MDAwMAorMzIgMSAxMjkwMDAwMAorMzIgMSAxMjkyMDAwMAorMzIgMSAxMjk0MDAwMAorMzIgMSAxMjk2MDAwMAorMzIgMSAxMjk4MDAwMAorMzIgMSAxMzAwMDAwMAorMzIgMSAxMzAyMDAwMAorMzIgMSAxMzA0MDAwMAorMzIgMSAxMzA2MDAwMAorMzIgMSAxMzA4MDAwMAorMzIgMSAxMzEwMDAwMAorMzIgMSAxMzEyMDAwMAorMzIgMSAxMzE0MDAwMAorMzIgMSAxMzE2MDAwMAorMzIgMSAxMzE4MDAwMAorMzIgMSAxMzIwMDAwMAorMzIgMSAxMzIyMDAwMAorMzIgMSAxMzI0MDAwMAorMzIgMSAxMzI2MDAwMAorMzIgMSAxMzI4MDAwMAorMzIgMSAxMzMwMDAwMAorMzIgMSAxMzMyMDAwMAorMzIgMSAxMzM0MDAwMAorMzIgMSAxMzM2MDAwMAorMzIgMSAxMzM4MDAwMAorMzIgMSAxMzQwMDAwMAorMzIgMSAxMzQyMDAwMAorMzIgMSAxMzQ0MDAwMAorMzIgMSAxMzQ2MDAwMAorMzIgMSAxMzQ4MDAwMAorMzIgMSAxMzUwMDAwMAorMzIgMSAxMzUyMDAwMAorMzIgMSAxMzU0MDAwMAorMzIgMSAxMzU2MDAwMAorMzIgMSAxMzU4MDAwMAorMzIgMSAxMzYwMDAwMAorMzIgMSAxMzYyMDAwMAorMzIgMSAxMzY0MDAwMAorMzIgMSAxMzY2MDAwMAorMzIgMSAxMzY4MDAwMAorMzIgMSAxMzcwMDAwMAorMzIgMSAxMzcyMDAwMAorMzIgMSAxMzc0MDAwMAorMzIgMSAxMzc2MDAwMAorMzIgMSAxMzc4MDAwMAorMzIgMSAxMzgwMDAwMAorMzIgMSAxMzgyMDAwMAorMzIgMSAxMzg0MDAwMAorMzIgMSAxMzg2MDAwMAorMzIgMSAxMzg4MDAwMAorMzIgMSAxMzkwMDAwMAorMzIgMSAxMzkyMDAwMAorMzIgMSAxMzk0MDAwMAorMzIgMSAxMzk2MDAwMAorMzIgMSAxMzk4MDAwMAorMzIgMSAxNDAwMDAwMAorMzIgMSAxNDAyMDAwMAorMzIgMSAxNDA0MDAwMAorMzIgMSAxNDA2MDAwMAorMzIgMSAxNDA4MDAwMAorMzIgMSAxNDEwMDAwMAorMzIgMSAxNDEyMDAwMAorMzIgMSAxNDE0MDAwMAorMzIgMSAxNDE2MDAwMAorMzIgMSAxNDE4MDAwMAorMzIgMSAxNDIwMDAwMAorMzIgMSAxNDIyMDAwMAorMzIgMSAxNDI0MDAwMAorMzIgMSAxNDI2MDAwMAorMzIgMSAxNDI4MDAwMAorMzIgMSAxNDMwMDAwMAorMzIgMSAxNDMyMDAwMAorMzIgMSAxNDM0MDAwMAorMzIgMSAxNDM2MDAwMAorMzIgMSAxNDM4MDAwMAorMzIgMSAxNDQwMDAwMAorMzIgMSAxNDQyMDAwMAorMzIgMSAxNDQ0MDAwMAorMzIgMSAxNDQ2MDAwMAorMzIgMSAxNDQ4MDAwMAorMzIgMSAxNDUwMDAwMAorMzIgMSAxNDUyMDAwMAorMzIgMSAxNDU0MDAwMAorMzIgMSAxNDU2MDAwMAorMzIgMSAxNDU4MDAwMAorMzIgMSAxNDYwMDAwMAorMzIgMSAxNDYyMDAwMAorMzIgMSAxNDY0MDAwMAorMzIgMSAxNDY2MDAwMAorMzIgMSAxNDY4MDAwMAorMzIgMSAxNDcwMDAwMAorMzIgMSAxNDcyMDAwMAorMzIgMSAxNDc0MDAwMAorMzIgMSAxNDc2MDAwMAorMzIgMSAxNDc4MDAwMAorMzIgMSAxNDgwMDAwMAorMzIgMSAxNDgyMDAwMAorMzIgMSAxNDg0MDAwMAorMzIgMSAxNDg2MDAwMAorMzIgMSAxNDg4MDAwMAorMzIgMSAxNDkwMDAwMAorMzIgMSAxNDkyMDAwMAorMzIgMSAxNDk0MDAwMAorMzIgMSAxNDk2MDAwMAorMzIgMSAxNDk4MDAwMAorMzIgMSAxNTAwMDAwMAorMzIgMSAxNTAyMDAwMAorMzIgMSAxNTA0MDAwMAorMzIgMSAxNTA2MDAwMAorMzIgMSAxNTA4MDAwMAorMzIgMSAxNTEwMDAwMAorMzIgMSAxNTEyMDAwMAorMzIgMSAxNTE0MDAwMAorMzIgMSAxNTE2MDAwMAorMzIgMSAxNTE4MDAwMAorMzIgMSAxNTIwMDAwMAorMzIgMSAxNTIyMDAwMAorMzIgMSAxNTI0MDAwMAorMzIgMSAxNTI2MDAwMAorMzIgMSAxNTI4MDAwMAorMzIgMSAxNTMwMDAwMAorMzIgMSAxNTMyMDAwMAorMzIgMSAxNTM0MDAwMAorMzIgMSAxNTM2MDAwMAorMzIgMSAxNTM4MDAwMAorMzIgMSAxNTQwMDAwMAorMzIgMSAxNTQyMDAwMAorMzIgMSAxNTQ0MDAwMAorMzIgMSAxNTQ2MDAwMAorMzIgMSAxNTQ4MDAwMAorMzIgMSAxNTUwMDAwMAorMzIgMSAxNTUyMDAwMAorMzIgMSAxNTU0MDAwMAorMzIgMSAxNTU2MDAwMAorMzIgMSAxNTU4MDAwMAorMzIgMSAxNTYwMDAwMAorMzIgMSAxNTYyMDAwMAorMzIgMSAxNTY0MDAwMAorMzIgMSAxNTY2MDAwMAorMzIgMSAxNTY4MDAwMAorMzIgMSAxNTcwMDAwMAorMzIgMSAxNTcyMDAwMAorMzIgMSAxNTc0MDAwMAorMzIgMSAxNTc2MDAwMAorMzIgMSAxNTc4MDAwMAorMzIgMSAxNTgwMDAwMAorMzIgMSAxNTgyMDAwMAorMzIgMSAxNTg0MDAwMAorMzIgMSAxNTg2MDAwMAorMzIgMSAxNTg4MDAwMAorMzIgMSAxNTkwMDAwMAorMzIgMSAxNTkyMDAwMAorMzIgMSAxNTk0MDAwMAorMzIgMSAxNTk2MDAwMAorMzIgMSAxNTk4MDAwMAorMzIgMSAxNjAwMDAwMAorMzIgMSAxNjAyMDAwMAorMzIgMSAxNjA0MDAwMAorMzIgMSAxNjA2MDAwMAorMzIgMSAxNjA4MDAwMAorMzIgMSAxNjEwMDAwMAorMzIgMSAxNjEyMDAwMAorMzIgMSAxNjE0MDAwMAorMzIgMSAxNjE2MDAwMAorMzIgMSAxNjE4MDAwMAorMzIgMSAxNjIwMDAwMAorMzIgMSAxNjIyMDAwMAorMzIgMSAxNjI0MDAwMAorMzIgMSAxNjI2MDAwMAorMzIgMSAxNjI4MDAwMAorMzIgMSAxNjMwMDAwMAorMzIgMSAxNjMyMDAwMAorMzIgMSAxNjM0MDAwMAorMzIgMSAxNjM2MDAwMAorMzIgMSAxNjM4MDAwMAorMzIgMSAxNjQwMDAwMAorMzIgMSAxNjQyMDAwMAorMzIgMSAxNjQ0MDAwMAorMzIgMSAxNjQ2MDAwMAorMzIgMSAxNjQ4MDAwMAorMzIgMSAxNjUwMDAwMAorMzIgMSAxNjUyMDAwMAorMzIgMSAxNjU0MDAwMAorMzIgMSAxNjU2MDAwMAorMzIgMSAxNjU4MDAwMAorMzIgMSAxNjYwMDAwMAorMzIgMSAxNjYyMDAwMAorMzIgMSAxNjY0MDAwMApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy92aWRlby9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy92aWRlby9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlNTdlZTcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3ZpZGVvL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwyOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJWdHNIaWRsQzJWMV8wVGFyZ2V0VmlkZW9EZWNUZXN0IiwKKyAgICBkZWZhdWx0czogWyJWdHNNZWRpYUMyVjFfMERlZmF1bHRzIl0sCisgICAgc3JjczogWyJWdHNIaWRsQzJWMV8wVGFyZ2V0VmlkZW9EZWNUZXN0LmNwcCJdLAorfQorCitjY190ZXN0IHsKKyAgICBuYW1lOiAiVnRzSGlkbEMyVjFfMFRhcmdldFZpZGVvRW5jVGVzdCIsCisgICAgZGVmYXVsdHM6IFsiVnRzTWVkaWFDMlYxXzBEZWZhdWx0cyJdLAorICAgIHNyY3M6IFsiVnRzSGlkbEMyVjFfMFRhcmdldFZpZGVvRW5jVGVzdC5jcHAiXSwKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy92aWRlby9WdHNIaWRsQzJWMV8wVGFyZ2V0VmlkZW9EZWNUZXN0LmNwcCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvdmlkZW8vVnRzSGlkbEMyVjFfMFRhcmdldFZpZGVvRGVjVGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQyMGNhYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvdmlkZW8vVnRzSGlkbEMyVjFfMFRhcmdldFZpZGVvRGVjVGVzdC5jcHAKQEAgLTAsMCArMSw4OTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgImNvZGVjMl9oaWRsX2hhbF92aWRlb19kZWNfdGVzdCIKKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGZzdHJlYW0+CisKKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC9jbGllbnQuaD4KKyNpbmNsdWRlIDxDMkFsbG9jYXRvcklvbi5oPgorI2luY2x1ZGUgPEMyQ29uZmlnLmg+CisjaW5jbHVkZSA8QzJEZWJ1Zy5oPgorI2luY2x1ZGUgPEMyQnVmZmVyLmg+CisjaW5jbHVkZSA8QzJCdWZmZXJQcml2Lmg+CisKK3VzaW5nIGFuZHJvaWQ6OkMyQWxsb2NhdG9ySW9uOworCisjaW5jbHVkZSA8VnRzSGFsSGlkbFRhcmdldFRlc3RCYXNlLmg+CisjaW5jbHVkZSAibWVkaWFfYzJfdmlkZW9faGlkbF90ZXN0X2NvbW1vbi5oIgorI2luY2x1ZGUgIm1lZGlhX2MyX2hpZGxfdGVzdF9jb21tb24uaCIKKworc3RydWN0IEZyYW1lSW5mbyB7CisgICAgaW50IGJ5dGVzQ291bnQ7CisgICAgdWludDMyX3QgZmxhZ3M7CisgICAgaW50NjRfdCB0aW1lc3RhbXA7Cit9OworCitjbGFzcyBMaW5lYXJCdWZmZXIgOiBwdWJsaWMgQzJCdWZmZXIgeworICAgcHVibGljOgorICAgIGV4cGxpY2l0IExpbmVhckJ1ZmZlcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4mIGJsb2NrKQorICAgICAgICA6IEMyQnVmZmVyKAorICAgICAgICAgICAgICB7YmxvY2stPnNoYXJlKGJsb2NrLT5vZmZzZXQoKSwgYmxvY2stPnNpemUoKSwgOjpDMkZlbmNlKCkpfSkge30KK307CisKK3N0YXRpYyBDb21wb25lbnRUZXN0RW52aXJvbm1lbnQqIGdFbnYgPSBudWxscHRyOworCituYW1lc3BhY2UgeworCitjbGFzcyBDb2RlYzJWaWRlb0RlY0hpZGxUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VnRzSGFsSGlkbFRhcmdldFRlc3RCYXNlIHsKKyAgIHByaXZhdGU6CisgICAgdHlwZWRlZiA6OnRlc3Rpbmc6OlZ0c0hhbEhpZGxUYXJnZXRUZXN0QmFzZSBTdXBlcjsKKworICAgcHVibGljOgorICAgIDo6c3RkOjpzdHJpbmcgZ2V0VGVzdENhc2VJbmZvKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gOjpzdGQ6OnN0cmluZygpICsKKyAgICAgICAgICAgICAgICAiQ29tcG9uZW50OiAiICsgZ0Vudi0+Z2V0Q29tcG9uZW50KCkuY19zdHIoKSArICIgfCAiICsKKyAgICAgICAgICAgICAgICAiSW5zdGFuY2U6ICIgKyBnRW52LT5nZXRJbnN0YW5jZSgpLmNfc3RyKCkgKyAiIHwgIiArCisgICAgICAgICAgICAgICAgIlJlczogIiArIGdFbnYtPmdldFJlcygpLmNfc3RyKCk7CisgICAgfQorCisgICAgLy8gZ29vZ2xlLmNvZGVjMiBWaWRlbyB0ZXN0IHNldHVwCisgICAgdmlydHVhbCB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeworICAgICAgICBTdXBlcjo6U2V0VXAoKTsKKyAgICAgICAgbURpc2FibGVUZXN0ID0gZmFsc2U7CisgICAgICAgIEFMT0dWKCJDb2RlYzJWaWRlb0RlY0hpZGxUZXN0IFNldFVwIik7CisgICAgICAgIG1DbGllbnQgPSBhbmRyb2lkOjpDb2RlYzJDbGllbnQ6OkNyZWF0ZUZyb21TZXJ2aWNlKAorICAgICAgICAgICAgZ0Vudi0+Z2V0SW5zdGFuY2UoKS5jX3N0cigpKTsKKyAgICAgICAgQVNTRVJUX05FKG1DbGllbnQsIG51bGxwdHIpOworICAgICAgICBtTGlzdGVuZXIucmVzZXQobmV3IENvZGVjTGlzdGVuZXIoCisgICAgICAgICAgICBbdGhpc10oc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiYgd29ya0l0ZW1zKSB7CisgICAgICAgICAgICAgICAgaGFuZGxlV29ya0RvbmUod29ya0l0ZW1zKTsKKyAgICAgICAgICAgIH0pKTsKKyAgICAgICAgQVNTRVJUX05FKG1MaXN0ZW5lciwgbnVsbHB0cik7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX0lOUFVUX0JVRkZFUlM7ICsraSkgeworICAgICAgICAgICAgbVdvcmtRdWV1ZS5lbXBsYWNlX2JhY2sobmV3IEMyV29yayk7CisgICAgICAgIH0KKyAgICAgICAgbUNsaWVudC0+Y3JlYXRlQ29tcG9uZW50KGdFbnYtPmdldENvbXBvbmVudCgpLmNfc3RyKCksIG1MaXN0ZW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtQ29tcG9uZW50KTsKKyAgICAgICAgQVNTRVJUX05FKG1Db21wb25lbnQsIG51bGxwdHIpOworCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvclN0b3JlPiBzdG9yZSA9CisgICAgICAgICAgICBhbmRyb2lkOjpHZXRDb2RlYzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlKCk7CisgICAgICAgIENIRUNLX0VRKHN0b3JlLT5mZXRjaEFsbG9jYXRvcihDMkFsbG9jYXRvclN0b3JlOjpERUZBVUxUX0xJTkVBUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtTGluZWFyQWxsb2NhdG9yKSwKKyAgICAgICAgICAgICAgICAgQzJfT0spOworICAgICAgICBtTGluZWFyUG9vbCA9IHN0ZDo6bWFrZV9zaGFyZWQ8QzJQb29sZWRCbG9ja1Bvb2w+KG1MaW5lYXJBbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJsb2NrUG9vbElkKyspOworICAgICAgICBBU1NFUlRfTkUobUxpbmVhclBvb2wsIG51bGxwdHIpOworCisgICAgICAgIG1Db21wTmFtZSA9IHVua25vd25fY29tcDsKKyAgICAgICAgc3RydWN0IFN0cmluZ1RvTmFtZSB7CisgICAgICAgICAgICBjb25zdCBjaGFyKiBOYW1lOworICAgICAgICAgICAgc3RhbmRhcmRDb21wIENvbXBOYW1lOworICAgICAgICB9OworCisgICAgICAgIGNvbnN0IFN0cmluZ1RvTmFtZSBrU3RyaW5nVG9OYW1lW10gPSB7CisgICAgICAgICAgICB7ImgyNjMiLCBoMjYzfSwgeyJhdmMiLCBhdmN9LCB7Im1wZWcyIiwgbXBlZzJ9LCB7Im1wZWc0IiwgbXBlZzR9LAorICAgICAgICAgICAgeyJoZXZjIiwgaGV2Y30sIHsidnA4IiwgdnA4fSwgeyJ2cDkiLCB2cDl9LAorICAgICAgICB9OworCisgICAgICAgIGNvbnN0IHNpemVfdCBrTnVtU3RyaW5nVG9OYW1lID0KKyAgICAgICAgICAgIHNpemVvZihrU3RyaW5nVG9OYW1lKSAvIHNpemVvZihrU3RyaW5nVG9OYW1lWzBdKTsKKworICAgICAgICBzdGQ6OnN0cmluZyBzdWJzdHJpbmc7CisgICAgICAgIHN0ZDo6c3RyaW5nIGNvbXA7CisgICAgICAgIHN1YnN0cmluZyA9IHN0ZDo6c3RyaW5nKGdFbnYtPmdldENvbXBvbmVudCgpKTsKKyAgICAgICAgLyogVE9ETzogYmV0dGVyIGFwcHJvYWNoIHRvIGZpbmQgdGhlIGNvbXBvbmVudCAqLworICAgICAgICAvKiAiYzIuYW5kcm9pZC4iID0+IDExdGggcG9zaXRpb24gKi8KKyAgICAgICAgc2l6ZV90IHBvcyA9IDExOworICAgICAgICBzaXplX3QgbGVuID0gc3Vic3RyaW5nLmZpbmQoIi5kZWNvZGVyIiwgcG9zKTsKKyAgICAgICAgY29tcCA9IHN1YnN0cmluZy5zdWJzdHIocG9zLCBsZW4gLSBwb3MpOworCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga051bVN0cmluZ1RvTmFtZTsgKytpKSB7CisgICAgICAgICAgICBpZiAoIXN0cmNhc2VjbXAoY29tcC5jX3N0cigpLCBrU3RyaW5nVG9OYW1lW2ldLk5hbWUpKSB7CisgICAgICAgICAgICAgICAgbUNvbXBOYW1lID0ga1N0cmluZ1RvTmFtZVtpXS5Db21wTmFtZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtRW9zID0gZmFsc2U7CisgICAgICAgIG1GcmFtZXNSZWNlaXZlZCA9IDA7CisgICAgICAgIG1UaW1lc3RhbXBVcyA9IDB1OworICAgICAgICBtVGltZXN0YW1wRGV2VGVzdCA9IGZhbHNlOworICAgICAgICBpZiAobUNvbXBOYW1lID09IHVua25vd25fY29tcCkgbURpc2FibGVUZXN0ID0gdHJ1ZTsKKyAgICAgICAgaWYgKG1EaXNhYmxlVGVzdCkgc3RkOjpjb3V0IDw8ICJbICAgV0FSTiAgIF0gVGVzdCBEaXNhYmxlZCBcbiI7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgeworICAgICAgICBpZiAobUNvbXBvbmVudCAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBpZiAoOjp0ZXN0aW5nOjpUZXN0OjpIYXNGYXRhbEZhaWx1cmUoKSkgcmV0dXJuOworICAgICAgICAgICAgbUNvbXBvbmVudC0+cmVsZWFzZSgpOworICAgICAgICAgICAgbUNvbXBvbmVudCA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgU3VwZXI6OlRlYXJEb3duKCk7CisgICAgfQorCisgICAgLy8gY2FsbGJhY2sgZnVuY3Rpb24gdG8gcHJvY2VzcyBvbldvcmtEb25lIHJlY2VpdmVkIGJ5IExpc3RlbmVyCisgICAgdm9pZCBoYW5kbGVXb3JrRG9uZShzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrSXRlbXMpIHsKKyAgICAgICAgZm9yIChzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yayA6IHdvcmtJdGVtcykgeworICAgICAgICAgICAgLy8gaGFuZGxlIGNvbmZpZ3VyYXRpb24gY2hhbmdlcyBpbiB3b3JrIGRvbmUKKyAgICAgICAgICAgIGlmICghd29yay0+d29ya2xldHMuZW1wdHkoKSAmJgorICAgICAgICAgICAgICAgICh3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLnNpemUoKSAhPSAwKSkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJDb25maWcgVXBkYXRlIik7CisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiB1cGRhdGVzID0KKyAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUpOworICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiBjb25maWdQYXJhbTsKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB1cGRhdGVzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgIEMyUGFyYW0qIHBhcmFtID0gdXBkYXRlc1tpXS5nZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtLT5pbmRleCgpID09CisgICAgICAgICAgICAgICAgICAgICAgICBDMlZpZGVvU2l6ZVN0cmVhbUluZm86Om91dHB1dDo6UEFSQU1fVFlQRSkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlJlY2VpdmVkIEMyVmlkZW9TaXplU3RyZWFtSW5mbyIpOworICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnUGFyYW0ucHVzaF9iYWNrKHBhcmFtKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtQ29tcG9uZW50LT5jb25maWcoY29uZmlnUGFyYW0sIEMyX0RPTlRfQkxPQ0ssICZmYWlsdXJlcyk7CisgICAgICAgICAgICAgICAgQVNTRVJUX0VRKGZhaWx1cmVzLnNpemUoKSwgMHUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtRnJhbWVzUmVjZWl2ZWQrKzsKKyAgICAgICAgICAgIG1Fb3MgPSAod29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzICYKKyAgICAgICAgICAgICAgICAgICAgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgIT0gMDsKKyAgICAgICAgICAgIGF1dG8gZnJhbWVJbmRleEl0ID0KKyAgICAgICAgICAgICAgICBzdGQ6OmZpbmQobUZsdXNoZWRJbmRpY2VzLmJlZ2luKCksIG1GbHVzaGVkSW5kaWNlcy5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCkpOworCisgICAgICAgICAgICAvLyBGb3IgZGVjb2RlciBjb21wb25lbnRzIGN1cnJlbnQgdGltZXN0YW1wIGFsd2F5cyBleGNlZWRzCisgICAgICAgICAgICAvLyBwcmV2aW91cyB0aW1lc3RhbXAKKyAgICAgICAgICAgIHR5cGVkZWYgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBVTG9jazsKKyAgICAgICAgICAgIGJvb2wgY29kZWNDb25maWcgPSAoKHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkZyYW1lRGF0YTo6RkxBR19DT0RFQ19DT05GSUcpICE9IDApOworICAgICAgICAgICAgaWYgKCFjb2RlY0NvbmZpZyAmJgorICAgICAgICAgICAgICAgICF3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgRVhQRUNUX0dFKAorICAgICAgICAgICAgICAgICAgICAod29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1KCkpLAorICAgICAgICAgICAgICAgICAgICBtVGltZXN0YW1wVXMpOworICAgICAgICAgICAgICAgIG1UaW1lc3RhbXBVcyA9CisgICAgICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrdSgpOworCisgICAgICAgICAgICAgICAgVUxvY2sgbChtUXVldWVMb2NrKTsKKyAgICAgICAgICAgICAgICBpZiAobVRpbWVzdGFtcERldlRlc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgYm9vbCB0c0hpdCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBzdGQ6Omxpc3Q8dWludDY0X3Q+OjppdGVyYXRvciBpdCA9IG1UaW1lc3RhbXBVc2xpc3QuYmVnaW4oKTsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGl0ICE9IG1UaW1lc3RhbXBVc2xpc3QuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgqaXQgPT0gbVRpbWVzdGFtcFVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRpbWVzdGFtcFVzbGlzdC5lcmFzZShpdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHNIaXQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaXQrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAodHNIaXQgPT0gZmFsc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtVGltZXN0YW1wVXNsaXN0LmVtcHR5KCkgPT0gZmFsc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWFBFQ1RfRVEodHNIaXQsIHRydWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJUaW1lU3RhbXAgbm90IHJlY29nbml6ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIlsgICBJTkZPICAgXSBSZWNlaXZlZCBub24temVybyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvdXRwdXQgLyBUaW1lU3RhbXAgbm90IHJlY29nbml6ZWQgXG4iOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5jbGVhcigpOworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFVMb2NrIGwobVF1ZXVlTG9jayk7CisgICAgICAgICAgICAgICAgbVdvcmtRdWV1ZS5wdXNoX2JhY2soc3RkOjptb3ZlKHdvcmspKTsKKyAgICAgICAgICAgICAgICBpZiAoIW1GbHVzaGVkSW5kaWNlcy5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIG1GbHVzaGVkSW5kaWNlcy5lcmFzZShmcmFtZUluZGV4SXQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtUXVldWVDb25kaXRpb24ubm90aWZ5X2FsbCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgZW51bSBzdGFuZGFyZENvbXAgeworICAgICAgICBoMjYzLAorICAgICAgICBhdmMsCisgICAgICAgIG1wZWcyLAorICAgICAgICBtcGVnNCwKKyAgICAgICAgaGV2YywKKyAgICAgICAgdnA4LAorICAgICAgICB2cDksCisgICAgICAgIHVua25vd25fY29tcCwKKyAgICB9OworCisgICAgYm9vbCBtRW9zOworICAgIGJvb2wgbURpc2FibGVUZXN0OworICAgIGJvb2wgbVRpbWVzdGFtcERldlRlc3Q7CisgICAgdWludDY0X3QgbVRpbWVzdGFtcFVzOworICAgIHN0ZDo6bGlzdDx1aW50NjRfdD4gbVRpbWVzdGFtcFVzbGlzdDsKKyAgICBzdGQ6Omxpc3Q8dWludDY0X3Q+IG1GbHVzaGVkSW5kaWNlczsKKyAgICBzdGFuZGFyZENvbXAgbUNvbXBOYW1lOworICAgIHVpbnQzMl90IG1GcmFtZXNSZWNlaXZlZDsKKyAgICBDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCBtQmxvY2tQb29sSWQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiBtTGluZWFyUG9vbDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IG1MaW5lYXJBbGxvY2F0b3I7CisKKyAgICBzdGQ6Om11dGV4IG1RdWV1ZUxvY2s7CisgICAgc3RkOjpjb25kaXRpb25fdmFyaWFibGUgbVF1ZXVlQ29uZGl0aW9uOworICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gbVdvcmtRdWV1ZTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ+IG1DbGllbnQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6TGlzdGVuZXI+IG1MaXN0ZW5lcjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+IG1Db21wb25lbnQ7CisKKyAgIHByb3RlY3RlZDoKKyAgICBzdGF0aWMgdm9pZCBkZXNjcmlwdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgZGVzY3JpcHRpb24pIHsKKyAgICAgICAgUmVjb3JkUHJvcGVydHkoImRlc2NyaXB0aW9uIiwgZGVzY3JpcHRpb24pOworICAgIH0KK307CisKK3ZvaWQgdmFsaWRhdGVDb21wb25lbnQoCisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q29tcG9uZW50PiYgY29tcG9uZW50LAorICAgIENvZGVjMlZpZGVvRGVjSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcCBjb21wTmFtZSwgYm9vbCYgZGlzYWJsZVRlc3QpIHsKKyAgICAvLyBWYWxpZGF0ZSBpdHMgYSBDMiBDb21wb25lbnQKKyAgICBpZiAoY29tcG9uZW50LT5nZXROYW1lKCkuZmluZCgiYzIiKSA9PSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICBBTE9HRSgiTm90IGEgYzIgY29tcG9uZW50Iik7CisgICAgICAgIGRpc2FibGVUZXN0ID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIFZhbGlkYXRlIGl0cyBub3QgYW4gZW5jb2RlciBhbmQgdGhlIGNvbXBvbmVudCB0byBiZSB0ZXN0ZWQgaXMgdmlkZW8KKyAgICBpZiAoY29tcG9uZW50LT5nZXROYW1lKCkuZmluZCgiZW5jb2RlciIpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgIEFMT0dFKCJFeHBlY3RlZCBEZWNvZGVyLCBnaXZlbiBFbmNvZGVyIik7CisgICAgICAgIGRpc2FibGVUZXN0ID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IHF1ZXJpZWQ7CisgICAgYzJfc3RhdHVzX3QgYzJlcnIgPQorICAgICAgICBjb21wb25lbnQtPnF1ZXJ5KHt9LCB7QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6aW5wdXQ6OlBBUkFNX1RZUEV9LAorICAgICAgICAgICAgICAgICAgICAgICAgIEMyX0RPTlRfQkxPQ0ssICZxdWVyaWVkKTsKKyAgICBpZiAoYzJlcnIgIT0gQzJfT0sgJiYgcXVlcmllZC5zaXplKCkgPT0gMCkgeworICAgICAgICBBTE9HRSgiUXVlcnkgbWVkaWEgdHlwZSBmYWlsZWQgPT4gJWQiLCBjMmVycik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgaW5wdXREb21haW4gPQorICAgICAgICAgICAgKChDMlN0cmVhbU1lZGlhVHlwZVNldHRpbmc6OmlucHV0KilxdWVyaWVkWzBdLmdldCgpKS0+bS52YWx1ZTsKKyAgICAgICAgaWYgKGlucHV0RG9tYWluLmZpbmQoInZpZGVvLyIpID09IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgICAgICBBTE9HRSgiRXhwZWN0ZWQgVmlkZW8gQ29tcG9uZW50Iik7CisgICAgICAgICAgICBkaXNhYmxlVGVzdCA9IHRydWU7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBWYWxpZGF0ZXMgY29tcG9uZW50IG5hbWUKKyAgICBpZiAoY29tcE5hbWUgPT0gQ29kZWMyVmlkZW9EZWNIaWRsVGVzdDo6dW5rbm93bl9jb21wKSB7CisgICAgICAgIEFMT0dFKCJDb21wb25lbnQgSW5WYWxpZCIpOworICAgICAgICBkaXNhYmxlVGVzdCA9IHRydWU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQUxPR1YoIkNvbXBvbmVudCBWYWxpZCIpOworfQorCisvLyBudW1iZXIgb2YgZWxlbWVudGFyeSBzdHJlYW1zIHBlciBjb21wb25lbnQKKyNkZWZpbmUgU1RSRUFNX0NPVU5UIDIKKy8vIExvb2tVcFRhYmxlIG9mIGNsaXBzIGFuZCBtZXRhZGF0YSBmb3IgY29tcG9uZW50IHRlc3RpbmcKK3ZvaWQgR2V0VVJMRm9yQ29tcG9uZW50KENvZGVjMlZpZGVvRGVjSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcCBjb21wLCBjaGFyKiBtVVJMLAorICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogaW5mbywgc2l6ZV90IHN0cmVhbUluZGV4ID0gMSkgeworICAgIHN0cnVjdCBDb21wVG9VUkwgeworICAgICAgICBDb2RlYzJWaWRlb0RlY0hpZGxUZXN0OjpzdGFuZGFyZENvbXAgY29tcDsKKyAgICAgICAgY29uc3QgY2hhciBtVVJMW1NUUkVBTV9DT1VOVF1bNTEyXTsKKyAgICAgICAgY29uc3QgY2hhciBpbmZvW1NUUkVBTV9DT1VOVF1bNTEyXTsKKyAgICB9OworICAgIEFTU0VSVF9UUlVFKHN0cmVhbUluZGV4IDwgU1RSRUFNX0NPVU5UKTsKKworICAgIHN0YXRpYyBjb25zdCBDb21wVG9VUkwga0NvbXBUb1VSTFtdID0geworICAgICAgICB7Q29kZWMyVmlkZW9EZWNIaWRsVGVzdDo6c3RhbmRhcmRDb21wOjphdmMsCisgICAgICAgICB7ImJiYl9hdmNfMTc2eDE0NF8zMDBrYnBzXzYwZnBzLmgyNjQiLAorICAgICAgICAgICJiYmJfYXZjXzY0MHgzNjBfNzY4a2Jwc18zMGZwcy5oMjY0In0sCisgICAgICAgICB7ImJiYl9hdmNfMTc2eDE0NF8zMDBrYnBzXzYwZnBzLmluZm8iLAorICAgICAgICAgICJiYmJfYXZjXzY0MHgzNjBfNzY4a2Jwc18zMGZwcy5pbmZvIn19LAorICAgICAgICB7Q29kZWMyVmlkZW9EZWNIaWRsVGVzdDo6c3RhbmRhcmRDb21wOjpoZXZjLAorICAgICAgICAgeyJiYmJfaGV2Y18xNzZ4MTQ0XzE3NmticHNfNjBmcHMuaGV2YyIsCisgICAgICAgICAgImJiYl9oZXZjXzY0MHgzNjBfMTYwMGticHNfMzBmcHMuaGV2YyJ9LAorICAgICAgICAgeyJiYmJfaGV2Y18xNzZ4MTQ0XzE3NmticHNfNjBmcHMuaW5mbyIsCisgICAgICAgICAgImJiYl9oZXZjXzY0MHgzNjBfMTYwMGticHNfMzBmcHMuaW5mbyJ9fSwKKyAgICAgICAge0NvZGVjMlZpZGVvRGVjSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcDo6bXBlZzIsCisgICAgICAgICB7ImJiYl9tcGVnMl8xNzZ4MTQ0XzEwNWticHNfMjVmcHMubTJ2IiwKKyAgICAgICAgICAiYmJiX21wZWcyXzM1MngyODhfMW1icHNfNjBmcHMubTJ2In0sCisgICAgICAgICB7ImJiYl9tcGVnMl8xNzZ4MTQ0XzEwNWticHNfMjVmcHMuaW5mbyIsCisgICAgICAgICAgImJiYl9tcGVnMl8zNTJ4Mjg4XzFtYnBzXzYwZnBzLmluZm8ifX0sCisgICAgICAgIHtDb2RlYzJWaWRlb0RlY0hpZGxUZXN0OjpzdGFuZGFyZENvbXA6OmgyNjMsCisgICAgICAgICB7IiIsICJiYmJfaDI2M18zNTJ4Mjg4XzMwMGticHNfMTJmcHMuaDI2MyJ9LAorICAgICAgICAgeyIiLCAiYmJiX2gyNjNfMzUyeDI4OF8zMDBrYnBzXzEyZnBzLmluZm8ifX0sCisgICAgICAgIHtDb2RlYzJWaWRlb0RlY0hpZGxUZXN0OjpzdGFuZGFyZENvbXA6Om1wZWc0LAorICAgICAgICAgeyIiLCAiYmJiX21wZWc0XzM1MngyODhfNTEya2Jwc18zMGZwcy5tNHYifSwKKyAgICAgICAgIHsiIiwgImJiYl9tcGVnNF8zNTJ4Mjg4XzUxMmticHNfMzBmcHMuaW5mbyJ9fSwKKyAgICAgICAge0NvZGVjMlZpZGVvRGVjSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcDo6dnA4LAorICAgICAgICAgeyJiYmJfdnA4XzE3NngxNDRfMjQwa2Jwc182MGZwcy52cDgiLAorICAgICAgICAgICJiYmJfdnA4XzY0MHgzNjBfMm1icHNfMzBmcHMudnA4In0sCisgICAgICAgICB7ImJiYl92cDhfMTc2eDE0NF8yNDBrYnBzXzYwZnBzLmluZm8iLAorICAgICAgICAgICJiYmJfdnA4XzY0MHgzNjBfMm1icHNfMzBmcHMuaW5mbyJ9fSwKKyAgICAgICAge0NvZGVjMlZpZGVvRGVjSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcDo6dnA5LAorICAgICAgICAgeyJiYmJfdnA5XzE3NngxNDRfMjg1a2Jwc182MGZwcy52cDkiLAorICAgICAgICAgICJiYmJfdnA5XzY0MHgzNjBfMTYwMGticHNfMzBmcHMudnA5In0sCisgICAgICAgICB7ImJiYl92cDlfMTc2eDE0NF8yODVrYnBzXzYwZnBzLmluZm8iLAorICAgICAgICAgICJiYmJfdnA5XzY0MHgzNjBfMTYwMGticHNfMzBmcHMuaW5mbyJ9fSwKKyAgICB9OworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplb2Yoa0NvbXBUb1VSTCkgLyBzaXplb2Yoa0NvbXBUb1VSTFswXSk7ICsraSkgeworICAgICAgICBpZiAoa0NvbXBUb1VSTFtpXS5jb21wID09IGNvbXApIHsKKyAgICAgICAgICAgIHN0cmNhdChtVVJMLCBrQ29tcFRvVVJMW2ldLm1VUkxbc3RyZWFtSW5kZXhdKTsKKyAgICAgICAgICAgIHN0cmNhdChpbmZvLCBrQ29tcFRvVVJMW2ldLmluZm9bc3RyZWFtSW5kZXhdKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBkZWNvZGVORnJhbWVzKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gJmNvbXBvbmVudCwKKyAgICAgICAgICAgICAgICAgICBzdGQ6Om11dGV4ICZxdWV1ZUxvY2ssIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlICZxdWV1ZUNvbmRpdGlvbiwKKyAgICAgICAgICAgICAgICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+ICZ3b3JrUXVldWUsCisgICAgICAgICAgICAgICAgICAgc3RkOjpsaXN0PHVpbnQ2NF90PiAmZmx1c2hlZEluZGljZXMsCisgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmbGluZWFyUG9vbCwKKyAgICAgICAgICAgICAgICAgICBzdGQ6Omlmc3RyZWFtJiBlbGVTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6VmVjdG9yPEZyYW1lSW5mbz4qIEluZm8sCisgICAgICAgICAgICAgICAgICAgaW50IG9mZnNldCwgaW50IHJhbmdlLCBib29sIHNpZ25hbEVPUyA9IHRydWUpIHsKKyAgICB0eXBlZGVmIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gVUxvY2s7CisgICAgaW50IGZyYW1lSUQgPSBvZmZzZXQ7CisgICAgaW50IG1heFJldHJ5ID0gMDsKKyAgICB3aGlsZSAoMSkgeworICAgICAgICBpZiAoZnJhbWVJRCA9PSAoaW50KUluZm8tPnNpemUoKSB8fCBmcmFtZUlEID09IChvZmZzZXQgKyByYW5nZSkpIGJyZWFrOworICAgICAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+IHdvcms7CisgICAgICAgIC8vIFByZXBhcmUgQzJXb3JrCisgICAgICAgIHdoaWxlICghd29yayAmJiAobWF4UmV0cnkgPCBNQVhfUkVUUlkpKSB7CisgICAgICAgICAgICBVTG9jayBsKHF1ZXVlTG9jayk7CisgICAgICAgICAgICBpZiAoIXdvcmtRdWV1ZS5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgd29yay5zd2FwKHdvcmtRdWV1ZS5mcm9udCgpKTsKKyAgICAgICAgICAgICAgICB3b3JrUXVldWUucG9wX2Zyb250KCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHF1ZXVlQ29uZGl0aW9uLndhaXRfZm9yKGwsIFRJTUVfT1VUKTsKKyAgICAgICAgICAgICAgICBtYXhSZXRyeSsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghd29yayAmJiAobWF4UmV0cnkgPj0gTUFYX1JFVFJZKSkgeworICAgICAgICAgICAgQVNTRVJUX1RSVUUoZmFsc2UpIDw8ICJXYWl0IGZvciBnZW5lcmF0aW5nIEMyV29yayBleGNlZWRlZCB0aW1lb3V0IjsKKyAgICAgICAgfQorICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcCA9ICgqSW5mbylbZnJhbWVJRF0udGltZXN0YW1wOworICAgICAgICBpZiAoKCpJbmZvKVtmcmFtZUlEXS5mbGFncykgZmxhZ3MgPSAoMSA8PCAoKCpJbmZvKVtmcmFtZUlEXS5mbGFncyAtIDEpKTsKKyAgICAgICAgaWYgKHNpZ25hbEVPUyAmJiAoKGZyYW1lSUQgPT0gKGludClJbmZvLT5zaXplKCkgLSAxKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAoZnJhbWVJRCA9PSAob2Zmc2V0ICsgcmFuZ2UgLSAxKSkpKQorICAgICAgICAgICAgZmxhZ3MgfD0gQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTTsKKworICAgICAgICB3b3JrLT5pbnB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdClmbGFnczsKKyAgICAgICAgd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAgPSB0aW1lc3RhbXA7CisgICAgICAgIHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleCA9IGZyYW1lSUQ7CisgICAgICAgIHsKKyAgICAgICAgICAgIFVMb2NrIGwocXVldWVMb2NrKTsKKyAgICAgICAgICAgIGZsdXNoZWRJbmRpY2VzLmVtcGxhY2VfYmFjayhmcmFtZUlEKTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBzaXplID0gKCpJbmZvKVtmcmFtZUlEXS5ieXRlc0NvdW50OworICAgICAgICBjaGFyKiBkYXRhID0gKGNoYXIqKW1hbGxvYyhzaXplKTsKKworICAgICAgICBlbGVTdHJlYW0ucmVhZChkYXRhLCBzaXplKTsKKyAgICAgICAgQVNTRVJUX0VRKGVsZVN0cmVhbS5nY291bnQoKSwgc2l6ZSk7CisKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IGJsb2NrOworICAgICAgICBBU1NFUlRfRVEoQzJfT0ssCisgICAgICAgICAgICAgICAgICBsaW5lYXJQb29sLT5mZXRjaExpbmVhckJsb2NrKAorICAgICAgICAgICAgICAgICAgICAgIHNpemUsIHtDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFfSwKKyAgICAgICAgICAgICAgICAgICAgICAmYmxvY2spKTsKKyAgICAgICAgQVNTRVJUX1RSVUUoYmxvY2spOworCisgICAgICAgIC8vIFdyaXRlIFZpZXcKKyAgICAgICAgQzJXcml0ZVZpZXcgdmlldyA9IGJsb2NrLT5tYXAoKS5nZXQoKTsKKyAgICAgICAgaWYgKHZpZXcuZXJyb3IoKSAhPSBDMl9PSykgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJDMkxpbmVhckJsb2NrOjptYXAoKSBmYWlsZWQgOiAlZCIsIHZpZXcuZXJyb3IoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBBU1NFUlRfRVEoKHNpemVfdClzaXplLCB2aWV3LmNhcGFjaXR5KCkpOworICAgICAgICBBU1NFUlRfRVEoMHUsIHZpZXcub2Zmc2V0KCkpOworICAgICAgICBBU1NFUlRfRVEoKHNpemVfdClzaXplLCB2aWV3LnNpemUoKSk7CisKKyAgICAgICAgbWVtY3B5KHZpZXcuYmFzZSgpLCBkYXRhLCBzaXplKTsKKworICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuZW1wbGFjZV9iYWNrKG5ldyBMaW5lYXJCdWZmZXIoYmxvY2spKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuY2xlYXIoKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZW1wbGFjZV9iYWNrKG5ldyBDMldvcmtsZXQpOworICAgICAgICBmcmVlKGRhdGEpOworCisgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gaXRlbXM7CisgICAgICAgIGl0ZW1zLnB1c2hfYmFjayhzdGQ6Om1vdmUod29yaykpOworCisgICAgICAgIC8vIERPIFRIRSBERUNPRElORworICAgICAgICBBU1NFUlRfRVEoY29tcG9uZW50LT5xdWV1ZSgmaXRlbXMpLCBDMl9PSyk7CisgICAgICAgIEFMT0dWKCJGcmFtZSAjJWQgc2l6ZSA9ICVkIHF1ZXVlZCIsIGZyYW1lSUQsIHNpemUpOworICAgICAgICBmcmFtZUlEKys7CisgICAgICAgIG1heFJldHJ5ID0gMDsKKyAgICB9Cit9CisKK3ZvaWQgd2FpdE9uSW5wdXRDb25zdW1wdGlvbihzdGQ6Om11dGV4JiBxdWV1ZUxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpjb25kaXRpb25fdmFyaWFibGUmIHF1ZXVlQ29uZGl0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4mIHdvcmtRdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgYnVmZmVyQ291bnQgPSBNQVhfSU5QVVRfQlVGRkVSUykgeworICAgIHR5cGVkZWYgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBVTG9jazsKKyAgICB1aW50MzJfdCBxdWV1ZVNpemU7CisgICAgdWludDMyX3QgbWF4UmV0cnkgPSAwOworICAgIHsKKyAgICAgICAgVUxvY2sgbChxdWV1ZUxvY2spOworICAgICAgICBxdWV1ZVNpemUgPSB3b3JrUXVldWUuc2l6ZSgpOworICAgIH0KKyAgICB3aGlsZSAoKG1heFJldHJ5IDwgTUFYX1JFVFJZKSAmJiAocXVldWVTaXplIDwgYnVmZmVyQ291bnQpKSB7CisgICAgICAgIFVMb2NrIGwocXVldWVMb2NrKTsKKyAgICAgICAgaWYgKHF1ZXVlU2l6ZSAhPSB3b3JrUXVldWUuc2l6ZSgpKSB7CisgICAgICAgICAgICBxdWV1ZVNpemUgPSB3b3JrUXVldWUuc2l6ZSgpOworICAgICAgICAgICAgbWF4UmV0cnkgPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcXVldWVDb25kaXRpb24ud2FpdF9mb3IobCwgVElNRV9PVVQpOworICAgICAgICAgICAgbWF4UmV0cnkrKzsKKyAgICAgICAgfQorICAgIH0KK30KKworVEVTVF9GKENvZGVjMlZpZGVvRGVjSGlkbFRlc3QsIHZhbGlkYXRlQ29tcE5hbWUpIHsKKyAgICBpZiAobURpc2FibGVUZXN0KSByZXR1cm47CisgICAgQUxPR1YoIkNoZWNrcyBpZiB0aGUgZ2l2ZW4gY29tcG9uZW50IGlzIGEgdmFsaWQgdmlkZW8gY29tcG9uZW50Iik7CisgICAgdmFsaWRhdGVDb21wb25lbnQobUNvbXBvbmVudCwgbUNvbXBOYW1lLCBtRGlzYWJsZVRlc3QpOworICAgIEFTU0VSVF9FUShtRGlzYWJsZVRlc3QsIGZhbHNlKTsKK30KKworLy8gQml0c3RyZWFtIFRlc3QKK1RFU1RfRihDb2RlYzJWaWRlb0RlY0hpZGxUZXN0LCBEZWNvZGVUZXN0KSB7CisgICAgZGVzY3JpcHRpb24oIkRlY29kZXMgaW5wdXQgZmlsZSIpOworICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKKworICAgIGNoYXIgbVVSTFs1MTJdLCBpbmZvWzUxMl07CisgICAgc3RkOjppZnN0cmVhbSBlbGVTdHJlYW0sIGVsZUluZm87CisKKyAgICBzdHJjcHkobVVSTCwgZ0Vudi0+Z2V0UmVzKCkuY19zdHIoKSk7CisgICAgc3RyY3B5KGluZm8sIGdFbnYtPmdldFJlcygpLmNfc3RyKCkpOworICAgIEdldFVSTEZvckNvbXBvbmVudChtQ29tcE5hbWUsIG1VUkwsIGluZm8pOworCisgICAgZWxlSW5mby5vcGVuKGluZm8pOworICAgIEFTU0VSVF9FUShlbGVJbmZvLmlzX29wZW4oKSwgdHJ1ZSkgPDwgbVVSTCA8PCAiIC0gZmlsZSBub3QgZm91bmQiOworICAgIGFuZHJvaWQ6OlZlY3RvcjxGcmFtZUluZm8+IEluZm87CisgICAgaW50IGJ5dGVzQ291bnQgPSAwOworICAgIHVpbnQzMl90IGZsYWdzID0gMDsKKyAgICB1aW50MzJfdCB0aW1lc3RhbXAgPSAwOworICAgIHdoaWxlICgxKSB7CisgICAgICAgIGlmICghKGVsZUluZm8gPj4gYnl0ZXNDb3VudCkpIGJyZWFrOworICAgICAgICBlbGVJbmZvID4+IGZsYWdzOworICAgICAgICBlbGVJbmZvID4+IHRpbWVzdGFtcDsKKyAgICAgICAgYm9vbCBjb2RlY0NvbmZpZyA9IGZsYWdzID8KKyAgICAgICAgICAgICgoMSA8PCAoZmxhZ3MgLSAxKSkgJiBDMkZyYW1lRGF0YTo6RkxBR19DT0RFQ19DT05GSUcpICE9IDAgOiAwOworICAgICAgICBpZiAobVRpbWVzdGFtcERldlRlc3QgJiYgIWNvZGVjQ29uZmlnKQorICAgICAgICAgICAgbVRpbWVzdGFtcFVzbGlzdC5wdXNoX2JhY2sodGltZXN0YW1wKTsKKyAgICAgICAgSW5mby5wdXNoX2JhY2soe2J5dGVzQ291bnQsIGZsYWdzLCB0aW1lc3RhbXB9KTsKKyAgICB9CisgICAgZWxlSW5mby5jbG9zZSgpOworCisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0YXJ0KCksIEMyX09LKTsKKyAgICBBTE9HVigibVVSTCA6ICVzIiwgbVVSTCk7CisgICAgZWxlU3RyZWFtLm9wZW4obVVSTCwgc3RkOjppZnN0cmVhbTo6YmluYXJ5KTsKKyAgICBBU1NFUlRfRVEoZWxlU3RyZWFtLmlzX29wZW4oKSwgdHJ1ZSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoZGVjb2RlTkZyYW1lcygKKyAgICAgICAgbUNvbXBvbmVudCwgbVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLCBtRmx1c2hlZEluZGljZXMsCisgICAgICAgIG1MaW5lYXJQb29sLCBlbGVTdHJlYW0sICZJbmZvLCAwLCAoaW50KUluZm8uc2l6ZSgpKSk7CisKKyAgICAvLyBibG9ja2luZyBjYWxsIHRvIGVuc3VyZXMgYXBwbGljYXRpb24gdG8gV2FpdCB0aWxsIGFsbCB0aGUgaW5wdXRzIGFyZQorICAgIC8vIGNvbnN1bWVkCisgICAgaWYgKCFtRW9zKSB7CisgICAgICAgIEFMT0dWKCJXYWl0aW5nIGZvciBpbnB1dCBjb25zdW1wdGlvbiIpOworICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgICAgIHdhaXRPbklucHV0Q29uc3VtcHRpb24obVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlKSk7CisgICAgfQorCisgICAgZWxlU3RyZWFtLmNsb3NlKCk7CisgICAgaWYgKG1GcmFtZXNSZWNlaXZlZCAhPSBJbmZvLnNpemUoKSkgeworICAgICAgICBBTE9HRSgiSW5wdXQgYnVmZmVyIGNvdW50IGFuZCBPdXRwdXQgYnVmZmVyIGNvdW50IG1pc21hdGNoIik7CisgICAgICAgIEFMT0dWKCJmcmFtZXNSZWNlaXZlZCA6ICVkIGlucHV0RnJhbWVzIDogJXp1IiwgbUZyYW1lc1JlY2VpdmVkLAorICAgICAgICAgICAgICBJbmZvLnNpemUoKSk7CisgICAgICAgIEFTU0VSVF9UUlVFKGZhbHNlKTsKKyAgICB9CisKKyAgICBpZiAobVRpbWVzdGFtcERldlRlc3QpIEVYUEVDVF9FUShtVGltZXN0YW1wVXNsaXN0LmVtcHR5KCksIHRydWUpOworfQorCisKKy8vIEFkYXB0aXZlIFRlc3QKK1RFU1RfRihDb2RlYzJWaWRlb0RlY0hpZGxUZXN0LCBBZGFwdGl2ZURlY29kZVRlc3QpIHsKKyAgICBkZXNjcmlwdGlvbigiQWRhcHRpdmUgRGVjb2RlIFRlc3QiKTsKKyAgICBpZiAobURpc2FibGVUZXN0KSByZXR1cm47CisgICAgaWYgKCEobUNvbXBOYW1lID09IGF2YyB8fCBtQ29tcE5hbWUgPT0gaGV2YyB8fCBtQ29tcE5hbWUgPT0gdnA4IHx8CisgICAgICAgICAgbUNvbXBOYW1lID09IHZwOSB8fCBtQ29tcE5hbWUgPT0gbXBlZzIpKQorICAgICAgICByZXR1cm47CisKKyAgICB0eXBlZGVmIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gVUxvY2s7CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0YXJ0KCksIEMyX09LKTsKKworICAgIG1UaW1lc3RhbXBEZXZUZXN0ID0gdHJ1ZTsKKyAgICB1aW50MzJfdCB0aW1lc3RhbXBPZmZzZXQgPSAwOworICAgIHVpbnQzMl90IG9mZnNldCA9IDA7CisgICAgYW5kcm9pZDo6VmVjdG9yPEZyYW1lSW5mbz4gSW5mbzsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgU1RSRUFNX0NPVU5UICogMjsgaSsrKSB7CisgICAgICAgIGNoYXIgbVVSTFs1MTJdLCBpbmZvWzUxMl07CisgICAgICAgIHN0ZDo6aWZzdHJlYW0gZWxlU3RyZWFtLCBlbGVJbmZvOworCisgICAgICAgIHN0cmNweShtVVJMLCBnRW52LT5nZXRSZXMoKS5jX3N0cigpKTsKKyAgICAgICAgc3RyY3B5KGluZm8sIGdFbnYtPmdldFJlcygpLmNfc3RyKCkpOworICAgICAgICBHZXRVUkxGb3JDb21wb25lbnQobUNvbXBOYW1lLCBtVVJMLCBpbmZvLCBpICUgU1RSRUFNX0NPVU5UKTsKKworICAgICAgICBlbGVJbmZvLm9wZW4oaW5mbyk7CisgICAgICAgIEFTU0VSVF9FUShlbGVJbmZvLmlzX29wZW4oKSwgdHJ1ZSkgPDwgbVVSTCA8PCAiIC0gZmlsZSBub3QgZm91bmQiOworICAgICAgICBpbnQgYnl0ZXNDb3VudCA9IDA7CisgICAgICAgIHVpbnQzMl90IGZsYWdzID0gMDsKKyAgICAgICAgdWludDMyX3QgdGltZXN0YW1wID0gMDsKKyAgICAgICAgdWludDMyX3QgdGltZXN0YW1wTWF4ID0gMDsKKyAgICAgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgICAgIGlmICghKGVsZUluZm8gPj4gYnl0ZXNDb3VudCkpIGJyZWFrOworICAgICAgICAgICAgZWxlSW5mbyA+PiBmbGFnczsKKyAgICAgICAgICAgIGVsZUluZm8gPj4gdGltZXN0YW1wOworICAgICAgICAgICAgdGltZXN0YW1wICs9IHRpbWVzdGFtcE9mZnNldDsKKyAgICAgICAgICAgIEluZm8ucHVzaF9iYWNrKHtieXRlc0NvdW50LCBmbGFncywgdGltZXN0YW1wfSk7CisgICAgICAgICAgICBib29sIGNvZGVjQ29uZmlnID0gZmxhZ3MgPworICAgICAgICAgICAgICAgICgoMSA8PCAoZmxhZ3MgLSAxKSkgJiBDMkZyYW1lRGF0YTo6RkxBR19DT0RFQ19DT05GSUcpICE9IDAgOiAwOworCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVUxvY2sgbChtUXVldWVMb2NrKTsKKyAgICAgICAgICAgICAgICBpZiAobVRpbWVzdGFtcERldlRlc3QgJiYgIWNvZGVjQ29uZmlnKQorICAgICAgICAgICAgICAgICAgICBtVGltZXN0YW1wVXNsaXN0LnB1c2hfYmFjayh0aW1lc3RhbXApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHRpbWVzdGFtcE1heCA8IHRpbWVzdGFtcCkgdGltZXN0YW1wTWF4ID0gdGltZXN0YW1wOworICAgICAgICB9CisgICAgICAgIHRpbWVzdGFtcE9mZnNldCA9IHRpbWVzdGFtcE1heDsKKyAgICAgICAgZWxlSW5mby5jbG9zZSgpOworCisgICAgICAgIC8vIFJlc2V0IFRvdGFsIGZyYW1lcyBiZWZvcmUgc2Vjb25kIGRlY29kZSBsb29wCisgICAgICAgIC8vIG1GcmFtZXNSZWNlaXZlZCA9IDA7CisgICAgICAgIEFMT0dWKCJtVVJMIDogJXMiLCBtVVJMKTsKKyAgICAgICAgZWxlU3RyZWFtLm9wZW4obVVSTCwgc3RkOjppZnN0cmVhbTo6YmluYXJ5KTsKKyAgICAgICAgQVNTRVJUX0VRKGVsZVN0cmVhbS5pc19vcGVuKCksIHRydWUpOworICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgICAgIGRlY29kZU5GcmFtZXMobUNvbXBvbmVudCwgbVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtRmx1c2hlZEluZGljZXMsIG1MaW5lYXJQb29sLCBlbGVTdHJlYW0sICZJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsIChpbnQpKEluZm8uc2l6ZSgpIC0gb2Zmc2V0KSwgZmFsc2UpKTsKKworICAgICAgICBlbGVTdHJlYW0uY2xvc2UoKTsKKyAgICAgICAgb2Zmc2V0ID0gKGludClJbmZvLnNpemUoKTsKKyAgICB9CisKKyAgICAvLyBTZW5kIEVPUworICAgIC8vIFRPRE8gQWRkIGZ1bmN0aW9uIHRvIHNlbmQgRU9TIHdvcmsgaXRlbQorICAgIGludCBtYXhSZXRyeSA9IDA7CisgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gd29yazsKKyAgICB3aGlsZSAoIXdvcmsgJiYgKG1heFJldHJ5IDwgTUFYX1JFVFJZKSkgeworICAgICAgICBVTG9jayBsKG1RdWV1ZUxvY2spOworICAgICAgICBpZiAoIW1Xb3JrUXVldWUuZW1wdHkoKSkgeworICAgICAgICAgICAgd29yay5zd2FwKG1Xb3JrUXVldWUuZnJvbnQoKSk7CisgICAgICAgICAgICBtV29ya1F1ZXVlLnBvcF9mcm9udCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVF1ZXVlQ29uZGl0aW9uLndhaXRfZm9yKGwsIFRJTUVfT1VUKTsKKyAgICAgICAgICAgIG1heFJldHJ5Kys7CisgICAgICAgIH0KKyAgICB9CisgICAgQVNTRVJUX05FKHdvcmssIG51bGxwdHIpOworICAgIHdvcmstPmlucHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KUMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU07CisgICAgd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAgPSAwOworICAgIHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleCA9IDA7CisgICAgd29yay0+aW5wdXQuYnVmZmVycy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZW1wbGFjZV9iYWNrKG5ldyBDMldvcmtsZXQpOworCisgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBpdGVtczsKKyAgICBpdGVtcy5wdXNoX2JhY2soc3RkOjptb3ZlKHdvcmspKTsKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+cXVldWUoJml0ZW1zKSwgQzJfT0spOworCisgICAgLy8gYmxvY2tpbmcgY2FsbCB0byBlbnN1cmVzIGFwcGxpY2F0aW9uIHRvIFdhaXQgdGlsbCBhbGwgdGhlIGlucHV0cyBhcmUKKyAgICAvLyBjb25zdW1lZAorICAgIEFMT0dWKCJXYWl0aW5nIGZvciBpbnB1dCBjb25zdW1wdGlvbiIpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICB3YWl0T25JbnB1dENvbnN1bXB0aW9uKG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSkpOworCisgICAgaWYgKG1GcmFtZXNSZWNlaXZlZCAhPSAoKEluZm8uc2l6ZSgpKSArIDEpKSB7CisgICAgICAgIEFMT0dFKCJJbnB1dCBidWZmZXIgY291bnQgYW5kIE91dHB1dCBidWZmZXIgY291bnQgbWlzbWF0Y2giKTsKKyAgICAgICAgQUxPR1YoImZyYW1lc1JlY2VpdmVkIDogJWQgaW5wdXRGcmFtZXMgOiAlenUiLCBtRnJhbWVzUmVjZWl2ZWQsCisgICAgICAgICAgICAgIEluZm8uc2l6ZSgpICsgMSk7CisgICAgICAgIEFTU0VSVF9UUlVFKGZhbHNlKTsKKyAgICB9CisKKyAgICBpZiAobVRpbWVzdGFtcERldlRlc3QpIEVYUEVDVF9FUShtVGltZXN0YW1wVXNsaXN0LmVtcHR5KCksIHRydWUpOworfQorCisvLyB0aHVtYm5haWwgdGVzdAorVEVTVF9GKENvZGVjMlZpZGVvRGVjSGlkbFRlc3QsIFRodW1ibmFpbFRlc3QpIHsKKyAgICBkZXNjcmlwdGlvbigiVGVzdCBSZXF1ZXN0IGZvciB0aHVtYm5haWwiKTsKKyAgICBpZiAobURpc2FibGVUZXN0KSByZXR1cm47CisKKyAgICBjaGFyIG1VUkxbNTEyXSwgaW5mb1s1MTJdOworICAgIHN0ZDo6aWZzdHJlYW0gZWxlU3RyZWFtLCBlbGVJbmZvOworCisgICAgc3RyY3B5KG1VUkwsIGdFbnYtPmdldFJlcygpLmNfc3RyKCkpOworICAgIHN0cmNweShpbmZvLCBnRW52LT5nZXRSZXMoKS5jX3N0cigpKTsKKyAgICBHZXRVUkxGb3JDb21wb25lbnQobUNvbXBOYW1lLCBtVVJMLCBpbmZvKTsKKworICAgIGVsZUluZm8ub3BlbihpbmZvKTsKKyAgICBBU1NFUlRfRVEoZWxlSW5mby5pc19vcGVuKCksIHRydWUpOworICAgIGFuZHJvaWQ6OlZlY3RvcjxGcmFtZUluZm8+IEluZm87CisgICAgaW50IGJ5dGVzQ291bnQgPSAwOworICAgIHVpbnQzMl90IGZsYWdzID0gMDsKKyAgICB1aW50MzJfdCB0aW1lc3RhbXAgPSAwOworICAgIHdoaWxlICgxKSB7CisgICAgICAgIGlmICghKGVsZUluZm8gPj4gYnl0ZXNDb3VudCkpIGJyZWFrOworICAgICAgICBlbGVJbmZvID4+IGZsYWdzOworICAgICAgICBlbGVJbmZvID4+IHRpbWVzdGFtcDsKKyAgICAgICAgSW5mby5wdXNoX2JhY2soe2J5dGVzQ291bnQsIGZsYWdzLCB0aW1lc3RhbXB9KTsKKyAgICB9CisgICAgZWxlSW5mby5jbG9zZSgpOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBNQVhfSVRFUkFUSU9OUzsgaSsrKSB7CisgICAgICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdGFydCgpLCBDMl9PSyk7CisKKyAgICAgICAgLy8gcmVxdWVzdCBFT1MgZm9yIHRodW1ibmFpbAorICAgICAgICAvLyBzaWduYWwgRU9TIGZsYWcgd2l0aCBsYXN0IGZyYW1lCisgICAgICAgIHNpemVfdCBqID0gLTE7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGorKzsKKyAgICAgICAgICAgIGZsYWdzID0gMDsKKyAgICAgICAgICAgIGlmIChJbmZvW2pdLmZsYWdzKSBmbGFncyA9IDF1IDw8IChJbmZvW2pdLmZsYWdzIC0gMSk7CisKKyAgICAgICAgfSB3aGlsZSAoIShmbGFncyAmIFNZTkNfRlJBTUUpKTsKKyAgICAgICAgZWxlU3RyZWFtLm9wZW4obVVSTCwgc3RkOjppZnN0cmVhbTo6YmluYXJ5KTsKKyAgICAgICAgQVNTRVJUX0VRKGVsZVN0cmVhbS5pc19vcGVuKCksIHRydWUpOworICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShkZWNvZGVORnJhbWVzKAorICAgICAgICAgICAgbUNvbXBvbmVudCwgbVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLAorICAgICAgICAgICAgbUZsdXNoZWRJbmRpY2VzLCBtTGluZWFyUG9vbCwgZWxlU3RyZWFtLCAmSW5mbywgMCwgaiArIDEpKTsKKyAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgICAgICB3YWl0T25JbnB1dENvbnN1bXB0aW9uKG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSkpOworICAgICAgICBlbGVTdHJlYW0uY2xvc2UoKTsKKyAgICAgICAgRVhQRUNUX0dFKG1GcmFtZXNSZWNlaXZlZCwgMVUpOworICAgICAgICBBU1NFUlRfRVEobUVvcywgdHJ1ZSk7CisgICAgICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdG9wKCksIEMyX09LKTsKKyAgICAgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnJlbGVhc2UoKSwgQzJfT0spOworICAgIH0KK30KKworVEVTVF9GKENvZGVjMlZpZGVvRGVjSGlkbFRlc3QsIEVPU1Rlc3QpIHsKKyAgICBkZXNjcmlwdGlvbigiVGVzdCBlbXB0eSBpbnB1dCBidWZmZXIgd2l0aCBFT1MgZmxhZyIpOworICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKKyAgICB0eXBlZGVmIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gVUxvY2s7CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0YXJ0KCksIEMyX09LKTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB3b3JrOworICAgIC8vIFByZXBhcmUgQzJXb3JrCisgICAgeworICAgICAgICBVTG9jayBsKG1RdWV1ZUxvY2spOworICAgICAgICBpZiAoIW1Xb3JrUXVldWUuZW1wdHkoKSkgeworICAgICAgICAgICAgd29yay5zd2FwKG1Xb3JrUXVldWUuZnJvbnQoKSk7CisgICAgICAgICAgICBtV29ya1F1ZXVlLnBvcF9mcm9udCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQVNTRVJUX1RSVUUoZmFsc2UpIDw8ICJtV29ya1F1ZXVlIEVtcHR5IGF0IHRoZSBzdGFydCBvZiB0ZXN0IjsKKyAgICAgICAgfQorICAgIH0KKyAgICBBU1NFUlRfTkUod29yaywgbnVsbHB0cik7CisKKyAgICB3b3JrLT5pbnB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdClDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNOworICAgIHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wID0gMDsKKyAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXggPSAwOworICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmVtcGxhY2VfYmFjayhuZXcgQzJXb3JrbGV0KTsKKworICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gaXRlbXM7CisgICAgaXRlbXMucHVzaF9iYWNrKHN0ZDo6bW92ZSh3b3JrKSk7CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnF1ZXVlKCZpdGVtcyksIEMyX09LKTsKKworICAgIHsKKyAgICAgICAgdHlwZWRlZiBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IFVMb2NrOworICAgICAgICBVTG9jayBsKG1RdWV1ZUxvY2spOworICAgICAgICBpZiAobVdvcmtRdWV1ZS5zaXplKCkgIT0gTUFYX0lOUFVUX0JVRkZFUlMpIHsKKyAgICAgICAgICAgIG1RdWV1ZUNvbmRpdGlvbi53YWl0X2ZvcihsLCBUSU1FX09VVCk7CisgICAgICAgIH0KKyAgICB9CisgICAgQVNTRVJUX0VRKG1Fb3MsIHRydWUpOworICAgIEFTU0VSVF9FUShtV29ya1F1ZXVlLnNpemUoKSwgKHNpemVfdClNQVhfSU5QVVRfQlVGRkVSUyk7CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0b3AoKSwgQzJfT0spOworfQorCitURVNUX0YoQ29kZWMyVmlkZW9EZWNIaWRsVGVzdCwgRW1wdHlCdWZmZXJUZXN0KSB7CisgICAgZGVzY3JpcHRpb24oIlRlc3RzIGVtcHR5IGlucHV0IGJ1ZmZlciIpOworICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKKyAgICB0eXBlZGVmIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gVUxvY2s7CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0YXJ0KCksIEMyX09LKTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB3b3JrOworICAgIC8vIFByZXBhcmUgQzJXb3JrCisgICAgeworICAgICAgICBVTG9jayBsKG1RdWV1ZUxvY2spOworICAgICAgICBpZiAoIW1Xb3JrUXVldWUuZW1wdHkoKSkgeworICAgICAgICAgICAgd29yay5zd2FwKG1Xb3JrUXVldWUuZnJvbnQoKSk7CisgICAgICAgICAgICBtV29ya1F1ZXVlLnBvcF9mcm9udCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQVNTRVJUX1RSVUUoZmFsc2UpIDw8ICJtV29ya1F1ZXVlIEVtcHR5IGF0IHRoZSBzdGFydCBvZiB0ZXN0IjsKKyAgICAgICAgfQorICAgIH0KKyAgICBBU1NFUlRfTkUod29yaywgbnVsbHB0cik7CisKKyAgICB3b3JrLT5pbnB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdCkwOworICAgIHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wID0gMDsKKyAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXggPSAwOworICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmVtcGxhY2VfYmFjayhuZXcgQzJXb3JrbGV0KTsKKworICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gaXRlbXM7CisgICAgaXRlbXMucHVzaF9iYWNrKHN0ZDo6bW92ZSh3b3JrKSk7CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnF1ZXVlKCZpdGVtcyksIEMyX09LKTsKKworICAgIHsKKyAgICAgICAgdHlwZWRlZiBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IFVMb2NrOworICAgICAgICBVTG9jayBsKG1RdWV1ZUxvY2spOworICAgICAgICBpZiAobVdvcmtRdWV1ZS5zaXplKCkgIT0gTUFYX0lOUFVUX0JVRkZFUlMpIHsKKyAgICAgICAgICAgIG1RdWV1ZUNvbmRpdGlvbi53YWl0X2ZvcihsLCBUSU1FX09VVCk7CisgICAgICAgIH0KKyAgICB9CisgICAgQVNTRVJUX0VRKG1Xb3JrUXVldWUuc2l6ZSgpLCAoc2l6ZV90KU1BWF9JTlBVVF9CVUZGRVJTKTsKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RvcCgpLCBDMl9PSyk7Cit9CisKK1RFU1RfRihDb2RlYzJWaWRlb0RlY0hpZGxUZXN0LCBGbHVzaFRlc3QpIHsKKyAgICBkZXNjcmlwdGlvbigiVGVzdHMgRmx1c2ggY2FsbHMiKTsKKyAgICBpZiAobURpc2FibGVUZXN0KSByZXR1cm47CisgICAgdHlwZWRlZiBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IFVMb2NrOworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdGFydCgpLCBDMl9PSyk7CisgICAgY2hhciBtVVJMWzUxMl0sIGluZm9bNTEyXTsKKyAgICBzdGQ6Omlmc3RyZWFtIGVsZVN0cmVhbSwgZWxlSW5mbzsKKworICAgIHN0cmNweShtVVJMLCBnRW52LT5nZXRSZXMoKS5jX3N0cigpKTsKKyAgICBzdHJjcHkoaW5mbywgZ0Vudi0+Z2V0UmVzKCkuY19zdHIoKSk7CisgICAgR2V0VVJMRm9yQ29tcG9uZW50KG1Db21wTmFtZSwgbVVSTCwgaW5mbyk7CisKKyAgICBlbGVJbmZvLm9wZW4oaW5mbyk7CisgICAgQVNTRVJUX0VRKGVsZUluZm8uaXNfb3BlbigpLCB0cnVlKTsKKyAgICBhbmRyb2lkOjpWZWN0b3I8RnJhbWVJbmZvPiBJbmZvOworICAgIGludCBieXRlc0NvdW50ID0gMDsKKyAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgdWludDMyX3QgdGltZXN0YW1wID0gMDsKKyAgICBtRmx1c2hlZEluZGljZXMuY2xlYXIoKTsKKyAgICB3aGlsZSAoMSkgeworICAgICAgICBpZiAoIShlbGVJbmZvID4+IGJ5dGVzQ291bnQpKSBicmVhazsKKyAgICAgICAgZWxlSW5mbyA+PiBmbGFnczsKKyAgICAgICAgZWxlSW5mbyA+PiB0aW1lc3RhbXA7CisgICAgICAgIEluZm8ucHVzaF9iYWNrKHtieXRlc0NvdW50LCBmbGFncywgdGltZXN0YW1wfSk7CisgICAgfQorICAgIGVsZUluZm8uY2xvc2UoKTsKKworICAgIEFMT0dWKCJtVVJMIDogJXMiLCBtVVJMKTsKKyAgICBlbGVTdHJlYW0ub3BlbihtVVJMLCBzdGQ6Omlmc3RyZWFtOjpiaW5hcnkpOworICAgIEFTU0VSVF9FUShlbGVTdHJlYW0uaXNfb3BlbigpLCB0cnVlKTsKKyAgICAvLyBEZWNvZGUgMTI4IGZyYW1lcyBhbmQgZmx1c2guIGhlcmUgMTI4IGlzIGNob3NlbiB0byBlbnN1cmUgdGhlcmUgaXMgYSBrZXkKKyAgICAvLyBmcmFtZSBhZnRlciB0aGlzIHNvIHRoYXQgdGhlIGJlbG93IHNlY3Rpb24gY2FuIGJlIGNvdmVyZWQgZm9yIGFsbAorICAgIC8vIGNvbXBvbmVudHMKKyAgICB1aW50MzJfdCBudW1GcmFtZXNGbHVzaGVkID0gMTI4OworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKGRlY29kZU5GcmFtZXMoCisgICAgICAgIG1Db21wb25lbnQsIG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwgbUZsdXNoZWRJbmRpY2VzLAorICAgICAgICBtTGluZWFyUG9vbCwgZWxlU3RyZWFtLCAmSW5mbywgMCwgbnVtRnJhbWVzRmx1c2hlZCwgZmFsc2UpKTsKKyAgICAvLyBmbHVzaAorICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gZmx1c2hlZFdvcms7CisgICAgYzJfc3RhdHVzX3QgZXJyID0KKyAgICAgICAgbUNvbXBvbmVudC0+Zmx1c2goQzJDb21wb25lbnQ6OkZMVVNIX0NPTVBPTkVOVCwgJmZsdXNoZWRXb3JrKTsKKyAgICBBU1NFUlRfRVEoZXJyLCBDMl9PSyk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgIHdhaXRPbklucHV0Q29uc3VtcHRpb24obVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzaXplX3QpTUFYX0lOUFVUX0JVRkZFUlMgLSBmbHVzaGVkV29yay5zaXplKCkpKTsKKworICAgIHsKKyAgICAgICAgLy8gVXBkYXRlIG1GbHVzaGVkSW5kaWNlcyBiYXNlZCBvbiB0aGUgaW5kZXggcmVjZWl2ZWQgZnJvbSBmbHVzaCgpCisgICAgICAgIFVMb2NrIGwobVF1ZXVlTG9jayk7CisgICAgICAgIGZvciAoc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmsgOiBmbHVzaGVkV29yaykgeworICAgICAgICAgICAgQVNTRVJUX05FKHdvcmssIG51bGxwdHIpOworICAgICAgICAgICAgYXV0byBmcmFtZUluZGV4SXQgPQorICAgICAgICAgICAgICAgIHN0ZDo6ZmluZChtRmx1c2hlZEluZGljZXMuYmVnaW4oKSwgbUZsdXNoZWRJbmRpY2VzLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKSk7CisgICAgICAgICAgICBpZiAoIW1GbHVzaGVkSW5kaWNlcy5lbXB0eSgpICYmCisgICAgICAgICAgICAgICAgKGZyYW1lSW5kZXhJdCAhPSBtRmx1c2hlZEluZGljZXMuZW5kKCkpKSB7CisgICAgICAgICAgICAgICAgbUZsdXNoZWRJbmRpY2VzLmVyYXNlKGZyYW1lSW5kZXhJdCk7CisgICAgICAgICAgICAgICAgd29yay0+aW5wdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgbVdvcmtRdWV1ZS5wdXNoX2JhY2soc3RkOjptb3ZlKHdvcmspKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAvLyBTZWVrIHRvIG5leHQga2V5IGZyYW1lIGFuZCBzdGFydCBkZWNvZGluZyB0aWxsIHRoZSBlbmQKKyAgICBtRmx1c2hlZEluZGljZXMuY2xlYXIoKTsKKyAgICBpbnQgaW5kZXggPSBudW1GcmFtZXNGbHVzaGVkOworICAgIGJvb2wga2V5RnJhbWUgPSBmYWxzZTsKKyAgICBmbGFncyA9IDA7CisgICAgd2hpbGUgKGluZGV4IDwgKGludClJbmZvLnNpemUoKSkgeworICAgICAgICBpZiAoSW5mb1tpbmRleF0uZmxhZ3MpIGZsYWdzID0gMXUgPDwgKEluZm9baW5kZXhdLmZsYWdzIC0gMSk7CisgICAgICAgIGlmICgoZmxhZ3MgJiBTWU5DX0ZSQU1FKSA9PSBTWU5DX0ZSQU1FKSB7CisgICAgICAgICAgICBrZXlGcmFtZSA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBmbGFncyA9IDA7CisgICAgICAgIGVsZVN0cmVhbS5pZ25vcmUoSW5mb1tpbmRleF0uYnl0ZXNDb3VudCk7CisgICAgICAgIGluZGV4Kys7CisgICAgfQorICAgIGlmIChrZXlGcmFtZSkgeworICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgICAgIGRlY29kZU5GcmFtZXMobUNvbXBvbmVudCwgbVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtRmx1c2hlZEluZGljZXMsIG1MaW5lYXJQb29sLCBlbGVTdHJlYW0sICZJbmZvLCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGludClJbmZvLnNpemUoKSAtIGluZGV4KSk7CisgICAgfQorICAgIGVsZVN0cmVhbS5jbG9zZSgpOworICAgIGVyciA9IG1Db21wb25lbnQtPmZsdXNoKEMyQ29tcG9uZW50OjpGTFVTSF9DT01QT05FTlQsICZmbHVzaGVkV29yayk7CisgICAgQVNTRVJUX0VRKGVyciwgQzJfT0spOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICB3YWl0T25JbnB1dENvbnN1bXB0aW9uKG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2l6ZV90KU1BWF9JTlBVVF9CVUZGRVJTIC0gZmx1c2hlZFdvcmsuc2l6ZSgpKSk7CisgICAgeworICAgICAgICAvLyBVcGRhdGUgbUZsdXNoZWRJbmRpY2VzIGJhc2VkIG9uIHRoZSBpbmRleCByZWNlaXZlZCBmcm9tIGZsdXNoKCkKKyAgICAgICAgVUxvY2sgbChtUXVldWVMb2NrKTsKKyAgICAgICAgZm9yIChzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yayA6IGZsdXNoZWRXb3JrKSB7CisgICAgICAgICAgICBBU1NFUlRfTkUod29yaywgbnVsbHB0cik7CisgICAgICAgICAgICB1aW50NjRfdCBmcmFtZUluZGV4ID0gd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCk7CisgICAgICAgICAgICBzdGQ6Omxpc3Q8dWludDY0X3Q+OjppdGVyYXRvciBmcmFtZUluZGV4SXQgPSBzdGQ6OmZpbmQoCisgICAgICAgICAgICAgICAgbUZsdXNoZWRJbmRpY2VzLmJlZ2luKCksIG1GbHVzaGVkSW5kaWNlcy5lbmQoKSwgZnJhbWVJbmRleCk7CisgICAgICAgICAgICBpZiAoIW1GbHVzaGVkSW5kaWNlcy5lbXB0eSgpICYmCisgICAgICAgICAgICAgICAgKGZyYW1lSW5kZXhJdCAhPSBtRmx1c2hlZEluZGljZXMuZW5kKCkpKSB7CisgICAgICAgICAgICAgICAgbUZsdXNoZWRJbmRpY2VzLmVyYXNlKGZyYW1lSW5kZXhJdCk7CisgICAgICAgICAgICAgICAgd29yay0+aW5wdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgbVdvcmtRdWV1ZS5wdXNoX2JhY2soc3RkOjptb3ZlKHdvcmspKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBBU1NFUlRfRVEobUZsdXNoZWRJbmRpY2VzLmVtcHR5KCksIHRydWUpOworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdG9wKCksIEMyX09LKTsKK30KKworfSAgLy8gYW5vbnltb3VzIG5hbWVzcGFjZQorCisvLyBUT0RPIDogVmlkZW8gc3BlY2lmaWMgY29uZmlndXJhdGlvbiBUZXN0CitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKKyAgICBnRW52ID0gbmV3IENvbXBvbmVudFRlc3RFbnZpcm9ubWVudCgpOworICAgIDo6dGVzdGluZzo6QWRkR2xvYmFsVGVzdEVudmlyb25tZW50KGdFbnYpOworICAgIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworICAgIGdFbnYtPmluaXQoJmFyZ2MsIGFyZ3YpOworICAgIGludCBzdGF0dXMgPSBnRW52LT5pbml0RnJvbU9wdGlvbnMoYXJnYywgYXJndik7CisgICAgaWYgKHN0YXR1cyA9PSAwKSB7CisgICAgICAgIGludCBzdGF0dXMgPSBSVU5fQUxMX1RFU1RTKCk7CisgICAgICAgIExPRyhJTkZPKSA8PCAiQzIgVGVzdCByZXN1bHQgPSAiIDw8IHN0YXR1czsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvdmlkZW8vVnRzSGlkbEMyVjFfMFRhcmdldFZpZGVvRW5jVGVzdC5jcHAgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3ZpZGVvL1Z0c0hpZGxDMlYxXzBUYXJnZXRWaWRlb0VuY1Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3Yjc5MDIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3ZpZGVvL1Z0c0hpZGxDMlYxXzBUYXJnZXRWaWRlb0VuY1Rlc3QuY3BwCkBAIC0wLDAgKzEsNzEyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJjb2RlYzJfaGlkbF9oYWxfdmlkZW9fZW5jX3Rlc3QiCisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxmc3RyZWFtPgorCisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvY2xpZW50Lmg+CisjaW5jbHVkZSA8QzJBbGxvY2F0b3JJb24uaD4KKyNpbmNsdWRlIDxDMkNvbmZpZy5oPgorI2luY2x1ZGUgPEMyRGVidWcuaD4KKyNpbmNsdWRlIDxDMkJ1ZmZlci5oPgorI2luY2x1ZGUgPEMyQnVmZmVyUHJpdi5oPgorCit1c2luZyBhbmRyb2lkOjpDMkFsbG9jYXRvcklvbjsKKworI2luY2x1ZGUgPFZ0c0hhbEhpZGxUYXJnZXRUZXN0QmFzZS5oPgorI2luY2x1ZGUgIm1lZGlhX2MyX3ZpZGVvX2hpZGxfdGVzdF9jb21tb24uaCIKKyNpbmNsdWRlICJtZWRpYV9jMl9oaWRsX3Rlc3RfY29tbW9uLmgiCisKK2NsYXNzIEdyYXBoaWNCdWZmZXIgOiBwdWJsaWMgQzJCdWZmZXIgeworcHVibGljOgorICBleHBsaWNpdCBHcmFwaGljQnVmZmVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gJmJsb2NrKQorICAgICAgOiBDMkJ1ZmZlcih7YmxvY2stPnNoYXJlKEMyUmVjdChibG9jay0+d2lkdGgoKSwgYmxvY2stPmhlaWdodCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6OkMyRmVuY2UoKSl9KSB7fQorfTsKKworc3RhdGljIENvbXBvbmVudFRlc3RFbnZpcm9ubWVudCogZ0VudiA9IG51bGxwdHI7CisKK25hbWVzcGFjZSB7CisKK2NsYXNzIENvZGVjMlZpZGVvRW5jSGlkbFRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpWdHNIYWxIaWRsVGFyZ2V0VGVzdEJhc2UgeworICAgcHJpdmF0ZToKKyAgICB0eXBlZGVmIDo6dGVzdGluZzo6VnRzSGFsSGlkbFRhcmdldFRlc3RCYXNlIFN1cGVyOworCisgICBwdWJsaWM6CisgICAgOjpzdGQ6OnN0cmluZyBnZXRUZXN0Q2FzZUluZm8oKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiA6OnN0ZDo6c3RyaW5nKCkgKworICAgICAgICAgICAgICAgICJDb21wb25lbnQ6ICIgKyBnRW52LT5nZXRDb21wb25lbnQoKS5jX3N0cigpICsgIiB8ICIgKworICAgICAgICAgICAgICAgICJJbnN0YW5jZTogIiArIGdFbnYtPmdldEluc3RhbmNlKCkuY19zdHIoKSArICIgfCAiICsKKyAgICAgICAgICAgICAgICAiUmVzOiAiICsgZ0Vudi0+Z2V0UmVzKCkuY19zdHIoKTsKKyAgICB9CisKKyAgICAvLyBnb29nbGUuY29kZWMyIFZpZGVvIHRlc3Qgc2V0dXAKKyAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7CisgICAgICAgIFN1cGVyOjpTZXRVcCgpOworICAgICAgICBtRGlzYWJsZVRlc3QgPSBmYWxzZTsKKyAgICAgICAgQUxPR1YoIkNvZGVjMlZpZGVvRW5jSGlkbFRlc3QgU2V0VXAiKTsKKyAgICAgICAgbUNsaWVudCA9IGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q3JlYXRlRnJvbVNlcnZpY2UoCisgICAgICAgICAgICBnRW52LT5nZXRJbnN0YW5jZSgpLmNfc3RyKCkpOworICAgICAgICBBU1NFUlRfTkUobUNsaWVudCwgbnVsbHB0cik7CisgICAgICAgIG1MaXN0ZW5lci5yZXNldChuZXcgQ29kZWNMaXN0ZW5lcigKKyAgICAgICAgICAgIFt0aGlzXShzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrSXRlbXMpIHsKKyAgICAgICAgICAgICAgICBoYW5kbGVXb3JrRG9uZSh3b3JrSXRlbXMpOworICAgICAgICAgICAgfSkpOworICAgICAgICBBU1NFUlRfTkUobUxpc3RlbmVyLCBudWxscHRyKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfSU5QVVRfQlVGRkVSUzsgKytpKSB7CisgICAgICAgICAgICBtV29ya1F1ZXVlLmVtcGxhY2VfYmFjayhuZXcgQzJXb3JrKTsKKyAgICAgICAgfQorICAgICAgICBtQ2xpZW50LT5jcmVhdGVDb21wb25lbnQoZ0Vudi0+Z2V0Q29tcG9uZW50KCkuY19zdHIoKSwgbUxpc3RlbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1Db21wb25lbnQpOworICAgICAgICBBU1NFUlRfTkUobUNvbXBvbmVudCwgbnVsbHB0cik7CisKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yU3RvcmU+IHN0b3JlID0KKyAgICAgICAgICAgIGFuZHJvaWQ6OkdldENvZGVjMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmUoKTsKKyAgICAgICAgQ0hFQ0tfRVEoc3RvcmUtPmZldGNoQWxsb2NhdG9yKEMyQWxsb2NhdG9yU3RvcmU6OkRFRkFVTFRfR1JBUEhJQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtR3JhcGhpY0FsbG9jYXRvciksCisgICAgICAgICAgICAgICAgIEMyX09LKTsKKyAgICAgICAgbUdyYXBoaWNQb29sID0gc3RkOjptYWtlX3NoYXJlZDxDMlBvb2xlZEJsb2NrUG9vbD4obUdyYXBoaWNBbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CbG9ja1Bvb2xJZCsrKTsKKyAgICAgICAgQVNTRVJUX05FKG1HcmFwaGljUG9vbCwgbnVsbHB0cik7CisKKyAgICAgICAgbUNvbXBOYW1lID0gdW5rbm93bl9jb21wOworICAgICAgICBzdHJ1Y3QgU3RyaW5nVG9OYW1lIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIE5hbWU7CisgICAgICAgICAgICBzdGFuZGFyZENvbXAgQ29tcE5hbWU7CisgICAgICAgIH07CisKKyAgICAgICAgY29uc3QgU3RyaW5nVG9OYW1lIGtTdHJpbmdUb05hbWVbXSA9IHsKKyAgICAgICAgICAgIHsiaDI2MyIsIGgyNjN9LCB7ImF2YyIsIGF2Y30sIHsibXBlZzQiLCBtcGVnNH0sCisgICAgICAgICAgICB7ImhldmMiLCBoZXZjfSwgeyJ2cDgiLCB2cDh9LCB7InZwOSIsIHZwOX0sCisgICAgICAgIH07CisKKyAgICAgICAgY29uc3Qgc2l6ZV90IGtOdW1TdHJpbmdUb05hbWUgPQorICAgICAgICAgICAgc2l6ZW9mKGtTdHJpbmdUb05hbWUpIC8gc2l6ZW9mKGtTdHJpbmdUb05hbWVbMF0pOworCisgICAgICAgIHN0ZDo6c3RyaW5nIHN1YnN0cmluZzsKKyAgICAgICAgc3RkOjpzdHJpbmcgY29tcDsKKyAgICAgICAgc3Vic3RyaW5nID0gc3RkOjpzdHJpbmcoZ0Vudi0+Z2V0Q29tcG9uZW50KCkpOworICAgICAgICAvKiBUT0RPOiBiZXR0ZXIgYXBwcm9hY2ggdG8gZmluZCB0aGUgY29tcG9uZW50ICovCisgICAgICAgIC8qICJjMi5hbmRyb2lkLiIgPT4gMTF0aCBwb3NpdGlvbiAqLworICAgICAgICBzaXplX3QgcG9zID0gMTE7CisgICAgICAgIHNpemVfdCBsZW4gPSBzdWJzdHJpbmcuZmluZCgiLmVuY29kZXIiLCBwb3MpOworICAgICAgICBjb21wID0gc3Vic3RyaW5nLnN1YnN0cihwb3MsIGxlbiAtIHBvcyk7CisKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrTnVtU3RyaW5nVG9OYW1lOyArK2kpIHsKKyAgICAgICAgICAgIGlmICghc3RyY2FzZWNtcChjb21wLmNfc3RyKCksIGtTdHJpbmdUb05hbWVbaV0uTmFtZSkpIHsKKyAgICAgICAgICAgICAgICBtQ29tcE5hbWUgPSBrU3RyaW5nVG9OYW1lW2ldLkNvbXBOYW1lOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1Fb3MgPSBmYWxzZTsKKyAgICAgICAgbUNzZCA9IGZhbHNlOworICAgICAgICBtQ29uZmlnID0gZmFsc2U7CisgICAgICAgIG1GcmFtZXNSZWNlaXZlZCA9IDA7CisgICAgICAgIG1GYWlsZWRXb3JrUmVjZWl2ZWQgPSAwOworICAgICAgICBpZiAobUNvbXBOYW1lID09IHVua25vd25fY29tcCkgbURpc2FibGVUZXN0ID0gdHJ1ZTsKKyAgICAgICAgaWYgKG1EaXNhYmxlVGVzdCkgc3RkOjpjb3V0IDw8ICJbICAgV0FSTiAgIF0gVGVzdCBEaXNhYmxlZCBcbiI7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgeworICAgICAgICBpZiAobUNvbXBvbmVudCAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBpZiAoOjp0ZXN0aW5nOjpUZXN0OjpIYXNGYXRhbEZhaWx1cmUoKSkgcmV0dXJuOworICAgICAgICAgICAgbUNvbXBvbmVudC0+cmVsZWFzZSgpOworICAgICAgICAgICAgbUNvbXBvbmVudCA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgU3VwZXI6OlRlYXJEb3duKCk7CisgICAgfQorCisgICAgdm9pZCBzZXR1cENvbmZpZ1BhcmFtKGludDMyX3QgbldpZHRoLCBpbnQzMl90IG5IZWlnaHQpOworCisgICAgLy8gY2FsbGJhY2sgZnVuY3Rpb24gdG8gcHJvY2VzcyBvbldvcmtEb25lIHJlY2VpdmVkIGJ5IExpc3RlbmVyCisgICAgdm9pZCBoYW5kbGVXb3JrRG9uZShzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrSXRlbXMpIHsKKyAgICAgICAgZm9yIChzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yayA6IHdvcmtJdGVtcykgeworICAgICAgICAgICAgLy8gaGFuZGxlIGNvbmZpZ3VyYXRpb24gY2hhbmdlcyBpbiB3b3JrIGRvbmUKKyAgICAgICAgICAgIGlmICghd29yay0+d29ya2xldHMuZW1wdHkoKSAmJgorICAgICAgICAgICAgICAgICh3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLnNpemUoKSAhPSAwKSkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJDb25maWcgVXBkYXRlIik7CisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiB1cGRhdGVzID0KKyAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUpOworICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiBjb25maWdQYXJhbTsKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB1cGRhdGVzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgIEMyUGFyYW0qIHBhcmFtID0gdXBkYXRlc1tpXS5nZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtLT5pbmRleCgpID09IEMyU3RyZWFtQ3NkSW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtQ3NkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1GcmFtZXNSZWNlaXZlZCsrOworICAgICAgICAgICAgaWYgKHdvcmstPnJlc3VsdCAhPSBDMl9PSykgbUZhaWxlZFdvcmtSZWNlaXZlZCsrOworICAgICAgICAgICAgbUVvcyA9ICh3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgJgorICAgICAgICAgICAgICAgICAgICBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSAhPSAwOworICAgICAgICAgICAgYXV0byBmcmFtZUluZGV4SXQgPQorICAgICAgICAgICAgICAgIHN0ZDo6ZmluZChtRmx1c2hlZEluZGljZXMuYmVnaW4oKSwgbUZsdXNoZWRJbmRpY2VzLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKSk7CisgICAgICAgICAgICBBTE9HVigiV29ya0RvbmU6IGZyYW1lSUQgcmVjZWl2ZWQgJWQiLAorICAgICAgICAgICAgICAgIChpbnQpd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpKTsKKyAgICAgICAgICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmNsZWFyKCk7CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHlwZWRlZiBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IFVMb2NrOworICAgICAgICAgICAgICAgIFVMb2NrIGwobVF1ZXVlTG9jayk7CisgICAgICAgICAgICAgICAgbVdvcmtRdWV1ZS5wdXNoX2JhY2soc3RkOjptb3ZlKHdvcmspKTsKKyAgICAgICAgICAgICAgICBpZiAoIW1GbHVzaGVkSW5kaWNlcy5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIG1GbHVzaGVkSW5kaWNlcy5lcmFzZShmcmFtZUluZGV4SXQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtUXVldWVDb25kaXRpb24ubm90aWZ5X2FsbCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgZW51bSBzdGFuZGFyZENvbXAgeworICAgICAgICBoMjYzLAorICAgICAgICBhdmMsCisgICAgICAgIG1wZWc0LAorICAgICAgICBoZXZjLAorICAgICAgICB2cDgsCisgICAgICAgIHZwOSwKKyAgICAgICAgdW5rbm93bl9jb21wLAorICAgIH07CisKKyAgICBib29sIG1Fb3M7CisgICAgYm9vbCBtQ3NkOworICAgIGJvb2wgbURpc2FibGVUZXN0OworICAgIGJvb2wgbUNvbmZpZzsKKyAgICBzdGFuZGFyZENvbXAgbUNvbXBOYW1lOworICAgIHVpbnQzMl90IG1GcmFtZXNSZWNlaXZlZDsKKyAgICB1aW50MzJfdCBtRmFpbGVkV29ya1JlY2VpdmVkOworCisgICAgc3RkOjpsaXN0PHVpbnQ2NF90PiBtRmx1c2hlZEluZGljZXM7CisKKyAgICBDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCBtQmxvY2tQb29sSWQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiBtR3JhcGhpY1Bvb2w7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiBtR3JhcGhpY0FsbG9jYXRvcjsKKworICAgIHN0ZDo6bXV0ZXggbVF1ZXVlTG9jazsKKyAgICBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSBtUXVldWVDb25kaXRpb247CisgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBtV29ya1F1ZXVlOworCisgICAgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudD4gbUNsaWVudDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpMaXN0ZW5lcj4gbUxpc3RlbmVyOworICAgIHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gbUNvbXBvbmVudDsKKworICAgcHJvdGVjdGVkOgorICAgIHN0YXRpYyB2b2lkIGRlc2NyaXB0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXNjcmlwdGlvbikgeworICAgICAgICBSZWNvcmRQcm9wZXJ0eSgiZGVzY3JpcHRpb24iLCBkZXNjcmlwdGlvbik7CisgICAgfQorfTsKKwordm9pZCB2YWxpZGF0ZUNvbXBvbmVudCgKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+JiBjb21wb25lbnQsCisgICAgQ29kZWMyVmlkZW9FbmNIaWRsVGVzdDo6c3RhbmRhcmRDb21wIGNvbXBOYW1lLCBib29sJiBkaXNhYmxlVGVzdCkgeworICAgIC8vIFZhbGlkYXRlIGl0cyBhIEMyIENvbXBvbmVudAorICAgIGlmIChjb21wb25lbnQtPmdldE5hbWUoKS5maW5kKCJjMiIpID09IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgIEFMT0dFKCJOb3QgYSBjMiBjb21wb25lbnQiKTsKKyAgICAgICAgZGlzYWJsZVRlc3QgPSB0cnVlOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gVmFsaWRhdGUgaXRzIG5vdCBhbiBlbmNvZGVyIGFuZCB0aGUgY29tcG9uZW50IHRvIGJlIHRlc3RlZCBpcyB2aWRlbworICAgIGlmIChjb21wb25lbnQtPmdldE5hbWUoKS5maW5kKCJkZWNvZGVyIikgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgQUxPR0UoIkV4cGVjdGVkIEVuY29kZXIsIGdpdmVuIERlY29kZXIiKTsKKyAgICAgICAgZGlzYWJsZVRlc3QgPSB0cnVlOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gcXVlcmllZDsKKyAgICBjMl9zdGF0dXNfdCBjMmVyciA9CisgICAgICAgIGNvbXBvbmVudC0+cXVlcnkoe30sIHtDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjppbnB1dDo6UEFSQU1fVFlQRX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgQzJfRE9OVF9CTE9DSywgJnF1ZXJpZWQpOworICAgIGlmIChjMmVyciAhPSBDMl9PSyAmJiBxdWVyaWVkLnNpemUoKSA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJRdWVyeSBtZWRpYSB0eXBlIGZhaWxlZCA9PiAlZCIsIGMyZXJyKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzdGQ6OnN0cmluZyBpbnB1dERvbWFpbiA9CisgICAgICAgICAgICAoKEMyU3RyZWFtTWVkaWFUeXBlU2V0dGluZzo6aW5wdXQqKXF1ZXJpZWRbMF0uZ2V0KCkpLT5tLnZhbHVlOworICAgICAgICBpZiAoaW5wdXREb21haW4uZmluZCgidmlkZW8vIikgPT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgICAgIEFMT0dFKCJFeHBlY3RlZCBWaWRlbyBDb21wb25lbnQiKTsKKyAgICAgICAgICAgIGRpc2FibGVUZXN0ID0gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFZhbGlkYXRlcyBjb21wb25lbnQgbmFtZQorICAgIGlmIChjb21wTmFtZSA9PSBDb2RlYzJWaWRlb0VuY0hpZGxUZXN0Ojp1bmtub3duX2NvbXApIHsKKyAgICAgICAgQUxPR0UoIkNvbXBvbmVudCBJblZhbGlkIik7CisgICAgICAgIGRpc2FibGVUZXN0ID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBTE9HVigiQ29tcG9uZW50IFZhbGlkIik7Cit9CisKKy8vIFNldCBEZWZhdWx0IGNvbmZpZyBwYXJhbS4KK3ZvaWQgQ29kZWMyVmlkZW9FbmNIaWRsVGVzdDo6c2V0dXBDb25maWdQYXJhbShpbnQzMl90IG5XaWR0aCwgaW50MzJfdCBuSGVpZ2h0KSB7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgIEMyVmlkZW9TaXplU3RyZWFtVHVuaW5nOjppbnB1dCBpbnB1dFNpemUoMHUsIG5XaWR0aCwgbkhlaWdodCk7CisgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+IGNvbmZpZ1BhcmFteyZpbnB1dFNpemV9OworICAgIGMyX3N0YXR1c190IHN0YXR1cyA9CisgICAgICAgIG1Db21wb25lbnQtPmNvbmZpZyhjb25maWdQYXJhbSwgQzJfRE9OVF9CTE9DSywgJmZhaWx1cmVzKTsKKyAgICBpZiAoZmFpbHVyZXMuc2l6ZSgpID09IDB1ICkgbUNvbmZpZyA9IHRydWU7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgQzJfT0spOworfQorCisvLyBMb29rVXBUYWJsZSBvZiBjbGlwcyBmb3IgY29tcG9uZW50IHRlc3RpbmcKK3ZvaWQgR2V0VVJMRm9yQ29tcG9uZW50KGNoYXIqIFVSTCkgeworICAgIHN0cmNhdChVUkwsICJiYmJfMzUyeDI4OF80MjBwXzMwZnBzXzMyZnJhbWVzLnl1diIpOworfQorCit2b2lkIGVuY29kZU5GcmFtZXMoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q29tcG9uZW50PiAmY29tcG9uZW50LAorICAgICAgICAgICAgICAgICAgIHN0ZDo6bXV0ZXggJnF1ZXVlTG9jaywgc3RkOjpjb25kaXRpb25fdmFyaWFibGUgJnF1ZXVlQ29uZGl0aW9uLAorICAgICAgICAgICAgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gJndvcmtRdWV1ZSwKKyAgICAgICAgICAgICAgICAgICBzdGQ6Omxpc3Q8dWludDY0X3Q+ICZmbHVzaGVkSW5kaWNlcywKKyAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZncmFwaGljUG9vbCwKKyAgICAgICAgICAgICAgICAgICBzdGQ6Omlmc3RyZWFtJiBlbGVTdHJlYW0sIHVpbnQzMl90IGZyYW1lSUQsCisgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbkZyYW1lcywgdWludDMyX3QgbldpZHRoLCBpbnQzMl90IG5IZWlnaHQsCisgICAgICAgICAgICAgICAgICAgYm9vbCBmbHVzaGVkID0gZmFsc2UsYm9vbCBzaWduYWxFT1MgPSB0cnVlKSB7CisgICAgdHlwZWRlZiBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IFVMb2NrOworCisgICAgdWludDMyX3QgbWF4UmV0cnkgPSAwOworICAgIGludCBieXRlc0NvdW50ID0gbldpZHRoICogbkhlaWdodCAqIDMgPj4gMTsKKyAgICBpbnQzMl90IHRpbWVzdGFtcEluY3IgPSBFTkNPREVSX1RJTUVTVEFNUF9JTkNSRU1FTlQ7CisgICAgdWludDY0X3QgdGltZXN0YW1wID0gMDsKKyAgICB3aGlsZSAoMSkgeworICAgICAgICBpZiAobkZyYW1lcyA9PSAwKSBicmVhazsKKyAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwOworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB3b3JrOworICAgICAgICAvLyBQcmVwYXJlIEMyV29yaworICAgICAgICB3aGlsZSAoIXdvcmsgJiYgKG1heFJldHJ5IDwgTUFYX1JFVFJZKSkgeworICAgICAgICAgICAgVUxvY2sgbChxdWV1ZUxvY2spOworICAgICAgICAgICAgaWYgKCF3b3JrUXVldWUuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgIHdvcmsuc3dhcCh3b3JrUXVldWUuZnJvbnQoKSk7CisgICAgICAgICAgICAgICAgd29ya1F1ZXVlLnBvcF9mcm9udCgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBxdWV1ZUNvbmRpdGlvbi53YWl0X2ZvcihsLCBUSU1FX09VVCk7CisgICAgICAgICAgICAgICAgbWF4UmV0cnkrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIXdvcmsgJiYgKG1heFJldHJ5ID49IE1BWF9SRVRSWSkpIHsKKyAgICAgICAgICAgIEFTU0VSVF9UUlVFKGZhbHNlKSA8PCAiV2FpdCBmb3IgZ2VuZXJhdGluZyBDMldvcmsgZXhjZWVkZWQgdGltZW91dCI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNpZ25hbEVPUyAmJiAobkZyYW1lcyA9PSAxKSkKKyAgICAgICAgICAgIGZsYWdzIHw9IEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU07CisgICAgICAgIGlmIChmbHVzaGVkKSB7CisgICAgICAgICAgICBmbGFncyB8PSBTWU5DX0ZSQU1FOworICAgICAgICAgICAgZmx1c2hlZCA9IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgd29yay0+aW5wdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpZmxhZ3M7CisgICAgICAgIHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wID0gdGltZXN0YW1wOworICAgICAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXggPSBmcmFtZUlEOworICAgICAgICB7CisgICAgICAgICAgICBVTG9jayBsKHF1ZXVlTG9jayk7CisgICAgICAgICAgICBmbHVzaGVkSW5kaWNlcy5lbXBsYWNlX2JhY2soZnJhbWVJRCk7CisgICAgICAgIH0KKyAgICAgICAgY2hhciogZGF0YSA9IChjaGFyKiltYWxsb2MoYnl0ZXNDb3VudCk7CisgICAgICAgIG1lbXNldChkYXRhLCAwLCBieXRlc0NvdW50KTsKKyAgICAgICAgaWYgKGVsZVN0cmVhbS5pc19vcGVuKCkpIHsKKyAgICAgICAgICAgIGVsZVN0cmVhbS5yZWFkKGRhdGEsIGJ5dGVzQ291bnQpOworICAgICAgICAgICAgQVNTRVJUX0VRKGVsZVN0cmVhbS5nY291bnQoKSwgYnl0ZXNDb3VudCk7CisgICAgICAgIH0KKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiBibG9jazsKKyAgICAgICAgQVNTRVJUX0VRKAorICAgICAgICAgICAgQzJfT0ssCisgICAgICAgICAgICBncmFwaGljUG9vbC0+ZmV0Y2hHcmFwaGljQmxvY2soCisgICAgICAgICAgICAgICAgbldpZHRoLCBuSGVpZ2h0LCBIQUxfUElYRUxfRk9STUFUX1lWMTIsCisgICAgICAgICAgICAgICAge0MyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEV9LCAmYmxvY2spKTsKKyAgICAgICAgQVNTRVJUX1RSVUUoYmxvY2spOworICAgICAgICAvLyBHcmFwaGljIFZpZXcKKyAgICAgICAgQzJHcmFwaGljVmlldyB2aWV3ID0gYmxvY2stPm1hcCgpLmdldCgpOworICAgICAgICBpZiAodmlldy5lcnJvcigpICE9IEMyX09LKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkMyR3JhcGhpY0Jsb2NrOjptYXAoKSBmYWlsZWQgOiAlZCIsIHZpZXcuZXJyb3IoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHVpbnQ4X3QqIHBZID0gdmlldy5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldOworICAgICAgICB1aW50OF90KiBwVSA9IHZpZXcuZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXTsKKyAgICAgICAgdWludDhfdCogcFYgPSB2aWV3LmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfVl07CisKKyAgICAgICAgbWVtY3B5KHBZLCBkYXRhLCBuV2lkdGggKiBuSGVpZ2h0KTsKKyAgICAgICAgbWVtY3B5KHBVLCBkYXRhICsgbldpZHRoICogbkhlaWdodCwgKG5XaWR0aCAqIG5IZWlnaHQgPj4gMikpOworICAgICAgICBtZW1jcHkocFYsIGRhdGEgKyAobldpZHRoICogbkhlaWdodCAqIDUgPj4gMiksIG5XaWR0aCAqIG5IZWlnaHQgPj4gMik7CisKKyAgICAgICAgd29yay0+aW5wdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmVtcGxhY2VfYmFjayhuZXcgR3JhcGhpY0J1ZmZlcihibG9jaykpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5jbGVhcigpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5lbXBsYWNlX2JhY2sobmV3IEMyV29ya2xldCk7CisgICAgICAgIGZyZWUoZGF0YSk7CisKKyAgICAgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBpdGVtczsKKyAgICAgICAgaXRlbXMucHVzaF9iYWNrKHN0ZDo6bW92ZSh3b3JrKSk7CisKKyAgICAgICAgLy8gRE8gVEhFIEVOQ09ESU5HCisgICAgICAgIEFTU0VSVF9FUShjb21wb25lbnQtPnF1ZXVlKCZpdGVtcyksIEMyX09LKTsKKyAgICAgICAgQUxPR1YoIkZyYW1lICMlZCBzaXplID0gJWQgcXVldWVkIiwgZnJhbWVJRCwgYnl0ZXNDb3VudCk7CisgICAgICAgIG5GcmFtZXMtLTsKKyAgICAgICAgdGltZXN0YW1wICs9IHRpbWVzdGFtcEluY3I7CisgICAgICAgIGZyYW1lSUQrKzsKKyAgICAgICAgbWF4UmV0cnkgPSAwOworICAgIH0KK30KKwordm9pZCB3YWl0T25JbnB1dENvbnN1bXB0aW9uKHN0ZDo6bXV0ZXggJnF1ZXVlTG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSAmcXVldWVDb25kaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiAmd29ya1F1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBidWZmZXJDb3VudCA9IE1BWF9JTlBVVF9CVUZGRVJTKSB7CisgICAgdHlwZWRlZiBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IFVMb2NrOworICAgIHVpbnQzMl90IHF1ZXVlU2l6ZTsKKyAgICBpbnQgbWF4UmV0cnkgPSAwOworICAgIHsKKyAgICAgICAgVUxvY2sgbChxdWV1ZUxvY2spOworICAgICAgICBxdWV1ZVNpemUgPSB3b3JrUXVldWUuc2l6ZSgpOworICAgIH0KKyAgICB3aGlsZSAoKG1heFJldHJ5IDwgTUFYX1JFVFJZKSAmJiAocXVldWVTaXplIDwgYnVmZmVyQ291bnQpKSB7CisgICAgICAgIFVMb2NrIGwocXVldWVMb2NrKTsKKyAgICAgICAgaWYgKHF1ZXVlU2l6ZSAhPSB3b3JrUXVldWUuc2l6ZSgpKSB7CisgICAgICAgICAgICBxdWV1ZVNpemUgPSB3b3JrUXVldWUuc2l6ZSgpOworICAgICAgICAgICAgbWF4UmV0cnkgPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcXVldWVDb25kaXRpb24ud2FpdF9mb3IobCwgVElNRV9PVVQpOworICAgICAgICAgICAgbWF4UmV0cnkrKzsKKyAgICAgICAgfQorICAgIH0KK30KKworCitURVNUX0YoQ29kZWMyVmlkZW9FbmNIaWRsVGVzdCwgdmFsaWRhdGVDb21wTmFtZSkgeworICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKKyAgICBBTE9HVigiQ2hlY2tzIGlmIHRoZSBnaXZlbiBjb21wb25lbnQgaXMgYSB2YWxpZCB2aWRlbyBjb21wb25lbnQiKTsKKyAgICB2YWxpZGF0ZUNvbXBvbmVudChtQ29tcG9uZW50LCBtQ29tcE5hbWUsIG1EaXNhYmxlVGVzdCk7CisgICAgQVNTRVJUX0VRKG1EaXNhYmxlVGVzdCwgZmFsc2UpOworfQorCitURVNUX0YoQ29kZWMyVmlkZW9FbmNIaWRsVGVzdCwgRW5jb2RlVGVzdCkgeworICAgIGRlc2NyaXB0aW9uKCJFbmNvZGVzIGlucHV0IGZpbGUiKTsKKyAgICBpZiAobURpc2FibGVUZXN0KSByZXR1cm47CisKKyAgICBjaGFyIG1VUkxbNTEyXTsKKyAgICBpbnQzMl90IG5XaWR0aCA9IEVOQ19ERUZBVUxUX0ZSQU1FX1dJRFRIOworICAgIGludDMyX3QgbkhlaWdodCA9IEVOQ19ERUZBVUxUX0ZSQU1FX0hFSUdIVDsKKworICAgIHN0cmNweShtVVJMLCBnRW52LT5nZXRSZXMoKS5jX3N0cigpKTsKKyAgICBHZXRVUkxGb3JDb21wb25lbnQobVVSTCk7CisKKyAgICBzdGQ6Omlmc3RyZWFtIGVsZVN0cmVhbTsKKyAgICBlbGVTdHJlYW0ub3BlbihtVVJMLCBzdGQ6Omlmc3RyZWFtOjpiaW5hcnkpOworICAgIEFTU0VSVF9FUShlbGVTdHJlYW0uaXNfb3BlbigpLCB0cnVlKSA8PCBtVVJMIDw8ICIgZmlsZSBub3QgZm91bmQiOworICAgIEFMT0dWKCJtVVJMIDogJXMiLCBtVVJMKTsKKworICAgIHNldHVwQ29uZmlnUGFyYW0obldpZHRoLCBuSGVpZ2h0KTsKKyAgICBpZiAoIW1Db25maWcpIHsKKyAgICAgICAgc3RkOjpjb3V0IDw8ICJbICAgV0FSTiAgIF0gVGVzdCBTa2lwcGVkIFxuIjsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RhcnQoKSwgQzJfT0spOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICBlbmNvZGVORnJhbWVzKG1Db21wb25lbnQsIG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICBtRmx1c2hlZEluZGljZXMsIG1HcmFwaGljUG9vbCwgZWxlU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgIDAsIEVOQ19OVU1fRlJBTUVTLCBuV2lkdGgsIG5IZWlnaHQpKTsKKworICAgIC8vIGJsb2NraW5nIGNhbGwgdG8gZW5zdXJlcyBhcHBsaWNhdGlvbiB0byBXYWl0IHRpbGwgYWxsIHRoZSBpbnB1dHMgYXJlCisgICAgLy8gY29uc3VtZWQKKyAgICBBTE9HRCgiV2FpdGluZyBmb3IgaW5wdXQgY29uc3VtcHRpb24iKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgd2FpdE9uSW5wdXRDb25zdW1wdGlvbihtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUpKTsKKworICAgIGVsZVN0cmVhbS5jbG9zZSgpOworICAgIGlmIChtRnJhbWVzUmVjZWl2ZWQgIT0gRU5DX05VTV9GUkFNRVMpIHsKKyAgICAgICAgQUxPR0UoIklucHV0IGJ1ZmZlciBjb3VudCBhbmQgT3V0cHV0IGJ1ZmZlciBjb3VudCBtaXNtYXRjaCIpOworICAgICAgICBBTE9HRSgiZnJhbWVzUmVjZWl2ZWQgOiAlZCBpbnB1dEZyYW1lcyA6ICVkIiwgbUZyYW1lc1JlY2VpdmVkLAorICAgICAgICAgICAgICBFTkNfTlVNX0ZSQU1FUyk7CisgICAgICAgIEFTU0VSVF9UUlVFKGZhbHNlKTsKKyAgICB9CisKKyAgICBpZiAoIW1Dc2QgJiYgKG1Db21wTmFtZSAhPSB2cDggJiYgbUNvbXBOYW1lICE9IHZwOSkpIHsKKyAgICAgICAgQVNTRVJUX1RSVUUoZmFsc2UpIDw8ICJDU0QgQnVmZmVyIG5vdCByZWNlaXZlZCI7CisgICAgfQorCisgICAgaWYgKG1Dc2QgJiYgKG1Db21wTmFtZSA9PSB2cDggfHwgbUNvbXBOYW1lID09IHZwOSkpIHsKKyAgICAgICAgQVNTRVJUX1RSVUUoZmFsc2UpIDw8ICJDU0QgQnVmZmVyIG5vdCBleHBlY3RlZCI7CisgICAgfQorCisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0b3AoKSwgQzJfT0spOworfQorCitURVNUX0YoQ29kZWMyVmlkZW9FbmNIaWRsVGVzdCwgRU9TVGVzdCkgeworICAgIGRlc2NyaXB0aW9uKCJUZXN0IGVtcHR5IGlucHV0IGJ1ZmZlciB3aXRoIEVPUyBmbGFnIik7CisgICAgaWYgKG1EaXNhYmxlVGVzdCkgcmV0dXJuOworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdGFydCgpLCBDMl9PSyk7CisKKyAgICB0eXBlZGVmIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gVUxvY2s7CisgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gd29yazsKKyAgICB7CisgICAgICAgIFVMb2NrIGwobVF1ZXVlTG9jayk7CisgICAgICAgIGlmICghbVdvcmtRdWV1ZS5lbXB0eSgpKSB7CisgICAgICAgICAgICB3b3JrLnN3YXAobVdvcmtRdWV1ZS5mcm9udCgpKTsKKyAgICAgICAgICAgIG1Xb3JrUXVldWUucG9wX2Zyb250KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HRSgibVdvcmtRdWV1ZSBFbXB0eSBpcyBub3QgZXhwZWN0ZWQgYXQgdGhlIHN0YXJ0IG9mIHRoZSB0ZXN0Iik7CisgICAgICAgICAgICBBU1NFUlRfVFJVRShmYWxzZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgQVNTRVJUX05FKHdvcmssIG51bGxwdHIpOworICAgIHdvcmstPmlucHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KUMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU07CisgICAgd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAgPSAwOworICAgIHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleCA9IDA7CisgICAgd29yay0+aW5wdXQuYnVmZmVycy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZW1wbGFjZV9iYWNrKG5ldyBDMldvcmtsZXQpOworCisgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBpdGVtczsKKyAgICBpdGVtcy5wdXNoX2JhY2soc3RkOjptb3ZlKHdvcmspKTsKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+cXVldWUoJml0ZW1zKSwgQzJfT0spOworICAgIHVpbnQzMl90IHF1ZXVlU2l6ZTsKKyAgICB7CisgICAgICAgIFVMb2NrIGwobVF1ZXVlTG9jayk7CisgICAgICAgIHF1ZXVlU2l6ZSA9IG1Xb3JrUXVldWUuc2l6ZSgpOworICAgICAgICBpZiAocXVldWVTaXplIDwgTUFYX0lOUFVUX0JVRkZFUlMpIHsKKyAgICAgICAgICAgIG1RdWV1ZUNvbmRpdGlvbi53YWl0X2ZvcihsLCBUSU1FX09VVCk7CisgICAgICAgIH0KKyAgICB9CisgICAgQVNTRVJUX0VRKG1Fb3MsIHRydWUpOworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdG9wKCksIEMyX09LKTsKK30KKworVEVTVF9GKENvZGVjMlZpZGVvRW5jSGlkbFRlc3QsIEVtcHR5QnVmZmVyVGVzdCkgeworICAgIGRlc2NyaXB0aW9uKCJUZXN0cyBlbXB0eSBpbnB1dCBidWZmZXIiKTsKKyAgICBpZiAobURpc2FibGVUZXN0KSByZXR1cm47CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0YXJ0KCksIEMyX09LKTsKKworICAgIHR5cGVkZWYgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBVTG9jazsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB3b3JrOworICAgIHsKKyAgICAgICAgVUxvY2sgbChtUXVldWVMb2NrKTsKKyAgICAgICAgaWYgKCFtV29ya1F1ZXVlLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIHdvcmsuc3dhcChtV29ya1F1ZXVlLmZyb250KCkpOworICAgICAgICAgICAgbVdvcmtRdWV1ZS5wb3BfZnJvbnQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dFKCJtV29ya1F1ZXVlIEVtcHR5IGlzIG5vdCBleHBlY3RlZCBhdCB0aGUgc3RhcnQgb2YgdGhlIHRlc3QiKTsKKyAgICAgICAgICAgIEFTU0VSVF9UUlVFKGZhbHNlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBBU1NFUlRfTkUod29yaywgbnVsbHB0cik7CisgICAgd29yay0+aW5wdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpMDsKKyAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcCA9IDA7CisgICAgd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4ID0gMDsKKyAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5lbXBsYWNlX2JhY2sobmV3IEMyV29ya2xldCk7CisKKyAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IGl0ZW1zOworICAgIGl0ZW1zLnB1c2hfYmFjayhzdGQ6Om1vdmUod29yaykpOworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5xdWV1ZSgmaXRlbXMpLCBDMl9PSyk7CisgICAgdWludDMyX3QgcXVldWVTaXplOworICAgIHsKKyAgICAgICAgVUxvY2sgbChtUXVldWVMb2NrKTsKKyAgICAgICAgcXVldWVTaXplID0gbVdvcmtRdWV1ZS5zaXplKCk7CisgICAgICAgIGlmIChxdWV1ZVNpemUgPCBNQVhfSU5QVVRfQlVGRkVSUykgeworICAgICAgICAgICAgbVF1ZXVlQ29uZGl0aW9uLndhaXRfZm9yKGwsIFRJTUVfT1VUKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBBU1NFUlRfRVEobVdvcmtRdWV1ZS5zaXplKCksICh1aW50MzJfdClNQVhfSU5QVVRfQlVGRkVSUyk7CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0b3AoKSwgQzJfT0spOworfQorCitURVNUX0YoQ29kZWMyVmlkZW9FbmNIaWRsVGVzdCwgRmx1c2hUZXN0KSB7CisgICAgZGVzY3JpcHRpb24oIlRlc3QgUmVxdWVzdCBmb3IgZmx1c2giKTsKKyAgICBpZiAobURpc2FibGVUZXN0KSByZXR1cm47CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0YXJ0KCksIEMyX09LKTsKKworICAgIHR5cGVkZWYgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBVTG9jazsKKyAgICBjaGFyIG1VUkxbNTEyXTsKKyAgICBpbnQzMl90IG5XaWR0aCA9IEVOQ19ERUZBVUxUX0ZSQU1FX1dJRFRIOworICAgIGludDMyX3QgbkhlaWdodCA9IEVOQ19ERUZBVUxUX0ZSQU1FX0hFSUdIVDsKKyAgICBzdHJjcHkobVVSTCwgZ0Vudi0+Z2V0UmVzKCkuY19zdHIoKSk7CisgICAgR2V0VVJMRm9yQ29tcG9uZW50KG1VUkwpOworICAgIHNldHVwQ29uZmlnUGFyYW0obldpZHRoLCBuSGVpZ2h0KTsKKworICAgIC8vIFNldHRpbmcgZGVmYXVsdCBjb25maWd1cmF0aW9uCisgICAgbUZsdXNoZWRJbmRpY2VzLmNsZWFyKCk7CisgICAgc3RkOjppZnN0cmVhbSBlbGVTdHJlYW07CisgICAgdWludDMyX3QgbnVtRnJhbWVzRmx1c2hlZCA9IDEwOworICAgIHVpbnQzMl90IG51bUZyYW1lcyA9IEVOQ19OVU1fRlJBTUVTOworICAgIGVsZVN0cmVhbS5vcGVuKG1VUkwsIHN0ZDo6aWZzdHJlYW06OmJpbmFyeSk7CisgICAgQVNTRVJUX0VRKGVsZVN0cmVhbS5pc19vcGVuKCksIHRydWUpOworICAgIEFMT0dWKCJtVVJMIDogJXMiLCBtVVJMKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgZW5jb2RlTkZyYW1lcyhtQ29tcG9uZW50LCBtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgbUZsdXNoZWRJbmRpY2VzLCBtR3JhcGhpY1Bvb2wsIGVsZVN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAwLCBudW1GcmFtZXNGbHVzaGVkLCBuV2lkdGgsIG5IZWlnaHQpKTsKKyAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IGZsdXNoZWRXb3JrOworICAgIGMyX3N0YXR1c190IGVyciA9CisgICAgICAgIG1Db21wb25lbnQtPmZsdXNoKEMyQ29tcG9uZW50OjpGTFVTSF9DT01QT05FTlQsICZmbHVzaGVkV29yayk7CisgICAgQVNTRVJUX0VRKGVyciwgQzJfT0spOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICB3YWl0T25JbnB1dENvbnN1bXB0aW9uKG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwKKyAgICAgICAgICAgIChzaXplX3QpTUFYX0lOUFVUX0JVRkZFUlMgLSBmbHVzaGVkV29yay5zaXplKCkpKTsKKyAgICB1aW50NjRfdCBmcmFtZUluZGV4OworICAgIHsKKyAgICAgICAgLy9VcGRhdGUgbUZsdXNoZWRJbmRpY2VzIGJhc2VkIG9uIHRoZSBpbmRleCByZWNlaXZlZCBmcm9tIGZsdXNoKCkKKyAgICAgICAgVUxvY2sgbChtUXVldWVMb2NrKTsKKyAgICAgICAgZm9yIChzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yayA6IGZsdXNoZWRXb3JrKSB7CisgICAgICAgICAgICBBU1NFUlRfTkUod29yaywgbnVsbHB0cik7CisgICAgICAgICAgICBmcmFtZUluZGV4ID0gd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCk7CisgICAgICAgICAgICBzdGQ6Omxpc3Q8dWludDY0X3Q+OjppdGVyYXRvciBmcmFtZUluZGV4SXQgPSBzdGQ6OmZpbmQoCisgICAgICAgICAgICAgICAgbUZsdXNoZWRJbmRpY2VzLmJlZ2luKCksIG1GbHVzaGVkSW5kaWNlcy5lbmQoKSwgZnJhbWVJbmRleCk7CisgICAgICAgICAgICBpZiAoIW1GbHVzaGVkSW5kaWNlcy5lbXB0eSgpICYmCisgICAgICAgICAgICAgICAgKGZyYW1lSW5kZXhJdCAhPSBtRmx1c2hlZEluZGljZXMuZW5kKCkpKSB7CisgICAgICAgICAgICAgICAgbUZsdXNoZWRJbmRpY2VzLmVyYXNlKGZyYW1lSW5kZXhJdCk7CisgICAgICAgICAgICAgICAgd29yay0+aW5wdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgbVdvcmtRdWV1ZS5wdXNoX2JhY2soc3RkOjptb3ZlKHdvcmspKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBtRmx1c2hlZEluZGljZXMuY2xlYXIoKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgZW5jb2RlTkZyYW1lcyhtQ29tcG9uZW50LCBtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgbUZsdXNoZWRJbmRpY2VzLCBtR3JhcGhpY1Bvb2wsIGVsZVN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICBudW1GcmFtZXNGbHVzaGVkLCBudW1GcmFtZXMgLSBudW1GcmFtZXNGbHVzaGVkLAorICAgICAgICAgICAgICAgICAgICAgIG5XaWR0aCwgbkhlaWdodCwgdHJ1ZSkpOworICAgIGVsZVN0cmVhbS5jbG9zZSgpOworICAgIGVyciA9IG1Db21wb25lbnQtPmZsdXNoKEMyQ29tcG9uZW50OjpGTFVTSF9DT01QT05FTlQsICZmbHVzaGVkV29yayk7CisgICAgQVNTRVJUX0VRKGVyciwgQzJfT0spOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICB3YWl0T25JbnB1dENvbnN1bXB0aW9uKG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwKKyAgICAgICAgICAgIChzaXplX3QpTUFYX0lOUFVUX0JVRkZFUlMgLSBmbHVzaGVkV29yay5zaXplKCkpKTsKKyAgICB7CisgICAgICAgIC8vVXBkYXRlIG1GbHVzaGVkSW5kaWNlcyBiYXNlZCBvbiB0aGUgaW5kZXggcmVjZWl2ZWQgZnJvbSBmbHVzaCgpCisgICAgICAgIFVMb2NrIGwobVF1ZXVlTG9jayk7CisgICAgICAgIGZvciAoc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmsgOiBmbHVzaGVkV29yaykgeworICAgICAgICAgICAgQVNTRVJUX05FKHdvcmssIG51bGxwdHIpOworICAgICAgICAgICAgZnJhbWVJbmRleCA9IHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpOworICAgICAgICAgICAgc3RkOjpsaXN0PHVpbnQ2NF90Pjo6aXRlcmF0b3IgZnJhbWVJbmRleEl0ID0gc3RkOjpmaW5kKAorICAgICAgICAgICAgICAgIG1GbHVzaGVkSW5kaWNlcy5iZWdpbigpLCBtRmx1c2hlZEluZGljZXMuZW5kKCksIGZyYW1lSW5kZXgpOworICAgICAgICAgICAgaWYgKCFtRmx1c2hlZEluZGljZXMuZW1wdHkoKSAmJgorICAgICAgICAgICAgICAgIChmcmFtZUluZGV4SXQgIT0gbUZsdXNoZWRJbmRpY2VzLmVuZCgpKSkgeworICAgICAgICAgICAgICAgIG1GbHVzaGVkSW5kaWNlcy5lcmFzZShmcmFtZUluZGV4SXQpOworICAgICAgICAgICAgICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5jbGVhcigpOworICAgICAgICAgICAgICAgIG1Xb3JrUXVldWUucHVzaF9iYWNrKHN0ZDo6bW92ZSh3b3JrKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgQVNTRVJUX0VRKG1GbHVzaGVkSW5kaWNlcy5lbXB0eSgpLCB0cnVlKTsKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RvcCgpLCBDMl9PSyk7Cit9CisKK1RFU1RfRihDb2RlYzJWaWRlb0VuY0hpZGxUZXN0LCBJbnZhbGlkQnVmZmVyVGVzdCkgeworICAgIGRlc2NyaXB0aW9uKCJUZXN0cyBmZWVkaW5nIGxhcmdlci9zbWFsbGVyIGlucHV0IGJ1ZmZlciIpOworICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RhcnQoKSwgQzJfT0spOworCisgICAgc3RkOjppZnN0cmVhbSBlbGVTdHJlYW07CisgICAgaW50MzJfdCBuV2lkdGggPSBFTkNfREVGQVVMVF9GUkFNRV9XSURUSCAvIDI7CisgICAgaW50MzJfdCBuSGVpZ2h0ID0gRU5DX0RFRkFVTFRfRlJBTUVfSEVJR0hUIC8gMjsKKyAgICBzZXR1cENvbmZpZ1BhcmFtKG5XaWR0aCwgbkhlaWdodCk7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgZW5jb2RlTkZyYW1lcyhtQ29tcG9uZW50LCBtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgbUZsdXNoZWRJbmRpY2VzLCBtR3JhcGhpY1Bvb2wsIGVsZVN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAwLCAxLCBuV2lkdGgsIG5IZWlnaHQsIGZhbHNlLCBmYWxzZSkpOworCisgICAgLy8gRmVlZCBsYXJnZXIgaW5wdXQgYnVmZmVyLgorICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICBlbmNvZGVORnJhbWVzKG1Db21wb25lbnQsIG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICBtRmx1c2hlZEluZGljZXMsIG1HcmFwaGljUG9vbCwgZWxlU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgIDEsIDEsIG5XaWR0aCoyLCBuSGVpZ2h0KjIsIGZhbHNlLCBmYWxzZSkpOworCisgICAgLy8gRmVlZCBzbWFsbGVyIGlucHV0IGJ1ZmZlci4KKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgZW5jb2RlTkZyYW1lcyhtQ29tcG9uZW50LCBtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgbUZsdXNoZWRJbmRpY2VzLCBtR3JhcGhpY1Bvb2wsIGVsZVN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAyLCAxLCBuV2lkdGgvMiwgbkhlaWdodC8yLCBmYWxzZSwgdHJ1ZSkpOworCisgICAgLy8gYmxvY2tpbmcgY2FsbCB0byBlbnN1cmVzIGFwcGxpY2F0aW9uIHRvIFdhaXQgdGlsbCBhbGwgdGhlIGlucHV0cyBhcmUKKyAgICAvLyBjb25zdW1lZAorICAgIEFMT0dEKCJXYWl0aW5nIGZvciBpbnB1dCBjb25zdW1wdGlvbiIpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICB3YWl0T25JbnB1dENvbnN1bXB0aW9uKG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSkpOworCisgICAgaWYgKG1GcmFtZXNSZWNlaXZlZCAhPSAzKSB7CisgICAgICAgIEFMT0dFKCJJbnB1dCBidWZmZXIgY291bnQgYW5kIE91dHB1dCBidWZmZXIgY291bnQgbWlzbWF0Y2giKTsKKyAgICAgICAgQUxPR0UoImZyYW1lc1JlY2VpdmVkIDogJWQgaW5wdXRGcmFtZXMgOiAzIiwgbUZyYW1lc1JlY2VpdmVkKTsKKyAgICAgICAgQVNTRVJUX1RSVUUoZmFsc2UpOworICAgIH0KKworICAgIGlmIChtRmFpbGVkV29ya1JlY2VpdmVkID09IDApIHsKKyAgICAgICAgQUxPR0UoIkV4cGVjdGVkIGZhaWxlZCBmcmFtZSBjb3VudCBtaXNtYXRjaCIpOworICAgICAgICBBTE9HRSgiZmFpbGVkRnJhbWVzUmVjZWl2ZWQgOiAlZCIsIG1GYWlsZWRXb3JrUmVjZWl2ZWQpOworICAgICAgICBBU1NFUlRfVFJVRShmYWxzZSk7CisgICAgfQorCisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0b3AoKSwgQzJfT0spOworfQorCitjbGFzcyBDb2RlYzJWaWRlb0VuY1Jlc29sdXRpb25UZXN0IDogcHVibGljIENvZGVjMlZpZGVvRW5jSGlkbFRlc3QsCisgICAgICAgIHB1YmxpYyA6OnRlc3Rpbmc6OldpdGhQYXJhbUludGVyZmFjZTxzdGQ6OnBhaXI8aW50MzJfdCwgaW50MzJfdD4gPiB7Cit9OworCitURVNUX1AoQ29kZWMyVmlkZW9FbmNSZXNvbHV0aW9uVGVzdCwgUmVzb2x1dGlvblRlc3QpIHsKKyAgICBkZXNjcmlwdGlvbigiVGVzdHMgZW5jb2RpbmcgYXQgZGlmZmVyZW50IHJlc29sdXRpb25zIik7CisgICAgaWYgKG1EaXNhYmxlVGVzdCkgcmV0dXJuOworCisgICAgc3RkOjppZnN0cmVhbSBlbGVTdHJlYW07CisgICAgaW50MzJfdCBuV2lkdGggPSBHZXRQYXJhbSgpLmZpcnN0OworICAgIGludDMyX3QgbkhlaWdodCA9IEdldFBhcmFtKCkuc2Vjb25kOworICAgIEFMT0dEKCJUcnlpbmcgZW5jb2RlIGZvciB3aWR0aCAlZCBoZWlnaHQgJWQiLCBuV2lkdGgsIG5IZWlnaHQpOworICAgIG1Db25maWcgPSBmYWxzZTsKKyAgICBtRW9zID0gZmFsc2U7CisgICAgc2V0dXBDb25maWdQYXJhbShuV2lkdGgsIG5IZWlnaHQpOworICAgIGlmICghbUNvbmZpZykgcmV0dXJuOworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdGFydCgpLCBDMl9PSyk7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgZW5jb2RlTkZyYW1lcyhtQ29tcG9uZW50LCBtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgbUZsdXNoZWRJbmRpY2VzLCBtR3JhcGhpY1Bvb2wsIGVsZVN0cmVhbSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICBNQVhfSU5QVVRfQlVGRkVSUywgbldpZHRoLCBuSGVpZ2h0KSk7CisKKyAgICBBTE9HRCgiV2FpdGluZyBmb3IgaW5wdXQgY29uc3VtcHRpb24iKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgd2FpdE9uSW5wdXRDb25zdW1wdGlvbihtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUpKTsKKworICAgIEFTU0VSVF9FUShtRW9zLCB0cnVlKTsKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RvcCgpLCBDMl9PSyk7CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnJlc2V0KCksIEMyX09LKTsKK30KK0lOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKE5vblN0ZFNpemVzLCBDb2RlYzJWaWRlb0VuY1Jlc29sdXRpb25UZXN0LCA6OnRlc3Rpbmc6OlZhbHVlcygKKyAgICBzdGQ6Om1ha2VfcGFpcig1MiwgMTgpLAorICAgIHN0ZDo6bWFrZV9wYWlyKDM2NSwgMzY1KSwKKyAgICBzdGQ6Om1ha2VfcGFpcig0ODQsIDM2MiksCisgICAgc3RkOjptYWtlX3BhaXIoMjQ0LCA0ODgpKSk7CisKK30gIC8vIGFub255bW91cyBuYW1lc3BhY2UKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisgICAgZ0VudiA9IG5ldyBDb21wb25lbnRUZXN0RW52aXJvbm1lbnQoKTsKKyAgICA6OnRlc3Rpbmc6OkFkZEdsb2JhbFRlc3RFbnZpcm9ubWVudChnRW52KTsKKyAgICA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKyAgICBnRW52LT5pbml0KCZhcmdjLCBhcmd2KTsKKyAgICBpbnQgc3RhdHVzID0gZ0Vudi0+aW5pdEZyb21PcHRpb25zKGFyZ2MsIGFyZ3YpOworICAgIGlmIChzdGF0dXMgPT0gMCkgeworICAgICAgICBpbnQgc3RhdHVzID0gUlVOX0FMTF9URVNUUygpOworICAgICAgICBMT0coSU5GTykgPDwgIkMyIFRlc3QgcmVzdWx0ID0gIiA8PCBzdGF0dXM7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3ZpZGVvL21lZGlhX2MyX3ZpZGVvX2hpZGxfdGVzdF9jb21tb24uaCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvdmlkZW8vbWVkaWFfYzJfdmlkZW9faGlkbF90ZXN0X2NvbW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyMTViMTMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3ZpZGVvL21lZGlhX2MyX3ZpZGVvX2hpZGxfdGVzdF9jb21tb24uaApAQCAtMCwwICsxLDM0IEBACisvKgorICogQ29weXJpZ2h0IDIwMTgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBNRURJQV9DMl9WSURFT19ISURMX1RFU1RfQ09NTU9OX0gKKyNkZWZpbmUgTUVESUFfQzJfVklERU9fSElETF9URVNUX0NPTU1PTl9ICisKKyNkZWZpbmUgTUFYX1JFVFJZIDIwCisjZGVmaW5lIFRJTUVfT1VUIDQwMG1zCisjZGVmaW5lIE1BWF9JTlBVVF9CVUZGRVJTIDgKKyNkZWZpbmUgRU5DT0RFUl9USU1FU1RBTVBfSU5DUkVNRU5UIDQwMDAwCisjZGVmaW5lIEVOQ19OVU1fRlJBTUVTIDMyCisjZGVmaW5lIEVOQ19ERUZBVUxUX0ZSQU1FX1dJRFRIIDM1MgorI2RlZmluZSBFTkNfREVGQVVMVF9GUkFNRV9IRUlHSFQgMjg4CisjZGVmaW5lIE1BWF9JVEVSQVRJT05TIDEyOAorCisvKgorICogQ29tbW9uIHZpZGVvIHV0aWxzCisgKi8KKworCisjZW5kaWYgIC8vIE1FRElBX0MyX1ZJREVPX0hJRExfVEVTVF9DT01NT05fSApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvY2xpZW50L0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvaGlkbC9jbGllbnQvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGMwMmQyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvY2xpZW50L0FuZHJvaWQuYnAKQEAgLTAsMCArMSwzOCBAQAorY2NfbGlicmFyeSB7CisgICAgbmFtZTogImxpYmNvZGVjMl9jbGllbnQiLAorCisgICAgc3JjczogWworICAgICAgICAiY2xpZW50LmNwcCIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmdyYXBoaWNzLmJ1ZmZlcnF1ZXVlQDEuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmJ1ZmZlcnBvb2xAMS4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYzJAMS4wIiwKKyAgICAgICAgImxpYmJhc2UiLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmNvZGVjMiIsCisgICAgICAgICJsaWJjb2RlYzJfaGlkbEAxLjAiLAorICAgICAgICAibGliY29kZWMyX3ZuZGsiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmd1aSIsCisgICAgICAgICJsaWJoaWRsYmFzZSIsCisgICAgICAgICJsaWJoaWRsdHJhbnNwb3J0IiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9idWZmZXJwb29sQDEuMCIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9idWZmZXJxdWV1ZV9oZWxwZXIiLAorICAgICAgICAibGlidWkiLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJpbmNsdWRlIiwKKyAgICBdLAorCisgICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWworICAgICAgICAibGliY29kZWMyX2hpZGxAMS4wIiwKKyAgICAgICAgImxpYmNvZGVjMiIsCisgICAgXSwKKworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC9jbGllbnQvY2xpZW50LmNwcCBiL21lZGlhL2NvZGVjMi9oaWRsL2NsaWVudC9jbGllbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkZWI0ZmYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC9jbGllbnQvY2xpZW50LmNwcApAQCAtMCwwICsxLDEzODggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNvZGVjMkNsaWVudCIKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC9jbGllbnQuaD4KKworI2luY2x1ZGUgPGRlcXVlPgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxidWZmZXJwb29sL0NsaWVudE1hbmFnZXIuaD4KKyNpbmNsdWRlIDxjdXRpbHMvbmF0aXZlX2hhbmRsZS5oPgorI2luY2x1ZGUgPGd1aS9idWZmZXJxdWV1ZS8xLjAvSDJCR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+CisjaW5jbHVkZSA8aGlkbC9IaWRsU3VwcG9ydC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2JxaGVscGVyL1dHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KKyN1bmRlZiBMT0cKKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYnVmZmVycG9vbC8xLjAvSUNsaWVudE1hbmFnZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2MyLzEuMC9JQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9jMi8xLjAvSUNvbXBvbmVudEludGVyZmFjZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYzIvMS4wL0lDb21wb25lbnRMaXN0ZW5lci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYzIvMS4wL0lDb21wb25lbnRTdG9yZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYzIvMS4wL0lDb25maWd1cmFibGUuaD4KKworI2luY2x1ZGUgPEMyRGVidWcuaD4KKyNpbmNsdWRlIDxDMkJ1ZmZlclByaXYuaD4KKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpWb2lkOwordXNpbmcgOjphbmRyb2lkOjpUV0dyYXBoaWNCdWZmZXJQcm9kdWNlcjsKKwordXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpjMjo6VjFfMDsKK3VzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YzI6OlYxXzA6OnV0aWxzOwordXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMV8wOwordXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMV8wOjppbXBsZW1lbnRhdGlvbjsKKworbmFtZXNwYWNlIC8qIHVubmFtZWQgKi8geworCisvLyBjMl9zdGF0dXNfdCB2YWx1ZSB0aGF0IGNvcnJlc3BvbmRzIHRvIGh3YmluZGVyIHRyYW5zYWN0aW9uIGZhaWx1cmUuCitjb25zdGV4cHIgYzJfc3RhdHVzX3QgQzJfVFJBTlNBQ1RJT05fRkFJTEVEID0gQzJfQ09SUlVQVEVEOworCisvLyBMaXN0IG9mIGtub3duIElDb21wb25lbnRTdG9yZSBzZXJ2aWNlcyBpbiB0aGUgZGVjcmVhc2luZyBvcmRlciBvZiBwcmVmZXJlbmNlLgorY29uc3RleHByIGNvbnN0IGNoYXIqIGtDbGllbnROYW1lc1tdID0geworICAgICAgICAiZGVmYXVsdCIsCisgICAgICAgICJzb2Z0d2FyZSIsCisgICAgfTsKKworLy8gTnVtYmVyIG9mIGtub3duIElDb21wb25lbnRTdG9yZSBzZXJ2aWNlcy4KK2NvbnN0ZXhwciBzaXplX3Qga051bUNsaWVudHMgPSBzdGQ6OmV4dGVudDxkZWNsdHlwZShrQ2xpZW50TmFtZXMpPjo6dmFsdWU7CisKK3R5cGVkZWYgc3RkOjphcnJheTxzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50Piwga051bUNsaWVudHM+IENsaWVudExpc3Q7CisKKy8vIENvbnZlbmllbmNlIG1ldGhvZHMgdG8gb2J0YWluIGtub3duIGNsaWVudHMuCitzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50PiBnZXRDbGllbnQoc2l6ZV90IGluZGV4KSB7CisgICAgcmV0dXJuIENvZGVjMkNsaWVudDo6Q3JlYXRlRnJvbVNlcnZpY2Uoa0NsaWVudE5hbWVzW2luZGV4XSk7Cit9CisKK0NsaWVudExpc3QgZ2V0Q2xpZW50TGlzdCgpIHsKKyAgICBDbGllbnRMaXN0IGxpc3Q7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsgKytpKSB7CisgICAgICAgIGxpc3RbaV0gPSBnZXRDbGllbnQoaSk7CisgICAgfQorICAgIHJldHVybiBsaXN0OworfQorCit9IC8vIHVubmFtZWQKKworLy8gQ29kZWMyQ29uZmlndXJhYmxlQ2xpZW50CisKK2NvbnN0IEMyU3RyaW5nJiBDb2RlYzJDb25maWd1cmFibGVDbGllbnQ6OmdldE5hbWUoKSBjb25zdCB7CisgICAgcmV0dXJuIG1OYW1lOworfQorCitDb2RlYzJDb25maWd1cmFibGVDbGllbnQ6OkJhc2UqIENvZGVjMkNvbmZpZ3VyYWJsZUNsaWVudDo6YmFzZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8QmFzZSo+KG1CYXNlLmdldCgpKTsKK30KKworQ29kZWMyQ29uZmlndXJhYmxlQ2xpZW50OjpDb2RlYzJDb25maWd1cmFibGVDbGllbnQoCisgICAgICAgIGNvbnN0IHNwPENvZGVjMkNvbmZpZ3VyYWJsZUNsaWVudDo6QmFzZT4mIGJhc2UpIDogbUJhc2UoYmFzZSkgeworICAgIFJldHVybjx2b2lkPiB0cmFuc1N0YXR1cyA9IGJhc2UtPmdldE5hbWUoCisgICAgICAgICAgICBbdGhpc10oY29uc3QgaGlkbF9zdHJpbmcmIG5hbWUpIHsKKyAgICAgICAgICAgICAgICBtTmFtZSA9IG5hbWUuY19zdHIoKTsKKyAgICAgICAgICAgIH0pOworICAgIGlmICghdHJhbnNTdGF0dXMuaXNPaygpKSB7CisgICAgICAgIEFMT0dFKCJDYW5ub3Qgb2J0YWluIG5hbWUgZnJvbSBJQ29uZmlndXJhYmxlLiIpOworICAgIH0KK30KKworYzJfc3RhdHVzX3QgQ29kZWMyQ29uZmlndXJhYmxlQ2xpZW50OjpxdWVyeSgKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+ICZzdGFja1BhcmFtcywKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+ICZoZWFwUGFyYW1JbmRpY2VzLAorICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrLAorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+KiBjb25zdCBoZWFwUGFyYW1zKSBjb25zdCB7CisgICAgaGlkbF92ZWM8UGFyYW1JbmRleD4gaW5kaWNlcygKKyAgICAgICAgICAgIHN0YWNrUGFyYW1zLnNpemUoKSArIGhlYXBQYXJhbUluZGljZXMuc2l6ZSgpKTsKKyAgICBzaXplX3QgbnVtSW5kaWNlcyA9IDA7CisgICAgZm9yIChDMlBhcmFtKiBjb25zdCYgc3RhY2tQYXJhbSA6IHN0YWNrUGFyYW1zKSB7CisgICAgICAgIGlmICghc3RhY2tQYXJhbSkgeworICAgICAgICAgICAgQUxPR1coInF1ZXJ5IC0tIG51bGwgc3RhY2sgcGFyYW0gZW5jb3VudGVyZWQuIik7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpbmRpY2VzW251bUluZGljZXMrK10gPSBzdGF0aWNfY2FzdDxQYXJhbUluZGV4PihzdGFja1BhcmFtLT5pbmRleCgpKTsKKyAgICB9CisgICAgc2l6ZV90IG51bVN0YWNrSW5kaWNlcyA9IG51bUluZGljZXM7CisgICAgZm9yIChjb25zdCBDMlBhcmFtOjpJbmRleCYgaW5kZXggOiBoZWFwUGFyYW1JbmRpY2VzKSB7CisgICAgICAgIGluZGljZXNbbnVtSW5kaWNlcysrXSA9CisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1JbmRleD4oc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGluZGV4KSk7CisgICAgfQorICAgIGluZGljZXMucmVzaXplKG51bUluZGljZXMpOworICAgIGlmIChoZWFwUGFyYW1zKSB7CisgICAgICAgIGhlYXBQYXJhbXMtPnJlc2VydmUoaGVhcFBhcmFtcy0+c2l6ZSgpICsgbnVtSW5kaWNlcyk7CisgICAgfQorICAgIGMyX3N0YXR1c190IHN0YXR1czsKKyAgICBSZXR1cm48dm9pZD4gdHJhbnNTdGF0dXMgPSBiYXNlKCktPnF1ZXJ5KAorICAgICAgICAgICAgaW5kaWNlcywKKyAgICAgICAgICAgIG1heUJsb2NrID09IEMyX01BWV9CTE9DSywKKyAgICAgICAgICAgIFsmc3RhdHVzLCAmbnVtU3RhY2tJbmRpY2VzLCAmc3RhY2tQYXJhbXMsIGhlYXBQYXJhbXNdKAorICAgICAgICAgICAgICAgICAgICBTdGF0dXMgcywgY29uc3QgUGFyYW1zJiBwKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gc3RhdGljX2Nhc3Q8YzJfc3RhdHVzX3Q+KHMpOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gQzJfT0sgJiYgc3RhdHVzICE9IEMyX0JBRF9JTkRFWCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgicXVlcnkgLS0gY2FsbCBmYWlsZWQuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3IgY29kZSA9ICVkIiwgc3RhdGljX2Nhc3Q8aW50PihzdGF0dXMpKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gcGFyYW1Qb2ludGVyczsKKyAgICAgICAgICAgICAgICBjMl9zdGF0dXNfdCBwYXJzZVN0YXR1cyA9IHBhcnNlUGFyYW1zQmxvYigmcGFyYW1Qb2ludGVycywgcCk7CisgICAgICAgICAgICAgICAgaWYgKHBhcnNlU3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJxdWVyeSAtLSBlcnJvciB3aGlsZSBwYXJzaW5nIHBhcmFtcy4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciBjb2RlID0gJWQiLCBzdGF0aWNfY2FzdDxpbnQ+KHN0YXR1cykpOworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBwYXJzZVN0YXR1czsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzaXplX3QgaSA9IDA7CisgICAgICAgICAgICAgICAgZm9yIChhdXRvIGl0ID0gcGFyYW1Qb2ludGVycy5iZWdpbigpOyBpdCAhPSBwYXJhbVBvaW50ZXJzLmVuZCgpOyApIHsKKyAgICAgICAgICAgICAgICAgICAgQzJQYXJhbSogcGFyYW1Qb2ludGVyID0gKml0OworICAgICAgICAgICAgICAgICAgICBpZiAobnVtU3RhY2tJbmRpY2VzID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLS1udW1TdGFja0luZGljZXM7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcmFtUG9pbnRlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJxdWVyeSAtLSBudWxsIHN0YWNrIHBhcmFtLiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICsraXQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKDsgaSA8IHN0YWNrUGFyYW1zLnNpemUoKSAmJiAhc3RhY2tQYXJhbXNbaV07ICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICsraTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpID49IHN0YWNrUGFyYW1zLnNpemUoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJxdWVyeSAtLSB1bmV4cGVjdGVkIGVycm9yLiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhY2tQYXJhbXNbaV0tPmluZGV4KCkgIT0gcGFyYW1Qb2ludGVyLT5pbmRleCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coInF1ZXJ5IC0tIHBhcmFtIHNraXBwZWQuIGluZGV4ID0gJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihzdGFja1BhcmFtc1tpXS0+aW5kZXgoKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrUGFyYW1zW2krK10tPmludmFsaWRhdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3RhY2tQYXJhbXNbaSsrXS0+dXBkYXRlRnJvbSgqcGFyYW1Qb2ludGVyKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJxdWVyeSAtLSBwYXJhbSB1cGRhdGUgZmFpbGVkLiBpbmRleCA9ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4ocGFyYW1Qb2ludGVyLT5pbmRleCgpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcmFtUG9pbnRlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJxdWVyeSAtLSBudWxsIGhlYXAgcGFyYW0uIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytpdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaGVhcFBhcmFtcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJxdWVyeSAtLSB1bmV4cGVjdGVkIGV4dHJhIHN0YWNrIHBhcmFtLiIpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFwUGFyYW1zLT5lbXBsYWNlX2JhY2soQzJQYXJhbTo6Q29weSgqcGFyYW1Qb2ludGVyKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgKytpdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICBBTE9HRSgicXVlcnkgLS0gdHJhbnNhY3Rpb24gZmFpbGVkLiIpOworICAgICAgICByZXR1cm4gQzJfVFJBTlNBQ1RJT05fRkFJTEVEOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitjMl9zdGF0dXNfdCBDb2RlYzJDb25maWd1cmFibGVDbGllbnQ6OmNvbmZpZygKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+ICZwYXJhbXMsCisgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2ssCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiogY29uc3QgZmFpbHVyZXMpIHsKKyAgICBQYXJhbXMgaGlkbFBhcmFtczsKKyAgICBTdGF0dXMgaGlkbFN0YXR1cyA9IGNyZWF0ZVBhcmFtc0Jsb2IoJmhpZGxQYXJhbXMsIHBhcmFtcyk7CisgICAgaWYgKGhpZGxTdGF0dXMgIT0gU3RhdHVzOjpPSykgeworICAgICAgICBBTE9HRSgiY29uZmlnIC0tIGJhZCBpbnB1dC4iKTsKKyAgICAgICAgcmV0dXJuIEMyX1RSQU5TQUNUSU9OX0ZBSUxFRDsKKyAgICB9CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzOworICAgIFJldHVybjx2b2lkPiB0cmFuc1N0YXR1cyA9IGJhc2UoKS0+Y29uZmlnKAorICAgICAgICAgICAgaGlkbFBhcmFtcywKKyAgICAgICAgICAgIG1heUJsb2NrID09IEMyX01BWV9CTE9DSywKKyAgICAgICAgICAgIFsmc3RhdHVzLCAmcGFyYW1zLCBmYWlsdXJlc10oCisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyBzLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzxTZXR0aW5nUmVzdWx0PiBmLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBQYXJhbXMmIG8pIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBzdGF0aWNfY2FzdDxjMl9zdGF0dXNfdD4ocyk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICBBTE9HRCgiY29uZmlnIC0tIGNhbGwgZmFpbGVkLiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yIGNvZGUgPSAlZCIsIHN0YXRpY19jYXN0PGludD4oc3RhdHVzKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNpemVfdCBpID0gZmFpbHVyZXMtPnNpemUoKTsKKyAgICAgICAgICAgICAgICBmYWlsdXJlcy0+cmVzaXplKGkgKyBmLnNpemUoKSk7CisgICAgICAgICAgICAgICAgZm9yIChjb25zdCBTZXR0aW5nUmVzdWx0JiBzZiA6IGYpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gb2JqY3B5KCYoKmZhaWx1cmVzKVtpKytdLCBzZik7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJjb25maWcgLS0gaW52YWxpZCByZXR1cm5lZCBTZXR0aW5nUmVzdWx0LiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciBjb2RlID0gJWQiLCBzdGF0aWNfY2FzdDxpbnQ+KHN0YXR1cykpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN0YXR1cyA9IHVwZGF0ZVBhcmFtc0Zyb21CbG9iKHBhcmFtcywgbyk7CisgICAgICAgICAgICB9KTsKKyAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICBBTE9HRSgiY29uZmlnIC0tIHRyYW5zYWN0aW9uIGZhaWxlZC4iKTsKKyAgICAgICAgcmV0dXJuIEMyX1RSQU5TQUNUSU9OX0ZBSUxFRDsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworYzJfc3RhdHVzX3QgQ29kZWMyQ29uZmlndXJhYmxlQ2xpZW50OjpxdWVyeVN1cHBvcnRlZFBhcmFtcygKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4qIGNvbnN0IHBhcmFtcykgY29uc3QgeworICAgIC8vIFRPRE86IENhY2hlIGFuZCBxdWVyeSBwcm9wZXJseSEKKyAgICBjMl9zdGF0dXNfdCBzdGF0dXM7CisgICAgUmV0dXJuPHZvaWQ+IHRyYW5zU3RhdHVzID0gYmFzZSgpLT5xdWVyeVN1cHBvcnRlZFBhcmFtcygKKyAgICAgICAgICAgIHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDMyX3Q+OjptaW4oKSwKKyAgICAgICAgICAgIHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDMyX3Q+OjptYXgoKSwKKyAgICAgICAgICAgIFsmc3RhdHVzLCBwYXJhbXNdKAorICAgICAgICAgICAgICAgICAgICBTdGF0dXMgcywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlkbF92ZWM8UGFyYW1EZXNjcmlwdG9yPiYgcCkgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHN0YXRpY19jYXN0PGMyX3N0YXR1c190PihzKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJxdWVyeVN1cHBvcnRlZFBhcmFtcyAtLSBjYWxsIGZhaWxlZC4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciBjb2RlID0gJWQiLCBzdGF0aWNfY2FzdDxpbnQ+KHN0YXR1cykpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNpemVfdCBpID0gcGFyYW1zLT5zaXplKCk7CisgICAgICAgICAgICAgICAgcGFyYW1zLT5yZXNpemUoaSArIHAuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFBhcmFtRGVzY3JpcHRvciYgc3AgOiBwKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IG9iamNweSgmKCpwYXJhbXMpW2krK10sIHNwKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoInF1ZXJ5U3VwcG9ydGVkUGFyYW1zIC0tICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludmFsaWQgcmV0dXJuZWQgUGFyYW1EZXNjcmlwdG9yLiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciBjb2RlID0gJWQiLCBzdGF0aWNfY2FzdDxpbnQ+KHN0YXR1cykpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgaWYgKCF0cmFuc1N0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgQUxPR0UoInF1ZXJ5U3VwcG9ydGVkUGFyYW1zIC0tIHRyYW5zYWN0aW9uIGZhaWxlZC4iKTsKKyAgICAgICAgcmV0dXJuIEMyX1RSQU5TQUNUSU9OX0ZBSUxFRDsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworYzJfc3RhdHVzX3QgQ29kZWMyQ29uZmlndXJhYmxlQ2xpZW50OjpxdWVyeVN1cHBvcnRlZFZhbHVlcygKKyAgICAgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5PiYgZmllbGRzLAorICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrKSBjb25zdCB7CisgICAgaGlkbF92ZWM8RmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeT4gaW5GaWVsZHMoZmllbGRzLnNpemUoKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBmaWVsZHMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgU3RhdHVzIGhpZGxTdGF0dXMgPSBvYmpjcHkoJmluRmllbGRzW2ldLCBmaWVsZHNbaV0pOworICAgICAgICBpZiAoaGlkbFN0YXR1cyAhPSBTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICBBTE9HRSgicXVlcnlTdXBwb3J0ZWRWYWx1ZXMgLS0gYmFkIGlucHV0Iik7CisgICAgICAgICAgICByZXR1cm4gQzJfVFJBTlNBQ1RJT05fRkFJTEVEOworICAgICAgICB9CisgICAgfQorCisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzOworICAgIFJldHVybjx2b2lkPiB0cmFuc1N0YXR1cyA9IGJhc2UoKS0+cXVlcnlTdXBwb3J0ZWRWYWx1ZXMoCisgICAgICAgICAgICBpbkZpZWxkcywKKyAgICAgICAgICAgIG1heUJsb2NrID09IEMyX01BWV9CTE9DSywKKyAgICAgICAgICAgIFsmc3RhdHVzLCAmaW5GaWVsZHMsICZmaWVsZHNdKAorICAgICAgICAgICAgICAgICAgICBTdGF0dXMgcywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlkbF92ZWM8RmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeVJlc3VsdD4mIHIpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBzdGF0aWNfY2FzdDxjMl9zdGF0dXNfdD4ocyk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgicXVlcnlTdXBwb3J0ZWRWYWx1ZXMgLS0gY2FsbCBmYWlsZWQuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3IgY29kZSA9ICVkIiwgc3RhdGljX2Nhc3Q8aW50PihzdGF0dXMpKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoci5zaXplKCkgIT0gZmllbGRzLnNpemUoKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgicXVlcnlTdXBwb3J0ZWRWYWx1ZXMgLS0gaW5wdXQgYW5kIG91dHB1dCBsaXN0cyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImhhdmUgZGlmZmVyZW50IHNpemVzLiIpOworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBmaWVsZHMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gb2JqY3B5KCZmaWVsZHNbaV0sIGluRmllbGRzW2ldLCByW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoInF1ZXJ5U3VwcG9ydGVkVmFsdWVzIC0tIGludmFsaWQgcmV0dXJuZWQgdmFsdWUuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yIGNvZGUgPSAlZCIsIHN0YXRpY19jYXN0PGludD4oc3RhdHVzKSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICBBTE9HRSgicXVlcnlTdXBwb3J0ZWRWYWx1ZXMgLS0gdHJhbnNhY3Rpb24gZmFpbGVkLiIpOworICAgICAgICByZXR1cm4gQzJfVFJBTlNBQ1RJT05fRkFJTEVEOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCisvLyBDb2RlYzJDbGllbnQ6OkNvbXBvbmVudDo6SGlkbExpc3RlbmVyCitzdHJ1Y3QgQ29kZWMyQ2xpZW50OjpDb21wb25lbnQ6OkhpZGxMaXN0ZW5lciA6IHB1YmxpYyBJQ29tcG9uZW50TGlzdGVuZXIgeworICAgIHN0ZDo6d2Vha19wdHI8Q29tcG9uZW50PiBjb21wb25lbnQ7CisgICAgc3RkOjp3ZWFrX3B0cjxMaXN0ZW5lcj4gYmFzZTsKKworICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IG9uV29ya0RvbmUoY29uc3QgV29ya0J1bmRsZSYgd29ya0J1bmRsZSkgb3ZlcnJpZGUgeworICAgICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IHdvcmtJdGVtczsKKyAgICAgICAgYzJfc3RhdHVzX3Qgc3RhdHVzID0gb2JqY3B5KCZ3b3JrSXRlbXMsIHdvcmtCdW5kbGUpOworICAgICAgICBpZiAoc3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgICAgICBBTE9HSSgib25Xb3JrRG9uZSAtLSByZWNlaXZlZCBjb3JydXB0ZWQgV29ya0J1bmRsZS4gIgorICAgICAgICAgICAgICAgICAgICAic3RhdHVzID0gJWQuIiwgc3RhdGljX2Nhc3Q8aW50PihzdGF0dXMpKTsKKyAgICAgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgICAgIH0KKyAgICAgICAgLy8gcmVsZWFzZSBpbnB1dCBidWZmZXJzIHBvdGVudGlhbGx5IGhlbGQgYnkgdGhlIGNvbXBvbmVudCBmcm9tIHF1ZXVlCisgICAgICAgIHNpemVfdCBudW1EaXNjYXJkZWRJbnB1dEJ1ZmZlcnMgPSAwOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+IHN0cm9uZ0NvbXBvbmVudCA9IGNvbXBvbmVudC5sb2NrKCk7CisgICAgICAgIGlmIChzdHJvbmdDb21wb25lbnQpIHsKKyAgICAgICAgICAgIG51bURpc2NhcmRlZElucHV0QnVmZmVycyA9IHN0cm9uZ0NvbXBvbmVudC0+aGFuZGxlT25Xb3JrRG9uZSh3b3JrSXRlbXMpOworICAgICAgICB9CisgICAgICAgIGlmIChzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpMaXN0ZW5lcj4gbGlzdGVuZXIgPSBiYXNlLmxvY2soKSkgeworICAgICAgICAgICAgbGlzdGVuZXItPm9uV29ya0RvbmUoY29tcG9uZW50LCB3b3JrSXRlbXMsIG51bURpc2NhcmRlZElucHV0QnVmZmVycyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HRCgib25Xb3JrRG9uZSAtLSBsaXN0ZW5lciBkaWVkLiIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfQorCisgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gb25UcmlwcGVkKAorICAgICAgICAgICAgY29uc3QgaGlkbF92ZWM8U2V0dGluZ1Jlc3VsdD4mIHNldHRpbmdSZXN1bHRzKSBvdmVycmlkZSB7CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBjMlNldHRpbmdSZXN1bHRzKAorICAgICAgICAgICAgICAgIHNldHRpbmdSZXN1bHRzLnNpemUoKSk7CisgICAgICAgIGMyX3N0YXR1c190IHN0YXR1czsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzZXR0aW5nUmVzdWx0cy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4gYzJTZXR0aW5nUmVzdWx0OworICAgICAgICAgICAgc3RhdHVzID0gb2JqY3B5KCZjMlNldHRpbmdSZXN1bHQsIHNldHRpbmdSZXN1bHRzW2ldKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HSSgib25UcmlwcGVkIC0tIHJlY2VpdmVkIGNvcnJ1cHRlZCBTZXR0aW5nUmVzdWx0LiAiCisgICAgICAgICAgICAgICAgICAgICAgICAic3RhdHVzID0gJWQuIiwgc3RhdGljX2Nhc3Q8aW50PihzdGF0dXMpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVm9pZCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYzJTZXR0aW5nUmVzdWx0c1tpXSA9IHN0ZDo6bW92ZShjMlNldHRpbmdSZXN1bHQpOworICAgICAgICB9CisgICAgICAgIGlmIChzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpMaXN0ZW5lcj4gbGlzdGVuZXIgPSBiYXNlLmxvY2soKSkgeworICAgICAgICAgICAgbGlzdGVuZXItPm9uVHJpcHBlZChjb21wb25lbnQsIGMyU2V0dGluZ1Jlc3VsdHMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0QoIm9uVHJpcHBlZCAtLSBsaXN0ZW5lciBkaWVkLiIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfQorCisgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gb25FcnJvcihTdGF0dXMgcywgdWludDMyX3QgZXJyb3JDb2RlKSBvdmVycmlkZSB7CisgICAgICAgIEFMT0dEKCJvbkVycm9yIC0tIHN0YXR1cyA9ICVkLCBlcnJvckNvZGUgPSAldS4iLAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4ocyksCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KGVycm9yQ29kZSkpOworICAgICAgICBpZiAoc3RkOjpzaGFyZWRfcHRyPExpc3RlbmVyPiBsaXN0ZW5lciA9IGJhc2UubG9jaygpKSB7CisgICAgICAgICAgICBsaXN0ZW5lci0+b25FcnJvcihjb21wb25lbnQsIHMgPT0gU3RhdHVzOjpPSyA/CisgICAgICAgICAgICAgICAgICAgIGVycm9yQ29kZSA6IHN0YXRpY19jYXN0PGMyX3N0YXR1c190PihzKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HRCgib25FcnJvciAtLSBsaXN0ZW5lciBkaWVkLiIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfQorCisgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gb25GcmFtZXNSZW5kZXJlZCgKKyAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPFJlbmRlcmVkRnJhbWU+JiByZW5kZXJlZEZyYW1lcykgb3ZlcnJpZGUgeworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8TGlzdGVuZXI+IGxpc3RlbmVyID0gYmFzZS5sb2NrKCk7CisgICAgICAgIHN0ZDo6dmVjdG9yPENvZGVjMkNsaWVudDo6TGlzdGVuZXI6OlJlbmRlcmVkRnJhbWU+IHJmczsKKyAgICAgICAgcmZzLnJlc2VydmUocmVuZGVyZWRGcmFtZXMuc2l6ZSgpKTsKKyAgICAgICAgZm9yIChjb25zdCBSZW5kZXJlZEZyYW1lJiByZiA6IHJlbmRlcmVkRnJhbWVzKSB7CisgICAgICAgICAgICBpZiAocmYuc2xvdElkID49IDApIHsKKyAgICAgICAgICAgICAgICBpZiAobGlzdGVuZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgcmZzLmVtcGxhY2VfYmFjayhyZi5idWZmZXJRdWV1ZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJmLnNsb3RJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZi50aW1lc3RhbXBOcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+IHN0cm9uZ0NvbXBvbmVudCA9CisgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQubG9jaygpOworICAgICAgICAgICAgICAgIGlmIChzdHJvbmdDb21wb25lbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgZnJhbWVJbmRleCA9IHJmLmJ1ZmZlclF1ZXVlSWQ7CisgICAgICAgICAgICAgICAgICAgIHNpemVfdCBidWZmZXJJbmRleCA9IHN0YXRpY19jYXN0PHNpemVfdD4ofnJmLnNsb3RJZCk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJSZWNlaXZlZCBkZWF0aCBub3RpZmljYXRpb24gb2YgaW5wdXQgYnVmZmVyOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJmcmFtZUluZGV4ID0gJWxsdSwgYnVmZmVySW5kZXggPSAlenUuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8bG9uZyBsb25nIHVuc2lnbmVkPihmcmFtZUluZGV4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVySW5kZXgpOworICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGJ1ZmZlciA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb25nQ29tcG9uZW50LT5mcmVlSW5wdXRCdWZmZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lSW5kZXgsIGJ1ZmZlckluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJ1ZmZlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXItPm9uSW5wdXRCdWZmZXJEb25lKGJ1ZmZlcik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFyZnMuZW1wdHkoKSkgeworICAgICAgICAgICAgaWYgKGxpc3RlbmVyKSB7CisgICAgICAgICAgICAgICAgbGlzdGVuZXItPm9uRnJhbWVzUmVuZGVyZWQocmZzKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR0QoIm9uRnJhbWVzUmVuZGVyZWQgLS0gbGlzdGVuZXIgZGllZC4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gVm9pZCgpOworICAgIH0KK307CisKKy8vIENvZGVjMkNsaWVudAorQ29kZWMyQ2xpZW50OjpCYXNlKiBDb2RlYzJDbGllbnQ6OmJhc2UoKSBjb25zdCB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PEJhc2UqPihtQmFzZS5nZXQoKSk7Cit9CisKK0NvZGVjMkNsaWVudDo6Q29kZWMyQ2xpZW50KGNvbnN0IHNwPENvZGVjMkNsaWVudDo6QmFzZT4mIGJhc2UsIHN0ZDo6c3RyaW5nIGluc3RhbmNlTmFtZSkgOgorICAgIENvZGVjMkNvbmZpZ3VyYWJsZUNsaWVudChiYXNlKSwgbUxpc3RlZChmYWxzZSksIG1JbnN0YW5jZU5hbWUoaW5zdGFuY2VOYW1lKSB7CisgICAgUmV0dXJuPHNwPElDbGllbnRNYW5hZ2VyPj4gdHJhbnNSZXN1bHQgPSBiYXNlLT5nZXRQb29sQ2xpZW50TWFuYWdlcigpOworICAgIGlmICghdHJhbnNSZXN1bHQuaXNPaygpKSB7CisgICAgICAgIEFMT0dFKCJnZXRQb29sQ2xpZW50TWFuYWdlciAtLSBmYWlsZWQgdHJhbnNhY3Rpb24uIik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUhvc3RQb29sTWFuYWdlciA9IHN0YXRpY19jYXN0PHNwPElDbGllbnRNYW5hZ2VyPj4odHJhbnNSZXN1bHQpOworICAgIH0KK30KKworYzJfc3RhdHVzX3QgQ29kZWMyQ2xpZW50OjpjcmVhdGVDb21wb25lbnQoCisgICAgICAgIGNvbnN0IEMyU3RyaW5nJiBuYW1lLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpMaXN0ZW5lcj4mIGxpc3RlbmVyLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+KiBjb25zdCBjb21wb25lbnQpIHsKKworICAgIC8vIFRPRE86IEFkZCBzdXBwb3J0IGZvciBCdWZmZXJwb29sCisKKworICAgIGMyX3N0YXR1c190IHN0YXR1czsKKyAgICBzcDxDb21wb25lbnQ6OkhpZGxMaXN0ZW5lcj4gaGlkbExpc3RlbmVyID0gbmV3IENvbXBvbmVudDo6SGlkbExpc3RlbmVyKCk7CisgICAgaGlkbExpc3RlbmVyLT5iYXNlID0gbGlzdGVuZXI7CisgICAgUmV0dXJuPHZvaWQ+IHRyYW5zU3RhdHVzID0gYmFzZSgpLT5jcmVhdGVDb21wb25lbnQoCisgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgaGlkbExpc3RlbmVyLAorICAgICAgICAgICAgQ2xpZW50TWFuYWdlcjo6Z2V0SW5zdGFuY2UoKSwKKyAgICAgICAgICAgIFsmc3RhdHVzLCBjb21wb25lbnQsIGhpZGxMaXN0ZW5lcl0oCisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyBzLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJQ29tcG9uZW50PiYgYykgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHN0YXRpY19jYXN0PGMyX3N0YXR1c190PihzKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgKmNvbXBvbmVudCA9IHN0ZDo6bWFrZV9zaGFyZWQ8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+KGMpOworICAgICAgICAgICAgICAgIGhpZGxMaXN0ZW5lci0+Y29tcG9uZW50ID0gKmNvbXBvbmVudDsKKyAgICAgICAgICAgIH0pOworICAgIGlmICghdHJhbnNTdGF0dXMuaXNPaygpKSB7CisgICAgICAgIEFMT0dFKCJjcmVhdGVDb21wb25lbnQgLS0gZmFpbGVkIHRyYW5zYWN0aW9uLiIpOworICAgICAgICByZXR1cm4gQzJfVFJBTlNBQ1RJT05fRkFJTEVEOworICAgIH0KKworICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICBpZiAoISpjb21wb25lbnQpIHsKKyAgICAgICAgQUxPR0UoImNyZWF0ZUNvbXBvbmVudCAtLSBudWxsIGNvbXBvbmVudC4iKTsKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisKKyAgICBzdGF0dXMgPSAoKmNvbXBvbmVudCktPnNldERlYXRoTGlzdGVuZXIoKmNvbXBvbmVudCwgbGlzdGVuZXIpOworICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0UoImNyZWF0ZUNvbXBvbmVudCAtLSBzZXREZWF0aExpc3RlbmVyIHJldHVybmVkIGVycm9yOiAlZC4iLAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4oc3RhdHVzKSk7CisgICAgfQorCisgICAgKCpjb21wb25lbnQpLT5tQnVmZmVyUG9vbFNlbmRlci5zZXRSZWNlaXZlcihtSG9zdFBvb2xNYW5hZ2VyKTsKKyAgICByZXR1cm4gc3RhdHVzOworfQorCitjMl9zdGF0dXNfdCBDb2RlYzJDbGllbnQ6OmNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgY29uc3QgQzJTdHJpbmcmIG5hbWUsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkludGVyZmFjZT4qIGNvbnN0IGludGVyZmFjZSkgeworICAgIGMyX3N0YXR1c190IHN0YXR1czsKKyAgICBSZXR1cm48dm9pZD4gdHJhbnNTdGF0dXMgPSBiYXNlKCktPmNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICBbJnN0YXR1cywgaW50ZXJmYWNlXSgKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzIHMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElDb21wb25lbnRJbnRlcmZhY2U+JiBpKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gc3RhdGljX2Nhc3Q8YzJfc3RhdHVzX3Q+KHMpOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoImNyZWF0ZUludGVyZmFjZSAtLSBjYWxsIGZhaWxlZC4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciBjb2RlID0gJWQiLCBzdGF0aWNfY2FzdDxpbnQ+KHN0YXR1cykpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICppbnRlcmZhY2UgPSBzdGQ6Om1ha2Vfc2hhcmVkPENvZGVjMkNsaWVudDo6SW50ZXJmYWNlPihpKTsKKyAgICAgICAgICAgIH0pOworICAgIGlmICghdHJhbnNTdGF0dXMuaXNPaygpKSB7CisgICAgICAgIEFMT0dFKCJjcmVhdGVJbnRlcmZhY2UgLS0gZmFpbGVkIHRyYW5zYWN0aW9uLiIpOworICAgICAgICByZXR1cm4gQzJfVFJBTlNBQ1RJT05fRkFJTEVEOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitjMl9zdGF0dXNfdCBDb2RlYzJDbGllbnQ6OmNyZWF0ZUlucHV0U3VyZmFjZSgKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6SW5wdXRTdXJmYWNlPiogY29uc3QgaW5wdXRTdXJmYWNlKSB7CisgICAgUmV0dXJuPHNwPElJbnB1dFN1cmZhY2U+PiB0cmFuc1Jlc3VsdCA9IGJhc2UoKS0+Y3JlYXRlSW5wdXRTdXJmYWNlKCk7CisgICAgaWYgKCF0cmFuc1Jlc3VsdC5pc09rKCkpIHsKKyAgICAgICAgQUxPR0UoImNyZWF0ZUlucHV0U3VyZmFjZSAtLSBmYWlsZWQgdHJhbnNhY3Rpb24uIik7CisgICAgICAgIHJldHVybiBDMl9UUkFOU0FDVElPTl9GQUlMRUQ7CisgICAgfQorICAgIHNwPElJbnB1dFN1cmZhY2U+IHJlc3VsdCA9IHN0YXRpY19jYXN0PHNwPElJbnB1dFN1cmZhY2U+Pih0cmFuc1Jlc3VsdCk7CisgICAgaWYgKCFyZXN1bHQpIHsKKyAgICAgICAgKmlucHV0U3VyZmFjZSA9IG51bGxwdHI7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisgICAgKmlucHV0U3VyZmFjZSA9IHN0ZDo6bWFrZV9zaGFyZWQ8SW5wdXRTdXJmYWNlPihyZXN1bHQpOworICAgIGlmICghKmlucHV0U3VyZmFjZSkgeworICAgICAgICBBTE9HRSgiY3JlYXRlSW5wdXRTdXJmYWNlIC0tIHVua25vd24gZXJyb3IuIik7CisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorICAgIHJldHVybiBDMl9PSzsKK30KKworY29uc3Qgc3RkOjp2ZWN0b3I8QzJDb21wb25lbnQ6OlRyYWl0cz4mIENvZGVjMkNsaWVudDo6bGlzdENvbXBvbmVudHMoKSBjb25zdCB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICBpZiAobUxpc3RlZCkgeworICAgICAgICByZXR1cm4gbVRyYWl0c0xpc3Q7CisgICAgfQorICAgIFJldHVybjx2b2lkPiB0cmFuc1N0YXR1cyA9IGJhc2UoKS0+bGlzdENvbXBvbmVudHMoCisgICAgICAgICAgICBbdGhpc10oY29uc3QgaGlkbF92ZWM8SUNvbXBvbmVudFN0b3JlOjpDb21wb25lbnRUcmFpdHM+JiB0KSB7CisgICAgICAgICAgICAgICAgbVRyYWl0c0xpc3QucmVzaXplKHQuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICBtQWxpYXNlc0J1ZmZlci5yZXNpemUodC5zaXplKCkpOworICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdC5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgICAgICAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPSBvYmpjcHkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1UcmFpdHNMaXN0W2ldLCAmbUFsaWFzZXNCdWZmZXJbaV0sIHRbaV0pOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgibGlzdENvbXBvbmVudHMgLS0gY29ycnVwdGVkIG91dHB1dC4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIGlmICghdHJhbnNTdGF0dXMuaXNPaygpKSB7CisgICAgICAgIEFMT0dFKCJsaXN0Q29tcG9uZW50cyAtLSBmYWlsZWQgdHJhbnNhY3Rpb24uIik7CisgICAgfQorICAgIG1MaXN0ZWQgPSB0cnVlOworICAgIHJldHVybiBtVHJhaXRzTGlzdDsKK30KKworYzJfc3RhdHVzX3QgQ29kZWMyQ2xpZW50Ojpjb3B5QnVmZmVyKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+JiBzcmMsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4mIGRzdCkgeworICAgIC8vIFRPRE86IEltcGxlbWVudD8KKyAgICAodm9pZClzcmM7CisgICAgKHZvaWQpZHN0OworICAgIEFMT0dFKCJjb3B5QnVmZmVyIG5vdCBpbXBsZW1lbnRlZCIpOworICAgIHJldHVybiBDMl9PTUlUVEVEOworfQorCitzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4KKyAgICAgICAgQ29kZWMyQ2xpZW50OjpnZXRQYXJhbVJlZmxlY3RvcigpIHsKKyAgICAvLyBUT0RPOiB0aGlzIGlzIG5vdCBtZWFudCB0byBiZSBleHBvc2VkIGFzIEMyUGFyYW1SZWZsZWN0b3Igb24gdGhlIGNsaWVudCBzaWRlOyBpbnN0ZWFkLCBpdAorICAgIC8vIHNob3VsZCByZWZsZWN0IHRoZSBIQUwgQVBJLgorICAgIHN0cnVjdCBTaW1wbGVQYXJhbVJlZmxlY3RvciA6IHB1YmxpYyBDMlBhcmFtUmVmbGVjdG9yIHsKKyAgICAgICAgdmlydHVhbCBzdGQ6OnVuaXF1ZV9wdHI8QzJTdHJ1Y3REZXNjcmlwdG9yPiBkZXNjcmliZShDMlBhcmFtOjpDb3JlSW5kZXggY29yZUluZGV4KSBjb25zdCB7CisgICAgICAgICAgICBoaWRsX3ZlYzxQYXJhbUluZGV4PiBpbmRpY2VzKDEpOworICAgICAgICAgICAgaW5kaWNlc1swXSA9IHN0YXRpY19jYXN0PFBhcmFtSW5kZXg+KGNvcmVJbmRleC5jb3JlSW5kZXgoKSk7CisgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJTdHJ1Y3REZXNjcmlwdG9yPiBkZXNjcmlwdG9yOworICAgICAgICAgICAgUmV0dXJuPHZvaWQ+IHRyYW5zU3RhdHVzID0gbUJhc2UtPmdldFN0cnVjdERlc2NyaXB0b3JzKAorICAgICAgICAgICAgICAgICAgICBpbmRpY2VzLAorICAgICAgICAgICAgICAgICAgICBbJmRlc2NyaXB0b3JdKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXR1cyBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPFN0cnVjdERlc2NyaXB0b3I+JiBzZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYzJfc3RhdHVzX3Qgc3RhdHVzID0gc3RhdGljX2Nhc3Q8YzJfc3RhdHVzX3Q+KHMpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJnZXRTdHJ1Y3REZXNjcmlwdG9ycyAtLSBjYWxsIGZhaWxlZC4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yIGNvZGUgPSAlZCIsIHN0YXRpY19jYXN0PGludD4oc3RhdHVzKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvci5yZXNldCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZC5zaXplKCkgIT0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJnZXRTdHJ1Y3REZXNjcmlwdG9ycyAtLSByZXR1cm5lZCB2ZWN0b3Igb2Ygc2l6ZSAlenUuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNkLnNpemUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvci5yZXNldCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IG9iamNweSgmZGVzY3JpcHRvciwgc2RbMF0pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJnZXRTdHJ1Y3REZXNjcmlwdG9ycyAtLSBmYWlsZWQgdG8gY29udmVydC4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yIGNvZGUgPSAlZCIsIHN0YXRpY19jYXN0PGludD4oc3RhdHVzKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvci5yZXNldCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICByZXR1cm4gZGVzY3JpcHRvcjsKKyAgICAgICAgfQorCisgICAgICAgIFNpbXBsZVBhcmFtUmVmbGVjdG9yKHNwPEJhc2U+IGJhc2UpCisgICAgICAgICAgICA6IG1CYXNlKGJhc2UpIHsgfQorCisgICAgICAgIHNwPEJhc2U+IG1CYXNlOworICAgIH07CisKKyAgICByZXR1cm4gc3RkOjptYWtlX3NoYXJlZDxTaW1wbGVQYXJhbVJlZmxlY3Rvcj4oYmFzZSgpKTsKK307CisKK3N0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ+IENvZGVjMkNsaWVudDo6Q3JlYXRlRnJvbVNlcnZpY2UoCisgICAgICAgIGNvbnN0IGNoYXIqIGluc3RhbmNlTmFtZSwgYm9vbCB3YWl0Rm9yU2VydmljZSkgeworICAgIGlmICghaW5zdGFuY2VOYW1lKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBzcDxCYXNlPiBiYXNlU3RvcmUgPSB3YWl0Rm9yU2VydmljZSA/CisgICAgICAgICAgICBCYXNlOjpnZXRTZXJ2aWNlKGluc3RhbmNlTmFtZSkgOgorICAgICAgICAgICAgQmFzZTo6dHJ5R2V0U2VydmljZShpbnN0YW5jZU5hbWUpOworICAgIGlmICghYmFzZVN0b3JlKSB7CisgICAgICAgIGlmICh3YWl0Rm9yU2VydmljZSkgeworICAgICAgICAgICAgQUxPR0UoIkNvZGVjMi4wIHNlcnZpY2UgaW5hY2Nlc3NpYmxlLiBDaGVjayB0aGUgZGV2aWNlIG1hbmlmZXN0LiIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR1coIkNvZGVjMi4wIHNlcnZpY2Ugbm90IGF2YWlsYWJsZSByaWdodCBub3cuIFRyeSBhZ2FpbiBsYXRlci4iKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgcmV0dXJuIHN0ZDo6bWFrZV9zaGFyZWQ8Q29kZWMyQ2xpZW50PihiYXNlU3RvcmUsIGluc3RhbmNlTmFtZSk7Cit9CisKK2MyX3N0YXR1c190IENvZGVjMkNsaWVudDo6Rm9yQWxsU3RvcmVzKAorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAma2V5LAorICAgICAgICBzdGQ6OmZ1bmN0aW9uPGMyX3N0YXR1c190KGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ+Jik+IHByZWRpY2F0ZSkgeworICAgIGMyX3N0YXR1c190IHN0YXR1cyA9IEMyX05PX0lOSVQ7ICAvLyBubyBJQ29tcG9uZW50U3RvcmVzIHByZXNlbnQKKworICAgIC8vIENhY2hlIHRoZSBtYXBwaW5nIGtleSAtPiBpbmRleCBvZiBDb2RlYzJDbGllbnQgaW4gZ2V0Q2xpZW50KCkuCisgICAgc3RhdGljIHN0ZDo6bXV0ZXgga2V5MkluZGV4TXV0ZXg7CisgICAgc3RhdGljIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzaXplX3Q+IGtleTJJbmRleDsKKworICAgIC8vIEJ5IGRlZmF1bHQgdHJ5IGFsbCBzdG9yZXMuIEhvd2V2ZXIsIHRyeSB0aGUgbGFzdCBrbm93biBjbGllbnQgZmlyc3QuIElmIHRoZSBsYXN0IGtub3duCisgICAgLy8gY2xpZW50IGZhaWxzLCByZXRyeSBvbmNlLiBXZSBkbyB0aGlzIGJ5IHB1c2hpbmcgdGhlIGxhc3Qga25vd24gY2xpZW50IGluIGZyb250IG9mIHRoZQorICAgIC8vIGxpc3Qgb2YgYWxsIGNsaWVudHMuCisgICAgc3RkOjpkZXF1ZTxzaXplX3Q+IGluZGljZXM7CisgICAgZm9yIChzaXplX3QgaW5kZXggPSBrTnVtQ2xpZW50czsgaW5kZXggPiAwOyApIHsKKyAgICAgICAgaW5kaWNlcy5wdXNoX2Zyb250KC0taW5kZXgpOworICAgIH0KKworICAgIGJvb2wgd2FzTWFwcGVkID0gZmFsc2U7CisgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKGtleTJJbmRleE11dGV4KTsKKyAgICBhdXRvIGl0ID0ga2V5MkluZGV4LmZpbmQoa2V5KTsKKyAgICBpZiAoaXQgIT0ga2V5MkluZGV4LmVuZCgpKSB7CisgICAgICAgIGluZGljZXMucHVzaF9mcm9udChpdC0+c2Vjb25kKTsKKyAgICAgICAgd2FzTWFwcGVkID0gdHJ1ZTsKKyAgICB9CisgICAgbG9jay51bmxvY2soKTsKKworICAgIGZvciAoc2l6ZV90IGluZGV4IDogaW5kaWNlcykgeworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50PiBjbGllbnQgPSBnZXRDbGllbnQoaW5kZXgpOworICAgICAgICBpZiAoY2xpZW50KSB7CisgICAgICAgICAgICBzdGF0dXMgPSBwcmVkaWNhdGUoY2xpZW50KTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICBsb2NrLmxvY2soKTsKKyAgICAgICAgICAgICAgICBrZXkySW5kZXhba2V5XSA9IGluZGV4OyAvLyB1cGRhdGUgbGFzdCBrbm93biBjbGllbnQgaW5kZXgKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICh3YXNNYXBwZWQpIHsKKyAgICAgICAgICAgIEFMT0dJKCJDb3VsZCBub3QgZmluZCAnJXMnIGluIGxhc3QgaW5zdGFuY2UuIFJldHJ5aW5nLi4uIiwga2V5LmNfc3RyKCkpOworICAgICAgICAgICAgd2FzTWFwcGVkID0gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsgIC8vIHJldHVybiB0aGUgbGFzdCBzdGF0dXMgZnJvbSBhIHZhbGlkIGNsaWVudAorfQorCitzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+CisgICAgICAgIENvZGVjMkNsaWVudDo6Q3JlYXRlQ29tcG9uZW50QnlOYW1lKAorICAgICAgICBjb25zdCBjaGFyKiBjb21wb25lbnROYW1lLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8TGlzdGVuZXI+JiBsaXN0ZW5lciwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudD4qIG93bmVyKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPENvbXBvbmVudD4gY29tcG9uZW50OworICAgIGMyX3N0YXR1c190IHN0YXR1cyA9IEZvckFsbFN0b3JlcygKKyAgICAgICAgICAgIGNvbXBvbmVudE5hbWUsCisgICAgICAgICAgICBbb3duZXIsICZjb21wb25lbnQsIGNvbXBvbmVudE5hbWUsICZsaXN0ZW5lcl0oCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ+ICZjbGllbnQpIC0+IGMyX3N0YXR1c190IHsKKyAgICAgICAgICAgICAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPSBjbGllbnQtPmNyZWF0ZUNvbXBvbmVudChjb21wb25lbnROYW1lLCBsaXN0ZW5lciwgJmNvbXBvbmVudCk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICBpZiAob3duZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICpvd25lciA9IGNsaWVudDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9IEMyX05PVF9GT1VORCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRCgiSUNvbXBvbmVudFN0b3JlKCVzKTo6Y3JlYXRlQ29tcG9uZW50KCclcycpIHJldHVybmVkICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQtPmdldEluc3RhbmNlTmFtZSgpLmNfc3RyKCksIGNvbXBvbmVudE5hbWUsIGFzU3RyaW5nKHN0YXR1cykpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgfSk7CisgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICBBTE9HSSgiQ291bGQgbm90IGNyZWF0ZSBjb21wb25lbnQgJyVzJyAoJXMpIiwgY29tcG9uZW50TmFtZSwgYXNTdHJpbmcoc3RhdHVzKSk7CisgICAgfQorICAgIHJldHVybiBjb21wb25lbnQ7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkludGVyZmFjZT4KKyAgICAgICAgQ29kZWMyQ2xpZW50OjpDcmVhdGVJbnRlcmZhY2VCeU5hbWUoCisgICAgICAgIGNvbnN0IGNoYXIqIGludGVyZmFjZU5hbWUsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ+KiBvd25lcikgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnRlcmZhY2U+IGludGVyZmFjZTsKKyAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPSBGb3JBbGxTdG9yZXMoCisgICAgICAgICAgICBpbnRlcmZhY2VOYW1lLAorICAgICAgICAgICAgW293bmVyLCAmaW50ZXJmYWNlLCBpbnRlcmZhY2VOYW1lXSgKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudD4gJmNsaWVudCkgLT4gYzJfc3RhdHVzX3QgeworICAgICAgICAgICAgICAgIGMyX3N0YXR1c190IHN0YXR1cyA9IGNsaWVudC0+Y3JlYXRlSW50ZXJmYWNlKGludGVyZmFjZU5hbWUsICZpbnRlcmZhY2UpOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG93bmVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAqb3duZXIgPSBjbGllbnQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPSBDMl9OT1RfRk9VTkQpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0QoIklDb21wb25lbnRTdG9yZSglcyk6OmNyZWF0ZUludGVyZmFjZSgnJXMnKSByZXR1cm5lZCAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50LT5nZXRJbnN0YW5jZU5hbWUoKS5jX3N0cigpLCBpbnRlcmZhY2VOYW1lLCBhc1N0cmluZyhzdGF0dXMpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgIH0pOworICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0koIkNvdWxkIG5vdCBjcmVhdGUgaW50ZXJmYWNlICclcycgKCVzKSIsIGludGVyZmFjZU5hbWUsIGFzU3RyaW5nKHN0YXR1cykpOworICAgIH0KKyAgICByZXR1cm4gaW50ZXJmYWNlOworfQorCitzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpJbnB1dFN1cmZhY2U+IENvZGVjMkNsaWVudDo6Q3JlYXRlSW5wdXRTdXJmYWNlKCkgeworICAgIHVpbnQzMl90IHNlcnZpY2VNYXNrID0gOjphbmRyb2lkOjpiYXNlOjpHZXRVaW50UHJvcGVydHkoCisgICAgICAgICAgICAiZGVidWcuc3RhZ2VmcmlnaHQuYzJpbnB1dHN1cmZhY2UiLCB1aW50MzJfdCgwKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrTnVtQ2xpZW50czsgKytpKSB7CisgICAgICAgIGlmICgoMSA8PCBpKSAmIHNlcnZpY2VNYXNrKSB7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50PiBjbGllbnQgPSBnZXRDbGllbnQoaSk7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpJbnB1dFN1cmZhY2U+IGlucHV0U3VyZmFjZTsKKyAgICAgICAgICAgIGlmIChjbGllbnQgJiYKKyAgICAgICAgICAgICAgICAgICAgY2xpZW50LT5jcmVhdGVJbnB1dFN1cmZhY2UoJmlucHV0U3VyZmFjZSkgPT0gQzJfT0sgJiYKKyAgICAgICAgICAgICAgICAgICAgaW5wdXRTdXJmYWNlKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGlucHV0U3VyZmFjZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBBTE9HVygiQ291bGQgbm90IGNyZWF0ZSBhbiBpbnB1dCBzdXJmYWNlIGZyb20gYW55IENvZGVjMi4wIHNlcnZpY2VzLiIpOworICAgIHJldHVybiBudWxscHRyOworfQorCitjb25zdCBzdGQ6OnZlY3RvcjxDMkNvbXBvbmVudDo6VHJhaXRzPiYgQ29kZWMyQ2xpZW50OjpMaXN0Q29tcG9uZW50cygpIHsKKyAgICBzdGF0aWMgc3RkOjp2ZWN0b3I8QzJDb21wb25lbnQ6OlRyYWl0cz4gdHJhaXRzTGlzdCA9IFtdKCl7CisgICAgICAgIHN0ZDo6dmVjdG9yPEMyQ29tcG9uZW50OjpUcmFpdHM+IGxpc3Q7CisgICAgICAgIHNpemVfdCBsaXN0U2l6ZSA9IDA7CisgICAgICAgIENsaWVudExpc3QgY2xpZW50TGlzdCA9IGdldENsaWVudExpc3QoKTsKKyAgICAgICAgZm9yIChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50PiYgY2xpZW50IDogY2xpZW50TGlzdCkgeworICAgICAgICAgICAgaWYgKCFjbGllbnQpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxpc3RTaXplICs9IGNsaWVudC0+bGlzdENvbXBvbmVudHMoKS5zaXplKCk7CisgICAgICAgIH0KKyAgICAgICAgbGlzdC5yZXNlcnZlKGxpc3RTaXplKTsKKyAgICAgICAgZm9yIChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50PiYgY2xpZW50IDogY2xpZW50TGlzdCkgeworICAgICAgICAgICAgaWYgKCFjbGllbnQpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxpc3QuaW5zZXJ0KAorICAgICAgICAgICAgICAgICAgICBsaXN0LmVuZCgpLAorICAgICAgICAgICAgICAgICAgICBjbGllbnQtPmxpc3RDb21wb25lbnRzKCkuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgY2xpZW50LT5saXN0Q29tcG9uZW50cygpLmVuZCgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbGlzdDsKKyAgICB9KCk7CisKKyAgICByZXR1cm4gdHJhaXRzTGlzdDsKK30KKworLy8gQ29kZWMyQ2xpZW50OjpMaXN0ZW5lcgorCitDb2RlYzJDbGllbnQ6Okxpc3RlbmVyOjp+TGlzdGVuZXIoKSB7Cit9CisKKy8vIENvZGVjMkNsaWVudDo6Q29tcG9uZW50CisKK0NvZGVjMkNsaWVudDo6Q29tcG9uZW50OjpCYXNlKiBDb2RlYzJDbGllbnQ6OkNvbXBvbmVudDo6YmFzZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8QmFzZSo+KG1CYXNlLmdldCgpKTsKK30KKworQ29kZWMyQ2xpZW50OjpDb21wb25lbnQ6OkNvbXBvbmVudChjb25zdCBzcDxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudDo6QmFzZT4mIGJhc2UpIDoKKyAgICBDb2RlYzJDbGllbnQ6OkNvbmZpZ3VyYWJsZShiYXNlKSwKKyAgICBtQnVmZmVyUG9vbFNlbmRlcihudWxscHRyKSB7Cit9CisKK0NvZGVjMkNsaWVudDo6Q29tcG9uZW50Ojp+Q29tcG9uZW50KCkgeworfQorCitjMl9zdGF0dXNfdCBDb2RlYzJDbGllbnQ6OkNvbXBvbmVudDo6Y3JlYXRlQmxvY2tQb29sKAorICAgICAgICBDMkFsbG9jYXRvcjo6aWRfdCBpZCwKKyAgICAgICAgQzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3QqIGJsb2NrUG9vbElkLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb25maWd1cmFibGU+KiBjb25maWd1cmFibGUpIHsKKyAgICBjMl9zdGF0dXNfdCBzdGF0dXM7CisgICAgUmV0dXJuPHZvaWQ+IHRyYW5zU3RhdHVzID0gYmFzZSgpLT5jcmVhdGVCbG9ja1Bvb2woCisgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4oaWQpLAorICAgICAgICAgICAgWyZzdGF0dXMsIGJsb2NrUG9vbElkLCBjb25maWd1cmFibGVdKAorICAgICAgICAgICAgICAgICAgICBTdGF0dXMgcywKKyAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgcElkLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJQ29uZmlndXJhYmxlPiYgYykgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHN0YXRpY19jYXN0PGMyX3N0YXR1c190PihzKTsKKyAgICAgICAgICAgICAgICBjb25maWd1cmFibGUtPnJlc2V0KCk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiY3JlYXRlQmxvY2tQb29sIC0tIGNhbGwgZmFpbGVkLiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yIGNvZGUgPSAlZCIsIHN0YXRpY19jYXN0PGludD4oc3RhdHVzKSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgKmJsb2NrUG9vbElkID0gc3RhdGljX2Nhc3Q8QzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3Q+KHBJZCk7CisgICAgICAgICAgICAgICAgKmNvbmZpZ3VyYWJsZSA9IHN0ZDo6bWFrZV9zaGFyZWQ8Q29kZWMyQ2xpZW50OjpDb25maWd1cmFibGU+KGMpOworICAgICAgICAgICAgfSk7CisgICAgaWYgKCF0cmFuc1N0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgQUxPR0UoImNyZWF0ZUJsb2NrUG9vbCAtLSB0cmFuc2FjdGlvbiBmYWlsZWQuIik7CisgICAgICAgIHJldHVybiBDMl9UUkFOU0FDVElPTl9GQUlMRUQ7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK2MyX3N0YXR1c190IENvZGVjMkNsaWVudDo6Q29tcG9uZW50OjpkZXN0cm95QmxvY2tQb29sKAorICAgICAgICBDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCBsb2NhbElkKSB7CisgICAgUmV0dXJuPFN0YXR1cz4gdHJhbnNSZXN1bHQgPSBiYXNlKCktPmRlc3Ryb3lCbG9ja1Bvb2woCisgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50NjRfdD4obG9jYWxJZCkpOworICAgIGlmICghdHJhbnNSZXN1bHQuaXNPaygpKSB7CisgICAgICAgIEFMT0dFKCJkZXN0cm95QmxvY2tQb29sIC0tIHRyYW5zYWN0aW9uIGZhaWxlZC4iKTsKKyAgICAgICAgcmV0dXJuIEMyX1RSQU5TQUNUSU9OX0ZBSUxFRDsKKyAgICB9CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGMyX3N0YXR1c190PihzdGF0aWNfY2FzdDxTdGF0dXM+KHRyYW5zUmVzdWx0KSk7Cit9CisKK3NpemVfdCBDb2RlYzJDbGllbnQ6OkNvbXBvbmVudDo6aGFuZGxlT25Xb3JrRG9uZSgKKyAgICAgICAgY29uc3Qgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiAmd29ya0l0ZW1zKSB7CisgICAgLy8gSW5wdXQgYnVmZmVycycgbGlmZXRpbWUgbWFuYWdlbWVudAorICAgIHN0ZDo6dmVjdG9yPHVpbnQ2NF90PiBpbnB1dERvbmU7CisgICAgZm9yIChjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yayA6IHdvcmtJdGVtcykgeworICAgICAgICBpZiAod29yaykgeworICAgICAgICAgICAgaWYgKHdvcmstPndvcmtsZXRzLmVtcHR5KCkKKyAgICAgICAgICAgICAgICAgICAgfHwgIXdvcmstPndvcmtsZXRzLmJhY2soKQorICAgICAgICAgICAgICAgICAgICB8fCAod29yay0+d29ya2xldHMuYmFjaygpLT5vdXRwdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19JTkNPTVBMRVRFKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgLy8gaW5wdXQgaXMgY29tcGxldGUKKyAgICAgICAgICAgICAgICBpbnB1dERvbmUuZW1wbGFjZV9iYWNrKHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHNpemVfdCBudW1EaXNjYXJkZWRJbnB1dEJ1ZmZlcnMgPSAwOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUlucHV0QnVmZmVyc011dGV4KTsKKyAgICAgICAgZm9yICh1aW50NjRfdCBpbnB1dEluZGV4IDogaW5wdXREb25lKSB7CisgICAgICAgICAgICBhdXRvIGl0ID0gbUlucHV0QnVmZmVycy5maW5kKGlucHV0SW5kZXgpOworICAgICAgICAgICAgaWYgKGl0ID09IG1JbnB1dEJ1ZmZlcnMuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigib25Xb3JrRG9uZSAtLSByZXR1cm5lZCBjb25zdW1lZC91bmtub3duICIKKyAgICAgICAgICAgICAgICAgICAgICAiaW5wdXQgZnJhbWU6IGluZGV4ICVsbHUiLAorICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZylpbnB1dEluZGV4KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIm9uV29ya0RvbmUgLS0gcHJvY2Vzc2VkIGlucHV0IGZyYW1lOiAiCisgICAgICAgICAgICAgICAgICAgICAgImluZGV4ICVsbHUgKGNvbnRhaW5pbmcgJXp1IGJ1ZmZlcnMpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpaW5wdXRJbmRleCwgaXQtPnNlY29uZC5zaXplKCkpOworICAgICAgICAgICAgICAgIG1JbnB1dEJ1ZmZlcnMuZXJhc2UoaXQpOworICAgICAgICAgICAgICAgIG1JbnB1dEJ1ZmZlckNvdW50LmVyYXNlKGlucHV0SW5kZXgpOworICAgICAgICAgICAgICAgICsrbnVtRGlzY2FyZGVkSW5wdXRCdWZmZXJzOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gT3V0cHV0IGJ1ZmZlcnF1ZXVlLWJhc2VkIGJsb2NrcycgbGlmZXRpbWUgbWFuYWdlbWVudAorICAgIG1PdXRwdXRCdWZmZXJRdWV1ZU11dGV4LmxvY2soKTsKKyAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBpZ2JwID0gbU91dHB1dElnYnA7CisgICAgdWludDY0X3QgYnFJZCA9IG1PdXRwdXRCcUlkOworICAgIHVpbnQzMl90IGdlbmVyYXRpb24gPSBtT3V0cHV0R2VuZXJhdGlvbjsKKyAgICBtT3V0cHV0QnVmZmVyUXVldWVNdXRleC51bmxvY2soKTsKKworICAgIGlmIChpZ2JwKSB7CisgICAgICAgIGhvbGRCdWZmZXJRdWV1ZUJsb2Nrcyh3b3JrSXRlbXMsIGlnYnAsIGJxSWQsIGdlbmVyYXRpb24pOworICAgIH0KKyAgICByZXR1cm4gbnVtRGlzY2FyZGVkSW5wdXRCdWZmZXJzOworfQorCitzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IENvZGVjMkNsaWVudDo6Q29tcG9uZW50OjpmcmVlSW5wdXRCdWZmZXIoCisgICAgICAgIHVpbnQ2NF90IGZyYW1lSW5kZXgsCisgICAgICAgIHNpemVfdCBidWZmZXJJbmRleCkgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYnVmZmVyOworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1JbnB1dEJ1ZmZlcnNNdXRleCk7CisgICAgYXV0byBpdCA9IG1JbnB1dEJ1ZmZlcnMuZmluZChmcmFtZUluZGV4KTsKKyAgICBpZiAoaXQgPT0gbUlucHV0QnVmZmVycy5lbmQoKSkgeworICAgICAgICBBTE9HSSgiZnJlZUlucHV0QnVmZmVyIC0tIFVucmVjb2duaXplZCBpbnB1dCBmcmFtZSBpbmRleCAlbGx1LiIsCisgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGxvbmcgbG9uZyB1bnNpZ25lZD4oZnJhbWVJbmRleCkpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgaWYgKGJ1ZmZlckluZGV4ID49IGl0LT5zZWNvbmQuc2l6ZSgpKSB7CisgICAgICAgIEFMT0dJKCJmcmVlSW5wdXRCdWZmZXIgLS0gSW5wdXQgYnVmZmVyIG5vLiAlenUgaXMgaW52YWxpZCBpbiAiCisgICAgICAgICAgICAgICJpbnB1dCBmcmFtZSBpbmRleCAlbGx1LiIsCisgICAgICAgICAgICAgIGJ1ZmZlckluZGV4LCBzdGF0aWNfY2FzdDxsb25nIGxvbmcgdW5zaWduZWQ+KGZyYW1lSW5kZXgpKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGJ1ZmZlciA9IGl0LT5zZWNvbmRbYnVmZmVySW5kZXhdOworICAgIGlmICghYnVmZmVyKSB7CisgICAgICAgIEFMT0dJKCJmcmVlSW5wdXRCdWZmZXIgLS0gSW5wdXQgYnVmZmVyIG5vLiAlenUgaW4gIgorICAgICAgICAgICAgICAiaW5wdXQgZnJhbWUgaW5kZXggJWxsdSBoYXMgYWxyZWFkeSBiZWVuIGZyZWVkLiIsCisgICAgICAgICAgICAgIGJ1ZmZlckluZGV4LCBzdGF0aWNfY2FzdDxsb25nIGxvbmcgdW5zaWduZWQ+KGZyYW1lSW5kZXgpKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGl0LT5zZWNvbmRbYnVmZmVySW5kZXhdID0gbnVsbHB0cjsKKyAgICBpZiAoLS1tSW5wdXRCdWZmZXJDb3VudFtmcmFtZUluZGV4XSA9PSAwKSB7CisgICAgICAgIG1JbnB1dEJ1ZmZlcnMuZXJhc2UoaXQpOworICAgICAgICBtSW5wdXRCdWZmZXJDb3VudC5lcmFzZShmcmFtZUluZGV4KTsKKyAgICB9CisgICAgcmV0dXJuIGJ1ZmZlcjsKK30KKworYzJfc3RhdHVzX3QgQ29kZWMyQ2xpZW50OjpDb21wb25lbnQ6OnF1ZXVlKAorICAgICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+KiBjb25zdCBpdGVtcykgeworICAgIC8vIHJlbWVtYmVyIGlucHV0IGJ1ZmZlcnMgcXVldWVkIHRvIGhvbGQgcmVmZXJlbmNlIHRvIHRoZW0KKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1JbnB1dEJ1ZmZlcnNNdXRleCk7CisgICAgICAgIGZvciAoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmsgOiAqaXRlbXMpIHsKKyAgICAgICAgICAgIGlmICghd29yaykgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHdvcmstPmlucHV0LmJ1ZmZlcnMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdWludDY0X3QgaW5wdXRJbmRleCA9IHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpOworICAgICAgICAgICAgYXV0byByZXMgPSBtSW5wdXRCdWZmZXJzLmVtcGxhY2UoaW5wdXRJbmRleCwgd29yay0+aW5wdXQuYnVmZmVycyk7CisgICAgICAgICAgICBpZiAoIXJlcy5zZWNvbmQpIHsKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBhcHBlbmQ/IC0gZm9yIG5vdyB3ZSBhcmUgcmVwbGFjaW5nCisgICAgICAgICAgICAgICAgcmVzLmZpcnN0LT5zZWNvbmQgPSB3b3JrLT5pbnB1dC5idWZmZXJzOworICAgICAgICAgICAgICAgIEFMT0dJKCJxdWV1ZSAtLSBkdXBsaWNhdGUgaW5wdXQgZnJhbWU6IGluZGV4ICVsbHUuICIKKyAgICAgICAgICAgICAgICAgICAgICAiRGlzY2FyZGluZyB0aGUgb2xkIGlucHV0IGZyYW1lLi4uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpaW5wdXRJbmRleCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtSW5wdXRCdWZmZXJDb3VudFtpbnB1dEluZGV4XSA9IHdvcmstPmlucHV0LmJ1ZmZlcnMuc2l6ZSgpOworICAgICAgICAgICAgQUxPR1YoInF1ZXVlIC0tIHF1ZXVlaW5nIGlucHV0IGZyYW1lOiAiCisgICAgICAgICAgICAgICAgICAiaW5kZXggJWxsdSAoY29udGFpbmluZyAlenUgYnVmZmVycykiLAorICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKWlucHV0SW5kZXgsIHdvcmstPmlucHV0LmJ1ZmZlcnMuc2l6ZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIFdvcmtCdW5kbGUgd29ya0J1bmRsZTsKKyAgICBTdGF0dXMgaGlkbFN0YXR1cyA9IG9iamNweSgmd29ya0J1bmRsZSwgKml0ZW1zLCAmbUJ1ZmZlclBvb2xTZW5kZXIpOworICAgIGlmIChoaWRsU3RhdHVzICE9IFN0YXR1czo6T0spIHsKKyAgICAgICAgQUxPR0UoInF1ZXVlIC0tIGJhZCBpbnB1dC4iKTsKKyAgICAgICAgcmV0dXJuIEMyX1RSQU5TQUNUSU9OX0ZBSUxFRDsKKyAgICB9CisgICAgUmV0dXJuPFN0YXR1cz4gdHJhbnNTdGF0dXMgPSBiYXNlKCktPnF1ZXVlKHdvcmtCdW5kbGUpOworICAgIGlmICghdHJhbnNTdGF0dXMuaXNPaygpKSB7CisgICAgICAgIEFMT0dFKCJxdWV1ZSAtLSB0cmFuc2FjdGlvbiBmYWlsZWQuIik7CisgICAgICAgIHJldHVybiBDMl9UUkFOU0FDVElPTl9GQUlMRUQ7CisgICAgfQorICAgIGMyX3N0YXR1c190IHN0YXR1cyA9CisgICAgICAgICAgICBzdGF0aWNfY2FzdDxjMl9zdGF0dXNfdD4oc3RhdGljX2Nhc3Q8U3RhdHVzPih0cmFuc1N0YXR1cykpOworICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0UoInF1ZXVlIC0tIGNhbGwgZmFpbGVkLiAiCisgICAgICAgICAgICAgICAgIkVycm9yIGNvZGUgPSAlZCIsIHN0YXRpY19jYXN0PGludD4oc3RhdHVzKSk7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK2MyX3N0YXR1c190IENvZGVjMkNsaWVudDo6Q29tcG9uZW50OjpmbHVzaCgKKyAgICAgICAgQzJDb21wb25lbnQ6OmZsdXNoX21vZGVfdCBtb2RlLAorICAgICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+KiBjb25zdCBmbHVzaGVkV29yaykgeworICAgICh2b2lkKW1vZGU7IC8vIEZsdXNoIG1vZGUgaXNuJ3Qgc3VwcG9ydGVkIGluIEhJREwgeWV0LgorICAgIGMyX3N0YXR1c190IHN0YXR1czsKKyAgICBSZXR1cm48dm9pZD4gdHJhbnNTdGF0dXMgPSBiYXNlKCktPmZsdXNoKAorICAgICAgICAgICAgWyZzdGF0dXMsIGZsdXNoZWRXb3JrXSgKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzIHMsIGNvbnN0IFdvcmtCdW5kbGUmIHdiKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gc3RhdGljX2Nhc3Q8YzJfc3RhdHVzX3Q+KHMpOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoImZsdXNoIC0tIGNhbGwgZmFpbGVkLiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yIGNvZGUgPSAlZCIsIHN0YXRpY19jYXN0PGludD4oc3RhdHVzKSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3RhdHVzID0gb2JqY3B5KGZsdXNoZWRXb3JrLCB3Yik7CisgICAgICAgICAgICB9KTsKKyAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICBBTE9HRSgiZmx1c2ggLS0gdHJhbnNhY3Rpb24gZmFpbGVkLiIpOworICAgICAgICByZXR1cm4gQzJfVFJBTlNBQ1RJT05fRkFJTEVEOworICAgIH0KKworICAgIC8vIEluZGljZXMgb2YgZmx1c2hlZCB3b3JrIGl0ZW1zLgorICAgIHN0ZDo6dmVjdG9yPHVpbnQ2NF90PiBmbHVzaGVkSW5kaWNlczsKKyAgICBmb3IgKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrIDogKmZsdXNoZWRXb3JrKSB7CisgICAgICAgIGlmICh3b3JrKSB7CisgICAgICAgICAgICBpZiAod29yay0+d29ya2xldHMuZW1wdHkoKQorICAgICAgICAgICAgICAgICAgICB8fCAhd29yay0+d29ya2xldHMuYmFjaygpCisgICAgICAgICAgICAgICAgICAgIHx8ICh3b3JrLT53b3JrbGV0cy5iYWNrKCktPm91dHB1dC5mbGFncyAmCisgICAgICAgICAgICAgICAgICAgICAgICBDMkZyYW1lRGF0YTo6RkxBR19JTkNPTVBMRVRFKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgLy8gaW5wdXQgaXMgY29tcGxldGUKKyAgICAgICAgICAgICAgICBmbHVzaGVkSW5kaWNlcy5lbXBsYWNlX2JhY2soCisgICAgICAgICAgICAgICAgICAgICAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBJbnB1dCBidWZmZXJzJyBsaWZldGltZSBtYW5hZ2VtZW50CisgICAgZm9yICh1aW50NjRfdCBmbHVzaGVkSW5kZXggOiBmbHVzaGVkSW5kaWNlcykgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtSW5wdXRCdWZmZXJzTXV0ZXgpOworICAgICAgICBhdXRvIGl0ID0gbUlucHV0QnVmZmVycy5maW5kKGZsdXNoZWRJbmRleCk7CisgICAgICAgIGlmIChpdCA9PSBtSW5wdXRCdWZmZXJzLmVuZCgpKSB7CisgICAgICAgICAgICBBTE9HVigiZmx1c2ggLS0gcmV0dXJuZWQgY29uc3VtZWQvdW5rbm93biBpbnB1dCBmcmFtZTogIgorICAgICAgICAgICAgICAgICAgImluZGV4ICVsbHUiLAorICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKWZsdXNoZWRJbmRleCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HVigiZmx1c2ggLS0gcmV0dXJuZWQgdW5wcm9jZXNzZWQgaW5wdXQgZnJhbWU6ICIKKyAgICAgICAgICAgICAgICAgICJpbmRleCAlbGx1IChjb250YWluaW5nICV6dSBidWZmZXJzKSIsCisgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpZmx1c2hlZEluZGV4LCBtSW5wdXRCdWZmZXJDb3VudFtmbHVzaGVkSW5kZXhdKTsKKyAgICAgICAgICAgIG1JbnB1dEJ1ZmZlcnMuZXJhc2UoaXQpOworICAgICAgICAgICAgbUlucHV0QnVmZmVyQ291bnQuZXJhc2UoZmx1c2hlZEluZGV4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIE91dHB1dCBidWZmZXJxdWV1ZS1iYXNlZCBibG9ja3MnIGxpZmV0aW1lIG1hbmFnZW1lbnQKKyAgICBtT3V0cHV0QnVmZmVyUXVldWVNdXRleC5sb2NrKCk7CisgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gaWdicCA9IG1PdXRwdXRJZ2JwOworICAgIHVpbnQ2NF90IGJxSWQgPSBtT3V0cHV0QnFJZDsKKyAgICB1aW50MzJfdCBnZW5lcmF0aW9uID0gbU91dHB1dEdlbmVyYXRpb247CisgICAgbU91dHB1dEJ1ZmZlclF1ZXVlTXV0ZXgudW5sb2NrKCk7CisKKyAgICBpZiAoaWdicCkgeworICAgICAgICBob2xkQnVmZmVyUXVldWVCbG9ja3MoKmZsdXNoZWRXb3JrLCBpZ2JwLCBicUlkLCBnZW5lcmF0aW9uKTsKKyAgICB9CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCitjMl9zdGF0dXNfdCBDb2RlYzJDbGllbnQ6OkNvbXBvbmVudDo6ZHJhaW4oQzJDb21wb25lbnQ6OmRyYWluX21vZGVfdCBtb2RlKSB7CisgICAgUmV0dXJuPFN0YXR1cz4gdHJhbnNTdGF0dXMgPSBiYXNlKCktPmRyYWluKAorICAgICAgICAgICAgbW9kZSA9PSBDMkNvbXBvbmVudDo6RFJBSU5fQ09NUE9ORU5UX1dJVEhfRU9TKTsKKyAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICBBTE9HRSgiZHJhaW4gLS0gdHJhbnNhY3Rpb24gZmFpbGVkLiIpOworICAgICAgICByZXR1cm4gQzJfVFJBTlNBQ1RJT05fRkFJTEVEOworICAgIH0KKyAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPQorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YzJfc3RhdHVzX3Q+KHN0YXRpY19jYXN0PFN0YXR1cz4odHJhbnNTdGF0dXMpKTsKKyAgICBpZiAoc3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dFKCJkcmFpbiAtLSBjYWxsIGZhaWxlZC4gIgorICAgICAgICAgICAgICAgICJFcnJvciBjb2RlID0gJWQiLCBzdGF0aWNfY2FzdDxpbnQ+KHN0YXR1cykpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitjMl9zdGF0dXNfdCBDb2RlYzJDbGllbnQ6OkNvbXBvbmVudDo6c3RhcnQoKSB7CisgICAgUmV0dXJuPFN0YXR1cz4gdHJhbnNTdGF0dXMgPSBiYXNlKCktPnN0YXJ0KCk7CisgICAgaWYgKCF0cmFuc1N0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgQUxPR0UoInN0YXJ0IC0tIHRyYW5zYWN0aW9uIGZhaWxlZC4iKTsKKyAgICAgICAgcmV0dXJuIEMyX1RSQU5TQUNUSU9OX0ZBSUxFRDsKKyAgICB9CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzID0KKyAgICAgICAgICAgIHN0YXRpY19jYXN0PGMyX3N0YXR1c190PihzdGF0aWNfY2FzdDxTdGF0dXM+KHRyYW5zU3RhdHVzKSk7CisgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICBBTE9HRSgic3RhcnQgLS0gY2FsbCBmYWlsZWQuICIKKyAgICAgICAgICAgICAgICAiRXJyb3IgY29kZSA9ICVkIiwgc3RhdGljX2Nhc3Q8aW50PihzdGF0dXMpKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworYzJfc3RhdHVzX3QgQ29kZWMyQ2xpZW50OjpDb21wb25lbnQ6OnN0b3AoKSB7CisgICAgUmV0dXJuPFN0YXR1cz4gdHJhbnNTdGF0dXMgPSBiYXNlKCktPnN0b3AoKTsKKyAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICBBTE9HRSgic3RvcCAtLSB0cmFuc2FjdGlvbiBmYWlsZWQuIik7CisgICAgICAgIHJldHVybiBDMl9UUkFOU0FDVElPTl9GQUlMRUQ7CisgICAgfQorICAgIGMyX3N0YXR1c190IHN0YXR1cyA9CisgICAgICAgICAgICBzdGF0aWNfY2FzdDxjMl9zdGF0dXNfdD4oc3RhdGljX2Nhc3Q8U3RhdHVzPih0cmFuc1N0YXR1cykpOworICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0UoInN0b3AgLS0gY2FsbCBmYWlsZWQuICIKKyAgICAgICAgICAgICAgICAiRXJyb3IgY29kZSA9ICVkIiwgc3RhdGljX2Nhc3Q8aW50PihzdGF0dXMpKTsKKyAgICB9CisgICAgbUlucHV0QnVmZmVyc011dGV4LmxvY2soKTsKKyAgICBtSW5wdXRCdWZmZXJzLmNsZWFyKCk7CisgICAgbUlucHV0QnVmZmVyQ291bnQuY2xlYXIoKTsKKyAgICBtSW5wdXRCdWZmZXJzTXV0ZXgudW5sb2NrKCk7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworYzJfc3RhdHVzX3QgQ29kZWMyQ2xpZW50OjpDb21wb25lbnQ6OnJlc2V0KCkgeworICAgIFJldHVybjxTdGF0dXM+IHRyYW5zU3RhdHVzID0gYmFzZSgpLT5yZXNldCgpOworICAgIGlmICghdHJhbnNTdGF0dXMuaXNPaygpKSB7CisgICAgICAgIEFMT0dFKCJyZXNldCAtLSB0cmFuc2FjdGlvbiBmYWlsZWQuIik7CisgICAgICAgIHJldHVybiBDMl9UUkFOU0FDVElPTl9GQUlMRUQ7CisgICAgfQorICAgIGMyX3N0YXR1c190IHN0YXR1cyA9CisgICAgICAgICAgICBzdGF0aWNfY2FzdDxjMl9zdGF0dXNfdD4oc3RhdGljX2Nhc3Q8U3RhdHVzPih0cmFuc1N0YXR1cykpOworICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0UoInJlc2V0IC0tIGNhbGwgZmFpbGVkLiAiCisgICAgICAgICAgICAgICAgIkVycm9yIGNvZGUgPSAlZCIsIHN0YXRpY19jYXN0PGludD4oc3RhdHVzKSk7CisgICAgfQorICAgIG1JbnB1dEJ1ZmZlcnNNdXRleC5sb2NrKCk7CisgICAgbUlucHV0QnVmZmVycy5jbGVhcigpOworICAgIG1JbnB1dEJ1ZmZlckNvdW50LmNsZWFyKCk7CisgICAgbUlucHV0QnVmZmVyc011dGV4LnVubG9jaygpOworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK2MyX3N0YXR1c190IENvZGVjMkNsaWVudDo6Q29tcG9uZW50OjpyZWxlYXNlKCkgeworICAgIFJldHVybjxTdGF0dXM+IHRyYW5zU3RhdHVzID0gYmFzZSgpLT5yZWxlYXNlKCk7CisgICAgaWYgKCF0cmFuc1N0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgQUxPR0UoInJlbGVhc2UgLS0gdHJhbnNhY3Rpb24gZmFpbGVkLiIpOworICAgICAgICByZXR1cm4gQzJfVFJBTlNBQ1RJT05fRkFJTEVEOworICAgIH0KKyAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPQorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YzJfc3RhdHVzX3Q+KHN0YXRpY19jYXN0PFN0YXR1cz4odHJhbnNTdGF0dXMpKTsKKyAgICBpZiAoc3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dFKCJyZWxlYXNlIC0tIGNhbGwgZmFpbGVkLiAiCisgICAgICAgICAgICAgICAgIkVycm9yIGNvZGUgPSAlZCIsIHN0YXRpY19jYXN0PGludD4oc3RhdHVzKSk7CisgICAgfQorICAgIG1JbnB1dEJ1ZmZlcnNNdXRleC5sb2NrKCk7CisgICAgbUlucHV0QnVmZmVycy5jbGVhcigpOworICAgIG1JbnB1dEJ1ZmZlckNvdW50LmNsZWFyKCk7CisgICAgbUlucHV0QnVmZmVyc011dGV4LnVubG9jaygpOworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK2MyX3N0YXR1c190IENvZGVjMkNsaWVudDo6Q29tcG9uZW50OjpzZXRPdXRwdXRTdXJmYWNlKAorICAgICAgICBDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCBibG9ja1Bvb2xJZCwKKyAgICAgICAgY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIHN1cmZhY2UsCisgICAgICAgIHVpbnQzMl90IGdlbmVyYXRpb24pIHsKKyAgICBzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBpZ2JwID0gc3VyZmFjZS0+Z2V0SGFsSW50ZXJmYWNlKCk7CisgICAgaWYgKCFpZ2JwKSB7CisgICAgICAgIGlnYnAgPSBuZXcgVFdHcmFwaGljQnVmZmVyUHJvZHVjZXI8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4oc3VyZmFjZSk7CisgICAgfQorCisgICAgUmV0dXJuPFN0YXR1cz4gdHJhbnNTdGF0dXMgPSBiYXNlKCktPnNldE91dHB1dFN1cmZhY2UoCisgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50NjRfdD4oYmxvY2tQb29sSWQpLCBpZ2JwKTsKKyAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICBBTE9HRSgic2V0T3V0cHV0U3VyZmFjZSAtLSB0cmFuc2FjdGlvbiBmYWlsZWQuIik7CisgICAgICAgIHJldHVybiBDMl9UUkFOU0FDVElPTl9GQUlMRUQ7CisgICAgfQorICAgIGMyX3N0YXR1c190IHN0YXR1cyA9CisgICAgICAgICAgICBzdGF0aWNfY2FzdDxjMl9zdGF0dXNfdD4oc3RhdGljX2Nhc3Q8U3RhdHVzPih0cmFuc1N0YXR1cykpOworICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0UoInNldE91dHB1dFN1cmZhY2UgLS0gY2FsbCBmYWlsZWQuICIKKyAgICAgICAgICAgICAgICAiRXJyb3IgY29kZSA9ICVkIiwgc3RhdGljX2Nhc3Q8aW50PihzdGF0dXMpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtT3V0cHV0QnVmZmVyUXVldWVNdXRleCk7CisgICAgICAgIGlmIChtT3V0cHV0SWdicCAhPSBzdXJmYWNlKSB7CisgICAgICAgICAgICBtT3V0cHV0SWdicCA9IHN1cmZhY2U7CisgICAgICAgICAgICBpZiAoIXN1cmZhY2UpIHsKKyAgICAgICAgICAgICAgICBtT3V0cHV0QnFJZCA9IDA7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHN1cmZhY2UtPmdldFVuaXF1ZUlkKCZtT3V0cHV0QnFJZCkgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgic2V0T3V0cHV0U3VyZmFjZSAtLSBjYW5ub3Qgb2J0YWluIGJ1ZmZlcnF1ZXVlIGlkLiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1PdXRwdXRHZW5lcmF0aW9uID0gZ2VuZXJhdGlvbjsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgQ29kZWMyQ2xpZW50OjpDb21wb25lbnQ6OnF1ZXVlVG9PdXRwdXRTdXJmYWNlKAorICAgICAgICBjb25zdCBDMkNvbnN0R3JhcGhpY0Jsb2NrJiBibG9jaywKKyAgICAgICAgY29uc3QgUXVldWVCdWZmZXJJbnB1dCYgaW5wdXQsCisgICAgICAgIFF1ZXVlQnVmZmVyT3V0cHV0KiBvdXRwdXQpIHsKKyAgICB1aW50MzJfdCBnZW5lcmF0aW9uOworICAgIHVpbnQ2NF90IGJxSWQ7CisgICAgaW50MzJfdCBicVNsb3Q7CisgICAgaWYgKCFnZXRCdWZmZXJRdWV1ZUFzc2lnbm1lbnQoYmxvY2ssICZnZW5lcmF0aW9uLCAmYnFJZCwgJmJxU2xvdCkgfHwKKyAgICAgICAgICAgIGJxSWQgPT0gMCkgeworICAgICAgICAvLyBCbG9jayBub3QgZnJvbSBidWZmZXJxdWV1ZSAtLSBpdCBtdXN0IGJlIGF0dGFjaGVkIGJlZm9yZSBxdWV1aW5nLgorCisgICAgICAgIG1PdXRwdXRCdWZmZXJRdWV1ZU11dGV4LmxvY2soKTsKKyAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gb3V0cHV0SWdicCA9IG1PdXRwdXRJZ2JwOworICAgICAgICB1aW50MzJfdCBvdXRwdXRHZW5lcmF0aW9uID0gbU91dHB1dEdlbmVyYXRpb247CisgICAgICAgIG1PdXRwdXRCdWZmZXJRdWV1ZU11dGV4LnVubG9jaygpOworCisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9ICFhdHRhY2hUb0J1ZmZlclF1ZXVlKGJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRJZ2JwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRHZW5lcmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYnFTbG90KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICAgICAgQUxPR1coInF1ZXVlVG9PdXRwdXRTdXJmYWNlIC0tIGF0dGFjaGluZyBmYWlsZWQuIik7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKworICAgICAgICBzdGF0dXMgPSBvdXRwdXRJZ2JwLT5xdWV1ZUJ1ZmZlcihzdGF0aWNfY2FzdDxpbnQ+KGJxU2xvdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LCBvdXRwdXQpOworICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgicXVldWVUb091dHB1dFN1cmZhY2UgLS0gcXVldWVCdWZmZXIoKSBmYWlsZWQgIgorICAgICAgICAgICAgICAgICAgICAib24gbm9uLWJ1ZmZlcnF1ZXVlLWJhc2VkIGJsb2NrLiAiCisgICAgICAgICAgICAgICAgICAgICJFcnJvciBjb2RlID0gJWQuIiwKKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihzdGF0dXMpKTsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIG1PdXRwdXRCdWZmZXJRdWV1ZU11dGV4LmxvY2soKTsKKyAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBvdXRwdXRJZ2JwID0gbU91dHB1dElnYnA7CisgICAgdWludDY0X3Qgb3V0cHV0QnFJZCA9IG1PdXRwdXRCcUlkOworICAgIHVpbnQzMl90IG91dHB1dEdlbmVyYXRpb24gPSBtT3V0cHV0R2VuZXJhdGlvbjsKKyAgICBtT3V0cHV0QnVmZmVyUXVldWVNdXRleC51bmxvY2soKTsKKworICAgIGlmICghb3V0cHV0SWdicCkgeworICAgICAgICBBTE9HVigicXVldWVUb091dHB1dFN1cmZhY2UgLS0gb3V0cHV0IHN1cmZhY2UgaXMgbnVsbC4iKTsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorCisgICAgaWYgKGJxSWQgIT0gb3V0cHV0QnFJZCkgeworICAgICAgICBBTE9HVigicXVldWVUb091dHB1dFN1cmZhY2UgLS0gYnVmZmVycXVldWUgaWRzIG1pc21hdGNoLiIpOworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorCisgICAgaWYgKGdlbmVyYXRpb24gIT0gb3V0cHV0R2VuZXJhdGlvbikgeworICAgICAgICBBTE9HVigicXVldWVUb091dHB1dFN1cmZhY2UgLS0gZ2VuZXJhdGlvbiBudW1iZXJzIG1pc21hdGNoLiIpOworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorCisgICAgc3RhdHVzX3Qgc3RhdHVzID0gb3V0cHV0SWdicC0+cXVldWVCdWZmZXIoc3RhdGljX2Nhc3Q8aW50PihicVNsb3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LCBvdXRwdXQpOworICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0QoInF1ZXVlVG9PdXRwdXRTdXJmYWNlIC0tIHF1ZXVlQnVmZmVyKCkgZmFpbGVkICIKKyAgICAgICAgICAgICAgICAib24gYnVmZmVycXVldWUtYmFzZWQgYmxvY2suICIKKyAgICAgICAgICAgICAgICAiRXJyb3IgY29kZSA9ICVkLiIsCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihzdGF0dXMpKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgaWYgKCF5aWVsZEJ1ZmZlclF1ZXVlQmxvY2soYmxvY2spKSB7CisgICAgICAgIEFMT0dEKCJxdWV1ZVRvT3V0cHV0U3VyZmFjZSAtLSBjYW5ub3QgeWllbGQgYnVmZmVycXVldWUtYmFzZWQgYmxvY2sgIgorICAgICAgICAgICAgICAgICJ0byB0aGUgYnVmZmVycXVldWUuIik7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK2MyX3N0YXR1c190IENvZGVjMkNsaWVudDo6Q29tcG9uZW50Ojpjb25uZWN0VG9PbXhJbnB1dFN1cmZhY2UoCisgICAgICAgIGNvbnN0IHNwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBwcm9kdWNlciwKKyAgICAgICAgY29uc3Qgc3A8SEdyYXBoaWNCdWZmZXJTb3VyY2U+JiBzb3VyY2UpIHsKKyAgICBSZXR1cm48U3RhdHVzPiB0cmFuc1N0YXR1cyA9IGJhc2UoKS0+Y29ubmVjdFRvT214SW5wdXRTdXJmYWNlKAorICAgICAgICAgICAgcHJvZHVjZXIsIHNvdXJjZSk7CisgICAgaWYgKCF0cmFuc1N0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgQUxPR0UoImNvbm5lY3RUb09teElucHV0U3VyZmFjZSAtLSB0cmFuc2FjdGlvbiBmYWlsZWQuIik7CisgICAgICAgIHJldHVybiBDMl9UUkFOU0FDVElPTl9GQUlMRUQ7CisgICAgfQorICAgIGMyX3N0YXR1c190IHN0YXR1cyA9CisgICAgICAgICAgICBzdGF0aWNfY2FzdDxjMl9zdGF0dXNfdD4oc3RhdGljX2Nhc3Q8U3RhdHVzPih0cmFuc1N0YXR1cykpOworICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0UoImNvbm5lY3RUb09teElucHV0U3VyZmFjZSAtLSBjYWxsIGZhaWxlZC4gIgorICAgICAgICAgICAgICAgICJFcnJvciBjb2RlID0gJWQiLCBzdGF0aWNfY2FzdDxpbnQ+KHN0YXR1cykpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitjMl9zdGF0dXNfdCBDb2RlYzJDbGllbnQ6OkNvbXBvbmVudDo6ZGlzY29ubmVjdEZyb21JbnB1dFN1cmZhY2UoKSB7CisgICAgUmV0dXJuPFN0YXR1cz4gdHJhbnNTdGF0dXMgPSBiYXNlKCktPmRpc2Nvbm5lY3RGcm9tSW5wdXRTdXJmYWNlKCk7CisgICAgaWYgKCF0cmFuc1N0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgQUxPR0UoImRpc2Nvbm5lY3RUb0lucHV0U3VyZmFjZSAtLSB0cmFuc2FjdGlvbiBmYWlsZWQuIik7CisgICAgICAgIHJldHVybiBDMl9UUkFOU0FDVElPTl9GQUlMRUQ7CisgICAgfQorICAgIGMyX3N0YXR1c190IHN0YXR1cyA9CisgICAgICAgICAgICBzdGF0aWNfY2FzdDxjMl9zdGF0dXNfdD4oc3RhdGljX2Nhc3Q8U3RhdHVzPih0cmFuc1N0YXR1cykpOworICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0UoImRpc2Nvbm5lY3RGcm9tSW5wdXRTdXJmYWNlIC0tIGNhbGwgZmFpbGVkLiAiCisgICAgICAgICAgICAgICAgIkVycm9yIGNvZGUgPSAlZCIsIHN0YXRpY19jYXN0PGludD4oc3RhdHVzKSk7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK2MyX3N0YXR1c190IENvZGVjMkNsaWVudDo6Q29tcG9uZW50OjpzZXREZWF0aExpc3RlbmVyKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29tcG9uZW50PiYgY29tcG9uZW50LAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8TGlzdGVuZXI+JiBsaXN0ZW5lcikgeworCisgICAgc3RydWN0IEhpZGxEZWF0aFJlY2lwaWVudCA6IHB1YmxpYyBoYXJkd2FyZTo6aGlkbF9kZWF0aF9yZWNpcGllbnQgeworICAgICAgICBzdGQ6OndlYWtfcHRyPENvbXBvbmVudD4gY29tcG9uZW50OworICAgICAgICBzdGQ6OndlYWtfcHRyPExpc3RlbmVyPiBiYXNlOworCisgICAgICAgIHZpcnR1YWwgdm9pZCBzZXJ2aWNlRGllZCgKKyAgICAgICAgICAgICAgICB1aW50NjRfdCAvKiBjb29raWUgKi8sCisgICAgICAgICAgICAgICAgY29uc3Qgd3A8OjphbmRyb2lkOjpoaWRsOjpiYXNlOjpWMV8wOjpJQmFzZT4mIC8qIHdobyAqLworICAgICAgICAgICAgICAgICkgb3ZlcnJpZGUgeworICAgICAgICAgICAgaWYgKHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6Okxpc3RlbmVyPiBsaXN0ZW5lciA9IGJhc2UubG9jaygpKSB7CisgICAgICAgICAgICAgICAgbGlzdGVuZXItPm9uRGVhdGgoY29tcG9uZW50KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR1coIm9uRGVhdGggLS0gbGlzdGVuZXIgZGllZC4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH07CisKKyAgICBzcDxIaWRsRGVhdGhSZWNpcGllbnQ+IGRlYXRoUmVjaXBpZW50ID0gbmV3IEhpZGxEZWF0aFJlY2lwaWVudCgpOworICAgIGRlYXRoUmVjaXBpZW50LT5iYXNlID0gbGlzdGVuZXI7CisgICAgZGVhdGhSZWNpcGllbnQtPmNvbXBvbmVudCA9IGNvbXBvbmVudDsKKworICAgIGNvbXBvbmVudC0+bURlYXRoUmVjaXBpZW50ID0gZGVhdGhSZWNpcGllbnQ7CisgICAgUmV0dXJuPGJvb2w+IHRyYW5zUmVzdWx0ID0gY29tcG9uZW50LT5iYXNlKCktPmxpbmtUb0RlYXRoKAorICAgICAgICAgICAgY29tcG9uZW50LT5tRGVhdGhSZWNpcGllbnQsIDApOworICAgIGlmICghdHJhbnNSZXN1bHQuaXNPaygpKSB7CisgICAgICAgIEFMT0dFKCJzZXREZWF0aExpc3RlbmVyIC0tIGZhaWxlZCB0cmFuc2FjdGlvbjogbGlua1RvRGVhdGguIik7CisgICAgICAgIHJldHVybiBDMl9UUkFOU0FDVElPTl9GQUlMRUQ7CisgICAgfQorICAgIGlmICghc3RhdGljX2Nhc3Q8Ym9vbD4odHJhbnNSZXN1bHQpKSB7CisgICAgICAgIEFMT0dFKCJzZXREZWF0aExpc3RlbmVyIC0tIGxpbmtUb0RlYXRoIGNhbGwgZmFpbGVkLiIpOworICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KKyAgICByZXR1cm4gQzJfT0s7Cit9CisKKy8vIENvZGVjMkNsaWVudDo6SW5wdXRTdXJmYWNlCisKK0NvZGVjMkNsaWVudDo6SW5wdXRTdXJmYWNlOjpCYXNlKiBDb2RlYzJDbGllbnQ6OklucHV0U3VyZmFjZTo6YmFzZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8QmFzZSo+KG1CYXNlLmdldCgpKTsKK30KKworQ29kZWMyQ2xpZW50OjpJbnB1dFN1cmZhY2U6OklucHV0U3VyZmFjZShjb25zdCBzcDxJSW5wdXRTdXJmYWNlPiYgYmFzZSkgOgorICAgIG1CYXNlKGJhc2UpLAorICAgIG1HcmFwaGljQnVmZmVyUHJvZHVjZXIobmV3CisgICAgICAgICAgICA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6YnVmZmVycXVldWU6OlYxXzA6OnV0aWxzOjoKKyAgICAgICAgICAgIEgyQkdyYXBoaWNCdWZmZXJQcm9kdWNlcihiYXNlKSkgeworfQorCitjMl9zdGF0dXNfdCBDb2RlYzJDbGllbnQ6OklucHV0U3VyZmFjZTo6Y29ubmVjdFRvQ29tcG9uZW50KAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+JiBjb21wb25lbnQsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDb25uZWN0aW9uPiogY29ubmVjdGlvbikgeworICAgIGMyX3N0YXR1c190IHN0YXR1czsKKyAgICBSZXR1cm48dm9pZD4gdHJhbnNTdGF0dXMgPSBiYXNlKCktPmNvbm5lY3RUb0NvbXBvbmVudCgKKyAgICAgICAgY29tcG9uZW50LT5iYXNlKCksCisgICAgICAgIFsmc3RhdHVzLCBjb25uZWN0aW9uXSgKKyAgICAgICAgICAgICAgICBTdGF0dXMgcywKKyAgICAgICAgICAgICAgICBjb25zdCBzcDxJSW5wdXRTdXJmYWNlQ29ubmVjdGlvbj4mIGMpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IHN0YXRpY19jYXN0PGMyX3N0YXR1c190PihzKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiY29ubmVjdFRvQ29tcG9uZW50IC0tIGNhbGwgZmFpbGVkLiAiCisgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3IgY29kZSA9ICVkIiwgc3RhdGljX2Nhc3Q8aW50PihzdGF0dXMpKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqY29ubmVjdGlvbiA9IHN0ZDo6bWFrZV9zaGFyZWQ8Q29ubmVjdGlvbj4oYyk7CisgICAgICAgIH0pOworICAgIGlmICghdHJhbnNTdGF0dXMuaXNPaygpKSB7CisgICAgICAgIEFMT0dFKCJjb25uZWN0IC0tIHRyYW5zYWN0aW9uIGZhaWxlZC4iKTsKKyAgICAgICAgcmV0dXJuIEMyX1RSQU5TQUNUSU9OX0ZBSUxFRDsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29uZmlndXJhYmxlPgorICAgICAgICBDb2RlYzJDbGllbnQ6OklucHV0U3VyZmFjZTo6Z2V0Q29uZmlndXJhYmxlKCkgY29uc3QgeworICAgIFJldHVybjxzcDxJQ29uZmlndXJhYmxlPj4gdHJhbnNSZXN1bHQgPSBiYXNlKCktPmdldENvbmZpZ3VyYWJsZSgpOworICAgIGlmICghdHJhbnNSZXN1bHQuaXNPaygpKSB7CisgICAgICAgIEFMT0dXKCJnZXRDb25maWd1cmFibGUgLS0gdHJhbnNhY3Rpb24gZmFpbGVkLiIpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgaWYgKCFzdGF0aWNfY2FzdDxzcDxJQ29uZmlndXJhYmxlPj4odHJhbnNSZXN1bHQpKSB7CisgICAgICAgIEFMT0dXKCJnZXRDb25maWd1cmFibGUgLS0gbnVsbCBwb2ludGVyLiIpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgcmV0dXJuIHN0ZDo6bWFrZV9zaGFyZWQ8Q29uZmlndXJhYmxlPih0cmFuc1Jlc3VsdCk7Cit9CisKK2NvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+JgorICAgICAgICBDb2RlYzJDbGllbnQ6OklucHV0U3VyZmFjZTo6Z2V0R3JhcGhpY0J1ZmZlclByb2R1Y2VyKCkgY29uc3QgeworICAgIHJldHVybiBtR3JhcGhpY0J1ZmZlclByb2R1Y2VyOworfQorCitjb25zdCBzcDxJSW5wdXRTdXJmYWNlPiYgQ29kZWMyQ2xpZW50OjpJbnB1dFN1cmZhY2U6OmdldEhhbEludGVyZmFjZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUJhc2U7Cit9CisKKy8vIENvZGVjMkNsaWVudDo6SW5wdXRTdXJmYWNlQ29ubmVjdGlvbgorCitDb2RlYzJDbGllbnQ6OklucHV0U3VyZmFjZUNvbm5lY3Rpb246OkJhc2UqCisgICAgICAgIENvZGVjMkNsaWVudDo6SW5wdXRTdXJmYWNlQ29ubmVjdGlvbjo6YmFzZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8QmFzZSo+KG1CYXNlLmdldCgpKTsKK30KKworQ29kZWMyQ2xpZW50OjpJbnB1dFN1cmZhY2VDb25uZWN0aW9uOjpJbnB1dFN1cmZhY2VDb25uZWN0aW9uKAorICAgICAgICBjb25zdCBzcDxDb2RlYzJDbGllbnQ6OklucHV0U3VyZmFjZUNvbm5lY3Rpb246OkJhc2U+JiBiYXNlKSA6CisgICAgbUJhc2UoYmFzZSkgeworfQorCitjMl9zdGF0dXNfdCBDb2RlYzJDbGllbnQ6OklucHV0U3VyZmFjZUNvbm5lY3Rpb246OmRpc2Nvbm5lY3QoKSB7CisgICAgUmV0dXJuPFN0YXR1cz4gdHJhbnNSZXN1bHQgPSBiYXNlKCktPmRpc2Nvbm5lY3QoKTsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8YzJfc3RhdHVzX3Q+KHN0YXRpY19jYXN0PFN0YXR1cz4odHJhbnNSZXN1bHQpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvY2xpZW50L2luY2x1ZGUvY29kZWMyL2hpZGwvY2xpZW50LmggYi9tZWRpYS9jb2RlYzIvaGlkbC9jbGllbnQvaW5jbHVkZS9jb2RlYzIvaGlkbC9jbGllbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWIzOTY3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvY2xpZW50L2luY2x1ZGUvY29kZWMyL2hpZGwvY2xpZW50LmgKQEAgLTAsMCArMSw0ODUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIENPREVDMl9ISURMX0NMSUVOVF9IXworI2RlZmluZSBDT0RFQzJfSElETF9DTElFTlRfSF8KKworI2luY2x1ZGUgPGd1aS9JR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+CisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvMS4wL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8QzJCdWZmZXIuaD4KKyNpbmNsdWRlIDxDMlBhcmFtLmg+CisjaW5jbHVkZSA8QzIuaD4KKworI2luY2x1ZGUgPGhpZGwvSGlkbFN1cHBvcnQuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+CisKKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8bXV0ZXg+CisKKy8qKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIG1pbmltYWwgaW50ZXJmYWNlcyBmb3IgdGhlIGZyYW1ld29yayB0byBhY2Nlc3MgQ29kZWMyLjAuCisgKgorICogQ29kZWMyQ2xpZW50IGlzIHRoZSBtYWluIGNsYXNzIHRoYXQgY29udGFpbnMgdGhlIGZvbGxvd2luZyBpbm5lciBjbGFzc2VzOgorICogLSBMaXN0ZW5lcgorICogLSBDb25maWd1cmFibGUKKyAqIC0gSW50ZXJmYWNlCisgKiAtIENvbXBvbmVudAorICoKKyAqIENsYXNzZXMgaW4gQ29kZWMyQ2xpZW50LCBpbnRlcmZhY2VzIGluIENvZGVjMi4wLCBhbmQgIEhJREwgaW50ZXJmYWNlcyBhcmUKKyAqIHJlbGF0ZWQgYXMgZm9sbG93czoKKyAqIC0gQ29kZWMyQ2xpZW50IDw9PT4gQzJDb21wb25lbnRTdG9yZSA8PT0+IElDb21wb25lbnRTdG9yZQorICogLSBDb2RlYzJDbGllbnQ6Okxpc3RlbmVyIDw9PT4gQzJDb21wb25lbnQ6Okxpc3RlbmVyIDw9PT4gSUNvbXBvbmVudExpc3RlbmVyCisgKiAtIENvZGVjMkNsaWVudDo6Q29uZmlndXJhYmxlIDw9PT4gW05vIGVxdWl2YWxlbnRdIDw9PT4gSUNvbmZpZ3VyYWJsZQorICogLSBDb2RlYzJDbGllbnQ6OkludGVyZmFjZSA8PT0+IEMyQ29tcG9uZW50SW50ZXJmYWNlIDw9PT4gSUNvbXBvbmVudEludGVyZmFjZQorICogLSBDb2RlYzJDbGllbnQ6OkNvbXBvbmVudCA8PT0+IEMyQ29tcG9uZW50IDw9PT4gSUNvbXBvbmVudAorICoKKyAqIFRoZSBlbnRyeSBwb2ludCBpcyBDb2RlYzJDbGllbnQ6OkNyZWF0ZUZyb21TZXJ2aWNlKCksIHdoaWNoIGNyZWF0ZXMgYQorICogQ29kZWMyQ2xpZW50IG9iamVjdC4gRnJvbSBDb2RlYzJDbGllbnQsIEludGVyZmFjZSBhbmQgQ29tcG9uZW50IG9iamVjdHMgY2FuCisgKiBiZSBjcmVhdGVkIGJ5IGNhbGxpbmcgY3JlYXRlQ29tcG9uZW50KCkgYW5kIGNyZWF0ZUludGVyZmFjZSgpLgorICoKKyAqIGNyZWF0ZUNvbXBvbmVudCgpIHRha2VzIGEgTGlzdGVuZXIgb2JqZWN0LCB3aGljaCBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IHRoZQorICogdXNlci4KKyAqCisgKiBBdCB0aGUgcHJlc2VudCwgY3JlYXRlQmxvY2tQb29sKCkgaXMgdGhlIG9ubHkgbWV0aG9kIHRoYXQgeWllbGRzIGEKKyAqIENvbmZpZ3VyYWJsZSBvYmplY3QuIE5vdGUsIGhvd2V2ZXIsIHRoYXQgSW50ZXJmYWNlLCBDb21wb25lbnQgYW5kCisgKiBDb2RlYzJDbGllbnQgYXJlIGFsbCBzdWJjbGFzc2VzIG9mIENvbmZpZ3VyYWJsZS4KKyAqLworCisvLyBGb3J3YXJkIGRlY2xhcmF0aW9uIG9mIENvZGVjMi4wIEhJREwgaW50ZXJmYWNlcworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYzIgeworbmFtZXNwYWNlIFYxXzAgeworc3RydWN0IElDb25maWd1cmFibGU7CitzdHJ1Y3QgSUNvbXBvbmVudEludGVyZmFjZTsKK3N0cnVjdCBJQ29tcG9uZW50Oworc3RydWN0IElDb21wb25lbnRTdG9yZTsKK3N0cnVjdCBJSW5wdXRTdXJmYWNlOworc3RydWN0IElJbnB1dFN1cmZhY2VDb25uZWN0aW9uOworfSAvLyBuYW1lc3BhY2UgVjFfMAorfSAvLyBuYW1lc3BhY2UgYzIKK30gLy8gbmFtZXNwYWNlIG1lZGlhCit9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBidWZmZXJwb29sIHsKK25hbWVzcGFjZSBWMV8wIHsKK3N0cnVjdCBJQ2xpZW50TWFuYWdlcjsKK30gLy8gbmFtZXNwYWNlIFYxXzAKK30gLy8gbmFtZXNwYWNlIGJ1ZmZlcnBvb2wKK30gLy8gbmFtZXNwYWNlIG1lZGlhCit9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisvLyBGb3J3YXJkIGRlY2xhcmF0aW9ucyBvZiBvdGhlciBjbGFzc2VzCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIGdyYXBoaWNzIHsKK25hbWVzcGFjZSBidWZmZXJxdWV1ZSB7CituYW1lc3BhY2UgVjFfMCB7CitzdHJ1Y3QgSUdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKK30gLy8gbmFtZXNwYWNlIFYxXzAKK30gLy8gbmFtZXNwYWNlIGJ1ZmZlcnF1ZXVlCit9IC8vIG5hbWVzcGFjZSBncmFwaGljcworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBvbXggeworbmFtZXNwYWNlIFYxXzAgeworc3RydWN0IElHcmFwaGljQnVmZmVyU291cmNlOworfSAvLyBuYW1lc3BhY2UgVjFfMAorfSAvLyBuYW1lc3BhY2Ugb214Cit9IC8vIG5hbWVzcGFjZSBtZWRpYQorfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBUaGlzIGNsYXNzIGlzIHN1cHBvc2VkIHRvIGJlIGNhbGxlZCBDb2RlYzJDbGllbnQ6OkNvbmZpZ3VyYWJsZSwgYnV0IGZvcndhcmQKKy8vIGRlY2xhcmF0aW9uIG9mIGFuIGlubmVyIGNsYXNzIGlzIG5vdCBwb3NzaWJsZS4KK3N0cnVjdCBDb2RlYzJDb25maWd1cmFibGVDbGllbnQgeworCisgICAgdHlwZWRlZiA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YzI6OlYxXzA6OklDb25maWd1cmFibGUgQmFzZTsKKworICAgIGNvbnN0IEMyU3RyaW5nJiBnZXROYW1lKCkgY29uc3Q7CisKKyAgICBjMl9zdGF0dXNfdCBxdWVyeSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiYgc3RhY2tQYXJhbXMsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gJmhlYXBQYXJhbUluZGljZXMsCisgICAgICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiogY29uc3QgaGVhcFBhcmFtcykgY29uc3Q7CisKKyAgICBjMl9zdGF0dXNfdCBjb25maWcoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gJnBhcmFtcywKKyAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2ssCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4qIGNvbnN0IGZhaWx1cmVzKTsKKworICAgIGMyX3N0YXR1c190IHF1ZXJ5U3VwcG9ydGVkUGFyYW1zKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4qIGNvbnN0IHBhcmFtcworICAgICAgICAgICAgKSBjb25zdDsKKworICAgIGMyX3N0YXR1c190IHF1ZXJ5U3VwcG9ydGVkVmFsdWVzKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5PiYgZmllbGRzLAorICAgICAgICAgICAgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaykgY29uc3Q7CisKKyAgICAvLyBiYXNlIGNhbm5vdCBiZSBudWxsLgorICAgIENvZGVjMkNvbmZpZ3VyYWJsZUNsaWVudChjb25zdCBzcDxCYXNlPiYgYmFzZSk7CisKK3Byb3RlY3RlZDoKKyAgICBDMlN0cmluZyBtTmFtZTsKKyAgICBzcDxCYXNlPiBtQmFzZTsKKworICAgIEJhc2UqIGJhc2UoKSBjb25zdDsKKworICAgIGZyaWVuZCBzdHJ1Y3QgQ29kZWMyQ2xpZW50OworfTsKKworc3RydWN0IENvZGVjMkNsaWVudCA6IHB1YmxpYyBDb2RlYzJDb25maWd1cmFibGVDbGllbnQgeworCisgICAgdHlwZWRlZiA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YzI6OlYxXzA6OklDb21wb25lbnRTdG9yZSBCYXNlOworCisgICAgc3RydWN0IExpc3RlbmVyOworCisgICAgdHlwZWRlZiBDb2RlYzJDb25maWd1cmFibGVDbGllbnQgQ29uZmlndXJhYmxlOworCisgICAgdHlwZWRlZiBDb25maWd1cmFibGUgSW50ZXJmYWNlOyAvLyBUaGVzZSB0d28gdHlwZXMgbWF5IGRpdmVyZ2UgaW4gdGhlIGZ1dHVyZS4KKworICAgIHN0cnVjdCBDb21wb25lbnQ7CisKKyAgICBzdHJ1Y3QgSW5wdXRTdXJmYWNlOworCisgICAgc3RydWN0IElucHV0U3VyZmFjZUNvbm5lY3Rpb247CisKKyAgICB0eXBlZGVmIENvZGVjMkNsaWVudCBTdG9yZTsKKworICAgIHN0ZDo6c3RyaW5nIGdldEluc3RhbmNlTmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1JbnN0YW5jZU5hbWU7IH0KKworICAgIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgICAgIGNvbnN0IEMyU3RyaW5nJiBuYW1lLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPExpc3RlbmVyPiYgbGlzdGVuZXIsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Q29tcG9uZW50PiogY29uc3QgY29tcG9uZW50KTsKKworICAgIGMyX3N0YXR1c190IGNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgICAgIGNvbnN0IEMyU3RyaW5nJiBuYW1lLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEludGVyZmFjZT4qIGNvbnN0IGludGVyZmFjZSk7CisKKyAgICBjMl9zdGF0dXNfdCBjcmVhdGVJbnB1dFN1cmZhY2UoCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8SW5wdXRTdXJmYWNlPiogY29uc3QgaW5wdXRTdXJmYWNlKTsKKworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyQ29tcG9uZW50OjpUcmFpdHM+JiBsaXN0Q29tcG9uZW50cygpIGNvbnN0OworCisgICAgYzJfc3RhdHVzX3QgY29weUJ1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4mIHNyYywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4mIGRzdCk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gZ2V0UGFyYW1SZWZsZWN0b3IoKTsKKworICAgIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50PiBDcmVhdGVGcm9tU2VydmljZSgKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIGluc3RhbmNlTmFtZSwKKyAgICAgICAgICAgIGJvb2wgd2FpdEZvclNlcnZpY2UgPSB0cnVlKTsKKworICAgIC8vIFRyeSB0byBjcmVhdGUgYSBjb21wb25lbnQgd2l0aCBhIGdpdmVuIG5hbWUgZnJvbSBhbGwga25vd24KKyAgICAvLyBJQ29tcG9uZW50U3RvcmUgc2VydmljZXMuCisgICAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxDb21wb25lbnQ+IENyZWF0ZUNvbXBvbmVudEJ5TmFtZSgKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIGNvbXBvbmVudE5hbWUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8TGlzdGVuZXI+JiBsaXN0ZW5lciwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ+KiBvd25lciA9IG51bGxwdHIpOworCisgICAgLy8gVHJ5IHRvIGNyZWF0ZSBhIGNvbXBvbmVudCBpbnRlcmZhY2Ugd2l0aCBhIGdpdmVuIG5hbWUgZnJvbSBhbGwga25vd24KKyAgICAvLyBJQ29tcG9uZW50U3RvcmUgc2VydmljZXMuCisgICAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxJbnRlcmZhY2U+IENyZWF0ZUludGVyZmFjZUJ5TmFtZSgKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIGludGVyZmFjZU5hbWUsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50Piogb3duZXIgPSBudWxscHRyKTsKKworICAgIC8vIExpc3QgdHJhaXRzIGZyb20gYWxsIGtub3duIElDb21wb25lbnRTdG9yZSBzZXJ2aWNlcy4KKyAgICBzdGF0aWMgY29uc3Qgc3RkOjp2ZWN0b3I8QzJDb21wb25lbnQ6OlRyYWl0cz4mIExpc3RDb21wb25lbnRzKCk7CisKKyAgICAvLyBDcmVhdGUgYW4gaW5wdXQgc3VyZmFjZS4KKyAgICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPElucHV0U3VyZmFjZT4gQ3JlYXRlSW5wdXRTdXJmYWNlKCk7CisKKyAgICAvLyBiYXNlIGNhbm5vdCBiZSBudWxsLgorICAgIENvZGVjMkNsaWVudChjb25zdCBzcDxCYXNlPiYgYmFzZSwgc3RkOjpzdHJpbmcgaW5zdGFuY2VOYW1lKTsKKworcHJvdGVjdGVkOgorICAgIEJhc2UqIGJhc2UoKSBjb25zdDsKKworICAgIC8vIEZpbmRzIHRoZSBmaXJzdCBzdG9yZSB3aGVyZSB0aGUgcHJlZGljYXRlIHJldHVybnMgT0ssIGFuZCByZXR1cm5zIHRoZSBsYXN0CisgICAgLy8gcHJlZGljYXRlIHJlc3VsdC4gVXNlcyBrZXkgdG8gcmVtZW1iZXIgdGhlIGxhc3Qgc3RvcmUgZm91bmQsIGFuZCBpZiBjYWNoZWQsCisgICAgLy8gaXQgdHJpZXMgdGhhdCBzdG9yZSBiZWZvcmUgdHJ5aW5nIGFsbCBzdG9yZXMgKG9uZSByZXRyeSkuCisgICAgc3RhdGljIGMyX3N0YXR1c190IEZvckFsbFN0b3JlcygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPGMyX3N0YXR1c190KGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ+Jik+IHByZWRpY2F0ZSk7CisKKyAgICBtdXRhYmxlIHN0ZDo6bXV0ZXggbU11dGV4OworICAgIG11dGFibGUgYm9vbCBtTGlzdGVkOworICAgIHN0ZDo6c3RyaW5nIG1JbnN0YW5jZU5hbWU7CisgICAgbXV0YWJsZSBzdGQ6OnZlY3RvcjxDMkNvbXBvbmVudDo6VHJhaXRzPiBtVHJhaXRzTGlzdDsKKyAgICBtdXRhYmxlIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4+PgorICAgICAgICAgICAgbUFsaWFzZXNCdWZmZXI7CisKKyAgICBzcDw6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjFfMDo6SUNsaWVudE1hbmFnZXI+CisgICAgICAgICAgICBtSG9zdFBvb2xNYW5hZ2VyOworfTsKKworc3RydWN0IENvZGVjMkNsaWVudDo6TGlzdGVuZXIgeworCisgICAgLy8gVGhpcyBpcyBjYWxsZWQgd2hlbiB0aGUgY29tcG9uZW50IHByb2R1Y2VzIHNvbWUgb3V0cHV0LgorICAgIC8vCisgICAgLy8gbnVtRGlzY2FyZGVkSW5wdXRCdWZmZXJzIGlzIHRoZSBudW1iZXIgb2YgaW5wdXQgYnVmZmVycyBjb250YWluZWQgaW4KKyAgICAvLyB3b3JrSXRlbXMgdGhhdCBoYXZlIGp1c3QgYmVjb21lIHVudXNlZC4gTm90ZSB0aGF0IHdvcmtJdGVtcyBtYXkgY29udGFpbgorICAgIC8vIG1vcmUgaW5wdXQgYnVmZmVycyB0aGFuIG51bURpc2NhcmRlZElucHV0QnVmZmVycyBiZWNhdXNlIGJ1ZmZlcnMgdGhhdAorICAgIC8vIGhhdmUgYmVlbiBwcmV2aW91c2x5IHJlcG9ydGVkIGJ5IG9uSW5wdXRCdWZmZXJEb25lKCkgYXJlIG5vdCBjb3VudGVkCisgICAgLy8gdG93YXJkcyBudW1EaXNjYXJkZWRJbnB1dEJ1ZmZlcnMsIGJ1dCBtYXkgc3RpbGwgc2hvdyB1cCBpbiB3b3JrSXRlbXMuCisgICAgdmlydHVhbCB2b2lkIG9uV29ya0RvbmUoCisgICAgICAgICAgICBjb25zdCBzdGQ6OndlYWtfcHRyPENvbXBvbmVudD4mIGNvbXAsCisgICAgICAgICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrSXRlbXMsCisgICAgICAgICAgICBzaXplX3QgbnVtRGlzY2FyZGVkSW5wdXRCdWZmZXJzKSA9IDA7CisKKyAgICAvLyBUaGlzIGlzIGNhbGxlZCB3aGVuIHRoZSBjb21wb25lbnQgZ29lcyBpbnRvIGEgdHJpcHBlZCBzdGF0ZS4KKyAgICB2aXJ0dWFsIHZvaWQgb25UcmlwcGVkKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp3ZWFrX3B0cjxDb21wb25lbnQ+JiBjb21wLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+JiBzZXR0aW5nUmVzdWx0cworICAgICAgICAgICAgKSA9IDA7CisKKyAgICAvLyBUaGlzIGlzIGNhbGxlZCB3aGVuIHRoZSBjb21wb25lbnQgZW5jb3VudGVycyBhbiBlcnJvci4KKyAgICB2aXJ0dWFsIHZvaWQgb25FcnJvcigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6d2Vha19wdHI8Q29tcG9uZW50PiYgY29tcCwKKyAgICAgICAgICAgIHVpbnQzMl90IGVycm9yQ29kZSkgPSAwOworCisgICAgLy8gVGhpcyBpcyBjYWxsZWQgd2hlbiB0aGUgcHJvY2VzcyB0aGF0IGhvc3RzIHRoZSBjb21wb25lbnQgc2h1dHMgZG93bgorICAgIC8vIHVuZXhwZWN0ZWRseS4KKyAgICB2aXJ0dWFsIHZvaWQgb25EZWF0aCgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6d2Vha19wdHI8Q29tcG9uZW50PiYgY29tcCkgPSAwOworCisgICAgLy8gVGhpcyBpcyBjYWxsZWQgd2hlbiBhbiBpbnB1dCBidWZmZXIgaXMgbm8gbG9uZ2VyIGluIHVzZSBieSB0aGUgY29kZWMuCisgICAgLy8gSW5wdXQgYnVmZmVycyB0aGF0IGhhdmUgYmVlbiByZXR1cm5lZCBieSBvbldvcmtEb25lKCkgb3IgZmx1c2goKSB3aWxsIG5vdAorICAgIC8vIHRyaWdnZXIgYSBjYWxsIHRvIHRoaXMgZnVuY3Rpb24uCisgICAgdmlydHVhbCB2b2lkIG9uSW5wdXRCdWZmZXJEb25lKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiYgYnVmZmVyKSA9IDA7CisKKyAgICAvLyBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIGZvciB0cmFuc3BvcnRpbmcgb25GcmFtZXNSZW5kZXJlZCgpIGV2ZW50IHRvIHRoZQorICAgIC8vIGNsaWVudCBpbiB0aGUgY2FzZSB3aGVyZSB0aGUgb3V0cHV0IGJ1ZmZlcnMgYXJlIG9idGFpbmVkIGZyb20gYQorICAgIC8vIGJ1ZmZlcnF1ZXVlLgorICAgIHN0cnVjdCBSZW5kZXJlZEZyYW1lIHsKKyAgICAgICAgLy8gVGhlIGlkIG9mIHRoZSBidWZmZXJxdWV1ZS4KKyAgICAgICAgdWludDY0X3QgYnVmZmVyUXVldWVJZDsKKyAgICAgICAgLy8gVGhlIHNsb3Qgb2YgdGhlIGJ1ZmZlciBpbnNpZGUgdGhlIGJ1ZmZlcnF1ZXVlLgorICAgICAgICBpbnQzMl90IHNsb3RJZDsKKyAgICAgICAgLy8gVGhlIHRpbWVzdGFtcC4KKyAgICAgICAgaW50NjRfdCB0aW1lc3RhbXBOczsKKworICAgICAgICBSZW5kZXJlZEZyYW1lKHVpbnQ2NF90IGJ1ZmZlclF1ZXVlSWQsIGludDMyX3Qgc2xvdElkLAorICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdGltZXN0YW1wTnMpCisgICAgICAgICAgICAgIDogYnVmZmVyUXVldWVJZChidWZmZXJRdWV1ZUlkKSwKKyAgICAgICAgICAgICAgICBzbG90SWQoc2xvdElkKSwKKyAgICAgICAgICAgICAgICB0aW1lc3RhbXBOcyh0aW1lc3RhbXBOcykge30KKyAgICAgICAgUmVuZGVyZWRGcmFtZShjb25zdCBSZW5kZXJlZEZyYW1lJikgPSBkZWZhdWx0OworICAgIH07CisKKyAgICAvLyBUaGlzIGlzIGNhbGxlZCB3aGVuIHRoZSBjb21wb25lbnQgYmVjb21lcyBhd2FyZSBvZiBmcmFtZXMgYmVpbmcgcmVuZGVyZWQuCisgICAgdmlydHVhbCB2b2lkIG9uRnJhbWVzUmVuZGVyZWQoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxSZW5kZXJlZEZyYW1lPiYgcmVuZGVyZWRGcmFtZXMpID0gMDsKKworICAgIHZpcnR1YWwgfkxpc3RlbmVyKCk7CisKK307CisKK3N0cnVjdCBDb2RlYzJDbGllbnQ6OkNvbXBvbmVudCA6IHB1YmxpYyBDb2RlYzJDbGllbnQ6OkNvbmZpZ3VyYWJsZSB7CisKKyAgICB0eXBlZGVmIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpjMjo6VjFfMDo6SUNvbXBvbmVudCBCYXNlOworCisgICAgYzJfc3RhdHVzX3QgY3JlYXRlQmxvY2tQb29sKAorICAgICAgICAgICAgQzJBbGxvY2F0b3I6OmlkX3QgaWQsCisgICAgICAgICAgICBDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCogYmxvY2tQb29sSWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Q29uZmlndXJhYmxlPiogY29uZmlndXJhYmxlKTsKKworICAgIGMyX3N0YXR1c190IGRlc3Ryb3lCbG9ja1Bvb2woCisgICAgICAgICAgICBDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCBsb2NhbElkKTsKKworICAgIGMyX3N0YXR1c190IHF1ZXVlKAorICAgICAgICAgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiogY29uc3QgaXRlbXMpOworCisgICAgYzJfc3RhdHVzX3QgZmx1c2goCisgICAgICAgICAgICBDMkNvbXBvbmVudDo6Zmx1c2hfbW9kZV90IG1vZGUsCisgICAgICAgICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+KiBjb25zdCBmbHVzaGVkV29yayk7CisKKyAgICBjMl9zdGF0dXNfdCBkcmFpbihDMkNvbXBvbmVudDo6ZHJhaW5fbW9kZV90IG1vZGUpOworCisgICAgYzJfc3RhdHVzX3Qgc3RhcnQoKTsKKworICAgIGMyX3N0YXR1c190IHN0b3AoKTsKKworICAgIGMyX3N0YXR1c190IHJlc2V0KCk7CisKKyAgICBjMl9zdGF0dXNfdCByZWxlYXNlKCk7CisKKyAgICB0eXBlZGVmIDo6YW5kcm9pZDo6CisgICAgICAgICAgICBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyIElHcmFwaGljQnVmZmVyUHJvZHVjZXI7CisgICAgdHlwZWRlZiBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjoKKyAgICAgICAgICAgIFF1ZXVlQnVmZmVySW5wdXQgUXVldWVCdWZmZXJJbnB1dDsKKyAgICB0eXBlZGVmIElHcmFwaGljQnVmZmVyUHJvZHVjZXI6OgorICAgICAgICAgICAgUXVldWVCdWZmZXJPdXRwdXQgUXVldWVCdWZmZXJPdXRwdXQ7CisKKyAgICB0eXBlZGVmIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpidWZmZXJxdWV1ZTo6VjFfMDo6CisgICAgICAgICAgICBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI7CisgICAgdHlwZWRlZiA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6b214OjpWMV8wOjoKKyAgICAgICAgICAgIElHcmFwaGljQnVmZmVyU291cmNlIEhHcmFwaGljQnVmZmVyU291cmNlOworCisgICAgLy8gU2V0IHRoZSBvdXRwdXQgc3VyZmFjZSB0byBiZSB1c2VkIHdpdGggYSBibG9ja3Bvb2wgcHJldmlvdXNseSBjcmVhdGVkIGJ5CisgICAgLy8gY3JlYXRlQmxvY2tQb29sKCkuCisgICAgYzJfc3RhdHVzX3Qgc2V0T3V0cHV0U3VyZmFjZSgKKyAgICAgICAgICAgIEMyQmxvY2tQb29sOjpsb2NhbF9pZF90IGJsb2NrUG9vbElkLAorICAgICAgICAgICAgY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIHN1cmZhY2UsCisgICAgICAgICAgICB1aW50MzJfdCBnZW5lcmF0aW9uKTsKKworICAgIC8vIEV4dHJhY3QgYSBzbG90IG51bWJlciBmcm9tIG9mIHRoZSBibG9jaywgdGhlbiBjYWxsCisgICAgLy8gSUdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6cXVldWVCdWZmZXIoKS4KKyAgICAvLworICAgIC8vIElmIHRoZSBvdXRwdXQgc3VyZmFjZSBoYXMgbm90IGJlZW4gc2V0LCBOT19JTklUIHdpbGwgYmUgcmV0dXJuZWQuCisgICAgLy8KKyAgICAvLyBJZiB0aGUgYmxvY2sgZG9lcyBub3QgY29tZSBmcm9tIGEgYnVmZmVycXVldWUtYmFzZWQgYmxvY2twb29sLAorICAgIC8vIGF0dGFjaEJ1ZmZlcigpIHdpbGwgYmUgY2FsbGVkLCBmb2xsb3dlZCBieSBxdWV1ZUJ1ZmZlcigpLgorICAgIC8vCisgICAgLy8gSWYgdGhlIGJsb2NrIGhhcyBhIGJxSWQgdGhhdCBkb2VzIG5vdCBtYXRjaCB0aGUgaWQgb2YgdGhlIG91dHB1dCBzdXJmYWNlLAorICAgIC8vIERFQURfT0JKRUNUIHdpbGwgYmUgcmV0dXJuZWQuCisgICAgLy8KKyAgICAvLyBJZiB0aGUgY2FsbCB0byBxdWV1ZUJ1ZmZlcigpIGlzIHN1Y2Nlc3NmdWwgYnV0IHRoZSBibG9jayBjYW5ub3QgYmUKKyAgICAvLyBhc3NvY2lhdGVkIHRvIHRoZSBvdXRwdXQgc3VyZmFjZSBmb3IgYXV0b21hdGljIGNhbmNlbGxhdGlvbiB1cG9uCisgICAgLy8gZGVzdHJ1Y3Rpb24sIFVOS05PV05fRVJST1Igd2lsbCBiZSByZXR1cm5lZC4KKyAgICAvLworICAgIC8vIE90aGVyd2lzZSwgdGhlIHJldHVybiB2YWx1ZSBmcm9tIHF1ZXVlQnVmZmVyKCkgd2lsbCBiZSByZXR1cm5lZC4KKyAgICBzdGF0dXNfdCBxdWV1ZVRvT3V0cHV0U3VyZmFjZSgKKyAgICAgICAgICAgIGNvbnN0IEMyQ29uc3RHcmFwaGljQmxvY2smIGJsb2NrLAorICAgICAgICAgICAgY29uc3QgUXVldWVCdWZmZXJJbnB1dCYgaW5wdXQsCisgICAgICAgICAgICBRdWV1ZUJ1ZmZlck91dHB1dCogb3V0cHV0KTsKKworICAgIGMyX3N0YXR1c190IGNvbm5lY3RUb09teElucHV0U3VyZmFjZSgKKyAgICAgICAgICAgIGNvbnN0IHNwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBwcm9kdWNlciwKKyAgICAgICAgICAgIGNvbnN0IHNwPEhHcmFwaGljQnVmZmVyU291cmNlPiYgc291cmNlKTsKKworICAgIGMyX3N0YXR1c190IGRpc2Nvbm5lY3RGcm9tSW5wdXRTdXJmYWNlKCk7CisKKyAgICAvLyBiYXNlIGNhbm5vdCBiZSBudWxsLgorICAgIENvbXBvbmVudChjb25zdCBzcDxCYXNlPiYgYmFzZSk7CisKKyAgICB+Q29tcG9uZW50KCk7CisKK3Byb3RlY3RlZDoKKyAgICBCYXNlKiBiYXNlKCkgY29uc3Q7CisKKyAgICAvLyBNdXRleCBmb3IgbUlucHV0QnVmZmVycyBhbmQgbUlucHV0QnVmZmVyQ291bnQuCisgICAgbXV0YWJsZSBzdGQ6Om11dGV4IG1JbnB1dEJ1ZmZlcnNNdXRleDsKKworICAgIC8vIE1hcDogZnJhbWVJbmRleCAtPiB2ZWN0b3Igb2YgYnVmZmVySW5kaWNlcworICAgIC8vCisgICAgLy8gbUlucHV0QnVmZmVyc1tmcmFtZUluZGV4XVtidWZmZXJJbmRleF0gbWF5IGJlIG51bGwgaWYgdGhlIGJ1ZmZlciBpbiB0aGF0CisgICAgLy8gc2xvdCBoYXMgYmVlbiBmcmVlZC4KKyAgICBtdXRhYmxlIHN0ZDo6bWFwPHVpbnQ2NF90LCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+Pj4KKyAgICAgICAgICAgIG1JbnB1dEJ1ZmZlcnM7CisKKyAgICAvLyBNYXA6IGZyYW1lSW5kZXggLT4gbnVtYmVyIG9mIGJ1ZmZlckluZGljZXMgdGhhdCBoYXZlIG5vdCBiZWVuIGZyZWVkCisgICAgLy8KKyAgICAvLyBtSW5wdXRCdWZmZXJDb3VudFtmcmFtZUluZGV4XSBrZWVwcyB0cmFjayBvZiB0aGUgbnVtYmVyIG9mIG5vbi1udWxsCisgICAgLy8gZWxlbWVudHMgaW4gbUlucHV0QnVmZmVyc1tmcmFtZUluZGV4XS4gV2hlbiBtSW5wdXRCdWZmZXJDb3VudFtmcmFtZUluZGV4XQorICAgIC8vIGRlY3JlYXNlcyB0byAwLCBmcmFtZUluZGV4IGNhbiBiZSByZW1vdmVkIGZyb20gYm90aCBtSW5wdXRCdWZmZXJzIGFuZAorICAgIC8vIG1JbnB1dEJ1ZmZlckNvdW50LgorICAgIG11dGFibGUgc3RkOjptYXA8dWludDY0X3QsIHNpemVfdD4gbUlucHV0QnVmZmVyQ291bnQ7CisKKyAgICA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YzI6OlYxXzA6OnV0aWxzOjpEZWZhdWx0QnVmZmVyUG9vbFNlbmRlcgorICAgICAgICAgICAgbUJ1ZmZlclBvb2xTZW5kZXI7CisKKyAgICBzdGQ6Om11dGV4IG1PdXRwdXRCdWZmZXJRdWV1ZU11dGV4OworICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IG1PdXRwdXRJZ2JwOworICAgIHVpbnQ2NF90IG1PdXRwdXRCcUlkOworICAgIHVpbnQzMl90IG1PdXRwdXRHZW5lcmF0aW9uOworCisgICAgc3RhdGljIGMyX3N0YXR1c190IHNldERlYXRoTGlzdGVuZXIoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29tcG9uZW50PiYgY29tcG9uZW50LAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPExpc3RlbmVyPiYgbGlzdGVuZXIpOworICAgIHNwPDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfZGVhdGhfcmVjaXBpZW50PiBtRGVhdGhSZWNpcGllbnQ7CisKKyAgICBmcmllbmQgc3RydWN0IENvZGVjMkNsaWVudDsKKworICAgIHN0cnVjdCBIaWRsTGlzdGVuZXI7CisgICAgLy8gUmV0dXJuIHRoZSBudW1iZXIgb2YgaW5wdXQgYnVmZmVycyB0aGF0IHNob3VsZCBiZSBkaXNjYXJkZWQuCisgICAgc2l6ZV90IGhhbmRsZU9uV29ya0RvbmUoY29uc3Qgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiAmd29ya0l0ZW1zKTsKKyAgICAvLyBSZW1vdmUgYW4gaW5wdXQgYnVmZmVyIGZyb20gbUlucHV0QnVmZmVycyBhbmQgcmV0dXJuIGl0LgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gZnJlZUlucHV0QnVmZmVyKHVpbnQ2NF90IGZyYW1lSW5kZXgsIHNpemVfdCBidWZmZXJJbmRleCk7CisKK307CisKK3N0cnVjdCBDb2RlYzJDbGllbnQ6OklucHV0U3VyZmFjZSB7CitwdWJsaWM6CisgICAgdHlwZWRlZiA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YzI6OlYxXzA6OklJbnB1dFN1cmZhY2UgQmFzZTsKKworICAgIHR5cGVkZWYgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOjpWMV8wOjpJSW5wdXRTdXJmYWNlQ29ubmVjdGlvbgorICAgICAgICAgICAgQ29ubmVjdGlvbkJhc2U7CisKKyAgICB0eXBlZGVmIENvZGVjMkNsaWVudDo6SW5wdXRTdXJmYWNlQ29ubmVjdGlvbiBDb25uZWN0aW9uOworCisgICAgdHlwZWRlZiA6OmFuZHJvaWQ6OklHcmFwaGljQnVmZmVyUHJvZHVjZXIgSUdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKKworICAgIGMyX3N0YXR1c190IGNvbm5lY3RUb0NvbXBvbmVudCgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDb21wb25lbnQ+JiBjb21wb25lbnQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Q29ubmVjdGlvbj4qIGNvbm5lY3Rpb24pOworCisgICAgc3RkOjpzaGFyZWRfcHRyPENvbmZpZ3VyYWJsZT4gZ2V0Q29uZmlndXJhYmxlKCkgY29uc3Q7CisKKyAgICBjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgZ2V0R3JhcGhpY0J1ZmZlclByb2R1Y2VyKCkgY29uc3Q7CisKKyAgICAvLyBSZXR1cm4gdGhlIHVuZGVybHlpbmcgSUlucHV0U3VyZmFjZS4KKyAgICBjb25zdCBzcDxCYXNlPiYgZ2V0SGFsSW50ZXJmYWNlKCkgY29uc3Q7CisKKyAgICAvLyBiYXNlIGNhbm5vdCBiZSBudWxsLgorICAgIElucHV0U3VyZmFjZShjb25zdCBzcDxCYXNlPiYgYmFzZSk7CisKK3Byb3RlY3RlZDoKKyAgICBCYXNlKiBiYXNlKCkgY29uc3Q7CisgICAgc3A8QmFzZT4gbUJhc2U7CisKKyAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBtR3JhcGhpY0J1ZmZlclByb2R1Y2VyOworCisgICAgZnJpZW5kIHN0cnVjdCBDb2RlYzJDbGllbnQ7CisgICAgZnJpZW5kIHN0cnVjdCBDb21wb25lbnQ7Cit9OworCitzdHJ1Y3QgQ29kZWMyQ2xpZW50OjpJbnB1dFN1cmZhY2VDb25uZWN0aW9uIHsKKworICAgIHR5cGVkZWYgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOjpWMV8wOjpJSW5wdXRTdXJmYWNlQ29ubmVjdGlvbiBCYXNlOworCisgICAgYzJfc3RhdHVzX3QgZGlzY29ubmVjdCgpOworCisgICAgLy8gYmFzZSBjYW5ub3QgYmUgbnVsbC4KKyAgICBJbnB1dFN1cmZhY2VDb25uZWN0aW9uKGNvbnN0IHNwPEJhc2U+JiBiYXNlKTsKKworcHJvdGVjdGVkOgorICAgIEJhc2UqIGJhc2UoKSBjb25zdDsKKyAgICBzcDxCYXNlPiBtQmFzZTsKKworICAgIGZyaWVuZCBzdHJ1Y3QgQ29kZWMyQ2xpZW50OjpJbnB1dFN1cmZhY2U7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIENPREVDMl9ISURMX0NMSUVOVF9IXworCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2hpZGwvc2VydmljZXMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjU5NzFlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvc2VydmljZXMvQW5kcm9pZC5icApAQCAtMCwwICsxLDk0IEBACitjY19iaW5hcnkgeworICAgIG5hbWU6ICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmMyQDEuMC1zZXJ2aWNlIiwKKyAgICBkZWZhdWx0czogWyJoaWRsX2RlZmF1bHRzIl0sCisgICAgc29jX3NwZWNpZmljOiB0cnVlLAorICAgIHJlbGF0aXZlX2luc3RhbGxfcGF0aDogImh3IiwKKyAgICBzcmNzOiBbCisgICAgICAgICJ2ZW5kb3IuY3BwIiwKKyAgICBdLAorCisgICAgaW5pdF9yYzogWyJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmMyQDEuMC1zZXJ2aWNlLnJjIl0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5jMkAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5vbXhAMS4wIiwKKyAgICAgICAgImxpYmF2c2VydmljZXNfbWluaWphaWxfdmVuZG9yIiwKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJjb2RlYzJfaGlkbEAxLjAiLAorICAgICAgICAibGliY29kZWMyX3ZuZGsiLAorICAgICAgICAibGliaGlkbGJhc2UiLAorICAgICAgICAibGliaGlkbHRyYW5zcG9ydCIsCisgICAgICAgICJsaWJod2JpbmRlciIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfb214IiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X3htbHBhcnNlciIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKKworICAgIGFyY2g6IHsKKyAgICAgICAgYXJtOiB7CisgICAgICAgICAgICByZXF1aXJlZDogWyJjb2RlYzIudmVuZG9yLmJhc2UucG9saWN5Il0sCisgICAgICAgIH0sCisgICAgICAgIHg4NjogeworICAgICAgICAgICAgcmVxdWlyZWQ6IFsiY29kZWMyLnZlbmRvci5iYXNlLnBvbGljeSJdLAorICAgICAgICB9LAorICAgIH0sCisKKyAgICBjb21waWxlX211bHRpbGliOiAiMzIiLAorfQorCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zZXJ2aWNlcmVnaXN0cmFudCIsCisgICAgLy8gbmVlZCB2ZW5kb3IgdmVyc2lvbiBmb3IgdXBkYXRlIHBhY2thZ2luZywgc3lzdGVtIHZlcnNpb24gbWF5IGhhdmUgbW9yZSBkZXBlbmRlbmNpZXMKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorICAgIHNyY3M6IFsKKyAgICAgICAgIkMyU29mdHdhcmVDb2RlY1NlcnZpY2VSZWdpc3RyYW50LmNwcCIsCisgICAgXSwKKworICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJtZWRpYV9oZWFkZXJzIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYzJAMS4wIiwKKyAgICAgICAgImxpYmNvZGVjMl9oaWRsQDEuMCIsCisgICAgICAgICJsaWJjb2RlYzJfdm5kayIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCisKKyAgICAvLyBDb2RlY3MKKyAgICBydW50aW1lX2xpYnM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X2F2Y2RlYyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9hdmNlbmMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfYWFjZGVjIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X2FhY2VuYyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9hbXJuYmRlYyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9hbXJuYmVuYyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9hbXJ3YmRlYyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9hbXJ3YmVuYyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9oZXZjZGVjIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X2c3MTFhbGF3ZGVjIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X2c3MTFtbGF3ZGVjIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X21wZWcyZGVjIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X2gyNjNkZWMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfaDI2M2VuYyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9tcGVnNGRlYyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9tcGVnNGVuYyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9tcDNkZWMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfdm9yYmlzZGVjIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X29wdXNkZWMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfdnA4ZGVjIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3ZwOWRlYyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF92cDhlbmMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfdnA5ZW5jIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3Jhd2RlYyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9mbGFjZGVjIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X2ZsYWNlbmMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfZ3NtZGVjIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3hhYWNkZWMiLAorICAgIF0sCisKKyAgICBjb21waWxlX211bHRpbGliOiAiMzIiLAorfQorCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy9BbmRyb2lkLm1rIGIvbWVkaWEvY29kZWMyL2hpZGwvc2VydmljZXMvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWIyOGU3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvc2VydmljZXMvQW5kcm9pZC5tawpAQCAtMCwwICsxLDI0IEBACitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKKyMgdmVuZG9yIHNlcnZpY2Ugc2VjY29tcCBwb2xpY3kKK2lmZXEgKCQoVEFSR0VUX0FSQ0gpLCQoZmlsdGVyICQoVEFSR0VUX0FSQ0gpLCB4ODYgeDg2XzY0IGFybSBhcm02NCkpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKK0xPQ0FMX01PRFVMRSA6PSBjb2RlYzIudmVuZG9yLmJhc2UucG9saWN5CitMT0NBTF9WRU5ET1JfTU9EVUxFIDo9IHRydWUKK0xPQ0FMX01PRFVMRV9DTEFTUyA6PSBFVEMKK0xPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9WRU5ET1IpL2V0Yy9zZWNjb21wX3BvbGljeQorTE9DQUxfUkVRVUlSRURfTU9EVUxFUyA6PSBjcmFzaF9kdW1wLnBvbGljeQoraWZkZWYgVEFSR0VUXzJORF9BUkNICisgICAgaWZuZXEgKCQoVEFSR0VUX1RSQU5TTEFURV8yTkRfQVJDSCksdHJ1ZSkKKyAgICAgICAgTE9DQUxfU1JDX0ZJTEVTIDo9IHNlY2NvbXBfcG9saWN5L2NvZGVjMi52ZW5kb3IuYmFzZS0kKFRBUkdFVF8yTkRfQVJDSCkucG9saWN5CisgICAgZWxzZQorICAgICAgICBMT0NBTF9TUkNfRklMRVMgOj0gc2VjY29tcF9wb2xpY3kvY29kZWMyLnZlbmRvci5iYXNlLSQoVEFSR0VUX0FSQ0gpLnBvbGljeQorICAgIGVuZGlmCitlbHNlCisgICAgTE9DQUxfU1JDX0ZJTEVTIDo9IHNlY2NvbXBfcG9saWN5L2NvZGVjMi52ZW5kb3IuYmFzZS0kKFRBUkdFVF9BUkNIKS5wb2xpY3kKK2VuZGlmCitpbmNsdWRlICQoQlVJTERfUFJFQlVJTFQpCitlbmRpZgorCitpbmNsdWRlICQoY2FsbCBhbGwtbWFrZWZpbGVzLXVuZGVyLCAkKExPQ0FMX1BBVEgpKQorCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy9DMlNvZnR3YXJlQ29kZWNTZXJ2aWNlUmVnaXN0cmFudC5jcHAgYi9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy9DMlNvZnR3YXJlQ29kZWNTZXJ2aWNlUmVnaXN0cmFudC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTEwYWU2ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL0MyU29mdHdhcmVDb2RlY1NlcnZpY2VSZWdpc3RyYW50LmNwcApAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyU29mdHdhcmVDb2RlY1NlcnZpY2VSZWdpc3RyYW50IgorCisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvQ29tcG9uZW50U3RvcmUuaD4KKyNpbmNsdWRlIDxtZWRpYS9Db2RlY1NlcnZpY2VSZWdpc3RyYW50Lmg+CisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCitleHRlcm4gIkMiIHZvaWQgUmVnaXN0ZXJDb2RlY1NlcnZpY2VzKCkgeworICAgIHVzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YzI6OlYxXzA7CisgICAgYW5kcm9pZDo6c3A8SUNvbXBvbmVudFN0b3JlPiBzdG9yZSA9CisgICAgICAgIG5ldyB1dGlsczo6Q29tcG9uZW50U3RvcmUoCisgICAgICAgICAgICAgICAgYW5kcm9pZDo6R2V0Q29kZWMyUGxhdGZvcm1Db21wb25lbnRTdG9yZSgpKTsKKyAgICBpZiAoc3RvcmUgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiQ2Fubm90IGNyZWF0ZSBDb2RlYzIncyBJQ29tcG9uZW50U3RvcmUgc29mdHdhcmUgc2VydmljZS4iKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoc3RvcmUtPnJlZ2lzdGVyQXNTZXJ2aWNlKCJzb2Z0d2FyZSIpICE9IGFuZHJvaWQ6Ok9LKSB7CisgICAgICAgICAgICBBTE9HRSgiQ2Fubm90IHJlZ2lzdGVyIENvZGVjMidzICIKKyAgICAgICAgICAgICAgICAgICAgIklDb21wb25lbnRTdG9yZSBzb2Z0d2FyZSBzZXJ2aWNlLiIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0koIkNvZGVjMidzIElDb21wb25lbnRTdG9yZSBzb2Z0d2FyZSBzZXJ2aWNlIGNyZWF0ZWQuIik7CisgICAgICAgIH0KKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL2FuZHJvaWQuaGFyZHdhcmUubWVkaWEuYzJAMS4wLXNlcnZpY2UucmMgYi9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy9hbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmMyQDEuMC1zZXJ2aWNlLnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4MDZiZDFmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvc2VydmljZXMvYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5jMkAxLjAtc2VydmljZS5yYwpAQCAtMCwwICsxLDcgQEAKK3NlcnZpY2UgYW5kcm9pZC1oYXJkd2FyZS1tZWRpYS1jMi1oYWwtMS0wIC92ZW5kb3IvYmluL2h3L2FuZHJvaWQuaGFyZHdhcmUubWVkaWEuYzJAMS4wLXNlcnZpY2UKKyAgICBjbGFzcyBoYWwKKyAgICB1c2VyIG1lZGlhY29kZWMKKyAgICBncm91cCBjYW1lcmEgbWVkaWFkcm0gZHJtcnBjCisgICAgaW9wcmlvIHJ0IDQKKyAgICB3cml0ZXBpZCAvZGV2L2NwdXNldC9mb3JlZ3JvdW5kL3Rhc2tzCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL3NlY2NvbXBfcG9saWN5L2NvZGVjMi5zb2Z0d2FyZS5iYXNlLWFybS5wb2xpY3kgYi9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy9zZWNjb21wX3BvbGljeS9jb2RlYzIuc29mdHdhcmUuYmFzZS1hcm0ucG9saWN5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1ODcxZDEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy9zZWNjb21wX3BvbGljeS9jb2RlYzIuc29mdHdhcmUuYmFzZS1hcm0ucG9saWN5CkBAIC0wLDAgKzEsNzMgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyMgT3JnYW5pemVkIGJ5IGZyZXF1ZW5jeSBvZiBzeXN0ZW1jYWxsIC0gaW4gZGVzY2VuZGluZyBvcmRlciBmb3IKKyMgYmVzdCBwZXJmb3JtYW5jZS4KK2Z1dGV4OiAxCitpb2N0bDogMQord3JpdGU6IDEKK3ByY3RsOiAxCitjbG9ja19nZXR0aW1lOiAxCitnZXRwcmlvcml0eTogMQorcmVhZDogMQorY2xvc2U6IDEKK3dyaXRldjogMQorZHVwOiAxCitwcG9sbDogMQorbW1hcDI6IDEKK2dldHJhbmRvbTogMQorCisjIG1yZW1hcDogRW5zdXJlIHxmbGFnc3wgYXJlIChNUkVNQVBfTUFZTU9WRSB8IE1SRU1BUF9GSVhFRCkgVE9ETzogT25jZSBtaW5pamFpbAorIyBwYXJzZXIgc3VwcG9ydCBmb3IgJzwnIGlzIGluIHRoaXMgbmVlZHMgdG8gYmUgbW9kaWZpZWQgdG8gYWxzbyBwcmV2ZW50CisjIHxvbGRfYWRkcmVzc3wgYW5kIHxuZXdfYWRkcmVzc3wgZnJvbSB0b3VjaGluZyB0aGUgZXhjZXB0aW9uIHZlY3RvciBwYWdlLCB3aGljaAorIyBvbiBBUk0gaXMgc3RhdGljYWxseSBsb2FkZWQgYXQgMHhmZmZmIDAwMDAuIFNlZQorIyBodHRwOi8vaW5mb2NlbnRlci5hcm0uY29tL2hlbHAvaW5kZXguanNwP3RvcGljPS9jb20uYXJtLmRvYy5kZGkwMjExaC9CYWJmZWVnYS5odG1sCisjIGZvciBtb3JlIGRldGFpbHMuCittcmVtYXA6IGFyZzMgPT0gMworbXVubWFwOiAxCittcHJvdGVjdDogMQorbWFkdmlzZTogMQorb3BlbmF0OiAxCitzaWdhbHRzdGFjazogMQorY2xvbmU6IDEKK3NldHByaW9yaXR5OiAxCitnZXR1aWQzMjogMQorZnN0YXQ2NDogMQorZnN0YXRmczY0OiAxCitwcmVhZDY0OiAxCitmYWNjZXNzYXQ6IDEKK3JlYWRsaW5rYXQ6IDEKK2V4aXQ6IDEKK3J0X3NpZ3Byb2NtYXNrOiAxCitzZXRfdGlkX2FkZHJlc3M6IDEKK3Jlc3RhcnRfc3lzY2FsbDogMQorZXhpdF9ncm91cDogMQorcnRfc2lncmV0dXJuOiAxCitwaXBlMjogMQorZ2V0dGltZW9mZGF5OiAxCitzY2hlZF95aWVsZDogMQorbmFub3NsZWVwOiAxCitsc2VlazogMQorX2xsc2VlazogMQorc2NoZWRfZ2V0X3ByaW9yaXR5X21heDogMQorc2NoZWRfZ2V0X3ByaW9yaXR5X21pbjogMQorc3RhdGZzNjQ6IDEKK3NjaGVkX3NldHNjaGVkdWxlcjogMQorZnN0YXRhdDY0OiAxCit1Z2V0cmxpbWl0OiAxCitnZXRkZW50czY0OiAxCitnZXRyYW5kb206IDEKKworQGluY2x1ZGUgL3N5c3RlbS9ldGMvc2VjY29tcF9wb2xpY3kvY3Jhc2hfZHVtcC5hcm0ucG9saWN5CisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL3NlY2NvbXBfcG9saWN5L2NvZGVjMi5zb2Z0d2FyZS5iYXNlLXg4Ni5wb2xpY3kgYi9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy9zZWNjb21wX3BvbGljeS9jb2RlYzIuc29mdHdhcmUuYmFzZS14ODYucG9saWN5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwYzc2MjUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy9zZWNjb21wX3BvbGljeS9jb2RlYzIuc29mdHdhcmUuYmFzZS14ODYucG9saWN5CkBAIC0wLDAgKzEsNTcgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3JlYWQ6IDEKK21wcm90ZWN0OiAxCitwcmN0bDogMQorb3BlbmF0OiAxCitnZXR1aWQzMjogMQord3JpdGV2OiAxCitpb2N0bDogMQorY2xvc2U6IDEKK21tYXAyOiAxCitmc3RhdDY0OiAxCittYWR2aXNlOiAxCitmc3RhdGF0NjQ6IDEKK2Z1dGV4OiAxCittdW5tYXA6IDEKK2ZhY2Nlc3NhdDogMQorX2xsc2VlazogMQorbHNlZWs6IDEKK2Nsb25lOiAxCitzaWdhbHRzdGFjazogMQorc2V0cHJpb3JpdHk6IDEKK3Jlc3RhcnRfc3lzY2FsbDogMQorZXhpdDogMQorZXhpdF9ncm91cDogMQorcnRfc2lncmV0dXJuOiAxCit1Z2V0cmxpbWl0OiAxCityZWFkbGlua2F0OiAxCitfbGxzZWVrOiAxCitmc3RhdGZzNjQ6IDEKK3ByZWFkNjQ6IDEKK21yZW1hcDogMQorZHVwOiAxCitzZXRfdGlkX2FkZHJlc3M6IDEKK3dyaXRlOiAxCituYW5vc2xlZXA6IDEKKworIyBSZXF1aXJlZCBieSBBZGRyZXNzU2FuaXRpemVyCitnZXR0aWQ6IDEKK3NjaGVkX3lpZWxkOiAxCitnZXRwaWQ6IDEKK2dldHRpZDogMQorCitAaW5jbHVkZSAvc3lzdGVtL2V0Yy9zZWNjb21wX3BvbGljeS9jcmFzaF9kdW1wLng4Ni5wb2xpY3kKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvc2VydmljZXMvc2VjY29tcF9wb2xpY3kvY29kZWMyLnZlbmRvci5iYXNlLWFybS5wb2xpY3kgYi9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy9zZWNjb21wX3BvbGljeS9jb2RlYzIudmVuZG9yLmJhc2UtYXJtLnBvbGljeQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTg3MWQxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvc2VydmljZXMvc2VjY29tcF9wb2xpY3kvY29kZWMyLnZlbmRvci5iYXNlLWFybS5wb2xpY3kKQEAgLTAsMCArMSw3MyBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIyBPcmdhbml6ZWQgYnkgZnJlcXVlbmN5IG9mIHN5c3RlbWNhbGwgLSBpbiBkZXNjZW5kaW5nIG9yZGVyIGZvcgorIyBiZXN0IHBlcmZvcm1hbmNlLgorZnV0ZXg6IDEKK2lvY3RsOiAxCit3cml0ZTogMQorcHJjdGw6IDEKK2Nsb2NrX2dldHRpbWU6IDEKK2dldHByaW9yaXR5OiAxCityZWFkOiAxCitjbG9zZTogMQord3JpdGV2OiAxCitkdXA6IDEKK3Bwb2xsOiAxCittbWFwMjogMQorZ2V0cmFuZG9tOiAxCisKKyMgbXJlbWFwOiBFbnN1cmUgfGZsYWdzfCBhcmUgKE1SRU1BUF9NQVlNT1ZFIHwgTVJFTUFQX0ZJWEVEKSBUT0RPOiBPbmNlIG1pbmlqYWlsCisjIHBhcnNlciBzdXBwb3J0IGZvciAnPCcgaXMgaW4gdGhpcyBuZWVkcyB0byBiZSBtb2RpZmllZCB0byBhbHNvIHByZXZlbnQKKyMgfG9sZF9hZGRyZXNzfCBhbmQgfG5ld19hZGRyZXNzfCBmcm9tIHRvdWNoaW5nIHRoZSBleGNlcHRpb24gdmVjdG9yIHBhZ2UsIHdoaWNoCisjIG9uIEFSTSBpcyBzdGF0aWNhbGx5IGxvYWRlZCBhdCAweGZmZmYgMDAwMC4gU2VlCisjIGh0dHA6Ly9pbmZvY2VudGVyLmFybS5jb20vaGVscC9pbmRleC5qc3A/dG9waWM9L2NvbS5hcm0uZG9jLmRkaTAyMTFoL0JhYmZlZWdhLmh0bWwKKyMgZm9yIG1vcmUgZGV0YWlscy4KK21yZW1hcDogYXJnMyA9PSAzCittdW5tYXA6IDEKK21wcm90ZWN0OiAxCittYWR2aXNlOiAxCitvcGVuYXQ6IDEKK3NpZ2FsdHN0YWNrOiAxCitjbG9uZTogMQorc2V0cHJpb3JpdHk6IDEKK2dldHVpZDMyOiAxCitmc3RhdDY0OiAxCitmc3RhdGZzNjQ6IDEKK3ByZWFkNjQ6IDEKK2ZhY2Nlc3NhdDogMQorcmVhZGxpbmthdDogMQorZXhpdDogMQorcnRfc2lncHJvY21hc2s6IDEKK3NldF90aWRfYWRkcmVzczogMQorcmVzdGFydF9zeXNjYWxsOiAxCitleGl0X2dyb3VwOiAxCitydF9zaWdyZXR1cm46IDEKK3BpcGUyOiAxCitnZXR0aW1lb2ZkYXk6IDEKK3NjaGVkX3lpZWxkOiAxCituYW5vc2xlZXA6IDEKK2xzZWVrOiAxCitfbGxzZWVrOiAxCitzY2hlZF9nZXRfcHJpb3JpdHlfbWF4OiAxCitzY2hlZF9nZXRfcHJpb3JpdHlfbWluOiAxCitzdGF0ZnM2NDogMQorc2NoZWRfc2V0c2NoZWR1bGVyOiAxCitmc3RhdGF0NjQ6IDEKK3VnZXRybGltaXQ6IDEKK2dldGRlbnRzNjQ6IDEKK2dldHJhbmRvbTogMQorCitAaW5jbHVkZSAvc3lzdGVtL2V0Yy9zZWNjb21wX3BvbGljeS9jcmFzaF9kdW1wLmFybS5wb2xpY3kKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvc2VydmljZXMvc2VjY29tcF9wb2xpY3kvY29kZWMyLnZlbmRvci5iYXNlLXg4Ni5wb2xpY3kgYi9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy9zZWNjb21wX3BvbGljeS9jb2RlYzIudmVuZG9yLmJhc2UteDg2LnBvbGljeQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGM3NjI1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvc2VydmljZXMvc2VjY29tcF9wb2xpY3kvY29kZWMyLnZlbmRvci5iYXNlLXg4Ni5wb2xpY3kKQEAgLTAsMCArMSw1NyBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcmVhZDogMQorbXByb3RlY3Q6IDEKK3ByY3RsOiAxCitvcGVuYXQ6IDEKK2dldHVpZDMyOiAxCit3cml0ZXY6IDEKK2lvY3RsOiAxCitjbG9zZTogMQorbW1hcDI6IDEKK2ZzdGF0NjQ6IDEKK21hZHZpc2U6IDEKK2ZzdGF0YXQ2NDogMQorZnV0ZXg6IDEKK211bm1hcDogMQorZmFjY2Vzc2F0OiAxCitfbGxzZWVrOiAxCitsc2VlazogMQorY2xvbmU6IDEKK3NpZ2FsdHN0YWNrOiAxCitzZXRwcmlvcml0eTogMQorcmVzdGFydF9zeXNjYWxsOiAxCitleGl0OiAxCitleGl0X2dyb3VwOiAxCitydF9zaWdyZXR1cm46IDEKK3VnZXRybGltaXQ6IDEKK3JlYWRsaW5rYXQ6IDEKK19sbHNlZWs6IDEKK2ZzdGF0ZnM2NDogMQorcHJlYWQ2NDogMQorbXJlbWFwOiAxCitkdXA6IDEKK3NldF90aWRfYWRkcmVzczogMQord3JpdGU6IDEKK25hbm9zbGVlcDogMQorCisjIFJlcXVpcmVkIGJ5IEFkZHJlc3NTYW5pdGl6ZXIKK2dldHRpZDogMQorc2NoZWRfeWllbGQ6IDEKK2dldHBpZDogMQorZ2V0dGlkOiAxCisKK0BpbmNsdWRlIC9zeXN0ZW0vZXRjL3NlY2NvbXBfcG9saWN5L2NyYXNoX2R1bXAueDg2LnBvbGljeQorCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy92ZW5kb3IuY3BwIGIvbWVkaWEvY29kZWMyL2hpZGwvc2VydmljZXMvdmVuZG9yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjJmOThlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvc2VydmljZXMvdmVuZG9yLmNwcApAQCAtMCwwICsxLDE1MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmMyQDEuMC1zZXJ2aWNlIgorCisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvMS4wL0NvbXBvbmVudFN0b3JlLmg+CisjaW5jbHVkZSA8aGlkbC9IaWRsVHJhbnNwb3J0U3VwcG9ydC5oPgorI2luY2x1ZGUgPGJpbmRlci9Qcm9jZXNzU3RhdGUuaD4KKyNpbmNsdWRlIDxtaW5pamFpbC5oPgorCisjaW5jbHVkZSA8QzJDb21wb25lbnQuaD4KKworLy8gT214U3RvcmUgaXMgYWRkZWQgZm9yIHZpc2liaWxpdHkgYnkgZHVtcHN0YXRlLgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvT214U3RvcmUuaD4KKworLy8gVGhpcyBpcyBjcmVhdGVkIGJ5IG1vZHVsZSAiY29kZWMyLnZlbmRvci5iYXNlLnBvbGljeSIuIFRoaXMgY2FuIGJlIG1vZGlmaWVkLgorc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtCYXNlU2VjY29tcFBvbGljeVBhdGhbXSA9CisgICAgICAgICIvdmVuZG9yL2V0Yy9zZWNjb21wX3BvbGljeS9jb2RlYzIudmVuZG9yLmJhc2UucG9saWN5IjsKKworLy8gQWRkaXRpb25hbCBkZXZpY2Utc3BlY2lmaWMgc2VjY29tcCBwZXJtaXNzaW9ucyBjYW4gYmUgYWRkZWQgaW4gdGhpcyBmaWxlLgorc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtFeHRTZWNjb21wUG9saWN5UGF0aFtdID0KKyAgICAgICAgIi92ZW5kb3IvZXRjL3NlY2NvbXBfcG9saWN5L2NvZGVjMi52ZW5kb3IuZXh0LnBvbGljeSI7CisKK2NsYXNzIER1bW15QzJTdG9yZSA6IHB1YmxpYyBDMkNvbXBvbmVudFN0b3JlIHsKK3B1YmxpYzoKKyAgICBEdW1teUMyU3RvcmUoKSA9IGRlZmF1bHQ7CisKKyAgICB2aXJ0dWFsIH5EdW1teUMyU3RvcmUoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgICB2aXJ0dWFsIEMyU3RyaW5nIGdldE5hbWUoKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiAiZGVmYXVsdCI7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVDb21wb25lbnQoCisgICAgICAgICAgICBDMlN0cmluZyAvKm5hbWUqLywKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4qIGNvbnN0IC8qY29tcG9uZW50Ki8pIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIEMyX05PVF9GT1VORDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgICAgIEMyU3RyaW5nIC8qIG5hbWUgKi8sCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KiBjb25zdCAvKiBpbnRlcmZhY2UgKi8pIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIEMyX05PVF9GT1VORDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkNvbXBvbmVudDo6VHJhaXRzPj4KKyAgICAgICAgICAgIGxpc3RDb21wb25lbnRzKCkgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4ge307CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjb3B5QnVmZmVyKAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0J1ZmZlcj4gLyogc3JjICovLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0J1ZmZlcj4gLyogZHN0ICovKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcXVlcnlfc20oCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiYgLyogc3RhY2tQYXJhbXMgKi8sCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiYgLyogaGVhcFBhcmFtSW5kaWNlcyAqLywKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiogY29uc3QgLyogaGVhcFBhcmFtcyAqLykgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNvbmZpZ19zbSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiYgLyogcGFyYW1zICovLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+KiBjb25zdCAvKiBmYWlsdXJlcyAqLykgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiBnZXRQYXJhbVJlZmxlY3RvcigpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeVN1cHBvcnRlZFBhcmFtc19uYigKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4+KiBjb25zdCAvKiBwYXJhbXMgKi8pIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeVN1cHBvcnRlZFZhbHVlc19zbSgKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeT4mIC8qIGZpZWxkcyAqLykgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9Cit9OworCitpbnQgbWFpbihpbnQgLyogYXJnYyAqLywgY2hhcioqIC8qIGFyZ3YgKi8pIHsKKyAgICBBTE9HRCgiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5jMkAxLjAtc2VydmljZSBzdGFydGluZy4uLiIpOworCisgICAgc2lnbmFsKFNJR1BJUEUsIFNJR19JR04pOworICAgIGFuZHJvaWQ6OlNldFVwTWluaWphaWwoa0Jhc2VTZWNjb21wUG9saWN5UGF0aCwga0V4dFNlY2NvbXBQb2xpY3lQYXRoKTsKKworICAgIC8vIHZuZGJpbmRlciBpcyBuZWVkZWQgYnkgQnVmZmVyUXVldWUuCisgICAgYW5kcm9pZDo6UHJvY2Vzc1N0YXRlOjppbml0V2l0aERyaXZlcigiL2Rldi92bmRiaW5kZXIiKTsKKyAgICBhbmRyb2lkOjpQcm9jZXNzU3RhdGU6OnNlbGYoKS0+c3RhcnRUaHJlYWRQb29sKCk7CisKKyAgICAvLyBFeHRyYSB0aHJlYWRzIG1heSBiZSBuZWVkZWQgdG8gaGFuZGxlIGEgc3RhY2tlZCBJUEMgc2VxdWVuY2UgdGhhdAorICAgIC8vIGNvbnRhaW5zIGFsdGVybmF0aW5nIGJpbmRlciBhbmQgaHdiaW5kZXIgY2FsbHMuIChTZWUgYi8zNTI4MzQ4MC4pCisgICAgYW5kcm9pZDo6aGFyZHdhcmU6OmNvbmZpZ3VyZVJwY1RocmVhZHBvb2woOCwgdHJ1ZSAvKiBjYWxsZXJXaWxsSm9pbiAqLyk7CisKKyAgICAvLyBDcmVhdGUgSUNvbXBvbmVudFN0b3JlIHNlcnZpY2UuCisgICAgeworICAgICAgICB1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOjpWMV8wOworICAgICAgICBhbmRyb2lkOjpzcDxJQ29tcG9uZW50U3RvcmU+IHN0b3JlOworCisgICAgICAgIC8vIFZlbmRvcidzIFRPRE86IFJlcGxhY2UgdGhpcyB3aXRoCisgICAgICAgIC8vIHN0b3JlID0gbmV3IHV0aWxzOjpDb21wb25lbnRTdG9yZSgKKyAgICAgICAgLy8gICAgICAgICAvKiBpbXBsZW1lbnRhdGlvbiBvZiBDMkNvbXBvbmVudFN0b3JlICovKTsKKyAgICAgICAgQUxPR0QoIkluc3RhbnRpYXRpbmcgQ29kZWMyJ3MgZHVtbXkgSUNvbXBvbmVudFN0b3JlIHNlcnZpY2UuLi4iKTsKKyAgICAgICAgc3RvcmUgPSBuZXcgdXRpbHM6OkNvbXBvbmVudFN0b3JlKAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8RHVtbXlDMlN0b3JlPigpKTsKKworICAgICAgICBpZiAoc3RvcmUgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0UoIkNhbm5vdCBjcmVhdGUgQ29kZWMyJ3MgSUNvbXBvbmVudFN0b3JlIHNlcnZpY2UuIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoc3RvcmUtPnJlZ2lzdGVyQXNTZXJ2aWNlKCJkZWZhdWx0IikgIT0gYW5kcm9pZDo6T0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiQ2Fubm90IHJlZ2lzdGVyIENvZGVjMidzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJJQ29tcG9uZW50U3RvcmUgc2VydmljZS4iKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR0koIkNvZGVjMidzIElDb21wb25lbnRTdG9yZSBzZXJ2aWNlIGNyZWF0ZWQuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBSZWdpc3RlciBJT214U3RvcmUgc2VydmljZS4KKyAgICB7CisgICAgICAgIHVzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6b214OjpWMV8wOworICAgICAgICBhbmRyb2lkOjpzcDxJT214U3RvcmU+IG9teFN0b3JlID0gbmV3IGltcGxlbWVudGF0aW9uOjpPbXhTdG9yZSgpOworICAgICAgICBpZiAob214U3RvcmUgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0UoIkNhbm5vdCBjcmVhdGUgSU9teFN0b3JlIEhBTCBzZXJ2aWNlLiIpOworICAgICAgICB9IGVsc2UgaWYgKG9teFN0b3JlLT5yZWdpc3RlckFzU2VydmljZSgpICE9IGFuZHJvaWQ6Ok9LKSB7CisgICAgICAgICAgICBBTE9HRSgiQ2Fubm90IHJlZ2lzdGVyIElPbXhTdG9yZSBIQUwgc2VydmljZS4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGFuZHJvaWQ6OmhhcmR3YXJlOjpqb2luUnBjVGhyZWFkcG9vbCgpOworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2luY2x1ZGUvQzIuaCBiL21lZGlhL2NvZGVjMi9pbmNsdWRlL0MyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE1NWY4ZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9pbmNsdWRlL0MyLmgKQEAgLTAsMCArMSw1NTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEMyX0hfCisjZGVmaW5lIEMyX0hfCisKKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaW5jbHVkZSA8c3RyaW5nPgorCisvKiogbmFub3NlY29uZHMgd2l0aCBhcmJpdHJhcnkgb3JpZ2luLiAqLwordHlwZWRlZiBpbnQ2NF90IGMyX25zZWNzX3Q7CisKKy8qKiBcbWFpbnBhZ2UgQ29kZWMyCisgKgorICogQ29kZWMyIGlzIGEgZ2VuZXJpYyBmcmFtZS1iYXNlZCBkYXRhIHByb2Nlc3NpbmcgQVBJLgorICoKKyAqIFRoZSBtZWRpYSBzdWJzeXN0ZW0gYWNjZXNzZXMgY29tcG9uZW50cyB2aWEgdGhlIFxyZWYgQVBJLgorICovCisKKy8qKiBcaW5ncm91cCBBUEkKKyAqCisgKiBUaGUgQ29kZWMyIEFQSSBkZWZpbmVzIHRoZSBvcGVyYXRpb24gb2YgZGF0YSBwcm9jZXNzaW5nIGNvbXBvbmVudHMgYW5kIHRoZWlyIGludGVyYWN0aW9uIHdpdGgKKyAqIHRoZSByZXN0IG9mIHRoZSBzeXN0ZW0uCisgKgorICogQ29kaW5nIENvbnZlbnRpb25zCisgKgorICogTWl0aWdhdGluZyBCaW5hcnkgQ29tcGF0aWJpbGl0eS4KKyAqCisgKiBXaGlsZSBmdWxsIGJpbmFyeSBjb21wYXRpYmlsaXR5IGlzIG5vdCBhIGdvYWwgb2YgdGhlIEFQSSAoZHVlIHRvIG91ciB1c2Ugb2YgU1RMKSwgd2UgdHJ5IHRvCisgKiBtaXRpZ2F0ZSBiaW5hcnkgYnJlYWtzIGJ5IGFkaGVyaW5nIHRvIHRoZSBmb2xsb3dpbmcgY29udmVudGlvbnM6CisgKgorICogLSBhdCBtb3N0IG9uZSB2dGFibGUgd2l0aCBwbGFjZWhvbGRlciB2aXJ0dWFsIG1ldGhvZHMKKyAqIC0gYWxsIG9wdGlvbmFsL3BsYWNlaG9sZGVyIHZpcnR1YWwgbWV0aG9kcyByZXR1cm5pbmcgYSBjMl9zdGF0dXNfdCwgd2l0aCBDMl9PTUlUVEVEIG5vdCByZXF1aXJpbmcKKyAqICAgYW55IHVwZGF0ZSB0byBpbnB1dC9vdXRwdXQgYXJndW1lbnRzLgorICogLSBsaW1pdGluZyBzeW1ib2wgZXhwb3J0IG9mIGlubGluZSBtZXRob2RzCisgKiAtIHVzZSBvZiBwaW1wbCAob3Igc2hhcmVkLXBpbXBsKQorICoKKyAqIE5hbWluZworICoKKyAqIC0gYWxsIGNsYXNzZXMgYW5kIHR5cGVzIHByZWZpeCB3aXRoIEMyCisgKiAtIGNsYXNzZXMgZm9yIGludGVybmFsIHVzZSBwcmVmaXggd2l0aCBfQzIKKyAqIC0gZW51bSB2YWx1ZXMgaW4gZ2xvYmFsIG5hbWVzcGFjZSBwcmVmaXggd2l0aCBDMl8gYWxsIGNhcHMKKyAqIC0gZW51bSB2YWx1ZXMgaW5zaWRlIGNsYXNzZXMgaGF2ZSBubyBDMl8gcHJlZml4IGFzIGNsYXNzIGFscmVhZHkgaGFzIGl0CisgKiAtIHN1cHBvcnRpbmcgdHdvIGtpbmRzIG9mIGVudW0gbmFtaW5nOiBhbGwtY2FwcyBhbmQga0NhbWVsQ2FzZQorICogXHRvZG8gcmV2aXNpdCBrQ2FtZWxDYXNlIGZvciBwYXJhbS10eXBlCisgKgorICogQXNwZWN0cworICoKKyAqIEFzcGVjdHMgZGVmaW5lIGNlcnRhaW4gY29tbW9uIGJlaGF2aW9yIGFjcm9zcyBhIGdyb3VwIG9mIG9iamVjdHMuCisgKiAtIGNsYXNzZXMgd2hvc2UgbmFtZSBtYXRjaGVzIF9DMi4qQXNwZWN0CisgKiAtIG9ubHkgcHJvdGVjdGVkIGNvbnN0cnVjdG9ycworICogLSBubyBkZXNjdHJ1Y3RvciBhbmQgY29waWFibGUKKyAqIC0gYWxsIG1ldGhvZHMgYXJlIGlubGluZSBvciBzdGF0aWMgKHRoaXMgaXMgb3Bwb3NpdGUgb2YgdGhlIGludGVyZmFjZSBwYXJhZGlnbSB3aGVyZSBhbGwgbWV0aG9kcworICogICBhcmUgdmlydHVhbCwgd2hpY2ggd291bGQgbm90IHdvcmsgZHVlIHRvIHRoZSBhdCBtb3N0IG9uZSB2dGFibGUgcnVsZS4pCisgKiAtIG9ubHkgcHJpdmF0ZSB2YXJpYWJsZXMgKHRoaXMgcHJldmVudHMgc3ViY2xhc3NlcyBpbnRlcmZlcmluZyB3aXRoIHRoZSBhc3BlY3RzLikKKyAqLworCisvLy8gXGRlZmdyb3VwIHR5cGVzIENvbW1vbiBUeXBlcworLy8vIEB7CisKKy8qKgorICogQzJTdHJpbmc6IGJhc2ljIHN0cmluZyBpbXBsZW1lbnRhdGlvbgorICovCit0eXBlZGVmIHN0ZDo6c3RyaW5nIEMyU3RyaW5nOworCisvKioKKyAqIEMyU3RyaW5nTGl0ZXJhbDogYmFzaWMgc3RyaW5nIGxpdGVyYWwgaW1wbGVtZW50YXRpb24uCisgKiBcbm90ZSB0aGVzZSBhcmUgbmV2ZXIgb3duZWQgYnkgYW55IG9iamVjdCwgYW5kIGNhbiBvbmx5IHJlZmVyIHRvIEMgc3RyaW5nIGxpdGVyYWxzLgorICovCit0eXBlZGVmIGNvbnN0IGNoYXIgKkMyU3RyaW5nTGl0ZXJhbDsKKworLyoqCisgKiBjMl9zdGF0dXNfdDogc3RhdHVzIGNvZGVzIHVzZWQuCisgKi8KK2VudW0gYzJfc3RhdHVzX3QgOiBpbnQzMl90IHsKKy8qCisgKiBVc2UgUE9TSVggZXJybm8gY29uc3RhbnRzLgorICovCisgICAgQzJfT0sgICAgICAgID0gMCwgICAgICAgICAgICAvLy88IG9wZXJhdGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5CisKKyAgICAvLyBiYWQgaW5wdXQKKyAgICBDMl9CQURfVkFMVUUgPSBFSU5WQUwsICAgICAgIC8vLzwgYXJndW1lbnQgaGFzIGludmFsaWQgdmFsdWUgKHVzZXIgZXJyb3IpCisgICAgQzJfQkFEX0lOREVYID0gRU5YSU8sICAgICAgICAvLy88IGFyZ3VtZW50IHVzZXMgaW52YWxpZCBpbmRleCAodXNlciBlcnJvcikKKyAgICBDMl9DQU5OT1RfRE8gPSBFTk9UU1VQLCAgICAgIC8vLzwgYXJndW1lbnQvaW5kZXggaXMgdmFsaWQgYnV0IG5vdCBwb3NzaWJsZQorCisgICAgLy8gYmFkIHNlcXVlbmNpbmcgb2YgZXZlbnRzCisgICAgQzJfRFVQTElDQVRFID0gRUVYSVNULCAgICAgICAvLy88IG9iamVjdCBhbHJlYWR5IGV4aXN0cworICAgIEMyX05PVF9GT1VORCA9IEVOT0VOVCwgICAgICAgLy8vPCBvYmplY3Qgbm90IGZvdW5kCisgICAgQzJfQkFEX1NUQVRFID0gRVBFUk0sICAgICAgICAvLy88IG9wZXJhdGlvbiBpcyBub3QgcGVybWl0dGVkIGluIHRoZSBjdXJyZW50IHN0YXRlCisgICAgQzJfQkxPQ0tJTkcgID0gRVdPVUxEQkxPQ0ssICAvLy88IG9wZXJhdGlvbiB3b3VsZCBibG9jayBidXQgYmxvY2tpbmcgaXMgbm90IHBlcm1pdHRlZAorICAgIEMyX0NBTkNFTEVEICA9IEVJTlRSLCAgICAgICAgLy8vPCBvcGVyYXRpb24gaW50ZXJydXB0ZWQvY2FuY2VsZWQKKworICAgIC8vIGJhZCBlbnZpcm9ubWVudAorICAgIEMyX05PX01FTU9SWSA9IEVOT01FTSwgICAgICAgLy8vPCBub3QgZW5vdWdoIG1lbW9yeSB0byBjb21wbGV0ZSBvcGVyYXRpb24KKyAgICBDMl9SRUZVU0VEICAgPSBFQUNDRVMsICAgICAgIC8vLzwgbWlzc2luZyBwZXJtaXNzaW9uIHRvIGNvbXBsZXRlIG9wZXJhdGlvbgorCisgICAgQzJfVElNRURfT1VUID0gRVRJTUVET1VULCAgICAvLy88IG9wZXJhdGlvbiBkaWQgbm90IGNvbXBsZXRlIHdpdGhpbiB0aW1lb3V0CisKKyAgICAvLyBiYWQgdmVyc2lvbmluZworICAgIEMyX09NSVRURUQgICA9IEVOT1NZUywgICAgICAgLy8vPCBvcGVyYXRpb24gaXMgbm90IGltcGxlbWVudGVkL3N1cHBvcnRlZCAob3B0aW9uYWwgb25seSkKKworICAgIC8vIHVua25vd24gZmF0YWwKKyAgICBDMl9DT1JSVVBURUQgPSBFRkFVTFQsICAgICAgIC8vLzwgc29tZSB1bmV4cGVjdGVkIGVycm9yIHByZXZlbnRlZCB0aGUgb3BlcmF0aW9uCisgICAgQzJfTk9fSU5JVCAgID0gRU5PREVWLCAgICAgICAvLy88IHN0YXR1cyBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQKK307CisKKy8qKgorICogVHlwZSB0aGF0IGRlc2NyaWJlcyB0aGUgZGVzaXJlZCBibG9ja2luZyBiZWhhdmlvciBmb3IgdmFyaWFibGUgYmxvY2tpbmcgY2FsbHMuIEJsb2NraW5nIGluIHRoaXMKKyAqIEFQSSBpcyB1c2VkIGluIGEgc29tZXdoYXQgbW9kaWZpZWQgbWVhbmluZyBzdWNoIHRoYXQgb3BlcmF0aW9ucyB0aGF0IG1lcmVseSB1cGRhdGUgdmFyaWFibGVzCisgKiBwcm90ZWN0ZWQgYnkgbXV0ZXhlcyBhcmUgc3RpbGwgY29uc2lkZXJlZCAibm9uLWJsb2NraW5nIiAoYWx3YXlzIHVzZWQgaW4gcXVvdGVzKS4KKyAqLworZW51bSBjMl9ibG9ja2luZ190IDogaW50MzJfdCB7CisgICAgLyoqCisgICAgICogVGhlIG9wZXJhdGlvbiBTSEFMTCBiZSAibm9uLWJsb2NraW5nIi4gVGhpcyBtZWFucyB0aGF0IGl0IHNoYWxsIG5vdCBwZXJmb3JtIGFueSBmaWxlCisgICAgICogb3BlcmF0aW9ucywgb3IgY2FsbC93YWl0IG9uIG90aGVyIHByb2Nlc3Nlcy4gSXQgbWF5IHVzZSBhIHByb3RlY3RlZCByZWdpb24gYXMgbG9uZyBhcyB0aGUKKyAgICAgKiBtdXRleCBpcyBuZXZlciB1c2VkIHRvIHByb3RlY3QgY29kZSB0aGF0IGlzIG90aGVyd2lzZSAibWF5IGJsb2NrIi4KKyAgICAgKi8KKyAgICBDMl9ET05UX0JMT0NLID0gZmFsc2UsCisgICAgLyoqCisgICAgICogVGhlIG9wZXJhdGlvbiBNQVkgYmUgdGVtcG9yYXJpbHkgYmxvY2tpbmcuCisgICAgICovCisgICAgQzJfTUFZX0JMT0NLID0gdHJ1ZSwKK307CisKKy8vLyBAfQorCisvLy8gXGRlZmdyb3VwIHV0aWxzIFV0aWxpdGllcworLy8vIEB7CisKKyNkZWZpbmUgQzJfRE9fTk9UX0NPUFkodHlwZSkgXAorICAgIHR5cGUmIG9wZXJhdG9yPShjb25zdCB0eXBlICYpID0gZGVsZXRlOyBcCisgICAgdHlwZShjb25zdCB0eXBlICYpID0gZGVsZXRlOyBcCisKKyNkZWZpbmUgQzJfREVGQVVMVF9NT1ZFKHR5cGUpIFwKKyAgICB0eXBlJiBvcGVyYXRvcj0odHlwZSAmJikgPSBkZWZhdWx0OyBcCisgICAgdHlwZSh0eXBlICYmKSA9IGRlZmF1bHQ7IFwKKworI2RlZmluZSBDMl9BTExPV19PVkVSRkxPVyBfX2F0dHJpYnV0ZV9fKChub19zYW5pdGl6ZSgiaW50ZWdlciIpKSkKKyNkZWZpbmUgQzJfQ09OU1QgICAgX19hdHRyaWJ1dGVfXygoY29uc3QpKQorI2RlZmluZSBDMl9ISURFICAgICBfX2F0dHJpYnV0ZV9fKCh2aXNpYmlsaXR5KCJoaWRkZW4iKSkpCisjZGVmaW5lIEMyX0lOTElORSAgIGlubGluZSBDMl9ISURFCisjZGVmaW5lIEMyX0lOVEVSTkFMIF9fYXR0cmlidXRlX18oKGludGVybmFsX2xpbmthZ2UpKQorI2RlZmluZSBDMl9QQUNLICAgICBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDQpKSkKKyNkZWZpbmUgQzJfUFVSRSAgICAgX19hdHRyaWJ1dGVfXygocHVyZSkpCisKKyNkZWZpbmUgREVGSU5FX09USEVSX0NPTVBBUklTT05fT1BFUkFUT1JTKHR5cGUpIFwKKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IHR5cGUgJm90aGVyKSBjb25zdCB7IHJldHVybiAhKCp0aGlzID09IG90aGVyKTsgfSBcCisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I8PShjb25zdCB0eXBlICZvdGhlcikgY29uc3QgeyByZXR1cm4gKCp0aGlzID09IG90aGVyKSB8fCAoKnRoaXMgPCBvdGhlcik7IH0gXAorICAgIGlubGluZSBib29sIG9wZXJhdG9yPj0oY29uc3QgdHlwZSAmb3RoZXIpIGNvbnN0IHsgcmV0dXJuICEoKnRoaXMgPCBvdGhlcik7IH0gXAorICAgIGlubGluZSBib29sIG9wZXJhdG9yPihjb25zdCB0eXBlICZvdGhlcikgY29uc3QgeyByZXR1cm4gISgqdGhpcyA8IG90aGVyKSAmJiAhKCp0aGlzID09IG90aGVyKTsgfQorCisjZGVmaW5lIERFRklORV9GSUVMRF9CQVNFRF9DT01QQVJJU09OX09QRVJBVE9SUyh0eXBlLCBmaWVsZCkgXAorICAgIGlubGluZSBib29sIG9wZXJhdG9yPChjb25zdCB0eXBlICZvdGhlcikgY29uc3QgeyByZXR1cm4gZmllbGQgPCBvdGhlci5maWVsZDsgfSBcCisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCB0eXBlICZvdGhlcikgY29uc3QgeyByZXR1cm4gZmllbGQgPT0gb3RoZXIuZmllbGQ7IH0gXAorICAgIERFRklORV9PVEhFUl9DT01QQVJJU09OX09QRVJBVE9SUyh0eXBlKQorCisjZGVmaW5lIERFRklORV9GSUVMRF9BTkRfTUFTS19CQVNFRF9DT01QQVJJU09OX09QRVJBVE9SUyh0eXBlLCBmaWVsZCwgbWFzaykgXAorICAgIGlubGluZSBib29sIG9wZXJhdG9yPChjb25zdCB0eXBlICZvdGhlcikgY29uc3QgeyBcCisgICAgICAgIHJldHVybiAoZmllbGQgJiBtYXNrKSA8IChvdGhlci5maWVsZCAmIChtYXNrKSk7IFwKKyAgICB9IFwKKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IHR5cGUgJm90aGVyKSBjb25zdCB7IFwKKyAgICAgICAgcmV0dXJuIChmaWVsZCAmIG1hc2spID09IChvdGhlci5maWVsZCAmIChtYXNrKSk7IFwKKyAgICB9IFwKKyAgICBERUZJTkVfT1RIRVJfQ09NUEFSSVNPTl9PUEVSQVRPUlModHlwZSkKKworI2RlZmluZSBERUZJTkVfRU5VTV9PUEVSQVRPUlMoZXR5cGUpIFwKKyAgICBpbmxpbmUgY29uc3RleHByIGV0eXBlIG9wZXJhdG9yfChldHlwZSBhLCBldHlwZSBiKSB7IHJldHVybiAoZXR5cGUpKHN0ZDo6dW5kZXJseWluZ190eXBlPGV0eXBlPjo6dHlwZShhKSB8IHN0ZDo6dW5kZXJseWluZ190eXBlPGV0eXBlPjo6dHlwZShiKSk7IH0gXAorICAgIGlubGluZSBjb25zdGV4cHIgZXR5cGUgJm9wZXJhdG9yfD0oZXR5cGUgJmEsIGV0eXBlIGIpIHsgYSA9IChldHlwZSkoc3RkOjp1bmRlcmx5aW5nX3R5cGU8ZXR5cGU+Ojp0eXBlKGEpIHwgc3RkOjp1bmRlcmx5aW5nX3R5cGU8ZXR5cGU+Ojp0eXBlKGIpKTsgcmV0dXJuIGE7IH0gXAorICAgIGlubGluZSBjb25zdGV4cHIgZXR5cGUgb3BlcmF0b3ImKGV0eXBlIGEsIGV0eXBlIGIpIHsgcmV0dXJuIChldHlwZSkoc3RkOjp1bmRlcmx5aW5nX3R5cGU8ZXR5cGU+Ojp0eXBlKGEpICYgc3RkOjp1bmRlcmx5aW5nX3R5cGU8ZXR5cGU+Ojp0eXBlKGIpKTsgfSBcCisgICAgaW5saW5lIGNvbnN0ZXhwciBldHlwZSAmb3BlcmF0b3ImPShldHlwZSAmYSwgZXR5cGUgYikgeyBhID0gKGV0eXBlKShzdGQ6OnVuZGVybHlpbmdfdHlwZTxldHlwZT46OnR5cGUoYSkgJiBzdGQ6OnVuZGVybHlpbmdfdHlwZTxldHlwZT46OnR5cGUoYikpOyByZXR1cm4gYTsgfSBcCisgICAgaW5saW5lIGNvbnN0ZXhwciBldHlwZSBvcGVyYXRvcl4oZXR5cGUgYSwgZXR5cGUgYikgeyByZXR1cm4gKGV0eXBlKShzdGQ6OnVuZGVybHlpbmdfdHlwZTxldHlwZT46OnR5cGUoYSkgXiBzdGQ6OnVuZGVybHlpbmdfdHlwZTxldHlwZT46OnR5cGUoYikpOyB9IFwKKyAgICBpbmxpbmUgY29uc3RleHByIGV0eXBlICZvcGVyYXRvcl49KGV0eXBlICZhLCBldHlwZSBiKSB7IGEgPSAoZXR5cGUpKHN0ZDo6dW5kZXJseWluZ190eXBlPGV0eXBlPjo6dHlwZShhKSBeIHN0ZDo6dW5kZXJseWluZ190eXBlPGV0eXBlPjo6dHlwZShiKSk7IHJldHVybiBhOyB9IFwKKyAgICBpbmxpbmUgY29uc3RleHByIGV0eXBlIG9wZXJhdG9yfihldHlwZSBhKSB7IHJldHVybiAoZXR5cGUpKH5zdGQ6OnVuZGVybHlpbmdfdHlwZTxldHlwZT46OnR5cGUoYSkpOyB9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIEI+CitjbGFzcyBDMl9ISURFIGMyX2NudHJfdDsKKworLy8vIFxjb25kIElOVEVSTkFMCisKKy8vLyBcZGVmZ3JvdXAgdXRpbHNfaW50ZXJuYWwKKy8vLyBAeworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IEMyX0hJREUgX2MyX2NudHJfY29tcGF0X2hlbHBlciB7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVSwgdHlwZW5hbWUgRT10eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2ludGVncmFsPFU+Ojp2YWx1ZT46OnR5cGU+CisgICAgQzJfQUxMT1dfT1ZFUkZMT1cKKyAgICBpbmxpbmUgc3RhdGljIGNvbnN0ZXhwciBUIGdldChjb25zdCBVICZ2YWx1ZSkgeworICAgICAgICByZXR1cm4gVCh2YWx1ZSk7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVSwgdHlwZW5hbWUgRT10eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjwoc2l6ZW9mKFUpID49IHNpemVvZihUKSk+Ojp0eXBlPgorICAgIEMyX0FMTE9XX09WRVJGTE9XCisgICAgaW5saW5lIHN0YXRpYyBjb25zdGV4cHIgVCBnZXQoY29uc3QgYzJfY250cl90PFUsIHZvaWQ+ICZ2YWx1ZSkgeworICAgICAgICByZXR1cm4gVCh2YWx1ZS5tVmFsdWUpOworICAgIH0KK307CisKKy8vLyBAfQorCisvLy8gXGVuZGNvbmQKKworLyoqCisgKiBJbnRlZ3JhbCBjb3VudGVyIHR5cGUuCisgKgorICogVGhpcyBpcyBiYXNpY2FsbHkgYW4gdW5zaWduZWQgaW50ZWdyYWwgdHlwZSB0aGF0IGlzIE5FVkVSIGNoZWNrZWQgZm9yIG92ZXJmbG93L3VuZGVyZmxvdyAtIGFuZAorICogY29tcGFyaXNvbiBvcGVyYXRvcnMgYXJlIHJlZGVmaW5lZC4KKyAqCisgKiBcbm90ZSBDb21wYXJpc29uIG9mIGNvdW50ZXIgdHlwZXMgaXMgbm90IGZ1bGx5IHRyYW5zaXRpdmUsIGUuZy4KKyAqIGl0IGNvdWxkIGJlIHRoYXQgYSA+IGIgPiBjIGJ1dCBhICE+IGMuCisgKiBzdGQ6Omxlc3M8PiwgZ3JlYXRlcjw+LCBsZXNzX2VxdWFsPD4gYW5kIGdyZWF0ZXJfZXF1YWw8PiBzcGVjaWFsaXphdGlvbnMgeWllbGQgdG90YWwgb3JkZXJpbmcsCisgKiBidXQgbWF5IG5vdCBtYXRjaCBzZW1hbnRpYyBvcmRlcmluZyBvZiB0aGUgdmFsdWVzLgorICoKKyAqIFRlY2huaWNhbGx5OiBjb3VudGVyIHR5cGVzIHJlcHJlc2VudCBpbnRlZ2VyIHZhbHVlczogQSAqIDJeTiArIHZhbHVlLCB3aGVyZSBBIGNhbiBiZSBhcmJpdHJhcnkuCisgKiBUaGlzIG1ha2VzIGFkZGl0aW9uLCBzdWJ0cmFjdGlvbiwgbXVsdGlwbGljYXRpb24gKGFzIHdlbGwgYXMgYml0d2lzZSBvcGVyYXRpb25zKSB3ZWxsIGRlZmluZWQuCisgKiBIb3dldmVyLCBkaXZpc2lvbiBpcyBpbiBnZW5lcmFsIG5vdCB3ZWxsIGRlZmluZWQsIGFzIHRoZSByZXN1bHQgbWF5IGRlcGVuZCBvbiBBLiBUaGlzIGlzIGFsc28KKyAqIHRydWUgZm9yIGxvZ2ljYWwgb3BlcmF0b3JzIGFuZCBib29sZWFuIGNvbnZlcnNpb24uCisgKgorICogRXZlbiB0aG91Z2ggd2VsbCBkZWZpbmVkLCBiaXR3aXNlIG9wZXJhdG9ycyBhcmUgbm90IGltcGxlbWVudGVkIGZvciBjb3VudGVyIHR5cGVzIGFzIHRoZXkgYXJlIG5vdAorICogbWVhbmluZ2Z1bC4KKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgQj10eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2ludGVncmFsPFQ+Ojp2YWx1ZSAmJiBzdGQ6OmlzX3Vuc2lnbmVkPFQ+Ojp2YWx1ZT46OnR5cGU+CitjbGFzcyBDMl9ISURFIGMyX2NudHJfdCB7CisgICAgdXNpbmcgY29tcGF0ID0gX2MyX2NudHJfY29tcGF0X2hlbHBlcjxUPjsKKworICAgIFQgbVZhbHVlOworICAgIGNvbnN0ZXhwciBzdGF0aWMgVCBIQUxGX1JBTkdFID0gVCh+MCkgXiAoVCh+MCkgPj4gMSk7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBVPgorICAgIGZyaWVuZCBzdHJ1Y3QgX2MyX2NudHJfY29tcGF0X2hlbHBlcjsKK3B1YmxpYzoKKworICAgIC8qKgorICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IuIEluaXRpYWxpemVkIGNvdW50ZXIgdG8gMC4KKyAgICAgKi8KKyAgICBpbmxpbmUgY29uc3RleHByIGMyX2NudHJfdCgpIDogbVZhbHVlKFQoMCkpIHt9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgZnJvbSBhIGNvbXBhdGlibGUgdHlwZS4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBVPgorICAgIGlubGluZSBjb25zdGV4cHIgYzJfY250cl90KGNvbnN0IFUgJnZhbHVlKSA6IG1WYWx1ZShjb21wYXQ6OmdldCh2YWx1ZSkpIHt9CisKKyAgICAvKioKKyAgICAgKiBQZWVrIGFzIHVuZGVybHlpbmcgc2lnbmVkIHR5cGUuCisgICAgICovCisgICAgQzJfQUxMT1dfT1ZFUkZMT1cKKyAgICBpbmxpbmUgY29uc3RleHByIHR5cGVuYW1lIHN0ZDo6bWFrZV9zaWduZWQ8VD46OnR5cGUgcGVlaygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PHR5cGVuYW1lIHN0ZDo6bWFrZV9zaWduZWQ8VD46OnR5cGU+KG1WYWx1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGVlayBhcyB1bmRlcmx5aW5nIHVuc2lnbmVkIHR5cGUuCisgICAgICovCisgICAgaW5saW5lIGNvbnN0ZXhwciBUIHBlZWt1KCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBlZWsgYXMgbG9uZyBsb25nIC0gZS5nLiBmb3IgcHJpbnRpbmcuCisgICAgICovCisgICAgQzJfQUxMT1dfT1ZFUkZMT1cKKyAgICBpbmxpbmUgY29uc3RleHByIGxvbmcgbG9uZyBwZWVrbGwoKSBjb25zdCB7CisgICAgICAgIHJldHVybiAobG9uZyBsb25nKW1WYWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQZWVrIGFzIHVuc2lnbmVkIGxvbmcgbG9uZyAtIGUuZy4gZm9yIHByaW50aW5nLgorICAgICAqLworICAgIEMyX0FMTE9XX09WRVJGTE9XCisgICAgaW5saW5lIGNvbnN0ZXhwciB1bnNpZ25lZCBsb25nIGxvbmcgcGVla3VsbCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuICh1bnNpZ25lZCBsb25nIGxvbmcpbVZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlcnQgdG8gYSBzbWFsbGVyIGNvdW50ZXIgdHlwZS4gVGhpcyBpcyBhbHdheXMgc2FmZS4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBVLCB0eXBlbmFtZSBFPXR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPChzaXplb2YoVSkgPCBzaXplb2YoVCkpPjo6dHlwZT4KKyAgICBpbmxpbmUgb3BlcmF0b3IgYzJfY250cl90PFU+KCkgeworICAgICAgICByZXR1cm4gYzJfY250cl90PFU+KG1WYWx1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXJpdGhtZXRpYyBvcGVyYXRvcnMKKyAgICAgKi8KKworI2RlZmluZSBERUZJTkVfQzJfQ05UUl9CSU5BUllfT1AoYXR0cmliLCBvcCwgb3BfYXNzaWduKSBcCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVT4gXAorICAgIGF0dHJpYiBpbmxpbmUgYzJfY250cl90PFQ+JiBvcGVyYXRvciBvcF9hc3NpZ24oY29uc3QgVSAmdmFsdWUpIHsgXAorICAgICAgICBtVmFsdWUgb3BfYXNzaWduIGNvbXBhdDo6Z2V0KHZhbHVlKTsgXAorICAgICAgICByZXR1cm4gKnRoaXM7IFwKKyAgICB9IFwKKyAgICBcCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVSwgdHlwZW5hbWUgRT1kZWNsdHlwZShjb21wYXQ6OmdldChVKDApKSk+IFwKKyAgICBhdHRyaWIgaW5saW5lIGNvbnN0ZXhwciBjMl9jbnRyX3Q8VD4gb3BlcmF0b3Igb3AoY29uc3QgVSAmdmFsdWUpIGNvbnN0IHsgXAorICAgICAgICByZXR1cm4gYzJfY250cl90PFQ+KG1WYWx1ZSBvcCBjb21wYXQ6OmdldCh2YWx1ZSkpOyBcCisgICAgfSBcCisgICAgXAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFUsIHR5cGVuYW1lIEU9dHlwZW5hbWUgc3RkOjplbmFibGVfaWY8KHNpemVvZihVKSA8IHNpemVvZihUKSk+Ojp0eXBlPiBcCisgICAgYXR0cmliIGlubGluZSBjb25zdGV4cHIgYzJfY250cl90PFU+IG9wZXJhdG9yIG9wKGNvbnN0IGMyX2NudHJfdDxVPiAmdmFsdWUpIGNvbnN0IHsgXAorICAgICAgICByZXR1cm4gYzJfY250cl90PFU+KFUobVZhbHVlKSBvcCB2YWx1ZS5wZWVrdSgpKTsgXAorICAgIH0KKworI2RlZmluZSBERUZJTkVfQzJfQ05UUl9VTkFSWV9PUChhdHRyaWIsIG9wKSBcCisgICAgYXR0cmliIGlubGluZSBjb25zdGV4cHIgYzJfY250cl90PFQ+IG9wZXJhdG9yIG9wKCkgY29uc3QgeyBcCisgICAgICAgIHJldHVybiBjMl9jbnRyX3Q8VD4ob3AgbVZhbHVlKTsgXAorICAgIH0KKworI2RlZmluZSBERUZJTkVfQzJfQ05UUl9DUkVNRU5UX09QKGF0dHJpYiwgb3ApIFwKKyAgICBhdHRyaWIgaW5saW5lIGMyX2NudHJfdDxUPiAmb3BlcmF0b3Igb3AoKSB7IFwKKyAgICAgICAgb3AgbVZhbHVlOyBcCisgICAgICAgIHJldHVybiAqdGhpczsgXAorICAgIH0gXAorICAgIGF0dHJpYiBpbmxpbmUgYzJfY250cl90PFQ+IG9wZXJhdG9yIG9wKGludCkgeyBcCisgICAgICAgIHJldHVybiBjMl9jbnRyX3Q8VCwgdm9pZD4obVZhbHVlIG9wKTsgXAorICAgIH0KKworICAgIERFRklORV9DMl9DTlRSX0JJTkFSWV9PUChDMl9BTExPV19PVkVSRkxPVywgKywgKz0pCisgICAgREVGSU5FX0MyX0NOVFJfQklOQVJZX09QKEMyX0FMTE9XX09WRVJGTE9XLCAtLCAtPSkKKyAgICBERUZJTkVfQzJfQ05UUl9CSU5BUllfT1AoQzJfQUxMT1dfT1ZFUkZMT1csICosICo9KQorCisgICAgREVGSU5FX0MyX0NOVFJfVU5BUllfT1AoQzJfQUxMT1dfT1ZFUkZMT1csIC0pCisgICAgREVGSU5FX0MyX0NOVFJfVU5BUllfT1AoQzJfQUxMT1dfT1ZFUkZMT1csICspCisKKyAgICBERUZJTkVfQzJfQ05UUl9DUkVNRU5UX09QKEMyX0FMTE9XX09WRVJGTE9XLCArKykKKyAgICBERUZJTkVfQzJfQ05UUl9DUkVNRU5UX09QKEMyX0FMTE9XX09WRVJGTE9XLCAtLSkKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFUsIHR5cGVuYW1lIEU9dHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc191bnNpZ25lZDxVPjo6dmFsdWU+Ojp0eXBlPgorICAgIEMyX0FMTE9XX09WRVJGTE9XCisgICAgaW5saW5lIGNvbnN0ZXhwciBjMl9jbnRyX3Q8VD4gb3BlcmF0b3I8PChjb25zdCBVICZ2YWx1ZSkgY29uc3QgeworICAgICAgICByZXR1cm4gYzJfY250cl90PFQ+KG1WYWx1ZSA8PCB2YWx1ZSk7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVSwgdHlwZW5hbWUgRT10eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX3Vuc2lnbmVkPFU+Ojp2YWx1ZT46OnR5cGU+CisgICAgQzJfQUxMT1dfT1ZFUkZMT1cKKyAgICBpbmxpbmUgYzJfY250cl90PFQ+ICZvcGVyYXRvcjw8PShjb25zdCBVICZ2YWx1ZSkgeworICAgICAgICBtVmFsdWUgPDw9IHZhbHVlOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29tcGFyaXNvbiBvcGVyYXRvcnMKKyAgICAgKi8KKyAgICBDMl9BTExPV19PVkVSRkxPVworICAgIGlubGluZSBjb25zdGV4cHIgYm9vbCBvcGVyYXRvcjw9KGNvbnN0IGMyX2NudHJfdDxUPiAmb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIFQob3RoZXIubVZhbHVlIC0gbVZhbHVlKSA8IEhBTEZfUkFOR0U7CisgICAgfQorCisgICAgQzJfQUxMT1dfT1ZFUkZMT1cKKyAgICBpbmxpbmUgY29uc3RleHByIGJvb2wgb3BlcmF0b3I+PShjb25zdCBjMl9jbnRyX3Q8VD4gJm90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiBUKG1WYWx1ZSAtIG90aGVyLm1WYWx1ZSkgPCBIQUxGX1JBTkdFOworICAgIH0KKworICAgIGlubGluZSBjb25zdGV4cHIgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGMyX2NudHJfdDxUPiAmb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1WYWx1ZSA9PSBvdGhlci5tVmFsdWU7CisgICAgfQorCisgICAgaW5saW5lIGNvbnN0ZXhwciBib29sIG9wZXJhdG9yIT0oY29uc3QgYzJfY250cl90PFQ+ICZvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7CisgICAgfQorCisgICAgaW5saW5lIGNvbnN0ZXhwciBib29sIG9wZXJhdG9yPChjb25zdCBjMl9jbnRyX3Q8VD4gJm90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiAqdGhpcyA8PSBvdGhlciAmJiAqdGhpcyAhPSBvdGhlcjsKKyAgICB9CisKKyAgICBpbmxpbmUgY29uc3RleHByIGJvb2wgb3BlcmF0b3I+KGNvbnN0IGMyX2NudHJfdDxUPiAmb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuICp0aGlzID49IG90aGVyICYmICp0aGlzICE9IG90aGVyOworICAgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFUsIHR5cGVuYW1lIFQsIHR5cGVuYW1lIEU9dHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19pbnRlZ3JhbDxVPjo6dmFsdWU+Ojp0eXBlPgoraW5saW5lIGNvbnN0ZXhwciBjMl9jbnRyX3Q8VD4gb3BlcmF0b3IrKGNvbnN0IFUgJmEsIGNvbnN0IGMyX2NudHJfdDxUPiAmYikgeworICAgIHJldHVybiBiICsgYTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVSwgdHlwZW5hbWUgVCwgdHlwZW5hbWUgRT10eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2ludGVncmFsPFU+Ojp2YWx1ZT46OnR5cGU+CitpbmxpbmUgY29uc3RleHByIGMyX2NudHJfdDxUPiBvcGVyYXRvci0oY29uc3QgVSAmYSwgY29uc3QgYzJfY250cl90PFQ+ICZiKSB7CisgICAgcmV0dXJuIGMyX2NudHJfdDxUPihhKSAtIGI7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFUsIHR5cGVuYW1lIFQsIHR5cGVuYW1lIEU9dHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19pbnRlZ3JhbDxVPjo6dmFsdWU+Ojp0eXBlPgoraW5saW5lIGNvbnN0ZXhwciBjMl9jbnRyX3Q8VD4gb3BlcmF0b3IqKGNvbnN0IFUgJmEsIGNvbnN0IGMyX2NudHJfdDxUPiAmYikgeworICAgIHJldHVybiBiICogYTsKK30KKwordHlwZWRlZiBjMl9jbnRyX3Q8dWludDMyX3Q+IGMyX2NudHIzMl90OyAvKiogMzItYml0IGNvdW50ZXIgdHlwZSAqLwordHlwZWRlZiBjMl9jbnRyX3Q8dWludDY0X3Q+IGMyX2NudHI2NF90OyAvKiogNjQtYml0IGNvdW50ZXIgdHlwZSAqLworCisvLy8gXGNvbmQgSU5URVJOQUwKKworLy8vIFxkZWZncm91cCB1dGlsc19pbnRlcm5hbAorLy8vIEB7CisKK3RlbXBsYXRlPHR5cGVuYW1lLi4uIFQ+IHN0cnVjdCBjMl90eXBlczsKKworLyoqIHNwZWNpYWxpemF0aW9uIGZvciBhIHNpbmdsZSB0eXBlICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IGMyX3R5cGVzPFQ+IHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6ZGVjYXk8VD46OnR5cGUgd2lkZV90eXBlOworICAgIHR5cGVkZWYgd2lkZV90eXBlIG5hcnJvd190eXBlOworICAgIHR5cGVkZWYgd2lkZV90eXBlIG1pbl90eXBlOyAvLyB0eXBlIGZvciBtaW4oVC4uLikKK307CisKKy8qKiBzcGVjaWFsaXphdGlvbiBmb3IgdHdvIHR5cGVzICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPgorc3RydWN0IGMyX3R5cGVzPFQsIFU+IHsKKyAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfZmxvYXRpbmdfcG9pbnQ8VD46OnZhbHVlID09IHN0ZDo6aXNfZmxvYXRpbmdfcG9pbnQ8VT46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgIm1peGluZyBmbG9hdGluZyBwb2ludCBhbmQgbm9uLWZsb2F0aW5nIHBvaW50IHR5cGVzIGlzIGRpc2FsbG93ZWQiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2lnbmVkPFQ+Ojp2YWx1ZSA9PSBzdGQ6OmlzX3NpZ25lZDxVPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgICAibWl4aW5nIHNpZ25lZCBhbmQgdW5zaWduZWQgdHlwZXMgaXMgZGlzYWxsb3dlZCIpOworCisgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6OmRlY2F5PAorICAgICAgICAgICAgZGVjbHR5cGUodHJ1ZSA/IHN0ZDo6ZGVjbHZhbDxUPigpIDogc3RkOjpkZWNsdmFsPFU+KCkpPjo6dHlwZSB3aWRlX3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6OmRlY2F5PAorICAgICAgICAgICAgdHlwZW5hbWUgc3RkOjpjb25kaXRpb25hbDxzaXplb2YoVCkgPCBzaXplb2YoVSksIFQsIFU+Ojp0eXBlPjo6dHlwZSBuYXJyb3dfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6Y29uZGl0aW9uYWw8CisgICAgICAgICAgICBzdGQ6OmlzX3NpZ25lZDxUPjo6dmFsdWUsIHdpZGVfdHlwZSwgbmFycm93X3R5cGU+Ojp0eXBlIG1pbl90eXBlOworfTsKKworLy8vIEB9CisKKy8vLyBcZW5kY29uZAorCisvKioKKyAqIFR5cGUgc3VwcG9ydCB1dGlsaXR5IGNsYXNzLiBPbmx5IHN1cHBvcnRzIHNpbWlsYXIgY2xhc3Nlcywgc3VjaCBhczoKKyAqIC0gYWxsIGZsb2F0aW5nIHBvaW50CisgKiAtIGFsbCB1bnNpZ25lZC9hbGwgc2lnbmVkCisgKiAtIGFsbCBwb2ludGVyCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFUsIHR5cGVuYW1lLi4uIFY+CitzdHJ1Y3QgYzJfdHlwZXM8VCwgVSwgVi4uLj4geworICAgIC8qKiBDb21tb24gdHlwZSB0aGF0IGFjY29tbW9kYXRlcyBhbGwgdGVtcGxhdGUgcGFyYW1ldGVyIHR5cGVzLiAqLworICAgIHR5cGVkZWYgdHlwZW5hbWUgYzJfdHlwZXM8dHlwZW5hbWUgYzJfdHlwZXM8VCwgVT46OndpZGVfdHlwZSwgVi4uLj46OndpZGVfdHlwZSB3aWRlX3R5cGU7CisgICAgLyoqIE5hcnJvd2VzdCB0eXBlIG9mIHRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIgdHlwZXMuICovCisgICAgdHlwZWRlZiB0eXBlbmFtZSBjMl90eXBlczx0eXBlbmFtZSBjMl90eXBlczxULCBVPjo6bmFycm93X3R5cGUsIFYuLi4+OjpuYXJyb3dfdHlwZSBuYXJyb3dfdHlwZTsKKyAgICAvKiogVHlwZSB0aGF0IGFjY29tbW9kYXRlcyB0aGUgbWluaW11bSB2YWx1ZSBmb3IgYW55IGlucHV0IGZvciB0aGUgdGVtcGxhdGUgcGFyYW1ldGVyIHR5cGVzLiAqLworICAgIHR5cGVkZWYgdHlwZW5hbWUgYzJfdHlwZXM8dHlwZW5hbWUgYzJfdHlwZXM8VCwgVT46Om1pbl90eXBlLCBWLi4uPjo6bWluX3R5cGUgbWluX3R5cGU7Cit9OworCisvKioKKyAqICBcaW5ncm91cCB1dGlsc19pbnRlcm5hbAorICogc3BlY2lhbGl6YXRpb24gZm9yIHR3byB2YWx1ZXMgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+CitpbmxpbmUgY29uc3RleHByIHR5cGVuYW1lIGMyX3R5cGVzPFQsIFU+Ojp3aWRlX3R5cGUgYzJfbWF4KGNvbnN0IFQgYSwgY29uc3QgVSBiKSB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBjMl90eXBlczxULCBVPjo6d2lkZV90eXBlIHdpZGVfdHlwZTsKKyAgICByZXR1cm4gKHsgd2lkZV90eXBlIGFfKGEpLCBiXyhiKTsgYV8gPiBiXyA/IGFfIDogYl87IH0pOworfQorCisvKioKKyAqIEZpbmRzIHRoZSBtYXhpbXVtIHZhbHVlIG9mIGEgbGlzdCBvZiAic2ltaWxhcmx5IHR5cGVkIiB2YWx1ZXMuCisgKgorICogVGhpcyBpcyBhbiBleHRlbnNpb24gdG8gc3RkOjptYXggd2hlcmUgdGhlIHR5cGVzIGRvIG5vdCBoYXZlIHRvIGJlIGlkZW50aWNhbCwgYW5kIHRoZSBzbWFsbGVzdAorICogcmVzdWx0aW5nIHR5cGUgaXMgdXNlZCB0aGF0IGFjY29tbW9kYXRlcyB0aGUgYXJndW1lbnQgdHlwZXMuCisgKgorICogXG5vdGUgVmFsdWUgdHlwZXMgbXVzdCBiZSBzaW1pbGFyLCBlLmcuIGFsbCBmbG9hdGluZyBwb2ludCwgYWxsIHBvaW50ZXJzLCBhbGwgc2lnbmVkLCBvciBhbGwKKyAqIHVuc2lnbmVkLgorICoKKyAqIEByZXR1cm4gdGhlIGxhcmdlc3Qgb2YgdGhlIGlucHV0IGFyZ3VtZW50cy4KKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVSwgdHlwZW5hbWUuLi4gVj4KK2NvbnN0ZXhwciB0eXBlbmFtZSBjMl90eXBlczxULCBVLCBWLi4uPjo6d2lkZV90eXBlIGMyX21heChjb25zdCBUIGEsIGNvbnN0IFUgYiwgY29uc3QgViAuLi4gYykgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgYzJfdHlwZXM8VCwgVSwgVi4uLj46OndpZGVfdHlwZSB3aWRlX3R5cGU7CisgICAgcmV0dXJuICh7IHdpZGVfdHlwZSBhXyhhKSwgYl8oYzJfbWF4KGIsIGMuLi4pKTsgYV8gPiBiXyA/IGFfIDogYl87IH0pOworfQorCisvKioKKyAqICBcaW5ncm91cCB1dGlsc19pbnRlcm5hbAorICogc3BlY2lhbGl6YXRpb24gZm9yIHR3byB2YWx1ZXMgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+CitpbmxpbmUgY29uc3RleHByIHR5cGVuYW1lIGMyX3R5cGVzPFQsIFU+OjptaW5fdHlwZSBjMl9taW4oY29uc3QgVCBhLCBjb25zdCBVIGIpIHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGMyX3R5cGVzPFQsIFU+Ojp3aWRlX3R5cGUgd2lkZV90eXBlOworICAgIHJldHVybiAoeworICAgICAgICB3aWRlX3R5cGUgYV8oYSksIGJfKGIpOworICAgICAgICBzdGF0aWNfY2FzdDx0eXBlbmFtZSBjMl90eXBlczxULCBVPjo6bWluX3R5cGU+KGFfIDwgYl8gPyBhXyA6IGJfKTsKKyAgICB9KTsKK30KKworLyoqCisgKiBGaW5kcyB0aGUgbWluaW11bSB2YWx1ZSBvZiBhIGxpc3Qgb2YgInNpbWlsYXJseSB0eXBlZCIgdmFsdWVzLgorICoKKyAqIFRoaXMgaXMgYW4gZXh0ZW5zaW9uIHRvIHN0ZDo6bWluIHdoZXJlIHRoZSB0eXBlcyBkbyBub3QgaGF2ZSB0byBiZSBpZGVudGljYWwsIGFuZCB0aGUgc21hbGxlc3QKKyAqIHJlc3VsdGluZyB0eXBlIGlzIHVzZWQgdGhhdCBhY2NvbW1vZGF0ZXMgdGhlIGFyZ3VtZW50IHR5cGVzLgorICoKKyAqIFxub3RlIFZhbHVlIHR5cGVzIG11c3QgYmUgc2ltaWxhciwgZS5nLiBhbGwgZmxvYXRpbmcgcG9pbnQsIGFsbCBwb2ludGVycywgYWxsIHNpZ25lZCwgb3IgYWxsCisgKiB1bnNpZ25lZC4KKyAqCisgKiBAcmV0dXJuIHRoZSBzbWFsbGVzdCBvZiB0aGUgaW5wdXQgYXJndW1lbnRzLgorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBVLCB0eXBlbmFtZS4uLiBWPgorY29uc3RleHByIHR5cGVuYW1lIGMyX3R5cGVzPFQsIFUsIFYuLi4+OjptaW5fdHlwZSBjMl9taW4oY29uc3QgVCBhLCBjb25zdCBVIGIsIGNvbnN0IFYgLi4uIGMpIHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGMyX3R5cGVzPFUsIFYuLi4+OjptaW5fdHlwZSByZXN0X3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBjMl90eXBlczxULCByZXN0X3R5cGU+Ojp3aWRlX3R5cGUgd2lkZV90eXBlOworICAgIHJldHVybiAoeworICAgICAgICB3aWRlX3R5cGUgYV8oYSksIGJfKGMyX21pbihiLCBjLi4uKSk7CisgICAgICAgIHN0YXRpY19jYXN0PHR5cGVuYW1lIGMyX3R5cGVzPFQsIHJlc3RfdHlwZT46Om1pbl90eXBlPihhXyA8IGJfID8gYV8gOiBiXyk7CisgICAgfSk7Cit9CisKKy8qKgorICogIFxpbmdyb3VwIHV0aWxzX2ludGVybmFsCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFUsIHR5cGVuYW1lIFY+CitpbmxpbmUgY29uc3RleHByIHR5cGVuYW1lIGMyX3R5cGVzPFQsIFY+Ojp3aWRlX3R5cGUgYzJfY2xhbXAoY29uc3QgVCBhLCBjb25zdCBVIGIsIGNvbnN0IFYgYykgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgYzJfdHlwZXM8VCwgVSwgVj46OndpZGVfdHlwZSB3aWRlX3R5cGU7CisgICAgcmV0dXJuICh7CisgICAgICAgIHdpZGVfdHlwZSBhXyhhKSwgYl8oYiksIGNfKGMpOworICAgICAgICBzdGF0aWNfY2FzdDx0eXBlbmFtZSBjMl90eXBlczxULCBWPjo6d2lkZV90eXBlPihiXyA8IGFfID8gYV8gOiBiXyA+IGNfID8gY18gOiBiXyk7CisgICAgfSk7Cit9CisKKy8vLyBAfQorCisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdHJ1Y3Qgc3RkOjpsZXNzPDo6YzJfY250cl90PFQ+PiB7CisgICAgY29uc3RleHByIGJvb2wgb3BlcmF0b3IoKShjb25zdCA6OmMyX2NudHJfdDxUPiAmbGgsIGNvbnN0IDo6YzJfY250cl90PFQ+ICZyaCkgY29uc3QgeworICAgICAgICByZXR1cm4gbGgucGVla3UoKSA8IHJoLnBlZWt1KCk7CisgICAgfQorfTsKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdHJ1Y3Qgc3RkOjpsZXNzX2VxdWFsPDo6YzJfY250cl90PFQ+PiB7CisgICAgY29uc3RleHByIGJvb2wgb3BlcmF0b3IoKShjb25zdCA6OmMyX2NudHJfdDxUPiAmbGgsIGNvbnN0IDo6YzJfY250cl90PFQ+ICZyaCkgY29uc3QgeworICAgICAgICByZXR1cm4gbGgucGVla3UoKSA8PSByaC5wZWVrdSgpOworICAgIH0KK307Cit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IHN0ZDo6Z3JlYXRlcjw6OmMyX2NudHJfdDxUPj4geworICAgIGNvbnN0ZXhwciBib29sIG9wZXJhdG9yKCkoY29uc3QgOjpjMl9jbnRyX3Q8VD4gJmxoLCBjb25zdCA6OmMyX2NudHJfdDxUPiAmcmgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGxoLnBlZWt1KCkgPiByaC5wZWVrdSgpOworICAgIH0KK307Cit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IHN0ZDo6Z3JlYXRlcl9lcXVhbDw6OmMyX2NudHJfdDxUPj4geworICAgIGNvbnN0ZXhwciBib29sIG9wZXJhdG9yKCkoY29uc3QgOjpjMl9jbnRyX3Q8VD4gJmxoLCBjb25zdCA6OmMyX2NudHJfdDxUPiAmcmgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGxoLnBlZWt1KCkgPj0gcmgucGVla3UoKTsKKyAgICB9Cit9OworCisjZW5kaWYgIC8vIEMyX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaW5jbHVkZS9DMkJ1ZmZlci5oIGIvbWVkaWEvY29kZWMyL2luY2x1ZGUvQzJCdWZmZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTk3ZjZlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2luY2x1ZGUvQzJCdWZmZXIuaApAQCAtMCwwICsxLDIzMDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEMyQlVGRkVSX0hfCisjZGVmaW5lIEMyQlVGRkVSX0hfCisKKyNpbmNsdWRlIDxDMi5oPgorI2luY2x1ZGUgPEMyQnVmZmVyQmFzZS5oPgorI2luY2x1ZGUgPEMyUGFyYW0uaD4gLy8gZm9yIEMySW5mbworCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2lmZGVmIF9fQU5EUk9JRF9fCisjaW5jbHVkZSA8YW5kcm9pZC1DMkJ1ZmZlci5oPgorI2Vsc2UKKwordHlwZWRlZiB2b2lkKiBDMkhhbmRsZTsKKworI2VuZGlmCisKKy8vLyBcZGVmZ3JvdXAgYnVmZmVyIEJ1ZmZlcnMKKy8vLyBAeworCisvLy8gXGRlZmdyb3VwIGJ1ZmZlcl9zeW5jIFN5bmNocm9uaXphdGlvbgorLy8vIEB7CisKKy8qKgorICogU3luY2hyb25pemF0aW9uIGlzIGFjY29tcGxpc2hlZCB1c2luZyBldmVudCBhbmQgZmVuY2Ugb2JqZWN0cy4KKyAqCisgKiBUaGVzZSBhcmUgY3Jvc3MtcHJvY2VzcyBleHRlbnNpb25zIG9mIHByb21pc2UvZnV0dXJlIGluZnJhc3RydWN0dXJlLgorICogRXZlbnRzIGFyZSBhbmFsb2dvdXMgdG8gc3RkOjpwcm9taXNlPHZvaWQ+LCB3aGVyZWFzIGZlbmNlcyBhcmUgdG8gc3RkOjpzaGFyZWRfZnV0dXJlPHZvaWQ+LgorICoKKyAqIEZlbmNlcyBhbmQgZXZlbnRzIGFyZSBzaGFyZWFibGUvY29weWFibGUuCisgKgorICogRmVuY2VzIGFyZSB1c2VkIGluIHR3byBzY2VuYXJpb3MsIGFuZCBhbGwgY29waWVkIGluc3RhbmNlcyByZWZlciB0byB0aGUgc2FtZSBldmVudC4KKyAqIFx0b2RvIGRvIGV2ZW50cyBuZWVkIHRvIGJlIGNvcHlhYmxlIG9yIHNob3VsZCB0aGV5IGJlIHVuaXF1ZT8KKyAqCisgKiBhY3F1aXJlIHN5bmMgZmVuY2Ugb2JqZWN0OiBzaWduYWxlZCB3aGVuIGl0IGlzIHNhZmUgZm9yIHRoZSBjb21wb25lbnQgb3IgY2xpZW50IHRvIGFjY2VzcworICogKHRoZSBjb250ZW50cyBvZikgYW4gb2JqZWN0LgorICoKKyAqIHJlbGVhc2Ugc3luYyBmZW5jZSBvYmplY3Q6IFx0b2RvCisgKgorICogRmVuY2VzIGNhbiBiZSBiYWNrZWQgYnkgaGFyZHdhcmUuIEhhcmR3YXJlIGZlbmNlcyBhcmUgZ3VhcmFudGVlZCB0byBzaWduYWwgTk8gTUFUVEVSIFdIQVQgd2l0aGluCisgKiBhIHNob3J0IChwbGF0Zm9ybSBzcGVjaWZpYykgYW1vdW50IG9mIHRpbWU7IHRoaXMgZ3VhcmFudGVlIGlzIHVzdWFsbHkgbGVzcyB0aGFuIDE1IG1zZWNzLgorICovCisKKy8qKgorICogRmVuY2Ugb2JqZWN0IHVzZWQgYnkgY29tcG9uZW50cyBhbmQgdGhlIGZyYW1ld29yay4KKyAqCisgKiBJbXBsZW1lbnRzIHRoZSB3YWl0aW5nIGZvciBhbiBldmVudCwgYW5hbG9nb3VzIHRvIGEgJ2Z1dHVyZScuCisgKgorICogVG8gYmUgaW1wbGVtZW50ZWQgYnkgdmVuZG9ycyBpZiB1c2luZyBIVyBmZW5jZXMuCisgKi8KK2NsYXNzIEMyRmVuY2UgeworcHVibGljOgorICAgIC8qKgorICAgICAqIFdhaXRzIGZvciBhIGZlbmNlIHRvIGJlIHNpZ25hbGVkIHdpdGggYSB0aW1lb3V0LgorICAgICAqCisgICAgICogXHRvZG8gYSBtZWNoYW5pc20gdG8gY2FuY2VsIGEgd2FpdCAtIGZvciBub3cgdGhlIG9ubHkgd2F5IHRvIGRvIHRoaXMgaXMgdG8gYWJhbmRvbiB0aGUKKyAgICAgKiBldmVudCwgYnV0IGZlbmNlcyBhcmUgc2hhcmVkIHNvIGNhbmNlbGluZyBhIHdhaXQgd2lsbCBjYW5jZWwgYWxsIHdhaXRzLgorICAgICAqCisgICAgICogXHBhcmFtIHRpbWVvdXROcyAgICAgICAgICAgdGhlIG1heGltdW0gdGltZSB0byB3YWl0IGluIG5zZWNzCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICAgICAgdGhlIGZlbmNlIGhhcyBiZWVuIHNpZ25hbGVkCisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgICAgIHRoZSBmZW5jZSBoYXMgbm90IGJlZW4gc2lnbmFsZWQgd2l0aGluIHRoZSB0aW1lb3V0CisgICAgICogXHJldHZhbCBDMl9CQURfU1RBVEUgICAgIHRoZSBmZW5jZSBoYXMgYmVlbiBhYmFuZG9uZWQgd2l0aG91dCBiZWluZyBzaWduYWxlZCAoaXQgd2lsbCBuZXZlcgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBiZSBzaWduYWxlZCkKKyAgICAgKiBccmV0dmFsIEMyX1JFRlVTRUQgICAgICAgbm8gcGVybWlzc2lvbiB0byB3YWl0IGZvciB0aGUgZmVuY2UgKHVuZXhwZWN0ZWQgLSBzeXN0ZW0pCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgICAgIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgd2FpdGluZyBmb3IgdGhlIGZlbmNlICh1bmV4cGVjdGVkKQorICAgICAqLworICAgIGMyX3N0YXR1c190IHdhaXQoYzJfbnNlY3NfdCB0aW1lb3V0TnMpOworCisgICAgLyoqCisgICAgICogVXNlZCB0byBjaGVjayBpZiB0aGlzIGZlbmNlIGlzIHZhbGlkIChpZiB0aGVyZSBpcyBhIGNoYW5jZSBmb3IgaXQgdG8gYmUgc2lnbmFsZWQuKQorICAgICAqIEEgZmVuY2UgYmVjb21lcyBpbnZhbGlkIGlmIHRoZSBjb250cm9saW5nIGV2ZW50IGlzIGRlc3Ryb3llZCB3aXRob3V0IGl0IHNpZ25hbGluZyB0aGUgZmVuY2UuCisgICAgICoKKyAgICAgKiBccmV0dXJuIHdoZXRoZXIgdGhpcyBmZW5jZSBpcyB2YWxpZAorICAgICAqLworICAgIGJvb2wgdmFsaWQoKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFVzZWQgdG8gY2hlY2sgaWYgdGhpcyBmZW5jZSBoYXMgYmVlbiBzaWduYWxlZCAoaXMgcmVhZHkpLgorICAgICAqCisgICAgICogXHJldHVybiB3aGV0aGVyIHRoaXMgZmVuY2UgaGFzIGJlZW4gc2lnbmFsZWQKKyAgICAgKi8KKyAgICBib29sIHJlYWR5KCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgZmlsZSBkZXNjcmlwdG9yIHRoYXQgY2FuIGJlIHVzZWQgdG8gd2FpdCBmb3IgdGhpcyBmZW5jZSBpbiBhIHNlbGVjdCBzeXN0ZW0gY2FsbC4KKyAgICAgKiBcbm90ZSBUaGUgcmV0dXJuZWQgZmlsZSBkZXNjcmlwdG9yLCBpZiB2YWxpZCwgbXVzdCBiZSBjbG9zZWQgYnkgdGhlIGNhbGxlci4KKyAgICAgKgorICAgICAqIFRoaXMgY2FuIGJlIHVzZWQgaW4gZS5nLiBwb2xsKCkgc3lzdGVtIGNhbGxzLiBUaGlzIGZpbGUgYmVjb21lcyByZWFkYWJsZSAoUE9MTElOKSB3aGVuIHRoZQorICAgICAqIGZlbmNlIGlzIHNpZ25hbGVkLCBhbmQgYmFkIChQT0xMRVJSKSBpZiB0aGUgZmVuY2UgaXMgYWJhbmRvbmVkLgorICAgICAqCisgICAgICogXHJldHVybiBhIGZpbGUgZGVzY3JpcHRvciByZXByZXNlbnRpbmcgdGhpcyBmZW5jZSAod2l0aCBvd25lcnNoaXApLCBvciAtMSBpZiB0aGUgZmVuY2UKKyAgICAgKiBoYXMgYWxyZWFkeSBiZWVuIHNpZ25hbGVkIChcdG9kbyBvciBhYmFuZG9uZWQpLgorICAgICAqCisgICAgICogXHRvZG8gdGhpcyBtdXN0IGJlIGNvbXBhdGlibGUgd2l0aCBmZW5jZXMgdXNlZCBieSBncmFsbG9jCisgICAgICovCisgICAgaW50IGZkKCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBmZW5jZSBpcyBhIGhhcmR3YXJlLWJhY2tlZCBmZW5jZS4KKyAgICAgKiBccmV0dXJuIHdoZXRoZXIgdGhpcyBpcyBhIGhhcmR3YXJlIGZlbmNlCisgICAgICovCisgICAgYm9vbCBpc0hXKCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBOdWxsLWZlbmNlLiBBIGZlbmNlIHRoYXQgaGFzIGZpcmVkLgorICAgICAqLworICAgIGNvbnN0ZXhwciBDMkZlbmNlKCkgOiBtSW1wbChudWxscHRyKSB7IH0KKworcHJpdmF0ZToKKyAgICBjbGFzcyBJbXBsOworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBtSW1wbDsKKyAgICBDMkZlbmNlKHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBpbXBsKTsKKyAgICBmcmllbmQgc3RydWN0IF9DMkZlbmNlRmFjdG9yeTsKK307CisKKy8qKgorICogRXZlbnQgb2JqZWN0IHVzZWQgYnkgY29tcG9uZW50cyBhbmQgdGhlIGZyYW1ld29yay4KKyAqCisgKiBJbXBsZW1lbnRzIHRoZSBzaWduYWxpbmcgb2YgYW4gZXZlbnQsIGFuYWxvZ291cyB0byBhICdwcm9taXNlJy4KKyAqCisgKiBIYXJkd2FyZSBiYWNrZWQgZXZlbnRzIGRvIG5vdCBnbyB0aHJvdWdoIHRoaXMgb2JqZWN0LCBhbmQgbXVzdCBiZSBleHBvc2VkIGRpcmVjdGx5IGFzIGZlbmNlcworICogYnkgdmVuZG9ycy4KKyAqLworY2xhc3MgQzJFdmVudCB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogUmV0dXJucyBhIGZlbmNlIGZvciB0aGlzIGV2ZW50LgorICAgICAqLworICAgIEMyRmVuY2UgZmVuY2UoKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFNpZ25hbHMgKGFsbCkgYXNzb2NpYXRlZCBmZW5jZShzKS4KKyAgICAgKiBUaGlzIGhhcyBubyBlZmZlY3Qgbm8gZWZmZWN0IGlmIHRoZSBldmVudCB3YXMgYWxyZWFkeSBzaWduYWxlZCBvciBhYmFuZG9uZWQuCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICAgICAgdGhlIGZlbmNlKHMpIHdlcmUgc3VjY2Vzc2Z1bGx5IHNpZ25hbGVkCisgICAgICogXHJldHZhbCBDMl9CQURfU1RBVEUgICAgIHRoZSBmZW5jZShzKSBoYXZlIGFscmVhZHkgYmVlbiBhYmFuZG9uZWQgb3IgbWVyZ2VkIChjYWxsZXIgZXJyb3IpCisgICAgICogXHJldHZhbCBDMl9EVVBMSUNBVEUgICAgIHRoZSBmZW5jZShzKSBoYXZlIGFscmVhZHkgYmVlbiBzaWduYWxlZCAoY2FsbGVyIGVycm9yKQorICAgICAqIFxyZXR2YWwgQzJfUkVGVVNFRCAgICAgICBubyBwZXJtaXNzaW9uIHRvIHNpZ25hbCB0aGUgZmVuY2UgKHVuZXhwZWN0ZWQgLSBzeXN0ZW0pCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgICAgIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgc2lnbmFsaW5nIHRoZSBmZW5jZShzKSAodW5leHBlY3RlZCkKKyAgICAgKi8KKyAgICBjMl9zdGF0dXNfdCBmaXJlKCk7CisKKyAgICAvKioKKyAgICAgKiBUcmlnZ2VyIHRoaXMgZXZlbnQgZnJvbSB0aGUgbWVyZ2luZyBvZiB0aGUgc3VwcGxpZWQgZmVuY2VzLiBUaGlzIG1lYW5zIHRoYXQgaXQgd2lsbCBiZQorICAgICAqIGFiYW5kb25lZCBpZiBhbnkgb2YgdGhlc2UgZmVuY2VzIGhhdmUgYmVlbiBhYmFuZG9uZWQsIGFuZCBpdCB3aWxsIGJlIGZpcmVkIGlmIGFsbCBvZiB0aGVzZQorICAgICAqIGZlbmNlcyBoYXZlIGJlZW4gc2lnbmFsZWQuCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICAgICAgdGhlIG1lcmdpbmcgd2FzIHN1Y2Nlc3NmdWxseSBkb25lCisgICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgICAgIG5vdCBlbm91Z2ggbWVtb3J5IHRvIHBlcmZvcm0gdGhlIG1lcmdpbmcKKyAgICAgKiBccmV0dmFsIEMyX0RVUExJQ0FURSAgICAgdGhlIGZlbmNlIGhhdmUgYWxyZWFkeSBiZWVuIG1lcmdlZCAoY2FsbGVyIGVycm9yKQorICAgICAqIFxyZXR2YWwgQzJfQkFEX1NUQVRFICAgICB0aGUgZmVuY2UgaGF2ZSBhbHJlYWR5IGJlZW4gc2lnbmFsZWQgb3IgYWJhbmRvbmVkIChjYWxsZXIgZXJyb3IpCisgICAgICogXHJldHZhbCBDMl9SRUZVU0VEICAgICAgIG5vIHBlcm1pc3Npb24gdG8gbWVyZ2UgdGhlIGZlbmNlICh1bmV4cGVjdGVkIC0gc3lzdGVtKQorICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEICAgICBzb21lIHVua25vd24gZXJyb3IgcHJldmVudGVkIG1lcmdpbmcgdGhlIGZlbmNlKHMpICh1bmV4cGVjdGVkKQorICAgICAqLworICAgIGMyX3N0YXR1c190IG1lcmdlKHN0ZDo6dmVjdG9yPEMyRmVuY2U+IGZlbmNlcyk7CisKKyAgICAvKioKKyAgICAgKiBBYmFuZG9ucyB0aGUgZXZlbnQgYW5kIGFueSBhc3NvY2lhdGVkIGZlbmNlKHMpLgorICAgICAqIFxub3RlIENhbGwgdGhpcyB0byBleHBsaWNpdGx5IGFiYW5kb24gYW4gZXZlbnQgYmVmb3JlIGl0IGlzIGRlc3RydWN0ZWQgdG8gYXZvaWQgYSB3YXJuaW5nLgorICAgICAqCisgICAgICogVGhpcyBoYXMgbm8gZWZmZWN0IG5vIGVmZmVjdCBpZiB0aGUgZXZlbnQgd2FzIGFscmVhZHkgc2lnbmFsZWQgb3IgYWJhbmRvbmVkLgorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgICAgIHRoZSBmZW5jZShzKSB3ZXJlIHN1Y2Nlc3NmdWxseSBzaWduYWxlZAorICAgICAqIFxyZXR2YWwgQzJfQkFEX1NUQVRFICAgICB0aGUgZmVuY2UocykgaGF2ZSBhbHJlYWR5IGJlZW4gc2lnbmFsZWQgb3IgbWVyZ2VkIChjYWxsZXIgZXJyb3IpCisgICAgICogXHJldHZhbCBDMl9EVVBMSUNBVEUgICAgIHRoZSBmZW5jZShzKSBoYXZlIGFscmVhZHkgYmVlbiBhYmFuZG9uZWQgKGNhbGxlciBlcnJvcikKKyAgICAgKiBccmV0dmFsIEMyX1JFRlVTRUQgICAgICAgbm8gcGVybWlzc2lvbiB0byBhYmFuZG9uIHRoZSBmZW5jZSAodW5leHBlY3RlZCAtIHN5c3RlbSkKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCAgICAgc29tZSB1bmtub3duIGVycm9yIHByZXZlbnRlZCBzaWduYWxpbmcgdGhlIGZlbmNlKHMpICh1bmV4cGVjdGVkKQorICAgICAqLworICAgIGMyX3N0YXR1c190IGFiYW5kb24oKTsKKworcHJpdmF0ZToKKyAgICBjbGFzcyBJbXBsOworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBtSW1wbDsKK307CisKKy8vLyBcYWRkdG9ncm91cCBidWZfaW50ZXJuYWwgSW50ZXJuYWwKKy8vLyBAeworCisvKioKKyAqIEludGVyZmFjZSBmb3Igb2JqZWN0cyB0aGF0IGVuY2Fwc3VsYXRlIGFuIHVwZGF0YWJsZSBzdGF0dXMgdmFsdWUuCisgKi8KK3N0cnVjdCBfQzJJbm5hdGVTdGF0dXMgeworICAgIGlubGluZSBjMl9zdGF0dXNfdCBzdGF0dXMoKSBjb25zdCB7IHJldHVybiBtU3RhdHVzOyB9CisKK3Byb3RlY3RlZDoKKyAgICBfQzJJbm5hdGVTdGF0dXMoYzJfc3RhdHVzX3Qgc3RhdHVzKSA6IG1TdGF0dXMoc3RhdHVzKSB7IH0KKworICAgIGMyX3N0YXR1c190IG1TdGF0dXM7IC8vIHRoaXMgc3RhdHVzIGlzIHVwZGF0YWJsZSBieSB0aGUgb2JqZWN0Cit9OworCisvLy8gQH0KKworLyoqCisgKiBUaGlzIGlzIGEgdXRpbGl0eSB0ZW1wbGF0ZSBmb3Igb2JqZWN0cyBwcm90ZWN0ZWQgYnkgYW4gYWNxdWlyZSBmZW5jZSwgc28gdGhhdCBlcnJvcnMgZHVyaW5nCisgKiBhY3F1aXJpbmcgdGhlIG9iamVjdCBhcmUgcHJvcGFnYXRlZCB0byB0aGUgb2JqZWN0IGl0c2VsZi4KKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2NsYXNzIEMyQWNxdWlyYWJsZSA6IHB1YmxpYyBDMkZlbmNlIHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBBY3F1aXJlcyB0aGUgb2JqZWN0IHByb3RlY3RlZCBieSBhbiBhY3F1aXJlIGZlbmNlLiBBbnkgZXJyb3JzIGR1cmluZyB0aGUgbWFwcGluZyB3aWxsIGJlCisgICAgICogcGFzc2VkIHRvIHRoZSBvYmplY3QuCisgICAgICoKKyAgICAgKiBccmV0dXJuIGFjcXVpcmVkIG9iamVjdCBwb3RlbnRpYWxseSBpbnZhbGlkYXRlZCBpZiB3YWl0aW5nIGZvciB0aGUgZmVuY2UgZmFpbGVkLgorICAgICAqLworICAgIFQgZ2V0KCkgeworICAgICAgICAvLyBUT0RPOgorICAgICAgICAvLyB3YWl0KCk7CisgICAgICAgIHJldHVybiBtVDsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICBDMkFjcXVpcmFibGUoYzJfc3RhdHVzX3QgZXJyb3IsIEMyRmVuY2UgZmVuY2UsIFQgdCkgOiBDMkZlbmNlKGZlbmNlKSwgbUluaXRpYWxFcnJvcihlcnJvciksIG1UKHQpIHsgfQorCitwcml2YXRlOgorICAgIGMyX3N0YXR1c190IG1Jbml0aWFsRXJyb3I7CisgICAgVCBtVDsgLy8gVE9ETzogbW92ZSBpbnN0ZWFkIG9mIGNvcHkKK307CisKKy8vLyBAfQorCisvLy8gXGRlZmdyb3VwIGxpbmVhciBMaW5lYXIgRGF0YSBCbG9ja3MKKy8vLyBAeworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgTElORUFSIEFTUEVDVFMsIEJMT0NLUyBBTkQgVklFV1MKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIEJhc2ljIHNlZ21lbnQgbWF0aCBzdXBwb3J0LgorICovCitzdHJ1Y3QgQzJTZWdtZW50IHsKKyAgICB1aW50MzJfdCBvZmZzZXQ7CisgICAgdWludDMyX3Qgc2l6ZTsKKworICAgIGlubGluZSBjb25zdGV4cHIgQzJTZWdtZW50KHVpbnQzMl90IG9mZnNldF8sIHVpbnQzMl90IHNpemVfKQorICAgICAgICA6IG9mZnNldChvZmZzZXRfKSwKKyAgICAgICAgICBzaXplKHNpemVfKSB7CisgICAgfQorCisgICAgaW5saW5lIGNvbnN0ZXhwciBib29sIGlzRW1wdHkoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBzaXplID09IDA7CisgICAgfQorCisgICAgaW5saW5lIGNvbnN0ZXhwciBib29sIGlzVmFsaWQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBvZmZzZXQgPD0gfnNpemU7CisgICAgfQorCisgICAgaW5saW5lIGNvbnN0ZXhwciBvcGVyYXRvciBib29sKCkgY29uc3QgeworICAgICAgICByZXR1cm4gaXNWYWxpZCgpICYmICFpc0VtcHR5KCk7CisgICAgfQorCisgICAgaW5saW5lIGNvbnN0ZXhwciBib29sIG9wZXJhdG9yISgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuICFib29sKCp0aGlzKTsKKyAgICB9CisKKyAgICBDMl9BTExPV19PVkVSRkxPVworICAgIGlubGluZSBjb25zdGV4cHIgYm9vbCBjb250YWlucyhjb25zdCBDMlNlZ21lbnQgJm90aGVyKSBjb25zdCB7CisgICAgICAgIGlmICghaXNWYWxpZCgpIHx8ICFvdGhlci5pc1ZhbGlkKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBvZmZzZXQgPD0gb3RoZXIub2Zmc2V0CisgICAgICAgICAgICAgICAgICAgICYmIG9mZnNldCArIHNpemUgPj0gb3RoZXIub2Zmc2V0ICsgb3RoZXIuc2l6ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlubGluZSBjb25zdGV4cHIgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEMyU2VnbWVudCAmb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgaWYgKCFpc1ZhbGlkKCkpIHsKKyAgICAgICAgICAgIHJldHVybiAhb3RoZXIuaXNWYWxpZCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIG9mZnNldCA9PSBvdGhlci5vZmZzZXQgJiYgc2l6ZSA9PSBvdGhlci5zaXplOworICAgICAgICB9CisgICAgfQorCisgICAgaW5saW5lIGNvbnN0ZXhwciBib29sIG9wZXJhdG9yIT0oY29uc3QgQzJTZWdtZW50ICZvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gIW9wZXJhdG9yPT0ob3RoZXIpOworICAgIH0KKworICAgIGlubGluZSBjb25zdGV4cHIgYm9vbCBvcGVyYXRvcj49KGNvbnN0IEMyU2VnbWVudCAmb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGNvbnRhaW5zKG90aGVyKTsKKyAgICB9CisKKyAgICBpbmxpbmUgY29uc3RleHByIGJvb2wgb3BlcmF0b3I+KGNvbnN0IEMyU2VnbWVudCAmb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGNvbnRhaW5zKG90aGVyKSAmJiAhb3BlcmF0b3I9PShvdGhlcik7CisgICAgfQorCisgICAgaW5saW5lIGNvbnN0ZXhwciBib29sIG9wZXJhdG9yPD0oY29uc3QgQzJTZWdtZW50ICZvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gb3RoZXIuY29udGFpbnMoKnRoaXMpOworICAgIH0KKworICAgIGlubGluZSBjb25zdGV4cHIgYm9vbCBvcGVyYXRvcjwoY29uc3QgQzJTZWdtZW50ICZvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gb3RoZXIuY29udGFpbnMoKnRoaXMpICYmICFvcGVyYXRvcj09KG90aGVyKTsKKyAgICB9CisKKyAgICBDMl9BTExPV19PVkVSRkxPVworICAgIGlubGluZSBjb25zdGV4cHIgdWludDMyX3QgZW5kKCkgY29uc3QgeworICAgICAgICByZXR1cm4gb2Zmc2V0ICsgc2l6ZTsKKyAgICB9CisKKyAgICBDMl9BTExPV19PVkVSRkxPVworICAgIGlubGluZSBjb25zdGV4cHIgQzJTZWdtZW50IGludGVyc2VjdChjb25zdCBDMlNlZ21lbnQgJm90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiBDMlNlZ21lbnQoYzJfbWF4KG9mZnNldCwgb3RoZXIub2Zmc2V0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjMl9taW4oZW5kKCksIG90aGVyLmVuZCgpKSAtIGMyX21heChvZmZzZXQsIG90aGVyLm9mZnNldCkpOworICAgIH0KKworICAgIC8qKiBjbGFtcHMgZW5kIHRvIG9mZnNldCBpZiBpdCBvdmVyZmxvd3MgKi8KKyAgICBpbmxpbmUgY29uc3RleHByIEMyU2VnbWVudCBub3JtYWxpemUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBDMlNlZ21lbnQob2Zmc2V0LCBjMl9tYXgob2Zmc2V0LCBlbmQoKSkgLSBvZmZzZXQpOworICAgIH0KKworICAgIC8qKiBjbGFtcHMgZW5kIHRvIG1heCBpZiBpdCBvdmVyZmxvd3MgKi8KKyAgICBpbmxpbmUgY29uc3RleHByIEMyU2VnbWVudCBzYXR1cmF0ZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIEMyU2VnbWVudChvZmZzZXQsIGMyX21pbihzaXplLCB+b2Zmc2V0KSk7CisgICAgfQorCit9OworCisvKioKKyAqIENvbW1vbiBhc3BlY3QgZm9yIGFsbCBvYmplY3RzIHRoYXQgaGF2ZSBhIGxpbmVhciBjYXBhY2l0eS4KKyAqLworY2xhc3MgX0MyTGluZWFyQ2FwYWNpdHlBc3BlY3QgeworLy8vIFxuYW1lIExpbmVhciBjYXBhY2l0eSBpbnRlcmZhY2UKKy8vLyBAeworcHVibGljOgorICAgIGlubGluZSBjb25zdGV4cHIgdWludDMyX3QgY2FwYWNpdHkoKSBjb25zdCB7IHJldHVybiBtQ2FwYWNpdHk7IH0KKworICAgIGlubGluZSBjb25zdGV4cHIgb3BlcmF0b3IgQzJTZWdtZW50KCkgY29uc3QgeworICAgICAgICByZXR1cm4gQzJTZWdtZW50KDAsIG1DYXBhY2l0eSk7CisgICAgfQorCitwcm90ZWN0ZWQ6CisKKyNpZiBVSU5UUFRSX01BWCA9PSAweGZmZmZmZmZmCisgICAgc3RhdGljX2Fzc2VydChzaXplb2Yoc2l6ZV90KSA9PSBzaXplb2YodWludDMyX3QpLCAic2l6ZV90IGlzIHRvbyBiaWciKTsKKyNlbHNlCisgICAgc3RhdGljX2Fzc2VydChzaXplb2Yoc2l6ZV90KSA+IHNpemVvZih1aW50MzJfdCksICJzaXplX3QgaXMgdG9vIHNtYWxsIik7CisgICAgLy8gZXhwbGljaXRseSBkaXNhYmxlIGNvbnN0cnVjdGlvbiBmcm9tIHNpemVfdAorICAgIGlubGluZSBleHBsaWNpdCBfQzJMaW5lYXJDYXBhY2l0eUFzcGVjdChzaXplX3QgY2FwYWNpdHkpID0gZGVsZXRlOworI2VuZGlmCisKKyAgICBpbmxpbmUgZXhwbGljaXQgY29uc3RleHByIF9DMkxpbmVhckNhcGFjaXR5QXNwZWN0KHVpbnQzMl90IGNhcGFjaXR5KQorICAgICAgOiBtQ2FwYWNpdHkoY2FwYWNpdHkpIHsgfQorCisgICAgaW5saW5lIGV4cGxpY2l0IGNvbnN0ZXhwciBfQzJMaW5lYXJDYXBhY2l0eUFzcGVjdChjb25zdCBfQzJMaW5lYXJDYXBhY2l0eUFzcGVjdCAqcGFyZW50KQorICAgICAgICA6IG1DYXBhY2l0eShwYXJlbnQgPT0gbnVsbHB0ciA/IDAgOiBwYXJlbnQtPmNhcGFjaXR5KCkpIHsgfQorCitwcml2YXRlOgorICAgIHVpbnQzMl90IG1DYXBhY2l0eTsKKy8vLyBAfQorfTsKKworLyoqCisgKiBBc3BlY3QgZm9yIG9iamVjdHMgdGhhdCBoYXZlIGEgbGluZWFyIHJhbmdlIGluc2lkZSBhIGxpbmVhciBjYXBhY2l0eS4KKyAqCisgKiBUaGlzIGNsYXNzIGlzIGNvcGlhYmxlLgorICovCitjbGFzcyBfQzJMaW5lYXJSYW5nZUFzcGVjdCA6IHB1YmxpYyBfQzJMaW5lYXJDYXBhY2l0eUFzcGVjdCB7CisvLy8gXG5hbWUgTGluZWFyIHJhbmdlIGludGVyZmFjZQorLy8vIEB7CitwdWJsaWM6CisgICAgaW5saW5lIGNvbnN0ZXhwciB1aW50MzJfdCBvZmZzZXQoKSBjb25zdCB7IHJldHVybiBtT2Zmc2V0OyB9CisgICAgaW5saW5lIGNvbnN0ZXhwciB1aW50MzJfdCBlbmRPZmZzZXQoKSBjb25zdCB7IHJldHVybiBtT2Zmc2V0ICsgbVNpemU7IH0KKyAgICBpbmxpbmUgY29uc3RleHByIHVpbnQzMl90IHNpemUoKSBjb25zdCB7IHJldHVybiBtU2l6ZTsgfQorCisgICAgaW5saW5lIGNvbnN0ZXhwciBvcGVyYXRvciBDMlNlZ21lbnQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBDMlNlZ21lbnQobU9mZnNldCwgbVNpemUpOworICAgIH0KKworcHJpdmF0ZToKKyAgICAvLyBzdWJyYW5nZSBvZiBjYXBhY2l0eSBbMCwgY2FwYWNpdHldICYgW3NpemUsIHNpemUgKyBvZmZzZXRdCisgICAgaW5saW5lIGNvbnN0ZXhwciBfQzJMaW5lYXJSYW5nZUFzcGVjdCh1aW50MzJfdCBjYXBhY2l0eV8sIHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplKQorICAgICAgICA6IF9DMkxpbmVhckNhcGFjaXR5QXNwZWN0KGNhcGFjaXR5XyksCisgICAgICAgICAgbU9mZnNldChjMl9taW4ob2Zmc2V0LCBjYXBhY2l0eSgpKSksCisgICAgICAgICAgbVNpemUoYzJfbWluKHNpemUsIGNhcGFjaXR5KCkgLSBtT2Zmc2V0KSkgeworICAgIH0KKworcHJvdGVjdGVkOgorICAgIC8vIGNvcHkgY29uc3RydWN0b3IgKG5vIGVycm9yIGNoZWNrKQorICAgIGlubGluZSBjb25zdGV4cHIgX0MyTGluZWFyUmFuZ2VBc3BlY3QoY29uc3QgX0MyTGluZWFyUmFuZ2VBc3BlY3QgJm90aGVyKQorICAgICAgICA6IF9DMkxpbmVhckNhcGFjaXR5QXNwZWN0KG90aGVyLmNhcGFjaXR5KCkpLAorICAgICAgICAgIG1PZmZzZXQob3RoZXIub2Zmc2V0KCkpLAorICAgICAgICAgIG1TaXplKG90aGVyLnNpemUoKSkgeworICAgIH0KKworICAgIC8vIHBhcmVudCBjYXBhY2l0eSByYW5nZSBbMCwgY2FwYWNpdHldCisgICAgaW5saW5lIGNvbnN0ZXhwciBleHBsaWNpdCBfQzJMaW5lYXJSYW5nZUFzcGVjdChjb25zdCBfQzJMaW5lYXJDYXBhY2l0eUFzcGVjdCAqcGFyZW50KQorICAgICAgICA6IF9DMkxpbmVhckNhcGFjaXR5QXNwZWN0KHBhcmVudCksCisgICAgICAgICAgbU9mZnNldCgwKSwKKyAgICAgICAgICBtU2l6ZShjYXBhY2l0eSgpKSB7CisgICAgfQorCisgICAgLy8gc3VicmFuZ2Ugb2YgcGFyZW50IGNhcGFjaXR5IFswLCBjYXBhY2l0eV0gJiBbc2l6ZSwgc2l6ZSArIG9mZnNldF0KKyAgICBpbmxpbmUgY29uc3RleHByIF9DMkxpbmVhclJhbmdlQXNwZWN0KGNvbnN0IF9DMkxpbmVhckNhcGFjaXR5QXNwZWN0ICpwYXJlbnQsIHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplKQorICAgICAgICA6IF9DMkxpbmVhckNhcGFjaXR5QXNwZWN0KHBhcmVudCksCisgICAgICAgICAgbU9mZnNldChjMl9taW4ob2Zmc2V0LCBjYXBhY2l0eSgpKSksCisgICAgICAgICAgbVNpemUoYzJfbWluKHNpemUsIGNhcGFjaXR5KCkgLSBtT2Zmc2V0KSkgeworICAgIH0KKworICAgIC8vIHN1YnNlY3Rpb24gb2YgdGhlIHBhcmVudCdzIGFuZCBbb2Zmc2V0LCBvZmZzZXQgKyBzaXplXSByYW5nZXMKKyAgICBpbmxpbmUgY29uc3RleHByIF9DMkxpbmVhclJhbmdlQXNwZWN0KGNvbnN0IF9DMkxpbmVhclJhbmdlQXNwZWN0ICpwYXJlbnQsIHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplKQorICAgICAgICA6IF9DMkxpbmVhckNhcGFjaXR5QXNwZWN0KHBhcmVudCksCisgICAgICAgICAgbU9mZnNldChjMl9taW4oYzJfbWF4KG9mZnNldCwgcGFyZW50ID09IG51bGxwdHIgPyAwIDogcGFyZW50LT5vZmZzZXQoKSksIGNhcGFjaXR5KCkpKSwKKyAgICAgICAgICBtU2l6ZShzdGQ6Om1pbihjMl9taW4oc2l6ZSwgcGFyZW50ID09IG51bGxwdHIgPyAwIDogcGFyZW50LT5zaXplKCkpLCBjYXBhY2l0eSgpIC0gbU9mZnNldCkpIHsKKyAgICB9CisKK3B1YmxpYzoKKyAgICBpbmxpbmUgY29uc3RleHByIF9DMkxpbmVhclJhbmdlQXNwZWN0IGNoaWxkUmFuZ2Uoc2l6ZV90IG9mZnNldCwgc2l6ZV90IHNpemUpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIF9DMkxpbmVhclJhbmdlQXNwZWN0KAorICAgICAgICAgICAgbVNpemUsCisgICAgICAgICAgICBjMl9taW4oYzJfbWF4KG9mZnNldCwgbU9mZnNldCksIGNhcGFjaXR5KCkpIC0gbU9mZnNldCwKKyAgICAgICAgICAgIGMyX21pbihjMl9taW4oc2l6ZSwgbVNpemUpLCBjYXBhY2l0eSgpIC0gYzJfbWluKGMyX21heChvZmZzZXQsIG1PZmZzZXQpLCBjYXBhY2l0eSgpKSkpOworICAgIH0KKworICAgIGZyaWVuZCBjbGFzcyBfQzJFZGl0YWJsZUxpbmVhclJhbmdlQXNwZWN0OworICAgIC8vIGludmFyaWFudHMgMCA8PSBtT2Zmc2V0IDw9IG1PZmZzZXQgKyBtU2l6ZSA8PSBjYXBhY2l0eSgpCisgICAgdWludDMyX3QgbU9mZnNldDsKKyAgICB1aW50MzJfdCBtU2l6ZTsKKy8vLyBAfQorfTsKKworLyoqCisgKiBVdGlsaXR5IGNsYXNzIGZvciBzYWZlIHJhbmdlIGNhbGN1bGF0aW9ucyB1c2luZyBzaXplX3Qtcy4KKyAqLworY2xhc3MgQzJMaW5lYXJSYW5nZSA6IHB1YmxpYyBfQzJMaW5lYXJSYW5nZUFzcGVjdCB7CitwdWJsaWM6CisgICAgaW5saW5lIGNvbnN0ZXhwciBDMkxpbmVhclJhbmdlKGNvbnN0IF9DMkxpbmVhckNhcGFjaXR5QXNwZWN0ICZwYXJlbnQsIHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplKQorICAgICAgICA6IF9DMkxpbmVhclJhbmdlQXNwZWN0KCZwYXJlbnQsIG9mZnNldCwgc2l6ZSkgeyB9CisKKyAgICBpbmxpbmUgY29uc3RleHByIEMyTGluZWFyUmFuZ2UoY29uc3QgX0MyTGluZWFyUmFuZ2VBc3BlY3QgJnBhcmVudCwgc2l6ZV90IG9mZnNldCwgc2l6ZV90IHNpemUpCisgICAgICAgIDogX0MyTGluZWFyUmFuZ2VBc3BlY3QoJnBhcmVudCwgb2Zmc2V0LCBzaXplKSB7IH0KKworICAgIGlubGluZSBjb25zdGV4cHIgQzJMaW5lYXJSYW5nZSBpbnRlcnNlY3Qoc2l6ZV90IG9mZnNldCwgc2l6ZV90IHNpemUpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIEMyTGluZWFyUmFuZ2UoKnRoaXMsIG9mZnNldCwgc2l6ZSk7CisgICAgfQorfTsKKworLyoqCisgKiBVdGlsaXR5IGNsYXNzIGZvciBzaW1wbGUgYW5kIHNhZmUgY2FwYWNpdHkgYW5kIHJhbmdlIGNvbnN0cnVjdGlvbi4KKyAqLworY2xhc3MgQzJMaW5lYXJDYXBhY2l0eSA6IHB1YmxpYyBfQzJMaW5lYXJDYXBhY2l0eUFzcGVjdCB7CitwdWJsaWM6CisgICAgaW5saW5lIGNvbnN0ZXhwciBleHBsaWNpdCBDMkxpbmVhckNhcGFjaXR5KHNpemVfdCBjYXBhY2l0eSkKKyAgICAgICAgOiBfQzJMaW5lYXJDYXBhY2l0eUFzcGVjdChjMl9taW4oY2FwYWNpdHksIHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDMyX3Q+OjptYXgoKSkpIHsgfQorCisgICAgaW5saW5lIGNvbnN0ZXhwciBDMkxpbmVhclJhbmdlIHJhbmdlKHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplKSBjb25zdCB7CisgICAgICAgIHJldHVybiBDMkxpbmVhclJhbmdlKCp0aGlzLCBvZmZzZXQsIHNpemUpOworICAgIH0KK307CisKKy8qKgorICogQXNwZWN0IGZvciBvYmplY3RzIHRoYXQgaGF2ZSBhbiBlZGl0YWJsZSBsaW5lYXIgcmFuZ2UuCisgKgorICogVGhpcyBjbGFzcyBpcyBjb3BpYWJsZS4KKyAqLworY2xhc3MgX0MyRWRpdGFibGVMaW5lYXJSYW5nZUFzcGVjdCA6IHB1YmxpYyBfQzJMaW5lYXJSYW5nZUFzcGVjdCB7CisgICAgdXNpbmcgX0MyTGluZWFyUmFuZ2VBc3BlY3Q6Ol9DMkxpbmVhclJhbmdlQXNwZWN0OworCitwdWJsaWM6CisvLy8gXG5hbWUgRWRpdGFibGUgbGluZWFyIHJhbmdlIGludGVyZmFjZQorLy8vIEB7CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBvZmZzZXQgdG8gfG9mZnNldHwsIHdoaWxlIHRyeWluZyB0byBrZWVwIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciB1bmNoYW5nZWQgKGUuZy4KKyAgICAgKiBzaXplIHdpbGwgZ3JvdyBpZiBvZmZzZXQgaXMgZGVjcmVhc2VkLCBhbmQgbWF5IHNocmluayBpZiBvZmZzZXQgaXMgaW5jcmVhc2VkLikgUmV0dXJucworICAgICAqIHRydWUgaWYgc3VjY2Vzc2Z1bCwgd2hpY2ggaXMgZXF1aXZhbGVudCB0byBpZiAwIDw9IHxvZmZzZXR8IDw9IGNhcGFjaXR5KCkuCisgICAgICoKKyAgICAgKiBOb3RlOiBzZXR0aW5nIG9mZnNldCBhbmQgc2l6ZSB3aWxsIHlpZWxkIGRpZmZlcmVudCByZXN1bHQgZGVwZW5kaW5nIG9uIHRoZSBvcmRlciBvZiB0aGUKKyAgICAgKiBvcGVyYXRpb25zLiBBbHdheXMgc2V0IG9mZnNldCBmaXJzdCB0byBlbnN1cmUgcHJvcGVyIHNpemUuCisgICAgICovCisgICAgaW5saW5lIGJvb2wgc2V0T2Zmc2V0KHVpbnQzMl90IG9mZnNldCkgeworICAgICAgICBpZiAob2Zmc2V0ID4gY2FwYWNpdHkoKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG9mZnNldCA+IG1PZmZzZXQgKyBtU2l6ZSkgeworICAgICAgICAgICAgbVNpemUgPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVNpemUgPSBtT2Zmc2V0ICsgbVNpemUgLSBvZmZzZXQ7CisgICAgICAgIH0KKyAgICAgICAgbU9mZnNldCA9IG9mZnNldDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgc2l6ZSB0byB8c2l6ZXwuIFJldHVybnMgdHJ1ZSBpZiBzdWNjZXNzZnVsLCB3aGljaCBpcyBlcXVpdmFsZW50IHRvCisgICAgICogaWYgMCA8PSB8c2l6ZXwgPD0gY2FwYWNpdHkoKSAtIG9mZnNldCgpLgorICAgICAqCisgICAgICogTm90ZTogc2V0dGluZyBvZmZzZXQgYW5kIHNpemUgd2lsbCB5aWVsZCBkaWZmZXJlbnQgcmVzdWx0IGRlcGVuZGluZyBvbiB0aGUgb3JkZXIgb2YgdGhlCisgICAgICogb3BlcmF0aW9ucy4gQWx3YXlzIHNldCBvZmZzZXQgZmlyc3QgdG8gZW5zdXJlIHByb3BlciBzaXplLgorICAgICAqLworICAgIGlubGluZSBib29sIHNldFNpemUodWludDMyX3Qgc2l6ZSkgeworICAgICAgICBpZiAoc2l6ZSA+IGNhcGFjaXR5KCkgLSBtT2Zmc2V0KSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtU2l6ZSA9IHNpemU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIG9mZnNldCB0byB8b2Zmc2V0fCB3aXRoIGJlc3QgZWZmb3J0LiBTYW1lIGFzIHNldE9mZnNldCgpIGV4Y2VwdCB0aGF0IG9mZnNldCB3aWxsCisgICAgICogYmUgY2xhbXBlZCB0byB0aGUgYnVmZmVyIGNhcGFjaXR5LgorICAgICAqCisgICAgICogTm90ZTogc2V0dGluZyBvZmZzZXQgYW5kIHNpemUgKGV2ZW4gdXNpbmcgYmVzdCBlZmZvcnQpIHdpbGwgeWllbGQgZGlmZmVyZW50IHJlc3VsdCBkZXBlbmRpbmcKKyAgICAgKiBvbiB0aGUgb3JkZXIgb2YgdGhlIG9wZXJhdGlvbnMuIEFsd2F5cyBzZXQgb2Zmc2V0IGZpcnN0IHRvIGVuc3VyZSBwcm9wZXIgc2l6ZS4KKyAgICAgKi8KKyAgICBpbmxpbmUgdm9pZCBzZXRPZmZzZXRfYmUodWludDMyX3Qgb2Zmc2V0KSB7CisgICAgICAgICh2b2lkKXNldE9mZnNldChjMl9taW4ob2Zmc2V0LCBjYXBhY2l0eSgpKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgc2l6ZSB0byB8c2l6ZXwgd2l0aCBiZXN0IGVmZm9ydC4gU2FtZSBhcyBzZXRTaXplKCkgZXhjZXB0IHRoYXQgdGhlIHNlbGVjdGVkIHJlZ2lvbgorICAgICAqIHdpbGwgYmUgY2xhbXBlZCB0byB0aGUgYnVmZmVyIGNhcGFjaXR5IChlLmcuIHNpemUgaXMgY2xhbXBlZCB0byBbMCwgY2FwYWNpdHkoKSAtIG9mZnNldCgpXSkuCisgICAgICoKKyAgICAgKiBOb3RlOiBzZXR0aW5nIG9mZnNldCBhbmQgc2l6ZSAoZXZlbiB1c2luZyBiZXN0IGVmZm9ydCkgd2lsbCB5aWVsZCBkaWZmZXJlbnQgcmVzdWx0IGRlcGVuZGluZworICAgICAqIG9uIHRoZSBvcmRlciBvZiB0aGUgb3BlcmF0aW9ucy4gQWx3YXlzIHNldCBvZmZzZXQgZmlyc3QgdG8gZW5zdXJlIHByb3BlciBzaXplLgorICAgICAqLworICAgIGlubGluZSB2b2lkIHNldFNpemVfYmUodWludDMyX3Qgc2l6ZSkgeworICAgICAgICBtU2l6ZSA9IGMyX21pbihzaXplLCBjYXBhY2l0eSgpIC0gbU9mZnNldCk7CisgICAgfQorLy8vIEB9Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgQUxMT0NBVElPTlMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLy8gXGluZ3JvdXAgYWxsb2NhdG9yIEFsbG9jYXRpb24gYW5kIG1lbW9yeSBwbGFjZW1lbnQKKy8vLyBAeworCitjbGFzcyBDMkxpbmVhckFsbG9jYXRpb247CitjbGFzcyBDMkdyYXBoaWNBbGxvY2F0aW9uOworCisvKioKKyAqICBBbGxvY2F0b3JzIGFyZSB1c2VkIGJ5IHRoZSBmcmFtZXdvcmsgdG8gYWxsb2NhdGUgbWVtb3J5IChhbGxvY2F0aW9ucykgZm9yIGJ1ZmZlcnMuIFRoZXkgY2FuCisgKiAgc3VwcG9ydCBlaXRoZXIgMUQgb3IgMkQgYWxsb2NhdGlvbnMuCisgKgorICogIFxub3RlIEluIHRoZW9yeSB0aGV5IGNvdWxkIHN1cHBvcnQgYm90aCwgYnV0IGluIHByYWN0aWNlLCB3ZSB3aWxsIHVzZSBvbmx5IG9uZSBvciB0aGUgb3RoZXIuCisgKgorICogIE5ldmVyIGNvbnN0cnVjdGVkIG9uIHN0YWNrLgorICoKKyAqICBBbGxvY2F0b3JzIGFyZSBwcm92aWRlZCBieSB2ZW5kb3JzLgorICovCitjbGFzcyBDMkFsbG9jYXRvciB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogQWxsb2NhdG9yIElEIHR5cGUuCisgICAgICovCisgICAgdHlwZWRlZiB1aW50MzJfdCBpZF90OworICAgIGVudW0gOiBpZF90IHsKKyAgICAgICAgQkFEX0lEID0gMHhCQURELCAvLyBpbnZhbGlkIGFsbG9jYXRvciBJRAorICAgIH07CisKKyAgICAvKioKKyAgICAgKiBBbGxvY2F0aW9uIHR5cGVzLiBUaGlzIGlzIGEgYml0bWFzayBhbmQgaXMgdXNlZCBpbiBDMkFsbG9jYXRvcjo6SW5mbworICAgICAqIHRvIGxpc3QgdGhlIHN1cHBvcnRlZCBhbGxvY2F0aW9uIHR5cGVzIG9mIGFuIGFsbG9jYXRvci4KKyAgICAgKi8KKyAgICBlbnVtIHR5cGVfdCA6IHVpbnQzMl90IHsKKyAgICAgICAgTElORUFSICA9IDEgPDwgMCwgLy8KKyAgICAgICAgR1JBUEhJQyA9IDEgPDwgMSwKKyAgICB9OworCisgICAgLyoqCisgICAgICogSW5mb3JtYXRpb24gYWJvdXQgYW4gYWxsb2NhdG9yLgorICAgICAqCisgICAgICogQWxsb2NhdG9ycyBkb24ndCBoYXZlIGEgcXVlcnkgQVBJIHNvIGFsbCBxdWVyaWFibGUgaW5mb3JtYXRpb24gaXMgc3RvcmVkIGhlcmUuCisgICAgICovCisgICAgc3RydWN0IFRyYWl0cyB7CisgICAgICAgIEMyU3RyaW5nIG5hbWU7ICAgICAgICAgICAgICAvLy88IGFsbG9jYXRvciBuYW1lCisgICAgICAgIGlkX3QgaWQ7ICAgICAgICAgICAgICAgICAgICAvLy88IGFsbG9jYXRvciBJRAorICAgICAgICB0eXBlX3Qgc3VwcG9ydGVkVHlwZXM7ICAgICAgLy8vPCBzdXBwb3J0ZWQgYWxsb2NhdGlvbiB0eXBlcworICAgICAgICBDMk1lbW9yeVVzYWdlIG1pbmltdW1Vc2FnZTsgLy8vPCB1c2FnZSB0aGF0IGlzIG1pbmltYWxseSByZXF1aXJlZCBmb3IgYWxsb2NhdGlvbnMKKyAgICAgICAgQzJNZW1vcnlVc2FnZSBtYXhpbXVtVXNhZ2U7IC8vLzwgdXNhZ2UgdGhhdCBpcyBtYXhpbWFsbHkgYWxsb3dlZCBmb3IgYWxsb2NhdGlvbnMKKyAgICB9OworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdW5pcXVlIG5hbWUgb2YgdGhpcyBhbGxvY2F0b3IuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIGJlICJub24tYmxvY2tpbmciIGFuZCByZXR1cm4gd2l0aGluIDFtcy4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gdGhlIG5hbWUgb2YgdGhpcyBhbGxvY2F0b3IuCisgICAgICogXHJldHZhbCBhbiBlbXB0eSBzdHJpbmcgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2ggbWVtb3J5IHRvIGFsbG9jYXRlIHRoZSBhY3R1YWwgbmFtZS4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIEMyU3RyaW5nIGdldE5hbWUoKSBjb25zdCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgdW5pcXVlIElEIGZvciB0aGlzIGFsbG9jYXRvci4gVGhpcyBJRCBpcyB1c2VkIHRvIGdldCB0aGlzIGFsbG9jYXRvciBmcm9tIHRoZQorICAgICAqIGFsbG9jYXRvciBzdG9yZSwgYW5kIHRvIGlkZW50aWZ5IHRoaXMgYWxsb2NhdG9yIGFjcm9zcyBhbGwgcHJvY2Vzc2VzLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSAibm9uLWJsb2NraW5nIiBhbmQgcmV0dXJuIHdpdGhpbiAxbXMuCisgICAgICoKKyAgICAgKiBccmV0dXJuIGEgdW5pcXVlIElEIGZvciB0aGlzIGFsbG9jYXRvci4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIGlkX3QgZ2V0SWQoKSBjb25zdCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBhbGxvY2F0b3IgdHJhaXRzLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSAibm9uLWJsb2NraW5nIiBhbmQgcmV0dXJuIHdpdGhpbiAxbXMuCisgICAgICoKKyAgICAgKiBBbGxvY2F0b3JzIGRvbid0IGhhdmUgYSBmdWxsLWZsZWRnZWQgcXVlcnkgQVBJLCBvbmx5IHRoaXMgbWV0aG9kLgorICAgICAqCisgICAgICogXHJldHVybiBhbGxvY2F0b3IgaW5mb3JtYXRpb24KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBUcmFpdHM+IGdldFRyYWl0cygpIGNvbnN0ID0gMDsKKworICAgIC8qKgorICAgICAqIEFsbG9jYXRlcyBhIDFEIGFsbG9jYXRpb24gb2YgZ2l2ZW4gfGNhcGFjaXR5fCBhbmQgfHVzYWdlfC4gSWYgc3VjY2Vzc2Z1bCwgdGhlIGFsbG9jYXRpb24gaXMKKyAgICAgKiBzdG9yZWQgaW4gfGFsbG9jYXRpb258LiBPdGhlcndpc2UsIHxhbGxvY2F0aW9ufCBpcyBzZXQgdG8gJ251bGxwdHInLgorICAgICAqCisgICAgICogXHBhcmFtIGNhcGFjaXR5ICAgICAgdGhlIHNpemUgb2YgcmVxdWVzdGVkIGFsbG9jYXRpb24gKHRoZSBhbGxvY2F0aW9uIGNvdWxkIGJlIHNsaWdodGx5CisgICAgICogICAgICAgICAgICAgICAgICAgICAgbGFyZ2VyLCBlLmcuIHRvIGFjY291bnQgZm9yIGFueSBzeXN0ZW0tcmVxdWlyZWQgYWxpZ25tZW50KQorICAgICAqIFxwYXJhbSB1c2FnZSAgICAgICAgIHRoZSBtZW1vcnkgdXNhZ2UgaW5mbyBmb3IgdGhlIHJlcXVlc3RlZCBhbGxvY2F0aW9uLiBcbm90ZSB0aGF0IHRoZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHJldHVybmVkIGFsbG9jYXRpb24gbWF5IGJlIGxhdGVyIHVzZWQvbWFwcGVkIHdpdGggZGlmZmVyZW50IHVzYWdlLgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIFRoZSBhbGxvY2F0b3Igc2hvdWxkIGxheW91dCB0aGUgYnVmZmVyIHRvIGJlIG9wdGltaXplZCBmb3IgdGhpcyB1c2FnZSwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBidXQgbXVzdCBzdXBwb3J0IGFueSB1c2FnZS4gT25lIGV4Y2VwdGlvbjogcHJvdGVjdGVkIGJ1ZmZlcnMgY2FuCisgICAgICogICAgICAgICAgICAgICAgICAgICAgb25seSBiZSB1c2VkIGluIGEgcHJvdGVjdGVkIHNjZW5hcmlvLgorICAgICAqIFxwYXJhbSBhbGxvY2F0aW9uICAgIHBvaW50ZXIgdG8gd2hlcmUgdGhlIGFsbG9jYXRpb24gc2hhbGwgYmUgc3RvcmVkIG9uIHN1Y2Nlc3MuIG51bGxwdHIKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIHN0b3JlZCBoZXJlIG9uIGZhaWx1cmUKKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBhbGxvY2F0aW9uIHdhcyBzdWNjZXNzZnVsCisgICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgbm90IGVub3VnaCBtZW1vcnkgdG8gY29tcGxldGUgdGhlIGFsbG9jYXRpb24KKyAgICAgKiBccmV0dmFsIEMyX1RJTUVEX09VVCB0aGUgYWxsb2NhdGlvbiB0aW1lZCBvdXQKKyAgICAgKiBccmV0dmFsIEMyX1JFRlVTRUQgICBubyBwZXJtaXNzaW9uIHRvIGNvbXBsZXRlIHRoZSBhbGxvY2F0aW9uCisgICAgICogXHJldHZhbCBDMl9CQURfVkFMVUUgY2FwYWNpdHkgb3IgdXNhZ2UgYXJlIG5vdCBzdXBwb3J0ZWQgKGludmFsaWQpIChjYWxsZXIgZXJyb3IpCisgICAgICogXHJldHZhbCBDMl9PTUlUVEVEICAgdGhpcyBhbGxvY2F0b3IgZG9lcyBub3Qgc3VwcG9ydCAxRCBhbGxvY2F0aW9ucworICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biwgdW5yZWNvdmVyYWJsZSBlcnJvciBvY2N1cmVkIGR1cmluZyBhbGxvY2F0aW9uICh1bmV4cGVjdGVkKQorICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgbmV3TGluZWFyQWxsb2NhdGlvbigKKyAgICAgICAgICAgIHVpbnQzMl90IGNhcGFjaXR5IF9fdW51c2VkLCBDMk1lbW9yeVVzYWdlIHVzYWdlIF9fdW51c2VkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQWxsb2NhdGlvbj4gKmFsbG9jYXRpb24gLyogbm9ubnVsbCAqLykgeworICAgICAgICAqYWxsb2NhdGlvbiA9IG51bGxwdHI7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKworICAgIC8qKgorICAgICAqIChSZSljcmVhdGVzIGEgMUQgYWxsb2NhdGlvbiBmcm9tIGEgbmF0aXZlIHxoYW5kbGV8LiBJZiBzdWNjZXNzZnVsLCB0aGUgYWxsb2NhdGlvbiBpcyBzdG9yZWQKKyAgICAgKiBpbiB8YWxsb2NhdGlvbnwuIE90aGVyd2lzZSwgfGFsbG9jYXRpb258IGlzIHNldCB0byAnbnVsbHB0cicuCisgICAgICoKKyAgICAgKiBccGFyYW0gaGFuZGxlICAgICAgdGhlIGhhbmRsZSBmb3IgdGhlIGV4aXN0aW5nIGFsbG9jYXRpb24uIE9uIHN1Y2Nlc3MsIHRoZSBhbGxvY2F0aW9uIHdpbGwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgdGFrZSBvd25lcnNoaXAgb2YgfGhhbmRsZXwuCisgICAgICogXHBhcmFtIGFsbG9jYXRpb24gIHBvaW50ZXIgdG8gd2hlcmUgdGhlIGFsbG9jYXRpb24gc2hhbGwgYmUgc3RvcmVkIG9uIHN1Y2Nlc3MuIG51bGxwdHIKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBzdG9yZWQgaGVyZSBvbiBmYWlsdXJlCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgYWxsb2NhdGlvbiB3YXMgcmVjcmVhdGVkIHN1Y2Nlc3NmdWxseQorICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIG5vdCBlbm91Z2ggbWVtb3J5IHRvIHJlY3JlYXRlIHRoZSBhbGxvY2F0aW9uCisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgdGhlIHJlY3JlYXRpb24gdGltZWQgb3V0ICh1bmV4cGVjdGVkKQorICAgICAqIFxyZXR2YWwgQzJfUkVGVVNFRCAgIG5vIHBlcm1pc3Npb24gdG8gcmVjcmVhdGUgdGhlIGFsbG9jYXRpb24KKyAgICAgKiBccmV0dmFsIEMyX0JBRF9WQUxVRSBpbnZhbGlkIGhhbmRsZSAoY2FsbGVyIGVycm9yKQorICAgICAqIFxyZXR2YWwgQzJfT01JVFRFRCAgIHRoaXMgYWxsb2NhdG9yIGRvZXMgbm90IHN1cHBvcnQgMUQgYWxsb2NhdGlvbnMKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24sIHVucmVjb3ZlcmFibGUgZXJyb3Igb2NjdXJlZCBkdXJpbmcgYWxsb2NhdGlvbiAodW5leHBlY3RlZCkKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHByaW9yTGluZWFyQWxsb2NhdGlvbigKKyAgICAgICAgICAgIGNvbnN0IEMySGFuZGxlICpoYW5kbGUgX191bnVzZWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJBbGxvY2F0aW9uPiAqYWxsb2NhdGlvbiAvKiBub25udWxsICovKSB7CisgICAgICAgICphbGxvY2F0aW9uID0gbnVsbHB0cjsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWxsb2NhdGVzIGEgMkQgYWxsb2NhdGlvbiBvZiBnaXZlbiB8d2lkdGh8LCB8aGVpZ2h0fCwgfGZvcm1hdHwgYW5kIHx1c2FnZXwuIElmIHN1Y2Nlc3NmdWwsCisgICAgICogdGhlIGFsbG9jYXRpb24gaXMgc3RvcmVkIGluIHxhbGxvY2F0aW9ufC4gT3RoZXJ3aXNlLCB8YWxsb2NhdGlvbnwgaXMgc2V0IHRvICdudWxscHRyJy4KKyAgICAgKgorICAgICAqIFxwYXJhbSB3aWR0aCAgICAgICAgIHRoZSB3aWR0aCBvZiByZXF1ZXN0ZWQgYWxsb2NhdGlvbiAodGhlIGFsbG9jYXRpb24gY291bGQgYmUgc2xpZ2h0bHkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBsYXJnZXIsIGUuZy4gdG8gYWNjb3VudCBmb3IgYW55IHN5c3RlbS1yZXF1aXJlZCBhbGlnbm1lbnQpCisgICAgICogXHBhcmFtIGhlaWdodCAgICAgICAgdGhlIGhlaWdodCBvZiByZXF1ZXN0ZWQgYWxsb2NhdGlvbiAodGhlIGFsbG9jYXRpb24gY291bGQgYmUgc2xpZ2h0bHkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBsYXJnZXIsIGUuZy4gdG8gYWNjb3VudCBmb3IgYW55IHN5c3RlbS1yZXF1aXJlZCBhbGlnbm1lbnQpCisgICAgICogXHBhcmFtIGZvcm1hdCAgICAgICAgdGhlIHBpeGVsIGZvcm1hdCBvZiByZXF1ZXN0ZWQgYWxsb2NhdGlvbi4gVGhpcyBjb3VsZCBiZSBhIHZlbmRvcgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmljIGZvcm1hdC4KKyAgICAgKiBccGFyYW0gdXNhZ2UgICAgICAgICB0aGUgbWVtb3J5IHVzYWdlIGluZm8gZm9yIHRoZSByZXF1ZXN0ZWQgYWxsb2NhdGlvbi4gXG5vdGUgdGhhdCB0aGUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICByZXR1cm5lZCBhbGxvY2F0aW9uIG1heSBiZSBsYXRlciB1c2VkL21hcHBlZCB3aXRoIGRpZmZlcmVudCB1c2FnZS4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBUaGUgYWxsb2NhdG9yIHNob3VsZCBsYXlvdXQgdGhlIGJ1ZmZlciB0byBiZSBvcHRpbWl6ZWQgZm9yIHRoaXMgdXNhZ2UsCisgICAgICogICAgICAgICAgICAgICAgICAgICAgYnV0IG11c3Qgc3VwcG9ydCBhbnkgdXNhZ2UuIE9uZSBleGNlcHRpb246IHByb3RlY3RlZCBidWZmZXJzIGNhbgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIG9ubHkgYmUgdXNlZCBpbiBhIHByb3RlY3RlZCBzY2VuYXJpby4KKyAgICAgKiBccGFyYW0gYWxsb2NhdGlvbiAgICBwb2ludGVyIHRvIHdoZXJlIHRoZSBhbGxvY2F0aW9uIHNoYWxsIGJlIHN0b3JlZCBvbiBzdWNjZXNzLiBudWxscHRyCisgICAgICogICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBzdG9yZWQgaGVyZSBvbiBmYWlsdXJlCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgYWxsb2NhdGlvbiB3YXMgc3VjY2Vzc2Z1bAorICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIG5vdCBlbm91Z2ggbWVtb3J5IHRvIGNvbXBsZXRlIHRoZSBhbGxvY2F0aW9uCisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgdGhlIGFsbG9jYXRpb24gdGltZWQgb3V0CisgICAgICogXHJldHZhbCBDMl9SRUZVU0VEICAgbm8gcGVybWlzc2lvbiB0byBjb21wbGV0ZSB0aGUgYWxsb2NhdGlvbgorICAgICAqIFxyZXR2YWwgQzJfQkFEX1ZBTFVFIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCBvciB1c2FnZSBhcmUgbm90IHN1cHBvcnRlZCAoaW52YWxpZCkgKGNhbGxlciBlcnJvcikKKyAgICAgKiBccmV0dmFsIEMyX09NSVRURUQgICB0aGlzIGFsbG9jYXRvciBkb2VzIG5vdCBzdXBwb3J0IDJEIGFsbG9jYXRpb25zCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duLCB1bnJlY292ZXJhYmxlIGVycm9yIG9jY3VyZWQgZHVyaW5nIGFsbG9jYXRpb24gKHVuZXhwZWN0ZWQpCisgICAgICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBuZXdHcmFwaGljQWxsb2NhdGlvbigKKyAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoIF9fdW51c2VkLCB1aW50MzJfdCBoZWlnaHQgX191bnVzZWQsIHVpbnQzMl90IGZvcm1hdCBfX3VudXNlZCwKKyAgICAgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgX191bnVzZWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQWxsb2NhdGlvbj4gKmFsbG9jYXRpb24gLyogbm9ubnVsbCAqLykgeworICAgICAgICAqYWxsb2NhdGlvbiA9IG51bGxwdHI7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKworICAgIC8qKgorICAgICAqIChSZSljcmVhdGVzIGEgMkQgYWxsb2NhdGlvbiBmcm9tIGEgbmF0aXZlIGhhbmRsZS4gIElmIHN1Y2Nlc3NmdWwsIHRoZSBhbGxvY2F0aW9uIGlzIHN0b3JlZAorICAgICAqIGluIHxhbGxvY2F0aW9ufC4gT3RoZXJ3aXNlLCB8YWxsb2NhdGlvbnwgaXMgc2V0IHRvICdudWxscHRyJy4KKyAgICAgKgorICAgICAqIFxwYXJhbSBoYW5kbGUgICAgICB0aGUgaGFuZGxlIGZvciB0aGUgZXhpc3RpbmcgYWxsb2NhdGlvbi4gT24gc3VjY2VzcywgdGhlIGFsbG9jYXRpb24gd2lsbAorICAgICAqICAgICAgICAgICAgICAgICAgICB0YWtlIG93bmVyc2hpcCBvZiB8aGFuZGxlfC4KKyAgICAgKiBccGFyYW0gYWxsb2NhdGlvbiAgcG9pbnRlciB0byB3aGVyZSB0aGUgYWxsb2NhdGlvbiBzaGFsbCBiZSBzdG9yZWQgb24gc3VjY2Vzcy4gbnVsbHB0cgorICAgICAqICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIHN0b3JlZCBoZXJlIG9uIGZhaWx1cmUKKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBhbGxvY2F0aW9uIHdhcyByZWNyZWF0ZWQgc3VjY2Vzc2Z1bGx5CisgICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgbm90IGVub3VnaCBtZW1vcnkgdG8gcmVjcmVhdGUgdGhlIGFsbG9jYXRpb24KKyAgICAgKiBccmV0dmFsIEMyX1RJTUVEX09VVCB0aGUgcmVjcmVhdGlvbiB0aW1lZCBvdXQgKHVuZXhwZWN0ZWQpCisgICAgICogXHJldHZhbCBDMl9SRUZVU0VEICAgbm8gcGVybWlzc2lvbiB0byByZWNyZWF0ZSB0aGUgYWxsb2NhdGlvbgorICAgICAqIFxyZXR2YWwgQzJfQkFEX1ZBTFVFIGludmFsaWQgaGFuZGxlIChjYWxsZXIgZXJyb3IpCisgICAgICogXHJldHZhbCBDMl9PTUlUVEVEICAgdGhpcyBhbGxvY2F0b3IgZG9lcyBub3Qgc3VwcG9ydCAyRCBhbGxvY2F0aW9ucworICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biwgdW5yZWNvdmVyYWJsZSBlcnJvciBvY2N1cmVkIGR1cmluZyByZWNyZWF0aW9uICh1bmV4cGVjdGVkKQorICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcHJpb3JHcmFwaGljQWxsb2NhdGlvbigKKyAgICAgICAgICAgIGNvbnN0IEMySGFuZGxlICpoYW5kbGUgX191bnVzZWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQWxsb2NhdGlvbj4gKmFsbG9jYXRpb24gLyogbm9ubnVsbCAqLykgeworICAgICAgICAqYWxsb2NhdGlvbiA9IG51bGxwdHI7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKworICAgIHZpcnR1YWwgfkMyQWxsb2NhdG9yKCkgPSBkZWZhdWx0OworcHJvdGVjdGVkOgorICAgIEMyQWxsb2NhdG9yKCkgPSBkZWZhdWx0OworfTsKKworLyoqCisgKiBcaW5ncm91cCBsaW5lYXIgYWxsb2NhdG9yCisgKiAxRCBhbGxvY2F0aW9uIGludGVyZmFjZS4KKyAqLworY2xhc3MgQzJMaW5lYXJBbGxvY2F0aW9uIDogcHVibGljIF9DMkxpbmVhckNhcGFjaXR5QXNwZWN0IHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBNYXBzIGEgcG9ydGlvbiBvZiBhbiBhbGxvY2F0aW9uIHN0YXJ0aW5nIGZyb20gfG9mZnNldHwgd2l0aCB8c2l6ZXwgaW50byBsb2NhbCBwcm9jZXNzIG1lbW9yeS4KKyAgICAgKiBTdG9yZXMgdGhlIHN0YXJ0aW5nIGFkZHJlc3MgaW50byB8YWRkcnwsIG9yIE5VTEwgaWYgdGhlIG9wZXJhdGlvbiB3YXMgdW5zdWNjZXNzZnVsLgorICAgICAqIHxmZW5jZXwgd2lsbCBjb250YWluIGFuIGFjcXVpcmUgc3luYyBmZW5jZSBvYmplY3QuIElmIGl0IGlzIGFscmVhZHkKKyAgICAgKiBzYWZlIHRvIGFjY2VzcyB0aGUgYnVmZmVyIGNvbnRlbnRzLCB0aGVuIGl0IHdpbGwgY29udGFpbiBhbiBlbXB0eSAoYWxyZWFkeSBmaXJlZCkgZmVuY2UuCisgICAgICoKKyAgICAgKiBccGFyYW0gb2Zmc2V0ICAgICAgICBzdGFydGluZyBwb3NpdGlvbiBvZiB0aGUgcG9ydGlvbiB0byBiZSBtYXBwZWQgKHRoaXMgZG9lcyBub3QgaGF2ZSB0bworICAgICAqICAgICAgICAgICAgICAgICAgICAgIGJlIHBhZ2UgYWxpZ25lZCkKKyAgICAgKiBccGFyYW0gc2l6ZSAgICAgICAgICBzaXplIG9mIHRoZSBwb3J0aW9uIHRvIGJlIG1hcHBlZCAodGhpcyBkb2VzIG5vdCBoYXZlIHRvIGJlIHBhZ2UKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBhbGlnbmVkKQorICAgICAqIFxwYXJhbSB1c2FnZSAgICAgICAgIHRoZSBkZXNpcmVkIHVzYWdlLiBcdG9kbyB0aGlzIG11c3QgYmUga1NvZnR3YXJlUmVhZCBhbmQvb3IKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBrU29mdHdhcmVXcml0ZS4KKyAgICAgKiBccGFyYW0gZmVuY2UgICAgICAgICBhIHBvaW50ZXIgdG8gYSBmZW5jZSBvYmplY3QgaWYgYW4gYXN5bmMgbWFwcGluZyBpcyByZXF1ZXN0ZWQuIElmCisgICAgICogICAgICAgICAgICAgICAgICAgICAgbm90LW51bGwsIGFuZCBhY3F1aXJlIGZlbmNlIHdpbGwgYmUgc3RvcmVkIGhlcmUgb24gc3VjY2Vzcywgb3IgZW1wdHkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBmZW5jZSBvbiBmYWlsdXJlLiBJZiBudWxsLCB0aGUgbWFwcGluZyB3aWxsIGJlIHN5bmNocm9ub3VzLgorICAgICAqIFxwYXJhbSBhZGRyICAgICAgICAgIGEgcG9pbnRlciB0byB3aGVyZSB0aGUgc3RhcnRpbmcgYWRkcmVzcyBvZiB0aGUgbWFwcGVkIHBvcnRpb24gd2lsbCBiZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHN0b3JlZC4gT24gZmFpbHVyZSwgbnVsbHB0ciB3aWxsIGJlIHN0b3JlZCBoZXJlLgorICAgICAqCisgICAgICogXHRvZG8gT25seSBvbmUgcG9ydGlvbiBjYW4gYmUgbWFwcGVkIGF0IHRoZSBzYW1lIHRpbWUgLSB0aGlzIGlzIHRydWUgZm9yIGdyYWxsb2MsIGJ1dCB0aGVyZQorICAgICAqICAgICAgIGlzIG5vIG5lZWQgZm9yIHRoaXMgZm9yIDFEIGJ1ZmZlcnMuCisgICAgICogXHRvZG8gRG8gd2UgbmVlZCB0byBzdXBwb3J0IHN5bmMgb3BlcmF0aW9uIGFzIHdlIGNvdWxkIGp1c3Qgd2FpdCBmb3IgdGhlIGZlbmNlPworICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bAorICAgICAqIFxyZXR2YWwgQzJfUkVGVVNFRCAgIG5vIHBlcm1pc3Npb24gdG8gbWFwIHRoZSBwb3J0aW9uCisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgdGhlIG9wZXJhdGlvbiB0aW1lZCBvdXQKKyAgICAgKiBccmV0dmFsIEMyX0RVUExJQ0FURSBpZiB0aGUgYWxsb2NhdGlvbiBpcyBhbHJlYWR5IG1hcHBlZC4KKyAgICAgKiBccmV0dmFsIEMyX05PX01FTU9SWSBub3QgZW5vdWdoIG1lbW9yeSB0byBjb21wbGV0ZSB0aGUgb3BlcmF0aW9uCisgICAgICogXHJldHZhbCBDMl9CQURfVkFMVUUgdGhlIHBhcmFtZXRlcnMgKG9mZnNldC9zaXplKSBhcmUgaW52YWxpZCBvciBvdXRzaWRlIHRoZSBhbGxvY2F0aW9uLCBvcgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHRoZSB1c2FnZSBmbGFncyBhcmUgaW52YWxpZCAoY2FsbGVyIGVycm9yKQorICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgdGhlIG9wZXJhdGlvbiBmcm9tIGNvbXBsZXRpbmcgKHVuZXhwZWN0ZWQpCisgICAgICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBtYXAoCisgICAgICAgICAgICBzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwgQzJNZW1vcnlVc2FnZSB1c2FnZSwgQzJGZW5jZSAqZmVuY2UgLyogbnVsbGFibGUgKi8sCisgICAgICAgICAgICB2b2lkICoqYWRkciAvKiBub25udWxsICovKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBVbm1hcHMgYSBwb3J0aW9uIG9mIGFuIGFsbG9jYXRpb24gYXQgfGFkZHJ8IHdpdGggfHNpemV8LiBUaGVzZSBtdXN0IGJlIHBhcmFtZXRlcnMgcHJldmlvdXNseQorICAgICAqIHBhc3NlZCB0byBhbmQgcmV0dXJuZWQgYnkgfG1hcHw7IG90aGVyd2lzZSwgdGhpcyBvcGVyYXRpb24gaXMgYSBuby1vcC4KKyAgICAgKgorICAgICAqIFxwYXJhbSBhZGRyICAgICAgICAgIHN0YXJ0aW5nIGFkZHJlc3Mgb2YgdGhlIG1hcHBlZCByZWdpb24KKyAgICAgKiBccGFyYW0gc2l6ZSAgICAgICAgICBzaXplIG9mIHRoZSBtYXBwZWQgcmVnaW9uCisgICAgICogXHBhcmFtIGZlbmNlICAgICAgICAgYSBwb2ludGVyIHRvIGEgZmVuY2Ugb2JqZWN0IGlmIGFuIGFzeW5jIHVubWFwcGluZyBpcyByZXF1ZXN0ZWQuIElmCisgICAgICogICAgICAgICAgICAgICAgICAgICAgbm90LW51bGwsIGEgcmVsZWFzZSBmZW5jZSB3aWxsIGJlIHN0b3JlZCBoZXJlIG9uIHN1Y2Nlc3MsIG9yIGVtcHR5IGZlbmNlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgb24gZmFpbHVyZS4gVGhpcyBmZW5jZSBzaWduYWxzIHdoZW4gdGhlIG9yaWdpbmFsIGFsbG9jYXRpb24gY29udGFpbnMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBhbGwgY2hhbmdlcyB0aGF0IGhhcHBlbmVkIHRvIHRoZSBtYXBwZWQgcmVnaW9uLiBJZiBudWxsLCB0aGUgdW5tYXBwaW5nCisgICAgICogICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBzeW5jaHJvbm91cy4KKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwKKyAgICAgKiBccmV0dmFsIEMyX1RJTUVEX09VVCB0aGUgb3BlcmF0aW9uIHRpbWVkIG91dAorICAgICAqIFxyZXR2YWwgQzJfTk9UX0ZPVU5EIGlmIHRoZSBhbGxvY2F0aW9uIHdhcyBub3QgbWFwcGVkIHByZXZpb3VzbHkuCisgICAgICogXHJldHZhbCBDMl9CQURfVkFMVUUgdGhlIHBhcmFtZXRlcnMgKGFkZHIvc2l6ZSkgZG8gbm90IGNvcnJlc3BvbmQgdG8gcHJldmlvdXNseSBtYXBwZWQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICByZWdpb25zIChjYWxsZXIgZXJyb3IpCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duIGVycm9yIHByZXZlbnRlZCB0aGUgb3BlcmF0aW9uIGZyb20gY29tcGxldGluZyAodW5leHBlY3RlZCkKKyAgICAgKiBccmV0dmFsIEMyX1JFRlVTRUQgICBubyBwZXJtaXNzaW9uIHRvIHVubWFwIHRoZSBwb3J0aW9uICh1bmV4cGVjdGVkIC0gc3lzdGVtKQorICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgdW5tYXAodm9pZCAqYWRkciwgc2l6ZV90IHNpemUsIEMyRmVuY2UgKmZlbmNlIC8qIG51bGxhYmxlICovKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBhbGxvY2F0b3IgSUQgZm9yIHRoaXMgYWxsb2NhdGlvbi4gVGhpcyBpcyB1c2VmdWwgdG8gcHV0IHRoZSBoYW5kbGUgaW50byBjb250ZXh0LgorICAgICAqLworICAgIHZpcnR1YWwgQzJBbGxvY2F0b3I6OmlkX3QgZ2V0QWxsb2NhdG9ySWQoKSBjb25zdCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgYWxsb2NhdGlvbiBoYW5kbGUuCisgICAgICovCisgICAgdmlydHVhbCBjb25zdCBDMkhhbmRsZSAqaGFuZGxlKCkgY29uc3QgPSAwOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgaXMgdGhlIHNhbWUgYWxsb2NhdGlvbiBhcyB8b3RoZXJ8LgorICAgICAqLworICAgIHZpcnR1YWwgYm9vbCBlcXVhbHMoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQWxsb2NhdGlvbj4gJm90aGVyKSBjb25zdCA9IDA7CisKK3Byb3RlY3RlZDoKKyAgICAvLyBcdG9kbyBzaG91bGQgd2UgbGltaXQgYWxsb2NhdGlvbiBkaXJlY3RseT8KKyAgICBDMkxpbmVhckFsbG9jYXRpb24oc2l6ZV90IGNhcGFjaXR5KSA6IF9DMkxpbmVhckNhcGFjaXR5QXNwZWN0KGMyX21pbihjYXBhY2l0eSwgVUlOVDMyX01BWCkpIHt9CisgICAgdmlydHVhbCB+QzJMaW5lYXJBbGxvY2F0aW9uKCkgPSBkZWZhdWx0OworfTsKKworY2xhc3MgQzJDaXJjdWxhckJsb2NrOworY2xhc3MgQzJMaW5lYXJCbG9jazsKK2NsYXNzIEMyR3JhcGhpY0Jsb2NrOworCisvKioKKyAqICBCbG9jayBwb29scyBhcmUgdXNlZCBieSBjb21wb25lbnRzIHRvIG9idGFpbiBvdXRwdXQgYnVmZmVycyBpbiBhbiBlZmZpY2llbnQgd2F5LiBUaGV5IGNhbgorICogIHN1cHBvcnQgZWl0aGVyIGxpbmVhciAoMUQpLCBjaXJjdWxhciAoMUQpIG9yIGdyYXBoaWMgKDJEKSBibG9ja3MuCisgKgorICogIEJsb2NrIHBvb2xzIGRlY291cGxlIHRoZSByZWN5Y2xpbmcgb2YgbWVtb3J5L2FsbG9jYXRpb25zIGZyb20gdGhlIGNvbXBvbmVudHMuIFRoZXkgYXJlIG1lYW50IHRvCisgKiAgYmUgYW4gb3BhcXVlIHNlcnZpY2UgKHRoZXJlIGFyZSBubyBwdWJsaWMgQVBJcyBvdGhlciB0aGFuIG9idGFpbmluZyBibG9ja3MpIHByb3ZpZGVkIGJ5IHRoZQorICogIHBsYXRmb3JtLiBCbG9jayBwb29scyBhcmUgYWxzbyBtZWFudCB0byBkZWNvdXBsZSBhbGxvY2F0aW9ucyBmcm9tIG1lbW9yeSB1c2VkIGJ5IGJ1ZmZlcnMuIFRoaXMKKyAqICBpcyBhY2NvbXBsaXNoZWQgYnkgYWxsb3dpbmcgcG9vbHMgdG8gYWxsb3QgbXVsdGlwbGUgbWVtb3J5ICdibG9ja3MnIG9uIGEgc2luZ2xlIGFsbG9jYXRpb24uIEFzCisgKiAgdGhlaXIgbmFtZSBzdWdnZXN0LCBibG9jayBwb29scyBtYWludGFpbiBhIHBvb2wgb2YgbWVtb3J5IGJsb2Nrcy4gV2hlbiBhIGNvbXBvbmVudCBhc2tzIGZvcgorICogIGEgbWVtb3J5IGJsb2NrLCBwb29scyB3aWxsIHRyeSB0byByZXR1cm4gYSBmcmVlIG1lbW9yeSBibG9jayBhbHJlYWR5IGluIHRoZSBwb29sLiBJZiBubyBzdWNoCisgKiAgYmxvY2sgZXhpc3RzLCB0aGV5IHdpbGwgYWxsb2NhdGUgbWVtb3J5IHVzaW5nIHRoZSBiYWNraW5nIGFsbG9jYXRvciBhbmQgYWxsb3QgYSBibG9jayBvbiB0aGF0CisgKiAgYWxsb2NhdGlvbi4gV2hlbiBibG9ja3MgYXJlIG5vIGxvbmdlciB1c2VkIGluIHRoZSBzeXN0ZW0sIHRoZXkgYXJlIHJlY3ljbGVkIGJhY2sgdG8gdGhlIGJsb2NrCisgKiAgcG9vbCBhbmQgYXJlIGF2YWlsYWJsZSBhcyBmcmVlIGJsb2Nrcy4KKyAqCisgKiAgTmV2ZXIgY29uc3RydWN0ZWQgb24gc3RhY2suCisgKi8KK2NsYXNzIEMyQmxvY2tQb29sIHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBCbG9jayBwb29sIElEIHR5cGUuCisgICAgICovCisgICAgdHlwZWRlZiB1aW50NjRfdCBsb2NhbF9pZF90OworCisgICAgZW51bSA6IGxvY2FsX2lkX3QgeworICAgICAgICBCQVNJQ19MSU5FQVIgPSAwLCAgLy8vPCBJRCBvZiBiYXNpYyAodW5vcHRpbWl6ZWQpIGJsb2NrIHBvb2wgZm9yIGZldGNoaW5nIDFEIGJsb2NrcworICAgICAgICBCQVNJQ19HUkFQSElDID0gMSwgLy8vPCBJRCBvZiBiYXNpYyAodW5vcHRpbWl6ZWQpIGJsb2NrIHBvb2wgZm9yIGZldGNoaW5nIDJEIGJsb2NrcworICAgICAgICBQTEFURk9STV9TVEFSVCA9IDB4MTAsCisgICAgfTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIElEIGZvciB0aGlzIGJsb2NrIHBvb2wuIFRoaXMgSUQgaXMgdXNlZCB0byBnZXQgdGhpcyBibG9jayBwb29sIGZyb20gdGhlIHBsYXRmb3JtLgorICAgICAqIEl0IGlzIG9ubHkgdmFsaWQgaW4gdGhlIGN1cnJlbnQgcHJvY2Vzcy4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgYmUgIm5vbi1ibG9ja2luZyIgYW5kIHJldHVybiB3aXRoaW4gMW1zLgorICAgICAqCisgICAgICogXHJldHVybiBhIGxvY2FsIElEIGZvciB0aGlzIGJsb2NrIHBvb2wuCisgICAgICovCisgICAgdmlydHVhbCBsb2NhbF9pZF90IGdldExvY2FsSWQoKSBjb25zdCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBJRCBvZiB0aGUgYmFja2luZyBhbGxvY2F0b3Igb2YgdGhpcyBibG9jayBwb29sLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSAibm9uLWJsb2NraW5nIiBhbmQgcmV0dXJuIHdpdGhpbiAxbXMuCisgICAgICoKKyAgICAgKiBccmV0dXJuIHRoZSBJRCBvZiB0aGUgYmFja2luZyBhbGxvY2F0b3Igb2YgdGhpcyBibG9jayBwb29sLgorICAgICAqLworICAgIHZpcnR1YWwgQzJBbGxvY2F0b3I6OmlkX3QgZ2V0QWxsb2NhdG9ySWQoKSBjb25zdCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBPYnRhaW5zIGEgbGluZWFyIHdyaXRlYWJsZSBibG9jayBvZiBnaXZlbiB8Y2FwYWNpdHl8IGFuZCB8dXNhZ2V8LiBJZiBzdWNjZXNzZnVsLCB0aGUKKyAgICAgKiBibG9jayBpcyBzdG9yZWQgaW4gfGJsb2NrfC4gT3RoZXJ3aXNlLCB8YmxvY2t8IGlzIHNldCB0byAnbnVsbHB0cicuCisgICAgICoKKyAgICAgKiBccGFyYW0gY2FwYWNpdHkgdGhlIHNpemUgb2YgcmVxdWVzdGVkIGJsb2NrLgorICAgICAqIFxwYXJhbSB1c2FnZSAgICB0aGUgbWVtb3J5IHVzYWdlIGluZm8gZm9yIHRoZSByZXF1ZXN0ZWQgYmxvY2suIFJldHVybmVkIGJsb2NrcyB3aWxsIGJlCisgICAgICogICAgICAgICAgICAgICAgIG9wdGltaXplZCBmb3IgdGhpcyB1c2FnZSwgYnV0IG1heSBiZSB1c2VkIHdpdGggYW55IHVzYWdlLiBPbmUgZXhjZXB0aW9uOgorICAgICAqICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgYmxvY2tzL2J1ZmZlcnMgY2FuIG9ubHkgYmUgdXNlZCBpbiBhIHByb3RlY3RlZCBzY2VuYXJpby4KKyAgICAgKiBccGFyYW0gYmxvY2sgICAgcG9pbnRlciB0byB3aGVyZSB0aGUgb2J0YWluZWQgYmxvY2sgc2hhbGwgYmUgc3RvcmVkIG9uIHN1Y2Nlc3MuIG51bGxwdHIgd2lsbAorICAgICAqICAgICAgICAgICAgICAgICBiZSBzdG9yZWQgaGVyZSBvbiBmYWlsdXJlCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsCisgICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgbm90IGVub3VnaCBtZW1vcnkgdG8gY29tcGxldGUgYW55IHJlcXVpcmVkIGFsbG9jYXRpb24KKyAgICAgKiBccmV0dmFsIEMyX1RJTUVEX09VVCB0aGUgb3BlcmF0aW9uIHRpbWVkIG91dAorICAgICAqIFxyZXR2YWwgQzJfUkVGVVNFRCAgIG5vIHBlcm1pc3Npb24gdG8gY29tcGxldGUgYW55IHJlcXVpcmVkIGFsbG9jYXRpb24KKyAgICAgKiBccmV0dmFsIEMyX0JBRF9WQUxVRSBjYXBhY2l0eSBvciB1c2FnZSBhcmUgbm90IHN1cHBvcnRlZCAoaW52YWxpZCkgKGNhbGxlciBlcnJvcikKKyAgICAgKiBccmV0dmFsIEMyX09NSVRURUQgICB0aGlzIHBvb2wgZG9lcyBub3Qgc3VwcG9ydCBsaW5lYXIgYmxvY2tzCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duLCB1bnJlY292ZXJhYmxlIGVycm9yIG9jY3VyZWQgZHVyaW5nIG9wZXJhdGlvbiAodW5leHBlY3RlZCkKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGZldGNoTGluZWFyQmxvY2soCisgICAgICAgICAgICB1aW50MzJfdCBjYXBhY2l0eSBfX3VudXNlZCwgQzJNZW1vcnlVc2FnZSB1c2FnZSBfX3VudXNlZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiAqYmxvY2sgLyogbm9ubnVsbCAqLykgeworICAgICAgICAqYmxvY2sgPSBudWxscHRyOworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPYnRhaW5zIGEgY2lyY3VsYXIgd3JpdGVhYmxlIGJsb2NrIG9mIGdpdmVuIHxjYXBhY2l0eXwgYW5kIHx1c2FnZXwuIElmIHN1Y2Nlc3NmdWwsIHRoZQorICAgICAqIGJsb2NrIGlzIHN0b3JlZCBpbiB8YmxvY2t8LiBPdGhlcndpc2UsIHxibG9ja3wgaXMgc2V0IHRvICdudWxscHRyJy4KKyAgICAgKgorICAgICAqIFxwYXJhbSBjYXBhY2l0eSB0aGUgc2l6ZSBvZiByZXF1ZXN0ZWQgY2lyY3VsYXIgYmxvY2suIChub3RlOiB0aGUgc2l6ZSBvZiB0aGUgb2J0YWluZWQKKyAgICAgKiAgICAgICAgICAgICAgICAgYmxvY2sgY291bGQgYmUgc2xpZ2h0bHkgbGFyZ2VyLCBlLmcuIHRvIGFjY29tbW9kYXRlIGFueSBzeXN0ZW0tcmVxdWlyZWQKKyAgICAgKiAgICAgICAgICAgICAgICAgYWxpZ25tZW50KQorICAgICAqIFxwYXJhbSB1c2FnZSAgICB0aGUgbWVtb3J5IHVzYWdlIGluZm8gZm9yIHRoZSByZXF1ZXN0ZWQgYmxvY2suIFJldHVybmVkIGJsb2NrcyB3aWxsIGJlCisgICAgICogICAgICAgICAgICAgICAgIG9wdGltaXplZCBmb3IgdGhpcyB1c2FnZSwgYnV0IG1heSBiZSB1c2VkIHdpdGggYW55IHVzYWdlLiBPbmUgZXhjZXB0aW9uOgorICAgICAqICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgYmxvY2tzL2J1ZmZlcnMgY2FuIG9ubHkgYmUgdXNlZCBpbiBhIHByb3RlY3RlZCBzY2VuYXJpby4KKyAgICAgKiBccGFyYW0gYmxvY2sgICAgcG9pbnRlciB0byB3aGVyZSB0aGUgb2J0YWluZWQgYmxvY2sgc2hhbGwgYmUgc3RvcmVkIG9uIHN1Y2Nlc3MuIG51bGxwdHIKKyAgICAgKiAgICAgICAgICAgICAgICAgd2lsbCBiZSBzdG9yZWQgaGVyZSBvbiBmYWlsdXJlCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsCisgICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgbm90IGVub3VnaCBtZW1vcnkgdG8gY29tcGxldGUgYW55IHJlcXVpcmVkIGFsbG9jYXRpb24KKyAgICAgKiBccmV0dmFsIEMyX1RJTUVEX09VVCB0aGUgb3BlcmF0aW9uIHRpbWVkIG91dAorICAgICAqIFxyZXR2YWwgQzJfUkVGVVNFRCAgIG5vIHBlcm1pc3Npb24gdG8gY29tcGxldGUgYW55IHJlcXVpcmVkIGFsbG9jYXRpb24KKyAgICAgKiBccmV0dmFsIEMyX0JBRF9WQUxVRSBjYXBhY2l0eSBvciB1c2FnZSBhcmUgbm90IHN1cHBvcnRlZCAoaW52YWxpZCkgKGNhbGxlciBlcnJvcikKKyAgICAgKiBccmV0dmFsIEMyX09NSVRURUQgICB0aGlzIHBvb2wgZG9lcyBub3Qgc3VwcG9ydCBjaXJjdWxhciBibG9ja3MKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24sIHVucmVjb3ZlcmFibGUgZXJyb3Igb2NjdXJlZCBkdXJpbmcgb3BlcmF0aW9uICh1bmV4cGVjdGVkKQorICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgZmV0Y2hDaXJjdWxhckJsb2NrKAorICAgICAgICAgICAgdWludDMyX3QgY2FwYWNpdHkgX191bnVzZWQsIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgX191bnVzZWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDaXJjdWxhckJsb2NrPiAqYmxvY2sgLyogbm9ubnVsbCAqLykgeworICAgICAgICAqYmxvY2sgPSBudWxscHRyOworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPYnRhaW5zIGEgMkQgZ3JhcGhpYyBibG9jayBvZiBnaXZlbiB8d2lkdGh8LCB8aGVpZ2h0fCwgfGZvcm1hdHwgYW5kIHx1c2FnZXwuIElmIHN1Y2Nlc3NmdWwsCisgICAgICogdGhlIGJsb2NrIGlzIHN0b3JlZCBpbiB8YmxvY2t8LiBPdGhlcndpc2UsIHxibG9ja3wgaXMgc2V0IHRvICdudWxscHRyJy4KKyAgICAgKgorICAgICAqIFxwYXJhbSB3aWR0aCAgdGhlIHdpZHRoIG9mIHJlcXVlc3RlZCBibG9jayAodGhlIG9idGFpbmVkIGJsb2NrIGNvdWxkIGJlIHNsaWdodGx5IGxhcmdlciwgZS5nLgorICAgICAqICAgICAgICAgICAgICAgdG8gYWNjb21tb2RhdGUgYW55IHN5c3RlbS1yZXF1aXJlZCBhbGlnbm1lbnQpCisgICAgICogXHBhcmFtIGhlaWdodCB0aGUgaGVpZ2h0IG9mIHJlcXVlc3RlZCBibG9jayAodGhlIG9idGFpbmVkIGJsb2NrIGNvdWxkIGJlIHNsaWdodGx5IGxhcmdlciwKKyAgICAgKiAgICAgICAgICAgICAgIGUuZy4gdG8gYWNjb21tb2RhdGUgYW55IHN5c3RlbS1yZXF1aXJlZCBhbGlnbm1lbnQpCisgICAgICogXHBhcmFtIGZvcm1hdCB0aGUgcGl4ZWwgZm9ybWF0IG9mIHJlcXVlc3RlZCBibG9jay4gVGhpcyBjb3VsZCBiZSBhIHZlbmRvciBzcGVjaWZpYyBmb3JtYXQuCisgICAgICogXHBhcmFtIHVzYWdlICB0aGUgbWVtb3J5IHVzYWdlIGluZm8gZm9yIHRoZSByZXF1ZXN0ZWQgYmxvY2suIFJldHVybmVkIGJsb2NrcyB3aWxsIGJlCisgICAgICogICAgICAgICAgICAgICBvcHRpbWl6ZWQgZm9yIHRoaXMgdXNhZ2UsIGJ1dCBtYXkgYmUgdXNlZCB3aXRoIGFueSB1c2FnZS4gT25lIGV4Y2VwdGlvbjoKKyAgICAgKiAgICAgICAgICAgICAgIHByb3RlY3RlZCBibG9ja3MvYnVmZmVycyBjYW4gb25seSBiZSB1c2VkIGluIGEgcHJvdGVjdGVkIHNjZW5hcmlvLgorICAgICAqIFxwYXJhbSBibG9jayAgcG9pbnRlciB0byB3aGVyZSB0aGUgb2J0YWluZWQgYmxvY2sgc2hhbGwgYmUgc3RvcmVkIG9uIHN1Y2Nlc3MuIG51bGxwdHIKKyAgICAgKiAgICAgICAgICAgICAgIHdpbGwgYmUgc3RvcmVkIGhlcmUgb24gZmFpbHVyZQorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bAorICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIG5vdCBlbm91Z2ggbWVtb3J5IHRvIGNvbXBsZXRlIGFueSByZXF1aXJlZCBhbGxvY2F0aW9uCisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgdGhlIG9wZXJhdGlvbiB0aW1lZCBvdXQKKyAgICAgKiBccmV0dmFsIEMyX1JFRlVTRUQgICBubyBwZXJtaXNzaW9uIHRvIGNvbXBsZXRlIGFueSByZXF1aXJlZCBhbGxvY2F0aW9uCisgICAgICogXHJldHZhbCBDMl9CQURfVkFMVUUgd2lkdGgsIGhlaWdodCwgZm9ybWF0IG9yIHVzYWdlIGFyZSBub3Qgc3VwcG9ydGVkIChpbnZhbGlkKSAoY2FsbGVyCisgICAgICogICAgICAgICAgICAgICAgICAgICAgZXJyb3IpCisgICAgICogXHJldHZhbCBDMl9PTUlUVEVEICAgdGhpcyBwb29sIGRvZXMgbm90IHN1cHBvcnQgMkQgYmxvY2tzCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duLCB1bnJlY292ZXJhYmxlIGVycm9yIG9jY3VyZWQgZHVyaW5nIG9wZXJhdGlvbiAodW5leHBlY3RlZCkKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGZldGNoR3JhcGhpY0Jsb2NrKAorICAgICAgICAgICAgdWludDMyX3Qgd2lkdGggX191bnVzZWQsIHVpbnQzMl90IGhlaWdodCBfX3VudXNlZCwgdWludDMyX3QgZm9ybWF0IF9fdW51c2VkLAorICAgICAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSBfX3VudXNlZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gKmJsb2NrIC8qIG5vbm51bGwgKi8pIHsKKyAgICAgICAgKmJsb2NrID0gbnVsbHB0cjsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorCisgICAgdmlydHVhbCB+QzJCbG9ja1Bvb2woKSA9IGRlZmF1bHQ7Citwcm90ZWN0ZWQ6CisgICAgQzJCbG9ja1Bvb2woKSA9IGRlZmF1bHQ7Cit9OworCisvLy8gQH0KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAgQkxPQ0tTCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLyoqCisgKiBCbG9ja3MgYXJlIHNlY3Rpb25zIG9mIGFsbG9jYXRpb25zLiBUaGV5IGNhbiBiZSBlaXRoZXIgMUQgb3IgMkQuCisgKi8KKworY2xhc3MgQzJMaW5lYXJBbGxvY2F0aW9uOworCisvKioKKyAqIEEgMUQgYmxvY2suCisgKgorICogXG5vdGUgY2FwYWNpdHkoKSBpcyBub3QgbWVhbmluZ2Z1bCBmb3IgdXNlcnMgb2YgYmxvY2tzOyBpbnN0ZWFkIHNpemUoKSBpcyB0aGUgY2FwYWNpdHkgb2YgdGhlCisgKiB1c2FibGUgcG9ydGlvbi4gVXNlIGFuZCBvZmZzZXQoKSBhbmQgc2l6ZSgpIGlmIGFjY2Vzc2luZyB0aGUgYmxvY2sgZGlyZWN0bHkgdGhyb3VnaCBpdHMgaGFuZGxlCisgKiB0byByZXByZXNlbnQgdGhlIGFsbG90dGVkIHJhbmdlIG9mIHRoZSB1bmRlcmx5aW5nIGFsbG9jYXRpb24gdG8gdGhpcyBibG9jay4KKyAqLworY2xhc3MgQzJCbG9jazFEIDogcHVibGljIF9DMkxpbmVhclJhbmdlQXNwZWN0IHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB1bmRlcmx5aW5nIGhhbmRsZSBmb3IgdGhpcyBhbGxvY2F0aW9uLgorICAgICAqCisgICAgICogXG5vdGUgdGhhdCB0aGUgYmxvY2sgYW5kIGl0cyBibG9jayBwb29sIGhhcyBzaGFyZWQgb3duZXJzaGlwIG9mIHRoZSBoYW5kbGUKKyAgICAgKiAgICAgICBhbmQgaWYgYWxsIHJlZmVyZW5jZXMgdG8gdGhlIGJsb2NrIGFyZSByZWxlYXNlZCwgdGhlIHVuZGVybHlpbmcgYmxvY2sKKyAgICAgKiAgICAgICBhbGxvY2F0aW9uIG1heSBnZXQgcmV1c2VkIGV2ZW4gaWYgYSBjbGllbnQga2VlcHMgYSBjbG9uZSBvZiB0aGlzIGhhbmRsZS4KKyAgICAgKi8KKyAgICBjb25zdCBDMkhhbmRsZSAqaGFuZGxlKCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBhbGxvY2F0b3IncyBJRCB0aGF0IGNyZWF0ZWQgdGhlIHVuZGVybHlpbmcgYWxsb2NhdGlvbiBmb3IgdGhpcyBibG9jay4gVGhpcworICAgICAqIHByb3ZpZGVzIHRoZSBjb250ZXh0IGZvciB1bmRlcnN0YW5kaW5nIHRoZSBoYW5kbGUuCisgICAgICovCisgICAgQzJBbGxvY2F0b3I6OmlkX3QgZ2V0QWxsb2NhdG9ySWQoKSBjb25zdDsKKworcHJvdGVjdGVkOgorICAgIGNsYXNzIEltcGw7CisgICAgLyoqIGNvbnN0cnVjdCBhIGJsb2NrLiAqLworICAgIEMyQmxvY2sxRChzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gaW1wbCwgY29uc3QgX0MyTGluZWFyUmFuZ2VBc3BlY3QgJnJhbmdlKTsKKworICAgIGZyaWVuZCBzdHJ1Y3QgX0MyQmxvY2tGYWN0b3J5OworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBtSW1wbDsKK307CisKKy8qKgorICogUmVhZCB2aWV3IHByb3ZpZGVzIHJlYWQtb25seSBhY2Nlc3MgZm9yIGEgbGluZWFyIG1lbW9yeSBzZWdtZW50LgorICoKKyAqIFRoaXMgY2xhc3MgaXMgY29waWFibGUuCisgKi8KK2NsYXNzIEMyUmVhZFZpZXcgOiBwdWJsaWMgX0MyTGluZWFyQ2FwYWNpdHlBc3BlY3QgeworcHVibGljOgorICAgIC8qKgorICAgICAqIFxyZXR1cm4gcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgdGhlIGJsb2NrIG9yIG51bGxwdHIgb24gZXJyb3IuCisgICAgICogICAgICAgICBUaGlzIHBvaW50ZXIgaXMgb25seSB2YWxpZCBkdXJpbmcgdGhlIGxpZmV0aW1lIG9mIHRoaXMgdmlldyBvciB1bnRpbCBpdCBpcyByZWxlYXNlZC4KKyAgICAgKi8KKyAgICBjb25zdCB1aW50OF90ICpkYXRhKCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgcG9ydGlvbiBvZiB0aGlzIHZpZXcuCisgICAgICoKKyAgICAgKiBccGFyYW0gb2Zmc2V0ICB0aGUgc3RhcnQgb2Zmc2V0IG9mIHRoZSBwb3J0aW9uLiBcbm90ZSBUaGlzIGlzIGNsYW1wZWQgdG8gdGhlIGNhcGFjaXR5IG9mIHRoaXMKKyAgICAgKiAgICAgICAgICAgICAgdmlldy4KKyAgICAgKiBccGFyYW0gc2l6ZSAgICB0aGUgc2l6ZSBvZiB0aGUgcG9ydGlvbi4gXG5vdGUgVGhpcyBpcyBjbGFtcGVkIHRvIHRoZSByZW1haW5pbmcgZGF0YSBmcm9tIG9mZnNldC4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gYSByZWFkIHZpZXcgY29udGFpbmluZyBhIHBvcnRpb24gb2YgdGhpcyB2aWV3CisgICAgICovCisgICAgQzJSZWFkVmlldyBzdWJWaWV3KHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFxyZXR1cm4gZXJyb3IgZHVyaW5nIHRoZSBjcmVhdGlvbi9tYXBwaW5nIG9mIHRoaXMgdmlldy4KKyAgICAgKi8KKyAgICBjMl9zdGF0dXNfdCBlcnJvcigpIGNvbnN0OworCisgICAgLyoqCisgICAgICogUmVsZWFzZXMgdGhpcyB2aWV3LiBUaGlzIHNldHMgZXJyb3IgdG8gQzJfTk9fSU5JVC4KKyAgICAgKi8KKyAgICAvL3ZvaWQgcmVsZWFzZSgpOworCitwcm90ZWN0ZWQ6CisgICAgY2xhc3MgSW1wbDsKKyAgICBDMlJlYWRWaWV3KHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBpbXBsLCB1aW50MzJfdCBvZmZzZXQsIHVpbnQzMl90IHNpemUpOworICAgIGV4cGxpY2l0IEMyUmVhZFZpZXcoYzJfc3RhdHVzX3QgZXJyb3IpOworCitwcml2YXRlOgorICAgIGZyaWVuZCBzdHJ1Y3QgX0MyQmxvY2tGYWN0b3J5OworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBtSW1wbDsKKyAgICB1aW50MzJfdCBtT2Zmc2V0OyAvKio8IG9mZnNldCBpbnRvIHRoZSBsaW5lYXIgYmxvY2sgYmFja2luZyB0aGlzIHJlYWQgdmlldyAqLworfTsKKworLyoqCisgKiBXcml0ZSB2aWV3IHByb3ZpZGVzIHJlYWQvd3JpdGUgYWNjZXNzIGZvciBhIGxpbmVhciBtZW1vcnkgc2VnbWVudC4KKyAqCisgKiBUaGlzIGNsYXNzIGlzIGNvcGlhYmxlLiBcdG9kbyBtb3ZhYmxlIG9ubHk/CisgKi8KK2NsYXNzIEMyV3JpdGVWaWV3IDogcHVibGljIF9DMkVkaXRhYmxlTGluZWFyUmFuZ2VBc3BlY3QgeworcHVibGljOgorICAgIC8qKgorICAgICAqIFN0YXJ0IG9mIHRoZSBibG9jay4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgdGhlIGJsb2NrIG9yIG51bGxwdHIgb24gZXJyb3IuCisgICAgICogICAgICAgICBUaGlzIHBvaW50ZXIgaXMgb25seSB2YWxpZCBkdXJpbmcgdGhlIGxpZmV0aW1lIG9mIHRoaXMgdmlldyBvciB1bnRpbCBpdCBpcyByZWxlYXNlZC4KKyAgICAgKi8KKyAgICB1aW50OF90ICpiYXNlKCk7CisKKyAgICAvKioKKyAgICAgKiBccmV0dXJuIHBvaW50ZXIgdG8gdGhlIGJsb2NrIGF0IHRoZSBjdXJyZW50IG9mZnNldCBvciBudWxscHRyIG9uIGVycm9yLgorICAgICAqICAgICAgICAgVGhpcyBwb2ludGVyIGlzIG9ubHkgdmFsaWQgZHVyaW5nIHRoZSBsaWZldGltZSBvZiB0aGlzIHZpZXcgb3IgdW50aWwgaXQgaXMgcmVsZWFzZWQuCisgICAgICovCisgICAgdWludDhfdCAqZGF0YSgpOworCisgICAgLyoqCisgICAgICogXHJldHVybiBlcnJvciBkdXJpbmcgdGhlIGNyZWF0aW9uL21hcHBpbmcgb2YgdGhpcyB2aWV3LgorICAgICAqLworICAgIGMyX3N0YXR1c190IGVycm9yKCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBSZWxlYXNlcyB0aGlzIHZpZXcuIFRoaXMgc2V0cyBlcnJvciB0byBDMl9OT19JTklULgorICAgICAqLworICAgIC8vdm9pZCByZWxlYXNlKCk7CisKK3Byb3RlY3RlZDoKKyAgICBjbGFzcyBJbXBsOworICAgIEMyV3JpdGVWaWV3KHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBpbXBsKTsKKyAgICBleHBsaWNpdCBDMldyaXRlVmlldyhjMl9zdGF0dXNfdCBlcnJvcik7CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIHN0cnVjdCBfQzJCbG9ja0ZhY3Rvcnk7CisgICAgc3RkOjpzaGFyZWRfcHRyPEltcGw+IG1JbXBsOworfTsKKworLyoqCisgKiBBIGNvbnN0YW50IChyZWFkLW9ubHkpIGxpbmVhciBibG9jayAocG9ydGlvbiBvZiBhbiBhbGxvY2F0aW9uKSB3aXRoIGFuIGFjcXVpcmUgZmVuY2UuCisgKiBCbG9ja3MgYXJlIHVubWFwcGVkIHdoZW4gY3JlYXRlZCwgYW5kIGNhbiBiZSBtYXBwZWQgaW50byBhIHJlYWQgdmlldyBvbiBkZW1hbmQuCisgKgorICogVGhpcyBjbGFzcyBpcyBjb3BpYWJsZSBhbmQgY29udGFpbnMgYSByZWZlcmVuY2UgdG8gdGhlIGFsbG9jYXRpb24gdGhhdCBpdCBpcyBiYXNlZCBvbi4KKyAqLworY2xhc3MgQzJDb25zdExpbmVhckJsb2NrIDogcHVibGljIEMyQmxvY2sxRCB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogTWFwcyB0aGlzIGJsb2NrIGludG8gbWVtb3J5IGFuZCByZXR1cm5zIGEgcmVhZCB2aWV3IGZvciBpdC4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gYSByZWFkIHZpZXcgZm9yIHRoaXMgYmxvY2suCisgICAgICovCisgICAgQzJBY3F1aXJhYmxlPEMyUmVhZFZpZXc+IG1hcCgpIGNvbnN0OworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHBvcnRpb24gb2YgdGhpcyBibG9jay4KKyAgICAgKgorICAgICAqIFxwYXJhbSBvZmZzZXQgIHRoZSBzdGFydCBvZmZzZXQgb2YgdGhlIHBvcnRpb24uIFxub3RlIFRoaXMgaXMgY2xhbXBlZCB0byB0aGUgY2FwYWNpdHkgb2YgdGhpcworICAgICAqICAgICAgICAgICAgICBibG9jay4KKyAgICAgKiBccGFyYW0gc2l6ZSAgICB0aGUgc2l6ZSBvZiB0aGUgcG9ydGlvbi4gXG5vdGUgVGhpcyBpcyBjbGFtcGVkIHRvIHRoZSByZW1haW5pbmcgZGF0YSBmcm9tIG9mZnNldC4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gYSBjb25zdGFudCBsaW5lYXIgYmxvY2sgY29udGFpbmluZyBhIHBvcnRpb24gb2YgdGhpcyBibG9jaworICAgICAqLworICAgIEMyQ29uc3RMaW5lYXJCbG9jayBzdWJCbG9jayhzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBhY3F1aXJlIGZlbmNlIGZvciB0aGlzIGJsb2NrLgorICAgICAqCisgICAgICogXHJldHVybiBhIGZlbmNlIHRoYXQgbXVzdCBiZSB3YWl0ZWQgb24gYmVmb3JlIHJlYWRpbmcgdGhlIGJsb2NrLgorICAgICAqLworICAgIEMyRmVuY2UgZmVuY2UoKSBjb25zdCB7IHJldHVybiBtRmVuY2U7IH0KKworcHJvdGVjdGVkOgorICAgIEMyQ29uc3RMaW5lYXJCbG9jayhzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gaW1wbCwgY29uc3QgX0MyTGluZWFyUmFuZ2VBc3BlY3QgJnJhbmdlLCBDMkZlbmNlIG1GZW5jZSk7CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIHN0cnVjdCBfQzJCbG9ja0ZhY3Rvcnk7CisgICAgQzJGZW5jZSBtRmVuY2U7Cit9OworCisvKioKKyAqIExpbmVhciBibG9jayBpcyBhIHdyaXRlYWJsZSAxRCBibG9jay4gT25jZSB3cml0dGVuLCBpdCBjYW4gYmUgc2hhcmVkIGluIHdob2xlIG9yIGluIHBhcnRzIHdpdGgKKyAqIGNvbnN1bWVycy9yZWFkZXJzIGFzIHJlYWQtb25seSBjb25zdCBsaW5lYXIgYmxvY2socykuCisgKi8KK2NsYXNzIEMyTGluZWFyQmxvY2sgOiBwdWJsaWMgQzJCbG9jazFEIHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBNYXBzIHRoaXMgYmxvY2sgaW50byBtZW1vcnkgYW5kIHJldHVybnMgYSB3cml0ZSB2aWV3IGZvciBpdC4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gYSB3cml0ZSB2aWV3IGZvciB0aGlzIGJsb2NrLgorICAgICAqLworICAgIEMyQWNxdWlyYWJsZTxDMldyaXRlVmlldz4gbWFwKCk7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgcmVhZC1vbmx5IGNvbnN0IGxpbmVhciBibG9jayBmb3IgYSBwb3J0aW9uIG9mIHRoaXMgYmxvY2s7IG9wdGlvbmFsbHkgcHJvdGVjdGVkCisgICAgICogYnkgYW4gYWNxdWlyZSBmZW5jZS4gVGhlcmUgYXJlIHR3byB3YXlzIHRvIHVzZSB0aGlzOgorICAgICAqCisgICAgICogMSkgc2hhcmUgcmVhZHkgYmxvY2sgYWZ0ZXIgd3JpdGluZyBkYXRhIGludG8gdGhlIGJsb2NrLiBJbiB0aGlzIGNhc2Ugbm8gZmVuY2Ugc2hhbGwgYmUKKyAgICAgKiAgICBzdXBwbGllZCwgYW5kIHRoZSBibG9jayBzaGFsbCBub3QgYmUgbW9kaWZpZWQgYWZ0ZXIgY2FsbGluZyB0aGlzIG1ldGhvZC4KKyAgICAgKiAyKSBzaGFyZSBibG9jayBtZXRhZGF0YSBiZWZvcmUgYWN0dWFsbHkgKGZpbmlzaGluZykgd3JpdGluZyB0aGUgZGF0YSBpbnRvIHRoZSBibG9jay4gSW4KKyAgICAgKiAgICB0aGlzIGNhc2UgYSBmZW5jZSBtdXN0IGJlIHN1cHBsaWVkIHRoYXQgd2lsbCBiZSB0cmlnZ2VyZWQgd2hlbiB0aGUgZGF0YSBpcyB3cml0dGVuLgorICAgICAqICAgIFRoZSBibG9jayBzaGFsbCBiZSBtb2RpZmllZCBvbmx5IHVudGlsIGZpcmluZyB0aGUgZXZlbnQgZm9yIHRoZSBmZW5jZS4KKyAgICAgKi8KKyAgICBDMkNvbnN0TGluZWFyQmxvY2sgc2hhcmUoc2l6ZV90IG9mZnNldCwgc2l6ZV90IHNpemUsIEMyRmVuY2UgZmVuY2UpOworCitwcm90ZWN0ZWQ6CisgICAgQzJMaW5lYXJCbG9jayhzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gaW1wbCwgY29uc3QgX0MyTGluZWFyUmFuZ2VBc3BlY3QgJnJhbmdlKTsKKworICAgIGZyaWVuZCBzdHJ1Y3QgX0MyQmxvY2tGYWN0b3J5OworfTsKKworLy8vIEB9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICBDSVJDVUxBUiBCTE9DS1MgQU5EIFZJRVdTCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8vIFxkZWZncm91cCBjaXJjdWxhciBDaXJjdWxhciBidWZmZXIgc3VwcG9ydAorLy8vIEB7CisKKy8qKgorICogQ2lyY3VsYXIgYmxvY2tzIGNhbiBiZSB1c2VkIHRvIHNoYXJlIGRhdGEgYmV0d2VlbiBhIHdyaXRlciBhbmQgYSByZWFkZXIgKGFuZC9vciBvdGhlciBjb25zdW1lcnMpLQorICogaW4gYSBtZW1vcnktZWZmaWNpZW50IHdheSBieSByZXVzaW5nIGEgc2VjdGlvbiBvZiBtZW1vcnkuIENpcmN1bGFyIGJsb2NrcyBhcmUgYSBiaXQgbW9yZSBjb21wbGV4CisgKiB0aGFuIHNpbmdsZSByZWFkZXIvc2luZ2xlIHdyaXRlciBzY2hlbWVzIHRvIGZhY2lsaXRhdGUgYmxvY2stYmFzZWQgY29uc3VtaW5nIG9mIGRhdGEuCisgKgorICogVGhleSBjYW4gb3BlcmF0ZSBpbiB0d28gbW9kZXM6CisgKgorICogMSkgb25lIHdyaXRlciB0aGF0IGNyZWF0ZXMgYmxvY2tzIHRvIGJlIGNvbnN1bWVkICh0aGlzIG1vZGVsIGNhbiBiZSB1c2VkIGJ5IGNvbXBvbmVudHMpCisgKgorICogMikgb25lIHdyaXRlciB0aGF0IHdyaXRlcyBjb250aW51b3VzbHksIGFuZCBvbmUgcmVhZGVyIHRoYXQgY2FuIGNyZWF0ZXMgYmxvY2tzIHRvIGJlIGNvbnN1bWVkCisgKiAgICBieSBmdXJ0aGVyIHJlY2lwaWVudHMgKHRoaXMgbW9kZWwgaXMgdXNlZCBieSB0aGUgZnJhbWV3b3JrLCBhbmQgY2Fubm90IGJlIHVzZWQgYnkgY29tcG9uZW50cy4pCisgKgorICogQ2lyY3VsYXIgYmxvY2tzIGhhdmUgZm91ciBzZWdtZW50cyB3aXRoIHJ1bm5pbmcgcG9pbnRlcnM6CisgKiAgLSByZXNlcnZlZDogZGF0YSByZXNlcnZlZCBhbmQgYXZhaWxhYmxlIGZvciB0aGUgd3JpdGVyCisgKiAgLSBjb21taXR0ZWQ6IGRhdGEgY29tbWl0dGVkIGJ5IHRoZSB3cml0ZXIgYW5kIGF2YWlsYWJsZSB0byB0aGUgcmVhZGVyIChpZiBwcmVzZW50KQorICogIC0gdXNlZDogZGF0YSB1c2VkIGJ5IGNvbnN1bWVycyAoaWYgcHJlc2VudCkKKyAqICAtIGF2YWlsYWJsZTogdW51c2VkIGRhdGEgYXZhaWxhYmxlIHRvIGJlIHJlc2VydmVkCisgKi8KK2NsYXNzIEMyQ2lyY3VsYXJCbG9jayA6IHB1YmxpYyBDMkJsb2NrMUQgeworICAgIC8vIFRPRE86IGFkZCBtZXRob2RzCisKK3ByaXZhdGU6CisgICAgc2l6ZV90IG1SZXNlcnZlZCBfX3VudXNlZDsgICAvLyBlbmQgb2YgcmVzZXJ2ZWQgc2VjdGlvbgorICAgIHNpemVfdCBtQ29tbWl0dGVkIF9fdW51c2VkOyAgLy8gZW5kIG9mIGNvbW1pdHRlZCBzZWN0aW9uCisgICAgc2l6ZV90IG1Vc2VkIF9fdW51c2VkOyAgICAgICAvLyBlbmQgb2YgdXNlZCBzZWN0aW9uCisgICAgc2l6ZV90IG1GcmVlIF9fdW51c2VkOyAgICAgICAvLyBlbmQgb2YgZnJlZSBzZWN0aW9uCit9OworCitjbGFzcyBfQzJDaXJjdWxhckJsb2NrU2VnbWVudCA6IHB1YmxpYyBfQzJMaW5lYXJDYXBhY2l0eUFzcGVjdCB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgYXZhaWxhYmxlIHNpemUgZm9yIHRoaXMgc2VnbWVudC4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gY3VycmVudGx5IGF2YWlsYWJsZSBzaXplIGZvciB0aGlzIHNlZ21lbnQKKyAgICAgKi8KKyAgICBzaXplX3QgYXZhaWxhYmxlKCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBSZXNlcnZlIHNvbWUgc3BhY2UgZm9yIHRoaXMgc2VnbWVudCBmcm9tIGl0cyBjdXJyZW50IHN0YXJ0LgorICAgICAqCisgICAgICogXHBhcmFtIHNpemUgICAgZGVzaXJlZCBzcGFjZSBpbiBieXRlcworICAgICAqIFxwYXJhbSBmZW5jZSAgIGEgcG9pbnRlciB0byBhbiBhY3F1aXJlIGZlbmNlLiBJZiBub24tbnVsbCwgdGhlIHJlc2VydmF0aW9uIGlzIGFzeW5jaHJvbm91cyBhbmQKKyAgICAgKiAgICAgICAgICAgICAgYSBmZW5jZSB3aWxsIGJlIHN0b3JlZCBoZXJlIHRoYXQgd2lsbCBiZSBzaWduYWxlZCB3aGVuIHRoZSByZXNlcnZhdGlvbiBpcworICAgICAqICAgICAgICAgICAgICBjb21wbGV0ZS4gSWYgbnVsbCwgdGhlIHJlc2VydmF0aW9uIGlzIHN5bmNocm9ub3VzLgorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgICAgIHRoZSBzcGFjZSB3YXMgc3VjY2Vzc2Z1bGx5IHJlc2VydmVkCisgICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgICAgIHRoZSBzcGFjZSByZXF1ZXN0ZWQgY2Fubm90IGJlIHJlc2VydmVkCisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgICAgIHRoZSByZXNlcnZhdGlvbiB0aW1lZCBvdXQgXHRvZG8gd2hlbj8KKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCAgICAgc29tZSB1bmtub3duIGVycm9yIHByZXZlbnRlZCByZXNlcnZpbmcgc3BhY2UuICh1bmV4cGVjdGVkKQorICAgICAqLworICAgIGMyX3N0YXR1c190IHJlc2VydmUoc2l6ZV90IHNpemUsIEMyRmVuY2UgKmZlbmNlIC8qIG51bGxhYmxlICovKTsKKworICAgIC8qKgorICAgICAqIEFiYW5kb25zIGEgcG9ydGlvbiBvZiB0aGlzIHNlZ21lbnQuIFRoaXMgd2lsbCBtb3ZlIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhpcyBzZWdtZW50LgorICAgICAqCisgICAgICogXG5vdGUgVGhpcyBtZXRob2RzIGlzIG9ubHkgYWxsb3dlZCBpZiB0aGlzIHNlZ21lbnQgaXMgcHJvZHVjaW5nIGJsb2Nrcy4KKyAgICAgKgorICAgICAqIFxwYXJhbSBzaXplICAgIG51bWJlciBvZiBieXRlcyB0byBhYmFuZG9uCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICAgICAgdGhlIGRhdGEgd2FzIHN1Y2Nlc3NmdWxseSBhYmFuZG9uZWQKKyAgICAgKiBccmV0dmFsIEMyX1RJTUVEX09VVCAgICAgdGhlIG9wZXJhdGlvbiB0aW1lZCBvdXQgKHVuZXhwZWN0ZWQpCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgICAgIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgYWJhbmRvbmluZyB0aGUgZGF0YSAodW5leHBlY3RlZCkKKyAgICAgKi8KKyAgICBjMl9zdGF0dXNfdCBhYmFuZG9uKHNpemVfdCBzaXplKTsKKworICAgIC8qKgorICAgICAqIFNoYXJlIGEgcG9ydGlvbiBhcyBibG9jayhzKSB3aXRoIGNvbnN1bWVycyAodGhlc2UgYXJlIG1vdmVkIHRvIHRoZSB1c2VkIHNlY3Rpb24pLgorICAgICAqCisgICAgICogXG5vdGUgVGhpcyBtZXRob2RzIGlzIG9ubHkgYWxsb3dlZCBpZiB0aGlzIHNlZ21lbnQgaXMgcHJvZHVjaW5nIGJsb2Nrcy4KKyAgICAgKiBcbm90ZSBTaGFyZSBkb2VzIG5vdCBtb3ZlIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHNlZ21lbnQuIChcdG9kbyBhZGQgYWJhbmRvbi9vZmZzZXQ/KQorICAgICAqCisgICAgICogXHBhcmFtIHNpemUgICAgbnVtYmVyIG9mIGJ5dGVzIHRvIHNoYXJlCisgICAgICogXHBhcmFtIGZlbmNlICAgZmVuY2UgdG8gYmUgdXNlZCBmb3IgdGhlIHNlY3Rpb24KKyAgICAgKiBccGFyYW0gYmxvY2tzICB2ZWN0b3Igd2hlcmUgdGhlIGJsb2NrcyBvZiB0aGUgc2VjdGlvbiBhcmUgYXBwZW5kZWQgdG8KKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgICAgICB0aGUgcG9ydGlvbiB3YXMgc3VjY2Vzc2Z1bGx5IHNoYXJlZAorICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZICAgICBub3QgZW5vdWdoIG1lbW9yeSB0byBzaGFyZSB0aGUgcG9ydGlvbgorICAgICAqIFxyZXR2YWwgQzJfVElNRURfT1VUICAgICB0aGUgb3BlcmF0aW9uIHRpbWVkIG91dCAodW5leHBlY3RlZCkKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCAgICAgc29tZSB1bmtub3duIGVycm9yIHByZXZlbnRlZCBzaGFyaW5nIHRoZSBkYXRhICh1bmV4cGVjdGVkKQorICAgICAqLworICAgIGMyX3N0YXR1c190IHNoYXJlKHNpemVfdCBzaXplLCBDMkZlbmNlIGZlbmNlLCBzdGQ6OnZlY3RvcjxDMkNvbnN0TGluZWFyQmxvY2s+ICZibG9ja3MpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgYmVnaW5uaW5nIG9mZnNldCBvZiB0aGlzIHNlZ21lbnQgZnJvbSB0aGUgc3RhcnQgb2YgdGhpcyBjaXJjdWxhciBibG9jay4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYmVnaW5uaW5nIG9mZnNldAorICAgICAqLworICAgIHNpemVfdCBiZWdpbigpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgZW5kIG9mZnNldCBvZiB0aGlzIHNlZ21lbnQgZnJvbSB0aGUgc3RhcnQgb2YgdGhpcyBjaXJjdWxhciBibG9jay4KKyAgICAgKgorICAgICAqIEByZXR1cm4gZW5kIG9mZnNldAorICAgICAqLworICAgIHNpemVfdCBlbmQoKTsKK307CisKKy8qKgorICogQSBjaXJjdWxhciB3cml0ZS12aWV3IGlzIGEgZHluYW1pYyBtYXBwZWQgdmlldyBmb3IgYSBzZWdtZW50IG9mIGEgY2lyY3VsYXIgYmxvY2suIENhcmUgbXVzdCBiZQorICogdGFrZW4gd2hlbiB1c2luZyB0aGlzIHZpZXcgc28gdGhhdCBvbmx5IHRoZSBzZWN0aW9uIG93bmVkIGJ5IHRoZSBzZWdtZW50IGlzIG1vZGlmaWVkLgorICovCitjbGFzcyBDMkNpcmN1bGFyV3JpdGVWaWV3IDogcHVibGljIF9DMkxpbmVhckNhcGFjaXR5QXNwZWN0IHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBTdGFydCBvZiB0aGUgY2lyY3VsYXIgYmxvY2suCisgICAgICogXG5vdGUgdGhlIHNlZ21lbnQgZG9lcyBub3Qgb3duIHRoaXMgcG9pbnRlci4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgdGhlIGNpcmN1bGFyIGJsb2NrIG9yIG51bGxwdHIgb24gZXJyb3IuCisgICAgICovCisgICAgdWludDhfdCAqYmFzZSgpOworCisgICAgLyoqCisgICAgICogXHJldHVybiBlcnJvciBkdXJpbmcgdGhlIGNyZWF0aW9uL21hcHBpbmcgb2YgdGhpcyB2aWV3LgorICAgICAqLworICAgIGMyX3N0YXR1c190IGVycm9yKCkgY29uc3Q7Cit9OworCisvKioKKyAqIFRoZSB3cml0ZXIgb2YgYSBjaXJjdWxhciBidWZmZXIuCisgKgorICogQ2FuIGNvbW1pdCBkYXRhIHRvIGEgcmVhZGVyIChub3Qgc3VwcG9ydGVkIGZvciBjb21wb25lbnRzKSBPUiBzaGFyZSBkYXRhIGJsb2NrcyBkaXJlY3RseSB3aXRoIGEKKyAqIGNvbnN1bWVyLgorICoKKyAqIElmIGEgY29tcG9uZW50IHN1cHBvcnRzIG91dHB1dHRpbmcgZGF0YSBpbnRvIGNpcmN1bGFyIGJ1ZmZlcnMsIGl0IG11c3QgYWxsb2NhdGUgYSBjaXJjdWxhcgorICogYmxvY2sgYW5kIHVzZSBhIGNpcmN1bGFyIHdyaXRlci4KKyAqLworY2xhc3MgQzJDaXJjdWxhcldyaXRlciA6IHB1YmxpYyBfQzJDaXJjdWxhckJsb2NrU2VnbWVudCB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogQ29tbWl0cyBhIHBvcnRpb24gb2YgdGhpcyBzZWdtZW50IHRvIHRoZSBuZXh0IHNlZ21lbnQuIFRoaXMgbW92ZXMgdGhlIGJlZ2lubmluZyBvZiB0aGUKKyAgICAgKiBzZWdtZW50LgorICAgICAqCisgICAgICogXHBhcmFtIHNpemUgICAgbnVtYmVyIG9mIGJ5dGVzIHRvIGNvbW1pdCB0byB0aGUgbmV4dCBzZWdtZW50CisgICAgICogXHBhcmFtIGZlbmNlICAgZmVuY2UgdXNlZCBmb3IgdGhlIGNvbW1pdCAodGhlIGZlbmNlIG11c3Qgc2lnbmFsIGJlZm9yZSB0aGUgZGF0YSBpcyBjb21taXR0ZWQpCisgICAgICovCisgICAgYzJfc3RhdHVzX3QgY29tbWl0KHNpemVfdCBzaXplLCBDMkZlbmNlIGZlbmNlKTsKKworICAgIC8qKgorICAgICAqIE1hcHMgdGhpcyBibG9jayBpbnRvIG1lbW9yeSBhbmQgcmV0dXJucyBhIHdyaXRlIHZpZXcgZm9yIGl0LgorICAgICAqCisgICAgICogXHJldHVybiBhIHdyaXRlIHZpZXcgZm9yIHRoaXMgYmxvY2suCisgICAgICovCisgICAgQzJBY3F1aXJhYmxlPEMyQ2lyY3VsYXJXcml0ZVZpZXc+IG1hcCgpOworfTsKKworLy8vIEB9CisKKy8vLyBcZGVmZ3JvdXAgZ3JhcGhpYyBHcmFwaGljIERhdGEgQmxvY2tzCisvLy8gQHsKKworLyoqCisgKiBDMlJlY3Q6IHJlY3RhbmdsZSB0eXBlIHdpdGggbm9uLW5lZ2F0aXZlIGNvb3JkaW5hdGVzLgorICoKKyAqIFxub3RlIFRoaXMgc3RydWN0IGhhcyBwdWJsaWMgZmllbGRzIHdpdGhvdXQgZ2V0dGVycy9zZXR0ZXJzLiBBbGwgbWV0aG9kcyBhcmUgaW5saW5lLgorICovCitzdHJ1Y3QgQzJSZWN0IHsKKy8vIHB1YmxpYzoKKyAgICB1aW50MzJfdCB3aWR0aDsKKyAgICB1aW50MzJfdCBoZWlnaHQ7CisgICAgdWludDMyX3QgbGVmdDsKKyAgICB1aW50MzJfdCB0b3A7CisKKyAgICBjb25zdGV4cHIgaW5saW5lIEMyUmVjdCgpCisgICAgICAgIDogQzJSZWN0KDAsIDAsIDAsIDApIHsgfQorCisgICAgY29uc3RleHByIGlubGluZSBDMlJlY3QodWludDMyX3Qgd2lkdGhfLCB1aW50MzJfdCBoZWlnaHRfKQorICAgICAgICA6IEMyUmVjdCh3aWR0aF8sIGhlaWdodF8sIDAsIDApIHsgfQorCisgICAgY29uc3RleHByIEMyUmVjdCBpbmxpbmUgYXQodWludDMyX3QgbGVmdF8sIHVpbnQzMl90IHRvcF8pIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIEMyUmVjdCh3aWR0aCwgaGVpZ2h0LCBsZWZ0XywgdG9wXyk7CisgICAgfQorCisgICAgLy8gdXRpbGl0eSBtZXRob2RzCisKKyAgICBpbmxpbmUgY29uc3RleHByIGJvb2wgaXNFbXB0eSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIHdpZHRoID09IDAgfHwgaGVpZ2h0ID09IDA7CisgICAgfQorCisgICAgaW5saW5lIGNvbnN0ZXhwciBib29sIGlzVmFsaWQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBsZWZ0IDw9IH53aWR0aCAmJiB0b3AgPD0gfmhlaWdodDsKKyAgICB9CisKKyAgICBpbmxpbmUgY29uc3RleHByIG9wZXJhdG9yIGJvb2woKSBjb25zdCB7CisgICAgICAgIHJldHVybiBpc1ZhbGlkKCkgJiYgIWlzRW1wdHkoKTsKKyAgICB9CisKKyAgICBpbmxpbmUgY29uc3RleHByIGJvb2wgb3BlcmF0b3IhKCkgY29uc3QgeworICAgICAgICByZXR1cm4gIWJvb2woKnRoaXMpOworICAgIH0KKworICAgIEMyX0FMTE9XX09WRVJGTE9XCisgICAgaW5saW5lIGNvbnN0ZXhwciBib29sIGNvbnRhaW5zKGNvbnN0IEMyUmVjdCAmb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgaWYgKCFpc1ZhbGlkKCkgfHwgIW90aGVyLmlzVmFsaWQoKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGxlZnQgPD0gb3RoZXIubGVmdCAmJiB0b3AgPD0gb3RoZXIudG9wCisgICAgICAgICAgICAgICAgICAgICYmIGxlZnQgKyB3aWR0aCA+PSBvdGhlci5sZWZ0ICsgb3RoZXIud2lkdGgKKyAgICAgICAgICAgICAgICAgICAgJiYgdG9wICsgaGVpZ2h0ID49IG90aGVyLnRvcCArIG90aGVyLmhlaWdodDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlubGluZSBjb25zdGV4cHIgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEMyUmVjdCAmb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgaWYgKCFpc1ZhbGlkKCkpIHsKKyAgICAgICAgICAgIHJldHVybiAhb3RoZXIuaXNWYWxpZCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGxlZnQgPT0gb3RoZXIubGVmdCAmJiB0b3AgPT0gb3RoZXIudG9wCisgICAgICAgICAgICAgICAgICAgICYmIHdpZHRoID09IG90aGVyLndpZHRoICYmIGhlaWdodCA9PSBvdGhlci5oZWlnaHQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbmxpbmUgY29uc3RleHByIGJvb2wgb3BlcmF0b3IhPShjb25zdCBDMlJlY3QgJm90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiAhb3BlcmF0b3I9PShvdGhlcik7CisgICAgfQorCisgICAgaW5saW5lIGNvbnN0ZXhwciBib29sIG9wZXJhdG9yPj0oY29uc3QgQzJSZWN0ICZvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gY29udGFpbnMob3RoZXIpOworICAgIH0KKworICAgIGlubGluZSBjb25zdGV4cHIgYm9vbCBvcGVyYXRvcj4oY29uc3QgQzJSZWN0ICZvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gY29udGFpbnMob3RoZXIpICYmICFvcGVyYXRvcj09KG90aGVyKTsKKyAgICB9CisKKyAgICBpbmxpbmUgY29uc3RleHByIGJvb2wgb3BlcmF0b3I8PShjb25zdCBDMlJlY3QgJm90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiBvdGhlci5jb250YWlucygqdGhpcyk7CisgICAgfQorCisgICAgaW5saW5lIGNvbnN0ZXhwciBib29sIG9wZXJhdG9yPChjb25zdCBDMlJlY3QgJm90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiBvdGhlci5jb250YWlucygqdGhpcykgJiYgIW9wZXJhdG9yPT0ob3RoZXIpOworICAgIH0KKworICAgIEMyX0FMTE9XX09WRVJGTE9XCisgICAgaW5saW5lIGNvbnN0ZXhwciB1aW50MzJfdCByaWdodCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGxlZnQgKyB3aWR0aDsKKyAgICB9CisKKyAgICBDMl9BTExPV19PVkVSRkxPVworICAgIGlubGluZSBjb25zdGV4cHIgdWludDMyX3QgYm90dG9tKCkgY29uc3QgeworICAgICAgICByZXR1cm4gdG9wICsgaGVpZ2h0OworICAgIH0KKworICAgIEMyX0FMTE9XX09WRVJGTE9XCisgICAgaW5saW5lIGNvbnN0ZXhwciBDMlJlY3QgaW50ZXJzZWN0KGNvbnN0IEMyUmVjdCAmb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIEMyUmVjdChjMl9taW4ocmlnaHQoKSwgb3RoZXIucmlnaHQoKSkgLSBjMl9tYXgobGVmdCwgb3RoZXIubGVmdCksCisgICAgICAgICAgICAgICAgICAgICAgYzJfbWluKGJvdHRvbSgpLCBvdGhlci5ib3R0b20oKSkgLSBjMl9tYXgodG9wLCBvdGhlci50b3ApLAorICAgICAgICAgICAgICAgICAgICAgIGMyX21heChsZWZ0LCBvdGhlci5sZWZ0KSwKKyAgICAgICAgICAgICAgICAgICAgICBjMl9tYXgodG9wLCBvdGhlci50b3ApKTsKKyAgICB9CisKKyAgICAvKiogY2xhbXBzIHJpZ2h0IGFuZCBib3R0b20gdG8gdG9wLCBsZWZ0IGlmIHRoZXkgb3ZlcmZsb3cgKi8KKyAgICBpbmxpbmUgY29uc3RleHByIEMyUmVjdCBub3JtYWxpemUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBDMlJlY3QoYzJfbWF4KGxlZnQsIHJpZ2h0KCkpIC0gbGVmdCwgYzJfbWF4KHRvcCwgYm90dG9tKCkpIC0gdG9wLCBsZWZ0LCB0b3ApOworICAgIH0KKworcHJpdmF0ZToKKyAgICAvLy8gbm90ZTogcG90ZW50aWFsbHkgdW51c3VhbCBhcmd1bWVudCBvcmRlcgorICAgIGNvbnN0ZXhwciBpbmxpbmUgQzJSZWN0KHVpbnQzMl90IHdpZHRoXywgdWludDMyX3QgaGVpZ2h0XywgdWludDMyX3QgbGVmdF8sIHVpbnQzMl90IHRvcF8pCisgICAgICAgIDogd2lkdGgod2lkdGhfKSwKKyAgICAgICAgICBoZWlnaHQoaGVpZ2h0XyksCisgICAgICAgICAgbGVmdChsZWZ0XyksCisgICAgICAgICAgdG9wKHRvcF8pIHsgfQorfTsKKworLyoqCisgKiBJbnRlcmZhY2UgZm9yIG9iamVjdHMgdGhhdCBoYXZlIGEgd2lkdGggYW5kIGhlaWdodCAocGxhbmFyIGNhcGFjaXR5KS4KKyAqLworY2xhc3MgX0MyUGxhbmFyQ2FwYWNpdHlBc3BlY3QgeworLy8vIFxuYW1lIFBsYW5hciBjYXBhY2l0eSBpbnRlcmZhY2UKKy8vLyBAeworcHVibGljOgorICAgIGlubGluZSBjb25zdGV4cHIgdWludDMyX3Qgd2lkdGgoKSBjb25zdCB7IHJldHVybiBfbVdpZHRoOyB9CisgICAgaW5saW5lIGNvbnN0ZXhwciB1aW50MzJfdCBoZWlnaHQoKSBjb25zdCB7IHJldHVybiBfbUhlaWdodDsgfQorCisgICAgaW5saW5lIGNvbnN0ZXhwciBvcGVyYXRvciBDMlJlY3QoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBDMlJlY3QoX21XaWR0aCwgX21IZWlnaHQpOworICAgIH0KKworcHJvdGVjdGVkOgorICAgIGlubGluZSBjb25zdGV4cHIgX0MyUGxhbmFyQ2FwYWNpdHlBc3BlY3QodWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCkKKyAgICAgIDogX21XaWR0aCh3aWR0aCksIF9tSGVpZ2h0KGhlaWdodCkgeyB9CisKKyAgICBpbmxpbmUgZXhwbGljaXQgY29uc3RleHByIF9DMlBsYW5hckNhcGFjaXR5QXNwZWN0KGNvbnN0IF9DMlBsYW5hckNhcGFjaXR5QXNwZWN0ICpwYXJlbnQpCisgICAgICAgIDogX21XaWR0aChwYXJlbnQgPT0gbnVsbHB0ciA/IDAgOiBwYXJlbnQtPndpZHRoKCkpLAorICAgICAgICAgIF9tSGVpZ2h0KHBhcmVudCA9PSBudWxscHRyID8gMCA6IHBhcmVudC0+aGVpZ2h0KCkpIHsgfQorCitwcml2YXRlOgorICAgIHVpbnQzMl90IF9tV2lkdGg7CisgICAgdWludDMyX3QgX21IZWlnaHQ7CisvLy8gQH0KK307CisKKy8qKgorICogQzJQbGFuZUluZm86IGluZm9ybWF0aW9uIG9uIHRoZSBsYXlvdXQgb2YgYSBzaW5nZSBmbGV4aWJsZSBwbGFuZS4KKyAqCisgKiBQdWJsaWMgZmllbGRzIHdpdGhvdXQgZ2V0dGVycy9zZXR0ZXJzLgorICovCitzdHJ1Y3QgQzJQbGFuZUluZm8geworLy9wdWJsaWM6CisgICAgZW51bSBjaGFubmVsX3QgOiB1aW50MzJfdCB7CisgICAgICAgIENIQU5ORUxfWSwgIC8vLzwgbHVtYQorICAgICAgICBDSEFOTkVMX1IsICAvLy88IHJlZAorICAgICAgICBDSEFOTkVMX0csICAvLy88IGdyZWVuCisgICAgICAgIENIQU5ORUxfQiwgIC8vLzwgYmx1ZQorICAgICAgICBDSEFOTkVMX0EsICAvLy88IGFscGhhCisgICAgICAgIENIQU5ORUxfQ1IsIC8vLzwgQ3IKKyAgICAgICAgQ0hBTk5FTF9DQiwgLy8vPCBDYgorICAgIH0gY2hhbm5lbDsKKworICAgIGludDMyX3QgY29sSW5jOyAgICAgICAvLy88IGNvbHVtbiBpbmNyZW1lbnQgaW4gYnl0ZXMuIG1heSBiZSBuZWdhdGl2ZQorICAgIGludDMyX3Qgcm93SW5jOyAgICAgICAvLy88IHJvdyBpbmNyZW1lbnQgaW4gYnl0ZXMuIG1heSBiZSBuZWdhdGl2ZQorCisgICAgdWludDMyX3QgY29sU2FtcGxpbmc7IC8vLzwgc3Vic2FtcGxpbmcgY29tcGFyZWQgdG8gd2lkdGggKG11c3QgYmUgYSBwb3dlciBvZiAyKQorICAgIHVpbnQzMl90IHJvd1NhbXBsaW5nOyAvLy88IHN1YnNhbXBsaW5nIGNvbXBhcmVkIHRvIGhlaWdodCAobXVzdCBiZSBhIHBvd2VyIG9mIDIpCisKKyAgICB1aW50MzJfdCBhbGxvY2F0ZWREZXB0aDsgLy8vPCBzaXplIG9mIGVhY2ggc2FtcGxlIChtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOCkKKyAgICB1aW50MzJfdCBiaXREZXB0aDsgICAgICAgLy8vPCBzaWduaWZpY2FudCBiaXRzIHBlciBzYW1wbGUKKyAgICAvKioKKyAgICAgKiB0aGUgcmlnaHQgc2hpZnQgb2YgdGhlIHNpZ25pZmljYW50IGJpdHMgaW4gdGhlIHNhbXBsZS4gRS5nLiBpZiBhIDEwLWJpdCBzaWduaWZpY2FudAorICAgICAqIHZhbHVlIGlzIGxhaWQgb3V0IGluIGEgMTYtYml0IGFsbG9jYXRpb24gYWxpZ25lZCB0byBMU0IgKHZhbHVlcyAwLTEwMjMpLCByaWdodFNoaWZ0CisgICAgICogd291bGQgYmUgMCBhcyB0aGUgMTYtYml0IHZhbHVlIHJlYWQgZnJvbSB0aGUgc2FtcGxlIGRvZXMgbm90IG5lZWQgdG8gYmUgcmlnaHQgc2hpZnRlZAorICAgICAqIGFuZCBjYW4gYmUgdXNlZCBhcyBpcyAoYWZ0ZXIgYXBwbHlpbmcgYSAxMC1iaXQgbWFzayBvZiAweDNGRikuCisgICAgICoKKyAgICAgKiArLS0tLS0tLS0rLS0tLS0tLS0rCisgICAgICogfCAgICAgIFZWfFZWVlZWVlZWfAorICAgICAqICstLS0tLS0tLSstLS0tLS0tLSsKKyAgICAgKiAgMTUgICAgIDggNyAgICAgIDAKKyAgICAgKgorICAgICAqIElmIHRoZSB2YWx1ZSBpcyBsYWlkIG91dCBhbGlnbmVkIHRvIE1TQiwgcmlnaHRTaGlmdCB3b3VsZCBiZSA2LCBhcyB0aGUgdmFsdWUgcmVhZAorICAgICAqIGZyb20gdGhlIGFsbG9jYXRlZCBzYW1wbGUgbXVzdCBiZSByaWdodC1zaGlmdGVkIGJ5IDYgdG8gZ2V0IHRoZSBhY3R1YWwgc2FtcGxlIHZhbHVlLgorICAgICAqCisgICAgICogKy0tLS0tLS0tKy0tLS0tLS0tKworICAgICAqIHxWVlZWVlZWVnxWViAgICAgIHwKKyAgICAgKiArLS0tLS0tLS0rLS0tLS0tLS0rCisgICAgICogIDE1ICAgICA4IDcgICAgICAwCisgICAgICovCisgICAgdWludDMyX3QgcmlnaHRTaGlmdDsKKworICAgIGVudW0gZW5kaWFubmVzc190IDogdWludDMyX3QgeworICAgICAgICBOQVRJVkUsCisgICAgICAgIExJVFRMRV9FTkQsIC8vIExJVFRMRV9FTkRJQU4gaXMgcmVzZXJ2ZWQgbWFjcm8KKyAgICAgICAgQklHX0VORCwgICAgLy8gQklHX0VORElBTiBpcyBhIHJlc2VydmVkIG1hY3JvCisgICAgfSBlbmRpYW5uZXNzOyAvLy88IGVuZGlhbm5lc3Mgb2YgdGhlIHNhbXBsZXMKKworICAgIC8qKgorICAgICAqIFRoZSBmb2xsb3dpbmcgdHdvIGZpZWxkcyBkZWZpbmUgdGhlIHJlbGF0aW9uIGJldHdlZW4gbXVsdGlwbGUgcGxhbmVzLiBJZiBtdWx0aXBsZSBwbGFuZXMgYXJlCisgICAgICogaW50ZXJsZWF2ZWQsIHRoZXkgc2hhcmUgYSByb290IHBsYW5lICh3aGljaGV2ZXIgcGxhbmUncyBzdGFydCBhZGRyZXNzIGlzIHRoZSBsb3dlc3QpLCBhbmQKKyAgICAgKiB8b2Zmc2V0fCBpcyB0aGUgb2Zmc2V0IG9mIHRoaXMgcGxhbmUgaW5zaWRlIHRoZSByb290IHBsYW5lIChpbiBieXRlcykuIHxyb290SXh8IGlzIHRoZSBpbmRleAorICAgICAqIG9mIHRoZSByb290IHBsYW5lLiBJZiBhIHBsYW5lIGlzIGluZGVwZW5kZW50LCByb290SXggaXMgaXRzIGluZGV4IGFuZCBvZmZzZXQgaXMgMC4KKyAgICAgKi8KKyAgICB1aW50MzJfdCByb290SXg7IC8vLzwgaW5kZXggb2YgdGhlIHJvb3QgcGxhbmUKKyAgICB1aW50MzJfdCBvZmZzZXQ7IC8vLzwgb2Zmc2V0IG9mIHRoaXMgcGxhbmUgaW5zaWRlIG9mIHRoZSByb290IHBsYW5lCisKKyAgICBpbmxpbmUgY29uc3RleHByIHNzaXplX3QgbWluT2Zmc2V0KHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQpIGNvbnN0IHsKKyAgICAgICAgc3NpemVfdCBvZmZzID0gMDsKKyAgICAgICAgaWYgKHdpZHRoID4gMCAmJiBjb2xJbmMgPCAwKSB7CisgICAgICAgICAgICBvZmZzICs9IGNvbEluYyAqIChzc2l6ZV90KSh3aWR0aCAtIDEpOworICAgICAgICB9CisgICAgICAgIGlmIChoZWlnaHQgPiAwICYmIHJvd0luYyA8IDApIHsKKyAgICAgICAgICAgIG9mZnMgKz0gcm93SW5jICogKHNzaXplX3QpKGhlaWdodCAtIDEpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBvZmZzOworICAgIH0KKworICAgIGlubGluZSBjb25zdGV4cHIgc3NpemVfdCBtYXhPZmZzZXQodWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCkgY29uc3QgeworICAgICAgICBzc2l6ZV90IG9mZnMgPSAoYWxsb2NhdGVkRGVwdGggKyA3KSA+PiAzOworICAgICAgICBpZiAod2lkdGggPiAwICYmIGNvbEluYyA+IDApIHsKKyAgICAgICAgICAgIG9mZnMgKz0gY29sSW5jICogKHNzaXplX3QpKHdpZHRoIC0gMSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGhlaWdodCA+IDAgJiYgcm93SW5jID4gMCkgeworICAgICAgICAgICAgb2ZmcyArPSByb3dJbmMgKiAoc3NpemVfdCkoaGVpZ2h0IC0gMSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG9mZnM7CisgICAgfQorfSBDMl9QQUNLOworCitzdHJ1Y3QgQzJQbGFuYXJMYXlvdXQgeworLy9wdWJsaWM6CisgICAgZW51bSB0eXBlX3QgOiB1aW50MzJfdCB7CisgICAgICAgIFRZUEVfVU5LTk9XTiA9IDAsCisgICAgICAgIFRZUEVfWVVWID0gMHgxMDAsICAgLy8vPCBZVVYgaW1hZ2Ugd2l0aCAzIHBsYW5lcworICAgICAgICBUWVBFX1lVVkEsICAgICAgICAgIC8vLzwgWVVWQSBpbWFnZSB3aXRoIDQgcGxhbmVzCisgICAgICAgIFRZUEVfUkdCLCAgICAgICAgICAgLy8vPCBSR0IgaW1hZ2Ugd2l0aCAzIHBsYW5lcworICAgICAgICBUWVBFX1JHQkEsICAgICAgICAgIC8vLzwgUkJHQSBpbWFnZSB3aXRoIDQgcGxhbmVzCisgICAgfTsKKworICAgIHR5cGVfdCB0eXBlOyAgICAgICAgICAgICAgICAgICAgLy8gaW1hZ2UgdHlwZQorICAgIHVpbnQzMl90IG51bVBsYW5lczsgICAgICAgICAgICAgLy8gbnVtYmVyIG9mIGNvbXBvbmVudCBwbGFuZXMKKyAgICB1aW50MzJfdCByb290UGxhbmVzOyAgICAgICAgICAgIC8vIG51bWJlciBvZiBsYXlvdXQgcGxhbmVzIChyb290IHBsYW5lcykKKworICAgIGVudW0gcGxhbmVfaW5kZXhfdCA6IHVpbnQzMl90IHsKKyAgICAgICAgUExBTkVfWSA9IDAsCisgICAgICAgIFBMQU5FX1UgPSAxLAorICAgICAgICBQTEFORV9WID0gMiwKKyAgICAgICAgUExBTkVfUiA9IDAsCisgICAgICAgIFBMQU5FX0cgPSAxLAorICAgICAgICBQTEFORV9CID0gMiwKKyAgICAgICAgUExBTkVfQSA9IDMsCisgICAgICAgIE1BWF9OVU1fUExBTkVTID0gNCwKKyAgICB9OworCisgICAgQzJQbGFuZUluZm8gcGxhbmVzW01BWF9OVU1fUExBTkVTXTsKK307CisKKy8qKgorICogQXNwZWN0IGZvciBvYmplY3RzIHRoYXQgaGF2ZSBhIHBsYW5hciBzZWN0aW9uIChjcm9wIHJlY3RhbmdsZSkuCisgKgorICogVGhpcyBjbGFzcyBpcyBjb3BpYWJsZS4KKyAqLworY2xhc3MgX0MyUGxhbmFyU2VjdGlvbkFzcGVjdCA6IHB1YmxpYyBfQzJQbGFuYXJDYXBhY2l0eUFzcGVjdCB7CisvLy8gXG5hbWUgUGxhbmFyIHNlY3Rpb24gaW50ZXJmYWNlCisvLy8gQHsKK3ByaXZhdGU6CisgICAgaW5saW5lIGNvbnN0ZXhwciBfQzJQbGFuYXJTZWN0aW9uQXNwZWN0KHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIGNvbnN0IEMyUmVjdCAmY3JvcCkKKyAgICAgICAgOiBfQzJQbGFuYXJDYXBhY2l0eUFzcGVjdCh3aWR0aCwgaGVpZ2h0KSwKKyAgICAgICAgICBtQ3JvcChDMlJlY3Qoc3RkOjptaW4od2lkdGggLSBzdGQ6Om1pbihjcm9wLmxlZnQsIHdpZHRoKSwgY3JvcC53aWR0aCksCisgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWluKGhlaWdodCAtIHN0ZDo6bWluKGNyb3AudG9wLCBoZWlnaHQpLCBjcm9wLmhlaWdodCkpLmF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWluKGNyb3AubGVmdCwgd2lkdGgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWluKGNyb3AuaGVpZ2h0LCBoZWlnaHQpKSkgeworICAgIH0KKworcHVibGljOgorICAgIC8vIGNyb3AgY2FuIGJlIGFuIGVtcHR5IHJlY3QsIGRvZXMgbm90IGhhdmUgdG8gbGluZSB1cCB3aXRoIHN1YnNhbXBsaW5nCisgICAgLy8gTk9URTogd2UgZG8gbm90IHN1cHBvcnQgZmxvYXRpbmctcG9pbnQgY3JvcAorICAgIGlubGluZSBjb25zdGV4cHIgQzJSZWN0IGNyb3AoKSBjb25zdCB7IHJldHVybiBtQ3JvcDsgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIGNoaWxkIHBsYW5hciBzZWN0aW9uIGZvciB8Y3JvcHwsIHdoZXJlIHRoZSBjYXBhY2l0eSByZXByZXNlbnRzIHRoaXMgc2VjdGlvbi4KKyAgICAgKi8KKyAgICBpbmxpbmUgY29uc3RleHByIF9DMlBsYW5hclNlY3Rpb25Bc3BlY3QgY2hpbGRTZWN0aW9uKGNvbnN0IEMyUmVjdCAmY3JvcCkgY29uc3QgeworICAgICAgICByZXR1cm4gX0MyUGxhbmFyU2VjdGlvbkFzcGVjdCgKKyAgICAgICAgICAgICAgICBtQ3JvcC53aWR0aCwgbUNyb3AuaGVpZ2h0LAorICAgICAgICAgICAgICAgIC8vIGNyb3AgYW5kIHRyYW5zbGF0ZSB8Y3JvcHwgcmVjdAorICAgICAgICAgICAgICAgIEMyUmVjdChjMl9taW4obUNyb3AucmlnaHQoKSAtIGMyX2NsYW1wKG1Dcm9wLmxlZnQsIGNyb3AubGVmdCwgbUNyb3AucmlnaHQoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcm9wLndpZHRoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgYzJfbWluKG1Dcm9wLmJvdHRvbSgpIC0gYzJfY2xhbXAobUNyb3AudG9wLCBjcm9wLnRvcCwgbUNyb3AuYm90dG9tKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JvcC5oZWlnaHQpKQorICAgICAgICAgICAgICAgIC5hdChjMl9jbGFtcChtQ3JvcC5sZWZ0LCBjcm9wLmxlZnQsIG1Dcm9wLnJpZ2h0KCkpIC0gbUNyb3AubGVmdCwKKyAgICAgICAgICAgICAgICAgICAgYzJfY2xhbXAobUNyb3AudG9wLCBjcm9wLnRvcCwgbUNyb3AuYm90dG9tKCkpIC0gbUNyb3AudG9wKSk7CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgaW5saW5lIGNvbnN0ZXhwciBfQzJQbGFuYXJTZWN0aW9uQXNwZWN0KGNvbnN0IF9DMlBsYW5hckNhcGFjaXR5QXNwZWN0ICpwYXJlbnQpCisgICAgICAgIDogX0MyUGxhbmFyQ2FwYWNpdHlBc3BlY3QocGFyZW50KSwgbUNyb3Aod2lkdGgoKSwgaGVpZ2h0KCkpIHt9CisKKyAgICBpbmxpbmUgY29uc3RleHByIF9DMlBsYW5hclNlY3Rpb25Bc3BlY3QoY29uc3QgX0MyUGxhbmFyQ2FwYWNpdHlBc3BlY3QgKnBhcmVudCwgY29uc3QgQzJSZWN0ICZjcm9wKQorICAgICAgICA6IF9DMlBsYW5hckNhcGFjaXR5QXNwZWN0KHBhcmVudCksCisgICAgICAgICAgbUNyb3AocGFyZW50ID09IG51bGxwdHIgPyBDMlJlY3QoKSA6ICgoQzJSZWN0KSpwYXJlbnQpLmludGVyc2VjdChjcm9wKS5ub3JtYWxpemUoKSkgeyB9CisKKyAgICBpbmxpbmUgY29uc3RleHByIF9DMlBsYW5hclNlY3Rpb25Bc3BlY3QoY29uc3QgX0MyUGxhbmFyU2VjdGlvbkFzcGVjdCAqcGFyZW50LCBjb25zdCBDMlJlY3QgJmNyb3ApCisgICAgICAgIDogX0MyUGxhbmFyQ2FwYWNpdHlBc3BlY3QocGFyZW50KSwKKyAgICAgICAgICBtQ3JvcChwYXJlbnQgPT0gbnVsbHB0ciA/IEMyUmVjdCgpIDogcGFyZW50LT5jcm9wKCkuaW50ZXJzZWN0KGNyb3ApLm5vcm1hbGl6ZSgpKSB7IH0KKworcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgX0MyRWRpdGFibGVQbGFuYXJTZWN0aW9uQXNwZWN0OworICAgIEMyUmVjdCBtQ3JvcDsKKy8vLyBAfQorfTsKKworLyoqCisgKiBBc3BlY3QgZm9yIG9iamVjdHMgdGhhdCBoYXZlIGFuIGVkaXRhYmxlIHBsYW5hciBzZWN0aW9uIChjcm9wIHJlY3RhbmdsZSkuCisgKgorICogVGhpcyBjbGFzcyBpcyBjb3BpYWJsZS4KKyAqLworY2xhc3MgX0MyRWRpdGFibGVQbGFuYXJTZWN0aW9uQXNwZWN0IDogcHVibGljIF9DMlBsYW5hclNlY3Rpb25Bc3BlY3QgeworLy8vIFxuYW1lIFBsYW5hciBzZWN0aW9uIGludGVyZmFjZQorLy8vIEB7CisgICAgdXNpbmcgX0MyUGxhbmFyU2VjdGlvbkFzcGVjdDo6X0MyUGxhbmFyU2VjdGlvbkFzcGVjdDsKKworcHVibGljOgorICAgIC8vIGNyb3AgY2FuIGJlIGFuIGVtcHR5IHJlY3QsIGRvZXMgbm90IGhhdmUgdG8gbGluZSB1cCB3aXRoIHN1YnNhbXBsaW5nCisgICAgLy8gTk9URTogd2UgZG8gbm90IHN1cHBvcnQgZmxvYXRpbmctcG9pbnQgY3JvcAorICAgIGlubGluZSBjb25zdGV4cHIgQzJSZWN0IGNyb3AoKSBjb25zdCB7IHJldHVybiBtQ3JvcDsgfQorCisgICAgLyoqCisgICAgICogIFNldHMgY3JvcCB0byBjcm9wIGludGVyc2VjdGVkIHdpdGggWygwLDApIC4uICh3aWR0aCwgaGVpZ2h0KV0KKyAgICAgKi8KKyAgICBpbmxpbmUgdm9pZCBzZXRDcm9wX2JlKGNvbnN0IEMyUmVjdCAmY3JvcCkgeworICAgICAgICBtQ3JvcC5sZWZ0ID0gc3RkOjptaW4od2lkdGgoKSwgY3JvcC5sZWZ0KTsKKyAgICAgICAgbUNyb3AudG9wID0gc3RkOjptaW4oaGVpZ2h0KCksIGNyb3AudG9wKTsKKyAgICAgICAgLy8gSXQncyBndWFyYW50ZWVkIHRoYXQgbUNyb3AubGVmdCA8PSB3aWR0aCgpICYmIG1Dcm9wLnRvcCA8PSBoZWlnaHQoKQorICAgICAgICBtQ3JvcC53aWR0aCA9IHN0ZDo6bWluKHdpZHRoKCkgLSBtQ3JvcC5sZWZ0LCBjcm9wLndpZHRoKTsKKyAgICAgICAgbUNyb3AuaGVpZ2h0ID0gc3RkOjptaW4oaGVpZ2h0KCkgLSBtQ3JvcC50b3AsIGNyb3AuaGVpZ2h0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJZiBjcm9wIGlzIHdpdGhpbiB0aGUgZGltZW5zaW9ucyBvZiB0aGlzIG9iamVjdCwgaXQgc2V0cyBjcm9wIHRvIGl0LgorICAgICAqCisgICAgICogXHJldHVybiB0cnVlIGlmZiBjcm9wIGlzIHdpdGhpbiB0aGUgZGltZW5zaW9ucyBvZiB0aGlzIG9iamVjdAorICAgICAqLworICAgIGlubGluZSBib29sIHNldENyb3AoY29uc3QgQzJSZWN0ICZjcm9wKSB7CisgICAgICAgIGlmICh3aWR0aCgpIDwgY3JvcC53aWR0aCB8fCBoZWlnaHQoKSA8IGNyb3AuaGVpZ2h0CisgICAgICAgICAgICAgICAgfHwgd2lkdGgoKSAtIGNyb3Aud2lkdGggPCBjcm9wLmxlZnQgfHwgaGVpZ2h0KCkgLSBjcm9wLmhlaWdodCA8IGNyb3AudG9wKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgbUNyb3AgPSBjcm9wOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisvLy8gQH0KK307CisKKy8qKgorICogVXRpbGl0eSBjbGFzcyBmb3Igc2FmZSByYW5nZSBjYWxjdWxhdGlvbnMgdXNpbmcgc2l6ZV90LXMuCisgKi8KK2NsYXNzIEMyUGxhbmFyU2VjdGlvbiA6IHB1YmxpYyBfQzJQbGFuYXJTZWN0aW9uQXNwZWN0IHsKK3B1YmxpYzoKKyAgICBpbmxpbmUgY29uc3RleHByIEMyUGxhbmFyU2VjdGlvbihjb25zdCBfQzJQbGFuYXJDYXBhY2l0eUFzcGVjdCAmcGFyZW50LCBjb25zdCBDMlJlY3QgJmNyb3ApCisgICAgICAgIDogX0MyUGxhbmFyU2VjdGlvbkFzcGVjdCgmcGFyZW50LCBjcm9wKSB7IH0KKworICAgIGlubGluZSBjb25zdGV4cHIgQzJQbGFuYXJTZWN0aW9uKGNvbnN0IF9DMlBsYW5hclNlY3Rpb25Bc3BlY3QgJnBhcmVudCwgY29uc3QgQzJSZWN0ICZjcm9wKQorICAgICAgICA6IF9DMlBsYW5hclNlY3Rpb25Bc3BlY3QoJnBhcmVudCwgY3JvcCkgeyB9CisKKyAgICBpbmxpbmUgY29uc3RleHByIEMyUGxhbmFyU2VjdGlvbiBpbnRlcnNlY3QoY29uc3QgQzJSZWN0ICZjcm9wKSBjb25zdCB7CisgICAgICAgIHJldHVybiBDMlBsYW5hclNlY3Rpb24oKnRoaXMsIGNyb3ApOworICAgIH0KK307CisKKy8qKgorICogVXRpbGl0eSBjbGFzcyBmb3Igc2ltcGxlIGFuZCBzYWZlIHBsYW5hciBjYXBhY2l0eSBhbmQgc2VjdGlvbiBjb25zdHJ1Y3Rpb24uCisgKi8KK2NsYXNzIEMyUGxhbmFyQ2FwYWNpdHkgOiBwdWJsaWMgX0MyUGxhbmFyQ2FwYWNpdHlBc3BlY3QgeworcHVibGljOgorICAgIGlubGluZSBjb25zdGV4cHIgZXhwbGljaXQgQzJQbGFuYXJDYXBhY2l0eShzaXplX3Qgd2lkdGgsIHNpemVfdCBoZWlnaHQpCisgICAgICAgIDogX0MyUGxhbmFyQ2FwYWNpdHlBc3BlY3QoYzJfbWluKHdpZHRoLCBzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQzMl90Pjo6bWF4KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMyX21pbihoZWlnaHQsIHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDMyX3Q+OjptYXgoKSkpIHsgfQorCisgICAgaW5saW5lIGNvbnN0ZXhwciBDMlBsYW5hclNlY3Rpb24gc2VjdGlvbihjb25zdCBDMlJlY3QgJmNyb3ApIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIEMyUGxhbmFyU2VjdGlvbigqdGhpcywgY3JvcCk7CisgICAgfQorfTsKKworCisvKioKKyAqIFxpbmdyb3VwIGdyYXBoaWMgYWxsb2NhdG9yCisgKiAyRCBhbGxvY2F0aW9uIGludGVyZmFjZS4KKyAqLworY2xhc3MgQzJHcmFwaGljQWxsb2NhdGlvbiA6IHB1YmxpYyBfQzJQbGFuYXJDYXBhY2l0eUFzcGVjdCB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogTWFwcyBhIHJlY3Rhbmd1bGFyIHNlY3Rpb24gKGFzIGRlZmluZWQgYnkgfHJlY3R8KSBvZiBhIDJEIGFsbG9jYXRpb24gaW50byBsb2NhbCBwcm9jZXNzCisgICAgICogbWVtb3J5IGZvciBmbGV4aWJsZSBhY2Nlc3MuIE9uIHN1Y2Nlc3MsIGl0IGZpbGxzIG91dCB8bGF5b3V0fCB3aXRoIHRoZSBwbGFuZSBzcGVjaWZpY2F0aW9ucworICAgICAqIGFuZCBmaWxscyB0aGUgfGFkZHJ8IGFycmF5IHdpdGggcG9pbnRlcnMgdG8gdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIHRvcC1sZWZ0IHBpeGVsIG9mIGVhY2gKKyAgICAgKiBwbGFuZSB1c2VkLiBPdGhlcndpc2UsIGl0IGxlYXZlcyB8bGF5b3V0fCBhbmQgfGFkZHJ8IHVudG91Y2hlZC4gfGZlbmNlfCB3aWxsIGNvbnRhaW4KKyAgICAgKiBhbiBhY3F1aXJlIHN5bmMgZmVuY2Ugb2JqZWN0LiBJZiBpdCBpcyBhbHJlYWR5IHNhZmUgdG8gYWNjZXNzIHRoZQorICAgICAqIGJ1ZmZlciBjb250ZW50cywgdGhlbiBpdCB3aWxsIGJlIGFuIGVtcHR5IChhbHJlYWR5IGZpcmVkKSBmZW5jZS4KKyAgICAgKgorICAgICAqIFNhZmUgcmVnaW9ucyBmb3IgdGhlIHBvaW50ZXIgYWRkcmVzc2VzIHJldHVybmVkIGNhbiBiZSBnb3R0ZW4gdmlhIEMyTGF5b3V0SW5mby5taW5PZmZzZXQoKS8KKyAgICAgKiBtYXhPZmZzZXQoKS4KKyAgICAgKgorICAgICAqIFxwYXJhbSByZWN0ICAgICAgICAgIHNlY3Rpb24gdG8gYmUgbWFwcGVkICh0aGlzIGRvZXMgbm90IGhhdmUgdG8gYmUgYWxpZ25lZCkKKyAgICAgKiBccGFyYW0gdXNhZ2UgICAgICAgICB0aGUgZGVzaXJlZCB1c2FnZS4gXHRvZG8gdGhpcyBtdXN0IGJlIGtTb2Z0d2FyZVJlYWQgYW5kL29yCisgICAgICogICAgICAgICAgICAgICAgICAgICAga1NvZnR3YXJlV3JpdGUuCisgICAgICogXHBhcmFtIGZlbmNlICAgICAgICAgYSBwb2ludGVyIHRvIGEgZmVuY2Ugb2JqZWN0IGlmIGFuIGFzeW5jIG1hcHBpbmcgaXMgcmVxdWVzdGVkLiBJZgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIG5vdC1udWxsLCBhbmQgYWNxdWlyZSBmZW5jZSB3aWxsIGJlIHN0b3JlZCBoZXJlIG9uIHN1Y2Nlc3MsIG9yIGVtcHR5CisgICAgICogICAgICAgICAgICAgICAgICAgICAgZmVuY2Ugb24gZmFpbHVyZS4gSWYgbnVsbCwgdGhlIG1hcHBpbmcgd2lsbCBiZSBzeW5jaHJvbm91cy4KKyAgICAgKiBccGFyYW0gbGF5b3V0ICAgICAgICBhIHBvaW50ZXIgdG8gd2hlcmUgdGhlIG1hcHBlZCBwbGFuZXMnIGRlc2NyaXB0b3JzIHdpbGwgYmUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBzdG9yZWQuIE9uIGZhaWx1cmUsIG51bGxwdHIgd2lsbCBiZSBzdG9yZWQgaGVyZS4KKyAgICAgKiBccGFyYW0gYWRkciAgICAgICAgICBwb2ludGVyIHRvIGFuIGFycmF5IHdpdGggYXQgbGVhc3QgQzJQbGFuYXJMYXlvdXQ6Ok1BWF9OVU1fUExBTkVTCisgICAgICogICAgICAgICAgICAgICAgICAgICAgZWxlbWVudHMuIE9ubHkgbGF5b3V0Lm51bVBsYW5lcyBlbGVtZW50cyB3aWxsIGJlIG1vZGlmaWVkIG9uIHN1Y2Nlc3MuCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsCisgICAgICogXHJldHZhbCBDMl9SRUZVU0VEICAgbm8gcGVybWlzc2lvbiB0byBtYXAgdGhlIHNlY3Rpb24KKyAgICAgKiBccmV0dmFsIEMyX0RVUExJQ0FURSB0aGVyZSBpcyBhbHJlYWR5IGEgbWFwcGVkIHJlZ2lvbiBhbmQgdGhpcyBhbGxvY2F0aW9uIGNhbm5vdCBzdXBwb3J0CisgICAgICogICAgICAgICAgICAgICAgICAgICAgbXVsdGktbWFwcGluZyAoY2FsbGVyIGVycm9yKQorICAgICAqIFxyZXR2YWwgQzJfVElNRURfT1VUIHRoZSBvcGVyYXRpb24gdGltZWQgb3V0CisgICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgbm90IGVub3VnaCBtZW1vcnkgdG8gY29tcGxldGUgdGhlIG9wZXJhdGlvbgorICAgICAqIFxyZXR2YWwgQzJfQkFEX1ZBTFVFIHRoZSBwYXJhbWV0ZXJzIChyZWN0KSBhcmUgaW52YWxpZCBvciBvdXRzaWRlIHRoZSBhbGxvY2F0aW9uLCBvciB0aGUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICB1c2FnZSBmbGFncyBhcmUgaW52YWxpZCAoY2FsbGVyIGVycm9yKQorICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgdGhlIG9wZXJhdGlvbiBmcm9tIGNvbXBsZXRpbmcgKHVuZXhwZWN0ZWQpCisKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IG1hcCgKKyAgICAgICAgICAgIEMyUmVjdCByZWN0LCBDMk1lbW9yeVVzYWdlIHVzYWdlLCBDMkZlbmNlICpmZW5jZSwKKyAgICAgICAgICAgIEMyUGxhbmFyTGF5b3V0ICpsYXlvdXQgLyogbm9ubnVsbCAqLywgdWludDhfdCAqKmFkZHIgLyogbm9ubnVsbCAqLykgPSAwOworCisgICAgLyoqCisgICAgICogVW5tYXBzIGEgc2VjdGlvbiBvZiBhbiBhbGxvY2F0aW9uIGF0IHxhZGRyfCB3aXRoIHxyZWN0fC4gVGhlc2UgbXVzdCBiZSBwYXJhbWV0ZXJzIHByZXZpb3VzbHkKKyAgICAgKiBwYXNzZWQgdG8gYW5kIHJldHVybmVkIGJ5IHxtYXB8OyBvdGhlcndpc2UsIHRoaXMgb3BlcmF0aW9uIGlzIGEgbm8tb3AuCisgICAgICoKKyAgICAgKiBccGFyYW0gYWRkciAgICAgICAgICBwb2ludGVyIHRvIGFuIGFycmF5IHdpdGggYXQgbGVhc3QgQzJQbGFuYXJMYXlvdXQ6Ok1BWF9OVU1fUExBTkVTCisgICAgICogICAgICAgICAgICAgICAgICAgICAgZWxlbWVudHMgY29udGFpbmluZyB0aGUgc3RhcnRpbmcgYWRkcmVzc2VzIG9mIHRoZSBtYXBwZWQgbGF5ZXJzCisgICAgICogXHBhcmFtIHJlY3QgICAgICAgICAgYm91bmRhcmllcyBvZiB0aGUgbWFwcGVkIHNlY3Rpb24KKyAgICAgKiBccGFyYW0gZmVuY2UgICAgICAgICBhIHBvaW50ZXIgdG8gYSBmZW5jZSBvYmplY3QgaWYgYW4gYXN5bmMgdW5tYXBwaW5nIGlzIHJlcXVlc3RlZC4gSWYKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBub3QtbnVsbCwgYSByZWxlYXNlIGZlbmNlIHdpbGwgYmUgc3RvcmVkIGhlcmUgb24gc3VjY2Vzcywgb3IgZW1wdHkgZmVuY2UKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBvbiBmYWlsdXJlLiBUaGlzIGZlbmNlIHNpZ25hbHMgd2hlbiB0aGUgb3JpZ2luYWwgYWxsb2NhdGlvbiBjb250YWlucworICAgICAqICAgICAgICAgICAgICAgICAgICAgIGFsbCBjaGFuZ2VzIHRoYXQgaGFwcGVuZWQgdG8gdGhlIG1hcHBlZCBzZWN0aW9uLiBJZiBudWxsLCB0aGUgdW5tYXBwaW5nCisgICAgICogICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBzeW5jaHJvbm91cy4KKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwKKyAgICAgKiBccmV0dmFsIEMyX1RJTUVEX09VVCB0aGUgb3BlcmF0aW9uIHRpbWVkIG91dAorICAgICAqIFxyZXR2YWwgQzJfTk9UX0ZPVU5EIHRoZXJlIGlzIG5vIHN1Y2ggbWFwcGVkIHJlZ2lvbiAoY2FsbGVyIGVycm9yKQorICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgdGhlIG9wZXJhdGlvbiBmcm9tIGNvbXBsZXRpbmcgKHVuZXhwZWN0ZWQpCisgICAgICogXHJldHZhbCBDMl9SRUZVU0VEICAgbm8gcGVybWlzc2lvbiB0byB1bm1hcCB0aGUgc2VjdGlvbiAodW5leHBlY3RlZCAtIHN5c3RlbSkKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHVubWFwKAorICAgICAgICAgICAgdWludDhfdCAqKmFkZHIgLyogbm9ubnVsbCAqLywgQzJSZWN0IHJlY3QsIEMyRmVuY2UgKmZlbmNlIC8qIG51bGxhYmxlICovKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBhbGxvY2F0b3IgSUQgZm9yIHRoaXMgYWxsb2NhdGlvbi4gVGhpcyBpcyB1c2VmdWwgdG8gcHV0IHRoZSBoYW5kbGUgaW50byBjb250ZXh0LgorICAgICAqLworICAgIHZpcnR1YWwgQzJBbGxvY2F0b3I6OmlkX3QgZ2V0QWxsb2NhdG9ySWQoKSBjb25zdCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgYWxsb2NhdGlvbiBoYW5kbGUuCisgICAgICovCisgICAgdmlydHVhbCBjb25zdCBDMkhhbmRsZSAqaGFuZGxlKCkgY29uc3QgPSAwOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgaXMgdGhlIHNhbWUgYWxsb2NhdGlvbiBhcyB8b3RoZXJ8LgorICAgICAqLworICAgIHZpcnR1YWwgYm9vbCBlcXVhbHMoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyR3JhcGhpY0FsbG9jYXRpb24+ICZvdGhlcikgY29uc3QgPSAwOworCitwcm90ZWN0ZWQ6CisgICAgdXNpbmcgX0MyUGxhbmFyQ2FwYWNpdHlBc3BlY3Q6Ol9DMlBsYW5hckNhcGFjaXR5QXNwZWN0OworICAgIHZpcnR1YWwgfkMyR3JhcGhpY0FsbG9jYXRpb24oKSA9IGRlZmF1bHQ7Cit9OworCitjbGFzcyBDMkdyYXBoaWNBbGxvY2F0aW9uOworCisvKioKKyAqIEEgMkQgYmxvY2suCisgKgorICogXG5vdGUgd2lkdGgoKS9oZWlnaHQoKSBpcyBub3QgbWVhbmluZ2Z1bCBmb3IgdXNlcnMgb2YgYmxvY2tzOyBpbnN0ZWFkLCBjcm9wKCkud2lkdGgoKSBhbmQKKyAqIGNyb3AoKS5oZWlnaHQoKSBpcyB0aGUgY2FwYWNpdHkgb2YgdGhlIHVzYWJsZSBwb3J0aW9uLiBVc2UgYW5kIGNyb3AoKSBpZiBhY2Nlc3NpbmcgdGhlIGJsb2NrCisgKiBkaXJlY3RseSB0aHJvdWdoIGl0cyBoYW5kbGUgdG8gcmVwcmVzZW50IHRoZSBhbGxvdHRlZCByZWdpb24gb2YgdGhlIHVuZGVybHlpbmcgYWxsb2NhdGlvbiB0byB0aGlzCisgKiBibG9jay4KKyAqLworY2xhc3MgQzJCbG9jazJEIDogcHVibGljIF9DMlBsYW5hclNlY3Rpb25Bc3BlY3QgeworcHVibGljOgorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHVuZGVybHlpbmcgaGFuZGxlIGZvciB0aGlzIGFsbG9jYXRpb24uCisgICAgICoKKyAgICAgKiBcbm90ZSB0aGF0IHRoZSBibG9jayBhbmQgaXRzIGJsb2NrIHBvb2wgaGFzIHNoYXJlZCBvd25lcnNoaXAgb2YgdGhlIGhhbmRsZQorICAgICAqICAgICAgIGFuZCBpZiBhbGwgcmVmZXJlbmNlcyB0byB0aGUgYmxvY2sgYXJlIHJlbGVhc2VkLCB0aGUgdW5kZXJseWluZyBibG9jaworICAgICAqICAgICAgIGFsbG9jYXRpb24gbWF5IGdldCByZXVzZWQgZXZlbiBpZiBhIGNsaWVudCBrZWVwcyBhIGNsb25lIG9mIHRoaXMgaGFuZGxlLgorICAgICAqLworICAgIGNvbnN0IEMySGFuZGxlICpoYW5kbGUoKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGFsbG9jYXRvcidzIElEIHRoYXQgY3JlYXRlZCB0aGUgdW5kZXJseWluZyBhbGxvY2F0aW9uIGZvciB0aGlzIGJsb2NrLiBUaGlzCisgICAgICogcHJvdmlkZXMgdGhlIGNvbnRleHQgZm9yIHVuZGVyc3RhbmRpbmcgdGhlIGhhbmRsZS4KKyAgICAgKi8KKyAgICBDMkFsbG9jYXRvcjo6aWRfdCBnZXRBbGxvY2F0b3JJZCgpIGNvbnN0OworCitwcm90ZWN0ZWQ6CisgICAgY2xhc3MgSW1wbDsKKyAgICBDMkJsb2NrMkQoc3RkOjpzaGFyZWRfcHRyPEltcGw+IGltcGwsIGNvbnN0IF9DMlBsYW5hclNlY3Rpb25Bc3BlY3QgJnNlY3Rpb24pOworCisgICAgZnJpZW5kIHN0cnVjdCBfQzJCbG9ja0ZhY3Rvcnk7CisgICAgc3RkOjpzaGFyZWRfcHRyPEltcGw+IG1JbXBsOworfTsKKworLyoqCisgKiBHcmFwaGljIHZpZXcgcHJvdmlkZXMgcmVhZCBvciByZWFkLXdyaXRlIGFjY2VzcyBmb3IgYSBncmFwaGljIGJsb2NrLgorICoKKyAqIFRoaXMgY2xhc3MgaXMgY29waWFibGUuCisgKgorICogXG5vdGUgRHVlIHRvIHRoZSBzdWJzYW1wbGluZyBvZiBncmFwaGljIGJ1ZmZlcnMsIGEgcmVhZCB2aWV3IG11c3Qgc3RpbGwgY29udGFpbiBhIGNyb3AgcmVjdGFuZ2xlCisgKiB0byBlbnN1cmUgc3Vic2FtcGxpbmcgaXMgZm9sbG93ZWQuIFRoaXMgcmVzdWx0cyBpbiBuZWFybHkgaWRlbnRpY2FsIGludGVyZmFjZSBiZXR3ZWVuIHJlYWQgYW5kCisgKiB3cml0ZSB2aWV3cywgc28gQzJHcmFwaGljVmlldyBjYW4gZW5jb21wYXNzIGJvdGggb2YgdGhlbS4KKyAqLworY2xhc3MgQzJHcmFwaGljVmlldyA6IHB1YmxpYyBfQzJFZGl0YWJsZVBsYW5hclNlY3Rpb25Bc3BlY3QgeworcHVibGljOgorICAgIC8qKgorICAgICAqIFxyZXR1cm4gYXJyYXkgb2YgcG9pbnRlcnMgKG9mIGxheW91dCgpLm51bVBsYW5lcyBlbGVtZW50cykgdG8gdGhlIHN0YXJ0IG9mIHRoZSBwbGFuZXMgb3IKKyAgICAgKiBudWxscHRyIG9uIGVycm9yLiBSZWdhcmRsZXNzIG9mIGNyb3AgcmVjdCwgdGhleSBhbHdheXMgcG9pbnQgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiBlYWNoCisgICAgICogcGxhbmUuIEFjY2VzcyBvdXRzaWRlIG9mIHRoZSBjcm9wIHJlY3QgcmVzdWx0cyBpbiBhbiB1bmRlZmluZWQgYmVoYXZpb3IuCisgICAgICovCisgICAgY29uc3QgdWludDhfdCAqY29uc3QgKmRhdGEoKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFxyZXR1cm4gYXJyYXkgb2YgcG9pbnRlcnMgKG9mIGxheW91dCgpLm51bVBsYW5lcyBlbGVtZW50cykgdG8gdGhlIHN0YXJ0IG9mIHRoZSBwbGFuZXMgb3IKKyAgICAgKiBudWxscHRyIG9uIGVycm9yLiBSZWdhcmRsZXNzIG9mIGNyb3AgcmVjdCwgdGhleSBhbHdheXMgcG9pbnQgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiBlYWNoCisgICAgICogcGxhbmUuIEFjY2VzcyBvdXRzaWRlIG9mIHRoZSBjcm9wIHJlY3QgcmVzdWx0cyBpbiBhbiB1bmRlZmluZWQgYmVoYXZpb3IuCisgICAgICovCisgICAgdWludDhfdCAqY29uc3QgKmRhdGEoKTsKKworICAgIC8qKgorICAgICAqIFxyZXR1cm4gbGF5b3V0IG9mIHRoZSBncmFwaGljIGJsb2NrIHRvIGludGVycHJldCB0aGUgcmV0dXJuZWQgZGF0YS4KKyAgICAgKi8KKyAgICBjb25zdCBDMlBsYW5hckxheW91dCBsYXlvdXQoKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBzZWN0aW9uIG9mIHRoaXMgdmlldy4KKyAgICAgKgorICAgICAqIFxwYXJhbSByZWN0ICAgIHRoZSBkaW1lbnNpb24gb2YgdGhlIHNlY3Rpb24uIFxub3RlIFRoaXMgaXMgY2xhbXBlZCB0byB0aGUgY3JvcCBvZiB0aGlzIHZpZXcuCisgICAgICoKKyAgICAgKiBccmV0dXJuIGEgcmVhZCB2aWV3IGNvbnRhaW5pbmcgdGhlIHJlcXVlc3RlZCBzZWN0aW9uIG9mIHRoaXMgdmlldworICAgICAqLworICAgIGNvbnN0IEMyR3JhcGhpY1ZpZXcgc3ViVmlldyhjb25zdCBDMlJlY3QgJnJlY3QpIGNvbnN0OworICAgIEMyR3JhcGhpY1ZpZXcgc3ViVmlldyhjb25zdCBDMlJlY3QgJnJlY3QpOworCisgICAgLyoqCisgICAgICogXHJldHVybiBlcnJvciBkdXJpbmcgdGhlIGNyZWF0aW9uL21hcHBpbmcgb2YgdGhpcyB2aWV3LgorICAgICAqLworICAgIGMyX3N0YXR1c190IGVycm9yKCkgY29uc3Q7CisKK3Byb3RlY3RlZDoKKyAgICBjbGFzcyBJbXBsOworICAgIEMyR3JhcGhpY1ZpZXcoc3RkOjpzaGFyZWRfcHRyPEltcGw+IGltcGwsIGNvbnN0IF9DMlBsYW5hclNlY3Rpb25Bc3BlY3QgJnNlY3Rpb24pOworICAgIGV4cGxpY2l0IEMyR3JhcGhpY1ZpZXcoYzJfc3RhdHVzX3QgZXJyb3IpOworCitwcml2YXRlOgorICAgIGZyaWVuZCBzdHJ1Y3QgX0MyQmxvY2tGYWN0b3J5OworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBtSW1wbDsKK307CisKKy8qKgorICogQSBjb25zdGFudCAocmVhZC1vbmx5KSBncmFwaGljIGJsb2NrIChwb3J0aW9uIG9mIGFuIGFsbG9jYXRpb24pIHdpdGggYW4gYWNxdWlyZSBmZW5jZS4KKyAqIEJsb2NrcyBhcmUgdW5tYXBwZWQgd2hlbiBjcmVhdGVkLCBhbmQgY2FuIGJlIG1hcHBlZCBpbnRvIGEgcmVhZCB2aWV3IG9uIGRlbWFuZC4KKyAqCisgKiBUaGlzIGNsYXNzIGlzIGNvcGlhYmxlIGFuZCBjb250YWlucyBhIHJlZmVyZW5jZSB0byB0aGUgYWxsb2NhdGlvbiB0aGF0IGl0IGlzIGJhc2VkIG9uLgorICovCitjbGFzcyBDMkNvbnN0R3JhcGhpY0Jsb2NrIDogcHVibGljIEMyQmxvY2syRCB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogTWFwcyB0aGlzIGJsb2NrIGludG8gbWVtb3J5IGFuZCByZXR1cm5zIGEgcmVhZCB2aWV3IGZvciBpdC4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gYSByZWFkIHZpZXcgZm9yIHRoaXMgYmxvY2suCisgICAgICovCisgICAgQzJBY3F1aXJhYmxlPGNvbnN0IEMyR3JhcGhpY1ZpZXc+IG1hcCgpIGNvbnN0OworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHNlY3Rpb24gb2YgdGhpcyBibG9jay4KKyAgICAgKgorICAgICAqIFxwYXJhbSByZWN0ICAgIHRoZSBjb29yZGluYXRlcyBvZiB0aGUgc2VjdGlvbi4gXG5vdGUgVGhpcyBpcyBjbGFtcGVkIHRvIHRoZSBjcm9wIHJlY3RhbmdsZSBvZgorICAgICAqICAgICAgICAgICAgICB0aGlzIGJsb2NrLgorICAgICAqCisgICAgICogXHJldHVybiBhIGNvbnN0YW50IGdyYXBoaWMgYmxvY2sgY29udGFpbmluZyBhIHBvcnRpb24gb2YgdGhpcyBibG9jaworICAgICAqLworICAgIEMyQ29uc3RHcmFwaGljQmxvY2sgc3ViQmxvY2soY29uc3QgQzJSZWN0ICZyZWN0KSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGFjcXVpcmUgZmVuY2UgZm9yIHRoaXMgYmxvY2suCisgICAgICoKKyAgICAgKiBccmV0dXJuIGEgZmVuY2UgdGhhdCBtdXN0IGJlIHdhaXRlZCBvbiBiZWZvcmUgcmVhZGluZyB0aGUgYmxvY2suCisgICAgICovCisgICAgQzJGZW5jZSBmZW5jZSgpIGNvbnN0IHsgcmV0dXJuIG1GZW5jZTsgfQorCitwcm90ZWN0ZWQ6CisgICAgQzJDb25zdEdyYXBoaWNCbG9jaygKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBpbXBsLCBjb25zdCBfQzJQbGFuYXJTZWN0aW9uQXNwZWN0ICZzZWN0aW9uLCBDMkZlbmNlIGZlbmNlKTsKKworcHJpdmF0ZToKKyAgICBmcmllbmQgc3RydWN0IF9DMkJsb2NrRmFjdG9yeTsKKyAgICBDMkZlbmNlIG1GZW5jZTsKK307CisKKy8qKgorICogR3JhcGhpYyBibG9jayBpcyBhIHdyaXRlYWJsZSAyRCBibG9jay4gT25jZSB3cml0dGVuLCBpdCBjYW4gYmUgc2hhcmVkIGluIHdob2xlIG9yIGluIHBhcnQgd2l0aAorICogY29uc3VtZXJzL3JlYWRlcnMgYXMgcmVhZC1vbmx5IGNvbnN0IGdyYXBoaWMgYmxvY2suCisgKi8KK2NsYXNzIEMyR3JhcGhpY0Jsb2NrIDogcHVibGljIEMyQmxvY2syRCB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogTWFwcyB0aGlzIGJsb2NrIGludG8gbWVtb3J5IGFuZCByZXR1cm5zIGEgd3JpdGUgdmlldyBmb3IgaXQuCisgICAgICoKKyAgICAgKiBccmV0dXJuIGEgd3JpdGUgdmlldyBmb3IgdGhpcyBibG9jay4KKyAgICAgKi8KKyAgICBDMkFjcXVpcmFibGU8QzJHcmFwaGljVmlldz4gbWFwKCk7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgcmVhZC1vbmx5IGNvbnN0IGxpbmVhciBibG9jayBmb3IgYSBwb3J0aW9uIG9mIHRoaXMgYmxvY2s7IG9wdGlvbmFsbHkgcHJvdGVjdGVkCisgICAgICogYnkgYW4gYWNxdWlyZSBmZW5jZS4gVGhlcmUgYXJlIHR3byB3YXlzIHRvIHVzZSB0aGlzOgorICAgICAqCisgICAgICogMSkgc2hhcmUgcmVhZHkgYmxvY2sgYWZ0ZXIgd3JpdGluZyBkYXRhIGludG8gdGhlIGJsb2NrLiBJbiB0aGlzIGNhc2Ugbm8gZmVuY2Ugc2hhbGwgYmUKKyAgICAgKiAgICBzdXBwbGllZCwgYW5kIHRoZSBibG9jayBzaGFsbCBub3QgYmUgbW9kaWZpZWQgYWZ0ZXIgY2FsbGluZyB0aGlzIG1ldGhvZC4KKyAgICAgKiAyKSBzaGFyZSBibG9jayBtZXRhZGF0YSBiZWZvcmUgYWN0dWFsbHkgKGZpbmlzaGluZykgd3JpdGluZyB0aGUgZGF0YSBpbnRvIHRoZSBibG9jay4gSW4KKyAgICAgKiAgICB0aGlzIGNhc2UgYSBmZW5jZSBtdXN0IGJlIHN1cHBsaWVkIHRoYXQgd2lsbCBiZSB0cmlnZ2VyZWQgd2hlbiB0aGUgZGF0YSBpcyB3cml0dGVuLgorICAgICAqICAgIFRoZSBibG9jayBzaGFsbCBiZSBtb2RpZmllZCBvbmx5IHVudGlsIGZpcmluZyB0aGUgZXZlbnQgZm9yIHRoZSBmZW5jZS4KKyAgICAgKi8KKyAgICBDMkNvbnN0R3JhcGhpY0Jsb2NrIHNoYXJlKGNvbnN0IEMyUmVjdCAmY3JvcCwgQzJGZW5jZSBmZW5jZSk7CisKK3Byb3RlY3RlZDoKKyAgICBDMkdyYXBoaWNCbG9jayhzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gaW1wbCwgY29uc3QgX0MyUGxhbmFyU2VjdGlvbkFzcGVjdCAmc2VjdGlvbik7CisKKyAgICBmcmllbmQgc3RydWN0IF9DMkJsb2NrRmFjdG9yeTsKK307CisKKy8vLyBAfQorCisvLy8gXGRlZmdyb3VwIGJ1ZmZlcl9vbmogQnVmZmVyIG9iamVjdHMKKy8vLyBAeworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vICBCVUZGRVJTCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLy8vIFx0b2RvOiBEbyB3ZSBzdGlsbCBuZWVkIHRoaXM/CisvLy8KKy8vIFRoZXJlIGFyZSAyIGtpbmRzIG9mIGJ1ZmZlcnM6IGxpbmVhciBvciBncmFwaGljLiBMaW5lYXIgYnVmZmVycyBjYW4gY29udGFpbiBhIHNpbmdsZSBibG9jaywgb3IKKy8vIGEgbGlzdCBvZiBibG9ja3MgKExJTkVBUl9DSFVOS1MpLiBTdXBwb3J0IGZvciBsaXN0IG9mIGJsb2NrcyBpcyBvcHRpb25hbCwgYW5kIGNhbiBhbGxvdyBjb25zdW1pbmcKKy8vIGRhdGEgZnJvbSBjaXJjdWxhciBidWZmZXJzIG9yIHNjYXR0ZXJlZCBkYXRhIHNvdXJjZXMgd2l0aG91dCBleHRyYSBtZW1jcHkuIEN1cnJlbnRseSwgbGlzdCBvZgorLy8gZ3JhcGhpYyBibG9ja3MgaXMgbm90IHN1cHBvcnRlZC4KKworY2xhc3MgQzJMaW5lYXJCdWZmZXI7ICAgLy8gcmVhZC13cml0ZSBidWZmZXIKK2NsYXNzIEMyR3JhcGhpY0J1ZmZlcjsgIC8vIHJlYWQtd3JpdGUgYnVmZmVyCitjbGFzcyBDMkxpbmVhckNodW5rc0J1ZmZlcjsKKworLyoqCisgKiBDMkJ1ZmZlckRhdGE6IHRoZSBtYWluLCBub24tbWV0YSBkYXRhIG9mIGEgYnVmZmVyLiBBIGJ1ZmZlciBjYW4gY29udGFpbiBlaXRoZXIgbGluZWFyIGJsb2NrcworICogb3IgZ3JhcGhpYyBibG9ja3MsIGFuZCBjYW4gY29udGFpbiBlaXRoZXIgYSBzaW5nbGUgYmxvY2sgb3IgbXVsdGlwbGUgYmxvY2tzLiBUaGlzIGlzIGRldGVybWluZWQKKyAqIGJ5IGl0cyB0eXBlLgorICovCitjbGFzcyBDMkJ1ZmZlckRhdGEgeworcHVibGljOgorICAgIC8qKgorICAgICAqICBUaGUgdHlwZSBvZiBidWZmZXIgZGF0YS4KKyAgICAgKi8KKyAgICBlbnVtIHR5cGVfdCA6IHVpbnQzMl90IHsKKyAgICAgICAgSU5WQUxJRCwgICAgICAgICAgICAvLy88IGludmFsaWQgYnVmZmVyIHR5cGUuIERvIG5vdCB1c2UuCisgICAgICAgIExJTkVBUiwgICAgICAgICAgICAgLy8vPCB0aGUgYnVmZmVyIGNvbnRhaW5zIGEgc2luZ2xlIGxpbmVhciBibG9jaworICAgICAgICBMSU5FQVJfQ0hVTktTLCAgICAgIC8vLzwgdGhlIGJ1ZmZlciBjb250YWlucyBvbmUgb3IgbW9yZSBsaW5lYXIgYmxvY2tzCisgICAgICAgIEdSQVBISUMsICAgICAgICAgICAgLy8vPCB0aGUgYnVmZmVyIGNvbnRhaW5zIGEgc2luZ2xlIGdyYXBoaWMgYmxvY2sKKyAgICAgICAgR1JBUEhJQ19DSFVOS1MsICAgICAvLy88IHRoZSBidWZmZXIgY29udGFpbnMgb25lIG9mIG1vcmUgZ3JhcGhpYyBibG9ja3MKKyAgICB9OworICAgIHR5cGVkZWYgdHlwZV90IFR5cGU7IC8vIGRlcHJlY2F0ZWQKKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHR5cGUgb2YgdGhpcyBidWZmZXIgKGRhdGEpLgorICAgICAqIFxyZXR1cm4gdGhlIHR5cGUgb2YgdGhpcyBidWZmZXIgZGF0YS4KKyAgICAgKi8KKyAgICB0eXBlX3QgdHlwZSgpIGNvbnN0OworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgbGluZWFyIGJsb2NrcyBvZiB0aGlzIGJ1ZmZlci4KKyAgICAgKiBccmV0dXJuIGEgY29uc3RhbnQgbGlzdCBvZiBjb25zdCBsaW5lYXIgYmxvY2tzIG9mIHRoaXMgYnVmZmVyLgorICAgICAqIFxyZXR2YWwgZW1wdHkgbGlzdCBpZiB0aGlzIGJ1ZmZlciBkb2VzIG5vdCBjb250YWluIGxpbmVhciBibG9jayhzKS4KKyAgICAgKi8KKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMkNvbnN0TGluZWFyQmxvY2s+IGxpbmVhckJsb2NrcygpIGNvbnN0OworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgZ3JhcGhpYyBibG9ja3Mgb2YgdGhpcyBidWZmZXIuCisgICAgICogXHJldHVybiBhIGNvbnN0YW50IGxpc3Qgb2YgY29uc3QgZ3JhcGhpYyBibG9ja3Mgb2YgdGhpcyBidWZmZXIuCisgICAgICogXHJldHZhbCBlbXB0eSBsaXN0IGlmIHRoaXMgYnVmZmVyIGRvZXMgbm90IGNvbnRhaW4gZ3JhcGhpYyBibG9jayhzKS4KKyAgICAgKi8KKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMkNvbnN0R3JhcGhpY0Jsb2NrPiBncmFwaGljQmxvY2tzKCkgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgY2xhc3MgSW1wbDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gbUltcGw7CisKK3Byb3RlY3RlZDoKKyAgICAvLyBubyBwdWJsaWMgY29uc3RydWN0b3IKKyAgICBleHBsaWNpdCBDMkJ1ZmZlckRhdGEoY29uc3Qgc3RkOjp2ZWN0b3I8QzJDb25zdExpbmVhckJsb2NrPiAmYmxvY2tzKTsKKyAgICBleHBsaWNpdCBDMkJ1ZmZlckRhdGEoY29uc3Qgc3RkOjp2ZWN0b3I8QzJDb25zdEdyYXBoaWNCbG9jaz4gJmJsb2Nrcyk7Cit9OworCisvKioKKyAqIEMyQnVmZmVyOiBidWZmZXIgYmFzZSBjbGFzcy4gVGhlc2UgYXJlIGFsd2F5cyB1c2VkIGFzIHNoYXJlZF9wdHJzLiBUaG91Z2ggdGhlIHVuZGVybHlpbmcgYnVmZmVyCisgKiBvYmplY3RzIChuYXRpdmUgYnVmZmVycywgaW9uIGJ1ZmZlcnMsIG9yIGRtYWJ1ZnMpIGFyZSByZWZlcmVuY2UtY291bnRlZCBieSB0aGUgc3lzdGVtLAorICogQzJCdWZmZXJzIGhvbGQgb25seSBhIHNpbmdsZSByZWZlcmVuY2UuCisgKgorICogVGhlc2Ugb2JqZWN0cyBjYW5ub3QgYmUgdXNlZCBvbiB0aGUgc3RhY2suCisgKi8KK2NsYXNzIEMyQnVmZmVyIHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBidWZmZXIncyBkYXRhLgorICAgICAqCisgICAgICogXHJldHVybiB0aGUgYnVmZmVyJ3MgZGF0YS4KKyAgICAgKi8KKyAgICBjb25zdCBDMkJ1ZmZlckRhdGEgZGF0YSgpIGNvbnN0OworCisgICAgLyoqCisgICAgICogVGhlc2Ugd2lsbCBzdGlsbCB3b3JrIGlmIHVzZWQgaW4gb25EZWF0aE5vdGlmeS4KKyAgICAgKi8KKyNpZiAwCisgICAgaW5saW5lIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJ1ZmZlcj4gYXNMaW5lYXJCdWZmZXIoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtVHlwZSA9PSBMSU5FQVIgPyBzdGQ6OnNoYXJlZF9wdHI6OnJlaW50ZXJwcmV0X2Nhc3Q8QzJMaW5lYXJCdWZmZXI+KHRoaXMpIDogbnVsbHB0cjsKKyAgICB9CisKKyAgICBpbmxpbmUgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0J1ZmZlcj4gYXNHcmFwaGljQnVmZmVyKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVR5cGUgPT0gR1JBUEhJQyA/IHN0ZDo6c2hhcmVkX3B0cjo6cmVpbnRlcnByZXRfY2FzdDxDMkdyYXBoaWNCdWZmZXI+KHRoaXMpIDogbnVsbHB0cjsKKyAgICB9CisKKyAgICBpbmxpbmUgc3RkOjpzaGFyZWRfcHRyPEMyQ2lyY3VsYXJCdWZmZXI+IGFzQ2lyY3VsYXJCdWZmZXIoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtVHlwZSA9PSBDSVJDVUxBUiA/IHN0ZDo6c2hhcmVkX3B0cjo6cmVpbnRlcnByZXRfY2FzdDxDMkNpcmN1bGFyQnVmZmVyPih0aGlzKSA6IG51bGxwdHI7CisgICAgfQorI2VuZGlmCisKKyAgICAvLy9AbmFtZSBQcmUtZGVzdHJveSBub3RpZmljYXRpb24gaGFuZGxpbmcKKyAgICAvLy9AeworCisgICAgLyoqCisgICAgICogUmVnaXN0ZXIgZm9yIG5vdGlmaWNhdGlvbiBqdXN0IHByaW9yIHRvIHRoZSBkZXN0cnVjdGlvbiBvZiB0aGlzIG9iamVjdC4KKyAgICAgKi8KKyAgICB0eXBlZGVmIHZvaWQgKCpPbkRlc3Ryb3lOb3RpZnkpIChjb25zdCBDMkJ1ZmZlciAqYnVmLCB2b2lkICphcmcpOworCisgICAgLyoqCisgICAgICogUmVnaXN0ZXJzIGZvciBhIHByZS1kZXN0cm95IG5vdGlmaWNhdGlvbi4gVGhpcyBpcyBjYWxsZWQganVzdCBwcmlvciB0byB0aGUgZGVzdHJ1Y3Rpb24gb2YKKyAgICAgKiB0aGlzIGJ1ZmZlciAod2hlbiB0aGlzIGJ1ZmZlciBpcyBubyBsb25nZXIgdmFsaWQuKQorICAgICAqCisgICAgICogXHBhcmFtIG9uRGVzdHJveU5vdGlmeSAgIHRoZSBub3RpZmljYXRpb24gY2FsbGJhY2sKKyAgICAgKiBccGFyYW0gYXJnICAgICAgICAgICAgICAgYW4gYXJiaXRyYXJ5IHBhcmFtZXRlciBwYXNzZWQgdG8gdGhlIGNhbGxiYWNrCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgcmVnaXN0cmF0aW9uIHdhcyBzdWNjZXNzZnVsLgorICAgICAqIFxyZXR2YWwgQzJfRFVQTElDQVRFIGEgbm90aWZpY2F0aW9uIHdhcyBhbHJlYWR5IHJlZ2lzdGVyZWQgZm9yIHRoaXMgY2FsbGJhY2sgYW5kIGFyZ3VtZW50CisgICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgbm90IGVub3VnaCBtZW1vcnkgdG8gcmVnaXN0ZXIgZm9yIHRoaXMgY2FsbGJhY2sKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBhbiB1bmtub3duIGVycm9yIHByZXZlbnRlZCB0aGUgcmVnaXN0cmF0aW9uICh1bmV4cGVjdGVkKQorICAgICAqLworICAgIGMyX3N0YXR1c190IHJlZ2lzdGVyT25EZXN0cm95Tm90aWZ5KE9uRGVzdHJveU5vdGlmeSBvbkRlc3Ryb3lOb3RpZnksIHZvaWQgKmFyZyA9IG51bGxwdHIpOworCisgICAgLyoqCisgICAgICogVW5yZWdpc3RlcnMgYSBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgcHJlLWRlc3Ryb3kgbm90aWZpY2F0aW9uLgorICAgICAqCisgICAgICogXHBhcmFtIG9uRGVzdHJveU5vdGlmeSAgIHRoZSBub3RpZmljYXRpb24gY2FsbGJhY2sKKyAgICAgKiBccGFyYW0gYXJnICAgICAgICAgICAgICAgYW4gYXJiaXRyYXJ5IHBhcmFtZXRlciBwYXNzZWQgdG8gdGhlIGNhbGxiYWNrCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgdW5yZWdpc3RyYXRpb24gd2FzIHN1Y2Nlc3NmdWwuCisgICAgICogXHJldHZhbCBDMl9OT1RfRk9VTkQgdGhlIG5vdGlmaWNhdGlvbiB3YXMgbm90IGZvdW5kCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgYW4gdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgdGhlIHJlZ2lzdHJhdGlvbiAodW5leHBlY3RlZCkKKyAgICAgKi8KKyAgICBjMl9zdGF0dXNfdCB1bnJlZ2lzdGVyT25EZXN0cm95Tm90aWZ5KE9uRGVzdHJveU5vdGlmeSBvbkRlc3Ryb3lOb3RpZnksIHZvaWQgKmFyZyA9IG51bGxwdHIpOworCisgICAgLy8vQH0KKworICAgIHZpcnR1YWwgfkMyQnVmZmVyKCkgPSBkZWZhdWx0OworCisgICAgLy8vQG5hbWUgQnVmZmVyLXNwZWNpZmljIGFyYml0cmFyeSBtZXRhZGF0YSBoYW5kbGluZworICAgIC8vL0B7CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBsaXN0IG9mIG1ldGFkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGJ1ZmZlci4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gYSBjb25zdGFudCBsaXN0IG9mIGluZm8gb2JqZWN0cyBhc3NvY2lhdGVkIHdpdGggdGhpcyBidWZmZXIuCisgICAgICovCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMySW5mbz4+IGluZm8oKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIEF0dGFjaGVzIChvciB1cGRhdGVzKSBhbiAoZXhpc3RpbmcpIG1ldGFkYXRhIGZvciB0aGlzIGJ1ZmZlci4KKyAgICAgKiBJZiB0aGUgbWV0YWRhdGEgaXMgc3RyZWFtIHNwZWNpZmljLCB0aGUgc3RyZWFtIGluZm9ybWF0aW9uIHdpbGwgYmUgcmVzZXQuCisgICAgICoKKyAgICAgKiBccGFyYW0gaW5mbyBNZXRhZGF0YSB0byB1cGRhdGUKKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBtZXRhZGF0YSB3YXMgc3VjY2Vzc2Z1bGx5IGF0dGFjaGVkL3VwZGF0ZWQuCisgICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgbm90IGVub3VnaCBtZW1vcnkgdG8gYXR0YWNoIHRoZSBtZXRhZGF0YSAodGhpcyByZXR1cm4gdmFsdWUgaXMgbm90CisgICAgICogICAgICAgICAgICAgICAgICAgICAgdXNlZCBpZiB0aGUgc2FtZSBraW5kIG9mIG1ldGFkYXRhIGlzIGFscmVhZHkgYXR0YWNoZWQgdG8gdGhlIGJ1ZmZlcikuCisgICAgICovCisgICAgYzJfc3RhdHVzX3Qgc2V0SW5mbyhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJJbmZvPiAmaW5mbyk7CisKKyAgICAvKioKKyAgICAgKiBDaGVja3MgaWYgdGhlcmUgaXMgYSBjZXJ0YWluIHR5cGUgb2YgbWV0YWRhdGEgYXR0YWNoZWQgdG8gdGhpcyBidWZmZXIuCisgICAgICoKKyAgICAgKiBccGFyYW0gaW5kZXggdGhlIHBhcmFtZXRlciB0eXBlIG9mIHRoZSBtZXRhZGF0YQorICAgICAqCisgICAgICogXHJldHVybiB0cnVlIGlmZiB0aGVyZSBpcyBhIG1ldGFkYXRhIHdpdGggdGhlIHBhcmFtZXRlciB0eXBlIGF0dGFjaGVkIHRvIHRoaXMgYnVmZmVyLgorICAgICAqLworICAgIGJvb2wgaGFzSW5mbyhDMlBhcmFtOjpUeXBlIGluZGV4KSBjb25zdDsKKworICAgIC8qKgorICAgICAqIENoZWNrcyBpZiB0aGVyZSBpcyBhIGNlcnRhaW4gdHlwZSBvZiBtZXRhZGF0YSBhdHRhY2hlZCB0byB0aGlzIGJ1ZmZlciwgYW5kIHJldHVybnMgYQorICAgICAqIHNoYXJlZCBwb2ludGVyIHRvIGl0IGlmIHRoZXJlIGlzLiBSZXR1cm5zIGFuIGVtcHR5IHNoYXJlZCBwb2ludGVyIG9iamVjdCAobnVsbHB0cikgaWYgdGhlcmUKKyAgICAgKiBpcyBub3QuCisgICAgICoKKyAgICAgKiBccGFyYW0gaW5kZXggdGhlIHBhcmFtZXRlciB0eXBlIG9mIHRoZSBtZXRhZGF0YQorICAgICAqCisgICAgICogXHJldHVybiBzaGFyZWQgcG9pbnRlciB0byB0aGUgbWV0YWRhdGEuCisgICAgICovCisgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMySW5mbz4gZ2V0SW5mbyhDMlBhcmFtOjpUeXBlIGluZGV4KSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFJlbW92ZXMgYSBtZXRhZGF0YSBmcm9tIHRoZSBidWZmZXIuCisgICAgICovCisgICAgc3RkOjpzaGFyZWRfcHRyPEMySW5mbz4gcmVtb3ZlSW5mbyhDMlBhcmFtOjpUeXBlIGluZGV4KTsKKyAgICAvLy9AfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGJ1ZmZlciBjb250YWluaW5nIGEgc2luZ2xlIGxpbmVhciBibG9jay4KKyAgICAgKgorICAgICAqIFxwYXJhbSBibG9jayB0aGUgY29udGVudCBvZiB0aGUgYnVmZmVyLgorICAgICAqCisgICAgICogXHJldHVybiBzaGFyZWQgcG9pbnRlciB0byB0aGUgY3JlYXRlZCBidWZmZXIuCisgICAgICovCisgICAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gQ3JlYXRlTGluZWFyQnVmZmVyKGNvbnN0IEMyQ29uc3RMaW5lYXJCbG9jayAmYmxvY2spOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGJ1ZmZlciBjb250YWluaW5nIGEgc2luZ2xlIGdyYXBoaWMgYmxvY2suCisgICAgICoKKyAgICAgKiBccGFyYW0gYmxvY2sgdGhlIGNvbnRlbnQgb2YgdGhlIGJ1ZmZlci4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gc2hhcmVkIHBvaW50ZXIgdG8gdGhlIGNyZWF0ZWQgYnVmZmVyLgorICAgICAqLworICAgIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IENyZWF0ZUdyYXBoaWNCdWZmZXIoY29uc3QgQzJDb25zdEdyYXBoaWNCbG9jayAmYmxvY2spOworCisKKworcHJvdGVjdGVkOgorICAgIC8vIG5vIHB1YmxpYyBjb25zdHJ1Y3RvcgorICAgIGV4cGxpY2l0IEMyQnVmZmVyKGNvbnN0IHN0ZDo6dmVjdG9yPEMyQ29uc3RMaW5lYXJCbG9jaz4gJmJsb2Nrcyk7CisgICAgZXhwbGljaXQgQzJCdWZmZXIoY29uc3Qgc3RkOjp2ZWN0b3I8QzJDb25zdEdyYXBoaWNCbG9jaz4gJmJsb2Nrcyk7CisKK3ByaXZhdGU6CisgICAgY2xhc3MgSW1wbDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gbUltcGw7CisvLyAgICBUeXBlIF9tVHlwZTsKK307CisKKy8qKgorICogQW4gZXh0ZW5zaW9uIG9mIEMySW5mbyBvYmplY3RzIHRoYXQgY2FuIGNvbnRhaW4gYXJiaXRyYXJ5IGJ1ZmZlciBkYXRhLgorICoKKyAqIFxub3RlIFRoaXMgb2JqZWN0IGlzIG5vdCBkZXNjcmliYWJsZSBhbmQgY29udGFpbnMgb3BhcXVlIGRhdGEuCisgKi8KK2NsYXNzIEMySW5mb0J1ZmZlciB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogR2V0cyB0aGUgaW5kZXggb2YgdGhpcyBpbmZvIG9iamVjdC4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gdGhlIHBhcmFtZXRlciBpbmRleC4KKyAgICAgKi8KKyAgICBjb25zdCBDMlBhcmFtOjpJbmRleCBpbmRleCgpIGNvbnN0OworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgYnVmZmVyJ3MgZGF0YS4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gdGhlIGJ1ZmZlcidzIGRhdGEuCisgICAgICovCisgICAgY29uc3QgQzJCdWZmZXJEYXRhIGRhdGEoKSBjb25zdDsKK307CisKKy8vLyBAfQorCisvLy8gXGNvbmQgSU5URVJOQUwKKworLy8vIFx0b2RvIFRoZXNlIGFyZSBubyBsb25nZXIgdXNlZAorCisvLy8gXGFkZHRvZ3JvdXAgbGluZWFyCisvLy8gQHsKKworLyoqIFxkZXByZWNhdGVkICovCitjbGFzcyBDMkxpbmVhckJ1ZmZlcgorICAgIDogcHVibGljIEMyQnVmZmVyLCBwdWJsaWMgX0MyTGluZWFyUmFuZ2VBc3BlY3QsCisgICAgICBwdWJsaWMgc3RkOjplbmFibGVfc2hhcmVkX2Zyb21fdGhpczxDMkxpbmVhckJ1ZmZlcj4geworcHVibGljOgorICAgIC8qKiBcdG9kbyB3aGF0IGlzIHRoaXM/ICovCisgICAgY29uc3QgQzJIYW5kbGUgKmhhbmRsZSgpIGNvbnN0OworCitwcm90ZWN0ZWQ6CisgICAgaW5saW5lIEMyTGluZWFyQnVmZmVyKGNvbnN0IEMyQ29uc3RMaW5lYXJCbG9jayAmYmxvY2spOworCitwcml2YXRlOgorICAgIGNsYXNzIEltcGw7CisgICAgSW1wbCAqbUltcGw7Cit9OworCitjbGFzcyBDMlJlYWRDdXJzb3I7CisKK2NsYXNzIEMyV3JpdGVDdXJzb3IgeworcHVibGljOgorICAgIHVpbnQzMl90IHJlbWFpbmluZygpIGNvbnN0OyAvLyByZW1haW5pbmcgZGF0YSB0byBiZSByZWFkCisgICAgdm9pZCBjb21taXQoKTsgLy8gY29tbWl0cyB0aGUgY3VycmVudCBwb3NpdGlvbi4gZGlzY2FyZCBkYXRhIGJlZm9yZSBjdXJyZW50IHBvc2l0aW9uCisgICAgdm9pZCByZXNldCgpIGNvbnN0OyAgLy8gcmVzZXRzIHBvc2l0aW9uIHRvIHRoZSBsYXN0IGNvbW1pdHRlZCBwb3NpdGlvbgorICAgIC8vIHNsaWNlcyBvZmYgYXQgbW9zdCB8c2l6ZXwgYnl0ZXMsIGFuZCBtb3ZlcyBjdXJzb3IgYWhlYWQgYnkgdGhlIG51bWJlciBvZiBieXRlcworICAgIC8vIHNsaWNlZCBvZmYuCisgICAgQzJSZWFkQ3Vyc29yIHNsaWNlKHVpbnQzMl90IHNpemUpIGNvbnN0OworICAgIC8vIHNsaWNlcyBvZmYgYXQgbW9zdCB8c2l6ZXwgYnl0ZXMsIGFuZCBtb3ZlcyBjdXJzb3IgYWhlYWQgYnkgdGhlIG51bWJlciBvZiBieXRlcworICAgIC8vIHNsaWNlZCBvZmYuCisgICAgQzJXcml0ZUN1cnNvciByZXNlcnZlKHVpbnQzMl90IHNpemUpOworICAgIC8vIGJvb2wgcmVhZChUJik7CisgICAgLy8gYm9vbCB3cml0ZShUJik7CisgICAgQzJGZW5jZSB3YWl0Rm9yU3BhY2UodWludDMyX3Qgc2l6ZSk7Cit9OworCisvLy8gQH0KKworLy8vIFxhZGR0b2dyb3VwIGdyYXBoaWMKKy8vLyBAeworCitzdHJ1Y3QgQzJDb2xvclNwYWNlIHsKKy8vcHVibGljOgorICAgIGVudW0gU3RhbmRhcmQgeworICAgICAgICBCVDYwMSwKKyAgICAgICAgQlQ3MDksCisgICAgICAgIEJUMjAyMCwKKyAgICAgICAgLy8gVE9ETworICAgIH07CisKKyAgICBlbnVtIFJhbmdlIHsKKyAgICAgICAgTElNSVRFRCwKKyAgICAgICAgRlVMTCwKKyAgICAgICAgLy8gVE9ETworICAgIH07CisKKyAgICBlbnVtIFRyYW5zZmVyRnVuY3Rpb24geworICAgICAgICBCVDcwOVRyYW5zZmVyLAorICAgICAgICBCVDIwMjBUcmFuc2ZlciwKKyAgICAgICAgSHlicmlkTG9nR2FtbWEyLAorICAgICAgICBIeWJyaWRMb2dHYW1tYTQsCisgICAgICAgIC8vIFRPRE8KKyAgICB9OworfTsKKworLyoqIFxkZXByZWNhdGVkICovCitjbGFzcyBDMkdyYXBoaWNCdWZmZXIgOiBwdWJsaWMgQzJCdWZmZXIgeworcHVibGljOgorICAgIC8vIGNvbnN0YW50IGF0dHJpYnV0ZXMKKyAgICBpbmxpbmUgdWludDMyX3Qgd2lkdGgoKSBjb25zdCAgeyByZXR1cm4gbVdpZHRoOyB9CisgICAgaW5saW5lIHVpbnQzMl90IGhlaWdodCgpIGNvbnN0IHsgcmV0dXJuIG1IZWlnaHQ7IH0KKyAgICBpbmxpbmUgdWludDMyX3QgZm9ybWF0KCkgY29uc3QgeyByZXR1cm4gbUZvcm1hdDsgfQorICAgIGlubGluZSBjb25zdCBDMk1lbW9yeVVzYWdlIHVzYWdlKCkgY29uc3QgeyByZXR1cm4gbVVzYWdlOyB9CisKKyAgICAvLyBtb2RpZmlhYmxlIGF0dHJpYnV0ZXMKKworCisgICAgdmlydHVhbCBjb25zdCBDMkNvbG9yU3BhY2UgY29sb3JTcGFjZSgpIGNvbnN0ID0gMDsKKyAgICAvLyBiZXN0IGVmZm9ydAorICAgIHZpcnR1YWwgdm9pZCBzZXRDb2xvclNwYWNlX2JlKGNvbnN0IEMyQ29sb3JTcGFjZSAmY29sb3JTcGFjZSkgPSAwOworICAgIHZpcnR1YWwgYm9vbCBzZXRDb2xvclNwYWNlKGNvbnN0IEMyQ29sb3JTcGFjZSAmY29sb3JTcGFjZSkgPSAwOworCisgICAgY29uc3QgQzJIYW5kbGUgKmhhbmRsZSgpIGNvbnN0OworCitwcm90ZWN0ZWQ6CisgICAgdWludDMyX3QgbVdpZHRoOworICAgIHVpbnQzMl90IG1IZWlnaHQ7CisgICAgdWludDMyX3QgbUZvcm1hdDsKKyAgICBDMk1lbW9yeVVzYWdlIG1Vc2FnZTsKKworICAgIGNsYXNzIEltcGw7CisgICAgSW1wbCAqbUltcGw7Cit9OworCisvLy8gQH0KKworLy8vIFxlbmRjb25kCisKKy8vLyBAfQorCisjZW5kaWYgIC8vIEMyQlVGRkVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaW5jbHVkZS9DMkJ1ZmZlckJhc2UuaCBiL21lZGlhL2NvZGVjMi9pbmNsdWRlL0MyQnVmZmVyQmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiZDQ4ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaW5jbHVkZS9DMkJ1ZmZlckJhc2UuaApAQCAtMCwwICsxLDk0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDMkJVRkZFUl9CQVNFX0hfCisjZGVmaW5lIEMyQlVGRkVSX0JBU0VfSF8KKworLy8vIFxkZWZncm91cCBhbGxvY2F0b3IgQWxsb2NhdGlvbiBhbmQgbWVtb3J5IHBsYWNlbWVudAorLy8vIEB7CisKKy8qKgorICogQnVmZmVyL21lbW9yeSB1c2FnZSBiaXRzLiBUaGVzZSBzaGFsbCBiZSB1c2VkIGJ5IHRoZSBhbGxvY2F0b3JzIHRvIHNlbGVjdCBvcHRpbWFsIG1lbW9yeSB0eXBlLworICogcG9vbCBhbmQgYnVmZmVyIGxheW91dC4gVXNhZ2UgYml0cyBhcmUgY29uY2VwdHVhbGx5IHNlcGFyYXRlZCBpbnRvIHJlYWQgYW5kIHdyaXRlIHVzYWdlLCB3aGlsZQorICogdGhlIGJ1ZmZlciB1c2UgbGlmZS1jeWNsZSBpcyBzZXBhcmF0ZWQgaW50byBwcm9kdWNlcnMgKHdyaXRlcnMpIGFuZCBjb25zdW1lcnMgKHJlYWRlcnMpLgorICogVGhlc2UgdHdvIGNvbmNlcHRzIGFyZSByZWxhdGVkIGJ1dCBub3QgZXF1aXZhbGVudDogY29uc3VtZXJzIG1heSBvbmx5IHJlYWQgYnVmZmVycyBhbmQgb25seQorICogcHJvZHVjZXJzIG1heSB3cml0ZSB0byBidWZmZXJzOyBub3RlLCBob3dldmVyLCB0aGF0IGJ1ZmZlciBwcm9kdWNlcnMgbWF5IGFsc28gd2FudCBvciBuZWVkIHRvCisgKiByZWFkIHRoZSBidWZmZXJzLgorICoKKyAqIFJlYWQgYW5kIHdyaXRlIGJ1ZmZlciB1c2FnZSBiaXRzIHNoYWxsIGJlIG9yLWVkIHRvIGFycml2ZSBhdCB0aGUgZnVsbCBidWZmZXIgdXNhZ2UuIEFkbWl0dGVkbHksCisgKiB0aGlzIGRvZXMgbm90IGFjY291bnQgZm9yIHRoZSBhbW91bnQgb2YgcmVhZGluZyBhbmQgd3JpdGluZyAoZS5nLiBhIGJ1ZmZlciBtYXkgaGF2ZSBvbmUgb3IgbW9yZQorICogcmVhZGVycyk7IGhvd2V2ZXIsIHRoZSBwcm9wZXIgaW5mb3JtYXRpb24gbmVjZXNzYXJ5IHRvIHByb3Blcmx5IHdlaWdoIHRoZSB2YXJpb3VzIHVzYWdlcyB3b3VsZCBiZQorICogdGhlIGFtb3VudCBvZiBkYXRhIHJlYWQvd3JpdHRlbiBmb3IgZWFjaCB1c2FnZSB0eXBlLiBUaGlzIHdvdWxkIHJlc3VsdCBpbiBhbiBpbnRlZ2VyIGFycmF5IG9mCisgKiBzaXplIDY0IChvciB0aGUgbnVtYmVyIG9mIGRpc3RpbmN0IHVzYWdlcykgZm9yIG1lbW9yeSB1c2FnZSwgYW5kIGxpa2VseSBzdWNoIGRldGFpbGVkIGluZm9ybWF0aW9uCisgKiB3b3VsZCBub3QgYWx3YXlzIGJlIGF2YWlsYWJsZS4KKyAqCisgKiBUaGF0IHBsYXRmb3JtLWFnbm9zdGljIENvZGVjIDIuMCBBUEkgb25seSBkZWZpbmVzIHRoZSBiYXJlIG1pbmltdW0gdXNhZ2VzLiBQbGF0Zm9ybXMgc2hhbGwgZGVmaW5lCisgKiB1c2FnZSBiaXRzIHRoYXQgYXJlIGFwcHJvcHJpYXRlIGZvciB0aGUgcGxhdGZvcm0uCisgKi8KK3N0cnVjdCBDMk1lbW9yeVVzYWdlIHsKKy8vIHB1YmxpYzoKKyAgICAvKioKKyAgICAgKiBCdWZmZXIgcmVhZCB1c2FnZS4KKyAgICAgKi8KKyAgICBlbnVtIHJlYWRfdCA6IHVpbnQ2NF90IHsKKyAgICAgICAgLyoqIEJ1ZmZlciBpcyByZWFkIGJ5IHRoZSBDUFUuICovCisgICAgICAgIENQVV9SRUFEICAgICAgICA9IDEgPDwgMCwKKyAgICAgICAgLyoqCisgICAgICAgICAqIEJ1ZmZlciBzaGFsbCBvbmx5IGJlIHJlYWQgYnkgdHJ1c3RlZCBoYXJkd2FyZS4gVGhlIGRlZmluaXRpb24gb2YgdHJ1c3RlZCBoYXJkd2FyZSBpcworICAgICAgICAgKiBwbGF0Zm9ybSBzcGVjaWZpYywgYnV0IHRoaXMgZmxhZyBpcyByZXNlcnZlZCB0byBwcmV2ZW50IG1hcHBpbmcgdGhpcyBibG9jayBpbnRvIENQVQorICAgICAgICAgKiByZWFkYWJsZSBtZW1vcnkgcmVzdWx0aW5nIGluIGJ1cyBmYXVsdC4gVGhpcyBmbGFnIGNhbiBiZSB1c2VkIHdoZW4gYnVmZmVyIGFjY2VzcyBtdXN0IGJlCisgICAgICAgICAqIHByb3RlY3RlZC4KKyAgICAgICAgICovCisgICAgICAgIFJFQURfUFJPVEVDVEVEICA9IDEgPDwgMSwKKyAgICB9OworCisgICAgLyoqCisgICAgICogQnVmZmVyIHdyaXRlIHVzYWdlLgorICAgICAqLworICAgIGVudW0gd3JpdGVfdCA6IHVpbnQ2NF90IHsKKyAgICAgICAgLyoqIEJ1ZmZlciBpcyB3cml0dGVkIHRvIGJ5IHRoZSBDUFUuICovCisgICAgICAgIENQVV9XUklURSAgICAgICAgPSAxIDw8IDIsCisgICAgICAgIC8qKgorICAgICAgICAgKiBCdWZmZXIgc2hhbGwgb25seSBiZSB3cml0dGVuIHRvIGJ5IHRydXN0ZWQgaGFyZHdhcmUuIFRoZSBkZWZpbml0aW9uIG9mIHRydXN0ZWQgaGFyZHdhcmUKKyAgICAgICAgICogaXMgcGxhdGZvcm0gc3BlY2lmaWMsIGJ1dCB0aGlzIGZsYWcgaXMgcmVzZXJ2ZWQgdG8gcHJldmVudCBtYXBwaW5nIHRoaXMgYmxvY2sgaW50byBDUFUKKyAgICAgICAgICogd3JpdGFibGUgbWVtb3J5IHJlc3VsdGluZyBpbiBidXMgZmF1bHQuIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCB3aGVuIGJ1ZmZlciBpbnRlZ3JpdHkgbXVzdAorICAgICAgICAgKiBiZSBwcm90ZWN0ZWQuCisgICAgICAgICAqLworICAgICAgICBXUklURV9QUk9URUNURUQgID0gMSA8PCAzLAorICAgIH07CisKKyAgICBlbnVtIDogdWludDY0X3QgeworICAgICAgICAvKioKKyAgICAgICAgICogQnVmZmVyIHVzYWdlIGJpdHMgcmVzZXJ2ZWQgZm9yIHRoZSBwbGF0Zm9ybS4gV2UgZG9uJ3Qgc2VwYXJhdGVseSByZXNlcnZlIHJlYWQgYW5kCisgICAgICAgICAqIHdyaXRlIHVzYWdlcyBhcyBwbGF0Zm9ybXMgbWF5IGhhdmUgYXN5bW1ldHJpYyBkaXN0cmlidXRpb24gYmV0d2VlbiB0aGVtLgorICAgICAgICAgKi8KKyAgICAgICAgUExBVEZPUk1fTUFTSyAgICAgPSB+KENQVV9SRUFEIHwgQ1BVX1dSSVRFIHwgUkVBRF9QUk9URUNURUQgfCBXUklURV9QUk9URUNURUQpLAorICAgIH07CisKKyAgICAvKiogQ3JlYXRlIGEgdXNhZ2UgZnJvbSBzZXBhcmF0ZSBjb25zdW1lciBhbmQgcHJvZHVjZXIgdXNhZ2UgbWFzay4gXGRlcHJlY2F0ZWQgKi8KKyAgICBpbmxpbmUgQzJNZW1vcnlVc2FnZSh1aW50NjRfdCBjb25zdW1lciwgdWludDY0X3QgcHJvZHVjZXIpCisgICAgICAgIDogZXhwZWN0ZWQoY29uc3VtZXIgfCBwcm9kdWNlcikgeyB9CisKKyAgICBpbmxpbmUgZXhwbGljaXQgQzJNZW1vcnlVc2FnZSh1aW50NjRfdCBleHBlY3RlZF8pCisgICAgICAgIDogZXhwZWN0ZWQoZXhwZWN0ZWRfKSB7IH0KKworICAgIHVpbnQ2NF90IGV4cGVjdGVkOyAvLyBleHBlY3RlZCBidWZmZXIgdXNhZ2UKK307CisKKy8vLyBAfQorCisjZW5kaWYgIC8vIEMyQlVGRkVSX0JBU0VfSF8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2luY2x1ZGUvQzJDb21wb25lbnQuaCBiL21lZGlhL2NvZGVjMi9pbmNsdWRlL0MyQ29tcG9uZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODgxMDcyNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9pbmNsdWRlL0MyQ29tcG9uZW50LmgKQEAgLTAsMCArMSw5NzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEMyQ09NUE9ORU5UX0hfCisKKyNkZWZpbmUgQzJDT01QT05FTlRfSF8KKworI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgPGxpc3Q+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorCisjaW5jbHVkZSA8QzJFbnVtLmg+CisjaW5jbHVkZSA8QzJQYXJhbS5oPgorI2luY2x1ZGUgPEMyV29yay5oPgorCisvLy8gXGRlZmdyb3VwIGNvbXBvbmVudHMgQ29tcG9uZW50cworLy8vIEB7CisKK3N0cnVjdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkgeworICAgIGVudW0gdHlwZV90IDogdWludDMyX3QgeworICAgICAgICBQT1NTSUJMRSwgLy8vPCBxdWVyeSBhbGwgcG9zc2libGUgdmFsdWVzIHJlZ2FyZGxlc3Mgb2Ygb3RoZXIgc2V0dGluZ3MKKyAgICAgICAgQ1VSUkVOVCwgIC8vLzwgcXVlcnkgY3VycmVudGx5IHBvc3NpYmxlIHZhbHVlcyBnaXZlbiBkZXBlbmRlbnQgc2V0dGluZ3MKKyAgICB9OworCitwcml2YXRlOgorICAgIEMyUGFyYW1GaWVsZCBfbUZpZWxkOworICAgIHR5cGVfdCBfbVR5cGU7CitwdWJsaWM6CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzOworICAgIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgdmFsdWVzOworCisgICAgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5KGNvbnN0IEMyUGFyYW1GaWVsZCAmZmllbGRfLCB0eXBlX3QgdHlwZV8pCisgICAgICAgIDogX21GaWVsZChmaWVsZF8pLCBfbVR5cGUodHlwZV8pLCBzdGF0dXMoQzJfTk9fSU5JVCkgeyB9CisKKyAgICBzdGF0aWMgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5CisgICAgQ3VycmVudChjb25zdCBDMlBhcmFtRmllbGQgJmZpZWxkXykgeworICAgICAgICByZXR1cm4gQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5KGZpZWxkXywgQ1VSUkVOVCk7CisgICAgfQorCisgICAgc3RhdGljIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeQorICAgIFBvc3NpYmxlKGNvbnN0IEMyUGFyYW1GaWVsZCAmZmllbGRfKSB7CisgICAgICAgIHJldHVybiBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkoZmllbGRfLCBQT1NTSUJMRSk7CisgICAgfQorCisgICAgaW5saW5lIEMyUGFyYW1GaWVsZCBmaWVsZCgpIGNvbnN0IHsgcmV0dXJuIF9tRmllbGQ7IH07CisKKyAgICBpbmxpbmUgdHlwZV90IHR5cGUoKSBjb25zdCB7IHJldHVybiBfbVR5cGU7IH0KK307CisKKy8qKgorICogQ29tcG9uZW50IGludGVyZmFjZSBvYmplY3QuIFRoaXMgb2JqZWN0IGNvbnRhaW5zIGFsbCBvZiB0aGUgY29uZmlndXJhdGlvbiBvZiBhIHBvdGVudGlhbCBvcgorICogYWN0dWFsIGNvbXBvbmVudC4gSXQgY2FuIGJlIGNyZWF0ZWQgYW5kIHVzZWQgaW5kZXBlbmRlbnRseSBvZiBhbiBhY3R1YWwgQzJDb21wb25lbnQgaW5zdGFuY2UgdG8KKyAqIHF1ZXJ5IHN1cHBvcnQgYW5kIHBhcmFtZXRlcnMgZm9yIHZhcmlvdXMgY29tcG9uZW50IHNldHRpbmdzIGFuZCBjb25maWd1cmF0aW9ucyBmb3IgYSBwb3RlbnRpYWwKKyAqIGNvbXBvbmVudC4gQWN0dWFsIGNvbXBvbmVudHMgYWxzbyBleHBvc2UgdGhpcyBpbnRlcmZhY2UuCisgKi8KKworY2xhc3MgQzJDb21wb25lbnRJbnRlcmZhY2UgeworcHVibGljOgorICAgIC8vIEFMV0FZUyBBVkFJTEFCTEUgTUVUSE9EUworICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGlzIGNvbXBvbmVudCBvciBjb21wb25lbnQgaW50ZXJmYWNlIG9iamVjdC4KKyAgICAgKiBUaGlzIGlzIGEgdW5pcXVlIG5hbWUgZm9yIHRoaXMgY29tcG9uZW50IG9yIGNvbXBvbmVudCBpbnRlcmZhY2UgJ2NsYXNzJzsgaG93ZXZlciwgbXVsdGlwbGUKKyAgICAgKiBpbnN0YW5jZXMgb2YgdGhpcyBjb21wb25lbnQgU0hBTEwgaGF2ZSB0aGUgc2FtZSBuYW1lLgorICAgICAqCisgICAgICogV2hlbiBhdHRhY2hlZCB0byBhIGNvbXBvbmVudCwgdGhpcyBtZXRob2QgTVVTVCBiZSBzdXBwb3J0ZWQgaW4gYW55IGNvbXBvbmVudCBzdGF0ZS4KKyAgICAgKiBUaGlzIGNhbGwgZG9lcyBub3QgY2hhbmdlIHRoZSBzdGF0ZSBub3IgdGhlIGludGVybmFsIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgYmUgIm5vbi1ibG9ja2luZyIgYW5kIHJldHVybiB3aXRoaW4gMW1zLgorICAgICAqCisgICAgICogXHJldHVybiB0aGUgbmFtZSBvZiB0aGlzIGNvbXBvbmVudCBvciBjb21wb25lbnQgaW50ZXJmYWNlIG9iamVjdC4KKyAgICAgKiBccmV0dmFsIGFuIGVtcHR5IHN0cmluZyBpZiB0aGVyZSB3YXMgbm90IGVub3VnaCBtZW1vcnkgdG8gYWxsb2NhdGUgdGhlIGFjdHVhbCBuYW1lLgorICAgICAqLworICAgIHZpcnR1YWwgQzJTdHJpbmcgZ2V0TmFtZSgpIGNvbnN0ID0gMDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSB1bmlxdWUgSUQgZm9yIHRoaXMgY29tcG9uZW50IG9yIGludGVyZmFjZSBvYmplY3QuCisgICAgICogVGhpcyBJRCBpcyB1c2VkIGFzIHdvcmsgdGFyZ2V0cywgdW5pcXVlIHdvcmsgSURzLCBhbmQgd2hlbiBjb25maWd1cmluZyB0dW5uZWxpbmcuCisgICAgICoKKyAgICAgKiBXaGVuIGF0dGFjaGVkIHRvIGEgY29tcG9uZW50LCB0aGlzIG1ldGhvZCBNVVNUIGJlIHN1cHBvcnRlZCBpbiBhbnkgY29tcG9uZW50IHN0YXRlLgorICAgICAqIFRoaXMgY2FsbCBkb2VzIG5vdCBjaGFuZ2UgdGhlIHN0YXRlIG5vciB0aGUgaW50ZXJuYWwgY29uZmlndXJhdGlvbiBvZiB0aGUgY29tcG9uZW50LgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSAibm9uLWJsb2NraW5nIiBhbmQgcmV0dXJuIHdpdGhpbiAxbXMuCisgICAgICoKKyAgICAgKiBccmV0dXJuIGEgdW5pcXVlIG5vZGUgSUQgZm9yIHRoaXMgY29tcG9uZW50IG9yIGNvbXBvbmVudCBpbnRlcmZhY2UgaW5zdGFuY2UuCisgICAgICovCisgICAgdmlydHVhbCBjMl9ub2RlX2lkX3QgZ2V0SWQoKSBjb25zdCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBRdWVyaWVzIGEgc2V0IG9mIHBhcmFtZXRlcnMgZnJvbSB0aGUgY29tcG9uZW50IG9yIGludGVyZmFjZSBvYmplY3QuCisgICAgICogUXVlcnlpbmcgaXMgcGVyZm9ybWVkIGF0IGJlc3QgZWZmb3J0OiB0aGUgY29tcG9uZW50IFNIQUxMIHF1ZXJ5IGFsbCBzdXBwb3J0ZWQgcGFyYW1ldGVycyBhbmQKKyAgICAgKiBza2lwIHVuc3VwcG9ydGVkIG9uZXMsIGhlYXAgYWxsb2NhdGVkIHBhcmFtZXRlcnMgdGhhdCBjb3VsZCBub3QgYmUgYWxsb2NhdGVkIG9yIHBhcmFtZXRlcnMKKyAgICAgKiB0aGF0IGNvdWxkIG5vdCBiZSBxdWVyaWVkIHdpdGhvdXQgYmxvY2tpbmcuIEFueSBlcnJvcnMgYXJlIGNvbW11bmljYXRlZCBpbiB0aGUgcmV0dXJuIHZhbHVlLgorICAgICAqIEFkZGl0aW9uYWxseSwgcHJlYWxsb2NhdGVkIChlLmcuIHN0YWNrKSBwYXJhbWV0ZXJzIHRoYXQgY291bGQgbm90IGJlIHF1ZXJpZWQgYXJlIGludmFsaWRhdGVkLgorICAgICAqIEludmFsaWQgb3IgYmxvY2tpbmcgcGFyYW1ldGVycyB0byBiZSBhbGxvY2F0ZWQgb24gdGhlIGhlYXAgYXJlIG9taXR0ZWQgZnJvbSB0aGUgcmVzdWx0LgorICAgICAqCisgICAgICogXG5vdGUgUGFyYW1ldGVyIHZhbHVlcyBkbyBub3QgZGVwZW5kIG9uIHRoZSBvcmRlciBvZiBxdWVyeS4KKyAgICAgKgorICAgICAqIFx0b2RvIFRoaXMgbWV0aG9kIGNhbm5vdCBiZSB1c2VkIHRvIHF1ZXJ5IGluZm8tYnVmZmVycy4gSXMgdGhhdCBhIHByb2JsZW0/CisgICAgICoKKyAgICAgKiBXaGVuIGF0dGFjaGVkIHRvIGEgY29tcG9uZW50LCB0aGlzIG1ldGhvZCBNVVNUIGJlIHN1cHBvcnRlZCBpbiBhbnkgY29tcG9uZW50IHN0YXRlIGV4Y2VwdAorICAgICAqIHJlbGVhc2VkLgorICAgICAqIFRoaXMgY2FsbCBkb2VzIG5vdCBjaGFuZ2UgdGhlIHN0YXRlIG5vciB0aGUgaW50ZXJuYWwgY29uZmlndXJhdGlvbiBvZiB0aGUgY29tcG9uZW50LgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgaGFzIGEgdmFyaWFibGUgYmxvY2tpbmcgYmVoYXZpb3IgYmFzZWQgb24gc3RhdGUuCisgICAgICogSW4gdGhlIHN0b3BwZWQgc3RhdGUgdGhpcyBtZXRob2QgTVVTVCBiZSAibm9uLWJsb2NraW5nIiBhbmQgcmV0dXJuIHdpdGhpbiAxbXMuCisgICAgICogSW4gdGhlIHJ1bm5pbmcgc3RhdGVzIHRoaXMgbWV0aG9kIG1heSBiZSBtb21lbnRhcmlseSBibG9ja2luZywgYnV0IE1VU1QgcmV0dXJuIHdpdGhpbiA1bXMuCisgICAgICoKKyAgICAgKiBccGFyYW1baW4sb3V0XSBzdGFja1BhcmFtcyAgYSBsaXN0IG9mIHBhcmFtcyBxdWVyaWVkLiBUaGVzZSBhcmUgaW5pdGlhbGl6ZWQgc3BlY2lmaWMgdG8gZWFjaAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nOyBlLmcuIHNpemUgYW5kIGluZGV4IGFyZSBzZXQgYW5kIHJlc3Qgb2YgdGhlIG1lbWJlcnMgYXJlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyZWQuCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxub3RlIEZsZXhpYmxlIHNldHRpbmdzIHRoYXQgYXJlIG9mIGluY29ycmVjdCBzaXplIHdpbGwgYmUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZWQuCisgICAgICogXHBhcmFtW2luXSBoZWFwUGFyYW1JbmRpY2VzIGEgdmVjdG9yIG9mIHBhcmFtIGluZGljZXMgZm9yIHBhcmFtcyB0byBiZSBxdWVyaWVkIGFuZCByZXR1cm5lZAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbiB0aGUgaGVhcC4gVGhlc2UgcGFyYW1ldGVycyB3aWxsIGJlIHJldHVybmVkIGluIGhlYXBQYXJhbXMuCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVuc3VwcG9ydGVkIHBhcmFtIGluZGljZXMgd2lsbCBiZSBpZ25vcmVkLgorICAgICAqIFxwYXJhbVtpbl0gbWF5QmxvY2sgICAgICAgICBpZiB0cnVlIChDMl9NQVlfQkxPQ0spLCBpbXBsZW1lbnRhdGlvbiBtYXkgbW9tZW50YXJpbHkgYmxvY2suCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIE90aGVyd2lzZSAoQzJfRE9OVF9CTE9DSyksIGl0IG11c3QgYmUgIm5vbi1ibG9ja2luZyIuCisgICAgICogXHBhcmFtW291dF0gaGVhcFBhcmFtcyAgICAgIGEgbGlzdCBvZiBwYXJhbXMgd2hlcmUgdG8gd2hpY2ggdGhlIHN1cHBvcnRlZCBoZWFwIHBhcmFtZXRlcnMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBhcHBlbmRlZCBpbiB0aGUgb3JkZXIgdGhleSBhcHBlYXIgaW4gaGVhcFBhcmFtSW5kaWNlcy4KKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIGFsbCBwYXJhbWV0ZXJzIGNvdWxkIGJlIHF1ZXJpZWQKKyAgICAgKiBccmV0dmFsIEMyX0JBRF9JTkRFWCBhbGwgc3VwcG9ydGVkIHBhcmFtZXRlcnMgY291bGQgYmUgcXVlcmllZCwgYnV0IHNvbWUgcGFyYW1ldGVycyB3ZXJlIG5vdAorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRlZAorICAgICAqIFxyZXR2YWwgQzJfQkFEX1NUQVRFIHdoZW4gY2FsbGVkIGluIHRoZSByZWxlYXNlZCBjb21wb25lbnQgc3RhdGUgKHVzZXIgZXJyb3IpCisgICAgICogICAgICAgICAgICAgICAgICAgICAgKHRoaXMgZXJyb3IgY29kZSBpcyBvbmx5IGFsbG93ZWQgZm9yIGludGVyZmFjZXMgY29ubmVjdGVkIHRvIGNvbXBvbmVudHMpCisgICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgY291bGQgbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgYSBzdXBwb3J0ZWQgcGFyYW1ldGVyCisgICAgICogXHJldHZhbCBDMl9CTE9DS0lORyAgdGhlIG9wZXJhdGlvbiBtdXN0IGJsb2NrIHRvIGNvbXBsZXRlIGJ1dCBtYXlCbG9jayBpcyBmYWxzZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICh0aGlzIGVycm9yIGNvZGUgaXMgb25seSBhbGxvd2VkIGZvciBpbnRlcmZhY2VzIGNvbm5lY3RlZCB0byBjb21wb25lbnRzKQorICAgICAqIFxyZXR2YWwgQzJfVElNRURfT1VUIGNvdWxkIG5vdCBxdWVyeSB0aGUgcGFyYW1ldGVycyB3aXRoaW4gdGhlIHRpbWUgbGltaXQgKHVuZXhwZWN0ZWQpCisgICAgICogICAgICAgICAgICAgICAgICAgICAgKHRoaXMgZXJyb3IgY29kZSBpcyBvbmx5IGFsbG93ZWQgZm9yIGludGVyZmFjZXMgY29ubmVjdGVkIHRvIGNvbXBvbmVudHMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgcnVubmluZyBzdGF0ZSkKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24gZXJyb3IgcHJldmVudGVkIHRoZSBxdWVyeWluZyBvZiB0aGUgcGFyYW1ldGVycworICAgICAqICAgICAgICAgICAgICAgICAgICAgICh1bmV4cGVjdGVkKQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICh0aGlzIGVycm9yIGNvZGUgaXMgb25seSBhbGxvd2VkIGZvciBpbnRlcmZhY2VzIGNvbm5lY3RlZCB0byBjb21wb25lbnRzKQorICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcXVlcnlfdmIoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiAmc3RhY2tQYXJhbXMsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiAmaGVhcFBhcmFtSW5kaWNlcywKKyAgICAgICAgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaywKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiogY29uc3QgaGVhcFBhcmFtcykgY29uc3QgPSAwOworCisgICAgLyoqCisgICAgICogU2V0cyBhIHNldCBvZiBwYXJhbWV0ZXJzIGZvciB0aGUgY29tcG9uZW50IG9yIGludGVyZmFjZSBvYmplY3QuCisgICAgICoKKyAgICAgKiBUdW5pbmcgaXMgcGVyZm9ybWVkIGF0IGJlc3QgZWZmb3J0OiB0aGUgY29tcG9uZW50IFNIQUxMIHByb2Nlc3MgdGhlIGNvbmZpZ3VyYXRpb24gdXBkYXRlcyBpbgorICAgICAqIHRoZSBvcmRlciB0aGV5IGFwcGVhciBpbiB8cGFyYW1zfC4gSWYgYW55IHBhcmFtZXRlciB1cGRhdGUgZmFpbHMsIHRoZSBjb21wb25lbnQgc2hhbGwKKyAgICAgKiBjb21tdW5pY2F0ZSB0aGUgZmFpbHVyZSBpbiB0aGUgcmV0dXJuIHZhbHVlIGFuZCBpbiB8ZmFpbHVyZXN8LCBhbmQgc3RpbGwgcHJvY2VzcyB0aGUKKyAgICAgKiByZW1haW5pbmcgcGFyYW1ldGVycy4gVW5zdXBwb3J0ZWQgcGFyYW1ldGVycyBhcmUgc2tpcHBlZCwgdGhvdWdoIHRoZXkgYXJlIGNvbW11bmljYXRlZCBpbgorICAgICAqIHRoZXIgcmV0dXJuIHZhbHVlLiBNb3N0IHBhcmFtZXRlcnMgYXJlIHVwZGF0ZWQgYXQgYmVzdCBlZmZvcnQgLSBzdWNoIHRoYXQgZXZlbiBpZiBjbGllbnQKKyAgICAgKiBzcGVjaWZpZXMgYW4gdW5zdXBwb3J0ZWQgdmFsdWUgZm9yIGEgZmllbGQsIHRoZSBjbG9zZXN0IHN1cHBvcnRlZCB2YWx1ZSBpcyB1c2VkLiBPbiB0aGUKKyAgICAgKiBvdGhlciBoYW5kLCBzdHJpY3QgcGFyYW1ldGVycyBvbmx5IGFjY2VwdCBzcGVjaWZpYyB2YWx1ZXMgZm9yIHRoZWlyIGZpZWxkcywgYW5kIGlmIHRoZSBjbGllbnQKKyAgICAgKiBzcGVjaWZpZXMgYW4gdW5zdXBwb3J0ZWQgdmFsdWUsIHRoZSBwYXJhbWV0ZXIgc2V0dGluZyBzaGFsbCBmYWlsIGZvciB0aGF0IGZpZWxkLgorICAgICAqIElmIHRoZSBjbGllbnQgdHJpZXMgdG8gY2hhbmdlIHRoZSB2YWx1ZSBvZiBhIGZpZWxkIHRoYXQgcmVxdWlyZXMgbW9tZW50YXJ5IGJsb2NraW5nIHdpdGhvdXQKKyAgICAgKiBzZXR0aW5nIHxtYXlCbG9ja3wgdG8gQzJfTUFZX0JMT0NLLCB0aGF0IHBhcmFtZXRlciBzaGFsbCBhbHNvIGJlIHNraXBwZWQgYW5kIGEgc3BlY2lmaWMKKyAgICAgKiByZXR1cm4gdmFsdWUgc2hhbGwgYmUgdXNlZC4gRmluYWwgdmFsdWVzIGZvciBhbGwgcGFyYW1ldGVycyBzZXQgYXJlIHByb3BhZ2F0ZWQgYmFjayB0byB0aGUKKyAgICAgKiBjYWxsZXIgaW4gfHBhcmFtc3wuCisgICAgICoKKyAgICAgKiBcbm90ZSBQYXJhbWV0ZXIgdHVuaW5nIERPRVMgZGVwZW5kIG9uIHRoZSBvcmRlciBvZiB0aGUgdHVuaW5nIHBhcmFtZXRlcnMuIEUuZy4gc29tZSBwYXJhbWV0ZXIKKyAgICAgKiB1cGRhdGUgbWF5IGFsbG93IHNvbWUgc3Vic2VxdWVudCB2YWx1ZXMgZm9yIGZ1cnRoZXIgcGFyYW1ldGVyIHVwZGF0ZXMuCisgICAgICoKKyAgICAgKiBXaGVuIGF0dGFjaGVkIHRvIGEgY29tcG9uZW50LCB0aGlzIG1ldGhvZCBNVVNUIGJlIHN1cHBvcnRlZCBpbiBhbnkgY29tcG9uZW50IHN0YXRlIGV4Y2VwdAorICAgICAqIHJlbGVhc2VkLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgaGFzIGEgdmFyaWFibGUgYmxvY2tpbmcgYmVoYXZpb3IgYmFzZWQgb24gc3RhdGUuCisgICAgICogSW4gdGhlIHN0b3BwZWQgc3RhdGUgdGhpcyBtZXRob2QgTVVTVCBiZSAibm9uLWJsb2NraW5nIiBhbmQgcmV0dXJuIHdpdGhpbiAxbXMuCisgICAgICogSW4gdGhlIHJ1bm5pbmcgc3RhdGVzIHRoaXMgbWV0aG9kIG1heSBiZSBtb21lbnRhcmlseSBibG9ja2luZywgYnV0IE1VU1QgcmV0dXJuIHdpdGhpbiA1bXMuCisgICAgICoKKyAgICAgKiBccGFyYW1baW4sb3V0XSBwYXJhbXMgYSBsaXN0IG9mIHBhcmFtZXRlciB1cGRhdGVzLiBUaGVzZSB3aWxsIGJlIHVwZGF0ZWQgdG8gdGhlIGFjdHVhbAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXIgdmFsdWVzIGFmdGVyIHRoZSB1cGRhdGVzICh0aGlzIGlzIGJlY2F1c2UgdHVuaW5nIGlzIHBlcmZvcm1lZAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICBhdCBiZXN0IGVmZm9ydCkuCisgICAgICogICAgICAgICAgICAgICAgICAgICAgIFx0b2RvIHBhcmFtcyB0aGF0IGNvdWxkIG5vdCBiZSB1cGRhdGVkIGFyZSBub3QgbWFya2VkIGhlcmUsIHNvIGFyZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICBjb25mdXNpbmcgLSBhcmUgdGhleSAiZXhpc3RpbmciIHZhbHVlcyBvciBpbnRlbmRlZCB0byBiZSBjb25maWd1cmVkCisgICAgICogICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcz8KKyAgICAgKiBccGFyYW1baW5dIG1heUJsb2NrICAgaWYgdHJ1ZSAoQzJfTUFZX0JMT0NLKSwgaW1wbGVtZW50YXRpb24gbWF5IG1vbWVudGFyaWx5IGJsb2NrLgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICBPdGhlcndpc2UgKEMyX0RPTlRfQkxPQ0spLCBpdCBtdXN0IGJlICJub24tYmxvY2tpbmciLgorICAgICAqIFxwYXJhbVtvdXRdIGZhaWx1cmVzICBhIGxpc3Qgb2YgcGFyYW1ldGVyIGZhaWx1cmVzIGFuZCBvcHRpb25hbCBndWlkYW5jZQorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgYWxsIHBhcmFtZXRlcnMgY291bGQgYmUgdXBkYXRlZCBzdWNjZXNzZnVsbHkKKyAgICAgKiBccmV0dmFsIEMyX0JBRF9JTkRFWCBhbGwgc3VwcG9ydGVkIHBhcmFtZXRlcnMgY291bGQgYmUgdXBkYXRlZCBzdWNjZXNzZnVsbHksIGJ1dCBzb21lCisgICAgICogICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVycyB3ZXJlIG5vdCBzdXBwb3J0ZWQKKyAgICAgKiBccmV0dmFsIEMyX0JBRF9WQUxVRSBzb21lIHN1cHBvcnRlZCBwYXJhbWV0ZXJzIGNvdWxkIG5vdCBiZSB1cGRhdGVkIHN1Y2Nlc3NmdWxseSBiZWNhdXNlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgdGhleSBjb250YWluZWQgdW5zdXBwb3J0ZWQgdmFsdWVzLiBUaGVzZSBhcmUgcmV0dXJuZWQgaW4gfGZhaWx1cmVzfC4KKyAgICAgKiBccmV0dmFsIEMyX0JBRF9TVEFURSB3aGVuIGNhbGxlZCBpbiB0aGUgcmVsZWFzZWQgY29tcG9uZW50IHN0YXRlICh1c2VyIGVycm9yKQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICh0aGlzIGVycm9yIGNvZGUgaXMgb25seSBhbGxvd2VkIGZvciBpbnRlcmZhY2VzIGNvbm5lY3RlZCB0byBjb21wb25lbnRzKQorICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIHNvbWUgc3VwcG9ydGVkIHBhcmFtZXRlcnMgY291bGQgbm90IGJlIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5IGJlY2F1c2UKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICB0aGV5IGNvbnRhaW5lZCB1bnN1cHBvcnRlZCB2YWx1ZXMsIGJ1dCBjb3VsZCBub3QgYWxsb2NhdGUgYSBmYWlsdXJlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgb2JqZWN0IGZvciB0aGVtLgorICAgICAqIFxyZXR2YWwgQzJfVElNRURfT1VUIGNvdWxkIG5vdCBzZXQgdGhlIHBhcmFtZXRlcnMgd2l0aGluIHRoZSB0aW1lIGxpbWl0ICh1bmV4cGVjdGVkKQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICh0aGlzIGVycm9yIGNvZGUgaXMgb25seSBhbGxvd2VkIGZvciBpbnRlcmZhY2VzIGNvbm5lY3RlZCB0byBjb21wb25lbnRzCisgICAgICogICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIHJ1bm5pbmcgc3RhdGUpCisgICAgICogXHJldHZhbCBDMl9CTE9DS0lORyAgdGhlIG9wZXJhdGlvbiBtdXN0IGJsb2NrIHRvIGNvbXBsZXRlIGJ1dCBtYXlCbG9jayBpcyBmYWxzZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICh0aGlzIGVycm9yIGNvZGUgaXMgb25seSBhbGxvd2VkIGZvciBpbnRlcmZhY2VzIGNvbm5lY3RlZCB0byBjb21wb25lbnRzKQorICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgdGhlIHVwZGF0ZSBvZiB0aGUgcGFyYW1ldGVycworICAgICAqICAgICAgICAgICAgICAgICAgICAgICh1bmV4cGVjdGVkKQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICh0aGlzIGVycm9yIGNvZGUgaXMgb25seSBhbGxvd2VkIGZvciBpbnRlcmZhY2VzIGNvbm5lY3RlZCB0byBjb21wb25lbnRzKQorICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY29uZmlnX3ZiKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+ICZwYXJhbXMsCisgICAgICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+KiBjb25zdCBmYWlsdXJlcykgPSAwOworCisgICAgLy8gVFVOTkVMSU5HCisgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgdHVubmVsIGZyb20gdGhpcyBjb21wb25lbnQgdG8gdGhlIHRhcmdldCBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBJZiB0aGUgY29tcG9uZW50IGlzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkLCBzdWJzZXF1ZW50IHdvcmsgaXRlbXMgcXVldWVkIG1heSBpbmNsdWRlIGEKKyAgICAgKiB0dW5uZWxlZCBwYXRoIGJldHdlZW4gdGhlc2UgY29tcG9uZW50cy4KKyAgICAgKgorICAgICAqIFdoZW4gYXR0YWNoZWQgdG8gYSBjb21wb25lbnQsIHRoaXMgbWV0aG9kIE1VU1QgYmUgc3VwcG9ydGVkIGluIGFueSBjb21wb25lbnQgc3RhdGUgZXhjZXB0CisgICAgICogcmVsZWFzZWQuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBtYXkgYmUgbW9tZW50YXJpbHkgYmxvY2tpbmcsIGJ1dCBNVVNUIHJldHVybiB3aXRoaW4gNW1zLgorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIHR1bm5lbCB3YXMgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQKKyAgICAgKiBccmV0dmFsIEMyX0JBRF9JTkRFWCB0aGUgdGFyZ2V0IGNvbXBvbmVudCBkb2VzIG5vdCBleGlzdAorICAgICAqIFxyZXR2YWwgQzJfRFVQTElDQVRFIHRoZSB0dW5uZWwgYWxyZWFkeSBleGlzdHMKKyAgICAgKiBccmV0dmFsIEMyX09NSVRURUQgICB0dW5uZWxpbmcgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGNvbXBvbmVudAorICAgICAqIFxyZXR2YWwgQzJfQ0FOTk9UX0RPIHRoZSBzcGVjaWZpYyB0dW5uZWwgaXMgbm90IHN1cHBvcnRlZAorICAgICAqIFxyZXR2YWwgQzJfQkFEX1NUQVRFIHdoZW4gY2FsbGVkIGluIHRoZSByZWxlYXNlZCBjb21wb25lbnQgc3RhdGUgKHVzZXIgZXJyb3IpCisgICAgICogICAgICAgICAgICAgICAgICAgICAgKHRoaXMgZXJyb3IgY29kZSBpcyBvbmx5IGFsbG93ZWQgZm9yIGludGVyZmFjZXMgY29ubmVjdGVkIHRvIGNvbXBvbmVudHMpCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX1RJTUVEX09VVCBjb3VsZCBub3QgY3JlYXRlIHRoZSB0dW5uZWwgd2l0aGluIHRoZSB0aW1lIGxpbWl0ICh1bmV4cGVjdGVkKQorICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgdGhlIGNyZWF0aW9uIG9mIHRoZSB0dW5uZWwgKHVuZXhwZWN0ZWQpCisgICAgICogICAgICAgICAgICAgICAgICAgICAgKHRoaXMgZXJyb3IgY29kZSBpcyBvbmx5IGFsbG93ZWQgZm9yIGludGVyZmFjZXMgY29ubmVjdGVkIHRvIGNvbXBvbmVudHMpCisgICAgICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVUdW5uZWxfc20oYzJfbm9kZV9pZF90IHRhcmdldENvbXBvbmVudCkgPSAwOworCisgICAgLyoqCisgICAgICogUmVsZWFzZXMgYSB0dW5uZWwgZnJvbSB0aGlzIGNvbXBvbmVudCB0byB0aGUgdGFyZ2V0IGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIFRoZSByZWxlYXNlIG9mIGEgdHVubmVsIGlzIGRlbGF5ZWQgd2hpbGUgdGhlcmUgYXJlIHBlbmRpbmcgd29yayBpdGVtcyBmb3IgdGhlIHR1bm5lbC4KKyAgICAgKiBBZnRlciByZWxlYXNpbmcgYSB0dW5uZWwsIHN1YnNlcXVlbnQgd29yayBpdGVtcyBxdWV1ZWQgTVVTVCBOT1QgaW5jbHVkZSBhIHR1bm5lbGVkCisgICAgICogcGF0aCBiZXR3ZWVuIHRoZXNlIGNvbXBvbmVudHMuCisgICAgICoKKyAgICAgKiBXaGVuIGF0dGFjaGVkIHRvIGEgY29tcG9uZW50LCB0aGlzIG1ldGhvZCBNVVNUIGJlIHN1cHBvcnRlZCBpbiBhbnkgY29tcG9uZW50IHN0YXRlIGV4Y2VwdAorICAgICAqIHJlbGVhc2VkLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgbWF5IGJlIG1vbWVudGFyaWx5IGJsb2NraW5nLCBidXQgTVVTVCByZXR1cm4gd2l0aGluIDVtcy4KKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSB0dW5uZWwgd2FzIG1hcmtlZCBmb3IgcmVsZWFzZSBzdWNjZXNzZnVsbHkKKyAgICAgKiBccmV0dmFsIEMyX0JBRF9JTkRFWCB0aGUgdGFyZ2V0IGNvbXBvbmVudCBkb2VzIG5vdCBleGlzdAorICAgICAqIFxyZXR2YWwgQzJfTk9UX0ZPVU5EIHRoZSB0dW5uZWwgZG9lcyBub3QgZXhpc3QKKyAgICAgKiBccmV0dmFsIEMyX09NSVRURUQgICB0dW5uZWxpbmcgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGNvbXBvbmVudAorICAgICAqIFxyZXR2YWwgQzJfQkFEX1NUQVRFIHdoZW4gY2FsbGVkIGluIHRoZSByZWxlYXNlZCBjb21wb25lbnQgc3RhdGUgKHVzZXIgZXJyb3IpCisgICAgICogICAgICAgICAgICAgICAgICAgICAgKHRoaXMgZXJyb3IgY29kZSBpcyBvbmx5IGFsbG93ZWQgZm9yIGludGVyZmFjZXMgY29ubmVjdGVkIHRvIGNvbXBvbmVudHMpCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX1RJTUVEX09VVCBjb3VsZCBub3QgbWFyayB0aGUgdHVubmVsIGZvciByZWxlYXNlIHdpdGhpbiB0aGUgdGltZSBsaW1pdCAodW5leHBlY3RlZCkKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24gZXJyb3IgcHJldmVudGVkIHRoZSByZWxlYXNlIG9mIHRoZSB0dW5uZWwgKHVuZXhwZWN0ZWQpCisgICAgICogICAgICAgICAgICAgICAgICAgICAgKHRoaXMgZXJyb3IgY29kZSBpcyBvbmx5IGFsbG93ZWQgZm9yIGludGVyZmFjZXMgY29ubmVjdGVkIHRvIGNvbXBvbmVudHMpCisgICAgICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCByZWxlYXNlVHVubmVsX3NtKGMyX25vZGVfaWRfdCB0YXJnZXRDb21wb25lbnQpID0gMDsKKworICAgIC8vIFJFRkxFQ1RJT04gTUVDSEFOSVNNIChVU0VEIEZPUiBFWFRFTlNJT04pCisgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBzZXQgb2Ygc3VwcG9ydGVkIHBhcmFtZXRlcnMuCisgICAgICoKKyAgICAgKiBXaGVuIGF0dGFjaGVkIHRvIGEgY29tcG9uZW50LCB0aGlzIG1ldGhvZCBNVVNUIGJlIHN1cHBvcnRlZCBpbiBhbnkgY29tcG9uZW50IHN0YXRlIGV4Y2VwdAorICAgICAqIHJlbGVhc2VkLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSAibm9uLWJsb2NraW5nIiBhbmQgcmV0dXJuIHdpdGhpbiAxbXMuCisgICAgICoKKyAgICAgKiBccGFyYW1bb3V0XSBwYXJhbXMgYSB2ZWN0b3Igb2Ygc3VwcG9ydGVkIHBhcmFtZXRlcnMgd2lsbCBiZSBhcHBlbmRlZCB0byB0aGlzIHZlY3Rvci4KKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBvcGVyYXRpb24gY29tcGxldGVkIHN1Y2Nlc3NmdWxseS4KKyAgICAgKiBccmV0dmFsIEMyX0JBRF9TVEFURSB3aGVuIGNhbGxlZCBpbiB0aGUgcmVsZWFzZWQgY29tcG9uZW50IHN0YXRlICh1c2VyIGVycm9yKQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICh0aGlzIGVycm9yIGNvZGUgaXMgb25seSBhbGxvd2VkIGZvciBpbnRlcmZhY2VzIGNvbm5lY3RlZCB0byBjb21wb25lbnRzKQorICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIG5vdCBlbm91Z2ggbWVtb3J5IHRvIGNvbXBsZXRlIHRoaXMgbWV0aG9kLgorICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcXVlcnlTdXBwb3J0ZWRQYXJhbXNfbmIoCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+PiAqIGNvbnN0IHBhcmFtcykgY29uc3QgPSAwOworCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIGZvciB0aGUgcXVlcmllZCBmaWVsZHMuCisgICAgICoKKyAgICAgKiBDbGllbnQgU0hBTEwgc2V0IHRoZSBwYXJhbWV0ZXItZmllbGQgc3BlY2lmaWVyIGFuZCB0aGUgdHlwZSBvZiBzdXBwb3J0ZWQgdmFsdWVzIHF1ZXJ5IChlLmcuCisgICAgICogY3VycmVudGx5IHN1cHBvcnRlZCB2YWx1ZXMsIG9yIHBvdGVudGlhbCBzdXBwb3J0ZWQgdmFsdWVzKSBpbiBmaWVsZHMuCisgICAgICogVXBvbiByZXR1cm4gdGhlIGNvbXBvbmVudCBTSEFMTCBmaWxsIGluIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIGZvciB0aGUgZmllbGRzIGxpc3RlZCBhcyB3ZWxsCisgICAgICogYXMgYSBzdGF0dXMgZm9yIGVhY2ggZmllbGQuIENvbXBvbmVudCBzaGFsbCBwcm9jZXNzIGFsbCBmaWVsZHMgcXVlcmllZCBldmVuIGlmIHNvbWUgcXVlcmllcworICAgICAqIGZhaWwuCisgICAgICoKKyAgICAgKiBXaGVuIGF0dGFjaGVkIHRvIGEgY29tcG9uZW50LCB0aGlzIG1ldGhvZCBNVVNUIGJlIHN1cHBvcnRlZCBpbiBhbnkgY29tcG9uZW50IHN0YXRlIGV4Y2VwdAorICAgICAqIHJlbGVhc2VkLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgaGFzIGEgdmFyaWFibGUgYmxvY2tpbmcgYmVoYXZpb3IgYmFzZWQgb24gc3RhdGUuCisgICAgICogSW4gdGhlIHN0b3BwZWQgc3RhdGUgdGhpcyBtZXRob2QgTVVTVCBiZSAibm9uLWJsb2NraW5nIiBhbmQgcmV0dXJuIHdpdGhpbiAxbXMuCisgICAgICogSW4gdGhlIHJ1bm5pbmcgc3RhdGVzIHRoaXMgbWV0aG9kIG1heSBiZSBtb21lbnRhcmlseSBibG9ja2luZywgYnV0IE1VU1QgcmV0dXJuIHdpdGhpbiA1bXMuCisgICAgICoKKyAgICAgKiBccGFyYW1baW4gb3V0XSBmaWVsZHMgYSB2ZWN0b3Igb2YgZmllbGRzIGRlc2NyaXB0b3Igc3RydWN0dXJlcy4KKyAgICAgKiBccGFyYW1baW5dIG1heUJsb2NrICAgaWYgdHJ1ZSAoQzJfTUFZX0JMT0NLKSwgaW1wbGVtZW50YXRpb24gbWF5IG1vbWVudGFyaWx5IGJsb2NrLgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICBPdGhlcndpc2UgKEMyX0RPTlRfQkxPQ0spLCBpdCBtdXN0IGJlICJub24tYmxvY2tpbmciLgorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIG9wZXJhdGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LgorICAgICAqIFxyZXR2YWwgQzJfQkFEX1NUQVRFIHdoZW4gY2FsbGVkIGluIHRoZSByZWxlYXNlZCBjb21wb25lbnQgc3RhdGUgKHVzZXIgZXJyb3IpCisgICAgICogICAgICAgICAgICAgICAgICAgICAgKHRoaXMgZXJyb3IgY29kZSBpcyBvbmx5IGFsbG93ZWQgZm9yIGludGVyZmFjZXMgY29ubmVjdGVkIHRvIGNvbXBvbmVudHMpCisgICAgICogXHJldHZhbCBDMl9CQURfSU5ERVggYXQgbGVhc3Qgb25lIGZpZWxkIHdhcyBub3QgcmVjb2duaXplZCBhcyBhIGNvbXBvbmVudCBmaWVsZAorICAgICAqIFxyZXR2YWwgQzJfVElNRURfT1VUIGNvdWxkIG5vdCBxdWVyeSBzdXBwb3J0ZWQgdmFsdWVzIHdpdGhpbiB0aGUgdGltZSBsaW1pdCAodW5leHBlY3RlZCkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAodGhpcyBlcnJvciBjb2RlIGlzIG9ubHkgYWxsb3dlZCBmb3IgaW50ZXJmYWNlcyBjb25uZWN0ZWQgdG8gY29tcG9uZW50cworICAgICAqICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBydW5uaW5nIHN0YXRlKQorICAgICAqIFxyZXR2YWwgQzJfQkxPQ0tJTkcgIHRoZSBvcGVyYXRpb24gbXVzdCBibG9jayB0byBjb21wbGV0ZSBidXQgbWF5QmxvY2sgaXMgZmFsc2UKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAodGhpcyBlcnJvciBjb2RlIGlzIG9ubHkgYWxsb3dlZCBmb3IgaW50ZXJmYWNlcyBjb25uZWN0ZWQgdG8gY29tcG9uZW50cykKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24gZXJyb3IgcHJldmVudGVkIHRoZSBvcGVyYXRpb24gZnJvbSBjb21wbGV0aW5nICh1bmV4cGVjdGVkKQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICh0aGlzIGVycm9yIGNvZGUgaXMgb25seSBhbGxvd2VkIGZvciBpbnRlcmZhY2VzIGNvbm5lY3RlZCB0byBjb21wb25lbnRzKQorICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcXVlcnlTdXBwb3J0ZWRWYWx1ZXNfdmIoCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk+ICZmaWVsZHMsIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2spIGNvbnN0ID0gMDsKKworICAgIHZpcnR1YWwgfkMyQ29tcG9uZW50SW50ZXJmYWNlKCkgPSBkZWZhdWx0OworfTsKKworY2xhc3MgQzJDb21wb25lbnQgeworcHVibGljOgorICAgIGNsYXNzIExpc3RlbmVyIHsKKyAgICBwdWJsaWM6CisgICAgICAgIHZpcnR1YWwgdm9pZCBvbldvcmtEb25lX25iKHN0ZDo6d2Vha19wdHI8QzJDb21wb25lbnQ+IGNvbXBvbmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiB3b3JrSXRlbXMpID0gMDsKKworICAgICAgICB2aXJ0dWFsIHZvaWQgb25UcmlwcGVkX25iKHN0ZDo6d2Vha19wdHI8QzJDb21wb25lbnQ+IGNvbXBvbmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gc2V0dGluZ1Jlc3VsdCkgPSAwOworCisgICAgICAgIHZpcnR1YWwgdm9pZCBvbkVycm9yX25iKHN0ZDo6d2Vha19wdHI8QzJDb21wb25lbnQ+IGNvbXBvbmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZXJyb3JDb2RlKSA9IDA7CisKKyAgICAgICAgLy8gdmlydHVhbCB2b2lkIG9uVHVubmVsUmVsZWFzZWQoPGZyb20+LCA8dG8+KSA9IDA7CisKKyAgICAgICAgLy8gdmlydHVhbCB2b2lkIG9uQ29tcG9uZW50UmVsZWFzZWQoPGlkPikgPSAwOworCisgICAgICAgIHZpcnR1YWwgfkxpc3RlbmVyKCkgPSBkZWZhdWx0OworICAgIH07CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBsaXN0ZW5lciBmb3IgdGhpcyBjb21wb25lbnQKKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgYmUgc3VwcG9ydGVkIGluIGFsbCBzdGF0ZXMgZXhjZXB0IHJlbGVhc2VkLgorICAgICAqIFRoZSBsaXN0ZW5lciBjYW4gb25seSBiZSBzZXQgdG8gbm9uLW51bGwgdmFsdWUgaW4gc3RvcHBlZCBzdGF0ZSAodGhhdCBkb2VzIG5vdCBpbmNsdWRlCisgICAgICogdHJpcHBlZCBvciBlcnJvcikuIEl0IGNhbiBiZSBzZXQgdG8gbnVsbHB0ciBpbiBib3RoIHN0b3BwZWQgYW5kIHJ1bm5pbmcgc3RhdGVzLgorICAgICAqIENvbXBvbmVudHMgb25seSB1c2UgdGhlIGxpc3RlbmVyIGluIHJ1bm5pbmcgc3RhdGUuCisgICAgICoKKyAgICAgKiBJZiBsaXN0ZW5lciBpcyBudWxscHRyLCB0aGUgY29tcG9uZW50IFNIQUxMIGd1YXJhbnRlZSB0aGF0IG5vIG1vcmUgbGlzdGVuZXIgY2FsbGJhY2tzIGFyZQorICAgICAqIGRvbmUgdG8gdGhlIG9yaWdpbmFsIGxpc3RlbmVyIG9uY2UgdGhpcyBtZXRob2QgcmV0dXJucy4gKEFueSBwZW5kaW5nIGxpc3RlbmVyIGNhbGxiYWNrcyB3aWxsCisgICAgICogbmVlZCB0byBiZSBjb21wbGV0ZWQgZHVyaW5nIHRoaXMgY2FsbCAtIGhlbmNlIHRoaXMgY2FsbCBtYXkgYmUgdGVtcG9yYXJpbHkgYmxvY2tpbmcuKQorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgaGFzIGEgdmFyaWFibGUgYmxvY2tpbmcgYmVoYXZpb3IgYmFzZWQgb24gc3RhdGUuCisgICAgICogSW4gdGhlIHN0b3BwZWQgc3RhdGUgdGhpcyBtZXRob2QgTVVTVCBiZSAibm9uLWJsb2NraW5nIiBhbmQgcmV0dXJuIHdpdGhpbiAxbXMuCisgICAgICogSW4gdGhlIHJ1bm5pbmcgc3RhdGVzIHRoaXMgbWV0aG9kIG1heSBiZSBtb21lbnRhcmlseSBibG9ja2luZywgYnV0IE1VU1QgcmV0dXJuIHdpdGhpbiA1bXMuCisgICAgICoKKyAgICAgKiBDb21wb25lbnQgU0hBTEwgaGFuZGxlIGxpc3RlbmVyIG5vdGlmaWNhdGlvbnMgZnJvbSB0aGUgc2FtZSB0aHJlYWQgKHRoZSB0aHJlYWQgdXNlZCBpcworICAgICAqIGF0IHRoZSBjb21wb25lbnQncyBkaXNjcmV0aW9uLikKKyAgICAgKgorICAgICAqIFxub3RlIFRoaXMgY291bGQgYWxzbyBiZSBhY2NvbXBsaXNoZWQgYnkgcGFzc2luZyBhIHdlYWtfcHRyIHRvIGEgY29tcG9uZW50LXNwZWNpZmljIGxpc3RlbmVyCisgICAgICogaGVyZSBhbmQgcmVxdWlyaW5nIHRoZSBjbGllbnQgdG8gYWx3YXlzIHByb21vdGUgdGhlIHdlYWtfcHRyIGJlZm9yZSBhbnkgY2FsbGJhY2suIFRoaXMgd291bGQKKyAgICAgKiBwdXQgdGhlIGJ1cmRlbiBvbiB0aGUgY2xpZW50IHRvIGNsZWFyIHRoZSBsaXN0ZW5lciAtIHdhaXQgZm9yIGl0cyBkZWxldGlvbiAtIGF0IHdoaWNoIHBvaW50CisgICAgICogaXQgaXMgZ3VhcmFudGVlZCB0aGF0IG5vIG1vcmUgbGlzdGVuZXIgY2FsbGJhY2tzIHdpbGwgb2NjdXIuCisgICAgICoKKyAgICAgKiBccGFyYW1baW5dIGxpc3RlbmVyIHRoZSBjb21wb25lbnQgbGlzdGVuZXIgb2JqZWN0CisgICAgICogXHBhcmFtW2luXSBtYXlCbG9jayBpZiB0cnVlIChDMl9NQVlfQkxPQ0spLCBpbXBsZW1lbnRhdGlvbiBtYXkgbW9tZW50YXJpbHkgYmxvY2suCisgICAgICogICAgICAgICAgICAgICAgICAgICBPdGhlcndpc2UgKEMyX0RPTlRfQkxPQ0spLCBpdCBtdXN0IGJlICJub24tYmxvY2tpbmciLgorICAgICAqCisgICAgICogXHJldHZhbCBDMl9CQURfU1RBVEUgYXR0ZW1wdGluZyB0byBjaGFuZ2UgdGhlIGxpc3RlbmVyIGluIHRoZSBydW5uaW5nIHN0YXRlIHRvIGEgbm9uLW51bGwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSAodXNlciBlcnJvciksIG9yIGNhbGxlZCBpbiB0aGUgcmVsZWFzZWQgc3RhdGUKKyAgICAgKiBccmV0dmFsIEMyX0JMT0NLSU5HICB0aGUgb3BlcmF0aW9uIG11c3QgYmxvY2sgdG8gY29tcGxldGUgYnV0IG1heUJsb2NrIGlzIGZhbHNlCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgbGlzdGVuZXIgd2FzIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5LgorICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3Qgc2V0TGlzdGVuZXJfdmIoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8TGlzdGVuZXI+ICZsaXN0ZW5lciwgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaykgPSAwOworCisgICAgLy8vIGNvbXBvbmVudCBkb21haW4gKGUuZy4gYXVkaW8gb3IgdmlkZW8pCisgICAgZW51bSBkb21haW5fdCA6IHVpbnQzMl90OworCisgICAgLy8vIGNvbXBvbmVudCBraW5kIChlLmcuIGVuY29kZXIsIGRlY29kZXIgb3IgZmlsdGVyKQorICAgIGVudW0ga2luZF90IDogdWludDMyX3Q7CisKKyAgICAvLy8gY29tcG9uZW50IHJhbmsuIFRoaXMgbnVtYmVyIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIGNvbXBvbmVudCBvcmRlcmluZyAodGhlIGxvd2VyIHRoZSBzb29uZXIpCisgICAgLy8vIGluIHRoZSBjb21wb25lbnQgbGlzdC4KKyAgICB0eXBlZGVmIHVpbnQzMl90IHJhbmtfdDsKKworICAgIC8vLyBjb21wb25lbnQgYXR0cmlidXRlcworICAgIGVudW0gYXR0cmliX3QgOiB1aW50NjRfdDsKKworICAgIC8qKgorICAgICAqIEluZm9ybWF0aW9uIGFib3V0IGEgY29tcG9uZW50LgorICAgICAqLworICAgIHN0cnVjdCBUcmFpdHMgeworICAgIC8vIHB1YmxpYzoKKyAgICAgICAgQzJTdHJpbmcgbmFtZTsgLy8vPCBuYW1lIG9mIHRoZSBjb21wb25lbnQKKyAgICAgICAgZG9tYWluX3QgZG9tYWluOyAvLy88IGNvbXBvbmVudCBkb21haW4KKyAgICAgICAga2luZF90IGtpbmQ7IC8vLzwgY29tcG9uZW50IGtpbmQKKyAgICAgICAgcmFua190IHJhbms7IC8vLzwgY29tcG9uZW50IHJhbmsKKyAgICAgICAgQzJTdHJpbmcgbWVkaWFUeXBlOyAvLy88IG1lZGlhIHR5cGUgc3VwcG9ydGVkIGJ5IHRoZSBjb21wb25lbnQKKworICAgICAgICAvKioKKyAgICAgICAgICogbmFtZSBhbGlhcyhlcykgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCisgICAgICAgICAqIFxub3RlIE11bHRpcGxlIGNvbXBvbmVudHMgY2FuIGhhdmUgdGhlIHNhbWUgYWxpYXMgYXMgbG9uZyBhcyB0aGVpciBtZWRpYS10eXBlIGRpZmZlcnMuCisgICAgICAgICAqLworICAgICAgICBzdGQ6OnZlY3RvcjxDMlN0cmluZ0xpdGVyYWw+IGFsaWFzZXM7IC8vLzwgbmFtZSBhbGlhc2VzIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5CisgICAgfTsKKworICAgIC8vIE1FVEhPRFMgQVZBSUxBQkxFIFdIRU4gUlVOTklORworICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgLyoqCisgICAgICogUXVldWVzIHVwIHdvcmsgZm9yIHRoZSBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIGJlIHN1cHBvcnRlZCBpbiBydW5uaW5nIChpbmNsdWRpbmcgdHJpcHBlZCBhbmQgZXJyb3IpIHN0YXRlcy4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgYmUgIm5vbi1ibG9ja2luZyIgYW5kIHJldHVybiB3aXRoaW4gMSBtcworICAgICAqCisgICAgICogSXQgaXMgYWNjZXB0YWJsZSBmb3IgdGhpcyBtZXRob2QgdG8gcmV0dXJuIE9LIGFuZCByZXR1cm4gYW4gZXJyb3IgdmFsdWUgdXNpbmcgdGhlCisgICAgICogb25Xb3JrRG9uZSgpIGNhbGxiYWNrLgorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIHdvcmsgd2FzIHN1Y2Nlc3NmdWxseSBxdWV1ZWQKKyAgICAgKiBccmV0dmFsIEMyX0JBRF9JTkRFWCBzb21lIGNvbXBvbmVudChzKSBpbiB0aGUgd29yayBkbyhlcykgbm90IGV4aXN0CisgICAgICogXHJldHZhbCBDMl9DQU5OT1RfRE8gdGhlIGNvbXBvbmVudHMgYXJlIG5vdCB0dW5uZWxlZAorICAgICAqIFxyZXR2YWwgQzJfQkFEX1NUQVRFIHdoZW4gY2FsbGVkIGluIHRoZSBzdG9wcGVkIG9yIHJlbGVhc2VkIHN0YXRlICh1c2VyIGVycm9yKQorICAgICAqCisgICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgbm90IGVub3VnaCBtZW1vcnkgdG8gcXVldWUgdGhlIHdvcmsKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24gZXJyb3IgcHJldmVudGVkIHF1ZXVpbmcgdGhlIHdvcmsgKHVuZXhwZWN0ZWQpCisgICAgICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWV1ZV9uYihzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+KiBjb25zdCBpdGVtcykgPSAwOworCisgICAgLyoqCisgICAgICogQW5ub3VuY2VzIGEgd29yayB0byBiZSBxdWV1ZWQgbGF0ZXIgZm9yIHRoZSBjb21wb25lbnQuIFRoaXMgcmVzZXJ2ZXMgYSBzbG90IGZvciB0aGUgcXVldWUKKyAgICAgKiB0byBlbnN1cmUgY29ycmVjdCB3b3JrIG9yZGVyaW5nIGV2ZW4gaWYgdGhlIHdvcmsgaXMgcXVldWVkIGxhdGVyLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSBzdXBwb3J0ZWQgaW4gcnVubmluZyAoaW5jbHVkaW5nIHRyaXBwZWQgYW5kIGVycm9yKSBzdGF0ZXMuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIGJlICJub24tYmxvY2tpbmciIGFuZCByZXR1cm4gd2l0aGluIDEgbXMKKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSB3b3JrIGFubm91bmNlbWVudCBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgcmVjb3JkZWQKKyAgICAgKiBccmV0dmFsIEMyX0JBRF9JTkRFWCBzb21lIGNvbXBvbmVudChzKSBpbiB0aGUgd29yayBvdXRsaW5lIGRvKGVzKSBub3QgZXhpc3QKKyAgICAgKiBccmV0dmFsIEMyX0NBTk5PVF9ETyB0aGUgY29tcG9uZW50ZXMgYXJlIG5vdCB0dW5uZWxlZAorICAgICAqIFxyZXR2YWwgQzJfQkFEX1NUQVRFIHdoZW4gY2FsbGVkIGluIHRoZSBzdG9wcGVkIG9yIHJlbGVhc2VkIHN0YXRlICh1c2VyIGVycm9yKQorICAgICAqCisgICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgbm90IGVub3VnaCBtZW1vcnkgdG8gcmVjb3JkIHRoZSB3b3JrIGFubm91bmNlbWVudAorICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgcmVjb3JkaW5nIHRoZSBhbm5vdW5jZW1lbnQgKHVuZXhwZWN0ZWQpCisgICAgICoKKyAgICAgKiBcdG9kbyBDYW4gdGhpcyBiZSByb2xsZWQgaW50byBxdWV1ZV9uYj8KKyAgICAgKiBcdG9kbyBFeHBvc2UgbmV4dCB3b3JrIGl0ZW0gZm9yIGVhY2ggY29tcG9uZW50IHRvIGRldGVjdCBzdGFsbHMKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGFubm91bmNlX25iKGNvbnN0IHN0ZDo6dmVjdG9yPEMyV29ya091dGxpbmU+ICZpdGVtcykgPSAwOworCisgICAgZW51bSBmbHVzaF9tb2RlX3QgOiB1aW50MzJfdCB7CisgICAgICAgIC8vLyBmbHVzaCB3b3JrIGZyb20gdGhpcyBjb21wb25lbnQgb25seQorICAgICAgICBGTFVTSF9DT01QT05FTlQsCisKKyAgICAgICAgLy8vIGZsdXNoIHdvcmsgZnJvbSB0aGlzIGNvbXBvbmVudCBhbmQgYWxsIGNvbXBvbmVudHMgY29ubmVjdGVkIGRvd25zdHJlYW0gZnJvbSBpdCB2aWEKKyAgICAgICAgLy8vIHR1bm5lbGluZworICAgICAgICBGTFVTSF9DSEFJTiA9ICgxIDw8IDE2KSwKKyAgICB9OworCisgICAgLyoqCisgICAgICogRGlzY2FyZHMgYW5kIGFiYW5kb25zIGFueSBwZW5kaW5nIHdvcmsgZm9yIHRoZSBjb21wb25lbnQsIGFuZCBvcHRpb25hbGx5IGFueSBjb21wb25lbnQKKyAgICAgKiBkb3duc3RyZWFtLgorICAgICAqCisgICAgICogXHRvZG8gZGVmaW5lIHRoaXM6IHdlIGNvdWxkIGZsdXNoIGFsbCB3b3JrIGJlZm9yZSBsYXN0IGl0ZW0gcXVldWVkIGZvciBjb21wb25lbnQgYWNyb3NzIGFsbAorICAgICAqICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRzIGxpbmtlZCB0byB0aGlzOyBmbHVzaCBvbmx5IHdvcmsgaXRlbXMgdGhhdCBhcmUgcXVldWVkIHRvIHRoaXMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50CisgICAgICogXHRvZG8gcmV0dXJuIHdvcmsgIyBvZiBsYXN0IGZsdXNoZWQgaXRlbTsgb3IgYWxsIGZsdXNoZWQgKGJ1dCBub3QgcmV0dXJuZWQgaXRlbXMpCisgICAgICogXHRvZG8gd2UgY291bGQgbWFrZSBmbHVzaCB0YWtlIGEgd29yayBpdGVtIGFuZCBmbHVzaCBhbGwgd29yayBiZWZvcmUvYWZ0ZXIgdGhhdCBpdGVtIHRvIGFsbG93CisgICAgICogICAgICAgVEJEIChzbGljaW5nL3NlZWs/KQorICAgICAqIFx0b2RvIHdlIGNvdWxkIHNpbXBseSB0YWtlIGEgbGlzdCBvZiBudW1iZXJzIGFuZCBmbHVzaCB0aG9zZS4uLiB0aGlzIGlzIGJhZCBmb3IgZGVjb2RlcnMKKyAgICAgKiAgICAgICBhbHNvLCB3aGF0IHdvdWxkIGhhcHBlbiB0byBmaW5lIGdyYWRlIHJlZmVyZW5jZXM/CisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIGJlIHN1cHBvcnRlZCBpbiBydW5uaW5nIChpbmNsdWRpbmcgdHJpcHBlZCBhbmQgZXJyb3IpIHN0YXRlcy4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIG1heSBiZSBtb21lbnRhcmlseSBibG9ja2luZywgYnV0IG11c3QgcmV0dXJuIHdpdGhpbiA1bXMuCisgICAgICoKKyAgICAgKiBXb3JrIHRoYXQgY291bGQgYmUgaW1tZWRpYXRlbHkgYWJhbmRvbmVkL2Rpc2NhcmRlZCBTSEFMTCBiZSByZXR1cm5lZCBpbiB8Zmx1c2hlZFdvcmt8OyB0aGlzCisgICAgICogY2FuIGJlIGRvbmUgaW4gYW4gYXJiaXRyYXJ5IG9yZGVyLgorICAgICAqCisgICAgICogV29yayB0aGF0IGNvdWxkIG5vdCBiZSBhYmFuZG9uZWQgb3IgZGlzY2FyZGVkIGltbWVkaWF0ZWx5IFNIQUxMIGJlIG1hcmtlZCB0byBiZQorICAgICAqIGRpc2NhcmRlZCBhdCB0aGUgZWFybGllc3Qgb3Bwb3J0dW5pdHksIGFuZCBTSEFMTCBiZSByZXR1cm5lZCB2aWEgdGhlIG9uV29ya0RvbmUoKSBjYWxsYmFjay4KKyAgICAgKiBUaGlzIHNoYWxsIGJlIGNvbXBsZXRlZCB3aXRoaW4gNTAwbXMuCisgICAgICoKKyAgICAgKiBccGFyYW0gbW9kZSBmbHVzaCBtb2RlCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgY29tcG9uZW50IGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBmbHVzaGVkCisgICAgICogXHJldHZhbCBDMl9CQURfU1RBVEUgd2hlbiBjYWxsZWQgaW4gdGhlIHN0b3BwZWQgb3IgcmVsZWFzZWQgc3RhdGUgKHVzZXIgZXJyb3IpCisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgdGhlIGZsdXNoIGNvdWxkIG5vdCBiZSBjb21wbGV0ZWQgd2l0aGluIHRoZSB0aW1lIGxpbWl0ICh1bmV4cGVjdGVkKQorICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgZmx1c2hpbmcgZnJvbSBjb21wbGV0aW9uICh1bmV4cGVjdGVkKQorICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgZmx1c2hfc20oZmx1c2hfbW9kZV90IG1vZGUsIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4qIGNvbnN0IGZsdXNoZWRXb3JrKSA9IDA7CisKKyAgICBlbnVtIGRyYWluX21vZGVfdCA6IHVpbnQzMl90IHsKKyAgICAgICAgLy8vIGRyYWluIGNvbXBvbmVudCBvbmx5IGFuZCBhZGQgYW4gImVuZC1vZi1zdHJlYW0iIG1hcmtlci4gQ29tcG9uZW50IHNoYWxsIHByb2Nlc3MgYWxsCisgICAgICAgIC8vLyBxdWV1ZWQgd29yayBhbmQgY29tcGxldGUgdGhlIGN1cnJlbnQgc3RyZWFtLiBJZiBuZXcgaW5wdXQgaXMgcmVjZWl2ZWQsIGl0IHNoYWxsIHN0YXJ0CisgICAgICAgIC8vLyBhIG5ldyBzdHJlYW0uIFx0b2RvIGRlZmluZSB3aGF0IGEgc3RyZWFtIGlzLgorICAgICAgICBEUkFJTl9DT01QT05FTlRfV0lUSF9FT1MsCisgICAgICAgIC8vLyBkcmFpbiBjb21wb25lbnQgd2l0aG91dCBzZXR0aW5nICJlbmQtb2Ytc3RyZWFtIiBtYXJrZXIuIENvbXBvbmVudCBzaGFsbCBwcm9jZXNzIGFsbAorICAgICAgICAvLy8gcXVldWVkIHdvcmsgYnV0IHNoYWxsIGV4cGVjdCBtb3JlIHdvcmsgaXRlbXMgZm9yIHRoZSBzYW1lIHN0cmVhbS4KKyAgICAgICAgRFJBSU5fQ09NUE9ORU5UX05PX0VPUyA9ICgxIDw8IDApLAorCisgICAgICAgIC8vLyBtYXJrcyB0aGUgbGFzdCB3b3JrIGl0ZW0gd2l0aCBhIHBlcnNpc3RlbnQgImVuZC1vZi1zdHJlYW0iIG1hcmtlciB0aGF0IHdpbGwgZHJhaW4KKyAgICAgICAgLy8vIGRvd25zdHJlYW0gY29tcG9uZW50cworICAgICAgICAvLy8gXHRvZG8gdGhpcyBtYXkgY29uZnVzZSB3b3JrLW9yZGVyaW5nIGRvd25zdHJlYW0KKyAgICAgICAgRFJBSU5fQ0hBSU4gPSAoMSA8PCAxNiksCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFx0b2RvIGRlZmluZSB0aGlzOyB3ZSBjb3VsZCBwbGFjZSBFT1MgdG8gYWxsIHVwc3RyZWFtIGNvbXBvbmVudHMsIGp1c3QgdGhpcyBjb21wb25lbnQsIG9yCisgICAgICAgICAqICAgICAgIGFsbCB1cHN0cmVhbSBhbmQgZG93bnN0cmVhbSBjb21wb25lbnQuCisgICAgICAgICAqIFx0b2RvIHNob3VsZCBFT1MgY2Fycnkgb3ZlciB0byBkb3duc3RyZWFtIGNvbXBvbmVudHM/CisgICAgICAgICAqLworICAgIH07CisKKyAgICAvKioKKyAgICAgKiBEcmFpbnMgdGhlIGNvbXBvbmVudCwgYW5kIG9wdGlvbmFsbHkgZG93bnN0cmVhbSBjb21wb25lbnRzLiBUaGlzIGlzIGEgc2lnbmFsbGluZyBtZXRob2Q7CisgICAgICogYXMgc3VjaCBpdCBkb2VzIG5vdCB3YWl0IGZvciBhbnkgd29yayBjb21wbGV0aW9uLgorICAgICAqCisgICAgICogTWFya3MgbGFzdCB3b3JrIGl0ZW0gYXMgImRyYWluLXRpbGwtaGVyZSIsIHNvIGNvbXBvbmVudCBpcyBub3RpZmllZCBub3QgdG8gd2FpdCBmb3IgZnVydGhlcgorICAgICAqIHdvcmsgYmVmb3JlIGl0IHByb2Nlc3NlcyB3b3JrIGFscmVhZHkgcXVldWVkLiBUaGlzIG1ldGhvZCBjYW4gYWxzbyB1c2VkIHRvIHNldCB0aGUKKyAgICAgKiBlbmQtb2Ytc3RyZWFtIGZsYWcgYWZ0ZXIgd29yayBoYXMgYmVlbiBxdWV1ZWQuIENsaWVudCBjYW4gY29udGludWUgdG8gcXVldWUgZnVydGhlciB3b3JrCisgICAgICogaW1tZWRpYXRlbHkgYWZ0ZXIgdGhpcyBtZXRob2QgcmV0dXJucy4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgYmUgc3VwcG9ydGVkIGluIHJ1bm5pbmcgKGluY2x1ZGluZyB0cmlwcGVkKSBzdGF0ZXMuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIGJlICJub24tYmxvY2tpbmciIGFuZCByZXR1cm4gd2l0aGluIDFtcy4KKyAgICAgKgorICAgICAqIFdvcmsgdGhhdCBpcyBjb21wbGV0ZWQgU0hBTEwgYmUgcmV0dXJuZWQgdmlhIHRoZSBvbldvcmtEb25lKCkgY2FsbGJhY2suCisgICAgICoKKyAgICAgKiBccGFyYW0gbW9kZSBkcmFpbiBtb2RlCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgZHJhaW4gcmVxdWVzdCBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgcmVjb3JkZWQKKyAgICAgKiBccmV0dmFsIEMyX0JBRF9TVEFURSB3aGVuIGNhbGxlZCBpbiB0aGUgc3RvcHBlZCBvciByZWxlYXNlZCBzdGF0ZSAodXNlciBlcnJvcikKKyAgICAgKiBccmV0dmFsIEMyX0JBRF9WQUxVRSB0aGUgZHJhaW4gbW9kZSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBjb21wb25lbnQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBcdG9kbyBkZWZpbmUgc3VwcG9ydGVkIG1vZGVzIGRpc2NvdmVyeQorICAgICAqIFxyZXR2YWwgQzJfVElNRURfT1VUIHRoZSBmbHVzaCBjb3VsZCBub3QgYmUgY29tcGxldGVkIHdpdGhpbiB0aGUgdGltZSBsaW1pdCAodW5leHBlY3RlZCkKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24gZXJyb3IgcHJldmVudGVkIGZsdXNoaW5nIGZyb20gY29tcGxldGlvbiAodW5leHBlY3RlZCkKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGRyYWluX25iKGRyYWluX21vZGVfdCBtb2RlKSA9IDA7CisKKyAgICAvLyBTVEFURSBDSEFOR0UgTUVUSE9EUworICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgLyoqCisgICAgICogU3RhcnRzIHRoZSBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIGJlIHN1cHBvcnRlZCBpbiBzdG9wcGVkIHN0YXRlLCBhcyB3ZWxsIGFzIGR1cmluZyB0aGUgdHJpcHBlZCBzdGF0ZS4KKyAgICAgKgorICAgICAqIElmIHRoZSByZXR1cm4gdmFsdWUgaXMgQzJfT0ssIHRoZSBjb21wb25lbnQgc2hhbGwgYmUgaW4gdGhlIHJ1bm5pbmcgc3RhdGUuCisgICAgICogSWYgdGhlIHJldHVybiB2YWx1ZSBpcyBDMl9CQURfU1RBVEUgb3IgQzJfRFVQTElDQVRFLCBubyBzdGF0ZSBjaGFuZ2UgaXMgZXhwZWN0ZWQgYXMgYQorICAgICAqIHJlc3BvbnNlIHRvIHRoaXMgY2FsbC4KKyAgICAgKiBPdGhlcndpc2UsIHRoZSBjb21wb25lbnQgc2hhbGwgYmUgaW4gdGhlIHN0b3BwZWQgc3RhdGUuCisgICAgICoKKyAgICAgKiBcbm90ZSBJZiBhIGNvbXBvbmVudCBpcyBpbiB0aGUgdHJpcHBlZCBzdGF0ZSBhbmQgc3RhcnQoKSBpcyBjYWxsZWQgd2hpbGUgdGhlIGNvbXBvbmVudAorICAgICAqIGNvbmZpZ3VyYXRpb24gc3RpbGwgcmVzdWx0cyBpbiBhIHRyaXAsIHN0YXJ0IHNoYWxsIHN1Y2NlZWQgYW5kIGEgbmV3IG9uVHJpcHBlZCBjYWxsYmFjaworICAgICAqIHNob3VsZCBiZSB1c2VkIHRvIGNvbW11bmljYXRlIHRoZSBjb25maWd1cmF0aW9uIGNvbmZsaWN0IHRoYXQgcmVzdWx0cyBpbiB0aGUgbmV3IHRyaXAuCisgICAgICoKKyAgICAgKiBcdG9kbyBUaGlzIG1ldGhvZCBNVVNUIHJldHVybiB3aXRoaW4gNTAwbXMuIFNlZW1zIHRoaXMgc2hvdWxkIGJlIGFibGUgdG8gcmV0dXJuIHF1aWNrbHksIGFzCisgICAgICogdGhlcmUgYXJlIG5vIGltbWVkaWF0ZSBndWFyYW50ZWVzLiBUaG91Z2ggdGhlcmUgYXJlIGd1YXJhbnRlZXMgZm9yIHJlc3BvbnNpdmVuZXNzIGltbWVkaWF0ZWx5CisgICAgICogYWZ0ZXIgc3RhcnQgcmV0dXJucy4KKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBjb21wb25lbnQgaGFzIHN0YXJ0ZWQgKG9yIHJlc3VtZWQpIHN1Y2Nlc3NmdWxseQorICAgICAqIFxyZXR2YWwgQzJfRFVQTElDQVRFIHdoZW4gY2FsbGVkIGR1cmluZyBhbm90aGVyIHN0YXJ0IGNhbGwgZnJvbSBhbm90aGVyIHRocmVhZAorICAgICAqIFxyZXR2YWwgQzJfQkFEX1NUQVRFIHdoZW4gY2FsbGVkIGluIGFueSBzdGF0ZSBvdGhlciB0aGFuIHRoZSBzdG9wcGVkIHN0YXRlIG9yIHRyaXBwZWQgc3RhdGUsCisgICAgICogICAgICAgICAgICAgICAgICAgICAgaW5jbHVkaW5nIHdoZW4gY2FsbGVkIGR1cmluZyBhbm90aGVyIHN0YXRlIGNoYW5nZSBjYWxsIGZyb20gYW5vdGhlcgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHRocmVhZCAodXNlciBlcnJvcikKKyAgICAgKiBccmV0dmFsIEMyX05PX01FTU9SWSBub3QgZW5vdWdoIG1lbW9yeSB0byBzdGFydCB0aGUgY29tcG9uZW50CisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgdGhlIGNvbXBvbmVudCBjb3VsZCBub3QgYmUgc3RhcnRlZCB3aXRoaW4gdGhlIHRpbWUgbGltaXQgKHVuZXhwZWN0ZWQpCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duIGVycm9yIHByZXZlbnRlZCBzdGFydGluZyB0aGUgY29tcG9uZW50ICh1bmV4cGVjdGVkKQorICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3Qgc3RhcnQoKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBTdG9wcyB0aGUgY29tcG9uZW50LgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSBzdXBwb3J0ZWQgaW4gcnVubmluZyAoaW5jbHVkaW5nIHRyaXBwZWQpIHN0YXRlLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgTVVTVCByZXR1cm4gd2l0aGluZyA1MDBtcy4KKyAgICAgKgorICAgICAqIFVwb24gdGhpcyBjYWxsLCBhbGwgcGVuZGluZyB3b3JrIFNIQUxMIGJlIGFiYW5kb25lZCBhbmQgYWxsIGJ1ZmZlciByZWZlcmVuY2VzIFNIQUxMIGJlCisgICAgICogcmVsZWFzZWQuCisgICAgICogSWYgdGhlIHJldHVybiB2YWx1ZSBpcyBDMl9CQURfU1RBVEUgb3IgQzJfRFVQTElDQVRFLCBubyBzdGF0ZSBjaGFuZ2UgaXMgZXhwZWN0ZWQgYXMgYQorICAgICAqIHJlc3BvbnNlIHRvIHRoaXMgY2FsbC4KKyAgICAgKiBGb3IgYWxsIG90aGVyIHJldHVybiB2YWx1ZXMsIHRoZSBjb21wb25lbnQgc2hhbGwgYmUgaW4gdGhlIHN0b3BwZWQgc3RhdGUuCisgICAgICoKKyAgICAgKiBcdG9kbyBzaG91bGQgdGhpcyByZXR1cm4gY29tcGxldGVkIHdvcmssIHNpbmNlIGNsaWVudCB3aWxsIGp1c3QgZnJlZSBpdD8gUGVyaGFwcyBqdXN0IHRvCisgICAgICogdmVyaWZ5IGFjY291bnRpbmcuCisgICAgICoKKyAgICAgKiBUaGlzIGRvZXMgbm90IGFsdGVyIGFueSBzZXR0aW5ncyBhbmQgdHVuaW5ncyB0aGF0IG1heSBoYXZlIHJlc3VsdGVkIGluIGEgdHJpcHBlZCBzdGF0ZS4KKyAgICAgKiAoSXMgdGhpcyBtYXRlcmlhbCBnaXZlbiB0aGUgZGVmaW5pdGlvbj8gUGVyaGFwcyBpbiBjYXNlIHdlIHdhbnQgdG8gc3RhcnQgYWdhaW4uKQorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIGNvbXBvbmVudCBoYXMgc3RhcnRlZCBzdWNjZXNzZnVsbHkKKyAgICAgKiBccmV0dmFsIEMyX0RVUExJQ0FURSB3aGVuIGNhbGxlZCBkdXJpbmcgYW5vdGhlciBzdG9wIGNhbGwgZnJvbSBhbm90aGVyIHRocmVhZAorICAgICAqIFxyZXR2YWwgQzJfQkFEX1NUQVRFIHdoZW4gY2FsbGVkIGluIGFueSBzdGF0ZSBvdGhlciB0aGFuIHRoZSBydW5uaW5nIHN0YXRlLCBpbmNsdWRpbmcgd2hlbgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIGNhbGxlZCBkdXJpbmcgYW5vdGhlciBzdGF0ZSBjaGFuZ2UgY2FsbCBmcm9tIGFub3RoZXIgdGhyZWFkICh1c2VyIGVycm9yKQorICAgICAqIFxyZXR2YWwgQzJfVElNRURfT1VUIHRoZSBjb21wb25lbnQgY291bGQgbm90IGJlIHN0b3BwZWQgd2l0aGluIHRoZSB0aW1lIGxpbWl0ICh1bmV4cGVjdGVkKQorICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgc3RvcHBpbmcgdGhlIGNvbXBvbmVudCAodW5leHBlY3RlZCkKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHN0b3AoKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZXNldHMgdGhlIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgYmUgc3VwcG9ydGVkIGluIGFsbCAoaW5jbHVkaW5nIHRyaXBwZWQpIHN0YXRlcyBvdGhlciB0aGFuIHJlbGVhc2VkLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSBzdXBwb3J0ZWQgZHVyaW5nIGFueSBvdGhlciBibG9ja2luZyBjYWxsLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgTVVTVCByZXR1cm4gd2l0aGluZyA1MDBtcy4KKyAgICAgKgorICAgICAqIEFmdGVyIHRoaXMgY2FsbCByZXR1cm5zIGFsbCB3b3JrIFNIQUxMIGJlIGFiYW5kb25lZCwgYWxsIGJ1ZmZlciByZWZlcmVuY2VzIFNIQUxMIGJlIHJlbGVhc2VkLgorICAgICAqIElmIHRoZSByZXR1cm4gdmFsdWUgaXMgQzJfQkFEX1NUQVRFIG9yIEMyX0RVUExJQ0FURSwgbm8gc3RhdGUgY2hhbmdlIGlzIGV4cGVjdGVkIGFzIGEKKyAgICAgKiByZXNwb25zZSB0byB0aGlzIGNhbGwuCisgICAgICogRm9yIGFsbCBvdGhlciByZXR1cm4gdmFsdWVzLCB0aGUgY29tcG9uZW50IHNoYWxsIGJlIGluIHRoZSBzdG9wcGVkIHN0YXRlLgorICAgICAqCisgICAgICogXHRvZG8gc2hvdWxkIHRoaXMgcmV0dXJuIGNvbXBsZXRlZCB3b3JrLCBzaW5jZSBjbGllbnQgd2lsbCBqdXN0IGZyZWUgaXQ/IEFsc28sIGlmIGl0IHVuYmxvY2tzCisgICAgICogYSBzdG9wLCB3aGVyZSBzaG91bGQgY29tcGxldGVkIHdvcmsgYmUgcmV0dXJuZWQ/CisgICAgICoKKyAgICAgKiBUaGlzIGJyaW5ncyBzZXR0aW5ncyBiYWNrIHRvIHRoZWlyIGRlZmF1bHQgLSAiZ3VhcmFudGVlaW5nIiBubyB0cmlwcGVkIHNwYWNlLgorICAgICAqCisgICAgICogXHRvZG8gcmVjbGFpbSBzdXBwb3J0IC0gaXQgc2VlbXMgdGhhdCBzaW5jZSBvd25lcnNoaXAgaXMgcGFzc2VkLCB0aGlzIHdpbGwgYWxsb3cgcmVjbGFpbWluZworICAgICAqIHN0dWZmLgorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIGNvbXBvbmVudCBoYXMgYmVlbiByZXNldAorICAgICAqIFxyZXR2YWwgQzJfRFVQTElDQVRFIHdoZW4gY2FsbGVkIGR1cmluZyBhbm90aGVyIHJlc2V0IGNhbGwgZnJvbSBhbm90aGVyIHRocmVhZAorICAgICAqIFxyZXR2YWwgQzJfQkFEX1NUQVRFIHdoZW4gY2FsbGVkIGluIHRoZSByZWxlYXNlZCBzdGF0ZQorICAgICAqIFxyZXR2YWwgQzJfVElNRURfT1VUIHRoZSBjb21wb25lbnQgY291bGQgbm90IGJlIHJlc2V0IHdpdGhpbiB0aGUgdGltZSBsaW1pdCAodW5leHBlY3RlZCkKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24gZXJyb3IgcHJldmVudGVkIHJlc2V0dGluZyB0aGUgY29tcG9uZW50ICh1bmV4cGVjdGVkKQorICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcmVzZXQoKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZWxlYXNlcyB0aGUgY29tcG9uZW50LgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSBzdXBwb3J0ZWQgaW4gc3RvcHBlZCBzdGF0ZS4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgcmV0dXJuIHdpdGhpbmcgNTAwbXMuIFVwb24gcmV0dXJuIGFsbCByZWZlcmVuY2VzIHNoYWxsIGJlIGFiYW5kb25lZC4KKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBjb21wb25lbnQgaGFzIGJlZW4gcmVsZWFzZWQKKyAgICAgKiBccmV0dmFsIEMyX0RVUExJQ0FURSB0aGUgY29tcG9uZW50IGlzIGFscmVhZHkgcmVsZWFzZWQKKyAgICAgKiBccmV0dmFsIEMyX0JBRF9TVEFURSB0aGUgY29tcG9uZW50IGlzIHJ1bm5pbmcKKyAgICAgKiBccmV0dmFsIEMyX1RJTUVEX09VVCB0aGUgY29tcG9uZW50IGNvdWxkIG5vdCBiZSByZWxlYXNlZCB3aXRoaW4gdGhlIHRpbWUgbGltaXQgKHVuZXhwZWN0ZWQpCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duIGVycm9yIHByZXZlbnRlZCByZWxlYXNpbmcgdGhlIGNvbXBvbmVudCAodW5leHBlY3RlZCkKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHJlbGVhc2UoKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBpbnRlcmZhY2UgZm9yIHRoaXMgY29tcG9uZW50LgorICAgICAqCisgICAgICogXHJldHVybiB0aGUgY29tcG9uZW50IGludGVyZmFjZQorICAgICAqLworICAgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiBpbnRmKCkgPSAwOworCisgICAgdmlydHVhbCB+QzJDb21wb25lbnQoKSA9IGRlZmF1bHQ7Cit9OworCitDMkVOVU0oQzJDb21wb25lbnQ6OmtpbmRfdCwgdWludDMyX3QsCisgICAgS0lORF9PVEhFUiwKKyAgICBLSU5EX0RFQ09ERVIsCisgICAgS0lORF9FTkNPREVSCispOworCitDMkVOVU0oQzJDb21wb25lbnQ6OmRvbWFpbl90LCB1aW50MzJfdCwKKyAgICBET01BSU5fT1RIRVIsCisgICAgRE9NQUlOX1ZJREVPLAorICAgIERPTUFJTl9BVURJTywKKyAgICBET01BSU5fSU1BR0UKKyk7CisKK2NsYXNzIEMyRnJhbWVJbmZvUGFyc2VyIHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBccmV0dXJuIHRoZSBjb250ZW50IHR5cGUgc3VwcG9ydGVkIGJ5IHRoaXMgaW5mbyBwYXJzZXIuCisgICAgICoKKyAgICAgKiBcdG9kbyB0aGlzIG1heSBiZSByZWR1bmRhbnQKKyAgICAgKi8KKyAgICB2aXJ0dWFsIEMyU3RyaW5nTGl0ZXJhbCBnZXRUeXBlKCkgY29uc3QgPSAwOworCisgICAgLyoqCisgICAgICogXHJldHVybiBhIHZlY3RvciBvZiBzdXBwb3J0ZWQgcGFyYW1ldGVyIGluZGljZXMgcGFyc2VkIGJ5IHRoaXMgaW5mbyBwYXJzZXIuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIGJlICJub24tYmxvY2tpbmciIGFuZCByZXR1cm4gd2l0aGluIDFtcy4KKyAgICAgKgorICAgICAqIFx0b2RvIHN0aWNreSB2cy4gbm9uLXN0aWNreSBwYXJhbXM/IHRoaXMgbWF5IGJlIGNvbW11bmljYXRlZCBieSBwYXJhbS1yZWZsZWN0b3IuCisgICAgICovCisgICAgdmlydHVhbCBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gZ2V0UGFyc2VkUGFyYW1zKCkgY29uc3QgPSAwOworCisgICAgLyoqCisgICAgICogUmVzZXRzIHRoaXMgaW5mbyBwYXJzZXIuIFRoaXMgYnJpbmdzIHRoaXMgcGFyc2VyIHRvIGl0cyBpbml0aWFsIHN0YXRlIGFmdGVyIGNyZWF0aW9uLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgU0hBTEwgcmV0dXJuIHdpdGhpbiA1bXMuCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgaW5mbyBwYXJzZXIgd2FzIHJlc2V0CisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgY291bGQgbm90IHJlc2V0IHRoZSBwYXJzZXIgd2l0aGluIHRoZSB0aW1lIGxpbWl0ICh1bmV4cGVjdGVkKQorICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgdGhlIHJlc2V0dGluZyBvZiB0aGUgcGFyc2VyICh1bmV4cGVjdGVkKQorICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcmVzZXQoKSB7IHJldHVybiBDMl9PSzsgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBwYXJzZUZyYW1lKEMyRnJhbWVEYXRhICZmcmFtZSk7CisKKyAgICB2aXJ0dWFsIH5DMkZyYW1lSW5mb1BhcnNlcigpID0gZGVmYXVsdDsKK307CisKK2NsYXNzIEMyQWxsb2NhdG9yU3RvcmUgeworcHVibGljOgorICAgIHR5cGVkZWYgQzJBbGxvY2F0b3I6OmlkX3QgaWRfdDsKKworICAgIGVudW0gOiBDMkFsbG9jYXRvcjo6aWRfdCB7CisgICAgICAgIERFRkFVTFRfTElORUFSLCAgICAgLy8vPCBiYXNpYyBsaW5lYXIgYWxsb2NhdG9yIHR5cGUKKyAgICAgICAgREVGQVVMVF9HUkFQSElDLCAgICAvLy88IGJhc2ljIGdyYXBoaWMgYWxsb2NhdG9yIHR5cGUKKyAgICAgICAgUExBVEZPUk1fU1RBUlQgPSAweDEwLAorICAgICAgICBWRU5ET1JfU1RBUlQgICA9IDB4MTAwLAorICAgICAgICBCQURfSUQgICAgICAgICA9IEMyQWxsb2NhdG9yOjpCQURfSUQsIC8vLzwgRE8gTk9UIFVTRQorICAgIH07CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB1bmlxdWUgbmFtZSBvZiB0aGlzIGFsbG9jYXRvciBzdG9yZS4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgYmUgIm5vbi1ibG9ja2luZyIgYW5kIHJldHVybiB3aXRoaW4gMW1zLgorICAgICAqCisgICAgICogXHJldHVybiB0aGUgbmFtZSBvZiB0aGlzIGFsbG9jYXRvciBzdG9yZS4KKyAgICAgKiBccmV0dmFsIGFuIGVtcHR5IHN0cmluZyBpZiB0aGVyZSB3YXMgbm90IGVub3VnaCBtZW1vcnkgdG8gYWxsb2NhdGUgdGhlIGFjdHVhbCBuYW1lLgorICAgICAqLworICAgIHZpcnR1YWwgQzJTdHJpbmcgZ2V0TmFtZSgpIGNvbnN0ID0gMDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHNldCBvZiBhbGxvY2F0b3JzIHN1cHBvcnRlZCBieSB0aGlzIGFsbG9jYXRvciBzdG9yZS4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgYmUgIm5vbi1ibG9ja2luZyIgYW5kIHJldHVybiB3aXRoaW4gMW1zLgorICAgICAqCisgICAgICogXHJldHZhbCB2ZWN0b3Igb2YgYWxsb2NhdG9yIGluZm9ybWF0aW9uIChhcyBzaGFyZWQgcG9pbnRlcnMpCisgICAgICogXHJldHZhbCBhbiBlbXB0eSB2ZWN0b3IgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2ggbWVtb3J5IHRvIGFsbG9jYXRlIHRoZSB3aG9sZSB2ZWN0b3IuCisgICAgICovCisgICAgdmlydHVhbCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJBbGxvY2F0b3I6OlRyYWl0cz4+IGxpc3RBbGxvY2F0b3JzX25iKCkgY29uc3QgPSAwOworCisgICAgLyoqCisgICAgICogUmV0cmlldmVzL2NyZWF0ZXMgYSBzaGFyZWQgYWxsb2NhdG9yIG9iamVjdC4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgYmUgcmV0dXJuIHdpdGhpbiA1bXMuCisgICAgICoKKyAgICAgKiBUaGUgYWxsb2NhdG9yIGlzIGNyZWF0ZWQgb24gZmlyc3QgdXNlLCBhbmQgdGhlIHNhbWUgYWxsb2NhdG9yIGlzIHJldHVybmVkIG9uIHN1YnNlcXVlbnQKKyAgICAgKiBjb25jdXJyZW50IHVzZXMgaW4gdGhlIHNhbWUgcHJvY2Vzcy4gVGhlIGFsbG9jYXRvciBpcyBmcmVlZCB3aGVuIGl0IGlzIG5vIGxvbmdlciByZWZlcmVuY2VkLgorICAgICAqCisgICAgICogXHBhcmFtIGlkICAgICAgdGhlIElEIG9mIHRoZSBhbGxvY2F0b3IgdG8gY3JlYXRlLiBUaGlzIGlzIGRlZmluZWQgYnkgdGhlIHN0b3JlLCBidXQKKyAgICAgKiAgICAgICAgICAgICAgICB0aGUgSUQgb2YgdGhlIGRlZmF1bHQgbGluZWFyIGFuZCBncmFwaGljIGFsbG9jYXRvcnMgaXMgZm9ybWFsaXplZC4KKyAgICAgKiBccGFyYW0gYWxsb2NhdG9yIHNoYXJlZCBwb2ludGVyIHdoZXJlIHRoZSBjcmVhdGVkIGFsbG9jYXRvciBpcyBzdG9yZWQuIENsZWFyZWQgb24gZmFpbHVyZQorICAgICAqICAgICAgICAgICAgICAgICAgYW5kIHVwZGF0ZWQgb24gc3VjY2Vzcy4KKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBhbGxvY2F0b3Igd2FzIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5CisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgY291bGQgbm90IGNyZWF0ZSB0aGUgYWxsb2NhdG9yIHdpdGhpbiB0aGUgdGltZSBsaW1pdCAodW5leHBlY3RlZCkKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24gZXJyb3IgcHJldmVudGVkIHRoZSBjcmVhdGlvbiBvZiB0aGUgYWxsb2NhdG9yICh1bmV4cGVjdGVkKQorICAgICAqCisgICAgICogXHJldHZhbCBDMl9OT1RfRk9VTkQgbm8gc3VjaCBhbGxvY2F0b3IKKyAgICAgKiBccmV0dmFsIEMyX05PX01FTU9SWSBub3QgZW5vdWdoIG1lbW9yeSB0byBjcmVhdGUgdGhlIGFsbG9jYXRvcgorICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgZmV0Y2hBbGxvY2F0b3IoaWRfdCBpZCwgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiogY29uc3QgYWxsb2NhdG9yKSA9IDA7CisKKyAgICB2aXJ0dWFsIH5DMkFsbG9jYXRvclN0b3JlKCkgPSBkZWZhdWx0OworfTsKKworY2xhc3MgQzJDb21wb25lbnRTdG9yZSB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGlzIGNvbXBvbmVudCBvciBjb21wb25lbnQgaW50ZXJmYWNlIG9iamVjdC4KKyAgICAgKiBUaGlzIGlzIGEgdW5pcXVlIG5hbWUgZm9yIHRoaXMgY29tcG9uZW50IG9yIGNvbXBvbmVudCBpbnRlcmZhY2UgJ2NsYXNzJzsgaG93ZXZlciwgbXVsdGlwbGUKKyAgICAgKiBpbnN0YW5jZXMgb2YgdGhpcyBjb21wb25lbnQgU0hBTEwgaGF2ZSB0aGUgc2FtZSBuYW1lLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSBzdXBwb3J0ZWQgaW4gYW55IHN0YXRlLiBUaGlzIGNhbGwgZG9lcyBub3QgY2hhbmdlIHRoZSBzdGF0ZSBub3IgdGhlCisgICAgICogaW50ZXJuYWwgc3RhdGVzIG9mIHRoZSBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIGJlICJub24tYmxvY2tpbmciIGFuZCByZXR1cm4gd2l0aGluIDFtcy4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gdGhlIG5hbWUgb2YgdGhpcyBjb21wb25lbnQgb3IgY29tcG9uZW50IGludGVyZmFjZSBvYmplY3QuCisgICAgICogXHJldHZhbCBhbiBlbXB0eSBzdHJpbmcgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2ggbWVtb3J5IHRvIGFsbG9jYXRlIHRoZSBhY3R1YWwgbmFtZS4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIEMyU3RyaW5nIGdldE5hbWUoKSBjb25zdCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgY29tcG9uZW50LgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgU0hBTEwgcmV0dXJuIHdpdGhpbiAxMDBtcy4KKyAgICAgKgorICAgICAqIFxwYXJhbSBuYW1lICAgICAgICAgIG5hbWUgb2YgdGhlIGNvbXBvbmVudCB0byBjcmVhdGUKKyAgICAgKiBccGFyYW0gY29tcG9uZW50ICAgICBzaGFyZWQgcG9pbnRlciB3aGVyZSB0aGUgY3JlYXRlZCBjb21wb25lbnQgaXMgc3RvcmVkLiBDbGVhcmVkIG9uCisgICAgICogICAgICAgICAgICAgICAgICAgICAgZmFpbHVyZSBhbmQgdXBkYXRlZCBvbiBzdWNjZXNzLgorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIGNvbXBvbmVudCB3YXMgY3JlYXRlZCBzdWNjZXNzZnVsbHkKKyAgICAgKiBccmV0dmFsIEMyX1RJTUVEX09VVCBjb3VsZCBub3QgY3JlYXRlIHRoZSBjb21wb25lbnQgd2l0aGluIHRoZSB0aW1lIGxpbWl0ICh1bmV4cGVjdGVkKQorICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgdGhlIGNyZWF0aW9uIG9mIHRoZSBjb21wb25lbnQgKHVuZXhwZWN0ZWQpCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX05PVF9GT1VORCBubyBzdWNoIGNvbXBvbmVudAorICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIG5vdCBlbm91Z2ggbWVtb3J5IHRvIGNyZWF0ZSB0aGUgY29tcG9uZW50CisgICAgICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVDb21wb25lbnQoCisgICAgICAgICAgICBDMlN0cmluZyBuYW1lLCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KiBjb25zdCBjb21wb25lbnQpID0gMDsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBjb21wb25lbnQgaW50ZXJmYWNlLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgU0hBTEwgcmV0dXJuIHdpdGhpbiAxMDBtcy4KKyAgICAgKgorICAgICAqIFxwYXJhbSBuYW1lICAgICAgICAgIG5hbWUgb2YgdGhlIGNvbXBvbmVudCBpbnRlcmZhY2UgdG8gY3JlYXRlCisgICAgICogXHBhcmFtIGludGVyZmFjZSAgICAgc2hhcmVkIHBvaW50ZXIgd2hlcmUgdGhlIGNyZWF0ZWQgaW50ZXJmYWNlIGlzIHN0b3JlZAorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIGNvbXBvbmVudCBpbnRlcmZhY2Ugd2FzIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5CisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgY291bGQgbm90IGNyZWF0ZSB0aGUgY29tcG9uZW50IGludGVyZmFjZSB3aXRoaW4gdGhlIHRpbWUgbGltaXQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAodW5leHBlY3RlZCkKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24gZXJyb3IgcHJldmVudGVkIHRoZSBjcmVhdGlvbiBvZiB0aGUgY29tcG9uZW50IGludGVyZmFjZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICh1bmV4cGVjdGVkKQorICAgICAqCisgICAgICogXHJldHZhbCBDMl9OT1RfRk9VTkQgbm8gc3VjaCBjb21wb25lbnQgaW50ZXJmYWNlCisgICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgbm90IGVub3VnaCBtZW1vcnkgdG8gY3JlYXRlIHRoZSBjb21wb25lbnQgaW50ZXJmYWNlCisgICAgICoKKyAgICAgKiBcdG9kbyBEbyB3ZSBuZWVkIGFuIGludGVyZmFjZSwgb3IgY291bGQgdGhpcyBqdXN0IGJlIGEgY29tcG9uZW50IHRoYXQgaXMgbmV2ZXIgc3RhcnRlZD8KKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgICAgIEMyU3RyaW5nIG5hbWUsIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4qIGNvbnN0IGludGVyZmFjZSkgPSAwOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbGlzdCBvZiBjb21wb25lbnRzIHN1cHBvcnRlZCBieSB0aGlzIGNvbXBvbmVudCBzdG9yZS4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgcmV0dXJuIHdpdGhpbiA1MDBtcy4KKyAgICAgKgorICAgICAqIFxyZXR2YWwgdmVjdG9yIG9mIGNvbXBvbmVudCBpbmZvcm1hdGlvbi4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkNvbXBvbmVudDo6VHJhaXRzPj4gbGlzdENvbXBvbmVudHMoKSA9IDA7CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBVVElMSVRZIE1FVEhPRFMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIC8vIG9uLWRlbWFuZCBidWZmZXIgbGF5b3V0IGNvbnZlcnNpb24gKHN3aXp6bGluZykKKyAgICAvLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY29weUJ1ZmZlcigKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCdWZmZXI+IHNyYywgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0J1ZmZlcj4gZHN0KSA9IDA7CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDT05GSUdVUkFUSU9OIEFQSSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vIGUuZy4gZm9yIGdsb2JhbCBzZXR0aW5ncyAoc3lzdGVtLXdpZGUgc3RyaWRlLCBldGMuKQorCisgICAgLyoqCisgICAgICogUXVlcmllcyBhIHNldCBvZiBzeXN0ZW0td2lkZSBwYXJhbWV0ZXJzLgorICAgICAqIFF1ZXJ5aW5nIGlzIHBlcmZvcm1lZCBhdCBiZXN0IGVmZm9ydDogdGhlIHN0b3JlIFNIQUxMIHF1ZXJ5IGFsbCBzdXBwb3J0ZWQgcGFyYW1ldGVycyBhbmQKKyAgICAgKiBza2lwIHVuc3VwcG9ydGVkIG9uZXMsIG9yIGhlYXAgYWxsb2NhdGVkIHBhcmFtZXRlcnMgdGhhdCBjb3VsZCBub3QgYmUgYWxsb2NhdGVkLiBBbnkgZXJyb3JzCisgICAgICogYXJlIGNvbW11bmljYXRlZCBpbiB0aGUgcmV0dXJuIHZhbHVlLiBBZGRpdGlvbmFsbHksIHByZWFsbG9jYXRlZCAoZS5nLiBzdGFjaykgcGFyYW1ldGVycyB0aGF0CisgICAgICogY291bGQgbm90IGJlIHF1ZXJpZWQgYXJlIGludmFsaWRhdGVkLiBQYXJhbWV0ZXJzIHRvIGJlIGFsbG9jYXRlZCBvbiB0aGUgaGVhcCBhcmUgb21pdHRlZCBmcm9tCisgICAgICogdGhlIHJlc3VsdC4KKyAgICAgKgorICAgICAqIFxub3RlIFBhcmFtZXRlciB2YWx1ZXMgZG8gbm90IGRlcGVuZCBvbiB0aGUgb3JkZXIgb2YgcXVlcnkuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBtYXkgYmUgbW9tZW50YXJpbHkgYmxvY2tpbmcsIGJ1dCBNVVNUIHJldHVybiB3aXRoaW4gNW1zLgorICAgICAqCisgICAgICogXHBhcmFtIHN0YWNrUGFyYW1zICAgYSBsaXN0IG9mIHBhcmFtcyBxdWVyaWVkLiBUaGVzZSBhcmUgaW5pdGlhbGl6ZWQgc3BlY2lmaWMgdG8gZWFjaAorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmc7IGUuZy4gc2l6ZSBhbmQgaW5kZXggYXJlIHNldCBhbmQgcmVzdCBvZiB0aGUgbWVtYmVycyBhcmUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBjbGVhcmVkLgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIE5PVEU6IEZsZXhpYmxlIHNldHRpbmdzIHRoYXQgYXJlIG9mIGluY29ycmVjdCBzaXplIHdpbGwgYmUgaW52YWxpZGF0ZWQuCisgICAgICogXHBhcmFtIGhlYXBQYXJhbUluZGljZXMgYSB2ZWN0b3Igb2YgcGFyYW0gaW5kaWNlcyBmb3IgcGFyYW1zIHRvIGJlIHF1ZXJpZWQgYW5kIHJldHVybmVkIG9uIHRoZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIGhlYXAuIFRoZXNlIHBhcmFtZXRlcnMgd2lsbCBiZSByZXR1cm5lZCBpbiBoZWFwUGFyYW1zLiBVbnN1cHBvcnRlZCBwYXJhbQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIGluZGljZXMgd2lsbCBiZSBpZ25vcmVkLgorICAgICAqIFxwYXJhbSBoZWFwUGFyYW1zICAgIGEgbGlzdCBvZiBwYXJhbXMgd2hlcmUgdG8gd2hpY2ggdGhlIHN1cHBvcnRlZCBoZWFwIHBhcmFtZXRlcnMgd2lsbCBiZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZGVkIGluIHRoZSBvcmRlciB0aGV5IGFwcGVhciBpbiBoZWFwUGFyYW1JbmRpY2VzLgorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgYWxsIHBhcmFtZXRlcnMgY291bGQgYmUgcXVlcmllZAorICAgICAqIFxyZXR2YWwgQzJfQkFEX0lOREVYIGFsbCBzdXBwb3J0ZWQgcGFyYW1ldGVycyBjb3VsZCBiZSBxdWVyaWVkLCBidXQgc29tZSBwYXJhbWV0ZXJzIHdlcmUgbm90CisgICAgICogICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydGVkCisgICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgY291bGQgbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgYSBzdXBwb3J0ZWQgcGFyYW1ldGVyCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duIGVycm9yIHByZXZlbnRlZCB0aGUgcXVlcnlpbmcgb2YgdGhlIHBhcmFtZXRlcnMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAodW5leHBlY3RlZCkKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXJ5X3NtKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gJnN0YWNrUGFyYW1zLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gJmhlYXBQYXJhbUluZGljZXMsCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4qIGNvbnN0IGhlYXBQYXJhbXMpIGNvbnN0ID0gMDsKKworICAgIC8qKgorICAgICAqIFNldHMgYSBzZXQgb2Ygc3lzdGVtLXdpZGUgcGFyYW1ldGVycy4KKyAgICAgKgorICAgICAqIFxub3RlIFRoZXJlIGFyZSBubyBzZXR0YWJsZSBzeXN0ZW0td2lkZSBwYXJhbWV0ZXJzIGRlZmluZWQgdGh1cyBmYXIsIGJ1dCBtYXkgYmUgYWRkZWQgaW4gdGhlCisgICAgICogZnV0dXJlLgorICAgICAqCisgICAgICogVHVuaW5nIGlzIHBlcmZvcm1lZCBhdCBiZXN0IGVmZm9ydDogdGhlIHN0b3JlIFNIQUxMIHVwZGF0ZSBhbGwgc3VwcG9ydGVkIGNvbmZpZ3VyYXRpb24gYXQKKyAgICAgKiBiZXN0IGVmZm9ydCAodW5sZXNzIGNvbmZpZ3VyZWQgb3RoZXJ3aXNlKSBhbmQgc2tpcCB1bnN1cHBvcnRlZCBvbmVzLiBBbnkgZXJyb3JzIGFyZQorICAgICAqIGNvbW11bmljYXRlZCBpbiB0aGUgcmV0dXJuIHZhbHVlIGFuZCBpbiB8ZmFpbHVyZXN8LgorICAgICAqCisgICAgICogXG5vdGUgUGFyYW1ldGVyIHR1bmluZyBET0VTIGRlcGVuZCBvbiB0aGUgb3JkZXIgb2YgdGhlIHR1bmluZyBwYXJhbWV0ZXJzLiBFLmcuIHNvbWUgcGFyYW1ldGVyCisgICAgICogdXBkYXRlIG1heSBhbGxvdyBzb21lIHN1YnNlcXVlbnQgcGFyYW1ldGVyIHVwZGF0ZS4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIG1heSBiZSBtb21lbnRhcmlseSBibG9ja2luZywgYnV0IE1VU1QgcmV0dXJuIHdpdGhpbiA1bXMuCisgICAgICoKKyAgICAgKiBccGFyYW0gcGFyYW1zICAgICAgICBhIGxpc3Qgb2YgcGFyYW1ldGVyIHVwZGF0ZXMuIFRoZXNlIHdpbGwgYmUgdXBkYXRlZCB0byB0aGUgYWN0dWFsCisgICAgICogICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyIHZhbHVlcyBhZnRlciB0aGUgdXBkYXRlcyAodGhpcyBpcyBiZWNhdXNlIHR1bmluZyBpcyBwZXJmb3JtZWQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBhdCBiZXN0IGVmZm9ydCkuCisgICAgICogICAgICAgICAgICAgICAgICAgICAgXHRvZG8gcGFyYW1zIHRoYXQgY291bGQgbm90IGJlIHVwZGF0ZWQgYXJlIG5vdCBtYXJrZWQgaGVyZSwgc28gYXJlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgY29uZnVzaW5nIC0gYXJlIHRoZXkgImV4aXN0aW5nIiB2YWx1ZXMgb3IgaW50ZW5kZWQgdG8gYmUgY29uZmlndXJlZAorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcz8KKyAgICAgKiBccGFyYW0gZmFpbHVyZXMgICAgICBhIGxpc3Qgb2YgcGFyYW1ldGVyIGZhaWx1cmVzCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICBhbGwgcGFyYW1ldGVycyBjb3VsZCBiZSB1cGRhdGVkIHN1Y2Nlc3NmdWxseQorICAgICAqIFxyZXR2YWwgQzJfQkFEX0lOREVYIGFsbCBzdXBwb3J0ZWQgcGFyYW1ldGVycyBjb3VsZCBiZSB1cGRhdGVkIHN1Y2Nlc3NmdWxseSwgYnV0IHNvbWUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzIHdlcmUgbm90IHN1cHBvcnRlZAorICAgICAqIFxyZXR2YWwgQzJfQkFEX1ZBTFVFIHNvbWUgc3VwcG9ydGVkIHBhcmFtZXRlcnMgY291bGQgbm90IGJlIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5IGJlY2F1c2UKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICB0aGV5IGNvbnRhaW5lZCB1bnN1cHBvcnRlZCB2YWx1ZXMuIFRoZXNlIGFyZSByZXR1cm5lZCBpbiB8ZmFpbHVyZXN8LgorICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIHNvbWUgc3VwcG9ydGVkIHBhcmFtZXRlcnMgY291bGQgbm90IGJlIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5IGJlY2F1c2UKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICB0aGV5IGNvbnRhaW5lZCB1bnN1cHBvcnRlZCB2YWx1ZXMsIGJ1dCBjb3VsZCBub3QgYWxsb2NhdGUgYSBmYWlsdXJlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgb2JqZWN0IGZvciB0aGVtLgorICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgdGhlIHVwZGF0ZSBvZiB0aGUgcGFyYW1ldGVycworICAgICAqICAgICAgICAgICAgICAgICAgICAgICh1bmV4cGVjdGVkKQorICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY29uZmlnX3NtKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+ICZwYXJhbXMsCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4qIGNvbnN0IGZhaWx1cmVzKSA9IDA7CisKKyAgICAvLyBSRUZMRUNUSU9OIE1FQ0hBTklTTSAoVVNFRCBGT1IgRVhURU5TSU9OKQorICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgcGFyYW1ldGVyIHJlZmxlY3Rvci4KKyAgICAgKgorICAgICAqIFRoaXMgaXMgdXNlZCB0byBkZXNjcmliZSBwYXJhbWV0ZXIgZmllbGRzLiBUaGlzIGlzIHNoYXJlZCBmb3IgYWxsIGNvbXBvbmVudHMgY3JlYXRlZCBieQorICAgICAqIHRoaXMgY29tcG9uZW50IHN0b3JlLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSAibm9uLWJsb2NraW5nIiBhbmQgcmV0dXJuIHdpdGhpbiAxbXMuCisgICAgICoKKyAgICAgKiBccmV0dXJuIGEgc2hhcmVkIHBhcmFtZXRlciByZWZsZWN0b3Igb2JqZWN0LgorICAgICAqLworICAgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+IGdldFBhcmFtUmVmbGVjdG9yKCkgY29uc3QgPSAwOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgc2V0IG9mIHN1cHBvcnRlZCBwYXJhbWV0ZXJzLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSAibm9uLWJsb2NraW5nIiBhbmQgcmV0dXJuIHdpdGhpbiAxbXMuCisgICAgICoKKyAgICAgKiBccGFyYW1bb3V0XSBwYXJhbXMgYSB2ZWN0b3Igb2Ygc3VwcG9ydGVkIHBhcmFtZXRlcnMgd2lsbCBiZSBhcHBlbmRlZCB0byB0aGlzIHZlY3Rvci4KKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBvcGVyYXRpb24gY29tcGxldGVkIHN1Y2Nlc3NmdWxseS4KKyAgICAgKiBccmV0dmFsIEMyX05PX01FTU9SWSBub3QgZW5vdWdoIG1lbW9yeSB0byBjb21wbGV0ZSB0aGlzIG1ldGhvZC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXJ5U3VwcG9ydGVkUGFyYW1zX25iKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4gKiBjb25zdCBwYXJhbXMpIGNvbnN0ID0gMDsKKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyB0aGUgc3VwcG9ydGVkIHZhbHVlcyBmb3IgdGhlIHF1ZXJpZWQgZmllbGRzLgorICAgICAqCisgICAgICogQ2xpZW50IFNIQUxMIHNldCB0aGUgcGFyYW1ldGVyLWZpZWxkIHNwZWNpZmllciBhbmQgdGhlIHR5cGUgb2Ygc3VwcG9ydGVkIHZhbHVlcyBxdWVyeSAoZS5nLgorICAgICAqIGN1cnJlbnRseSBzdXBwb3J0ZWQgdmFsdWVzLCBvciBwb3RlbnRpYWwgc3VwcG9ydGVkIHZhbHVlcykgaW4gZmllbGRzLgorICAgICAqIFVwb24gcmV0dXJuIHRoZSBzdG9yZSBTSEFMTCBmaWxsIGluIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIGZvciB0aGUgZmllbGRzIGxpc3RlZCBhcyB3ZWxsCisgICAgICogYXMgYSBzdGF0dXMgZm9yIGVhY2ggZmllbGQuIFN0b3JlIHNoYWxsIHByb2Nlc3MgYWxsIGZpZWxkcyBxdWVyaWVkIGV2ZW4gaWYgc29tZSBxdWVyaWVzCisgICAgICogZmFpbC4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIG1heSBiZSBtb21lbnRhcmlseSBibG9ja2luZywgYnV0IE1VU1QgcmV0dXJuIHdpdGhpbiA1bXMuCisgICAgICoKKyAgICAgKiBccGFyYW1baW4gb3V0XSBmaWVsZHMgYSB2ZWN0b3Igb2YgZmllbGRzIGRlc2NyaXB0b3Igc3RydWN0dXJlcy4KKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBvcGVyYXRpb24gY29tcGxldGVkIHN1Y2Nlc3NmdWxseS4KKyAgICAgKiBccmV0dmFsIEMyX0JBRF9JTkRFWCBhdCBsZWFzdCBvbmUgZmllbGQgd2FzIG5vdCByZWNvZ25pemVkIGFzIGEgY29tcG9uZW50IHN0b3JlIGZpZWxkCisgICAgICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeVN1cHBvcnRlZFZhbHVlc19zbSgKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeT4gJmZpZWxkcykgY29uc3QgPSAwOworCisgICAgdmlydHVhbCB+QzJDb21wb25lbnRTdG9yZSgpID0gZGVmYXVsdDsKK307CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvLy8gQH0KKworI2VuZGlmICAvLyBDMkNPTVBPTkVOVF9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2luY2x1ZGUvQzJDb25maWcuaCBiL21lZGlhL2NvZGVjMi9pbmNsdWRlL0MyQ29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk5YWRlNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9pbmNsdWRlL0MyQ29uZmlnLmgKQEAgLTAsMCArMSwyMTc5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDMkNPTkZJR19IXworI2RlZmluZSBDMkNPTkZJR19IXworCisjaW5jbHVkZSA8QzIuaD4KKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorI2luY2x1ZGUgPEMyRW51bS5oPgorI2luY2x1ZGUgPEMyUGFyYW1EZWYuaD4KKworLy8vIFxkZWZncm91cCBjb25maWcgQ29tcG9uZW50IGNvbmZpZ3VyYXRpb24KKy8vLyBAeworCisvKioKKyAqIEVudW1lcmF0ZWQgYm9vbGVhbi4KKyAqLworQzJFTlVNKGMyX2Jvb2xfdCwgdWludDMyX3QsCisgICAgQzJfRkFMU0UsIC8vLzwgdHJ1ZQorICAgIEMyX1RSVUUsICAvLy88IGZhbHNlCispCisKK3R5cGVkZWYgQzJTaW1wbGVWYWx1ZVN0cnVjdDxjMl9ib29sX3Q+IEMyQm9vbFZhbHVlOworCit0eXBlZGVmIEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8QzJFYXN5RW51bTxjMl9ib29sX3Q+PiBDMkVhc3lCb29sVmFsdWU7CisKKy8qKgorICogRW51bWVyYXRlZCBzZXQgdHJpLXN0YXRlLgorICoKKyAqIFVzZWQgZm9yIG9wdGlvbmFsIGNvbmZpZ3VyYXRpb25zIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gdmFsdWVzIHNldCBieSB0aGUgY2xpZW50LAorICogZGVmYXVsdCB2YWx1ZXMgc2V0IGJ5IHRoZSBjb21wb25lbnQsIG9yIHVuc2V0IHZhbHVlcy4KKyAqLworQzJFTlVNKGMyX3NldF90LCB1aW50MzJfdCwKKyAgICBDMl9VTlNFVCwgICAvLyBwYXJhbWV0ZXIgaXMgdW5zZXQgYW5kIGhhcyBubyB2YWx1ZQorICAgIEMyX1NFVCwgICAgIC8vIHBhcmFtZXRlciBpcy9oYXMgYmVlbiBzZXQgYnkgdGhlIGNsaWVudAorICAgIEMyX0RFRkFVTFQsIC8vIHBhcmFtZXRlciBoYXMgbm90IGJlZW4gc2V0IGJ5IHRoZSBjbGllbnQsIGJ1dCBpcyBzZXQgYnkgdGhlIGNvbXBvbmVudAorKQorCisvKiogRW51bWVyYXRpb25zIHVzZWQgYnkgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzICovCitzdHJ1Y3QgQzJDb25maWcgeworICAgIGVudW0gYWFjX3BhY2thZ2luZ190IDogdWludDMyX3Q7ICAgICAgICAvLy88IEFBQyBwYWNrYWdpbmcgKFJBVyB2cyBBRFRTKQorICAgIGVudW0gYWFjX3Nicl9tb2RlX3QgOiB1aW50MzJfdDsgICAgICAgICAvLy88IEFBQyBTQlIgbW9kZQorICAgIGVudW0gYXBpX2ZlYXR1cmVfdCA6IHVpbnQ2NF90OyAgICAgICAgICAvLy88IEFQSSBmZWF0dXJlcworICAgIGVudW0gYXBpX2xldmVsX3QgOiB1aW50MzJfdDsgICAgICAgICAgICAvLy88IEFQSSBsZXZlbAorICAgIGVudW0gYml0cmF0ZV9tb2RlX3QgOiB1aW50MzJfdDsgICAgICAgICAvLy88IGJpdHJhdGUgY29udHJvbCBtb2RlCisgICAgZW51bSBkcmNfY29tcHJlc3Npb25fbW9kZV90IDogaW50MzJfdDsgIC8vLzwgRFJDIGNvbXByZXNzaW9uIG1vZGUKKyAgICBlbnVtIGRyY19lZmZlY3RfdHlwZV90IDogaW50MzJfdDsgICAgICAgLy8vPCBEUkMgZWZmZWN0IHR5cGUKKyAgICBlbnVtIGludHJhX3JlZnJlc2hfbW9kZV90IDogdWludDMyX3Q7ICAgLy8vPCBpbnRyYSByZWZyZXNoIG1vZGVzCisgICAgZW51bSBsZXZlbF90IDogdWludDMyX3Q7ICAgICAgICAgICAgICAgIC8vLzwgY29kaW5nIGxldmVsCisgICAgZW51bSBvcmRpbmFsX2tleV90IDogdWludDMyX3Q7ICAgICAgICAgIC8vLzwgd29yayBvcmRlcmluZyBrZXlzCisgICAgZW51bSBwY21fZW5jb2RpbmdfdCA6IHVpbnQzMl90OyAgICAgICAgIC8vLzwgUENNIGVuY29kaW5nCisgICAgZW51bSBwaWN0dXJlX3R5cGVfdCA6IHVpbnQzMl90OyAgICAgICAgIC8vLzwgcGljdHVyZSB0eXBlcworICAgIGVudW0gcGxhdGZvcm1fZmVhdHVyZV90IDogdWludDY0X3Q7ICAgICAvLy88IHBsYXRmb3JtIGZlYXR1cmVzCisgICAgZW51bSBwbGF0Zm9ybV9sZXZlbF90IDogdWludDMyX3Q7ICAgICAgIC8vLzwgcGxhdGZvcm0gbGV2ZWwKKyAgICBlbnVtIHByZXBlbmRfaGVhZGVyX21vZGVfdCA6IHVpbnQzMl90OyAgLy8vPCBwcmVwZW5kIGhlYWRlciBvcGVyYXRpb25hbCBtb2RlcworICAgIGVudW0gcHJvZmlsZV90IDogdWludDMyX3Q7ICAgICAgICAgICAgICAvLy88IGNvZGluZyBwcm9maWxlCisgICAgZW51bSBzY2FsaW5nX21ldGhvZF90IDogdWludDMyX3Q7ICAgICAgIC8vLzwgc2NhbGluZyBtZXRob2RzCisgICAgZW51bSBzY2FuX29yZGVyX3QgOiB1aW50MzJfdDsgICAgICAgICAgIC8vLzwgc2NhbiBvcmRlcnMKKyAgICBlbnVtIHNlY3VyZV9tb2RlX3QgOiB1aW50MzJfdDsgICAgICAgICAgLy8vPCBzZWN1cmUvcHJvdGVjdGVkIG1vZGVzCisgICAgZW51bSBzdXBwbGVtZW50YWxfaW5mb190IDogdWludDMyX3Q7ICAgIC8vLzwgc3VwcGxlbWVudGFsIGluZm9ybWF0aW9uIHR5cGVzCisgICAgZW51bSB0aWxpbmdfbW9kZV90IDogdWludDMyX3Q7ICAgICAgICAgIC8vLzwgdGlsaW5nIG1vZGVzCit9OworCituYW1lc3BhY2UgeworCitlbnVtIEMyUGFyYW1JbmRleEtpbmQgOiBDMlBhcmFtOjp0eXBlX2luZGV4X3QgeworICAgIEMyX1BBUkFNX0lOREVYX0lOVkFMSUQgICAgICAgICAgICAgPSAweDAsICAgIC8vLzwgZG8gbm90IHVzZQorICAgIEMyX1BBUkFNX0lOREVYX1NUUlVDVF9TVEFSVCAgICAgICAgPSAweDEsICAgIC8vLzwgc3RydWN0IG9ubHkgaW5kaWNlcworICAgIEMyX1BBUkFNX0lOREVYX1BBUkFNX1NUQVJUICAgICAgICAgPSAweDgwMCwgIC8vLzwgcmVndWxhciBwYXJhbWV0ZXJzCisgICAgQzJfUEFSQU1fSU5ERVhfQ09ERVJfUEFSQU1fU1RBUlQgICA9IDB4MTAwMCwgLy8vPCBlbi90cmFuc2NvZGVyIHBhcmFtZXRlcnMKKyAgICBDMl9QQVJBTV9JTkRFWF9QSUNUVVJFX1BBUkFNX1NUQVJUID0gMHgxODAwLCAvLy88IGltYWdlL3ZpZGVvIHBhcmFtZXRlcnMKKyAgICBDMl9QQVJBTV9JTkRFWF9WSURFT19QQVJBTV9TVEFSVCAgID0gMHgyMDAwLCAvLy88IHZpZGVvIHBhcmFtZXRlcnMKKyAgICBDMl9QQVJBTV9JTkRFWF9JTUFHRV9QQVJBTV9TVEFSVCAgID0gMHgyODAwLCAvLy88IGltYWdlIHBhcmFtZXRlcnMKKyAgICBDMl9QQVJBTV9JTkRFWF9BVURJT19QQVJBTV9TVEFSVCAgID0gMHgzMDAwLCAvLy88IGltYWdlIHBhcmFtZXRlcnMKKyAgICBDMl9QQVJBTV9JTkRFWF9QTEFURk9STV9TVEFSVCAgICAgID0gMHg0MDAwLCAvLy88IHBsYXRmb3JtLWRlZmluZWQgcGFyYW1ldGVycworCisgICAgLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gc3RydWN0dXJlIGluZGljZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworICAgIGtQYXJhbUluZGV4Q29sb3JYeSA9IEMyX1BBUkFNX0lOREVYX1NUUlVDVF9TVEFSVCwKKyAgICBrUGFyYW1JbmRleE1hc3RlcmluZ0Rpc3BsYXlDb2xvclZvbHVtZSwKKyAgICBrUGFyYW1JbmRleENocm9tYU9mZnNldCwKKyAgICBrUGFyYW1JbmRleEdvcExheWVyLAorCisgICAgLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gcGFyYW1ldGVyIGluZGljZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworICAgIGtQYXJhbUluZGV4QXBpTGV2ZWwgPSBDMl9QQVJBTV9JTkRFWF9QQVJBTV9TVEFSVCwKKyAgICBrUGFyYW1JbmRleEFwaUZlYXR1cmVzLAorCisgICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGFsbCBjb21wb25lbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisgICAgLyogZ2VuZXJpYyBjb21wb25lbnQgY2hhcmFjdGVyaXN0aWNzICovCisgICAga1BhcmFtSW5kZXhOYW1lLAorICAgIGtQYXJhbUluZGV4QWxpYXNlcywKKyAgICBrUGFyYW1JbmRleEtpbmQsCisgICAga1BhcmFtSW5kZXhEb21haW4sCisgICAga1BhcmFtSW5kZXhBdHRyaWJ1dGVzLAorICAgIGtQYXJhbUluZGV4VGltZVN0cmV0Y2gsCisKKyAgICAvKiBjb2RpbmcgY2hhcmFjdGVyaXN0aWNzICovCisgICAga1BhcmFtSW5kZXhQcm9maWxlTGV2ZWwsCisgICAga1BhcmFtSW5kZXhJbml0RGF0YSwKKyAgICBrUGFyYW1JbmRleFN1cHBsZW1lbnRhbERhdGEsCisgICAga1BhcmFtSW5kZXhTdWJzY3JpYmVkU3VwcGxlbWVudGFsRGF0YSwKKworICAgIC8qIHBpcGVsaW5lIGNoYXJhY3RlcmlzdGljcyAqLworICAgIGtQYXJhbUluZGV4TWVkaWFUeXBlLAorICAgIGtQYXJhbUluZGV4RGVsYXlSZXF1ZXN0LAorICAgIGtQYXJhbUluZGV4RGVsYXksCisgICAga1BhcmFtSW5kZXhNYXhSZWZlcmVuY2VBZ2UsCisgICAga1BhcmFtSW5kZXhNYXhSZWZlcmVuY2VDb3VudCwKKyAgICBrUGFyYW1JbmRleFJlb3JkZXJCdWZmZXJEZXB0aCwKKyAgICBrUGFyYW1JbmRleFJlb3JkZXJLZXksCisgICAga1BhcmFtSW5kZXhTdHJlYW1Db3VudCwKKyAgICBrUGFyYW1JbmRleFN1YnNjcmliZWRQYXJhbUluZGljZXMsCisgICAga1BhcmFtSW5kZXhTdWdnZXN0ZWRCdWZmZXJDb3VudCwKKyAgICBrUGFyYW1JbmRleEJhdGNoU2l6ZSwKKyAgICBrUGFyYW1JbmRleEN1cnJlbnRXb3JrLAorICAgIGtQYXJhbUluZGV4TGFzdFdvcmtRdWV1ZWQsCisKKyAgICAvKiBtZW1vcnkgYWxsb2NhdGlvbiAqLworICAgIGtQYXJhbUluZGV4QWxsb2NhdG9ycywKKyAgICBrUGFyYW1JbmRleEJsb2NrUG9vbHMsCisgICAga1BhcmFtSW5kZXhCdWZmZXJUeXBlLAorICAgIGtQYXJhbUluZGV4VXNhZ2UsCisgICAga1BhcmFtSW5kZXhPdXRPZk1lbW9yeSwKKyAgICBrUGFyYW1JbmRleE1heEJ1ZmZlclNpemUsCisKKyAgICAvKiBtaXNjLiBzdGF0ZSAqLworICAgIGtQYXJhbUluZGV4VHJpcHBlZCwKKyAgICBrUGFyYW1JbmRleENvbmZpZ0NvdW50ZXIsCisKKyAgICAvKiByZXNvdXJjZXMgKi8KKyAgICBrUGFyYW1JbmRleFJlc291cmNlc05lZWRlZCwKKyAgICBrUGFyYW1JbmRleFJlc291cmNlc1Jlc2VydmVkLAorICAgIGtQYXJhbUluZGV4T3BlcmF0aW5nUmF0ZSwKKyAgICBrUGFyYW1JbmRleFJlYWxUaW1lUHJpb3JpdHksCisKKyAgICAvKiBwcm90ZWN0ZWQgY29udGVudCAqLworICAgIGtQYXJhbUluZGV4U2VjdXJlTW9kZSwKKworICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAodHJhbnMvZW4pY29kZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisgICAga1BhcmFtSW5kZXhCaXRyYXRlID0gQzJfUEFSQU1fSU5ERVhfQ09ERVJfUEFSQU1fU1RBUlQsCisgICAga1BhcmFtSW5kZXhCaXRyYXRlTW9kZSwKKyAgICBrUGFyYW1JbmRleFF1YWxpdHksCisgICAga1BhcmFtSW5kZXhDb21wbGV4aXR5LAorICAgIGtQYXJhbUluZGV4UHJlcGVuZEhlYWRlck1vZGUsCisKKyAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gaW1hZ2UvdmlkZW8gY29tcG9uZW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworICAgIGtQYXJhbUluZGV4UGljdHVyZVNpemUgPSBDMl9QQVJBTV9JTkRFWF9QSUNUVVJFX1BBUkFNX1NUQVJULAorICAgIGtQYXJhbUluZGV4Q3JvcFJlY3QsCisgICAga1BhcmFtSW5kZXhQaXhlbEZvcm1hdCwKKyAgICBrUGFyYW1JbmRleFJvdGF0aW9uLAorICAgIGtQYXJhbUluZGV4UGl4ZWxBc3BlY3RSYXRpbywKKyAgICBrUGFyYW1JbmRleFNjYWxlZFBpY3R1cmVTaXplLAorICAgIGtQYXJhbUluZGV4U2NhbGVkQ3JvcFJlY3QsCisgICAga1BhcmFtSW5kZXhTY2FsaW5nTWV0aG9kLAorICAgIGtQYXJhbUluZGV4Q29sb3JJbmZvLAorICAgIGtQYXJhbUluZGV4Q29sb3JBc3BlY3RzLAorICAgIGtQYXJhbUluZGV4SGRyU3RhdGljTWV0YWRhdGEsCisgICAga1BhcmFtSW5kZXhEZWZhdWx0Q29sb3JBc3BlY3RzLAorCisgICAga1BhcmFtSW5kZXhCbG9ja1NpemUsCisgICAga1BhcmFtSW5kZXhCbG9ja0NvdW50LAorICAgIGtQYXJhbUluZGV4QmxvY2tSYXRlLAorCisgICAga1BhcmFtSW5kZXhQaWN0dXJlVHlwZU1hc2ssCisgICAga1BhcmFtSW5kZXhQaWN0dXJlVHlwZSwKKworICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB2aWRlbyBjb21wb25lbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisgICAga1BhcmFtSW5kZXhGcmFtZVJhdGUgPSBDMl9QQVJBTV9JTkRFWF9WSURFT19QQVJBTV9TVEFSVCwKKyAgICBrUGFyYW1JbmRleE1heEJpdHJhdGUsCisgICAga1BhcmFtSW5kZXhNYXhGcmFtZVJhdGUsCisgICAga1BhcmFtSW5kZXhNYXhQaWN0dXJlU2l6ZSwKKyAgICBrUGFyYW1JbmRleEdvcCwKKyAgICBrUGFyYW1JbmRleFN5bmNGcmFtZUludGVydmFsLAorICAgIGtQYXJhbUluZGV4UmVxdWVzdFN5bmNGcmFtZSwKKyAgICBrUGFyYW1JbmRleFRlbXBvcmFsTGF5ZXJpbmcsCisgICAga1BhcmFtSW5kZXhMYXllckluZGV4LAorICAgIGtQYXJhbUluZGV4TGF5ZXJDb3VudCwKKyAgICBrUGFyYW1JbmRleEludHJhUmVmcmVzaCwKKworICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBpbWFnZSBjb21wb25lbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisgICAga1BhcmFtSW5kZXhUaWxlTGF5b3V0ID0gQzJfUEFSQU1fSU5ERVhfSU1BR0VfUEFSQU1fU1RBUlQsCisgICAga1BhcmFtSW5kZXhUaWxlSGFuZGxpbmcsCisKKyAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gYXVkaW8gY29tcG9uZW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworICAgIGtQYXJhbUluZGV4U2FtcGxlUmF0ZSA9IEMyX1BBUkFNX0lOREVYX0FVRElPX1BBUkFNX1NUQVJULAorICAgIGtQYXJhbUluZGV4Q2hhbm5lbENvdW50LAorICAgIGtQYXJhbUluZGV4UGNtRW5jb2RpbmcsCisgICAga1BhcmFtSW5kZXhBYWNQYWNrYWdpbmcsCisgICAga1BhcmFtSW5kZXhNYXhDaGFubmVsQ291bnQsCisgICAga1BhcmFtSW5kZXhBYWNTYnJNb2RlLCAvLyBhYWMgZW5jb2RlLCBlbnVtCisgICAga1BhcmFtSW5kZXhEcmNFbmNvZGVkVGFyZ2V0TGV2ZWwsICAvLyBkcmMsIGZsb2F0IChkQkZTKQorICAgIGtQYXJhbUluZGV4RHJjVGFyZ2V0UmVmZXJlbmNlTGV2ZWwsIC8vIGRyYywgZmxvYXQgKGRCRlMpCisgICAga1BhcmFtSW5kZXhEcmNDb21wcmVzc2lvbiwgLy8gZHJjLCBlbnVtCisgICAga1BhcmFtSW5kZXhEcmNCb29zdEZhY3RvciwgLy8gZHJjLCBmbG9hdCAoMC0xKQorICAgIGtQYXJhbUluZGV4RHJjQXR0ZW51YXRpb25GYWN0b3IsIC8vIGRyYywgZmxvYXQgKDAtMSkKKyAgICBrUGFyYW1JbmRleERyY0VmZmVjdFR5cGUsIC8vIGRyYywgZW51bQorCisgICAgLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IHBsYXRmb3JtLWRlZmluZWQgcGFyYW1ldGVycyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworICAgIGtQYXJhbUluZGV4UGxhdGZvcm1MZXZlbCA9IEMyX1BBUkFNX0lOREVYX1BMQVRGT1JNX1NUQVJULCAvLyBhbGwsIHUzMgorICAgIGtQYXJhbUluZGV4UGxhdGZvcm1GZWF0dXJlcywgLy8gYWxsLCB1NjQgbWFzaworICAgIGtQYXJhbUluZGV4U3RvcmVJb25Vc2FnZSwgLy8gc3RvcmUsIHN0cnVjdAorICAgIGtQYXJhbUluZGV4QXNwZWN0c1RvRGF0YVNwYWNlLCAvLyBzdG9yZSwgc3RydWN0CisgICAga1BhcmFtSW5kZXhGbGV4aWJsZVBpeGVsRm9ybWF0RGVzY3JpcHRvciwgLy8gc3RvcmUsIHN0cnVjdAorICAgIGtQYXJhbUluZGV4RmxleGlibGVQaXhlbEZvcm1hdERlc2NyaXB0b3JzLCAvLyBzdG9yZSwgc3RydWN0W10KKyAgICBrUGFyYW1JbmRleERhdGFTcGFjZVRvQXNwZWN0cywgLy8gc3RvcmUsIHN0cnVjdAorICAgIGtQYXJhbUluZGV4RGF0YVNwYWNlLCAvLyB1MzIKKyAgICBrUGFyYW1JbmRleFN1cmZhY2VTY2FsaW5nLCAvLyB1MzIKKworICAgIC8vIGlucHV0IHN1cmZhY2UKKyAgICBrUGFyYW1JbmRleElucHV0U3VyZmFjZUVvcywgLy8gaW5wdXQtc3VyZmFjZSwgZW9zCisgICAga1BhcmFtSW5kZXhUaW1lZENvbnRyb2wsIC8vIHN0cnVjdAorICAgIGtQYXJhbUluZGV4U3RhcnRBdCwgLy8gaW5wdXQtc3VyZmFjZSwgc3RydWN0CisgICAga1BhcmFtSW5kZXhTdXNwZW5kQXQsIC8vIGlucHV0LXN1cmZhY2UsIHN0cnVjdAorICAgIGtQYXJhbUluZGV4UmVzdW1lQXQsIC8vIGlucHV0LXN1cmZhY2UsIHN0cnVjdAorICAgIGtQYXJhbUluZGV4U3RvcEF0LCAvLyBpbnB1dC1zdXJmYWNlLCBzdHJ1Y3QKKyAgICBrUGFyYW1JbmRleFRpbWVPZmZzZXQsIC8vIGlucHV0LXN1cmZhY2UsIHN0cnVjdAorICAgIGtQYXJhbUluZGV4TWluRnJhbWVSYXRlLCAvLyBpbnB1dC1zdXJmYWNlLCBmbG9hdAorICAgIGtQYXJhbUluZGV4VGltZXN0YW1wR2FwQWRqdXN0bWVudCwgLy8gaW5wdXQtc3VyZmFjZSwgc3RydWN0CisKKyAgICBrUGFyYW1JbmRleFN1cmZhY2VBbGxvY2F0b3IsIC8vIHUzMgorCisgICAgLy8gZGVwcmVjYXRlZCBpbmRpY2VzIGR1ZSB0byByZW5hbWluZworICAgIGtQYXJhbUluZGV4QWFjU3RyZWFtRm9ybWF0ID0ga1BhcmFtSW5kZXhBYWNQYWNrYWdpbmcsCisgICAga1BhcmFtSW5kZXhDc2QgPSBrUGFyYW1JbmRleEluaXREYXRhLAorICAgIGtQYXJhbUluZGV4TWF4VmlkZW9TaXplSGludCA9IGtQYXJhbUluZGV4TWF4UGljdHVyZVNpemUsCisgICAga1BhcmFtSW5kZXhNaW1lID0ga1BhcmFtSW5kZXhNZWRpYVR5cGUsCisgICAga1BhcmFtSW5kZXhSZXF1ZXN0ZWRJbmZvcyA9IGtQYXJhbUluZGV4U3Vic2NyaWJlZFBhcmFtSW5kaWNlcywKKworCisgICAgLy8gZGVwcmVjYXRlZCBpbmRpY2VzIGR1ZSB0byByZW1vdmFsCisgICAga1BhcmFtSW5kZXhTdXBwb3J0ZWRQYXJhbXMgPSAweERFQUQwMDAwLAorICAgIGtQYXJhbUluZGV4UmVhZE9ubHlQYXJhbXMsCisgICAga1BhcmFtSW5kZXhUZW1wb3JhbCwKK307CisKK30KKworLyoqCisgKiBDb2RlYyAyLjAgcGFyYW1ldGVyIHR5cGVzIGZvbGxvdyB0aGUgZm9sbG93aW5nIG5hbWluZyBjb252ZW50aW9uOgorICoKKyAqIEMyPGdyb3VwPjxkb21haW4+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+CisgICAgICAgIEMyU3RyZWFtQ29sb3JBc3BlY3RzVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfREVGQVVMVF9DT0xPUl9BU1BFQ1RTW10gPSAiZGVmYXVsdC5jb2xvciI7CisKKy8qKgorICogSERSIFN0YXRpYyBNZXRhZGF0YSBJbmZvLgorICovCitzdHJ1Y3QgQzJDb2xvclh5U3RydWN0IHsKKyAgICBmbG9hdCB4OyAvLy88IHggY29sb3IgY29vcmRpbmF0ZSBpbiB4eVkgc3BhY2UgWzAtMV0KKyAgICBmbG9hdCB5OyAvLy88IHkgY29sb3IgY29vcmRpbmF0ZSBpbiB4eVkgc3BhY2UgWzAtMV0KKworICAgIERFRklORV9BTkRfREVTQ1JJQkVfQzJTVFJVQ1QoQ29sb3JYeSkKKyAgICBDMkZJRUxEKHgsICJ4IikKKyAgICBDMkZJRUxEKHksICJ5IikKK307CisKK3N0cnVjdCBDMk1hc3RlcmluZ0Rpc3BsYXlDb2xvclZvbHVtZVN0cnVjdCB7CisgICAgQzJDb2xvclh5U3RydWN0IHJlZDsgICAgLy8vPCBjb29yZGluYXRlcyBvZiByZWQgZGlzcGxheSBwcmltYXJ5CisgICAgQzJDb2xvclh5U3RydWN0IGdyZWVuOyAgLy8vPCBjb29yZGluYXRlcyBvZiBncmVlbiBkaXNwbGF5IHByaW1hcnkKKyAgICBDMkNvbG9yWHlTdHJ1Y3QgYmx1ZTsgICAvLy88IGNvb3JkaW5hdGVzIG9mIGJsdWUgZGlzcGxheSBwcmltYXJ5CisgICAgQzJDb2xvclh5U3RydWN0IHdoaXRlOyAgLy8vPCBjb29yZGluYXRlcyBvZiB3aGl0ZSBwb2ludAorCisgICAgZmxvYXQgbWF4THVtaW5hbmNlOyAgLy8vPCBtYXggZGlzcGxheSBtYXN0ZXJpbmcgbHVtaW5hbmNlIGluIGNkL21eMgorICAgIGZsb2F0IG1pbkx1bWluYW5jZTsgIC8vLzwgbWluIGRpc3BsYXkgbWFzdGVyaW5nIGx1bWluYW5jZSBpbiBjZC9tXjIKKworICAgIERFRklORV9BTkRfREVTQ1JJQkVfQzJTVFJVQ1QoTWFzdGVyaW5nRGlzcGxheUNvbG9yVm9sdW1lKQorICAgIEMyRklFTEQocmVkLCAicmVkIikKKyAgICBDMkZJRUxEKGdyZWVuLCAiZ3JlZW4iKQorICAgIEMyRklFTEQoYmx1ZSwgImJsdWUiKQorICAgIEMyRklFTEQod2hpdGUsICJ3aGl0ZSIpCisKKyAgICBDMkZJRUxEKG1heEx1bWluYW5jZSwgIm1heC1sdW1pbmFuY2UiKQorICAgIEMyRklFTEQobWluTHVtaW5hbmNlLCAibWluLWx1bWluYW5jZSIpCit9OworCitzdHJ1Y3QgQzJIZHJTdGF0aWNNZXRhZGF0YVN0cnVjdCB7CisgICAgQzJNYXN0ZXJpbmdEaXNwbGF5Q29sb3JWb2x1bWVTdHJ1Y3QgbWFzdGVyaW5nOworCisgICAgLy8gY29udGVudCBkZXNjcmlwdG9ycworICAgIGZsb2F0IG1heENsbDsgIC8vLzwgbWF4IGNvbnRlbnQgbGlnaHQgbGV2ZWwgKHBpeGVsIGx1bWluYW5jZSkgaW4gY2QvbV4yCisgICAgZmxvYXQgbWF4RmFsbDsgLy8vPCBtYXggZnJhbWUgYXZlcmFnZSBsaWdodCBsZXZlbCAoZnJhbWUgbHVtaW5hbmNlKSBpbiBjZC9tXjIKKworICAgIERFRklORV9BTkRfREVTQ1JJQkVfQkFTRV9DMlNUUlVDVChIZHJTdGF0aWNNZXRhZGF0YSkKKyAgICBDMkZJRUxEKG1hc3RlcmluZywgIm1hc3RlcmluZyIpCisgICAgQzJGSUVMRChtYXhDbGwsICJtYXgtY2xsIikKKyAgICBDMkZJRUxEKG1heEZhbGwsICJtYXgtZmFsbCIpCit9OwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJIZHJTdGF0aWNNZXRhZGF0YVN0cnVjdCwga1BhcmFtSW5kZXhIZHJTdGF0aWNNZXRhZGF0YT4KKyAgICAgICAgQzJTdHJlYW1IZHJTdGF0aWNJbmZvOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfSERSX1NUQVRJQ19JTkZPW10gPSAicmF3Lmhkci1zdGF0aWMtaW5mbyI7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBibG9jay1iYXNlZCBjb2RpbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqCisgKiBCbG9jay1zaXplLCBibG9jayBjb3VudCBhbmQgYmxvY2sgcmF0ZS4gVXNlZCB0byBkZXRlcm1pbmUgb3IgY29tbXVuaWNhdGUgcHJvZmlsZS1sZXZlbAorICogcmVxdWlyZW1lbnRzLgorICovCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMlBpY3R1cmVTaXplU3RydWN0LCBrUGFyYW1JbmRleEJsb2NrU2l6ZT4gQzJTdHJlYW1CbG9ja1NpemVJbmZvOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfQkxPQ0tfU0laRVtdID0gImNvZGVkLmJsb2NrLXNpemUiOworCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMlVpbnQzMlZhbHVlLCBrUGFyYW1JbmRleEJsb2NrQ291bnQ+IEMyU3RyZWFtQmxvY2tDb3VudEluZm87Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9CTE9DS19DT1VOVFtdID0gImNvZGVkLmJsb2NrLWNvdW50IjsKKwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJGbG9hdFZhbHVlLCBrUGFyYW1JbmRleEJsb2NrUmF0ZT4gQzJTdHJlYW1CbG9ja1JhdGVJbmZvOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfQkxPQ0tfUkFURVtdID0gImNvZGVkLmJsb2NrLXJhdGUiOworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBWSURFTyBDT01QT05FTlRTID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKy8qKgorICogRnJhbWUgcmF0ZSAoY29kZWQgYW5kIHBvcnQgZm9yIHJhdyBkYXRhKQorICoKKyAqIENvZGVkIGZyYW1lIHJhdGVzIGFyZSB3aGF0IGlzIHJlcHJlc2VudGVkIGluIHRoZSBjb21wcmVzc2VkIGJpdHN0cmVhbSBhbmQgc2hvdWxkIGNvcnJlc3BvbmQgdG8KKyAqIHRoZSB0aW1lc3RhbXAuCisgKgorICogRnJhbWUgcmF0ZXMgb24gcmF3IHBvcnRzIHNob3VsZCBzdGlsbCBjb3JyZXNwb25kIHRvIHRoZSB0aW1lc3RhbXBzLgorICoKKyAqIEZvciBzbG93IG1vdGlvbiBvciB0aW1lbGFwc2UgcmVjb3JkaW5nLCB0aGUgdGltZXN0YW1wIHNoYWxsIGJlIGFkanVzdGVkIHByaW9yIHRvIGZlZWRpbmcgYW4KKyAqIGVuY29kZXIsIGFuZCB0aGUgdGltZSBzdHJldGNoIHBhcmFtZXRlciBzaG91bGQgYmUgdXNlZCB0byBzaWduYWwgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuCisgKiB0aW1lc3RhbXAgYW5kIHJlYWwtd29ybGQgdGltZS4KKyAqLwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJGbG9hdFZhbHVlLCBrUGFyYW1JbmRleEZyYW1lUmF0ZT4gQzJTdHJlYW1GcmFtZVJhdGVJbmZvOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfRlJBTUVfUkFURVtdID0gImNvZGVkLmZyYW1lLXJhdGUiOworI2RlZmluZSBDMl9OQU1FX1NUUkVBTV9GUkFNRV9SQVRFX1NFVFRJTkcgQzJfUEFSQU1LRVlfRlJBTUVfUkFURQorCit0eXBlZGVmIEMyUG9ydFBhcmFtPEMySW5mbywgQzJGbG9hdFZhbHVlLCBrUGFyYW1JbmRleEZyYW1lUmF0ZT4gQzJQb3J0RnJhbWVSYXRlSW5mbzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0lOUFVUX0ZSQU1FX1JBVEVbXSA9ICJpbnB1dC5mcmFtZS1yYXRlIjsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX09VVFBVVF9GUkFNRV9SQVRFW10gPSAib3V0cHV0LmZyYW1lLXJhdGUiOworCisvKioKKyAqIFRpbWUgc3RyZXRjaC4gUmF0aW8gYmV0d2VlbiByZWFsLXdvcmxkIHRpbWUgYW5kIHRpbWVzdGFtcC4gRS5nLiB0aW1lIHN0cmV0Y2ggb2YgNC4wIG1lYW5zIHRoYXQKKyAqIHRpbWVzdGFtcCBncm93cyAxLzQgdGhlIHNwZWVkIG9mIHJlYWwtd29ybGQgdGltZSAoZS5nLiA0eCBzbG8tbW8gaW5wdXQpLiBUaGlzIGNhbiBiZSB1c2VkIHRvCisgKiBvcHRpbWl6ZSBlbmNvZGluZy4KKyAqLwordHlwZWRlZiBDMlBvcnRQYXJhbTxDMkluZm8sIEMyRmxvYXRWYWx1ZSwga1BhcmFtSW5kZXhUaW1lU3RyZXRjaD4gQzJQb3J0VGltZVN0cmV0Y2hJbmZvOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfSU5QVVRfVElNRV9TVFJFVENIW10gPSAiaW5wdXQudGltZS1zdHJldGNoIjsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX09VVFBVVF9USU1FX1NUUkVUQ0hbXSA9ICJvdXRwdXQudGltZS1zdHJldGNoIjsKKworLyoqCisgKiBNYXggdmlkZW8gZnJhbWUgc2l6ZS4KKyAqLwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMyVHVuaW5nLCBDMlBpY3R1cmVTaXplU3RydWN0LCBrUGFyYW1JbmRleE1heFBpY3R1cmVTaXplPgorICAgICAgICBDMlN0cmVhbU1heFBpY3R1cmVTaXplVHVuaW5nOwordHlwZWRlZiBDMlN0cmVhbU1heFBpY3R1cmVTaXplVHVuaW5nIEMyTWF4VmlkZW9TaXplSGludFBvcnRTZXR0aW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfTUFYX1BJQ1RVUkVfU0laRVtdID0gInJhdy5tYXgtc2l6ZSI7CisKKy8qKgorICogUGljdHVyZSB0eXBlIG1hc2suCisgKi8KK0MyRU5VTShDMkNvbmZpZzo6cGljdHVyZV90eXBlX3QsIHVpbnQzMl90LAorICAgIFNZTkNfRlJBTUUgPSAoMSA8PCAwKSwgIC8vLzwgc3luYyBmcmFtZSwgZS5nLiBJRFIKKyAgICBJX0ZSQU1FICAgID0gKDEgPDwgMSksICAvLy88IGludHJhIGZyYW1lIHRoYXQgaXMgY29tcGxldGVseSBlbmNvZGVkCisgICAgUF9GUkFNRSAgICA9ICgxIDw8IDIpLCAgLy8vPCBpbnRlciBwcmVkaWN0ZWQgZnJhbWUgZnJvbSBwcmV2aW91cyBmcmFtZXMKKyAgICBCX0ZSQU1FICAgID0gKDEgPDwgMyksICAvLy88IGJhY2t3YXJkIHByZWRpY3RlZCAob3V0LW9mLW9yZGVyKSBmcmFtZQorKQorCit0eXBlZGVmIEMyQ29uZmlnOjpwaWN0dXJlX3R5cGVfdCBDMlBpY3R1cmVUeXBlTWFzazsgLy8gZGVwcmVjYXRlZAorY29uc3RleHByIEMyQ29uZmlnOjpwaWN0dXJlX3R5cGVfdCBDMlBpY3R1cmVUeXBlS2V5RnJhbWUgPSBDMkNvbmZpZzo6U1lOQ19GUkFNRTsgLy8gZGVwcmVjYXRlZAorCisvKioKKyAqIEFsbG93ZWQgcGljdHVyZSB0eXBlcy4KKyAqLwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMyVHVuaW5nLCBDMlNpbXBsZVZhbHVlU3RydWN0PEMyRWFzeUVudW08QzJDb25maWc6OnBpY3R1cmVfdHlwZV90Pj4sCisgICAgICAgICAgICAgICAga1BhcmFtSW5kZXhQaWN0dXJlVHlwZU1hc2s+CisgICAgICAgIEMyU3RyZWFtUGljdHVyZVR5cGVNYXNrVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfUElDVFVSRV9UWVBFX01BU0tbXSA9ICJjb2RpbmcucGljdHVyZS10eXBlLW1hc2siOworCisvKioKKyAqIFJlc3VsdGluZyBwaWN0dXJlIHR5cGUKKyAqLwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJTaW1wbGVWYWx1ZVN0cnVjdDxDMkVhc3lFbnVtPEMyQ29uZmlnOjpwaWN0dXJlX3R5cGVfdD4+LAorICAgICAgICAgICAgICAgIGtQYXJhbUluZGV4UGljdHVyZVR5cGU+CisgICAgICAgIEMyU3RyZWFtUGljdHVyZVR5cGVJbmZvOwordHlwZWRlZiBDMlN0cmVhbVBpY3R1cmVUeXBlSW5mbyBDMlN0cmVhbVBpY3R1cmVUeXBlTWFza0luZm87Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9QSUNUVVJFX1RZUEVbXSA9ICJjb2RlZC5waWN0dXJlLXR5cGUiOworCisvKioKKyAqIEdPUCBzcGVjaWZpY2F0aW9uLgorICoKKyAqIEdPUCBpcyBzcGVjaWZpZWQgaW4gbGF5ZXJzIGJldHdlZW4gc3luYyBmcmFtZXMsIGJ5IHNwZWNpZnlpbmcgdGhlIG51bWJlciBvZiBzcGVjaWZpYyB0eXBlIG9mCisgKiBmcmFtZXMgYmV0d2VlbiB0aGUgcHJldmlvdXMgdHlwZSAoc3RhcnRpbmcgd2l0aCBzeW5jIGZyYW1lcyBmb3IgdGhlIGZpcnN0IGxheWVyKToKKyAqCisgKiBFLmcuCisgKiAgICAgIC0gNCBJIGZyYW1lcyBiZXR3ZWVuIGVhY2ggc3luYyBmcmFtZQorICogICAgICAtIDIgUCBmcmFtZXMgYmV0d2VlbiBlYWNoIEkgZnJhbWUKKyAqICAgICAgLSAxIEIgZnJhbWUgYmV0d2VlbiBlYWNoIFAgZnJhbWUKKyAqCisgKiAgICAgIFsgeyBJLCA0IH0sIHsgUCwgMiB9LCB7IEIsIDEgfSBdID09PiAoU3luYylCUEJQQiBJQlBCUEIgSUJQQlBCIElCUEJQQiBJQlBCUEIgKFN5bmMpQlBCUEIKKyAqCisgKiBGb3IgaW5maW5pdGUgR09QLCBJIGxheWVyIGNhbiBiZSBvbWl0dGVkIChhcyB0aGUgZmlyc3QgZnJhbWUgaXMgYWx3YXlzIGEgc3luYyBmcmFtZS4pOgorICoKKyAqICAgICAgWyB7IFAsIE1BWF9VSU5UIH0gXSAgID09PiAoU3luYylQUFBQUFBQUFBQUFBQUFBQUFAuLi4KKyAqCisgKiBTeW5jIGZyYW1lcyBjYW4gYWxzbyBiZSByZXF1ZXN0ZWQgb24gZGVtYW5kLCBhbmQgYXMgYSB0aW1lLWJhc2VkIGludGVydmFsLiBGb3IgdGltZS1iYXNlZAorICogaW50ZXJ2YWwsIGlmIHRoZXJlIGhhc24ndCBiZWVuIGEgc3luYyBmcmFtZSBpbiBhdCBsZWFzdCB0aGUgZ2l2ZW4gdGltZSwgdGhlIG5leHQgSSBmcmFtZSBzaGFsbAorICogYmUgZW5jb2RlZCBhcyBhIHN5bmMgZnJhbWUuICBGb3Igc3luYyByZXF1ZXN0LCB0aGUgbmV4dCBJIGZyYW1lIHNoYWxsIGJlIGVuY29kZWQgYXMgYSBzeW5jIGZyYW1lLgorICoKKyAqIFRlbXBvcmFsIGxheWVyaW5nIHdpbGwgZGV0ZXJtaW5lIEdPUCBzdHJ1Y3R1cmUgb3RoZXIgdGhhbiB0aGUgSSBmcmFtZSBjb3VudCBiZXR3ZWVuIHN5bmMKKyAqIGZyYW1lcy4KKyAqLworc3RydWN0IEMyR29wTGF5ZXJTdHJ1Y3QgeworICAgIEMyR29wTGF5ZXJTdHJ1Y3QoQzJDb25maWc6OnBpY3R1cmVfdHlwZV90IHR5cGUsIHVpbnQzMl90IGNvdW50XykKKyAgICAgICAgOiB0eXBlXyh0eXBlKSwgY291bnQoY291bnRfKSB7IH0KKworICAgIEMyQ29uZmlnOjpwaWN0dXJlX3R5cGVfdCB0eXBlXzsKKyAgICB1aW50MzJfdCBjb3VudDsKKworICAgIERFRklORV9BTkRfREVTQ1JJQkVfQzJTVFJVQ1QoR29wTGF5ZXIpCisgICAgQzJGSUVMRCh0eXBlXywgInR5cGUiKQorICAgIEMyRklFTEQoY291bnQsICJjb3VudCIpCit9OworCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJUdW5pbmcsIEMyU2ltcGxlQXJyYXlTdHJ1Y3Q8QzJHb3BMYXllclN0cnVjdD4sIGtQYXJhbUluZGV4R29wPgorICAgICAgICBDMlN0cmVhbUdvcFR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0dPUFtdID0gImNvZGluZy5nb3AiOworCisvKioKKyAqIFN5bmMgZnJhbWUgY2FuIGJlIHJlcXVlc3RlZCBvbiBkZW1hbmQgYnkgdGhlIGNsaWVudC4KKyAqCisgKiBJZiB0cnVlLCB0aGUgbmV4dCBJIGZyYW1lIHNoYWxsIGJlIGVuY29kZWQgYXMgYSBzeW5jIGZyYW1lLiBUaGlzIGNvbmZpZyBjYW4gYmUgcGFzc2VkCisgKiBzeW5jaHJvbm91c2x5IHdpdGggdGhlIHdvcmssIG9yIGRpcmVjdGx5IHRvIHRoZSBjb21wb25lbnQgLSBsZWFkaW5nIHRvIGRpZmZlcmVudCByZXN1bHQuCisgKiBJZiBpdCBpcyBwYXNzZWQgd2l0aCB3b3JrLCBpdCBzaGFsbCB0YWtlIGVmZmVjdCB3aGVuIHRoYXQgd29yayBpdGVtIGlzIGJlaW5nIHByb2Nlc3NlZCAoc28KKyAqIHRoZSBmaXJzdCBJIGZyYW1lIGF0IG9yIGFmdGVyIHRoYXQgd29yayBpdGVtIHNoYWxsIGJlIGEgc3luYyBmcmFtZSkuCisgKi8KK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMlR1bmluZywgQzJFYXN5Qm9vbFZhbHVlLCBrUGFyYW1JbmRleFJlcXVlc3RTeW5jRnJhbWU+CisgICAgICAgIEMyU3RyZWFtUmVxdWVzdFN5bmNGcmFtZVR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX1JFUVVFU1RfU1lOQ19GUkFNRVtdID0gImNvZGluZy5yZXF1ZXN0LXN5bmMtZnJhbWUiOworCisvKioKKyAqIFN5bmMgZnJhbWUgaW50ZXJ2YWwgaW4gdGltZSBkb21haW4gKHRpbWVzdGFtcCkuCisgKgorICogSWYgdGhlcmUgaGFzbid0IGJlZW4gYSBzeW5jIGZyYW1lIGluIGF0IGxlYXN0IHRoaXMgdmFsdWUsIHRoZSBuZXh0IGludHJhIGZyYW1lIHNoYWxsIGJlIGVuY29kZWQKKyAqIGFzIGEgc3luYyBmcmFtZS4gVGhlIHZhbHVlIG9mIE1BWF9JNjQgb3IgYSBuZWdhdGl2ZSB2YWx1ZSBtZWFucyBubyBzeW5jIGZyYW1lcyBhZnRlciB0aGUgZmlyc3QKKyAqIGZyYW1lLiBBIHZhbHVlIG9mIDAgbWVhbnMgYWxsIHN5bmMgZnJhbWVzLgorICovCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJUdW5pbmcsIEMySW50NjRWYWx1ZSwga1BhcmFtSW5kZXhTeW5jRnJhbWVJbnRlcnZhbD4KKyAgICAgICAgQzJTdHJlYW1TeW5jRnJhbWVJbnRlcnZhbFR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX1NZTkNfRlJBTUVfSU5URVJWQUxbXSA9ICJjb2Rpbmcuc3luYy1mcmFtZS1pbnRlcnZhbCI7CisvLyBkZXByZWNhdGVkCisjZGVmaW5lIEMyX1BBUkFNS0VZX1NZTkNfRlJBTUVfUEVSSU9EIEMyX1BBUkFNS0VZX1NZTkNfRlJBTUVfSU5URVJWQUwKKworLyoqCisgKiBUZW1wb3JhbCBsYXllcmluZworICoKKyAqIExheWVyIGluZGV4IGlzIGEgdmFsdWUgYmV0d2VlbiAwIGFuZCBsYXllciBjb3VudCAtIDEuIExheWVycyB3aXRoIGhpZ2hlciBpbmRleCBoYXZlIGhpZ2hlcgorICogZnJlcXVlbmN5OgorICogICAgIDAKKyAqICAgMSAgIDEKKyAqICAyIDIgMiAyCisgKi8KK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyVWludDMyVmFsdWUsIGtQYXJhbUluZGV4TGF5ZXJJbmRleD4gQzJTdHJlYW1MYXllckluZGV4SW5mbzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0xBWUVSX0lOREVYW10gPSAiY29kZWQubGF5ZXItaW5kZXgiOworCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMlVpbnQzMlZhbHVlLCBrUGFyYW1JbmRleExheWVyQ291bnQ+IEMyU3RyZWFtTGF5ZXJDb3VudEluZm87Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9MQVlFUl9DT1VOVFtdID0gImNvZGVkLmxheWVyLWNvdW50IjsKKworc3RydWN0IEMyVGVtcG9yYWxMYXllcmluZ1N0cnVjdCB7CisgICAgQzJUZW1wb3JhbExheWVyaW5nU3RydWN0KCkKKyAgICAgICAgOiBsYXllckNvdW50KDApLCBiTGF5ZXJDb3VudCgwKSB7IH0KKworICAgIEMyVGVtcG9yYWxMYXllcmluZ1N0cnVjdChzaXplX3QgLyogZmxleENvdW50ICovLCB1aW50MzJfdCBsYXllckNvdW50XywgdWludDMyX3QgYkxheWVyQ291bnRfKQorICAgICAgICA6IGxheWVyQ291bnQobGF5ZXJDb3VudF8pLCBiTGF5ZXJDb3VudChjMl9taW4obGF5ZXJDb3VudF8sIGJMYXllckNvdW50XykpIHsgfQorCisgICAgQzJUZW1wb3JhbExheWVyaW5nU3RydWN0KHNpemVfdCBmbGV4Q291bnQsIHVpbnQzMl90IGxheWVyQ291bnRfLCB1aW50MzJfdCBiTGF5ZXJDb3VudF8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxmbG9hdD4gcmF0aW9zKQorICAgICAgICA6IGxheWVyQ291bnQobGF5ZXJDb3VudF8pLCBiTGF5ZXJDb3VudChjMl9taW4obGF5ZXJDb3VudF8sIGJMYXllckNvdW50XykpIHsKKyAgICAgICAgc2l6ZV90IGl4ID0gMDsKKyAgICAgICAgZm9yIChmbG9hdCByYXRpbyA6IHJhdGlvcykgeworICAgICAgICAgICAgaWYgKGl4ID09IGZsZXhDb3VudCkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYml0cmF0ZVJhdGlvc1tpeCsrXSA9IHJhdGlvOworICAgICAgICB9CisgICAgfQorCisgICAgdWludDMyX3QgbGF5ZXJDb3VudDsgICAgIC8vLzwgdG90YWwgbnVtYmVyIG9mIGxheWVycyAoMCBtZWFucyBubyB0ZW1wb3JhbCBsYXllcmluZykKKyAgICB1aW50MzJfdCBiTGF5ZXJDb3VudDsgICAgLy8vPCB0b3RhbCBudW1iZXIgb2YgYmlkaXJlY3Rpb25hbCBsYXllcnMgKDw9IG51bSBsYXllcnMpCisgICAgLyoqCisgICAgICogQml0cmF0ZSBidWRnZXRzIGZvciBlYWNoIGxheWVyIGFuZCB0aGUgbGF5ZXJzIGJlbG93LCBnaXZlbiBhcyBhIHJhdGlvIG9mIHRoZSB0b3RhbAorICAgICAqIHN0cmVhbSBiaXRyYXRlLiBUaGlzIGNhbiBiZSBvbWl0dGVkIG9yIHBhcnRpYWxseSBzcGVjaWZpZmVkIGJ5IHRoZSBjbGllbnQgd2hpbGUgY29uZmlndXJpbmcsCisgICAgICogaW4gd2hpY2ggY2FzZSB0aGUgY29tcG9uZW50IHNoYWxsIGZpbGwgaW4gYXBwcm9wcmlhdGUgdmFsdWVzIGZvciB0aGUgbWlzc2luZyBsYXllcnMuCisgICAgICogVGhpcyBtdXN0IGJlIHByb3ZpZGVkIGJ5IHRoZSBjb21wb25lbnQgd2hlbiBxdWVyaWVkIGZvciBhdCBsZWFzdCBsYXllciBjb3VudCAtIDEgKGFzIHRoZQorICAgICAqIGxhc3QgbGF5ZXIncyBidWRnZXQgaXMgYWx3YXlzIDEuMCkuCisgICAgICovCisgICAgZmxvYXQgYml0cmF0ZVJhdGlvc1tdOyAgIC8vLzwgMS4wLWJhc2VkCisKKyAgICBERUZJTkVfQU5EX0RFU0NSSUJFX0ZMRVhfQzJTVFJVQ1QoVGVtcG9yYWxMYXllcmluZywgYml0cmF0ZVJhdGlvcykKKyAgICBDMkZJRUxEKGxheWVyQ291bnQsICJsYXllci1jb3VudCIpCisgICAgQzJGSUVMRChiTGF5ZXJDb3VudCwgImItbGF5ZXItY291bnQiKQorICAgIEMyRklFTEQoYml0cmF0ZVJhdGlvcywgImJpdHJhdGUtcmF0aW9zIikKK307CisKK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMlR1bmluZywgQzJUZW1wb3JhbExheWVyaW5nU3RydWN0LCBrUGFyYW1JbmRleFRlbXBvcmFsTGF5ZXJpbmc+CisgICAgICAgIEMyU3RyZWFtVGVtcG9yYWxMYXllcmluZ1R1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX1RFTVBPUkFMX0xBWUVSSU5HW10gPSAiY29kaW5nLnRlbXBvcmFsLWxheWVyaW5nIjsKKworLyoqCisgKiBJbnRyYS1yZWZyZXNoLgorICovCisKK0MyRU5VTShDMkNvbmZpZzo6aW50cmFfcmVmcmVzaF9tb2RlX3QsIHVpbnQzMl90LAorICAgIElOVFJBX1JFRlJFU0hfRElTQUJMRUQsICAgICAvLy88IG5vIGludHJhIHJlZnJlc2gKKyAgICBJTlRSQV9SRUZSRVNIX0FSQklUUkFSWSwgICAgLy8vPCBhcmJpdHJhcnksIHVuc3BlY2lmaWVkCispCisKK3N0cnVjdCBDMkludHJhUmVmcmVzaFN0cnVjdCB7CisgICAgQzJJbnRyYVJlZnJlc2hTdHJ1Y3QoKQorICAgICAgICA6IG1vZGUoQzJDb25maWc6OklOVFJBX1JFRlJFU0hfRElTQUJMRUQpLCBwZXJpb2QoMC4pIHsgfQorCisgICAgQzJJbnRyYVJlZnJlc2hTdHJ1Y3QoQzJDb25maWc6OmludHJhX3JlZnJlc2hfbW9kZV90IG1vZGVfLCBmbG9hdCBwZXJpb2RfKQorICAgICAgICA6IG1vZGUobW9kZV8pLCBwZXJpb2QocGVyaW9kXykgeyB9CisKKyAgICBDMkNvbmZpZzo6aW50cmFfcmVmcmVzaF9tb2RlX3QgbW9kZTsgLy8vPCByZWZyZXNoIG1vZGUKKyAgICBmbG9hdCBwZXJpb2Q7ICAgICAgICAgLy8vPCBpbnRyYSByZWZyZXNoIHBlcmlvZCBpbiBmcmFtZXMgKG11c3QgYmUgPj0gMSksIDAgbWVhbnMgZGlzYWJsZWQKKworICAgIERFRklORV9BTkRfREVTQ1JJQkVfQzJTVFJVQ1QoSW50cmFSZWZyZXNoKQorICAgIEMyRklFTEQobW9kZSwgIm1vZGUiKQorICAgIEMyRklFTEQocGVyaW9kLCAicGVyaW9kIikKK307CisKK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMlR1bmluZywgQzJJbnRyYVJlZnJlc2hTdHJ1Y3QsIGtQYXJhbUluZGV4SW50cmFSZWZyZXNoPgorICAgICAgICBDMlN0cmVhbUludHJhUmVmcmVzaFR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0lOVFJBX1JFRlJFU0hbXSA9ICJjb2RpbmcuaW50cmEtcmVmcmVzaCI7CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IElNQUdFIENPTVBPTkVOVFMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworLyoqCisgKiBUaWxlIGxheW91dC4KKyAqCisgKiBUaGlzIGRlc2NyaWJlZCBob3cgdGhlIGltYWdlIGlzIGRlY29tcG9zZWQgaW50byB0aWxlcy4KKyAqLworQzJFTlVNKEMyQ29uZmlnOjpzY2FuX29yZGVyX3QsIHVpbnQzMl90LAorICAgIFNDQU5fTEVGVF9UT19SSUdIVF9USEVOX0RPV04KKykKKworc3RydWN0IEMyVGlsZUxheW91dFN0cnVjdCB7CisgICAgQzJQaWN0dXJlU2l6ZVN0cnVjdCB0aWxlOyAgICAgICAvLy88IHRpbGUgc2l6ZQorICAgIHVpbnQzMl90IGNvbHVtbkNvdW50OyAgICAgICAgICAgLy8vPCBudW1iZXIgb2YgdGlsZXMgaG9yaXpvbnRhbGx5CisgICAgdWludDMyX3Qgcm93Q291bnQ7ICAgICAgICAgICAgICAvLy88IG51bWJlciBvZiB0aWxlcyB2ZXJ0aWNhbGx5CisgICAgQzJDb25maWc6OnNjYW5fb3JkZXJfdCBvcmRlcjsgICAvLy88IHRpbGUgb3JkZXIKKworICAgIERFRklORV9BTkRfREVTQ1JJQkVfQzJTVFJVQ1QoVGlsZUxheW91dCkKKyAgICBDMkZJRUxEKHRpbGUsICJ0aWxlIikKKyAgICBDMkZJRUxEKGNvbHVtbkNvdW50LCAiY29sdW1ucyIpCisgICAgQzJGSUVMRChyb3dDb3VudCwgInJvd3MiKQorICAgIEMyRklFTEQob3JkZXIsICJvcmRlciIpCit9OworCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMlRpbGVMYXlvdXRTdHJ1Y3QsIGtQYXJhbUluZGV4VGlsZUxheW91dD4gQzJTdHJlYW1UaWxlTGF5b3V0SW5mbzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX1RJTEVfTEFZT1VUW10gPSAiY29kZWQudGlsZS1sYXlvdXQiOworCisvKioKKyAqIFRpbGUgaGFuZGxpbmcuCisgKgorICogV2hldGhlciB0byBjb25jYXRlbmF0ZSB0aWxlcyBvciBvdXRwdXQgdGhlbSBlYWNoLgorICovCitDMkVOVU0oQzJDb25maWc6OnRpbGluZ19tb2RlX3QsIHVpbnQzMl90LAorICAgIFRJTElOR19TRVBBUkFURSwgICAgLy8vPCBvdXRwdXQgZWFjaCB0aWxlIGluIGEgc2VwYXJhdGUgb25Xb3JrRG9uZQorICAgIFRJTElOR19DT05DQVRFTkFURSAgLy8vPCBvdXRwdXQgb25lIHdvcmsgY29tcGxldGlvbiBwZXIgZnJhbWUgKGNvbmNhdGVuYXRlIHRpbGVzKQorKQorCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJUdW5pbmcsIEMyVGlsZUxheW91dFN0cnVjdCwga1BhcmFtSW5kZXhUaWxlSGFuZGxpbmc+CisgICAgICAgIEMyU3RyZWFtVGlsZUhhbmRsaW5nVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfVElMRV9IQU5ETElOR1tdID0gImNvZGluZy50aWxlLWhhbmRsaW5nIjsKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gQVVESU8gQ09NUE9ORU5UUyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisvKioKKyAqIFNhbXBsZSByYXRlCisgKi8KK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyVWludDMyVmFsdWUsIGtQYXJhbUluZGV4U2FtcGxlUmF0ZT4gQzJTdHJlYW1TYW1wbGVSYXRlSW5mbzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX1NBTVBMRV9SQVRFW10gPSAicmF3LnNhbXBsZS1yYXRlIjsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0NPREVEX1NBTVBMRV9SQVRFW10gPSAiY29kZWQuc2FtcGxlLXJhdGUiOworLy8gZGVwcmVjYXRlZAorI2RlZmluZSBDMl9OQU1FX1NUUkVBTV9TQU1QTEVfUkFURV9TRVRUSU5HIEMyX1BBUkFNS0VZX1NBTVBMRV9SQVRFCisKKy8qKgorICogQ2hhbm5lbCBjb3VudC4KKyAqLwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJVaW50MzJWYWx1ZSwga1BhcmFtSW5kZXhDaGFubmVsQ291bnQ+IEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0NIQU5ORUxfQ09VTlRbXSA9ICJyYXcuY2hhbm5lbC1jb3VudCI7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9DT0RFRF9DSEFOTkVMX0NPVU5UW10gPSAiY29kZWQuY2hhbm5lbC1jb3VudCI7CisvLyBkZXByZWNhdGVkCisjZGVmaW5lIEMyX05BTUVfU1RSRUFNX0NIQU5ORUxfQ09VTlRfU0VUVElORyBDMl9QQVJBTUtFWV9DSEFOTkVMX0NPVU5UCisKKy8qKgorICogTWF4IGNoYW5uZWwgY291bnQuIFVzZWQgdG8gbGltaXQgdGhlIG51bWJlciBvZiBjb2RlZCBvciBkZWNvZGVkIGNoYW5uZWxzLgorICovCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMlVpbnQzMlZhbHVlLCBrUGFyYW1JbmRleE1heENoYW5uZWxDb3VudD4gQzJTdHJlYW1NYXhDaGFubmVsQ291bnRJbmZvOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfTUFYX0NIQU5ORUxfQ09VTlRbXSA9ICJyYXcubWF4LWNoYW5uZWwtY291bnQiOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfTUFYX0NPREVEX0NIQU5ORUxfQ09VTlRbXSA9ICJjb2RlZC5tYXgtY2hhbm5lbC1jb3VudCI7CisKKy8qKgorICogQXVkaW8gc2FtcGxlIGZvcm1hdCAoUENNIGVuY29kaW5nKQorICovCitDMkVOVU0oQzJDb25maWc6OnBjbV9lbmNvZGluZ190LCB1aW50MzJfdCwKKyAgICBQQ01fMTYsCisgICAgUENNXzgsCisgICAgUENNX0ZMT0FUCispCisKK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8QzJDb25maWc6OnBjbV9lbmNvZGluZ190Piwga1BhcmFtSW5kZXhQY21FbmNvZGluZz4KKyAgICAgICAgQzJTdHJlYW1QY21FbmNvZGluZ0luZm87Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9QQ01fRU5DT0RJTkdbXSA9ICJyYXcucGNtLWVuY29kaW5nIjsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0NPREVEX1BDTV9FTkNPRElOR1tdID0gImNvZGVkLnBjbS1lbmNvZGluZyI7CisKKy8qKgorICogQUFDIFNCUiBNb2RlLiBVc2VkIGR1cmluZyBlbmNvZGluZy4KKyAqLworQzJFTlVNKEMyQ29uZmlnOjphYWNfc2JyX21vZGVfdCwgdWludDMyX3QsCisgICAgQUFDX1NCUl9PRkYsCisgICAgQUFDX1NCUl9TSU5HTEVfUkFURSwKKyAgICBBQUNfU0JSX0RVQUxfUkFURSwKKyAgICBBQUNfU0JSX0FVVE8gLy8vPCBsZXQgdGhlIGNvZGVjIGRlY2lkZQorKQorCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMlNpbXBsZVZhbHVlU3RydWN0PEMyQ29uZmlnOjphYWNfc2JyX21vZGVfdD4sIGtQYXJhbUluZGV4QWFjU2JyTW9kZT4KKyAgICAgICAgQzJTdHJlYW1BYWNTYnJNb2RlVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfQUFDX1NCUl9NT0RFW10gPSAiY29kaW5nLmFhYy1zYnItbW9kZSI7CisKKy8qKgorICogRFJDIENvbXByZXNzaW9uLiBVc2VkIGR1cmluZyBkZWNvZGluZy4KKyAqLworQzJFTlVNKEMyQ29uZmlnOjpkcmNfY29tcHJlc3Npb25fbW9kZV90LCBpbnQzMl90LAorICAgIERSQ19DT01QUkVTU0lPTl9PRE1fREVGQVVMVCwgLy8vPCBvZG0ncyBkZWZhdWx0CisgICAgRFJDX0NPTVBSRVNTSU9OX05PTkUsCisgICAgRFJDX0NPTVBSRVNTSU9OX0xJR0hULAorICAgIERSQ19DT01QUkVTU0lPTl9IRUFWWSAvLy88CispCisKK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8QzJDb25maWc6OmRyY19jb21wcmVzc2lvbl9tb2RlX3Q+LAorICAgICAgICAgICAgICAgIGtQYXJhbUluZGV4RHJjQ29tcHJlc3Npb24+CisgICAgICAgIEMyU3RyZWFtRHJjQ29tcHJlc3Npb25Nb2RlVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfRFJDX0NPTVBSRVNTSU9OX01PREVbXSA9ICJjb2RpbmcuZHJjLmNvbXByZXNzaW9uLW1vZGUiOworCisvKioKKyAqIERSQyB0YXJnZXQgcmVmZXJlbmNlIGxldmVsIGluIGRCRlMuIFVzZWQgZHVyaW5nIGRlY29kaW5nLgorICovCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMkZsb2F0VmFsdWUsIGtQYXJhbUluZGV4RHJjVGFyZ2V0UmVmZXJlbmNlTGV2ZWw+CisgICAgICAgIEMyU3RyZWFtRHJjVGFyZ2V0UmVmZXJlbmNlTGV2ZWxUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9EUkNfVEFSR0VUX1JFRkVSRU5DRV9MRVZFTFtdID0gImNvZGluZy5kcmMucmVmZXJlbmNlLWxldmVsIjsKKworLyoqCisgKiBEUkMgdGFyZ2V0IHJlZmVyZW5jZSBsZXZlbCBpbiBkQkZTLiBVc2VkIGR1cmluZyBkZWNvZGluZy4KKyAqLwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJGbG9hdFZhbHVlLCBrUGFyYW1JbmRleERyY0VuY29kZWRUYXJnZXRMZXZlbD4KKyAgICAgICAgQzJTdHJlYW1EcmNFbmNvZGVkVGFyZ2V0TGV2ZWxUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9EUkNfRU5DT0RFRF9UQVJHRVRfTEVWRUxbXSA9ICJjb2RpbmcuZHJjLmVuY29kZWQtbGV2ZWwiOworCisvKioKKyAqIERSQyB0YXJnZXQgcmVmZXJlbmNlIGxldmVsIGluIGRCRlMuIFVzZWQgZHVyaW5nIGRlY29kaW5nLgorICovCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMkZsb2F0VmFsdWUsIGtQYXJhbUluZGV4RHJjQm9vc3RGYWN0b3I+CisgICAgICAgIEMyU3RyZWFtRHJjQm9vc3RGYWN0b3JUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9EUkNfQk9PU1RfRkFDVE9SW10gPSAiY29kaW5nLmRyYy5ib29zdC1mYWN0b3IiOworCisvKioKKyAqIERSQyB0YXJnZXQgcmVmZXJlbmNlIGxldmVsIGluIGRCRlMuIFVzZWQgZHVyaW5nIGRlY29kaW5nLgorICovCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMkZsb2F0VmFsdWUsIGtQYXJhbUluZGV4RHJjQXR0ZW51YXRpb25GYWN0b3I+CisgICAgICAgIEMyU3RyZWFtRHJjQXR0ZW51YXRpb25GYWN0b3JUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9EUkNfQVRURU5VQVRJT05fRkFDVE9SW10gPSAiY29kaW5nLmRyYy5hdHRlbnVhdGlvbi1mYWN0b3IiOworCisvKioKKyAqIERSQyBFZmZlY3QgVHlwZSAoc2VlIElTTyAyMzAwMy00KSBVbmlmb3JtIER5bmFtaWMgUmFuZ2UgQ29udHJvbC4gVXNlZCBkdXJpbmcgZGVjb2RpbmcuCisgKi8KK0MyRU5VTShDMkNvbmZpZzo6ZHJjX2VmZmVjdF90eXBlX3QsIGludDMyX3QsCisgICAgRFJDX0VGRkVDVF9PRE1fREVGQVVMVCA9IC0yLCAvLy88IG9kbSdzIGRlZmF1bHQKKyAgICBEUkNfRUZGRUNUX09GRiA9IC0xLCAgICAvLy88IG5vIERSQworICAgIERSQ19FRkZFQ1RfTk9ORSA9IDAsICAgIC8vLzwgbm8gRFJDIGV4Y2VwdCB0byBwcmV2ZW50IGNsaXBwaW5nCisgICAgRFJDX0VGRkVDVF9MQVRFX05JR0hULAorICAgIERSQ19FRkZFQ1RfTk9JU1lfRU5WSVJPTk1FTlQsCisgICAgRFJDX0VGRkVDVF9MSU1JVEVEX1BMQVlCQUNLX1JBTkdFLAorICAgIERSQ19FRkZFQ1RfTE9XX1BMQVlCQUNLX0xFVkVMLAorICAgIERSQ19FRkZFQ1RfRElBTE9HX0VOSEFOQ0VNRU5ULAorICAgIERSQ19FRkZFQ1RfR0VORVJBTF9DT01QUkVTU0lPTgorKQorCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMlNpbXBsZVZhbHVlU3RydWN0PEMyQ29uZmlnOjpkcmNfZWZmZWN0X3R5cGVfdD4sCisgICAgICAgICAgICAgICAga1BhcmFtSW5kZXhEcmNFZmZlY3RUeXBlPgorICAgICAgICBDMlN0cmVhbURyY0VmZmVjdFR5cGVUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9EUkNfRUZGRUNUX1RZUEVbXSA9ICJjb2RpbmcuZHJjLmVmZmVjdC10eXBlIjsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEFBQyBjb21wb25lbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioKKyAqIEFBQyBzdHJlYW0gZm9ybWF0CisgKi8KK0MyRU5VTShDMkNvbmZpZzo6YWFjX3BhY2thZ2luZ190LCB1aW50MzJfdCwKKyAgICBBQUNfUEFDS0FHSU5HX1JBVywKKyAgICBBQUNfUEFDS0FHSU5HX0FEVFMKKykKKwordHlwZWRlZiBDMkNvbmZpZzo6YWFjX3BhY2thZ2luZ190IEMyQWFjU3RyZWFtRm9ybWF0S2luZDsgLy8gZGVwcmVjYXRlZAorLy8gZGVwcmVjYXRlZAorY29uc3RleHByIEMyQ29uZmlnOjphYWNfcGFja2FnaW5nX3QgQzJBYWNTdHJlYW1Gb3JtYXRSYXcgPSBDMkNvbmZpZzo6QUFDX1BBQ0tBR0lOR19SQVc7Citjb25zdGV4cHIgQzJDb25maWc6OmFhY19wYWNrYWdpbmdfdCBDMkFhY1N0cmVhbUZvcm1hdEFkdHMgPSBDMkNvbmZpZzo6QUFDX1BBQ0tBR0lOR19BRFRTOworCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMlNpbXBsZVZhbHVlU3RydWN0PEMyRWFzeUVudW08QzJDb25maWc6OmFhY19wYWNrYWdpbmdfdD4+LAorICAgICAgICBrUGFyYW1JbmRleEFhY1BhY2thZ2luZz4gQzJTdHJlYW1BYWNQYWNrYWdpbmdJbmZvOwordHlwZWRlZiBDMlN0cmVhbUFhY1BhY2thZ2luZ0luZm8gQzJTdHJlYW1BYWNGb3JtYXRJbmZvOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfQUFDX1BBQ0tBR0lOR1tdID0gImNvZGVkLmFhYy1wYWNrYWdpbmciOworI2RlZmluZSBDMl9OQU1FX1NUUkVBTV9BQUNfRk9STUFUX1NFVFRJTkcgQzJfUEFSQU1LRVlfQUFDX1BBQ0tBR0lORworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBQTEFURk9STS1ERUZJTkVEIFBBUkFNRVRFUlMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworLyoqCisgKiBQbGF0Zm9ybSBsZXZlbCBhbmQgZmVhdHVyZXMuCisgKi8KK2VudW0gQzJDb25maWc6OnBsYXRmb3JtX2xldmVsX3QgOiB1aW50MzJfdCB7CisgICAgUExBVEZPUk1fUCwgICAvLy88IHN1cHBvcnQgZm9yIEFuZHJvaWQgOS4wIGZlYXR1cmUgc2V0Cit9OworCisvLyByZWFkLW9ubHkKK3R5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMlNldHRpbmcsIEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8QzJDb25maWc6OnBsYXRmb3JtX2xldmVsX3Q+LAorICAgICAgICAgICAgICAgIGtQYXJhbUluZGV4UGxhdGZvcm1MZXZlbD4KKyAgICAgICAgQzJQbGF0Zm9ybUxldmVsU2V0dGluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX1BMQVRGT1JNX0xFVkVMW10gPSAiYXBpLnBsYXRmb3JtLWxldmVsIjsKKworZW51bSBDMkNvbmZpZzo6cGxhdGZvcm1fZmVhdHVyZV90IDogdWludDY0X3QgeworICAgIC8vIG5vIHBsYXRmb3JtLXNwZWNpZmljIGZlYXR1cmVzIGhhdmUgYmVlbiBkZWZpbmVkCit9OworCisvLyByZWFkLW9ubHkKK3R5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMlNldHRpbmcsIEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8QzJDb25maWc6OnBsYXRmb3JtX2ZlYXR1cmVfdD4sCisgICAgICAgICAgICAgICAga1BhcmFtSW5kZXhQbGF0Zm9ybUZlYXR1cmVzPgorICAgICAgICBDMlBsYXRmb3JtRmVhdHVyZXNTZXR0aW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfUExBVEZPUk1fRkVBVFVSRVNbXSA9ICJhcGkucGxhdGZvcm0tZmVhdHVyZXMiOworCisvKioKKyAqIFRoaXMgc3RydWN0dXJlIGRlc2NyaWJlcyB0aGUgcHJlZmVycmVkIGlvbiBhbGxvY2F0aW9uIHBhcmFtZXRlcnMgZm9yIGEgZ2l2ZW4gbWVtb3J5IHVzYWdlLgorICovCitzdHJ1Y3QgQzJTdG9yZUlvblVzYWdlU3RydWN0IHsKKyAgICBpbmxpbmUgQzJTdG9yZUlvblVzYWdlU3RydWN0KCkgeworICAgICAgICBtZW1zZXQodGhpcywgMCwgc2l6ZW9mKCp0aGlzKSk7CisgICAgfQorCisgICAgaW5saW5lIEMyU3RvcmVJb25Vc2FnZVN0cnVjdCh1aW50NjRfdCB1c2FnZV8sIHVpbnQzMl90IGNhcGFjaXR5XykKKyAgICAgICAgOiB1c2FnZSh1c2FnZV8pLCBjYXBhY2l0eShjYXBhY2l0eV8pLCBoZWFwTWFzaygwKSwgYWxsb2NGbGFncygwKSwgbWluQWxpZ25tZW50KDApIHsgfQorCisgICAgdWludDY0X3QgdXNhZ2U7ICAgICAgICAvLy88IEMyTWVtb3J5VXNhZ2UKKyAgICB1aW50MzJfdCBjYXBhY2l0eTsgICAgIC8vLzwgY2FwYWNpdHkKKyAgICBpbnQzMl90IGhlYXBNYXNrOyAgICAgIC8vLzwgaW9uIGhlYXBNYXNrCisgICAgaW50MzJfdCBhbGxvY0ZsYWdzOyAgICAvLy88IGlvbiBhbGxvY2F0aW9uIGZsYWdzCisgICAgdWludDMyX3QgbWluQWxpZ25tZW50OyAvLy88IG1pbmltdW0gYWxpZ25tZW50CisKKyAgICBERUZJTkVfQU5EX0RFU0NSSUJFX0MyU1RSVUNUKFN0b3JlSW9uVXNhZ2UpCisgICAgQzJGSUVMRCh1c2FnZSwgInVzYWdlIikKKyAgICBDMkZJRUxEKGNhcGFjaXR5LCAiY2FwYWNpdHkiKQorICAgIEMyRklFTEQoaGVhcE1hc2ssICJoZWFwLW1hc2siKQorICAgIEMyRklFTEQoYWxsb2NGbGFncywgImFsbG9jLWZsYWdzIikKKyAgICBDMkZJRUxEKG1pbkFsaWdubWVudCwgIm1pbi1hbGlnbm1lbnQiKQorfTsKKworLy8gc3RvcmUsIHByaXZhdGUKK3R5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMkluZm8sIEMyU3RvcmVJb25Vc2FnZVN0cnVjdCwga1BhcmFtSW5kZXhTdG9yZUlvblVzYWdlPgorICAgICAgICBDMlN0b3JlSW9uVXNhZ2VJbmZvOworCisvKioKKyAqIEZsZXhpYmxlIHBpeGVsIGZvcm1hdCBkZXNjcmlwdG9ycworICovCitzdHJ1Y3QgQzJGbGV4aWJsZVBpeGVsRm9ybWF0RGVzY3JpcHRvclN0cnVjdCB7CisgICAgdWludDMyX3QgcGl4ZWxGb3JtYXQ7CisgICAgdWludDMyX3QgYml0RGVwdGg7CisgICAgQzJDb2xvcjo6c3Vic2FtcGxpbmdfdCBzdWJzYW1wbGluZzsKKyAgICBDMkNvbG9yOjpwbGFuZV9sYXlvdXRfdCBsYXlvdXQ7CisKKyAgICBERUZJTkVfQU5EX0RFU0NSSUJFX0MyU1RSVUNUKEZsZXhpYmxlUGl4ZWxGb3JtYXREZXNjcmlwdG9yKQorICAgIEMyRklFTEQocGl4ZWxGb3JtYXQsICJwaXhlbC1mb3JtYXQiKQorICAgIEMyRklFTEQoYml0RGVwdGgsICJiaXQtZGVwdGgiKQorICAgIEMyRklFTEQoc3Vic2FtcGxpbmcsICJzdWJzYW1wbGluZyIpCisgICAgQzJGSUVMRChsYXlvdXQsICJsYXlvdXQiKQorfTsKKworLyoqCisgKiBQbGFuZSBsYXlvdXQgb2YgZmxleGlibGUgcGl4ZWwgZm9ybWF0cy4KKyAqCisgKiBicHA6IGJ5dGVzIHBlciBjb2xvciBjb21wb25lbnQsIGUuZy4gMSBmb3IgOC1iaXQgZm9ybWF0cywgYW5kIDIgZm9yIDEwLTE2LWJpdCBmb3JtYXRzLgorICovCitDMkVOVU0oQzJDb2xvcjo6cGxhbmVfbGF5b3V0X3QsIHVpbnQzMl90LAorICAgICAgIC8qKiBVbmtub3duIGxheW91dCAqLworICAgICAgIFVOS05PV05fTEFZT1VULAorCisgICAgICAgLyoqIFBsYW5hciBsYXlvdXQgd2l0aCByb3dzIG9mIGVhY2ggcGxhbmUgcGFja2VkIChjb2xJbmMgPSBicHApICovCisgICAgICAgUExBTkFSX1BBQ0tFRCwKKworICAgICAgIC8qKiBTZW1pcGxhbmFyIGxheW91dCB3aXRoIHJvd3Mgb2YgZWFjaCBwbGFuZSBwYWNrZWQgKGNvbEluY19ZL0EgPSBicHAgKHBsYW5hciksCisgICAgICAgICogIGNvbEluY19DYi9DciA9IDIqYnBwIChpbnRlcmxlYXZlZCkuIFVzZWQgb25seSBmb3IgWVVWKEEpIGZvcm1hdHMuICovCisgICAgICAgU0VNSVBMQU5BUl9QQUNLRUQsCisKKyAgICAgICAvKiogSW50ZXJsZWF2ZWQgcGFja2VkLiBjb2xJbmMgPSBOKmJwcCAoTiBhcmUgdGhlIG51bWJlciBvZiBjb2xvciBjb21wb25lbnRzKSAqLworICAgICAgIElOVEVSTEVBVkVEX1BBQ0tFRCwKKworICAgICAgIC8qKiBJbnRlcmxlYXZlZCBhbGlnbmVkLiBjb2xJbmMgPSBzbWFsbGVzdCBwb3dlciBvZiAyID49IE4qYnBwIChOIGFyZSB0aGUgbnVtYmVyIG9mIGNvbG9yCisgICAgICAgICogIGNvbXBvbmVudHMpICovCisgICAgICAgSU5URVJMRUFWRURfQUxJR05FRAorKQorCit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJJbmZvLCBDMlNpbXBsZUFycmF5U3RydWN0PEMyRmxleGlibGVQaXhlbEZvcm1hdERlc2NyaXB0b3JTdHJ1Y3Q+LAorICAgICAgICAgICAgICAgIGtQYXJhbUluZGV4RmxleGlibGVQaXhlbEZvcm1hdERlc2NyaXB0b3JzPgorICAgICAgICBDMlN0b3JlRmxleGlibGVQaXhlbEZvcm1hdERlc2NyaXB0b3JzSW5mbzsKKworLyoqCisgKiBUaGlzIHN0cnVjdHVyZSBkZXNjcmliZXMgdGhlIGFuZHJvaWQgZGF0YXNwYWNlIGZvciBhIHJhdyB2aWRlby9pbWFnZSBmcmFtZS4KKyAqLwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJVaW50MzJWYWx1ZSwga1BhcmFtSW5kZXhEYXRhU3BhY2U+IEMyU3RyZWFtRGF0YVNwYWNlSW5mbzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0RBVEFfU1BBQ0VbXSA9ICJyYXcuZGF0YS1zcGFjZSI7CisKKy8qKgorICogVGhpcyBzdHJ1Y3R1cmUgZGVzY3JpYmVzIHRoZSBhbmRyb2lkIHN1cmZhY2Ugc2NhbGluZyBtb2RlIGZvciBhIHJhdyB2aWRlby9pbWFnZSBmcmFtZS4KKyAqLwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJVaW50MzJWYWx1ZSwga1BhcmFtSW5kZXhTdXJmYWNlU2NhbGluZz4gQzJTdHJlYW1TdXJmYWNlU2NhbGluZ0luZm87Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9TVVJGQUNFX1NDQUxJTkdfTU9ERVtdID0gInJhdy5zdXJmYWNlLXNjYWxpbmciOworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gSU5QVVQgU1VSRkFDRSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworLyoqCisgKiBJbnB1dCBzdXJmYWNlIEVPUworICovCit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJUdW5pbmcsIEMyRWFzeUJvb2xWYWx1ZSwga1BhcmFtSW5kZXhJbnB1dFN1cmZhY2VFb3M+CisgICAgICAgIEMySW5wdXRTdXJmYWNlRW9zVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfSU5QVVRfU1VSRkFDRV9FT1NbXSA9ICJpbnB1dC1zdXJmYWNlLmVvcyI7CisjZGVmaW5lIEMyX05BTUVfSU5QVVRfU1VSRkFDRV9FT1NfVFVOSU5HIEMyX1BBUkFNS0VZX0lOUFVUX1NVUkZBQ0VfRU9TCisKKy8qKgorICogU3RhcnQvc3VzcGVuZC9yZXN1bWUvc3RvcCBjb250cm9scyBhbmQgdGltZXN0YW1wcyBmb3IgaW5wdXQgc3VyZmFjZS4KKyAqCisgKiBUT0RPOiBtYWtlIHRoZXNlIGNvdW50ZXJzCisgKi8KKworc3RydWN0IEMyVGltZWRDb250cm9sU3RydWN0IHsKKyAgICBjMl9ib29sX3QgZW5hYmxlZDsgLy8vPCBjb250cm9sIGlzIGVuYWJsZWQKKyAgICBpbnQ2NF90IHRpbWVzdGFtcDsgLy8vPCBpZiBlbmFibGVkLCB0aW1lIHRoZSBjb250cm9sIHNob3VsZCB0YWtlIGVmZmVjdAorCisgICAgQzJUaW1lZENvbnRyb2xTdHJ1Y3QoKQorICAgICAgICA6IGVuYWJsZWQoQzJfRkFMU0UpLCB0aW1lc3RhbXAoMCkgeyB9CisKKyAgICAvKiBpbXBsaWNpdCAqLyBDMlRpbWVkQ29udHJvbFN0cnVjdCh1aW50NjRfdCB0aW1lc3RhbXBfKQorICAgICAgICA6IGVuYWJsZWQoQzJfVFJVRSksIHRpbWVzdGFtcCh0aW1lc3RhbXBfKSB7IH0KKworICAgIERFRklORV9BTkRfREVTQ1JJQkVfQzJTVFJVQ1QoVGltZWRDb250cm9sKQorICAgIEMyRklFTEQoZW5hYmxlZCwgICAiZW5hYmxlZCIpCisgICAgQzJGSUVMRCh0aW1lc3RhbXAsICJ0aW1lc3RhbXAiKQorfTsKKwordHlwZWRlZiBDMlBvcnRQYXJhbTxDMlR1bmluZywgQzJUaW1lZENvbnRyb2xTdHJ1Y3QsIGtQYXJhbUluZGV4U3RhcnRBdD4KKyAgICAgICAgQzJQb3J0U3RhcnRUaW1lc3RhbXBUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9JTlBVVF9TVVJGQUNFX1NUQVJUX0FUW10gPSAiaW5wdXQtc3VyZmFjZS5zdGFydCI7Cit0eXBlZGVmIEMyUG9ydFBhcmFtPEMyVHVuaW5nLCBDMlRpbWVkQ29udHJvbFN0cnVjdCwga1BhcmFtSW5kZXhTdXNwZW5kQXQ+CisgICAgICAgIEMyUG9ydFN1c3BlbmRUaW1lc3RhbXBUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9JTlBVVF9TVVJGQUNFX1NVU1BFTkRfQVRbXSA9ICJpbnB1dC1zdXJmYWNlLnN1c3BlbmQiOwordHlwZWRlZiBDMlBvcnRQYXJhbTxDMlR1bmluZywgQzJUaW1lZENvbnRyb2xTdHJ1Y3QsIGtQYXJhbUluZGV4UmVzdW1lQXQ+CisgICAgICAgIEMyUG9ydFJlc3VtZVRpbWVzdGFtcFR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0lOUFVUX1NVUkZBQ0VfUkVTVU1FX0FUW10gPSAiaW5wdXQtc3VyZmFjZS5yZXN1bWUiOwordHlwZWRlZiBDMlBvcnRQYXJhbTxDMlR1bmluZywgQzJUaW1lZENvbnRyb2xTdHJ1Y3QsIGtQYXJhbUluZGV4U3RvcEF0PgorICAgICAgICBDMlBvcnRTdG9wVGltZXN0YW1wVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfSU5QVVRfU1VSRkFDRV9TVE9QX0FUW10gPSAiaW5wdXQtc3VyZmFjZS5zdG9wIjsKKworLyoqCisgKiBUaW1lIG9mZnNldCBmb3IgaW5wdXQgc3VyZmFjZS4gSW5wdXQgdGltZXN0YW1wIHRvIGNvZGVjIGlzIHN1cmZhY2UgYnVmZmVyIHRpbWVzdGFtcCBwbHVzIHRoaXMKKyAqIHRpbWUgb2Zmc2V0LgorICovCit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJUdW5pbmcsIEMySW50NjRWYWx1ZSwga1BhcmFtSW5kZXhUaW1lT2Zmc2V0PiBDMkNvbXBvbmVudFRpbWVPZmZzZXRUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9JTlBVVF9TVVJGQUNFX1RJTUVfT0ZGU0VUW10gPSAiaW5wdXQtc3VyZmFjZS50aW1lLW9mZnNldCI7CisKKy8qKgorICogTWluaW11bSBmcHMgZm9yIGlucHV0IHN1cmZhY2UuCisgKgorICogUmVwZWF0IGZyYW1lIHRvIG1lZXQgdGhpcy4KKyAqLwordHlwZWRlZiBDMlBvcnRQYXJhbTxDMlR1bmluZywgQzJGbG9hdFZhbHVlLCBrUGFyYW1JbmRleE1pbkZyYW1lUmF0ZT4gQzJQb3J0TWluRnJhbWVSYXRlVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfSU5QVVRfU1VSRkFDRV9NSU5fRlJBTUVfUkFURVtdID0gImlucHV0LXN1cmZhY2UubWluLWZyYW1lLXJhdGUiOworCisvKioKKyAqIFRpbWVzdGFtcCBhZGp1c3RtZW50IChvdmVycmlkZSkgZm9yIGlucHV0IHN1cmZhY2UgYnVmZmVycy4gVGhlc2UgY29udHJvbCB0aGUgaW5wdXQgdGltZXN0YW1wCisgKiBmZWQgdG8gdGhlIGNvZGVjLCBidXQgZG8gbm90IGltcGFjdCB0aGUgb3V0cHV0IHRpbWVzdGFtcC4KKyAqLworc3RydWN0IEMyVGltZXN0YW1wR2FwQWRqdXN0bWVudFN0cnVjdCB7CisgICAgLy8vIGNvbnRyb2wgbW9kZXMKKyAgICBlbnVtIG1vZGVfdCA6IHVpbnQzMl90OworCisgICAgaW5saW5lIEMyVGltZXN0YW1wR2FwQWRqdXN0bWVudFN0cnVjdCgpOworCisgICAgaW5saW5lIEMyVGltZXN0YW1wR2FwQWRqdXN0bWVudFN0cnVjdChtb2RlX3QgbW9kZV8sIHVpbnQ2NF90IHZhbHVlXykKKyAgICAgICAgOiBtb2RlKG1vZGVfKSwgdmFsdWUodmFsdWVfKSB7IH0KKworICAgIG1vZGVfdCBtb2RlOyAgICAvLy88IGNvbnRyb2wgbW9kZQorICAgIHVpbnQ2NF90IHZhbHVlOyAvLy88IGNvbnRyb2wgdmFsdWUgZm9yIGdhcCBiZXR3ZWVuIHR3byB0aW1lc3RhbXAKKworICAgIERFRklORV9BTkRfREVTQ1JJQkVfQzJTVFJVQ1QoVGltZXN0YW1wR2FwQWRqdXN0bWVudCkKKyAgICBDMkZJRUxEKG1vZGUsICJtb2RlIikKKyAgICBDMkZJRUxEKHZhbHVlLCAidmFsdWUiKQorfTsKKworQzJFTlVNKEMyVGltZXN0YW1wR2FwQWRqdXN0bWVudFN0cnVjdDo6bW9kZV90LCB1aW50MzJfdCwKKyAgICBOT05FLAorICAgIE1JTl9HQVAsCisgICAgRklYRURfR0FQLAorKTsKKworaW5saW5lIEMyVGltZXN0YW1wR2FwQWRqdXN0bWVudFN0cnVjdDo6QzJUaW1lc3RhbXBHYXBBZGp1c3RtZW50U3RydWN0KCkKKyAgICA6IG1vZGUoQzJUaW1lc3RhbXBHYXBBZGp1c3RtZW50U3RydWN0OjpOT05FKSwgdmFsdWUoMCkgeyB9CisKK3R5cGVkZWYgQzJQb3J0UGFyYW08QzJUdW5pbmcsIEMyVGltZXN0YW1wR2FwQWRqdXN0bWVudFN0cnVjdD4gQzJQb3J0VGltZXN0YW1wR2FwVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfSU5QVVRfU1VSRkFDRV9USU1FU1RBTVBfQURKVVNUTUVOVFtdID0gImlucHV0LXN1cmZhY2UudGltZXN0YW1wLWFkanVzdG1lbnQiOworCisvLy8gQH0KKworI2VuZGlmICAvLyBDMkNPTkZJR19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2luY2x1ZGUvQzJFbnVtLmggYi9tZWRpYS9jb2RlYzIvaW5jbHVkZS9DMkVudW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGZhZDhmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2luY2x1ZGUvQzJFbnVtLmgKQEAgLTAsMCArMSwyMjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEMyRU5VTV9IXworI2RlZmluZSBDMkVOVU1fSF8KKworI2luY2x1ZGUgPEMyUGFyYW0uaD4KKyNpbmNsdWRlIDxfQzJNYWNyb1V0aWxzLmg+CisKKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworLyoqIFxmaWxlCisgKiBUb29scyBmb3IgZWFzaWVyIGVudW0gc3VwcG9ydC4KKyAqLworCisvLy8gXGNvbmQgSU5URVJOQUwKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBVVElMSVRJRVMgRk9SIEVOVU1FUkFUSU9OIFJFRkxFQ1RJT04gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioKKyAqIFV0aWxpdHkgY2xhc3MgdGhhdCBhbGxvd3MgaWdub3JpbmcgZW51bSB2YWx1ZSBhc3NpZ25tZW50IChlLmcuIGJvdGggJyhfQzJFbnVtQ29uc3Qpa1ZhbHVlID0geCcKKyAqIGFuZCAnKF9DMkVudW1Db25zdClrVmFsdWUnIHdpbGwgZXZhbCB0byBrVmFsdWUuCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitjbGFzcyBfQzJFbnVtQ29uc3QgeworcHVibGljOgorICAgIC8vIGltcGxpY2l0IGNvbnZlcnNpb24gZnJvbSBUCisgICAgaW5saW5lIF9DMkVudW1Db25zdChUIHZhbHVlKSA6IF9tVmFsdWUodmFsdWUpIHt9CisgICAgLy8gaW1wbGljaXQgY29udmVyc2lvbiB0byBUCisgICAgaW5saW5lIG9wZXJhdG9yIFQoKSB7IHJldHVybiBfbVZhbHVlOyB9CisgICAgLy8gaW1wbGljaXQgY29udmVyc2lvbiB0byBDMlZhbHVlOjpQcmltaXRpdmUKKyAgICBpbmxpbmUgb3BlcmF0b3IgQzJWYWx1ZTo6UHJpbWl0aXZlKCkgeyByZXR1cm4gKFQpX21WYWx1ZTsgfQorICAgIC8vIGlnbm9yZSBhc3NpZ25tZW50IGFuZCByZXR1cm4gVCBoZXJlIHRvIGF2b2lkIGltcGxpY2l0IGNvbnZlcnNpb24gdG8gVCBsYXRlcgorICAgIGlubGluZSBUICZvcGVyYXRvciA9KFQgdmFsdWUgX191bnVzZWQpIHsgcmV0dXJuIF9tVmFsdWU7IH0KK3ByaXZhdGU6CisgICAgVCBfbVZhbHVlOworfTsKKworLy8vIG1hcHBlciB0byBnZXQgbmFtZSBvZiBlbnVtCisvLy8gXG5vdGUgdGhpcyB3aWxsIGNvbnRhaW4gYW55IGluaXRpYWxpemF0aW9uLCB3aGljaCB3ZSB3aWxsIHJlbW92ZSB3aGVuIGNvbnZlcnRpbmcgdG8gbG93ZXItY2FzZQorI2RlZmluZSBfQzJfR0VUX0VOVU1fTkFNRSh4LCB5KSAjeAorLy8vIG1hcHBlciB0byBnZXQgdmFsdWUgb2YgZW51bQorI2RlZmluZSBfQzJfR0VUX0VOVU1fVkFMVUUoeCwgdHlwZSkgKF9DMkVudW1Db25zdDx0eXBlPil4CisKKy8vLyBcZW5kY29uZAorCitjbGFzcyBfQzJFbnVtVXRpbHMgeworICAgIHN0YXRpYyBDMlN0cmluZyBjYW1lbENhc2VUb0Rhc2hlZChDMlN0cmluZyBuYW1lKTsKKworICAgIHN0YXRpYyBzdGQ6OnZlY3RvcjxDMlN0cmluZz4gc2FuaXRpemVFbnVtVmFsdWVOYW1lcygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyU3RyaW5nTGl0ZXJhbD4gbmFtZXMsCisgICAgICAgICAgICBDMlN0cmluZ0xpdGVyYWwgX3ByZWZpeCA9IG51bGxwdHIpOworCisgICAgZnJpZW5kIGNsYXNzIEMyVXRpbFRlc3RfRW51bVV0aWxzVGVzdF9UZXN0OworCitwdWJsaWM6CisgICAgLy8gdGhpcyBtYXkgbm90IGJlIHVzZWQuLi4KKyAgICBzdGF0aWMgQzJfSElERSBzdGQ6OnZlY3RvcjxDMlN0cmluZz4gcGFyc2VFbnVtVmFsdWVzRnJvbVN0cmluZyhDMlN0cmluZ0xpdGVyYWwgdmFsdWUpOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBzdGF0aWMgQzJfSElERSBDMkZpZWxkRGVzY3JpcHRvcjo6TmFtZWRWYWx1ZXNUeXBlIHNhbml0aXplRW51bVZhbHVlcygKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFQ+IHZhbHVlcywKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEMyU3RyaW5nTGl0ZXJhbD4gbmFtZXMsCisgICAgICAgICAgICBDMlN0cmluZ0xpdGVyYWwgcHJlZml4ID0gbnVsbHB0cikgeworICAgICAgICBDMkZpZWxkRGVzY3JpcHRvcjo6TmFtZWRWYWx1ZXNUeXBlIG5hbWVkVmFsdWVzOworICAgICAgICBzdGQ6OnZlY3RvcjxDMlN0cmluZz4gc2FuaXRpemVkTmFtZXMgPSBzYW5pdGl6ZUVudW1WYWx1ZU5hbWVzKG5hbWVzLCBwcmVmaXgpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHZhbHVlcy5zaXplKCkgJiYgaSA8IHNhbml0aXplZE5hbWVzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBuYW1lZFZhbHVlcy5lbXBsYWNlX2JhY2soc2FuaXRpemVkTmFtZXNbaV0sIHZhbHVlc1tpXSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5hbWVkVmFsdWVzOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEU+CisgICAgc3RhdGljIEMyX0hJREUgQzJGaWVsZERlc2NyaXB0b3I6Ok5hbWVkVmFsdWVzVHlwZSBjdXN0b21FbnVtVmFsdWVzKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPEMyU3RyaW5nTGl0ZXJhbCwgRT4+IGl0ZW1zKSB7CisgICAgICAgIEMyRmllbGREZXNjcmlwdG9yOjpOYW1lZFZhbHVlc1R5cGUgbmFtZWRWYWx1ZXM7CisgICAgICAgIGZvciAoYXV0byAmaXRlbSA6IGl0ZW1zKSB7CisgICAgICAgICAgICBuYW1lZFZhbHVlcy5lbXBsYWNlX2JhY2soaXRlbS5maXJzdCwgaXRlbS5zZWNvbmQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuYW1lZFZhbHVlczsKKyAgICB9Cit9OworCisjZGVmaW5lIERFRklORV9DMl9FTlVNX1ZBTFVFX0FVVE9fSEVMUEVSKG5hbWUsIHR5cGUsIHByZWZpeCwgLi4uKSBcCisgICAgX0RFRklORV9DMl9FTlVNX1ZBTFVFX0FVVE9fSEVMUEVSKF9fQzJfR0VORVJBVEVfR0xPQkFMX1ZBUlNfXywgbmFtZSwgdHlwZSwgcHJlZml4LCBcCisgICAgICAgICAgICAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfREVGSU5FX0MyX0VOVU1fVkFMVUVfQVVUT19IRUxQRVIoZW5hYmxlZCwgbmFtZSwgdHlwZSwgcHJlZml4LCAuLi4pIFwKKyAgICBfX0RFRklORV9DMl9FTlVNX1ZBTFVFX0FVVE9fSEVMUEVSKGVuYWJsZWQsIG5hbWUsIHR5cGUsIHByZWZpeCwgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX19ERUZJTkVfQzJfRU5VTV9WQUxVRV9BVVRPX0hFTFBFUihlbmFibGVkLCBuYW1lLCB0eXBlLCBwcmVmaXgsIC4uLikgXAorICAgIF9fX0RFRklORV9DMl9FTlVNX1ZBTFVFX0FVVE9fSEVMUEVSIyNlbmFibGVkKG5hbWUsIHR5cGUsIHByZWZpeCwgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX19fREVGSU5FX0MyX0VOVU1fVkFMVUVfQVVUT19IRUxQRVIobmFtZSwgdHlwZSwgcHJlZml4LCAuLi4pIFwKK3RlbXBsYXRlPD4gXAorQzJGaWVsZERlc2NyaXB0b3I6Ok5hbWVkVmFsdWVzVHlwZSBDMkZpZWxkRGVzY3JpcHRvcjo6bmFtZWRWYWx1ZXNGb3IoY29uc3QgbmFtZSAmciBfX3VudXNlZCkgeyBcCisgICAgcmV0dXJuIF9DMkVudW1VdGlsczo6c2FuaXRpemVFbnVtVmFsdWVzKCBcCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDMlZhbHVlOjpQcmltaXRpdmU+IHsgX0MyX01BUChfQzJfR0VUX0VOVU1fVkFMVUUsIHR5cGUsIF9fVkFfQVJHU19fKSB9LCBcCisgICAgICAgICAgICB7IF9DMl9NQVAoX0MyX0dFVF9FTlVNX05BTUUsIHR5cGUsIF9fVkFfQVJHU19fKSB9LCBcCisgICAgICAgICAgICBwcmVmaXgpOyBcCit9CisjZGVmaW5lIF9fX0RFRklORV9DMl9FTlVNX1ZBTFVFX0FVVE9fSEVMUEVSX19DMl9HRU5FUkFURV9HTE9CQUxfVkFSU19fKG5hbWUsIHR5cGUsIHByZWZpeCwgLi4uKQorCisjZGVmaW5lIERFRklORV9DMl9FTlVNX1ZBTFVFX0NVU1RPTV9IRUxQRVIobmFtZSwgbmFtZXMpIFwKKyAgICBfREVGSU5FX0MyX0VOVU1fVkFMVUVfQ1VTVE9NX0hFTFBFUihfX0MyX0dFTkVSQVRFX0dMT0JBTF9WQVJTX18sIG5hbWUsIG5hbWVzKQorI2RlZmluZSBfREVGSU5FX0MyX0VOVU1fVkFMVUVfQ1VTVE9NX0hFTFBFUihlbmFibGVkLCBuYW1lLCBuYW1lcykgXAorICAgIF9fREVGSU5FX0MyX0VOVU1fVkFMVUVfQ1VTVE9NX0hFTFBFUihlbmFibGVkLCBuYW1lLCBuYW1lcykKKyNkZWZpbmUgX19ERUZJTkVfQzJfRU5VTV9WQUxVRV9DVVNUT01fSEVMUEVSKGVuYWJsZWQsIG5hbWUsIG5hbWVzKSBcCisgICAgX19fREVGSU5FX0MyX0VOVU1fVkFMVUVfQ1VTVE9NX0hFTFBFUiMjZW5hYmxlZChuYW1lLCBuYW1lcykKKyNkZWZpbmUgX19fREVGSU5FX0MyX0VOVU1fVkFMVUVfQ1VTVE9NX0hFTFBFUihuYW1lLCBuYW1lcykgXAordGVtcGxhdGU8PiBcCitDMkZpZWxkRGVzY3JpcHRvcjo6TmFtZWRWYWx1ZXNUeXBlIEMyRmllbGREZXNjcmlwdG9yOjpuYW1lZFZhbHVlc0Zvcihjb25zdCBuYW1lICZyIF9fdW51c2VkKSB7IFwKKyAgICByZXR1cm4gX0MyRW51bVV0aWxzOjpjdXN0b21FbnVtVmFsdWVzKCBcCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8QzJTdHJpbmdMaXRlcmFsLCBuYW1lPj4gbmFtZXMpOyBcCit9CisjZGVmaW5lIF9fX0RFRklORV9DMl9FTlVNX1ZBTFVFX0NVU1RPTV9IRUxQRVJfX0MyX0dFTkVSQVRFX0dMT0JBTF9WQVJTX18obmFtZSwgbmFtZXMpCisKKy8qKgorICogRGVmaW5lcyBhbiBlbnVtIHR5cGUgd2l0aCB0aGUgZGVmYXVsdCBuYW1lZCB2YWx1ZSBtYXBwZXIuIFRoZSBkZWZhdWx0IG1hcHBlcgorICogZmluZHMgYW5kIHJlbW92ZXMgdGhlIGxvbmdlc3QgY29tbW9uIHByZWZpeCBhY3Jvc3MgYWxsIG9mIHRoZSBlbnVtIHZhbHVlIG5hbWVzLCBhbmQKKyAqIHJlcGxhY2VzIGNhbWVsLWNhc2Ugc2VwYXJhdG9ycyB3aXRoIGRhc2hlcyAoJy0nKS4KKyAqCisgKiBUaGlzIG1hY3JvIG11c3QgYmUgdXNlZCBpbiB0aGUgZ2xvYmFsIHNjb3BlIGFuZCBuYW1lc3BhY2UuCisgKgorICogIH5+fn5+fn5+fn5+fn4gKC5jcHApCisgKiAgQzJFTlVNKGMyX2VudW1fdCwgdWludDMyX3QsCisgKiAgICBDMl9WQUxVRTEsCisgKiAgICBDMl9WQUxVRTIgPSA1LAorICogICAgQzJfVkFMVUUzID0gQzJfVkFMVUUxICsgMSkKKyAqICAvLyBuYW1lZCB2YWx1ZXMgYXJlOiBDMl9WQUxVRTEgPT4gIjEiLCBDMl9WQUxVRTIgPT4gIjIiLCAuLi4KKyAqICAvLyBsb25nZXN0IGNvbW1vbiBwcmVmaXggaXMgIkMyX1ZBTFVFIgorICogIH5+fn5+fn5+fn5+fn4KKyAqCisgKiBccGFyYW0gbmFtZSBuYW1lIG9mIHRoZSBlbnVtIHR5cGUgKFRoaXMgY2FuIGJlIGFuIGlubmVyIGNsYXNzIGVudW0uKQorICogXHBhcmFtIHR5cGUgdW5kZXJseWluZyB0eXBlCisgKi8KKyNkZWZpbmUgQzJFTlVNKG5hbWUsIHR5cGUsIC4uLikgXAorZW51bSBuYW1lIDogdHlwZSB7IF9fVkFfQVJHU19fIH07IFwKK0RFRklORV9DMl9FTlVNX1ZBTFVFX0FVVE9fSEVMUEVSKG5hbWUsIHR5cGUsIG51bGxwdHIsIF9fVkFfQVJHU19fKQorCisvKioKKyAqIERlZmluZXMgYW4gZW51bSB0eXBlIHdpdGggdGhlIGRlZmF1bHQgbmFtZWQgdmFsdWUgbWFwcGVyIGJ1dCBjdXN0b20gcHJlZml4LiBUaGUgZGVmYXVsdAorICogbWFwcGVyIHJlbW92ZXMgdGhlIHByZWZpeCBmcm9tIGFsbCBvZiB0aGUgZW51bSB2YWx1ZSBuYW1lcyAoaWYgcHJlc2VudCksIGFuZAorICogaW5zZXJ0cyBkYXNoZXMgYXQgY2FtZWwtY2FzZSBzZXBhcmF0b3JzIChsb3dIaWdoIGJlY29tZXMgbG93LWhpZ2gpIGFuZCBhbHNvIHJlcGxhY2VzCisgKiBub24tbGVhZGluZyB1bmRlcnNjb3JlcyB3aXRoIGRhc2hlcyAoJy0nKS4KKyAqCisgKiBUaGlzIG1hY3JvIG11c3QgYmUgdXNlZCBpbiB0aGUgZ2xvYmFsIHNjb3BlIGFuZCBuYW1lc3BhY2UuCisgKgorICogIH5+fn5+fn5+fn5+fn4gKC5jcHApCisgKiAgQzJFTlVNX0NVU1RPTV9QUkVGSVgoYzJfZW51bV90LCB1aW50MzJfdCwgIkMyXyIsCisgKiAgICBDMl9WQUxVRTEsCisgKiAgICBDMl9WQUxVRTIgPSA1LAorICogICAgQzJfVkFMVUUzID0gQzJfVkFMVUUxICsgMSkKKyAqICAvLyBuYW1lZCB2YWx1ZXMgYXJlOiBDMl9WQUxVRTEgPT4gIlZBTFVFMSIsIEMyX1ZBTFVFMiA9PiAiVkFMVUUyIiwgLi4uCisgKiAgfn5+fn5+fn5+fn5+fgorICoKKyAqIFxwYXJhbSBuYW1lIG5hbWUgb2YgdGhlIGVudW0gdHlwZSAoVGhpcyBjYW4gYmUgYW4gaW5uZXIgY2xhc3MgZW51bS4pCisgKiBccGFyYW0gdHlwZSB1bmRlcmx5aW5nIHR5cGUKKyAqIFxwYXJhbSBwcmVmaXggcHJlZml4IHRvIHJlbW92ZQorICovCisjZGVmaW5lIEMyRU5VTV9DVVNUT01fUFJFRklYKG5hbWUsIHR5cGUsIHByZWZpeCwgLi4uKSBcCitlbnVtIG5hbWUgOiB0eXBlIHsgX19WQV9BUkdTX18gfTsgXAorREVGSU5FX0MyX0VOVU1fVkFMVUVfQVVUT19IRUxQRVIobmFtZSwgdHlwZSwgcHJlZml4LCBfX1ZBX0FSR1NfXykKKworLyoqCisgKiBEZWZpbmVzIGFuIGVudW0gdHlwZSB3aXRoIGN1c3RvbSBuYW1lcy4KKyAqCisgKiBUaGlzIG1hY3JvIG11c3QgYmUgdXNlZCBpbiB0aGUgZ2xvYmFsIHNjb3BlIGFuZCBuYW1lc3BhY2UuCisgKgorICogIH5+fn5+fn5+fn5+fn4gKC5jcHApCisgKiAgQzJFTlVNX0NVU1RPTV9OQU1FUyhTb21lU3RydWN0OjpjMl9lbnVtX3QsIHVpbnQzMl90LCAoeworICogICAgICB7ICJPbmUiLCBTb21lU3RydWN0OjpDMl9WQUxVRTEgfSwKKyAqICAgICAgeyAiVHdvIiwgU29tZVN0cnVjdDo6QzJfVkFMVUUyIH0sCisgKiAgICAgIHsgIlRocmVlIiwgU29tZVN0cnVjdDo6QzJfVkFMVUUzIH0gfSksCisgKiAgICBDMl9WQUxVRTEsCisgKiAgICBDMl9WQUxVRTIgPSA1LAorICogICAgQzJfVkFMVUUzID0gQzJfVkFMVUUxICsgMSkKKyAqCisgKiAgLy8gbmFtZWQgdmFsdWVzIGFyZTogQzJfVkFMVUUxID0+ICJPbmUiLCBDMl9WQUxVRTIgPT4gIlR3byIsIC4uLgorICogIH5+fn5+fn5+fn5+fn4KKyAqLworI2RlZmluZSBDMkVOVU1fQ1VTVE9NX05BTUVTKG5hbWUsIHR5cGUsIG5hbWVzLCAuLi4pIFwKK2VudW0gbmFtZSA6IHR5cGUgeyBfX1ZBX0FSR1NfXyB9OyBcCitERUZJTkVfQzJfRU5VTV9WQUxVRV9DVVNUT01fSEVMUEVSKG5hbWUsIG5hbWVzKQorCisvKioKKyAqIE1ha2UgZW51bXMgdXNhYmxlIGFzIHRoZWlyIGludGVncmFsIHR5cGVzLgorICoKKyAqIE5vdGU6IHRoaXMgbWFrZXMgdGhlbSBub3QgdXNhYmxlIGluIHByaW50ZigpCisgKi8KK3RlbXBsYXRlPGNsYXNzIEU+CitzdHJ1Y3QgQzJFYXN5RW51bSB7CisgICAgdXNpbmcgVSA9IHR5cGVuYW1lIHN0ZDo6dW5kZXJseWluZ190eXBlPEU+Ojp0eXBlOworICAgIEUgdmFsdWU7CisgICAgLy8gZGVmaW5lIGNvbnZlcnNpb24gZnVuY3Rpb25zCisgICAgaW5saW5lIGNvbnN0ZXhwciBvcGVyYXRvciBFKCkgY29uc3QgeyByZXR1cm4gdmFsdWU7IH0KKyAgICBpbmxpbmUgY29uc3RleHByIEMyRWFzeUVudW0oRSB2YWx1ZV8pIDogdmFsdWUodmFsdWVfKSB7IH0KKyAgICBpbmxpbmUgY29uc3RleHByIEMyRWFzeUVudW0oVSB2YWx1ZV8pIDogdmFsdWUoRSh2YWx1ZV8pKSB7IH0KKyAgICBpbmxpbmUgY29uc3RleHByIEMyRWFzeUVudW0oKSA9IGRlZmF1bHQ7Cit9OworCisvLyBtYWtlIEMyRWFzeUVudW0gYmVoYXZlIGxpa2UgYSByZWd1bGFyIGVudW0KKworbmFtZXNwYWNlIHN0ZCB7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRT4KKyAgICBzdHJ1Y3QgdW5kZXJseWluZ190eXBlPEMyRWFzeUVudW08RT4+IHsKKyAgICAgICAgdHlwZWRlZiB0eXBlbmFtZSB1bmRlcmx5aW5nX3R5cGU8RT46OnR5cGUgdHlwZTsKKyAgICB9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRT4KKyAgICBzdHJ1Y3QgaXNfZW51bTxDMkVhc3lFbnVtPEU+PiB7CisgICAgICAgIGNvbnN0ZXhwciBzdGF0aWMgYm9vbCB2YWx1ZSA9IHRydWU7CisgICAgfTsKK30KKworI2VuZGlmICAvLyBDMkVOVU1fSF8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2luY2x1ZGUvQzJQYXJhbS5oIGIvbWVkaWEvY29kZWMyL2luY2x1ZGUvQzJQYXJhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwYmUzYjMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaW5jbHVkZS9DMlBhcmFtLmgKQEAgLTAsMCArMSwxNjczIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDMlBBUkFNX0hfCisjZGVmaW5lIEMyUEFSQU1fSF8KKworI2luY2x1ZGUgPEMyLmg+CisKKyNpbmNsdWRlIDxzdGRib29sLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorCisvLy8gXGFkZHRvZ3JvdXAgUGFyYW1ldGVycworLy8vIEB7CisKKy8vLyBcZGVmZ3JvdXAgaW50ZXJuYWwgSW50ZXJuYWwgaGVscGVycy4KKworLyohCisgKiBcZmlsZQorICogUEFSQU1FVEVSUzogU0VUVElOR3MsIFRVTklOR3MsIGFuZCBJTkZPcworICogPT09CisgKgorICogVGhlc2UgcmVwcmVzZW50IG1pc2NlbGxhbmVvdXMgY29udHJvbCBhbmQgbWV0YWRhdGEgaW5mb3JtYXRpb24gYW5kIGFyZSBsaWtlbHkgY29waWVkIGludG8KKyAqIGtlcm5lbCBzcGFjZS4gVGhlcmVmb3JlLCB0aGVzZSBhcmUgQy1saWtlIHN0cnVjdHVyZXMgZGVzaWduZWQgdG8gY2FycnkganVzdCBhIHNtYWxsIGFtb3VudCBvZgorICogaW5mb3JtYXRpb24uIFdlIGFyZSB1c2luZyBDKysgdG8gYmUgYWJsZSB0byBhZGQgY29uc3RydWN0b3JzLCBhcyB3ZWxsIGFzIG5vbi12aXJ0dWFsIGFuZCBjbGFzcworICogbWV0aG9kcy4KKyAqCisgKiA9PVNwZWNpZmljYXRpb24gZGV0YWlsczoKKyAqCisgKiBSZXN0cmljdGlvbnM6CisgKiAgIC0gbXVzdCBiZSBQT0Qgc3RydWN0LCBlLmcuIG5vIHZ0YWJsZSAobm8gdmlydHVhbCBkZXN0cnVjdG9yKQorICogICAtIG11c3QgaGF2ZSB0aGUgc2FtZSBzaXplIGluIDY0LWJpdCBhbmQgMzItYml0IG1vZGUgKG5vIHNpemVfdCkKKyAqICAgLSBhcyBzdWNoLCBubyBwb2ludGVyIG1lbWJlcnMKKyAqICAgLSBzb21lIGNvbW1vbiBtZW1iZXIgZmllbGQgbmFtZXMgYXJlIHJlc2VydmVkIGFzIHRoZXkgYXJlIGRlZmluZWQgYXMgbWV0aG9kcyBmb3IgYWxsCisgKiAgICAgcGFyYW1ldGVyczoKKyAqICAgICB0aGV5IGFyZTogc2l6ZSwgdHlwZSwga2luZCwgaW5kZXggYW5kIHN0cmVhbQorICoKKyAqIEJlaGF2aW9yOgorICogLSBQYXJhbXMgY2FuIGJlIGdsb2JhbCAobm90IHJlbGF0ZWQgdG8gaW5wdXQgb3Igb3V0cHV0KSwgcmVsYXRlZCB0byBpbnB1dCBvciBvdXRwdXQsCisgKiAgIG9yIHJlbGF0ZWQgdG8gYW4gaW5wdXQvb3V0cHV0IHN0cmVhbS4KKyAqIC0gQWxsIHBhcmFtcyBhcmUgcXVlcmllZC9zZXQgdXNpbmcgYSB1bmlxdWUgcGFyYW0gaW5kZXgsIHdoaWNoIGluY29ycG9yYXRlcyBhIHBvdGVudGlhbCBzdHJlYW0KKyAqICAgaW5kZXggYW5kL29yIHBvcnQuCisgKiAtIFF1ZXJ5aW5nIChzdXBwb3J0ZWQpIHBhcmFtcyBNVVNUIG5ldmVyIGZhaWwuCisgKiAtIEFsbCBwYXJhbXMgTVVTVCBoYXZlIGRlZmF1bHQgdmFsdWVzLgorICogLSBJZiBzb21lIGZpZWxkcyBoYXZlICJ1bnN1cHBvcnRlZCIgb3IgImludmFsaWQiIHZhbHVlcyBkdXJpbmcgc2V0dGluZywgdGhpcyBTSE9VTEQgYmUKKyAqICAgY29tbXVuaWNhdGVkIHRvIHRoZSBhcHAuCisgKiAgIGEpIElkZWFsbHksIHRoaXMgc2hvdWxkIGJlIGF2b2lkZWQuICBXaGVuIHNldHRpbmcgcGFyYW1ldGVycywgaW4gZ2VuZXJhbCwgY29tcG9uZW50IHNob3VsZCBkbworICogICAgICJiZXN0IGVmZm9ydCIgdG8gYXBwbHkgYWxsIHNldHRpbmdzLiBJdCBzaG91bGQgY2hhbmdlICJpbnZhbGlkL3Vuc3VwcG9ydGVkIiB2YWx1ZXMgdG8gdGhlCisgKiAgICAgbmVhcmVzdCBzdXBwb3J0ZWQgdmFsdWVzLgorICogICAtIFRoaXMgaXMgY29tbXVuaWNhdGVkIHRvIHRoZSBjbGllbnQgYnkgY2hhbmdpbmcgdGhlIHNvdXJjZSB2YWx1ZXMgaW4gdHVuZSgpLworICogICAgIGNvbmZpZ3VyZSgpLgorICogICBiKSBJZiBmYWxsaW5nIGJhY2sgdG8gYSBzdXBwb3J0ZWQgdmFsdWUgaXMgYWJzb2x1dGVseSBpbXBvc3NpYmxlLCB0aGUgY29tcG9uZW50IFNIQUxMIHJldHVybgorICogICAgIGFuIGVycm9yIGZvciB0aGUgc3BlY2lmaWMgc2V0dGluZywgYnV0IHNob3VsZCBjb250aW51ZSB0byBhcHBseSBvdGhlciBzZXR0aW5ncy4KKyAqICAgICBUT0RPOiB0aGlzIGN1cnJlbnRseSBtYXkgcmVzdWx0IGluIHVuaW50ZW5kZWQgcmVzdWx0cy4KKyAqCisgKiAqKk5PVEU6KiogdW5saWtlIE9NWCwgcGFyYW1zIGFyZSBub3QgdmVyc2lvbmVkLiBJbnN0ZWFkLCBhIG5ldyBzdHJ1Y3Qgd2l0aCBuZXcgcGFyYW0gaW5kZXgKKyAqIFNIQUxMIGJlIGFkZGVkIGFzIG5ldyB2ZXJzaW9ucyBhcmUgcmVxdWlyZWQuCisgKgorICogVGhlIHByb3BlciBzdWJ0eXBlIChTZXR0aW5nLCBJbmZvIG9yIFBhcmFtKSBpcyBpbmNvcnBvcmF0ZWQgaW50byB0aGUgY2xhc3MgdHlwZS4gRGVmaW5lIHN0cnVjdHMKKyAqIHRvIGRlZmluZSBtdWx0aXBsZSBzdWJ0eXBlZCB2ZXJzaW9ucyBvZiByZWxhdGVkIHBhcmFtZXRlcnMuCisgKgorICogPT1JbXBsZW1lbnRhdGlvbiBkZXRhaWxzOgorICoKKyAqIC0gVXNlIG1hY3JvcyB0byBkZWZpbmUgcGFyYW1ldGVycworICogLSBBbGwgcGFyYW1ldGVycyBtdXN0IGhhdmUgYSBkZWZhdWx0IGNvbnN0cnVjdG9yCisgKiAgIC0gVGhpcyBpcyBvbmx5IHVzZWQgZm9yIGluc3RhbnRpYXRpbmcgdGhlIGNsYXNzIGluIHNvdXJjZSAoZS5nLiB3aWxsIG5vdCBiZSB1c2VkCisgKiAgICAgd2hlbiBidWlsZGluZyBhIHBhcmFtZXRlciBieSB0aGUgZnJhbWV3b3JrIGZyb20ga2V5L3ZhbHVlIHBhaXJzLikKKyAqLworCisvLy8gXGluZ3JvdXAgaW50ZXJuYWwKKworLyoqCisgKiBQYXJhbWV0ZXIgYmFzZSBjbGFzcy4KKyAqLworc3RydWN0IEMyUGFyYW0geworICAgIC8vIHBhcmFtIGluZGV4IGVuY29tcGFzc2VzIHRoZSBmb2xsb3dpbmc6CisgICAgLy8KKyAgICAvLyAtIGtpbmQgKHNldHRpbmcsIHR1bmluZywgaW5mbywgc3RydWN0KQorICAgIC8vIC0gc2NvcGUKKyAgICAvLyAgIC0gZGlyZWN0aW9uIChnbG9iYWwsIGlucHV0LCBvdXRwdXQpCisgICAgLy8gICAtIHN0cmVhbSBmbGFnCisgICAgLy8gICAtIHN0cmVhbSBJRCAodXN1YWxseSAwKQorICAgIC8vIC0gYW5kIHRoZSBwYXJhbWV0ZXIncyB0eXBlIChjb3JlIGluZGV4KQorICAgIC8vICAgLSBmbGV4aWJsZSBwYXJhbWV0ZXIgZmxhZworICAgIC8vICAgLSB2ZW5kb3IgZXh0ZW5zaW9uIGZsYWcKKyAgICAvLyAgIC0gdHlwZSBpbmRleCAodGhpcyBpbmNsdWRlcyB0aGUgdmVuZG9yIGV4dGVuc2lvbiBmbGFnKQorICAgIC8vCisgICAgLy8gbGF5b3V0OgorICAgIC8vCisgICAgLy8gICAgICAgIGtpbmQgOiA8LS0tLS0tLSBzY29wZSAtLS0tLS0tPiA6IDwtLS0tLSBjb3JlIGluZGV4IC0tLS0tPgorICAgIC8vICAgICAgKy0tLS0tLSstLS0tLSstLS0rLS0tLS0tKy0tLS0tLS0tKy0tLS18LS0tLS0tKy0tLS0tLS0tLS0tLS0tKworICAgIC8vICAgICAgfCBraW5kIHwgZGlyIHwgLSB8c3RyZWFtfHN0cmVhbUlEfGZsZXh8dmVuZG9yfCAgdHlwZSBpbmRleCAgfAorICAgIC8vICAgICAgKy0tLS0tLSstLS0tLSstLS0rLS0tLS0tKy0tLS0tLS0tKy0tLS0rLS0tLS0tKy0tLS0tLS0tLS0tLS0tKworICAgIC8vICBiaXQ6IDMxLi4zMCAyOS4yOCAgICAgICAyNSAgIDI0IC4uIDE3ICAxNiAgICAxNSAgIDE0ICAgIC4uICAgICAwCisgICAgLy8KK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBDMlBhcmFtIGtpbmRzLCB1c2FibGUgYXMgYml0bWFwcy4KKyAgICAgKi8KKyAgICBlbnVtIGtpbmRfdCA6IHVpbnQzMl90IHsKKyAgICAgICAgTk9ORSAgICA9IDAsCisgICAgICAgIFNUUlVDVCAgPSAoMSA8PCAwKSwKKyAgICAgICAgSU5GTyAgICA9ICgxIDw8IDEpLAorICAgICAgICBTRVRUSU5HID0gKDEgPDwgMiksCisgICAgICAgIFRVTklORyAgPSAoMSA8PCAzKSB8IFNFVFRJTkcsIC8vIHR1bmluZ3MgYXJlIHNldHRpbmdzCisgICAgfTsKKworICAgIC8qKgorICAgICAqIFRoZSBwYXJhbWV0ZXIgdHlwZSBpbmRleCBzcGVjaWZpZXMgdGhlIHVuZGVybHlpbmcgcGFyYW1ldGVyIHR5cGUgb2YgYSBwYXJhbWV0ZXIgYXMKKyAgICAgKiBhbiBpbnRlZ2VyIHZhbHVlLgorICAgICAqCisgICAgICogUGFyYW1ldGVyIHR5cGVzIGFyZSBkaXZpZGVkIGludG8gdHdvIGdyb3VwczogcGxhdGZvcm0gdHlwZXMgYW5kIHZlbmRvciB0eXBlcy4KKyAgICAgKgorICAgICAqIFBsYXRmb3JtIHR5cGVzIGFyZSBkZWZpbmVkIGJ5IHRoZSBwbGF0Zm9ybSBhbmQgYXJlIGNvbW1vbiBmb3IgYWxsIGltcGxlbWVudGF0aW9ucy4KKyAgICAgKgorICAgICAqIFZlbmRvciB0eXBlcyBhcmUgZGVmaW5lZCBieSBlYWNoIHZlbmRvcnMsIHNvIHRoZXkgbWF5IGRpZmZlciBiZXR3ZWVuIGltcGxlbWVudGF0aW9ucy4KKyAgICAgKiBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IHZlbmRvciB0eXBlcyBiZSB0aGUgc2FtZSBmb3IgYWxsIGltcGxlbWVudGF0aW9ucyBieSBhIHNwZWNpZmljCisgICAgICogdmVuZG9yLgorICAgICAqLworICAgIHR5cGVkZWYgdWludDMyX3QgdHlwZV9pbmRleF90OworICAgIGVudW0gOiB1aW50MzJfdCB7CisgICAgICAgICAgICBUWVBFX0lOREVYX1ZFTkRPUl9TVEFSVCA9IDB4MDAwMDgwMDAsIC8vLzwgdmVuZG9yIGluZGljZXMgU0hBTEwgc3RhcnQgYWZ0ZXIgdGhpcworICAgIH07CisKKyAgICAvKioKKyAgICAgKiBDb3JlIGluZGV4IGlzIHRoZSB1bmRlcmx5aW5nIHBhcmFtZXRlciB0eXBlIGZvciBhIHBhcmFtZXRlci4gSXQgaXMgdXNlZCB0byBkZXNjcmliZSB0aGUKKyAgICAgKiBsYXlvdXQgb2YgdGhlIHBhcmFtZXRlciBzdHJ1Y3R1cmUgcmVnYXJkbGVzcyBvZiB0aGUgY29tcG9uZW50IG9yIHBhcmFtZXRlciBraW5kL3Njb3BlLgorICAgICAqCisgICAgICogSXQgaXMgdXNlZCB0byBpZGVudGlmeSBhbmQgZGlzdGluZ3Vpc2ggZ2xvYmFsIHBhcmFtZXRlcnMsIGFuZCBhbHNvIHBhcmFtZXRlcnMgb24gYSBnaXZlbgorICAgICAqIHBvcnQgb3Igc3RyZWFtLiBUaGV5IG11c3QgYmUgdW5pcXVlIGZvciB0aGUgc2V0IG9mIGdsb2JhbCBwYXJhbWV0ZXJzLCBhcyB3ZWxsIGFzIGZvciB0aGUKKyAgICAgKiBzZXQgb2YgcGFyYW1ldGVycyBvbiBlYWNoIHBvcnQgb3IgZWFjaCBzdHJlYW0sIGJ1dCB0aGUgc2FtZSBjb3JlIGluZGV4IGNhbiBiZSB1c2VkIGZvcgorICAgICAqIHBhcmFtZXRlcnMgb24gZGlmZmVyZW50IHN0cmVhbXMgb3IgcG9ydHMsIGFzIHdlbGwgYXMgZm9yIGdsb2JhbCBwYXJhbWV0ZXJzIGFuZCBwb3J0L3N0cmVhbQorICAgICAqIHBhcmFtZXRlcnMuCisgICAgICoKKyAgICAgKiBNdWx0aXBsZSBwYXJhbWV0ZXIgdHlwZXMgY2FuIHNoYXJlIHRoZSBzYW1lIGxheW91dC4KKyAgICAgKgorICAgICAqIFxub3RlIFRoZSBsYXlvdXQgZm9yIGFsbCBwYXJhbWV0ZXJzIHdpdGggdGhlIHNhbWUgY29yZSBpbmRleCBhY3Jvc3MgYWxsIGNvbXBvbmVudHMgbXVzdAorICAgICAqIGJlIGlkZW50aWNhbC4KKyAgICAgKi8KKyAgICBzdHJ1Y3QgQ29yZUluZGV4IHsKKyAgICAvL3B1YmxpYzoKKyAgICAgICAgZW51bSA6IHVpbnQzMl90IHsKKyAgICAgICAgICAgIElTX0ZMRVhfRkxBRyA9IDB4MDAwMTAwMDAsCisgICAgICAgIH07CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAgIGVudW0gOiB1aW50MzJfdCB7CisgICAgICAgICAgICBLSU5EX01BU0sgICAgICA9IDB4QzAwMDAwMDAsCisgICAgICAgICAgICBLSU5EX1NUUlVDVCAgICA9IDB4MDAwMDAwMDAsCisgICAgICAgICAgICBLSU5EX1RVTklORyAgICA9IDB4NDAwMDAwMDAsCisgICAgICAgICAgICBLSU5EX1NFVFRJTkcgICA9IDB4ODAwMDAwMDAsCisgICAgICAgICAgICBLSU5EX0lORk8gICAgICA9IDB4QzAwMDAwMDAsCisKKyAgICAgICAgICAgIERJUl9NQVNLICAgICAgID0gMHgzMDAwMDAwMCwKKyAgICAgICAgICAgIERJUl9HTE9CQUwgICAgID0gMHgyMDAwMDAwMCwKKyAgICAgICAgICAgIERJUl9VTkRFRklORUQgID0gRElSX01BU0ssIC8vIE1VU1QgaGF2ZSBhbGwgYml0cyBzZXQKKyAgICAgICAgICAgIERJUl9JTlBVVCAgICAgID0gMHgwMDAwMDAwMCwKKyAgICAgICAgICAgIERJUl9PVVRQVVQgICAgID0gMHgxMDAwMDAwMCwKKworICAgICAgICAgICAgSVNfU1RSRUFNX0ZMQUcgID0gMHgwMjAwMDAwMCwKKyAgICAgICAgICAgIFNUUkVBTV9JRF9NQVNLICA9IDB4MDFGRTAwMDAsCisgICAgICAgICAgICBTVFJFQU1fSURfU0hJRlQgPSAxNywKKyAgICAgICAgICAgIE1BWF9TVFJFQU1fSUQgICA9IFNUUkVBTV9JRF9NQVNLID4+IFNUUkVBTV9JRF9TSElGVCwKKyAgICAgICAgICAgIFNUUkVBTV9NQVNLICAgICA9IElTX1NUUkVBTV9GTEFHIHwgU1RSRUFNX0lEX01BU0ssCisKKyAgICAgICAgICAgIElTX1ZFTkRPUl9GTEFHICA9IDB4MDAwMDgwMDAsCisgICAgICAgICAgICBUWVBFX0lOREVYX01BU0sgPSAweDAwMDBGRkZGLAorICAgICAgICAgICAgQ09SRV9NQVNLICAgICAgID0gVFlQRV9JTkRFWF9NQVNLIHwgSVNfRkxFWF9GTEFHLAorICAgICAgICB9OworCisgICAgcHVibGljOgorICAgICAgICAvLy8gY29uc3RydWN0b3IvY29udmVyc2lvbiBmcm9tIHVpbnQzMl90CisgICAgICAgIGlubGluZSBDb3JlSW5kZXgodWludDMyX3QgaW5kZXgpIDogbUluZGV4KGluZGV4KSB7IH0KKworICAgICAgICAvLyBubyBjb252ZXJzaW9uIGZyb20gdWludDY0X3QKKyAgICAgICAgaW5saW5lIENvcmVJbmRleCh1aW50NjRfdCBpbmRleCkgPSBkZWxldGU7CisKKyAgICAgICAgLy8vIHJldHVybnMgdHJ1ZSBpZmYgdGhpcyBpcyBhIHZlbmRvciBleHRlbnNpb24gcGFyYW1ldGVyCisgICAgICAgIGlubGluZSBib29sIGlzVmVuZG9yKCkgY29uc3QgeyByZXR1cm4gbUluZGV4ICYgSVNfVkVORE9SX0ZMQUc7IH0KKworICAgICAgICAvLy8gcmV0dXJucyB0cnVlIGlmZiB0aGlzIGlzIGEgZmxleGlibGUgcGFyYW1ldGVyICh3aXRoIHZhcmlhYmxlIHNpemUpCisgICAgICAgIGlubGluZSBib29sIGlzRmxleGlibGUoKSBjb25zdCB7IHJldHVybiBtSW5kZXggJiBJU19GTEVYX0ZMQUc7IH0KKworICAgICAgICAvLy8gcmV0dXJucyB0aGUgY29yZSBpbmRleAorICAgICAgICAvLy8gVGhpcyBpcyB0aGUgY29tYmluYXRpb24gb2YgdGhlIHBhcmFtZXRlciB0eXBlIGluZGV4IGFuZCB0aGUgZmxleGlibGUgZmxhZy4KKyAgICAgICAgaW5saW5lIHVpbnQzMl90IGNvcmVJbmRleCgpIGNvbnN0IHsgcmV0dXJuIG1JbmRleCAmIENPUkVfTUFTSzsgfQorCisgICAgICAgIC8vLyByZXR1cm5zIHRoZSBwYXJhbWV0ZXIgdHlwZSBpbmRleAorICAgICAgICBpbmxpbmUgdHlwZV9pbmRleF90IHR5cGVJbmRleCgpIGNvbnN0IHsgcmV0dXJuIG1JbmRleCAmIFRZUEVfSU5ERVhfTUFTSzsgfQorCisgICAgICAgIERFRklORV9GSUVMRF9BTkRfTUFTS19CQVNFRF9DT01QQVJJU09OX09QRVJBVE9SUyhDb3JlSW5kZXgsIG1JbmRleCwgQ09SRV9NQVNLKQorCisgICAgcHJvdGVjdGVkOgorICAgICAgICB1aW50MzJfdCBtSW5kZXg7CisgICAgfTsKKworICAgIC8qKgorICAgICAqIFR5cGUgZW5jb21wYXNzZXMgdGhlIHBhcmFtZXRlcidzIGtpbmQgKHR1bmluZywgc2V0dGluZywgaW5mbyksIGl0cyBzY29wZSAod2hldGhlciB0aGUKKyAgICAgKiBwYXJhbWV0ZXIgaXMgZ2xvYmFsLCBpbnB1dCBvciBvdXRwdXQsIGFuZCB3aGV0aGVyIGl0IGlzIGZvciBhIHN0cmVhbSkgYW5kIHRoZSBpdHMgYmFzZQorICAgICAqIGluZGV4ICh3aGljaCBhbHNvIGRldGVybWluZXMgaXRzIGxheW91dCkuCisgICAgICovCisgICAgc3RydWN0IFR5cGUgOiBwdWJsaWMgQ29yZUluZGV4IHsKKyAgICAvL3B1YmxpYzoKKyAgICAgICAgLy8vIHJldHVybnMgdHJ1ZSBpZmYgdGhpcyBpcyBhIGdsb2JhbCBwYXJhbWV0ZXIgKG5vdCBmb3IgaW5wdXQgbm9yIG91dHB1dCkKKyAgICAgICAgaW5saW5lIGJvb2wgaXNHbG9iYWwoKSBjb25zdCB7IHJldHVybiAobUluZGV4ICYgRElSX01BU0spID09IERJUl9HTE9CQUw7IH0KKyAgICAgICAgLy8vIHJldHVybnMgdHJ1ZSBpZmYgdGhpcyBpcyBhbiBpbnB1dCBvciBpbnB1dCBzdHJlYW0gcGFyYW1ldGVyCisgICAgICAgIGlubGluZSBib29sIGZvcklucHV0KCkgY29uc3QgeyByZXR1cm4gKG1JbmRleCAmIERJUl9NQVNLKSA9PSBESVJfSU5QVVQ7IH0KKyAgICAgICAgLy8vIHJldHVybnMgdHJ1ZSBpZmYgdGhpcyBpcyBhbiBvdXRwdXQgb3Igb3V0cHV0IHN0cmVhbSBwYXJhbWV0ZXIKKyAgICAgICAgaW5saW5lIGJvb2wgZm9yT3V0cHV0KCkgY29uc3QgeyByZXR1cm4gKG1JbmRleCAmIERJUl9NQVNLKSA9PSBESVJfT1VUUFVUOyB9CisKKyAgICAgICAgLy8vIHJldHVybnMgdHJ1ZSBpZmYgdGhpcyBpcyBhIHN0cmVhbSBwYXJhbWV0ZXIKKyAgICAgICAgaW5saW5lIGJvb2wgZm9yU3RyZWFtKCkgY29uc3QgeyByZXR1cm4gbUluZGV4ICYgSVNfU1RSRUFNX0ZMQUc7IH0KKyAgICAgICAgLy8vIHJldHVybnMgdHJ1ZSBpZmYgdGhpcyBpcyBhIHBvcnQgKGlucHV0IG9yIG91dHB1dCkgcGFyYW1ldGVyCisgICAgICAgIGlubGluZSBib29sIGZvclBvcnQoKSBjb25zdCAgIHsgcmV0dXJuICFmb3JTdHJlYW0oKSAmJiAhaXNHbG9iYWwoKTsgfQorCisgICAgICAgIC8vLyByZXR1cm5zIHRoZSBwYXJhbWV0ZXIgdHlwZTogdGhlIHBhcmFtZXRlciBpbmRleCB3aXRob3V0IHRoZSBzdHJlYW0gSUQKKyAgICAgICAgaW5saW5lIHVpbnQzMl90IHR5cGUoKSBjb25zdCB7IHJldHVybiBtSW5kZXggJiAoflNUUkVBTV9JRF9NQVNLKTsgfQorCisgICAgICAgIC8vLyByZXR1cm4gdGhlIGtpbmQgKHN0cnVjdCwgaW5mbywgc2V0dGluZyBvciB0dW5pbmcpIG9mIHRoaXMgcGFyYW0KKyAgICAgICAgaW5saW5lIGtpbmRfdCBraW5kKCkgY29uc3QgeworICAgICAgICAgICAgc3dpdGNoIChtSW5kZXggJiBLSU5EX01BU0spIHsKKyAgICAgICAgICAgICAgICBjYXNlIEtJTkRfU1RSVUNUOiByZXR1cm4gU1RSVUNUOworICAgICAgICAgICAgICAgIGNhc2UgS0lORF9JTkZPOiByZXR1cm4gSU5GTzsKKyAgICAgICAgICAgICAgICBjYXNlIEtJTkRfU0VUVElORzogcmV0dXJuIFNFVFRJTkc7CisgICAgICAgICAgICAgICAgY2FzZSBLSU5EX1RVTklORzogcmV0dXJuIFRVTklORzsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OiByZXR1cm4gTk9ORTsgLy8gc2hvdWxkIG5vdCBoYXBwZW4KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyBjb25zdHJ1Y3Rvci9jb252ZXJzaW9uIGZyb20gdWludDMyX3QKKyAgICAgICAgaW5saW5lIFR5cGUodWludDMyX3QgaW5kZXgpIDogQ29yZUluZGV4KGluZGV4KSB7IH0KKworICAgICAgICAvLyBubyBjb252ZXJzaW9uIGZyb20gdWludDY0X3QKKyAgICAgICAgaW5saW5lIFR5cGUodWludDY0X3QgaW5kZXgpID0gZGVsZXRlOworCisgICAgICAgIERFRklORV9GSUVMRF9BTkRfTUFTS19CQVNFRF9DT01QQVJJU09OX09QRVJBVE9SUyhUeXBlLCBtSW5kZXgsIH5TVFJFQU1fSURfTUFTSykKKworICAgIHByaXZhdGU6CisgICAgICAgIGZyaWVuZCBzdHJ1Y3QgQzJQYXJhbTsgICAvLyBmb3Igc2V0UG9ydCgpCisgICAgICAgIGZyaWVuZCBzdHJ1Y3QgQzJUdW5pbmc7ICAvLyBmb3IgS0lORF9UVU5JTkcKKyAgICAgICAgZnJpZW5kIHN0cnVjdCBDMlNldHRpbmc7IC8vIGZvciBLSU5EX1NFVFRJTkcKKyAgICAgICAgZnJpZW5kIHN0cnVjdCBDMkluZm87ICAgIC8vIGZvciBLSU5EX0lORk8KKyAgICAgICAgLy8gZm9yIERJUl9HTE9CQUwKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgUywgaW50IEksIGNsYXNzIEY+IGZyaWVuZCBzdHJ1Y3QgQzJHbG9iYWxQYXJhbTsKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgUywgaW50IEksIGNsYXNzIEY+IGZyaWVuZCBzdHJ1Y3QgQzJQb3J0UGFyYW07ICAgLy8gZm9yIGtEaXIqCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFMsIGludCBJLCBjbGFzcyBGPiBmcmllbmQgc3RydWN0IEMyU3RyZWFtUGFyYW07IC8vIGZvciBrRGlyKgorICAgICAgICBmcmllbmQgc3RydWN0IF9DMlBhcmFtSW5zcGVjdG9yOyAvLyBmb3IgdGVzdGluZworCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXRzIHRoZSBwb3J0L3N0cmVhbSBkaXJlY3Rpb24uCisgICAgICAgICAqIEByZXR1cm4gdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBpZiBjb3VsZCBub3Qgc2V0IGRpcmVjdGlvbiAoZS5nLiBpdCBpcyBnbG9iYWwgcGFyYW0pLgorICAgICAgICAgKi8KKyAgICAgICAgaW5saW5lIGJvb2wgc2V0UG9ydChib29sIG91dHB1dCkgeworICAgICAgICAgICAgaWYgKGlzR2xvYmFsKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1JbmRleCA9IChtSW5kZXggJiB+RElSX01BU0spIHwgKG91dHB1dCA/IERJUl9PVVRQVVQgOiBESVJfSU5QVVQpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKKworICAgIC8qKgorICAgICAqIGluZGV4IGVuY29tcGFzc2VzIGFsbCByZW1haW5pbmcgaW5mb3JtYXRpb246IGJhc2ljYWxseSB0aGUgc3RyZWFtIElELgorICAgICAqLworICAgIHN0cnVjdCBJbmRleCA6IHB1YmxpYyBUeXBlIHsKKyAgICAgICAgLy8vIHJldHVybnMgdGhlIGluZGV4IGFzIHVpbnQzMl90CisgICAgICAgIGlubGluZSBvcGVyYXRvciB1aW50MzJfdCgpIGNvbnN0IHsgcmV0dXJuIG1JbmRleDsgfQorCisgICAgICAgIC8vLyBjb25zdHJ1Y3Rvci9jb252ZXJzaW9uIGZyb20gdWludDMyX3QKKyAgICAgICAgaW5saW5lIEluZGV4KHVpbnQzMl90IGluZGV4KSA6IFR5cGUoaW5kZXgpIHsgfQorCisgICAgICAgIC8vLyBjb3B5IGNvbnN0cnVjdG9yCisgICAgICAgIGlubGluZSBJbmRleChjb25zdCBJbmRleCAmaW5kZXgpID0gZGVmYXVsdDsKKworICAgICAgICAvLyBubyBjb252ZXJzaW9uIGZyb20gdWludDY0X3QKKyAgICAgICAgaW5saW5lIEluZGV4KHVpbnQ2NF90IGluZGV4KSA9IGRlbGV0ZTsKKworICAgICAgICAvLy8gcmV0dXJucyB0aGUgc3RyZWFtIElEIG9yIH4wIGlmIG5vdCBhIHN0cmVhbQorICAgICAgICBpbmxpbmUgdW5zaWduZWQgc3RyZWFtKCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIGZvclN0cmVhbSgpID8gcmF3U3RyZWFtKCkgOiB+MFU7CisgICAgICAgIH0KKworICAgICAgICAvLy8gUmV0dXJucyBhbiBpbmRleCB3aXRoIHN0cmVhbSBmaWVsZCBzZXQgdG8gZ2l2ZW4gc3RyZWFtLgorICAgICAgICBpbmxpbmUgSW5kZXggd2l0aFN0cmVhbSh1bnNpZ25lZCBzdHJlYW0pIGNvbnN0IHsKKyAgICAgICAgICAgIEluZGV4IGl4ID0gbUluZGV4OworICAgICAgICAgICAgKHZvaWQpaXguc2V0U3RyZWFtKHN0cmVhbSk7CisgICAgICAgICAgICByZXR1cm4gaXg7CisgICAgICAgIH0KKworICAgICAgICAvLy8gc2V0cyB0aGUgcG9ydCAoZGlyZWN0aW9uKS4gUmV0dXJucyB0cnVlIGlmZiBzdWNjZXNzZnVsLgorICAgICAgICBpbmxpbmUgSW5kZXggd2l0aFBvcnQoYm9vbCBvdXRwdXQpIGNvbnN0IHsKKyAgICAgICAgICAgIEluZGV4IGl4ID0gbUluZGV4OworICAgICAgICAgICAgKHZvaWQpaXguc2V0UG9ydChvdXRwdXQpOworICAgICAgICAgICAgcmV0dXJuIGl4OworICAgICAgICB9CisKKyAgICAgICAgREVGSU5FX0ZJRUxEX0JBU0VEX0NPTVBBUklTT05fT1BFUkFUT1JTKEluZGV4LCBtSW5kZXgpCisKKyAgICBwcml2YXRlOgorICAgICAgICBmcmllbmQgc3RydWN0IEMyUGFyYW07ICAgICAgICAgICAvLyBmb3Igc2V0U3RyZWFtLCBNYWtlU3RyZWFtSWQsIGlzVmFsaWQKKyAgICAgICAgZnJpZW5kIHN0cnVjdCBfQzJQYXJhbUluc3BlY3RvcjsgLy8gZm9yIHRlc3RpbmcKKworICAgICAgICAvKioKKyAgICAgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSB0eXBlIGlzIHZhbGlkLCBlLmcuIGRpcmVjdGlvbiBpcyBub3QgdW5kZWZpbmVkIEFORAorICAgICAgICAgKiBzdHJlYW0gaXMgMCBpZiBub3QgYSBzdHJlYW0gcGFyYW0uCisgICAgICAgICAqLworICAgICAgICBpbmxpbmUgYm9vbCBpc1ZhbGlkKCkgY29uc3QgeworICAgICAgICAgICAgLy8gdGhlcmUgaXMgbm8gVHlwZTo6aXNWYWxpZCAoZXZlbiB0aG91Z2ggc29tZSBvZiB0aGlzIGNoZWNrIGNvdWxkIGJlCisgICAgICAgICAgICAvLyBwZXJmb3JtZWQgb24gdHlwZXMpIGFzIHRoaXMgaXMgb25seSB1c2VkIG9uIGluZGV4Li4uCisgICAgICAgICAgICByZXR1cm4gKGZvclN0cmVhbSgpID8gcmF3U3RyZWFtKCkgPCBNQVhfU1RSRUFNX0lEIDogcmF3U3RyZWFtKCkgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgJiYgKG1JbmRleCAmIERJUl9NQVNLKSAhPSBESVJfVU5ERUZJTkVEOworICAgICAgICB9CisKKyAgICAgICAgLy8vIHJldHVybnMgdGhlIHJhdyBzdHJlYW0gSUQgZmllbGQKKyAgICAgICAgaW5saW5lIHVuc2lnbmVkIHJhd1N0cmVhbSgpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiAobUluZGV4ICYgU1RSRUFNX0lEX01BU0spID4+IFNUUkVBTV9JRF9TSElGVDsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyByZXR1cm5zIHRoZSBzdHJlYW1JZCBiaXRmaWVsZCBmb3IgYSBnaXZlbiB8c3RyZWFtfC4gSWYgc3RyZWFtIGlzIGludmFsaWQsCisgICAgICAgIC8vLyByZXR1cm5zIGFuIGludmFsaWQgYml0ZmllbGQuCisgICAgICAgIGlubGluZSBzdGF0aWMgdWludDMyX3QgTWFrZVN0cmVhbUlkKHVuc2lnbmVkIHN0cmVhbSkgeworICAgICAgICAgICAgLy8gc2F0dXJhdGUgc3RyZWFtIElEIChtYXggdmFsdWUgaXMgaW52YWxpZCkKKyAgICAgICAgICAgIGlmIChzdHJlYW0gPiBNQVhfU1RSRUFNX0lEKSB7CisgICAgICAgICAgICAgICAgc3RyZWFtID0gTUFYX1NUUkVBTV9JRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAoc3RyZWFtIDw8IFNUUkVBTV9JRF9TSElGVCkgJiBTVFJFQU1fSURfTUFTSzsKKyAgICAgICAgfQorCisgICAgICAgIGlubGluZSBib29sIGNvbnZlcnRUb1N0cmVhbShib29sIG91dHB1dCwgdW5zaWduZWQgc3RyZWFtKSB7CisgICAgICAgICAgICBtSW5kZXggPSAobUluZGV4ICYgfkRJUl9NQVNLKSB8IElTX1NUUkVBTV9GTEFHOworICAgICAgICAgICAgKHZvaWQpc2V0UG9ydChvdXRwdXQpOworICAgICAgICAgICAgcmV0dXJuIHNldFN0cmVhbShzdHJlYW0pOworICAgICAgICB9CisKKyAgICAgICAgaW5saW5lIHZvaWQgY29udmVydFRvUG9ydChib29sIG91dHB1dCkgeworICAgICAgICAgICAgbUluZGV4ID0gKG1JbmRleCAmIH4oRElSX01BU0sgfCBJU19TVFJFQU1fRkxBRykpOworICAgICAgICAgICAgKHZvaWQpc2V0UG9ydChvdXRwdXQpOworICAgICAgICB9CisKKyAgICAgICAgaW5saW5lIHZvaWQgY29udmVydFRvR2xvYmFsKCkgeworICAgICAgICAgICAgbUluZGV4ID0gKG1JbmRleCAmIH4oRElSX01BU0sgfCBJU19TVFJFQU1fRkxBRykpIHwgRElSX0dMT0JBTDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXRzIHRoZSBzdHJlYW0gaW5kZXguCisgICAgICAgICAqIFxyZXR1cm4gdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBpZiBjb3VsZCBub3Qgc2V0IGluZGV4IChlLmcuIG5vdCBhIHN0cmVhbSBwYXJhbSkuCisgICAgICAgICAqLworICAgICAgICBpbmxpbmUgYm9vbCBzZXRTdHJlYW0odW5zaWduZWQgc3RyZWFtKSB7CisgICAgICAgICAgICBpZiAoZm9yU3RyZWFtKCkpIHsKKyAgICAgICAgICAgICAgICBtSW5kZXggPSAobUluZGV4ICYgflNUUkVBTV9JRF9NQVNLKSB8IE1ha2VTdHJlYW1JZChzdHJlYW0pOworICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLT5zdHJlYW0oKSA8IE1BWF9TVFJFQU1fSUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9OworCitwdWJsaWM6CisgICAgLy8gcHVibGljIGdldHRlcnMgZm9yIEluZGV4IG1ldGhvZHMKKworICAgIC8vLyByZXR1cm5zIHRydWUgaWZmIHRoaXMgaXMgYSB2ZW5kb3IgZXh0ZW5zaW9uIHBhcmFtZXRlcgorICAgIGlubGluZSBib29sIGlzVmVuZG9yKCkgY29uc3QgeyByZXR1cm4gX21JbmRleC5pc1ZlbmRvcigpOyB9CisgICAgLy8vIHJldHVybnMgdHJ1ZSBpZmYgdGhpcyBpcyBhIGZsZXhpYmxlIHBhcmFtZXRlcgorICAgIGlubGluZSBib29sIGlzRmxleGlibGUoKSBjb25zdCB7IHJldHVybiBfbUluZGV4LmlzRmxleGlibGUoKTsgfQorICAgIC8vLyByZXR1cm5zIHRydWUgaWZmIHRoaXMgaXMgYSBnbG9iYWwgcGFyYW1ldGVyIChub3QgZm9yIGlucHV0IG5vciBvdXRwdXQpCisgICAgaW5saW5lIGJvb2wgaXNHbG9iYWwoKSBjb25zdCB7IHJldHVybiBfbUluZGV4LmlzR2xvYmFsKCk7IH0KKyAgICAvLy8gcmV0dXJucyB0cnVlIGlmZiB0aGlzIGlzIGFuIGlucHV0IG9yIGlucHV0IHN0cmVhbSBwYXJhbWV0ZXIKKyAgICBpbmxpbmUgYm9vbCBmb3JJbnB1dCgpIGNvbnN0IHsgcmV0dXJuIF9tSW5kZXguZm9ySW5wdXQoKTsgfQorICAgIC8vLyByZXR1cm5zIHRydWUgaWZmIHRoaXMgaXMgYW4gb3V0cHV0IG9yIG91dHB1dCBzdHJlYW0gcGFyYW1ldGVyCisgICAgaW5saW5lIGJvb2wgZm9yT3V0cHV0KCkgY29uc3QgeyByZXR1cm4gX21JbmRleC5mb3JPdXRwdXQoKTsgfQorCisgICAgLy8vIHJldHVybnMgdHJ1ZSBpZmYgdGhpcyBpcyBhIHN0cmVhbSBwYXJhbWV0ZXIKKyAgICBpbmxpbmUgYm9vbCBmb3JTdHJlYW0oKSBjb25zdCB7IHJldHVybiBfbUluZGV4LmZvclN0cmVhbSgpOyB9CisgICAgLy8vIHJldHVybnMgdHJ1ZSBpZmYgdGhpcyBpcyBhIHBvcnQgKGlucHV0IG9yIG91dHB1dCkgcGFyYW1ldGVyCisgICAgaW5saW5lIGJvb2wgZm9yUG9ydCgpIGNvbnN0ICAgeyByZXR1cm4gX21JbmRleC5mb3JQb3J0KCk7IH0KKworICAgIC8vLyByZXR1cm5zIHRoZSBzdHJlYW0gSUQgb3IgfjAgaWYgbm90IGEgc3RyZWFtCisgICAgaW5saW5lIHVuc2lnbmVkIHN0cmVhbSgpIGNvbnN0IHsgcmV0dXJuIF9tSW5kZXguc3RyZWFtKCk7IH0KKworICAgIC8vLyByZXR1cm5zIHRoZSBwYXJhbWV0ZXIgdHlwZTogdGhlIHBhcmFtZXRlciBpbmRleCB3aXRob3V0IHRoZSBzdHJlYW0gSUQKKyAgICBpbmxpbmUgVHlwZSB0eXBlKCkgY29uc3QgeyByZXR1cm4gX21JbmRleC50eXBlKCk7IH0KKworICAgIC8vLyByZXR1cm5zIHRoZSBpbmRleCBvZiB0aGlzIHBhcmFtZXRlcgorICAgIC8vLyBcdG9kbzogc2hvdWxkIHdlIHJlc3RyaWN0IHRoaXMgdG8gQzJQYXJhbUZpZWxkPworICAgIGlubGluZSB1aW50MzJfdCBpbmRleCgpIGNvbnN0IHsgcmV0dXJuICh1aW50MzJfdClfbUluZGV4OyB9CisKKyAgICAvLy8gcmV0dXJucyB0aGUgY29yZSBpbmRleCBvZiB0aGlzIHBhcmFtZXRlcgorICAgIGlubGluZSBDb3JlSW5kZXggY29yZUluZGV4KCkgY29uc3QgeyByZXR1cm4gX21JbmRleC5jb3JlSW5kZXgoKTsgfQorCisgICAgLy8vIHJldHVybnMgdGhlIGtpbmQgb2YgdGhpcyBwYXJhbWV0ZXIKKyAgICBpbmxpbmUga2luZF90IGtpbmQoKSBjb25zdCB7IHJldHVybiBfbUluZGV4LmtpbmQoKTsgfQorCisgICAgLy8vIHJldHVybnMgdGhlIHNpemUgb2YgdGhlIHBhcmFtZXRlciBvciAwIGlmIHRoZSBwYXJhbWV0ZXIgaXMgaW52YWxpZAorICAgIGlubGluZSBzaXplX3Qgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF9tU2l6ZTsgfQorCisgICAgLy8vIHJldHVybnMgdHJ1ZSBpZmYgdGhlIHBhcmFtZXRlciBpcyB2YWxpZAorICAgIGlubGluZSBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gX21JbmRleC5pc1ZhbGlkKCkgJiYgX21TaXplID4gMDsgfQorCisgICAgLy8vIHJldHVybnMgdHJ1ZSBpZmYgdGhlIHBhcmFtZXRlciBpcyBpbnZhbGlkCisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3IhKCkgY29uc3QgeyByZXR1cm4gIW9wZXJhdG9yIGJvb2woKTsgfQorCisgICAgLy8gZXF1YWxpdHkgaXMgZG9uZSBieSBtZW1jbXAgKHVzZSBlcXVhbHMoKSB0byBwcmV2ZW50IGFueSBvdmVycmVhZCkKKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEMyUGFyYW0gJm8pIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGVxdWFscyhvKSAmJiBtZW1jbXAodGhpcywgJm8sIF9tU2l6ZSkgPT0gMDsKKyAgICB9CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBDMlBhcmFtICZvKSBjb25zdCB7IHJldHVybiAhb3BlcmF0b3I9PShvKTsgfQorCisgICAgLy8vIHNhZmUocikgdHlwZSBjYXN0IGZyb20gcG9pbnRlciBhbmQgc2l6ZQorICAgIGlubGluZSBzdGF0aWMgQzJQYXJhbSogRnJvbSh2b2lkICphZGRyLCBzaXplX3QgbGVuKSB7CisgICAgICAgIC8vIF9tU2l6ZSBtdXN0IGZpdCBpbnRvIHNpemUsIGJ1dCByZWFsbHkgQzJQYXJhbSBtdXN0IGFsc28gdG8gYmUgYSB2YWxpZCBwYXJhbQorICAgICAgICBpZiAobGVuIDwgc2l6ZW9mKEMyUGFyYW0pKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICAvLyBfbVNpemUgbXVzdCBtYXRjaCBsZW5ndGgKKyAgICAgICAgQzJQYXJhbSAqcGFyYW0gPSAoQzJQYXJhbSopYWRkcjsKKyAgICAgICAgaWYgKHBhcmFtLT5fbVNpemUgIT0gbGVuKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcGFyYW07CisgICAgfQorCisgICAgLy8vIFJldHVybnMgbWFuYWdlZCBjbG9uZSBvZiB8b3JpZ3wgYXQgaGVhcC4KKyAgICBpbmxpbmUgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPiBDb3B5KGNvbnN0IEMyUGFyYW0gJm9yaWcpIHsKKyAgICAgICAgaWYgKG9yaWcuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICB9CisgICAgICAgIHZvaWQgKm1lbSA9IDo6b3BlcmF0b3IgbmV3IChvcmlnLnNpemUoKSk7CisgICAgICAgIEMyUGFyYW0gKnBhcmFtID0gbmV3IChtZW0pIEMyUGFyYW0ob3JpZy5zaXplKCksIG9yaWcuX21JbmRleCk7CisgICAgICAgIHBhcmFtLT51cGRhdGVGcm9tKG9yaWcpOworICAgICAgICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+KHBhcmFtKTsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJucyBtYW5hZ2VkIGNsb25lIG9mIHxvcmlnfCBhcyBhIHN0cmVhbSBwYXJhbWV0ZXIgYXQgaGVhcC4KKyAgICBpbmxpbmUgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPiBDb3B5QXNTdHJlYW0oCisgICAgICAgICAgICBjb25zdCBDMlBhcmFtICZvcmlnLCBib29sIG91dHB1dCwgdW5zaWduZWQgc3RyZWFtKSB7CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPiBjb3B5ID0gQ29weShvcmlnKTsKKyAgICAgICAgaWYgKGNvcHkpIHsKKyAgICAgICAgICAgIGNvcHktPl9tSW5kZXguY29udmVydFRvU3RyZWFtKG91dHB1dCwgc3RyZWFtKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY29weTsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJucyBtYW5hZ2VkIGNsb25lIG9mIHxvcmlnfCBhcyBhIHBvcnQgcGFyYW1ldGVyIGF0IGhlYXAuCisgICAgaW5saW5lIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4gQ29weUFzUG9ydChjb25zdCBDMlBhcmFtICZvcmlnLCBib29sIG91dHB1dCkgeworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4gY29weSA9IENvcHkob3JpZyk7CisgICAgICAgIGlmIChjb3B5KSB7CisgICAgICAgICAgICBjb3B5LT5fbUluZGV4LmNvbnZlcnRUb1BvcnQob3V0cHV0KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY29weTsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJucyBtYW5hZ2VkIGNsb25lIG9mIHxvcmlnfCBhcyBhIGdsb2JhbCBwYXJhbWV0ZXIgYXQgaGVhcC4KKyAgICBpbmxpbmUgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPiBDb3B5QXNHbG9iYWwoY29uc3QgQzJQYXJhbSAmb3JpZykgeworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4gY29weSA9IENvcHkob3JpZyk7CisgICAgICAgIGlmIChjb3B5KSB7CisgICAgICAgICAgICBjb3B5LT5fbUluZGV4LmNvbnZlcnRUb0dsb2JhbCgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjb3B5OworICAgIH0KKworI2lmIDAKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBQLCBjbGFzcz1kZWNsdHlwZShDMlBhcmFtKFAoKSkpPgorICAgIFAgKkFzKCkgeyByZXR1cm4gUDo6RnJvbSh0aGlzKTsgfQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFA+CisgICAgY29uc3QgUCAqQXMoKSBjb25zdCB7IHJldHVybiBjb25zdF9jYXN0PGNvbnN0IFAqPihQOjpGcm9tKGNvbnN0X2Nhc3Q8QzJQYXJhbSo+KHRoaXMpKSk7IH0KKyNlbmRpZgorCitwcm90ZWN0ZWQ6CisgICAgLy8vIHNldHMgdGhlIHN0cmVhbSBmaWVsZC4gUmV0dXJucyB0cnVlIGlmZiBzdWNjZXNzZnVsLgorICAgIGlubGluZSBib29sIHNldFN0cmVhbSh1bnNpZ25lZCBzdHJlYW0pIHsKKyAgICAgICAgcmV0dXJuIF9tSW5kZXguc2V0U3RyZWFtKHN0cmVhbSk7CisgICAgfQorCisgICAgLy8vIHNldHMgdGhlIHBvcnQgKGRpcmVjdGlvbikuIFJldHVybnMgdHJ1ZSBpZmYgc3VjY2Vzc2Z1bC4KKyAgICBpbmxpbmUgYm9vbCBzZXRQb3J0KGJvb2wgb3V0cHV0KSB7CisgICAgICAgIHJldHVybiBfbUluZGV4LnNldFBvcnQob3V0cHV0KTsKKyAgICB9CisKK3B1YmxpYzoKKyAgICAvLy8gaW52YWxpZGF0ZSB0aGlzIHBhcmFtZXRlci4gVGhlcmUgaXMgbm8gcmVjb3ZlcnkgZnJvbSB0aGlzIGNhbGw7IGUuZy4gcGFyYW1ldGVyCisgICAgLy8vIGNhbm5vdCBiZSAnY29ycmVjdGVkJyB0byBiZSB2YWxpZC4KKyAgICBpbmxpbmUgdm9pZCBpbnZhbGlkYXRlKCkgeyBfbVNpemUgPSAwOyB9CisKKyAgICAvLyBpZiBvdGhlciBpcyB0aGUgc2FtZSBraW5kIG9mICh2YWxpZCkgcGFyYW0gYXMgdGhpcywgY29weSBpdCBpbnRvIHRoaXMgYW5kIHJldHVybiB0cnVlLgorICAgIC8vIG90aGVyd2lzZSwgZG8gbm90IGNvcHkgYW55dGhpbmcsIGFuZCByZXR1cm4gZmFsc2UuCisgICAgaW5saW5lIGJvb2wgdXBkYXRlRnJvbShjb25zdCBDMlBhcmFtICZvdGhlcikgeworICAgICAgICBpZiAob3RoZXIuX21TaXplIDw9IF9tU2l6ZSAmJiBvdGhlci5fbUluZGV4ID09IF9tSW5kZXggJiYgX21TaXplID4gMCkgeworICAgICAgICAgICAgbWVtY3B5KHRoaXMsICZvdGhlciwgb3RoZXIuX21TaXplKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICAvLyByZXR1cm5zIHxvfCBpZiBpdCBpcyBhIG51bGwgcHRyLCBvciBpZiBjYW4gc3VpdGFibHkgYmUgYSBwYXJhbSBvZiBnaXZlbiB8dHlwZXwgKGUuZy4gaGFzCisgICAgLy8gc2FtZSB0eXBlIChpZ25vcmluZyBzdHJlYW0gSUQpLCBhbmQgc2l6ZSkuIE90aGVyd2lzZSwgcmV0dXJucyBudWxsLiBJZiB8Y2hlY2tEaXJ8IGlzIGZhbHNlLAorICAgIC8vIGFsbG93IHVuZGVmaW5lZCBvciBkaWZmZXJlbnQgZGlyZWN0aW9uIChlLmcuIGFzIGNvbnN0cnVjdGVkIGZyb20gQzJQb3J0UGFyYW0oKSB2cy4KKyAgICAvLyBDMlBvcnRQYXJhbTo6aW5wdXQpLCBidXQgc3RpbGwgcmVxdWlyZSBlcXVpdmFsZW50IHR5cGUgKHN0cmVhbSwgcG9ydCBvciBnbG9iYWwpOyBvdGhlcndpc2UsCisgICAgLy8gcmV0dXJuIG51bGwuCisgICAgaW5saW5lIHN0YXRpYyBjb25zdCBDMlBhcmFtKiBJZlN1aXRhYmxlKAorICAgICAgICAgICAgY29uc3QgQzJQYXJhbSogbywgc2l6ZV90IHNpemUsIFR5cGUgdHlwZSwgc2l6ZV90IGZsZXhTaXplID0gMCwgYm9vbCBjaGVja0RpciA9IHRydWUpIHsKKyAgICAgICAgaWYgKG8gPT0gbnVsbHB0ciB8fCBvLT5fbVNpemUgPCBzaXplIHx8IChmbGV4U2l6ZSAmJiAoKG8tPl9tU2l6ZSAtIHNpemUpICUgZmxleFNpemUpKSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0gZWxzZSBpZiAoY2hlY2tEaXIpIHsKKyAgICAgICAgICAgIHJldHVybiBvLT5fbUluZGV4LnR5cGUoKSA9PSB0eXBlLm1JbmRleCA/IG8gOiBudWxscHRyOworICAgICAgICB9IGVsc2UgaWYgKG8tPl9tSW5kZXguaXNHbG9iYWwoKSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gKChvLT5fbUluZGV4LnR5cGUoKSBeIHR5cGUubUluZGV4KSAmIH5UeXBlOjpESVJfTUFTSykgPyBudWxscHRyIDogbzsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vLyBiYXNlIGNvbnN0cnVjdG9yCisgICAgaW5saW5lIEMyUGFyYW0odWludDMyX3QgcGFyYW1TaXplLCBJbmRleCBwYXJhbUluZGV4KQorICAgICAgICA6IF9tU2l6ZShwYXJhbVNpemUpLAorICAgICAgICAgIF9tSW5kZXgocGFyYW1JbmRleCkgeworICAgICAgICBpZiAocGFyYW1TaXplID4gc2l6ZW9mKEMyUGFyYW0pKSB7CisgICAgICAgICAgICBtZW1zZXQodGhpcyArIDEsIDAsIHBhcmFtU2l6ZSAtIHNpemVvZihDMlBhcmFtKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLy8gYmFzZSBjb25zdHJ1Y3RvciB3aXRoIHN0cmVhbSBzZXQKKyAgICBpbmxpbmUgQzJQYXJhbSh1aW50MzJfdCBwYXJhbVNpemUsIEluZGV4IHBhcmFtSW5kZXgsIHVuc2lnbmVkIHN0cmVhbSkKKyAgICAgICAgOiBfbVNpemUocGFyYW1TaXplKSwKKyAgICAgICAgICBfbUluZGV4KHBhcmFtSW5kZXggfCBJbmRleDo6TWFrZVN0cmVhbUlkKHN0cmVhbSkpIHsKKyAgICAgICAgaWYgKHBhcmFtU2l6ZSA+IHNpemVvZihDMlBhcmFtKSkgeworICAgICAgICAgICAgbWVtc2V0KHRoaXMgKyAxLCAwLCBwYXJhbVNpemUgLSBzaXplb2YoQzJQYXJhbSkpOworICAgICAgICB9CisgICAgICAgIGlmICghZm9yU3RyZWFtKCkpIHsKKyAgICAgICAgICAgIGludmFsaWRhdGUoKTsKKyAgICAgICAgfQorICAgIH0KKworcHJpdmF0ZToKKyAgICBmcmllbmQgc3RydWN0IF9DMlBhcmFtSW5zcGVjdG9yOyAvLyBmb3IgdGVzdGluZworCisgICAgLy8vIHJldHVybnMgdHJ1ZSBpZmYgfG98IGhhcyB0aGUgc2FtZSBzaXplIGFuZCBpbmRleCBhcyB0aGlzLiBUaGlzIHBlcmZvcm1zIHRoZQorICAgIC8vLyBiYXNpYyBjaGVjayBmb3IgZXF1YWxpdHkuCisgICAgaW5saW5lIGJvb2wgZXF1YWxzKGNvbnN0IEMyUGFyYW0gJm8pIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIF9tU2l6ZSA9PSBvLl9tU2l6ZSAmJiBfbUluZGV4ID09IG8uX21JbmRleDsKKyAgICB9CisKKyAgICB1aW50MzJfdCBfbVNpemU7CisgICAgSW5kZXggX21JbmRleDsKK307CisKKy8vLyBcaW5ncm91cCBpbnRlcm5hbAorLy8vIGFsbG93IEMyUGFyYW1zIGFjY2VzcyB0byBwcml2YXRlIG1ldGhvZHMsIGUuZy4gY29uc3RydWN0b3JzCisjZGVmaW5lIEMyUEFSQU1fTUFLRV9GUklFTkRTIFwKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBVLCB0eXBlbmFtZSBTLCBpbnQgSSwgY2xhc3MgRj4gZnJpZW5kIHN0cnVjdCBDMkdsb2JhbFBhcmFtOyBcCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVSwgdHlwZW5hbWUgUywgaW50IEksIGNsYXNzIEY+IGZyaWVuZCBzdHJ1Y3QgQzJQb3J0UGFyYW07IFwKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBVLCB0eXBlbmFtZSBTLCBpbnQgSSwgY2xhc3MgRj4gZnJpZW5kIHN0cnVjdCBDMlN0cmVhbVBhcmFtOyBcCisKKy8qKgorICogU2V0dGluZyBiYXNlIHN0cnVjdHVyZSBmb3IgY29tcG9uZW50IG1ldGhvZCBzaWduYXR1cmVzLiBXcmFwIGNvbnN0cnVjdG9ycy4KKyAqLworc3RydWN0IEMyU2V0dGluZyA6IHB1YmxpYyBDMlBhcmFtIHsKK3Byb3RlY3RlZDoKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSAuLi5BcmdzPgorICAgIGlubGluZSBDMlNldHRpbmcoY29uc3QgQXJncygmLi4uIGFyZ3MpKSA6IEMyUGFyYW0oYXJncy4uLikgeyB9CitwdWJsaWM6IC8vIFRPRE8KKyAgICBlbnVtIDogdWludDMyX3QgeyBQQVJBTV9LSU5EID0gVHlwZTo6S0lORF9TRVRUSU5HIH07Cit9OworCisvKioKKyAqIFR1bmluZyBiYXNlIHN0cnVjdHVyZSBmb3IgY29tcG9uZW50IG1ldGhvZCBzaWduYXR1cmVzLiBXcmFwIGNvbnN0cnVjdG9ycy4KKyAqLworc3RydWN0IEMyVHVuaW5nIDogcHVibGljIEMyU2V0dGluZyB7Citwcm90ZWN0ZWQ6CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgLi4uQXJncz4KKyAgICBpbmxpbmUgQzJUdW5pbmcoY29uc3QgQXJncygmLi4uIGFyZ3MpKSA6IEMyU2V0dGluZyhhcmdzLi4uKSB7IH0KK3B1YmxpYzogLy8gVE9ETworICAgIGVudW0gOiB1aW50MzJfdCB7IFBBUkFNX0tJTkQgPSBUeXBlOjpLSU5EX1RVTklORyB9OworfTsKKworLyoqCisgKiBJbmZvIGJhc2Ugc3RydWN0dXJlIGZvciBjb21wb25lbnQgbWV0aG9kIHNpZ25hdHVyZXMuIFdyYXAgY29uc3RydWN0b3JzLgorICovCitzdHJ1Y3QgQzJJbmZvIDogcHVibGljIEMyUGFyYW0geworcHJvdGVjdGVkOgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIC4uLkFyZ3M+CisgICAgaW5saW5lIEMySW5mbyhjb25zdCBBcmdzKCYuLi4gYXJncykpIDogQzJQYXJhbShhcmdzLi4uKSB7IH0KK3B1YmxpYzogLy8gVE9ETworICAgIGVudW0gOiB1aW50MzJfdCB7IFBBUkFNX0tJTkQgPSBUeXBlOjpLSU5EX0lORk8gfTsKK307CisKKy8qKgorICogU3RydWN0dXJlIHVuaXF1ZWx5IHNwZWNpZnlpbmcgYSBmaWVsZCBpbiBhbiBhcmJpdHJhcnkgc3RydWN0dXJlLgorICoKKyAqIFxub3RlIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgZGlmZmVyZW50bHkgaW4gQzJGaWVsZERlc2NyaXB0b3IgdG8KKyAqIGlkZW50aWZ5IGFycmF5IGZpZWxkcywgc3VjaCB0aGF0IF9tU2l6ZSBpcyB0aGUgc2l6ZSBvZiBlYWNoIGVsZW1lbnQuIFRoaXMgaXMKKyAqIGJlY2F1c2UgdGhlIGZpZWxkIGRlc2NyaXB0b3IgY29udGFpbnMgdGhlIGFycmF5LWxlbmd0aCwgYW5kIHdlIHdhbnQgdG8ga2VlcAorICogYSByZWxldmFudCBlbGVtZW50IHNpemUgZm9yIHZhcmlhYmxlIGxlbmd0aCBhcnJheXMuCisgKi8KK3N0cnVjdCBfQzJGaWVsZElkIHsKKy8vcHVibGljOgorICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIHVzZWQgZm9yIEMyRmllbGREZXNjcmlwdG9yIHRoYXQgcmVtb3ZlcyB0aGUgYXJyYXkgZXh0ZW50LgorICAgICAqCisgICAgICogXHBhcmFtW2luXSBvZmZzZXQgcG9pbnRlciB0byB0aGUgZmllbGQgaW4gYW4gb2JqZWN0IGF0IGFkZHJlc3MgMC4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCBjbGFzcyBCPXR5cGVuYW1lIHN0ZDo6cmVtb3ZlX2V4dGVudDxUPjo6dHlwZT4KKyAgICBpbmxpbmUgX0MyRmllbGRJZChUKiBvZmZzZXQpCisgICAgICAgIDogLy8gb2Zmc2V0IGlzIGZyb20gIjAiIHNvIHdpbGwgZml0IG9uIDMyLWJpdHMKKyAgICAgICAgICBfbU9mZnNldCgodWludDMyX3QpKHVpbnRwdHJfdCkob2Zmc2V0KSksCisgICAgICAgICAgX21TaXplKHNpemVvZihCKSkgeyB9CisKKyAgICAvKioKKyAgICAgKiBEaXJlY3QgY29uc3RydWN0b3IgZnJvbSBvZmZzZXQgYW5kIHNpemUuCisgICAgICoKKyAgICAgKiBccGFyYW1baW5dIG9mZnNldCBvZmZzZXQgb2YgdGhlIGZpZWxkLgorICAgICAqIFxwYXJhbVtpbl0gc2l6ZSBzaXplIG9mIHRoZSBmaWVsZC4KKyAgICAgKi8KKyAgICBpbmxpbmUgX0MyRmllbGRJZChzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkKKyAgICAgICAgOiBfbU9mZnNldChvZmZzZXQpLCBfbVNpemUoc2l6ZSkge30KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIHVzZWQgdG8gaWRlbnRpZnkgYSBmaWVsZCBpbiBhbiBvYmplY3QuCisgICAgICoKKyAgICAgKiBccGFyYW0gVVt0eXBlXSBwb2ludGVyIHRvIHRoZSBvYmplY3QgdGhhdCBjb250YWlucyB0aGlzIGZpZWxkLiBUaGlzIGlzIG5lZWRlZCBpbiBjYXNlIHRoZQorICAgICAqICAgICAgICBmaWVsZCBpcyBpbiBhbiAoaW5oZXJpdGVkKSBiYXNlIGNsYXNzLCBpbiB3aGljaCBjYXNlIFQgd2lsbCBiZSB0aGF0IGJhc2UgY2xhc3MuCisgICAgICogXHBhcmFtIHBtW2ltXSBtZW1iZXIgcG9pbnRlciB0byB0aGUgZmllbGQKKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBSLCB0eXBlbmFtZSBULCB0eXBlbmFtZSBVLCB0eXBlbmFtZSBCPXR5cGVuYW1lIHN0ZDo6cmVtb3ZlX2V4dGVudDxSPjo6dHlwZT4KKyAgICBpbmxpbmUgX0MyRmllbGRJZChVICosIFIgVDo6KiBwbSkKKyAgICAgICAgOiBfbU9mZnNldCgodWludDMyX3QpKHVpbnRwdHJfdCkoJigoKFUqKTI1NiktPipwbSkpIC0gMjU2dSksCisgICAgICAgICAgX21TaXplKHNpemVvZihCKSkgeyB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciB1c2VkIHRvIGlkZW50aWZ5IGEgZmllbGQgaW4gYW4gb2JqZWN0LgorICAgICAqCisgICAgICogXHBhcmFtIHBtW2ltXSBtZW1iZXIgcG9pbnRlciB0byB0aGUgZmllbGQKKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBSLCB0eXBlbmFtZSBULCB0eXBlbmFtZSBCPXR5cGVuYW1lIHN0ZDo6cmVtb3ZlX2V4dGVudDxSPjo6dHlwZT4KKyAgICBpbmxpbmUgX0MyRmllbGRJZChSIFQ6OiogcG0pCisgICAgICAgIDogX21PZmZzZXQoKHVpbnQzMl90KSh1aW50cHRyX3QpKCYoKChUKikwKS0+KnBtKSkpLAorICAgICAgICAgIF9tU2l6ZShzaXplb2YoQikpIHsgfQorCisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBfQzJGaWVsZElkICZvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gX21PZmZzZXQgPT0gb3RoZXIuX21PZmZzZXQgJiYgX21TaXplID09IG90aGVyLl9tU2l6ZTsKKyAgICB9CisKKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcjwoY29uc3QgX0MyRmllbGRJZCAmb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIF9tT2Zmc2V0IDwgb3RoZXIuX21PZmZzZXQgfHwKKyAgICAgICAgICAgIC8vIE5PVEU6IG9yZGVyIHBhcmVudCBzdHJ1Y3R1cmUgYmVmb3JlIHN1YiBmaWVsZAorICAgICAgICAgICAgKF9tT2Zmc2V0ID09IG90aGVyLl9tT2Zmc2V0ICYmIF9tU2l6ZSA+IG90aGVyLl9tU2l6ZSk7CisgICAgfQorCisgICAgREVGSU5FX09USEVSX0NPTVBBUklTT05fT1BFUkFUT1JTKF9DMkZpZWxkSWQpCisKKyNpZiAwCisgICAgaW5saW5lIHVpbnQzMl90IG9mZnNldCgpIGNvbnN0IHsgcmV0dXJuIF9tT2Zmc2V0OyB9CisgICAgaW5saW5lIHVpbnQzMl90IHNpemUoKSBjb25zdCB7IHJldHVybiBfbVNpemU7IH0KKyNlbmRpZgorCisjaWYgZGVmaW5lZChGUklFTkRfVEVTVCkKKyAgICBmcmllbmQgdm9pZCBQcmludFRvKGNvbnN0IF9DMkZpZWxkSWQgJmQsIDo6c3RkOjpvc3RyZWFtKik7CisjZW5kaWYKKworcHJpdmF0ZToKKyAgICBmcmllbmQgc3RydWN0IF9DMlBhcmFtSW5zcGVjdG9yOworICAgIGZyaWVuZCBzdHJ1Y3QgQzJGaWVsZERlc2NyaXB0b3I7CisKKyAgICB1aW50MzJfdCBfbU9mZnNldDsgLy8gb2Zmc2V0IG9mIGZpZWxkCisgICAgdWludDMyX3QgX21TaXplOyAgIC8vIHNpemUgb2YgZmllbGQKK307CisKKy8qKgorICogU3RydWN0dXJlIHVuaXF1ZWx5IHNwZWNpZnlpbmcgYSAnZmllbGQnIGluIGEgY29uZmlndXJhdGlvbi4gVGhlIGZpZWxkCisgKiBjYW4gYmUgYSBmaWVsZCBvZiBhIGNvbmZpZ3VyYXRpb24sIGEgc3ViZmllbGQgb2YgYSBmaWVsZCBvZiBhIGNvbmZpZ3VyYXRpb24sCisgKiBhbmQgZXZlbiB0aGUgd2hvbGUgY29uZmlndXJhdGlvbi4gTW9yZW92ZXIsIGlmIHRoZSBmaWVsZCBjYW4gcG9pbnQgdG8gYW4KKyAqIGVsZW1lbnQgaW4gYSBhcnJheSBmaWVsZCwgb3IgdG8gdGhlIGVudGlyZSBhcnJheSBmaWVsZC4KKyAqCisgKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIGZvciBxdWVyeWluZyBzdXBwb3J0ZWQgdmFsdWVzIGZvciBhIGZpZWxkLCBhcyB3ZWxsCisgKiBhcyBjb21tdW5pY2F0aW5nIGNvbmZpZ3VyYXRpb24gZmFpbHVyZXMgYW5kIGNvbmZsaWN0cyB3aGVuIHRyeWluZyB0byBjaGFuZ2UKKyAqIGEgY29uZmlndXJhdGlvbiBmb3IgYSBjb21wb25lbnQvaW50ZXJmYWNlIG9yIGEgc3RvcmUuCisgKi8KK3N0cnVjdCBDMlBhcmFtRmllbGQgeworLy9wdWJsaWM6CisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgZmllbGQgaWRlbnRpZmllciB1c2luZyBhIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyICh2YXJpYWJsZSksCisgICAgICogYW5kIGEgcG9pbnRlciB0byBtZW1iZXIuCisgICAgICoKKyAgICAgKiB+fn5+fn5+fn5+fn5+ICguY3BwKQorICAgICAqCisgICAgICogc3RydWN0IEMyU29tZVBhcmFtIHsKKyAgICAgKiAgIHVpbnQzMl90IG1GaWVsZDsKKyAgICAgKiAgIHVpbnQzMl90IG1BcnJheVsyXTsKKyAgICAgKiAgIEMyT3RoZXJTdHJ1Y3QgbVN0cnVjdDsKKyAgICAgKiAgIHVpbnQzMl90IG1GbGV4QXJyYXlbXTsKKyAgICAgKiB9ICptUGFyYW07CisgICAgICoKKyAgICAgKiBDMlBhcmFtRmllbGQobVBhcmFtLCAmbVBhcmFtLT5tRmllbGQpOworICAgICAqIEMyUGFyYW1GaWVsZChtUGFyYW0sICZtUGFyYW0tPm1BcnJheSk7CisgICAgICogQzJQYXJhbUZpZWxkKG1QYXJhbSwgJm1QYXJhbS0+bUFycmF5WzBdKTsKKyAgICAgKiBDMlBhcmFtRmllbGQobVBhcmFtLCAmbVBhcmFtLT5tU3RydWN0Lm1TdWJGaWVsZCk7CisgICAgICogQzJQYXJhbUZpZWxkKG1QYXJhbSwgJm1QYXJhbS0+bUZsZXhBcnJheSk7CisgICAgICogQzJQYXJhbUZpZWxkKG1QYXJhbSwgJm1QYXJhbS0+bUZsZXhBcnJheVsyXSk7CisgICAgICoKKyAgICAgKiB+fn5+fn5+fn5+fn5+CisgICAgICoKKyAgICAgKiBcdG9kbyBmaXggd2hhdCB0aGlzIGlzIGZvciBUW10gKGZvciBub3cgc2l6ZSBiZWNvbWVzIFRbMV0pCisgICAgICoKKyAgICAgKiBcbm90ZSB0aGlzIGRvZXMgbm90IHdvcmsgZm9yIDY0LWJpdCBtZW1iZXJzIGFzIGl0IHRyaWdnZXJzIGEKKyAgICAgKiAndGFraW5nIGFkZHJlc3Mgb2YgcGFja2VkIG1lbWJlcicgd2FybmluZy4KKyAgICAgKgorICAgICAqIFxwYXJhbSBwYXJhbSBwb2ludGVyIHRvIHBhcmFtZXRlcgorICAgICAqIFxwYXJhbSBvZmZzZXQgbWVtYmVyIHBvaW50ZXIKKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBTLCB0eXBlbmFtZSBUPgorICAgIGlubGluZSBDMlBhcmFtRmllbGQoUyogcGFyYW0sIFQqIG9mZnNldCkKKyAgICAgICAgOiBfbUluZGV4KHBhcmFtLT5pbmRleCgpKSwKKyAgICAgICAgICBfbUZpZWxkSWQoKFQqKSgodWludHB0cl90KW9mZnNldCAtICh1aW50cHRyX3QpcGFyYW0pKSB7fQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgUywgdHlwZW5hbWUgVD4KKyAgICBpbmxpbmUgc3RhdGljIEMyUGFyYW1GaWVsZCBNYWtlKFMmIHBhcmFtLCBUJiBvZmZzZXQpIHsKKyAgICAgICAgcmV0dXJuIEMyUGFyYW1GaWVsZChwYXJhbS5pbmRleCgpLCAodWludHB0cl90KSZvZmZzZXQgLSAodWludHB0cl90KSZwYXJhbSwgc2l6ZW9mKFQpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBmaWVsZCBpZGVudGlmaWVyIHVzaW5nIGEgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIgKHZhcmlhYmxlKSwKKyAgICAgKiBhbmQgYSBtZW1iZXIgcG9pbnRlci4gVGhpcyBtZXRob2QgY2Fubm90IGJlIHVzZWQgdG8gcmVmZXIgdG8gYW4KKyAgICAgKiBhcnJheSBlbGVtZW50IG9yIGEgc3ViZmllbGQuCisgICAgICoKKyAgICAgKiB+fn5+fn5+fn5+fn5+ICguY3BwKQorICAgICAqCisgICAgICogQzJTb21lUGFyYW0gbVBhcmFtOworICAgICAqIEMyUGFyYW1GaWVsZCgmbVBhcmFtLCAmQzJTb21lUGFyYW06Om1NZW1iZXJGaWVsZCk7CisgICAgICoKKyAgICAgKiB+fn5+fn5+fn5+fn5+CisgICAgICoKKyAgICAgKiBccGFyYW0gcCBwb2ludGVyIHRvIHBhcmFtZXRlcgorICAgICAqIFxwYXJhbSBUIG1lbWJlciBwb2ludGVyIHRvIHRoZSBmaWVsZCBtZW1iZXIKKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBSLCB0eXBlbmFtZSBULCB0eXBlbmFtZSBVPgorICAgIGlubGluZSBDMlBhcmFtRmllbGQoVSAqcCwgUiBUOjoqIHBtKSA6IF9tSW5kZXgocC0+aW5kZXgoKSksIF9tRmllbGRJZChwLCBwbSkgeyB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBmaWVsZCBpZGVudGlmaWVyIHRvIGEgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIgKHZhcmlhYmxlKS4KKyAgICAgKgorICAgICAqIH5+fn5+fn5+fn5+fn4gKC5jcHApCisgICAgICoKKyAgICAgKiBDMlNvbWVQYXJhbSBtUGFyYW07CisgICAgICogQzJQYXJhbUZpZWxkKCZtUGFyYW0pOworICAgICAqCisgICAgICogfn5+fn5+fn5+fn5+fgorICAgICAqCisgICAgICogXHBhcmFtIHBhcmFtIHBvaW50ZXIgdG8gcGFyYW1ldGVyCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgUz4KKyAgICBpbmxpbmUgQzJQYXJhbUZpZWxkKFMqIHBhcmFtKQorICAgICAgICA6IF9tSW5kZXgocGFyYW0tPmluZGV4KCkpLCBfbUZpZWxkSWQoMHUsIHBhcmFtLT5zaXplKCkpIHsgfQorCisgICAgLyoqIENvcHkgY29uc3RydWN0b3IuICovCisgICAgaW5saW5lIEMyUGFyYW1GaWVsZChjb25zdCBDMlBhcmFtRmllbGQgJm90aGVyKSA9IGRlZmF1bHQ7CisKKyAgICAvKioKKyAgICAgKiBFcXVhbGl0eSBvcGVyYXRvci4KKyAgICAgKi8KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEMyUGFyYW1GaWVsZCAmb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIF9tSW5kZXggPT0gb3RoZXIuX21JbmRleCAmJiBfbUZpZWxkSWQgPT0gb3RoZXIuX21GaWVsZElkOworICAgIH0KKworICAgIC8qKgorICAgICAqIE9yZGVyaW5nIG9wZXJhdG9yLgorICAgICAqLworICAgIGlubGluZSBib29sIG9wZXJhdG9yPChjb25zdCBDMlBhcmFtRmllbGQgJm90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiBfbUluZGV4IDwgb3RoZXIuX21JbmRleCB8fAorICAgICAgICAgICAgKF9tSW5kZXggPT0gb3RoZXIuX21JbmRleCAmJiBfbUZpZWxkSWQgPCBvdGhlci5fbUZpZWxkSWQpOworICAgIH0KKworICAgIERFRklORV9PVEhFUl9DT01QQVJJU09OX09QRVJBVE9SUyhDMlBhcmFtRmllbGQpCisKK3Byb3RlY3RlZDoKKyAgICBpbmxpbmUgQzJQYXJhbUZpZWxkKEMyUGFyYW06OkluZGV4IGluZGV4LCB1aW50MzJfdCBvZmZzZXQsIHVpbnQzMl90IHNpemUpCisgICAgICAgIDogX21JbmRleChpbmRleCksIF9tRmllbGRJZChvZmZzZXQsIHNpemUpIHt9CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIHN0cnVjdCBfQzJQYXJhbUluc3BlY3RvcjsKKworICAgIEMyUGFyYW06OkluZGV4IF9tSW5kZXg7IC8vLzwgcGFyYW1ldGVyIGluZGV4CisgICAgX0MyRmllbGRJZCBfbUZpZWxkSWQ7ICAgLy8vPCBmaWVsZCBpZGVudGlmaWVyCit9OworCisvKioKKyAqIEEgc2hhcmVkICh1bmlvbikgcmVwcmVzZW50YXRpb24gb2YgbnVtZXJpYyB2YWx1ZXMKKyAqLworY2xhc3MgQzJWYWx1ZSB7CitwdWJsaWM6CisgICAgLy8vIEEgdW5pb24gb2Ygc3VwcG9ydGVkIHByaW1pdGl2ZSB0eXBlcy4KKyAgICB1bmlvbiBQcmltaXRpdmUgeworICAgICAgICAvLyBmaXJzdCBtZW1iZXIgaXMgYWx3YXlzIHplcm8gaW5pdGlhbGl6ZWQgc28gaXQgbXVzdCBiZSB0aGUgbGFyZ2VzdAorICAgICAgICB1aW50NjRfdCAgICB1NjQ7ICAgLy8vPCB1aW50NjRfdCB2YWx1ZQorICAgICAgICBpbnQ2NF90ICAgICBpNjQ7ICAgLy8vPCBpbnQ2NF90IHZhbHVlCisgICAgICAgIGMyX2NudHI2NF90IGM2NDsgICAvLy88IGMyX2NudHI2NF90IHZhbHVlCisgICAgICAgIHVpbnQzMl90ICAgIHUzMjsgICAvLy88IHVpbnQzMl90IHZhbHVlCisgICAgICAgIGludDMyX3QgICAgIGkzMjsgICAvLy88IGludDMyX3QgdmFsdWUKKyAgICAgICAgYzJfY250cjMyX3QgYzMyOyAgIC8vLzwgYzJfY250cjMyX3QgdmFsdWUKKyAgICAgICAgZmxvYXQgICAgICAgZnA7ICAgIC8vLzwgZmxvYXQgdmFsdWUKKworICAgICAgICAvLyBjb25zdHJ1Y3RvcnMgLSBpbXBsaWNpdAorICAgICAgICBQcmltaXRpdmUodWludDY0X3QgdmFsdWUpICAgIDogdTY0KHZhbHVlKSB7IH0KKyAgICAgICAgUHJpbWl0aXZlKGludDY0X3QgdmFsdWUpICAgICA6IGk2NCh2YWx1ZSkgeyB9CisgICAgICAgIFByaW1pdGl2ZShjMl9jbnRyNjRfdCB2YWx1ZSkgOiBjNjQodmFsdWUpIHsgfQorICAgICAgICBQcmltaXRpdmUodWludDMyX3QgdmFsdWUpICAgIDogdTMyKHZhbHVlKSB7IH0KKyAgICAgICAgUHJpbWl0aXZlKGludDMyX3QgdmFsdWUpICAgICA6IGkzMih2YWx1ZSkgeyB9CisgICAgICAgIFByaW1pdGl2ZShjMl9jbnRyMzJfdCB2YWx1ZSkgOiBjMzIodmFsdWUpIHsgfQorICAgICAgICBQcmltaXRpdmUodWludDhfdCB2YWx1ZSkgICAgIDogdTMyKHZhbHVlKSB7IH0KKyAgICAgICAgUHJpbWl0aXZlKGNoYXIgdmFsdWUpICAgICAgICA6IGkzMih2YWx1ZSkgeyB9CisgICAgICAgIFByaW1pdGl2ZShmbG9hdCB2YWx1ZSkgICAgICAgOiBmcCh2YWx1ZSkgIHsgfQorCisgICAgICAgIC8vIGFsbG93IGNvbnN0cnVjdGlvbiBmcm9tIGVudW0gdHlwZQorICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBFLCB0eXBlbmFtZSA9IHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfZW51bTxFPjo6dmFsdWU+Ojp0eXBlPgorICAgICAgICBQcmltaXRpdmUoRSB2YWx1ZSkKKyAgICAgICAgICAgIDogUHJpbWl0aXZlKHN0YXRpY19jYXN0PHR5cGVuYW1lIHN0ZDo6dW5kZXJseWluZ190eXBlPEU+Ojp0eXBlPih2YWx1ZSkpIHsgfQorCisgICAgICAgIFByaW1pdGl2ZSgpIDogdTY0KDApIHsgfQorCisgICAgICAgIC8qKiBnZXRzIHZhbHVlIG91dCBvZiB0aGUgdW5pb24gKi8KKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gY29uc3QgVCAmcmVmKCkgY29uc3Q7CisKKyAgICAgICAgLy8gdmVyaWZ5IHRoYXQgd2UgY2FuIGFzc3VtZSBzdGFuZGFyZCBhbGlhc2luZworICAgICAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZih1NjQpID09IHNpemVvZihpNjQpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKHU2NCkgPT0gc2l6ZW9mKGM2NCksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChzaXplb2YodTMyKSA9PSBzaXplb2YoaTMyKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZih1MzIpID09IHNpemVvZihjMzIpLCAiIik7CisgICAgfTsKKyAgICAvLyB2ZXJpZnkgdGhhdCB3ZSBjYW4gYXNzdW1lIHN0YW5kYXJkIGFsaWFzaW5nCisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihQcmltaXRpdmUsIHU2NCkgPT0gb2Zmc2V0b2YoUHJpbWl0aXZlLCBpNjQpLCAiIik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihQcmltaXRpdmUsIHU2NCkgPT0gb2Zmc2V0b2YoUHJpbWl0aXZlLCBjNjQpLCAiIik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihQcmltaXRpdmUsIHUzMikgPT0gb2Zmc2V0b2YoUHJpbWl0aXZlLCBpMzIpLCAiIik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihQcmltaXRpdmUsIHUzMikgPT0gb2Zmc2V0b2YoUHJpbWl0aXZlLCBjMzIpLCAiIik7CisKKyAgICBlbnVtIHR5cGVfdCA6IHVpbnQzMl90IHsKKyAgICAgICAgTk9fSU5JVCwKKyAgICAgICAgSU5UMzIsCisgICAgICAgIFVJTlQzMiwKKyAgICAgICAgQ05UUjMyLAorICAgICAgICBJTlQ2NCwKKyAgICAgICAgVUlOVDY0LAorICAgICAgICBDTlRSNjQsCisgICAgICAgIEZMT0FULAorICAgIH07CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCBib29sID0gc3RkOjppc19lbnVtPFQ+Ojp2YWx1ZT4KKyAgICBpbmxpbmUgc3RhdGljIGNvbnN0ZXhwciB0eXBlX3QgVHlwZUZvcigpIHsKKyAgICAgICAgdXNpbmcgVSA9IHR5cGVuYW1lIHN0ZDo6dW5kZXJseWluZ190eXBlPFQ+Ojp0eXBlOworICAgICAgICByZXR1cm4gVHlwZUZvcjxVPigpOworICAgIH0KKworICAgIC8vIGRlcHJlY3RhdGVkCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVCwgYm9vbCBCID0gc3RkOjppc19lbnVtPFQ+Ojp2YWx1ZT4KKyAgICBpbmxpbmUgc3RhdGljIGNvbnN0ZXhwciB0eXBlX3QgdHlwZUZvcigpIHsKKyAgICAgICAgcmV0dXJuIFR5cGVGb3I8VCwgQj4oKTsKKyAgICB9CisKKyAgICAvLyBjb25zdHJ1Y3RvcnMgLSBpbXBsaWNpdAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgQzJWYWx1ZShUIHZhbHVlKSAgOiBfbVR5cGUodHlwZUZvcjxUPigpKSwgX21WYWx1ZSh2YWx1ZSkgeyB9CisKKyAgICBDMlZhbHVlKCkgOiBfbVR5cGUoTk9fSU5JVCkgeyB9CisKKyAgICBpbmxpbmUgdHlwZV90IHR5cGUoKSBjb25zdCB7IHJldHVybiBfbVR5cGU7IH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgaW5saW5lIGJvb2wgZ2V0KFQgKnZhbHVlKSBjb25zdCB7CisgICAgICAgIGlmIChfbVR5cGUgPT0gdHlwZUZvcjxUPigpKSB7CisgICAgICAgICAgICAqdmFsdWUgPSBfbVZhbHVlLnJlZjxUPigpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vLyByZXR1cm5zIHRoZSBhZGRyZXNzIG9mIHRoZSB2YWx1ZQorICAgIHZvaWQgKmdldCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIF9tVHlwZSA9PSBOT19JTklUID8gbnVsbHB0ciA6ICh2b2lkKikmX21WYWx1ZTsKKyAgICB9CisKKyAgICAvLy8gcmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgY29udGFpbmVkIHZhbHVlCisgICAgc2l6ZV90IGlubGluZSBzaXplT2YoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBTaXplRm9yKF9tVHlwZSk7CisgICAgfQorCisgICAgc3RhdGljIHNpemVfdCBTaXplRm9yKHR5cGVfdCB0eXBlKSB7CisgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICAgICAgY2FzZSBJTlQzMjoKKyAgICAgICAgICAgIGNhc2UgVUlOVDMyOgorICAgICAgICAgICAgY2FzZSBDTlRSMzI6IHJldHVybiBzaXplb2YoX21WYWx1ZS5pMzIpOworICAgICAgICAgICAgY2FzZSBJTlQ2NDoKKyAgICAgICAgICAgIGNhc2UgVUlOVDY0OgorICAgICAgICAgICAgY2FzZSBDTlRSNjQ6IHJldHVybiBzaXplb2YoX21WYWx1ZS5pNjQpOworICAgICAgICAgICAgY2FzZSBGTE9BVDogcmV0dXJuIHNpemVvZihfbVZhbHVlLmZwKTsKKyAgICAgICAgICAgIGRlZmF1bHQ6IHJldHVybiAwOworICAgICAgICB9CisgICAgfQorCitwcml2YXRlOgorICAgIHR5cGVfdCBfbVR5cGU7CisgICAgUHJpbWl0aXZlIF9tVmFsdWU7Cit9OworCit0ZW1wbGF0ZTw+IGlubGluZSBjb25zdCBpbnQzMl90ICZDMlZhbHVlOjpQcmltaXRpdmU6OnJlZjxpbnQzMl90PigpIGNvbnN0IHsgcmV0dXJuIGkzMjsgfQordGVtcGxhdGU8PiBpbmxpbmUgY29uc3QgaW50NjRfdCAmQzJWYWx1ZTo6UHJpbWl0aXZlOjpyZWY8aW50NjRfdD4oKSBjb25zdCB7IHJldHVybiBpNjQ7IH0KK3RlbXBsYXRlPD4gaW5saW5lIGNvbnN0IHVpbnQzMl90ICZDMlZhbHVlOjpQcmltaXRpdmU6OnJlZjx1aW50MzJfdD4oKSBjb25zdCB7IHJldHVybiB1MzI7IH0KK3RlbXBsYXRlPD4gaW5saW5lIGNvbnN0IHVpbnQ2NF90ICZDMlZhbHVlOjpQcmltaXRpdmU6OnJlZjx1aW50NjRfdD4oKSBjb25zdCB7IHJldHVybiB1NjQ7IH0KK3RlbXBsYXRlPD4gaW5saW5lIGNvbnN0IGMyX2NudHIzMl90ICZDMlZhbHVlOjpQcmltaXRpdmU6OnJlZjxjMl9jbnRyMzJfdD4oKSBjb25zdCB7IHJldHVybiBjMzI7IH0KK3RlbXBsYXRlPD4gaW5saW5lIGNvbnN0IGMyX2NudHI2NF90ICZDMlZhbHVlOjpQcmltaXRpdmU6OnJlZjxjMl9jbnRyNjRfdD4oKSBjb25zdCB7IHJldHVybiBjNjQ7IH0KK3RlbXBsYXRlPD4gaW5saW5lIGNvbnN0IGZsb2F0ICZDMlZhbHVlOjpQcmltaXRpdmU6OnJlZjxmbG9hdD4oKSBjb25zdCB7IHJldHVybiBmcDsgfQorCisvLyBwcm92aWRlIHR5cGVzIGZvciBlbnVtcyBhbmQgdWludDhfdCwgY2hhciBldmVuIHRob3VnaCB3ZSBkb24ndCBwcm92aWRlIHJlYWRpbmcgYXMgdGhlbQordGVtcGxhdGU8PiBjb25zdGV4cHIgQzJWYWx1ZTo6dHlwZV90IEMyVmFsdWU6OlR5cGVGb3I8Y2hhciwgZmFsc2U+KCkgeyByZXR1cm4gSU5UMzI7IH0KK3RlbXBsYXRlPD4gY29uc3RleHByIEMyVmFsdWU6OnR5cGVfdCBDMlZhbHVlOjpUeXBlRm9yPGludDMyX3QsIGZhbHNlPigpIHsgcmV0dXJuIElOVDMyOyB9Cit0ZW1wbGF0ZTw+IGNvbnN0ZXhwciBDMlZhbHVlOjp0eXBlX3QgQzJWYWx1ZTo6VHlwZUZvcjxpbnQ2NF90LCBmYWxzZT4oKSB7IHJldHVybiBJTlQ2NDsgfQordGVtcGxhdGU8PiBjb25zdGV4cHIgQzJWYWx1ZTo6dHlwZV90IEMyVmFsdWU6OlR5cGVGb3I8dWludDhfdCwgZmFsc2U+KCkgeyByZXR1cm4gVUlOVDMyOyB9Cit0ZW1wbGF0ZTw+IGNvbnN0ZXhwciBDMlZhbHVlOjp0eXBlX3QgQzJWYWx1ZTo6VHlwZUZvcjx1aW50MzJfdCwgZmFsc2U+KCkgeyByZXR1cm4gVUlOVDMyOyB9Cit0ZW1wbGF0ZTw+IGNvbnN0ZXhwciBDMlZhbHVlOjp0eXBlX3QgQzJWYWx1ZTo6VHlwZUZvcjx1aW50NjRfdCwgZmFsc2U+KCkgeyByZXR1cm4gVUlOVDY0OyB9Cit0ZW1wbGF0ZTw+IGNvbnN0ZXhwciBDMlZhbHVlOjp0eXBlX3QgQzJWYWx1ZTo6VHlwZUZvcjxjMl9jbnRyMzJfdCwgZmFsc2U+KCkgeyByZXR1cm4gQ05UUjMyOyB9Cit0ZW1wbGF0ZTw+IGNvbnN0ZXhwciBDMlZhbHVlOjp0eXBlX3QgQzJWYWx1ZTo6VHlwZUZvcjxjMl9jbnRyNjRfdCwgZmFsc2U+KCkgeyByZXR1cm4gQ05UUjY0OyB9Cit0ZW1wbGF0ZTw+IGNvbnN0ZXhwciBDMlZhbHVlOjp0eXBlX3QgQzJWYWx1ZTo6VHlwZUZvcjxmbG9hdCwgZmFsc2U+KCkgeyByZXR1cm4gRkxPQVQ7IH0KKworLy8gZm9yd2FyZCBkZWNsYXJlIGVhc3kgZW51bSB0ZW1wbGF0ZQordGVtcGxhdGU8dHlwZW5hbWUgRT4gc3RydWN0IEMyRWFzeUVudW07CisKKy8qKgorICogZmllbGQgZGVzY3JpcHRvci4gQSBmaWVsZCBpcyB1bmlxdWVseSBkZWZpbmVkIGJ5IGFuIGluZGV4IGludG8gYSBwYXJhbWV0ZXIuCisgKiAoTm90ZTogU3RyZWFtLWlkIGlzIG5vdCBjYXB0dXJlZCBhcyBhIGZpZWxkLikKKyAqCisgKiBPcmRlcmluZyBvZiBmaWVsZHMgaXMgYnkgb2Zmc2V0LiBJbiBjYXNlIG9mIHN0cnVjdHVyZXMsIGl0IGlzIGRlcHRoIGZpcnN0LAorICogd2l0aCBhIHN0cnVjdHVyZSB0YWtpbmcgYW4gaW5kZXgganVzdCBiZWZvcmUgYW5kIGluIGFkZGl0aW9uIHRvIGl0cyBtZW1iZXJzLgorICovCitzdHJ1Y3QgQzJGaWVsZERlc2NyaXB0b3IgeworLy9wdWJsaWM6CisgICAgLyoqIGZpZWxkIHR5cGVzIGFuZCBmbGFncworICAgICAqIFxub3RlOiBvbmx5IDMyLWJpdCBhbmQgNjQtYml0IGZpZWxkcyBhcmUgc3VwcG9ydGVkIChlLmcuIG5vIGJvb2xlYW4sIGFzIHRoYXQKKyAgICAgKiBpcyByZXByZXNlbnRlZCB1c2luZyBJTlQzMikuCisgICAgICovCisgICAgZW51bSB0eXBlX3QgOiB1aW50MzJfdCB7CisgICAgICAgIC8vIHByaW1pdGl2ZSB0eXBlcworICAgICAgICBJTlQzMiAgID0gQzJWYWx1ZTo6SU5UMzIsICAvLy88IDMyLWJpdCBzaWduZWQgaW50ZWdlcgorICAgICAgICBVSU5UMzIgID0gQzJWYWx1ZTo6VUlOVDMyLCAvLy88IDMyLWJpdCB1bnNpZ25lZCBpbnRlZ2VyCisgICAgICAgIENOVFIzMiAgPSBDMlZhbHVlOjpDTlRSMzIsIC8vLzwgMzItYml0IGNvdW50ZXIKKyAgICAgICAgSU5UNjQgICA9IEMyVmFsdWU6OklOVDY0LCAgLy8vPCA2NC1iaXQgc2lnbmVkIGludGVnZXIKKyAgICAgICAgVUlOVDY0ICA9IEMyVmFsdWU6OlVJTlQ2NCwgLy8vPCA2NC1iaXQgc2lnbmVkIGludGVnZXIKKyAgICAgICAgQ05UUjY0ICA9IEMyVmFsdWU6OkNOVFI2NCwgLy8vPCA2NC1iaXQgY291bnRlcgorICAgICAgICBGTE9BVCAgID0gQzJWYWx1ZTo6RkxPQVQsICAvLy88IDMyLWJpdCBmbG9hdGluZyBwb2ludAorCisgICAgICAgIC8vIGFycmF5IHR5cGVzCisgICAgICAgIFNUUklORyA9IDB4MTAwLCAvLy88IGZpeGVkLXNpemUgc3RyaW5nIChQT0QpCisgICAgICAgIEJMT0IsICAgICAgICAgICAvLy88IGJsb2IuIEJsb2JzIGhhdmUgbm8gc3ViLWVsZW1lbnRzIGFuZCBjYW4gYmUgdGhvdWdodCBvZiBhcyBieXRlIGFycmF5czsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgaG93ZXZlciwgYnl0ZXMgY2Fubm90IGJlIGluZGl2aWR1YWxseSBhZGRyZXNzZWQgYnkgY2xpZW50cy4KKworICAgICAgICAvLyBjb21wbGV4IHR5cGVzCisgICAgICAgIFNUUlVDVF9GTEFHID0gMHgyMDAwMCwgLy8vPCBzdHJ1Y3RzLiBNYXJrZWQgd2l0aCB0aGlzIGZsYWcgaW4gYWRkaXRpb24gdG8gdGhlaXIgY29yZUluZGV4LgorICAgIH07CisKKyAgICB0eXBlZGVmIHN0ZDo6cGFpcjxDMlN0cmluZywgQzJWYWx1ZTo6UHJpbWl0aXZlPiBOYW1lZFZhbHVlVHlwZTsKKyAgICB0eXBlZGVmIHN0ZDo6dmVjdG9yPE5hbWVkVmFsdWVUeXBlPiBOYW1lZFZhbHVlc1R5cGU7CisgICAgLy90eXBlZGVmIHN0ZDo6cGFpcjxzdGQ6OnZlY3RvcjxDMlN0cmluZz4sIHN0ZDo6dmVjdG9yPEMyVmFsdWU6OlByaW1pdGl2ZT4+IE5hbWVkVmFsdWVzVHlwZTsKKworICAgIC8qKgorICAgICAqIFRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIHRoYXQgcmV0dXJucyB0aGUgbmFtZWQgdmFsdWVzIGZvciBhIHR5cGUuCisgICAgICoKKyAgICAgKiBcdG9kbyBoaWRlIGZyb20gY2xpZW50LgorICAgICAqCisgICAgICogXHJldHVybiBhIHZlY3RvciBvZiBuYW1lLXZhbHVlIHBhaXJzLgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEI+CisgICAgc3RhdGljIE5hbWVkVmFsdWVzVHlwZSBuYW1lZFZhbHVlc0Zvcihjb25zdCBCICYpOworCisgICAgLyoqIHNwZWNpYWxpemF0aW9uIGZvciBlYXN5IGVudW1zICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRT4KKyAgICBpbmxpbmUgc3RhdGljIE5hbWVkVmFsdWVzVHlwZSBuYW1lZFZhbHVlc0Zvcihjb25zdCBDMkVhc3lFbnVtPEU+ICYpIHsKKyAgICAgICAgcmV0dXJuIG5hbWVkVmFsdWVzRm9yKCooRSopbnVsbHB0cik7CisgICAgfQorCitwcml2YXRlOgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEIsIGJvb2wgZW5hYmxlZD1zdGQ6OmlzX2FyaXRobWV0aWM8Qj46OnZhbHVlIHx8IHN0ZDo6aXNfZW51bTxCPjo6dmFsdWU+CisgICAgc3RydWN0IEMyX0hJREUgX05hbWVkVmFsdWVzR2V0dGVyOworCitwdWJsaWM6CisgICAgaW5saW5lIEMyRmllbGREZXNjcmlwdG9yKHVpbnQzMl90IHR5cGUsIHVpbnQzMl90IGV4dGVudCwgQzJTdHJpbmcgbmFtZSwgc2l6ZV90IG9mZnNldCwgc2l6ZV90IHNpemUpCisgICAgICAgIDogX21UeXBlKCh0eXBlX3QpdHlwZSksIF9tRXh0ZW50KGV4dGVudCksIF9tTmFtZShuYW1lKSwgX21GaWVsZElkKG9mZnNldCwgc2l6ZSkgeyB9CisKKyAgICBpbmxpbmUgQzJGaWVsZERlc2NyaXB0b3IoY29uc3QgQzJGaWVsZERlc2NyaXB0b3IgJikgPSBkZWZhdWx0OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVCwgY2xhc3MgQj10eXBlbmFtZSBzdGQ6OnJlbW92ZV9leHRlbnQ8VD46OnR5cGU+CisgICAgaW5saW5lIEMyRmllbGREZXNjcmlwdG9yKGNvbnN0IFQqIG9mZnNldCwgY29uc3QgY2hhciAqbmFtZSkKKyAgICAgICAgOiBfbVR5cGUodGhpcy0+R2V0VHlwZSgoQiopbnVsbHB0cikpLAorICAgICAgICAgIF9tRXh0ZW50KHN0ZDo6aXNfYXJyYXk8VD46OnZhbHVlID8gc3RkOjpleHRlbnQ8VD46OnZhbHVlIDogMSksCisgICAgICAgICAgX21OYW1lKG5hbWUpLAorICAgICAgICAgIF9tTmFtZWRWYWx1ZXMoX05hbWVkVmFsdWVzR2V0dGVyPEI+OjpnZXROYW1lZFZhbHVlcygpKSwKKyAgICAgICAgICBfbUZpZWxkSWQob2Zmc2V0KSB7fQorCisvKgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIEI9dHlwZW5hbWUgc3RkOjpyZW1vdmVfZXh0ZW50PFQ+Ojp0eXBlPgorICAgIGlubGluZSBDMkZpZWxkRGVzY3JpcHRvcjxULCBCLCBmYWxzZT4oVCogb2Zmc2V0LCBjb25zdCBjaGFyICpuYW1lKQorICAgICAgICA6IF9tVHlwZSh0aGlzLT5HZXRUeXBlKChCKiludWxscHRyKSksCisgICAgICAgICAgX21FeHRlbnQoc3RkOjppc19hcnJheTxUPjo6dmFsdWUgPyBzdGQ6OmV4dGVudDxUPjo6dmFsdWUgOiAxKSwKKyAgICAgICAgICBfbU5hbWUobmFtZSksCisgICAgICAgICAgX21GaWVsZElkKG9mZnNldCkge30KKyovCisKKyAgICAvLy8gXGRlcHJlY2F0ZWQKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBTLCBjbGFzcyBCPXR5cGVuYW1lIHN0ZDo6cmVtb3ZlX2V4dGVudDxUPjo6dHlwZT4KKyAgICBpbmxpbmUgQzJGaWVsZERlc2NyaXB0b3IoUyosIFQgUzo6KiBmaWVsZCwgY29uc3QgY2hhciAqbmFtZSkKKyAgICAgICAgOiBfbVR5cGUodGhpcy0+R2V0VHlwZSgoQiopbnVsbHB0cikpLAorICAgICAgICAgIF9tRXh0ZW50KHN0ZDo6aXNfYXJyYXk8VD46OnZhbHVlID8gc3RkOjpleHRlbnQ8VD46OnZhbHVlIDogMSksCisgICAgICAgICAgX21OYW1lKG5hbWUpLAorICAgICAgICAgIF9tRmllbGRJZCgmKCgoUyopMCktPipmaWVsZCkpIHt9CisKKyAgICAvLy8gcmV0dXJucyB0aGUgdHlwZSBvZiB0aGlzIGZpZWxkCisgICAgaW5saW5lIHR5cGVfdCB0eXBlKCkgY29uc3QgeyByZXR1cm4gX21UeXBlOyB9CisgICAgLy8vIHJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgZmllbGQgaW4gY2FzZSBpdCBpcyBhbiBhcnJheS4gUmV0dXJucyAwIGZvcgorICAgIC8vLyBUW10gYXJyYXlzLCByZXR1cm5zIDEgZm9yIFRbMV0gYXJyYXlzIGFzIHdlbGwgYXMgaWYgdGhlIGZpZWxkIGlzIG5vdCBhbiBhcnJheS4KKyAgICBpbmxpbmUgc2l6ZV90IGV4dGVudCgpIGNvbnN0IHsgcmV0dXJuIF9tRXh0ZW50OyB9CisgICAgLy8vIHJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGZpZWxkCisgICAgaW5saW5lIEMyU3RyaW5nIG5hbWUoKSBjb25zdCB7IHJldHVybiBfbU5hbWU7IH0KKworICAgIGNvbnN0IE5hbWVkVmFsdWVzVHlwZSAmbmFtZWRWYWx1ZXMoKSBjb25zdCB7IHJldHVybiBfbU5hbWVkVmFsdWVzOyB9CisKKyNpZiBkZWZpbmVkKEZSSUVORF9URVNUKQorICAgIGZyaWVuZCB2b2lkIFByaW50VG8oY29uc3QgQzJGaWVsZERlc2NyaXB0b3IgJiwgOjpzdGQ6Om9zdHJlYW0qKTsKKyAgICBmcmllbmQgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEMyRmllbGREZXNjcmlwdG9yICYsIGNvbnN0IEMyRmllbGREZXNjcmlwdG9yICYpOworICAgIEZSSUVORF9URVNUKEMyUGFyYW1UZXN0X1BhcmFtRmllbGRMaXN0LCBWZXJpZnlTdHJ1Y3QpOworI2VuZGlmCisKK3ByaXZhdGU6CisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGFuIG9mZnNldGVkIGZpZWxkIGRlc2NyaXB0b3IuCisgICAgICovCisgICAgaW5saW5lIEMyRmllbGREZXNjcmlwdG9yKGNvbnN0IEMyRmllbGREZXNjcmlwdG9yICZkZXNjLCBzaXplX3Qgb2Zmc2V0KQorICAgICAgICA6IF9tVHlwZShkZXNjLl9tVHlwZSksIF9tRXh0ZW50KGRlc2MuX21FeHRlbnQpLAorICAgICAgICAgIF9tTmFtZShkZXNjLl9tTmFtZSksIF9tTmFtZWRWYWx1ZXMoZGVzYy5fbU5hbWVkVmFsdWVzKSwKKyAgICAgICAgICBfbUZpZWxkSWQoZGVzYy5fbUZpZWxkSWQuX21PZmZzZXQgKyBvZmZzZXQsIGRlc2MuX21GaWVsZElkLl9tU2l6ZSkgeyB9CisKKyAgICB0eXBlX3QgX21UeXBlOworICAgIHVpbnQzMl90IF9tRXh0ZW50OyAvLyB0aGUgbGFzdCBtZW1iZXIgY2FuIGJlIGFyYml0cmFyeSBsZW5ndGggaWYgaXQgaXMgVFtdIGFycmF5LAorICAgICAgICAgICAgICAgICAgICAgICAvLyBleHRlbmRpbmcgdG8gdGhlIGVuZCBvZiB0aGUgcGFyYW1ldGVyICh0aGlzIGlzIG1hcmtlZCB3aXRoCisgICAgICAgICAgICAgICAgICAgICAgIC8vIDApLiBUWzBdLXMgYXJlIG5vdCBmaWVsZHMuCisgICAgQzJTdHJpbmcgX21OYW1lOworICAgIE5hbWVkVmFsdWVzVHlwZSBfbU5hbWVkVmFsdWVzOworCisgICAgX0MyRmllbGRJZCBfbUZpZWxkSWQ7ICAgLy8gZmllbGQgaWRlbnRpZmllciAob2Zmc2V0IGFuZCBzaXplKQorCisgICAgLy8gTk9URTogV2UgZG8gbm90IGNhcHR1cmUgZGVmYXVsdCB2YWx1ZShzKSBoZXJlIGFzIHRoYXQgbWF5IGRlcGVuZCBvbiB0aGUgY29tcG9uZW50LgorICAgIC8vIE5PVEU6IFdlIGFsc28gZG8gbm90IGNhcHR1cmUgYmVzdEVmZm9ydCwgYXMgMSkgdGhpcyBzaG91bGQgYmUgdHJ1ZSBmb3IgbW9zdCBmaWVsZHMsCisgICAgLy8gMikgdGhpcyBpcyBhdCBwYXJhbWV0ZXIgZ3JhbnVsYXJpdHkuCisKKyAgICAvLyB0eXBlIHJlc29sdXRpb24KKyAgICBpbmxpbmUgc3RhdGljIHR5cGVfdCBHZXRUeXBlKGludDMyX3QqKSAgICAgeyByZXR1cm4gSU5UMzI7IH0KKyAgICBpbmxpbmUgc3RhdGljIHR5cGVfdCBHZXRUeXBlKHVpbnQzMl90KikgICAgeyByZXR1cm4gVUlOVDMyOyB9CisgICAgaW5saW5lIHN0YXRpYyB0eXBlX3QgR2V0VHlwZShjMl9jbnRyMzJfdCopIHsgcmV0dXJuIENOVFIzMjsgfQorICAgIGlubGluZSBzdGF0aWMgdHlwZV90IEdldFR5cGUoaW50NjRfdCopICAgICB7IHJldHVybiBJTlQ2NDsgfQorICAgIGlubGluZSBzdGF0aWMgdHlwZV90IEdldFR5cGUodWludDY0X3QqKSAgICB7IHJldHVybiBVSU5UNjQ7IH0KKyAgICBpbmxpbmUgc3RhdGljIHR5cGVfdCBHZXRUeXBlKGMyX2NudHI2NF90KikgeyByZXR1cm4gQ05UUjY0OyB9CisgICAgaW5saW5lIHN0YXRpYyB0eXBlX3QgR2V0VHlwZShmbG9hdCopICAgICAgIHsgcmV0dXJuIEZMT0FUOyB9CisgICAgaW5saW5lIHN0YXRpYyB0eXBlX3QgR2V0VHlwZShjaGFyKikgICAgICAgIHsgcmV0dXJuIFNUUklORzsgfQorICAgIGlubGluZSBzdGF0aWMgdHlwZV90IEdldFR5cGUodWludDhfdCopICAgICB7IHJldHVybiBCTE9COyB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBULAorICAgICAgICAgICAgIGNsYXNzPXR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfZW51bTxUPjo6dmFsdWU+Ojp0eXBlPgorICAgIGlubGluZSBzdGF0aWMgdHlwZV90IEdldFR5cGUoVCopIHsKKyAgICAgICAgdHlwZW5hbWUgc3RkOjp1bmRlcmx5aW5nX3R5cGU8VD46OnR5cGUgdW5kZXJseWluZygwKTsKKyAgICAgICAgcmV0dXJuIEdldFR5cGUoJnVuZGVybHlpbmcpOworICAgIH0KKworICAgIC8vIHZlcmlmeSBDMlN0cnVjdCBieSBoYXZpbmcgYSBGaWVsZExpc3QoKSBhbmQgYSBDT1JFX0lOREVYLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsCisgICAgICAgICAgICAgY2xhc3M9ZGVjbHR5cGUoVDo6Q09SRV9JTkRFWCArIDEpLCBjbGFzcz1kZWNsdHlwZShUOjpGaWVsZExpc3QoKSk+CisgICAgaW5saW5lIHN0YXRpYyB0eXBlX3QgR2V0VHlwZShUKikgeworICAgICAgICBzdGF0aWNfYXNzZXJ0KCFzdGQ6OmlzX2Jhc2Vfb2Y8QzJQYXJhbSwgVD46OnZhbHVlLCAiY2Fubm90IHVzZSBDMlBhcmFtcyBhcyBmaWVsZHMiKTsKKyAgICAgICAgcmV0dXJuICh0eXBlX3QpKFQ6OkNPUkVfSU5ERVggfCBTVFJVQ1RfRkxBRyk7CisgICAgfQorCisgICAgZnJpZW5kIHN0cnVjdCBfQzJQYXJhbUluc3BlY3RvcjsKK307CisKKy8vIG5vIG5hbWVkIHZhbHVlcyBmb3IgY29tcG91bmQgdHlwZXMKK3RlbXBsYXRlPHR5cGVuYW1lIEI+CitzdHJ1Y3QgQzJGaWVsZERlc2NyaXB0b3I6Ol9OYW1lZFZhbHVlc0dldHRlcjxCLCBmYWxzZT4geworICAgIGlubGluZSBzdGF0aWMgQzJGaWVsZERlc2NyaXB0b3I6Ok5hbWVkVmFsdWVzVHlwZSBnZXROYW1lZFZhbHVlcygpIHsKKyAgICAgICAgcmV0dXJuIE5hbWVkVmFsdWVzVHlwZSgpOworICAgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIEI+CitzdHJ1Y3QgQzJGaWVsZERlc2NyaXB0b3I6Ol9OYW1lZFZhbHVlc0dldHRlcjxCLCB0cnVlPiB7CisgICAgaW5saW5lIHN0YXRpYyBDMkZpZWxkRGVzY3JpcHRvcjo6TmFtZWRWYWx1ZXNUeXBlIGdldE5hbWVkVmFsdWVzKCkgeworICAgICAgICByZXR1cm4gQzJGaWVsZERlc2NyaXB0b3I6Om5hbWVkVmFsdWVzRm9yKCooQiopbnVsbHB0cik7CisgICAgfQorfTsKKworI2RlZmluZSBERUZJTkVfTk9fTkFNRURfVkFMVUVTX0ZPUih0eXBlKSBcCit0ZW1wbGF0ZTw+IGlubGluZSBDMkZpZWxkRGVzY3JpcHRvcjo6TmFtZWRWYWx1ZXNUeXBlIEMyRmllbGREZXNjcmlwdG9yOjpuYW1lZFZhbHVlc0Zvcihjb25zdCB0eXBlICYpIHsgXAorICAgIHJldHVybiBOYW1lZFZhbHVlc1R5cGUoKTsgXAorfQorCisvLyBXZSBjYW5ub3Qgc3VidHlwZSBjb25zdHJ1Y3RvciBmb3IgZW51bWVyYXRlZCB0eXBlcyBzbyBpbnN0ZWQgZGVmaW5lIG5vIG5hbWVkIHZhbHVlcyBmb3IKKy8vIG5vbi1lbnVtZXJhdGVkIGludGVncmFsIHR5cGVzLgorREVGSU5FX05PX05BTUVEX1ZBTFVFU19GT1IoaW50MzJfdCkKK0RFRklORV9OT19OQU1FRF9WQUxVRVNfRk9SKHVpbnQzMl90KQorREVGSU5FX05PX05BTUVEX1ZBTFVFU19GT1IoYzJfY250cjMyX3QpCitERUZJTkVfTk9fTkFNRURfVkFMVUVTX0ZPUihpbnQ2NF90KQorREVGSU5FX05PX05BTUVEX1ZBTFVFU19GT1IodWludDY0X3QpCitERUZJTkVfTk9fTkFNRURfVkFMVUVTX0ZPUihjMl9jbnRyNjRfdCkKK0RFRklORV9OT19OQU1FRF9WQUxVRVNfRk9SKHVpbnQ4X3QpCitERUZJTkVfTk9fTkFNRURfVkFMVUVTX0ZPUihjaGFyKQorREVGSU5FX05PX05BTUVEX1ZBTFVFU19GT1IoZmxvYXQpCisKKy8qKgorICogRGVzY3JpYmVzIHRoZSBmaWVsZHMgb2YgYSBzdHJ1Y3R1cmUuCisgKi8KK3N0cnVjdCBDMlN0cnVjdERlc2NyaXB0b3IgeworcHVibGljOgorICAgIC8vLyBSZXR1cm5zIHRoZSBjb3JlIGluZGV4IG9mIHRoZSBzdHJ1Y3QKKyAgICBpbmxpbmUgQzJQYXJhbTo6Q29yZUluZGV4IGNvcmVJbmRleCgpIGNvbnN0IHsgcmV0dXJuIF9tVHlwZS5jb3JlSW5kZXgoKTsgfQorCisgICAgLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGZpZWxkcyBpbiB0aGlzIHN0cnVjdCAobm90IGNvdW50aW5nIGFueSByZWN1cnNpdmUgZmllbGRzKS4KKyAgICAvLyBNdXN0IGJlIGF0IGxlYXN0IDEgZm9yIHZhbGlkIHN0cnVjdHMuCisgICAgaW5saW5lIHNpemVfdCBudW1GaWVsZHMoKSBjb25zdCB7IHJldHVybiBfbUZpZWxkcy5zaXplKCk7IH0KKworICAgIC8vIFJldHVybnMgdGhlIGxpc3Qgb2YgZGlyZWN0IGZpZWxkcyAobm90IGNvdW50aW5nIGFueSByZWN1cnNpdmUgZmllbGRzKS4KKyAgICB0eXBlZGVmIHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPjo6Y29uc3RfaXRlcmF0b3IgZmllbGRfaXRlcmF0b3I7CisgICAgaW5saW5lIGZpZWxkX2l0ZXJhdG9yIGNiZWdpbigpIGNvbnN0IHsgcmV0dXJuIF9tRmllbGRzLmNiZWdpbigpOyB9CisgICAgaW5saW5lIGZpZWxkX2l0ZXJhdG9yIGNlbmQoKSBjb25zdCB7IHJldHVybiBfbUZpZWxkcy5jZW5kKCk7IH0KKworICAgIC8vIG9ubHkgc3VwcGx5aW5nIGNvbnN0IGl0ZXJhdG9yIC0gYnV0IHRoZXNlIG5hbWVzIGFyZSBuZWVkZWQgZm9yIHJhbmdlIGJhc2VkIGxvb3BzCisgICAgaW5saW5lIGZpZWxkX2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gX21GaWVsZHMuY2JlZ2luKCk7IH0KKyAgICBpbmxpbmUgZmllbGRfaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gX21GaWVsZHMuY2VuZCgpOyB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIGlubGluZSBDMlN0cnVjdERlc2NyaXB0b3IoVCopCisgICAgICAgIDogQzJTdHJ1Y3REZXNjcmlwdG9yKFQ6OkNPUkVfSU5ERVgsIFQ6OkZpZWxkTGlzdCgpKSB7IH0KKworICAgIGlubGluZSBDMlN0cnVjdERlc2NyaXB0b3IoCisgICAgICAgICAgICBDMlBhcmFtOjpDb3JlSW5kZXggdHlwZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiAmZmllbGRzKQorICAgICAgICA6IF9tVHlwZSh0eXBlKSwgX21GaWVsZHMoZmllbGRzKSB7IH0KKworcHJpdmF0ZToKKyAgICBmcmllbmQgc3RydWN0IF9DMlBhcmFtSW5zcGVjdG9yOworCisgICAgaW5saW5lIEMyU3RydWN0RGVzY3JpcHRvcigKKyAgICAgICAgICAgIEMyUGFyYW06OkNvcmVJbmRleCB0eXBlLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+ICYmZmllbGRzKQorICAgICAgICA6IF9tVHlwZSh0eXBlKSwgX21GaWVsZHMoc3RkOjptb3ZlKGZpZWxkcykpIHsgfQorCisgICAgY29uc3QgQzJQYXJhbTo6Q29yZUluZGV4IF9tVHlwZTsKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gX21GaWVsZHM7Cit9OworCisvKioKKyAqIERlc2NyaWJlcyBwYXJhbWV0ZXJzIGZvciBhIGNvbXBvbmVudC4KKyAqLworc3RydWN0IEMyUGFyYW1EZXNjcmlwdG9yIHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgc2V0dGluZyB0aGlzIHBhcmFtIGlzIHJlcXVpcmVkIHRvIGNvbmZpZ3VyZSB0aGlzIGNvbXBvbmVudC4KKyAgICAgKiBUaGlzIGNhbiBvbmx5IGJlIHRydWUgZm9yIGJ1aWx0aW4gcGFyYW1zIGZvciBwbGF0Zm9ybS1kZWZpbmVkIGNvbXBvbmVudHMgKGUuZy4gdmlkZW8gYW5kCisgICAgICogYXVkaW8gZW5jb2RlcnMvZGVjb2RlcnMsIHZpZGVvL2F1ZGlvIGZpbHRlcnMpLgorICAgICAqIEZvciB2ZW5kb3ItZGVmaW5lZCBjb21wb25lbnRzLCBpdCBjYW4gYmUgdHJ1ZSBldmVuIGZvciB2ZW5kb3ItZGVmaW5lZCBwYXJhbXMsCisgICAgICogYnV0IGl0IGlzIG5vdCByZWNvbW1lbmRlZCwgaW4gY2FzZSB0aGUgY29tcG9uZW50IGJlY29tZXMgcGxhdGZvcm0tZGVmaW5lZC4KKyAgICAgKi8KKyAgICBpbmxpbmUgYm9vbCBpc1JlcXVpcmVkKCkgY29uc3QgeyByZXR1cm4gX21BdHRyaWIgJiBJU19SRVFVSVJFRDsgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgcGFyYW1ldGVyIGlzIHBlcnNpc3RlbnQuIFRoaXMgaXMgYWx3YXlzIHRydWUgZm9yIEMyVHVuaW5nIGFuZCBDMlNldHRpbmcsCisgICAgICogYnV0IG1heSBiZSBmYWxzZSBmb3IgQzJJbmZvLiBJZiB0cnVlLCB0aGlzIHBhcmFtZXRlciBwZXJzaXN0cyBhY3Jvc3MgZnJhbWVzIGFuZCBhcHBsaWVzIHRvCisgICAgICogdGhlIGN1cnJlbnQgYW5kIHN1YnNlcXVlbnQgZnJhbWVzLiBJZiBmYWxzZSwgdGhpcyBDMkluZm8gcGFyYW1ldGVyIG9ubHkgYXBwbGllcyB0byB0aGUKKyAgICAgKiBjdXJyZW50IGZyYW1lIGFuZCBpcyBub3QgYXNzdW1lZCB0byBoYXZlIHRoZSBzYW1lIHZhbHVlIChvciBldmVuIGJlIHByZXNlbnQpIG9uIHN1YnNlcXVlbnQKKyAgICAgKiBmcmFtZXMsIHVubGVzcyBpdCBpcyBzcGVjaWZpZWQgZm9yIHRob3NlIGZyYW1lcy4KKyAgICAgKi8KKyAgICBpbmxpbmUgYm9vbCBpc1BlcnNpc3RlbnQoKSBjb25zdCB7IHJldHVybiBfbUF0dHJpYiAmIElTX1BFUlNJU1RFTlQ7IH0KKworICAgIGlubGluZSBib29sIGlzU3RyaWN0KCkgY29uc3QgeyByZXR1cm4gX21BdHRyaWIgJiBJU19TVFJJQ1Q7IH0KKworICAgIGlubGluZSBib29sIGlzUmVhZE9ubHkoKSBjb25zdCB7IHJldHVybiBfbUF0dHJpYiAmIElTX1JFQURfT05MWTsgfQorCisgICAgaW5saW5lIGJvb2wgaXNWaXNpYmxlKCkgY29uc3QgeyByZXR1cm4gIShfbUF0dHJpYiAmIElTX0hJRERFTik7IH0KKworICAgIGlubGluZSBib29sIGlzUHVibGljKCkgY29uc3QgeyByZXR1cm4gIShfbUF0dHJpYiAmIElTX0lOVEVSTkFMKTsgfQorCisgICAgLy8vIFJldHVybnMgdGhlIG5hbWUgb2YgdGhpcyBwYXJhbS4KKyAgICAvLy8gVGhpcyBkZWZhdWx0cyB0byB0aGUgdW5kZXJseWluZyBDMlN0cnVjdCdzIG5hbWUsIGJ1dCBjb3VsZCBiZSBhbHRlcmVkIGZvciBhIGNvbXBvbmVudC4KKyAgICBpbmxpbmUgQzJTdHJpbmcgbmFtZSgpIGNvbnN0IHsgcmV0dXJuIF9tTmFtZTsgfQorCisgICAgLy8vIFJldHVybnMgdGhlIHBhcmFtZXRlciBpbmRleAorICAgIGlubGluZSBDMlBhcmFtOjpJbmRleCBpbmRleCgpIGNvbnN0IHsgcmV0dXJuIF9tSW5kZXg7IH0KKworICAgIC8vLyBSZXR1cm5zIHRoZSBpbmRpY2VzIG9mIHBhcmFtZXRlcnMgdGhhdCB0aGlzIHBhcmFtZXRlciBoYXMgYSBkZXBlbmRlbmN5IG9uCisgICAgaW5saW5lIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiAmZGVwZW5kZW5jaWVzKCkgY29uc3QgeyByZXR1cm4gX21EZXBlbmRlbmNpZXM7IH0KKworICAgIC8vLyBcZGVwcmVjYXRlZAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgaW5saW5lIEMyUGFyYW1EZXNjcmlwdG9yKGJvb2wgaXNSZXF1aXJlZCwgQzJTdHJpbmdMaXRlcmFsIG5hbWUsIGNvbnN0IFQqKQorICAgICAgICA6IF9tSW5kZXgoVDo6UEFSQU1fVFlQRSksCisgICAgICAgICAgX21BdHRyaWIoSVNfUEVSU0lTVEVOVCB8IChpc1JlcXVpcmVkID8gSVNfUkVRVUlSRUQgOiAwKSksCisgICAgICAgICAgX21OYW1lKG5hbWUpIHsgfQorCisgICAgLy8vIFxkZXByZWNhdGVkCisgICAgaW5saW5lIEMyUGFyYW1EZXNjcmlwdG9yKAorICAgICAgICAgICAgYm9vbCBpc1JlcXVpcmVkLCBDMlN0cmluZ0xpdGVyYWwgbmFtZSwgQzJQYXJhbTo6SW5kZXggaW5kZXgpCisgICAgICAgIDogX21JbmRleChpbmRleCksCisgICAgICAgICAgX21BdHRyaWIoSVNfUEVSU0lTVEVOVCB8IChpc1JlcXVpcmVkID8gSVNfUkVRVUlSRUQgOiAwKSksCisgICAgICAgICAgX21OYW1lKG5hbWUpIHsgfQorCisgICAgZW51bSBhdHRyaWJfdCA6IHVpbnQzMl90IHsKKyAgICAgICAgLy8gZmxhZ3MgdGhhdCBkZWZhdWx0IG9uCisgICAgICAgIElTX1JFUVVJUkVEICAgPSAxdSA8PCAwLCAvLy88IHBhcmFtZXRlciBpcyByZXF1aXJlZCB0byBiZSBzcGVjaWZpZWQKKyAgICAgICAgSVNfUEVSU0lTVEVOVCA9IDF1IDw8IDEsIC8vLzwgcGFyYW1ldGVyIHJldGFpbnMgaXRzIHZhbHVlCisgICAgICAgIC8vIGZsYWdzIHRoYXQgZGVmYXVsdCBvZmYKKyAgICAgICAgSVNfU1RSSUNUICAgICA9IDF1IDw8IDIsIC8vLzwgcGFyYW1ldGVyIGlzIHN0cmljdAorICAgICAgICBJU19SRUFEX09OTFkgID0gMXUgPDwgMywgLy8vPCBwYXJhbWV0ZXIgaXMgcHVibGljbHkgcmVhZC1vbmx5CisgICAgICAgIElTX0hJRERFTiAgICAgPSAxdSA8PCA0LCAvLy88IHBhcmFtZXRlciBzaGFsbCBub3QgYmUgdmlzaWJsZSB0byBjbGllbnRzCisgICAgICAgIElTX0lOVEVSTkFMICAgPSAxdSA8PCA1LCAvLy88IHBhcmFtZXRlciBzaGFsbCBub3QgYmUgdXNlZCBieSBmcmFtZXdvcmsgKG90aGVyIHRoYW4gdGVzdGluZykKKyAgICAgICAgSVNfQ09OU1QgICAgICA9IDF1IDw8IDYgfCBJU19SRUFEX09OTFksIC8vLzwgcGFyYW1ldGVyIGlzIHB1YmxpY2x5IGNvbnN0IChoZW5jZSByZWFkLW9ubHkpCisgICAgfTsKKworICAgIGlubGluZSBDMlBhcmFtRGVzY3JpcHRvcigKKyAgICAgICAgQzJQYXJhbTo6SW5kZXggaW5kZXgsIGF0dHJpYl90IGF0dHJpYiwgQzJTdHJpbmdMaXRlcmFsIG5hbWUpCisgICAgICAgIDogX21JbmRleChpbmRleCksCisgICAgICAgICAgX21BdHRyaWIoYXR0cmliKSwKKyAgICAgICAgICBfbU5hbWUobmFtZSkgeyB9CisKKyAgICBpbmxpbmUgQzJQYXJhbURlc2NyaXB0b3IoCisgICAgICAgIEMyUGFyYW06OkluZGV4IGluZGV4LCBhdHRyaWJfdCBhdHRyaWIsIEMyU3RyaW5nICYmbmFtZSwKKyAgICAgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+ICYmZGVwZW5kZW5jaWVzKQorICAgICAgICA6IF9tSW5kZXgoaW5kZXgpLAorICAgICAgICAgIF9tQXR0cmliKGF0dHJpYiksCisgICAgICAgICAgX21OYW1lKG5hbWUpLAorICAgICAgICAgIF9tRGVwZW5kZW5jaWVzKHN0ZDo6bW92ZShkZXBlbmRlbmNpZXMpKSB7IH0KKworcHJpdmF0ZToKKyAgICBjb25zdCBDMlBhcmFtOjpJbmRleCBfbUluZGV4OworICAgIGNvbnN0IHVpbnQzMl90IF9tQXR0cmliOworICAgIGNvbnN0IEMyU3RyaW5nIF9tTmFtZTsKKyAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gX21EZXBlbmRlbmNpZXM7CisKKyAgICBmcmllbmQgc3RydWN0IF9DMlBhcmFtSW5zcGVjdG9yOworfTsKKworREVGSU5FX0VOVU1fT1BFUkFUT1JTKDo6QzJQYXJhbURlc2NyaXB0b3I6OmF0dHJpYl90KQorCisKKy8vLyBcaW5ncm91cCBpbnRlcm5hbAorLy8vIERlZmluZSBhIHN0cnVjdHVyZSB3aXRob3V0IENPUkVfSU5ERVguCisvLy8gXG5vdGUgX0ZJRUxEX0xJU1QgaXMgdXNlZCBvbmx5IGR1cmluZyBkZWNsYXJhdGlvbiBzbyB0aGF0IEMyU3RydWN0IGRlY2xhcmF0aW9ucyBjYW4gZW5kIHdpdGgKKy8vLyBhIHNpbXBsZSBsaXN0IG9mIEMyRklFTEQtcyBhbmQgY2xvc2luZyBicmFja2V0LiBNYXJrIGl0IHVudXNlZCBhcyBpdCBpcyBub3QgdXNlZCBpbiB0ZW1wbGF0ZWQKKy8vLyBzdHJ1Y3RzLgorI2RlZmluZSBERUZJTkVfQkFTRV9DMlNUUlVDVChuYW1lKSBcCitwcml2YXRlOiBcCisgICAgY29uc3Qgc3RhdGljIHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBfRklFTERfTElTVCBfX3VudXNlZDsgLyoqPCBzdHJ1Y3R1cmUgZmllbGRzICovIFwKK3B1YmxpYzogXAorICAgIHR5cGVkZWYgQzIjI25hbWUjI1N0cnVjdCBfdHlwZTsgLyoqPCB0eXBlIG5hbWUgc2hvcnRoYW5kICovIFwKKyAgICBzdGF0aWMgY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEZpZWxkTGlzdCgpOyAvKio8IHN0cnVjdHVyZSBmaWVsZHMgZmFjdG9yeSAqLworCisvLy8gRGVmaW5lIGEgc3RydWN0dXJlIHdpdGggbWF0Y2hpbmcgQ09SRV9JTkRFWC4KKyNkZWZpbmUgREVGSU5FX0MyU1RSVUNUKG5hbWUpIFwKK3B1YmxpYzogXAorICAgIGVudW0gOiB1aW50MzJfdCB7IENPUkVfSU5ERVggPSBrUGFyYW1JbmRleCMjbmFtZSB9OyBcCisgICAgREVGSU5FX0JBU0VfQzJTVFJVQ1QobmFtZSkKKworLy8vIERlZmluZSBhIGZsZXhpYmxlIHN0cnVjdHVyZSB3aXRob3V0IENPUkVfSU5ERVguCisjZGVmaW5lIERFRklORV9CQVNFX0ZMRVhfQzJTVFJVQ1QobmFtZSwgZmxleE1lbWJlcikgXAorcHVibGljOiBcCisgICAgRkxFWChDMiMjbmFtZSMjU3RydWN0LCBmbGV4TWVtYmVyKSBcCisgICAgREVGSU5FX0JBU0VfQzJTVFJVQ1QobmFtZSkKKworLy8vIERlZmluZSBhIGZsZXhpYmxlIHN0cnVjdHVyZSB3aXRoIG1hdGNoaW5nIENPUkVfSU5ERVguCisjZGVmaW5lIERFRklORV9GTEVYX0MyU1RSVUNUKG5hbWUsIGZsZXhNZW1iZXIpIFwKK3B1YmxpYzogXAorICAgIEZMRVgoQzIjI25hbWUjI1N0cnVjdCwgZmxleE1lbWJlcikgXAorICAgIGVudW0gOiB1aW50MzJfdCB7IENPUkVfSU5ERVggPSBrUGFyYW1JbmRleCMjbmFtZSB8IEMyUGFyYW06OkNvcmVJbmRleDo6SVNfRkxFWF9GTEFHIH07IFwKKyAgICBERUZJTkVfQkFTRV9DMlNUUlVDVChuYW1lKQorCisvLy8gXGluZ3JvdXAgaW50ZXJuYWwKKy8vLyBEZXNjcmliZSBhIHN0cnVjdHVyZSBvZiBhIHRlbXBsYXRlZCBzdHJ1Y3R1cmUuCisvLyBVc2UgbGlzdC4uLiBhcyB0aGUgYXJndW1lbnQgZ2V0cyByZXN1YnNpdGl0dXRlZCBhbmQgaXQgY29udGFpbnMgY29tbWFzLiBBbHRlcm5hdGl2ZSB3b3VsZCBiZQorLy8gdG8gd3JhcCBsaXN0IGluIGFuIGV4cHJlc3Npb24sIGUuZy4gKHsgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IGxpc3Q7IH0pKSB3aGljaCBjb252ZXJ0cworLy8gaXQgZnJvbSBhbiBpbml0aWFsaXplciBsaXN0IHRvIGEgdmVjdG9yLgorI2RlZmluZSBERVNDUklCRV9URU1QTEFURURfQzJTVFJVQ1Qoc3RydWt0LCBsaXN0Li4uKSBcCisgICAgX0RFU0NSSUJFX1RFTVBMQVRBQkxFX0MyU1RSVUNUKHRlbXBsYXRlPD4sIHN0cnVrdCwgX19DMl9HRU5FUkFURV9HTE9CQUxfVkFSU19fLCBsaXN0KQorCisvLy8gXGRlcHJlY2F0ZWQKKy8vLyBEZXNjcmliZSB0aGUgZmllbGRzIG9mIGEgc3RydWN0dXJlIHVzaW5nIGFuIGluaXRpYWxpemVyIGxpc3QuCisjZGVmaW5lIERFU0NSSUJFX0MyU1RSVUNUKG5hbWUsIGxpc3QuLi4pIFwKKyAgICBfREVTQ1JJQkVfVEVNUExBVEFCTEVfQzJTVFJVQ1QoLCBDMiMjbmFtZSMjU3RydWN0LCBfX0MyX0dFTkVSQVRFX0dMT0JBTF9WQVJTX18sIGxpc3QpCisKKy8vLyBcaW5ncm91cCBpbnRlcm5hbAorLy8vIE1hY3JvIGxheWVyIHRvIGdldCB2YWx1ZSBvZiBlbmFibGVkIHRoYXQgaXMgcGFzc2VkIGluIGFzIGEgbWFjcm8gdmFyaWFibGUKKyNkZWZpbmUgX0RFU0NSSUJFX1RFTVBMQVRBQkxFX0MyU1RSVUNUKHRlbXBsYXRlLCBzdHJ1a3QsIGVuYWJsZWQsIGxpc3QuLi4pIFwKKyAgICBfX0RFU0NSSUJFX1RFTVBMQVRBQkxFX0MyU1RSVUNUKHRlbXBsYXRlLCBzdHJ1a3QsIGVuYWJsZWQsIGxpc3QpCisKKy8vLyBcaW5ncm91cCBpbnRlcm5hbAorLy8vIE1hY3JvIGxheWVyIHRvIHJlc29sdmUgdG8gdGhlIHNwZWNpZmljIG1hY3JvIGJhc2VkIG9uIG1hY3JvIHZhcmlhYmxlCisjZGVmaW5lIF9fREVTQ1JJQkVfVEVNUExBVEFCTEVfQzJTVFJVQ1QodGVtcGxhdGUsIHN0cnVrdCwgZW5hYmxlZCwgbGlzdC4uLikgXAorICAgIF9fX0RFU0NSSUJFX1RFTVBMQVRBQkxFX0MyU1RSVUNUIyNlbmFibGVkKHRlbXBsYXRlLCBzdHJ1a3QsIGxpc3QpCisKKyNkZWZpbmUgX19fREVTQ1JJQkVfVEVNUExBVEFCTEVfQzJTVFJVQ1QodGVtcGxhdGUsIHN0cnVrdCwgbGlzdC4uLikgXAorICAgIHRlbXBsYXRlIFwKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gc3RydWt0OjpGaWVsZExpc3QoKSB7IHJldHVybiBsaXN0OyB9CisKKyNkZWZpbmUgX19fREVTQ1JJQkVfVEVNUExBVEFCTEVfQzJTVFJVQ1RfX0MyX0dFTkVSQVRFX0dMT0JBTF9WQVJTX18odGVtcGxhdGUsIHN0cnVrdCwgbGlzdC4uLikKKworLyoqCisgKiBEZXNjcmliZSBhIGZpZWxkIG9mIGEgc3RydWN0dXJlLgorICogVGhlc2UgbXVzdCBiZSBpbiBvcmRlci4KKyAqCisgKiBUaGVyZSBhcmUgdHdvIHdheXMgdG8gdXNlIHRoaXMgbWFjcm86CisgKgorICogIH5+fn5+fn5+fn5+fn4gKC5jcHApCisgKiAgc3RydWN0IEMyVmlkZW9XaWR0aFN0cnVjdCB7CisgKiAgICAgIGludDMyX3Qgd2lkdGg7CisgKiAgICAgIEMyVmlkZW9XaWR0aFN0cnVjdCgpIHt9IC8vIG9wdGlvbmFsIGRlZmF1bHQgY29uc3RydWN0b3IKKyAqICAgICAgQzJWaWRlb1dpZHRoU3RydWN0KGludDMyX3QgX3dpZHRoKSA6IHdpZHRoKF93aWR0aCkge30KKyAqCisgKiAgICAgIERFRklORV9BTkRfREVTQ1JJQkVfQzJTVFJVQ1QoVmlkZW9XaWR0aCkKKyAqICAgICAgQzJGSUVMRCh3aWR0aCwgIndpZHRoIikKKyAqICB9OworICogIH5+fn5+fn5+fn5+fn4KKyAqCisgKiAgfn5+fn5+fn5+fn5+fiAoLmNwcCkKKyAqICBzdHJ1Y3QgQzJWaWRlb1dpZHRoU3RydWN0IHsKKyAqICAgICAgaW50MzJfdCB3aWR0aDsKKyAqICAgICAgQzJWaWRlb1dpZHRoU3RydWN0KCkgPSBkZWZhdWx0OyAvLyBvcHRpb25hbCBkZWZhdWx0IGNvbnN0cnVjdG9yCisgKiAgICAgIEMyVmlkZW9XaWR0aFN0cnVjdChpbnQzMl90IF93aWR0aCkgOiB3aWR0aChfd2lkdGgpIHt9CisgKgorICogICAgICBERUZJTkVfQzJTVFJVQ1QoVmlkZW9XaWR0aCkKKyAqICB9IEMyX1BBQ0s7CisgKgorICogIERFU0NSSUJFX0MyU1RSVUNUKFZpZGVvV2lkdGgsIHsKKyAqICAgICAgQzJGSUVMRCh3aWR0aCwgIndpZHRoIikKKyAqICB9KQorICogIH5+fn5+fn5+fn5+fn4KKyAqCisgKiAgRm9yIGZsZXhpYmxlIHN0cnVjdHVyZXMgKHRob3NlIGVuZGluZyBpbiBUW10pLCB1c2UgdGhlIGZsZXhpYmxlIG1hY3JvczoKKyAqCisgKiAgfn5+fn5+fn5+fn5+fiAoLmNwcCkKKyAqICBzdHJ1Y3QgQzJWaWRlb0ZsZXhXaWR0aHNTdHJ1Y3QgeworICogICAgICBpbnQzMl90IHdpZHRoc1tdOworICogICAgICBDMlZpZGVvRmxleFdpZHRoc1N0cnVjdCgpOyAvLyBtdXN0IGhhdmUgYSBkZWZhdWx0IGNvbnN0cnVjdG9yCisgKgorICogIHByaXZhdGU6CisgKiAgICAgIC8vIG1heSBoYXZlIHByaXZhdGUgY29uc3RydWN0b3JzIHRha2luZyBudW1iZXIgb2Ygd2lkdGhzIGFzIHRoZSBmaXJzdCBhcmd1bWVudAorICogICAgICAvLyBUaGlzIGlzIHVzZWQgYnkgdGhlIEMyUGFyYW0gZmFjdG9yeSBtZXRob2RzLCBlLmcuCisgKiAgICAgIC8vICAgQzJWaWRlb0ZsZXhXaWR0aHNHbG9iYWxQYXJhbTo6QWxsb2NVbmlxdWUoc2l6ZV90LCBpbnQzMl90KTsKKyAqICAgICAgQzJWaWRlb0ZsZXhXaWR0aHNTdHJ1Y3Qoc2l6ZV90IGZsZXhDb3VudCwgaW50MzJfdCB2YWx1ZSkgeworICogICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBmbGV4Q291bnQ7ICsraSkgeworICogICAgICAgICAgICAgIHdpZHRoc1tpXSA9IHZhbHVlOworICogICAgICAgICAgfQorICogICAgICB9CisgKgorICogICAgICAvLyBJZiB0aGUgbGFzdCBhcmd1bWVudCBpcyBUW05dIG9yIHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxUPiwgdGhlIGZsZXhDb3VudCB3aWxsCisgKiAgICAgIC8vIGJlIGF1dG9tYXRpY2FsbHkgY2FsY3VsYXRlZCBhbmQgcGFzc2VkIGJ5IHRoZSBDMlBhcmFtIGZhY3RvcnkgbWV0aG9kcywgZS5nLgorICogICAgICAvLyAgIGludCB3aWR0aHNbXSA9IHsgMSwgMiwgMyB9OworICogICAgICAvLyAgIEMyVmlkZW9GbGV4V2lkdGhzR2xvYmFsUGFyYW06OkFsbG9jVW5pcXVlKHdpZHRocyk7CisgKiAgICAgIHRlbXBsYXRlPHVuc2lnbmVkIE4+CisgKiAgICAgIEMyVmlkZW9GbGV4V2lkdGhzU3RydWN0KHNpemVfdCBmbGV4Q291bnQsIGNvbnN0IGludDMyX3QoJmluaXQpW05dKSB7CisgKiAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGZsZXhDb3VudDsgKytpKSB7CisgKiAgICAgICAgICAgICAgd2lkdGhzW2ldID0gaW5pdFtpXTsKKyAqICAgICAgICAgIH0KKyAqICAgICAgfQorICoKKyAqICAgICAgREVGSU5FX0FORF9ERVNDUklCRV9GTEVYX0MyU1RSVUNUKFZpZGVvRmxleFdpZHRocywgd2lkdGhzKQorICogICAgICBDMkZJRUxEKHdpZHRocywgIndpZHRocyIpCisgKiAgfTsKKyAqICB+fn5+fn5+fn5+fn5+CisgKgorICogIH5+fn5+fn5+fn5+fn4gKC5jcHApCisgKiAgc3RydWN0IEMyVmlkZW9GbGV4V2lkdGhzU3RydWN0IHsKKyAqICAgICAgaW50MzJfdCBtV2lkdGhzW107CisgKiAgICAgIEMyVmlkZW9GbGV4V2lkdGhzU3RydWN0KCk7IC8vIG11c3QgaGF2ZSBhIGRlZmF1bHQgY29uc3RydWN0b3IKKyAqCisgKiAgICAgIERFRklORV9GTEVYX0MyU1RSVUNUKFZpZGVvRmxleFdpZHRocywgbVdpZHRocykKKyAqICB9IEMyX1BBQ0s7CisgKgorICogIERFU0NSSUJFX0MyU1RSVUNUKFZpZGVvRmxleFdpZHRocywgeworICogICAgICBDMkZJRUxEKG1XaWR0aHMsICJ3aWR0aHMiKQorICogIH0pCisgKiAgfn5+fn5+fn5+fn5+fgorICoKKyAqLworI2RlZmluZSBERVNDUklCRV9DMkZJRUxEKG1lbWJlciwgbmFtZSkgXAorICBDMkZpZWxkRGVzY3JpcHRvcigmKChfdHlwZSopKG51bGxwdHIpKS0+bWVtYmVyLCBuYW1lKSwKKworI2RlZmluZSBDMkZJRUxEKG1lbWJlciwgbmFtZSkgX0MyRklFTEQobWVtYmVyLCBuYW1lLCBfX0MyX0dFTkVSQVRFX0dMT0JBTF9WQVJTX18pCisvLy8gXGlmIDAKKyNkZWZpbmUgX0MyRklFTEQobWVtYmVyLCBuYW1lLCBlbmFibGVkKSBfX0MyRklFTEQobWVtYmVyLCBuYW1lLCBlbmFibGVkKQorI2RlZmluZSBfX0MyRklFTEQobWVtYmVyLCBuYW1lLCBlbmFibGVkKSBERVNDUklCRV9DMkZJRUxEIyNlbmFibGVkKG1lbWJlciwgbmFtZSkKKyNkZWZpbmUgREVTQ1JJQkVfQzJGSUVMRF9fQzJfR0VORVJBVEVfR0xPQkFMX1ZBUlNfXyhtZW1iZXIsIG5hbWUpCisvLy8gXGVuZGlmCisKKy8vLyBEZWZpbmUgYSBzdHJ1Y3R1cmUgd2l0aCBtYXRjaGluZyBDT1JFX0lOREVYIGFuZCBzdGFydCBkZXNjcmliaW5nIGl0cyBmaWVsZHMuCisvLy8gVGhpcyBtdXN0IGJlIGF0IHRoZSBlbmQgb2YgdGhlIHN0cnVjdHVyZSBkZWZpbml0aW9uLgorI2RlZmluZSBERUZJTkVfQU5EX0RFU0NSSUJFX0MyU1RSVUNUKG5hbWUpIFwKKyAgICBfREVGSU5FX0FORF9ERVNDUklCRV9DMlNUUlVDVChuYW1lLCBERUZJTkVfQzJTVFJVQ1QsIF9fQzJfR0VORVJBVEVfR0xPQkFMX1ZBUlNfXykKKworLy8vIERlZmluZSBhIGJhc2Ugc3RydWN0dXJlICh3aXRoIG5vIENPUkVfSU5ERVgpIGFuZCBzdGFydCBkZXNjcmliaW5nIGl0cyBmaWVsZHMuCisvLy8gVGhpcyBtdXN0IGJlIGF0IHRoZSBlbmQgb2YgdGhlIHN0cnVjdHVyZSBkZWZpbml0aW9uLgorI2RlZmluZSBERUZJTkVfQU5EX0RFU0NSSUJFX0JBU0VfQzJTVFJVQ1QobmFtZSkgXAorICAgIF9ERUZJTkVfQU5EX0RFU0NSSUJFX0MyU1RSVUNUKG5hbWUsIERFRklORV9CQVNFX0MyU1RSVUNULCBfX0MyX0dFTkVSQVRFX0dMT0JBTF9WQVJTX18pCisKKy8vLyBEZWZpbmUgYSBmbGV4aWJsZSBzdHJ1Y3R1cmUgd2l0aCBtYXRjaGluZyBDT1JFX0lOREVYIGFuZCBzdGFydCBkZXNjcmliaW5nIGl0cyBmaWVsZHMuCisvLy8gVGhpcyBtdXN0IGJlIGF0IHRoZSBlbmQgb2YgdGhlIHN0cnVjdHVyZSBkZWZpbml0aW9uLgorI2RlZmluZSBERUZJTkVfQU5EX0RFU0NSSUJFX0ZMRVhfQzJTVFJVQ1QobmFtZSwgZmxleE1lbWJlcikgXAorICAgIF9ERUZJTkVfQU5EX0RFU0NSSUJFX0ZMRVhfQzJTVFJVQ1QoIFwKKyAgICAgICAgICAgIG5hbWUsIGZsZXhNZW1iZXIsIERFRklORV9GTEVYX0MyU1RSVUNULCBfX0MyX0dFTkVSQVRFX0dMT0JBTF9WQVJTX18pCisKKy8vLyBEZWZpbmUgYSBmbGV4aWJsZSBiYXNlIHN0cnVjdHVyZSAod2l0aCBubyBDT1JFX0lOREVYKSBhbmQgc3RhcnQgZGVzY3JpYmluZyBpdHMgZmllbGRzLgorLy8vIFRoaXMgbXVzdCBiZSBhdCB0aGUgZW5kIG9mIHRoZSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbi4KKyNkZWZpbmUgREVGSU5FX0FORF9ERVNDUklCRV9CQVNFX0ZMRVhfQzJTVFJVQ1QobmFtZSwgZmxleE1lbWJlcikgXAorICAgIF9ERUZJTkVfQU5EX0RFU0NSSUJFX0ZMRVhfQzJTVFJVQ1QoIFwKKyAgICAgICAgICAgIG5hbWUsIGZsZXhNZW1iZXIsIERFRklORV9CQVNFX0ZMRVhfQzJTVFJVQ1QsIF9fQzJfR0VORVJBVEVfR0xPQkFMX1ZBUlNfXykKKworLy8vIFxpZiAwCisvKgorICAgQWx0ZXJuYXRlIGRlY2xhcmF0aW9uIG9mIGZpZWxkIGRlZmluaXRpb25zIGluIGNhc2Ugbm8gZmllbGQgbGlzdCBpcyB0byBiZSBnZW5lcmF0ZWQuCisgICBUaGUgc3BlY2lmaWMgbWFjcm8gaXMgY2hvc2VkIGJhc2VkIG9uIHRoZSB2YWx1ZSBvZiBfX0MyX0dFTkVSQVRFX0dMT0JBTF9WQVJTX18gKHdoZXRoZXIgaXQgaXMKKyAgIGRlZmluZWQgKHRvIGJlIGVtcHR5KSBvciBub3QuIFRoaXMgcmVxdWlyZXMgdHdvIGxldmVsIG9mIG1hY3JvIHN1YnN0aXR1dGlvbi4KKyAgIFRSSUNLWTogdXNlIG5hbWVzcGFjZSBkZWNsYXJhdGlvbiB0byBoYW5kbGUgY2xvc2luZyBicmFja2V0IHRoYXQgaXMgbm9ybWFsbHkgYWZ0ZXIKKyAgIHRoZXNlIG1hY3Jvcy4KKyovCisKKyNkZWZpbmUgX0RFRklORV9BTkRfREVTQ1JJQkVfQzJTVFJVQ1QobmFtZSwgZGVmaW5lTWFjcm8sIGVuYWJsZWQpIFwKKyAgICBfX0RFRklORV9BTkRfREVTQ1JJQkVfQzJTVFJVQ1QobmFtZSwgZGVmaW5lTWFjcm8sIGVuYWJsZWQpCisjZGVmaW5lIF9fREVGSU5FX0FORF9ERVNDUklCRV9DMlNUUlVDVChuYW1lLCBkZWZpbmVNYWNybywgZW5hYmxlZCkgXAorICAgIF9fX0RFRklORV9BTkRfREVTQ1JJQkVfQzJTVFJVQ1QjI2VuYWJsZWQobmFtZSwgZGVmaW5lTWFjcm8pCisjZGVmaW5lIF9fX0RFRklORV9BTkRfREVTQ1JJQkVfQzJTVFJVQ1RfX0MyX0dFTkVSQVRFX0dMT0JBTF9WQVJTX18obmFtZSwgZGVmaW5lTWFjcm8pIFwKKyAgICBkZWZpbmVNYWNybyhuYW1lKSB9IEMyX1BBQ0s7IG5hbWVzcGFjZSB7CisjZGVmaW5lIF9fX0RFRklORV9BTkRfREVTQ1JJQkVfQzJTVFJVQ1QobmFtZSwgZGVmaW5lTWFjcm8pIFwKKyAgICBkZWZpbmVNYWNybyhuYW1lKSB9IEMyX1BBQ0s7IFwKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gQzIjI25hbWUjI1N0cnVjdDo6RmllbGRMaXN0KCkgeyByZXR1cm4gX0ZJRUxEX0xJU1Q7IH0gXAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBDMiMjbmFtZSMjU3RydWN0OjpfRklFTERfTElTVCA9IHsKKworI2RlZmluZSBfREVGSU5FX0FORF9ERVNDUklCRV9GTEVYX0MyU1RSVUNUKG5hbWUsIGZsZXhNZW1iZXIsIGRlZmluZU1hY3JvLCBlbmFibGVkKSBcCisgICAgX19ERUZJTkVfQU5EX0RFU0NSSUJFX0ZMRVhfQzJTVFJVQ1QobmFtZSwgZmxleE1lbWJlciwgZGVmaW5lTWFjcm8sIGVuYWJsZWQpCisjZGVmaW5lIF9fREVGSU5FX0FORF9ERVNDUklCRV9GTEVYX0MyU1RSVUNUKG5hbWUsIGZsZXhNZW1iZXIsIGRlZmluZU1hY3JvLCBlbmFibGVkKSBcCisgICAgX19fREVGSU5FX0FORF9ERVNDUklCRV9GTEVYX0MyU1RSVUNUIyNlbmFibGVkKG5hbWUsIGZsZXhNZW1iZXIsIGRlZmluZU1hY3JvKQorI2RlZmluZSBfX19ERUZJTkVfQU5EX0RFU0NSSUJFX0ZMRVhfQzJTVFJVQ1RfX0MyX0dFTkVSQVRFX0dMT0JBTF9WQVJTX18obmFtZSwgZmxleE1lbWJlciwgZGVmaW5lTWFjcm8pIFwKKyAgICBkZWZpbmVNYWNybyhuYW1lLCBmbGV4TWVtYmVyKSB9IEMyX1BBQ0s7IG5hbWVzcGFjZSB7CisjZGVmaW5lIF9fX0RFRklORV9BTkRfREVTQ1JJQkVfRkxFWF9DMlNUUlVDVChuYW1lLCBmbGV4TWVtYmVyLCBkZWZpbmVNYWNybykgXAorICAgIGRlZmluZU1hY3JvKG5hbWUsIGZsZXhNZW1iZXIpIH0gQzJfUEFDSzsgXAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBDMiMjbmFtZSMjU3RydWN0OjpGaWVsZExpc3QoKSB7IHJldHVybiBfRklFTERfTElTVDsgfSBcCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEMyIyNuYW1lIyNTdHJ1Y3Q6Ol9GSUVMRF9MSVNUID0geworLy8vIFxlbmRpZgorCisKKy8qKgorICogUGFyYW1ldGVyIHJlZmxlY3RvciBjbGFzcy4KKyAqCisgKiBUaGlzIGNsYXNzIGNlbnRyYWxpemVzIHRoZSBkZXNjcmlwdGlvbiBvZiBwYXJhbWV0ZXIgc3RydWN0dXJlcy4gVGhpcyBjYW4gYmUgc2hhcmVkCisgKiBieSBtdWx0aXBsZSBjb21wb25lbnRzIGFzIGRlc2NyaWJpbmcgYSBwYXJhbWV0ZXIgZG9lcyBub3QgaW1wbHkgc3VwcG9ydCBvZiB0aGF0CisgKiBwYXJhbWV0ZXIuIEhvd2V2ZXIsIGVhY2ggc3VwcG9ydGVkIHBhcmFtZXRlciBhbmQgYW55IGRlcGVuZGVudCBzdHJ1Y3R1cmVzIHdpdGhpbgorICogbXVzdCBiZSBkZXNjcmliZWQgYnkgdGhlIHBhcmFtZXRlciByZWZsZWN0b3IgcHJvdmlkZWQgYnkgYSBjb21wb25lbnQuCisgKi8KK2NsYXNzIEMyUGFyYW1SZWZsZWN0b3IgeworcHVibGljOgorICAgIC8qKgorICAgICAqICBEZXNjcmliZXMgYSBwYXJhbWV0ZXIgc3RydWN0dXJlLgorICAgICAqCisgICAgICogIFxwYXJhbVtpbl0gY29yZUluZGV4IHRoZSBjb3JlIGluZGV4IG9mIHRoZSBwYXJhbWV0ZXIgc3RydWN0dXJlIGNvbnRhaW5pbmcgYXQgbGVhc3QgdGhlCisgICAgICogIGNvcmUgaW5kZXgKKyAgICAgKgorICAgICAqICBccmV0dXJuIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgcGFyYW1ldGVyIHN0cnVjdHVyZQorICAgICAqICBccmV0dmFsIG51bGxwdHIgaWYgdGhlIHBhcmFtZXRlciBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgcmVmbGVjdG9yCisgICAgICoKKyAgICAgKiAgVGhpcyBtZXRob2RzIHNoYWxsIG5vdCBibG9jayBhbmQgcmV0dXJuIGltbWVkaWF0ZWx5LgorICAgICAqCisgICAgICogIFxub3RlIHRoaXMgY2xhc3MgZG9lcyBub3QgdGFrZSBhIHNldCBvZiBpbmRpY2VzIGJlY2F1c2Ugd2Ugd291bGQgdGhlbiBwcmVmZXIKKyAgICAgKiAgdG8gYWxzbyByZXR1cm4gYW55IGRlcGVuZGVudCBzdHJ1Y3R1cmVzLCBhbmQgd2UgZG9uJ3Qgd2FudCB0aGlzIGxvZ2ljIHRvIGJlCisgICAgICogIHJlcGVhdGVkIGluIGVhY2ggcmVmbGVjdG9yLiBBbHRlcm5hdGVseSwgdGhpcyBjb3VsZCBqdXN0IHJldHVybiBhIG1hcCBvZiBhbGwKKyAgICAgKiAgZGVzY3JpcHRpb25zLCBidXQgd2Ugd2FudCB0byBjb25zZXJ2ZSBtZW1vcnkgaWYgY2xpZW50IG9ubHkgd2FudHMgdGhlIGRlc2NyaXB0aW9uCisgICAgICogIG9mIGEgZmV3IGluZGljZXMuCisgICAgICovCisgICAgdmlydHVhbCBzdGQ6OnVuaXF1ZV9wdHI8QzJTdHJ1Y3REZXNjcmlwdG9yPiBkZXNjcmliZShDMlBhcmFtOjpDb3JlSW5kZXggY29yZUluZGV4KSBjb25zdCA9IDA7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5DMlBhcmFtUmVmbGVjdG9yKCkgPSBkZWZhdWx0OworfTsKKworLyoqCisgKiBHZW5lcmljIHN1cHBvcnRlZCB2YWx1ZXMgZm9yIGEgZmllbGQuCisgKgorICogVGhpcyBjYW4gYmUgZWl0aGVyIGEgcmFuZ2Ugb3IgYSBzZXQgb2YgdmFsdWVzLiBUaGUgcmFuZ2UgY2FuIGJlIGEgc2ltcGxlIHJhbmdlLCBhbiBhcml0aG1ldGljLAorICogZ2VvbWV0cmljIG9yIG11bHRpcGx5LWFjY3VtdWxhdGUgc2VyaWVzIHdpdGggYSBjbGVhciBtaW5pbXVtIGFuZCBtYXhpbXVtIHZhbHVlLiBWYWx1ZXMgY2FuCisgKiBiZSBkaXNjcmV0ZSB2YWx1ZXMsIG9yIGNhbiBvcHRpb25hbGx5IHJlcHJlc2VudCBmbGFncyB0byBiZSBvci1lZC4KKyAqCisgKiBcbm90ZSBEbyBub3QgdXNlIGZsYWdzIHRvIHJlcHJlc2VudCBiaXRmaWVsZHMuIFVzZSBpbmRpdmlkdWFsIHZhbHVlcyBvciBzZXBhcmF0ZSBmaWVsZHMgaW5zdGVhZC4KKyAqLworc3RydWN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgeworLy9wdWJsaWM6CisgICAgZW51bSB0eXBlX3QgeworICAgICAgICBFTVBUWSwgICAgICAvLy88IG5vIHN1cHBvcnRlZCB2YWx1ZXMKKyAgICAgICAgUkFOR0UsICAgICAgLy8vPCBhIG51bWVyaWMgcmFuZ2UgdGhhdCBjYW4gYmUgY29udGludW91cyBvciBkaXNjcmV0ZQorICAgICAgICBWQUxVRVMsICAgICAvLy88IGEgbGlzdCBvZiB2YWx1ZXMKKyAgICAgICAgRkxBR1MgICAgICAgLy8vPCBhIGxpc3Qgb2YgZmxhZ3MgdGhhdCBjYW4gYmUgT1ItZWQKKyAgICB9OworCisgICAgdHlwZV90IHR5cGU7IC8qKiBUeXBlIG9mIHZhbHVlcyBmb3IgdGhpcyBmaWVsZC4gKi8KKworICAgIHR5cGVkZWYgQzJWYWx1ZTo6UHJpbWl0aXZlIFByaW1pdGl2ZTsKKworICAgIC8qKgorICAgICAqIFJhbmdlIHNwZWNpZmllciBmb3Igc3VwcG9ydGVkIHZhbHVlLiBVc2VkIGlmIHR5cGUgaXMgUkFOR0UuCisgICAgICoKKyAgICAgKiBJZiBzdGVwIGlzIDAgYW5kIG51bSBhbmQgZGVub20gYXJlIGJvdGggMSwgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgYXJlIGFueSB2YWx1ZSwgZm9yIHdoaWNoCisgICAgICogbWluIDw9IHZhbHVlIDw9IG1heC4KKyAgICAgKgorICAgICAqIE90aGVyd2lzZSwgdGhlIHJhbmdlIHJlcHJlc2VudHMgYSBnZW9tZXRyaWMvYXJpdGhtZXRpYy9tdWx0aXBseS1hY2N1bXVsYXRlIHNlcmllcywgd2hlcmUKKyAgICAgKiBzdWNjZXNzaXZlIHN1cHBvcnRlZCB2YWx1ZXMgY2FuIGJlIGRlcml2ZWQgZnJvbSBwcmV2aW91cyB2YWx1ZXMgKHN0YXJ0aW5nIGF0IG1pbiksIHVzaW5nIHRoZQorICAgICAqIGZvbGxvd2luZyBmb3JtdWxhOgorICAgICAqICB2WzBdID0gbWluCisgICAgICogIHZbaV0gPSB2W2ktMV0gKiBudW0gLyBkZW5vbSArIHN0ZXAgZm9yIGkgPj0gMSwgd2hpbGUgbWluIDwgdltpXSA8PSBtYXguCisgICAgICovCisgICAgc3RydWN0IHsKKyAgICAgICAgLyoqIExvd2VyIGVuZCBvZiB0aGUgcmFuZ2UgKGluY2x1c2l2ZSkuICovCisgICAgICAgIFByaW1pdGl2ZSBtaW47CisgICAgICAgIC8qKiBVcHBlciBlbmQgb2YgdGhlIHJhbmdlIChpbmNsdXNpdmUgaWYgcGVybWl0dGVkIGJ5IHNlcmllcykuICovCisgICAgICAgIFByaW1pdGl2ZSBtYXg7CisgICAgICAgIC8qKiBTdGVwIGJldHdlZW4gc3VwcG9ydGVkIHZhbHVlcy4gKi8KKyAgICAgICAgUHJpbWl0aXZlIHN0ZXA7CisgICAgICAgIC8qKiBOdW1lcmF0b3Igb2YgYSBnZW9tZXRyaWMgc2VyaWVzLiAqLworICAgICAgICBQcmltaXRpdmUgbnVtOworICAgICAgICAvKiogRGVub21pbmF0b3Igb2YgYSBnZW9tZXRyaWMgc2VyaWVzLiAqLworICAgICAgICBQcmltaXRpdmUgZGVub207CisgICAgfSByYW5nZTsKKworICAgIC8qKgorICAgICAqIExpc3Qgb2YgdmFsdWVzLiBVc2VkIGlmIHR5cGUgaXMgVkFMVUVTIG9yIEZMQUdTLgorICAgICAqCisgICAgICogSWYgdHlwZSBpcyBWQUxVRVMsIHRoaXMgaXMgdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIHZhbHVlcyBpbiBkZWNyZWFzaW5nIHByZWZlcmVuY2UuCisgICAgICoKKyAgICAgKiBJZiB0eXBlIGlzIEZMQUdTLCB0aGlzIHZlY3RvciBjb250YWlucyB7IG1pbi1tYXNrLCBmbGFnMSwgZmxhZzIuLi4gfS4gQmFzaWNhbGx5LCB0aGUgZmlyc3QKKyAgICAgKiB2YWx1ZSBpcyB0aGUgcmVxdWlyZWQgc2V0IG9mIGZsYWdzIHRvIGJlIHNldCwgYW5kIHRoZSByZXN0IG9mIHRoZSB2YWx1ZXMgYXJlIGZsYWdzIHRoYXQgY2FuCisgICAgICogYmUgc2V0IGluZGVwZW5kZW50bHkuIEZMQUdTIGlzIG9ubHkgc3VwcG9ydGVkIGZvciBpbnRlZ3JhbCB0eXBlcy4gU3VwcG9ydGVkIGZsYWdzIHNob3VsZAorICAgICAqIG5vdCBvdmVybGFwLCBhcyBpdCBjYW4gbWFrZSB2YWxpZGF0aW9uIG5vbi1kZXRlcm1pbmlzdGljLiBUaGUgc3RhbmRhcmQgdmFsaWRhdGlvbiBtZXRob2QKKyAgICAgKiBpcyB0aGF0IHN0YXJ0aW5nIGZyb20gdGhlIG9yaWdpbmFsIHZhbHVlLCBpZiBlYWNoIGZsYWcgaXMgcmVtb3ZlZCB3aGVuIGZ1bGx5IHByZXNlbnQgKHRoZQorICAgICAqIG1pbi1tYXNrIG11c3QgYmUgZnVsbHkgcHJlc2VudCksIHdlIHNoYWxsIGFycml2ZSBhdCAwLgorICAgICAqLworICAgIHN0ZDo6dmVjdG9yPFByaW1pdGl2ZT4gdmFsdWVzOworCisgICAgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcygpCisgICAgICAgIDogdHlwZShFTVBUWSkgeworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyhUIG1pbiwgVCBtYXgsIFQgc3RlcCA9IFQoc3RkOjppc19mbG9hdGluZ19wb2ludDxUPjo6dmFsdWUgPyAwIDogMSkpCisgICAgICAgIDogdHlwZShSQU5HRSksCisgICAgICAgICAgcmFuZ2V7bWluLCBtYXgsIHN0ZXAsIChUKTEsIChUKTF9IHsgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzKFQgbWluLCBUIG1heCwgVCBudW0sIFQgZGVuKSA6CisgICAgICAgIHR5cGUoUkFOR0UpLAorICAgICAgICByYW5nZXttaW4sIG1heCwgKFQpMCwgbnVtLCBkZW59IHsgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzKFQgbWluLCBUIG1heCwgVCBzdGVwLCBUIG51bSwgVCBkZW4pCisgICAgICAgIDogdHlwZShSQU5HRSksCisgICAgICAgICAgcmFuZ2V7bWluLCBtYXgsIHN0ZXAsIG51bSwgZGVufSB7IH0KKworICAgIC8vLyBcZGVwcmVjYXRlZAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyhib29sIGZsYWdzLCBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8VD4gbGlzdCkKKyAgICAgICAgOiB0eXBlKGZsYWdzID8gRkxBR1MgOiBWQUxVRVMpLAorICAgICAgICAgIHJhbmdleyhUKTAsIChUKTAsIChUKTAsIChUKTAsIChUKTB9IHsKKyAgICAgICAgZm9yIChUIHZhbHVlIDogbGlzdCkgeworICAgICAgICAgICAgdmFsdWVzLmVtcGxhY2VfYmFjayh2YWx1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLy8gXGRlcHJlY2F0ZWQKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMoYm9vbCBmbGFncywgY29uc3Qgc3RkOjp2ZWN0b3I8VD4mIGxpc3QpCisgICAgICAgIDogdHlwZShmbGFncyA/IEZMQUdTIDogVkFMVUVTKSwKKyAgICAgICAgICByYW5nZXsoVCkwLCAoVCkwLCAoVCkwLCAoVCkwLCAoVCkwfSB7CisgICAgICAgIGZvcihUIHZhbHVlIDogbGlzdCkgeworICAgICAgICAgICAgdmFsdWVzLmVtcGxhY2VfYmFjayh2YWx1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLy8gXGludGVybmFsCisgICAgLy8vIFx0b2RvOiBjcmVhdGUgc2VwYXJhdGUgdmFsdWVzIHZzLiBmbGFncyBpbml0aWFsaXplciBhcyBmb3IgZmxhZ3Mgd2Ugd2FudAorICAgIC8vLyB0byBsaXN0IGJvdGggYWxsb3dlZCBhbmQgcmVxdWlyZWQgZmxhZ3MKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBFPWRlY2x0eXBlKEMyRmllbGREZXNjcmlwdG9yOjpuYW1lZFZhbHVlc0ZvcigqKFQqKTApKT4KKyAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzKGJvb2wgZmxhZ3MsIGNvbnN0IFQqKQorICAgICAgICA6IHR5cGUoZmxhZ3MgPyBGTEFHUyA6IFZBTFVFUyksCisgICAgICAgICAgcmFuZ2V7KFQpMCwgKFQpMCwgKFQpMCwgKFQpMCwgKFQpMH0geworICAgICAgICAgICAgICBDMkZpZWxkRGVzY3JpcHRvcjo6TmFtZWRWYWx1ZXNUeXBlIG5hbWVkID0gQzJGaWVsZERlc2NyaXB0b3I6Om5hbWVkVmFsdWVzRm9yKCooVCopMCk7CisgICAgICAgIGlmIChmbGFncykgeworICAgICAgICAgICAgdmFsdWVzLmVtcGxhY2VfYmFjaygwKTsgLy8gbWluLW1hc2sgZGVmYXVsdHMgdG8gMAorICAgICAgICB9CisgICAgICAgIGZvciAoY29uc3QgQzJGaWVsZERlc2NyaXB0b3I6Ok5hbWVkVmFsdWVUeXBlICZpdGVtIDogbmFtZWQpeworICAgICAgICAgICAgdmFsdWVzLmVtcGxhY2VfYmFjayhpdGVtLnNlY29uZCk7CisgICAgICAgIH0KKyAgICB9Cit9OworCisvKioKKyAqIFN1cHBvcnRlZCB2YWx1ZXMgZm9yIGEgc3BlY2lmaWMgZmllbGQuCisgKgorICogVGhpcyBpcyBhIHBhaXIgb2YgdGhlIGZpZWxkIHNwZWNpZmllciB0b2dldGhlciB3aXRoIGFuIG9wdGlvbmFsIHN1cHBvcnRlZCB2YWx1ZXMgb2JqZWN0LgorICogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB3aGVuIHJlcG9ydGluZyBwYXJhbWV0ZXIgY29uZmlndXJhdGlvbiBmYWlsdXJlcyBhbmQgY29uZmxpY3RzLgorICovCitzdHJ1Y3QgQzJQYXJhbUZpZWxkVmFsdWVzIHsKKyAgICBDMlBhcmFtRmllbGQgcGFyYW1PckZpZWxkOyAvLy88IHRoZSBmaWVsZCBvciBwYXJhbWV0ZXIKKyAgICAvLy8gb3B0aW9uYWwgc3VwcG9ydGVkIHZhbHVlcyBmb3IgdGhlIGZpZWxkIGlmIHBhcmFtT3JGaWVsZCBzcGVjaWZpZXMgYW4gYWN0dWFsIGZpZWxkIHRoYXQgaXMKKyAgICAvLy8gbnVtZXJpYyAobm9uIHN0cnVjdCwgYmxvYiBvciBzdHJpbmcpLiBTdXBwb3J0ZWQgdmFsdWVzIGZvciBhcnJheXMgKGluY2x1ZGluZyBzdHJpbmcgYW5kCisgICAgLy8vIGJsb2JzKSBkZXNjcmliZSB0aGUgc3VwcG9ydGVkIHZhbHVlcyBmb3IgZWFjaCBlbGVtZW50IChjaGFyYWN0ZXIgZm9yIHN0cmluZywgYW5kIGJ5dGVzIGZvcgorICAgIC8vLyBibG9icykuIEl0IGlzIG9wdGlvbmFsIGZvciByZWFkLW9ubHkgc3RyaW5ncyBhbmQgYmxvYnMuCisgICAgc3RkOjp1bmlxdWVfcHRyPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM+IHZhbHVlczsKKworICAgIC8vIFRoaXMgc3RydWN0IGlzIG1lYW50IHRvIGJlIG1vdmUgY29uc3RydWN0ZWQuCisgICAgQzJfREVGQVVMVF9NT1ZFKEMyUGFyYW1GaWVsZFZhbHVlcyk7CisKKyAgICAvLyBDb3B5IGNvbnN0cnVjdG9yL2Fzc2lnbm1lbnQgaXMgYWxzbyBwcm92aWRlZCBhcyB0aGlzIG9iamVjdCBtYXkgZ2V0IGNvcGllZC4KKyAgICBDMlBhcmFtRmllbGRWYWx1ZXMoY29uc3QgQzJQYXJhbUZpZWxkVmFsdWVzICZvdGhlcikKKyAgICAgICAgOiBwYXJhbU9yRmllbGQob3RoZXIucGFyYW1PckZpZWxkKSwKKyAgICAgICAgICB2YWx1ZXMob3RoZXIudmFsdWVzID8gc3RkOjptYWtlX3VuaXF1ZTxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzPigqb3RoZXIudmFsdWVzKSA6IG51bGxwdHIpIHsgfQorCisgICAgQzJQYXJhbUZpZWxkVmFsdWVzJiBvcGVyYXRvcj0oY29uc3QgQzJQYXJhbUZpZWxkVmFsdWVzICZvdGhlcikgeworICAgICAgICBwYXJhbU9yRmllbGQgPSBvdGhlci5wYXJhbU9yRmllbGQ7CisgICAgICAgIHZhbHVlcyA9IG90aGVyLnZhbHVlcyA/IHN0ZDo6bWFrZV91bmlxdWU8QzJGaWVsZFN1cHBvcnRlZFZhbHVlcz4oKm90aGVyLnZhbHVlcykgOiBudWxscHRyOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Qgd2l0aCBubyB2YWx1ZXMuCisgICAgICovCisgICAgQzJQYXJhbUZpZWxkVmFsdWVzKGNvbnN0IEMyUGFyYW1GaWVsZCAmcGFyYW1PckZpZWxkXykKKyAgICAgICAgOiBwYXJhbU9yRmllbGQocGFyYW1PckZpZWxkXykgeyB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Qgd2l0aCB2YWx1ZXMuCisgICAgICovCisgICAgQzJQYXJhbUZpZWxkVmFsdWVzKGNvbnN0IEMyUGFyYW1GaWVsZCAmcGFyYW1PckZpZWxkXywgY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyAmdmFsdWVzXykKKyAgICAgICAgOiBwYXJhbU9yRmllbGQocGFyYW1PckZpZWxkXyksCisgICAgICAgICAgdmFsdWVzKHN0ZDo6bWFrZV91bmlxdWU8QzJGaWVsZFN1cHBvcnRlZFZhbHVlcz4odmFsdWVzXykpIHsgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGZyb20gZmllbGRzLgorICAgICAqLworICAgIEMyUGFyYW1GaWVsZFZhbHVlcyhjb25zdCBDMlBhcmFtRmllbGQgJnBhcmFtT3JGaWVsZF8sIHN0ZDo6dW5pcXVlX3B0cjxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzPiAmJnZhbHVlc18pCisgICAgICAgIDogcGFyYW1PckZpZWxkKHBhcmFtT3JGaWVsZF8pLAorICAgICAgICAgIHZhbHVlcyhzdGQ6Om1vdmUodmFsdWVzXykpIHsgfQorfTsKKworLy8vIEB9CisKKy8vIGluY2x1ZGUgZGVidWcgaGVhZGVyIGZvciBDMlBhcmFtcy5oIGlmIEMyRGVidWcuaCB3YXMgYWxyZWFkeSBpbmNsdWRlZAorI2lmZGVmIEMyVVRJTFNfREVCVUdfSF8KKyNpbmNsdWRlIDx1dGlsL0MyRGVidWctcGFyYW0uaD4KKyNlbmRpZgorCisjZW5kaWYgIC8vIEMyUEFSQU1fSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9pbmNsdWRlL0MyUGFyYW1EZWYuaCBiL21lZGlhL2NvZGVjMi9pbmNsdWRlL0MyUGFyYW1EZWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTMzMjgzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2luY2x1ZGUvQzJQYXJhbURlZi5oCkBAIC0wLDAgKzEsOTMxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqIFxmaWxlCisgKiBUZW1wbGF0ZXMgdXNlZCB0byBkZWNsYXJlIHBhcmFtZXRlcnMuCisgKi8KKyNpZm5kZWYgQzJQQVJBTV9ERUZfSF8KKyNkZWZpbmUgQzJQQVJBTV9ERUZfSF8KKworI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorCisjaW5jbHVkZSA8QzJQYXJhbS5oPgorCisvLy8gXGFkZHRvZ3JvdXAgUGFyYW1ldGVycworLy8vIEB7CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PSBVVElMSVRZIFRFTVBMQVRFUyBGT1IgUEFSQU1FVEVSIERFRklOSVRJT05TID09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisvLy8gXGFkZHRvZ3JvdXAgaW50ZXJuYWwKKy8vLyBAeworCisvLy8gSGVscGVyIGNsYXNzIHRoYXQgY2hlY2tzIGlmIGEgdHlwZSBoYXMgZXF1YWxpdHkgYW5kIGluZXF1YWxpdHkgb3BlcmF0b3JzLgorc3RydWN0IEMyX0hJREUgX0MyQ29tcGFyYWJsZV9pbXBsCit7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgUywgdHlwZW5hbWU9ZGVjbHR5cGUoUygpID09IFMoKSk+CisgICAgc3RhdGljIHN0ZDo6dHJ1ZV90eXBlIFRlc3RFcXVhbChpbnQpOworICAgIHRlbXBsYXRlPHR5cGVuYW1lPgorICAgIHN0YXRpYyBzdGQ6OmZhbHNlX3R5cGUgVGVzdEVxdWFsKC4uLik7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBTLCB0eXBlbmFtZT1kZWNsdHlwZShTKCkgIT0gUygpKT4KKyAgICBzdGF0aWMgc3RkOjp0cnVlX3R5cGUgVGVzdE5vdEVxdWFsKGludCk7CisgICAgdGVtcGxhdGU8dHlwZW5hbWU+CisgICAgc3RhdGljIHN0ZDo6ZmFsc2VfdHlwZSBUZXN0Tm90RXF1YWwoLi4uKTsKK307CisKKy8qKgorICogSGVscGVyIHRlbXBsYXRlIHRoYXQgcmV0dXJucyBpZiBhIHR5cGUgaGFzIGVxdWFsaXR5IGFuZCBpbmVxdWFsaXR5IG9wZXJhdG9ycy4KKyAqCisgKiBVc2UgYXMgX0MyQ29tcGFyYWJsZTx0eXBlbmFtZSBTPjo6dmFsdWUuCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFM+CitzdHJ1Y3QgQzJfSElERSBfQzJDb21wYXJhYmxlCisgICAgOiBwdWJsaWMgc3RkOjppbnRlZ3JhbF9jb25zdGFudDxib29sLCBkZWNsdHlwZShfQzJDb21wYXJhYmxlX2ltcGw6OlRlc3RFcXVhbDxTPigwKSk6OnZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICB8fCBkZWNsdHlwZShfQzJDb21wYXJhYmxlX2ltcGw6OlRlc3ROb3RFcXVhbDxTPigwKSk6OnZhbHVlPiB7Cit9OworCisvLy8gIEhlbHBlciBjbGFzcyB0aGF0IGNoZWNrcyBpZiBhIHR5cGUgaGFzIGEgQ09SRV9JTkRFWCBjb25zdGFudC4KK3N0cnVjdCBDMl9ISURFIF9DMkNvcmVJbmRleEhlbHBlcl9pbXBsCit7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgUywgaW50PVM6OkNPUkVfSU5ERVg+CisgICAgc3RhdGljIHN0ZDo6dHJ1ZV90eXBlIFRlc3RDb3JlSW5kZXgoaW50KTsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZT4KKyAgICBzdGF0aWMgc3RkOjpmYWxzZV90eXBlIFRlc3RDb3JlSW5kZXgoLi4uKTsKK307CisKKy8vLyBNYWNybyB0aGF0IGRlZmluZXMgYW5kIHRodXMgb3ZlcnJpZGVzIGEgdHlwZSdzIENPUkVfSU5ERVggZm9yIGEgc2V0dGluZworI2RlZmluZSBfQzJfQ09SRV9JTkRFWF9PVkVSUklERShjb3JlSW5kZXgpIFwKK3B1YmxpYzogXAorICAgIGVudW0gOiB1aW50MzJfdCB7IENPUkVfSU5ERVggPSBjb3JlSW5kZXggfTsKKworCisvLy8gSGVscGVyIHRlbXBsYXRlIHRoYXQgYWRkcyBhIENPUkVfSU5ERVggdG8gYSB0eXBlIGlmIGl0IGRvZXMgbm90IGhhdmUgb25lIChmb3IgdGVzdGluZykKK3RlbXBsYXRlPHR5cGVuYW1lIFMsIGludCBDb3JlSW5kZXg+CitzdHJ1Y3QgQzJfSElERSBfQzJBZGRDb3JlSW5kZXggOiBwdWJsaWMgUyB7CisgICAgX0MyX0NPUkVfSU5ERVhfT1ZFUlJJREUoQ29yZUluZGV4KQorfTsKKworLyoqCisgKiBcYnJpZWYgSGVscGVyIGNsYXNzIHRvIGNoZWNrIHN0cnVjdCByZXF1aXJlbWVudHMgZm9yIHBhcmFtZXRlcnMuCisgKgorICogRmVhdHVyZXM6CisgKiAgLSB2ZXJpZnkgZGVmYXVsdCBjb25zdHJ1Y3Rvciwgbm8gdmlydHVhbCBtZXRob2RzLCBhbmQgbm8gZXF1YWxpdHkgb3BlcmF0b3JzLgorICogIC0gZXhwb3NlIFBBUkFNX1RZUEUsIGFuZCBub24tZmxleCBGTEVYX1NJWkUuCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFMsIGludCBDb3JlSW5kZXgsIHVuc2lnbmVkIFR5cGVGbGFncz4KK3N0cnVjdCBDMl9ISURFIF9DMlN0cnVjdENoZWNrIHsKKyAgICBzdGF0aWNfYXNzZXJ0KAorICAgICAgICAgICAgc3RkOjppc19kZWZhdWx0X2NvbnN0cnVjdGlibGU8Uz46OnZhbHVlLCAiQzIgc3RydWN0dXJlIG11c3QgaGF2ZSBkZWZhdWx0IGNvbnN0cnVjdG9yIik7CisgICAgc3RhdGljX2Fzc2VydCghc3RkOjppc19wb2x5bW9ycGhpYzxTPjo6dmFsdWUsICJDMiBzdHJ1Y3R1cmUgbXVzdCBub3QgaGF2ZSB2aXJ0dWFsIG1ldGhvZHMiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KCFfQzJDb21wYXJhYmxlPFM+Ojp2YWx1ZSwgIkMyIHN0cnVjdHVyZSBtdXN0IG5vdCBoYXZlIG9wZXJhdG9yPT0gb3IgIT0iKTsKKworcHVibGljOgorICAgIGVudW0gOiB1aW50MzJfdCB7CisgICAgICAgIFBBUkFNX1RZUEUgPSBDb3JlSW5kZXggfCBUeXBlRmxhZ3MKKyAgICB9OworCitwcm90ZWN0ZWQ6CisgICAgZW51bSA6IHVpbnQzMl90IHsKKyAgICAgICAgRkxFWF9TSVpFID0gMCwKKyAgICB9OworfTsKKworLy8vIEhlbHBlciBjbGFzcyB0aGF0IGNoZWNrcyBpZiBhIHR5cGUgaGFzIGFuIGludGVnZXIgRkxFWF9TSVpFIG1lbWJlci4KK3N0cnVjdCBDMl9ISURFIF9DMkZsZXhpYmxlX2ltcGwgeworICAgIC8vLyBzcGVjaWFsaXphdGlvbiBmb3IgdHlwZXMgdGhhdCBoYXZlIGEgRkxFWF9TSVpFIG1lbWJlcgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFMsIHVuc2lnbmVkPVM6OkZMRVhfU0laRT4KKyAgICBzdGF0aWMgc3RkOjp0cnVlX3R5cGUgVGVzdEZsZXhTaXplKGludCk7CisgICAgdGVtcGxhdGU8dHlwZW5hbWU+CisgICAgc3RhdGljIHN0ZDo6ZmFsc2VfdHlwZSBUZXN0RmxleFNpemUoLi4uKTsKK307CisKKy8vLyBIZWxwZXIgdGVtcGxhdGUgdGhhdCByZXR1cm5zIGlmIGEgdHlwZSBoYXMgYW4gaW50ZWdlciBGTEVYX1NJWkUgbWVtYmVyLgordGVtcGxhdGU8dHlwZW5hbWUgUz4KK3N0cnVjdCBDMl9ISURFIF9DMkZsZXhpYmxlCisgICAgOiBwdWJsaWMgc3RkOjppbnRlZ3JhbF9jb25zdGFudDxib29sLCBkZWNsdHlwZShfQzJGbGV4aWJsZV9pbXBsOjpUZXN0RmxleFNpemU8Uz4oMCkpOjp2YWx1ZT4geworfTsKKworLy8vIE1hY3JvIHRvIHRlc3QgaWYgYSB0eXBlIGlzIGZsZXhpYmxlIChoYXMgYSBGTEVYX1NJWkUgbWVtYmVyKS4KKyNkZWZpbmUgSUZfRkxFWElCTEUoUykgRU5BQkxFX0lGKF9DMkZsZXhpYmxlPFM+Ojp2YWx1ZSkKKy8vLyBTaG9ydGhhbmQgZm9yIHN0ZDo6ZW5hYmxlX2lmCisjZGVmaW5lIEVOQUJMRV9JRihjb25kKSB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxjb25kPjo6dHlwZQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBWPXZvaWQ+CitzdHJ1Y3QgQzJfSElERSBfYzJfZW5hYmxlX2lmX3R5cGUgeworICAgIHR5cGVkZWYgViB0eXBlOworfTsKKworLy8vIEhlbHBlciB0ZW1wbGF0ZSB0aGF0IGV4cG9zZXMgdGhlIGZsZXhpYmxlIHN1YnR5cGUgb2YgYSBzdHJ1Y3QuCit0ZW1wbGF0ZTx0eXBlbmFtZSBTLCB0eXBlbmFtZSBFPXZvaWQ+CitzdHJ1Y3QgQzJfSElERSBfQzJGbGV4SGVscGVyIHsKKyAgICB0eXBlZGVmIHZvaWQgRmxleFR5cGU7CisgICAgZW51bSA6IHVpbnQzMl90IHsgRkxFWF9TSVpFID0gMCB9OworfTsKKworLy8vIFNwZWNpYWxpemF0aW9uIGZvciBmbGV4aWJsZSB0eXBlcy4gVGhpcyBvbmx5IHdvcmtzIGlmIF9GbGV4TWVtYmVyVHlwZSBpcyBwdWJsaWMuCit0ZW1wbGF0ZTx0eXBlbmFtZSBTPgorc3RydWN0IEMyX0hJREUgX0MyRmxleEhlbHBlcjxTLAorICAgICAgICB0eXBlbmFtZSBfYzJfZW5hYmxlX2lmX3R5cGU8dHlwZW5hbWUgUzo6X0ZsZXhNZW1iZXJUeXBlPjo6dHlwZT4geworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0MyRmxleEhlbHBlcjx0eXBlbmFtZSBTOjpfRmxleE1lbWJlclR5cGU+OjpGbGV4VHlwZSBGbGV4VHlwZTsKKyAgICBlbnVtIDogdWludDMyX3QgeyBGTEVYX1NJWkUgPSBfQzJGbGV4SGVscGVyPHR5cGVuYW1lIFM6Ol9GbGV4TWVtYmVyVHlwZT46OkZMRVhfU0laRSB9OworfTsKKworLy8vIFNwZWNpYWxpemF0aW9uIGZvciBmbGV4IGFycmF5cy4KK3RlbXBsYXRlPHR5cGVuYW1lIFM+CitzdHJ1Y3QgQzJfSElERSBfQzJGbGV4SGVscGVyPFNbXSwKKyAgICAgICAgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc192b2lkPHR5cGVuYW1lIF9DMkZsZXhIZWxwZXI8Uz46OkZsZXhUeXBlPjo6dmFsdWU+Ojp0eXBlPiB7CisgICAgdHlwZWRlZiBTIEZsZXhUeXBlOworICAgIGVudW0gOiB1aW50MzJfdCB7IEZMRVhfU0laRSA9IHNpemVvZihTKSB9OworfTsKKworLyoqCisgKiBcYnJpZWYgSGVscGVyIGNsYXNzIHRvIGNoZWNrIGZsZXhpYmxlIHN0cnVjdCByZXF1aXJlbWVudHMgYW5kIGFkZCBjb21tb24gb3BlcmF0aW9ucy4KKyAqCisgKiBGZWF0dXJlczoKKyAqICAtIGV4cG9zZSBDT1JFX0lOREVYIGFuZCBGaWVsZExpc3QgKHRoaXMgaXMgbm9ybWFsbHkgaW5oZXJpdGVkIGZyb20gdGhlIHN0cnVjdCwgYnV0IGZsZXhpYmxlCisgKiAgICBzdHJ1Y3RzIGNhbm5vdCBiZSBiYXNlIGNsYXNzZXMgYW5kIHRodXMgaW5oZXJpdGVkIGZyb20pCisgKiAgLSBkaXNhYmxlIGNvcHkgYXNzaWdubWVudCBhbmQgY29uc3RydWN0aW9uIChUT0RPOiB0aGlzIGlzIGFscmVhZHkgZG9uZSBpbiB0aGUgRkxFWCBtYWNybyBmb3IgdGhlCisgKiAgICBmbGV4aWJsZSBzdHJ1Y3QsIHNvIG1heSBub3QgYmUgbmVlZGVkIGhlcmUpCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFMsIGludCBQYXJhbUluZGV4LCB1bnNpZ25lZCBUeXBlRmxhZ3M+CitzdHJ1Y3QgQzJfSElERSBfQzJGbGV4U3RydWN0Q2hlY2sgOgorLy8gYWRkIGZsZXhpYmxlIGZsYWcgYXMgX0MyU3RydWN0Q2hlY2sgZGVmaW5lcyBQQVJBTV9UWVBFCisgICAgICAgIHB1YmxpYyBfQzJTdHJ1Y3RDaGVjazxTLCBQYXJhbUluZGV4IHwgQzJQYXJhbTo6Q29yZUluZGV4OjpJU19GTEVYX0ZMQUcsIFR5cGVGbGFncz4geworcHVibGljOgorICAgIGVudW0gOiB1aW50MzJfdCB7CisgICAgICAgIC8vLyBcaGlkZWluaXRpYWxpemVyCisgICAgICAgIENPUkVfSU5ERVggPSBQYXJhbUluZGV4IHwgQzJQYXJhbTo6Q29yZUluZGV4OjpJU19GTEVYX0ZMQUcsIC8vLzwgZmxleGlibGUgc3RydWN0IGNvcmUtaW5kZXgKKyAgICB9OworCisgICAgaW5saW5lIHN0YXRpYyBjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gRmllbGRMaXN0KCkgeyByZXR1cm4gUzo6RmllbGRMaXN0KCk7IH0KKworICAgIC8vIGRlZmF1bHQgY29uc3RydWN0b3IgbmVlZGVkIGJlY2F1c2Ugb2YgdGhlIGRpc2FibGVkIGNvcHkgY29uc3RydWN0b3IKKyAgICBpbmxpbmUgX0MyRmxleFN0cnVjdENoZWNrKCkgPSBkZWZhdWx0OworCitwcm90ZWN0ZWQ6CisgICAgLy8gY2Fubm90IGNvcHkgZmxleGlibGUgcGFyYW1zCisgICAgX0MyRmxleFN0cnVjdENoZWNrKGNvbnN0IF9DMkZsZXhTdHJ1Y3RDaGVjazxTLCBQYXJhbUluZGV4LCBUeXBlRmxhZ3M+ICYpID0gZGVsZXRlOworICAgIF9DMkZsZXhTdHJ1Y3RDaGVjayYgb3BlcmF0b3I9IChjb25zdCBfQzJGbGV4U3RydWN0Q2hlY2s8UywgUGFyYW1JbmRleCwgVHlwZUZsYWdzPiAmKSA9IGRlbGV0ZTsKKworICAgIC8vIGNvbnN0YW50cyB1c2VkIGZvciBoZWxwZXIgbWV0aG9kcworICAgIGVudW0gOiB1aW50MzJfdCB7CisgICAgICAgIC8vLyBcaGlkZWluaXRpYWxpemVyCisgICAgICAgIEZMRVhfU0laRSA9IF9DMkZsZXhIZWxwZXI8Uz46OkZMRVhfU0laRSwgLy8vPCBzaXplIG9mIGZsZXhpYmxlIHR5cGUKKyAgICAgICAgLy8vIFxoaWRlaW5pdGlhbGl6ZXIKKyAgICAgICAgTUFYX1NJWkUgPSAodWludDMyX3Qpc3RkOjptaW4oKHNpemVfdClVSU5UMzJfTUFYLCBTSVpFX01BWCksIC8vIFRPRE86IGlzIHRoaXMgYWx3YXlzIHUzMiBtYXg/CisgICAgICAgIC8vLyBcaGlkZWluaXRpYWxpemVyCisgICAgICAgIEJBU0VfU0laRSA9IHNpemVvZihTKSArIHNpemVvZihDMlBhcmFtKSwgLy8vPCBzaXplIG9mIHRoZSBiYXNlIHBhcmFtCisgICAgfTsKKworICAgIC8vLyByZXR1cm5zIHRoZSBhbGxvY2F0ZWQgc2l6ZSBvZiB0aGlzIHBhcmFtIHdpdGggZmxleENvdW50LCBvciAwIGlmIGl0IHdvdWxkIG92ZXJmbG93LgorICAgIGlubGluZSBzdGF0aWMgc2l6ZV90IENhbGNTaXplKHNpemVfdCBmbGV4Q291bnQsIHNpemVfdCBzaXplID0gQkFTRV9TSVpFKSB7CisgICAgICAgIGlmIChmbGV4Q291bnQgPD0gKE1BWF9TSVpFIC0gc2l6ZSkgLyBTOjpGTEVYX1NJWkUpIHsKKyAgICAgICAgICAgIHJldHVybiBzaXplICsgUzo6RkxFWF9TSVpFICogZmxleENvdW50OworICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8vLyBkeW5hbWljIG5ldyBvcGVyYXRvciB1c2FibGUgZm9yIHBhcmFtcyBvZiB0eXBlIFMKKyAgICBpbmxpbmUgdm9pZCogb3BlcmF0b3IgbmV3KHNpemVfdCBzaXplLCBzaXplX3QgZmxleENvdW50KSBub2V4Y2VwdCB7CisgICAgICAgIC8vIFRPRE86IGFzc2VydChzaXplID09IEJBU0VfU0laRSk7CisgICAgICAgIHNpemUgPSBDYWxjU2l6ZShmbGV4Q291bnQsIHNpemUpOworICAgICAgICBpZiAoc2l6ZSA+IDApIHsKKyAgICAgICAgICAgIHJldHVybiA6Om9wZXJhdG9yIG5ldyhzaXplKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9Cit9OworCisvLy8gRGVmaW5lIEZyb20oKSBjYXN0IG9wZXJhdG9ycyBmb3IgcGFyYW1zLgorI2RlZmluZSBERUZJTkVfQ0FTVF9PUEVSQVRPUlMoX1R5cGUpIFwKKyAgICBpbmxpbmUgc3RhdGljIF9UeXBlKiBGcm9tKEMyUGFyYW0gKm90aGVyKSB7IFwKKyAgICAgICAgcmV0dXJuIChfVHlwZSopQzJQYXJhbTo6SWZTdWl0YWJsZSggXAorICAgICAgICAgICAgICAgIG90aGVyLCBzaXplb2YoX1R5cGUpLCBfVHlwZTo6UEFSQU1fVFlQRSwgX1R5cGU6OkZMRVhfU0laRSwgXAorICAgICAgICAgICAgICAgIChfVHlwZTo6UEFSQU1fVFlQRSAmIFQ6OkluZGV4OjpESVJfVU5ERUZJTkVEKSAhPSBUOjpJbmRleDo6RElSX1VOREVGSU5FRCk7IFwKKyAgICB9IFwKKyAgICBpbmxpbmUgc3RhdGljIGNvbnN0IF9UeXBlKiBGcm9tKGNvbnN0IEMyUGFyYW0gKm90aGVyKSB7IFwKKyAgICAgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8Y29uc3QgX1R5cGUqPihGcm9tKGNvbnN0X2Nhc3Q8QzJQYXJhbSAqPihvdGhlcikpKTsgXAorICAgIH0gXAorICAgIGlubGluZSBzdGF0aWMgX1R5cGUqIEZyb20oc3RkOjpudWxscHRyX3QpIHsgcmV0dXJuIG51bGxwdHI7IH0gXAorCisvKioKKyAqIERlZmluZSBmbGV4aWJsZSBhbGxvY2F0b3JzIChBbGxvY1NoYXJlZCBvciBBbGxvY1VuaXF1ZSkgZm9yIGZsZXhpYmxlIHBhcmFtcy4KKyAqICAtIFA6OkFsbG9jWHl6KGZsZXhDb3VudCwgYXJncy4uLik6IGFsbG9jYXRlIGZvciBnaXZlbiBmbGV4LWNvdW50LiBUaGlzIG1hcHMgdG8KKyAqICAgICAgICAgIFQoZmxleENvdW50LCBhcmdzLi4uKVwKKyAqCisgKiBDbGFuZyBkb2VzIG5vdCBzdXBwb3J0IGFyZ3MuLi4gZm9sbG93ZWQgYnkgdGVtcGxhdGVkIHBhcmFtIGFzIGFyZ3MuLi4gZWF0cyBpdC4gSGVuY2UsCisgKiBwcm92aWRlIHNwZWNpYWxpemF0aW9ucyB3aGVyZSB0aGUgaW5pdGlhbGl6ZXIgcmVwbGFjZXMgdGhlIGZsZXhDb3VudC4KKyAqCisgKiBTcGVjaWFsaXphdGlvbnMgdGhhdCBkZWR1Y2UgZmxleENvdW50OgorICogIC0gUDo6QWxsb2NYeXooVFtdLCBhcmdzLi4uKTogYWxsb2NhdGUgZm9yIHNpemUgb2YgKGFuZCB3aXRoKSBpbml0IGFycmF5LgorICogIC0gUDo6QWxsb2NYeXooc3RkOjppbml0aWFsaXplcl9saXN0PFQ+LCBhcmdzLi4uKTogYWxsb2NhdGUgZm9yIHNpemUgb2YgKGFuZCB3aXRoKSBpbml0aWFsaXplcgorICogICAgICAgICAgICBsaXN0LgorICogIC0gUDo6QWxsb2NYeXooc3RkOjp2ZWN0b3I8VD4sIGFyZ3MuLi4pOiBhbGxvY2F0ZSBmb3Igc2l6ZSBvZiAoYW5kIHdpdGgpIGluaXQgdmVjdG9yLgorICogIFRoZXNlIHNwZWNpYWxpemF0aW9ucyBtYXAgdG8gVChmbGV4Q291bnQgPSBzaXplLW9mLWluaXQsIGFyZ3MuLi4sIGluaXQpCisgKi8KKyNkZWZpbmUgREVGSU5FX0ZMRVhJQkxFX0FMTE9DKF9UeXBlLCBTLCBwdHIsIFB0cikgXAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIC4uLkFyZ3M+IFwKKyAgICBpbmxpbmUgc3RhdGljIHN0ZDo6cHRyIyNfcHRyPF9UeXBlPiBBbGxvYyMjUHRyKHNpemVfdCBmbGV4Q291bnQsIGNvbnN0IEFyZ3MoJi4uLiBhcmdzKSkgeyBcCisgICAgICAgIHJldHVybiBzdGQ6OnB0ciMjX3B0cjxfVHlwZT4obmV3KGZsZXhDb3VudCkgX1R5cGUoZmxleENvdW50LCBhcmdzLi4uKSk7IFwKKyAgICB9IFwKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSAuLi5BcmdzLCB0eXBlbmFtZSBVPXR5cGVuYW1lIFM6OkZsZXhUeXBlPiBcCisgICAgaW5saW5lIHN0YXRpYyBzdGQ6OnB0ciMjX3B0cjxfVHlwZT4gQWxsb2MjI1B0ciggXAorICAgICAgICAgICAgY29uc3Qgc3RkOjppbml0aWFsaXplcl9saXN0PFU+ICZpbml0LCBjb25zdCBBcmdzKCYuLi4gYXJncykpIHsgXAorICAgICAgICByZXR1cm4gc3RkOjpwdHIjI19wdHI8X1R5cGU+KG5ldyhpbml0LnNpemUoKSkgX1R5cGUoaW5pdC5zaXplKCksIGFyZ3MuLi4sIGluaXQpKTsgXAorICAgIH0gXAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIC4uLkFyZ3MsIHR5cGVuYW1lIFU9dHlwZW5hbWUgUzo6RmxleFR5cGU+IFwKKyAgICBpbmxpbmUgc3RhdGljIHN0ZDo6cHRyIyNfcHRyPF9UeXBlPiBBbGxvYyMjUHRyKCBcCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxVPiAmaW5pdCwgY29uc3QgQXJncygmLi4uIGFyZ3MpKSB7IFwKKyAgICAgICAgcmV0dXJuIHN0ZDo6cHRyIyNfcHRyPF9UeXBlPihuZXcoaW5pdC5zaXplKCkpIF9UeXBlKGluaXQuc2l6ZSgpLCBhcmdzLi4uLCBpbml0KSk7IFwKKyAgICB9IFwKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSAuLi5BcmdzLCB0eXBlbmFtZSBVPXR5cGVuYW1lIFM6OkZsZXhUeXBlLCB1bnNpZ25lZCBOPiBcCisgICAgaW5saW5lIHN0YXRpYyBzdGQ6OnB0ciMjX3B0cjxfVHlwZT4gQWxsb2MjI1B0cihjb25zdCBVKCZpbml0KVtOXSwgY29uc3QgQXJncygmLi4uIGFyZ3MpKSB7IFwKKyAgICAgICAgcmV0dXJuIHN0ZDo6cHRyIyNfcHRyPF9UeXBlPihuZXcoTikgX1R5cGUoTiwgYXJncy4uLiwgaW5pdCkpOyBcCisgICAgfSBcCisKKy8qKgorICogRGVmaW5lIGZsZXhpYmxlIG1ldGhvZHMgQWxsb2NTaGFyZWQsIEFsbG9jVW5pcXVlIGFuZCBmbGV4Q291bnQuCisgKi8KKyNkZWZpbmUgREVGSU5FX0ZMRVhJQkxFX01FVEhPRFMoX1R5cGUsIFMpIFwKKyAgICBERUZJTkVfRkxFWElCTEVfQUxMT0MoX1R5cGUsIFMsIHNoYXJlZCwgU2hhcmVkKSBcCisgICAgREVGSU5FX0ZMRVhJQkxFX0FMTE9DKF9UeXBlLCBTLCB1bmlxdWUsIFVuaXF1ZSkgXAorICAgIGlubGluZSBzaXplX3QgZmxleENvdW50KCkgY29uc3QgeyBcCisgICAgICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKF9UeXBlKSA9PSBfVHlwZTo6QkFTRV9TSVpFLCAiaW5jb3JyZWN0IEJBU0VfU0laRSIpOyBcCisgICAgICAgIHNpemVfdCBzeiA9IHRoaXMtPnNpemUoKTsgXAorICAgICAgICBpZiAoc3ogPj0gc2l6ZW9mKF9UeXBlKSkgeyBcCisgICAgICAgICAgICByZXR1cm4gKHN6IC0gc2l6ZW9mKF9UeXBlKSkgLyBfVHlwZTo6RkxFWF9TSVpFOyBcCisgICAgICAgIH0gXAorICAgICAgICByZXR1cm4gMDsgXAorICAgIH0gXAorCisvLy8gTWFyayBmbGV4aWJsZSBtZW1iZXIgdmFyaWFibGUgYW5kIG1ha2Ugc3RydWN0dXJlIGZsZXhpYmxlLgorI2RlZmluZSBGTEVYKGNscywgbSkgXAorICAgIEMyX0RPX05PVF9DT1BZKGNscykgXAorcHJpdmF0ZTogXAorICAgIEMyUEFSQU1fTUFLRV9GUklFTkRTIFwKKyAgICAvKiogXGlmIDAgKi8gXAorICAgIHRlbXBsYXRlPHR5cGVuYW1lLCB0eXBlbmFtZT4gZnJpZW5kIHN0cnVjdCBfQzJGbGV4SGVscGVyOyBcCitwdWJsaWM6IFwKKyAgICB0eXBlZGVmIGRlY2x0eXBlKG0pIF9GbGV4TWVtYmVyVHlwZTsgXAorICAgIC8qIGRlZmF1bHQgY29uc3RydWN0b3Igd2l0aCBmbGV4Q291bnQgKi8gXAorICAgIGlubGluZSBjbHMoc2l6ZV90KSA6IGNscygpIHt9IFwKKyAgICAvKiBjb25zdGV4cHIgc3RhdGljIF9GbGV4TWVtYmVyVHlwZSBjbHM6OiogZmxleE1lbWJlciA9ICZjbHM6Om07ICovIFwKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9DMkZsZXhIZWxwZXI8X0ZsZXhNZW1iZXJUeXBlPjo6RmxleFR5cGUgRmxleFR5cGU7IFwKKyAgICBzdGF0aWNfYXNzZXJ0KFwKKyAgICAgICAgICAgICFzdGQ6OmlzX3ZvaWQ8RmxleFR5cGU+Ojp2YWx1ZSwgXAorICAgICAgICAgICAgIm1lbWJlciBpcyBub3QgZmxleGlibGUsIG9yIGEgZmxleGlibGUgYXJyYXkgb2YgYSBmbGV4aWJsZSB0eXBlIik7IFwKKyAgICBlbnVtIDogdWludDMyX3QgeyBGTEVYX1NJWkUgPSBfQzJGbGV4SGVscGVyPF9GbGV4TWVtYmVyVHlwZT46OkZMRVhfU0laRSB9OyBcCisgICAgLyoqIFxlbmRpZiAqLyBcCisKKy8vLyBAfQorCisvKioKKyAqIEdsb2JhbC1wYXJhbWV0ZXIgdGVtcGxhdGUuCisgKgorICogQmFzZSB0ZW1wbGF0ZSB0byBkZWZpbmUgYSBnbG9iYWwgc2V0dGluZy90dW5pbmcgb3IgaW5mbyBiYXNlZCBvbiBhIHN0cnVjdHVyZSBhbmQKKyAqIGFuIG9wdGlvbmFsIFBhcmFtSW5kZXguIEdsb2JhbCBwYXJhbWV0ZXJzIGFyZSBub3QgdGllZCB0byBhIHBvcnQgKGlucHV0IG9yIG91dHB1dCkuCisgKgorICogUGFyYW1ldGVycyB3cmFwIHN0cnVjdHVyZXMgYnkgcHJlcGVuZGluZyBhIChwYXJhbWV0ZXIpIGhlYWRlci4gVGhlIGZpZWxkcyBvZiB0aGUgd3JhcHBlZAorICogc3RydWN0dXJlIGNhbiBiZSBhY2Nlc3NlZCBkaXJlY3RseSwgYW5kIGNvbnN0cnVjdG9ycyBhbmQgcG90ZW50aWFsIHB1YmxpYyBtZXRob2RzIGFyZSBhbHNvCisgKiB3cmFwcGVkLgorICoKKyAqIFx0cGFyYW0gVCBwYXJhbSB0eXBlIEMyU2V0dGluZywgQzJUdW5pbmcgb3IgQzJJbmZvCisgKiBcdHBhcmFtIFMgd3JhcHBlZCBzdHJ1Y3R1cmUKKyAqIFx0cGFyYW0gUGFyYW1JbmRleCBvcHRpb25hbCBwYXJhbWV0ZXIgaW5kZXggb3ZlcnJpZGUuIE11c3QgYmUgc3BlY2lmaWVkIGZvciBiYXNlL3JldXNlZAorICogc3RydWN0dXJlcy4KKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgUywgaW50IFBhcmFtSW5kZXg9Uzo6Q09SRV9JTkRFWCwgY2xhc3MgRmxleD12b2lkPgorc3RydWN0IEMyX0hJREUgQzJHbG9iYWxQYXJhbSA6IHB1YmxpYyBULCBwdWJsaWMgUywKKyAgICAgICAgcHVibGljIF9DMlN0cnVjdENoZWNrPFMsIFBhcmFtSW5kZXgsIFQ6OlBBUkFNX0tJTkQgfCBUOjpUeXBlOjpESVJfR0xPQkFMPiB7CisgICAgX0MyX0NPUkVfSU5ERVhfT1ZFUlJJREUoUGFyYW1JbmRleCkKK3ByaXZhdGU6CisgICAgdHlwZWRlZiBDMkdsb2JhbFBhcmFtPFQsIFMsIFBhcmFtSW5kZXg+IF9UeXBlOworCitwdWJsaWM6CisgICAgLy8vIFdyYXBwZXIgYXJvdW5kIGJhc2Ugc3RydWN0dXJlJ3MgY29uc3RydWN0b3IuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgLi4uQXJncz4KKyAgICBpbmxpbmUgQzJHbG9iYWxQYXJhbShjb25zdCBBcmdzKCYuLi4gYXJncykpIDogVChzaXplb2YoX1R5cGUpLCBfVHlwZTo6UEFSQU1fVFlQRSksIFMoYXJncy4uLikgeyB9CisKKyAgICBERUZJTkVfQ0FTVF9PUEVSQVRPUlMoX1R5cGUpCit9OworCisvKioKKyAqIEdsb2JhbC1wYXJhbWV0ZXIgdGVtcGxhdGUgZm9yIGZsZXhpYmxlIHN0cnVjdHVyZXMuCisgKgorICogQmFzZSB0ZW1wbGF0ZSB0byBkZWZpbmUgYSBnbG9iYWwgc2V0dGluZy90dW5pbmcgb3IgaW5mbyBiYXNlZCBvbiBhIGZsZXhpYmxlIHN0cnVjdHVyZSBhbmQKKyAqIGFuIG9wdGlvbmFsIFBhcmFtSW5kZXguIEdsb2JhbCBwYXJhbWV0ZXJzIGFyZSBub3QgdGllZCB0byBhIHBvcnQgKGlucHV0IG9yIG91dHB1dCkuCisgKgorICogXHRwYXJhbSBUIHBhcmFtIHR5cGUgQzJTZXR0aW5nLCBDMlR1bmluZyBvciBDMkluZm8KKyAqIFx0cGFyYW0gUyB3cmFwcGVkIGZsZXhpYmxlIHN0cnVjdHVyZQorICogXHRwYXJhbSBQYXJhbUluZGV4IG9wdGlvbmFsIHBhcmFtZXRlciBpbmRleCBvdmVycmlkZS4gTXVzdCBiZSBzcGVjaWZpZWQgZm9yIGJhc2UvcmV1c2VkCisgKiAgICAgICAgIHN0cnVjdHVyZXMuCisgKgorICogUGFyYW1ldGVycyB3cmFwIHN0cnVjdHVyZXMgYnkgcHJlcGVuZGluZyBhIChwYXJhbWV0ZXIpIGhlYWRlci4gVGhlIGZpZWxkcyBhbmQgbWV0aG9kcyBvZiBmbGV4aWJsZQorICogc3RydWN0dXJlcyBjYW4gYmUgYWNjZXNzZWQgdmlhIHRoZSBtIG1lbWJlciB2YXJpYWJsZTsgaG93ZXZlciwgdGhlIGNvbnN0cnVjdG9ycyBvZiB0aGUgc3RydWN0dXJlCisgKiBhcmUgd3JhcHBlZCBkaXJlY3RseS4gKFRoaXMgaXMgYmVjYXVzZSBmbGV4aWJsZSB0eXBlcyBjYW5ub3QgYmUgc3ViY2xhc3NlZC4pCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFMsIGludCBQYXJhbUluZGV4Pgorc3RydWN0IEMyX0hJREUgQzJHbG9iYWxQYXJhbTxULCBTLCBQYXJhbUluZGV4LCBJRl9GTEVYSUJMRShTKT4KKyAgICA6IHB1YmxpYyBULCBwdWJsaWMgX0MyRmxleFN0cnVjdENoZWNrPFMsIFBhcmFtSW5kZXgsIFQ6OlBBUkFNX0tJTkQgfCBUOjpUeXBlOjpESVJfR0xPQkFMPiB7Citwcml2YXRlOgorICAgIHR5cGVkZWYgQzJHbG9iYWxQYXJhbTxULCBTLCBQYXJhbUluZGV4PiBfVHlwZTsKKworICAgIC8vLyBXcmFwcGVyIGFyb3VuZCBiYXNlIHN0cnVjdHVyZSdzIGNvbnN0cnVjdG9yLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIC4uLkFyZ3M+CisgICAgaW5saW5lIEMyR2xvYmFsUGFyYW0oc2l6ZV90IGZsZXhDb3VudCwgY29uc3QgQXJncygmLi4uIGFyZ3MpKQorICAgICAgICA6IFQoX1R5cGU6OkNhbGNTaXplKGZsZXhDb3VudCksIF9UeXBlOjpQQVJBTV9UWVBFKSwgbShmbGV4Q291bnQsIGFyZ3MuLi4pIHsgfQorCitwdWJsaWM6CisgICAgUyBtOyAvLy88IHdyYXBwZWQgZmxleGlibGUgc3RydWN0dXJlCisKKyAgICBERUZJTkVfRkxFWElCTEVfTUVUSE9EUyhfVHlwZSwgUykKKyAgICBERUZJTkVfQ0FTVF9PUEVSQVRPUlMoX1R5cGUpCit9OworCisvKioKKyAqIFBvcnQtcGFyYW1ldGVyIHRlbXBsYXRlLgorICoKKyAqIEJhc2UgdGVtcGxhdGUgdG8gZGVmaW5lIGEgcG9ydCBzZXR0aW5nL3R1bmluZyBvciBpbmZvIGJhc2VkIG9uIGEgc3RydWN0dXJlIGFuZAorICogYW4gb3B0aW9uYWwgUGFyYW1JbmRleC4gUG9ydCBwYXJhbWV0ZXJzIGFyZSB0aWVkIHRvIGEgcG9ydCAoaW5wdXQgb3Igb3V0cHV0KSwgYnV0IG5vdCB0byBhCisgKiBzcGVjaWZpYyBzdHJlYW0uCisgKgorICogXHRwYXJhbSBUIHBhcmFtIHR5cGUgQzJTZXR0aW5nLCBDMlR1bmluZyBvciBDMkluZm8KKyAqIFx0cGFyYW0gUyB3cmFwcGVkIHN0cnVjdHVyZQorICogXHRwYXJhbSBQYXJhbUluZGV4IG9wdGlvbmFsIHBhcmFtZXRlciBpbmRleCBvdmVycmlkZS4gTXVzdCBiZSBzcGVjaWZpZWQgZm9yIGJhc2UvcmV1c2VkCisgKiAgICAgICAgIHN0cnVjdHVyZXMuCisgKgorICogUGFyYW1ldGVycyB3cmFwIHN0cnVjdHVyZXMgYnkgcHJlcGVuZGluZyBhIChwYXJhbWV0ZXIpIGhlYWRlci4gVGhlIGZpZWxkcyBvZiB0aGUgd3JhcHBlZAorICogc3RydWN0dXJlIGNhbiBiZSBhY2Nlc3NlZCBkaXJlY3RseSwgYW5kIGNvbnN0cnVjdG9ycyBhbmQgcG90ZW50aWFsIHB1YmxpYyBtZXRob2RzIGFyZSBhbHNvCisgKiB3cmFwcGVkLgorICoKKyAqIFRoZXJlIGFyZSAzIGZsYXZvcnMgb2YgcG9ydCBwYXJhbWV0ZXJzOiB1bnNwZWNpZmllZCwgaW5wdXQgYW5kIG91dHB1dC4gUGFyYW1ldGVycyB3aXRoCisgKiB1bnNwZWNpZmllZCBwb3J0IGV4cG9zZSBhIHNldFBvcnQgbWV0aG9kLCBhbmQgYWRkIGFuIGluaXRpYWwgcG9ydCBwYXJhbWV0ZXIgdG8gdGhlIGNvbnN0cnVjdG9yLgorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBTLCBpbnQgUGFyYW1JbmRleD1TOjpDT1JFX0lOREVYLCBjbGFzcyBGbGV4PXZvaWQ+CitzdHJ1Y3QgQzJfSElERSBDMlBvcnRQYXJhbSA6IHB1YmxpYyBULCBwdWJsaWMgUywKKyAgICAgICAgcHJpdmF0ZSBfQzJTdHJ1Y3RDaGVjazxTLCBQYXJhbUluZGV4LCBUOjpQQVJBTV9LSU5EIHwgVDo6SW5kZXg6OkRJUl9VTkRFRklORUQ+IHsKKyAgICBfQzJfQ09SRV9JTkRFWF9PVkVSUklERShQYXJhbUluZGV4KQorcHJpdmF0ZToKKyAgICB0eXBlZGVmIEMyUG9ydFBhcmFtPFQsIFMsIFBhcmFtSW5kZXg+IF9UeXBlOworCitwdWJsaWM6CisgICAgLy8vIERlZmF1bHQgY29uc3RydWN0b3IuCisgICAgaW5saW5lIEMyUG9ydFBhcmFtKCkgOiBUKHNpemVvZihfVHlwZSksIF9UeXBlOjpQQVJBTV9UWVBFKSB7IH0KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSAuLi5BcmdzPgorICAgIC8vLyBXcmFwcGVyIGFyb3VuZCBiYXNlIHN0cnVjdHVyZSdzIGNvbnN0cnVjdG9yIHdoaWxlIHNwZWNpZnlpbmcgcG9ydC9kaXJlY3Rpb24uCisgICAgaW5saW5lIEMyUG9ydFBhcmFtKGJvb2wgX291dHB1dCwgY29uc3QgQXJncygmLi4uIGFyZ3MpKQorICAgICAgICA6IFQoc2l6ZW9mKF9UeXBlKSwgX291dHB1dCA/IG91dHB1dDo6UEFSQU1fVFlQRSA6IGlucHV0OjpQQVJBTV9UWVBFKSwgUyhhcmdzLi4uKSB7IH0KKyAgICAvLy8gU2V0IHBvcnQvZGlyZWN0aW9uLgorICAgIGlubGluZSB2b2lkIHNldFBvcnQoYm9vbCBvdXRwdXQpIHsgQzJQYXJhbTo6c2V0UG9ydChvdXRwdXQpOyB9CisKKyAgICBERUZJTkVfQ0FTVF9PUEVSQVRPUlMoX1R5cGUpCisKKyAgICAvLy8gU3BlY2lhbGl6YXRpb24gZm9yIGFuIGlucHV0IHBvcnQgcGFyYW1ldGVyLgorICAgIHN0cnVjdCBpbnB1dCA6IHB1YmxpYyBULCBwdWJsaWMgUywKKyAgICAgICAgICAgIHB1YmxpYyBfQzJTdHJ1Y3RDaGVjazxTLCBQYXJhbUluZGV4LCBUOjpQQVJBTV9LSU5EIHwgVDo6SW5kZXg6OkRJUl9JTlBVVD4geworICAgICAgICBfQzJfQ09SRV9JTkRFWF9PVkVSUklERShQYXJhbUluZGV4KQorICAgICAgICAvLy8gV3JhcHBlciBhcm91bmQgYmFzZSBzdHJ1Y3R1cmUncyBjb25zdHJ1Y3Rvci4KKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgLi4uQXJncz4KKyAgICAgICAgaW5saW5lIGlucHV0KGNvbnN0IEFyZ3MoJi4uLiBhcmdzKSkgOiBUKHNpemVvZihfVHlwZSksIGlucHV0OjpQQVJBTV9UWVBFKSwgUyhhcmdzLi4uKSB7IH0KKworICAgICAgICBERUZJTkVfQ0FTVF9PUEVSQVRPUlMoaW5wdXQpCisKKyAgICB9OworCisgICAgLy8vIFNwZWNpYWxpemF0aW9uIGZvciBhbiBvdXRwdXQgcG9ydCBwYXJhbWV0ZXIuCisgICAgc3RydWN0IG91dHB1dCA6IHB1YmxpYyBULCBwdWJsaWMgUywKKyAgICAgICAgICAgIHB1YmxpYyBfQzJTdHJ1Y3RDaGVjazxTLCBQYXJhbUluZGV4LCBUOjpQQVJBTV9LSU5EIHwgVDo6SW5kZXg6OkRJUl9PVVRQVVQ+IHsKKyAgICAgICAgX0MyX0NPUkVfSU5ERVhfT1ZFUlJJREUoUGFyYW1JbmRleCkKKyAgICAgICAgLy8vIFdyYXBwZXIgYXJvdW5kIGJhc2Ugc3RydWN0dXJlJ3MgY29uc3RydWN0b3IuCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIC4uLkFyZ3M+CisgICAgICAgIGlubGluZSBvdXRwdXQoY29uc3QgQXJncygmLi4uIGFyZ3MpKSA6IFQoc2l6ZW9mKF9UeXBlKSwgb3V0cHV0OjpQQVJBTV9UWVBFKSwgUyhhcmdzLi4uKSB7IH0KKworICAgICAgICBERUZJTkVfQ0FTVF9PUEVSQVRPUlMob3V0cHV0KQorICAgIH07Cit9OworCisvKioKKyAqIFBvcnQtcGFyYW1ldGVyIHRlbXBsYXRlIGZvciBmbGV4aWJsZSBzdHJ1Y3R1cmVzLgorICoKKyAqIEJhc2UgdGVtcGxhdGUgdG8gZGVmaW5lIGEgcG9ydCBzZXR0aW5nL3R1bmluZyBvciBpbmZvIGJhc2VkIG9uIGEgZmxleGlibGUgc3RydWN0dXJlIGFuZAorICogYW4gb3B0aW9uYWwgUGFyYW1JbmRleC4gUG9ydCBwYXJhbWV0ZXJzIGFyZSB0aWVkIHRvIGEgcG9ydCAoaW5wdXQgb3Igb3V0cHV0KSwgYnV0IG5vdCB0byBhCisgKiBzcGVjaWZpYyBzdHJlYW0uCisgKgorICogXHRwYXJhbSBUIHBhcmFtIHR5cGUgQzJTZXR0aW5nLCBDMlR1bmluZyBvciBDMkluZm8KKyAqIFx0cGFyYW0gUyB3cmFwcGVkIGZsZXhpYmxlIHN0cnVjdHVyZQorICogXHRwYXJhbSBQYXJhbUluZGV4IG9wdGlvbmFsIHBhcmFtZXRlciBpbmRleCBvdmVycmlkZS4gTXVzdCBiZSBzcGVjaWZpZWQgZm9yIGJhc2UvcmV1c2VkCisgKiAgICAgICAgIHN0cnVjdHVyZXMuCisgKgorICogUGFyYW1ldGVycyB3cmFwIHN0cnVjdHVyZXMgYnkgcHJlcGVuZGluZyBhIChwYXJhbWV0ZXIpIGhlYWRlci4gVGhlIGZpZWxkcyBhbmQgbWV0aG9kcyBvZiBmbGV4aWJsZQorICogc3RydWN0dXJlcyBjYW4gYmUgYWNjZXNzZWQgdmlhIHRoZSBtIG1lbWJlciB2YXJpYWJsZTsgaG93ZXZlciwgdGhlIGNvbnN0cnVjdG9ycyBvZiB0aGUgc3RydWN0dXJlCisgKiBhcmUgd3JhcHBlZCBkaXJlY3RseS4gKFRoaXMgaXMgYmVjYXVzZSBmbGV4aWJsZSB0eXBlcyBjYW5ub3QgYmUgc3ViY2xhc3NlZC4pCisgKgorICogVGhlcmUgYXJlIDMgZmxhdm9ycyBvZiBwb3J0IHBhcmFtZXRlcnM6IHVuc3BlY2lmaWVkLCBpbnB1dCBhbmQgb3V0cHV0LiBQYXJhbWV0ZXJzIHdpdGgKKyAqIHVuc3BlY2lmaWVkIHBvcnQgZXhwb3NlIGEgc2V0UG9ydCBtZXRob2QsIGFuZCBhZGQgYW4gaW5pdGlhbCBwb3J0IHBhcmFtZXRlciB0byB0aGUgY29uc3RydWN0b3IuCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFMsIGludCBQYXJhbUluZGV4Pgorc3RydWN0IEMyX0hJREUgQzJQb3J0UGFyYW08VCwgUywgUGFyYW1JbmRleCwgSUZfRkxFWElCTEUoUyk+CisgICAgOiBwdWJsaWMgVCwgcHVibGljIF9DMkZsZXhTdHJ1Y3RDaGVjazxTLCBQYXJhbUluZGV4LCBUOjpQQVJBTV9LSU5EIHwgVDo6VHlwZTo6RElSX1VOREVGSU5FRD4geworcHJpdmF0ZToKKyAgICB0eXBlZGVmIEMyUG9ydFBhcmFtPFQsIFMsIFBhcmFtSW5kZXg+IF9UeXBlOworCisgICAgLy8vIERlZmF1bHQgY29uc3RydWN0b3IgZm9yIGJhc2ljIGFsbG9jYXRpb246IG5ldyhmbGV4Q291bnQpIFAuCisgICAgaW5saW5lIEMyUG9ydFBhcmFtKHNpemVfdCBmbGV4Q291bnQpIDogVChfVHlwZTo6Q2FsY1NpemUoZmxleENvdW50KSwgX1R5cGU6OlBBUkFNX1RZUEUpIHsgfQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIC4uLkFyZ3M+CisgICAgLy8vIFdyYXBwZXIgYXJvdW5kIGJhc2Ugc3RydWN0dXJlJ3MgY29uc3RydWN0b3Igd2hpbGUgYWxzbyBzcGVjaWZ5aW5nIHBvcnQvZGlyZWN0aW9uLgorICAgIGlubGluZSBDMlBvcnRQYXJhbShzaXplX3QgZmxleENvdW50LCBib29sIF9vdXRwdXQsIGNvbnN0IEFyZ3MoJi4uLiBhcmdzKSkKKyAgICAgICAgOiBUKF9UeXBlOjpDYWxjU2l6ZShmbGV4Q291bnQpLCBfb3V0cHV0ID8gb3V0cHV0OjpQQVJBTV9UWVBFIDogaW5wdXQ6OlBBUkFNX1RZUEUpLAorICAgICAgICAgIG0oZmxleENvdW50LCBhcmdzLi4uKSB7IH0KKworcHVibGljOgorICAgIC8vLyBTZXQgcG9ydC9kaXJlY3Rpb24uCisgICAgaW5saW5lIHZvaWQgc2V0UG9ydChib29sIG91dHB1dCkgeyBDMlBhcmFtOjpzZXRQb3J0KG91dHB1dCk7IH0KKworICAgIFMgbTsgLy8vPCB3cmFwcGVkIGZsZXhpYmxlIHN0cnVjdHVyZQorCisgICAgREVGSU5FX0ZMRVhJQkxFX01FVEhPRFMoX1R5cGUsIFMpCisgICAgREVGSU5FX0NBU1RfT1BFUkFUT1JTKF9UeXBlKQorCisgICAgLy8vIFNwZWNpYWxpemF0aW9uIGZvciBhbiBpbnB1dCBwb3J0IHBhcmFtZXRlci4KKyAgICBzdHJ1Y3QgaW5wdXQgOiBwdWJsaWMgVCwKKyAgICAgICAgICAgIHB1YmxpYyBfQzJGbGV4U3RydWN0Q2hlY2s8UywgUGFyYW1JbmRleCwgVDo6UEFSQU1fS0lORCB8IFQ6OkluZGV4OjpESVJfSU5QVVQ+IHsKKyAgICBwcml2YXRlOgorICAgICAgICAvLy8gV3JhcHBlciBhcm91bmQgYmFzZSBzdHJ1Y3R1cmUncyBjb25zdHJ1Y3RvciB3aGlsZSBhbHNvIHNwZWNpZnlpbmcgcG9ydC9kaXJlY3Rpb24uCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIC4uLkFyZ3M+CisgICAgICAgIGlubGluZSBpbnB1dChzaXplX3QgZmxleENvdW50LCBjb25zdCBBcmdzKCYuLi4gYXJncykpCisgICAgICAgICAgICA6IFQoX1R5cGU6OkNhbGNTaXplKGZsZXhDb3VudCksIGlucHV0OjpQQVJBTV9UWVBFKSwgbShmbGV4Q291bnQsIGFyZ3MuLi4pIHsgfQorCisgICAgcHVibGljOgorICAgICAgICBTIG07IC8vLzwgd3JhcHBlZCBmbGV4aWJsZSBzdHJ1Y3R1cmUKKworICAgICAgICBERUZJTkVfRkxFWElCTEVfTUVUSE9EUyhpbnB1dCwgUykKKyAgICAgICAgREVGSU5FX0NBU1RfT1BFUkFUT1JTKGlucHV0KQorICAgIH07CisKKyAgICAvLy8gU3BlY2lhbGl6YXRpb24gZm9yIGFuIG91dHB1dCBwb3J0IHBhcmFtZXRlci4KKyAgICBzdHJ1Y3Qgb3V0cHV0IDogcHVibGljIFQsCisgICAgICAgICAgICBwdWJsaWMgX0MyRmxleFN0cnVjdENoZWNrPFMsIFBhcmFtSW5kZXgsIFQ6OlBBUkFNX0tJTkQgfCBUOjpJbmRleDo6RElSX09VVFBVVD4geworICAgIHByaXZhdGU6CisgICAgICAgIC8vLyBXcmFwcGVyIGFyb3VuZCBiYXNlIHN0cnVjdHVyZSdzIGNvbnN0cnVjdG9yIHdoaWxlIGFsc28gc3BlY2lmeWluZyBwb3J0L2RpcmVjdGlvbi4KKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgLi4uQXJncz4KKyAgICAgICAgaW5saW5lIG91dHB1dChzaXplX3QgZmxleENvdW50LCBjb25zdCBBcmdzKCYuLi4gYXJncykpCisgICAgICAgICAgICA6IFQoX1R5cGU6OkNhbGNTaXplKGZsZXhDb3VudCksIG91dHB1dDo6UEFSQU1fVFlQRSksIG0oZmxleENvdW50LCBhcmdzLi4uKSB7IH0KKworICAgIHB1YmxpYzoKKyAgICAgICAgUyBtOyAvLy88IHdyYXBwZWQgZmxleGlibGUgc3RydWN0dXJlCisKKyAgICAgICAgREVGSU5FX0ZMRVhJQkxFX01FVEhPRFMob3V0cHV0LCBTKQorICAgICAgICBERUZJTkVfQ0FTVF9PUEVSQVRPUlMob3V0cHV0KQorICAgIH07Cit9OworCisvKioKKyAqIFN0cmVhbS1wYXJhbWV0ZXIgdGVtcGxhdGUuCisgKgorICogQmFzZSB0ZW1wbGF0ZSB0byBkZWZpbmUgYSBzdHJlYW0gc2V0dGluZy90dW5pbmcgb3IgaW5mbyBiYXNlZCBvbiBhIHN0cnVjdHVyZSBhbmQKKyAqIGFuIG9wdGlvbmFsIFBhcmFtSW5kZXguIFN0cmVhbSBwYXJhbWV0ZXJzIGFyZSB0aWVkIHRvIGEgc3BlY2lmaWMgc3RyZWFtIG9uIGEgcG9ydCAoaW5wdXQgb3IKKyAqIG91dHB1dCkuCisgKgorICogXHRwYXJhbSBUIHBhcmFtIHR5cGUgQzJTZXR0aW5nLCBDMlR1bmluZyBvciBDMkluZm8KKyAqIFx0cGFyYW0gUyB3cmFwcGVkIHN0cnVjdHVyZQorICogXHRwYXJhbSBQYXJhbUluZGV4IG9wdGlvbmFsIHBhcmFtdGVyIGluZGV4IG92ZXJyaWRlLiBNdXN0IGJlIHNwZWNpZmllZCBmb3IgYmFzZS9yZXVzZWQKKyAqICAgICAgICAgc3RydWN0dXJlcy4KKyAqCisgKiBQYXJhbWV0ZXJzIHdyYXAgc3RydWN0dXJlcyBieSBwcmVwZW5kaW5nIGEgKHBhcmFtZXRlcikgaGVhZGVyLiBUaGUgZmllbGRzIG9mIHRoZSB3cmFwcGVkCisgKiBzdHJ1Y3R1cmUgY2FuIGJlIGFjY2Vzc2VkIGRpcmVjdGx5LCBhbmQgY29uc3RydWN0b3JzIGFuZCBwb3RlbnRpYWwgcHVibGljIG1ldGhvZHMgYXJlIGFsc28KKyAqIHdyYXBwZWQuCisgKgorICogVGhlcmUgYXJlIDMgZmxhdm9ycyBvZiBzdHJlYW0gcGFyYW1ldGVyczogdW5zcGVjaWZpZWQgcG9ydCwgaW5wdXQgYW5kIG91dHB1dC4gQWxsIG9mIHRoZXNlIGV4cG9zZQorICogYSBzZXRTdHJlYW0gbWV0aG9kIGFuZCBhbiBleHRyYSBpbml0aWFsIHN0cmVhbUlEIHBhcmFtZXRlciBmb3IgdGhlIGNvbnN0cnVjdG9yLiBNb3Jlb3ZlciwKKyAqIHBhcmFtZXRlcnMgd2l0aCB1bnNwZWNpZmllZCBwb3J0IGV4cG9zZSBhIHNldFBvcnQgbWV0aG9kLCBhbmQgYWRkIGFuIGFkZGl0aW9uYWwgaW5pdGlhbCBwb3J0CisgKiBwYXJhbWV0ZXIgdG8gdGhlIGNvbnN0cnVjdG9yLgorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBTLCBpbnQgUGFyYW1JbmRleD1TOjpDT1JFX0lOREVYLCBjbGFzcyBGbGV4PXZvaWQ+CitzdHJ1Y3QgQzJfSElERSBDMlN0cmVhbVBhcmFtIDogcHVibGljIFQsIHB1YmxpYyBTLAorICAgICAgICBwcml2YXRlIF9DMlN0cnVjdENoZWNrPFMsIFBhcmFtSW5kZXgsCisgICAgICAgICAgICAgICAgVDo6UEFSQU1fS0lORCB8IFQ6OkluZGV4OjpJU19TVFJFQU1fRkxBRyB8IFQ6OkluZGV4OjpESVJfVU5ERUZJTkVEPiB7CisgICAgX0MyX0NPUkVfSU5ERVhfT1ZFUlJJREUoUGFyYW1JbmRleCkKK3ByaXZhdGU6CisgICAgdHlwZWRlZiBDMlN0cmVhbVBhcmFtPFQsIFMsIFBhcmFtSW5kZXg+IF9UeXBlOworCitwdWJsaWM6CisgICAgLy8vIERlZmF1bHQgY29uc3RydWN0b3IuIFBvcnQvZGlyZWN0aW9uIGFuZCBzdHJlYW0tSUQgaXMgdW5kZWZpbmVkLgorICAgIGlubGluZSBDMlN0cmVhbVBhcmFtKCkgOiBUKHNpemVvZihfVHlwZSksIF9UeXBlOjpQQVJBTV9UWVBFKSB7IH0KKyAgICAvLy8gV3JhcHBlciBhcm91bmQgYmFzZSBzdHJ1Y3R1cmUncyBjb25zdHJ1Y3RvciB3aGlsZSBhbHNvIHNwZWNpZnlpbmcgcG9ydC9kaXJlY3Rpb24gYW5kCisgICAgLy8vIHN0cmVhbS1JRC4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSAuLi5BcmdzPgorICAgIGlubGluZSBDMlN0cmVhbVBhcmFtKGJvb2wgX291dHB1dCwgdW5zaWduZWQgc3RyZWFtLCBjb25zdCBBcmdzKCYuLi4gYXJncykpCisgICAgICAgIDogVChzaXplb2YoX1R5cGUpLCBfb3V0cHV0ID8gb3V0cHV0OjpQQVJBTV9UWVBFIDogaW5wdXQ6OlBBUkFNX1RZUEUsIHN0cmVhbSksCisgICAgICAgICAgUyhhcmdzLi4uKSB7IH0KKyAgICAvLy8gU2V0IHBvcnQvZGlyZWN0aW9uLgorICAgIGlubGluZSB2b2lkIHNldFBvcnQoYm9vbCBvdXRwdXQpIHsgQzJQYXJhbTo6c2V0UG9ydChvdXRwdXQpOyB9CisgICAgLy8vIFNldCBzdHJlYW0taWQuIFxyZXR2YWwgdHJ1ZSBpZiB0aGUgc3RyZWFtLWlkIHdhcyBzdWNjZXNzZnVsbHkgc2V0LgorICAgIGlubGluZSBib29sIHNldFN0cmVhbSh1bnNpZ25lZCBzdHJlYW0pIHsgcmV0dXJuIEMyUGFyYW06OnNldFN0cmVhbShzdHJlYW0pOyB9CisKKyAgICBERUZJTkVfQ0FTVF9PUEVSQVRPUlMoX1R5cGUpCisKKyAgICAvLy8gU3BlY2lhbGl6YXRpb24gZm9yIGFuIGlucHV0IHN0cmVhbSBwYXJhbWV0ZXIuCisgICAgc3RydWN0IGlucHV0IDogcHVibGljIFQsIHB1YmxpYyBTLAorICAgICAgICAgICAgcHVibGljIF9DMlN0cnVjdENoZWNrPFMsIFBhcmFtSW5kZXgsCisgICAgICAgICAgICAgICAgICAgIFQ6OlBBUkFNX0tJTkQgfCBUOjpJbmRleDo6SVNfU1RSRUFNX0ZMQUcgfCBUOjpUeXBlOjpESVJfSU5QVVQ+IHsKKyAgICAgICAgX0MyX0NPUkVfSU5ERVhfT1ZFUlJJREUoUGFyYW1JbmRleCkKKworICAgICAgICAvLy8gRGVmYXVsdCBjb25zdHJ1Y3Rvci4gU3RyZWFtLUlEIGlzIHVuZGVmaW5lZC4KKyAgICAgICAgaW5saW5lIGlucHV0KCkgOiBUKHNpemVvZihfVHlwZSksIGlucHV0OjpQQVJBTV9UWVBFKSB7IH0KKyAgICAgICAgLy8vIFdyYXBwZXIgYXJvdW5kIGJhc2Ugc3RydWN0dXJlJ3MgY29uc3RydWN0b3Igd2hpbGUgYWxzbyBzcGVjaWZ5aW5nIHN0cmVhbS1JRC4KKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgLi4uQXJncz4KKyAgICAgICAgaW5saW5lIGlucHV0KHVuc2lnbmVkIHN0cmVhbSwgY29uc3QgQXJncygmLi4uIGFyZ3MpKQorICAgICAgICAgICAgOiBUKHNpemVvZihfVHlwZSksIGlucHV0OjpQQVJBTV9UWVBFLCBzdHJlYW0pLCBTKGFyZ3MuLi4pIHsgfQorICAgICAgICAvLy8gU2V0IHN0cmVhbS1pZC4gXHJldHZhbCB0cnVlIGlmIHRoZSBzdHJlYW0taWQgd2FzIHN1Y2Nlc3NmdWxseSBzZXQuCisgICAgICAgIGlubGluZSBib29sIHNldFN0cmVhbSh1bnNpZ25lZCBzdHJlYW0pIHsgcmV0dXJuIEMyUGFyYW06OnNldFN0cmVhbShzdHJlYW0pOyB9CisKKyAgICAgICAgREVGSU5FX0NBU1RfT1BFUkFUT1JTKGlucHV0KQorICAgIH07CisKKyAgICAvLy8gU3BlY2lhbGl6YXRpb24gZm9yIGFuIG91dHB1dCBzdHJlYW0gcGFyYW1ldGVyLgorICAgIHN0cnVjdCBvdXRwdXQgOiBwdWJsaWMgVCwgcHVibGljIFMsCisgICAgICAgICAgICBwdWJsaWMgX0MyU3RydWN0Q2hlY2s8UywgUGFyYW1JbmRleCwKKyAgICAgICAgICAgICAgICAgICAgVDo6UEFSQU1fS0lORCB8IFQ6OkluZGV4OjpJU19TVFJFQU1fRkxBRyB8IFQ6OlR5cGU6OkRJUl9PVVRQVVQ+IHsKKyAgICAgICAgX0MyX0NPUkVfSU5ERVhfT1ZFUlJJREUoUGFyYW1JbmRleCkKKworICAgICAgICAvLy8gRGVmYXVsdCBjb25zdHJ1Y3Rvci4gU3RyZWFtLUlEIGlzIHVuZGVmaW5lZC4KKyAgICAgICAgaW5saW5lIG91dHB1dCgpIDogVChzaXplb2YoX1R5cGUpLCBvdXRwdXQ6OlBBUkFNX1RZUEUpIHsgfQorICAgICAgICAvLy8gV3JhcHBlciBhcm91bmQgYmFzZSBzdHJ1Y3R1cmUncyBjb25zdHJ1Y3RvciB3aGlsZSBhbHNvIHNwZWNpZnlpbmcgc3RyZWFtLUlELgorICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSAuLi5BcmdzPgorICAgICAgICBpbmxpbmUgb3V0cHV0KHVuc2lnbmVkIHN0cmVhbSwgY29uc3QgQXJncygmLi4uIGFyZ3MpKQorICAgICAgICAgICAgOiBUKHNpemVvZihfVHlwZSksIG91dHB1dDo6UEFSQU1fVFlQRSwgc3RyZWFtKSwgUyhhcmdzLi4uKSB7IH0KKyAgICAgICAgLy8vIFNldCBzdHJlYW0taWQuIFxyZXR2YWwgdHJ1ZSBpZiB0aGUgc3RyZWFtLWlkIHdhcyBzdWNjZXNzZnVsbHkgc2V0LgorICAgICAgICBpbmxpbmUgYm9vbCBzZXRTdHJlYW0odW5zaWduZWQgc3RyZWFtKSB7IHJldHVybiBDMlBhcmFtOjpzZXRTdHJlYW0oc3RyZWFtKTsgfQorCisgICAgICAgIERFRklORV9DQVNUX09QRVJBVE9SUyhvdXRwdXQpCisgICAgfTsKK307CisKKy8qKgorICogU3RyZWFtLXBhcmFtZXRlciB0ZW1wbGF0ZSBmb3IgZmxleGlibGUgc3RydWN0dXJlcy4KKyAqCisgKiBCYXNlIHRlbXBsYXRlIHRvIGRlZmluZSBhIHN0cmVhbSBzZXR0aW5nL3R1bmluZyBvciBpbmZvIGJhc2VkIG9uIGEgZmxleGlibGUgc3RydWN0dXJlIGFuZAorICogYW4gb3B0aW9uYWwgUGFyYW1JbmRleC4gU3RyZWFtIHBhcmFtZXRlcnMgYXJlIHRpZWQgdG8gYSBzcGVjaWZpYyBzdHJlYW0gb24gYSBwb3J0IChpbnB1dCBvcgorICogb3V0cHV0KS4KKyAqCisgKiBcdHBhcmFtIFQgcGFyYW0gdHlwZSBDMlNldHRpbmcsIEMyVHVuaW5nIG9yIEMySW5mbworICogXHRwYXJhbSBTIHdyYXBwZWQgZmxleGlibGUgc3RydWN0dXJlCisgKiBcdHBhcmFtIFBhcmFtSW5kZXggb3B0aW9uYWwgcGFyYW1ldGVyIGluZGV4IG92ZXJyaWRlLiBNdXN0IGJlIHNwZWNpZmllZCBmb3IgYmFzZS9yZXVzZWQKKyAqICAgICAgICAgc3RydWN0dXJlcy4KKyAqCisgKiBQYXJhbWV0ZXJzIHdyYXAgc3RydWN0dXJlcyBieSBwcmVwZW5kaW5nIGEgKHBhcmFtZXRlcikgaGVhZGVyLiBUaGUgZmllbGRzIGFuZCBtZXRob2RzIG9mIGZsZXhpYmxlCisgKiBzdHJ1Y3R1cmVzIGNhbiBiZSBhY2Nlc3NlZCB2aWEgdGhlIG0gbWVtYmVyIHZhcmlhYmxlOyBob3dldmVyLCB0aGUgY29uc3RydWN0b3JzIG9mIHRoZSBzdHJ1Y3R1cmUKKyAqIGFyZSB3cmFwcGVkIGRpcmVjdGx5LiAoVGhpcyBpcyBiZWNhdXNlIGZsZXhpYmxlIHR5cGVzIGNhbm5vdCBiZSBzdWJjbGFzc2VkLikKKyAqCisgKiBUaGVyZSBhcmUgMyBmbGF2b3JzIG9mIHN0cmVhbSBwYXJhbWV0ZXJzOiB1bnNwZWNpZmllZCBwb3J0LCBpbnB1dCBhbmQgb3V0cHV0LiBBbGwgb2YgdGhlc2UgZXhwb3NlCisgKiBhIHNldFN0cmVhbSBtZXRob2QgYW5kIGFuIGV4dHJhIGluaXRpYWwgc3RyZWFtSUQgcGFyYW1ldGVyIGZvciB0aGUgY29uc3RydWN0b3IuIE1vcmVvdmVyLAorICogcGFyYW1ldGVycyB3aXRoIHVuc3BlY2lmaWVkIHBvcnQgZXhwb3NlIGEgc2V0UG9ydCBtZXRob2QsIGFuZCBhZGQgYW4gYWRkaXRpb25hbCBpbml0aWFsIHBvcnQKKyAqIHBhcmFtZXRlciB0byB0aGUgY29uc3RydWN0b3IuCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFMsIGludCBQYXJhbUluZGV4Pgorc3RydWN0IEMyX0hJREUgQzJTdHJlYW1QYXJhbTxULCBTLCBQYXJhbUluZGV4LCBJRl9GTEVYSUJMRShTKT4KKyAgICA6IHB1YmxpYyBULAorICAgICAgcHVibGljIF9DMkZsZXhTdHJ1Y3RDaGVjazxTLCBQYXJhbUluZGV4LAorICAgICAgICAgICAgICBUOjpQQVJBTV9LSU5EIHwgVDo6SW5kZXg6OklTX1NUUkVBTV9GTEFHIHwgVDo6SW5kZXg6OkRJUl9VTkRFRklORUQ+IHsKK3ByaXZhdGU6CisgICAgdHlwZWRlZiBDMlN0cmVhbVBhcmFtPFQsIFMsIFBhcmFtSW5kZXg+IF9UeXBlOworICAgIC8vLyBEZWZhdWx0IGNvbnN0cnVjdG9yLiBQb3J0L2RpcmVjdGlvbiBhbmQgc3RyZWFtLUlEIGlzIHVuZGVmaW5lZC4KKyAgICBpbmxpbmUgQzJTdHJlYW1QYXJhbShzaXplX3QgZmxleENvdW50KSA6IFQoX1R5cGU6OkNhbGNTaXplKGZsZXhDb3VudCksIF9UeXBlOjpQQVJBTV9UWVBFLCAwdSkgeyB9CisgICAgLy8vIFdyYXBwZXIgYXJvdW5kIGJhc2Ugc3RydWN0dXJlJ3MgY29uc3RydWN0b3Igd2hpbGUgYWxzbyBzcGVjaWZ5aW5nIHBvcnQvZGlyZWN0aW9uIGFuZAorICAgIC8vLyBzdHJlYW0tSUQuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgLi4uQXJncz4KKyAgICBpbmxpbmUgQzJTdHJlYW1QYXJhbShzaXplX3QgZmxleENvdW50LCBib29sIF9vdXRwdXQsIHVuc2lnbmVkIHN0cmVhbSwgY29uc3QgQXJncygmLi4uIGFyZ3MpKQorICAgICAgICA6IFQoX1R5cGU6OkNhbGNTaXplKGZsZXhDb3VudCksIF9vdXRwdXQgPyBvdXRwdXQ6OlBBUkFNX1RZUEUgOiBpbnB1dDo6UEFSQU1fVFlQRSwgc3RyZWFtKSwKKyAgICAgICAgICBtKGZsZXhDb3VudCwgYXJncy4uLikgeyB9CisKK3B1YmxpYzoKKyAgICBTIG07IC8vLzwgd3JhcHBlZCBmbGV4aWJsZSBzdHJ1Y3R1cmUKKworICAgIC8vLyBTZXQgcG9ydC9kaXJlY3Rpb24uCisgICAgaW5saW5lIHZvaWQgc2V0UG9ydChib29sIG91dHB1dCkgeyBDMlBhcmFtOjpzZXRQb3J0KG91dHB1dCk7IH0KKyAgICAvLy8gU2V0IHN0cmVhbS1pZC4gXHJldHZhbCB0cnVlIGlmIHRoZSBzdHJlYW0taWQgd2FzIHN1Y2Nlc3NmdWxseSBzZXQuCisgICAgaW5saW5lIGJvb2wgc2V0U3RyZWFtKHVuc2lnbmVkIHN0cmVhbSkgeyByZXR1cm4gQzJQYXJhbTo6c2V0U3RyZWFtKHN0cmVhbSk7IH0KKworICAgIERFRklORV9GTEVYSUJMRV9NRVRIT0RTKF9UeXBlLCBTKQorICAgIERFRklORV9DQVNUX09QRVJBVE9SUyhfVHlwZSkKKworICAgIC8vLyBTcGVjaWFsaXphdGlvbiBmb3IgYW4gaW5wdXQgc3RyZWFtIHBhcmFtZXRlci4KKyAgICBzdHJ1Y3QgaW5wdXQgOiBwdWJsaWMgVCwKKyAgICAgICAgICAgIHB1YmxpYyBfQzJGbGV4U3RydWN0Q2hlY2s8UywgUGFyYW1JbmRleCwKKyAgICAgICAgICAgICAgICAgICAgVDo6UEFSQU1fS0lORCB8IFQ6OkluZGV4OjpJU19TVFJFQU1fRkxBRyB8IFQ6OlR5cGU6OkRJUl9JTlBVVD4geworICAgIHByaXZhdGU6CisgICAgICAgIC8vLyBEZWZhdWx0IGNvbnN0cnVjdG9yLiBTdHJlYW0tSUQgaXMgdW5kZWZpbmVkLgorICAgICAgICBpbmxpbmUgaW5wdXQoc2l6ZV90IGZsZXhDb3VudCkgOiBUKF9UeXBlOjpDYWxjU2l6ZShmbGV4Q291bnQpLCBpbnB1dDo6UEFSQU1fVFlQRSkgeyB9CisgICAgICAgIC8vLyBXcmFwcGVyIGFyb3VuZCBiYXNlIHN0cnVjdHVyZSdzIGNvbnN0cnVjdG9yIHdoaWxlIGFsc28gc3BlY2lmeWluZyBzdHJlYW0tSUQuCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIC4uLkFyZ3M+CisgICAgICAgIGlubGluZSBpbnB1dChzaXplX3QgZmxleENvdW50LCB1bnNpZ25lZCBzdHJlYW0sIGNvbnN0IEFyZ3MoJi4uLiBhcmdzKSkKKyAgICAgICAgICAgIDogVChfVHlwZTo6Q2FsY1NpemUoZmxleENvdW50KSwgaW5wdXQ6OlBBUkFNX1RZUEUsIHN0cmVhbSksIG0oZmxleENvdW50LCBhcmdzLi4uKSB7IH0KKworICAgIHB1YmxpYzoKKyAgICAgICAgUyBtOyAvLy88IHdyYXBwZWQgZmxleGlibGUgc3RydWN0dXJlCisKKyAgICAgICAgLy8vIFNldCBzdHJlYW0taWQuIFxyZXR2YWwgdHJ1ZSBpZiB0aGUgc3RyZWFtLWlkIHdhcyBzdWNjZXNzZnVsbHkgc2V0LgorICAgICAgICBpbmxpbmUgYm9vbCBzZXRTdHJlYW0odW5zaWduZWQgc3RyZWFtKSB7IHJldHVybiBDMlBhcmFtOjpzZXRTdHJlYW0oc3RyZWFtKTsgfQorCisgICAgICAgIERFRklORV9GTEVYSUJMRV9NRVRIT0RTKGlucHV0LCBTKQorICAgICAgICBERUZJTkVfQ0FTVF9PUEVSQVRPUlMoaW5wdXQpCisgICAgfTsKKworICAgIC8vLyBTcGVjaWFsaXphdGlvbiBmb3IgYW4gb3V0cHV0IHN0cmVhbSBwYXJhbWV0ZXIuCisgICAgc3RydWN0IG91dHB1dCA6IHB1YmxpYyBULAorICAgICAgICAgICAgcHVibGljIF9DMkZsZXhTdHJ1Y3RDaGVjazxTLCBQYXJhbUluZGV4LAorICAgICAgICAgICAgICAgICAgICBUOjpQQVJBTV9LSU5EIHwgVDo6SW5kZXg6OklTX1NUUkVBTV9GTEFHIHwgVDo6VHlwZTo6RElSX09VVFBVVD4geworICAgIHByaXZhdGU6CisgICAgICAgIC8vLyBEZWZhdWx0IGNvbnN0cnVjdG9yLiBTdHJlYW0tSUQgaXMgdW5kZWZpbmVkLgorICAgICAgICBpbmxpbmUgb3V0cHV0KHNpemVfdCBmbGV4Q291bnQpIDogVChfVHlwZTo6Q2FsY1NpemUoZmxleENvdW50KSwgb3V0cHV0OjpQQVJBTV9UWVBFKSB7IH0KKyAgICAgICAgLy8vIFdyYXBwZXIgYXJvdW5kIGJhc2Ugc3RydWN0dXJlJ3MgY29uc3RydWN0b3Igd2hpbGUgYWxzbyBzcGVjaWZ5aW5nIHN0cmVhbS1JRC4KKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgLi4uQXJncz4KKyAgICAgICAgaW5saW5lIG91dHB1dChzaXplX3QgZmxleENvdW50LCB1bnNpZ25lZCBzdHJlYW0sIGNvbnN0IEFyZ3MoJi4uLiBhcmdzKSkKKyAgICAgICAgICAgIDogVChfVHlwZTo6Q2FsY1NpemUoZmxleENvdW50KSwgb3V0cHV0OjpQQVJBTV9UWVBFLCBzdHJlYW0pLCBtKGZsZXhDb3VudCwgYXJncy4uLikgeyB9CisKKyAgICBwdWJsaWM6CisgICAgICAgIFMgbTsgLy8vPCB3cmFwcGVkIGZsZXhpYmxlIHN0cnVjdHVyZQorCisgICAgICAgIC8vLyBTZXQgc3RyZWFtLWlkLiBccmV0dmFsIHRydWUgaWYgdGhlIHN0cmVhbS1pZCB3YXMgc3VjY2Vzc2Z1bGx5IHNldC4KKyAgICAgICAgaW5saW5lIGJvb2wgc2V0U3RyZWFtKHVuc2lnbmVkIHN0cmVhbSkgeyByZXR1cm4gQzJQYXJhbTo6c2V0U3RyZWFtKHN0cmVhbSk7IH0KKworICAgICAgICBERUZJTkVfRkxFWElCTEVfTUVUSE9EUyhvdXRwdXQsIFMpCisgICAgICAgIERFRklORV9DQVNUX09QRVJBVE9SUyhvdXRwdXQpCisgICAgfTsKK307CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PSBTSU1QTEUgVkFMVUUgUEFSQU1FVEVSUyA9PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworLyoqCisgKiBcaW5ncm91cCBpbnRlcm5hbAorICogQSBzdHJ1Y3R1cmUgdGVtcGxhdGUgZW5jYXBzdWxhdGluZyBhIHNpbmdsZSBlbGVtZW50IHdpdGggZGVmYXVsdCBjb25zdHJ1Y3RvcnMgYW5kIG5vIGNvcmUtaW5kZXguCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgQzJTaW1wbGVWYWx1ZVN0cnVjdCB7CisgICAgVCB2YWx1ZTsgLy8vPCBzaW1wbGUgdmFsdWUgb2YgdGhlIHN0cnVjdHVyZQorICAgIC8vIERlZmF1bHQgY29uc3RydWN0b3IuCisgICAgaW5saW5lIEMyU2ltcGxlVmFsdWVTdHJ1Y3QoKSA9IGRlZmF1bHQ7CisgICAgLy8gQ29uc3RydWN0b3Igd2l0aCBhbiBpbml0aWFsIHZhbHVlLgorICAgIGlubGluZSBDMlNpbXBsZVZhbHVlU3RydWN0KFQgdmFsdWUpIDogdmFsdWUodmFsdWUpIHt9CisgICAgREVGSU5FX0JBU0VfQzJTVFJVQ1QoU2ltcGxlVmFsdWUpCit9OworCisvLyBUT0RPOiBtb3ZlIHRoaXMgYW5kIG5leHQgdG8gc29tZSBnZW5lcmljIHBsYWNlCisvKioKKyAqIEludGVyZmFjZSB0byBhIGJsb2NrIG9mIChtYXBwZWQpIG1lbW9yeSBjb250YWluaW5nIGFuIGFycmF5IG9mIHNvbWUgdHlwZSAoVCkuCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgQzJNZW1vcnlCbG9jayB7CisgICAgLy8vIFxyZXR1cm5zIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhpcyBibG9jay4KKyAgICB2aXJ0dWFsIHNpemVfdCBzaXplKCkgY29uc3QgPSAwOworICAgIC8vLyBccmV0dXJucyBhIGNvbnN0IHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoaXMgYmxvY2suIENhcmUgbXVzdCBiZSB0YWtlbiB0byBub3QgcmVhZCBvdXRzaWRlCisgICAgLy8vIHRoZSBibG9jay4KKyAgICB2aXJ0dWFsIGNvbnN0IFQgKmRhdGEoKSBjb25zdCA9IDA7IC8vIFRPRE86IHNob3VsZCB0aGlzIGJlIGZyaWVuZCBhY2Nlc3Mgb25seSBpbiBzb21lIEMyTWVtb3J5IG1vZHVsZT8KKyAgICAvLy8gXHJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiB0aGlzIGJsb2NrLiBDYXJlIG11c3QgYmUgdGFrZW4gdG8gbm90IHJlYWQgb3Igd3JpdGUKKyAgICAvLy8gb3V0c2lkZSB0aGUgYmxvY2suCisgICAgaW5saW5lIFQgKmRhdGEoKSB7IHJldHVybiBjb25zdF9jYXN0PFQqPihjb25zdF9jYXN0PGNvbnN0IEMyTWVtb3J5QmxvY2sqPih0aGlzKS0+ZGF0YSgpKTsgfQorCitwcm90ZWN0ZWQ6CisgICAgLy8gVE9ETzogZm9yIG5vdyBpdCBzaG91bGQgbmV2ZXIgYmUgZGVsZXRlZCBhcyBDMk1lbW9yeUJsb2NrCisgICAgdmlydHVhbCB+QzJNZW1vcnlCbG9jaygpID0gZGVmYXVsdDsKK307CisKKy8qKgorICogSW50ZXJmYWNlIHRvIGEgYmxvY2sgb2YgbWVtb3J5IGNvbnRhaW5pbmcgYSBjb25zdGFudCAoY29uc3RleHByKSBhcnJheSBvZiBzb21lIHR5cGUgKFQpLgorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IEMyQ29uc3RNZW1vcnlCbG9jayA6IHB1YmxpYyBDMk1lbW9yeUJsb2NrPFQ+IHsKKyAgICB2aXJ0dWFsIGNvbnN0IFQgKiBkYXRhKCkgY29uc3QgeyByZXR1cm4gX21EYXRhOyB9CisgICAgdmlydHVhbCBzaXplX3Qgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF9tU2l6ZTsgfQorCisgICAgLy8vIENvbnN0cnVjdG9yLgorICAgIHRlbXBsYXRlPHVuc2lnbmVkIE4+CisgICAgaW5saW5lIGNvbnN0ZXhwciBDMkNvbnN0TWVtb3J5QmxvY2soY29uc3QgVCgmaW5pdClbTl0pIDogX21EYXRhKGluaXQpLCBfbVNpemUoTikge30KKworcHJpdmF0ZToKKyAgICBjb25zdCBUICpfbURhdGE7CisgICAgY29uc3Qgc2l6ZV90IF9tU2l6ZTsKK307CisKKy8vLyBcYWRkdG9ncm91cCBpbnRlcm5hbAorLy8vIEB7CisKKy8vLyBIZWxwZXIgY2xhc3MgdG8gaW5pdGlhbGl6ZSBmbGV4aWJsZSBhcnJheXMgd2l0aCB2YXJpb3VzIGluaXRhbGl6ZXJzLgorc3RydWN0IF9DMlZhbHVlQXJyYXlIZWxwZXIgeworICAgIC8vIGNoYXJbXS1zIGFyZSB1c2VkIGFzIG51bGwgdGVybWluYXRlZCBzdHJpbmdzLCBzbyB0aGUgbGFzdCBlbGVtZW50IGlzIG5ldmVyIGluaXRlZC4KKworICAgIC8vLyBJbml0aWFsaXplIGEgZmxleGlibGUgYXJyYXkgdXNpbmcgYSBjb25zdGV4cHIgbWVtb3J5IGJsb2NrLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgc3RhdGljIHZvaWQgaW5pdChUKCZhcnJheSlbXSwgc2l6ZV90IGFycmF5TGVuLCBjb25zdCBDMk1lbW9yeUJsb2NrPFQ+ICZibG9jaykgeworICAgICAgICAvLyByZXNlcnZlIGxhc3QgZWxlbWVudCBmb3IgdGVybWluYWwgMCBmb3Igc3RyaW5ncworICAgICAgICBpZiAoYXJyYXlMZW4gJiYgc3RkOjppc19zYW1lPFQsIGNoYXI+Ojp2YWx1ZSkgeworICAgICAgICAgICAgLS1hcnJheUxlbjsKKyAgICAgICAgfQorICAgICAgICBpZiAoYmxvY2suZGF0YSgpKSB7CisgICAgICAgICAgICBtZW1jcHkoYXJyYXksIGJsb2NrLmRhdGEoKSwgc3RkOjptaW4oYXJyYXlMZW4sIGJsb2NrLnNpemUoKSkgKiBzaXplb2YoVCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8vIEluaXRpYWxpemUgYSBmbGV4aWJsZSBhcnJheSB1c2luZyBhbiBpbml0aWFsaXplciBsaXN0LgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgc3RhdGljIHZvaWQgaW5pdChUKCZhcnJheSlbXSwgc2l6ZV90IGFycmF5TGVuLCBjb25zdCBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8VD4gJmluaXQpIHsKKyAgICAgICAgc2l6ZV90IGl4ID0gMDsKKyAgICAgICAgLy8gcmVzZXJ2ZSBsYXN0IGVsZW1lbnQgZm9yIHRlcm1pbmFsIDAgZm9yIHN0cmluZ3MKKyAgICAgICAgaWYgKGFycmF5TGVuICYmIHN0ZDo6aXNfc2FtZTxULCBjaGFyPjo6dmFsdWUpIHsKKyAgICAgICAgICAgIC0tYXJyYXlMZW47CisgICAgICAgIH0KKyAgICAgICAgZm9yIChjb25zdCBUICZpdGVtIDogaW5pdCkgeworICAgICAgICAgICAgaWYgKGl4ID09IGFycmF5TGVuKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhcnJheVtpeCsrXSA9IGl0ZW07CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLy8gSW5pdGlhbGl6ZSBhIGZsZXhpYmxlIGFycmF5IHVzaW5nIGEgdmVjdG9yLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgc3RhdGljIHZvaWQgaW5pdChUKCZhcnJheSlbXSwgc2l6ZV90IGFycmF5TGVuLCBjb25zdCBzdGQ6OnZlY3RvcjxUPiAmaW5pdCkgeworICAgICAgICBzaXplX3QgaXggPSAwOworICAgICAgICAvLyByZXNlcnZlIGxhc3QgZWxlbWVudCBmb3IgdGVybWluYWwgMCBmb3Igc3RyaW5ncworICAgICAgICBpZiAoYXJyYXlMZW4gJiYgc3RkOjppc19zYW1lPFQsIGNoYXI+Ojp2YWx1ZSkgeworICAgICAgICAgICAgLS1hcnJheUxlbjsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGNvbnN0IFQgJml0ZW0gOiBpbml0KSB7CisgICAgICAgICAgICBpZiAoaXggPT0gYXJyYXlMZW4pIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFycmF5W2l4KytdID0gaXRlbTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vLyBJbml0aWFsaXplIGEgZmxleGlibGUgYXJyYXkgdXNpbmcgYW5vdGhlciBmbGV4aWJsZSBhcnJheS4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCB1bnNpZ25lZCBOPgorICAgIHN0YXRpYyB2b2lkIGluaXQoVCgmYXJyYXkpW10sIHNpemVfdCBhcnJheUxlbiwgY29uc3QgVCgmc3RyKVtOXSkgeworICAgICAgICAvLyByZXNlcnZlIGxhc3QgZWxlbWVudCBmb3IgdGVybWluYWwgMCBmb3Igc3RyaW5ncworICAgICAgICBpZiAoYXJyYXlMZW4gJiYgc3RkOjppc19zYW1lPFQsIGNoYXI+Ojp2YWx1ZSkgeworICAgICAgICAgICAgLS1hcnJheUxlbjsKKyAgICAgICAgfQorICAgICAgICBpZiAoYXJyYXlMZW4pIHsKKyAgICAgICAgICAgIG1lbWNweShhcnJheSwgc3RyLCBzdGQ6Om1pbihhcnJheUxlbiwgKHNpemVfdClOKSAqIHNpemVvZihUKSk7CisgICAgICAgIH0KKyAgICB9Cit9OworCisvKioKKyAqIFNwZWNpYWxpemF0aW9uIGZvciBhIGZsZXhpYmxlIGJsb2IgYW5kIHN0cmluZyBhcnJheXMuIEEgc3RydWN0dXJlIHRlbXBsYXRlIGVuY2Fwc3VsYXRpbmcgYSBzaW5nbGUKKyAqIGZsZXhpYmxlIGFycmF5IG1lbWJlciB3aXRoIGRlZmF1bHQgZmxleGlibGUgY29uc3RydWN0b3JzIGFuZCBubyBjb3JlLWluZGV4LiBUaGlzIHR5cGUgY2Fubm90IGJlCisgKiBjb25zdHJ1Y3RlZCBvbiBpdHMgb3duIGFzIGl0J3Mgc2l6ZSBpcyAwLgorICoKKyAqIFxpbnRlcm5hbCBUaGlzIGlzIGRpZmZlcmVudCBmcm9tIEMyU2ltcGxlQXJyYXlTdHJ1Y3Q8VFtdPiBzaW1wbHkgYmVjYXVzZSBpdHMgbWVtYmVyIGhhcyB0aGUgbmFtZQorICogYXMgdmFsdWUgdG8gcmVmbGVjdCB0aGlzIGlzIGEgc2luZ2xlIHZhbHVlLgorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8VFtdPiB7CisgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8VCwgY2hhcj46OnZhbHVlIHx8IHN0ZDo6aXNfc2FtZTxULCB1aW50OF90Pjo6dmFsdWUsCisgICAgICAgICAgICAgICAgICAiQzJTaW1wbGVWYWx1ZVN0cnVjdDxUW10+IGlzIG9ubHkgZm9yIEJMT0Igb3IgU1RSSU5HIik7CisgICAgVCB2YWx1ZVtdOworCisgICAgaW5saW5lIEMyU2ltcGxlVmFsdWVTdHJ1Y3QoKSA9IGRlZmF1bHQ7CisgICAgREVGSU5FX0JBU0VfQzJTVFJVQ1QoU2ltcGxlVmFsdWUpCisgICAgRkxFWChDMlNpbXBsZVZhbHVlU3RydWN0LCB2YWx1ZSkKKworcHJpdmF0ZToKKyAgICBpbmxpbmUgQzJTaW1wbGVWYWx1ZVN0cnVjdChzaXplX3QgZmxleENvdW50LCBjb25zdCBDMk1lbW9yeUJsb2NrPFQ+ICZibG9jaykgeworICAgICAgICBfQzJWYWx1ZUFycmF5SGVscGVyOjppbml0KHZhbHVlLCBmbGV4Q291bnQsIGJsb2NrKTsKKyAgICB9CisKKyAgICBpbmxpbmUgQzJTaW1wbGVWYWx1ZVN0cnVjdChzaXplX3QgZmxleENvdW50LCBjb25zdCBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8VD4gJmluaXQpIHsKKyAgICAgICAgX0MyVmFsdWVBcnJheUhlbHBlcjo6aW5pdCh2YWx1ZSwgZmxleENvdW50LCBpbml0KTsKKyAgICB9CisKKyAgICBpbmxpbmUgQzJTaW1wbGVWYWx1ZVN0cnVjdChzaXplX3QgZmxleENvdW50LCBjb25zdCBzdGQ6OnZlY3RvcjxUPiAmaW5pdCkgeworICAgICAgICBfQzJWYWx1ZUFycmF5SGVscGVyOjppbml0KHZhbHVlLCBmbGV4Q291bnQsIGluaXQpOworICAgIH0KKworICAgIHRlbXBsYXRlPHVuc2lnbmVkIE4+CisgICAgaW5saW5lIEMyU2ltcGxlVmFsdWVTdHJ1Y3Qoc2l6ZV90IGZsZXhDb3VudCwgY29uc3QgVCgmaW5pdClbTl0pIHsKKyAgICAgICAgX0MyVmFsdWVBcnJheUhlbHBlcjo6aW5pdCh2YWx1ZSwgZmxleENvdW50LCBpbml0KTsKKyAgICB9Cit9OworCisvLy8gQH0KKworLyoqCisgKiBBIHN0cnVjdHVyZSB0ZW1wbGF0ZSBlbmNhcHN1bGF0aW5nIGEgc2luZ2xlIGZsZXhpYmxlIGFycmF5IGVsZW1lbnQgb2YgYSBzcGVjaWZpYyB0eXBlIChUKSB3aXRoCisgKiBkZWZhdWx0IGNvbnN0cnVjdG9ycyBhbmQgbm8gY29yZS1pbmRleC4gVGhpcyB0eXBlIGNhbm5vdCBiZSBjb25zdHJ1Y3RlZCBvbiBpdHMgb3duIGFzIGl0J3Mgc2l6ZQorICogaXMgMC4gSW5zdGVhZCwgaXQgaXMgbWVhbnQgdG8gYmUgdXNlZCBhcyBhIHBhcmFtZXRlciwgZS5nLgorICoKKyAqICAgdHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJTaW1wbGVBcnJheVN0cnVjdDxDMk15RmFuY3lTdHJ1Y3Q+LAorICogICAgICAgICAgIGtQYXJhbUluZGV4TXlGYW5jeUFycmF5U3RyZWFtUGFyYW0+IEMyTXlGYW5jeUFycmF5U3RyZWFtSW5mbzsKKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0cnVjdCBDMlNpbXBsZUFycmF5U3RydWN0IHsKKyAgICBzdGF0aWNfYXNzZXJ0KCFzdGQ6OmlzX3NhbWU8VCwgY2hhcj46OnZhbHVlICYmICFzdGQ6OmlzX3NhbWU8VCwgdWludDhfdD46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgInVzZSBDMlNpbXBsZVZhbHVlU3RydWN0PFRbXT4gaXMgZm9yIEJMT0Igb3IgU1RSSU5HIik7CisKKyAgICBUIHZhbHVlc1tdOyAvLy88IGFycmF5IG1lbWJlcgorICAgIC8vLyBEZWZhdWx0IGNvbnN0cnVjdG9yCisgICAgaW5saW5lIEMyU2ltcGxlQXJyYXlTdHJ1Y3QoKSA9IGRlZmF1bHQ7CisgICAgREVGSU5FX0JBU0VfRkxFWF9DMlNUUlVDVChTaW1wbGVBcnJheSwgdmFsdWVzKQorICAgIC8vRkxFWChDMlNpbXBsZUFycmF5U3RydWN0LCB2YWx1ZXMpCisKK3ByaXZhdGU6CisgICAgLy8vIENvbnN0cnVjdCBmcm9tIGEgQzJNZW1vcnlCbG9jay4KKyAgICAvLy8gVXNlZCBvbmx5IGJ5IHRoZSBmbGV4aWJsZSBwYXJhbWV0ZXIgYWxsb2NhdG9ycyAoQWxsb2NVbmlxdWUgJiBBbGxvY1NoYXJlZCkuCisgICAgaW5saW5lIEMyU2ltcGxlQXJyYXlTdHJ1Y3Qoc2l6ZV90IGZsZXhDb3VudCwgY29uc3QgQzJNZW1vcnlCbG9jazxUPiAmYmxvY2spIHsKKyAgICAgICAgX0MyVmFsdWVBcnJheUhlbHBlcjo6aW5pdCh2YWx1ZXMsIGZsZXhDb3VudCwgYmxvY2spOworICAgIH0KKworICAgIC8vLyBDb25zdHJ1Y3QgZnJvbSBhbiBpbml0aWFsaXplciBsaXN0LgorICAgIC8vLyBVc2VkIG9ubHkgYnkgdGhlIGZsZXhpYmxlIHBhcmFtZXRlciBhbGxvY2F0b3JzIChBbGxvY1VuaXF1ZSAmIEFsbG9jU2hhcmVkKS4KKyAgICBpbmxpbmUgQzJTaW1wbGVBcnJheVN0cnVjdChzaXplX3QgZmxleENvdW50LCBjb25zdCBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8VD4gJmluaXQpIHsKKyAgICAgICAgX0MyVmFsdWVBcnJheUhlbHBlcjo6aW5pdCh2YWx1ZXMsIGZsZXhDb3VudCwgaW5pdCk7CisgICAgfQorCisgICAgLy8vIENvbnN0cnVjdCBmcm9tIGFuIHZlY3Rvci4KKyAgICAvLy8gVXNlZCBvbmx5IGJ5IHRoZSBmbGV4aWJsZSBwYXJhbWV0ZXIgYWxsb2NhdG9ycyAoQWxsb2NVbmlxdWUgJiBBbGxvY1NoYXJlZCkuCisgICAgaW5saW5lIEMyU2ltcGxlQXJyYXlTdHJ1Y3Qoc2l6ZV90IGZsZXhDb3VudCwgY29uc3Qgc3RkOjp2ZWN0b3I8VD4gJmluaXQpIHsKKyAgICAgICAgX0MyVmFsdWVBcnJheUhlbHBlcjo6aW5pdCh2YWx1ZXMsIGZsZXhDb3VudCwgaW5pdCk7CisgICAgfQorCisgICAgLy8vIENvbnN0cnVjdCBmcm9tIGFub3RoZXIgZmxleGlibGUgYXJyYXkuCisgICAgLy8vIFVzZWQgb25seSBieSB0aGUgZmxleGlibGUgcGFyYW1ldGVyIGFsbG9jYXRvcnMgKEFsbG9jVW5pcXVlICYgQWxsb2NTaGFyZWQpLgorICAgIHRlbXBsYXRlPHVuc2lnbmVkIE4+CisgICAgaW5saW5lIEMyU2ltcGxlQXJyYXlTdHJ1Y3Qoc2l6ZV90IGZsZXhDb3VudCwgY29uc3QgVCgmaW5pdClbTl0pIHsKKyAgICAgICAgX0MyVmFsdWVBcnJheUhlbHBlcjo6aW5pdCh2YWx1ZXMsIGZsZXhDb3VudCwgaW5pdCk7CisgICAgfQorfTsKKworLyoqCisgKiBcYWRkdG9ncm91cCBzaW1wbGV2YWx1ZSBTaW1wbGUgdmFsdWUgYW5kIGFycmF5IHN0cnVjdHVyZXMuCisgKiBAeworICoKKyAqIFNpbXBsZSB2YWx1ZSBzdHJ1Y3R1cmVzLgorICoKKyAqIFN0cnVjdHVyZXMgY29udGFpbmluZyBhIHNpbmdsZSBzaW1wbGUgdmFsdWUuIFRoZXNlIGNhbiBiZSByZXVzZWQgdG8gZWFzaWx5IGRlZmluZSBzaW1wbGUKKyAqIHBhcmFtZXRlcnMgb2YgdmFyaW91cyB0eXBlczoKKyAqCisgKiAgIHR5cGVkZWYgQzJQb3J0UGFyYW08QzJUdW5pbmcsIEMySW50MzJWYWx1ZSwga1BhcmFtSW5kZXhNeUludGVnZXJQb3J0UGFyYW0+CisgKiAgICAgICAgICAgQzJNeUludGVnZXJQb3J0UGFyYW1UdW5pbmc7CisgKgorICogVGhleSBjb250YWluIGEgc2luZ2xlIG1lbWJlciAodmFsdWUgb3IgdmFsdWVzKSB0aGF0IGlzIGRlc2NyaWJlZCBhcyAidmFsdWUiIG9yICJ2YWx1ZXMiLgorICoKKyAqIFRoZXNlIHN0cnVjdHVyZXMgZG9uJ3QgZGVmaW5lIGEgY29yZSBpbmRleCwgYW5kIGFzIHN1Y2gsIHRoZXkgY2Fubm90IGJlIHVzZWQgaW4gc3RydWN0dXJlCisgKiBkZWNsYXJhdGlvbnMuIFVzZSB0eXBlW10gaW5zdGVhZCwgc3VjaCBhcyBpbnQzMl90IGZpZWxkW10uCisgKi8KKy8vLyBBIDMyLWJpdCBzaWduZWQgaW50ZWdlciBwYXJhbWV0ZXIgaW4gdmFsdWUsIGRlc2NyaWJlZCBhcyAidmFsdWUiCit0eXBlZGVmIEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8aW50MzJfdD4gQzJJbnQzMlZhbHVlOworLy8vIEEgMzItYml0IHNpZ25lZCBpbnRlZ2VyIGFycmF5IHBhcmFtZXRlciBpbiB2YWx1ZXMsIGRlc2NyaWJlZCBhcyAidmFsdWVzIgordHlwZWRlZiBDMlNpbXBsZUFycmF5U3RydWN0PGludDMyX3Q+IEMySW50MzJBcnJheTsKKy8vLyBBIDMyLWJpdCB1bnNpZ25lZCBpbnRlZ2VyIHBhcmFtZXRlciBpbiB2YWx1ZSwgZGVzY3JpYmVkIGFzICJ2YWx1ZSIKK3R5cGVkZWYgQzJTaW1wbGVWYWx1ZVN0cnVjdDx1aW50MzJfdD4gQzJVaW50MzJWYWx1ZTsKKy8vLyBBIDMyLWJpdCB1bnNpZ25lZCBpbnRlZ2VyIGFycmF5IHBhcmFtZXRlciBpbiB2YWx1ZXMsIGRlc2NyaWJlZCBhcyAidmFsdWVzIgordHlwZWRlZiBDMlNpbXBsZUFycmF5U3RydWN0PHVpbnQzMl90PiBDMlVpbnQzMkFycmF5OworLy8vIEEgNjQtYml0IHNpZ25lZCBpbnRlZ2VyIHBhcmFtZXRlciBpbiB2YWx1ZSwgZGVzY3JpYmVkIGFzICJ2YWx1ZSIKK3R5cGVkZWYgQzJTaW1wbGVWYWx1ZVN0cnVjdDxpbnQ2NF90PiBDMkludDY0VmFsdWU7CisvLy8gQSA2NC1iaXQgc2lnbmVkIGludGVnZXIgYXJyYXkgcGFyYW1ldGVyIGluIHZhbHVlcywgZGVzY3JpYmVkIGFzICJ2YWx1ZXMiCit0eXBlZGVmIEMyU2ltcGxlQXJyYXlTdHJ1Y3Q8aW50NjRfdD4gQzJJbnQ2NEFycmF5OworLy8vIEEgNjQtYml0IHVuc2lnbmVkIGludGVnZXIgcGFyYW1ldGVyIGluIHZhbHVlLCBkZXNjcmliZWQgYXMgInZhbHVlIgordHlwZWRlZiBDMlNpbXBsZVZhbHVlU3RydWN0PHVpbnQ2NF90PiBDMlVpbnQ2NFZhbHVlOworLy8vIEEgNjQtYml0IHVuc2lnbmVkIGludGVnZXIgYXJyYXkgcGFyYW1ldGVyIGluIHZhbHVlcywgZGVzY3JpYmVkIGFzICJ2YWx1ZXMiCit0eXBlZGVmIEMyU2ltcGxlQXJyYXlTdHJ1Y3Q8dWludDY0X3Q+IEMyVWludDY0QXJyYXk7CisvLy8gQSBmbG9hdCBwYXJhbWV0ZXIgaW4gdmFsdWUsIGRlc2NyaWJlZCBhcyAidmFsdWUiCit0eXBlZGVmIEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8ZmxvYXQ+IEMyRmxvYXRWYWx1ZTsKKy8vLyBBIGZsb2F0IGFycmF5IHBhcmFtZXRlciBpbiB2YWx1ZXMsIGRlc2NyaWJlZCBhcyAidmFsdWVzIgordHlwZWRlZiBDMlNpbXBsZUFycmF5U3RydWN0PGZsb2F0PiBDMkZsb2F0QXJyYXk7CisvLy8gQSBibG9iIGZsZXhpYmxlIHBhcmFtZXRlciBpbiB2YWx1ZSwgZGVzY3JpYmVkIGFzICJ2YWx1ZSIKK3R5cGVkZWYgQzJTaW1wbGVWYWx1ZVN0cnVjdDx1aW50OF90W10+IEMyQmxvYlZhbHVlOworLy8vIEEgc3RyaW5nIGZsZXhpYmxlIHBhcmFtZXRlciBpbiB2YWx1ZSwgZGVzY3JpYmVkIGFzICJ2YWx1ZSIKK3R5cGVkZWYgQzJTaW1wbGVWYWx1ZVN0cnVjdDxjaGFyW10+IEMyU3RyaW5nVmFsdWU7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+Citjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gQzJTaW1wbGVWYWx1ZVN0cnVjdDxUPjo6RmllbGRMaXN0KCkgeworICAgIHJldHVybiB7IERFU0NSSUJFX0MyRklFTEQodmFsdWUsICJ2YWx1ZSIpIH07Cit9Cit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8VFtdPjo6RmllbGRMaXN0KCkgeworICAgIHJldHVybiB7IERFU0NSSUJFX0MyRklFTEQodmFsdWUsICJ2YWx1ZSIpIH07Cit9Cit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEMyU2ltcGxlQXJyYXlTdHJ1Y3Q8VD46OkZpZWxkTGlzdCgpIHsKKyAgICByZXR1cm4geyBERVNDUklCRV9DMkZJRUxEKHZhbHVlcywgInZhbHVlcyIpIH07Cit9CisKKy8vLyBAfQorCisvLy8gQH0KKworI2VuZGlmICAvLyBDMlBBUkFNX0RFRl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2luY2x1ZGUvQzJXb3JrLmggYi9tZWRpYS9jb2RlYzIvaW5jbHVkZS9DMldvcmsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTIzZjNlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2luY2x1ZGUvQzJXb3JrLmgKQEAgLTAsMCArMSwyMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEMyV09SS19IXworCisjZGVmaW5lIEMyV09SS19IXworCisjaW5jbHVkZSA8QzJCdWZmZXIuaD4KKyNpbmNsdWRlIDxDMlBhcmFtLmg+CisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8bGlzdD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRib29sLmg+CisKKy8vLyBcZGVmZ3JvdXAgd29yayBXb3JrIGFuZCBkYXRhIHByb2Nlc3NpbmcKKy8vLyBAeworCisvKioKKyAqIEluZm9ybWF0aW9uIGRlc2NyaWJpbmcgdGhlIHJlYXNvbiBhIHBhcmFtZXRlciBzZXR0aW5ncyBtYXkgZmFpbCwgb3IKKyAqIG1heSBiZSBvdmVycmlkZW4uCisgKi8KK3N0cnVjdCBDMlNldHRpbmdSZXN1bHQgeworICAgIGVudW0gRmFpbHVyZSA6IHVpbnQzMl90IHsKKyAgICAgICAgLyogcGFyYW1ldGVyIGZhaWx1cmVzIGJlbG93ICovCisgICAgICAgIEJBRF9UWVBFLCAgIC8vLzwgcGFyYW1ldGVyIGlzIG5vdCBzdXBwb3J0ZWQKKyAgICAgICAgQkFEX1BPUlQsICAgLy8vPCBwYXJhbWV0ZXIgaXMgbm90IHN1cHBvcnRlZCBvbiB0aGUgc3BlY2lmaWMgcG9ydAorICAgICAgICBCQURfSU5ERVgsICAvLy88IHBhcmFtZXRlciBpcyBub3Qgc3VwcG9ydGVkIG9uIHRoZSBzcGVjaWZpYyBzdHJlYW0KKyAgICAgICAgUkVBRF9PTkxZLCAgLy8vPCBwYXJhbWV0ZXIgaXMgcmVhZC1vbmx5IGFuZCBjYW5ub3QgYmUgc2V0CisgICAgICAgIE1JU01BVENILCAgIC8vLzwgcGFyYW1ldGVyIG1pc21hdGNoZXMgaW5wdXQgZGF0YQorCisgICAgICAgIC8qIGZpZWxkIGZhaWx1cmVzIGJlbG93ICovCisgICAgICAgIEJBRF9WQUxVRSwgIC8vLzwgc3RyaWN0IHBhcmFtZXRlciBkb2VzIG5vdCBhY2NlcHQgdmFsdWUgZm9yIHRoZSBmaWVsZCBhdCBhbGwKKyAgICAgICAgQ09ORkxJQ1QsICAgLy8vPCBzdHJpY3QgcGFyYW1ldGVyIGZpZWxkIHZhbHVlIGlzIGluIGNvbmZsaWN0IHdpdGggYW4vb3RoZXIgc2V0dGluZyhzKQorCisgICAgICAgIC8vLyBwYXJhbWV0ZXIgZmllbGQgaXMgb3V0IG9mIHJhbmdlIGR1ZSB0byBvdGhlciBzZXR0aW5ncyAodGhpcyBmYWlsdXJlIG1vZGUKKyAgICAgICAgLy8vIGNhbiBvbmx5IGJlIHVzZWQgZm9yIHN0cmljdCBjYWxjdWxhdGVkIHBhcmFtZXRlcnMpCisgICAgICAgIFVOU1VQUE9SVEVELAorCisgICAgICAgIC8vLyBmaWVsZCBkb2VzIG5vdCBhY2Nlc3MgdGhlIHJlcXVlc3RlZCBwYXJhbWV0ZXIgdmFsdWUgYXQgYWxsLiBJdCBoYXMgYmVlbiBjb3JyZWN0ZWQgdG8KKyAgICAgICAgLy8vIHRoZSBjbG9zZXN0IHN1cHBvcnRlZCB2YWx1ZS4gVGhpcyBmYWlsdXJlIG1vZGUgaXMgcHJvdmlkZWQgdG8gZ2l2ZSBndWlkYW5jZSBhcyB0byB3aGF0CisgICAgICAgIC8vLyBhcmUgdGhlIGN1cnJlbnRseSBzdXBwb3J0ZWQgdmFsdWVzIGZvciB0aGlzIGZpZWxkICh3aGljaCBtYXkgYmUgYSBzdWJzZXQgb2YgdGhlIGF0LWFsbC0KKyAgICAgICAgLy8vIHBvdGVudGlhbCB2YWx1ZXMpCisgICAgICAgIElORk9fQkFEX1ZBTFVFLAorCisgICAgICAgIC8vLyByZXF1ZXN0ZWQgcGFyYW1ldGVyIHZhbHVlIGlzIGluIGNvbmZsaWN0IHdpdGggYW4vb3RoZXIgc2V0dGluZyhzKQorICAgICAgICAvLy8gYW5kIGhhcyBiZWVuIGNvcnJlY3RlZCB0byB0aGUgY2xvc2VzdCBzdXBwb3J0ZWQgdmFsdWUuIFRoaXMgZmFpbHVyZQorICAgICAgICAvLy8gbW9kZSBpcyBnaXZlbiB0byBwcm92aWRlIGd1aWRhbmNlIGFzIHRvIHdoYXQgYXJlIHRoZSBjdXJyZW50bHkgc3VwcG9ydGVkIHZhbHVlcyBhcyB3ZWxsCisgICAgICAgIC8vLyBhcyB0byBvcHRpb25hbGx5IHByb3ZpZGUgc3VnZ2VzdGlvbiB0byB0aGUgY2xpZW50IGFzIHRvIGhvdyB0byBlbmFibGUgdGhlIHJlcXVlc3RlZAorICAgICAgICAvLy8gcGFyYW1ldGVyIHZhbHVlLgorICAgICAgICBJTkZPX0NPTkZMSUNULAorICAgIH07CisKKyAgICBGYWlsdXJlIGZhaWx1cmU7ICAgIC8vLzwgZmFpbHVyZSBjb2RlCisKKyAgICAvLy8gRmFpbGluZyAob3IgY29ycmVjdGVkKSBmaWVsZCBvciBwYXJhbWV0ZXJhbmQgb3B0aW9uYWxseSwgY3VycmVudGx5IHN1cHBvcnRlZCB2YWx1ZXMgZm9yIHRoZQorICAgIC8vLyBmaWVsZC4gVmFsdWVzIG11c3Qgb25seSBiZSBzZXQgZm9yIGZpZWxkIGZhaWx1cmVzIG90aGVyIHRoYW4gQkFEX1ZBTFVFLCBhbmQgb25seSBpZiB0aGV5IGFyZQorICAgIC8vLyBkaWZmZXJlbnQgZnJvbSB0aGUgZ2xvYmFsbHkgc3VwcG9ydGVkIHZhbHVlcyAoZS5nLiBkdWUgdG8gcmVzdHJpY3Rpb25zIGJ5IGFub3RoZXIgcGFyYW0gb3IKKyAgICAvLy8gaW5wdXQgZGF0YSkuCisgICAgQzJQYXJhbUZpZWxkVmFsdWVzIGZpZWxkOworCisgICAgLy8vIENvbmZsaWN0aW5nIHBhcmFtZXRlcnMgb3IgZmllbGRzIHdpdGggb3B0aW9uYWwgc3VnZ2VzdGlvbnMgd2l0aCAob3B0aW9uYWwpIHN1Z2dlc3RlZCB2YWx1ZXMKKyAgICAvLy8gZm9yIGFueSBjb25mbGljdGluZyBmaWVsZHMgdG8gYXZvaWQgdGhlIGNvbmZsaWN0LiBNdXN0IG9ubHkgYmUgc2V0IGZvciBDT05GTElDVCwgVU5TVVBQT1JURUQKKyAgICAvLy8gYW5kIElORk9fQ09ORkxJQ1QgZmFpbHVyZSBjb2Rlcy4KKyAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtRmllbGRWYWx1ZXM+IGNvbmZsaWN0czsKK307CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gIFdPUksKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvKiogVW5pcXVlIElEIGZvciBhIHByb2Nlc3Npbmcgbm9kZS4gKi8KK3R5cGVkZWYgdWludDMyX3QgYzJfbm9kZV9pZF90OworCitlbnVtIHsKKyAgICBrUGFyYW1JbmRleFdvcmtPcmRpbmFsLAorfTsKKworLyoqCisgKiBJbmZvcm1hdGlvbiBmb3Igb3JkZXJpbmcgd29yayBpdGVtcyBvbiBhIGNvbXBvbmVudCBwb3J0LgorICovCitzdHJ1Y3QgQzJXb3JrT3JkaW5hbFN0cnVjdCB7CisvL3B1YmxpYzoKKyAgICBjMl9jbnRyNjRfdCB0aW1lc3RhbXA7ICAgICAvKiogZnJhbWUgdGltZXN0YW1wIGluIG1pY3Jvc2Vjb25kcyAqLworICAgIGMyX2NudHI2NF90IGZyYW1lSW5kZXg7ICAgIC8qKiBzdWJtaXNzaW9uIG9yZGluYWwgb24gdGhlIGluaXRpYWwgY29tcG9uZW50ICovCisgICAgYzJfY250cjY0X3QgY3VzdG9tT3JkaW5hbDsgLyoqIGNhbiBiZSBnaXZlbiBieSB0aGUgY29tcG9uZW50LCBlLmcuIGRlY29kZSBvcmRlciAqLworCisgICAgREVGSU5FX0FORF9ERVNDUklCRV9DMlNUUlVDVChXb3JrT3JkaW5hbCkKKyAgICBDMkZJRUxEKHRpbWVzdGFtcCwgInRpbWVzdGFtcCIpCisgICAgQzJGSUVMRChmcmFtZUluZGV4LCAiZnJhbWUtaW5kZXgiKQorICAgIEMyRklFTEQoY3VzdG9tT3JkaW5hbCwgImN1c3RvbS1vcmRpbmFsIikKK307CisKKy8qKgorICogVGhpcyBzdHJ1Y3R1cmUgcmVwcmVzZW50cyBhIENvZGVjIDIuMCBmcmFtZSB3aXRoIGl0cyBtZXRhZGF0YS4KKyAqCisgKiBBIGZyYW1lIGJhc2ljYWxseSBjb25zaXN0cyBvZiBhbiBvcmRlcmVkIHNldHMgb2YgYnVmZmVycywgY29uZmlndXJhdGlvbiBjaGFuZ2VzIGFuZCBpbmZvIGJ1ZmZlcnMKKyAqIGFsb25nIHdpdGggc29tZSBub24tY29uZmlndXJhdGlvbiBtZXRhZGF0YS4KKyAqLworc3RydWN0IEMyRnJhbWVEYXRhIHsKKy8vcHVibGljOgorICAgIGVudW0gZmxhZ3NfdCA6IHVpbnQzMl90IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEZvciBpbnB1dCBmcmFtZXM6IG5vIG91dHB1dCBmcmFtZSBzaGFsbCBiZSBnZW5lcmF0ZWQgd2hlbiBwcm9jZXNzaW5nIHRoaXMgZnJhbWUsIGJ1dAorICAgICAgICAgKiBtZXRhZGF0YSBzaGFsbCBzdGlsbCBiZSBwcm9jZXNzZWQuCisgICAgICAgICAqIEZvciBvdXRwdXQgZnJhbWVzOiB0aGlzIGZyYW1lIHNoYWxsIGJlIGRpc2NhcmRlZCBhbmQgYnV0IG1ldGFkYXRhIGlzIHN0aWxsIHZhbGlkLgorICAgICAgICAgKi8KKyAgICAgICAgRkxBR19EUk9QX0ZSQU1FICAgID0gKDEgPDwgMCksCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGlzIGZyYW1lIGlzIHRoZSBsYXN0IGZyYW1lIG9mIHRoZSBjdXJyZW50IHN0cmVhbS4gRnVydGhlciBmcmFtZXMgYXJlIHBhcnQgb2YgYSBuZXcKKyAgICAgICAgICogc3RyZWFtLgorICAgICAgICAgKi8KKyAgICAgICAgRkxBR19FTkRfT0ZfU1RSRUFNID0gKDEgPDwgMSksCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGlzIGZyYW1lIHNoYWxsIGJlIGRpc2NhcmRlZCB3aXRoIGl0cyBtZXRhZGF0YS4KKyAgICAgICAgICogVGhpcyBmbGFnIGlzIG9ubHkgc2V0IGJ5IGNvbXBvbmVudHMgLSBlLmcuIGFzIGEgcmVzcG9uc2UgdG8gdGhlIGZsdXNoIGNvbW1hbmQuCisgICAgICAgICAqLworICAgICAgICBGTEFHX0RJU0NBUkRfRlJBTUUgPSAoMSA8PCAyKSwKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoaXMgZnJhbWUgaXMgbm90IHRoZSBsYXN0IGZyYW1lIHByb2R1Y2VkIGZvciB0aGUgaW5wdXQuCisgICAgICAgICAqCisgICAgICAgICAqIFRoaXMgZmxhZyBpcyBub3JtYWxseSBzZXQgYnkgdGhlIGNvbXBvbmVudCAtIGUuZy4gd2hlbiBhbiBpbnB1dCBmcmFtZSByZXN1bHRzIGluIG11bHRpcGxlCisgICAgICAgICAqIG91dHB1dCBmcmFtZXMsIHRoaXMgZmxhZyBpcyBzZXQgb24gYWxsIGJ1dCB0aGUgbGFzdCBvdXRwdXQgZnJhbWUuCisgICAgICAgICAqCisgICAgICAgICAqIEFsc28sIHdoZW4gY29tcG9uZW50cyBhcmUgY2hhaW5lZCwgdGhpcyBmbGFnIHNob3VsZCBiZSBwcm9wYWdhdGVkIGRvd24gdGhlCisgICAgICAgICAqIHdvcmsgY2hhaW4uIFRoYXQgaXMsIGlmIHNldCBvbiBhbiBlYXJsaWVyIGZyYW1lIG9mIGEgd29yay1jaGFpbiwgaXQgc2hvdWxkIGJlIHByb3BhZ2F0ZWQKKyAgICAgICAgICogdG8gYWxsIGxhdGVyIGZyYW1lcyBpbiB0aGF0IGNoYWluLiBBZGRpdGlvbmFsbHksIGNvbXBvbmVudHMgZG93biB0aGUgY2hhaW4gY291bGQgc2V0CisgICAgICAgICAqIHRoaXMgZmxhZyBldmVuIGlmIG5vdCBzZXQgZWFybGllciwgZS5nLiBpZiBtdWx0aXBsZSBvdXRwdXQgZnJhbWUgaXMgZ2VuZXJhdGVkIGF0IHRoYXQKKyAgICAgICAgICogY29tcG9uZW50IGZvciB0aGUgaW5wdXQgZnJhbWUuCisgICAgICAgICAqLworICAgICAgICBGTEFHX0lOQ09NUExFVEUgPSAoMSA8PCAzKSwKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoaXMgZnJhbWUgY29udGFpbnMgb25seSBjb2RlYy1zcGVjaWZpYyBjb25maWd1cmF0aW9uIGRhdGEsIGFuZCBubyBhY3R1YWwgYWNjZXNzIHVuaXQuCisgICAgICAgICAqCisgICAgICAgICAqIFxkZXByZWNhdGVkIHBhc3MgY29kZWMgY29uZmlndXJhdGlvbiB3aXRoIHVzaW5nIHRoZSBcdG9kbyBjb2RlYy1zcGVjaWZpYyBjb25maWd1cmF0aW9uCisgICAgICAgICAqIGluZm8gdG9nZXRoZXIgd2l0aCB0aGUgYWNjZXNzIHVuaXQuCisgICAgICAgICAqLworICAgICAgICBGTEFHX0NPREVDX0NPTkZJRyAgPSAoMXUgPDwgMzEpLAorICAgIH07CisKKyAgICAvKioKKyAgICAgKiBGcmFtZSBmbGFncyAqLworICAgIGZsYWdzX3QgIGZsYWdzOworICAgIEMyV29ya09yZGluYWxTdHJ1Y3Qgb3JkaW5hbDsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+PiBidWZmZXJzOworICAgIC8vPCBmb3IgaW5pdGlhbCB3b3JrIGl0ZW0sIHRoZXNlIG1heSBhbHNvIGNvbWUgZnJvbSB0aGUgcGFyc2VyIC0gaWYgcHJvdmlkZWQKKyAgICAvLzwgZm9yIG91dHB1dCBidWZmZXJzLCB0aGVzZSBhcmUgdGhlIHJlc3BvbnNlcyB0byByZXF1ZXN0ZWRJbmZvcworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gICAgICBjb25maWdVcGRhdGU7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMySW5mb0J1ZmZlcj4+IGluZm9CdWZmZXJzOworfTsKKworc3RydWN0IEMyV29ya2xldCB7CisvL3B1YmxpYzoKKyAgICAvLyBJTgorICAgIGMyX25vZGVfaWRfdCBjb21wb25lbnQ7CisKKyAgICAvKiogQ29uZmlndXJhdGlvbiBjaGFuZ2VzIHRvIGJlIGFwcGxpZWQgYmVmb3JlIHByb2Nlc3NpbmcgdGhpcyB3b3JrbGV0LiAqLworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlR1bmluZz4+IHR1bmluZ3M7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworCisgICAgLy8gT1VUCisgICAgQzJGcmFtZURhdGEgb3V0cHV0OworfTsKKworLyoqCisgKiBJbmZvcm1hdGlvbiBhYm91dCBwYXJ0aWFsIHdvcmstY2hhaW5zIG5vdCBwYXJ0IG9mIHRoZSBjdXJyZW50IHdvcmsgaXRlbXMuCisgKgorICogVG8gYmUgZGVmaW5lZCBsYXRlci4KKyAqLworc3RydWN0IEMyV29ya0NoYWluSW5mbzsKKworLyoqCisgKiBUaGlzIHN0cnVjdHVyZSBob2xkcyBpbmZvcm1hdGlvbiBhYm91dCBhbGwgYSBzaW5nbGUgd29yayBpdGVtLgorICoKKyAqIFRoaXMgc3RydWN0dXJlIHNoYWxsIGJlIHBhc3NlZCBieSB0aGUgY2xpZW50IHRvIHRoZSBjb21wb25lbnQgZm9yIHRoZSBmaXJzdCB3b3JrbGV0LiBBcyBzdWNoLAorICogd29ya2xldHMgbXVzdCBub3QgYmUgZW1wdHkuIFRoZSBvd25lcnNoaXAgb2YgdGhpcyBvYmplY3QgaXMgcGFzc2VkLgorICovCitzdHJ1Y3QgQzJXb3JrIHsKKy8vcHVibGljOgorICAgIC8vLyBhZGRpdGlvbmFsIHdvcmsgY2hhaW4gaW5mbyBub3QgcGFydCBvZiB0aGlzIHdvcmsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJXb3JrQ2hhaW5JbmZvPiBjaGFpbkluZm87CisKKyAgICAvLy8gVGhlIGlucHV0IGRhdGEgdG8gYmUgcHJvY2Vzc2VkIGFzIHBhcnQgb2YgdGhpcyB3b3JrL3dvcmstY2hhaW4uIFRoaXMgaXMgcHJvdmlkZWQgYnkgdGhlCisgICAgLy8vIGNsaWVudCB3aXRoIG93bmVyc2hpcC4gV2hlbiB0aGUgd29yayBpcyByZXR1cm5lZCAodmlhIG9uV29ya0RvbmUpLCB0aGUgaW5wdXQgYnVmZmVyLXBhY2sncworICAgIC8vLyBidWZmZXIgdmVjdG9yIHNoYWxsIGNvbnRhaW4gbnVsbHB0cnMuCisgICAgQzJGcmFtZURhdGEgaW5wdXQ7CisKKyAgICAvLy8gVGhlIGNoYWluIG9mIGNvbXBvbmVudHMsIHR1bmluZ3MgKGluY2x1ZGluZyBvdXRwdXQgYnVmZmVyIHBvb2wgSURzKSBhbmQgaW5mbyByZXF1ZXN0cyB0aGF0IHRoZQorICAgIC8vLyBkYXRhIG11c3QgcGFzcyB0aHJvdWdoLiBJZiB0aGlzIGhhcyBtb3JlIHRoYW4gYSBzaW5nbGUgZWxlbWVudCwgdGhlIHR1bm5lbHMgYmV0d2VlbiBzdWNjZXNzaXZlCisgICAgLy8vIGNvbXBvbmVudHMgb2YgdGhlIHdvcmtsZXQgY2hhaW4gbXVzdCBoYXZlIGJlZW4gKHN1Y2Nlc3NmdWxseSkgcHJlLXJlZ2lzdGVyZWQgYXQgdGhlIHRpbWUgdGhhdAorICAgIC8vLyB0aGUgd29yayBpcyBzdWJtaXR0ZWQuIEFsbG9jYXRpbmcgdGhlIG91dHB1dCBidWZmZXJzIGluIHRoZSB3b3JrbGV0cyBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YKKyAgICAvLy8gZWFjaCBjb21wb25lbnQuIFVwb24gd29yayBzdWJtaXNzaW9uLCBlYWNoIG91dHB1dCBidWZmZXItcGFjayBzaGFsbCBiZSBhbiBhcHByb3ByaWF0ZWx5IHNpemVkCisgICAgLy8vIHZlY3RvciBjb250YWluaW5nIG51bGxwdHJzLiBXaGVuIHRoZSB3b3JrIGlzIGNvbXBsZXRlZC9yZXR1cm5lZCB0byB0aGUgY2xpZW50LCBvdXRwdXQgYnVmZmVycworICAgIC8vLyBwb2ludGVycyBmcm9tIGFsbCBidXQgdGhlIGZpbmFsIHdvcmtsZXQgc2hhbGwgYmUgbnVsbHB0cnMuCisgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcmtsZXQ+PiB3b3JrbGV0czsKKworICAgIC8vLyBOdW1iZXIgb2Ygd29ya2xldHMgc3VjY2Vzc2Z1bGx5IHByb2Nlc3NlZCBpbiB0aGlzIGNoYWluLiBUaGlzIHNoYWxsIGJlIGluaXRpYWxpemVkIHRvIDAgYnkgdGhlCisgICAgLy8vIGNsaWVudCB3aGVuIHRoZSB3b3JrIGlzIHN1Ym1pdHRlZC4gSXQgc2hhbGwgY29udGFpbiB0aGUgbnVtYmVyIG9mIHdvcmtsZXRzIHRoYXQgd2VyZQorICAgIC8vLyBzdWNjZXNzZnVsbHkgcHJvY2Vzc2VkIHdoZW4gdGhlIHdvcmsgaXMgcmV0dXJuZWQgdG8gdGhlIGNsaWVudC4gSWYgdGhpcyBpcyBsZXNzIHRoZW4gdGhlIG51bWJlcgorICAgIC8vLyBvZiB3b3JrbGV0cywgcmVzdWx0IG11c3Qgbm90IGJlIHN1Y2Nlc3MuIEl0IG11c3QgYmUgaW4gdGhlIHJhbmdlIG9mIFswLCB3b3JrbGV0cy5zaXplKCldLgorICAgIHVpbnQzMl90IHdvcmtsZXRzUHJvY2Vzc2VkOworCisgICAgLy8vIFRoZSBmaW5hbCBvdXRjb21lIG9mIHRoZSB3b3JrIChjb3JyZXNwb25kaW5nIHRvIHRoZSBjdXJyZW50IHdvcmtsZXRzUHJvY2Vzc2VkKS4gSWYgMCB3aGVuCisgICAgLy8vIHdvcmsgaXMgcmV0dXJuZWQsIGl0IGlzIGFzc3VtZWQgdGhhdCBhbGwgd29ya2xldHMgaGF2ZSBiZWVuIHByb2Nlc3NlZC4KKyAgICBjMl9zdGF0dXNfdCByZXN1bHQ7Cit9OworCisvKioKKyAqIEluZm9ybWF0aW9uIGFib3V0IGEgZnV0dXJlIHdvcmsgdG8gYmUgc3VibWl0dGVkIHRvIHRoZSBjb21wb25lbnQuIFRoZSBpbmZvcm1hdGlvbiBpcyB1c2VkIHRvCisgKiByZXNlcnZlIHRoZSB3b3JrIGZvciB3b3JrIG9yZGVyaW5nIHB1cnBvc2VzLgorICovCitzdHJ1Y3QgQzJXb3JrT3V0bGluZSB7CisvL3B1YmxpYzoKKyAgICBDMldvcmtPcmRpbmFsU3RydWN0IG9yZGluYWw7CisgICAgc3RkOjp2ZWN0b3I8YzJfbm9kZV9pZF90PiBjaGFpbjsKK307CisKKy8vLyBAfQorCisjZW5kaWYgIC8vIEMyV09SS19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2luY2x1ZGUvX0MyTWFjcm9VdGlscy5oIGIvbWVkaWEvY29kZWMyL2luY2x1ZGUvX0MyTWFjcm9VdGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0ZTliYTUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaW5jbHVkZS9fQzJNYWNyb1V0aWxzLmgKQEAgLTAsMCArMSwxNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEMyVVRJTFNfTUFDUk9fVVRJTFNfSF8KKyNkZWZpbmUgQzJVVElMU19NQUNST19VVElMU19IXworCisvKiogXGZpbGUKKyAqIE1hY3JvIHV0aWxpdGllcyBmb3IgdGhlIHV0aWxzIGxpYnJhcnkgdXNlZCBieSBDb2RlYzIgaW1wbGVtZW50YXRpb25zLgorICovCisKKy8vLyBcaWYgMAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVkFSSUFCTEUgQVJHVU1FTlQgQ09VTlRJTkcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8vIHJlbW92ZSBlbXB0eSBhcmd1bWVudHMgLSBfQzJfQVJHKCkgZXhwYW5kcyB0byAnJywgd2hpbGUgX0MyX0FSRyh4KSBleHBhbmRzIHRvICcsIHgnCisvLyBfQzJfQVJHbiguLi4pIGRvZXMgdGhlIHNhbWUgZm9yIG4gYXJndW1lbnRzCisjZGVmaW5lIF9DMl9BUkcoLi4uKSAsICMjX19WQV9BUkdTX18KKyNkZWZpbmUgX0MyX0FSRzIoXzEsIF8yKSBfQzJfQVJHKF8xKSBfQzJfQVJHKF8yKQorI2RlZmluZSBfQzJfQVJHNChfMSwgXzIsIF8zLCBfNCkgX0MyX0FSRzIoXzEsIF8yKSBfQzJfQVJHMihfMywgXzQpCisjZGVmaW5lIF9DMl9BUkc4KF8xLCBfMiwgXzMsIF80LCBfNSwgXzYsIF83LCBfOCkgX0MyX0FSRzQoXzEsIF8yLCBfMywgXzQpIF9DMl9BUkc0KF81LCBfNiwgXzcsIF84KQorI2RlZmluZSBfQzJfQVJHMTYoXzEsIF8yLCBfMywgXzQsIF81LCBfNiwgXzcsIF84LCBfOSwgXzEwLCBfMTEsIF8xMiwgXzEzLCBfMTQsIF8xNSwgXzE2KSBcCisgICAgICAgIF9DMl9BUkc4KF8xLCBfMiwgXzMsIF80LCBfNSwgXzYsIF83LCBfOCkgX0MyX0FSRzgoXzksIF8xMCwgXzExLCBfMTIsIF8xMywgXzE0LCBfMTUsIF8xNikKKworLy8gcmV0dXJuIHRoZSA2NXRoIGFyZ3VtZW50CisjZGVmaW5lIF9DMl9BUkdDXzMoXywgXzAsIF8xLCBfMiwgXzMsIF80LCBfNSwgXzYsIF83LCBfOCwgXzksIF8xMCwgXzExLCBfMTIsIF8xMywgXzE0LCBfMTUsIF8xNiwgXAorICAgICAgICBfMTcsIF8xOCwgXzE5LCBfMjAsIF8yMSwgXzIyLCBfMjMsIF8yNCwgXzI1LCBfMjYsIF8yNywgXzI4LCBfMjksIF8zMCwgXzMxLCBfMzIsIFwKKyAgICAgICAgXzMzLCBfMzQsIF8zNSwgXzM2LCBfMzcsIF8zOCwgXzM5LCBfNDAsIF80MSwgXzQyLCBfNDMsIF80NCwgXzQ1LCBfNDYsIF80NywgXzQ4LCBcCisgICAgICAgIF80OSwgXzUwLCBfNTEsIF81MiwgXzUzLCBfNTQsIF81NSwgXzU2LCBfNTcsIF81OCwgXzU5LCBfNjAsIF82MSwgXzYyLCBfNjMsIF82NCwgLi4uKSBfNjQKKworLy8vIFxlbmRpZgorCisvKioKKyAqIFJldHVybnMgdGhlIG51bWJlciBvZiBhcmd1bWVudHMuCisgKi8KKy8vIFdlIGRvIHRoaXMgYnkgcHJlcGVuZGluZyAxIGFuZCBhcHBlbmRpbmcgNjUgZGVzaWduZWQgdmFsdWVzIHN1Y2ggdGhhdCB0aGUgNjV0aCBlbGVtZW50CisvLyB3aWxsIGJlIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzLgorI2RlZmluZSBfQzJfQVJHQyguLi4pIF9DMl9BUkdDXzEoMCwgIyNfX1ZBX0FSR1NfXywgXAorICAgICAgICA2NCwgNjMsIDYyLCA2MSwgNjAsIDU5LCA1OCwgNTcsIDU2LCA1NSwgNTQsIDUzLCA1MiwgNTEsIDUwLCA0OSwgNDgsIDQ3LCA0NiwgNDUsIDQ0LCA0MywgXAorICAgICAgICA0MiwgNDEsIDQwLCAzOSwgMzgsIDM3LCAzNiwgMzUsIDM0LCAzMywgMzIsIDMxLCAzMCwgMjksIDI4LCAyNywgMjYsIDI1LCAyNCwgMjMsIDIyLCAyMSwgXAorICAgICAgICAyMCwgMTksIDE4LCAxNywgMTYsIDE1LCAxNCwgMTMsIDEyLCAxMSwgMTAsIDksIDgsIDcsIDYsIDUsIDQsIDMsIDIsIDEsIDApCisKKy8vLyBcaWYgMAorCisvLyBzdGVwIDEuIHJlbW92ZSBlbXB0eSBhcmd1bWVudHMgLSB0aGlzIGlzIG5lZWRlZCB0byBhbGxvdyB0cmFpbGluZyBjb21tYSBpbiBlbnVtIGRlZmluaXRpb25zCisvLyAoTk9URTogd2UgZG9uJ3Qga25vdyB3aGljaCBhcmd1bWVudCB3aWxsIGhhdmUgdGhpcyB0cmFpbGluZyBjb21tYSBzbyB3ZSBoYXZlIHRvIHRyeSBhbGwpCisjZGVmaW5lIF9DMl9BUkdDXzEoXywgXzAsIF8xLCBfMiwgXzMsIF80LCBfNSwgXzYsIF83LCBfOCwgXzksIF8xMCwgXzExLCBfMTIsIF8xMywgXzE0LCBfMTUsIF8xNiwgXAorICAgICAgICBfMTcsIF8xOCwgXzE5LCBfMjAsIF8yMSwgXzIyLCBfMjMsIF8yNCwgXzI1LCBfMjYsIF8yNywgXzI4LCBfMjksIF8zMCwgXzMxLCBfMzIsIFwKKyAgICAgICAgXzMzLCBfMzQsIF8zNSwgXzM2LCBfMzcsIF8zOCwgXzM5LCBfNDAsIF80MSwgXzQyLCBfNDMsIF80NCwgXzQ1LCBfNDYsIF80NywgXzQ4LCBcCisgICAgICAgIF80OSwgXzUwLCBfNTEsIF81MiwgXzUzLCBfNTQsIF81NSwgXzU2LCBfNTcsIF81OCwgXzU5LCBfNjAsIF82MSwgXzYyLCBfNjMsIF82NCwgLi4uKSBcCisgICAgX0MyX0FSR0NfMihfIF9DMl9BUkcoXzApIFwKKyAgICBfQzJfQVJHMTYoXzEsIF8yLCBfMywgXzQsIF81LCBfNiwgXzcsIF84LCBfOSwgXzEwLCBfMTEsIF8xMiwgXzEzLCBfMTQsIF8xNSwgXzE2KSBcCisgICAgX0MyX0FSRzE2KF8xNywgXzE4LCBfMTksIF8yMCwgXzIxLCBfMjIsIF8yMywgXzI0LCBfMjUsIF8yNiwgXzI3LCBfMjgsIF8yOSwgXzMwLCBfMzEsIF8zMikgXAorICAgIF9DMl9BUkcxNihfMzMsIF8zNCwgXzM1LCBfMzYsIF8zNywgXzM4LCBfMzksIF80MCwgXzQxLCBfNDIsIF80MywgXzQ0LCBfNDUsIF80NiwgXzQ3LCBfNDgpIFwKKyAgICBfQzJfQVJHMTYoXzQ5LCBfNTAsIF81MSwgXzUyLCBfNTMsIF81NCwgXzU1LCBfNTYsIF81NywgXzU4LCBfNTksIF82MCwgXzYxLCBfNjIsIF82MywgXzY0KSwgXAorICAgICMjX19WQV9BUkdTX18pCisKKy8vIHN0ZXAgMi4gdGhpcyBpcyBuZWVkZWQgYXMgcmVtb3ZlZCBhcmd1bWVudHMgY2Fubm90IGJlIHBhc3NlZCBkaXJlY3RseSBhcyBlbXB0eSBpbnRvIGEgbWFjcm8KKyNkZWZpbmUgX0MyX0FSR0NfMiguLi4pIF9DMl9BUkdDXzMoX19WQV9BUkdTX18pCisKKy8vLyBcZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVkFSSUFCTEUgQVJHVU1FTlQgQ09OVkVSU0lPTiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvLy8gXGlmIDAKKworLy8gbWFjcm9zIHRoYXQgY29udmVydCBfMSwgXzIsIF8zLCAuLi4gdG8gZm4oXzEsIGFyZyksIGZuKF8yLCBhcmcpLCBmbihfMywgYXJnKSwgLi4uCisjZGVmaW5lIF9DMl9NQVBfNjQoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzYzKGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfNjMoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzYyKGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfNjIoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzYxKGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfNjEoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzYwKGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfNjAoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzU5KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfNTkoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzU4KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfNTgoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzU3KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfNTcoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzU2KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfNTYoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzU1KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfNTUoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzU0KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfNTQoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzUzKGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfNTMoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzUyKGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfNTIoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzUxKGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfNTEoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzUwKGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfNTAoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzQ5KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfNDkoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzQ4KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfNDgoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzQ3KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfNDcoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzQ2KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfNDYoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzQ1KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfNDUoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzQ0KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfNDQoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzQzKGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfNDMoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzQyKGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfNDIoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzQxKGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfNDEoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzQwKGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfNDAoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzM5KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfMzkoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzM4KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfMzgoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzM3KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfMzcoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzM2KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfMzYoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzM1KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfMzUoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzM0KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfMzQoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzMzKGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfMzMoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzMyKGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfMzIoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzMxKGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfMzEoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzMwKGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfMzAoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzI5KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfMjkoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzI4KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfMjgoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzI3KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfMjcoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzI2KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfMjYoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzI1KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfMjUoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzI0KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfMjQoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzIzKGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfMjMoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzIyKGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfMjIoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzIxKGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfMjEoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzIwKGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfMjAoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzE5KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfMTkoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzE4KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfMTgoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzE3KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfMTcoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzE2KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfMTYoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzE1KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfMTUoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzE0KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfMTQoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzEzKGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfMTMoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzEyKGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfMTIoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzExKGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfMTEoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzEwKGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfMTAoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzkoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF85KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF84KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfOChmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfNyhmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzcoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzYoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF82KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF81KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfNShmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfNChmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzQoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzMoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF8zKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8yKGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfMihmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfMShmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzEoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpCisKKy8vLyBcZW5kaWYKKworLyoqCisgKiBNYXBzIGVhY2ggYXJndW1lbnQgdXNpbmcgYW5vdGhlciBtYWNybyB4IC0+IGZuKHgsIGFyZykKKyAqLworLy8gdXNlIHdyYXBwZXIgdG8gY2FsbCB0aGUgcHJvcGVyIG1hcHBlciBiYXNlZCBvbiB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cworI2RlZmluZSBfQzJfTUFQKGZuLCBhcmcsIC4uLikgX0MyX01BUF9fKF9DMl9BUkdDKF9fVkFfQVJHU19fKSwgZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKworLy8vIFxpZiAwCisKKy8vIGV2YWx1YXRlIF9uIHNvIGl0IGJlY29tZXMgYSBudW1iZXIKKyNkZWZpbmUgX0MyX01BUF9fKF9uLCBmbiwgYXJnLCAuLi4pIF9DMl9NQVBfKF9uLCBmbiwgYXJnLCBfX1ZBX0FSR1NfXykKKy8vIGNhbGwgdGhlIHByb3BlciBtYXBwZXIKKyNkZWZpbmUgX0MyX01BUF8oX24sIGZuLCBhcmcsIC4uLikgX0MyX01BUF8jI19uIChmbiwgYXJnLCBfX1ZBX0FSR1NfXykKKworLy8vIFxlbmRpZgorCisjZW5kaWYgIC8vIEMyVVRJTFNfTUFDUk9fVVRJTFNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9pbmNsdWRlL2FuZHJvaWQtQzJCdWZmZXIuaCBiL21lZGlhL2NvZGVjMi9pbmNsdWRlL2FuZHJvaWQtQzJCdWZmZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmJlYWI3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2luY2x1ZGUvYW5kcm9pZC1DMkJ1ZmZlci5oCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQzJCVUZGRVJfSF8KKyNkZWZpbmUgQU5EUk9JRF9DMkJVRkZFUl9IXworCisjaW5jbHVkZSA8Y3V0aWxzL25hdGl2ZV9oYW5kbGUuaD4KKyNpbmNsdWRlIDxoYXJkd2FyZS9ncmFsbG9jLmg+CisKKy8qIFVzZSBhbmRyb2lkIG5hdGl2ZSBoYW5kbGUgZm9yIEMySGFuZGxlICovCit0eXBlZGVmIDo6bmF0aXZlX2hhbmRsZV90IEMySGFuZGxlOworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qKgorICogQW5kcm9pZCBwbGF0Zm9ybSBidWZmZXIvbWVtb3J5IHVzYWdlIGJpdHMuCisgKi8KK3N0cnVjdCBDMkFuZHJvaWRNZW1vcnlVc2FnZSA6IHB1YmxpYyBDMk1lbW9yeVVzYWdlIHsKKyAgICBpbmxpbmUgQzJBbmRyb2lkTWVtb3J5VXNhZ2UoY29uc3QgQzJNZW1vcnlVc2FnZSAmdXNhZ2UpIDogQzJNZW1vcnlVc2FnZSh1c2FnZSkgeyB9CisKKy8vIHB1YmxpYzoKKyAgICAvKioKKyAgICAgKiBSZXVzZSBncmFsbG9jIGZsYWdzIHdoZXJlIHBvc3NpYmxlLCBhcyBDb2RlYyAyLjAgQVBJIG9ubHkgdXNlcyBiaXRzIDAgYW5kIDEuCisgICAgICovCisgICAgZW51bSBjb25zdW1lcl90IDogdWludDY0X3QgeworICAgICAgICBSRU5ERVJTQ1JJUFRfUkVBRCA9IEdSQUxMT0NfVVNBR0VfUkVOREVSU0NSSVBULAorICAgICAgICBIV19URVhUVVJFX1JFQUQgICA9IEdSQUxMT0NfVVNBR0VfSFdfVEVYVFVSRSwKKyAgICAgICAgSFdfQ09NUE9TRVJfUkVBRCAgPSBHUkFMTE9DX1VTQUdFX0hXX0NPTVBPU0VSLAorICAgICAgICAvLyBncmFsbG9jIGRvZXMgbm90IGRlZmluZSBhIHZpZGVvIGRlY29kZXIgcmVhZCB1c2FnZSBmbGFnLCBzbyB1c2UgZW5jb2RlciBmb3IKKyAgICAgICAgLy8gbm93CisgICAgICAgIEhXX0NPREVDX1JFQUQgICAgID0gR1JBTExPQ19VU0FHRV9IV19WSURFT19FTkNPREVSLAorICAgICAgICBSRUFEX1BST1RFQ1RFRCAgICA9IEdSQUxMT0NfVVNBR0VfUFJPVEVDVEVELAorICAgIH07CisKKyAgICBlbnVtIHByb2R1Y2VyX3QgOiB1aW50NjRfdCB7CisgICAgICAgIFJFTkRFUlNDUklQVF9XUklURSA9IEdSQUxMT0NfVVNBR0VfUkVOREVSU0NSSVBULAorICAgICAgICBIV19URVhUVVJFX1dSSVRFICAgPSBHUkFMTE9DX1VTQUdFX0hXX1JFTkRFUiwKKyAgICAgICAgSFdfQ09NUE9TRVJfV1JJVEUgID0gR1JBTExPQ19VU0FHRV9IV19DT01QT1NFUiB8IEdSQUxMT0NfVVNBR0VfSFdfUkVOREVSLAorICAgICAgICBIV19DT0RFQ19XUklURSAgICAgPSBHUkFMTE9DX1VTQUdFX0hXX1ZJREVPX0VOQ09ERVIsCisgICAgICAgIC8vIGdyYWxsb2MgZG9lcyBub3QgZGVmaW5lIGEgd3JpdGUgcHJvdGVjdGVkIHVzYWdlIGZsYWcsIHNvIHVzZSByZWFkIHByb3RlY3RlZAorICAgICAgICAvLyBub3cKKyAgICAgICAgV1JJVEVfUFJPVEVDVEVEICAgID0gR1JBTExPQ19VU0FHRV9QUk9URUNURUQsCisgICAgfTsKKworICAgIC8qKgorICAgICAqIENvbnZlcnQgZnJvbSBncmFsbG9jIHVzYWdlLgorICAgICAqLworICAgIHN0YXRpYyBDMk1lbW9yeVVzYWdlIEZyb21HcmFsbG9jVXNhZ2UodWludDY0X3QgdXNhZ2UpOworCisgICAgLyoqCisgICAgICogQ29udmVydCB0byBncmFsbG9jIHVzYWdlLgorICAgICAqLworICAgIHVpbnQ2NF90IGFzR3JhbGxvY1VzYWdlKCkgY29uc3Q7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfQzJCVUZGRVJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2NvZGVjMi8xLjAvSW5wdXRTdXJmYWNlLmggYi9tZWRpYS9jb2RlYzIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9jb2RlYzIvMS4wL0lucHV0U3VyZmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwMTFhMDYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9jb2RlYzIvMS4wL0lucHV0U3VyZmFjZS5oCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQzJfVjFfMF9JTlBVVF9TVVJGQUNFX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9DMl9WMV8wX0lOUFVUX1NVUkZBQ0VfSAorCisjaW5jbHVkZSA8bWVtb3J5PgorCisjaW5jbHVkZSA8QzJDb21wb25lbnQuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9icWhlbHBlci9XR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvY29kZWMyLzEuMC9JbnB1dFN1cmZhY2VDb25uZWN0aW9uLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgR3JhcGhpY0J1ZmZlclNvdXJjZTsKKworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYzIgeworbmFtZXNwYWNlIFYxXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKwordXNpbmcgOjphbmRyb2lkOjpzcDsKKwordHlwZWRlZiA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6YnVmZmVycXVldWU6OlYxXzA6OklHcmFwaGljQnVmZmVyUHJvZHVjZXIKKyAgICAgICAgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKK3R5cGVkZWYgOjphbmRyb2lkOjpJR3JhcGhpY0J1ZmZlclByb2R1Y2VyIEJHcmFwaGljQnVmZmVyUHJvZHVjZXI7CisKKy8vIFRPRE86IDo6YW5kcm9pZDo6VFdHcmFwaGljQnVmZmVyUHJvZHVjZXI8SUlucHV0U3VyZmFjZT4KK3R5cGVkZWYgOjphbmRyb2lkOjpUV0dyYXBoaWNCdWZmZXJQcm9kdWNlcjxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBJbnB1dFN1cmZhY2VCYXNlOworCitjbGFzcyBJbnB1dFN1cmZhY2UgOiBwdWJsaWMgSW5wdXRTdXJmYWNlQmFzZSB7CitwdWJsaWM6CisgICAgdmlydHVhbCB+SW5wdXRTdXJmYWNlKCkgPSBkZWZhdWx0OworCisgICAgLy8gTWV0aG9kcyBmcm9tIElJbnB1dFN1cmZhY2UKKyAgICBzcDxJbnB1dFN1cmZhY2VDb25uZWN0aW9uPiBjb25uZWN0VG9Db21wb25lbnQoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8OjpDMkNvbXBvbmVudD4gJmNvbXApOworICAgIC8vIFRPRE86IGludGYoKQorCisgICAgc3RhdGljIHNwPElucHV0U3VyZmFjZT4gQ3JlYXRlKCk7CisKK3ByaXZhdGU6CisgICAgSW5wdXRTdXJmYWNlKAorICAgICAgICAgICAgY29uc3Qgc3A8QkdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gJmJhc2UsCisgICAgICAgICAgICBjb25zdCBzcDw6OmFuZHJvaWQ6OkdyYXBoaWNCdWZmZXJTb3VyY2U+ICZzb3VyY2UpOworCisgICAgc3A8OjphbmRyb2lkOjpHcmFwaGljQnVmZmVyU291cmNlPiBtU291cmNlOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uCit9ICAvLyBuYW1lc3BhY2UgVjFfMAorfSAgLy8gbmFtZXNwYWNlIGMyCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0hBUkRXQVJFX01FRElBX0MyX1YxXzBfSU5QVVRfU1VSRkFDRV9ICmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9jb2RlYzIvMS4wL0lucHV0U3VyZmFjZUNvbm5lY3Rpb24uaCBiL21lZGlhL2NvZGVjMi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2NvZGVjMi8xLjAvSW5wdXRTdXJmYWNlQ29ubmVjdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyNGE0MTYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9jb2RlYzIvMS4wL0lucHV0U3VyZmFjZUNvbm5lY3Rpb24uaApAQCAtMCwwICsxLDY3IEBACisvKgorICogQ29weXJpZ2h0IDIwMTgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX01FRElBX0MyX1YxXzBfSU5QVVRfU1VSRkFDRV9DT05ORUNUSU9OX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9DMl9WMV8wX0lOUFVUX1NVUkZBQ0VfQ09OTkVDVElPTl9ICisKKyNpbmNsdWRlIDxtZW1vcnk+CisKKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2JxaGVscGVyL0dyYXBoaWNCdWZmZXJTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9icWhlbHBlci9XR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvY29kZWMyLzEuMC9JbnB1dFN1cmZhY2VDb25uZWN0aW9uLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGMyIHsKK25hbWVzcGFjZSBWMV8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKKy8vIFRPRE86IGluaGVyaXQgZnJvbSBJSW5wdXRTdXJmYWNlQ29ubmVjdGlvbgorY2xhc3MgSW5wdXRTdXJmYWNlQ29ubmVjdGlvbiA6IHB1YmxpYyBSZWZCYXNlIHsKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIH5JbnB1dFN1cmZhY2VDb25uZWN0aW9uKCk7CisKKyAgICAvLyBGcm9tIElJbnB1dFN1cmZhY2VDb25uZWN0aW9uCisgICAgdm9pZCBkaXNjb25uZWN0KCk7CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIElucHV0U3VyZmFjZTsKKworICAgIC8vIEZvciBJbnB1dFN1cmZhY2UKKyAgICBJbnB1dFN1cmZhY2VDb25uZWN0aW9uKAorICAgICAgICAgICAgY29uc3Qgc3A8R3JhcGhpY0J1ZmZlclNvdXJjZT4gJnNvdXJjZSwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiAmY29tcCk7CisgICAgYm9vbCBpbml0KCk7CisKKyAgICBJbnB1dFN1cmZhY2VDb25uZWN0aW9uKCkgPSBkZWxldGU7CisKKyAgICBjbGFzcyBJbXBsOworCisgICAgc3A8R3JhcGhpY0J1ZmZlclNvdXJjZT4gbVNvdXJjZTsKKyAgICBzcDxJbXBsPiBtSW1wbDsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKElucHV0U3VyZmFjZUNvbm5lY3Rpb24pOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uCit9ICAvLyBuYW1lc3BhY2UgVjFfMAorfSAgLy8gbmFtZXNwYWNlIGMyCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0hBUkRXQVJFX01FRElBX0MyX1YxXzBfSU5QVVRfU1VSRkFDRV9DT05ORUNUSU9OX0gKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjU1Nzg3MjYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQW5kcm9pZC5icApAQCAtMCwwICsxLDYxIEBACitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYnNmcGx1Z2luX2Njb2RlYyIsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJDMk9NWE5vZGUuY3BwIiwKKyAgICAgICAgIkNDb2RlYy5jcHAiLAorICAgICAgICAiQ0NvZGVjQnVmZmVyQ2hhbm5lbC5jcHAiLAorICAgICAgICAiQ0NvZGVjQ29uZmlnLmNwcCIsCisgICAgICAgICJDb2RlYzJCdWZmZXIuY3BwIiwKKyAgICAgICAgIkNvZGVjMkluZm9CdWlsZGVyLmNwcCIsCisgICAgICAgICJSZWZsZWN0ZWRQYXJhbVVwZGF0ZXIuY3BwIiwKKyAgICAgICAgIlNraXBDdXRCdWZmZXIuY3BwIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICBdLAorCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9pbnRlcm5hbCIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhcy5uYXRpdmVAMS4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZ3JhcGhpY3MuYnVmZmVycXVldWVAMS4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYzJAMS4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEub214QDEuMCIsCisgICAgICAgICJsaWJiYXNlIiwKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJjb2RlYzIiLAorICAgICAgICAibGliY29kZWMyX2NsaWVudCIsCisgICAgICAgICJsaWJjb2RlYzJfdm5kayIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGliZ3VpIiwKKyAgICAgICAgImxpYmhpZGxhbGxvY2F0b3J1dGlscyIsCisgICAgICAgICJsaWJoaWRsYmFzZSIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlibWVkaWEiLAorICAgICAgICAibGlibWVkaWFfb214IiwKKyAgICAgICAgImxpYnNmcGx1Z2luX2Njb2RlY191dGlscyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9idWZmZXJxdWV1ZV9oZWxwZXIiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfY29kZWNiYXNlIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfb214X3V0aWxzIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X3htbHBhcnNlciIsCisgICAgICAgICJsaWJ1aSIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKKworICAgIHNhbml0aXplOiB7CisgICAgICAgIGNmaTogdHJ1ZSwKKyAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKKyAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgIF0sCisgICAgICAgIGRpYWc6IHsKKyAgICAgICAgICAgIGNmaTogdHJ1ZSwKKyAgICAgICAgfSwKKyAgICB9LAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0MyT01YTm9kZS5jcHAgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQzJPTVhOb2RlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDlmZDdhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0MyT01YTm9kZS5jcHAKQEAgLTAsMCArMSwzMjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZkZWYgX19MUDY0X18KKyNkZWZpbmUgT01YX0FORFJPSURfQ09NUElMRV9BU18zMkJJVF9PTl82NEJJVF9QTEFURk9STVMKKyNlbmRpZgorCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyT01YTm9kZSIKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlIDxDMkFsbG9jYXRvckdyYWxsb2MuaD4KKyNpbmNsdWRlIDxDMkJsb2NrSW50ZXJuYWwuaD4KKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisKKyNpbmNsdWRlIDxPTVhfQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8T01YX0luZGV4Lmg+CisjaW5jbHVkZSA8T01YX0luZGV4RXh0Lmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPHVpL0ZlbmNlLmg+CisjaW5jbHVkZSA8dWkvR3JhcGhpY0J1ZmZlci5oPgorCisjaW5jbHVkZSAiQzJPTVhOb2RlLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworbmFtZXNwYWNlIHsKKworY2xhc3MgQnVmZmVyMkQgOiBwdWJsaWMgQzJCdWZmZXIgeworcHVibGljOgorICAgIGV4cGxpY2l0IEJ1ZmZlcjJEKEMyQ29uc3RHcmFwaGljQmxvY2sgYmxvY2spIDogQzJCdWZmZXIoeyBibG9jayB9KSB7fQorfTsKKworfSAgLy8gbmFtZXNwYWNlCisKK0MyT01YTm9kZTo6QzJPTVhOb2RlKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gJmNvbXApCisgICAgOiBtQ29tcChjb21wKSwgbUZyYW1lSW5kZXgoMCksIG1XaWR0aCgwKSwgbUhlaWdodCgwKSwKKyAgICAgIG1BZGp1c3RUaW1lc3RhbXBHYXBVcygwKSwgbUZpcnN0SW5wdXRGcmFtZSh0cnVlKSB7CisgICAgLy8gVE9ETzogcmVhZCBmcm9tIGludGYoKQorICAgIGlmICghc3RybmNtcChjb21wLT5nZXROYW1lKCkuY19zdHIoKSwgImMyLmFuZHJvaWQuIiwgMTEpKSB7CisgICAgICAgIG1Vc2FnZSA9IEdSQUxMT0NfVVNBR0VfU1dfUkVBRF9PRlRFTjsKKyAgICB9IGVsc2UgeworICAgICAgICBtVXNhZ2UgPSBHUkFMTE9DX1VTQUdFX0hXX1ZJREVPX0VOQ09ERVI7CisgICAgfQorfQorCitzdGF0dXNfdCBDMk9NWE5vZGU6OmZyZWVOb2RlKCkgeworICAgIG1Db21wLnJlc2V0KCk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDMk9NWE5vZGU6OnNlbmRDb21tYW5kKE9NWF9DT01NQU5EVFlQRSBjbWQsIE9NWF9TMzIgcGFyYW0pIHsKKyAgICBpZiAoY21kID09IE9NWF9Db21tYW5kU3RhdGVTZXQgJiYgcGFyYW0gPT0gT01YX1N0YXRlTG9hZGVkKSB7CisgICAgICAgIC8vIFJlc2V0IGZpcnN0IGlucHV0IGZyYW1lIHNvIGlmIEMyT01YTm9kZSBpcyByZWN5Y2xlZCwgdGhlIHRpbWVzdGFtcCBkb2VzIG5vdCBiZWNvbWUKKyAgICAgICAgLy8gbmVnYXRpdmUuIFRoaXMgaXMgYSB3b3JrYXJvdW5kIGZvciBIVyBjb2RlY3MgdGhhdCBkbyBub3QgaGFuZGxlIHRpbWVzdGFtcCByb2xsb3Zlci4KKyAgICAgICAgbUZpcnN0SW5wdXRGcmFtZSA9IHRydWU7CisgICAgfQorICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKK30KKworc3RhdHVzX3QgQzJPTVhOb2RlOjpnZXRQYXJhbWV0ZXIoT01YX0lOREVYVFlQRSBpbmRleCwgdm9pZCAqcGFyYW1zLCBzaXplX3Qgc2l6ZSkgeworICAgIHN0YXR1c190IGVyciA9IEVSUk9SX1VOU1VQUE9SVEVEOworICAgIHN3aXRjaCAoKHVpbnQzMl90KWluZGV4KSB7CisgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1Db25zdW1lclVzYWdlQml0czogeworICAgICAgICAgICAgT01YX1UzMiAqdXNhZ2UgPSAoT01YX1UzMiAqKXBhcmFtczsKKyAgICAgICAgICAgICp1c2FnZSA9IG1Vc2FnZTsKKyAgICAgICAgICAgIGVyciA9IE9LOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVBvcnREZWZpbml0aW9uOiB7CisgICAgICAgICAgICBpZiAoc2l6ZSA8IHNpemVvZihPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFICpwRGVmID0gKE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUgKilwYXJhbXM7CisgICAgICAgICAgICAvLyBUT0RPOiByZWFkIHRoZXNlIGZyb20gaW50ZigpCisgICAgICAgICAgICBwRGVmLT5uQnVmZmVyQ291bnRBY3R1YWwgPSAxNjsKKyAgICAgICAgICAgIHBEZWYtPmVEb21haW4gPSBPTVhfUG9ydERvbWFpblZpZGVvOworICAgICAgICAgICAgcERlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoID0gbVdpZHRoOworICAgICAgICAgICAgcERlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodCA9IG1IZWlnaHQ7CisgICAgICAgICAgICBlcnIgPSBPSzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdHVzX3QgQzJPTVhOb2RlOjpzZXRQYXJhbWV0ZXIoT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3Qgdm9pZCAqcGFyYW1zLCBzaXplX3Qgc2l6ZSkgeworICAgIC8vIGhhbmRsZSBtYXgvZml4ZWQgZnJhbWUgZHVyYXRpb24gY29udHJvbAorICAgIGlmIChpbmRleCA9PSAoT01YX0lOREVYVFlQRSlPTVhfSW5kZXhQYXJhbU1heEZyYW1lRHVyYXRpb25Gb3JCaXRyYXRlQ29udHJvbAorICAgICAgICAgICAgJiYgcGFyYW1zICE9IE5VTEwKKyAgICAgICAgICAgICYmIHNpemUgPT0gc2l6ZW9mKE9NWF9QQVJBTV9VMzJUWVBFKSkgeworICAgICAgICAvLyBUaGUgaW5jb21pbmcgbnVtYmVyIGlzIGFuIGludDMyX3QgY29udGFpbmVkIGluIE9NWF9VMzIuCisgICAgICAgIG1BZGp1c3RUaW1lc3RhbXBHYXBVcyA9IChpbnQzMl90KSgoT01YX1BBUkFNX1UzMlRZUEUqKXBhcmFtcyktPm5VMzI7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworfQorCitzdGF0dXNfdCBDMk9NWE5vZGU6OmdldENvbmZpZyhPTVhfSU5ERVhUWVBFIGluZGV4LCB2b2lkICpjb25maWcsIHNpemVfdCBzaXplKSB7CisgICAgKHZvaWQpaW5kZXg7CisgICAgKHZvaWQpY29uZmlnOworICAgICh2b2lkKXNpemU7CisgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworfQorCitzdGF0dXNfdCBDMk9NWE5vZGU6OnNldENvbmZpZyhPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCB2b2lkICpjb25maWcsIHNpemVfdCBzaXplKSB7CisgICAgKHZvaWQpaW5kZXg7CisgICAgKHZvaWQpY29uZmlnOworICAgICh2b2lkKXNpemU7CisgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworfQorCitzdGF0dXNfdCBDMk9NWE5vZGU6OnNldFBvcnRNb2RlKE9NWF9VMzIgcG9ydEluZGV4LCBJT01YOjpQb3J0TW9kZSBtb2RlKSB7CisgICAgKHZvaWQpcG9ydEluZGV4OworICAgICh2b2lkKW1vZGU7CisgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworfQorCitzdGF0dXNfdCBDMk9NWE5vZGU6OnByZXBhcmVGb3JBZGFwdGl2ZVBsYXliYWNrKAorICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwgT01YX0JPT0wgZW5hYmxlLAorICAgICAgICBPTVhfVTMyIG1heEZyYW1lV2lkdGgsIE9NWF9VMzIgbWF4RnJhbWVIZWlnaHQpIHsKKyAgICAodm9pZClwb3J0SW5kZXg7CisgICAgKHZvaWQpZW5hYmxlOworICAgICh2b2lkKW1heEZyYW1lV2lkdGg7CisgICAgKHZvaWQpbWF4RnJhbWVIZWlnaHQ7CisgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworfQorCitzdGF0dXNfdCBDMk9NWE5vZGU6OmNvbmZpZ3VyZVZpZGVvVHVubmVsTW9kZSgKKyAgICAgICAgT01YX1UzMiBwb3J0SW5kZXgsIE9NWF9CT09MIHR1bm5lbGVkLAorICAgICAgICBPTVhfVTMyIGF1ZGlvSHdTeW5jLCBuYXRpdmVfaGFuZGxlX3QgKipzaWRlYmFuZEhhbmRsZSkgeworICAgICh2b2lkKXBvcnRJbmRleDsKKyAgICAodm9pZCl0dW5uZWxlZDsKKyAgICAodm9pZClhdWRpb0h3U3luYzsKKyAgICAqc2lkZWJhbmRIYW5kbGUgPSBudWxscHRyOworICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKK30KKworc3RhdHVzX3QgQzJPTVhOb2RlOjpnZXRHcmFwaGljQnVmZmVyVXNhZ2UoT01YX1UzMiBwb3J0SW5kZXgsIE9NWF9VMzIqIHVzYWdlKSB7CisgICAgKHZvaWQpcG9ydEluZGV4OworICAgICp1c2FnZSA9IDA7CisgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworfQorCitzdGF0dXNfdCBDMk9NWE5vZGU6OnNldElucHV0U3VyZmFjZShjb25zdCBzcDxJT01YQnVmZmVyU291cmNlPiAmYnVmZmVyU291cmNlKSB7CisgICAgYzJfc3RhdHVzX3QgZXJyID0gR2V0Q29kZWMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZSgpLT5mZXRjaEFsbG9jYXRvcigKKyAgICAgICAgICAgIEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTo6R1JBTExPQywKKyAgICAgICAgICAgICZtQWxsb2NhdG9yKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKyAgICBtQnVmZmVyU291cmNlID0gYnVmZmVyU291cmNlOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQzJPTVhOb2RlOjphbGxvY2F0ZVNlY3VyZUJ1ZmZlcigKKyAgICAgICAgT01YX1UzMiBwb3J0SW5kZXgsIHNpemVfdCBzaXplLCBidWZmZXJfaWQgKmJ1ZmZlciwKKyAgICAgICAgdm9pZCAqKmJ1ZmZlckRhdGEsIHNwPE5hdGl2ZUhhbmRsZT4gKm5hdGl2ZUhhbmRsZSkgeworICAgICh2b2lkKXBvcnRJbmRleDsKKyAgICAodm9pZClzaXplOworICAgICh2b2lkKW5hdGl2ZUhhbmRsZTsKKyAgICAqYnVmZmVyID0gMDsKKyAgICAqYnVmZmVyRGF0YSA9IG51bGxwdHI7CisgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworfQorCitzdGF0dXNfdCBDMk9NWE5vZGU6OnVzZUJ1ZmZlcigKKyAgICAgICAgT01YX1UzMiBwb3J0SW5kZXgsIGNvbnN0IE9NWEJ1ZmZlciAmb214QnVmLCBidWZmZXJfaWQgKmJ1ZmZlcikgeworICAgICh2b2lkKXBvcnRJbmRleDsKKyAgICAodm9pZClvbXhCdWY7CisgICAgKmJ1ZmZlciA9IDA7CisgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworfQorCitzdGF0dXNfdCBDMk9NWE5vZGU6OmZyZWVCdWZmZXIoT01YX1UzMiBwb3J0SW5kZXgsIGJ1ZmZlcl9pZCBidWZmZXIpIHsKKyAgICAodm9pZClwb3J0SW5kZXg7CisgICAgKHZvaWQpYnVmZmVyOworICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKK30KKworc3RhdHVzX3QgQzJPTVhOb2RlOjpmaWxsQnVmZmVyKAorICAgICAgICBidWZmZXJfaWQgYnVmZmVyLCBjb25zdCBPTVhCdWZmZXIgJm9teEJ1ZiwgaW50IGZlbmNlRmQpIHsKKyAgICAodm9pZClidWZmZXI7CisgICAgKHZvaWQpb214QnVmOworICAgICh2b2lkKWZlbmNlRmQ7CisgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworfQorCitzdGF0dXNfdCBDMk9NWE5vZGU6OmVtcHR5QnVmZmVyKAorICAgICAgICBidWZmZXJfaWQgYnVmZmVyLCBjb25zdCBPTVhCdWZmZXIgJm9teEJ1ZiwKKyAgICAgICAgT01YX1UzMiBmbGFncywgT01YX1RJQ0tTIHRpbWVzdGFtcCwgaW50IGZlbmNlRmQpIHsKKyAgICAvLyBUT0RPOiBiZXR0ZXIgZmVuY2UgaGFuZGxpbmcKKyAgICBpZiAoZmVuY2VGZCA+PSAwKSB7CisgICAgICAgIHNwPEZlbmNlPiBmZW5jZSA9IG5ldyBGZW5jZShmZW5jZUZkKTsKKyAgICAgICAgZmVuY2UtPndhaXRGb3JldmVyKExPR19UQUcpOworICAgIH0KKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+IGNvbXAgPSBtQ29tcC5sb2NrKCk7CisgICAgaWYgKCFjb21wKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgIHVpbnQzMl90IGMyRmxhZ3MgPSAoZmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpCisgICAgICAgICAgICA/IEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0gOiAwOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gYmxvY2s7CisKKyAgICBDMkhhbmRsZSAqaGFuZGxlID0gbnVsbHB0cjsKKyAgICBpZiAob214QnVmLm1CdWZmZXJUeXBlID09IE9NWEJ1ZmZlcjo6a0J1ZmZlclR5cGVBTldCdWZmZXIKKyAgICAgICAgICAgICYmIG9teEJ1Zi5tR3JhcGhpY0J1ZmZlciAhPSBudWxscHRyKSB7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNBbGxvY2F0aW9uPiBhbGxvYzsKKyAgICAgICAgaGFuZGxlID0gV3JhcE5hdGl2ZUNvZGVjMkdyYWxsb2NIYW5kbGUoCisgICAgICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV9jbG9uZShvbXhCdWYubUdyYXBoaWNCdWZmZXItPmhhbmRsZSksCisgICAgICAgICAgICAgICAgb214QnVmLm1HcmFwaGljQnVmZmVyLT53aWR0aCwKKyAgICAgICAgICAgICAgICBvbXhCdWYubUdyYXBoaWNCdWZmZXItPmhlaWdodCwKKyAgICAgICAgICAgICAgICBvbXhCdWYubUdyYXBoaWNCdWZmZXItPmZvcm1hdCwKKyAgICAgICAgICAgICAgICBvbXhCdWYubUdyYXBoaWNCdWZmZXItPnVzYWdlLAorICAgICAgICAgICAgICAgIG9teEJ1Zi5tR3JhcGhpY0J1ZmZlci0+c3RyaWRlKTsKKyAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gbUFsbG9jYXRvci0+cHJpb3JHcmFwaGljQWxsb2NhdGlvbihoYW5kbGUsICZhbGxvYyk7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgICAgIGJsb2NrID0gX0MyQmxvY2tGYWN0b3J5OjpDcmVhdGVHcmFwaGljQmxvY2soYWxsb2MpOworICAgIH0gZWxzZSBpZiAoIShmbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB3b3JrKG5ldyBDMldvcmspOworICAgIHdvcmstPmlucHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KWMyRmxhZ3M7CisgICAgd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAgPSB0aW1lc3RhbXA7CisKKyAgICAvLyBXT1JLQVJPVU5EOiBhZGp1c3QgdGltZXN0YW1wIGJhc2VkIG9uIGdhcFVzCisgICAgeworICAgICAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLmN1c3RvbU9yZGluYWwgPSB0aW1lc3RhbXA7IC8vIHNhdmUgaW5wdXQgdGltZXN0YW1wCisgICAgICAgIGlmIChtRmlyc3RJbnB1dEZyYW1lKSB7CisgICAgICAgICAgICAvLyBncmFiIHRpbWVzdGFtcHMgb24gZmlyc3QgZnJhbWUKKyAgICAgICAgICAgIG1QcmV2SW5wdXRUaW1lc3RhbXAgPSB0aW1lc3RhbXA7CisgICAgICAgICAgICBtUHJldkNvZGVjVGltZXN0YW1wID0gdGltZXN0YW1wOworICAgICAgICAgICAgbUZpcnN0SW5wdXRGcmFtZSA9IGZhbHNlOworICAgICAgICB9IGVsc2UgaWYgKG1BZGp1c3RUaW1lc3RhbXBHYXBVcyA+IDApIHsKKyAgICAgICAgICAgIHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wID0KKyAgICAgICAgICAgICAgICBtUHJldkNvZGVjVGltZXN0YW1wCisgICAgICAgICAgICAgICAgICAgICAgICArIGMyX21pbigodGltZXN0YW1wIC0gbVByZXZJbnB1dFRpbWVzdGFtcCkucGVlaygpLCBtQWRqdXN0VGltZXN0YW1wR2FwVXMpOworICAgICAgICB9IGVsc2UgaWYgKG1BZGp1c3RUaW1lc3RhbXBHYXBVcyA8IDApIHsKKyAgICAgICAgICAgIHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wID0gbVByZXZDb2RlY1RpbWVzdGFtcCAtIG1BZGp1c3RUaW1lc3RhbXBHYXBVczsKKyAgICAgICAgfQorICAgICAgICBtUHJldklucHV0VGltZXN0YW1wID0gd29yay0+aW5wdXQub3JkaW5hbC5jdXN0b21PcmRpbmFsOworICAgICAgICBtUHJldkNvZGVjVGltZXN0YW1wID0gd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXA7CisgICAgICAgIEFMT0dWKCJhZGp1c3RpbmcgJWxsZCB0byAlbGxkIChnYXA9JWxsZCkiLAorICAgICAgICAgICAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLmN1c3RvbU9yZGluYWwucGVla2xsKCksCisgICAgICAgICAgICAgIHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWtsbCgpLAorICAgICAgICAgICAgICAobG9uZyBsb25nKW1BZGp1c3RUaW1lc3RhbXBHYXBVcyk7CisgICAgfQorCisgICAgd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4ID0gbUZyYW1lSW5kZXgrKzsKKyAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgaWYgKGJsb2NrKSB7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYzJCdWZmZXIoCisgICAgICAgICAgICAgICAgLy8gVE9ETzogZmVuY2UKKyAgICAgICAgICAgICAgICBuZXcgQnVmZmVyMkQoYmxvY2stPnNoYXJlKAorICAgICAgICAgICAgICAgICAgICAgICAgQzJSZWN0KGJsb2NrLT53aWR0aCgpLCBibG9jay0+aGVpZ2h0KCkpLCA6OkMyRmVuY2UoKSkpLAorICAgICAgICAgICAgICAgIFtidWZmZXIsIHNvdXJjZSA9IGdldFNvdXJjZSgpXShDMkJ1ZmZlciAqcHRyKSB7CisgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBwdHI7CisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGZlbmNlCisgICAgICAgICAgICAgICAgICAgICh2b2lkKXNvdXJjZS0+b25JbnB1dEJ1ZmZlckVtcHRpZWQoYnVmZmVyLCAtMSk7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMucHVzaF9iYWNrKGMyQnVmZmVyKTsKKyAgICB9CisgICAgd29yay0+d29ya2xldHMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5lbXBsYWNlX2JhY2sobmV3IEMyV29ya2xldCk7CisgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBpdGVtczsKKyAgICBpdGVtcy5wdXNoX2JhY2soc3RkOjptb3ZlKHdvcmspKTsKKworICAgIGMyX3N0YXR1c190IGVyciA9IGNvbXAtPnF1ZXVlKCZpdGVtcyk7CisgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEMyT01YTm9kZTo6Z2V0RXh0ZW5zaW9uSW5kZXgoCisgICAgICAgIGNvbnN0IGNoYXIgKnBhcmFtZXRlck5hbWUsIE9NWF9JTkRFWFRZUEUgKmluZGV4KSB7CisgICAgKHZvaWQpcGFyYW1ldGVyTmFtZTsKKyAgICAqaW5kZXggPSBPTVhfSW5kZXhNYXg7CisgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworfQorCitzdGF0dXNfdCBDMk9NWE5vZGU6OmRpc3BhdGNoTWVzc2FnZShjb25zdCBvbXhfbWVzc2FnZSYgbXNnKSB7CisgICAgaWYgKG1zZy50eXBlICE9IG9teF9tZXNzYWdlOjpFVkVOVCkgeworICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgfQorICAgIGlmIChtc2cudS5ldmVudF9kYXRhLmV2ZW50ICE9IE9NWF9FdmVudERhdGFTcGFjZUNoYW5nZWQpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgIH0KKyAgICBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UgPSAoYW5kcm9pZF9kYXRhc3BhY2UpbXNnLnUuZXZlbnRfZGF0YS5kYXRhMTsKKyAgICB1aW50MzJfdCBwaXhlbEZvcm1hdCA9IG1zZy51LmV2ZW50X2RhdGEuZGF0YTM7CisKKyAgICAvLyBUT0RPOiBzZXQgZGF0YXNwYWNlIG9uIGNvbXBvbmVudCB0byBzZWUgaWYgaXQgaW1wYWN0cyBjb2xvciBhc3BlY3RzCisgICAgQUxPR0QoImRhdGFzcGFjZSBjaGFuZ2VkIHRvICUjeCBwaXhlbCBmb3JtYXQ6ICUjeCIsIGRhdGFTcGFjZSwgcGl4ZWxGb3JtYXQpOworICAgIHJldHVybiBPSzsKK30KKworc3A8SU9NWEJ1ZmZlclNvdXJjZT4gQzJPTVhOb2RlOjpnZXRTb3VyY2UoKSB7CisgICAgcmV0dXJuIG1CdWZmZXJTb3VyY2U7Cit9CisKK3ZvaWQgQzJPTVhOb2RlOjpzZXRGcmFtZVNpemUodWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCkgeworICAgIG1XaWR0aCA9IHdpZHRoOworICAgIG1IZWlnaHQgPSBoZWlnaHQ7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQzJPTVhOb2RlLmggYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQzJPTVhOb2RlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVhODE1ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DMk9NWE5vZGUuaApAQCAtMCwwICsxLDEwMyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQzJfT01YX05PREVfSF8KKyNkZWZpbmUgQzJfT01YX05PREVfSF8KKworI2luY2x1ZGUgPGF0b21pYz4KKworI2luY2x1ZGUgPGFuZHJvaWQvSU9NWEJ1ZmZlclNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL0lPTVguaD4KKyNpbmNsdWRlIDxtZWRpYS9PTVhCdWZmZXIuaD4KKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC9jbGllbnQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKioKKyAqIElPbXhOb2RlIGltcGxlbWVudGF0aW9uIGFyb3VuZCBjb2RlYyAyLjAgY29tcG9uZW50LCBvbmx5IHRvIGJlIHVzZWQgaW4KKyAqIElHcmFwaGljQnVmZmVyU291cmNlOjpjb25maWd1cmUuIE9ubHkgc3Vic2V0IG9mIElPbXhOb2RlIEFQSSBpcyBpbXBsZW1lbnRlZAorICogYW5kIG90aGVycyBhcmUgbGVmdCBhcyBzdHViLiBBcyBhIHJlc3VsdCwgb25lIGNhbm5vdCBleHBlY3QgdGhpcyBJT214Tm9kZQorICogdG8gd29yayBpbiBhbnkgb3RoZXIgdXNhZ2UgdGhhbiBJR3JhcGhpY0J1ZmZlclNvdXJjZS4KKyAqLworc3RydWN0IEMyT01YTm9kZSA6IHB1YmxpYyBCbk9NWE5vZGUgeworICAgIGV4cGxpY2l0IEMyT01YTm9kZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+ICZjb21wKTsKKyAgICB+QzJPTVhOb2RlKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICAgLy8gSU9NWE5vZGUKKyAgICBzdGF0dXNfdCBmcmVlTm9kZSgpIG92ZXJyaWRlOworICAgIHN0YXR1c190IHNlbmRDb21tYW5kKE9NWF9DT01NQU5EVFlQRSBjbWQsIE9NWF9TMzIgcGFyYW0pIG92ZXJyaWRlOworICAgIHN0YXR1c190IGdldFBhcmFtZXRlcigKKyAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIHZvaWQgKnBhcmFtcywgc2l6ZV90IHNpemUpIG92ZXJyaWRlOworICAgIHN0YXR1c190IHNldFBhcmFtZXRlcigKKyAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IHZvaWQgKnBhcmFtcywgc2l6ZV90IHNpemUpIG92ZXJyaWRlOworICAgIHN0YXR1c190IGdldENvbmZpZygKKyAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIHZvaWQgKnBhcmFtcywgc2l6ZV90IHNpemUpIG92ZXJyaWRlOworICAgIHN0YXR1c190IHNldENvbmZpZygKKyAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IHZvaWQgKnBhcmFtcywgc2l6ZV90IHNpemUpIG92ZXJyaWRlOworICAgIHN0YXR1c190IHNldFBvcnRNb2RlKE9NWF9VMzIgcG9ydF9pbmRleCwgSU9NWDo6UG9ydE1vZGUgbW9kZSkgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3QgcHJlcGFyZUZvckFkYXB0aXZlUGxheWJhY2soCisgICAgICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwgT01YX0JPT0wgZW5hYmxlLAorICAgICAgICAgICAgT01YX1UzMiBtYXhGcmFtZVdpZHRoLCBPTVhfVTMyIG1heEZyYW1lSGVpZ2h0KSBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCBjb25maWd1cmVWaWRlb1R1bm5lbE1vZGUoCisgICAgICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwgT01YX0JPT0wgdHVubmVsZWQsCisgICAgICAgICAgICBPTVhfVTMyIGF1ZGlvSHdTeW5jLCBuYXRpdmVfaGFuZGxlX3QgKipzaWRlYmFuZEhhbmRsZSkgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3QgZ2V0R3JhcGhpY0J1ZmZlclVzYWdlKAorICAgICAgICAgICAgT01YX1UzMiBwb3J0X2luZGV4LCBPTVhfVTMyKiB1c2FnZSkgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3Qgc2V0SW5wdXRTdXJmYWNlKAorICAgICAgICAgICAgY29uc3Qgc3A8SU9NWEJ1ZmZlclNvdXJjZT4gJmJ1ZmZlclNvdXJjZSkgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3QgYWxsb2NhdGVTZWN1cmVCdWZmZXIoCisgICAgICAgICAgICBPTVhfVTMyIHBvcnRfaW5kZXgsIHNpemVfdCBzaXplLCBidWZmZXJfaWQgKmJ1ZmZlciwKKyAgICAgICAgICAgIHZvaWQgKipidWZmZXJfZGF0YSwgc3A8TmF0aXZlSGFuZGxlPiAqbmF0aXZlX2hhbmRsZSkgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3QgdXNlQnVmZmVyKAorICAgICAgICAgICAgT01YX1UzMiBwb3J0X2luZGV4LCBjb25zdCBPTVhCdWZmZXIgJm9teEJ1ZiwgYnVmZmVyX2lkICpidWZmZXIpIG92ZXJyaWRlOworICAgIHN0YXR1c190IGZyZWVCdWZmZXIoCisgICAgICAgICAgICBPTVhfVTMyIHBvcnRfaW5kZXgsIGJ1ZmZlcl9pZCBidWZmZXIpIG92ZXJyaWRlOworICAgIHN0YXR1c190IGZpbGxCdWZmZXIoCisgICAgICAgICAgICBidWZmZXJfaWQgYnVmZmVyLCBjb25zdCBPTVhCdWZmZXIgJm9teEJ1ZiwgaW50IGZlbmNlRmQpIG92ZXJyaWRlOworICAgIHN0YXR1c190IGVtcHR5QnVmZmVyKAorICAgICAgICAgICAgYnVmZmVyX2lkIGJ1ZmZlciwgY29uc3QgT01YQnVmZmVyICZvbXhCdWYsCisgICAgICAgICAgICBPTVhfVTMyIGZsYWdzLCBPTVhfVElDS1MgdGltZXN0YW1wLCBpbnQgZmVuY2VGZCkgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3QgZ2V0RXh0ZW5zaW9uSW5kZXgoCisgICAgICAgICAgICBjb25zdCBjaGFyICpwYXJhbWV0ZXJfbmFtZSwKKyAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgKmluZGV4KSBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCBkaXNwYXRjaE1lc3NhZ2UoY29uc3Qgb214X21lc3NhZ2UgJm1zZykgb3ZlcnJpZGU7CisKKyAgICBzcDxJT01YQnVmZmVyU291cmNlPiBnZXRTb3VyY2UoKTsKKyAgICB2b2lkIHNldEZyYW1lU2l6ZSh1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0KTsKKworcHJpdmF0ZToKKyAgICBzdGQ6OndlYWtfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiBtQ29tcDsKKyAgICBzcDxJT01YQnVmZmVyU291cmNlPiBtQnVmZmVyU291cmNlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gbUFsbG9jYXRvcjsKKyAgICBzdGQ6OmF0b21pY191aW50NjRfdCBtRnJhbWVJbmRleDsKKyAgICB1aW50MzJfdCBtV2lkdGg7CisgICAgdWludDMyX3QgbUhlaWdodDsKKyAgICB1aW50NjRfdCBtVXNhZ2U7CisKKyAgICAvLyBXT1JLQVJPVU5EOiB0aW1lc3RhbXAgYWRqdXN0bWVudAorCisgICAgLy8gaWYgPjA6IHRoaXMgaXMgdGhlIG1heCB0aW1lc3RhbXAgZ2FwLCBpZiA8MDogdGhpcyBpcyAtMSB0aW1lcyB0aGUgZml4ZWQgdGltZXN0YW1wIGdhcAorICAgIC8vIGlmIDA6IG5vIHRpbWVzdGFtcCBhZGp1c3RtZW50IGlzIG1hZGUKKyAgICAvLyBub3RlIHRoYXQgQzJPTVhOb2RlIGNhbiBiZSByZWN5Y2xlZCBiZXR3ZWVuIGVuY29kaW5nIHNlc3Npb25zLgorICAgIGludDMyX3QgbUFkanVzdFRpbWVzdGFtcEdhcFVzOworICAgIGJvb2wgbUZpcnN0SW5wdXRGcmFtZTsgLy8gdHJ1ZSBmb3IgZmlyc3QgaW5wdXQKKyAgICBjMl9jbnRyNjRfdCBtUHJldklucHV0VGltZXN0YW1wOyAvLyBpbnB1dCB0aW1lc3RhbXAgZm9yIHByZXZpb3VzIGZyYW1lCisgICAgYzJfY250cjY0X3QgbVByZXZDb2RlY1RpbWVzdGFtcDsgLy8gYWRqdXN0ZWQgKGNvZGVjKSB0aW1lc3RhbXAgZm9yIHByZXZpb3VzIGZyYW1lCit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEMyX09NWF9OT0RFX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjLmNwcCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5MDNiYmIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjLmNwcApAQCAtMCwwICsxLDE3NDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNDb2RlYyIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8dGhyZWFkPgorCisjaW5jbHVkZSA8QzJDb25maWcuaD4KKyNpbmNsdWRlIDxDMkRlYnVnLmg+CisjaW5jbHVkZSA8QzJQYXJhbUludGVybmFsLmg+CisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQvSUdyYXBoaWNCdWZmZXJTb3VyY2UuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL0lPTVhCdWZmZXJTb3VyY2UuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL29teC8xLjAvSUdyYXBoaWNCdWZmZXJTb3VyY2UuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL29teC8xLjAvSU9teC5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdwcmludGYuaD4KKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGd1aS9JR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+CisjaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KKyNpbmNsdWRlIDxndWkvYnVmZmVycXVldWUvMS4wL0gyQkdyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgorI2luY2x1ZGUgPG1lZGlhL29teC8xLjAvV0dyYXBoaWNCdWZmZXJTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9vcGVubWF4L09NWF9JbmRleEV4dC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0J1ZmZlclByb2R1Y2VyV3JhcHBlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNDb25zdGFudHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9QZXJzaXN0ZW50U3VyZmFjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2NvZGVjMi8xLjAvSW5wdXRTdXJmYWNlLmg+CisKKyNpbmNsdWRlICJDMk9NWE5vZGUuaCIKKyNpbmNsdWRlICJDQ29kZWMuaCIKKyNpbmNsdWRlICJDQ29kZWNCdWZmZXJDaGFubmVsLmgiCisjaW5jbHVkZSAiSW5wdXRTdXJmYWNlV3JhcHBlci5oIgorCitleHRlcm4gIkMiIGFuZHJvaWQ6OlBlcnNpc3RlbnRTdXJmYWNlICpDcmVhdGVJbnB1dFN1cmZhY2UoKTsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit1c2luZyBuYW1lc3BhY2Ugc3RkOjpjaHJvbm9fbGl0ZXJhbHM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6YnVmZmVycXVldWU6OlYxXzA6OnV0aWxzOjpIMkJHcmFwaGljQnVmZmVyUHJvZHVjZXI7Cit1c2luZyBhbmRyb2lkOjpiYXNlOjpTdHJpbmdQcmludGY7Cit1c2luZyBCR3JhcGhpY0J1ZmZlclNvdXJjZSA9IDo6YW5kcm9pZDo6SUdyYXBoaWNCdWZmZXJTb3VyY2U7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YzI6OlYxXzA6OklJbnB1dFN1cmZhY2U7CisKK25hbWVzcGFjZSB7CisKK2NsYXNzIENDb2RlY1dhdGNoZG9nIDogcHVibGljIEFIYW5kbGVyIHsKK3ByaXZhdGU6CisgICAgZW51bSB7CisgICAgICAgIGtXaGF0V2F0Y2gsCisgICAgfTsKKyAgICBjb25zdGV4cHIgc3RhdGljIGludDY0X3Qga1dhdGNoSW50ZXJ2YWxVcyA9IDMzMDAwMDA7ICAvLyAzLjMgc2VjcworCitwdWJsaWM6CisgICAgc3RhdGljIHNwPENDb2RlY1dhdGNoZG9nPiBnZXRJbnN0YW5jZSgpIHsKKyAgICAgICAgc3RhdGljIHNwPENDb2RlY1dhdGNoZG9nPiBpbnN0YW5jZShuZXcgQ0NvZGVjV2F0Y2hkb2cpOworICAgICAgICBzdGF0aWMgc3RkOjpvbmNlX2ZsYWcgZmxhZzsKKyAgICAgICAgLy8gQ2FsbCBJbml0KCkgb25seSBvbmNlLgorICAgICAgICBzdGQ6OmNhbGxfb25jZShmbGFnLCBJbml0LCBpbnN0YW5jZSk7CisgICAgICAgIHJldHVybiBpbnN0YW5jZTsKKyAgICB9CisKKyAgICB+Q0NvZGVjV2F0Y2hkb2coKSA9IGRlZmF1bHQ7CisKKyAgICB2b2lkIHdhdGNoKHNwPENDb2RlYz4gY29kZWMpIHsKKyAgICAgICAgYm9vbCBzaG91bGRQb3N0ID0gZmFsc2U7CisgICAgICAgIHsKKyAgICAgICAgICAgIE11dGV4ZWQ8c3RkOjpzZXQ8d3A8Q0NvZGVjPj4+OjpMb2NrZWQgY29kZWNzKG1Db2RlY3NUb1dhdGNoKTsKKyAgICAgICAgICAgIC8vIElmIGEgd2F0Y2ggbWVzc2FnZSBpcyBpbiBmbGlnaHQsIHBpZ2d5LWJhY2sgdGhpcyBpbnN0YW5jZSBhcyB3ZWxsLgorICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCBwb3N0IGEgbmV3IHdhdGNoIG1lc3NhZ2UuCisgICAgICAgICAgICBzaG91bGRQb3N0ID0gY29kZWNzLT5lbXB0eSgpOworICAgICAgICAgICAgY29kZWNzLT5lbXBsYWNlKGNvZGVjKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2hvdWxkUG9zdCkgeworICAgICAgICAgICAgQUxPR1YoInBvc3Rpbmcgd2F0Y2ggbWVzc2FnZSIpOworICAgICAgICAgICAgKG5ldyBBTWVzc2FnZShrV2hhdFdhdGNoLCB0aGlzKSktPnBvc3Qoa1dhdGNoSW50ZXJ2YWxVcyk7CisgICAgICAgIH0KKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICB2b2lkIG9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgICAgIHN3aXRjaCAobXNnLT53aGF0KCkpIHsKKyAgICAgICAgICAgIGNhc2Uga1doYXRXYXRjaDogeworICAgICAgICAgICAgICAgIE11dGV4ZWQ8c3RkOjpzZXQ8d3A8Q0NvZGVjPj4+OjpMb2NrZWQgY29kZWNzKG1Db2RlY3NUb1dhdGNoKTsKKyAgICAgICAgICAgICAgICBBTE9HVigid2F0Y2ggZm9yICV6dSBjb2RlY3MiLCBjb2RlY3MtPnNpemUoKSk7CisgICAgICAgICAgICAgICAgZm9yIChhdXRvIGl0ID0gY29kZWNzLT5iZWdpbigpOyBpdCAhPSBjb2RlY3MtPmVuZCgpOyArK2l0KSB7CisgICAgICAgICAgICAgICAgICAgIHNwPENDb2RlYz4gY29kZWMgPSBpdC0+cHJvbW90ZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoY29kZWMgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY29kZWMtPmluaXRpYXRlUmVsZWFzZUlmU3R1Y2soKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY29kZWNzLT5jbGVhcigpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkZWZhdWx0OiB7CisgICAgICAgICAgICAgICAgVFJFU1BBU1MoIkNDb2RlY1dhdGNoZG9nOiB1bnJlY29nbml6ZWQgbWVzc2FnZSIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCitwcml2YXRlOgorICAgIENDb2RlY1dhdGNoZG9nKCkgOiBtTG9vcGVyKG5ldyBBTG9vcGVyKSB7fQorCisgICAgc3RhdGljIHZvaWQgSW5pdChjb25zdCBzcDxDQ29kZWNXYXRjaGRvZz4gJnRoaXopIHsKKyAgICAgICAgQUxPR1YoIkluaXQiKTsKKyAgICAgICAgdGhpei0+bUxvb3Blci0+c2V0TmFtZSgiQ0NvZGVjV2F0Y2hkb2ciKTsKKyAgICAgICAgdGhpei0+bUxvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKHRoaXopOworICAgICAgICB0aGl6LT5tTG9vcGVyLT5zdGFydCgpOworICAgIH0KKworICAgIHNwPEFMb29wZXI+IG1Mb29wZXI7CisKKyAgICBNdXRleGVkPHN0ZDo6c2V0PHdwPENDb2RlYz4+PiBtQ29kZWNzVG9XYXRjaDsKK307CisKK2NsYXNzIEMySW5wdXRTdXJmYWNlV3JhcHBlciA6IHB1YmxpYyBJbnB1dFN1cmZhY2VXcmFwcGVyIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBDMklucHV0U3VyZmFjZVdyYXBwZXIoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpJbnB1dFN1cmZhY2U+ICZzdXJmYWNlKSA6CisgICAgICAgIG1TdXJmYWNlKHN1cmZhY2UpIHsKKyAgICB9CisKKyAgICB+QzJJbnB1dFN1cmZhY2VXcmFwcGVyKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICAgc3RhdHVzX3QgY29ubmVjdChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+ICZjb21wKSBvdmVycmlkZSB7CisgICAgICAgIGlmIChtQ29ubmVjdGlvbiAhPSBudWxscHRyKSB7CisgICAgICAgICAgICByZXR1cm4gQUxSRUFEWV9FWElTVFM7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRvU3RhdHVzVChtU3VyZmFjZS0+Y29ubmVjdFRvQ29tcG9uZW50KGNvbXAsICZtQ29ubmVjdGlvbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgQzJfT1BFUkFUSU9OX0lucHV0U3VyZmFjZV9jb25uZWN0VG9Db21wb25lbnQpOworICAgIH0KKworICAgIHZvaWQgZGlzY29ubmVjdCgpIG92ZXJyaWRlIHsKKyAgICAgICAgaWYgKG1Db25uZWN0aW9uICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIG1Db25uZWN0aW9uLT5kaXNjb25uZWN0KCk7CisgICAgICAgICAgICBtQ29ubmVjdGlvbiA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0dXNfdCBzdGFydCgpIG92ZXJyaWRlIHsKKyAgICAgICAgLy8gSW5wdXRTdXJmYWNlIGRvZXMgbm90IGRpc3Rpbmd1aXNoIHN0YXJ0ZWQgc3RhdGUKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIHN0YXR1c190IHNpZ25hbEVuZE9mSW5wdXRTdHJlYW0oKSBvdmVycmlkZSB7CisgICAgICAgIEMySW5wdXRTdXJmYWNlRW9zVHVuaW5nIGVvcyh0cnVlKTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBtU3VyZmFjZS0+Z2V0Q29uZmlndXJhYmxlKCktPmNvbmZpZyh7JmVvc30sIEMyX01BWV9CTE9DSywgJmZhaWx1cmVzKTsKKyAgICAgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIHN0YXR1c190IGNvbmZpZ3VyZShDb25maWcgJmNvbmZpZyBfX3VudXNlZCkgeworICAgICAgICAvLyBUT0RPCisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6SW5wdXRTdXJmYWNlPiBtU3VyZmFjZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpJbnB1dFN1cmZhY2VDb25uZWN0aW9uPiBtQ29ubmVjdGlvbjsKK307CisKK2NsYXNzIEdyYXBoaWNCdWZmZXJTb3VyY2VXcmFwcGVyIDogcHVibGljIElucHV0U3VyZmFjZVdyYXBwZXIgeworcHVibGljOgorLy8gICAgZXhwbGljaXQgR3JhcGhpY0J1ZmZlclNvdXJjZVdyYXBwZXIoY29uc3Qgc3A8QkdyYXBoaWNCdWZmZXJTb3VyY2U+ICZzb3VyY2UpIDogbVNvdXJjZShzb3VyY2UpIHt9CisgICAgR3JhcGhpY0J1ZmZlclNvdXJjZVdyYXBwZXIoCisgICAgICAgICAgICBjb25zdCBzcDxCR3JhcGhpY0J1ZmZlclNvdXJjZT4gJnNvdXJjZSwKKyAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLAorICAgICAgICAgICAgdWludDMyX3QgaGVpZ2h0KQorICAgICAgICA6IG1Tb3VyY2Uoc291cmNlKSwgbVdpZHRoKHdpZHRoKSwgbUhlaWdodChoZWlnaHQpIHsKKyAgICAgICAgbURhdGFTcGFjZSA9IEhBTF9EQVRBU1BBQ0VfQlQ3MDk7CisgICAgfQorICAgIH5HcmFwaGljQnVmZmVyU291cmNlV3JhcHBlcigpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIHN0YXR1c190IGNvbm5lY3QoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiAmY29tcCkgb3ZlcnJpZGUgeworICAgICAgICBtTm9kZSA9IG5ldyBDMk9NWE5vZGUoY29tcCk7CisgICAgICAgIG1Ob2RlLT5zZXRGcmFtZVNpemUobVdpZHRoLCBtSGVpZ2h0KTsKKworICAgICAgICAvLyBOT1RFOiB3ZSBkbyBub3QgdXNlL3Bhc3MgdGhyb3VnaCBjb2xvciBhc3BlY3RzIGZyb20gR3JhcGhpY0J1ZmZlclNvdXJjZSBhcyB3ZQorICAgICAgICAvLyBjb21tdW5pY2F0ZSB0aGF0IGRpcmVjdGx5IHRvIHRoZSBjb21wb25lbnQuCisgICAgICAgIG1Tb3VyY2UtPmNvbmZpZ3VyZShtTm9kZSwgbURhdGFTcGFjZSk7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICB2b2lkIGRpc2Nvbm5lY3QoKSBvdmVycmlkZSB7CisgICAgICAgIGlmIChtTm9kZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgc3A8SU9NWEJ1ZmZlclNvdXJjZT4gc291cmNlID0gbU5vZGUtPmdldFNvdXJjZSgpOworICAgICAgICBpZiAoc291cmNlID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dEKCJHQlNXcmFwcGVyOjpkaXNjb25uZWN0OiBub2RlIGlzIG5vdCBjb25maWd1cmVkIHdpdGggT01YQnVmZmVyU291cmNlLiIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHNvdXJjZS0+b25PbXhJZGxlKCk7CisgICAgICAgIHNvdXJjZS0+b25PbXhMb2FkZWQoKTsKKyAgICAgICAgbU5vZGUuY2xlYXIoKTsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBHZXRTdGF0dXMoY29uc3QgYmluZGVyOjpTdGF0dXMgJnN0YXR1cykgeworICAgICAgICBzdGF0dXNfdCBlcnIgPSBPSzsKKyAgICAgICAgaWYgKCFzdGF0dXMuaXNPaygpKSB7CisgICAgICAgICAgICBlcnIgPSBzdGF0dXMuc2VydmljZVNwZWNpZmljRXJyb3JDb2RlKCk7CisgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICAgICAgZXJyID0gc3RhdHVzLnRyYW5zYWN0aW9uRXJyb3IoKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGJpbmRlciBzdGF0dXMgZmFpbGVkLCBidXQgdGhlcmUgaXMgbm8gc2VydmllIG9yIHRyYW5zYWN0aW9uIGVycm9yCisgICAgICAgICAgICAgICAgICAgIGVyciA9IFVOS05PV05fRVJST1I7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgc3RhdHVzX3Qgc3RhcnQoKSBvdmVycmlkZSB7CisgICAgICAgIHNwPElPTVhCdWZmZXJTb3VyY2U+IHNvdXJjZSA9IG1Ob2RlLT5nZXRTb3VyY2UoKTsKKyAgICAgICAgaWYgKHNvdXJjZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICAgICAgfQorICAgICAgICBjb25zdGV4cHIgc2l6ZV90IGtOdW1TbG90cyA9IDE2OworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtOdW1TbG90czsgKytpKSB7CisgICAgICAgICAgICBzb3VyY2UtPm9uSW5wdXRCdWZmZXJBZGRlZChpKTsKKyAgICAgICAgfQorCisgICAgICAgIHNvdXJjZS0+b25PbXhFeGVjdXRpbmcoKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIHN0YXR1c190IHNpZ25hbEVuZE9mSW5wdXRTdHJlYW0oKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBHZXRTdGF0dXMobVNvdXJjZS0+c2lnbmFsRW5kT2ZJbnB1dFN0cmVhbSgpKTsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBjb25maWd1cmUoQ29uZmlnICZjb25maWcpIHsKKyAgICAgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3RhdHVzOworICAgICAgICBzdGF0dXNfdCBlcnIgPSBPSzsKKworICAgICAgICAvLyBoYW5kbGUgZWFjaCBjb25maWd1cmF0aW9uIGdyYW51YWxseSwgaW4gY2FzZSB3ZSBuZWVkIHRvIGhhbmRsZSBwYXJ0IG9mIHRoZSBjb25maWd1cmF0aW9uCisgICAgICAgIC8vIGVsc2V3aGVyZQorCisgICAgICAgIC8vIFRSSUNLWTogd2UgZG8gbm90IHVuc2V0IGZyYW1lIGRlbGF5IHJlcGVhdGluZworICAgICAgICBpZiAoY29uZmlnLm1NaW5GcHMgPiAwICYmIGNvbmZpZy5tTWluRnBzICE9IG1Db25maWcubU1pbkZwcykgeworICAgICAgICAgICAgaW50NjRfdCB1cyA9IDFlNiAvIGNvbmZpZy5tTWluRnBzICsgMC41OworICAgICAgICAgICAgc3RhdHVzX3QgcmVzID0gR2V0U3RhdHVzKG1Tb3VyY2UtPnNldFJlcGVhdFByZXZpb3VzRnJhbWVEZWxheVVzKHVzKSk7CisgICAgICAgICAgICBzdGF0dXMgPDwgIiBtaW5GcHM9IiA8PCBjb25maWcubU1pbkZwcyA8PCAiID0+IHJlcGVhdERlbGF5VXM9IiA8PCB1czsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPDwgIiAoPT4gIiA8PCBhc1N0cmluZyhyZXMpIDw8ICIpIjsKKyAgICAgICAgICAgICAgICBlcnIgPSByZXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ29uZmlnLm1NaW5GcHMgPSBjb25maWcubU1pbkZwczsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHB0cyBnYXAKKyAgICAgICAgaWYgKGNvbmZpZy5tTWluQWRqdXN0ZWRGcHMgPiAwIHx8IGNvbmZpZy5tRml4ZWRBZGp1c3RlZEZwcyA+IDApIHsKKyAgICAgICAgICAgIGlmIChtTm9kZSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgT01YX1BBUkFNX1UzMlRZUEUgcHRyR2FwUGFyYW0gPSB7fTsKKyAgICAgICAgICAgICAgICBwdHJHYXBQYXJhbS5uU2l6ZSA9IHNpemVvZihPTVhfUEFSQU1fVTMyVFlQRSk7CisgICAgICAgICAgICAgICAgcHRyR2FwUGFyYW0ublUzMiA9IChjb25maWcubU1pbkFkanVzdGVkRnBzID4gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgID8gYzJfbWluKElOVDMyX01BWCArIDAuLCAxZTYgLyBjb25maWcubU1pbkFkanVzdGVkRnBzICsgMC41KQorICAgICAgICAgICAgICAgICAgICAgICAgOiBjMl9tYXgoMC4gLSBJTlQzMl9NQVgsIC0xZTYgLyBjb25maWcubUZpeGVkQWRqdXN0ZWRGcHMgLSAwLjUpOworICAgICAgICAgICAgICAgICh2b2lkKW1Ob2RlLT5zZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAoT01YX0lOREVYVFlQRSlPTVhfSW5kZXhQYXJhbU1heEZyYW1lRHVyYXRpb25Gb3JCaXRyYXRlQ29udHJvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICZwdHJHYXBQYXJhbSwgc2l6ZW9mKHB0ckdhcFBhcmFtKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBtYXggZnBzCisgICAgICAgIC8vIFRSSUNLWTogd2UgZG8gbm90IHVuc2V0IG1heCBmcHMgdG8gMCB1bmxlc3MgdXNpbmcgZml4ZWQgZnBzCisgICAgICAgIGlmICgoY29uZmlnLm1NYXhGcHMgPiAwIHx8IChjb25maWcubUZpeGVkQWRqdXN0ZWRGcHMgPiAwICYmIGNvbmZpZy5tTWF4RnBzID09IDApKQorICAgICAgICAgICAgICAgICYmIGNvbmZpZy5tTWF4RnBzICE9IG1Db25maWcubU1heEZwcykgeworICAgICAgICAgICAgc3RhdHVzX3QgcmVzID0gR2V0U3RhdHVzKG1Tb3VyY2UtPnNldE1heEZwcyhjb25maWcubU1heEZwcykpOworICAgICAgICAgICAgc3RhdHVzIDw8ICIgbWF4RnBzPSIgPDwgY29uZmlnLm1NYXhGcHM7CisgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzIDw8ICIgKD0+ICIgPDwgYXNTdHJpbmcocmVzKSA8PCAiKSI7CisgICAgICAgICAgICAgICAgZXJyID0gcmVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUNvbmZpZy5tTWF4RnBzID0gY29uZmlnLm1NYXhGcHM7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY29uZmlnLm1UaW1lT2Zmc2V0VXMgIT0gbUNvbmZpZy5tVGltZU9mZnNldFVzKSB7CisgICAgICAgICAgICBzdGF0dXNfdCByZXMgPSBHZXRTdGF0dXMobVNvdXJjZS0+c2V0VGltZU9mZnNldFVzKGNvbmZpZy5tVGltZU9mZnNldFVzKSk7CisgICAgICAgICAgICBzdGF0dXMgPDwgIiB0aW1lT2Zmc2V0ICIgPDwgY29uZmlnLm1UaW1lT2Zmc2V0VXMgPDwgInVzIjsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPDwgIiAoPT4gIiA8PCBhc1N0cmluZyhyZXMpIDw8ICIpIjsKKyAgICAgICAgICAgICAgICBlcnIgPSByZXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ29uZmlnLm1UaW1lT2Zmc2V0VXMgPSBjb25maWcubVRpbWVPZmZzZXRVczsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjb25maWcubUNhcHR1cmVGcHMgIT0gbUNvbmZpZy5tQ2FwdHVyZUZwcyB8fCBjb25maWcubUNvZGVkRnBzICE9IG1Db25maWcubUNvZGVkRnBzKSB7CisgICAgICAgICAgICBzdGF0dXNfdCByZXMgPQorICAgICAgICAgICAgICAgIEdldFN0YXR1cyhtU291cmNlLT5zZXRUaW1lTGFwc2VDb25maWcoY29uZmlnLm1Db2RlZEZwcywgY29uZmlnLm1DYXB0dXJlRnBzKSk7CisgICAgICAgICAgICBzdGF0dXMgPDwgIiB0aW1lTGFwc2UgIiA8PCBjb25maWcubUNhcHR1cmVGcHMgPDwgImZwcyBhcyAiIDw8IGNvbmZpZy5tQ29kZWRGcHMgPDwgImZwcyI7CisgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzIDw8ICIgKD0+ICIgPDwgYXNTdHJpbmcocmVzKSA8PCAiKSI7CisgICAgICAgICAgICAgICAgZXJyID0gcmVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUNvbmZpZy5tQ2FwdHVyZUZwcyA9IGNvbmZpZy5tQ2FwdHVyZUZwczsKKyAgICAgICAgICAgIG1Db25maWcubUNvZGVkRnBzID0gY29uZmlnLm1Db2RlZEZwczsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjb25maWcubVN0YXJ0QXRVcyAhPSBtQ29uZmlnLm1TdGFydEF0VXMKKyAgICAgICAgICAgICAgICB8fCAoY29uZmlnLm1TdG9wcGVkICE9IG1Db25maWcubVN0b3BwZWQgJiYgIWNvbmZpZy5tU3RvcHBlZCkpIHsKKyAgICAgICAgICAgIHN0YXR1c190IHJlcyA9IEdldFN0YXR1cyhtU291cmNlLT5zZXRTdGFydFRpbWVVcyhjb25maWcubVN0YXJ0QXRVcykpOworICAgICAgICAgICAgc3RhdHVzIDw8ICIgc3RhcnQgYXQgIiA8PCBjb25maWcubVN0YXJ0QXRVcyA8PCAidXMiOworICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgIHN0YXR1cyA8PCAiICg9PiAiIDw8IGFzU3RyaW5nKHJlcykgPDwgIikiOworICAgICAgICAgICAgICAgIGVyciA9IHJlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1Db25maWcubVN0YXJ0QXRVcyA9IGNvbmZpZy5tU3RhcnRBdFVzOworICAgICAgICAgICAgbUNvbmZpZy5tU3RvcHBlZCA9IGNvbmZpZy5tU3RvcHBlZDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHN1c3BlbmQtcmVzdW1lCisgICAgICAgIGlmIChjb25maWcubVN1c3BlbmRlZCAhPSBtQ29uZmlnLm1TdXNwZW5kZWQpIHsKKyAgICAgICAgICAgIHN0YXR1c190IHJlcyA9IEdldFN0YXR1cyhtU291cmNlLT5zZXRTdXNwZW5kKGNvbmZpZy5tU3VzcGVuZGVkLCBjb25maWcubVN1c3BlbmRBdFVzKSk7CisgICAgICAgICAgICBzdGF0dXMgPDwgIiAiIDw8IChjb25maWcubVN1c3BlbmRlZCA/ICJzdXNwZW5kIiA6ICJyZXN1bWUiKQorICAgICAgICAgICAgICAgICAgICA8PCAiIGF0ICIgPDwgY29uZmlnLm1TdXNwZW5kQXRVcyA8PCAidXMiOworICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgIHN0YXR1cyA8PCAiICg9PiAiIDw8IGFzU3RyaW5nKHJlcykgPDwgIikiOworICAgICAgICAgICAgICAgIGVyciA9IHJlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1Db25maWcubVN1c3BlbmRlZCA9IGNvbmZpZy5tU3VzcGVuZGVkOworICAgICAgICAgICAgbUNvbmZpZy5tU3VzcGVuZEF0VXMgPSBjb25maWcubVN1c3BlbmRBdFVzOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNvbmZpZy5tU3RvcHBlZCAhPSBtQ29uZmlnLm1TdG9wcGVkICYmIGNvbmZpZy5tU3RvcHBlZCkgeworICAgICAgICAgICAgc3RhdHVzX3QgcmVzID0gR2V0U3RhdHVzKG1Tb3VyY2UtPnNldFN0b3BUaW1lVXMoY29uZmlnLm1TdG9wQXRVcykpOworICAgICAgICAgICAgc3RhdHVzIDw8ICIgc3RvcCBhdCAiIDw8IGNvbmZpZy5tU3RvcEF0VXMgPDwgInVzIjsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPDwgIiAoPT4gIiA8PCBhc1N0cmluZyhyZXMpIDw8ICIpIjsKKyAgICAgICAgICAgICAgICBlcnIgPSByZXM7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN0YXR1cyA8PCAiIGRlbGF5VXMiOworICAgICAgICAgICAgICAgIHJlcyA9IEdldFN0YXR1cyhtU291cmNlLT5nZXRTdG9wVGltZU9mZnNldFVzKCZjb25maWcubUlucHV0RGVsYXlVcykpOworICAgICAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzIDw8ICIgKD0+ICIgPDwgYXNTdHJpbmcocmVzKSA8PCAiKSI7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzIDw8ICI9IiA8PCBjb25maWcubUlucHV0RGVsYXlVcyA8PCAidXMiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtQ29uZmlnLm1JbnB1dERlbGF5VXMgPSBjb25maWcubUlucHV0RGVsYXlVczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1Db25maWcubVN0b3BBdFVzID0gY29uZmlnLm1TdG9wQXRVczsKKyAgICAgICAgICAgIG1Db25maWcubVN0b3BwZWQgPSBjb25maWcubVN0b3BwZWQ7CisgICAgICAgIH0KKworICAgICAgICAvLyBjb2xvciBhc3BlY3RzIChhbmRyb2lkLl9jb2xvci1hc3BlY3RzKQorCisgICAgICAgIC8vIGNvbnN1bWVyIHVzYWdlCisgICAgICAgIEFMT0dEKCJJU0NvbmZpZyVzIiwgc3RhdHVzLnN0cigpLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworcHJpdmF0ZToKKyAgICBzcDxCR3JhcGhpY0J1ZmZlclNvdXJjZT4gbVNvdXJjZTsKKyAgICBzcDxDMk9NWE5vZGU+IG1Ob2RlOworICAgIHVpbnQzMl90IG1XaWR0aDsKKyAgICB1aW50MzJfdCBtSGVpZ2h0OworICAgIENvbmZpZyBtQ29uZmlnOworfTsKKworY2xhc3MgQ29kZWMyQ2xpZW50SW50ZXJmYWNlV3JhcHBlciA6IHB1YmxpYyBDMkNvbXBvbmVudFN0b3JlIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50PiBtQ2xpZW50OworCitwdWJsaWM6CisgICAgQ29kZWMyQ2xpZW50SW50ZXJmYWNlV3JhcHBlcihzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50PiBjbGllbnQpCisgICAgICAgIDogbUNsaWVudChjbGllbnQpIHsgfQorCisgICAgdmlydHVhbCB+Q29kZWMyQ2xpZW50SW50ZXJmYWNlV3JhcHBlcigpID0gZGVmYXVsdDsKKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY29uZmlnX3NtKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSAqPiAmcGFyYW1zLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+ICpjb25zdCBmYWlsdXJlcykgeworICAgICAgICByZXR1cm4gbUNsaWVudC0+Y29uZmlnKHBhcmFtcywgQzJfTUFZX0JMT0NLLCBmYWlsdXJlcyk7CisgICAgfTsKKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY29weUJ1ZmZlcigKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCdWZmZXI+LAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0J1ZmZlcj4pIHsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVDb21wb25lbnQoCisgICAgICAgICAgICBDMlN0cmluZywgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiAqY29uc3QgY29tcG9uZW50KSB7CisgICAgICAgIGNvbXBvbmVudC0+cmVzZXQoKTsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgICAgICBDMlN0cmluZywgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiAqY29uc3QgaW50ZXJmYWNlKSB7CisgICAgICAgIGludGVyZmFjZS0+cmVzZXQoKTsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeV9zbSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0gKj4gJnN0YWNrUGFyYW1zLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+ICZoZWFwUGFyYW1JbmRpY2VzLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiAqY29uc3QgaGVhcFBhcmFtcykgY29uc3QgeworICAgICAgICByZXR1cm4gbUNsaWVudC0+cXVlcnkoc3RhY2tQYXJhbXMsIGhlYXBQYXJhbUluZGljZXMsIEMyX01BWV9CTE9DSywgaGVhcFBhcmFtcyk7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeVN1cHBvcnRlZFBhcmFtc19uYigKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4+ICpjb25zdCBwYXJhbXMpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1DbGllbnQtPnF1ZXJ5U3VwcG9ydGVkUGFyYW1zKHBhcmFtcyk7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeVN1cHBvcnRlZFZhbHVlc19zbSgKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeT4gJmZpZWxkcykgY29uc3QgeworICAgICAgICByZXR1cm4gbUNsaWVudC0+cXVlcnlTdXBwb3J0ZWRWYWx1ZXMoZmllbGRzLCBDMl9NQVlfQkxPQ0spOworICAgIH0KKworICAgIHZpcnR1YWwgQzJTdHJpbmcgZ2V0TmFtZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1DbGllbnQtPmdldE5hbWUoKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiBnZXRQYXJhbVJlZmxlY3RvcigpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1DbGllbnQtPmdldFBhcmFtUmVmbGVjdG9yKCk7CisgICAgfQorCisgICAgdmlydHVhbCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJDb21wb25lbnQ6OlRyYWl0cz4+IGxpc3RDb21wb25lbnRzKCkgeworICAgICAgICByZXR1cm4gc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyQ29tcG9uZW50OjpUcmFpdHM+PigpOworICAgIH0KK307CisKK30gIC8vIG5hbWVzcGFjZQorCisvLyBDQ29kZWM6OkNsaWVudExpc3RlbmVyCisKK3N0cnVjdCBDQ29kZWM6OkNsaWVudExpc3RlbmVyIDogcHVibGljIENvZGVjMkNsaWVudDo6TGlzdGVuZXIgeworCisgICAgZXhwbGljaXQgQ2xpZW50TGlzdGVuZXIoY29uc3Qgd3A8Q0NvZGVjPiAmY29kZWMpIDogbUNvZGVjKGNvZGVjKSB7fQorCisgICAgdmlydHVhbCB2b2lkIG9uV29ya0RvbmUoCisgICAgICAgICAgICBjb25zdCBzdGQ6OndlYWtfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiYgY29tcG9uZW50LAorICAgICAgICAgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiYgd29ya0l0ZW1zLAorICAgICAgICAgICAgc2l6ZV90IG51bURpc2NhcmRlZElucHV0QnVmZmVycykgb3ZlcnJpZGUgeworICAgICAgICAodm9pZCljb21wb25lbnQ7CisgICAgICAgIHNwPENDb2RlYz4gY29kZWMobUNvZGVjLnByb21vdGUoKSk7CisgICAgICAgIGlmICghY29kZWMpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBjb2RlYy0+b25Xb3JrRG9uZSh3b3JrSXRlbXMsIG51bURpc2NhcmRlZElucHV0QnVmZmVycyk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIG9uVHJpcHBlZCgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6d2Vha19wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+JiBjb21wb25lbnQsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4mIHNldHRpbmdSZXN1bHQKKyAgICAgICAgICAgICkgb3ZlcnJpZGUgeworICAgICAgICAvLyBUT0RPCisgICAgICAgICh2b2lkKWNvbXBvbmVudDsKKyAgICAgICAgKHZvaWQpc2V0dGluZ1Jlc3VsdDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgb25FcnJvcigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6d2Vha19wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+JiBjb21wb25lbnQsCisgICAgICAgICAgICB1aW50MzJfdCBlcnJvckNvZGUpIG92ZXJyaWRlIHsKKyAgICAgICAgLy8gVE9ETworICAgICAgICAodm9pZCljb21wb25lbnQ7CisgICAgICAgICh2b2lkKWVycm9yQ29kZTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgb25EZWF0aCgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6d2Vha19wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+JiBjb21wb25lbnQpIG92ZXJyaWRlIHsKKyAgICAgICAgeyAvLyBMb2cgdGhlIGRlYXRoIG9mIHRoZSBjb21wb25lbnQuCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+IGNvbXAgPSBjb21wb25lbnQubG9jaygpOworICAgICAgICAgICAgaWYgKCFjb21wKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkNvZGVjMiBjb21wb25lbnQgZGllZC4iKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkNvZGVjMiBjb21wb25lbnQgXCIlc1wiIGRpZWQuIiwgY29tcC0+Z2V0TmFtZSgpLmNfc3RyKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gUmVwb3J0IHRvIE1lZGlhQ29kZWMuCisgICAgICAgIHNwPENDb2RlYz4gY29kZWMobUNvZGVjLnByb21vdGUoKSk7CisgICAgICAgIGlmICghY29kZWMgfHwgIWNvZGVjLT5tQ2FsbGJhY2spIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBjb2RlYy0+bUNhbGxiYWNrLT5vbkVycm9yKERFQURfT0JKRUNULCBBQ1RJT05fQ09ERV9GQVRBTCk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIG9uRnJhbWVzUmVuZGVyZWQoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxSZW5kZXJlZEZyYW1lPiYgcmVuZGVyZWRGcmFtZXMpIG92ZXJyaWRlIHsKKyAgICAgICAgLy8gVE9ETworICAgICAgICAodm9pZClyZW5kZXJlZEZyYW1lczsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgb25JbnB1dEJ1ZmZlckRvbmUoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+JiBidWZmZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgc3A8Q0NvZGVjPiBjb2RlYyhtQ29kZWMucHJvbW90ZSgpKTsKKyAgICAgICAgaWYgKGNvZGVjKSB7CisgICAgICAgICAgICBjb2RlYy0+b25JbnB1dEJ1ZmZlckRvbmUoYnVmZmVyKTsKKyAgICAgICAgfQorICAgIH0KKworcHJpdmF0ZToKKyAgICB3cDxDQ29kZWM+IG1Db2RlYzsKK307CisKKy8vIENDb2RlY0NhbGxiYWNrSW1wbAorCitjbGFzcyBDQ29kZWNDYWxsYmFja0ltcGwgOiBwdWJsaWMgQ0NvZGVjQ2FsbGJhY2sgeworcHVibGljOgorICAgIGV4cGxpY2l0IENDb2RlY0NhbGxiYWNrSW1wbChDQ29kZWMgKmNvZGVjKSA6IG1Db2RlYyhjb2RlYykge30KKyAgICB+Q0NvZGVjQ2FsbGJhY2tJbXBsKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICAgdm9pZCBvbkVycm9yKHN0YXR1c190IGVyciwgZW51bSBBY3Rpb25Db2RlIGFjdGlvbkNvZGUpIG92ZXJyaWRlIHsKKyAgICAgICAgbUNvZGVjLT5tQ2FsbGJhY2stPm9uRXJyb3IoZXJyLCBhY3Rpb25Db2RlKTsKKyAgICB9CisKKyAgICB2b2lkIG9uT3V0cHV0RnJhbWVzUmVuZGVyZWQoaW50NjRfdCBtZWRpYVRpbWVVcywgbnNlY3NfdCByZW5kZXJUaW1lTnMpIG92ZXJyaWRlIHsKKyAgICAgICAgbUNvZGVjLT5tQ2FsbGJhY2stPm9uT3V0cHV0RnJhbWVzUmVuZGVyZWQoCisgICAgICAgICAgICAgICAge1JlbmRlcmVkRnJhbWVJbmZvKG1lZGlhVGltZVVzLCByZW5kZXJUaW1lTnMpfSk7CisgICAgfQorCisgICAgdm9pZCBvbldvcmtRdWV1ZWQoYm9vbCBlb3MpIG92ZXJyaWRlIHsKKyAgICAgICAgbUNvZGVjLT5vbldvcmtRdWV1ZWQoZW9zKTsKKyAgICB9CisKKyAgICB2b2lkIG9uT3V0cHV0QnVmZmVyc0NoYW5nZWQoKSBvdmVycmlkZSB7CisgICAgICAgIG1Db2RlYy0+bUNhbGxiYWNrLT5vbk91dHB1dEJ1ZmZlcnNDaGFuZ2VkKCk7CisgICAgfQorCitwcml2YXRlOgorICAgIENDb2RlYyAqbUNvZGVjOworfTsKKworLy8gQ0NvZGVjCisKK0NDb2RlYzo6Q0NvZGVjKCkKKyAgICA6IG1DaGFubmVsKG5ldyBDQ29kZWNCdWZmZXJDaGFubmVsKHN0ZDo6bWFrZV9zaGFyZWQ8Q0NvZGVjQ2FsbGJhY2tJbXBsPih0aGlzKSkpLAorICAgICAgbVF1ZXVlZFdvcmtDb3VudCgwKSB7Cit9CisKK0NDb2RlYzo6fkNDb2RlYygpIHsKK30KKworc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlckNoYW5uZWxCYXNlPiBDQ29kZWM6OmdldEJ1ZmZlckNoYW5uZWwoKSB7CisgICAgcmV0dXJuIG1DaGFubmVsOworfQorCitzdGF0dXNfdCBDQ29kZWM6OnRyeUFuZFJlcG9ydE9uRXJyb3Ioc3RkOjpmdW5jdGlvbjxzdGF0dXNfdCgpPiBqb2IpIHsKKyAgICBzdGF0dXNfdCBlcnIgPSBqb2IoKTsKKyAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgIG1DYWxsYmFjay0+b25FcnJvcihlcnIsIEFDVElPTl9DT0RFX0ZBVEFMKTsKKyAgICB9CisgICAgcmV0dXJuIGVycjsKK30KKwordm9pZCBDQ29kZWM6OmluaXRpYXRlQWxsb2NhdGVDb21wb25lbnQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBhdXRvIHNldEFsbG9jYXRpbmcgPSBbdGhpc10geworICAgICAgICBNdXRleGVkPFN0YXRlPjo6TG9ja2VkIHN0YXRlKG1TdGF0ZSk7CisgICAgICAgIGlmIChzdGF0ZS0+Z2V0KCkgIT0gUkVMRUFTRUQpIHsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorICAgICAgICBzdGF0ZS0+c2V0KEFMTE9DQVRJTkcpOworICAgICAgICByZXR1cm4gT0s7CisgICAgfTsKKyAgICBpZiAodHJ5QW5kUmVwb3J0T25FcnJvcihzZXRBbGxvY2F0aW5nKSAhPSBPSykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3A8UmVmQmFzZT4gY29kZWNJbmZvOworICAgIENIRUNLKG1zZy0+ZmluZE9iamVjdCgiY29kZWNJbmZvIiwgJmNvZGVjSW5mbykpOworICAgIC8vIEZvciBDb2RlYyAyLjAgY29tcG9uZW50cywgY29tcG9uZW50TmFtZSA9PSBjb2RlY0luZm8tPmdldENvZGVjTmFtZSgpLgorCisgICAgc3A8QU1lc3NhZ2U+IGFsbG9jTXNnKG5ldyBBTWVzc2FnZShrV2hhdEFsbG9jYXRlLCB0aGlzKSk7CisgICAgYWxsb2NNc2ctPnNldE9iamVjdCgiY29kZWNJbmZvIiwgY29kZWNJbmZvKTsKKyAgICBhbGxvY01zZy0+cG9zdCgpOworfQorCit2b2lkIENDb2RlYzo6YWxsb2NhdGUoY29uc3Qgc3A8TWVkaWFDb2RlY0luZm8+ICZjb2RlY0luZm8pIHsKKyAgICBpZiAoY29kZWNJbmZvID09IG51bGxwdHIpIHsKKyAgICAgICAgbUNhbGxiYWNrLT5vbkVycm9yKFVOS05PV05fRVJST1IsIEFDVElPTl9DT0RFX0ZBVEFMKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBTE9HRCgiYWxsb2NhdGUoJXMpIiwgY29kZWNJbmZvLT5nZXRDb2RlY05hbWUoKSk7CisgICAgbUNsaWVudExpc3RlbmVyLnJlc2V0KG5ldyBDbGllbnRMaXN0ZW5lcih0aGlzKSk7CisKKyAgICBBU3RyaW5nIGNvbXBvbmVudE5hbWUgPSBjb2RlY0luZm8tPmdldENvZGVjTmFtZSgpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ+IGNsaWVudDsKKworICAgIC8vIHNldCB1cCBwcmVmZXJyZWQgY29tcG9uZW50IHN0b3JlIHRvIGFjY2VzcyB2ZW5kb3Igc3RvcmUgcGFyYW1ldGVycworICAgIGNsaWVudCA9IENvZGVjMkNsaWVudDo6Q3JlYXRlRnJvbVNlcnZpY2UoImRlZmF1bHQiLCBmYWxzZSk7CisgICAgaWYgKGNsaWVudCkgeworICAgICAgICBBTE9HSSgic2V0dGluZyB1cCAnJXMnIGFzIGRlZmF1bHQgKHZlbmRvcikgc3RvcmUiLCBjbGllbnQtPmdldEluc3RhbmNlTmFtZSgpLmNfc3RyKCkpOworICAgICAgICBTZXRQcmVmZXJyZWRDb2RlYzJDb21wb25lbnRTdG9yZSgKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPENvZGVjMkNsaWVudEludGVyZmFjZVdyYXBwZXI+KGNsaWVudCkpOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gY29tcCA9CisgICAgICAgICAgICBDb2RlYzJDbGllbnQ6OkNyZWF0ZUNvbXBvbmVudEJ5TmFtZSgKKyAgICAgICAgICAgIGNvbXBvbmVudE5hbWUuY19zdHIoKSwKKyAgICAgICAgICAgIG1DbGllbnRMaXN0ZW5lciwKKyAgICAgICAgICAgICZjbGllbnQpOworICAgIGlmICghY29tcCkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIENyZWF0ZSBjb21wb25lbnQ6ICVzIiwgY29tcG9uZW50TmFtZS5jX3N0cigpKTsKKyAgICAgICAgTXV0ZXhlZDxTdGF0ZT46OkxvY2tlZCBzdGF0ZShtU3RhdGUpOworICAgICAgICBzdGF0ZS0+c2V0KFJFTEVBU0VEKTsKKyAgICAgICAgc3RhdGUudW5sb2NrKCk7CisgICAgICAgIG1DYWxsYmFjay0+b25FcnJvcihVTktOT1dOX0VSUk9SLCBBQ1RJT05fQ09ERV9GQVRBTCk7CisgICAgICAgIHN0YXRlLmxvY2soKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBTE9HSSgiQ3JlYXRlZCBjb21wb25lbnQgWyVzXSIsIGNvbXBvbmVudE5hbWUuY19zdHIoKSk7CisgICAgbUNoYW5uZWwtPnNldENvbXBvbmVudChjb21wKTsKKyAgICBhdXRvIHNldEFsbG9jYXRlZCA9IFt0aGlzLCBjb21wLCBjbGllbnRdIHsKKyAgICAgICAgTXV0ZXhlZDxTdGF0ZT46OkxvY2tlZCBzdGF0ZShtU3RhdGUpOworICAgICAgICBpZiAoc3RhdGUtPmdldCgpICE9IEFMTE9DQVRJTkcpIHsKKyAgICAgICAgICAgIHN0YXRlLT5zZXQoUkVMRUFTRUQpOworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgc3RhdGUtPnNldChBTExPQ0FURUQpOworICAgICAgICBzdGF0ZS0+Y29tcCA9IGNvbXA7CisgICAgICAgIG1DbGllbnQgPSBjbGllbnQ7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9OworICAgIGlmICh0cnlBbmRSZXBvcnRPbkVycm9yKHNldEFsbG9jYXRlZCkgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIGluaXRpYWxpemUgY29uZmlnIGhlcmUgaW4gY2FzZSBzZXRQYXJhbWV0ZXJzIGlzIGNhbGxlZCBwcmlvciB0byBjb25maWd1cmUKKyAgICBNdXRleGVkPENvbmZpZz46OkxvY2tlZCBjb25maWcobUNvbmZpZyk7CisgICAgc3RhdHVzX3QgZXJyID0gY29uZmlnLT5pbml0aWFsaXplKG1DbGllbnQsIGNvbXApOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgQUxPR1coIkZhaWxlZCB0byBpbml0aWFsaXplIGNvbmZpZ3VyYXRpb24gc3VwcG9ydCIpOworICAgICAgICAvLyBUT0RPOiByZXBvcnQgZXJyb3Igb25jZSB3ZSBjb21wbGV0ZSBpbXBsZW1lbnRhdGlvbi4KKyAgICB9CisgICAgY29uZmlnLT5xdWVyeUNvbmZpZ3VyYXRpb24oY29tcCk7CisKKyAgICBtQ2FsbGJhY2stPm9uQ29tcG9uZW50QWxsb2NhdGVkKGNvbXBvbmVudE5hbWUuY19zdHIoKSk7Cit9CisKK3ZvaWQgQ0NvZGVjOjppbml0aWF0ZUNvbmZpZ3VyZUNvbXBvbmVudChjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCkgeworICAgIGF1dG8gY2hlY2tBbGxvY2F0ZWQgPSBbdGhpc10geworICAgICAgICBNdXRleGVkPFN0YXRlPjo6TG9ja2VkIHN0YXRlKG1TdGF0ZSk7CisgICAgICAgIHJldHVybiAoc3RhdGUtPmdldCgpICE9IEFMTE9DQVRFRCkgPyBVTktOT1dOX0VSUk9SIDogT0s7CisgICAgfTsKKyAgICBpZiAodHJ5QW5kUmVwb3J0T25FcnJvcihjaGVja0FsbG9jYXRlZCkgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHNwPEFNZXNzYWdlPiBtc2cobmV3IEFNZXNzYWdlKGtXaGF0Q29uZmlndXJlLCB0aGlzKSk7CisgICAgbXNnLT5zZXRNZXNzYWdlKCJmb3JtYXQiLCBmb3JtYXQpOworICAgIG1zZy0+cG9zdCgpOworfQorCit2b2lkIENDb2RlYzo6Y29uZmlndXJlKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiBjb21wOworICAgIGF1dG8gY2hlY2tBbGxvY2F0ZWQgPSBbdGhpcywgJmNvbXBdIHsKKyAgICAgICAgTXV0ZXhlZDxTdGF0ZT46OkxvY2tlZCBzdGF0ZShtU3RhdGUpOworICAgICAgICBpZiAoc3RhdGUtPmdldCgpICE9IEFMTE9DQVRFRCkgeworICAgICAgICAgICAgc3RhdGUtPnNldChSRUxFQVNFRCk7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBjb21wID0gc3RhdGUtPmNvbXA7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9OworICAgIGlmICh0cnlBbmRSZXBvcnRPbkVycm9yKGNoZWNrQWxsb2NhdGVkKSAhPSBPSykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYXV0byBkb0NvbmZpZyA9IFttc2csIGNvbXAsIHRoaXNdKCkgLT4gc3RhdHVzX3QgeworICAgICAgICBBU3RyaW5nIG1pbWU7CisgICAgICAgIGlmICghbXNnLT5maW5kU3RyaW5nKCJtaW1lIiwgJm1pbWUpKSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisKKyAgICAgICAgaW50MzJfdCBlbmNvZGVyOworICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJlbmNvZGVyIiwgJmVuY29kZXIpKSB7CisgICAgICAgICAgICBlbmNvZGVyID0gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyBUT0RPOiByZWFkIGZyb20gaW50ZigpCisgICAgICAgIGlmICgoIWVuY29kZXIpICE9IChjb21wLT5nZXROYW1lKCkuZmluZCgiZW5jb2RlciIpID09IHN0ZDo6c3RyaW5nOjpucG9zKSkgeworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBpbnQzMl90IHN0b3JlTWV0YTsKKyAgICAgICAgaWYgKGVuY29kZXIKKyAgICAgICAgICAgICAgICAmJiBtc2ctPmZpbmRJbnQzMigiYW5kcm9pZC5faW5wdXQtbWV0YWRhdGEtYnVmZmVyLXR5cGUiLCAmc3RvcmVNZXRhKQorICAgICAgICAgICAgICAgICYmIHN0b3JlTWV0YSAhPSBrTWV0YWRhdGFCdWZmZXJUeXBlSW52YWxpZCkgeworICAgICAgICAgICAgaWYgKHN0b3JlTWV0YSAhPSBrTWV0YWRhdGFCdWZmZXJUeXBlQU5XQnVmZmVyKSB7CisgICAgICAgICAgICAgICAgQUxPR0QoIk9ubHkgQU5XIGJ1ZmZlcnMgYXJlIHN1cHBvcnRlZCBmb3IgbGVnYWN5IG1ldGFkYXRhIG1vZGUiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUNoYW5uZWwtPnNldE1ldGFNb2RlKENDb2RlY0J1ZmZlckNoYW5uZWw6Ok1PREVfQU5XKTsKKyAgICAgICAgfQorCisgICAgICAgIHNwPFJlZkJhc2U+IG9iajsKKyAgICAgICAgc3A8U3VyZmFjZT4gc3VyZmFjZTsKKyAgICAgICAgaWYgKG1zZy0+ZmluZE9iamVjdCgibmF0aXZlLXdpbmRvdyIsICZvYmopKSB7CisgICAgICAgICAgICBzdXJmYWNlID0gc3RhdGljX2Nhc3Q8U3VyZmFjZSAqPihvYmouZ2V0KCkpOworICAgICAgICAgICAgc2V0U3VyZmFjZShzdXJmYWNlKTsKKyAgICAgICAgfQorCisgICAgICAgIE11dGV4ZWQ8Q29uZmlnPjo6TG9ja2VkIGNvbmZpZyhtQ29uZmlnKTsKKyAgICAgICAgY29uZmlnLT5tVXNpbmdTdXJmYWNlID0gc3VyZmFjZSAhPSBudWxscHRyOworCisgICAgICAgIC8qCisgICAgICAgICAqIEhhbmRsZSBpbnB1dCBzdXJmYWNlIGNvbmZpZ3VyYXRpb24KKyAgICAgICAgICovCisgICAgICAgIGlmICgoY29uZmlnLT5tRG9tYWluICYgKENvbmZpZzo6SVNfVklERU8gfCBDb25maWc6OklTX0lNQUdFKSkKKyAgICAgICAgICAgICAgICAmJiAoY29uZmlnLT5tRG9tYWluICYgQ29uZmlnOjpJU19FTkNPREVSKSkgeworICAgICAgICAgICAgY29uZmlnLT5tSVNDb25maWcucmVzZXQobmV3IElucHV0U3VyZmFjZVdyYXBwZXI6OkNvbmZpZ3t9KTsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb25maWctPm1JU0NvbmZpZy0+bU1pbkZwcyA9IDA7CisgICAgICAgICAgICAgICAgaW50NjRfdCB2YWx1ZTsKKyAgICAgICAgICAgICAgICBpZiAobXNnLT5maW5kSW50NjQoInJlcGVhdC1wcmV2aW91cy1mcmFtZS1hZnRlciIsICZ2YWx1ZSkgJiYgdmFsdWUgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+bUlTQ29uZmlnLT5tTWluRnBzID0gMWU2IC8gdmFsdWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICh2b2lkKW1zZy0+ZmluZEZsb2F0KCJtYXgtZnBzLXRvLWVuY29kZXIiLCAmY29uZmlnLT5tSVNDb25maWctPm1NYXhGcHMpOworICAgICAgICAgICAgICAgIGNvbmZpZy0+bUlTQ29uZmlnLT5tTWluQWRqdXN0ZWRGcHMgPSAwOworICAgICAgICAgICAgICAgIGNvbmZpZy0+bUlTQ29uZmlnLT5tRml4ZWRBZGp1c3RlZEZwcyA9IDA7CisgICAgICAgICAgICAgICAgaWYgKG1zZy0+ZmluZEludDY0KCJtYXgtcHRzLWdhcC10by1lbmNvZGVyIiwgJnZhbHVlKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPCAwICYmIHZhbHVlID49IElOVDMyX01JTikgeworICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5tSVNDb25maWctPm1GaXhlZEFkanVzdGVkRnBzID0gLTFlNiAvIHZhbHVlOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID4gMCAmJiB2YWx1ZSA8PSBJTlQzMl9NQVgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+bUlTQ29uZmlnLT5tTWluQWRqdXN0ZWRGcHMgPSAxZTYgLyB2YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRvdWJsZSB2YWx1ZTsKKyAgICAgICAgICAgICAgICBpZiAobXNnLT5maW5kRG91YmxlKCJ0aW1lLWxhcHNlLWZwcyIsICZ2YWx1ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5tSVNDb25maWctPm1DYXB0dXJlRnBzID0gdmFsdWU7CisgICAgICAgICAgICAgICAgICAgICh2b2lkKW1zZy0+ZmluZEFzRmxvYXQoS0VZX0ZSQU1FX1JBVEUsICZjb25maWctPm1JU0NvbmZpZy0+bUNvZGVkRnBzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb25maWctPm1JU0NvbmZpZy0+bVN1c3BlbmRlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGNvbmZpZy0+bUlTQ29uZmlnLT5tU3VzcGVuZEF0VXMgPSAtMTsKKyAgICAgICAgICAgICAgICBpbnQzMl90IHZhbHVlOworICAgICAgICAgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMigiY3JlYXRlLWlucHV0LWJ1ZmZlcnMtc3VzcGVuZGVkIiwgJnZhbHVlKSAmJiB2YWx1ZSkgeworICAgICAgICAgICAgICAgICAgICBjb25maWctPm1JU0NvbmZpZy0+bVN1c3BlbmRlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogSGFuZGxlIGRlc2lyZWQgY29sb3IgZm9ybWF0LgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKChjb25maWctPm1Eb21haW4gJiAoQ29uZmlnOjpJU19WSURFTyB8IENvbmZpZzo6SVNfSU1BR0UpKSkgeworICAgICAgICAgICAgaW50MzJfdCBmb3JtYXQgPSAtMTsKKyAgICAgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoS0VZX0NPTE9SX0ZPUk1BVCwgJmZvcm1hdCkpIHsKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIEFsc28gaGFuZGxlIGRlZmF1bHQgY29sb3IgZm9ybWF0IChlbmNvZGVycyByZXF1aXJlIGNvbG9yIGZvcm1hdCwgc28gdGhpcyBpcyBvbmx5CisgICAgICAgICAgICAgICAgICogbmVlZGVkIGZvciBkZWNvZGVycy4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBpZiAoIShjb25maWctPm1Eb21haW4gJiBDb25maWc6OklTX0VOQ09ERVIpKSB7CisgICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9IChzdXJmYWNlID09IG51bGxwdHIpID8gQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyIDogQ09MT1JfRm9ybWF0U3VyZmFjZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmb3JtYXQgPj0gMCkgeworICAgICAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoImFuZHJvaWQuX2NvbG9yLWZvcm1hdCIsIGZvcm1hdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IGNvbmZpZ1VwZGF0ZTsKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gY29uZmlnLT5nZXRDb25maWdVcGRhdGVGcm9tU2RrUGFyYW1zKAorICAgICAgICAgICAgICAgIGNvbXAsIG1zZywgQ29uZmlnOjpJU19DT05GSUcsIEMyX0RPTlRfQkxPQ0ssICZjb25maWdVcGRhdGUpOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HVygiZmFpbGVkIHRvIGNvbnZlcnQgY29uZmlndXJhdGlvbiB0byBjMiBwYXJhbXMiKTsKKyAgICAgICAgfQorICAgICAgICBlcnIgPSBjb25maWctPnNldFBhcmFtZXRlcnMoY29tcCwgY29uZmlnVXBkYXRlLCBDMl9ET05UX0JMT0NLKTsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgQUxPR1coImZhaWxlZCB0byBjb25maWd1cmUgYzIgcGFyYW1zIik7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiBwYXJhbXM7CisgICAgICAgIEMyU3RyZWFtVXNhZ2VUdW5pbmc6OmlucHV0IHVzYWdlKDB1LCAwdSk7CisgICAgICAgIEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0IG1heElucHV0U2l6ZSgwdSwgMHUpOworCisgICAgICAgIHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxDMlBhcmFtOjpJbmRleD4gaW5kaWNlcyB7CisgICAgICAgIH07CisgICAgICAgIGMyX3N0YXR1c190IGMyZXJyID0gY29tcC0+cXVlcnkoCisgICAgICAgICAgICAgICAgeyAmdXNhZ2UsICZtYXhJbnB1dFNpemUgfSwKKyAgICAgICAgICAgICAgICBpbmRpY2VzLAorICAgICAgICAgICAgICAgIEMyX0RPTlRfQkxPQ0ssCisgICAgICAgICAgICAgICAgJnBhcmFtcyk7CisgICAgICAgIGlmIChjMmVyciAhPSBDMl9PSyAmJiBjMmVyciAhPSBDMl9CQURfSU5ERVgpIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gcXVlcnkgY29tcG9uZW50IGludGVyZmFjZTogJWQiLCBjMmVycik7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBpZiAocGFyYW1zLnNpemUoKSAhPSBpbmRpY2VzLnNpemUoKSkgeworICAgICAgICAgICAgQUxPR0UoIkNvbXBvbmVudCByZXR1cm5zIHdyb25nIG51bWJlciBvZiBwYXJhbXM6IGV4cGVjdGVkICV6dSBhY3R1YWwgJXp1IiwKKyAgICAgICAgICAgICAgICAgICAgaW5kaWNlcy5zaXplKCksIHBhcmFtcy5zaXplKCkpOworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHVzYWdlICYmICh1c2FnZS52YWx1ZSAmIEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFEKSkgeworICAgICAgICAgICAgY29uZmlnLT5tSW5wdXRGb3JtYXQtPnNldEludDMyKCJ1c2luZy1zdy1yZWFkLW9mdGVuIiwgdHJ1ZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBOT1RFOiB3ZSBkb24ndCBibGluZGx5IHVzZSBjbGllbnQgc3BlY2lmaWVkIGlucHV0IHNpemUgaWYgc3BlY2lmaWVkIGFzIGNsaWVudHMKKyAgICAgICAgLy8gYXQgdGltZXMgc3BlY2lmeSB0b28gc21hbGwgc2l6ZS4gSW5zdGVhZCwgbWltaWMgdGhlIGJlaGF2aW9yIGZyb20gT01YLCB3aGVyZSB0aGUKKyAgICAgICAgLy8gY2xpZW50IHNwZWNpZmllZCBzaXplIGlzIG9ubHkgdXNlZCB0byBhc2sgZm9yIGJpZ2dlciBidWZmZXJzIHRoYW4gY29tcG9uZW50IHN1Z2dlc3RlZAorICAgICAgICAvLyBzaXplLgorICAgICAgICBpbnQzMl90IGNsaWVudElucHV0U2l6ZSA9IDA7CisgICAgICAgIGJvb2wgY2xpZW50U3BlY2lmaWVkSW5wdXRTaXplID0KKyAgICAgICAgICAgIG1zZy0+ZmluZEludDMyKEtFWV9NQVhfSU5QVVRfU0laRSwgJmNsaWVudElucHV0U2l6ZSkgJiYgY2xpZW50SW5wdXRTaXplID4gMDsKKyAgICAgICAgLy8gVEVNUDogZW5mb3JjZSBtaW5pbXVtIGJ1ZmZlciBzaXplIG9mIDFNQiBmb3IgdmlkZW8gZGVjb2RlcnMKKyAgICAgICAgLy8gYW5kIDE2SyAvIDRLIGZvciBhdWRpbyBlbmNvZGVycy9kZWNvZGVycworICAgICAgICBpZiAobWF4SW5wdXRTaXplLnZhbHVlID09IDApIHsKKyAgICAgICAgICAgIGlmIChjb25maWctPm1Eb21haW4gJiBDb25maWc6OklTX0FVRElPKSB7CisgICAgICAgICAgICAgICAgbWF4SW5wdXRTaXplLnZhbHVlID0gZW5jb2RlciA/IDE2Mzg0IDogNDA5NjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIWVuY29kZXIpIHsKKyAgICAgICAgICAgICAgICBtYXhJbnB1dFNpemUudmFsdWUgPSAxMDQ4NTc2dTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIHZlcmlmeSB0aGF0IENTRCBmaXRzIGludG8gdGhpcyBzaXplIChpZiBkZWZpbmVkKQorICAgICAgICBpZiAoKGNvbmZpZy0+bURvbWFpbiAmIENvbmZpZzo6SVNfREVDT0RFUikgJiYgbWF4SW5wdXRTaXplLnZhbHVlID4gMCkgeworICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gY3NkOworICAgICAgICAgICAgZm9yIChzaXplX3QgaXggPSAwOyBtc2ctPmZpbmRCdWZmZXIoU3RyaW5nUHJpbnRmKCJjc2QtJXp1IiwgaXgpLmNfc3RyKCksICZjc2QpOyArK2l4KSB7CisgICAgICAgICAgICAgICAgaWYgKGNzZCAmJiBjc2QtPnNpemUoKSA+IG1heElucHV0U2l6ZS52YWx1ZSkgeworICAgICAgICAgICAgICAgICAgICBtYXhJbnB1dFNpemUudmFsdWUgPSBjc2QtPnNpemUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBUT0RPOiBkbyB0aGlzIGJhc2VkIG9uIGNvbXBvbmVudCByZXF1aXJpbmcgbGluZWFyIGFsbG9jYXRvciBmb3IgaW5wdXQKKyAgICAgICAgaWYgKChjb25maWctPm1Eb21haW4gJiBDb25maWc6OklTX0RFQ09ERVIpIHx8IChjb25maWctPm1Eb21haW4gJiBDb25maWc6OklTX0FVRElPKSkgeworICAgICAgICAgICAgaWYgKGNsaWVudFNwZWNpZmllZElucHV0U2l6ZSkgeworICAgICAgICAgICAgICAgIC8vIFdhcm4gdGhhdCB3ZSdyZSBvdmVycmlkaW5nIGNsaWVudCdzIG1heCBpbnB1dCBzaXplIGlmIG5lY2Vzc2FyeS4KKyAgICAgICAgICAgICAgICBpZiAoKHVpbnQzMl90KWNsaWVudElucHV0U2l6ZSA8IG1heElucHV0U2l6ZS52YWx1ZSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRCgiY2xpZW50IHJlcXVlc3RlZCBtYXggaW5wdXQgc2l6ZSAlZCwgd2hpY2ggaXMgc21hbGxlciB0aGFuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIndoYXQgY29tcG9uZW50IHJlY29tbWVuZGVkICgldSk7IG92ZXJyaWRpbmcgd2l0aCBjb21wb25lbnQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAicmVjb21tZW5kYXRpb24uIiwgY2xpZW50SW5wdXRTaXplLCBtYXhJbnB1dFNpemUudmFsdWUpOworICAgICAgICAgICAgICAgICAgICBBTE9HVygiVGhpcyBiZWhhdmlvciBpcyBzdWJqZWN0IHRvIGNoYW5nZS4gSXQgaXMgcmVjb21tZW5kZWQgdGhhdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJhcHAgZGV2ZWxvcGVycyBkb3VibGUgY2hlY2sgd2hldGhlciB0aGUgcmVxdWVzdGVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIm1heCBpbnB1dCBzaXplIGlzIGluIHJlYXNvbmFibGUgcmFuZ2UuIik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbWF4SW5wdXRTaXplLnZhbHVlID0gY2xpZW50SW5wdXRTaXplOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFBhc3MgbWF4IGlucHV0IHNpemUgb24gaW5wdXQgZm9ybWF0IHRvIHRoZSBidWZmZXIgY2hhbm5lbCAoaWYgc3VwcGxpZWQgYnkgdGhlCisgICAgICAgICAgICAvLyBjb21wb25lbnQgb3IgYnkgYSBkZWZhdWx0KQorICAgICAgICAgICAgaWYgKG1heElucHV0U2l6ZS52YWx1ZSkgeworICAgICAgICAgICAgICAgIGNvbmZpZy0+bUlucHV0Rm9ybWF0LT5zZXRJbnQzMigKKyAgICAgICAgICAgICAgICAgICAgICAgIEtFWV9NQVhfSU5QVVRfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChpbnQzMl90KShjMl9taW4obWF4SW5wdXRTaXplLnZhbHVlLCB1aW50MzJfdChJTlQzMl9NQVgpKSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKChjb25maWctPm1Eb21haW4gJiAoQ29uZmlnOjpJU19WSURFTyB8IENvbmZpZzo6SVNfSU1BR0UpKSkgeworICAgICAgICAgICAgLy8gcHJvcGFnYXRlIEhEUiBzdGF0aWMgaW5mbyB0byBvdXRwdXQgZm9ybWF0IGZvciBib3RoIGVuY29kZXJzIGFuZCBkZWNvZGVycworICAgICAgICAgICAgLy8gaWYgY29tcG9uZW50IHN1cHBvcnRzIHRoaXMgaW5mbywgd2Ugd2lsbCB1cGRhdGUgZnJvbSBjb21wb25lbnQsIGJ1dCBvbmx5IHRoZSByYXcgcG9ydCwKKyAgICAgICAgICAgIC8vIHNvIGRvbid0IHByb3BhZ2F0ZSBpZiBjb21wb25lbnQgYWxyZWFkeSBmaWxsZWQgaXQgaW4uCisgICAgICAgICAgICBzcDxBQnVmZmVyPiBoZHJJbmZvOworICAgICAgICAgICAgaWYgKG1zZy0+ZmluZEJ1ZmZlcihLRVlfSERSX1NUQVRJQ19JTkZPLCAmaGRySW5mbykKKyAgICAgICAgICAgICAgICAgICAgJiYgIWNvbmZpZy0+bU91dHB1dEZvcm1hdC0+ZmluZEJ1ZmZlcihLRVlfSERSX1NUQVRJQ19JTkZPLCAmaGRySW5mbykpIHsKKyAgICAgICAgICAgICAgICBjb25maWctPm1PdXRwdXRGb3JtYXQtPnNldEJ1ZmZlcihLRVlfSERSX1NUQVRJQ19JTkZPLCBoZHJJbmZvKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gU2V0IGRlc2lyZWQgY29sb3IgZm9ybWF0IGZyb20gY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIKKyAgICAgICAgICAgIGludDMyX3QgZm9ybWF0OworICAgICAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKCJhbmRyb2lkLl9jb2xvci1mb3JtYXQiLCAmZm9ybWF0KSkgeworICAgICAgICAgICAgICAgIGlmIChjb25maWctPm1Eb21haW4gJiBDb25maWc6OklTX0VOQ09ERVIpIHsKKyAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5tSW5wdXRGb3JtYXQtPnNldEludDMyKEtFWV9DT0xPUl9GT1JNQVQsIGZvcm1hdCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5tT3V0cHV0Rm9ybWF0LT5zZXRJbnQzMihLRVlfQ09MT1JfRk9STUFULCBmb3JtYXQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIHByb3BhZ2F0ZSBlbmNvZGVyIGRlbGF5IGFuZCBwYWRkaW5nIHRvIG91dHB1dCBmb3JtYXQKKyAgICAgICAgaWYgKChjb25maWctPm1Eb21haW4gJiBDb25maWc6OklTX0RFQ09ERVIpICYmIChjb25maWctPm1Eb21haW4gJiBDb25maWc6OklTX0FVRElPKSkgeworICAgICAgICAgICAgaW50IGRlbGF5ID0gMDsKKyAgICAgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMigiZW5jb2Rlci1kZWxheSIsICZkZWxheSkpIHsKKyAgICAgICAgICAgICAgICBjb25maWctPm1PdXRwdXRGb3JtYXQtPnNldEludDMyKCJlbmNvZGVyLWRlbGF5IiwgZGVsYXkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IHBhZGRpbmcgPSAwOworICAgICAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKCJlbmNvZGVyLXBhZGRpbmciLCAmcGFkZGluZykpIHsKKyAgICAgICAgICAgICAgICBjb25maWctPm1PdXRwdXRGb3JtYXQtPnNldEludDMyKCJlbmNvZGVyLXBhZGRpbmciLCBwYWRkaW5nKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIHNldCBjaGFubmVsLW1hc2sKKyAgICAgICAgaWYgKGNvbmZpZy0+bURvbWFpbiAmIENvbmZpZzo6SVNfQVVESU8pIHsKKyAgICAgICAgICAgIGludDMyX3QgbWFzazsKKyAgICAgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMihLRVlfQ0hBTk5FTF9NQVNLLCAmbWFzaykpIHsKKyAgICAgICAgICAgICAgICBpZiAoY29uZmlnLT5tRG9tYWluICYgQ29uZmlnOjpJU19FTkNPREVSKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+bUlucHV0Rm9ybWF0LT5zZXRJbnQzMihLRVlfQ0hBTk5FTF9NQVNLLCBtYXNrKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBjb25maWctPm1PdXRwdXRGb3JtYXQtPnNldEludDMyKEtFWV9DSEFOTkVMX01BU0ssIG1hc2spOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEFMT0dEKCJzZXR1cCBmb3JtYXRzIGlucHV0OiAlcyBhbmQgb3V0cHV0OiAlcyIsCisgICAgICAgICAgICAgICAgY29uZmlnLT5tSW5wdXRGb3JtYXQtPmRlYnVnU3RyaW5nKCkuY19zdHIoKSwKKyAgICAgICAgICAgICAgICBjb25maWctPm1PdXRwdXRGb3JtYXQtPmRlYnVnU3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9OworICAgIGlmICh0cnlBbmRSZXBvcnRPbkVycm9yKGRvQ29uZmlnKSAhPSBPSykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgTXV0ZXhlZDxDb25maWc+OjpMb2NrZWQgY29uZmlnKG1Db25maWcpOworCisgICAgbUNhbGxiYWNrLT5vbkNvbXBvbmVudENvbmZpZ3VyZWQoY29uZmlnLT5tSW5wdXRGb3JtYXQsIGNvbmZpZy0+bU91dHB1dEZvcm1hdCk7Cit9CisKK3ZvaWQgQ0NvZGVjOjppbml0aWF0ZUNyZWF0ZUlucHV0U3VyZmFjZSgpIHsKKyAgICBzdGF0dXNfdCBlcnIgPSBbdGhpc10geworICAgICAgICBNdXRleGVkPFN0YXRlPjo6TG9ja2VkIHN0YXRlKG1TdGF0ZSk7CisgICAgICAgIGlmIChzdGF0ZS0+Z2V0KCkgIT0gQUxMT0NBVEVEKSB7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICAvLyBUT0RPOiByZWFkIGl0IGZyb20gaW50ZigpIHByb3Blcmx5LgorICAgICAgICBpZiAoc3RhdGUtPmNvbXAtPmdldE5hbWUoKS5maW5kKCJlbmNvZGVyIikgPT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gT0s7CisgICAgfSgpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgbUNhbGxiYWNrLT5vbklucHV0U3VyZmFjZUNyZWF0aW9uRmFpbGVkKGVycik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAobmV3IEFNZXNzYWdlKGtXaGF0Q3JlYXRlSW5wdXRTdXJmYWNlLCB0aGlzKSktPnBvc3QoKTsKK30KKwordm9pZCBDQ29kZWM6OmNyZWF0ZUlucHV0U3VyZmFjZSgpIHsKKyAgICBzdGF0dXNfdCBlcnI7CisgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gYnVmZmVyUHJvZHVjZXI7CisKKyAgICBzcDxBTWVzc2FnZT4gaW5wdXRGb3JtYXQ7CisgICAgc3A8QU1lc3NhZ2U+IG91dHB1dEZvcm1hdDsKKyAgICB7CisgICAgICAgIE11dGV4ZWQ8Q29uZmlnPjo6TG9ja2VkIGNvbmZpZyhtQ29uZmlnKTsKKyAgICAgICAgaW5wdXRGb3JtYXQgPSBjb25maWctPm1JbnB1dEZvcm1hdDsKKyAgICAgICAgb3V0cHV0Rm9ybWF0ID0gY29uZmlnLT5tT3V0cHV0Rm9ybWF0OworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxQZXJzaXN0ZW50U3VyZmFjZT4gcGVyc2lzdGVudFN1cmZhY2UoQ3JlYXRlSW5wdXRTdXJmYWNlKCkpOworCisgICAgaWYgKHBlcnNpc3RlbnRTdXJmYWNlLT5nZXRIaWRsVGFyZ2V0KCkpIHsKKyAgICAgICAgc3A8SUlucHV0U3VyZmFjZT4gaW5wdXRTdXJmYWNlID0gSUlucHV0U3VyZmFjZTo6Y2FzdEZyb20oCisgICAgICAgICAgICAgICAgcGVyc2lzdGVudFN1cmZhY2UtPmdldEhpZGxUYXJnZXQoKSk7CisgICAgICAgIGlmICghaW5wdXRTdXJmYWNlKSB7CisgICAgICAgICAgICBBTE9HRSgiQ29ycnVwdGVkIGlucHV0IHN1cmZhY2UiKTsKKyAgICAgICAgICAgIG1DYWxsYmFjay0+b25JbnB1dFN1cmZhY2VDcmVhdGlvbkZhaWxlZChVTktOT1dOX0VSUk9SKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBlcnIgPSBzZXR1cElucHV0U3VyZmFjZShzdGQ6Om1ha2Vfc2hhcmVkPEMySW5wdXRTdXJmYWNlV3JhcHBlcj4oCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDb2RlYzJDbGllbnQ6OklucHV0U3VyZmFjZT4oaW5wdXRTdXJmYWNlKSkpOworICAgICAgICBidWZmZXJQcm9kdWNlciA9IG5ldyBIMkJHcmFwaGljQnVmZmVyUHJvZHVjZXIoaW5wdXRTdXJmYWNlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpbnQzMl90IHdpZHRoID0gMDsKKyAgICAgICAgKHZvaWQpb3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoIndpZHRoIiwgJndpZHRoKTsKKyAgICAgICAgaW50MzJfdCBoZWlnaHQgPSAwOworICAgICAgICAodm9pZClvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigiaGVpZ2h0IiwgJmhlaWdodCk7CisgICAgICAgIGVyciA9IHNldHVwSW5wdXRTdXJmYWNlKHN0ZDo6bWFrZV9zaGFyZWQ8R3JhcGhpY0J1ZmZlclNvdXJjZVdyYXBwZXI+KAorICAgICAgICAgICAgICAgIHBlcnNpc3RlbnRTdXJmYWNlLT5nZXRCdWZmZXJTb3VyY2UoKSwgd2lkdGgsIGhlaWdodCkpOworICAgICAgICBidWZmZXJQcm9kdWNlciA9IHBlcnNpc3RlbnRTdXJmYWNlLT5nZXRCdWZmZXJQcm9kdWNlcigpOworICAgIH0KKworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzZXQgdXAgaW5wdXQgc3VyZmFjZTogJWQiLCBlcnIpOworICAgICAgICBtQ2FsbGJhY2stPm9uSW5wdXRTdXJmYWNlQ3JlYXRpb25GYWlsZWQoZXJyKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG1DYWxsYmFjay0+b25JbnB1dFN1cmZhY2VDcmVhdGVkKAorICAgICAgICAgICAgaW5wdXRGb3JtYXQsCisgICAgICAgICAgICBvdXRwdXRGb3JtYXQsCisgICAgICAgICAgICBuZXcgQnVmZmVyUHJvZHVjZXJXcmFwcGVyKGJ1ZmZlclByb2R1Y2VyKSk7Cit9CisKK3N0YXR1c190IENDb2RlYzo6c2V0dXBJbnB1dFN1cmZhY2UoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElucHV0U3VyZmFjZVdyYXBwZXI+ICZzdXJmYWNlKSB7CisgICAgTXV0ZXhlZDxDb25maWc+OjpMb2NrZWQgY29uZmlnKG1Db25maWcpOworICAgIGNvbmZpZy0+bVVzaW5nU3VyZmFjZSA9IHRydWU7CisKKyAgICAvLyB3ZSBhcmUgbm93IHVzaW5nIHN1cmZhY2UgLSBhcHBseSBkZWZhdWx0IGNvbG9yIGFzcGVjdHMgdG8gaW5wdXQgZm9ybWF0IC0gYXMgd2VsbCBhcworICAgIC8vIGdldCBkYXRhc3BhY2UKKyAgICBib29sIGlucHV0Rm9ybWF0Q2hhbmdlZCA9IGNvbmZpZy0+dXBkYXRlRm9ybWF0cyhjb25maWctPklTX0lOUFVUKTsKKyAgICBBTE9HRCgiaW5wdXQgZm9ybWF0ICVzIHRvICVzIiwKKyAgICAgICAgICAgIGlucHV0Rm9ybWF0Q2hhbmdlZCA/ICJjaGFuZ2VkIiA6ICJ1bmNoYW5nZWQiLAorICAgICAgICAgICAgY29uZmlnLT5tSW5wdXRGb3JtYXQtPmRlYnVnU3RyaW5nKCkuY19zdHIoKSk7CisKKyAgICAvLyBjb25maWd1cmUgZGF0YXNwYWNlCisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoaW50MzJfdCkgPT0gc2l6ZW9mKGFuZHJvaWRfZGF0YXNwYWNlKSwgImRhdGFzcGFjZSBzaXplIG1pc21hdGNoIik7CisgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlID0gSEFMX0RBVEFTUEFDRV9VTktOT1dOOworICAgICh2b2lkKWNvbmZpZy0+bUlucHV0Rm9ybWF0LT5maW5kSW50MzIoImFuZHJvaWQuX2RhdGFzcGFjZSIsIChpbnQzMl90KikmZGF0YVNwYWNlKTsKKyAgICBzdXJmYWNlLT5zZXREYXRhU3BhY2UoZGF0YVNwYWNlKTsKKworICAgIHN0YXR1c190IGVyciA9IG1DaGFubmVsLT5zZXRJbnB1dFN1cmZhY2Uoc3VyZmFjZSk7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAvLyB1bmRvIGlucHV0IGZvcm1hdCB1cGRhdGUKKyAgICAgICAgY29uZmlnLT5tVXNpbmdTdXJmYWNlID0gZmFsc2U7CisgICAgICAgICh2b2lkKWNvbmZpZy0+dXBkYXRlRm9ybWF0cyhjb25maWctPklTX0lOUFVUKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisgICAgY29uZmlnLT5tSW5wdXRTdXJmYWNlID0gc3VyZmFjZTsKKworICAgIGlmIChjb25maWctPm1JU0NvbmZpZykgeworICAgICAgICBzdXJmYWNlLT5jb25maWd1cmUoKmNvbmZpZy0+bUlTQ29uZmlnKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRCgiSVNDb25maWc6IG5vIGNvbmZpZ3VyYXRpb24iKTsKKyAgICB9CisKKyAgICByZXR1cm4gc3VyZmFjZS0+c3RhcnQoKTsKK30KKwordm9pZCBDQ29kZWM6OmluaXRpYXRlU2V0SW5wdXRTdXJmYWNlKGNvbnN0IHNwPFBlcnNpc3RlbnRTdXJmYWNlPiAmc3VyZmFjZSkgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZXRJbnB1dFN1cmZhY2UsIHRoaXMpOworICAgIG1zZy0+c2V0T2JqZWN0KCJzdXJmYWNlIiwgc3VyZmFjZSk7CisgICAgbXNnLT5wb3N0KCk7Cit9CisKK3ZvaWQgQ0NvZGVjOjpzZXRJbnB1dFN1cmZhY2UoY29uc3Qgc3A8UGVyc2lzdGVudFN1cmZhY2U+ICZzdXJmYWNlKSB7CisgICAgc3A8QU1lc3NhZ2U+IGlucHV0Rm9ybWF0OworICAgIHNwPEFNZXNzYWdlPiBvdXRwdXRGb3JtYXQ7CisgICAgeworICAgICAgICBNdXRleGVkPENvbmZpZz46OkxvY2tlZCBjb25maWcobUNvbmZpZyk7CisgICAgICAgIGlucHV0Rm9ybWF0ID0gY29uZmlnLT5tSW5wdXRGb3JtYXQ7CisgICAgICAgIG91dHB1dEZvcm1hdCA9IGNvbmZpZy0+bU91dHB1dEZvcm1hdDsKKyAgICB9CisgICAgYXV0byBoaWRsVGFyZ2V0ID0gc3VyZmFjZS0+Z2V0SGlkbFRhcmdldCgpOworICAgIGlmIChoaWRsVGFyZ2V0KSB7CisgICAgICAgIHNwPElJbnB1dFN1cmZhY2U+IGlucHV0U3VyZmFjZSA9CisgICAgICAgICAgICAgICAgSUlucHV0U3VyZmFjZTo6Y2FzdEZyb20oaGlkbFRhcmdldCk7CisgICAgICAgIGlmICghaW5wdXRTdXJmYWNlKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHNldCBpbnB1dCBzdXJmYWNlOiBDb3JydXB0ZWQgc3VyZmFjZS4iKTsKKyAgICAgICAgICAgIG1DYWxsYmFjay0+b25JbnB1dFN1cmZhY2VEZWNsaW5lZChVTktOT1dOX0VSUk9SKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBzdGF0dXNfdCBlcnIgPSBzZXR1cElucHV0U3VyZmFjZShzdGQ6Om1ha2Vfc2hhcmVkPEMySW5wdXRTdXJmYWNlV3JhcHBlcj4oCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDb2RlYzJDbGllbnQ6OklucHV0U3VyZmFjZT4oaW5wdXRTdXJmYWNlKSkpOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHNldCB1cCBpbnB1dCBzdXJmYWNlOiAlZCIsIGVycik7CisgICAgICAgICAgICBtQ2FsbGJhY2stPm9uSW5wdXRTdXJmYWNlRGVjbGluZWQoZXJyKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGludDMyX3Qgd2lkdGggPSAwOworICAgICAgICAodm9pZClvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigid2lkdGgiLCAmd2lkdGgpOworICAgICAgICBpbnQzMl90IGhlaWdodCA9IDA7CisgICAgICAgICh2b2lkKW91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJoZWlnaHQiLCAmaGVpZ2h0KTsKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gc2V0dXBJbnB1dFN1cmZhY2Uoc3RkOjptYWtlX3NoYXJlZDxHcmFwaGljQnVmZmVyU291cmNlV3JhcHBlcj4oCisgICAgICAgICAgICAgICAgc3VyZmFjZS0+Z2V0QnVmZmVyU291cmNlKCksIHdpZHRoLCBoZWlnaHQpKTsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzZXQgdXAgaW5wdXQgc3VyZmFjZTogJWQiLCBlcnIpOworICAgICAgICAgICAgbUNhbGxiYWNrLT5vbklucHV0U3VyZmFjZURlY2xpbmVkKGVycik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgICAgbUNhbGxiYWNrLT5vbklucHV0U3VyZmFjZUFjY2VwdGVkKGlucHV0Rm9ybWF0LCBvdXRwdXRGb3JtYXQpOworfQorCit2b2lkIENDb2RlYzo6aW5pdGlhdGVTdGFydCgpIHsKKyAgICBhdXRvIHNldFN0YXJ0aW5nID0gW3RoaXNdIHsKKyAgICAgICAgTXV0ZXhlZDxTdGF0ZT46OkxvY2tlZCBzdGF0ZShtU3RhdGUpOworICAgICAgICBpZiAoc3RhdGUtPmdldCgpICE9IEFMTE9DQVRFRCkgeworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgc3RhdGUtPnNldChTVEFSVElORyk7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9OworICAgIGlmICh0cnlBbmRSZXBvcnRPbkVycm9yKHNldFN0YXJ0aW5nKSAhPSBPSykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgKG5ldyBBTWVzc2FnZShrV2hhdFN0YXJ0LCB0aGlzKSktPnBvc3QoKTsKK30KKwordm9pZCBDQ29kZWM6OnN0YXJ0KCkgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gY29tcDsKKyAgICBhdXRvIGNoZWNrU3RhcnRpbmcgPSBbdGhpcywgJmNvbXBdIHsKKyAgICAgICAgTXV0ZXhlZDxTdGF0ZT46OkxvY2tlZCBzdGF0ZShtU3RhdGUpOworICAgICAgICBpZiAoc3RhdGUtPmdldCgpICE9IFNUQVJUSU5HKSB7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBjb21wID0gc3RhdGUtPmNvbXA7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9OworICAgIGlmICh0cnlBbmRSZXBvcnRPbkVycm9yKGNoZWNrU3RhcnRpbmcpICE9IE9LKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBjb21wLT5zdGFydCgpOworICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgbUNhbGxiYWNrLT5vbkVycm9yKHRvU3RhdHVzVChlcnIsIEMyX09QRVJBVElPTl9Db21wb25lbnRfc3RhcnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQUNUSU9OX0NPREVfRkFUQUwpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHNwPEFNZXNzYWdlPiBpbnB1dEZvcm1hdDsKKyAgICBzcDxBTWVzc2FnZT4gb3V0cHV0Rm9ybWF0OworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxDb25maWc+OjpMb2NrZWQgY29uZmlnKG1Db25maWcpOworICAgICAgICBpbnB1dEZvcm1hdCA9IGNvbmZpZy0+bUlucHV0Rm9ybWF0OworICAgICAgICBvdXRwdXRGb3JtYXQgPSBjb25maWctPm1PdXRwdXRGb3JtYXQ7CisgICAgfQorICAgIHN0YXR1c190IGVycjIgPSBtQ2hhbm5lbC0+c3RhcnQoaW5wdXRGb3JtYXQsIG91dHB1dEZvcm1hdCk7CisgICAgaWYgKGVycjIgIT0gT0spIHsKKyAgICAgICAgbUNhbGxiYWNrLT5vbkVycm9yKGVycjIsIEFDVElPTl9DT0RFX0ZBVEFMKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGF1dG8gc2V0UnVubmluZyA9IFt0aGlzXSB7CisgICAgICAgIE11dGV4ZWQ8U3RhdGU+OjpMb2NrZWQgc3RhdGUobVN0YXRlKTsKKyAgICAgICAgaWYgKHN0YXRlLT5nZXQoKSAhPSBTVEFSVElORykgeworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgc3RhdGUtPnNldChSVU5OSU5HKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH07CisgICAgaWYgKHRyeUFuZFJlcG9ydE9uRXJyb3Ioc2V0UnVubmluZykgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtQ2FsbGJhY2stPm9uU3RhcnRDb21wbGV0ZWQoKTsKKworICAgICh2b2lkKW1DaGFubmVsLT5yZXF1ZXN0SW5pdGlhbElucHV0QnVmZmVycygpOworfQorCit2b2lkIENDb2RlYzo6aW5pdGlhdGVTaHV0ZG93bihib29sIGtlZXBDb21wb25lbnRBbGxvY2F0ZWQpIHsKKyAgICBpZiAoa2VlcENvbXBvbmVudEFsbG9jYXRlZCkgeworICAgICAgICBpbml0aWF0ZVN0b3AoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpbml0aWF0ZVJlbGVhc2UoKTsKKyAgICB9Cit9CisKK3ZvaWQgQ0NvZGVjOjppbml0aWF0ZVN0b3AoKSB7CisgICAgeworICAgICAgICBNdXRleGVkPFN0YXRlPjo6TG9ja2VkIHN0YXRlKG1TdGF0ZSk7CisgICAgICAgIGlmIChzdGF0ZS0+Z2V0KCkgPT0gQUxMT0NBVEVECisgICAgICAgICAgICAgICAgfHwgc3RhdGUtPmdldCgpICA9PSBSRUxFQVNFRAorICAgICAgICAgICAgICAgIHx8IHN0YXRlLT5nZXQoKSA9PSBTVE9QUElORworICAgICAgICAgICAgICAgIHx8IHN0YXRlLT5nZXQoKSA9PSBSRUxFQVNJTkcpIHsKKyAgICAgICAgICAgIC8vIFdlJ3JlIGFscmVhZHkgc3RvcHBlZCwgcmVsZWFzZWQsIG9yIGRvaW5nIGl0IHJpZ2h0IG5vdy4KKyAgICAgICAgICAgIHN0YXRlLnVubG9jaygpOworICAgICAgICAgICAgbUNhbGxiYWNrLT5vblN0b3BDb21wbGV0ZWQoKTsKKyAgICAgICAgICAgIHN0YXRlLmxvY2soKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBzdGF0ZS0+c2V0KFNUT1BQSU5HKTsKKyAgICB9CisKKyAgICBtQ2hhbm5lbC0+c3RvcCgpOworICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRTdG9wLCB0aGlzKSktPnBvc3QoKTsKK30KKwordm9pZCBDQ29kZWM6OnN0b3AoKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiBjb21wOworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxTdGF0ZT46OkxvY2tlZCBzdGF0ZShtU3RhdGUpOworICAgICAgICBpZiAoc3RhdGUtPmdldCgpID09IFJFTEVBU0lORykgeworICAgICAgICAgICAgc3RhdGUudW5sb2NrKCk7CisgICAgICAgICAgICAvLyBXZSdyZSBhbHJlYWR5IHN0b3BwZWQgb3IgcmVsZWFzZSBpcyBpbiBwcm9ncmVzcy4KKyAgICAgICAgICAgIG1DYWxsYmFjay0+b25TdG9wQ29tcGxldGVkKCk7CisgICAgICAgICAgICBzdGF0ZS5sb2NrKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gZWxzZSBpZiAoc3RhdGUtPmdldCgpICE9IFNUT1BQSU5HKSB7CisgICAgICAgICAgICBzdGF0ZS51bmxvY2soKTsKKyAgICAgICAgICAgIG1DYWxsYmFjay0+b25FcnJvcihVTktOT1dOX0VSUk9SLCBBQ1RJT05fQ09ERV9GQVRBTCk7CisgICAgICAgICAgICBzdGF0ZS5sb2NrKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgY29tcCA9IHN0YXRlLT5jb21wOworICAgIH0KKyAgICBzdGF0dXNfdCBlcnIgPSBjb21wLT5zdG9wKCk7CisgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAvLyBUT0RPOiBjb252ZXJ0IGVyciBpbnRvIHN0YXR1c190CisgICAgICAgIG1DYWxsYmFjay0+b25FcnJvcihVTktOT1dOX0VSUk9SLCBBQ1RJT05fQ09ERV9GQVRBTCk7CisgICAgfQorCisgICAgeworICAgICAgICBNdXRleGVkPFN0YXRlPjo6TG9ja2VkIHN0YXRlKG1TdGF0ZSk7CisgICAgICAgIGlmIChzdGF0ZS0+Z2V0KCkgPT0gU1RPUFBJTkcpIHsKKyAgICAgICAgICAgIHN0YXRlLT5zZXQoQUxMT0NBVEVEKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBtQ2FsbGJhY2stPm9uU3RvcENvbXBsZXRlZCgpOworfQorCit2b2lkIENDb2RlYzo6aW5pdGlhdGVSZWxlYXNlKGJvb2wgc2VuZENhbGxiYWNrIC8qID0gdHJ1ZSAqLykgeworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxTdGF0ZT46OkxvY2tlZCBzdGF0ZShtU3RhdGUpOworICAgICAgICBpZiAoc3RhdGUtPmdldCgpID09IFJFTEVBU0VEIHx8IHN0YXRlLT5nZXQoKSA9PSBSRUxFQVNJTkcpIHsKKyAgICAgICAgICAgIC8vIFdlJ3JlIGFscmVhZHkgcmVsZWFzZWQgb3IgZG9pbmcgaXQgcmlnaHQgbm93LgorICAgICAgICAgICAgaWYgKHNlbmRDYWxsYmFjaykgeworICAgICAgICAgICAgICAgIHN0YXRlLnVubG9jaygpOworICAgICAgICAgICAgICAgIG1DYWxsYmFjay0+b25SZWxlYXNlQ29tcGxldGVkKCk7CisgICAgICAgICAgICAgICAgc3RhdGUubG9jaygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChzdGF0ZS0+Z2V0KCkgPT0gQUxMT0NBVElORykgeworICAgICAgICAgICAgc3RhdGUtPnNldChSRUxFQVNJTkcpOworICAgICAgICAgICAgLy8gV2l0aCB0aGUgYWx0ZXJlZCBzdGF0ZSBhbGxvY2F0ZSgpIHdvdWxkIGZhaWwgYW5kIGNsZWFuIHVwLgorICAgICAgICAgICAgaWYgKHNlbmRDYWxsYmFjaykgeworICAgICAgICAgICAgICAgIHN0YXRlLnVubG9jaygpOworICAgICAgICAgICAgICAgIG1DYWxsYmFjay0+b25SZWxlYXNlQ29tcGxldGVkKCk7CisgICAgICAgICAgICAgICAgc3RhdGUubG9jaygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHN0YXRlLT5zZXQoUkVMRUFTSU5HKTsKKyAgICB9CisKKyAgICBtQ2hhbm5lbC0+c3RvcCgpOworICAgIC8vIHRoaXogaG9sZHMgc3Ryb25nIHJlZiB0byB0aGlzIHdoaWxlIHRoZSB0aHJlYWQgaXMgcnVubmluZy4KKyAgICBzcDxDQ29kZWM+IHRoaXoodGhpcyk7CisgICAgc3RkOjp0aHJlYWQoW3RoaXosIHNlbmRDYWxsYmFja10geyB0aGl6LT5yZWxlYXNlKHNlbmRDYWxsYmFjayk7IH0pLmRldGFjaCgpOworfQorCit2b2lkIENDb2RlYzo6cmVsZWFzZShib29sIHNlbmRDYWxsYmFjaykgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gY29tcDsKKyAgICB7CisgICAgICAgIE11dGV4ZWQ8U3RhdGU+OjpMb2NrZWQgc3RhdGUobVN0YXRlKTsKKyAgICAgICAgaWYgKHN0YXRlLT5nZXQoKSA9PSBSRUxFQVNFRCkgeworICAgICAgICAgICAgaWYgKHNlbmRDYWxsYmFjaykgeworICAgICAgICAgICAgICAgIHN0YXRlLnVubG9jaygpOworICAgICAgICAgICAgICAgIG1DYWxsYmFjay0+b25SZWxlYXNlQ29tcGxldGVkKCk7CisgICAgICAgICAgICAgICAgc3RhdGUubG9jaygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGNvbXAgPSBzdGF0ZS0+Y29tcDsKKyAgICB9CisgICAgY29tcC0+cmVsZWFzZSgpOworCisgICAgeworICAgICAgICBNdXRleGVkPFN0YXRlPjo6TG9ja2VkIHN0YXRlKG1TdGF0ZSk7CisgICAgICAgIHN0YXRlLT5zZXQoUkVMRUFTRUQpOworICAgICAgICBzdGF0ZS0+Y29tcC5yZXNldCgpOworICAgIH0KKyAgICBpZiAoc2VuZENhbGxiYWNrKSB7CisgICAgICAgIG1DYWxsYmFjay0+b25SZWxlYXNlQ29tcGxldGVkKCk7CisgICAgfQorfQorCitzdGF0dXNfdCBDQ29kZWM6OnNldFN1cmZhY2UoY29uc3Qgc3A8U3VyZmFjZT4gJnN1cmZhY2UpIHsKKyAgICByZXR1cm4gbUNoYW5uZWwtPnNldFN1cmZhY2Uoc3VyZmFjZSk7Cit9CisKK3ZvaWQgQ0NvZGVjOjpzaWduYWxGbHVzaCgpIHsKKyAgICBzdGF0dXNfdCBlcnIgPSBbdGhpc10geworICAgICAgICBNdXRleGVkPFN0YXRlPjo6TG9ja2VkIHN0YXRlKG1TdGF0ZSk7CisgICAgICAgIGlmIChzdGF0ZS0+Z2V0KCkgPT0gRkxVU0hFRCkgeworICAgICAgICAgICAgcmV0dXJuIEFMUkVBRFlfRVhJU1RTOworICAgICAgICB9CisgICAgICAgIGlmIChzdGF0ZS0+Z2V0KCkgIT0gUlVOTklORykgeworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgc3RhdGUtPnNldChGTFVTSElORyk7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9KCk7CisgICAgc3dpdGNoIChlcnIpIHsKKyAgICAgICAgY2FzZSBBTFJFQURZX0VYSVNUUzoKKyAgICAgICAgICAgIG1DYWxsYmFjay0+b25GbHVzaENvbXBsZXRlZCgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBjYXNlIE9LOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBtQ2FsbGJhY2stPm9uRXJyb3IoZXJyLCBBQ1RJT05fQ09ERV9GQVRBTCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbUNoYW5uZWwtPnN0b3AoKTsKKyAgICAobmV3IEFNZXNzYWdlKGtXaGF0Rmx1c2gsIHRoaXMpKS0+cG9zdCgpOworfQorCit2b2lkIENDb2RlYzo6Zmx1c2goKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiBjb21wOworICAgIGF1dG8gY2hlY2tGbHVzaGluZyA9IFt0aGlzLCAmY29tcF0geworICAgICAgICBNdXRleGVkPFN0YXRlPjo6TG9ja2VkIHN0YXRlKG1TdGF0ZSk7CisgICAgICAgIGlmIChzdGF0ZS0+Z2V0KCkgIT0gRkxVU0hJTkcpIHsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgICAgIGNvbXAgPSBzdGF0ZS0+Y29tcDsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH07CisgICAgaWYgKHRyeUFuZFJlcG9ydE9uRXJyb3IoY2hlY2tGbHVzaGluZykgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gZmx1c2hlZFdvcms7CisgICAgYzJfc3RhdHVzX3QgZXJyID0gY29tcC0+Zmx1c2goQzJDb21wb25lbnQ6OkZMVVNIX0NPTVBPTkVOVCwgJmZsdXNoZWRXb3JrKTsKKyAgICB7CisgICAgICAgIE11dGV4ZWQ8c3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+Pj46OkxvY2tlZCBxdWV1ZShtV29ya0RvbmVRdWV1ZSk7CisgICAgICAgIGZsdXNoZWRXb3JrLnNwbGljZShmbHVzaGVkV29yay5lbmQoKSwgKnF1ZXVlKTsKKyAgICB9CisgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAvLyBUT0RPOiBjb252ZXJ0IGVyciBpbnRvIHN0YXR1c190CisgICAgICAgIG1DYWxsYmFjay0+b25FcnJvcihVTktOT1dOX0VSUk9SLCBBQ1RJT05fQ09ERV9GQVRBTCk7CisgICAgfQorCisgICAgbUNoYW5uZWwtPmZsdXNoKGZsdXNoZWRXb3JrKTsKKyAgICBzdWJRdWV1ZWRXb3JrQ291bnQoZmx1c2hlZFdvcmsuc2l6ZSgpKTsKKworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxTdGF0ZT46OkxvY2tlZCBzdGF0ZShtU3RhdGUpOworICAgICAgICBzdGF0ZS0+c2V0KEZMVVNIRUQpOworICAgIH0KKyAgICBtQ2FsbGJhY2stPm9uRmx1c2hDb21wbGV0ZWQoKTsKK30KKwordm9pZCBDQ29kZWM6OnNpZ25hbFJlc3VtZSgpIHsKKyAgICBhdXRvIHNldFJlc3VtaW5nID0gW3RoaXNdIHsKKyAgICAgICAgTXV0ZXhlZDxTdGF0ZT46OkxvY2tlZCBzdGF0ZShtU3RhdGUpOworICAgICAgICBpZiAoc3RhdGUtPmdldCgpICE9IEZMVVNIRUQpIHsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgICAgIHN0YXRlLT5zZXQoUkVTVU1JTkcpOworICAgICAgICByZXR1cm4gT0s7CisgICAgfTsKKyAgICBpZiAodHJ5QW5kUmVwb3J0T25FcnJvcihzZXRSZXN1bWluZykgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgICh2b2lkKW1DaGFubmVsLT5zdGFydChudWxscHRyLCBudWxscHRyKTsKKworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxTdGF0ZT46OkxvY2tlZCBzdGF0ZShtU3RhdGUpOworICAgICAgICBpZiAoc3RhdGUtPmdldCgpICE9IFJFU1VNSU5HKSB7CisgICAgICAgICAgICBzdGF0ZS51bmxvY2soKTsKKyAgICAgICAgICAgIG1DYWxsYmFjay0+b25FcnJvcihVTktOT1dOX0VSUk9SLCBBQ1RJT05fQ09ERV9GQVRBTCk7CisgICAgICAgICAgICBzdGF0ZS5sb2NrKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgc3RhdGUtPnNldChSVU5OSU5HKTsKKyAgICB9CisKKyAgICAodm9pZCltQ2hhbm5lbC0+cmVxdWVzdEluaXRpYWxJbnB1dEJ1ZmZlcnMoKTsKK30KKwordm9pZCBDQ29kZWM6OnNpZ25hbFNldFBhcmFtZXRlcnMoY29uc3Qgc3A8QU1lc3NhZ2U+ICZwYXJhbXMpIHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2V0UGFyYW1ldGVycywgdGhpcyk7CisgICAgbXNnLT5zZXRNZXNzYWdlKCJwYXJhbXMiLCBwYXJhbXMpOworICAgIG1zZy0+cG9zdCgpOworfQorCit2b2lkIENDb2RlYzo6c2V0UGFyYW1ldGVycyhjb25zdCBzcDxBTWVzc2FnZT4gJnBhcmFtcykgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gY29tcDsKKyAgICBhdXRvIGNoZWNrU3RhdGUgPSBbdGhpcywgJmNvbXBdIHsKKyAgICAgICAgTXV0ZXhlZDxTdGF0ZT46OkxvY2tlZCBzdGF0ZShtU3RhdGUpOworICAgICAgICBpZiAoc3RhdGUtPmdldCgpID09IFJFTEVBU0VEKSB7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKyAgICAgICAgY29tcCA9IHN0YXRlLT5jb21wOworICAgICAgICByZXR1cm4gT0s7CisgICAgfTsKKyAgICBpZiAodHJ5QW5kUmVwb3J0T25FcnJvcihjaGVja1N0YXRlKSAhPSBPSykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgTXV0ZXhlZDxDb25maWc+OjpMb2NrZWQgY29uZmlnKG1Db25maWcpOworCisgICAgLyoqCisgICAgICogSGFuZGxlIGlucHV0IHN1cmZhY2UgcGFyYW1ldGVycworICAgICAqLworICAgIGlmICgoY29uZmlnLT5tRG9tYWluICYgKENvbmZpZzo6SVNfVklERU8gfCBDb25maWc6OklTX0lNQUdFKSkKKyAgICAgICAgICAgICYmIChjb25maWctPm1Eb21haW4gJiBDb25maWc6OklTX0VOQ09ERVIpICYmIGNvbmZpZy0+bUlucHV0U3VyZmFjZSAmJiBjb25maWctPm1JU0NvbmZpZykgeworICAgICAgICAodm9pZClwYXJhbXMtPmZpbmRJbnQ2NCgidGltZS1vZmZzZXQtdXMiLCAmY29uZmlnLT5tSVNDb25maWctPm1UaW1lT2Zmc2V0VXMpOworCisgICAgICAgIGlmIChwYXJhbXMtPmZpbmRJbnQ2NCgic2tpcC1mcmFtZXMtYmVmb3JlIiwgJmNvbmZpZy0+bUlTQ29uZmlnLT5tU3RhcnRBdFVzKSkgeworICAgICAgICAgICAgY29uZmlnLT5tSVNDb25maWctPm1TdG9wcGVkID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSBpZiAocGFyYW1zLT5maW5kSW50NjQoInN0b3AtdGltZS11cyIsICZjb25maWctPm1JU0NvbmZpZy0+bVN0b3BBdFVzKSkgeworICAgICAgICAgICAgY29uZmlnLT5tSVNDb25maWctPm1TdG9wcGVkID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIGludDMyX3QgdmFsdWU7CisgICAgICAgIGlmIChwYXJhbXMtPmZpbmRJbnQzMigiZHJvcC1pbnB1dC1mcmFtZXMiLCAmdmFsdWUpKSB7CisgICAgICAgICAgICBjb25maWctPm1JU0NvbmZpZy0+bVN1c3BlbmRlZCA9IHZhbHVlOworICAgICAgICAgICAgY29uZmlnLT5tSVNDb25maWctPm1TdXNwZW5kQXRVcyA9IC0xOworICAgICAgICAgICAgKHZvaWQpcGFyYW1zLT5maW5kSW50NjQoImRyb3Atc3RhcnQtdGltZS11cyIsICZjb25maWctPm1JU0NvbmZpZy0+bVN1c3BlbmRBdFVzKTsKKyAgICAgICAgfQorCisgICAgICAgICh2b2lkKWNvbmZpZy0+bUlucHV0U3VyZmFjZS0+Y29uZmlndXJlKCpjb25maWctPm1JU0NvbmZpZyk7CisgICAgICAgIGlmIChjb25maWctPm1JU0NvbmZpZy0+bVN0b3BwZWQpIHsKKyAgICAgICAgICAgIGNvbmZpZy0+bUlucHV0Rm9ybWF0LT5zZXRJbnQ2NCgKKyAgICAgICAgICAgICAgICAgICAgImFuZHJvaWQuX3N0b3AtdGltZS1vZmZzZXQtdXMiLCBjb25maWctPm1JU0NvbmZpZy0+bUlucHV0RGVsYXlVcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IGNvbmZpZ1VwZGF0ZTsKKyAgICAodm9pZCljb25maWctPmdldENvbmZpZ1VwZGF0ZUZyb21TZGtQYXJhbXMoCisgICAgICAgICAgICBjb21wLCBwYXJhbXMsIENvbmZpZzo6SVNfUEFSQU0sIEMyX01BWV9CTE9DSywgJmNvbmZpZ1VwZGF0ZSk7CisgICAgLy8gUHJlZmVyIHRvIHBhc3MgcGFyYW1ldGVycyB0byB0aGUgYnVmZmVyIGNoYW5uZWwsIHNvIHRoZXkgY2FuIGJlIHN5bmNocm9uaXplZCB3aXRoIHRoZSBmcmFtZXMuCisgICAgLy8gUGFyYW1ldGVyIHN5bmNocm9uaXphdGlvbiBpcyBub3QgZGVmaW5lZCB3aGVuIHVzaW5nIGlucHV0IHN1cmZhY2UuIEZvciBub3csIHJvdXRlCisgICAgLy8gdGhlc2UgZGlyZWN0bHkgdG8gdGhlIGNvbXBvbmVudC4KKyAgICBpZiAoY29uZmlnLT5tSW5wdXRTdXJmYWNlID09IG51bGxwdHIKKyAgICAgICAgICAgICYmIChwcm9wZXJ0eV9nZXRfYm9vbCgiZGVidWcuc3RhZ2VmcmlnaHQuY2NvZGVjX2RlbGF5ZWRfcGFyYW1zIiwgZmFsc2UpCisgICAgICAgICAgICAgICAgICAgIHx8IGNvbXAtPmdldE5hbWUoKS5maW5kKCJjMi5hbmRyb2lkLiIpID09IDApKSB7CisgICAgICAgIG1DaGFubmVsLT5zZXRQYXJhbWV0ZXJzKGNvbmZpZ1VwZGF0ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgKHZvaWQpY29uZmlnLT5zZXRQYXJhbWV0ZXJzKGNvbXAsIGNvbmZpZ1VwZGF0ZSwgQzJfTUFZX0JMT0NLKTsKKyAgICB9Cit9CisKK3ZvaWQgQ0NvZGVjOjpzaWduYWxFbmRPZklucHV0U3RyZWFtKCkgeworICAgIG1DYWxsYmFjay0+b25TaWduYWxlZElucHV0RU9TKG1DaGFubmVsLT5zaWduYWxFbmRPZklucHV0U3RyZWFtKCkpOworfQorCit2b2lkIENDb2RlYzo6c2lnbmFsUmVxdWVzdElEUkZyYW1lKCkgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gY29tcDsKKyAgICB7CisgICAgICAgIE11dGV4ZWQ8U3RhdGU+OjpMb2NrZWQgc3RhdGUobVN0YXRlKTsKKyAgICAgICAgaWYgKHN0YXRlLT5nZXQoKSA9PSBSRUxFQVNFRCkgeworICAgICAgICAgICAgQUxPR0QoIm5vIElEUiByZXF1ZXN0IHNlbnQgc2luY2UgY29tcG9uZW50IGlzIHJlbGVhc2VkIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgY29tcCA9IHN0YXRlLT5jb21wOworICAgIH0KKyAgICBBTE9HVigicmVxdWVzdCBJRFIiKTsKKyAgICBNdXRleGVkPENvbmZpZz46OkxvY2tlZCBjb25maWcobUNvbmZpZyk7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiBwYXJhbXM7CisgICAgcGFyYW1zLnB1c2hfYmFjaygKKyAgICAgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8QzJTdHJlYW1SZXF1ZXN0U3luY0ZyYW1lVHVuaW5nOjpvdXRwdXQ+KDB1LCB0cnVlKSk7CisgICAgY29uZmlnLT5zZXRQYXJhbWV0ZXJzKGNvbXAsIHBhcmFtcywgQzJfTUFZX0JMT0NLKTsKK30KKwordm9pZCBDQ29kZWM6Om9uV29ya0RvbmUoc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiAmd29ya0l0ZW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG51bURpc2NhcmRlZElucHV0QnVmZmVycykgeworICAgIGlmICghd29ya0l0ZW1zLmVtcHR5KCkpIHsKKyAgICAgICAgeworICAgICAgICAgICAgTXV0ZXhlZDxzdGQ6Omxpc3Q8c2l6ZV90Pj46OkxvY2tlZCBudW1EaXNjYXJkZWRJbnB1dEJ1ZmZlcnNRdWV1ZSgKKyAgICAgICAgICAgICAgICAgICAgbU51bURpc2NhcmRlZElucHV0QnVmZmVyc1F1ZXVlKTsKKyAgICAgICAgICAgIG51bURpc2NhcmRlZElucHV0QnVmZmVyc1F1ZXVlLT5pbnNlcnQoCisgICAgICAgICAgICAgICAgICAgIG51bURpc2NhcmRlZElucHV0QnVmZmVyc1F1ZXVlLT5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgd29ya0l0ZW1zLnNpemUoKSAtIDEsIDApOworICAgICAgICAgICAgbnVtRGlzY2FyZGVkSW5wdXRCdWZmZXJzUXVldWUtPmVtcGxhY2VfYmFjaygKKyAgICAgICAgICAgICAgICAgICAgbnVtRGlzY2FyZGVkSW5wdXRCdWZmZXJzKTsKKyAgICAgICAgfQorICAgICAgICB7CisgICAgICAgICAgICBNdXRleGVkPHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4+OjpMb2NrZWQgcXVldWUobVdvcmtEb25lUXVldWUpOworICAgICAgICAgICAgcXVldWUtPnNwbGljZShxdWV1ZS0+ZW5kKCksIHdvcmtJdGVtcyk7CisgICAgICAgIH0KKyAgICB9CisgICAgKG5ldyBBTWVzc2FnZShrV2hhdFdvcmtEb25lLCB0aGlzKSktPnBvc3QoKTsKK30KKwordm9pZCBDQ29kZWM6Om9uSW5wdXRCdWZmZXJEb25lKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4mIGJ1ZmZlcikgeworICAgIG1DaGFubmVsLT5vbklucHV0QnVmZmVyRG9uZShidWZmZXIpOworfQorCit2b2lkIENDb2RlYzo6b25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBUaW1lUG9pbnQgbm93ID0gc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6bm93KCk7CisgICAgQ0NvZGVjV2F0Y2hkb2c6OmdldEluc3RhbmNlKCktPndhdGNoKHRoaXMpOworICAgIHN3aXRjaCAobXNnLT53aGF0KCkpIHsKKyAgICAgICAgY2FzZSBrV2hhdEFsbG9jYXRlOiB7CisgICAgICAgICAgICAvLyBDMkNvbXBvbmVudFN0b3JlOjpjcmVhdGVDb21wb25lbnQoKSBzaG91bGQgcmV0dXJuIHdpdGhpbiAxMDBtcy4KKyAgICAgICAgICAgIHNldERlYWRsaW5lKG5vdywgMTUwbXMsICJhbGxvY2F0ZSIpOworICAgICAgICAgICAgc3A8UmVmQmFzZT4gb2JqOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kT2JqZWN0KCJjb2RlY0luZm8iLCAmb2JqKSk7CisgICAgICAgICAgICBhbGxvY2F0ZSgoTWVkaWFDb2RlY0luZm8gKilvYmouZ2V0KCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBrV2hhdENvbmZpZ3VyZTogeworICAgICAgICAgICAgLy8gQzJDb21wb25lbnQ6OmNvbW1pdF9zbSgpIHNob3VsZCByZXR1cm4gd2l0aGluIDVtcy4KKyAgICAgICAgICAgIHNldERlYWRsaW5lKG5vdywgMjUwbXMsICJjb25maWd1cmUiKTsKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBmb3JtYXQ7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRNZXNzYWdlKCJmb3JtYXQiLCAmZm9ybWF0KSk7CisgICAgICAgICAgICBjb25maWd1cmUoZm9ybWF0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2Uga1doYXRTdGFydDogeworICAgICAgICAgICAgLy8gQzJDb21wb25lbnQ6OnN0YXJ0KCkgc2hvdWxkIHJldHVybiB3aXRoaW4gNTAwbXMuCisgICAgICAgICAgICBzZXREZWFkbGluZShub3csIDU1MG1zLCAic3RhcnQiKTsKKyAgICAgICAgICAgIG1RdWV1ZWRXb3JrQ291bnQgPSAwOworICAgICAgICAgICAgc3RhcnQoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2Uga1doYXRTdG9wOiB7CisgICAgICAgICAgICAvLyBDMkNvbXBvbmVudDo6c3RvcCgpIHNob3VsZCByZXR1cm4gd2l0aGluIDUwMG1zLgorICAgICAgICAgICAgc2V0RGVhZGxpbmUobm93LCA1NTBtcywgInN0b3AiKTsKKyAgICAgICAgICAgIHN0b3AoKTsKKworICAgICAgICAgICAgbVF1ZXVlZFdvcmtDb3VudCA9IDA7CisgICAgICAgICAgICBNdXRleGVkPE5hbWVkVGltZVBvaW50Pjo6TG9ja2VkIGRlYWRsaW5lKG1RdWV1ZURlYWRsaW5lKTsKKyAgICAgICAgICAgIGRlYWRsaW5lLT5zZXQoVGltZVBvaW50OjptYXgoKSwgIm5vbmUiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2Uga1doYXRGbHVzaDogeworICAgICAgICAgICAgLy8gQzJDb21wb25lbnQ6OmZsdXNoX3NtKCkgc2hvdWxkIHJldHVybiB3aXRoaW4gNW1zLgorICAgICAgICAgICAgc2V0RGVhZGxpbmUobm93LCA1MG1zLCAiZmx1c2giKTsKKyAgICAgICAgICAgIGZsdXNoKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIGtXaGF0Q3JlYXRlSW5wdXRTdXJmYWNlOiB7CisgICAgICAgICAgICAvLyBTdXJmYWNlIG9wZXJhdGlvbnMgbWF5IGJlIGJyaWVmbHkgYmxvY2tpbmcuCisgICAgICAgICAgICBzZXREZWFkbGluZShub3csIDEwMG1zLCAiY3JlYXRlSW5wdXRTdXJmYWNlIik7CisgICAgICAgICAgICBjcmVhdGVJbnB1dFN1cmZhY2UoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2Uga1doYXRTZXRJbnB1dFN1cmZhY2U6IHsKKyAgICAgICAgICAgIC8vIFN1cmZhY2Ugb3BlcmF0aW9ucyBtYXkgYmUgYnJpZWZseSBibG9ja2luZy4KKyAgICAgICAgICAgIHNldERlYWRsaW5lKG5vdywgMTAwbXMsICJzZXRJbnB1dFN1cmZhY2UiKTsKKyAgICAgICAgICAgIHNwPFJlZkJhc2U+IG9iajsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZE9iamVjdCgic3VyZmFjZSIsICZvYmopKTsKKyAgICAgICAgICAgIHNwPFBlcnNpc3RlbnRTdXJmYWNlPiBzdXJmYWNlKHN0YXRpY19jYXN0PFBlcnNpc3RlbnRTdXJmYWNlICo+KG9iai5nZXQoKSkpOworICAgICAgICAgICAgc2V0SW5wdXRTdXJmYWNlKHN1cmZhY2UpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBrV2hhdFNldFBhcmFtZXRlcnM6IHsKKyAgICAgICAgICAgIHNldERlYWRsaW5lKG5vdywgNTBtcywgInNldFBhcmFtZXRlcnMiKTsKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBwYXJhbXM7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRNZXNzYWdlKCJwYXJhbXMiLCAmcGFyYW1zKSk7CisgICAgICAgICAgICBzZXRQYXJhbWV0ZXJzKHBhcmFtcyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIGtXaGF0V29ya0RvbmU6IHsKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+IHdvcms7CisgICAgICAgICAgICBzaXplX3QgbnVtRGlzY2FyZGVkSW5wdXRCdWZmZXJzOworICAgICAgICAgICAgYm9vbCBzaG91bGRQb3N0ID0gZmFsc2U7CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTXV0ZXhlZDxzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+Pjo6TG9ja2VkIHF1ZXVlKG1Xb3JrRG9uZVF1ZXVlKTsKKyAgICAgICAgICAgICAgICBpZiAocXVldWUtPmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHdvcmsuc3dhcChxdWV1ZS0+ZnJvbnQoKSk7CisgICAgICAgICAgICAgICAgcXVldWUtPnBvcF9mcm9udCgpOworICAgICAgICAgICAgICAgIHNob3VsZFBvc3QgPSAhcXVldWUtPmVtcHR5KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTXV0ZXhlZDxzdGQ6Omxpc3Q8c2l6ZV90Pj46OkxvY2tlZCBudW1EaXNjYXJkZWRJbnB1dEJ1ZmZlcnNRdWV1ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIG1OdW1EaXNjYXJkZWRJbnB1dEJ1ZmZlcnNRdWV1ZSk7CisgICAgICAgICAgICAgICAgaWYgKG51bURpc2NhcmRlZElucHV0QnVmZmVyc1F1ZXVlLT5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIG51bURpc2NhcmRlZElucHV0QnVmZmVycyA9IDA7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbnVtRGlzY2FyZGVkSW5wdXRCdWZmZXJzID0gbnVtRGlzY2FyZGVkSW5wdXRCdWZmZXJzUXVldWUtPmZyb250KCk7CisgICAgICAgICAgICAgICAgICAgIG51bURpc2NhcmRlZElucHV0QnVmZmVyc1F1ZXVlLT5wb3BfZnJvbnQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc2hvdWxkUG9zdCkgeworICAgICAgICAgICAgICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRXb3JrRG9uZSwgdGhpcykpLT5wb3N0KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh3b3JrLT53b3JrbGV0cy5lbXB0eSgpCisgICAgICAgICAgICAgICAgICAgIHx8ICEod29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfSU5DT01QTEVURSkpIHsKKyAgICAgICAgICAgICAgICBzdWJRdWV1ZWRXb3JrQ291bnQoMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBoYW5kbGUgY29uZmlndXJhdGlvbiBjaGFuZ2VzIGluIHdvcmsgZG9uZQorICAgICAgICAgICAgTXV0ZXhlZDxDb25maWc+OjpMb2NrZWQgY29uZmlnKG1Db25maWcpOworICAgICAgICAgICAgYm9vbCBjaGFuZ2VkID0gZmFsc2U7CisgICAgICAgICAgICBDb25maWc6OldhdGNoZXI8QzJTdHJlYW1Jbml0RGF0YUluZm86Om91dHB1dD4gaW5pdERhdGEgPQorICAgICAgICAgICAgICAgIGNvbmZpZy0+d2F0Y2g8QzJTdHJlYW1Jbml0RGF0YUluZm86Om91dHB1dD4oKTsKKyAgICAgICAgICAgIGlmICghd29yay0+d29ya2xldHMuZW1wdHkoKQorICAgICAgICAgICAgICAgICAgICAmJiAod29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiBDMkZyYW1lRGF0YTo6RkxBR19ESVNDQVJEX0ZSQU1FKSA9PSAwKSB7CisKKyAgICAgICAgICAgICAgICAvLyBjb3B5IGJ1ZmZlciBpbmZvIHRvIGNvbmZpZworICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gdXBkYXRlcyA9CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZSh3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlKTsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBzdHJlYW0gPSAwOworICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmIDogd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJJbmZvPiAmaW5mbyA6IGJ1Zi0+aW5mbygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBtb3ZlIGFsbCBpbmZvIGludG8gb3V0cHV0LXN0cmVhbSAjMCBkb21haW4KKyAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZXMuZW1wbGFjZV9iYWNrKEMyUGFyYW06OkNvcHlBc1N0cmVhbSgqaW5mbywgdHJ1ZSAvKiBvdXRwdXQgKi8sIHN0cmVhbSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgQzJDb25zdEdyYXBoaWNCbG9jayAmYmxvY2sgOiBidWYtPmRhdGEoKS5ncmFwaGljQmxvY2tzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFMT0dWKCJnb3Qgb3V0cHV0IGJ1ZmZlciB3aXRoIGNyb3AgJXUsJXUrJXUsJXUgYW5kIHNpemUgJXUsJXUiLAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICBibG9jay5jcm9wKCkubGVmdCwgYmxvY2suY3JvcCgpLnRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgYmxvY2suY3JvcCgpLndpZHRoLCBibG9jay5jcm9wKCkuaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICBibG9jay53aWR0aCgpLCBibG9jay5oZWlnaHQoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVzLmVtcGxhY2VfYmFjayhuZXcgQzJTdHJlYW1Dcm9wUmVjdEluZm86Om91dHB1dChzdHJlYW0sIGJsb2NrLmNyb3AoKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlcy5lbXBsYWNlX2JhY2sobmV3IEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSwgYmxvY2sud2lkdGgoKSwgYmxvY2suaGVpZ2h0KCkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAvLyBmb3Igbm93IG9ubHkgZG8gdGhlIGZpcnN0IGJsb2NrCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgKytzdHJlYW07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2hhbmdlZCA9IGNvbmZpZy0+dXBkYXRlQ29uZmlndXJhdGlvbih1cGRhdGVzLCBjb25maWctPm1PdXRwdXREb21haW4pOworCisgICAgICAgICAgICAgICAgLy8gY29weSBzdGFuZGFyZCBpbmZvcyB0byBncmFwaGljIGJ1ZmZlcnMgaWYgbm90IGFscmVhZHkgcHJlc2VudCAob3RoZXJ3aXNlLCB3ZQorICAgICAgICAgICAgICAgIC8vIG1heSBvdmVyd3JpdGUgdGhlIGFjdHVhbCBpbnRlcm1lZGlhdGUgdmFsdWUgd2l0aCBhIGZpbmFsIHZhbHVlKQorICAgICAgICAgICAgICAgIHN0cmVhbSA9IDA7CisgICAgICAgICAgICAgICAgY29uc3Qgc3RhdGljIHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiBzdGRHZnhJbmZvcyA9IHsKKyAgICAgICAgICAgICAgICAgICAgQzJTdHJlYW1Sb3RhdGlvbkluZm86Om91dHB1dDo6UEFSQU1fVFlQRSwKKyAgICAgICAgICAgICAgICAgICAgQzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjpvdXRwdXQ6OlBBUkFNX1RZUEUsCisgICAgICAgICAgICAgICAgICAgIEMyU3RyZWFtRGF0YVNwYWNlSW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFLAorICAgICAgICAgICAgICAgICAgICBDMlN0cmVhbUhkclN0YXRpY0luZm86Om91dHB1dDo6UEFSQU1fVFlQRSwKKyAgICAgICAgICAgICAgICAgICAgQzJTdHJlYW1QaXhlbEFzcGVjdFJhdGlvSW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFLAorICAgICAgICAgICAgICAgICAgICBDMlN0cmVhbVN1cmZhY2VTY2FsaW5nSW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFCisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZiA6IHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChidWYtPmRhdGEoKS5ncmFwaGljQmxvY2tzKCkuc2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKEMyUGFyYW06OkluZGV4IGl4IDogc3RkR2Z4SW5mb3MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWJ1Zi0+aGFzSW5mbyhpeCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJQYXJhbSAqcGFyYW0gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5nZXRDb25maWdQYXJhbWV0ZXJWYWx1ZShpeC53aXRoU3RyZWFtKHN0cmVhbSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtPiBpbmZvKEMyUGFyYW06OkNvcHkoKnBhcmFtKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWYtPnNldEluZm8oc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMySW5mbz4oaW5mbykpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICsrc3RyZWFtOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1DaGFubmVsLT5vbldvcmtEb25lKAorICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUod29yayksIGNoYW5nZWQgPyBjb25maWctPm1PdXRwdXRGb3JtYXQgOiBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICBpbml0RGF0YS5oYXNDaGFuZ2VkKCkgPyBpbml0RGF0YS51cGRhdGUoKS5nZXQoKSA6IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgIG51bURpc2NhcmRlZElucHV0QnVmZmVycyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIGtXaGF0V2F0Y2g6IHsKKyAgICAgICAgICAgIC8vIHdhdGNoIG1lc3NhZ2UgYWxyZWFkeSBwb3N0ZWQ7IG5vLW9wLgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDogeworICAgICAgICAgICAgQUxPR0UoInVucmVjb2duaXplZCBtZXNzYWdlIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBzZXREZWFkbGluZShUaW1lUG9pbnQ6Om1heCgpLCAwbXMsICJub25lIik7Cit9CisKK3ZvaWQgQ0NvZGVjOjpzZXREZWFkbGluZSgKKyAgICAgICAgY29uc3QgVGltZVBvaW50ICZub3csCisgICAgICAgIGNvbnN0IHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMgJnRpbWVvdXQsCisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUpIHsKKyAgICBpbnQzMl90IG11bHQgPSBzdGQ6Om1heCgxLCBwcm9wZXJ0eV9nZXRfaW50MzIoImRlYnVnLnN0YWdlZnJpZ2h0LmNjb2RlY190aW1lb3V0X211bHQiLCAxKSk7CisgICAgTXV0ZXhlZDxOYW1lZFRpbWVQb2ludD46OkxvY2tlZCBkZWFkbGluZShtRGVhZGxpbmUpOworICAgIGRlYWRsaW5lLT5zZXQobm93ICsgKHRpbWVvdXQgKiBtdWx0KSwgbmFtZSk7Cit9CisKK3ZvaWQgQ0NvZGVjOjppbml0aWF0ZVJlbGVhc2VJZlN0dWNrKCkgeworICAgIHN0ZDo6c3RyaW5nIG5hbWU7CisgICAgYm9vbCBwZW5kaW5nRGVhZGxpbmUgPSBmYWxzZTsKKyAgICBmb3IgKE11dGV4ZWQ8TmFtZWRUaW1lUG9pbnQ+ICpkZWFkbGluZVB0ciA6IHsgJm1EZWFkbGluZSwgJm1RdWV1ZURlYWRsaW5lLCAmbUVvc0RlYWRsaW5lIH0pIHsKKyAgICAgICAgTXV0ZXhlZDxOYW1lZFRpbWVQb2ludD46OkxvY2tlZCBkZWFkbGluZSgqZGVhZGxpbmVQdHIpOworICAgICAgICBpZiAoZGVhZGxpbmUtPmdldCgpIDwgc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6bm93KCkpIHsKKyAgICAgICAgICAgIG5hbWUgPSBkZWFkbGluZS0+Z2V0TmFtZSgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRlYWRsaW5lLT5nZXQoKSAhPSBUaW1lUG9pbnQ6Om1heCgpKSB7CisgICAgICAgICAgICBwZW5kaW5nRGVhZGxpbmUgPSB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIGlmIChuYW1lLmVtcHR5KCkpIHsKKyAgICAgICAgLy8gV2UncmUgbm90IHN0dWNrLgorICAgICAgICBpZiAocGVuZGluZ0RlYWRsaW5lKSB7CisgICAgICAgICAgICAvLyBJZiB3ZSBhcmUgbm90IHN0dWNrIHlldCBidXQgc3RpbGwgaGFzIGRlYWRsaW5lIGNvbWluZyB1cCwKKyAgICAgICAgICAgIC8vIHBvc3Qgd2F0Y2ggbWVzc2FnZSB0byBjaGVjayBiYWNrIGxhdGVyLgorICAgICAgICAgICAgKG5ldyBBTWVzc2FnZShrV2hhdFdhdGNoLCB0aGlzKSktPnBvc3QoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQUxPR1coInByZXZpb3VzIGNhbGwgdG8gJXMgZXhjZWVkZWQgdGltZW91dCIsIG5hbWUuY19zdHIoKSk7CisgICAgaW5pdGlhdGVSZWxlYXNlKGZhbHNlKTsKKyAgICBtQ2FsbGJhY2stPm9uRXJyb3IoVU5LTk9XTl9FUlJPUiwgQUNUSU9OX0NPREVfRkFUQUwpOworfQorCit2b2lkIENDb2RlYzo6b25Xb3JrUXVldWVkKGJvb2wgZW9zKSB7CisgICAgQUxPR1YoInF1ZXVlZCB3b3JrIGNvdW50ICsxIGZyb20gJWQiLCBtUXVldWVkV29ya0NvdW50LmxvYWQoKSk7CisgICAgaW50MzJfdCBjb3VudCA9ICsrbVF1ZXVlZFdvcmtDb3VudDsKKyAgICBpZiAoZW9zKSB7CisgICAgICAgIENDb2RlY1dhdGNoZG9nOjpnZXRJbnN0YW5jZSgpLT53YXRjaCh0aGlzKTsKKyAgICAgICAgTXV0ZXhlZDxOYW1lZFRpbWVQb2ludD46OkxvY2tlZCBkZWFkbGluZShtRW9zRGVhZGxpbmUpOworICAgICAgICBkZWFkbGluZS0+c2V0KHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpICsgM3MsICJlb3MiKTsKKyAgICB9CisgICAgLy8gVE9ETzogcXVlcnkgYW5kIHVzZSBpbnB1dC9waXBlbGluZS9vdXRwdXQgZGVsYXkgY29tYmluZWQKKyAgICBpZiAoY291bnQgPj0gOCkgeworICAgICAgICBDQ29kZWNXYXRjaGRvZzo6Z2V0SW5zdGFuY2UoKS0+d2F0Y2godGhpcyk7CisgICAgICAgIE11dGV4ZWQ8TmFtZWRUaW1lUG9pbnQ+OjpMb2NrZWQgZGVhZGxpbmUobVF1ZXVlRGVhZGxpbmUpOworICAgICAgICBkZWFkbGluZS0+c2V0KHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpICsgM3MsICJxdWV1ZSIpOworICAgIH0KK30KKwordm9pZCBDQ29kZWM6OnN1YlF1ZXVlZFdvcmtDb3VudCh1aW50MzJfdCBjb3VudCkgeworICAgIEFMT0dWKCJxdWV1ZWQgd29yayBjb3VudCAtJXUgZnJvbSAlZCIsIGNvdW50LCBtUXVldWVkV29ya0NvdW50LmxvYWQoKSk7CisgICAgaW50MzJfdCBjdXJyZW50Q291bnQgPSAobVF1ZXVlZFdvcmtDb3VudCAtPSBjb3VudCk7CisgICAgaWYgKGN1cnJlbnRDb3VudCA9PSAwKSB7CisgICAgICAgIE11dGV4ZWQ8TmFtZWRUaW1lUG9pbnQ+OjpMb2NrZWQgZGVhZGxpbmUobUVvc0RlYWRsaW5lKTsKKyAgICAgICAgZGVhZGxpbmUtPnNldChUaW1lUG9pbnQ6Om1heCgpLCAibm9uZSIpOworICAgIH0KKyAgICBNdXRleGVkPE5hbWVkVGltZVBvaW50Pjo6TG9ja2VkIGRlYWRsaW5lKG1RdWV1ZURlYWRsaW5lKTsKKyAgICBkZWFkbGluZS0+c2V0KFRpbWVQb2ludDo6bWF4KCksICJub25lIik7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2V4dGVybiAiQyIgYW5kcm9pZDo6Q29kZWNCYXNlICpDcmVhdGVDb2RlYygpIHsKKyAgICByZXR1cm4gbmV3IGFuZHJvaWQ6OkNDb2RlYzsKK30KKworZXh0ZXJuICJDIiBhbmRyb2lkOjpQZXJzaXN0ZW50U3VyZmFjZSAqQ3JlYXRlSW5wdXRTdXJmYWNlKCkgeworICAgIC8vIEF0dGVtcHQgdG8gY3JlYXRlIGEgQ29kZWMyJ3MgaW5wdXQgc3VyZmFjZS4KKyAgICBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpJbnB1dFN1cmZhY2U+IGlucHV0U3VyZmFjZSA9CisgICAgICAgICAgICBhbmRyb2lkOjpDb2RlYzJDbGllbnQ6OkNyZWF0ZUlucHV0U3VyZmFjZSgpOworICAgIGlmIChpbnB1dFN1cmZhY2UpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBhbmRyb2lkOjpQZXJzaXN0ZW50U3VyZmFjZSgKKyAgICAgICAgICAgICAgICBpbnB1dFN1cmZhY2UtPmdldEdyYXBoaWNCdWZmZXJQcm9kdWNlcigpLAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGFuZHJvaWQ6OnNwPGFuZHJvaWQ6OmhpZGw6OmJhc2U6OlYxXzA6OklCYXNlPj4oCisgICAgICAgICAgICAgICAgaW5wdXRTdXJmYWNlLT5nZXRIYWxJbnRlcmZhY2UoKSkpOworICAgIH0KKworICAgIC8vIEZhbGwgYmFjayB0byBPTVguCisgICAgdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6b214OjpWMV8wOworICAgIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6Om9teDo6VjFfMDo6dXRpbHM7CisgICAgdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6YnVmZmVycXVldWU6OlYxXzA6OnV0aWxzOworICAgIHR5cGVkZWYgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpvbXg6OlYxXzA6OlN0YXR1cyBPbXhTdGF0dXM7CisgICAgYW5kcm9pZDo6c3A8SU9teD4gb214ID0gSU9teDo6Z2V0U2VydmljZSgpOworICAgIHR5cGVkZWYgYW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpidWZmZXJxdWV1ZTo6VjFfMDo6CisgICAgICAgICAgICBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI7CisgICAgdHlwZWRlZiBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6Om9teDo6VjFfMDo6CisgICAgICAgICAgICBJR3JhcGhpY0J1ZmZlclNvdXJjZSBIR3JhcGhpY0J1ZmZlclNvdXJjZTsKKyAgICBPbXhTdGF0dXMgczsKKyAgICBhbmRyb2lkOjpzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBnYnA7CisgICAgYW5kcm9pZDo6c3A8SEdyYXBoaWNCdWZmZXJTb3VyY2U+IGdiczsKKyAgICBhbmRyb2lkOjpSZXR1cm48dm9pZD4gdHJhbnNTdGF0dXMgPSBvbXgtPmNyZWF0ZUlucHV0U3VyZmFjZSgKKyAgICAgICAgICAgIFsmcywgJmdicCwgJmdic10oCisgICAgICAgICAgICAgICAgICAgIE9teFN0YXR1cyBzdGF0dXMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFuZHJvaWQ6OnNwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBwcm9kdWNlciwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgYW5kcm9pZDo6c3A8SEdyYXBoaWNCdWZmZXJTb3VyY2U+JiBzb3VyY2UpIHsKKyAgICAgICAgICAgICAgICBzID0gc3RhdHVzOworICAgICAgICAgICAgICAgIGdicCA9IHByb2R1Y2VyOworICAgICAgICAgICAgICAgIGdicyA9IHNvdXJjZTsKKyAgICAgICAgICAgIH0pOworICAgIGlmICh0cmFuc1N0YXR1cy5pc09rKCkgJiYgcyA9PSBPbXhTdGF0dXM6Ok9LKSB7CisgICAgICAgIHJldHVybiBuZXcgYW5kcm9pZDo6UGVyc2lzdGVudFN1cmZhY2UoCisgICAgICAgICAgICAgICAgbmV3IEgyQkdyYXBoaWNCdWZmZXJQcm9kdWNlcihnYnApLAorICAgICAgICAgICAgICAgIHNwPDo6YW5kcm9pZDo6SUdyYXBoaWNCdWZmZXJTb3VyY2U+KAorICAgICAgICAgICAgICAgICAgICBuZXcgTFdHcmFwaGljQnVmZmVyU291cmNlKGdicykpKTsKKyAgICB9CisKKyAgICByZXR1cm4gbnVsbHB0cjsKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlYy5oIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4YjAwOWUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjLmgKQEAgLTAsMCArMSwxODUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIENfQ09ERUNfSF8KKyNkZWZpbmUgQ19DT0RFQ19IXworCisjaW5jbHVkZSA8Y2hyb25vPgorI2luY2x1ZGUgPGxpc3Q+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHNldD4KKworI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvY2xpZW50Lmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkL25hdGl2ZV93aW5kb3cuaD4KKyNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9NZXRhZGF0YUJ1ZmZlclR5cGUuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL011dGV4ZWQuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9Db2RlY0Jhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9GcmFtZVJlbmRlclRyYWNrZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9Ta2lwQ3V0QnVmZmVyLmg+CisjaW5jbHVkZSA8dXRpbHMvTmF0aXZlSGFuZGxlLmg+CisjaW5jbHVkZSA8aGFyZHdhcmUvZ3JhbGxvYy5oPgorI2luY2x1ZGUgPG5hdGl2ZWJhc2UvbmF0aXZlYmFzZS5oPgorCisjaW5jbHVkZSAiQ0NvZGVjQ29uZmlnLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgQ0NvZGVjQnVmZmVyQ2hhbm5lbDsKK2NsYXNzIElucHV0U3VyZmFjZVdyYXBwZXI7CitzdHJ1Y3QgTWVkaWFDb2RlY0luZm87CisKK2NsYXNzIENDb2RlYyA6IHB1YmxpYyBDb2RlY0Jhc2UgeworcHVibGljOgorICAgIENDb2RlYygpOworCisgICAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyQ2hhbm5lbEJhc2U+IGdldEJ1ZmZlckNoYW5uZWwoKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHZvaWQgaW5pdGlhdGVBbGxvY2F0ZUNvbXBvbmVudChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgb3ZlcnJpZGU7CisgICAgdmlydHVhbCB2b2lkIGluaXRpYXRlQ29uZmlndXJlQ29tcG9uZW50KGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHZvaWQgaW5pdGlhdGVDcmVhdGVJbnB1dFN1cmZhY2UoKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHZvaWQgaW5pdGlhdGVTZXRJbnB1dFN1cmZhY2UoY29uc3Qgc3A8UGVyc2lzdGVudFN1cmZhY2U+ICZzdXJmYWNlKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHZvaWQgaW5pdGlhdGVTdGFydCgpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgdm9pZCBpbml0aWF0ZVNodXRkb3duKGJvb2wga2VlcENvbXBvbmVudEFsbG9jYXRlZCA9IGZhbHNlKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3VyZmFjZShjb25zdCBzcDxTdXJmYWNlPiAmc3VyZmFjZSkgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIHZvaWQgc2lnbmFsRmx1c2goKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHZvaWQgc2lnbmFsUmVzdW1lKCkgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIHZvaWQgc2lnbmFsU2V0UGFyYW1ldGVycyhjb25zdCBzcDxBTWVzc2FnZT4gJnBhcmFtcykgb3ZlcnJpZGU7CisgICAgdmlydHVhbCB2b2lkIHNpZ25hbEVuZE9mSW5wdXRTdHJlYW0oKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHZvaWQgc2lnbmFsUmVxdWVzdElEUkZyYW1lKCkgb3ZlcnJpZGU7CisKKyAgICB2b2lkIGluaXRpYXRlUmVsZWFzZUlmU3R1Y2soKTsKKyAgICB2b2lkIG9uV29ya0RvbmUoc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiAmd29ya0l0ZW1zLAorICAgICAgICAgICAgICAgICAgICBzaXplX3QgbnVtRGlzY2FyZGVkSW5wdXRCdWZmZXJzKTsKKyAgICB2b2lkIG9uSW5wdXRCdWZmZXJEb25lKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4mIGJ1ZmZlcik7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5DQ29kZWMoKTsKKworICAgIHZpcnR1YWwgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgdHlwZWRlZiBzdGQ6OmNocm9ubzo6dGltZV9wb2ludDxzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrPiBUaW1lUG9pbnQ7CisKKyAgICBzdGF0dXNfdCB0cnlBbmRSZXBvcnRPbkVycm9yKHN0ZDo6ZnVuY3Rpb248c3RhdHVzX3QoKT4gam9iKTsKKworICAgIHZvaWQgaW5pdGlhdGVTdG9wKCk7CisgICAgdm9pZCBpbml0aWF0ZVJlbGVhc2UoYm9vbCBzZW5kQ2FsbGJhY2sgPSB0cnVlKTsKKworICAgIHZvaWQgYWxsb2NhdGUoY29uc3Qgc3A8TWVkaWFDb2RlY0luZm8+ICZjb2RlY0luZm8pOworICAgIHZvaWQgY29uZmlndXJlKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKyAgICB2b2lkIHN0YXJ0KCk7CisgICAgdm9pZCBzdG9wKCk7CisgICAgdm9pZCBmbHVzaCgpOworICAgIHZvaWQgcmVsZWFzZShib29sIHNlbmRDYWxsYmFjayk7CisKKyAgICB2b2lkIGNyZWF0ZUlucHV0U3VyZmFjZSgpOworICAgIHZvaWQgc2V0SW5wdXRTdXJmYWNlKGNvbnN0IHNwPFBlcnNpc3RlbnRTdXJmYWNlPiAmc3VyZmFjZSk7CisgICAgc3RhdHVzX3Qgc2V0dXBJbnB1dFN1cmZhY2UoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElucHV0U3VyZmFjZVdyYXBwZXI+ICZzdXJmYWNlKTsKKyAgICB2b2lkIHNldFBhcmFtZXRlcnMoY29uc3Qgc3A8QU1lc3NhZ2U+ICZwYXJhbXMpOworCisgICAgdm9pZCBzZXREZWFkbGluZSgKKyAgICAgICAgICAgIGNvbnN0IFRpbWVQb2ludCAmbm93LAorICAgICAgICAgICAgY29uc3Qgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyAmdGltZW91dCwKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUpOworCisgICAgdm9pZCBvbldvcmtRdWV1ZWQoYm9vbCBlb3MpOworICAgIHZvaWQgc3ViUXVldWVkV29ya0NvdW50KHVpbnQzMl90IGNvdW50KTsKKworICAgIGVudW0geworICAgICAgICBrV2hhdEFsbG9jYXRlLAorICAgICAgICBrV2hhdENvbmZpZ3VyZSwKKyAgICAgICAga1doYXRTdGFydCwKKyAgICAgICAga1doYXRGbHVzaCwKKyAgICAgICAga1doYXRTdG9wLAorICAgICAgICBrV2hhdFJlbGVhc2UsCisgICAgICAgIGtXaGF0Q3JlYXRlSW5wdXRTdXJmYWNlLAorICAgICAgICBrV2hhdFNldElucHV0U3VyZmFjZSwKKyAgICAgICAga1doYXRTZXRQYXJhbWV0ZXJzLAorCisgICAgICAgIGtXaGF0V29ya0RvbmUsCisgICAgICAgIGtXaGF0V2F0Y2gsCisgICAgfTsKKworICAgIGVudW0geworICAgICAgICBSRUxFQVNFRCwKKyAgICAgICAgQUxMT0NBVEVELAorICAgICAgICBGTFVTSEVELAorICAgICAgICBSVU5OSU5HLAorCisgICAgICAgIEFMTE9DQVRJTkcsICAvLyBSRUxFQVNFRCAtPiBBTExPQ0FURUQKKyAgICAgICAgU1RBUlRJTkcsICAgIC8vIEFMTE9DQVRFRCAtPiBSVU5OSU5HCisgICAgICAgIFNUT1BQSU5HLCAgICAvLyBSVU5OSU5HIC0+IEFMTE9DQVRFRAorICAgICAgICBGTFVTSElORywgICAgLy8gUlVOTklORyAtPiBGTFVTSEVECisgICAgICAgIFJFU1VNSU5HLCAgICAvLyBGTFVTSEVEIC0+IFJVTk5JTkcKKyAgICAgICAgUkVMRUFTSU5HLCAgIC8vIHtBTlkgRVhDRVBUIFJFTEVBU0VEfSAtPiBSRUxFQVNFRAorICAgIH07CisKKyAgICBzdHJ1Y3QgU3RhdGUgeworICAgICAgICBpbmxpbmUgU3RhdGUoKSA6IG1TdGF0ZShSRUxFQVNFRCkge30KKyAgICAgICAgaW5saW5lIGludCBnZXQoKSBjb25zdCB7IHJldHVybiBtU3RhdGU7IH0KKyAgICAgICAgaW5saW5lIHZvaWQgc2V0KGludCBuZXdTdGF0ZSkgeyBtU3RhdGUgPSBuZXdTdGF0ZTsgfQorCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gY29tcDsKKyAgICBwcml2YXRlOgorICAgICAgICBpbnQgbVN0YXRlOworICAgIH07CisKKyAgICBzdHJ1Y3QgTmFtZWRUaW1lUG9pbnQgeworICAgICAgICBOYW1lZFRpbWVQb2ludCgpIDogbVRpbWVQb2ludChUaW1lUG9pbnQ6Om1heCgpKSwgbU5hbWUoIiIpIHt9CisKKyAgICAgICAgaW5saW5lIHZvaWQgc2V0KAorICAgICAgICAgICAgICAgIGNvbnN0IFRpbWVQb2ludCAmdGltZVBvaW50LAorICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUpIHsKKyAgICAgICAgICAgIG1UaW1lUG9pbnQgPSB0aW1lUG9pbnQ7CisgICAgICAgICAgICBtTmFtZSA9IG5hbWU7CisgICAgICAgIH0KKworICAgICAgICBpbmxpbmUgVGltZVBvaW50IGdldCgpIGNvbnN0IHsgcmV0dXJuIG1UaW1lUG9pbnQ7IH0KKyAgICAgICAgaW5saW5lIGNvbnN0IGNoYXIgKmdldE5hbWUoKSBjb25zdCB7IHJldHVybiBtTmFtZTsgfQorICAgIHByaXZhdGU6CisgICAgICAgIFRpbWVQb2ludCBtVGltZVBvaW50OworICAgICAgICBjb25zdCBjaGFyICptTmFtZTsKKyAgICB9OworCisgICAgTXV0ZXhlZDxTdGF0ZT4gbVN0YXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDQ29kZWNCdWZmZXJDaGFubmVsPiBtQ2hhbm5lbDsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ+IG1DbGllbnQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6TGlzdGVuZXI+IG1DbGllbnRMaXN0ZW5lcjsKKyAgICBzdHJ1Y3QgQ2xpZW50TGlzdGVuZXI7CisKKyAgICBNdXRleGVkPE5hbWVkVGltZVBvaW50PiBtRGVhZGxpbmU7CisgICAgc3RkOjphdG9taWNfaW50MzJfdCBtUXVldWVkV29ya0NvdW50OworICAgIE11dGV4ZWQ8TmFtZWRUaW1lUG9pbnQ+IG1RdWV1ZURlYWRsaW5lOworICAgIE11dGV4ZWQ8TmFtZWRUaW1lUG9pbnQ+IG1Fb3NEZWFkbGluZTsKKyAgICB0eXBlZGVmIENDb2RlY0NvbmZpZyBDb25maWc7CisgICAgTXV0ZXhlZDxDb25maWc+IG1Db25maWc7CisgICAgTXV0ZXhlZDxzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+PiBtV29ya0RvbmVRdWV1ZTsKKyAgICBNdXRleGVkPHN0ZDo6bGlzdDxzaXplX3Q+PiBtTnVtRGlzY2FyZGVkSW5wdXRCdWZmZXJzUXVldWU7CisKKyAgICBmcmllbmQgY2xhc3MgQ0NvZGVjQ2FsbGJhY2tJbXBsOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQ0NvZGVjKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQ19DT0RFQ19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlY0J1ZmZlckNoYW5uZWwuY3BwIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlY0J1ZmZlckNoYW5uZWwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxYjljMWUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjQnVmZmVyQ2hhbm5lbC5jcHAKQEAgLTAsMCArMSwyNzkxIEBACisvKgorICogQ29weXJpZ2h0IDIwMTcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNDb2RlY0J1ZmZlckNoYW5uZWwiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxudW1lcmljPgorCisjaW5jbHVkZSA8QzJBbGxvY2F0b3JHcmFsbG9jLmg+CisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxDMkJsb2NrSW50ZXJuYWwuaD4KKyNpbmNsdWRlIDxDMkNvbmZpZy5oPgorI2luY2x1ZGUgPEMyRGVidWcuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FzL25hdGl2ZS8xLjAvSURlc2NyYW1ibGVyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3ByaW50Zi5oPgorI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlEZWFsZXIuaD4KKyNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgorI2luY2x1ZGUgPG1lZGlhL29wZW5tYXgvT01YX0NvcmUuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29rdXAuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0NvbnN0YW50cy5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhQ29kZWNCdWZmZXIuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vd2luZG93Lmg+CisKKyNpbmNsdWRlICJDQ29kZWNCdWZmZXJDaGFubmVsLmgiCisjaW5jbHVkZSAiQ29kZWMyQnVmZmVyLmgiCisjaW5jbHVkZSAiU2tpcEN1dEJ1ZmZlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3VzaW5nIGFuZHJvaWQ6OmJhc2U6OlN0cmluZ1ByaW50ZjsKK3VzaW5nIGhhcmR3YXJlOjpoaWRsX2hhbmRsZTsKK3VzaW5nIGhhcmR3YXJlOjpoaWRsX3N0cmluZzsKK3VzaW5nIGhhcmR3YXJlOjpoaWRsX3ZlYzsKK3VzaW5nIG5hbWVzcGFjZSBoYXJkd2FyZTo6Y2FzOjpWMV8wOwordXNpbmcgbmFtZXNwYWNlIGhhcmR3YXJlOjpjYXM6Om5hdGl2ZTo6VjFfMDsKKwordXNpbmcgQ2FzU3RhdHVzID0gaGFyZHdhcmU6OmNhczo6VjFfMDo6U3RhdHVzOworCisvKioKKyAqIEJhc2UgY2xhc3MgZm9yIHJlcHJlc2VudGF0aW9uIG9mIGJ1ZmZlcnMgYXQgb25lIHBvcnQuCisgKi8KK2NsYXNzIENDb2RlY0J1ZmZlckNoYW5uZWw6OkJ1ZmZlcnMgeworcHVibGljOgorICAgIEJ1ZmZlcnMoY29uc3QgY2hhciAqY29tcG9uZW50TmFtZSwgY29uc3QgY2hhciAqbmFtZSA9ICJCdWZmZXJzIikKKyAgICAgICAgOiBtQ29tcG9uZW50TmFtZShjb21wb25lbnROYW1lKSwKKyAgICAgICAgICBtQ2hhbm5lbE5hbWUoc3RkOjpzdHJpbmcoY29tcG9uZW50TmFtZSkgKyAiOiIgKyBuYW1lKSwKKyAgICAgICAgICBtTmFtZShtQ2hhbm5lbE5hbWUuY19zdHIoKSkgeworICAgIH0KKyAgICB2aXJ0dWFsIH5CdWZmZXJzKCkgPSBkZWZhdWx0OworCisgICAgLyoqCisgICAgICogU2V0IGZvcm1hdCBmb3IgTWVkaWFDb2RlYy1mYWNpbmcgYnVmZmVycy4KKyAgICAgKi8KKyAgICB2b2lkIHNldEZvcm1hdChjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCkgeworICAgICAgICBDSEVDSyhmb3JtYXQgIT0gbnVsbHB0cik7CisgICAgICAgIG1Gb3JtYXQgPSBmb3JtYXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgY29weSBvZiBjdXJyZW50IGZvcm1hdC4KKyAgICAgKi8KKyAgICBzcDxBTWVzc2FnZT4gZHVwRm9ybWF0KCkgeworICAgICAgICByZXR1cm4gbUZvcm1hdCAhPSBudWxscHRyID8gbUZvcm1hdC0+ZHVwKCkgOiBudWxscHRyOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgYnVmZmVycyBhcmUgb3BlcmF0aW5nIHVuZGVyIGFycmF5IG1vZGUuCisgICAgICovCisgICAgdmlydHVhbCBib29sIGlzQXJyYXlNb2RlKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKworICAgIC8qKgorICAgICAqIEZpbGxzIHRoZSB2ZWN0b3Igd2l0aCBNZWRpYUNvZGVjQnVmZmVyJ3MgaWYgaW4gYXJyYXkgbW9kZTsgb3RoZXJ3aXNlLAorICAgICAqIG5vLW9wLgorICAgICAqLworICAgIHZpcnR1YWwgdm9pZCBnZXRBcnJheShWZWN0b3I8c3A8TWVkaWFDb2RlY0J1ZmZlcj4+ICopIGNvbnN0IHt9CisKK3Byb3RlY3RlZDoKKyAgICBzdGQ6OnN0cmluZyBtQ29tcG9uZW50TmFtZTsgLy8vPCBuYW1lIG9mIGNvbXBvbmVudCBmb3IgZGVidWdnaW5nCisgICAgc3RkOjpzdHJpbmcgbUNoYW5uZWxOYW1lOyAvLy88IG5hbWUgb2YgY2hhbm5lbCBmb3IgZGVidWdnaW5nCisgICAgY29uc3QgY2hhciAqbU5hbWU7IC8vLzwgQy1zdHJpbmcgdmVyc2lvbiBvZiBjaGFubmVsIG5hbWUKKyAgICAvLyBGb3JtYXQgdG8gYmUgdXNlZCBmb3IgY3JlYXRpbmcgTWVkaWFDb2RlYy1mYWNpbmcgYnVmZmVycy4KKyAgICBzcDxBTWVzc2FnZT4gbUZvcm1hdDsKKworcHJpdmF0ZToKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhCdWZmZXJzKTsKK307CisKK2NsYXNzIENDb2RlY0J1ZmZlckNoYW5uZWw6OklucHV0QnVmZmVycyA6IHB1YmxpYyBDQ29kZWNCdWZmZXJDaGFubmVsOjpCdWZmZXJzIHsKK3B1YmxpYzoKKyAgICBJbnB1dEJ1ZmZlcnMoY29uc3QgY2hhciAqY29tcG9uZW50TmFtZSwgY29uc3QgY2hhciAqbmFtZSA9ICJJbnB1dFtdIikKKyAgICAgICAgOiBCdWZmZXJzKGNvbXBvbmVudE5hbWUsIG5hbWUpIHsgfQorICAgIHZpcnR1YWwgfklucHV0QnVmZmVycygpID0gZGVmYXVsdDsKKworICAgIC8qKgorICAgICAqIFNldCBhIGJsb2NrIHBvb2wgdG8gb2J0YWluIGlucHV0IG1lbW9yeSBibG9ja3MuCisgICAgICovCisgICAgdm9pZCBzZXRQb29sKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsgbVBvb2wgPSBwb29sOyB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgYSBuZXcgTWVkaWFDb2RlY0J1ZmZlciBmb3IgaW5wdXQgYW5kIGl0cyBjb3JyZXNwb25kaW5nIGluZGV4LgorICAgICAqIFJldHVybnMgZmFsc2UgaWYgbm8gbmV3IGJ1ZmZlciBjYW4gYmUgb2J0YWluZWQgYXQgdGhlIG1vbWVudC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIGJvb2wgcmVxdWVzdE5ld0J1ZmZlcihzaXplX3QgKmluZGV4LCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAqYnVmZmVyKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZWxlYXNlIHRoZSBidWZmZXIgb2J0YWluZWQgZnJvbSByZXF1ZXN0TmV3QnVmZmVyKCkgYW5kIGdldCB0aGUKKyAgICAgKiBhc3NvY2lhdGVkIEMyQnVmZmVyIG9iamVjdCBiYWNrLiBSZXR1cm5zIHRydWUgaWYgdGhlIGJ1ZmZlciB3YXMgb24gZmlsZQorICAgICAqIGFuZCByZWxlYXNlZCBzdWNjZXNzZnVsbHkuCisgICAgICovCisgICAgdmlydHVhbCBib29sIHJlbGVhc2VCdWZmZXIoCisgICAgICAgICAgICBjb25zdCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAmYnVmZmVyLCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICpjMmJ1ZmZlcikgPSAwOworCisgICAgLyoqCisgICAgICogUmVsZWFzZSB0aGUgYnVmZmVyIHRoYXQgaXMgbm8gbG9uZ2VyIHVzZWQgYnkgdGhlIGNvZGVjIHByb2Nlc3MuIFJldHVybgorICAgICAqIHRydWUgaWYgYW5kIG9ubHkgaWYgdGhlIGJ1ZmZlciB3YXMgb24gZmlsZSBhbmQgcmVsZWFzZWQgc3VjY2Vzc2Z1bGx5LgorICAgICAqLworICAgIHZpcnR1YWwgYm9vbCBleHBpcmVDb21wb25lbnRCdWZmZXIoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZjMmJ1ZmZlcikgPSAwOworCisgICAgLyoqCisgICAgICogRmx1c2ggaW50ZXJuYWwgc3RhdGUuIEFmdGVyIHRoaXMgY2FsbCwgbm8gaW5kZXggb3IgYnVmZmVyIHByZXZpb3VzbHkKKyAgICAgKiByZXR1cm5lZCBmcm9tIHJlcXVlc3ROZXdCdWZmZXIoKSBpcyB2YWxpZC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHZvaWQgZmx1c2goKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYXJyYXktYmFja2VkIHZlcnNpb24gb2YgaW5wdXQgYnVmZmVycy4gVGhlIHJldHVybmVkIG9iamVjdAorICAgICAqIHNoYWxsIHJldGFpbiB0aGUgaW50ZXJuYWwgc3RhdGUgc28gdGhhdCBpdCB3aWxsIGhvbm9yIGluZGV4IGFuZAorICAgICAqIGJ1ZmZlciBmcm9tIHByZXZpb3VzIGNhbGxzIG9mIHJlcXVlc3ROZXdCdWZmZXIoKS4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0ZDo6dW5pcXVlX3B0cjxJbnB1dEJ1ZmZlcnM+IHRvQXJyYXlNb2RlKHNpemVfdCBzaXplKSA9IDA7CisKK3Byb3RlY3RlZDoKKyAgICAvLyBQb29sIHRvIG9idGFpbiBibG9ja3MgZm9yIGlucHV0IGJ1ZmZlcnMuCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiBtUG9vbDsKKworcHJpdmF0ZToKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhJbnB1dEJ1ZmZlcnMpOworfTsKKworY2xhc3MgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6T3V0cHV0QnVmZmVycyA6IHB1YmxpYyBDQ29kZWNCdWZmZXJDaGFubmVsOjpCdWZmZXJzIHsKK3B1YmxpYzoKKyAgICBPdXRwdXRCdWZmZXJzKGNvbnN0IGNoYXIgKmNvbXBvbmVudE5hbWUsIGNvbnN0IGNoYXIgKm5hbWUgPSAiT3V0cHV0IikKKyAgICAgICAgOiBCdWZmZXJzKGNvbXBvbmVudE5hbWUsIG5hbWUpIHsgfQorICAgIHZpcnR1YWwgfk91dHB1dEJ1ZmZlcnMoKSA9IGRlZmF1bHQ7CisKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlciBvdXRwdXQgQzJCdWZmZXIgZnJvbSB0aGUgY29tcG9uZW50IGFuZCBvYnRhaW4gY29ycmVzcG9uZGluZworICAgICAqIGluZGV4IGFuZCBNZWRpYUNvZGVjQnVmZmVyIG9iamVjdC4gUmV0dXJucyBmYWxzZSBpZiByZWdpc3RyYXRpb24KKyAgICAgKiBmYWlscy4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlZ2lzdGVyQnVmZmVyKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyLAorICAgICAgICAgICAgc2l6ZV90ICppbmRleCwKKyAgICAgICAgICAgIHNwPE1lZGlhQ29kZWNCdWZmZXI+ICpjbGllbnRCdWZmZXIpID0gMDsKKworICAgIC8qKgorICAgICAqIFJlZ2lzdGVyIGNvZGVjIHNwZWNpZmljIGRhdGEgYXMgYSBidWZmZXIgdG8gYmUgY29uc2lzdGVudCB3aXRoCisgICAgICogTWVkaWFDb2RlYyBiZWhhdmlvci4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlZ2lzdGVyQ3NkKAorICAgICAgICAgICAgY29uc3QgQzJTdHJlYW1Dc2RJbmZvOjpvdXRwdXQgKiAvKiBjc2QgKi8sCisgICAgICAgICAgICBzaXplX3QgKiAvKiBpbmRleCAqLywKKyAgICAgICAgICAgIHNwPE1lZGlhQ29kZWNCdWZmZXI+ICogLyogY2xpZW50QnVmZmVyICovKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZWxlYXNlIHRoZSBidWZmZXIgb2J0YWluZWQgZnJvbSByZWdpc3RlckJ1ZmZlcigpIGFuZCBnZXQgdGhlCisgICAgICogYXNzb2NpYXRlZCBDMkJ1ZmZlciBvYmplY3QgYmFjay4gUmV0dXJucyB0cnVlIGlmIHRoZSBidWZmZXIgd2FzIG9uIGZpbGUKKyAgICAgKiBhbmQgcmVsZWFzZWQgc3VjY2Vzc2Z1bGx5LgorICAgICAqLworICAgIHZpcnR1YWwgYm9vbCByZWxlYXNlQnVmZmVyKAorICAgICAgICAgICAgY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJmJ1ZmZlciwgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAqYzJidWZmZXIpID0gMDsKKworICAgIC8qKgorICAgICAqIEZsdXNoIGludGVybmFsIHN0YXRlLiBBZnRlciB0aGlzIGNhbGwsIG5vIGluZGV4IG9yIGJ1ZmZlciBwcmV2aW91c2x5CisgICAgICogcmV0dXJuZWQgZnJvbSByZWdpc3RlckJ1ZmZlcigpIGlzIHZhbGlkLgorICAgICAqLworICAgIHZpcnR1YWwgdm9pZCBmbHVzaChjb25zdCBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+ICZmbHVzaGVkV29yaykgPSAwOworCisgICAgLyoqCisgICAgICogUmV0dXJuIGFycmF5LWJhY2tlZCB2ZXJzaW9uIG9mIG91dHB1dCBidWZmZXJzLiBUaGUgcmV0dXJuZWQgb2JqZWN0CisgICAgICogc2hhbGwgcmV0YWluIHRoZSBpbnRlcm5hbCBzdGF0ZSBzbyB0aGF0IGl0IHdpbGwgaG9ub3IgaW5kZXggYW5kCisgICAgICogYnVmZmVyIGZyb20gcHJldmlvdXMgY2FsbHMgb2YgcmVnaXN0ZXJCdWZmZXIoKS4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0ZDo6dW5pcXVlX3B0cjxPdXRwdXRCdWZmZXJzPiB0b0FycmF5TW9kZShzaXplX3Qgc2l6ZSkgPSAwOworCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZSBTa2lwQ3V0QnVmZmVyIG9iamVjdC4KKyAgICAgKi8KKyAgICB2b2lkIGluaXRTa2lwQ3V0QnVmZmVyKAorICAgICAgICAgICAgaW50MzJfdCBkZWxheSwgaW50MzJfdCBwYWRkaW5nLCBpbnQzMl90IHNhbXBsZVJhdGUsIGludDMyX3QgY2hhbm5lbENvdW50KSB7CisgICAgICAgIENIRUNLKG1Ta2lwQ3V0QnVmZmVyID09IG51bGxwdHIpOworICAgICAgICBtRGVsYXkgPSBkZWxheTsKKyAgICAgICAgbVBhZGRpbmcgPSBwYWRkaW5nOworICAgICAgICBtU2FtcGxlUmF0ZSA9IHNhbXBsZVJhdGU7CisgICAgICAgIHNldFNraXBDdXRCdWZmZXIoZGVsYXksIHBhZGRpbmcsIGNoYW5uZWxDb3VudCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVXBkYXRlIHRoZSBTa2lwQ3V0QnVmZmVyIG9iamVjdC4gTm8tb3AgaWYgaXQncyBuZXZlciBpbml0aWFsaXplZC4KKyAgICAgKi8KKyAgICB2b2lkIHVwZGF0ZVNraXBDdXRCdWZmZXIoaW50MzJfdCBzYW1wbGVSYXRlLCBpbnQzMl90IGNoYW5uZWxDb3VudCkgeworICAgICAgICBpZiAobVNraXBDdXRCdWZmZXIgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGludDMyX3QgZGVsYXkgPSBtRGVsYXk7CisgICAgICAgIGludDMyX3QgcGFkZGluZyA9IG1QYWRkaW5nOworICAgICAgICBpZiAoc2FtcGxlUmF0ZSAhPSBtU2FtcGxlUmF0ZSkgeworICAgICAgICAgICAgZGVsYXkgPSAoKGludDY0X3QpZGVsYXkgKiBzYW1wbGVSYXRlKSAvIG1TYW1wbGVSYXRlOworICAgICAgICAgICAgcGFkZGluZyA9ICgoaW50NjRfdClwYWRkaW5nICogc2FtcGxlUmF0ZSkgLyBtU2FtcGxlUmF0ZTsKKyAgICAgICAgfQorICAgICAgICBzZXRTa2lwQ3V0QnVmZmVyKGRlbGF5LCBwYWRkaW5nLCBjaGFubmVsQ291bnQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN1Ym1pdCBidWZmZXIgdG8gU2tpcEN1dEJ1ZmZlciBvYmplY3QsIGlmIGluaXRpYWxpemVkLgorICAgICAqLworICAgIHZvaWQgc3VibWl0KGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+ICZidWZmZXIpIHsKKyAgICAgICAgaWYgKG1Ta2lwQ3V0QnVmZmVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIG1Ta2lwQ3V0QnVmZmVyLT5zdWJtaXQoYnVmZmVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRyYW5zZmVyIFNraXBDdXRCdWZmZXIgb2JqZWN0IHRvIHRoZSBvdGhlciBCdWZmZXJzIG9iamVjdC4KKyAgICAgKi8KKyAgICB2b2lkIHRyYW5zZmVyU2tpcEN1dEJ1ZmZlcihjb25zdCBzcDxTa2lwQ3V0QnVmZmVyPiAmc2NiKSB7CisgICAgICAgIG1Ta2lwQ3V0QnVmZmVyID0gc2NiOworICAgIH0KKworcHJvdGVjdGVkOgorICAgIHNwPFNraXBDdXRCdWZmZXI+IG1Ta2lwQ3V0QnVmZmVyOworCitwcml2YXRlOgorICAgIGludDMyX3QgbURlbGF5OworICAgIGludDMyX3QgbVBhZGRpbmc7CisgICAgaW50MzJfdCBtU2FtcGxlUmF0ZTsKKworICAgIHZvaWQgc2V0U2tpcEN1dEJ1ZmZlcihpbnQzMl90IHNraXAsIGludDMyX3QgY3V0LCBpbnQzMl90IGNoYW5uZWxDb3VudCkgeworICAgICAgICBpZiAobVNraXBDdXRCdWZmZXIgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgc2l6ZV90IHByZXZTaXplID0gbVNraXBDdXRCdWZmZXItPnNpemUoKTsKKyAgICAgICAgICAgIGlmIChwcmV2U2l6ZSAhPSAwdSkgeworICAgICAgICAgICAgICAgIEFMT0dEKCJbJXNdIFJlcGxhY2luZyBTa2lwQ3V0QnVmZmVyIGhvbGRpbmcgJXp1IGJ5dGVzIiwgbU5hbWUsIHByZXZTaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtU2tpcEN1dEJ1ZmZlciA9IG5ldyBTa2lwQ3V0QnVmZmVyKHNraXAsIGN1dCwgY2hhbm5lbENvdW50KTsKKyAgICB9CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhPdXRwdXRCdWZmZXJzKTsKK307CisKK25hbWVzcGFjZSB7CisKKy8vIFRPRE86IGdldCB0aGlzIGluZm8gZnJvbSBjb21wb25lbnQKK2NvbnN0IHN0YXRpYyBzaXplX3Qga01pbklucHV0QnVmZmVyQXJyYXlTaXplID0gNDsKK2NvbnN0IHN0YXRpYyBzaXplX3Qga01heFBpcGVsaW5lQ2FwYWNpdHkgPSAxODsKK2NvbnN0IHN0YXRpYyBzaXplX3Qga0NoYW5uZWxPdXRwdXREZWxheSA9IDA7Citjb25zdCBzdGF0aWMgc2l6ZV90IGtNaW5PdXRwdXRCdWZmZXJBcnJheVNpemUgPSBrTWF4UGlwZWxpbmVDYXBhY2l0eSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrQ2hhbm5lbE91dHB1dERlbGF5OworY29uc3Qgc3RhdGljIHNpemVfdCBrTGluZWFyQnVmZmVyU2l6ZSA9IDEwNDg1NzY7CisvLyBUaGlzIGNhbiBmaXQgNEsgUkdCQSBmcmFtZSwgYW5kIG1vc3QgbGlrZWx5IGNsaWVudCB3b24ndCBuZWVkIG1vcmUgdGhhbiB0aGlzLgorY29uc3Qgc3RhdGljIHNpemVfdCBrTWF4TGluZWFyQnVmZmVyU2l6ZSA9IDM4NDAgKiAyMTYwICogNDsKKworLyoqCisgKiBTaW1wbGUgbG9jYWwgYnVmZmVyIHBvb2wgYmFja2VkIGJ5IHN0ZDo6dmVjdG9yLgorICovCitjbGFzcyBMb2NhbEJ1ZmZlclBvb2wgOiBwdWJsaWMgc3RkOjplbmFibGVfc2hhcmVkX2Zyb21fdGhpczxMb2NhbEJ1ZmZlclBvb2w+IHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgTG9jYWxCdWZmZXJQb29sIG9iamVjdC4KKyAgICAgKgorICAgICAqIFxwYXJhbSBwb29sQ2FwYWNpdHkgIG1heCB0b3RhbCBzaXplIG9mIGJ1ZmZlcnMgbWFuYWdlZCBieSB0aGlzIHBvb2wuCisgICAgICoKKyAgICAgKiBccmV0dXJuICBhIG5ld2x5IGNyZWF0ZWQgcG9vbCBvYmplY3QuCisgICAgICovCisgICAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxMb2NhbEJ1ZmZlclBvb2w+IENyZWF0ZShzaXplX3QgcG9vbENhcGFjaXR5KSB7CisgICAgICAgIHJldHVybiBzdGQ6OnNoYXJlZF9wdHI8TG9jYWxCdWZmZXJQb29sPihuZXcgTG9jYWxCdWZmZXJQb29sKHBvb2xDYXBhY2l0eSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBhbiBBQnVmZmVyIG9iamVjdCB3aG9zZSBzaXplIGlzIGF0IGxlYXN0IHxjYXBhY2l0eXwuCisgICAgICoKKyAgICAgKiBccGFyYW0gICBjYXBhY2l0eSAgcmVxdWVzdGVkIGNhcGFjaXR5CisgICAgICogXHJldHVybiAgbnVsbHB0ciBpZiB0aGUgcG9vbCBjYXBhY2l0eSBpcyByZWFjaGVkCisgICAgICogICAgICAgICAgYW4gQUJ1ZmZlciBvYmplY3Qgb3RoZXJ3aXNlLgorICAgICAqLworICAgIHNwPEFCdWZmZXI+IG5ld0J1ZmZlcihzaXplX3QgY2FwYWNpdHkpIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKKyAgICAgICAgYXV0byBpdCA9IHN0ZDo6ZmluZF9pZigKKyAgICAgICAgICAgICAgICBtUG9vbC5iZWdpbigpLCBtUG9vbC5lbmQoKSwKKyAgICAgICAgICAgICAgICBbY2FwYWNpdHldKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZ2ZWMpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZlYy5jYXBhY2l0eSgpID49IGNhcGFjaXR5OworICAgICAgICAgICAgICAgIH0pOworICAgICAgICBpZiAoaXQgIT0gbVBvb2wuZW5kKCkpIHsKKyAgICAgICAgICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9IG5ldyBWZWN0b3JCdWZmZXIoc3RkOjptb3ZlKCppdCksIHNoYXJlZF9mcm9tX3RoaXMoKSk7CisgICAgICAgICAgICBtUG9vbC5lcmFzZShpdCk7CisgICAgICAgICAgICByZXR1cm4gYnVmZmVyOworICAgICAgICB9CisgICAgICAgIGlmIChtVXNlZFNpemUgKyBjYXBhY2l0eSA+IG1Qb29sQ2FwYWNpdHkpIHsKKyAgICAgICAgICAgIHdoaWxlICghbVBvb2wuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgIG1Vc2VkU2l6ZSAtPSBtUG9vbC5iYWNrKCkuY2FwYWNpdHkoKTsKKyAgICAgICAgICAgICAgICBtUG9vbC5wb3BfYmFjaygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1Vc2VkU2l6ZSArIGNhcGFjaXR5ID4gbVBvb2xDYXBhY2l0eSkgeworICAgICAgICAgICAgICAgIEFMT0dEKCJtVXNlZFNpemUgPSAlenUsIGNhcGFjaXR5ID0gJXp1LCBtUG9vbENhcGFjaXR5ID0gJXp1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Vc2VkU2l6ZSwgY2FwYWNpdHksIG1Qb29sQ2FwYWNpdHkpOworICAgICAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHZlYyhjYXBhY2l0eSk7CisgICAgICAgIG1Vc2VkU2l6ZSArPSB2ZWMuY2FwYWNpdHkoKTsKKyAgICAgICAgcmV0dXJuIG5ldyBWZWN0b3JCdWZmZXIoc3RkOjptb3ZlKHZlYyksIHNoYXJlZF9mcm9tX3RoaXMoKSk7CisgICAgfQorCitwcml2YXRlOgorICAgIC8qKgorICAgICAqIEFCdWZmZXIgYmFja2VkIGJ5IHN0ZDo6dmVjdG9yLgorICAgICAqLworICAgIGNsYXNzIFZlY3RvckJ1ZmZlciA6IHB1YmxpYyA6OmFuZHJvaWQ6OkFCdWZmZXIgeworICAgIHB1YmxpYzoKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvbnN0cnVjdCBhIFZlY3RvckJ1ZmZlciBieSB0YWtpbmcgdGhlIG93bmVyc2hpcCBvZiBzdXBwbGllZCB2ZWN0b3IuCisgICAgICAgICAqCisgICAgICAgICAqIFxwYXJhbSB2ZWMgICBiYWNraW5nIHZlY3RvciBvZiB0aGUgYnVmZmVyLiB0aGlzIG9iamVjdCB0YWtlcworICAgICAgICAgKiAgICAgICAgICAgICAgb3duZXJzaGlwIGF0IGNvbnN0cnVjdGlvbi4KKyAgICAgICAgICogXHBhcmFtIHBvb2wgIGEgTG9jYWxCdWZmZXJQb29sIG9iamVjdCB0byByZXR1cm4gdGhlIHZlY3RvciBhdAorICAgICAgICAgKiAgICAgICAgICAgICAgZGVzdHJ1Y3Rpb24uCisgICAgICAgICAqLworICAgICAgICBWZWN0b3JCdWZmZXIoc3RkOjp2ZWN0b3I8dWludDhfdD4gJiZ2ZWMsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxMb2NhbEJ1ZmZlclBvb2w+ICZwb29sKQorICAgICAgICAgICAgOiBBQnVmZmVyKHZlYy5kYXRhKCksIHZlYy5jYXBhY2l0eSgpKSwKKyAgICAgICAgICAgICAgbVZlYyhzdGQ6Om1vdmUodmVjKSksCisgICAgICAgICAgICAgIG1Qb29sKHBvb2wpIHsKKyAgICAgICAgfQorCisgICAgICAgIH5WZWN0b3JCdWZmZXIoKSBvdmVycmlkZSB7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8TG9jYWxCdWZmZXJQb29sPiBwb29sID0gbVBvb2wubG9jaygpOworICAgICAgICAgICAgaWYgKHBvb2wpIHsKKyAgICAgICAgICAgICAgICAvLyBJZiBwb29sIGlzIGFsaXZlLCByZXR1cm4gdGhlIHZlY3RvciBiYWNrIHRvIHRoZSBwb29sIHNvIHRoYXQKKyAgICAgICAgICAgICAgICAvLyBpdCBjYW4gYmUgcmVjeWNsZWQuCisgICAgICAgICAgICAgICAgcG9vbC0+cmV0dXJuVmVjdG9yKHN0ZDo6bW92ZShtVmVjKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IG1WZWM7CisgICAgICAgIHN0ZDo6d2Vha19wdHI8TG9jYWxCdWZmZXJQb29sPiBtUG9vbDsKKyAgICB9OworCisgICAgTXV0ZXggbU11dGV4OworICAgIHNpemVfdCBtUG9vbENhcGFjaXR5OworICAgIHNpemVfdCBtVXNlZFNpemU7CisgICAgc3RkOjpsaXN0PHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PiBtUG9vbDsKKworICAgIC8qKgorICAgICAqIFByaXZhdGUgY29uc3RydWN0b3IgdG8gcHJldmVudCBjb25zdHJ1Y3Rpbmcgbm9uLW1hbmFnZWQgTG9jYWxCdWZmZXJQb29sLgorICAgICAqLworICAgIGV4cGxpY2l0IExvY2FsQnVmZmVyUG9vbChzaXplX3QgcG9vbENhcGFjaXR5KQorICAgICAgICA6IG1Qb29sQ2FwYWNpdHkocG9vbENhcGFjaXR5KSwgbVVzZWRTaXplKDApIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUYWtlIGJhY2sgdGhlIG93bmVyc2hpcCBvZiB2ZWMgZnJvbSB0aGUgZGVzdHJ1Y3RlZCBWZWN0b3JCdWZmZXIgYW5kIHB1dAorICAgICAqIGl0IGluIGZyb250IG9mIHRoZSBwb29sLgorICAgICAqLworICAgIHZvaWQgcmV0dXJuVmVjdG9yKHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICYmdmVjKSB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1NdXRleCk7CisgICAgICAgIG1Qb29sLnB1c2hfZnJvbnQoc3RkOjptb3ZlKHZlYykpOworICAgIH0KKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKExvY2FsQnVmZmVyUG9vbCk7Cit9OworCitzcDxHcmFwaGljQmxvY2tCdWZmZXI+IEFsbG9jYXRlR3JhcGhpY0J1ZmZlcigKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCwKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsCisgICAgICAgIHVpbnQzMl90IHBpeGVsRm9ybWF0LAorICAgICAgICBjb25zdCBDMk1lbW9yeVVzYWdlICZ1c2FnZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPExvY2FsQnVmZmVyUG9vbD4gJmxvY2FsQnVmZmVyUG9vbCkgeworICAgIGludDMyX3Qgd2lkdGgsIGhlaWdodDsKKyAgICBpZiAoIWZvcm1hdC0+ZmluZEludDMyKCJ3aWR0aCIsICZ3aWR0aCkgfHwgIWZvcm1hdC0+ZmluZEludDMyKCJoZWlnaHQiLCAmaGVpZ2h0KSkgeworICAgICAgICBBTE9HRCgiZm9ybWF0IGxhY2tzIHdpZHRoIG9yIGhlaWdodCIpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+IGJsb2NrOworICAgIGMyX3N0YXR1c190IGVyciA9IHBvb2wtPmZldGNoR3JhcGhpY0Jsb2NrKAorICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgcGl4ZWxGb3JtYXQsIHVzYWdlLCAmYmxvY2spOworICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0QoImZldGNoIGdyYXBoaWMgYmxvY2sgZmFpbGVkOiAlZCIsIGVycik7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIHJldHVybiBHcmFwaGljQmxvY2tCdWZmZXI6OkFsbG9jYXRlKAorICAgICAgICAgICAgZm9ybWF0LAorICAgICAgICAgICAgYmxvY2ssCisgICAgICAgICAgICBbbG9jYWxCdWZmZXJQb29sXShzaXplX3QgY2FwYWNpdHkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxCdWZmZXJQb29sLT5uZXdCdWZmZXIoY2FwYWNpdHkpOworICAgICAgICAgICAgfSk7Cit9CisKK2NsYXNzIEJ1ZmZlcnNBcnJheUltcGw7CisKKy8qKgorICogRmxleGlibGUgYnVmZmVyIHNsb3RzIGltcGxlbWVudGF0aW9uLgorICovCitjbGFzcyBGbGV4QnVmZmVyc0ltcGwgeworcHVibGljOgorICAgIEZsZXhCdWZmZXJzSW1wbChjb25zdCBjaGFyICpuYW1lKQorICAgICAgICA6IG1JbXBsTmFtZShzdGQ6OnN0cmluZyhuYW1lKSArICIuSW1wbCIpLAorICAgICAgICAgIG1OYW1lKG1JbXBsTmFtZS5jX3N0cigpKSB7IH0KKworICAgIC8qKgorICAgICAqIEFzc2lnbiBhbiBlbXB0eSBzbG90IGZvciBhIGJ1ZmZlciBhbmQgcmV0dXJuIHRoZSBpbmRleC4gSWYgdGhlcmUncyBubworICAgICAqIGVtcHR5IHNsb3QsIGp1c3QgYWRkIG9uZSBhdCB0aGUgZW5kIGFuZCByZXR1cm4gaXQuCisgICAgICoKKyAgICAgKiBccGFyYW0gYnVmZmVyW2luXSAgYSBuZXcgYnVmZmVyIHRvIGFzc2lnbiBhIHNsb3QuCisgICAgICogXHJldHVybiAgICAgICAgICAgIGluZGV4IG9mIHRoZSBhc3NpZ25lZCBzbG90LgorICAgICAqLworICAgIHNpemVfdCBhc3NpZ25TbG90KGNvbnN0IHNwPENvZGVjMkJ1ZmZlcj4gJmJ1ZmZlcikgeworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1CdWZmZXJzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBpZiAobUJ1ZmZlcnNbaV0uY2xpZW50QnVmZmVyID09IG51bGxwdHIKKyAgICAgICAgICAgICAgICAgICAgJiYgbUJ1ZmZlcnNbaV0uY29tcEJ1ZmZlci5leHBpcmVkKCkpIHsKKyAgICAgICAgICAgICAgICBtQnVmZmVyc1tpXS5jbGllbnRCdWZmZXIgPSBidWZmZXI7CisgICAgICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbUJ1ZmZlcnMucHVzaF9iYWNrKHsgYnVmZmVyLCBzdGQ6OndlYWtfcHRyPEMyQnVmZmVyPigpIH0pOworICAgICAgICByZXR1cm4gbUJ1ZmZlcnMuc2l6ZSgpIC0gMTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWxlYXNlIHRoZSBzbG90IGZyb20gdGhlIGNsaWVudCwgYW5kIGdldCB0aGUgQzJCdWZmZXIgb2JqZWN0IGJhY2sgZnJvbQorICAgICAqIHRoZSBwcmV2aW91c2x5IGFzc2lnbmVkIGJ1ZmZlci4gTm90ZSB0aGF0IHRoZSBzbG90IGlzIG5vdCBjb21wbGV0ZWx5IGZyZWUKKyAgICAgKiB1bnRpbCB0aGUgcmV0dXJuZWQgQzJCdWZmZXIgb2JqZWN0IGlzIGZyZWVkLgorICAgICAqCisgICAgICogXHBhcmFtICAgYnVmZmVyW2luXSAgICAgICAgdGhlIGJ1ZmZlciBwcmV2aW91c2x5IGFzc2lnbmVkIGEgc2xvdC4KKyAgICAgKiBccGFyYW0gICBjMmJ1ZmZlcltpbixvdXRdICBwb2ludGVyIHRvIEMyQnVmZmVyIHRvIGJlIHBvcHVsYXRlZC4gSWdub3JlZAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIG51bGwuCisgICAgICogXHJldHVybiAgdHJ1ZSAgaWYgdGhlIGJ1ZmZlciBpcyBzdWNjZXNzZnVsbHkgcmVsZWFzZWQgZnJvbSBhIHNsb3QKKyAgICAgKiAgICAgICAgICBmYWxzZSBvdGhlcndpc2UKKyAgICAgKi8KKyAgICBib29sIHJlbGVhc2VTbG90KGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+ICZidWZmZXIsIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gKmMyYnVmZmVyKSB7CisgICAgICAgIHNwPENvZGVjMkJ1ZmZlcj4gY2xpZW50QnVmZmVyOworICAgICAgICBzaXplX3QgaW5kZXggPSBtQnVmZmVycy5zaXplKCk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUJ1ZmZlcnMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIGlmIChtQnVmZmVyc1tpXS5jbGllbnRCdWZmZXIgPT0gYnVmZmVyKSB7CisgICAgICAgICAgICAgICAgY2xpZW50QnVmZmVyID0gbUJ1ZmZlcnNbaV0uY2xpZW50QnVmZmVyOworICAgICAgICAgICAgICAgIG1CdWZmZXJzW2ldLmNsaWVudEJ1ZmZlci5jbGVhcigpOworICAgICAgICAgICAgICAgIGluZGV4ID0gaTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoY2xpZW50QnVmZmVyID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dWKCJbJXNdICVzOiBObyBtYXRjaGluZyBidWZmZXIgZm91bmQiLCBtTmFtZSwgX19mdW5jX18pOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gcmVzdWx0ID0gY2xpZW50QnVmZmVyLT5hc0MyQnVmZmVyKCk7CisgICAgICAgIG1CdWZmZXJzW2luZGV4XS5jb21wQnVmZmVyID0gcmVzdWx0OworICAgICAgICBpZiAoYzJidWZmZXIpIHsKKyAgICAgICAgICAgICpjMmJ1ZmZlciA9IHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBib29sIGV4cGlyZUNvbXBvbmVudEJ1ZmZlcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZjMmJ1ZmZlcikgeworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1CdWZmZXJzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGNvbXBCdWZmZXIgPQorICAgICAgICAgICAgICAgICAgICBtQnVmZmVyc1tpXS5jb21wQnVmZmVyLmxvY2soKTsKKyAgICAgICAgICAgIGlmICghY29tcEJ1ZmZlciB8fCBjb21wQnVmZmVyICE9IGMyYnVmZmVyKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQnVmZmVyc1tpXS5jbGllbnRCdWZmZXIgPSBudWxscHRyOworICAgICAgICAgICAgbUJ1ZmZlcnNbaV0uY29tcEJ1ZmZlci5yZXNldCgpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoIlslc10gY29kZWMgcmVsZWFzZWQgYW4gdW5rbm93biBidWZmZXIiLCBtTmFtZSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB2b2lkIGZsdXNoKCkgeworICAgICAgICBBTE9HVigiWyVzXSBidWZmZXJzIGFyZSBmbHVzaGVkICV6dSIsIG1OYW1lLCBtQnVmZmVycy5zaXplKCkpOworICAgICAgICBtQnVmZmVycy5jbGVhcigpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgQnVmZmVyc0FycmF5SW1wbDsKKworICAgIHN0ZDo6c3RyaW5nIG1JbXBsTmFtZTsgLy8vPCBuYW1lIGZvciBkZWJ1Z2dpbmcKKyAgICBjb25zdCBjaGFyICptTmFtZTsgLy8vPCBDLXN0cmluZyB2ZXJzaW9uIG9mIG5hbWUKKworICAgIHN0cnVjdCBFbnRyeSB7CisgICAgICAgIHNwPENvZGVjMkJ1ZmZlcj4gY2xpZW50QnVmZmVyOworICAgICAgICBzdGQ6OndlYWtfcHRyPEMyQnVmZmVyPiBjb21wQnVmZmVyOworICAgIH07CisgICAgc3RkOjp2ZWN0b3I8RW50cnk+IG1CdWZmZXJzOworfTsKKworLyoqCisgKiBTdGF0aWMgYnVmZmVyIHNsb3RzIGltcGxlbWVudGF0aW9uIGJhc2VkIG9uIGEgZml4ZWQtc2l6ZSBhcnJheS4KKyAqLworY2xhc3MgQnVmZmVyc0FycmF5SW1wbCB7CitwdWJsaWM6CisgICAgQnVmZmVyc0FycmF5SW1wbCgpCisgICAgICAgIDogbUltcGxOYW1lKCJCdWZmZXJzQXJyYXlJbXBsIiksCisgICAgICAgICAgbU5hbWUobUltcGxOYW1lLmNfc3RyKCkpIHsgfQorCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZSBidWZmZXIgYXJyYXkgZnJvbSB0aGUgb3JpZ2luYWwgfGltcGx8LiBUaGUgYnVmZmVycyBrbm93biBieQorICAgICAqIHRoZSBjbGllbnQgaXMgcHJlc2VydmVkLCBhbmQgdGhlIGVtcHR5IHNsb3RzIGFyZSBwb3B1bGF0ZWQgc28gdGhhdCB0aGUKKyAgICAgKiBhcnJheSBzaXplIGlzIGF0IGxlYXN0IHxtaW5TaXplfC4KKyAgICAgKgorICAgICAqIFxwYXJhbSBpbXBsW2luXSAgICAgIEZsZXhCdWZmZXJzSW1wbCBvYmplY3QgdXNlZCBzbyBmYXIuCisgICAgICogXHBhcmFtIG1pblNpemVbaW5dICAgbWluaW11bSBzaXplIG9mIHRoZSBidWZmZXIgYXJyYXkuCisgICAgICogXHBhcmFtIGFsbG9jYXRlW2luXSAgZnVuY3Rpb24gdG8gYWxsb2NhdGUgYSBjbGllbnQgYnVmZmVyIGZvciBhbiBlbXB0eSBzbG90LgorICAgICAqLworICAgIHZvaWQgaW5pdGlhbGl6ZSgKKyAgICAgICAgICAgIGNvbnN0IEZsZXhCdWZmZXJzSW1wbCAmaW1wbCwKKyAgICAgICAgICAgIHNpemVfdCBtaW5TaXplLAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjxzcDxDb2RlYzJCdWZmZXI+KCk+IGFsbG9jYXRlKSB7CisgICAgICAgIG1JbXBsTmFtZSA9IGltcGwubUltcGxOYW1lICsgIltOXSI7CisgICAgICAgIG1OYW1lID0gbUltcGxOYW1lLmNfc3RyKCk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW1wbC5tQnVmZmVycy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgc3A8Q29kZWMyQnVmZmVyPiBjbGllbnRCdWZmZXIgPSBpbXBsLm1CdWZmZXJzW2ldLmNsaWVudEJ1ZmZlcjsKKyAgICAgICAgICAgIGJvb2wgb3duZWRCeUNsaWVudCA9IChjbGllbnRCdWZmZXIgIT0gbnVsbHB0cik7CisgICAgICAgICAgICBpZiAoIW93bmVkQnlDbGllbnQpIHsKKyAgICAgICAgICAgICAgICBjbGllbnRCdWZmZXIgPSBhbGxvY2F0ZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUJ1ZmZlcnMucHVzaF9iYWNrKHsgY2xpZW50QnVmZmVyLCBpbXBsLm1CdWZmZXJzW2ldLmNvbXBCdWZmZXIsIG93bmVkQnlDbGllbnQgfSk7CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoIlslc10gY29udmVydGVkICV6dSBidWZmZXJzIHRvIGFycmF5IG1vZGUgb2YgJXp1IiwgbU5hbWUsIG1CdWZmZXJzLnNpemUoKSwgbWluU2l6ZSk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSBpbXBsLm1CdWZmZXJzLnNpemUoKTsgaSA8IG1pblNpemU7ICsraSkgeworICAgICAgICAgICAgbUJ1ZmZlcnMucHVzaF9iYWNrKHsgYWxsb2NhdGUoKSwgc3RkOjp3ZWFrX3B0cjxDMkJ1ZmZlcj4oKSwgZmFsc2UgfSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHcmFiIGEgYnVmZmVyIGZyb20gdGhlIHVuZGVybHlpbmcgYXJyYXkgd2hpY2ggbWF0Y2hlcyB0aGUgY3JpdGVyaWEuCisgICAgICoKKyAgICAgKiBccGFyYW0gaW5kZXhbb3V0XSAgICBpbmRleCBvZiB0aGUgc2xvdC4KKyAgICAgKiBccGFyYW0gYnVmZmVyW291dF0gICB0aGUgbWF0Y2hpbmcgYnVmZmVyLgorICAgICAqIFxwYXJhbSBtYXRjaFtpbl0gICAgIGEgZnVuY3Rpb24gdG8gdGVzdCB3aGV0aGVyIHRoZSBidWZmZXIgbWF0Y2hlcyB0aGUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBjcml0ZXJpYSBvciBub3QuCisgICAgICogXHJldHVybiBPSyAgICAgICAgICAgaWYgc3VjY2Vzc2Z1bCwKKyAgICAgKiAgICAgICAgIFdPVUxEX0JMT0NLICBpZiBzbG90cyBhcmUgYmVpbmcgdXNlZCwKKyAgICAgKiAgICAgICAgIE5PX01FTU9SWSAgICBpZiBubyBzbG90IG1hdGNoZXMgdGhlIGNyaXRlcmlhLCBldmVuIHRob3VnaCBpdCdzCisgICAgICogICAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlCisgICAgICovCisgICAgc3RhdHVzX3QgZ3JhYkJ1ZmZlcigKKyAgICAgICAgICAgIHNpemVfdCAqaW5kZXgsCisgICAgICAgICAgICBzcDxDb2RlYzJCdWZmZXI+ICpidWZmZXIsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPGJvb2woY29uc3Qgc3A8Q29kZWMyQnVmZmVyPiAmKT4gbWF0Y2ggPQorICAgICAgICAgICAgICAgIFtdKGNvbnN0IHNwPENvZGVjMkJ1ZmZlcj4gJikgeyByZXR1cm4gdHJ1ZTsgfSkgeworICAgICAgICAvLyBhbGxCdWZmZXJzRG9udE1hdGNoIHJlbWFpbnMgdHJ1ZSBpZiBhbGwgYnVmZmVycyBhcmUgYXZhaWxhYmxlIGJ1dAorICAgICAgICAvLyBtYXRjaCgpIHJldHVybnMgZmFsc2UgZm9yIGV2ZXJ5IGJ1ZmZlci4KKyAgICAgICAgYm9vbCBhbGxCdWZmZXJzRG9udE1hdGNoID0gdHJ1ZTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQnVmZmVycy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgaWYgKCFtQnVmZmVyc1tpXS5vd25lZEJ5Q2xpZW50ICYmIG1CdWZmZXJzW2ldLmNvbXBCdWZmZXIuZXhwaXJlZCgpKSB7CisgICAgICAgICAgICAgICAgaWYgKG1hdGNoKG1CdWZmZXJzW2ldLmNsaWVudEJ1ZmZlcikpIHsKKyAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlcnNbaV0ub3duZWRCeUNsaWVudCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICpidWZmZXIgPSBtQnVmZmVyc1tpXS5jbGllbnRCdWZmZXI7CisgICAgICAgICAgICAgICAgICAgICgqYnVmZmVyKS0+bWV0YSgpLT5jbGVhcigpOworICAgICAgICAgICAgICAgICAgICAoKmJ1ZmZlciktPnNldFJhbmdlKDAsICgqYnVmZmVyKS0+Y2FwYWNpdHkoKSk7CisgICAgICAgICAgICAgICAgICAgICppbmRleCA9IGk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGFsbEJ1ZmZlcnNEb250TWF0Y2ggPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYWxsQnVmZmVyc0RvbnRNYXRjaCA/IE5PX01FTU9SWSA6IFdPVUxEX0JMT0NLOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgYnVmZmVyIGZyb20gdGhlIGNsaWVudCwgYW5kIGdldCB0aGUgQzJCdWZmZXIgb2JqZWN0IGJhY2sgZnJvbQorICAgICAqIHRoZSBidWZmZXIuIE5vdGUgdGhhdCB0aGUgc2xvdCBpcyBub3QgY29tcGxldGVseSBmcmVlIHVudGlsIHRoZSByZXR1cm5lZAorICAgICAqIEMyQnVmZmVyIG9iamVjdCBpcyBmcmVlZC4KKyAgICAgKgorICAgICAqIFxwYXJhbSAgIGJ1ZmZlcltpbl0gICAgICAgIHRoZSBidWZmZXIgcHJldmlvdXNseSBncmFiYmVkLgorICAgICAqIFxwYXJhbSAgIGMyYnVmZmVyW2luLG91dF0gIHBvaW50ZXIgdG8gQzJCdWZmZXIgdG8gYmUgcG9wdWxhdGVkLiBJZ25vcmVkCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbnVsbC4KKyAgICAgKiBccmV0dXJuICB0cnVlICBpZiB0aGUgYnVmZmVyIGlzIHN1Y2Nlc3NmdWxseSByZXR1cm5lZAorICAgICAqICAgICAgICAgIGZhbHNlIG90aGVyd2lzZQorICAgICAqLworICAgIGJvb2wgcmV0dXJuQnVmZmVyKGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+ICZidWZmZXIsIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gKmMyYnVmZmVyKSB7CisgICAgICAgIHNwPENvZGVjMkJ1ZmZlcj4gY2xpZW50QnVmZmVyOworICAgICAgICBzaXplX3QgaW5kZXggPSBtQnVmZmVycy5zaXplKCk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUJ1ZmZlcnMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIGlmIChtQnVmZmVyc1tpXS5jbGllbnRCdWZmZXIgPT0gYnVmZmVyKSB7CisgICAgICAgICAgICAgICAgaWYgKCFtQnVmZmVyc1tpXS5vd25lZEJ5Q2xpZW50KSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJbJXNdIENsaWVudCByZXR1cm5lZCBhIGJ1ZmZlciBpdCBkb2VzIG5vdCBvd24gYWNjb3JkaW5nIHRvIG91ciByZWNvcmQ6ICV6dSIsIG1OYW1lLCBpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2xpZW50QnVmZmVyID0gbUJ1ZmZlcnNbaV0uY2xpZW50QnVmZmVyOworICAgICAgICAgICAgICAgIG1CdWZmZXJzW2ldLm93bmVkQnlDbGllbnQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBpbmRleCA9IGk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNsaWVudEJ1ZmZlciA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HVigiWyVzXSAlczogTm8gbWF0Y2hpbmcgYnVmZmVyIGZvdW5kIiwgbU5hbWUsIF9fZnVuY19fKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigiWyVzXSAlczogbWF0Y2hpbmcgYnVmZmVyIGZvdW5kIChpbmRleD0lenUpIiwgbU5hbWUsIF9fZnVuY19fLCBpbmRleCk7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gcmVzdWx0ID0gY2xpZW50QnVmZmVyLT5hc0MyQnVmZmVyKCk7CisgICAgICAgIG1CdWZmZXJzW2luZGV4XS5jb21wQnVmZmVyID0gcmVzdWx0OworICAgICAgICBpZiAoYzJidWZmZXIpIHsKKyAgICAgICAgICAgICpjMmJ1ZmZlciA9IHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBib29sIGV4cGlyZUNvbXBvbmVudEJ1ZmZlcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZjMmJ1ZmZlcikgeworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1CdWZmZXJzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGNvbXBCdWZmZXIgPQorICAgICAgICAgICAgICAgICAgICBtQnVmZmVyc1tpXS5jb21wQnVmZmVyLmxvY2soKTsKKyAgICAgICAgICAgIGlmICghY29tcEJ1ZmZlcikgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGMyYnVmZmVyID09IGNvbXBCdWZmZXIpIHsKKyAgICAgICAgICAgICAgICBpZiAobUJ1ZmZlcnNbaV0ub3duZWRCeUNsaWVudCkgeworICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIHNob3VsZCBub3QgaGFwcGVuLgorICAgICAgICAgICAgICAgICAgICBBTE9HRCgiWyVzXSBjb2RlYyByZWxlYXNlZCBhIGJ1ZmZlciBvd25lZCBieSBjbGllbnQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiKGluZGV4ICV6dSkiLCBtTmFtZSwgaSk7CisgICAgICAgICAgICAgICAgICAgIG1CdWZmZXJzW2ldLm93bmVkQnlDbGllbnQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbUJ1ZmZlcnNbaV0uY29tcEJ1ZmZlci5yZXNldCgpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEFMT0dWKCJbJXNdIGNvZGVjIHJlbGVhc2VkIGFuIHVua25vd24gYnVmZmVyIChhcnJheSBtb2RlKSIsIG1OYW1lKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBvcHVsYXRlIHxhcnJheXwgd2l0aCB0aGUgdW5kZXJseWluZyBidWZmZXIgYXJyYXkuCisgICAgICoKKyAgICAgKiBccGFyYW0gYXJyYXlbb3V0XSAgYW4gYXJyYXkgdG8gYmUgZmlsbGVkIHdpdGggdGhlIHVuZGVybHlpbmcgYnVmZmVyIGFycmF5LgorICAgICAqLworICAgIHZvaWQgZ2V0QXJyYXkoVmVjdG9yPHNwPE1lZGlhQ29kZWNCdWZmZXI+PiAqYXJyYXkpIGNvbnN0IHsKKyAgICAgICAgYXJyYXktPmNsZWFyKCk7CisgICAgICAgIGZvciAoY29uc3QgRW50cnkgJmVudHJ5IDogbUJ1ZmZlcnMpIHsKKyAgICAgICAgICAgIGFycmF5LT5wdXNoKGVudHJ5LmNsaWVudEJ1ZmZlcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgY2xpZW50IGFiYW5kb25lZCBhbGwga25vd24gYnVmZmVycywgc28gcmVjbGFpbSB0aGUgb3duZXJzaGlwLgorICAgICAqLworICAgIHZvaWQgZmx1c2goKSB7CisgICAgICAgIGZvciAoRW50cnkgJmVudHJ5IDogbUJ1ZmZlcnMpIHsKKyAgICAgICAgICAgIGVudHJ5Lm93bmVkQnlDbGllbnQgPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgcmVhbGxvYyhzdGQ6OmZ1bmN0aW9uPHNwPENvZGVjMkJ1ZmZlcj4oKT4gYWxsb2MpIHsKKyAgICAgICAgc2l6ZV90IHNpemUgPSBtQnVmZmVycy5zaXplKCk7CisgICAgICAgIG1CdWZmZXJzLmNsZWFyKCk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7CisgICAgICAgICAgICBtQnVmZmVycy5wdXNoX2JhY2soeyBhbGxvYygpLCBzdGQ6OndlYWtfcHRyPEMyQnVmZmVyPigpLCBmYWxzZSB9KTsKKyAgICAgICAgfQorICAgIH0KKworcHJpdmF0ZToKKyAgICBzdGQ6OnN0cmluZyBtSW1wbE5hbWU7IC8vLzwgbmFtZSBmb3IgZGVidWdnaW5nCisgICAgY29uc3QgY2hhciAqbU5hbWU7IC8vLzwgQy1zdHJpbmcgdmVyc2lvbiBvZiBuYW1lCisKKyAgICBzdHJ1Y3QgRW50cnkgeworICAgICAgICBjb25zdCBzcDxDb2RlYzJCdWZmZXI+IGNsaWVudEJ1ZmZlcjsKKyAgICAgICAgc3RkOjp3ZWFrX3B0cjxDMkJ1ZmZlcj4gY29tcEJ1ZmZlcjsKKyAgICAgICAgYm9vbCBvd25lZEJ5Q2xpZW50OworICAgIH07CisgICAgc3RkOjp2ZWN0b3I8RW50cnk+IG1CdWZmZXJzOworfTsKKworY2xhc3MgSW5wdXRCdWZmZXJzQXJyYXkgOiBwdWJsaWMgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6SW5wdXRCdWZmZXJzIHsKK3B1YmxpYzoKKyAgICBJbnB1dEJ1ZmZlcnNBcnJheShjb25zdCBjaGFyICpjb21wb25lbnROYW1lLCBjb25zdCBjaGFyICpuYW1lID0gIklucHV0W05dIikKKyAgICAgICAgOiBJbnB1dEJ1ZmZlcnMoY29tcG9uZW50TmFtZSwgbmFtZSkgeyB9CisgICAgfklucHV0QnVmZmVyc0FycmF5KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICAgdm9pZCBpbml0aWFsaXplKAorICAgICAgICAgICAgY29uc3QgRmxleEJ1ZmZlcnNJbXBsICZpbXBsLAorICAgICAgICAgICAgc2l6ZV90IG1pblNpemUsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHNwPENvZGVjMkJ1ZmZlcj4oKT4gYWxsb2NhdGUpIHsKKyAgICAgICAgbUltcGwuaW5pdGlhbGl6ZShpbXBsLCBtaW5TaXplLCBhbGxvY2F0ZSk7CisgICAgfQorCisgICAgYm9vbCBpc0FycmF5TW9kZSgpIGNvbnN0IGZpbmFsIHsgcmV0dXJuIHRydWU7IH0KKworICAgIHN0ZDo6dW5pcXVlX3B0cjxDQ29kZWNCdWZmZXJDaGFubmVsOjpJbnB1dEJ1ZmZlcnM+IHRvQXJyYXlNb2RlKAorICAgICAgICAgICAgc2l6ZV90KSBmaW5hbCB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIHZvaWQgZ2V0QXJyYXkoVmVjdG9yPHNwPE1lZGlhQ29kZWNCdWZmZXI+PiAqYXJyYXkpIGNvbnN0IGZpbmFsIHsKKyAgICAgICAgbUltcGwuZ2V0QXJyYXkoYXJyYXkpOworICAgIH0KKworICAgIGJvb2wgcmVxdWVzdE5ld0J1ZmZlcihzaXplX3QgKmluZGV4LCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAqYnVmZmVyKSBvdmVycmlkZSB7CisgICAgICAgIHNwPENvZGVjMkJ1ZmZlcj4gYzJCdWZmZXI7CisgICAgICAgIHN0YXR1c190IGVyciA9IG1JbXBsLmdyYWJCdWZmZXIoaW5kZXgsICZjMkJ1ZmZlcik7CisgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgIGMyQnVmZmVyLT5zZXRGb3JtYXQobUZvcm1hdCk7CisgICAgICAgICAgICAqYnVmZmVyID0gYzJCdWZmZXI7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgYm9vbCByZWxlYXNlQnVmZmVyKAorICAgICAgICAgICAgY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJmJ1ZmZlciwgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAqYzJidWZmZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLnJldHVybkJ1ZmZlcihidWZmZXIsIGMyYnVmZmVyKTsKKyAgICB9CisKKyAgICBib29sIGV4cGlyZUNvbXBvbmVudEJ1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmMyYnVmZmVyKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtSW1wbC5leHBpcmVDb21wb25lbnRCdWZmZXIoYzJidWZmZXIpOworICAgIH0KKworICAgIHZvaWQgZmx1c2goKSBvdmVycmlkZSB7CisgICAgICAgIG1JbXBsLmZsdXNoKCk7CisgICAgfQorCitwcml2YXRlOgorICAgIEJ1ZmZlcnNBcnJheUltcGwgbUltcGw7Cit9OworCitjbGFzcyBMaW5lYXJJbnB1dEJ1ZmZlcnMgOiBwdWJsaWMgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6SW5wdXRCdWZmZXJzIHsKK3B1YmxpYzoKKyAgICBMaW5lYXJJbnB1dEJ1ZmZlcnMoY29uc3QgY2hhciAqY29tcG9uZW50TmFtZSwgY29uc3QgY2hhciAqbmFtZSA9ICIxRC1JbnB1dCIpCisgICAgICAgIDogSW5wdXRCdWZmZXJzKGNvbXBvbmVudE5hbWUsIG5hbWUpLAorICAgICAgICAgIG1JbXBsKG1OYW1lKSB7IH0KKworICAgIGJvb2wgcmVxdWVzdE5ld0J1ZmZlcihzaXplX3QgKmluZGV4LCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAqYnVmZmVyKSBvdmVycmlkZSB7CisgICAgICAgIGludDMyX3QgY2FwYWNpdHkgPSBrTGluZWFyQnVmZmVyU2l6ZTsKKyAgICAgICAgKHZvaWQpbUZvcm1hdC0+ZmluZEludDMyKEtFWV9NQVhfSU5QVVRfU0laRSwgJmNhcGFjaXR5KTsKKyAgICAgICAgaWYgKChzaXplX3QpY2FwYWNpdHkgPiBrTWF4TGluZWFyQnVmZmVyU2l6ZSkgeworICAgICAgICAgICAgQUxPR0QoImNsaWVudCByZXF1ZXN0ZWQgJWQsIGNhcHBlZCB0byAlenUiLCBjYXBhY2l0eSwga01heExpbmVhckJ1ZmZlclNpemUpOworICAgICAgICAgICAgY2FwYWNpdHkgPSBrTWF4TGluZWFyQnVmZmVyU2l6ZTsKKyAgICAgICAgfQorICAgICAgICAvLyBUT0RPOiBwcm9wZXIgbWF4IGlucHV0IHNpemUKKyAgICAgICAgLy8gVE9ETzogcmVhZCB1c2FnZSBmcm9tIGludGYKKyAgICAgICAgc3A8Q29kZWMyQnVmZmVyPiBuZXdCdWZmZXIgPSBhbGxvYygoc2l6ZV90KWNhcGFjaXR5KTsKKyAgICAgICAgaWYgKG5ld0J1ZmZlciA9PSBudWxscHRyKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgKmluZGV4ID0gbUltcGwuYXNzaWduU2xvdChuZXdCdWZmZXIpOworICAgICAgICAqYnVmZmVyID0gbmV3QnVmZmVyOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBib29sIHJlbGVhc2VCdWZmZXIoCisgICAgICAgICAgICBjb25zdCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAmYnVmZmVyLCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICpjMmJ1ZmZlcikgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbUltcGwucmVsZWFzZVNsb3QoYnVmZmVyLCBjMmJ1ZmZlcik7CisgICAgfQorCisgICAgYm9vbCBleHBpcmVDb21wb25lbnRCdWZmZXIoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZjMmJ1ZmZlcikgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbUltcGwuZXhwaXJlQ29tcG9uZW50QnVmZmVyKGMyYnVmZmVyKTsKKyAgICB9CisKKyAgICB2b2lkIGZsdXNoKCkgb3ZlcnJpZGUgeworICAgICAgICAvLyBUaGlzIGlzIG5vLW9wIGJ5IGRlZmF1bHQgdW5sZXNzIHdlJ3JlIGluIGFycmF5IG1vZGUgd2hlcmUgd2UgbmVlZCB0byBrZWVwCisgICAgICAgIC8vIHRyYWNrIG9mIHRoZSBmbHVzaGVkIHdvcmsuCisgICAgICAgIG1JbXBsLmZsdXNoKCk7CisgICAgfQorCisgICAgc3RkOjp1bmlxdWVfcHRyPENDb2RlY0J1ZmZlckNoYW5uZWw6OklucHV0QnVmZmVycz4gdG9BcnJheU1vZGUoCisgICAgICAgICAgICBzaXplX3Qgc2l6ZSkgZmluYWwgeworICAgICAgICBpbnQzMl90IGNhcGFjaXR5ID0ga0xpbmVhckJ1ZmZlclNpemU7CisgICAgICAgICh2b2lkKW1Gb3JtYXQtPmZpbmRJbnQzMihDMl9OQU1FX1NUUkVBTV9NQVhfQlVGRkVSX1NJWkVfU0VUVElORywgJmNhcGFjaXR5KTsKKworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8SW5wdXRCdWZmZXJzQXJyYXk+IGFycmF5KAorICAgICAgICAgICAgICAgIG5ldyBJbnB1dEJ1ZmZlcnNBcnJheShtQ29tcG9uZW50TmFtZS5jX3N0cigpLCAiMUQtSW5wdXRbTl0iKSk7CisgICAgICAgIGFycmF5LT5zZXRQb29sKG1Qb29sKTsKKyAgICAgICAgYXJyYXktPnNldEZvcm1hdChtRm9ybWF0KTsKKyAgICAgICAgYXJyYXktPmluaXRpYWxpemUoCisgICAgICAgICAgICAgICAgbUltcGwsCisgICAgICAgICAgICAgICAgc2l6ZSwKKyAgICAgICAgICAgICAgICBbdGhpcywgY2FwYWNpdHldICgpIC0+IHNwPENvZGVjMkJ1ZmZlcj4geyByZXR1cm4gYWxsb2MoY2FwYWNpdHkpOyB9KTsKKyAgICAgICAgcmV0dXJuIHN0ZDo6bW92ZShhcnJheSk7CisgICAgfQorCisgICAgdmlydHVhbCBzcDxDb2RlYzJCdWZmZXI+IGFsbG9jKHNpemVfdCBzaXplKSBjb25zdCB7CisgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgPSB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IGJsb2NrOworCisgICAgICAgIGMyX3N0YXR1c190IGVyciA9IG1Qb29sLT5mZXRjaExpbmVhckJsb2NrKHNpemUsIHVzYWdlLCAmYmxvY2spOworICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBMaW5lYXJCbG9ja0J1ZmZlcjo6QWxsb2NhdGUobUZvcm1hdCwgYmxvY2spOworICAgIH0KKworcHJpdmF0ZToKKyAgICBGbGV4QnVmZmVyc0ltcGwgbUltcGw7Cit9OworCitjbGFzcyBFbmNyeXB0ZWRMaW5lYXJJbnB1dEJ1ZmZlcnMgOiBwdWJsaWMgTGluZWFySW5wdXRCdWZmZXJzIHsKK3B1YmxpYzoKKyAgICBFbmNyeXB0ZWRMaW5lYXJJbnB1dEJ1ZmZlcnMoCisgICAgICAgICAgICBib29sIHNlY3VyZSwKKyAgICAgICAgICAgIGNvbnN0IHNwPE1lbW9yeURlYWxlcj4gJmRlYWxlciwKKyAgICAgICAgICAgIGNvbnN0IHNwPElDcnlwdG8+ICZjcnlwdG8sCisgICAgICAgICAgICBpbnQzMl90IGhlYXBTZXFOdW0sCisgICAgICAgICAgICBzaXplX3QgY2FwYWNpdHksCisgICAgICAgICAgICBjb25zdCBjaGFyICpjb21wb25lbnROYW1lLCBjb25zdCBjaGFyICpuYW1lID0gIkVuY3J5cHRlZElucHV0IikKKyAgICAgICAgOiBMaW5lYXJJbnB1dEJ1ZmZlcnMoY29tcG9uZW50TmFtZSwgbmFtZSksCisgICAgICAgICAgbVVzYWdlKHswLCAwfSksCisgICAgICAgICAgbURlYWxlcihkZWFsZXIpLAorICAgICAgICAgIG1DcnlwdG8oY3J5cHRvKSwKKyAgICAgICAgICBtSGVhcFNlcU51bShoZWFwU2VxTnVtKSB7CisgICAgICAgIGlmIChzZWN1cmUpIHsKKyAgICAgICAgICAgIG1Vc2FnZSA9IHsgQzJNZW1vcnlVc2FnZTo6UkVBRF9QUk9URUNURUQsIDAgfTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1Vc2FnZSA9IHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9OworICAgICAgICB9CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga01pbklucHV0QnVmZmVyQXJyYXlTaXplOyArK2kpIHsKKyAgICAgICAgICAgIHNwPElNZW1vcnk+IG1lbW9yeSA9IG1EZWFsZXItPmFsbG9jYXRlKGNhcGFjaXR5KTsKKyAgICAgICAgICAgIGlmIChtZW1vcnkgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIEFMT0dEKCJbJXNdIEZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZnJvbSBkZWFsZXI6IG9ubHkgJXp1IHNsb3RzIGFsbG9jYXRlZCIsIG1OYW1lLCBpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1NZW1vcnlWZWN0b3IucHVzaF9iYWNrKHtzdGQ6OndlYWtfcHRyPEMyTGluZWFyQmxvY2s+KCksIG1lbW9yeX0pOworICAgICAgICB9CisgICAgfQorCisgICAgfkVuY3J5cHRlZExpbmVhcklucHV0QnVmZmVycygpIG92ZXJyaWRlIHsKKyAgICB9CisKKyAgICBzcDxDb2RlYzJCdWZmZXI+IGFsbG9jKHNpemVfdCBzaXplKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHNwPElNZW1vcnk+IG1lbW9yeTsKKyAgICAgICAgZm9yIChjb25zdCBFbnRyeSAmZW50cnkgOiBtTWVtb3J5VmVjdG9yKSB7CisgICAgICAgICAgICBpZiAoZW50cnkuYmxvY2suZXhwaXJlZCgpKSB7CisgICAgICAgICAgICAgICAgbWVtb3J5ID0gZW50cnkubWVtb3J5OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChtZW1vcnkgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0KKworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gYmxvY2s7CisgICAgICAgIGMyX3N0YXR1c190IGVyciA9IG1Qb29sLT5mZXRjaExpbmVhckJsb2NrKHNpemUsIG1Vc2FnZSwgJmJsb2NrKTsKKyAgICAgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbmV3IEVuY3J5cHRlZExpbmVhckJsb2NrQnVmZmVyKG1Gb3JtYXQsIGJsb2NrLCBtZW1vcnksIG1IZWFwU2VxTnVtKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgQzJNZW1vcnlVc2FnZSBtVXNhZ2U7CisgICAgc3A8TWVtb3J5RGVhbGVyPiBtRGVhbGVyOworICAgIHNwPElDcnlwdG8+IG1DcnlwdG87CisgICAgaW50MzJfdCBtSGVhcFNlcU51bTsKKyAgICBzdHJ1Y3QgRW50cnkgeworICAgICAgICBzdGQ6OndlYWtfcHRyPEMyTGluZWFyQmxvY2s+IGJsb2NrOworICAgICAgICBzcDxJTWVtb3J5PiBtZW1vcnk7CisgICAgfTsKKyAgICBzdGQ6OnZlY3RvcjxFbnRyeT4gbU1lbW9yeVZlY3RvcjsKK307CisKK2NsYXNzIEdyYXBoaWNNZXRhZGF0YUlucHV0QnVmZmVycyA6IHB1YmxpYyBDQ29kZWNCdWZmZXJDaGFubmVsOjpJbnB1dEJ1ZmZlcnMgeworcHVibGljOgorICAgIEdyYXBoaWNNZXRhZGF0YUlucHV0QnVmZmVycyhjb25zdCBjaGFyICpjb21wb25lbnROYW1lLCBjb25zdCBjaGFyICpuYW1lID0gIjJELU1ldGFJbnB1dCIpCisgICAgICAgIDogSW5wdXRCdWZmZXJzKGNvbXBvbmVudE5hbWUsIG5hbWUpLAorICAgICAgICAgIG1JbXBsKG1OYW1lKSwKKyAgICAgICAgICBtU3RvcmUoR2V0Q29kZWMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZSgpKSB7IH0KKyAgICB+R3JhcGhpY01ldGFkYXRhSW5wdXRCdWZmZXJzKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICAgYm9vbCByZXF1ZXN0TmV3QnVmZmVyKHNpemVfdCAqaW5kZXgsIHNwPE1lZGlhQ29kZWNCdWZmZXI+ICpidWZmZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiBhbGxvYzsKKyAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gbVN0b3JlLT5mZXRjaEFsbG9jYXRvcihtUG9vbC0+Z2V0QWxsb2NhdG9ySWQoKSwgJmFsbG9jKTsKKyAgICAgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHNwPEdyYXBoaWNNZXRhZGF0YUJ1ZmZlcj4gbmV3QnVmZmVyID0gbmV3IEdyYXBoaWNNZXRhZGF0YUJ1ZmZlcihtRm9ybWF0LCBhbGxvYyk7CisgICAgICAgIGlmIChuZXdCdWZmZXIgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgICppbmRleCA9IG1JbXBsLmFzc2lnblNsb3QobmV3QnVmZmVyKTsKKyAgICAgICAgKmJ1ZmZlciA9IG5ld0J1ZmZlcjsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgYm9vbCByZWxlYXNlQnVmZmVyKAorICAgICAgICAgICAgY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJmJ1ZmZlciwgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAqYzJidWZmZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLnJlbGVhc2VTbG90KGJ1ZmZlciwgYzJidWZmZXIpOworICAgIH0KKworICAgIGJvb2wgZXhwaXJlQ29tcG9uZW50QnVmZmVyKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYzJidWZmZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLmV4cGlyZUNvbXBvbmVudEJ1ZmZlcihjMmJ1ZmZlcik7CisgICAgfQorCisgICAgdm9pZCBmbHVzaCgpIG92ZXJyaWRlIHsKKyAgICAgICAgLy8gVGhpcyBpcyBuby1vcCBieSBkZWZhdWx0IHVubGVzcyB3ZSdyZSBpbiBhcnJheSBtb2RlIHdoZXJlIHdlIG5lZWQgdG8ga2VlcAorICAgICAgICAvLyB0cmFjayBvZiB0aGUgZmx1c2hlZCB3b3JrLgorICAgIH0KKworICAgIHN0ZDo6dW5pcXVlX3B0cjxDQ29kZWNCdWZmZXJDaGFubmVsOjpJbnB1dEJ1ZmZlcnM+IHRvQXJyYXlNb2RlKAorICAgICAgICAgICAgc2l6ZV90IHNpemUpIGZpbmFsIHsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiBhbGxvYzsKKyAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gbVN0b3JlLT5mZXRjaEFsbG9jYXRvcihtUG9vbC0+Z2V0QWxsb2NhdG9ySWQoKSwgJmFsbG9jKTsKKyAgICAgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPElucHV0QnVmZmVyc0FycmF5PiBhcnJheSgKKyAgICAgICAgICAgICAgICBuZXcgSW5wdXRCdWZmZXJzQXJyYXkobUNvbXBvbmVudE5hbWUuY19zdHIoKSwgIjJELU1ldGFJbnB1dFtOXSIpKTsKKyAgICAgICAgYXJyYXktPnNldFBvb2wobVBvb2wpOworICAgICAgICBhcnJheS0+c2V0Rm9ybWF0KG1Gb3JtYXQpOworICAgICAgICBhcnJheS0+aW5pdGlhbGl6ZSgKKyAgICAgICAgICAgICAgICBtSW1wbCwKKyAgICAgICAgICAgICAgICBzaXplLAorICAgICAgICAgICAgICAgIFtmb3JtYXQgPSBtRm9ybWF0LCBhbGxvY10oKSAtPiBzcDxDb2RlYzJCdWZmZXI+IHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBHcmFwaGljTWV0YWRhdGFCdWZmZXIoZm9ybWF0LCBhbGxvYyk7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIHJldHVybiBzdGQ6Om1vdmUoYXJyYXkpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBGbGV4QnVmZmVyc0ltcGwgbUltcGw7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yU3RvcmU+IG1TdG9yZTsKK307CisKK2NsYXNzIEdyYXBoaWNJbnB1dEJ1ZmZlcnMgOiBwdWJsaWMgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6SW5wdXRCdWZmZXJzIHsKK3B1YmxpYzoKKyAgICBHcmFwaGljSW5wdXRCdWZmZXJzKGNvbnN0IGNoYXIgKmNvbXBvbmVudE5hbWUsIGNvbnN0IGNoYXIgKm5hbWUgPSAiMkQtQkItSW5wdXQiKQorICAgICAgICA6IElucHV0QnVmZmVycyhjb21wb25lbnROYW1lLCBuYW1lKSwKKyAgICAgICAgICBtSW1wbChtTmFtZSksCisgICAgICAgICAgbUxvY2FsQnVmZmVyUG9vbChMb2NhbEJ1ZmZlclBvb2w6OkNyZWF0ZSgKKyAgICAgICAgICAgICAgICAgIGtNYXhMaW5lYXJCdWZmZXJTaXplICoga01pbklucHV0QnVmZmVyQXJyYXlTaXplKSkgeyB9CisgICAgfkdyYXBoaWNJbnB1dEJ1ZmZlcnMoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgICBib29sIHJlcXVlc3ROZXdCdWZmZXIoc2l6ZV90ICppbmRleCwgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gKmJ1ZmZlcikgb3ZlcnJpZGUgeworICAgICAgICAvLyBUT0RPOiBwcm9wZXIgbWF4IGlucHV0IHNpemUKKyAgICAgICAgLy8gVE9ETzogcmVhZCB1c2FnZSBmcm9tIGludGYKKyAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSA9IHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9OworICAgICAgICBzcDxHcmFwaGljQmxvY2tCdWZmZXI+IG5ld0J1ZmZlciA9IEFsbG9jYXRlR3JhcGhpY0J1ZmZlcigKKyAgICAgICAgICAgICAgICBtUG9vbCwgbUZvcm1hdCwgSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyLCB1c2FnZSwgbUxvY2FsQnVmZmVyUG9vbCk7CisgICAgICAgIGlmIChuZXdCdWZmZXIgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgICppbmRleCA9IG1JbXBsLmFzc2lnblNsb3QobmV3QnVmZmVyKTsKKyAgICAgICAgKmJ1ZmZlciA9IG5ld0J1ZmZlcjsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgYm9vbCByZWxlYXNlQnVmZmVyKAorICAgICAgICAgICAgY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJmJ1ZmZlciwgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAqYzJidWZmZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLnJlbGVhc2VTbG90KGJ1ZmZlciwgYzJidWZmZXIpOworICAgIH0KKworICAgIGJvb2wgZXhwaXJlQ29tcG9uZW50QnVmZmVyKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYzJidWZmZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLmV4cGlyZUNvbXBvbmVudEJ1ZmZlcihjMmJ1ZmZlcik7CisgICAgfQorICAgIHZvaWQgZmx1c2goKSBvdmVycmlkZSB7CisgICAgICAgIC8vIFRoaXMgaXMgbm8tb3AgYnkgZGVmYXVsdCB1bmxlc3Mgd2UncmUgaW4gYXJyYXkgbW9kZSB3aGVyZSB3ZSBuZWVkIHRvIGtlZXAKKyAgICAgICAgLy8gdHJhY2sgb2YgdGhlIGZsdXNoZWQgd29yay4KKyAgICB9CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0NvZGVjQnVmZmVyQ2hhbm5lbDo6SW5wdXRCdWZmZXJzPiB0b0FycmF5TW9kZSgKKyAgICAgICAgICAgIHNpemVfdCBzaXplKSBmaW5hbCB7CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxJbnB1dEJ1ZmZlcnNBcnJheT4gYXJyYXkoCisgICAgICAgICAgICAgICAgbmV3IElucHV0QnVmZmVyc0FycmF5KG1Db21wb25lbnROYW1lLmNfc3RyKCksICIyRC1CQi1JbnB1dFtOXSIpKTsKKyAgICAgICAgYXJyYXktPnNldFBvb2wobVBvb2wpOworICAgICAgICBhcnJheS0+c2V0Rm9ybWF0KG1Gb3JtYXQpOworICAgICAgICBhcnJheS0+aW5pdGlhbGl6ZSgKKyAgICAgICAgICAgICAgICBtSW1wbCwKKyAgICAgICAgICAgICAgICBzaXplLAorICAgICAgICAgICAgICAgIFtwb29sID0gbVBvb2wsIGZvcm1hdCA9IG1Gb3JtYXQsIGxicCA9IG1Mb2NhbEJ1ZmZlclBvb2xdKCkgLT4gc3A8Q29kZWMyQnVmZmVyPiB7CisgICAgICAgICAgICAgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgPSB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFsbG9jYXRlR3JhcGhpY0J1ZmZlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb29sLCBmb3JtYXQsIEhBTF9QSVhFTF9GT1JNQVRfWVYxMiwgdXNhZ2UsIGxicCk7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIHJldHVybiBzdGQ6Om1vdmUoYXJyYXkpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBGbGV4QnVmZmVyc0ltcGwgbUltcGw7CisgICAgc3RkOjpzaGFyZWRfcHRyPExvY2FsQnVmZmVyUG9vbD4gbUxvY2FsQnVmZmVyUG9vbDsKK307CisKK2NsYXNzIER1bW15SW5wdXRCdWZmZXJzIDogcHVibGljIENDb2RlY0J1ZmZlckNoYW5uZWw6OklucHV0QnVmZmVycyB7CitwdWJsaWM6CisgICAgRHVtbXlJbnB1dEJ1ZmZlcnMoY29uc3QgY2hhciAqY29tcG9uZW50TmFtZSwgY29uc3QgY2hhciAqbmFtZSA9ICIyRC1JbnB1dCIpCisgICAgICAgIDogSW5wdXRCdWZmZXJzKGNvbXBvbmVudE5hbWUsIG5hbWUpIHsgfQorCisgICAgYm9vbCByZXF1ZXN0TmV3QnVmZmVyKHNpemVfdCAqLCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAqKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBib29sIHJlbGVhc2VCdWZmZXIoCisgICAgICAgICAgICBjb25zdCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAmLCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICopIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGJvb2wgZXhwaXJlQ29tcG9uZW50QnVmZmVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJikgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHZvaWQgZmx1c2goKSBvdmVycmlkZSB7CisgICAgfQorCisgICAgc3RkOjp1bmlxdWVfcHRyPENDb2RlY0J1ZmZlckNoYW5uZWw6OklucHV0QnVmZmVycz4gdG9BcnJheU1vZGUoCisgICAgICAgICAgICBzaXplX3QpIGZpbmFsIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgICAgYm9vbCBpc0FycmF5TW9kZSgpIGNvbnN0IGZpbmFsIHsgcmV0dXJuIHRydWU7IH0KKworICAgIHZvaWQgZ2V0QXJyYXkoVmVjdG9yPHNwPE1lZGlhQ29kZWNCdWZmZXI+PiAqYXJyYXkpIGNvbnN0IGZpbmFsIHsKKyAgICAgICAgYXJyYXktPmNsZWFyKCk7CisgICAgfQorfTsKKworY2xhc3MgT3V0cHV0QnVmZmVyc0FycmF5IDogcHVibGljIENDb2RlY0J1ZmZlckNoYW5uZWw6Ok91dHB1dEJ1ZmZlcnMgeworcHVibGljOgorICAgIE91dHB1dEJ1ZmZlcnNBcnJheShjb25zdCBjaGFyICpjb21wb25lbnROYW1lLCBjb25zdCBjaGFyICpuYW1lID0gIk91dHB1dFtOXSIpCisgICAgICAgIDogT3V0cHV0QnVmZmVycyhjb21wb25lbnROYW1lLCBuYW1lKSB7IH0KKyAgICB+T3V0cHV0QnVmZmVyc0FycmF5KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICAgdm9pZCBpbml0aWFsaXplKAorICAgICAgICAgICAgY29uc3QgRmxleEJ1ZmZlcnNJbXBsICZpbXBsLAorICAgICAgICAgICAgc2l6ZV90IG1pblNpemUsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHNwPENvZGVjMkJ1ZmZlcj4oKT4gYWxsb2NhdGUpIHsKKyAgICAgICAgbUltcGwuaW5pdGlhbGl6ZShpbXBsLCBtaW5TaXplLCBhbGxvY2F0ZSk7CisgICAgfQorCisgICAgYm9vbCBpc0FycmF5TW9kZSgpIGNvbnN0IGZpbmFsIHsgcmV0dXJuIHRydWU7IH0KKworICAgIHN0ZDo6dW5pcXVlX3B0cjxDQ29kZWNCdWZmZXJDaGFubmVsOjpPdXRwdXRCdWZmZXJzPiB0b0FycmF5TW9kZSgKKyAgICAgICAgICAgIHNpemVfdCkgZmluYWwgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisKKyAgICBzdGF0dXNfdCByZWdpc3RlckJ1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlciwKKyAgICAgICAgICAgIHNpemVfdCAqaW5kZXgsCisgICAgICAgICAgICBzcDxNZWRpYUNvZGVjQnVmZmVyPiAqY2xpZW50QnVmZmVyKSBmaW5hbCB7CisgICAgICAgIHNwPENvZGVjMkJ1ZmZlcj4gYzJCdWZmZXI7CisgICAgICAgIHN0YXR1c190IGVyciA9IG1JbXBsLmdyYWJCdWZmZXIoCisgICAgICAgICAgICAgICAgaW5kZXgsCisgICAgICAgICAgICAgICAgJmMyQnVmZmVyLAorICAgICAgICAgICAgICAgIFtidWZmZXJdKGNvbnN0IHNwPENvZGVjMkJ1ZmZlcj4gJmNsaWVudEJ1ZmZlcikgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2xpZW50QnVmZmVyLT5jYW5Db3B5KGJ1ZmZlcik7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIGlmIChlcnIgPT0gV09VTERfQkxPQ0spIHsKKyAgICAgICAgICAgIEFMT0dWKCJbJXNdIGJ1ZmZlcnMgdGVtcG9yYXJpbHkgbm90IGF2YWlsYWJsZSIsIG1OYW1lKTsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0gZWxzZSBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRCgiWyVzXSBncmFiQnVmZmVyIGZhaWxlZDogJWQiLCBtTmFtZSwgZXJyKTsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICAgICAgYzJCdWZmZXItPnNldEZvcm1hdChtRm9ybWF0KTsKKyAgICAgICAgaWYgKCFjMkJ1ZmZlci0+Y29weShidWZmZXIpKSB7CisgICAgICAgICAgICBBTE9HRCgiWyVzXSBjb3B5IGJ1ZmZlciBmYWlsZWQiLCBtTmFtZSk7CisgICAgICAgICAgICByZXR1cm4gV09VTERfQkxPQ0s7CisgICAgICAgIH0KKyAgICAgICAgc3VibWl0KGMyQnVmZmVyKTsKKyAgICAgICAgKmNsaWVudEJ1ZmZlciA9IGMyQnVmZmVyOworICAgICAgICBBTE9HVigiWyVzXSBncmFiYmVkIGJ1ZmZlciAlenUiLCBtTmFtZSwgKmluZGV4KTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIHN0YXR1c190IHJlZ2lzdGVyQ3NkKAorICAgICAgICAgICAgY29uc3QgQzJTdHJlYW1Dc2RJbmZvOjpvdXRwdXQgKmNzZCwKKyAgICAgICAgICAgIHNpemVfdCAqaW5kZXgsCisgICAgICAgICAgICBzcDxNZWRpYUNvZGVjQnVmZmVyPiAqY2xpZW50QnVmZmVyKSBmaW5hbCB7CisgICAgICAgIHNwPENvZGVjMkJ1ZmZlcj4gYzJCdWZmZXI7CisgICAgICAgIHN0YXR1c190IGVyciA9IG1JbXBsLmdyYWJCdWZmZXIoCisgICAgICAgICAgICAgICAgaW5kZXgsCisgICAgICAgICAgICAgICAgJmMyQnVmZmVyLAorICAgICAgICAgICAgICAgIFtjc2RdKGNvbnN0IHNwPENvZGVjMkJ1ZmZlcj4gJmNsaWVudEJ1ZmZlcikgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2xpZW50QnVmZmVyLT5iYXNlKCkgIT0gbnVsbHB0cgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGNsaWVudEJ1ZmZlci0+Y2FwYWNpdHkoKSA+PSBjc2QtPmZsZXhDb3VudCgpOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisgICAgICAgIG1lbWNweShjMkJ1ZmZlci0+YmFzZSgpLCBjc2QtPm0udmFsdWUsIGNzZC0+ZmxleENvdW50KCkpOworICAgICAgICBjMkJ1ZmZlci0+c2V0UmFuZ2UoMCwgY3NkLT5mbGV4Q291bnQoKSk7CisgICAgICAgIGMyQnVmZmVyLT5zZXRGb3JtYXQobUZvcm1hdCk7CisgICAgICAgICpjbGllbnRCdWZmZXIgPSBjMkJ1ZmZlcjsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIGJvb2wgcmVsZWFzZUJ1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+ICZidWZmZXIsIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gKmMyYnVmZmVyKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtSW1wbC5yZXR1cm5CdWZmZXIoYnVmZmVyLCBjMmJ1ZmZlcik7CisgICAgfQorCisgICAgdm9pZCBmbHVzaChjb25zdCBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+ICZmbHVzaGVkV29yaykgb3ZlcnJpZGUgeworICAgICAgICAodm9pZClmbHVzaGVkV29yazsKKyAgICAgICAgbUltcGwuZmx1c2goKTsKKyAgICAgICAgaWYgKG1Ta2lwQ3V0QnVmZmVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIG1Ta2lwQ3V0QnVmZmVyLT5jbGVhcigpOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBnZXRBcnJheShWZWN0b3I8c3A8TWVkaWFDb2RlY0J1ZmZlcj4+ICphcnJheSkgY29uc3QgZmluYWwgeworICAgICAgICBtSW1wbC5nZXRBcnJheShhcnJheSk7CisgICAgfQorCisgICAgdm9pZCByZWFsbG9jKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmMyYnVmZmVyKSB7CisgICAgICAgIHN0ZDo6ZnVuY3Rpb248c3A8Q29kZWMyQnVmZmVyPigpPiBhbGxvYzsKKyAgICAgICAgc3dpdGNoIChjMmJ1ZmZlci0+ZGF0YSgpLnR5cGUoKSkgeworICAgICAgICAgICAgY2FzZSBDMkJ1ZmZlckRhdGE6OkxJTkVBUjogeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHNpemUgPSBrTGluZWFyQnVmZmVyU2l6ZTsKKyAgICAgICAgICAgICAgICBjb25zdCBDMkNvbnN0TGluZWFyQmxvY2sgJmJsb2NrID0gYzJidWZmZXItPmRhdGEoKS5saW5lYXJCbG9ja3MoKS5mcm9udCgpOworICAgICAgICAgICAgICAgIGlmIChibG9jay5zaXplKCkgPCBrTWF4TGluZWFyQnVmZmVyU2l6ZSAvIDIpIHsKKyAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IGJsb2NrLnNpemUoKSAqIDI7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IGtNYXhMaW5lYXJCdWZmZXJTaXplOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhbGxvYyA9IFtmb3JtYXQgPSBtRm9ybWF0LCBzaXplXSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTG9jYWxMaW5lYXJCdWZmZXIoZm9ybWF0LCBuZXcgQUJ1ZmZlcihzaXplKSk7CisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVE9ETzogYWRkIHN1cHBvcnQKKyAgICAgICAgICAgIGNhc2UgQzJCdWZmZXJEYXRhOjpHUkFQSElDOiAgICAgICAgIEZBTExUSFJPVUdIX0lOVEVOREVEOworCisgICAgICAgICAgICBjYXNlIEMyQnVmZmVyRGF0YTo6SU5WQUxJRDogICAgICAgICBGQUxMVEhST1VHSF9JTlRFTkRFRDsKKyAgICAgICAgICAgIGNhc2UgQzJCdWZmZXJEYXRhOjpMSU5FQVJfQ0hVTktTOiAgIEZBTExUSFJPVUdIX0lOVEVOREVEOworICAgICAgICAgICAgY2FzZSBDMkJ1ZmZlckRhdGE6OkdSQVBISUNfQ0hVTktTOiAgRkFMTFRIUk9VR0hfSU5URU5ERUQ7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIEFMT0dEKCJVbnN1cHBvcnRlZCB0eXBlOiAlZCIsIChpbnQpYzJidWZmZXItPmRhdGEoKS50eXBlKCkpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBtSW1wbC5yZWFsbG9jKGFsbG9jKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgQnVmZmVyc0FycmF5SW1wbCBtSW1wbDsKK307CisKK2NsYXNzIEZsZXhPdXRwdXRCdWZmZXJzIDogcHVibGljIENDb2RlY0J1ZmZlckNoYW5uZWw6Ok91dHB1dEJ1ZmZlcnMgeworcHVibGljOgorICAgIEZsZXhPdXRwdXRCdWZmZXJzKGNvbnN0IGNoYXIgKmNvbXBvbmVudE5hbWUsIGNvbnN0IGNoYXIgKm5hbWUgPSAiT3V0cHV0W10iKQorICAgICAgICA6IE91dHB1dEJ1ZmZlcnMoY29tcG9uZW50TmFtZSwgbmFtZSksCisgICAgICAgICAgbUltcGwobU5hbWUpIHsgfQorCisgICAgc3RhdHVzX3QgcmVnaXN0ZXJCdWZmZXIoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIsCisgICAgICAgICAgICBzaXplX3QgKmluZGV4LAorICAgICAgICAgICAgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gKmNsaWVudEJ1ZmZlcikgb3ZlcnJpZGUgeworICAgICAgICBzcDxDb2RlYzJCdWZmZXI+IG5ld0J1ZmZlciA9IHdyYXAoYnVmZmVyKTsKKyAgICAgICAgbmV3QnVmZmVyLT5zZXRGb3JtYXQobUZvcm1hdCk7CisgICAgICAgICppbmRleCA9IG1JbXBsLmFzc2lnblNsb3QobmV3QnVmZmVyKTsKKyAgICAgICAgKmNsaWVudEJ1ZmZlciA9IG5ld0J1ZmZlcjsKKyAgICAgICAgQUxPR1YoIlslc10gcmVnaXN0ZXJlZCBidWZmZXIgJXp1IiwgbU5hbWUsICppbmRleCk7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBzdGF0dXNfdCByZWdpc3RlckNzZCgKKyAgICAgICAgICAgIGNvbnN0IEMyU3RyZWFtQ3NkSW5mbzo6b3V0cHV0ICpjc2QsCisgICAgICAgICAgICBzaXplX3QgKmluZGV4LAorICAgICAgICAgICAgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gKmNsaWVudEJ1ZmZlcikgZmluYWwgeworICAgICAgICBzcDxDb2RlYzJCdWZmZXI+IG5ld0J1ZmZlciA9IG5ldyBMb2NhbExpbmVhckJ1ZmZlcigKKyAgICAgICAgICAgICAgICBtRm9ybWF0LCBBQnVmZmVyOjpDcmVhdGVBc0NvcHkoY3NkLT5tLnZhbHVlLCBjc2QtPmZsZXhDb3VudCgpKSk7CisgICAgICAgICppbmRleCA9IG1JbXBsLmFzc2lnblNsb3QobmV3QnVmZmVyKTsKKyAgICAgICAgKmNsaWVudEJ1ZmZlciA9IG5ld0J1ZmZlcjsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIGJvb2wgcmVsZWFzZUJ1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+ICZidWZmZXIsIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gKmMyYnVmZmVyKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtSW1wbC5yZWxlYXNlU2xvdChidWZmZXIsIGMyYnVmZmVyKTsKKyAgICB9CisKKyAgICB2b2lkIGZsdXNoKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiAmZmx1c2hlZFdvcmspIG92ZXJyaWRlIHsKKyAgICAgICAgKHZvaWQpIGZsdXNoZWRXb3JrOworICAgICAgICAvLyBUaGlzIGlzIG5vLW9wIGJ5IGRlZmF1bHQgdW5sZXNzIHdlJ3JlIGluIGFycmF5IG1vZGUgd2hlcmUgd2UgbmVlZCB0byBrZWVwCisgICAgICAgIC8vIHRyYWNrIG9mIHRoZSBmbHVzaGVkIHdvcmsuCisgICAgfQorCisgICAgc3RkOjp1bmlxdWVfcHRyPENDb2RlY0J1ZmZlckNoYW5uZWw6Ok91dHB1dEJ1ZmZlcnM+IHRvQXJyYXlNb2RlKAorICAgICAgICAgICAgc2l6ZV90IHNpemUpIG92ZXJyaWRlIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPE91dHB1dEJ1ZmZlcnNBcnJheT4gYXJyYXkobmV3IE91dHB1dEJ1ZmZlcnNBcnJheShtQ29tcG9uZW50TmFtZS5jX3N0cigpKSk7CisgICAgICAgIGFycmF5LT5zZXRGb3JtYXQobUZvcm1hdCk7CisgICAgICAgIGFycmF5LT50cmFuc2ZlclNraXBDdXRCdWZmZXIobVNraXBDdXRCdWZmZXIpOworICAgICAgICBhcnJheS0+aW5pdGlhbGl6ZSgKKyAgICAgICAgICAgICAgICBtSW1wbCwKKyAgICAgICAgICAgICAgICBzaXplLAorICAgICAgICAgICAgICAgIFt0aGlzXSgpIHsgcmV0dXJuIGFsbG9jYXRlQXJyYXlCdWZmZXIoKTsgfSk7CisgICAgICAgIHJldHVybiBzdGQ6Om1vdmUoYXJyYXkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBhbiBhcHByb3ByaWF0ZSBDb2RlYzJCdWZmZXIgb2JqZWN0IGZvciB0aGUgdHlwZSBvZiBidWZmZXJzLgorICAgICAqCisgICAgICogXHBhcmFtIGJ1ZmZlciAgQzJCdWZmZXIgb2JqZWN0IHRvIHdyYXAuCisgICAgICoKKyAgICAgKiBccmV0dXJuICBhcHByb3ByaWF0ZSBDb2RlYzJCdWZmZXIgb2JqZWN0IHRvIHdyYXAgfGJ1ZmZlcnwuCisgICAgICovCisgICAgdmlydHVhbCBzcDxDb2RlYzJCdWZmZXI+IHdyYXAoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYW4gYXBwcm9wcmlhdGUgQ29kZWMyQnVmZmVyIG9iamVjdCBmb3IgdGhlIHR5cGUgb2YgYnVmZmVycywgdG8gYmUKKyAgICAgKiB1c2VkIGFzIGFuIGVtcHR5IGFycmF5IGJ1ZmZlci4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gIGFwcHJvcHJpYXRlIENvZGVjMkJ1ZmZlciBvYmplY3Qgd2hpY2ggY2FuIGNvcHkoKSBmcm9tIEMyQnVmZmVycy4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHNwPENvZGVjMkJ1ZmZlcj4gYWxsb2NhdGVBcnJheUJ1ZmZlcigpID0gMDsKKworcHJpdmF0ZToKKyAgICBGbGV4QnVmZmVyc0ltcGwgbUltcGw7Cit9OworCitjbGFzcyBMaW5lYXJPdXRwdXRCdWZmZXJzIDogcHVibGljIEZsZXhPdXRwdXRCdWZmZXJzIHsKK3B1YmxpYzoKKyAgICBMaW5lYXJPdXRwdXRCdWZmZXJzKGNvbnN0IGNoYXIgKmNvbXBvbmVudE5hbWUsIGNvbnN0IGNoYXIgKm5hbWUgPSAiMUQtT3V0cHV0IikKKyAgICAgICAgOiBGbGV4T3V0cHV0QnVmZmVycyhjb21wb25lbnROYW1lLCBuYW1lKSB7IH0KKworICAgIHZvaWQgZmx1c2goCisgICAgICAgICAgICBjb25zdCBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+ICZmbHVzaGVkV29yaykgb3ZlcnJpZGUgeworICAgICAgICBpZiAobVNraXBDdXRCdWZmZXIgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgbVNraXBDdXRCdWZmZXItPmNsZWFyKCk7CisgICAgICAgIH0KKyAgICAgICAgRmxleE91dHB1dEJ1ZmZlcnM6OmZsdXNoKGZsdXNoZWRXb3JrKTsKKyAgICB9CisKKyAgICBzcDxDb2RlYzJCdWZmZXI+IHdyYXAoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKSBvdmVycmlkZSB7CisgICAgICAgIGlmIChidWZmZXIgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR1YoIlslc10gdXNpbmcgYSBkdW1teSBidWZmZXIiLCBtTmFtZSk7CisgICAgICAgICAgICByZXR1cm4gbmV3IExvY2FsTGluZWFyQnVmZmVyKG1Gb3JtYXQsIG5ldyBBQnVmZmVyKDApKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYnVmZmVyLT5kYXRhKCkudHlwZSgpICE9IEMyQnVmZmVyRGF0YTo6TElORUFSKSB7CisgICAgICAgICAgICBBTE9HVigiWyVzXSBub24tbGluZWFyIGJ1ZmZlciAlZCIsIG1OYW1lLCBidWZmZXItPmRhdGEoKS50eXBlKCkpOworICAgICAgICAgICAgLy8gV2UgZXhwZWN0IGxpbmVhciBvdXRwdXQgYnVmZmVycyBmcm9tIHRoZSBjb21wb25lbnQuCisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICBpZiAoYnVmZmVyLT5kYXRhKCkubGluZWFyQmxvY2tzKCkuc2l6ZSgpICE9IDF1KSB7CisgICAgICAgICAgICBBTE9HVigiWyVzXSBubyBsaW5lYXIgYnVmZmVycyIsIG1OYW1lKTsKKyAgICAgICAgICAgIC8vIFdlIGV4cGVjdCBvbmUgYW5kIG9ubHkgb25lIGxpbmVhciBibG9jayBmcm9tIHRoZSBjb21wb25lbnQuCisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICBzcDxDb2RlYzJCdWZmZXI+IGNsaWVudEJ1ZmZlciA9IENvbnN0TGluZWFyQmxvY2tCdWZmZXI6OkFsbG9jYXRlKG1Gb3JtYXQsIGJ1ZmZlcik7CisgICAgICAgIHN1Ym1pdChjbGllbnRCdWZmZXIpOworICAgICAgICByZXR1cm4gY2xpZW50QnVmZmVyOworICAgIH0KKworICAgIHNwPENvZGVjMkJ1ZmZlcj4gYWxsb2NhdGVBcnJheUJ1ZmZlcigpIG92ZXJyaWRlIHsKKyAgICAgICAgLy8gVE9ETzogcHJvcGVyIG1heCBvdXRwdXQgc2l6ZQorICAgICAgICByZXR1cm4gbmV3IExvY2FsTGluZWFyQnVmZmVyKG1Gb3JtYXQsIG5ldyBBQnVmZmVyKGtMaW5lYXJCdWZmZXJTaXplKSk7CisgICAgfQorfTsKKworY2xhc3MgR3JhcGhpY091dHB1dEJ1ZmZlcnMgOiBwdWJsaWMgRmxleE91dHB1dEJ1ZmZlcnMgeworcHVibGljOgorICAgIEdyYXBoaWNPdXRwdXRCdWZmZXJzKGNvbnN0IGNoYXIgKmNvbXBvbmVudE5hbWUsIGNvbnN0IGNoYXIgKm5hbWUgPSAiMkQtT3V0cHV0IikKKyAgICAgICAgOiBGbGV4T3V0cHV0QnVmZmVycyhjb21wb25lbnROYW1lLCBuYW1lKSB7IH0KKworICAgIHNwPENvZGVjMkJ1ZmZlcj4gd3JhcChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG5ldyBEdW1teUNvbnRhaW5lckJ1ZmZlcihtRm9ybWF0LCBidWZmZXIpOworICAgIH0KKworICAgIHNwPENvZGVjMkJ1ZmZlcj4gYWxsb2NhdGVBcnJheUJ1ZmZlcigpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG5ldyBEdW1teUNvbnRhaW5lckJ1ZmZlcihtRm9ybWF0KTsKKyAgICB9Cit9OworCitjbGFzcyBSYXdHcmFwaGljT3V0cHV0QnVmZmVycyA6IHB1YmxpYyBGbGV4T3V0cHV0QnVmZmVycyB7CitwdWJsaWM6CisgICAgUmF3R3JhcGhpY091dHB1dEJ1ZmZlcnMoY29uc3QgY2hhciAqY29tcG9uZW50TmFtZSwgY29uc3QgY2hhciAqbmFtZSA9ICIyRC1CQi1PdXRwdXQiKQorICAgICAgICA6IEZsZXhPdXRwdXRCdWZmZXJzKGNvbXBvbmVudE5hbWUsIG5hbWUpLAorICAgICAgICAgIG1Mb2NhbEJ1ZmZlclBvb2woTG9jYWxCdWZmZXJQb29sOjpDcmVhdGUoCisgICAgICAgICAgICAgICAgICBrTWF4TGluZWFyQnVmZmVyU2l6ZSAqIGtNaW5PdXRwdXRCdWZmZXJBcnJheVNpemUpKSB7IH0KKyAgICB+UmF3R3JhcGhpY091dHB1dEJ1ZmZlcnMoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgICBzcDxDb2RlYzJCdWZmZXI+IHdyYXAoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKSBvdmVycmlkZSB7CisgICAgICAgIGlmIChidWZmZXIgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgc3A8Q29kZWMyQnVmZmVyPiBjMmJ1ZmZlciA9IENvbnN0R3JhcGhpY0Jsb2NrQnVmZmVyOjpBbGxvY2F0ZUVtcHR5KAorICAgICAgICAgICAgICAgICAgICBtRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICBbbGJwID0gbUxvY2FsQnVmZmVyUG9vbF0oc2l6ZV90IGNhcGFjaXR5KSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGJwLT5uZXdCdWZmZXIoY2FwYWNpdHkpOworICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIGMyYnVmZmVyLT5zZXRSYW5nZSgwLCAwKTsKKyAgICAgICAgICAgIHJldHVybiBjMmJ1ZmZlcjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBDb25zdEdyYXBoaWNCbG9ja0J1ZmZlcjo6QWxsb2NhdGUoCisgICAgICAgICAgICAgICAgICAgIG1Gb3JtYXQsCisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgW2xicCA9IG1Mb2NhbEJ1ZmZlclBvb2xdKHNpemVfdCBjYXBhY2l0eSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxicC0+bmV3QnVmZmVyKGNhcGFjaXR5KTsKKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzcDxDb2RlYzJCdWZmZXI+IGFsbG9jYXRlQXJyYXlCdWZmZXIoKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBDb25zdEdyYXBoaWNCbG9ja0J1ZmZlcjo6QWxsb2NhdGVFbXB0eSgKKyAgICAgICAgICAgICAgICBtRm9ybWF0LAorICAgICAgICAgICAgICAgIFtsYnAgPSBtTG9jYWxCdWZmZXJQb29sXShzaXplX3QgY2FwYWNpdHkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxicC0+bmV3QnVmZmVyKGNhcGFjaXR5KTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPExvY2FsQnVmZmVyUG9vbD4gbUxvY2FsQnVmZmVyUG9vbDsKK307CisKK30gIC8vIG5hbWVzcGFjZQorCitDQ29kZWNCdWZmZXJDaGFubmVsOjpRdWV1ZUd1YXJkOjpRdWV1ZUd1YXJkKAorICAgICAgICBDQ29kZWNCdWZmZXJDaGFubmVsOjpRdWV1ZVN5bmMgJnN5bmMpIDogbVN5bmMoc3luYykgeworICAgIE11dGV4OjpBdXRvbG9jayBsKG1TeW5jLm1HdWFyZExvY2spOworICAgIC8vIEF0IHRoaXMgcG9pbnQgaXQncyBndWFyYW50ZWVkIHRoYXQgbVN5bmMgaXMgbm90IHVuZGVyIHN0YXRlIHRyYW5zaXRpb24sCisgICAgLy8gYXMgd2UgYXJlIGhvbGRpbmcgaXRzIG11dGV4LgorCisgICAgTXV0ZXhlZDxDQ29kZWNCdWZmZXJDaGFubmVsOjpRdWV1ZVN5bmM6OkNvdW50ZXI+OjpMb2NrZWQgY291bnQobVN5bmMubUNvdW50KTsKKyAgICBpZiAoY291bnQtPnZhbHVlID09IC0xKSB7CisgICAgICAgIG1SdW5uaW5nID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgICAgKytjb3VudC0+dmFsdWU7CisgICAgICAgIG1SdW5uaW5nID0gdHJ1ZTsKKyAgICB9Cit9CisKK0NDb2RlY0J1ZmZlckNoYW5uZWw6OlF1ZXVlR3VhcmQ6On5RdWV1ZUd1YXJkKCkgeworICAgIGlmIChtUnVubmluZykgeworICAgICAgICAvLyBXZSBhcmUgbm90IGhvbGRpbmcgbUd1YXJkTG9jayBhdCB0aGlzIHBvaW50IHNvIHRoYXQgUXVldWVTeW5jOjpzdG9wKCkgY2FuCisgICAgICAgIC8vIGtlZXAgaG9sZGluZyB0aGUgbG9jayB1bnRpbCBtQ291bnQgcmVhY2hlcyB6ZXJvLgorICAgICAgICBNdXRleGVkPENDb2RlY0J1ZmZlckNoYW5uZWw6OlF1ZXVlU3luYzo6Q291bnRlcj46OkxvY2tlZCBjb3VudChtU3luYy5tQ291bnQpOworICAgICAgICAtLWNvdW50LT52YWx1ZTsKKyAgICAgICAgY291bnQtPmNvbmQuYnJvYWRjYXN0KCk7CisgICAgfQorfQorCit2b2lkIENDb2RlY0J1ZmZlckNoYW5uZWw6OlF1ZXVlU3luYzo6c3RhcnQoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUd1YXJkTG9jayk7CisgICAgLy8gSWYgc3RvcHBlZCwgaXQgZ29lcyB0byBydW5uaW5nIHN0YXRlOyBvdGhlcndpc2Ugbm8tb3AuCisgICAgTXV0ZXhlZDxDb3VudGVyPjo6TG9ja2VkIGNvdW50KG1Db3VudCk7CisgICAgaWYgKGNvdW50LT52YWx1ZSA9PSAtMSkgeworICAgICAgICBjb3VudC0+dmFsdWUgPSAwOworICAgIH0KK30KKwordm9pZCBDQ29kZWNCdWZmZXJDaGFubmVsOjpRdWV1ZVN5bmM6OnN0b3AoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUd1YXJkTG9jayk7CisgICAgTXV0ZXhlZDxDb3VudGVyPjo6TG9ja2VkIGNvdW50KG1Db3VudCk7CisgICAgaWYgKGNvdW50LT52YWx1ZSA9PSAtMSkgeworICAgICAgICAvLyBuby1vcAorICAgICAgICByZXR1cm47CisgICAgfQorICAgIC8vIEhvbGRpbmcgbUd1YXJkTG9jayBoZXJlIGJsb2NrcyBjcmVhdGlvbiBvZiBhZGRpdGlvbmFsIFF1ZXVlR3VhcmQgb2JqZWN0cywgc28KKyAgICAvLyBtQ291bnQgY2FuIG9ubHkgZGVjcmVtZW50LiBJbiBvdGhlciB3b3JkcywgdGhyZWFkcyB0aGF0IGFjcXVpcmVkIHRoZSBsb2NrCisgICAgLy8gYXJlIGFsbG93ZWQgdG8gZmluaXNoIGV4ZWN1dGlvbiBidXQgYWRkaXRpb25hbCB0aHJlYWRzIHRyeWluZyB0byBhY3F1aXJlCisgICAgLy8gdGhlIGxvY2sgYXQgdGhpcyBwb2ludCB3aWxsIGJsb2NrLCBhbmQgdGhlbiBnZXQgUXVldWVHdWFyZCBhdCBTVE9QUEVECisgICAgLy8gc3RhdGUuCisgICAgd2hpbGUgKGNvdW50LT52YWx1ZSAhPSAwKSB7CisgICAgICAgIGNvdW50LndhaXRGb3JDb25kaXRpb24oY291bnQtPmNvbmQpOworICAgIH0KKyAgICBjb3VudC0+dmFsdWUgPSAtMTsKK30KKworLy8gQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6UGlwZWxpbmVDYXBhY2l0eQorCitDQ29kZWNCdWZmZXJDaGFubmVsOjpQaXBlbGluZUNhcGFjaXR5OjpQaXBlbGluZUNhcGFjaXR5KCkKKyAgICAgIDogaW5wdXQoMCksIGNvbXBvbmVudCgwKSwKKyAgICAgICAgbU5hbWUoIjxVTktOT1dOIENPTVBPTkVOVD4iKSB7Cit9CisKK3ZvaWQgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6UGlwZWxpbmVDYXBhY2l0eTo6aW5pdGlhbGl6ZSgKKyAgICAgICAgaW50IG5ld0lucHV0LAorICAgICAgICBpbnQgbmV3Q29tcG9uZW50LAorICAgICAgICBjb25zdCBjaGFyKiBuZXdOYW1lLAorICAgICAgICBjb25zdCBjaGFyKiBjYWxsZXJUYWcpIHsKKyAgICBpbnB1dC5zdG9yZShuZXdJbnB1dCwgc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCk7CisgICAgY29tcG9uZW50LnN0b3JlKG5ld0NvbXBvbmVudCwgc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCk7CisgICAgbU5hbWUgPSBuZXdOYW1lOworICAgIEFMT0dWKCJbJXNdICVzIC0tIFBpcGVsaW5lQ2FwYWNpdHk6OmluaXRpYWxpemUoKTogIgorICAgICAgICAgICJwaXBlbGluZSBhdmFpbGFiaWxpdHkgaW5pdGlhbGl6ZWQgPT0+ICIKKyAgICAgICAgICAiaW5wdXQgPSAlZCwgY29tcG9uZW50ID0gJWQiLAorICAgICAgICAgICAgbU5hbWUsIGNhbGxlclRhZyA/IGNhbGxlclRhZyA6ICIqIiwKKyAgICAgICAgICAgIG5ld0lucHV0LCBuZXdDb21wb25lbnQpOworfQorCitib29sIENDb2RlY0J1ZmZlckNoYW5uZWw6OlBpcGVsaW5lQ2FwYWNpdHk6OmFsbG9jYXRlKGNvbnN0IGNoYXIqIGNhbGxlclRhZykgeworICAgIGludCBwcmV2SW5wdXQgPSBpbnB1dC5mZXRjaF9zdWIoMSwgc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCk7CisgICAgaW50IHByZXZDb21wb25lbnQgPSBjb21wb25lbnQuZmV0Y2hfc3ViKDEsIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpOworICAgIGlmIChwcmV2SW5wdXQgPiAwICYmIHByZXZDb21wb25lbnQgPiAwKSB7CisgICAgICAgIEFMT0dWKCJbJXNdICVzIC0tIFBpcGVsaW5lQ2FwYWNpdHk6OmFsbG9jYXRlKCkgcmV0dXJucyB0cnVlOiAiCisgICAgICAgICAgICAgICJwaXBlbGluZSBhdmFpbGFiaWxpdHkgLTEgYWxsID09PiAiCisgICAgICAgICAgICAgICJpbnB1dCA9ICVkLCBjb21wb25lbnQgPSAlZCIsCisgICAgICAgICAgICAgICAgbU5hbWUsIGNhbGxlclRhZyA/IGNhbGxlclRhZyA6ICIqIiwKKyAgICAgICAgICAgICAgICBwcmV2SW5wdXQgLSAxLAorICAgICAgICAgICAgICAgIHByZXZDb21wb25lbnQgLSAxKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGlucHV0LmZldGNoX2FkZCgxLCBzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkKTsKKyAgICBjb21wb25lbnQuZmV0Y2hfYWRkKDEsIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpOworICAgIEFMT0dWKCJbJXNdICVzIC0tIFBpcGVsaW5lQ2FwYWNpdHk6OmFsbG9jYXRlKCkgcmV0dXJucyBmYWxzZTogIgorICAgICAgICAgICJwaXBlbGluZSBhdmFpbGFiaWxpdHkgdW5jaGFuZ2VkID09PiAiCisgICAgICAgICAgImlucHV0ID0gJWQsIGNvbXBvbmVudCA9ICVkIiwKKyAgICAgICAgICAgIG1OYW1lLCBjYWxsZXJUYWcgPyBjYWxsZXJUYWcgOiAiKiIsCisgICAgICAgICAgICBwcmV2SW5wdXQsCisgICAgICAgICAgICBwcmV2Q29tcG9uZW50KTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6UGlwZWxpbmVDYXBhY2l0eTo6ZnJlZShjb25zdCBjaGFyKiBjYWxsZXJUYWcpIHsKKyAgICBpbnQgcHJldklucHV0ID0gaW5wdXQuZmV0Y2hfYWRkKDEsIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpOworICAgIGludCBwcmV2Q29tcG9uZW50ID0gY29tcG9uZW50LmZldGNoX2FkZCgxLCBzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkKTsKKyAgICBBTE9HVigiWyVzXSAlcyAtLSBQaXBlbGluZUNhcGFjaXR5OjpmcmVlKCk6ICIKKyAgICAgICAgICAicGlwZWxpbmUgYXZhaWxhYmlsaXR5ICsxIGFsbCA9PT4gIgorICAgICAgICAgICJpbnB1dCA9ICVkLCBjb21wb25lbnQgPSAlZCIsCisgICAgICAgICAgICBtTmFtZSwgY2FsbGVyVGFnID8gY2FsbGVyVGFnIDogIioiLAorICAgICAgICAgICAgcHJldklucHV0ICsgMSwKKyAgICAgICAgICAgIHByZXZDb21wb25lbnQgKyAxKTsKK30KKworaW50IENDb2RlY0J1ZmZlckNoYW5uZWw6OlBpcGVsaW5lQ2FwYWNpdHk6OmZyZWVJbnB1dFNsb3RzKAorICAgICAgICBzaXplX3QgbnVtRGlzY2FyZGVkSW5wdXRCdWZmZXJzLAorICAgICAgICBjb25zdCBjaGFyKiBjYWxsZXJUYWcpIHsKKyAgICBpbnQgcHJldklucHV0ID0gaW5wdXQuZmV0Y2hfYWRkKG51bURpc2NhcmRlZElucHV0QnVmZmVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpOworICAgIEFMT0dWKCJbJXNdICVzIC0tIFBpcGVsaW5lQ2FwYWNpdHk6OmZyZWVJbnB1dFNsb3RzKCV6dSk6ICIKKyAgICAgICAgICAicGlwZWxpbmUgYXZhaWxhYmlsaXR5ICslenUgaW5wdXQgPT0+ICIKKyAgICAgICAgICAiaW5wdXQgPSAlZCwgY29tcG9uZW50ID0gJWQiLAorICAgICAgICAgICAgbU5hbWUsIGNhbGxlclRhZyA/IGNhbGxlclRhZyA6ICIqIiwKKyAgICAgICAgICAgIG51bURpc2NhcmRlZElucHV0QnVmZmVycywKKyAgICAgICAgICAgIG51bURpc2NhcmRlZElucHV0QnVmZmVycywKKyAgICAgICAgICAgIHByZXZJbnB1dCArIHN0YXRpY19jYXN0PGludD4obnVtRGlzY2FyZGVkSW5wdXRCdWZmZXJzKSwKKyAgICAgICAgICAgIGNvbXBvbmVudC5sb2FkKHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpKTsKKyAgICByZXR1cm4gcHJldklucHV0ICsgc3RhdGljX2Nhc3Q8aW50PihudW1EaXNjYXJkZWRJbnB1dEJ1ZmZlcnMpOworfQorCitpbnQgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6UGlwZWxpbmVDYXBhY2l0eTo6ZnJlZUNvbXBvbmVudFNsb3QoCisgICAgICAgIGNvbnN0IGNoYXIqIGNhbGxlclRhZykgeworICAgIGludCBwcmV2Q29tcG9uZW50ID0gY29tcG9uZW50LmZldGNoX2FkZCgxLCBzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkKTsKKyAgICBBTE9HVigiWyVzXSAlcyAtLSBQaXBlbGluZUNhcGFjaXR5OjpmcmVlQ29tcG9uZW50U2xvdCgpOiAiCisgICAgICAgICAgInBpcGVsaW5lIGF2YWlsYWJpbGl0eSArMSBjb21wb25lbnQgPT0+ICIKKyAgICAgICAgICAiaW5wdXQgPSAlZCwgY29tcG9uZW50ID0gJWQiLAorICAgICAgICAgICAgbU5hbWUsIGNhbGxlclRhZyA/IGNhbGxlclRhZyA6ICIqIiwKKyAgICAgICAgICAgIGlucHV0LmxvYWQoc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCksCisgICAgICAgICAgICBwcmV2Q29tcG9uZW50ICsgMSk7CisgICAgcmV0dXJuIHByZXZDb21wb25lbnQgKyAxOworfQorCisvLyBDQ29kZWNCdWZmZXJDaGFubmVsOjpSZW9yZGVyU3Rhc2gKKworQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6UmVvcmRlclN0YXNoOjpSZW9yZGVyU3Rhc2goKSB7CisgICAgY2xlYXIoKTsKK30KKwordm9pZCBDQ29kZWNCdWZmZXJDaGFubmVsOjpSZW9yZGVyU3Rhc2g6OmNsZWFyKCkgeworICAgIG1QZW5kaW5nLmNsZWFyKCk7CisgICAgbVN0YXNoLmNsZWFyKCk7CisgICAgbURlcHRoID0gMDsKKyAgICBtS2V5ID0gQzJDb25maWc6Ok9SRElOQUw7Cit9CisKK3ZvaWQgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6UmVvcmRlclN0YXNoOjpzZXREZXB0aCh1aW50MzJfdCBkZXB0aCkgeworICAgIG1QZW5kaW5nLnNwbGljZShtUGVuZGluZy5lbmQoKSwgbVN0YXNoKTsKKyAgICBtRGVwdGggPSBkZXB0aDsKK30KK3ZvaWQgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6UmVvcmRlclN0YXNoOjpzZXRLZXkoQzJDb25maWc6Om9yZGluYWxfa2V5X3Qga2V5KSB7CisgICAgbVBlbmRpbmcuc3BsaWNlKG1QZW5kaW5nLmVuZCgpLCBtU3Rhc2gpOworICAgIG1LZXkgPSBrZXk7Cit9CisKK2Jvb2wgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6UmVvcmRlclN0YXNoOjpwb3AoRW50cnkgKmVudHJ5KSB7CisgICAgaWYgKG1QZW5kaW5nLmVtcHR5KCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBlbnRyeS0+YnVmZmVyICAgICA9IG1QZW5kaW5nLmZyb250KCkuYnVmZmVyOworICAgIGVudHJ5LT50aW1lc3RhbXAgID0gbVBlbmRpbmcuZnJvbnQoKS50aW1lc3RhbXA7CisgICAgZW50cnktPmZsYWdzICAgICAgPSBtUGVuZGluZy5mcm9udCgpLmZsYWdzOworICAgIGVudHJ5LT5vcmRpbmFsICAgID0gbVBlbmRpbmcuZnJvbnQoKS5vcmRpbmFsOworICAgIG1QZW5kaW5nLnBvcF9mcm9udCgpOworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIENDb2RlY0J1ZmZlckNoYW5uZWw6OlJlb3JkZXJTdGFzaDo6ZW1wbGFjZSgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyLAorICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcCwKKyAgICAgICAgaW50MzJfdCBmbGFncywKKyAgICAgICAgY29uc3QgQzJXb3JrT3JkaW5hbFN0cnVjdCAmb3JkaW5hbCkgeworICAgIGZvciAoYXV0byBpdCA9IG1TdGFzaC5iZWdpbigpOyBpdCAhPSBtU3Rhc2guZW5kKCk7ICsraXQpIHsKKyAgICAgICAgaWYgKGxlc3Mob3JkaW5hbCwgaXQtPm9yZGluYWwpKSB7CisgICAgICAgICAgICBtU3Rhc2guZW1wbGFjZShpdCwgYnVmZmVyLCB0aW1lc3RhbXAsIGZsYWdzLCBvcmRpbmFsKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKyAgICBtU3Rhc2guZW1wbGFjZV9iYWNrKGJ1ZmZlciwgdGltZXN0YW1wLCBmbGFncywgb3JkaW5hbCk7CisgICAgd2hpbGUgKCFtU3Rhc2guZW1wdHkoKSAmJiBtU3Rhc2guc2l6ZSgpID4gbURlcHRoKSB7CisgICAgICAgIG1QZW5kaW5nLnB1c2hfYmFjayhtU3Rhc2guZnJvbnQoKSk7CisgICAgICAgIG1TdGFzaC5wb3BfZnJvbnQoKTsKKyAgICB9Cit9CisKK3ZvaWQgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6UmVvcmRlclN0YXNoOjpkZWZlcigKKyAgICAgICAgY29uc3QgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6UmVvcmRlclN0YXNoOjpFbnRyeSAmZW50cnkpIHsKKyAgICBtUGVuZGluZy5wdXNoX2Zyb250KGVudHJ5KTsKK30KKworYm9vbCBDQ29kZWNCdWZmZXJDaGFubmVsOjpSZW9yZGVyU3Rhc2g6Omhhc1BlbmRpbmcoKSBjb25zdCB7CisgICAgcmV0dXJuICFtUGVuZGluZy5lbXB0eSgpOworfQorCitib29sIENDb2RlY0J1ZmZlckNoYW5uZWw6OlJlb3JkZXJTdGFzaDo6bGVzcygKKyAgICAgICAgY29uc3QgQzJXb3JrT3JkaW5hbFN0cnVjdCAmbzEsIGNvbnN0IEMyV29ya09yZGluYWxTdHJ1Y3QgJm8yKSB7CisgICAgc3dpdGNoIChtS2V5KSB7CisgICAgICAgIGNhc2UgQzJDb25maWc6Ok9SRElOQUw6ICAgcmV0dXJuIG8xLmZyYW1lSW5kZXggPCBvMi5mcmFtZUluZGV4OworICAgICAgICBjYXNlIEMyQ29uZmlnOjpUSU1FU1RBTVA6IHJldHVybiBvMS50aW1lc3RhbXAgPCBvMi50aW1lc3RhbXA7CisgICAgICAgIGNhc2UgQzJDb25maWc6OkNVU1RPTTogICAgcmV0dXJuIG8xLmN1c3RvbU9yZGluYWwgPCBvMi5jdXN0b21PcmRpbmFsOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR0QoIlVucmVjb2duaXplZCBrZXk7IGRlZmF1bHQgdG8gdGltZXN0YW1wIik7CisgICAgICAgICAgICByZXR1cm4gbzEuZnJhbWVJbmRleCA8IG8yLmZyYW1lSW5kZXg7CisgICAgfQorfQorCisvLyBDQ29kZWNCdWZmZXJDaGFubmVsCisKK0NDb2RlY0J1ZmZlckNoYW5uZWw6OkNDb2RlY0J1ZmZlckNoYW5uZWwoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDQ29kZWNDYWxsYmFjaz4gJmNhbGxiYWNrKQorICAgIDogbUhlYXBTZXFOdW0oLTEpLAorICAgICAgbUNDb2RlY0NhbGxiYWNrKGNhbGxiYWNrKSwKKyAgICAgIG1GcmFtZUluZGV4KDB1KSwKKyAgICAgIG1GaXJzdFZhbGlkRnJhbWVJbmRleCgwdSksCisgICAgICBtTWV0YU1vZGUoTU9ERV9OT05FKSwKKyAgICAgIG1BdmFpbGFibGVQaXBlbGluZUNhcGFjaXR5KCksCisgICAgICBtSW5wdXRNZXRFb3MoZmFsc2UpIHsKKyAgICBNdXRleGVkPHN0ZDo6dW5pcXVlX3B0cjxJbnB1dEJ1ZmZlcnM+Pjo6TG9ja2VkIGJ1ZmZlcnMobUlucHV0QnVmZmVycyk7CisgICAgYnVmZmVycy0+cmVzZXQobmV3IER1bW15SW5wdXRCdWZmZXJzKCIiKSk7Cit9CisKK0NDb2RlY0J1ZmZlckNoYW5uZWw6On5DQ29kZWNCdWZmZXJDaGFubmVsKCkgeworICAgIGlmIChtQ3J5cHRvICE9IG51bGxwdHIgJiYgbURlYWxlciAhPSBudWxscHRyICYmIG1IZWFwU2VxTnVtID49IDApIHsKKyAgICAgICAgbUNyeXB0by0+dW5zZXRIZWFwKG1IZWFwU2VxTnVtKTsKKyAgICB9Cit9CisKK3ZvaWQgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6c2V0Q29tcG9uZW50KAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+ICZjb21wb25lbnQpIHsKKyAgICBtQ29tcG9uZW50ID0gY29tcG9uZW50OworICAgIG1Db21wb25lbnROYW1lID0gY29tcG9uZW50LT5nZXROYW1lKCkgKyBTdHJpbmdQcmludGYoIiMlZCIsIGludCh1aW50cHRyX3QoY29tcG9uZW50LmdldCgpKSAlIDk5NykpOworICAgIG1OYW1lID0gbUNvbXBvbmVudE5hbWUuY19zdHIoKTsKK30KKworc3RhdHVzX3QgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6c2V0SW5wdXRTdXJmYWNlKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW5wdXRTdXJmYWNlV3JhcHBlcj4gJnN1cmZhY2UpIHsKKyAgICBBTE9HVigiWyVzXSBzZXRJbnB1dFN1cmZhY2UiLCBtTmFtZSk7CisgICAgbUlucHV0U3VyZmFjZSA9IHN1cmZhY2U7CisgICAgcmV0dXJuIG1JbnB1dFN1cmZhY2UtPmNvbm5lY3QobUNvbXBvbmVudCk7Cit9CisKK3N0YXR1c190IENDb2RlY0J1ZmZlckNoYW5uZWw6OnNpZ25hbEVuZE9mSW5wdXRTdHJlYW0oKSB7CisgICAgaWYgKG1JbnB1dFN1cmZhY2UgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorICAgIHJldHVybiBtSW5wdXRTdXJmYWNlLT5zaWduYWxFbmRPZklucHV0U3RyZWFtKCk7Cit9CisKK3N0YXR1c190IENDb2RlY0J1ZmZlckNoYW5uZWw6OnF1ZXVlSW5wdXRCdWZmZXJJbnRlcm5hbChjb25zdCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAmYnVmZmVyKSB7CisgICAgaW50NjRfdCB0aW1lVXM7CisgICAgQ0hFQ0soYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcykpOworCisgICAgaWYgKG1JbnB1dE1ldEVvcykgeworICAgICAgICBBTE9HRCgiWyVzXSBidWZmZXJzIGFmdGVyIEVPUyBpZ25vcmVkICglbGxkIHVzKSIsIG1OYW1lLCAobG9uZyBsb25nKXRpbWVVcyk7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBpbnQzMl90IGZsYWdzID0gMDsKKyAgICBpbnQzMl90IHRtcCA9IDA7CisgICAgYm9vbCBlb3MgPSBmYWxzZTsKKyAgICBpZiAoYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQzMigiZW9zIiwgJnRtcCkgJiYgdG1wKSB7CisgICAgICAgIGVvcyA9IHRydWU7CisgICAgICAgIG1JbnB1dE1ldEVvcyA9IHRydWU7CisgICAgICAgIEFMT0dWKCJbJXNdIGlucHV0IEVPUyIsIG1OYW1lKTsKKyAgICB9CisgICAgaWYgKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50MzIoImNzZCIsICZ0bXApICYmIHRtcCkgeworICAgICAgICBmbGFncyB8PSBDMkZyYW1lRGF0YTo6RkxBR19DT0RFQ19DT05GSUc7CisgICAgfQorICAgIEFMT0dWKCJbJXNdIHF1ZXVlSW5wdXRCdWZmZXI6IGJ1ZmZlci0+c2l6ZSgpID0gJXp1IiwgbU5hbWUsIGJ1ZmZlci0+c2l6ZSgpKTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB3b3JrKG5ldyBDMldvcmspOworICAgIHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wID0gdGltZVVzOworICAgIHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleCA9IG1GcmFtZUluZGV4Kys7CisgICAgLy8gV09SS0FST1VORDogdW50aWwgY29kZWNzIHN1cHBvcnQgaGFuZGxpbmcgd29yayBhZnRlciBFT1MgYW5kIG1heCBvdXRwdXQgc2l6aW5nLCB1c2UgdGltZXN0YW1wCisgICAgLy8gbWFuaXB1bGF0aW9uIHRvIGFjaGlldmUgaW1hZ2UgZW5jb2RpbmcgdmlhIHZpZGVvIGNvZGVjLCBhbmQgdG8gY29uc3RyYWluIGVuY29kZWQgb3V0cHV0LgorICAgIC8vIEtlZXAgY2xpZW50IHRpbWVzdGFtcCBpbiBjdXN0b21PcmRpbmFsCisgICAgd29yay0+aW5wdXQub3JkaW5hbC5jdXN0b21PcmRpbmFsID0gdGltZVVzOworICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKworICAgIGlmIChidWZmZXItPnNpemUoKSA+IDB1KSB7CisgICAgICAgIE11dGV4ZWQ8c3RkOjp1bmlxdWVfcHRyPElucHV0QnVmZmVycz4+OjpMb2NrZWQgYnVmZmVycyhtSW5wdXRCdWZmZXJzKTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBjMmJ1ZmZlcjsKKyAgICAgICAgaWYgKCEoKmJ1ZmZlcnMpLT5yZWxlYXNlQnVmZmVyKGJ1ZmZlciwgJmMyYnVmZmVyKSkgeworICAgICAgICAgICAgcmV0dXJuIC1FTk9FTlQ7CisgICAgICAgIH0KKyAgICAgICAgd29yay0+aW5wdXQuYnVmZmVycy5wdXNoX2JhY2soYzJidWZmZXIpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1BdmFpbGFibGVQaXBlbGluZUNhcGFjaXR5LmZyZWVJbnB1dFNsb3RzKDEsICJxdWV1ZUlucHV0QnVmZmVySW50ZXJuYWwiKTsKKyAgICAgICAgaWYgKGVvcykgeworICAgICAgICAgICAgZmxhZ3MgfD0gQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgfQorICAgIH0KKyAgICB3b3JrLT5pbnB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdClmbGFnczsKKyAgICAvLyBUT0RPOiBmaWxsIGluZm8ncworCisgICAgd29yay0+aW5wdXQuY29uZmlnVXBkYXRlID0gc3RkOjptb3ZlKG1QYXJhbXNUb0JlU2V0KTsKKyAgICB3b3JrLT53b3JrbGV0cy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmVtcGxhY2VfYmFjayhuZXcgQzJXb3JrbGV0KTsKKworICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gaXRlbXM7CisgICAgaXRlbXMucHVzaF9iYWNrKHN0ZDo6bW92ZSh3b3JrKSk7CisgICAgYzJfc3RhdHVzX3QgZXJyID0gbUNvbXBvbmVudC0+cXVldWUoJml0ZW1zKTsKKworICAgIGlmIChlcnIgPT0gQzJfT0sgJiYgZW9zICYmIGJ1ZmZlci0+c2l6ZSgpID4gMHUpIHsKKyAgICAgICAgbUNDb2RlY0NhbGxiYWNrLT5vbldvcmtRdWV1ZWQoZmFsc2UpOworICAgICAgICB3b3JrLnJlc2V0KG5ldyBDMldvcmspOworICAgICAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcCA9IHRpbWVVczsKKyAgICAgICAgd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4ID0gbUZyYW1lSW5kZXgrKzsKKyAgICAgICAgLy8gV09SS0FST1VORDoga2VlcCBjbGllbnQgdGltZXN0YW1wIGluIGN1c3RvbU9yZGluYWwKKyAgICAgICAgd29yay0+aW5wdXQub3JkaW5hbC5jdXN0b21PcmRpbmFsID0gdGltZVVzOworICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgIHdvcmstPmlucHV0LmZsYWdzID0gQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTTsKKworICAgICAgICBpdGVtcy5jbGVhcigpOworICAgICAgICBpdGVtcy5wdXNoX2JhY2soc3RkOjptb3ZlKHdvcmspKTsKKyAgICAgICAgZXJyID0gbUNvbXBvbmVudC0+cXVldWUoJml0ZW1zKTsKKyAgICB9CisgICAgaWYgKGVyciA9PSBDMl9PSykgeworICAgICAgICBtQ0NvZGVjQ2FsbGJhY2stPm9uV29ya1F1ZXVlZChlb3MpOworICAgIH0KKworICAgIGZlZWRJbnB1dEJ1ZmZlcklmQXZhaWxhYmxlSW50ZXJuYWwoKTsKKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0dXNfdCBDQ29kZWNCdWZmZXJDaGFubmVsOjpzZXRQYXJhbWV0ZXJzKHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gJnBhcmFtcykgeworICAgIFF1ZXVlR3VhcmQgZ3VhcmQobVN5bmMpOworICAgIGlmICghZ3VhcmQuaXNSdW5uaW5nKCkpIHsKKyAgICAgICAgQUxPR0QoIlslc10gc2V0UGFyYW1ldGVycyBpcyBvbmx5IHN1cHBvcnRlZCBpbiB0aGUgcnVubmluZyBzdGF0ZS4iLCBtTmFtZSk7CisgICAgICAgIHJldHVybiAtRU5PU1lTOworICAgIH0KKyAgICBtUGFyYW1zVG9CZVNldC5pbnNlcnQobVBhcmFtc1RvQmVTZXQuZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9tb3ZlX2l0ZXJhdG9yKHBhcmFtcy5iZWdpbigpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX21vdmVfaXRlcmF0b3IocGFyYW1zLmVuZCgpKSk7CisgICAgcGFyYW1zLmNsZWFyKCk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDQ29kZWNCdWZmZXJDaGFubmVsOjpxdWV1ZUlucHV0QnVmZmVyKGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+ICZidWZmZXIpIHsKKyAgICBRdWV1ZUd1YXJkIGd1YXJkKG1TeW5jKTsKKyAgICBpZiAoIWd1YXJkLmlzUnVubmluZygpKSB7CisgICAgICAgIEFMT0dEKCJbJXNdIE5vIG1vcmUgYnVmZmVycyBzaG91bGQgYmUgcXVldWVkIGF0IGN1cnJlbnQgc3RhdGUuIiwgbU5hbWUpOworICAgICAgICByZXR1cm4gLUVOT1NZUzsKKyAgICB9CisgICAgcmV0dXJuIHF1ZXVlSW5wdXRCdWZmZXJJbnRlcm5hbChidWZmZXIpOworfQorCitzdGF0dXNfdCBDQ29kZWNCdWZmZXJDaGFubmVsOjpxdWV1ZVNlY3VyZUlucHV0QnVmZmVyKAorICAgICAgICBjb25zdCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAmYnVmZmVyLCBib29sIHNlY3VyZSwgY29uc3QgdWludDhfdCAqa2V5LAorICAgICAgICBjb25zdCB1aW50OF90ICppdiwgQ3J5cHRvUGx1Z2luOjpNb2RlIG1vZGUsIENyeXB0b1BsdWdpbjo6UGF0dGVybiBwYXR0ZXJuLAorICAgICAgICBjb25zdCBDcnlwdG9QbHVnaW46OlN1YlNhbXBsZSAqc3ViU2FtcGxlcywgc2l6ZV90IG51bVN1YlNhbXBsZXMsCisgICAgICAgIEFTdHJpbmcgKmVycm9yRGV0YWlsTXNnKSB7CisgICAgUXVldWVHdWFyZCBndWFyZChtU3luYyk7CisgICAgaWYgKCFndWFyZC5pc1J1bm5pbmcoKSkgeworICAgICAgICBBTE9HRCgiWyVzXSBObyBtb3JlIGJ1ZmZlcnMgc2hvdWxkIGJlIHF1ZXVlZCBhdCBjdXJyZW50IHN0YXRlLiIsIG1OYW1lKTsKKyAgICAgICAgcmV0dXJuIC1FTk9TWVM7CisgICAgfQorCisgICAgaWYgKCFoYXNDcnlwdG9PckRlc2NyYW1ibGVyKCkpIHsKKyAgICAgICAgcmV0dXJuIC1FTk9TWVM7CisgICAgfQorICAgIHNwPEVuY3J5cHRlZExpbmVhckJsb2NrQnVmZmVyPiBlbmNyeXB0ZWRCdWZmZXIoKEVuY3J5cHRlZExpbmVhckJsb2NrQnVmZmVyICopYnVmZmVyLmdldCgpKTsKKworICAgIHNzaXplX3QgcmVzdWx0ID0gLTE7CisgICAgc3NpemVfdCBjb2RlY0RhdGFPZmZzZXQgPSAwOworICAgIGlmIChtQ3J5cHRvICE9IG51bGxwdHIpIHsKKyAgICAgICAgSUNyeXB0bzo6RGVzdGluYXRpb25CdWZmZXIgZGVzdGluYXRpb247CisgICAgICAgIGlmIChzZWN1cmUpIHsKKyAgICAgICAgICAgIGRlc3RpbmF0aW9uLm1UeXBlID0gSUNyeXB0bzo6a0Rlc3RpbmF0aW9uVHlwZU5hdGl2ZUhhbmRsZTsKKyAgICAgICAgICAgIGRlc3RpbmF0aW9uLm1IYW5kbGUgPSBlbmNyeXB0ZWRCdWZmZXItPmhhbmRsZSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGVzdGluYXRpb24ubVR5cGUgPSBJQ3J5cHRvOjprRGVzdGluYXRpb25UeXBlU2hhcmVkTWVtb3J5OworICAgICAgICAgICAgZGVzdGluYXRpb24ubVNoYXJlZE1lbW9yeSA9IG1EZWNyeXB0RGVzdGluYXRpb247CisgICAgICAgIH0KKyAgICAgICAgSUNyeXB0bzo6U291cmNlQnVmZmVyIHNvdXJjZTsKKyAgICAgICAgZW5jcnlwdGVkQnVmZmVyLT5maWxsU291cmNlQnVmZmVyKCZzb3VyY2UpOworICAgICAgICByZXN1bHQgPSBtQ3J5cHRvLT5kZWNyeXB0KAorICAgICAgICAgICAgICAgIGtleSwgaXYsIG1vZGUsIHBhdHRlcm4sIHNvdXJjZSwgYnVmZmVyLT5vZmZzZXQoKSwKKyAgICAgICAgICAgICAgICBzdWJTYW1wbGVzLCBudW1TdWJTYW1wbGVzLCBkZXN0aW5hdGlvbiwgZXJyb3JEZXRhaWxNc2cpOworICAgICAgICBpZiAocmVzdWx0IDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICBpZiAoZGVzdGluYXRpb24ubVR5cGUgPT0gSUNyeXB0bzo6a0Rlc3RpbmF0aW9uVHlwZVNoYXJlZE1lbW9yeSkgeworICAgICAgICAgICAgZW5jcnlwdGVkQnVmZmVyLT5jb3B5RGVjcnlwdGVkQ29udGVudChtRGVjcnlwdERlc3RpbmF0aW9uLCByZXN1bHQpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gSGVyZSB3ZSBjYXN0IENyeXB0b1BsdWdpbjo6U3ViU2FtcGxlIHRvIGhhcmR3YXJlOjpjYXM6Om5hdGl2ZTo6VjFfMDo6U3ViU2FtcGxlCisgICAgICAgIC8vIGRpcmVjdGx5LCB0aGUgc3RydWN0dXJlIGRlZmluaXRpb25zIHNob3VsZCBtYXRjaCBhcyBjaGVja2VkIGluIERlc2NyYW1ibGVySW1wbC5jcHAuCisgICAgICAgIGhpZGxfdmVjPFN1YlNhbXBsZT4gaGlkbFN1YlNhbXBsZXM7CisgICAgICAgIGhpZGxTdWJTYW1wbGVzLnNldFRvRXh0ZXJuYWwoKFN1YlNhbXBsZSAqKXN1YlNhbXBsZXMsIG51bVN1YlNhbXBsZXMsIGZhbHNlIC8qb3duKi8pOworCisgICAgICAgIGhhcmR3YXJlOjpjYXM6Om5hdGl2ZTo6VjFfMDo6U2hhcmVkQnVmZmVyIHNyY0J1ZmZlcjsKKyAgICAgICAgZW5jcnlwdGVkQnVmZmVyLT5maWxsU291cmNlQnVmZmVyKCZzcmNCdWZmZXIpOworCisgICAgICAgIERlc3RpbmF0aW9uQnVmZmVyIGRzdEJ1ZmZlcjsKKyAgICAgICAgaWYgKHNlY3VyZSkgeworICAgICAgICAgICAgZHN0QnVmZmVyLnR5cGUgPSBCdWZmZXJUeXBlOjpOQVRJVkVfSEFORExFOworICAgICAgICAgICAgZHN0QnVmZmVyLnNlY3VyZU1lbW9yeSA9IGhpZGxfaGFuZGxlKGVuY3J5cHRlZEJ1ZmZlci0+aGFuZGxlKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZHN0QnVmZmVyLnR5cGUgPSBCdWZmZXJUeXBlOjpTSEFSRURfTUVNT1JZOworICAgICAgICAgICAgZHN0QnVmZmVyLm5vbnNlY3VyZU1lbW9yeSA9IHNyY0J1ZmZlcjsKKyAgICAgICAgfQorCisgICAgICAgIENhc1N0YXR1cyBzdGF0dXMgPSBDYXNTdGF0dXM6Ok9LOworICAgICAgICBoaWRsX3N0cmluZyBkZXRhaWxlZEVycm9yOworICAgICAgICBTY3JhbWJsaW5nQ29udHJvbCBzY3RybCA9IFNjcmFtYmxpbmdDb250cm9sOjpVTlNDUkFNQkxFRDsKKworICAgICAgICBpZiAoa2V5ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHNjdHJsID0gKFNjcmFtYmxpbmdDb250cm9sKWtleVswXTsKKyAgICAgICAgICAgIC8vIEFkanVzdCBmb3IgdGhlIFBFUyBvZmZzZXQKKyAgICAgICAgICAgIGNvZGVjRGF0YU9mZnNldCA9IGtleVsyXSB8IChrZXlbM10gPDwgOCk7CisgICAgICAgIH0KKworICAgICAgICBhdXRvIHJldHVyblZvaWQgPSBtRGVzY3JhbWJsZXItPmRlc2NyYW1ibGUoCisgICAgICAgICAgICAgICAgc2N0cmwsCisgICAgICAgICAgICAgICAgaGlkbFN1YlNhbXBsZXMsCisgICAgICAgICAgICAgICAgc3JjQnVmZmVyLAorICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgZHN0QnVmZmVyLAorICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgWyZzdGF0dXMsICZyZXN1bHQsICZkZXRhaWxlZEVycm9yXSAoCisgICAgICAgICAgICAgICAgICAgICAgICBDYXNTdGF0dXMgX3N0YXR1cywgdWludDMyX3QgX2J5dGVzV3JpdHRlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZGxfc3RyaW5nJiBfZGV0YWlsZWRFcnJvcikgeworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBfc3RhdHVzOworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAoc3NpemVfdClfYnl0ZXNXcml0dGVuOworICAgICAgICAgICAgICAgICAgICBkZXRhaWxlZEVycm9yID0gX2RldGFpbGVkRXJyb3I7CisgICAgICAgICAgICAgICAgfSk7CisKKyAgICAgICAgaWYgKCFyZXR1cm5Wb2lkLmlzT2soKSB8fCBzdGF0dXMgIT0gQ2FzU3RhdHVzOjpPSyB8fCByZXN1bHQgPCAwKSB7CisgICAgICAgICAgICBBTE9HSSgiWyVzXSBkZXNjcmFtYmxlIGZhaWxlZCwgdHJhbnM9JXMsIHN0YXR1cz0lZCwgcmVzdWx0PSV6ZCIsCisgICAgICAgICAgICAgICAgICAgIG1OYW1lLCByZXR1cm5Wb2lkLmRlc2NyaXB0aW9uKCkuY19zdHIoKSwgc3RhdHVzLCByZXN1bHQpOworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBpZiAocmVzdWx0IDwgY29kZWNEYXRhT2Zmc2V0KSB7CisgICAgICAgICAgICBBTE9HRCgiaW52YWxpZCBjb2RlYyBkYXRhIG9mZnNldDogJXpkLCByZXN1bHQgJXpkIiwgY29kZWNEYXRhT2Zmc2V0LCByZXN1bHQpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorCisgICAgICAgIEFMT0dWKCJbJXNdIGRlc2NyYW1ibGUgc3VjY2VlZGVkLCAlemQgYnl0ZXMiLCBtTmFtZSwgcmVzdWx0KTsKKworICAgICAgICBpZiAoZHN0QnVmZmVyLnR5cGUgPT0gQnVmZmVyVHlwZTo6U0hBUkVEX01FTU9SWSkgeworICAgICAgICAgICAgZW5jcnlwdGVkQnVmZmVyLT5jb3B5RGVjcnlwdGVkQ29udGVudEZyb21NZW1vcnkocmVzdWx0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGJ1ZmZlci0+c2V0UmFuZ2UoY29kZWNEYXRhT2Zmc2V0LCByZXN1bHQgLSBjb2RlY0RhdGFPZmZzZXQpOworICAgIHJldHVybiBxdWV1ZUlucHV0QnVmZmVySW50ZXJuYWwoYnVmZmVyKTsKK30KKwordm9pZCBDQ29kZWNCdWZmZXJDaGFubmVsOjpmZWVkSW5wdXRCdWZmZXJJZkF2YWlsYWJsZSgpIHsKKyAgICBRdWV1ZUd1YXJkIGd1YXJkKG1TeW5jKTsKKyAgICBpZiAoIWd1YXJkLmlzUnVubmluZygpKSB7CisgICAgICAgIEFMT0dWKCJbJXNdIFdlJ3JlIG5vdCBydW5uaW5nIC0tLSBubyBpbnB1dCBidWZmZXIgcmVwb3J0ZWQiLCBtTmFtZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgZmVlZElucHV0QnVmZmVySWZBdmFpbGFibGVJbnRlcm5hbCgpOworfQorCit2b2lkIENDb2RlY0J1ZmZlckNoYW5uZWw6OmZlZWRJbnB1dEJ1ZmZlcklmQXZhaWxhYmxlSW50ZXJuYWwoKSB7CisgICAgd2hpbGUgKCFtSW5wdXRNZXRFb3MgJiYKKyAgICAgICAgICAgIW1SZW9yZGVyU3Rhc2gubG9jaygpLT5oYXNQZW5kaW5nKCkgJiYKKyAgICAgICAgICAgbUF2YWlsYWJsZVBpcGVsaW5lQ2FwYWNpdHkuYWxsb2NhdGUoImZlZWRJbnB1dEJ1ZmZlcklmQXZhaWxhYmxlIikpIHsKKyAgICAgICAgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gaW5CdWZmZXI7CisgICAgICAgIHNpemVfdCBpbmRleDsKKyAgICAgICAgeworICAgICAgICAgICAgTXV0ZXhlZDxzdGQ6OnVuaXF1ZV9wdHI8SW5wdXRCdWZmZXJzPj46OkxvY2tlZCBidWZmZXJzKG1JbnB1dEJ1ZmZlcnMpOworICAgICAgICAgICAgaWYgKCEoKmJ1ZmZlcnMpLT5yZXF1ZXN0TmV3QnVmZmVyKCZpbmRleCwgJmluQnVmZmVyKSkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJbJXNdIG5vIG5ldyBidWZmZXIgYXZhaWxhYmxlIiwgbU5hbWUpOworICAgICAgICAgICAgICAgIG1BdmFpbGFibGVQaXBlbGluZUNhcGFjaXR5LmZyZWUoImZlZWRJbnB1dEJ1ZmZlcklmQXZhaWxhYmxlIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoIlslc10gbmV3IGlucHV0IGluZGV4ID0gJXp1IFslcF0iLCBtTmFtZSwgaW5kZXgsIGluQnVmZmVyLmdldCgpKTsKKyAgICAgICAgbUNhbGxiYWNrLT5vbklucHV0QnVmZmVyQXZhaWxhYmxlKGluZGV4LCBpbkJ1ZmZlcik7CisgICAgfQorfQorCitzdGF0dXNfdCBDQ29kZWNCdWZmZXJDaGFubmVsOjpyZW5kZXJPdXRwdXRCdWZmZXIoCisgICAgICAgIGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+ICZidWZmZXIsIGludDY0X3QgdGltZXN0YW1wTnMpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGMyQnVmZmVyOworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxzdGQ6OnVuaXF1ZV9wdHI8T3V0cHV0QnVmZmVycz4+OjpMb2NrZWQgYnVmZmVycyhtT3V0cHV0QnVmZmVycyk7CisgICAgICAgIGlmICgqYnVmZmVycykgeworICAgICAgICAgICAgKCpidWZmZXJzKS0+cmVsZWFzZUJ1ZmZlcihidWZmZXIsICZjMkJ1ZmZlcik7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCFjMkJ1ZmZlcikgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorICAgIHNlbmRPdXRwdXRCdWZmZXJzKCk7CisKKyNpZiAwCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMySW5mbz4+IGluZm9QYXJhbXMgPSBjMkJ1ZmZlci0+aW5mbygpOworICAgIEFMT0dWKCJbJXNdIHF1ZXVpbmcgZ2Z4IGJ1ZmZlciB3aXRoICV6dSBpbmZvcyIsIG1OYW1lLCBpbmZvUGFyYW1zLnNpemUoKSk7CisgICAgZm9yIChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJJbmZvPiAmaW5mbyA6IGluZm9QYXJhbXMpIHsKKyAgICAgICAgQVN0cmluZyByZXM7CisgICAgICAgIGZvciAoc2l6ZV90IGl4ID0gMDsgaXggKyAzIDwgaW5mby0+c2l6ZSgpOyBpeCArPSA0KSB7CisgICAgICAgICAgICBpZiAoaXgpIHJlcy5hcHBlbmQoIiwgIik7CisgICAgICAgICAgICByZXMuYXBwZW5kKCooKGludDMyX3QqKWluZm8uZ2V0KCkgKyAoaXggLyA0KSkpOworICAgICAgICB9CisgICAgICAgIEFMT0dWKCIgIFslc10iLCByZXMuY19zdHIoKSk7CisgICAgfQorI2VuZGlmCisgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyU3RyZWFtUm90YXRpb25JbmZvOjpvdXRwdXQ+IHJvdGF0aW9uID0KKyAgICAgICAgc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PGNvbnN0IEMyU3RyZWFtUm90YXRpb25JbmZvOjpvdXRwdXQ+KAorICAgICAgICAgICAgICAgIGMyQnVmZmVyLT5nZXRJbmZvKEMyU3RyZWFtUm90YXRpb25JbmZvOjpvdXRwdXQ6OlBBUkFNX1RZUEUpKTsKKyAgICBib29sIGZsaXAgPSByb3RhdGlvbiAmJiAocm90YXRpb24tPmZsaXAgJiAxKTsKKyAgICB1aW50MzJfdCBxdWFydGVycyA9ICgocm90YXRpb24gPyByb3RhdGlvbi0+dmFsdWUgOiAwKSAvIDkwKSAmIDM7CisgICAgdWludDMyX3QgdHJhbnNmb3JtID0gMDsKKyAgICBzd2l0Y2ggKHF1YXJ0ZXJzKSB7CisgICAgICAgIGNhc2UgMDogLy8gbm8gcm90YXRpb24KKyAgICAgICAgICAgIHRyYW5zZm9ybSA9IGZsaXAgPyBIQUxfVFJBTlNGT1JNX0ZMSVBfSCA6IDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOiAvLyA5MCBkZWdyZWVzIGNvdW50ZXItY2xvY2t3aXNlCisgICAgICAgICAgICB0cmFuc2Zvcm0gPSBmbGlwID8gKEhBTF9UUkFOU0ZPUk1fRkxJUF9WIHwgSEFMX1RSQU5TRk9STV9ST1RfOTApCisgICAgICAgICAgICAgICAgICAgIDogSEFMX1RSQU5TRk9STV9ST1RfMjcwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjogLy8gMTgwIGRlZ3JlZXMKKyAgICAgICAgICAgIHRyYW5zZm9ybSA9IGZsaXAgPyBIQUxfVFJBTlNGT1JNX0ZMSVBfViA6IEhBTF9UUkFOU0ZPUk1fUk9UXzE4MDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDM6IC8vIDkwIGRlZ3JlZXMgY2xvY2t3aXNlCisgICAgICAgICAgICB0cmFuc2Zvcm0gPSBmbGlwID8gKEhBTF9UUkFOU0ZPUk1fRkxJUF9IIHwgSEFMX1RSQU5TRk9STV9ST1RfOTApCisgICAgICAgICAgICAgICAgICAgIDogSEFMX1RSQU5TRk9STV9ST1RfOTA7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJTdHJlYW1TdXJmYWNlU2NhbGluZ0luZm86Om91dHB1dD4gc3VyZmFjZVNjYWxpbmcgPQorICAgICAgICBzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8Y29uc3QgQzJTdHJlYW1TdXJmYWNlU2NhbGluZ0luZm86Om91dHB1dD4oCisgICAgICAgICAgICAgICAgYzJCdWZmZXItPmdldEluZm8oQzJTdHJlYW1TdXJmYWNlU2NhbGluZ0luZm86Om91dHB1dDo6UEFSQU1fVFlQRSkpOworICAgIHVpbnQzMl90IHZpZGVvU2NhbGluZ01vZGUgPSBOQVRJVkVfV0lORE9XX1NDQUxJTkdfTU9ERV9TQ0FMRV9UT19XSU5ET1c7CisgICAgaWYgKHN1cmZhY2VTY2FsaW5nKSB7CisgICAgICAgIHZpZGVvU2NhbGluZ01vZGUgPSBzdXJmYWNlU2NhbGluZy0+dmFsdWU7CisgICAgfQorCisgICAgLy8gVXNlIGRhdGFzcGFjZSBmcm9tIGZvcm1hdCBhcyBpdCBoYXMgdGhlIGRlZmF1bHQgYXNwZWN0cyBhbHJlYWR5IGFwcGxpZWQKKyAgICBhbmRyb2lkX2RhdGFzcGFjZV90IGRhdGFTcGFjZSA9IEhBTF9EQVRBU1BBQ0VfVU5LTk9XTjsgLy8gdGhpcyBpcyAwCisgICAgKHZvaWQpYnVmZmVyLT5mb3JtYXQoKS0+ZmluZEludDMyKCJhbmRyb2lkLl9kYXRhc3BhY2UiLCAoaW50MzJfdCAqKSZkYXRhU3BhY2UpOworCisgICAgLy8gSERSIHN0YXRpYyBpbmZvCisgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyU3RyZWFtSGRyU3RhdGljSW5mbzo6b3V0cHV0PiBoZHJTdGF0aWNJbmZvID0KKyAgICAgICAgc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PGNvbnN0IEMyU3RyZWFtSGRyU3RhdGljSW5mbzo6b3V0cHV0PigKKyAgICAgICAgICAgICAgICBjMkJ1ZmZlci0+Z2V0SW5mbyhDMlN0cmVhbUhkclN0YXRpY0luZm86Om91dHB1dDo6UEFSQU1fVFlQRSkpOworCisgICAgeworICAgICAgICBNdXRleGVkPE91dHB1dFN1cmZhY2U+OjpMb2NrZWQgb3V0cHV0KG1PdXRwdXRTdXJmYWNlKTsKKyAgICAgICAgaWYgKG91dHB1dC0+c3VyZmFjZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HSSgiWyVzXSBjYW5ub3QgcmVuZGVyIGJ1ZmZlciB3aXRob3V0IHN1cmZhY2UiLCBtTmFtZSk7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGQ6OnZlY3RvcjxDMkNvbnN0R3JhcGhpY0Jsb2NrPiBibG9ja3MgPSBjMkJ1ZmZlci0+ZGF0YSgpLmdyYXBoaWNCbG9ja3MoKTsKKyAgICBpZiAoYmxvY2tzLnNpemUoKSAhPSAxdSkgeworICAgICAgICBBTE9HRCgiWyVzXSBleHBlY3RlZCAxIGdyYXBoaWMgYmxvY2ssIGJ1dCBnb3QgJXp1IiwgbU5hbWUsIGJsb2Nrcy5zaXplKCkpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisgICAgY29uc3QgQzJDb25zdEdyYXBoaWNCbG9jayAmYmxvY2sgPSBibG9ja3MuZnJvbnQoKTsKKworICAgIC8vIFRPRE86IHJldmlzaXQgdGhpcyBhZnRlciBDMkZlbmNlIGltcGxlbWVudGF0aW9uLgorICAgIGFuZHJvaWQ6OklHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXQgcWJpKAorICAgICAgICAgICAgdGltZXN0YW1wTnMsCisgICAgICAgICAgICBmYWxzZSwgLy8gZHJvcHBhYmxlCisgICAgICAgICAgICBkYXRhU3BhY2UsCisgICAgICAgICAgICBSZWN0KGJsb2Nrcy5mcm9udCgpLmNyb3AoKS5sZWZ0LAorICAgICAgICAgICAgICAgICBibG9ja3MuZnJvbnQoKS5jcm9wKCkudG9wLAorICAgICAgICAgICAgICAgICBibG9ja3MuZnJvbnQoKS5jcm9wKCkucmlnaHQoKSwKKyAgICAgICAgICAgICAgICAgYmxvY2tzLmZyb250KCkuY3JvcCgpLmJvdHRvbSgpKSwKKyAgICAgICAgICAgIHZpZGVvU2NhbGluZ01vZGUsCisgICAgICAgICAgICB0cmFuc2Zvcm0sCisgICAgICAgICAgICBGZW5jZTo6Tk9fRkVOQ0UsIDApOworICAgIGlmIChoZHJTdGF0aWNJbmZvKSB7CisgICAgICAgIHN0cnVjdCBhbmRyb2lkX3NtcHRlMjA4Nl9tZXRhZGF0YSBzbXB0ZTIwODZfbWV0YSA9IHsKKyAgICAgICAgICAgIC5kaXNwbGF5UHJpbWFyeVJlZCA9IHsKKyAgICAgICAgICAgICAgICBoZHJTdGF0aWNJbmZvLT5tYXN0ZXJpbmcucmVkLngsIGhkclN0YXRpY0luZm8tPm1hc3RlcmluZy5yZWQueQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIC5kaXNwbGF5UHJpbWFyeUdyZWVuID0geworICAgICAgICAgICAgICAgIGhkclN0YXRpY0luZm8tPm1hc3RlcmluZy5ncmVlbi54LCBoZHJTdGF0aWNJbmZvLT5tYXN0ZXJpbmcuZ3JlZW4ueQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIC5kaXNwbGF5UHJpbWFyeUJsdWUgPSB7CisgICAgICAgICAgICAgICAgaGRyU3RhdGljSW5mby0+bWFzdGVyaW5nLmJsdWUueCwgaGRyU3RhdGljSW5mby0+bWFzdGVyaW5nLmJsdWUueQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIC53aGl0ZVBvaW50ID0geworICAgICAgICAgICAgICAgIGhkclN0YXRpY0luZm8tPm1hc3RlcmluZy53aGl0ZS54LCBoZHJTdGF0aWNJbmZvLT5tYXN0ZXJpbmcud2hpdGUueQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIC5tYXhMdW1pbmFuY2UgPSBoZHJTdGF0aWNJbmZvLT5tYXN0ZXJpbmcubWF4THVtaW5hbmNlLAorICAgICAgICAgICAgLm1pbkx1bWluYW5jZSA9IGhkclN0YXRpY0luZm8tPm1hc3RlcmluZy5taW5MdW1pbmFuY2UsCisgICAgICAgIH07CisKKyAgICAgICAgc3RydWN0IGFuZHJvaWRfY3RhODYxXzNfbWV0YWRhdGEgY3RhODYxX21ldGEgPSB7CisgICAgICAgICAgICAubWF4Q29udGVudExpZ2h0TGV2ZWwgPSBoZHJTdGF0aWNJbmZvLT5tYXhDbGwsCisgICAgICAgICAgICAubWF4RnJhbWVBdmVyYWdlTGlnaHRMZXZlbCA9IGhkclN0YXRpY0luZm8tPm1heEZhbGwsCisgICAgICAgIH07CisKKyAgICAgICAgSGRyTWV0YWRhdGEgaGRyOworICAgICAgICBoZHIudmFsaWRUeXBlcyA9IEhkck1ldGFkYXRhOjpTTVBURTIwODYgfCBIZHJNZXRhZGF0YTo6Q1RBODYxXzM7CisgICAgICAgIGhkci5zbXB0ZTIwODYgPSBzbXB0ZTIwODZfbWV0YTsKKyAgICAgICAgaGRyLmN0YTg2MTMgPSBjdGE4NjFfbWV0YTsKKyAgICAgICAgcWJpLnNldEhkck1ldGFkYXRhKGhkcik7CisgICAgfQorICAgIGFuZHJvaWQ6OklHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVyT3V0cHV0IHFibzsKKyAgICBzdGF0dXNfdCByZXN1bHQgPSBtQ29tcG9uZW50LT5xdWV1ZVRvT3V0cHV0U3VyZmFjZShibG9jaywgcWJpLCAmcWJvKTsKKyAgICBpZiAocmVzdWx0ICE9IE9LKSB7CisgICAgICAgIEFMT0dJKCJbJXNdIHF1ZXVlQnVmZmVyIGZhaWxlZDogJWQiLCBtTmFtZSwgcmVzdWx0KTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgQUxPR1YoIlslc10gcXVldWUgYnVmZmVyIHN1Y2Nlc3NmdWwiLCBtTmFtZSk7CisKKyAgICBpbnQ2NF90IG1lZGlhVGltZVVzID0gMDsKKyAgICAodm9pZClidWZmZXItPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmbWVkaWFUaW1lVXMpOworICAgIG1DQ29kZWNDYWxsYmFjay0+b25PdXRwdXRGcmFtZXNSZW5kZXJlZChtZWRpYVRpbWVVcywgdGltZXN0YW1wTnMpOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDQ29kZWNCdWZmZXJDaGFubmVsOjpkaXNjYXJkQnVmZmVyKGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+ICZidWZmZXIpIHsKKyAgICBBTE9HVigiWyVzXSBkaXNjYXJkQnVmZmVyOiAlcCIsIG1OYW1lLCBidWZmZXIuZ2V0KCkpOworICAgIGJvb2wgcmVsZWFzZWQgPSBmYWxzZTsKKyAgICB7CisgICAgICAgIE11dGV4ZWQ8c3RkOjp1bmlxdWVfcHRyPElucHV0QnVmZmVycz4+OjpMb2NrZWQgYnVmZmVycyhtSW5wdXRCdWZmZXJzKTsKKyAgICAgICAgaWYgKCpidWZmZXJzICYmICgqYnVmZmVycyktPnJlbGVhc2VCdWZmZXIoYnVmZmVyLCBudWxscHRyKSkgeworICAgICAgICAgICAgYnVmZmVycy51bmxvY2soKTsKKyAgICAgICAgICAgIHJlbGVhc2VkID0gdHJ1ZTsKKyAgICAgICAgICAgIG1BdmFpbGFibGVQaXBlbGluZUNhcGFjaXR5LmZyZWVJbnB1dFNsb3RzKDEsICJkaXNjYXJkQnVmZmVyIik7CisgICAgICAgIH0KKyAgICB9CisgICAgeworICAgICAgICBNdXRleGVkPHN0ZDo6dW5pcXVlX3B0cjxPdXRwdXRCdWZmZXJzPj46OkxvY2tlZCBidWZmZXJzKG1PdXRwdXRCdWZmZXJzKTsKKyAgICAgICAgaWYgKCpidWZmZXJzICYmICgqYnVmZmVycyktPnJlbGVhc2VCdWZmZXIoYnVmZmVyLCBudWxscHRyKSkgeworICAgICAgICAgICAgYnVmZmVycy51bmxvY2soKTsKKyAgICAgICAgICAgIHJlbGVhc2VkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAocmVsZWFzZWQpIHsKKyAgICAgICAgZmVlZElucHV0QnVmZmVySWZBdmFpbGFibGUoKTsKKyAgICAgICAgc2VuZE91dHB1dEJ1ZmZlcnMoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRCgiWyVzXSBNZWRpYUNvZGVjIGRpc2NhcmRlZCBhbiB1bmtub3duIGJ1ZmZlciIsIG1OYW1lKTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIENDb2RlY0J1ZmZlckNoYW5uZWw6OmdldElucHV0QnVmZmVyQXJyYXkoVmVjdG9yPHNwPE1lZGlhQ29kZWNCdWZmZXI+PiAqYXJyYXkpIHsKKyAgICBhcnJheS0+Y2xlYXIoKTsKKyAgICBNdXRleGVkPHN0ZDo6dW5pcXVlX3B0cjxJbnB1dEJ1ZmZlcnM+Pjo6TG9ja2VkIGJ1ZmZlcnMobUlucHV0QnVmZmVycyk7CisKKyAgICBpZiAoISgqYnVmZmVycyktPmlzQXJyYXlNb2RlKCkpIHsKKyAgICAgICAgKmJ1ZmZlcnMgPSAoKmJ1ZmZlcnMpLT50b0FycmF5TW9kZShrTWluSW5wdXRCdWZmZXJBcnJheVNpemUpOworICAgIH0KKworICAgICgqYnVmZmVycyktPmdldEFycmF5KGFycmF5KTsKK30KKwordm9pZCBDQ29kZWNCdWZmZXJDaGFubmVsOjpnZXRPdXRwdXRCdWZmZXJBcnJheShWZWN0b3I8c3A8TWVkaWFDb2RlY0J1ZmZlcj4+ICphcnJheSkgeworICAgIGFycmF5LT5jbGVhcigpOworICAgIE11dGV4ZWQ8c3RkOjp1bmlxdWVfcHRyPE91dHB1dEJ1ZmZlcnM+Pjo6TG9ja2VkIGJ1ZmZlcnMobU91dHB1dEJ1ZmZlcnMpOworCisgICAgaWYgKCEoKmJ1ZmZlcnMpLT5pc0FycmF5TW9kZSgpKSB7CisgICAgICAgICpidWZmZXJzID0gKCpidWZmZXJzKS0+dG9BcnJheU1vZGUoa01pbk91dHB1dEJ1ZmZlckFycmF5U2l6ZSk7CisgICAgfQorCisgICAgKCpidWZmZXJzKS0+Z2V0QXJyYXkoYXJyYXkpOworfQorCitzdGF0dXNfdCBDQ29kZWNCdWZmZXJDaGFubmVsOjpzdGFydCgKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZpbnB1dEZvcm1hdCwgY29uc3Qgc3A8QU1lc3NhZ2U+ICZvdXRwdXRGb3JtYXQpIHsKKyAgICBDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjppbnB1dCBpU3RyZWFtRm9ybWF0KDB1KTsKKyAgICBDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjpvdXRwdXQgb1N0cmVhbUZvcm1hdCgwdSk7CisgICAgQzJQb3J0UmVvcmRlckJ1ZmZlckRlcHRoVHVuaW5nOjpvdXRwdXQgcmVvcmRlckRlcHRoOworICAgIEMyUG9ydFJlb3JkZXJLZXlTZXR0aW5nOjpvdXRwdXQgcmVvcmRlcktleTsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBtQ29tcG9uZW50LT5xdWVyeSgKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAmaVN0cmVhbUZvcm1hdCwKKyAgICAgICAgICAgICAgICAmb1N0cmVhbUZvcm1hdCwKKyAgICAgICAgICAgICAgICAmcmVvcmRlckRlcHRoLAorICAgICAgICAgICAgICAgICZyZW9yZGVyS2V5LAorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHt9LAorICAgICAgICAgICAgQzJfRE9OVF9CTE9DSywKKyAgICAgICAgICAgIG51bGxwdHIpOworICAgIGlmIChlcnIgPT0gQzJfQkFEX0lOREVYKSB7CisgICAgICAgIGlmICghaVN0cmVhbUZvcm1hdCB8fCAhb1N0cmVhbUZvcm1hdCkgeworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICB7CisgICAgICAgIE11dGV4ZWQ8UmVvcmRlclN0YXNoPjo6TG9ja2VkIHJlb3JkZXIobVJlb3JkZXJTdGFzaCk7CisgICAgICAgIHJlb3JkZXItPmNsZWFyKCk7CisgICAgICAgIGlmIChyZW9yZGVyRGVwdGgpIHsKKyAgICAgICAgICAgIHJlb3JkZXItPnNldERlcHRoKHJlb3JkZXJEZXB0aC52YWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJlb3JkZXJLZXkpIHsKKyAgICAgICAgICAgIHJlb3JkZXItPnNldEtleShyZW9yZGVyS2V5LnZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyBUT0RPOiBnZXQgdGhpcyBmcm9tIGlucHV0IGZvcm1hdAorICAgIGJvb2wgc2VjdXJlID0gbUNvbXBvbmVudC0+Z2V0TmFtZSgpLmZpbmQoIi5zZWN1cmUiKSAhPSBzdGQ6OnN0cmluZzo6bnBvczsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvclN0b3JlPiBhbGxvY2F0b3JTdG9yZSA9IEdldENvZGVjMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmUoKTsKKyAgICBpbnQgcG9vbE1hc2sgPSBwcm9wZXJ0eV9nZXRfaW50MzIoCisgICAgICAgICAgICAiZGVidWcuc3RhZ2VmcmlnaHQuYzItcG9vbG1hc2siLAorICAgICAgICAgICAgMSA8PCBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OklPTiB8CisgICAgICAgICAgICAxIDw8IEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTo6QlVGRkVSUVVFVUUpOworCisgICAgaWYgKGlucHV0Rm9ybWF0ICE9IG51bGxwdHIpIHsKKyAgICAgICAgYm9vbCBncmFwaGljID0gKGlTdHJlYW1Gb3JtYXQudmFsdWUgPT0gQzJGb3JtYXRWaWRlbyk7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gcG9vbDsKKyAgICAgICAgeworICAgICAgICAgICAgTXV0ZXhlZDxCbG9ja1Bvb2xzPjo6TG9ja2VkIHBvb2xzKG1CbG9ja1Bvb2xzKTsKKworICAgICAgICAgICAgLy8gc2V0IGRlZmF1bHQgYWxsb2NhdG9yIElELgorICAgICAgICAgICAgcG9vbHMtPmlucHV0QWxsb2NhdG9ySWQgPSAoZ3JhcGhpYykgPyBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OkdSQUxMT0MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjpJT047CisKKyAgICAgICAgICAgIC8vIHF1ZXJ5IEMyUG9ydEFsbG9jYXRvcnNUdW5pbmc6OmlucHV0IGZyb20gY29tcG9uZW50LiBJZiBhbiBhbGxvY2F0b3IgSUQgaXMgb2J0YWluZWQKKyAgICAgICAgICAgIC8vIGZyb20gY29tcG9uZW50LCBjcmVhdGUgdGhlIGlucHV0IGJsb2NrIHBvb2wgd2l0aCBnaXZlbiBJRC4gT3RoZXJ3aXNlLCB1c2UgZGVmYXVsdCBJRHMuCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IHBhcmFtczsKKyAgICAgICAgICAgIGVyciA9IG1Db21wb25lbnQtPnF1ZXJ5KHsgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgQzJQb3J0QWxsb2NhdG9yc1R1bmluZzo6aW5wdXQ6OlBBUkFNX1RZUEUgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyX0RPTlRfQkxPQ0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyYW1zKTsKKyAgICAgICAgICAgIGlmICgoZXJyICE9IEMyX09LICYmIGVyciAhPSBDMl9CQURfSU5ERVgpIHx8IHBhcmFtcy5zaXplKCkgIT0gMSkgeworICAgICAgICAgICAgICAgIEFMT0dEKCJbJXNdIFF1ZXJ5IGlucHV0IGFsbG9jYXRvcnMgcmV0dXJuZWQgJXp1IHBhcmFtcyA9PiAlcyAoJXUpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1OYW1lLCBwYXJhbXMuc2l6ZSgpLCBhc1N0cmluZyhlcnIpLCBlcnIpOworICAgICAgICAgICAgfSBlbHNlIGlmIChlcnIgPT0gQzJfT0sgJiYgcGFyYW1zLnNpemUoKSA9PSAxKSB7CisgICAgICAgICAgICAgICAgQzJQb3J0QWxsb2NhdG9yc1R1bmluZzo6aW5wdXQgKmlucHV0QWxsb2NhdG9ycyA9CisgICAgICAgICAgICAgICAgICAgIEMyUG9ydEFsbG9jYXRvcnNUdW5pbmc6OmlucHV0OjpGcm9tKHBhcmFtc1swXS5nZXQoKSk7CisgICAgICAgICAgICAgICAgaWYgKGlucHV0QWxsb2NhdG9ycyAmJiBpbnB1dEFsbG9jYXRvcnMtPmZsZXhDb3VudCgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IGFsbG9jYXRvcjsKKyAgICAgICAgICAgICAgICAgICAgLy8gdmVyaWZ5IGFsbG9jYXRvciBJRHMgYW5kIHJlc29sdmUgZGVmYXVsdCBhbGxvY2F0b3IKKyAgICAgICAgICAgICAgICAgICAgYWxsb2NhdG9yU3RvcmUtPmZldGNoQWxsb2NhdG9yKGlucHV0QWxsb2NhdG9ycy0+bS52YWx1ZXNbMF0sICZhbGxvY2F0b3IpOworICAgICAgICAgICAgICAgICAgICBpZiAoYWxsb2NhdG9yKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwb29scy0+aW5wdXRBbGxvY2F0b3JJZCA9IGFsbG9jYXRvci0+Z2V0SWQoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJbJXNdIGNvbXBvbmVudCByZXF1ZXN0ZWQgaW52YWxpZCBpbnB1dCBhbGxvY2F0b3IgSUQgJXUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTmFtZSwgaW5wdXRBbGxvY2F0b3JzLT5tLnZhbHVlc1swXSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFRPRE86IHVzZSBDMkNvbXBvbmVudCB3cmFwcGVyIHRvIGFzc29jaWF0ZSB0aGlzIHBvb2wgd2l0aCBvdXJzZWx2ZXMKKyAgICAgICAgICAgIGlmICgocG9vbE1hc2sgPj4gcG9vbHMtPmlucHV0QWxsb2NhdG9ySWQpICYgMSkgeworICAgICAgICAgICAgICAgIGVyciA9IENyZWF0ZUNvZGVjMkJsb2NrUG9vbChwb29scy0+aW5wdXRBbGxvY2F0b3JJZCwgbnVsbHB0ciwgJnBvb2wpOworICAgICAgICAgICAgICAgIEFMT0dEKCJbJXNdIENyZWF0ZWQgaW5wdXQgYmxvY2sgcG9vbCB3aXRoIGFsbG9jYXRvcklEICV1ID0+IHBvb2xJRCAlbGx1IC0gJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICBtTmFtZSwgcG9vbHMtPmlucHV0QWxsb2NhdG9ySWQsCisgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKShwb29sID8gcG9vbC0+Z2V0TG9jYWxJZCgpIDogMTExMDAwMTExKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzU3RyaW5nKGVyciksIGVycik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGVyciA9IEMyX05PVF9GT1VORDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICBDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCBpbnB1dFBvb2xJZCA9CisgICAgICAgICAgICAgICAgICAgIGdyYXBoaWMgPyBDMkJsb2NrUG9vbDo6QkFTSUNfR1JBUEhJQyA6IEMyQmxvY2tQb29sOjpCQVNJQ19MSU5FQVI7CisgICAgICAgICAgICAgICAgZXJyID0gR2V0Q29kZWMyQmxvY2tQb29sKGlucHV0UG9vbElkLCBudWxscHRyLCAmcG9vbCk7CisgICAgICAgICAgICAgICAgQUxPR0QoIlslc10gVXNpbmcgYmFzaWMgaW5wdXQgYmxvY2sgcG9vbCB3aXRoIHBvb2xJRCAlbGx1ID0+IGdvdCAlbGx1IC0gJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICBtTmFtZSwgKHVuc2lnbmVkIGxvbmcgbG9uZylpbnB1dFBvb2xJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpKHBvb2wgPyBwb29sLT5nZXRMb2NhbElkKCkgOiAxMTEwMDAxMTEpLAorICAgICAgICAgICAgICAgICAgICAgICAgYXNTdHJpbmcoZXJyKSwgZXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcG9vbHMtPmlucHV0UG9vbCA9IHBvb2w7CisgICAgICAgIH0KKworICAgICAgICBNdXRleGVkPHN0ZDo6dW5pcXVlX3B0cjxJbnB1dEJ1ZmZlcnM+Pjo6TG9ja2VkIGJ1ZmZlcnMobUlucHV0QnVmZmVycyk7CisgICAgICAgIGlmIChncmFwaGljKSB7CisgICAgICAgICAgICBpZiAobUlucHV0U3VyZmFjZSkgeworICAgICAgICAgICAgICAgIGJ1ZmZlcnMtPnJlc2V0KG5ldyBEdW1teUlucHV0QnVmZmVycyhtTmFtZSkpOworICAgICAgICAgICAgfSBlbHNlIGlmIChtTWV0YU1vZGUgPT0gTU9ERV9BTlcpIHsKKyAgICAgICAgICAgICAgICBidWZmZXJzLT5yZXNldChuZXcgR3JhcGhpY01ldGFkYXRhSW5wdXRCdWZmZXJzKG1OYW1lKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGJ1ZmZlcnMtPnJlc2V0KG5ldyBHcmFwaGljSW5wdXRCdWZmZXJzKG1OYW1lKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoaGFzQ3J5cHRvT3JEZXNjcmFtYmxlcigpKSB7CisgICAgICAgICAgICAgICAgaW50MzJfdCBjYXBhY2l0eSA9IGtMaW5lYXJCdWZmZXJTaXplOworICAgICAgICAgICAgICAgICh2b2lkKWlucHV0Rm9ybWF0LT5maW5kSW50MzIoS0VZX01BWF9JTlBVVF9TSVpFLCAmY2FwYWNpdHkpOworICAgICAgICAgICAgICAgIGlmICgoc2l6ZV90KWNhcGFjaXR5ID4ga01heExpbmVhckJ1ZmZlclNpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0QoImNsaWVudCByZXF1ZXN0ZWQgJWQsIGNhcHBlZCB0byAlenUiLCBjYXBhY2l0eSwga01heExpbmVhckJ1ZmZlclNpemUpOworICAgICAgICAgICAgICAgICAgICBjYXBhY2l0eSA9IGtNYXhMaW5lYXJCdWZmZXJTaXplOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobURlYWxlciA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgIG1EZWFsZXIgPSBuZXcgTWVtb3J5RGVhbGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduKGNhcGFjaXR5LCBNZW1vcnlEZWFsZXI6OmdldEFsbG9jYXRpb25BbGlnbm1lbnQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAoa01pbklucHV0QnVmZmVyQXJyYXlTaXplICsgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVuY3J5cHRlZExpbmVhcklucHV0QnVmZmVycyIpOworICAgICAgICAgICAgICAgICAgICBtRGVjcnlwdERlc3RpbmF0aW9uID0gbURlYWxlci0+YWxsb2NhdGUoKHNpemVfdCljYXBhY2l0eSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChtQ3J5cHRvICE9IG51bGxwdHIgJiYgbUhlYXBTZXFOdW0gPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIG1IZWFwU2VxTnVtID0gbUNyeXB0by0+c2V0SGVhcChtRGVhbGVyLT5nZXRNZW1vcnlIZWFwKCkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1IZWFwU2VxTnVtID0gLTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJ1ZmZlcnMtPnJlc2V0KG5ldyBFbmNyeXB0ZWRMaW5lYXJJbnB1dEJ1ZmZlcnMoCisgICAgICAgICAgICAgICAgICAgICAgICBzZWN1cmUsIG1EZWFsZXIsIG1DcnlwdG8sIG1IZWFwU2VxTnVtLCAoc2l6ZV90KWNhcGFjaXR5LCBtTmFtZSkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBidWZmZXJzLT5yZXNldChuZXcgTGluZWFySW5wdXRCdWZmZXJzKG1OYW1lKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgKCpidWZmZXJzKS0+c2V0Rm9ybWF0KGlucHV0Rm9ybWF0KTsKKworICAgICAgICBpZiAoZXJyID09IEMyX09LKSB7CisgICAgICAgICAgICAoKmJ1ZmZlcnMpLT5zZXRQb29sKHBvb2wpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gVE9ETzogZXJyb3IKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChvdXRwdXRGb3JtYXQgIT0gbnVsbHB0cikgeworICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBvdXRwdXRTdXJmYWNlOworICAgICAgICB1aW50MzJfdCBvdXRwdXRHZW5lcmF0aW9uOworICAgICAgICB7CisgICAgICAgICAgICBNdXRleGVkPE91dHB1dFN1cmZhY2U+OjpMb2NrZWQgb3V0cHV0KG1PdXRwdXRTdXJmYWNlKTsKKyAgICAgICAgICAgIG91dHB1dFN1cmZhY2UgPSBvdXRwdXQtPnN1cmZhY2UgPworICAgICAgICAgICAgICAgICAgICBvdXRwdXQtPnN1cmZhY2UtPmdldElHcmFwaGljQnVmZmVyUHJvZHVjZXIoKSA6IG51bGxwdHI7CisgICAgICAgICAgICBvdXRwdXRHZW5lcmF0aW9uID0gb3V0cHV0LT5nZW5lcmF0aW9uOworICAgICAgICB9CisKKyAgICAgICAgYm9vbCBncmFwaGljID0gKG9TdHJlYW1Gb3JtYXQudmFsdWUgPT0gQzJGb3JtYXRWaWRlbyk7CisgICAgICAgIEMyQmxvY2tQb29sOjpsb2NhbF9pZF90IG91dHB1dFBvb2xJZF87CisKKyAgICAgICAgeworICAgICAgICAgICAgTXV0ZXhlZDxCbG9ja1Bvb2xzPjo6TG9ja2VkIHBvb2xzKG1CbG9ja1Bvb2xzKTsKKworICAgICAgICAgICAgLy8gc2V0IGRlZmF1bHQgYWxsb2NhdG9yIElELgorICAgICAgICAgICAgcG9vbHMtPm91dHB1dEFsbG9jYXRvcklkID0gKGdyYXBoaWMpID8gQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjpHUkFMTE9DCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OklPTjsKKworICAgICAgICAgICAgLy8gcXVlcnkgQzJQb3J0QWxsb2NhdG9yc1R1bmluZzo6b3V0cHV0IGZyb20gY29tcG9uZW50LCBvciB1c2UgZGVmYXVsdCBhbGxvY2F0b3IgaWYKKyAgICAgICAgICAgIC8vIHVuc3VjY2Vzc2Z1bC4KKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gcGFyYW1zOworICAgICAgICAgICAgZXJyID0gbUNvbXBvbmVudC0+cXVlcnkoeyB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBDMlBvcnRBbGxvY2F0b3JzVHVuaW5nOjpvdXRwdXQ6OlBBUkFNX1RZUEUgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyX0RPTlRfQkxPQ0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyYW1zKTsKKyAgICAgICAgICAgIGlmICgoZXJyICE9IEMyX09LICYmIGVyciAhPSBDMl9CQURfSU5ERVgpIHx8IHBhcmFtcy5zaXplKCkgIT0gMSkgeworICAgICAgICAgICAgICAgIEFMT0dEKCJbJXNdIFF1ZXJ5IG91dHB1dCBhbGxvY2F0b3JzIHJldHVybmVkICV6dSBwYXJhbXMgPT4gJXMgKCV1KSIsCisgICAgICAgICAgICAgICAgICAgICAgICBtTmFtZSwgcGFyYW1zLnNpemUoKSwgYXNTdHJpbmcoZXJyKSwgZXJyKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZXJyID09IEMyX09LICYmIHBhcmFtcy5zaXplKCkgPT0gMSkgeworICAgICAgICAgICAgICAgIEMyUG9ydEFsbG9jYXRvcnNUdW5pbmc6Om91dHB1dCAqb3V0cHV0QWxsb2NhdG9ycyA9CisgICAgICAgICAgICAgICAgICAgIEMyUG9ydEFsbG9jYXRvcnNUdW5pbmc6Om91dHB1dDo6RnJvbShwYXJhbXNbMF0uZ2V0KCkpOworICAgICAgICAgICAgICAgIGlmIChvdXRwdXRBbGxvY2F0b3JzICYmIG91dHB1dEFsbG9jYXRvcnMtPmZsZXhDb3VudCgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IGFsbG9jYXRvcjsKKyAgICAgICAgICAgICAgICAgICAgLy8gdmVyaWZ5IGFsbG9jYXRvciBJRHMgYW5kIHJlc29sdmUgZGVmYXVsdCBhbGxvY2F0b3IKKyAgICAgICAgICAgICAgICAgICAgYWxsb2NhdG9yU3RvcmUtPmZldGNoQWxsb2NhdG9yKG91dHB1dEFsbG9jYXRvcnMtPm0udmFsdWVzWzBdLCAmYWxsb2NhdG9yKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFsbG9jYXRvcikgeworICAgICAgICAgICAgICAgICAgICAgICAgcG9vbHMtPm91dHB1dEFsbG9jYXRvcklkID0gYWxsb2NhdG9yLT5nZXRJZCgpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0QoIlslc10gY29tcG9uZW50IHJlcXVlc3RlZCBpbnZhbGlkIG91dHB1dCBhbGxvY2F0b3IgSUQgJXUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTmFtZSwgb3V0cHV0QWxsb2NhdG9ycy0+bS52YWx1ZXNbMF0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyB1c2UgYnVmZmVycXVldWUgaWYgb3V0cHV0dGluZyB0byBhIHN1cmZhY2UuCisgICAgICAgICAgICAvLyBxdWVyeSBDMlBvcnRTdXJmYWNlQWxsb2NhdG9yVHVuaW5nOjpvdXRwdXQgZnJvbSBjb21wb25lbnQsIG9yIHVzZSBkZWZhdWx0IGFsbG9jYXRvcgorICAgICAgICAgICAgLy8gaWYgdW5zdWNjZXNzZnVsLgorICAgICAgICAgICAgaWYgKG91dHB1dFN1cmZhY2UpIHsKKyAgICAgICAgICAgICAgICBwYXJhbXMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICBlcnIgPSBtQ29tcG9uZW50LT5xdWVyeSh7IH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBDMlBvcnRTdXJmYWNlQWxsb2NhdG9yVHVuaW5nOjpvdXRwdXQ6OlBBUkFNX1RZUEUgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMl9ET05UX0JMT0NLLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJhbXMpOworICAgICAgICAgICAgICAgIGlmICgoZXJyICE9IEMyX09LICYmIGVyciAhPSBDMl9CQURfSU5ERVgpIHx8IHBhcmFtcy5zaXplKCkgIT0gMSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRCgiWyVzXSBRdWVyeSBvdXRwdXQgc3VyZmFjZSBhbGxvY2F0b3IgcmV0dXJuZWQgJXp1IHBhcmFtcyA9PiAlcyAoJXUpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTmFtZSwgcGFyYW1zLnNpemUoKSwgYXNTdHJpbmcoZXJyKSwgZXJyKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVyciA9PSBDMl9PSyAmJiBwYXJhbXMuc2l6ZSgpID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgQzJQb3J0U3VyZmFjZUFsbG9jYXRvclR1bmluZzo6b3V0cHV0ICpzdXJmYWNlQWxsb2NhdG9yID0KKyAgICAgICAgICAgICAgICAgICAgICAgIEMyUG9ydFN1cmZhY2VBbGxvY2F0b3JUdW5pbmc6Om91dHB1dDo6RnJvbShwYXJhbXNbMF0uZ2V0KCkpOworICAgICAgICAgICAgICAgICAgICBpZiAoc3VyZmFjZUFsbG9jYXRvcikgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiBhbGxvY2F0b3I7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB2ZXJpZnkgYWxsb2NhdG9yIElEcyBhbmQgcmVzb2x2ZSBkZWZhdWx0IGFsbG9jYXRvcgorICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdG9yU3RvcmUtPmZldGNoQWxsb2NhdG9yKHN1cmZhY2VBbGxvY2F0b3ItPnZhbHVlLCAmYWxsb2NhdG9yKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbGxvY2F0b3IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb29scy0+b3V0cHV0QWxsb2NhdG9ySWQgPSBhbGxvY2F0b3ItPmdldElkKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJbJXNdIGNvbXBvbmVudCByZXF1ZXN0ZWQgaW52YWxpZCBzdXJmYWNlIG91dHB1dCBhbGxvY2F0b3IgSUQgJXUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5hbWUsIHN1cmZhY2VBbGxvY2F0b3ItPnZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBDMl9CQURfVkFMVUU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHBvb2xzLT5vdXRwdXRBbGxvY2F0b3JJZCA9PSBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OkdSQUxMT0MKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIGVyciAhPSBDMl9PSworICAgICAgICAgICAgICAgICAgICAgICAgJiYgKChwb29sTWFzayA+PiBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OkJVRkZFUlFVRVVFKSAmIDEpKSB7CisgICAgICAgICAgICAgICAgICAgIHBvb2xzLT5vdXRwdXRBbGxvY2F0b3JJZCA9IEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTo6QlVGRkVSUVVFVUU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoKHBvb2xNYXNrID4+IHBvb2xzLT5vdXRwdXRBbGxvY2F0b3JJZCkgJiAxKSB7CisgICAgICAgICAgICAgICAgZXJyID0gbUNvbXBvbmVudC0+Y3JlYXRlQmxvY2tQb29sKAorICAgICAgICAgICAgICAgICAgICAgICAgcG9vbHMtPm91dHB1dEFsbG9jYXRvcklkLCAmcG9vbHMtPm91dHB1dFBvb2xJZCwgJnBvb2xzLT5vdXRwdXRQb29sSW50Zik7CisgICAgICAgICAgICAgICAgQUxPR0koIlslc10gQ3JlYXRlZCBvdXRwdXQgYmxvY2sgcG9vbCB3aXRoIGFsbG9jYXRvcklEICV1ID0+IHBvb2xJRCAlbGx1IC0gJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgbU5hbWUsIHBvb2xzLT5vdXRwdXRBbGxvY2F0b3JJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpcG9vbHMtPm91dHB1dFBvb2xJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzU3RyaW5nKGVycikpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBDMl9OT1RfRk9VTkQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgLy8gdXNlIGJhc2ljIHBvb2wgaW5zdGVhZAorICAgICAgICAgICAgICAgIHBvb2xzLT5vdXRwdXRQb29sSWQgPQorICAgICAgICAgICAgICAgICAgICBncmFwaGljID8gQzJCbG9ja1Bvb2w6OkJBU0lDX0dSQVBISUMgOiBDMkJsb2NrUG9vbDo6QkFTSUNfTElORUFSOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBDb25maWd1cmUgb3V0cHV0IGJsb2NrIHBvb2wgSUQgYXMgcGFyYW1ldGVyIEMyUG9ydEJsb2NrUG9vbHNUdW5pbmc6Om91dHB1dCB0bworICAgICAgICAgICAgLy8gY29tcG9uZW50LgorICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyUG9ydEJsb2NrUG9vbHNUdW5pbmc6Om91dHB1dD4gcG9vbElkc1R1bmluZyA9CisgICAgICAgICAgICAgICAgICAgIEMyUG9ydEJsb2NrUG9vbHNUdW5pbmc6Om91dHB1dDo6QWxsb2NVbmlxdWUoeyBwb29scy0+b3V0cHV0UG9vbElkIH0pOworCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgICAgICAgICBlcnIgPSBtQ29tcG9uZW50LT5jb25maWcoeyBwb29sSWRzVHVuaW5nLmdldCgpIH0sIEMyX01BWV9CTE9DSywgJmZhaWx1cmVzKTsKKyAgICAgICAgICAgIEFMT0dEKCJbJXNdIENvbmZpZ3VyZWQgb3V0cHV0IGJsb2NrIHBvb2wgaWRzICVsbHUgPT4gJXMiLAorICAgICAgICAgICAgICAgICAgICBtTmFtZSwgKHVuc2lnbmVkIGxvbmcgbG9uZylwb29sSWRzVHVuaW5nLT5tLnZhbHVlc1swXSwgYXNTdHJpbmcoZXJyKSk7CisgICAgICAgICAgICBvdXRwdXRQb29sSWRfID0gcG9vbHMtPm91dHB1dFBvb2xJZDsKKyAgICAgICAgfQorCisgICAgICAgIE11dGV4ZWQ8c3RkOjp1bmlxdWVfcHRyPE91dHB1dEJ1ZmZlcnM+Pjo6TG9ja2VkIGJ1ZmZlcnMobU91dHB1dEJ1ZmZlcnMpOworCisgICAgICAgIGlmIChncmFwaGljKSB7CisgICAgICAgICAgICBpZiAob3V0cHV0U3VyZmFjZSkgeworICAgICAgICAgICAgICAgIGJ1ZmZlcnMtPnJlc2V0KG5ldyBHcmFwaGljT3V0cHV0QnVmZmVycyhtTmFtZSkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBidWZmZXJzLT5yZXNldChuZXcgUmF3R3JhcGhpY091dHB1dEJ1ZmZlcnMobU5hbWUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJ1ZmZlcnMtPnJlc2V0KG5ldyBMaW5lYXJPdXRwdXRCdWZmZXJzKG1OYW1lKSk7CisgICAgICAgIH0KKyAgICAgICAgKCpidWZmZXJzKS0+c2V0Rm9ybWF0KG91dHB1dEZvcm1hdC0+ZHVwKCkpOworCisKKyAgICAgICAgLy8gVHJ5IHRvIHNldCBvdXRwdXQgc3VyZmFjZSB0byBjcmVhdGVkIGJsb2NrIHBvb2wgaWYgZ2l2ZW4uCisgICAgICAgIGlmIChvdXRwdXRTdXJmYWNlKSB7CisgICAgICAgICAgICBtQ29tcG9uZW50LT5zZXRPdXRwdXRTdXJmYWNlKAorICAgICAgICAgICAgICAgICAgICBvdXRwdXRQb29sSWRfLAorICAgICAgICAgICAgICAgICAgICBvdXRwdXRTdXJmYWNlLAorICAgICAgICAgICAgICAgICAgICBvdXRwdXRHZW5lcmF0aW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChvU3RyZWFtRm9ybWF0LnZhbHVlID09IEMyQnVmZmVyRGF0YTo6TElORUFSCisgICAgICAgICAgICAgICAgJiYgbUNvbXBvbmVudE5hbWUuZmluZCgiYzIucXRpLiIpID09IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgICAgICAvLyBXT1JLQVJPVU5EOiBpZiB3ZSdyZSB1c2luZyBlYXJseSBDU0Qgd29ya2Fyb3VuZCB3ZSBjb252ZXJ0IHRvCisgICAgICAgICAgICAvLyAgICAgICAgICAgICBhcnJheSBtb2RlLCB0byBhcHBlYXNlIGFwcHMgYXNzdW1pbmcgdGhlIG91dHB1dAorICAgICAgICAgICAgLy8gICAgICAgICAgICAgYnVmZmVycyB0byBiZSBvZiB0aGUgc2FtZSBzaXplLgorICAgICAgICAgICAgKCpidWZmZXJzKSA9ICgqYnVmZmVycyktPnRvQXJyYXlNb2RlKGtNaW5PdXRwdXRCdWZmZXJBcnJheVNpemUpOworCisgICAgICAgICAgICBpbnQzMl90IGNoYW5uZWxDb3VudDsKKyAgICAgICAgICAgIGludDMyX3Qgc2FtcGxlUmF0ZTsKKyAgICAgICAgICAgIGlmIChvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMihLRVlfQ0hBTk5FTF9DT1VOVCwgJmNoYW5uZWxDb3VudCkKKyAgICAgICAgICAgICAgICAgICAgJiYgb3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoS0VZX1NBTVBMRV9SQVRFLCAmc2FtcGxlUmF0ZSkpIHsKKyAgICAgICAgICAgICAgICBpbnQzMl90IGRlbGF5ID0gMDsKKyAgICAgICAgICAgICAgICBpbnQzMl90IHBhZGRpbmcgPSAwOzsKKyAgICAgICAgICAgICAgICBpZiAoIW91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJlbmNvZGVyLWRlbGF5IiwgJmRlbGF5KSkgeworICAgICAgICAgICAgICAgICAgICBkZWxheSA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICghb3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoImVuY29kZXItcGFkZGluZyIsICZwYWRkaW5nKSkgeworICAgICAgICAgICAgICAgICAgICBwYWRkaW5nID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGRlbGF5IHx8IHBhZGRpbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gV2UgbmVlZCB3cml0ZSBhY2Nlc3MgdG8gdGhlIGJ1ZmZlcnMsIGFuZCB3ZSdyZSBhbHJlYWR5IGluCisgICAgICAgICAgICAgICAgICAgIC8vIGFycmF5IG1vZGUuCisgICAgICAgICAgICAgICAgICAgICgqYnVmZmVycyktPmluaXRTa2lwQ3V0QnVmZmVyKGRlbGF5LCBwYWRkaW5nLCBzYW1wbGVSYXRlLCBjaGFubmVsQ291bnQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFNldCB1cCBwaXBlbGluZSBjb250cm9sLiBUaGlzIGhhcyB0byBiZSBkb25lIGFmdGVyIG1JbnB1dEJ1ZmZlcnMgYW5kCisgICAgLy8gbU91dHB1dEJ1ZmZlcnMgYXJlIGluaXRpYWxpemVkIHRvIG1ha2Ugc3VyZSB0aGF0IGxpbmdlcmluZyBjYWxsYmFja3MKKyAgICAvLyBhYm91dCBidWZmZXJzIGZyb20gdGhlIHByZXZpb3VzIGdlbmVyYXRpb24gZG8gbm90IGludGVyZmVyZSB3aXRoIHRoZQorICAgIC8vIG5ld2x5IGluaXRpYWxpemVkIHBpcGVsaW5lIGNhcGFjaXR5LgorCisgICAgLy8gUXVlcnkgZGVsYXlzCisgICAgQzJQb3J0UmVxdWVzdGVkRGVsYXlUdW5pbmc6OmlucHV0IGlucHV0RGVsYXk7CisgICAgQzJQb3J0UmVxdWVzdGVkRGVsYXlUdW5pbmc6Om91dHB1dCBvdXRwdXREZWxheTsKKyAgICBDMlJlcXVlc3RlZFBpcGVsaW5lRGVsYXlUdW5pbmcgcGlwZWxpbmVEZWxheTsKKyNpZiAwCisgICAgZXJyID0gbUNvbXBvbmVudC0+cXVlcnkoCisgICAgICAgICAgICB7ICZpbnB1dERlbGF5LCAmcGlwZWxpbmVEZWxheSwgJm91dHB1dERlbGF5IH0sCisgICAgICAgICAgICB7fSwKKyAgICAgICAgICAgIEMyX0RPTlRfQkxPQ0ssCisgICAgICAgICAgICBudWxscHRyKTsKKyAgICBtQXZhaWxhYmxlUGlwZWxpbmVDYXBhY2l0eS5pbml0aWFsaXplKAorICAgICAgICAgICAgaW5wdXREZWxheSwKKyAgICAgICAgICAgIGlucHV0RGVsYXkgKyBwaXBlbGluZURlbGF5LAorICAgICAgICAgICAgaW5wdXREZWxheSArIHBpcGVsaW5lRGVsYXkgKyBvdXRwdXREZWxheSwKKyAgICAgICAgICAgIG1OYW1lKTsKKyNlbHNlCisgICAgbUF2YWlsYWJsZVBpcGVsaW5lQ2FwYWNpdHkuaW5pdGlhbGl6ZSgKKyAgICAgICAgICAgIGtNaW5JbnB1dEJ1ZmZlckFycmF5U2l6ZSwKKyAgICAgICAgICAgIGtNYXhQaXBlbGluZUNhcGFjaXR5LAorICAgICAgICAgICAgbU5hbWUpOworI2VuZGlmCisKKyAgICBtSW5wdXRNZXRFb3MgPSBmYWxzZTsKKyAgICBtU3luYy5zdGFydCgpOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6cmVxdWVzdEluaXRpYWxJbnB1dEJ1ZmZlcnMoKSB7CisgICAgaWYgKG1JbnB1dFN1cmZhY2UpIHsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIEMyU3RyZWFtRm9ybWF0Q29uZmlnOjpvdXRwdXQgb1N0cmVhbUZvcm1hdCgwdSk7CisgICAgYzJfc3RhdHVzX3QgZXJyID0gbUNvbXBvbmVudC0+cXVlcnkoeyAmb1N0cmVhbUZvcm1hdCB9LCB7fSwgQzJfRE9OVF9CTE9DSywgbnVsbHB0cik7CisgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisgICAgc3RkOjp2ZWN0b3I8c3A8TWVkaWFDb2RlY0J1ZmZlcj4+IHRvQmVRdWV1ZWQ7CisgICAgLy8gVE9ETzogdXNlIHByb3BlciBidWZmZXIgZGVwdGggaW5zdGVhZCBvZiB0aGlzIHJhbmRvbSB2YWx1ZQorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga01pbklucHV0QnVmZmVyQXJyYXlTaXplOyArK2kpIHsKKyAgICAgICAgc2l6ZV90IGluZGV4OworICAgICAgICBzcDxNZWRpYUNvZGVjQnVmZmVyPiBidWZmZXI7CisgICAgICAgIHsKKyAgICAgICAgICAgIE11dGV4ZWQ8c3RkOjp1bmlxdWVfcHRyPElucHV0QnVmZmVycz4+OjpMb2NrZWQgYnVmZmVycyhtSW5wdXRCdWZmZXJzKTsKKyAgICAgICAgICAgIGlmICghKCpidWZmZXJzKS0+cmVxdWVzdE5ld0J1ZmZlcigmaW5kZXgsICZidWZmZXIpKSB7CisgICAgICAgICAgICAgICAgaWYgKGkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVygiWyVzXSBzdGFydDogY2Fubm90IGFsbG9jYXRlIG1lbW9yeSBhdCBhbGwiLCBtTmFtZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlslc10gc3RhcnQ6IGNhbm5vdCBhbGxvY2F0ZSBtZW1vcnksIG9ubHkgJXp1IGJ1ZmZlcnMgYWxsb2NhdGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTmFtZSwgaSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChidWZmZXIpIHsKKyAgICAgICAgICAgIE11dGV4ZWQ8c3RkOjpsaXN0PHNwPEFCdWZmZXI+Pj46OkxvY2tlZCBjb25maWdzKG1GbHVzaGVkQ29uZmlncyk7CisgICAgICAgICAgICBBTE9HVigiWyVzXSBpbnB1dCBidWZmZXIgJXp1IGF2YWlsYWJsZSIsIG1OYW1lLCBpbmRleCk7CisgICAgICAgICAgICBib29sIHBvc3QgPSB0cnVlOworICAgICAgICAgICAgaWYgKCFjb25maWdzLT5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gY29uZmlnID0gY29uZmlncy0+ZnJvbnQoKTsKKyAgICAgICAgICAgICAgICBpZiAoYnVmZmVyLT5jYXBhY2l0eSgpID49IGNvbmZpZy0+c2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIG1lbWNweShidWZmZXItPmJhc2UoKSwgY29uZmlnLT5kYXRhKCksIGNvbmZpZy0+c2l6ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5zZXRSYW5nZSgwLCBjb25maWctPnNpemUoKSk7CisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5jbGVhcigpOworICAgICAgICAgICAgICAgICAgICBidWZmZXItPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIDApOworICAgICAgICAgICAgICAgICAgICBidWZmZXItPm1ldGEoKS0+c2V0SW50MzIoImNzZCIsIDEpOworICAgICAgICAgICAgICAgICAgICBwb3N0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0QoIlslc10gYnVmZmVyIGNhcGFjaXR5IHRvbyBzbWFsbCBmb3IgdGhlIGNvbmZpZyAoJXp1IDwgJXp1KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5hbWUsIGJ1ZmZlci0+Y2FwYWNpdHkoKSwgY29uZmlnLT5zaXplKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAob1N0cmVhbUZvcm1hdC52YWx1ZSA9PSBDMkJ1ZmZlckRhdGE6OkxJTkVBUiAmJiBpID09IDAKKyAgICAgICAgICAgICAgICAgICAgJiYgbUNvbXBvbmVudE5hbWUuZmluZCgiYzIucXRpLiIpID09IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgICAgICAgICAgLy8gV09SS0FST1VORDogU29tZSBhcHBzIGV4cGVjdCBDU0QgYXZhaWxhYmxlIHdpdGhvdXQgcXVldWVpbmcKKyAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICBhbnkgaW5wdXQuIFF1ZXVlIGFuIGVtcHR5IGJ1ZmZlciB0byBnZXQgdGhlIENTRC4KKyAgICAgICAgICAgICAgICBidWZmZXItPnNldFJhbmdlKDAsIDApOworICAgICAgICAgICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5jbGVhcigpOworICAgICAgICAgICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQ2NCgidGltZVVzIiwgMCk7CisgICAgICAgICAgICAgICAgcG9zdCA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1BdmFpbGFibGVQaXBlbGluZUNhcGFjaXR5LmFsbG9jYXRlKCJyZXF1ZXN0SW5pdGlhbElucHV0QnVmZmVycyIpKSB7CisgICAgICAgICAgICAgICAgaWYgKHBvc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrLT5vbklucHV0QnVmZmVyQXZhaWxhYmxlKGluZGV4LCBidWZmZXIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRvQmVRdWV1ZWQuZW1wbGFjZV9iYWNrKGJ1ZmZlcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgiWyVzXSBwaXBlbGluZSBpcyBmdWxsIHdoaWxlIHJlcXVlc3RpbmcgJXp1LXRoIGlucHV0IGJ1ZmZlciIsCisgICAgICAgICAgICAgICAgICAgICAgICBtTmFtZSwgaSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZm9yIChjb25zdCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAmYnVmZmVyIDogdG9CZVF1ZXVlZCkgeworICAgICAgICBpZiAocXVldWVJbnB1dEJ1ZmZlckludGVybmFsKGJ1ZmZlcikgIT0gT0spIHsKKyAgICAgICAgICAgIG1BdmFpbGFibGVQaXBlbGluZUNhcGFjaXR5LmZyZWVDb21wb25lbnRTbG90KCJyZXF1ZXN0SW5pdGlhbElucHV0QnVmZmVycyIpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKwordm9pZCBDQ29kZWNCdWZmZXJDaGFubmVsOjpzdG9wKCkgeworICAgIG1TeW5jLnN0b3AoKTsKKyAgICBtRmlyc3RWYWxpZEZyYW1lSW5kZXggPSBtRnJhbWVJbmRleC5sb2FkKHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpOworICAgIGlmIChtSW5wdXRTdXJmYWNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgbUlucHV0U3VyZmFjZS0+ZGlzY29ubmVjdCgpOworICAgICAgICBtSW5wdXRTdXJmYWNlLnJlc2V0KCk7CisgICAgfQorfQorCit2b2lkIENDb2RlY0J1ZmZlckNoYW5uZWw6OmZsdXNoKGNvbnN0IHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gJmZsdXNoZWRXb3JrKSB7CisgICAgQUxPR1YoIlslc10gZmx1c2giLCBtTmFtZSk7CisgICAgeworICAgICAgICBNdXRleGVkPHN0ZDo6bGlzdDxzcDxBQnVmZmVyPj4+OjpMb2NrZWQgY29uZmlncyhtRmx1c2hlZENvbmZpZ3MpOworICAgICAgICBmb3IgKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrIDogZmx1c2hlZFdvcmspIHsKKyAgICAgICAgICAgIGlmICghKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfQ09ERUNfQ09ORklHKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHdvcmstPmlucHV0LmJ1ZmZlcnMuZW1wdHkoKQorICAgICAgICAgICAgICAgICAgICB8fCB3b3JrLT5pbnB1dC5idWZmZXJzLmZyb250KCktPmRhdGEoKS5saW5lYXJCbG9ja3MoKS5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgQUxPR0QoIlslc10gbm8gbGluZWFyIGNvZGVjIGNvbmZpZyBkYXRhIGZvdW5kIiwgbU5hbWUpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQzJSZWFkVmlldyB2aWV3ID0KKyAgICAgICAgICAgICAgICAgICAgd29yay0+aW5wdXQuYnVmZmVycy5mcm9udCgpLT5kYXRhKCkubGluZWFyQmxvY2tzKCkuZnJvbnQoKS5tYXAoKS5nZXQoKTsKKyAgICAgICAgICAgIGlmICh2aWV3LmVycm9yKCkgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgiWyVzXSBmYWlsZWQgdG8gbWFwIGZsdXNoZWQgY29kZWMgY29uZmlnIGRhdGE6ICVkIiwgbU5hbWUsIHZpZXcuZXJyb3IoKSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb25maWdzLT5wdXNoX2JhY2soQUJ1ZmZlcjo6Q3JlYXRlQXNDb3B5KHZpZXcuZGF0YSgpLCB2aWV3LmNhcGFjaXR5KCkpKTsKKyAgICAgICAgICAgIEFMT0dWKCJbJXNdIHN0YXNoZWQgZmx1c2hlZCBjb2RlYyBjb25maWcgZGF0YSAoc2l6ZT0ldSkiLCBtTmFtZSwgdmlldy5jYXBhY2l0eSgpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICB7CisgICAgICAgIE11dGV4ZWQ8c3RkOjp1bmlxdWVfcHRyPElucHV0QnVmZmVycz4+OjpMb2NrZWQgYnVmZmVycyhtSW5wdXRCdWZmZXJzKTsKKyAgICAgICAgKCpidWZmZXJzKS0+Zmx1c2goKTsKKyAgICB9CisgICAgeworICAgICAgICBNdXRleGVkPHN0ZDo6dW5pcXVlX3B0cjxPdXRwdXRCdWZmZXJzPj46OkxvY2tlZCBidWZmZXJzKG1PdXRwdXRCdWZmZXJzKTsKKyAgICAgICAgKCpidWZmZXJzKS0+Zmx1c2goZmx1c2hlZFdvcmspOworICAgIH0KK30KKwordm9pZCBDQ29kZWNCdWZmZXJDaGFubmVsOjpvbldvcmtEb25lKAorICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB3b3JrLCBjb25zdCBzcDxBTWVzc2FnZT4gJm91dHB1dEZvcm1hdCwKKyAgICAgICAgY29uc3QgQzJTdHJlYW1Jbml0RGF0YUluZm86Om91dHB1dCAqaW5pdERhdGEsCisgICAgICAgIHNpemVfdCBudW1EaXNjYXJkZWRJbnB1dEJ1ZmZlcnMpIHsKKyAgICBpZiAoaGFuZGxlV29yayhzdGQ6Om1vdmUod29yayksIG91dHB1dEZvcm1hdCwgaW5pdERhdGEpKSB7CisgICAgICAgIG1BdmFpbGFibGVQaXBlbGluZUNhcGFjaXR5LmZyZWVJbnB1dFNsb3RzKG51bURpc2NhcmRlZElucHV0QnVmZmVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9uV29ya0RvbmUiKTsKKyAgICAgICAgZmVlZElucHV0QnVmZmVySWZBdmFpbGFibGUoKTsKKyAgICB9Cit9CisKK3ZvaWQgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6b25JbnB1dEJ1ZmZlckRvbmUoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4mIGJ1ZmZlcikgeworICAgIGJvb2wgbmV3SW5wdXRTbG90QXZhaWxhYmxlOworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxzdGQ6OnVuaXF1ZV9wdHI8SW5wdXRCdWZmZXJzPj46OkxvY2tlZCBidWZmZXJzKG1JbnB1dEJ1ZmZlcnMpOworICAgICAgICBuZXdJbnB1dFNsb3RBdmFpbGFibGUgPSAoKmJ1ZmZlcnMpLT5leHBpcmVDb21wb25lbnRCdWZmZXIoYnVmZmVyKTsKKyAgICAgICAgaWYgKG5ld0lucHV0U2xvdEF2YWlsYWJsZSkgeworICAgICAgICAgICAgbUF2YWlsYWJsZVBpcGVsaW5lQ2FwYWNpdHkuZnJlZUlucHV0U2xvdHMoMSwgIm9uSW5wdXRCdWZmZXJEb25lIik7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKG5ld0lucHV0U2xvdEF2YWlsYWJsZSkgeworICAgICAgICBmZWVkSW5wdXRCdWZmZXJJZkF2YWlsYWJsZSgpOworICAgIH0KK30KKworYm9vbCBDQ29kZWNCdWZmZXJDaGFubmVsOjpoYW5kbGVXb3JrKAorICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB3b3JrLAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm91dHB1dEZvcm1hdCwKKyAgICAgICAgY29uc3QgQzJTdHJlYW1Jbml0RGF0YUluZm86Om91dHB1dCAqaW5pdERhdGEpIHsKKyAgICBpZiAoKHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleCAtIG1GaXJzdFZhbGlkRnJhbWVJbmRleC5sb2FkKCkpLnBlZWsoKSA8IDApIHsKKyAgICAgICAgLy8gRGlzY2FyZCBmcmFtZXMgZnJvbSBwcmV2aW91cyBnZW5lcmF0aW9uLgorICAgICAgICBBTE9HRCgiWyVzXSBEaXNjYXJkIGZyYW1lcyBmcm9tIHByZXZpb3VzIGdlbmVyYXRpb24uIiwgbU5hbWUpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKHdvcmstPndvcmtsZXRzLnNpemUoKSAhPSAxdQorICAgICAgICAgICAgfHwgIXdvcmstPndvcmtsZXRzLmZyb250KCkKKyAgICAgICAgICAgIHx8ICEod29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfSU5DT01QTEVURSkpIHsKKyAgICAgICAgbUF2YWlsYWJsZVBpcGVsaW5lQ2FwYWNpdHkuZnJlZUNvbXBvbmVudFNsb3QoImhhbmRsZVdvcmsiKTsKKyAgICB9CisKKyAgICBpZiAod29yay0+cmVzdWx0ID09IEMyX05PVF9GT1VORCkgeworICAgICAgICBBTE9HRCgiWyVzXSBmbHVzaGVkIHdvcms7IGlnbm9yZWQuIiwgbU5hbWUpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAod29yay0+cmVzdWx0ICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dEKCJbJXNdIHdvcmsgZmFpbGVkIHRvIGNvbXBsZXRlOiAlZCIsIG1OYW1lLCB3b3JrLT5yZXN1bHQpOworICAgICAgICBtQ0NvZGVjQ2FsbGJhY2stPm9uRXJyb3Iod29yay0+cmVzdWx0LCBBQ1RJT05fQ09ERV9GQVRBTCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBOT1RFOiBNZWRpYUNvZGVjIHVzYWdlIHN1cHBvc2VkbHkgaGF2ZSBvbmx5IG9uZSB3b3JrbGV0CisgICAgaWYgKHdvcmstPndvcmtsZXRzLnNpemUoKSAhPSAxdSkgeworICAgICAgICBBTE9HSSgiWyVzXSBvbldvcmtEb25lOiBpbmNvcnJlY3QgbnVtYmVyIG9mIHdvcmtsZXRzOiAlenUiLAorICAgICAgICAgICAgICAgIG1OYW1lLCB3b3JrLT53b3JrbGV0cy5zaXplKCkpOworICAgICAgICBtQ0NvZGVjQ2FsbGJhY2stPm9uRXJyb3IoVU5LTk9XTl9FUlJPUiwgQUNUSU9OX0NPREVfRkFUQUwpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29ya2xldD4gJndvcmtsZXQgPSB3b3JrLT53b3JrbGV0cy5mcm9udCgpOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBidWZmZXI7CisgICAgLy8gTk9URTogTWVkaWFDb2RlYyB1c2FnZSBzdXBwb3NlZGx5IGhhdmUgb25seSBvbmUgb3V0cHV0IHN0cmVhbS4KKyAgICBpZiAod29ya2xldC0+b3V0cHV0LmJ1ZmZlcnMuc2l6ZSgpID4gMXUpIHsKKyAgICAgICAgQUxPR0koIlslc10gb25Xb3JrRG9uZTogaW5jb3JyZWN0IG51bWJlciBvZiBvdXRwdXQgYnVmZmVyczogJXp1IiwKKyAgICAgICAgICAgICAgICBtTmFtZSwgd29ya2xldC0+b3V0cHV0LmJ1ZmZlcnMuc2l6ZSgpKTsKKyAgICAgICAgbUNDb2RlY0NhbGxiYWNrLT5vbkVycm9yKFVOS05PV05fRVJST1IsIEFDVElPTl9DT0RFX0ZBVEFMKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0gZWxzZSBpZiAod29ya2xldC0+b3V0cHV0LmJ1ZmZlcnMuc2l6ZSgpID09IDF1KSB7CisgICAgICAgIGJ1ZmZlciA9IHdvcmtsZXQtPm91dHB1dC5idWZmZXJzWzBdOworICAgICAgICBpZiAoIWJ1ZmZlcikgeworICAgICAgICAgICAgQUxPR0QoIlslc10gb25Xb3JrRG9uZTogbnVsbHB0ciBmb3VuZCBpbiBidWZmZXJzOyBpZ25vcmVkLiIsIG1OYW1lKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHdoaWxlICghd29ya2xldC0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5lbXB0eSgpKSB7CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPiBwYXJhbTsKKyAgICAgICAgd29ya2xldC0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5iYWNrKCkuc3dhcChwYXJhbSk7CisgICAgICAgIHdvcmtsZXQtPm91dHB1dC5jb25maWdVcGRhdGUucG9wX2JhY2soKTsKKyAgICAgICAgc3dpdGNoIChwYXJhbS0+Y29yZUluZGV4KCkuY29yZUluZGV4KCkpIHsKKyAgICAgICAgICAgIGNhc2UgQzJQb3J0UmVvcmRlckJ1ZmZlckRlcHRoVHVuaW5nOjpDT1JFX0lOREVYOiB7CisgICAgICAgICAgICAgICAgQzJQb3J0UmVvcmRlckJ1ZmZlckRlcHRoVHVuaW5nOjpvdXRwdXQgcmVvcmRlckRlcHRoOworICAgICAgICAgICAgICAgIGlmIChyZW9yZGVyRGVwdGgudXBkYXRlRnJvbSgqcGFyYW0pKSB7CisgICAgICAgICAgICAgICAgICAgIG1SZW9yZGVyU3Rhc2gubG9jaygpLT5zZXREZXB0aChyZW9yZGVyRGVwdGgudmFsdWUpOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiWyVzXSBvbldvcmtEb25lOiB1cGRhdGVkIHJlb3JkZXIgZGVwdGggdG8gJXUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtTmFtZSwgcmVvcmRlckRlcHRoLnZhbHVlKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBTE9HRCgiWyVzXSBvbldvcmtEb25lOiBmYWlsZWQgdG8gcmVhZCByZW9yZGVyIGRlcHRoIiwgbU5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgQzJQb3J0UmVvcmRlcktleVNldHRpbmc6OkNPUkVfSU5ERVg6IHsKKyAgICAgICAgICAgICAgICBDMlBvcnRSZW9yZGVyS2V5U2V0dGluZzo6b3V0cHV0IHJlb3JkZXJLZXk7CisgICAgICAgICAgICAgICAgaWYgKHJlb3JkZXJLZXkudXBkYXRlRnJvbSgqcGFyYW0pKSB7CisgICAgICAgICAgICAgICAgICAgIG1SZW9yZGVyU3Rhc2gubG9jaygpLT5zZXRLZXkocmVvcmRlcktleS52YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJbJXNdIG9uV29ya0RvbmU6IHVwZGF0ZWQgcmVvcmRlciBrZXkgdG8gJXUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtTmFtZSwgcmVvcmRlcktleS52YWx1ZSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0QoIlslc10gb25Xb3JrRG9uZTogZmFpbGVkIHRvIHJlYWQgcmVvcmRlciBrZXkiLCBtTmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBBTE9HVigiWyVzXSBvbldvcmtEb25lOiB1bnJlY29nbml6ZWQgY29uZmlnIHVwZGF0ZSAoJTA4WCkiLAorICAgICAgICAgICAgICAgICAgICAgIG1OYW1lLCBwYXJhbS0+aW5kZXgoKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAob3V0cHV0Rm9ybWF0ICE9IG51bGxwdHIpIHsKKyAgICAgICAgTXV0ZXhlZDxzdGQ6OnVuaXF1ZV9wdHI8T3V0cHV0QnVmZmVycz4+OjpMb2NrZWQgYnVmZmVycyhtT3V0cHV0QnVmZmVycyk7CisgICAgICAgIEFMT0dEKCJbJXNdIG9uV29ya0RvbmU6IG91dHB1dCBmb3JtYXQgY2hhbmdlZCB0byAlcyIsCisgICAgICAgICAgICAgICAgbU5hbWUsIG91dHB1dEZvcm1hdC0+ZGVidWdTdHJpbmcoKS5jX3N0cigpKTsKKyAgICAgICAgKCpidWZmZXJzKS0+c2V0Rm9ybWF0KG91dHB1dEZvcm1hdCk7CisKKyAgICAgICAgQVN0cmluZyBtZWRpYVR5cGU7CisgICAgICAgIGlmIChvdXRwdXRGb3JtYXQtPmZpbmRTdHJpbmcoS0VZX01JTUUsICZtZWRpYVR5cGUpCisgICAgICAgICAgICAgICAgJiYgbWVkaWFUeXBlID09IE1JTUVUWVBFX0FVRElPX1JBVykgeworICAgICAgICAgICAgaW50MzJfdCBjaGFubmVsQ291bnQ7CisgICAgICAgICAgICBpbnQzMl90IHNhbXBsZVJhdGU7CisgICAgICAgICAgICBpZiAob3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoS0VZX0NIQU5ORUxfQ09VTlQsICZjaGFubmVsQ291bnQpCisgICAgICAgICAgICAgICAgICAgICYmIG91dHB1dEZvcm1hdC0+ZmluZEludDMyKEtFWV9TQU1QTEVfUkFURSwgJnNhbXBsZVJhdGUpKSB7CisgICAgICAgICAgICAgICAgKCpidWZmZXJzKS0+dXBkYXRlU2tpcEN1dEJ1ZmZlcihzYW1wbGVSYXRlLCBjaGFubmVsQ291bnQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaW50MzJfdCBmbGFncyA9IDA7CisgICAgaWYgKHdvcmtsZXQtPm91dHB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgZmxhZ3MgfD0gTWVkaWFDb2RlYzo6QlVGRkVSX0ZMQUdfRU9TOworICAgICAgICBBTE9HVigiWyVzXSBvbldvcmtEb25lOiBvdXRwdXQgRU9TIiwgbU5hbWUpOworICAgIH0KKworICAgIHNwPE1lZGlhQ29kZWNCdWZmZXI+IG91dEJ1ZmZlcjsKKyAgICBzaXplX3QgaW5kZXg7CisKKyAgICAvLyBXT1JLQVJPVU5EOiBhZGp1c3Qgb3V0cHV0IHRpbWVzdGFtcCBiYXNlZCBvbiBjbGllbnQgaW5wdXQgdGltZXN0YW1wIGFuZCBjb2RlYworICAgIC8vIGlucHV0IHRpbWVzdGFtcC4gQ29kZWMgb3V0cHV0IHRpbWVzdGFtcCAoaW4gdGhlIHRpbWVzdGFtcCBmaWVsZCkgc2hhbGwgY29ycmVzcG9uZCB0bworICAgIC8vIHRoZSBjb2RlYyBpbnB1dCB0aW1lc3RhbXAsIGJ1dCBjbGllbnQgb3V0cHV0IHRpbWVzdGFtcCBzaG91bGQgKHJlcG9ydGVkIGluIHRpbWVVcykKKyAgICAvLyBzaGFsbCBjb3JyZXNwb25kIHRvIHRoZSBjbGllbnQgaW5wdXQgdGltZXNhbXAgKGluIGN1c3RvbU9yZGluYWwpLiBCeSB1c2luZyB0aGUKKyAgICAvLyBkZWx0YSBiZXR3ZWVuIHRoZSB0d28sIHRoaXMgYWxsb3dzIGZvciBzb21lIHRpbWVzdGFtcCBkZXZpYXRpb24gLSBlLmcuIGlmIG9uZSBpbnB1dAorICAgIC8vIHByb2R1Y2VzIG11bHRpcGxlIG91dHB1dC4KKyAgICBjMl9jbnRyNjRfdCB0aW1lc3RhbXAgPQorICAgICAgICB3b3JrbGV0LT5vdXRwdXQub3JkaW5hbC50aW1lc3RhbXAgKyB3b3JrLT5pbnB1dC5vcmRpbmFsLmN1c3RvbU9yZGluYWwKKyAgICAgICAgICAgICAgICAtIHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wOworICAgIEFMT0dWKCJbJXNdIG9uV29ya0RvbmU6IGlucHV0ICVsbGQsIGNvZGVjICVsbGQgPT4gb3V0cHV0ICVsbGQgPT4gJWxsZCIsCisgICAgICAgICAgbU5hbWUsCisgICAgICAgICAgd29yay0+aW5wdXQub3JkaW5hbC5jdXN0b21PcmRpbmFsLnBlZWtsbCgpLAorICAgICAgICAgIHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWtsbCgpLAorICAgICAgICAgIHdvcmtsZXQtPm91dHB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrbGwoKSwKKyAgICAgICAgICB0aW1lc3RhbXAucGVla2xsKCkpOworCisgICAgaWYgKGluaXREYXRhICE9IG51bGxwdHIpIHsKKyAgICAgICAgTXV0ZXhlZDxzdGQ6OnVuaXF1ZV9wdHI8T3V0cHV0QnVmZmVycz4+OjpMb2NrZWQgYnVmZmVycyhtT3V0cHV0QnVmZmVycyk7CisgICAgICAgIGlmICgoKmJ1ZmZlcnMpLT5yZWdpc3RlckNzZChpbml0RGF0YSwgJmluZGV4LCAmb3V0QnVmZmVyKSA9PSBPSykgeworICAgICAgICAgICAgb3V0QnVmZmVyLT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCB0aW1lc3RhbXAucGVlaygpKTsKKyAgICAgICAgICAgIG91dEJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQzMigiZmxhZ3MiLCBNZWRpYUNvZGVjOjpCVUZGRVJfRkxBR19DT0RFQ0NPTkZJRyk7CisgICAgICAgICAgICBBTE9HVigiWyVzXSBvbldvcmtEb25lOiBjc2QgaW5kZXggPSAlenUgWyVwXSIsIG1OYW1lLCBpbmRleCwgb3V0QnVmZmVyLmdldCgpKTsKKworICAgICAgICAgICAgYnVmZmVycy51bmxvY2soKTsKKyAgICAgICAgICAgIG1DYWxsYmFjay0+b25PdXRwdXRCdWZmZXJBdmFpbGFibGUoaW5kZXgsIG91dEJ1ZmZlcik7CisgICAgICAgICAgICBidWZmZXJzLmxvY2soKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dEKCJbJXNdIG9uV29ya0RvbmU6IHVuYWJsZSB0byByZWdpc3RlciBjc2QiLCBtTmFtZSk7CisgICAgICAgICAgICBidWZmZXJzLnVubG9jaygpOworICAgICAgICAgICAgbUNDb2RlY0NhbGxiYWNrLT5vbkVycm9yKFVOS05PV05fRVJST1IsIEFDVElPTl9DT0RFX0ZBVEFMKTsKKyAgICAgICAgICAgIGJ1ZmZlcnMubG9jaygpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFidWZmZXIgJiYgIWZsYWdzKSB7CisgICAgICAgIEFMT0dWKCJbJXNdIG9uV29ya0RvbmU6IE5vdCByZXBvcnRpbmcgb3V0cHV0IGJ1ZmZlciAoJWxsZCkiLAorICAgICAgICAgICAgICBtTmFtZSwgd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1bGwoKSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGlmIChidWZmZXIpIHsKKyAgICAgICAgZm9yIChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJJbmZvPiAmaW5mbyA6IGJ1ZmZlci0+aW5mbygpKSB7CisgICAgICAgICAgICAvLyBUT0RPOiBwcm9wZXJseSB0cmFuc2xhdGUgdGhlc2UgdG8gbWV0YWRhdGEKKyAgICAgICAgICAgIHN3aXRjaCAoaW5mby0+Y29yZUluZGV4KCkuY29yZUluZGV4KCkpIHsKKyAgICAgICAgICAgICAgICBjYXNlIEMyU3RyZWFtUGljdHVyZVR5cGVNYXNrSW5mbzo6Q09SRV9JTkRFWDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKCgoQzJTdHJlYW1QaWN0dXJlVHlwZU1hc2tJbmZvICopaW5mby5nZXQoKSktPnZhbHVlICYgQzJQaWN0dXJlVHlwZUtleUZyYW1lKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyB8PSBNZWRpYUNvZGVjOjpCVUZGRVJfRkxBR19TWU5DRlJBTUU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICB7CisgICAgICAgIE11dGV4ZWQ8UmVvcmRlclN0YXNoPjo6TG9ja2VkIHJlb3JkZXIobVJlb3JkZXJTdGFzaCk7CisgICAgICAgIHJlb3JkZXItPmVtcGxhY2UoYnVmZmVyLCB0aW1lc3RhbXAucGVlaygpLCBmbGFncywgd29ya2xldC0+b3V0cHV0Lm9yZGluYWwpOworICAgICAgICBpZiAoZmxhZ3MgJiBNZWRpYUNvZGVjOjpCVUZGRVJfRkxBR19FT1MpIHsKKyAgICAgICAgICAgIC8vIEZsdXNoIHJlb3JkZXIgc3Rhc2gKKyAgICAgICAgICAgIHJlb3JkZXItPnNldERlcHRoKDApOworICAgICAgICB9CisgICAgfQorICAgIHNlbmRPdXRwdXRCdWZmZXJzKCk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6c2VuZE91dHB1dEJ1ZmZlcnMoKSB7CisgICAgUmVvcmRlclN0YXNoOjpFbnRyeSBlbnRyeTsKKyAgICBzcDxNZWRpYUNvZGVjQnVmZmVyPiBvdXRCdWZmZXI7CisgICAgc2l6ZV90IGluZGV4OworCisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgeworICAgICAgICAgICAgTXV0ZXhlZDxSZW9yZGVyU3Rhc2g+OjpMb2NrZWQgcmVvcmRlcihtUmVvcmRlclN0YXNoKTsKKyAgICAgICAgICAgIGlmICghcmVvcmRlci0+aGFzUGVuZGluZygpKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIXJlb3JkZXItPnBvcCgmZW50cnkpKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgTXV0ZXhlZDxzdGQ6OnVuaXF1ZV9wdHI8T3V0cHV0QnVmZmVycz4+OjpMb2NrZWQgYnVmZmVycyhtT3V0cHV0QnVmZmVycyk7CisgICAgICAgIHN0YXR1c190IGVyciA9ICgqYnVmZmVycyktPnJlZ2lzdGVyQnVmZmVyKGVudHJ5LmJ1ZmZlciwgJmluZGV4LCAmb3V0QnVmZmVyKTsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgaWYgKGVyciAhPSBXT1VMRF9CTE9DSykgeworICAgICAgICAgICAgICAgIE91dHB1dEJ1ZmZlcnNBcnJheSAqYXJyYXkgPSAoT3V0cHV0QnVmZmVyc0FycmF5ICopYnVmZmVycy0+Z2V0KCk7CisgICAgICAgICAgICAgICAgYXJyYXktPnJlYWxsb2MoZW50cnkuYnVmZmVyKTsKKyAgICAgICAgICAgICAgICBtQ0NvZGVjQ2FsbGJhY2stPm9uT3V0cHV0QnVmZmVyc0NoYW5nZWQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJ1ZmZlcnMudW5sb2NrKCk7CisgICAgICAgICAgICBBTE9HVigiWyVzXSBzZW5kT3V0cHV0QnVmZmVyczogdW5hYmxlIHRvIHJlZ2lzdGVyIG91dHB1dCBidWZmZXIiLCBtTmFtZSk7CisgICAgICAgICAgICBtUmVvcmRlclN0YXNoLmxvY2soKS0+ZGVmZXIoZW50cnkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGJ1ZmZlcnMudW5sb2NrKCk7CisKKyAgICAgICAgb3V0QnVmZmVyLT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCBlbnRyeS50aW1lc3RhbXApOworICAgICAgICBvdXRCdWZmZXItPm1ldGEoKS0+c2V0SW50MzIoImZsYWdzIiwgZW50cnkuZmxhZ3MpOworICAgICAgICBBTE9HVigiWyVzXSBzZW5kT3V0cHV0QnVmZmVyczogb3V0IGJ1ZmZlciBpbmRleCA9ICV6dSBbJXBdID0+ICVwICsgJXp1IiwKKyAgICAgICAgICAgICAgICBtTmFtZSwgaW5kZXgsIG91dEJ1ZmZlci5nZXQoKSwgb3V0QnVmZmVyLT5kYXRhKCksIG91dEJ1ZmZlci0+c2l6ZSgpKTsKKyAgICAgICAgbUNhbGxiYWNrLT5vbk91dHB1dEJ1ZmZlckF2YWlsYWJsZShpbmRleCwgb3V0QnVmZmVyKTsKKyAgICB9Cit9CisKK3N0YXR1c190IENDb2RlY0J1ZmZlckNoYW5uZWw6OnNldFN1cmZhY2UoY29uc3Qgc3A8U3VyZmFjZT4gJm5ld1N1cmZhY2UpIHsKKyAgICBzdGF0aWMgc3RkOjphdG9taWNfdWludDMyX3Qgc3VyZmFjZUdlbmVyYXRpb257MH07CisgICAgdWludDMyX3QgZ2VuZXJhdGlvbiA9IChnZXRwaWQoKSA8PCAxMCkgfAorICAgICAgICAgICAgKChzdXJmYWNlR2VuZXJhdGlvbi5mZXRjaF9hZGQoMSwgc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCkgKyAxKQorICAgICAgICAgICAgICAgICYgKCgxIDw8IDEwKSAtIDEpKTsKKworICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IHByb2R1Y2VyOworICAgIGlmIChuZXdTdXJmYWNlKSB7CisgICAgICAgIG5ld1N1cmZhY2UtPnNldFNjYWxpbmdNb2RlKE5BVElWRV9XSU5ET1dfU0NBTElOR19NT0RFX1NDQUxFX1RPX1dJTkRPVyk7CisgICAgICAgIG5ld1N1cmZhY2UtPnNldE1heERlcXVldWVkQnVmZmVyQ291bnQoa01pbk91dHB1dEJ1ZmZlckFycmF5U2l6ZSk7CisgICAgICAgIHByb2R1Y2VyID0gbmV3U3VyZmFjZS0+Z2V0SUdyYXBoaWNCdWZmZXJQcm9kdWNlcigpOworICAgICAgICBwcm9kdWNlci0+c2V0R2VuZXJhdGlvbk51bWJlcihnZW5lcmF0aW9uKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiWyVzXSBzZXR0aW5nIG91dHB1dCBzdXJmYWNlIHRvIG51bGwiLCBtTmFtZSk7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb25maWd1cmFibGU+IG91dHB1dFBvb2xJbnRmOworICAgIEMyQmxvY2tQb29sOjpsb2NhbF9pZF90IG91dHB1dFBvb2xJZDsKKyAgICB7CisgICAgICAgIE11dGV4ZWQ8QmxvY2tQb29scz46OkxvY2tlZCBwb29scyhtQmxvY2tQb29scyk7CisgICAgICAgIG91dHB1dFBvb2xJZCA9IHBvb2xzLT5vdXRwdXRQb29sSWQ7CisgICAgICAgIG91dHB1dFBvb2xJbnRmID0gcG9vbHMtPm91dHB1dFBvb2xJbnRmOworICAgIH0KKworICAgIGlmIChvdXRwdXRQb29sSW50ZikgeworICAgICAgICBpZiAobUNvbXBvbmVudC0+c2V0T3V0cHV0U3VyZmFjZSgKKyAgICAgICAgICAgICAgICBvdXRwdXRQb29sSWQsCisgICAgICAgICAgICAgICAgcHJvZHVjZXIsCisgICAgICAgICAgICAgICAgZ2VuZXJhdGlvbikgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIEFMT0dJKCJbJXNdIHNldFN1cmZhY2U6IGNvbXBvbmVudCBzZXRPdXRwdXRTdXJmYWNlIGZhaWxlZCIsIG1OYW1lKTsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxPdXRwdXRTdXJmYWNlPjo6TG9ja2VkIG91dHB1dChtT3V0cHV0U3VyZmFjZSk7CisgICAgICAgIG91dHB1dC0+c3VyZmFjZSA9IG5ld1N1cmZhY2U7CisgICAgICAgIG91dHB1dC0+Z2VuZXJhdGlvbiA9IGdlbmVyYXRpb247CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIENDb2RlY0J1ZmZlckNoYW5uZWw6OnNldE1ldGFNb2RlKE1ldGFNb2RlIG1vZGUpIHsKKyAgICBtTWV0YU1vZGUgPSBtb2RlOworfQorCitzdGF0dXNfdCB0b1N0YXR1c1QoYzJfc3RhdHVzX3QgYzJzLCBjMl9vcGVyYXRpb25fdCBjMm9wKSB7CisgICAgLy8gQzJfT0sgaXMgYWx3YXlzIHRyYW5zbGF0ZWQgdG8gT0suCisgICAgaWYgKGMycyA9PSBDMl9PSykgeworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgLy8gT3BlcmF0aW9uLWRlcGVuZGVudCB0cmFuc2xhdGlvbgorICAgIC8vIFRPRE86IEFkZCBhcyBuZWNlc3NhcnkKKyAgICBzd2l0Y2ggKGMyb3ApIHsKKyAgICBjYXNlIEMyX09QRVJBVElPTl9Db21wb25lbnRfc3RhcnQ6CisgICAgICAgIHN3aXRjaCAoYzJzKSB7CisgICAgICAgIGNhc2UgQzJfTk9fTUVNT1JZOgorICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLy8gQmFja3VwIG9wZXJhdGlvbi1hZ25vc3RpYyB0cmFuc2xhdGlvbgorICAgIHN3aXRjaCAoYzJzKSB7CisgICAgY2FzZSBDMl9CQURfSU5ERVg6CisgICAgICAgIHJldHVybiBCQURfSU5ERVg7CisgICAgY2FzZSBDMl9CQURfVkFMVUU6CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgY2FzZSBDMl9CTE9DS0lORzoKKyAgICAgICAgcmV0dXJuIFdPVUxEX0JMT0NLOworICAgIGNhc2UgQzJfRFVQTElDQVRFOgorICAgICAgICByZXR1cm4gQUxSRUFEWV9FWElTVFM7CisgICAgY2FzZSBDMl9OT19JTklUOgorICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICBjYXNlIEMyX05PX01FTU9SWToKKyAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICBjYXNlIEMyX05PVF9GT1VORDoKKyAgICAgICAgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOworICAgIGNhc2UgQzJfVElNRURfT1VUOgorICAgICAgICByZXR1cm4gVElNRURfT1VUOworICAgIGNhc2UgQzJfQkFEX1NUQVRFOgorICAgIGNhc2UgQzJfQ0FOQ0VMRUQ6CisgICAgY2FzZSBDMl9DQU5OT1RfRE86CisgICAgY2FzZSBDMl9DT1JSVVBURUQ6CisgICAgY2FzZSBDMl9PTUlUVEVEOgorICAgIGNhc2UgQzJfUkVGVVNFRDoKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIC1zdGF0aWNfY2FzdDxzdGF0dXNfdD4oYzJzKTsKKyAgICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjQnVmZmVyQ2hhbm5lbC5oIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlY0J1ZmZlckNoYW5uZWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzFiYWFhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlY0J1ZmZlckNoYW5uZWwuaApAQCAtMCwwICsxLDQxNyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE3LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQ0NPREVDX0JVRkZFUl9DSEFOTkVMX0hfCisKKyNkZWZpbmUgQ0NPREVDX0JVRkZFUl9DSEFOTkVMX0hfCisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPEMyQnVmZmVyLmg+CisjaW5jbHVkZSA8QzJDb21wb25lbnQuaD4KKyNpbmNsdWRlIDxDb2RlYzJNYXBwZXIuaD4KKworI2luY2x1ZGUgPGNvZGVjMi9oaWRsL2NsaWVudC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2JxaGVscGVyL0dyYXBoaWNCdWZmZXJTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9jb2RlYzIvMS4wL0lucHV0U3VyZmFjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTXV0ZXhlZC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0NvZGVjQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL0lDcnlwdG8uaD4KKworI2luY2x1ZGUgIklucHV0U3VyZmFjZVdyYXBwZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBDQ29kZWNDYWxsYmFjayB7CitwdWJsaWM6CisgICAgdmlydHVhbCB+Q0NvZGVjQ2FsbGJhY2soKSA9IGRlZmF1bHQ7CisgICAgdmlydHVhbCB2b2lkIG9uRXJyb3Ioc3RhdHVzX3QgZXJyLCBlbnVtIEFjdGlvbkNvZGUgYWN0aW9uQ29kZSkgPSAwOworICAgIHZpcnR1YWwgdm9pZCBvbk91dHB1dEZyYW1lc1JlbmRlcmVkKGludDY0X3QgbWVkaWFUaW1lVXMsIG5zZWNzX3QgcmVuZGVyVGltZU5zKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIG9uV29ya1F1ZXVlZChib29sIGVvcykgPSAwOworICAgIHZpcnR1YWwgdm9pZCBvbk91dHB1dEJ1ZmZlcnNDaGFuZ2VkKCkgPSAwOworfTsKKworLyoqCisgKiBCdWZmZXJDaGFubmVsQmFzZSBpbXBsZW1lbnRhdGlvbiBmb3IgQ0NvZGVjLgorICovCitjbGFzcyBDQ29kZWNCdWZmZXJDaGFubmVsCisgICAgOiBwdWJsaWMgQnVmZmVyQ2hhbm5lbEJhc2UsIHB1YmxpYyBzdGQ6OmVuYWJsZV9zaGFyZWRfZnJvbV90aGlzPENDb2RlY0J1ZmZlckNoYW5uZWw+IHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBDQ29kZWNCdWZmZXJDaGFubmVsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDQ29kZWNDYWxsYmFjaz4gJmNhbGxiYWNrKTsKKyAgICB2aXJ0dWFsIH5DQ29kZWNCdWZmZXJDaGFubmVsKCk7CisKKyAgICAvLyBCdWZmZXJDaGFubmVsQmFzZSBpbnRlcmZhY2UKKyAgICB2aXJ0dWFsIHN0YXR1c190IHF1ZXVlSW5wdXRCdWZmZXIoY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJmJ1ZmZlcikgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGF0dXNfdCBxdWV1ZVNlY3VyZUlucHV0QnVmZmVyKAorICAgICAgICAgICAgY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJmJ1ZmZlciwKKyAgICAgICAgICAgIGJvb2wgc2VjdXJlLAorICAgICAgICAgICAgY29uc3QgdWludDhfdCAqa2V5LAorICAgICAgICAgICAgY29uc3QgdWludDhfdCAqaXYsCisgICAgICAgICAgICBDcnlwdG9QbHVnaW46Ok1vZGUgbW9kZSwKKyAgICAgICAgICAgIENyeXB0b1BsdWdpbjo6UGF0dGVybiBwYXR0ZXJuLAorICAgICAgICAgICAgY29uc3QgQ3J5cHRvUGx1Z2luOjpTdWJTYW1wbGUgKnN1YlNhbXBsZXMsCisgICAgICAgICAgICBzaXplX3QgbnVtU3ViU2FtcGxlcywKKyAgICAgICAgICAgIEFTdHJpbmcgKmVycm9yRGV0YWlsTXNnKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbmRlck91dHB1dEJ1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+ICZidWZmZXIsIGludDY0X3QgdGltZXN0YW1wTnMpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZGlzY2FyZEJ1ZmZlcihjb25zdCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAmYnVmZmVyKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHZvaWQgZ2V0SW5wdXRCdWZmZXJBcnJheShWZWN0b3I8c3A8TWVkaWFDb2RlY0J1ZmZlcj4+ICphcnJheSkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCB2b2lkIGdldE91dHB1dEJ1ZmZlckFycmF5KFZlY3RvcjxzcDxNZWRpYUNvZGVjQnVmZmVyPj4gKmFycmF5KSBvdmVycmlkZTsKKworICAgIC8vIE1ldGhvZHMgYmVsb3cgYXJlIGludGVyZmFjZSBmb3IgQ0NvZGVjIHRvIHVzZS4KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgY29tcG9uZW50IG9iamVjdCBmb3IgYnVmZmVyIHByb2Nlc3NpbmcuCisgICAgICovCisgICAgdm9pZCBzZXRDb21wb25lbnQoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiAmY29tcG9uZW50KTsKKworICAgIC8qKgorICAgICAqIFNldCBvdXRwdXQgZ3JhcGhpYyBzdXJmYWNlIGZvciByZW5kZXJpbmcuCisgICAgICovCisgICAgc3RhdHVzX3Qgc2V0U3VyZmFjZShjb25zdCBzcDxTdXJmYWNlPiAmc3VyZmFjZSk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgR3JhcGhpY0J1ZmZlclNvdXJjZSBvYmplY3QgZnJvbSB3aGljaCB0aGUgY29tcG9uZW50IGV4dHJhY3RzIGlucHV0CisgICAgICogYnVmZmVycy4KKyAgICAgKi8KKyAgICBzdGF0dXNfdCBzZXRJbnB1dFN1cmZhY2UoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElucHV0U3VyZmFjZVdyYXBwZXI+ICZzdXJmYWNlKTsKKworICAgIC8qKgorICAgICAqIFNpZ25hbCBFT1MgdG8gaW5wdXQgc3VyZmFjZS4KKyAgICAgKi8KKyAgICBzdGF0dXNfdCBzaWduYWxFbmRPZklucHV0U3RyZWFtKCk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgcGFyYW1ldGVycy4KKyAgICAgKi8KKyAgICBzdGF0dXNfdCBzZXRQYXJhbWV0ZXJzKHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gJnBhcmFtcyk7CisKKyAgICAvKioKKyAgICAgKiBTdGFydCBxdWV1ZWluZyBidWZmZXJzIHRvIHRoZSBjb21wb25lbnQuIFRoaXMgb2JqZWN0IHNob3VsZCBuZXZlciBxdWV1ZQorICAgICAqIGJ1ZmZlcnMgYmVmb3JlIHRoaXMgY2FsbCBoYXMgY29tcGxldGVkLgorICAgICAqLworICAgIHN0YXR1c190IHN0YXJ0KGNvbnN0IHNwPEFNZXNzYWdlPiAmaW5wdXRGb3JtYXQsIGNvbnN0IHNwPEFNZXNzYWdlPiAmb3V0cHV0Rm9ybWF0KTsKKworICAgIC8qKgorICAgICAqIFJlcXVlc3QgaW5pdGlhbCBpbnB1dCBidWZmZXJzIHRvIGJlIGZpbGxlZCBieSBjbGllbnQuCisgICAgICovCisgICAgc3RhdHVzX3QgcmVxdWVzdEluaXRpYWxJbnB1dEJ1ZmZlcnMoKTsKKworICAgIC8qKgorICAgICAqIFN0b3AgcXVldWVpbmcgYnVmZmVycyB0byB0aGUgY29tcG9uZW50LiBUaGlzIG9iamVjdCBzaG91bGQgbmV2ZXIgcXVldWUKKyAgICAgKiBidWZmZXJzIGFmdGVyIHRoaXMgY2FsbCwgdW50aWwgc3RhcnQoKSBpcyBjYWxsZWQuCisgICAgICovCisgICAgdm9pZCBzdG9wKCk7CisKKyAgICB2b2lkIGZsdXNoKGNvbnN0IHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gJmZsdXNoZWRXb3JrKTsKKworICAgIC8qKgorICAgICAqIE5vdGlmeSBpbnB1dCBjbGllbnQgYWJvdXQgd29yayBkb25lLgorICAgICAqCisgICAgICogQHBhcmFtIHdvcmtJdGVtcyAgIGZpbmlzaGVkIHdvcmsgaXRlbS4KKyAgICAgKiBAcGFyYW0gb3V0cHV0Rm9ybWF0IG5ldyBvdXRwdXQgZm9ybWF0IGlmIGl0IGhhcyBjaGFuZ2VkLCBvdGhlcndpc2UgbnVsbHB0cgorICAgICAqIEBwYXJhbSBpbml0RGF0YSAgICBuZXcgaW5pdCBkYXRhIChDU0QpIGlmIGl0IGhhcyBjaGFuZ2VkLCBvdGhlcndpc2UgbnVsbHB0cgorICAgICAqIEBwYXJhbSBudW1EaXNjYXJkZWRJbnB1dEJ1ZmZlcnMgdGhlIG51bWJlciBvZiBpbnB1dCBidWZmZXJzIHRoYXQgYXJlCisgICAgICogICAgICAgICAgICAgICAgICAgIHJldHVybmVkIGZvciB0aGUgZmlyc3QgdGltZSAobm90IHByZXZpb3VzbHkgcmV0dXJuZWQgYnkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgb25JbnB1dEJ1ZmZlckRvbmUoKSkuCisgICAgICovCisgICAgdm9pZCBvbldvcmtEb25lKAorICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gd29yaywgY29uc3Qgc3A8QU1lc3NhZ2U+ICZvdXRwdXRGb3JtYXQsCisgICAgICAgICAgICBjb25zdCBDMlN0cmVhbUluaXREYXRhSW5mbzo6b3V0cHV0ICppbml0RGF0YSwKKyAgICAgICAgICAgIHNpemVfdCBudW1EaXNjYXJkZWRJbnB1dEJ1ZmZlcnMpOworCisgICAgLyoqCisgICAgICogTWFrZSBhbiBpbnB1dCBidWZmZXIgYXZhaWxhYmxlIGZvciB0aGUgY2xpZW50IGFzIGl0IGlzIG5vIGxvbmdlciBuZWVkZWQKKyAgICAgKiBieSB0aGUgY29kZWMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYnVmZmVyIFRoZSBidWZmZXIgdGhhdCBiZWNvbWVzIHVudXNlZC4KKyAgICAgKi8KKyAgICB2b2lkIG9uSW5wdXRCdWZmZXJEb25lKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4mIGJ1ZmZlcik7CisKKyAgICBlbnVtIE1ldGFNb2RlIHsKKyAgICAgICAgTU9ERV9OT05FLAorICAgICAgICBNT0RFX0FOVywKKyAgICB9OworCisgICAgdm9pZCBzZXRNZXRhTW9kZShNZXRhTW9kZSBtb2RlKTsKKworICAgIC8vIEludGVybmFsIGNsYXNzZXMKKyAgICBjbGFzcyBCdWZmZXJzOworICAgIGNsYXNzIElucHV0QnVmZmVyczsKKyAgICBjbGFzcyBPdXRwdXRCdWZmZXJzOworCitwcml2YXRlOgorICAgIGNsYXNzIFF1ZXVlR3VhcmQ7CisKKyAgICAvKioKKyAgICAgKiBTcGVjaWFsIG11dGV4LWxpa2Ugb2JqZWN0IHdpdGggdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOgorICAgICAqCisgICAgICogLSBBdCBTVE9QUEVEIHN0YXRlIChpbml0aWFsLCBvciBhZnRlciBzdG9wKCkpCisgICAgICogICAtIFF1ZXVlR3VhcmQgb2JqZWN0IGdldHMgY3JlYXRlZCBhdCBTVE9QUEVEIHN0YXRlLCBhbmQgdGhlIGNsaWVudCBpcworICAgICAqICAgICBzdXBwb3NlZCB0byByZXR1cm4gaW1tZWRpYXRlbHkuCisgICAgICogLSBBdCBSVU5OSU5HIHN0YXRlIChhZnRlciBzdGFydCgpKQorICAgICAqICAgLSBFYWNoIFF1ZXVlR3VhcmQgb2JqZWN0CisgICAgICovCisgICAgY2xhc3MgUXVldWVTeW5jIHsKKyAgICBwdWJsaWM6CisgICAgICAgIC8qKgorICAgICAgICAgKiBBdCBjb25zdHJ1Y3Rpb24gdGhlIHN5bmMgb2JqZWN0IGlzIGluIFNUT1BQRUQgc3RhdGUuCisgICAgICAgICAqLworICAgICAgICBpbmxpbmUgUXVldWVTeW5jKCkge30KKyAgICAgICAgflF1ZXVlU3luYygpID0gZGVmYXVsdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogVHJhbnNpdGlvbiB0byBSVU5OSU5HIHN0YXRlIHdoZW4gc3RvcHBlZC4gTm8tb3AgaWYgYWxyZWFkeSBpbiBSVU5OSU5HCisgICAgICAgICAqIHN0YXRlLgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBzdGFydCgpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBBdCBSVU5OSU5HIHN0YXRlLCB3YWl0IHVudGlsIGFsbCBRdWV1ZUd1YXJkIG9iamVjdCBjcmVhdGVkIGR1cmluZworICAgICAgICAgKiBSVU5OSU5HIHN0YXRlIGFyZSBkZXN0cm95ZWQsIGFuZCB0aGVuIHRyYW5zaXRpb24gdG8gU1RPUFBFRCBzdGF0ZS4KKyAgICAgICAgICogTm8tb3AgaWYgYWxyZWFkeSBpbiBTVE9QUEVEIHN0YXRlLgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBzdG9wKCk7CisKKyAgICBwcml2YXRlOgorICAgICAgICBNdXRleCBtR3VhcmRMb2NrOworCisgICAgICAgIHN0cnVjdCBDb3VudGVyIHsKKyAgICAgICAgICAgIGlubGluZSBDb3VudGVyKCkgOiB2YWx1ZSgtMSkge30KKyAgICAgICAgICAgIGludDMyX3QgdmFsdWU7CisgICAgICAgICAgICBDb25kaXRpb24gY29uZDsKKyAgICAgICAgfTsKKyAgICAgICAgTXV0ZXhlZDxDb3VudGVyPiBtQ291bnQ7CisKKyAgICAgICAgZnJpZW5kIGNsYXNzIENDb2RlY0J1ZmZlckNoYW5uZWw6OlF1ZXVlR3VhcmQ7CisgICAgfTsKKworICAgIGNsYXNzIFF1ZXVlR3VhcmQgeworICAgIHB1YmxpYzoKKyAgICAgICAgUXVldWVHdWFyZChRdWV1ZVN5bmMgJnN5bmMpOworICAgICAgICB+UXVldWVHdWFyZCgpOworICAgICAgICBpbmxpbmUgYm9vbCBpc1J1bm5pbmcoKSB7IHJldHVybiBtUnVubmluZzsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgUXVldWVTeW5jICZtU3luYzsKKyAgICAgICAgYm9vbCBtUnVubmluZzsKKyAgICB9OworCisgICAgdm9pZCBmZWVkSW5wdXRCdWZmZXJJZkF2YWlsYWJsZSgpOworICAgIHZvaWQgZmVlZElucHV0QnVmZmVySWZBdmFpbGFibGVJbnRlcm5hbCgpOworICAgIHN0YXR1c190IHF1ZXVlSW5wdXRCdWZmZXJJbnRlcm5hbChjb25zdCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAmYnVmZmVyKTsKKyAgICBib29sIGhhbmRsZVdvcmsoCisgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB3b3JrLCBjb25zdCBzcDxBTWVzc2FnZT4gJm91dHB1dEZvcm1hdCwKKyAgICAgICAgICAgIGNvbnN0IEMyU3RyZWFtSW5pdERhdGFJbmZvOjpvdXRwdXQgKmluaXREYXRhKTsKKyAgICB2b2lkIHNlbmRPdXRwdXRCdWZmZXJzKCk7CisKKyAgICBRdWV1ZVN5bmMgbVN5bmM7CisgICAgc3A8TWVtb3J5RGVhbGVyPiBtRGVhbGVyOworICAgIHNwPElNZW1vcnk+IG1EZWNyeXB0RGVzdGluYXRpb247CisgICAgaW50MzJfdCBtSGVhcFNlcU51bTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gbUNvbXBvbmVudDsKKyAgICBzdGQ6OnN0cmluZyBtQ29tcG9uZW50TmFtZTsgLy8vPCBjb21wb25lbnQgbmFtZSBmb3IgZGVidWdnaW5nCisgICAgY29uc3QgY2hhciAqbU5hbWU7IC8vLzwgQy1zdHJpbmcgdmVyc2lvbiBvZiBjb21wb25lbnQgbmFtZQorICAgIHN0ZDo6c2hhcmVkX3B0cjxDQ29kZWNDYWxsYmFjaz4gbUNDb2RlY0NhbGxiYWNrOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gbUlucHV0QWxsb2NhdG9yOworICAgIFF1ZXVlU3luYyBtUXVldWVTeW5jOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gbVBhcmFtc1RvQmVTZXQ7CisKKyAgICBNdXRleGVkPHN0ZDo6dW5pcXVlX3B0cjxJbnB1dEJ1ZmZlcnM+PiBtSW5wdXRCdWZmZXJzOworICAgIE11dGV4ZWQ8c3RkOjpsaXN0PHNwPEFCdWZmZXI+Pj4gbUZsdXNoZWRDb25maWdzOworICAgIE11dGV4ZWQ8c3RkOjp1bmlxdWVfcHRyPE91dHB1dEJ1ZmZlcnM+PiBtT3V0cHV0QnVmZmVyczsKKworICAgIHN0ZDo6YXRvbWljX3VpbnQ2NF90IG1GcmFtZUluZGV4OworICAgIHN0ZDo6YXRvbWljX3VpbnQ2NF90IG1GaXJzdFZhbGlkRnJhbWVJbmRleDsKKworICAgIHNwPE1lbW9yeURlYWxlcj4gbWFrZU1lbW9yeURlYWxlcihzaXplX3QgaGVhcFNpemUpOworCisgICAgc3RydWN0IE91dHB1dFN1cmZhY2UgeworICAgICAgICBzcDxTdXJmYWNlPiBzdXJmYWNlOworICAgICAgICB1aW50MzJfdCBnZW5lcmF0aW9uOworICAgIH07CisgICAgTXV0ZXhlZDxPdXRwdXRTdXJmYWNlPiBtT3V0cHV0U3VyZmFjZTsKKworICAgIHN0cnVjdCBCbG9ja1Bvb2xzIHsKKyAgICAgICAgQzJBbGxvY2F0b3I6OmlkX3QgaW5wdXRBbGxvY2F0b3JJZDsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiBpbnB1dFBvb2w7CisgICAgICAgIEMyQWxsb2NhdG9yOjppZF90IG91dHB1dEFsbG9jYXRvcklkOworICAgICAgICBDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCBvdXRwdXRQb29sSWQ7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbmZpZ3VyYWJsZT4gb3V0cHV0UG9vbEludGY7CisgICAgfTsKKyAgICBNdXRleGVkPEJsb2NrUG9vbHM+IG1CbG9ja1Bvb2xzOworCisgICAgc3RkOjpzaGFyZWRfcHRyPElucHV0U3VyZmFjZVdyYXBwZXI+IG1JbnB1dFN1cmZhY2U7CisKKyAgICBNZXRhTW9kZSBtTWV0YU1vZGU7CisKKyAgICAvLyBQaXBlbGluZUNhcGFjaXR5IGlzIHVzZWQgaW4gdGhlIGlucHV0IGJ1ZmZlciBnYXRpbmcgbG9naWMuCisgICAgLy8KKyAgICAvLyBUaGVyZSBhcmUgdGhyZWUgY3JpdGVyaWEgdGhhdCBuZWVkIHRvIGJlIG1ldCBiZWZvcmUKKyAgICAvLyBvbklucHV0QnVmZmVyQXZhaWxhYmxlKCkgaXMgY2FsbGVkOgorICAgIC8vIDEuIFRoZSBudW1iZXIgb2YgaW5wdXQgYnVmZmVycyB0aGF0IGhhdmUgYmVlbiByZWNlaXZlZCBieQorICAgIC8vICAgIENDb2RlY0J1ZmZlckNoYW5uZWwgYnV0IG5vdCByZXR1cm5lZCB2aWEgb25Xb3JrRG9uZSgpIG9yCisgICAgLy8gICAgb25JbnB1dEJ1ZmZlckRvbmUoKSBkb2VzIG5vdCBleGNlZWQgYSBjZXJ0YWluIGxpbWl0LiAoTGV0IHVzIGNhbGwgdGhpcworICAgIC8vICAgIG51bWJlciB0aGUgImlucHV0IiBjYXBhY2l0eS4pCisgICAgLy8gMi4gVGhlIG51bWJlciBvZiB3b3JrIGl0ZW1zIHRoYXQgaGF2ZSBiZWVuIHJlY2VpdmVkIGJ5CisgICAgLy8gICAgQ0NvZGVjQnVmZmVyQ2hhbm5lbCB3aG9zZSBvdXRwdXRzIGhhdmUgbm90IGJlZW4gcmV0dXJuZWQgZnJvbSB0aGUKKyAgICAvLyAgICBjb21wb25lbnQgKGJ5IGNhbGxpbmcgb25Xb3JrRG9uZSgpKSBkb2VzIG5vdCBleGNlZWQgYSBjZXJ0YWluIGxpbWl0LgorICAgIC8vICAgIChMZXQgdXMgY2FsbCB0aGlzIHRoZSAiY29tcG9uZW50IiBjYXBhY2l0eS4pCisgICAgLy8KKyAgICAvLyBUaGVzZSB0aHJlZSBjcml0ZXJpYSBndWFyYW50ZWUgdGhhdCBhIG5ldyBpbnB1dCBidWZmZXIgdGhhdCBhcnJpdmVzIGZyb20KKyAgICAvLyB0aGUgaW52b2NhdGlvbiBvZiBvbklucHV0QnVmZmVyQXZhaWxhYmxlKCkgd2lsbCBub3QKKyAgICAvLyAxLiBvdmVybG9hZCBDQ29kZWNCdWZmZXJDaGFubmVsJ3MgaW5wdXQgYnVmZmVyczsKKyAgICAvLyAyLiBvdmVybG9hZCB0aGUgY29tcG9uZW50OyBvcgorICAgIC8vCisgICAgc3RydWN0IFBpcGVsaW5lQ2FwYWNpdHkgeworICAgICAgICAvLyBUaGUgbnVtYmVyIG9mIGF2YWlsYWJsZSBpbnB1dCBjYXBhY2l0eS4KKyAgICAgICAgc3RkOjphdG9taWNfaW50IGlucHV0OworICAgICAgICAvLyBUaGUgbnVtYmVyIG9mIGF2YWlsYWJsZSBjb21wb25lbnQgY2FwYWNpdHkuCisgICAgICAgIHN0ZDo6YXRvbWljX2ludCBjb21wb25lbnQ7CisKKyAgICAgICAgUGlwZWxpbmVDYXBhY2l0eSgpOworICAgICAgICAvLyBTZXQgdGhlIHZhbHVlcyBvZiAjaW5wdXQgYW5kICNjb21wb25lbnQuCisgICAgICAgIHZvaWQgaW5pdGlhbGl6ZShpbnQgbmV3SW5wdXQsIGludCBuZXdDb21wb25lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBuZXdOYW1lID0gIjxVTktOT1dOIENPTVBPTkVOVD4iLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogY2FsbGVyVGFnID0gbnVsbHB0cik7CisKKyAgICAgICAgLy8gUmV0dXJuIHRydWUgYW5kIGRlY3JlYXNlICNpbnB1dCBhbmQgI2NvbXBvbmVudCBieSBvbmUgaWYKKyAgICAgICAgLy8gdGhleSBhcmUgYWxsIGdyZWF0ZXIgdGhhbiB6ZXJvOyByZXR1cm4gZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAgICAvLworICAgICAgICAvLyBjYWxsZXJUYWcgaXMgdXNlZCBmb3IgbG9nZ2luZyBvbmx5LgorICAgICAgICAvLworICAgICAgICAvLyBhbGxvY2F0ZSgpIGlzIGNhbGxlZCBieSBDQ29kZWNCdWZmZXJDaGFubmVsIHRvIGNoZWNrIHdoZXRoZXIgaXQgY2FuCisgICAgICAgIC8vIHJlY2VpdmUgYW5vdGhlciBpbnB1dCBidWZmZXIuIElmIHRoZSByZXR1cm4gdmFsdWUgaXMgdHJ1ZSwKKyAgICAgICAgLy8gb25JbnB1dEJ1ZmZlckF2YWlsYWJsZSgpIGFuZCBvbk91dHB1dEJ1ZmZlckF2YWlsYWJsZSgpIGNhbiBiZSBjYWxsZWQKKyAgICAgICAgLy8gYWZ0ZXJ3YXJkcy4KKyAgICAgICAgYm9vbCBhbGxvY2F0ZShjb25zdCBjaGFyKiBjYWxsZXJUYWcgPSBudWxscHRyKTsKKworICAgICAgICAvLyBJbmNyZWFzZSAjaW5wdXQgYW5kICNjb21wb25lbnQgYnkgb25lLgorICAgICAgICAvLworICAgICAgICAvLyBjYWxsZXJUYWcgaXMgdXNlZCBmb3IgbG9nZ2luZyBvbmx5LgorICAgICAgICAvLworICAgICAgICAvLyBmcmVlKCkgaXMgY2FsbGVkIGJ5IENDb2RlY0J1ZmZlckNoYW5uZWwgYWZ0ZXIgYWxsb2NhdGUoKSByZXR1cm5zIHRydWUKKyAgICAgICAgLy8gYnV0IG9uSW5wdXRCdWZmZXJBdmFpbGFibGUoKSBjYW5ub3QgYmUgY2FsbGVkIGZvciBhbnkgcmVhc29ucy4gSXQKKyAgICAgICAgLy8gZXNzZW50aWFsbHkgdW5kb2VzIGFuIGFsbG9jYXRlKCkgY2FsbC4KKyAgICAgICAgdm9pZCBmcmVlKGNvbnN0IGNoYXIqIGNhbGxlclRhZyA9IG51bGxwdHIpOworCisgICAgICAgIC8vIEluY3JlYXNlICNpbnB1dCBieSBAcCBudW1EaXNjYXJkZWRJbnB1dEJ1ZmZlcnMuCisgICAgICAgIC8vCisgICAgICAgIC8vIGNhbGxlclRhZyBpcyB1c2VkIGZvciBsb2dnaW5nIG9ubHkuCisgICAgICAgIC8vCisgICAgICAgIC8vIGZyZWVJbnB1dFNsb3RzKCkgaXMgY2FsbGVkIGJ5IENDb2RlY0J1ZmZlckNoYW5uZWwgd2hlbiBvbldvcmtEb25lKCkKKyAgICAgICAgLy8gb3Igb25JbnB1dEJ1ZmZlckRvbmUoKSBpcyBjYWxsZWQuIEBwIG51bURpc2NhcmRlZElucHV0QnVmZmVycyBpcworICAgICAgICAvLyBwcm92aWRlZCBpbiBvbldvcmtEb25lKCksIGFuZCBpcyAxIGluIG9uSW5wdXRCdWZmZXJEb25lKCkuCisgICAgICAgIGludCBmcmVlSW5wdXRTbG90cyhzaXplX3QgbnVtRGlzY2FyZGVkSW5wdXRCdWZmZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogY2FsbGVyVGFnID0gbnVsbHB0cik7CisKKyAgICAgICAgLy8gSW5jcmVhc2UgI2NvbXBvbmVudCBieSBvbmUgYW5kIHJldHVybiB0aGUgdXBkYXRlZCB2YWx1ZS4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gY2FsbGVyVGFnIGlzIHVzZWQgZm9yIGxvZ2dpbmcgb25seS4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gZnJlZUNvbXBvbmVudFNsb3QoKSBpcyBjYWxsZWQgYnkgQ0NvZGVjQnVmZmVyQ2hhbm5lbCB3aGVuCisgICAgICAgIC8vIG9uV29ya0RvbmUoKSBpcyBjYWxsZWQuCisgICAgICAgIGludCBmcmVlQ29tcG9uZW50U2xvdChjb25zdCBjaGFyKiBjYWxsZXJUYWcgPSBudWxscHRyKTsKKworICAgIHByaXZhdGU6CisgICAgICAgIC8vIENvbXBvbmVudCBuYW1lLiBVc2VkIGZvciBsb2dnaW5nLgorICAgICAgICBjb25zdCBjaGFyKiBtTmFtZTsKKyAgICB9OworICAgIFBpcGVsaW5lQ2FwYWNpdHkgbUF2YWlsYWJsZVBpcGVsaW5lQ2FwYWNpdHk7CisKKyAgICBjbGFzcyBSZW9yZGVyU3Rhc2ggeworICAgIHB1YmxpYzoKKyAgICAgICAgc3RydWN0IEVudHJ5IHsKKyAgICAgICAgICAgIGlubGluZSBFbnRyeSgpIDogYnVmZmVyKG51bGxwdHIpLCB0aW1lc3RhbXAoMCksIGZsYWdzKDApLCBvcmRpbmFsKHswLCAwLCAwfSkge30KKyAgICAgICAgICAgIGlubGluZSBFbnRyeSgKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYiwKKyAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0LAorICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGYsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyV29ya09yZGluYWxTdHJ1Y3QgJm8pCisgICAgICAgICAgICAgICAgOiBidWZmZXIoYiksIHRpbWVzdGFtcCh0KSwgZmxhZ3MoZiksIG9yZGluYWwobykge30KKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYnVmZmVyOworICAgICAgICAgICAgaW50NjRfdCB0aW1lc3RhbXA7CisgICAgICAgICAgICBpbnQzMl90IGZsYWdzOworICAgICAgICAgICAgQzJXb3JrT3JkaW5hbFN0cnVjdCBvcmRpbmFsOworICAgICAgICB9OworCisgICAgICAgIFJlb3JkZXJTdGFzaCgpOworCisgICAgICAgIHZvaWQgY2xlYXIoKTsKKyAgICAgICAgdm9pZCBzZXREZXB0aCh1aW50MzJfdCBkZXB0aCk7CisgICAgICAgIHZvaWQgc2V0S2V5KEMyQ29uZmlnOjpvcmRpbmFsX2tleV90IGtleSk7CisgICAgICAgIGJvb2wgcG9wKEVudHJ5ICplbnRyeSk7CisgICAgICAgIHZvaWQgZW1wbGFjZSgKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIsCisgICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lc3RhbXAsCisgICAgICAgICAgICAgICAgaW50MzJfdCBmbGFncywKKyAgICAgICAgICAgICAgICBjb25zdCBDMldvcmtPcmRpbmFsU3RydWN0ICZvcmRpbmFsKTsKKyAgICAgICAgdm9pZCBkZWZlcihjb25zdCBFbnRyeSAmZW50cnkpOworICAgICAgICBib29sIGhhc1BlbmRpbmcoKSBjb25zdDsKKworICAgIHByaXZhdGU6CisgICAgICAgIHN0ZDo6bGlzdDxFbnRyeT4gbVBlbmRpbmc7CisgICAgICAgIHN0ZDo6bGlzdDxFbnRyeT4gbVN0YXNoOworICAgICAgICB1aW50MzJfdCBtRGVwdGg7CisgICAgICAgIEMyQ29uZmlnOjpvcmRpbmFsX2tleV90IG1LZXk7CisKKyAgICAgICAgYm9vbCBsZXNzKGNvbnN0IEMyV29ya09yZGluYWxTdHJ1Y3QgJm8xLCBjb25zdCBDMldvcmtPcmRpbmFsU3RydWN0ICZvMik7CisgICAgfTsKKyAgICBNdXRleGVkPFJlb3JkZXJTdGFzaD4gbVJlb3JkZXJTdGFzaDsKKworICAgIHN0ZDo6YXRvbWljX2Jvb2wgbUlucHV0TWV0RW9zOworCisgICAgaW5saW5lIGJvb2wgaGFzQ3J5cHRvT3JEZXNjcmFtYmxlcigpIHsKKyAgICAgICAgcmV0dXJuIG1DcnlwdG8gIT0gbnVsbHB0ciB8fCBtRGVzY3JhbWJsZXIgIT0gbnVsbHB0cjsKKyAgICB9Cit9OworCisvLyBDb252ZXJzaW9uIG9mIGEgYzJfc3RhdHVzX3QgdmFsdWUgdG8gYSBzdGF0dXNfdCB2YWx1ZSBtYXkgZGVwZW5kIG9uIHRoZQorLy8gb3BlcmF0aW9uIHRoYXQgcmV0dXJucyB0aGUgYzJfc3RhdHVzX3QgdmFsdWUuCitlbnVtIGMyX29wZXJhdGlvbl90IHsKKyAgICBDMl9PUEVSQVRJT05fTk9ORSwKKyAgICBDMl9PUEVSQVRJT05fQ29tcG9uZW50X2Nvbm5lY3RUb09teElucHV0U3VyZmFjZSwKKyAgICBDMl9PUEVSQVRJT05fQ29tcG9uZW50X2NyZWF0ZUJsb2NrUG9vbCwKKyAgICBDMl9PUEVSQVRJT05fQ29tcG9uZW50X2Rlc3Ryb3lCbG9ja1Bvb2wsCisgICAgQzJfT1BFUkFUSU9OX0NvbXBvbmVudF9kaXNjb25uZWN0RnJvbUlucHV0U3VyZmFjZSwKKyAgICBDMl9PUEVSQVRJT05fQ29tcG9uZW50X2RyYWluLAorICAgIEMyX09QRVJBVElPTl9Db21wb25lbnRfZmx1c2gsCisgICAgQzJfT1BFUkFUSU9OX0NvbXBvbmVudF9xdWV1ZSwKKyAgICBDMl9PUEVSQVRJT05fQ29tcG9uZW50X3JlbGVhc2UsCisgICAgQzJfT1BFUkFUSU9OX0NvbXBvbmVudF9yZXNldCwKKyAgICBDMl9PUEVSQVRJT05fQ29tcG9uZW50X3NldE91dHB1dFN1cmZhY2UsCisgICAgQzJfT1BFUkFUSU9OX0NvbXBvbmVudF9zdGFydCwKKyAgICBDMl9PUEVSQVRJT05fQ29tcG9uZW50X3N0b3AsCisgICAgQzJfT1BFUkFUSU9OX0NvbXBvbmVudFN0b3JlX2NvcHlCdWZmZXIsCisgICAgQzJfT1BFUkFUSU9OX0NvbXBvbmVudFN0b3JlX2NyZWF0ZUNvbXBvbmVudCwKKyAgICBDMl9PUEVSQVRJT05fQ29tcG9uZW50U3RvcmVfY3JlYXRlSW5wdXRTdXJmYWNlLAorICAgIEMyX09QRVJBVElPTl9Db21wb25lbnRTdG9yZV9jcmVhdGVJbnRlcmZhY2UsCisgICAgQzJfT1BFUkFUSU9OX0NvbmZpZ3VyYWJsZV9jb25maWcsCisgICAgQzJfT1BFUkFUSU9OX0NvbmZpZ3VyYWJsZV9xdWVyeSwKKyAgICBDMl9PUEVSQVRJT05fQ29uZmlndXJhYmxlX3F1ZXJ5U3VwcG9ydGVkUGFyYW1zLAorICAgIEMyX09QRVJBVElPTl9Db25maWd1cmFibGVfcXVlcnlTdXBwb3J0ZWRWYWx1ZXMsCisgICAgQzJfT1BFUkFUSU9OX0lucHV0U3VyZmFjZV9jb25uZWN0VG9Db21wb25lbnQsCisgICAgQzJfT1BFUkFUSU9OX0lucHV0U3VyZmFjZUNvbm5lY3Rpb25fZGlzY29ubmVjdCwKK307CisKK3N0YXR1c190IHRvU3RhdHVzVChjMl9zdGF0dXNfdCBjMnMsIGMyX29wZXJhdGlvbl90IGMyb3AgPSBDMl9PUEVSQVRJT05fTk9ORSk7CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQ0NPREVDX0JVRkZFUl9DSEFOTkVMX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjQ29uZmlnLmNwcCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWNDb25maWcuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkYmZkMGUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjQ29uZmlnLmNwcApAQCAtMCwwICsxLDE1ODggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNDb2RlY0NvbmZpZyIKKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8QzJEZWJ1Zy5oPgorI2luY2x1ZGUgPEMyUGFyYW0uaD4KKyNpbmNsdWRlIDx1dGlsL0MySW50ZXJmYWNlSGVscGVyLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjQ29uc3RhbnRzLmg+CisKKyNpbmNsdWRlICJDQ29kZWNDb25maWcuaCIKKyNpbmNsdWRlICJDb2RlYzJNYXBwZXIuaCIKKworI2RlZmluZSBEUkNfREVGQVVMVF9NT0JJTEVfUkVGX0xFVkVMIDY0ICAvKiA2NCotMC4yNWRCID0gLTE2IGRCIGJlbG93IGZ1bGwgc2NhbGUgZm9yIG1vYmlsZSBjb25mICovCisjZGVmaW5lIERSQ19ERUZBVUxUX01PQklMRV9EUkNfQ1VUICAgMTI3IC8qIG1heGltdW0gY29tcHJlc3Npb24gb2YgZHluYW1pYyByYW5nZSBmb3IgbW9iaWxlIGNvbmYgKi8KKyNkZWZpbmUgRFJDX0RFRkFVTFRfTU9CSUxFX0RSQ19CT09TVCAxMjcgLyogbWF4aW11bSBjb21wcmVzc2lvbiBvZiBkeW5hbWljIHJhbmdlIGZvciBtb2JpbGUgY29uZiAqLworI2RlZmluZSBEUkNfREVGQVVMVF9NT0JJTEVfRFJDX0hFQVZZIDEgICAvKiBzd2l0Y2ggZm9yIGhlYXZ5IGNvbXByZXNzaW9uIGZvciBtb2JpbGUgY29uZiAqLworI2RlZmluZSBEUkNfREVGQVVMVF9NT0JJTEVfRFJDX0VGRkVDVCAzICAvKiBNUEVHLUQgRFJDIGVmZmVjdCB0eXBlOyAzID0+IExpbWl0ZWQgcGxheWJhY2sgcmFuZ2UgKi8KKyNkZWZpbmUgRFJDX0RFRkFVTFRfTU9CSUxFX0VOQ19MRVZFTCAoLTEpIC8qIGVuY29kZXIgdGFyZ2V0IGxldmVsOyAtMSA9PiB0aGUgdmFsdWUgaXMgdW5rbm93biwgb3RoZXJ3aXNlIGRCIHN0ZXAgdmFsdWUgKGUuZy4gNjQgZm9yIC0xNiBkQikgKi8KKy8vIG5hbWVzIG9mIHByb3BlcnRpZXMgdGhhdCBjYW4gYmUgdXNlZCB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBEUkMgc2V0dGluZ3MKKyNkZWZpbmUgUFJPUF9EUkNfT1ZFUlJJREVfUkVGX0xFVkVMICAiYWFjX2RyY19yZWZlcmVuY2VfbGV2ZWwiCisjZGVmaW5lIFBST1BfRFJDX09WRVJSSURFX0NVVCAgICAgICAgImFhY19kcmNfY3V0IgorI2RlZmluZSBQUk9QX0RSQ19PVkVSUklERV9CT09TVCAgICAgICJhYWNfZHJjX2Jvb3N0IgorI2RlZmluZSBQUk9QX0RSQ19PVkVSUklERV9IRUFWWSAgICAgICJhYWNfZHJjX2hlYXZ5IgorI2RlZmluZSBQUk9QX0RSQ19PVkVSUklERV9FTkNfTEVWRUwgICJhYWNfZHJjX2VuY190YXJnZXRfbGV2ZWwiCisjZGVmaW5lIFBST1BfRFJDX09WRVJSSURFX0VGRkVDVCAgICAgInJvLmFhY19kcmNfZWZmZWN0X3R5cGUiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gQ0NvZGVjQ29uZmlnCisKK25hbWVzcGFjZSB7CisKKy8qKgorICogbWFwcGluZyBiZXR3ZWVuIFNESyBhbmQgQ29kZWMgMi4wIGNvbmZpZ3VyYXRpb25zLgorICovCitzdHJ1Y3QgQ29uZmlnTWFwcGVyIHsKKyAgICAvKioKKyAgICAgKiBWYWx1ZSBtYXBwZXIgKEMyVmFsdWUgPT4gQzJWYWx1ZSkKKyAgICAgKi8KKyAgICB0eXBlZGVmIHN0ZDo6ZnVuY3Rpb248QzJWYWx1ZShDMlZhbHVlKT4gTWFwcGVyOworCisgICAgLy8vIHNob3J0aGFuZAorICAgIHR5cGVkZWYgQ0NvZGVjQ29uZmlnOjpEb21haW4gRG9tYWluOworCisgICAgQ29uZmlnTWFwcGVyKHN0ZDo6c3RyaW5nIG1lZGlhS2V5LCBDMlN0cmluZyBjMnN0cnVjdCwgQzJTdHJpbmcgYzJmaWVsZCkKKyAgICAgICAgOiBtRG9tYWluKERvbWFpbjo6QUxMKSwgbU1lZGlhS2V5KG1lZGlhS2V5KSwgbVN0cnVjdChjMnN0cnVjdCksIG1GaWVsZChjMmZpZWxkKSB7IH0KKworICAgIC8vLyBMaW1pdHMgdGhpcyBwYXJhbWV0ZXIgdG8gdGhlIGdpdmVuIGRvbWFpbgorICAgIENvbmZpZ01hcHBlciAmbGltaXRUbyh1aW50MzJfdCBkb21haW4pIHsKKyAgICAgICAgQzJfQ0hFQ0soZG9tYWluICYgRG9tYWluOjpHVUFSRF9CSVQpOworICAgICAgICBtRG9tYWluID0gRG9tYWluKG1Eb21haW4gJiBkb21haW4pOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgLy8vIEFkZHMgU0RLID0+IENvZGVjIDIuMCBtYXBwZXIgKHNob3VsZCBub3QgYmUgaW4gdGhlIFNESyBmb3JtYXQpCisgICAgQ29uZmlnTWFwcGVyICZ3aXRoTWFwcGVyKE1hcHBlciBtYXBwZXIpIHsKKyAgICAgICAgQzJfQ0hFQ0soIW1NYXBwZXIpOworICAgICAgICBDMl9DSEVDSyghbVJldmVyc2UpOworICAgICAgICBtTWFwcGVyID0gbWFwcGVyOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgLy8vIEFkZHMgU0RLIDw9PiBDb2RlYyAyLjAgdmFsdWUgbWFwcGVycworICAgIENvbmZpZ01hcHBlciAmd2l0aE1hcHBlcnMoTWFwcGVyIG1hcHBlciwgTWFwcGVyIHJldmVyc2UpIHsKKyAgICAgICAgQzJfQ0hFQ0soIW1NYXBwZXIpOworICAgICAgICBDMl9DSEVDSyghbVJldmVyc2UpOworICAgICAgICBtTWFwcGVyID0gbWFwcGVyOworICAgICAgICBtUmV2ZXJzZSA9IHJldmVyc2U7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICAvLy8gQWRkcyBTREsgPD0+IENvZGVjIDIuMCB2YWx1ZSBtYXBwZXJzIGJhc2VkIG9uIEMyTWFwcGVyCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgQzJUeXBlLCB0eXBlbmFtZSBTZGtUeXBlPWludDMyX3Q+CisgICAgQ29uZmlnTWFwcGVyICZ3aXRoQzJNYXBwZXJzKCkgeworICAgICAgICBDMl9DSEVDSyghbU1hcHBlcik7CisgICAgICAgIEMyX0NIRUNLKCFtUmV2ZXJzZSk7CisgICAgICAgIG1NYXBwZXIgPSBbXShDMlZhbHVlIHYpIC0+IEMyVmFsdWUgeworICAgICAgICAgICAgU2RrVHlwZSBzZGtWYWx1ZTsKKyAgICAgICAgICAgIEMyVHlwZSBjMlZhbHVlOworICAgICAgICAgICAgaWYgKHYuZ2V0KCZzZGtWYWx1ZSkgJiYgQzJNYXBwZXI6Om1hcChzZGtWYWx1ZSwgJmMyVmFsdWUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGMyVmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQzJWYWx1ZSgpOworICAgICAgICB9OworICAgICAgICBtUmV2ZXJzZSA9IFtdKEMyVmFsdWUgdikgLT4gQzJWYWx1ZSB7CisgICAgICAgICAgICBTZGtUeXBlIHNka1ZhbHVlOworICAgICAgICAgICAgQzJUeXBlIGMyVmFsdWU7CisgICAgICAgICAgICB1c2luZyBDMlZhbHVlVHlwZT10eXBlbmFtZSBfYzJfcmVkdWNlX2VudW1fdG9fdW5kZXJseWluZ190eXBlPEMyVHlwZT46OnR5cGU7CisgICAgICAgICAgICBpZiAodi5nZXQoKEMyVmFsdWVUeXBlKikmYzJWYWx1ZSkgJiYgQzJNYXBwZXI6Om1hcChjMlZhbHVlLCAmc2RrVmFsdWUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHNka1ZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIEMyVmFsdWUoKTsKKyAgICAgICAgfTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIC8vLyBNYXBzIGZyb20gU0RLIHZhbHVlcyBpbiBhbiBBTWVzc2FnZSB0byBhIHN1aXRhYmxlIEMyVmFsdWUuCisgICAgQzJWYWx1ZSBtYXBGcm9tTWVzc2FnZShjb25zdCBBTWVzc2FnZTo6SXRlbURhdGEgJml0ZW0pIGNvbnN0IHsKKyAgICAgICAgQzJWYWx1ZSB2YWx1ZTsKKyAgICAgICAgaW50MzJfdCBpbnQzMlZhbHVlOworICAgICAgICBpbnQ2NF90IGludDY0VmFsdWU7CisgICAgICAgIGZsb2F0IGZsb2F0VmFsdWU7CisgICAgICAgIGRvdWJsZSBkb3VibGVWYWx1ZTsKKyAgICAgICAgaWYgKGl0ZW0uZmluZCgmaW50MzJWYWx1ZSkpIHsKKyAgICAgICAgICAgIHZhbHVlID0gaW50MzJWYWx1ZTsKKyAgICAgICAgfSBlbHNlIGlmIChpdGVtLmZpbmQoJmludDY0VmFsdWUpKSB7CisgICAgICAgICAgICB2YWx1ZSA9IGludDY0VmFsdWU7CisgICAgICAgIH0gZWxzZSBpZiAoaXRlbS5maW5kKCZmbG9hdFZhbHVlKSkgeworICAgICAgICAgICAgdmFsdWUgPSBmbG9hdFZhbHVlOworICAgICAgICB9IGVsc2UgaWYgKGl0ZW0uZmluZCgmZG91YmxlVmFsdWUpKSB7CisgICAgICAgICAgICB2YWx1ZSA9IChmbG9hdClkb3VibGVWYWx1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAodmFsdWUudHlwZSgpICE9IEMyVmFsdWU6Ok5PX0lOSVQgJiYgbU1hcHBlcikgeworICAgICAgICAgICAgdmFsdWUgPSBtTWFwcGVyKHZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorCisgICAgLy8vIE1hcHMgZnJvbSBhIEMyVmFsdWUgdG8gYW4gU0RLIHZhbHVlIGluIGFuIEFNZXNzYWdlLgorICAgIEFNZXNzYWdlOjpJdGVtRGF0YSBtYXBUb01lc3NhZ2UoQzJWYWx1ZSB2YWx1ZSkgY29uc3QgeworICAgICAgICBBTWVzc2FnZTo6SXRlbURhdGEgaXRlbTsKKyAgICAgICAgaW50MzJfdCBpbnQzMlZhbHVlOworICAgICAgICB1aW50MzJfdCB1aW50MzJWYWx1ZTsKKyAgICAgICAgaW50NjRfdCBpbnQ2NFZhbHVlOworICAgICAgICB1aW50NjRfdCB1aW50NjRWYWx1ZTsKKyAgICAgICAgZmxvYXQgZmxvYXRWYWx1ZTsKKyAgICAgICAgaWYgKHZhbHVlLnR5cGUoKSAhPSBDMlZhbHVlOjpOT19JTklUICYmIG1SZXZlcnNlKSB7CisgICAgICAgICAgICB2YWx1ZSA9IG1SZXZlcnNlKHZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodmFsdWUuZ2V0KCZpbnQzMlZhbHVlKSkgeworICAgICAgICAgICAgaXRlbS5zZXQoaW50MzJWYWx1ZSk7CisgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuZ2V0KCZ1aW50MzJWYWx1ZSkgJiYgdWludDMyVmFsdWUgPD0gdWludDMyX3QoSU5UMzJfTUFYKSkgeworICAgICAgICAgICAgLy8gU0RLIGRvZXMgbm90IHN1cHBvcnQgdW5zaWduZWQgdmFsdWVzCisgICAgICAgICAgICBpdGVtLnNldCgoaW50MzJfdCl1aW50MzJWYWx1ZSk7CisgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuZ2V0KCZpbnQ2NFZhbHVlKSkgeworICAgICAgICAgICAgaXRlbS5zZXQoaW50NjRWYWx1ZSk7CisgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuZ2V0KCZ1aW50NjRWYWx1ZSkgJiYgdWludDY0VmFsdWUgPD0gdWludDY0X3QoSU5UNjRfTUFYKSkgeworICAgICAgICAgICAgLy8gU0RLIGRvZXMgbm90IHN1cHBvcnQgdW5zaWduZWQgdmFsdWVzCisgICAgICAgICAgICBpdGVtLnNldCgoaW50NjRfdCl1aW50NjRWYWx1ZSk7CisgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuZ2V0KCZmbG9hdFZhbHVlKSkgeworICAgICAgICAgICAgaXRlbS5zZXQoZmxvYXRWYWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGl0ZW07CisgICAgfQorCisgICAgRG9tYWluIGRvbWFpbigpIGNvbnN0IHsgcmV0dXJuIG1Eb21haW47IH0KKyAgICBzdGQ6OnN0cmluZyBtZWRpYUtleSgpIGNvbnN0IHsgcmV0dXJuIG1NZWRpYUtleTsgfQorICAgIHN0ZDo6c3RyaW5nIHBhdGgoKSBjb25zdCB7IHJldHVybiBtRmllbGQuc2l6ZSgpID8gbVN0cnVjdCArICcuJyArIG1GaWVsZCA6IG1TdHJ1Y3Q7IH0KKyAgICBNYXBwZXIgbWFwcGVyKCkgY29uc3QgeyByZXR1cm4gbU1hcHBlcjsgfQorICAgIE1hcHBlciByZXZlcnNlKCkgY29uc3QgeyByZXR1cm4gbVJldmVyc2U7IH0KKworcHJpdmF0ZToKKyAgICBEb21haW4gbURvbWFpbjsgICAgICAgICAvLy88IHBhcmFtZXRlciBkb21haW4gKG1hc2spIGNvbnRhaW5pbmcgcG9ydCwga2luZCBhbmQgY29uZmlnIGRvbWFpbnMKKyAgICBzdGQ6OnN0cmluZyBtTWVkaWFLZXk7ICAvLy88IFNESyBrZXkKKyAgICBDMlN0cmluZyBtU3RydWN0OyAgICAgICAvLy88IENvZGVjIDIuMCBzdHJ1Y3QgbmFtZQorICAgIEMyU3RyaW5nIG1GaWVsZDsgICAgICAgIC8vLzwgQ29kZWMgMi4wIGZpZWxkIG5hbWUKKyAgICBNYXBwZXIgbU1hcHBlcjsgICAgICAgICAvLy88IG9wdGlvbmFsIFNESyA9PiBDb2RlYyAyLjAgdmFsdWUgbWFwcGVyCisgICAgTWFwcGVyIG1SZXZlcnNlOyAgICAgICAgLy8vPCBvcHRpb25hbCBDb2RlYyAyLjAgPT4gU0RLIHZhbHVlIG1hcHBlcgorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFBPUlQsIHR5cGVuYW1lIFNUUkVBTT4KK0FTdHJpbmcgUXVlcnlNZWRpYVR5cGVJbXBsKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+ICZjb21wb25lbnQpIHsKKyAgICBBU3RyaW5nIG1lZGlhVHlwZTsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IHF1ZXJpZWQ7CisgICAgYzJfc3RhdHVzX3QgYzJlcnIgPSBjb21wb25lbnQtPnF1ZXJ5KAorICAgICAgICAgICAge30sIHsgUE9SVDo6UEFSQU1fVFlQRSwgU1RSRUFNOjpQQVJBTV9UWVBFIH0sIEMyX0RPTlRfQkxPQ0ssICZxdWVyaWVkKTsKKyAgICBpZiAoYzJlcnIgIT0gQzJfT0sgJiYgcXVlcmllZC5zaXplKCkgPT0gMCkgeworICAgICAgICBBTE9HRCgiUXVlcnkgbWVkaWEgdHlwZSBmYWlsZWQgPT4gJXMiLCBhc1N0cmluZyhjMmVycikpOworICAgIH0gZWxzZSB7CisgICAgICAgIFBPUlQgKnBvcnRNZWRpYVR5cGUgPQorICAgICAgICAgICAgUE9SVDo6RnJvbShxdWVyaWVkWzBdLmdldCgpKTsKKyAgICAgICAgaWYgKHBvcnRNZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIG1lZGlhVHlwZSA9IEFTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgIHBvcnRNZWRpYVR5cGUtPm0udmFsdWUsCisgICAgICAgICAgICAgICAgICAgIHN0cm5sZW4ocG9ydE1lZGlhVHlwZS0+bS52YWx1ZSwgcG9ydE1lZGlhVHlwZS0+ZmxleENvdW50KCkpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFNUUkVBTSAqc3RyZWFtTWVkaWFUeXBlID0gU1RSRUFNOjpGcm9tKHF1ZXJpZWRbMF0uZ2V0KCkpOworICAgICAgICAgICAgaWYgKHN0cmVhbU1lZGlhVHlwZSkgeworICAgICAgICAgICAgICAgIG1lZGlhVHlwZSA9IEFTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1NZWRpYVR5cGUtPm0udmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJubGVuKHN0cmVhbU1lZGlhVHlwZS0+bS52YWx1ZSwgc3RyZWFtTWVkaWFUeXBlLT5mbGV4Q291bnQoKSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEFMT0dEKCJyZWFkIG1lZGlhIHR5cGU6ICVzIiwgbWVkaWFUeXBlLmNfc3RyKCkpOworICAgIH0KKyAgICByZXR1cm4gbWVkaWFUeXBlOworfQorCitBU3RyaW5nIFF1ZXJ5TWVkaWFUeXBlKAorICAgICAgICBib29sIGlucHV0LCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+ICZjb21wb25lbnQpIHsKKyAgICB0eXBlZGVmIEMyUG9ydE1lZGlhVHlwZVNldHRpbmcgUDsKKyAgICB0eXBlZGVmIEMyU3RyZWFtTWVkaWFUeXBlU2V0dGluZyBTOworICAgIGlmIChpbnB1dCkgeworICAgICAgICByZXR1cm4gUXVlcnlNZWRpYVR5cGVJbXBsPFA6OmlucHV0LCBTOjppbnB1dD4oY29tcG9uZW50KTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gUXVlcnlNZWRpYVR5cGVJbXBsPFA6Om91dHB1dCwgUzo6b3V0cHV0Pihjb21wb25lbnQpOworICAgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlCisKKy8qKgorICogU2V0IG9mIHN0YW5kYXJkIHBhcmFtZXRlcnMgdXNlZCBieSBDQ29kZWMgdGhhdCBhcmUgZXhwb3NlZCB0byBNZWRpYUNvZGVjLgorICovCitzdHJ1Y3QgU3RhbmRhcmRQYXJhbXMgeworICAgIHR5cGVkZWYgQ0NvZGVjQ29uZmlnOjpEb21haW4gRG9tYWluOworCisgICAgLy8gc3RhbmRhcmQgKE1lZGlhQ29kZWMpIHBhcmFtcyBhcmUga2V5ZWQgYnkgbWVkaWEgZm9ybWF0IGtleQorICAgIHR5cGVkZWYgc3RkOjpzdHJpbmcgU2RrS2V5OworCisgICAgLy8vIHVzZWQgdG8gcmV0dXJuIHJlZmVyZW5jZSB0byBubyBjb25maWcgbWFwcGVycyBpbiBnZXRDb25maWdNYXBwZXJzRm9yU2RrS2V5CisgICAgc3RhdGljIGNvbnN0IHN0ZDo6dmVjdG9yPENvbmZpZ01hcHBlcj4gTk9fTUFQUEVSUzsKKworICAgIC8vLyBSZXR1cm5zIENvZGVjIDIuMCBlcXVpdmFsZW50IHBhcmFtZXRlcnMgZm9yIGFuIFNESyBmb3JtYXQga2V5LgorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENvbmZpZ01hcHBlcj4gJmdldENvbmZpZ01hcHBlcnNGb3JTZGtLZXkoc3RkOjpzdHJpbmcga2V5KSBjb25zdCB7CisgICAgICAgIGF1dG8gaXQgPSBtQ29uZmlnTWFwcGVycy5maW5kKGtleSk7CisgICAgICAgIGlmIChpdCA9PSBtQ29uZmlnTWFwcGVycy5lbmQoKSkgeworICAgICAgICAgICAgQUxPR0QoIm5vIGMyIGVxdWl2YWxlbnRzIGZvciAlcyIsIGtleS5jX3N0cigpKTsKKyAgICAgICAgICAgIHJldHVybiBOT19NQVBQRVJTOworICAgICAgICB9CisgICAgICAgIEFMT0dWKCJmb3VuZCAlenUgZXFzIGZvciAlcyIsIGl0LT5zZWNvbmQuc2l6ZSgpLCBrZXkuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBpdC0+c2Vjb25kOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYSBTREsgPD0+IENvZGVjIDIuMCBwYXJhbWV0ZXIgbWFwcGluZy4gTXVsdGlwbGUgQ29kZWMgMi4wIHBhcmFtZXRlcnMgbWF5IG1hcCB0byBhCisgICAgICogc2luZ2xlIFNESyBrZXksIGluIHdoaWNoIGNhc2UgdGhleSBzaGFsbCBiZSBvcmRlcmVkIGZyb20gbGVhc3QgYXV0aG9yaXRhdGl2ZSB0byBtb3N0CisgICAgICogYXV0aG9yaXRhdGl2ZS4gV2hlbiBjb25zdHJ1Y3RpbmcgU0RLIGZvcm1hdHMsIHRoZSBsYXN0IG1hcHBlZCBDb2RlYyAyLjAgcGFyYW1ldGVyIHRoYXQKKyAgICAgKiBpcyBzdXBwb3J0ZWQgYnkgdGhlIGNvbXBvbmVudCB3aWxsIGRldGVybWluZSB0aGUgZXhwb3NlZCB2YWx1ZS4gKFRPRE86IHBlcmhhcHMgcmVzdHJpY3QgdGhpcworICAgICAqIGJ5IGRvbWFpbi4pCisgICAgICovCisgICAgdm9pZCBhZGQoY29uc3QgQ29uZmlnTWFwcGVyICZjbSkgeworICAgICAgICBhdXRvIGl0ID0gbUNvbmZpZ01hcHBlcnMuZmluZChjbS5tZWRpYUtleSgpKTsKKyAgICAgICAgQUxPR1YoIiVjJWMlYyVjICVjJWMlYyAlMDR4ICU5cyAlcyA9PiAlcyIsCisgICAgICAgICAgICAgICgoY20uZG9tYWluKCkgJiBEb21haW46OklTX0lOUFVUKSA/ICdJJyA6ICcgJyksCisgICAgICAgICAgICAgICgoY20uZG9tYWluKCkgJiBEb21haW46OklTX09VVFBVVCkgPyAnTycgOiAnICcpLAorICAgICAgICAgICAgICAoKGNtLmRvbWFpbigpICYgRG9tYWluOjpJU19DT0RFRCkgPyAnQycgOiAnICcpLAorICAgICAgICAgICAgICAoKGNtLmRvbWFpbigpICYgRG9tYWluOjpJU19SQVcpID8gJ1InIDogJyAnKSwKKyAgICAgICAgICAgICAgKChjbS5kb21haW4oKSAmIERvbWFpbjo6SVNfQ09ORklHKSA/ICdjJyA6ICcgJyksCisgICAgICAgICAgICAgICgoY20uZG9tYWluKCkgJiBEb21haW46OklTX1BBUkFNKSA/ICdwJyA6ICcgJyksCisgICAgICAgICAgICAgICgoY20uZG9tYWluKCkgJiBEb21haW46OklTX1JFQUQpID8gJ3InIDogJyAnKSwKKyAgICAgICAgICAgICAgY20uZG9tYWluKCksCisgICAgICAgICAgICAgIGl0ID09IG1Db25maWdNYXBwZXJzLmVuZCgpID8gImFkZGluZyIgOiAiZXh0ZW5kaW5nIiwKKyAgICAgICAgICAgICAgY20ubWVkaWFLZXkoKS5jX3N0cigpLCBjbS5wYXRoKCkuY19zdHIoKSk7CisgICAgICAgIGlmIChpdCA9PSBtQ29uZmlnTWFwcGVycy5lbmQoKSkgeworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Q29uZmlnTWFwcGVyPiBlcXMgPSB7IGNtIH07CisgICAgICAgICAgICBtQ29uZmlnTWFwcGVycy5lbXBsYWNlKGNtLm1lZGlhS2V5KCksIGVxcyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpdC0+c2Vjb25kLnB1c2hfYmFjayhjbSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGFsbCBwYXRocyBmb3IgYSBzcGVjaWZpYyBkb21haW4uCisgICAgICoKKyAgICAgKiBccGFyYW0gYW55IG1heGltdW0gZG9tYWluIG1hc2suIFJldHVybmVkIHBhcmFtZXRlcnMgbXVzdCBtYXRjaCBhdCBsZWFzdCBvbmUgb2YgdGhlIGRvbWFpbnMKKyAgICAgKiAgICAgICAgICAgIGluIHRoZSBtYXNrLgorICAgICAqIFxwYXJhbSBhbGwgbWluaW11bSBkb21haW4gbWFzay4gUmV0dXJuZWQgcGFyYW1ldGVycyBtdXN0IG1hdGNoIGFsbCBvZiB0aGUgZG9tYWlucyBpbiB0aGUKKyAgICAgKiAgICAgICAgICAgIG1hc2suIFRoaXMgaXMgcmVzdHJpY3RlZCB0byB0aGUgYml0cyBvZiB0aGUgbWF4aW11bSBtYXNrLgorICAgICAqLworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBnZXRQYXRoc0ZvckRvbWFpbigKKyAgICAgICAgICAgIERvbWFpbiBhbnksIERvbWFpbiBhbGwgPSBEb21haW46OkFMTCkgY29uc3QgeworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gcmVzOworICAgICAgICBmb3IgKGNvbnN0IHN0ZDo6cGFpcjxzdGQ6OnN0cmluZywgc3RkOjp2ZWN0b3I8Q29uZmlnTWFwcGVyPj4gJmVsIDogbUNvbmZpZ01hcHBlcnMpIHsKKyAgICAgICAgICAgIGZvciAoY29uc3QgQ29uZmlnTWFwcGVyICZjbSA6IGVsLnNlY29uZCkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJmaWx0ZXJpbmcgJXMgJXggJXggJXggJXgiLCBjbS5wYXRoKCkuY19zdHIoKSwgY20uZG9tYWluKCksIGFueSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChjbS5kb21haW4oKSAmIGFueSksIChjbS5kb21haW4oKSAmIGFueSAmIGFsbCkpOworICAgICAgICAgICAgICAgIGlmICgoY20uZG9tYWluKCkgJiBhbnkpICYmICgoY20uZG9tYWluKCkgJiBhbnkgJiBhbGwpID09IChhbnkgJiBhbGwpKSkgeworICAgICAgICAgICAgICAgICAgICByZXMucHVzaF9iYWNrKGNtLnBhdGgoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBTREsgPD0+IENvZGVjIDIuMCBtYXBwaW5ncy4KKyAgICAgKgorICAgICAqIFRPRE86IHJlcGxhY2UgdGhlc2Ugd2l0aCBiZXR0ZXIgbWV0aG9kcyBhcyB0aGlzIGV4cG9zZXMgdGhlIGlubmVyIHN0cnVjdHVyZS4KKyAgICAgKi8KKyAgICBjb25zdCBzdGQ6Om1hcDxTZGtLZXksIHN0ZDo6dmVjdG9yPENvbmZpZ01hcHBlcj4+IGdldEtleXMoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtQ29uZmlnTWFwcGVyczsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgc3RkOjptYXA8U2RrS2V5LCBzdGQ6OnZlY3RvcjxDb25maWdNYXBwZXI+PiBtQ29uZmlnTWFwcGVyczsKK307CisKK2NvbnN0IHN0ZDo6dmVjdG9yPENvbmZpZ01hcHBlcj4gU3RhbmRhcmRQYXJhbXM6Ok5PX01BUFBFUlM7CisKKworQ0NvZGVjQ29uZmlnOjpDQ29kZWNDb25maWcoKQorICAgIDogbUlucHV0Rm9ybWF0KG5ldyBBTWVzc2FnZSksCisgICAgICBtT3V0cHV0Rm9ybWF0KG5ldyBBTWVzc2FnZSksCisgICAgICBtVXNpbmdTdXJmYWNlKGZhbHNlKSB7IH0KKwordm9pZCBDQ29kZWNDb25maWc6OmluaXRpYWxpemVTdGFuZGFyZFBhcmFtcygpIHsKKyAgICB0eXBlZGVmIERvbWFpbiBEOworICAgIG1TdGFuZGFyZFBhcmFtcyA9IHN0ZDo6bWFrZV9zaGFyZWQ8U3RhbmRhcmRQYXJhbXM+KCk7CisgICAgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IENvbmZpZ01hcHBlciAmKT4gYWRkID0KKyAgICAgICAgW3BhcmFtcyA9IG1TdGFuZGFyZFBhcmFtc10oY29uc3QgQ29uZmlnTWFwcGVyICZjbSkgeworICAgICAgICAgICAgcGFyYW1zLT5hZGQoY20pOworICAgIH07CisgICAgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IENvbmZpZ01hcHBlciAmKT4gZGVwcmVjYXRlZCA9IGFkZDsKKworICAgIC8vIGFsbG93IGludDMyIG9yIGZsb2F0IFNESyB2YWx1ZXMgYW5kIHJlcHJlc2VudCB0aGVtIGFzIGZsb2F0CisgICAgQ29uZmlnTWFwcGVyOjpNYXBwZXIgbWFrZUZsb2F0ID0gW10oQzJWYWx1ZSB2KSAtPiBDMlZhbHVlIHsKKyAgICAgICAgLy8gY29udmVydCBmcm9tIGkzMiB0byBmbG9hdAorICAgICAgICBpbnQzMl90IGkzMlZhbHVlOworICAgICAgICBmbG9hdCBmcFZhbHVlOworICAgICAgICBpZiAodi5nZXQoJmkzMlZhbHVlKSkgeworICAgICAgICAgICAgcmV0dXJuIChmbG9hdClpMzJWYWx1ZTsKKyAgICAgICAgfSBlbHNlIGlmICh2LmdldCgmZnBWYWx1ZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmcFZhbHVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBDMlZhbHVlKCk7CisgICAgfTsKKworICAgIENvbmZpZ01hcHBlcjo6TWFwcGVyIG5lZ2F0ZSA9IFtdKEMyVmFsdWUgdikgLT4gQzJWYWx1ZSB7CisgICAgICAgIGludDMyX3QgdmFsdWU7CisgICAgICAgIGlmICh2LmdldCgmdmFsdWUpKSB7CisgICAgICAgICAgICByZXR1cm4gLXZhbHVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBDMlZhbHVlKCk7CisgICAgfTsKKworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX01JTUUsICAgICBDMl9QQVJBTUtFWV9JTlBVVF9NRURJQV9UWVBFLCAgICAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpJTlBVVCAmIEQ6OlJFQUQpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9NSU1FLCAgICAgQzJfUEFSQU1LRVlfT1VUUFVUX01FRElBX1RZUEUsICAgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6T1VUUFVUICYgRDo6UkVBRCkpOworCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfQklUX1JBVEUsIEMyX1BBUkFNS0VZX0JJVFJBVEUsICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OkVOQ09ERVIgJiBEOjpPVVRQVVQpKTsKKyAgICAvLyB3ZSBhbHNvIG5lZWQgdG8gcHV0IHRoZSBiaXRyYXRlIGluIHRoZSBtYXggYml0cmF0ZSBmaWVsZAorICAgIGFkZChDb25maWdNYXBwZXIoS0VZX01BWF9CSVRfUkFURSwgQzJfUEFSQU1LRVlfQklUUkFURSwgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6RU5DT0RFUiAmIEQ6OlJFQUQgJiBEOjpPVVRQVVQpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKFBBUkFNRVRFUl9LRVlfVklERU9fQklUUkFURSwgQzJfUEFSQU1LRVlfQklUUkFURSwgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6RU5DT0RFUiAmIEQ6OlZJREVPICYgRDo6UEFSQU0pKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9CSVRSQVRFX01PREUsIEMyX1BBUkFNS0VZX0JJVFJBVEVfTU9ERSwgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6RU5DT0RFUiAmIEQ6OkNPREVEKQorICAgICAgICAud2l0aE1hcHBlcihbXShDMlZhbHVlIHYpIC0+IEMyVmFsdWUgeworICAgICAgICAgICAgaW50MzJfdCB2YWx1ZTsKKyAgICAgICAgICAgIEMyQ29uZmlnOjpiaXRyYXRlX21vZGVfdCBtb2RlOworICAgICAgICAgICAgaWYgKHYuZ2V0KCZ2YWx1ZSkgJiYgQzJNYXBwZXI6Om1hcCh2YWx1ZSwgJm1vZGUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1vZGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQzJWYWx1ZSgpOworICAgICAgICB9KSk7CisgICAgLy8gcmVtb3ZlIHdoZW4gY29kZWNzIHN3aXRjaCB0byBQQVJBTUtFWSBhbmQgbmV3IG1vZGVzCisgICAgZGVwcmVjYXRlZChDb25maWdNYXBwZXIoS0VZX0JJVFJBVEVfTU9ERSwgImNvZGVkLmJpdHJhdGUtbW9kZSIsICJ2YWx1ZSIpCisgICAgICAgICAgICAgICAubGltaXRUbyhEOjpFTkNPREVSKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfRlJBTUVfUkFURSwgQzJfUEFSQU1LRVlfRlJBTUVfUkFURSwgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6VklERU8pCisgICAgICAgIC53aXRoTWFwcGVycyhtYWtlRmxvYXQsIFtdKEMyVmFsdWUgdikgLT4gQzJWYWx1ZSB7CisgICAgICAgICAgICAvLyByZWFkIGJhY2sgYWx3YXlzIGFzIGludAorICAgICAgICAgICAgZmxvYXQgdmFsdWU7CisgICAgICAgICAgICBpZiAodi5nZXQoJnZhbHVlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiAoaW50MzJfdCl2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBDMlZhbHVlKCk7CisgICAgICAgIH0pKTsKKworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX01BWF9JTlBVVF9TSVpFLCBDMl9QQVJBTUtFWV9JTlBVVF9NQVhfQlVGRkVSX1NJWkUsICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OklOUFVUKSk7CisgICAgLy8gcmVtb3ZlIHdoZW4gY29kZWNzIHN3aXRjaCB0byBQQVJBTUtFWQorICAgIGRlcHJlY2F0ZWQoQ29uZmlnTWFwcGVyKEtFWV9NQVhfSU5QVVRfU0laRSwgImNvZGVkLm1heC1mcmFtZS1zaXplIiwgInZhbHVlIikKKyAgICAgICAgICAgICAgIC5saW1pdFRvKEQ6OklOUFVUKSk7CisKKyAgICAvLyBSb3RhdGlvbgorICAgIC8vIE5vdGU6IFNESyByb3RhdGlvbiBpcyBjbG9jay13aXNlLCB3aGlsZSBDMiByb3RhdGlvbiBpcyBjb3VudGVyLWNsb2NrLXdpc2UKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9ST1RBVElPTiwgQzJfUEFSQU1LRVlfVlVJX1JPVEFUSU9OLCAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpWSURFTyAmIEQ6OkNPREVEKQorICAgICAgICAud2l0aE1hcHBlcnMobmVnYXRlLCBuZWdhdGUpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9ST1RBVElPTiwgQzJfUEFSQU1LRVlfUk9UQVRJT04sICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OlZJREVPICYgRDo6UkFXKQorICAgICAgICAud2l0aE1hcHBlcnMobmVnYXRlLCBuZWdhdGUpKTsKKworICAgIC8vIGFuZHJvaWQgJ3ZpZGVvLXNjYWxpbmcnCisgICAgYWRkKENvbmZpZ01hcHBlcigiYW5kcm9pZC5fdmlkZW8tc2NhbGluZyIsIEMyX1BBUkFNS0VZX1NVUkZBQ0VfU0NBTElOR19NT0RFLCAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpWSURFTyAmIEQ6OkRFQ09ERVIgJiBEOjpSQVcpKTsKKworICAgIC8vIENvbG9yIEFzcGVjdHMKKyAgICAvLworICAgIC8vIGNvbmZpZ3VyZSBkZWZhdWx0IGZvciBkZWNvZGVycworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0NPTE9SX1JBTkdFLCAgICAgICBDMl9QQVJBTUtFWV9ERUZBVUxUX0NPTE9SX0FTUEVDVFMsICAgInJhbmdlIikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6REVDT0RFUiAgJiBEOjpDT0RFRCAmIChEOjpDT05GSUcgfCBEOjpQQVJBTSkpCisgICAgICAgIC53aXRoQzJNYXBwZXJzPEMyQ29sb3I6OnJhbmdlX3Q+KCkpOworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0NPTE9SX1RSQU5TRkVSLCAgICBDMl9QQVJBTUtFWV9ERUZBVUxUX0NPTE9SX0FTUEVDVFMsICAgInRyYW5zZmVyIikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6REVDT0RFUiAgJiBEOjpDT0RFRCAmIChEOjpDT05GSUcgfCBEOjpQQVJBTSkpCisgICAgICAgIC53aXRoQzJNYXBwZXJzPEMyQ29sb3I6OnRyYW5zZmVyX3Q+KCkpOworICAgIGFkZChDb25maWdNYXBwZXIoImNvbG9yLXByaW1hcmllcyIsICAgICBDMl9QQVJBTUtFWV9ERUZBVUxUX0NPTE9SX0FTUEVDVFMsICAgInByaW1hcmllcyIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OkRFQ09ERVIgICYgRDo6Q09ERUQgJiAoRDo6Q09ORklHIHwgRDo6UEFSQU0pKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcigiY29sb3ItbWF0cml4IiwgICAgICAgIEMyX1BBUkFNS0VZX0RFRkFVTFRfQ09MT1JfQVNQRUNUUywgICAibWF0cml4IikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6REVDT0RFUiAgJiBEOjpDT0RFRCAmIChEOjpDT05GSUcgfCBEOjpQQVJBTSkpKTsKKworICAgIC8vIHJlYWQgYmFjayBmaW5hbCBmb3IgZGVjb2RlciBvdXRwdXQgKGFsc28sIGNvbmZpZ3VyZSBmaW5hbCBhc3BlY3RzIGFzIHdlbGwuIFRoaXMgc2hvdWxkIGJlCisgICAgLy8gb3ZlcndyaXR0ZW4gYmFzZWQgb24gY29kZWQvZGVmYXVsdCB2YWx1ZXMgaWYgY29tcG9uZW50IHN1cHBvcnRzIGNvbG9yIGFzcGVjdHMsIGJ1dCBpcyB1c2VkCisgICAgLy8gYXMgZmluYWwgdmFsdWVzIGlmIGNvbXBvbmVudCBkb2VzIG5vdCBzdXBwb3J0IGFzcGVjdHMgYXQgYWxsKQorICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0NPTE9SX1JBTkdFLCAgICAgICBDMl9QQVJBTUtFWV9DT0xPUl9BU1BFQ1RTLCAgICJyYW5nZSIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OkRFQ09ERVIgICYgRDo6UkFXKQorICAgICAgICAud2l0aEMyTWFwcGVyczxDMkNvbG9yOjpyYW5nZV90PigpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9DT0xPUl9UUkFOU0ZFUiwgICAgQzJfUEFSQU1LRVlfQ09MT1JfQVNQRUNUUywgICAidHJhbnNmZXIiKQorICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpERUNPREVSICAmIEQ6OlJBVykKKyAgICAgICAgLndpdGhDMk1hcHBlcnM8QzJDb2xvcjo6dHJhbnNmZXJfdD4oKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcigiY29sb3ItcHJpbWFyaWVzIiwgICAgIEMyX1BBUkFNS0VZX0NPTE9SX0FTUEVDVFMsICAgInByaW1hcmllcyIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OkRFQ09ERVIgICYgRDo6UkFXKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcigiY29sb3ItbWF0cml4IiwgICAgICAgIEMyX1BBUkFNS0VZX0NPTE9SX0FTUEVDVFMsICAgIm1hdHJpeCIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OkRFQ09ERVIgICYgRDo6UkFXKSk7CisKKyAgICAvLyBjb25maWd1cmUgc291cmNlIGFzcGVjdHMgZm9yIGVuY29kZXJzIGFuZCByZWFkIHRoZW0gYmFjayBvbiB0aGUgY29kZWQoISkgcG9ydC4KKyAgICAvLyBUaGlzIGlzIHRvIGVuc3VyZSBtdXhpbmcgdGhlIGRlc2lyZWQgYXNwZWN0cyBpbnRvIHRoZSBjb250YWluZXIuCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfQ09MT1JfUkFOR0UsICAgICAgIEMyX1BBUkFNS0VZX0NPTE9SX0FTUEVDVFMsICAgInJhbmdlIikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6RU5DT0RFUiAgJiBEOjpDT0RFRCkKKyAgICAgICAgLndpdGhDMk1hcHBlcnM8QzJDb2xvcjo6cmFuZ2VfdD4oKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfQ09MT1JfVFJBTlNGRVIsICAgIEMyX1BBUkFNS0VZX0NPTE9SX0FTUEVDVFMsICAgInRyYW5zZmVyIikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6RU5DT0RFUiAgJiBEOjpDT0RFRCkKKyAgICAgICAgLndpdGhDMk1hcHBlcnM8QzJDb2xvcjo6dHJhbnNmZXJfdD4oKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcigiY29sb3ItcHJpbWFyaWVzIiwgICAgIEMyX1BBUkFNS0VZX0NPTE9SX0FTUEVDVFMsICAgInByaW1hcmllcyIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OkVOQ09ERVIgICYgRDo6Q09ERUQpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKCJjb2xvci1tYXRyaXgiLCAgICAgICAgQzJfUEFSQU1LRVlfQ09MT1JfQVNQRUNUUywgICAibWF0cml4IikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6RU5DT0RFUiAgJiBEOjpDT0RFRCkpOworCisgICAgLy8gcmVhZCBiYWNrIGNvZGVkIGFzcGVjdHMgZm9yIGVuY29kZXJzIChvbiB0aGUgcmF3IHBvcnQpLCBidXQgYWxzbyBjb25maWd1cmUKKyAgICAvLyBkZXNpcmVkIGFzcGVjdHMgaGVyZS4KKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9DT0xPUl9SQU5HRSwgICAgICAgQzJfUEFSQU1LRVlfVlVJX0NPTE9SX0FTUEVDVFMsICAgInJhbmdlIikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6RU5DT0RFUiAgJiBEOjpSQVcpCisgICAgICAgIC53aXRoQzJNYXBwZXJzPEMyQ29sb3I6OnJhbmdlX3Q+KCkpOworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0NPTE9SX1RSQU5TRkVSLCAgICBDMl9QQVJBTUtFWV9WVUlfQ09MT1JfQVNQRUNUUywgICAidHJhbnNmZXIiKQorICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpFTkNPREVSICAmIEQ6OlJBVykKKyAgICAgICAgLndpdGhDMk1hcHBlcnM8QzJDb2xvcjo6dHJhbnNmZXJfdD4oKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcigiY29sb3ItcHJpbWFyaWVzIiwgICAgIEMyX1BBUkFNS0VZX1ZVSV9DT0xPUl9BU1BFQ1RTLCAgICJwcmltYXJpZXMiKQorICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpFTkNPREVSICAmIEQ6OlJBVykpOworICAgIGFkZChDb25maWdNYXBwZXIoImNvbG9yLW1hdHJpeCIsICAgICAgICBDMl9QQVJBTUtFWV9WVUlfQ09MT1JfQVNQRUNUUywgICAibWF0cml4IikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6RU5DT0RFUiAgJiBEOjpSQVcpKTsKKworICAgIC8vIERhdGFzcGFjZQorICAgIGFkZChDb25maWdNYXBwZXIoImFuZHJvaWQuX2RhdGFzcGFjZSIsIEMyX1BBUkFNS0VZX0RBVEFfU1BBQ0UsICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OlJBVykpOworCisgICAgLy8gSERSCisgICAgYWRkKENvbmZpZ01hcHBlcigic21wdGUyMDg2LnJlZC54IiwgQzJfUEFSQU1LRVlfSERSX1NUQVRJQ19JTkZPLCAibWFzdGVyaW5nLnJlZC54IikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6UkFXKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcigic21wdGUyMDg2LnJlZC55IiwgQzJfUEFSQU1LRVlfSERSX1NUQVRJQ19JTkZPLCAibWFzdGVyaW5nLnJlZC55IikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6UkFXKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcigic21wdGUyMDg2LmdyZWVuLngiLCBDMl9QQVJBTUtFWV9IRFJfU1RBVElDX0lORk8sICJtYXN0ZXJpbmcuZ3JlZW4ueCIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OlJBVykpOworICAgIGFkZChDb25maWdNYXBwZXIoInNtcHRlMjA4Ni5ncmVlbi55IiwgQzJfUEFSQU1LRVlfSERSX1NUQVRJQ19JTkZPLCAibWFzdGVyaW5nLmdyZWVuLnkiKQorICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpSQVcpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKCJzbXB0ZTIwODYuYmx1ZS54IiwgQzJfUEFSQU1LRVlfSERSX1NUQVRJQ19JTkZPLCAibWFzdGVyaW5nLmJsdWUueCIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OlJBVykpOworICAgIGFkZChDb25maWdNYXBwZXIoInNtcHRlMjA4Ni5ibHVlLnkiLCBDMl9QQVJBTUtFWV9IRFJfU1RBVElDX0lORk8sICJtYXN0ZXJpbmcuYmx1ZS55IikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6UkFXKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcigic21wdGUyMDg2LndoaXRlLngiLCBDMl9QQVJBTUtFWV9IRFJfU1RBVElDX0lORk8sICJtYXN0ZXJpbmcud2hpdGUueCIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OlJBVykpOworICAgIGFkZChDb25maWdNYXBwZXIoInNtcHRlMjA4Ni53aGl0ZS55IiwgQzJfUEFSQU1LRVlfSERSX1NUQVRJQ19JTkZPLCAibWFzdGVyaW5nLndoaXRlLnkiKQorICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpSQVcpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKCJzbXB0ZTIwODYubWF4LWx1bWluYW5jZSIsIEMyX1BBUkFNS0VZX0hEUl9TVEFUSUNfSU5GTywgIm1hc3RlcmluZy5tYXgtbHVtaW5hbmNlIikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6UkFXKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcigic21wdGUyMDg2Lm1pbi1sdW1pbmFuY2UiLCBDMl9QQVJBTUtFWV9IRFJfU1RBVElDX0lORk8sICJtYXN0ZXJpbmcubWluLWx1bWluYW5jZSIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OlJBVykpOworICAgIGFkZChDb25maWdNYXBwZXIoImN0YTg2MS5tYXgtY2xsIiwgQzJfUEFSQU1LRVlfSERSX1NUQVRJQ19JTkZPLCAibWF4LWNsbCIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OlJBVykpOworICAgIGFkZChDb25maWdNYXBwZXIoImN0YTg2MS5tYXgtZmFsbCIsIEMyX1BBUkFNS0VZX0hEUl9TVEFUSUNfSU5GTywgIm1heC1mYWxsIikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6UkFXKSk7CisKKyAgICBhZGQoQ29uZmlnTWFwcGVyKHN0ZDo6c3RyaW5nKEtFWV9GRUFUVVJFXykgKyBGRUFUVVJFX1NlY3VyZVBsYXliYWNrLAorICAgICAgICAgICAgICAgICAgICAgQzJfUEFSQU1LRVlfU0VDVVJFX01PREUsICJ2YWx1ZSIpKTsKKworICAgIGFkZChDb25maWdNYXBwZXIoInByZXBlbmQtc3BzLXBwcy10by1pZHItZnJhbWVzIiwKKyAgICAgICAgICAgICAgICAgICAgIEMyX1BBUkFNS0VZX1BSRVBFTkRfSEVBREVSX01PREUsICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OkVOQ09ERVIgJiBEOjpWSURFTykKKyAgICAgICAgLndpdGhNYXBwZXIoW10oQzJWYWx1ZSB2KSAtPiBDMlZhbHVlIHsKKyAgICAgICAgICAgIGludDMyX3QgdmFsdWU7CisgICAgICAgICAgICBpZiAodi5nZXQoJnZhbHVlKSAmJiB2YWx1ZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBDMlZhbHVlKEMyQ29uZmlnOjpQUkVQRU5EX0hFQURFUl9UT19BTExfU1lOQyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBDMlZhbHVlKEMyQ29uZmlnOjpQUkVQRU5EX0hFQURFUl9UT19OT05FKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSkpOworICAgIC8vIHJlbW92ZSB3aGVuIGNvZGVjcyBzd2l0Y2ggdG8gUEFSQU1LRVkKKyAgICBkZXByZWNhdGVkKENvbmZpZ01hcHBlcigicHJlcGVuZC1zcHMtcHBzLXRvLWlkci1mcmFtZXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb2RpbmcuYWRkLWNzZC10by1zeW5jLWZyYW1lcyIsICJ2YWx1ZSIpCisgICAgICAgICAgICAgICAubGltaXRUbyhEOjpFTkNPREVSICYgRDo6VklERU8pKTsKKyAgICAvLyBjb252ZXJ0IHRvIHRpbWVzdGFtcCBiYXNlCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfSV9GUkFNRV9JTlRFUlZBTCwgQzJfUEFSQU1LRVlfU1lOQ19GUkFNRV9JTlRFUlZBTCwgInZhbHVlIikKKyAgICAgICAgLndpdGhNYXBwZXIoW10oQzJWYWx1ZSB2KSAtPiBDMlZhbHVlIHsKKyAgICAgICAgICAgIC8vIGNvbnZlcnQgZnJvbSBpMzIgdG8gZmxvYXQKKyAgICAgICAgICAgIGludDMyX3QgaTMyVmFsdWU7CisgICAgICAgICAgICBmbG9hdCBmcFZhbHVlOworICAgICAgICAgICAgaWYgKHYuZ2V0KCZpMzJWYWx1ZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaW50NjRfdCgxMDAwMDAwKSAqIGkzMlZhbHVlOworICAgICAgICAgICAgfSBlbHNlIGlmICh2LmdldCgmZnBWYWx1ZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaW50NjRfdChjMl9taW4oMTAwMDAwMCAqIGZwVmFsdWUgKyAwLjUsIChkb3VibGUpSU5UNjRfTUFYKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQzJWYWx1ZSgpOworICAgICAgICB9KSk7CisgICAgLy8gcmVtb3ZlIHdoZW4gY29kZWNzIHN3aXRjaCB0byBwcm9wZXIgY29kaW5nLmdvcCAoYWRkIHN1cHBvcnQgZm9yIGNhbGN1bGF0aW5nIGdvcCkKKyAgICBkZXByZWNhdGVkKENvbmZpZ01hcHBlcigiaS1mcmFtZS1wZXJpb2QiLCAiY29kaW5nLmdvcCIsICJpbnRyYS1wZXJpb2QiKQorICAgICAgICAgICAgICAgLmxpbWl0VG8oRDo6RU5DT0RFUiAmIEQ6OlZJREVPKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfSU5UUkFfUkVGUkVTSF9QRVJJT0QsIEMyX1BBUkFNS0VZX0lOVFJBX1JFRlJFU0gsICJwZXJpb2QiKQorICAgICAgICAubGltaXRUbyhEOjpWSURFTyAmIEQ6OkVOQ09ERVIpCisgICAgICAgIC53aXRoTWFwcGVycyhtYWtlRmxvYXQsIFtdKEMyVmFsdWUgdikgLT4gQzJWYWx1ZSB7CisgICAgICAgICAgICAvLyByZWFkIGJhY2sgYWx3YXlzIGFzIGludAorICAgICAgICAgICAgZmxvYXQgdmFsdWU7CisgICAgICAgICAgICBpZiAodi5nZXQoJnZhbHVlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiAoaW50MzJfdCl2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBDMlZhbHVlKCk7CisgICAgICAgIH0pKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9RVUFMSVRZLCBDMl9QQVJBTUtFWV9RVUFMSVRZLCAidmFsdWUiKSk7CisgICAgZGVwcmVjYXRlZChDb25maWdNYXBwZXIoUEFSQU1FVEVSX0tFWV9SRVFVRVNUX1NZTkNfRlJBTUUsCisgICAgICAgICAgICAgICAgICAgICAiY29kaW5nLnJlcXVlc3Qtc3luYyIsICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OlBBUkFNICYgRDo6RU5DT0RFUikKKyAgICAgICAgLndpdGhNYXBwZXIoW10oQzJWYWx1ZSkgLT4gQzJWYWx1ZSB7IHJldHVybiB1aW50MzJfdCgxKTsgfSkpOworICAgIGFkZChDb25maWdNYXBwZXIoUEFSQU1FVEVSX0tFWV9SRVFVRVNUX1NZTkNfRlJBTUUsCisgICAgICAgICAgICAgICAgICAgICBDMl9QQVJBTUtFWV9SRVFVRVNUX1NZTkNfRlJBTUUsICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OlBBUkFNICYgRDo6RU5DT0RFUikKKyAgICAgICAgLndpdGhNYXBwZXIoW10oQzJWYWx1ZSkgLT4gQzJWYWx1ZSB7IHJldHVybiB1aW50MzJfdCgxKTsgfSkpOworCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfT1BFUkFUSU5HX1JBVEUsICAgQzJfUEFSQU1LRVlfT1BFUkFUSU5HX1JBVEUsICAgICAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpQQVJBTSB8IEQ6OkNPTkZJRykgLy8gd3JpdGUtb25seQorICAgICAgICAud2l0aE1hcHBlcihtYWtlRmxvYXQpKTsKKyAgICAvLyBDMiBwcmlvcml0aWVzIGFyZSBpbnZlcnRlZAorICAgIGFkZChDb25maWdNYXBwZXIoS0VZX1BSSU9SSVRZLCAgICAgICAgIEMyX1BBUkFNS0VZX1BSSU9SSVRZLCAgICAgICAgICAgInZhbHVlIikKKyAgICAgICAgLndpdGhNYXBwZXJzKG5lZ2F0ZSwgbmVnYXRlKSk7CisgICAgLy8gcmVtb3ZlIHdoZW4gY29kZWNzIHN3aXRjaCB0byBQQVJBTUtFWQorICAgIGRlcHJlY2F0ZWQoQ29uZmlnTWFwcGVyKEtFWV9PUEVSQVRJTkdfUkFURSwgICAiY3RybC5vcGVyYXRpbmctcmF0ZSIsICAgICAidmFsdWUiKQorICAgICAgICAgICAgICAgLndpdGhNYXBwZXIobWFrZUZsb2F0KSk7CisgICAgZGVwcmVjYXRlZChDb25maWdNYXBwZXIoS0VZX1BSSU9SSVRZLCAgICAgICAgICJjdHJsLnByaW9yaXR5IiwgICAgICAgICAgICJ2YWx1ZSIpKTsKKworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX1dJRFRILCAgICAgICAgIEMyX1BBUkFNS0VZX1BJQ1RVUkVfU0laRSwgICAgICAgIndpZHRoIikKKyAgICAgICAgLmxpbWl0VG8oRDo6VklERU8gfCBEOjpJTUFHRSkpOworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0hFSUdIVCwgICAgICAgIEMyX1BBUkFNS0VZX1BJQ1RVUkVfU0laRSwgICAgICAgImhlaWdodCIpCisgICAgICAgIC5saW1pdFRvKEQ6OlZJREVPIHwgRDo6SU1BR0UpKTsKKworICAgIGFkZChDb25maWdNYXBwZXIoImNyb3AtbGVmdCIsICAgICAgIEMyX1BBUkFNS0VZX0NST1BfUkVDVCwgICAgICAgImxlZnQiKQorICAgICAgICAubGltaXRUbyhEOjpWSURFTyB8IEQ6OklNQUdFKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcigiY3JvcC10b3AiLCAgICAgICAgQzJfUEFSQU1LRVlfQ1JPUF9SRUNULCAgICAgICAidG9wIikKKyAgICAgICAgLmxpbWl0VG8oRDo6VklERU8gfCBEOjpJTUFHRSkpOworICAgIGFkZChDb25maWdNYXBwZXIoImNyb3Atd2lkdGgiLCAgICAgIEMyX1BBUkFNS0VZX0NST1BfUkVDVCwgICAgICAgIndpZHRoIikKKyAgICAgICAgLmxpbWl0VG8oRDo6VklERU8gfCBEOjpJTUFHRSkpOworICAgIGFkZChDb25maWdNYXBwZXIoImNyb3AtaGVpZ2h0IiwgICAgIEMyX1BBUkFNS0VZX0NST1BfUkVDVCwgICAgICAgImhlaWdodCIpCisgICAgICAgIC5saW1pdFRvKEQ6OlZJREVPIHwgRDo6SU1BR0UpKTsKKworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX01BWF9XSURUSCwgICAgIEMyX1BBUkFNS0VZX01BWF9QSUNUVVJFX1NJWkUsICAgICJ3aWR0aCIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OlJBVykpOworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX01BWF9IRUlHSFQsICAgIEMyX1BBUkFNS0VZX01BWF9QSUNUVVJFX1NJWkUsICAgICJoZWlnaHQiKQorICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpSQVcpKTsKKworICAgIGFkZChDb25maWdNYXBwZXIoImNzZC0wIiwgICAgICAgICAgIEMyX1BBUkFNS0VZX0lOSVRfREFUQSwgICAgICAgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6T1VUUFVUICYgRDo6UkVBRCkpOworCisgICAgYWRkKENvbmZpZ01hcHBlcihDMl9QQVJBTUtFWV9URU1QT1JBTF9MQVlFUklORywgQzJfUEFSQU1LRVlfVEVNUE9SQUxfTEFZRVJJTkcsICIiKQorICAgICAgICAubGltaXRUbyhEOjpFTkNPREVSICYgRDo6VklERU8gJiBEOjpPVVRQVVQpKTsKKworICAgIC8vIFBpeGVsIEZvcm1hdCAodXNlIGxvY2FsIGtleSBmb3IgYWN0dWFsIHBpeGVsIGZvcm1hdCBhcyB3ZSBkb24ndCBkaXN0aW5ndWlzaCBiZXR3ZWVuCisgICAgLy8gU0RLIGxheW91dHMgZm9yIGZsZXhpYmxlIGZvcm1hdCBhbmQgd2UgbmVlZCB0aGUgYWN0dWFsIFNESyBjb2xvciBmb3JtYXQgaW4gdGhlIG1lZGlhIGZvcm1hdCkKKyAgICBhZGQoQ29uZmlnTWFwcGVyKCJhbmRyb2lkLl9jb2xvci1mb3JtYXQiLCAgQzJfUEFSQU1LRVlfUElYRUxfRk9STUFULCAidmFsdWUiKQorICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpSQVcpCisgICAgICAgIC53aXRoTWFwcGVycyhbXShDMlZhbHVlIHYpIC0+IEMyVmFsdWUgeworICAgICAgICAgICAgaW50MzJfdCB2YWx1ZTsKKyAgICAgICAgICAgIGlmICh2LmdldCgmdmFsdWUpKSB7CisgICAgICAgICAgICAgICAgc3dpdGNoICh2YWx1ZSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFN1cmZhY2U6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHVpbnQzMl90KUhBTF9QSVhFTF9GT1JNQVRfSU1QTEVNRU5UQVRJT05fREVGSU5FRDsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRZVVY0MjBGbGV4aWJsZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAodWludDMyX3QpSEFMX1BJWEVMX0ZPUk1BVF9ZQ0JDUl80MjBfODg4OworICAgICAgICAgICAgICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyOgorICAgICAgICAgICAgICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVjQyMFBhY2tlZFBsYW5hcjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRZVVY0MjBQYWNrZWRTZW1pUGxhbmFyOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh1aW50MzJfdClIQUxfUElYRUxfRk9STUFUX1lWMTI7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBzdXBwb3J0IHNvbWUgc29ydCBvZiBwYXNzdGhyb3VnaAorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIEMyVmFsdWUoKTsKKyAgICAgICAgfSwgW10oQzJWYWx1ZSB2KSAtPiBDMlZhbHVlIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHZhbHVlOworICAgICAgICAgICAgaWYgKHYuZ2V0KCZ2YWx1ZSkpIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHZhbHVlKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9JTVBMRU1FTlRBVElPTl9ERUZJTkVEOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENPTE9SX0Zvcm1hdFN1cmZhY2U7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyOgorICAgICAgICAgICAgICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfWUNCQ1JfNDIwXzg4ODoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBDT0xPUl9Gb3JtYXRZVVY0MjBGbGV4aWJsZTsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IHN1cHBvcnQgc29tZSBzb3J0IG9mIHBhc3N0aHJvdWdoCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQzJWYWx1ZSgpOworICAgICAgICB9KSk7CisKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9DSEFOTkVMX0NPVU5ULCBDMl9QQVJBTUtFWV9DSEFOTkVMX0NPVU5ULCAgICAgICAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpBVURJTykpOyAvLyByZWFkIGJhY2sgdG8gYm90aCBmb3JtYXRzCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfQ0hBTk5FTF9DT1VOVCwgQzJfUEFSQU1LRVlfQ09ERURfQ0hBTk5FTF9DT1VOVCwgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6QVVESU8gJiBEOjpDT0RFRCkpOworCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfU0FNUExFX1JBVEUsICAgQzJfUEFSQU1LRVlfU0FNUExFX1JBVEUsICAgICAgICAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpBVURJTykpOyAvLyByZWFkIGJhY2sgdG8gYm90aCBwb3J0IGZvcm1hdHMKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9TQU1QTEVfUkFURSwgICBDMl9QQVJBTUtFWV9DT0RFRF9TQU1QTEVfUkFURSwgICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OkFVRElPICYgRDo6Q09ERUQpKTsKKworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX1BDTV9FTkNPRElORywgIEMyX1BBUkFNS0VZX1BDTV9FTkNPRElORywgICAgICAgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6QVVESU8pKTsKKworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0lTX0FEVFMsIEMyX1BBUkFNS0VZX0FBQ19QQUNLQUdJTkcsICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OkFVRElPICYgRDo6Q09ERUQpCisgICAgICAgIC53aXRoTWFwcGVycyhbXShDMlZhbHVlIHYpIC0+IEMyVmFsdWUgeworICAgICAgICAgICAgaW50MzJfdCB2YWx1ZTsKKyAgICAgICAgICAgIGlmICh2LmdldCgmdmFsdWUpICYmIHZhbHVlKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEMyQ29uZmlnOjpBQUNfUEFDS0FHSU5HX0FEVFM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQzJWYWx1ZSgpOworICAgICAgICB9LCBbXShDMlZhbHVlIHYpIC0+IEMyVmFsdWUgeworICAgICAgICAgICAgdWludDMyX3QgdmFsdWU7CisgICAgICAgICAgICBpZiAodi5nZXQoJnZhbHVlKSAmJiB2YWx1ZSA9PSBDMkNvbmZpZzo6QUFDX1BBQ0tBR0lOR19BRFRTKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIChpbnQzMl90KTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQzJWYWx1ZSgpOworICAgICAgICB9KSk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJNYXBwZXI6OlByb2ZpbGVMZXZlbE1hcHBlcj4gbWFwcGVyID0KKyAgICAgICAgQzJNYXBwZXI6OkdldFByb2ZpbGVMZXZlbE1hcHBlcihtQ29kaW5nTWVkaWFUeXBlKTsKKworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX1BST0ZJTEUsIEMyX1BBUkFNS0VZX1BST0ZJTEVfTEVWRUwsICJwcm9maWxlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6Q09ERUQpCisgICAgICAgIC53aXRoTWFwcGVycyhbbWFwcGVyXShDMlZhbHVlIHYpIC0+IEMyVmFsdWUgeworICAgICAgICAgICAgQzJDb25maWc6OnByb2ZpbGVfdCBjMiA9IFBST0ZJTEVfVU5VU0VEOworICAgICAgICAgICAgaW50MzJfdCBzZGs7CisgICAgICAgICAgICBpZiAobWFwcGVyICYmIHYuZ2V0KCZzZGspICYmIG1hcHBlci0+bWFwUHJvZmlsZShzZGssICZjMikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYzI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gUFJPRklMRV9VTlVTRUQ7CisgICAgICAgIH0sIFttYXBwZXJdKEMyVmFsdWUgdikgLT4gQzJWYWx1ZSB7CisgICAgICAgICAgICBDMkNvbmZpZzo6cHJvZmlsZV90IGMyOworICAgICAgICAgICAgaW50MzJfdCBzZGs7CisgICAgICAgICAgICB1c2luZyBDMlZhbHVlVHlwZT10eXBlbmFtZSBfYzJfcmVkdWNlX2VudW1fdG9fdW5kZXJseWluZ190eXBlPGRlY2x0eXBlKGMyKT46OnR5cGU7CisgICAgICAgICAgICBpZiAobWFwcGVyICYmIHYuZ2V0KChDMlZhbHVlVHlwZSopJmMyKSAmJiBtYXBwZXItPm1hcFByb2ZpbGUoYzIsICZzZGspKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHNkazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBDMlZhbHVlKCk7CisgICAgICAgIH0pKTsKKworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0xFVkVMLCBDMl9QQVJBTUtFWV9QUk9GSUxFX0xFVkVMLCAibGV2ZWwiKQorICAgICAgICAubGltaXRUbyhEOjpDT0RFRCkKKyAgICAgICAgLndpdGhNYXBwZXJzKFttYXBwZXJdKEMyVmFsdWUgdikgLT4gQzJWYWx1ZSB7CisgICAgICAgICAgICBDMkNvbmZpZzo6bGV2ZWxfdCBjMiA9IExFVkVMX1VOVVNFRDsKKyAgICAgICAgICAgIGludDMyX3Qgc2RrOworICAgICAgICAgICAgaWYgKG1hcHBlciAmJiB2LmdldCgmc2RrKSAmJiBtYXBwZXItPm1hcExldmVsKHNkaywgJmMyKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBjMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBMRVZFTF9VTlVTRUQ7CisgICAgICAgIH0sIFttYXBwZXJdKEMyVmFsdWUgdikgLT4gQzJWYWx1ZSB7CisgICAgICAgICAgICBDMkNvbmZpZzo6bGV2ZWxfdCBjMjsKKyAgICAgICAgICAgIGludDMyX3Qgc2RrOworICAgICAgICAgICAgdXNpbmcgQzJWYWx1ZVR5cGU9dHlwZW5hbWUgX2MyX3JlZHVjZV9lbnVtX3RvX3VuZGVybHlpbmdfdHlwZTxkZWNsdHlwZShjMik+Ojp0eXBlOworICAgICAgICAgICAgaWYgKG1hcHBlciAmJiB2LmdldCgoQzJWYWx1ZVR5cGUqKSZjMikgJiYgbWFwcGVyLT5tYXBMZXZlbChjMiwgJnNkaykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc2RrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIEMyVmFsdWUoKTsKKyAgICAgICAgfSkpOworCisgICAgLy8gY29udmVydCB0byBkQkZTIGFuZCBhZGQgZGVmYXVsdAorICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0FBQ19EUkNfVEFSR0VUX1JFRkVSRU5DRV9MRVZFTCwgQzJfUEFSQU1LRVlfRFJDX1RBUkdFVF9SRUZFUkVOQ0VfTEVWRUwsICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OkFVRElPICYgRDo6REVDT0RFUikKKyAgICAgICAgLndpdGhNYXBwZXIoW10oQzJWYWx1ZSB2KSAtPiBDMlZhbHVlIHsKKyAgICAgICAgICAgIGludDMyX3QgdmFsdWU7CisgICAgICAgICAgICBpZiAoIXYuZ2V0KCZ2YWx1ZSkgfHwgdmFsdWUgPCAwKSB7CisgICAgICAgICAgICAgICAgdmFsdWUgPSBwcm9wZXJ0eV9nZXRfaW50MzIoUFJPUF9EUkNfT1ZFUlJJREVfUkVGX0xFVkVMLCBEUkNfREVGQVVMVF9NT0JJTEVfUkVGX0xFVkVMKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmbG9hdCgtMC4yNSAqIGMyX21pbih2YWx1ZSwgMTI3KSk7CisgICAgICAgIH0pKTsKKworICAgIC8vIGNvbnZlcnQgdG8gMC0xICglKSBhbmQgYWRkIGRlZmF1bHQKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9BQUNfRFJDX0FUVEVOVUFUSU9OX0ZBQ1RPUiwgQzJfUEFSQU1LRVlfRFJDX0FUVEVOVUFUSU9OX0ZBQ1RPUiwgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6QVVESU8gJiBEOjpERUNPREVSKQorICAgICAgICAud2l0aE1hcHBlcihbXShDMlZhbHVlIHYpIC0+IEMyVmFsdWUgeworICAgICAgICAgICAgaW50MzJfdCB2YWx1ZTsKKyAgICAgICAgICAgIGlmICghdi5nZXQoJnZhbHVlKSB8fCB2YWx1ZSA8IDApIHsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IHByb3BlcnR5X2dldF9pbnQzMihQUk9QX0RSQ19PVkVSUklERV9DVVQsIERSQ19ERUZBVUxUX01PQklMRV9EUkNfQ1VUKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmbG9hdChjMl9taW4odmFsdWUsIDEyNykgLyAxMjcuKTsKKyAgICAgICAgfSkpOworCisgICAgLy8gY29udmVydCB0byAwLTEgKCUpIGFuZCBhZGQgZGVmYXVsdAorICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0FBQ19EUkNfQk9PU1RfRkFDVE9SLCBDMl9QQVJBTUtFWV9EUkNfQk9PU1RfRkFDVE9SLCAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpBVURJTyAmIEQ6OkRFQ09ERVIpCisgICAgICAgIC53aXRoTWFwcGVyKFtdKEMyVmFsdWUgdikgLT4gQzJWYWx1ZSB7CisgICAgICAgICAgICBpbnQzMl90IHZhbHVlOworICAgICAgICAgICAgaWYgKCF2LmdldCgmdmFsdWUpIHx8IHZhbHVlIDwgMCkgeworICAgICAgICAgICAgICAgIHZhbHVlID0gcHJvcGVydHlfZ2V0X2ludDMyKFBST1BfRFJDX09WRVJSSURFX0JPT1NULCBEUkNfREVGQVVMVF9NT0JJTEVfRFJDX0JPT1NUKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmbG9hdChjMl9taW4odmFsdWUsIDEyNykgLyAxMjcuKTsKKyAgICAgICAgfSkpOworCisgICAgLy8gY29udmVydCB0byBjb21wcmVzc2lvbiB0eXBlIGFuZCBhZGQgZGVmYXVsdAorICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0FBQ19EUkNfSEVBVllfQ09NUFJFU1NJT04sIEMyX1BBUkFNS0VZX0RSQ19DT01QUkVTU0lPTl9NT0RFLCAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpBVURJTyAmIEQ6OkRFQ09ERVIpCisgICAgICAgIC53aXRoTWFwcGVyKFtdKEMyVmFsdWUgdikgLT4gQzJWYWx1ZSB7CisgICAgICAgICAgICBpbnQzMl90IHZhbHVlOworICAgICAgICAgICAgaWYgKCF2LmdldCgmdmFsdWUpIHx8IHZhbHVlIDwgMCkgeworICAgICAgICAgICAgICAgIHZhbHVlID0gcHJvcGVydHlfZ2V0X2ludDMyKFBST1BfRFJDX09WRVJSSURFX0hFQVZZLCBEUkNfREVGQVVMVF9NT0JJTEVfRFJDX0hFQVZZKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB2YWx1ZSA9PSAxID8gQzJDb25maWc6OkRSQ19DT01QUkVTU0lPTl9IRUFWWSA6IEMyQ29uZmlnOjpEUkNfQ09NUFJFU1NJT05fTElHSFQ7CisgICAgICAgIH0pKTsKKworICAgIC8vIGNvbnZlcnQgdG8gZEJGUyBhbmQgYWRkIGRlZmF1bHQKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9BQUNfRU5DT0RFRF9UQVJHRVRfTEVWRUwsIEMyX1BBUkFNS0VZX0RSQ19FTkNPREVEX1RBUkdFVF9MRVZFTCwgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6QVVESU8gJiBEOjpERUNPREVSKQorICAgICAgICAud2l0aE1hcHBlcihbXShDMlZhbHVlIHYpIC0+IEMyVmFsdWUgeworICAgICAgICAgICAgaW50MzJfdCB2YWx1ZTsKKyAgICAgICAgICAgIGlmICghdi5nZXQoJnZhbHVlKSB8fCB2YWx1ZSA8IDApIHsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IHByb3BlcnR5X2dldF9pbnQzMihQUk9QX0RSQ19PVkVSUklERV9FTkNfTEVWRUwsIERSQ19ERUZBVUxUX01PQklMRV9FTkNfTEVWRUwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZsb2F0KC0wLjI1ICogYzJfbWluKHZhbHVlLCAxMjcpKTsKKyAgICAgICAgfSkpOworCisgICAgLy8gY29udmVydCB0byBlZmZlY3QgdHlwZSAodGhlc2UgbWFwIHRvIFNESyB2YWx1ZXMpIGFuZCBhZGQgZGVmYXVsdAorICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0FBQ19EUkNfRUZGRUNUX1RZUEUsIEMyX1BBUkFNS0VZX0RSQ19FRkZFQ1RfVFlQRSwgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6QVVESU8gJiBEOjpERUNPREVSKQorICAgICAgICAud2l0aE1hcHBlcihbXShDMlZhbHVlIHYpIC0+IEMyVmFsdWUgeworICAgICAgICAgICAgaW50MzJfdCB2YWx1ZTsKKyAgICAgICAgICAgIGlmICghdi5nZXQoJnZhbHVlKSB8fCB2YWx1ZSA8IC0xIHx8IHZhbHVlID4gOCkgeworICAgICAgICAgICAgICAgIHZhbHVlID0gcHJvcGVydHlfZ2V0X2ludDMyKFBST1BfRFJDX09WRVJSSURFX0VGRkVDVCwgRFJDX0RFRkFVTFRfTU9CSUxFX0RSQ19FRkZFQ1QpOworICAgICAgICAgICAgICAgIC8vIGVuc3VyZSB2YWx1ZSBpcyB3aXRoaW4gcmFuZ2UKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUgPCAtMSB8fCB2YWx1ZSA+IDgpIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBEUkNfREVGQVVMVF9NT0JJTEVfRFJDX0VGRkVDVDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgIH0pKTsKKworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0FBQ19NQVhfT1VUUFVUX0NIQU5ORUxfQ09VTlQsIEMyX1BBUkFNS0VZX01BWF9DSEFOTkVMX0NPVU5ULCAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpBVURJTykpOworCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfQUFDX1NCUl9NT0RFLCBDMl9QQVJBTUtFWV9BQUNfU0JSX01PREUsICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OkFVRElPICYgRDo6RU5DT0RFUiAmIEQ6OkNPTkZJRykKKyAgICAgICAgLndpdGhNYXBwZXIoW10oQzJWYWx1ZSB2KSAtPiBDMlZhbHVlIHsKKyAgICAgICAgICAgIGludDMyX3QgdmFsdWU7CisgICAgICAgICAgICBpZiAoIXYuZ2V0KCZ2YWx1ZSkgfHwgdmFsdWUgPCAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEMyQ29uZmlnOjpBQUNfU0JSX0FVVE87CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzd2l0Y2ggKHZhbHVlKSB7CisgICAgICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gQzJDb25maWc6OkFBQ19TQlJfT0ZGOworICAgICAgICAgICAgICAgIGNhc2UgMTogcmV0dXJuIEMyQ29uZmlnOjpBQUNfU0JSX1NJTkdMRV9SQVRFOworICAgICAgICAgICAgICAgIGNhc2UgMjogcmV0dXJuIEMyQ29uZmlnOjpBQUNfU0JSX0RVQUxfUkFURTsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OiByZXR1cm4gQzJDb25maWc6OkFBQ19TQlJfQVVUTyArIDE7IC8vIGludmFsaWQgdmFsdWUKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSkpOworCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfUVVBTElUWSwgQzJfUEFSQU1LRVlfUVVBTElUWSwgInZhbHVlIikpOworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0ZMQUNfQ09NUFJFU1NJT05fTEVWRUwsIEMyX1BBUkFNS0VZX0NPTVBMRVhJVFksICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OkFVRElPICYgRDo6RU5DT0RFUikpOworICAgIGFkZChDb25maWdNYXBwZXIoImNvbXBsZXhpdHkiLCBDMl9QQVJBTUtFWV9DT01QTEVYSVRZLCAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpFTkNPREVSKSk7CisKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9HUklEX0NPTFVNTlMsIEMyX1BBUkFNS0VZX1RJTEVfTEFZT1VULCAiY29sdW1ucyIpCisgICAgICAgIC5saW1pdFRvKEQ6OklNQUdFKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfR1JJRF9ST1dTLCBDMl9QQVJBTUtFWV9USUxFX0xBWU9VVCwgInJvd3MiKQorICAgICAgICAubGltaXRUbyhEOjpJTUFHRSkpOworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX1RJTEVfV0lEVEgsIEMyX1BBUkFNS0VZX1RJTEVfTEFZT1VULCAidGlsZS53aWR0aCIpCisgICAgICAgIC5saW1pdFRvKEQ6OklNQUdFKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfVElMRV9IRUlHSFQsIEMyX1BBUkFNS0VZX1RJTEVfTEFZT1VULCAidGlsZS5oZWlnaHQiKQorICAgICAgICAubGltaXRUbyhEOjpJTUFHRSkpOworCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfTEFURU5DWSwgQzJfUEFSQU1LRVlfUElQRUxJTkVfREVMQVlfUkVRVUVTVCwgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6VklERU8gJiBEOjpFTkNPREVSKSk7CisKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEMyX1BBUkFNS0VZX0lOUFVUX1RJTUVfU1RSRVRDSCwgQzJfUEFSQU1LRVlfSU5QVVRfVElNRV9TVFJFVENILCAidmFsdWUiKSk7CisKKyAgICAvKiBzdGlsbCB0byBkbworICAgIGNvbnN0ZXhwciBjaGFyIEtFWV9QVVNIX0JMQU5LX0JVRkZFUlNfT05fU1RPUFtdID0gInB1c2gtYmxhbmstYnVmZmVycy1vbi1zaHV0ZG93biI7CisKKyAgICAgICBub3QgeWV0IHVzZWQgYnkgTWVkaWFDb2RlYywgYnV0IGRlZmluZWQgYXMgTWVkaWFGb3JtYXQKKyAgICBLRVlfQVVESU9fU0VTU0lPTl9JRCAvLyB3ZSB1c2UgImF1ZGlvLWh3LXN5bmMiCisgICAgS0VZX09VVFBVVF9SRU9SREVSX0RFUFRICisgICAgKi8KK30KKworc3RhdHVzX3QgQ0NvZGVjQ29uZmlnOjppbml0aWFsaXplKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50PiAmY2xpZW50LAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+ICZjb21wb25lbnQpIHsKKyAgICBDMkNvbXBvbmVudERvbWFpblNldHRpbmcgZG9tYWluKEMyQ29tcG9uZW50OjpET01BSU5fT1RIRVIpOworICAgIEMyQ29tcG9uZW50S2luZFNldHRpbmcga2luZChDMkNvbXBvbmVudDo6S0lORF9PVEhFUik7CisKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IHF1ZXJpZWQ7CisgICAgYzJfc3RhdHVzX3QgYzJlcnIgPSBjb21wb25lbnQtPnF1ZXJ5KHsgJmRvbWFpbiwgJmtpbmQgfSwge30sIEMyX0RPTlRfQkxPQ0ssICZxdWVyaWVkKTsKKyAgICBpZiAoYzJlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0QoIlF1ZXJ5IGRvbWFpbiAmIGtpbmQgZmFpbGVkID0+ICVzIiwgYXNTdHJpbmcoYzJlcnIpKTsKKyAgICAgICAgLy8gVEVNUDogZGV0ZXJtaW5lIGtpbmQgZnJvbSBjb21wb25lbnQgbmFtZQorICAgICAgICBpZiAoa2luZC52YWx1ZSA9PSBDMkNvbXBvbmVudDo6S0lORF9PVEhFUikgeworICAgICAgICAgICAgaWYgKGNvbXBvbmVudC0+Z2V0TmFtZSgpLmZpbmQoImVuY29kZXIiKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICAgICAgICAgIGtpbmQudmFsdWUgPSBDMkNvbXBvbmVudDo6S0lORF9FTkNPREVSOworICAgICAgICAgICAgfSBlbHNlIGlmIChjb21wb25lbnQtPmdldE5hbWUoKS5maW5kKCJkZWNvZGVyIikgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgICAgICAgICBraW5kLnZhbHVlID0gQzJDb21wb25lbnQ6OktJTkRfREVDT0RFUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFRFTVA6IGRldGVybWluZSBkb21haW4gZnJvbSBtZWRpYSB0eXBlIChwb3J0IChwcmVmZXJyZWQpIG9yIHN0cmVhbSAjMCkKKyAgICAgICAgaWYgKGRvbWFpbi52YWx1ZSA9PSBDMkNvbXBvbmVudDo6RE9NQUlOX09USEVSKSB7CisgICAgICAgICAgICBBU3RyaW5nIG1lZGlhVHlwZSA9IFF1ZXJ5TWVkaWFUeXBlKHRydWUgLyogaW5wdXQgKi8sIGNvbXBvbmVudCk7CisgICAgICAgICAgICBpZiAobWVkaWFUeXBlLnN0YXJ0c1dpdGgoImF1ZGlvLyIpKSB7CisgICAgICAgICAgICAgICAgZG9tYWluLnZhbHVlID0gQzJDb21wb25lbnQ6OkRPTUFJTl9BVURJTzsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobWVkaWFUeXBlLnN0YXJ0c1dpdGgoInZpZGVvLyIpKSB7CisgICAgICAgICAgICAgICAgZG9tYWluLnZhbHVlID0gQzJDb21wb25lbnQ6OkRPTUFJTl9WSURFTzsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobWVkaWFUeXBlLnN0YXJ0c1dpdGgoImltYWdlLyIpKSB7CisgICAgICAgICAgICAgICAgZG9tYWluLnZhbHVlID0gQzJDb21wb25lbnQ6OkRPTUFJTl9JTUFHRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIG1Eb21haW4gPSAoZG9tYWluLnZhbHVlID09IEMyQ29tcG9uZW50OjpET01BSU5fVklERU8gPyBEb21haW46OklTX1ZJREVPIDoKKyAgICAgICAgICAgICAgIGRvbWFpbi52YWx1ZSA9PSBDMkNvbXBvbmVudDo6RE9NQUlOX0lNQUdFID8gRG9tYWluOjpJU19JTUFHRSA6CisgICAgICAgICAgICAgICBkb21haW4udmFsdWUgPT0gQzJDb21wb25lbnQ6OkRPTUFJTl9BVURJTyA/IERvbWFpbjo6SVNfQVVESU8gOiBEb21haW46Ok9USEVSX0RPTUFJTikKKyAgICAgICAgICAgIHwgKGtpbmQudmFsdWUgPT0gQzJDb21wb25lbnQ6OktJTkRfREVDT0RFUiA/IERvbWFpbjo6SVNfREVDT0RFUiA6CisgICAgICAgICAgICAgICBraW5kLnZhbHVlID09IEMyQ29tcG9uZW50OjpLSU5EX0VOQ09ERVIgPyBEb21haW46OklTX0VOQ09ERVIgOiBEb21haW46Ok9USEVSX0tJTkQpOworCisgICAgbUlucHV0RG9tYWluID0gRG9tYWluKCgobURvbWFpbiAmIElTX0RFQ09ERVIpID8gSVNfQ09ERUQgOiBJU19SQVcpIHwgSVNfSU5QVVQpOworICAgIG1PdXRwdXREb21haW4gPSBEb21haW4oKChtRG9tYWluICYgSVNfRU5DT0RFUikgPyBJU19DT0RFRCA6IElTX1JBVykgfCBJU19PVVRQVVQpOworCisgICAgQUxPR1YoImRvbWFpbiBpcyAlI3ggKCV1ICV1KSIsIG1Eb21haW4sIGRvbWFpbi52YWx1ZSwga2luZC52YWx1ZSk7CisKKyAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gcGFyYW1JbmRpY2VzOworICAgIHN3aXRjaCAoa2luZC52YWx1ZSkgeworICAgIGNhc2UgQzJDb21wb25lbnQ6OktJTkRfREVDT0RFUjoKKyAgICAgICAgbUNvZGluZ01lZGlhVHlwZSA9IFF1ZXJ5TWVkaWFUeXBlKHRydWUgLyogaW5wdXQgKi8sIGNvbXBvbmVudCkuY19zdHIoKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDMkNvbXBvbmVudDo6S0lORF9FTkNPREVSOgorICAgICAgICBtQ29kaW5nTWVkaWFUeXBlID0gUXVlcnlNZWRpYVR5cGUoZmFsc2UgLyogaW5wdXQgKi8sIGNvbXBvbmVudCkuY19zdHIoKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgbUNvZGluZ01lZGlhVHlwZSA9ICIiOworICAgIH0KKworICAgIGMyZXJyID0gY29tcG9uZW50LT5xdWVyeVN1cHBvcnRlZFBhcmFtcygmbVBhcmFtRGVzY3MpOworICAgIGlmIChjMmVyciAhPSBDMl9PSykgeworICAgICAgICBBTE9HRCgiUXVlcnkgc3VwcG9ydGVkIHBhcmFtcyBmYWlsZWQgYWZ0ZXIgcmV0dXJuaW5nICV6dSB2YWx1ZXMgPT4gJXMiLAorICAgICAgICAgICAgICAgIG1QYXJhbURlc2NzLnNpemUoKSwgYXNTdHJpbmcoYzJlcnIpKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorICAgIGZvciAoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPiAmZGVzYyA6IG1QYXJhbURlc2NzKSB7CisgICAgICAgIG1TdXBwb3J0ZWRJbmRpY2VzLmVtcGxhY2UoZGVzYy0+aW5kZXgoKSk7CisgICAgfQorCisgICAgbVJlZmxlY3RvciA9IGNsaWVudC0+Z2V0UGFyYW1SZWZsZWN0b3IoKTsKKyAgICBpZiAobVJlZmxlY3RvciA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZ2V0IHBhcmFtIHJlZmxlY3RvciIpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICAvLyBlbnVtZXJhdGUgYWxsIGZpZWxkcworICAgIG1QYXJhbVVwZGF0ZXIgPSBzdGQ6Om1ha2Vfc2hhcmVkPFJlZmxlY3RlZFBhcmFtVXBkYXRlcj4oKTsKKyAgICBtUGFyYW1VcGRhdGVyLT5jbGVhcigpOworICAgIG1QYXJhbVVwZGF0ZXItPnN1cHBvcnRXaG9sZVBhcmFtKAorICAgICAgICAgICAgQzJfUEFSQU1LRVlfVEVNUE9SQUxfTEFZRVJJTkcsIEMyU3RyZWFtVGVtcG9yYWxMYXllcmluZ1R1bmluZzo6Q09SRV9JTkRFWCk7CisgICAgbVBhcmFtVXBkYXRlci0+YWRkUGFyYW1EZXNjKG1SZWZsZWN0b3IsIG1QYXJhbURlc2NzKTsKKworICAgIC8vIFRFTVA6IGFkZCBzb21lIHN0YW5kYXJkIGZpZWxkcyBldmVuIGlmIG5vdCByZWZsZWN0ZWQKKyAgICBpZiAoa2luZC52YWx1ZSA9PSBDMkNvbXBvbmVudDo6S0lORF9FTkNPREVSKSB7CisgICAgICAgIG1QYXJhbVVwZGF0ZXItPmFkZFN0YW5kYXJkUGFyYW08QzJTdHJlYW1Jbml0RGF0YUluZm86Om91dHB1dD4oQzJfUEFSQU1LRVlfSU5JVF9EQVRBKTsKKyAgICB9CisgICAgaWYgKGRvbWFpbi52YWx1ZSA9PSBDMkNvbXBvbmVudDo6RE9NQUlOX0lNQUdFIHx8IGRvbWFpbi52YWx1ZSA9PSBDMkNvbXBvbmVudDo6RE9NQUlOX1ZJREVPKSB7CisgICAgICAgIGlmIChraW5kLnZhbHVlICE9IEMyQ29tcG9uZW50OjpLSU5EX0VOQ09ERVIpIHsKKyAgICAgICAgICAgIGFkZExvY2FsUGFyYW08QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dD4oQzJfUEFSQU1LRVlfUElDVFVSRV9TSVpFKTsKKyAgICAgICAgICAgIGFkZExvY2FsUGFyYW08QzJTdHJlYW1Dcm9wUmVjdEluZm86Om91dHB1dD4oQzJfUEFSQU1LRVlfQ1JPUF9SRUNUKTsKKyAgICAgICAgICAgIGFkZExvY2FsUGFyYW0oCisgICAgICAgICAgICAgICAgICAgIG5ldyBDMlN0cmVhbVBpeGVsQXNwZWN0UmF0aW9JbmZvOjpvdXRwdXQoMHUsIDF1LCAxdSksCisgICAgICAgICAgICAgICAgICAgIEMyX1BBUkFNS0VZX1BJWEVMX0FTUEVDVF9SQVRJTyk7CisgICAgICAgICAgICBhZGRMb2NhbFBhcmFtKG5ldyBDMlN0cmVhbVJvdGF0aW9uSW5mbzo6b3V0cHV0KDB1LCAwKSwgQzJfUEFSQU1LRVlfUk9UQVRJT04pOworICAgICAgICAgICAgYWRkTG9jYWxQYXJhbShuZXcgQzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjpvdXRwdXQoMHUpLCBDMl9QQVJBTUtFWV9DT0xPUl9BU1BFQ1RTKTsKKyAgICAgICAgICAgIGFkZExvY2FsUGFyYW08QzJTdHJlYW1EYXRhU3BhY2VJbmZvOjpvdXRwdXQ+KEMyX1BBUkFNS0VZX0RBVEFfU1BBQ0UpOworICAgICAgICAgICAgYWRkTG9jYWxQYXJhbTxDMlN0cmVhbUhkclN0YXRpY0luZm86Om91dHB1dD4oQzJfUEFSQU1LRVlfSERSX1NUQVRJQ19JTkZPKTsKKyAgICAgICAgICAgIGFkZExvY2FsUGFyYW0obmV3IEMyU3RyZWFtU3VyZmFjZVNjYWxpbmdJbmZvOjpvdXRwdXQoMHUsIFZJREVPX1NDQUxJTkdfTU9ERV9TQ0FMRV9UT19GSVQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDMl9QQVJBTUtFWV9TVVJGQUNFX1NDQUxJTkdfTU9ERSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhZGRMb2NhbFBhcmFtKG5ldyBDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86OmlucHV0KDB1KSwgQzJfUEFSQU1LRVlfQ09MT1JfQVNQRUNUUyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbml0aWFsaXplU3RhbmRhcmRQYXJhbXMoKTsKKworICAgIC8vIHN1YnNjcmliZSB0byBhbGwgc3VwcG9ydGVkIHN0YW5kYXJkIChleHBvc2VkKSBwYXJhbXMKKyAgICAvLyBUT0RPOiBsaW1pdCB0aGlzIHRvIHBhcmFtcyB0aGF0IGFyZSBhY3R1YWxseSBpbiB0aGUgZG9tYWluCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGZvcm1hdEtleXMgPSBtU3RhbmRhcmRQYXJhbXMtPmdldFBhdGhzRm9yRG9tYWluKERvbWFpbigxIDw8IDMwKSk7CisgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+IGluZGljZXM7CisgICAgbVBhcmFtVXBkYXRlci0+Z2V0UGFyYW1JbmRpY2VzRm9yS2V5cyhmb3JtYXRLZXlzLCAmaW5kaWNlcyk7CisgICAgbVN1YnNjcmliZWRJbmRpY2VzLmluc2VydChpbmRpY2VzLmJlZ2luKCksIGluZGljZXMuZW5kKCkpOworCisgICAgLy8gYWxzbyBzdWJzY3JpYmUgdG8gc29tZSBub24tU0RLIHN0YW5kYXJkIHBhcmFtZXRlcnMKKyAgICAvLyBmb3IgbnVtYmVyIG9mIGlucHV0L291dHB1dCBidWZmZXJzCisgICAgbVN1YnNjcmliZWRJbmRpY2VzLmVtcGxhY2UoQzJQb3J0U3VnZ2VzdGVkQnVmZmVyQ291bnRUdW5pbmc6OmlucHV0OjpQQVJBTV9UWVBFKTsKKyAgICBtU3Vic2NyaWJlZEluZGljZXMuZW1wbGFjZShDMlBvcnRTdWdnZXN0ZWRCdWZmZXJDb3VudFR1bmluZzo6b3V0cHV0OjpQQVJBTV9UWVBFKTsKKyAgICBtU3Vic2NyaWJlZEluZGljZXMuZW1wbGFjZShDMkFjdHVhbFBpcGVsaW5lRGVsYXlUdW5pbmc6OlBBUkFNX1RZUEUpOworICAgIG1TdWJzY3JpYmVkSW5kaWNlcy5lbXBsYWNlKEMyUG9ydEFjdHVhbERlbGF5VHVuaW5nOjppbnB1dDo6UEFSQU1fVFlQRSk7CisgICAgbVN1YnNjcmliZWRJbmRpY2VzLmVtcGxhY2UoQzJQb3J0QWN0dWFsRGVsYXlUdW5pbmc6Om91dHB1dDo6UEFSQU1fVFlQRSk7CisgICAgLy8gZm9yIG91dHB1dCBidWZmZXIgYXJyYXkgYWxsb2NhdGlvbgorICAgIG1TdWJzY3JpYmVkSW5kaWNlcy5lbXBsYWNlKEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86Om91dHB1dDo6UEFSQU1fVFlQRSk7CisgICAgLy8gaW5pdCBkYXRhIChDU0QpCisgICAgbVN1YnNjcmliZWRJbmRpY2VzLmVtcGxhY2UoQzJTdHJlYW1Jbml0RGF0YUluZm86Om91dHB1dDo6UEFSQU1fVFlQRSk7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IENDb2RlY0NvbmZpZzo6c3Vic2NyaWJlVG9Db25maWdVcGRhdGUoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gJmNvbXBvbmVudCwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+ICZpbmRpY2VzLAorICAgICAgICBjMl9ibG9ja2luZ190IGJsb2NraW5nKSB7CisgICAgbVN1YnNjcmliZWRJbmRpY2VzLmluc2VydChpbmRpY2VzLmJlZ2luKCksIGluZGljZXMuZW5kKCkpOworICAgIC8vIFRPRE86IGVuYWJsZSB0aGlzIHdoZW4gY29tcG9uZW50cyBubyBsb25nZXIgY3Jhc2ggb24gdGhpcyBjb25maWcKKyAgICBpZiAobVN1YnNjcmliZWRJbmRpY2VzLnNpemUoKSAhPSBtU3Vic2NyaWJlZEluZGljZXNTaXplICYmIGZhbHNlKSB7CisgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQzMl90PiBpbmRpY2VzOworICAgICAgICBmb3IgKEMyUGFyYW06OkluZGV4IGl4IDogbVN1YnNjcmliZWRJbmRpY2VzKSB7CisgICAgICAgICAgICBpbmRpY2VzLnB1c2hfYmFjayhpeCk7CisgICAgICAgIH0KKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyU3Vic2NyaWJlZFBhcmFtSW5kaWNlc1R1bmluZz4gc3Vic2NyaWJlVHVuaW5nID0KKyAgICAgICAgICAgIEMyU3Vic2NyaWJlZFBhcmFtSW5kaWNlc1R1bmluZzo6QWxsb2NVbmlxdWUoaW5kaWNlcyk7CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiByZXN1bHRzOworICAgICAgICBjMl9zdGF0dXNfdCBjMkVyciA9IGNvbXBvbmVudC0+Y29uZmlnKHsgc3Vic2NyaWJlVHVuaW5nLmdldCgpIH0sIGJsb2NraW5nLCAmcmVzdWx0cyk7CisgICAgICAgIGlmIChjMkVyciAhPSBDMl9PSyAmJiBjMkVyciAhPSBDMl9CQURfSU5ERVgpIHsKKyAgICAgICAgICAgIEFMT0dEKCJGYWlsZWQgdG8gc3Vic2NyaWJlIHRvIHBhcmFtZXRlcnMgPT4gJXMiLCBhc1N0cmluZyhjMkVycikpOworICAgICAgICAgICAgLy8gVE9ETzogZXJyb3IKKyAgICAgICAgfQorICAgICAgICBBTE9HVigiU3Vic2NyaWJlZCB0byAlenUgcGFyYW1zIiwgbVN1YnNjcmliZWRJbmRpY2VzLnNpemUoKSk7CisgICAgICAgIG1TdWJzY3JpYmVkSW5kaWNlc1NpemUgPSBtU3Vic2NyaWJlZEluZGljZXMuc2l6ZSgpOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IENDb2RlY0NvbmZpZzo6cXVlcnlDb25maWd1cmF0aW9uKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+ICZjb21wb25lbnQpIHsKKyAgICAvLyBxdWVyeSBhbGwgc3Vic2NyaWJlZCBwYXJhbWV0ZXJzCisgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+IGluZGljZXMobVN1YnNjcmliZWRJbmRpY2VzLmJlZ2luKCksIG1TdWJzY3JpYmVkSW5kaWNlcy5lbmQoKSk7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiBxdWVyaWVkOworICAgIGMyX3N0YXR1c190IGMyRXJyID0gY29tcG9uZW50LT5xdWVyeSh7fSwgaW5kaWNlcywgQzJfTUFZX0JMT0NLLCAmcXVlcmllZCk7CisgICAgaWYgKGMyRXJyICE9IE9LKSB7CisgICAgICAgIEFMT0dJKCJxdWVyeSBmYWlsZWQgYWZ0ZXIgcmV0dXJuaW5nICV6dSB2YWx1ZXMgKCVzKSIsIHF1ZXJpZWQuc2l6ZSgpLCBhc1N0cmluZyhjMkVycikpOworICAgICAgICAvLyBUT0RPOiBlcnJvcgorICAgIH0KKworICAgIHVwZGF0ZUNvbmZpZ3VyYXRpb24ocXVlcmllZCwgQUxMKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK2Jvb2wgQ0NvZGVjQ29uZmlnOjp1cGRhdGVDb25maWd1cmF0aW9uKAorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+ICZjb25maWdVcGRhdGUsIERvbWFpbiBkb21haW4pIHsKKyAgICBBTE9HVigidXBkYXRpbmcgY29uZmlndXJhdGlvbiB3aXRoICV6dSBwYXJhbXMiLCBjb25maWdVcGRhdGUuc2l6ZSgpKTsKKyAgICBib29sIGNoYW5nZWQgPSBmYWxzZTsKKyAgICBmb3IgKHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPiAmcCA6IGNvbmZpZ1VwZGF0ZSkgeworICAgICAgICBpZiAocCAmJiAqcCkgeworICAgICAgICAgICAgYXV0byBpbnNlcnRpb24gPSBtQ3VycmVudENvbmZpZy5lbXBsYWNlKHAtPmluZGV4KCksIG51bGxwdHIpOworICAgICAgICAgICAgaWYgKGluc2VydGlvbi5zZWNvbmQgfHwgKmluc2VydGlvbi5maXJzdC0+c2Vjb25kICE9ICpwKSB7CisgICAgICAgICAgICAgICAgaWYgKG1TdXBwb3J0ZWRJbmRpY2VzLmNvdW50KHAtPmluZGV4KCkpIHx8IG1Mb2NhbFBhcmFtcy5jb3VudChwLT5pbmRleCgpKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IHRyYWNrIGNoYW5nZXMgaW4gc3VwcG9ydGVkIChyZWZsZWN0ZWQgb3IgbG9jYWwpIGluZGljZXMKKyAgICAgICAgICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoImFuIHVubGlzdGVkIGNvbmZpZyB3YXMgJXM6ICUjeCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0aW9uLnNlY29uZCA/ICJhZGRlZCIgOiAidXBkYXRlZCIsIHAtPmluZGV4KCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGluc2VydGlvbi5maXJzdC0+c2Vjb25kID0gc3RkOjptb3ZlKHApOworICAgICAgICB9CisgICAgfQorCisgICAgQUxPR1YoInVwZGF0ZWQgY29uZmlndXJhdGlvbiBoYXMgJXp1IHBhcmFtcyAoJXMpIiwgbUN1cnJlbnRDb25maWcuc2l6ZSgpLAorICAgICAgICAgICAgY2hhbmdlZCA/ICJDSEFOR0VEIiA6ICJubyBjaGFuZ2UiKTsKKyAgICBpZiAoY2hhbmdlZCkgeworICAgICAgICByZXR1cm4gdXBkYXRlRm9ybWF0cyhkb21haW4pOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgQ0NvZGVjQ29uZmlnOjp1cGRhdGVGb3JtYXRzKERvbWFpbiBkb21haW4pIHsKKyAgICAvLyBnZXQgYWRkcmVzc2VzIG9mIHBhcmFtcyBpbiB0aGUgY3VycmVudCBjb25maWcKKyAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gcGFyYW1Qb2ludGVyczsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJml0IDogbUN1cnJlbnRDb25maWcpIHsKKyAgICAgICAgcGFyYW1Qb2ludGVycy5wdXNoX2JhY2soaXQuc2Vjb25kLmdldCgpKTsKKyAgICB9CisKKyAgICBSZWZsZWN0ZWRQYXJhbVVwZGF0ZXI6OkRpY3QgcmVmbGVjdGVkID0gbVBhcmFtVXBkYXRlci0+Z2V0UGFyYW1zKHBhcmFtUG9pbnRlcnMpOworICAgIEFMT0dEKCJjMiBjb25maWcgaXMgJXMiLCByZWZsZWN0ZWQuZGVidWdTdHJpbmcoKS5jX3N0cigpKTsKKworICAgIGJvb2wgY2hhbmdlZCA9IGZhbHNlOworICAgIGlmIChkb21haW4gJiBtSW5wdXREb21haW4pIHsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG9sZEZvcm1hdCA9IG1JbnB1dEZvcm1hdDsKKyAgICAgICAgbUlucHV0Rm9ybWF0ID0gbUlucHV0Rm9ybWF0LT5kdXAoKTsgLy8gdHJpZ2dlciBmb3JtYXQgY2hhbmdlZAorICAgICAgICBtSW5wdXRGb3JtYXQtPmV4dGVuZChnZXRTZGtGb3JtYXRGb3JEb21haW4ocmVmbGVjdGVkLCBtSW5wdXREb21haW4pKTsKKyAgICAgICAgaWYgKG1JbnB1dEZvcm1hdC0+Y291bnRFbnRyaWVzKCkgIT0gb2xkRm9ybWF0LT5jb3VudEVudHJpZXMoKQorICAgICAgICAgICAgICAgIHx8IG1JbnB1dEZvcm1hdC0+Y2hhbmdlc0Zyb20ob2xkRm9ybWF0KS0+Y291bnRFbnRyaWVzKCkgPiAwKSB7CisgICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1JbnB1dEZvcm1hdCA9IG9sZEZvcm1hdDsgLy8gbm8gY2hhbmdlCisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGRvbWFpbiAmIG1PdXRwdXREb21haW4pIHsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG9sZEZvcm1hdCA9IG1PdXRwdXRGb3JtYXQ7CisgICAgICAgIG1PdXRwdXRGb3JtYXQgPSBtT3V0cHV0Rm9ybWF0LT5kdXAoKTsgLy8gdHJpZ2dlciBvdXRwdXQgZm9ybWF0IGNoYW5nZWQKKyAgICAgICAgbU91dHB1dEZvcm1hdC0+ZXh0ZW5kKGdldFNka0Zvcm1hdEZvckRvbWFpbihyZWZsZWN0ZWQsIG1PdXRwdXREb21haW4pKTsKKyAgICAgICAgaWYgKG1PdXRwdXRGb3JtYXQtPmNvdW50RW50cmllcygpICE9IG9sZEZvcm1hdC0+Y291bnRFbnRyaWVzKCkKKyAgICAgICAgICAgICAgICB8fCBtT3V0cHV0Rm9ybWF0LT5jaGFuZ2VzRnJvbShvbGRGb3JtYXQpLT5jb3VudEVudHJpZXMoKSA+IDApIHsKKyAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbU91dHB1dEZvcm1hdCA9IG9sZEZvcm1hdDsgLy8gbm8gY2hhbmdlCisgICAgICAgIH0KKyAgICB9CisgICAgQUxPR1ZfSUYoY2hhbmdlZCwgImZvcm1hdChzKSBjaGFuZ2VkIik7CisgICAgcmV0dXJuIGNoYW5nZWQ7Cit9CisKK3NwPEFNZXNzYWdlPiBDQ29kZWNDb25maWc6OmdldFNka0Zvcm1hdEZvckRvbWFpbigKKyAgICAgICAgY29uc3QgUmVmbGVjdGVkUGFyYW1VcGRhdGVyOjpEaWN0ICZyZWZsZWN0ZWQsIERvbWFpbiBwb3J0RG9tYWluKSBjb25zdCB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZTsKKyAgICBmb3IgKGNvbnN0IHN0ZDo6cGFpcjxzdGQ6OnN0cmluZywgc3RkOjp2ZWN0b3I8Q29uZmlnTWFwcGVyPj4gJmVsIDogbVN0YW5kYXJkUGFyYW1zLT5nZXRLZXlzKCkpIHsKKyAgICAgICAgZm9yIChjb25zdCBDb25maWdNYXBwZXIgJmNtIDogZWwuc2Vjb25kKSB7CisgICAgICAgICAgICBpZiAoKGNtLmRvbWFpbigpICYgcG9ydERvbWFpbikgPT0gMCAvLyBpbnB1dC1vdXRwdXQtY29kZWQtcmF3CisgICAgICAgICAgICAgICAgfHwgKGNtLmRvbWFpbigpICYgbURvbWFpbikgIT0gbURvbWFpbiAvLyBjb21wb25lbnQgZG9tYWluICsga2luZCAodGhlc2UgbXVzdCBtYXRjaCkKKyAgICAgICAgICAgICAgICB8fCAoY20uZG9tYWluKCkgJiBJU19SRUFEKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdXRvIGl0ID0gcmVmbGVjdGVkLmZpbmQoY20ucGF0aCgpKTsKKyAgICAgICAgICAgIGlmIChpdCA9PSByZWZsZWN0ZWQuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEMyVmFsdWUgYzJWYWx1ZTsKKyAgICAgICAgICAgIHNwPEFCdWZmZXI+IGJ1ZlZhbHVlOworICAgICAgICAgICAgQVN0cmluZyBzdHJWYWx1ZTsKKyAgICAgICAgICAgIEFNZXNzYWdlOjpJdGVtRGF0YSBpdGVtOworICAgICAgICAgICAgaWYgKGl0LT5zZWNvbmQuZmluZCgmYzJWYWx1ZSkpIHsKKyAgICAgICAgICAgICAgICBpdGVtID0gY20ubWFwVG9NZXNzYWdlKGMyVmFsdWUpOworICAgICAgICAgICAgfSBlbHNlIGlmIChpdC0+c2Vjb25kLmZpbmQoJmJ1ZlZhbHVlKSkgeworICAgICAgICAgICAgICAgIGl0ZW0uc2V0KGJ1ZlZhbHVlKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaXQtPnNlY29uZC5maW5kKCZzdHJWYWx1ZSkpIHsKKyAgICAgICAgICAgICAgICBpdGVtLnNldChzdHJWYWx1ZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dEKCJ1bmV4cGVjdGVkIHVudHlwZWQgcXVlcnkgdmFsdWUgZm9yIGtleTogJXMiLCBjbS5wYXRoKCkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtc2ctPnNldEl0ZW0oZWwuZmlyc3QuY19zdHIoKSwgaXRlbSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB7IC8vIGNvbnZlcnQgZnJvbSBDb2RlYyAyLjAgcmVjdCB0byBNZWRpYUZvcm1hdCByZWN0IGFuZCBhZGQgY3JvcCByZWN0IGlmIG5vdCBwcmVzZW50CisgICAgICAgIGludDMyX3QgbGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0OworICAgICAgICBpZiAobXNnLT5maW5kSW50MzIoImNyb3AtbGVmdCIsICZsZWZ0KSAmJiBtc2ctPmZpbmRJbnQzMigiY3JvcC13aWR0aCIsICZ3aWR0aCkKKyAgICAgICAgICAgICAgICAmJiBtc2ctPmZpbmRJbnQzMigiY3JvcC10b3AiLCAmdG9wKSAmJiBtc2ctPmZpbmRJbnQzMigiY3JvcC1oZWlnaHQiLCAmaGVpZ2h0KQorICAgICAgICAgICAgICAgICYmIGxlZnQgPj0gMCAmJiB3aWR0aCA+PTAgJiYgd2lkdGggPD0gSU5UMzJfTUFYIC0gbGVmdAorICAgICAgICAgICAgICAgICYmIHRvcCA+PSAwICYmIGhlaWdodCA+PTAgJiYgaGVpZ2h0IDw9IElOVDMyX01BWCAtIHRvcCkgeworICAgICAgICAgICAgbXNnLT5yZW1vdmVFbnRyeUF0KG1zZy0+ZmluZEVudHJ5QnlOYW1lKCJjcm9wLWxlZnQiKSk7CisgICAgICAgICAgICBtc2ctPnJlbW92ZUVudHJ5QXQobXNnLT5maW5kRW50cnlCeU5hbWUoImNyb3AtdG9wIikpOworICAgICAgICAgICAgbXNnLT5yZW1vdmVFbnRyeUF0KG1zZy0+ZmluZEVudHJ5QnlOYW1lKCJjcm9wLXdpZHRoIikpOworICAgICAgICAgICAgbXNnLT5yZW1vdmVFbnRyeUF0KG1zZy0+ZmluZEVudHJ5QnlOYW1lKCJjcm9wLWhlaWdodCIpKTsKKyAgICAgICAgICAgIG1zZy0+c2V0UmVjdCgiY3JvcCIsIGxlZnQsIHRvcCwgbGVmdCArIHdpZHRoIC0gMSwgdG9wICsgaGVpZ2h0IC0gMSk7CisgICAgICAgIH0gZWxzZSBpZiAobXNnLT5maW5kSW50MzIoIndpZHRoIiwgJndpZHRoKSAmJiBtc2ctPmZpbmRJbnQzMigiaGVpZ2h0IiwgJmhlaWdodCkpIHsKKyAgICAgICAgICAgIG1zZy0+c2V0UmVjdCgiY3JvcCIsIDAsIDAsIHdpZHRoIC0gMSwgaGVpZ2h0IC0gMSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB7IC8vIGNvbnZlcnQgdGVtcG9yYWwgbGF5ZXJpbmcgdG8gc2NoZW1hCisgICAgICAgIHNwPEFCdWZmZXI+IHRtcDsKKyAgICAgICAgaWYgKG1zZy0+ZmluZEJ1ZmZlcihDMl9QQVJBTUtFWV9URU1QT1JBTF9MQVlFUklORywgJnRtcCkgJiYgdG1wICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEMyU3RyZWFtVGVtcG9yYWxMYXllcmluZ1R1bmluZyAqbGF5ZXJpbmcgPQorICAgICAgICAgICAgICAgIEMyU3RyZWFtVGVtcG9yYWxMYXllcmluZ1R1bmluZzo6RnJvbShDMlBhcmFtOjpGcm9tKHRtcC0+ZGF0YSgpLCB0bXAtPnNpemUoKSkpOworICAgICAgICAgICAgaWYgKGxheWVyaW5nICYmIGxheWVyaW5nLT5tLmxheWVyQ291bnQgPiAwCisgICAgICAgICAgICAgICAgICAgICYmIGxheWVyaW5nLT5tLmJMYXllckNvdW50IDwgbGF5ZXJpbmctPm0ubGF5ZXJDb3VudCkgeworICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIHRoaXMgaXMgd2VicnRjIGNvbXBhdGlibGUKKyAgICAgICAgICAgICAgICBBU3RyaW5nIG1pbWU7CisgICAgICAgICAgICAgICAgaWYgKG1zZy0+ZmluZFN0cmluZyhLRVlfTUlNRSwgJm1pbWUpICYmCisgICAgICAgICAgICAgICAgICAgICAgICBtaW1lLmVxdWFsc0lnbm9yZUNhc2UoTUlNRVRZUEVfVklERU9fVlA4KSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJpbmctPm0uYkxheWVyQ291bnQgPT0gMCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgKGxheWVyaW5nLT5tLmxheWVyQ291bnQgPT0gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAobGF5ZXJpbmctPm0ubGF5ZXJDb3VudCA9PSAyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgbGF5ZXJpbmctPmZsZXhDb3VudCgpID49IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBsYXllcmluZy0+bS5iaXRyYXRlUmF0aW9zWzBdID09IC42ZikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKGxheWVyaW5nLT5tLmxheWVyQ291bnQgPT0gMworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGxheWVyaW5nLT5mbGV4Q291bnQoKSA+PSAyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgbGF5ZXJpbmctPm0uYml0cmF0ZVJhdGlvc1swXSA9PSAuNGYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBsYXllcmluZy0+bS5iaXRyYXRlUmF0aW9zWzFdID09IC42ZikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKGxheWVyaW5nLT5tLmxheWVyQ291bnQgPT0gNAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGxheWVyaW5nLT5mbGV4Q291bnQoKSA+PSAzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgbGF5ZXJpbmctPm0uYml0cmF0ZVJhdGlvc1swXSA9PSAuMjVmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgbGF5ZXJpbmctPm0uYml0cmF0ZVJhdGlvc1sxXSA9PSAuNGYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBsYXllcmluZy0+bS5iaXRyYXRlUmF0aW9zWzJdID09IC42ZikpKSB7CisgICAgICAgICAgICAgICAgICAgIG1zZy0+c2V0U3RyaW5nKEtFWV9URU1QT1JBTF9MQVlFUklORywgQVN0cmluZ1ByaW50ZigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2VicnRjLnZwOC4ldS1sYXllciIsIGxheWVyaW5nLT5tLmxheWVyQ291bnQpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxheWVyaW5nLT5tLmJMYXllckNvdW50KSB7CisgICAgICAgICAgICAgICAgICAgIG1zZy0+c2V0U3RyaW5nKEtFWV9URU1QT1JBTF9MQVlFUklORywgQVN0cmluZ1ByaW50ZigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYW5kcm9pZC5nZW5lcmljLiV1KyV1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXllcmluZy0+bS5sYXllckNvdW50IC0gbGF5ZXJpbmctPm0uYkxheWVyQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJpbmctPm0uYkxheWVyQ291bnQpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxheWVyaW5nLT5tLmJMYXllckNvdW50KSB7CisgICAgICAgICAgICAgICAgICAgIG1zZy0+c2V0U3RyaW5nKEtFWV9URU1QT1JBTF9MQVlFUklORywgQVN0cmluZ1ByaW50ZigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYW5kcm9pZC5nZW5lcmljLiV1IiwgbGF5ZXJpbmctPm0ubGF5ZXJDb3VudCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1zZy0+cmVtb3ZlRW50cnlBdChtc2ctPmZpbmRFbnRyeUJ5TmFtZShDMl9QQVJBTUtFWV9URU1QT1JBTF9MQVlFUklORykpOworICAgICAgICB9CisgICAgfQorCisgICAgeyAvLyBjb252ZXJ0IGNvbG9yIGluZm8KKyAgICAgICAgQzJDb2xvcjo6cHJpbWFyaWVzX3QgcHJpbWFyaWVzOworICAgICAgICBDMkNvbG9yOjptYXRyaXhfdCBtYXRyaXg7CisgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMigiY29sb3ItcHJpbWFyaWVzIiwgKGludDMyX3QqKSZwcmltYXJpZXMpCisgICAgICAgICAgICAgICAgJiYgbXNnLT5maW5kSW50MzIoImNvbG9yLW1hdHJpeCIsIChpbnQzMl90KikmbWF0cml4KSkgeworICAgICAgICAgICAgaW50MzJfdCBzdGFuZGFyZDsKKworICAgICAgICAgICAgaWYgKEMyTWFwcGVyOjptYXAocHJpbWFyaWVzLCBtYXRyaXgsICZzdGFuZGFyZCkpIHsKKyAgICAgICAgICAgICAgICBtc2ctPnNldEludDMyKEtFWV9DT0xPUl9TVEFOREFSRCwgc3RhbmRhcmQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtc2ctPnJlbW92ZUVudHJ5QXQobXNnLT5maW5kRW50cnlCeU5hbWUoImNvbG9yLXByaW1hcmllcyIpKTsKKyAgICAgICAgICAgIG1zZy0+cmVtb3ZlRW50cnlBdChtc2ctPmZpbmRFbnRyeUJ5TmFtZSgiY29sb3ItbWF0cml4IikpOworICAgICAgICB9CisKKworICAgICAgICAvLyBjYWxjdWxhdGUgZGF0YXNwYWNlIGZvciByYXcgZ3JhcGhpYyBidWZmZXJzIGlmIG5vdCBzcGVjaWZpZWQgYnkgY29tcG9uZW50LCBvciBpZgorICAgICAgICAvLyB1c2luZyBzdXJmYWNlIHdpdGggdW5zcGVjaWZpZWQgYXNwZWN0cyAoYXMgdGhvc2UgbXVzdCBiZSBkZWZhdWx0ZWQgd2hpY2ggbWF5IGNoYW5nZQorICAgICAgICAvLyB0aGUgZGF0YXNwYWNlKQorICAgICAgICBpZiAoKHBvcnREb21haW4gJiBJU19SQVcpICYmIChtRG9tYWluICYgKElTX0lNQUdFIHwgSVNfVklERU8pKSkgeworICAgICAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YXNwYWNlOworICAgICAgICAgICAgQ29sb3JBc3BlY3RzIGFzcGVjdHMgPSB7CisgICAgICAgICAgICAgICAgQ29sb3JBc3BlY3RzOjpSYW5nZVVuc3BlY2lmaWVkLCBDb2xvckFzcGVjdHM6OlByaW1hcmllc1Vuc3BlY2lmaWVkLAorICAgICAgICAgICAgICAgIENvbG9yQXNwZWN0czo6VHJhbnNmZXJVbnNwZWNpZmllZCwgQ29sb3JBc3BlY3RzOjpNYXRyaXhVbnNwZWNpZmllZAorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIENvbG9yVXRpbHM6OmdldENvbG9yQXNwZWN0c0Zyb21Gb3JtYXQobXNnLCBhc3BlY3RzKTsKKyAgICAgICAgICAgIENvbG9yQXNwZWN0cyBvcmlnQXNwZWN0cyA9IGFzcGVjdHM7CisgICAgICAgICAgICBpZiAobVVzaW5nU3VyZmFjZSkgeworICAgICAgICAgICAgICAgIC8vIGdldCBpbWFnZSBzaXplIChkZWZhdWx0IHRvIEhEKQorICAgICAgICAgICAgICAgIGludDMyX3Qgd2lkdGggPSAxMjgwOworICAgICAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0ID0gNzIwOworICAgICAgICAgICAgICAgIGludDMyX3QgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tOworICAgICAgICAgICAgICAgIGlmIChtc2ctPmZpbmRSZWN0KCJjcm9wIiwgJmxlZnQsICZ0b3AsICZyaWdodCwgJmJvdHRvbSkpIHsKKyAgICAgICAgICAgICAgICAgICAgd2lkdGggPSByaWdodCAtIGxlZnQgKyAxOworICAgICAgICAgICAgICAgICAgICBoZWlnaHQgPSBib3R0b20gLSB0b3AgKyAxOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICh2b2lkKW1zZy0+ZmluZEludDMyKEtFWV9XSURUSCwgJndpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgKHZvaWQpbXNnLT5maW5kSW50MzIoS0VZX0hFSUdIVCwgJmhlaWdodCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIENvbG9yVXRpbHM6OnNldERlZmF1bHRDb2RlY0NvbG9yQXNwZWN0c0lmTmVlZGVkKGFzcGVjdHMsIHdpZHRoLCBoZWlnaHQpOworICAgICAgICAgICAgICAgIENvbG9yVXRpbHM6OnNldENvbG9yQXNwZWN0c0ludG9Gb3JtYXQoYXNwZWN0cywgbXNnKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMigiYW5kcm9pZC5fZGF0YXNwYWNlIiwgKGludDMyX3QqKSZkYXRhc3BhY2UpCisgICAgICAgICAgICAgICAgICAgIHx8IGFzcGVjdHMubVJhbmdlICE9IG9yaWdBc3BlY3RzLm1SYW5nZQorICAgICAgICAgICAgICAgICAgICB8fCBhc3BlY3RzLm1QcmltYXJpZXMgIT0gb3JpZ0FzcGVjdHMubVByaW1hcmllcworICAgICAgICAgICAgICAgICAgICB8fCBhc3BlY3RzLm1UcmFuc2ZlciAhPSBvcmlnQXNwZWN0cy5tVHJhbnNmZXIKKyAgICAgICAgICAgICAgICAgICAgfHwgYXNwZWN0cy5tTWF0cml4Q29lZmZzICE9IG9yaWdBc3BlY3RzLm1NYXRyaXhDb2VmZnMpIHsKKyAgICAgICAgICAgICAgICBkYXRhc3BhY2UgPSBDb2xvclV0aWxzOjpnZXREYXRhU3BhY2VGb3JDb2xvckFzcGVjdHMoYXNwZWN0cywgdHJ1ZSAvKiBtYXlFeHBhbmQgKi8pOworICAgICAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoImFuZHJvaWQuX2RhdGFzcGFjZSIsIGRhdGFzcGFjZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBIRFIgc3RhdGljIGluZm8KKworICAgICAgICBDMkhkclN0YXRpY01ldGFkYXRhU3RydWN0IGhkcjsKKyAgICAgICAgaWYgKG1zZy0+ZmluZEZsb2F0KCJzbXB0ZTIwODYucmVkLngiLCAmaGRyLm1hc3RlcmluZy5yZWQueCkKKyAgICAgICAgICAgICAgICAmJiBtc2ctPmZpbmRGbG9hdCgic21wdGUyMDg2LnJlZC55IiwgJmhkci5tYXN0ZXJpbmcucmVkLnkpCisgICAgICAgICAgICAgICAgJiYgbXNnLT5maW5kRmxvYXQoInNtcHRlMjA4Ni5ncmVlbi54IiwgJmhkci5tYXN0ZXJpbmcuZ3JlZW4ueCkKKyAgICAgICAgICAgICAgICAmJiBtc2ctPmZpbmRGbG9hdCgic21wdGUyMDg2LmdyZWVuLnkiLCAmaGRyLm1hc3RlcmluZy5ncmVlbi55KQorICAgICAgICAgICAgICAgICYmIG1zZy0+ZmluZEZsb2F0KCJzbXB0ZTIwODYuYmx1ZS54IiwgJmhkci5tYXN0ZXJpbmcuYmx1ZS54KQorICAgICAgICAgICAgICAgICYmIG1zZy0+ZmluZEZsb2F0KCJzbXB0ZTIwODYuYmx1ZS55IiwgJmhkci5tYXN0ZXJpbmcuYmx1ZS55KQorICAgICAgICAgICAgICAgICYmIG1zZy0+ZmluZEZsb2F0KCJzbXB0ZTIwODYud2hpdGUueCIsICZoZHIubWFzdGVyaW5nLndoaXRlLngpCisgICAgICAgICAgICAgICAgJiYgbXNnLT5maW5kRmxvYXQoInNtcHRlMjA4Ni53aGl0ZS55IiwgJmhkci5tYXN0ZXJpbmcud2hpdGUueSkKKyAgICAgICAgICAgICAgICAmJiBtc2ctPmZpbmRGbG9hdCgic21wdGUyMDg2Lm1heC1sdW1pbmFuY2UiLCAmaGRyLm1hc3RlcmluZy5tYXhMdW1pbmFuY2UpCisgICAgICAgICAgICAgICAgJiYgbXNnLT5maW5kRmxvYXQoInNtcHRlMjA4Ni5taW4tbHVtaW5hbmNlIiwgJmhkci5tYXN0ZXJpbmcubWluTHVtaW5hbmNlKQorICAgICAgICAgICAgICAgICYmIG1zZy0+ZmluZEZsb2F0KCJjdGE4NjEubWF4LWNsbCIsICZoZHIubWF4Q2xsKQorICAgICAgICAgICAgICAgICYmIG1zZy0+ZmluZEZsb2F0KCJjdGE4NjEubWF4LWZhbGwiLCAmaGRyLm1heEZhbGwpKSB7CisgICAgICAgICAgICBpZiAoaGRyLm1hc3RlcmluZy5yZWQueCA+PSAwICAgICAgICAgICAgICAgICYmIGhkci5tYXN0ZXJpbmcucmVkLnggPD0gMQorICAgICAgICAgICAgICAgICAgICAmJiBoZHIubWFzdGVyaW5nLnJlZC55ID49IDAgICAgICAgICAmJiBoZHIubWFzdGVyaW5nLnJlZC55IDw9IDEKKyAgICAgICAgICAgICAgICAgICAgJiYgaGRyLm1hc3RlcmluZy5ncmVlbi54ID49IDAgICAgICAgJiYgaGRyLm1hc3RlcmluZy5ncmVlbi54IDw9IDEKKyAgICAgICAgICAgICAgICAgICAgJiYgaGRyLm1hc3RlcmluZy5ncmVlbi55ID49IDAgICAgICAgJiYgaGRyLm1hc3RlcmluZy5ncmVlbi55IDw9IDEKKyAgICAgICAgICAgICAgICAgICAgJiYgaGRyLm1hc3RlcmluZy5ibHVlLnggPj0gMCAgICAgICAgJiYgaGRyLm1hc3RlcmluZy5ibHVlLnggPD0gMQorICAgICAgICAgICAgICAgICAgICAmJiBoZHIubWFzdGVyaW5nLmJsdWUueSA+PSAwICAgICAgICAmJiBoZHIubWFzdGVyaW5nLmJsdWUueSA8PSAxCisgICAgICAgICAgICAgICAgICAgICYmIGhkci5tYXN0ZXJpbmcud2hpdGUueCA+PSAwICAgICAgICYmIGhkci5tYXN0ZXJpbmcud2hpdGUueCA8PSAxCisgICAgICAgICAgICAgICAgICAgICYmIGhkci5tYXN0ZXJpbmcud2hpdGUueSA+PSAwICAgICAgICYmIGhkci5tYXN0ZXJpbmcud2hpdGUueSA8PSAxCisgICAgICAgICAgICAgICAgICAgICYmIGhkci5tYXN0ZXJpbmcubWF4THVtaW5hbmNlID49IDAgICYmIGhkci5tYXN0ZXJpbmcubWF4THVtaW5hbmNlIDw9IDY1NTM1CisgICAgICAgICAgICAgICAgICAgICYmIGhkci5tYXN0ZXJpbmcubWluTHVtaW5hbmNlID49IDAgICYmIGhkci5tYXN0ZXJpbmcubWluTHVtaW5hbmNlIDw9IDYuNTUzNQorICAgICAgICAgICAgICAgICAgICAmJiBoZHIubWF4Q2xsID49IDAgICAgICAgICAgICAgICAgICAmJiBoZHIubWF4Q2xsIDw9IDY1NTM1CisgICAgICAgICAgICAgICAgICAgICYmIGhkci5tYXhGYWxsID49IDAgICAgICAgICAgICAgICAgICYmIGhkci5tYXhGYWxsIDw9IDY1NTM1KSB7CisgICAgICAgICAgICAgICAgSERSU3RhdGljSW5mbyBtZXRhOworICAgICAgICAgICAgICAgIG1ldGEubUlEID0gbWV0YS5rVHlwZTE7CisgICAgICAgICAgICAgICAgbWV0YS5zVHlwZTEubVIueCA9IGhkci5tYXN0ZXJpbmcucmVkLnggLyAwLjAwMDAyICsgMC41OworICAgICAgICAgICAgICAgIG1ldGEuc1R5cGUxLm1SLnkgPSBoZHIubWFzdGVyaW5nLnJlZC55IC8gMC4wMDAwMiArIDAuNTsKKyAgICAgICAgICAgICAgICBtZXRhLnNUeXBlMS5tRy54ID0gaGRyLm1hc3RlcmluZy5ncmVlbi54IC8gMC4wMDAwMiArIDAuNTsKKyAgICAgICAgICAgICAgICBtZXRhLnNUeXBlMS5tRy55ID0gaGRyLm1hc3RlcmluZy5ncmVlbi55IC8gMC4wMDAwMiArIDAuNTsKKyAgICAgICAgICAgICAgICBtZXRhLnNUeXBlMS5tQi54ID0gaGRyLm1hc3RlcmluZy5ibHVlLnggLyAwLjAwMDAyICsgMC41OworICAgICAgICAgICAgICAgIG1ldGEuc1R5cGUxLm1CLnkgPSBoZHIubWFzdGVyaW5nLmJsdWUueSAvIDAuMDAwMDIgKyAwLjU7CisgICAgICAgICAgICAgICAgbWV0YS5zVHlwZTEubVcueCA9IGhkci5tYXN0ZXJpbmcud2hpdGUueCAvIDAuMDAwMDIgKyAwLjU7CisgICAgICAgICAgICAgICAgbWV0YS5zVHlwZTEubVcueSA9IGhkci5tYXN0ZXJpbmcud2hpdGUueSAvIDAuMDAwMDIgKyAwLjU7CisgICAgICAgICAgICAgICAgbWV0YS5zVHlwZTEubU1heERpc3BsYXlMdW1pbmFuY2UgPSBoZHIubWFzdGVyaW5nLm1heEx1bWluYW5jZSArIDAuNTsKKyAgICAgICAgICAgICAgICBtZXRhLnNUeXBlMS5tTWluRGlzcGxheUx1bWluYW5jZSA9IGhkci5tYXN0ZXJpbmcubWluTHVtaW5hbmNlIC8gMC4wMDAxICsgMC41OworICAgICAgICAgICAgICAgIG1ldGEuc1R5cGUxLm1NYXhDb250ZW50TGlnaHRMZXZlbCA9IGhkci5tYXhDbGwgKyAwLjU7CisgICAgICAgICAgICAgICAgbWV0YS5zVHlwZTEubU1heEZyYW1lQXZlcmFnZUxpZ2h0TGV2ZWwgPSBoZHIubWF4RmFsbCArIDAuNTsKKyAgICAgICAgICAgICAgICBtc2ctPnJlbW92ZUVudHJ5QXQobXNnLT5maW5kRW50cnlCeU5hbWUoInNtcHRlMjA4Ni5yZWQueCIpKTsKKyAgICAgICAgICAgICAgICBtc2ctPnJlbW92ZUVudHJ5QXQobXNnLT5maW5kRW50cnlCeU5hbWUoInNtcHRlMjA4Ni5yZWQueSIpKTsKKyAgICAgICAgICAgICAgICBtc2ctPnJlbW92ZUVudHJ5QXQobXNnLT5maW5kRW50cnlCeU5hbWUoInNtcHRlMjA4Ni5ncmVlbi54IikpOworICAgICAgICAgICAgICAgIG1zZy0+cmVtb3ZlRW50cnlBdChtc2ctPmZpbmRFbnRyeUJ5TmFtZSgic21wdGUyMDg2LmdyZWVuLnkiKSk7CisgICAgICAgICAgICAgICAgbXNnLT5yZW1vdmVFbnRyeUF0KG1zZy0+ZmluZEVudHJ5QnlOYW1lKCJzbXB0ZTIwODYuYmx1ZS54IikpOworICAgICAgICAgICAgICAgIG1zZy0+cmVtb3ZlRW50cnlBdChtc2ctPmZpbmRFbnRyeUJ5TmFtZSgic21wdGUyMDg2LmJsdWUueSIpKTsKKyAgICAgICAgICAgICAgICBtc2ctPnJlbW92ZUVudHJ5QXQobXNnLT5maW5kRW50cnlCeU5hbWUoInNtcHRlMjA4Ni53aGl0ZS54IikpOworICAgICAgICAgICAgICAgIG1zZy0+cmVtb3ZlRW50cnlBdChtc2ctPmZpbmRFbnRyeUJ5TmFtZSgic21wdGUyMDg2LndoaXRlLnkiKSk7CisgICAgICAgICAgICAgICAgbXNnLT5yZW1vdmVFbnRyeUF0KG1zZy0+ZmluZEVudHJ5QnlOYW1lKCJzbXB0ZTIwODYubWF4LWx1bWluYW5jZSIpKTsKKyAgICAgICAgICAgICAgICBtc2ctPnJlbW92ZUVudHJ5QXQobXNnLT5maW5kRW50cnlCeU5hbWUoInNtcHRlMjA4Ni5taW4tbHVtaW5hbmNlIikpOworICAgICAgICAgICAgICAgIG1zZy0+cmVtb3ZlRW50cnlBdChtc2ctPmZpbmRFbnRyeUJ5TmFtZSgiY3RhODYxLm1heC1jbGwiKSk7CisgICAgICAgICAgICAgICAgbXNnLT5yZW1vdmVFbnRyeUF0KG1zZy0+ZmluZEVudHJ5QnlOYW1lKCJjdGE4NjEubWF4LWZhbGwiKSk7CisgICAgICAgICAgICAgICAgbXNnLT5zZXRCdWZmZXIoS0VZX0hEUl9TVEFUSUNfSU5GTywgQUJ1ZmZlcjo6Q3JlYXRlQXNDb3B5KCZtZXRhLCBzaXplb2YobWV0YSkpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR0QoImZvdW5kIGludmFsaWQgSERSIHN0YXRpYyBtZXRhZGF0YSAlcyIsIG1zZy0+ZGVidWdTdHJpbmcoOCkuY19zdHIoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBBTE9HVigiY29udmVydGVkIHRvIFNESyB2YWx1ZXMgYXMgJXMiLCBtc2ctPmRlYnVnU3RyaW5nKCkuY19zdHIoKSk7CisgICAgcmV0dXJuIG1zZzsKK30KKworLy8vIGNvbnZlcnRzIGFuIEFNZXNzYWdlIHZhbHVlIHRvIGEgUGFyYW1VcGRhdGVyIHZhbHVlCitzdGF0aWMgdm9pZCBjb252ZXJ0KGNvbnN0IEFNZXNzYWdlOjpJdGVtRGF0YSAmZnJvbSwgUmVmbGVjdGVkUGFyYW1VcGRhdGVyOjpWYWx1ZSAqdG8pIHsKKyAgICBpbnQzMl90IGludDMyVmFsdWU7CisgICAgaW50NjRfdCBpbnQ2NFZhbHVlOworICAgIHNwPEFCdWZmZXI+IGJ1ZlZhbHVlOworICAgIEFTdHJpbmcgc3RyVmFsdWU7CisgICAgZmxvYXQgZmxvYXRWYWx1ZTsKKyAgICBkb3VibGUgZG91YmxlVmFsdWU7CisKKyAgICBpZiAoZnJvbS5maW5kKCZpbnQzMlZhbHVlKSkgeworICAgICAgICB0by0+c2V0KGludDMyVmFsdWUpOworICAgIH0gZWxzZSBpZiAoZnJvbS5maW5kKCZpbnQ2NFZhbHVlKSkgeworICAgICAgICB0by0+c2V0KGludDY0VmFsdWUpOworICAgIH0gZWxzZSBpZiAoZnJvbS5maW5kKCZidWZWYWx1ZSkpIHsKKyAgICAgICAgdG8tPnNldChidWZWYWx1ZSk7CisgICAgfSBlbHNlIGlmIChmcm9tLmZpbmQoJnN0clZhbHVlKSkgeworICAgICAgICB0by0+c2V0KHN0clZhbHVlKTsKKyAgICB9IGVsc2UgaWYgKGZyb20uZmluZCgmZmxvYXRWYWx1ZSkpIHsKKyAgICAgICAgdG8tPnNldChDMlZhbHVlKGZsb2F0VmFsdWUpKTsKKyAgICB9IGVsc2UgaWYgKGZyb20uZmluZCgmZG91YmxlVmFsdWUpKSB7CisgICAgICAgIC8vIGNvbnZlcnQgZG91YmxlIHRvIGZsb2F0CisgICAgICAgIHRvLT5zZXQoQzJWYWx1ZSgoZmxvYXQpZG91YmxlVmFsdWUpKTsKKyAgICB9CisgICAgLy8gaWdub3JlIGFsbCBvdGhlciBBTWVzc2FnZSB0eXBlcworfQorCisvLy8gcmVsYXhlcyBDb2RlYyAyLjAgc3BlY2lmaWMgdmFsdWUgdHlwZXMgdG8gU0RLIHR5cGVzIChtYWlubHkgcmVtb3ZlcyBzaWduZWRuZXNzIGFuZCBjb3VudGVybmVzcworLy8vIGZyb20gMzIvNjQtYml0IHZhbHVlcy4pCitzdGF0aWMgdm9pZCByZWxheFZhbHVlcyhSZWZsZWN0ZWRQYXJhbVVwZGF0ZXI6OlZhbHVlICZpdGVtKSB7CisgICAgQzJWYWx1ZSBjMlZhbHVlOworICAgIGludDMyX3QgaW50MzJWYWx1ZTsKKyAgICBpbnQ2NF90IGludDY0VmFsdWU7CisgICAgKHZvaWQpaXRlbS5maW5kKCZjMlZhbHVlKTsKKyAgICBpZiAoYzJWYWx1ZS5nZXQoJmludDMyVmFsdWUpIHx8IGMyVmFsdWUuZ2V0KCh1aW50MzJfdCopJmludDMyVmFsdWUpCisgICAgICAgICAgICB8fCBjMlZhbHVlLmdldCgoYzJfY250cjMyX3QqKSZpbnQzMlZhbHVlKSkgeworICAgICAgICBpdGVtLnNldChpbnQzMlZhbHVlKTsKKyAgICB9IGVsc2UgaWYgKGMyVmFsdWUuZ2V0KCZpbnQ2NFZhbHVlKQorICAgICAgICAgICAgfHwgYzJWYWx1ZS5nZXQoKHVpbnQ2NF90KikmaW50NjRWYWx1ZSkKKyAgICAgICAgICAgIHx8IGMyVmFsdWUuZ2V0KChjMl9jbnRyNjRfdCopJmludDY0VmFsdWUpKSB7CisgICAgICAgIGl0ZW0uc2V0KGludDY0VmFsdWUpOworICAgIH0KK30KKworUmVmbGVjdGVkUGFyYW1VcGRhdGVyOjpEaWN0IENDb2RlY0NvbmZpZzo6Z2V0UmVmbGVjdGVkRm9ybWF0KAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJnBhcmFtc18sIERvbWFpbiBjb25maWdEb21haW4pIGNvbnN0IHsKKyAgICAvLyBjcmVhdGUgYSBtb2RpZmlhYmxlIGNvcHkgb2YgcGFyYW1zCisgICAgc3A8QU1lc3NhZ2U+IHBhcmFtcyA9IHBhcmFtc18tPmR1cCgpOworICAgIEFMT0dWKCJmaWx0ZXJpbmcgd2l0aCBjb25maWcgZG9tYWluICV4IiwgY29uZmlnRG9tYWluKTsKKworICAgIC8vIGNvbnZlcnQgc29tZSBtYWNybyBwYXJhbWV0ZXJzIHRvIENvZGVjIDIuMCBzcGVjaWZpYyBleHByZXNzaW9ucworCisgICAgeyAvLyBtYWtlIGktZnJhbWUtaW50ZXJ2YWwgZnJhbWUgYmFzZWQKKyAgICAgICAgZmxvYXQgaUZyYW1lSW50ZXJ2YWw7CisgICAgICAgIGlmIChwYXJhbXMtPmZpbmRBc0Zsb2F0KEtFWV9JX0ZSQU1FX0lOVEVSVkFMLCAmaUZyYW1lSW50ZXJ2YWwpKSB7CisgICAgICAgICAgICBmbG9hdCBmcmFtZVJhdGU7CisgICAgICAgICAgICBpZiAocGFyYW1zLT5maW5kQXNGbG9hdChLRVlfRlJBTUVfUkFURSwgJmZyYW1lUmF0ZSkpIHsKKyAgICAgICAgICAgICAgICBwYXJhbXMtPnNldEludDMyKCJpLWZyYW1lLXBlcmlvZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAoZnJhbWVSYXRlIDw9IDAgfHwgaUZyYW1lSW50ZXJ2YWwgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAtMSAvKiBubyBzeW5jIGZyYW1lcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoaW50MzJfdCljMl9taW4oaUZyYW1lSW50ZXJ2YWwgKiBmcmFtZVJhdGUgKyAwLjUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmxvYXQpSU5UMzJfTUFYKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobURvbWFpbiA9PSAoSVNfVklERU8gfCBJU19FTkNPREVSKSkgeworICAgICAgICAvLyBjb252ZXJ0IGNhcHR1cmUtcmF0ZSBpbnRvIGlucHV0LXRpbWUtc3RyZXRjaAorICAgICAgICBmbG9hdCBmcmFtZVJhdGUsIGNhcHR1cmVSYXRlOworICAgICAgICBpZiAocGFyYW1zLT5maW5kQXNGbG9hdChLRVlfRlJBTUVfUkFURSwgJmZyYW1lUmF0ZSkpIHsKKyAgICAgICAgICAgIGlmICghcGFyYW1zLT5maW5kQXNGbG9hdCgidGltZS1sYXBzZS1mcHMiLCAmY2FwdHVyZVJhdGUpCisgICAgICAgICAgICAgICAgICAgICYmICFwYXJhbXMtPmZpbmRBc0Zsb2F0KEtFWV9DQVBUVVJFX1JBVEUsICZjYXB0dXJlUmF0ZSkpIHsKKyAgICAgICAgICAgICAgICBjYXB0dXJlUmF0ZSA9IGZyYW1lUmF0ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjYXB0dXJlUmF0ZSA+IDAgJiYgZnJhbWVSYXRlID4gMCkgeworICAgICAgICAgICAgICAgIHBhcmFtcy0+c2V0RmxvYXQoQzJfUEFSQU1LRVlfSU5QVVRfVElNRV9TVFJFVENILCBjYXB0dXJlUmF0ZSAvIGZyYW1lUmF0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICB7ICAgLy8gcmVmbGVjdCB0ZW1wb3JhbCBsYXllcmluZyBpbnRvIGEgYmluYXJ5IGJsb2IKKyAgICAgICAgQVN0cmluZyBzY2hlbWE7CisgICAgICAgIGlmIChwYXJhbXMtPmZpbmRTdHJpbmcoS0VZX1RFTVBPUkFMX0xBWUVSSU5HLCAmc2NoZW1hKSkgeworICAgICAgICAgICAgdW5zaWduZWQgaW50IG51bUxheWVycyA9IDA7CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbnVtQkxheWVycyA9IDA7CisgICAgICAgICAgICBpbnQgdGFnczsKKyAgICAgICAgICAgIGNoYXIgZHVtbXk7CisgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJTdHJlYW1UZW1wb3JhbExheWVyaW5nVHVuaW5nOjpvdXRwdXQ+IGxheWVyaW5nOworICAgICAgICAgICAgaWYgKHNzY2FuZihzY2hlbWEuY19zdHIoKSwgIndlYnJ0Yy52cDguJXUtbGF5ZXIlYyIsICZudW1MYXllcnMsICZkdW1teSkgPT0gMQorICAgICAgICAgICAgICAgICYmIG51bUxheWVycyA+IDApIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKG51bUxheWVycykgeworICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICBsYXllcmluZyA9IEMyU3RyZWFtVGVtcG9yYWxMYXllcmluZ1R1bmluZzo6b3V0cHV0OjpBbGxvY1VuaXF1ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge30sIDB1LCAxdSwgMHUpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyaW5nID0gQzJTdHJlYW1UZW1wb3JhbExheWVyaW5nVHVuaW5nOjpvdXRwdXQ6OkFsbG9jVW5pcXVlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IC42ZiB9LCAwdSwgMnUsIDB1KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgICAgICAgICBsYXllcmluZyA9IEMyU3RyZWFtVGVtcG9yYWxMYXllcmluZ1R1bmluZzo6b3V0cHV0OjpBbGxvY1VuaXF1ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAuNGYsIC42ZiB9LCAwdSwgM3UsIDB1KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJpbmcgPSBDMlN0cmVhbVRlbXBvcmFsTGF5ZXJpbmdUdW5pbmc6Om91dHB1dDo6QWxsb2NVbmlxdWUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgLjI1ZiwgLjRmLCAuNmYgfSwgMHUsIDR1LCAwdSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKCh0YWdzID0gc3NjYW5mKHNjaGVtYS5jX3N0cigpLCAiYW5kcm9pZC5nZW5lcmljLiV1JWMldSVjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICZudW1MYXllcnMsICZkdW1teSwgJm51bUJMYXllcnMsICZkdW1teSkpCisgICAgICAgICAgICAgICAgJiYgKHRhZ3MgPT0gMSB8fCAodGFncyA9PSAzICYmIGR1bW15ID09ICcrJykpCisgICAgICAgICAgICAgICAgJiYgbnVtTGF5ZXJzID4gMCAmJiBudW1MYXllcnMgPCBVSU5UMzJfTUFYIC0gbnVtQkxheWVycykgeworICAgICAgICAgICAgICAgIGxheWVyaW5nID0gQzJTdHJlYW1UZW1wb3JhbExheWVyaW5nVHVuaW5nOjpvdXRwdXQ6OkFsbG9jVW5pcXVlKAorICAgICAgICAgICAgICAgICAgICAgICAge30sIDB1LCBudW1MYXllcnMgKyBudW1CTGF5ZXJzLCBudW1CTGF5ZXJzKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR0QoIklnbm9yaW5nIHVuc3VwcG9ydGVkIHRzLXNjaGVtYSBbJXNdIiwgc2NoZW1hLmNfc3RyKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGxheWVyaW5nKSB7CisgICAgICAgICAgICAgICAgcGFyYW1zLT5zZXRCdWZmZXIoQzJfUEFSQU1LRVlfVEVNUE9SQUxfTEFZRVJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUJ1ZmZlcjo6Q3JlYXRlQXNDb3B5KGxheWVyaW5nLmdldCgpLCBsYXllcmluZy0+c2l6ZSgpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICB7IC8vIGNvbnZlcnQgZnJvbSBNZWRpYUZvcm1hdCByZWN0IHRvIENvZGVjIDIuMCByZWN0CisgICAgICAgIGludDMyX3Qgb2Zmc2V0OworICAgICAgICBpbnQzMl90IGVuZDsKKyAgICAgICAgQU1lc3NhZ2U6Okl0ZW1EYXRhIGl0ZW07CisgICAgICAgIGlmIChwYXJhbXMtPmZpbmRJbnQzMigiY3JvcC1sZWZ0IiwgJm9mZnNldCkgJiYgcGFyYW1zLT5maW5kSW50MzIoImNyb3AtcmlnaHQiLCAmZW5kKQorICAgICAgICAgICAgICAgICYmIG9mZnNldCA+PSAwICYmIGVuZCA+PSBvZmZzZXQgLSAxKSB7CisgICAgICAgICAgICBzaXplX3QgaXggPSBwYXJhbXMtPmZpbmRFbnRyeUJ5TmFtZSgiY3JvcC1yaWdodCIpOworICAgICAgICAgICAgcGFyYW1zLT5zZXRFbnRyeU5hbWVBdChpeCwgImNyb3Atd2lkdGgiKTsKKyAgICAgICAgICAgIGl0ZW0uc2V0KGVuZCAtIG9mZnNldCArIDEpOworICAgICAgICAgICAgcGFyYW1zLT5zZXRFbnRyeUF0KGl4LCBpdGVtKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocGFyYW1zLT5maW5kSW50MzIoImNyb3AtdG9wIiwgJm9mZnNldCkgJiYgcGFyYW1zLT5maW5kSW50MzIoImNyb3AtYm90dG9tIiwgJmVuZCkKKyAgICAgICAgICAgICAgICAmJiBvZmZzZXQgPj0gMCAmJiBlbmQgPj0gb2Zmc2V0IC0gMSkgeworICAgICAgICAgICAgc2l6ZV90IGl4ID0gcGFyYW1zLT5maW5kRW50cnlCeU5hbWUoImNyb3AtYm90dG9tIik7CisgICAgICAgICAgICBwYXJhbXMtPnNldEVudHJ5TmFtZUF0KGl4LCAiY3JvcC1oZWlnaHQiKTsKKyAgICAgICAgICAgIGl0ZW0uc2V0KGVuZCAtIG9mZnNldCArIDEpOworICAgICAgICAgICAgcGFyYW1zLT5zZXRFbnRyeUF0KGl4LCBpdGVtKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHsgLy8gY29udmVydCBjb2xvciBpbmZvCisgICAgICAgIGludDMyX3Qgc3RhbmRhcmQ7CisgICAgICAgIGlmIChwYXJhbXMtPmZpbmRJbnQzMihLRVlfQ09MT1JfU1RBTkRBUkQsICZzdGFuZGFyZCkpIHsKKyAgICAgICAgICAgIEMyQ29sb3I6OnByaW1hcmllc190IHByaW1hcmllczsKKyAgICAgICAgICAgIEMyQ29sb3I6Om1hdHJpeF90IG1hdHJpeDsKKworICAgICAgICAgICAgaWYgKEMyTWFwcGVyOjptYXAoc3RhbmRhcmQsICZwcmltYXJpZXMsICZtYXRyaXgpKSB7CisgICAgICAgICAgICAgICAgcGFyYW1zLT5zZXRJbnQzMigiY29sb3ItcHJpbWFyaWVzIiwgcHJpbWFyaWVzKTsKKyAgICAgICAgICAgICAgICBwYXJhbXMtPnNldEludDMyKCJjb2xvci1tYXRyaXgiLCBtYXRyaXgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc3A8QUJ1ZmZlcj4gaGRyTWV0YTsKKyAgICAgICAgaWYgKHBhcmFtcy0+ZmluZEJ1ZmZlcihLRVlfSERSX1NUQVRJQ19JTkZPLCAmaGRyTWV0YSkKKyAgICAgICAgICAgICAgICAmJiBoZHJNZXRhLT5zaXplKCkgPT0gc2l6ZW9mKEhEUlN0YXRpY0luZm8pKSB7CisgICAgICAgICAgICBIRFJTdGF0aWNJbmZvICptZXRhID0gKEhEUlN0YXRpY0luZm8qKWhkck1ldGEtPmRhdGEoKTsKKyAgICAgICAgICAgIGlmIChtZXRhLT5tSUQgPT0gbWV0YS0+a1R5cGUxKSB7CisgICAgICAgICAgICAgICAgcGFyYW1zLT5zZXRGbG9hdCgic21wdGUyMDg2LnJlZC54IiwgbWV0YS0+c1R5cGUxLm1SLnggKiAwLjAwMDAyKTsKKyAgICAgICAgICAgICAgICBwYXJhbXMtPnNldEZsb2F0KCJzbXB0ZTIwODYucmVkLnkiLCBtZXRhLT5zVHlwZTEubVIueSAqIDAuMDAwMDIpOworICAgICAgICAgICAgICAgIHBhcmFtcy0+c2V0RmxvYXQoInNtcHRlMjA4Ni5ncmVlbi54IiwgbWV0YS0+c1R5cGUxLm1HLnggKiAwLjAwMDAyKTsKKyAgICAgICAgICAgICAgICBwYXJhbXMtPnNldEZsb2F0KCJzbXB0ZTIwODYuZ3JlZW4ueSIsIG1ldGEtPnNUeXBlMS5tRy55ICogMC4wMDAwMik7CisgICAgICAgICAgICAgICAgcGFyYW1zLT5zZXRGbG9hdCgic21wdGUyMDg2LmJsdWUueCIsIG1ldGEtPnNUeXBlMS5tQi54ICogMC4wMDAwMik7CisgICAgICAgICAgICAgICAgcGFyYW1zLT5zZXRGbG9hdCgic21wdGUyMDg2LmJsdWUueSIsIG1ldGEtPnNUeXBlMS5tQi55ICogMC4wMDAwMik7CisgICAgICAgICAgICAgICAgcGFyYW1zLT5zZXRGbG9hdCgic21wdGUyMDg2LndoaXRlLngiLCBtZXRhLT5zVHlwZTEubVcueCAqIDAuMDAwMDIpOworICAgICAgICAgICAgICAgIHBhcmFtcy0+c2V0RmxvYXQoInNtcHRlMjA4Ni53aGl0ZS55IiwgbWV0YS0+c1R5cGUxLm1XLnkgKiAwLjAwMDAyKTsKKyAgICAgICAgICAgICAgICBwYXJhbXMtPnNldEZsb2F0KCJzbXB0ZTIwODYubWF4LWx1bWluYW5jZSIsIG1ldGEtPnNUeXBlMS5tTWF4RGlzcGxheUx1bWluYW5jZSk7CisgICAgICAgICAgICAgICAgcGFyYW1zLT5zZXRGbG9hdCgic21wdGUyMDg2Lm1pbi1sdW1pbmFuY2UiLCBtZXRhLT5zVHlwZTEubU1pbkRpc3BsYXlMdW1pbmFuY2UgKiAwLjAwMDEpOworICAgICAgICAgICAgICAgIHBhcmFtcy0+c2V0RmxvYXQoImN0YTg2MS5tYXgtY2xsIiwgbWV0YS0+c1R5cGUxLm1NYXhDb250ZW50TGlnaHRMZXZlbCk7CisgICAgICAgICAgICAgICAgcGFyYW1zLT5zZXRGbG9hdCgiY3RhODYxLm1heC1mYWxsIiwgbWV0YS0+c1R5cGUxLm1NYXhGcmFtZUF2ZXJhZ2VMaWdodExldmVsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIHRoaXMgaXMgdG8gdmVyaWZ5IHRoYXQgd2Ugc2V0IHByb3BlciBzaWduZWRuZXNzIGZvciBzdGFuZGFyZCBwYXJhbWV0ZXJzCisgICAgYm9vbCBiZVZlcnlTdHJpY3QgPSBwcm9wZXJ0eV9nZXRfYm9vbCgiZGVidWcuc3RhZ2VmcmlnaHQuY2NvZGVjX3N0cmljdF90eXBlIiwgZmFsc2UpOworICAgIC8vIHRoaXMgaXMgdG8gYWxsb3cgdmVuZG9ycyB0byB1c2UgdGhlIHdyb25nIHNpZ25lZG5lc3MgZm9yIHN0YW5kYXJkIHBhcmFtZXRlcnMKKyAgICBib29sIGJlVmVyeUxheCA9IHByb3BlcnR5X2dldF9ib29sKCJkZWJ1Zy5zdGFnZWZyaWdodC5jY29kZWNfbGF4X3R5cGUiLCBmYWxzZSk7CisKKyAgICBSZWZsZWN0ZWRQYXJhbVVwZGF0ZXI6OkRpY3QgZmlsdGVyZWQ7CisgICAgZm9yIChzaXplX3QgaXggPSAwOyBpeCA8IHBhcmFtcy0+Y291bnRFbnRyaWVzKCk7ICsraXgpIHsKKyAgICAgICAgQU1lc3NhZ2U6OlR5cGUgdHlwZTsKKyAgICAgICAgQVN0cmluZyBuYW1lID0gcGFyYW1zLT5nZXRFbnRyeU5hbWVBdChpeCwgJnR5cGUpOworICAgICAgICBBTWVzc2FnZTo6SXRlbURhdGEgbXNnSXRlbSA9IHBhcmFtcy0+Z2V0RW50cnlBdChpeCk7CisgICAgICAgIFJlZmxlY3RlZFBhcmFtVXBkYXRlcjo6VmFsdWUgaXRlbTsKKyAgICAgICAgY29udmVydChtc2dJdGVtLCAmaXRlbSk7IC8vIGNvbnZlcnQgaXRlbSB0byBwYXJhbSB1cGRhdGVyIGl0ZW0KKworICAgICAgICBpZiAobmFtZS5zdGFydHNXaXRoKCJ2ZW5kb3IuIikpIHsKKyAgICAgICAgICAgIC8vIHZlbmRvciBwYXJhbXMgcGFzcyB0aHJvdWdoIGFzIGlzCisgICAgICAgICAgICBmaWx0ZXJlZC5lbXBsYWNlKG5hbWUuY19zdHIoKSwgaXRlbSk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICAvLyBzdGFuZGFyZCBwYXJhbWV0ZXJzIG1heSBnZXQgbW9kaWZpZWQsIGZpbHRlcmVkIG9yIGR1cGxpY2F0ZWQKKyAgICAgICAgZm9yIChjb25zdCBDb25maWdNYXBwZXIgJmNtIDogbVN0YW5kYXJkUGFyYW1zLT5nZXRDb25maWdNYXBwZXJzRm9yU2RrS2V5KG5hbWUuY19zdHIoKSkpIHsKKyAgICAgICAgICAgIC8vIG5vdGU6IHdlIGlnbm9yZSBwb3J0IGRvbWFpbiBmb3IgY29uZmlndXJhdGlvbgorICAgICAgICAgICAgaWYgKChjbS5kb21haW4oKSAmIGNvbmZpZ0RvbWFpbikKKyAgICAgICAgICAgICAgICAgICAgLy8gY29tcG9uZW50IGRvbWFpbiArIGtpbmQgKHRoZXNlIG11c3QgbWF0Y2gpCisgICAgICAgICAgICAgICAgICAgICYmIChjbS5kb21haW4oKSAmIG1Eb21haW4pID09IG1Eb21haW4pIHsKKyAgICAgICAgICAgICAgICAvLyBtYXAgYXJpdGhtZXRpYyB2YWx1ZXMsIHBhc3MgdGhyb3VnaCBzdHJpbmcgb3IgYnVmZmVyCisgICAgICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQU1lc3NhZ2U6OmtUeXBlQnVmZmVyOgorICAgICAgICAgICAgICAgICAgICBjYXNlIEFNZXNzYWdlOjprVHlwZVN0cmluZzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEFNZXNzYWdlOjprVHlwZUludDMyOgorICAgICAgICAgICAgICAgICAgICBjYXNlIEFNZXNzYWdlOjprVHlwZUludDY0OgorICAgICAgICAgICAgICAgICAgICBjYXNlIEFNZXNzYWdlOjprVHlwZUZsb2F0OgorICAgICAgICAgICAgICAgICAgICBjYXNlIEFNZXNzYWdlOjprVHlwZURvdWJsZToKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBub3cgb25seSBtYXAgc2V0dGluZ3Mgd2l0aCBtYXBwZXJzIGFzIHdlIGFyZSBub3QgY3JlYXRpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNpZ25lZCA8PT4gdW5zaWduZWQgbWFwcGVycworICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogYmUgcHJlY2lzZSBhYm91dCBzaWduZWQgdW5zaWduZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiZVZlcnlTdHJpY3QgfHwgY20ubWFwcGVyKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLnNldChjbS5tYXBGcm9tTWVzc2FnZShwYXJhbXMtPmdldEVudHJ5QXQoaXgpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxzbyBhbGxvdyB0byByZWxheCB0eXBlIHN0cmljdG5lc3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmVWZXJ5TGF4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF4VmFsdWVzKGl0ZW0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZpbHRlcmVkLmVtcGxhY2UoY20ucGF0aCgpLCBpdGVtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBBTE9HVigiZmlsdGVyZWQgJXMgdG8gJXMiLCBwYXJhbXMtPmRlYnVnU3RyaW5nKDQpLmNfc3RyKCksCisgICAgICAgICAgICBmaWx0ZXJlZC5kZWJ1Z1N0cmluZyg0KS5jX3N0cigpKTsKKyAgICByZXR1cm4gZmlsdGVyZWQ7Cit9CisKK3N0YXR1c190IENDb2RlY0NvbmZpZzo6Z2V0Q29uZmlnVXBkYXRlRnJvbVNka1BhcmFtcygKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiBjb21wb25lbnQsCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmc2RrUGFyYW1zLCBEb21haW4gY29uZmlnRG9tYWluLAorICAgICAgICBjMl9ibG9ja2luZ190IGJsb2NraW5nLAorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+ICpjb25maWdVcGRhdGUpIGNvbnN0IHsKKyAgICBSZWZsZWN0ZWRQYXJhbVVwZGF0ZXI6OkRpY3QgcGFyYW1zID0gZ2V0UmVmbGVjdGVkRm9ybWF0KHNka1BhcmFtcywgY29uZmlnRG9tYWluKTsKKworICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiBpbmRpY2VzOworICAgIG1QYXJhbVVwZGF0ZXItPmdldFBhcmFtSW5kaWNlc0Zyb21NZXNzYWdlKHBhcmFtcywgJmluZGljZXMpOworICAgIGlmIChpbmRpY2VzLmVtcHR5KCkpIHsKKyAgICAgICAgQUxPR0QoIm5vIHJlY29nbml6ZWQgcGFyYW1zIGluOiAlcyIsIHBhcmFtcy5kZWJ1Z1N0cmluZygpLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgY29uZmlnVXBkYXRlLT5jbGVhcigpOworICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiBzdXBwb3J0ZWRJbmRpY2VzOworICAgIGZvciAoQzJQYXJhbTo6SW5kZXggaXggOiBpbmRpY2VzKSB7CisgICAgICAgIGlmIChtU3VwcG9ydGVkSW5kaWNlcy5jb3VudChpeCkpIHsKKyAgICAgICAgICAgIHN1cHBvcnRlZEluZGljZXMucHVzaF9iYWNrKGl4KTsKKyAgICAgICAgfSBlbHNlIGlmIChtTG9jYWxQYXJhbXMuY291bnQoaXgpKSB7CisgICAgICAgICAgICAvLyBxdWVyeSBsb2NhbCBwYXJhbWV0ZXIgaGVyZQorICAgICAgICAgICAgYXV0byBpdCA9IG1DdXJyZW50Q29uZmlnLmZpbmQoaXgpOworICAgICAgICAgICAgaWYgKGl0ICE9IG1DdXJyZW50Q29uZmlnLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgY29uZmlnVXBkYXRlLT5lbXBsYWNlX2JhY2soQzJQYXJhbTo6Q29weSgqaXQtPnNlY29uZCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgYzJfc3RhdHVzX3QgZXJyID0gY29tcG9uZW50LT5xdWVyeSh7IH0sIHN1cHBvcnRlZEluZGljZXMsIGJsb2NraW5nLCBjb25maWdVcGRhdGUpOworICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0QoInF1ZXJ5IGZhaWxlZCBhZnRlciByZXR1cm5pbmcgJXp1IHBhcmFtcyA9PiAlcyIsIGNvbmZpZ1VwZGF0ZS0+c2l6ZSgpLCBhc1N0cmluZyhlcnIpKTsKKyAgICB9CisKKyAgICBpZiAoY29uZmlnVXBkYXRlLT5zaXplKCkpIHsKKyAgICAgICAgbVBhcmFtVXBkYXRlci0+dXBkYXRlUGFyYW1zRnJvbU1lc3NhZ2UocGFyYW1zLCBjb25maWdVcGRhdGUpOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IENDb2RlY0NvbmZpZzo6c2V0UGFyYW1ldGVycygKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiBjb21wb25lbnQsCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gJmNvbmZpZ1VwZGF0ZSwKKyAgICAgICAgYzJfYmxvY2tpbmdfdCBibG9ja2luZykgeworICAgIHN0YXR1c190IHJlc3VsdCA9IE9LOworICAgIGlmIChjb25maWdVcGRhdGUuZW1wdHkoKSkgeworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+IGluZGljZXM7CisgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbSAqPiBwYXJhbVZlY3RvcjsKKyAgICBmb3IgKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPiAmcGFyYW0gOiBjb25maWdVcGRhdGUpIHsKKyAgICAgICAgaWYgKG1TdXBwb3J0ZWRJbmRpY2VzLmNvdW50KHBhcmFtLT5pbmRleCgpKSkgeworICAgICAgICAgICAgLy8gY29tcG9uZW50IHBhcmFtZXRlcgorICAgICAgICAgICAgcGFyYW1WZWN0b3IucHVzaF9iYWNrKHBhcmFtLmdldCgpKTsKKyAgICAgICAgICAgIGluZGljZXMucHVzaF9iYWNrKHBhcmFtLT5pbmRleCgpKTsKKyAgICAgICAgfSBlbHNlIGlmIChtTG9jYWxQYXJhbXMuY291bnQocGFyYW0tPmluZGV4KCkpKSB7CisgICAgICAgICAgICAvLyBoYW5kbGUgbG9jYWwgcGFyYW1ldGVyIGhlcmUKKyAgICAgICAgICAgIExvY2FsUGFyYW1WYWxpZGF0b3IgdmFsaWRhdG9yID0gbUxvY2FsUGFyYW1zLmZpbmQocGFyYW0tPmluZGV4KCkpLT5zZWNvbmQ7CisgICAgICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBDMl9PSzsKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPiBjb3B5ID0gQzJQYXJhbTo6Q29weSgqcGFyYW0pOworICAgICAgICAgICAgaWYgKHZhbGlkYXRvcikgeworICAgICAgICAgICAgICAgIGVyciA9IHZhbGlkYXRvcihjb3B5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChlcnIgPT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HVigidXBkYXRlZCBsb2NhbCBwYXJhbWV0ZXIgdmFsdWUgZm9yICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1QYXJhbVVwZGF0ZXItPmdldFBhcmFtTmFtZShwYXJhbS0+aW5kZXgoKSkuY19zdHIoKSk7CisKKyAgICAgICAgICAgICAgICBtQ3VycmVudENvbmZpZ1twYXJhbS0+aW5kZXgoKV0gPSBzdGQ6Om1vdmUoY29weSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dEKCJmYWlsZWQgdG8gc2V0IHBhcmFtZXRlciB2YWx1ZSBmb3IgJXMgPT4gJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgbVBhcmFtVXBkYXRlci0+Z2V0UGFyYW1OYW1lKHBhcmFtLT5pbmRleCgpKS5jX3N0cigpLCBhc1N0cmluZyhlcnIpKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gdXBkYXRlIHN1YnNjcmliZWQgcGFyYW0gaW5kaWNlcworICAgIHN1YnNjcmliZVRvQ29uZmlnVXBkYXRlKGNvbXBvbmVudCwgaW5kaWNlcywgYmxvY2tpbmcpOworCisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgIGMyX3N0YXR1c190IGVyciA9IGNvbXBvbmVudC0+Y29uZmlnKHBhcmFtVmVjdG9yLCBibG9ja2luZywgJmZhaWx1cmVzKTsKKyAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dEKCJjb25maWcgZmFpbGVkID0+ICVzIiwgYXNTdHJpbmcoZXJyKSk7CisgICAgICAgIC8vIFRoaXMgaXMgbm9uLWZhdGFsLgorICAgIH0KKyAgICBmb3IgKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+ICZmYWlsdXJlIDogZmFpbHVyZXMpIHsKKyAgICAgICAgc3dpdGNoIChmYWlsdXJlLT5mYWlsdXJlKSB7CisgICAgICAgICAgICBjYXNlIEMyU2V0dGluZ1Jlc3VsdDo6QkFEX1ZBTFVFOgorICAgICAgICAgICAgICAgIEFMT0dEKCJCYWQgcGFyYW1ldGVyIHZhbHVlIik7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBBTE9HVigiZmFpbHVyZSA9ICVkIiwgaW50KGZhaWx1cmUtPmZhaWx1cmUpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFJlLXF1ZXJ5IHBhcmFtZXRlciB2YWx1ZXMgaW4gY2FzZSBjb25maWcgY291bGQgbm90IHVwZGF0ZSB0aGVtIGFuZCB1cGRhdGUgdGhlIGN1cnJlbnQKKyAgICAvLyBjb25maWd1cmF0aW9uLgorICAgIGNvbmZpZ1VwZGF0ZS5jbGVhcigpOworICAgIGVyciA9IGNvbXBvbmVudC0+cXVlcnkoe30sIGluZGljZXMsIGJsb2NraW5nLCAmY29uZmlnVXBkYXRlKTsKKyAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dEKCJxdWVyeSBmYWlsZWQgYWZ0ZXIgcmV0dXJuaW5nICV6dSBwYXJhbXMgPT4gJXMiLCBjb25maWdVcGRhdGUuc2l6ZSgpLCBhc1N0cmluZyhlcnIpKTsKKyAgICB9CisgICAgKHZvaWQpdXBkYXRlQ29uZmlndXJhdGlvbihjb25maWdVcGRhdGUsIEFMTCk7CisKKyAgICAvLyBUT0RPOiBlcnJvciB2YWx1ZQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK2NvbnN0IEMyUGFyYW0gKkNDb2RlY0NvbmZpZzo6Z2V0Q29uZmlnUGFyYW1ldGVyVmFsdWUoQzJQYXJhbTo6SW5kZXggaW5kZXgpIGNvbnN0IHsKKyAgICBhdXRvIGl0ID0gbUN1cnJlbnRDb25maWcuZmluZChpbmRleCk7CisgICAgaWYgKGl0ID09IG1DdXJyZW50Q29uZmlnLmVuZCgpKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBpdC0+c2Vjb25kLmdldCgpOworICAgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWNDb25maWcuaCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWNDb25maWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmFmZTNmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlY0NvbmZpZy5oCkBAIC0wLDAgKzEsMzQ1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDX0NPREVDX0NPTkZJR19IXworI2RlZmluZSBDX0NPREVDX0NPTkZJR19IXworCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8QzJDb21wb25lbnQuaD4KKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC9jbGllbnQuaD4KKworI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKworI2luY2x1ZGUgIklucHV0U3VyZmFjZVdyYXBwZXIuaCIKKyNpbmNsdWRlICJSZWZsZWN0ZWRQYXJhbVVwZGF0ZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgQU1lc3NhZ2U7CitzdHJ1Y3QgU3RhbmRhcmRQYXJhbXM7CisKKy8qKgorICogU3RydWN0IG1hbmFnaW5nIHRoZSBjb2RlYyBjb25maWd1cmF0aW9uIGZvciBDQ29kZWMuCisgKi8KK3N0cnVjdCBDQ29kZWNDb25maWcgeworCisgICAgLyoqCisgICAgICogRG9tYWluIGNvbnNpc3RzIG9mIGEgYml0bWFzayBkaXZpZGVkIGludG8gZmllbGRzLCBhbmQgc3BlY2lmaWVycyB3b3JrIGJ5IGV4Y2x1ZGluZyBvdGhlcgorICAgICAqIHZhbHVlcyBpbiB0aG9zZSBkb21haW5zLgorICAgICAqCisgICAgICogQ29tcG9uZW50IGRvbWFpbnMgYXJlIGNvbXBvc2VkIGJ5IG9yLWluZyB0aGUgaW5kaXZpZHVhbCBJU18gY29uc3RhbnRzLCBlLmcuCisgICAgICogSVNfREVDT0RFUiB8IElTX0FVRElPLgorICAgICAqCisgICAgICogQ29uZmlnIHNwZWNpZmllcnMgYXJlIGNvbXBvc2VkIGJ5IG9yLWluZyB0aGUgaW5kaXZpZHVhbCBtYXNrIGNvbnN0YW50cywgYW5kCisgICAgICogYW5kLWluZyB0aGVzZSBncm91cHM6IGUuZy4gKERFQ09ERVIgfCBFTkNPREVSKSAmIEFVRElPLgorICAgICAqCisgICAgICogVGhlIG5hbWluZyBvZiB0aGVzZSBjb25zdGFudHMgd2FzIHRvIGxpbWl0IHRoZSBsZW5ndGggb2YgbWFzayBuYW1lcyBhcyB0aGVzZSBhcmUgdXNlZCBtb3JlCisgICAgICogY29tbW9ubHkgYXMgbWFza3MuCisgICAgICovCisgICAgZW51bSBEb21haW4gOiB1aW50MzJfdCB7CisgICAgICAgIC8vIGNvbXBvbmVudCBkb21haW4gKGRvbWFpbiAmIGtpbmQpCisgICAgICAgIEdVQVJEX0JJVCAgID0gKDEgPDwgMSksICAgLy8vPCB0aGlzIGlzIHRvIHByZXZlbnQgYWdhaW5zdCBhY2NpZGVudGFsICYmIG9yIHx8IHVzYWdlCisgICAgICAgIElTX0FVRElPICAgID0gKDEgPDwgMiksICAgLy8vPCBmb3IgYXVkaW8gY29kZWNzCisgICAgICAgIElTX1ZJREVPICAgID0gKDEgPDwgMyksICAgLy8vPCBmb3IgdmlkZW8gY29kZWNzCisgICAgICAgIElTX0lNQUdFICAgID0gKDEgPDwgNCksICAgLy8vPCBmb3IgaW1hZ2UgY29kZWNzCisgICAgICAgIE9USEVSX0RPTUFJTiA9ICgxIDw8IDUpLCAgLy8vPCBmb3Igb3RoZXIgZG9tYWlucworCisgICAgICAgIElTX0VOQ09ERVIgID0gKDEgPDwgNiksICAgLy8vPCBmb3IgZW5jb2RlcnMKKyAgICAgICAgSVNfREVDT0RFUiAgPSAoMSA8PCA3KSwgICAvLy88IGZvciBkZWNvZGVycworICAgICAgICBPVEhFUl9LSU5EICA9ICgxIDw8IDgpLCAgIC8vLzwgZm9yIG90aGVyIGRvbWFpbnMKKworICAgICAgICAvLyBjb25maWcgZG9tYWluCisgICAgICAgIElTX1BBUkFNICAgID0gKDEgPDwgOSksICAgLy8vPCBmb3Igc2V0UGFyYW1ldGVyCisgICAgICAgIElTX0NPTkZJRyAgID0gKDEgPDwgMTApLCAgLy8vPCBmb3IgY29uZmlndXJlCisgICAgICAgIElTX1JFQUQgICAgID0gKDEgPDwgMTEpLCAgLy8vPCBmb3IgZ2V0Rm9ybWF0CisKKyAgICAgICAgLy8gcG9ydCBkb21haW4KKyAgICAgICAgSVNfSU5QVVQgICAgPSAoMSA8PCAxMiksICAvLy88IGZvciBpbnB1dCBwb3J0IChnZXRGb3JtYXQpCisgICAgICAgIElTX09VVFBVVCAgID0gKDEgPDwgMTMpLCAgLy8vPCBmb3Igb3V0cHV0IHBvcnQgKGdldEZvcm1hdCkKKyAgICAgICAgSVNfUkFXICAgICAgPSAoMSA8PCAxNCksICAvLy88IGZvciByYXcgcG9ydCAoaW5wdXQtZW5jb2Rlciwgb3V0cHV0LWRlY29kZXIpCisgICAgICAgIElTX0NPREVEICAgID0gKDEgPDwgMTUpLCAgLy8vPCBmb3IgY29kZWQgcG9ydCAoaW5wdXQtZGVjb2Rlciwgb3V0cHV0LWVuY29kZXIpCisKKyAgICAgICAgQUxMICAgICA9IH4wVSwKKyAgICAgICAgTk9ORSAgICA9IDAsCisKKyAgICAgICAgQVVESU8gICA9IH4oSVNfSU1BR0UgfCBJU19WSURFTyB8IE9USEVSX0RPTUFJTiksCisgICAgICAgIFZJREVPICAgPSB+KElTX0FVRElPIHwgSVNfSU1BR0UgfCBPVEhFUl9ET01BSU4pLAorICAgICAgICBJTUFHRSAgID0gfihJU19BVURJTyB8IElTX1ZJREVPIHwgT1RIRVJfRE9NQUlOKSwKKworICAgICAgICBERUNPREVSID0gfihJU19FTkNPREVSIHwgT1RIRVJfS0lORCksCisgICAgICAgIEVOQ09ERVIgPSB+KElTX0RFQ09ERVIgfCBPVEhFUl9LSU5EKSwKKworICAgICAgICBQQVJBTSAgID0gfihJU19DT05GSUcgfCBJU19SRUFEKSwKKyAgICAgICAgQ09ORklHICA9IH4oSVNfUEFSQU0gIHwgSVNfUkVBRCksCisgICAgICAgIFJFQUQgICAgPSB+KElTX0NPTkZJRyB8IElTX1BBUkFNKSwKKworICAgICAgICBJTlBVVCAgID0gfihJU19PVVRQVVQgfCBJU19SQVcgICAgfCBJU19DT0RFRCksCisgICAgICAgIE9VVFBVVCAgPSB+KElTX0lOUFVUICB8IElTX1JBVyAgICB8IElTX0NPREVEKSwKKyAgICAgICAgUkFXICAgICA9IH4oSVNfSU5QVVQgIHwgSVNfT1VUUFVUIHwgSVNfQ09ERUQpLAorICAgICAgICBDT0RFRCAgID0gfihJU19JTlBVVCAgfCBJU19SQVcgICAgfCBJU19PVVRQVVQpLAorICAgIH07CisKKyAgICAvLyB0aGluZ3MgcmVxdWlyZWQgdG8gbWFuYWdlIGZvcm1hdHMKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+PiBtUGFyYW1EZXNjczsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gbVJlZmxlY3RvcjsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxSZWZsZWN0ZWRQYXJhbVVwZGF0ZXI+IG1QYXJhbVVwZGF0ZXI7CisKKyAgICBEb21haW4gbURvbWFpbjsgLy8gY29tcG9uZW50IGRvbWFpbgorICAgIERvbWFpbiBtSW5wdXREb21haW47IC8vIGlucHV0IHBvcnQgZG9tYWluCisgICAgRG9tYWluIG1PdXRwdXREb21haW47IC8vIG91dHB1dCBwb3J0IGRvbWFpbgorICAgIHN0ZDo6c3RyaW5nIG1Db2RpbmdNZWRpYVR5cGU7ICAvLyBtZWRpYSB0eXBlIG9mIHRoZSBjb2RlZCBzdHJlYW0KKworICAgIC8vIHN0YW5kYXJkIE1lZGlhQ29kZWMgdG8gQ29kZWMgMi4wIHBhcmFtcyBtYXBwaW5nCisgICAgc3RkOjpzaGFyZWRfcHRyPFN0YW5kYXJkUGFyYW1zPiBtU3RhbmRhcmRQYXJhbXM7CisKKyAgICBzdGQ6OnNldDxDMlBhcmFtOjpJbmRleD4gbVN1cHBvcnRlZEluZGljZXM7IC8vLzwgaW5kaWNlcyBzdXBwb3J0ZWQgYnkgdGhlIGNvbXBvbmVudAorICAgIHN0ZDo6c2V0PEMyUGFyYW06OkluZGV4PiBtU3Vic2NyaWJlZEluZGljZXM7IC8vLzwgaW5kaWNlcyB0byBzdWJzY3JpYmUgdG8KKyAgICBzaXplX3QgbVN1YnNjcmliZWRJbmRpY2VzU2l6ZTsgLy8vPCBjb3VudCBvZiBjdXJyZW50bHkgc3Vic2NyaWJlZCBpbmRpY2VzCisKKyAgICBzcDxBTWVzc2FnZT4gbUlucHV0Rm9ybWF0OworICAgIHNwPEFNZXNzYWdlPiBtT3V0cHV0Rm9ybWF0OworCisgICAgYm9vbCBtVXNpbmdTdXJmYWNlOyAvLy88IHVzaW5nIGlucHV0IG9yIG91dHB1dCBzdXJmYWNlCisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW5wdXRTdXJmYWNlV3JhcHBlcj4gbUlucHV0U3VyZmFjZTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8SW5wdXRTdXJmYWNlV3JhcHBlcjo6Q29uZmlnPiBtSVNDb25maWc7CisKKyAgICAvLy8gdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4gVXBkYXRlZCBhZnRlciBjb25maWd1cmUoKSBhbmQgYmFzZWQgb24gY29uZmlnVXBkYXRlIGluCisgICAgLy8vIG9uV29ya0RvbmUKKyAgICBzdGQ6Om1hcDxDMlBhcmFtOjpJbmRleCwgc3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiBtQ3VycmVudENvbmZpZzsKKworICAgIHR5cGVkZWYgc3RkOjpmdW5jdGlvbjxjMl9zdGF0dXNfdChzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4mKT4gTG9jYWxQYXJhbVZhbGlkYXRvcjsKKworICAgIC8vLyBQYXJhbWV0ZXIgaW5kaWNlcyB0cmFja2VkIGluIGN1cnJlbnQgY29uZmlnIHRoYXQgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGNvbXBvbmVudC4KKyAgICAvLy8gdGhlc2UgYXJlIHByb3ZpZGVkIHNvIHRoYXQgb3B0aW9uYWwgcGFyYW1ldGVycyBjYW4gcmVtYWluIGluIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uCisgICAgLy8vIGFzIHN1Y2gsIHRoZXNlIHBhcmFtZXRlcnMgaGF2ZSBubyBkZXBlbmRlbmNpZXMuIFRPRE86IHVzZSBDMkludGVyZmFjZUhlbHBlciBmb3IgdGhpcy4KKyAgICAvLy8gRm9yIG5vdyBzdXBwb3J0IGEgdmFsaWRhdGlvbiBmdW5jdGlvbi4KKyAgICBzdGQ6Om1hcDxDMlBhcmFtOjpJbmRleCwgTG9jYWxQYXJhbVZhbGlkYXRvcj4gbUxvY2FsUGFyYW1zOworCisgICAgQ0NvZGVjQ29uZmlnKCk7CisKKyAgICAvLy8gaW5pdGlhbGl6ZXMgdGhlIG1lbWJlcnMgcmVxdWlyZWQgdG8gbWFuYWdlIHRoZSBmb3JtYXQ6IGRlc2NyaXB0b3JzLCByZWZsZWN0b3IsCisgICAgLy8vIHJlZmxlY3RlZCBwYXJhbSBoZWxwZXIsIGRvbWFpbiwgc3RhbmRhcmQgcGFyYW1zLCBhbmQgc3Vic2NyaWJlcyB0byBzdGFuZGFyZAorICAgIC8vLyBpbmRpY2VzLgorICAgIHN0YXR1c190IGluaXRpYWxpemUoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50PiAmY2xpZW50LAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiAmY29tcG9uZW50KTsKKworCisgICAgLyoqCisgICAgICogQWRkcyBhIGxvY2FsbHkgbWFpbnRhaW5lZCBwYXJhbWV0ZXIuIFRoaXMgaXMgdXNlZCBmb3Igb3V0cHV0IGNvbmZpZ3VyYXRpb24gdGhhdCBjYW4gYmUKKyAgICAgKiBhcHBlbmRlZCB0byB0aGUgb3V0cHV0IGJ1ZmZlcnMgaW4gY2FzZSBpdCBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBjb21wb25lbnQuCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBib29sIGFkZExvY2FsUGFyYW0oCisgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSwKKyAgICAgICAgICAgIEMyUGFyYW1EZXNjcmlwdG9yOjphdHRyaWJfdCBhdHRyaWIgPSBDMlBhcmFtRGVzY3JpcHRvcjo6SVNfUkVBRF9PTkxZLAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjxjMl9zdGF0dXNfdChzdGQ6OnVuaXF1ZV9wdHI8VD4mKT4gdmFsaWRhdG9yXyA9CisgICAgICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjxjMl9zdGF0dXNfdChzdGQ6OnVuaXF1ZV9wdHI8VD4mKT4oKSkgeworICAgICAgICBDMlBhcmFtOjpJbmRleCBpbmRleCA9IFQ6OlBBUkFNX1RZUEU7CisgICAgICAgIGlmIChtU3VwcG9ydGVkSW5kaWNlcy5jb3VudChpbmRleCkgfHwgbUxvY2FsUGFyYW1zLmNvdW50KGluZGV4KSkgeworICAgICAgICAgICAgaWYgKG1TdXBwb3J0ZWRJbmRpY2VzLmNvdW50KGluZGV4KSkgeworICAgICAgICAgICAgICAgIG1TdWJzY3JpYmVkSW5kaWNlcy5lbXBsYWNlKGluZGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFMT0dEKCJpZ25vcmluZyBsb2NhbCBwYXJhbSAlcyAoJSN4KSBhcyBpdCBpcyBhbHJlYWR5ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgbmFtZS5jX3N0cigpLCAodWludDMyX3QpaW5kZXgsIG1TdXBwb3J0ZWRJbmRpY2VzLmNvdW50KGluZGV4KSA/ICJzdXBwb3J0ZWQiIDogImxvY2FsIik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vIGFscmVhZHkgc3VwcG9ydGVkIGJ5IHRoZSBjb21wb25lbnQgb3IgYWxyZWFkeSBhZGRlZAorICAgICAgICB9CisKKyAgICAgICAgLy8gd3JhcCB0eXBlZCB2YWxpZGF0b3IgaW50byB1bnR5cGVkIHZhbGlkYXRvcgorICAgICAgICBMb2NhbFBhcmFtVmFsaWRhdG9yIHZhbGlkYXRvcjsKKyAgICAgICAgaWYgKHZhbGlkYXRvcl8pIHsKKyAgICAgICAgICAgIHZhbGlkYXRvciA9IFt2YWxpZGF0b3JfXShzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4mIHApeworICAgICAgICAgICAgICAgIGMyX3N0YXR1c190IHJlcyA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8VD4gdHlwZWQoc3RhdGljX2Nhc3Q8VCo+KHAucmVsZWFzZSgpKSk7CisgICAgICAgICAgICAgICAgLy8gaWYgcGFyYW1ldGVyIGlzIGNvcnJlY3RseSB0eXBlZAorICAgICAgICAgICAgICAgIGlmIChUOjpGcm9tKHR5cGVkLmdldCgpKSkgeworICAgICAgICAgICAgICAgICAgICByZXMgPSB2YWxpZGF0b3JfKHR5cGVkKTsKKyAgICAgICAgICAgICAgICAgICAgcC5yZXNldCh0eXBlZC5yZWxlYXNlKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICAgICAgfTsKKyAgICAgICAgfQorCisgICAgICAgIG1Mb2NhbFBhcmFtcy5lbXBsYWNlKGluZGV4LCB2YWxpZGF0b3IpOworICAgICAgICBtUGFyYW1VcGRhdGVyLT5hZGRTdGFuZGFyZFBhcmFtPFQ+KG5hbWUsIGF0dHJpYik7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYSBsb2NhbGx5IG1haW50YWluZWQgcGFyYW1ldGVyIHdpdGggYSBkZWZhdWx0IHZhbHVlLgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgYm9vbCBhZGRMb2NhbFBhcmFtKAorICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPFQ+IGRlZmF1bHRfLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsCisgICAgICAgICAgICBDMlBhcmFtRGVzY3JpcHRvcjo6YXR0cmliX3QgYXR0cmliID0gQzJQYXJhbURlc2NyaXB0b3I6OklTX1JFQURfT05MWSwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248YzJfc3RhdHVzX3Qoc3RkOjp1bmlxdWVfcHRyPFQ+Jik+IHZhbGlkYXRvcl8gPQorICAgICAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248YzJfc3RhdHVzX3Qoc3RkOjp1bmlxdWVfcHRyPFQ+Jik+KCkpIHsKKyAgICAgICAgaWYgKGFkZExvY2FsUGFyYW08VD4obmFtZSwgYXR0cmliLCB2YWxpZGF0b3JfKSkgeworICAgICAgICAgICAgaWYgKHZhbGlkYXRvcl8pIHsKKyAgICAgICAgICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSB2YWxpZGF0b3JfKGRlZmF1bHRfKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJkZWZhdWx0IHZhbHVlIGZvciAlcyBpcyBpbnZhbGlkID0+ICVzIiwgbmFtZS5jX3N0cigpLCBhc1N0cmluZyhlcnIpKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1DdXJyZW50Q29uZmlnW1Q6OlBBUkFNX1RZUEVdID0gc3RkOjptb3ZlKGRlZmF1bHRfKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIGJvb2wgYWRkTG9jYWxQYXJhbSgKKyAgICAgICAgICAgIFQgKmRlZmF1bHRfLCBjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSwKKyAgICAgICAgICAgIEMyUGFyYW1EZXNjcmlwdG9yOjphdHRyaWJfdCBhdHRyaWIgPSBDMlBhcmFtRGVzY3JpcHRvcjo6SVNfUkVBRF9PTkxZLAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjxjMl9zdGF0dXNfdChzdGQ6OnVuaXF1ZV9wdHI8VD4mKT4gdmFsaWRhdG9yXyA9CisgICAgICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjxjMl9zdGF0dXNfdChzdGQ6OnVuaXF1ZV9wdHI8VD4mKT4oKSkgeworICAgICAgICByZXR1cm4gYWRkTG9jYWxQYXJhbShzdGQ6OnVuaXF1ZV9wdHI8VD4oZGVmYXVsdF8pLCBuYW1lLCBhdHRyaWIsIHZhbGlkYXRvcl8pOworICAgIH0KKworICAgIC8vLyBBcHBsaWVzIGNvbmZpZ3VyYXRpb24gdXBkYXRlcywgYW5kIHVwZGF0ZXMgZm9ybWF0IGluIHRoZSBzcGVjaWZpYyBkb21haW4uCisgICAgLy8vIFJldHVybnMgdHJ1ZSBpZiBmb3JtYXRzIHdlcmUgdXBkYXRlZAorICAgIC8vLyBccGFyYW0gZG9tYWluIGlucHV0L291dHB1dCBiaXRtYXNrCisgICAgYm9vbCB1cGRhdGVDb25maWd1cmF0aW9uKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiAmY29uZmlnVXBkYXRlLCBEb21haW4gZG9tYWluKTsKKworICAgIC8vLyBVcGRhdGVzIGZvcm1hdHMgaW4gdGhlIHNwZWNpZmljIGRvbWFpbi4gUmV0dXJucyB0cnVlIGlmIGFueSBvZiB0aGUgZm9ybWF0cyBoYXZlIGNoYW5nZWQuCisgICAgLy8vIFxwYXJhbSBkb21haW4gaW5wdXQvb3V0cHV0IGJpdG1hc2sKKyAgICBib29sIHVwZGF0ZUZvcm1hdHMoRG9tYWluIGRvbWFpbik7CisKKyAgICAvKioKKyAgICAgKiBBcHBsaWVzIFNESyBjb25maWd1cmF0aW9ucyBpbiBhIHNwZWNpZmljIGNvbmZpZ3VyYXRpb24gZG9tYWluLgorICAgICAqIFVwZGF0ZXMgcmVsZXZhbnQgaW5wdXQvb3V0cHV0IGZvcm1hdHMgYW5kIHN1YnNjcmliZXMgdG8gcGFyYW1ldGVycyBzcGVjaWZpZWQgaW4gdGhlCisgICAgICogY29uZmlndXJhdGlvbi4KKyAgICAgKiBccGFyYW0gZG9tYWluIGNvbmZpZy9zZXRQYXJhbSBiaXRtYXNrCisgICAgICogXHBhcmFtIGJsb2NraW5nIGJsb2NraW5nIG1vZGUgdG8gdXNlIHdpdGggdGhlIGNvbXBvbmVudAorICAgICAqLworICAgIHN0YXR1c190IGdldENvbmZpZ1VwZGF0ZUZyb21TZGtQYXJhbXMoCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+IGNvbXBvbmVudCwKKyAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmc2RrUGFyYW1zLCBEb21haW4gZG9tYWluLAorICAgICAgICAgICAgYzJfYmxvY2tpbmdfdCBibG9ja2luZywKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gKmNvbmZpZ1VwZGF0ZSkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBBcHBsaWVzIGEgY29uZmlndXJhdGlvbiB1cGRhdGUgdG8gdGhlIGNvbXBvbmVudC4KKyAgICAgKiBVcGRhdGVzIHJlbGV2YW50IGlucHV0L291dHB1dCBmb3JtYXRzIGFuZCBzdWJzY3JpYmVzIHRvIHBhcmFtZXRlcnMgc3BlY2lmaWVkIGluIHRoZQorICAgICAqIGNvbmZpZ3VyYXRpb24uCisgICAgICogXHBhcmFtIGJsb2NraW5nIGJsb2NraW5nIG1vZGUgdG8gdXNlIHdpdGggdGhlIGNvbXBvbmVudAorICAgICAqLworICAgIHN0YXR1c190IHNldFBhcmFtZXRlcnMoCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+IGNvbXBvbmVudCwKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gJmNvbmZpZ1VwZGF0ZSwKKyAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgYmxvY2tpbmcpOworCisgICAgLy8vIFF1ZXJpZXMgc3Vic2NyaWJlZCBpbmRpY2VzICh3aGljaCBjb250YWlucyBhbGwgU0RLLWV4cG9zZWQgdmFsdWVzKSBhbmQgdXBkYXRlcworICAgIC8vLyBpbnB1dC9vdXRwdXQgZm9ybWF0cy4KKyAgICBzdGF0dXNfdCBxdWVyeUNvbmZpZ3VyYXRpb24oCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+ICZjb21wb25lbnQpOworCisgICAgLy8vIFF1ZXJpZXMgYSBjb25maWd1cmF0aW9uIHBhcmFtZXRlciB2YWx1ZS4gUmV0dXJucyBudWxscHRyIGlmIHRoZSBwYXJhbWV0ZXIgaXMgbm90CisgICAgLy8vIHBhcnQgb2YgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbgorICAgIGNvbnN0IEMyUGFyYW0gKmdldENvbmZpZ1BhcmFtZXRlclZhbHVlKEMyUGFyYW06OkluZGV4IGluZGV4KSBjb25zdDsKKworICAgIC8qKgorICAgICAqIE9iamVjdCB0aGF0IGNhbiBiZSB1c2VkIHRvIGFjY2VzcyBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgYW5kIGlmIHRoZXkgY2hhbmdlLgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgc3RydWN0IFdhdGNoZXIgeworICAgICAgICB+V2F0Y2hlcigpID0gZGVmYXVsdDsKKworICAgICAgICAvLy8gcmV0dXJucyB0cnVlIGlmIHRoZSB2YWx1ZSBvZiB0aGlzIGNvbmZpZ3VyYXRpb24gaGFzIGNoYW5nZWQKKyAgICAgICAgYm9vbCBoYXNDaGFuZ2VkKCkgY29uc3QgeworICAgICAgICAgICAgY29uc3QgQzJQYXJhbSAqdmFsdWUgPSBtUGFyZW50LT5nZXRDb25maWdQYXJhbWV0ZXJWYWx1ZShtSW5kZXgpOworICAgICAgICAgICAgaWYgKHZhbHVlICYmIG1WYWx1ZSkgeworICAgICAgICAgICAgICAgIHJldHVybiAqdmFsdWUgIT0gKm1WYWx1ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlICE9IG1WYWx1ZS5nZXQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyB1cGRhdGVzIHRoZSBjdXJyZW50IHZhbHVlIGFuZCByZXR1cm5zIGl0CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBUPiB1cGRhdGUoKSB7CisgICAgICAgICAgICBjb25zdCBDMlBhcmFtICp2YWx1ZSA9IG1QYXJlbnQtPmdldENvbmZpZ1BhcmFtZXRlclZhbHVlKG1JbmRleCk7CisgICAgICAgICAgICBpZiAodmFsdWUpIHsKKyAgICAgICAgICAgICAgICBtVmFsdWUgPSBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgVD4oVDo6RnJvbShDMlBhcmFtOjpDb3B5KCp2YWx1ZSkucmVsZWFzZSgpKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbVZhbHVlOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBXYXRjaGVyKEMyUGFyYW06OkluZGV4IGluZGV4LCBjb25zdCBDQ29kZWNDb25maWcgKnBhcmVudCkKKyAgICAgICAgICAgIDogbVBhcmVudChwYXJlbnQpLCBtSW5kZXgoaW5kZXgpIHsKKyAgICAgICAgICAgIHVwZGF0ZSgpOworICAgICAgICB9CisKKyAgICAgICAgZnJpZW5kIHN0cnVjdCBDQ29kZWNDb25maWc7CisKKyAgICAgICAgY29uc3QgQ0NvZGVjQ29uZmlnICptUGFyZW50OworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgVD4gbVZhbHVlOworICAgICAgICBDMlBhcmFtOjpJbmRleCBtSW5kZXg7CisgICAgfTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSB3YXRjaGVyIG9iamVjdCBmb3IgYSBwYXJhbWV0ZXIuCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBXYXRjaGVyPFQ+IHdhdGNoKEMyUGFyYW06OkluZGV4IGluZGV4ID0gVDo6UEFSQU1fVFlQRSkgY29uc3QgeworICAgICAgICBpZiAoaW5kZXgudHlwZSgpICE9IFQ6OlBBUkFNX1RZUEUpIHsKKyAgICAgICAgICAgIF9fYnVpbHRpbl90cmFwKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFdhdGNoZXI8VD4oaW5kZXgsIHRoaXMpOworICAgIH0KKworcHJpdmF0ZToKKworICAgIC8vLyBpbml0aWFsaXplcyB0aGUgc3RhbmRhcmQgTWVkaWFDb2RlYyB0byBDb2RlYyAyLjAgcGFyYW1zIG1hcHBpbmcKKyAgICB2b2lkIGluaXRpYWxpemVTdGFuZGFyZFBhcmFtcygpOworCisgICAgLy8vIEFkZHMgaW5kaWNlcyB0byB0aGUgc3Vic2NyaWJlZCBpbmRpY2VzLCBhbmQgdXBkYXRlZCBzdWJzY3JpcHRpb24gdG8gY29tcG9uZW50CisgICAgLy8vIFxwYXJhbSBibG9ja2luZyBibG9ja2luZyBtb2RlIHRvIHVzZSB3aXRoIHRoZSBjb21wb25lbnQKKyAgICBzdGF0dXNfdCBzdWJzY3JpYmVUb0NvbmZpZ1VwZGF0ZSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gJmNvbXBvbmVudCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiAmaW5kaWNlcywKKyAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgYmxvY2tpbmcgPSBDMl9ET05UX0JMT0NLKTsKKworICAgIC8vLyBHZXRzIFNESyBmb3JtYXQgZnJvbSBjb2RlYyAyLjAgcmVmbGVjdGVkIGNvbmZpZ3VyYXRpb24KKyAgICAvLy8gXHBhcmFtIGRvbWFpbiBpbnB1dC9vdXRwdXQgYml0bWFzaworICAgIHNwPEFNZXNzYWdlPiBnZXRTZGtGb3JtYXRGb3JEb21haW4oCisgICAgICAgICAgICBjb25zdCBSZWZsZWN0ZWRQYXJhbVVwZGF0ZXI6OkRpY3QgJnJlZmxlY3RlZCwgRG9tYWluIGRvbWFpbikgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0cyBhIHNldCBvZiBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgaW4gYW4gQU1lc3NhZ2UgdG8gYSBsaXN0IG9mIHBhdGgtYmFzZWQgQ29kZWMKKyAgICAgKiAyLjAgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzLgorICAgICAqCisgICAgICogXHBhcmFtIGRvbWFpbiBjb25maWcvc2V0UGFyYW0gYml0bWFzaworICAgICAqLworICAgIFJlZmxlY3RlZFBhcmFtVXBkYXRlcjo6RGljdCBnZXRSZWZsZWN0ZWRGb3JtYXQoCisgICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmNvbmZpZywgRG9tYWluIGRvbWFpbikgY29uc3Q7Cit9OworCitERUZJTkVfRU5VTV9PUEVSQVRPUlMoQ0NvZGVjQ29uZmlnOjpEb21haW4pCisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQ19DT0RFQ19IXworCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ29kZWMyQnVmZmVyLmNwcCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9Db2RlYzJCdWZmZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmNjA2MmUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ29kZWMyQnVmZmVyLmNwcApAQCAtMCwwICsxLDgxMCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDb2RlYzJCdWZmZXIiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxoaWRsbWVtb3J5L0ZyYW1ld29ya1V0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvSGFyZHdhcmVBUEkuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjQ29uc3RhbnRzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmg+CisjaW5jbHVkZSA8bmF0aXZlYmFzZS9uYXRpdmViYXNlLmg+CisKKyNpbmNsdWRlIDxDMkFsbG9jYXRvckdyYWxsb2MuaD4KKyNpbmNsdWRlIDxDMkJsb2NrSW50ZXJuYWwuaD4KKyNpbmNsdWRlIDxDMkRlYnVnLmg+CisKKyNpbmNsdWRlICJDb2RlYzJCdWZmZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBDb2RlYzJCdWZmZXIKKworYm9vbCBDb2RlYzJCdWZmZXI6OmNhbkNvcHlMaW5lYXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKSBjb25zdCB7CisgICAgaWYgKGNvbnN0X2Nhc3Q8Q29kZWMyQnVmZmVyICo+KHRoaXMpLT5iYXNlKCkgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmICghYnVmZmVyKSB7CisgICAgICAgIC8vIE5vdGhpbmcgdG8gY29weSwgc28gd2UgY2FuIGNvcHkgYnkgZG9pbmcgbm90aGluZy4KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGlmIChidWZmZXItPmRhdGEoKS50eXBlKCkgIT0gQzJCdWZmZXJEYXRhOjpMSU5FQVIpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoYnVmZmVyLT5kYXRhKCkubGluZWFyQmxvY2tzKCkuc2l6ZSgpID09IDB1KSB7CisgICAgICAgIC8vIE5vdGhpbmcgdG8gY29weSwgc28gd2UgY2FuIGNvcHkgYnkgZG9pbmcgbm90aGluZy4KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBlbHNlIGlmIChidWZmZXItPmRhdGEoKS5saW5lYXJCbG9ja3MoKS5zaXplKCkgPiAxdSkgeworICAgICAgICAvLyBXZSBkb24ndCBrbm93IGhvdyB0byBjb3B5IG1vcmUgdGhhbiBvbmUgYmxvY2tzLgorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChidWZmZXItPmRhdGEoKS5saW5lYXJCbG9ja3MoKVswXS5zaXplKCkgPiBjYXBhY2l0eSgpKSB7CisgICAgICAgIC8vIEl0IHdvbid0IGZpdC4KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBDb2RlYzJCdWZmZXI6OmNvcHlMaW5lYXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKSB7CisgICAgLy8gV2UgYXNzdW1lIHRoYXQgYWxsIGNhbkNvcHlMaW5lYXIoKSBjaGVja3MgcGFzc2VkLgorICAgIGlmICghYnVmZmVyIHx8IGJ1ZmZlci0+ZGF0YSgpLmxpbmVhckJsb2NrcygpLnNpemUoKSA9PSAwdQorICAgICAgICAgICAgfHwgYnVmZmVyLT5kYXRhKCkubGluZWFyQmxvY2tzKClbMF0uc2l6ZSgpID09IDB1KSB7CisgICAgICAgIHNldFJhbmdlKDAsIDApOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgQzJSZWFkVmlldyB2aWV3ID0gYnVmZmVyLT5kYXRhKCkubGluZWFyQmxvY2tzKClbMF0ubWFwKCkuZ2V0KCk7CisgICAgaWYgKHZpZXcuZXJyb3IoKSAhPSBDMl9PSykgeworICAgICAgICBBTE9HRCgiRXJyb3Igd2hpbGUgbWFwcGluZzogJWQiLCB2aWV3LmVycm9yKCkpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmICh2aWV3LmNhcGFjaXR5KCkgPiBjYXBhY2l0eSgpKSB7CisgICAgICAgIEFMT0dEKCJDMkNvbnN0TGluZWFyQmxvY2sgbGllZCAtLS0gaXQgYWN0dWFsbHkgZG9lc24ndCBmaXQ6IHZpZXcoJXUpID4gdGhpcyglenUpIiwKKyAgICAgICAgICAgICAgICB2aWV3LmNhcGFjaXR5KCksIGNhcGFjaXR5KCkpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIG1lbWNweShiYXNlKCksIHZpZXcuZGF0YSgpLCB2aWV3LmNhcGFjaXR5KCkpOworICAgIHNldFJhbmdlKDAsIHZpZXcuY2FwYWNpdHkoKSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgQ29kZWMyQnVmZmVyOjpzZXRJbWFnZURhdGEoY29uc3Qgc3A8QUJ1ZmZlcj4gJmltYWdlRGF0YSkgeworICAgIG1ldGEoKS0+c2V0QnVmZmVyKCJpbWFnZS1kYXRhIiwgaW1hZ2VEYXRhKTsKKyAgICBmb3JtYXQoKS0+c2V0QnVmZmVyKCJpbWFnZS1kYXRhIiwgaW1hZ2VEYXRhKTsKKyAgICBNZWRpYUltYWdlMiAqaW1nID0gKE1lZGlhSW1hZ2UyKilpbWFnZURhdGEtPmRhdGEoKTsKKyAgICBpZiAoaW1nLT5tTnVtUGxhbmVzID4gMCAmJiBpbWctPm1UeXBlICE9IGltZy0+TUVESUFfSU1BR0VfVFlQRV9VTktOT1dOKSB7CisgICAgICAgIGludDMyX3Qgc3RyaWRlID0gaW1nLT5tUGxhbmVbMF0ubVJvd0luYzsKKyAgICAgICAgZm9ybWF0KCktPnNldEludDMyKEtFWV9TVFJJREUsIHN0cmlkZSk7CisgICAgICAgIGlmIChpbWctPm1OdW1QbGFuZXMgPiAxICYmIHN0cmlkZSA+IDApIHsKKyAgICAgICAgICAgIGludDMyX3QgdnN0cmlkZSA9IChpbWctPm1QbGFuZVsxXS5tT2Zmc2V0IC0gaW1nLT5tUGxhbmVbMF0ubU9mZnNldCkgLyBzdHJpZGU7CisgICAgICAgICAgICBmb3JtYXQoKS0+c2V0SW50MzIoS0VZX1NMSUNFX0hFSUdIVCwgdnN0cmlkZSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIExvY2FsTGluZWFyQnVmZmVyCisKK2Jvb2wgTG9jYWxMaW5lYXJCdWZmZXI6OmNhbkNvcHkoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKSBjb25zdCB7CisgICAgcmV0dXJuIGNhbkNvcHlMaW5lYXIoYnVmZmVyKTsKK30KKworYm9vbCBMb2NhbExpbmVhckJ1ZmZlcjo6Y29weShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIpIHsKKyAgICByZXR1cm4gY29weUxpbmVhcihidWZmZXIpOworfQorCisvLyBEdW1teUNvbnRhaW5lckJ1ZmZlcgorCitEdW1teUNvbnRhaW5lckJ1ZmZlcjo6RHVtbXlDb250YWluZXJCdWZmZXIoCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIpCisgICAgOiBDb2RlYzJCdWZmZXIoZm9ybWF0LCBuZXcgQUJ1ZmZlcihudWxscHRyLCAxKSksCisgICAgICBtQnVmZmVyUmVmKGJ1ZmZlcikgeworICAgIHNldFJhbmdlKDAsIGJ1ZmZlciA/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+KHBhcmFtc1swXSktPm0uc3RyKTsKK30KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3V0aWxzL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vdXRpbHMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDQ5ODNjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3V0aWxzL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwzOSBAQAorY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJzZnBsdWdpbl9jY29kZWNfdXRpbHMiLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJDb2RlYzJCdWZmZXJVdGlscy5jcHAiLAorICAgICAgICAiQ29kZWMyTWFwcGVyLmNwcCIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2FsbCIsCisgICAgXSwKKworICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgIi4iLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYmFzZSIsCisgICAgICAgICJsaWJjb2RlYzIiLAorICAgICAgICAibGliY29kZWMyX3ZuZGsiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgY2ZpOiB0cnVlLAorICAgICAgICBtaXNjX3VuZGVmaW5lZDogWworICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgXSwKKyAgICAgICAgZGlhZzogeworICAgICAgICAgICAgY2ZpOiB0cnVlLAorICAgICAgICB9LAorICAgIH0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vdXRpbHMvQ29kZWMyQnVmZmVyVXRpbHMuY3BwIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3V0aWxzL0NvZGVjMkJ1ZmZlclV0aWxzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzUxOWRhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3V0aWxzL0NvZGVjMkJ1ZmZlclV0aWxzLmNwcApAQCAtMCwwICsxLDQwMCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDb2RlYzJCdWZmZXJVdGlscyIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPGxpc3Q+CisjaW5jbHVkZSA8bXV0ZXg+CisKKyNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9IYXJkd2FyZUFQSS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmg+CisKKyNpbmNsdWRlIDxDMkRlYnVnLmg+CisKKyNpbmNsdWRlICJDb2RlYzJCdWZmZXJVdGlscy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK25hbWVzcGFjZSB7CisKKy8qKgorICogQSBmbGlwcGFibGUsIG9wdGltaXphYmxlIG1lbWNweS4gQ29uc3RydWN0cyBzdWNoIGFzIChmcm9tID8gc3JjIDogZHN0KSBkbyBub3Qgd29yayBhcyB0aGUgcmVzdWx0cyBhcmUKKyAqIGFsd2F5cyBjb25zdC4KKyAqLwordGVtcGxhdGU8Ym9vbCBUb0EsIHNpemVfdCBTPgorc3RydWN0IE1lbUNvcGllciB7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgQSwgdHlwZW5hbWUgQj4KKyAgICBpbmxpbmUgc3RhdGljIHZvaWQgY29weShBICphLCBjb25zdCBCICpiLCBzaXplX3Qgc2l6ZSkgeworICAgICAgICBfX2J1aWx0aW5fbWVtY3B5KGEsIGIsIHNpemUpOworICAgIH0KK307CisKK3RlbXBsYXRlPHNpemVfdCBTPgorc3RydWN0IE1lbUNvcGllcjxmYWxzZSwgUz4geworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEEsIHR5cGVuYW1lIEI+CisgICAgaW5saW5lIHN0YXRpYyB2b2lkIGNvcHkoY29uc3QgQSAqYSwgQiAqYiwgc2l6ZV90IHNpemUpIHsKKyAgICAgICAgTWVtQ29waWVyPHRydWUsIFM+Ojpjb3B5KGIsIGEsIHNpemUpOworICAgIH0KK307CisKKy8qKgorICogQ29waWVzIGJldHdlZW4gYSBNZWRpYUltYWdlIGFuZCBhIGdyYXBoaWMgdmlldy4KKyAqCisgKiBccGFyYW0gVG9NZWRpYUltYWdlIHdoZXRoZXIgdG8gY29weSB0byAob3IgZnJvbSkgdGhlIE1lZGlhSW1hZ2UKKyAqIFxwYXJhbSB2aWV3IGdyYXBoaWMgdmlldyAoY291bGQgYmUgQ29uc3RHcmFwaGljVmlldyBvciBHcmFwaGljVmlldyBkZXBlbmRpbmcgb24gZGlyZWN0aW9uKQorICogXHBhcmFtIGltZyBNZWRpYUltYWdlIGRhdGEKKyAqIFxwYXJhbSBpbWdCYXNlIGJhc2Ugb2YgTWVkaWFJbWFnZSAoY291bGQgYmUgY29uc3QgdWludDhfdCogb3IgdWludDhfdCogZGVwZW5kaW5nIG9uIGRpcmVjdGlvbikKKyAqLwordGVtcGxhdGU8Ym9vbCBUb01lZGlhSW1hZ2UsIHR5cGVuYW1lIFZpZXcsIHR5cGVuYW1lIEltYWdlUGl4ZWw+CitzdGF0aWMgc3RhdHVzX3QgX0ltYWdlQ29weShWaWV3ICZ2aWV3LCBjb25zdCBNZWRpYUltYWdlMiAqaW1nLCBJbWFnZVBpeGVsICppbWdCYXNlKSB7CisgICAgLy8gVE9ETzogbW9yZSBlZmZpY2llbnQgY29weWluZyAtLS0gZS5nLiBvbmUgcm93IGF0IGEgdGltZSwgY29weWluZworICAgIC8vICAgICAgIGludGVybGVhdmVkIHBsYW5lcyB0b2dldGhlciwgZXRjLgorICAgIGNvbnN0IEMyUGxhbmFyTGF5b3V0ICZsYXlvdXQgPSB2aWV3LmxheW91dCgpOworICAgIGNvbnN0IHNpemVfdCBicHAgPSBkaXZVcChpbWctPm1CaXREZXB0aEFsbG9jYXRlZCwgOHUpOworICAgIGlmICh2aWV3LndpZHRoKCkgIT0gaW1nLT5tV2lkdGgKKyAgICAgICAgICAgIHx8IHZpZXcuaGVpZ2h0KCkgIT0gaW1nLT5tSGVpZ2h0KSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBsYXlvdXQubnVtUGxhbmVzOyArK2kpIHsKKyAgICAgICAgdHlwZW5hbWUgc3RkOjpjb25kaXRpb25hbDxUb01lZGlhSW1hZ2UsIHVpbnQ4X3QsIGNvbnN0IHVpbnQ4X3Q+Ojp0eXBlICppbWdSb3cgPQorICAgICAgICAgICAgaW1nQmFzZSArIGltZy0+bVBsYW5lW2ldLm1PZmZzZXQ7CisgICAgICAgIHR5cGVuYW1lIHN0ZDo6Y29uZGl0aW9uYWw8VG9NZWRpYUltYWdlLCBjb25zdCB1aW50OF90LCB1aW50OF90Pjo6dHlwZSAqdmlld1JvdyA9CisgICAgICAgICAgICB2aWV3Um93ID0gdmlldy5kYXRhKClbaV07CisgICAgICAgIGNvbnN0IEMyUGxhbmVJbmZvICZwbGFuZSA9IGxheW91dC5wbGFuZXNbaV07CisgICAgICAgIGlmIChwbGFuZS5jb2xTYW1wbGluZyAhPSBpbWctPm1QbGFuZVtpXS5tSG9yaXpTdWJzYW1wbGluZworICAgICAgICAgICAgICAgIHx8IHBsYW5lLnJvd1NhbXBsaW5nICE9IGltZy0+bVBsYW5lW2ldLm1WZXJ0U3Vic2FtcGxpbmcKKyAgICAgICAgICAgICAgICB8fCBwbGFuZS5hbGxvY2F0ZWREZXB0aCAhPSBpbWctPm1CaXREZXB0aEFsbG9jYXRlZAorICAgICAgICAgICAgICAgIHx8IHBsYW5lLmFsbG9jYXRlZERlcHRoIDwgcGxhbmUuYml0RGVwdGgKKyAgICAgICAgICAgICAgICAvLyBNZWRpYUltYWdlIG9ubHkgc3VwcG9ydHMgTVNCIHZhbHVlcworICAgICAgICAgICAgICAgIHx8IHBsYW5lLnJpZ2h0U2hpZnQgIT0gcGxhbmUuYWxsb2NhdGVkRGVwdGggLSBwbGFuZS5iaXREZXB0aAorICAgICAgICAgICAgICAgIHx8IChicHAgPiAxICYmIHBsYW5lLmVuZGlhbm5lc3MgIT0gcGxhbmUuTkFUSVZFKSkgeworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorCisgICAgICAgIHVpbnQzMl90IHBsYW5lVyA9IGltZy0+bVdpZHRoIC8gcGxhbmUuY29sU2FtcGxpbmc7CisgICAgICAgIHVpbnQzMl90IHBsYW5lSCA9IGltZy0+bUhlaWdodCAvIHBsYW5lLnJvd1NhbXBsaW5nOworICAgICAgICBmb3IgKHVpbnQzMl90IHJvdyA9IDA7IHJvdyA8IHBsYW5lSDsgKytyb3cpIHsKKyAgICAgICAgICAgIGRlY2x0eXBlKGltZ1JvdykgaW1nUHRyID0gaW1nUm93OworICAgICAgICAgICAgZGVjbHR5cGUodmlld1Jvdykgdmlld1B0ciA9IHZpZXdSb3c7CisgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGNvbCA9IDA7IGNvbCA8IHBsYW5lVzsgKytjb2wpIHsKKyAgICAgICAgICAgICAgICBNZW1Db3BpZXI8VG9NZWRpYUltYWdlLCAwPjo6Y29weShpbWdQdHIsIHZpZXdQdHIsIGJwcCk7CisgICAgICAgICAgICAgICAgaW1nUHRyICs9IGltZy0+bVBsYW5lW2ldLm1Db2xJbmM7CisgICAgICAgICAgICAgICAgdmlld1B0ciArPSBwbGFuZS5jb2xJbmM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbWdSb3cgKz0gaW1nLT5tUGxhbmVbaV0ubVJvd0luYzsKKyAgICAgICAgICAgIHZpZXdSb3cgKz0gcGxhbmUucm93SW5jOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK3N0YXR1c190IEltYWdlQ29weSh1aW50OF90ICppbWdCYXNlLCBjb25zdCBNZWRpYUltYWdlMiAqaW1nLCBjb25zdCBDMkdyYXBoaWNWaWV3ICZ2aWV3KSB7CisgICAgcmV0dXJuIF9JbWFnZUNvcHk8dHJ1ZT4odmlldywgaW1nLCBpbWdCYXNlKTsKK30KKworc3RhdHVzX3QgSW1hZ2VDb3B5KEMyR3JhcGhpY1ZpZXcgJnZpZXcsIGNvbnN0IHVpbnQ4X3QgKmltZ0Jhc2UsIGNvbnN0IE1lZGlhSW1hZ2UyICppbWcpIHsKKyAgICByZXR1cm4gX0ltYWdlQ29weTxmYWxzZT4odmlldywgaW1nLCBpbWdCYXNlKTsKK30KKworYm9vbCBJc1lVVjQyMChjb25zdCBDMkdyYXBoaWNWaWV3ICZ2aWV3KSB7CisgICAgY29uc3QgQzJQbGFuYXJMYXlvdXQgJmxheW91dCA9IHZpZXcubGF5b3V0KCk7CisgICAgcmV0dXJuIChsYXlvdXQubnVtUGxhbmVzID09IDMKKyAgICAgICAgICAgICYmIGxheW91dC50eXBlID09IEMyUGxhbmFyTGF5b3V0OjpUWVBFX1lVVgorICAgICAgICAgICAgJiYgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfWV0uY2hhbm5lbCA9PSBDMlBsYW5lSW5mbzo6Q0hBTk5FTF9ZCisgICAgICAgICAgICAmJiBsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9ZXS5hbGxvY2F0ZWREZXB0aCA9PSA4CisgICAgICAgICAgICAmJiBsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9ZXS5iaXREZXB0aCA9PSA4CisgICAgICAgICAgICAmJiBsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9ZXS5yaWdodFNoaWZ0ID09IDAKKyAgICAgICAgICAgICYmIGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1ldLmNvbFNhbXBsaW5nID09IDEKKyAgICAgICAgICAgICYmIGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1ldLnJvd1NhbXBsaW5nID09IDEKKyAgICAgICAgICAgICYmIGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1VdLmNoYW5uZWwgPT0gQzJQbGFuZUluZm86OkNIQU5ORUxfQ0IKKyAgICAgICAgICAgICYmIGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1VdLmFsbG9jYXRlZERlcHRoID09IDgKKyAgICAgICAgICAgICYmIGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1VdLmJpdERlcHRoID09IDgKKyAgICAgICAgICAgICYmIGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1VdLnJpZ2h0U2hpZnQgPT0gMAorICAgICAgICAgICAgJiYgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfVV0uY29sU2FtcGxpbmcgPT0gMgorICAgICAgICAgICAgJiYgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfVV0ucm93U2FtcGxpbmcgPT0gMgorICAgICAgICAgICAgJiYgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfVl0uY2hhbm5lbCA9PSBDMlBsYW5lSW5mbzo6Q0hBTk5FTF9DUgorICAgICAgICAgICAgJiYgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfVl0uYWxsb2NhdGVkRGVwdGggPT0gOAorICAgICAgICAgICAgJiYgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfVl0uYml0RGVwdGggPT0gOAorICAgICAgICAgICAgJiYgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfVl0ucmlnaHRTaGlmdCA9PSAwCisgICAgICAgICAgICAmJiBsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9WXS5jb2xTYW1wbGluZyA9PSAyCisgICAgICAgICAgICAmJiBsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9WXS5yb3dTYW1wbGluZyA9PSAyKTsKK30KKworTWVkaWFJbWFnZTIgQ3JlYXRlWVVWNDIwUGxhbmFyTWVkaWFJbWFnZTIoCisgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIHVpbnQzMl90IHN0cmlkZSwgdWludDMyX3QgdnN0cmlkZSkgeworICAgIHJldHVybiBNZWRpYUltYWdlMiB7CisgICAgICAgIC5tVHlwZSA9IE1lZGlhSW1hZ2UyOjpNRURJQV9JTUFHRV9UWVBFX1lVViwKKyAgICAgICAgLm1OdW1QbGFuZXMgPSAzLAorICAgICAgICAubVdpZHRoID0gd2lkdGgsCisgICAgICAgIC5tSGVpZ2h0ID0gaGVpZ2h0LAorICAgICAgICAubUJpdERlcHRoID0gOCwKKyAgICAgICAgLm1CaXREZXB0aEFsbG9jYXRlZCA9IDgsCisgICAgICAgIC5tUGxhbmUgPSB7CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLm1PZmZzZXQgPSAwLAorICAgICAgICAgICAgICAgIC5tQ29sSW5jID0gMSwKKyAgICAgICAgICAgICAgICAubVJvd0luYyA9IChpbnQzMl90KXN0cmlkZSwKKyAgICAgICAgICAgICAgICAubUhvcml6U3Vic2FtcGxpbmcgPSAxLAorICAgICAgICAgICAgICAgIC5tVmVydFN1YnNhbXBsaW5nID0gMSwKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLm1PZmZzZXQgPSBzdHJpZGUgKiB2c3RyaWRlLAorICAgICAgICAgICAgICAgIC5tQ29sSW5jID0gMSwKKyAgICAgICAgICAgICAgICAubVJvd0luYyA9IChpbnQzMl90KXN0cmlkZSAvIDIsCisgICAgICAgICAgICAgICAgLm1Ib3JpelN1YnNhbXBsaW5nID0gMiwKKyAgICAgICAgICAgICAgICAubVZlcnRTdWJzYW1wbGluZyA9IDIsCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC5tT2Zmc2V0ID0gc3RyaWRlICogdnN0cmlkZSAqIDUgLyA0LAorICAgICAgICAgICAgICAgIC5tQ29sSW5jID0gMSwKKyAgICAgICAgICAgICAgICAubVJvd0luYyA9IChpbnQzMl90KXN0cmlkZSAvIDIsCisgICAgICAgICAgICAgICAgLm1Ib3JpelN1YnNhbXBsaW5nID0gMiwKKyAgICAgICAgICAgICAgICAubVZlcnRTdWJzYW1wbGluZyA9IDIsCisgICAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgfTsKK30KKworTWVkaWFJbWFnZTIgQ3JlYXRlWVVWNDIwU2VtaVBsYW5hck1lZGlhSW1hZ2UyKAorICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCB1aW50MzJfdCBzdHJpZGUsIHVpbnQzMl90IHZzdHJpZGUpIHsKKyAgICByZXR1cm4gTWVkaWFJbWFnZTIgeworICAgICAgICAubVR5cGUgPSBNZWRpYUltYWdlMjo6TUVESUFfSU1BR0VfVFlQRV9ZVVYsCisgICAgICAgIC5tTnVtUGxhbmVzID0gMywKKyAgICAgICAgLm1XaWR0aCA9IHdpZHRoLAorICAgICAgICAubUhlaWdodCA9IGhlaWdodCwKKyAgICAgICAgLm1CaXREZXB0aCA9IDgsCisgICAgICAgIC5tQml0RGVwdGhBbGxvY2F0ZWQgPSA4LAorICAgICAgICAubVBsYW5lID0geworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC5tT2Zmc2V0ID0gMCwKKyAgICAgICAgICAgICAgICAubUNvbEluYyA9IDEsCisgICAgICAgICAgICAgICAgLm1Sb3dJbmMgPSAoaW50MzJfdClzdHJpZGUsCisgICAgICAgICAgICAgICAgLm1Ib3JpelN1YnNhbXBsaW5nID0gMSwKKyAgICAgICAgICAgICAgICAubVZlcnRTdWJzYW1wbGluZyA9IDEsCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC5tT2Zmc2V0ID0gc3RyaWRlICogdnN0cmlkZSwKKyAgICAgICAgICAgICAgICAubUNvbEluYyA9IDIsCisgICAgICAgICAgICAgICAgLm1Sb3dJbmMgPSAoaW50MzJfdClzdHJpZGUsCisgICAgICAgICAgICAgICAgLm1Ib3JpelN1YnNhbXBsaW5nID0gMiwKKyAgICAgICAgICAgICAgICAubVZlcnRTdWJzYW1wbGluZyA9IDIsCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC5tT2Zmc2V0ID0gc3RyaWRlICogdnN0cmlkZSArIDEsCisgICAgICAgICAgICAgICAgLm1Db2xJbmMgPSAyLAorICAgICAgICAgICAgICAgIC5tUm93SW5jID0gKGludDMyX3Qpc3RyaWRlLAorICAgICAgICAgICAgICAgIC5tSG9yaXpTdWJzYW1wbGluZyA9IDIsCisgICAgICAgICAgICAgICAgLm1WZXJ0U3Vic2FtcGxpbmcgPSAyLAorICAgICAgICAgICAgfQorICAgICAgICB9LAorICAgIH07Cit9CisKK3N0YXR1c190IENvbnZlcnRSR0JUb1BsYW5hcllVVigKKyAgICAgICAgdWludDhfdCAqZHN0WSwgc2l6ZV90IGRzdFN0cmlkZSwgc2l6ZV90IGRzdFZTdHJpZGUsIHNpemVfdCBidWZmZXJTaXplLAorICAgICAgICBjb25zdCBDMkdyYXBoaWNWaWV3ICZzcmMpIHsKKyAgICBDSEVDSyhkc3RZICE9IG51bGxwdHIpOworICAgIENIRUNLKChzcmMud2lkdGgoKSAmIDEpID09IDApOworICAgIENIRUNLKChzcmMuaGVpZ2h0KCkgJiAxKSA9PSAwKTsKKworICAgIGlmIChkc3RTdHJpZGUgKiBkc3RWU3RyaWRlICogMyAvIDIgPiBidWZmZXJTaXplKSB7CisgICAgICAgIEFMT0dEKCJjb252ZXJzaW9uIGJ1ZmZlciBpcyB0b28gc21hbGwgZm9yIGNvbnZlcnRpbmcgZnJvbSBSR0IgdG8gWVVWIik7CisgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgfQorCisgICAgdWludDhfdCAqZHN0VSA9IGRzdFkgKyBkc3RTdHJpZGUgKiBkc3RWU3RyaWRlOworICAgIHVpbnQ4X3QgKmRzdFYgPSBkc3RVICsgKGRzdFN0cmlkZSA+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+CisgICAgICAgIEdldFByb2ZpbGVMZXZlbE1hcHBlcihzdGQ6OnN0cmluZyBtZWRpYVR5cGUpOworCisgICAgICAgIC8vIGNvbnZlcnQgYmV0d2VlbiBiaXRyYXRlcworICAgICAgICBzdGF0aWMgYm9vbCBtYXAoQzJDb25maWc6OmJpdHJhdGVfbW9kZV90LCBpbnQzMl90Kik7CisgICAgICAgIHN0YXRpYyBib29sIG1hcChpbnQzMl90LCBDMkNvbmZpZzo6Yml0cmF0ZV9tb2RlX3QqKTsKKworICAgICAgICAvLyBjb252ZXJ0IGJldHdlZW4gcGNtIGVuY29kaW5ncworICAgICAgICBzdGF0aWMgYm9vbCBtYXAoQzJDb25maWc6OnBjbV9lbmNvZGluZ190LCBpbnQzMl90Kik7CisgICAgICAgIHN0YXRpYyBib29sIG1hcChpbnQzMl90LCBDMkNvbmZpZzo6cGNtX2VuY29kaW5nX3QqKTsKKworICAgICAgICAvLyBjb252ZXJ0IGJldHdlZW4gcGljdHVyZSB0eXBlcworICAgICAgICBzdGF0aWMgYm9vbCBtYXAoQzJDb25maWc6OnBpY3R1cmVfdHlwZV90LCBpbnQzMl90Kik7CisgICAgICAgIHN0YXRpYyBib29sIG1hcChpbnQzMl90LCBDMkNvbmZpZzo6cGljdHVyZV90eXBlX3QqKTsKKworICAgICAgICAvLyBjb252ZXJ0IGJldHdlZW4gY29sb3IgYXNwZWN0cworICAgICAgICBzdGF0aWMgYm9vbCBtYXAoQzJDb2xvcjo6cmFuZ2VfdCwgaW50MzJfdCopOworICAgICAgICBzdGF0aWMgYm9vbCBtYXAoaW50MzJfdCwgQzJDb2xvcjo6cmFuZ2VfdCopOworICAgICAgICBzdGF0aWMgYm9vbCBtYXAoQzJDb2xvcjo6cHJpbWFyaWVzX3QsIEMyQ29sb3I6Om1hdHJpeF90LCBpbnQzMl90Kik7CisgICAgICAgIHN0YXRpYyBib29sIG1hcChpbnQzMl90LCBDMkNvbG9yOjpwcmltYXJpZXNfdCosIEMyQ29sb3I6Om1hdHJpeF90Kik7CisgICAgICAgIHN0YXRpYyBib29sIG1hcChDMkNvbG9yOjp0cmFuc2Zlcl90LCBpbnQzMl90Kik7CisgICAgICAgIHN0YXRpYyBib29sIG1hcChpbnQzMl90LCBDMkNvbG9yOjp0cmFuc2Zlcl90Kik7CisKKyAgICAgICAgc3RhdGljIGJvb2wgbWFwKAorICAgICAgICAgICAgICAgIEMyQ29sb3I6OnJhbmdlX3QsIEMyQ29sb3I6OnByaW1hcmllc190LCBDMkNvbG9yOjptYXRyaXhfdCwgQzJDb2xvcjo6dHJhbnNmZXJfdCwKKyAgICAgICAgICAgICAgICB1aW50MzJfdCAqZGF0YVNwYWNlKTsKKworICAgICAgICBzdGF0aWMgYm9vbCBtYXAoQzJDb2xvcjo6cmFuZ2VfdCwgQ29sb3JBc3BlY3RzOjpSYW5nZSopOworICAgICAgICBzdGF0aWMgYm9vbCBtYXAoQ29sb3JBc3BlY3RzOjpSYW5nZSwgQzJDb2xvcjo6cmFuZ2VfdCopOworICAgICAgICBzdGF0aWMgYm9vbCBtYXAoQzJDb2xvcjo6cHJpbWFyaWVzX3QsIENvbG9yQXNwZWN0czo6UHJpbWFyaWVzKik7CisgICAgICAgIHN0YXRpYyBib29sIG1hcChDb2xvckFzcGVjdHM6OlByaW1hcmllcywgQzJDb2xvcjo6cHJpbWFyaWVzX3QqKTsKKyAgICAgICAgc3RhdGljIGJvb2wgbWFwKEMyQ29sb3I6Om1hdHJpeF90LCBDb2xvckFzcGVjdHM6Ok1hdHJpeENvZWZmcyopOworICAgICAgICBzdGF0aWMgYm9vbCBtYXAoQ29sb3JBc3BlY3RzOjpNYXRyaXhDb2VmZnMsIEMyQ29sb3I6Om1hdHJpeF90Kik7CisgICAgICAgIHN0YXRpYyBib29sIG1hcChDMkNvbG9yOjp0cmFuc2Zlcl90LCBDb2xvckFzcGVjdHM6OlRyYW5zZmVyKik7CisgICAgICAgIHN0YXRpYyBib29sIG1hcChDb2xvckFzcGVjdHM6OlRyYW5zZmVyLCBDMkNvbG9yOjp0cmFuc2Zlcl90Kik7CisgICAgfTsKK30KKworI2VuZGlmICAvLyBBTkRST0lEX0NPREVDMl9NQVBQRVJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi90ZXN0cy9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL3Rlc3RzL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU0MGY3YgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi90ZXN0cy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNzYgQEAKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJjb2RlYzJfY29yZV9wYXJhbV90ZXN0IiwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIkMyUGFyYW1fdGVzdC5jcHAiLAorICAgIF0sCisKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvY29kZWMyL2luY2x1ZGUiLAorICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlIiwKKyAgICBdLAorCisgICAgLy8gcGFyYW0gdGVzdHMgbXVzdCBub3QgZGVwZW5kIG9uIGFueSBjb2RlYzIgbGlicmFyaWVzIGFzIGFsbCBwYXJhbXMgc2hvdWxkIGJlIHRlbXBsYXRlZAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2FsbCIsCisgICAgXSwKK30KKworY2NfdGVzdCB7CisgICAgbmFtZTogImNvZGVjMl92bmRrX3Rlc3QiLAorCisgICAgc3JjczogWworICAgICAgICAiQzJfdGVzdC5jcHAiLAorICAgICAgICAiQzJTYW1wbGVDb21wb25lbnRfdGVzdC5jcHAiLAorICAgICAgICAiQzJVdGlsVGVzdC5jcHAiLAorICAgICAgICAidm5kay9DMkJ1ZmZlclRlc3QuY3BwIiwKKyAgICBdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJjb2RlYzIiLAorICAgICAgICAibGliY29kZWMyX3ZuZGsiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2FsbCIsCisgICAgXSwKK30KKworY2NfdGVzdCB7CisgICAgbmFtZTogImNvZGVjMl92bmRrX2ludGVyZmFjZV90ZXN0IiwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIkMyQ29tcG9uZW50SW50ZXJmYWNlX3Rlc3QuY3BwIiwKKyAgICBdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJjb2RlYzIiLAorICAgICAgICAibGliY29kZWMyX3ZuZGsiLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdhbGwiLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdGVzdHMvQzJDb21wb25lbnRJbnRlcmZhY2VfdGVzdC5jcHAgYi9tZWRpYS9jb2RlYzIvdGVzdHMvQzJDb21wb25lbnRJbnRlcmZhY2VfdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTkwNzk2NAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi90ZXN0cy9DMkNvbXBvbmVudEludGVyZmFjZV90ZXN0LmNwcApAQCAtMCwwICsxLDcwNiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJDMkNvbXBvbmVudEludGVyZmFjZV90ZXN0IgorCisjaW5jbHVkZSA8ZGxmY24uaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8QzJDb25maWcuaD4KKyNpbmNsdWRlIDx1dGlsL0MySW50ZXJmYWNlSGVscGVyLmg+CisjaW5jbHVkZSA8QzJQYXJhbS5oPgorCisjaWYgIWRlZmluZWQoVU5VU0VEKQorI2RlZmluZSBVTlVTRUQoZXhwcikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAodm9pZCkoZXhwcik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCisjZW5kaWYgLy8hZGVmaW5lZChVTlVTRUQpCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKwordGVtcGxhdGUgPGNsYXNzIFQ+IHN0ZDo6dW5pcXVlX3B0cjxUPiBhbGxvY191bmlxdWVfY3N0cihjb25zdCBjaGFyICpjc3RyKSB7CisgICAgc2l6ZV90IGxlbiA9IHN0cmxlbihjc3RyKTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8VD4gcHRyID0gVDo6QWxsb2NVbmlxdWUobGVuKTsKKyAgICBtZW1jcHkocHRyLT5tLnZhbHVlLCBjc3RyLCBsZW4pOworICAgIHJldHVybiBwdHI7Cit9CisKK2NsYXNzIEMyQ29tcEludGZUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7Citwcm90ZWN0ZWQ6CisgICAgQzJDb21wSW50ZlRlc3QoKSB7fQorICAgIH5DMkNvbXBJbnRmVGVzdCgpIG92ZXJyaWRlIHt9CisKKyAgICB2b2lkIHNldENvbXBvbmVudChzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+IGludGYpIHsKKyAgICAgICAgbUludGYgPSBpbnRmOworICAgIH0KKworICAgIHZvaWQgcmVzZXRSZXN1bHRzKCkgeworICAgICAgICBtSW50ZiA9IG51bGxwdHI7CisgICAgICAgIG1QYXJhbVJlc3VsdHMuY2xlYXIoKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gdm9pZCB0ZXN0VW5zdXBwb3J0ZWRQYXJhbSgpOworCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHZvaWQgdGVzdFN1cHBvcnRlZFBhcmFtKCk7CisKKyAgICAvLyB0ZXN0UmVhZE9ubHlQYXJhbSgpIGFuZCB0ZXN0V3JpdGFibGVQYXJhbSgpIGFyZSB0aGUgbWFpbiBmdW5jdGlvbnMgZm9yIHRlc3RpbmcgYSBwYXJhbWV0ZXIuCisgICAgLy8gQSBjYWxsZXIgc2hvdWxkIGZpbmQgb3V0IGlmIGEgdGVzdGVkIHBhcmFtZXRlciBpcyByZWFkLW9ubHkgb3Igd3JpdGFibGUgYmVmb3JlIGNhbGxpbmcgdGhlbQorICAgIC8vIGFuZCBpdCBtdXN0IGNhbGwgb25lIG9mIHRoZSBjb3JyZXNwb25kZWQgdGhlbS4KKworICAgIC8vIElmIGEgcGFyYW1ldGVyIGlzIHJlYWQtb25seSB0aGlzIGlzIGNhbGxlZC4KKyAgICAvLyBUZXN0IHJlYWQtb25seSBwYXJhbWV0ZXIgfHByZVBhcmFtfC4gVGhlIHRlc3QgZXhwZWN0cyBmYWlsdXJlIHdoaWxlIGNvbmZpZygpIHdpdGggfG5ld1BhcmFtfCwKKyAgICAvLyBhbmQgbWFrZSBzdXJlIHxwcmVQYXJhbXwgc3RheSB1bmNoYW5nZWQuCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgICAgdm9pZCB0ZXN0UmVhZE9ubHlQYXJhbShjb25zdCBUICZwcmVQYXJhbSwgY29uc3QgVCAmbmV3UGFyYW0pOworCisgICAgLy8gSWYgYSBwYXJhbWV0ZXIgaXMgd3JpdGFibGUgdGhpcyBpcyBjYWxsZWQuCisgICAgLy8gVGVzdCBvbmUgZmlsZWQgfHdyaXRhYmxlRmllbGR8IGZvciBnaXZlbiB3cml0YWJsZSBwYXJhbWV0ZXIgfHBhcmFtfC4KKyAgICAvLyB8dmFsaWRWYWx1ZXN8IGNvbnRhaW5zIGFsbCB2YWx1ZXMgb2J0YWluZWQgZnJvbSBxdWVyeVN1cHBvcnRlZFZhbHVlcygpIGZvciB8d3JpdGFibGVGaWVsZHwuCisgICAgLy8gVGhlIHRlc3QgY2hlY2tzIHZhbGlkaXR5IGZvciBjb25maWcoKSB3aXRoIGVhY2ggdmFsdWUsIGFuZCBtYWtlIHN1cmUgdmFsdWVzIGFyZSBjb25maWctZWQKKyAgICAvLyBieSBxdWVyeSgpIHRoZW0gb3V0LiB8aW52YWxpZFZhbHVlc3wgY29udGFpbnMgc29tZSB2YWx1ZXMgd2hpY2ggYXJlIG5vdCBpbiB8dmFsaWRWYWx1ZXN8LgorICAgIC8vIFRoZSB0ZXN0IGV4cGVjdHMgQzJfQkFEX1ZBTFVFIHdoaWxlIGNvbmZpZygpIHdpdGggdGhlc2UgdmFsdWVzLAorICAgIC8vIGFuZCB8cGFyYW18IHNob3VsZCBzdGF5IHVuY2hhbmdlZC4KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVFBhcmFtLCB0eXBlbmFtZSBUUmVhbEZpZWxkLCB0eXBlbmFtZSBURmllbGQ+CisgICAgdm9pZCB0ZXN0V3JpdGFibGVQYXJhbShUUGFyYW0gKmNvbnN0IHBhcmFtLCBUUmVhbEZpZWxkICpjb25zdCB3cml0YWJsZUZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8VEZpZWxkPiAmdmFsaWRWYWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxURmllbGQ+ICZpbnZhbGlkVmFsdWVzKTsKKworICAgIC8vIFRlc3QgYWxsIHRoZSBkZWZpbmVkIHBhcmFtZXRlcnMgaW4gQzJQYXJhbS5oLgorICAgIHZvaWQgdGVzdE1haW4oc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiBpbnRmLAorICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmNvbXBvbmVudE5hbWUpOworCisgICAgLy8gQ2hlY2sgcGVybWlzc2lvbiBvZiBwYXJhbWV0ZXIgdHlwZSB8VHwgZm9yIHRlc3RpbmcgaW50ZXJmYWNlLgorICAgIC8vIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCBmaXJzdCBvZiB0aGUgdGVzdGluZyBwZXIgcGFyYW1ldGVyIHR5cGUsCisgICAgLy8gdGhlcmVmb3JlIGRpZmZlcmVudCB0ZXN0aW5nIHByb2Nlc3MgaXMgYXBwbGllZCBhY2NvcmRpbmcgdG8gdGhlIHBlcm1pc3Npb24gdHlwZS4KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgICB2b2lkIGNoZWNrUGFyYW1QZXJtaXNzaW9uKAorICAgICAgICAgICAgaW50ICpjb25zdCB3cml0YWJsZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4+ICZzdXBwb3J0ZWRQYXJhbXMpOworCitwcml2YXRlOgorICAgIGVudW0gUGFyYW1QZXJtaXNzaW9uIDogaW50IHsKKyAgICAgICAgV1JJVEFCTEUsCisgICAgICAgIFJFQURPTkxZLAorICAgICAgICBVTlNVUFBPUlRFRCwKKyAgICB9OworCisgICAgc3RydWN0IHBhcmFtVGVzdEluZm8geworICAgICAgICBzdGQ6OnN0cmluZyBuYW1lOworICAgICAgICBpbnQgcmVzdWx0OworICAgICAgICBwYXJhbVRlc3RJbmZvKGNvbnN0IGNoYXIgKm5hbWVfLCBpbnQgcmVzdWx0XykKKyAgICAgICAgICAgIDogbmFtZShuYW1lXyksIHJlc3VsdChyZXN1bHRfKSB7fQorICAgIH07CisKKyAgICAvLyBxdWVyeU9uU3RhY2soKSBhbmQgcXVlcnlvbkhlYXAoKSBib3RoIGNhbGwgYW4gaW50ZXJmYWNlJ3MgcXVlcnlfdmIoKSBhbmQKKyAgICAvLyBjaGVjayBpZiBhIGNvbXBvbmVudCBoYXMgYSBwYXJhbWV0ZXIgd2hvc2UgdHlwZSBpcyB8VHwuCisgICAgLy8gSWYgYSBjb21wb25lbnQgaGFzLCB0aGUgdmFsdWUgc2hvdWxkIGJlIGNvcGllZCBpbnRvIGFuIGFyZ3VtZW50LCB0aGF0IGlzCisgICAgLy8gfHB8IGluIHF1ZXJ5T25TdGFjaygpIGFuZCB8aGVhcFBhcmFtc3wgaW4gcXVlcnlPbkhlYXAoKS4KKyAgICAvLyBUaGUgcmV0dXJuIHZhbHVlIGlzIGMyX3N0YXR1c190IChlLmcuIEMyX09LKS4KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gYzJfc3RhdHVzX3QgcXVlcnlPblN0YWNrKFQgKmNvbnN0IHApOworCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgICAgYzJfc3RhdHVzX3QgcXVlcnlPbkhlYXAoY29uc3QgVCAmcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+ICpjb25zdCBoZWFwUGFyYW1zKTsKKworICAgIC8vIEdldCBhIHZhbHVlIHdob3NlIHR5cGUgaXMgfFR8IGluIGEgY29tcG9uZW50LiBUaGUgdmFsdWUgaXMgY29waWVkIHRvIHxwYXJhbXwuCisgICAgLy8gVGhpcyBzaG91bGQgYmUgY2FsbGVkIG9ubHkgaWYgYSBjb21wb25lbnQgaGFzIHRoZSBwYXJhbWV0ZXIuCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHZvaWQgZ2V0VmFsdWUoVCAqY29uc3QgcGFyYW0pOworCisgICAgLy8gQ2hlY2sgaWYgdGhlIHBhcmFtZXRlcidzIHZhbHVlIGluIGNvbXBvbmVudCBpcyBlcXVhbCB0byB8ZXhwZWN0ZWR8IGFuZAorICAgIC8vIHF1ZXJ5T25TdGFjaygpIGFuZCBxdWVyeU9uSGVhcCgpIGFyZSBzdWNjZWVkZWQuIFdoZW4gdGhpcyBmdW5jdGlvbiBjYWxsZWQsCisgICAgLy8gaXQgc2hvdWxkIGJlIGd1YXJhbnRlZWQgYSBjb21wb25lbnQgaGFzIHRoZSBwYXJhbWV0ZXIuCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHZvaWQgcXVlcnlQYXJhbUFzRXhwZWN0ZWQoY29uc3QgVCAmZXhwZWN0ZWQpOworCisgICAgLy8gVGVzdCBpZiBxdWVyeSBmdW5jdGlvbnMgd29ya3MgY29ycmVjdGx5IGZvciBzdXBwb3J0ZWQgcGFyYW1ldGVycy4KKyAgICAvLyAiU3VwcG9ydCIgbWVhbnMgaGVyZSBhIGNvbXBvbmVudCBoYXMgdGhlIHBhcmFtZXRlci4KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gdm9pZCBxdWVyeVN1cHBvcnRlZFBhcmFtKCk7CisKKyAgICAvLyBUZXN0IHF1ZXJ5IGZ1bmN0aW9ucyB3b3JrcyBjb3JyZWN0bHkgZm9yIHVuc3VwcG9ydGVkIHBhcmFtZXRlcnMuCisgICAgLy8gIlVuc3VwcG9ydCIgbWVhbnMgaGVyZSBhIGNvbXBvbmVudCBkb2Vzbid0IGhhdmUgdGhlIHBhcmFtZXRlci4KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gdm9pZCBxdWVyeVVuc3VwcG9ydGVkUGFyYW0oKTsKKworICAgIC8vIEV4ZWN1dGUgYW4gaW50ZXJmYWNlJ3MgY29uZmlnX3ZiKCkuIHxUfCBpcyBhIHNpbmdsZSBwYXJhbWV0ZXIgdHlwZSwgbm90IHN0ZDo6dmVjdG9yLgorICAgIC8vIGNvbmZpZygpIGNyZWF0ZXMgc3RkOjp2ZWN0b3I8QzJQYXJhbSAqPiB7cH0gYW5kIHBhc3NlcyBpdCB0byBjb25maWdfdmIoKS4KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgICBjMl9zdGF0dXNfdAorICAgIGNvbmZpZyhUICpjb25zdCBwLAorICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gKmNvbnN0IGZhaWx1cmVzKTsKKworICAgIC8vIFRlc3QgaWYgY29uZmlnIHdvcmtzIGNvcnJlY3RseSBmb3IgcmVhZC1vbmx5IHBhcmFtZXRlcnMuCisgICAgLy8gQmVjYXVzZSB0aGUgZmFpbHVyZSBvZiBjb25maWcoKSBpcyBhc3N1bWVkLCB8bmV3UGFyYW18IGRvZXNuJ3QgbWF0dGVyLgorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiB2b2lkIGNvbmZpZ1JlYWRPbmx5UGFyYW0oY29uc3QgVCAmbmV3UGFyYW0pOworCisgICAgLy8gVGVzdCBpZiBjb25maWcgd29ya3MgY29ycmVjdGx5IGZvciB3cml0YWJsZSBwYXJhbWV0ZXJzLgorICAgIC8vIFRoaXMgY2hhbmdlcyB0aGUgcGFyYW1ldGVyJ3MgdmFsdWUgdG8gfG5ld1BhcmFtfC4KKyAgICAvLyB8c3RDb25maWd8IGlzIGEgcmV0dXJuIHZhbHVlIG9mIGNvbmZpZygpLgorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiB2b2lkIGNvbmZpZ1dyaXRhYmxlUGFyYW1WYWxpZFZhbHVlKGNvbnN0IFQgJm5ld1BhcmFtLCBjMl9zdGF0dXNfdCAqc3RDb25maWcpOworCisgICAgLy8gVGVzdCBpZiBjb25maWcgd29ya3MgY29ycmVjdGx5IGluIHRoZSBjYXNlIGFuIGludmFsaWQgdmFsdWUgfG5ld1BhcmFtfCBpcyB0cmllZCB0byB3cml0ZQorICAgIC8vIHRvIGFuIHdyaXRhYmxlIHBhcmFtZXRlci4KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gdm9pZCBjb25maWdXcml0YWJsZVBhcmFtSW52YWxpZFZhbHVlKGNvbnN0IFQgJm5ld1BhcmFtKTsKKworICAgIC8vIENyZWF0ZSB2YWx1ZXMgZm9yIHRlc3RpbmcgZnJvbSB8dmFsaWRWYWx1ZUluZm9zfC4gVGhlIHZhbHVlcyBhcmUgcmV0dXJuZWQgYXMgYXJndW1lbnRzLgorICAgIC8vIHx2YWxpZFZhbHVlc3wgOiB2YWxpZCB2YWx1ZXMsIHdoaWNoIGNhbiBiZSB3cml0dGVuIGZvciB0aGUgcGFyYW1ldGVyLgorICAgIC8vIHxJbnZhbGlkVmFsdWVzfCA6IGludmFsaWQgdmFsdWVzLCB3aGljaCBjYW5ub3QgYmUgd3JpdHRlbiBmb3IgdGhlIHBhcmFtZXRlci4KKyAgICAvLyAgICAgICAgICAgICAgICAgICBjb25maWcoKSBzaG91bGQgYmUgZmFpbGVkIGlmIHRoZXNlIHZhbHVlcyBhcmUgdXNlZCBhcyBuZXcgdmFsdWVzLgorICAgIC8vIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBvbmx5IGZvciB3cml0YWJsZSBhbmQgc3VwcG9ydGVkIHBhcmFtZXRlcnMuCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFRGaWVsZD4KKyAgICB2b2lkIGdldFRlc3RWYWx1ZXMoY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyAmdmFsaWRWYWx1ZUluZm9zLAorICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxURmllbGQ+ICpjb25zdCB2YWxpZFZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8VEZpZWxkPiAqY29uc3QgaW52YWxpZFZhbHVlcyk7CisKKyAgICAvLyBPdXRwdXQgdGhlIHN1bW1hcnkgb2YgdGVzdCByZXN1bHRzLiBDYXRlZ29yaXplcyBwYXJhbWV0ZXJzIHdpdGggdGhlaXIgY29uZmlndXJhdGlvbi4KKyAgICB2b2lkIG91dHB1dFJlc3VsdHMoY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUpOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiBtSW50ZjsKKyAgICBzdGQ6OnZlY3RvcjxwYXJhbVRlc3RJbmZvPiBtUGFyYW1SZXN1bHRzOworICAgIHN0ZDo6c3RyaW5nIG1DdXJyZW50UGFyYW1OYW1lOworfTsKKworLy8gZmFjdG9yeSBmdW5jdGlvbgorLy8gVE9ETyhoaXJvaCk6IEFkZCBmYWN0b3J5IGZ1bmN0aW9ucyBmb3Igb3RoZXIgdHlwZXMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RkOjp1bmlxdWVfcHRyPFQ+IG1ha2VQYXJhbSgpIHsKKyAgICByZXR1cm4gc3RkOjptYWtlX3VuaXF1ZTxUPigpOworfQorCit0ZW1wbGF0ZSA8PiBzdGQ6OnVuaXF1ZV9wdHI8QzJQb3J0TWltZUNvbmZpZzo6aW5wdXQ+IG1ha2VQYXJhbSgpIHsKKyAgICAvLyBUT0RPKGhpcm9oKTogU2V0IG1vcmUgcHJlY2lzZSBsZW5ndGguCisgICAgcmV0dXJuIEMyUG9ydE1pbWVDb25maWc6OmlucHV0OjpBbGxvY1VuaXF1ZSgxMDApOworfQorCisjZGVmaW5lIFRSQUNFRF9GQUlMVVJFKGZ1bmMpICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBTQ09QRURfVFJBQ0UobUN1cnJlbnRQYXJhbU5hbWUpOyAgICAgICAgICAgICBcCisgICAgICAgIGZ1bmM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKDo6dGVzdGluZzo6VGVzdDo6SGFzRmF0YWxGYWlsdXJlKCkpIHsgICAgICAgXAorICAgICAgICAgICAgcmV0dXJuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IHdoaWxlIChmYWxzZSkKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGMyX3N0YXR1c190IEMyQ29tcEludGZUZXN0OjpxdWVyeU9uU3RhY2soVCAqY29uc3QgcCkgeworICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiBzdGFja1BhcmFtc3twfTsKKyAgICByZXR1cm4gbUludGYtPnF1ZXJ5X3ZiKHN0YWNrUGFyYW1zLCB7fSwgQzJfRE9OVF9CTE9DSywgbnVsbHB0cik7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorYzJfc3RhdHVzX3QgQzJDb21wSW50ZlRlc3Q6OnF1ZXJ5T25IZWFwKAorICAgICAgICBjb25zdCBUICZwLCBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+ICpjb25zdCBoZWFwUGFyYW1zKSB7CisgICAgdWludDMyX3QgaW5kZXggPSBwLmluZGV4KCkgJiB+MHgwM0ZFMDAwMDsKKyAgICBpZiAocC5mb3JTdHJlYW0oKSkgeworICAgICAgICBpbmRleCB8PSAoKHAuc3RyZWFtKCkgPDwgMTcpICYgMHgwMUZFMDAwMCkgfCAweDAyMDAwMDAwOworICAgIH0KKyAgICByZXR1cm4gbUludGYtPnF1ZXJ5X3ZiKHt9LCB7aW5kZXh9LCBDMl9ET05UX0JMT0NLLCBoZWFwUGFyYW1zKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHZvaWQgQzJDb21wSW50ZlRlc3Q6OmdldFZhbHVlKFQgKmNvbnN0IHBhcmFtKSB7CisgICAgLy8gV2hlbiBnZXRWYWx1ZSgpIGlzIGNhbGxlZCwgYSBjb21wb25lbnQgaGFzIHRvIGhhdmUgdGhlIHBhcmFtZXRlci4KKyAgICBBU1NFUlRfRVEoQzJfT0ssIHF1ZXJ5T25TdGFjayhwYXJhbSkpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3ZvaWQgQzJDb21wSW50ZlRlc3Q6OnF1ZXJ5UGFyYW1Bc0V4cGVjdGVkKGNvbnN0IFQgJmV4cGVjdGVkKSB7CisgICAgLy8gVE9ETyhoaXJvaCk6IERvbid0IGNyZWF0ZSBwYXJhbSBvbiBzdGFjayBhbmQgY2FsbCBxdWVyeU9uU3RhY2sgZm9yIGZsZXggcGFyYW1zLgorICAgIC8vIE5vdGUgdGhhdCBhbGwgdGhlIGN1cnJlbnQgc3VwcG9ydGVkIHBhcmFtZXRlcnMgYXJlIG5vbi1mbGV4IHBhcmFtcy4KKyAgICBUIHN0YWNrOworICAgIHN0ZDo6dW5pcXVlX3B0cjxUPiBwSGVhcCA9IG1ha2VQYXJhbTxUPigpOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gaGVhcFBhcmFtczsKKworICAgIEFTU0VSVF9FUShDMl9PSywgcXVlcnlPblN0YWNrKCZzdGFjaykpOworCisgICAgLy8gfHN0YWNrfCBpcyBhIHBhcmFtZXRlciB2YWx1ZS4gVGhlIHBhcmFtZXRlciBzaXplIHNob3VsZG4ndCBiZSAwLgorICAgIEVYUEVDVF9ORSgwdSwgc3RhY2suc2l6ZSgpKTsKKyAgICBFWFBFQ1RfRVEoc3RhY2ssIGV4cGVjdGVkKTsKKworICAgIEFTU0VSVF9FUShDMl9PSywgcXVlcnlPbkhlYXAoKnBIZWFwLCAmaGVhcFBhcmFtcykpOworCisgICAgLy8gfCpoZWFwUGFyYW1zWzBdfCBpcyBhIHBhcmFtZXRlciB2YWx1ZS4gVGhlIHNpemUgb2YgfGhlYXBQYXJhbXN8IGhhcyB0byBiZSBvbmUuCisgICAgQVNTRVJUX0VRKDF1LCBoZWFwUGFyYW1zLnNpemUoKSk7CisgICAgRVhQRUNUX1RSVUUoaGVhcFBhcmFtc1swXSk7CisgICAgRVhQRUNUX0VRKCpoZWFwUGFyYW1zWzBdLCBleHBlY3RlZCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiB2b2lkIEMyQ29tcEludGZUZXN0OjpxdWVyeVN1cHBvcnRlZFBhcmFtKCkgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxUPiBwYXJhbSA9IG1ha2VQYXJhbTxUPigpOworICAgIC8vIFRoZSBjdXJyZW50IHBhcmFtZXRlcidzIHZhbHVlIGlzIGFjcXVpcmVkIGJ5IGdldFZhbHVlKCksIHdoaWNoIHNob3VsZCBiZSBzdWNjZWVkZWQuCisgICAgZ2V0VmFsdWUocGFyYW0uZ2V0KCkpOworICAgIHF1ZXJ5UGFyYW1Bc0V4cGVjdGVkKCpwYXJhbSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiB2b2lkIEMyQ29tcEludGZUZXN0OjpxdWVyeVVuc3VwcG9ydGVkUGFyYW0oKSB7CisgICAgLy8gVE9ETyhoaXJvaCk6IERvbid0IGNyZWF0ZSBwYXJhbSBvbiBzdGFjayBhbmQgY2FsbCBxdWVyeU9uU3RhY2sgZm9yIGZsZXggcGFyYW1zLgorICAgIC8vIE5vdGUgdGhhdCBhbGwgdGhlIGN1cnJlbnQgc3VwcG9ydGVkIHBhcmFtZXRlcnMgYXJlIG5vbi1mbGV4IHBhcmFtcy4KKyAgICBUIHN0YWNrOworICAgIHN0ZDo6dW5pcXVlX3B0cjxUPiBwSGVhcCA9IG1ha2VQYXJhbTxUPigpOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gaGVhcFBhcmFtczsKKyAgICAvLyBJZiBhIGNvbXBvbmVudCBkb2Vzbid0IGhhdmUgdGhlIHBhcmFtZXRlciwgcXVlcnlPblN0YWNrKCkgYW5kIHF1ZXJ5T25IZWFwKCkKKyAgICAvLyBzaG91bGQgcmV0dXJuIEMyX0JBRF9JTkRFWC4KKyAgICBBU1NFUlRfRVEoQzJfQkFEX0lOREVYLCBxdWVyeU9uU3RhY2soJnN0YWNrKSk7CisgICAgRVhQRUNUX0ZBTFNFKHN0YWNrKTsKKyAgICBBU1NFUlRfRVEoQzJfQkFEX0lOREVYLCBxdWVyeU9uSGVhcCgqcEhlYXAsICZoZWFwUGFyYW1zKSk7CisgICAgRVhQRUNUX0VRKDB1LCBoZWFwUGFyYW1zLnNpemUoKSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorYzJfc3RhdHVzX3QgQzJDb21wSW50ZlRlc3Q6OmNvbmZpZygKKyAgICAgICAgVCAqY29uc3QgcCwgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+ICpjb25zdCBmYWlsdXJlcykgeworICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiBwYXJhbXN7cH07CisgICAgcmV0dXJuIG1JbnRmLT5jb25maWdfdmIocGFyYW1zLCBDMl9ET05UX0JMT0NLLCBmYWlsdXJlcyk7Cit9CisKKy8vIENyZWF0ZSBhIG5ldyBwYXJhbWV0ZXIgY29waWVkIGZyb20gfHB8LgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0ZDo6dW5pcXVlX3B0cjxUPiBtYWtlUGFyYW1Gcm9tKGNvbnN0IFQgJnApIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8VD4gcmV0UCA9IG1ha2VQYXJhbTxUPigpOworICAgIEVYUEVDVF9UUlVFKHJldFAtPnVwZGF0ZUZyb20ocCkpOworICAgIEVYUEVDVF9UUlVFKG1lbWNtcChyZXRQLmdldCgpLCAmcCwgc2l6ZW9mKFQpKSA9PSAwKTsKKyAgICByZXR1cm4gcmV0UDsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit2b2lkIEMyQ29tcEludGZUZXN0Ojpjb25maWdSZWFkT25seVBhcmFtKGNvbnN0IFQgJm5ld1BhcmFtKSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPFQ+IHAgPSBtYWtlUGFyYW1Gcm9tKG5ld1BhcmFtKTsKKworICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiBwYXJhbXN7cC5nZXQoKX07CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworCisgICAgLy8gY29uZmlnX3ZiIHNob3VsZCBiZSBmYWlsZWQgYmVjYXVzZSBhIHBhcmFtZXRlciBpcyByZWFkLW9ubHkuCisgICAgQVNTRVJUX0VRKEMyX0JBRF9WQUxVRSwgbUludGYtPmNvbmZpZ192YihwYXJhbXMsIEMyX0RPTlRfQkxPQ0ssICZmYWlsdXJlcykpOworICAgIEFTU0VSVF9FUSgxdSwgZmFpbHVyZXMuc2l6ZSgpKTsKKyAgICBFWFBFQ1RfRVEoQzJTZXR0aW5nUmVzdWx0OjpSRUFEX09OTFksIGZhaWx1cmVzWzBdLT5mYWlsdXJlKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit2b2lkIEMyQ29tcEludGZUZXN0Ojpjb25maWdXcml0YWJsZVBhcmFtVmFsaWRWYWx1ZShjb25zdCBUICZuZXdQYXJhbSwgYzJfc3RhdHVzX3QgKmNvbmZpZ1Jlc3VsdCkgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxUPiBwID0gbWFrZVBhcmFtRnJvbShuZXdQYXJhbSk7CisKKyAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gcGFyYW1ze3AuZ2V0KCl9OworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICAvLyBJbiBtb3N0IGNhc2VzLCBjb25maWdfdmIgcmV0dXJuIEMyX09LIGFuZCB0aGUgcGFyYW1ldGVyJ3MgdmFsdWUgc2hvdWxkIGJlIGNoYW5nZWQKKyAgICAvLyB0byB8bmV3UGFyYW18LCB3aGljaCBpcyBjb25maXJtZWQgaW4gYSBjYWxsZXIgb2YgY29uZmlnV3JpdGFibGVQYXJhbVZhbHVlVmFsdWUoKS4KKyAgICAvLyBIb3dldmVyLCB0aGlzIGNhbiByZXR1cm4gfn5+fiBhbmQgdGhlIHBhcmFtZXRlcidzIHZhbHVlcyBpcyBub3QgY2hhbmdlZCwKKyAgICAvLyBiZWNhdXNlIHRoZXJlIG1heSBiZSBkZXBlbmRlbnQgbGltaXRhdGlvbnMgYmV0d2VlbiBmaWVsZHMgb3IgYmV0d2VlbiBwYXJhbWV0ZXJzLgorICAgIC8vIFRPRE8oaGlyb2gpOiBJIGhhdmUgdG8gZmlsbCB0aGUgcmV0dXJuIHZhbHVlLiBDb21tZW50cyBpbiBDMkNvbXBvbmVudC5oIGRvZXNuJ3QgbWVudGlvbgorICAgIC8vIGFib3V0IHRoZSByZXR1cm4gdmFsdWUgd2hlbiBjb25mbGljdCBoYXBwZW5zLiBJIHNldCBDMl9CQURfVkFMVUUgdG8gaXQgdGVtcG9yYXJpbHkgbm93LgorICAgIGMyX3N0YXR1c190IHN0Q29uZmlnID0gbUludGYtPmNvbmZpZ192YihwYXJhbXMsIEMyX0RPTlRfQkxPQ0ssICZmYWlsdXJlcyk7CisgICAgaWYgKHN0Q29uZmlnID09IEMyX09LKSB7CisgICAgICAgIEVYUEVDVF9FUSgwdSwgZmFpbHVyZXMuc2l6ZSgpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBU1NFUlRfRVEoQzJfQkFEX1ZBTFVFLCBzdENvbmZpZyk7CisgICAgICAgIEVYUEVDVF9FUSgxdSwgZmFpbHVyZXMuc2l6ZSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyU2V0dGluZ1Jlc3VsdDo6Q09ORkxJQ1QsIGZhaWx1cmVzWzBdLT5mYWlsdXJlKTsKKyAgICB9CisgICAgKmNvbmZpZ1Jlc3VsdCA9IHN0Q29uZmlnOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3ZvaWQgQzJDb21wSW50ZlRlc3Q6OmNvbmZpZ1dyaXRhYmxlUGFyYW1JbnZhbGlkVmFsdWUoY29uc3QgVCAmbmV3UGFyYW0pIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8VD4gcCA9IG1ha2VQYXJhbUZyb20obmV3UGFyYW0pOworCisgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+IHBhcmFtc3twLmdldCgpfTsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgLy8gQWx0aG91Z2ggYSBwYXJhbWV0ZXIgaXMgd3JpdGFibGUsIGNvbmZpZ192YiBzaG91bGQgYmUgZmFpbGVkLAorICAgIC8vIGJlY2F1c2UgYSBuZXcgdmFsdWUgaXMgaW52YWxpZC4KKyAgICBBU1NFUlRfRVEoQzJfQkFEX1ZBTFVFLCBtSW50Zi0+Y29uZmlnX3ZiKHBhcmFtcywgQzJfRE9OVF9CTE9DSywgJmZhaWx1cmVzKSk7CisgICAgQVNTRVJUX0VRKDF1LCBmYWlsdXJlcy5zaXplKCkpOworICAgIEVYUEVDVF9FUShDMlNldHRpbmdSZXN1bHQ6OkJBRF9WQUxVRSwgZmFpbHVyZXNbMF0tPmZhaWx1cmUpOworfQorCisvLyBUaGVyZSBpcyBvbmx5IHVzZWQgZW51bSB0eXBlIGZvciB0aGUgZmllbGQgdHlwZSwgdGhhdCBpcyBDMkRvbWFpbktpbmQuCisvLyBJZiBhbm90aGVyIGZpZWxkIHR5cGUgaXMgYWRkZWQsIGl0IGlzIG5lY2Vzc2FyeSB0byBhZGQgZnVuY3Rpb24gZm9yIHRoYXQuCit0ZW1wbGF0ZSA8Pgordm9pZCBDMkNvbXBJbnRmVGVzdDo6Z2V0VGVzdFZhbHVlcygKKyAgICAgICAgY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyAmdmFsaWRWYWx1ZUluZm9zLAorICAgICAgICBzdGQ6OnZlY3RvcjxDMkRvbWFpbktpbmQ+ICpjb25zdCB2YWxpZFZhbHVlcywKKyAgICAgICAgc3RkOjp2ZWN0b3I8QzJEb21haW5LaW5kPiAqY29uc3QgaW52YWxpZFZhbHVlcykgeworICAgIFVOVVNFRCh2YWxpZFZhbHVlSW5mb3MpOworICAgIHZhbGlkVmFsdWVzLT5lbXBsYWNlX2JhY2soQzJEb21haW5WaWRlbyk7CisgICAgdmFsaWRWYWx1ZXMtPmVtcGxhY2VfYmFjayhDMkRvbWFpbkF1ZGlvKTsKKyAgICB2YWxpZFZhbHVlcy0+ZW1wbGFjZV9iYWNrKEMyRG9tYWluT3RoZXIpOworCisgICAgLy8gVGhlcmUgaXMgbm8gaW52YWxpZCB2YWx1ZS4KKyAgICBVTlVTRUQoaW52YWxpZFZhbHVlcyk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBURmllbGQ+Cit2b2lkIEMyQ29tcEludGZUZXN0OjpnZXRUZXN0VmFsdWVzKAorICAgICAgICBjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzICZ2YWxpZFZhbHVlSW5mb3MsCisgICAgICAgIHN0ZDo6dmVjdG9yPFRGaWVsZD4gKmNvbnN0IHZhbGlkVmFsdWVzLAorICAgICAgICBzdGQ6OnZlY3RvcjxURmllbGQ+ICpjb25zdCBpbnZhbGlkVmFsdWVzKSB7CisgICAgdXNpbmcgVFN0b3JhZ2UgPSB0eXBlbmFtZSBfYzJfcmVkdWNlX2VudW1fdG9fdW5kZXJseWluZ190eXBlPFRGaWVsZD46OnR5cGU7CisKKyAgICAvLyBUaGUgc3VwcG9ydGVkIHZhbHVlcyBhcmUgcmVwcmVzZW50ZWQgYnkgQzJWYWx1ZXMuIEMyVmFsdWU6OlByaW1pdGl2ZSBuZWVkcyB0bworICAgIC8vIGJlIHRyYW5zZm9ybWVkIHRvIGEgcHJpbWl0aXZlIHZhbHVlLiBUaGlzIGZ1bmN0aW9uIGlzIG9uZSB0byBkbyB0aGF0LgorICAgIGF1dG8gcHJpbTJWYWx1ZSA9IFtdKGNvbnN0IEMyVmFsdWU6OlByaW1pdGl2ZSAmcHJpbSkgLT4gVEZpZWxkIHsKKyAgICAgICAgcmV0dXJuIChURmllbGQpcHJpbS5yZWY8VFN0b3JhZ2U+KCk7CisgICAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPFRTdG9yYWdlLCBpbnQzMl90Pjo6dmFsdWUgfHwKKyAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmlzX3NhbWU8VFN0b3JhZ2UsIHVpbnQzMl90Pjo6dmFsdWUgfHwKKyAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmlzX3NhbWU8VFN0b3JhZ2UsIGludDY0X3Q+Ojp2YWx1ZSB8fAorICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6aXNfc2FtZTxUU3RvcmFnZSwgdWludDY0X3Q+Ojp2YWx1ZSB8fAorICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6aXNfc2FtZTxUU3RvcmFnZSwgZmxvYXQ+Ojp2YWx1ZSwgIkludmFsaWQgVEZpZWxkIHR5cGUuIik7CisgICAgfTsKKworICAgIC8vIFRoZSBzaXplIG9mIHZhbGlkVmFsdWVJbmZvcyBpcyBvbmUuCisgICAgY29uc3QgYXV0byAmYzJGU1YgPSB2YWxpZFZhbHVlSW5mb3M7CisKKyAgICBzd2l0Y2ggKGMyRlNWLnR5cGUpIHsKKyAgICBjYXNlIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OnR5cGVfdDo6RU1QVFk6IHsKKyAgICAgICAgaW52YWxpZFZhbHVlcy0+ZW1wbGFjZV9iYWNrKFRGaWVsZCgwKSk7CisgICAgICAgIC8vIFRPRE8oaGlyb2gpIDogU2hvdWxkIG90aGVyIGludmFsaWQgdmFsdWVzIGJlIHRlc3RlZD8KKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6dHlwZV90OjpSQU5HRTogeworICAgICAgICBjb25zdCBhdXRvICZyYW5nZSA9IGMyRlNWLnJhbmdlOworICAgICAgICBhdXRvIHJtaW4gPSBwcmltMlZhbHVlKHJhbmdlLm1pbik7CisgICAgICAgIGF1dG8gcm1heCA9IHByaW0yVmFsdWUocmFuZ2UubWF4KTsKKyAgICAgICAgYXV0byByc3RlcCA9IHByaW0yVmFsdWUocmFuZ2Uuc3RlcCk7CisKKyAgICAgICAgQVNTRVJUX0xFKHJtaW4sIHJtYXgpOworCisgICAgICAgIGlmIChyc3RlcCAhPSAwKSB7CisgICAgICAgICAgICAvLyBJbmNyZWFzZSBsaW5lYXIKKyAgICAgICAgICAgIGZvciAoYXV0byB2ID0gcm1pbjsgdiA8PSBybWF4OyB2ID0gVEZpZWxkKHYgKyByc3RlcCkpIHsKKyAgICAgICAgICAgICAgICB2YWxpZFZhbHVlcy0+ZW1wbGFjZV9iYWNrKHYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHJtaW4gPiBzdGQ6Om51bWVyaWNfbGltaXRzPFRGaWVsZD46Om1pbigpKSB7CisgICAgICAgICAgICAgICAgaW52YWxpZFZhbHVlcy0+ZW1wbGFjZV9iYWNrKFRGaWVsZChybWluIC0gMSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHJtYXggPCBzdGQ6Om51bWVyaWNfbGltaXRzPFRGaWVsZD46Om1heCgpKSB7CisgICAgICAgICAgICAgICAgaW52YWxpZFZhbHVlcy0+ZW1wbGFjZV9iYWNrKFRGaWVsZChybWF4ICsgMSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgaW50IE4gPSB2YWxpZFZhbHVlcy0+c2l6ZSgpOworICAgICAgICAgICAgaWYgKE4gPj0gMikgeworICAgICAgICAgICAgICAgIGlmIChzdGQ6OmlzX3NhbWU8VEZpZWxkLCBmbG9hdD46OnZhbHVlKSB7CisgICAgICAgICAgICAgICAgICAgIGludmFsaWRWYWx1ZXMtPmVtcGxhY2VfYmFjayhURmllbGQoKHZhbGlkVmFsdWVzLT5hdCgwKSArIHZhbGlkVmFsdWVzLT5hdCgxKSkgLyAyKSk7CisgICAgICAgICAgICAgICAgICAgIGludmFsaWRWYWx1ZXMtPmVtcGxhY2VfYmFjayhURmllbGQoKHZhbGlkVmFsdWVzLT5hdChOIC0gMikgKyB2YWxpZFZhbHVlcy0+YXQoTiAtIDEpKSAvIDIpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAocnN0ZXAgPiAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkVmFsdWVzLT5lbXBsYWNlX2JhY2soVEZpZWxkKHZhbGlkVmFsdWVzLT5hdCgwKSArIDEpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWRWYWx1ZXMtPmVtcGxhY2VfYmFjayhURmllbGQodmFsaWRWYWx1ZXMtPmF0KE4gLSAxKSAtIDEpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFRoZXJlIHNob3VsZCBiZSB0d28gY2FzZXMsIGV4Y2VwdCBsaW5lYXIgY2FzZS4KKyAgICAgICAgICAgIC8vIDEuIGludGVnZXIgZ2VvbWV0cmljIGNhc2UKKyAgICAgICAgICAgIC8vIDIuIGZsb2F0IGdlb21ldHJpYyBjYXNlCisKKyAgICAgICAgICAgIGF1dG8gbnVtID0gcHJpbTJWYWx1ZShyYW5nZS5udW0pOworICAgICAgICAgICAgYXV0byBkZW5vbSA9IHByaW0yVmFsdWUocmFuZ2UuZGVub20pOworCisgICAgICAgICAgICAvLyBJZiBib3RoIHJhbmdlLm51bSBhbmQgcmFuZ2UuZGVub20gYXJlIDEgYW5kIHN0ZXAgaXMgMCwgd2Ugc2hvdWxkIHVzZQorICAgICAgICAgICAgLy8gVkFMVUVTLCBzaG91bGRuJ3Qgd2U/CisgICAgICAgICAgICBBU1NFUlRfRkFMU0UobnVtID09IDEgJiYgZGVub20gPT0gMSk7CisKKyAgICAgICAgICAgIC8vIChudW0gLyBkZW5vbSkgaXMgbm90IGxlc3MgdGhhbiAxLgorICAgICAgICAgICAgQVNTRVJUX0ZBTFNFKGRlbm9tID09IDApOworICAgICAgICAgICAgQVNTRVJUX0xFKGRlbm9tLCBudW0pOworICAgICAgICAgICAgZm9yIChhdXRvIHYgPSBybWluOyB2IDw9IHJtYXg7IHYgPSBURmllbGQodiAqIG51bSAvIGRlbm9tKSkgeworICAgICAgICAgICAgICAgIHZhbGlkVmFsdWVzLT5lbXBsYWNlX2JhY2sodik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChybWluID4gc3RkOjpudW1lcmljX2xpbWl0czxURmllbGQ+OjptaW4oKSkgeworICAgICAgICAgICAgICAgIGludmFsaWRWYWx1ZXMtPmVtcGxhY2VfYmFjayhURmllbGQocm1pbiAtIDEpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChybWF4IDwgc3RkOjpudW1lcmljX2xpbWl0czxURmllbGQ+OjptYXgoKSkgeworICAgICAgICAgICAgICAgIGludmFsaWRWYWx1ZXMtPmVtcGxhY2VfYmFjayhURmllbGQocm1heCArIDEpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgaW50IE4gPSB2YWxpZFZhbHVlcy0+c2l6ZSgpOworICAgICAgICAgICAgaWYgKE4gPj0gMikgeworICAgICAgICAgICAgICAgIGlmIChzdGQ6OmlzX3NhbWU8VEZpZWxkLCBmbG9hdD46OnZhbHVlKSB7CisgICAgICAgICAgICAgICAgICAgIGludmFsaWRWYWx1ZXMtPmVtcGxhY2VfYmFjayhURmllbGQoKHZhbGlkVmFsdWVzLT5hdCgwKSArIHZhbGlkVmFsdWVzLT5hdCgxKSkgLyAyKSk7CisgICAgICAgICAgICAgICAgICAgIGludmFsaWRWYWx1ZXMtPmVtcGxhY2VfYmFjayhURmllbGQoKHZhbGlkVmFsdWVzLT5hdChOIC0gMikgKyB2YWxpZFZhbHVlcy0+YXQoTiAtIDEpKSAvIDIpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAodmFsaWRWYWx1ZXMtPmF0KDEpIC0gdmFsaWRWYWx1ZXMtPmF0KDApID4gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZFZhbHVlcy0+ZW1wbGFjZV9iYWNrKFRGaWVsZCh2YWxpZFZhbHVlcy0+YXQoMCkgKyAxKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHZhbGlkVmFsdWVzLT5hdChOIC0gMSkgLSB2YWxpZFZhbHVlcy0+YXQoTiAtIDIpID4gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZFZhbHVlcy0+ZW1wbGFjZV9iYWNrKFRGaWVsZCh2YWxpZFZhbHVlcy0+YXQoTiAtIDEpIC0gMSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OnR5cGVfdDo6VkFMVUVTOiB7CisgICAgICAgIGZvciAoY29uc3QgQzJWYWx1ZTo6UHJpbWl0aXZlICZwcmltIDogYzJGU1YudmFsdWVzKSB7CisgICAgICAgICAgICB2YWxpZFZhbHVlcy0+ZW1wbGFjZV9iYWNrKHByaW0yVmFsdWUocHJpbSkpOworICAgICAgICB9CisgICAgICAgIGF1dG8gbWludiA9ICpzdGQ6Om1pbl9lbGVtZW50KHZhbGlkVmFsdWVzLT5iZWdpbigpLCB2YWxpZFZhbHVlcy0+ZW5kKCkpOworICAgICAgICBhdXRvIG1heHYgPSAqc3RkOjptYXhfZWxlbWVudCh2YWxpZFZhbHVlcy0+YmVnaW4oKSwgdmFsaWRWYWx1ZXMtPmVuZCgpKTsKKyAgICAgICAgaWYgKG1pbnYgLSAxID4gc3RkOjpudW1lcmljX2xpbWl0czxURmllbGQ+OjptaW4oKSkgeworICAgICAgICAgICAgaW52YWxpZFZhbHVlcy0+ZW1wbGFjZV9iYWNrKFRGaWVsZChtaW52IC0gMSkpOworICAgICAgICB9CisgICAgICAgIGlmIChtYXh2ICsgMSA8IHN0ZDo6bnVtZXJpY19saW1pdHM8VEZpZWxkPjo6bWF4KCkpIHsKKyAgICAgICAgICAgIGludmFsaWRWYWx1ZXMtPmVtcGxhY2VfYmFjayhURmllbGQobWF4diArIDEpKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjp0eXBlX3Q6OkZMQUdTOiB7CisgICAgICAgIC8vIFRPRE8oaGlyb2gpIDogSW1wbGVtZW50IHRoZSBjYXNlIHRoYXQgcGFyYW0udHlwZSBpcyBGTEFHUy4KKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIH0KK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit2b2lkIEMyQ29tcEludGZUZXN0Ojp0ZXN0UmVhZE9ubHlQYXJhbShjb25zdCBUICZwcmVQYXJhbSwgY29uc3QgVCAmbmV3UGFyYW0pIHsKKyAgICBUUkFDRURfRkFJTFVSRShjb25maWdSZWFkT25seVBhcmFtKG5ld1BhcmFtKSk7CisgICAgLy8gUGFyYW1ldGVyIHZhbHVlIG11c3Qgbm90IGJlIGNoYW5nZWQKKyAgICBUUkFDRURfRkFJTFVSRShxdWVyeVBhcmFtQXNFeHBlY3RlZChwcmVQYXJhbSkpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVFBhcmFtLCB0eXBlbmFtZSBUUmVhbEZpZWxkLCB0eXBlbmFtZSBURmllbGQ+Cit2b2lkIEMyQ29tcEludGZUZXN0Ojp0ZXN0V3JpdGFibGVQYXJhbSgKKyAgICAgICAgVFBhcmFtICpjb25zdCBwYXJhbSwgVFJlYWxGaWVsZCAqY29uc3Qgd3JpdGFibGVGaWVsZCwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8VEZpZWxkPiAmdmFsaWRWYWx1ZXMsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPFRGaWVsZD4gJmludmFsaWRWYWx1ZXMpIHsKKyAgICBjMl9zdGF0dXNfdCBzdENvbmZpZzsKKworICAgIC8vIEdldCB0aGUgcGFyYW1ldGVyJ3MgdmFsdWUgaW4gdGhlIGJlZ2lubmluZyBpbiBvcmRlciB0byByZXNldCB0aGUgdmFsdWUgYXQgdGhlIGVuZC4KKyAgICBUUkFDRURfRkFJTFVSRShnZXRWYWx1ZShwYXJhbSkpOworICAgIHN0ZDo6dW5pcXVlX3B0cjxUUGFyYW0+IGRlZmF1bHRQYXJhbSA9IG1ha2VQYXJhbUZyb20oKnBhcmFtKTsKKworICAgIC8vIFRlc3QgdmFsaWQgdmFsdWVzCisgICAgZm9yIChjb25zdCBhdXRvICZ2YWwgOiB2YWxpZFZhbHVlcykgeworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8VFBhcmFtPiBwcmVQYXJhbSA9IG1ha2VQYXJhbUZyb20oKnBhcmFtKTsKKworICAgICAgICAvLyBQYXJhbSBpcyB0cnkgdG8gYmUgY2hhbmdlZAorICAgICAgICAqd3JpdGFibGVGaWVsZCA9IHZhbDsKKyAgICAgICAgVFJBQ0VEX0ZBSUxVUkUoY29uZmlnV3JpdGFibGVQYXJhbVZhbGlkVmFsdWUoKnBhcmFtLCAmc3RDb25maWcpKTsKKyAgICAgICAgaWYgKHN0Q29uZmlnID09IEMyX09LKSB7CisgICAgICAgICAgICBUUkFDRURfRkFJTFVSRShxdWVyeVBhcmFtQXNFeHBlY3RlZCgqcGFyYW0pKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFBhcmFtIGlzIHVuY2hhbmdlZCBiZWNhdXNlIGEgZmllbGQgdmFsdWUgY29uZmxpY3RzIHdpdGggb3RoZXIgZmllbGQgb3IgcGFyYW1ldGVyLgorICAgICAgICAgICAgVFJBQ0VEX0ZBSUxVUkUocXVlcnlQYXJhbUFzRXhwZWN0ZWQoKnByZVBhcmFtKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBTdG9yZSB0aGUgY3VycmVudCBwYXJhbWV0ZXIgaW4gb3JkZXIgdG8gdGVzdCB8cGFyYW18IGlzIHVuY2hhbmdlZAorICAgIC8vIGFmdGVyIHRyeWluZyB0byB3cml0ZSBhbiBpbnZhbGlkIHZhbHVlLgorICAgIHN0ZDo6dW5pcXVlX3B0cjxUUGFyYW0+IGxhc3RWYWxpZFBhcmFtID0gbWFrZVBhcmFtRnJvbSgqcGFyYW0pOworCisgICAgLy8gVGVzdCBpbnZhbGlkIHZhbHVlcworICAgIGZvciAoY29uc3QgYXV0byAmdmFsIDogaW52YWxpZFZhbHVlcykgeworICAgICAgICAvLyBQYXJhbSBpcyBjaGFuZ2VkCisgICAgICAgICp3cml0YWJsZUZpZWxkID0gdmFsOworICAgICAgICBUUkFDRURfRkFJTFVSRShjb25maWdXcml0YWJsZVBhcmFtSW52YWxpZFZhbHVlKCpwYXJhbSkpOworICAgICAgICBUUkFDRURfRkFJTFVSRShxdWVyeVBhcmFtQXNFeHBlY3RlZCgqbGFzdFZhbGlkUGFyYW0pKTsKKyAgICB9CisgICAgLy8gUmVzZXQgdGhlIHBhcmFtZXRlciBieSBjb25maWcoKS4KKyAgICBUUkFDRURfRkFJTFVSRShjb25maWdXcml0YWJsZVBhcmFtVmFsaWRWYWx1ZSgqZGVmYXVsdFBhcmFtLCAmc3RDb25maWcpKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHZvaWQgQzJDb21wSW50ZlRlc3Q6OnRlc3RVbnN1cHBvcnRlZFBhcmFtKCkgeworICAgIFRSQUNFRF9GQUlMVVJFKHF1ZXJ5VW5zdXBwb3J0ZWRQYXJhbTxUPigpKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHZvaWQgQzJDb21wSW50ZlRlc3Q6OnRlc3RTdXBwb3J0ZWRQYXJhbSgpIHsKKyAgICBUUkFDRURfRkFJTFVSRShxdWVyeVN1cHBvcnRlZFBhcmFtPFQ+KCkpOworfQorCitib29sIGlzU3VwcG9ydGVkUGFyYW0oCisgICAgICAgIGNvbnN0IEMyUGFyYW0gJnBhcmFtLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+PiAmc1BhcmFtcykgeworICAgIGZvciAoY29uc3QgYXV0byAmcGQgOiBzUGFyYW1zKSB7CisgICAgICAgIGlmIChwYXJhbS50eXBlKCkgPT0gcGQtPmluZGV4KCkudHlwZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgordm9pZCBDMkNvbXBJbnRmVGVzdDo6Y2hlY2tQYXJhbVBlcm1pc3Npb24oCisgICAgaW50ICpjb25zdCByZXN1bHQsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4gJnN1cHBvcnRlZFBhcmFtcykgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxUPiBwYXJhbSA9IG1ha2VQYXJhbTxUPigpOworCisgICAgaWYgKCFpc1N1cHBvcnRlZFBhcmFtKCpwYXJhbSwgc3VwcG9ydGVkUGFyYW1zKSkgeworICAgICAgICAvLyBJZiBhIHBhcmFtZXRlciBpc24ndCBzdXBwb3J0ZWQsIGl0IGp1c3QgZmluaXNoIGFmdGVyIGNhbGxpbmcgdGVzdFVuc3VwcG9ydGVkUGFyYW0oKS4KKyAgICAgICAgdGVzdFVuc3VwcG9ydGVkUGFyYW08VD4oKTsKKyAgICAgICAgKnJlc3VsdCA9IFBhcmFtUGVybWlzc2lvbjo6VU5TVVBQT1JURUQ7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB0ZXN0U3VwcG9ydGVkUGFyYW08VD4oKTsKKworICAgIFRSQUNFRF9GQUlMVVJFKGdldFZhbHVlKHBhcmFtLmdldCgpKSk7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgIC8vIENvbmZpZyBkb2VzIG5vdCBjaGFuZ2UgdGhlIHBhcmFtZXRlciwgYmVjYXVzZSBwYXJhbSBpcyB0aGUgcHJlc2VudCBwYXJhbS4KKyAgICAvLyBUaGlzIGNvbmZpZyBpcyBleGVjdXRlZCB0byBmaW5kIG91dCBpZiBhIHBhcmFtZXRlciBpcyByZWFkLW9ubHkgb3Igd3JpdGFibGUuCisgICAgYzJfc3RhdHVzX3Qgc3RTdGFjayA9IGNvbmZpZyhwYXJhbS5nZXQoKSwgJmZhaWx1cmVzKTsKKyAgICBpZiAoc3RTdGFjayA9PSBDMl9CQURfVkFMVUUpIHsKKyAgICAgICAgLy8gUmVhZC1vbmx5CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxUPiBuZXdQYXJhbSA9IG1ha2VQYXJhbTxUPigpOworICAgICAgICB0ZXN0UmVhZE9ubHlQYXJhbSgqcGFyYW0sICpuZXdQYXJhbSk7CisgICAgICAgICpyZXN1bHQgPSBQYXJhbVBlcm1pc3Npb246OlJFQURPTkxZOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFdyaXRhYmxlCisgICAgICAgIEVYUEVDVF9FUShzdFN0YWNrLCBDMl9PSyk7CisgICAgICAgICpyZXN1bHQgPSBQYXJhbVBlcm1pc3Npb246OldSSVRBQkxFOworICAgIH0KK30KKwordm9pZCBDMkNvbXBJbnRmVGVzdDo6b3V0cHV0UmVzdWx0cyhjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSkgeworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBwYXJhbXNbM107CisgICAgZm9yIChjb25zdCBhdXRvICZ0ZXN0SW5mbyA6IG1QYXJhbVJlc3VsdHMpIHsKKyAgICAgICAgaW50IHJlc3VsdCA9IHRlc3RJbmZvLnJlc3VsdDsKKyAgICAgICAgQVNTRVJUX1RSVUUoMCA8PSByZXN1bHQgJiYgcmVzdWx0IDw9IDIpOworICAgICAgICBwYXJhbXNbcmVzdWx0XS5lbXBsYWNlX2JhY2sodGVzdEluZm8ubmFtZSk7CisgICAgfQorICAgIGNvbnN0IGNoYXIgKnJlc3VsdFN0cmluZ1tdID0geyJXcml0YWJsZSIsICJSZWFkLU9ubHkiLCAiVW5zdXBwb3J0ZWQifTsKKyAgICBwcmludGYoIlxuLS0tLVRFU1QgUkVTVUxUUyAoJXMpLS0tLVxuXG4iLCBuYW1lLmNfc3RyKCkpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKSB7CisgICAgICAgIHByaW50ZigiWyAlcyBdXG4iLCByZXN1bHRTdHJpbmdbaV0pOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJnQgOiBwYXJhbXNbaV0pIHsKKyAgICAgICAgICAgIHByaW50ZigiJXNcbiIsIHQuY19zdHIoKSk7CisgICAgICAgIH0KKyAgICAgICAgcHJpbnRmKCJcbiIpOworICAgIH0KK30KKworI2RlZmluZSBURVNUX0dFTkVSQUxfV1JJVEFCTEVfRklFTEQoVFBhcmFtXywgZmllbGRfdHlwZV9uYW1lXywgZmllbGRfbmFtZV8pIFwKKyAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPFRQYXJhbV8+IHBhcmFtID0gbWFrZVBhcmFtPFRQYXJhbV8+KCk7ICAgICAgICAgIFwKKyAgICAgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5PiB2YWxpZFZhbHVlSW5mb3MgPSB7ICAgIFwKKyAgICAgICAgICAgIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeTo6Q3VycmVudCggICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgQzJQYXJhbUZpZWxkKHBhcmFtLmdldCgpLCAmZmllbGRfdHlwZV9uYW1lXzo6ZmllbGRfbmFtZV8pKSBcCisgICAgICAgIH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEFTU0VSVF9FUShDMl9PSywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBtSW50Zi0+cXVlcnlTdXBwb3J0ZWRWYWx1ZXNfdmIodmFsaWRWYWx1ZUluZm9zLCBDMl9ET05UX0JMT0NLKSk7ICAgICBcCisgICAgICAgIEFTU0VSVF9FUSgxdSwgdmFsaWRWYWx1ZUluZm9zLnNpemUoKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHN0ZDo6dmVjdG9yPGRlY2x0eXBlKHBhcmFtLT5maWVsZF9uYW1lXyk+IHZhbGlkVmFsdWVzOyAgICAgICAgICBcCisgICAgICAgIHN0ZDo6dmVjdG9yPGRlY2x0eXBlKHBhcmFtLT5maWVsZF9uYW1lXyk+IGludmFsaWRWYWx1ZXM7ICAgICAgICBcCisgICAgICAgIGdldFRlc3RWYWx1ZXModmFsaWRWYWx1ZUluZm9zWzBdLnZhbHVlcywgJnZhbGlkVmFsdWVzLCAmaW52YWxpZFZhbHVlcyk7ICAgXAorICAgICAgICB0ZXN0V3JpdGFibGVQYXJhbShwYXJhbS5nZXQoKSwgJnBhcmFtLT5maWVsZF9uYW1lXywgdmFsaWRWYWx1ZXMsXAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkVmFsdWVzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgVEVTVF9WU1NUUlVDVF9XUklUQUJMRV9GSUVMRChUUGFyYW1fLCBmaWVsZF90eXBlX25hbWVfKSAgICAgICAgIFwKKyAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgVEVTVF9HRU5FUkFMX1dSSVRBQkxFX0ZJRUxEKFRQYXJhbV8sIGZpZWxkX3R5cGVfbmFtZV8sIHdpZHRoKTsgIFwKKyAgICAgICAgVEVTVF9HRU5FUkFMX1dSSVRBQkxFX0ZJRUxEKFRQYXJhbV8sIGZpZWxkX3R5cGVfbmFtZV8sIGhlaWdodCk7IFwKKyAgICB9IHdoaWxlICgwKQorCisjZGVmaW5lIFRFU1RfVTMyX1dSSVRBQkxFX0ZJRUxEKFRQYXJhbV8sIGZpZWxkX3R5cGVfbmFtZV8pICAgICAgICAgICAgICBcCisgIFRFU1RfR0VORVJBTF9XUklUQUJMRV9GSUVMRChUUGFyYW1fLCBmaWVsZF90eXBlX25hbWVfLCB2YWx1ZSkKKworI2RlZmluZSBURVNUX0VOVU1fV1JJVEFCTEVfRklFTEQoVFBhcmFtXywgZmllbGRfdHlwZV9uYW1lXykgICAgICAgICAgICAgXAorICBURVNUX0dFTkVSQUxfV1JJVEFCTEVfRklFTEQoVFBhcmFtXywgZmllbGRfdHlwZV9uYW1lXywgdmFsdWUpCisKKy8vIFRPRE8oaGlyb2gpOiBTdXBwb3J0IHBhcmFtZXRlcnMgYmFzZWQgb24gY2hhcltdIGFuZCB1aW50MzJfdFtdLgorLy8jZGVmaW5lIFRFU1RfU1RSSU5HX1dSSVRBQkxFX0ZJRUxEKFRQYXJhbV8sIGZpZWxkX3R5cGVfbmFtZV8pCisvLyBURVNUX0dFTkVSQUxfV1JJVEFCTEVfRklFTEQoVFBhcmFtXywgZmllbGRfdHlwZV9uYW1lXywgbS52YWx1ZSkKKy8vI2RlZmluZSBURVNUX1UzMkFSUkFZX1dSSVRBQkxFX0ZJRUxEKFRwYXJhbV8sIGZpZWxkX3R5cGVfbmFtZV8pCisvLyBURVNUX0dFTkVSQUxfV1JJVEFCTEVfRklFTEQoVHBhcmFtXywgdWludDMyX3RbXSwgZmllbGRfdHlwZV9uYW1lXywgdmFsdWVzKQorCisjZGVmaW5lIEVBQ0hfVEVTVChUUGFyYW1fLCBmaWVsZF90eXBlX25hbWVfLCB0ZXN0X25hbWUpICAgICAgICAgICAgICAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBpbnQgcmVzdWx0ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB0aGlzLT5tQ3VycmVudFBhcmFtTmFtZSA9ICNUUGFyYW1fOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBjaGVja1BhcmFtUGVybWlzc2lvbjxUUGFyYW1fPigmcmVzdWx0LCBzdXBwb3J0ZWRQYXJhbXMpOyAgICAgICAgICBcCisgICAgICBpZiAocmVzdWx0ID09IFBhcmFtUGVybWlzc2lvbjo6V1JJVEFCTEUpIHsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgdGVzdF9uYW1lKFRQYXJhbV8sIGZpZWxkX3R5cGVfbmFtZV8pOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBtUGFyYW1SZXN1bHRzLmVtcGxhY2VfYmFjaygjVFBhcmFtXywgcmVzdWx0KTsgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCisjZGVmaW5lIEVBQ0hfVEVTVF9TRUxGKHR5cGVfLCB0ZXN0X25hbWUpIEVBQ0hfVEVTVCh0eXBlXywgdHlwZV8sIHRlc3RfbmFtZSkKKyNkZWZpbmUgRUFDSF9URVNUX0lOUFVUKHR5cGVfLCB0ZXN0X25hbWUpIEVBQ0hfVEVTVCh0eXBlXzo6aW5wdXQsIHR5cGVfLCB0ZXN0X25hbWUpCisjZGVmaW5lIEVBQ0hfVEVTVF9PVVRQVVQodHlwZV8sIHRlc3RfbmFtZSkgRUFDSF9URVNUKHR5cGVfOjpvdXRwdXQsIHR5cGVfLCB0ZXN0X25hbWUpCit2b2lkIEMyQ29tcEludGZUZXN0Ojp0ZXN0TWFpbihzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+IGludGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmY29tcG9uZW50TmFtZSkgeworICAgIHNldENvbXBvbmVudChpbnRmKTsKKworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4+IHN1cHBvcnRlZFBhcmFtczsKKyAgICBBU1NFUlRfRVEoQzJfT0ssIG1JbnRmLT5xdWVyeVN1cHBvcnRlZFBhcmFtc19uYigmc3VwcG9ydGVkUGFyYW1zKSk7CisKKyAgICBFQUNIX1RFU1RfU0VMRihDMkNvbXBvbmVudExhdGVuY3lJbmZvLCBURVNUX1UzMl9XUklUQUJMRV9GSUVMRCk7CisgICAgRUFDSF9URVNUX1NFTEYoQzJDb21wb25lbnRUZW1wb3JhbEluZm8sIFRFU1RfVTMyX1dSSVRBQkxFX0ZJRUxEKTsKKyAgICBFQUNIX1RFU1RfSU5QVVQoQzJQb3J0TGF0ZW5jeUluZm8sIFRFU1RfVTMyX1dSSVRBQkxFX0ZJRUxEKTsKKyAgICBFQUNIX1RFU1RfT1VUUFVUKEMyUG9ydExhdGVuY3lJbmZvLCBURVNUX1UzMl9XUklUQUJMRV9GSUVMRCk7CisgICAgRUFDSF9URVNUX0lOUFVUKEMyU3RyZWFtRm9ybWF0Q29uZmlnLCBURVNUX1UzMl9XUklUQUJMRV9GSUVMRCk7CisgICAgRUFDSF9URVNUX09VVFBVVChDMlN0cmVhbUZvcm1hdENvbmZpZywgVEVTVF9VMzJfV1JJVEFCTEVfRklFTEQpOworICAgIEVBQ0hfVEVTVF9JTlBVVChDMlBvcnRTdHJlYW1Db3VudENvbmZpZywgVEVTVF9VMzJfV1JJVEFCTEVfRklFTEQpOworICAgIEVBQ0hfVEVTVF9PVVRQVVQoQzJQb3J0U3RyZWFtQ291bnRDb25maWcsIFRFU1RfVTMyX1dSSVRBQkxFX0ZJRUxEKTsKKworICAgIEVBQ0hfVEVTVF9TRUxGKEMyQ29tcG9uZW50RG9tYWluSW5mbywgVEVTVF9FTlVNX1dSSVRBQkxFX0ZJRUxEKTsKKworICAgIC8vIFRPRE8oaGlyb2gpOiBTdXBwb3J0IHBhcmFtZXRlcnMgYmFzZWQgb24gdWludDMyX3RbXSBhbmQgY2hhcltdLgorICAgIC8vIEVBQ0hfVEVTVF9JTlBVVChDMlBvcnRNaW1lQ29uZmlnLCBURVNUX1NUUklOR19XUklUQUJMRV9GSUVMRCk7CisgICAgLy8gRUFDSF9URVNUX09VVFBVVChDMlBvcnRNaW1lQ29uZmlnLCBURVNUX1NUUklOR19XUklUQUJMRV9GSUVMRCk7CisgICAgLy8gRUFDSF9URVNUX0lOUFVUKEMyU3RyZWFtTWltZUNvbmZpZywgVEVTVF9TVFJJTkdfV1JJVEFCTEVfRklFTEQpOworICAgIC8vIEVBQ0hfVEVTVF9PVVRQVVQoQzJTdHJlYW1NaW1lQ29uZmlnLCBURVNUX1NUUklOR19XUklUQUJMRV9GSUVMRCk7CisKKyAgICAvLyBFQUNIX1RFU1RfU0VMRihDMlN1cHBvcnRlZFBhcmFtc0luZm8sIFRFU1RfVTMyQVJSQVlfV1JJVEFCTEVfRklFTEQpOworICAgIC8vIEVBQ0hfVEVTVF9TRUxGKEMyUmVxdWlyZWRQYXJhbXNJbmZvLCBURVNUX1UzMkFSUkFZX1dSSVRBQkxFX0ZJRUxEKTsKKyAgICAvLyBFQUNIX1RFU1RfU0VMRihDMlJlYWRPbmx5UGFyYW1zSW5mbywgVEVTVF9VMzJBUlJBWV9XUklUQUJMRV9GSUVMRCk7CisgICAgLy8gRUFDSF9URVNUX1NFTEYoQzJSZXF1ZXN0ZWRJbmZvc0luZm8sIFRFU1RfVTMyQVJSQVlfV1JJVEFCTEVfRklFTEQpOworCisgICAgRUFDSF9URVNUX0lOUFVUKEMyVmlkZW9TaXplU3RyZWFtSW5mbywgVEVTVF9WU1NUUlVDVF9XUklUQUJMRV9GSUVMRCk7CisgICAgRUFDSF9URVNUX09VVFBVVChDMlZpZGVvU2l6ZVN0cmVhbUluZm8sIFRFU1RfVlNTVFJVQ1RfV1JJVEFCTEVfRklFTEQpOworICAgIEVBQ0hfVEVTVF9JTlBVVChDMlZpZGVvU2l6ZVN0cmVhbVR1bmluZywgVEVTVF9WU1NUUlVDVF9XUklUQUJMRV9GSUVMRCk7CisgICAgRUFDSF9URVNUX09VVFBVVChDMlZpZGVvU2l6ZVN0cmVhbVR1bmluZywgVEVTVF9WU1NUUlVDVF9XUklUQUJMRV9GSUVMRCk7CisgICAgRUFDSF9URVNUX0lOUFVUKEMyTWF4VmlkZW9TaXplSGludFBvcnRTZXR0aW5nLCBURVNUX1ZTU1RSVUNUX1dSSVRBQkxFX0ZJRUxEKTsKKyAgICBFQUNIX1RFU1RfT1VUUFVUKEMyTWF4VmlkZW9TaXplSGludFBvcnRTZXR0aW5nLCBURVNUX1ZTU1RSVUNUX1dSSVRBQkxFX0ZJRUxEKTsKKworICAgIG91dHB1dFJlc3VsdHMoY29tcG9uZW50TmFtZSk7CisgICAgcmVzZXRSZXN1bHRzKCk7Cit9CisKK1RFU1RfRihDMkNvbXBJbnRmVGVzdCwgQzJWNEwyQ29kZWNJbnRmKSB7CisKKyAgICAvLyBSZWFkIGEgc2hhcmVkIG9iamVjdCBsaWJyYXJ5LgorICAgIHZvaWQqIGNvbXBMaWIgPSBkbG9wZW4oInN5c3RlbS9saWIvbGlidjRsMl9jb2RlYzIuc28iLCBSVExEX05PVyk7CisKKyAgICBpZiAoIWNvbXBMaWIpIHsKKyAgICAgICAgcHJpbnRmKCJDYW5ub3Qgb3BlbiBsaWJyYXJ5OiAlcy5cbiIsIGRsZXJyb3IoKSk7CisgICAgICAgIEZBSUwoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHR5cGVkZWYgQzJDb21wb25lbnRTdG9yZSogY3JlYXRlX3QoKTsKKyAgICBjcmVhdGVfdCogY3JlYXRlX3N0b3JlPSAoY3JlYXRlX3QqKSBkbHN5bShjb21wTGliLCAiY3JlYXRlX3N0b3JlIik7CisgICAgY29uc3QgY2hhciogZGxzeW1fZXJyb3IgPSBkbGVycm9yKCk7CisgICAgaWYgKGRsc3ltX2Vycm9yKSB7CisgICAgICAgIHByaW50ZigiQ2Fubm90IGxvYWQgc3ltYm9sIGNyZWF0ZTogJXMuXG4iLCBkbHN5bV9lcnJvcik7CisgICAgICAgIEZBSUwoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHR5cGVkZWYgdm9pZCBkZXN0cm95X3QoQzJDb21wb25lbnRTdG9yZSopOworICAgIGRlc3Ryb3lfdCogZGVzdHJveV9zdG9yZSA9IChkZXN0cm95X3QqKSBkbHN5bShjb21wTGliLCAiZGVzdHJveV9zdG9yZSIpOworICAgIGRsc3ltX2Vycm9yID0gZGxlcnJvcigpOworICAgIGlmIChkbHN5bV9lcnJvcikgeworICAgICAgICBwcmludGYoIkNhbm5vdCBsb2FkIHN5bWJvbCBkZXN0cm95OiAlcy5cbiIsIGRsc3ltX2Vycm9yKTsKKyAgICAgICAgRkFJTCgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50U3RvcmU+IGNvbXBvbmVudFN0b3JlKGNyZWF0ZV9zdG9yZSgpLCBkZXN0cm95X3N0b3JlKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+IGNvbXBvbmVudEludGY7CisgICAgY29tcG9uZW50U3RvcmUtPmNyZWF0ZUludGVyZmFjZSgidjRsMi5kZWNvZGVyIiwgJmNvbXBvbmVudEludGYpOworICAgIGF1dG8gY29tcG9uZW50TmFtZSA9ICJDMlY0TDJDb2RlYyI7CisgICAgdGVzdE1haW4oY29tcG9uZW50SW50ZiwgY29tcG9uZW50TmFtZSk7Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi90ZXN0cy9DMlBhcmFtX3Rlc3QuY3BwIGIvbWVkaWEvY29kZWMyL3Rlc3RzL0MyUGFyYW1fdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY0ZDRkMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi90ZXN0cy9DMlBhcmFtX3Rlc3QuY3BwCkBAIC0wLDAgKzEsMjUxNSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDMlBhcmFtX3Rlc3QiCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjZGVmaW5lIF9fQzJfR0VORVJBVEVfR0xPQkFMX1ZBUlNfXworI2luY2x1ZGUgPEMyUGFyYW1EZWYuaD4KKworI2luY2x1ZGUgPGxpc3Q+CisKK3ZvaWQgUHJpbnRUbyhjb25zdCBfQzJGaWVsZElkICZpZCwgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7CisgICAgKm9zIDw8ICJAIiA8PCBpZC5fbU9mZnNldCA8PCAiKyIgPDwgaWQuX21TaXplOworfQorCit2b2lkIFByaW50VG8oY29uc3QgQzJGaWVsZERlc2NyaXB0b3IgJmZkLCA6OnN0ZDo6b3N0cmVhbSAqb3MpIHsKKyAgICB1c2luZyBGRD1DMkZpZWxkRGVzY3JpcHRvcjsKKyAgICBzd2l0Y2ggKGZkLnR5cGUoKSkgeworICAgIGNhc2UgRkQ6OklOVDMyOiAqb3MgPDwgImkzMiI7IGJyZWFrOworICAgIGNhc2UgRkQ6OklOVDY0OiAqb3MgPDwgImk2NCI7IGJyZWFrOworICAgIGNhc2UgRkQ6OlVJTlQzMjogKm9zIDw8ICJ1MzIiOyBicmVhazsKKyAgICBjYXNlIEZEOjpVSU5UNjQ6ICpvcyA8PCAidTY0IjsgYnJlYWs7CisgICAgY2FzZSBGRDo6RkxPQVQ6ICpvcyA8PCAiZmxvYXQiOyBicmVhazsKKyAgICBjYXNlIEZEOjpTVFJJTkc6ICpvcyA8PCAiY2hhciI7IGJyZWFrOworICAgIGNhc2UgRkQ6OkJMT0I6ICpvcyA8PCAidTgiOyBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBpZiAoZmQudHlwZSgpICYgRkQ6OlNUUlVDVF9GTEFHKSB7CisgICAgICAgICAgICAqb3MgPDwgInN0cnVjdC0iIDw8IChmZC50eXBlKCkgJiB+RkQ6OlNUUlVDVF9GTEFHKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICpvcyA8PCAidHlwZS0iIDw8IGZkLnR5cGUoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAqb3MgPDwgIiAiIDw8IGZkLm5hbWUoKTsKKyAgICBpZiAoZmQuZXh0ZW50KCkgPiAxKSB7CisgICAgICAgICpvcyA8PCAiWyIgPDwgZmQuZXh0ZW50KCkgPDwgIl0iOworICAgIH0gZWxzZSBpZiAoZmQuZXh0ZW50KCkgPT0gMCkgeworICAgICAgICAqb3MgPDwgIltdIjsKKyAgICB9CisgICAgKm9zIDw8ICIgKCI7CisgICAgUHJpbnRUbyhmZC5fbUZpZWxkSWQsIG9zKTsKKyAgICAqb3MgPDwgIioiIDw8IGZkLmV4dGVudCgpIDw8ICIpIjsKK30KKworZW51bSBDMlBhcmFtSW5kZXhUeXBlIDogQzJQYXJhbTo6dHlwZV9pbmRleF90IHsKKyAgICBrUGFyYW1JbmRleE51bWJlciwKKyAgICBrUGFyYW1JbmRleE51bWJlcnMsCisgICAga1BhcmFtSW5kZXhOdW1iZXIyLAorICAgIGtQYXJhbUluZGV4VmVuZG9yU3RhcnQgPSBDMlBhcmFtOjpUWVBFX0lOREVYX1ZFTkRPUl9TVEFSVCwKKyAgICBrUGFyYW1JbmRleFZlbmRvck51bWJlcnMsCit9OworCit2b2lkIGZmZmYoaW50KCopKGludCkpIHt9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFNUUlVDVCBERUNMQVJBVElPTiBBTkQgREVTQ1JJUFRJT04gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKwordHlwZWRlZiBDMkZpZWxkRGVzY3JpcHRvciBGRDsKKworY2xhc3MgQzJQYXJhbVRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKK307CisKK2NsYXNzIEMyUGFyYW1UZXN0X1BhcmFtRmllbGRMaXN0CisgICAgICAgIDogcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTxzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4+IHsKK307CisKK2VudW0geworICAgIGtQYXJhbUluZGV4U2l6ZSwKKyAgICBrUGFyYW1JbmRleFRlc3RBLAorICAgIGtQYXJhbUluZGV4VGVzdEIsCisgICAga1BhcmFtSW5kZXhUZXN0RmxleFMzMiwKKyAgICBrUGFyYW1JbmRleFRlc3RGbGV4RW5kUzMyLAorICAgIGtQYXJhbUluZGV4VGVzdEZsZXhTNjQsCisgICAga1BhcmFtSW5kZXhUZXN0RmxleEVuZFM2NCwKKyAgICBrUGFyYW1JbmRleFRlc3RGbGV4U2l6ZSwKKyAgICBrUGFyYW1JbmRleFRlc3RGbGV4RW5kU2l6ZSwKK307CisKK3N0cnVjdCBDMlNpemVTdHJ1Y3QgeworICAgIGludDMyX3Qgd2lkdGg7CisgICAgaW50MzJfdCBoZWlnaHQ7CisgICAgZW51bSA6IHVpbnQzMl90IHsgQ09SRV9JTkRFWCA9IGtQYXJhbUluZGV4U2l6ZSB9OyAgICAgICAgICAgICAgICAgICAgICAgIC8vIDw9IG5lZWRlZCBmb3IgQzJGaWVsZERlc2NyaXB0b3IKKyAgICBjb25zdCBzdGF0aWMgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IF9GSUVMRF9MSVNUOworICAgIHN0YXRpYyBjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gRmllbGRMaXN0KCk7ICAvLyA8PSBuZWVkZWQgZm9yIEMyRmllbGREZXNjcmlwdG9yCisgICAgY29uc3Qgc3RhdGljIEZEOjp0eXBlX3QgVFlQRSA9IChGRDo6dHlwZV90KShDT1JFX0lOREVYIHwgRkQ6OlNUUlVDVF9GTEFHKTsKK307CisKK0RFRklORV9OT19OQU1FRF9WQUxVRVNfRk9SKEMyU2l6ZVN0cnVjdCkKKworLy8gVGVzdCAxLiBkZWZpbmUgYSBzdHJ1Y3R1cmUgd2l0aG91dCBhbnkgaGVscGVyIG1ldGhvZHMKKworYm9vbCBvcGVyYXRvcj09KGNvbnN0IEMyRmllbGREZXNjcmlwdG9yICZhLCBjb25zdCBDMkZpZWxkRGVzY3JpcHRvciAmYikgeworICAgIHJldHVybiBhLnR5cGUoKSA9PSBiLnR5cGUoKQorICAgICAgICAgICAgJiYgYS5leHRlbnQoKSA9PSBiLmV4dGVudCgpCisgICAgICAgICAgICAmJiBhLm5hbWUoKSA9PSBiLm5hbWUoKQorICAgICAgICAgICAgJiYgYS5fbUZpZWxkSWQgPT0gYi5fbUZpZWxkSWQ7Cit9CisKK3N0cnVjdCBDMlRlc3RTdHJ1Y3RfQSB7CisgICAgaW50MzJfdCBzaWduZWQzMjsKKyAgICBpbnQ2NF90IHNpZ25lZDY0WzJdOworICAgIHVpbnQzMl90IHVuc2lnbmVkMzJbMV07CisgICAgdWludDY0X3QgdW5zaWduZWQ2NDsKKyAgICBmbG9hdCBmcDMyOworICAgIEMyU2l6ZVN0cnVjdCBzelszXTsKKyAgICB1aW50OF90IGJsb2JbMTAwXTsKKyAgICBjaGFyIHN0cmluZ1sxMDBdOworICAgIGJvb2wgeWVzTm9bMTAwXTsKKworICAgIGNvbnN0IHN0YXRpYyBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gX0ZJRUxEX0xJU1Q7CisgICAgc3RhdGljIGNvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBGaWVsZExpc3QoKTsKKyAgICAvLyBlbnVtIDogdWludDMyX3QgeyBDT1JFX0lOREVYID0ga1BhcmFtSW5kZXhUZXN0IH07CisgICAgLy8gdHlwZWRlZiBDMlRlc3RTdHJ1Y3RfQSBfdHlwZTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK2NvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBDMlRlc3RTdHJ1Y3RfQTo6RmllbGRMaXN0KCkgeworICAgIHJldHVybiBfRklFTERfTElTVDsKK30KK2NvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBDMlRlc3RTdHJ1Y3RfQTo6X0ZJRUxEX0xJU1QgPQorICAgIHsgeyBGRDo6SU5UMzIsICAgIDEsICJzMzIiLCAgIDAsIDQgfSwKKyAgICAgIHsgRkQ6OklOVDY0LCAgICAyLCAiczY0IiwgICA0LCA4IH0sCisgICAgICB7IEZEOjpVSU5UMzIsICAgMSwgInUzMiIsICAyMCwgNCB9LAorICAgICAgeyBGRDo6VUlOVDY0LCAgIDEsICJ1NjQiLCAgMjQsIDggfSwKKyAgICAgIHsgRkQ6OkZMT0FULCAgICAxLCAiZnAiLCAgIDMyLCA0IH0sCisgICAgICB7IEMyU2l6ZVN0cnVjdDo6VFlQRSwgMywgInNpemUiLCAzNiwgOCB9LAorICAgICAgeyBGRDo6QkxPQiwgICAxMDAsICJibG9iIiwgNjAsIDEgfSwKKyAgICAgIHsgRkQ6OlNUUklORywgMTAwLCAic3RyIiwgMTYwLCAxIH0sCisgICAgICB7IEZEOjpCTE9CLCAgIDEwMCwgInktbiIsIDI2MCwgMSB9IH07CisKK1RFU1RfUChDMlBhcmFtVGVzdF9QYXJhbUZpZWxkTGlzdCwgVmVyaWZ5U3RydWN0KSB7CisgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IGZpZWxkcyA9IEdldFBhcmFtKCksIGV4cGVjdGVkID0gQzJUZXN0U3RydWN0X0E6Ol9GSUVMRF9MSVNUOworCisgICAgLy8gdmVyaWZ5IGZpcnN0IGZpZWxkIGRlc2NyaXB0b3IKKyAgICBFWFBFQ1RfRVEoRkQ6OklOVDMyLCBmaWVsZHNbMF0udHlwZSgpKTsKKyAgICBFWFBFQ1RfU1RSRVEoInMzMiIsIGZpZWxkc1swXS5uYW1lKCkuY19zdHIoKSk7CisgICAgRVhQRUNUX0VRKDF1LCBmaWVsZHNbMF0uZXh0ZW50KCkpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDAsIDQpLCBmaWVsZHNbMF0uX21GaWVsZElkKTsKKworICAgIEVYUEVDVF9FUShleHBlY3RlZFswXSwgZmllbGRzWzBdKTsKKyAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRbMV0sIGZpZWxkc1sxXSk7CisgICAgRVhQRUNUX0VRKGV4cGVjdGVkWzJdLCBmaWVsZHNbMl0pOworICAgIEVYUEVDVF9FUShleHBlY3RlZFszXSwgZmllbGRzWzNdKTsKKyAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRbNF0sIGZpZWxkc1s0XSk7CisgICAgRVhQRUNUX0VRKGV4cGVjdGVkWzVdLCBmaWVsZHNbNV0pOworICAgIEVYUEVDVF9FUShleHBlY3RlZFs2XSwgZmllbGRzWzZdKTsKKyAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRbN10sIGZpZWxkc1s3XSk7CisgICAgZm9yIChzaXplX3QgaSA9IDg7IGkgPCBmaWVsZHMuc2l6ZSgpICYmIGkgPCBleHBlY3RlZC5zaXplKCk7ICsraSkgeworICAgICAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRbaV0sIGZpZWxkc1tpXSk7CisgICAgfQorfQorCitJTlNUQU5USUFURV9URVNUX0NBU0VfUChJbml0aWFsaXplckxpc3QsIEMyUGFyYW1UZXN0X1BhcmFtRmllbGRMaXN0LCA6OnRlc3Rpbmc6OlZhbHVlcyhDMlRlc3RTdHJ1Y3RfQTo6X0ZJRUxEX0xJU1QpKTsKKworLy8gZGVmaW5lIGZpZWxkcyB1c2luZyBDMkZpZWxkRGVzY3JpcHRvciBwb2ludGVyIGNvbnN0cnVjdG9yCitjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gQzJUZXN0U3RydWN0X0FfRkRfUFRSX2ZpZWxkTGlzdCA9CisgICAgeyBDMkZpZWxkRGVzY3JpcHRvcigmKChDMlRlc3RTdHJ1Y3RfQSopKG51bGxwdHIpKS0+c2lnbmVkMzIsICAgInMzMiIpLAorICAgICAgQzJGaWVsZERlc2NyaXB0b3IoJigoQzJUZXN0U3RydWN0X0EqKShudWxscHRyKSktPnNpZ25lZDY0LCAgICJzNjQiKSwKKyAgICAgIEMyRmllbGREZXNjcmlwdG9yKCYoKEMyVGVzdFN0cnVjdF9BKikobnVsbHB0cikpLT51bnNpZ25lZDMyLCAidTMyIiksCisgICAgICBDMkZpZWxkRGVzY3JpcHRvcigmKChDMlRlc3RTdHJ1Y3RfQSopKG51bGxwdHIpKS0+dW5zaWduZWQ2NCwgInU2NCIpLAorICAgICAgQzJGaWVsZERlc2NyaXB0b3IoJigoQzJUZXN0U3RydWN0X0EqKShudWxscHRyKSktPmZwMzIsICAgICAgImZwIiksCisgICAgICBDMkZpZWxkRGVzY3JpcHRvcigmKChDMlRlc3RTdHJ1Y3RfQSopKG51bGxwdHIpKS0+c3osICAgICAgICJzaXplIiksCisgICAgICBDMkZpZWxkRGVzY3JpcHRvcigmKChDMlRlc3RTdHJ1Y3RfQSopKG51bGxwdHIpKS0+YmxvYiwgICAgICAgImJsb2IiKSwKKyAgICAgIEMyRmllbGREZXNjcmlwdG9yKCYoKEMyVGVzdFN0cnVjdF9BKikobnVsbHB0cikpLT5zdHJpbmcsICAgICAic3RyIiksCisgICAgLy8gIEMyRmllbGREZXNjcmlwdG9yKCYoKEMyVGVzdFN0cnVjdF9BKikobnVsbHB0cikpLT55ZXNObywgICAgICAieS1uIikKKyAgICB9OworCitJTlNUQU5USUFURV9URVNUX0NBU0VfUChQb2ludGVyQ29uc3RydWN0b3IsIEMyUGFyYW1UZXN0X1BhcmFtRmllbGRMaXN0LCA6OnRlc3Rpbmc6OlZhbHVlcyhDMlRlc3RTdHJ1Y3RfQV9GRF9QVFJfZmllbGRMaXN0KSk7CisKKy8vIGRlZmluZSBmaWVsZHMgdXNpbmcgQzJGaWVsZERlc2NyaXB0b3IgbWVtYmVyLXBvaW50ZXIgY29uc3RydWN0b3IKK2NvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBDMlRlc3RTdHJ1Y3RfQV9GRF9NRU1fUFRSX2ZpZWxkTGlzdCA9CisgICAgeyBDMkZpZWxkRGVzY3JpcHRvcigoQzJUZXN0U3RydWN0X0EqKTAsICZDMlRlc3RTdHJ1Y3RfQTo6c2lnbmVkMzIsICAgInMzMiIpLAorICAgICAgQzJGaWVsZERlc2NyaXB0b3IoKEMyVGVzdFN0cnVjdF9BKikwLCAmQzJUZXN0U3RydWN0X0E6OnNpZ25lZDY0LCAgICJzNjQiKSwKKyAgICAgIEMyRmllbGREZXNjcmlwdG9yKChDMlRlc3RTdHJ1Y3RfQSopMCwgJkMyVGVzdFN0cnVjdF9BOjp1bnNpZ25lZDMyLCAidTMyIiksCisgICAgICBDMkZpZWxkRGVzY3JpcHRvcigoQzJUZXN0U3RydWN0X0EqKTAsICZDMlRlc3RTdHJ1Y3RfQTo6dW5zaWduZWQ2NCwgInU2NCIpLAorICAgICAgQzJGaWVsZERlc2NyaXB0b3IoKEMyVGVzdFN0cnVjdF9BKikwLCAmQzJUZXN0U3RydWN0X0E6OmZwMzIsICAgICAgImZwIiksCisgICAgICBDMkZpZWxkRGVzY3JpcHRvcigoQzJUZXN0U3RydWN0X0EqKTAsICZDMlRlc3RTdHJ1Y3RfQTo6c3osICAgICAgICJzaXplIiksCisgICAgICBDMkZpZWxkRGVzY3JpcHRvcigoQzJUZXN0U3RydWN0X0EqKTAsICZDMlRlc3RTdHJ1Y3RfQTo6YmxvYiwgICAgICAgImJsb2IiKSwKKyAgICAgIEMyRmllbGREZXNjcmlwdG9yKChDMlRlc3RTdHJ1Y3RfQSopMCwgJkMyVGVzdFN0cnVjdF9BOjpzdHJpbmcsICAgICAic3RyIiksCisgICAgLy8gIEMyRmllbGREZXNjcmlwdG9yKChDMlRlc3RTdHJ1Y3RfQSopMCwgJkMyVGVzdFN0cnVjdF9BOjp5ZXNObywgICAgICAieS1uIikKKyAgICB9OworCitJTlNUQU5USUFURV9URVNUX0NBU0VfUChNZW1iZXJQb2ludGVyQ29uc3RydWN0b3IsIEMyUGFyYW1UZXN0X1BhcmFtRmllbGRMaXN0LCA6OnRlc3Rpbmc6OlZhbHVlcyhDMlRlc3RTdHJ1Y3RfQV9GRF9NRU1fUFRSX2ZpZWxkTGlzdCkpOworCisvLyBUZXN0IDIuIGRlZmluZSBhIHN0cnVjdHVyZSB3aXRoIHR3by1zdGVwIGhlbHBlciBtZXRob2RzCisKK3N0cnVjdCBDMlRlc3RBU3RydWN0IHsKKyAgICBpbnQzMl90IHNpZ25lZDMyOworICAgIGludDY0X3Qgc2lnbmVkNjRbMl07CisgICAgdWludDMyX3QgdW5zaWduZWQzMlsxXTsKKyAgICB1aW50NjRfdCB1bnNpZ25lZDY0OworICAgIGZsb2F0IGZwMzI7CisgICAgQzJTaXplU3RydWN0IHN6WzNdOworICAgIHVpbnQ4X3QgYmxvYlsxMDBdOworICAgIGNoYXIgc3RyaW5nWzEwMF07CisgICAgYm9vbCB5ZXNOb1sxMDBdOworCitwcml2YXRlOiAvLyB0ZXN0IGFjY2VzcyBsZXZlbAorICAgIERFRklORV9DMlNUUlVDVChUZXN0QSkKK30gQzJfUEFDSzsKKworREVTQ1JJQkVfQzJTVFJVQ1QoVGVzdEEsIHsKKyAgICBDMkZJRUxEKHNpZ25lZDMyLCAiczMyIikKKyAgICBDMkZJRUxEKHNpZ25lZDY0LCAiczY0IikKKyAgICBDMkZJRUxEKHVuc2lnbmVkMzIsICJ1MzIiKQorICAgIEMyRklFTEQodW5zaWduZWQ2NCwgInU2NCIpCisgICAgQzJGSUVMRChmcDMyLCAiZnAiKQorICAgIEMyRklFTEQoc3osICJzaXplIikKKyAgICBDMkZJRUxEKGJsb2IsICJibG9iIikKKyAgICBDMkZJRUxEKHN0cmluZywgInN0ciIpCisgICAgLy8gQzJGSUVMRCh5ZXNObywgInktbiIpCit9KSAvLyA7IG9wdGlvbmFsCisKK0lOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKERlc2NyaWJlU3RydWN0MlN0ZXAsIEMyUGFyYW1UZXN0X1BhcmFtRmllbGRMaXN0LCA6OnRlc3Rpbmc6OlZhbHVlcyhDMlRlc3RBU3RydWN0OjpGaWVsZExpc3QoKSkpOworCisvLyBUZXN0IDMuIGRlZmluZSBhIHN0cnVjdHVyZSB3aXRoIG9uZS1zdGVwIGhlbHBlciBtZXRob2QKKworc3RydWN0IEMyVGVzdEJTdHJ1Y3QgeworICAgIGludDMyX3Qgc2lnbmVkMzI7CisgICAgaW50NjRfdCBzaWduZWQ2NFsyXTsKKyAgICB1aW50MzJfdCB1bnNpZ25lZDMyWzFdOworICAgIHVpbnQ2NF90IHVuc2lnbmVkNjQ7CisgICAgZmxvYXQgZnAzMjsKKyAgICBDMlNpemVTdHJ1Y3Qgc3pbM107CisgICAgdWludDhfdCBibG9iWzEwMF07CisgICAgY2hhciBzdHJpbmdbMTAwXTsKKyAgICBib29sIHllc05vWzEwMF07CisKK3ByaXZhdGU6IC8vIHRlc3QgYWNjZXNzIGxldmVsCisgICAgREVGSU5FX0FORF9ERVNDUklCRV9DMlNUUlVDVChUZXN0QikKKworICAgIEMyRklFTEQoc2lnbmVkMzIsICJzMzIiKQorICAgIEMyRklFTEQoc2lnbmVkNjQsICJzNjQiKQorICAgIEMyRklFTEQodW5zaWduZWQzMiwgInUzMiIpCisgICAgQzJGSUVMRCh1bnNpZ25lZDY0LCAidTY0IikKKyAgICBDMkZJRUxEKGZwMzIsICJmcCIpCisgICAgQzJGSUVMRChzeiwgInNpemUiKQorICAgIEMyRklFTEQoYmxvYiwgImJsb2IiKQorICAgIEMyRklFTEQoc3RyaW5nLCAic3RyIikKKyAgICAvLyBDMkZJRUxEKHllc05vLCAieS1uIikKK307CisKK0lOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKERlc2NyaWJlU3RydWN0MVN0ZXAsIEMyUGFyYW1UZXN0X1BhcmFtRmllbGRMaXN0LCA6OnRlc3Rpbmc6OlZhbHVlcyhDMlRlc3RCU3RydWN0OjpGaWVsZExpc3QoKSkpOworCisvLyBUZXN0IDQuIGZsZXhpYmxlIG1lbWJlcnMKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2NsYXNzIEMyUGFyYW1UZXN0X0ZsZXhQYXJhbUZpZWxkTGlzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworcHJvdGVjdGVkOgorICAgIHVzaW5nIHR5cGVfdD1GRDo6dHlwZV90OworCisgICAgLy8gc3RhdGljIHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPj4KKyAgICBzdGF0aWMgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+PgorICAgICAgICAgICAgR2V0TGlzdHMoKTsKKworICAgIGNvbnN0ZXhwciBzdGF0aWMgdHlwZV90IEZsZXhUeXBlID0KKyAgICAgICAgICAgIHN0ZDo6aXNfc2FtZTxULCBpbnQzMl90Pjo6dmFsdWUgPyBGRDo6SU5UMzIgOgorICAgICAgICAgICAgc3RkOjppc19zYW1lPFQsIGludDY0X3Q+Ojp2YWx1ZSA/IEZEOjpJTlQ2NCA6CisgICAgICAgICAgICBzdGQ6OmlzX3NhbWU8VCwgdWludDMyX3Q+Ojp2YWx1ZSA/IEZEOjpVSU5UMzIgOgorICAgICAgICAgICAgc3RkOjppc19zYW1lPFQsIHVpbnQ2NF90Pjo6dmFsdWUgPyBGRDo6VUlOVDY0IDoKKyAgICAgICAgICAgIHN0ZDo6aXNfc2FtZTxULCBmbG9hdD46OnZhbHVlID8gRkQ6OkZMT0FUIDoKKyAgICAgICAgICAgIHN0ZDo6aXNfc2FtZTxULCB1aW50OF90Pjo6dmFsdWUgPyBGRDo6QkxPQiA6CisgICAgICAgICAgICBzdGQ6OmlzX3NhbWU8VCwgY2hhcj46OnZhbHVlID8gRkQ6OlNUUklORyA6CisgICAgICAgICAgICBzdGQ6OmlzX3NhbWU8VCwgQzJTaXplU3RydWN0Pjo6dmFsdWUgPyBDMlNpemVTdHJ1Y3Q6OlRZUEUgOiAodHlwZV90KTA7CisgICAgY29uc3RleHByIHN0YXRpYyBzaXplX3QgRkxFWF9TSVpFID0gc2l6ZW9mKFQpOworfTsKKwordHlwZWRlZiA6OnRlc3Rpbmc6OlR5cGVzPGludDMyX3QsIGludDY0X3QsIEMyU2l6ZVN0cnVjdD4gRmxleFR5cGVzOworVFlQRURfVEVTVF9DQVNFKEMyUGFyYW1UZXN0X0ZsZXhQYXJhbUZpZWxkTGlzdCwgRmxleFR5cGVzKTsKKworVFlQRURfVEVTVChDMlBhcmFtVGVzdF9GbGV4UGFyYW1GaWVsZExpc3QsIFZlcmlmeVN0cnVjdCkgeworICAgIGZvciAoYXV0byBhIDogdGhpcy0+R2V0TGlzdHMoKSkgeworICAgICAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gZmllbGRzID0gYTsKKyAgICAgICAgaWYgKGZpZWxkcy5zaXplKCkgPiAxKSB7CisgICAgICAgICAgICBFWFBFQ1RfRVEoMnUsIGZpZWxkcy5zaXplKCkpOworICAgICAgICAgICAgRVhQRUNUX0VRKEMyRmllbGREZXNjcmlwdG9yKEZEOjpJTlQzMiwgMSwgInMzMiIsIDAsIDQpLCBmaWVsZHNbMF0pOworICAgICAgICAgICAgRVhQRUNUX0VRKEMyRmllbGREZXNjcmlwdG9yKHRoaXMtPkZsZXhUeXBlLCAwLCAiZmxleCIsIDQsIHRoaXMtPkZMRVhfU0laRSksCisgICAgICAgICAgICAgICAgICAgICAgZmllbGRzWzFdKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEVYUEVDVF9FUSgxdSwgZmllbGRzLnNpemUoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRVEoQzJGaWVsZERlc2NyaXB0b3IodGhpcy0+RmxleFR5cGUsIDAsICJmbGV4IiwgMCwgdGhpcy0+RkxFWF9TSVpFKSwKKyAgICAgICAgICAgICAgICAgICAgICBmaWVsZHNbMF0pOworICAgICAgICB9CisgICAgfQorfQorCitzdHJ1Y3QgQzJUZXN0U3RydWN0X0ZsZXhTMzIgeworICAgIGludDMyX3QgbUZsZXhbXTsKKworICAgIGNvbnN0IHN0YXRpYyBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gX0ZJRUxEX0xJU1Q7CisgICAgc3RhdGljIGNvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBGaWVsZExpc3QoKTsKKyAgICAvLyBlbnVtIDogdWludDMyX3QgeyBDT1JFX0lOREVYID0ga1BhcmFtSW5kZXhUZXN0RmxleCwgRkxFWF9TSVpFID0gNCB9OworICAgIC8vIHR5cGVkZWYgQzJUZXN0U3RydWN0X0ZsZXhTMzIgX3R5cGU7CisgICAgLy8gdHlwZWRlZiBpbnQzMl90IEZsZXhUeXBlOworfTsKKworY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEMyVGVzdFN0cnVjdF9GbGV4UzMyOjpGaWVsZExpc3QoKSB7CisgICAgcmV0dXJuIF9GSUVMRF9MSVNUOworfQorY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEMyVGVzdFN0cnVjdF9GbGV4UzMyOjpfRklFTERfTElTVCA9IHsKKyAgICB7IEZEOjpJTlQzMiwgMCwgImZsZXgiLCAwLCA0IH0KK307CisKK3N0cnVjdCBDMlRlc3RTdHJ1Y3RfRmxleEVuZFMzMiB7CisgICAgaW50MzJfdCBzaWduZWQzMjsKKyAgICBpbnQzMl90IG1GbGV4W107CisKKyAgICBjb25zdCBzdGF0aWMgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IF9GSUVMRF9MSVNUOworICAgIHN0YXRpYyBjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gRmllbGRMaXN0KCk7CisgICAgLy8gZW51bSA6IHVpbnQzMl90IHsgQ09SRV9JTkRFWCA9IGtQYXJhbUluZGV4VGVzdEZsZXhFbmQsIEZMRVhfU0laRSA9IDQgfTsKKyAgICAvLyB0eXBlZGVmIEMyVGVzdFN0cnVjdF9GbGV4RW5kIF90eXBlOworICAgIC8vIHR5cGVkZWYgaW50MzJfdCBGbGV4VHlwZTsKK307CisKK2NvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBDMlRlc3RTdHJ1Y3RfRmxleEVuZFMzMjo6RmllbGRMaXN0KCkgeworICAgIHJldHVybiBfRklFTERfTElTVDsKK30KK2NvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBDMlRlc3RTdHJ1Y3RfRmxleEVuZFMzMjo6X0ZJRUxEX0xJU1QgPSB7CisgICAgeyBGRDo6SU5UMzIsIDEsICJzMzIiLCAwLCA0IH0sCisgICAgeyBGRDo6SU5UMzIsIDAsICJmbGV4IiwgNCwgNCB9LAorfTsKKworY29uc3Qgc3RhdGljIHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBDMlRlc3RTdHJ1Y3RfRmxleEVuZFMzMl9wdHJfZmllbGRMaXN0ID0geworICAgIEMyRmllbGREZXNjcmlwdG9yKCYoKEMyVGVzdFN0cnVjdF9GbGV4RW5kUzMyKikwKS0+c2lnbmVkMzIsICJzMzIiKSwKKyAgICBDMkZpZWxkRGVzY3JpcHRvcigmKChDMlRlc3RTdHJ1Y3RfRmxleEVuZFMzMiopMCktPm1GbGV4LCAiZmxleCIpLAorfTsKKworc3RydWN0IEMyVGVzdEZsZXhTMzJTdHJ1Y3QgeworICAgIGludDMyX3QgbUZsZXhTaWduZWQzMltdOworcHJpdmF0ZTogLy8gdGVzdCBhY2Nlc3MgbGV2ZWwKKyAgICBDMlRlc3RGbGV4UzMyU3RydWN0KCkge30KKworICAgIERFRklORV9BTkRfREVTQ1JJQkVfRkxFWF9DMlNUUlVDVChUZXN0RmxleFMzMiwgbUZsZXhTaWduZWQzMikKKyAgICBDMkZJRUxEKG1GbGV4U2lnbmVkMzIsICJmbGV4IikKK307CisKK3N0cnVjdCBDMlRlc3RGbGV4RW5kUzMyU3RydWN0IHsKKyAgICBpbnQzMl90IHNpZ25lZDMyOworICAgIGludDMyX3QgbUZsZXhTaWduZWQzMltdOworcHJpdmF0ZTogLy8gdGVzdCBhY2Nlc3MgbGV2ZWwKKyAgICBDMlRlc3RGbGV4RW5kUzMyU3RydWN0KCkge30KKworICAgIERFRklORV9GTEVYX0MyU1RSVUNUKFRlc3RGbGV4RW5kUzMyLCBtRmxleFNpZ25lZDMyKQorfSBDMl9QQUNLOworCitERVNDUklCRV9DMlNUUlVDVChUZXN0RmxleEVuZFMzMiwgeworICAgIEMyRklFTEQoc2lnbmVkMzIsICJzMzIiKQorICAgIEMyRklFTEQobUZsZXhTaWduZWQzMiwgImZsZXgiKQorfSkgLy8gOyBvcHRpb25hbAorCit0ZW1wbGF0ZTw+CitzdGQ6OnZlY3RvcjxzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4+CisvL3N0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPj4KK0MyUGFyYW1UZXN0X0ZsZXhQYXJhbUZpZWxkTGlzdDxpbnQzMl90Pjo6R2V0TGlzdHMoKSB7CisgICAgcmV0dXJuIHsKKyAgICAgICAgQzJUZXN0U3RydWN0X0ZsZXhTMzI6OkZpZWxkTGlzdCgpLAorICAgICAgICBDMlRlc3RTdHJ1Y3RfRmxleEVuZFMzMjo6RmllbGRMaXN0KCksCisgICAgICAgIEMyVGVzdFN0cnVjdF9GbGV4RW5kUzMyX3B0cl9maWVsZExpc3QsCisgICAgICAgIEMyVGVzdEZsZXhTMzJTdHJ1Y3Q6OkZpZWxkTGlzdCgpLAorICAgICAgICBDMlRlc3RGbGV4RW5kUzMyU3RydWN0OjpGaWVsZExpc3QoKSwKKyAgICB9OworfQorCitzdHJ1Y3QgQzJUZXN0U3RydWN0X0ZsZXhTNjQgeworICAgIGludDY0X3QgbUZsZXhTaWduZWQ2NFtdOworCisgICAgY29uc3Qgc3RhdGljIHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBfRklFTERfTElTVDsKKyAgICBzdGF0aWMgY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEZpZWxkTGlzdCgpOworICAgIC8vIGVudW0gOiB1aW50MzJfdCB7IENPUkVfSU5ERVggPSBrUGFyYW1JbmRleFRlc3RGbGV4UzY0LCBGTEVYX1NJWkUgPSA4IH07CisgICAgLy8gdHlwZWRlZiBDMlRlc3RTdHJ1Y3RfRmxleFM2NCBfdHlwZTsKKyAgICAvLyB0eXBlZGVmIGludDY0X3QgRmxleFR5cGU7Cit9OworCitjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gQzJUZXN0U3RydWN0X0ZsZXhTNjQ6OkZpZWxkTGlzdCgpIHsKKyAgICByZXR1cm4gX0ZJRUxEX0xJU1Q7Cit9Citjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gQzJUZXN0U3RydWN0X0ZsZXhTNjQ6Ol9GSUVMRF9MSVNUID0geworICAgIHsgRkQ6OklOVDY0LCAwLCAiZmxleCIsIDAsIDggfQorfTsKKworc3RydWN0IEMyVGVzdFN0cnVjdF9GbGV4RW5kUzY0IHsKKyAgICBpbnQzMl90IHNpZ25lZDMyOworICAgIGludDY0X3QgbVNpZ25lZDY0RmxleFtdOworCisgICAgY29uc3Qgc3RhdGljIHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBfRklFTERfTElTVDsKKyAgICBzdGF0aWMgY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEZpZWxkTGlzdCgpOworICAgIC8vIGVudW0gOiB1aW50MzJfdCB7IENPUkVfSU5ERVggPSBDMlRlc3RTdHJ1Y3RfRmxleEVuZFM2NCwgRkxFWF9TSVpFID0gOCB9OworICAgIC8vIHR5cGVkZWYgQzJUZXN0U3RydWN0X0ZsZXhFbmRTNjQgX3R5cGU7CisgICAgLy8gdHlwZWRlZiBpbnQ2NF90IEZsZXhUeXBlOworfTsKKworY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEMyVGVzdFN0cnVjdF9GbGV4RW5kUzY0OjpGaWVsZExpc3QoKSB7CisgICAgcmV0dXJuIF9GSUVMRF9MSVNUOworfQorY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEMyVGVzdFN0cnVjdF9GbGV4RW5kUzY0OjpfRklFTERfTElTVCA9IHsKKyAgICB7IEZEOjpJTlQzMiwgMSwgInMzMiIsIDAsIDQgfSwKKyAgICB7IEZEOjpJTlQ2NCwgMCwgImZsZXgiLCA0LCA4IH0sCit9OworCitzdHJ1Y3QgQzJUZXN0RmxleFM2NFN0cnVjdCB7CisgICAgaW50NjRfdCBtRmxleFNpZ25lZDY0W107CisgICAgQzJUZXN0RmxleFM2NFN0cnVjdCgpIHt9CisKKyAgICBERUZJTkVfQU5EX0RFU0NSSUJFX0ZMRVhfQzJTVFJVQ1QoVGVzdEZsZXhTNjQsIG1GbGV4U2lnbmVkNjQpCisgICAgQzJGSUVMRChtRmxleFNpZ25lZDY0LCAiZmxleCIpCit9OworCitzdHJ1Y3QgQzJUZXN0RmxleEVuZFM2NFN0cnVjdCB7CisgICAgaW50MzJfdCBzaWduZWQzMjsKKyAgICBpbnQ2NF90IG1GbGV4U2lnbmVkNjRbXTsKKyAgICBDMlRlc3RGbGV4RW5kUzY0U3RydWN0KCkge30KKworICAgIERFRklORV9GTEVYX0MyU1RSVUNUKFRlc3RGbGV4RW5kUzY0LCBtRmxleFNpZ25lZDY0KQorfSBDMl9QQUNLOworCitERVNDUklCRV9DMlNUUlVDVChUZXN0RmxleEVuZFM2NCwgeworICAgIEMyRklFTEQoc2lnbmVkMzIsICJzMzIiKQorICAgIEMyRklFTEQobUZsZXhTaWduZWQ2NCwgImZsZXgiKQorfSkgLy8gOyBvcHRpb25hbAorCit0ZW1wbGF0ZTw+CitzdGQ6OnZlY3RvcjxzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4+CisvL3N0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPj4KK0MyUGFyYW1UZXN0X0ZsZXhQYXJhbUZpZWxkTGlzdDxpbnQ2NF90Pjo6R2V0TGlzdHMoKSB7CisgICAgcmV0dXJuIHsKKyAgICAgICAgQzJUZXN0U3RydWN0X0ZsZXhTNjQ6OkZpZWxkTGlzdCgpLAorICAgICAgICBDMlRlc3RTdHJ1Y3RfRmxleEVuZFM2NDo6RmllbGRMaXN0KCksCisgICAgICAgIEMyVGVzdEZsZXhTNjRTdHJ1Y3Q6OkZpZWxkTGlzdCgpLAorICAgICAgICBDMlRlc3RGbGV4RW5kUzY0U3RydWN0OjpGaWVsZExpc3QoKSwKKyAgICB9OworfQorCitzdHJ1Y3QgQzJUZXN0U3RydWN0X0ZsZXhTaXplIHsKKyAgICBDMlNpemVTdHJ1Y3QgbUZsZXhTaXplW107CisKKyAgICBjb25zdCBzdGF0aWMgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IF9GSUVMRF9MSVNUOworICAgIHN0YXRpYyBjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gRmllbGRMaXN0KCk7CisgICAgLy8gZW51bSA6IHVpbnQzMl90IHsgQ09SRV9JTkRFWCA9IGtQYXJhbUluZGV4VGVzdEZsZXhTaXplLCBGTEVYX1NJWkUgPSA4IH07CisgICAgLy8gdHlwZWRlZiBDMlRlc3RTdHJ1Y3RfRmxleFNpemUgX3R5cGU7CisgICAgLy8gdHlwZWRlZiBDMlNpemVTdHJ1Y3QgRmxleFR5cGU7Cit9OworCitjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gQzJUZXN0U3RydWN0X0ZsZXhTaXplOjpGaWVsZExpc3QoKSB7CisgICAgcmV0dXJuIF9GSUVMRF9MSVNUOworfQorY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEMyVGVzdFN0cnVjdF9GbGV4U2l6ZTo6X0ZJRUxEX0xJU1QgPSB7CisgICAgeyBDMlNpemVTdHJ1Y3Q6OlRZUEUsIDAsICJmbGV4IiwgMCwgc2l6ZW9mKEMyU2l6ZVN0cnVjdCkgfQorfTsKKworc3RydWN0IEMyVGVzdFN0cnVjdF9GbGV4RW5kU2l6ZSB7CisgICAgaW50MzJfdCBzaWduZWQzMjsKKyAgICBDMlNpemVTdHJ1Y3QgbVNpemVGbGV4W107CisKKyAgICBjb25zdCBzdGF0aWMgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IF9GSUVMRF9MSVNUOworICAgIHN0YXRpYyBjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gRmllbGRMaXN0KCk7CisgICAgLy8gZW51bSA6IHVpbnQzMl90IHsgQ09SRV9JTkRFWCA9IEMyVGVzdFN0cnVjdF9GbGV4RW5kU2l6ZSwgRkxFWF9TSVpFID0gOCB9OworICAgIC8vIHR5cGVkZWYgQzJUZXN0U3RydWN0X0ZsZXhFbmRTaXplIF90eXBlOworICAgIC8vIHR5cGVkZWYgQzJTaXplU3RydWN0IEZsZXhUeXBlOworfTsKKworY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEMyVGVzdFN0cnVjdF9GbGV4RW5kU2l6ZTo6RmllbGRMaXN0KCkgeworICAgIHJldHVybiBfRklFTERfTElTVDsKK30KK2NvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBDMlRlc3RTdHJ1Y3RfRmxleEVuZFNpemU6Ol9GSUVMRF9MSVNUID0geworICAgIHsgRkQ6OklOVDMyLCAxLCAiczMyIiwgMCwgNCB9LAorICAgIHsgQzJTaXplU3RydWN0OjpUWVBFLCAwLCAiZmxleCIsIDQsIHNpemVvZihDMlNpemVTdHJ1Y3QpIH0sCit9OworCitzdHJ1Y3QgQzJUZXN0RmxleFNpemVTdHJ1Y3QgeworICAgIEMyU2l6ZVN0cnVjdCBtRmxleFNpemVbXTsKKyAgICBDMlRlc3RGbGV4U2l6ZVN0cnVjdCgpIHt9CisKKyAgICBERUZJTkVfQU5EX0RFU0NSSUJFX0ZMRVhfQzJTVFJVQ1QoVGVzdEZsZXhTaXplLCBtRmxleFNpemUpCisgICAgQzJGSUVMRChtRmxleFNpemUsICJmbGV4IikKK307CisKK3N0cnVjdCBDMlRlc3RGbGV4RW5kU2l6ZVN0cnVjdCB7CisgICAgaW50MzJfdCBzaWduZWQzMjsKKyAgICBDMlNpemVTdHJ1Y3QgbUZsZXhTaXplW107CisgICAgQzJUZXN0RmxleEVuZFNpemVTdHJ1Y3QoKSB7fQorCisgICAgREVGSU5FX0ZMRVhfQzJTVFJVQ1QoVGVzdEZsZXhFbmRTaXplLCBtRmxleFNpemUpCit9IEMyX1BBQ0s7CisKK0RFU0NSSUJFX0MyU1RSVUNUKFRlc3RGbGV4RW5kU2l6ZSwgeworICAgIEMyRklFTEQoc2lnbmVkMzIsICJzMzIiKQorICAgIEMyRklFTEQobUZsZXhTaXplLCAiZmxleCIpCit9KSAvLyA7IG9wdGlvbmFsCisKK3N0cnVjdCBDMlRlc3RCYXNlRmxleEVuZFNpemVTdHJ1Y3QgeworICAgIGludDMyX3Qgc2lnbmVkMzI7CisgICAgQzJTaXplU3RydWN0IG1GbGV4U2l6ZVtdOworICAgIEMyVGVzdEJhc2VGbGV4RW5kU2l6ZVN0cnVjdCgpIHt9CisKKyAgICBERUZJTkVfQkFTRV9GTEVYX0MyU1RSVUNUKFRlc3RCYXNlRmxleEVuZFNpemUsIG1GbGV4U2l6ZSkKK30gQzJfUEFDSzsKKworREVTQ1JJQkVfQzJTVFJVQ1QoVGVzdEJhc2VGbGV4RW5kU2l6ZSwgeworICAgIEMyRklFTEQoc2lnbmVkMzIsICJzMzIiKQorICAgIEMyRklFTEQobUZsZXhTaXplLCAiZmxleCIpCit9KSAvLyA7IG9wdGlvbmFsCisKK3N0cnVjdCBDMlRlc3RCYXNlRmxleEVuZFNpemUyU3RydWN0IHsKKyAgICBpbnQzMl90IHNpZ25lZDMyOworICAgIEMyU2l6ZVN0cnVjdCBtRmxleFNpemVbXTsKKyAgICBDMlRlc3RCYXNlRmxleEVuZFNpemUyU3RydWN0KCkge30KKworICAgIERFRklORV9BTkRfREVTQ1JJQkVfQkFTRV9GTEVYX0MyU1RSVUNUKFRlc3RCYXNlRmxleEVuZFNpemUyLCBtRmxleFNpemUpCisgICAgQzJGSUVMRChzaWduZWQzMiwgInMzMiIpCisgICAgQzJGSUVMRChtRmxleFNpemUsICJmbGV4IikKK307CisKK3RlbXBsYXRlPD4KK3N0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPj4KKy8vc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+PgorQzJQYXJhbVRlc3RfRmxleFBhcmFtRmllbGRMaXN0PEMyU2l6ZVN0cnVjdD46OkdldExpc3RzKCkgeworICAgIHJldHVybiB7CisgICAgICAgIEMyVGVzdFN0cnVjdF9GbGV4U2l6ZTo6RmllbGRMaXN0KCksCisgICAgICAgIEMyVGVzdFN0cnVjdF9GbGV4RW5kU2l6ZTo6RmllbGRMaXN0KCksCisgICAgICAgIEMyVGVzdEZsZXhTaXplU3RydWN0OjpGaWVsZExpc3QoKSwKKyAgICAgICAgQzJUZXN0RmxleEVuZFNpemVTdHJ1Y3Q6OkZpZWxkTGlzdCgpLAorICAgICAgICBDMlRlc3RCYXNlRmxleEVuZFNpemVTdHJ1Y3Q6OkZpZWxkTGlzdCgpLAorICAgICAgICBDMlRlc3RCYXNlRmxleEVuZFNpemUyU3RydWN0OjpGaWVsZExpc3QoKSwKKyAgICB9OworfQorCitURVNUX0YoQzJQYXJhbVRlc3QsIEZpZWxkSWQpIHsKKyAgICAvLyBwb2ludGVyIGNvbnN0cnVjdG9yCisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMCwgNCksIF9DMkZpZWxkSWQoJigoQzJUZXN0U3RydWN0X0EqKTApLT5zaWduZWQzMikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDQsIDgpLCBfQzJGaWVsZElkKCYoKEMyVGVzdFN0cnVjdF9BKikwKS0+c2lnbmVkNjQpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgyMCwgNCksIF9DMkZpZWxkSWQoJigoQzJUZXN0U3RydWN0X0EqKTApLT51bnNpZ25lZDMyKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMjQsIDgpLCBfQzJGaWVsZElkKCYoKEMyVGVzdFN0cnVjdF9BKikwKS0+dW5zaWduZWQ2NCkpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDMyLCA0KSwgX0MyRmllbGRJZCgmKChDMlRlc3RTdHJ1Y3RfQSopMCktPmZwMzIpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgzNiwgOCksIF9DMkZpZWxkSWQoJigoQzJUZXN0U3RydWN0X0EqKTApLT5zeikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDYwLCAxKSwgX0MyRmllbGRJZCgmKChDMlRlc3RTdHJ1Y3RfQSopMCktPmJsb2IpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgxNjAsIDEpLCBfQzJGaWVsZElkKCYoKEMyVGVzdFN0cnVjdF9BKikwKS0+c3RyaW5nKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMjYwLCAxKSwgX0MyRmllbGRJZCgmKChDMlRlc3RTdHJ1Y3RfQSopMCktPnllc05vKSk7CisKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgwLCA0KSwgX0MyRmllbGRJZCgmKChDMlRlc3RGbGV4RW5kU2l6ZVN0cnVjdCopMCktPnNpZ25lZDMyKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoNCwgOCksIF9DMkZpZWxkSWQoJigoQzJUZXN0RmxleEVuZFNpemVTdHJ1Y3QqKTApLT5tRmxleFNpemUpKTsKKworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDAsIDQpLCBfQzJGaWVsZElkKCYoKEMyVGVzdEJhc2VGbGV4RW5kU2l6ZVN0cnVjdCopMCktPnNpZ25lZDMyKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoNCwgOCksIF9DMkZpZWxkSWQoJigoQzJUZXN0QmFzZUZsZXhFbmRTaXplU3RydWN0KikwKS0+bUZsZXhTaXplKSk7CisKKyAgICAvLyBtZW1iZXIgcG9pbnRlciBjb25zdHJ1Y3RvcgorICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDAsIDQpLCBfQzJGaWVsZElkKChDMlRlc3RTdHJ1Y3RfQSopMCwgJkMyVGVzdFN0cnVjdF9BOjpzaWduZWQzMikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDQsIDgpLCBfQzJGaWVsZElkKChDMlRlc3RTdHJ1Y3RfQSopMCwgJkMyVGVzdFN0cnVjdF9BOjpzaWduZWQ2NCkpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDIwLCA0KSwgX0MyRmllbGRJZCgoQzJUZXN0U3RydWN0X0EqKTAsICZDMlRlc3RTdHJ1Y3RfQTo6dW5zaWduZWQzMikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDI0LCA4KSwgX0MyRmllbGRJZCgoQzJUZXN0U3RydWN0X0EqKTAsICZDMlRlc3RTdHJ1Y3RfQTo6dW5zaWduZWQ2NCkpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDMyLCA0KSwgX0MyRmllbGRJZCgoQzJUZXN0U3RydWN0X0EqKTAsICZDMlRlc3RTdHJ1Y3RfQTo6ZnAzMikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDM2LCA4KSwgX0MyRmllbGRJZCgoQzJUZXN0U3RydWN0X0EqKTAsICZDMlRlc3RTdHJ1Y3RfQTo6c3opKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCg2MCwgMSksIF9DMkZpZWxkSWQoKEMyVGVzdFN0cnVjdF9BKikwLCAmQzJUZXN0U3RydWN0X0E6OmJsb2IpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgxNjAsIDEpLCBfQzJGaWVsZElkKChDMlRlc3RTdHJ1Y3RfQSopMCwgJkMyVGVzdFN0cnVjdF9BOjpzdHJpbmcpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgyNjAsIDEpLCBfQzJGaWVsZElkKChDMlRlc3RTdHJ1Y3RfQSopMCwgJkMyVGVzdFN0cnVjdF9BOjp5ZXNObykpOworCisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMCwgNCksIF9DMkZpZWxkSWQoKEMyVGVzdEZsZXhFbmRTaXplU3RydWN0KikwLCAmQzJUZXN0RmxleEVuZFNpemVTdHJ1Y3Q6OnNpZ25lZDMyKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoNCwgOCksIF9DMkZpZWxkSWQoKEMyVGVzdEZsZXhFbmRTaXplU3RydWN0KikwLCAmQzJUZXN0RmxleEVuZFNpemVTdHJ1Y3Q6Om1GbGV4U2l6ZSkpOworCisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMCwgNCksIF9DMkZpZWxkSWQoKEMyVGVzdEJhc2VGbGV4RW5kU2l6ZVN0cnVjdCopMCwgJkMyVGVzdEJhc2VGbGV4RW5kU2l6ZVN0cnVjdDo6c2lnbmVkMzIpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCg0LCA4KSwgX0MyRmllbGRJZCgoQzJUZXN0QmFzZUZsZXhFbmRTaXplU3RydWN0KikwLCAmQzJUZXN0QmFzZUZsZXhFbmRTaXplU3RydWN0OjptRmxleFNpemUpKTsKKworICAgIC8vIG1lbWJlciBwb2ludGVyIHNhbnMgdHlwZSBwb2ludGVyCisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMCwgNCksIF9DMkZpZWxkSWQoJkMyVGVzdFN0cnVjdF9BOjpzaWduZWQzMikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDQsIDgpLCBfQzJGaWVsZElkKCZDMlRlc3RTdHJ1Y3RfQTo6c2lnbmVkNjQpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgyMCwgNCksIF9DMkZpZWxkSWQoJkMyVGVzdFN0cnVjdF9BOjp1bnNpZ25lZDMyKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMjQsIDgpLCBfQzJGaWVsZElkKCZDMlRlc3RTdHJ1Y3RfQTo6dW5zaWduZWQ2NCkpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDMyLCA0KSwgX0MyRmllbGRJZCgmQzJUZXN0U3RydWN0X0E6OmZwMzIpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgzNiwgOCksIF9DMkZpZWxkSWQoJkMyVGVzdFN0cnVjdF9BOjpzeikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDYwLCAxKSwgX0MyRmllbGRJZCgmQzJUZXN0U3RydWN0X0E6OmJsb2IpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgxNjAsIDEpLCBfQzJGaWVsZElkKCZDMlRlc3RTdHJ1Y3RfQTo6c3RyaW5nKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMjYwLCAxKSwgX0MyRmllbGRJZCgmQzJUZXN0U3RydWN0X0E6Onllc05vKSk7CisKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgwLCA0KSwgX0MyRmllbGRJZCgmQzJUZXN0RmxleEVuZFNpemVTdHJ1Y3Q6OnNpZ25lZDMyKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoNCwgOCksIF9DMkZpZWxkSWQoJkMyVGVzdEZsZXhFbmRTaXplU3RydWN0OjptRmxleFNpemUpKTsKKworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDAsIDQpLCBfQzJGaWVsZElkKCZDMlRlc3RCYXNlRmxleEVuZFNpemVTdHJ1Y3Q6OnNpZ25lZDMyKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoNCwgOCksIF9DMkZpZWxkSWQoJkMyVGVzdEJhc2VGbGV4RW5kU2l6ZVN0cnVjdDo6bUZsZXhTaXplKSk7CisKKyAgICB0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJJbmZvLCBDMlRlc3RBU3RydWN0PiBDMlRlc3RBSW5mbzsKKyAgICB0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJJbmZvLCBDMlRlc3RGbGV4RW5kU2l6ZVN0cnVjdD4gQzJUZXN0RmxleEVuZFNpemVJbmZvOworICAgIHR5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMkluZm8sIEMyVGVzdEJhc2VGbGV4RW5kU2l6ZVN0cnVjdCwga1BhcmFtSW5kZXhUZXN0RmxleEVuZFNpemU+IEMyVGVzdEZsZXhFbmRTaXplSW5mb0Zyb21CYXNlOworCisgICAgLy8gcG9pbnRlciBjb25zdHJ1Y3RvciBpbiBDMlBhcmFtCisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoOCwgNCksIF9DMkZpZWxkSWQoJigoQzJUZXN0QUluZm8qKTApLT5zaWduZWQzMikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDEyLCA4KSwgX0MyRmllbGRJZCgmKChDMlRlc3RBSW5mbyopMCktPnNpZ25lZDY0KSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMjgsIDQpLCBfQzJGaWVsZElkKCYoKEMyVGVzdEFJbmZvKikwKS0+dW5zaWduZWQzMikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDMyLCA4KSwgX0MyRmllbGRJZCgmKChDMlRlc3RBSW5mbyopMCktPnVuc2lnbmVkNjQpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCg0MCwgNCksIF9DMkZpZWxkSWQoJigoQzJUZXN0QUluZm8qKTApLT5mcDMyKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoNDQsIDgpLCBfQzJGaWVsZElkKCYoKEMyVGVzdEFJbmZvKikwKS0+c3opKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCg2OCwgMSksIF9DMkZpZWxkSWQoJigoQzJUZXN0QUluZm8qKTApLT5ibG9iKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMTY4LCAxKSwgX0MyRmllbGRJZCgmKChDMlRlc3RBSW5mbyopMCktPnN0cmluZykpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDI2OCwgMSksIF9DMkZpZWxkSWQoJigoQzJUZXN0QUluZm8qKTApLT55ZXNObykpOworCisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoOCwgNCksIF9DMkZpZWxkSWQoJigoQzJUZXN0RmxleEVuZFNpemVJbmZvKikwKS0+bS5zaWduZWQzMikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDEyLCA4KSwgX0MyRmllbGRJZCgmKChDMlRlc3RGbGV4RW5kU2l6ZUluZm8qKTApLT5tLm1GbGV4U2l6ZSkpOworCisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoOCwgNCksIF9DMkZpZWxkSWQoJigoQzJUZXN0RmxleEVuZFNpemVJbmZvRnJvbUJhc2UqKTApLT5tLnNpZ25lZDMyKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMTIsIDgpLCBfQzJGaWVsZElkKCYoKEMyVGVzdEZsZXhFbmRTaXplSW5mb0Zyb21CYXNlKikwKS0+bS5tRmxleFNpemUpKTsKKworICAgIC8vIG1lbWJlciBwb2ludGVyIGluIEMyUGFyYW0KKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCg4LCA0KSwgX0MyRmllbGRJZCgoQzJUZXN0QUluZm8qKTAsICZDMlRlc3RBSW5mbzo6c2lnbmVkMzIpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgxMiwgOCksIF9DMkZpZWxkSWQoKEMyVGVzdEFJbmZvKikwLCAmQzJUZXN0QUluZm86OnNpZ25lZDY0KSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMjgsIDQpLCBfQzJGaWVsZElkKChDMlRlc3RBSW5mbyopMCwgJkMyVGVzdEFJbmZvOjp1bnNpZ25lZDMyKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMzIsIDgpLCBfQzJGaWVsZElkKChDMlRlc3RBSW5mbyopMCwgJkMyVGVzdEFJbmZvOjp1bnNpZ25lZDY0KSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoNDAsIDQpLCBfQzJGaWVsZElkKChDMlRlc3RBSW5mbyopMCwgJkMyVGVzdEFJbmZvOjpmcDMyKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoNDQsIDgpLCBfQzJGaWVsZElkKChDMlRlc3RBSW5mbyopMCwgJkMyVGVzdEFJbmZvOjpzeikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDY4LCAxKSwgX0MyRmllbGRJZCgoQzJUZXN0QUluZm8qKTAsICZDMlRlc3RBSW5mbzo6YmxvYikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDE2OCwgMSksIF9DMkZpZWxkSWQoKEMyVGVzdEFJbmZvKikwLCAmQzJUZXN0QUluZm86OnN0cmluZykpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDI2OCwgMSksIF9DMkZpZWxkSWQoKEMyVGVzdEFJbmZvKikwLCAmQzJUZXN0QUluZm86Onllc05vKSk7CisKKyAgICAvLyBOT1RFOiBjYW5ub3QgdXNlIGEgbWVtYmVyIHBvaW50ZXIgZm9yIGZsZXggcGFyYW1zIGR1ZSB0byBpbnRyb2R1Y3Rpb24gb2YgJ20nCisgICAgLy8gRVhQRUNUX0VRKF9DMkZpZWxkSWQoOCwgNCksIF9DMkZpZWxkSWQoJkMyVGVzdEZsZXhFbmRTaXplSW5mbzo6bS5zaWduZWQzMikpOworICAgIC8vIEVYUEVDVF9FUShfQzJGaWVsZElkKDEyLCA4KSwgX0MyRmllbGRJZCgmQzJUZXN0RmxleEVuZFNpemVJbmZvOjptLm1GbGV4U2l6ZSkpOworCisgICAgLy8gRVhQRUNUX0VRKF9DMkZpZWxkSWQoOCwgNCksIF9DMkZpZWxkSWQoJkMyVGVzdEZsZXhFbmRTaXplSW5mb0Zyb21CYXNlOjptLnNpZ25lZDMyKSk7CisgICAgLy8gRVhQRUNUX0VRKF9DMkZpZWxkSWQoMTIsIDgpLCBfQzJGaWVsZElkKCZDMlRlc3RGbGV4RW5kU2l6ZUluZm9Gcm9tQmFzZTo6bS5tRmxleFNpemUpKTsKKworCit9CisKK3N0cnVjdCBTMzIgeworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIGNsYXNzIEI9dHlwZW5hbWUgc3RkOjpyZW1vdmVfZXh0ZW50PFQ+Ojp0eXBlPgorICAgIGlubGluZSBTMzIoY29uc3QgVCopIHsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghc3RkOjppc19hcnJheTxUPjo6dmFsdWUsICJzaG91bGQgbm90IGJlIGFuIGFycmF5Iik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPEIsIGludDMyX3Q+Ojp2YWx1ZSwgInNob3VsZCBiZSBpbnQzMl90Iik7CisgICAgfQorfTsKKworc3RydWN0IEZMWCB7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVSwgdHlwZW5hbWUgVCwgY2xhc3MgQj10eXBlbmFtZSBzdGQ6OnJlbW92ZV9leHRlbnQ8VD46OnR5cGU+CisgICAgaW5saW5lIEZMWChjb25zdCBUKiwgY29uc3QgVSopIHsKKyAgICAgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX2FycmF5PFQ+Ojp2YWx1ZSwgInNob3VsZCBiZSBhbiBhcnJheSIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6ZXh0ZW50PFQ+Ojp2YWx1ZSA9PSAwLCAic2hvdWxkIGJlIGFuIGFycmF5IG9mIDAgZXh0ZW50Iik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPEIsIFU+Ojp2YWx1ZSwgInNob3VsZCBiZSB0eXBlIFUiKTsKKyAgICB9Cit9OworCitzdHJ1Y3QgTVAgeworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFUsIHR5cGVuYW1lIFQsIHR5cGVuYW1lIEV4cGVjdGVkVSwgdHlwZW5hbWUgVW5leHBlY3RlZFU+CisgICAgaW5saW5lIE1QKFQgVTo6KiwgY29uc3QgRXhwZWN0ZWRVKiwgY29uc3QgVW5leHBlY3RlZFUqKSB7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIXN0ZDo6aXNfc2FtZTxVLCBVbmV4cGVjdGVkVT46OnZhbHVlLCAic2hvdWxkIG5vdCBiZSBtZW1iZXIgcG9pbnRlciBvZiB0aGUgYmFzZSB0eXBlIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPFUsIEV4cGVjdGVkVT46OnZhbHVlLCAic2hvdWxkIGJlIG1lbWJlciBwb2ludGVyIG9mIHRoZSBkZXJpdmVkIHR5cGUiKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBVLCB0eXBlbmFtZSBULCB0eXBlbmFtZSBCLCB0eXBlbmFtZSBEPgorICAgIGlubGluZSBNUChUIEQ6OiosIGNvbnN0IEQqKSB7IH0KK307CisKK3ZvaWQgY29tcGlsZWRTdGF0aWNfYXJyYXlUeXBlUHJvcGFnYXRpb25UZXN0KCkgeworICAgICh2b2lkKVMzMigmKChDMlRlc3RGbGV4RW5kUzMyU3RydWN0ICopMCktPnNpZ25lZDMyKTsKKyAgICAodm9pZClGTFgoJigoQzJUZXN0RmxleEVuZFMzMlN0cnVjdCAqKTApLT5tRmxleFNpZ25lZDMyLCAoaW50MzJfdCopMCk7CisgICAgKHZvaWQpRkxYKCYoKEMyVGVzdEZsZXhTMzJTdHJ1Y3QgKikwKS0+bUZsZXhTaWduZWQzMiwgKGludDMyX3QqKTApOworCisgICAgdHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMySW5mbywgQzJUZXN0QVN0cnVjdD4gQzJUZXN0QUluZm87CisKKyAgICAvLyBUUklDS1k6ICZkZXJpdmVkQ2xhc3M6OmJhc2VNZW1iZXIgaGFzIHR5cGUgb2YgYmFzZUNsYXNzOjoqCisgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8ZGVjbHR5cGUoJkMyVGVzdEFJbmZvOjpzaWduZWQzMiksIGludDMyX3QgQzJUZXN0QVN0cnVjdDo6Kj46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgImJhc2UgbWVtYmVyIHBvaW50ZXIgc2hvdWxkIGhhdmUgYmFzZSBjbGFzcyBpbiB0eXBlIik7CisKKyAgICAvLyB0aGVyZWZvcmUsIG1lbWJlciBwb2ludGVyIGV4cGFuZHMgdG8gYmFzZUNsYXNzOjoqIGluIHRlbXBsYXRlcworICAgICh2b2lkKU1QKCZDMlRlc3RBSW5mbzo6c2lnbmVkMzIsCisgICAgICAgICAgICAgKEMyVGVzdEFTdHJ1Y3QqKTAgLyogZXhwZWN0ZWQgKi8sIChDMlRlc3RBSW5mbyopMCAvKiB1bmV4cGVjdGVkICovKTsKKyAgICAvLyBidXQgY2FuIGJlIGNhc3QgdG8gZGVyaXZlZENsYXNzOjoqCisgICAgKHZvaWQpTVAoKGludDMyX3QgQzJUZXN0QUluZm86OiopJkMyVGVzdEFJbmZvOjpzaWduZWQzMiwKKyAgICAgICAgICAgICAoQzJUZXN0QUluZm8qKTAgLyogZXhwZWN0ZWQgKi8sIChDMlRlc3RBU3RydWN0KikwIC8qIHVuZXhwZWN0ZWQgKi8pOworCisgICAgLy8gVFJJQ0tZOiBiYXNlQ2xhc3M6OiogZG9lcyBub3QgYXV0b2NvbnZlcnQgdG8gZGVyaXZlZENsYXNzOjoqIGV2ZW4gaW4gdGVtcGxhdGVzCisgICAgLy8gKHZvaWQpTVAoJkMyVGVzdEFJbmZvOjpzaWduZWQzMiwgKEMyVGVzdEFJbmZvKikwKTsKK30KKworVEVTVF9GKEMyUGFyYW1UZXN0LCBNZW1iZXJQb2ludGVyQ2FzdCkgeworICAgIHR5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMkluZm8sIEMyVGVzdEFTdHJ1Y3Q+IEMyVGVzdEFJbmZvOworCisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMlRlc3RBSW5mbywgc2lnbmVkMzIpID09IDgsICJvZmZzZXQgc2hvdWxkIGJlIDgiKTsKKyAgICBjb25zdGV4cHIgaW50MzJfdCBDMlRlc3RBU3RydWN0OjoqIHMzMnB0ciA9ICZDMlRlc3RBSW5mbzo6c2lnbmVkMzI7CisgICAgY29uc3RleHByIGludDMyX3QgQzJUZXN0QUluZm86OiogczMycHRyX2Rlcml2ZWQgPSAoaW50MzJfdCBDMlRlc3RBU3RydWN0OjoqKSZDMlRlc3RBSW5mbzo6c2lnbmVkMzI7CisgICAgY29uc3RleHByIGludDMyX3QgQzJUZXN0QUluZm86OiogczMycHRyX2Nhc3QyZGVyaXZlZCA9IChpbnQzMl90IEMyVGVzdEFJbmZvOjoqKXMzMnB0cjsKKyAgICBDMlRlc3RBSW5mbyAqaW5mbyA9IChDMlRlc3RBSW5mbyAqKTI1NjsKKyAgICBDMlRlc3RBU3RydWN0ICpzdHJ1a3QgPSAoQzJUZXN0QVN0cnVjdCAqKWluZm87CisgICAgaW50MzJfdCAqaW5mb19zMzJfZGVyaXZlZCA9ICYoaW5mby0+KnMzMnB0cl9kZXJpdmVkKTsKKyAgICBpbnQzMl90ICppbmZvX3MzMl9jYXN0MmRlcml2ZWQgPSAmKGluZm8tPipzMzJwdHJfY2FzdDJkZXJpdmVkKTsKKyAgICBpbnQzMl90ICppbmZvX3MzMiA9ICYoaW5mby0+KnMzMnB0cik7CisgICAgaW50MzJfdCAqc3RydWt0X3MzMiA9ICYoc3RydWt0LT4qczMycHRyKTsKKworICAgIEVYUEVDVF9FUSgyNTZ1LCAodWludHB0cl90KWluZm8pOworICAgIEVYUEVDVF9FUSgyNjR1LCAodWludHB0cl90KXN0cnVrdCk7CisgICAgRVhQRUNUX0VRKDI2NHUsICh1aW50cHRyX3QpaW5mb19zMzJfZGVyaXZlZCk7CisgICAgRVhQRUNUX0VRKDI2NHUsICh1aW50cHRyX3QpaW5mb19zMzJfY2FzdDJkZXJpdmVkKTsKKyAgICBFWFBFQ1RfRVEoMjY0dSwgKHVpbnRwdHJfdClpbmZvX3MzMik7CisgICAgRVhQRUNUX0VRKDI2NHUsICh1aW50cHRyX3Qpc3RydWt0X3MzMik7CisKKyAgICB0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJJbmZvLCBDMlRlc3RGbGV4RW5kU2l6ZVN0cnVjdD4gQzJUZXN0RmxleEVuZFNpemVJbmZvOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJUZXN0RmxleEVuZFNpemVJbmZvLCBtLnNpZ25lZDMyKSA9PSA4LCAib2Zmc2V0IHNob3VsZCBiZSA4Iik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMlRlc3RGbGV4RW5kU2l6ZUluZm8sIG0ubUZsZXhTaXplKSA9PSAxMiwgIm9mZnNldCBzaG91bGQgYmUgMTIiKTsKKworICAgIHR5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMkluZm8sIEMyVGVzdEJhc2VGbGV4RW5kU2l6ZVN0cnVjdCwga1BhcmFtSW5kZXhUZXN0RmxleEVuZFNpemU+IEMyVGVzdEZsZXhFbmRTaXplSW5mb0Zyb21CYXNlOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJUZXN0RmxleEVuZFNpemVJbmZvRnJvbUJhc2UsIG0uc2lnbmVkMzIpID09IDgsICJvZmZzZXQgc2hvdWxkIGJlIDgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyVGVzdEZsZXhFbmRTaXplSW5mb0Zyb21CYXNlLCBtLm1GbGV4U2l6ZSkgPT0gMTIsICJvZmZzZXQgc2hvdWxkIGJlIDEyIik7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gUEFSQU0gVVNBR0UgVEVTVFMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCitzdHJ1Y3QgQzJOdW1iZXJTdHJ1Y3QgeworICAgIGludDMyX3QgbU51bWJlcjsKKyAgICBDMk51bWJlclN0cnVjdCgpIHt9CisgICAgQzJOdW1iZXJTdHJ1Y3QoaW50MzJfdCBfbnVtYmVyKSA6IG1OdW1iZXIoX251bWJlcikge30KKworICAgIERFRklORV9BTkRfREVTQ1JJQkVfQzJTVFJVQ1QoTnVtYmVyKQorICAgIEMyRklFTEQobU51bWJlciwgIm51bWJlciIpCit9OworCitzdHJ1Y3QgQzJOdW1iZXJCYXNlU3RydWN0IHsKKyAgICBpbnQzMl90IG1OdW1iZXI7CisgICAgQzJOdW1iZXJCYXNlU3RydWN0KCkge30KKyAgICBDMk51bWJlckJhc2VTdHJ1Y3QoaW50MzJfdCBfbnVtYmVyKSA6IG1OdW1iZXIoX251bWJlcikge30KKworICAgIERFRklORV9BTkRfREVTQ1JJQkVfQkFTRV9DMlNUUlVDVChOdW1iZXJCYXNlKQorICAgIEMyRklFTEQobU51bWJlciwgIm51bWJlciIpCit9OworCitzdHJ1Y3QgQzJOdW1iZXJzU3RydWN0IHsKKyAgICBpbnQzMl90IG1OdW1iZXJzW107CisgICAgQzJOdW1iZXJzU3RydWN0KCkge30KKworICAgIERFRklORV9BTkRfREVTQ1JJQkVfRkxFWF9DMlNUUlVDVChOdW1iZXJzLCBtTnVtYmVycykKKyAgICBDMkZJRUxEKG1OdW1iZXJzLCAibnVtYmVycyIpCit9Oworc3RhdGljX2Fzc2VydChzaXplb2YoQzJOdW1iZXJzU3RydWN0KSA9PSAwLCAiQzJOdW1iZXJzU3RydWN0IGhhcyBpbmNvcnJlY3Qgc2l6ZSIpOworCit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJJbmZvLCBDMk51bWJlclN0cnVjdD4gQzJOdW1iZXJJbmZvOworCit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJUdW5pbmcsIEMyTnVtYmVyU3RydWN0PiBDMk51bWJlclR1bmluZzsKK3R5cGVkZWYgICBDMlBvcnRQYXJhbTxDMlR1bmluZywgQzJOdW1iZXJTdHJ1Y3Q+IEMyTnVtYmVyUG9ydFR1bmluZzsKK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMlR1bmluZywgQzJOdW1iZXJTdHJ1Y3Q+IEMyTnVtYmVyU3RyZWFtVHVuaW5nOworCit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJUdW5pbmcsIEMyTnVtYmVyc1N0cnVjdD4gQzJOdW1iZXJzVHVuaW5nOwordHlwZWRlZiAgIEMyUG9ydFBhcmFtPEMyVHVuaW5nLCBDMk51bWJlcnNTdHJ1Y3Q+IEMyTnVtYmVyc1BvcnRUdW5pbmc7Cit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJUdW5pbmcsIEMyTnVtYmVyc1N0cnVjdD4gQzJOdW1iZXJzU3RyZWFtVHVuaW5nOworCisvLworI2lmIDAKKwordm9pZCB0ZXN0KCkgeworICAgIEMyTnVtYmVyU3RydWN0IHMoMTApOworICAgICh2b2lkKUMyTnVtYmVyU3RydWN0OjpGaWVsZExpc3QoKTsKK307CisKK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMlR1bmluZywgQzJJbnQ2NFZhbHVlLCBrUGFyYW1JbmRleE51bWJlckI+IEMyTnVtYmVyQ29uZmlnNDsKK3R5cGVkZWYgQzJQb3J0UGFyYW08QzJUdW5pbmcsIEMySW50MzJWYWx1ZSwga1BhcmFtSW5kZXhOdW1iZXI+IEMyTnVtYmVyQ29uZmlnMzsKK3R5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMlR1bmluZywgQzJTdHJpbmdWYWx1ZSwga1BhcmFtSW5kZXhOdW1iZXI+IEMyVmlkZW9OYW1lQ29uZmlnOworCit2b2lkIHRlc3QzKCkgeworICAgIEMyTnVtYmVyQ29uZmlnMyBzKDEwKTsKKyAgICBzLnZhbHVlID0gMTE7CisgICAgcyA9IDEyOworICAgICh2b2lkKUMyTnVtYmVyQ29uZmlnMzo6RmllbGRMaXN0KCk7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyVmlkZW9OYW1lQ29uZmlnPiBuID0gQzJWaWRlb05hbWVDb25maWc6OkFsbG9jU2hhcmVkKDI1KTsKKyAgICBzdHJjcHkobi0+bS52YWx1ZSwgImxham9zIik7CisgICAgQzJOdW1iZXJDb25maWc0IHQoZmFsc2UsIDAsIDExKTsKKyAgICB0LnZhbHVlID0gMTU7Cit9OworCitzdHJ1Y3QgQzJOdW1iZXJzU3RydWN0IHsKKyAgICBpbnQzMl90IG1OdW1iZXJzW107CisgICAgZW51bSB7IENPUkVfSU5ERVggPSBrUGFyYW1JbmRleE51bWJlciB9OworICAgIGNvbnN0IHN0YXRpYyBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gRmllbGRMaXN0KCk7CisgICAgc3RhdGljIGNvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBGaWVsZExpc3QoKTsKKyAgICBDMk51bWJlcnNTdHJ1Y3QoKSB7fQorCisgICAgRkxFWChDMk51bWJlcnNTdHJ1Y3QsIG1OdW1iZXJzKTsKK307CisKK3N0YXRpY19hc3NlcnQoc2l6ZW9mKEMyTnVtYmVyc1N0cnVjdCkgPT0gMCwgInllcyIpOworCisKK3R5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMkluZm8sIEMyTnVtYmVyc1N0cnVjdD4gQzJOdW1iZXJzSW5mbzsKKworY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEMyTnVtYmVyc1N0cnVjdDo6RmllbGRMaXN0KCkgeworICAgIHJldHVybiBfRklFTERfTElTVDsKK30KK2NvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBDMk51bWJlcnNTdHJ1Y3Q6Ol9GSUVMRF9MSVNUID0KKy8vICAgIHsgeyBGRDo6SU5UMzIsIDAsICJ3aWR0aHMiIH0gfTsKKyAgICB7IEMyRmllbGREZXNjcmlwdG9yKCYoKEMyTnVtYmVyc1N0cnVjdCopKG51bGxwdHIpKS0+bU51bWJlcnMsICJudW1iZXIiKSB9OworCit0eXBlZGVmIEMyUG9ydFBhcmFtPEMyVHVuaW5nLCBDMk51bWJlclN0cnVjdD4gQzJOdW1iZXJDb25maWc7CisKK3N0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBteUxpc3QgPSBDMk51bWJlckNvbmZpZzo6RmllbGRMaXN0KCk7CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbURlc2NyaXB0b3I+IF9fdGVzdF9kZXNjcmliZSh1aW50MzJfdCBwYXJhbVR5cGUpIHsKKyAgICAgICAgc3RkOjpsaXN0PEMyRmllbGREZXNjcmlwdG9yPiBmaWVsZHMgPSBkZXNjcmliZUMyUGFyYW1zPEMyTnVtYmVyQ29uZmlnPigpOworCisgICAgICAgIGF1dG8gd2lkdGhzID0gQzJOdW1iZXJzSW5mbzo6QWxsb2NTaGFyZWQoNSk7CisgICAgICAgIHdpZHRocy0+ZmxleENvdW50KCk7CisgICAgICAgIHdpZHRocy0+bS5tTnVtYmVyc1s0XSA9IDE7CisKKyAgICAgICAgdGVzdCgpOworICAgICAgICB0ZXN0MygpOworCisgICAgICAgIEMyTnVtYmVyQ29uZmlnIG91dHB1dFdpZHRoKGZhbHNlLCAxMjMpOworCisgICAgICAgIEMyUGFyYW06OkluZGV4IGluZGV4KHBhcmFtVHlwZSk7CisgICAgICAgIHN3aXRjaCAocGFyYW1UeXBlKSB7CisgICAgICAgIGNhc2UgQzJOdW1iZXJDb25maWc6OkNPUkVfSU5ERVg6CisgICAgICAgICAgICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPihuZXcgQzJQYXJhbURlc2NyaXB0b3J7CisgICAgICAgICAgICAgICAgdHJ1ZSAvKiBpc1JlcXVpcmVkICovLAorICAgICAgICAgICAgICAgICJudW1iZXIiLAorICAgICAgICAgICAgICAgIGluZGV4LAorICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmCisvLworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorYm9vbCBjYW5TZXRQb3J0KFQgJm8sIGJvb2wgb3V0cHV0KSB7IHJldHVybiBvLnNldFBvcnQob3V0cHV0KTsgfQorYm9vbCBjYW5TZXRQb3J0KC4uLikgeyByZXR1cm4gZmFsc2U7IH0KKwordGVtcGxhdGU8dHlwZW5hbWUgUywgdHlwZW5hbWU9ZGVjbHR5cGUoKChTKikwKS0+c2V0UG9ydCh0cnVlKSk+CitzdGF0aWMgc3RkOjp0cnVlX3R5cGUgX2NhbkNhbGxTZXRQb3J0KGludCk7Cit0ZW1wbGF0ZTx0eXBlbmFtZT4KK3N0YXRpYyBzdGQ6OmZhbHNlX3R5cGUgX2NhbkNhbGxTZXRQb3J0KC4uLik7CisjZGVmaW5lIGNhbkNhbGxTZXRQb3J0KHgpIGRlY2x0eXBlKF9jYW5DYWxsU2V0UG9ydDxzdGQ6OnJlbW92ZV9yZWZlcmVuY2U8ZGVjbHR5cGUoeCk+Ojp0eXBlPigwKSk6OnZhbHVlCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBTVEFUSUMgVEVTVFMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKK3N0YXRpY19hc3NlcnQoX0MyQ29tcGFyYWJsZTxpbnQ+Ojp2YWx1ZSwgImludCBpcyBub3QgY29tcGFyYWJsZSIpOworc3RhdGljX2Fzc2VydCghX0MyQ29tcGFyYWJsZTx2b2lkPjo6dmFsdWUsICJ2b2lkIGlzIGNvbXBhcmFibGUiKTsKKworc3RydWN0IEMyX0hJREUgX3Rlc3QwIHsKKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgX3Rlc3QwJik7CisgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IF90ZXN0MCYpOworfTsKK3N0cnVjdCBDMl9ISURFIF90ZXN0MSB7CisgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IF90ZXN0MSYpOworfTsKK3N0cnVjdCBDMl9ISURFIF90ZXN0MiB7CisgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IF90ZXN0MiYpOworfTsKK3N0YXRpY19hc3NlcnQoX0MyQ29tcGFyYWJsZTxfdGVzdDA+Ojp2YWx1ZSwgImNsYXNzIHdpdGggPT0gYW5kICE9IGlzIG5vdCBjb21wYXJhYmxlIik7CitzdGF0aWNfYXNzZXJ0KF9DMkNvbXBhcmFibGU8X3Rlc3QxPjo6dmFsdWUsICJjbGFzcyB3aXRoID09IGlzIG5vdCBjb21wYXJhYmxlIik7CitzdGF0aWNfYXNzZXJ0KF9DMkNvbXBhcmFibGU8X3Rlc3QyPjo6dmFsdWUsICJjbGFzcyB3aXRoICE9IGlzIG5vdCBjb21wYXJhYmxlIik7CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBDMlBBUkFNIFRFU1RTID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCitzdHJ1Y3QgX0MyUGFyYW1JbnNwZWN0b3IgeworICAgIHN0YXRpYyB2b2lkIFN0YXRpY1Rlc3QoKTsKKyAgICBzdGF0aWMgdm9pZCBTdGF0aWNGcm9tQmFzZVRlc3QoKTsKKyAgICBzdGF0aWMgdm9pZCBTdGF0aWNGbGV4VGVzdCgpOworICAgIHN0YXRpYyB2b2lkIFN0YXRpY0ZsZXhGcm9tQmFzZVRlc3QoKTsKK307CisKKy8vIFRFU1RfRihfQzJQYXJhbUluc3BlY3RvciwgU3RhdGljVGVzdCkgewordm9pZCBfQzJQYXJhbUluc3BlY3Rvcjo6U3RhdGljVGVzdCgpIHsKKyAgICB0eXBlZGVmIEMyUGFyYW06OkluZGV4IEk7CisKKyAgICAvLyBDMk51bWJlclN0cnVjdDogQ09SRV9JTkRFWCA9IGtJbmRleCAgICAgICAgICAgICAgICAgICAgICAgICAgKGFyZ3MpCisgICAgc3RhdGljX2Fzc2VydChDMk51bWJlclN0cnVjdDo6Q09SRV9JTkRFWCA9PSBrUGFyYW1JbmRleE51bWJlciwgImJhZCBpbmRleCIpOworICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKEMyTnVtYmVyU3RydWN0KSA9PSA0LCAiYmFkIHNpemUiKTsKKworICAgIC8vIEMyTnVtYmVyVHVuaW5nOiAgICAgICAgICAgICBrSW5kZXggfCB0dW4gfCBnbG9iYWwgICAgICAgICAgIChhcmdzKQorICAgIHN0YXRpY19hc3NlcnQoQzJOdW1iZXJUdW5pbmc6OkNPUkVfSU5ERVggPT0ga1BhcmFtSW5kZXhOdW1iZXIsICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTnVtYmVyVHVuaW5nOjpQQVJBTV9UWVBFID09IChrUGFyYW1JbmRleE51bWJlciB8IEk6OktJTkRfVFVOSU5HIHwgSTo6RElSX0dMT0JBTCksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihDMk51bWJlclR1bmluZykgPT0gMTIsICJiYWQgc2l6ZSIpOworCisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk51bWJlclR1bmluZywgX21TaXplKSA9PSAwLCAiYmFkIHNpemUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTnVtYmVyVHVuaW5nLCBfbUluZGV4KSA9PSA0LCAiYmFkIG9mZnNldCIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJOdW1iZXJUdW5pbmcsIG1OdW1iZXIpID09IDgsICJiYWQgb2Zmc2V0Iik7CisKKyAgICAvLyBDMk51bWJlclBvcnRUdW5pbmc6ICAgICAgICAga0luZGV4IHwgdHVuIHwgcG9ydCAgICAgICAgICAgICAoYm9vbCwgYXJncykKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihDMk51bWJlclBvcnRUdW5pbmcpID09IDEyLCAiYmFkIHNpemUiKTsKKyAgICAvLyBDMk51bWJlclBvcnRUdW5pbmc6OmlucHV0OiAga0luZGV4IHwgdHVuIHwgcG9ydCB8IGlucHV0ICAgICAoYXJncykKKyAgICAvLyBDMk51bWJlclBvcnRUdW5pbmc6Om91dHB1dDoga0luZGV4IHwgdHVuIHwgcG9ydCB8IG91dHB1dCAgICAoYXJncykKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTnVtYmVyUG9ydFR1bmluZzo6aW5wdXQ6OkNPUkVfSU5ERVggPT0KKyAgICAgICAgICAgICAgICAgIGtQYXJhbUluZGV4TnVtYmVyLCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChDMk51bWJlclBvcnRUdW5pbmc6OmlucHV0OjpQQVJBTV9UWVBFID09CisgICAgICAgICAgICAgICAgICAoa1BhcmFtSW5kZXhOdW1iZXIgfCBJOjpLSU5EX1RVTklORyB8IEk6OkRJUl9JTlBVVCksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTnVtYmVyUG9ydFR1bmluZzo6b3V0cHV0OjpDT1JFX0lOREVYID09CisgICAgICAgICAgICAgICAgICBrUGFyYW1JbmRleE51bWJlciwgImJhZCBpbmRleCIpOworICAgIHN0YXRpY19hc3NlcnQoQzJOdW1iZXJQb3J0VHVuaW5nOjpvdXRwdXQ6OlBBUkFNX1RZUEUgPT0KKyAgICAgICAgICAgICAgICAgIChrUGFyYW1JbmRleE51bWJlciB8IEk6OktJTkRfVFVOSU5HIHwgSTo6RElSX09VVFBVVCksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihDMk51bWJlclBvcnRUdW5pbmc6OmlucHV0KSA9PSAxMiwgImJhZCBzaXplIik7CisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoQzJOdW1iZXJQb3J0VHVuaW5nOjpvdXRwdXQpID09IDEyLCAiYmFkIHNpemUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTnVtYmVyUG9ydFR1bmluZzo6aW5wdXQsIF9tU2l6ZSkgPT0gMCwgImJhZCBzaXplIik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk51bWJlclBvcnRUdW5pbmc6OmlucHV0LCBfbUluZGV4KSA9PSA0LCAiYmFkIG9mZnNldCIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJOdW1iZXJQb3J0VHVuaW5nOjppbnB1dCwgbU51bWJlcikgPT0gOCwgImJhZCBvZmZzZXQiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTnVtYmVyUG9ydFR1bmluZzo6b3V0cHV0LCBfbVNpemUpID09IDAsICJiYWQgc2l6ZSIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJOdW1iZXJQb3J0VHVuaW5nOjpvdXRwdXQsIF9tSW5kZXgpID09IDQsICJiYWQgb2Zmc2V0Iik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk51bWJlclBvcnRUdW5pbmc6Om91dHB1dCwgbU51bWJlcikgPT0gOCwgImJhZCBvZmZzZXQiKTsKKworICAgIC8vIEMyTnVtYmVyU3RyZWFtVHVuaW5nOiAgICAgICBrSW5kZXggfCB0dW4gfCBzdHIgICAgICAgICAgICAgIChib29sLCB1aW50LCBhcmdzKQorICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKEMyTnVtYmVyU3RyZWFtVHVuaW5nKSA9PSAxMnUsICJiYWQgc2l6ZSIpOworICAgIC8vIEMyTnVtYmVyU3RyZWFtVHVuaW5nOjppbnB1dCBrSW5kZXggfCB0dW4gfCBzdHIgfCBpbnB1dCAgICAgIChpbnQsIGFyZ3MpCisgICAgLy8gQzJOdW1iZXJTdHJlYW1UdW5pbmc6Om91dHB1dCBrSXggICB8IHR1biB8IHN0ciB8IG91dHB1dCAgICAgKGludCwgYXJncykKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTnVtYmVyU3RyZWFtVHVuaW5nOjppbnB1dDo6Q09SRV9JTkRFWCA9PQorICAgICAgICAgICAgICAgICAga1BhcmFtSW5kZXhOdW1iZXIsICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTnVtYmVyU3RyZWFtVHVuaW5nOjppbnB1dDo6UEFSQU1fVFlQRSA9PQorICAgICAgICAgICAgICAgICAgKGtQYXJhbUluZGV4TnVtYmVyIHwgSTo6S0lORF9UVU5JTkcgfCBJOjpESVJfSU5QVVQgfCBJOjpJU19TVFJFQU1fRkxBRyksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OkNPUkVfSU5ERVggPT0KKyAgICAgICAgICAgICAgICAgIGtQYXJhbUluZGV4TnVtYmVyLCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChDMk51bWJlclN0cmVhbVR1bmluZzo6b3V0cHV0OjpQQVJBTV9UWVBFID09CisgICAgICAgICAgICAgICAgICAoa1BhcmFtSW5kZXhOdW1iZXIgfCBJOjpLSU5EX1RVTklORyB8IEk6OkRJUl9PVVRQVVQgfCBJOjpJU19TVFJFQU1fRkxBRyksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihDMk51bWJlclN0cmVhbVR1bmluZzo6aW5wdXQpID09IDEydSwgImJhZCBzaXplIik7CisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoQzJOdW1iZXJTdHJlYW1UdW5pbmc6Om91dHB1dCkgPT0gMTJ1LCAiYmFkIHNpemUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjppbnB1dCwgX21TaXplKSA9PSAwLCAiYmFkIHNpemUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjppbnB1dCwgX21JbmRleCkgPT0gNCwgImJhZCBvZmZzZXQiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjppbnB1dCwgbU51bWJlcikgPT0gOCwgImJhZCBvZmZzZXQiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpvdXRwdXQsIF9tU2l6ZSkgPT0gMCwgImJhZCBzaXplIik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk51bWJlclN0cmVhbVR1bmluZzo6b3V0cHV0LCBfbUluZGV4KSA9PSA0LCAiYmFkIG9mZnNldCIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJOdW1iZXJTdHJlYW1UdW5pbmc6Om91dHB1dCwgbU51bWJlcikgPT0gOCwgImJhZCBvZmZzZXQiKTsKK30KKwordm9pZCBfQzJQYXJhbUluc3BlY3Rvcjo6U3RhdGljRnJvbUJhc2VUZXN0KCkgeworICAgIGVudW0geyBrUGFyYW1JbmRleE15ID0gMzEwMiB9OworICAgIHR5cGVkZWYgQzJOdW1iZXJCYXNlU3RydWN0IEMyTXlTdHJ1Y3Q7CisgICAgdHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMyU2V0dGluZywgQzJNeVN0cnVjdCwga1BhcmFtSW5kZXhNeT4gQzJNeVNldHRpbmc7CisgICAgdHlwZWRlZiAgIEMyUG9ydFBhcmFtPEMyU2V0dGluZywgQzJNeVN0cnVjdCwga1BhcmFtSW5kZXhNeT4gQzJNeVBvcnRTZXR0aW5nOworICAgIHR5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMlNldHRpbmcsIEMyTXlTdHJ1Y3QsIGtQYXJhbUluZGV4TXk+IEMyTXlTdHJlYW1TZXR0aW5nOworCisgICAgdHlwZWRlZiBDMlBhcmFtOjpJbmRleCBJOworCisgICAgLy8gQzJNeVN0cnVjdCBoYXMgbm8gQ09SRV9JTkRFWAorICAgIC8vc3RhdGljX2Fzc2VydChDMk15U3RydWN0OjpDT1JFX0lOREVYID09IGtQYXJhbUluZGV4TXksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihDMk15U3RydWN0KSA9PSA0LCAiYmFkIHNpemUiKTsKKworICAgIC8vIEMyTXlTZXR0aW5nOiAgICAgICAgICAgICBrSW5kZXggfCB0dW4gfCBnbG9iYWwgICAgICAgICAgIChhcmdzKQorICAgIHN0YXRpY19hc3NlcnQoQzJNeVNldHRpbmc6OkNPUkVfSU5ERVggPT0ga1BhcmFtSW5kZXhNeSwgImJhZCBpbmRleCIpOworICAgIHN0YXRpY19hc3NlcnQoQzJNeVNldHRpbmc6OlBBUkFNX1RZUEUgPT0gKGtQYXJhbUluZGV4TXkgfCBJOjpLSU5EX1NFVFRJTkcgfCBJOjpESVJfR0xPQkFMKSwgImJhZCBpbmRleCIpOworICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKEMyTXlTZXR0aW5nKSA9PSAxMiwgImJhZCBzaXplIik7CisKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTXlTZXR0aW5nLCBfbVNpemUpID09IDAsICJiYWQgc2l6ZSIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJNeVNldHRpbmcsIF9tSW5kZXgpID09IDQsICJiYWQgb2Zmc2V0Iik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk15U2V0dGluZywgbU51bWJlcikgPT0gOCwgImJhZCBvZmZzZXQiKTsKKworICAgIC8vIEMyTXlQb3J0U2V0dGluZzogICAgICAgICBrSW5kZXggfCB0dW4gfCBwb3J0ICAgICAgICAgICAgIChib29sLCBhcmdzKQorICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKEMyTXlQb3J0U2V0dGluZykgPT0gMTIsICJiYWQgc2l6ZSIpOworICAgIC8vIEMyTXlQb3J0U2V0dGluZzo6aW5wdXQ6ICBrSW5kZXggfCB0dW4gfCBwb3J0IHwgaW5wdXQgICAgIChhcmdzKQorICAgIC8vIEMyTXlQb3J0U2V0dGluZzo6b3V0cHV0OiBrSW5kZXggfCB0dW4gfCBwb3J0IHwgb3V0cHV0ICAgIChhcmdzKQorICAgIHN0YXRpY19hc3NlcnQoQzJNeVBvcnRTZXR0aW5nOjppbnB1dDo6Q09SRV9JTkRFWCA9PQorICAgICAgICAgICAgICAgICAga1BhcmFtSW5kZXhNeSwgImJhZCBpbmRleCIpOworICAgIHN0YXRpY19hc3NlcnQoQzJNeVBvcnRTZXR0aW5nOjppbnB1dDo6UEFSQU1fVFlQRSA9PQorICAgICAgICAgICAgICAgICAgKGtQYXJhbUluZGV4TXkgfCBJOjpLSU5EX1NFVFRJTkcgfCBJOjpESVJfSU5QVVQpLCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChDMk15UG9ydFNldHRpbmc6Om91dHB1dDo6Q09SRV9JTkRFWCA9PQorICAgICAgICAgICAgICAgICAga1BhcmFtSW5kZXhNeSwgImJhZCBpbmRleCIpOworICAgIHN0YXRpY19hc3NlcnQoQzJNeVBvcnRTZXR0aW5nOjpvdXRwdXQ6OlBBUkFNX1RZUEUgPT0KKyAgICAgICAgICAgICAgICAgIChrUGFyYW1JbmRleE15IHwgSTo6S0lORF9TRVRUSU5HIHwgSTo6RElSX09VVFBVVCksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihDMk15UG9ydFNldHRpbmc6OmlucHV0KSA9PSAxMiwgImJhZCBzaXplIik7CisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoQzJNeVBvcnRTZXR0aW5nOjpvdXRwdXQpID09IDEyLCAiYmFkIHNpemUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTXlQb3J0U2V0dGluZzo6aW5wdXQsIF9tU2l6ZSkgPT0gMCwgImJhZCBzaXplIik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk15UG9ydFNldHRpbmc6OmlucHV0LCBfbUluZGV4KSA9PSA0LCAiYmFkIG9mZnNldCIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJNeVBvcnRTZXR0aW5nOjppbnB1dCwgbU51bWJlcikgPT0gOCwgImJhZCBvZmZzZXQiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTXlQb3J0U2V0dGluZzo6b3V0cHV0LCBfbVNpemUpID09IDAsICJiYWQgc2l6ZSIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJNeVBvcnRTZXR0aW5nOjpvdXRwdXQsIF9tSW5kZXgpID09IDQsICJiYWQgb2Zmc2V0Iik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk15UG9ydFNldHRpbmc6Om91dHB1dCwgbU51bWJlcikgPT0gOCwgImJhZCBvZmZzZXQiKTsKKworICAgIC8vIEMyTXlTdHJlYW1TZXR0aW5nOiAgICAgICBrSW5kZXggfCB0dW4gfCBzdHIgICAgICAgICAgICAgIChib29sLCB1aW50LCBhcmdzKQorICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKEMyTXlTdHJlYW1TZXR0aW5nKSA9PSAxMnUsICJiYWQgc2l6ZSIpOworICAgIC8vIEMyTXlTdHJlYW1TZXR0aW5nOjppbnB1dCBrSW5kZXggfCB0dW4gfCBzdHIgfCBpbnB1dCAgICAgIChpbnQsIGFyZ3MpCisgICAgLy8gQzJNeVN0cmVhbVNldHRpbmc6Om91dHB1dCBrSXggICB8IHR1biB8IHN0ciB8IG91dHB1dCAgICAgKGludCwgYXJncykKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTXlTdHJlYW1TZXR0aW5nOjppbnB1dDo6Q09SRV9JTkRFWCA9PQorICAgICAgICAgICAgICAgICAga1BhcmFtSW5kZXhNeSwgImJhZCBpbmRleCIpOworICAgIHN0YXRpY19hc3NlcnQoQzJNeVN0cmVhbVNldHRpbmc6OmlucHV0OjpQQVJBTV9UWVBFID09CisgICAgICAgICAgICAgICAgICAoa1BhcmFtSW5kZXhNeSB8IEk6OktJTkRfU0VUVElORyB8IEk6OkRJUl9JTlBVVCB8IEk6OklTX1NUUkVBTV9GTEFHKSwgImJhZCBpbmRleCIpOworICAgIHN0YXRpY19hc3NlcnQoQzJNeVN0cmVhbVNldHRpbmc6Om91dHB1dDo6Q09SRV9JTkRFWCA9PQorICAgICAgICAgICAgICAgICAga1BhcmFtSW5kZXhNeSwgImJhZCBpbmRleCIpOworICAgIHN0YXRpY19hc3NlcnQoQzJNeVN0cmVhbVNldHRpbmc6Om91dHB1dDo6UEFSQU1fVFlQRSA9PQorICAgICAgICAgICAgICAgICAgKGtQYXJhbUluZGV4TXkgfCBJOjpLSU5EX1NFVFRJTkcgfCBJOjpESVJfT1VUUFVUIHwgSTo6SVNfU1RSRUFNX0ZMQUcpLCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoQzJNeVN0cmVhbVNldHRpbmc6OmlucHV0KSA9PSAxMnUsICJiYWQgc2l6ZSIpOworICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKEMyTXlTdHJlYW1TZXR0aW5nOjpvdXRwdXQpID09IDEydSwgImJhZCBzaXplIik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk15U3RyZWFtU2V0dGluZzo6aW5wdXQsIF9tU2l6ZSkgPT0gMCwgImJhZCBzaXplIik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk15U3RyZWFtU2V0dGluZzo6aW5wdXQsIF9tSW5kZXgpID09IDQsICJiYWQgb2Zmc2V0Iik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk15U3RyZWFtU2V0dGluZzo6aW5wdXQsIG1OdW1iZXIpID09IDgsICJiYWQgb2Zmc2V0Iik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk15U3RyZWFtU2V0dGluZzo6b3V0cHV0LCBfbVNpemUpID09IDAsICJiYWQgc2l6ZSIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJNeVN0cmVhbVNldHRpbmc6Om91dHB1dCwgX21JbmRleCkgPT0gNCwgImJhZCBvZmZzZXQiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTXlTdHJlYW1TZXR0aW5nOjpvdXRwdXQsIG1OdW1iZXIpID09IDgsICJiYWQgb2Zmc2V0Iik7Cit9CisKK3ZvaWQgX0MyUGFyYW1JbnNwZWN0b3I6OlN0YXRpY0ZsZXhUZXN0KCkgeworICAgIHR5cGVkZWYgQzJQYXJhbTo6SW5kZXggSTsKKworICAgIC8vIEMyTnVtYmVyc1N0cnVjdDogQ09SRV9JTkRFWCA9IGtJbmRleCAgICAgICAgICAgICAgICAgICAgICAgICAgKGFyZ3MpCisgICAgc3RhdGljX2Fzc2VydChDMk51bWJlcnNTdHJ1Y3Q6OkNPUkVfSU5ERVggPT0gKEk6OklTX0ZMRVhfRkxBRyB8IGtQYXJhbUluZGV4TnVtYmVycyksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihDMk51bWJlcnNTdHJ1Y3QpID09IDAsICJiYWQgc2l6ZSIpOworCisgICAgLy8gQzJOdW1iZXJzVHVuaW5nOiAgICAgICAgICAgICBrSW5kZXggfCB0dW4gfCBnbG9iYWwgICAgICAgICAgIChhcmdzKQorICAgIHN0YXRpY19hc3NlcnQoQzJOdW1iZXJzVHVuaW5nOjpDT1JFX0lOREVYID09IChJOjpJU19GTEVYX0ZMQUcgfCBrUGFyYW1JbmRleE51bWJlcnMpLCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChDMk51bWJlcnNUdW5pbmc6OlBBUkFNX1RZUEUgPT0gKEk6OklTX0ZMRVhfRkxBRyB8IGtQYXJhbUluZGV4TnVtYmVycyB8IEk6OktJTkRfVFVOSU5HIHwgSTo6RElSX0dMT0JBTCksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihDMk51bWJlcnNUdW5pbmcpID09IDgsICJiYWQgc2l6ZSIpOworCisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk51bWJlcnNUdW5pbmcsIF9tU2l6ZSkgPT0gMCwgImJhZCBzaXplIik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk51bWJlcnNUdW5pbmcsIF9tSW5kZXgpID09IDQsICJiYWQgb2Zmc2V0Iik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk51bWJlcnNUdW5pbmcsIG0ubU51bWJlcnMpID09IDgsICJiYWQgb2Zmc2V0Iik7CisKKyAgICAvLyBDMk51bWJlcnNQb3J0VHVuaW5nOiAgICAgICAgIGtJbmRleCB8IHR1biB8IHBvcnQgICAgICAgICAgICAgKGJvb2wsIGFyZ3MpCisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoQzJOdW1iZXJzUG9ydFR1bmluZykgPT0gOCwgImJhZCBzaXplIik7CisgICAgLy8gQzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQ6ICBrSW5kZXggfCB0dW4gfCBwb3J0IHwgaW5wdXQgICAgIChhcmdzKQorICAgIC8vIEMyTnVtYmVyc1BvcnRUdW5pbmc6Om91dHB1dDoga0luZGV4IHwgdHVuIHwgcG9ydCB8IG91dHB1dCAgICAoYXJncykKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0OjpDT1JFX0lOREVYID09CisgICAgICAgICAgICAgICAgICAoSTo6SVNfRkxFWF9GTEFHIHwga1BhcmFtSW5kZXhOdW1iZXJzKSwgImJhZCBpbmRleCIpOworICAgIHN0YXRpY19hc3NlcnQoQzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQ6OlBBUkFNX1RZUEUgPT0KKyAgICAgICAgICAgICAgICAgIChJOjpJU19GTEVYX0ZMQUcgfCBrUGFyYW1JbmRleE51bWJlcnMgfCBJOjpLSU5EX1RVTklORyB8IEk6OkRJUl9JTlBVVCksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTnVtYmVyc1BvcnRUdW5pbmc6Om91dHB1dDo6Q09SRV9JTkRFWCA9PQorICAgICAgICAgICAgICAgICAgKEk6OklTX0ZMRVhfRkxBRyB8IGtQYXJhbUluZGV4TnVtYmVycyksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTnVtYmVyc1BvcnRUdW5pbmc6Om91dHB1dDo6UEFSQU1fVFlQRSA9PQorICAgICAgICAgICAgICAgICAgKEk6OklTX0ZMRVhfRkxBRyB8IGtQYXJhbUluZGV4TnVtYmVycyB8IEk6OktJTkRfVFVOSU5HIHwgSTo6RElSX09VVFBVVCksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihDMk51bWJlcnNQb3J0VHVuaW5nOjppbnB1dCkgPT0gOCwgImJhZCBzaXplIik7CisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoQzJOdW1iZXJzUG9ydFR1bmluZzo6b3V0cHV0KSA9PSA4LCAiYmFkIHNpemUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0LCBfbVNpemUpID09IDAsICJiYWQgc2l6ZSIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQsIF9tSW5kZXgpID09IDQsICJiYWQgb2Zmc2V0Iik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk51bWJlcnNQb3J0VHVuaW5nOjppbnB1dCwgbS5tTnVtYmVycykgPT0gOCwgImJhZCBvZmZzZXQiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTnVtYmVyc1BvcnRUdW5pbmc6Om91dHB1dCwgX21TaXplKSA9PSAwLCAiYmFkIHNpemUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTnVtYmVyc1BvcnRUdW5pbmc6Om91dHB1dCwgX21JbmRleCkgPT0gNCwgImJhZCBvZmZzZXQiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTnVtYmVyc1BvcnRUdW5pbmc6Om91dHB1dCwgbS5tTnVtYmVycykgPT0gOCwgImJhZCBvZmZzZXQiKTsKKworICAgIC8vIEMyTnVtYmVyc1N0cmVhbVR1bmluZzogICAgICAga0luZGV4IHwgdHVuIHwgc3RyICAgICAgICAgICAgICAoYm9vbCwgdWludCwgYXJncykKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihDMk51bWJlcnNTdHJlYW1UdW5pbmcpID09IDgsICJiYWQgc2l6ZSIpOworICAgIC8vIEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6aW5wdXQga0luZGV4IHwgdHVuIHwgc3RyIHwgaW5wdXQgICAgICAoaW50LCBhcmdzKQorICAgIC8vIEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6b3V0cHV0IGtJeCAgIHwgdHVuIHwgc3RyIHwgb3V0cHV0ICAgICAoaW50LCBhcmdzKQorICAgIHN0YXRpY19hc3NlcnQoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjppbnB1dDo6Q09SRV9JTkRFWCA9PQorICAgICAgICAgICAgICAgICAgKEk6OklTX0ZMRVhfRkxBRyB8IGtQYXJhbUluZGV4TnVtYmVycyksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6aW5wdXQ6OlBBUkFNX1RZUEUgPT0KKyAgICAgICAgICAgICAgICAgIChJOjpJU19GTEVYX0ZMQUcgfCBrUGFyYW1JbmRleE51bWJlcnMgfCBJOjpLSU5EX1RVTklORyB8IEk6OkRJUl9JTlBVVCB8IEk6OklTX1NUUkVBTV9GTEFHKSwgImJhZCBpbmRleCIpOworICAgIHN0YXRpY19hc3NlcnQoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OkNPUkVfSU5ERVggPT0KKyAgICAgICAgICAgICAgICAgIChJOjpJU19GTEVYX0ZMQUcgfCBrUGFyYW1JbmRleE51bWJlcnMpLCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChDMk51bWJlcnNTdHJlYW1UdW5pbmc6Om91dHB1dDo6UEFSQU1fVFlQRSA9PQorICAgICAgICAgICAgICAgICAgKEk6OklTX0ZMRVhfRkxBRyB8IGtQYXJhbUluZGV4TnVtYmVycyB8IEk6OktJTkRfVFVOSU5HIHwgSTo6RElSX09VVFBVVCB8IEk6OklTX1NUUkVBTV9GTEFHKSwgImJhZCBpbmRleCIpOworICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6aW5wdXQpID09IDgsICJiYWQgc2l6ZSIpOworICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6b3V0cHV0KSA9PSA4LCAiYmFkIHNpemUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6aW5wdXQsIF9tU2l6ZSkgPT0gMCwgImJhZCBzaXplIik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk51bWJlcnNTdHJlYW1UdW5pbmc6OmlucHV0LCBfbUluZGV4KSA9PSA0LCAiYmFkIG9mZnNldCIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjppbnB1dCwgbS5tTnVtYmVycykgPT0gOCwgImJhZCBvZmZzZXQiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6b3V0cHV0LCBfbVNpemUpID09IDAsICJiYWQgc2l6ZSIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpvdXRwdXQsIF9tSW5kZXgpID09IDQsICJiYWQgb2Zmc2V0Iik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk51bWJlcnNTdHJlYW1UdW5pbmc6Om91dHB1dCwgbS5tTnVtYmVycykgPT0gOCwgImJhZCBvZmZzZXQiKTsKK30KKwordGVtcGxhdGU8Ym9vbCwgdW5zaWduZWQgLi4uTj4KK3N0cnVjdCBfcHJpbnRfYXNfd2FybmluZyB7IH07CisKK3RlbXBsYXRlPHVuc2lnbmVkIC4uLk4+CitzdHJ1Y3QgX3ByaW50X2FzX3dhcm5pbmc8dHJ1ZSwgTi4uLj4gOiBzdGQ6OnRydWVfdHlwZSB7IH07CisKKyNkZWZpbmUgc3RhdGljX2Fzc2VydF9lcXVhbHMoYSwgYiwgbXNnKSBcCitzdGF0aWNfYXNzZXJ0KF9wcmludF9hc193YXJuaW5nPChhKSA9PSAoYiksIGEsIGI+Ojp2YWx1ZSwgbXNnKQorCit2b2lkIF9DMlBhcmFtSW5zcGVjdG9yOjpTdGF0aWNGbGV4RnJvbUJhc2VUZXN0KCkgeworICAgIGVudW0geyBrUGFyYW1JbmRleE15ID0gMTIwMyB9OworICAgIHR5cGVkZWYgQzJUZXN0QmFzZUZsZXhFbmRTaXplU3RydWN0IEMyTXlTdHJ1Y3Q7CisgICAgdHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMySW5mbywgQzJNeVN0cnVjdCwga1BhcmFtSW5kZXhNeT4gQzJNeUluZm87CisgICAgdHlwZWRlZiAgIEMyUG9ydFBhcmFtPEMySW5mbywgQzJNeVN0cnVjdCwga1BhcmFtSW5kZXhNeT4gQzJNeVBvcnRJbmZvOworICAgIHR5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyTXlTdHJ1Y3QsIGtQYXJhbUluZGV4TXk+IEMyTXlTdHJlYW1JbmZvOworCisgICAgdHlwZWRlZiBDMlBhcmFtOjpJbmRleCBJOworCisgICAgLy8gQzJNeVN0cnVjdCBoYXMgbm8gQ09SRV9JTkRFWAorICAgIC8vc3RhdGljX2Fzc2VydChDMk15U3RydWN0OjpDT1JFX0lOREVYID09IChJOjpJU19GTEVYX0ZMQUcgfCBrUGFyYW1JbmRleE15KSwgImJhZCBpbmRleCIpOworICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKEMyTXlTdHJ1Y3QpID09IDQsICJiYWQgc2l6ZSIpOworCisgICAgLy8gQzJNeUluZm86ICAgICAgICAgICAgIGtJbmRleCB8IHR1biB8IGdsb2JhbCAgICAgICAgICAgKGFyZ3MpCisgICAgc3RhdGljX2Fzc2VydF9lcXVhbHMoQzJNeUluZm86OkNPUkVfSU5ERVgsIChJOjpJU19GTEVYX0ZMQUcgfCBrUGFyYW1JbmRleE15KSwgImJhZCBpbmRleCIpOworICAgIHN0YXRpY19hc3NlcnRfZXF1YWxzKEMyTXlJbmZvOjpQQVJBTV9UWVBFLCAoSTo6SVNfRkxFWF9GTEFHIHwga1BhcmFtSW5kZXhNeSB8IEk6OktJTkRfSU5GTyB8IEk6OkRJUl9HTE9CQUwpLCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoQzJNeUluZm8pID09IDEyLCAiYmFkIHNpemUiKTsKKworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJNeUluZm8sIF9tU2l6ZSkgPT0gMCwgImJhZCBzaXplIik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk15SW5mbywgX21JbmRleCkgPT0gNCwgImJhZCBvZmZzZXQiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTXlJbmZvLCBtLnNpZ25lZDMyKSA9PSA4LCAiYmFkIG9mZnNldCIpOworCisgICAgLy8gQzJNeVBvcnRJbmZvOiAgICAgICAgIGtJbmRleCB8IHR1biB8IHBvcnQgICAgICAgICAgICAgKGJvb2wsIGFyZ3MpCisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoQzJNeVBvcnRJbmZvKSA9PSAxMiwgImJhZCBzaXplIik7CisgICAgLy8gQzJNeVBvcnRJbmZvOjppbnB1dDogIGtJbmRleCB8IHR1biB8IHBvcnQgfCBpbnB1dCAgICAgKGFyZ3MpCisgICAgLy8gQzJNeVBvcnRJbmZvOjpvdXRwdXQ6IGtJbmRleCB8IHR1biB8IHBvcnQgfCBvdXRwdXQgICAgKGFyZ3MpCisgICAgc3RhdGljX2Fzc2VydChDMk15UG9ydEluZm86OmlucHV0OjpDT1JFX0lOREVYID09CisgICAgICAgICAgICAgICAgICAoSTo6SVNfRkxFWF9GTEFHIHwga1BhcmFtSW5kZXhNeSksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTXlQb3J0SW5mbzo6aW5wdXQ6OlBBUkFNX1RZUEUgPT0KKyAgICAgICAgICAgICAgICAgIChJOjpJU19GTEVYX0ZMQUcgfCBrUGFyYW1JbmRleE15IHwgSTo6S0lORF9JTkZPIHwgSTo6RElSX0lOUFVUKSwgImJhZCBpbmRleCIpOworICAgIHN0YXRpY19hc3NlcnQoQzJNeVBvcnRJbmZvOjpvdXRwdXQ6OkNPUkVfSU5ERVggPT0KKyAgICAgICAgICAgICAgICAgIChJOjpJU19GTEVYX0ZMQUcgfCBrUGFyYW1JbmRleE15KSwgImJhZCBpbmRleCIpOworICAgIHN0YXRpY19hc3NlcnQoQzJNeVBvcnRJbmZvOjpvdXRwdXQ6OlBBUkFNX1RZUEUgPT0KKyAgICAgICAgICAgICAgICAgIChJOjpJU19GTEVYX0ZMQUcgfCBrUGFyYW1JbmRleE15IHwgSTo6S0lORF9JTkZPIHwgSTo6RElSX09VVFBVVCksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihDMk15UG9ydEluZm86OmlucHV0KSA9PSAxMiwgImJhZCBzaXplIik7CisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoQzJNeVBvcnRJbmZvOjpvdXRwdXQpID09IDEyLCAiYmFkIHNpemUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTXlQb3J0SW5mbzo6aW5wdXQsIF9tU2l6ZSkgPT0gMCwgImJhZCBzaXplIik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk15UG9ydEluZm86OmlucHV0LCBfbUluZGV4KSA9PSA0LCAiYmFkIG9mZnNldCIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJNeVBvcnRJbmZvOjppbnB1dCwgbS5zaWduZWQzMikgPT0gOCwgImJhZCBvZmZzZXQiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTXlQb3J0SW5mbzo6b3V0cHV0LCBfbVNpemUpID09IDAsICJiYWQgc2l6ZSIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJNeVBvcnRJbmZvOjpvdXRwdXQsIF9tSW5kZXgpID09IDQsICJiYWQgb2Zmc2V0Iik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk15UG9ydEluZm86Om91dHB1dCwgbS5zaWduZWQzMikgPT0gOCwgImJhZCBvZmZzZXQiKTsKKworICAgIC8vIEMyTXlTdHJlYW1JbmZvOiAgICAgICBrSW5kZXggfCB0dW4gfCBzdHIgICAgICAgICAgICAgIChib29sLCB1aW50LCBhcmdzKQorICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKEMyTXlTdHJlYW1JbmZvKSA9PSAxMiwgImJhZCBzaXplIik7CisgICAgLy8gQzJNeVN0cmVhbUluZm86OmlucHV0IGtJbmRleCB8IHR1biB8IHN0ciB8IGlucHV0ICAgICAgKGludCwgYXJncykKKyAgICAvLyBDMk15U3RyZWFtSW5mbzo6b3V0cHV0IGtJeCAgIHwgdHVuIHwgc3RyIHwgb3V0cHV0ICAgICAoaW50LCBhcmdzKQorICAgIHN0YXRpY19hc3NlcnQoQzJNeVN0cmVhbUluZm86OmlucHV0OjpDT1JFX0lOREVYID09CisgICAgICAgICAgICAgICAgICAoSTo6SVNfRkxFWF9GTEFHIHwga1BhcmFtSW5kZXhNeSksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTXlTdHJlYW1JbmZvOjppbnB1dDo6UEFSQU1fVFlQRSA9PQorICAgICAgICAgICAgICAgICAgKEk6OklTX0ZMRVhfRkxBRyB8IGtQYXJhbUluZGV4TXkgfCBJOjpLSU5EX0lORk8gfCBJOjpESVJfSU5QVVQgfCBJOjpJU19TVFJFQU1fRkxBRyksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTXlTdHJlYW1JbmZvOjpvdXRwdXQ6OkNPUkVfSU5ERVggPT0KKyAgICAgICAgICAgICAgICAgIChJOjpJU19GTEVYX0ZMQUcgfCBrUGFyYW1JbmRleE15KSwgImJhZCBpbmRleCIpOworICAgIHN0YXRpY19hc3NlcnQoQzJNeVN0cmVhbUluZm86Om91dHB1dDo6UEFSQU1fVFlQRSA9PQorICAgICAgICAgICAgICAgICAgKEk6OklTX0ZMRVhfRkxBRyB8IGtQYXJhbUluZGV4TXkgfCBJOjpLSU5EX0lORk8gfCBJOjpESVJfT1VUUFVUIHwgSTo6SVNfU1RSRUFNX0ZMQUcpLCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoQzJNeVN0cmVhbUluZm86OmlucHV0KSA9PSAxMiwgImJhZCBzaXplIik7CisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoQzJNeVN0cmVhbUluZm86Om91dHB1dCkgPT0gMTIsICJiYWQgc2l6ZSIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJNeVN0cmVhbUluZm86OmlucHV0LCBfbVNpemUpID09IDAsICJiYWQgc2l6ZSIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJNeVN0cmVhbUluZm86OmlucHV0LCBfbUluZGV4KSA9PSA0LCAiYmFkIG9mZnNldCIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJNeVN0cmVhbUluZm86OmlucHV0LCBtLnNpZ25lZDMyKSA9PSA4LCAiYmFkIG9mZnNldCIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJNeVN0cmVhbUluZm86Om91dHB1dCwgX21TaXplKSA9PSAwLCAiYmFkIHNpemUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTXlTdHJlYW1JbmZvOjpvdXRwdXQsIF9tSW5kZXgpID09IDQsICJiYWQgb2Zmc2V0Iik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk15U3RyZWFtSW5mbzo6b3V0cHV0LCBtLnNpZ25lZDMyKSA9PSA4LCAiYmFkIG9mZnNldCIpOworfQorCitURVNUX0YoQzJQYXJhbVRlc3QsIFBhcmFtT3BzVGVzdCkgeworICAgIGNvbnN0IEMyTnVtYmVyU3RydWN0IHN0cigxMDApOworICAgIEMyTnVtYmVyU3RydWN0IGJzdHI7CisKKyAgICB7CisgICAgICAgIEVYUEVDVF9FUSgxMDAsIHN0ci5tTnVtYmVyKTsKKyAgICAgICAgYnN0ci5tTnVtYmVyID0gMTAwOworCisgICAgICAgIEMyUGFyYW06OkNvcmVJbmRleCBpbmRleCA9IEMyTnVtYmVyU3RydWN0OjpDT1JFX0lOREVYOworICAgICAgICBFWFBFQ1RfRkFMU0UoaW5kZXguaXNWZW5kb3IoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRShpbmRleC5pc0ZsZXhpYmxlKCkpOworICAgICAgICBFWFBFQ1RfRVEoaW5kZXguY29yZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVyKTsKKyAgICAgICAgRVhQRUNUX0VRKGluZGV4LnR5cGVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcik7CisgICAgfQorCisgICAgY29uc3QgQzJOdW1iZXJUdW5pbmcgdHVuKDEwMCk7CisgICAgQzJOdW1iZXJUdW5pbmcgYnR1bjsKKworICAgIHsKKyAgICAgIEMyTnVtYmVySW5mbyBpbmYoMTAwKTsKKyAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMk51bWJlcnNUdW5pbmc+IHR1bl8gPSBDMk51bWJlcnNUdW5pbmc6OkFsbG9jVW5pcXVlKDEpOworCisgICAgICBFWFBFQ1RfRVEodHVuLmNvcmVJbmRleCgpLCBpbmYuY29yZUluZGV4KCkpOworICAgICAgRVhQRUNUX05FKHR1bi5jb3JlSW5kZXgoKSwgdHVuXy0+Y29yZUluZGV4KCkpOworICAgICAgRVhQRUNUX05FKHR1bi50eXBlKCksIGluZi50eXBlKCkpOworICAgICAgRVhQRUNUX05FKHR1bi50eXBlKCksIHR1bl8tPnR5cGUoKSk7CisgICAgfQorCisgICAgeworICAgICAgICAvLyBmbGFncyAmIGludmFyaWFibGVzCisgICAgICAgIGZvciAoY29uc3QgYXV0byAmcCA6IHsgdHVuLCBidHVuIH0pIHsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKChib29sKXApOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKCFwKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUSgxMnUsIHAuc2l6ZSgpKTsKKworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuaXNWZW5kb3IoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5pc0ZsZXhpYmxlKCkpOworICAgICAgICAgICAgRVhQRUNUX1RSVUUocC5pc0dsb2JhbCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmZvcklucHV0KCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuZm9yT3V0cHV0KCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuZm9yU3RyZWFtKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuZm9yUG9ydCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHZhbHVlCisgICAgICAgIEVYUEVDVF9FUSgxMDAsIHR1bi5tTnVtYmVyKTsKKyAgICAgICAgRVhQRUNUX0VRKDAsIGJ0dW4ubU51bWJlcik7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0dW4gPT0gYnR1bik7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0dW4ub3BlcmF0b3I9PShidHVuKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKHR1biAhPSBidHVuKTsKKyAgICAgICAgRVhQRUNUX1RSVUUodHVuLm9wZXJhdG9yIT0oYnR1bikpOworICAgICAgICBidHVuLm1OdW1iZXIgPSAxMDA7CisgICAgICAgIEVYUEVDVF9FUSh0dW4sIGJ0dW4pOworCisgICAgICAgIC8vIGluZGV4CisgICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKHR1bi50eXBlKCkpLmNvcmVJbmRleCgpLCBDMk51bWJlclN0cnVjdDo6Q09SRV9JTkRFWCk7CisgICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKHR1bi50eXBlKCkpLnR5cGVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcik7CisgICAgICAgIEVYUEVDVF9FUSh0dW4udHlwZSgpLCBDMk51bWJlclR1bmluZzo6UEFSQU1fVFlQRSk7CisgICAgICAgIEVYUEVDVF9FUSh0dW4uc3RyZWFtKCksIH4wdSk7CisKKyAgICAgICAgQzJQYXJhbTo6Q29yZUluZGV4IGluZGV4ID0gQzJOdW1iZXJUdW5pbmc6OkNPUkVfSU5ERVg7CisgICAgICAgIEVYUEVDVF9GQUxTRShpbmRleC5pc1ZlbmRvcigpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKGluZGV4LmlzRmxleGlibGUoKSk7CisgICAgICAgIEVYUEVDVF9FUShpbmRleC5jb3JlSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXIpOworICAgICAgICBFWFBFQ1RfRVEoaW5kZXgudHlwZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVyKTsKKworICAgICAgICBDMlBhcmFtOjpUeXBlIHR5cGUgPSBDMk51bWJlclR1bmluZzo6UEFSQU1fVFlQRTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuaXNWZW5kb3IoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmlzRmxleGlibGUoKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKHR5cGUuaXNHbG9iYWwoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmZvcklucHV0KCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5mb3JPdXRwdXQoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmZvclN0cmVhbSgpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuZm9yUG9ydCgpKTsKKworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJUdW5pbmc6OkZyb20obnVsbHB0ciksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJUdW5pbmc6OkZyb20oJnR1biksICZ0dW4pOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJQb3J0VHVuaW5nOjpGcm9tKCZ0dW4pLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6aW5wdXQ6OkZyb20oJnR1biksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJQb3J0VHVuaW5nOjpvdXRwdXQ6OkZyb20oJnR1biksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJTdHJlYW1UdW5pbmc6OkZyb20oJnR1biksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJTdHJlYW1UdW5pbmc6OmlucHV0OjpGcm9tKCZ0dW4pLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OkZyb20oJnR1biksIG51bGxwdHIpOworCisgICAgICAgIEVYUEVDVF9FUSgqKEMyUGFyYW06OkNvcHkoYnR1bikpLCBidHVuKTsKKyAgICAgICAgYnR1bi5pbnZhbGlkYXRlKCk7CisgICAgICAgIEVYUEVDVF9GQUxTRShDMlBhcmFtOjpDb3B5KGJ0dW4pKTsKKyAgICB9CisKKyAgICBjb25zdCBDMk51bWJlclBvcnRUdW5pbmcgb3V0cDEodHJ1ZSwgMTAwKSwgaW5wMShmYWxzZSwgMTAwKTsKKyAgICBDMk51bWJlclBvcnRUdW5pbmcgYm91dHAxLCBiaW5wMSwgYmlucDMoZmFsc2UsIDEwMCk7CisgICAgY29uc3QgQzJOdW1iZXJQb3J0VHVuaW5nOjppbnB1dCBpbnAyKDEwMCk7CisgICAgQzJOdW1iZXJQb3J0VHVuaW5nOjppbnB1dCBiaW5wMjsKKyAgICBjb25zdCBDMk51bWJlclBvcnRUdW5pbmc6Om91dHB1dCBvdXRwMigxMDApOworICAgIEMyTnVtYmVyUG9ydFR1bmluZzo6b3V0cHV0IGJvdXRwMjsKKworICAgIEVYUEVDVF9FUShpbnAxLmNvcmVJbmRleCgpLCB0dW4uY29yZUluZGV4KCkpOworICAgIEVYUEVDVF9FUShvdXRwMS5jb3JlSW5kZXgoKSwgdHVuLmNvcmVJbmRleCgpKTsKKyAgICBFWFBFQ1RfRVEoYmlucDEuY29yZUluZGV4KCksIHR1bi5jb3JlSW5kZXgoKSk7CisgICAgRVhQRUNUX0VRKGJvdXRwMS5jb3JlSW5kZXgoKSwgdHVuLmNvcmVJbmRleCgpKTsKKyAgICBFWFBFQ1RfRVEoaW5wMi5jb3JlSW5kZXgoKSwgdHVuLmNvcmVJbmRleCgpKTsKKyAgICBFWFBFQ1RfRVEob3V0cDIuY29yZUluZGV4KCksIHR1bi5jb3JlSW5kZXgoKSk7CisKKyAgICBFWFBFQ1RfRVEoaW5wMS50eXBlKCksIGlucDIudHlwZSgpKTsKKyAgICBFWFBFQ1RfRVEob3V0cDEudHlwZSgpLCBvdXRwMi50eXBlKCkpOworICAgIEVYUEVDVF9ORShpbnAxLnR5cGUoKSwgb3V0cDEudHlwZSgpKTsKKyAgICBFWFBFQ1RfTkUoaW5wMi50eXBlKCksIG91dHAyLnR5cGUoKSk7CisgICAgRVhQRUNUX05FKGlucDEudHlwZSgpLCBiaW5wMS50eXBlKCkpOworICAgIEVYUEVDVF9ORShvdXRwMS50eXBlKCksIGJvdXRwMS50eXBlKCkpOworICAgIEVYUEVDVF9ORShpbnAxLnR5cGUoKSwgdHVuLnR5cGUoKSk7CisgICAgRVhQRUNUX05FKGlucDIudHlwZSgpLCB0dW4udHlwZSgpKTsKKworICAgIHsKKyAgICAgICAgc3RhdGljX2Fzc2VydChjYW5DYWxsU2V0UG9ydChiaW5wMyksICJzaG91bGQgYmUgYWJsZSB0byIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KGNhbkNhbGxTZXRQb3J0KGJpbnAxKSwgInNob3VsZCBiZSBhYmxlIHRvIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIWNhbkNhbGxTZXRQb3J0KGlucDEpLCAic2hvdWxkIG5vdCBiZSBhYmxlIHRvIChjb25zdCkiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghY2FuQ2FsbFNldFBvcnQoaW5wMiksICJzaG91bGQgbm90IGJlIGFibGUgdG8gKGNvbnN0ICYgdHlwZSkiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghY2FuQ2FsbFNldFBvcnQoYmlucDIpLCAic2hvdWxkIG5vdCBiZSBhYmxlIHRvICh0eXBlKSIpOworCisgICAgICAgIC8vIGZsYWdzICYgaW52YXJpYWJsZXMKKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZwIDogeyBvdXRwMSwgaW5wMSwgYm91dHAxIH0pIHsKKyAgICAgICAgICAgIEVYUEVDVF9FUSgxMnUsIHAuc2l6ZSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmlzVmVuZG9yKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuaXNGbGV4aWJsZSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmlzR2xvYmFsKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuZm9yU3RyZWFtKCkpOworICAgICAgICAgICAgRVhQRUNUX1RSVUUocC5mb3JQb3J0KCkpOworICAgICAgICB9CisgICAgICAgIGZvciAoY29uc3QgYXV0byAmcCA6IHsgaW5wMiwgYmlucDIgfSkgeworICAgICAgICAgICAgRVhQRUNUX0VRKDEydSwgcC5zaXplKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuaXNWZW5kb3IoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5pc0ZsZXhpYmxlKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuaXNHbG9iYWwoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5mb3JTdHJlYW0oKSk7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRShwLmZvclBvcnQoKSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZwIDogeyBvdXRwMiwgYm91dHAyIH0pIHsKKyAgICAgICAgICAgIEVYUEVDVF9FUSgxMnUsIHAuc2l6ZSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmlzVmVuZG9yKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuaXNGbGV4aWJsZSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmlzR2xvYmFsKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuZm9yU3RyZWFtKCkpOworICAgICAgICAgICAgRVhQRUNUX1RSVUUocC5mb3JQb3J0KCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gcG9ydCBzcGVjaWZpYyBmbGFncyAmIGludmFyaWFibGVzCisgICAgICAgIEVYUEVDVF9GQUxTRShvdXRwMS5mb3JJbnB1dCgpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUob3V0cDEuZm9yT3V0cHV0KCkpOworCisgICAgICAgIEVYUEVDVF9UUlVFKGlucDEuZm9ySW5wdXQoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRShpbnAxLmZvck91dHB1dCgpKTsKKworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJnAgOiB7IG91dHAxLCBpbnAxIH0pIHsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKChib29sKXApOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKCFwKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUSgxMDAsIHAubU51bWJlcik7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZwIDogeyBvdXRwMiwgYm91dHAyIH0pIHsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKChib29sKXApOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKCFwKTsKKworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuZm9ySW5wdXQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRShwLmZvck91dHB1dCgpKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJnAgOiB7IGlucDIsIGJpbnAyIH0pIHsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKChib29sKXApOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKCFwKTsKKworICAgICAgICAgICAgRVhQRUNUX1RSVUUocC5mb3JJbnB1dCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmZvck91dHB1dCgpKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJnAgOiB7IGJvdXRwMSB9ICkgeworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKChib29sKXApOworICAgICAgICAgICAgRVhQRUNUX1RSVUUoIXApOworCisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5mb3JJbnB1dCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmZvck91dHB1dCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUSgwLCBwLm1OdW1iZXIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gdmFsdWVzCisgICAgICAgIEVYUEVDVF9FUSgxMDAsIGlucDIubU51bWJlcik7CisgICAgICAgIEVYUEVDVF9FUSgxMDAsIG91dHAyLm1OdW1iZXIpOworICAgICAgICBFWFBFQ1RfRVEoMCwgYmlucDEubU51bWJlcik7CisgICAgICAgIEVYUEVDVF9FUSgwLCBiaW5wMi5tTnVtYmVyKTsKKyAgICAgICAgRVhQRUNUX0VRKDAsIGJvdXRwMS5tTnVtYmVyKTsKKyAgICAgICAgRVhQRUNUX0VRKDAsIGJvdXRwMi5tTnVtYmVyKTsKKworICAgICAgICBFWFBFQ1RfVFJVRShpbnAxICE9IG91dHAxKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoaW5wMSA9PSBpbnAyKTsKKyAgICAgICAgRVhQRUNUX1RSVUUob3V0cDEgPT0gb3V0cDIpOworICAgICAgICBFWFBFQ1RfVFJVRShiaW5wMSA9PSBib3V0cDEpOworICAgICAgICBFWFBFQ1RfVFJVRShiaW5wMiAhPSBib3V0cDIpOworCisgICAgICAgIEVYUEVDVF9UUlVFKGlucDEgIT0gYmlucDEpOworICAgICAgICBiaW5wMS5tTnVtYmVyID0gMTAwOworICAgICAgICBFWFBFQ1RfVFJVRShpbnAxICE9IGJpbnAxKTsKKyAgICAgICAgYmlucDEuc2V0UG9ydChmYWxzZSAvKiBvdXRwdXQgKi8pOworICAgICAgICBFWFBFQ1RfVFJVRSgoYm9vbCliaW5wMSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSghYmlucDEpOworICAgICAgICBFWFBFQ1RfVFJVRShpbnAxID09IGJpbnAxKTsKKworICAgICAgICBFWFBFQ1RfVFJVRShpbnAyICE9IGJpbnAyKTsKKyAgICAgICAgYmlucDIubU51bWJlciA9IDEwMDsKKyAgICAgICAgRVhQRUNUX1RSVUUoaW5wMiA9PSBiaW5wMik7CisKKyAgICAgICAgYmlucDEuc2V0UG9ydCh0cnVlIC8qIG91dHB1dCAqLyk7CisgICAgICAgIEVYUEVDVF9UUlVFKG91dHAxID09IGJpbnAxKTsKKworICAgICAgICBFWFBFQ1RfVFJVRShvdXRwMSAhPSBib3V0cDEpOworICAgICAgICBib3V0cDEubU51bWJlciA9IDEwMDsKKyAgICAgICAgRVhQRUNUX1RSVUUob3V0cDEgIT0gYm91dHAxKTsKKyAgICAgICAgYm91dHAxLnNldFBvcnQodHJ1ZSAvKiBvdXRwdXQgKi8pOworICAgICAgICBFWFBFQ1RfVFJVRSgoYm9vbClib3V0cDEpOworICAgICAgICBFWFBFQ1RfRkFMU0UoIWJvdXRwMSk7CisgICAgICAgIEVYUEVDVF9UUlVFKG91dHAxID09IGJvdXRwMSk7CisKKyAgICAgICAgRVhQRUNUX1RSVUUob3V0cDIgIT0gYm91dHAyKTsKKyAgICAgICAgYm91dHAyLm1OdW1iZXIgPSAxMDA7CisgICAgICAgIEVYUEVDVF9UUlVFKG91dHAyID09IGJvdXRwMik7CisKKyAgICAgICAgYm91dHAxLnNldFBvcnQoZmFsc2UgLyogb3V0cHV0ICovKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoaW5wMSA9PSBib3V0cDEpOworCisgICAgICAgIC8vIGluZGV4CisgICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKGlucDEudHlwZSgpKS5jb3JlSW5kZXgoKSwgQzJOdW1iZXJTdHJ1Y3Q6OkNPUkVfSU5ERVgpOworICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZShpbnAxLnR5cGUoKSkudHlwZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVyKTsKKyAgICAgICAgRVhQRUNUX0VRKGlucDEudHlwZSgpLCBDMk51bWJlclBvcnRUdW5pbmc6OmlucHV0OjpQQVJBTV9UWVBFKTsKKyAgICAgICAgRVhQRUNUX0VRKGlucDEuc3RyZWFtKCksIH4wdSk7CisKKyAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUoaW5wMi50eXBlKCkpLmNvcmVJbmRleCgpLCBDMk51bWJlclN0cnVjdDo6Q09SRV9JTkRFWCk7CisgICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKGlucDIudHlwZSgpKS50eXBlSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXIpOworICAgICAgICBFWFBFQ1RfRVEoaW5wMi50eXBlKCksIEMyTnVtYmVyUG9ydFR1bmluZzo6aW5wdXQ6OlBBUkFNX1RZUEUpOworICAgICAgICBFWFBFQ1RfRVEoaW5wMi5zdHJlYW0oKSwgfjB1KTsKKworICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZShvdXRwMS50eXBlKCkpLmNvcmVJbmRleCgpLCBDMk51bWJlclN0cnVjdDo6Q09SRV9JTkRFWCk7CisgICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKG91dHAxLnR5cGUoKSkudHlwZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVyKTsKKyAgICAgICAgRVhQRUNUX0VRKG91dHAxLnR5cGUoKSwgQzJOdW1iZXJQb3J0VHVuaW5nOjpvdXRwdXQ6OlBBUkFNX1RZUEUpOworICAgICAgICBFWFBFQ1RfRVEob3V0cDEuc3RyZWFtKCksIH4wdSk7CisKKyAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUob3V0cDIudHlwZSgpKS5jb3JlSW5kZXgoKSwgQzJOdW1iZXJTdHJ1Y3Q6OkNPUkVfSU5ERVgpOworICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZShvdXRwMi50eXBlKCkpLnR5cGVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcik7CisgICAgICAgIEVYUEVDVF9FUShvdXRwMi50eXBlKCksIEMyTnVtYmVyUG9ydFR1bmluZzo6b3V0cHV0OjpQQVJBTV9UWVBFKTsKKyAgICAgICAgRVhQRUNUX0VRKG91dHAyLnN0cmVhbSgpLCB+MHUpOworCisgICAgICAgIEMyUGFyYW06OkNvcmVJbmRleCBpbmRleCA9IEMyTnVtYmVyUG9ydFR1bmluZzo6aW5wdXQ6OlBBUkFNX1RZUEU7CisgICAgICAgIEVYUEVDVF9GQUxTRShpbmRleC5pc1ZlbmRvcigpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKGluZGV4LmlzRmxleGlibGUoKSk7CisgICAgICAgIEVYUEVDVF9FUShpbmRleC5jb3JlSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXIpOworICAgICAgICBFWFBFQ1RfRVEoaW5kZXgudHlwZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVyKTsKKworICAgICAgICBpbmRleCA9IEMyTnVtYmVyUG9ydFR1bmluZzo6b3V0cHV0OjpQQVJBTV9UWVBFOworICAgICAgICBFWFBFQ1RfRkFMU0UoaW5kZXguaXNWZW5kb3IoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRShpbmRleC5pc0ZsZXhpYmxlKCkpOworICAgICAgICBFWFBFQ1RfRVEoaW5kZXguY29yZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVyKTsKKyAgICAgICAgRVhQRUNUX0VRKGluZGV4LnR5cGVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcik7CisKKyAgICAgICAgQzJQYXJhbTo6VHlwZSB0eXBlID0gQzJOdW1iZXJQb3J0VHVuaW5nOjppbnB1dDo6UEFSQU1fVFlQRTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuaXNWZW5kb3IoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmlzRmxleGlibGUoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmlzR2xvYmFsKCkpOworICAgICAgICBFWFBFQ1RfVFJVRSh0eXBlLmZvcklucHV0KCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5mb3JPdXRwdXQoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmZvclN0cmVhbSgpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUodHlwZS5mb3JQb3J0KCkpOworCisgICAgICAgIHR5cGUgPSBDMk51bWJlclBvcnRUdW5pbmc6Om91dHB1dDo6UEFSQU1fVFlQRTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuaXNWZW5kb3IoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmlzRmxleGlibGUoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmlzR2xvYmFsKCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5mb3JJbnB1dCgpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUodHlwZS5mb3JPdXRwdXQoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmZvclN0cmVhbSgpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUodHlwZS5mb3JQb3J0KCkpOworCisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6OkZyb20obnVsbHB0ciksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJQb3J0VHVuaW5nOjppbnB1dDo6RnJvbShudWxscHRyKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6Om91dHB1dDo6RnJvbShudWxscHRyKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclR1bmluZzo6RnJvbSgmaW5wMSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJUdW5pbmc6OkZyb20oJmlucDIpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyVHVuaW5nOjpGcm9tKCZvdXRwMSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJUdW5pbmc6OkZyb20oJm91dHAyKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6OkZyb20oJmlucDEpLCAmaW5wMSk7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6OkZyb20oJmlucDIpLCAoQzJOdW1iZXJQb3J0VHVuaW5nKikmaW5wMik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6OkZyb20oJm91dHAxKSwgJm91dHAxKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6RnJvbSgmb3V0cDIpLCAoQzJOdW1iZXJQb3J0VHVuaW5nKikmb3V0cDIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJQb3J0VHVuaW5nOjppbnB1dDo6RnJvbSgmaW5wMSksIChDMk51bWJlclBvcnRUdW5pbmc6OmlucHV0KikmaW5wMSk7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6OmlucHV0OjpGcm9tKCZpbnAyKSwgJmlucDIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJQb3J0VHVuaW5nOjppbnB1dDo6RnJvbSgmb3V0cDEpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6aW5wdXQ6OkZyb20oJm91dHAyKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6Om91dHB1dDo6RnJvbSgmaW5wMSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJQb3J0VHVuaW5nOjpvdXRwdXQ6OkZyb20oJmlucDIpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6b3V0cHV0OjpGcm9tKCZvdXRwMSksIChDMk51bWJlclBvcnRUdW5pbmc6Om91dHB1dCopJm91dHAxKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6b3V0cHV0OjpGcm9tKCZvdXRwMiksICZvdXRwMik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclN0cmVhbVR1bmluZzo6RnJvbSgmaW5wMSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJTdHJlYW1UdW5pbmc6OkZyb20oJmlucDIpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpGcm9tKCZvdXRwMSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJTdHJlYW1UdW5pbmc6OkZyb20oJm91dHAyKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclN0cmVhbVR1bmluZzo6aW5wdXQ6OkZyb20oJmlucDEpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjppbnB1dDo6RnJvbSgmaW5wMiksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJTdHJlYW1UdW5pbmc6OmlucHV0OjpGcm9tKCZvdXRwMSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJTdHJlYW1UdW5pbmc6OmlucHV0OjpGcm9tKCZvdXRwMiksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJTdHJlYW1UdW5pbmc6Om91dHB1dDo6RnJvbSgmaW5wMSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJTdHJlYW1UdW5pbmc6Om91dHB1dDo6RnJvbSgmaW5wMiksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJTdHJlYW1UdW5pbmc6Om91dHB1dDo6RnJvbSgmb3V0cDEpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OkZyb20oJm91dHAyKSwgbnVsbHB0cik7CisKKyAgICAgICAgRVhQRUNUX0VRKCooQzJQYXJhbTo6Q29weShpbnAxKSksIGlucDEpOworICAgICAgICBFWFBFQ1RfRVEoKihDMlBhcmFtOjpDb3B5KGlucDIpKSwgaW5wMik7CisgICAgICAgIEVYUEVDVF9FUSgqKEMyUGFyYW06OkNvcHkob3V0cDEpKSwgb3V0cDEpOworICAgICAgICBFWFBFQ1RfRVEoKihDMlBhcmFtOjpDb3B5KG91dHAyKSksIG91dHAyKTsKKyAgICB9CisKKyAgICBjb25zdCBDMk51bWJlclN0cmVhbVR1bmluZyBvdXRzMSh0cnVlLCAxdSwgMTAwKSwgaW5zMShmYWxzZSwgMXUsIDEwMCk7CisgICAgQzJOdW1iZXJTdHJlYW1UdW5pbmcgYm91dHMxLCBiaW5zMSwgYmluczMoZmFsc2UsIDF1LCAxMDApOworICAgIGNvbnN0IEMyTnVtYmVyU3RyZWFtVHVuaW5nOjppbnB1dCBpbnMyKDF1LCAxMDApOworICAgIEMyTnVtYmVyU3RyZWFtVHVuaW5nOjppbnB1dCBiaW5zMjsKKyAgICBjb25zdCBDMk51bWJlclN0cmVhbVR1bmluZzo6b3V0cHV0IG91dHMyKDF1LCAxMDApOworICAgIEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpvdXRwdXQgYm91dHMyOworCisgICAgRVhQRUNUX0VRKGluczEuY29yZUluZGV4KCksIHR1bi5jb3JlSW5kZXgoKSk7CisgICAgRVhQRUNUX0VRKG91dHMxLmNvcmVJbmRleCgpLCB0dW4uY29yZUluZGV4KCkpOworICAgIEVYUEVDVF9FUShiaW5zMS5jb3JlSW5kZXgoKSwgdHVuLmNvcmVJbmRleCgpKTsKKyAgICBFWFBFQ1RfRVEoYm91dHMxLmNvcmVJbmRleCgpLCB0dW4uY29yZUluZGV4KCkpOworICAgIEVYUEVDVF9FUShpbnMyLmNvcmVJbmRleCgpLCB0dW4uY29yZUluZGV4KCkpOworICAgIEVYUEVDVF9FUShvdXRzMi5jb3JlSW5kZXgoKSwgdHVuLmNvcmVJbmRleCgpKTsKKworICAgIEVYUEVDVF9FUShpbnMxLnR5cGUoKSwgaW5zMi50eXBlKCkpOworICAgIEVYUEVDVF9FUShpbnMxLnR5cGUoKSwgYmluczIudHlwZSgpKTsKKyAgICBFWFBFQ1RfRVEob3V0czEudHlwZSgpLCBvdXRzMi50eXBlKCkpOworICAgIEVYUEVDVF9FUShvdXRzMS50eXBlKCksIGJvdXRzMi50eXBlKCkpOworICAgIEVYUEVDVF9ORShpbnMxLnR5cGUoKSwgb3V0czEudHlwZSgpKTsKKyAgICBFWFBFQ1RfTkUoaW5zMi50eXBlKCksIG91dHMyLnR5cGUoKSk7CisgICAgRVhQRUNUX05FKGluczEudHlwZSgpLCBiaW5zMS50eXBlKCkpOworICAgIEVYUEVDVF9ORShvdXRzMS50eXBlKCksIGJvdXRzMS50eXBlKCkpOworICAgIEVYUEVDVF9ORShpbnMxLnR5cGUoKSwgdHVuLnR5cGUoKSk7CisgICAgRVhQRUNUX05FKGluczIudHlwZSgpLCB0dW4udHlwZSgpKTsKKworICAgIHsKKyAgICAgICAgc3RhdGljX2Fzc2VydChjYW5DYWxsU2V0UG9ydChiaW5zMyksICJzaG91bGQgYmUgYWJsZSB0byIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KGNhbkNhbGxTZXRQb3J0KGJpbnMxKSwgInNob3VsZCBiZSBhYmxlIHRvIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIWNhbkNhbGxTZXRQb3J0KGluczEpLCAic2hvdWxkIG5vdCBiZSBhYmxlIHRvIChjb25zdCkiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghY2FuQ2FsbFNldFBvcnQoaW5zMiksICJzaG91bGQgbm90IGJlIGFibGUgdG8gKGNvbnN0ICYgdHlwZSkiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghY2FuQ2FsbFNldFBvcnQoYmluczIpLCAic2hvdWxkIG5vdCBiZSBhYmxlIHRvICh0eXBlKSIpOworCisgICAgICAgIC8vIGZsYWdzICYgaW52YXJpYWJsZXMKKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZwIDogeyBvdXRzMSwgaW5zMSwgYm91dHMxIH0pIHsKKyAgICAgICAgICAgIEVYUEVDVF9FUSgxMnUsIHAuc2l6ZSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmlzVmVuZG9yKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuaXNGbGV4aWJsZSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmlzR2xvYmFsKCkpOworICAgICAgICAgICAgRVhQRUNUX1RSVUUocC5mb3JTdHJlYW0oKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5mb3JQb3J0KCkpOworICAgICAgICB9CisgICAgICAgIGZvciAoY29uc3QgYXV0byAmcCA6IHsgaW5zMiwgYmluczIgfSkgeworICAgICAgICAgICAgRVhQRUNUX0VRKDEydSwgcC5zaXplKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuaXNWZW5kb3IoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5pc0ZsZXhpYmxlKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuaXNHbG9iYWwoKSk7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRShwLmZvclN0cmVhbSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmZvclBvcnQoKSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZwIDogeyBvdXRzMiwgYm91dHMyIH0pIHsKKyAgICAgICAgICAgIEVYUEVDVF9FUSgxMnUsIHAuc2l6ZSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmlzVmVuZG9yKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuaXNGbGV4aWJsZSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmlzR2xvYmFsKCkpOworICAgICAgICAgICAgRVhQRUNUX1RSVUUocC5mb3JTdHJlYW0oKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5mb3JQb3J0KCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gcG9ydCBzcGVjaWZpYyBmbGFncyAmIGludmFyaWFibGVzCisgICAgICAgIEVYUEVDVF9GQUxTRShvdXRzMS5mb3JJbnB1dCgpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUob3V0czEuZm9yT3V0cHV0KCkpOworCisgICAgICAgIEVYUEVDVF9UUlVFKGluczEuZm9ySW5wdXQoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRShpbnMxLmZvck91dHB1dCgpKTsKKworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJnAgOiB7IG91dHMxLCBpbnMxIH0pIHsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKChib29sKXApOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKCFwKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUSgxMDAsIHAubU51bWJlcik7CisgICAgICAgICAgICBFWFBFQ1RfRVEoMXUsIHAuc3RyZWFtKCkpOworICAgICAgICB9CisgICAgICAgIGZvciAoY29uc3QgYXV0byAmcCA6IHsgb3V0czIsIGJvdXRzMiB9KSB7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRSgoYm9vbClwKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRSghcCk7CisKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmZvcklucHV0KCkpOworICAgICAgICAgICAgRVhQRUNUX1RSVUUocC5mb3JPdXRwdXQoKSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZwIDogeyBpbnMyLCBiaW5zMiB9KSB7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRSgoYm9vbClwKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRSghcCk7CisKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHAuZm9ySW5wdXQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5mb3JPdXRwdXQoKSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZwIDogeyBib3V0czEgfSApIHsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRSgoYm9vbClwKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKCFwKTsKKworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuZm9ySW5wdXQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5mb3JPdXRwdXQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRVEoMCwgcC5tTnVtYmVyKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHZhbHVlcworICAgICAgICBFWFBFQ1RfRVEoMTAwLCBpbnMyLm1OdW1iZXIpOworICAgICAgICBFWFBFQ1RfRVEoMTAwLCBvdXRzMi5tTnVtYmVyKTsKKyAgICAgICAgRVhQRUNUX0VRKDAsIGJpbnMxLm1OdW1iZXIpOworICAgICAgICBFWFBFQ1RfRVEoMCwgYmluczIubU51bWJlcik7CisgICAgICAgIEVYUEVDVF9FUSgwLCBib3V0czEubU51bWJlcik7CisgICAgICAgIEVYUEVDVF9FUSgwLCBib3V0czIubU51bWJlcik7CisKKyAgICAgICAgRVhQRUNUX0VRKDF1LCBpbnMyLnN0cmVhbSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKDF1LCBvdXRzMi5zdHJlYW0oKSk7CisgICAgICAgIEVYUEVDVF9FUSgwdSwgYmluczEuc3RyZWFtKCkpOworICAgICAgICBFWFBFQ1RfRVEoMHUsIGJpbnMyLnN0cmVhbSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKDB1LCBib3V0czEuc3RyZWFtKCkpOworICAgICAgICBFWFBFQ1RfRVEoMHUsIGJvdXRzMi5zdHJlYW0oKSk7CisKKyAgICAgICAgRVhQRUNUX1RSVUUoaW5zMSAhPSBvdXRzMSk7CisgICAgICAgIEVYUEVDVF9UUlVFKGluczEgPT0gaW5zMik7CisgICAgICAgIEVYUEVDVF9UUlVFKG91dHMxID09IG91dHMyKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoYmluczEgPT0gYm91dHMxKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoYmluczIgIT0gYm91dHMyKTsKKworICAgICAgICBFWFBFQ1RfVFJVRShpbnMxICE9IGJpbnMxKTsKKyAgICAgICAgYmluczEubU51bWJlciA9IDEwMDsKKyAgICAgICAgRVhQRUNUX1RSVUUoaW5zMSAhPSBiaW5zMSk7CisgICAgICAgIGJpbnMxLnNldFBvcnQoZmFsc2UgLyogb3V0cHV0ICovKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoaW5zMSAhPSBiaW5zMSk7CisgICAgICAgIGJpbnMxLnNldFN0cmVhbSgxdSk7CisgICAgICAgIEVYUEVDVF9UUlVFKGluczEgPT0gYmluczEpOworCisgICAgICAgIEVYUEVDVF9UUlVFKGluczIgIT0gYmluczIpOworICAgICAgICBiaW5zMi5tTnVtYmVyID0gMTAwOworICAgICAgICBFWFBFQ1RfVFJVRShpbnMyICE9IGJpbnMyKTsKKyAgICAgICAgYmluczIuc2V0U3RyZWFtKDF1KTsKKyAgICAgICAgRVhQRUNUX1RSVUUoaW5zMiA9PSBiaW5zMik7CisKKyAgICAgICAgYmluczEuc2V0UG9ydCh0cnVlIC8qIG91dHB1dCAqLyk7CisgICAgICAgIEVYUEVDVF9UUlVFKG91dHMxID09IGJpbnMxKTsKKworICAgICAgICBFWFBFQ1RfVFJVRShvdXRzMSAhPSBib3V0czEpOworICAgICAgICBib3V0czEubU51bWJlciA9IDEwMDsKKyAgICAgICAgRVhQRUNUX1RSVUUob3V0czEgIT0gYm91dHMxKTsKKyAgICAgICAgYm91dHMxLnNldFBvcnQodHJ1ZSAvKiBvdXRwdXQgKi8pOworICAgICAgICBFWFBFQ1RfVFJVRShvdXRzMSAhPSBib3V0czEpOworICAgICAgICBib3V0czEuc2V0U3RyZWFtKDF1KTsKKyAgICAgICAgRVhQRUNUX1RSVUUob3V0czEgPT0gYm91dHMxKTsKKworICAgICAgICBFWFBFQ1RfVFJVRShvdXRzMiAhPSBib3V0czIpOworICAgICAgICBib3V0czIubU51bWJlciA9IDEwMDsKKyAgICAgICAgRVhQRUNUX1RSVUUob3V0czIgIT0gYm91dHMyKTsKKyAgICAgICAgYm91dHMyLnNldFN0cmVhbSgxdSk7CisgICAgICAgIEVYUEVDVF9UUlVFKG91dHMyID09IGJvdXRzMik7CisKKyAgICAgICAgYm91dHMxLnNldFBvcnQoZmFsc2UgLyogb3V0cHV0ICovKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoaW5zMSA9PSBib3V0czEpOworCisgICAgICAgIC8vIGluZGV4CisgICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKGluczEudHlwZSgpKS5jb3JlSW5kZXgoKSwgQzJOdW1iZXJTdHJ1Y3Q6OkNPUkVfSU5ERVgpOworICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZShpbnMxLnR5cGUoKSkudHlwZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVyKTsKKyAgICAgICAgRVhQRUNUX0VRKGluczEudHlwZSgpLCBDMk51bWJlclN0cmVhbVR1bmluZzo6aW5wdXQ6OlBBUkFNX1RZUEUpOworCisgICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKGluczIudHlwZSgpKS5jb3JlSW5kZXgoKSwgQzJOdW1iZXJTdHJ1Y3Q6OkNPUkVfSU5ERVgpOworICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZShpbnMyLnR5cGUoKSkudHlwZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVyKTsKKyAgICAgICAgRVhQRUNUX0VRKGluczIudHlwZSgpLCBDMk51bWJlclN0cmVhbVR1bmluZzo6aW5wdXQ6OlBBUkFNX1RZUEUpOworCisgICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKG91dHMxLnR5cGUoKSkuY29yZUluZGV4KCksIEMyTnVtYmVyU3RydWN0OjpDT1JFX0lOREVYKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUob3V0czEudHlwZSgpKS50eXBlSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXIpOworICAgICAgICBFWFBFQ1RfRVEob3V0czEudHlwZSgpLCBDMk51bWJlclN0cmVhbVR1bmluZzo6b3V0cHV0OjpQQVJBTV9UWVBFKTsKKworICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZShvdXRzMi50eXBlKCkpLmNvcmVJbmRleCgpLCBDMk51bWJlclN0cnVjdDo6Q09SRV9JTkRFWCk7CisgICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKG91dHMyLnR5cGUoKSkudHlwZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVyKTsKKyAgICAgICAgRVhQRUNUX0VRKG91dHMyLnR5cGUoKSwgQzJOdW1iZXJTdHJlYW1UdW5pbmc6Om91dHB1dDo6UEFSQU1fVFlQRSk7CisKKyAgICAgICAgQzJQYXJhbTo6Q29yZUluZGV4IGluZGV4ID0gQzJOdW1iZXJTdHJlYW1UdW5pbmc6OmlucHV0OjpQQVJBTV9UWVBFOworICAgICAgICBFWFBFQ1RfRkFMU0UoaW5kZXguaXNWZW5kb3IoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRShpbmRleC5pc0ZsZXhpYmxlKCkpOworICAgICAgICBFWFBFQ1RfRVEoaW5kZXguY29yZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVyKTsKKyAgICAgICAgRVhQRUNUX0VRKGluZGV4LnR5cGVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcik7CisKKyAgICAgICAgaW5kZXggPSBDMk51bWJlclN0cmVhbVR1bmluZzo6b3V0cHV0OjpQQVJBTV9UWVBFOworICAgICAgICBFWFBFQ1RfRkFMU0UoaW5kZXguaXNWZW5kb3IoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRShpbmRleC5pc0ZsZXhpYmxlKCkpOworICAgICAgICBFWFBFQ1RfRVEoaW5kZXguY29yZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVyKTsKKyAgICAgICAgRVhQRUNUX0VRKGluZGV4LnR5cGVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcik7CisKKyAgICAgICAgQzJQYXJhbTo6VHlwZSB0eXBlID0gQzJOdW1iZXJTdHJlYW1UdW5pbmc6OmlucHV0OjpQQVJBTV9UWVBFOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5pc1ZlbmRvcigpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuaXNGbGV4aWJsZSgpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuaXNHbG9iYWwoKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKHR5cGUuZm9ySW5wdXQoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmZvck91dHB1dCgpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUodHlwZS5mb3JTdHJlYW0oKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmZvclBvcnQoKSk7CisKKyAgICAgICAgdHlwZSA9IEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OlBBUkFNX1RZUEU7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmlzVmVuZG9yKCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5pc0ZsZXhpYmxlKCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5pc0dsb2JhbCgpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuZm9ySW5wdXQoKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKHR5cGUuZm9yT3V0cHV0KCkpOworICAgICAgICBFWFBFQ1RfVFJVRSh0eXBlLmZvclN0cmVhbSgpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuZm9yUG9ydCgpKTsKKworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJQb3J0VHVuaW5nOjpGcm9tKG51bGxwdHIpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6aW5wdXQ6OkZyb20obnVsbHB0ciksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJQb3J0VHVuaW5nOjpvdXRwdXQ6OkZyb20obnVsbHB0ciksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJUdW5pbmc6OkZyb20oJmluczEpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyVHVuaW5nOjpGcm9tKCZpbnMyKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclR1bmluZzo6RnJvbSgmb3V0czEpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyVHVuaW5nOjpGcm9tKCZvdXRzMiksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJQb3J0VHVuaW5nOjpGcm9tKCZpbnMxKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6OkZyb20oJmluczIpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6RnJvbSgmb3V0czEpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6RnJvbSgmb3V0czIpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6aW5wdXQ6OkZyb20oJmluczEpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6aW5wdXQ6OkZyb20oJmluczIpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6aW5wdXQ6OkZyb20oJm91dHMxKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6OmlucHV0OjpGcm9tKCZvdXRzMiksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJQb3J0VHVuaW5nOjpvdXRwdXQ6OkZyb20oJmluczEpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6b3V0cHV0OjpGcm9tKCZpbnMyKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6Om91dHB1dDo6RnJvbSgmb3V0czEpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6b3V0cHV0OjpGcm9tKCZvdXRzMiksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJTdHJlYW1UdW5pbmc6OkZyb20oJmluczEpLCAmaW5zMSk7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclN0cmVhbVR1bmluZzo6RnJvbSgmaW5zMiksIChDMk51bWJlclN0cmVhbVR1bmluZyopJmluczIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJTdHJlYW1UdW5pbmc6OkZyb20oJm91dHMxKSwgJm91dHMxKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpGcm9tKCZvdXRzMiksIChDMk51bWJlclN0cmVhbVR1bmluZyopJm91dHMyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjppbnB1dDo6RnJvbSgmaW5zMSksIChDMk51bWJlclN0cmVhbVR1bmluZzo6aW5wdXQqKSZpbnMxKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjppbnB1dDo6RnJvbSgmaW5zMiksICZpbnMyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjppbnB1dDo6RnJvbSgmb3V0czEpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjppbnB1dDo6RnJvbSgmb3V0czIpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OkZyb20oJmluczEpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OkZyb20oJmluczIpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OkZyb20oJm91dHMxKSwgKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpvdXRwdXQqKSZvdXRzMSk7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclN0cmVhbVR1bmluZzo6b3V0cHV0OjpGcm9tKCZvdXRzMiksICZvdXRzMik7CisKKyAgICAgICAgRVhQRUNUX0VRKCooQzJQYXJhbTo6Q29weShpbnMxKSksIGluczEpOworICAgICAgICBFWFBFQ1RfRVEoKihDMlBhcmFtOjpDb3B5KGluczIpKSwgaW5zMik7CisgICAgICAgIEVYUEVDVF9FUSgqKEMyUGFyYW06OkNvcHkob3V0czEpKSwgb3V0czEpOworICAgICAgICBFWFBFQ1RfRVEoKihDMlBhcmFtOjpDb3B5KG91dHMyKSksIG91dHMyKTsKKyAgICB9CisKKyAgICB7CisgICAgICAgIHVpbnQzMl90IHZpZGVvV2lkdGhbXSA9IHsgMTJ1LCBDMk51bWJlclN0cmVhbVR1bmluZzo6b3V0cHV0OjpQQVJBTV9UWVBFLCAxMDAgfTsKKyAgICAgICAgQzJQYXJhbSAqcDEgPSBDMlBhcmFtOjpGcm9tKHZpZGVvV2lkdGgsIHNpemVvZih2aWRlb1dpZHRoKSk7CisgICAgICAgIEVYUEVDVF9ORShwMSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUSgxMnUsIHAxLT5zaXplKCkpOworICAgICAgICBFWFBFQ1RfRVEocDEtPnR5cGUoKSwgQzJOdW1iZXJTdHJlYW1UdW5pbmc6Om91dHB1dDo6UEFSQU1fVFlQRSk7CisKKyAgICAgICAgcDEgPSBDMlBhcmFtOjpGcm9tKHZpZGVvV2lkdGgsIHNpemVvZih2aWRlb1dpZHRoKSArIDIpOworICAgICAgICBFWFBFQ1RfRVEocDEsIG51bGxwdHIpOworCisgICAgICAgIHAxID0gQzJQYXJhbTo6RnJvbSh2aWRlb1dpZHRoLCBzaXplb2YodmlkZW9XaWR0aCkgLSAyKTsKKyAgICAgICAgRVhQRUNUX0VRKHAxLCBudWxscHRyKTsKKworICAgICAgICBwMSA9IEMyUGFyYW06OkZyb20odmlkZW9XaWR0aCwgMyk7CisgICAgICAgIEVYUEVDVF9FUShwMSwgbnVsbHB0cik7CisKKyAgICAgICAgcDEgPSBDMlBhcmFtOjpGcm9tKHZpZGVvV2lkdGgsIDApOworICAgICAgICBFWFBFQ1RfRVEocDEsIG51bGxwdHIpOworICAgIH0KK30KKwordm9pZCBTdGF0aWNUZXN0QWRkQ29yZUluZGV4KCkgeworICAgIHN0cnVjdCBub2Jhc2Uge307CisgICAgc3RydWN0IGJhc2UgeyBlbnVtIDogdWludDMyX3QgeyBDT1JFX0lOREVYID0gMSB9OyB9OworICAgIHN0YXRpY19hc3NlcnQoX0MyQWRkQ29yZUluZGV4PG5vYmFzZSwgMj46OkNPUkVfSU5ERVggPT0gMiwgInNob3VsZCBiZSAyIik7CisgICAgc3RhdGljX2Fzc2VydChfQzJBZGRDb3JlSW5kZXg8YmFzZSwgMT46OkNPUkVfSU5ERVggPT0gMSwgInNob3VsZCBiZSAxIik7Cit9CisKK2NsYXNzIFRlc3RGbGV4SGVscGVyIHsKKyAgICBzdHJ1Y3QgX0ZsZXggeworICAgICAgICBpbnQzMl90IGE7CisgICAgICAgIGNoYXIgYltdOworICAgICAgICBfRmxleCgpIHt9CisgICAgICAgIEZMRVgoX0ZsZXgsIGIpOworICAgIH07CisKKyAgICBzdHJ1Y3QgX0JvRmxleCB7CisgICAgICAgIF9GbGV4IGE7CisgICAgICAgIF9Cb0ZsZXgoKSB7fQorICAgICAgICBGTEVYKF9Cb0ZsZXgsIGEpOworICAgIH07CisKKyAgICBzdHJ1Y3QgX05vbkZsZXggeworICAgIH07CisKKworICAgIHN0YXRpYyB2b2lkIFN0YXRpY1Rlc3QoKSB7CisgICAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPF9DMkZsZXhIZWxwZXI8Y2hhcj46OkZsZXhUeXBlLCB2b2lkPjo6dmFsdWUsICJzaG91bGQgYmUgdm9pZCIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxfQzJGbGV4SGVscGVyPGNoYXJbXT46OkZsZXhUeXBlLCBjaGFyPjo6dmFsdWUsICJzaG91bGQgYmUgY2hhciIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxfQzJGbGV4SGVscGVyPF9GbGV4Pjo6RmxleFR5cGUsIGNoYXI+Ojp2YWx1ZSwgInNob3VsZCBiZSBjaGFyIik7CisKKyAgICAgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8X0MyRmxleEhlbHBlcjxfQm9GbGV4Pjo6RmxleFR5cGUsIGNoYXI+Ojp2YWx1ZSwgInNob3VsZCBiZSB2b2lkIik7CisKKyAgICAgICAgc3RhdGljX2Fzc2VydChfQzJGbGV4aWJsZTxfRmxleD46OnZhbHVlLCAic2hvdWxkIGJlIGZsZXhpYmxlIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIV9DMkZsZXhpYmxlPF9Ob25GbGV4Pjo6dmFsdWUsICJzaG91bGQgbm90IGJlIGZsZXhpYmxlIik7CisgICAgfQorfTsKKworVEVTVF9GKEMyUGFyYW1UZXN0LCBGbGV4UGFyYW1PcHNUZXN0KSB7CisvLyAgICBjb25zdCBDMk51bWJlcnNTdHJ1Y3Qgc3RyezEwMH07CisgICAgQzJOdW1iZXJzU3RydWN0IGJzdHI7CisgICAgeworLy8gICAgICAgIEVYUEVDVF9FUSgxMDAsIHN0ci0+bS5tTnVtYmVyc1swXSk7CisgICAgICAgICh2b2lkKSZic3RyLm1OdW1iZXJzWzBdOworCisgICAgICAgIEMyUGFyYW06OkNvcmVJbmRleCBpbmRleCA9IEMyTnVtYmVyc1N0cnVjdDo6Q09SRV9JTkRFWDsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKGluZGV4LmlzVmVuZG9yKCkpOworICAgICAgICBFWFBFQ1RfVFJVRShpbmRleC5pc0ZsZXhpYmxlKCkpOworICAgICAgICBFWFBFQ1RfRVEoaW5kZXguY29yZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVycyB8IEMyUGFyYW06OkNvcmVJbmRleDo6SVNfRkxFWF9GTEFHKTsKKyAgICAgICAgRVhQRUNUX0VRKGluZGV4LnR5cGVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcnMpOworICAgIH0KKworICAgIHN0ZDo6dW5pcXVlX3B0cjxDMk51bWJlcnNUdW5pbmc+IHR1bl8gPSBDMk51bWJlcnNUdW5pbmc6OkFsbG9jVW5pcXVlKDEpOworICAgIHR1bl8tPm0ubU51bWJlcnNbMF0gPSAxMDA7CisgICAgc3RkOjp1bmlxdWVfcHRyPGNvbnN0IEMyTnVtYmVyc1R1bmluZz4gdHVuID0gc3RkOjptb3ZlKHR1bl8pOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMk51bWJlcnNUdW5pbmc+IGJ0dW4gPSBDMk51bWJlcnNUdW5pbmc6OkFsbG9jU2hhcmVkKDEpOworCisgICAgeworICAgICAgICAvLyBmbGFncyAmIGludmFyaWFibGVzCisgICAgICAgIGNvbnN0IEMyTnVtYmVyc1R1bmluZyAqVFtdID0geyB0dW4uZ2V0KCksIGJ0dW4uZ2V0KCkgfTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvIHAgOiBUKSB7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRSgoYm9vbCkoKnApKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRSghKCpwKSk7CisgICAgICAgICAgICBFWFBFQ1RfRVEoMTJ1LCBwLT5zaXplKCkpOworCisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+aXNWZW5kb3IoKSk7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRShwLT5pc0ZsZXhpYmxlKCkpOworICAgICAgICAgICAgRVhQRUNUX1RSVUUocC0+aXNHbG9iYWwoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+Zm9ySW5wdXQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+Zm9yT3V0cHV0KCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAtPmZvclN0cmVhbSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLT5mb3JQb3J0KCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gdmFsdWUKKyAgICAgICAgRVhQRUNUX0VRKDEwMCwgdHVuLT5tLm1OdW1iZXJzWzBdKTsKKyAgICAgICAgRVhQRUNUX0VRKDAsIGJ0dW4tPm0ubU51bWJlcnNbMF0pOworICAgICAgICBFWFBFQ1RfRkFMU0UoKnR1biA9PSAqYnR1bik7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0dW4tPm9wZXJhdG9yPT0oKmJ0dW4pKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoKnR1biAhPSAqYnR1bik7CisgICAgICAgIEVYUEVDVF9UUlVFKHR1bi0+b3BlcmF0b3IhPSgqYnR1bikpOworICAgICAgICBidHVuLT5tLm1OdW1iZXJzWzBdID0gMTAwOworICAgICAgICBFWFBFQ1RfRVEoKnR1biwgKmJ0dW4pOworCisgICAgICAgIC8vIGluZGV4CisgICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKHR1bi0+dHlwZSgpKS5jb3JlSW5kZXgoKSwgQzJOdW1iZXJzU3RydWN0OjpDT1JFX0lOREVYKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUodHVuLT50eXBlKCkpLnR5cGVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcnMpOworICAgICAgICBFWFBFQ1RfRVEodHVuLT50eXBlKCksIEMyTnVtYmVyc1R1bmluZzo6UEFSQU1fVFlQRSk7CisgICAgICAgIEVYUEVDVF9FUSh0dW4tPnN0cmVhbSgpLCB+MHUpOworCisgICAgICAgIEMyUGFyYW06OkNvcmVJbmRleCBpbmRleCA9IEMyTnVtYmVyc1R1bmluZzo6Q09SRV9JTkRFWDsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKGluZGV4LmlzVmVuZG9yKCkpOworICAgICAgICBFWFBFQ1RfVFJVRShpbmRleC5pc0ZsZXhpYmxlKCkpOworICAgICAgICBFWFBFQ1RfRVEoaW5kZXguY29yZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVycyB8IEMyUGFyYW06OkNvcmVJbmRleDo6SVNfRkxFWF9GTEFHKTsKKyAgICAgICAgRVhQRUNUX0VRKGluZGV4LnR5cGVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcnMpOworCisgICAgICAgIEMyUGFyYW06OlR5cGUgdHlwZSA9IEMyTnVtYmVyc1R1bmluZzo6UEFSQU1fVFlQRTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuaXNWZW5kb3IoKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKHR5cGUuaXNGbGV4aWJsZSgpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUodHlwZS5pc0dsb2JhbCgpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuZm9ySW5wdXQoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmZvck91dHB1dCgpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuZm9yU3RyZWFtKCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5mb3JQb3J0KCkpOworCisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNUdW5pbmc6OkZyb20obnVsbHB0ciksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzVHVuaW5nOjpGcm9tKHR1bi5nZXQoKSksIHR1bi5nZXQoKSk7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNQb3J0VHVuaW5nOjpGcm9tKHR1bi5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQ6OkZyb20odHVuLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNQb3J0VHVuaW5nOjpvdXRwdXQ6OkZyb20odHVuLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNTdHJlYW1UdW5pbmc6OkZyb20odHVuLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNTdHJlYW1UdW5pbmc6OmlucHV0OjpGcm9tKHR1bi5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OkZyb20odHVuLmdldCgpKSwgbnVsbHB0cik7CisKKyAgICAgICAgRVhQRUNUX0VRKCooQzJQYXJhbTo6Q29weSgqdHVuKSksICp0dW4pOworICAgIH0KKworICAgIHN0ZDo6dW5pcXVlX3B0cjxDMk51bWJlcnNQb3J0VHVuaW5nPiBvdXRwMV8oQzJOdW1iZXJzUG9ydFR1bmluZzo6QWxsb2NVbmlxdWUoMSwgdHJ1ZSkpLAorICAgICAgICAgICAgaW5wMV8gPSBDMk51bWJlcnNQb3J0VHVuaW5nOjpBbGxvY1VuaXF1ZSgxLCBmYWxzZSk7CisgICAgb3V0cDFfLT5tLm1OdW1iZXJzWzBdID0gMTAwOworICAgIGlucDFfLT5tLm1OdW1iZXJzWzBdID0gMTAwOworICAgIHN0ZDo6dW5pcXVlX3B0cjxjb25zdCBDMk51bWJlcnNQb3J0VHVuaW5nPiBvdXRwMSA9IHN0ZDo6bW92ZShvdXRwMV8pOworICAgIHN0ZDo6dW5pcXVlX3B0cjxjb25zdCBDMk51bWJlcnNQb3J0VHVuaW5nPiBpbnAxID0gc3RkOjptb3ZlKGlucDFfKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJOdW1iZXJzUG9ydFR1bmluZz4gYm91dHAxKEMyTnVtYmVyc1BvcnRUdW5pbmc6OkFsbG9jU2hhcmVkKDEpKSwKKyAgICAgICAgICAgIGJpbnAxID0gQzJOdW1iZXJzUG9ydFR1bmluZzo6QWxsb2NTaGFyZWQoMSksCisgICAgICAgICAgICBiaW5wMyA9IEMyTnVtYmVyc1BvcnRUdW5pbmc6OkFsbG9jU2hhcmVkKDEsIGZhbHNlKTsKKyAgICBiaW5wMy0+bS5tTnVtYmVyc1swXSA9IDEwMDsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQ+IGlucDJfKEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0OjpBbGxvY1VuaXF1ZSgxKSk7CisgICAgaW5wMl8tPm0ubU51bWJlcnNbMF0gPSAxMDA7CisgICAgc3RkOjp1bmlxdWVfcHRyPGNvbnN0IEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0PiBpbnAyID0gc3RkOjptb3ZlKGlucDJfKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQ+IGJpbnAyKEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0OjpBbGxvY1NoYXJlZCgxKSk7CisgICAgc3RkOjp1bmlxdWVfcHRyPEMyTnVtYmVyc1BvcnRUdW5pbmc6Om91dHB1dD4gb3V0cDJfKEMyTnVtYmVyc1BvcnRUdW5pbmc6Om91dHB1dDo6QWxsb2NVbmlxdWUoMSkpOworICAgIG91dHAyXy0+bS5tTnVtYmVyc1swXSA9IDEwMDsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Y29uc3QgQzJOdW1iZXJzUG9ydFR1bmluZzo6b3V0cHV0PiBvdXRwMiA9IHN0ZDo6bW92ZShvdXRwMl8pOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMk51bWJlcnNQb3J0VHVuaW5nOjpvdXRwdXQ+IGJvdXRwMihDMk51bWJlcnNQb3J0VHVuaW5nOjpvdXRwdXQ6OkFsbG9jU2hhcmVkKDEpKTsKKworICAgIHsKKyAgICAgICAgc3RhdGljX2Fzc2VydChjYW5DYWxsU2V0UG9ydCgqYmlucDMpLCAic2hvdWxkIGJlIGFibGUgdG8iKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChjYW5DYWxsU2V0UG9ydCgqYmlucDEpLCAic2hvdWxkIGJlIGFibGUgdG8iKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghY2FuQ2FsbFNldFBvcnQoKmlucDEpLCAic2hvdWxkIG5vdCBiZSBhYmxlIHRvIChjb25zdCkiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghY2FuQ2FsbFNldFBvcnQoKmlucDIpLCAic2hvdWxkIG5vdCBiZSBhYmxlIHRvIChjb25zdCAmIHR5cGUpIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIWNhbkNhbGxTZXRQb3J0KCpiaW5wMiksICJzaG91bGQgbm90IGJlIGFibGUgdG8gKHR5cGUpIik7CisKKyAgICAgICAgLy8gZmxhZ3MgJiBpbnZhcmlhYmxlcworICAgICAgICBjb25zdCBDMk51bWJlcnNQb3J0VHVuaW5nICpQW10gPSB7IG91dHAxLmdldCgpLCBpbnAxLmdldCgpLCBib3V0cDEuZ2V0KCkgfTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvIHAgOiBQKSB7CisgICAgICAgICAgICBFWFBFQ1RfRVEoMTJ1LCBwLT5zaXplKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAtPmlzVmVuZG9yKCkpOworICAgICAgICAgICAgRVhQRUNUX1RSVUUocC0+aXNGbGV4aWJsZSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLT5pc0dsb2JhbCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLT5mb3JTdHJlYW0oKSk7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRShwLT5mb3JQb3J0KCkpOworICAgICAgICB9CisgICAgICAgIGNvbnN0IEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0ICpQSVtdID0geyBpbnAyLmdldCgpLCBiaW5wMi5nZXQoKSB9OworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gcCA6IFBJKSB7CisgICAgICAgICAgICBFWFBFQ1RfRVEoMTJ1LCBwLT5zaXplKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAtPmlzVmVuZG9yKCkpOworICAgICAgICAgICAgRVhQRUNUX1RSVUUocC0+aXNGbGV4aWJsZSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLT5pc0dsb2JhbCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLT5mb3JTdHJlYW0oKSk7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRShwLT5mb3JQb3J0KCkpOworICAgICAgICB9CisgICAgICAgIGNvbnN0IEMyTnVtYmVyc1BvcnRUdW5pbmc6Om91dHB1dCAqUE9bXSA9IHsgb3V0cDIuZ2V0KCksIGJvdXRwMi5nZXQoKSB9OworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gcCA6IFBPKSB7CisgICAgICAgICAgICBFWFBFQ1RfRVEoMTJ1LCBwLT5zaXplKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAtPmlzVmVuZG9yKCkpOworICAgICAgICAgICAgRVhQRUNUX1RSVUUocC0+aXNGbGV4aWJsZSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLT5pc0dsb2JhbCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLT5mb3JTdHJlYW0oKSk7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRShwLT5mb3JQb3J0KCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gcG9ydCBzcGVjaWZpYyBmbGFncyAmIGludmFyaWFibGVzCisgICAgICAgIEVYUEVDVF9GQUxTRShvdXRwMS0+Zm9ySW5wdXQoKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKG91dHAxLT5mb3JPdXRwdXQoKSk7CisKKyAgICAgICAgRVhQRUNUX1RSVUUoaW5wMS0+Zm9ySW5wdXQoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRShpbnAxLT5mb3JPdXRwdXQoKSk7CisKKyAgICAgICAgY29uc3QgQzJOdW1iZXJzUG9ydFR1bmluZyAqUDJbXSA9IHsgb3V0cDEuZ2V0KCksIGlucDEuZ2V0KCkgfTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvIHAgOiBQMikgeworICAgICAgICAgICAgRVhQRUNUX1RSVUUoKGJvb2wpKCpwKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UoISgqcCkpOworICAgICAgICAgICAgRVhQRUNUX0VRKDEwMCwgcC0+bS5tTnVtYmVyc1swXSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChjb25zdCBhdXRvIHAgOiBQTykgeworICAgICAgICAgICAgRVhQRUNUX1RSVUUoKGJvb2wpKCpwKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UoISgqcCkpOworCisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+Zm9ySW5wdXQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRShwLT5mb3JPdXRwdXQoKSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChjb25zdCBhdXRvIHAgOiBQSSkgeworICAgICAgICAgICAgRVhQRUNUX1RSVUUoKGJvb2wpKCpwKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UoISgqcCkpOworCisgICAgICAgICAgICBFWFBFQ1RfVFJVRShwLT5mb3JJbnB1dCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLT5mb3JPdXRwdXQoKSk7CisgICAgICAgIH0KKyAgICAgICAgY29uc3QgQzJOdW1iZXJzUG9ydFR1bmluZyAqUDNbXSA9IHsgYm91dHAxLmdldCgpIH07CisgICAgICAgIGZvciAoY29uc3QgYXV0byBwIDogUDMpIHsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRSgoYm9vbCkoKnApKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKCEoKnApKTsKKworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAtPmZvcklucHV0KCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAtPmZvck91dHB1dCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUSgwLCBwLT5tLm1OdW1iZXJzWzBdKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHZhbHVlcworICAgICAgICBFWFBFQ1RfRVEoMTAwLCBpbnAyLT5tLm1OdW1iZXJzWzBdKTsKKyAgICAgICAgRVhQRUNUX0VRKDEwMCwgb3V0cDItPm0ubU51bWJlcnNbMF0pOworICAgICAgICBFWFBFQ1RfRVEoMCwgYmlucDEtPm0ubU51bWJlcnNbMF0pOworICAgICAgICBFWFBFQ1RfRVEoMCwgYmlucDItPm0ubU51bWJlcnNbMF0pOworICAgICAgICBFWFBFQ1RfRVEoMCwgYm91dHAxLT5tLm1OdW1iZXJzWzBdKTsKKyAgICAgICAgRVhQRUNUX0VRKDAsIGJvdXRwMi0+bS5tTnVtYmVyc1swXSk7CisKKyAgICAgICAgRVhQRUNUX1RSVUUoKmlucDEgIT0gKm91dHAxKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoKmlucDEgPT0gKmlucDIpOworICAgICAgICBFWFBFQ1RfVFJVRSgqb3V0cDEgPT0gKm91dHAyKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoKmJpbnAxID09ICpib3V0cDEpOworICAgICAgICBFWFBFQ1RfVFJVRSgqYmlucDIgIT0gKmJvdXRwMik7CisKKyAgICAgICAgRVhQRUNUX1RSVUUoKmlucDEgIT0gKmJpbnAxKTsKKyAgICAgICAgYmlucDEtPm0ubU51bWJlcnNbMF0gPSAxMDA7CisgICAgICAgIEVYUEVDVF9UUlVFKCppbnAxICE9ICpiaW5wMSk7CisgICAgICAgIGJpbnAxLT5zZXRQb3J0KGZhbHNlIC8qIG91dHB1dCAqLyk7CisgICAgICAgIEVYUEVDVF9UUlVFKChib29sKSpiaW5wMSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSghKmJpbnAxKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoKmlucDEgPT0gKmJpbnAxKTsKKworICAgICAgICBFWFBFQ1RfVFJVRSgqaW5wMiAhPSAqYmlucDIpOworICAgICAgICBiaW5wMi0+bS5tTnVtYmVyc1swXSA9IDEwMDsKKyAgICAgICAgRVhQRUNUX1RSVUUoKmlucDIgPT0gKmJpbnAyKTsKKworICAgICAgICBiaW5wMS0+c2V0UG9ydCh0cnVlIC8qIG91dHB1dCAqLyk7CisgICAgICAgIEVYUEVDVF9UUlVFKCpvdXRwMSA9PSAqYmlucDEpOworCisgICAgICAgIEVYUEVDVF9UUlVFKCpvdXRwMSAhPSAqYm91dHAxKTsKKyAgICAgICAgYm91dHAxLT5tLm1OdW1iZXJzWzBdID0gMTAwOworICAgICAgICBFWFBFQ1RfVFJVRSgqb3V0cDEgIT0gKmJvdXRwMSk7CisgICAgICAgIGJvdXRwMS0+c2V0UG9ydCh0cnVlIC8qIG91dHB1dCAqLyk7CisgICAgICAgIEVYUEVDVF9UUlVFKChib29sKSpib3V0cDEpOworICAgICAgICBFWFBFQ1RfRkFMU0UoISpib3V0cDEpOworICAgICAgICBFWFBFQ1RfVFJVRSgqb3V0cDEgPT0gKmJvdXRwMSk7CisKKyAgICAgICAgRVhQRUNUX1RSVUUoKm91dHAyICE9ICpib3V0cDIpOworICAgICAgICBib3V0cDItPm0ubU51bWJlcnNbMF0gPSAxMDA7CisgICAgICAgIEVYUEVDVF9UUlVFKCpvdXRwMiA9PSAqYm91dHAyKTsKKworICAgICAgICBib3V0cDEtPnNldFBvcnQoZmFsc2UgLyogb3V0cHV0ICovKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoKmlucDEgPT0gKmJvdXRwMSk7CisKKyAgICAgICAgLy8gaW5kZXgKKyAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUoaW5wMS0+dHlwZSgpKS5jb3JlSW5kZXgoKSwgQzJOdW1iZXJzU3RydWN0OjpDT1JFX0lOREVYKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUoaW5wMS0+dHlwZSgpKS50eXBlSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXJzKTsKKyAgICAgICAgRVhQRUNUX0VRKGlucDEtPnR5cGUoKSwgQzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQ6OlBBUkFNX1RZUEUpOworICAgICAgICBFWFBFQ1RfRVEoaW5wMS0+c3RyZWFtKCksIH4wdSk7CisKKyAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUoaW5wMi0+dHlwZSgpKS5jb3JlSW5kZXgoKSwgQzJOdW1iZXJzU3RydWN0OjpDT1JFX0lOREVYKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUoaW5wMi0+dHlwZSgpKS50eXBlSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXJzKTsKKyAgICAgICAgRVhQRUNUX0VRKGlucDItPnR5cGUoKSwgQzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQ6OlBBUkFNX1RZUEUpOworICAgICAgICBFWFBFQ1RfRVEoaW5wMi0+c3RyZWFtKCksIH4wdSk7CisKKyAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUob3V0cDEtPnR5cGUoKSkuY29yZUluZGV4KCksIEMyTnVtYmVyc1N0cnVjdDo6Q09SRV9JTkRFWCk7CisgICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKG91dHAxLT50eXBlKCkpLnR5cGVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcnMpOworICAgICAgICBFWFBFQ1RfRVEob3V0cDEtPnR5cGUoKSwgQzJOdW1iZXJzUG9ydFR1bmluZzo6b3V0cHV0OjpQQVJBTV9UWVBFKTsKKyAgICAgICAgRVhQRUNUX0VRKG91dHAxLT5zdHJlYW0oKSwgfjB1KTsKKworICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZShvdXRwMi0+dHlwZSgpKS5jb3JlSW5kZXgoKSwgQzJOdW1iZXJzU3RydWN0OjpDT1JFX0lOREVYKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUob3V0cDItPnR5cGUoKSkudHlwZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVycyk7CisgICAgICAgIEVYUEVDVF9FUShvdXRwMi0+dHlwZSgpLCBDMk51bWJlcnNQb3J0VHVuaW5nOjpvdXRwdXQ6OlBBUkFNX1RZUEUpOworICAgICAgICBFWFBFQ1RfRVEob3V0cDItPnN0cmVhbSgpLCB+MHUpOworCisgICAgICAgIEMyUGFyYW06OkNvcmVJbmRleCBpbmRleCA9IEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0OjpQQVJBTV9UWVBFOworICAgICAgICBFWFBFQ1RfRkFMU0UoaW5kZXguaXNWZW5kb3IoKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKGluZGV4LmlzRmxleGlibGUoKSk7CisgICAgICAgIEVYUEVDVF9FUShpbmRleC5jb3JlSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXJzIHwgQzJQYXJhbTo6Q29yZUluZGV4OjpJU19GTEVYX0ZMQUcpOworICAgICAgICBFWFBFQ1RfRVEoaW5kZXgudHlwZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVycyk7CisKKyAgICAgICAgaW5kZXggPSBDMk51bWJlcnNQb3J0VHVuaW5nOjpvdXRwdXQ6OlBBUkFNX1RZUEU7CisgICAgICAgIEVYUEVDVF9GQUxTRShpbmRleC5pc1ZlbmRvcigpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoaW5kZXguaXNGbGV4aWJsZSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKGluZGV4LmNvcmVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcnMgfCBDMlBhcmFtOjpDb3JlSW5kZXg6OklTX0ZMRVhfRkxBRyk7CisgICAgICAgIEVYUEVDVF9FUShpbmRleC50eXBlSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXJzKTsKKworICAgICAgICBDMlBhcmFtOjpUeXBlIHR5cGUgPSBDMk51bWJlcnNQb3J0VHVuaW5nOjppbnB1dDo6UEFSQU1fVFlQRTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuaXNWZW5kb3IoKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKHR5cGUuaXNGbGV4aWJsZSgpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuaXNHbG9iYWwoKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKHR5cGUuZm9ySW5wdXQoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmZvck91dHB1dCgpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuZm9yU3RyZWFtKCkpOworICAgICAgICBFWFBFQ1RfVFJVRSh0eXBlLmZvclBvcnQoKSk7CisKKyAgICAgICAgdHlwZSA9IEMyTnVtYmVyc1BvcnRUdW5pbmc6Om91dHB1dDo6UEFSQU1fVFlQRTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuaXNWZW5kb3IoKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKHR5cGUuaXNGbGV4aWJsZSgpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuaXNHbG9iYWwoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmZvcklucHV0KCkpOworICAgICAgICBFWFBFQ1RfVFJVRSh0eXBlLmZvck91dHB1dCgpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuZm9yU3RyZWFtKCkpOworICAgICAgICBFWFBFQ1RfVFJVRSh0eXBlLmZvclBvcnQoKSk7CisKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1BvcnRUdW5pbmc6OkZyb20obnVsbHB0ciksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQ6OkZyb20obnVsbHB0ciksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6b3V0cHV0OjpGcm9tKG51bGxwdHIpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1R1bmluZzo6RnJvbShpbnAxLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNUdW5pbmc6OkZyb20oaW5wMi5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzVHVuaW5nOjpGcm9tKG91dHAxLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNUdW5pbmc6OkZyb20ob3V0cDIuZ2V0KCkpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1BvcnRUdW5pbmc6OkZyb20oaW5wMS5nZXQoKSksIGlucDEuZ2V0KCkpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6RnJvbShpbnAyLmdldCgpKSwgKEMyTnVtYmVyc1BvcnRUdW5pbmcqKWlucDIuZ2V0KCkpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6RnJvbShvdXRwMS5nZXQoKSksIG91dHAxLmdldCgpKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1BvcnRUdW5pbmc6OkZyb20ob3V0cDIuZ2V0KCkpLCAoQzJOdW1iZXJzUG9ydFR1bmluZyopb3V0cDIuZ2V0KCkpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQ6OkZyb20oaW5wMS5nZXQoKSksIChDMk51bWJlcnNQb3J0VHVuaW5nOjppbnB1dCopaW5wMS5nZXQoKSk7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNQb3J0VHVuaW5nOjppbnB1dDo6RnJvbShpbnAyLmdldCgpKSwgaW5wMi5nZXQoKSk7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNQb3J0VHVuaW5nOjppbnB1dDo6RnJvbShvdXRwMS5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQ6OkZyb20ob3V0cDIuZ2V0KCkpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1BvcnRUdW5pbmc6Om91dHB1dDo6RnJvbShpbnAxLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNQb3J0VHVuaW5nOjpvdXRwdXQ6OkZyb20oaW5wMi5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6b3V0cHV0OjpGcm9tKG91dHAxLmdldCgpKSwgKEMyTnVtYmVyc1BvcnRUdW5pbmc6Om91dHB1dCopb3V0cDEuZ2V0KCkpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6b3V0cHV0OjpGcm9tKG91dHAyLmdldCgpKSwgb3V0cDIuZ2V0KCkpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpGcm9tKGlucDEuZ2V0KCkpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6RnJvbShpbnAyLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNTdHJlYW1UdW5pbmc6OkZyb20ob3V0cDEuZ2V0KCkpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6RnJvbShvdXRwMi5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjppbnB1dDo6RnJvbShpbnAxLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNTdHJlYW1UdW5pbmc6OmlucHV0OjpGcm9tKGlucDIuZ2V0KCkpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6aW5wdXQ6OkZyb20ob3V0cDEuZ2V0KCkpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6aW5wdXQ6OkZyb20ob3V0cDIuZ2V0KCkpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6b3V0cHV0OjpGcm9tKGlucDEuZ2V0KCkpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6b3V0cHV0OjpGcm9tKGlucDIuZ2V0KCkpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6b3V0cHV0OjpGcm9tKG91dHAxLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNTdHJlYW1UdW5pbmc6Om91dHB1dDo6RnJvbShvdXRwMi5nZXQoKSksIG51bGxwdHIpOworCisgICAgICAgIEVYUEVDVF9FUSgqKEMyUGFyYW06OkNvcHkoKmlucDEpKSwgKmlucDEpOworICAgICAgICBFWFBFQ1RfRVEoKihDMlBhcmFtOjpDb3B5KCppbnAyKSksICppbnAyKTsKKyAgICAgICAgRVhQRUNUX0VRKCooQzJQYXJhbTo6Q29weSgqb3V0cDEpKSwgKm91dHAxKTsKKyAgICAgICAgRVhQRUNUX0VRKCooQzJQYXJhbTo6Q29weSgqb3V0cDIpKSwgKm91dHAyKTsKKyAgICB9CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJOdW1iZXJzU3RyZWFtVHVuaW5nPiBvdXRzMV8oQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpBbGxvY1VuaXF1ZSgxLCB0cnVlLCAxdSkpOworICAgIG91dHMxXy0+bS5tTnVtYmVyc1swXSA9IDEwMDsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Y29uc3QgQzJOdW1iZXJzU3RyZWFtVHVuaW5nPiBvdXRzMSA9IHN0ZDo6bW92ZShvdXRzMV8pOworICAgIHN0ZDo6dW5pcXVlX3B0cjxDMk51bWJlcnNTdHJlYW1UdW5pbmc+IGluczFfKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6QWxsb2NVbmlxdWUoMSwgZmFsc2UsIDF1KSk7CisgICAgaW5zMV8tPm0ubU51bWJlcnNbMF0gPSAxMDA7CisgICAgc3RkOjp1bmlxdWVfcHRyPGNvbnN0IEMyTnVtYmVyc1N0cmVhbVR1bmluZz4gaW5zMSA9IHN0ZDo6bW92ZShpbnMxXyk7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTnVtYmVyc1N0cmVhbVR1bmluZz4gYm91dHMxKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6QWxsb2NTaGFyZWQoMSkpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMk51bWJlcnNTdHJlYW1UdW5pbmc+IGJpbnMxKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6QWxsb2NTaGFyZWQoMSkpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMk51bWJlcnNTdHJlYW1UdW5pbmc+IGJpbnMzKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6QWxsb2NTaGFyZWQoMSwgZmFsc2UsIDF1KSk7CisgICAgYmluczMtPm0ubU51bWJlcnNbMF0gPSAxMDA7CisgICAgc3RkOjp1bmlxdWVfcHRyPEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6aW5wdXQ+IGluczJfKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6aW5wdXQ6OkFsbG9jVW5pcXVlKDEsIDF1KSk7CisgICAgaW5zMl8tPm0ubU51bWJlcnNbMF0gPSAxMDA7CisgICAgc3RkOjp1bmlxdWVfcHRyPGNvbnN0IEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6aW5wdXQ+IGluczIgPSBzdGQ6Om1vdmUoaW5zMl8pOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMk51bWJlcnNTdHJlYW1UdW5pbmc6OmlucHV0PiBiaW5zMihDMk51bWJlcnNTdHJlYW1UdW5pbmc6OmlucHV0OjpBbGxvY1NoYXJlZCgxKSk7CisgICAgc3RkOjp1bmlxdWVfcHRyPEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6b3V0cHV0PiBvdXRzMl8oQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OkFsbG9jVW5pcXVlKDEsIDF1KSk7CisgICAgb3V0czJfLT5tLm1OdW1iZXJzWzBdID0gMTAwOworICAgIHN0ZDo6dW5pcXVlX3B0cjxjb25zdCBDMk51bWJlcnNTdHJlYW1UdW5pbmc6Om91dHB1dD4gb3V0czIgPSBzdGQ6Om1vdmUob3V0czJfKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpvdXRwdXQ+IGJvdXRzMihDMk51bWJlcnNTdHJlYW1UdW5pbmc6Om91dHB1dDo6QWxsb2NTaGFyZWQoMSkpOworCisgICAgeworICAgICAgICBzdGF0aWNfYXNzZXJ0KGNhbkNhbGxTZXRQb3J0KCpiaW5zMyksICJzaG91bGQgYmUgYWJsZSB0byIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KGNhbkNhbGxTZXRQb3J0KCpiaW5zMSksICJzaG91bGQgYmUgYWJsZSB0byIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCFjYW5DYWxsU2V0UG9ydCgqaW5zMSksICJzaG91bGQgbm90IGJlIGFibGUgdG8gKGNvbnN0KSIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCFjYW5DYWxsU2V0UG9ydCgqaW5zMiksICJzaG91bGQgbm90IGJlIGFibGUgdG8gKGNvbnN0ICYgdHlwZSkiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghY2FuQ2FsbFNldFBvcnQoKmJpbnMyKSwgInNob3VsZCBub3QgYmUgYWJsZSB0byAodHlwZSkiKTsKKworICAgICAgICAvLyBmbGFncyAmIGludmFyaWFibGVzCisgICAgICAgIGNvbnN0IEMyTnVtYmVyc1N0cmVhbVR1bmluZyAqU1tdID0geyBvdXRzMS5nZXQoKSwgaW5zMS5nZXQoKSwgYm91dHMxLmdldCgpIH07CisgICAgICAgIGZvciAoY29uc3QgYXV0byBwIDogUykgeworICAgICAgICAgICAgRVhQRUNUX0VRKDEydSwgcC0+c2l6ZSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLT5pc1ZlbmRvcigpKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHAtPmlzRmxleGlibGUoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+aXNHbG9iYWwoKSk7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRShwLT5mb3JTdHJlYW0oKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+Zm9yUG9ydCgpKTsKKyAgICAgICAgfQorICAgICAgICBjb25zdCBDMk51bWJlcnNTdHJlYW1UdW5pbmc6OmlucHV0ICpTSVtdID0geyBpbnMyLmdldCgpLCBiaW5zMi5nZXQoKSB9OworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gcCA6IFNJKSB7CisgICAgICAgICAgICBFWFBFQ1RfRVEoMTJ1LCBwLT5zaXplKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAtPmlzVmVuZG9yKCkpOworICAgICAgICAgICAgRVhQRUNUX1RSVUUocC0+aXNGbGV4aWJsZSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLT5pc0dsb2JhbCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHAtPmZvclN0cmVhbSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLT5mb3JQb3J0KCkpOworICAgICAgICB9CisgICAgICAgIGNvbnN0IEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6b3V0cHV0ICpTT1tdID0geyBvdXRzMi5nZXQoKSwgYm91dHMyLmdldCgpIH07CisgICAgICAgIGZvciAoY29uc3QgYXV0byBwIDogU08pIHsKKyAgICAgICAgICAgIEVYUEVDVF9FUSgxMnUsIHAtPnNpemUoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+aXNWZW5kb3IoKSk7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRShwLT5pc0ZsZXhpYmxlKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAtPmlzR2xvYmFsKCkpOworICAgICAgICAgICAgRVhQRUNUX1RSVUUocC0+Zm9yU3RyZWFtKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAtPmZvclBvcnQoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBwb3J0IHNwZWNpZmljIGZsYWdzICYgaW52YXJpYWJsZXMKKyAgICAgICAgRVhQRUNUX0ZBTFNFKG91dHMxLT5mb3JJbnB1dCgpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUob3V0czEtPmZvck91dHB1dCgpKTsKKworICAgICAgICBFWFBFQ1RfVFJVRShpbnMxLT5mb3JJbnB1dCgpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKGluczEtPmZvck91dHB1dCgpKTsKKworICAgICAgICBjb25zdCBDMk51bWJlcnNTdHJlYW1UdW5pbmcgKlMyW10gPSB7IG91dHMxLmdldCgpLCBpbnMxLmdldCgpIH07CisgICAgICAgIGZvciAoY29uc3QgYXV0byBwIDogUzIpIHsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKChib29sKSgqcCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKCEoKnApKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUSgxMDAsIHAtPm0ubU51bWJlcnNbMF0pOworICAgICAgICAgICAgRVhQRUNUX0VRKDF1LCBwLT5zdHJlYW0oKSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChjb25zdCBhdXRvIHAgOiBTTykgeworICAgICAgICAgICAgRVhQRUNUX1RSVUUoKGJvb2wpKCpwKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UoISgqcCkpOworCisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+Zm9ySW5wdXQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRShwLT5mb3JPdXRwdXQoKSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChjb25zdCBhdXRvIHAgOiBTSSkgeworICAgICAgICAgICAgRVhQRUNUX1RSVUUoKGJvb2wpKCpwKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UoISgqcCkpOworCisgICAgICAgICAgICBFWFBFQ1RfVFJVRShwLT5mb3JJbnB1dCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLT5mb3JPdXRwdXQoKSk7CisgICAgICAgIH0KKyAgICAgICAgY29uc3QgQzJOdW1iZXJzU3RyZWFtVHVuaW5nICpTM1tdID0geyBib3V0czEuZ2V0KCkgfTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvIHAgOiBTMykgeworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKChib29sKSgqcCkpOworICAgICAgICAgICAgRVhQRUNUX1RSVUUoISgqcCkpOworCisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+Zm9ySW5wdXQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+Zm9yT3V0cHV0KCkpOworICAgICAgICAgICAgRVhQRUNUX0VRKDAsIHAtPm0ubU51bWJlcnNbMF0pOworICAgICAgICB9CisKKyAgICAgICAgLy8gdmFsdWVzCisgICAgICAgIEVYUEVDVF9FUSgxMDAsIGluczItPm0ubU51bWJlcnNbMF0pOworICAgICAgICBFWFBFQ1RfRVEoMTAwLCBvdXRzMi0+bS5tTnVtYmVyc1swXSk7CisgICAgICAgIEVYUEVDVF9FUSgwLCBiaW5zMS0+bS5tTnVtYmVyc1swXSk7CisgICAgICAgIEVYUEVDVF9FUSgwLCBiaW5zMi0+bS5tTnVtYmVyc1swXSk7CisgICAgICAgIEVYUEVDVF9FUSgwLCBib3V0czEtPm0ubU51bWJlcnNbMF0pOworICAgICAgICBFWFBFQ1RfRVEoMCwgYm91dHMyLT5tLm1OdW1iZXJzWzBdKTsKKworICAgICAgICBFWFBFQ1RfRVEoMXUsIGluczItPnN0cmVhbSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKDF1LCBvdXRzMi0+c3RyZWFtKCkpOworICAgICAgICBFWFBFQ1RfRVEoMHUsIGJpbnMxLT5zdHJlYW0oKSk7CisgICAgICAgIEVYUEVDVF9FUSgwdSwgYmluczItPnN0cmVhbSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKDB1LCBib3V0czEtPnN0cmVhbSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKDB1LCBib3V0czItPnN0cmVhbSgpKTsKKworICAgICAgICBFWFBFQ1RfVFJVRSgqaW5zMSAhPSAqb3V0czEpOworICAgICAgICBFWFBFQ1RfVFJVRSgqaW5zMSA9PSAqaW5zMik7CisgICAgICAgIEVYUEVDVF9UUlVFKCpvdXRzMSA9PSAqb3V0czIpOworICAgICAgICBFWFBFQ1RfVFJVRSgqYmluczEgPT0gKmJvdXRzMSk7CisgICAgICAgIEVYUEVDVF9UUlVFKCpiaW5zMiAhPSAqYm91dHMyKTsKKworICAgICAgICBFWFBFQ1RfVFJVRSgqaW5zMSAhPSAqYmluczEpOworICAgICAgICBiaW5zMS0+bS5tTnVtYmVyc1swXSA9IDEwMDsKKyAgICAgICAgRVhQRUNUX1RSVUUoKmluczEgIT0gKmJpbnMxKTsKKyAgICAgICAgYmluczEtPnNldFBvcnQoZmFsc2UgLyogb3V0cHV0ICovKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoKmluczEgIT0gKmJpbnMxKTsKKyAgICAgICAgYmluczEtPnNldFN0cmVhbSgxdSk7CisgICAgICAgIEVYUEVDVF9UUlVFKCppbnMxID09ICpiaW5zMSk7CisKKyAgICAgICAgRVhQRUNUX1RSVUUoKmluczIgIT0gKmJpbnMyKTsKKyAgICAgICAgYmluczItPm0ubU51bWJlcnNbMF0gPSAxMDA7CisgICAgICAgIEVYUEVDVF9UUlVFKCppbnMyICE9ICpiaW5zMik7CisgICAgICAgIGJpbnMyLT5zZXRTdHJlYW0oMXUpOworICAgICAgICBFWFBFQ1RfVFJVRSgqaW5zMiA9PSAqYmluczIpOworCisgICAgICAgIGJpbnMxLT5zZXRQb3J0KHRydWUgLyogb3V0cHV0ICovKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoKm91dHMxID09ICpiaW5zMSk7CisKKyAgICAgICAgRVhQRUNUX1RSVUUoKm91dHMxICE9ICpib3V0czEpOworICAgICAgICBib3V0czEtPm0ubU51bWJlcnNbMF0gPSAxMDA7CisgICAgICAgIEVYUEVDVF9UUlVFKCpvdXRzMSAhPSAqYm91dHMxKTsKKyAgICAgICAgYm91dHMxLT5zZXRQb3J0KHRydWUgLyogb3V0cHV0ICovKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoKm91dHMxICE9ICpib3V0czEpOworICAgICAgICBib3V0czEtPnNldFN0cmVhbSgxdSk7CisgICAgICAgIEVYUEVDVF9UUlVFKCpvdXRzMSA9PSAqYm91dHMxKTsKKworICAgICAgICBFWFBFQ1RfVFJVRSgqb3V0czIgIT0gKmJvdXRzMik7CisgICAgICAgIGJvdXRzMi0+bS5tTnVtYmVyc1swXSA9IDEwMDsKKyAgICAgICAgRVhQRUNUX1RSVUUoKm91dHMyICE9ICpib3V0czIpOworICAgICAgICBib3V0czItPnNldFN0cmVhbSgxdSk7CisgICAgICAgIEVYUEVDVF9UUlVFKCpvdXRzMiA9PSAqYm91dHMyKTsKKworICAgICAgICBib3V0czEtPnNldFBvcnQoZmFsc2UgLyogb3V0cHV0ICovKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoKmluczEgPT0gKmJvdXRzMSk7CisKKyAgICAgICAgLy8gaW5kZXgKKyAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUoaW5zMS0+dHlwZSgpKS5jb3JlSW5kZXgoKSwgQzJOdW1iZXJzU3RydWN0OjpDT1JFX0lOREVYKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUoaW5zMS0+dHlwZSgpKS50eXBlSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXJzKTsKKyAgICAgICAgRVhQRUNUX0VRKGluczEtPnR5cGUoKSwgQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjppbnB1dDo6UEFSQU1fVFlQRSk7CisKKyAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUoaW5zMi0+dHlwZSgpKS5jb3JlSW5kZXgoKSwgQzJOdW1iZXJzU3RydWN0OjpDT1JFX0lOREVYKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUoaW5zMi0+dHlwZSgpKS50eXBlSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXJzKTsKKyAgICAgICAgRVhQRUNUX0VRKGluczItPnR5cGUoKSwgQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjppbnB1dDo6UEFSQU1fVFlQRSk7CisKKyAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUob3V0czEtPnR5cGUoKSkuY29yZUluZGV4KCksIEMyTnVtYmVyc1N0cnVjdDo6Q09SRV9JTkRFWCk7CisgICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKG91dHMxLT50eXBlKCkpLnR5cGVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcnMpOworICAgICAgICBFWFBFQ1RfRVEob3V0czEtPnR5cGUoKSwgQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OlBBUkFNX1RZUEUpOworCisgICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKG91dHMyLT50eXBlKCkpLmNvcmVJbmRleCgpLCBDMk51bWJlcnNTdHJ1Y3Q6OkNPUkVfSU5ERVgpOworICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZShvdXRzMi0+dHlwZSgpKS50eXBlSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXJzKTsKKyAgICAgICAgRVhQRUNUX0VRKG91dHMyLT50eXBlKCksIEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6b3V0cHV0OjpQQVJBTV9UWVBFKTsKKworICAgICAgICBDMlBhcmFtOjpDb3JlSW5kZXggaW5kZXggPSBDMk51bWJlcnNTdHJlYW1UdW5pbmc6OmlucHV0OjpQQVJBTV9UWVBFOworICAgICAgICBFWFBFQ1RfRkFMU0UoaW5kZXguaXNWZW5kb3IoKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKGluZGV4LmlzRmxleGlibGUoKSk7CisgICAgICAgIEVYUEVDVF9FUShpbmRleC5jb3JlSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXJzIHwgQzJQYXJhbTo6Q29yZUluZGV4OjpJU19GTEVYX0ZMQUcpOworICAgICAgICBFWFBFQ1RfRVEoaW5kZXgudHlwZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVycyk7CisKKyAgICAgICAgaW5kZXggPSBDMk51bWJlcnNTdHJlYW1UdW5pbmc6Om91dHB1dDo6UEFSQU1fVFlQRTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKGluZGV4LmlzVmVuZG9yKCkpOworICAgICAgICBFWFBFQ1RfVFJVRShpbmRleC5pc0ZsZXhpYmxlKCkpOworICAgICAgICBFWFBFQ1RfRVEoaW5kZXguY29yZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVycyB8IEMyUGFyYW06OkNvcmVJbmRleDo6SVNfRkxFWF9GTEFHKTsKKyAgICAgICAgRVhQRUNUX0VRKGluZGV4LnR5cGVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcnMpOworCisgICAgICAgIEMyUGFyYW06OlR5cGUgdHlwZSA9IEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6aW5wdXQ6OlBBUkFNX1RZUEU7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmlzVmVuZG9yKCkpOworICAgICAgICBFWFBFQ1RfVFJVRSh0eXBlLmlzRmxleGlibGUoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmlzR2xvYmFsKCkpOworICAgICAgICBFWFBFQ1RfVFJVRSh0eXBlLmZvcklucHV0KCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5mb3JPdXRwdXQoKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKHR5cGUuZm9yU3RyZWFtKCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5mb3JQb3J0KCkpOworCisgICAgICAgIHR5cGUgPSBDMk51bWJlcnNTdHJlYW1UdW5pbmc6Om91dHB1dDo6UEFSQU1fVFlQRTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuaXNWZW5kb3IoKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKHR5cGUuaXNGbGV4aWJsZSgpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuaXNHbG9iYWwoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmZvcklucHV0KCkpOworICAgICAgICBFWFBFQ1RfVFJVRSh0eXBlLmZvck91dHB1dCgpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUodHlwZS5mb3JTdHJlYW0oKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmZvclBvcnQoKSk7CisKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1BvcnRUdW5pbmc6OkZyb20obnVsbHB0ciksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQ6OkZyb20obnVsbHB0ciksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6b3V0cHV0OjpGcm9tKG51bGxwdHIpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1R1bmluZzo6RnJvbShpbnMxLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNUdW5pbmc6OkZyb20oaW5zMi5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzVHVuaW5nOjpGcm9tKG91dHMxLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNUdW5pbmc6OkZyb20ob3V0czIuZ2V0KCkpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1BvcnRUdW5pbmc6OkZyb20oaW5zMS5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6RnJvbShpbnMyLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNQb3J0VHVuaW5nOjpGcm9tKG91dHMxLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNQb3J0VHVuaW5nOjpGcm9tKG91dHMyLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNQb3J0VHVuaW5nOjppbnB1dDo6RnJvbShpbnMxLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNQb3J0VHVuaW5nOjppbnB1dDo6RnJvbShpbnMyLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNQb3J0VHVuaW5nOjppbnB1dDo6RnJvbShvdXRzMS5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQ6OkZyb20ob3V0czIuZ2V0KCkpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1BvcnRUdW5pbmc6Om91dHB1dDo6RnJvbShpbnMxLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNQb3J0VHVuaW5nOjpvdXRwdXQ6OkZyb20oaW5zMi5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6b3V0cHV0OjpGcm9tKG91dHMxLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNQb3J0VHVuaW5nOjpvdXRwdXQ6OkZyb20ob3V0czIuZ2V0KCkpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6RnJvbShpbnMxLmdldCgpKSwgaW5zMS5nZXQoKSk7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNTdHJlYW1UdW5pbmc6OkZyb20oaW5zMi5nZXQoKSksIChDMk51bWJlcnNTdHJlYW1UdW5pbmcqKWluczIuZ2V0KCkpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpGcm9tKG91dHMxLmdldCgpKSwgb3V0czEuZ2V0KCkpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpGcm9tKG91dHMyLmdldCgpKSwgKEMyTnVtYmVyc1N0cmVhbVR1bmluZyopb3V0czIuZ2V0KCkpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjppbnB1dDo6RnJvbShpbnMxLmdldCgpKSwgKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6aW5wdXQqKWluczEuZ2V0KCkpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjppbnB1dDo6RnJvbShpbnMyLmdldCgpKSwgaW5zMi5nZXQoKSk7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNTdHJlYW1UdW5pbmc6OmlucHV0OjpGcm9tKG91dHMxLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNTdHJlYW1UdW5pbmc6OmlucHV0OjpGcm9tKG91dHMyLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNTdHJlYW1UdW5pbmc6Om91dHB1dDo6RnJvbShpbnMxLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNTdHJlYW1UdW5pbmc6Om91dHB1dDo6RnJvbShpbnMyLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNTdHJlYW1UdW5pbmc6Om91dHB1dDo6RnJvbShvdXRzMS5nZXQoKSksIChDMk51bWJlcnNTdHJlYW1UdW5pbmc6Om91dHB1dCopb3V0czEuZ2V0KCkpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OkZyb20ob3V0czIuZ2V0KCkpLCBvdXRzMi5nZXQoKSk7CisKKyAgICAgICAgRVhQRUNUX0VRKCooQzJQYXJhbTo6Q29weSgqaW5zMSkpLCAqaW5zMSk7CisgICAgICAgIEVYUEVDVF9FUSgqKEMyUGFyYW06OkNvcHkoKmluczIpKSwgKmluczIpOworICAgICAgICBFWFBFQ1RfRVEoKihDMlBhcmFtOjpDb3B5KCpvdXRzMSkpLCAqb3V0czEpOworICAgICAgICBFWFBFQ1RfRVEoKihDMlBhcmFtOjpDb3B5KCpvdXRzMikpLCAqb3V0czIpOworICAgIH0KKworICAgIHsKKyAgICAgICAgQzJJbnQzMlZhbHVlIGludDMyVmFsdWUoSU5UMzJfTUlOKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8ZGVjbHR5cGUoaW50MzJWYWx1ZS52YWx1ZSksIGludDMyX3Q+Ojp2YWx1ZSwgInNob3VsZCBiZSBpbnQzMl90Iik7CisgICAgICAgIEVYUEVDVF9FUShJTlQzMl9NSU4sIGludDMyVmFsdWUudmFsdWUpOworICAgICAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gZmllbGRzID0gaW50MzJWYWx1ZS5GaWVsZExpc3QoKTsKKyAgICAgICAgRVhQRUNUX0VRKDF1LCBmaWVsZHMuc2l6ZSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKEZEOjpJTlQzMiwgZmllbGRzLmNiZWdpbigpLT50eXBlKCkpOworICAgICAgICBFWFBFQ1RfRVEoMXUsIGZpZWxkcy5jYmVnaW4oKS0+ZXh0ZW50KCkpOworICAgICAgICBFWFBFQ1RfRVEoQzJTdHJpbmcoInZhbHVlIiksIGZpZWxkcy5jYmVnaW4oKS0+bmFtZSgpKTsKKyAgICB9CisKKyAgICB7CisgICAgICAgIEMyVWludDMyVmFsdWUgdWludDMyVmFsdWUoVUlOVDMyX01BWCk7CisgICAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPGRlY2x0eXBlKHVpbnQzMlZhbHVlLnZhbHVlKSwgdWludDMyX3Q+Ojp2YWx1ZSwgInNob3VsZCBiZSB1aW50MzJfdCIpOworICAgICAgICBFWFBFQ1RfRVEoVUlOVDMyX01BWCwgdWludDMyVmFsdWUudmFsdWUpOworICAgICAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gZmllbGRzID0gdWludDMyVmFsdWUuRmllbGRMaXN0KCk7CisgICAgICAgIEVYUEVDVF9FUSgxdSwgZmllbGRzLnNpemUoKSk7CisgICAgICAgIEVYUEVDVF9FUShGRDo6VUlOVDMyLCBmaWVsZHMuY2JlZ2luKCktPnR5cGUoKSk7CisgICAgICAgIEVYUEVDVF9FUSgxdSwgZmllbGRzLmNiZWdpbigpLT5leHRlbnQoKSk7CisgICAgICAgIEVYUEVDVF9FUShDMlN0cmluZygidmFsdWUiKSwgZmllbGRzLmNiZWdpbigpLT5uYW1lKCkpOworICAgIH0KKworICAgIHsKKyAgICAgICAgQzJJbnQ2NFZhbHVlIGludDY0VmFsdWUoSU5UNjRfTUlOKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8ZGVjbHR5cGUoaW50NjRWYWx1ZS52YWx1ZSksIGludDY0X3Q+Ojp2YWx1ZSwgInNob3VsZCBiZSBpbnQ2NF90Iik7CisgICAgICAgIEVYUEVDVF9FUShJTlQ2NF9NSU4sIGludDY0VmFsdWUudmFsdWUpOworICAgICAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gZmllbGRzID0gaW50NjRWYWx1ZS5GaWVsZExpc3QoKTsKKyAgICAgICAgRVhQRUNUX0VRKDF1LCBmaWVsZHMuc2l6ZSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKEZEOjpJTlQ2NCwgZmllbGRzLmNiZWdpbigpLT50eXBlKCkpOworICAgICAgICBFWFBFQ1RfRVEoMXUsIGZpZWxkcy5jYmVnaW4oKS0+ZXh0ZW50KCkpOworICAgICAgICBFWFBFQ1RfRVEoQzJTdHJpbmcoInZhbHVlIiksIGZpZWxkcy5jYmVnaW4oKS0+bmFtZSgpKTsKKyAgICB9CisKKyAgICB7CisgICAgICAgIEMyVWludDY0VmFsdWUgdWludDY0VmFsdWUoVUlOVDY0X01BWCk7CisgICAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPGRlY2x0eXBlKHVpbnQ2NFZhbHVlLnZhbHVlKSwgdWludDY0X3Q+Ojp2YWx1ZSwgInNob3VsZCBiZSB1aW50NjRfdCIpOworICAgICAgICBFWFBFQ1RfRVEoVUlOVDY0X01BWCwgdWludDY0VmFsdWUudmFsdWUpOworICAgICAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gZmllbGRzID0gdWludDY0VmFsdWUuRmllbGRMaXN0KCk7CisgICAgICAgIEVYUEVDVF9FUSgxdSwgZmllbGRzLnNpemUoKSk7CisgICAgICAgIEVYUEVDVF9FUShGRDo6VUlOVDY0LCBmaWVsZHMuY2JlZ2luKCktPnR5cGUoKSk7CisgICAgICAgIEVYUEVDVF9FUSgxdSwgZmllbGRzLmNiZWdpbigpLT5leHRlbnQoKSk7CisgICAgICAgIEVYUEVDVF9FUShDMlN0cmluZygidmFsdWUiKSwgZmllbGRzLmNiZWdpbigpLT5uYW1lKCkpOworICAgIH0KKworICAgIHsKKyAgICAgICAgQzJGbG9hdFZhbHVlIGZsb2F0VmFsdWUoMTIzLjRmKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8ZGVjbHR5cGUoZmxvYXRWYWx1ZS52YWx1ZSksIGZsb2F0Pjo6dmFsdWUsICJzaG91bGQgYmUgZmxvYXQiKTsKKyAgICAgICAgRVhQRUNUX0VRKDEyMy40ZiwgZmxvYXRWYWx1ZS52YWx1ZSk7CisgICAgICAgIHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBmaWVsZHMgPSBmbG9hdFZhbHVlLkZpZWxkTGlzdCgpOworICAgICAgICBFWFBFQ1RfRVEoMXUsIGZpZWxkcy5zaXplKCkpOworICAgICAgICBFWFBFQ1RfRVEoRkQ6OkZMT0FULCBmaWVsZHMuY2JlZ2luKCktPnR5cGUoKSk7CisgICAgICAgIEVYUEVDVF9FUSgxdSwgZmllbGRzLmNiZWdpbigpLT5leHRlbnQoKSk7CisgICAgICAgIEVYUEVDVF9FUShDMlN0cmluZygidmFsdWUiKSwgZmllbGRzLmNiZWdpbigpLT5uYW1lKCkpOworICAgIH0KKworICAgIHsKKyAgICAgICAgdWludDhfdCBpbml0VmFsdWVbXSA9ICJBQkNEIjsKKyAgICAgICAgdHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMyU2V0dGluZywgQzJCbG9iVmFsdWUsIDA+IEJsb2JTZXR0aW5nOworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QmxvYlNldHRpbmc+IGJsb2JWYWx1ZSA9IEJsb2JTZXR0aW5nOjpBbGxvY1VuaXF1ZSg2LCBDMkNvbnN0TWVtb3J5QmxvY2s8dWludDhfdD4oaW5pdFZhbHVlKSk7CisgICAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPGRlY2x0eXBlKGJsb2JWYWx1ZS0+bS52YWx1ZSksIHVpbnQ4X3RbXT46OnZhbHVlLCAic2hvdWxkIGJlIHVpbnQ4X3RbXSIpOworICAgICAgICBFWFBFQ1RfRVEoMCwgbWVtY21wKGJsb2JWYWx1ZS0+bS52YWx1ZSwgIkFCQ0RcMCIsIDYpKTsKKyAgICAgICAgRVhQRUNUX0VRKDZ1LCBibG9iVmFsdWUtPmZsZXhDb3VudCgpKTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IGZpZWxkcyA9IGJsb2JWYWx1ZS0+RmllbGRMaXN0KCk7CisgICAgICAgIEVYUEVDVF9FUSgxdSwgZmllbGRzLnNpemUoKSk7CisgICAgICAgIEVYUEVDVF9FUShGRDo6QkxPQiwgZmllbGRzLmNiZWdpbigpLT50eXBlKCkpOworICAgICAgICBFWFBFQ1RfRVEoMHUsIGZpZWxkcy5jYmVnaW4oKS0+ZXh0ZW50KCkpOworICAgICAgICBFWFBFQ1RfRVEoQzJTdHJpbmcoInZhbHVlIiksIGZpZWxkcy5jYmVnaW4oKS0+bmFtZSgpKTsKKworICAgICAgICBibG9iVmFsdWUgPSBCbG9iU2V0dGluZzo6QWxsb2NVbmlxdWUoMywgQzJDb25zdE1lbW9yeUJsb2NrPHVpbnQ4X3Q+KGluaXRWYWx1ZSkpOworICAgICAgICBFWFBFQ1RfRVEoMCwgbWVtY21wKGJsb2JWYWx1ZS0+bS52YWx1ZSwgIkFCQyIsIDMpKTsKKyAgICAgICAgRVhQRUNUX0VRKDN1LCBibG9iVmFsdWUtPmZsZXhDb3VudCgpKTsKKyAgICB9CisKKyAgICB7CisgICAgICAgIGNvbnN0ZXhwciBjaGFyIGluaXRWYWx1ZVtdID0gIkFCQ0QiOworICAgICAgICB0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJTZXR0aW5nLCBDMlN0cmluZ1ZhbHVlLCAwPiBTdHJpbmdTZXR0aW5nOworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8U3RyaW5nU2V0dGluZz4gc3RyaW5nVmFsdWUgPSBTdHJpbmdTZXR0aW5nOjpBbGxvY1VuaXF1ZSg2LCBDMkNvbnN0TWVtb3J5QmxvY2s8Y2hhcj4oaW5pdFZhbHVlKSk7CisgICAgICAgIHN0cmluZ1ZhbHVlID0gU3RyaW5nU2V0dGluZzo6QWxsb2NVbmlxdWUoNiwgaW5pdFZhbHVlKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8ZGVjbHR5cGUoc3RyaW5nVmFsdWUtPm0udmFsdWUpLCBjaGFyW10+Ojp2YWx1ZSwgInNob3VsZCBiZSBjaGFyW10iKTsKKyAgICAgICAgRVhQRUNUX0VRKDAsIG1lbWNtcChzdHJpbmdWYWx1ZS0+bS52YWx1ZSwgIkFCQ0RcMCIsIDYpKTsKKyAgICAgICAgRVhQRUNUX0VRKDZ1LCBzdHJpbmdWYWx1ZS0+ZmxleENvdW50KCkpOworICAgICAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gZmllbGRzID0gc3RyaW5nVmFsdWUtPkZpZWxkTGlzdCgpOworICAgICAgICBFWFBFQ1RfRVEoMXUsIGZpZWxkcy5zaXplKCkpOworICAgICAgICBFWFBFQ1RfRVEoRkQ6OlNUUklORywgZmllbGRzLmNiZWdpbigpLT50eXBlKCkpOworICAgICAgICBFWFBFQ1RfRVEoMHUsIGZpZWxkcy5jYmVnaW4oKS0+ZXh0ZW50KCkpOworICAgICAgICBFWFBFQ1RfRVEoQzJTdHJpbmcoInZhbHVlIiksIGZpZWxkcy5jYmVnaW4oKS0+bmFtZSgpKTsKKworICAgICAgICBzdHJpbmdWYWx1ZSA9IFN0cmluZ1NldHRpbmc6OkFsbG9jVW5pcXVlKDMsIEMyQ29uc3RNZW1vcnlCbG9jazxjaGFyPihpbml0VmFsdWUpKTsKKyAgICAgICAgRVhQRUNUX0VRKDAsIG1lbWNtcChzdHJpbmdWYWx1ZS0+bS52YWx1ZSwgIkFCIiwgMykpOworICAgICAgICBFWFBFQ1RfRVEoM3UsIHN0cmluZ1ZhbHVlLT5mbGV4Q291bnQoKSk7CisKKyAgICAgICAgc3RyaW5nVmFsdWUgPSBTdHJpbmdTZXR0aW5nOjpBbGxvY1VuaXF1ZSgxMSwgImluaXRWYWx1ZSIpOworICAgICAgICBFWFBFQ1RfRVEoMCwgbWVtY21wKHN0cmluZ1ZhbHVlLT5tLnZhbHVlLCAiaW5pdFZhbHVlXDAiLCAxMSkpOworICAgICAgICBFWFBFQ1RfRVEoMTF1LCBzdHJpbmdWYWx1ZS0+ZmxleENvdW50KCkpOworCisgICAgICAgIHN0cmluZ1ZhbHVlID0gU3RyaW5nU2V0dGluZzo6QWxsb2NVbmlxdWUoaW5pdFZhbHVlKTsKKyAgICAgICAgRVhQRUNUX0VRKDAsIG1lbWNtcChzdHJpbmdWYWx1ZS0+bS52YWx1ZSwgIkFCQ0QiLCA1KSk7CisgICAgICAgIEVYUEVDVF9FUSg1dSwgc3RyaW5nVmFsdWUtPmZsZXhDb3VudCgpKTsKKworICAgICAgICBzdHJpbmdWYWx1ZSA9IFN0cmluZ1NldHRpbmc6OkFsbG9jVW5pcXVlKHsgJ0EnLCAnQicsICdDJywgJ0QnIH0pOworICAgICAgICBFWFBFQ1RfRVEoMCwgbWVtY21wKHN0cmluZ1ZhbHVlLT5tLnZhbHVlLCAiQUJDIiwgNCkpOworICAgICAgICBFWFBFQ1RfRVEoNHUsIHN0cmluZ1ZhbHVlLT5mbGV4Q291bnQoKSk7CisgICAgfQorCisgICAgeworICAgICAgICB1aW50MzJfdCB2aWRlb1dpZHRoW10gPSB7IDEydSwgQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OlBBUkFNX1RZUEUsIDEwMCB9OworICAgICAgICBDMlBhcmFtICpwMSA9IEMyUGFyYW06OkZyb20odmlkZW9XaWR0aCwgc2l6ZW9mKHZpZGVvV2lkdGgpKTsKKyAgICAgICAgRVhQRUNUX05FKG51bGxwdHIsIHAxKTsKKyAgICAgICAgRVhQRUNUX0VRKDEydSwgcDEtPnNpemUoKSk7CisgICAgICAgIEVYUEVDVF9FUShwMS0+dHlwZSgpLCBDMk51bWJlcnNTdHJlYW1UdW5pbmc6Om91dHB1dDo6UEFSQU1fVFlQRSk7CisKKyAgICAgICAgQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpvdXRwdXQgKnZzdCA9IEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6b3V0cHV0OjpGcm9tKHAxKTsKKyAgICAgICAgRVhQRUNUX05FKG51bGxwdHIsIHZzdCk7CisgICAgICAgIGlmICh2c3QpIHsKKyAgICAgICAgICAgIEVYUEVDVF9FUSgxdSwgdnN0LT5mbGV4Q291bnQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRVEoMTAwLCB2c3QtPm0ubU51bWJlcnNbMF0pOworICAgICAgICB9CisKKyAgICAgICAgcDEgPSBDMlBhcmFtOjpGcm9tKHZpZGVvV2lkdGgsIHNpemVvZih2aWRlb1dpZHRoKSArIDIpOworICAgICAgICBFWFBFQ1RfRVEobnVsbHB0ciwgcDEpOworCisgICAgICAgIHAxID0gQzJQYXJhbTo6RnJvbSh2aWRlb1dpZHRoLCBzaXplb2YodmlkZW9XaWR0aCkgLSAyKTsKKyAgICAgICAgRVhQRUNUX0VRKG51bGxwdHIsIHAxKTsKKworICAgICAgICBwMSA9IEMyUGFyYW06OkZyb20odmlkZW9XaWR0aCwgMyk7CisgICAgICAgIEVYUEVDVF9FUShudWxscHRyLCBwMSk7CisKKyAgICAgICAgcDEgPSBDMlBhcmFtOjpGcm9tKHZpZGVvV2lkdGgsIDApOworICAgICAgICBFWFBFQ1RfRVEobnVsbHB0ciwgcDEpOworICAgIH0KKworICAgIHsKKyAgICAgICAgdWludDMyX3QgdmlkZW9XaWR0aFtdID0geyAxNnUsIEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0OjpQQVJBTV9UWVBFLCAxMDEsIDEwMiB9OworCisgICAgICAgIEMyUGFyYW0gKnAxID0gQzJQYXJhbTo6RnJvbSh2aWRlb1dpZHRoLCBzaXplb2YodmlkZW9XaWR0aCkpOworICAgICAgICBFWFBFQ1RfTkUobnVsbHB0ciwgcDEpOworICAgICAgICBFWFBFQ1RfRVEoMTZ1LCBwMS0+c2l6ZSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKHAxLT50eXBlKCksIEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0OjpQQVJBTV9UWVBFKTsKKworICAgICAgICBDMk51bWJlcnNQb3J0VHVuaW5nOjppbnB1dCAqdnB0ID0gQzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQ6OkZyb20ocDEpOworICAgICAgICBFWFBFQ1RfTkUobnVsbHB0ciwgdnB0KTsKKyAgICAgICAgaWYgKHZwdCkgeworICAgICAgICAgICAgRVhQRUNUX0VRKDJ1LCB2cHQtPmZsZXhDb3VudCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUSgxMDEsIHZwdC0+bS5tTnVtYmVyc1swXSk7CisgICAgICAgICAgICBFWFBFQ1RfRVEoMTAyLCB2cHQtPm0ubU51bWJlcnNbMV0pOworICAgICAgICB9CisKKyAgICAgICAgcDEgPSBDMlBhcmFtOjpGcm9tKHZpZGVvV2lkdGgsIHNpemVvZih2aWRlb1dpZHRoKSArIDIpOworICAgICAgICBFWFBFQ1RfRVEobnVsbHB0ciwgcDEpOworCisgICAgICAgIHAxID0gQzJQYXJhbTo6RnJvbSh2aWRlb1dpZHRoLCBzaXplb2YodmlkZW9XaWR0aCkgLSAyKTsKKyAgICAgICAgRVhQRUNUX0VRKG51bGxwdHIsIHAxKTsKKworICAgICAgICBwMSA9IEMyUGFyYW06OkZyb20odmlkZW9XaWR0aCwgMyk7CisgICAgICAgIEVYUEVDVF9FUShudWxscHRyLCBwMSk7CisKKyAgICAgICAgcDEgPSBDMlBhcmFtOjpGcm9tKHZpZGVvV2lkdGgsIDApOworICAgICAgICBFWFBFQ1RfRVEobnVsbHB0ciwgcDEpOworICAgIH0KK30KKworVEVTVF9GKEMyUGFyYW1UZXN0LCBDMlZhbHVlVGVzdCkgeworICAgIEMyVmFsdWUgdmFsOworICAgIGludDMyX3QgaTMyID0gLTMyOworICAgIGludDY0X3QgaTY0ID0gLTY0OworICAgIHVpbnQzMl90IHUzMiA9IDMyOworICAgIHVpbnQ2NF90IHU2NCA9IDY0OworICAgIGZsb2F0IGZwID0gMS41ZjsKKworICAgIEVYUEVDVF9FUShDMlZhbHVlOjpOT19JTklULCB2YWwudHlwZSgpKTsKKyAgICBFWFBFQ1RfRVEoZmFsc2UsIHZhbC5nZXQoJmkzMikpOworICAgIEVYUEVDVF9FUSgtMzIsIGkzMik7CisgICAgRVhQRUNUX0VRKGZhbHNlLCB2YWwuZ2V0KCZpNjQpKTsKKyAgICBFWFBFQ1RfRVEoLTY0LCBpNjQpOworICAgIEVYUEVDVF9FUShmYWxzZSwgdmFsLmdldCgmdTMyKSk7CisgICAgRVhQRUNUX0VRKDMydSwgdTMyKTsKKyAgICBFWFBFQ1RfRVEoZmFsc2UsIHZhbC5nZXQoJnU2NCkpOworICAgIEVYUEVDVF9FUSg2NHUsIHU2NCk7CisgICAgRVhQRUNUX0VRKGZhbHNlLCB2YWwuZ2V0KCZmcCkpOworICAgIEVYUEVDVF9FUSgxLjVmLCBmcCk7CisKKyAgICB2YWwgPSBpbnQzMl90KC0zMjE2KTsKKyAgICBFWFBFQ1RfRVEoQzJWYWx1ZTo6SU5UMzIsIHZhbC50eXBlKCkpOworICAgIEVYUEVDVF9FUSh0cnVlLCB2YWwuZ2V0KCZpMzIpKTsKKyAgICBFWFBFQ1RfRVEoLTMyMTYsIGkzMik7CisgICAgRVhQRUNUX0VRKGZhbHNlLCB2YWwuZ2V0KCZpNjQpKTsKKyAgICBFWFBFQ1RfRVEoLTY0LCBpNjQpOworICAgIEVYUEVDVF9FUShmYWxzZSwgdmFsLmdldCgmdTMyKSk7CisgICAgRVhQRUNUX0VRKDMydSwgdTMyKTsKKyAgICBFWFBFQ1RfRVEoZmFsc2UsIHZhbC5nZXQoJnU2NCkpOworICAgIEVYUEVDVF9FUSg2NHUsIHU2NCk7CisgICAgRVhQRUNUX0VRKGZhbHNlLCB2YWwuZ2V0KCZmcCkpOworICAgIEVYUEVDVF9FUSgxLjVmLCBmcCk7CisKKyAgICB2YWwgPSB1aW50MzJfdCgzMjE2KTsKKyAgICBFWFBFQ1RfRVEoQzJWYWx1ZTo6VUlOVDMyLCB2YWwudHlwZSgpKTsKKyAgICBFWFBFQ1RfRVEoZmFsc2UsIHZhbC5nZXQoJmkzMikpOworICAgIEVYUEVDVF9FUSgtMzIxNiwgaTMyKTsKKyAgICBFWFBFQ1RfRVEoZmFsc2UsIHZhbC5nZXQoJmk2NCkpOworICAgIEVYUEVDVF9FUSgtNjQsIGk2NCk7CisgICAgRVhQRUNUX0VRKHRydWUsIHZhbC5nZXQoJnUzMikpOworICAgIEVYUEVDVF9FUSgzMjE2dSwgdTMyKTsKKyAgICBFWFBFQ1RfRVEoZmFsc2UsIHZhbC5nZXQoJnU2NCkpOworICAgIEVYUEVDVF9FUSg2NHUsIHU2NCk7CisgICAgRVhQRUNUX0VRKGZhbHNlLCB2YWwuZ2V0KCZmcCkpOworICAgIEVYUEVDVF9FUSgxLjVmLCBmcCk7CisKKyAgICB2YWwgPSBpbnQ2NF90KC02NDMyKTsKKyAgICBFWFBFQ1RfRVEoQzJWYWx1ZTo6SU5UNjQsIHZhbC50eXBlKCkpOworICAgIEVYUEVDVF9FUShmYWxzZSwgdmFsLmdldCgmaTMyKSk7CisgICAgRVhQRUNUX0VRKC0zMjE2LCBpMzIpOworICAgIEVYUEVDVF9FUSh0cnVlLCB2YWwuZ2V0KCZpNjQpKTsKKyAgICBFWFBFQ1RfRVEoLTY0MzIsIGk2NCk7CisgICAgRVhQRUNUX0VRKGZhbHNlLCB2YWwuZ2V0KCZ1MzIpKTsKKyAgICBFWFBFQ1RfRVEoMzIxNnUsIHUzMik7CisgICAgRVhQRUNUX0VRKGZhbHNlLCB2YWwuZ2V0KCZ1NjQpKTsKKyAgICBFWFBFQ1RfRVEoNjR1LCB1NjQpOworICAgIEVYUEVDVF9FUShmYWxzZSwgdmFsLmdldCgmZnApKTsKKyAgICBFWFBFQ1RfRVEoMS41ZiwgZnApOworCisgICAgdmFsID0gdWludDY0X3QoNjQzMik7CisgICAgRVhQRUNUX0VRKEMyVmFsdWU6OlVJTlQ2NCwgdmFsLnR5cGUoKSk7CisgICAgRVhQRUNUX0VRKGZhbHNlLCB2YWwuZ2V0KCZpMzIpKTsKKyAgICBFWFBFQ1RfRVEoLTMyMTYsIGkzMik7CisgICAgRVhQRUNUX0VRKGZhbHNlLCB2YWwuZ2V0KCZpNjQpKTsKKyAgICBFWFBFQ1RfRVEoLTY0MzIsIGk2NCk7CisgICAgRVhQRUNUX0VRKGZhbHNlLCB2YWwuZ2V0KCZ1MzIpKTsKKyAgICBFWFBFQ1RfRVEoMzIxNnUsIHUzMik7CisgICAgRVhQRUNUX0VRKHRydWUsIHZhbC5nZXQoJnU2NCkpOworICAgIEVYUEVDVF9FUSg2NDMydSwgdTY0KTsKKyAgICBFWFBFQ1RfRVEoZmFsc2UsIHZhbC5nZXQoJmZwKSk7CisgICAgRVhQRUNUX0VRKDEuNWYsIGZwKTsKKworICAgIHZhbCA9IDE1LjI1ZjsKKyAgICBFWFBFQ1RfRVEoQzJWYWx1ZTo6RkxPQVQsIHZhbC50eXBlKCkpOworICAgIEVYUEVDVF9FUShmYWxzZSwgdmFsLmdldCgmaTMyKSk7CisgICAgRVhQRUNUX0VRKC0zMjE2LCBpMzIpOworICAgIEVYUEVDVF9FUShmYWxzZSwgdmFsLmdldCgmaTY0KSk7CisgICAgRVhQRUNUX0VRKC02NDMyLCBpNjQpOworICAgIEVYUEVDVF9FUShmYWxzZSwgdmFsLmdldCgmdTMyKSk7CisgICAgRVhQRUNUX0VRKDMyMTZ1LCB1MzIpOworICAgIEVYUEVDVF9FUShmYWxzZSwgdmFsLmdldCgmdTY0KSk7CisgICAgRVhQRUNUX0VRKDY0MzJ1LCB1NjQpOworICAgIEVYUEVDVF9FUSh0cnVlLCB2YWwuZ2V0KCZmcCkpOworICAgIEVYUEVDVF9FUSgxNS4yNWYsIGZwKTsKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3Rlc3RzL0MyU2FtcGxlQ29tcG9uZW50X3Rlc3QuY3BwIGIvbWVkaWEvY29kZWMyL3Rlc3RzL0MyU2FtcGxlQ29tcG9uZW50X3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkMzU0YWQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdGVzdHMvQzJTYW1wbGVDb21wb25lbnRfdGVzdC5jcHAKQEAgLTAsMCArMSw0MzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJTYW1wbGVDb21wb25lbnRfdGVzdCIKKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNkZWZpbmUgX19DMl9HRU5FUkFURV9HTE9CQUxfVkFSU19fCisjaW5jbHVkZSA8QzJDb21wb25lbnQuaD4KKyNpbmNsdWRlIDxDMkNvbmZpZy5oPgorI2luY2x1ZGUgPEMyRGVidWcuaD4KKyNpbmNsdWRlIDxDMkVudW0uaD4KKworI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CisKK2NsYXNzIEMyU2FtcGxlQ29tcG9uZW50VGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworfTsKKwordm9pZCBQcmludFRvKGNvbnN0IEMyRmllbGREZXNjcmlwdG9yICZmZCwgOjpzdGQ6Om9zdHJlYW0gKm9zKSB7CisgICAgdXNpbmcgRkQ9QzJGaWVsZERlc2NyaXB0b3I7CisgICAgc3dpdGNoIChmZC50eXBlKCkpIHsKKyAgICBjYXNlIEZEOjpJTlQzMjogKm9zIDw8ICJpMzIiOyBicmVhazsKKyAgICBjYXNlIEZEOjpJTlQ2NDogKm9zIDw8ICJpNjQiOyBicmVhazsKKyAgICBjYXNlIEZEOjpVSU5UMzI6ICpvcyA8PCAidTMyIjsgYnJlYWs7CisgICAgY2FzZSBGRDo6VUlOVDY0OiAqb3MgPDwgInU2NCI7IGJyZWFrOworICAgIGNhc2UgRkQ6OkZMT0FUOiAqb3MgPDwgImZsb2F0IjsgYnJlYWs7CisgICAgY2FzZSBGRDo6U1RSSU5HOiAqb3MgPDwgImNoYXIiOyBicmVhazsKKyAgICBjYXNlIEZEOjpCTE9COiAqb3MgPDwgInU4IjsgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgaWYgKGZkLnR5cGUoKSAmIEZEOjpTVFJVQ1RfRkxBRykgeworICAgICAgICAgICAgKm9zIDw8ICJzdHJ1Y3QtIiA8PCAoZmQudHlwZSgpICYgfkZEOjpTVFJVQ1RfRkxBRyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAqb3MgPDwgInR5cGUtIiA8PCBmZC50eXBlKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgKm9zIDw8ICIgIiA8PCBmZC5uYW1lKCk7CisgICAgaWYgKGZkLmV4dGVudCgpID4gMSkgeworICAgICAgICAqb3MgPDwgIlsiIDw8IGZkLmV4dGVudCgpIDw8ICJdIjsKKyAgICB9IGVsc2UgaWYgKGZkLmV4dGVudCgpID09IDApIHsKKyAgICAgICAgKm9zIDw8ICJbXSI7CisgICAgfQorICAgICpvcyA8PCAiICgiIDw8IGZkLl9tRmllbGRJZCA8PCAiKiIgPDwgZmQuZXh0ZW50KCkgPDwgIikiOworfQorCitDMkVOVU0oCisgICAgTWV0YWRhdGFUeXBlLCBpbnQzMl90LAorICAgIGtJbnZhbGlkID0gLTEsCisgICAga05vbmUgPSAwLAorICAgIGtHcmFsbG9jLAorICAgIGtOYXRpdmVIYW5kbGUsCisgICAga0FOYXRpdmVXaW5kb3csCisgICAga0NhbWVyYSwKKykKKworZW51bSB7CisgICAga1BhcmFtSW5kZXhWaWRlb0NvbmZpZyA9IDB4MTIzNCwKK307CisKK3N0cnVjdCBDMlZpZGVvQ29uZmlnU3RydWN0IHsKKyAgICBpbnQzMl90IHdpZHRoOworICAgIHVpbnQzMl90IGhlaWdodDsKKyAgICBNZXRhZGF0YVR5cGUgbWV0YWRhdGFUeXBlOworICAgIGludDMyX3Qgc3VwcG9ydGVkRm9ybWF0c1tdOworCisgICAgQzJWaWRlb0NvbmZpZ1N0cnVjdCgpIHt9CisKKyAgICBERUZJTkVfQU5EX0RFU0NSSUJFX0ZMRVhfQzJTVFJVQ1QoVmlkZW9Db25maWcsIHN1cHBvcnRlZEZvcm1hdHMpCisgICAgQzJGSUVMRCh3aWR0aCwgIndpZHRoIikKKyAgICBDMkZJRUxEKGhlaWdodCwgImhlaWdodCIpCisgICAgQzJGSUVMRChtZXRhZGF0YVR5cGUsICJtZXRhZGF0YS10eXBlIikKKyAgICBDMkZJRUxEKHN1cHBvcnRlZEZvcm1hdHMsICJmb3JtYXRzIikKK307CisKK3R5cGVkZWYgQzJQb3J0UGFyYW08QzJUdW5pbmcsIEMyVmlkZW9Db25maWdTdHJ1Y3Q+IEMyVmlkZW9Db25maWdQb3J0VHVuaW5nOworCitjbGFzcyBNeUNvbXBvbmVudEluc3RhbmNlIDogcHVibGljIEMyQ29tcG9uZW50SW50ZXJmYWNlIHsKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIEMyU3RyaW5nIGdldE5hbWUoKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIC8vLyBcdG9kbyB0aGlzIHNlZW1zIHRvbyBzcGVjaWZpYworICAgICAgICByZXR1cm4gInNhbXBsZS5pbnRlcmZhY2UiOworICAgIH07CisKKyAgICB2aXJ0dWFsIGMyX25vZGVfaWRfdCBnZXRJZCgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgLy8vIFx0b2RvIGhvdyBhcmUgdGhlc2Ugc2hhcmVkPworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNvbmZpZ192YigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiAmcGFyYW1zLAorICAgICAgICAgICAgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaywKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiogY29uc3QgZmFpbHVyZXMpIG92ZXJyaWRlIHsKKyAgICAgICAgKHZvaWQpcGFyYW1zOworICAgICAgICAodm9pZClmYWlsdXJlczsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlVHVubmVsX3NtKGMyX25vZGVfaWRfdCB0YXJnZXRDb21wb25lbnQpIG92ZXJyaWRlIHsKKyAgICAgICAgKHZvaWQpdGFyZ2V0Q29tcG9uZW50OworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXJ5X3ZiKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+ICZzdGFja1BhcmFtcywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiAmaGVhcFBhcmFtSW5kaWNlcywKKyAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2ssCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+KiBjb25zdCBoZWFwUGFyYW1zKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIGZvciAoQzJQYXJhbSogY29uc3QgcGFyYW0gOiBzdGFja1BhcmFtcykgeworICAgICAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgICAgICBpZiAoISpwYXJhbSkgeyAvLyBwYXJhbSBpcyBhbHJlYWR5IGludmFsaWQgLSByZW1lbWJlciBpdAorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBub3RlOiB0aGlzIGRvZXMgbm90IGhhbmRsZSBzdHJlYW0gcGFyYW1zIChzaG91bGQgdXNlIGluZGV4Li4uKQorICAgICAgICAgICAgaWYgKCFtTXlQYXJhbXMuY291bnQocGFyYW0tPmluZGV4KCkpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7IC8vIG5vdCBteSBwYXJhbQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDMlBhcmFtICYgbXlQYXJhbSA9IG1NeVBhcmFtcy5maW5kKHBhcmFtLT5pbmRleCgpKS0+c2Vjb25kOworICAgICAgICAgICAgaWYgKG15UGFyYW0uc2l6ZSgpICE9IHBhcmFtLT5zaXplKCkpIHsgLy8gaW5jb3JyZWN0IHNpemUKKyAgICAgICAgICAgICAgICBwYXJhbS0+aW52YWxpZGF0ZSgpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwYXJhbS0+dXBkYXRlRnJvbShteVBhcmFtKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoY29uc3QgQzJQYXJhbTo6SW5kZXggaW5kZXggOiBoZWFwUGFyYW1JbmRpY2VzKSB7CisgICAgICAgICAgICBpZiAobU15UGFyYW1zLmNvdW50KGluZGV4KSkgeworICAgICAgICAgICAgICAgIEMyUGFyYW0gJiBteVBhcmFtID0gbU15UGFyYW1zLmZpbmQoaW5kZXgpLT5zZWNvbmQ7CisgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+IHBhcmFtQ29weShDMlBhcmFtOjpDb3B5KG15UGFyYW0pKTsKKyAgICAgICAgICAgICAgICBoZWFwUGFyYW1zLT5wdXNoX2JhY2soc3RkOjptb3ZlKHBhcmFtQ29weSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHN0ZDo6dW5vcmRlcmVkX21hcDx1aW50MzJfdCwgQzJQYXJhbSAmPiBtTXlQYXJhbXM7CisKKyAgICBDMkNvbXBvbmVudERvbWFpbkluZm8gbURvbWFpbkluZm87CisKKyAgICBNeUNvbXBvbmVudEluc3RhbmNlKCkgeworICAgICAgICBtTXlQYXJhbXMuaW5zZXJ0KHttRG9tYWluSW5mby5pbmRleCgpLCBtRG9tYWluSW5mb30pOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcmVsZWFzZVR1bm5lbF9zbShjMl9ub2RlX2lkX3QgdGFyZ2V0Q29tcG9uZW50KSBvdmVycmlkZSB7CisgICAgICAgICh2b2lkKXRhcmdldENvbXBvbmVudDsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorCisgICAgY2xhc3MgTXlQYXJhbVJlZmxlY3RvciA6IHB1YmxpYyBDMlBhcmFtUmVmbGVjdG9yIHsKKyAgICAgICAgY29uc3QgTXlDb21wb25lbnRJbnN0YW5jZSAqaW5zdGFuY2U7CisKKyAgICBwdWJsaWM6CisgICAgICAgIE15UGFyYW1SZWZsZWN0b3IoY29uc3QgTXlDb21wb25lbnRJbnN0YW5jZSAqaSkgOiBpbnN0YW5jZShpKSB7IH0KKworICAgICAgICB2aXJ0dWFsIHN0ZDo6dW5pcXVlX3B0cjxDMlN0cnVjdERlc2NyaXB0b3I+IGRlc2NyaWJlKEMyUGFyYW06OkNvcmVJbmRleCBwYXJhbUluZGV4KSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgICAgICBzd2l0Y2ggKHBhcmFtSW5kZXgudHlwZUluZGV4KCkpIHsKKyAgICAgICAgICAgIGNhc2UgZGVjbHR5cGUoaW5zdGFuY2UtPm1Eb21haW5JbmZvKTo6Q09SRV9JTkRFWDoKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjxDMlN0cnVjdERlc2NyaXB0b3I+KG5ldyBDMlN0cnVjdERlc2NyaXB0b3J7CisgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLT5tRG9tYWluSW5mby50eXBlKCksCisgICAgICAgICAgICAgICAgICAgIGRlY2x0eXBlKGluc3RhbmNlLT5tRG9tYWluSW5mbyk6OkZpZWxkTGlzdCgpLAorICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0KKyAgICB9OworCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeVN1cHBvcnRlZFZhbHVlc192YigKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeT4gJmZpZWxkcywKKyAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2spIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIGZvciAoQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5ICZxdWVyeSA6IGZpZWxkcykgeworICAgICAgICAgICAgaWYgKHF1ZXJ5LmZpZWxkKCkgPT0gQzJQYXJhbUZpZWxkKCZtRG9tYWluSW5mbywgJkMyQ29tcG9uZW50RG9tYWluSW5mbzo6dmFsdWUpKSB7CisgICAgICAgICAgICAgICAgcXVlcnkudmFsdWVzID0gQzJGaWVsZFN1cHBvcnRlZFZhbHVlcygKKyAgICAgICAgICAgICAgICAgICAgZmFsc2UgLyogZmxhZyAqLywKKyAgICAgICAgICAgICAgICAgICAgJm1Eb21haW5JbmZvLnZhbHVlCisgICAgICAgICAgICAgICAgICAgIC8vLAorICAgICAgICAgICAgICAgICAgICAvL3soaW50MzJfdClDMkRvbWFpblZpZGVvfQorICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgcXVlcnkuc3RhdHVzID0gQzJfT0s7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHF1ZXJ5LnN0YXR1cyA9IEMyX0JBRF9JTkRFWDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+IGdldFBhcmFtUmVmbGVjdG9yKCkgY29uc3QgeworICAgICAgICByZXR1cm4gc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+KG5ldyBNeVBhcmFtUmVmbGVjdG9yKHRoaXMpKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXJ5U3VwcG9ydGVkUGFyYW1zX25iKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4gKiBjb25zdCBwYXJhbXMpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcGFyYW1zLT5wdXNoX2JhY2soc3RkOjptYWtlX3NoYXJlZDxDMlBhcmFtRGVzY3JpcHRvcj4oCisgICAgICAgICAgICAgICAgdHJ1ZSAvKiByZXF1aXJlZCAqLywgIl9kb21haW4iLCAmbURvbWFpbkluZm8pKTsKKyAgICAgICAgcGFyYW1zLT5wdXNoX2JhY2soc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPigKKyAgICAgICAgICAgICAgICBuZXcgQzJQYXJhbURlc2NyaXB0b3IodHJ1ZSAvKiByZXF1aXJlZCAqLywgIl9kb21haW4iLCAmbURvbWFpbkluZm8pKSk7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5NeUNvbXBvbmVudEluc3RhbmNlKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgRSwgYm9vbCBTPXN0ZDo6aXNfZW51bTxFPjo6dmFsdWU+CitzdHJ1Y3QgZ2V0dGVyIHsKKyAgICBpbnQzMl90IGdldChjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjpQcmltaXRpdmUgJnAsIGludDMyX3QqKSB7CisgICAgICAgIHJldHVybiBwLmkzMjsKKyAgICB9CisgICAgaW50NjRfdCBnZXQoY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6UHJpbWl0aXZlICZwLCBpbnQ2NF90KikgeworICAgICAgICByZXR1cm4gcC5pNjQ7CisgICAgfQorICAgIHVpbnQzMl90IGdldChjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjpQcmltaXRpdmUgJnAsIHVpbnQzMl90KikgeworICAgICAgICByZXR1cm4gcC51MzI7CisgICAgfQorICAgIHVpbnQ2NF90IGdldChjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjpQcmltaXRpdmUgJnAsIHVpbnQ2NF90KikgeworICAgICAgICByZXR1cm4gcC51NjQ7CisgICAgfQorICAgIGZsb2F0IGdldChjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjpQcmltaXRpdmUgJnAsIGZsb2F0KikgeworICAgICAgICByZXR1cm4gcC5mcDsKKyAgICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBFPgorc3RydWN0IGdldHRlcjxFLCB0cnVlPiB7CisgICAgIHR5cGVuYW1lIHN0ZDo6dW5kZXJseWluZ190eXBlPEU+Ojp0eXBlIGdldChjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjpQcmltaXRpdmUgJnAsIEUqKSB7CisgICAgICAgICB1c2luZyB1PXR5cGVuYW1lIHN0ZDo6dW5kZXJseWluZ190eXBlPEU+Ojp0eXBlOworICAgICAgICAgcmV0dXJuIGdldHRlcjx1PigpLmdldChwLCAodSopMCk7CisgICAgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQsIGJvb2wgRT1zdGQ6OmlzX2VudW08VD46OnZhbHVlPgorc3RydWN0IGxheF91bmRlcmx5aW5nX3R5cGUgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjp1bmRlcmx5aW5nX3R5cGU8VD46OnR5cGUgdHlwZTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgbGF4X3VuZGVybHlpbmdfdHlwZTxULCBmYWxzZT4geworICAgIHR5cGVkZWYgVCB0eXBlOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgRT4KK3R5cGVuYW1lIGxheF91bmRlcmx5aW5nX3R5cGU8RT46OnR5cGUgZ2V0KAorICAgICAgICBjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjpQcmltaXRpdmUgJnAsIEUqKSB7CisgICAgcmV0dXJuIGdldHRlcjxFPigpLmdldChwLCAoRSopMCk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+Cit2b2lkIGR1bXBGU1YoY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyAmc3YsIFQqdCkgeworICAgIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CisgICAgY291dCA8PCAoc3RkOjppc19lbnVtPFQ+Ojp2YWx1ZSA/IChzdGQ6OmlzX3NpZ25lZDx0eXBlbmFtZSBsYXhfdW5kZXJseWluZ190eXBlPFQ+Ojp0eXBlPjo6dmFsdWUgPyAiaSIgOiAidSIpCisgICAgICAgICAgICAgOiBzdGQ6OmlzX2ludGVncmFsPFQ+Ojp2YWx1ZSA/IHN0ZDo6aXNfc2lnbmVkPFQ+Ojp2YWx1ZSA/ICJpIiA6ICJ1IiA6ICJmIikKKyAgICAgICAgIDw8ICg4ICogc2l6ZW9mKFQpKTsKKyAgICBpZiAoc3YudHlwZSA9PSBzdi5SQU5HRSkgeworICAgICAgICBjb3V0IDw8ICIucmFuZ2UoIiA8PCBnZXQoc3YucmFuZ2UubWluLCB0KTsKKyAgICAgICAgaWYgKGdldChzdi5yYW5nZS5zdGVwLCB0KSAhPSBzdGQ6OmlzX2ludGVncmFsPFQ+Ojp2YWx1ZSkgeworICAgICAgICAgICAgY291dCA8PCAiOiIgPDwgZ2V0KHN2LnJhbmdlLnN0ZXAsIHQpOworICAgICAgICB9CisgICAgICAgIGlmIChnZXQoc3YucmFuZ2UubnVtLCB0KSAhPSAxIHx8IGdldChzdi5yYW5nZS5kZW5vbSwgdCkgIT0gMSkgeworICAgICAgICAgICAgY291dCA8PCAiOiIgPDwgZ2V0KHN2LnJhbmdlLm51bSwgdCkgPDwgIi8iIDw8IGdldChzdi5yYW5nZS5kZW5vbSwgdCk7CisgICAgICAgIH0KKyAgICAgICAgY291dCA8PCBnZXQoc3YucmFuZ2UubWF4LCB0KSA8PCAiKSI7CisgICAgfQorICAgIGlmIChzdi52YWx1ZXMuc2l6ZSgpKSB7CisgICAgICAgIGNvdXQgPDwgKHN2LnR5cGUgPT0gc3YuRkxBR1MgPyAiLmZsYWdzKCIgOiAiLmxpc3QoIik7CisgICAgICAgIGNvbnN0IGNoYXIgKnNlcCA9ICIiOworICAgICAgICBmb3IgKGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OlByaW1pdGl2ZSAmcCA6IHN2LnZhbHVlcykgeworICAgICAgICAgICAgY291dCA8PCBzZXAgPDwgZ2V0KHAsIHQpOworICAgICAgICAgICAgc2VwID0gIiwiOworICAgICAgICB9CisgICAgICAgIGNvdXQgPDwgIikiOworICAgIH0KKyAgICBjb3V0IDw8IGVuZGw7Cit9CisKK3ZvaWQgZHVtcFR5cGUoQzJQYXJhbTo6VHlwZSB0eXBlKSB7CisgICAgdXNpbmcgbmFtZXNwYWNlIHN0ZDsKKyAgICBjb3V0IDw8ICh0eXBlLmlzVmVuZG9yKCkgPyAiVmVuZG9yIiA6ICJDMiIpOworICAgIGlmICh0eXBlLmZvcklucHV0KCkpIHsKKyAgICAgICAgY291dCA8PCAiSW5wdXQiOworICAgIH0gZWxzZSBpZiAodHlwZS5mb3JPdXRwdXQoKSkgeworICAgICAgICBjb3V0IDw8ICJPdXRwdXQiOworICAgIH0gZWxzZSBpZiAodHlwZS5mb3JQb3J0KCkgJiYgIXR5cGUuZm9yU3RyZWFtKCkpIHsKKyAgICAgICAgY291dCA8PCAiUG9ydCI7CisgICAgfQorICAgIGlmICh0eXBlLmZvclN0cmVhbSgpKSB7CisgICAgICAgIGNvdXQgPDwgIlN0cmVhbSI7CisgICAgfQorCisgICAgaWYgKHR5cGUuaXNGbGV4aWJsZSgpKSB7CisgICAgICAgIGNvdXQgPDwgIkZsZXgiOworICAgIH0KKworICAgIGNvdXQgPDwgdHlwZS50eXBlSW5kZXgoKTsKKworICAgIHN3aXRjaCAodHlwZS5raW5kKCkpIHsKKyAgICBjYXNlIEMyUGFyYW06OklORk86IGNvdXQgPDwgIkluZm8iOyBicmVhazsKKyAgICBjYXNlIEMyUGFyYW06OlNFVFRJTkc6IGNvdXQgPDwgIlNldHRpbmciOyBicmVhazsKKyAgICBjYXNlIEMyUGFyYW06OlRVTklORzogY291dCA8PCAiVHVuaW5nIjsgYnJlYWs7CisgICAgY2FzZSBDMlBhcmFtOjpTVFJVQ1Q6IGNvdXQgPDwgIlN0cnVjdCI7IGJyZWFrOworICAgIGRlZmF1bHQ6IGNvdXQgPDwgIktpbmQiIDw8IChpbnQzMl90KXR5cGUua2luZCgpOyBicmVhazsKKyAgICB9Cit9CisKK3ZvaWQgZHVtcFR5cGUoQzJQYXJhbTo6Q29yZUluZGV4IHR5cGUpIHsKKyAgICB1c2luZyBuYW1lc3BhY2Ugc3RkOworICAgIGNvdXQgPDwgKHR5cGUuaXNWZW5kb3IoKSA/ICJWZW5kb3IiIDogIkMyIik7CisgICAgaWYgKHR5cGUuaXNGbGV4aWJsZSgpKSB7CisgICAgICAgIGNvdXQgPDwgIkZsZXgiOworICAgIH0KKworICAgIGNvdXQgPDwgdHlwZS50eXBlSW5kZXgoKSA8PCAiU3RydWN0IjsKK30KKwordm9pZCBkdW1wVHlwZShDMkZpZWxkRGVzY3JpcHRvcjo6dHlwZV90IHR5cGUpIHsKKyAgICB1c2luZyBuYW1lc3BhY2Ugc3RkOworICAgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OkJMT0I6IGNvdXQgPDwgImJsb2IgIjsgYnJlYWs7CisgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6RkxPQVQ6IGNvdXQgPDwgImZsb2F0ICI7IGJyZWFrOworICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OklOVDMyOiBjb3V0IDw8ICJpbnQzMl90ICI7IGJyZWFrOworICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OklOVDY0OiBjb3V0IDw8ICJpbnQ2NF90ICI7IGJyZWFrOworICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OlVJTlQzMjogY291dCA8PCAidWludDMyX3QgIjsgYnJlYWs7CisgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6VUlOVDY0OiBjb3V0IDw8ICJ1aW50NjRfdCAiOyBicmVhazsKKyAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpTVFJJTkc6IGNvdXQgPDwgImNoYXIgIjsgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgY291dCA8PCAic3RydWN0ICI7CisgICAgICAgIGR1bXBUeXBlKChDMlBhcmFtOjpUeXBlKXR5cGUpOworICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3ZvaWQgZHVtcFN0cnVjdChjb25zdCBDMlN0cnVjdERlc2NyaXB0b3IgJnNkKSB7CisgICAgdXNpbmcgbmFtZXNwYWNlIHN0ZDsKKyAgICBjb3V0IDw8ICJzdHJ1Y3QgIjsKKyAgICBkdW1wVHlwZShzZC5jb3JlSW5kZXgoKSk7CisgICAgY291dCA8PCAiIHsiIDw8IGVuZGw7CisgICAgLy9DMkZpZWxkRGVzY3JpcHRvciAmZjsKKyAgICBmb3IgKGNvbnN0IEMyRmllbGREZXNjcmlwdG9yICZmIDogc2QpIHsKKyAgICAgICAgUHJpbnRUbyhmLCAmY291dCk7CisgICAgICAgIGNvdXQgPDwgZW5kbDsKKworICAgICAgICBpZiAoZi5uYW1lZFZhbHVlcygpLnNpemUoKSkgeworICAgICAgICAgICAgY291dCA8PCAiLm5hbWVkKCI7CisgICAgICAgICAgICBjb25zdCBjaGFyICpzZXAgPSAiIjsKKyAgICAgICAgICAgIGZvciAoY29uc3QgQzJGaWVsZERlc2NyaXB0b3I6Ok5hbWVkVmFsdWVUeXBlICZwIDogZi5uYW1lZFZhbHVlcygpKSB7CisgICAgICAgICAgICAgICAgY291dCA8PCBzZXAgPDwgcC5maXJzdCA8PCAiPSI7CisgICAgICAgICAgICAgICAgc3dpdGNoIChmLnR5cGUoKSkgeworICAgICAgICAgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OklOVDMyOiBjb3V0IDw8IGdldChwLnNlY29uZCwgKGludDMyX3QgKikwKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6SU5UNjQ6IGNvdXQgPDwgZ2V0KHAuc2Vjb25kLCAoaW50NjRfdCAqKTApOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpVSU5UMzI6IGNvdXQgPDwgZ2V0KHAuc2Vjb25kLCAodWludDMyX3QgKikwKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6VUlOVDY0OiBjb3V0IDw8IGdldChwLnNlY29uZCwgKHVpbnQ2NF90ICopMCk7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OkZMT0FUOiBjb3V0IDw8IGdldChwLnNlY29uZCwgKGZsb2F0ICopMCk7IGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGNvdXQgPDwgIj8/PyI7IGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzZXAgPSAiLCI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb3V0IDw8ICIpIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNvdXQgPDwgIn07IiA8PCBlbmRsOworfQorCit2b2lkIGR1bXBEZXNjKGNvbnN0IEMyUGFyYW1EZXNjcmlwdG9yICZwZCkgeworICAgIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CisgICAgaWYgKHBkLmlzUmVxdWlyZWQoKSkgeworICAgICAgICBjb3V0IDw8ICJyZXF1aXJlZCAiOworICAgIH0KKyAgICBpZiAocGQuaXNQZXJzaXN0ZW50KCkpIHsKKyAgICAgICAgY291dCA8PCAicGVyc2lzdGVudCAiOworICAgIH0KKyAgICBjb3V0IDw8ICJzdHJ1Y3QgIjsKKyAgICBkdW1wVHlwZShDMlBhcmFtOjpUeXBlKHBkLmluZGV4KCkudHlwZSgpKSk7CisgICAgY291dCA8PCAiICIgPDwgcGQubmFtZSgpIDw8ICI7IiA8PCBlbmRsOworfQorCitURVNUX0YoQzJTYW1wbGVDb21wb25lbnRUZXN0LCBSZWZsZWN0b3JUZXN0KSB7CisgICAgQzJDb21wb25lbnREb21haW5JbmZvIGRvbWFpbkluZm87CisgICAgc3RkOjpzaGFyZWRfcHRyPE15Q29tcG9uZW50SW5zdGFuY2U+IG15Q29tcChuZXcgTXlDb21wb25lbnRJbnN0YW5jZSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiBjb21wID0gbXlDb21wOworCisgICAgc3RkOjp1bmlxdWVfcHRyPEMyU3RydWN0RGVzY3JpcHRvcj4gZGVzY3sKKyAgICAgICAgbXlDb21wLT5nZXRQYXJhbVJlZmxlY3RvcigpLT5kZXNjcmliZShDMkNvbXBvbmVudERvbWFpbkluZm86OkNPUkVfSU5ERVgpfTsKKyAgICBkdW1wU3RydWN0KCpkZXNjKTsKKworICAgIHN0ZDo6dmVjdG9yPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeT4gcXVlcnkgPSB7CisgICAgICAgIHsgQzJQYXJhbUZpZWxkKCZkb21haW5JbmZvLCAmQzJDb21wb25lbnREb21haW5JbmZvOjp2YWx1ZSksCisgICAgICAgICAgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5OjpDVVJSRU5UIH0sCisgICAgICAgIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeShDMlBhcmFtRmllbGQoJmRvbWFpbkluZm8sICZDMkNvbXBvbmVudERvbWFpbkluZm86OnZhbHVlKSwKKyAgICAgICAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk6OkNVUlJFTlQpLAorICAgICAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk6OkN1cnJlbnQoQzJQYXJhbUZpZWxkKCZkb21haW5JbmZvLCAmQzJDb21wb25lbnREb21haW5JbmZvOjp2YWx1ZSkpLAorICAgIH07CisKKyAgICBFWFBFQ1RfRVEoQzJfT0ssIGNvbXAtPnF1ZXJ5U3VwcG9ydGVkVmFsdWVzX3ZiKHF1ZXJ5LCBDMl9ET05UX0JMT0NLKSk7CisKKyAgICBmb3IgKGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeSAmcSA6IHF1ZXJ5KSB7CisgICAgICAgIGR1bXBGU1YocS52YWx1ZXMsICZkb21haW5JbmZvLnZhbHVlKTsKKyAgICB9Cit9CisKK1RFU1RfRihDMlNhbXBsZUNvbXBvbmVudFRlc3QsIEZpZWxkU3VwcG9ydGVkVmFsdWVzVGVzdCkgeworICAgIHR5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMkluZm8sIEMyVWludDMyVmFsdWUsIDA+IFVpbnQzMlRlc3RJbmZvOworICAgIFVpbnQzMlRlc3RJbmZvIHQ7CisgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZFN1cHBvcnRlZFZhbHVlcz4gdmFsdWVzOworICAgIHZhbHVlcy5wdXNoX2JhY2soQzJGaWVsZFN1cHBvcnRlZFZhbHVlcygwLCAxMCwgMSkpOyAgLy8gbWluLCBtYXgsIHN0ZXAKKyAgICB2YWx1ZXMucHVzaF9iYWNrKEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMoMSwgNjQsIDIsIDEpKTsgIC8vIG1pbiwgbWF4LCBudW0sIGRlbgorICAgIHZhbHVlcy5wdXNoX2JhY2soQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyhmYWxzZSwgezEsIDIsIDN9KSk7ICAvLyBmbGFncywgc3RkOjppbml0aWFsaXplcl9saXN0CisgICAgdWludDMyX3QgdmFsW10gPSB7MSwgMywgNSwgN307CisgICAgc3RkOjp2ZWN0b3I8dWludDMyX3Q+IHYoc3RkOjpiZWdpbih2YWwpLCBzdGQ6OmVuZCh2YWwpKTsKKyAgICB2YWx1ZXMucHVzaF9iYWNrKEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMoZmFsc2UsIHYpKTsgIC8vIGZsYWdzLCBzdGQ6OnZlY3RvcgorCisgICAgZm9yIChjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzICZzdiA6IHZhbHVlcykgeworICAgICAgICBkdW1wRlNWKHN2LCAmdC52YWx1ZSk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdGVzdHMvQzJVdGlsVGVzdC5jcHAgYi9tZWRpYS9jb2RlYzIvdGVzdHMvQzJVdGlsVGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTljZDMxMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi90ZXN0cy9DMlV0aWxUZXN0LmNwcApAQCAtMCwwICsxLDExOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJVdGlsVGVzdCIKKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNkZWZpbmUgX19DMl9HRU5FUkFURV9HTE9CQUxfVkFSU19fCisjaW5jbHVkZSA8X0MyTWFjcm9VdGlscy5oPgorI2luY2x1ZGUgPEMyRW51bS5oPgorCisvKiogXGZpbGUKKyAqIFRlc3RzIGZvciB2bmRrL3V0aWwuCisgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIF9DMk1hY3JvVXRpbHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpY19hc3NlcnQoMCA9PSBfQzJfQVJHQygpLCAic2hvdWxkIGJlIDAiKTsKK3N0YXRpY19hc3NlcnQoMSA9PSBfQzJfQVJHQygxKSwgInNob3VsZCBiZSAxIik7CitzdGF0aWNfYXNzZXJ0KDIgPT0gX0MyX0FSR0MoMSwgMiksICJzaG91bGQgYmUgMiIpOworc3RhdGljX2Fzc2VydCg2NCA9PSBfQzJfQVJHQygKKyAgICAgICAgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgMTYsIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsIDIzLCAyNCwgMjUsCisgICAgICAgIDI2LCAyNywgMjgsIDI5LCAzMCwgMzEsIDMyLCAzMywgMzQsIDM1LCAzNiwgMzcsIDM4LCAzOSwgNDAsIDQxLCA0MiwgNDMsIDQ0LCA0NSwgNDYsIDQ3LCA0OCwKKyAgICAgICAgNDksIDUwLCA1MSwgNTIsIDUzLCA1NCwgNTUsIDU2LCA1NywgNTgsIDU5LCA2MCwgNjEsIDYyLCA2MywgNjQpLCAic2hvdWxkIGJlIDY0Iik7CisKK3N0YXRpY19hc3NlcnQoMCA9PSBfQzJfQVJHQygsKSwgInNob3VsZCBiZSAwIik7CitzdGF0aWNfYXNzZXJ0KDEgPT0gX0MyX0FSR0MoMSwpLCAic2hvdWxkIGJlIDEiKTsKK3N0YXRpY19hc3NlcnQoMiA9PSBfQzJfQVJHQygxLCAyLCksICJzaG91bGQgYmUgMiIpOworc3RhdGljX2Fzc2VydCg2NCA9PSBfQzJfQVJHQygKKyAgICAgICAgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgMTYsIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsIDIzLCAyNCwgMjUsCisgICAgICAgIDI2LCAyNywgMjgsIDI5LCAzMCwgMzEsIDMyLCAzMywgMzQsIDM1LCAzNiwgMzcsIDM4LCAzOSwgNDAsIDQxLCA0MiwgNDMsIDQ0LCA0NSwgNDYsIDQ3LCA0OCwKKyAgICAgICAgNDksIDUwLCA1MSwgNTIsIDUzLCA1NCwgNTUsIDU2LCA1NywgNTgsIDU5LCA2MCwgNjEsIDYyLCA2MywgNjQsKSwgInNob3VsZCBiZSA2NCIpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIF9DMkVudW1VdGlscyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK2NsYXNzIEMyVXRpbFRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKK307CisKK0MyRU5VTShFbnVtMSwgdWludDMyX3QsCisgICAgRW51bTFWYWx1ZTEsCisgICAgRW51bTFWYWx1ZTIsCisgICAgRW51bTFWYWx1ZTQgPSBFbnVtMVZhbHVlMiArIDIsCispOworCitDMkVOVU1fQ1VTVE9NX1BSRUZJWChFbnVtMiwgdWludDMyX3QsICJFbnVtIiwKKyAgICBFbnVtMlZhbHVlMSwKKyAgICBFbnVtMlZhbHVlMiwKKyAgICBFbnVtMlZhbHVlNCA9IEVudW0xVmFsdWUyICsgMiwKKyk7CisKK0MyRU5VTV9DVVNUT01fTkFNRVMoRW51bTMsIHVpbnQ4X3QsCisgICAgKHsgeyAidmFsdWUxIiwgRW51bTNWYWx1ZTEgfSwKKyAgICAgICB7ICJ2YWx1ZTIiLCBFbnVtM1ZhbHVlMiB9LAorICAgICAgIHsgInZhbHVlNCIsIEVudW0zVmFsdWU0IH0sCisgICAgICAgeyAiaW52YWxpZCIsIEludmFsaWQgfSB9KSwKKyAgICBFbnVtM1ZhbHVlMSwKKyAgICBFbnVtM1ZhbHVlMiwKKyAgICBFbnVtM1ZhbHVlNCA9IEVudW0zVmFsdWUyICsgMiwKKyAgICBJbnZhbGlkLAorKTsKKworVEVTVF9GKEMyVXRpbFRlc3QsIEVudW1VdGlsc1Rlc3QpIHsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8QzJTdHJpbmcsIEVudW0zPj4gcGFpcnMgKCB7IHsgInZhbHVlMSIsIEVudW0zVmFsdWUxIH0sCisgICAgICB7ICJ2YWx1ZTIiLCBFbnVtM1ZhbHVlMiB9LAorICAgICAgeyAidmFsdWU0IiwgRW51bTNWYWx1ZTQgfSwKKyAgICAgIHsgImludmFsaWQiLCBJbnZhbGlkIH0gfSk7CisgICAgRW51bTMgZTM7CisgICAgQzJGaWVsZERlc2NyaXB0b3I6Om5hbWVkVmFsdWVzRm9yKGUzKTsKKworICAgIC8vIHVwcGVyIGNhc2UKKyAgICBFWFBFQ1RfRVEoInllcyIsIF9DMkVudW1VdGlsczo6Y2FtZWxDYXNlVG9EYXNoZWQoIllFUyIpKTsKKyAgICBFWFBFQ1RfRVEoIm5vIiwgX0MyRW51bVV0aWxzOjpjYW1lbENhc2VUb0Rhc2hlZCgiTk8iKSk7CisgICAgRVhQRUNUX0VRKCJ5ZXMtbm8iLCBfQzJFbnVtVXRpbHM6OmNhbWVsQ2FzZVRvRGFzaGVkKCJZRVNfTk8iKSk7CisgICAgRVhQRUNUX0VRKCJ5ZXMtbm8iLCBfQzJFbnVtVXRpbHM6OmNhbWVsQ2FzZVRvRGFzaGVkKCJZRVNfX05PIikpOworICAgIEVYUEVDVF9FUSgiYTJkcCIsIF9DMkVudW1VdGlsczo6Y2FtZWxDYXNlVG9EYXNoZWQoIkEyRFAiKSk7CisgICAgRVhQRUNUX0VRKCJtcDItdHMiLCBfQzJFbnVtVXRpbHM6OmNhbWVsQ2FzZVRvRGFzaGVkKCJNUDJfVFMiKSk7CisgICAgRVhQRUNUX0VRKCJibG9jay0yZCIsIF9DMkVudW1VdGlsczo6Y2FtZWxDYXNlVG9EYXNoZWQoIkJMT0NLXzJEIikpOworICAgIEVYUEVDVF9FUSgibXBlZy0yLXRzIiwgX0MyRW51bVV0aWxzOjpjYW1lbENhc2VUb0Rhc2hlZCgiTVBFR18yX1RTIikpOworICAgIEVYUEVDVF9FUSgiX2hpZGRlbi12YWx1ZSIsIF9DMkVudW1VdGlsczo6Y2FtZWxDYXNlVG9EYXNoZWQoIl9ISURERU5fVkFMVUUiKSk7CisgICAgRVhQRUNUX0VRKCJfX2hpZGRlbi12YWx1ZTIiLCBfQzJFbnVtVXRpbHM6OmNhbWVsQ2FzZVRvRGFzaGVkKCJfX0hJRERFTl9WQUxVRTIiKSk7CisgICAgRVhQRUNUX0VRKCJfX2hpZGRlbi12YWx1ZS0yIiwgX0MyRW51bVV0aWxzOjpjYW1lbENhc2VUb0Rhc2hlZCgiX19ISURERU5fVkFMVUVfMiIpKTsKKworICAgIC8vIGNhbWVsIGNhc2UKKyAgICBFWFBFQ1RfRVEoInllcyIsIF9DMkVudW1VdGlsczo6Y2FtZWxDYXNlVG9EYXNoZWQoIlllcyIpKTsKKyAgICBFWFBFQ1RfRVEoIm5vIiwgX0MyRW51bVV0aWxzOjpjYW1lbENhc2VUb0Rhc2hlZCgiTm8iKSk7CisgICAgRVhQRUNUX0VRKCJ5ZXMtbm8iLCBfQzJFbnVtVXRpbHM6OmNhbWVsQ2FzZVRvRGFzaGVkKCJZZXNObyIpKTsKKyAgICBFWFBFQ1RfRVEoInllcy1ubyIsIF9DMkVudW1VdGlsczo6Y2FtZWxDYXNlVG9EYXNoZWQoIlllc19ObyIpKTsKKyAgICBFWFBFQ1RfRVEoIm1wMi10cyIsIF9DMkVudW1VdGlsczo6Y2FtZWxDYXNlVG9EYXNoZWQoIk1QMlRzIikpOworICAgIEVYUEVDVF9FUSgiYmxvY2stMmQiLCBfQzJFbnVtVXRpbHM6OmNhbWVsQ2FzZVRvRGFzaGVkKCJCbG9jazJEIikpOworICAgIEVYUEVDVF9FUSgibXBlZy0yLXRzIiwgX0MyRW51bVV0aWxzOjpjYW1lbENhc2VUb0Rhc2hlZCgiTXBlZzJ0cyIpKTsKKyAgICBFWFBFQ1RfRVEoIl9oaWRkZW4tdmFsdWUiLCBfQzJFbnVtVXRpbHM6OmNhbWVsQ2FzZVRvRGFzaGVkKCJfSGlkZGVuVmFsdWUiKSk7CisgICAgRVhQRUNUX0VRKCJfX2hpZGRlbi12YWx1ZS0yIiwgX0MyRW51bVV0aWxzOjpjYW1lbENhc2VUb0Rhc2hlZCgiX19IaWRkZW5WYWx1ZTIiKSk7CisKKyAgICAvLyBtaXhlZCBjYXNlCisgICAgRVhQRUNUX0VRKCJtcDJ0LXMiLCBfQzJFbnVtVXRpbHM6OmNhbWVsQ2FzZVRvRGFzaGVkKCJNUDJUX3MiKSk7CisgICAgRVhQRUNUX0VRKCJibG9jay0yZCIsIF9DMkVudW1VdGlsczo6Y2FtZWxDYXNlVG9EYXNoZWQoIkJsb2NrXzJEIikpOworICAgIEVYUEVDVF9FUSgiYmxvY2stMi1kIiwgX0MyRW51bVV0aWxzOjpjYW1lbENhc2VUb0Rhc2hlZCgiQmxvY2syX0QiKSk7CisgICAgRVhQRUNUX0VRKCJtcGVnLTItdHMiLCBfQzJFbnVtVXRpbHM6OmNhbWVsQ2FzZVRvRGFzaGVkKCJNcGVnXzJ0cyIpKTsKKyAgICBFWFBFQ1RfRVEoIm1wZWctMi10cyIsIF9DMkVudW1VdGlsczo6Y2FtZWxDYXNlVG9EYXNoZWQoIk1wZWdfMl9UUyIpKTsKKyAgICBFWFBFQ1RfRVEoIl9oaWRkZW4tdmFsdWUiLCBfQzJFbnVtVXRpbHM6OmNhbWVsQ2FzZVRvRGFzaGVkKCJfSGlkZGVuX19WQUxVRSIpKTsKKyAgICBFWFBFQ1RfRVEoIl9faGlkZGVuLXZhbHVlLTIiLCBfQzJFbnVtVXRpbHM6OmNhbWVsQ2FzZVRvRGFzaGVkKCJfX0hpZGRlblZhbHVlXzIiKSk7CisgICAgRVhQRUNUX0VRKCJfMiIsIF9DMkVudW1VdGlsczo6Y2FtZWxDYXNlVG9EYXNoZWQoIl8yIikpOworICAgIEVYUEVDVF9FUSgiX18yMyIsIF9DMkVudW1VdGlsczo6Y2FtZWxDYXNlVG9EYXNoZWQoIl9fMjMiKSk7Cit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi90ZXN0cy9DMl90ZXN0LmNwcCBiL21lZGlhL2NvZGVjMi90ZXN0cy9DMl90ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWRhOWY5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3Rlc3RzL0MyX3Rlc3QuY3BwCkBAIC0wLDAgKzEsMTU5IEBACisvKgorICogQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyX3Rlc3QiCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSA8QzIuaD4KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFNUQVRJQyBURVNUUyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKwordGVtcGxhdGU8aW50IE4+CitzdHJ1Y3QgYzJfY29uc3RfY2hlY2tlcgoreworICAgIGlubGluZSBjb25zdGV4cHIgc3RhdGljIGludCBudW0oKSB7IHJldHVybiBOOyB9Cit9OworCitjb25zdGV4cHIgYXV0byBtaW5faTMyX2kzMiA9IGMyX21pbihpbnQzMl90KDEpLCBpbnQzMl90KDIpKTsKK3N0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPGRlY2x0eXBlKG1pbl9pMzJfaTMyKSwgY29uc3QgaW50MzJfdD46OnZhbHVlLCAic2hvdWxkIGJlIGludDMyX3QiKTsKK2NvbnN0ZXhwciBhdXRvIG1pbl9pMzJfaTY0ID0gYzJfbWluKGludDMyX3QoMyksIGludDY0X3QoMikpOworc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8ZGVjbHR5cGUobWluX2kzMl9pNjQpLCBjb25zdCBpbnQ2NF90Pjo6dmFsdWUsICJzaG91bGQgYmUgaW50NjRfdCIpOworY29uc3RleHByIGF1dG8gbWluX2k4X2kzMiA9IGMyX21pbihpbnQ4X3QoMHhmZiksIGludDMyX3QoMHhmZmZmZmZmZikpOworc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8ZGVjbHR5cGUobWluX2k4X2kzMiksIGNvbnN0IGludDMyX3Q+Ojp2YWx1ZSwgInNob3VsZCBiZSBpbnQzMl90Iik7CisKK3N0YXRpY19hc3NlcnQoYzJfY29uc3RfY2hlY2tlcjxtaW5faTMyX2kzMj46Om51bSgpID09IDEsICJzaG91bGQgYmUgMSIpOworc3RhdGljX2Fzc2VydChjMl9jb25zdF9jaGVja2VyPG1pbl9pMzJfaTY0Pjo6bnVtKCkgPT0gMiwgInNob3VsZCBiZSAyIik7CitzdGF0aWNfYXNzZXJ0KGMyX2NvbnN0X2NoZWNrZXI8bWluX2k4X2kzMj46Om51bSgpID09IDB4ZmZmZmZmZmYsICJzaG91bGQgYmUgMHhmZmZmZmZmZiIpOworCitjb25zdGV4cHIgYXV0byBtaW5fdTMyX3UzMiA9IGMyX21pbih1aW50MzJfdCgxKSwgdWludDMyX3QoMikpOworc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8ZGVjbHR5cGUobWluX3UzMl91MzIpLCBjb25zdCB1aW50MzJfdD46OnZhbHVlLCAic2hvdWxkIGJlIHVpbnQzMl90Iik7Citjb25zdGV4cHIgYXV0byBtaW5fdTMyX3U2NCA9IGMyX21pbih1aW50MzJfdCgzKSwgdWludDY0X3QoMikpOworc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8ZGVjbHR5cGUobWluX3UzMl91NjQpLCBjb25zdCB1aW50MzJfdD46OnZhbHVlLCAic2hvdWxkIGJlIHVpbnQzMl90Iik7Citjb25zdGV4cHIgYXV0byBtaW5fdTMyX3U4ID0gYzJfbWluKHVpbnQzMl90KDB4ZmZmZmZmZmYpLCB1aW50OF90KDB4ZmYpKTsKK3N0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPGRlY2x0eXBlKG1pbl91MzJfdTgpLCBjb25zdCB1aW50OF90Pjo6dmFsdWUsICJzaG91bGQgYmUgdWludDhfdCIpOworCitzdGF0aWNfYXNzZXJ0KGMyX2NvbnN0X2NoZWNrZXI8bWluX3UzMl91MzI+OjpudW0oKSA9PSAxLCAic2hvdWxkIGJlIDEiKTsKK3N0YXRpY19hc3NlcnQoYzJfY29uc3RfY2hlY2tlcjxtaW5fdTMyX3U2ND46Om51bSgpID09IDIsICJzaG91bGQgYmUgMiIpOworc3RhdGljX2Fzc2VydChjMl9jb25zdF9jaGVja2VyPG1pbl91MzJfdTg+OjpudW0oKSA9PSAweGZmLCAic2hvdWxkIGJlIDB4ZmYiKTsKKworY29uc3RleHByIGF1dG8gbWF4X2kzMl9pMzIgPSBjMl9tYXgoaW50MzJfdCgxKSwgaW50MzJfdCgyKSk7CitzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxkZWNsdHlwZShtYXhfaTMyX2kzMiksIGNvbnN0IGludDMyX3Q+Ojp2YWx1ZSwgInNob3VsZCBiZSBpbnQzMl90Iik7Citjb25zdGV4cHIgYXV0byBtYXhfaTMyX2k2NCA9IGMyX21heChpbnQzMl90KDMpLCBpbnQ2NF90KDIpKTsKK3N0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPGRlY2x0eXBlKG1heF9pMzJfaTY0KSwgY29uc3QgaW50NjRfdD46OnZhbHVlLCAic2hvdWxkIGJlIGludDY0X3QiKTsKK2NvbnN0ZXhwciBhdXRvIG1heF9pOF9pMzIgPSBjMl9tYXgoaW50OF90KDB4ZmYpLCBpbnQzMl90KDB4ZmZmZmZmZmYpKTsKK3N0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPGRlY2x0eXBlKG1heF9pOF9pMzIpLCBjb25zdCBpbnQzMl90Pjo6dmFsdWUsICJzaG91bGQgYmUgaW50MzJfdCIpOworCitzdGF0aWNfYXNzZXJ0KGMyX2NvbnN0X2NoZWNrZXI8bWF4X2kzMl9pMzI+OjpudW0oKSA9PSAyLCAic2hvdWxkIGJlIDIiKTsKK3N0YXRpY19hc3NlcnQoYzJfY29uc3RfY2hlY2tlcjxtYXhfaTMyX2k2ND46Om51bSgpID09IDMsICJzaG91bGQgYmUgMyIpOworc3RhdGljX2Fzc2VydChjMl9jb25zdF9jaGVja2VyPG1heF9pOF9pMzI+OjpudW0oKSA9PSAweGZmZmZmZmZmLCAic2hvdWxkIGJlIDB4ZmZmZmZmZmYiKTsKKworY29uc3RleHByIGF1dG8gbWF4X3UzMl91MzIgPSBjMl9tYXgodWludDMyX3QoMSksIHVpbnQzMl90KDIpKTsKK3N0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPGRlY2x0eXBlKG1heF91MzJfdTMyKSwgY29uc3QgdWludDMyX3Q+Ojp2YWx1ZSwgInNob3VsZCBiZSB1aW50MzJfdCIpOworY29uc3RleHByIGF1dG8gbWF4X3UzMl91NjQgPSBjMl9tYXgodWludDMyX3QoMyksIHVpbnQ2NF90KDIpKTsKK3N0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPGRlY2x0eXBlKG1heF91MzJfdTY0KSwgY29uc3QgdWludDY0X3Q+Ojp2YWx1ZSwgInNob3VsZCBiZSB1aW50NjRfdCIpOworY29uc3RleHByIGF1dG8gbWF4X3UzMl91OCA9IGMyX21heCh1aW50MzJfdCgweDdmZmZmZmZmKSwgdWludDhfdCgweGZmKSk7CitzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxkZWNsdHlwZShtYXhfdTMyX3U4KSwgY29uc3QgdWludDMyX3Q+Ojp2YWx1ZSwgInNob3VsZCBiZSB1aW50MzJfdCIpOworCitzdGF0aWNfYXNzZXJ0KGMyX2NvbnN0X2NoZWNrZXI8bWF4X3UzMl91MzI+OjpudW0oKSA9PSAyLCAic2hvdWxkIGJlIDIiKTsKK3N0YXRpY19hc3NlcnQoYzJfY29uc3RfY2hlY2tlcjxtYXhfdTMyX3U2ND46Om51bSgpID09IDMsICJzaG91bGQgYmUgMyIpOworc3RhdGljX2Fzc2VydChjMl9jb25zdF9jaGVja2VyPG1heF91MzJfdTg+OjpudW0oKSA9PSAweDdmZmZmZmZmLCAic2hvdWxkIGJlIDB4N2ZmZmZmZmYiKTsKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IENPVU5URVIgVEVTVFMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKK3ZvaWQgYzJfY250cl9zdGF0aWNfdGVzdCgpIHsKKyAgICAvLyBzYW5pdHkgY2hlY2tzIGZvciBjb25zdHJ1Y3Rpb24vYXNzaWdubWVudAorICAgIGNvbnN0ZXhwciBjMl9jbnRyMzJfdCBjMzJfYSgxMjMpOworICAgIGNvbnN0ZXhwciBjMl9jbnRyNjRfdCBjNjRfYSgtNDU2KTsKKyAgICBjMl9jbnRyMzJfdCBjMzJfYiBfX3VudXNlZCA9IGM2NF9hOworICAgIC8vIGMzMl9iID0gNjQuOyAvLyBESVNBTExPV0VECisgICAgLy8gYzJfY250cjY0X3QgYzY0X2IgPSBjMzJfYTsgLy8gRElTQUxMT1dFRAorCisgICAgLy8gc2FuaXR5IGNoZWNrcyBmb3Igc29tZSBjb25zdGV4cHIgb3BlcmF0b3JzCisgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8ZGVjbHR5cGUoYzMyX2EgKyBjNjRfYSksIGRlY2x0eXBlKGM2NF9hICsgYzMyX2EpPjo6dmFsdWUsICIrIHNob3VsZCByZXN1bHQgc2FtZSB0eXBlIik7CisgICAgc3RhdGljX2Fzc2VydChjMzJfYSArIGM2NF9hID09IGMyX2NudHIzMl90KC0zMzMpLCAiMTIzICsgLTQ1NiA9IC0zMzMiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KGMzMl9hICsgYzMyX2EgPT0gYzJfY250cjMyX3QoMjQ2KSwgIjEyMyArIDEyMyA9IDI0NiIpOworICAgIHN0YXRpY19hc3NlcnQoYzY0X2EgKyBjMzJfYSA9PSBjMl9jbnRyMzJfdCgtMzMzKSwgIi00NTYgKyAxMjMgPSA1NzkiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxkZWNsdHlwZShjMzJfYSArIDEpLCBkZWNsdHlwZSgxICsgYzMyX2EpPjo6dmFsdWUsICIrIHNob3VsZCByZXN1bHQgc2FtZSB0eXBlIik7CisgICAgc3RhdGljX2Fzc2VydChjMzJfYSArIDQ1NiA9PSBjMl9jbnRyMzJfdCg1NzkpLCAiMTIzICsgNDU2ID0gNTc5Iik7CisgICAgc3RhdGljX2Fzc2VydCg0NTYgKyBjNjRfYSA9PSBjMl9jbnRyNjRfdCgwKSwgIjQ1NiArIC00NTYgPSAwIik7CisgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8ZGVjbHR5cGUoYzMyX2EgLSBjNjRfYSksIGRlY2x0eXBlKGM2NF9hIC0gYzMyX2EpPjo6dmFsdWUsICItIHNob3VsZCByZXN1bHQgc2FtZSB0eXBlIik7CisgICAgc3RhdGljX2Fzc2VydChjMzJfYSAtIGM2NF9hID09IGMyX2NudHIzMl90KDU3OSksICIxMjMgLSAtNDU2ID0gNTc5Iik7CisgICAgc3RhdGljX2Fzc2VydChjMzJfYSAtIGMzMl9hID09IGMyX2NudHIzMl90KDApLCAiMTIzIC0gMTIzID0gMCIpOworICAgIHN0YXRpY19hc3NlcnQoYzY0X2EgLSBjMzJfYSA9PSBjMl9jbnRyMzJfdCgtNTc5KSwgIi00NTYgLSAxMjMgPSAtNTc5Iik7CisgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8ZGVjbHR5cGUoYzMyX2EgLSAxKSwgZGVjbHR5cGUoMSAtIGMzMl9hKT46OnZhbHVlLCAiLSBzaG91bGQgcmVzdWx0IHNhbWUgdHlwZSIpOworICAgIHN0YXRpY19hc3NlcnQoYzMyX2EgLSA0NTYgPT0gYzJfY250cjMyX3QoLTMzMyksICIxMjMgLSA0NTYgPSAtMzMzIik7CisgICAgc3RhdGljX2Fzc2VydCg0NTYgLSBjNjRfYSA9PSBjMl9jbnRyNjRfdCg5MTIpLCAiNDU2IC0gLTQ1NiA9IDkxMiIpOworICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPGRlY2x0eXBlKGMzMl9hICogYzY0X2EpLCBkZWNsdHlwZShjNjRfYSAqIGMzMl9hKT46OnZhbHVlLCAiKiBzaG91bGQgcmVzdWx0IHNhbWUgdHlwZSIpOworICAgIHN0YXRpY19hc3NlcnQoYzMyX2EgKiBjNjRfYSA9PSBjMl9jbnRyMzJfdCgtNTYwODgpLCAiMTIzICogLTQ1NiA9IC01NjA4OCIpOworICAgIHN0YXRpY19hc3NlcnQoYzMyX2EgKiBjMzJfYSA9PSBjMl9jbnRyMzJfdCgxNTEyOSksICIxMjMgKiAxMjMgPSAxNTEyOSIpOworICAgIHN0YXRpY19hc3NlcnQoYzY0X2EgKiBjMzJfYSA9PSBjMl9jbnRyMzJfdCgtNTYwODgpLCAiLTQ1NiAqIDEyMyA9IC01NjA4OCIpOworICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPGRlY2x0eXBlKGMzMl9hICogMSksIGRlY2x0eXBlKDEgKiBjMzJfYSk+Ojp2YWx1ZSwgIiogc2hvdWxkIHJlc3VsdCBzYW1lIHR5cGUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KGMzMl9hICogNDU2ID09IGMyX2NudHIzMl90KDU2MDg4KSwgIjEyMyAqIDQ1NiA9IDU2MDg4Iik7CisgICAgc3RhdGljX2Fzc2VydCg0NTYgKiBjNjRfYSA9PSBjMl9jbnRyNjRfdCgtMjA3OTM2KSwgIjQ1NiAqIC00NTYgPSAtMjA3OTM2Iik7CisKKyAgICBzdGF0aWNfYXNzZXJ0KChjMzJfYSA8PCAyNnUpID09IGMyX2NudHIzMl90KDB4RUMwMDAwMDApLCAiMTIzIDw8IDI2ID0gMHhFQzAwMDAwMCIpOworCisgICAgLy8gc2FuaXR5IGNoZWNrcyBmb3IgdW5hcnkgb3BlcmF0b3JzCisgICAgc3RhdGljX2Fzc2VydChjMl9jbnRyMzJfdCgxKSA9PSArYzJfY250cjMyX3QoMSksICIxID09ICsxIik7CisgICAgc3RhdGljX2Fzc2VydChjMl9jbnRyMzJfdCgxKSA9PSAtYzJfY250cjMyX3QoLTEpLCAiMSA9PSAtLTEiKTsKKworICAgIC8vIHNhbml0eSBjaGVja3MgZm9yIGNvbXBhcmlzb24KKyAgICB1c2luZyBjOF90ID0gYzJfY250cl90PHVpbnQ4X3Q+OworICAgIHN0YXRpY19hc3NlcnQoYzhfdCgtMHg4MCkgPiBjOF90KDB4N2YpLCAiODAgPiA3RiIpOworICAgIHN0YXRpY19hc3NlcnQoYzhfdCgtMHg4MCkgPj0gYzhfdCgweDdmKSwgIjgwID49IDdGIik7CisgICAgc3RhdGljX2Fzc2VydChjOF90KDB4N2YpID4gYzhfdCgweDdlKSwgIjdGID4gN0UiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KGM4X3QoMHg3ZikgPj0gYzhfdCgweDdlKSwgIjdGID49IDdFIik7CisgICAgc3RhdGljX2Fzc2VydCghKGM4X3QoLTB4ODApID4gYzhfdCgwKSksICI4MCAhPiAwMCIpOworICAgIHN0YXRpY19hc3NlcnQoIShjOF90KC0weDgwKSA+PSBjOF90KDApKSwgIjgwICE+PSAwMCIpOworICAgIHN0YXRpY19hc3NlcnQoIShjOF90KC0weDgwKSA+IGM4X3QoLTB4ODApKSwgIjgwICE+IDgwIik7CisgICAgc3RhdGljX2Fzc2VydChjOF90KC0weDgwKSA+PSBjOF90KC0weDgwKSwgIjgwID49IDgwIik7CisKKyAgICBzdGF0aWNfYXNzZXJ0KGM4X3QoLTB4ODApID09IGM4X3QoMHg4MCksICI4MCA9PSA4MCIpOworICAgIHN0YXRpY19hc3NlcnQoIShjOF90KC0weDgwKSA9PSBjOF90KDApKSwgIjgwICE9IDAiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KGM4X3QoLTB4ODApICE9IGM4X3QoMHg3ZiksICI4MCAhPSA3RiIpOworICAgIHN0YXRpY19hc3NlcnQoIShjOF90KDB4N2YpICE9IGM4X3QoMHg3ZikpLCAiODAgIT0gN0YiKTsKKworICAgIHN0YXRpY19hc3NlcnQoYzhfdCgweDdmKSA8IGM4X3QoLTB4ODApLCAiN0YgPCA4MCIpOworICAgIHN0YXRpY19hc3NlcnQoYzhfdCgweDdmKSA8PSBjOF90KC0weDgwKSwgIjdGIDwgODAiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KGM4X3QoMHg3ZSkgPCBjOF90KDB4N2YpLCAiN0UgPCA3RiIpOworICAgIHN0YXRpY19hc3NlcnQoYzhfdCgweDdlKSA8PSBjOF90KDB4N2YpLCAiN0UgPCA3RiIpOworICAgIHN0YXRpY19hc3NlcnQoIShjOF90KC0weDQwKSA8IGM4X3QoMHg0MCkpLCAiLTQwICE8IDQwIik7CisgICAgc3RhdGljX2Fzc2VydCghKGM4X3QoLTB4NDApIDw9IGM4X3QoMHg0MCkpLCAiLTQwICE8PSA0MCIpOworICAgIHN0YXRpY19hc3NlcnQoIShjOF90KC0weDQwKSA8IGM4X3QoLTB4NDApKSwgIi00MCAhPCAtNDAiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KGM4X3QoLTB4NDApIDw9IGM4X3QoLTB4NDApLCAiLTQwIDw9IC00MCIpOworCisgICAgc3RhdGljX2Fzc2VydChjMl9jbnRyMzJfdCgtMHg3ZmZmZmZmZiAtIDEpID4gYzJfY250cjMyX3QoMHg3ZmZmZmZmZiksICI4MCA+IDdGIik7CisgICAgc3RhdGljX2Fzc2VydCghKGMyX2NudHIzMl90KC0weDdmZmZmZmZmIC0gMSkgPiBjMl9jbnRyMzJfdCgwKSksICI4MCAhPiAwMCIpOworICAgIHN0YXRpY19hc3NlcnQoYzJfY250cjMyX3QoMSkgPT0gYzJfY250cjMyX3QoYzJfY250cjY0X3QoMHgxMDAwMDAwMDF1bCkpLCAiMSA9PSAxIik7Cit9CisKK2NsYXNzIEMyVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworfTsKKworVEVTVF9GKEMyVGVzdCwgQ291bnRlclRlc3QpIHsKKyAgICBjMl9jbnRyMzJfdCBjMzJfYSgxMjMpOworICAgIGMyX2NudHI2NF90IGM2NF9hKC00NTYpOworICAgIEVYUEVDVF9FUShjMzJfYSArPSAzLCBjMl9jbnRyMzJfdCgxMjYpKTsKKyAgICBFWFBFQ1RfRVEoYzMyX2EgKz0gYzY0X2EsIGMyX2NudHIzMl90KC0zMzApKTsKKyAgICBFWFBFQ1RfRVEoYzMyX2EgPDw9IDJ1LCBjMl9jbnRyMzJfdCgtMTMyMCkpOworICAgIEVYUEVDVF9FUShjNjRfYSAqPSAzLCBjMl9jbnRyNjRfdCgtMTM2OCkpOworICAgIEVYUEVDVF9FUShjMzJfYSAtPSBjNjRfYSwgYzJfY250cjMyX3QoNDgpKTsKKyAgICBFWFBFQ1RfRVEoYzMyX2EgLT0gNDAsIGMyX2NudHIzMl90KDgpKTsKKyAgICBFWFBFQ1RfRVEoYzMyX2EgKj0gYzMyX2EsIGMyX2NudHIzMl90KDY0KSk7Cit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi90ZXN0cy92bmRrL0MyQnVmZmVyVGVzdC5jcHAgYi9tZWRpYS9jb2RlYzIvdGVzdHMvdm5kay9DMkJ1ZmZlclRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4MDk5NGEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdGVzdHMvdm5kay9DMkJ1ZmZlclRlc3QuY3BwCkBAIC0wLDAgKzEsNzY4IEBACisvKgorICogQ29weXJpZ2h0IDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2luY2x1ZGUgPEMyQWxsb2NhdG9ySW9uLmg+CisjaW5jbHVkZSA8QzJBbGxvY2F0b3JHcmFsbG9jLmg+CisjaW5jbHVkZSA8QzJCdWZmZXIuaD4KKyNpbmNsdWRlIDxDMkJ1ZmZlclByaXYuaD4KKyNpbmNsdWRlIDxDMlBhcmFtRGVmLmg+CisKKyNpbmNsdWRlIDxzeXN0ZW0vZ3JhcGhpY3MuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBDMkJ1ZmZlclV0aWxzVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworICAgIHN0YXRpYyB2b2lkIFN0YXRpY1NlZ21lbnRUZXN0KCkgeworICAgICAgICAvLyBjb25zdHJ1Y3RvcgorICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCA0NTZ1KS5vZmZzZXQgPT0gMTIzLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDQ1NnUpLnNpemUgPT0gNDU2LCAiIik7CisKKyAgICAgICAgLy8gZW1wdHkKKyAgICAgICAgc3RhdGljX2Fzc2VydCghQzJTZWdtZW50KDEyM3UsIDQ1NnUpLmlzRW1wdHkoKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCAwdSkuaXNFbXB0eSgpLCAiIik7CisKKyAgICAgICAgLy8gdmFsaWQKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgNDU2dSkuaXNWYWxpZCgpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIH4xMjN1KS5pc1ZhbGlkKCksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghQzJTZWdtZW50KDEyM3UsIDEgKyB+MTIzdSkuaXNWYWxpZCgpLCAiIik7CisKKyAgICAgICAgLy8gYm9vbCgpCisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDQ1NnUpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoKGJvb2wpQzJTZWdtZW50KDEyM3UsIH4xMjN1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCFib29sKEMyU2VnbWVudCgxMjN1LCAxICsgfjEyM3UpKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCFib29sKEMyU2VnbWVudCgxMjN1LCAwKSksICIiKTsKKworICAgICAgICAvLyAhCisgICAgICAgIHN0YXRpY19hc3NlcnQoISFDMlNlZ21lbnQoMTIzdSwgNDU2dSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghIUMyU2VnbWVudCgxMjN1LCB+MTIzdSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghQzJTZWdtZW50KDEyM3UsIDEgKyB+MTIzdSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghQzJTZWdtZW50KDEyM3UsIDApLCAiIik7CisKKyAgICAgICAgLy8gY29udGFpbnMKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgfjEyM3UpLmNvbnRhaW5zKEMyU2VnbWVudCgxMjN1LCAwKSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghQzJTZWdtZW50KDEyM3UsIDEgKyB+MTIzdSkuY29udGFpbnMoQzJTZWdtZW50KDEyM3UsIDApKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCB+MTIzdSkuY29udGFpbnMoQzJTZWdtZW50KDEyM3UsIH4xMjN1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghQzJTZWdtZW50KDEyM3UsIH4xMjN1KS5jb250YWlucyhDMlNlZ21lbnQoMTIzdSwgMSArIH4xMjN1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghQzJTZWdtZW50KDEyM3UsIDEgKyB+MTIzdSkuY29udGFpbnMoQzJTZWdtZW50KDEyM3UsIDEgKyB+MTIzdSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIUMyU2VnbWVudCgxMjN1LCB+MTIzdSkuY29udGFpbnMoQzJTZWdtZW50KDEyMnUsIDJ1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgfjEyM3UpLmNvbnRhaW5zKEMyU2VnbWVudCgxMjN1LCAydSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDN1KS5jb250YWlucyhDMlNlZ21lbnQoMTI0dSwgMnUpKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCFDMlNlZ21lbnQoMTIzdSwgM3UpLmNvbnRhaW5zKEMyU2VnbWVudCgxMjV1LCAydSkpLCAiIik7CisKKyAgICAgICAgLy8gPT0KKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgNDU2dSkgPT0gQzJTZWdtZW50KDEyM3UsIDQ1NnUpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIzdSwgNDU2dSkgPT0gQzJTZWdtZW50KDEyM3UsIDQ1N3UpKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCEoQzJTZWdtZW50KDEyM3UsIDQ1NnUpID09IEMyU2VnbWVudCgxMjN1LCA0NTV1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjN1LCA0NTZ1KSA9PSBDMlNlZ21lbnQoMTIydSwgNDU2dSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIzdSwgNDU2dSkgPT0gQzJTZWdtZW50KDEyNHUsIDQ1NnUpKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCEoQzJTZWdtZW50KDEyM3UsIDB1KSA9PSBDMlNlZ21lbnQoMTI0dSwgMHUpKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCAwdSkgPT0gQzJTZWdtZW50KDEyM3UsIDB1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCAxICsgfjEyM3UpID09IEMyU2VnbWVudCgxMjR1LCAxICsgfjEyNHUpLCAiIik7CisKKyAgICAgICAgLy8gIT0KKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjN1LCA0NTZ1KSAhPSBDMlNlZ21lbnQoMTIzdSwgNDU2dSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDQ1NnUpICE9IEMyU2VnbWVudCgxMjN1LCA0NTd1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCA0NTZ1KSAhPSBDMlNlZ21lbnQoMTIzdSwgNDU1dSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgNDU2dSkgIT0gQzJTZWdtZW50KDEyMnUsIDQ1NnUpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDQ1NnUpICE9IEMyU2VnbWVudCgxMjR1LCA0NTZ1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCAwdSkgIT0gQzJTZWdtZW50KDEyNHUsIDB1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCEoQzJTZWdtZW50KDEyM3UsIDB1KSAhPSBDMlNlZ21lbnQoMTIzdSwgMHUpKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCEoQzJTZWdtZW50KDEyM3UsIDEgKyB+MTIzdSkgIT0gQzJTZWdtZW50KDEyNHUsIDEgKyB+MTI0dSkpLCAiIik7CisKKyAgICAgICAgLy8gPD0KKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgNDU2dSkgPD0gQzJTZWdtZW50KDEyM3UsIDQ1NnUpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDQ1NnUpIDw9IEMyU2VnbWVudCgxMjN1LCA0NTd1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCA0NTZ1KSA8PSBDMlNlZ21lbnQoMTIydSwgNDU3dSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjN1LCA0NTd1KSA8PSBDMlNlZ21lbnQoMTIzdSwgNDU2dSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIydSwgNDU3dSkgPD0gQzJTZWdtZW50KDEyM3UsIDQ1NnUpKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCEoQzJTZWdtZW50KDEyM3UsIDQ1N3UpIDw9IEMyU2VnbWVudCgxMjR1LCA0NTd1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjJ1LCA0NTd1KSA8PSBDMlNlZ21lbnQoMTIzdSwgNDU3dSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIydSwgMHUpIDw9IEMyU2VnbWVudCgxMjN1LCAwdSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDB1KSA8PSBDMlNlZ21lbnQoMTIydSwgMXUpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyMnUsIDB1KSA8PSBDMlNlZ21lbnQoMTIydSwgMXUpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIydSwgfjEyMnUpIDw9IEMyU2VnbWVudCgxMjJ1LCAxICsgfjEyMnUpKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCEoQzJTZWdtZW50KDEyMnUsIDEgKyB+MTIydSkgPD0gQzJTZWdtZW50KDEyMnUsIH4xMjJ1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjJ1LCAxICsgfjEyMnUpIDw9IEMyU2VnbWVudCgxMjJ1LCAxICsgfjEyMnUpKSwgIiIpOworCisgICAgICAgIC8vIDwKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjN1LCA0NTZ1KSA8IEMyU2VnbWVudCgxMjN1LCA0NTZ1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgNDU2dSkgPCBDMlNlZ21lbnQoMTIzdSwgNDU3dSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgNDU2dSkgPCBDMlNlZ21lbnQoMTIydSwgNDU3dSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjN1LCA0NTd1KSA8IEMyU2VnbWVudCgxMjN1LCA0NTZ1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjJ1LCA0NTd1KSA8IEMyU2VnbWVudCgxMjN1LCA0NTZ1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjN1LCA0NTd1KSA8IEMyU2VnbWVudCgxMjR1LCA0NTd1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjJ1LCA0NTd1KSA8IEMyU2VnbWVudCgxMjN1LCA0NTd1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjJ1LCAwdSkgPCBDMlNlZ21lbnQoMTIzdSwgMHUpKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCAwdSkgPCBDMlNlZ21lbnQoMTIydSwgMXUpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyMnUsIDB1KSA8IEMyU2VnbWVudCgxMjJ1LCAxdSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjJ1LCB+MTIydSkgPCBDMlNlZ21lbnQoMTIydSwgMSArIH4xMjJ1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjJ1LCAxICsgfjEyMnUpIDwgQzJTZWdtZW50KDEyMnUsIH4xMjJ1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjJ1LCAxICsgfjEyMnUpIDwgQzJTZWdtZW50KDEyMnUsIDEgKyB+MTIydSkpLCAiIik7CisKKyAgICAgICAgLy8gPD0KKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgNDU2dSkgPj0gQzJTZWdtZW50KDEyM3UsIDQ1NnUpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDQ1N3UpID49IEMyU2VnbWVudCgxMjN1LCA0NTZ1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjJ1LCA0NTd1KSA+PSBDMlNlZ21lbnQoMTIzdSwgNDU2dSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjN1LCA0NTZ1KSA+PSBDMlNlZ21lbnQoMTIzdSwgNDU3dSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIzdSwgNDU2dSkgPj0gQzJTZWdtZW50KDEyMnUsIDQ1N3UpKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCEoQzJTZWdtZW50KDEyNHUsIDQ1N3UpID49IEMyU2VnbWVudCgxMjN1LCA0NTd1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjN1LCA0NTd1KSA+PSBDMlNlZ21lbnQoMTIydSwgNDU3dSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIzdSwgMHUpID49IEMyU2VnbWVudCgxMjJ1LCAwdSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyMnUsIDF1KSA+PSBDMlNlZ21lbnQoMTIzdSwgMHUpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyMnUsIDF1KSA+PSBDMlNlZ21lbnQoMTIydSwgMHUpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIydSwgMSArIH4xMjJ1KSA+PSBDMlNlZ21lbnQoMTIydSwgfjEyMnUpKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCEoQzJTZWdtZW50KDEyMnUsIH4xMjJ1KSA+PSBDMlNlZ21lbnQoMTIydSwgMSArIH4xMjJ1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjJ1LCAxICsgfjEyMnUpID49IEMyU2VnbWVudCgxMjJ1LCAxICsgfjEyMnUpKSwgIiIpOworCisgICAgICAgIC8vIDwKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjN1LCA0NTZ1KSA+IEMyU2VnbWVudCgxMjN1LCA0NTZ1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgNDU3dSkgPiBDMlNlZ21lbnQoMTIzdSwgNDU2dSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIydSwgNDU3dSkgPiBDMlNlZ21lbnQoMTIzdSwgNDU2dSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjN1LCA0NTZ1KSA+IEMyU2VnbWVudCgxMjN1LCA0NTd1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjN1LCA0NTZ1KSA+IEMyU2VnbWVudCgxMjJ1LCA0NTd1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjR1LCA0NTd1KSA+IEMyU2VnbWVudCgxMjN1LCA0NTd1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjN1LCA0NTd1KSA+IEMyU2VnbWVudCgxMjJ1LCA0NTd1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjN1LCAwdSkgPiBDMlNlZ21lbnQoMTIydSwgMHUpKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjJ1LCAxdSkgPiBDMlNlZ21lbnQoMTIzdSwgMHUpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyMnUsIDF1KSA+IEMyU2VnbWVudCgxMjJ1LCAwdSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjJ1LCAxICsgfjEyMnUpID4gQzJTZWdtZW50KDEyMnUsIH4xMjJ1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjJ1LCB+MTIydSkgPiBDMlNlZ21lbnQoMTIydSwgMSArIH4xMjJ1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjJ1LCAxICsgfjEyMnUpID4gQzJTZWdtZW50KDEyMnUsIDEgKyB+MTIydSkpLCAiIik7CisKKyAgICAgICAgLy8gZW5kCisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDQ1NnUpLmVuZCgpID09IDU3OXUsICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgMHUpLmVuZCgpID09IDEyM3UsICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgfjEyM3UpLmVuZCgpID09IDB4ZmZmZmZmZmZ1LCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDEgKyB+MTIzdSkuZW5kKCkgPT0gMHUsICIiKTsKKworICAgICAgICAvLyBpbnRlcnNlY3QKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgNDU2dSkuaW50ZXJzZWN0KEMyU2VnbWVudCgxMjN1LCA0NTZ1KSkgPT0gQzJTZWdtZW50KDEyM3UsIDQ1NnUpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDQ1NnUpLmludGVyc2VjdChDMlNlZ21lbnQoMTIzdSwgNDYwdSkpID09IEMyU2VnbWVudCgxMjN1LCA0NTZ1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCA0NTZ1KS5pbnRlcnNlY3QoQzJTZWdtZW50KDEyNHUsIDQ2MHUpKSA9PSBDMlNlZ21lbnQoMTI0dSwgNDU1dSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgNDU2dSkuaW50ZXJzZWN0KEMyU2VnbWVudCg1Nzl1LCA0NjB1KSkgPT0gQzJTZWdtZW50KDU3OXUsIDB1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCA0NTZ1KS5pbnRlcnNlY3QoQzJTZWdtZW50KDU4OXUsIDQ2MHUpKSA9PSBDMlNlZ21lbnQoNTg5dSwgfjl1IC8qIC0xMCAqLyksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgNDU2dSkuaW50ZXJzZWN0KEMyU2VnbWVudCgxMjN1LCA0NTV1KSkgPT0gQzJTZWdtZW50KDEyM3UsIDQ1NXUpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDQ1NnUpLmludGVyc2VjdChDMlNlZ21lbnQoMTIydSwgNDU2dSkpID09IEMyU2VnbWVudCgxMjN1LCA0NTV1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCA0NTZ1KS5pbnRlcnNlY3QoQzJTZWdtZW50KDB1LCAxMjN1KSkgPT0gQzJTZWdtZW50KDEyM3UsIDB1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCA0NTZ1KS5pbnRlcnNlY3QoQzJTZWdtZW50KDB1LCAwdSkpID09IEMyU2VnbWVudCgxMjN1LCB+MTIydSAvKiAtMTIzICovKSwgIiIpOworCisgICAgICAgIC8vIG5vcm1hbGl6ZSAoY2hhbmdlIGludmFsaWQgc2VnbWVudHMgdG8gZW1wdHkgc2VnbWVudHMpCisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDQ1NnUpLm5vcm1hbGl6ZSgpID09IEMyU2VnbWVudCgxMjN1LCA0NTZ1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCB+MTIzdSkubm9ybWFsaXplKCkgPT0gQzJTZWdtZW50KDEyM3UsIH4xMjN1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCAxICsgfjEyM3UpLm5vcm1hbGl6ZSgpID09IEMyU2VnbWVudCgxMjN1LCAwdSksICIiKTsKKworICAgICAgICAvLyBub3RlOiBub3JtYWxpemUgY2Fubm90IGJlIHVzZWQgdG8gbWFrZSB0aGlzIHdvcmsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgNDU2dSkuaW50ZXJzZWN0KEMyU2VnbWVudCgxNTB1LCB+MTUwdSkpLm5vcm1hbGl6ZSgpID09IEMyU2VnbWVudCgxNTB1LCA0Mjl1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCA0NTZ1KS5pbnRlcnNlY3QoQzJTZWdtZW50KDE1MHUsIDEgKyB+MTUwdSkpLm5vcm1hbGl6ZSgpICE9IEMyU2VnbWVudCgxNTB1LCA0Mjl1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCA0NTZ1KS5pbnRlcnNlY3QoQzJTZWdtZW50KDE1MHUsIDEgKyB+MTUwdSkpLm5vcm1hbGl6ZSgpID09IEMyU2VnbWVudCgxNTB1LCAwdSksICIiKTsKKworICAgICAgICAvLyBzYXR1cmF0ZSAoY2hhbmdlIGludmFsaWQgc2VnbWVudHMgdG8gZnVsbCBzZWdtZW50cyB1cCB0byBtYXgpCisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDQ1NnUpLnNhdHVyYXRlKCkgPT0gQzJTZWdtZW50KDEyM3UsIDQ1NnUpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIH4xMjN1KS5zYXR1cmF0ZSgpID09IEMyU2VnbWVudCgxMjN1LCB+MTIzdSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgMSArIH4xMjN1KS5zYXR1cmF0ZSgpID09IEMyU2VnbWVudCgxMjN1LCB+MTIzdSksICIiKTsKKworICAgICAgICAvLyBub3RlOiBzYXR1cmF0ZSBjYW4gYmUgdXNlZCB0byBtYWtlIHRoaXMgd29yayBidXQgb25seSBwYXJ0aWFsbHkKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgNDU2dSkuaW50ZXJzZWN0KEMyU2VnbWVudCgxNTB1LCAxICsgfjE1MHUpLnNhdHVyYXRlKCkpLm5vcm1hbGl6ZSgpID09IEMyU2VnbWVudCgxNTB1LCA0Mjl1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCA0NTZ1KS5pbnRlcnNlY3QoQzJTZWdtZW50KDB1LCAxMDB1KS5zYXR1cmF0ZSgpKS5ub3JtYWxpemUoKSA9PSBDMlNlZ21lbnQoMTIzdSwgMHUpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDQ1NnUpLmludGVyc2VjdChDMlNlZ21lbnQoMTAwMHUsIDEwMHUpLnNhdHVyYXRlKCkpLm5vcm1hbGl6ZSgpICE9IEMyU2VnbWVudCg1Nzl1LCAwdSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgNDU2dSkuaW50ZXJzZWN0KEMyU2VnbWVudCgxMDAwdSwgMTAwdSkuc2F0dXJhdGUoKSkubm9ybWFsaXplKCkgPT0gQzJTZWdtZW50KDEwMDB1LCAwdSksICIiKTsKKworICAgIH0KKworICAgIHN0YXRpYyB2b2lkIFN0YXRpY0xpbmVhclJhbmdlQW5kQ2FwYWNpdHlUZXN0KCkgeworICAgICAgICBjbGFzcyBUZXN0Q2FwYWNpdHkgOiBwdWJsaWMgX0MyTGluZWFyQ2FwYWNpdHlBc3BlY3QgeworICAgICAgICAgICAgdXNpbmcgX0MyTGluZWFyQ2FwYWNpdHlBc3BlY3Q6Ol9DMkxpbmVhckNhcGFjaXR5QXNwZWN0OworICAgICAgICAgICAgZnJpZW5kIGNsYXNzIEMyQnVmZmVyVXRpbHNUZXN0OworICAgICAgICB9OworCisgICAgICAgIGNsYXNzIFRlc3RSYW5nZSA6IHB1YmxpYyBfQzJMaW5lYXJSYW5nZUFzcGVjdCB7CisgICAgICAgICAgICB1c2luZyBfQzJMaW5lYXJSYW5nZUFzcGVjdDo6X0MyTGluZWFyUmFuZ2VBc3BlY3Q7CisgICAgICAgICAgICBmcmllbmQgY2xhc3MgQzJCdWZmZXJVdGlsc1Rlc3Q7CisgICAgICAgIH07CisKKyAgICAgICAgLy8gX0MyTGluZWFyQ2FwYWNpdHlBc3BlY3QKKyAgICAgICAgc3RhdGljX2Fzc2VydChUZXN0Q2FwYWNpdHkoMHUpLmNhcGFjaXR5KCkgPT0gMHUsICIiKTsKKyAgICAgICAgY29uc3RleHByIFRlc3RDYXBhY2l0eSBjYXAoMTIzdSk7CisgICAgICAgIHN0YXRpY19hc3NlcnQoVGVzdENhcGFjaXR5KCZjYXApLmNhcGFjaXR5KCkgPT0gMTIzdSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KFRlc3RDYXBhY2l0eShudWxscHRyKS5jYXBhY2l0eSgpID09IDB1LCAiIik7CisKKyAgICAgICAgLy8gX0MyTGluZWFyQ2FwYWNpdHlSYW5nZQorICAgICAgICBzdGF0aWNfYXNzZXJ0KFRlc3RSYW5nZSgmY2FwKS5jYXBhY2l0eSgpID09IDEyM3UsICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChUZXN0UmFuZ2UoJmNhcCkub2Zmc2V0KCkgPT0gMHUsICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChUZXN0UmFuZ2UoJmNhcCkuc2l6ZSgpID09IDEyM3UsICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChUZXN0UmFuZ2UoJmNhcCkuZW5kT2Zmc2V0KCkgPT0gMTIzdSwgIiIpOworCisgICAgICAgIGNvbnN0ZXhwciBUZXN0UmFuZ2UgcmFuZ2UoJmNhcCwgNTB1LCAxMDB1KTsKKworICAgICAgICBzdGF0aWNfYXNzZXJ0KHJhbmdlLmNhcGFjaXR5KCkgPT0gMTIzdSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KHJhbmdlLm9mZnNldCgpID09IDUwdSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KHJhbmdlLnNpemUoKSA9PSA3M3UsICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChyYW5nZS5lbmRPZmZzZXQoKSA9PSAxMjN1LCAiIik7CisKKyAgICAgICAgc3RhdGljX2Fzc2VydChUZXN0UmFuZ2UoJmNhcCwgMjB1LCAzMHUpLmNhcGFjaXR5KCkgPT0gMTIzdSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KFRlc3RSYW5nZSgmY2FwLCAyMHUsIDMwdSkub2Zmc2V0KCkgPT0gMjB1LCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoVGVzdFJhbmdlKCZjYXAsIDIwdSwgMzB1KS5zaXplKCkgPT0gMzB1LCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoVGVzdFJhbmdlKCZjYXAsIDIwdSwgMzB1KS5lbmRPZmZzZXQoKSA9PSA1MHUsICIiKTsKKworICAgICAgICBzdGF0aWNfYXNzZXJ0KFRlc3RSYW5nZSgmY2FwLCAyMDB1LCAzMHUpLmNhcGFjaXR5KCkgPT0gMTIzdSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KFRlc3RSYW5nZSgmY2FwLCAyMDB1LCAzMHUpLm9mZnNldCgpID09IDEyM3UsICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChUZXN0UmFuZ2UoJmNhcCwgMjAwdSwgMzB1KS5zaXplKCkgPT0gMHUsICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChUZXN0UmFuZ2UoJmNhcCwgMjAwdSwgMzB1KS5lbmRPZmZzZXQoKSA9PSAxMjN1LCAiIik7CisKKyAgICB9CisKK307CisKKworY2xhc3MgQzJCdWZmZXJUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CitwdWJsaWM6CisgICAgQzJCdWZmZXJUZXN0KCkKKyAgICAgICAgOiBtQmxvY2tQb29sSWQoQzJCbG9ja1Bvb2w6OlBMQVRGT1JNX1NUQVJUKSwKKyAgICAgICAgICBtTGluZWFyQWxsb2NhdG9yKHN0ZDo6bWFrZV9zaGFyZWQ8QzJBbGxvY2F0b3JJb24+KCdpJykpLAorICAgICAgICAgIG1TaXplKDB1KSwKKyAgICAgICAgICBtQWRkcihudWxscHRyKSwKKyAgICAgICAgICBtR3JhcGhpY0FsbG9jYXRvcihzdGQ6Om1ha2Vfc2hhcmVkPEMyQWxsb2NhdG9yR3JhbGxvYz4oJ2cnKSkgeworICAgIH0KKworICAgIH5DMkJ1ZmZlclRlc3QoKSA9IGRlZmF1bHQ7CisKKyAgICB2b2lkIGFsbG9jYXRlTGluZWFyKHNpemVfdCBjYXBhY2l0eSkgeworICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBtTGluZWFyQWxsb2NhdG9yLT5uZXdMaW5lYXJBbGxvY2F0aW9uKAorICAgICAgICAgICAgICAgIGNhcGFjaXR5LAorICAgICAgICAgICAgICAgIHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9LAorICAgICAgICAgICAgICAgICZtTGluZWFyQWxsb2NhdGlvbik7CisgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIG1MaW5lYXJBbGxvY2F0aW9uLnJlc2V0KCk7CisgICAgICAgICAgICBGQUlMKCkgPDwgIkMyQWxsb2NhdG9yOjpuZXdMaW5lYXJBbGxvY2F0aW9uKCkgZmFpbGVkOiAiIDw8IGVycjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgbWFwTGluZWFyKHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplLCB1aW50OF90ICoqYWRkcikgeworICAgICAgICBBU1NFUlRfVFJVRShtTGluZWFyQWxsb2NhdGlvbik7CisgICAgICAgIGMyX3N0YXR1c190IGVyciA9IG1MaW5lYXJBbGxvY2F0aW9uLT5tYXAoCisgICAgICAgICAgICAgICAgb2Zmc2V0LAorICAgICAgICAgICAgICAgIHNpemUsCisgICAgICAgICAgICAgICAgeyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH0sCisgICAgICAgICAgICAgICAgLy8gVE9ETzogZmVuY2UKKyAgICAgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgICAgICZtQWRkcik7CisgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIG1BZGRyID0gbnVsbHB0cjsKKyAgICAgICAgICAgIEZBSUwoKSA8PCAiQzJMaW5lYXJBbGxvY2F0aW9uOjptYXAoKSBmYWlsZWQ6ICIgPDwgZXJyOworICAgICAgICB9CisgICAgICAgIEFTU0VSVF9ORShudWxscHRyLCBtQWRkcik7CisgICAgICAgIG1TaXplID0gc2l6ZTsKKyAgICAgICAgKmFkZHIgPSAodWludDhfdCAqKW1BZGRyOworICAgIH0KKworICAgIHZvaWQgdW5tYXBMaW5lYXIoKSB7CisgICAgICAgIEFTU0VSVF9UUlVFKG1MaW5lYXJBbGxvY2F0aW9uKTsKKyAgICAgICAgQVNTRVJUX05FKG51bGxwdHIsIG1BZGRyKTsKKyAgICAgICAgQVNTRVJUX05FKDB1LCBtU2l6ZSk7CisKKyAgICAgICAgLy8gVE9ETzogZmVuY2UKKyAgICAgICAgQVNTRVJUX0VRKEMyX09LLCBtTGluZWFyQWxsb2NhdGlvbi0+dW5tYXAobUFkZHIsIG1TaXplLCBudWxscHRyKSk7CisgICAgICAgIG1TaXplID0gMHU7CisgICAgICAgIG1BZGRyID0gbnVsbHB0cjsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+IG1ha2VMaW5lYXJCbG9ja1Bvb2woKSB7CisgICAgICAgIHJldHVybiBzdGQ6Om1ha2Vfc2hhcmVkPEMyUG9vbGVkQmxvY2tQb29sPihtTGluZWFyQWxsb2NhdG9yLCBtQmxvY2tQb29sSWQrKyk7CisgICAgfQorCisgICAgdm9pZCBhbGxvY2F0ZUdyYXBoaWModWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCkgeworICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBtR3JhcGhpY0FsbG9jYXRvci0+bmV3R3JhcGhpY0FsbG9jYXRpb24oCisgICAgICAgICAgICAgICAgd2lkdGgsCisgICAgICAgICAgICAgICAgaGVpZ2h0LAorICAgICAgICAgICAgICAgIEhBTF9QSVhFTF9GT1JNQVRfWUNCQ1JfNDIwXzg4OCwKKyAgICAgICAgICAgICAgICB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfSwKKyAgICAgICAgICAgICAgICAmbUdyYXBoaWNBbGxvY2F0aW9uKTsKKyAgICAgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAgICAgbUdyYXBoaWNBbGxvY2F0aW9uLnJlc2V0KCk7CisgICAgICAgICAgICBGQUlMKCkgPDwgIkMyQWxsb2NhdG9yOjpuZXdHcmFwaGljQWxsb2NhdGlvbigpIGZhaWxlZDogIiA8PCBlcnI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIG1hcEdyYXBoaWMoQzJSZWN0IHJlY3QsIEMyUGxhbmFyTGF5b3V0ICpsYXlvdXQsIHVpbnQ4X3QgKiphZGRyKSB7CisgICAgICAgIEFTU0VSVF9UUlVFKG1HcmFwaGljQWxsb2NhdGlvbik7CisgICAgICAgIGMyX3N0YXR1c190IGVyciA9IG1HcmFwaGljQWxsb2NhdGlvbi0+bWFwKAorICAgICAgICAgICAgICAgIHJlY3QsCisgICAgICAgICAgICAgICAgeyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH0sCisgICAgICAgICAgICAgICAgLy8gVE9ETzogZmVuY2UKKyAgICAgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgICAgIGxheW91dCwKKyAgICAgICAgICAgICAgICBhZGRyKTsKKyAgICAgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAgICAgYWRkcltDMlBsYW5hckxheW91dDo6UExBTkVfWV0gPSBudWxscHRyOworICAgICAgICAgICAgYWRkcltDMlBsYW5hckxheW91dDo6UExBTkVfVV0gPSBudWxscHRyOworICAgICAgICAgICAgYWRkcltDMlBsYW5hckxheW91dDo6UExBTkVfVl0gPSBudWxscHRyOworICAgICAgICAgICAgRkFJTCgpIDw8ICJDMkdyYXBoaWNBbGxvY2F0aW9uOjptYXAoKSBmYWlsZWQ6ICIgPDwgZXJyOworICAgICAgICB9CisgICAgICAgIG1NYXBwZWRSZWN0ID0gcmVjdDsKKyAgICAgICAgbWVtY3B5KG1BZGRyR3JhcGhpYywgYWRkciwgc2l6ZW9mKHVpbnQ4X3QqKSAqIEMyUGxhbmFyTGF5b3V0OjpNQVhfTlVNX1BMQU5FUyk7CisgICAgfQorCisgICAgdm9pZCB1bm1hcEdyYXBoaWMoKSB7CisgICAgICAgIEFTU0VSVF9UUlVFKG1HcmFwaGljQWxsb2NhdGlvbik7CisKKyAgICAgICAgLy8gVE9ETzogZmVuY2UKKyAgICAgICAgQVNTRVJUX0VRKEMyX09LLCBtR3JhcGhpY0FsbG9jYXRpb24tPnVubWFwKG1BZGRyR3JhcGhpYywgbU1hcHBlZFJlY3QsIG51bGxwdHIpKTsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+IG1ha2VHcmFwaGljQmxvY2tQb29sKCkgeworICAgICAgICByZXR1cm4gc3RkOjptYWtlX3NoYXJlZDxDMkJhc2ljR3JhcGhpY0Jsb2NrUG9vbD4obUdyYXBoaWNBbGxvY2F0b3IpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCBtQmxvY2tQb29sSWQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiBtTGluZWFyQWxsb2NhdG9yOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckFsbG9jYXRpb24+IG1MaW5lYXJBbGxvY2F0aW9uOworICAgIHNpemVfdCBtU2l6ZTsKKyAgICB2b2lkICptQWRkcjsKKyAgICBDMlJlY3QgbU1hcHBlZFJlY3Q7CisgICAgdWludDhfdCogbUFkZHJHcmFwaGljW0MyUGxhbmFyTGF5b3V0OjpNQVhfTlVNX1BMQU5FU107CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IG1HcmFwaGljQWxsb2NhdG9yOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNBbGxvY2F0aW9uPiBtR3JhcGhpY0FsbG9jYXRpb247Cit9OworCitURVNUX0YoQzJCdWZmZXJUZXN0LCBMaW5lYXJBbGxvY2F0aW9uVGVzdCkgeworICAgIGNvbnN0ZXhwciBzaXplX3Qga0NhcGFjaXR5ID0gMTAyNHUgKiAxMDI0dTsKKworICAgIGFsbG9jYXRlTGluZWFyKGtDYXBhY2l0eSk7CisKKyAgICB1aW50OF90ICphZGRyID0gbnVsbHB0cjsKKyAgICBtYXBMaW5lYXIoMHUsIGtDYXBhY2l0eSwgJmFkZHIpOworICAgIEFTU0VSVF9ORShudWxscHRyLCBhZGRyKTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga0NhcGFjaXR5OyArK2kpIHsKKyAgICAgICAgYWRkcltpXSA9IGkgJSAxMDB1OworICAgIH0KKworICAgIHVubWFwTGluZWFyKCk7CisgICAgYWRkciA9IG51bGxwdHI7CisKKyAgICBtYXBMaW5lYXIoa0NhcGFjaXR5IC8gMywga0NhcGFjaXR5IC8gMywgJmFkZHIpOworICAgIEFTU0VSVF9ORShudWxscHRyLCBhZGRyKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtDYXBhY2l0eSAvIDM7ICsraSkgeworICAgICAgICBBU1NFUlRfRVEoKGkgKyBrQ2FwYWNpdHkgLyAzKSAlIDEwMCwgYWRkcltpXSkgPDwgIiBhdCBpID0gIiA8PCBpOworICAgIH0KK30KKworVEVTVF9GKEMyQnVmZmVyVGVzdCwgQmxvY2tQb29sVGVzdCkgeworICAgIGNvbnN0ZXhwciBzaXplX3Qga0NhcGFjaXR5ID0gMTAyNHUgKiAxMDI0dTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gYmxvY2tQb29sKG1ha2VMaW5lYXJCbG9ja1Bvb2woKSk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gYmxvY2s7CisgICAgQVNTRVJUX0VRKEMyX09LLCBibG9ja1Bvb2wtPmZldGNoTGluZWFyQmxvY2soCisgICAgICAgICAgICBrQ2FwYWNpdHksCisgICAgICAgICAgICB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfSwKKyAgICAgICAgICAgICZibG9jaykpOworICAgIEFTU0VSVF9UUlVFKGJsb2NrKTsKKworICAgIEMyQWNxdWlyYWJsZTxDMldyaXRlVmlldz4gd3JpdGVWaWV3SG9sZGVyID0gYmxvY2stPm1hcCgpOworICAgIEMyV3JpdGVWaWV3IHdyaXRlVmlldyA9IHdyaXRlVmlld0hvbGRlci5nZXQoKTsKKyAgICBBU1NFUlRfRVEoQzJfT0ssIHdyaXRlVmlldy5lcnJvcigpKTsKKyAgICBBU1NFUlRfRVEoa0NhcGFjaXR5LCB3cml0ZVZpZXcuY2FwYWNpdHkoKSk7CisgICAgQVNTRVJUX0VRKDB1LCB3cml0ZVZpZXcub2Zmc2V0KCkpOworICAgIEFTU0VSVF9FUShrQ2FwYWNpdHksIHdyaXRlVmlldy5zaXplKCkpOworCisgICAgdWludDhfdCAqZGF0YSA9IHdyaXRlVmlldy5kYXRhKCk7CisgICAgQVNTRVJUX05FKG51bGxwdHIsIGRhdGEpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgd3JpdGVWaWV3LnNpemUoKTsgKytpKSB7CisgICAgICAgIGRhdGFbaV0gPSBpICUgMTAwdTsKKyAgICB9CisKKyAgICB3cml0ZVZpZXcuc2V0T2Zmc2V0KGtDYXBhY2l0eSAvIDMpOworICAgIGRhdGEgPSB3cml0ZVZpZXcuZGF0YSgpOworICAgIEFTU0VSVF9ORShudWxscHRyLCBkYXRhKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHdyaXRlVmlldy5zaXplKCk7ICsraSkgeworICAgICAgICBBU1NFUlRfRVEoKGkgKyBrQ2FwYWNpdHkgLyAzKSAlIDEwMHUsIGRhdGFbaV0pIDw8ICIgYXQgaSA9ICIgPDwgaQorICAgICAgICAgICAgPDwgIjsgZGF0YSA9ICIgPDwgc3RhdGljX2Nhc3Q8dm9pZCAqPihkYXRhKTsKKyAgICB9CisKKyAgICBDMkZlbmNlIGZlbmNlOworICAgIEMyQ29uc3RMaW5lYXJCbG9jayBjb25zdEJsb2NrID0gYmxvY2stPnNoYXJlKAorICAgICAgICAgICAga0NhcGFjaXR5IC8gMywga0NhcGFjaXR5IC8gMywgZmVuY2UpOworCisgICAgQzJBY3F1aXJhYmxlPEMyUmVhZFZpZXc+IHJlYWRWaWV3SG9sZGVyID0gY29uc3RCbG9jay5tYXAoKTsKKyAgICBDMlJlYWRWaWV3IHJlYWRWaWV3ID0gcmVhZFZpZXdIb2xkZXIuZ2V0KCk7CisgICAgQVNTRVJUX0VRKEMyX09LLCByZWFkVmlldy5lcnJvcigpKTsKKyAgICBBU1NFUlRfRVEoa0NhcGFjaXR5IC8gMywgcmVhZFZpZXcuY2FwYWNpdHkoKSk7CisKKyAgICAvLyBUT0RPOiBmZW5jZQorICAgIGNvbnN0IHVpbnQ4X3QgKmNvbnN0RGF0YSA9IHJlYWRWaWV3LmRhdGEoKTsKKyAgICBBU1NFUlRfTkUobnVsbHB0ciwgY29uc3REYXRhKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJlYWRWaWV3LmNhcGFjaXR5KCk7ICsraSkgeworICAgICAgICBBU1NFUlRfRVEoKGkgKyBrQ2FwYWNpdHkgLyAzKSAlIDEwMHUsIGNvbnN0RGF0YVtpXSkgPDwgIiBhdCBpID0gIiA8PCBpCisgICAgICAgICAgICAgICAgPDwgIjsgZGF0YSA9ICIgPDwgc3RhdGljX2Nhc3Q8dm9pZCAqPihkYXRhKQorICAgICAgICAgICAgICAgIDw8ICI7IGNvbnN0RGF0YSA9ICIgPDwgc3RhdGljX2Nhc3Q8Y29uc3Qgdm9pZCAqPihjb25zdERhdGEpOworICAgIH0KKworICAgIHJlYWRWaWV3ID0gcmVhZFZpZXcuc3ViVmlldygzMzN1LCAxMDB1KTsKKyAgICBBU1NFUlRfRVEoQzJfT0ssIHJlYWRWaWV3LmVycm9yKCkpOworICAgIEFTU0VSVF9FUSgxMDB1LCByZWFkVmlldy5jYXBhY2l0eSgpKTsKKworICAgIGNvbnN0RGF0YSA9IHJlYWRWaWV3LmRhdGEoKTsKKyAgICBBU1NFUlRfTkUobnVsbHB0ciwgY29uc3REYXRhKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJlYWRWaWV3LmNhcGFjaXR5KCk7ICsraSkgeworICAgICAgICBBU1NFUlRfRVEoKGkgKyAzMzN1ICsga0NhcGFjaXR5IC8gMykgJSAxMDB1LCBjb25zdERhdGFbaV0pIDw8ICIgYXQgaSA9ICIgPDwgaTsKKyAgICB9Cit9CisKK3ZvaWQgZmlsbFBsYW5lKGNvbnN0IEMyUmVjdCByZWN0LCBjb25zdCBDMlBsYW5lSW5mbyBpbmZvLCB1aW50OF90ICphZGRyLCB1aW50OF90IHZhbHVlKSB7CisgICAgZm9yICh1aW50MzJfdCByb3cgPSAwOyByb3cgPCByZWN0LmhlaWdodCAvIGluZm8ucm93U2FtcGxpbmc7ICsrcm93KSB7CisgICAgICAgIGludDMyX3Qgcm93T2Zmc2V0ID0gKHJvdyArIHJlY3QudG9wIC8gaW5mby5yb3dTYW1wbGluZykgKiBpbmZvLnJvd0luYzsKKyAgICAgICAgZm9yICh1aW50MzJfdCBjb2wgPSAwOyBjb2wgPCByZWN0LndpZHRoIC8gaW5mby5jb2xTYW1wbGluZzsgKytjb2wpIHsKKyAgICAgICAgICAgIGludDMyX3QgY29sT2Zmc2V0ID0gKGNvbCArIHJlY3QubGVmdCAvIGluZm8uY29sU2FtcGxpbmcpICogaW5mby5jb2xJbmM7CisgICAgICAgICAgICBhZGRyW3Jvd09mZnNldCArIGNvbE9mZnNldF0gPSB2YWx1ZTsKKyAgICAgICAgfQorICAgIH0KK30KKworYm9vbCB2ZXJpZnlQbGFuZShjb25zdCBDMlJlY3QgcmVjdCwgY29uc3QgQzJQbGFuZUluZm8gaW5mbywgY29uc3QgdWludDhfdCAqYWRkciwgdWludDhfdCB2YWx1ZSkgeworICAgIGZvciAodWludDMyX3Qgcm93ID0gMDsgcm93IDwgcmVjdC5oZWlnaHQgLyBpbmZvLnJvd1NhbXBsaW5nOyArK3JvdykgeworICAgICAgICBpbnQzMl90IHJvd09mZnNldCA9IChyb3cgKyByZWN0LnRvcCAvIGluZm8ucm93U2FtcGxpbmcpICogaW5mby5yb3dJbmM7CisgICAgICAgIGZvciAodWludDMyX3QgY29sID0gMDsgY29sIDwgcmVjdC53aWR0aCAvIGluZm8uY29sU2FtcGxpbmc7ICsrY29sKSB7CisgICAgICAgICAgICBpbnQzMl90IGNvbE9mZnNldCA9IChjb2wgKyByZWN0LmxlZnQgLyBpbmZvLmNvbFNhbXBsaW5nKSAqIGluZm8uY29sSW5jOworICAgICAgICAgICAgaWYgKGFkZHJbcm93T2Zmc2V0ICsgY29sT2Zmc2V0XSAhPSB2YWx1ZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworVEVTVF9GKEMyQnVmZmVyVGVzdCwgR3JhcGhpY0FsbG9jYXRpb25UZXN0KSB7CisgICAgY29uc3RleHByIHVpbnQzMl90IGtXaWR0aCA9IDMyMDsKKyAgICBjb25zdGV4cHIgdWludDMyX3Qga0hlaWdodCA9IDI0MDsKKworICAgIGFsbG9jYXRlR3JhcGhpYyhrV2lkdGgsIGtIZWlnaHQpOworCisgICAgdWludDhfdCAqYWRkcltDMlBsYW5hckxheW91dDo6TUFYX05VTV9QTEFORVNdOworICAgIEMyUmVjdCByZWN0KGtXaWR0aCwga0hlaWdodCk7CisgICAgQzJQbGFuYXJMYXlvdXQgbGF5b3V0OworICAgIG1hcEdyYXBoaWMocmVjdCwgJmxheW91dCwgYWRkcik7CisgICAgQVNTRVJUX05FKG51bGxwdHIsIGFkZHJbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldKTsKKyAgICBBU1NFUlRfTkUobnVsbHB0ciwgYWRkcltDMlBsYW5hckxheW91dDo6UExBTkVfVV0pOworICAgIEFTU0VSVF9ORShudWxscHRyLCBhZGRyW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9WXSk7CisKKyAgICB1aW50OF90ICp5ID0gYWRkcltDMlBsYW5hckxheW91dDo6UExBTkVfWV07CisgICAgQzJQbGFuZUluZm8geUluZm8gPSBsYXlvdXQucGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXTsKKyAgICB1aW50OF90ICp1ID0gYWRkcltDMlBsYW5hckxheW91dDo6UExBTkVfVV07CisgICAgQzJQbGFuZUluZm8gdUluZm8gPSBsYXlvdXQucGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXTsKKyAgICB1aW50OF90ICp2ID0gYWRkcltDMlBsYW5hckxheW91dDo6UExBTkVfVl07CisgICAgQzJQbGFuZUluZm8gdkluZm8gPSBsYXlvdXQucGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9WXTsKKworICAgIGZpbGxQbGFuZShyZWN0LCB5SW5mbywgeSwgMCk7CisgICAgZmlsbFBsYW5lKHJlY3QsIHVJbmZvLCB1LCAwKTsKKyAgICBmaWxsUGxhbmUocmVjdCwgdkluZm8sIHYsIDApOworICAgIGZpbGxQbGFuZShDMlJlY3Qoa1dpZHRoIC8gMiwga0hlaWdodCAvIDIpLmF0KGtXaWR0aCAvIDQsIGtIZWlnaHQgLyA0KSwgeUluZm8sIHksIDB4MTIpOworICAgIGZpbGxQbGFuZShDMlJlY3Qoa1dpZHRoIC8gMiwga0hlaWdodCAvIDIpLmF0KGtXaWR0aCAvIDQsIGtIZWlnaHQgLyA0KSwgdUluZm8sIHUsIDB4MzQpOworICAgIGZpbGxQbGFuZShDMlJlY3Qoa1dpZHRoIC8gMiwga0hlaWdodCAvIDIpLmF0KGtXaWR0aCAvIDQsIGtIZWlnaHQgLyA0KSwgdkluZm8sIHYsIDB4NTYpOworCisgICAgdW5tYXBHcmFwaGljKCk7CisKKyAgICBtYXBHcmFwaGljKHJlY3QsICZsYXlvdXQsIGFkZHIpOworICAgIEFTU0VSVF9ORShudWxscHRyLCBhZGRyW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXSk7CisgICAgQVNTRVJUX05FKG51bGxwdHIsIGFkZHJbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdKTsKKyAgICBBU1NFUlRfTkUobnVsbHB0ciwgYWRkcltDMlBsYW5hckxheW91dDo6UExBTkVfVl0pOworCisgICAgeSA9IGFkZHJbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldOworICAgIHlJbmZvID0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfWV07CisgICAgdSA9IGFkZHJbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdOworICAgIHVJbmZvID0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVV07CisgICAgdiA9IGFkZHJbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdOworICAgIHZJbmZvID0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVl07CisKKyAgICBBU1NFUlRfVFJVRSh2ZXJpZnlQbGFuZShDMlJlY3Qoa1dpZHRoIC8gMiwga0hlaWdodCAvIDIpLmF0KGtXaWR0aCAvIDQsIGtIZWlnaHQgLyA0KSwgeUluZm8sIHksIDB4MTIpKTsKKyAgICBBU1NFUlRfVFJVRSh2ZXJpZnlQbGFuZShDMlJlY3Qoa1dpZHRoIC8gMiwga0hlaWdodCAvIDIpLmF0KGtXaWR0aCAvIDQsIGtIZWlnaHQgLyA0KSwgdUluZm8sIHUsIDB4MzQpKTsKKyAgICBBU1NFUlRfVFJVRSh2ZXJpZnlQbGFuZShDMlJlY3Qoa1dpZHRoIC8gMiwga0hlaWdodCAvIDIpLmF0KGtXaWR0aCAvIDQsIGtIZWlnaHQgLyA0KSwgdkluZm8sIHYsIDB4NTYpKTsKKyAgICBBU1NFUlRfVFJVRSh2ZXJpZnlQbGFuZSh7IGtXaWR0aCwga0hlaWdodCAvIDQgfSwgeUluZm8sIHksIDApKTsKKyAgICBBU1NFUlRfVFJVRSh2ZXJpZnlQbGFuZSh7IGtXaWR0aCwga0hlaWdodCAvIDQgfSwgdUluZm8sIHUsIDApKTsKKyAgICBBU1NFUlRfVFJVRSh2ZXJpZnlQbGFuZSh7IGtXaWR0aCwga0hlaWdodCAvIDQgfSwgdkluZm8sIHYsIDApKTsKKyAgICBBU1NFUlRfVFJVRSh2ZXJpZnlQbGFuZSh7IGtXaWR0aCAvIDQsIGtIZWlnaHQgfSwgeUluZm8sIHksIDApKTsKKyAgICBBU1NFUlRfVFJVRSh2ZXJpZnlQbGFuZSh7IGtXaWR0aCAvIDQsIGtIZWlnaHQgfSwgdUluZm8sIHUsIDApKTsKKyAgICBBU1NFUlRfVFJVRSh2ZXJpZnlQbGFuZSh7IGtXaWR0aCAvIDQsIGtIZWlnaHQgfSwgdkluZm8sIHYsIDApKTsKK30KKworVEVTVF9GKEMyQnVmZmVyVGVzdCwgR3JhcGhpY0Jsb2NrUG9vbFRlc3QpIHsKKyAgICBjb25zdGV4cHIgdWludDMyX3Qga1dpZHRoID0gMzIwOworICAgIGNvbnN0ZXhwciB1aW50MzJfdCBrSGVpZ2h0ID0gMjQwOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiBibG9ja1Bvb2wobWFrZUdyYXBoaWNCbG9ja1Bvb2woKSk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+IGJsb2NrOworICAgIEFTU0VSVF9FUShDMl9PSywgYmxvY2tQb29sLT5mZXRjaEdyYXBoaWNCbG9jaygKKyAgICAgICAgICAgIGtXaWR0aCwKKyAgICAgICAgICAgIGtIZWlnaHQsCisgICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUX1lDQkNSXzQyMF84ODgsCisgICAgICAgICAgICB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfSwKKyAgICAgICAgICAgICZibG9jaykpOworICAgIEFTU0VSVF9UUlVFKGJsb2NrKTsKKworICAgIEMyQWNxdWlyYWJsZTxDMkdyYXBoaWNWaWV3PiBncmFwaGljVmlld0hvbGRlciA9IGJsb2NrLT5tYXAoKTsKKyAgICBDMkdyYXBoaWNWaWV3IGdyYXBoaWNWaWV3ID0gZ3JhcGhpY1ZpZXdIb2xkZXIuZ2V0KCk7CisgICAgQVNTRVJUX0VRKEMyX09LLCBncmFwaGljVmlldy5lcnJvcigpKTsKKyAgICBBU1NFUlRfRVEoa1dpZHRoLCBncmFwaGljVmlldy53aWR0aCgpKTsKKyAgICBBU1NFUlRfRVEoa0hlaWdodCwgZ3JhcGhpY1ZpZXcuaGVpZ2h0KCkpOworCisgICAgdWludDhfdCAqY29uc3QgKmRhdGEgPSBncmFwaGljVmlldy5kYXRhKCk7CisgICAgQzJQbGFuYXJMYXlvdXQgbGF5b3V0ID0gZ3JhcGhpY1ZpZXcubGF5b3V0KCk7CisgICAgQVNTRVJUX05FKG51bGxwdHIsIGRhdGEpOworCisgICAgdWludDhfdCAqeSA9IGRhdGFbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldOworICAgIEMyUGxhbmVJbmZvIHlJbmZvID0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfWV07CisgICAgdWludDhfdCAqdSA9IGRhdGFbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdOworICAgIEMyUGxhbmVJbmZvIHVJbmZvID0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVV07CisgICAgdWludDhfdCAqdiA9IGRhdGFbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdOworICAgIEMyUGxhbmVJbmZvIHZJbmZvID0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVl07CisKKyAgICBmaWxsUGxhbmUoeyBrV2lkdGgsIGtIZWlnaHQgfSwgeUluZm8sIHksIDApOworICAgIGZpbGxQbGFuZSh7IGtXaWR0aCwga0hlaWdodCB9LCB1SW5mbywgdSwgMCk7CisgICAgZmlsbFBsYW5lKHsga1dpZHRoLCBrSGVpZ2h0IH0sIHZJbmZvLCB2LCAwKTsKKyAgICBmaWxsUGxhbmUoQzJSZWN0KGtXaWR0aCAvIDIsIGtIZWlnaHQgLyAyKS5hdChrV2lkdGggLyA0LCBrSGVpZ2h0IC8gNCksIHlJbmZvLCB5LCAweDEyKTsKKyAgICBmaWxsUGxhbmUoQzJSZWN0KGtXaWR0aCAvIDIsIGtIZWlnaHQgLyAyKS5hdChrV2lkdGggLyA0LCBrSGVpZ2h0IC8gNCksIHVJbmZvLCB1LCAweDM0KTsKKyAgICBmaWxsUGxhbmUoQzJSZWN0KGtXaWR0aCAvIDIsIGtIZWlnaHQgLyAyKS5hdChrV2lkdGggLyA0LCBrSGVpZ2h0IC8gNCksIHZJbmZvLCB2LCAweDU2KTsKKworICAgIEMyRmVuY2UgZmVuY2U7CisgICAgQzJDb25zdEdyYXBoaWNCbG9jayBjb25zdEJsb2NrID0gYmxvY2stPnNoYXJlKEMyUmVjdChrV2lkdGgsIGtIZWlnaHQpLCBmZW5jZSk7CisgICAgYmxvY2sucmVzZXQoKTsKKworICAgIEMyQWNxdWlyYWJsZTxjb25zdCBDMkdyYXBoaWNWaWV3PiBjb25zdFZpZXdIb2xkZXIgPSBjb25zdEJsb2NrLm1hcCgpOworICAgIGNvbnN0IEMyR3JhcGhpY1ZpZXcgY29uc3RHcmFwaGljVmlldyA9IGNvbnN0Vmlld0hvbGRlci5nZXQoKTsKKyAgICBBU1NFUlRfRVEoQzJfT0ssIGNvbnN0R3JhcGhpY1ZpZXcuZXJyb3IoKSk7CisgICAgQVNTRVJUX0VRKGtXaWR0aCwgY29uc3RHcmFwaGljVmlldy53aWR0aCgpKTsKKyAgICBBU1NFUlRfRVEoa0hlaWdodCwgY29uc3RHcmFwaGljVmlldy5oZWlnaHQoKSk7CisKKyAgICBjb25zdCB1aW50OF90ICpjb25zdCAqY29uc3REYXRhID0gY29uc3RHcmFwaGljVmlldy5kYXRhKCk7CisgICAgbGF5b3V0ID0gZ3JhcGhpY1ZpZXcubGF5b3V0KCk7CisgICAgQVNTRVJUX05FKG51bGxwdHIsIGNvbnN0RGF0YSk7CisKKyAgICBjb25zdCB1aW50OF90ICpjeSA9IGNvbnN0RGF0YVtDMlBsYW5hckxheW91dDo6UExBTkVfWV07CisgICAgeUluZm8gPSBsYXlvdXQucGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXTsKKyAgICBjb25zdCB1aW50OF90ICpjdSA9IGNvbnN0RGF0YVtDMlBsYW5hckxheW91dDo6UExBTkVfVV07CisgICAgdUluZm8gPSBsYXlvdXQucGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXTsKKyAgICBjb25zdCB1aW50OF90ICpjdiA9IGNvbnN0RGF0YVtDMlBsYW5hckxheW91dDo6UExBTkVfVl07CisgICAgdkluZm8gPSBsYXlvdXQucGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9WXTsKKworICAgIEFTU0VSVF9UUlVFKHZlcmlmeVBsYW5lKEMyUmVjdChrV2lkdGggLyAyLCBrSGVpZ2h0IC8gMikuYXQoa1dpZHRoIC8gNCwga0hlaWdodCAvIDQpLCB5SW5mbywgY3ksIDB4MTIpKTsKKyAgICBBU1NFUlRfVFJVRSh2ZXJpZnlQbGFuZShDMlJlY3Qoa1dpZHRoIC8gMiwga0hlaWdodCAvIDIpLmF0KGtXaWR0aCAvIDQsIGtIZWlnaHQgLyA0KSwgdUluZm8sIGN1LCAweDM0KSk7CisgICAgQVNTRVJUX1RSVUUodmVyaWZ5UGxhbmUoQzJSZWN0KGtXaWR0aCAvIDIsIGtIZWlnaHQgLyAyKS5hdChrV2lkdGggLyA0LCBrSGVpZ2h0IC8gNCksIHZJbmZvLCBjdiwgMHg1NikpOworICAgIEFTU0VSVF9UUlVFKHZlcmlmeVBsYW5lKHsga1dpZHRoLCBrSGVpZ2h0IC8gNCB9LCB5SW5mbywgY3ksIDApKTsKKyAgICBBU1NFUlRfVFJVRSh2ZXJpZnlQbGFuZSh7IGtXaWR0aCwga0hlaWdodCAvIDQgfSwgdUluZm8sIGN1LCAwKSk7CisgICAgQVNTRVJUX1RSVUUodmVyaWZ5UGxhbmUoeyBrV2lkdGgsIGtIZWlnaHQgLyA0IH0sIHZJbmZvLCBjdiwgMCkpOworICAgIEFTU0VSVF9UUlVFKHZlcmlmeVBsYW5lKHsga1dpZHRoIC8gNCwga0hlaWdodCB9LCB5SW5mbywgY3ksIDApKTsKKyAgICBBU1NFUlRfVFJVRSh2ZXJpZnlQbGFuZSh7IGtXaWR0aCAvIDQsIGtIZWlnaHQgfSwgdUluZm8sIGN1LCAwKSk7CisgICAgQVNTRVJUX1RSVUUodmVyaWZ5UGxhbmUoeyBrV2lkdGggLyA0LCBrSGVpZ2h0IH0sIHZJbmZvLCBjdiwgMCkpOworfQorCitjbGFzcyBCdWZmZXJEYXRhIDogcHVibGljIEMyQnVmZmVyRGF0YSB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgQnVmZmVyRGF0YShjb25zdCBzdGQ6OnZlY3RvcjxDMkNvbnN0TGluZWFyQmxvY2s+ICZibG9ja3MpIDogQzJCdWZmZXJEYXRhKGJsb2Nrcykge30KKyAgICBleHBsaWNpdCBCdWZmZXJEYXRhKGNvbnN0IHN0ZDo6dmVjdG9yPEMyQ29uc3RHcmFwaGljQmxvY2s+ICZibG9ja3MpIDogQzJCdWZmZXJEYXRhKGJsb2Nrcykge30KK307CisKK2NsYXNzIEJ1ZmZlciA6IHB1YmxpYyBDMkJ1ZmZlciB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgQnVmZmVyKGNvbnN0IHN0ZDo6dmVjdG9yPEMyQ29uc3RMaW5lYXJCbG9jaz4gJmJsb2NrcykgOiBDMkJ1ZmZlcihibG9ja3MpIHt9CisgICAgZXhwbGljaXQgQnVmZmVyKGNvbnN0IHN0ZDo6dmVjdG9yPEMyQ29uc3RHcmFwaGljQmxvY2s+ICZibG9ja3MpIDogQzJCdWZmZXIoYmxvY2tzKSB7fQorfTsKKworVEVTVF9GKEMyQnVmZmVyVGVzdCwgQnVmZmVyRGF0YVRlc3QpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+IGxpbmVhckJsb2NrUG9vbChtYWtlTGluZWFyQmxvY2tQb29sKCkpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gZ3JhcGhpY0Jsb2NrUG9vbChtYWtlR3JhcGhpY0Jsb2NrUG9vbCgpKTsKKworICAgIGNvbnN0ZXhwciB1aW50MzJfdCBrV2lkdGgxID0gMzIwOworICAgIGNvbnN0ZXhwciB1aW50MzJfdCBrSGVpZ2h0MSA9IDI0MDsKKyAgICBjb25zdGV4cHIgQzJSZWN0IGtDcm9wMShrV2lkdGgxLCBrSGVpZ2h0MSk7CisgICAgY29uc3RleHByIHVpbnQzMl90IGtXaWR0aDIgPSAxNzY7CisgICAgY29uc3RleHByIHVpbnQzMl90IGtIZWlnaHQyID0gMTQ0OworICAgIGNvbnN0ZXhwciBDMlJlY3Qga0Nyb3AyKGtXaWR0aDIsIGtIZWlnaHQyKTsKKyAgICBjb25zdGV4cHIgc2l6ZV90IGtDYXBhY2l0eTEgPSAxMDI0dTsKKyAgICBjb25zdGV4cHIgc2l6ZV90IGtDYXBhY2l0eTIgPSAyMDQ4dTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBsaW5lYXJCbG9jazE7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IGxpbmVhckJsb2NrMjsKKyAgICBBU1NFUlRfRVEoQzJfT0ssIGxpbmVhckJsb2NrUG9vbC0+ZmV0Y2hMaW5lYXJCbG9jaygKKyAgICAgICAgICAgIGtDYXBhY2l0eTEsCisgICAgICAgICAgICB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfSwKKyAgICAgICAgICAgICZsaW5lYXJCbG9jazEpKTsKKyAgICBBU1NFUlRfRVEoQzJfT0ssIGxpbmVhckJsb2NrUG9vbC0+ZmV0Y2hMaW5lYXJCbG9jaygKKyAgICAgICAgICAgIGtDYXBhY2l0eTIsCisgICAgICAgICAgICB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfSwKKyAgICAgICAgICAgICZsaW5lYXJCbG9jazIpKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+IGdyYXBoaWNCbG9jazE7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiBncmFwaGljQmxvY2syOworICAgIEFTU0VSVF9FUShDMl9PSywgZ3JhcGhpY0Jsb2NrUG9vbC0+ZmV0Y2hHcmFwaGljQmxvY2soCisgICAgICAgICAgICBrV2lkdGgxLAorICAgICAgICAgICAga0hlaWdodDEsCisgICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUX1lDQkNSXzQyMF84ODgsCisgICAgICAgICAgICB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfSwKKyAgICAgICAgICAgICZncmFwaGljQmxvY2sxKSk7CisgICAgQVNTRVJUX0VRKEMyX09LLCBncmFwaGljQmxvY2tQb29sLT5mZXRjaEdyYXBoaWNCbG9jaygKKyAgICAgICAgICAgIGtXaWR0aDIsCisgICAgICAgICAgICBrSGVpZ2h0MiwKKyAgICAgICAgICAgIEhBTF9QSVhFTF9GT1JNQVRfWUNCQ1JfNDIwXzg4OCwKKyAgICAgICAgICAgIHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9LAorICAgICAgICAgICAgJmdyYXBoaWNCbG9jazIpKTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlckRhdGE+IGRhdGEobmV3IEJ1ZmZlckRhdGEoeyBsaW5lYXJCbG9jazEtPnNoYXJlKDAsIGtDYXBhY2l0eTEsIEMyRmVuY2UoKSkgfSkpOworICAgIEVYUEVDVF9FUShDMkJ1ZmZlckRhdGE6OkxJTkVBUiwgZGF0YS0+dHlwZSgpKTsKKyAgICBBU1NFUlRfRVEoMXUsIGRhdGEtPmxpbmVhckJsb2NrcygpLnNpemUoKSk7CisgICAgRVhQRUNUX0VRKGxpbmVhckJsb2NrMS0+aGFuZGxlKCksIGRhdGEtPmxpbmVhckJsb2NrcygpLmZyb250KCkuaGFuZGxlKCkpOworICAgIEVYUEVDVF9UUlVFKGRhdGEtPmdyYXBoaWNCbG9ja3MoKS5lbXB0eSgpKTsKKworICAgIGRhdGEucmVzZXQobmV3IEJ1ZmZlckRhdGEoeworICAgICAgICBsaW5lYXJCbG9jazEtPnNoYXJlKDAsIGtDYXBhY2l0eTEsIEMyRmVuY2UoKSksCisgICAgICAgIGxpbmVhckJsb2NrMi0+c2hhcmUoMCwga0NhcGFjaXR5MiwgQzJGZW5jZSgpKSwKKyAgICB9KSk7CisgICAgRVhQRUNUX0VRKEMyQnVmZmVyRGF0YTo6TElORUFSX0NIVU5LUywgZGF0YS0+dHlwZSgpKTsKKyAgICBBU1NFUlRfRVEoMnUsIGRhdGEtPmxpbmVhckJsb2NrcygpLnNpemUoKSk7CisgICAgRVhQRUNUX0VRKGxpbmVhckJsb2NrMS0+aGFuZGxlKCksIGRhdGEtPmxpbmVhckJsb2NrcygpLmZyb250KCkuaGFuZGxlKCkpOworICAgIEVYUEVDVF9FUShsaW5lYXJCbG9jazItPmhhbmRsZSgpLCBkYXRhLT5saW5lYXJCbG9ja3MoKS5iYWNrKCkuaGFuZGxlKCkpOworICAgIEVYUEVDVF9UUlVFKGRhdGEtPmdyYXBoaWNCbG9ja3MoKS5lbXB0eSgpKTsKKworICAgIGRhdGEucmVzZXQobmV3IEJ1ZmZlckRhdGEoeyBncmFwaGljQmxvY2sxLT5zaGFyZShrQ3JvcDEsIEMyRmVuY2UoKSkgfSkpOworICAgIEVYUEVDVF9FUShDMkJ1ZmZlckRhdGE6OkdSQVBISUMsIGRhdGEtPnR5cGUoKSk7CisgICAgQVNTRVJUX0VRKDF1LCBkYXRhLT5ncmFwaGljQmxvY2tzKCkuc2l6ZSgpKTsKKyAgICBFWFBFQ1RfRVEoZ3JhcGhpY0Jsb2NrMS0+aGFuZGxlKCksIGRhdGEtPmdyYXBoaWNCbG9ja3MoKS5mcm9udCgpLmhhbmRsZSgpKTsKKyAgICBFWFBFQ1RfVFJVRShkYXRhLT5saW5lYXJCbG9ja3MoKS5lbXB0eSgpKTsKKworICAgIGRhdGEucmVzZXQobmV3IEJ1ZmZlckRhdGEoeworICAgICAgICBncmFwaGljQmxvY2sxLT5zaGFyZShrQ3JvcDEsIEMyRmVuY2UoKSksCisgICAgICAgIGdyYXBoaWNCbG9jazItPnNoYXJlKGtDcm9wMiwgQzJGZW5jZSgpKSwKKyAgICB9KSk7CisgICAgRVhQRUNUX0VRKEMyQnVmZmVyRGF0YTo6R1JBUEhJQ19DSFVOS1MsIGRhdGEtPnR5cGUoKSk7CisgICAgQVNTRVJUX0VRKDJ1LCBkYXRhLT5ncmFwaGljQmxvY2tzKCkuc2l6ZSgpKTsKKyAgICBFWFBFQ1RfRVEoZ3JhcGhpY0Jsb2NrMS0+aGFuZGxlKCksIGRhdGEtPmdyYXBoaWNCbG9ja3MoKS5mcm9udCgpLmhhbmRsZSgpKTsKKyAgICBFWFBFQ1RfRVEoZ3JhcGhpY0Jsb2NrMi0+aGFuZGxlKCksIGRhdGEtPmdyYXBoaWNCbG9ja3MoKS5iYWNrKCkuaGFuZGxlKCkpOworICAgIEVYUEVDVF9UUlVFKGRhdGEtPmxpbmVhckJsb2NrcygpLmVtcHR5KCkpOworfQorCit2b2lkIERlc3Ryb3lDYWxsYmFjayhjb25zdCBDMkJ1ZmZlciAqIC8qIGJ1ZiAqLywgdm9pZCAqYXJnKSB7CisgICAgc3RkOjpmdW5jdGlvbjx2b2lkKHZvaWQpPiAqY2IgPSAoc3RkOjpmdW5jdGlvbjx2b2lkKHZvaWQpPiAqKWFyZzsKKyAgICAoKmNiKSgpOworfQorCitlbnVtIDogdWludDMyX3QgeworICAgIGtQYXJhbUluZGV4TnVtYmVyMSwKKyAgICBrUGFyYW1JbmRleE51bWJlcjIsCit9OworCit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJJbmZvLCBDMkludDMyVmFsdWUsIGtQYXJhbUluZGV4TnVtYmVyMT4gQzJOdW1iZXIxSW5mbzsKK3R5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMkluZm8sIEMySW50MzJWYWx1ZSwga1BhcmFtSW5kZXhOdW1iZXIyPiBDMk51bWJlcjJJbmZvOworCitURVNUX0YoQzJCdWZmZXJUZXN0LCBCdWZmZXJUZXN0KSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiBhbGxvYyhtYWtlTGluZWFyQmxvY2tQb29sKCkpOworICAgIGNvbnN0ZXhwciBzaXplX3Qga0NhcGFjaXR5ID0gMTAyNHU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IGJsb2NrOworCisgICAgQVNTRVJUX0VRKEMyX09LLCBhbGxvYy0+ZmV0Y2hMaW5lYXJCbG9jaygKKyAgICAgICAgICAgIGtDYXBhY2l0eSwKKyAgICAgICAgICAgIHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9LAorICAgICAgICAgICAgJmJsb2NrKSk7CisKKyAgICBzdGQ6OmF0b21pY19ib29sIGRlc3Ryb3llZChmYWxzZSk7CisgICAgc3RkOjpmdW5jdGlvbjx2b2lkKHZvaWQpPiBhcmcgPSBbJmRlc3Ryb3llZF0oKXsgZGVzdHJveWVkID0gdHJ1ZTsgfTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYnVmZmVyKG5ldyBCdWZmZXIoIHsgYmxvY2stPnNoYXJlKDAsIGtDYXBhY2l0eSwgQzJGZW5jZSgpKSB9KSk7CisgICAgQVNTRVJUX0VRKEMyX09LLCBidWZmZXItPnJlZ2lzdGVyT25EZXN0cm95Tm90aWZ5KCZEZXN0cm95Q2FsbGJhY2ssICZhcmcpKTsKKyAgICBFWFBFQ1RfRkFMU0UoZGVzdHJveWVkKTsKKyAgICBBU1NFUlRfRVEoQzJfRFVQTElDQVRFLCBidWZmZXItPnJlZ2lzdGVyT25EZXN0cm95Tm90aWZ5KCZEZXN0cm95Q2FsbGJhY2ssICZhcmcpKTsKKyAgICBidWZmZXIucmVzZXQoKTsKKyAgICBFWFBFQ1RfVFJVRShkZXN0cm95ZWQpOworCisgICAgYnVmZmVyLnJlc2V0KG5ldyBCdWZmZXIoIHsgYmxvY2stPnNoYXJlKDAsIGtDYXBhY2l0eSwgQzJGZW5jZSgpKSB9KSk7CisgICAgZGVzdHJveWVkID0gZmFsc2U7CisgICAgQVNTRVJUX0VRKEMyX09LLCBidWZmZXItPnJlZ2lzdGVyT25EZXN0cm95Tm90aWZ5KCZEZXN0cm95Q2FsbGJhY2ssICZhcmcpKTsKKyAgICBFWFBFQ1RfRkFMU0UoZGVzdHJveWVkKTsKKyAgICBBU1NFUlRfRVEoQzJfTk9UX0ZPVU5ELCBidWZmZXItPnVucmVnaXN0ZXJPbkRlc3Ryb3lOb3RpZnkoJkRlc3Ryb3lDYWxsYmFjaywgbnVsbHB0cikpOworICAgIEFTU0VSVF9FUShDMl9PSywgYnVmZmVyLT51bnJlZ2lzdGVyT25EZXN0cm95Tm90aWZ5KCZEZXN0cm95Q2FsbGJhY2ssICZhcmcpKTsKKyAgICBFWFBFQ1RfRkFMU0UoZGVzdHJveWVkKTsKKyAgICBBU1NFUlRfRVEoQzJfTk9UX0ZPVU5ELCBidWZmZXItPnVucmVnaXN0ZXJPbkRlc3Ryb3lOb3RpZnkoJkRlc3Ryb3lDYWxsYmFjaywgJmFyZykpOworICAgIGJ1ZmZlci5yZXNldCgpOworICAgIEVYUEVDVF9GQUxTRShkZXN0cm95ZWQpOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMySW5mbz4gaW5mbzEobmV3IEMyTnVtYmVyMUluZm8oMSkpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkluZm8+IGluZm8yKG5ldyBDMk51bWJlcjJJbmZvKDIpKTsKKyAgICBidWZmZXIucmVzZXQobmV3IEJ1ZmZlciggeyBibG9jay0+c2hhcmUoMCwga0NhcGFjaXR5LCBDMkZlbmNlKCkpIH0pKTsKKyAgICBFWFBFQ1RfVFJVRShidWZmZXItPmluZm8oKS5lbXB0eSgpKTsKKyAgICBFWFBFQ1RfRkFMU0UoYnVmZmVyLT5oYXNJbmZvKGluZm8xLT50eXBlKCkpKTsKKyAgICBFWFBFQ1RfRkFMU0UoYnVmZmVyLT5oYXNJbmZvKGluZm8yLT50eXBlKCkpKTsKKworICAgIEFTU0VSVF9FUShDMl9PSywgYnVmZmVyLT5zZXRJbmZvKGluZm8xKSk7CisgICAgRVhQRUNUX0VRKDF1LCBidWZmZXItPmluZm8oKS5zaXplKCkpOworICAgIEVYUEVDVF9FUSgqaW5mbzEsICpidWZmZXItPmluZm8oKS5mcm9udCgpKTsKKyAgICBFWFBFQ1RfVFJVRShidWZmZXItPmhhc0luZm8oaW5mbzEtPnR5cGUoKSkpOworICAgIEVYUEVDVF9GQUxTRShidWZmZXItPmhhc0luZm8oaW5mbzItPnR5cGUoKSkpOworCisgICAgQVNTRVJUX0VRKEMyX09LLCBidWZmZXItPnNldEluZm8oaW5mbzIpKTsKKyAgICBFWFBFQ1RfRVEoMnUsIGJ1ZmZlci0+aW5mbygpLnNpemUoKSk7CisgICAgRVhQRUNUX1RSVUUoYnVmZmVyLT5oYXNJbmZvKGluZm8xLT50eXBlKCkpKTsKKyAgICBFWFBFQ1RfVFJVRShidWZmZXItPmhhc0luZm8oaW5mbzItPnR5cGUoKSkpOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMySW5mbz4gcmVtb3ZlZCA9IGJ1ZmZlci0+cmVtb3ZlSW5mbyhpbmZvMS0+dHlwZSgpKTsKKyAgICBBU1NFUlRfVFJVRShyZW1vdmVkKTsKKyAgICBFWFBFQ1RfRVEoKnJlbW92ZWQsICppbmZvMSk7CisgICAgRVhQRUNUX0VRKDF1LCBidWZmZXItPmluZm8oKS5zaXplKCkpOworICAgIEVYUEVDVF9FUSgqaW5mbzIsICpidWZmZXItPmluZm8oKS5mcm9udCgpKTsKKyAgICBFWFBFQ1RfRkFMU0UoYnVmZmVyLT5oYXNJbmZvKGluZm8xLT50eXBlKCkpKTsKKyAgICBFWFBFQ1RfVFJVRShidWZmZXItPmhhc0luZm8oaW5mbzItPnR5cGUoKSkpOworCisgICAgcmVtb3ZlZCA9IGJ1ZmZlci0+cmVtb3ZlSW5mbyhpbmZvMS0+dHlwZSgpKTsKKyAgICBBU1NFUlRfRkFMU0UocmVtb3ZlZCk7CisgICAgRVhQRUNUX0VRKDF1LCBidWZmZXItPmluZm8oKS5zaXplKCkpOworICAgIEVYUEVDVF9GQUxTRShidWZmZXItPmhhc0luZm8oaW5mbzEtPnR5cGUoKSkpOworICAgIEVYUEVDVF9UUlVFKGJ1ZmZlci0+aGFzSW5mbyhpbmZvMi0+dHlwZSgpKSk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJJbmZvPiBpbmZvMyhuZXcgQzJOdW1iZXIySW5mbygzKSk7CisgICAgQVNTRVJUX0VRKEMyX09LLCBidWZmZXItPnNldEluZm8oaW5mbzMpKTsKKyAgICBFWFBFQ1RfRVEoMXUsIGJ1ZmZlci0+aW5mbygpLnNpemUoKSk7CisgICAgRVhQRUNUX0ZBTFNFKGJ1ZmZlci0+aGFzSW5mbyhpbmZvMS0+dHlwZSgpKSk7CisgICAgRVhQRUNUX1RSVUUoYnVmZmVyLT5oYXNJbmZvKGluZm8yLT50eXBlKCkpKTsKKworICAgIHJlbW92ZWQgPSBidWZmZXItPnJlbW92ZUluZm8oaW5mbzItPnR5cGUoKSk7CisgICAgQVNTRVJUX1RSVUUocmVtb3ZlZCk7CisgICAgRVhQRUNUX0VRKCppbmZvMywgKnJlbW92ZWQpOworICAgIEVYUEVDVF9UUlVFKGJ1ZmZlci0+aW5mbygpLmVtcHR5KCkpOworICAgIEVYUEVDVF9GQUxTRShidWZmZXItPmhhc0luZm8oaW5mbzEtPnR5cGUoKSkpOworICAgIEVYUEVDVF9GQUxTRShidWZmZXItPmhhc0luZm8oaW5mbzItPnR5cGUoKSkpOworfQorCitURVNUX0YoQzJCdWZmZXJUZXN0LCBNdWx0aXBsZUxpbmVhck1hcFRlc3QpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+IHBvb2wobWFrZUxpbmVhckJsb2NrUG9vbCgpKTsKKyAgICBjb25zdGV4cHIgc2l6ZV90IGtDYXBhY2l0eSA9IDUyNDI4OHU7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDA7ICsraSkgeworICAgICAgICBzdGQ6OnZlY3RvcjxDMldyaXRlVmlldz4gd1ZpZXdzOworICAgICAgICBzdGQ6OnZlY3RvcjxDMlJlYWRWaWV3PiByVmlld3M7CisgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgMTY7ICsraikgeworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IGJsb2NrOworICAgICAgICAgICAgQVNTRVJUX0VRKEMyX09LLCBwb29sLT5mZXRjaExpbmVhckJsb2NrKAorICAgICAgICAgICAgICAgICAgICBrQ2FwYWNpdHksCisgICAgICAgICAgICAgICAgICAgIHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9LAorICAgICAgICAgICAgICAgICAgICAmYmxvY2spKTsKKyAgICAgICAgICAgIHdWaWV3cy5wdXNoX2JhY2soYmxvY2stPm1hcCgpLmdldCgpKTsKKyAgICAgICAgICAgIEMyQ29uc3RMaW5lYXJCbG9jayBjQmxvY2sgPSBibG9jay0+c2hhcmUoMCwga0NhcGFjaXR5IC8gMiwgQzJGZW5jZSgpKTsKKyAgICAgICAgICAgIHJWaWV3cy5wdXNoX2JhY2soY0Jsb2NrLm1hcCgpLmdldCgpKTsKKyAgICAgICAgfQorICAgIH0KK30KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi92bmRrL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWE3Yzk4YwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwxMDIgQEAKK2NjX2xpYnJhcnlfaGVhZGVycyB7CisgICAgbmFtZTogImxpYmNvZGVjMl9pbnRlcm5hbCIsCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJpbnRlcm5hbCIsCisgICAgXSwKKworICAgIC8vIFRPRE86IFJlbW92ZSB0aGlzIHdoZW4gdGhpcyBtb2R1bGUgaXMgbW92ZWQgYmFjayB0byBmcmFtZXdvcmtzL2F2LgorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCit9CisKKy8vICEhIURPIE5PVCBERVBFTkQgT04gVEhJUyBTSEFSRUQgTElCUkFSWSBESVJFQ1RMWSEhIQorLy8gdXNlIGxpYmNvZGVjMi1pbXBsLWRlZmF1bHRzIGluc3RlYWQKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3ZuZGsiLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJDMkFsbG9jYXRvcklvbi5jcHAiLAorICAgICAgICAiQzJBbGxvY2F0b3JHcmFsbG9jLmNwcCIsCisgICAgICAgICJDMkJ1ZmZlci5jcHAiLAorICAgICAgICAiQzJDb25maWcuY3BwIiwKKyAgICAgICAgIkMyUGxhdGZvcm1TdG9yZVBsdWdpbkxvYWRlci5jcHAiLAorICAgICAgICAiQzJTdG9yZS5jcHAiLAorICAgICAgICAicGxhdGZvcm0vQzJCcUJ1ZmZlci5jcHAiLAorICAgICAgICAidXRpbC9DMkRlYnVnLmNwcCIsCisgICAgICAgICJ1dGlsL0MySW50ZXJmYWNlSGVscGVyLmNwcCIsCisgICAgICAgICJ1dGlsL0MySW50ZXJmYWNlVXRpbHMuY3BwIiwKKyAgICAgICAgInV0aWwvQzJQYXJhbVV0aWxzLmNwcCIsCisgICAgXSwKKworICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImluY2x1ZGUiLAorICAgIF0sCisKKyAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbCisgICAgICAgICJsaWJiYXNlIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYnVmZmVycG9vbEAxLjAiLAorICAgIF0sCisKKyAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImludGVybmFsIiwKKyAgICBdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL2hhcmR3YXJlIiwKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvY29kZWMyL2luY2x1ZGUiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5ncmFwaGljcy5hbGxvY2F0b3JAMi4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZ3JhcGhpY3MuYnVmZmVycXVldWVAMS4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZ3JhcGhpY3MubWFwcGVyQDIuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmJ1ZmZlcnBvb2xAMS4wIiwKKyAgICAgICAgImxpYmJhc2UiLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJkbCIsCisgICAgICAgICJsaWJoYXJkd2FyZSIsCisgICAgICAgICJsaWJoaWRsYmFzZSIsCisgICAgICAgICJsaWJpb24iLAorICAgICAgICAibGliZm1xIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9idWZmZXJxdWV1ZV9oZWxwZXIiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9idWZmZXJwb29sQDEuMCIsCisgICAgICAgICJsaWJ1aSIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2FsbCIsCisgICAgXSwKK30KKworLy8gcHVibGljIGRlcGVuZGVuY3kgZm9yIGltcGxlbWVudGluZyBDb2RlYyAyIGNvbXBvbmVudHMKK2NjX2RlZmF1bHRzIHsKKyAgICBuYW1lOiAibGliY29kZWMyLWltcGwtZGVmYXVsdHMiLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmJhc2UiLCAvLyBmb3IgQzJfTE9HCisgICAgICAgICJsaWJsb2ciLCAvLyBmb3IgQUxPRworICAgICAgICAibGliY29kZWMyIiwKKyAgICAgICAgImxpYmNvZGVjMl92bmRrIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorfQorCisvLyBwdWJsaWMgZGVwZW5kZW5jeSBmb3IgaW1wbGVtZW50aW5nIENvZGVjIDIgZnJhbWV3b3JrIHV0aWxpdGllcworLy8gVEhJUyBJUyBPTkxZIEZPUiBGUkFNRVdPUksgVVNFIE9OTFkKK2NjX2RlZmF1bHRzIHsKKyAgICBuYW1lOiAibGliY29kZWMyLWludGVybmFsLWRlZmF1bHRzIiwKKyAgICBkZWZhdWx0czogWyJsaWJjb2RlYzItaW1wbC1kZWZhdWx0cyJdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmN1dGlscyIsIC8vIGZvciBwcm9wZXJ0aWVzCisgICAgXSwKKworICAgIC8vIFRPRE86IHNlcGFyYXRlIGludGVybmFsIGhlYWRlcnMgc28gdGhleSBjYW4gYmUgZXhwb3NlZCBoZXJlCit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL0MyQWxsb2NhdG9yR3JhbGxvYy5jcHAgYi9tZWRpYS9jb2RlYzIvdm5kay9DMkFsbG9jYXRvckdyYWxsb2MuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyZThkODQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay9DMkFsbG9jYXRvckdyYWxsb2MuY3BwCkBAIC0wLDAgKzEsNzQzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDMkFsbG9jYXRvckdyYWxsb2MiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+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+KGJ1ZmZlcik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAgICAgQUxPR0QoImltcG9ydEJ1ZmZlciBmYWlsZWQ6ICVkIiwgZXJyKTsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1CdWZmZXIgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0QoImltcG9ydEJ1ZmZlciByZXR1cm5lZCBudWxsIGJ1ZmZlciIpOworICAgICAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICAgICAgfQorICAgICAgICB1aW50MzJfdCBnZW5lcmF0aW9uID0gMDsKKyAgICAgICAgdWludDY0X3QgaWdicF9pZCA9IDA7CisgICAgICAgIHVpbnQzMl90IGlnYnBfc2xvdCA9IDA7CisgICAgICAgIGlmIChtSGFuZGxlKSB7CisgICAgICAgICAgICBtSGFuZGxlLT5nZXRJZ2JwRGF0YSgmZ2VuZXJhdGlvbiwgJmlnYnBfaWQsICZpZ2JwX3Nsb3QpOworICAgICAgICB9CisgICAgICAgIG1Mb2NrZWRIYW5kbGUgPSBDMkhhbmRsZUdyYWxsb2M6OldyYXBOYXRpdmVIYW5kbGUoCisgICAgICAgICAgICAgICAgbUJ1ZmZlciwgbUluZm8ubWFwcGVySW5mby53aWR0aCwgbUluZm8ubWFwcGVySW5mby5oZWlnaHQsCisgICAgICAgICAgICAgICAgKHVpbnQzMl90KW1JbmZvLm1hcHBlckluZm8uZm9ybWF0LCBtSW5mby5tYXBwZXJJbmZvLnVzYWdlLCBtSW5mby5zdHJpZGUsCisgICAgICAgICAgICAgICAgZ2VuZXJhdGlvbiwgaWdicF9pZCwgaWdicF9zbG90KTsKKyAgICB9CisKKyAgICAvLyBVR0xZIEhBQ0s6IGFzc3VtZSBZQ2JDciA0OjI6MCA4LWJpdCBmb3JtYXQgKGFuZCBsb2NrYWJsZSB2aWEgbG9ja1lDYkNyKSBpZiB3ZSBkb24ndAorICAgIC8vIHJlY29nbml6ZSB0aGUgZm9ybWF0CisgICAgUGl4ZWxGb3JtYXQgZm9ybWF0ID0gbUluZm8ubWFwcGVySW5mby5mb3JtYXQ7CisgICAgaWYgKGZvcm1hdCAhPSBQaXhlbEZvcm1hdDo6UkdCQV84ODg4ICYmIGZvcm1hdCAhPSBQaXhlbEZvcm1hdDo6UkdCWF84ODg4KSB7CisgICAgICAgIGZvcm1hdCA9IFBpeGVsRm9ybWF0OjpZQ0JDUl80MjBfODg4OworICAgIH0KKworICAgIHN3aXRjaCAoZm9ybWF0KSB7CisgICAgICAgIGNhc2UgUGl4ZWxGb3JtYXQ6OllDQkNSXzQyMF84ODg6CisgICAgICAgIGNhc2UgUGl4ZWxGb3JtYXQ6OllWMTI6IHsKKyAgICAgICAgICAgIFlDYkNyTGF5b3V0IHljYmNyTGF5b3V0OworICAgICAgICAgICAgbU1hcHBlci0+bG9ja1lDYkNyKAorICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PG5hdGl2ZV9oYW5kbGVfdCAqPihtQnVmZmVyKSwgZ3JhbGxvY1VzYWdlLAorICAgICAgICAgICAgICAgICAgICB7IChpbnQzMl90KXJlY3QubGVmdCwgKGludDMyX3QpcmVjdC50b3AsIChpbnQzMl90KXJlY3Qud2lkdGgsIChpbnQzMl90KXJlY3QuaGVpZ2h0IH0sCisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGZlbmNlCisgICAgICAgICAgICAgICAgICAgIGhpZGxfaGFuZGxlKCksCisgICAgICAgICAgICAgICAgICAgIFsmZXJyLCAmeWNiY3JMYXlvdXRdKGNvbnN0IGF1dG8gJm1hcGVyciwgY29uc3QgYXV0byAmbWFwTGF5b3V0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBtYXBlcnIyZXJyb3IobWFwZXJyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB5Y2JjckxheW91dCA9IG1hcExheW91dDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgQUxPR0QoImxvY2tZQ2JDciBmYWlsZWQ6ICVkIiwgZXJyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYWRkcltDMlBsYW5hckxheW91dDo6UExBTkVfWV0gPSAodWludDhfdCAqKXljYmNyTGF5b3V0Lnk7CisgICAgICAgICAgICBhZGRyW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXSA9ICh1aW50OF90ICopeWNiY3JMYXlvdXQuY2I7CisgICAgICAgICAgICBhZGRyW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9WXSA9ICh1aW50OF90ICopeWNiY3JMYXlvdXQuY3I7CisgICAgICAgICAgICBsYXlvdXQtPnR5cGUgPSBDMlBsYW5hckxheW91dDo6VFlQRV9ZVVY7CisgICAgICAgICAgICBsYXlvdXQtPm51bVBsYW5lcyA9IDM7CisgICAgICAgICAgICBsYXlvdXQtPnJvb3RQbGFuZXMgPSAzOworICAgICAgICAgICAgbGF5b3V0LT5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldID0geworICAgICAgICAgICAgICAgIEMyUGxhbmVJbmZvOjpDSEFOTkVMX1ksICAgICAgICAgLy8gY2hhbm5lbAorICAgICAgICAgICAgICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29sSW5jCisgICAgICAgICAgICAgICAgKGludDMyX3QpeWNiY3JMYXlvdXQueVN0cmlkZSwgICAvLyByb3dJbmMKKyAgICAgICAgICAgICAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1Db2xTYW1wbGluZworICAgICAgICAgICAgICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbVJvd1NhbXBsaW5nCisgICAgICAgICAgICAgICAgOCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGxvY2F0ZWREZXB0aAorICAgICAgICAgICAgICAgIDgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYml0RGVwdGgKKyAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJpZ2h0U2hpZnQKKyAgICAgICAgICAgICAgICBDMlBsYW5lSW5mbzo6TkFUSVZFLCAgICAgICAgICAgIC8vIGVuZGlhbm5lc3MKKyAgICAgICAgICAgICAgICBDMlBsYW5hckxheW91dDo6UExBTkVfWSwgICAgICAgIC8vIHJvb3RJeAorICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2Zmc2V0CisgICAgICAgICAgICB9OworICAgICAgICAgICAgbGF5b3V0LT5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdID0geworICAgICAgICAgICAgICAgIEMyUGxhbmVJbmZvOjpDSEFOTkVMX0NCLCAgICAgICAgICAvLyBjaGFubmVsCisgICAgICAgICAgICAgICAgKGludDMyX3QpeWNiY3JMYXlvdXQuY2hyb21hU3RlcCwgIC8vIGNvbEluYworICAgICAgICAgICAgICAgIChpbnQzMl90KXljYmNyTGF5b3V0LmNTdHJpZGUsICAgICAvLyByb3dJbmMKKyAgICAgICAgICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbUNvbFNhbXBsaW5nCisgICAgICAgICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1Sb3dTYW1wbGluZworICAgICAgICAgICAgICAgIDgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGxvY2F0ZWREZXB0aAorICAgICAgICAgICAgICAgIDgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiaXREZXB0aAorICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByaWdodFNoaWZ0CisgICAgICAgICAgICAgICAgQzJQbGFuZUluZm86Ok5BVElWRSwgICAgICAgICAgICAgIC8vIGVuZGlhbm5lc3MKKyAgICAgICAgICAgICAgICBDMlBsYW5hckxheW91dDo6UExBTkVfVSwgICAgICAgICAgLy8gcm9vdEl4CisgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mZnNldAorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIGxheW91dC0+cGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9WXSA9IHsKKyAgICAgICAgICAgICAgICBDMlBsYW5lSW5mbzo6Q0hBTk5FTF9DUiwgICAgICAgICAgLy8gY2hhbm5lbAorICAgICAgICAgICAgICAgIChpbnQzMl90KXljYmNyTGF5b3V0LmNocm9tYVN0ZXAsICAvLyBjb2xJbmMKKyAgICAgICAgICAgICAgICAoaW50MzJfdCl5Y2JjckxheW91dC5jU3RyaWRlLCAgICAgLy8gcm93SW5jCisgICAgICAgICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1Db2xTYW1wbGluZworICAgICAgICAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtUm93U2FtcGxpbmcKKyAgICAgICAgICAgICAgICA4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsb2NhdGVkRGVwdGgKKyAgICAgICAgICAgICAgICA4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYml0RGVwdGgKKyAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmlnaHRTaGlmdAorICAgICAgICAgICAgICAgIEMyUGxhbmVJbmZvOjpOQVRJVkUsICAgICAgICAgICAgICAvLyBlbmRpYW5uZXNzCisgICAgICAgICAgICAgICAgQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1YsICAgICAgICAgIC8vIHJvb3RJeAorICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZmZzZXQKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICAvLyBoYW5kbGUgaW50ZXJsZWF2ZWQgZm9ybWF0cworICAgICAgICAgICAgaW50cHRyX3QgdXZPZmZzZXQgPSBhZGRyW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9WXSAtIGFkZHJbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdOworICAgICAgICAgICAgaWYgKHV2T2Zmc2V0ID4gMCAmJiB1dk9mZnNldCA8IChpbnRwdHJfdCl5Y2JjckxheW91dC5jaHJvbWFTdGVwKSB7CisgICAgICAgICAgICAgICAgbGF5b3V0LT5yb290UGxhbmVzID0gMjsKKyAgICAgICAgICAgICAgICBsYXlvdXQtPnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVl0ucm9vdEl4ID0gQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1U7CisgICAgICAgICAgICAgICAgbGF5b3V0LT5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdLm9mZnNldCA9IHV2T2Zmc2V0OworICAgICAgICAgICAgfSBlbHNlIGlmICh1dk9mZnNldCA8IDAgJiYgdXZPZmZzZXQgPiAtKGludHB0cl90KXljYmNyTGF5b3V0LmNocm9tYVN0ZXApIHsKKyAgICAgICAgICAgICAgICBsYXlvdXQtPnJvb3RQbGFuZXMgPSAyOworICAgICAgICAgICAgICAgIGxheW91dC0+cGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXS5yb290SXggPSBDMlBsYW5hckxheW91dDo6UExBTkVfVjsKKyAgICAgICAgICAgICAgICBsYXlvdXQtPnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVV0ub2Zmc2V0ID0gLXV2T2Zmc2V0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIFBpeGVsRm9ybWF0OjpSR0JBXzg4ODg6CisgICAgICAgICAgICAvLyBUT0RPOiBhbHBoYSBjaGFubmVsCisgICAgICAgICAgICAvLyBmYWxsLXRocm91Z2gKKyAgICAgICAgY2FzZSBQaXhlbEZvcm1hdDo6UkdCWF84ODg4OiB7CisgICAgICAgICAgICB2b2lkICpwb2ludGVyID0gbnVsbHB0cjsKKyAgICAgICAgICAgIG1NYXBwZXItPmxvY2soCisgICAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8bmF0aXZlX2hhbmRsZV90ICo+KG1CdWZmZXIpLAorICAgICAgICAgICAgICAgICAgICBncmFsbG9jVXNhZ2UsCisgICAgICAgICAgICAgICAgICAgIHsgKGludDMyX3QpcmVjdC5sZWZ0LCAoaW50MzJfdClyZWN0LnRvcCwgKGludDMyX3QpcmVjdC53aWR0aCwgKGludDMyX3QpcmVjdC5oZWlnaHQgfSwKKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogZmVuY2UKKyAgICAgICAgICAgICAgICAgICAgaGlkbF9oYW5kbGUoKSwKKyAgICAgICAgICAgICAgICAgICAgWyZlcnIsICZwb2ludGVyXShjb25zdCBhdXRvICZtYXBlcnIsIGNvbnN0IGF1dG8gJm1hcFBvaW50ZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IG1hcGVycjJlcnJvcihtYXBlcnIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXIgPSBtYXBQb2ludGVyOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgibG9jayBmYWlsZWQ6ICVkIiwgZXJyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYWRkcltDMlBsYW5hckxheW91dDo6UExBTkVfUl0gPSAodWludDhfdCAqKXBvaW50ZXI7CisgICAgICAgICAgICBhZGRyW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9HXSA9ICh1aW50OF90ICopcG9pbnRlciArIDE7CisgICAgICAgICAgICBhZGRyW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9CXSA9ICh1aW50OF90ICopcG9pbnRlciArIDI7CisgICAgICAgICAgICBsYXlvdXQtPnR5cGUgPSBDMlBsYW5hckxheW91dDo6VFlQRV9SR0I7CisgICAgICAgICAgICBsYXlvdXQtPm51bVBsYW5lcyA9IDM7CisgICAgICAgICAgICBsYXlvdXQtPnJvb3RQbGFuZXMgPSAxOworICAgICAgICAgICAgbGF5b3V0LT5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1JdID0geworICAgICAgICAgICAgICAgIEMyUGxhbmVJbmZvOjpDSEFOTkVMX1IsICAgICAgICAgLy8gY2hhbm5lbAorICAgICAgICAgICAgICAgIDQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29sSW5jCisgICAgICAgICAgICAgICAgNCAqIChpbnQzMl90KW1JbmZvLnN0cmlkZSwgICAgICAvLyByb3dJbmMKKyAgICAgICAgICAgICAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1Db2xTYW1wbGluZworICAgICAgICAgICAgICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbVJvd1NhbXBsaW5nCisgICAgICAgICAgICAgICAgOCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGxvY2F0ZWREZXB0aAorICAgICAgICAgICAgICAgIDgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYml0RGVwdGgKKyAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJpZ2h0U2hpZnQKKyAgICAgICAgICAgICAgICBDMlBsYW5lSW5mbzo6TkFUSVZFLCAgICAgICAgICAgIC8vIGVuZGlhbm5lc3MKKyAgICAgICAgICAgICAgICBDMlBsYW5hckxheW91dDo6UExBTkVfUiwgICAgICAgIC8vIHJvb3RJeAorICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2Zmc2V0CisgICAgICAgICAgICB9OworICAgICAgICAgICAgbGF5b3V0LT5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX0ddID0geworICAgICAgICAgICAgICAgIEMyUGxhbmVJbmZvOjpDSEFOTkVMX0csICAgICAgICAgLy8gY2hhbm5lbAorICAgICAgICAgICAgICAgIDQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29sSW5jCisgICAgICAgICAgICAgICAgNCAqIChpbnQzMl90KW1JbmZvLnN0cmlkZSwgICAgICAvLyByb3dJbmMKKyAgICAgICAgICAgICAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1Db2xTYW1wbGluZworICAgICAgICAgICAgICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbVJvd1NhbXBsaW5nCisgICAgICAgICAgICAgICAgOCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGxvY2F0ZWREZXB0aAorICAgICAgICAgICAgICAgIDgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYml0RGVwdGgKKyAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJpZ2h0U2hpZnQKKyAgICAgICAgICAgICAgICBDMlBsYW5lSW5mbzo6TkFUSVZFLCAgICAgICAgICAgIC8vIGVuZGlhbm5lc3MKKyAgICAgICAgICAgICAgICBDMlBsYW5hckxheW91dDo6UExBTkVfUiwgICAgICAgIC8vIHJvb3RJeAorICAgICAgICAgICAgICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2Zmc2V0CisgICAgICAgICAgICB9OworICAgICAgICAgICAgbGF5b3V0LT5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX0JdID0geworICAgICAgICAgICAgICAgIEMyUGxhbmVJbmZvOjpDSEFOTkVMX0IsICAgICAgICAgLy8gY2hhbm5lbAorICAgICAgICAgICAgICAgIDQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29sSW5jCisgICAgICAgICAgICAgICAgNCAqIChpbnQzMl90KW1JbmZvLnN0cmlkZSwgICAgICAvLyByb3dJbmMKKyAgICAgICAgICAgICAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1Db2xTYW1wbGluZworICAgICAgICAgICAgICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbVJvd1NhbXBsaW5nCisgICAgICAgICAgICAgICAgOCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGxvY2F0ZWREZXB0aAorICAgICAgICAgICAgICAgIDgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYml0RGVwdGgKKyAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJpZ2h0U2hpZnQKKyAgICAgICAgICAgICAgICBDMlBsYW5lSW5mbzo6TkFUSVZFLCAgICAgICAgICAgIC8vIGVuZGlhbm5lc3MKKyAgICAgICAgICAgICAgICBDMlBsYW5hckxheW91dDo6UExBTkVfUiwgICAgICAgIC8vIHJvb3RJeAorICAgICAgICAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2Zmc2V0CisgICAgICAgICAgICB9OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDogeworICAgICAgICAgICAgQUxPR0QoInVuc3VwcG9ydGVkIHBpeGVsIGZvcm1hdDogJWQiLCBtSW5mby5tYXBwZXJJbmZvLmZvcm1hdCk7CisgICAgICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICAgICAgfQorICAgIH0KKyAgICBtTG9ja2VkID0gdHJ1ZTsKKworICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJBbGxvY2F0aW9uR3JhbGxvYzo6dW5tYXAoCisgICAgICAgIHVpbnQ4X3QgKiphZGRyLCBDMlJlY3QgcmVjdCwgQzJGZW5jZSAqZmVuY2UgLyogbnVsbGFibGUgKi8pIHsKKyAgICAvLyBUT0RPOiBjaGVjayBhZGRyIGFuZCBzaXplLCB1c2UgZmVuY2UKKyAgICAodm9pZClhZGRyOworICAgICh2b2lkKXJlY3Q7CisKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTWFwcGVkTG9jayk7CisgICAgYzJfc3RhdHVzX3QgZXJyID0gQzJfT0s7CisgICAgbU1hcHBlci0+dW5sb2NrKAorICAgICAgICAgICAgY29uc3RfY2FzdDxuYXRpdmVfaGFuZGxlX3QgKj4obUJ1ZmZlciksCisgICAgICAgICAgICBbJmVyciwgJmZlbmNlXShjb25zdCBhdXRvICZtYXBlcnIsIGNvbnN0IGF1dG8gJnJlbGVhc2VGZW5jZSkgeworICAgICAgICAgICAgICAgIC8vIFRPRE8KKyAgICAgICAgICAgICAgICAodm9pZCkgZmVuY2U7CisgICAgICAgICAgICAgICAgKHZvaWQpIHJlbGVhc2VGZW5jZTsKKyAgICAgICAgICAgICAgICBlcnIgPSBtYXBlcnIyZXJyb3IobWFwZXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyID09IEMyX09LKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGZlbmNlCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgaWYgKGVyciA9PSBDMl9PSykgeworICAgICAgICBtTG9ja2VkID0gZmFsc2U7CisgICAgfQorICAgIHJldHVybiBlcnI7Cit9CisKK2Jvb2wgQzJBbGxvY2F0aW9uR3JhbGxvYzo6ZXF1YWxzKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkdyYXBoaWNBbGxvY2F0aW9uPiAmb3RoZXIpIGNvbnN0IHsKKyAgICByZXR1cm4gb3RoZXIgJiYgb3RoZXItPmhhbmRsZSgpID09IGhhbmRsZSgpOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IEdSQUxMT0MgQUxMT0NBVE9SID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworY2xhc3MgQzJBbGxvY2F0b3JHcmFsbG9jOjpJbXBsIHsKK3B1YmxpYzoKKyAgICBJbXBsKGlkX3QgaWQsIGJvb2wgYnVmZmVyUXVldWUpOworCisgICAgaWRfdCBnZXRJZCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1UcmFpdHMtPmlkOworICAgIH0KKworICAgIEMyU3RyaW5nIGdldE5hbWUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtVHJhaXRzLT5uYW1lOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkFsbG9jYXRvcjo6VHJhaXRzPiBnZXRUcmFpdHMoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtVHJhaXRzOworICAgIH0KKworICAgIGMyX3N0YXR1c190IG5ld0dyYXBoaWNBbGxvY2F0aW9uKAorICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgdWludDMyX3QgZm9ybWF0LCBjb25zdCBDMk1lbW9yeVVzYWdlICZ1c2FnZSwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNBbGxvY2F0aW9uPiAqYWxsb2NhdGlvbik7CisKKyAgICBjMl9zdGF0dXNfdCBwcmlvckdyYXBoaWNBbGxvY2F0aW9uKAorICAgICAgICAgICAgY29uc3QgQzJIYW5kbGUgKmhhbmRsZSwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNBbGxvY2F0aW9uPiAqYWxsb2NhdGlvbik7CisKKyAgICBjMl9zdGF0dXNfdCBzdGF0dXMoKSBjb25zdCB7IHJldHVybiBtSW5pdDsgfQorCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcjo6VHJhaXRzPiBtVHJhaXRzOworICAgIGMyX3N0YXR1c190IG1Jbml0OworICAgIHNwPElBbGxvY2F0b3I+IG1BbGxvY2F0b3I7CisgICAgc3A8SU1hcHBlcj4gbU1hcHBlcjsKKyAgICBjb25zdCBib29sIG1CdWZmZXJRdWV1ZTsKK307CisKK3ZvaWQgX1Vud3JhcE5hdGl2ZUNvZGVjMkdyYWxsb2NNZXRhZGF0YSgKKyAgICAgICAgY29uc3QgQzJIYW5kbGUgKmNvbnN0IGhhbmRsZSwKKyAgICAgICAgdWludDMyX3QgKndpZHRoLCB1aW50MzJfdCAqaGVpZ2h0LCB1aW50MzJfdCAqZm9ybWF0LHVpbnQ2NF90ICp1c2FnZSwgdWludDMyX3QgKnN0cmlkZSwKKyAgICAgICAgdWludDMyX3QgKmdlbmVyYXRpb24sIHVpbnQ2NF90ICppZ2JwX2lkLCB1aW50MzJfdCAqaWdicF9zbG90KSB7CisgICAgKHZvaWQpQzJIYW5kbGVHcmFsbG9jOjpJbXBvcnQoaGFuZGxlLCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHVzYWdlLCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGlvbiwgaWdicF9pZCwgaWdicF9zbG90KTsKK30KKworQzJBbGxvY2F0b3JHcmFsbG9jOjpJbXBsOjpJbXBsKGlkX3QgaWQsIGJvb2wgYnVmZmVyUXVldWUpCisgICAgOiBtSW5pdChDMl9PSyksIG1CdWZmZXJRdWV1ZShidWZmZXJRdWV1ZSkgeworICAgIC8vIFRPRE86IGdldCB0aGlzIGZyb20gYWxsb2NhdG9yCisgICAgQzJNZW1vcnlVc2FnZSBtaW5Vc2FnZSA9IHsgMCwgMCB9LCBtYXhVc2FnZSA9IHsgfih1aW50NjRfdCkwLCB+KHVpbnQ2NF90KTAgfTsKKyAgICBUcmFpdHMgdHJhaXRzID0geyAiYW5kcm9pZC5hbGxvY2F0b3IuZ3JhbGxvYyIsIGlkLCBDMkFsbG9jYXRvcjo6R1JBUEhJQywgbWluVXNhZ2UsIG1heFVzYWdlIH07CisgICAgbVRyYWl0cyA9IHN0ZDo6bWFrZV9zaGFyZWQ8QzJBbGxvY2F0b3I6OlRyYWl0cz4odHJhaXRzKTsKKworICAgIC8vIGdyYWxsb2MgYWxsb2NhdG9yIGlzIGEgc2luZ2xldG9uLCBzbyBhbGwgb2JqZWN0cyBzaGFyZSBhIGdsb2JhbCBzZXJ2aWNlCisgICAgbUFsbG9jYXRvciA9IElBbGxvY2F0b3I6OmdldFNlcnZpY2UoKTsKKyAgICBtTWFwcGVyID0gSU1hcHBlcjo6Z2V0U2VydmljZSgpOworICAgIGlmIChtQWxsb2NhdG9yID09IG51bGxwdHIgfHwgbU1hcHBlciA9PSBudWxscHRyKSB7CisgICAgICAgIG1Jbml0ID0gQzJfQ09SUlVQVEVEOworICAgIH0KK30KKworYzJfc3RhdHVzX3QgQzJBbGxvY2F0b3JHcmFsbG9jOjpJbXBsOjpuZXdHcmFwaGljQWxsb2NhdGlvbigKKyAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgdWludDMyX3QgZm9ybWF0LCBjb25zdCBDMk1lbW9yeVVzYWdlICZ1c2FnZSwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0FsbG9jYXRpb24+ICphbGxvY2F0aW9uKSB7CisgICAgdWludDY0X3QgZ3JhbGxvY1VzYWdlID0gc3RhdGljX2Nhc3Q8QzJBbmRyb2lkTWVtb3J5VXNhZ2U+KHVzYWdlKS5hc0dyYWxsb2NVc2FnZSgpOworICAgIEFMT0dWKCJhbGxvY2F0aW5nIGJ1ZmZlciB3aXRoIHVzYWdlICUjbGx4ID0+ICUjbGx4IiwKKyAgICAgICAgICAobG9uZyBsb25nKXVzYWdlLmV4cGVjdGVkLCAobG9uZyBsb25nKWdyYWxsb2NVc2FnZSk7CisKKyAgICBCdWZmZXJEZXNjcmlwdG9ySW5mbyBpbmZvID0geworICAgICAgICB7CisgICAgICAgICAgICB3aWR0aCwKKyAgICAgICAgICAgIGhlaWdodCwKKyAgICAgICAgICAgIDF1LCAgLy8gbGF5ZXJDb3VudAorICAgICAgICAgICAgKFBpeGVsRm9ybWF0KWZvcm1hdCwKKyAgICAgICAgICAgIGdyYWxsb2NVc2FnZSwKKyAgICAgICAgfSwKKyAgICAgICAgMHUsICAvLyBzdHJpZGUgcGxhY2Vob2xkZXIKKyAgICB9OworICAgIGMyX3N0YXR1c190IGVyciA9IEMyX09LOworICAgIEJ1ZmZlckRlc2NyaXB0b3IgZGVzYzsKKyAgICBtTWFwcGVyLT5jcmVhdGVEZXNjcmlwdG9yKAorICAgICAgICAgICAgaW5mby5tYXBwZXJJbmZvLCBbJmVyciwgJmRlc2NdKGNvbnN0IGF1dG8gJm1hcGVyciwgY29uc3QgYXV0byAmZGVzY3JpcHRvcikgeworICAgICAgICAgICAgICAgIGVyciA9IG1hcGVycjJlcnJvcihtYXBlcnIpOworICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgZGVzYyA9IGRlc2NyaXB0b3I7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIC8vIElBbGxvY2F0b3Igc2hhcmVzIElNYXBwZXIgZXJyb3IgY29kZXMuCisgICAgaGlkbF9oYW5kbGUgYnVmZmVyOworICAgIG1BbGxvY2F0b3ItPmFsbG9jYXRlKAorICAgICAgICAgICAgZGVzYywKKyAgICAgICAgICAgIDF1LAorICAgICAgICAgICAgWyZlcnIsICZidWZmZXIsICZpbmZvXShjb25zdCBhdXRvICZtYXBlcnIsIGNvbnN0IGF1dG8gJnN0cmlkZSwgYXV0byAmYnVmZmVycykgeworICAgICAgICAgICAgICAgIGVyciA9IG1hcGVycjJlcnJvcihtYXBlcnIpOworICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoYnVmZmVycy5zaXplKCkgIT0gMXUpIHsKKyAgICAgICAgICAgICAgICAgICAgZXJyID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGluZm8uc3RyaWRlID0gc3RyaWRlOworICAgICAgICAgICAgICAgIGJ1ZmZlciA9IHN0ZDo6bW92ZShidWZmZXJzWzBdKTsKKyAgICAgICAgICAgIH0pOworICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKworICAgIGFsbG9jYXRpb24tPnJlc2V0KG5ldyBDMkFsbG9jYXRpb25HcmFsbG9jKAorICAgICAgICAgICAgaW5mbywgbU1hcHBlciwgYnVmZmVyLAorICAgICAgICAgICAgQzJIYW5kbGVHcmFsbG9jOjpXcmFwTmF0aXZlSGFuZGxlKAorICAgICAgICAgICAgICAgICAgICBidWZmZXIuZ2V0TmF0aXZlSGFuZGxlKCksCisgICAgICAgICAgICAgICAgICAgIGluZm8ubWFwcGVySW5mby53aWR0aCwgaW5mby5tYXBwZXJJbmZvLmhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KWluZm8ubWFwcGVySW5mby5mb3JtYXQsIGluZm8ubWFwcGVySW5mby51c2FnZSwgaW5mby5zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgIDAsIDAsIG1CdWZmZXJRdWV1ZSA/IH4wIDogMCksCisgICAgICAgICAgICBtVHJhaXRzLT5pZCkpOworICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJBbGxvY2F0b3JHcmFsbG9jOjpJbXBsOjpwcmlvckdyYXBoaWNBbGxvY2F0aW9uKAorICAgICAgICBjb25zdCBDMkhhbmRsZSAqaGFuZGxlLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQWxsb2NhdGlvbj4gKmFsbG9jYXRpb24pIHsKKyAgICBCdWZmZXJEZXNjcmlwdG9ySW5mbyBpbmZvOworICAgIGluZm8ubWFwcGVySW5mby5sYXllckNvdW50ID0gMXU7CisgICAgdWludDMyX3QgZ2VuZXJhdGlvbjsKKyAgICB1aW50NjRfdCBpZ2JwX2lkOworICAgIHVpbnQzMl90IGlnYnBfc2xvdDsKKyAgICBjb25zdCBDMkhhbmRsZUdyYWxsb2MgKmdyYWxsb2NIYW5kbGUgPSBDMkhhbmRsZUdyYWxsb2M6OkltcG9ydCgKKyAgICAgICAgICAgIGhhbmRsZSwKKyAgICAgICAgICAgICZpbmZvLm1hcHBlckluZm8ud2lkdGgsICZpbmZvLm1hcHBlckluZm8uaGVpZ2h0LAorICAgICAgICAgICAgKHVpbnQzMl90ICopJmluZm8ubWFwcGVySW5mby5mb3JtYXQsICh1aW50NjRfdCAqKSZpbmZvLm1hcHBlckluZm8udXNhZ2UsICZpbmZvLnN0cmlkZSwKKyAgICAgICAgICAgICZnZW5lcmF0aW9uLCAmaWdicF9pZCwgJmlnYnBfc2xvdCk7CisgICAgaWYgKGdyYWxsb2NIYW5kbGUgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgIH0KKworICAgIGhpZGxfaGFuZGxlIGhpZGxIYW5kbGU7CisgICAgaGlkbEhhbmRsZS5zZXRUbyhDMkhhbmRsZUdyYWxsb2M6OlVud3JhcE5hdGl2ZUhhbmRsZShncmFsbG9jSGFuZGxlKSwgdHJ1ZSk7CisKKyAgICBhbGxvY2F0aW9uLT5yZXNldChuZXcgQzJBbGxvY2F0aW9uR3JhbGxvYyhpbmZvLCBtTWFwcGVyLCBoaWRsSGFuZGxlLCBncmFsbG9jSGFuZGxlLCBtVHJhaXRzLT5pZCkpOworICAgIHJldHVybiBDMl9PSzsKK30KKworQzJBbGxvY2F0b3JHcmFsbG9jOjpDMkFsbG9jYXRvckdyYWxsb2MoaWRfdCBpZCwgYm9vbCBidWZmZXJRdWV1ZSkKKyAgICAgICAgOiBtSW1wbChuZXcgSW1wbChpZCwgYnVmZmVyUXVldWUpKSB7fQorCitDMkFsbG9jYXRvckdyYWxsb2M6On5DMkFsbG9jYXRvckdyYWxsb2MoKSB7IGRlbGV0ZSBtSW1wbDsgfQorCitDMkFsbG9jYXRvcjo6aWRfdCBDMkFsbG9jYXRvckdyYWxsb2M6OmdldElkKCkgY29uc3QgeworICAgIHJldHVybiBtSW1wbC0+Z2V0SWQoKTsKK30KKworQzJTdHJpbmcgQzJBbGxvY2F0b3JHcmFsbG9jOjpnZXROYW1lKCkgY29uc3QgeworICAgIHJldHVybiBtSW1wbC0+Z2V0TmFtZSgpOworfQorCitzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJBbGxvY2F0b3I6OlRyYWl0cz4gQzJBbGxvY2F0b3JHcmFsbG9jOjpnZXRUcmFpdHMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbXBsLT5nZXRUcmFpdHMoKTsKK30KKworYzJfc3RhdHVzX3QgQzJBbGxvY2F0b3JHcmFsbG9jOjpuZXdHcmFwaGljQWxsb2NhdGlvbigKKyAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgdWludDMyX3QgZm9ybWF0LCBDMk1lbW9yeVVzYWdlIHVzYWdlLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQWxsb2NhdGlvbj4gKmFsbG9jYXRpb24pIHsKKyAgICByZXR1cm4gbUltcGwtPm5ld0dyYXBoaWNBbGxvY2F0aW9uKHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdXNhZ2UsIGFsbG9jYXRpb24pOworfQorCitjMl9zdGF0dXNfdCBDMkFsbG9jYXRvckdyYWxsb2M6OnByaW9yR3JhcGhpY0FsbG9jYXRpb24oCisgICAgICAgIGNvbnN0IEMySGFuZGxlICpoYW5kbGUsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNBbGxvY2F0aW9uPiAqYWxsb2NhdGlvbikgeworICAgIHJldHVybiBtSW1wbC0+cHJpb3JHcmFwaGljQWxsb2NhdGlvbihoYW5kbGUsIGFsbG9jYXRpb24pOworfQorCitjMl9zdGF0dXNfdCBDMkFsbG9jYXRvckdyYWxsb2M6OnN0YXR1cygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwtPnN0YXR1cygpOworfQorCitib29sIEMyQWxsb2NhdG9yR3JhbGxvYzo6aXNWYWxpZChjb25zdCBDMkhhbmRsZSogY29uc3QgbykgeworICAgIHJldHVybiBDMkhhbmRsZUdyYWxsb2M6OmlzVmFsaWQobyk7Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL0MyQWxsb2NhdG9ySW9uLmNwcCBiL21lZGlhL2NvZGVjMi92bmRrL0MyQWxsb2NhdG9ySW9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzZhYWM1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvQzJBbGxvY2F0b3JJb24uY3BwCkBAIC0wLDAgKzEsNTYxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDMkFsbG9jYXRvcklvbiIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPGxpc3Q+CisKKyNpbmNsdWRlIDxpb24vaW9uLmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4gLy8gZ2V0cGFnZXNpemUsIHNpemVfdCwgY2xvc2UsIGR1cAorCisjaW5jbHVkZSA8QzJBbGxvY2F0b3JJb24uaD4KKyNpbmNsdWRlIDxDMkJ1ZmZlci5oPgorI2luY2x1ZGUgPEMyRGVidWcuaD4KKyNpbmNsdWRlIDxDMkVycm5vVXRpbHMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCituYW1lc3BhY2UgeworICAgIGNvbnN0ZXhwciBzaXplX3QgVVNBR0VfTFJVX0NBQ0hFX1NJWkUgPSAxMDI0OworfQorCisvKiBzaXplX3QgPD0+IGludChsbyksIGludChoaSkgY29udmVyc2lvbnMgKi8KK2NvbnN0ZXhwciBpbmxpbmUgaW50IHNpemUyaW50TG8oc2l6ZV90IHMpIHsKKyAgICByZXR1cm4gaW50KHMgJiAweEZGRkZGRkZGKTsKK30KKworY29uc3RleHByIGlubGluZSBpbnQgc2l6ZTJpbnRIaShzaXplX3QgcykgeworICAgIC8vIGNhc3QgdG8gdWludDY0X3QgYXMgc2l6ZV90IG1heSBiZSAzMiBiaXRzIHdpZGUKKyAgICByZXR1cm4gaW50KCh1aW50NjRfdChzKSA+PiAzMikgJiAweEZGRkZGRkZGKTsKK30KKworY29uc3RleHByIGlubGluZSBzaXplX3QgaW50czJzaXplKGludCBpbnRMbywgaW50IGludEhpKSB7CisgICAgLy8gY29udmVydCBpbiAyIHN0YWdlcyB0byA2NCBiaXRzIGFzIGludEhpIG1heSBiZSBuZWdhdGl2ZQorICAgIHJldHVybiBzaXplX3QodW5zaWduZWQoaW50TG8pKSB8IHNpemVfdCh1aW50NjRfdCh1bnNpZ25lZChpbnRIaSkpIDw8IDMyKTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gSU9OIEhBTkRMRSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKioKKyAqIElPTiBoYW5kbGUKKyAqCisgKiBUaGVyZSBjYW4gYmUgb25seSBhIHNvbGUgaW9uIGNsaWVudCBwZXIgcHJvY2VzcywgdGhpcyBpcyBjYXB0dXJlZCBpbiB0aGUgaW9uIGZkIHRoYXQgaXMgcGFzc2VkCisgKiB0byB0aGUgY29uc3RydWN0b3IsIGJ1dCB0aGlzIHNob3VsZCBiZSBtYW5hZ2VkIGJ5IHRoZSBpb24gYnVmZmVyIGFsbG9jYXRvci9tYXBwZXIuCisgKgorICogaW9uIHVzZXMgaW9uX3VzZXJfaGFuZGxlX3QgZm9yIGJ1ZmZlcnMuIFdlIGRvbid0IHN0b3JlIHRoaXMgaW4gdGhlIG5hdGl2ZSBoYW5kbGUgYXMKKyAqIGl0IHJlcXVpcmVzIGFuIGlvbl9mcmVlIHRvIGRlY3JlZi4gSW5zdGVhZCwgd2Ugc2hhcmUgdGhlIGJ1ZmZlciB0byBnZXQgYW4gZmQgdGhhdCBhbHNvIGhvbGRzCisgKiBhIHJlZmNvdW50LgorICoKKyAqIFRoaXMgaGFuZGxlIHdpbGwgbm90IGNhcHR1cmUgbWFwcGVkIGZkLXMgYXMgdXBkYXRpbmcgdGhhdCB3b3VsZCByZXF1aXJlIGEgZ2xvYmFsIG11dGV4LgorICovCisKK3N0cnVjdCBDMkhhbmRsZUlvbiA6IHB1YmxpYyBDMkhhbmRsZSB7CisgICAgLy8gaW9uIGhhbmRsZSBvd25zIGlvbkZkKCEpIGFuZCBidWZmZXJGZAorICAgIEMySGFuZGxlSW9uKGludCBidWZmZXJGZCwgc2l6ZV90IHNpemUpCisgICAgICAgIDogQzJIYW5kbGUoY0hlYWRlciksCisgICAgICAgICAgbUZkc3sgYnVmZmVyRmQgfSwKKyAgICAgICAgICBtSW50c3sgaW50KHNpemUgJiAweEZGRkZGRkZGKSwgaW50KCh1aW50NjRfdChzaXplKSA+PiAzMikgJiAweEZGRkZGRkZGKSwga01hZ2ljIH0geyB9CisKKyAgICBzdGF0aWMgYm9vbCBpc1ZhbGlkKGNvbnN0IEMySGFuZGxlICogY29uc3Qgbyk7CisKKyAgICBpbnQgYnVmZmVyRmQoKSBjb25zdCB7IHJldHVybiBtRmRzLm1CdWZmZXI7IH0KKyAgICBzaXplX3Qgc2l6ZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIHNpemVfdCh1bnNpZ25lZChtSW50cy5tU2l6ZUxvKSkKKyAgICAgICAgICAgICAgICB8IHNpemVfdCh1aW50NjRfdCh1bnNpZ25lZChtSW50cy5tU2l6ZUhpKSkgPDwgMzIpOworICAgIH0KKworcHJvdGVjdGVkOgorICAgIHN0cnVjdCB7CisgICAgICAgIGludCBtQnVmZmVyOyAvLyBzaGFyZWQgaW9uIGJ1ZmZlcgorICAgIH0gbUZkczsKKyAgICBzdHJ1Y3QgeworICAgICAgICBpbnQgbVNpemVMbzsgLy8gbG93IDMyLWJpdHMgb2Ygc2l6ZQorICAgICAgICBpbnQgbVNpemVIaTsgLy8gaGlnaCAzMi1iaXRzIG9mIHNpemUKKyAgICAgICAgaW50IG1NYWdpYzsKKyAgICB9IG1JbnRzOworCitwcml2YXRlOgorICAgIHR5cGVkZWYgQzJIYW5kbGVJb24gX3R5cGU7CisgICAgZW51bSB7CisgICAgICAgIGtNYWdpYyA9ICdceGMyaW9ceDAwJywKKyAgICAgICAgbnVtRmRzID0gc2l6ZW9mKG1GZHMpIC8gc2l6ZW9mKGludCksCisgICAgICAgIG51bUludHMgPSBzaXplb2YobUludHMpIC8gc2l6ZW9mKGludCksCisgICAgICAgIHZlcnNpb24gPSBzaXplb2YoQzJIYW5kbGUpCisgICAgfTsKKyAgICAvL2NvbnN0ZXhwciBzdGF0aWMgQzJIYW5kbGUgY0hlYWRlciA9IHsgdmVyc2lvbiwgbnVtRmRzLCBudW1JbnRzLCB7fSB9OworICAgIGNvbnN0IHN0YXRpYyBDMkhhbmRsZSBjSGVhZGVyOworfTsKKworY29uc3QgQzJIYW5kbGUgQzJIYW5kbGVJb246OmNIZWFkZXIgPSB7CisgICAgQzJIYW5kbGVJb246OnZlcnNpb24sCisgICAgQzJIYW5kbGVJb246Om51bUZkcywKKyAgICBDMkhhbmRsZUlvbjo6bnVtSW50cywKKyAgICB7fQorfTsKKworLy8gc3RhdGljCitib29sIEMySGFuZGxlSW9uOjppc1ZhbGlkKGNvbnN0IEMySGFuZGxlICogY29uc3QgbykgeworICAgIGlmICghbyB8fCBtZW1jbXAobywgJmNIZWFkZXIsIHNpemVvZihjSGVhZGVyKSkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBjb25zdCBDMkhhbmRsZUlvbiAqb3RoZXIgPSBzdGF0aWNfY2FzdDxjb25zdCBDMkhhbmRsZUlvbio+KG8pOworICAgIHJldHVybiBvdGhlci0+bUludHMubU1hZ2ljID09IGtNYWdpYzsKK30KKworLy8gVE9ETzogaXMgdGhlIGR1cCBvZiBhbiBpb24gZmQgaWRlbnRpY2FsIHRvIGlvbl9zaGFyZT8KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IElPTiBBTExPQ0FUSU9OID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitjbGFzcyBDMkFsbG9jYXRpb25Jb24gOiBwdWJsaWMgQzJMaW5lYXJBbGxvY2F0aW9uIHsKK3B1YmxpYzoKKyAgICAvKiBJbnRlcmZhY2UgbWV0aG9kcyAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgbWFwKAorICAgICAgICBzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwgQzJNZW1vcnlVc2FnZSB1c2FnZSwgQzJGZW5jZSAqZmVuY2UsCisgICAgICAgIHZvaWQgKiphZGRyIC8qIG5vbm51bGwgKi8pIG92ZXJyaWRlOworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgdW5tYXAodm9pZCAqYWRkciwgc2l6ZV90IHNpemUsIEMyRmVuY2UgKmZlbmNlRmQpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgfkMyQWxsb2NhdGlvbklvbigpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgY29uc3QgQzJIYW5kbGUgKmhhbmRsZSgpIGNvbnN0IG92ZXJyaWRlOworICAgIHZpcnR1YWwgaWRfdCBnZXRBbGxvY2F0b3JJZCgpIGNvbnN0IG92ZXJyaWRlOworICAgIHZpcnR1YWwgYm9vbCBlcXVhbHMoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQWxsb2NhdGlvbj4gJm90aGVyKSBjb25zdCBvdmVycmlkZTsKKworICAgIC8vIGludGVybmFsIG1ldGhvZHMKKyAgICBDMkFsbG9jYXRpb25Jb24oaW50IGlvbkZkLCBzaXplX3Qgc2l6ZSwgc2l6ZV90IGFsaWduLCB1bnNpZ25lZCBoZWFwTWFzaywgdW5zaWduZWQgZmxhZ3MsIEMyQWxsb2NhdG9yOjppZF90IGlkKTsKKyAgICBDMkFsbG9jYXRpb25Jb24oaW50IGlvbkZkLCBzaXplX3Qgc2l6ZSwgaW50IHNoYXJlRmQsIEMyQWxsb2NhdG9yOjppZF90IGlkKTsKKworICAgIGMyX3N0YXR1c190IHN0YXR1cygpIGNvbnN0OworCitwcm90ZWN0ZWQ6CisgICAgY2xhc3MgSW1wbDsKKyAgICBJbXBsICptSW1wbDsKKworICAgIC8vIFRPRE86IHdlIGNvdWxkIG1ha2UgdGhpcyBlbmNhcHN1bGF0ZSBzaGFyZWRfcHRyIGFuZCBjb3BpYWJsZQorICAgIEMyX0RPX05PVF9DT1BZKEMyQWxsb2NhdGlvbklvbik7Cit9OworCitjbGFzcyBDMkFsbG9jYXRpb25Jb246OkltcGwgeworcHJpdmF0ZToKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGFuIGlvbiBhbGxvY2F0aW9uLgorICAgICAqCisgICAgICogXG5vdGUgV2UgYWx3YXlzIGNyZWF0ZSBhbiBpb24gYWxsb2NhdGlvbiwgZXZlbiBpZiB0aGUgYWxsb2NhdGlvbiBvciBpbXBvcnQgZmFpbHMKKyAgICAgKiBzbyB0aGF0IHdlIGNhbiBjYXB0dXJlIHRoZSBlcnJvci4KKyAgICAgKgorICAgICAqIFxwYXJhbSBpb25GZCAgICAgaW9uIGNsaWVudCAob3duZXJzaGlwIHRyYW5zZmVycmVkIHRvIGNyZWF0ZWQgb2JqZWN0KQorICAgICAqIFxwYXJhbSBjYXBhY2l0eSAgc2l6ZSBvZiBhbGxvY2F0aW9uCisgICAgICogXHBhcmFtIGJ1ZmZlckZkICBidWZmZXIgaGFuZGxlIChvd25lcnNoaXAgdHJhbnNmZXJyZWQgdG8gY3JlYXRlZCBvYmplY3QpLiBNdXN0IGJlCisgICAgICogICAgICAgICAgICAgICAgICBpbnZhbGlkIGlmIGVyciBpcyBub3QgMC4KKyAgICAgKiBccGFyYW0gYnVmZmVyICAgIGlvbiBidWZmZXIgdXNlciBoYW5kbGUgKG93bmVyc2hpcCB0cmFuc2ZlcnJlZCB0byBjcmVhdGVkIG9iamVjdCkuIE11c3QgYmUKKyAgICAgKiAgICAgICAgICAgICAgICAgIGludmFsaWQgaWYgZXJyIGlzIG5vdCAwLgorICAgICAqIFxwYXJhbSBlcnIgICAgICAgZXJybm8gZHVyaW5nIGJ1ZmZlciBhbGxvY2F0aW9uIG9yIGltcG9ydAorICAgICAqLworICAgIEltcGwoaW50IGlvbkZkLCBzaXplX3QgY2FwYWNpdHksIGludCBidWZmZXJGZCwgaW9uX3VzZXJfaGFuZGxlX3QgYnVmZmVyLCBDMkFsbG9jYXRvcjo6aWRfdCBpZCwgaW50IGVycikKKyAgICAgICAgOiBtSW9uRmQoaW9uRmQpLAorICAgICAgICAgIG1IYW5kbGUoYnVmZmVyRmQsIGNhcGFjaXR5KSwKKyAgICAgICAgICBtQnVmZmVyKGJ1ZmZlciksCisgICAgICAgICAgbUlkKGlkKSwKKyAgICAgICAgICBtSW5pdChjMl9tYXBfZXJybm88RU5PTUVNLCBFQUNDRVMsIEVJTlZBTD4oZXJyKSksCisgICAgICAgICAgbU1hcEZkKC0xKSB7CisgICAgICAgIGlmIChtSW5pdCAhPSBDMl9PSykgeworICAgICAgICAgICAgLy8gY2xvc2UgaW9uRmQgbm93IG9uIGVycm9yCisgICAgICAgICAgICBpZiAobUlvbkZkID49IDApIHsKKyAgICAgICAgICAgICAgICBjbG9zZShtSW9uRmQpOworICAgICAgICAgICAgICAgIG1Jb25GZCA9IC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gQzJfQ0hFQ0soYnVmZmVyRmQgPCAwKTsKKyAgICAgICAgICAgIC8vIEMyX0NIRUNLKGJ1ZmZlciA8IDApOworICAgICAgICB9CisgICAgfQorCitwdWJsaWM6CisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhbiBpb24gYWxsb2NhdGlvbiBieSBpbXBvcnRpbmcgYSBzaGFyZWQgYnVmZmVyIGZkLgorICAgICAqCisgICAgICogXHBhcmFtIGlvbkZkICAgICBpb24gY2xpZW50IChvd25lcnNoaXAgdHJhbnNmZXJyZWQgdG8gY3JlYXRlZCBvYmplY3QpCisgICAgICogXHBhcmFtIGNhcGFjaXR5ICBzaXplIG9mIGFsbG9jYXRpb24KKyAgICAgKiBccGFyYW0gYnVmZmVyRmQgIGJ1ZmZlciBoYW5kbGUgKG93bmVyc2hpcCB0cmFuc2ZlcnJlZCB0byBjcmVhdGVkIG9iamVjdCkKKyAgICAgKgorICAgICAqIFxyZXR1cm4gY3JlYXRlZCBpb24gYWxsb2NhdGlvbiAoaW1wbGVtZW50YXRpb24pIHdoaWNoIG1heSBiZSBpbnZhbGlkIGlmIHRoZQorICAgICAqIGltcG9ydCBmYWlsZWQuCisgICAgICovCisgICAgc3RhdGljIEltcGwgKkltcG9ydChpbnQgaW9uRmQsIHNpemVfdCBjYXBhY2l0eSwgaW50IGJ1ZmZlckZkLCBDMkFsbG9jYXRvcjo6aWRfdCBpZCkgeworICAgICAgICBpb25fdXNlcl9oYW5kbGVfdCBidWZmZXIgPSAtMTsKKyAgICAgICAgaW50IHJldCA9IGlvbl9pbXBvcnQoaW9uRmQsIGJ1ZmZlckZkLCAmYnVmZmVyKTsKKyAgICAgICAgcmV0dXJuIG5ldyBJbXBsKGlvbkZkLCBjYXBhY2l0eSwgYnVmZmVyRmQsIGJ1ZmZlciwgaWQsIHJldCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhbiBpb24gYWxsb2NhdGlvbiBieSBhbGxvY2F0aW5nIGFuIGlvbiBidWZmZXIuCisgICAgICoKKyAgICAgKiBccGFyYW0gaW9uRmQgICAgIGlvbiBjbGllbnQgKG93bmVyc2hpcCB0cmFuc2ZlcnJlZCB0byBjcmVhdGVkIG9iamVjdCkKKyAgICAgKiBccGFyYW0gc2l6ZSAgICAgIHNpemUgb2YgYWxsb2NhdGlvbgorICAgICAqIFxwYXJhbSBhbGlnbiAgICAgZGVzaXJlZCBhbGlnbm1lbnQgb2YgYWxsb2NhdGlvbgorICAgICAqIFxwYXJhbSBoZWFwTWFzayAgbWFzayBvZiBoZWFwcyBjb25zaWRlcmVkCisgICAgICogXHBhcmFtIGZsYWdzICAgICBpb24gYWxsb2NhdGlvbiBmbGFncworICAgICAqCisgICAgICogXHJldHVybiBjcmVhdGVkIGlvbiBhbGxvY2F0aW9uIChpbXBsZW1lbnRhdGlvbikgd2hpY2ggbWF5IGJlIGludmFsaWQgaWYgdGhlCisgICAgICogYWxsb2NhdGlvbiBmYWlsZWQuCisgICAgICovCisgICAgc3RhdGljIEltcGwgKkFsbG9jKGludCBpb25GZCwgc2l6ZV90IHNpemUsIHNpemVfdCBhbGlnbiwgdW5zaWduZWQgaGVhcE1hc2ssIHVuc2lnbmVkIGZsYWdzLCBDMkFsbG9jYXRvcjo6aWRfdCBpZCkgeworICAgICAgICBpbnQgYnVmZmVyRmQgPSAtMTsKKyAgICAgICAgaW9uX3VzZXJfaGFuZGxlX3QgYnVmZmVyID0gLTE7CisgICAgICAgIHNpemVfdCBhbGlnbmVkU2l6ZSA9IGFsaWduID09IDAgPyBzaXplIDogKHNpemUgKyBhbGlnbiAtIDEpICYgfihhbGlnbiAtIDEpOworICAgICAgICBpbnQgcmV0ID0gaW9uX2FsbG9jKGlvbkZkLCBhbGlnbmVkU2l6ZSwgYWxpZ24sIGhlYXBNYXNrLCBmbGFncywgJmJ1ZmZlcik7CisgICAgICAgIEFMT0dWKCJpb25fYWxsb2MoaW9uRmQgPSAlZCwgc2l6ZSA9ICV6dSwgYWxpZ24gPSAlenUsIHByb3QgPSAlZCwgZmxhZ3MgPSAlZCkgIgorICAgICAgICAgICAgICAicmV0dXJuZWQgKCVkKSA7IGJ1ZmZlciA9ICVkIiwKKyAgICAgICAgICAgICAgaW9uRmQsIGFsaWduZWRTaXplLCBhbGlnbiwgaGVhcE1hc2ssIGZsYWdzLCByZXQsIGJ1ZmZlcik7CisgICAgICAgIGlmIChyZXQgPT0gMCkgeworICAgICAgICAgICAgLy8gZ2V0IGJ1ZmZlciBmZCBmb3IgbmF0aXZlIGhhbmRsZSBjb25zdHJ1Y3RvcgorICAgICAgICAgICAgcmV0ID0gaW9uX3NoYXJlKGlvbkZkLCBidWZmZXIsICZidWZmZXJGZCk7CisgICAgICAgICAgICBpZiAocmV0ICE9IDApIHsKKyAgICAgICAgICAgICAgICBpb25fZnJlZShpb25GZCwgYnVmZmVyKTsKKyAgICAgICAgICAgICAgICBidWZmZXIgPSAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3IEltcGwoaW9uRmQsIGFsaWduZWRTaXplLCBidWZmZXJGZCwgYnVmZmVyLCBpZCwgcmV0KTsKKyAgICB9CisKKyAgICBjMl9zdGF0dXNfdCBtYXAoc2l6ZV90IG9mZnNldCwgc2l6ZV90IHNpemUsIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsIEMyRmVuY2UgKmZlbmNlLCB2b2lkICoqYWRkcikgeworICAgICAgICAodm9pZClmZW5jZTsgLy8gVE9ETzogd2FpdCBmb3IgZmVuY2UKKyAgICAgICAgKmFkZHIgPSBudWxscHRyOworICAgICAgICBpZiAoIW1NYXBwaW5ncy5lbXB0eSgpKSB7CisgICAgICAgICAgICBBTE9HVigibXVsdGlwbGUgbWFwIik7CisgICAgICAgICAgICAvLyBUT0RPOiB0ZWNobmljYWxseSB3ZSBzaG91bGQgcmV0dXJuIERVUExJQ0FURSBoZXJlLCBidXQgb3VyIGJsb2NrIHZpZXdzIGRvbid0CisgICAgICAgICAgICAvLyBhY3R1YWxseSB1bm1hcCwgc28gd2UgZW5kIHVwIHJlbWFwcGluZyBhbiBpb24gYnVmZmVyIG11bHRpcGxlIHRpbWVzLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIHJldHVybiBDMl9EVVBMSUNBVEU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNpemUgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBwcm90ID0gUFJPVF9OT05FOworICAgICAgICBpbnQgZmxhZ3MgPSBNQVBfU0hBUkVEOworICAgICAgICBpZiAodXNhZ2UuZXhwZWN0ZWQgJiBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCkgeworICAgICAgICAgICAgcHJvdCB8PSBQUk9UX1JFQUQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHVzYWdlLmV4cGVjdGVkICYgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFKSB7CisgICAgICAgICAgICBwcm90IHw9IFBST1RfV1JJVEU7CisgICAgICAgIH0KKworICAgICAgICBzaXplX3QgYWxpZ25tZW50Qnl0ZXMgPSBvZmZzZXQgJSBQQUdFX1NJWkU7CisgICAgICAgIHNpemVfdCBtYXBPZmZzZXQgPSBvZmZzZXQgLSBhbGlnbm1lbnRCeXRlczsKKyAgICAgICAgc2l6ZV90IG1hcFNpemUgPSBzaXplICsgYWxpZ25tZW50Qnl0ZXM7CisgICAgICAgIE1hcHBpbmcgbWFwID0geyBudWxscHRyLCBhbGlnbm1lbnRCeXRlcywgbWFwU2l6ZSB9OworCisgICAgICAgIGMyX3N0YXR1c190IGVyciA9IEMyX09LOworICAgICAgICBpZiAobU1hcEZkID09IC0xKSB7CisgICAgICAgICAgICBpbnQgcmV0ID0gaW9uX21hcChtSW9uRmQsIG1CdWZmZXIsIG1hcFNpemUsIHByb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywgbWFwT2Zmc2V0LCAodW5zaWduZWQgY2hhcioqKSZtYXAuYWRkciwgJm1NYXBGZCk7CisgICAgICAgICAgICBBTE9HVigiaW9uX21hcChpb25GZCA9ICVkLCBoYW5kbGUgPSAlZCwgc2l6ZSA9ICV6dSwgcHJvdCA9ICVkLCBmbGFncyA9ICVkLCAiCisgICAgICAgICAgICAgICAgICAib2Zmc2V0ID0gJXp1KSByZXR1cm5lZCAoJWQpIiwKKyAgICAgICAgICAgICAgICAgIG1Jb25GZCwgbUJ1ZmZlciwgbWFwU2l6ZSwgcHJvdCwgZmxhZ3MsIG1hcE9mZnNldCwgcmV0KTsKKyAgICAgICAgICAgIGlmIChyZXQpIHsKKyAgICAgICAgICAgICAgICBtTWFwRmQgPSAtMTsKKyAgICAgICAgICAgICAgICBtYXAuYWRkciA9ICphZGRyID0gbnVsbHB0cjsKKyAgICAgICAgICAgICAgICBlcnIgPSBjMl9tYXBfZXJybm88RUlOVkFMPigtcmV0KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgKmFkZHIgPSAodWludDhfdCAqKW1hcC5hZGRyICsgYWxpZ25tZW50Qnl0ZXM7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtYXAuYWRkciA9IG1tYXAobnVsbHB0ciwgbWFwU2l6ZSwgcHJvdCwgZmxhZ3MsIG1NYXBGZCwgbWFwT2Zmc2V0KTsKKyAgICAgICAgICAgIEFMT0dWKCJtbWFwKHNpemUgPSAlenUsIHByb3QgPSAlZCwgZmxhZ3MgPSAlZCwgbWFwRmQgPSAlZCwgb2Zmc2V0ID0gJXp1KSAiCisgICAgICAgICAgICAgICAgICAicmV0dXJuZWQgKCVkKSIsCisgICAgICAgICAgICAgICAgICBtYXBTaXplLCBwcm90LCBmbGFncywgbU1hcEZkLCBtYXBPZmZzZXQsIGVycm5vKTsKKyAgICAgICAgICAgIGlmIChtYXAuYWRkciA9PSBNQVBfRkFJTEVEKSB7CisgICAgICAgICAgICAgICAgbWFwLmFkZHIgPSAqYWRkciA9IG51bGxwdHI7CisgICAgICAgICAgICAgICAgZXJyID0gYzJfbWFwX2Vycm5vPEVJTlZBTD4oZXJybm8pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAqYWRkciA9ICh1aW50OF90ICopbWFwLmFkZHIgKyBhbGlnbm1lbnRCeXRlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAobWFwLmFkZHIpIHsKKyAgICAgICAgICAgIG1NYXBwaW5ncy5wdXNoX2JhY2sobWFwKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGMyX3N0YXR1c190IHVubWFwKHZvaWQgKmFkZHIsIHNpemVfdCBzaXplLCBDMkZlbmNlICpmZW5jZSkgeworICAgICAgICBpZiAobU1hcEZkIDwgMCB8fCBtTWFwcGluZ3MuZW1wdHkoKSkgeworICAgICAgICAgICAgQUxPR0QoInRyaWVkIHRvIHVubWFwIHVubWFwcGVkIGJ1ZmZlciIpOworICAgICAgICAgICAgcmV0dXJuIEMyX05PVF9GT1VORDsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGF1dG8gaXQgPSBtTWFwcGluZ3MuYmVnaW4oKTsgaXQgIT0gbU1hcHBpbmdzLmVuZCgpOyArK2l0KSB7CisgICAgICAgICAgICBpZiAoYWRkciAhPSAodWludDhfdCAqKWl0LT5hZGRyICsgaXQtPmFsaWdubWVudEJ5dGVzIHx8CisgICAgICAgICAgICAgICAgICAgIHNpemUgKyBpdC0+YWxpZ25tZW50Qnl0ZXMgIT0gaXQtPnNpemUpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludCBlcnIgPSBtdW5tYXAoaXQtPmFkZHIsIGl0LT5zaXplKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gMCkgeworICAgICAgICAgICAgICAgIEFMT0dEKCJtdW5tYXAgZmFpbGVkIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGMyX21hcF9lcnJubzxFSU5WQUw+KGVycm5vKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChmZW5jZSkgeworICAgICAgICAgICAgICAgICpmZW5jZSA9IEMyRmVuY2UoKTsgLy8gbm90IHVzaW5nIGZlbmNlcworICAgICAgICAgICAgfQorICAgICAgICAgICAgKHZvaWQpbU1hcHBpbmdzLmVyYXNlKGl0KTsKKyAgICAgICAgICAgIEFMT0dWKCJzdWNjZXNzZnVsbHkgdW5tYXBwZWQ6ICVkIiwgbUJ1ZmZlcik7CisgICAgICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgICAgIH0KKyAgICAgICAgQUxPR0QoInVubWFwIGZhaWxlZCB0byBmaW5kIHNwZWNpZmllZCBtYXAiKTsKKyAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICB9CisKKyAgICB+SW1wbCgpIHsKKyAgICAgICAgaWYgKCFtTWFwcGluZ3MuZW1wdHkoKSkgeworICAgICAgICAgICAgQUxPR0QoIkRhbmdsaW5nIG1hcHBpbmdzISIpOworICAgICAgICAgICAgZm9yIChjb25zdCBNYXBwaW5nICZtYXAgOiBtTWFwcGluZ3MpIHsKKyAgICAgICAgICAgICAgICAodm9pZCltdW5tYXAobWFwLmFkZHIsIG1hcC5zaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAobU1hcEZkID49IDApIHsKKyAgICAgICAgICAgIGNsb3NlKG1NYXBGZCk7CisgICAgICAgICAgICBtTWFwRmQgPSAtMTsKKyAgICAgICAgfQorICAgICAgICBpZiAobUluaXQgPT0gQzJfT0spIHsKKyAgICAgICAgICAgICh2b2lkKWlvbl9mcmVlKG1Jb25GZCwgbUJ1ZmZlcik7CisgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX2Nsb3NlKCZtSGFuZGxlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobUlvbkZkID49IDApIHsKKyAgICAgICAgICAgIGNsb3NlKG1Jb25GZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjMl9zdGF0dXNfdCBzdGF0dXMoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtSW5pdDsKKyAgICB9CisKKyAgICBjb25zdCBDMkhhbmRsZSAqaGFuZGxlKCkgY29uc3QgeworICAgICAgICByZXR1cm4gJm1IYW5kbGU7CisgICAgfQorCisgICAgQzJBbGxvY2F0b3I6OmlkX3QgZ2V0QWxsb2NhdG9ySWQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtSWQ7CisgICAgfQorCisgICAgaW9uX3VzZXJfaGFuZGxlX3QgaW9uSGFuZGxlKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUJ1ZmZlcjsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgaW50IG1Jb25GZDsKKyAgICBDMkhhbmRsZUlvbiBtSGFuZGxlOworICAgIGlvbl91c2VyX2hhbmRsZV90IG1CdWZmZXI7CisgICAgQzJBbGxvY2F0b3I6OmlkX3QgbUlkOworICAgIGMyX3N0YXR1c190IG1Jbml0OworICAgIGludCBtTWFwRmQ7IC8vIG9ubHkgb25lIGZvciBub3cKKyAgICBzdHJ1Y3QgTWFwcGluZyB7CisgICAgICAgIHZvaWQgKmFkZHI7CisgICAgICAgIHNpemVfdCBhbGlnbm1lbnRCeXRlczsKKyAgICAgICAgc2l6ZV90IHNpemU7CisgICAgfTsKKyAgICBzdGQ6Omxpc3Q8TWFwcGluZz4gbU1hcHBpbmdzOworfTsKKworYzJfc3RhdHVzX3QgQzJBbGxvY2F0aW9uSW9uOjptYXAoCisgICAgc2l6ZV90IG9mZnNldCwgc2l6ZV90IHNpemUsIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsIEMyRmVuY2UgKmZlbmNlLCB2b2lkICoqYWRkcikgeworICAgIHJldHVybiBtSW1wbC0+bWFwKG9mZnNldCwgc2l6ZSwgdXNhZ2UsIGZlbmNlLCBhZGRyKTsKK30KKworYzJfc3RhdHVzX3QgQzJBbGxvY2F0aW9uSW9uOjp1bm1hcCh2b2lkICphZGRyLCBzaXplX3Qgc2l6ZSwgQzJGZW5jZSAqZmVuY2UpIHsKKyAgICByZXR1cm4gbUltcGwtPnVubWFwKGFkZHIsIHNpemUsIGZlbmNlKTsKK30KKworYzJfc3RhdHVzX3QgQzJBbGxvY2F0aW9uSW9uOjpzdGF0dXMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbXBsLT5zdGF0dXMoKTsKK30KKworQzJBbGxvY2F0b3I6OmlkX3QgQzJBbGxvY2F0aW9uSW9uOjpnZXRBbGxvY2F0b3JJZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwtPmdldEFsbG9jYXRvcklkKCk7Cit9CisKK2Jvb2wgQzJBbGxvY2F0aW9uSW9uOjplcXVhbHMoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQWxsb2NhdGlvbj4gJm90aGVyKSBjb25zdCB7CisgICAgaWYgKCFvdGhlciB8fCBvdGhlci0+Z2V0QWxsb2NhdG9ySWQoKSAhPSBnZXRBbGxvY2F0b3JJZCgpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgLy8gZ2V0IHVzZXIgaGFuZGxlIHRvIGNvbXBhcmUgb2JqZWN0cworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRpb25Jb24+IG90aGVyQXNJb24gPSBzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJBbGxvY2F0aW9uSW9uPihvdGhlcik7CisgICAgcmV0dXJuIG1JbXBsLT5pb25IYW5kbGUoKSA9PSBvdGhlckFzSW9uLT5tSW1wbC0+aW9uSGFuZGxlKCk7Cit9CisKK2NvbnN0IEMySGFuZGxlICpDMkFsbG9jYXRpb25Jb246OmhhbmRsZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwtPmhhbmRsZSgpOworfQorCitDMkFsbG9jYXRpb25Jb246On5DMkFsbG9jYXRpb25Jb24oKSB7CisgICAgZGVsZXRlIG1JbXBsOworfQorCitDMkFsbG9jYXRpb25Jb246OkMyQWxsb2NhdGlvbklvbihpbnQgaW9uRmQsIHNpemVfdCBzaXplLCBzaXplX3QgYWxpZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBoZWFwTWFzaywgdW5zaWduZWQgZmxhZ3MsIEMyQWxsb2NhdG9yOjppZF90IGlkKQorICAgIDogQzJMaW5lYXJBbGxvY2F0aW9uKHNpemUpLAorICAgICAgbUltcGwoSW1wbDo6QWxsb2MoaW9uRmQsIHNpemUsIGFsaWduLCBoZWFwTWFzaywgZmxhZ3MsIGlkKSkgeyB9CisKK0MyQWxsb2NhdGlvbklvbjo6QzJBbGxvY2F0aW9uSW9uKGludCBpb25GZCwgc2l6ZV90IHNpemUsIGludCBzaGFyZUZkLCBDMkFsbG9jYXRvcjo6aWRfdCBpZCkKKyAgICA6IEMyTGluZWFyQWxsb2NhdGlvbihzaXplKSwKKyAgICAgIG1JbXBsKEltcGw6OkltcG9ydChpb25GZCwgc2l6ZSwgc2hhcmVGZCwgaWQpKSB7IH0KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IElPTiBBTExPQ0FUT1IgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK0MyQWxsb2NhdG9ySW9uOjpDMkFsbG9jYXRvcklvbihpZF90IGlkKQorICAgIDogbUluaXQoQzJfT0spLAorICAgICAgbUlvbkZkKGlvbl9vcGVuKCkpIHsKKyAgICBpZiAobUlvbkZkIDwgMCkgeworICAgICAgICBzd2l0Y2ggKGVycm5vKSB7CisgICAgICAgIGNhc2UgRU5PRU5UOiAgICBtSW5pdCA9IEMyX09NSVRURUQ7IGJyZWFrOworICAgICAgICBkZWZhdWx0OiAgICAgICAgbUluaXQgPSBjMl9tYXBfZXJybm88RUFDQ0VTPihlcnJubyk7IGJyZWFrOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgQzJNZW1vcnlVc2FnZSBtaW5Vc2FnZSA9IHsgMCwgMCB9OworICAgICAgICBDMk1lbW9yeVVzYWdlIG1heFVzYWdlID0geyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH07CisgICAgICAgIFRyYWl0cyB0cmFpdHMgPSB7ICJhbmRyb2lkLmFsbG9jYXRvci5pb24iLCBpZCwgTElORUFSLCBtaW5Vc2FnZSwgbWF4VXNhZ2UgfTsKKyAgICAgICAgbVRyYWl0cyA9IHN0ZDo6bWFrZV9zaGFyZWQ8VHJhaXRzPih0cmFpdHMpOworICAgICAgICBtQmxvY2tTaXplID0gOjpnZXRwYWdlc2l6ZSgpOworICAgIH0KK30KKworQzJBbGxvY2F0b3JJb246On5DMkFsbG9jYXRvcklvbigpIHsKKyAgICBpZiAobUluaXQgPT0gQzJfT0spIHsKKyAgICAgICAgaW9uX2Nsb3NlKG1Jb25GZCk7CisgICAgfQorfQorCitDMkFsbG9jYXRvcjo6aWRfdCBDMkFsbG9jYXRvcklvbjo6Z2V0SWQoKSBjb25zdCB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVVzYWdlTWFwcGVyTG9jayk7CisgICAgcmV0dXJuIG1UcmFpdHMtPmlkOworfQorCitDMlN0cmluZyBDMkFsbG9jYXRvcklvbjo6Z2V0TmFtZSgpIGNvbnN0IHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtVXNhZ2VNYXBwZXJMb2NrKTsKKyAgICByZXR1cm4gbVRyYWl0cy0+bmFtZTsKK30KKworc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyQWxsb2NhdG9yOjpUcmFpdHM+IEMyQWxsb2NhdG9ySW9uOjpnZXRUcmFpdHMoKSBjb25zdCB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVVzYWdlTWFwcGVyTG9jayk7CisgICAgcmV0dXJuIG1UcmFpdHM7Cit9CisKK3ZvaWQgQzJBbGxvY2F0b3JJb246OnNldFVzYWdlTWFwcGVyKAorICAgICAgICBjb25zdCBVc2FnZU1hcHBlckZuICZtYXBwZXIsIHVpbnQ2NF90IG1pblVzYWdlLCB1aW50NjRfdCBtYXhVc2FnZSwgdWludDY0X3QgYmxvY2tTaXplKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVVzYWdlTWFwcGVyTG9jayk7CisgICAgbVVzYWdlTWFwcGVyQ2FjaGUuY2xlYXIoKTsKKyAgICBtVXNhZ2VNYXBwZXJMcnUuY2xlYXIoKTsKKyAgICBtVXNhZ2VNYXBwZXIgPSBtYXBwZXI7CisgICAgVHJhaXRzIHRyYWl0cyA9IHsKKyAgICAgICAgbVRyYWl0cy0+bmFtZSwgbVRyYWl0cy0+aWQsIExJTkVBUiwKKyAgICAgICAgQzJNZW1vcnlVc2FnZShtaW5Vc2FnZSksIEMyTWVtb3J5VXNhZ2UobWF4VXNhZ2UpCisgICAgfTsKKyAgICBtVHJhaXRzID0gc3RkOjptYWtlX3NoYXJlZDxUcmFpdHM+KHRyYWl0cyk7CisgICAgbUJsb2NrU2l6ZSA9IGJsb2NrU2l6ZTsKK30KKworc3RkOjpzaXplX3QgQzJBbGxvY2F0b3JJb246Ok1hcHBlcktleUhhc2g6Om9wZXJhdG9yKCkoY29uc3QgTWFwcGVyS2V5ICZrKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6aGFzaDx1aW50NjRfdD57fShrLmZpcnN0KSBeIHN0ZDo6aGFzaDxzaXplX3Q+e30oay5zZWNvbmQpOworfQorCitjMl9zdGF0dXNfdCBDMkFsbG9jYXRvcklvbjo6bWFwVXNhZ2UoCisgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsIHNpemVfdCBjYXBhY2l0eSwgc2l6ZV90ICphbGlnbiwgdW5zaWduZWQgKmhlYXBNYXNrLCB1bnNpZ25lZCAqZmxhZ3MpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtVXNhZ2VNYXBwZXJMb2NrKTsKKyAgICBjMl9zdGF0dXNfdCByZXMgPSBDMl9PSzsKKyAgICAvLyBhbGlnbiBjYXBhY2l0eQorICAgIGNhcGFjaXR5ID0gKGNhcGFjaXR5ICsgbUJsb2NrU2l6ZSAtIDEpICYgfihtQmxvY2tTaXplIC0gMSk7CisgICAgTWFwcGVyS2V5IGtleSA9IHN0ZDo6bWFrZV9wYWlyKHVzYWdlLmV4cGVjdGVkLCBjYXBhY2l0eSk7CisgICAgYXV0byBlbnRyeSA9IG1Vc2FnZU1hcHBlckNhY2hlLmZpbmQoa2V5KTsKKyAgICBpZiAoZW50cnkgPT0gbVVzYWdlTWFwcGVyQ2FjaGUuZW5kKCkpIHsKKyAgICAgICAgaWYgKG1Vc2FnZU1hcHBlcikgeworICAgICAgICAgICAgcmVzID0gbVVzYWdlTWFwcGVyKHVzYWdlLCBjYXBhY2l0eSwgYWxpZ24sIGhlYXBNYXNrLCBmbGFncyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAqYWxpZ24gPSAwOyAvLyBUT0RPIG1ha2UgdGhpcyAxCisgICAgICAgICAgICAqaGVhcE1hc2sgPSB+MDsgLy8gZGVmYXVsdCBtYXNrCisgICAgICAgICAgICAqZmxhZ3MgPSAwOyAvLyBkZWZhdWx0IGZsYWdzCisgICAgICAgICAgICByZXMgPSBDMl9OT19JTklUOworICAgICAgICB9CisgICAgICAgIC8vIGFkZCB1c2FnZSB0byBjYWNoZQorICAgICAgICBNYXBwZXJWYWx1ZSB2YWx1ZSA9IHN0ZDo6bWFrZV90dXBsZSgqYWxpZ24sICpoZWFwTWFzaywgKmZsYWdzLCByZXMpOworICAgICAgICBtVXNhZ2VNYXBwZXJMcnUuZW1wbGFjZV9mcm9udChrZXksIHZhbHVlKTsKKyAgICAgICAgbVVzYWdlTWFwcGVyQ2FjaGUuZW1wbGFjZShzdGQ6Om1ha2VfcGFpcihrZXksIG1Vc2FnZU1hcHBlckxydS5iZWdpbigpKSk7CisgICAgICAgIGlmIChtVXNhZ2VNYXBwZXJDYWNoZS5zaXplKCkgPiBVU0FHRV9MUlVfQ0FDSEVfU0laRSkgeworICAgICAgICAgICAgLy8gcmVtb3ZlIExSVSBlbnRyeQorICAgICAgICAgICAgTWFwcGVyS2V5IGxydUtleSA9IG1Vc2FnZU1hcHBlckxydS5mcm9udCgpLmZpcnN0OworICAgICAgICAgICAgbVVzYWdlTWFwcGVyQ2FjaGUuZXJhc2UobHJ1S2V5KTsKKyAgICAgICAgICAgIG1Vc2FnZU1hcHBlckxydS5wb3BfYmFjaygpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gbW92ZSBlbnRyeSB0byBNUlUKKyAgICAgICAgbVVzYWdlTWFwcGVyTHJ1LnNwbGljZShtVXNhZ2VNYXBwZXJMcnUuYmVnaW4oKSwgbVVzYWdlTWFwcGVyTHJ1LCBlbnRyeS0+c2Vjb25kKTsKKyAgICAgICAgY29uc3QgTWFwcGVyVmFsdWUgJnZhbHVlID0gZW50cnktPnNlY29uZC0+c2Vjb25kOworICAgICAgICBzdGQ6OnRpZSgqYWxpZ24sICpoZWFwTWFzaywgKmZsYWdzLCByZXMpID0gdmFsdWU7CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKK2MyX3N0YXR1c190IEMyQWxsb2NhdG9ySW9uOjpuZXdMaW5lYXJBbGxvY2F0aW9uKAorICAgICAgICB1aW50MzJfdCBjYXBhY2l0eSwgQzJNZW1vcnlVc2FnZSB1c2FnZSwgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQWxsb2NhdGlvbj4gKmFsbG9jYXRpb24pIHsKKyAgICBpZiAoYWxsb2NhdGlvbiA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgfQorCisgICAgYWxsb2NhdGlvbi0+cmVzZXQoKTsKKyAgICBpZiAobUluaXQgIT0gQzJfT0spIHsKKyAgICAgICAgcmV0dXJuIG1Jbml0OworICAgIH0KKworICAgIHNpemVfdCBhbGlnbiA9IDA7CisgICAgdW5zaWduZWQgaGVhcE1hc2sgPSB+MDsKKyAgICB1bnNpZ25lZCBmbGFncyA9IDA7CisgICAgYzJfc3RhdHVzX3QgcmV0ID0gbWFwVXNhZ2UodXNhZ2UsIGNhcGFjaXR5LCAmYWxpZ24sICZoZWFwTWFzaywgJmZsYWdzKTsKKyAgICBpZiAocmV0ICYmIHJldCAhPSBDMl9OT19JTklUKSB7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdGlvbklvbj4gYWxsb2MKKyAgICAgICAgPSBzdGQ6Om1ha2Vfc2hhcmVkPEMyQWxsb2NhdGlvbklvbj4oZHVwKG1Jb25GZCksIGNhcGFjaXR5LCBhbGlnbiwgaGVhcE1hc2ssIGZsYWdzLCBtVHJhaXRzLT5pZCk7CisgICAgcmV0ID0gYWxsb2MtPnN0YXR1cygpOworICAgIGlmIChyZXQgPT0gQzJfT0spIHsKKyAgICAgICAgKmFsbG9jYXRpb24gPSBhbGxvYzsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworYzJfc3RhdHVzX3QgQzJBbGxvY2F0b3JJb246OnByaW9yTGluZWFyQWxsb2NhdGlvbigKKyAgICAgICAgY29uc3QgQzJIYW5kbGUgKmhhbmRsZSwgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQWxsb2NhdGlvbj4gKmFsbG9jYXRpb24pIHsKKyAgICAqYWxsb2NhdGlvbiA9IG51bGxwdHI7CisgICAgaWYgKG1Jbml0ICE9IEMyX09LKSB7CisgICAgICAgIHJldHVybiBtSW5pdDsKKyAgICB9CisKKyAgICBpZiAoIUMySGFuZGxlSW9uOjppc1ZhbGlkKGhhbmRsZSkpIHsKKyAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICB9CisKKyAgICAvLyBUT0RPOiBnZXQgY2FwYWNpdHkgYW5kIHZhbGlkYXRlIGl0CisgICAgY29uc3QgQzJIYW5kbGVJb24gKmggPSBzdGF0aWNfY2FzdDxjb25zdCBDMkhhbmRsZUlvbio+KGhhbmRsZSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdGlvbklvbj4gYWxsb2MKKyAgICAgICAgPSBzdGQ6Om1ha2Vfc2hhcmVkPEMyQWxsb2NhdGlvbklvbj4oZHVwKG1Jb25GZCksIGgtPnNpemUoKSwgaC0+YnVmZmVyRmQoKSwgbVRyYWl0cy0+aWQpOworICAgIGMyX3N0YXR1c190IHJldCA9IGFsbG9jLT5zdGF0dXMoKTsKKyAgICBpZiAocmV0ID09IEMyX09LKSB7CisgICAgICAgICphbGxvY2F0aW9uID0gYWxsb2M7CisgICAgICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKGNvbnN0X2Nhc3Q8bmF0aXZlX2hhbmRsZV90Kj4oCisgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBuYXRpdmVfaGFuZGxlX3QqPihoYW5kbGUpKSk7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK2Jvb2wgQzJBbGxvY2F0b3JJb246OmlzVmFsaWQoY29uc3QgQzJIYW5kbGUqIGNvbnN0IG8pIHsKKyAgICByZXR1cm4gQzJIYW5kbGVJb246OmlzVmFsaWQobyk7Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvQzJCdWZmZXIuY3BwIGIvbWVkaWEvY29kZWMyL3ZuZGsvQzJCdWZmZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3MzY2Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay9DMkJ1ZmZlci5jcHAKQEAgLTAsMCArMSwxMzA0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDMkJ1ZmZlciIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPGxpc3Q+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPG11dGV4PgorCisjaW5jbHVkZSA8QzJBbGxvY2F0b3JJb24uaD4KKyNpbmNsdWRlIDxDMkFsbG9jYXRvckdyYWxsb2MuaD4KKyNpbmNsdWRlIDxDMkJ1ZmZlclByaXYuaD4KKyNpbmNsdWRlIDxDMkJsb2NrSW50ZXJuYWwuaD4KKyNpbmNsdWRlIDxidWZmZXJwb29sL0NsaWVudE1hbmFnZXIuaD4KKworbmFtZXNwYWNlIHsKKwordXNpbmcgYW5kcm9pZDo6QzJBbGxvY2F0b3JHcmFsbG9jOwordXNpbmcgYW5kcm9pZDo6QzJBbGxvY2F0b3JJb247Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OkJ1ZmZlclBvb2xEYXRhOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMV8wOjpSZXN1bHRTdGF0dXM7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYxXzA6OmltcGxlbWVudGF0aW9uOjpCdWZmZXJQb29sQWxsb2NhdGlvbjsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjFfMDo6aW1wbGVtZW50YXRpb246OkJ1ZmZlclBvb2xBbGxvY2F0b3I7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYxXzA6OmltcGxlbWVudGF0aW9uOjpDbGllbnRNYW5hZ2VyOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMV8wOjppbXBsZW1lbnRhdGlvbjo6Q29ubmVjdGlvbklkOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMV8wOjppbXBsZW1lbnRhdGlvbjo6SU5WQUxJRF9DT05ORUNUSU9OSUQ7CisKKy8vIFRoaXMgYW5vbnltb3VzIG5hbWVzcGFjZSBjb250YWlucyB0aGUgaGVscGVyIGNsYXNzZXMgdGhhdCBhbGxvdyBvdXIgaW1wbGVtZW50YXRpb24gdG8gY3JlYXRlCisvLyBibG9jay9idWZmZXIgb2JqZWN0cy4KKy8vCisvLyBJbmhlcml0IGZyb20gdGhlIHBhcmVudCwgc2hhcmUgd2l0aCB0aGUgZnJpZW5kLgorY2xhc3MgUmVhZFZpZXdCdWRkeSA6IHB1YmxpYyBDMlJlYWRWaWV3IHsKKyAgICB1c2luZyBDMlJlYWRWaWV3OjpDMlJlYWRWaWV3OworICAgIGZyaWVuZCBjbGFzcyA6OkMyQ29uc3RMaW5lYXJCbG9jazsKK307CisKK2NsYXNzIFdyaXRlVmlld0J1ZGR5IDogcHVibGljIEMyV3JpdGVWaWV3IHsKKyAgICB1c2luZyBDMldyaXRlVmlldzo6QzJXcml0ZVZpZXc7CisgICAgZnJpZW5kIGNsYXNzIDo6QzJMaW5lYXJCbG9jazsKK307CisKK2NsYXNzIENvbnN0TGluZWFyQmxvY2tCdWRkeSA6IHB1YmxpYyBDMkNvbnN0TGluZWFyQmxvY2sgeworICAgIHVzaW5nIEMyQ29uc3RMaW5lYXJCbG9jazo6QzJDb25zdExpbmVhckJsb2NrOworICAgIGZyaWVuZCBjbGFzcyA6OkMyTGluZWFyQmxvY2s7Cit9OworCitjbGFzcyBMaW5lYXJCbG9ja0J1ZGR5IDogcHVibGljIEMyTGluZWFyQmxvY2sgeworICAgIHVzaW5nIEMyTGluZWFyQmxvY2s6OkMyTGluZWFyQmxvY2s7CisgICAgZnJpZW5kIGNsYXNzIDo6QzJCYXNpY0xpbmVhckJsb2NrUG9vbDsKK307CisKK2NsYXNzIEFjcXVpcmFibGVSZWFkVmlld0J1ZGR5IDogcHVibGljIEMyQWNxdWlyYWJsZTxDMlJlYWRWaWV3PiB7CisgICAgdXNpbmcgQzJBY3F1aXJhYmxlOjpDMkFjcXVpcmFibGU7CisgICAgZnJpZW5kIGNsYXNzIDo6QzJDb25zdExpbmVhckJsb2NrOworfTsKKworY2xhc3MgQWNxdWlyYWJsZVdyaXRlVmlld0J1ZGR5IDogcHVibGljIEMyQWNxdWlyYWJsZTxDMldyaXRlVmlldz4geworICAgIHVzaW5nIEMyQWNxdWlyYWJsZTo6QzJBY3F1aXJhYmxlOworICAgIGZyaWVuZCBjbGFzcyA6OkMyTGluZWFyQmxvY2s7Cit9OworCitjbGFzcyBHcmFwaGljVmlld0J1ZGR5IDogcHVibGljIEMyR3JhcGhpY1ZpZXcgeworICAgIHVzaW5nIEMyR3JhcGhpY1ZpZXc6OkMyR3JhcGhpY1ZpZXc7CisgICAgZnJpZW5kIGNsYXNzIDo6QzJDb25zdEdyYXBoaWNCbG9jazsKKyAgICBmcmllbmQgY2xhc3MgOjpDMkdyYXBoaWNCbG9jazsKK307CisKK2NsYXNzIEFjcXVpcmFibGVDb25zdEdyYXBoaWNWaWV3QnVkZHkgOiBwdWJsaWMgQzJBY3F1aXJhYmxlPGNvbnN0IEMyR3JhcGhpY1ZpZXc+IHsKKyAgICB1c2luZyBDMkFjcXVpcmFibGU6OkMyQWNxdWlyYWJsZTsKKyAgICBmcmllbmQgY2xhc3MgOjpDMkNvbnN0R3JhcGhpY0Jsb2NrOworfTsKKworY2xhc3MgQWNxdWlyYWJsZUdyYXBoaWNWaWV3QnVkZHkgOiBwdWJsaWMgQzJBY3F1aXJhYmxlPEMyR3JhcGhpY1ZpZXc+IHsKKyAgICB1c2luZyBDMkFjcXVpcmFibGU6OkMyQWNxdWlyYWJsZTsKKyAgICBmcmllbmQgY2xhc3MgOjpDMkdyYXBoaWNCbG9jazsKK307CisKK2NsYXNzIENvbnN0R3JhcGhpY0Jsb2NrQnVkZHkgOiBwdWJsaWMgQzJDb25zdEdyYXBoaWNCbG9jayB7CisgICAgdXNpbmcgQzJDb25zdEdyYXBoaWNCbG9jazo6QzJDb25zdEdyYXBoaWNCbG9jazsKKyAgICBmcmllbmQgY2xhc3MgOjpDMkdyYXBoaWNCbG9jazsKK307CisKK2NsYXNzIEdyYXBoaWNCbG9ja0J1ZGR5IDogcHVibGljIEMyR3JhcGhpY0Jsb2NrIHsKKyAgICB1c2luZyBDMkdyYXBoaWNCbG9jazo6QzJHcmFwaGljQmxvY2s7CisgICAgZnJpZW5kIGNsYXNzIDo6QzJCYXNpY0dyYXBoaWNCbG9ja1Bvb2w7Cit9OworCitjbGFzcyBCdWZmZXJEYXRhQnVkZHkgOiBwdWJsaWMgQzJCdWZmZXJEYXRhIHsKKyAgICB1c2luZyBDMkJ1ZmZlckRhdGE6OkMyQnVmZmVyRGF0YTsKKyAgICBmcmllbmQgY2xhc3MgOjpDMkJ1ZmZlcjsKK307CisKK30gIC8vIG5hbWVzcGFjZQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gMUQgQkxPQ0sgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIHRoZSBiYXNlIGNsYXNzIGZvciBhbGwgMUQgYmxvY2sgYW5kIHZpZXcgaW1wbGVtZW50YXRpb25zLgorICoKKyAqIFRoaXMgaXMgYmFzaWNhbGx5IGp1c3QgYSBwbGFjZWhvbGRlciBmb3IgdGhlIHVuZGVybHlpbmcgMUQgYWxsb2NhdGlvbiBhbmQgdGhlIHJhbmdlIG9mIHRoZQorICogYWxsb3RlZCBwb3J0aW9uIHRvIHRoaXMgYmxvY2suIFRoZXJlIGlzIGFsc28gYSBwbGFjZWhvbGRlciBmb3IgYSBibG9ja3Bvb2wgZGF0YS4KKyAqLworY2xhc3MgQzJfSElERSBfQzJCbG9jazFESW1wbCA6IHB1YmxpYyBfQzJMaW5lYXJSYW5nZUFzcGVjdCB7CitwdWJsaWM6CisgICAgX0MyQmxvY2sxREltcGwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQWxsb2NhdGlvbj4gJmFsbG9jLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPF9DMkJsb2NrUG9vbERhdGE+ICZwb29sRGF0YSA9IG51bGxwdHIsCisgICAgICAgICAgICBzaXplX3Qgb2Zmc2V0ID0gMCwgc2l6ZV90IHNpemUgPSB+KHNpemVfdCkwKQorICAgICAgICA6IF9DMkxpbmVhclJhbmdlQXNwZWN0KGFsbG9jLmdldCgpLCBvZmZzZXQsIHNpemUpLAorICAgICAgICAgIG1BbGxvY2F0aW9uKGFsbG9jKSwKKyAgICAgICAgICBtUG9vbERhdGEocG9vbERhdGEpIHsgfQorCisgICAgX0MyQmxvY2sxREltcGwoY29uc3QgX0MyQmxvY2sxREltcGwgJm90aGVyLCBzaXplX3Qgb2Zmc2V0ID0gMCwgc2l6ZV90IHNpemUgPSB+KHNpemVfdCkwKQorICAgICAgICA6IF9DMkxpbmVhclJhbmdlQXNwZWN0KCZvdGhlciwgb2Zmc2V0LCBzaXplKSwKKyAgICAgICAgICBtQWxsb2NhdGlvbihvdGhlci5tQWxsb2NhdGlvbiksCisgICAgICAgICAgbVBvb2xEYXRhKG90aGVyLm1Qb29sRGF0YSkgeyB9CisKKyAgICAvKiogcmV0dXJucyBwb29sIGRhdGEgICovCisgICAgc3RkOjpzaGFyZWRfcHRyPF9DMkJsb2NrUG9vbERhdGE+IHBvb2xEYXRhKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVBvb2xEYXRhOworICAgIH0KKworICAgIC8qKiByZXR1cm5zIG5hdGl2ZSBoYW5kbGUgKi8KKyAgICBjb25zdCBDMkhhbmRsZSAqaGFuZGxlKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUFsbG9jYXRpb24gPyBtQWxsb2NhdGlvbi0+aGFuZGxlKCkgOiBudWxscHRyOworICAgIH0KKworICAgIC8qKiByZXR1cm5zIHRoZSBhbGxvY2F0b3IncyBJRCAqLworICAgIEMyQWxsb2NhdG9yOjppZF90IGdldEFsbG9jYXRvcklkKCkgY29uc3QgeworICAgICAgICAvLyBCQURfSUQgY2FuIG9ubHkgaGFwcGVuIGlmIHRoaXMgSW1wbCBjbGFzcyBpcyBpbml0aWFsaXplZCBmb3IgYSB2aWV3IC0gbmV2ZXIgZm9yIGEgYmxvY2suCisgICAgICAgIHJldHVybiBtQWxsb2NhdGlvbiA/IG1BbGxvY2F0aW9uLT5nZXRBbGxvY2F0b3JJZCgpIDogQzJBbGxvY2F0b3I6OkJBRF9JRDsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJBbGxvY2F0aW9uPiBnZXRBbGxvY2F0aW9uKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUFsbG9jYXRpb247CisgICAgfQorCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckFsbG9jYXRpb24+IG1BbGxvY2F0aW9uOworICAgIHN0ZDo6c2hhcmVkX3B0cjxfQzJCbG9ja1Bvb2xEYXRhPiBtUG9vbERhdGE7Cit9OworCisvKioKKyAqIFRoaXMgY2xhc3MgY29udGFpbnMgdGhlIG1hcHBlZCBkYXRhIHBvaW50ZXIsIGFuZCB0aGUgcG90ZW50aWFsIGVycm9yLgorICoKKyAqIHJhbmdlIGlzIHRoZSBtYXBwZWQgcmFuZ2Ugb2YgdGhlIHVuZGVybHlpbmcgYWxsb2NhdGlvbiAod2hpY2ggaXMgcGFydCBvZiB0aGUgYWxsb3R0ZWQKKyAqIHJhbmdlKS4KKyAqLworY2xhc3MgQzJfSElERSBfQzJNYXBwZWRCbG9jazFESW1wbCA6IHB1YmxpYyBfQzJCbG9jazFESW1wbCB7CitwdWJsaWM6CisgICAgX0MyTWFwcGVkQmxvY2sxREltcGwoY29uc3QgX0MyQmxvY2sxREltcGwgJmJsb2NrLCB1aW50OF90ICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBvZmZzZXQgPSAwLCBzaXplX3Qgc2l6ZSA9IH4oc2l6ZV90KTApCisgICAgICAgIDogX0MyQmxvY2sxREltcGwoYmxvY2ssIG9mZnNldCwgc2l6ZSksIG1EYXRhKGRhdGEpLCBtRXJyb3IoQzJfT0spIHsgfQorCisgICAgX0MyTWFwcGVkQmxvY2sxREltcGwoYzJfc3RhdHVzX3QgZXJyb3IpCisgICAgICAgIDogX0MyQmxvY2sxREltcGwobnVsbHB0ciksIG1EYXRhKG51bGxwdHIpLCBtRXJyb3IoZXJyb3IpIHsKKyAgICAgICAgLy8gQ0hFQ0soZXJyb3IgIT0gQzJfT0spOworICAgIH0KKworICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtRGF0YTsKKyAgICB9CisKKyAgICB1aW50OF90ICpkYXRhKCkgeworICAgICAgICByZXR1cm4gbURhdGE7CisgICAgfQorCisgICAgYzJfc3RhdHVzX3QgZXJyb3IoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtRXJyb3I7CisgICAgfQorCitwcml2YXRlOgorICAgIHVpbnQ4X3QgKm1EYXRhOworICAgIGMyX3N0YXR1c190IG1FcnJvcjsKK307CisKKy8qKgorICogQmxvY2sgaW1wbGVtZW50YXRpb24uCisgKi8KK2NsYXNzIEMyQmxvY2sxRDo6SW1wbCA6IHB1YmxpYyBfQzJCbG9jazFESW1wbCB7CisgICAgdXNpbmcgX0MyQmxvY2sxREltcGw6Ol9DMkJsb2NrMURJbXBsOworfTsKKworY29uc3QgQzJIYW5kbGUgKkMyQmxvY2sxRDo6aGFuZGxlKCkgY29uc3QgeworICAgIHJldHVybiBtSW1wbC0+aGFuZGxlKCk7Cit9OworCitDMkFsbG9jYXRvcjo6aWRfdCBDMkJsb2NrMUQ6OmdldEFsbG9jYXRvcklkKCkgY29uc3QgeworICAgIHJldHVybiBtSW1wbC0+Z2V0QWxsb2NhdG9ySWQoKTsKK307CisKK0MyQmxvY2sxRDo6QzJCbG9jazFEKHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBpbXBsLCBjb25zdCBfQzJMaW5lYXJSYW5nZUFzcGVjdCAmcmFuZ2UpCisgICAgLy8gYWx3YXlzIGNsYW1wIHN1YnJhbmdlIHRvIHBhcmVudCAoaW1wbCkgcmFuZ2UgZm9yIHNhZmV0eQorICAgIDogX0MyTGluZWFyUmFuZ2VBc3BlY3QoaW1wbC5nZXQoKSwgcmFuZ2Uub2Zmc2V0KCksIHJhbmdlLnNpemUoKSksIG1JbXBsKGltcGwpIHsKK30KKworLyoqCisgKiBSZWFkIHZpZXcgaW1wbGVtZW50YXRpb24uCisgKgorICogcmFuZ2Ugb2YgSW1wbCBpcyB0aGUgbWFwcGVkIHJhbmdlIG9mIHRoZSB1bmRlcmx5aW5nIGFsbG9jYXRpb24gKHdoaWNoIGlzIHBhcnQgb2YgdGhlIGFsbG90dGVkCisgKiByYW5nZSkuIHJhbmdlIG9mIFZpZXcgaXMgMCB0byBjYXBhY2l0eSgpIChub3QgcmVwcmVzZW50ZWQgYXMgYW4gYWN0dWFsIHJhbmdlKS4gVGhpcyBtYXBzIHRvIGEKKyAqIHN1YnJhbmdlIG9mIEltcGwgcmFuZ2Ugc3RhcnRpbmcgYXQgbUltcGwtPm9mZnNldCgpICsgX21PZmZzZXQuCisgKi8KK2NsYXNzIEMyUmVhZFZpZXc6OkltcGwgOiBwdWJsaWMgX0MyTWFwcGVkQmxvY2sxREltcGwgeworICAgIHVzaW5nIF9DMk1hcHBlZEJsb2NrMURJbXBsOjpfQzJNYXBwZWRCbG9jazFESW1wbDsKK307CisKK0MyUmVhZFZpZXc6OkMyUmVhZFZpZXcoc3RkOjpzaGFyZWRfcHRyPEltcGw+IGltcGwsIHVpbnQzMl90IG9mZnNldCwgdWludDMyX3Qgc2l6ZSkKKyAgICA6IF9DMkxpbmVhckNhcGFjaXR5QXNwZWN0KEMyTGluZWFyQ2FwYWNpdHkoaW1wbC0+c2l6ZSgpKS5yYW5nZShvZmZzZXQsIHNpemUpLnNpemUoKSksCisgICAgICBtSW1wbChpbXBsKSwKKyAgICAgIG1PZmZzZXQoQzJMaW5lYXJDYXBhY2l0eShpbXBsLT5zaXplKCkpLnJhbmdlKG9mZnNldCwgc2l6ZSkub2Zmc2V0KCkpIHsgfQorCitDMlJlYWRWaWV3OjpDMlJlYWRWaWV3KGMyX3N0YXR1c190IGVycm9yKQorICAgIDogX0MyTGluZWFyQ2FwYWNpdHlBc3BlY3QoMHUpLCBtSW1wbChzdGQ6Om1ha2Vfc2hhcmVkPEltcGw+KGVycm9yKSksIG1PZmZzZXQoMHUpIHsKKyAgICAvLyBDSEVDSyhlcnJvciAhPSBDMl9PSyk7Cit9CisKK2NvbnN0IHVpbnQ4X3QgKkMyUmVhZFZpZXc6OmRhdGEoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbXBsLT5lcnJvcigpID8gbnVsbHB0ciA6IG1JbXBsLT5kYXRhKCkgKyBtT2Zmc2V0OworfQorCitjMl9zdGF0dXNfdCBDMlJlYWRWaWV3OjplcnJvcigpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwtPmVycm9yKCk7Cit9CisKK0MyUmVhZFZpZXcgQzJSZWFkVmlldzo6c3ViVmlldyhzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgY29uc3QgeworICAgIEMyTGluZWFyUmFuZ2Ugc3ViUmFuZ2UoKnRoaXMsIG9mZnNldCwgc2l6ZSk7CisgICAgcmV0dXJuIEMyUmVhZFZpZXcobUltcGwsIG1PZmZzZXQgKyBzdWJSYW5nZS5vZmZzZXQoKSwgc3ViUmFuZ2Uuc2l6ZSgpKTsKK30KKworLyoqCisgKiBXcml0ZSB2aWV3IGltcGxlbWVudGF0aW9uLgorICovCitjbGFzcyBDMldyaXRlVmlldzo6SW1wbCA6IHB1YmxpYyBfQzJNYXBwZWRCbG9jazFESW1wbCB7CisgICAgdXNpbmcgX0MyTWFwcGVkQmxvY2sxREltcGw6Ol9DMk1hcHBlZEJsb2NrMURJbXBsOworfTsKKworQzJXcml0ZVZpZXc6OkMyV3JpdGVWaWV3KHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBpbXBsKQorLy8gVUdMWTogX0MyTGluZWFyUmFuZ2VBc3BlY3QgcmVxdWlyZXMgYSBib25hLWZpZGUgb2JqZWN0IGZvciBjYXBhY2l0eSB0byBwcmV2ZW50IHNwb29maW5nLCBzbworLy8gdGhpcyBpcyB3aGF0IHdlIGhhdmUgdG8gZG8uCisvLyBUT0RPOiB1c2UgY2hpbGRSYW5nZQorICAgIDogX0MyRWRpdGFibGVMaW5lYXJSYW5nZUFzcGVjdChzdGQ6Om1ha2VfdW5pcXVlPEMyTGluZWFyQ2FwYWNpdHk+KGltcGwtPnNpemUoKSkuZ2V0KCkpLCBtSW1wbChpbXBsKSB7IH0KKworQzJXcml0ZVZpZXc6OkMyV3JpdGVWaWV3KGMyX3N0YXR1c190IGVycm9yKQorICAgIDogX0MyRWRpdGFibGVMaW5lYXJSYW5nZUFzcGVjdChudWxscHRyKSwgbUltcGwoc3RkOjptYWtlX3NoYXJlZDxJbXBsPihlcnJvcikpIHt9CisKK3VpbnQ4X3QgKkMyV3JpdGVWaWV3OjpiYXNlKCkgeyByZXR1cm4gbUltcGwtPmRhdGEoKTsgfQorCit1aW50OF90ICpDMldyaXRlVmlldzo6ZGF0YSgpIHsgcmV0dXJuIG1JbXBsLT5kYXRhKCkgKyBvZmZzZXQoKTsgfQorCitjMl9zdGF0dXNfdCBDMldyaXRlVmlldzo6ZXJyb3IoKSBjb25zdCB7IHJldHVybiBtSW1wbC0+ZXJyb3IoKTsgfQorCisvKioKKyAqIENvbnN0IGxpbmVhciBibG9jayBpbXBsZW1lbnRhdGlvbi4KKyAqLworQzJDb25zdExpbmVhckJsb2NrOjpDMkNvbnN0TGluZWFyQmxvY2soc3RkOjpzaGFyZWRfcHRyPEltcGw+IGltcGwsIGNvbnN0IF9DMkxpbmVhclJhbmdlQXNwZWN0ICZyYW5nZSwgQzJGZW5jZSBmZW5jZSkKKyAgICA6IEMyQmxvY2sxRChpbXBsLCByYW5nZSksIG1GZW5jZShmZW5jZSkgeyB9CisKK0MyQWNxdWlyYWJsZTxDMlJlYWRWaWV3PiBDMkNvbnN0TGluZWFyQmxvY2s6Om1hcCgpIGNvbnN0IHsKKyAgICB2b2lkICpiYXNlID0gbnVsbHB0cjsKKyAgICB1aW50MzJfdCBsZW4gPSBzaXplKCk7CisgICAgYzJfc3RhdHVzX3QgZXJyb3IgPSBtSW1wbC0+Z2V0QWxsb2NhdGlvbigpLT5tYXAoCisgICAgICAgICAgICBvZmZzZXQoKSwgbGVuLCB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCAwIH0sIG51bGxwdHIsICZiYXNlKTsKKyAgICAvLyBUT0RPOiB3YWl0IG9uIGZlbmNlCisgICAgaWYgKGVycm9yID09IEMyX09LKSB7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxSZWFkVmlld0J1ZGR5OjpJbXBsPiBydmkgPSBzdGQ6OnNoYXJlZF9wdHI8UmVhZFZpZXdCdWRkeTo6SW1wbD4oCisgICAgICAgICAgICAgICAgbmV3IFJlYWRWaWV3QnVkZHk6OkltcGwoKm1JbXBsLCAodWludDhfdCAqKWJhc2UsIG9mZnNldCgpLCBsZW4pLAorICAgICAgICAgICAgICAgIFtiYXNlLCBsZW5dKFJlYWRWaWV3QnVkZHk6OkltcGwgKmkpIHsKKyAgICAgICAgICAgICAgICAgICAgKHZvaWQpaS0+Z2V0QWxsb2NhdGlvbigpLT51bm1hcChiYXNlLCBsZW4sIG51bGxwdHIpOworICAgICAgICAgICAgICAgICAgICBkZWxldGUgaTsKKyAgICAgICAgfSk7CisgICAgICAgIHJldHVybiBBY3F1aXJhYmxlUmVhZFZpZXdCdWRkeShlcnJvciwgQzJGZW5jZSgpLCBSZWFkVmlld0J1ZGR5KHJ2aSwgMCwgbGVuKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIEFjcXVpcmFibGVSZWFkVmlld0J1ZGR5KGVycm9yLCBDMkZlbmNlKCksIFJlYWRWaWV3QnVkZHkoZXJyb3IpKTsKKyAgICB9Cit9CisKK0MyQ29uc3RMaW5lYXJCbG9jayBDMkNvbnN0TGluZWFyQmxvY2s6OnN1YkJsb2NrKHNpemVfdCBvZmZzZXRfLCBzaXplX3Qgc2l6ZV8pIGNvbnN0IHsKKyAgICBDMkxpbmVhclJhbmdlIHN1YlJhbmdlKCptSW1wbCwgb2Zmc2V0Xywgc2l6ZV8pOworICAgIHJldHVybiBDMkNvbnN0TGluZWFyQmxvY2sobUltcGwsIHN1YlJhbmdlLCBtRmVuY2UpOworfQorCisvKioKKyAqIExpbmVhciBibG9jayBpbXBsZW1lbnRhdGlvbi4KKyAqLworQzJMaW5lYXJCbG9jazo6QzJMaW5lYXJCbG9jayhzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gaW1wbCwgY29uc3QgX0MyTGluZWFyUmFuZ2VBc3BlY3QgJnJhbmdlKQorICAgIDogQzJCbG9jazFEKGltcGwsIHJhbmdlKSB7IH0KKworQzJBY3F1aXJhYmxlPEMyV3JpdGVWaWV3PiBDMkxpbmVhckJsb2NrOjptYXAoKSB7CisgICAgdm9pZCAqYmFzZSA9IG51bGxwdHI7CisgICAgdWludDMyX3QgbGVuID0gc2l6ZSgpOworICAgIGMyX3N0YXR1c190IGVycm9yID0gbUltcGwtPmdldEFsbG9jYXRpb24oKS0+bWFwKAorICAgICAgICAgICAgb2Zmc2V0KCksIGxlbiwgeyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH0sIG51bGxwdHIsICZiYXNlKTsKKyAgICAvLyBUT0RPOiB3YWl0IG9uIGZlbmNlCisgICAgaWYgKGVycm9yID09IEMyX09LKSB7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxXcml0ZVZpZXdCdWRkeTo6SW1wbD4gcnZpID0gc3RkOjpzaGFyZWRfcHRyPFdyaXRlVmlld0J1ZGR5OjpJbXBsPigKKyAgICAgICAgICAgICAgICBuZXcgV3JpdGVWaWV3QnVkZHk6OkltcGwoKm1JbXBsLCAodWludDhfdCAqKWJhc2UsIDAsIGxlbiksCisgICAgICAgICAgICAgICAgW2Jhc2UsIGxlbl0oV3JpdGVWaWV3QnVkZHk6OkltcGwgKmkpIHsKKyAgICAgICAgICAgICAgICAgICAgKHZvaWQpaS0+Z2V0QWxsb2NhdGlvbigpLT51bm1hcChiYXNlLCBsZW4sIG51bGxwdHIpOworICAgICAgICAgICAgICAgICAgICBkZWxldGUgaTsKKyAgICAgICAgfSk7CisgICAgICAgIHJldHVybiBBY3F1aXJhYmxlV3JpdGVWaWV3QnVkZHkoZXJyb3IsIEMyRmVuY2UoKSwgV3JpdGVWaWV3QnVkZHkocnZpKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIEFjcXVpcmFibGVXcml0ZVZpZXdCdWRkeShlcnJvciwgQzJGZW5jZSgpLCBXcml0ZVZpZXdCdWRkeShlcnJvcikpOworICAgIH0KK30KKworQzJDb25zdExpbmVhckJsb2NrIEMyTGluZWFyQmxvY2s6OnNoYXJlKHNpemVfdCBvZmZzZXRfLCBzaXplX3Qgc2l6ZV8sIEMyRmVuY2UgZmVuY2UpIHsKKyAgICByZXR1cm4gQ29uc3RMaW5lYXJCbG9ja0J1ZGR5KG1JbXBsLCBDMkxpbmVhclJhbmdlKCp0aGlzLCBvZmZzZXRfLCBzaXplXyksIGZlbmNlKTsKK30KKworQzJCYXNpY0xpbmVhckJsb2NrUG9vbDo6QzJCYXNpY0xpbmVhckJsb2NrUG9vbCgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiAmYWxsb2NhdG9yKQorICA6IG1BbGxvY2F0b3IoYWxsb2NhdG9yKSB7IH0KKworYzJfc3RhdHVzX3QgQzJCYXNpY0xpbmVhckJsb2NrUG9vbDo6ZmV0Y2hMaW5lYXJCbG9jaygKKyAgICAgICAgdWludDMyX3QgY2FwYWNpdHksCisgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiAqYmxvY2sgLyogbm9ubnVsbCAqLykgeworICAgIGJsb2NrLT5yZXNldCgpOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQWxsb2NhdGlvbj4gYWxsb2M7CisgICAgYzJfc3RhdHVzX3QgZXJyID0gbUFsbG9jYXRvci0+bmV3TGluZWFyQWxsb2NhdGlvbihjYXBhY2l0eSwgdXNhZ2UsICZhbGxvYyk7CisgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgICpibG9jayA9IF9DMkJsb2NrRmFjdG9yeTo6Q3JlYXRlTGluZWFyQmxvY2soYWxsb2MpOworCisgICAgcmV0dXJuIEMyX09LOworfQorCitzdHJ1Y3QgQzJfSElERSBDMlBvb2xlZEJsb2NrUG9vbERhdGEgOiBfQzJCbG9ja1Bvb2xEYXRhIHsKKworICAgIHZpcnR1YWwgdHlwZV90IGdldFR5cGUoKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBUWVBFX0JVRkZFUlBPT0w7CisgICAgfQorCisgICAgdm9pZCBnZXRCdWZmZXJQb29sRGF0YShzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICpkYXRhKSBjb25zdCB7CisgICAgICAgICpkYXRhID0gbURhdGE7CisgICAgfQorCisgICAgQzJQb29sZWRCbG9ja1Bvb2xEYXRhKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gJmRhdGEpIDogbURhdGEoZGF0YSkge30KKworICAgIHZpcnR1YWwgfkMyUG9vbGVkQmxvY2tQb29sRGF0YSgpIG92ZXJyaWRlIHt9CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiBtRGF0YTsKK307CisKK2Jvb2wgX0MyQmxvY2tGYWN0b3J5OjpHZXRCdWZmZXJQb29sRGF0YSgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IF9DMkJsb2NrUG9vbERhdGE+ICZkYXRhLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICpidWZmZXJQb29sRGF0YSkgeworICAgIGlmIChkYXRhICYmIGRhdGEtPmdldFR5cGUoKSA9PSBfQzJCbG9ja1Bvb2xEYXRhOjpUWVBFX0JVRkZFUlBPT0wpIHsKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyUG9vbGVkQmxvY2tQb29sRGF0YT4gcG9vbERhdGEgPQorICAgICAgICAgICAgICAgIHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxjb25zdCBDMlBvb2xlZEJsb2NrUG9vbERhdGE+KGRhdGEpOworICAgICAgICBwb29sRGF0YS0+Z2V0QnVmZmVyUG9vbERhdGEoYnVmZmVyUG9vbERhdGEpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gX0MyQmxvY2tGYWN0b3J5OjpDcmVhdGVMaW5lYXJCbG9jaygKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQWxsb2NhdGlvbj4gJmFsbG9jLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8X0MyQmxvY2tQb29sRGF0YT4gJmRhdGEsIHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2sxRDo6SW1wbD4gaW1wbCA9CisgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJCbG9jazFEOjpJbXBsPihhbGxvYywgZGF0YSwgb2Zmc2V0LCBzaXplKTsKKyAgICByZXR1cm4gc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+KG5ldyBDMkxpbmVhckJsb2NrKGltcGwsICppbXBsKSk7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxfQzJCbG9ja1Bvb2xEYXRhPiBfQzJCbG9ja0ZhY3Rvcnk6OkdldExpbmVhckJsb2NrUG9vbERhdGEoCisgICAgICAgIGNvbnN0IEMyQmxvY2sxRCAmYmxvY2spIHsKKyAgICBpZiAoYmxvY2subUltcGwpIHsKKyAgICAgICAgcmV0dXJuIGJsb2NrLm1JbXBsLT5wb29sRGF0YSgpOworICAgIH0KKyAgICByZXR1cm4gbnVsbHB0cjsKK30KKworc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IF9DMkJsb2NrRmFjdG9yeTo6Q3JlYXRlTGluZWFyQmxvY2soCisgICAgICAgIGNvbnN0IEMySGFuZGxlICpoYW5kbGUpIHsKKyAgICAvLyBUT0RPOiBnZXQgcHJvcGVyIGFsbG9jYXRvcj8gYW5kIG11dGV4PworICAgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8QzJBbGxvY2F0b3JJb24+IHNBbGxvY2F0b3IgPSBzdGQ6Om1ha2VfdW5pcXVlPEMyQWxsb2NhdG9ySW9uPigwKTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckFsbG9jYXRpb24+IGFsbG9jOworICAgIGlmIChDMkFsbG9jYXRvcklvbjo6aXNWYWxpZChoYW5kbGUpKSB7CisgICAgICAgIGMyX3N0YXR1c190IGVyciA9IHNBbGxvY2F0b3ItPnByaW9yTGluZWFyQWxsb2NhdGlvbihoYW5kbGUsICZhbGxvYyk7CisgICAgICAgIGlmIChlcnIgPT0gQzJfT0spIHsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBibG9jayA9IF9DMkJsb2NrRmFjdG9yeTo6Q3JlYXRlTGluZWFyQmxvY2soYWxsb2MpOworICAgICAgICAgICAgcmV0dXJuIGJsb2NrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBudWxscHRyOworfQorCitzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gX0MyQmxvY2tGYWN0b3J5OjpDcmVhdGVMaW5lYXJCbG9jaygKKyAgICAgICAgY29uc3QgQzJIYW5kbGUgKmNIYW5kbGUsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gJmRhdGEpIHsKKyAgICAvLyBUT0RPOiBnZXQgcHJvcGVyIGFsbG9jYXRvcj8gYW5kIG11dGV4PworICAgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8QzJBbGxvY2F0b3JJb24+IHNBbGxvY2F0b3IgPSBzdGQ6Om1ha2VfdW5pcXVlPEMyQWxsb2NhdG9ySW9uPigwKTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckFsbG9jYXRpb24+IGFsbG9jOworICAgIGlmIChDMkFsbG9jYXRvcklvbjo6aXNWYWxpZChjSGFuZGxlKSkgeworICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKmhhbmRsZSA9IG5hdGl2ZV9oYW5kbGVfY2xvbmUoY0hhbmRsZSk7CisgICAgICAgIGlmIChoYW5kbGUpIHsKKyAgICAgICAgICAgIGMyX3N0YXR1c190IGVyciA9IHNBbGxvY2F0b3ItPnByaW9yTGluZWFyQWxsb2NhdGlvbihoYW5kbGUsICZhbGxvYyk7CisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJQb29sZWRCbG9ja1Bvb2xEYXRhPiBwb29sRGF0YSA9CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJQb29sZWRCbG9ja1Bvb2xEYXRhPihkYXRhKTsKKyAgICAgICAgICAgIGlmIChlcnIgPT0gQzJfT0sgJiYgcG9vbERhdGEpIHsKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBjb25maWcgcGFyYW1zPworICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBibG9jayA9CisgICAgICAgICAgICAgICAgICAgICAgICBfQzJCbG9ja0ZhY3Rvcnk6OkNyZWF0ZUxpbmVhckJsb2NrKGFsbG9jLCBwb29sRGF0YSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGJsb2NrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBudWxscHRyOworfTsKKworLyoqCisgKiBXcmFwcGVkIEMyQWxsb2NhdG9yIHdoaWNoIGlzIGluamVjdGVkIHRvIGJ1ZmZlciBwb29sIG9uIGJlaGFsZiBvZgorICogQzJCbG9ja1Bvb2wuCisgKi8KK2NsYXNzIF9DMkJ1ZmZlclBvb2xBbGxvY2F0b3IgOiBwdWJsaWMgQnVmZmVyUG9vbEFsbG9jYXRvciB7CitwdWJsaWM6CisgICAgX0MyQnVmZmVyUG9vbEFsbG9jYXRvcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+ICZhbGxvY2F0b3IpCisgICAgICAgIDogbUFsbG9jYXRvcihhbGxvY2F0b3IpIHt9CisKKyAgICB+X0MyQnVmZmVyUG9vbEFsbG9jYXRvcigpIG92ZXJyaWRlIHt9CisKKyAgICBSZXN1bHRTdGF0dXMgYWxsb2NhdGUoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0aW9uPiAqYWxsb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqYWxsb2NTaXplKSBvdmVycmlkZTsKKworICAgIGJvb2wgY29tcGF0aWJsZShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmbmV3UGFyYW1zLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmb2xkUGFyYW1zKSBvdmVycmlkZTsKKworICAgIC8vIE1ldGhvZHMgZm9yIGNvZGVjMiBjb21wb25lbnQgKEMyQmxvY2tQb29sKS4KKyAgICAvKioKKyAgICAgKiBUcmFuc2Zvcm1zIGxpbmVhciBhbGxvY2F0aW9uIHBhcmFtZXRlcnMgZm9yIEMyQWxsb2NhdG9yIHRvIHBhcmFtZXRlcnMKKyAgICAgKiBmb3IgYnVmZmVyIHBvb2wuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2FwYWNpdHkgICAgICBzaXplIG9mIGxpbmVhciBhbGxvY2F0aW9uCisgICAgICogQHBhcmFtIHVzYWdlICAgICAgICAgbWVtb3J5IHVzYWdlIHBhdHRlcm4gZm9yIGxpbmVhciBhbGxvY2F0aW9uCisgICAgICogQHBhcmFtIHBhcmFtcyAgICAgICAgYWxsb2NhdGlvbiBwYXJhbWV0ZXJzIGZvciBidWZmZXIgcG9vbAorICAgICAqLworICAgIHZvaWQgZ2V0TGluZWFyUGFyYW1zKHVpbnQzMl90IGNhcGFjaXR5LCBDMk1lbW9yeVVzYWdlIHVzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICpwYXJhbXMpOworCisgICAgLyoqCisgICAgICogVHJhbnNmb3JtcyBncmFwaGljIGFsbG9jYXRpb24gcGFyYW1ldGVycyBmb3IgQzJBbGxvY2F0b3IgdG8gcGFyYW1ldGVycworICAgICAqIGZvciBidWZmZXIgcG9vbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB3aWR0aCAgICAgICAgIHdpZHRoIG9mIGdyYXBoaWMgYWxsb2NhdGlvbgorICAgICAqIEBwYXJhbSBoZWlnaHQgICAgICAgIGhlaWdodCBvZiBncmFwaGljIGFsbG9jYXRpb24KKyAgICAgKiBAcGFyYW0gZm9ybWF0ICAgICAgICBjb2xvciBmb3JtYXQgb2YgZ3JhcGhpYyBhbGxvY2F0aW9uCisgICAgICogQHBhcmFtIHBhcmFtcyAgICAgICAgYWxsb2NhdGlvbiBwYXJhbWV0ZXIgZm9yIGJ1ZmZlciBwb29sCisgICAgICovCisgICAgdm9pZCBnZXRHcmFwaGljUGFyYW1zKHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZvcm1hdCwgQzJNZW1vcnlVc2FnZSB1c2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gKnBhcmFtcyk7CisKKyAgICAvKioKKyAgICAgKiBUcmFuc2Zvcm1zIGFuIGV4aXN0aW5nIG5hdGl2ZSBoYW5kbGUgdG8gYW4gQzJMaW5lYXJBbGxjYXRpb24uCisgICAgICogV3JhcHBlciB0byBDMkFsbG9jYXRvciNwcmlvckxpbmVhckFsbG9jYXRpb24KKyAgICAgKi8KKyAgICBjMl9zdGF0dXNfdCBwcmlvckxpbmVhckFsbG9jYXRpb24oCisgICAgICAgICAgICBjb25zdCBDMkhhbmRsZSAqaGFuZGxlLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQWxsb2NhdGlvbj4gKmMyQWxsb2NhdGlvbik7CisKKyAgICAvKioKKyAgICAgKiBUcmFuc2Zvcm1zIGFuIGV4aXN0aW5nIG5hdGl2ZSBoYW5kbGUgdG8gYW4gQzJHcmFwaGljQWxsY2F0aW9uLgorICAgICAqIFdyYXBwZXIgdG8gQzJBbGxvY2F0b3IjcHJpb3JHcmFwaGljQWxsb2NhdGlvbgorICAgICAqLworICAgIGMyX3N0YXR1c190IHByaW9yR3JhcGhpY0FsbG9jYXRpb24oCisgICAgICAgICAgICBjb25zdCBDMkhhbmRsZSAqaGFuZGxlLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0FsbG9jYXRpb24+ICpjMkFsbG9jYXRpb24pOworCitwcml2YXRlOgorICAgIHN0YXRpYyBjb25zdGV4cHIgaW50IGtNYXhJbnRQYXJhbXMgPSA1OyAvLyBsYXJnZSBlbm91Z2ggbnVtYmVyOworCisgICAgZW51bSBBbGxvY1R5cGUgOiB1aW50OF90IHsKKyAgICAgICAgQUxMT0NfTk9ORSA9IDAsCisKKyAgICAgICAgQUxMT0NfTElORUFSLAorICAgICAgICBBTExPQ19HUkFQSElDLAorICAgIH07CisKKyAgICB1bmlvbiBBbGxvY1BhcmFtcyB7CisgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICBBbGxvY1R5cGUgYWxsb2NUeXBlOworICAgICAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZTsKKyAgICAgICAgICAgIHVpbnQzMl90IHBhcmFtc1trTWF4SW50UGFyYW1zXTsKKyAgICAgICAgfSBkYXRhOworICAgICAgICB1aW50OF90IGFycmF5WzBdOworCisgICAgICAgIEFsbG9jUGFyYW1zKCkgOiBkYXRhe0FMTE9DX05PTkUsIHswLCAwfSwgezB9fSB7fQorICAgICAgICBBbGxvY1BhcmFtcyhDMk1lbW9yeVVzYWdlIHVzYWdlLCB1aW50MzJfdCBjYXBhY2l0eSkKKyAgICAgICAgICAgIDogZGF0YXtBTExPQ19MSU5FQVIsIHVzYWdlLCB7WzBdID0gY2FwYWNpdHl9fSB7fQorICAgICAgICBBbGxvY1BhcmFtcygKKyAgICAgICAgICAgICAgICBDMk1lbW9yeVVzYWdlIHVzYWdlLAorICAgICAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIHVpbnQzMl90IGZvcm1hdCkKKyAgICAgICAgICAgICAgICA6IGRhdGF7QUxMT0NfR1JBUEhJQywgdXNhZ2UsIHt3aWR0aCwgaGVpZ2h0LCBmb3JtYXR9fSB7fQorICAgIH07CisKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IG1BbGxvY2F0b3I7Cit9OworCitzdHJ1Y3QgTGluZWFyQWxsb2NhdGlvbkR0b3IgeworICAgIExpbmVhckFsbG9jYXRpb25EdG9yKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckFsbG9jYXRpb24+ICZhbGxvYykKKyAgICAgICAgOiBtQWxsb2NhdGlvbihhbGxvYykge30KKworICAgIHZvaWQgb3BlcmF0b3IoKShCdWZmZXJQb29sQWxsb2NhdGlvbiAqcG9vbEFsbG9jKSB7IGRlbGV0ZSBwb29sQWxsb2M7IH0KKworICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckFsbG9jYXRpb24+IG1BbGxvY2F0aW9uOworfTsKKworc3RydWN0IEdyYXBoaWNBbGxvY2F0aW9uRHRvciB7CisgICAgR3JhcGhpY0FsbG9jYXRpb25EdG9yKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNBbGxvY2F0aW9uPiAmYWxsb2MpCisgICAgICAgIDogbUFsbG9jYXRpb24oYWxsb2MpIHt9CisKKyAgICB2b2lkIG9wZXJhdG9yKCkoQnVmZmVyUG9vbEFsbG9jYXRpb24gKnBvb2xBbGxvYykgeyBkZWxldGUgcG9vbEFsbG9jOyB9CisKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQWxsb2NhdGlvbj4gbUFsbG9jYXRpb247Cit9OworCitSZXN1bHRTdGF0dXMgX0MyQnVmZmVyUG9vbEFsbG9jYXRvcjo6YWxsb2NhdGUoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICAmcGFyYW1zLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRpb24+ICphbGxvYywKKyAgICAgICAgc2l6ZV90ICphbGxvY1NpemUpIHsKKyAgICBBbGxvY1BhcmFtcyBjMlBhcmFtczsKKyAgICBtZW1jcHkoJmMyUGFyYW1zLCBwYXJhbXMuZGF0YSgpLCBzdGQ6Om1pbihzaXplb2YoQWxsb2NQYXJhbXMpLCBwYXJhbXMuc2l6ZSgpKSk7CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzID0gQzJfQkFEX1ZBTFVFOworICAgIHN3aXRjaChjMlBhcmFtcy5kYXRhLmFsbG9jVHlwZSkgeworICAgICAgICBjYXNlIEFMTE9DX05PTkU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBTExPQ19MSU5FQVI6IHsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckFsbG9jYXRpb24+IGMyTGluZWFyOworICAgICAgICAgICAgc3RhdHVzID0gbUFsbG9jYXRvci0+bmV3TGluZWFyQWxsb2NhdGlvbigKKyAgICAgICAgICAgICAgICAgICAgYzJQYXJhbXMuZGF0YS5wYXJhbXNbMF0sIGMyUGFyYW1zLmRhdGEudXNhZ2UsICZjMkxpbmVhcik7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IEMyX09LICYmIGMyTGluZWFyKSB7CisgICAgICAgICAgICAgICAgQnVmZmVyUG9vbEFsbG9jYXRpb24gKnB0ciA9IG5ldyBCdWZmZXJQb29sQWxsb2NhdGlvbihjMkxpbmVhci0+aGFuZGxlKCkpOworICAgICAgICAgICAgICAgIGlmIChwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgKmFsbG9jID0gc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0aW9uPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHIsIExpbmVhckFsbG9jYXRpb25EdG9yKGMyTGluZWFyKSk7CisgICAgICAgICAgICAgICAgICAgIGlmICgqYWxsb2MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICphbGxvY1NpemUgPSAoc2l6ZV90KWMyUGFyYW1zLmRhdGEucGFyYW1zWzBdOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6T0s7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHB0cjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Tk9fTUVNT1JZOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBBTExPQ19HUkFQSElDOiB7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQWxsb2NhdGlvbj4gYzJHcmFwaGljOworICAgICAgICAgICAgc3RhdHVzID0gbUFsbG9jYXRvci0+bmV3R3JhcGhpY0FsbG9jYXRpb24oCisgICAgICAgICAgICAgICAgICAgIGMyUGFyYW1zLmRhdGEucGFyYW1zWzBdLAorICAgICAgICAgICAgICAgICAgICBjMlBhcmFtcy5kYXRhLnBhcmFtc1sxXSwKKyAgICAgICAgICAgICAgICAgICAgYzJQYXJhbXMuZGF0YS5wYXJhbXNbMl0sCisgICAgICAgICAgICAgICAgICAgIGMyUGFyYW1zLmRhdGEudXNhZ2UsICZjMkdyYXBoaWMpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBDMl9PSyAmJiBjMkdyYXBoaWMpIHsKKyAgICAgICAgICAgICAgICBCdWZmZXJQb29sQWxsb2NhdGlvbiAqcHRyID0gbmV3IEJ1ZmZlclBvb2xBbGxvY2F0aW9uKGMyR3JhcGhpYy0+aGFuZGxlKCkpOworICAgICAgICAgICAgICAgIGlmIChwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgKmFsbG9jID0gc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0aW9uPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHIsIEdyYXBoaWNBbGxvY2F0aW9uRHRvcihjMkdyYXBoaWMpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCphbGxvYykgeworICAgICAgICAgICAgICAgICAgICAgICAgKmFsbG9jU2l6ZSA9IGMyUGFyYW1zLmRhdGEucGFyYW1zWzBdICogYzJQYXJhbXMuZGF0YS5wYXJhbXNbMV07CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpPSzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBkZWxldGUgcHRyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpOT19NRU1PUlk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCitib29sIF9DMkJ1ZmZlclBvb2xBbGxvY2F0b3I6OmNvbXBhdGlibGUoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICAmbmV3UGFyYW1zLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAgJm9sZFBhcmFtcykgeworICAgIEFsbG9jUGFyYW1zIG5ld0FsbG9jOworICAgIEFsbG9jUGFyYW1zIG9sZEFsbG9jOworICAgIG1lbWNweSgmbmV3QWxsb2MsIG5ld1BhcmFtcy5kYXRhKCksIHN0ZDo6bWluKHNpemVvZihBbGxvY1BhcmFtcyksIG5ld1BhcmFtcy5zaXplKCkpKTsKKyAgICBtZW1jcHkoJm9sZEFsbG9jLCBvbGRQYXJhbXMuZGF0YSgpLCBzdGQ6Om1pbihzaXplb2YoQWxsb2NQYXJhbXMpLCBvbGRQYXJhbXMuc2l6ZSgpKSk7CisKKyAgICAvLyBUT0RPOiBzdXBwb3J0IG5vdCBleGFjdCBtYXRjaGluZy4gZS5nKSBuZXdDYXBhY2l0eSA8IG9sZENhcGFjaXR5CisgICAgaWYgKG5ld0FsbG9jLmRhdGEuYWxsb2NUeXBlID09IG9sZEFsbG9jLmRhdGEuYWxsb2NUeXBlICYmCisgICAgICAgICAgICBuZXdBbGxvYy5kYXRhLnVzYWdlLmV4cGVjdGVkID09IG9sZEFsbG9jLmRhdGEudXNhZ2UuZXhwZWN0ZWQpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrTWF4SW50UGFyYW1zOyArK2kpIHsKKyAgICAgICAgICAgIGlmIChuZXdBbGxvYy5kYXRhLnBhcmFtc1tpXSAhPSBvbGRBbGxvYy5kYXRhLnBhcmFtc1tpXSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIF9DMkJ1ZmZlclBvb2xBbGxvY2F0b3I6OmdldExpbmVhclBhcmFtcygKKyAgICAgICAgdWludDMyX3QgY2FwYWNpdHksIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICpwYXJhbXMpIHsKKyAgICBBbGxvY1BhcmFtcyBjMlBhcmFtcyh1c2FnZSwgY2FwYWNpdHkpOworICAgIHBhcmFtcy0+YXNzaWduKGMyUGFyYW1zLmFycmF5LCBjMlBhcmFtcy5hcnJheSArIHNpemVvZihBbGxvY1BhcmFtcykpOworfQorCit2b2lkIF9DMkJ1ZmZlclBvb2xBbGxvY2F0b3I6OmdldEdyYXBoaWNQYXJhbXMoCisgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIHVpbnQzMl90IGZvcm1hdCwgQzJNZW1vcnlVc2FnZSB1c2FnZSwKKyAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gKnBhcmFtcykgeworICAgIEFsbG9jUGFyYW1zIGMyUGFyYW1zKHVzYWdlLCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQpOworICAgIHBhcmFtcy0+YXNzaWduKGMyUGFyYW1zLmFycmF5LCBjMlBhcmFtcy5hcnJheSArIHNpemVvZihBbGxvY1BhcmFtcykpOworfQorCitjMl9zdGF0dXNfdCBfQzJCdWZmZXJQb29sQWxsb2NhdG9yOjpwcmlvckxpbmVhckFsbG9jYXRpb24oCisgICAgICAgIGNvbnN0IEMySGFuZGxlICpoYW5kbGUsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckFsbG9jYXRpb24+ICpjMkFsbG9jYXRpb24pIHsKKyAgICByZXR1cm4gbUFsbG9jYXRvci0+cHJpb3JMaW5lYXJBbGxvY2F0aW9uKGhhbmRsZSwgYzJBbGxvY2F0aW9uKTsKK30KKworYzJfc3RhdHVzX3QgX0MyQnVmZmVyUG9vbEFsbG9jYXRvcjo6cHJpb3JHcmFwaGljQWxsb2NhdGlvbigKKyAgICAgICAgY29uc3QgQzJIYW5kbGUgKmhhbmRsZSwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0FsbG9jYXRpb24+ICpjMkFsbG9jYXRpb24pIHsKKyAgICByZXR1cm4gbUFsbG9jYXRvci0+cHJpb3JHcmFwaGljQWxsb2NhdGlvbihoYW5kbGUsIGMyQWxsb2NhdGlvbik7Cit9CisKK2NsYXNzIEMyUG9vbGVkQmxvY2tQb29sOjpJbXBsIHsKK3B1YmxpYzoKKyAgICBJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gJmFsbG9jYXRvcikKKyAgICAgICAgICAgIDogbUluaXQoQzJfT0spLAorICAgICAgICAgICAgICBtQnVmZmVyUG9vbE1hbmFnZXIoQ2xpZW50TWFuYWdlcjo6Z2V0SW5zdGFuY2UoKSksCisgICAgICAgICAgICAgIG1BbGxvY2F0b3Ioc3RkOjptYWtlX3NoYXJlZDxfQzJCdWZmZXJQb29sQWxsb2NhdG9yPihhbGxvY2F0b3IpKSB7CisgICAgICAgIGlmIChtQWxsb2NhdG9yICYmIG1CdWZmZXJQb29sTWFuYWdlcikgeworICAgICAgICAgICAgaWYgKG1CdWZmZXJQb29sTWFuYWdlci0+Y3JlYXRlKAorICAgICAgICAgICAgICAgICAgICBtQWxsb2NhdG9yLCAmbUNvbm5lY3Rpb25JZCkgPT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtSW5pdCA9IEMyX05PX0lOSVQ7CisgICAgfQorCisgICAgfkltcGwoKSB7CisgICAgICAgIGlmIChtSW5pdCA9PSBDMl9PSykgeworICAgICAgICAgICAgbUJ1ZmZlclBvb2xNYW5hZ2VyLT5jbG9zZShtQ29ubmVjdGlvbklkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGMyX3N0YXR1c190IGZldGNoTGluZWFyQmxvY2soCisgICAgICAgICAgICB1aW50MzJfdCBjYXBhY2l0eSwgQzJNZW1vcnlVc2FnZSB1c2FnZSwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiAqYmxvY2sgLyogbm9ubnVsbCAqLykgeworICAgICAgICBibG9jay0+cmVzZXQoKTsKKyAgICAgICAgaWYgKG1Jbml0ICE9IEMyX09LKSB7CisgICAgICAgICAgICByZXR1cm4gbUluaXQ7CisgICAgICAgIH0KKyAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gcGFyYW1zOworICAgICAgICBtQWxsb2NhdG9yLT5nZXRMaW5lYXJQYXJhbXMoY2FwYWNpdHksIHVzYWdlLCAmcGFyYW1zKTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiBidWZmZXJQb29sRGF0YTsKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90ICpjSGFuZGxlID0gbnVsbHB0cjsKKyAgICAgICAgUmVzdWx0U3RhdHVzIHN0YXR1cyA9IG1CdWZmZXJQb29sTWFuYWdlci0+YWxsb2NhdGUoCisgICAgICAgICAgICAgICAgbUNvbm5lY3Rpb25JZCwgcGFyYW1zLCAmY0hhbmRsZSwgJmJ1ZmZlclBvb2xEYXRhKTsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKmhhbmRsZSA9IG5hdGl2ZV9oYW5kbGVfY2xvbmUoY0hhbmRsZSk7CisgICAgICAgICAgICBpZiAoaGFuZGxlKSB7CisgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQWxsb2NhdGlvbj4gYWxsb2M7CisgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9vbGVkQmxvY2tQb29sRGF0YT4gcG9vbERhdGEgPQorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlBvb2xlZEJsb2NrUG9vbERhdGE+KGJ1ZmZlclBvb2xEYXRhKTsKKyAgICAgICAgICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBtQWxsb2NhdG9yLT5wcmlvckxpbmVhckFsbG9jYXRpb24oaGFuZGxlLCAmYWxsb2MpOworICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gQzJfT0sgJiYgcG9vbERhdGEgJiYgYWxsb2MpIHsKKyAgICAgICAgICAgICAgICAgICAgKmJsb2NrID0gX0MyQmxvY2tGYWN0b3J5OjpDcmVhdGVMaW5lYXJCbG9jayhhbGxvYywgcG9vbERhdGEsIDAsIGNhcGFjaXR5KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCpibG9jaykgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEMyX09LOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIEMyX05PX01FTU9SWTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6Tk9fTUVNT1JZKSB7CisgICAgICAgICAgICByZXR1cm4gQzJfTk9fTUVNT1JZOworICAgICAgICB9CisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorCisgICAgYzJfc3RhdHVzX3QgZmV0Y2hHcmFwaGljQmxvY2soCisgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCB1aW50MzJfdCBmb3JtYXQsCisgICAgICAgICAgICBDMk1lbW9yeVVzYWdlIHVzYWdlLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiAqYmxvY2spIHsKKyAgICAgICAgYmxvY2stPnJlc2V0KCk7CisgICAgICAgIGlmIChtSW5pdCAhPSBDMl9PSykgeworICAgICAgICAgICAgcmV0dXJuIG1Jbml0OworICAgICAgICB9CisgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHBhcmFtczsKKyAgICAgICAgbUFsbG9jYXRvci0+Z2V0R3JhcGhpY1BhcmFtcyh3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHVzYWdlLCAmcGFyYW1zKTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiBidWZmZXJQb29sRGF0YTsKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90ICpjSGFuZGxlID0gbnVsbHB0cjsKKyAgICAgICAgUmVzdWx0U3RhdHVzIHN0YXR1cyA9IG1CdWZmZXJQb29sTWFuYWdlci0+YWxsb2NhdGUoCisgICAgICAgICAgICAgICAgbUNvbm5lY3Rpb25JZCwgcGFyYW1zLCAmY0hhbmRsZSwgJmJ1ZmZlclBvb2xEYXRhKTsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKmhhbmRsZSA9IG5hdGl2ZV9oYW5kbGVfY2xvbmUoY0hhbmRsZSk7CisgICAgICAgICAgICBpZiAoaGFuZGxlKSB7CisgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0FsbG9jYXRpb24+IGFsbG9jOworICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvb2xlZEJsb2NrUG9vbERhdGE+IHBvb2xEYXRhID0KKyAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlBvb2xlZEJsb2NrUG9vbERhdGE+KGJ1ZmZlclBvb2xEYXRhKTsKKyAgICAgICAgICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBtQWxsb2NhdG9yLT5wcmlvckdyYXBoaWNBbGxvY2F0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlLCAmYWxsb2MpOworICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gQzJfT0sgJiYgcG9vbERhdGEgJiYgYWxsb2MpIHsKKyAgICAgICAgICAgICAgICAgICAgKmJsb2NrID0gX0MyQmxvY2tGYWN0b3J5OjpDcmVhdGVHcmFwaGljQmxvY2soCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2MsIHBvb2xEYXRhLCBDMlJlY3Qod2lkdGgsIGhlaWdodCkpOworICAgICAgICAgICAgICAgICAgICBpZiAoKmJsb2NrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQzJfTk9fTUVNT1JZOworICAgICAgICB9CisgICAgICAgIGlmIChzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpOT19NRU1PUlkpIHsKKyAgICAgICAgICAgIHJldHVybiBDMl9OT19NRU1PUlk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisKKyAgICBDb25uZWN0aW9uSWQgZ2V0Q29ubmVjdGlvbklkKCkgeworICAgICAgICByZXR1cm4gbUluaXQgIT0gQzJfT0sgPyBJTlZBTElEX0NPTk5FQ1RJT05JRCA6IG1Db25uZWN0aW9uSWQ7CisgICAgfQorCitwcml2YXRlOgorICAgIGMyX3N0YXR1c190IG1Jbml0OworICAgIGNvbnN0IGFuZHJvaWQ6OnNwPENsaWVudE1hbmFnZXI+IG1CdWZmZXJQb29sTWFuYWdlcjsKKyAgICBDb25uZWN0aW9uSWQgbUNvbm5lY3Rpb25JZDsgLy8gbG9jYWxseQorICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxfQzJCdWZmZXJQb29sQWxsb2NhdG9yPiBtQWxsb2NhdG9yOworfTsKKworQzJQb29sZWRCbG9ja1Bvb2w6OkMyUG9vbGVkQmxvY2tQb29sKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+ICZhbGxvY2F0b3IsIGNvbnN0IGxvY2FsX2lkX3QgbG9jYWxJZCkKKyAgICAgICAgOiBtQWxsb2NhdG9yKGFsbG9jYXRvciksIG1Mb2NhbElkKGxvY2FsSWQpLCBtSW1wbChuZXcgSW1wbChhbGxvY2F0b3IpKSB7fQorCitDMlBvb2xlZEJsb2NrUG9vbDo6fkMyUG9vbGVkQmxvY2tQb29sKCkgeworfQorCitjMl9zdGF0dXNfdCBDMlBvb2xlZEJsb2NrUG9vbDo6ZmV0Y2hMaW5lYXJCbG9jaygKKyAgICAgICAgdWludDMyX3QgY2FwYWNpdHksCisgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiAqYmxvY2sgLyogbm9ubnVsbCAqLykgeworICAgIGlmIChtSW1wbCkgeworICAgICAgICByZXR1cm4gbUltcGwtPmZldGNoTGluZWFyQmxvY2soY2FwYWNpdHksIHVzYWdlLCBibG9jayk7CisgICAgfQorICAgIHJldHVybiBDMl9DT1JSVVBURUQ7Cit9CisKK2MyX3N0YXR1c190IEMyUG9vbGVkQmxvY2tQb29sOjpmZXRjaEdyYXBoaWNCbG9jaygKKyAgICAgICAgdWludDMyX3Qgd2lkdGgsCisgICAgICAgIHVpbnQzMl90IGhlaWdodCwKKyAgICAgICAgdWludDMyX3QgZm9ybWF0LAorICAgICAgICBDMk1lbW9yeVVzYWdlIHVzYWdlLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+ICpibG9jaykgeworICAgIGlmIChtSW1wbCkgeworICAgICAgICByZXR1cm4gbUltcGwtPmZldGNoR3JhcGhpY0Jsb2NrKHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdXNhZ2UsIGJsb2NrKTsKKyAgICB9CisgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKK30KKworaW50NjRfdCBDMlBvb2xlZEJsb2NrUG9vbDo6Z2V0Q29ubmVjdGlvbklkKCkgeworICAgIGlmIChtSW1wbCkgeworICAgICAgICByZXR1cm4gbUltcGwtPmdldENvbm5lY3Rpb25JZCgpOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IDJEIEJMT0NLID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKy8qKgorICogSW1wbGVtZW50YXRpb24gdGhhdCBpcyBzaGFyZWQgYmV0d2VlbiBhbGwgMkQgYmxvY2tzIGFuZCB2aWV3cy4KKyAqCisgKiBGb3IgYmxvY2tzJyBJbXBsJ3MgY3JvcCBpcyBhbHdheXMgdGhlIGFsbG90dGVkIGNyb3AsIGV2ZW4gaWYgaXQgaXMgYSBzdWIgYmxvY2suCisgKgorICogRm9yIHZpZXdzJyBJbXBsJ3MgY3JvcCBpcyB0aGUgbWFwcGVkIHBvcnRpb24gLSB3aGljaCBmb3Igbm93IGlzIGFsd2F5cyB0aGUKKyAqIGFsbG90dGVkIGNyb3AuCisgKi8KK2NsYXNzIEMyX0hJREUgX0MyQmxvY2syREltcGwgOiBwdWJsaWMgX0MyUGxhbmFyU2VjdGlvbkFzcGVjdCB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogSW1wbCdzIGNyb3AgaXMgYWx3YXlzIHRoZSBvciBwYXJ0IG9mIHRoZSBhbGxvdHRlZCBjcm9wIG9mIHRoZSBhbGxvY2F0aW9uLgorICAgICAqLworICAgIF9DMkJsb2NrMkRJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNBbGxvY2F0aW9uPiAmYWxsb2MsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8X0MyQmxvY2tQb29sRGF0YT4gJnBvb2xEYXRhID0gbnVsbHB0ciwKKyAgICAgICAgICAgIGNvbnN0IEMyUmVjdCAmYWxsb3R0ZWRDcm9wID0gQzJSZWN0KH4wdSwgfjB1KSkKKyAgICAgICAgOiBfQzJQbGFuYXJTZWN0aW9uQXNwZWN0KGFsbG9jLmdldCgpLCBhbGxvdHRlZENyb3ApLAorICAgICAgICAgIG1BbGxvY2F0aW9uKGFsbG9jKSwKKyAgICAgICAgICBtUG9vbERhdGEocG9vbERhdGEpIHsgfQorCisgICAgdmlydHVhbCB+X0MyQmxvY2syREltcGwoKSA9IGRlZmF1bHQ7CisKKyAgICAvKiogcmV0dXJucyBwb29sIGRhdGEgICovCisgICAgc3RkOjpzaGFyZWRfcHRyPF9DMkJsb2NrUG9vbERhdGE+IHBvb2xEYXRhKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVBvb2xEYXRhOworICAgIH0KKworICAgIC8qKiByZXR1cm5zIG5hdGl2ZSBoYW5kbGUgKi8KKyAgICBjb25zdCBDMkhhbmRsZSAqaGFuZGxlKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUFsbG9jYXRpb24gPyBtQWxsb2NhdGlvbi0+aGFuZGxlKCkgOiBudWxscHRyOworICAgIH0KKworICAgIC8qKiByZXR1cm5zIHRoZSBhbGxvY2F0b3IncyBJRCAqLworICAgIEMyQWxsb2NhdG9yOjppZF90IGdldEFsbG9jYXRvcklkKCkgY29uc3QgeworICAgICAgICAvLyBCQURfSUQgY2FuIG9ubHkgaGFwcGVuIGlmIHRoaXMgSW1wbCBjbGFzcyBpcyBpbml0aWFsaXplZCBmb3IgYSB2aWV3IC0gbmV2ZXIgZm9yIGEgYmxvY2suCisgICAgICAgIHJldHVybiBtQWxsb2NhdGlvbiA/IG1BbGxvY2F0aW9uLT5nZXRBbGxvY2F0b3JJZCgpIDogQzJBbGxvY2F0b3I6OkJBRF9JRDsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQWxsb2NhdGlvbj4gZ2V0QWxsb2NhdGlvbigpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1BbGxvY2F0aW9uOworICAgIH0KKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQWxsb2NhdGlvbj4gbUFsbG9jYXRpb247CisgICAgc3RkOjpzaGFyZWRfcHRyPF9DMkJsb2NrUG9vbERhdGE+IG1Qb29sRGF0YTsKK307CisKK2NsYXNzIEMyX0hJREUgX0MyTWFwcGluZ0Jsb2NrMkRJbXBsCisgICAgOiBwdWJsaWMgX0MyQmxvY2syREltcGwsIHB1YmxpYyBzdGQ6OmVuYWJsZV9zaGFyZWRfZnJvbV90aGlzPF9DMk1hcHBpbmdCbG9jazJESW1wbD4geworcHVibGljOgorICAgIHVzaW5nIF9DMkJsb2NrMkRJbXBsOjpfQzJCbG9jazJESW1wbDsKKworICAgIHZpcnR1YWwgfl9DMk1hcHBpbmdCbG9jazJESW1wbCgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIC8qKgorICAgICAqIFRoaXMgY2xhc3MgY29udGFpbnMgdGhlIG1hcHBlZCBkYXRhIHBvaW50ZXIsIGFuZCB0aGUgcG90ZW50aWFsIGVycm9yLgorICAgICAqLworICAgIHN0cnVjdCBNYXBwZWQgeworICAgIHByaXZhdGU6CisgICAgICAgIGZyaWVuZCBjbGFzcyBfQzJNYXBwaW5nQmxvY2syREltcGw7CisKKyAgICAgICAgTWFwcGVkKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxfQzJCbG9jazJESW1wbD4gJmltcGwsIGJvb2wgd3JpdGFibGUsIEMyRmVuY2UgKmZlbmNlIF9fdW51c2VkKQorICAgICAgICAgICAgOiBtSW1wbChpbXBsKSwgbVdyaXRhYmxlKHdyaXRhYmxlKSB7CisgICAgICAgICAgICBtZW1zZXQobURhdGEsIDAsIHNpemVvZihtRGF0YSkpOworICAgICAgICAgICAgY29uc3QgQzJSZWN0IGNyb3AgPSBtSW1wbC0+Y3JvcCgpOworICAgICAgICAgICAgLy8gZ3JhbGxvYyByZXF1aXJlcyBtYXBwaW5nIHRoZSB3aG9sZSByZWdpb24gb2YgaW50ZXJlc3QgYXMgd2UgY2Fubm90CisgICAgICAgICAgICAvLyBtYXAgbXVsdGlwbGUgcmVnaW9ucworICAgICAgICAgICAgbUVycm9yID0gbUltcGwtPmdldEFsbG9jYXRpb24oKS0+bWFwKAorICAgICAgICAgICAgICAgICAgICBjcm9wLAorICAgICAgICAgICAgICAgICAgICB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCB3cml0YWJsZSA/IEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSA6IDAgfSwKKyAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgJm1MYXlvdXQsCisgICAgICAgICAgICAgICAgICAgIG1EYXRhKTsKKyAgICAgICAgICAgIGlmIChtRXJyb3IgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICBtZW1zZXQoJm1MYXlvdXQsIDAsIHNpemVvZihtTGF5b3V0KSk7CisgICAgICAgICAgICAgICAgbWVtc2V0KG1EYXRhLCAwLCBzaXplb2YobURhdGEpKTsKKyAgICAgICAgICAgICAgICBtZW1zZXQobU9mZnNldERhdGEsIDAsIHNpemVvZihtRGF0YSkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiB2YWxpZGF0ZSBwbGFuZSBsYXlvdXQgYW5kCisgICAgICAgICAgICAgICAgLy8gYWRqdXN0IGRhdGEgcG9pbnRlcnMgdG8gdGhlIGNyb3AgcmVnaW9uJ3MgdG9wIGxlZnQgY29ybmVyLgorICAgICAgICAgICAgICAgIC8vIGZhaWwgaWYgaXQgaXMgbm90IG9uIGEgc3Vic2FtcGxpbmcgYm91bmRhcnkKKyAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBwbGFuZUl4ID0gMDsgcGxhbmVJeCA8IG1MYXlvdXQubnVtUGxhbmVzOyArK3BsYW5lSXgpIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QgY29sU2FtcGxpbmcgPSBtTGF5b3V0LnBsYW5lc1twbGFuZUl4XS5jb2xTYW1wbGluZzsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3Qgcm93U2FtcGxpbmcgPSBtTGF5b3V0LnBsYW5lc1twbGFuZUl4XS5yb3dTYW1wbGluZzsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNyb3AubGVmdCAlIGNvbFNhbXBsaW5nIHx8IGNyb3AucmlnaHQoKSAlIGNvbFNhbXBsaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgY3JvcC50b3AgJSByb3dTYW1wbGluZyB8fCBjcm9wLmJvdHRvbSgpICUgcm93U2FtcGxpbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhbm5vdCBjYWxjdWxhdGUgZGF0YSBwb2ludGVyCisgICAgICAgICAgICAgICAgICAgICAgICBtSW1wbC0+Z2V0QWxsb2NhdGlvbigpLT51bm1hcChtRGF0YSwgY3JvcCwgbnVsbHB0cik7CisgICAgICAgICAgICAgICAgICAgICAgICBtZW1zZXQoJm1MYXlvdXQsIDAsIHNpemVvZihtTGF5b3V0KSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtZW1zZXQobURhdGEsIDAsIHNpemVvZihtRGF0YSkpOworICAgICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KG1PZmZzZXREYXRhLCAwLCBzaXplb2YobURhdGEpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1FcnJvciA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtT2Zmc2V0RGF0YVtwbGFuZUl4XSA9CisgICAgICAgICAgICAgICAgICAgICAgICBtRGF0YVtwbGFuZUl4XSArIChzc2l6ZV90KWNyb3AubGVmdCAqIG1MYXlvdXQucGxhbmVzW3BsYW5lSXhdLmNvbEluYworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIChzc2l6ZV90KWNyb3AudG9wICogbUxheW91dC5wbGFuZXNbcGxhbmVJeF0ucm93SW5jOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGV4cGxpY2l0IE1hcHBlZChjMl9zdGF0dXNfdCBlcnJvcikKKyAgICAgICAgICAgIDogbUltcGwobnVsbHB0ciksIG1Xcml0YWJsZShmYWxzZSksIG1FcnJvcihlcnJvcikgeworICAgICAgICAgICAgLy8gQ0hFQ0soZXJyb3IgIT0gQzJfT0spOworICAgICAgICAgICAgbWVtc2V0KCZtTGF5b3V0LCAwLCBzaXplb2YobUxheW91dCkpOworICAgICAgICAgICAgbWVtc2V0KG1EYXRhLCAwLCBzaXplb2YobURhdGEpKTsKKyAgICAgICAgICAgIG1lbXNldChtT2Zmc2V0RGF0YSwgMCwgc2l6ZW9mKG1EYXRhKSk7CisgICAgICAgIH0KKworICAgIHB1YmxpYzoKKyAgICAgICAgfk1hcHBlZCgpIHsKKyAgICAgICAgICAgIGlmIChtRGF0YVswXSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgbUltcGwtPmdldEFsbG9jYXRpb24oKS0+dW5tYXAobURhdGEsIG1JbXBsLT5jcm9wKCksIG51bGxwdHIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqIHJldHVybnMgbWFwcGluZyBzdGF0dXMgKi8KKyAgICAgICAgYzJfc3RhdHVzX3QgZXJyb3IoKSBjb25zdCB7IHJldHVybiBtRXJyb3I7IH0KKworICAgICAgICAvKiogcmV0dXJucyBkYXRhIHBvaW50ZXIgKi8KKyAgICAgICAgdWludDhfdCAqY29uc3QgKmRhdGEoKSBjb25zdCB7IHJldHVybiBtT2Zmc2V0RGF0YTsgfQorCisgICAgICAgIC8qKiByZXR1cm5zIHRoZSBwbGFuZSBsYXlvdXQgKi8KKyAgICAgICAgQzJQbGFuYXJMYXlvdXQgbGF5b3V0KCkgY29uc3QgeyByZXR1cm4gbUxheW91dDsgfQorCisgICAgICAgIC8qKiByZXR1cm5zIHdoZXRoZXIgdGhlIG1hcHBpbmcgaXMgd3JpdGFibGUgKi8KKyAgICAgICAgYm9vbCB3cml0YWJsZSgpIGNvbnN0IHsgcmV0dXJuIG1Xcml0YWJsZTsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPF9DMkJsb2NrMkRJbXBsPiBtSW1wbDsKKyAgICAgICAgYm9vbCBtV3JpdGFibGU7CisgICAgICAgIGMyX3N0YXR1c190IG1FcnJvcjsKKyAgICAgICAgdWludDhfdCAqbURhdGFbQzJQbGFuYXJMYXlvdXQ6Ok1BWF9OVU1fUExBTkVTXTsKKyAgICAgICAgdWludDhfdCAqbU9mZnNldERhdGFbQzJQbGFuYXJMYXlvdXQ6Ok1BWF9OVU1fUExBTkVTXTsKKyAgICAgICAgQzJQbGFuYXJMYXlvdXQgbUxheW91dDsKKyAgICB9OworCisgICAgLyoqCisgICAgICogTWFwcyB0aGUgYWxsb3R0ZWQgcmVnaW9uLgorICAgICAqCisgICAgICogSWYgYWxyZWFkeSBtYXBwZWQgYW5kIGl0IGlzIGN1cnJlbnRseSBpbiB1c2UsIHJldHVybnMgdGhlIGV4aXN0aW5nIG1hcHBpbmcuCisgICAgICogSWYgZmVuY2UgaXMgcHJvdmlkZWQsIGFuIGFjcXVpcmUgZmVuY2UgaXMgc3RvcmVkIHRoZXJlLgorICAgICAqLworICAgIHN0ZDo6c2hhcmVkX3B0cjxNYXBwZWQ+IG1hcChib29sIHdyaXRhYmxlLCBDMkZlbmNlICpmZW5jZSkgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTWFwcGVkTG9jayk7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxNYXBwZWQ+IGV4aXN0aW5nID0gbU1hcHBlZC5sb2NrKCk7CisgICAgICAgIGlmICghZXhpc3RpbmcpIHsKKyAgICAgICAgICAgIGV4aXN0aW5nID0gc3RkOjpzaGFyZWRfcHRyPE1hcHBlZD4obmV3IE1hcHBlZChzaGFyZWRfZnJvbV90aGlzKCksIHdyaXRhYmxlLCBmZW5jZSkpOworICAgICAgICAgICAgbU1hcHBlZCA9IGV4aXN0aW5nOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gaWYgd2UgbWFwcGVkIHRoZSByZWdpb24gcmVhZC1vbmx5LCB3ZSBjYW5ub3QgcmVtYXAgaXQgcmVhZC13cml0ZQorICAgICAgICAgICAgaWYgKHdyaXRhYmxlICYmICFleGlzdGluZy0+d3JpdGFibGUoKSkgeworICAgICAgICAgICAgICAgIGV4aXN0aW5nID0gc3RkOjpzaGFyZWRfcHRyPE1hcHBlZD4obmV3IE1hcHBlZChDMl9DQU5OT1RfRE8pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChmZW5jZSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgKmZlbmNlID0gQzJGZW5jZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBleGlzdGluZzsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgc3RkOjp3ZWFrX3B0cjxNYXBwZWQ+IG1NYXBwZWQ7CisgICAgc3RkOjptdXRleCBtTWFwcGVkTG9jazsKK307CisKK2NsYXNzIEMyX0hJREUgX0MyTWFwcGVkQmxvY2syREltcGwgOiBwdWJsaWMgX0MyQmxvY2syREltcGwgeworcHVibGljOgorICAgIF9DMk1hcHBlZEJsb2NrMkRJbXBsKGNvbnN0IF9DMkJsb2NrMkRJbXBsICZpbXBsLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxfQzJNYXBwaW5nQmxvY2syREltcGw6Ok1hcHBlZD4gbWFwcGluZykKKyAgICAgICAgOiBfQzJCbG9jazJESW1wbChpbXBsKSwgbU1hcHBpbmcobWFwcGluZykgeworICAgIH0KKworICAgIHZpcnR1YWwgfl9DMk1hcHBlZEJsb2NrMkRJbXBsKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICAgc3RkOjpzaGFyZWRfcHRyPF9DMk1hcHBpbmdCbG9jazJESW1wbDo6TWFwcGVkPiBtYXBwaW5nKCkgY29uc3QgeyByZXR1cm4gbU1hcHBpbmc7IH0KKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8X0MyTWFwcGluZ0Jsb2NrMkRJbXBsOjpNYXBwZWQ+IG1NYXBwaW5nOworfTsKKworLyoqCisgKiBCbG9jayBpbXBsZW1lbnRhdGlvbi4KKyAqLworY2xhc3MgQzJCbG9jazJEOjpJbXBsIDogcHVibGljIF9DMk1hcHBpbmdCbG9jazJESW1wbCB7CitwdWJsaWM6CisgICAgdXNpbmcgX0MyTWFwcGluZ0Jsb2NrMkRJbXBsOjpfQzJNYXBwaW5nQmxvY2syREltcGw7CisgICAgdmlydHVhbCB+SW1wbCgpIG92ZXJyaWRlID0gZGVmYXVsdDsKK307CisKK2NvbnN0IEMySGFuZGxlICpDMkJsb2NrMkQ6OmhhbmRsZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwtPmhhbmRsZSgpOworfQorCitDMkFsbG9jYXRvcjo6aWRfdCBDMkJsb2NrMkQ6OmdldEFsbG9jYXRvcklkKCkgY29uc3QgeworICAgIHJldHVybiBtSW1wbC0+Z2V0QWxsb2NhdG9ySWQoKTsKK30KKworQzJCbG9jazJEOjpDMkJsb2NrMkQoc3RkOjpzaGFyZWRfcHRyPEltcGw+IGltcGwsIGNvbnN0IF9DMlBsYW5hclNlY3Rpb25Bc3BlY3QgJnNlY3Rpb24pCisgICAgLy8gYWx3YXlzIGNsYW1wIHN1YnNlY3Rpb24gdG8gcGFyZW50IChpbXBsKSBjcm9wIGZvciBzYWZldHkKKyAgICA6IF9DMlBsYW5hclNlY3Rpb25Bc3BlY3QoaW1wbC5nZXQoKSwgc2VjdGlvbi5jcm9wKCkpLCBtSW1wbChpbXBsKSB7Cit9CisKKy8qKgorICogR3JhcGhpYyB2aWV3IGltcGxlbWVudGF0aW9uLgorICoKKyAqIHJhbmdlIG9mIEltcGwgaXMgdGhlIG1hcHBlZCByYW5nZSBvZiB0aGUgdW5kZXJseWluZyBhbGxvY2F0aW9uLiByYW5nZSBvZiBWaWV3IGlzIHRoZSBjdXJyZW50CisgKiBjcm9wLgorICovCitjbGFzcyBDMkdyYXBoaWNWaWV3OjpJbXBsIDogcHVibGljIF9DMk1hcHBlZEJsb2NrMkRJbXBsIHsKK3B1YmxpYzoKKyAgICB1c2luZyBfQzJNYXBwZWRCbG9jazJESW1wbDo6X0MyTWFwcGVkQmxvY2syREltcGw7CisgICAgdmlydHVhbCB+SW1wbCgpIG92ZXJyaWRlID0gZGVmYXVsdDsKK307CisKK0MyR3JhcGhpY1ZpZXc6OkMyR3JhcGhpY1ZpZXcoc3RkOjpzaGFyZWRfcHRyPEltcGw+IGltcGwsIGNvbnN0IF9DMlBsYW5hclNlY3Rpb25Bc3BlY3QgJnNlY3Rpb24pCisgICAgOiBfQzJFZGl0YWJsZVBsYW5hclNlY3Rpb25Bc3BlY3QoaW1wbC5nZXQoKSwgc2VjdGlvbi5jcm9wKCkpLCBtSW1wbChpbXBsKSB7Cit9CisKK2NvbnN0IHVpbnQ4X3QgKmNvbnN0ICpDMkdyYXBoaWNWaWV3OjpkYXRhKCkgY29uc3QgeworICAgIHJldHVybiBtSW1wbC0+bWFwcGluZygpLT5kYXRhKCk7Cit9CisKK3VpbnQ4X3QgKmNvbnN0ICpDMkdyYXBoaWNWaWV3OjpkYXRhKCkgeworICAgIHJldHVybiBtSW1wbC0+bWFwcGluZygpLT5kYXRhKCk7Cit9CisKK2NvbnN0IEMyUGxhbmFyTGF5b3V0IEMyR3JhcGhpY1ZpZXc6OmxheW91dCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwtPm1hcHBpbmcoKS0+bGF5b3V0KCk7Cit9CisKK2NvbnN0IEMyR3JhcGhpY1ZpZXcgQzJHcmFwaGljVmlldzo6c3ViVmlldyhjb25zdCBDMlJlY3QgJnJlY3QpIGNvbnN0IHsKKyAgICByZXR1cm4gQzJHcmFwaGljVmlldyhtSW1wbCwgQzJQbGFuYXJTZWN0aW9uKCptSW1wbCwgcmVjdCkpOworfQorCitDMkdyYXBoaWNWaWV3IEMyR3JhcGhpY1ZpZXc6OnN1YlZpZXcoY29uc3QgQzJSZWN0ICZyZWN0KSB7CisgICAgcmV0dXJuIEMyR3JhcGhpY1ZpZXcobUltcGwsIEMyUGxhbmFyU2VjdGlvbigqbUltcGwsIHJlY3QpKTsKK30KKworYzJfc3RhdHVzX3QgQzJHcmFwaGljVmlldzo6ZXJyb3IoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbXBsLT5tYXBwaW5nKCktPmVycm9yKCk7Cit9CisKKy8qKgorICogQ29uc3QgZ3JhcGhpYyBibG9jayBpbXBsZW1lbnRhdGlvbi4KKyAqLworQzJDb25zdEdyYXBoaWNCbG9jazo6QzJDb25zdEdyYXBoaWNCbG9jaygKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEltcGw+IGltcGwsIGNvbnN0IF9DMlBsYW5hclNlY3Rpb25Bc3BlY3QgJnNlY3Rpb24sIEMyRmVuY2UgZmVuY2UpCisgICAgOiBDMkJsb2NrMkQoaW1wbCwgc2VjdGlvbiksIG1GZW5jZShmZW5jZSkgeyB9CisKK0MyQWNxdWlyYWJsZTxjb25zdCBDMkdyYXBoaWNWaWV3PiBDMkNvbnN0R3JhcGhpY0Jsb2NrOjptYXAoKSBjb25zdCB7CisgICAgQzJGZW5jZSBmZW5jZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8X0MyTWFwcGluZ0Jsb2NrMkRJbXBsOjpNYXBwZWQ+IG1hcHBpbmcgPQorICAgICAgICBtSW1wbC0+bWFwKGZhbHNlIC8qIHdyaXRhYmxlICovLCAmZmVuY2UpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxHcmFwaGljVmlld0J1ZGR5OjpJbXBsPiBndmkgPQorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8R3JhcGhpY1ZpZXdCdWRkeTo6SW1wbD4obmV3IEdyYXBoaWNWaWV3QnVkZHk6OkltcGwoKm1JbXBsLCBtYXBwaW5nKSk7CisgICAgcmV0dXJuIEFjcXVpcmFibGVDb25zdEdyYXBoaWNWaWV3QnVkZHkoCisgICAgICAgICAgICBtYXBwaW5nLT5lcnJvcigpLCBmZW5jZSwgR3JhcGhpY1ZpZXdCdWRkeShndmksIEMyUGxhbmFyU2VjdGlvbigqbUltcGwsIGNyb3AoKSkpKTsKK30KKworQzJDb25zdEdyYXBoaWNCbG9jayBDMkNvbnN0R3JhcGhpY0Jsb2NrOjpzdWJCbG9jayhjb25zdCBDMlJlY3QgJnJlY3QpIGNvbnN0IHsKKyAgICByZXR1cm4gQzJDb25zdEdyYXBoaWNCbG9jayhtSW1wbCwgQzJQbGFuYXJTZWN0aW9uKCptSW1wbCwgY3JvcCgpLmludGVyc2VjdChyZWN0KSksIG1GZW5jZSk7Cit9CisKKy8qKgorICogR3JhcGhpYyBibG9jayBpbXBsZW1lbnRhdGlvbi4KKyAqLworQzJHcmFwaGljQmxvY2s6OkMyR3JhcGhpY0Jsb2NrKAorICAgIHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBpbXBsLCBjb25zdCBfQzJQbGFuYXJTZWN0aW9uQXNwZWN0ICZzZWN0aW9uKQorICAgIDogQzJCbG9jazJEKGltcGwsIHNlY3Rpb24pIHsgfQorCitDMkFjcXVpcmFibGU8QzJHcmFwaGljVmlldz4gQzJHcmFwaGljQmxvY2s6Om1hcCgpIHsKKyAgICBDMkZlbmNlIGZlbmNlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxfQzJNYXBwaW5nQmxvY2syREltcGw6Ok1hcHBlZD4gbWFwcGluZyA9CisgICAgICAgIG1JbXBsLT5tYXAodHJ1ZSAvKiB3cml0YWJsZSAqLywgJmZlbmNlKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8R3JhcGhpY1ZpZXdCdWRkeTo6SW1wbD4gZ3ZpID0KKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEdyYXBoaWNWaWV3QnVkZHk6OkltcGw+KG5ldyBHcmFwaGljVmlld0J1ZGR5OjpJbXBsKCptSW1wbCwgbWFwcGluZykpOworICAgIHJldHVybiBBY3F1aXJhYmxlR3JhcGhpY1ZpZXdCdWRkeSgKKyAgICAgICAgICAgIG1hcHBpbmctPmVycm9yKCksIGZlbmNlLCBHcmFwaGljVmlld0J1ZGR5KGd2aSwgQzJQbGFuYXJTZWN0aW9uKCptSW1wbCwgY3JvcCgpKSkpOworfQorCitDMkNvbnN0R3JhcGhpY0Jsb2NrIEMyR3JhcGhpY0Jsb2NrOjpzaGFyZShjb25zdCBDMlJlY3QgJmNyb3AsIEMyRmVuY2UgZmVuY2UpIHsKKyAgICByZXR1cm4gQ29uc3RHcmFwaGljQmxvY2tCdWRkeShtSW1wbCwgQzJQbGFuYXJTZWN0aW9uKCptSW1wbCwgY3JvcCksIGZlbmNlKTsKK30KKworLyoqCisgKiBCYXNpYyBibG9jayBwb29sIGltcGxlbWVudGF0aW9ucy4KKyAqLworQzJCYXNpY0dyYXBoaWNCbG9ja1Bvb2w6OkMyQmFzaWNHcmFwaGljQmxvY2tQb29sKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+ICZhbGxvY2F0b3IpCisgIDogbUFsbG9jYXRvcihhbGxvY2F0b3IpIHt9CisKK2MyX3N0YXR1c190IEMyQmFzaWNHcmFwaGljQmxvY2tQb29sOjpmZXRjaEdyYXBoaWNCbG9jaygKKyAgICAgICAgdWludDMyX3Qgd2lkdGgsCisgICAgICAgIHVpbnQzMl90IGhlaWdodCwKKyAgICAgICAgdWludDMyX3QgZm9ybWF0LAorICAgICAgICBDMk1lbW9yeVVzYWdlIHVzYWdlLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+ICpibG9jayAvKiBub25udWxsICovKSB7CisgICAgYmxvY2stPnJlc2V0KCk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQWxsb2NhdGlvbj4gYWxsb2M7CisgICAgYzJfc3RhdHVzX3QgZXJyID0gbUFsbG9jYXRvci0+bmV3R3JhcGhpY0FsbG9jYXRpb24od2lkdGgsIGhlaWdodCwgZm9ybWF0LCB1c2FnZSwgJmFsbG9jKTsKKyAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgKmJsb2NrID0gX0MyQmxvY2tGYWN0b3J5OjpDcmVhdGVHcmFwaGljQmxvY2soYWxsb2MpOworCisgICAgcmV0dXJuIEMyX09LOworfQorCitzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+IF9DMkJsb2NrRmFjdG9yeTo6Q3JlYXRlR3JhcGhpY0Jsb2NrKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQWxsb2NhdGlvbj4gJmFsbG9jLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8X0MyQmxvY2tQb29sRGF0YT4gJmRhdGEsIGNvbnN0IEMyUmVjdCAmYWxsb3R0ZWRDcm9wKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2syRDo6SW1wbD4gaW1wbCA9CisgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJCbG9jazJEOjpJbXBsPihhbGxvYywgZGF0YSwgYWxsb3R0ZWRDcm9wKTsKKyAgICByZXR1cm4gc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPihuZXcgQzJHcmFwaGljQmxvY2soaW1wbCwgKmltcGwpKTsKK30KKworc3RkOjpzaGFyZWRfcHRyPF9DMkJsb2NrUG9vbERhdGE+IF9DMkJsb2NrRmFjdG9yeTo6R2V0R3JhcGhpY0Jsb2NrUG9vbERhdGEoCisgICAgICAgIGNvbnN0IEMyQmxvY2syRCAmYmxvY2spIHsKKyAgICBpZiAoYmxvY2subUltcGwpIHsKKyAgICAgICAgcmV0dXJuIGJsb2NrLm1JbXBsLT5wb29sRGF0YSgpOworICAgIH0KKyAgICByZXR1cm4gbnVsbHB0cjsKK30KKworc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiBfQzJCbG9ja0ZhY3Rvcnk6OkNyZWF0ZUdyYXBoaWNCbG9jaygKKyAgICAgICAgY29uc3QgQzJIYW5kbGUgKmNIYW5kbGUsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gJmRhdGEpIHsKKyAgICAvLyBUT0RPOiBnZXQgcHJvcGVyIGFsbG9jYXRvcj8gYW5kIG11dGV4PworICAgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8QzJBbGxvY2F0b3JHcmFsbG9jPiBzQWxsb2NhdG9yID0gc3RkOjptYWtlX3VuaXF1ZTxDMkFsbG9jYXRvckdyYWxsb2M+KDApOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0FsbG9jYXRpb24+IGFsbG9jOworICAgIGlmIChDMkFsbG9jYXRvckdyYWxsb2M6OmlzVmFsaWQoY0hhbmRsZSkpIHsKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90ICpoYW5kbGUgPSBuYXRpdmVfaGFuZGxlX2Nsb25lKGNIYW5kbGUpOworICAgICAgICBpZiAoaGFuZGxlKSB7CisgICAgICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBzQWxsb2NhdG9yLT5wcmlvckdyYXBoaWNBbGxvY2F0aW9uKGhhbmRsZSwgJmFsbG9jKTsKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlBvb2xlZEJsb2NrUG9vbERhdGE+IHBvb2xEYXRhID0KKyAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlBvb2xlZEJsb2NrUG9vbERhdGE+KGRhdGEpOworICAgICAgICAgICAgaWYgKGVyciA9PSBDMl9PSyAmJiBwb29sRGF0YSkgeworICAgICAgICAgICAgICAgIC8vIFRPRE86IGNvbmZpZyBzZXR1cD8KKyAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+IGJsb2NrID0KKyAgICAgICAgICAgICAgICAgICAgICAgIF9DMkJsb2NrRmFjdG9yeTo6Q3JlYXRlR3JhcGhpY0Jsb2NrKGFsbG9jLCBwb29sRGF0YSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGJsb2NrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBudWxscHRyOworfTsKKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gQlVGRkVSID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKK2NsYXNzIEMyQnVmZmVyRGF0YTo6SW1wbCB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgSW1wbChjb25zdCBzdGQ6OnZlY3RvcjxDMkNvbnN0TGluZWFyQmxvY2s+ICZibG9ja3MpCisgICAgICAgIDogbVR5cGUoYmxvY2tzLnNpemUoKSA9PSAxID8gTElORUFSIDogTElORUFSX0NIVU5LUyksCisgICAgICAgICAgbUxpbmVhckJsb2NrcyhibG9ja3MpIHsKKyAgICB9CisKKyAgICBleHBsaWNpdCBJbXBsKGNvbnN0IHN0ZDo6dmVjdG9yPEMyQ29uc3RHcmFwaGljQmxvY2s+ICZibG9ja3MpCisgICAgICAgIDogbVR5cGUoYmxvY2tzLnNpemUoKSA9PSAxID8gR1JBUEhJQyA6IEdSQVBISUNfQ0hVTktTKSwKKyAgICAgICAgICBtR3JhcGhpY0Jsb2NrcyhibG9ja3MpIHsKKyAgICB9CisKKyAgICB0eXBlX3QgdHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1UeXBlOyB9CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJDb25zdExpbmVhckJsb2NrPiAmbGluZWFyQmxvY2tzKCkgY29uc3QgeyByZXR1cm4gbUxpbmVhckJsb2NrczsgfQorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyQ29uc3RHcmFwaGljQmxvY2s+ICZncmFwaGljQmxvY2tzKCkgY29uc3QgeyByZXR1cm4gbUdyYXBoaWNCbG9ja3M7IH0KKworcHJpdmF0ZToKKyAgICB0eXBlX3QgbVR5cGU7CisgICAgc3RkOjp2ZWN0b3I8QzJDb25zdExpbmVhckJsb2NrPiBtTGluZWFyQmxvY2tzOworICAgIHN0ZDo6dmVjdG9yPEMyQ29uc3RHcmFwaGljQmxvY2s+IG1HcmFwaGljQmxvY2tzOworfTsKKworQzJCdWZmZXJEYXRhOjpDMkJ1ZmZlckRhdGEoY29uc3Qgc3RkOjp2ZWN0b3I8QzJDb25zdExpbmVhckJsb2NrPiAmYmxvY2tzKSA6IG1JbXBsKG5ldyBJbXBsKGJsb2NrcykpIHt9CitDMkJ1ZmZlckRhdGE6OkMyQnVmZmVyRGF0YShjb25zdCBzdGQ6OnZlY3RvcjxDMkNvbnN0R3JhcGhpY0Jsb2NrPiAmYmxvY2tzKSA6IG1JbXBsKG5ldyBJbXBsKGJsb2NrcykpIHt9CisKK0MyQnVmZmVyRGF0YTo6dHlwZV90IEMyQnVmZmVyRGF0YTo6dHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1JbXBsLT50eXBlKCk7IH0KKworY29uc3Qgc3RkOjp2ZWN0b3I8QzJDb25zdExpbmVhckJsb2NrPiBDMkJ1ZmZlckRhdGE6OmxpbmVhckJsb2NrcygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwtPmxpbmVhckJsb2NrcygpOworfQorCitjb25zdCBzdGQ6OnZlY3RvcjxDMkNvbnN0R3JhcGhpY0Jsb2NrPiBDMkJ1ZmZlckRhdGE6OmdyYXBoaWNCbG9ja3MoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbXBsLT5ncmFwaGljQmxvY2tzKCk7Cit9CisKK2NsYXNzIEMyQnVmZmVyOjpJbXBsIHsKK3B1YmxpYzoKKyAgICBJbXBsKEMyQnVmZmVyICp0aGl6LCBjb25zdCBzdGQ6OnZlY3RvcjxDMkNvbnN0TGluZWFyQmxvY2s+ICZibG9ja3MpCisgICAgICAgIDogbVRoaXModGhpeiksIG1EYXRhKGJsb2Nrcykge30KKyAgICBJbXBsKEMyQnVmZmVyICp0aGl6LCBjb25zdCBzdGQ6OnZlY3RvcjxDMkNvbnN0R3JhcGhpY0Jsb2NrPiAmYmxvY2tzKQorICAgICAgICA6IG1UaGlzKHRoaXopLCBtRGF0YShibG9ja3MpIHt9CisKKyAgICB+SW1wbCgpIHsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZwYWlyIDogbU5vdGlmeSkgeworICAgICAgICAgICAgcGFpci5maXJzdChtVGhpcywgcGFpci5zZWNvbmQpOworICAgICAgICB9CisgICAgfQorCisgICAgY29uc3QgQzJCdWZmZXJEYXRhICZkYXRhKCkgY29uc3QgeyByZXR1cm4gbURhdGE7IH0KKworICAgIGMyX3N0YXR1c190IHJlZ2lzdGVyT25EZXN0cm95Tm90aWZ5KE9uRGVzdHJveU5vdGlmeSBvbkRlc3Ryb3lOb3RpZnksIHZvaWQgKmFyZykgeworICAgICAgICBhdXRvIGl0ID0gc3RkOjpmaW5kX2lmKAorICAgICAgICAgICAgICAgIG1Ob3RpZnkuYmVnaW4oKSwgbU5vdGlmeS5lbmQoKSwKKyAgICAgICAgICAgICAgICBbb25EZXN0cm95Tm90aWZ5LCBhcmddIChjb25zdCBhdXRvICZwYWlyKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBwYWlyLmZpcnN0ID09IG9uRGVzdHJveU5vdGlmeSAmJiBwYWlyLnNlY29uZCA9PSBhcmc7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIGlmIChpdCAhPSBtTm90aWZ5LmVuZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gQzJfRFVQTElDQVRFOworICAgICAgICB9CisgICAgICAgIG1Ob3RpZnkuZW1wbGFjZV9iYWNrKG9uRGVzdHJveU5vdGlmeSwgYXJnKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIGMyX3N0YXR1c190IHVucmVnaXN0ZXJPbkRlc3Ryb3lOb3RpZnkoT25EZXN0cm95Tm90aWZ5IG9uRGVzdHJveU5vdGlmeSwgdm9pZCAqYXJnKSB7CisgICAgICAgIGF1dG8gaXQgPSBzdGQ6OmZpbmRfaWYoCisgICAgICAgICAgICAgICAgbU5vdGlmeS5iZWdpbigpLCBtTm90aWZ5LmVuZCgpLAorICAgICAgICAgICAgICAgIFtvbkRlc3Ryb3lOb3RpZnksIGFyZ10gKGNvbnN0IGF1dG8gJnBhaXIpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhaXIuZmlyc3QgPT0gb25EZXN0cm95Tm90aWZ5ICYmIHBhaXIuc2Vjb25kID09IGFyZzsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgaWYgKGl0ID09IG1Ob3RpZnkuZW5kKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBDMl9OT1RfRk9VTkQ7CisgICAgICAgIH0KKyAgICAgICAgbU5vdGlmeS5lcmFzZShpdCk7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJJbmZvPj4gaW5mbygpIGNvbnN0IHsKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMySW5mbz4+IHJlc3VsdChtSW5mb3Muc2l6ZSgpKTsKKyAgICAgICAgc3RkOjp0cmFuc2Zvcm0oCisgICAgICAgICAgICAgICAgbUluZm9zLmJlZ2luKCksIG1JbmZvcy5lbmQoKSwgcmVzdWx0LmJlZ2luKCksCisgICAgICAgICAgICAgICAgW10gKGNvbnN0IGF1dG8gJmVsZW0pIHsgcmV0dXJuIGVsZW0uc2Vjb25kOyB9KTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBjMl9zdGF0dXNfdCBzZXRJbmZvKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkluZm8+ICZpbmZvKSB7CisgICAgICAgIC8vIFRvICJ1cGRhdGUiIHlvdSBuZWVkIHRvIGVyYXNlIHRoZSBleGlzdGluZyBvbmUgaWYgYW55LCBhbmQgdGhlbiBpbnNlcnQuCisgICAgICAgICh2b2lkKSBtSW5mb3MuZXJhc2UoaW5mby0+Y29yZUluZGV4KCkpOworICAgICAgICAodm9pZCkgbUluZm9zLmluc2VydCh7IGluZm8tPmNvcmVJbmRleCgpLCBpbmZvIH0pOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgYm9vbCBoYXNJbmZvKEMyUGFyYW06OlR5cGUgaW5kZXgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1JbmZvcy5jb3VudChpbmRleC5jb3JlSW5kZXgoKSkgPiAwOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkluZm8+IGdldEluZm8oQzJQYXJhbTo6VHlwZSBpbmRleCkgY29uc3QgeworICAgICAgICBhdXRvIGl0ID0gbUluZm9zLmZpbmQoaW5kZXguY29yZUluZGV4KCkpOworICAgICAgICBpZiAoaXQgPT0gbUluZm9zLmVuZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RkOjpjb25zdF9wb2ludGVyX2Nhc3Q8Y29uc3QgQzJJbmZvPihpdC0+c2Vjb25kKTsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJJbmZvPiByZW1vdmVJbmZvKEMyUGFyYW06OlR5cGUgaW5kZXgpIHsKKyAgICAgICAgYXV0byBpdCA9IG1JbmZvcy5maW5kKGluZGV4LmNvcmVJbmRleCgpKTsKKyAgICAgICAgaWYgKGl0ID09IG1JbmZvcy5lbmQoKSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMySW5mbz4gcmV0ID0gaXQtPnNlY29uZDsKKyAgICAgICAgKHZvaWQpIG1JbmZvcy5lcmFzZShpdCk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCitwcml2YXRlOgorICAgIEMyQnVmZmVyICogY29uc3QgbVRoaXM7CisgICAgQnVmZmVyRGF0YUJ1ZGR5IG1EYXRhOworICAgIHN0ZDo6bWFwPEMyUGFyYW06OkNvcmVJbmRleCwgc3RkOjpzaGFyZWRfcHRyPEMySW5mbz4+IG1JbmZvczsKKyAgICBzdGQ6Omxpc3Q8c3RkOjpwYWlyPE9uRGVzdHJveU5vdGlmeSwgdm9pZCAqPj4gbU5vdGlmeTsKK307CisKK0MyQnVmZmVyOjpDMkJ1ZmZlcihjb25zdCBzdGQ6OnZlY3RvcjxDMkNvbnN0TGluZWFyQmxvY2s+ICZibG9ja3MpCisgICAgOiBtSW1wbChuZXcgSW1wbCh0aGlzLCBibG9ja3MpKSB7fQorCitDMkJ1ZmZlcjo6QzJCdWZmZXIoY29uc3Qgc3RkOjp2ZWN0b3I8QzJDb25zdEdyYXBoaWNCbG9jaz4gJmJsb2NrcykKKyAgICA6IG1JbXBsKG5ldyBJbXBsKHRoaXMsIGJsb2NrcykpIHt9CisKK2NvbnN0IEMyQnVmZmVyRGF0YSBDMkJ1ZmZlcjo6ZGF0YSgpIGNvbnN0IHsgcmV0dXJuIG1JbXBsLT5kYXRhKCk7IH0KKworYzJfc3RhdHVzX3QgQzJCdWZmZXI6OnJlZ2lzdGVyT25EZXN0cm95Tm90aWZ5KE9uRGVzdHJveU5vdGlmeSBvbkRlc3Ryb3lOb3RpZnksIHZvaWQgKmFyZykgeworICAgIHJldHVybiBtSW1wbC0+cmVnaXN0ZXJPbkRlc3Ryb3lOb3RpZnkob25EZXN0cm95Tm90aWZ5LCBhcmcpOworfQorCitjMl9zdGF0dXNfdCBDMkJ1ZmZlcjo6dW5yZWdpc3Rlck9uRGVzdHJveU5vdGlmeShPbkRlc3Ryb3lOb3RpZnkgb25EZXN0cm95Tm90aWZ5LCB2b2lkICphcmcpIHsKKyAgICByZXR1cm4gbUltcGwtPnVucmVnaXN0ZXJPbkRlc3Ryb3lOb3RpZnkob25EZXN0cm95Tm90aWZ5LCBhcmcpOworfQorCitjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJJbmZvPj4gQzJCdWZmZXI6OmluZm8oKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbXBsLT5pbmZvKCk7Cit9CisKK2MyX3N0YXR1c190IEMyQnVmZmVyOjpzZXRJbmZvKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkluZm8+ICZpbmZvKSB7CisgICAgcmV0dXJuIG1JbXBsLT5zZXRJbmZvKGluZm8pOworfQorCitib29sIEMyQnVmZmVyOjpoYXNJbmZvKEMyUGFyYW06OlR5cGUgaW5kZXgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwtPmhhc0luZm8oaW5kZXgpOworfQorCitzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJJbmZvPiBDMkJ1ZmZlcjo6Z2V0SW5mbyhDMlBhcmFtOjpUeXBlIGluZGV4KSBjb25zdCB7CisgICAgcmV0dXJuIG1JbXBsLT5nZXRJbmZvKGluZGV4KTsKK30KKworc3RkOjpzaGFyZWRfcHRyPEMySW5mbz4gQzJCdWZmZXI6OnJlbW92ZUluZm8oQzJQYXJhbTo6VHlwZSBpbmRleCkgeworICAgIHJldHVybiBtSW1wbC0+cmVtb3ZlSW5mbyhpbmRleCk7Cit9CisKKy8vIHN0YXRpYworc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBDMkJ1ZmZlcjo6Q3JlYXRlTGluZWFyQnVmZmVyKGNvbnN0IEMyQ29uc3RMaW5lYXJCbG9jayAmYmxvY2spIHsKKyAgICByZXR1cm4gc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPihuZXcgQzJCdWZmZXIoeyBibG9jayB9KSk7Cit9CisKKy8vIHN0YXRpYworc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBDMkJ1ZmZlcjo6Q3JlYXRlR3JhcGhpY0J1ZmZlcihjb25zdCBDMkNvbnN0R3JhcGhpY0Jsb2NrICZibG9jaykgeworICAgIHJldHVybiBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+KG5ldyBDMkJ1ZmZlcih7IGJsb2NrIH0pKTsKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvQzJDb25maWcuY3BwIGIvbWVkaWEvY29kZWMyL3ZuZGsvQzJDb25maWcuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhMTI5MDMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay9DMkNvbmZpZy5jcHAKQEAgLTAsMCArMSwyMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyQ29uZmlnIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisvKioKKyAqIERlZmluZSBhbmQgaW5pdGlhbGl6ZSBnbG9iYWwgY29uZmlnIGZpZWxkIGRlc2NyaXB0b3JzIGluIHRoaXMgY3BwIGZpbGUKKyAqLworI2RlZmluZSBfX0MyX0dFTkVSQVRFX0dMT0JBTF9WQVJTX18KKyNpbmNsdWRlIDxDMkNvbmZpZy5oPgorCitERUZJTkVfQzJfRU5VTV9WQUxVRV9DVVNUT01fSEVMUEVSKEMyQ29uZmlnOjpwcm9maWxlX3QsICh7CisgICAgICAgIHsgInVudXNlZCIsIEMyQ29uZmlnOjpQUk9GSUxFX1VOVVNFRCB9LAorICAgICAgICB7ICJhYWMtbGMiLCBDMkNvbmZpZzo6UFJPRklMRV9BQUNfTEMgfSwKKyAgICAgICAgeyAiYWFjLW1haW4iLCBDMkNvbmZpZzo6UFJPRklMRV9BQUNfTUFJTiB9LAorICAgICAgICB7ICJhYWMtc3NyIiwgQzJDb25maWc6OlBST0ZJTEVfQUFDX1NTUiB9LAorICAgICAgICB7ICJhYWMtbHRwIiwgQzJDb25maWc6OlBST0ZJTEVfQUFDX0xUUCB9LAorICAgICAgICB7ICJhYWMtaGUiLCBDMkNvbmZpZzo6UFJPRklMRV9BQUNfSEUgfSwKKyAgICAgICAgeyAiYWFjLXNjYWxhYmxlIiwgQzJDb25maWc6OlBST0ZJTEVfQUFDX1NDQUxBQkxFIH0sCisgICAgICAgIHsgImFhYy1lci1sYyIsIEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19FUl9MQyB9LAorICAgICAgICB7ICJhYWMtZXItc2NhbGFibGUiLCBDMkNvbmZpZzo6UFJPRklMRV9BQUNfRVJfU0NBTEFCTEUgfSwKKyAgICAgICAgeyAiYWFjLWxkIiwgQzJDb25maWc6OlBST0ZJTEVfQUFDX0xEIH0sCisgICAgICAgIHsgImFhYy1oZS1wcyIsIEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19IRV9QUyB9LAorICAgICAgICB7ICJhYWMtZWxkIiwgQzJDb25maWc6OlBST0ZJTEVfQUFDX0VMRCB9LAorICAgICAgICB7ICJhYWMteGhlIiwgQzJDb25maWc6OlBST0ZJTEVfQUFDX1hIRSB9LAorICAgICAgICB7ICJtcDJ2LXNpbXBsZSIsIEMyQ29uZmlnOjpQUk9GSUxFX01QMlZfU0lNUExFIH0sCisgICAgICAgIHsgIm1wMnYtbWFpbiIsIEMyQ29uZmlnOjpQUk9GSUxFX01QMlZfTUFJTiB9LAorICAgICAgICB7ICJtcDJ2LXNuci1zY2FsYWJsZSIsIEMyQ29uZmlnOjpQUk9GSUxFX01QMlZfU05SX1NDQUxBQkxFIH0sCisgICAgICAgIHsgIm1wMnYtc3BhdGlhbGx5LXNjYWxhYmxlIiwgQzJDb25maWc6OlBST0ZJTEVfTVAyVl9TUEFUSUFMTFlfU0NBTEFCTEUgfSwKKyAgICAgICAgeyAibXAydi1oaWdoIiwgQzJDb25maWc6OlBST0ZJTEVfTVAyVl9ISUdIIH0sCisgICAgICAgIHsgIm1wMnYtNDIyIiwgQzJDb25maWc6OlBST0ZJTEVfTVAyVl80MjIgfSwKKyAgICAgICAgeyAibXAydi1tdWx0aXZpZXciLCBDMkNvbmZpZzo6UFJPRklMRV9NUDJWX01VTFRJVklFVyB9LAorICAgICAgICB7ICJoMjYzLWJhc2VsaW5lIiwgQzJDb25maWc6OlBST0ZJTEVfSDI2M19CQVNFTElORSB9LAorICAgICAgICB7ICJoMjYzLWgzMjAiLCBDMkNvbmZpZzo6UFJPRklMRV9IMjYzX0gzMjAgfSwKKyAgICAgICAgeyAiaDI2My12MWJjIiwgQzJDb25maWc6OlBST0ZJTEVfSDI2M19WMUJDIH0sCisgICAgICAgIHsgImgyNjMtaXN3djIiLCBDMkNvbmZpZzo6UFJPRklMRV9IMjYzX0lTV1YyIH0sCisgICAgICAgIHsgImgyNjMtaXN3djMiLCBDMkNvbmZpZzo6UFJPRklMRV9IMjYzX0lTV1YzIH0sCisgICAgICAgIHsgImgyNjMtaGlnaC1jb21wcmVzc2lvbiIsIEMyQ29uZmlnOjpQUk9GSUxFX0gyNjNfSElHSF9DT01QUkVTU0lPTiB9LAorICAgICAgICB7ICJoMjYzLWludGVybmV0IiwgQzJDb25maWc6OlBST0ZJTEVfSDI2M19JTlRFUk5FVCB9LAorICAgICAgICB7ICJoMjYzLWludGVybGFjZSIsIEMyQ29uZmlnOjpQUk9GSUxFX0gyNjNfSU5URVJMQUNFIH0sCisgICAgICAgIHsgImgyNjMtaGlnaC1sYXRlbmN5IiwgQzJDb25maWc6OlBST0ZJTEVfSDI2M19ISUdIX0xBVEVOQ1kgfSwKKyAgICAgICAgeyAibXA0di1zaW1wbGUiLCBDMkNvbmZpZzo6UFJPRklMRV9NUDRWX1NJTVBMRSB9LAorICAgICAgICB7ICJtcDR2LXNpbXBsZS1zY2FsYWJsZSIsIEMyQ29uZmlnOjpQUk9GSUxFX01QNFZfU0lNUExFX1NDQUxBQkxFIH0sCisgICAgICAgIHsgIm1wNHYtY29yZSIsIEMyQ29uZmlnOjpQUk9GSUxFX01QNFZfQ09SRSB9LAorICAgICAgICB7ICJtcDR2LW1haW4iLCBDMkNvbmZpZzo6UFJPRklMRV9NUDRWX01BSU4gfSwKKyAgICAgICAgeyAibXA0di1uYml0IiwgQzJDb25maWc6OlBST0ZJTEVfTVA0Vl9OQklUIH0sCisgICAgICAgIHsgIm1wNHYtYXJ0cyIsIEMyQ29uZmlnOjpQUk9GSUxFX01QNFZfQVJUUyB9LAorICAgICAgICB7ICJtcDR2LWNvcmUtc2NhbGFibGUiLCBDMkNvbmZpZzo6UFJPRklMRV9NUDRWX0NPUkVfU0NBTEFCTEUgfSwKKyAgICAgICAgeyAibXA0di1hY2UiLCBDMkNvbmZpZzo6UFJPRklMRV9NUDRWX0FDRSB9LAorICAgICAgICB7ICJtcDR2LWFkdmFuY2VkLWNvcmUiLCBDMkNvbmZpZzo6UFJPRklMRV9NUDRWX0FEVkFOQ0VEX0NPUkUgfSwKKyAgICAgICAgeyAibXA0di1zaW1wbGUtc3R1ZGlvIiwgQzJDb25maWc6OlBST0ZJTEVfTVA0Vl9TSU1QTEVfU1RVRElPIH0sCisgICAgICAgIHsgIm1wNHYtY29yZS1zdHVkaW8iLCBDMkNvbmZpZzo6UFJPRklMRV9NUDRWX0NPUkVfU1RVRElPIH0sCisgICAgICAgIHsgIm1wNHYtYWR2YW5jZWQtc2ltcGxlIiwgQzJDb25maWc6OlBST0ZJTEVfTVA0Vl9BRFZBTkNFRF9TSU1QTEUgfSwKKyAgICAgICAgeyAibXA0di1mZ3MiLCBDMkNvbmZpZzo6UFJPRklMRV9NUDRWX0ZHUyB9LAorICAgICAgICB7ICJhdmMtYmFzZWxpbmUiLCBDMkNvbmZpZzo6UFJPRklMRV9BVkNfQkFTRUxJTkUgfSwKKyAgICAgICAgeyAiYXZjLWNvbnN0cmFpbmVkLWJhc2VsaW5lIiwgQzJDb25maWc6OlBST0ZJTEVfQVZDX0NPTlNUUkFJTkVEX0JBU0VMSU5FIH0sCisgICAgICAgIHsgImF2Yy1tYWluIiwgQzJDb25maWc6OlBST0ZJTEVfQVZDX01BSU4gfSwKKyAgICAgICAgeyAiYXZjLWV4dGVuZGVkIiwgQzJDb25maWc6OlBST0ZJTEVfQVZDX0VYVEVOREVEIH0sCisgICAgICAgIHsgImF2Yy1oaWdoIiwgQzJDb25maWc6OlBST0ZJTEVfQVZDX0hJR0ggfSwKKyAgICAgICAgeyAiYXZjLXByb2dyZXNzaXZlLWhpZ2giLCBDMkNvbmZpZzo6UFJPRklMRV9BVkNfUFJPR1JFU1NJVkVfSElHSCB9LAorICAgICAgICB7ICJhdmMtY29uc3RyYWluZWQtaGlnaCIsIEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19DT05TVFJBSU5FRF9ISUdIIH0sCisgICAgICAgIHsgImF2Yy1oaWdoLTEwIiwgQzJDb25maWc6OlBST0ZJTEVfQVZDX0hJR0hfMTAgfSwKKyAgICAgICAgeyAiYXZjLXByb2dyZXNzaXZlLWhpZ2gtMTAiLCBDMkNvbmZpZzo6UFJPRklMRV9BVkNfUFJPR1JFU1NJVkVfSElHSF8xMCB9LAorICAgICAgICB7ICJhdmMtaGlnaC00MjIiLCBDMkNvbmZpZzo6UFJPRklMRV9BVkNfSElHSF80MjIgfSwKKyAgICAgICAgeyAiYXZjLWhpZ2gtNDQ0LXByZWRpY3RpdmUiLCBDMkNvbmZpZzo6UFJPRklMRV9BVkNfSElHSF80NDRfUFJFRElDVElWRSB9LAorICAgICAgICB7ICJhdmMtaGlnaC0xMC1pbnRyYSIsIEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19ISUdIXzEwX0lOVFJBIH0sCisgICAgICAgIHsgImF2Yy1oaWdoLTQyMi1pbnRyYSIsIEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19ISUdIXzQyMl9JTlRSQSB9LAorICAgICAgICB7ICJhdmMtaGlnaC00NDQtaW50cmEiLCBDMkNvbmZpZzo6UFJPRklMRV9BVkNfSElHSF80NDRfSU5UUkEgfSwKKyAgICAgICAgeyAiYXZjLWNhdmxjLTQ0NC1pbnRyYSIsIEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19DQVZMQ180NDRfSU5UUkEgfSwKKyAgICAgICAgeyAiYXZjLXNjYWxhYmxlLWJhc2VsaW5lIiwgQzJDb25maWc6OlBST0ZJTEVfQVZDX1NDQUxBQkxFX0JBU0VMSU5FIH0sCisgICAgICAgIHsgImF2Yy1zY2FsYWJsZS1jb25zdHJhaW5lZC1iYXNlbGluZSIsIEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19TQ0FMQUJMRV9DT05TVFJBSU5FRF9CQVNFTElORSB9LAorICAgICAgICB7ICJhdmMtc2NhbGFibGUtaGlnaCIsIEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19TQ0FMQUJMRV9ISUdIIH0sCisgICAgICAgIHsgImF2Yy1zY2FsYWJsZS1jb25zdHJhaW5lZC1oaWdoIiwgQzJDb25maWc6OlBST0ZJTEVfQVZDX1NDQUxBQkxFX0NPTlNUUkFJTkVEX0hJR0ggfSwKKyAgICAgICAgeyAiYXZjLXNjYWxhYmxlLWhpZ2gtaW50cmEiLCBDMkNvbmZpZzo6UFJPRklMRV9BVkNfU0NBTEFCTEVfSElHSF9JTlRSQSB9LAorICAgICAgICB7ICJhdmMtbXVsdGl2aWV3LWhpZ2giLCBDMkNvbmZpZzo6UFJPRklMRV9BVkNfTVVMVElWSUVXX0hJR0ggfSwKKyAgICAgICAgeyAiYXZjLXN0ZXJlby1oaWdoIiwgQzJDb25maWc6OlBST0ZJTEVfQVZDX1NURVJFT19ISUdIIH0sCisgICAgICAgIHsgImF2Yy1tZmMtaGlnaCIsIEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19NRkNfSElHSCB9LAorICAgICAgICB7ICJhdmMtbXVsdGl2aWV3LWRlcHRoLWhpZ2giLCBDMkNvbmZpZzo6UFJPRklMRV9BVkNfTVVMVElWSUVXX0RFUFRIX0hJR0ggfSwKKyAgICAgICAgeyAiYXZjLW1mYy1kZXB0aC1oaWdoIiwgQzJDb25maWc6OlBST0ZJTEVfQVZDX01GQ19ERVBUSF9ISUdIIH0sCisgICAgICAgIHsgImF2Yy1lbmhhbmNlZC1tdWx0aXZpZXctZGVwdGgtaGlnaCIsIEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19FTkhBTkNFRF9NVUxUSVZJRVdfREVQVEhfSElHSCB9LAorICAgICAgICB7ICJoZXZjLW1haW4iLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU4gfSwKKyAgICAgICAgeyAiaGV2Yy1tYWluLTEwIiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19NQUlOXzEwIH0sCisgICAgICAgIHsgImhldmMtbWFpbi1zdGlsbCIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfTUFJTl9TVElMTCB9LAorICAgICAgICB7ICJoZXZjLW1vbm8iLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01PTk8gfSwKKyAgICAgICAgeyAiaGV2Yy1tb25vLTEyIiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19NT05PXzEyIH0sCisgICAgICAgIHsgImhldmMtbW9uby0xNiIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfTU9OT18xNiB9LAorICAgICAgICB7ICJoZXZjLW1haW4tMTIiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU5fMTIgfSwKKyAgICAgICAgeyAiaGV2Yy1tYWluLTQyMi0xMCIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfTUFJTl80MjJfMTAgfSwKKyAgICAgICAgeyAiaGV2Yy1tYWluLTQyMi0xMiIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfTUFJTl80MjJfMTIgfSwKKyAgICAgICAgeyAiaGV2Yy1tYWluLTQ0NCIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfTUFJTl80NDQgfSwKKyAgICAgICAgeyAiaGV2Yy1tYWluLTQ0NC0xMCIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfTUFJTl80NDRfMTAgfSwKKyAgICAgICAgeyAiaGV2Yy1tYWluLTQ0NC0xMiIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfTUFJTl80NDRfMTIgfSwKKyAgICAgICAgeyAiaGV2Yy1tYWluLWludHJhIiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19NQUlOX0lOVFJBIH0sCisgICAgICAgIHsgImhldmMtbWFpbi0xMC1pbnRyYSIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfTUFJTl8xMF9JTlRSQSB9LAorICAgICAgICB7ICJoZXZjLW1haW4tMTItaW50cmEiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU5fMTJfSU5UUkEgfSwKKyAgICAgICAgeyAiaGV2Yy1tYWluLTQyMi0xMC1pbnRyYSIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfTUFJTl80MjJfMTBfSU5UUkEgfSwKKyAgICAgICAgeyAiaGV2Yy1tYWluLTQyMi0xMi1pbnRyYSIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfTUFJTl80MjJfMTJfSU5UUkEgfSwKKyAgICAgICAgeyAiaGV2Yy1tYWluLTQ0NC1pbnRyYSIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfTUFJTl80NDRfSU5UUkEgfSwKKyAgICAgICAgeyAiaGV2Yy1tYWluLTQ0NC0xMC1pbnRyYSIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfTUFJTl80NDRfMTBfSU5UUkEgfSwKKyAgICAgICAgeyAiaGV2Yy1tYWluLTQ0NC0xMi1pbnRyYSIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfTUFJTl80NDRfMTJfSU5UUkEgfSwKKyAgICAgICAgeyAiaGV2Yy1tYWluLTQ0NC0xNi1pbnRyYSIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfTUFJTl80NDRfMTZfSU5UUkEgfSwKKyAgICAgICAgeyAiaGV2Yy1tYWluLTQ0NC1zdGlsbCIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfTUFJTl80NDRfU1RJTEwgfSwKKyAgICAgICAgeyAiaGV2Yy1tYWluLTQ0NC0xNi1zdGlsbCIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfTUFJTl80NDRfMTZfU1RJTEwgfSwKKyAgICAgICAgeyAiaGV2Yy1oaWdoLTQ0NCIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfSElHSF80NDQgfSwKKyAgICAgICAgeyAiaGV2Yy1oaWdoLTQ0NC0xMCIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfSElHSF80NDRfMTAgfSwKKyAgICAgICAgeyAiaGV2Yy1oaWdoLTQ0NC0xNCIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfSElHSF80NDRfMTQgfSwKKyAgICAgICAgeyAiaGV2Yy1oaWdoLTQ0NC0xNi1pbnRyYSIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfSElHSF80NDRfMTZfSU5UUkEgfSwKKyAgICAgICAgeyAiaGV2Yy1zeC1tYWluIiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19TWF9NQUlOIH0sCisgICAgICAgIHsgImhldmMtc3gtbWFpbi0xMCIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfU1hfTUFJTl8xMCB9LAorICAgICAgICB7ICJoZXZjLXN4LW1haW4tNDQ0IiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19TWF9NQUlOXzQ0NCB9LAorICAgICAgICB7ICJoZXZjLXN4LW1haW4tNDQ0LTEwIiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19TWF9NQUlOXzQ0NF8xMCB9LAorICAgICAgICB7ICJoZXZjLXN4LWhpZ2gtNDQ0IiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19TWF9ISUdIXzQ0NCB9LAorICAgICAgICB7ICJoZXZjLXN4LWhpZ2gtNDQ0LTEwIiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19TWF9ISUdIXzQ0NF8xMCB9LAorICAgICAgICB7ICJoZXZjLXN4LWhpZ2gtNDQ0LTE0IiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19TWF9ISUdIXzQ0NF8xNCB9LAorICAgICAgICB7ICJoZXZjLW11bHRpdmlldy1tYWluIiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19NVUxUSVZJRVdfTUFJTiB9LAorICAgICAgICB7ICJoZXZjLXNjYWxhYmxlLW1haW4iLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX1NDQUxBQkxFX01BSU4gfSwKKyAgICAgICAgeyAiaGV2Yy1zY2FsYWJsZS1tYWluLTEwIiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19TQ0FMQUJMRV9NQUlOXzEwIH0sCisgICAgICAgIHsgImhldmMtc2NhbGFibGUtbW9ubyIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfU0NBTEFCTEVfTU9OTyB9LAorICAgICAgICB7ICJoZXZjLXNjYWxhYmxlLW1vbm8tMTIiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX1NDQUxBQkxFX01PTk9fMTIgfSwKKyAgICAgICAgeyAiaGV2Yy1zY2FsYWJsZS1tb25vLTE2IiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19TQ0FMQUJMRV9NT05PXzE2IH0sCisgICAgICAgIHsgImhldmMtc2NhbGFibGUtbWFpbi00NDQiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX1NDQUxBQkxFX01BSU5fNDQ0IH0sCisgICAgICAgIHsgImhldmMtM2QtbWFpbiIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfM0RfTUFJTiB9LAorICAgICAgICB7ICJ2cDktMCIsIEMyQ29uZmlnOjpQUk9GSUxFX1ZQOV8wIH0sCisgICAgICAgIHsgInZwOS0xIiwgQzJDb25maWc6OlBST0ZJTEVfVlA5XzEgfSwKKyAgICAgICAgeyAidnA5LTIiLCBDMkNvbmZpZzo6UFJPRklMRV9WUDlfMiB9LAorICAgICAgICB7ICJ2cDktMyIsIEMyQ29uZmlnOjpQUk9GSUxFX1ZQOV8zIH0sCit9KSkKKworREVGSU5FX0MyX0VOVU1fVkFMVUVfQ1VTVE9NX0hFTFBFUihDMkNvbmZpZzo6bGV2ZWxfdCwgKHsKKyAgICAgICAgeyAidW51c2VkIiwgQzJDb25maWc6OkxFVkVMX1VOVVNFRCB9LAorICAgICAgICB7ICJtcDJ2LWxvdyIsIEMyQ29uZmlnOjpMRVZFTF9NUDJWX0xPVyB9LAorICAgICAgICB7ICJtcDJ2LW1haW4iLCBDMkNvbmZpZzo6TEVWRUxfTVAyVl9NQUlOIH0sCisgICAgICAgIHsgIm1wMnYtaGlnaC0xNDQwIiwgQzJDb25maWc6OkxFVkVMX01QMlZfSElHSF8xNDQwIH0sCisgICAgICAgIHsgIm1wMnYtaGlnaCIsIEMyQ29uZmlnOjpMRVZFTF9NUDJWX0hJR0ggfSwKKyAgICAgICAgeyAibXAydi1oaWdocCIsIEMyQ29uZmlnOjpMRVZFTF9NUDJWX0hJR0hQIH0sCisgICAgICAgIHsgImgyNjMtMTAiLCBDMkNvbmZpZzo6TEVWRUxfSDI2M18xMCB9LAorICAgICAgICB7ICJoMjYzLTIwIiwgQzJDb25maWc6OkxFVkVMX0gyNjNfMjAgfSwKKyAgICAgICAgeyAiaDI2My0zMCIsIEMyQ29uZmlnOjpMRVZFTF9IMjYzXzMwIH0sCisgICAgICAgIHsgImgyNjMtNDAiLCBDMkNvbmZpZzo6TEVWRUxfSDI2M180MCB9LAorICAgICAgICB7ICJoMjYzLTQ1IiwgQzJDb25maWc6OkxFVkVMX0gyNjNfNDUgfSwKKyAgICAgICAgeyAiaDI2My01MCIsIEMyQ29uZmlnOjpMRVZFTF9IMjYzXzUwIH0sCisgICAgICAgIHsgImgyNjMtNjAiLCBDMkNvbmZpZzo6TEVWRUxfSDI2M182MCB9LAorICAgICAgICB7ICJoMjYzLTcwIiwgQzJDb25maWc6OkxFVkVMX0gyNjNfNzAgfSwKKyAgICAgICAgeyAibXA0di0wIiwgQzJDb25maWc6OkxFVkVMX01QNFZfMCB9LAorICAgICAgICB7ICJtcDR2LTBiIiwgQzJDb25maWc6OkxFVkVMX01QNFZfMEIgfSwKKyAgICAgICAgeyAibXA0di0xIiwgQzJDb25maWc6OkxFVkVMX01QNFZfMSB9LAorICAgICAgICB7ICJtcDR2LTIiLCBDMkNvbmZpZzo6TEVWRUxfTVA0Vl8yIH0sCisgICAgICAgIHsgIm1wNHYtMyIsIEMyQ29uZmlnOjpMRVZFTF9NUDRWXzMgfSwKKyAgICAgICAgeyAibXA0di0zYiIsIEMyQ29uZmlnOjpMRVZFTF9NUDRWXzNCIH0sCisgICAgICAgIHsgIm1wNHYtNCIsIEMyQ29uZmlnOjpMRVZFTF9NUDRWXzQgfSwKKyAgICAgICAgeyAibXA0di00YSIsIEMyQ29uZmlnOjpMRVZFTF9NUDRWXzRBIH0sCisgICAgICAgIHsgIm1wNHYtNSIsIEMyQ29uZmlnOjpMRVZFTF9NUDRWXzUgfSwKKyAgICAgICAgeyAibXA0di02IiwgQzJDb25maWc6OkxFVkVMX01QNFZfNiB9LAorICAgICAgICB7ICJhdmMtMSIsIEMyQ29uZmlnOjpMRVZFTF9BVkNfMSB9LAorICAgICAgICB7ICJhdmMtMWIiLCBDMkNvbmZpZzo6TEVWRUxfQVZDXzFCIH0sCisgICAgICAgIHsgImF2Yy0xLjEiLCBDMkNvbmZpZzo6TEVWRUxfQVZDXzFfMSB9LAorICAgICAgICB7ICJhdmMtMS4yIiwgQzJDb25maWc6OkxFVkVMX0FWQ18xXzIgfSwKKyAgICAgICAgeyAiYXZjLTEuMyIsIEMyQ29uZmlnOjpMRVZFTF9BVkNfMV8zIH0sCisgICAgICAgIHsgImF2Yy0yIiwgQzJDb25maWc6OkxFVkVMX0FWQ18yIH0sCisgICAgICAgIHsgImF2Yy0yLjEiLCBDMkNvbmZpZzo6TEVWRUxfQVZDXzJfMSB9LAorICAgICAgICB7ICJhdmMtMi4yIiwgQzJDb25maWc6OkxFVkVMX0FWQ18yXzIgfSwKKyAgICAgICAgeyAiYXZjLTMiLCBDMkNvbmZpZzo6TEVWRUxfQVZDXzMgfSwKKyAgICAgICAgeyAiYXZjLTMuMSIsIEMyQ29uZmlnOjpMRVZFTF9BVkNfM18xIH0sCisgICAgICAgIHsgImF2Yy0zLjIiLCBDMkNvbmZpZzo6TEVWRUxfQVZDXzNfMiB9LAorICAgICAgICB7ICJhdmMtNCIsIEMyQ29uZmlnOjpMRVZFTF9BVkNfNCB9LAorICAgICAgICB7ICJhdmMtNC4xIiwgQzJDb25maWc6OkxFVkVMX0FWQ180XzEgfSwKKyAgICAgICAgeyAiYXZjLTQuMiIsIEMyQ29uZmlnOjpMRVZFTF9BVkNfNF8yIH0sCisgICAgICAgIHsgImF2Yy01IiwgQzJDb25maWc6OkxFVkVMX0FWQ181IH0sCisgICAgICAgIHsgImF2Yy01LjEiLCBDMkNvbmZpZzo6TEVWRUxfQVZDXzVfMSB9LAorICAgICAgICB7ICJhdmMtNS4yIiwgQzJDb25maWc6OkxFVkVMX0FWQ181XzIgfSwKKyAgICAgICAgeyAiaGV2Yy1tYWluLTEiLCBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzEgfSwKKyAgICAgICAgeyAiaGV2Yy1tYWluLTIiLCBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzIgfSwKKyAgICAgICAgeyAiaGV2Yy1tYWluLTIuMSIsIEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fMl8xIH0sCisgICAgICAgIHsgImhldmMtbWFpbi0zIiwgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl8zIH0sCisgICAgICAgIHsgImhldmMtbWFpbi0zLjEiLCBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzNfMSB9LAorICAgICAgICB7ICJoZXZjLW1haW4tNCIsIEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fNCB9LAorICAgICAgICB7ICJoZXZjLW1haW4tNC4xIiwgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl80XzEgfSwKKyAgICAgICAgeyAiaGV2Yy1tYWluLTUiLCBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzUgfSwKKyAgICAgICAgeyAiaGV2Yy1tYWluLTUuMSIsIEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fNV8xIH0sCisgICAgICAgIHsgImhldmMtbWFpbi01LjIiLCBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzVfMiB9LAorICAgICAgICB7ICJoZXZjLW1haW4tNiIsIEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fNiB9LAorICAgICAgICB7ICJoZXZjLW1haW4tNi4xIiwgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl82XzEgfSwKKyAgICAgICAgeyAiaGV2Yy1tYWluLTYuMiIsIEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fNl8yIH0sCisgICAgICAgIHsgImhldmMtaGlnaC00IiwgQzJDb25maWc6OkxFVkVMX0hFVkNfSElHSF80IH0sCisgICAgICAgIHsgImhldmMtaGlnaC00LjEiLCBDMkNvbmZpZzo6TEVWRUxfSEVWQ19ISUdIXzRfMSB9LAorICAgICAgICB7ICJoZXZjLWhpZ2gtNSIsIEMyQ29uZmlnOjpMRVZFTF9IRVZDX0hJR0hfNSB9LAorICAgICAgICB7ICJoZXZjLWhpZ2gtNS4xIiwgQzJDb25maWc6OkxFVkVMX0hFVkNfSElHSF81XzEgfSwKKyAgICAgICAgeyAiaGV2Yy1oaWdoLTUuMiIsIEMyQ29uZmlnOjpMRVZFTF9IRVZDX0hJR0hfNV8yIH0sCisgICAgICAgIHsgImhldmMtaGlnaC02IiwgQzJDb25maWc6OkxFVkVMX0hFVkNfSElHSF82IH0sCisgICAgICAgIHsgImhldmMtaGlnaC02LjEiLCBDMkNvbmZpZzo6TEVWRUxfSEVWQ19ISUdIXzZfMSB9LAorICAgICAgICB7ICJoZXZjLWhpZ2gtNi4yIiwgQzJDb25maWc6OkxFVkVMX0hFVkNfSElHSF82XzIgfSwKKyAgICAgICAgeyAidnA5LTEiLCBDMkNvbmZpZzo6TEVWRUxfVlA5XzEgfSwKKyAgICAgICAgeyAidnA5LTEuMSIsIEMyQ29uZmlnOjpMRVZFTF9WUDlfMV8xIH0sCisgICAgICAgIHsgInZwOS0yIiwgQzJDb25maWc6OkxFVkVMX1ZQOV8yIH0sCisgICAgICAgIHsgInZwOS0yLjEiLCBDMkNvbmZpZzo6TEVWRUxfVlA5XzJfMSB9LAorICAgICAgICB7ICJ2cDktMyIsIEMyQ29uZmlnOjpMRVZFTF9WUDlfMyB9LAorICAgICAgICB7ICJ2cDktMy4xIiwgQzJDb25maWc6OkxFVkVMX1ZQOV8zXzEgfSwKKyAgICAgICAgeyAidnA5LTQiLCBDMkNvbmZpZzo6TEVWRUxfVlA5XzQgfSwKKyAgICAgICAgeyAidnA5LTQuMSIsIEMyQ29uZmlnOjpMRVZFTF9WUDlfNF8xIH0sCisgICAgICAgIHsgInZwOS01IiwgQzJDb25maWc6OkxFVkVMX1ZQOV81IH0sCisgICAgICAgIHsgInZwOS01LjEiLCBDMkNvbmZpZzo6TEVWRUxfVlA5XzVfMSB9LAorICAgICAgICB7ICJ2cDktNS4yIiwgQzJDb25maWc6OkxFVkVMX1ZQOV81XzIgfSwKKyAgICAgICAgeyAidnA5LTYiLCBDMkNvbmZpZzo6TEVWRUxfVlA5XzYgfSwKKyAgICAgICAgeyAidnA5LTYuMSIsIEMyQ29uZmlnOjpMRVZFTF9WUDlfNl8xIH0sCisgICAgICAgIHsgInZwOS02LjIiLCBDMkNvbmZpZzo6TEVWRUxfVlA5XzZfMiB9LAorfSkpCisKK0RFRklORV9DMl9FTlVNX1ZBTFVFX0NVU1RPTV9IRUxQRVIoQzJCdWZmZXJEYXRhOjp0eXBlX3QsICh7CisgICAgICAgIHsgImludmFsaWQiLCAgICAgICAgQzJCdWZmZXJEYXRhOjpJTlZBTElEIH0sCisgICAgICAgIHsgImxpbmVhciIsICAgICAgICAgQzJCdWZmZXJEYXRhOjpMSU5FQVIgfSwKKyAgICAgICAgeyAibGluZWFyLWNodW5rcyIsICBDMkJ1ZmZlckRhdGE6OkxJTkVBUl9DSFVOS1MgfSwKKyAgICAgICAgeyAiZ3JhcGhpYyIsICAgICAgICBDMkJ1ZmZlckRhdGE6OkdSQVBISUMgfSwKKyAgICAgICAgeyAiZ3JhcGhpYy1jaHVua3MiLCBDMkJ1ZmZlckRhdGE6OkdSQVBISUNfQ0hVTktTIH0sCit9KSkKKworCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay9DMlBsYXRmb3JtU3RvcmVQbHVnaW5Mb2FkZXIuY3BwIGIvbWVkaWEvY29kZWMyL3ZuZGsvQzJQbGF0Zm9ybVN0b3JlUGx1Z2luTG9hZGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTQ2MGY0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvQzJQbGF0Zm9ybVN0b3JlUGx1Z2luTG9hZGVyLmNwcApAQCAtMCwwICsxLDk1IEBACisvKgorICogQ29weXJpZ2h0IDIwMTgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyUGxhdGZvcm1TdG9yZVBsdWdpbkxvYWRlciIKKworI2luY2x1ZGUgPGRsZmNuLmg+CisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIkMyUGxhdGZvcm1TdG9yZVBsdWdpbkxvYWRlci5oIgorCisvKiBzdGF0aWMgKi8gYW5kcm9pZDo6TXV0ZXggQzJQbGF0Zm9ybVN0b3JlUGx1Z2luTG9hZGVyOjpzTXV0ZXg7CisvKiBzdGF0aWMgKi8gc3RkOjp1bmlxdWVfcHRyPEMyUGxhdGZvcm1TdG9yZVBsdWdpbkxvYWRlcj4gQzJQbGF0Zm9ybVN0b3JlUGx1Z2luTG9hZGVyOjpzSW5zdGFuY2U7CisKK0MyUGxhdGZvcm1TdG9yZVBsdWdpbkxvYWRlcjo6QzJQbGF0Zm9ybVN0b3JlUGx1Z2luTG9hZGVyKGNvbnN0IGNoYXIgKmxpYlBhdGgpCisgICAgOiBtQ3JlYXRlQmxvY2tQb29sKG51bGxwdHIpIHsKKyAgICBtTGliSGFuZGxlID0gZGxvcGVuKGxpYlBhdGgsIFJUTERfTk9XIHwgUlRMRF9OT0RFTEVURSk7CisgICAgaWYgKG1MaWJIYW5kbGUgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRCgiRmFpbGVkIHRvIGxvYWQgbGlicmFyeTogJXMgKCVzKSIsIGxpYlBhdGgsIGRsZXJyb3IoKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbUNyZWF0ZUJsb2NrUG9vbCA9IChDcmVhdGVCbG9ja1Bvb2xGdW5jKWRsc3ltKG1MaWJIYW5kbGUsICJDcmVhdGVCbG9ja1Bvb2wiKTsKKyAgICBpZiAobUNyZWF0ZUJsb2NrUG9vbCA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dEKCJGYWlsZWQgdG8gZmluZCBzeW1ib2w6IENyZWF0ZUJsb2NrUG9vbCAoJXMpIiwgZGxlcnJvcigpKTsKKyAgICB9CisgICAgbUNyZWF0ZUFsbG9jYXRvciA9IChDcmVhdGVBbGxvY2F0b3JGdW5jKWRsc3ltKG1MaWJIYW5kbGUsICJDcmVhdGVBbGxvY2F0b3IiKTsKKyAgICBpZiAobUNyZWF0ZUFsbG9jYXRvciA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dEKCJGYWlsZWQgdG8gZmluZCBzeW1ib2w6IENyZWF0ZUFsbG9jYXRvciAoJXMpIiwgZGxlcnJvcigpKTsKKyAgICB9Cit9CisKK0MyUGxhdGZvcm1TdG9yZVBsdWdpbkxvYWRlcjo6fkMyUGxhdGZvcm1TdG9yZVBsdWdpbkxvYWRlcigpIHsKKyAgICBpZiAobUxpYkhhbmRsZSAhPSBudWxscHRyKSB7CisgICAgICAgIEFMT0dWKCJDbG9zaW5nIGhhbmRsZSIpOworICAgICAgICBkbGNsb3NlKG1MaWJIYW5kbGUpOworICAgIH0KK30KKworYzJfc3RhdHVzX3QgQzJQbGF0Zm9ybVN0b3JlUGx1Z2luTG9hZGVyOjpjcmVhdGVCbG9ja1Bvb2woCisgICAgICAgIDo6QzJBbGxvY2F0b3I6OmlkX3QgYWxsb2NhdG9ySWQsIDo6QzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3QgYmxvY2tQb29sSWQsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4qIHBvb2wpIHsKKyAgICBpZiAobUNyZWF0ZUJsb2NrUG9vbCA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dEKCJIYW5kbGUgb3IgQ3JlYXRlQmxvY2tQb29sIHN5bWJvbCBpcyBudWxsIik7CisgICAgICAgIHJldHVybiBDMl9OT1RfRk9VTkQ7CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPDo6QzJCbG9ja1Bvb2w+IHB0cihtQ3JlYXRlQmxvY2tQb29sKGFsbG9jYXRvcklkLCBibG9ja1Bvb2xJZCkpOworICAgIGlmIChwdHIpIHsKKyAgICAgICAgKnBvb2wgPSBwdHI7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisgICAgQUxPR0QoIkZhaWxlZCB0byBDcmVhdGVCbG9ja1Bvb2wgYnkgYWxsb2NhdG9yIGlkOiAldSIsIGFsbG9jYXRvcklkKTsKKyAgICByZXR1cm4gQzJfQkFEX0lOREVYOworfQorCitjMl9zdGF0dXNfdCBDMlBsYXRmb3JtU3RvcmVQbHVnaW5Mb2FkZXI6OmNyZWF0ZUFsbG9jYXRvcigKKyAgICAgICAgOjpDMkFsbG9jYXRvcjo6aWRfdCBhbGxvY2F0b3JJZCwgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiogY29uc3QgYWxsb2NhdG9yKSB7CisgICAgaWYgKG1DcmVhdGVBbGxvY2F0b3IgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRCgiSGFuZGxlIG9yIENyZWF0ZUFsbG9jYXRvciBzeW1ib2wgaXMgbnVsbCIpOworICAgICAgICByZXR1cm4gQzJfTk9UX0ZPVU5EOworICAgIH0KKworICAgIGMyX3N0YXR1c190IHJlcyA9IEMyX0NPUlJVUFRFRDsKKyAgICBhbGxvY2F0b3ItPnJlc2V0KG1DcmVhdGVBbGxvY2F0b3IoYWxsb2NhdG9ySWQsICZyZXMpKTsKKyAgICBpZiAocmVzICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dEKCJGYWlsZWQgdG8gQ3JlYXRlQWxsb2NhdG9yIGJ5IGlkOiAldSwgcmVzOiAlZCIsIGFsbG9jYXRvcklkLCByZXMpOworICAgICAgICBhbGxvY2F0b3ItPnJlc2V0KCk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorICAgIHJldHVybiBDMl9PSzsKK30KKworLy8gc3RhdGljCitjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJQbGF0Zm9ybVN0b3JlUGx1Z2luTG9hZGVyPiYgQzJQbGF0Zm9ybVN0b3JlUGx1Z2luTG9hZGVyOjpHZXRJbnN0YW5jZSgpIHsKKyAgICBhbmRyb2lkOjpNdXRleDo6QXV0b2xvY2sgX2woc011dGV4KTsKKyAgICBpZiAoIXNJbnN0YW5jZSkgeworICAgICAgICBBTE9HVigiTG9hZGluZyBsaWJyYXJ5Iik7CisgICAgICAgIHNJbnN0YW5jZS5yZXNldChuZXcgQzJQbGF0Zm9ybVN0b3JlUGx1Z2luTG9hZGVyKCJsaWJzdGFnZWZyaWdodF9jY29kZWNfZXh0LnNvIikpOworICAgIH0KKyAgICByZXR1cm4gc0luc3RhbmNlOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvQzJTdG9yZS5jcHAgYi9tZWRpYS9jb2RlYzIvdm5kay9DMlN0b3JlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzAxOWVkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvQzJTdG9yZS5jcHAKQEAgLTAsMCArMSw5NzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkMyU3RvcmUiCisjZGVmaW5lIExPR19OREVCVUcgMAorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8QzJBbGxvY2F0b3JHcmFsbG9jLmg+CisjaW5jbHVkZSA8QzJBbGxvY2F0b3JJb24uaD4KKyNpbmNsdWRlIDxDMkJ1ZmZlclByaXYuaD4KKyNpbmNsdWRlIDxDMkJxQnVmZmVyUHJpdi5oPgorI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8QzJDb25maWcuaD4KKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3RvcmVQbHVnaW5Mb2FkZXIuaD4KKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPHV0aWwvQzJJbnRlcmZhY2VIZWxwZXIuaD4KKworI2luY2x1ZGUgPGRsZmNuLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+IC8vIGdldHBhZ2VzaXplCisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPG11dGV4PgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qKgorICogUmV0dXJucyB0aGUgcHJlZmVycmVkIGNvbXBvbmVudCBzdG9yZSBpbiB0aGlzIHByb2Nlc3MgdG8gYWNjZXNzIGl0cyBpbnRlcmZhY2UuCisgKi8KK3N0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudFN0b3JlPiBHZXRQcmVmZXJyZWRDb2RlYzJDb21wb25lbnRTdG9yZSgpOworCisvKioKKyAqIFRoZSBwbGF0Zm9ybSBhbGxvY2F0b3Igc3RvcmUgcHJvdmlkZXMgYmFzaWMgYWxsb2NhdG9yLXR5cGVzIGZvciB0aGUgZnJhbWV3b3JrIGJhc2VkIG9uIGlvbiBhbmQKKyAqIGdyYWxsb2MuIEFsbG9jYXRvcnMgYXJlIG5vdCBtZWFudCB0byBiZSB1cGRhdGFibGUuCisgKgorICogXHRvZG8gUHJvdmlkZSBhbGxvY2F0b3IgYmFzZWQgb24gYXNobWVtCisgKiBcdG9kbyBNb3ZlIGlvbiBhbGxvY2F0aW9uIGludG8gaXRzIEhJREwgb3IgcHJvdmlkZSBzb21lIG1hcHBpbmcgZnJvbSBtZW1vcnkgdXNhZ2UgdG8gaW9uIGZsYWdzCisgKiBcdG9kbyBNYWtlIHRoaXMgYWxsb2NhdG9yIHN0b3JlIGV4dGVuZGFibGUKKyAqLworY2xhc3MgQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlSW1wbCA6IHB1YmxpYyBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmUgeworcHVibGljOgorICAgIEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZUltcGwoKTsKKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgZmV0Y2hBbGxvY2F0b3IoCisgICAgICAgICAgICBpZF90IGlkLCBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+ICpjb25zdCBhbGxvY2F0b3IpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJBbGxvY2F0b3I6OlRyYWl0cz4+IGxpc3RBbGxvY2F0b3JzX25iKCkKKyAgICAgICAgICAgIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkFsbG9jYXRvcjo6VHJhaXRzPj4oKTsgLy8vIFx0b2RvCisgICAgfQorCisgICAgdmlydHVhbCBDMlN0cmluZyBnZXROYW1lKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gImFuZHJvaWQuYWxsb2NhdG9yLXN0b3JlIjsKKyAgICB9CisKKyAgICB2b2lkIHNldENvbXBvbmVudFN0b3JlKHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudFN0b3JlPiBzdG9yZSk7CisKKyAgICB+QzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlSW1wbCgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworcHJpdmF0ZToKKyAgICAvLy8gcmV0dXJucyBhIHNoYXJlZC1zaW5nbGV0b24gaW9uIGFsbG9jYXRvcgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gZmV0Y2hJb25BbGxvY2F0b3IoKTsKKworICAgIC8vLyByZXR1cm5zIGEgc2hhcmVkLXNpbmdsZXRvbiBncmFsbG9jIGFsbG9jYXRvcgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gZmV0Y2hHcmFsbG9jQWxsb2NhdG9yKCk7CisKKyAgICAvLy8gcmV0dXJucyBhIHNoYXJlZC1zaW5nbGV0b24gYnVmZmVycXVldWUgc3VwcG9ydGluZyBncmFsbG9jIGFsbG9jYXRvcgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gZmV0Y2hCdWZmZXJRdWV1ZUFsbG9jYXRvcigpOworCisgICAgLy8vIGNvbXBvbmVudCBzdG9yZSB0byB1c2UKKyAgICBzdGQ6Om11dGV4IF9tQ29tcG9uZW50U3RvcmVTZXRMb2NrOyAvLyBwcm90ZWN0cyB0aGUgZW50aXJlIHVwZGF0aW5nIF9tQ29tcG9uZW50U3RvcmUgYW5kIGl0cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlcGVuZGVuY2llcworICAgIHN0ZDo6bXV0ZXggX21Db21wb25lbnRTdG9yZVJlYWRMb2NrOyAvLyBtdXN0IHByb3RlY3Qgb25seSByZWFkL3dyaXRlIG9mIF9tQ29tcG9uZW50U3RvcmUKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRTdG9yZT4gX21Db21wb25lbnRTdG9yZTsKK307CisKK0MyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZUltcGw6OkMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZUltcGwoKSB7Cit9CisKK2MyX3N0YXR1c190IEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZUltcGw6OmZldGNoQWxsb2NhdG9yKAorICAgICAgICBpZF90IGlkLCBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+ICpjb25zdCBhbGxvY2F0b3IpIHsKKyAgICBhbGxvY2F0b3ItPnJlc2V0KCk7CisgICAgc3dpdGNoIChpZCkgeworICAgIC8vIFRPRE86IHNob3VsZCB3ZSBpbXBsZW1lbnQgYSBnZW5lcmljIHJlZ2lzdHJ5IGZvciBhbGwsIGFuZCB1c2UgdGhhdD8KKyAgICBjYXNlIEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTo6SU9OOgorICAgIGNhc2UgQzJBbGxvY2F0b3JTdG9yZTo6REVGQVVMVF9MSU5FQVI6CisgICAgICAgICphbGxvY2F0b3IgPSBmZXRjaElvbkFsbG9jYXRvcigpOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjpHUkFMTE9DOgorICAgIGNhc2UgQzJBbGxvY2F0b3JTdG9yZTo6REVGQVVMVF9HUkFQSElDOgorICAgICAgICAqYWxsb2NhdG9yID0gZmV0Y2hHcmFsbG9jQWxsb2NhdG9yKCk7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OkJVRkZFUlFVRVVFOgorICAgICAgICAqYWxsb2NhdG9yID0gZmV0Y2hCdWZmZXJRdWV1ZUFsbG9jYXRvcigpOworICAgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICAgIC8vIFRyeSB0byBjcmVhdGUgYWxsb2NhdG9yIGZyb20gcGxhdGZvcm0gc3RvcmUgcGx1Z2lucy4KKyAgICAgICAgYzJfc3RhdHVzX3QgcmVzID0KKyAgICAgICAgICAgICAgICBDMlBsYXRmb3JtU3RvcmVQbHVnaW5Mb2FkZXI6OkdldEluc3RhbmNlKCktPmNyZWF0ZUFsbG9jYXRvcihpZCwgYWxsb2NhdG9yKTsKKyAgICAgICAgaWYgKHJlcyAhPSBDMl9PSykgeworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKCphbGxvY2F0b3IgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gQzJfTk9fTUVNT1JZOworICAgIH0KKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK25hbWVzcGFjZSB7CisKK3N0ZDo6bXV0ZXggZ0lvbkFsbG9jYXRvck11dGV4Oworc3RkOjp3ZWFrX3B0cjxDMkFsbG9jYXRvcklvbj4gZ0lvbkFsbG9jYXRvcjsKKwordm9pZCBVc2VDb21wb25lbnRTdG9yZUZvcklvbkFsbG9jYXRvcigKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9ySW9uPiBhbGxvY2F0b3IsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudFN0b3JlPiBzdG9yZSkgeworICAgIEMyQWxsb2NhdG9ySW9uOjpVc2FnZU1hcHBlckZuIG1hcHBlcjsKKyAgICB1aW50NjRfdCBtaW5Vc2FnZSA9IDA7CisgICAgdWludDY0X3QgbWF4VXNhZ2UgPSBDMk1lbW9yeVVzYWdlKEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUpLmV4cGVjdGVkOworICAgIHNpemVfdCBibG9ja1NpemUgPSBnZXRwYWdlc2l6ZSgpOworCisgICAgLy8gcXVlcnkgbWluIGFuZCBtYXggdXNhZ2UgYXMgd2VsbCBhcyBibG9jayBzaXplIHZpYSBzdXBwb3J0ZWQgdmFsdWVzCisgICAgQzJTdG9yZUlvblVzYWdlSW5mbyB1c2FnZUluZm87CisgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5PiBxdWVyeSA9IHsKKyAgICAgICAgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5OjpQb3NzaWJsZShDMlBhcmFtRmllbGQ6Ok1ha2UodXNhZ2VJbmZvLCB1c2FnZUluZm8udXNhZ2UpKSwKKyAgICAgICAgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5OjpQb3NzaWJsZShDMlBhcmFtRmllbGQ6Ok1ha2UodXNhZ2VJbmZvLCB1c2FnZUluZm8uY2FwYWNpdHkpKSwKKyAgICB9OworICAgIGMyX3N0YXR1c190IHJlcyA9IHN0b3JlLT5xdWVyeVN1cHBvcnRlZFZhbHVlc19zbShxdWVyeSk7CisgICAgaWYgKHJlcyA9PSBDMl9PSykgeworICAgICAgICBpZiAocXVlcnlbMF0uc3RhdHVzID09IEMyX09LKSB7CisgICAgICAgICAgICBjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzICZmc3YgPSBxdWVyeVswXS52YWx1ZXM7CisgICAgICAgICAgICBpZiAoZnN2LnR5cGUgPT0gQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6RkxBR1MgJiYgIWZzdi52YWx1ZXMuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgIG1pblVzYWdlID0gZnN2LnZhbHVlc1swXS51NjQ7CisgICAgICAgICAgICAgICAgbWF4VXNhZ2UgPSAwOworICAgICAgICAgICAgICAgIGZvciAoQzJWYWx1ZTo6UHJpbWl0aXZlIHYgOiBmc3YudmFsdWVzKSB7CisgICAgICAgICAgICAgICAgICAgIG1heFVzYWdlIHw9IHYudTY0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAocXVlcnlbMV0uc3RhdHVzID09IEMyX09LKSB7CisgICAgICAgICAgICBjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzICZmc3YgPSBxdWVyeVsxXS52YWx1ZXM7CisgICAgICAgICAgICBpZiAoZnN2LnR5cGUgPT0gQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6UkFOR0UgJiYgZnN2LnJhbmdlLnN0ZXAudTMyID4gMCkgeworICAgICAgICAgICAgICAgIGJsb2NrU2l6ZSA9IGZzdi5yYW5nZS5zdGVwLnUzMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIG1hcHBlciA9IFtzdG9yZV0oQzJNZW1vcnlVc2FnZSB1c2FnZSwgc2l6ZV90IGNhcGFjaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqYWxpZ24sIHVuc2lnbmVkICpoZWFwTWFzaywgdW5zaWduZWQgKmZsYWdzKSAtPiBjMl9zdGF0dXNfdCB7CisgICAgICAgICAgICBpZiAoY2FwYWNpdHkgPiBVSU5UMzJfTUFYKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEMyU3RvcmVJb25Vc2FnZUluZm8gdXNhZ2VJbmZvID0geyB1c2FnZS5leHBlY3RlZCwgY2FwYWNpdHkgfTsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsgLy8gVE9ETzogcmVtb3ZlCisgICAgICAgICAgICBjMl9zdGF0dXNfdCByZXMgPSBzdG9yZS0+Y29uZmlnX3NtKHsmdXNhZ2VJbmZvfSwgJmZhaWx1cmVzKTsKKyAgICAgICAgICAgIGlmIChyZXMgPT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAqYWxpZ24gPSB1c2FnZUluZm8ubWluQWxpZ25tZW50OworICAgICAgICAgICAgICAgICpoZWFwTWFzayA9IHVzYWdlSW5mby5oZWFwTWFzazsKKyAgICAgICAgICAgICAgICAqZmxhZ3MgPSB1c2FnZUluZm8uYWxsb2NGbGFnczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH07CisgICAgfQorCisgICAgYWxsb2NhdG9yLT5zZXRVc2FnZU1hcHBlcihtYXBwZXIsIG1pblVzYWdlLCBtYXhVc2FnZSwgYmxvY2tTaXplKTsKK30KKworfQorCit2b2lkIEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZUltcGw6OnNldENvbXBvbmVudFN0b3JlKHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudFN0b3JlPiBzdG9yZSkgeworICAgIC8vIHRlY2huaWNhbGx5IHRoaXMgc2V0IGxvY2sgaXMgbm90IG5lZWRlZCwgYnV0IGlzIGhlcmUgZm9yIHNhZmV0eSBpbiBjYXNlIHdlIGFkZCBtb3JlCisgICAgLy8gZ2V0dGVyIG9yZGVycworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKF9tQ29tcG9uZW50U3RvcmVTZXRMb2NrKTsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKF9tQ29tcG9uZW50U3RvcmVSZWFkTG9jayk7CisgICAgICAgIF9tQ29tcG9uZW50U3RvcmUgPSBzdG9yZTsKKyAgICB9CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9ySW9uPiBhbGxvY2F0b3I7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhnSW9uQWxsb2NhdG9yTXV0ZXgpOworICAgICAgICBhbGxvY2F0b3IgPSBnSW9uQWxsb2NhdG9yLmxvY2soKTsKKyAgICB9CisgICAgaWYgKGFsbG9jYXRvcikgeworICAgICAgICBVc2VDb21wb25lbnRTdG9yZUZvcklvbkFsbG9jYXRvcihhbGxvY2F0b3IsIHN0b3JlKTsKKyAgICB9Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlSW1wbDo6ZmV0Y2hJb25BbGxvY2F0b3IoKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soZ0lvbkFsbG9jYXRvck11dGV4KTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3JJb24+IGFsbG9jYXRvciA9IGdJb25BbGxvY2F0b3IubG9jaygpOworICAgIGlmIChhbGxvY2F0b3IgPT0gbnVsbHB0cikgeworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRTdG9yZT4gY29tcG9uZW50U3RvcmU7CisgICAgICAgIHsKKyAgICAgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKF9tQ29tcG9uZW50U3RvcmVSZWFkTG9jayk7CisgICAgICAgICAgICBjb21wb25lbnRTdG9yZSA9IF9tQ29tcG9uZW50U3RvcmU7CisgICAgICAgIH0KKyAgICAgICAgYWxsb2NhdG9yID0gc3RkOjptYWtlX3NoYXJlZDxDMkFsbG9jYXRvcklvbj4oQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjpJT04pOworICAgICAgICBVc2VDb21wb25lbnRTdG9yZUZvcklvbkFsbG9jYXRvcihhbGxvY2F0b3IsIGNvbXBvbmVudFN0b3JlKTsKKyAgICAgICAgZ0lvbkFsbG9jYXRvciA9IGFsbG9jYXRvcjsKKyAgICB9CisgICAgcmV0dXJuIGFsbG9jYXRvcjsKK30KKworc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmVJbXBsOjpmZXRjaEdyYWxsb2NBbGxvY2F0b3IoKSB7CisgICAgc3RhdGljIHN0ZDo6bXV0ZXggbXV0ZXg7CisgICAgc3RhdGljIHN0ZDo6d2Vha19wdHI8QzJBbGxvY2F0b3I+IGdyYWxsb2NBbGxvY2F0b3I7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobXV0ZXgpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gYWxsb2NhdG9yID0gZ3JhbGxvY0FsbG9jYXRvci5sb2NrKCk7CisgICAgaWYgKGFsbG9jYXRvciA9PSBudWxscHRyKSB7CisgICAgICAgIGFsbG9jYXRvciA9IHN0ZDo6bWFrZV9zaGFyZWQ8QzJBbGxvY2F0b3JHcmFsbG9jPihDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OkdSQUxMT0MpOworICAgICAgICBncmFsbG9jQWxsb2NhdG9yID0gYWxsb2NhdG9yOworICAgIH0KKyAgICByZXR1cm4gYWxsb2NhdG9yOworfQorCitzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZUltcGw6OmZldGNoQnVmZmVyUXVldWVBbGxvY2F0b3IoKSB7CisgICAgc3RhdGljIHN0ZDo6bXV0ZXggbXV0ZXg7CisgICAgc3RhdGljIHN0ZDo6d2Vha19wdHI8QzJBbGxvY2F0b3I+IGdyYWxsb2NBbGxvY2F0b3I7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobXV0ZXgpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gYWxsb2NhdG9yID0gZ3JhbGxvY0FsbG9jYXRvci5sb2NrKCk7CisgICAgaWYgKGFsbG9jYXRvciA9PSBudWxscHRyKSB7CisgICAgICAgIGFsbG9jYXRvciA9IHN0ZDo6bWFrZV9zaGFyZWQ8QzJBbGxvY2F0b3JHcmFsbG9jPigKKyAgICAgICAgICAgICAgICBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OkJVRkZFUlFVRVVFLCB0cnVlKTsKKyAgICAgICAgZ3JhbGxvY0FsbG9jYXRvciA9IGFsbG9jYXRvcjsKKyAgICB9CisgICAgcmV0dXJuIGFsbG9jYXRvcjsKK30KKworbmFtZXNwYWNlIHsKKyAgICBzdGQ6Om11dGV4IGdQcmVmZXJyZWRDb21wb25lbnRTdG9yZU11dGV4OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudFN0b3JlPiBnUHJlZmVycmVkQ29tcG9uZW50U3RvcmU7CisKKyAgICBzdGQ6Om11dGV4IGdQbGF0Zm9ybUFsbG9jYXRvclN0b3JlTXV0ZXg7CisgICAgc3RkOjp3ZWFrX3B0cjxDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmVJbXBsPiBnUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTsKK30KKworc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yU3RvcmU+IEdldENvZGVjMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmUoKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soZ1BsYXRmb3JtQWxsb2NhdG9yU3RvcmVNdXRleCk7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZUltcGw+IHN0b3JlID0gZ1BsYXRmb3JtQWxsb2NhdG9yU3RvcmUubG9jaygpOworICAgIGlmIChzdG9yZSA9PSBudWxscHRyKSB7CisgICAgICAgIHN0b3JlID0gc3RkOjptYWtlX3NoYXJlZDxDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmVJbXBsPigpOworICAgICAgICBzdG9yZS0+c2V0Q29tcG9uZW50U3RvcmUoR2V0UHJlZmVycmVkQ29kZWMyQ29tcG9uZW50U3RvcmUoKSk7CisgICAgICAgIGdQbGF0Zm9ybUFsbG9jYXRvclN0b3JlID0gc3RvcmU7CisgICAgfQorICAgIHJldHVybiBzdG9yZTsKK30KKwordm9pZCBTZXRQcmVmZXJyZWRDb2RlYzJDb21wb25lbnRTdG9yZShzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRTdG9yZT4gY29tcG9uZW50U3RvcmUpIHsKKyAgICBzdGF0aWMgc3RkOjptdXRleCBtdXRleDsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtdXRleCk7IC8vIGRvbid0IGludGVybGV2ZSBzZXQtcworCisgICAgLy8gdXBkYXRlIHByZWZlcnJlZCBzdG9yZQorICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soZ1ByZWZlcnJlZENvbXBvbmVudFN0b3JlTXV0ZXgpOworICAgICAgICBnUHJlZmVycmVkQ29tcG9uZW50U3RvcmUgPSBjb21wb25lbnRTdG9yZTsKKyAgICB9CisKKyAgICAvLyB1cGRhdGUgcGxhdGZvcm0gYWxsb2NhdG9yJ3Mgc3RvcmUgYXMgd2VsbCBpZiBpdCBpcyBhbGl2ZQorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmVJbXBsPiBhbGxvY2F0b3JTdG9yZTsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKGdQbGF0Zm9ybUFsbG9jYXRvclN0b3JlTXV0ZXgpOworICAgICAgICBhbGxvY2F0b3JTdG9yZSA9IGdQbGF0Zm9ybUFsbG9jYXRvclN0b3JlLmxvY2soKTsKKyAgICB9CisgICAgaWYgKGFsbG9jYXRvclN0b3JlKSB7CisgICAgICAgIGFsbG9jYXRvclN0b3JlLT5zZXRDb21wb25lbnRTdG9yZShjb21wb25lbnRTdG9yZSk7CisgICAgfQorfQorCitzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRTdG9yZT4gR2V0UHJlZmVycmVkQ29kZWMyQ29tcG9uZW50U3RvcmUoKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soZ1ByZWZlcnJlZENvbXBvbmVudFN0b3JlTXV0ZXgpOworICAgIHJldHVybiBnUHJlZmVycmVkQ29tcG9uZW50U3RvcmUgPyBnUHJlZmVycmVkQ29tcG9uZW50U3RvcmUgOiBHZXRDb2RlYzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCk7Cit9CisKK25hbWVzcGFjZSB7CisKK2NsYXNzIF9DMkJsb2NrUG9vbENhY2hlIHsKK3B1YmxpYzoKKyAgICBfQzJCbG9ja1Bvb2xDYWNoZSgpIDogbUJsb2NrUG9vbFNlcUlkKEMyQmxvY2tQb29sOjpQTEFURk9STV9TVEFSVCArIDEpIHt9CisKKyAgICBjMl9zdGF0dXNfdCBfY3JlYXRlQmxvY2tQb29sKAorICAgICAgICAgICAgQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjppZF90IGFsbG9jYXRvcklkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyQ29tcG9uZW50PiBjb21wb25lbnQsCisgICAgICAgICAgICBDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCBwb29sSWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICpwb29sKSB7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvclN0b3JlPiBhbGxvY2F0b3JTdG9yZSA9CisgICAgICAgICAgICAgICAgR2V0Q29kZWMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZSgpOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IGFsbG9jYXRvcjsKKyAgICAgICAgYzJfc3RhdHVzX3QgcmVzID0gQzJfTk9UX0ZPVU5EOworCisgICAgICAgIHN3aXRjaChhbGxvY2F0b3JJZCkgeworICAgICAgICAgICAgY2FzZSBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OklPTjoKKyAgICAgICAgICAgIGNhc2UgQzJBbGxvY2F0b3JTdG9yZTo6REVGQVVMVF9MSU5FQVI6CisgICAgICAgICAgICAgICAgcmVzID0gYWxsb2NhdG9yU3RvcmUtPmZldGNoQWxsb2NhdG9yKAorICAgICAgICAgICAgICAgICAgICAgICAgQzJBbGxvY2F0b3JTdG9yZTo6REVGQVVMVF9MSU5FQVIsICZhbGxvY2F0b3IpOworICAgICAgICAgICAgICAgIGlmIChyZXMgPT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiBwdHIgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJQb29sZWRCbG9ja1Bvb2w+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdG9yLCBwb29sSWQpOworICAgICAgICAgICAgICAgICAgICAqcG9vbCA9IHB0cjsKKyAgICAgICAgICAgICAgICAgICAgbUJsb2NrUG9vbHNbcG9vbElkXSA9IHB0cjsKKyAgICAgICAgICAgICAgICAgICAgbUNvbXBvbmVudHNbcG9vbElkXSA9IGNvbXBvbmVudDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTo6R1JBTExPQzoKKyAgICAgICAgICAgIGNhc2UgQzJBbGxvY2F0b3JTdG9yZTo6REVGQVVMVF9HUkFQSElDOgorICAgICAgICAgICAgICAgIHJlcyA9IGFsbG9jYXRvclN0b3JlLT5mZXRjaEFsbG9jYXRvcigKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyQWxsb2NhdG9yU3RvcmU6OkRFRkFVTFRfR1JBUEhJQywgJmFsbG9jYXRvcik7CisgICAgICAgICAgICAgICAgaWYgKHJlcyA9PSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+IHB0ciA9CisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyUG9vbGVkQmxvY2tQb29sPihhbGxvY2F0b3IsIHBvb2xJZCk7CisgICAgICAgICAgICAgICAgICAgICpwb29sID0gcHRyOworICAgICAgICAgICAgICAgICAgICBtQmxvY2tQb29sc1twb29sSWRdID0gcHRyOworICAgICAgICAgICAgICAgICAgICBtQ29tcG9uZW50c1twb29sSWRdID0gY29tcG9uZW50OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjpCVUZGRVJRVUVVRToKKyAgICAgICAgICAgICAgICByZXMgPSBhbGxvY2F0b3JTdG9yZS0+ZmV0Y2hBbGxvY2F0b3IoCisgICAgICAgICAgICAgICAgICAgICAgICBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OkJVRkZFUlFVRVVFLCAmYWxsb2NhdG9yKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzID09IEMyX09LKSB7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gcHRyID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyQnVmZmVyUXVldWVCbG9ja1Bvb2w+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdG9yLCBwb29sSWQpOworICAgICAgICAgICAgICAgICAgICAqcG9vbCA9IHB0cjsKKyAgICAgICAgICAgICAgICAgICAgbUJsb2NrUG9vbHNbcG9vbElkXSA9IHB0cjsKKyAgICAgICAgICAgICAgICAgICAgbUNvbXBvbmVudHNbcG9vbElkXSA9IGNvbXBvbmVudDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIC8vIFRyeSB0byBjcmVhdGUgYmxvY2sgcG9vbCBmcm9tIHBsYXRmb3JtIHN0b3JlIHBsdWdpbnMuCisgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiBwdHI7CisgICAgICAgICAgICAgICAgcmVzID0gQzJQbGF0Zm9ybVN0b3JlUGx1Z2luTG9hZGVyOjpHZXRJbnN0YW5jZSgpLT5jcmVhdGVCbG9ja1Bvb2woCisgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0b3JJZCwgcG9vbElkLCAmcHRyKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzID09IEMyX09LKSB7CisgICAgICAgICAgICAgICAgICAgICpwb29sID0gcHRyOworICAgICAgICAgICAgICAgICAgICBtQmxvY2tQb29sc1twb29sSWRdID0gcHRyOworICAgICAgICAgICAgICAgICAgICBtQ29tcG9uZW50c1twb29sSWRdID0gY29tcG9uZW50OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIGMyX3N0YXR1c190IGNyZWF0ZUJsb2NrUG9vbCgKKyAgICAgICAgICAgIEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTo6aWRfdCBhbGxvY2F0b3JJZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkNvbXBvbmVudD4gY29tcG9uZW50LAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAqcG9vbCkgeworICAgICAgICByZXR1cm4gX2NyZWF0ZUJsb2NrUG9vbChhbGxvY2F0b3JJZCwgY29tcG9uZW50LCBtQmxvY2tQb29sU2VxSWQrKywgcG9vbCk7CisgICAgfQorCisgICAgYm9vbCBnZXRCbG9ja1Bvb2woCisgICAgICAgICAgICBDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCBibG9ja1Bvb2xJZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkNvbXBvbmVudD4gY29tcG9uZW50LAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAqcG9vbCkgeworICAgICAgICAvLyBUT0RPOiB1c2Ugb25lIGl0ZXJhdG9yIGZvciBtdWx0aXBsZSBibG9ja3Bvb2wgdHlwZSBzY2FsYWJpbGl0eS4KKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiBwdHI7CisgICAgICAgIGF1dG8gaXQgPSBtQmxvY2tQb29scy5maW5kKGJsb2NrUG9vbElkKTsKKyAgICAgICAgaWYgKGl0ICE9IG1CbG9ja1Bvb2xzLmVuZCgpKSB7CisgICAgICAgICAgICBwdHIgPSBpdC0+c2Vjb25kLmxvY2soKTsKKyAgICAgICAgICAgIGlmICghcHRyKSB7CisgICAgICAgICAgICAgICAgbUJsb2NrUG9vbHMuZXJhc2UoaXQpOworICAgICAgICAgICAgICAgIG1Db21wb25lbnRzLmVyYXNlKGJsb2NrUG9vbElkKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYXV0byBmb3VuZCA9IG1Db21wb25lbnRzLmZpbmQoYmxvY2tQb29sSWQpOworICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnQgPT0gZm91bmQtPnNlY29uZC5sb2NrKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgKnBvb2wgPSBwdHI7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCitwcml2YXRlOgorICAgIEMyQmxvY2tQb29sOjpsb2NhbF9pZF90IG1CbG9ja1Bvb2xTZXFJZDsKKworICAgIHN0ZDo6bWFwPEMyQmxvY2tQb29sOjpsb2NhbF9pZF90LCBzdGQ6OndlYWtfcHRyPEMyQmxvY2tQb29sPj4gbUJsb2NrUG9vbHM7CisgICAgc3RkOjptYXA8QzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3QsIHN0ZDo6d2Vha19wdHI8Y29uc3QgQzJDb21wb25lbnQ+PiBtQ29tcG9uZW50czsKK307CisKK3N0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8X0MyQmxvY2tQb29sQ2FjaGU+IHNCbG9ja1Bvb2xDYWNoZSA9CisgICAgc3RkOjptYWtlX3VuaXF1ZTxfQzJCbG9ja1Bvb2xDYWNoZT4oKTsKK3N0YXRpYyBzdGQ6Om11dGV4IHNCbG9ja1Bvb2xDYWNoZU11dGV4OworCit9IC8vIGFueW55bW91cyBuYW1lc3BhY2UKKworYzJfc3RhdHVzX3QgR2V0Q29kZWMyQmxvY2tQb29sKAorICAgICAgICBDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCBpZCwgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyQ29tcG9uZW50PiBjb21wb25lbnQsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gKnBvb2wpIHsKKyAgICBwb29sLT5yZXNldCgpOworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKHNCbG9ja1Bvb2xDYWNoZU11dGV4KTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3JTdG9yZT4gYWxsb2NhdG9yU3RvcmUgPSBHZXRDb2RlYzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlKCk7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiBhbGxvY2F0b3I7CisgICAgYzJfc3RhdHVzX3QgcmVzID0gQzJfTk9UX0ZPVU5EOworCisgICAgaWYgKGlkID49IEMyQmxvY2tQb29sOjpQTEFURk9STV9TVEFSVCkgeworICAgICAgICBpZiAoc0Jsb2NrUG9vbENhY2hlLT5nZXRCbG9ja1Bvb2woaWQsIGNvbXBvbmVudCwgcG9vbCkpIHsKKyAgICAgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN3aXRjaCAoaWQpIHsKKyAgICBjYXNlIEMyQmxvY2tQb29sOjpCQVNJQ19MSU5FQVI6CisgICAgICAgIHJlcyA9IGFsbG9jYXRvclN0b3JlLT5mZXRjaEFsbG9jYXRvcihDMkFsbG9jYXRvclN0b3JlOjpERUZBVUxUX0xJTkVBUiwgJmFsbG9jYXRvcik7CisgICAgICAgIGlmIChyZXMgPT0gQzJfT0spIHsKKyAgICAgICAgICAgICpwb29sID0gc3RkOjptYWtlX3NoYXJlZDxDMkJhc2ljTGluZWFyQmxvY2tQb29sPihhbGxvY2F0b3IpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQzJCbG9ja1Bvb2w6OkJBU0lDX0dSQVBISUM6CisgICAgICAgIHJlcyA9IGFsbG9jYXRvclN0b3JlLT5mZXRjaEFsbG9jYXRvcihDMkFsbG9jYXRvclN0b3JlOjpERUZBVUxUX0dSQVBISUMsICZhbGxvY2F0b3IpOworICAgICAgICBpZiAocmVzID09IEMyX09LKSB7CisgICAgICAgICAgICAqcG9vbCA9IHN0ZDo6bWFrZV9zaGFyZWQ8QzJCYXNpY0dyYXBoaWNCbG9ja1Bvb2w+KGFsbG9jYXRvcik7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgLy8gVE9ETzogcmVtb3ZlIHRoaXMuIHRoaXMgaXMgdGVtcG9yYXJ5CisgICAgY2FzZSBDMkJsb2NrUG9vbDo6UExBVEZPUk1fU1RBUlQ6CisgICAgICAgIHJlcyA9IHNCbG9ja1Bvb2xDYWNoZS0+X2NyZWF0ZUJsb2NrUG9vbCgKKyAgICAgICAgICAgICAgICBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OkJVRkZFUlFVRVVFLCBjb21wb25lbnQsIGlkLCBwb29sKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKK2MyX3N0YXR1c190IENyZWF0ZUNvZGVjMkJsb2NrUG9vbCgKKyAgICAgICAgQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjppZF90IGFsbG9jYXRvcklkLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJDb21wb25lbnQ+IGNvbXBvbmVudCwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAqcG9vbCkgeworICAgIHBvb2wtPnJlc2V0KCk7CisKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhzQmxvY2tQb29sQ2FjaGVNdXRleCk7CisgICAgcmV0dXJuIHNCbG9ja1Bvb2xDYWNoZS0+Y3JlYXRlQmxvY2tQb29sKGFsbG9jYXRvcklkLCBjb21wb25lbnQsIHBvb2wpOworfQorCitjbGFzcyBDMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUgOiBwdWJsaWMgQzJDb21wb25lbnRTdG9yZSB7CitwdWJsaWM6CisgICAgdmlydHVhbCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJDb21wb25lbnQ6OlRyYWl0cz4+IGxpc3RDb21wb25lbnRzKCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gZ2V0UGFyYW1SZWZsZWN0b3IoKSBjb25zdCBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIEMyU3RyaW5nIGdldE5hbWUoKSBjb25zdCBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXJ5U3VwcG9ydGVkVmFsdWVzX3NtKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5PiAmZmllbGRzKSBjb25zdCBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXJ5U3VwcG9ydGVkUGFyYW1zX25iKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4gKmNvbnN0IHBhcmFtcykgY29uc3Qgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeV9zbSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiAmc3RhY2tQYXJhbXMsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gJmhlYXBQYXJhbUluZGljZXMsCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+ICpjb25zdCBoZWFwUGFyYW1zKSBjb25zdCBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgICAgIEMyU3RyaW5nIG5hbWUsIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gKmNvbnN0IGludGVyZmFjZSkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVDb21wb25lbnQoCisgICAgICAgICAgICBDMlN0cmluZyBuYW1lLCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+ICpjb25zdCBjb21wb25lbnQpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY29weUJ1ZmZlcigKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCdWZmZXI+IHNyYywgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0J1ZmZlcj4gZHN0KSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNvbmZpZ19zbSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiAmcGFyYW1zLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+ICpjb25zdCBmYWlsdXJlcykgb3ZlcnJpZGU7CisgICAgQzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCk7CisKKyAgICB2aXJ0dWFsIH5DMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKK3ByaXZhdGU6CisKKyAgICAvKioKKyAgICAgKiBBbiBvYmplY3QgZW5jYXBzdWxhdGluZyBhIGxvYWRlZCBjb21wb25lbnQgbW9kdWxlLgorICAgICAqCisgICAgICogXHRvZG8gcHJvdmlkZSBhIHdheSB0byBhZGQgdHJhaXRzIHRvIGtub3duIGNvbXBvbmVudHMgaGVyZSB0byBhdm9pZCBsb2FkaW5nIHRoZSAuc28tcworICAgICAqIGZvciBsaXN0Q29tcG9uZW50cworICAgICAqLworICAgIHN0cnVjdCBDb21wb25lbnRNb2R1bGUgOiBwdWJsaWMgQzJDb21wb25lbnRGYWN0b3J5LAorICAgICAgICAgICAgcHVibGljIHN0ZDo6ZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXM8Q29tcG9uZW50TW9kdWxlPiB7CisgICAgICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlQ29tcG9uZW50KAorICAgICAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiAqY29tcG9uZW50LAorICAgICAgICAgICAgICAgIENvbXBvbmVudERlbGV0ZXIgZGVsZXRlciA9IHN0ZDo6ZGVmYXVsdF9kZWxldGU8QzJDb21wb25lbnQ+KCkpIG92ZXJyaWRlOworICAgICAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gKmludGVyZmFjZSwKKyAgICAgICAgICAgICAgICBJbnRlcmZhY2VEZWxldGVyIGRlbGV0ZXIgPSBzdGQ6OmRlZmF1bHRfZGVsZXRlPEMyQ29tcG9uZW50SW50ZXJmYWNlPigpKSBvdmVycmlkZTsKKworICAgICAgICAvKioKKyAgICAgICAgICogXHJldHVybnMgdGhlIHRyYWl0cyBvZiB0aGUgY29tcG9uZW50IGluIHRoaXMgbW9kdWxlLgorICAgICAgICAgKi8KKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyQ29tcG9uZW50OjpUcmFpdHM+IGdldFRyYWl0cygpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGVzIGFuIHVuaW5pdGlhbGl6ZWQgY29tcG9uZW50IG1vZHVsZS4KKyAgICAgICAgICoKKyAgICAgICAgICogXHBhcmFtIG5hbWVbaW5dICBjb21wb25lbnQgbmFtZS4KKyAgICAgICAgICoKKyAgICAgICAgICogXG5vdGUgT25seSB1c2VkIGJ5IENvbXBvbmVudExvYWRlci4KKyAgICAgICAgICovCisgICAgICAgIENvbXBvbmVudE1vZHVsZSgpCisgICAgICAgICAgICA6IG1Jbml0KEMyX05PX0lOSVQpLAorICAgICAgICAgICAgICBtTGliSGFuZGxlKG51bGxwdHIpLAorICAgICAgICAgICAgICBjcmVhdGVGYWN0b3J5KG51bGxwdHIpLAorICAgICAgICAgICAgICBkZXN0cm95RmFjdG9yeShudWxscHRyKSwKKyAgICAgICAgICAgICAgbUNvbXBvbmVudEZhY3RvcnkobnVsbHB0cikgeworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEluaXRpYWxpemVzIGEgY29tcG9uZW50IG1vZHVsZSB3aXRoIGEgZ2l2ZW4gbGlicmFyeSBwYXRoLiBNdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UuCisgICAgICAgICAqCisgICAgICAgICAqIFxub3RlIE9ubHkgdXNlZCBieSBDb21wb25lbnRMb2FkZXIuCisgICAgICAgICAqCisgICAgICAgICAqIFxwYXJhbSBhbGlhc1tpbl0gICBtb2R1bGUgYWxpYXMKKyAgICAgICAgICogXHBhcmFtIGxpYlBhdGhbaW5dIGxpYnJhcnkgcGF0aAorICAgICAgICAgKgorICAgICAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgY29tcG9uZW50IG1vZHVsZSBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgbG9hZGVkCisgICAgICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIG5vdCBlbm91Z2ggbWVtb3J5IHRvIGxvYWRpbmcgdGhlIGNvbXBvbmVudCBtb2R1bGUKKyAgICAgICAgICogXHJldHZhbCBDMl9OT1RfRk9VTkQgY291bGQgbm90IGxvY2F0ZSB0aGUgY29tcG9uZW50IG1vZHVsZQorICAgICAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCB0aGUgY29tcG9uZW50IG1vZHVsZSBjb3VsZCBub3QgYmUgbG9hZGVkICh1bmV4cGVjdGVkKQorICAgICAgICAgKiBccmV0dmFsIEMyX1JFRlVTRUQgICBwZXJtaXNzaW9uIGRlbmllZCB0byBsb2FkIHRoZSBjb21wb25lbnQgbW9kdWxlICh1bmV4cGVjdGVkKQorICAgICAgICAgKiBccmV0dmFsIEMyX1RJTUVEX09VVCBjb3VsZCBub3QgbG9hZCB0aGUgbW9kdWxlIHdpdGhpbiB0aGUgdGltZSBsaW1pdCAodW5leHBlY3RlZCkKKyAgICAgICAgICovCisgICAgICAgIGMyX3N0YXR1c190IGluaXQoc3RkOjpzdHJpbmcgYWxpYXMsIHN0ZDo6c3RyaW5nIGxpYlBhdGgpOworCisgICAgICAgIHZpcnR1YWwgfkNvbXBvbmVudE1vZHVsZSgpIG92ZXJyaWRlOworCisgICAgcHJvdGVjdGVkOgorICAgICAgICBzdGQ6OnJlY3Vyc2l2ZV9tdXRleCBtTG9jazsgLy8vPCBsb2NrIHByb3RlY3RpbmcgbVRyYWl0cworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ6OlRyYWl0cz4gbVRyYWl0czsgLy8vPCBjYWNoZWQgY29tcG9uZW50IHRyYWl0cworCisgICAgICAgIGMyX3N0YXR1c190IG1Jbml0OyAvLy88IGluaXRpYWxpemF0aW9uIHJlc3VsdAorCisgICAgICAgIHZvaWQgKm1MaWJIYW5kbGU7IC8vLzwgbG9hZGVkIGxpYnJhcnkgaGFuZGxlCisgICAgICAgIEMyQ29tcG9uZW50RmFjdG9yeTo6Q3JlYXRlQ29kZWMyRmFjdG9yeUZ1bmMgY3JlYXRlRmFjdG9yeTsgLy8vPCBsb2FkZWQgY3JlYXRlIGZ1bmN0aW9uCisgICAgICAgIEMyQ29tcG9uZW50RmFjdG9yeTo6RGVzdHJveUNvZGVjMkZhY3RvcnlGdW5jIGRlc3Ryb3lGYWN0b3J5OyAvLy88IGxvYWRlZCBkZXN0cm95IGZ1bmN0aW9uCisgICAgICAgIEMyQ29tcG9uZW50RmFjdG9yeSAqbUNvbXBvbmVudEZhY3Rvcnk7IC8vLzwgbG9hZGVkL2NyZWF0ZWQgY29tcG9uZW50IGZhY3RvcnkKKyAgICB9OworCisgICAgLyoqCisgICAgICogQW4gb2JqZWN0IGVuY2Fwc3VsYXRpbmcgYSBsb2FkYWJsZSBjb21wb25lbnQgbW9kdWxlLgorICAgICAqCisgICAgICogXHRvZG8gbWFrZSB0aGlzIGFsc28gd29yayBmb3IgZW51bWVyYXRpb25zCisgICAgICovCisgICAgc3RydWN0IENvbXBvbmVudExvYWRlciB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBMb2FkIHRoZSBjb21wb25lbnQgbW9kdWxlLgorICAgICAgICAgKgorICAgICAgICAgKiBUaGlzIG1ldGhvZCBzaW1wbHkgcmV0dXJucyB0aGUgY29tcG9uZW50IG1vZHVsZSBpZiBpdCBpcyBhbHJlYWR5IGN1cnJlbnRseSBsb2FkZWQsIG9yCisgICAgICAgICAqIGF0dGVtcHRzIHRvIGxvYWQgaXQgaWYgaXQgaXMgbm90LgorICAgICAgICAgKgorICAgICAgICAgKiBccGFyYW0gbW9kdWxlW291dF0gcG9pbnRlciB0byB0aGUgc2hhcmVkIHBvaW50ZXIgd2hlcmUgdGhlIGxvYWRlZCBtb2R1bGUgc2hhbGwgYmUgc3RvcmVkLgorICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgVGhpcyB3aWxsIGJlIG51bGxwdHIgb24gZXJyb3IuCisgICAgICAgICAqCisgICAgICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBjb21wb25lbnQgbW9kdWxlIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBsb2FkZWQKKyAgICAgICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgbm90IGVub3VnaCBtZW1vcnkgdG8gbG9hZGluZyB0aGUgY29tcG9uZW50IG1vZHVsZQorICAgICAgICAgKiBccmV0dmFsIEMyX05PVF9GT1VORCBjb3VsZCBub3QgbG9jYXRlIHRoZSBjb21wb25lbnQgbW9kdWxlCisgICAgICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHRoZSBjb21wb25lbnQgbW9kdWxlIGNvdWxkIG5vdCBiZSBsb2FkZWQKKyAgICAgICAgICogXHJldHZhbCBDMl9SRUZVU0VEICAgcGVybWlzc2lvbiBkZW5pZWQgdG8gbG9hZCB0aGUgY29tcG9uZW50IG1vZHVsZQorICAgICAgICAgKi8KKyAgICAgICAgYzJfc3RhdHVzX3QgZmV0Y2hNb2R1bGUoc3RkOjpzaGFyZWRfcHRyPENvbXBvbmVudE1vZHVsZT4gKm1vZHVsZSkgeworICAgICAgICAgICAgYzJfc3RhdHVzX3QgcmVzID0gQzJfT0s7CisgICAgICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPENvbXBvbmVudE1vZHVsZT4gbG9jYWxNb2R1bGUgPSBtTW9kdWxlLmxvY2soKTsKKyAgICAgICAgICAgIGlmIChsb2NhbE1vZHVsZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgbG9jYWxNb2R1bGUgPSBzdGQ6Om1ha2Vfc2hhcmVkPENvbXBvbmVudE1vZHVsZT4oKTsKKyAgICAgICAgICAgICAgICByZXMgPSBsb2NhbE1vZHVsZS0+aW5pdChtQWxpYXMsIG1MaWJQYXRoKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzID09IEMyX09LKSB7CisgICAgICAgICAgICAgICAgICAgIG1Nb2R1bGUgPSBsb2NhbE1vZHVsZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqbW9kdWxlID0gbG9jYWxNb2R1bGU7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZXMgYSBjb21wb25lbnQgbG9hZGVyIGZvciBhIHNwZWNpZmljIGxpYnJhcnkgcGF0aCAob3IgbmFtZSkuCisgICAgICAgICAqLworICAgICAgICBDb21wb25lbnRMb2FkZXIoc3RkOjpzdHJpbmcgYWxpYXMsIHN0ZDo6c3RyaW5nIGxpYlBhdGgpCisgICAgICAgICAgICA6IG1BbGlhcyhhbGlhcyksIG1MaWJQYXRoKGxpYlBhdGgpIHt9CisKKyAgICBwcml2YXRlOgorICAgICAgICBzdGQ6Om11dGV4IG1NdXRleDsgLy8vPCBtdXRleCBndWFyZGluZyB0aGUgbW9kdWxlCisgICAgICAgIHN0ZDo6d2Vha19wdHI8Q29tcG9uZW50TW9kdWxlPiBtTW9kdWxlOyAvLy88IHdlYWsgcmVmZXJlbmNlIHRvIHRoZSBsb2FkZWQgbW9kdWxlCisgICAgICAgIHN0ZDo6c3RyaW5nIG1BbGlhczsgLy8vPCBjb21wb25lbnQgYWxpYXMKKyAgICAgICAgc3RkOjpzdHJpbmcgbUxpYlBhdGg7IC8vLzwgbGlicmFyeSBwYXRoCisgICAgfTsKKworICAgIHN0cnVjdCBJbnRlcmZhY2UgOiBwdWJsaWMgQzJJbnRlcmZhY2VIZWxwZXIgeworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdG9yZUlvblVzYWdlSW5mbz4gbUlvblVzYWdlSW5mbzsKKworICAgICAgICBJbnRlcmZhY2Uoc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiByZWZsZWN0b3IpCisgICAgICAgICAgICA6IEMySW50ZXJmYWNlSGVscGVyKHJlZmxlY3RvcikgeworICAgICAgICAgICAgc2V0RGVyaXZlZEluc3RhbmNlKHRoaXMpOworCisgICAgICAgICAgICBzdHJ1Y3QgU2V0dGVyIHsKKyAgICAgICAgICAgICAgICBzdGF0aWMgQzJSIHNldElvblVzYWdlKGJvb2wgLyogbWF5QmxvY2sgKi8sIEMyUDxDMlN0b3JlSW9uVXNhZ2VJbmZvPiAmbWUpIHsKKyAgICAgICAgICAgICAgICAgICAgbWUuc2V0KCkuaGVhcE1hc2sgPSB+MDsKKyAgICAgICAgICAgICAgICAgICAgbWUuc2V0KCkuYWxsb2NGbGFncyA9IDA7CisgICAgICAgICAgICAgICAgICAgIG1lLnNldCgpLm1pbkFsaWdubWVudCA9IDA7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1Jb25Vc2FnZUluZm8sICJpb24tdXNhZ2UiKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdG9yZUlvblVzYWdlSW5mbygpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Jb25Vc2FnZUluZm8sIHVzYWdlKS5mbGFncyh7QzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQgfCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEV9KSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Jb25Vc2FnZUluZm8sIGNhcGFjaXR5KS5pblJhbmdlKDAsIFVJTlQzMl9NQVgsIDEwMjQpLAorICAgICAgICAgICAgICAgICAgICBDMkYobUlvblVzYWdlSW5mbywgaGVhcE1hc2spLmFueSgpLAorICAgICAgICAgICAgICAgICAgICBDMkYobUlvblVzYWdlSW5mbywgYWxsb2NGbGFncykuZmxhZ3Moe30pLAorICAgICAgICAgICAgICAgICAgICBDMkYobUlvblVzYWdlSW5mbywgbWluQWxpZ25tZW50KS5lcXVhbFRvKDApCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI6OnNldElvblVzYWdlKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIGNvbXBvbmVudCBsb2FkZXIgZm9yIGEgY29tcG9uZW50LgorICAgICAqCisgICAgICogXHJldHVybiBhIG5vbi1yZWYtaG9sZGluZyBwb2ludGVyIHRvIHRoZSBjb21wb25lbnQgbG9hZGVyLgorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIGNvbXBvbmVudCBsb2FkZXIgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IHJldHJpZXZlZAorICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIG5vdCBlbm91Z2ggbWVtb3J5IHRvIGxvY2F0ZSB0aGUgY29tcG9uZW50IGxvYWRlcgorICAgICAqIFxyZXR2YWwgQzJfTk9UX0ZPVU5EIGNvdWxkIG5vdCBsb2NhdGUgdGhlIGNvbXBvbmVudCB0byBiZSBsb2FkZWQKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCB0aGUgY29tcG9uZW50IGxvYWRlciBjb3VsZCBub3QgYmUgaWRlbnRpZmllZCBkdWUgdG8gc29tZSBtb2R1bGVzIGJlaW5nCisgICAgICogICAgICAgICAgICAgICAgICAgICAgY29ycnVwdGVkICh0aGlzIGNhbiBoYXBwZW4gaWYgdGhlIG5hbWUgZG9lcyBub3QgcmVmZXIgdG8gYW4gYWxyZWFkeQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIGlkZW50aWZpZWQgY29tcG9uZW50IGJ1dCBzb21lIGNvbXBvbmVudHMgY291bGQgbm90IGJlIGxvYWRlZCBkdWUgdG8KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBiYWQgbGlicmFyeSkKKyAgICAgKiBccmV0dmFsIEMyX1JFRlVTRUQgICBwZXJtaXNzaW9uIGRlbmllZCB0byBmaW5kIHRoZSBjb21wb25lbnQgbG9hZGVyIGZvciB0aGUgbmFtZWQgY29tcG9uZW50CisgICAgICogICAgICAgICAgICAgICAgICAgICAgKHRoaXMgY2FuIGhhcHBlbiBpZiB0aGUgbmFtZSBkb2VzIG5vdCByZWZlciB0byBhbiBhbHJlYWR5IGlkZW50aWZpZWQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQgYnV0IHNvbWUgY29tcG9uZW50cyBjb3VsZCBub3QgYmUgbG9hZGVkIGR1ZSB0byBsYWNrIG9mCisgICAgICogICAgICAgICAgICAgICAgICAgICAgcGVybWlzc2lvbnMpCisgICAgICovCisgICAgYzJfc3RhdHVzX3QgZmluZENvbXBvbmVudChDMlN0cmluZyBuYW1lLCBDb21wb25lbnRMb2FkZXIgKipsb2FkZXIpOworCisgICAgc3RkOjptYXA8QzJTdHJpbmcsIENvbXBvbmVudExvYWRlcj4gbUNvbXBvbmVudHM7IC8vLzwgbWFwIG9mIG5hbWUgLT4gY29tcG9uZW50cworICAgIHN0ZDo6dmVjdG9yPEMyU3RyaW5nPiBtQ29tcG9uZW50c0xpc3Q7IC8vLzwgbGlzdCBvZiBjb21wb25lbnRzCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiBtUmVmbGVjdG9yOworICAgIEludGVyZmFjZSBtSW50ZXJmYWNlOworfTsKKworYzJfc3RhdHVzX3QgQzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlOjpDb21wb25lbnRNb2R1bGU6OmluaXQoCisgICAgICAgIHN0ZDo6c3RyaW5nIGFsaWFzLCBzdGQ6OnN0cmluZyBsaWJQYXRoKSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIEFMT0dWKCJsb2FkaW5nIGRsbCIpOworICAgIG1MaWJIYW5kbGUgPSBkbG9wZW4obGliUGF0aC5jX3N0cigpLCBSVExEX05PV3xSVExEX05PREVMRVRFKTsKKyAgICBpZiAobUxpYkhhbmRsZSA9PSBudWxscHRyKSB7CisgICAgICAgIC8vIGNvdWxkIGJlIGFjY2Vzcy9zeW1ib2wgb3Igc2ltcGx5IG5vdCBiZWluZyB0aGVyZQorICAgICAgICBBTE9HRCgiY291bGQgbm90IGRsb3BlbiAlczogJXMiLCBsaWJQYXRoLmNfc3RyKCksIGRsZXJyb3IoKSk7CisgICAgICAgIG1Jbml0ID0gQzJfQ09SUlVQVEVEOworICAgIH0gZWxzZSB7CisgICAgICAgIGNyZWF0ZUZhY3RvcnkgPQorICAgICAgICAgICAgKEMyQ29tcG9uZW50RmFjdG9yeTo6Q3JlYXRlQ29kZWMyRmFjdG9yeUZ1bmMpZGxzeW0obUxpYkhhbmRsZSwgIkNyZWF0ZUNvZGVjMkZhY3RvcnkiKTsKKyAgICAgICAgZGVzdHJveUZhY3RvcnkgPQorICAgICAgICAgICAgKEMyQ29tcG9uZW50RmFjdG9yeTo6RGVzdHJveUNvZGVjMkZhY3RvcnlGdW5jKWRsc3ltKG1MaWJIYW5kbGUsICJEZXN0cm95Q29kZWMyRmFjdG9yeSIpOworCisgICAgICAgIG1Db21wb25lbnRGYWN0b3J5ID0gY3JlYXRlRmFjdG9yeSgpOworICAgICAgICBpZiAobUNvbXBvbmVudEZhY3RvcnkgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0QoImNvdWxkIG5vdCBjcmVhdGUgZmFjdG9yeSBpbiAlcyIsIGxpYlBhdGguY19zdHIoKSk7CisgICAgICAgICAgICBtSW5pdCA9IEMyX05PX01FTU9SWTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1Jbml0ID0gQzJfT0s7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKG1Jbml0ICE9IEMyX09LKSB7CisgICAgICAgIHJldHVybiBtSW5pdDsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+IGludGY7CisgICAgYzJfc3RhdHVzX3QgcmVzID0gY3JlYXRlSW50ZXJmYWNlKDAsICZpbnRmKTsKKyAgICBpZiAocmVzICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dEKCJmYWlsZWQgdG8gY3JlYXRlIGludGVyZmFjZTogJWQiLCByZXMpOworICAgICAgICByZXR1cm4gbUluaXQ7CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50OjpUcmFpdHM+IHRyYWl0cyhuZXcgKHN0ZDo6bm90aHJvdykgQzJDb21wb25lbnQ6OlRyYWl0cyk7CisgICAgaWYgKHRyYWl0cykgeworICAgICAgICBpZiAoYWxpYXMgIT0gaW50Zi0+Z2V0TmFtZSgpKSB7CisgICAgICAgICAgICBBTE9HVigiJXMgaXMgYWxpYXMgdG8gJXMiLCBhbGlhcy5jX3N0cigpLCBpbnRmLT5nZXROYW1lKCkuY19zdHIoKSk7CisgICAgICAgIH0KKyAgICAgICAgdHJhaXRzLT5uYW1lID0gYWxpYXM7CisgICAgICAgIC8vIFRPRE86IGdldCB0aGlzIGZyb20gaW50ZXJmYWNlIHByb3Blcmx5LgorICAgICAgICBib29sIGVuY29kZXIgPSAodHJhaXRzLT5uYW1lLmZpbmQoImVuY29kZXIiKSAhPSBzdGQ6OnN0cmluZzo6bnBvcyk7CisgICAgICAgIHVpbnQzMl90IG1lZGlhVHlwZUluZGV4ID0gZW5jb2RlciA/IEMyUG9ydE1pbWVDb25maWc6Om91dHB1dDo6UEFSQU1fVFlQRQorICAgICAgICAgICAgICAgIDogQzJQb3J0TWltZUNvbmZpZzo6aW5wdXQ6OlBBUkFNX1RZUEU7CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gcGFyYW1zOworICAgICAgICByZXMgPSBpbnRmLT5xdWVyeV92Yih7fSwgeyBtZWRpYVR5cGVJbmRleCB9LCBDMl9NQVlfQkxPQ0ssICZwYXJhbXMpOworICAgICAgICBpZiAocmVzICE9IEMyX09LKSB7CisgICAgICAgICAgICBBTE9HRCgiZmFpbGVkIHRvIHF1ZXJ5IGludGVyZmFjZTogJWQiLCByZXMpOworICAgICAgICAgICAgcmV0dXJuIG1Jbml0OworICAgICAgICB9CisgICAgICAgIGlmIChwYXJhbXMuc2l6ZSgpICE9IDF1KSB7CisgICAgICAgICAgICBBTE9HRCgiZmFpbGVkIHRvIHF1ZXJ5IGludGVyZmFjZTogdW5leHBlY3RlZCB2ZWN0b3Igc2l6ZTogJXp1IiwgcGFyYW1zLnNpemUoKSk7CisgICAgICAgICAgICByZXR1cm4gbUluaXQ7CisgICAgICAgIH0KKyAgICAgICAgQzJQb3J0TWltZUNvbmZpZyAqbWVkaWFUeXBlQ29uZmlnID0gKEMyUG9ydE1pbWVDb25maWcgKikocGFyYW1zWzBdLmdldCgpKTsKKyAgICAgICAgaWYgKG1lZGlhVHlwZUNvbmZpZyA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRCgiZmFpbGVkIHRvIHF1ZXJ5IG1lZGlhIHR5cGUiKTsKKyAgICAgICAgICAgIHJldHVybiBtSW5pdDsKKyAgICAgICAgfQorICAgICAgICB0cmFpdHMtPm1lZGlhVHlwZSA9IG1lZGlhVHlwZUNvbmZpZy0+bS52YWx1ZTsKKyAgICAgICAgLy8gVE9ETzogZ2V0IHRoaXMgcHJvcGVybHkuCisgICAgICAgIHRyYWl0cy0+cmFuayA9IDB4MjAwOworCisgICAgICAgIC8vIFRPRE86IGRlZmluZSB0aGVzZSB2YWx1ZXMgcHJvcGVybHkKKyAgICAgICAgYm9vbCBkZWNvZGVyID0gKHRyYWl0cy0+bmFtZS5maW5kKCJkZWNvZGVyIikgIT0gc3RkOjpzdHJpbmc6Om5wb3MpOworICAgICAgICB0cmFpdHMtPmtpbmQgPQorICAgICAgICAgICAgICAgIGRlY29kZXIgPyBDMkNvbXBvbmVudDo6S0lORF9ERUNPREVSIDoKKyAgICAgICAgICAgICAgICBlbmNvZGVyID8gQzJDb21wb25lbnQ6OktJTkRfRU5DT0RFUiA6CisgICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OktJTkRfT1RIRVI7CisgICAgICAgIGlmIChzdHJuY21wKHRyYWl0cy0+bWVkaWFUeXBlLmNfc3RyKCksICJhdWRpby8iLCA2KSA9PSAwKSB7CisgICAgICAgICAgICB0cmFpdHMtPmRvbWFpbiA9IEMyQ29tcG9uZW50OjpET01BSU5fQVVESU87CisgICAgICAgIH0gZWxzZSBpZiAoc3RybmNtcCh0cmFpdHMtPm1lZGlhVHlwZS5jX3N0cigpLCAidmlkZW8vIiwgNikgPT0gMCkgeworICAgICAgICAgICAgdHJhaXRzLT5kb21haW4gPSBDMkNvbXBvbmVudDo6RE9NQUlOX1ZJREVPOworICAgICAgICB9IGVsc2UgaWYgKHN0cm5jbXAodHJhaXRzLT5tZWRpYVR5cGUuY19zdHIoKSwgImltYWdlLyIsIDYpID09IDApIHsKKyAgICAgICAgICAgIHRyYWl0cy0+ZG9tYWluID0gQzJDb21wb25lbnQ6OkRPTUFJTl9JTUFHRTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRyYWl0cy0+ZG9tYWluID0gQzJDb21wb25lbnQ6OkRPTUFJTl9PVEhFUjsKKyAgICAgICAgfQorICAgIH0KKyAgICBtVHJhaXRzID0gdHJhaXRzOworCisgICAgcmV0dXJuIG1Jbml0OworfQorCitDMlBsYXRmb3JtQ29tcG9uZW50U3RvcmU6OkNvbXBvbmVudE1vZHVsZTo6fkNvbXBvbmVudE1vZHVsZSgpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgaWYgKGRlc3Ryb3lGYWN0b3J5ICYmIG1Db21wb25lbnRGYWN0b3J5KSB7CisgICAgICAgIGRlc3Ryb3lGYWN0b3J5KG1Db21wb25lbnRGYWN0b3J5KTsKKyAgICB9CisgICAgaWYgKG1MaWJIYW5kbGUpIHsKKyAgICAgICAgQUxPR1YoInVubG9hZGluZyBkbGwiKTsKKyAgICAgICAgZGxjbG9zZShtTGliSGFuZGxlKTsKKyAgICB9Cit9CisKK2MyX3N0YXR1c190IEMyUGxhdGZvcm1Db21wb25lbnRTdG9yZTo6Q29tcG9uZW50TW9kdWxlOjpjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgIGMyX25vZGVfaWRfdCBpZCwgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiAqaW50ZXJmYWNlLAorICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoOjpDMkNvbXBvbmVudEludGVyZmFjZSopPiBkZWxldGVyKSB7CisgICAgaW50ZXJmYWNlLT5yZXNldCgpOworICAgIGlmIChtSW5pdCAhPSBDMl9PSykgeworICAgICAgICByZXR1cm4gbUluaXQ7CisgICAgfQorICAgIHN0ZDo6c2hhcmVkX3B0cjxDb21wb25lbnRNb2R1bGU+IG1vZHVsZSA9IHNoYXJlZF9mcm9tX3RoaXMoKTsKKyAgICBjMl9zdGF0dXNfdCByZXMgPSBtQ29tcG9uZW50RmFjdG9yeS0+Y3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgaWQsIGludGVyZmFjZSwgW21vZHVsZSwgZGVsZXRlcl0oQzJDb21wb25lbnRJbnRlcmZhY2UgKnApIG11dGFibGUgeworICAgICAgICAgICAgICAgIC8vIGNhcHR1cmUgbW9kdWxlIHNvIHRoYXQgd2UgZW5zdXJlIHdlIHN0aWxsIGhhdmUgaXQgd2hpbGUgZGVsZXRpbmcgaW50ZXJmYWNlCisgICAgICAgICAgICAgICAgZGVsZXRlcihwKTsgLy8gZGVsZXRlIGludGVyZmFjZSBmaXJzdAorICAgICAgICAgICAgICAgIG1vZHVsZS5yZXNldCgpOyAvLyByZW1vdmUgbW9kdWxlIHJlZiAobm90IHRlY2huaWNhbGx5IG5lZWRlZCkKKyAgICB9KTsKKyAgICByZXR1cm4gcmVzOworfQorCitjMl9zdGF0dXNfdCBDMlBsYXRmb3JtQ29tcG9uZW50U3RvcmU6OkNvbXBvbmVudE1vZHVsZTo6Y3JlYXRlQ29tcG9uZW50KAorICAgICAgICBjMl9ub2RlX2lkX3QgaWQsIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4gKmNvbXBvbmVudCwKKyAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKDo6QzJDb21wb25lbnQqKT4gZGVsZXRlcikgeworICAgIGNvbXBvbmVudC0+cmVzZXQoKTsKKyAgICBpZiAobUluaXQgIT0gQzJfT0spIHsKKyAgICAgICAgcmV0dXJuIG1Jbml0OworICAgIH0KKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q29tcG9uZW50TW9kdWxlPiBtb2R1bGUgPSBzaGFyZWRfZnJvbV90aGlzKCk7CisgICAgYzJfc3RhdHVzX3QgcmVzID0gbUNvbXBvbmVudEZhY3RvcnktPmNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgICAgIGlkLCBjb21wb25lbnQsIFttb2R1bGUsIGRlbGV0ZXJdKEMyQ29tcG9uZW50ICpwKSBtdXRhYmxlIHsKKyAgICAgICAgICAgICAgICAvLyBjYXB0dXJlIG1vZHVsZSBzbyB0aGF0IHdlIGVuc3VyZSB3ZSBzdGlsbCBoYXZlIGl0IHdoaWxlIGRlbGV0aW5nIGNvbXBvbmVudAorICAgICAgICAgICAgICAgIGRlbGV0ZXIocCk7IC8vIGRlbGV0ZSBjb21wb25lbnQgZmlyc3QKKyAgICAgICAgICAgICAgICBtb2R1bGUucmVzZXQoKTsgLy8gcmVtb3ZlIG1vZHVsZSByZWYgKG5vdCB0ZWNobmljYWxseSBuZWVkZWQpCisgICAgfSk7CisgICAgcmV0dXJuIHJlczsKK30KKworc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyQ29tcG9uZW50OjpUcmFpdHM+IEMyUGxhdGZvcm1Db21wb25lbnRTdG9yZTo6Q29tcG9uZW50TW9kdWxlOjpnZXRUcmFpdHMoKSB7CisgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gbG9jayhtTG9jayk7CisgICAgcmV0dXJuIG1UcmFpdHM7Cit9CisKK0MyUGxhdGZvcm1Db21wb25lbnRTdG9yZTo6QzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCkKKyAgICA6IG1SZWZsZWN0b3Ioc3RkOjptYWtlX3NoYXJlZDxDMlJlZmxlY3RvckhlbHBlcj4oKSksCisgICAgICBtSW50ZXJmYWNlKG1SZWZsZWN0b3IpIHsKKworICAgIGF1dG8gZW1wbGFjZSA9IFt0aGlzXShjb25zdCBjaGFyICphbGlhcywgY29uc3QgY2hhciAqbGliUGF0aCkgeworICAgICAgICAvLyBDb21wb25lbnRMb2FkZXIgaXMgbmVpdGhlciBjb3BpYWJsZSBub3IgbW92YWJsZSwgc28gaXQgbXVzdCBiZQorICAgICAgICAvLyBjb25zdHJ1Y3RlZCBpbi1wbGFjZS4gTm93IENvbXBvbmVudExvYWRlciB0YWtlcyB0d28gYXJndW1lbnRzIGluCisgICAgICAgIC8vIGNvbnN0cnVjdG9yLCBzbyB3ZSBuZWVkIHRvIHVzZSBwaWVjZXdpc2VfY29uc3RydWN0IHRvIGFjaGlldmUgdGhpcworICAgICAgICAvLyBiZWhhdmlvci4KKyAgICAgICAgbUNvbXBvbmVudHMuZW1wbGFjZSgKKyAgICAgICAgICAgICAgICBzdGQ6OnBpZWNld2lzZV9jb25zdHJ1Y3QsCisgICAgICAgICAgICAgICAgc3RkOjpmb3J3YXJkX2FzX3R1cGxlKGFsaWFzKSwKKyAgICAgICAgICAgICAgICBzdGQ6OmZvcndhcmRfYXNfdHVwbGUoYWxpYXMsIGxpYlBhdGgpKTsKKyAgICAgICAgbUNvbXBvbmVudHNMaXN0LmVtcGxhY2VfYmFjayhhbGlhcyk7CisgICAgfTsKKyAgICAvLyBUT0RPOiBtb3ZlIHRoaXMgYWxzbyBpbnRvIGEgLnNvIHNvIGl0IGNhbiBiZSB1cGRhdGVkCisgICAgZW1wbGFjZSgiYzIuYW5kcm9pZC5hdmMuZGVjb2RlciIsICJsaWJzdGFnZWZyaWdodF9zb2Z0X2MyYXZjZGVjLnNvIik7CisgICAgZW1wbGFjZSgiYzIuYW5kcm9pZC5hdmMuZW5jb2RlciIsICJsaWJzdGFnZWZyaWdodF9zb2Z0X2MyYXZjZW5jLnNvIik7CisgICAgZW1wbGFjZSgiYzIuYW5kcm9pZC5hYWMuZGVjb2RlciIsICJsaWJzdGFnZWZyaWdodF9zb2Z0X2MyYWFjZGVjLnNvIik7CisgICAgZW1wbGFjZSgiYzIuYW5kcm9pZC5hYWMuZW5jb2RlciIsICJsaWJzdGFnZWZyaWdodF9zb2Z0X2MyYWFjZW5jLnNvIik7CisgICAgZW1wbGFjZSgiYzIuYW5kcm9pZC5hbXJuYi5kZWNvZGVyIiwgImxpYnN0YWdlZnJpZ2h0X3NvZnRfYzJhbXJuYmRlYy5zbyIpOworICAgIGVtcGxhY2UoImMyLmFuZHJvaWQuYW1ybmIuZW5jb2RlciIsICJsaWJzdGFnZWZyaWdodF9zb2Z0X2MyYW1ybmJlbmMuc28iKTsKKyAgICBlbXBsYWNlKCJjMi5hbmRyb2lkLmFtcndiLmRlY29kZXIiLCAibGlic3RhZ2VmcmlnaHRfc29mdF9jMmFtcndiZGVjLnNvIik7CisgICAgZW1wbGFjZSgiYzIuYW5kcm9pZC5hbXJ3Yi5lbmNvZGVyIiwgImxpYnN0YWdlZnJpZ2h0X3NvZnRfYzJhbXJ3YmVuYy5zbyIpOworICAgIGVtcGxhY2UoImMyLmFuZHJvaWQuaGV2Yy5kZWNvZGVyIiwgImxpYnN0YWdlZnJpZ2h0X3NvZnRfYzJoZXZjZGVjLnNvIik7CisgICAgZW1wbGFjZSgiYzIuYW5kcm9pZC5nNzExLmFsYXcuZGVjb2RlciIsICJsaWJzdGFnZWZyaWdodF9zb2Z0X2MyZzcxMWFsYXdkZWMuc28iKTsKKyAgICBlbXBsYWNlKCJjMi5hbmRyb2lkLmc3MTEubWxhdy5kZWNvZGVyIiwgImxpYnN0YWdlZnJpZ2h0X3NvZnRfYzJnNzExbWxhd2RlYy5zbyIpOworICAgIGVtcGxhY2UoImMyLmFuZHJvaWQubXBlZzIuZGVjb2RlciIsICJsaWJzdGFnZWZyaWdodF9zb2Z0X2MybXBlZzJkZWMuc28iKTsKKyAgICBlbXBsYWNlKCJjMi5hbmRyb2lkLmgyNjMuZGVjb2RlciIsICJsaWJzdGFnZWZyaWdodF9zb2Z0X2MyaDI2M2RlYy5zbyIpOworICAgIGVtcGxhY2UoImMyLmFuZHJvaWQuaDI2My5lbmNvZGVyIiwgImxpYnN0YWdlZnJpZ2h0X3NvZnRfYzJoMjYzZW5jLnNvIik7CisgICAgZW1wbGFjZSgiYzIuYW5kcm9pZC5tcGVnNC5kZWNvZGVyIiwgImxpYnN0YWdlZnJpZ2h0X3NvZnRfYzJtcGVnNGRlYy5zbyIpOworICAgIGVtcGxhY2UoImMyLmFuZHJvaWQubXBlZzQuZW5jb2RlciIsICJsaWJzdGFnZWZyaWdodF9zb2Z0X2MybXBlZzRlbmMuc28iKTsKKyAgICBlbXBsYWNlKCJjMi5hbmRyb2lkLm1wMy5kZWNvZGVyIiwgImxpYnN0YWdlZnJpZ2h0X3NvZnRfYzJtcDNkZWMuc28iKTsKKyAgICBlbXBsYWNlKCJjMi5hbmRyb2lkLnZvcmJpcy5kZWNvZGVyIiwgImxpYnN0YWdlZnJpZ2h0X3NvZnRfYzJ2b3JiaXNkZWMuc28iKTsKKyAgICBlbXBsYWNlKCJjMi5hbmRyb2lkLm9wdXMuZGVjb2RlciIsICJsaWJzdGFnZWZyaWdodF9zb2Z0X2Myb3B1c2RlYy5zbyIpOworICAgIGVtcGxhY2UoImMyLmFuZHJvaWQudnA4LmRlY29kZXIiLCAibGlic3RhZ2VmcmlnaHRfc29mdF9jMnZwOGRlYy5zbyIpOworICAgIGVtcGxhY2UoImMyLmFuZHJvaWQudnA5LmRlY29kZXIiLCAibGlic3RhZ2VmcmlnaHRfc29mdF9jMnZwOWRlYy5zbyIpOworICAgIGVtcGxhY2UoImMyLmFuZHJvaWQudnA4LmVuY29kZXIiLCAibGlic3RhZ2VmcmlnaHRfc29mdF9jMnZwOGVuYy5zbyIpOworICAgIGVtcGxhY2UoImMyLmFuZHJvaWQudnA5LmVuY29kZXIiLCAibGlic3RhZ2VmcmlnaHRfc29mdF9jMnZwOWVuYy5zbyIpOworICAgIGVtcGxhY2UoImMyLmFuZHJvaWQucmF3LmRlY29kZXIiLCAibGlic3RhZ2VmcmlnaHRfc29mdF9jMnJhd2RlYy5zbyIpOworICAgIGVtcGxhY2UoImMyLmFuZHJvaWQuZmxhYy5kZWNvZGVyIiwgImxpYnN0YWdlZnJpZ2h0X3NvZnRfYzJmbGFjZGVjLnNvIik7CisgICAgZW1wbGFjZSgiYzIuYW5kcm9pZC5mbGFjLmVuY29kZXIiLCAibGlic3RhZ2VmcmlnaHRfc29mdF9jMmZsYWNlbmMuc28iKTsKKyAgICBlbXBsYWNlKCJjMi5hbmRyb2lkLmdzbS5kZWNvZGVyIiwgImxpYnN0YWdlZnJpZ2h0X3NvZnRfYzJnc21kZWMuc28iKTsKKyAgICBlbXBsYWNlKCJjMi5hbmRyb2lkLnhhYWMuZGVjb2RlciIsICJsaWJzdGFnZWZyaWdodF9zb2Z0X2MyeGFhY2RlYy5zbyIpOworCisgICAgLy8gIkFsaWFzZXMiCisgICAgLy8gVE9ETzogdXNlIGFsaWFzZXMgcHJvcGVyIGZyb20gQzJDb21wb25lbnQ6OlRyYWl0cworICAgIGVtcGxhY2UoIk9NWC5nb29nbGUuaDI2NC5kZWNvZGVyIiwgImxpYnN0YWdlZnJpZ2h0X3NvZnRfYzJhdmNkZWMuc28iKTsKKyAgICBlbXBsYWNlKCJPTVguZ29vZ2xlLmgyNjQuZW5jb2RlciIsICJsaWJzdGFnZWZyaWdodF9zb2Z0X2MyYXZjZW5jLnNvIik7CisgICAgZW1wbGFjZSgiT01YLmdvb2dsZS5hYWMuZGVjb2RlciIsICJsaWJzdGFnZWZyaWdodF9zb2Z0X2MyYWFjZGVjLnNvIik7CisgICAgZW1wbGFjZSgiT01YLmdvb2dsZS5hYWMuZW5jb2RlciIsICJsaWJzdGFnZWZyaWdodF9zb2Z0X2MyYWFjZW5jLnNvIik7CisgICAgZW1wbGFjZSgiT01YLmdvb2dsZS5hbXJuYi5kZWNvZGVyIiwgImxpYnN0YWdlZnJpZ2h0X3NvZnRfYzJhbXJuYmRlYy5zbyIpOworICAgIGVtcGxhY2UoIk9NWC5nb29nbGUuYW1ybmIuZW5jb2RlciIsICJsaWJzdGFnZWZyaWdodF9zb2Z0X2MyYW1ybmJlbmMuc28iKTsKKyAgICBlbXBsYWNlKCJPTVguZ29vZ2xlLmFtcndiLmRlY29kZXIiLCAibGlic3RhZ2VmcmlnaHRfc29mdF9jMmFtcndiZGVjLnNvIik7CisgICAgZW1wbGFjZSgiT01YLmdvb2dsZS5hbXJ3Yi5lbmNvZGVyIiwgImxpYnN0YWdlZnJpZ2h0X3NvZnRfYzJhbXJ3YmVuYy5zbyIpOworICAgIGVtcGxhY2UoIk9NWC5nb29nbGUuaGV2Yy5kZWNvZGVyIiwgImxpYnN0YWdlZnJpZ2h0X3NvZnRfYzJoZXZjZGVjLnNvIik7CisgICAgZW1wbGFjZSgiT01YLmdvb2dsZS5nNzExLmFsYXcuZGVjb2RlciIsICJsaWJzdGFnZWZyaWdodF9zb2Z0X2MyZzcxMWFsYXdkZWMuc28iKTsKKyAgICBlbXBsYWNlKCJPTVguZ29vZ2xlLmc3MTEubWxhdy5kZWNvZGVyIiwgImxpYnN0YWdlZnJpZ2h0X3NvZnRfYzJnNzExbWxhd2RlYy5zbyIpOworICAgIGVtcGxhY2UoIk9NWC5nb29nbGUubXBlZzIuZGVjb2RlciIsICJsaWJzdGFnZWZyaWdodF9zb2Z0X2MybXBlZzJkZWMuc28iKTsKKyAgICBlbXBsYWNlKCJPTVguZ29vZ2xlLmgyNjMuZGVjb2RlciIsICJsaWJzdGFnZWZyaWdodF9zb2Z0X2MyaDI2M2RlYy5zbyIpOworICAgIGVtcGxhY2UoIk9NWC5nb29nbGUuaDI2My5lbmNvZGVyIiwgImxpYnN0YWdlZnJpZ2h0X3NvZnRfYzJoMjYzZW5jLnNvIik7CisgICAgZW1wbGFjZSgiT01YLmdvb2dsZS5tcGVnNC5kZWNvZGVyIiwgImxpYnN0YWdlZnJpZ2h0X3NvZnRfYzJtcGVnNGRlYy5zbyIpOworICAgIGVtcGxhY2UoIk9NWC5nb29nbGUubXBlZzQuZW5jb2RlciIsICJsaWJzdGFnZWZyaWdodF9zb2Z0X2MybXBlZzRlbmMuc28iKTsKKyAgICBlbXBsYWNlKCJPTVguZ29vZ2xlLm1wMy5kZWNvZGVyIiwgImxpYnN0YWdlZnJpZ2h0X3NvZnRfYzJtcDNkZWMuc28iKTsKKyAgICBlbXBsYWNlKCJPTVguZ29vZ2xlLnZvcmJpcy5kZWNvZGVyIiwgImxpYnN0YWdlZnJpZ2h0X3NvZnRfYzJ2b3JiaXNkZWMuc28iKTsKKyAgICBlbXBsYWNlKCJPTVguZ29vZ2xlLm9wdXMuZGVjb2RlciIsICJsaWJzdGFnZWZyaWdodF9zb2Z0X2Myb3B1c2RlYy5zbyIpOworICAgIGVtcGxhY2UoIk9NWC5nb29nbGUudnA4LmRlY29kZXIiLCAibGlic3RhZ2VmcmlnaHRfc29mdF9jMnZwOGRlYy5zbyIpOworICAgIGVtcGxhY2UoIk9NWC5nb29nbGUudnA5LmRlY29kZXIiLCAibGlic3RhZ2VmcmlnaHRfc29mdF9jMnZwOWRlYy5zbyIpOworICAgIGVtcGxhY2UoIk9NWC5nb29nbGUudnA4LmVuY29kZXIiLCAibGlic3RhZ2VmcmlnaHRfc29mdF9jMnZwOGVuYy5zbyIpOworICAgIGVtcGxhY2UoIk9NWC5nb29nbGUudnA5LmVuY29kZXIiLCAibGlic3RhZ2VmcmlnaHRfc29mdF9jMnZwOWVuYy5zbyIpOworICAgIGVtcGxhY2UoIk9NWC5nb29nbGUucmF3LmRlY29kZXIiLCAibGlic3RhZ2VmcmlnaHRfc29mdF9jMnJhd2RlYy5zbyIpOworICAgIGVtcGxhY2UoIk9NWC5nb29nbGUuZmxhYy5kZWNvZGVyIiwgImxpYnN0YWdlZnJpZ2h0X3NvZnRfYzJmbGFjZGVjLnNvIik7CisgICAgZW1wbGFjZSgiT01YLmdvb2dsZS5mbGFjLmVuY29kZXIiLCAibGlic3RhZ2VmcmlnaHRfc29mdF9jMmZsYWNlbmMuc28iKTsKKyAgICBlbXBsYWNlKCJPTVguZ29vZ2xlLmdzbS5kZWNvZGVyIiwgImxpYnN0YWdlZnJpZ2h0X3NvZnRfYzJnc21kZWMuc28iKTsKKyAgICBlbXBsYWNlKCJPTVguZ29vZ2xlLnhhYWMuZGVjb2RlciIsICJsaWJzdGFnZWZyaWdodF9zb2Z0X2MyeGFhY2RlYy5zbyIpOworfQorCitjMl9zdGF0dXNfdCBDMlBsYXRmb3JtQ29tcG9uZW50U3RvcmU6OmNvcHlCdWZmZXIoCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCdWZmZXI+IHNyYywgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0J1ZmZlcj4gZHN0KSB7CisgICAgKHZvaWQpc3JjOworICAgICh2b2lkKWRzdDsKKyAgICByZXR1cm4gQzJfT01JVFRFRDsKK30KKworYzJfc3RhdHVzX3QgQzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlOjpxdWVyeV9zbSgKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+ICZzdGFja1BhcmFtcywKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+ICZoZWFwUGFyYW1JbmRpY2VzLAorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+ICpjb25zdCBoZWFwUGFyYW1zKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbnRlcmZhY2UucXVlcnkoc3RhY2tQYXJhbXMsIGhlYXBQYXJhbUluZGljZXMsIEMyX01BWV9CTE9DSywgaGVhcFBhcmFtcyk7Cit9CisKK2MyX3N0YXR1c190IEMyUGxhdGZvcm1Db21wb25lbnRTdG9yZTo6Y29uZmlnX3NtKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gJnBhcmFtcywKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+ICpjb25zdCBmYWlsdXJlcykgeworICAgIHJldHVybiBtSW50ZXJmYWNlLmNvbmZpZyhwYXJhbXMsIEMyX01BWV9CTE9DSywgZmFpbHVyZXMpOworfQorCitzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJDb21wb25lbnQ6OlRyYWl0cz4+IEMyUGxhdGZvcm1Db21wb25lbnRTdG9yZTo6bGlzdENvbXBvbmVudHMoKSB7CisgICAgLy8gVGhpcyBtZXRob2QgU0hBTEwgcmV0dXJuIHdpdGhpbiA1MDBtcy4KKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJDb21wb25lbnQ6OlRyYWl0cz4+IGxpc3Q7CisgICAgZm9yIChjb25zdCBDMlN0cmluZyAmYWxpYXMgOiBtQ29tcG9uZW50c0xpc3QpIHsKKyAgICAgICAgQ29tcG9uZW50TG9hZGVyICZsb2FkZXIgPSBtQ29tcG9uZW50cy5hdChhbGlhcyk7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDb21wb25lbnRNb2R1bGU+IG1vZHVsZTsKKyAgICAgICAgYzJfc3RhdHVzX3QgcmVzID0gbG9hZGVyLmZldGNoTW9kdWxlKCZtb2R1bGUpOworICAgICAgICBpZiAocmVzID09IEMyX09LKSB7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJDb21wb25lbnQ6OlRyYWl0cz4gdHJhaXRzID0gbW9kdWxlLT5nZXRUcmFpdHMoKTsKKyAgICAgICAgICAgIGlmICh0cmFpdHMpIHsKKyAgICAgICAgICAgICAgICBsaXN0LnB1c2hfYmFjayh0cmFpdHMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBsaXN0OworfQorCitjMl9zdGF0dXNfdCBDMlBsYXRmb3JtQ29tcG9uZW50U3RvcmU6OmZpbmRDb21wb25lbnQoQzJTdHJpbmcgbmFtZSwgQ29tcG9uZW50TG9hZGVyICoqbG9hZGVyKSB7CisgICAgKmxvYWRlciA9IG51bGxwdHI7CisgICAgYXV0byBwb3MgPSBtQ29tcG9uZW50cy5maW5kKG5hbWUpOworICAgIC8vIFRPRE86IGNoZWNrIGFsaWFzZXMKKyAgICBpZiAocG9zID09IG1Db21wb25lbnRzLmVuZCgpKSB7CisgICAgICAgIHJldHVybiBDMl9OT1RfRk9VTkQ7CisgICAgfQorICAgICpsb2FkZXIgPSAmcG9zLT5zZWNvbmQ7CisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMlBsYXRmb3JtQ29tcG9uZW50U3RvcmU6OmNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgQzJTdHJpbmcgbmFtZSwgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiAqY29uc3QgY29tcG9uZW50KSB7CisgICAgLy8gVGhpcyBtZXRob2QgU0hBTEwgcmV0dXJuIHdpdGhpbiAxMDBtcy4KKyAgICBjb21wb25lbnQtPnJlc2V0KCk7CisgICAgQ29tcG9uZW50TG9hZGVyICpsb2FkZXI7CisgICAgYzJfc3RhdHVzX3QgcmVzID0gZmluZENvbXBvbmVudChuYW1lLCAmbG9hZGVyKTsKKyAgICBpZiAocmVzID09IEMyX09LKSB7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDb21wb25lbnRNb2R1bGU+IG1vZHVsZTsKKyAgICAgICAgcmVzID0gbG9hZGVyLT5mZXRjaE1vZHVsZSgmbW9kdWxlKTsKKyAgICAgICAgaWYgKHJlcyA9PSBDMl9PSykgeworICAgICAgICAgICAgLy8gVE9ETzogZ2V0IGEgdW5pcXVlIG5vZGUgSUQKKyAgICAgICAgICAgIHJlcyA9IG1vZHVsZS0+Y3JlYXRlQ29tcG9uZW50KDAsIGNvbXBvbmVudCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKworYzJfc3RhdHVzX3QgQzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlOjpjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgIEMyU3RyaW5nIG5hbWUsIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gKmNvbnN0IGludGVyZmFjZSkgeworICAgIC8vIFRoaXMgbWV0aG9kIFNIQUxMIHJldHVybiB3aXRoaW4gMTAwbXMuCisgICAgaW50ZXJmYWNlLT5yZXNldCgpOworICAgIENvbXBvbmVudExvYWRlciAqbG9hZGVyOworICAgIGMyX3N0YXR1c190IHJlcyA9IGZpbmRDb21wb25lbnQobmFtZSwgJmxvYWRlcik7CisgICAgaWYgKHJlcyA9PSBDMl9PSykgeworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Q29tcG9uZW50TW9kdWxlPiBtb2R1bGU7CisgICAgICAgIHJlcyA9IGxvYWRlci0+ZmV0Y2hNb2R1bGUoJm1vZHVsZSk7CisgICAgICAgIGlmIChyZXMgPT0gQzJfT0spIHsKKyAgICAgICAgICAgIC8vIFRPRE86IGdldCBhIHVuaXF1ZSBub2RlIElECisgICAgICAgICAgICByZXMgPSBtb2R1bGUtPmNyZWF0ZUludGVyZmFjZSgwLCBpbnRlcmZhY2UpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKK2MyX3N0YXR1c190IEMyUGxhdGZvcm1Db21wb25lbnRTdG9yZTo6cXVlcnlTdXBwb3J0ZWRQYXJhbXNfbmIoCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4+ICpjb25zdCBwYXJhbXMpIGNvbnN0IHsKKyAgICByZXR1cm4gbUludGVyZmFjZS5xdWVyeVN1cHBvcnRlZFBhcmFtcyhwYXJhbXMpOworfQorCitjMl9zdGF0dXNfdCBDMlBsYXRmb3JtQ29tcG9uZW50U3RvcmU6OnF1ZXJ5U3VwcG9ydGVkVmFsdWVzX3NtKAorICAgICAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk+ICZmaWVsZHMpIGNvbnN0IHsKKyAgICByZXR1cm4gbUludGVyZmFjZS5xdWVyeVN1cHBvcnRlZFZhbHVlcyhmaWVsZHMsIEMyX01BWV9CTE9DSyk7Cit9CisKK0MyU3RyaW5nIEMyUGxhdGZvcm1Db21wb25lbnRTdG9yZTo6Z2V0TmFtZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gImFuZHJvaWQuY29tcG9uZW50U3RvcmUucGxhdGZvcm0iOworfQorCitzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gQzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlOjpnZXRQYXJhbVJlZmxlY3RvcigpIGNvbnN0IHsKKyAgICByZXR1cm4gbVJlZmxlY3RvcjsKK30KKworc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50U3RvcmU+IEdldENvZGVjMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKSB7CisgICAgc3RhdGljIHN0ZDo6bXV0ZXggbXV0ZXg7CisgICAgc3RhdGljIHN0ZDo6d2Vha19wdHI8QzJDb21wb25lbnRTdG9yZT4gcGxhdGZvcm1TdG9yZTsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtdXRleCk7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50U3RvcmU+IHN0b3JlID0gcGxhdGZvcm1TdG9yZS5sb2NrKCk7CisgICAgaWYgKHN0b3JlID09IG51bGxwdHIpIHsKKyAgICAgICAgc3RvcmUgPSBzdGQ6Om1ha2Vfc2hhcmVkPEMyUGxhdGZvcm1Db21wb25lbnRTdG9yZT4oKTsKKyAgICAgICAgcGxhdGZvcm1TdG9yZSA9IHN0b3JlOworICAgIH0KKyAgICByZXR1cm4gc3RvcmU7Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJBbGxvY2F0b3JHcmFsbG9jLmggYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyQWxsb2NhdG9yR3JhbGxvYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1ZDk4OWUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyQWxsb2NhdG9yR3JhbGxvYy5oCkBAIC0wLDAgKzEsODYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFNUQUdFRlJJR0hUX0NPREVDMl9BTExPQ0FUT1JfR1JBTExPQ19IXworI2RlZmluZSBTVEFHRUZSSUdIVF9DT0RFQzJfQUxMT0NBVE9SX0dSQUxMT0NfSF8KKworI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisKKyNpbmNsdWRlIDxDMkJ1ZmZlci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qKgorICogVW53cmFwIHRoZSBuYXRpdmUgaGFuZGxlIGZyb20gYSBDb2RlYzIgaGFuZGxlIGFsbG9jYXRlZCBieSBDMkFsbG9jYXRvckdyYWxsb2MuCisgKgorICogQHBhcmFtIGhhbmRsZSBhIGhhbmRsZSBhbGxvY2F0ZWQgYnkgQzJBbGxvY2F0b3JHcmFsbG9jLiBUaGlzIGluY2x1ZGVzIGhhbmRsZXMgcmV0dXJuZWQgZm9yIGEKKyAqIGdyYXBoaWMgYmxvY2sgYWxsb2NhdGlvbiBoYW5kbGUgcmV0dXJuZWQuCisgKgorICogQHJldHVybiBhIG5ldyBOT04tT1dOSU5HIG5hdGl2ZSBoYW5kbGUgdGhhdCBtdXN0IGJlIGRlbGV0ZWQgdXNpbmcgbmF0aXZlX2hhbmRsZV9kZWxldGUuCisgKi8KK25hdGl2ZV9oYW5kbGVfdCAqVW53cmFwTmF0aXZlQ29kZWMyR3JhbGxvY0hhbmRsZShjb25zdCBDMkhhbmRsZSAqY29uc3QgaGFuZGxlKTsKKworLyoqCisgKiBXcmFwIHRoZSBncmFsbG9jIGhhbmRsZSBhbmQgbWV0YWRhdGEgaW50byBDb2RlYzIgaGFuZGxlIHJlY29nbml6ZWQgYnkKKyAqIEMyQWxsb2NhdG9yR3JhbGxvYy4KKyAqCisgKiBAcmV0dXJuIGEgbmV3IE5PTi1PV05JTkcgQzJIYW5kbGUgdGhhdCBtdXN0IGJlIGRlbGV0ZWQgdXNpbmcgbmF0aXZlX2hhbmRsZV9kZWxldGUuCisgKi8KK0MySGFuZGxlICpXcmFwTmF0aXZlQ29kZWMyR3JhbGxvY0hhbmRsZSgKKyAgICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90ICpjb25zdCBoYW5kbGUsCisgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIHVpbnQzMl90IGZvcm1hdCwgdWludDY0X3QgdXNhZ2UsIHVpbnQzMl90IHN0cmlkZSwKKyAgICAgICAgdWludDMyX3QgZ2VuZXJhdGlvbiA9IDAsIHVpbnQ2NF90IGlnYnBfaWQgPSAwLCB1aW50MzJfdCBpZ2JwX3Nsb3QgPSAwKTsKKworLyoqCisgKiBcdG9kbyBHZXQgdGhpcyBmcm9tIHRoZSBidWZmZXIKKyAqLwordm9pZCBfVW53cmFwTmF0aXZlQ29kZWMyR3JhbGxvY01ldGFkYXRhKAorICAgICAgICBjb25zdCBDMkhhbmRsZSAqY29uc3QgaGFuZGxlLAorICAgICAgICB1aW50MzJfdCAqd2lkdGgsIHVpbnQzMl90ICpoZWlnaHQsIHVpbnQzMl90ICpmb3JtYXQsIHVpbnQ2NF90ICp1c2FnZSwgdWludDMyX3QgKnN0cmlkZSwKKyAgICAgICAgdWludDMyX3QgKmdlbmVyYXRpb24sIHVpbnQ2NF90ICppZ2JwX2lkLCB1aW50MzJfdCAqaWdicF9zbG90KTsKKworY2xhc3MgQzJBbGxvY2F0b3JHcmFsbG9jIDogcHVibGljIEMyQWxsb2NhdG9yIHsKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIGlkX3QgZ2V0SWQoKSBjb25zdCBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgQzJTdHJpbmcgZ2V0TmFtZSgpIGNvbnN0IG92ZXJyaWRlOworCisgICAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgVHJhaXRzPiBnZXRUcmFpdHMoKSBjb25zdCBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgbmV3R3JhcGhpY0FsbG9jYXRpb24oCisgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCB1aW50MzJfdCBmb3JtYXQsIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQWxsb2NhdGlvbj4gKmFsbG9jYXRpb24pIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBwcmlvckdyYXBoaWNBbGxvY2F0aW9uKAorICAgICAgICAgICAgY29uc3QgQzJIYW5kbGUgKmhhbmRsZSwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNBbGxvY2F0aW9uPiAqYWxsb2NhdGlvbikgb3ZlcnJpZGU7CisKKyAgICBDMkFsbG9jYXRvckdyYWxsb2MoaWRfdCBpZCwgYm9vbCBidWZmZXJRdWV1ZSA9IGZhbHNlKTsKKworICAgIGMyX3N0YXR1c190IHN0YXR1cygpIGNvbnN0OworCisgICAgdmlydHVhbCB+QzJBbGxvY2F0b3JHcmFsbG9jKCkgb3ZlcnJpZGU7CisKKyAgICBzdGF0aWMgYm9vbCBpc1ZhbGlkKGNvbnN0IEMySGFuZGxlKiBjb25zdCBvKTsKKworcHJpdmF0ZToKKyAgICBjbGFzcyBJbXBsOworICAgIEltcGwgKm1JbXBsOworfTsKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gU1RBR0VGUklHSFRfQ09ERUMyX0FMTE9DQVRPUl9HUkFMTE9DX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyQWxsb2NhdG9ySW9uLmggYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyQWxsb2NhdG9ySW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWIyMDUxZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJBbGxvY2F0b3JJb24uaApAQCAtMCwwICsxLDEwMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgU1RBR0VGUklHSFRfQ09ERUMyX0FMTE9DQVRPUl9JT05fSF8KKyNkZWZpbmUgU1RBR0VGUklHSFRfQ09ERUMyX0FMTE9DQVRPUl9JT05fSF8KKworI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8bGlzdD4KKyNpbmNsdWRlIDxtdXRleD4KKyNpbmNsdWRlIDx0dXBsZT4KKyNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgorCisjaW5jbHVkZSA8QzJCdWZmZXIuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBDMkFsbG9jYXRvcklvbiA6IHB1YmxpYyBDMkFsbG9jYXRvciB7CitwdWJsaWM6CisgICAgLy8gVXNhZ2UgbWFwcGVyIGZ1bmN0aW9uIHVzZWQgYnkgdGhlIGFsbG9jYXRvcgorICAgIC8vICAgKHVzYWdlLCBjYXBhY2l0eSkgPT4gKGFsaWduLCBoZWFwTWFzaywgZmxhZ3MpCisgICAgLy8KKyAgICAvLyBjYXBhY2l0eSBpcyBhbGlnbmVkIHRvIHRoZSBkZWZhdWx0IGJsb2NrLXNpemUgKGRlZmF1bHRzIHRvIHBhZ2Ugc2l6ZSkgdG8gcmVkdWNlIGNhY2hpbmcKKyAgICAvLyBvdmVyaGVhZAorICAgIHR5cGVkZWYgc3RkOjpmdW5jdGlvbjxjMl9zdGF0dXNfdChDMk1lbW9yeVVzYWdlLCBzaXplX3QsCisgICAgICAgICAgICAgICAgICAgICAgLyogPT4gKi8gc2l6ZV90KiwgdW5zaWduZWQqLCB1bnNpZ25lZCopPiBVc2FnZU1hcHBlckZuOworCisgICAgdmlydHVhbCBpZF90IGdldElkKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIEMyU3RyaW5nIGdldE5hbWUoKSBjb25zdCBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IFRyYWl0cz4gZ2V0VHJhaXRzKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IG5ld0xpbmVhckFsbG9jYXRpb24oCisgICAgICAgICAgICB1aW50MzJfdCBjYXBhY2l0eSwgQzJNZW1vcnlVc2FnZSB1c2FnZSwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckFsbG9jYXRpb24+ICphbGxvY2F0aW9uKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcHJpb3JMaW5lYXJBbGxvY2F0aW9uKAorICAgICAgICAgICAgY29uc3QgQzJIYW5kbGUgKmhhbmRsZSwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckFsbG9jYXRpb24+ICphbGxvY2F0aW9uKSBvdmVycmlkZTsKKworICAgIEMyQWxsb2NhdG9ySW9uKGlkX3QgaWQpOworCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBzdGF0dXMoKSBjb25zdCB7IHJldHVybiBtSW5pdDsgfQorCisgICAgdmlydHVhbCB+QzJBbGxvY2F0b3JJb24oKSBvdmVycmlkZTsKKworICAgIHN0YXRpYyBib29sIGlzVmFsaWQoY29uc3QgQzJIYW5kbGUqIGNvbnN0IG8pOworCisgICAgLyoqCisgICAgICogVXBkYXRlcyB0aGUgdXNhZ2UgbWFwcGVyIGZvciBzdWJzZXF1ZW50IG5ldyBhbGxvY2F0aW9ucywgYXMgd2VsbCBhcyB0aGUgc3VwcG9ydGVkCisgICAgICogbWluaW11bSBhbmQgbWF4aW11bSB1c2FnZSBtYXNrcyBhbmQgZGVmYXVsdCBibG9jay1zaXplIHRvIHVzZSBmb3IgdGhlIG1hcHBlci4KKyAgICAgKgorICAgICAqIFxwYXJhbSBtYXBwZXIgdGhpcyBtZXRob2QgaXMgY2FsbGVkIHRvIG1hcCBDb2RlYyAyLjAgYnVmZmVyIHVzYWdlIHRvIGlvbiBmbGFncworICAgICAqICAgICAgICByZXF1aXJlZCBieSB0aGUgaW9uIGRldmljZQorICAgICAqIFxwYXJhbSBtaW5Vc2FnZSBtaW5pbXVtIGJ1ZmZlciB1c2FnZSByZXF1aXJlZCBmb3Igc3VwcG9ydGVkIGFsbG9jYXRpb25zIChkZWZhdWx0cyB0byAwKQorICAgICAqIFxwYXJhbSBtYXhVc2FnZSBtYXhpbXVtIGJ1ZmZlciB1c2FnZSBzdXBwb3J0ZWQgYnkgdGhlIGlvbiBhbGxvY2F0b3IgKGRlZmF1bHRzIHRvIFNXX1JFQUQKKyAgICAgKiAgICAgICAgfCBTV19XUklURSkKKyAgICAgKiBccGFyYW0gYmxvY2tTaXplIGFsaWdubWVudCB1c2VkIHByaW9yIHRvIGNhbGxpbmcgfG1hcHBlcnwgZm9yIHRoZSBidWZmZXIgY2FwYWNpdHkuCisgICAgICogICAgICAgIFRoaXMgYWxzbyBoZWxwcyByZWR1Y2UgdGhlIHNpemUgb2YgY2FjaGUgcmVxdWlyZWQgZm9yIGNhY2hpbmcgbWFwcGVyIHJlc3VsdHMuCisgICAgICogICAgICAgIChkZWZhdWx0cyB0byB0aGUgcGFnZSBzaXplKQorICAgICAqLworICAgIHZvaWQgc2V0VXNhZ2VNYXBwZXIoCisgICAgICAgICAgICBjb25zdCBVc2FnZU1hcHBlckZuICZtYXBwZXIsIHVpbnQ2NF90IG1pblVzYWdlLCB1aW50NjRfdCBtYXhVc2FnZSwgdWludDY0X3QgYmxvY2tTaXplKTsKKworcHJpdmF0ZToKKyAgICBjMl9zdGF0dXNfdCBtYXBVc2FnZShDMk1lbW9yeVVzYWdlIHVzYWdlLCBzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgIC8qID0+ICovIHNpemVfdCAqYWxpZ24sIHVuc2lnbmVkICpoZWFwTWFzaywgdW5zaWduZWQgKmZsYWdzKTsKKworICAgIGMyX3N0YXR1c190IG1Jbml0OworICAgIGludCBtSW9uRmQ7CisKKyAgICAvLyB0aGlzIGxvY2tzIG1UcmFpdHMsIG1CbG9ja1NpemUsIG1Vc2FnZU1hcHBlciwgbVVzYWdlTWFwcGVyTHJ1IGFuZCBtVXNhZ2VNYXBwZXJDYWNoZQorICAgIG11dGFibGUgc3RkOjptdXRleCBtVXNhZ2VNYXBwZXJMb2NrOworICAgIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBUcmFpdHM+IG1UcmFpdHM7CisgICAgc2l6ZV90IG1CbG9ja1NpemU7CisgICAgVXNhZ2VNYXBwZXJGbiBtVXNhZ2VNYXBwZXI7CisgICAgdHlwZWRlZiBzdGQ6OnBhaXI8dWludDY0X3QsIHNpemVfdD4gTWFwcGVyS2V5OworICAgIHN0cnVjdCBNYXBwZXJLZXlIYXNoIHsKKyAgICAgICAgc3RkOjpzaXplX3Qgb3BlcmF0b3IoKShjb25zdCBNYXBwZXJLZXkgJikgY29uc3Q7CisgICAgfTsKKyAgICB0eXBlZGVmIHN0ZDo6dHVwbGU8c2l6ZV90LCB1bnNpZ25lZCwgdW5zaWduZWQsIGMyX3N0YXR1c190PiBNYXBwZXJWYWx1ZTsKKyAgICB0eXBlZGVmIHN0ZDo6cGFpcjxNYXBwZXJLZXksIE1hcHBlclZhbHVlPiBNYXBwZXJLZXlWYWx1ZTsKKyAgICB0eXBlZGVmIHN0ZDo6bGlzdDxNYXBwZXJLZXlWYWx1ZT46Oml0ZXJhdG9yIE1hcHBlcktleVZhbHVlUG9pbnRlcjsKKyAgICBzdGQ6Omxpc3Q8TWFwcGVyS2V5VmFsdWU+IG1Vc2FnZU1hcHBlckxydTsKKyAgICBzdGQ6OnVub3JkZXJlZF9tYXA8TWFwcGVyS2V5LCBNYXBwZXJLZXlWYWx1ZVBvaW50ZXIsIE1hcHBlcktleUhhc2g+IG1Vc2FnZU1hcHBlckNhY2hlOworfTsKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gU1RBR0VGUklHSFRfQ09ERUMyX0FMTE9DQVRPUl9JT05fSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJCcUJ1ZmZlclByaXYuaCBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJCcUJ1ZmZlclByaXYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjcxYTcxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMkJxQnVmZmVyUHJpdi5oCkBAIC0wLDAgKzEsNzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFNUQUdFRlJJR0hUX0NPREVDMl9CUV9CVUZGRVJfUFJJVl9IXworI2RlZmluZSBTVEFHRUZSSUdIVF9DT0RFQzJfQlFfQlVGRkVSX1BSSVZfSF8KKworI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisKKyNpbmNsdWRlIDxDMkJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2JxaGVscGVyL1dHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KKworY2xhc3MgQzJCdWZmZXJRdWV1ZUJsb2NrUG9vbCA6IHB1YmxpYyBDMkJsb2NrUG9vbCB7CitwdWJsaWM6CisgICAgQzJCdWZmZXJRdWV1ZUJsb2NrUG9vbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+ICZhbGxvY2F0b3IsIGNvbnN0IGxvY2FsX2lkX3QgbG9jYWxJZCk7CisKKyAgICB2aXJ0dWFsIH5DMkJ1ZmZlclF1ZXVlQmxvY2tQb29sKCkgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIEMyQWxsb2NhdG9yOjppZF90IGdldEFsbG9jYXRvcklkKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbUFsbG9jYXRvci0+Z2V0SWQoKTsKKyAgICB9OworCisgICAgdmlydHVhbCBsb2NhbF9pZF90IGdldExvY2FsSWQoKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtTG9jYWxJZDsKKyAgICB9OworCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBmZXRjaEdyYXBoaWNCbG9jaygKKyAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLAorICAgICAgICAgICAgdWludDMyX3QgaGVpZ2h0LAorICAgICAgICAgICAgdWludDMyX3QgZm9ybWF0LAorICAgICAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gKmJsb2NrIC8qIG5vbm51bGwgKi8pIG92ZXJyaWRlOworCisgICAgdHlwZWRlZiBzdGQ6OmZ1bmN0aW9uPHZvaWQodWludDY0X3QgcHJvZHVjZXIsIGludDMyX3Qgc2xvdCwgaW50NjRfdCBuc2Vjcyk+IE9uUmVuZGVyQ2FsbGJhY2s7CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHJlbmRlciBjYWxsYmFjay4KKyAgICAgKgorICAgICAqIFxwYXJhbSByZW5kZXJDYWxsYmFrIGNhbGxiYWNrIHRvIGNhbGwgZm9yIGFsbCBkZXF1ZXVlIGJ1ZmZlci4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHZvaWQgc2V0UmVuZGVyQ2FsbGJhY2soY29uc3QgT25SZW5kZXJDYWxsYmFjayAmcmVuZGVyQ2FsbGJhY2sgPSBPblJlbmRlckNhbGxiYWNrKCkpOworCisgICAgLyoqCisgICAgICogQ29uZmlndXJlcyBhbiBJR0JQIGluIG9yZGVyIHRvIGNyZWF0ZSBibG9ja3MuIEEgbmV3bHkgY3JlYXRlZCBibG9jayBpcworICAgICAqIGRlcXVldWVkIGZyb20gdGhlIGNvbmZpZ3VyZWQgSUdCUC4gVW5pcXVlIElkIG9mIElHQlAgYW5kIHRoZSBzbG90IG51bWJlciBvZgorICAgICAqIGJsb2NrcyBhcmUgcGFzc2VkIHZpYSBuYXRpdmVfaGFuZGxlLiBNYW5hZ2luZyBJR0JQIGlzIHJlc3BvbnNpYmlsaXR5IG9mIGNhbGxlci4KKyAgICAgKiBXaGVuIElHQlAgaXMgbm90IGNvbmZpZ3VyZWQsIGJsb2NrIHdpbGwgYmUgY3JlYXRlZCB2aWEgYWxsb2NhdG9yLgorICAgICAqIFNpbmNlIHplcm8gaXMgbm90IHVzZWQgZm9yIFVuaXF1ZSBJZCBvZiBJR0JQLCBpZiBJR0JQIGlzIG5vdCBjb25maWd1cmVkIG9yIHByb2R1Y2VyCisgICAgICogaXMgY29uZmlndXJlZCBhcyBudWxscHRyLCB1bmlxdWUgaWQgd2hpY2ggaXMgYnVuZGxlZCBpbiBuYXRpdmVfaGFuZGxlIGlzIHplcm8uCisgICAgICoKKyAgICAgKiBccGFyYW0gcHJvZHVjZXIgICAgICB0aGUgSUdCUCwgd2hpY2ggd2lsbCBiZSB1c2VkIHRvIGZldGNoIGJsb2NrcworICAgICAqLworICAgIHZpcnR1YWwgdm9pZCBjb25maWd1cmVQcm9kdWNlcihjb25zdCBhbmRyb2lkOjpzcDxhbmRyb2lkOjpIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiAmcHJvZHVjZXIpOworCitwcml2YXRlOgorICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gbUFsbG9jYXRvcjsKKyAgICBjb25zdCBsb2NhbF9pZF90IG1Mb2NhbElkOworCisgICAgY2xhc3MgSW1wbDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gbUltcGw7CisKKyAgICBmcmllbmQgc3RydWN0IEMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhOworfTsKKworI2VuZGlmIC8vIFNUQUdFRlJJR0hUX0NPREVDMl9CVUZGRVJfUFJJVl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMkJ1ZmZlclByaXYuaCBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJCdWZmZXJQcml2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBiOTE1MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJCdWZmZXJQcml2LmgKQEAgLTAsMCArMSwxMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFNUQUdFRlJJR0hUX0NPREVDMl9CVUZGRVJfUFJJVl9IXworI2RlZmluZSBTVEFHRUZSSUdIVF9DT0RFQzJfQlVGRkVSX1BSSVZfSF8KKworI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisKKyNpbmNsdWRlIDxDMkJ1ZmZlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYnVmZmVycG9vbC8xLjAvSUFjY2Vzc29yLmg+CisKK2NsYXNzIEMyQmFzaWNMaW5lYXJCbG9ja1Bvb2wgOiBwdWJsaWMgQzJCbG9ja1Bvb2wgeworcHVibGljOgorICAgIGV4cGxpY2l0IEMyQmFzaWNMaW5lYXJCbG9ja1Bvb2woY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiAmYWxsb2NhdG9yKTsKKworICAgIHZpcnR1YWwgfkMyQmFzaWNMaW5lYXJCbG9ja1Bvb2woKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgICB2aXJ0dWFsIEMyQWxsb2NhdG9yOjppZF90IGdldEFsbG9jYXRvcklkKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbUFsbG9jYXRvci0+Z2V0SWQoKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGxvY2FsX2lkX3QgZ2V0TG9jYWxJZCgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIEJBU0lDX0xJTkVBUjsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGZldGNoTGluZWFyQmxvY2soCisgICAgICAgICAgICB1aW50MzJfdCBjYXBhY2l0eSwKKyAgICAgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gKmJsb2NrIC8qIG5vbm51bGwgKi8pIG92ZXJyaWRlOworCisgICAgLy8gVE9ETzogZmV0Y2hDaXJjdWxhckJsb2NrCisKK3ByaXZhdGU6CisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiBtQWxsb2NhdG9yOworfTsKKworY2xhc3MgQzJCYXNpY0dyYXBoaWNCbG9ja1Bvb2wgOiBwdWJsaWMgQzJCbG9ja1Bvb2wgeworcHVibGljOgorICAgIGV4cGxpY2l0IEMyQmFzaWNHcmFwaGljQmxvY2tQb29sKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gJmFsbG9jYXRvcik7CisKKyAgICB2aXJ0dWFsIH5DMkJhc2ljR3JhcGhpY0Jsb2NrUG9vbCgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIHZpcnR1YWwgQzJBbGxvY2F0b3I6OmlkX3QgZ2V0QWxsb2NhdG9ySWQoKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtQWxsb2NhdG9yLT5nZXRJZCgpOworICAgIH0KKworICAgIHZpcnR1YWwgbG9jYWxfaWRfdCBnZXRMb2NhbElkKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gQkFTSUNfR1JBUEhJQzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGZldGNoR3JhcGhpY0Jsb2NrKAorICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsCisgICAgICAgICAgICB1aW50MzJfdCBoZWlnaHQsCisgICAgICAgICAgICB1aW50MzJfdCBmb3JtYXQsCisgICAgICAgICAgICBDMk1lbW9yeVVzYWdlIHVzYWdlLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiAqYmxvY2sgLyogbm9ubnVsbCAqLykgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiBtQWxsb2NhdG9yOworfTsKKworY2xhc3MgQzJQb29sZWRCbG9ja1Bvb2wgOiBwdWJsaWMgQzJCbG9ja1Bvb2wgeworcHVibGljOgorICAgIEMyUG9vbGVkQmxvY2tQb29sKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gJmFsbG9jYXRvciwgY29uc3QgbG9jYWxfaWRfdCBsb2NhbElkKTsKKworICAgIHZpcnR1YWwgfkMyUG9vbGVkQmxvY2tQb29sKCkgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIEMyQWxsb2NhdG9yOjppZF90IGdldEFsbG9jYXRvcklkKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbUFsbG9jYXRvci0+Z2V0SWQoKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGxvY2FsX2lkX3QgZ2V0TG9jYWxJZCgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1Mb2NhbElkOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgZmV0Y2hMaW5lYXJCbG9jaygKKyAgICAgICAgICAgIHVpbnQzMl90IGNhcGFjaXR5LAorICAgICAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiAqYmxvY2sgLyogbm9ubnVsbCAqLykgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGZldGNoR3JhcGhpY0Jsb2NrKAorICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsCisgICAgICAgICAgICB1aW50MzJfdCBoZWlnaHQsCisgICAgICAgICAgICB1aW50MzJfdCBmb3JtYXQsCisgICAgICAgICAgICBDMk1lbW9yeVVzYWdlIHVzYWdlLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiAqYmxvY2spIG92ZXJyaWRlOworCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIHRoZSBjb25uZWN0aW9uIElkIGZvciB1bmRlcmx5aW5nIGJ1ZmZlcnBvb2wKKyAgICAgKi8KKyAgICBpbnQ2NF90IGdldENvbm5lY3Rpb25JZCgpOworCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIHRoZSBhY2Nlc3NvciB3aGljaCBpcyB1c2VkIGJ5IHVuZGVybHlpbmcgYnVmZmVycG9vbC4gKEl0IGNhbiBiZQorICAgICAqIHBhc3NlZCB0byByZWNlaXZpbmcgcHJvY2Vzcy4pCisgICAgICoKKyAgICAgKiBccGFyYW0gYWNjZXNzb3IgICAgICAgICAgSUFjY2Vzc29yIHdpbGwgYmUgd3JpdHRlbiB0byB0aGlzIG91dCBwYXJhbWV0ZXIuCisgICAgICoKKyAgICAgKiBccmV0dXJuIHRydWUgICAgICAgICAgICAgSUFjZXNzb3IgaXMgd3JpdGVuIHN1Y2Nlc3NmdWxseS4KKyAgICAgKiBccmV0dXJuIGZhbHNlICAgICAgICAgICAgSUFjY2Vzc29yIGlzIG5vdCB3cml0dGVuLgorICAgICAqLworICAgIGJvb2wgZ2V0QWNjZXNzb3IoYW5kcm9pZDo6c3A8YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMV8wOjpJQWNjZXNzb3I+ICphY2Nlc3Nvcik7CisKK3ByaXZhdGU6CisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiBtQWxsb2NhdG9yOworICAgIGNvbnN0IGxvY2FsX2lkX3QgbUxvY2FsSWQ7CisKKyAgICBjbGFzcyBJbXBsOworICAgIHN0ZDo6dW5pcXVlX3B0cjxJbXBsPiBtSW1wbDsKK307CisKKyNlbmRpZiAvLyBTVEFHRUZSSUdIVF9DT0RFQzJfQlVGRkVSX1BSSVZfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJDb21wb25lbnRGYWN0b3J5LmggYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyQ29tcG9uZW50RmFjdG9yeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2ZDhiOTgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyQ29tcG9uZW50RmFjdG9yeS5oCkBAIC0wLDAgKzEsODcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFNUQUdFRlJJR0hUX0NPREVDMl9DT01QT05FTlRfRkFDVE9SWV9IXworI2RlZmluZSBTVEFHRUZSSUdIVF9DT0RFQzJfQ09NUE9ORU5UX0ZBQ1RPUllfSF8KKworI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+CisKKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPG1lbW9yeT4KKworLyoqCisgKiBDb21wb25lbnQgZmFjdG9yeSBvYmplY3QgdGhhdCBlbmFibGVzIHRvIGNyZWF0ZSBhIGNvbXBvbmVudCBhbmQvb3IgaW50ZXJmYWNlIGZyb20gYSBkeW5hbWljYWxseQorICogbGlua2VkIGxpYnJhcnkuIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2UgdGhlIGNvbXBvbmVudC9pbnRlcmZhY2VzIGFyZSBtYW5hZ2VkIG9iamVjdHMsIGJ1dCB3ZQorICogY2Fubm90IHNhZmVseSBjcmVhdGUgYSBtYW5hZ2VkIG9iamVjdCBhbmQgcGFzcyBpdCBpbiBDLgorICoKKyAqIENvbXBvbmVudHMvaW50ZXJmYWNlcyB0eXBpY2FsbHkgaW5oZXJpdCBmcm9tIHN0ZDo6ZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXMsIGJ1dCBDIHJlcXVpcmVzCisgKiBwYXNzaW5nIHNpbXBsZSBwb2ludGVyLCBhbmQgc2hhcmVkX3B0ciBjb25zdHJ1Y3RvciBuZWVkcyB0byBrbm93IHRoZSBjbGFzcyB0byBiZSBjb25zdHJ1Y3RlZAorICogZGVyaXZlcyBmcm9tIGVuYWJsZV9zaGFyZWRfZnJvbV90aGlzLgorICoKKyAqLworY2xhc3MgQzJDb21wb25lbnRGYWN0b3J5IHsKK3B1YmxpYzoKKyAgICB0eXBlZGVmIHN0ZDo6ZnVuY3Rpb248dm9pZCg6OkMyQ29tcG9uZW50Kik+IENvbXBvbmVudERlbGV0ZXI7CisgICAgdHlwZWRlZiBzdGQ6OmZ1bmN0aW9uPHZvaWQoOjpDMkNvbXBvbmVudEludGVyZmFjZSopPiBJbnRlcmZhY2VEZWxldGVyOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIFNIQUxMIHJldHVybiB3aXRoaW4gMTAwbXMuCisgICAgICoKKyAgICAgKiBccGFyYW0gaWQgICAgICAgIGNvbXBvbmVudCBJRCBmb3IgdGhlIGNyZWF0ZWQgY29tcG9uZW50CisgICAgICogXHBhcmFtIGNvbXBvbmVudCBzaGFyZWQgcG9pbnRlciB3aGVyZSB0aGUgY3JlYXRlZCBjb21wb25lbnQgaXMgc3RvcmVkLiBDbGVhcmVkIG9uCisgICAgICogICAgICAgICAgICAgICAgICBmYWlsdXJlIGFuZCB1cGRhdGVkIG9uIHN1Y2Nlc3MuCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgY29tcG9uZW50IHdhcyBjcmVhdGVkIHN1Y2Nlc3NmdWxseQorICAgICAqIFxyZXR2YWwgQzJfVElNRURfT1VUIGNvdWxkIG5vdCBjcmVhdGUgdGhlIGNvbXBvbmVudCB3aXRoaW4gdGhlIHRpbWUgbGltaXQgKHVuZXhwZWN0ZWQpCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duIGVycm9yIHByZXZlbnRlZCB0aGUgY3JlYXRpb24gb2YgdGhlIGNvbXBvbmVudCAodW5leHBlY3RlZCkKKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIG5vdCBlbm91Z2ggbWVtb3J5IHRvIGNyZWF0ZSB0aGUgY29tcG9uZW50CisgICAgICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVDb21wb25lbnQoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4qIGNvbnN0IGNvbXBvbmVudCwKKyAgICAgICAgICAgIENvbXBvbmVudERlbGV0ZXIgZGVsZXRlciA9IHN0ZDo6ZGVmYXVsdF9kZWxldGU8QzJDb21wb25lbnQ+KCkpID0gMDsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBjb21wb25lbnQgaW50ZXJmYWNlLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgU0hBTEwgcmV0dXJuIHdpdGhpbiAxMDBtcy4KKyAgICAgKgorICAgICAqIFxwYXJhbSBpZCAgICAgICAgY29tcG9uZW50IGludGVyZmFjZSBJRCBmb3IgdGhlIGNyZWF0ZWQgaW50ZXJmYWNlCisgICAgICogXHBhcmFtIGludGVyZmFjZSBzaGFyZWQgcG9pbnRlciB3aGVyZSB0aGUgY3JlYXRlZCBpbnRlcmZhY2UgaXMgc3RvcmVkLiBDbGVhcmVkIG9uCisgICAgICogICAgICAgICAgICAgICAgICBmYWlsdXJlIGFuZCB1cGRhdGVkIG9uIHN1Y2Nlc3MuCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgY29tcG9uZW50IGludGVyZmFjZSB3YXMgY3JlYXRlZCBzdWNjZXNzZnVsbHkKKyAgICAgKiBccmV0dmFsIEMyX1RJTUVEX09VVCBjb3VsZCBub3QgY3JlYXRlIHRoZSBjb21wb25lbnQgaW50ZXJmYWNlIHdpdGhpbiB0aGUgdGltZSBsaW1pdAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICh1bmV4cGVjdGVkKQorICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgdGhlIGNyZWF0aW9uIG9mIHRoZSBjb21wb25lbnQgaW50ZXJmYWNlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgKHVuZXhwZWN0ZWQpCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX05PX01FTU9SWSBub3QgZW5vdWdoIG1lbW9yeSB0byBjcmVhdGUgdGhlIGNvbXBvbmVudCBpbnRlcmZhY2UKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiogY29uc3QgaW50ZXJmYWNlLAorICAgICAgICAgICAgSW50ZXJmYWNlRGVsZXRlciBkZWxldGVyID0gc3RkOjpkZWZhdWx0X2RlbGV0ZTxDMkNvbXBvbmVudEludGVyZmFjZT4oKSkgPSAwOworCisgICAgdmlydHVhbCB+QzJDb21wb25lbnRGYWN0b3J5KCkgPSBkZWZhdWx0OworCisgICAgdHlwZWRlZiA6OkMyQ29tcG9uZW50RmFjdG9yeSogKCpDcmVhdGVDb2RlYzJGYWN0b3J5RnVuYykodm9pZCk7CisgICAgdHlwZWRlZiB2b2lkICgqRGVzdHJveUNvZGVjMkZhY3RvcnlGdW5jKSg6OkMyQ29tcG9uZW50RmFjdG9yeSopOworfTsKKworCisjZW5kaWYgLy8gU1RBR0VGUklHSFRfQ09ERUMyX0NPTVBPTkVOVF9GQUNUT1JZX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyRGVidWcuaCBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJEZWJ1Zy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmMWNkYWIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyRGVidWcuaApAQCAtMCwwICsxLDI4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDMlVUSUxTX0RFQlVHX0hfCisjZGVmaW5lIEMyVVRJTFNfREVCVUdfSF8KKworI2luY2x1ZGUgPHV0aWwvQzJEZWJ1Zy1sb2cuaD4KKworLy8gVG8gYWxsb3cgYXJiaXRyYXJ5IG9yZGVyaW5nIG9mIEMyRGVidWcuaCBhbmQgQVBJIGhlYWRlcnMgYW5kIHRvIGtlZXAgZGVidWcgdXRpbGl0aWVzIHNlcGFyYXRlbHkKKy8vIGZyb20gdGhlIEFQSSBkZWZpbml0aW9ucywgd2UgcHJvdmlkZSBBUEkgaGVhZGVyIHNwZWNpZmljIGRlYnVnIGhlYWRlcnMuCisjaWZkZWYgQzJQQVJBTV9IXworI2luY2x1ZGUgPHV0aWwvQzJEZWJ1Zy1wYXJhbS5oPgorI2VuZGlmCisKKyNlbmRpZiAgLy8gQzJVVElMU19ERUJVR19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMkVycm5vVXRpbHMuaCBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJFcnJub1V0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI5OTVmNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJFcnJub1V0aWxzLmgKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBTVEFHRUZSSUdIVF9DT0RFQzJfRVJSTk9fVVRJTFNfSF8KKyNkZWZpbmUgU1RBR0VGUklHSFRfQ09ERUMyX0VSUk5PX1VUSUxTX0hfCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPEMyLmg+CisKKy8vIHN0YW5kYXJkIEVSUk5PIG1hcHBpbmdzCit0ZW1wbGF0ZTxpbnQgTj4gY29uc3RleHByIGMyX3N0YXR1c190IF9jMl9lcnJubzJzdGF0dXNfaW1wbCgpOwordGVtcGxhdGU8PiBjb25zdGV4cHIgYzJfc3RhdHVzX3QgX2MyX2Vycm5vMnN0YXR1c19pbXBsPDA+KCkgICAgICAgeyByZXR1cm4gQzJfT0s7IH0KK3RlbXBsYXRlPD4gY29uc3RleHByIGMyX3N0YXR1c190IF9jMl9lcnJubzJzdGF0dXNfaW1wbDxFSU5WQUw+KCkgIHsgcmV0dXJuIEMyX0JBRF9WQUxVRTsgfQordGVtcGxhdGU8PiBjb25zdGV4cHIgYzJfc3RhdHVzX3QgX2MyX2Vycm5vMnN0YXR1c19pbXBsPEVBQ0NFUz4oKSAgeyByZXR1cm4gQzJfUkVGVVNFRDsgfQordGVtcGxhdGU8PiBjb25zdGV4cHIgYzJfc3RhdHVzX3QgX2MyX2Vycm5vMnN0YXR1c19pbXBsPEVQRVJNPigpICAgeyByZXR1cm4gQzJfUkVGVVNFRDsgfQordGVtcGxhdGU8PiBjb25zdGV4cHIgYzJfc3RhdHVzX3QgX2MyX2Vycm5vMnN0YXR1c19pbXBsPEVOT01FTT4oKSAgeyByZXR1cm4gQzJfTk9fTUVNT1JZOyB9CisKKy8vIG1hcCBzdGFuZGFyZCBlcnJuby1zIHRvIHRoZSBlcXVpdmFsZW50IGMyX3N0YXR1c190Cit0ZW1wbGF0ZTxpbnQuLi4gTj4gc3RydWN0IF9jMl9tYXBfZXJybm9faW1wbDsKK3RlbXBsYXRlPGludCBFLCBpbnQgLi4uIE4+IHN0cnVjdCBfYzJfbWFwX2Vycm5vX2ltcGw8RSwgTi4uLj4geworICAgIHN0YXRpYyBjMl9zdGF0dXNfdCBtYXAoaW50IHJlc3VsdCkgeworICAgICAgICBpZiAocmVzdWx0ID09IEUpIHsKKyAgICAgICAgICAgIHJldHVybiBfYzJfZXJybm8yc3RhdHVzX2ltcGwgPEU+KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gX2MyX21hcF9lcnJub19pbXBsPE4uLi4+OjptYXAocmVzdWx0KTsKKyAgICAgICAgfQorICAgIH0KK307Cit0ZW1wbGF0ZTw+IHN0cnVjdCBfYzJfbWFwX2Vycm5vX2ltcGw8PiB7CisgICAgc3RhdGljIGMyX3N0YXR1c190IG1hcChpbnQgcmVzdWx0KSB7CisgICAgICAgIHJldHVybiByZXN1bHQgPT0gMCA/IEMyX09LIDogQzJfQ09SUlVQVEVEOworICAgIH0KK307CisKK3RlbXBsYXRlPGludC4uLiBOPgorYzJfc3RhdHVzX3QgYzJfbWFwX2Vycm5vKGludCByZXN1bHQpIHsKKyAgICByZXR1cm4gX2MyX21hcF9lcnJub19pbXBsPE4uLi4+OjptYXAocmVzdWx0KTsKK30KKworI2VuZGlmIC8vIFNUQUdFRlJJR0hUX0NPREVDMl9FUlJOT19VVElMU19IXworCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyUGxhdGZvcm1TdG9yZVBsdWdpbkxvYWRlci5oIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMlBsYXRmb3JtU3RvcmVQbHVnaW5Mb2FkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzEwNjQzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMlBsYXRmb3JtU3RvcmVQbHVnaW5Mb2FkZXIuaApAQCAtMCwwICsxLDk4IEBACisvKgorICogQ29weXJpZ2h0IDIwMTgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFNUQUdFRlJJR0hUX0MyX1BMQVRGT1JNX1NUT1JFX1BMVUdJTl9MT0FERVJfSF8KKworI2RlZmluZSBTVEFHRUZSSUdIVF9DMl9QTEFURk9STV9TVE9SRV9QTFVHSU5fTE9BREVSX0hfCisKKyNpbmNsdWRlIDxtZW1vcnk+CisKKyNpbmNsdWRlIDx1dGlscy9NdXRleC5oPgorCisjaW5jbHVkZSA8QzIuaD4KKyNpbmNsdWRlIDxDMkJ1ZmZlci5oPgorCisvKioKKyAqIEV4dGVybiBDIGludGVyZmFjZSBmb3IgY3JlYXRpbmcgYmxvY2sgcG9vbCBmcm9tIHBsYXRmb3JtIHN0b3JlIGV4dGVuc2lvbi4KKyAqCisgKiBccGFyYW0gYWxsb2N0b3JJZCAgdGhlIElEIG9mIHRoZSBiYWNraW5nIGFsbG9jYXRvciB0eXBlLgorICogXHBhcmVtIGJsb2NrUG9vbElkIHRoZSBJRCBvZiBjcmVhdGVkIGJsb2NrIHBvb2wuCisgKgorICogXHJldHVybiBwb2ludGVyIG9mIGNyZWF0ZWQgQzJCbG9ja1Bvb2wsIG51bGxwdHIgb24gZXJyb3IuCisgKi8KK3R5cGVkZWYgOjpDMkJsb2NrUG9vbCogKCpDcmVhdGVCbG9ja1Bvb2xGdW5jKSg6OkMyQWxsb2NhdG9yOjppZF90LCA6OkMyQmxvY2tQb29sOjpsb2NhbF9pZF90KTsKKworLyoqCisgKiBFeHRlcm4gQyBpbnRlcmZhY2UgZm9yIGNyZWF0aW5nIGFsbG9jYXRvciBmcm9tIHBsYXRmb3JtIHN0b3JlIGV4dGVuc2lvbi4KKyAqCisgKiBccGFyYW0gYWxsb2N0b3JJZCAgdGhlIElEIG9mIHRoZSBhbGxvY2F0b3IgdG8gY3JlYXRlLgorICogXHBhcmFtIHN0YXR1cyAgICAgIHRoZSByZXR1cm5lZCBzdGF0dXMgZnJvbSBjcmVhdGluZyBhbGxvY2F0b3IuCisgKgorICogXHJldHVybiBwb2ludGVyIG9mIGNyZWF0ZWQgQzJBbGxvY2F0b3IsIG51bGxwdHIgb24gZXJyb3IuCisgKi8KK3R5cGVkZWYgOjpDMkFsbG9jYXRvciogKCpDcmVhdGVBbGxvY2F0b3JGdW5jKSg6OkMyQWxsb2NhdG9yOjppZF90LCA6OmMyX3N0YXR1c190Kik7CisKK2NsYXNzIEMyUGxhdGZvcm1TdG9yZVBsdWdpbkxvYWRlciB7CitwdWJsaWM6CisgICAgc3RhdGljIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMlBsYXRmb3JtU3RvcmVQbHVnaW5Mb2FkZXI+JiBHZXRJbnN0YW5jZSgpOworICAgIH5DMlBsYXRmb3JtU3RvcmVQbHVnaW5Mb2FkZXIoKTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYmxvY2sgcG9vbCBmcm9tIHBsYXRmb3JtIHN0b3JlIGV4dGVuc2lvbi4KKyAgICAgKgorICAgICAqIFxwYXJhbSBhbGxvY3RvcklkICB0aGUgSUQgb2YgdGhlIGJhY2tpbmcgYWxsb2NhdG9yIHR5cGUuCisgICAgICogXHBhcmFtIGJsb2NrUG9vbElkIHRoZSBJRCBvZiBjcmVhdGVkIGJsb2NrIHBvb2wuCisgICAgICogXHBhcmFtIHBvb2wgICAgICAgIHNoYXJlZCBwb2ludGVyIHdoZXJlIHRoZSBjcmVhdGVkIGJsb2NrIHBvb2wgaXMgc3RvcmVkLgorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIGJsb2NrIHBvb2wgd2FzIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5LgorICAgICAqIFxyZXR2YWwgQzJfTk9UX0ZPVU5EIHRoZSBleHRlbnNpb24gc3ltYm9sIHdhcyBub3QgZm91bmQuCisgICAgICogXHJldHZhbCBDMl9CQURfSU5ERVggdGhlIGlucHV0IGFsbG9jYXRvcklkIGlzIG5vdCBkZWZpbmVkIGluIHBsYXRmb3JtIHN0b3JlIGV4dGVuc2lvbi4KKyAgICAgKi8KKyAgICBjMl9zdGF0dXNfdCBjcmVhdGVCbG9ja1Bvb2woOjpDMkFsbG9jYXRvcjo6aWRfdCBhbGxvY2F0b3JJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjpDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCBibG9ja1Bvb2xJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiogcG9vbCk7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGFsbG9jYXRvciBmcm9tIHBsYXRmb3JtIHN0b3JlIGV4dGVuc2lvbi4KKyAgICAgKgorICAgICAqIE5vdGUgdGhhdCB0aGlzIGFsbG9jYXRvciBpcyBub3QgY3JlYXRlZCBhcyBzaGFyZWQgc2luZ2xldG9uIGFzIEMyQWxsb2NhdG9yU3RvcmUgZG9lcywgYmVjYXVzZQorICAgICAqIEMgaW50ZXJmYWNlIG9ubHkgYWxsb3dzIHJhdyBwb2ludGVyIHRyYW5zbWlzc2lvbiBmb3IgZXh0ZW5zaW9uLgorICAgICAqCisgICAgICogXHBhcmFtIGFsbG9jdG9ySWQgIHRoZSBJRCBvZiB0aGUgYWxsb2NhdG9yIHRvIGNyZWF0ZS4KKyAgICAgKiBccGFyYW0gYWxsb2NhdG9yICAgc2hhcmVkIHBvaW50ZXIgd2hlcmUgdGhlIGNyZWF0ZWQgYWxsb2NhdG9yIGlzIHN0b3JlZC4KKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBhbGxvY2F0b3Igd2FzIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5LgorICAgICAqIFxyZXR2YWwgQzJfVElNRURfT1VUIGNvdWxkIG5vdCBjcmVhdGUgdGhlIGFsbG9jYXRvciB3aXRoaW4gdGhlIHRpbWUgbGltaXQgKHVuZXhwZWN0ZWQpCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duIGVycm9yIHByZXZlbnRlZCB0aGUgY3JlYXRpb24gb2YgdGhlIGFsbG9jYXRvciAodW5leHBlY3RlZCkKKyAgICAgKiBccmV0dmFsIEMyX05PVF9GT1VORCB0aGUgZXh0ZW5zaW9uIHN5bWJvbCB3YXMgbm90IGZvdW5kLgorICAgICAqIFxyZXR2YWwgQzJfQkFEX0lOREVYIHRoZSBpbnB1dCBhbGxvY2F0b3JJZCBpcyBub3QgZGVmaW5lZCBpbiBwbGF0Zm9ybSBzdG9yZSBleHRlbnNpb24uCisgICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgbm90IGVub3VnaCBtZW1vcnkgdG8gY3JlYXRlIHRoZSBhbGxvY2F0b3IKKyAgICAgKi8KKyAgICBjMl9zdGF0dXNfdCBjcmVhdGVBbGxvY2F0b3IoOjpDMkFsbG9jYXRvcjo6aWRfdCBhbGxvY2F0b3JJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiogY29uc3QgYWxsb2NhdG9yKTsKKworcHJpdmF0ZToKKyAgICBleHBsaWNpdCBDMlBsYXRmb3JtU3RvcmVQbHVnaW5Mb2FkZXIoY29uc3QgY2hhciAqbGliUGF0aCk7CisKKyAgICBzdGF0aWMgYW5kcm9pZDo6TXV0ZXggc011dGV4OworICAgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8QzJQbGF0Zm9ybVN0b3JlUGx1Z2luTG9hZGVyPiBzSW5zdGFuY2U7CisKKyAgICB2b2lkICptTGliSGFuZGxlOworICAgIENyZWF0ZUJsb2NrUG9vbEZ1bmMgbUNyZWF0ZUJsb2NrUG9vbDsKKyAgICBDcmVhdGVBbGxvY2F0b3JGdW5jIG1DcmVhdGVBbGxvY2F0b3I7Cit9OworCisjZW5kaWYgIC8vIFNUQUdFRlJJR0hUX0MyX1BMQVRGT1JNX1NUT1JFX1BMVUdJTl9MT0FERVJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJQbGF0Zm9ybVN1cHBvcnQuaCBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJQbGF0Zm9ybVN1cHBvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzEyODJjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMlBsYXRmb3JtU3VwcG9ydC5oCkBAIC0wLDAgKzEsMTM2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBTVEFHRUZSSUdIVF9DT0RFQzJfUExBVEZPUk1fU1VQUE9SVF9IXworI2RlZmluZSBTVEFHRUZSSUdIVF9DT0RFQzJfUExBVEZPUk1fU1VQUE9SVF9IXworCisjaW5jbHVkZSA8QzJDb21wb25lbnQuaD4KKyNpbmNsdWRlIDxDMkNvbXBvbmVudEZhY3RvcnkuaD4KKworI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKioKKyAqIFJldHVybnMgdGhlIHBsYXRmb3JtIGFsbG9jYXRvciBzdG9yZS4KKyAqIFxyZXR2YWwgbnVsbHB0ciBpZiB0aGUgcGxhdGZvcm0gYWxsb2NhdG9yIHN0b3JlIGNvdWxkIG5vdCBiZSBvYnRhaW5lZAorICovCitzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3JTdG9yZT4gR2V0Q29kZWMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZSgpOworCisvKioKKyAqIFBsYXRmb3JtIGFsbG9jYXRvciBzdG9yZSBJRHMKKyAqLworY2xhc3MgQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlIDogcHVibGljIEMyQWxsb2NhdG9yU3RvcmUgeworcHVibGljOgorICAgIGVudW0gOiBpZF90IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIElEIG9mIHRoZSBpb24gYmFja2VkIHBsYXRmb3JtIGFsbG9jYXRvci4KKyAgICAgICAgICoKKyAgICAgICAgICogQzJIYW5kbGUgY29uc2lzdHMgb2Y6CisgICAgICAgICAqICAgZmQgIHNoYXJlZCBpb24gYnVmZmVyIGhhbmRsZQorICAgICAgICAgKiAgIGludCBzaXplIChsbyAzMiBiaXRzKQorICAgICAgICAgKiAgIGludCBzaXplIChoaSAzMiBiaXRzKQorICAgICAgICAgKiAgIGludCBtYWdpYyAnXHhjMmlvXHgwMCcKKyAgICAgICAgICovCisgICAgICAgIElPTiA9IFBMQVRGT1JNX1NUQVJULAorCisgICAgICAgIC8qKgorICAgICAgICAgKiBJRCBvZiB0aGUgZ3JhbGxvYyBiYWNrZWQgcGxhdGZvcm0gYWxsb2NhdG9yLgorICAgICAgICAgKgorICAgICAgICAgKiBDMkhhbmRsZSBsYXlvdXQgaXMgbm90IHB1YmxpYy4gVXNlIEMyQWxsb2NhdG9yR3JhbGxvYzo6VW53cmFwTmF0aXZlQ29kZWMyR3JhbGxvY0hhbmRsZQorICAgICAgICAgKiB0byBnZXQgdGhlIHVuZGVybHlpbmcgZ3JhbGxvYyBoYW5kbGUgZnJvbSBhIEMySGFuZGxlLCBhbmQgV3JhcE5hdGl2ZUNvZGVjMkdyYWxsb2NIYW5kbGUKKyAgICAgICAgICogdG8gY3JlYXRlIGEgQzJIYW5kbGUgZnJvbSBhIGdyYWxsb2MgaGFuZGxlIC0gZm9yIEMyQWxsb2NhdG9yOjpwcmlvckFsbG9jYXRpb24uCisgICAgICAgICAqLworICAgICAgICBHUkFMTE9DLAorCisgICAgICAgIC8qKgorICAgICAgICAgKiBJRCBvZiB0aGUgYnVmZmVycXVldWUgYmFja2VkIHBsYXRmb3JtIGFsbG9jYXRvci4KKyAgICAgICAgICoKKyAgICAgICAgICogQzJIYW5kbGUgbGF5b3V0IGlzIG5vdCBwdWJsaWMuIFVzZSBDMkFsbG9jYXRvckdyYWxsb2M6OlVud3JhcE5hdGl2ZUNvZGVjMkdyYWxsb2NIYW5kbGUKKyAgICAgICAgICogdG8gZ2V0IHRoZSB1bmRlcmx5aW5nIGhhbmRsZSBmcm9tIGEgQzJIYW5kbGUsIGFuZCBXcmFwTmF0aXZlQ29kZWMyR3JhbGxvY0hhbmRsZQorICAgICAgICAgKiB0byBjcmVhdGUgYSBDMkhhbmRsZSBmcm9tIGEgaGFuZGxlIC0gZm9yIEMyQWxsb2NhdG9yOjpwcmlvckFsbG9jYXRpb24uCisgICAgICAgICAqLworICAgICAgICBCVUZGRVJRVUVVRSwKKworICAgICAgICAvKioKKyAgICAgICAgICogSUQgb2YgaW5kaWNhdGluZyB0aGUgZW5kIG9mIHBsYXRmb3JtIGFsbG9jYXRvciBkZWZpbml0aW9uLgorICAgICAgICAgKgorICAgICAgICAgKiBcbm90ZSBhbHdheXMgcHV0IHRoaXMgbWFjcm8gaW4gdGhlIGxhc3QgcGxhY2UuCisgICAgICAgICAqCisgICAgICAgICAqIEV4dGVuZGVkIHBsYXRmb3JtIHN0b3JlIHBsdWdpbiBzaG91bGQgdXNlIHRoaXMgbWFjcm8gYXMgdGhlIHN0YXJ0IElEIG9mIGl0cyBvd24gYWxsb2NhdG9yCisgICAgICAgICAqIHR5cGVzLgorICAgICAgICAgKi8KKyAgICAgICAgUExBVEZPUk1fRU5ELAorICAgIH07Cit9OworCisvKioKKyAqIFJldHJpZXZlcyBhIGJsb2NrIHBvb2wgZm9yIGEgY29tcG9uZW50LgorICoKKyAqIFxwYXJhbSBpZCAgICAgICAgdGhlIGxvY2FsIElEIG9mIHRoZSBibG9jayBwb29sCisgKiBccGFyYW0gY29tcG9uZW50IHRoZSBjb21wb25lbnQgdXNpbmcgdGhlIGJsb2NrIHBvb2wgKG11c3QgYmUgbm9uLW51bGwpCisgKiBccGFyYW0gcG9vbCAgICAgIHBvaW50ZXIgdG8gd2hlcmUgdGhlIG9idGFpbmVkIGJsb2NrIHBvb2wgc2hhbGwgYmUgc3RvcmVkIG9uIHN1Y2Nlc3MuIG51bGxwdHIKKyAqICAgICAgICAgICAgICAgICAgd2lsbCBiZSBzdG9yZWQgaGVyZSBvbiBmYWlsdXJlCisgKgorICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bAorICogXHJldHZhbCBDMl9CQURfVkFMVUUgdGhlIGNvbXBvbmVudCBpcyBudWxsCisgKiBccmV0dmFsIEMyX05PVF9GT1VORCBpZiB0aGUgYmxvY2sgcG9vbCBkb2VzIG5vdCBleGlzdAorICogXHJldHZhbCBDMl9OT19NRU1PUlkgbm90IGVub3VnaCBtZW1vcnkgdG8gZmV0Y2ggdGhlIGJsb2NrIHBvb2wgKHRoaXMgcmV0dXJuIHZhbHVlIGlzIG9ubHkKKyAqICAgICAgICAgICAgICAgICAgICAgIHBvc3NpYmxlIGZvciBiYXNpYyBwb29scykKKyAqIFxyZXR2YWwgQzJfVElNRURfT1VUIHRoZSBvcGVyYXRpb24gdGltZWQgb3V0ICh0aGlzIHJldHVybiB2YWx1ZSBpcyBvbmx5IHBvc3NpYmxlIGZvciBiYXNpYyBwb29scykKKyAqIFxyZXR2YWwgQzJfUkVGVVNFRCAgIG5vIHBlcm1pc3Npb24gdG8gY29tcGxldGUgYW55IHJlcXVpcmVkIGFsbG9jYXRpb24gKHRoaXMgcmV0dXJuIHZhbHVlIGlzIG9ubHkKKyAqICAgICAgICAgICAgICAgICAgICAgIHBvc3NpYmxlIGZvciBiYXNpYyBwb29scykKKyAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biwgdW5yZWNvdmVyYWJsZSBlcnJvciBvY2N1cmVkIGR1cmluZyBvcGVyYXRpb24gKHVuZXhwZWN0ZWQsCisgKiAgICAgICAgICAgICAgICAgICAgICB0aGlzIHJldHVybiB2YWx1ZSBpcyBvbmx5IHBvc3NpYmxlIGZvciBiYXNpYyBwb29scykKKyAqLworYzJfc3RhdHVzX3QgR2V0Q29kZWMyQmxvY2tQb29sKAorICAgICAgICBDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCBpZCwgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyQ29tcG9uZW50PiBjb21wb25lbnQsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gKnBvb2wpOworCisvKioKKyAqIENyZWF0ZXMgYSBibG9jayBwb29sLgorICogXHBhcmFtIGFsbG9jYXRvcklkICB0aGUgYWxsb2NhdG9yIElEIHdoaWNoIGlzIHVzZWQgdG8gYWxsb2NhdGUgYmxvY2tzCisgKiBccGFyYW0gY29tcG9uZW50ICAgICB0aGUgY29tcG9uZW50IHVzaW5nIHRoZSBibG9jayBwb29sIChtdXN0IGJlIG5vbi1udWxsKQorICogXHBhcmFtIHBvb2wgICAgICAgICAgcG9pbnRlciB0byB3aGVyZSB0aGUgY3JlYXRlZCBibG9jayBwb29sIHNoYWxsIGJlIHN0b3JlIG9uIHN1Y2Nlc3MuCisgKiAgICAgICAgICAgICAgICAgICAgICBudWxscHRyIHdpbGwgYmUgc3RvcmVkIGhlcmUgb24gZmFpbHVyZQorICoKKyAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwKKyAqIFxyZXR2YWwgQzJfQkFEX1ZBTFVFIHRoZSBjb21wb25lbnQgaXMgbnVsbAorICogXHJldHZhbCBDMl9OT1RfRk9VTkQgaWYgdGhlIGFsbG9jYXRvciBkb2VzIG5vdCBleGlzdAorICogXHJldHZhbCBDMl9OT19NRU1PUlkgbm90IGVub3VnaCBtZW1vcnkgdG8gY3JlYXRlIGEgYmxvY2sgcG9vbAorICovCitjMl9zdGF0dXNfdCBDcmVhdGVDb2RlYzJCbG9ja1Bvb2woCisgICAgICAgIEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTo6aWRfdCBhbGxvY2F0b3JJZCwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyQ29tcG9uZW50PiBjb21wb25lbnQsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gKnBvb2wpOworCisvKioKKyAqIFJldHVybnMgdGhlIHBsYXRmb3JtIGNvbXBvbmVudCBzdG9yZS4KKyAqIFxyZXR2YWwgbnVsbHB0ciBpZiB0aGUgcGxhdGZvcm0gY29tcG9uZW50IHN0b3JlIGNvdWxkIG5vdCBiZSBvYnRhaW5lZAorICovCitzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRTdG9yZT4gR2V0Q29kZWMyUGxhdGZvcm1Db21wb25lbnRTdG9yZSgpOworCisvKioKKyAqIFNldHMgdGhlIHByZWZlcnJlZCBjb21wb25lbnQgc3RvcmUgaW4gdGhpcyBwcm9jZXNzIGZvciB0aGUgc29sZSBwdXJwb3NlIG9mIGFjY2Vzc2luZyBpdHMKKyAqIGludGVyZmFjZS4gSWYgdGhpcyBpcyBub3QgY2FsbGVkLCB0aGUgZGVmYXVsdCBJQ29tcG9uZW50U3RvcmUgSEFMIChpZiBleGlzdHMpIGlzIHRoZSBwcmVmZXJyZWQKKyAqIHN0b3JlIGZvciB0aGlzIHB1cnBvc2UuIElmIHRoZSBkZWZhdWx0IElDb21wb25lbnRTdG9yZSBIQUwgaXMgbm90IHByZXNlbnQsIHRoZSBwbGF0Zm9ybQorICogY29tcG9uZW50IHN0b3JlIGlzIHVzZWQuCisgKi8KK3ZvaWQgU2V0UHJlZmVycmVkQ29kZWMyQ29tcG9uZW50U3RvcmUoc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50U3RvcmU+IHN0b3JlKTsKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gU1RBR0VGUklHSFRfQ09ERUMyX1BMQVRGT1JNX1NVUFBPUlRfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvYW5kcm9pZC1DMkRlYnVnLWxvZy5oIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9hbmRyb2lkLUMyRGVidWctbG9nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTkxMDIyOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvYW5kcm9pZC1DMkRlYnVnLWxvZy5oCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEMyVVRJTFNfQU5EUk9JRF9ERUJVR19MT0dfSF8KKyNkZWZpbmUgQzJVVElMU19BTkRST0lEX0RFQlVHX0xPR19IXworCisvKgorICogQW5kcm9pZCBwcm92aWRlcyBsb2dnaW5nIGFuZCBkZWJ1ZyBtYWNyb3MuIFJlZGVmaW5lIHRoZW0gd2l0aCBDMiBwcmVmaXggYW5kIGFkZCBzdXBwb3J0IGZvcgorICogb3B0aW5nIG91dCBvZiB2ZXJib3NlIGxvZ3MuCisgKi8KKworI2lmZGVmIEMyX0xPR19UQUcKKyNkZWZpbmUgTE9HX1RBRyBDMl9MT0dfVEFHCisjZW5kaWYKKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisKKyNpZmRlZiBDMl9MT0dfVkVSQk9TRQorI2RlZmluZSBDMl9MT0coTEVWRUwpIExPRyg6OmFuZHJvaWQ6OmJhc2U6OkxFVkVMKQorI2Vsc2UKKy8qKgorICogVXNlIGFzIGZvbGxvd3M6CisgKgorICogI2RlZmluZSBDMl9MT0dfVEFHICJ0YWciCisgKiAvLyNkZWZpbmUgQzJfTE9HX1ZFUkJPU0UgIC8vIGVuYWJsZSB2ZXJib3NlIGxvZ3MgaW4gdGhpcyBmaWxlCisgKiAjaW5jbHVkZSA8QzJEZWJ1Zy5oPgorICoKKyAqIEMyX0xPRyhERUJVRykgPDwgZXhwciAuLi47CisgKgorICogTG9nIGxldmVscyBhcmU6IFZFUkJPU0UsIERFQlVHLCBJTkZPLCBXQVJOSU5HLCBFUlJPUiwgRkFUQUwgKGFib3J0cykuCisgKgorICogTm8gZW5kbCBpcyByZXF1aXJlZC4KKyAqLworI2RlZmluZSBDMl9MT0coTEVWRUwpIFwKKyAgICAgICAgKDo6YW5kcm9pZDo6YmFzZTo6TEVWRUwgIT0gOjphbmRyb2lkOjpiYXNlOjpWRVJCT1NFKSAmJiBMT0coOjphbmRyb2lkOjpiYXNlOjpMRVZFTCkKKyNlbmRpZgorCisjZGVmaW5lIEMyX0NIRUNLICAgIENIRUNLCisjZGVmaW5lIEMyX0NIRUNLX0xUIENIRUNLX0xUCisjZGVmaW5lIEMyX0NIRUNLX0xFIENIRUNLX0xFCisjZGVmaW5lIEMyX0NIRUNLX0VRIENIRUNLX0VRCisjZGVmaW5lIEMyX0NIRUNLX0dFIENIRUNLX0dFCisjZGVmaW5lIEMyX0NIRUNLX0dUIENIRUNLX0dUCisjZGVmaW5lIEMyX0NIRUNLX05FIENIRUNLX05FCisKKyNkZWZpbmUgQzJfRENIRUNLICAgIERDSEVDSworI2RlZmluZSBDMl9EQ0hFQ0tfTFQgRENIRUNLX0xUCisjZGVmaW5lIEMyX0RDSEVDS19MRSBEQ0hFQ0tfTEUKKyNkZWZpbmUgQzJfRENIRUNLX0VRIERDSEVDS19FUQorI2RlZmluZSBDMl9EQ0hFQ0tfR0UgRENIRUNLX0dFCisjZGVmaW5lIEMyX0RDSEVDS19HVCBEQ0hFQ0tfR1QKKyNkZWZpbmUgQzJfRENIRUNLX05FIERDSEVDS19ORQorCisjZW5kaWYgIC8vIEMyVVRJTFNfQU5EUk9JRF9ERUJVR19MT0dfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvdXRpbC9DMkRlYnVnLWJhc2UuaCBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvdXRpbC9DMkRlYnVnLWJhc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDQwZTQyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS91dGlsL0MyRGVidWctYmFzZS5oCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEMyVVRJTFNfREVCVUdfQkFTRV9IXworI2RlZmluZSBDMlVUSUxTX0RFQlVHX0JBU0VfSF8KKworI2luY2x1ZGUgPGlvc3RyZWFtPgorCisvKioKKyAqIERlYnVnIHByaW50IHV0aWxpdGllcyBmb3IgQ29kZWMgMi4wIGJhc2Ugb2JqZWN0cy4KKyAqLworCisjZGVmaW5lIEMyX0RFQ0xBUkVfQVNfU1RSSU5HX0FORF9ERUZJTkVfU1RSRUFNX09VVCh0eXBlKSBcCitjb25zdCBjaGFyICphc1N0cmluZyh0eXBlIGksIGNvbnN0IGNoYXIgKmRlZiA9ICI/PyIpOyBcCitpbmxpbmUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IHR5cGUgJmkpIHsgXAorICAgIHJldHVybiBvcyA8PCBhc1N0cmluZyhpKTsgXAorfQorCitDMl9ERUNMQVJFX0FTX1NUUklOR19BTkRfREVGSU5FX1NUUkVBTV9PVVQoYzJfc3RhdHVzX3QpCisKKworI2VuZGlmICAvLyBDMlVUSUxTX0RFQlVHX0JBU0VfSF8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS91dGlsL0MyRGVidWctaW50ZXJmYWNlLmggYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL3V0aWwvQzJEZWJ1Zy1pbnRlcmZhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjMxODc1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS91dGlsL0MyRGVidWctaW50ZXJmYWNlLmgKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQzJVVElMU19ERUJVR19JTlRFUkZBQ0VfSF8KKyNkZWZpbmUgQzJVVElMU19ERUJVR19JTlRFUkZBQ0VfSF8KKworI2luY2x1ZGUgPHV0aWwvQzJEZWJ1Zy1iYXNlLmg+CisjaW5jbHVkZSA8dXRpbC9DMkludGVyZmFjZVV0aWxzLmg+CisKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlN1cHBvcnRlZFJhbmdlPFQ+ICZpKTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlN1cHBvcnRlZFZhbHVlU2V0PFQ+ICZpKTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+ICZpKTsKKworI2VuZGlmICAvLyBDMlVUSUxTX0RFQlVHX0lOVEVSRkFDRV9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS91dGlsL0MyRGVidWctbG9nLmggYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL3V0aWwvQzJEZWJ1Zy1sb2cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTVjNGMxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS91dGlsL0MyRGVidWctbG9nLmgKQEAgLTAsMCArMSwyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQzJVVElMU19ERUJVR19MT0dfSF8KKyNkZWZpbmUgQzJVVElMU19ERUJVR19MT0dfSF8KKworLy8gUGxhdGZvcm0gc3BlY2lmaWMgZGVidWcgdXRpbGl0aWVzCisjaWZkZWYgX19BTkRST0lEX18KKyNpbmNsdWRlIDxhbmRyb2lkLUMyRGVidWctbG9nLmg+CisjZWxzZQorLy8gVE9ETzogaW1wbGVtZW50IGJhc2UgZGVidWcgdXRpbHMKKyNlbmRpZgorCisjZW5kaWYgIC8vIEMyVVRJTFNfREVCVUdfTE9HX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL3V0aWwvQzJEZWJ1Zy1wYXJhbS5oIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS91dGlsL0MyRGVidWctcGFyYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWMxZGUwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS91dGlsL0MyRGVidWctcGFyYW0uaApAQCAtMCwwICsxLDM3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDMlVUSUxTX0RFQlVHX1BBUkFNX0hfCisjZGVmaW5lIEMyVVRJTFNfREVCVUdfUEFSQU1fSF8KKworI2luY2x1ZGUgPEMyUGFyYW0uaD4KKyNpbmNsdWRlIDx1dGlsL0MyRGVidWctYmFzZS5oPgorCisjaW5jbHVkZSA8aW9zdHJlYW0+CisKKy8qKgorICogRGVidWcvcHJpbnQgZGVjbGFyYXRpb25zIGZvciBvYmplY3RzIGRlZmluZWQgaW4gQzJQYXJhbS5oCisgKi8KK0MyX0RFQ0xBUkVfQVNfU1RSSU5HX0FORF9ERUZJTkVfU1RSRUFNX09VVChDMkZpZWxkRGVzY3JpcHRvcjo6dHlwZV90KQorCitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJQYXJhbTo6Q29yZUluZGV4ICZpKTsKK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlBhcmFtOjpUeXBlICZpKTsKK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlBhcmFtOjpJbmRleCAmaSk7CitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgX0MyRmllbGRJZCAmaSk7CitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJGaWVsZERlc2NyaXB0b3IgJmkpOworc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyUGFyYW1GaWVsZCAmaSk7CisKKyNlbmRpZiAgLy8gQzJVVElMU19ERUJVR19QQVJBTV9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS91dGlsL0MySW50ZXJmYWNlSGVscGVyLmggYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL3V0aWwvQzJJbnRlcmZhY2VIZWxwZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmI0M2FmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS91dGlsL0MySW50ZXJmYWNlSGVscGVyLmgKQEAgLTAsMCArMSw3NTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEMyVVRJTFNfSU5URVJGQUNFX0hFTFBFUl9IXworI2RlZmluZSBDMlVUSUxTX0lOVEVSRkFDRV9IRUxQRVJfSF8KKworI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8dXRpbC9DMkludGVyZmFjZVV0aWxzLmg+CisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bXV0ZXg+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKy8qKgorICogSW50ZXJmYWNlIEhlbHBlcgorICovCit1c2luZyBDMlIgPSBDMlNldHRpbmdSZXN1bHRzQnVpbGRlcjsKKwordGVtcGxhdGU8dHlwZW5hbWUgVCwgYm9vbCBFPXN0ZDo6aXNfZW51bTxUPjo6dmFsdWU+CitzdHJ1Y3QgX2MyX3JlZHVjZV9lbnVtX3RvX3VuZGVybHlpbmdfdHlwZSB7CisgICAgdHlwZWRlZiBUIHR5cGU7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IF9jMl9yZWR1Y2VfZW51bV90b191bmRlcmx5aW5nX3R5cGU8VCwgdHJ1ZT4geworICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjp1bmRlcmx5aW5nX3R5cGU8VD46OnR5cGUgdHlwZTsKK307CisKKy8qKgorICogSGVscGVyIGNsYXNzIHRvIGltcGxlbWVudCBwYXJhbWV0ZXIgcmVmbGVjdG9ycy4gVGhpcyBjbGFzcyBpcyBkeW5hbWljIGFuZCBpcyBkZXNpZ25lZCB0byBiZQorICogc2hhcmVkIGJ5IG11bHRpcGxlIGludGVyZmFjZXMuIFRoaXMgYWxsb3dzIGludGVyZmFjZXMgdG8gYWRkIHN0cnVjdHVyZSBkZXNjcmlwdG9ycyBhcyBuZWVkZWQuCisgKi8KK2NsYXNzIEMyUmVmbGVjdG9ySGVscGVyIDogcHVibGljIEMyUGFyYW1SZWZsZWN0b3IgeworcHVibGljOgorICAgIEMyUmVmbGVjdG9ySGVscGVyKCkgPSBkZWZhdWx0OworICAgIHZpcnR1YWwgfkMyUmVmbGVjdG9ySGVscGVyKCkgPSBkZWZhdWx0OworICAgIHZpcnR1YWwgc3RkOjp1bmlxdWVfcHRyPEMyU3RydWN0RGVzY3JpcHRvcj4gZGVzY3JpYmUoCisgICAgICAgICAgICBDMlBhcmFtOjpDb3JlSW5kZXggcGFyYW1JbmRleCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICAvKioKKyAgICAgKiBBZGRzIHN1cHBvcnQgZm9yIGRlc2NyaWJpbmcgdGhlIGdpdmVuIHBhcmFtZXRlcnMuCisgICAgICoKKyAgICAgKiBccGFyYW0gUGFyYW1zIHR5cGVzIG9mIGNvZGVjIDIuMCBzdHJ1Y3RzIChvciBwYXJhbWV0ZXJzKSB0byBkZXNjcmliZQorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIFBhcmFtcz4KKyAgICBDMl9JTkxJTkUgdm9pZCBhZGRTdHJ1Y3REZXNjcmlwdG9ycygpIHsKKyAgICAgICAgc3RkOjp2ZWN0b3I8QzJTdHJ1Y3REZXNjcmlwdG9yPiBzdHJ1Y3RzOworICAgICAgICBhZGRTdHJ1Y3REZXNjcmlwdG9ycyhzdHJ1Y3RzLCAoX1R1cGxlPFBhcmFtcy4uLj4gKiludWxscHRyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIHN1cHBvcnQgZm9yIGRlc2NyaWJpbmcgYSBzcGVjaWZpYyBzdHJ1Y3QuCisgICAgICoKKyAgICAgKiBccGFyYW0gc3RydWt0IGRlc2NyaXB0b3IgZm9yIHRoZSBzdHJ1Y3QgdGhhdCB3aWxsIGJlIG1vdmVkIG91dC4KKyAgICAgKi8KKyAgICB2b2lkIGFkZFN0cnVjdERlc2NyaXB0b3IoQzJTdHJ1Y3REZXNjcmlwdG9yICYmc3RydWt0KTsKKworcHJpdmF0ZToKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBQYXJhbXM+CisgICAgY2xhc3MgQzJfSElERSBfVHVwbGUgeyB9OworCisgICAgLyoqCisgICAgICogQWRkcyBzdXBwb3J0IGZvciBkZXNjcmliaW5nIHRoZSBnaXZlbiBkZXNjcmlwdG9ycy4KKyAgICAgKgorICAgICAqIFxwYXJhbSBzdHJ1Y3RzIExpc3Qgb2Ygc3RydWN0dXJlIGRlc2NyaXB0b3JzIHRvIGFkZCBzdXBwb3J0IGZvcgorICAgICAqLworICAgIHZvaWQgYWRkU3RydWN0RGVzY3JpcHRvcnMoCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDMlN0cnVjdERlc2NyaXB0b3I+ICZzdHJ1Y3RzLCBfVHVwbGU8PiAqKTsKKworICAgIC8qKgorICAgICAqIFV0aWxpdHkgbWV0aG9kIHRoYXQgYWRkcyBzdXBwb3J0IGZvciBkZXNjcmliaW5nIHRoZSBnaXZlbiBkZXNjcmlwdG9ycyBpbiBhIHJlY3Vyc2l2ZSBtYW5uZXIKKyAgICAgKiBvbmUgc3RydWN0dXJlIGF0IGEgdGltZSB1c2luZyBhIGxpc3Qgb2Ygc3RydWN0dXJlIGRlc2NyaXB0b3JzIHRlbXBvcmFyeS4KKyAgICAgKgorICAgICAqIFxwYXJhbSBUIHRoZSB0eXBlIG9mIGNvZGVjIDIuMCBzdHJ1Y3QgdG8gZGVzY3JpYmUKKyAgICAgKiBccGFyYW0gUGFyYW1zIHJlc3Qgb2YgdGhlIHN0cnVjdHMKKyAgICAgKiBccGFyYW0gc3RydWN0cyBUZW1wb3JhcnkgbGlzdCBvZiBzdHJ1Y3R1cmUgZGVzY3JpcHRvcnMgdXNlZCB0byBvcHRpbWl6ZSB0aGUgb3BlcmF0aW9uLgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lLi4uIFBhcmFtcz4KKyAgICBDMl9JTkxJTkUgdm9pZCBhZGRTdHJ1Y3REZXNjcmlwdG9ycygKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEMyU3RydWN0RGVzY3JpcHRvcj4gJnN0cnVjdHMsIF9UdXBsZTxULCBQYXJhbXMuLi4+ICopIHsKKyAgICAgICAgc3RydWN0cy5lbXBsYWNlX2JhY2soKFQqKW51bGxwdHIpOworICAgICAgICBhZGRTdHJ1Y3REZXNjcmlwdG9ycyhzdHJ1Y3RzLCAoX1R1cGxlPFBhcmFtcy4uLj4gKiludWxscHRyKTsKKyAgICB9CisKKyAgICBtdXRhYmxlIHN0ZDo6bXV0ZXggX21NdXRleDsKKyAgICBzdGQ6Om1hcDxDMlBhcmFtOjpDb3JlSW5kZXgsIGNvbnN0IEMyU3RydWN0RGVzY3JpcHRvcj4gX21TdHJ1Y3RzOyAvLy88IGRlc2NyaXB0b3JzCit9OworCisvKioKKyAqIFV0aWxpdHkgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZSBjb2RlYyAyLjAgaW50ZXJmYWNlIEFQSS1zIGZvciBzb21lIHBhcmFtZXRlcnMuCisgKgorICogVGhpcyBjbGFzcyBtdXN0IGJlIHN1YmNsYXNzZWQuCisgKi8KK2NsYXNzIEMySW50ZXJmYWNlSGVscGVyIHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBiYXNlIG9mZnNldCBvZiBhIGZpZWxkIGF0IHxvZmZzZXR8IHRoYXQgY291bGQgYmUgcGFydCBvZiBhbiBhcnJheSBvciBwYXJ0IG9mIGEKKyAgICAgKiBzdWItc3RydWN0dXJlLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgZG9lcyBub3QgZG8gZmllbGQgc2l6ZSB2ZXJpZmljYXRpb24sIGUuZy4gaWYgb2Zmc2V0IGlmIG9idGFpbmVkIGZyb20gYSBzdHJ1Y3R1cmUsCisgICAgICogaXQgd2lsbCBub3Qgc3RvcCBhdCB0aGUgc3RydWN0dXJlIGJvdW5kYXJ5IC0gdGhpcyBpcyBva2F5LCBhcyB3ZSBqdXN0IHdhbnQgdGhlIGJhc2Ugb2Zmc2V0CisgICAgICogaGVyZSwgd2hpY2ggaXMgdGhlIHNhbWUuCisgICAgICovCisgICAgc3RhdGljCisgICAgc2l6ZV90IEdldEJhc2VPZmZzZXQoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+ICZyZWZsZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyUGFyYW06OkNvcmVJbmRleCBpbmRleCwgc2l6ZV90IG9mZnNldCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgaW50ZXJmYWNlIGhlbHBlciBjbGFzcyB1c2VzIHJlZmVyZW5jZXMgdG8gc3RkOjpzaGFyZWRfcHRyPFQ+IGNvbmZpZyBwYXJhbWV0ZXJzLgorICAgICAqIEludGVybmFsbHksIHRoZXNlIG5lZWQgdG8gYmUgZ2VuZXJhbGl6ZWQgdG8gc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW0+IHJlZnMsIGJ1dCB0aGUgY2FzdCBpcworICAgICAqIG5vdCBhbGxvd2VkIChhcyB0aGVzZSBhcmUgcmVmZXJlbmNlcykuIEFzIHN1Y2gsIHRoaXMgY2xhc3MgbmV2ZXIgcmV0dXJucyBwb2ludGVyIHRvIHRoZQorICAgICAqIHNoYXJlZF9wdHJzLgorICAgICAqLworICAgIHN0cnVjdCBQYXJhbVJlZiB7CisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIGVuYWJsZT0KKyAgICAgICAgICAgICAgICB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2NvbnZlcnRpYmxlPFQsIEMyUGFyYW0+Ojp2YWx1ZT46OnR5cGU+CisgICAgICAgIGlubGluZSBDMl9ISURFIFBhcmFtUmVmKHN0ZDo6c2hhcmVkX3B0cjxUPiAmcGFyYW0pCisgICAgICAgICAgICA6IF9tUmVmKHJlaW50ZXJwcmV0X2Nhc3Q8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW0+Kj4oJnBhcmFtKSkgeyB9CisKKyAgICAgICAgLy8gdXNlZCBieSBjb21wYXJpc29uIG9wZXJhdG9yIGZvciBjb250YWluZXJzCisgICAgICAgIG9wZXJhdG9yIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtPiAqKCkgY29uc3QgeyByZXR1cm4gX21SZWY7IH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyBhIHNoYXJlZCBwb2ludGVyIHRvIHRoZSBwYXJhbWV0ZXIuCisgICAgICAgICAqLworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbT4gZ2V0KCkgY29uc3QgeyByZXR1cm4gKl9tUmVmOyB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbT4gKl9tUmVmOworICAgIH07CisKKyAgICAvKioKKyAgICAgKiBGaWVsZCBoZWxwZXIuCisgICAgICoKKyAgICAgKiBDb250YWlucyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGZvciB0aGUgZmllbGQ6IHBvc3NpYmxlIHZhbHVlcywgYW5kIGN1cnJlbnRseSBzdXBwb3J0ZWQKKyAgICAgKiB2YWx1ZXMuCisgICAgICovCisgICAgY2xhc3MgRmllbGRIZWxwZXIgeworICAgIHB1YmxpYzoKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZXMgaGVscGVyIGZvciBhIGZpZWxkIHdpdGggZ2l2ZW4gcG9zc2libGUgdmFsdWVzLgorICAgICAgICAgKgorICAgICAgICAgKiBccGFyYW0gcGFyYW0gcGFyYW1ldGVyIHJlZmVyZW5jZS4gVGhlIHBhcmFtZXRlciBkb2VzIG5vdCBoYXZlIHRvIGJlIGluaXRpYWxpemVkIGF0IHRoaXMKKyAgICAgICAgICogICAgICAgIHBvaW50LgorICAgICAgICAgKiBccGFyYW0gZmllbGQgZmllbGQgaWRlbnRpZmllcgorICAgICAgICAgKiBccGFyYW0gdmFsdWVzIHBvc3NpYmxlIHZhbHVlcyBmb3IgdGhlIGZpZWxkCisgICAgICAgICAqLworICAgICAgICBGaWVsZEhlbHBlcihjb25zdCBQYXJhbVJlZiAmcGFyYW0sIGNvbnN0IF9DMkZpZWxkSWQgJmZpZWxkLAorICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJGaWVsZFN1cHBvcnRlZFZhbHVlcz4gJiZ2YWx1ZXMpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGVzIGEgcGFyYW0tZmllbGQgaWRlbnRpZmllciBmb3IgdGhpcyBmaWVsZC4gVGhpcyBtZXRob2QgaXMgY2FsbGVkIGFmdGVyIHRoZQorICAgICAgICAgKiB1bmRlcmx5aW5nIHBhcmFtZXRlciBoYXMgYmVlbiBpbml0aWFsaXplZC4KKyAgICAgICAgICoKKyAgICAgICAgICogXGFyYW0gaW5kZXgKKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBDMlBhcmFtRmllbGQKKyAgICAgICAgICovCisgICAgICAgIEMyUGFyYW1GaWVsZCBtYWtlUGFyYW1GaWVsZChDMlBhcmFtOjpJbmRleCBpbmRleCkgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldHMgdGhlIGN1cnJlbnRseSBzdXBwb3J0ZWQgdmFsdWVzIGZvciB0aGlzIGZpZWxkLgorICAgICAgICAgKgorICAgICAgICAgKiBccGFyYW0gdmFsdWVzIGN1cnJlbnRseSBzdXBwb3J0ZWQgdmFsdWVzIHRoYXQgd2lsbCBiZSBtb3ZlZCBvdXQKKyAgICAgICAgICovCisgICAgICAgIHZvaWQgc2V0U3VwcG9ydGVkVmFsdWVzKHN0ZDo6dW5pcXVlX3B0cjxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzPiAmJnZhbHVlcyk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldHMgdGhlIGN1cnJlbnRseSBzdXBwb3J0ZWQgdmFsdWVzIGZvciB0aGlzIGZpZWxkLiBUaGlzIGRlZmF1bHRzIHRvIHRoZSBwb3NzaWJsZSB2YWx1ZXMKKyAgICAgICAgICogaWYgY3VycmVudGx5IHN1cHBvcnRlZCB2YWx1ZXMgd2VyZSBuZXZlciBzZXQuCisgICAgICAgICAqLworICAgICAgICBjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzICpnZXRTdXBwb3J0ZWRWYWx1ZXMoKSBjb25zdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0cyB0aGUgcG9zc2libGUgdmFsdWVzIGZvciB0aGlzIGZpZWxkLgorICAgICAgICAgKi8KKyAgICAgICAgY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyAqZ2V0UG9zc2libGVWYWx1ZXMoKSBjb25zdDsKKworICAgIHByb3RlY3RlZDoKKyAgICAgICAgLy8gVE9ETzogbW92ZSB0byBpbXBsIGZvciBzYWZldHkKKyAgICAgICAgUGFyYW1SZWYgbVBhcmFtOworICAgICAgICBfQzJGaWVsZElkIG1GaWVsZElkOworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJGaWVsZFN1cHBvcnRlZFZhbHVlcz4gbVBvc3NpYmxlOworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJGaWVsZFN1cHBvcnRlZFZhbHVlcz4gbVN1cHBvcnRlZDsgLy8vPCBpZiBkaWZmZXJlbnQgZnJvbSBwb3NzaWJsZQorICAgIH07CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIHN0cnVjdCBDMl9ISURFIFBhcmFtOworICAgIGNsYXNzIFBhcmFtSGVscGVyOworCisgICAgLyoqCisgICAgICogRmFjdG9yeSBpcyBhbiBpbnRlcmZhY2UgdG8gZ2V0IHRoZSBwYXJhbWV0ZXIgaGVscGVycyBmcm9tIGEgc3RkOjpzaGFyZWRfcHRyPFQ+ICYuCisgICAgICovCisgICAgY2xhc3MgRmFjdG9yeSB7CisgICAgICAgIC8vIFx0b2RvIHRoaXMgbWF5IGJlIGFscmVhZHkgaW4gUGFyYW1IZWxwZXIKKyAgICAgICAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gZ2V0UmVmbGVjdG9yKCkgY29uc3QgPSAwOworCisgICAgICAgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPFBhcmFtSGVscGVyPiBnZXRQYXJhbUhlbHBlcihjb25zdCBQYXJhbVJlZiAmcGFyYW0pIGNvbnN0ID0gMDsKKworICAgIHB1YmxpYzoKKyAgICAgICAgdmlydHVhbCB+RmFjdG9yeSgpID0gZGVmYXVsdDsKKworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgICAgICBQYXJhbTxUPiBnZXQoc3RkOjpzaGFyZWRfcHRyPFQ+ICZwYXJhbSwgc3RkOjpzaGFyZWRfcHRyPFQ+IGFsdFZhbHVlID0gbnVsbHB0cikgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIFBhcmFtPFQ+KGdldFBhcmFtSGVscGVyKFBhcmFtUmVmKHBhcmFtKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0VmFsdWUgPT0gbnVsbHB0ciA/IHBhcmFtIDogYWx0VmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UmVmbGVjdG9yKCkpOworICAgICAgICB9CisgICAgfTsKKworICAgIC8qKgorICAgICAqIFR5cGVkIGZpZWxkIGhlbHBlci4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIHN0cnVjdCBGaWVsZCB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDb25zdHJ1Y3Rvci4KKyAgICAgICAgICoKKyAgICAgICAgICogXHBhcmFtIGhlbHBlciBoZWxwZXIgZm9yIHRoaXMgZmllbGQKKyAgICAgICAgICogXHBhcmFtIGluZGV4ICBwYXJhbWV0ZXIgaW5kZXggKHRoaXMgaXMgbmVlZGVkIGFzIGl0IGlzIG5vdCBhdmFpbGFibGUgZHVyaW5nIHBhcmFtZXRlcgorICAgICAgICAgKiAgICAgICAgY29uc3RydWN0aW9uKSBcdG9kbyByZW1vdmUKKyAgICAgICAgICovCisgICAgICAgIEZpZWxkKHN0ZDo6c2hhcmVkX3B0cjxGaWVsZEhlbHBlcj4gaGVscGVyLCBDMlBhcmFtOjpJbmRleCBpbmRleCk7CisKKyAgICAgICAgYm9vbCBzdXBwb3J0c0F0QWxsKFQgdmFsdWUpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+KCpfbUhlbHBlci0+Z2V0UG9zc2libGVWYWx1ZXMoKSkuc3VwcG9ydHModmFsdWUpOworICAgICAgICB9CisKKyAgICAgICAgYm9vbCBzdXBwb3J0c05vdyhUIHZhbHVlKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPigqX21IZWxwZXItPmdldFN1cHBvcnRlZFZhbHVlcygpKS5zdXBwb3J0cyh2YWx1ZSk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlcyBhIGNvbmZsaWN0IHJlc29sdXRpb24gc3VnZ2VzdGlvbiBidWlsZGVyIGZvciB0aGlzIGZpZWxkLgorICAgICAgICAgKi8KKyAgICAgICAgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiBzaG91bGRCZSgpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGVzIGEgY3VycmVudGx5IHN1cHBvcnRlZCB2YWx1ZXMgYnVpbGRlciBmb3IgdGhpcyBmaWVsZC4gVGhpcyBpcyBvbmx5IHN1cHBvcnRlZAorICAgICAgICAgKiBmb3Igbm9uLWNvbnN0IGZpZWxkcyB0byBkaXNhbGxvdyBzZXR0aW5nIHN1cHBvcnRlZCB2YWx1ZXMgZm9yIGRlcGVuZGVuY2llcy4KKyAgICAgICAgICovCisgICAgICAgIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD4gbXVzdEJlKCk7CisKKyAgICAgICAgb3BlcmF0b3IgQzJQYXJhbUZpZWxkKCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIF9tRmllbGQ7CisgICAgICAgIH0KKworICAgICAgICAvLyBUT0RPCisgICAgICAgIEMyUiB2YWxpZGF0ZVBvc3NpYmxlKGNvbnN0IFQgJnZhbHVlIF9fdW51c2VkKSBjb25zdCB7CisgICAgICAgICAgICAvLy8gVE9ETworICAgICAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEZpZWxkSGVscGVyPiBfbUhlbHBlcjsKKyAgICAgICAgQzJQYXJhbUZpZWxkIF9tRmllbGQ7CisgICAgfTsKKworICAgIGNsYXNzIFBhcmFtSGVscGVyIHsKKyAgICBwdWJsaWM6CisgICAgICAgIFBhcmFtSGVscGVyKFBhcmFtUmVmIHBhcmFtLCBDMlN0cmluZ0xpdGVyYWwgbmFtZSwgQzJTdHJ1Y3REZXNjcmlwdG9yICYmKTsKKyAgICAgICAgUGFyYW1IZWxwZXIoUGFyYW1IZWxwZXIgJiYpOworICAgICAgICB+UGFyYW1IZWxwZXIoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogRmluZHMgYSBmaWVsZCBkZXNjcmlwdG9yLgorICAgICAgICAgKi8KKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEZpZWxkSGVscGVyPiBmaW5kRmllbGQoc2l6ZV90IGJhc2VPZmZzLCBzaXplX3QgYmFzZVNpemUpIGNvbnN0OworCisgICAgICAgIC8vLyByZXR1cm5zIHRoZSBwYXJhbWV0ZXIgcmVmIGZvciB0aGlzIHBhcmFtZXRlcgorICAgICAgICBjb25zdCBQYXJhbVJlZiByZWYoKSBjb25zdDsKKworICAgICAgICAvLy8gcmV0dXJucyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGlzIHBhcmFtZXRlciBhcyBtb2RpZmlhYmxlLiBUaGUgY29uc3RuZXNzIG9mIHRoaXMKKyAgICAgICAgLy8vIG9iamVjdCBkZXRlcm1pbmVzIHRoZSBjb25zdG5lc3Mgb2YgdGhlIHJldHVybmVkIHZhbHVlLgorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbT4gdmFsdWUoKTsKKworICAgICAgICAvLy8gcmV0dXJucyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGlzIHBhcmFtZXRlciBhcyBjb25zdAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJQYXJhbT4gdmFsdWUoKSBjb25zdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogUGVyZm9ybXMgYSBjb25maWd1cmF0aW9uIGNoYW5nZSByZXF1ZXN0IGZvciB0aGlzIHBhcmFtZXRlci4KKyAgICAgICAgICoKKyAgICAgICAgICogXHBhcmFtIHZhbHVlICAgIHRoZSB2YWx1ZSB0aGF0IGlzIGJlaW5nIGFzc2lnbmVkIHRvIHRoaXMgcGFyYW1ldGVyLgorICAgICAgICAgKiAgICAgICAgICAgICAgICAgVGhpcyBjb3VsZCBiZSBwb2ludGluZyB0byB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUKKyAgICAgICAgICogICAgICAgICAgICAgICAgIHBhcmFtZXRlci4gVGhpcyBtdXN0IG5vdCBjaGFuZ2UuCisgICAgICAgICAqIFxwYXJhbSBtYXlCbG9jayB3aGV0aGVyIGJsb2NraW5nIGlzIGFsbG93ZWQKKyAgICAgICAgICogXHBhcmFtIGVuZFZhbHVlIHRoZSByZXN1bHRpbmcgdmFsdWUKKyAgICAgICAgICogXHBhcmFtIGZhY3RvcnkgIHBhcmFtZXRlciBmYWN0b3J5ICh0byBhY2Nlc3MgZGVwZW5kZW5jaWVzKQorICAgICAgICAgKiBccGFyYW0gZmFpbHVyZXMgdmVjdG9yIG9mIGZhaWx1cmVzIHRvIGFwcGVuZCBhbnkgZmFpbHVyZXMgZnJvbSB0aGlzCisgICAgICAgICAqICAgICAgICAgICAgICAgICBvcGVyYXRpb24KKyAgICAgICAgICoKKyAgICAgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgY29uZmlndXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bAorICAgICAgICAgKiBccmV0dmFsIEMyX0JBRF9WQUxVRSB2YWx1ZSBpcyBpbmNvcnJlY3QgKFRCRCkKKyAgICAgICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgbm90IGVub3VnaCBtZW1vcnkgdG8gcGVyZm9ybSB0aGUgYXNzaWdubWVudAorICAgICAgICAgKiBccmV0dmFsIEMyX1RJTUVEX09VVCBjb25maWd1cmF0aW9uIHRpbWVkIG91dAorICAgICAgICAgKiBccmV0dmFsIEMyX0JMT0NLSU5HICBjb25maWd1cmF0aW9uIHJlcXVpcmVzIGJsb2NraW5nIHRvIGJlIGFsbG93ZWQKKyAgICAgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgaW50ZXJmYWNlIGlzIGNvcnJ1cHRlZAorICAgICAgICAgKi8KKyAgICAgICAgYzJfc3RhdHVzX3QgdHJ5U2V0KAorICAgICAgICAgICAgICAgIGNvbnN0IEMyUGFyYW0gKnZhbHVlLCBib29sIG1heUJsb2NrLAorICAgICAgICAgICAgICAgIGJvb2wgKmNoYW5nZWQsCisgICAgICAgICAgICAgICAgRmFjdG9yeSAmZmFjdG9yeSwKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4qIGNvbnN0IGZhaWx1cmVzKTsKKworICAgICAgICAvLy8gcmV0dXJucyBwYXJhbWV0ZXIgaW5kaWNlcyB0aGF0IGRlcGVuZCBvbiB0aGlzIHBhcmFtZXRlcgorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gZ2V0RG93bkRlcGVuZGVuY2llcygpIGNvbnN0OworCisgICAgICAgIC8vLyBhZGRzIGEgZGVwZW5kZW50IHBhcmFtZXRlcgorICAgICAgICB2b2lkIGFkZERvd25EZXBlbmRlbmN5KEMyUGFyYW06OkluZGV4IGluZGV4KTsKKworICAgICAgICAvLy8gcmV0dXJucyB0aGF0IHBhcmFtZXRlciByZWZzIGZvciBwYXJhbWV0ZXJzIHRoYXQgZGVwZW5kIG9uIHRoaXMKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8UGFyYW1SZWY+IGdldERlcGVuZGVuY2llc0FzUmVmcygpIGNvbnN0OworCisgICAgICAgIC8vLyByZXR1cm5zIGFuZCBtb3ZlcyBvdXQgc3RvcmVkIHN0cnVjdCBkZXNjcmlwdG9yCisgICAgICAgIEMyU3RydWN0RGVzY3JpcHRvciByZXRyaWV2ZVN0cnVjdERlc2NyaXB0b3IoKTsKKworICAgICAgICAvLy8gcmV0dXJucyB0aGUgbmFtZSBvZiB0aGlzIHBhcmFtZXRlcgorICAgICAgICBDMlN0cmluZyBuYW1lKCkgY29uc3Q7CisKKyAgICAgICAgLy8vIHJldHVybnMgdGhlIGluZGV4IG9mIHRoaXMgcGFyYW1ldGVyCisgICAgICAgIEMyUGFyYW06OkluZGV4IGluZGV4KCkgY29uc3Q7CisKKyAgICAgICAgLy8vIHJldHVybnMgdGhlIHBhcmFtZXRlciBkZXNjcmlwdG9yCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMlBhcmFtRGVzY3JpcHRvcj4gZ2V0RGVzY3JpcHRvcigpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBWYWxpZGF0ZXMgcGFyYW0gaGVscGVyLgorICAgICAgICAgKgorICAgICAgICAgKiBGb3Igbm93LCB0aGlzIGZpbGxzIGZpZWxkIGluZm8gZm9yIGNvbnN0IHBhcmFtcy4KKyAgICAgICAgICoKKyAgICAgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgdGhlIHBhcmFtZXRlciBjYW5ub3QgYmUgYWRkZWQgYXMgc3VjaAorICAgICAgICAgKi8KKyAgICAgICAgYzJfc3RhdHVzX3QgdmFsaWRhdGUoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+ICZyZWZsZWN0b3IpOworCisgICAgcHJvdGVjdGVkOgorICAgICAgICB0eXBlZGVmIEMyUGFyYW1EZXNjcmlwdG9yOjphdHRyaWJfdCBhdHRyaWJfdDsKKyAgICAgICAgYXR0cmliX3QmIGF0dHJpYigpOworCisgICAgICAgIC8vLyBzZXRzIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoaXMgcGFyYW1ldGVyCisgICAgICAgIHZvaWQgc2V0RGVmYXVsdFZhbHVlKHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtPiBkZWZhdWx0Xyk7CisKKyAgICAgICAgLy8vIHNldHMgdGhlIHNldHRlciBtZXRob2QKKyAgICAgICAgdm9pZCBzZXRTZXR0ZXIoc3RkOjpmdW5jdGlvbjxDMlIoY29uc3QgQzJQYXJhbSAqLCBib29sLCBib29sICosIEZhY3RvcnkgJik+IHNldHRlcik7CisKKyAgICAgICAgLy8vIHNldHMgdGhlIGdldHRlciBtZXRob2QKKyAgICAgICAgdm9pZCBzZXRHZXR0ZXIoc3RkOjpmdW5jdGlvbjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbT4oYm9vbCk+IGdldHRlcik7CisKKyAgICAgICAgLy8vIHNldHMgdGhlIGRlcGVuZGVuY2llcworICAgICAgICB2b2lkIHNldERlcGVuZGVuY2llcyhzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gaW5kaWNlcywgc3RkOjp2ZWN0b3I8UGFyYW1SZWY+IHJlZnMpOworCisgICAgICAgIC8vLyBzZXRzIHRoZSBmaWVsZHMgYW5kIHRoZWlyIHN1cHBvcnRlZCB2YWx1ZXMKKyAgICAgICAgdm9pZCBzZXRGaWVsZHMoc3RkOjp2ZWN0b3I8QzJQYXJhbUZpZWxkVmFsdWVzPiAmJmZpZWxkcyk7CisKKyAgICAgICAgLy8vIGJ1aWxkIHRoaXMgaW50byBhIGZpbmFsIFBhcmFtSGVscGVyIG9iamVjdAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8UGFyYW1IZWxwZXI+IGJ1aWxkKCk7CisKKyAgICAgICAgY2xhc3MgSW1wbDsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEltcGw+IG1JbXBsOworICAgIH07CisKKyAgICAvKioKKyAgICAgKiBUeXBlZCBwYXJhbWV0ZXIgaGVscGVyLiBUaGlzIHByb3ZpZGVzIGFjY2VzcyB0byBtZW1iZXJzIGFzIHdlbGwgYXMgZmllbGQgaGVscGVycy4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIHN0cnVjdCBDMl9ISURFIFBhcmFtIHsKKyAgICAgICAgUGFyYW0oCisgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFBhcmFtSGVscGVyPiBoZWxwZXIsIHN0ZDo6c2hhcmVkX3B0cjxUPiAmcGFyYW0sCisgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+IHJlZmxlY3RvcikKKyAgICAgICAgICAgIDogdigqcGFyYW0uZ2V0KCkpLAorICAgICAgICAgICAgICBfbVR5cGVkUGFyYW0ocGFyYW0pLAorICAgICAgICAgICAgICBfbUhlbHBlcihoZWxwZXIpLAorICAgICAgICAgICAgICBfbVJlZmxlY3RvcihyZWZsZWN0b3IpIHsgfQorCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFM+CisgICAgICAgIHVzaW5nIEZpZWxkVHlwZSA9IEZpZWxkPAorICAgICAgICAgICAgICAgIHR5cGVuYW1lIF9jMl9yZWR1Y2VfZW51bV90b191bmRlcmx5aW5nX3R5cGU8CisgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBzdGQ6OnJlbW92ZV9jb25zdDwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgc3RkOjpyZW1vdmVfZXh0ZW50PFM+Ojp0eXBlPjo6dHlwZT46OnR5cGU+OworCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFM+CisgICAgICAgIEZpZWxkVHlwZTxTPiBGKFMgJmZpZWxkKSB7CisgICAgICAgICAgICBzaXplX3Qgb2ZmcyA9ICh1aW50cHRyX3QpJmZpZWxkIC0gKHVpbnRwdHJfdCkmZ2V0KCk7CisgICAgICAgICAgICAvLyB0aGlzIG11c3QgZmFsbCBlaXRoZXIgd2l0aGluIHNpemVvZihUKSArIEZMRVhfU0laRSBvciBwYXJhbS0+c2l6ZSgpCisgICAgICAgICAgICAvLyBzaXplX3Qgc2l6ZSA9IHNpemVvZihmaWVsZCk7CisgICAgICAgICAgICAvLyBtUGFyYW0gbWF5IGJlIG51bGwKKyAgICAgICAgICAgIHNpemVfdCBiYXNlU2l6ZSA9IHNpemVvZih0eXBlbmFtZSBzdGQ6OnJlbW92ZV9leHRlbnQ8Uz46OnR5cGUpOworICAgICAgICAgICAgc2l6ZV90IGJhc2VPZmZzID0gR2V0QmFzZU9mZnNldCgKKyAgICAgICAgICAgICAgICAgICAgX21SZWZsZWN0b3IsIFQ6OkNPUkVfSU5ERVgsIG9mZnMgLSBzaXplb2YoQzJQYXJhbSkpOworICAgICAgICAgICAgaWYgKH5iYXNlT2ZmcyA9PSAwKSB7CisgICAgICAgICAgICAgICAgLy8gQzJfTE9HKEZBVEFMKSA8PCAidW5rbm93biBmaWVsZCBhdCBvZmZzZXQgIiA8PCBvZmZzIDw8ICIgc2l6ZSAiIDw8IHNpemVvZihTKQorICAgICAgICAgICAgICAgIC8vICAgICAgIDw8ICIgYmFzZS1zaXplICIgPDwgYmFzZVNpemU7CisgICAgICAgICAgICAgICAgLy8gX19idWlsdGluX3RyYXAoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYmFzZU9mZnMgKz0gc2l6ZW9mKEMyUGFyYW0pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8RmllbGRIZWxwZXI+IGhlbHBlciA9IF9tSGVscGVyLT5maW5kRmllbGQoYmFzZU9mZnMsIGJhc2VTaXplKTsKKyAgICAgICAgICAgIHJldHVybiBGaWVsZFR5cGU8Uz4oaGVscGVyLCBfbVR5cGVkUGFyYW0tPmluZGV4KCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gY29uc3QgUGFyYW0gaGF2ZSBjb25zdCBGaWVsZHM7IGhvd2V2ZXIsIHJlbW92ZSBjb25zdCBmcm9tIFMKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgUz4KKyAgICAgICAgY29uc3QgRmllbGRUeXBlPFM+IEYoUyAmZmllbGQpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBjb25zdF9jYXN0PGNvbnN0IEZpZWxkVHlwZTxTPj4oY29uc3RfY2FzdDxQYXJhbSAqPih0aGlzKS0+RihmaWVsZCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIFJldHVybnMgYSBjb25zdCByZWYgdmFsdWUgb2YgdGhpcyBjb25zdCBwYXJhbS4KKyAgICAgICAgY29uc3QgVCAmZ2V0KCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuICpfbVR5cGVkUGFyYW0uZ2V0KCk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gUmV0dXJucyBhIG1vZGlmaWFibGUgcmVmIHZhbHVlIG9mIHRoaXMgbm9uLWNvbnN0IHBhcmFtLgorICAgICAgICBUICZzZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gKl9tVHlwZWRQYXJhbS5nZXQoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyBDb25zdC1yZWZlcmVuY2UgdG8gdGhlIHZhbHVlLnMKKyAgICAgICAgVCBjb25zdCAmdjsKKworICAgIHByaXZhdGU6CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUPiBfbVR5cGVkUGFyYW07CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxQYXJhbUhlbHBlcj4gX21IZWxwZXI7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiBfbVJlZmxlY3RvcjsKKyAgICB9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICB1c2luZyBDMlAgPSBQYXJhbTxUPjsKKworICAgIC8qKgorICAgICAqIFRlbXBsYXRlZCBtb3ZlIGJ1aWxkZXIgY2xhc3MgZm9yIGEgcGFyYW1ldGVyIGhlbHBlci4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIGNsYXNzIEMyX0hJREUgUGFyYW1CdWlsZGVyIDogcHJpdmF0ZSBQYXJhbUhlbHBlciB7CisgICAgcHVibGljOgorICAgICAgICAvKiogQ29uc3RydWN0IHRoZSBwYXJhbWV0ZXIgYnVpbGRlciBmcm9tIG1pbmltYWwgaW5mbyByZXF1aXJlZC4gKi8KKyAgICAgICAgUGFyYW1CdWlsZGVyKHN0ZDo6c2hhcmVkX3B0cjxUPiAmcGFyYW0sIEMyU3RyaW5nTGl0ZXJhbCBuYW1lKQorICAgICAgICAgICAgOiBQYXJhbUhlbHBlcihwYXJhbSwgbmFtZSwgQzJTdHJ1Y3REZXNjcmlwdG9yKChUKiludWxscHRyKSksCisgICAgICAgICAgICAgIG1UeXBlZFBhcmFtKCZwYXJhbSkgeworICAgICAgICAgICAgYXR0cmliKCkgPSBhdHRyaWJfdDo6SVNfUEVSU0lTVEVOVDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiBNYWtlcyB0aGlzIHBhcmFtZXRlciByZXF1aXJlZC4gKi8KKyAgICAgICAgaW5saW5lIFBhcmFtQnVpbGRlciAmcmVxdWlyZWQoKSB7CisgICAgICAgICAgICBhdHRyaWIoKSB8PSBhdHRyaWJfdDo6SVNfUkVRVUlSRUQ7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKiogTWFrZXMgdGhpcyBwYXJhbWV0ZXIgdHJhbnNpZW50IChub3QgcGVyc2lzdGVudCkuICovCisgICAgICAgIGlubGluZSBQYXJhbUJ1aWxkZXIgJnRyYW5zaWVudCgpIHsKKyAgICAgICAgICAgIGF0dHJpYigpICY9IH5hdHRyaWJfdDo6SVNfUEVSU0lTVEVOVDsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiBNYWtlcyB0aGlzIHBhcmFtZXRlciBoaWRkZW4gKG5vdCBleHBvc2VkIGluIEpBVkEgQVBJKS4gKi8KKyAgICAgICAgaW5saW5lIFBhcmFtQnVpbGRlciAmaGlkZGVuKCkgeworICAgICAgICAgICAgYXR0cmliKCkgfD0gYXR0cmliX3Q6OklTX0hJRERFTjsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiBNYWtlcyB0aGlzIHBhcmFtZXRlciBpbnRlcm5hbCAobm90IGV4cG9zZWQgdG8gcXVlcnkvc2V0dGluZ3MpLiAqLworICAgICAgICBpbmxpbmUgUGFyYW1CdWlsZGVyICZpbnRlcm5hbCgpIHsKKyAgICAgICAgICAgIGF0dHJpYigpIHw9IGF0dHJpYl90OjpJU19JTlRFUk5BTDsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiBBZGRzIGRlZmF1bHQgdmFsdWUuIE11c3QgYmUgYWRkZWQgZXhhY3RseSBvbmNlLiAqLworICAgICAgICBpbmxpbmUgUGFyYW1CdWlsZGVyICZ3aXRoRGVmYXVsdChzdGQ6OnNoYXJlZF9wdHI8VD4gZGVmYXVsdF8pIHsKKyAgICAgICAgICAgIC8vIENIRUNLKCFtRGVmYXVsdFZhbHVlKTsKKyAgICAgICAgICAgIC8vIFdBUk5fSUYoIWRlZmF1bHRfKTsgLy8gY291bGQgYmUgbnVsbHB0ciBpZiBPT00KKyAgICAgICAgICAgIC8vIHRlY2huaWNhbGx5LCB0aGlzIGNvdWxkIGJlIGluIHRoZSBwYXJlbnQKKyAgICAgICAgICAgICptVHlwZWRQYXJhbSA9IHN0ZDo6c2hhcmVkX3B0cjxUPihUOjpGcm9tKEMyUGFyYW06OkNvcHkoKmRlZmF1bHRfKS5yZWxlYXNlKCkpKTsKKyAgICAgICAgICAgIHNldERlZmF1bHRWYWx1ZShkZWZhdWx0Xyk7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VD4gKnR5cGVkUGFyYW0gPSBtVHlwZWRQYXJhbTsKKyAgICAgICAgICAgIHNldEdldHRlcihbdHlwZWRQYXJhbV0oYm9vbCkgLT4gc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW0+IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyUGFyYW0+KCp0eXBlZFBhcmFtKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqIEFkZHMgZGVmYXVsdCB2YWx1ZS4gTXVzdCBiZSBhZGRlZCBleGFjdGx5IG9uY2UuICovCisgICAgICAgIGlubGluZSBQYXJhbUJ1aWxkZXIgJndpdGhEZWZhdWx0KFQgKmRlZmF1bHRfKSB7CisgICAgICAgICAgICByZXR1cm4gd2l0aERlZmF1bHQoc3RkOjpzaGFyZWRfcHRyPFQ+KGRlZmF1bHRfKSk7CisgICAgICAgIH0KKworICAgICAgICAvKiogQWRkcyBhbGwgZmllbGRzIHRvIHRoaXMgcGFyYW1ldGVyIHdpdGggdGhlaXIgcG9zc2libGUgdmFsdWVzLiAqLworICAgICAgICBpbmxpbmUgUGFyYW1CdWlsZGVyICZ3aXRoRmllbGRzKHN0ZDo6dmVjdG9yPEMyUGFyYW1GaWVsZFZhbHVlcz4gJiZmaWVsZHNfKSB7CisgICAgICAgICAgICBzZXRGaWVsZHMoc3RkOjptb3ZlKGZpZWxkc18pKTsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBBZGRzIGEgY29uc3RhbnQgdmFsdWUgKGFsc28gYXMgZGVmYXVsdCkuIE11c3QgYmUgYWRkZWQgZXhhY3RseSBvbmNlLgorICAgICAgICAgKgorICAgICAgICAgKiBDb25zdCBwYXJhbWV0ZXJzIGJ5IGRlZmluaXRpb24gaGF2ZSBubyBkZXBlbmRlbmNpZXMuCisgICAgICAgICAqLworICAgICAgICBpbmxpbmUgUGFyYW1CdWlsZGVyICZ3aXRoQ29uc3RWYWx1ZShzdGQ6OnNoYXJlZF9wdHI8VD4gZGVmYXVsdF8pIHsKKyAgICAgICAgICAgIGF0dHJpYigpIHw9IGF0dHJpYl90OjpJU19DT05TVDsKKyAgICAgICAgICAgIHNldFNldHRlcihbZGVmYXVsdF9dKAorICAgICAgICAgICAgICAgICAgICBjb25zdCBDMlBhcmFtICp2YWx1ZSwgYm9vbCBtYXlCbG9jayBfX3VudXNlZCwgYm9vbCAqY2hhbmdlZCwgRmFjdG9yeSAmKSAtPiBDMlIgeworICAgICAgICAgICAgICAgICpjaGFuZ2VkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgY29uc3QgVCAqdHlwZWRWYWx1ZSA9IFQ6OkZyb20odmFsdWUpOworICAgICAgICAgICAgICAgIGlmICh0eXBlZFZhbHVlID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEMyUjo6Q29ycnVwdGVkKCk7IC8vIFRPRE8gQmFkVmFsdWUvSW52YWxpZC4gVGhpcyBzaG91bGQgbm90IGhhcHBlbiBoZXJlLgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoKnR5cGVkVmFsdWUgIT0gKmRlZmF1bHRfKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBDMlI6OkNvcnJ1cHRlZCgpOyAvLyBUT0RPIFJlYWRPbmx5KCpkZWZhdWx0Xyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICpjaGFuZ2VkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgcmV0dXJuIHdpdGhEZWZhdWx0KGRlZmF1bHRfKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiBBZGRzIGNvbnN0YW50IHZhbHVlIChhbHNvIGFzIGRlZmF1bHQpLiBNdXN0IGJlIGFkZGVkIGV4YWN0bHkgb25jZS4gKi8KKyAgICAgICAgaW5saW5lIFBhcmFtQnVpbGRlciAmd2l0aENvbnN0VmFsdWUoVCAqZGVmYXVsdF8pIHsKKyAgICAgICAgICAgIHJldHVybiB3aXRoQ29uc3RWYWx1ZShzdGQ6OnNoYXJlZF9wdHI8VD4oZGVmYXVsdF8pKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBVc2UgYSBzdHJpY3Qgc2V0dGVyLgorICAgICAgICAgKgorICAgICAgICAgKiBccGFyYW0gZm4gICBzdHJpY3Qgc2V0dGVyCisgICAgICAgICAqIFxwYXJhbSBkZXBzIGRlcGVuZGVuY2llcyAocmVmZXJlbmNlcykKKyAgICAgICAgICovCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIC4uLiBEZXBzPgorICAgICAgICBpbmxpbmUgUGFyYW1CdWlsZGVyICZ3aXRoU2V0dGVyKAorICAgICAgICAgICAgICAgIEMyUiAoKmZuKShib29sLCBjb25zdCBDMlA8VD4gJiwgQzJQPFQ+ICYsIGNvbnN0IEMyUDxEZXBzPiAmLi4uKSwKKyAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8RGVwcz4mIC4uLiBkZXBzKSB7CisgICAgICAgICAgICBhdHRyaWIoKSB8PSBhdHRyaWJfdDo6SVNfU1RSSUNUOworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFQ+ICp0eXBlZFBhcmFtID0gbVR5cGVkUGFyYW07CisgICAgICAgICAgICBzZXRTZXR0ZXIoW3R5cGVkUGFyYW0sIGZuLCAmZGVwcy4uLl0oCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyUGFyYW0gKnZhbHVlLCBib29sIG1heUJsb2NrLCBib29sICpjaGFuZ2VkLCBGYWN0b3J5ICZmYWN0b3J5KSAtPiBDMlIgeworICAgICAgICAgICAgICAgICpjaGFuZ2VkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgY29uc3QgVCAqdHlwZWRWYWx1ZSA9IFQ6OkZyb20odmFsdWUpOworICAgICAgICAgICAgICAgIGlmICh0eXBlZFZhbHVlID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEMyUjo6Q29ycnVwdGVkKCk7IC8vIFRPRE8gQmFkVmFsdWUvSW52YWxpZC4gVGhpcyBzaG91bGQgbm90IGhhcHBlbiBoZXJlLgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBEbyBjb3B5LW9uLWNoYW5nZSBmb3IgcGFyYW1ldGVycyBpbiB0aGlzIGhlbHBlciBzbyBjaGFuZ2UgY2FuIGJlIGRldGVjdGVkIGJ5CisgICAgICAgICAgICAgICAgLy8gYSBjaGFuZ2Ugb2YgdGhlIHBvaW50ZXIuIERvIHRoaXMgYnkgd29ya2luZyBvbiBhIHByb3Bvc2VkIHZhbHVlLgorICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUPiBwcm9wb3NlZFZhbHVlID0KKyAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFQ+KFQ6OkZyb20oQzJQYXJhbTo6Q29weSgqdmFsdWUpLnJlbGVhc2UoKSkpOworICAgICAgICAgICAgICAgIGlmIChwcm9wb3NlZFZhbHVlID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEMyUjo6Tm9NZW1vcnkodmFsdWUtPmluZGV4KCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBDMlA8VD4gb2xkVmFsdWUgPSBmYWN0b3J5LmdldCgqdHlwZWRQYXJhbSk7CisgICAgICAgICAgICAgICAgLy8gR2V0IGEgcGFyYW1ldGVyIGhlbHBlciB3aXRoIHZhbHVlIHBvaW50aW5nIHRvIHByb3Bvc2VkVmFsdWUKKyAgICAgICAgICAgICAgICBDMlA8VD4gaGVscGVyID0gZmFjdG9yeS5nZXQoKnR5cGVkUGFyYW0sIHByb3Bvc2VkVmFsdWUpOworICAgICAgICAgICAgICAgIEMyUiByZXN1bHQgPSBmbihtYXlCbG9jaywgb2xkVmFsdWUsIGhlbHBlciwgZmFjdG9yeS5nZXQoZGVwcykuLi4pOworCisgICAgICAgICAgICAgICAgLy8gSWYgdmFsdWUgY2hhbmdlZCwgY29weSByZXN1bHQgdG8gY3VycmVudCB2YWx1ZQorICAgICAgICAgICAgICAgIGlmIChoZWxwZXIuZ2V0KCkgIT0gKnR5cGVkUGFyYW0tPmdldCgpKSB7CisgICAgICAgICAgICAgICAgICAgICp0eXBlZFBhcmFtID0gcHJvcG9zZWRWYWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgKmNoYW5nZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBzZXREZXBlbmRlbmNpZXMoc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+eyBkZXBzLT5pbmRleCgpLi4uIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8UGFyYW1SZWY+eyBQYXJhbVJlZihkZXBzKS4uLiB9KTsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBVc2UgYSBub24tc3RyaWN0IHNldHRlci4KKyAgICAgICAgICoKKyAgICAgICAgICogXHBhcmFtIGZuICAgbm9uLXN0cmljdCBzZXR0ZXIKKyAgICAgICAgICogXHBhcmFtIGRlcHMgZGVwZW5kZW5jaWVzIChyZWZlcmVuY2VzKQorICAgICAgICAgKi8KKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgLi4uIERlcHM+CisgICAgICAgIGlubGluZSBQYXJhbUJ1aWxkZXIgJndpdGhTZXR0ZXIoCisgICAgICAgICAgICAgICAgQzJSICgqZm4pKGJvb2wsIEMyUDxUPiAmLCBjb25zdCBDMlA8RGVwcz4gJi4uLiksIHN0ZDo6c2hhcmVkX3B0cjxEZXBzPiYgLi4uIGRlcHMpIHsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUPiAqdHlwZWRQYXJhbSA9IG1UeXBlZFBhcmFtOworICAgICAgICAgICAgc2V0U2V0dGVyKFt0eXBlZFBhcmFtLCBmbiwgJmRlcHMuLi5dKAorICAgICAgICAgICAgICAgICAgICBjb25zdCBDMlBhcmFtICp2YWx1ZSwgYm9vbCBtYXlCbG9jaywgYm9vbCAqY2hhbmdlZCwgRmFjdG9yeSAmZmFjdG9yeSkgLT4gQzJSIHsKKyAgICAgICAgICAgICAgICAqY2hhbmdlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGNvbnN0IFQgKnR5cGVkVmFsdWUgPSBUOjpGcm9tKHZhbHVlKTsKKyAgICAgICAgICAgICAgICBpZiAodHlwZWRWYWx1ZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBDMlI6OkNvcnJ1cHRlZCgpOyAvLyBUT0RPIEJhZFZhbHVlL0ludmFsaWQuIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4gaGVyZS4KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gRG8gY29weS1vbi1jaGFuZ2UgZm9yIHBhcmFtZXRlcnMgaW4gdGhpcyBoZWxwZXIgc28gY2hhbmdlIGNhbiBiZSBkZXRlY3RlZCBieQorICAgICAgICAgICAgICAgIC8vIGEgY2hhbmdlIG9mIHRoZSBwb2ludGVyLiBEbyB0aGlzIGJ5IHdvcmtpbmcgb24gYSBwcm9wb3NlZCB2YWx1ZS4KKyAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VD4gcHJvcG9zZWRWYWx1ZSA9CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUPihUOjpGcm9tKEMyUGFyYW06OkNvcHkoKnZhbHVlKS5yZWxlYXNlKCkpKTsKKyAgICAgICAgICAgICAgICBpZiAocHJvcG9zZWRWYWx1ZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBDMlI6Ok5vTWVtb3J5KHZhbHVlLT5pbmRleCgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gR2V0IGEgcGFyYW1ldGVyIGhlbHBlciB3aXRoIHZhbHVlIHBvaW50aW5nIHRvIHByb3Bvc2VkVmFsdWUKKyAgICAgICAgICAgICAgICBDMlA8VD4gaGVscGVyID0gZmFjdG9yeS5nZXQoKnR5cGVkUGFyYW0sIHByb3Bvc2VkVmFsdWUpOworICAgICAgICAgICAgICAgIEMyUiByZXN1bHQgPSBmbihtYXlCbG9jaywgaGVscGVyLCBmYWN0b3J5LmdldChkZXBzKS4uLik7CisKKyAgICAgICAgICAgICAgICAvLyBJZiB2YWx1ZSBjaGFuZ2VkLCBjb3B5IHJlc3VsdCB0byBjdXJyZW50IHZhbHVlCisgICAgICAgICAgICAgICAgaWYgKGhlbHBlci5nZXQoKSAhPSAqdHlwZWRQYXJhbS0+Z2V0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgKnR5cGVkUGFyYW0gPSBwcm9wb3NlZFZhbHVlOworICAgICAgICAgICAgICAgICAgICAqY2hhbmdlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIHNldERlcGVuZGVuY2llcyhzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD57IGRlcHMtPmluZGV4KCkuLi4gfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxQYXJhbVJlZj57IFBhcmFtUmVmKGRlcHMpLi4uIH0pOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIE1hcmtzIHRoaXMgYSBjYWxjdWxhdGVkIChyZWFkLW9ubHkpIGZpZWxkLgorICAgICAgICAgKgorICAgICAgICAgKiBccGFyYW0gZm4gICBub24tc3RyaWN0IHNldHRlciAoY2FsY3VsYXRvcikKKyAgICAgICAgICogXHBhcmFtIGRlcHMgZGVwZW5kZW5jaWVzIChyZWZlcmVuY2VzKQorICAgICAgICAgKi8KKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgLi4uIERlcHM+CisgICAgICAgIGlubGluZSBQYXJhbUJ1aWxkZXIgJmNhbGN1bGF0ZWRBcygKKyAgICAgICAgICAgICAgICBDMlIgKCpmbikoYm9vbCwgQzJQPFQ+ICYsIGNvbnN0IEMyUDxEZXBzPiAmLi4uKSwgc3RkOjpzaGFyZWRfcHRyPERlcHM+JiAuLi4gZGVwcykgeworICAgICAgICAgICAgYXR0cmliKCkgfD0gYXR0cmliX3Q6OklTX1JFQURfT05MWTsKKyAgICAgICAgICAgIHJldHVybiB3aXRoU2V0dGVyKGZuLCBzdGQ6OmZvcndhcmQ8ZGVjbHR5cGUoZGVwcyk+KGRlcHMpLi4uKTsKKyAgICAgICAgfQorCisgICAgICAgIGlubGluZSBzdGQ6OnNoYXJlZF9wdHI8UGFyYW1IZWxwZXI+IGJ1aWxkKCkgeworICAgICAgICAgICAgcmV0dXJuIFBhcmFtSGVscGVyOjpidWlsZCgpOworICAgICAgICB9CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUPiAqbVR5cGVkUGFyYW07CisgICAgfTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgc3RhdGljIFBhcmFtQnVpbGRlcjxUPiBEZWZpbmVQYXJhbShzdGQ6OnNoYXJlZF9wdHI8VD4gJnBhcmFtLCBDMlN0cmluZ0xpdGVyYWwgbmFtZSkgeworICAgICAgICByZXR1cm4gUGFyYW1CdWlsZGVyPFQ+KHBhcmFtLCBuYW1lKTsKKyAgICB9CisKK3B1YmxpYzoKKyAgICBjMl9zdGF0dXNfdCBxdWVyeSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiAmc3RhY2tQYXJhbXMsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gJmhlYXBQYXJhbUluZGljZXMsCisgICAgICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiogY29uc3QgaGVhcFBhcmFtcykgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBIZWxwZXIgaW1wbGVtZW50aW5nIGNvbmZpZyBjYWxscyBhcyB3ZWxsIGFzIG90aGVyIGNvbmZpZ3VyYXRpb24gdXBkYXRlcy4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIGlzIHZpcnR1YWwsIHNvIGltcGxlbWVudGF0aW9ucyBtYXkgcHJvdmlkZSB3cmFwcGVycyBhcm91bmQgaXQgKGFuZCBwZXJmb3JtCisgICAgICogYWN0aW9ucyBqdXN0IGJlZm9yZSBhbmQgYWZ0ZXIgYSBjb25maWd1cmF0aW9uKS4KKyAgICAgKgorICAgICAqIFxwYXJhbSBwYXJhbXMKKyAgICAgKiBccGFyYW0gbWF5QmxvY2sKKyAgICAgKiBccGFyYW0gZmFpbHVyZXMKKyAgICAgKiBccGFyYW0gdXBkYXRlUGFyYW1zIGlmIHRydWUsIHRoZSB1cGRhdGVkIHBhcmFtZXRlciB2YWx1ZXMgYXJlIGNvcGllZCBiYWNrIGludG8gdGhlIGFyZ3VtZW50cworICAgICAqICAgICAgICAgICAgICAgICAgICAgcGFzc2VkIGluIHxwYXJhbXN8CisgICAgICogXHBhcmFtIGNoYW5nZXMgICAgICBwb2ludGVkIHRvIGEgdmVjdG9yIHRvIHJlY2VpdmUgc2V0dGluZ3Mgd2l0aCB0aGVpciB2YWx1ZXMgY2hhbmdlZC4gSWYgbm90CisgICAgICogICAgICAgICAgICAgICAgICAgICBudWxsLCBzZXR0aW5ncyB3aXRoIHRoZWlyIHZhbHVlcyBjaGFuZ2VkIGFyZSBhZGRlZCB0byB0aGlzLgorICAgICAqIFxyZXR1cm4gcmVzdWx0IGZyb20gY29uZmlnCisgICAgICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjb25maWcoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gJnBhcmFtcywgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaywKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiogY29uc3QgZmFpbHVyZXMsCisgICAgICAgICAgICBib29sIHVwZGF0ZVBhcmFtcyA9IHRydWUsCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbT4+ICpjaGFuZ2VzID0gbnVsbHB0cik7CisKKyAgICBjMl9zdGF0dXNfdCBxdWVyeVN1cHBvcnRlZFBhcmFtcygKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4+ICpjb25zdCBwYXJhbXMpIGNvbnN0OworCisgICAgYzJfc3RhdHVzX3QgcXVlcnlTdXBwb3J0ZWRWYWx1ZXMoCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk+ICZmaWVsZHMsIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2spIGNvbnN0OworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiBnZXRSZWZsZWN0b3IoKSB7CisgICAgICAgIHJldHVybiBtUmVmbGVjdG9yOworICAgIH0KKworICAgIHR5cGVkZWYgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBMb2NrOworCisgICAgLyoqCisgICAgICogTG9ja3MgdGhlIGludGVyZmFjZSBhbmQgcmV0dXJucyBhIGxvY2suIFRoaXMgbG9jayBtdXN0IGJlIHVubG9ja2VkIG9yIHJlbGVhc2VkIHdpdGhvdXQKKyAgICAgKiBjYWxsaW5nIGFueSBvdGhlciBibG9ja2luZyBjYWxsLgorICAgICAqLworICAgIExvY2sgbG9jaygpIGNvbnN0OworCitwcml2YXRlOgorICAgIHZvaWQgc2V0SW50ZXJmYWNlQWRkcmVzc0JvdW5kcyh1aW50cHRyX3Qgc3RhcnQsIHVpbnRwdHJfdCBlbmQpIHsKKyAgICAgICAgLy8gVE9ETzogZXhjbHVkZSB0aGlzIGhlbHBlcgorICAgICAgICAodm9pZClzdGFydDsKKyAgICAgICAgKHZvaWQpZW5kOworICAgIH0KKworcHJvdGVjdGVkOgorICAgIG11dGFibGUgc3RkOjptdXRleCBtTXV0ZXg7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiBtUmVmbGVjdG9yOworICAgIHN0cnVjdCBGYWN0b3J5SW1wbDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8RmFjdG9yeUltcGw+IF9tRmFjdG9yeTsKKworICAgIEMySW50ZXJmYWNlSGVscGVyKHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gcmVmbGVjdG9yKTsKKworICAgIC8qKgorICAgICAqIEFkZHMgYSBwYXJhbWV0ZXIgdG8gdGhpcyBpbnRlcmZhY2UuCisgICAgICogXG5vdGUgVGhpcyBtZXRob2QgQ0hFQ0tzLgorICAgICAqCisgICAgICogXHBhcmFtIHBhcmFtIHBhcmFtZXRlciB0byBhZGQuCisgICAgICovCisgICAgdm9pZCBhZGRQYXJhbWV0ZXIoc3RkOjpzaGFyZWRfcHRyPFBhcmFtSGVscGVyPiBwYXJhbSk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBkZXBlbmRlbmN5IGluZGV4IGZvciBhIHBhcmFtZXRlci4KKyAgICAgKgorICAgICAqIFxwYXJhbSBpeCB0aGUgaW5kZXggb2YgdGhlIHBhcmFtZXRlcgorICAgICAqLworICAgIHNpemVfdCBnZXREZXBlbmRlbmN5SW5kZXhfbChDMlBhcmFtOjpJbmRleCBpeCkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIH5DMkludGVyZmFjZUhlbHBlcigpID0gZGVmYXVsdDsKKworICAgIC8qKgorICAgICAqIFNldHMgc3ViY2xhc3MgaW5zdGFuY2UncyBhZGRyZXNzIGFuZCBzaXplLgorICAgICAqCisgICAgICogXHRvZG8gYWxsb3cgc3ViY2xhc3MgdG8gc3BlY2lmeSBwYXJhbWV0ZXIgYWRkcmVzcyByYW5nZSBkaXJlY3RseSAoZS5nLiBkbyBub3QgYXNzdW1lIHRoYXQKKyAgICAgKiAgICAgICB0aGV5IGFyZSBsb2NhbCB0byB0aGUgc3ViY2xhc3MgaW5zdGFuY2UpCisgICAgICoKKyAgICAgKiBccGFyYW0gVCB0eXBlIG9mIHRoZSBkZXJpdmVkIGluc3RhbmNlCisgICAgICogXHBhcmFtIGluc3RhbmNlIHBvaW50ZXIgdG8gdGhlIGRlcml2ZWQgaW5zdGFuY2UKKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIGlubGluZSBDMl9ISURFIHZvaWQgc2V0RGVyaXZlZEluc3RhbmNlKFQgKmluc3RhbmNlKSB7CisgICAgICAgIHNldEludGVyZmFjZUFkZHJlc3NCb3VuZHMoKHVpbnRwdHJfdClpbnN0YW5jZSwgKHVpbnRwdHJfdCkoaW5zdGFuY2UgKyAxKSk7CisgICAgfQorCisgICAgQzJfRE9fTk9UX0NPUFkoQzJJbnRlcmZhY2VIZWxwZXIpOworfTsKKworLyoqCisgKiBDcmVhdGVzIGEgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlciBjbGFzcyBmb3IgYSBmaWVsZCBvZiBhIHBhcmFtZXRlcgorICoKKyAqIFxwYXJhbSBzcFBhcmFtIGEgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIgaW4gYW4gaW50ZXJmYWNlIGNsYXNzIHN1YmNsYXNzZWQgZnJvbSBDMkludGVyZmFjZUhlbHBlci4KKyAqIFxwYXJhbSBmaWVsZCAgIGEgZmllbGQgb2Ygc3VjaCBwYXJhbWV0ZXIKKyAqLworI2RlZmluZSBDMkYoc3BQYXJhbSwgZmllbGQpIFwKKyAgICBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPCBcCisgICAgICAgICAgICB0eXBlbmFtZSBfYzJfcmVkdWNlX2VudW1fdG9fdW5kZXJseWluZ190eXBlPCBcCisgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6cmVtb3ZlX3JlZmVyZW5jZTwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6cmVtb3ZlX2V4dGVudDwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjbHR5cGUoc3BQYXJhbS0+ZmllbGQpPjo6dHlwZT46OnR5cGU+Ojp0eXBlPiggXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMlBhcmFtRmllbGQoc3BQYXJhbS5nZXQoKSwgJnNwUGFyYW0tPmZpZWxkKSkKKworI2VuZGlmICAvLyBDMlVUSUxTX0lOVEVSRkFDRV9IRUxQRVJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvdXRpbC9DMkludGVyZmFjZVV0aWxzLmggYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL3V0aWwvQzJJbnRlcmZhY2VVdGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5MDM3ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL3V0aWwvQzJJbnRlcmZhY2VVdGlscy5oCkBAIC0wLDAgKzEsMTEzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQzJVVElMU19JTlRFUkZBQ0VfVVRJTFNfSF8KKyNkZWZpbmUgQzJVVElMU19JTlRFUkZBQ0VfVVRJTFNfSF8KKworI2luY2x1ZGUgPEMyUGFyYW0uaD4KKyNpbmNsdWRlIDxDMldvcmsuaD4KKworI2luY2x1ZGUgPGNtYXRoPgorI2luY2x1ZGUgPGl0ZXJhdG9yPgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKworLyoqCisgKiBIZWxwZXIgY2xhc3MgdG8gbWFwIHVuZGVybHlpbmcgdHlwZXMgdG8gQzJWYWx1ZSB0eXBlcyBhcyB3ZWxsIGFzIHRvIHByaW50IGZpZWxkIHZhbHVlcy4gVGhpcyBpcworICogZ2VuZXJhbGx5IHRoZSBzYW1lIGFzIHNpbXBseSB0aGUgdW5kZXJseWluZyB0eXBlIGV4Y2VwdCBmb3IgY2hhcmFjdGVycyAoU1RSSU5HKSBhbmQgYnl0ZXMgKEJMT0IpLgorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IEMyX0hJREUgX0MyRmllbGRWYWx1ZUhlbHBlciB7CisgICAgdHlwZWRlZiBUIFZhbHVlVHlwZTsKKyAgICBpbmxpbmUgc3RhdGljIHN0ZDo6b3N0cmVhbSYgcHV0KHN0ZDo6b3N0cmVhbSAmb3MsIGNvbnN0IEMyVmFsdWU6OlByaW1pdGl2ZSAmcCkgeworICAgICAgICByZXR1cm4gb3MgPDwgcC5yZWY8VD4oKTsKKyAgICB9Cit9OworCit0ZW1wbGF0ZTw+CitzdHJ1Y3QgQzJfSElERSBfQzJGaWVsZFZhbHVlSGVscGVyPHVpbnQ4X3Q+IHsKKyAgICB0eXBlZGVmIHVpbnQzMl90IFZhbHVlVHlwZTsKKyAgICBzdGF0aWMgc3RkOjpvc3RyZWFtJiBwdXQoc3RkOjpvc3RyZWFtICZvcywgY29uc3QgQzJWYWx1ZTo6UHJpbWl0aXZlICZwKTsKK307CisKK3RlbXBsYXRlPD4KK3N0cnVjdCBDMl9ISURFIF9DMkZpZWxkVmFsdWVIZWxwZXI8Y2hhcj4geworICAgIHR5cGVkZWYgaW50MzJfdCBWYWx1ZVR5cGU7CisgICAgc3RhdGljIHN0ZDo6b3N0cmVhbSYgcHV0KHN0ZDo6b3N0cmVhbSAmb3MsIGNvbnN0IEMyVmFsdWU6OlByaW1pdGl2ZSAmcCk7Cit9OworCisvKioKKyAqIFN1cHBvcnRlZCB2YWx1ZSByYW5nZSB1dGlsaXR5IGZvciBhIGZpZWxkIG9mIGEgZ2l2ZW4gdHlwZS4KKyAqCisgKiBUaGlzIG1pbWljcyBDMkZpZWxkU3VwcG9ydGVkVmFsdWUgZm9yIFJBTkdFIHR5cGUuCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitjbGFzcyBDMlN1cHBvcnRlZFJhbmdlIHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9DMkZpZWxkVmFsdWVIZWxwZXI8VD46OlZhbHVlVHlwZSBWYWx1ZVR5cGU7CisKKy8vcHJpdmF0ZToKKyAgICBjb25zdGV4cHIgc3RhdGljIFQgTUlOX1ZBTFVFID0gc3RkOjpudW1lcmljX2xpbWl0czxUPjo6bWluKCk7CisgICAgY29uc3RleHByIHN0YXRpYyBUIE1BWF9WQUxVRSA9IHN0ZDo6bnVtZXJpY19saW1pdHM8VD46Om1heCgpOworICAgIGNvbnN0ZXhwciBzdGF0aWMgVCBNSU5fU1RFUCA9IHN0ZDo6aXNfZmxvYXRpbmdfcG9pbnQ8VD46OnZhbHVlID8gMCA6IDE7CisKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGFuIGVtcHR5IHJhbmdlIHdpdGggbm8gc3VwcG9ydGVkIHZhbHVlcy4KKyAgICAgKgorICAgICAqIFxub3RlIFRoaXMgaXMgYSBzcGVjaWFsaXphdGVkIHN1cHBvcnRlZCByYW5nZSByZXByZXNlbnRhdGlvbiB0aGF0IGlzIG9ubHkgdXNlZCBmb3IKKyAgICAgKiB0aGlzIG9iamVjdCAtIGl0IGlzIGVxdWl2YWxlbnQgdG8gdGhlIEVNUFRZIHR5cGUgaW4gQzJGaWVsZFN1cHBvcnRlZFZhbHVlcy4KKyAgICAgKi8KKyAgICBpbmxpbmUgc3RhdGljIGNvbnN0ZXhwciBDMlN1cHBvcnRlZFJhbmdlPFQ+IE5vbmUoKSB7CisgICAgICAgIHJldHVybiBDMlN1cHBvcnRlZFJhbmdlKE1BWF9WQUxVRSwgTUlOX1ZBTFVFKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgcmFuZ2Ugd2l0aCBhbGwgdmFsdWVzIHN1cHBvcnRlZC4KKyAgICAgKi8KKyAgICBpbmxpbmUgc3RhdGljIGNvbnN0ZXhwciBDMlN1cHBvcnRlZFJhbmdlPFQ+IEFueSgpIHsKKyAgICAgICAgcmV0dXJuIEMyU3VwcG9ydGVkUmFuZ2UoTUlOX1ZBTFVFLCBNQVhfVkFMVUUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSByYW5nZSB3aXRoIGEgc2luZ2xlIHN1cHBvcnRlZCB2YWx1ZS4KKyAgICAgKgorICAgICAqIFxwYXJhbSB2YWx1ZSB0aGUgc29sZSBzdXBwb3J0ZWQgdmFsdWUKKyAgICAgKi8KKyAgICBpbmxpbmUgc3RhdGljIGNvbnN0ZXhwciBDMlN1cHBvcnRlZFJhbmdlPFQ+IEVxdWFsVG8oVCB2YWx1ZSkgeworICAgICAgICByZXR1cm4gQzJTdXBwb3J0ZWRSYW5nZSh2YWx1ZSwgdmFsdWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSByYW5nZSB3aXRoIHN1cHBvcnRlZCB2YWx1ZXMgZ3JlYXRlciB0aGFuIGEgZ2l2ZW4gdmFsdWUuCisgICAgICoKKyAgICAgKiBccGFyYW0gdmFsdWUgdGhlIGdpdmVuIHZhbHVlCisgICAgICovCisgICAgaW5saW5lIHN0YXRpYyBDMlN1cHBvcnRlZFJhbmdlPFQ+IEdyZWF0ZXJUaGFuKFQgdmFsdWUpIHsKKyAgICAgICAgcmV0dXJuICh2YWx1ZSA9PSBNQVhfVkFMVUUgPyBOb25lKCkgOgorICAgICAgICAgICAgICAgIHN0ZDo6aXNfZmxvYXRpbmdfcG9pbnQ8VD46OnZhbHVlID8KKyAgICAgICAgICAgICAgICAgICAgICAgIEMyU3VwcG9ydGVkUmFuZ2Uoc3RkOjpuZXh0YWZ0ZXIodmFsdWUsIE1BWF9WQUxVRSksIE1BWF9WQUxVRSkgOgorICAgICAgICAgICAgICAgICAgICAgICAgQzJTdXBwb3J0ZWRSYW5nZSh2YWx1ZSArIE1JTl9TVEVQLCBNQVhfVkFMVUUpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgcmFuZ2Ugd2l0aCBzdXBwb3J0ZWQgdmFsdWVzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBhIGdpdmVuIHZhbHVlLgorICAgICAqCisgICAgICogXHBhcmFtIHZhbHVlIHRoZSBnaXZlbiB2YWx1ZQorICAgICAqLworICAgIGlubGluZSBzdGF0aWMgY29uc3RleHByIEMyU3VwcG9ydGVkUmFuZ2U8VD4gR3JlYXRlclRoYW5PckVxdWFsVG8oVCB2YWx1ZSkgeworICAgICAgICByZXR1cm4gQzJTdXBwb3J0ZWRSYW5nZSh2YWx1ZSwgTUFYX1ZBTFVFKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgcmFuZ2Ugd2l0aCBzdXBwb3J0ZWQgdmFsdWVzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAoYWthIG5vdCBsZXNzIHRoYW4pIGEgZ2l2ZW4KKyAgICAgKiB2YWx1ZS4KKyAgICAgKgorICAgICAqIFxwYXJhbSB2YWx1ZSB0aGUgZ2l2ZW4gdmFsdWUKKyAgICAgKi8KKyAgICBpbmxpbmUgc3RhdGljIGNvbnN0ZXhwciBDMlN1cHBvcnRlZFJhbmdlPFQ+IE5vdExlc3NUaGFuKFQgdmFsdWUpIHsKKyAgICAgICAgcmV0dXJuIEdyZWF0ZXJUaGFuT3JFcXVhbFRvKHZhbHVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgcmFuZ2Ugd2l0aCBzdXBwb3J0ZWQgdmFsdWVzIGxlc3MgdGhhbiBvciBlcXVhbCB0byBhIGdpdmVuIHZhbHVlLgorICAgICAqCisgICAgICogXHBhcmFtIHZhbHVlIHRoZSBnaXZlbiB2YWx1ZQorICAgICAqLworICAgIGlubGluZSBzdGF0aWMgY29uc3RleHByIEMyU3VwcG9ydGVkUmFuZ2U8VD4gTGVzc1RoYW5PckVxdWFsVG8oVCB2YWx1ZSkgeworICAgICAgICByZXR1cm4gQzJTdXBwb3J0ZWRSYW5nZShNSU5fVkFMVUUsIHZhbHVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgcmFuZ2Ugd2l0aCBzdXBwb3J0ZWQgdmFsdWVzIGxlc3MgdGhhbiBvciBlcXVhbCB0byAoYWthIG5vdCBncmVhdGVyIHRoYW4pIGEgZ2l2ZW4KKyAgICAgKiB2YWx1ZS4KKyAgICAgKgorICAgICAqIFxwYXJhbSB2YWx1ZSB0aGUgZ2l2ZW4gdmFsdWUKKyAgICAgKi8KKyAgICBpbmxpbmUgc3RhdGljIGNvbnN0ZXhwciBDMlN1cHBvcnRlZFJhbmdlPFQ+IE5vdEdyZWF0ZXJUaGFuKFQgdmFsdWUpIHsKKyAgICAgICAgcmV0dXJuIExlc3NUaGFuT3JFcXVhbFRvKHZhbHVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgcmFuZ2Ugd2l0aCBzdXBwb3J0ZWQgdmFsdWVzIGxlc3MgdGhhbiBhIGdpdmVuIHZhbHVlLgorICAgICAqCisgICAgICogXHBhcmFtIHZhbHVlIHRoZSBnaXZlbiB2YWx1ZQorICAgICAqLworICAgIGlubGluZSBzdGF0aWMgQzJTdXBwb3J0ZWRSYW5nZTxUPiBMZXNzVGhhbihUIHZhbHVlKSB7CisgICAgICAgIHJldHVybiAodmFsdWUgPT0gTUlOX1ZBTFVFID8gTm9uZSgpIDoKKyAgICAgICAgICAgICAgICBzdGQ6OmlzX2Zsb2F0aW5nX3BvaW50PFQ+Ojp2YWx1ZSA/CisgICAgICAgICAgICAgICAgICAgICAgICBDMlN1cHBvcnRlZFJhbmdlKE1JTl9WQUxVRSwgc3RkOjpuZXh0YWZ0ZXIodmFsdWUsIE1JTl9WQUxVRSkpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyU3VwcG9ydGVkUmFuZ2UoTUlOX1ZBTFVFLCB2YWx1ZSAtIE1JTl9TVEVQKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIGNvbnRpbnVvdXMgb3IgYXJpdGhtZXRpYyByYW5nZSBiZXR3ZWVuIHR3byB2YWx1ZXMuCisgICAgICoKKyAgICAgKiBccGFyYW0gbWluIHRoZSBsb3dlciB2YWx1ZQorICAgICAqIFxwYXJhbSBtYXggdGhlIGhpZ2hlciB2YWx1ZSAoaWYgdGhpcyBpcyBsb3dlciB0aGFuIHxtaW58IHRoZSByYW5nZSB3aWxsIGJlIGVtcHR5KQorICAgICAqIFxwYXJhbSBzdGVwIHRoZSBzdGVwIG9mIHRoZSBhcml0aG1ldGljIHJhbmdlLiAoSWYgdGhpcyBpcyAwIGZvciBmbG9hdGluZyBwb2ludCB0eXBlcyBvciAxIGZvcgorICAgICAqICAgICAgICBpbnRlZ2VyIHR5cGVzLCB0aGUgY29uc3RydWN0ZWQgcmFuZ2UgaXMgY29udGludW91cykKKyAgICAgKi8KKyAgICBpbmxpbmUgc3RhdGljIGNvbnN0ZXhwcgorICAgIEMyU3VwcG9ydGVkUmFuZ2U8VD4gSW5SYW5nZShUIG1pbiwgVCBtYXgsIFQgc3RlcCA9IE1JTl9TVEVQKSB7CisgICAgICAgIHJldHVybiBDMlN1cHBvcnRlZFJhbmdlKG1pbiwgbWF4LCBzdGVwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgcmFuZ2Ugb3ZlciBhIGdlb21ldHJpYyBzZXJpZXMgYmV0d2VlbiB0d28gdmFsdWVzLgorICAgICAqCisgICAgICogXHBhcmFtIG1pbiB0aGUgbG93ZXIgYm91bmQgb2YgdGhlIHJhbmdlLiBUaGlzIHZhbHVlIGlzIGFsd2F5cyBwYXJ0IG9mIHRoZSBjb25zdHJ1Y3RlZCByYW5nZQorICAgICAqICAgICAgICBhcyBsb25nIGFzIGl0IGlzIG5vdCBncmVhdGVyIHRoYW4gfG1heHwuCisgICAgICogXHBhcmFtIG1heCB0aGUgdXBwZXIgYm91bmQgb2YgdGhlIHJhbmdlLiBUaGlzIHZhbHVlIGlzIG9ubHkgcGFydCBvZiB0aGUgY29uc3RydWN0ZWQKKyAgICAgKiAgICAgICAgcmFuZ2UgaWYgaXQgaXMgcGFydCBvZiB0aGUgZ2VvbWV0cmljIHNlcmllcy4KKyAgICAgKiBccGFyYW0gbnVtIHRoZSBudW1lcmF0b3Igb2YgdGhlIGdlb21ldHJpYyBzZXJpZXMuCisgICAgICogXHBhcmFtIGRlbm9tIHRoZSBkZW5vbWluYXRvciBvZiB0aGUgZ2VvbWV0cmljIHNlcmllcy4KKyAgICAgKi8KKyAgICBpbmxpbmUgc3RhdGljIGNvbnN0ZXhwcgorICAgIEMyU3VwcG9ydGVkUmFuZ2U8VD4gSW5TZXJpZXMoVCBtaW4sIFQgbWF4LCBUIG51bSwgVCBkZW5vbSkgeworICAgICAgICByZXR1cm4gQzJTdXBwb3J0ZWRSYW5nZShtaW4sIG1heCwgMCwgbnVtLCBkZW5vbSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIHJhbmdlIG92ZXIgYSBtdWx0aXBseS1hY2N1bXVsYXRlIHNlcmllcyBiZXR3ZWVuIHR3byB2YWx1ZXMuCisgICAgICoKKyAgICAgKiBccGFyYW0gbWluIHRoZSBsb3dlciBib3VuZCBvZiB0aGUgcmFuZ2UuIFRoaXMgdmFsdWUgaXMgYWx3YXlzIHBhcnQgb2YgdGhlIGNvbnN0cnVjdGVkIHJhbmdlCisgICAgICogICAgICAgIGFzIGxvbmcgYXMgaXQgaXMgbm90IGdyZWF0ZXIgdGhhbiB8bWF4fC4KKyAgICAgKiBccGFyYW0gbWF4IHRoZSB1cHBlciBib3VuZCBvZiB0aGUgcmFuZ2UuIFRoaXMgdmFsdWUgaXMgb25seSBwYXJ0IG9mIHRoZSBjb25zdHJ1Y3RlZAorICAgICAqICAgICAgICByYW5nZSBpZiBpdCBpcyBwYXJ0IG9mIHRoZSBzZXJpZXMuCisgICAgICogXHBhcmFtIHN0ZXAgdGhlIGFjY3VtdWxhdG9yIG9mIHRoZSBtdWx0aXBseS1hY2N1bXVsYXRlIHNlcmllcworICAgICAqIFxwYXJhbSBudW0gdGhlIG51bWVyYXRvciBvZiB0aGUgbXVsdGlwbHktYWNjdW11bGF0ZSBzZXJpZXMuCisgICAgICogXHBhcmFtIGRlbm9tIHRoZSBkZW5vbWluYXRvciBvZiB0aGUgbXVsdGlwbHktYWNjdW11bGF0ZSBzZXJpZXMuCisgICAgICovCisgICAgaW5saW5lIHN0YXRpYyBjb25zdGV4cHIKKyAgICBDMlN1cHBvcnRlZFJhbmdlPFQ+IEluTWFjU2VyaWVzKFQgbWluLCBUIG1heCwgVCBzdGVwLCBUIG51bSwgVCBkZW5vbSkgeworICAgICAgICByZXR1cm4gQzJTdXBwb3J0ZWRSYW5nZShtaW4sIG1heCwgc3RlcCwgbnVtLCBkZW5vbSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIHJhbmdlIGZyb20gYSBnZW5lcmljIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgb2JqZWN0LiBUaGlzIHdpbGwgYmUgYW4gZW1wdHkKKyAgICAgKiByYW5nZSBpZiB0aGUgc3VwcG9ydGVkIHZhbHVlcyBhcmUgbm90IG9mIFJBTkdFIHR5cGUuCisgICAgICoKKyAgICAgKiBccGFyYW0gdmFsdWVzIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIG9iamVjdAorICAgICAqLworICAgIEMyU3VwcG9ydGVkUmFuZ2UoY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyAmdmFsdWVzKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIHJhbmdlIGlzIGVtcHR5LgorICAgICAqLworICAgIGlubGluZSBjb25zdGV4cHIgYm9vbCBpc0VtcHR5KCkgY29uc3QgeworICAgICAgICByZXR1cm4gX21NaW4gPiBfbU1heDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyByYW5nZSBpcyB2YWxpZC4KKyAgICAgKgorICAgICAqIFJhbmdlcyBhcmUgdmFsaWQgaWYgdGhleSBhcmUgY29udGludW91cyBvciBtb25vdG9uaWMuCisgICAgICovCisgICAgaW5saW5lIGNvbnN0ZXhwciBib29sIGlzVmFsaWQoKSBjb25zdCB7CisgICAgICAgIC8vIFRPRE86IGhhbmRsZSBvdmVyZmxvdyBvciBuZWdhdGl2ZSBzZXJpZXMKKyAgICAgICAgcmV0dXJuIF9tRGVub20gPiAwICYmIF9tTnVtID49IF9tRGVub20gJiYgX21NaW4gKiAoX21EZW5vbSAtIF9tTnVtKSA8IF9tU3RlcCAqIF9tRGVub207CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB3aGV0aGVyIGEgdmFsdWUgaXMgcGFydCBvZiB0aGlzIHJhbmdlLgorICAgICAqCisgICAgICogXHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0byBjaGVjay4KKyAgICAgKi8KKyAgICBib29sIGNvbnRhaW5zKFQgdmFsdWUpIGNvbnN0OworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIG5ldyByYW5nZSB0aGF0IGlzIHRoZSBpbnRlcnNlY3Rpb24gb2YgdGhpcyByYW5nZSBhbmQgYW5vdGhlciwgaWYgaXQgaXMKKyAgICAgKiByZXByZXNlbnRhYmxlIGFzIGEgcmFuZ2Ugb2JqZWN0LgorICAgICAqCisgICAgICogXHBhcmFtIGxpbWl0IHRoZSBvdGhlciByYW5nZQorICAgICAqLworICAgIEMyU3VwcG9ydGVkUmFuZ2U8VD4gbGltaXRlZFRvKGNvbnN0IEMyU3VwcG9ydGVkUmFuZ2U8VD4gJmxpbWl0KSBjb25zdDsKKworICAgIC8qKgorICAgICAqIENvbnZlcnRzIHRoaXMgb2JqZWN0IHRvIGEgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyBvYmplY3QuCisgICAgICovCisgICAgaW5saW5lIG9wZXJhdG9yIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzKF9tTWluLCBfbU1heCwgX21TdGVwLCBfbU51bSwgX21EZW5vbSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbG93ZXIgYm91bmQgYW5kIHN0YXJ0aW5nIHBvaW50IG9mIHRoaXMgcmFuZ2UuCisgICAgICovCisgICAgaW5saW5lIEMyX0hJREUgY29uc3RleHByIFQgbWluKCkgY29uc3QgICB7IHJldHVybiBfbU1pbjsgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB1cHBlciBib3VuZCBvZiB0aGlzIHJhbmdlLgorICAgICAqLworICAgIGlubGluZSBDMl9ISURFIGNvbnN0ZXhwciBUIG1heCgpIGNvbnN0ICAgeyByZXR1cm4gX21NYXg7ICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgc3RlcCBvZiB0aGlzIHJhbmdlLgorICAgICAqLworICAgIGlubGluZSBDMl9ISURFIGNvbnN0ZXhwciBUIHN0ZXAoKSBjb25zdCAgeyByZXR1cm4gX21TdGVwOyAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbnVtZXJhdG9yIG9mIHRoaXMgcmFuZ2UuCisgICAgICovCisgICAgaW5saW5lIEMyX0hJREUgY29uc3RleHByIFQgbnVtKCkgY29uc3QgICB7IHJldHVybiBfbU51bTsgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBkZW5vbWluYXRvciBvZiB0aGlzIHJhbmdlLgorICAgICAqLworICAgIGlubGluZSBDMl9ISURFIGNvbnN0ZXhwciBUIGRlbm9tKCkgY29uc3QgeyByZXR1cm4gX21EZW5vbTsgfQorCitwcml2YXRlOgorICAgIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciB4W2kuLi5dIGlzIGFsbCB2YWx1ZXMgYmV0d2VlbiBfbU1pbiBhbmQgX21NYXguCisgICAgICovCisgICAgaW5saW5lIEMyX0hJREUgY29uc3RleHByIGJvb2wgaXNTaW1wbGVSYW5nZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIF9tU3RlcCA9PSBNSU5fU1RFUCAmJiBfbU51bSA9PSAxICYmIF9tRGVub20gPT0gMTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgeFtpLi4uXSBpcyBkZWZpbmVkIGFzIHN1Y2g6CisgICAgICogeFtpICsgMV0gPSB4W2ldICsgX21TdGVwLCB3aGVyZSBfbVN0ZXAgPiAwIGFuZCBfbU1pbiA8PSB4W2ldIDw9IF9tTWF4CisgICAgICovCisgICAgaW5saW5lIEMyX0hJREUgY29uc3RleHByIGJvb2wgaXNBcml0aG1ldGljU2VyaWVzKCkgY29uc3QgeworICAgICAgICByZXR1cm4gX21TdGVwID4gTUlOX1NURVAgJiYgX21OdW0gPT0gMSAmJiBfbURlbm9tID09IDE7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB3aGV0aGVyIHhbaS4uLl0gaXMgZGVmaW5lZCBhcyBzdWNoOgorICAgICAqIHhbaV0gPSB4WzBdICogKF9tTnVtIC8gX21EZW5vbSkgXiBpICh3aXRoIHJvdW5kaW5nKSwgd2hlcmUgX21OdW0gPiBfbURlbm9tID4gMCBhbmQgeFswXSA+IDAKKyAgICAgKi8KKyAgICBpbmxpbmUgQzJfSElERSBjb25zdGV4cHIgYm9vbCBpc0dlb21ldHJpY1NlcmllcygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIF9tTWluID4gMCAmJiBfbVN0ZXAgPT0gMCAmJiBfbU51bSA+IF9tRGVub20gJiYgX21EZW5vbSA+IDA7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB3aGV0aGVyIHhbaS4uLl0gaXMgZGVmaW5lZCBhcyBzdWNoOgorICAgICAqIHhbaSArIDFdID0geFtpXSAqIF9tTnVtIC8gX21EZW5vbSArIF9tU3RlcCAod2l0aCByb3VuZGluZyksIHdoaWxlIHhbaSArIDFdID4geFtpXSwgd2hlcmUKKyAgICAgKiBfbVN0ZXAgIT0gMCwgX21EZW5vbSA+IDAgYW5kIF9tTnVtID4gMAorICAgICAqLworICAgIGlubGluZSBDMl9ISURFIGNvbnN0ZXhwciBib29sIGlzTWFjU2VyaWVzKCkgY29uc3QgeworICAgICAgICByZXR1cm4gX21TdGVwICE9IDAgJiYgX21OdW0gPiAwICYmIF9tRGVub20gPiAwOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYW4gYXJpdGhtZXRpYyBvciBjb250aW51b3VzIHJhbmdlLgorICAgICAqCisgICAgICogXHBhcmFtIG1pbiB0aGUgbG93ZXIgdmFsdWUKKyAgICAgKiBccGFyYW0gbWF4IHRoZSBoaWdoZXIgdmFsdWUgKGlmIHRoaXMgaXMgbG93ZXIgdGhhbiB8bWlufCB0aGUgcmFuZ2Ugd2lsbCBiZSBlbXB0eSkKKyAgICAgKiBccGFyYW0gc3RlcCB0aGUgc3RlcCBvZiB0aGUgYXJpdGhtZXRpYyByYW5nZS4gKElmIHRoaXMgaXMgMCBmb3IgZmxvYXRpbmcgcG9pbnQgdHlwZXMgb3IgMSBmb3IKKyAgICAgKiAgICAgICAgaW50ZWdlciB0eXBlcywgdGhlIGNvbnN0cnVjdGVkIHJhbmdlIGlzIGNvbnRpbnVvdXMpCisgICAgICovCisgICAgY29uc3RleHByIEMyX0hJREUgQzJTdXBwb3J0ZWRSYW5nZShUIG1pbiwgVCBtYXgsIFQgc3RlcCA9IFQoc3RkOjppc19mbG9hdGluZ19wb2ludDxUPjo6dmFsdWUgPyAwIDogMSkpCisgICAgICAgIDogX21NaW4obWluKSwgX21NYXgobWF4KSwgX21TdGVwKHN0ZXApLCBfbU51bSgxKSwgX21EZW5vbSgxKSB7IH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSByYW5nZSBvdmVyIGEgZ2VvbWVydGljIHNvciBtdWx0aXBseS1hY2N1bXVsYXRlIHNlcmllcy4KKyAgICAgKgorICAgICAqIFxwYXJhbSBtaW4gdGhlIGxvd2VyIGJvdW5kIG9mIHRoZSByYW5nZS4gVGhpcyB2YWx1ZSBpcyBhbHdheXMgcGFydCBvZiB0aGUgY29uc3RydWN0ZWQgcmFuZ2UKKyAgICAgKiAgICAgICAgYXMgbG9uZyBhcyBpdCBpcyBub3QgZ3JlYXRlciB0aGFuIHxtYXh8LgorICAgICAqIFxwYXJhbSBtYXggdGhlIHVwcGVyIGJvdW5kIG9mIHRoZSByYW5nZS4gVGhpcyB2YWx1ZSBpcyBvbmx5IHBhcnQgb2YgdGhlIGNvbnN0cnVjdGVkCisgICAgICogICAgICAgIHJhbmdlIGlmIGl0IGlzIHBhcnQgb2YgdGhlIGdlb21ldHJpYyBzZXJpZXMuCisgICAgICogXHBhcmFtIHN0ZXAgdGhlIGFjY3VtdWxhdG9yIG9mIHRoZSBtdWx0aXBseS1hY2N1bXVsYXRlIHNlcmllcy4gVGhpcyBpcyAwIGZvciBhIHB1cmUgZ2VvbWV0cmljCisgICAgICogICAgICAgIHNlcmllcworICAgICAqIFxwYXJhbSBudW0gdGhlIG51bWVyYXRvciBvZiB0aGUgZ2VvbWV0cmljIHNlcmllcy4KKyAgICAgKiBccGFyYW0gZGVub20gdGhlIGRlbm9taW5hdG9yIG9mIHRoZSBnZW9tZXRyaWMgc2VyaWVzLgorICAgICAqLworICAgIGNvbnN0ZXhwciBDMl9ISURFIEMyU3VwcG9ydGVkUmFuZ2UoVCBtaW4sIFQgbWF4LCBUIHN0ZXAsIFQgbnVtLCBUIGRlbikKKyAgICAgICAgOiBfbU1pbihtaW4pLCBfbU1heChtYXgpLCBfbVN0ZXAoc3RlcCksIF9tTnVtKG51bSksIF9tRGVub20oZGVuKSB7IH0KKworICAgIFQgX21NaW47IC8vLzwgbG93ZXIgYm91bmQgYW5kIHN0YXJ0aW5nIHBvaW50CisgICAgVCBfbU1heDsgLy8vPCB1cHBlciBib3VuZAorICAgIFQgX21TdGVwOyAvLy88IHN0ZXAgb2YgYW4gYXJpdGhtZXRpYyBzZXJpZXMgKDAgaWYgY29udGludW91cyBmbG9hdGluZyBwb2ludCByYW5nZSkKKyAgICBUIF9tTnVtOyAvLy88IG51bWVyYXRvciBvZiBhIGdlb21ldHJpYyBzZXJpZXMKKyAgICBUIF9tRGVub207IC8vLzwgZGVub21pbmF0b3Igb2YgYSBnZW9tZXRyaWMgc2VyaWVzCit9OworCisvKioKKyAqIE9yZGVyZWQgc3VwcG9ydGVkIGZsYWcgc2V0IGZvciBhIGZpZWxkIG9mIGEgZ2l2ZW4gdHlwZS4KKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2NsYXNzIEMyU3VwcG9ydGVkRmxhZ3MgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0MyRmllbGRWYWx1ZUhlbHBlcjxUPjo6VmFsdWVUeXBlIFZhbHVlVHlwZTsKKworcHVibGljOgorICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYW4gZW1wdHkgZmxhZyBzZXQuCisgICAgICoKKyAgICAgKiBcbm90ZSBUaGlzIGlzIGEgc3BlY2lhbGl6YXRlZCBzdXBwb3J0ZWQgZmxhZ3MgcmVwcmVzZW50YXRpb24gdGhhdCBpcyBvbmx5IHVzZWQgZm9yCisgICAgICogdGhpcyBvYmplY3QgLSBpdCBpcyBlcXVpdmFsZW50IHRvIHRoZSBFTVBUWSB0eXBlIGluIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMuCisgICAgICovCisgICAgc3RhdGljIGlubGluZSBDMlN1cHBvcnRlZEZsYWdzPFQ+IE5vbmUoKSB7CisgICAgICAgIHJldHVybiBDMlN1cHBvcnRlZEZsYWdzKHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxDMlZhbHVlOjpQcmltaXRpdmU+KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBmbGFncyBzZXQgb2YgZ2l2ZW4gZmxhZ3MuCisgICAgICoKKyAgICAgKiBccGFyYW0gZmxhZ3MgdGhlIG9yZGVyZWQgc2V0IG9mIGZsYWdzIGFzIGFuIGluaXRpYWxpemVyIGxpc3QuCisgICAgICogXHBhcmFtIG1pbiBtaW5pbXVtIHNldCBvZiBmbGFncyB0byBiZSBzZXQuCisgICAgICovCisgICAgc3RhdGljIGlubGluZSBDMlN1cHBvcnRlZEZsYWdzPFQ+IEZsYWdzKGNvbnN0IHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxUPiBmbGFncywgVCBtaW4gPSBUKDApKSB7CisgICAgICAgIHJldHVybiBDMlN1cHBvcnRlZEZsYWdzKG1pbiwgZmxhZ3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBmbGFncyBzZXQgb2YgZ2l2ZW4gZmxhZ3MuCisgICAgICoKKyAgICAgKiBccGFyYW0gZmxhZ3MgdGhlIG9yZGVyZWQgc2V0IG9mIGZsYWdzLgorICAgICAqIFxwYXJhbSBtaW4gbWluaW11bSBzZXQgb2YgZmxhZ3MgdG8gYmUgc2V0LgorICAgICAqLworICAgIHN0YXRpYyBpbmxpbmUgQzJTdXBwb3J0ZWRGbGFnczxUPiBGbGFncyhjb25zdCBzdGQ6OnZlY3RvcjxUPiAmZmxhZ3MsIFQgbWluID0gVCgwKSkgeworICAgICAgICByZXR1cm4gQzJTdXBwb3J0ZWRGbGFncyhtaW4sIGZsYWdzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgZmxhZyBzZXQgZnJvbSBhIGdlbmVyaWMgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyBvYmplY3QuIFRoaXMgd2lsbCBiZSBhbiBlbXB0eQorICAgICAqIHNldCBpZiB0aGUgc3VwcG9ydGVkIHZhbHVlcyBhcmUgbm90IG9mIEZMQUdTIHR5cGUuCisgICAgICoKKyAgICAgKiBccGFyYW0gdmFsdWVzIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIG9iamVjdAorICAgICAqLworICAgIEMyU3VwcG9ydGVkRmxhZ3M8VD4oY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyAmdmFsdWVzKSB7CisgICAgICAgIGlmICh2YWx1ZXMudHlwZSA9PSBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjpGTEFHUykgeworICAgICAgICAgICAgX21WYWx1ZXMuaW5zZXJ0KF9tVmFsdWVzLmVuZCgpLCB2YWx1ZXMudmFsdWVzLmJlZ2luKCksIHZhbHVlcy52YWx1ZXMuZW5kKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgc2V0IGlzIGVtcHR5LgorICAgICAqLworICAgIGNvbnN0ZXhwciBib29sIGlzRW1wdHkoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBfbVZhbHVlcy5lbXB0eSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciBhIHZhbHVlIGlzIHBhcnQgb2YgdGhpcyBzZXQuCisgICAgICoKKyAgICAgKiBccGFyYW0gdmFsdWUgdGhlIHZhbHVlIHRvIGNoZWNrLgorICAgICAqLworICAgIGJvb2wgY29udGFpbnMoVCB2YWx1ZSkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgbmV3IGZsYWcgc2V0IHRoYXQgaXMgdGhlIGludGVyc2VjdGlvbiBvZiB0aGlzIHNldCBhbmQgYW5vdGhlci4KKyAgICAgKgorICAgICAqIFxwYXJhbSBsaW1pdCB0aGUgb3RoZXIgdmFsdWUgc2V0CisgICAgICovCisgICAgQzJTdXBwb3J0ZWRGbGFnczxUPiBsaW1pdGVkVG8oY29uc3QgQzJTdXBwb3J0ZWRGbGFnczxUPiAmbGltaXQpIGNvbnN0OworCisgICAgLyoqCisgICAgICogQ29udmVydHMgdGhpcyBvYmplY3QgdG8gYSBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzIG9iamVjdC4KKyAgICAgKi8KKyAgICBvcGVyYXRvciBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzKCkgY29uc3QgeworICAgICAgICByZXR1cm4gQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyghaXNFbXB0eSgpIC8qIGZsYWdzICovLCBfbVZhbHVlcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgb3JkZXJlZCBzZXQgb2YgZmxhZ3Mgb2YgdGhpcyBvYmplY3QuCisgICAgICovCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8VD4gZmxhZ3MoKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG1pbmltdW0gc2V0IG9mIGZsYWdzIGZvciB0aGlzIG9iamVjdC4KKyAgICAgKi8KKyAgICBUIG1pbigpIGNvbnN0OworCisgICAgLyoqCisgICAgICogQ2xlYXJzIHRoaXMgc3VwcG9ydGVkIHZhbHVlIHNldC4KKyAgICAgKi8KKyAgICBpbmxpbmUgdm9pZCBjbGVhcigpIHsKKyAgICAgICAgX21WYWx1ZXMuY2xlYXIoKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIGZsYWcgc2V0IGRpcmVjdGx5IGZyb20gYW4gaW50ZXJuYWwgcmVwcmVzZW50YXRpb24uCisgICAgICoKKyAgICAgKiBccGFyYW0gdmFsdWVzIGEgdmVjdG9yIGNvbnRhaW5pbmcgdGhlIG1pbmltdW0gZmxhZyBzZXQgZm9sbG93ZWQgYnkgdGhlIHNldCBvZiBmbGFncworICAgICAqLworICAgIEMyU3VwcG9ydGVkRmxhZ3Moc3RkOjp2ZWN0b3I8QzJWYWx1ZTo6UHJpbWl0aXZlPiAmJnZhbHVlcykKKyAgICAgICAgOiBfbVZhbHVlcyh2YWx1ZXMpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgZmxhZyBzZXQgZnJvbSBhIHNldCBvZiBmbGFncyBhbmQgYSBtaW5pbXVtIGZsYWcgc2V0LgorICAgICAqCisgICAgICogXHBhcmFtIGZsYWdzIHRoZSBzZXQKKyAgICAgKi8KKyAgICBDMlN1cHBvcnRlZEZsYWdzKFQgbWluLCBjb25zdCBzdGQ6OnZlY3RvcjxUPiAmZmxhZ3MpIHsKKyAgICAgICAgX21WYWx1ZXMuZW1wbGFjZV9iYWNrKG1pbik7CisgICAgICAgIGZvciAoVCBlbGVtIDogZmxhZ3MpIHsKKyAgICAgICAgICAgIF9tVmFsdWVzLmVtcGxhY2VfYmFjayhlbGVtKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBmbGFnIHNldCBmcm9tIGEgc2V0IG9mIGluaXRpYWxpemVyIGxpc3QgdmFsdWVzIGFuZCBhIG1pbmltdW0gZmxhZyBzZXQKKyAgICAgKgorICAgICAqIFxwYXJhbSBmbGFncyB0aGUgc2V0CisgICAgICovCisgICAgQzJTdXBwb3J0ZWRGbGFncyhUIG1pbiwgY29uc3Qgc3RkOjppbml0aWFsaXplcl9saXN0PFQ+IGZsYWdzKSB7CisgICAgICAgIF9tVmFsdWVzLmVtcGxhY2VfYmFjayhtaW4pOworICAgICAgICBmb3IgKFQgZWxlbSA6IGZsYWdzKSB7CisgICAgICAgICAgICBfbVZhbHVlcy5lbXBsYWNlX2JhY2soZWxlbSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGQ6OnZlY3RvcjxDMlZhbHVlOjpQcmltaXRpdmU+IF9tVmFsdWVzOyAvLy88IHRoZSBtaW5pbXVtIGZsYWcgc2V0IGZvbGxvd2VkIGJ5IHRoZSBzZXQgb2YgZmxhZ3MKK307CisKKy8qKgorICogT3JkZXJlZCBzdXBwb3J0ZWQgdmFsdWUgc2V0IGZvciBhIGZpZWxkIG9mIGEgZ2l2ZW4gdHlwZS4KKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2NsYXNzIEMyU3VwcG9ydGVkVmFsdWVTZXQgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0MyRmllbGRWYWx1ZUhlbHBlcjxUPjo6VmFsdWVUeXBlIFZhbHVlVHlwZTsKKworcHVibGljOgorICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYW4gZW1wdHkgdmFsdWUgc2V0LgorICAgICAqCisgICAgICogXG5vdGUgVGhpcyBpcyBhIHNwZWNpYWxpemF0ZWQgc3VwcG9ydGVkIHJhbmdlIHJlcHJlc2VudGF0aW9uIHRoYXQgaXMgb25seSB1c2VkIGZvcgorICAgICAqIHRoaXMgb2JqZWN0IC0gaXQgaXMgZXF1aXZhbGVudCB0byB0aGUgRU1QVFkgdHlwZSBpbiBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzLgorICAgICAqLworICAgIHN0YXRpYyBpbmxpbmUgQzJTdXBwb3J0ZWRWYWx1ZVNldDxUPiBOb25lKCkgeworICAgICAgICByZXR1cm4gQzJTdXBwb3J0ZWRWYWx1ZVNldCh7IH0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSB2YWx1ZSBzZXQgb2YgZ2l2ZW4gdmFsdWVzLgorICAgICAqCisgICAgICogXHBhcmFtIHZhbHVlcyB0aGUgb3JkZXJlZCBzZXQgb2YgdmFsdWVzIGFzIGFuIGluaXRpYWxpemVyIGxpc3QuCisgICAgICovCisgICAgc3RhdGljIGlubGluZSBDMlN1cHBvcnRlZFZhbHVlU2V0PFQ+IE9uZU9mKGNvbnN0IHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxUPiB2YWx1ZXMpIHsKKyAgICAgICAgcmV0dXJuIEMyU3VwcG9ydGVkVmFsdWVTZXQodmFsdWVzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgdmFsdWUgc2V0IG9mIGdpdmVuIHZhbHVlcy4KKyAgICAgKgorICAgICAqIFxwYXJhbSB2YWx1ZXMgdGhlIG9yZGVyZWQgc2V0IG9mIHZhbHVlcy4KKyAgICAgKi8KKyAgICBzdGF0aWMgaW5saW5lIEMyU3VwcG9ydGVkVmFsdWVTZXQ8VD4gT25lT2YoY29uc3Qgc3RkOjp2ZWN0b3I8VD4gJnZhbHVlcykgeworICAgICAgICByZXR1cm4gQzJTdXBwb3J0ZWRWYWx1ZVNldCh2YWx1ZXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSB2YWx1ZSBzZXQgZnJvbSBhIGdlbmVyaWMgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyBvYmplY3QuIFRoaXMgd2lsbCBiZSBhbiBlbXB0eQorICAgICAqIHNldCBpZiB0aGUgc3VwcG9ydGVkIHZhbHVlcyBhcmUgbm90IG9mIFZBTFVFUyB0eXBlLgorICAgICAqCisgICAgICogXHBhcmFtIHZhbHVlcyB0aGUgc3VwcG9ydGVkIHZhbHVlcyBvYmplY3QKKyAgICAgKi8KKyAgICBDMlN1cHBvcnRlZFZhbHVlU2V0PFQ+KGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgJnZhbHVlcykgeworICAgICAgICBpZiAodmFsdWVzLnR5cGUgPT0gQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6VkFMVUVTKSB7CisgICAgICAgICAgICBfbVZhbHVlcy5pbnNlcnQoX21WYWx1ZXMuZW5kKCksIHZhbHVlcy52YWx1ZXMuYmVnaW4oKSwgdmFsdWVzLnZhbHVlcy5lbmQoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyByYW5nZSBpcyBlbXB0eS4KKyAgICAgKi8KKyAgICBjb25zdGV4cHIgYm9vbCBpc0VtcHR5KCkgY29uc3QgeworICAgICAgICByZXR1cm4gX21WYWx1ZXMuZW1wdHkoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgYSB2YWx1ZSBpcyBwYXJ0IG9mIHRoaXMgc2V0LgorICAgICAqCisgICAgICogXHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0byBjaGVjay4KKyAgICAgKi8KKyAgICBib29sIGNvbnRhaW5zKFQgdmFsdWUpIGNvbnN0OworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIG5ldyB2YWx1ZSBzZXQgdGhhdCBpcyB0aGUgaW50ZXJzZWN0aW9uIG9mIHRoaXMgc2V0IGFuZCBhbm90aGVyLgorICAgICAqCisgICAgICogXHBhcmFtIGxpbWl0IHRoZSBvdGhlciB2YWx1ZSBzZXQKKyAgICAgKi8KKyAgICBDMlN1cHBvcnRlZFZhbHVlU2V0PFQ+IGxpbWl0ZWRUbyhjb25zdCBDMlN1cHBvcnRlZFZhbHVlU2V0PFQ+ICZsaW1pdCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgbmV3IHZhbHVlIHNldCB0aGF0IGlzIHRoZSBpbnRlcnNlY3Rpb24gb2YgdGhpcyBzZXQgYW5kIGEgdmFsdWUgcmFuZ2UuCisgICAgICoKKyAgICAgKiBccGFyYW0gbGltaXQgdGhlIG90aGVyIHJhbmdlCisgICAgICovCisgICAgQzJTdXBwb3J0ZWRWYWx1ZVNldDxUPiBsaW1pdGVkVG8oY29uc3QgQzJTdXBwb3J0ZWRSYW5nZTxUPiAmbGltaXQpIGNvbnN0OworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIG5ldyB2YWx1ZSBzZXQgdGhhdCBpcyB0aGUgaW50ZXJzZWN0aW9uIG9mIHRoaXMgc2V0IGFuZCBhIGZsYWcgc2V0LgorICAgICAqCisgICAgICogXHBhcmFtIGxpbWl0IHRoZSBvdGhlciBmbGFnIHNldAorICAgICAqLworICAgIEMyU3VwcG9ydGVkVmFsdWVTZXQ8VD4gbGltaXRlZFRvKGNvbnN0IEMyU3VwcG9ydGVkRmxhZ3M8VD4gJmxpbWl0KSBjb25zdDsKKworICAgIC8qKgorICAgICAqIENvbnZlcnRzIHRoaXMgb2JqZWN0IHRvIGEgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyBvYmplY3QuCisgICAgICovCisgICAgb3BlcmF0b3IgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMoZmFsc2UgLyogZmxhZ3MgKi8sIF9tVmFsdWVzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBvcmRlcmVkIHNldCBvZiB2YWx1ZXMgb2YgdGhpcyBvYmplY3QuCisgICAgICovCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8VD4gdmFsdWVzKCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBDbGVhcnMgdGhpcyBzdXBwb3J0ZWQgdmFsdWUgc2V0LgorICAgICAqLworICAgIGlubGluZSB2b2lkIGNsZWFyKCkgeworICAgICAgICBfbVZhbHVlcy5jbGVhcigpOworICAgIH0KKworcHJpdmF0ZToKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgdmFsdWUgc2V0IGZyb20gYSBzZXQgb2YgQzJWYWx1ZTo6UHJpbWl0aXZlIHZhbHVlcy4KKyAgICAgKgorICAgICAqIFxwYXJhbSB2YWx1ZXMgdGhlIHNldAorICAgICAqLworICAgIEMyU3VwcG9ydGVkVmFsdWVTZXQoc3RkOjp2ZWN0b3I8QzJWYWx1ZTo6UHJpbWl0aXZlPiAmJnZhbHVlcykKKyAgICAgICAgOiBfbVZhbHVlcyh2YWx1ZXMpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgdmFsdWUgc2V0IGZyb20gYSBzZXQgb2YgdmFsdWVzLgorICAgICAqCisgICAgICogXHBhcmFtIHZhbHVlcyB0aGUgc2V0CisgICAgICovCisgICAgQzJTdXBwb3J0ZWRWYWx1ZVNldChjb25zdCBzdGQ6OnZlY3RvcjxUPiAmdmFsdWVzKSB7CisgICAgICAgIGZvciAoVCBlbGVtIDogdmFsdWVzKSB7CisgICAgICAgICAgICBfbVZhbHVlcy5lbXBsYWNlX2JhY2soZWxlbSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgdmFsdWUgc2V0IGZyb20gYSBzZXQgb2YgaW5pdGlhbGl6ZXIgbGlzdCB2YWx1ZXMKKyAgICAgKgorICAgICAqIFxwYXJhbSB2YWx1ZXMgdGhlIHNldAorICAgICAqLworICAgIEMyU3VwcG9ydGVkVmFsdWVTZXQoY29uc3Qgc3RkOjppbml0aWFsaXplcl9saXN0PFQ+IHZhbHVlcykgeworICAgICAgICBmb3IgKFQgZWxlbSA6IHZhbHVlcykgeworICAgICAgICAgICAgX21WYWx1ZXMuZW1wbGFjZV9iYWNrKGVsZW0pOworICAgICAgICB9CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8QzJWYWx1ZTo6UHJpbWl0aXZlPiBfbVZhbHVlczsgLy8vPCB0aGUgc3VwcG9ydGVkIHNldCBvZiB2YWx1ZXMKK307CisKKy8qKgorICogSGVscGVyIGNsYXNzIHRvIGhhbmRsZSBDMkZpZWxkU3VwcG9ydGVWYWx1ZXMgb2JqZWN0IGZvciBmaWVsZHMgb2YgdmFyaW91cyB0eXBlcy4KKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2NsYXNzIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI7CisKKy8vIHRlbXBsYXRlZCBvcGVyYXRvciBtdXN0IGJlIHByZWRlY2xhcmVkIGZvciBmcmllbmQgZGVjbGFyYXRpb24KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPiAmaSk7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitjbGFzcyBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyIHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgaGVscGVyIGZvciBhIHNwZWNpZmljIHR5cGUgZnJvbSBhIGdlbmVyaWMgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyBzdHJ1Y3QuCisgICAgICovCisgICAgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcihjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzICZ2YWx1ZXMpOworCisgICAgLy8gVFJJQ0tZOiBuZWVkZWQgZm9yIHN0ZDo6dW5pcXVlX3B0cjxJbXBsPiBkZWNsYXJhdGlvbgorICAgIH5DMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyKCk7CisKKyAgICAvLyBzdXBwb3J0IGNvcHkgY29uc3RydWN0b3Ivb3BlcmF0b3IKKyAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyKGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXIgJik7CisgICAgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlciYgb3BlcmF0b3I9KGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXIgJik7CisKKyAgICBib29sIHN1cHBvcnRzKFQgdmFsdWUpIGNvbnN0OworCitwcml2YXRlOgorICAgIC8vIHVzZSBwaW1wbCBhcyBpbXBsZW1lbnRhdGlvbiBtYXkgY2hhbmdlIGluIHRoZSBmdXR1cmUKKyAgICBzdHJ1Y3QgSW1wbDsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8SW1wbD4gX21JbXBsOworCisgICAgZnJpZW5kIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PCA8VD4oc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPiAmaSk7CisgICAgLy9mcmllbmQgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXIgJmkpOworfTsKKworLyoqCisgKiBCdWlsZGVyIGZvciBzdXBwb3J0ZWQgdmFsdWVzIGZvciBhIGZpZWxkIG9mIGEgZ2l2ZW4gdHlwZS4KKyAqCisgKiBUaGlzIGJ1aWxkZXIgY2FuIGJlIHVzZWQgdG8gc3VjY2Vzc2l2ZWx5IHJlc3RyaWN0IHRoZSBzdXBwb3J0ZWQgdmFsdWVzIGZvciBhIGZpZWxkLiBVcG9uCisgKiBjcmVhdGlvbiwgdGhlcmUgYXJlIG5vIHN1cHBvcnRlZCB2YWx1ZXMgc3BlY2lmaWVkIC0gd2hpY2ggZm9yIHRoaXMgYnVpbGRlciBtZWFucyB0aGF0IGFsbAorICogdmFsdWVzIGFyZSBzdXBwb3J0ZWQuCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitjbGFzcyBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyIHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgYnVpbGRlciB3aXRoIG5vIGRlZmluZWQgdmFsdWVzIC0gYnV0IGltcGxpY2l0bHkgYW55IHZhbHVlIGFsbG93ZWQuCisgICAgICovCisgICAgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcihjb25zdCBDMlBhcmFtRmllbGQgJmZpZWxkKTsKKworICAgIC8qKgorICAgICAqIEdldCBDMlBhcmFtRmllbGRWYWx1ZXMgZnJvbSB0aGlzIGJ1aWxkZXIuCisgICAgICovCisgICAgb3BlcmF0b3IgQzJQYXJhbUZpZWxkVmFsdWVzKCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBEZWZpbmUgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgYXMgdGhlIGN1cnJlbnRseSBzdXBwb3J0ZWQgdmFsdWVzIG9mIHRoaXMgYnVpbGRlci4KKyAgICAgKi8KKyAgICBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+ICZhbnkoKTsKKworICAgIC8qKgorICAgICAqIFJlc3RyaWN0IChhbmQgdGh1cyBkZWZpbmUpIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIHRvIG5vbmUuCisgICAgICoKKyAgICAgKiBcbm90ZSBUaGlzIHJlYWxseSBzaG91bGQgbm90IGJlIHVzZWQgZnJvbSB0aGUgYnVpbGRlciBhcyBhbGwgcGFyYW1zIG11c3QgaGF2ZSBzdXBwb3J0ZWQKKyAgICAgKiAgICAgICB2YWx1ZXMsIGJ1dCBpcyBoZXJlIGluIGNhc2UgdGhpcyBpcyByZWFsbHkgdGhlIGNhc2UuCisgICAgICovCisgICAgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiAmbm9uZSgpOworCisgICAgLyoqCisgICAgICogUmVzdHJpY3QgKGFuZCB0aHVzIGRlZmluZSkgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgdG8gfHZhbHVlfCBhbG9uZS4KKyAgICAgKi8KKyAgICBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+ICZlcXVhbFRvKFQgdmFsdWUpOworCisgICAgLyoqCisgICAgICogUmVzdHJpY3QgKGFuZCB0aHVzIGRlZmluZSkgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgdG8gdmFsdWVzIGdyZWF0ZXIgdGhhbiB8dmFsdWV8LgorICAgICAqLworICAgIGlubGluZSBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+ICZncmVhdGVyVGhhbihUIHZhbHVlKSB7CisgICAgICAgIHJldHVybiBsaW1pdFRvKEMyU3VwcG9ydGVkUmFuZ2U8VD46OkdyZWF0ZXJUaGFuKHZhbHVlKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVzdHJpY3QgKGFuZCB0aHVzIGRlZmluZSkgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgdG8gdmFsdWVzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB8dmFsdWV8LgorICAgICAqLworICAgIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD4gJmdyZWF0ZXJUaGFuT3JFcXVhbFRvKFQgdmFsdWUpIHsKKyAgICAgICAgcmV0dXJuIGxpbWl0VG8oQzJTdXBwb3J0ZWRSYW5nZTxUPjo6R3JlYXRlclRoYW5PckVxdWFsVG8odmFsdWUpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXN0cmljdCAoYW5kIHRodXMgZGVmaW5lKSB0aGUgc3VwcG9ydGVkIHZhbHVlcyB0byB2YWx1ZXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHx2YWx1ZXwuCisgICAgICovCisgICAgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiAmbm90TGVzc1RoYW4oVCB2YWx1ZSkgeworICAgICAgICByZXR1cm4gbGltaXRUbyhDMlN1cHBvcnRlZFJhbmdlPFQ+OjpOb3RMZXNzVGhhbih2YWx1ZSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlc3RyaWN0IChhbmQgdGh1cyBkZWZpbmUpIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIHRvIHZhbHVlcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gfHZhbHVlfC4KKyAgICAgKi8KKyAgICBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+ICZsZXNzVGhhbk9yRXF1YWxUbyhUIHZhbHVlKSB7CisgICAgICAgIHJldHVybiBsaW1pdFRvKEMyU3VwcG9ydGVkUmFuZ2U8VD46Okxlc3NUaGFuT3JFcXVhbFRvKHZhbHVlKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVzdHJpY3QgKGFuZCB0aHVzIGRlZmluZSkgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgdG8gdmFsdWVzIGxlc3MgdGhhbiBvciBlcXVhbCB0byB8dmFsdWV8LgorICAgICAqLworICAgIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD4gJm5vdEdyZWF0ZXJUaGFuKFQgdmFsdWUpIHsKKyAgICAgICAgcmV0dXJuIGxpbWl0VG8oQzJTdXBwb3J0ZWRSYW5nZTxUPjo6Tm90R3JlYXRlclRoYW4odmFsdWUpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXN0cmljdCAoYW5kIHRodXMgZGVmaW5lKSB0aGUgc3VwcG9ydGVkIHZhbHVlcyB0byB2YWx1ZXMgbGVzcyB0aGFuIHx2YWx1ZXwuCisgICAgICovCisgICAgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiAmbGVzc1RoYW4oVCB2YWx1ZSkgeworICAgICAgICByZXR1cm4gbGltaXRUbyhDMlN1cHBvcnRlZFJhbmdlPFQ+OjpMZXNzVGhhbih2YWx1ZSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlc3RyaWN0IChhbmQgdGh1cyBkZWZpbmUpIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIHRvIHZhbHVlcyBpbiB0aGUgcmFuZ2Ugb2YgWyB8bWlufCwgfG1heHwgXQorICAgICAqIHdpdGggb3B0aW9uYWwgfHN0ZXB8LgorICAgICAqLworICAgIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD4gJmluUmFuZ2UoCisgICAgICAgICAgICBUIG1pbiwgVCBtYXgsIFQgc3RlcCA9IHN0ZDo6aXNfZmxvYXRpbmdfcG9pbnQ8VD46OnZhbHVlID8gVCgwKSA6IFQoMSkpICB7CisgICAgICAgIHJldHVybiBsaW1pdFRvKEMyU3VwcG9ydGVkUmFuZ2U8VD46OkluUmFuZ2UobWluLCBtYXgsIHN0ZXApKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXN0cmljdCAoYW5kIHRodXMgZGVmaW5lKSB0aGUgc3VwcG9ydGVkIHZhbHVlcyB0byB2YWx1ZXMgaW4gdGhlIGdlb21ldHJpYyBzZXJpZXMgc3RhcnRpbmcKKyAgICAgKiBmcm9tIHxtaW58IHdpdGggZmFjdG9yIHxudW18IC8gfGRlbm9tfCwgbm90IGdyZWF0ZXIgdGhhbiB8bWF4fC4KKyAgICAgKi8KKyAgICBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+ICZpblNlcmllcyhUIG1pbiwgVCBtYXgsIFQgbnVtLCBUIGRlbm9tKSB7CisgICAgICAgIHJldHVybiBsaW1pdFRvKEMyU3VwcG9ydGVkUmFuZ2U8VD46OkluU2VyaWVzKG1pbiwgbWF4LCBudW0sIGRlbm9tKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVzdHJpY3QgKGFuZCB0aHVzIGRlZmluZSkgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgdG8gdmFsdWVzIGluIHRoZSBtdWx0aXBseS1hY2N1bXVsYXRlIHNlcmllcworICAgICAqIHN0YXJ0aW5nIGZyb20gfG1pbnwgd2l0aCBmYWN0b3IgfG51bXwgLyB8ZGVub218IGFuZCB8c3RlcHwsIG5vdCBncmVhdGVyIHRoYW4gfG1heHwuCisgICAgICovCisgICAgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiAmaW5NYWNTZXJpZXMoVCBtaW4sIFQgbWF4LCBUIHN0ZXAsIFQgbnVtLCBUIGRlbm9tKSB7CisgICAgICAgIHJldHVybiBsaW1pdFRvKEMyU3VwcG9ydGVkUmFuZ2U8VD46OkluTWFjU2VyaWVzKG1pbiwgbWF4LCBzdGVwLCBudW0sIGRlbm9tKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVzdHJpY3QgKGFuZCB0aHVzIGRlZmluZSkgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgdG8gdmFsdWVzIGluIHx2YWx1ZXN8LgorICAgICAqLworICAgIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD4gJm9uZU9mKGNvbnN0IHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxUPiB2YWx1ZXMpIHsKKyAgICAgICAgcmV0dXJuIGxpbWl0VG8oQzJTdXBwb3J0ZWRWYWx1ZVNldDxUPjo6T25lT2YodmFsdWVzKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVzdHJpY3QgKGFuZCB0aHVzIGRlZmluZSkgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgdG8gdmFsdWVzIGluIHx2YWx1ZXN8LgorICAgICAqLworICAgIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD4gJm9uZU9mKGNvbnN0IHN0ZDo6dmVjdG9yPFQ+ICZ2YWx1ZXMpIHsKKyAgICAgICAgcmV0dXJuIGxpbWl0VG8oQzJTdXBwb3J0ZWRWYWx1ZVNldDxUPjo6T25lT2YodmFsdWVzKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVzdHJpY3QgKGFuZCB0aHVzIGRlZmluZSkgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgdG8gZmxhZ3MgaW4gfGZsYWdzfCB3aXRoIGF0IGxlYXN0IHxtaW58CisgICAgICogc2V0LgorICAgICAqLworICAgIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD4gJmZsYWdzKGNvbnN0IHN0ZDo6dmVjdG9yPFQ+ICZmbGFncywgVCBtaW4gPSBUKDApKSB7CisgICAgICAgIHJldHVybiBsaW1pdFRvKEMyU3VwcG9ydGVkRmxhZ3M8VD46OkZsYWdzKGZsYWdzLCBtaW4pKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXN0cmljdCAoYW5kIHRodXMgZGVmaW5lKSB0aGUgc3VwcG9ydGVkIHZhbHVlcyB0byBmbGFncyBpbiB8dmFsdWVzfCB3aXRoIGF0IGxlYXN0IHxtaW58CisgICAgICogc2V0LgorICAgICAqLworICAgIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD4gJmZsYWdzKGNvbnN0IHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxUPiBmbGFncywgVCBtaW4gPSBUKDApKSB7CisgICAgICAgIHJldHVybiBsaW1pdFRvKEMyU3VwcG9ydGVkRmxhZ3M8VD46OkZsYWdzKGZsYWdzLCBtaW4pKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5DMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyKCk7CisKKyAgICAvLyBzdXBwb3J0IGNvcHkgY29uc3RydWN0b3Ivb3BlcmF0b3IKKyAgICBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyKGNvbnN0IEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXIgJik7CisgICAgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlciYgb3BlcmF0b3I9KGNvbnN0IEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXIgJik7CisKK3ByaXZhdGU6CisgICAgLyoqCisgICAgICogUmVzdHJpY3QgKGFuZCB0aHVzIGRlZmluZSkgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgdG8gYSB2YWx1ZSBzZXQuCisgICAgICovCisgICAgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiAmbGltaXRUbyhjb25zdCBDMlN1cHBvcnRlZFZhbHVlU2V0PFQ+ICZsaW1pdCk7CisKKyAgICAvKioKKyAgICAgKiBSZXN0cmljdCAoYW5kIHRodXMgZGVmaW5lKSB0aGUgc3VwcG9ydGVkIHZhbHVlcyB0byBhIHZhbHVlIHNldC4KKyAgICAgKi8KKyAgICBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+ICZsaW1pdFRvKGNvbnN0IEMyU3VwcG9ydGVkRmxhZ3M8VD4gJmxpbWl0KTsKKworICAgIC8qKgorICAgICAqIFJlc3RyaWN0IChhbmQgdGh1cyBkZWZpbmUpIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIHRvIGEgcmFuZ2UuCisgICAgICovCisgICAgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiAmbGltaXRUbyhjb25zdCBDMlN1cHBvcnRlZFJhbmdlPFQ+ICZsaW1pdCk7CisKKyAgICBzdHJ1Y3QgSW1wbDsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8SW1wbD4gX21JbXBsOworfTsKKworLyoqCisgKiBCdWlsZGVyIGZvciBhIGxpc3Qgb2Ygc2V0dGluZyBjb25mbGljdHMuCisgKi8KK2NsYXNzIEMyU2V0dGluZ0NvbmZsaWN0c0J1aWxkZXIgeworcHVibGljOgorICAgIC8qKgorICAgICAqIENyZWF0ZXMgYW4gZW1wdHkgbGlzdCBvZiBzZXR0aW5nIGNvbmZsaWN0cy4KKyAgICAgKi8KKyAgICBDMlNldHRpbmdDb25mbGljdHNCdWlsZGVyKCk7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbGlzdCBjb250YWluaW5nIGEgc2luZ2xlIHNldHRpbmcgY29uZmxpY3QuCisgICAgICovCisgICAgQzJTZXR0aW5nQ29uZmxpY3RzQnVpbGRlcihDMlBhcmFtRmllbGRWYWx1ZXMgJiZjb25mbGljdCk7CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgY29uZmxpY3QgdG8gdGhlIGN1cnJlbnQgbGlzdCBvZiBjb25mbGljdHMgYW5kIHJldHVybnMgdGhpcworICAgICAqLworICAgIEMyU2V0dGluZ0NvbmZsaWN0c0J1aWxkZXImIHdpdGgoQzJQYXJhbUZpZWxkVmFsdWVzICYmY29uZmxpY3QpOworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgY3VycmVudCBsaXN0IG9mIGNvbmZsaWN0cyAoYW5kIG1vdmVzIHRoZW0gb3V0IG9mIHRoaXMgYnVpbGRlci4pCisgICAgICogKHRoaXMgaXMgd2h5IGl0IGlzIG5vdCBjb25zdCkKKyAgICAgKi8KKyAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtRmllbGRWYWx1ZXM+IHJldHJpZXZlQ29uZmxpY3RzKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGN1cnJlbnQgbGlzdCBpcyBlbXB0eS4KKyAgICAgKi8KKyAgICBpbmxpbmUgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIF9tQ29uZmxpY3RzLmVtcHR5KCk7IH0KKworICAgIGlubGluZSBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gZW1wdHkoKTsgfQorCitwcml2YXRlOgorICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW1GaWVsZFZhbHVlcz4gX21Db25mbGljdHM7Cit9OworCisvKioKKyAqIFNldHRpbmcgcmVzdWx0IGJ1aWxkZXIgZm9yIGEgcGFyYW1ldGVyLgorICovCitzdHJ1Y3QgQzJTZXR0aW5nUmVzdWx0QnVpbGRlciB7CisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIHJlYWQtb25seSBzZXR0aW5nIHJlc3VsdCBmYWlsdXJlLgorICAgICAqCisgICAgICogVGhpcyBkb2VzIG5vdCB0YWtlIEZTViBhcyBvbmx5IHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBmaWVsZCBpcyBzdXBwb3J0ZWQuCisgICAgICovCisgICAgc3RhdGljIEMyU2V0dGluZ1Jlc3VsdCBSZWFkT25seShjb25zdCBDMlBhcmFtRmllbGQgJnBhcmFtKTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBiYWQtdmFsdWUgb3IgaW5mb2luZm9ybWF0aW9uYWwgYmFkLXZhbHVlIHNldHRpbmcgcmVzdWx0IGZhaWx1cmUuCisgICAgICoKKyAgICAgKiBUaGlzIGRvZXMgbm90IHRha2UgRlNWIGFzIHRoZSB2YWx1ZSBpcyBvdXRzaWRlIG9mIHRoZSBwb3NzaWJsZSB2YWx1ZXMuIEFzIHN1Y2gsIHRoZXJlIGFyZSBubworICAgICAqIGNvbmZsaWN0cyBmb3IgdGhpcyBjYXNlIGVpdGhlci4KKyAgICAgKi8KKyAgICBzdGF0aWMgQzJTZXR0aW5nUmVzdWx0IEJhZFZhbHVlKGNvbnN0IEMyUGFyYW1GaWVsZCAmcGFyYW1GaWVsZCwgYm9vbCBpc0luZm8gPSBmYWxzZSk7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgY29uZmxpY3QgKG9yIGluZm9ybWF0aW9uYWwgY29uZmxpY3QpIHNldHRpbmcgcmVzdWx0IGZhaWx1cmUuCisgICAgICoKKyAgICAgKiBUaGlzIHRha2VzIEZTViBzbyB1c2UgcGFyYW1GaWVsZFZhbHVlcyBhbmQgb3B0aW9uYWwgY29uZmxpY3RzLgorICAgICAqLworICAgIHN0YXRpYyBDMlNldHRpbmdSZXN1bHQgQ29uZmxpY3QoCisgICAgICAgICAgICBDMlBhcmFtRmllbGRWYWx1ZXMgJiZwYXJhbUZpZWxkVmFsdWVzLCBDMlNldHRpbmdDb25mbGljdHNCdWlsZGVyICZjb25mbGljdHMsCisgICAgICAgICAgICBib29sIGlzSW5mbyA9IGZhbHNlKTsKKworICAgIC8vIFRPRE86IHJldHJpZXZlIHJlc3VsdHMKKworCitwcml2YXRlOgorICAgIEMyUGFyYW1GaWVsZCBfbVBhcmFtRmllbGQ7CisgICAgQzJTZXR0aW5nUmVzdWx0IF9tUmVzdWx0OworCisgICAgQzJTZXR0aW5nUmVzdWx0QnVpbGRlcihjb25zdCBDMlNldHRpbmdSZXN1bHRCdWlsZGVyICYpID0gZGVsZXRlOworfTsKKworLyoqCisgKiBTZXR0aW5nIHJlc3VsdHMgKFBMVVJBTCkgYnVpbGRlci4KKyAqCisgKiBTZXR0aW5nIHJlc3VsdHMgY29udGFpbiBhIGZhaWx1cmUgc3RhdHVzIGFsb25nIHdpdGggYSBsaXN0IG9mIGZhaWxpbmcgZmllbGRzIG9yIHBhcmFtcy4KKyAqLworc3RydWN0IEMyU2V0dGluZ1Jlc3VsdHNCdWlsZGVyIHsKKyAgICBDMlNldHRpbmdSZXN1bHRzQnVpbGRlcihjb25zdCBDMlNldHRpbmdSZXN1bHRzQnVpbGRlciYpID0gZGVsZXRlOworICAgIEMyU2V0dGluZ1Jlc3VsdHNCdWlsZGVyKEMyU2V0dGluZ1Jlc3VsdHNCdWlsZGVyJiYpID0gZGVmYXVsdDsKKyAgICBDMlNldHRpbmdSZXN1bHRzQnVpbGRlciAmb3BlcmF0b3I9KEMyU2V0dGluZ1Jlc3VsdHNCdWlsZGVyJiYpID0gZGVmYXVsdDsKKworICAgIC8qKiBccmV0dXJucyAoZGVmYXVsdCkgc3VjY2Vzc2Z1bCByZXN1bHQgd2l0aCBubyBkZXRhaWxzLiAqLworICAgIGlubGluZSBzdGF0aWMgQzJTZXR0aW5nUmVzdWx0c0J1aWxkZXIgT2soKSB7CisgICAgICAgIHJldHVybiBDMlNldHRpbmdSZXN1bHRzQnVpbGRlcihDMl9PSyk7CisgICAgfQorCisgICAgLyoqIFxyZXR1cm5zIEludGVyZmFjZSBpcyBpbiBiYWQgc3RhdGUsIHdpdGggbm8gZnVydGhlciBkZXRhaWxzLiAqLworICAgIGlubGluZSBzdGF0aWMgQzJTZXR0aW5nUmVzdWx0c0J1aWxkZXIgQmFkU3RhdGUoKSB7CisgICAgICAgIHJldHVybiBDMlNldHRpbmdSZXN1bHRzQnVpbGRlcihDMl9CQURfU1RBVEUpOworICAgIH0KKworICAgIC8qKiBccmV0dXJucyBJbnRlcmZhY2UgY29ubmVjdGlvbiB0aW1lZCBvdXQsIHdpdGggbm8gZnVydGhlciBkZXRhaWxzLiAqLworICAgIGlubGluZSBzdGF0aWMgQzJTZXR0aW5nUmVzdWx0c0J1aWxkZXIgVGltZWRPdXQoKSB7CisgICAgICAgIHJldHVybiBDMlNldHRpbmdSZXN1bHRzQnVpbGRlcihDMl9USU1FRF9PVVQpOworICAgIH0KKworICAgIC8qKiBccmV0dXJucyBJbnRlcmZhY2UgY29ubmVjdGlvbiBpcyBjb3JydXB0ZWQsIHdpdGggbm8gZnVydGhlciBkZXRhaWxzLiAqLworICAgIGlubGluZSBzdGF0aWMgQzJTZXR0aW5nUmVzdWx0c0J1aWxkZXIgQ29ycnVwdGVkKCkgeworICAgICAgICByZXR1cm4gQzJTZXR0aW5nUmVzdWx0c0J1aWxkZXIoQzJfQ09SUlVQVEVEKTsKKyAgICB9CisKKyAgICBpbmxpbmUgc3RhdGljIEMyU2V0dGluZ1Jlc3VsdHNCdWlsZGVyIE5vTWVtb3J5KEMyUGFyYW06OkluZGV4IGluZGV4XyBfX3VudXNlZCkgeworICAgICAgICAvLyBUT0RPOiB0cnkgdG8gYWRkIGZhaWx1cmUgcmVzdWx0CisgICAgICAgIHJldHVybiBDMlNldHRpbmdSZXN1bHRzQnVpbGRlcihDMl9OT19NRU1PUlkpOworICAgIH0KKworICAgIC8vIFRPRE86IHRoaXMgc2hvdWxkIG5vdCBiZSBhIGNvbnN0cnVjdG9yCisgICAgLyoqIENyZWF0ZXMgYSBidWlsZGVyIHdpdGggYSBzaW5nbGUgYmFkIHZhbHVlIHNldHRpbmcgcmVzdWx0LiAqLworICAgIEMyU2V0dGluZ1Jlc3VsdHNCdWlsZGVyKEMyU2V0dGluZ1Jlc3VsdCAmJnJlc3VsdCk7CisKKyAgICAvKiogQ29tYmluZXMgdGhpcyByZXN1bHRzIHdpdGggb3RoZXIgcmVzdWx0cy4gKi8KKyAgICBDMlNldHRpbmdSZXN1bHRzQnVpbGRlciBwbHVzKEMyU2V0dGluZ1Jlc3VsdHNCdWlsZGVyJiYgcmVzdWx0cyk7CisKKyAgICAvKiogUmV0cmlldmUgKGdldCBhbmQgbW92ZSBvdXQpIGZhaWx1cmVzIGFuZCByZXR1cm4gdGhlIGZhaWx1cmUgc3RhdHVzLiAqLworICAgIGMyX3N0YXR1c190IHJldHJpZXZlRmFpbHVyZXMoc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+KiBjb25zdCBmYWlsdXJlcyk7CisKK3ByaXZhdGU6CisgICAgLyoqIFNldHRpbmcgcmVzdWx0cyBiYXNlZCBvbiBhIHNpbmdsZSBzdGF0dXMuIFRoaXMgaXMgdXNlZCB3aGVuIGFjdHVhbCBzZXR0aW5nIGNvdWxkIG5vdCBiZQorICAgICAqICBhdHRlbXB0ZWQgdG8gZ2V0IGEgc2luZ2xlIEMyU2V0dGluZ1Jlc3VsdCwgb3Igd2hlbiBhIHNldHRpbmcgc3VjY2VlZGVkIHdpdGhvdXQKKyAgICAgKiAgJ2NvbXBsYWludHMnLiAqLworICAgIEMyU2V0dGluZ1Jlc3VsdHNCdWlsZGVyKGMyX3N0YXR1c190IHN0YXR1cyk7CisgICAgICAgIC8vIHN0YXR1cyBtdXN0IGJlIG9uZSBvZiBPSywgQkFEX1NUQVRFLCBUSU1FRF9PVVQsIENPUlJVUFRFRCBvciBOT19NRU1PUlkKKyAgICAgICAgLy8gbWFpbmx5OiBCTE9DS0lORywgQkFEX0lOREVYLCBCQURfVkFMVUUgYW5kIE5PX01FTU9SWSByZXF1aXJlcyBhIHNldHRpbmcgYXR0ZW1wdCwgYnV0CisgICAgICAgIC8vIE5PX01FTU9SWSBtYXkgbm90IGFsbG93IHVzIHRvIGNyZWF0ZSBhIHJlc3VsdHMgc3RydWN0dXJlLgorCisgICAgLyoqCisgICAgICogT25lIG9mIE9LLCBCQURfSU5ERVgsIEJBRF9WQUxVRSwgQkFEX1NUQVRFLCBOT19NRU1PUlksIFRJTUVEX09VVCwgQkxPQ0tJTkcgb3IgQ09SUlVQVEVELgorICAgICAqLworICAgIGMyX3N0YXR1c190IF9tU3RhdHVzIF9fdW51c2VkOworCisgICAgLyoqCisgICAgICogVmVjdG9yIG9mIGluZGl2aWR1YWwgc2V0dGluZyByZXN1bHQgZGV0YWlscy4KKyAgICAgKi8KKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gX21SZXN1bHRzOworfTsKKworLyoqCisgKiBVdGlsaXR5IGNsYXNzIHRvIGVudW1lcmF0ZSBmaWVsZHMgb2YgcGFyYW1ldGVycy4KKyAqLworc3RydWN0IEMyRmllbGRVdGlscyB7CisgICAgc3RydWN0IF9JbnNwZWN0b3I7CisKKyAgICAvKioKKyAgICAgKiBBbiBleHRlbmRlZCBmaWVsZCBkZXNjcmlwdG9yIG9iamVjdCB3aXRoIHN0cnVjdHVyYWwgaW5mb3JtYXRpb24gKGxpbmVhZ2UgYmFjayB0byB0aGUgcm9vdCBvZgorICAgICAqIHRoZSBwYXJhbSkuCisgICAgICovCisgICAgc3RydWN0IEluZm8geworICAgICAgICB0eXBlZGVmIEMyRmllbGREZXNjcmlwdG9yOjp0eXBlX3QgdHlwZV90OyAvLy88IGZpZWxkIHR5cGUKKyAgICAgICAgdHlwZWRlZiBDMkZpZWxkRGVzY3JpcHRvcjo6TmFtZWRWYWx1ZXNUeXBlIE5hbWVkVmFsdWVzVHlwZTsgLy8vPCBuYW1lZCB2YWx1ZXMgbGlzdCB0eXBlCisKKyAgICAgICAgLy8vIHJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGZpZWxkCisgICAgICAgIEMyU3RyaW5nIG5hbWUoKSBjb25zdDsKKworICAgICAgICAvLy8gcmV0dXJucyB0aGUgdHlwZSBvZiB0aGlzIGZpZWxkCisgICAgICAgIHR5cGVfdCB0eXBlKCkgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgdGhlIGRlZmluZWQgbmFtZS12YWx1ZSBwYWlyaW5ncyBmb3IgdGhpcyBmaWVsZC4gVGhlIHJldHVybmVkIHJlZmVyZW5jZSBpcworICAgICAgICAgKiBvbmx5IHZhbGlkIGR1cmluZyB0aGUgdmFsaWRpdHkgb2YgdGhpcyBvYmplY3QKKyAgICAgICAgICovCisgICAgICAgIGNvbnN0IE5hbWVkVmFsdWVzVHlwZSAmbmFtZWRWYWx1ZXMoKSBjb25zdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGluZGV4IG9mIHRoaXMgZmllbGQuIEUuZy4gcGFyYW0uZmllbGQgb3IgcGFyYW0uZmllbGRbMF0gaGFzIGFuIGluZGV4IG9mIDAsIGFuZAorICAgICAgICAgKiBwYXJhbS5zdHJ1Y3RbMl0uZmllbGRbM10gaGFzIGFuIGluZGV4IG9mIDMuCisgICAgICAgICAqLworICAgICAgICBzaXplX3QgaW5kZXgoKSBjb25zdDsKKworICAgICAgICAvLy8gcmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBmaWVsZCBpbiBjYXNlIGl0IGlzIGFuIGFycmF5LiBSZXR1cm5zIDAgZm9yCisgICAgICAgIC8vLyBUW10gYXJyYXlzIGlmIHRoaXMgaW5mbyBjb21lcyBmcm9tIGEgQzJQYXJhbTo6SW5kZXggb2JqZWN0LCBhbmQgdGhlIGN1cnJlbnRseSB1c2VkCisgICAgICAgIC8vLyBleHRlbnQgaWYgaXQgY29tZXMgZnJvbSBhIEMyUGFyYW0gb2JqZWN0LiBSZXR1cm5zIDEgZm9yIFRbMV0gYXJyYXlzIGFzIHdlbGwgYXMgaWYgdGhlCisgICAgICAgIC8vLyBmaWVsZCBpcyBub3QgYW4gYXJyYXkuCisgICAgICAgIHNpemVfdCBleHRlbnQoKSBjb25zdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIChzdHJ1Y3R1cmFsKSBkZXB0aCBvZiB0aGlzIGZpZWxkLiBFLmcuIHBhcmFtLmZpZWxkIG9yIHBhcmFtLmZpZWxkWzBdIGhhcyBhIGRlcHRoIG9mCisgICAgICAgICAqICAwLCBhbmQgcGFyYW0uc3RydWN0LmZpZWxkIG9yIHBhcmFtLnN0cnVjdFswXS5maWVsZFswXSBoYXMgYSBkZXB0aCBvZiAxLgorICAgICAgICAgKi8KKyAgICAgICAgc2l6ZV90IGRlcHRoKCkgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgdGhlIG9mZnNldCBvZiB0aGlzIGZpZWxkIGluIHRoZSBwYXJhbWV0ZXIgaW4gYnl0ZXMuCisgICAgICAgICAqLworICAgICAgICBzaXplX3Qgb2Zmc2V0KCkgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgdGhlIHNpemUgb2YgdGhpcyBmaWVsZCBpbiBieXRlcy4KKyAgICAgICAgICovCisgICAgICAgIHNpemVfdCBzaXplKCkgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBvZmZzZXQgb2YgdGhpcyBmaWVsZCdzIGFycmF5LiBFLmcuIGZvciBwYXJhbS5zdHJ1Y3RbMl0uZmllbGRbM10gdGhpcyBpcyB0aGUgb2Zmc2V0CisgICAgICAgICAqIG9mIGl0cyBzbWFsbGVzdCBzaWJsaW5nOiBwYXJhbS5zdHJ1Y3RbMl0uZmllbGRbMF0uCisgICAgICAgICAqLworICAgICAgICBzaXplX3QgYXJyYXlPZmZzZXQoKSBjb25zdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyB0aGUgc2l6ZSBvZiB0aGlzIGZpZWxkJ3MgYXJyYXkuIFRoaXMgaXMgZXF1aXZhbGVudCB0byBleHRlbnQoKSAqIHNpemUoKQorICAgICAgICAgKi8KKyAgICAgICAgc2l6ZV90IGFycmF5U2l6ZSgpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgb2Zmc2V0IG9mIHRoZSBiYXNlIGZpZWxkLiBUaGUgYmFzZSBmaWVsZCBpcyBhIGNvdXNpbiBvZiB0aGUgY3VycmVudCBmaWVsZCB3aGVyZQorICAgICAgICAgKiBhbGwgaW5kaWNlcyBhcmUgMC4gRS5nLiB0aGUgdGhlIGJhc2UgZmllbGQgZm9yIHBhcmFtLnN0cnVjdFsyXS5maWVsZFszXSBpcworICAgICAgICAgKiBwYXJhbS5zdHJ1Y3RbMF0uZmllbGRbMF0uIEJhc2UgZmllbGRzIGFyZSB1c2VkIHRvIHNwZWNpZnkgc3VwcG9ydGVkIHZhbHVlcyBmb3IKKyAgICAgICAgICogYWxsIGNvdXNpbiBmaWVsZHMuCisgICAgICAgICAqLworICAgICAgICBzaXplX3QgYmFzZUZpZWxkT2Zmc2V0KCkgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIGZpZWxkIGlzIGFuIGFyaXRobWV0aWMgKGludGVncmFsLCBjb3VudGVyIG9yIGZsb2F0KSBmaWVsZC4KKyAgICAgICAgICovCisgICAgICAgIGJvb2wgaXNBcml0aG1ldGljKCkgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIGZpZWxkIGNhbiBoYXZlIGEgZmxleGlibGUgZXh0ZW50LiBleHRlbnQoKSByZXR1cm5zIHRoZSBjdXJyZW50CisgICAgICAgICAqIGV4dGVudC4KKyAgICAgICAgICovCisgICAgICAgIGJvb2wgaXNGbGV4aWJsZSgpIGNvbnN0OworCisgICAgICAgIC8vLyByZXR1cm5zIHdoZXRoZXIgdGhpcyBpbmZvIGlzIHZhbGlkCisgICAgICAgIGlubGluZSBib29sIGlzVmFsaWQoKSBjb25zdCB7IHJldHVybiBfbUltcGwgIT0gbnVsbHB0cjsgfQorCisgICAgICAgIC8vLyByZXR1cm5zIHRoZSBpbmZvIGZvciB0aGUgcGFyZW50IG9mIHRoaXMgZmllbGQsIG9yIGFuIGludmFsaWQgSW5mbyBvYmplY3QgaWYgaXQgaGFzIG5vCisgICAgICAgIC8vLyBwYXJlbnRzCisgICAgICAgIEluZm8gcGFyZW50KCkgY29uc3Q7CisKKyAgICAgICAgLy8vIHJldHVybnMgd2hldGhlciB0aGlzIGluZm8gaXMgdmFsaWQKKyAgICAgICAgaW5saW5lIG9wZXJhdG9yIGJvb2woKSBjb25zdCB7IHJldHVybiBpc1ZhbGlkKCk7IH0KKworICAgICAgICBzdHJ1Y3QgSW1wbDsKKyAgICAgICAgSW5mbyhzdGQ6OnNoYXJlZF9wdHI8SW1wbD4pOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEltcGw+IF9tSW1wbDsKKyAgICAgICAgZnJpZW5kIHN0cnVjdCBfSW5zcGVjdG9yOworICAgIH07CisKKyAgICAvKioKKyAgICAgKiBBbiAoaW5wdXQpIGl0ZXJhdG9yIG9iamVjdCBvdmVyIGZpZWxkcyB1c2luZyBJbmZvIG9iamVjdHMuCisgICAgICovCisgICAgc3RydWN0IEl0ZXJhdG9yIHsKKyAgICAgICAgdHlwZWRlZiBJbmZvIGNvbnN0IHZhbHVlX3R5cGU7CisgICAgICAgIHR5cGVkZWYgcHRyZGlmZl90IGRpZmZlcmVuY2VfdHlwZTsKKyAgICAgICAgdHlwZWRlZiBJbmZvIGNvbnN0ICogcG9pbnRlcjsKKyAgICAgICAgdHlwZWRlZiBJbmZvIGNvbnN0IHJlZmVyZW5jZTsKKyAgICAgICAgdHlwZWRlZiBzdGQ6OmlucHV0X2l0ZXJhdG9yX3RhZyBpdGVyYXRvcl9jYXRlZ29yeTsKKworICAgICAgICAvLy8gcmV0dXJuIEluZm8gYXQgY3VycmVudCBwb3NpdGlvbgorICAgICAgICB2aXJ0dWFsIHJlZmVyZW5jZSBvcGVyYXRvciooKSBjb25zdDsKKworICAgICAgICAvLy8gbW92ZSB0byB0aGUgbmV4dCBmaWVsZAorICAgICAgICB2aXJ0dWFsIEl0ZXJhdG9yJiBvcGVyYXRvcisrKCk7CisKKyAgICAgICAgdmlydHVhbCBib29sIG9wZXJhdG9yPT0oY29uc3QgSXRlcmF0b3IgJikgY29uc3Q7CisgICAgICAgIGlubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgSXRlcmF0b3IgJm90aGVyKSBjb25zdCB7IHJldHVybiAhb3BlcmF0b3I9PShvdGhlcik7IH0KKworICAgICAgICB2aXJ0dWFsIH5JdGVyYXRvcigpID0gZGVmYXVsdDsKKworICAgICAgICBzdHJ1Y3QgSW1wbDsKKyAgICAgICAgSXRlcmF0b3Ioc3RkOjpzaGFyZWRfcHRyPEltcGw+KTsKKworICAgIHByb3RlY3RlZDoKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEltcGw+IG1JbXBsOworICAgIH07CisKKyAgICAvKioKKyAgICAgKiBBbiAoaW5wdXQpIGl0ZXJhYmxlIG9iamVjdCByZXByZXNlbnRpbmcgYSBsaXN0IG9mIGZpZWxkcy4KKyAgICAgKi8KKyAgICBzdHJ1Y3QgTGlzdCB7CisgICAgICAgIC8vLyByZXR1cm5zIGFuIGl0ZXJhdG9yIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpc3QKKyAgICAgICAgdmlydHVhbCBJdGVyYXRvciBiZWdpbigpIGNvbnN0OworCisgICAgICAgIC8vLyByZXR1cm5zIGFuIGl0ZXJhdG9yIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QKKyAgICAgICAgdmlydHVhbCBJdGVyYXRvciBlbmQoKSBjb25zdDsKKworICAgICAgICB2aXJ0dWFsIH5MaXN0KCkgPSBkZWZhdWx0OworCisgICAgICAgIHN0cnVjdCBJbXBsOworICAgICAgICBMaXN0KHN0ZDo6c2hhcmVkX3B0cjxJbXBsPik7CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBtSW1wbDsKKyAgICB9OworCisgICAgLyoqCisgICAgICogRW51bWVyYXRlcyBhbGwgKGJhc2UpIGZpZWxkcyBhdCBpbmRleCAwIG9mIHRoZSBwYXJhbWV0ZXIuIFRoZSBvcmRlciBvZiBpdGVyYXRpb24gaXMgdGhlCisgICAgICogZm9sbG93aW5nOgorICAgICAqICAgRmllbGRzIG9mIGEgc3RydWN0dXJlIGFyZSBlbnVtZXJhdGVkIGluIGZpZWxkIG9yZGVyLiBIb3dldmVyLCBzdWItZmllbGRzIG9mIGEgc3RydWN0dXJlCisgICAgICogICBhcmUgZW51bWVyYXRlZCBkaXJlY3RseSBhZnRlciB0aGUgc3RydWN0dXJlIGZpZWxkLCBhbmQgcHJpb3IgdG8gc2libGluZyBmaWVsZHMuCisgICAgICoKKyAgICAgKiBJbiBlc3NlbmNlIHRoZSBvcmRlciBvZiBlbnVtZXJhdGlvbiBpcyBmaXJzdCBieSBpbmNyZWFzaW5nIG9mZnNldCwgdGhlbiBieSBkZWNyZWFzaW5nIHNpemUuCisgICAgICoKKyAgICAgKiBccGFyYW0gcGFyYW0gcGFyYW1ldGVyIHRvIGVudW1lcmF0ZSBpdHMgZmllbGRzCisgICAgICogXHBhcmFtIHJlZmxlY3RvciBwYXJhbWV0ZXIgcmVmbGVjdG9yIHVzZWQgZm9yIGVudW1lcmF0aW9uCisgICAgICoKKyAgICAgKiBccmV0dXJuIGFuIGl0ZXJhYmxlIG9iamVjdAorICAgICAqLworICAgIHN0YXRpYyBMaXN0IGVudW1lcmF0ZUZpZWxkcygKKyAgICAgICAgICAgIGNvbnN0IEMyUGFyYW0gJnBhcmFtLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+ICZyZWZsZWN0b3IpOworCisgICAgLyoqCisgICAgICogRW51bWVyYXRlcyBhbGwgY291c2luIGZpZWxkcyB1cCB0byBkZXB0aCAtIGxldmVsIGZvciBhIGZpZWxkLiBJZiBsZXZlbCBpcyAwLCBpdCBlbnVtZXJhdGVzCisgICAgICogb25seSB0aGUgZmllbGQuIEZvciBsZXZlbCAxLCBpdCBlbnVtZXJhdGVzIGFsbCBmaWVsZHMgaW4gaXRzIGN1cnJlbnQgYXJyYXkgKHdoaWNoIG1heSBiZQorICAgICAqIGl0c2VsZiBpZiBleHRlbnQgaXMgMSkuIFRoZSBvcmRlciBvZiBpdGVyYXRpb24gaXMgYnkgaW5jcmVhc2luZyBmaWVsZCBvZmZzZXQuCisgICAgICovCisgICAgc3RhdGljIExpc3QgZW51bWVyYXRlQ291c2lucygKKyAgICAgICAgICAgIGNvbnN0IEluZm8gJmZpZWxkLAorICAgICAgICAgICAgdWludDMyX3QgbGV2ZWwgPSB+MCk7CisKKyAgICAvKioKKyAgICAgKiBMb2NhdGVzIHRoZSBmaWVsZCBpbiBhIHBhcmFtZXRlciBhbmQgcmV0dXJucyBhIGxpc3Qgb2YgMiBlbGVtZW50cyAtIHRoZSBtb3N0LXNwZWNpZmljIGZpZWxkCisgICAgICogYXJyYXkgb2YgdGhlIHBhcmFtZXRlciB0aGF0IGNvbnRhaW5zIHRoZSBlbnRpcmUgZmllbGQuIElmIHRoZSBmaWVsZCBpcyBub3QgYSB2YWxpZCBmaWVsZAorICAgICAqIHNwZWNpZmllciBmb3IgdGhpcyBwYXJhbWV0ZXIgKGUuZy4gaXQgaXMgb3V0c2lkZSB0aGUgYm91bmRzIG9mIHRoZSBwYXJhbWV0ZXIpLCBpdCByZXR1cm5zCisgICAgICogYW4gZW1wdHkgbGlzdC4KKyAgICAgKi8KKyAgICBzdGF0aWMgc3RkOjp2ZWN0b3I8SW5mbz4gbG9jYXRlRmllbGQoCisgICAgICAgICAgICBjb25zdCBDMlBhcmFtICZwYXJhbSwgY29uc3QgX0MyRmllbGRJZCAmZmllbGQsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gJnJlZmxlY3Rvcik7CisKKyAgICBzdGF0aWMgc3RkOjp2ZWN0b3I8SW5mbz4gbG9jYXRlRmllbGQoCisgICAgICAgICAgICBjb25zdCBDMlBhcmFtRmllbGQgJnBmLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gJnJlZmxlY3Rvcik7CisKK307CisKKyNpbmNsdWRlIDx1dGlsL0MyRGVidWctaW50ZXJmYWNlLmg+CisKKyNlbmRpZiAgLy8gQzJVVElMU19JTlRFUkZBQ0VfVVRJTFNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvdXRpbC9DMlBhcmFtVXRpbHMuaCBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvdXRpbC9DMlBhcmFtVXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTFiZDk0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS91dGlsL0MyUGFyYW1VdGlscy5oCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEMyVVRJTFNfUEFSQU1fVVRJTFNfSF8KKyNkZWZpbmUgQzJVVElMU19QQVJBTV9VVElMU19IXworCisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKy8qKiBcZmlsZQorICogVXRpbGl0aWVzIGZvciBwYXJhbWV0ZXIgaGFuZGxpbmcgdG8gYmUgdXNlZCBieSBDb2RlYzIgaW1wbGVtZW50YXRpb25zLgorICovCisKKy8vLyBcY29uZCBJTlRFUk5BTAorCitzdHJ1Y3QgQzJQYXJhbTsKKworY2xhc3MgQzJQYXJhbVV0aWxzIHsKKyAgICBmcmllbmQgY2xhc3MgQzJVdGlsVGVzdF9QYXJhbVV0aWxzVGVzdF9UZXN0OworCitwdWJsaWM6CisKKyAgICAvLy8gc2FmZShyKSBwYXJzaW5nIGZyb20gcGFyYW1ldGVyIGJsb2IKKyAgICBzdGF0aWMKKyAgICBDMlBhcmFtICpQYXJzZUZpcnN0KGNvbnN0IHVpbnQ4X3QgKmJsb2IsIHNpemVfdCBzaXplKTsKK307CisKKy8vLyBcZW5kY29uZAorCisjZW5kaWYgIC8vIEMyVVRJTFNfUEFSQU1fVVRJTFNfSF8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvaW50ZXJuYWwvQzJCbG9ja0ludGVybmFsLmggYi9tZWRpYS9jb2RlYzIvdm5kay9pbnRlcm5hbC9DMkJsb2NrSW50ZXJuYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWJmM2FjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW50ZXJuYWwvQzJCbG9ja0ludGVybmFsLmgKQEAgLTAsMCArMSwzMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfU1RBR0VGUklHSFRfQzJCTE9DS19JTlRFUk5BTF9IXworI2RlZmluZSBBTkRST0lEX1NUQUdFRlJJR0hUX0MyQkxPQ0tfSU5URVJOQUxfSF8KKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZ3JhcGhpY3MvYnVmZmVycXVldWUvMS4wL0lHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KKworI2luY2x1ZGUgPEMyQnVmZmVyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGJ1ZmZlcnBvb2wgeworCitzdHJ1Y3QgQnVmZmVyUG9vbERhdGE7CisKK30KK30KK30KK30KKworLyoqCisgKiBTdG9yZXMgaW5mb3JtYXRpb25zIGZyb20gQzJCbG9ja1Bvb2wgaW1wbGVtZW50YXRpb25zIHdoaWNoIGFyZSByZXF1aXJlZCBieSBDMkJsb2NrLgorICovCitzdHJ1Y3QgQzJfSElERSBfQzJCbG9ja1Bvb2xEYXRhIHsKKyAgICBlbnVtIHR5cGVfdCA6IGludCB7CisgICAgICAgIFRZUEVfQlVGRkVSUE9PTCA9IDAsCisgICAgICAgIFRZUEVfQlVGRkVSUVVFVUUsCisgICAgfTsKKworICAgIHZpcnR1YWwgdHlwZV90IGdldFR5cGUoKSBjb25zdCA9IDA7CisKK3Byb3RlY3RlZDoKKyAgICBfQzJCbG9ja1Bvb2xEYXRhKCkgPSBkZWZhdWx0OworCisgICAgdmlydHVhbCB+X0MyQmxvY2tQb29sRGF0YSgpID0gZGVmYXVsdDsKK307CisKK3N0cnVjdCBDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YTsKKworLyoqCisgKiBJbnRlcm5hbCBvbmx5IGludGVyZmFjZSBmb3IgY3JlYXRpbmcgYmxvY2tzIGJ5IGJsb2NrIHBvb2wvYnVmZmVyIHBhc3NpbmcgaW1wbGVtZW50YXRpb25zLgorICoKKyAqIFx0b2RvIHRoaXMgbXVzdCBiZSBoaWRkZW4KKyAqLworc3RydWN0IF9DMkJsb2NrRmFjdG9yeSB7CisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbGluZWFyIGJsb2NrIGZyb20gYW4gYWxsb2NhdGlvbiBmb3IgYW4gYWxsb3R0ZWQgcmFuZ2UuCisgICAgICoKKyAgICAgKiBccGFyYW0gYWxsb2MgcGFyZW50IGFsbG9jYXRpb24KKyAgICAgKiBccGFyYW0gZGF0YSAgYmxvY2twb29sIGRhdGEKKyAgICAgKiBccGFyYW0gb2Zmc2V0IGFsbG90dGVkIHJhbmdlIG9mZnNldAorICAgICAqIFxwYXJhbSBzaXplICBhbGxvdHRlZCBzaXplCisgICAgICoKKyAgICAgKiBccmV0dXJuIHNoYXJlZCBwb2ludGVyIHRvIHRoZSBsaW5lYXIgYmxvY2suIG51bGxwdHIgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2ggbWVtb3J5IHRvCisgICAgICogICAgICAgICBjcmVhdGUgdGhpcyBibG9jay4KKyAgICAgKi8KKyAgICBzdGF0aWMKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gQ3JlYXRlTGluZWFyQmxvY2soCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJBbGxvY2F0aW9uPiAmYWxsb2MsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8X0MyQmxvY2tQb29sRGF0YT4gJmRhdGEgPSBudWxscHRyLAorICAgICAgICAgICAgc2l6ZV90IG9mZnNldCA9IDAsCisgICAgICAgICAgICBzaXplX3Qgc2l6ZSA9IH4oc2l6ZV90KTApOworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgZ3JhcGhpYyBibG9jayBmcm9tIGFuIGFsbG9jYXRpb24gZm9yIGFuIGFsbG90dGVkIHNlY3Rpb24uCisgICAgICoKKyAgICAgKiBccGFyYW0gYWxsb2MgcGFyZW50IGFsbG9jYXRpb24KKyAgICAgKiBccGFyYW0gZGF0YSAgYmxvY2twb29sIGRhdGEKKyAgICAgKiBccGFyYW0gY3JvcCAgYWxsb3R0ZWQgY3JvcCByZWdpb24KKyAgICAgKgorICAgICAqIFxyZXR1cm4gc2hhcmVkIHBvaW50ZXIgdG8gdGhlIGdyYXBoaWMgYmxvY2suIG51bGxwdHIgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2ggbWVtb3J5IHRvCisgICAgICogICAgICAgICBjcmVhdGUgdGhpcyBibG9jay4KKyAgICAgKi8KKyAgICBzdGF0aWMKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+IENyZWF0ZUdyYXBoaWNCbG9jaygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNBbGxvY2F0aW9uPiAmYWxsb2MsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8X0MyQmxvY2tQb29sRGF0YT4gJmRhdGEgPSBudWxscHRyLAorICAgICAgICAgICAgY29uc3QgQzJSZWN0ICZhbGxvdHRlZENyb3AgPSBDMlJlY3QofjB1LCB+MHUpKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIGJsb2NrIHBvb2wgZGF0YSBmcm9tIDFEIGJsb2NrLgorICAgICAqCisgICAgICogXHBhcmFtIHNoYXJlZCBwb2ludGVyIHRvIHRoZSAxRCBibG9jayB3aGljaCBpcyBhbHJlYWR5IGNyZWF0ZWQuCisgICAgICovCisgICAgc3RhdGljCisgICAgc3RkOjpzaGFyZWRfcHRyPF9DMkJsb2NrUG9vbERhdGE+IEdldExpbmVhckJsb2NrUG9vbERhdGEoCisgICAgICAgICAgICBjb25zdCBDMkJsb2NrMUQmIGJsb2NrKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIGJsb2NrIHBvb2wgZGF0YSBmcm9tIDJEIGJsb2NrLgorICAgICAqCisgICAgICogXHBhcmFtIHNoYXJlZCBwb2ludGVyIHRvIHRoZSAyRCBibG9jayB3aGljaCBpcyBhbHJlYWR5IGNyZWF0ZWQuCisgICAgICovCisgICAgc3RhdGljCisgICAgc3RkOjpzaGFyZWRfcHRyPF9DMkJsb2NrUG9vbERhdGE+IEdldEdyYXBoaWNCbG9ja1Bvb2xEYXRhKAorICAgICAgICAgICAgY29uc3QgQzJCbG9jazJEJiBibG9jayk7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBsaW5lYXIgYmxvY2sgZnJvbSB0aGUgcmVjZWl2ZWQgbmF0aXZlIGhhbmRsZS4KKyAgICAgKgorICAgICAqIFxwYXJhbSBoYW5kbGUgICAgbmF0aXZlIGhhbmRsZSB0byBhIGxpbmVhciBibG9jaworICAgICAqCisgICAgICogXHJldHVybiBzaGFyZWQgcG9pbnRlciB0byB0aGUgbGluZWFyIGJsb2NrLiBudWxscHRyIGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoIG1lbW9yeSB0bworICAgICAqICAgICAgICAgY3JlYXRlIHRoaXMgYmxvY2suCisgICAgICovCisgICAgc3RhdGljCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IENyZWF0ZUxpbmVhckJsb2NrKAorICAgICAgICAgICAgY29uc3QgQzJIYW5kbGUgKmhhbmRsZSk7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBncmFwaGljIGJsb2NrIGZyb20gdGhlIHJlY2VpdmVkIG5hdGl2ZSBoYW5kbGUuCisgICAgICoKKyAgICAgKiBccGFyYW0gaGFuZGxlICAgIG5hdGl2ZSBoYW5kbGUgdG8gYSBncmFwaGljIGJsb2NrCisgICAgICoKKyAgICAgKiBccmV0dXJuIHNoYXJlZCBwb2ludGVyIHRvIHRoZSBncmFwaGljIGJsb2NrLiBudWxscHRyIGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoIG1lbW9yeSB0bworICAgICAqICAgICAgICAgY3JlYXRlIHRoaXMgYmxvY2suCisgICAgICovCisgICAgc3RhdGljCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiBDcmVhdGVHcmFwaGljQmxvY2soCisgICAgICAgICAgICBjb25zdCBDMkhhbmRsZSAqaGFuZGxlKTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIGxpbmVhciBibG9jayBmcm9tIHRoZSByZWNlaXZlZCBidWZmZXJwb29sIGRhdGEuCisgICAgICoKKyAgICAgKiBccGFyYW0gZGF0YSAgYnVmZmVycG9vbCBkYXRhIHRvIGEgbGluZWFyIGJsb2NrCisgICAgICoKKyAgICAgKiBccmV0dXJuIHNoYXJlZCBwb2ludGVyIHRvIHRoZSBsaW5lYXIgYmxvY2suIG51bGxwdHIgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2ggbWVtb3J5IHRvCisgICAgICogICAgICAgICBjcmVhdGUgdGhpcyBibG9jay4KKyAgICAgKi8KKyAgICBzdGF0aWMKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gQ3JlYXRlTGluZWFyQmxvY2soCisgICAgICAgICAgICBjb25zdCBDMkhhbmRsZSAqaGFuZGxlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6QnVmZmVyUG9vbERhdGE+ICZkYXRhKTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIGdyYXBoaWMgYmxvY2sgZnJvbSB0aGUgcmVjZWl2ZWQgYnVmZmVycG9vbCBkYXRhLgorICAgICAqCisgICAgICogXHBhcmFtIGRhdGEgIGJ1ZmZlcnBvb2wgZGF0YSB0byBhIGdyYXBoaWMgYmxvY2sKKyAgICAgKgorICAgICAqIFxyZXR1cm4gc2hhcmVkIHBvaW50ZXIgdG8gdGhlIGdyYXBoaWMgYmxvY2suIG51bGxwdHIgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2ggbWVtb3J5IHRvCisgICAgICogICAgICAgICBjcmVhdGUgdGhpcyBibG9jay4KKyAgICAgKi8KKyAgICBzdGF0aWMKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+IENyZWF0ZUdyYXBoaWNCbG9jaygKKyAgICAgICAgICAgIGNvbnN0IEMySGFuZGxlICpoYW5kbGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpCdWZmZXJQb29sRGF0YT4gJmRhdGEpOworCisgICAgLyoqCisgICAgICogR2V0IGJ1ZmZlcnBvb2wgZGF0YSBmcm9tIHRoZSBibG9ja3Bvb2wgZGF0YS4KKyAgICAgKgorICAgICAqIFxwYXJhbSBwb29sRGF0YSAgICAgICAgICBibG9ja3Bvb2wgZGF0YQorICAgICAqIFxwYXJhbSBidWZmZXJQb29sRGF0YSAgICBwb2ludGVyIHRvIGJ1ZmZlcnBvb2wgZGF0YSB3aGVyZSB0aGUgYnVmZmVycG9vbAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhIGlzIHN0b3JlZC4KKyAgICAgKgorICAgICAqIFxyZXR1cm4ge1xjb2RlIHRydWV9IHdoZW4gdGhlcmUgaXMgdmFsaWQgYnVmZmVycG9vbCBkYXRhLCB7XGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBzdGF0aWMKKyAgICBib29sIEdldEJ1ZmZlclBvb2xEYXRhKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IF9DMkJsb2NrUG9vbERhdGE+ICZwb29sRGF0YSwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OkJ1ZmZlclBvb2xEYXRhPiAqYnVmZmVyUG9vbERhdGEpOworCisgICAgLyoKKyAgICAgKiBMaWZlIEN5Y2xlIE1hbmFnZW1lbnQgb2YgQnVmZmVyUXVldWUtQmFzZWQgQmxvY2tzCisgICAgICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAqCisgICAgICogQSBibG9jayB0aGF0IGlzIGNyZWF0ZWQgYnkgYSBidWZmZXJxdWV1ZS1iYXNlZCBibG9ja3Bvb2wgcmVxdWlyZXMgc29tZQorICAgICAqIHNwZWNpYWwgdHJlYXRtZW50IHdoZW4gaXQgaXMgZGVzdHJveWVkLiBJbiBwYXJ0aWN1bGFyLCBpZiB0aGUgYmxvY2sKKyAgICAgKiBjb3JyZXNwb25kcyB0byBhIGhlbGQgKGRlcXVldWVkL2F0dGFjaGVkKSBHcmFwaGljQnVmZmVyIGluIGEgc2xvdCBvZiBhCisgICAgICogYnVmZmVycXVldWUsIGl0cyBkZXN0cnVjdGlvbiBzaG91bGQgdHJpZ2dlciBhIGNhbGwgdG8KKyAgICAgKiBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpjYW5jZWxCdWZmZXIoKS4gT24gdGhlIG90aGVyIGhhbmQsIGlmIHRoZQorICAgICAqIEdyYXBoaWNCdWZmZXIgaXMgbm90IGhlbGQsIGkuZS4sIGlmIGl0IGhhcyBiZWVuIHF1ZXVlZCBvciBkZXRhY2hlZCwKKyAgICAgKiBjYW5jZWxCdWZmZXIoKSBzaG91bGQgbm90IGJlIGNhbGxlZCB1cG9uIHRoZSBkZXN0cnVjdGlvbiBvZiB0aGUgYmxvY2suCisgICAgICoKKyAgICAgKiBfQzJCbG9ja1Bvb2xEYXRhIGNyZWF0ZWQgYnkgYSBidWZmZXJxdWV1ZS1iYXNlZCBibG9ja3Bvb2wgaW5jbHVkZXMgdHdvCisgICAgICogbWFpbiBwaWVjZXMgb2YgaW5mb3JtYXRpb246CisgICAgICogICAtICJoZWxkIiBzdGF0dXM6IFdoZXRoZXIgY2FuY2VsQnVmZmVyKCkgc2hvdWxkIGJlIGNhbGxlZCB1cG9uCisgICAgICogICAgIGRlc3RydWN0aW9uIG9mIHRoZSBibG9jay4KKyAgICAgKiAgIC0gYnVmZmVycXVldWUgYXNzaWdubWVudDogVGhlIHF1YWRydXBsZSAoaWdicCwgZ2VuZXJhdGlvbiwgYnFJZCwKKyAgICAgKiAgICAgYnFTbG90KSwgd2hlcmUgaWdicCBpcyB0aGUgSUdyYXBoaWNCdWZmZXJQcm9kdWNlciBpbnN0YW5jZSBvZiB0aGUKKyAgICAgKiAgICAgYnVmZmVycXVldWUsIGdlbmVyYXRpb24gaXMgdGhlIGxhdGVzdCBnZW5lcmF0aW9uIG51bWJlciwgb2YgdGhlCisgICAgICogICAgIGJ1ZmZlcnF1ZXVlLCBicUlkIGlzIHRoZSBnbG9iYWxseSB1bmlxdWUgaWQgb2YgdGhlIGJ1ZmZlcnF1ZXVlLCBhbmQKKyAgICAgKiAgICAgYnFTbG90IGlzIHRoZSBzbG90IGluIHRoZSBidWZmZXJxdWV1ZS4KKyAgICAgKgorICAgICAqIGlnYnAgaXMgdGhlIGluc3RhbmNlIG9mIElHcmFwaGljQnVmZmVyUHJvZHVjZXIgb24gd2hpY2ggY2FuY2VsQnVmZmVyKCkKKyAgICAgKiB3aWxsIGJlIGNhbGxlZCBpZiAiaGVsZCIgc3RhdHVzIGlzIHRydWUgd2hlbiB0aGUgYmxvY2sgaXMgZGVzdHJveWVkLgorICAgICAqIChicVNsb3QgaXMgYW4gaW5wdXQgdG8gY2FuY2VsQnVmZmVyKCkuKSBIb3dldmVyLCBvbmx5IGdlbmVyYXRpb24sIGJxSWQKKyAgICAgKiBhbmQgYnFTbG90IGFyZSByZXRhaW5lZCB3aGVuIGEgYmxvY2sgaXMgdHJhbnNmZXJyZWQgZnJvbSBvbmUgcHJvY2VzcyB0bworICAgICAqIGFub3RoZXIuIEl0IGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiBib3RoIHRoZSBzZW5kaW5nIGFuZCByZWNlaXZpbmcKKyAgICAgKiBwcm9jZXNzZXMgdG8gbWFpbnRhaW4gY29uc2lzdGVuY3kgb2YgImhlbGQiIHN0YXR1cyBhbmQgaWdicC4gQmVsb3cgYXJlCisgICAgICogZnVuY3Rpb25zIHByb3ZpZGVkIGZvciB0aGlzIHB1cnBvc2U6CisgICAgICoKKyAgICAgKiAgIC0gR2V0QnVmZmVyUXVldWVEYXRhKCk6IFJldHVybnMgZ2VuZXJhdGlvbiwgYnFJZCBhbmQgYnFTbG90LgorICAgICAqICAgLSBIb2xkQmxvY2tGcm9tQnVmZmVyUXVldWUoKTogU2V0cyAiaGVsZCIgc3RhdHVzIHRvIHRydWUuCisgICAgICogICAtIFlpZWxkQmxvY2tUb0J1ZmZlclF1ZXVlKCk6IFNldHMgImhlbGQiIHN0YXR1cyB0byBmYWxzZS4KKyAgICAgKiAgIC0gQXNzaWduQmxvY2tUb0J1ZmZlclF1ZXVlKCk6IFNldHMgdGhlIGJ1ZmZlcnF1ZXVlIGFzc2lnbm1lbnQgYW5kCisgICAgICogICAgICJoZWxkIiBzdGF0dXMuCisgICAgICoKKyAgICAgKiBBbGwgdGhlc2UgZnVuY3Rpb25zIG9wZXJhdGUgb24gX0MyQmxvY2tQb29sRGF0YSwgd2hpY2ggY2FuIGJlIG9idGFpbmVkIGJ5CisgICAgICogY2FsbGluZyBHZXRHcmFwaGljQmxvY2tQb29sRGF0YSgpLgorICAgICAqCisgICAgICogSG9sZEJsb2NrRnJvbUJ1ZmZlclF1ZXVlKCkgd2lsbCBtYXJrIHRoZSBibG9jayBhcyBoZWxkLCB3aGlsZQorICAgICAqIFlpZWxkQmxvY2tUb0J1ZmZlclF1ZXVlKCkgd2lsbCBkbyB0aGUgb3Bwb3NpdGUuIFRoZXNlIHR3byBmdW5jdGlvbnMgZG8KKyAgICAgKiBub3QgbW9kaWZ5IHRoZSBidWZmZXJxdWV1ZSBhc3NpZ25tZW50LCBzbyBpdCBpcyBub3Qgd3JvbmcgdG8gY2FsbAorICAgICAqIEhvbGRCbG9ja0Zyb21CdWZmZXJRdWV1ZSgpIGFmdGVyIFlpZWxkQmxvY2tUb0J1ZmZlclF1ZXVlKCkgaWYgaXQgY2FuIGJlCisgICAgICogZ3VhcmFudGVlZCB0aGF0IHRoZSBibG9jayBpcyBub3QgZGVzdHJveWVkIGR1cmluZyB0aGUgcGVyaW9kIGJldHdlZW4gdGhlCisgICAgICogdHdvIGNhbGxzLgorICAgICAqCisgICAgICogQXNzaW5nQmxvY2tUb0J1ZmZlclF1ZXVlKCkgaGFzIGEgImhlbGQiIHN0YXR1cyBhcyBhbiBvcHRpb25hbCBhcmd1bWVudC4KKyAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyB0cnVlLgorICAgICAqCisgICAgICogTWFpbnRhaW5pbmcgQ29uc2lzdGVuY3kgd2l0aCBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyIE9wZXJhdGlvbnMKKyAgICAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAqCisgICAgICogZGVxdWV1ZUJ1ZmZlcigpCisgICAgICogICAtIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBibG9ja3Bvb2wuIEl0IHNob3VsZCBub3QgYmUgY2FsbGVkCisgICAgICogICAgIG1hbnVhbGx5LiBUaGUgYmxvY2twb29sIHdpbGwgYXV0b21hdGljYWxseSBnZW5lcmF0ZSB0aGUgY29ycmVjdAorICAgICAqICAgICBpbmZvcm1hdGlvbiBmb3IgX0MyQmxvY2tQb29sRGF0YSwgd2l0aCAiaGVsZCIgc3RhdHVzIHNldCB0byB0cnVlLgorICAgICAqCisgICAgICogcXVldWVCdWZmZXIoKQorICAgICAqICAgLSBBZnRlciBxdWV1ZUJ1ZmZlcigpIGlzIGNhbGxlZCwgWWllbGRCbG9ja1RvQnVmZmVyUXVldWUoKSBzaG91bGQgYmUKKyAgICAgKiAgICAgY2FsbGVkLgorICAgICAqCisgICAgICogYXR0YWNoQnVmZmVyKCkKKyAgICAgKiAgIC0gQWZ0ZXIgYXR0YWNoQnVmZmVyKCkgaXMgY2FsbGVkLCBBc3NpZ25CbG9ja1RvQnVmZmVyUXVldWUoKSBzaG91bGQgYmUKKyAgICAgKiAgICAgY2FsbGVkIHdpdGggImhlbGQiIHN0YXR1cyBzZXQgdG8gdHJ1ZS4KKyAgICAgKgorICAgICAqIGRldGFjaEJ1ZmZlcigpCisgICAgICogICAtIEFmdGVyIGRldGFjaEJ1ZmZlcigpIGlzIGNhbGxlZCwgSG9sZEJsb2NrRnJvbUJ1ZmZlclF1ZXVlKCkgc2hvdWxkIGJlCisgICAgICogICAgIGNhbGxlZC4KKyAgICAgKi8KKworICAgIC8qKgorICAgICAqIEdldCBidWZmZXJxdWV1ZSBkYXRhIGZyb20gdGhlIGJsb2NrcG9vbCBkYXRhLgorICAgICAqCisgICAgICogQ2FsbGluZyB0aGlzIGZ1bmN0aW9uIHdpdGggXHAgZ2VuZXJhdGlvbiBzZXQgdG8gbnVsbHB0ciB3aWxsIHJldHVybgorICAgICAqIHdoZXRoZXIgdGhlIGJsb2NrIGNvbWVzIGZyb20gYSBidWZmZXJxdWV1ZS1iYXNlZCBibG9ja3Bvb2wsIGJ1dCB3aWxsIG5vdAorICAgICAqIGZpbGwgaW4gdGhlIHZhbHVlcyBmb3IgXHAgZ2VuZXJhdGlvbiwgXHAgYnFJZCBvciBccCBicVNsb3QuCisgICAgICoKKyAgICAgKiBccGFyYW1baW5dICBwb29sRGF0YSAgIGJsb2NrcG9vbCBkYXRhLgorICAgICAqIFxwYXJhbVtvdXRdIGdlbmVyYXRpb24gR2VuZXJhdGlvbiBudW1iZXIgYXR0YWNoZWQgdG8gdGhlIGJ1ZmZlci4KKyAgICAgKiBccGFyYW1bb3V0XSBicUlkICAgICAgIElkIG9mIHRoZSBidWZmZXJxdWV1ZSBvd25pbmcgdGhlIGJ1ZmZlciAoYmxvY2spLgorICAgICAqIFxwYXJhbVtvdXRdIGJxU2xvdCAgICAgU2xvdCBudW1iZXIgb2YgdGhlIGJ1ZmZlci4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gXGMgdHJ1ZSB3aGVuIHRoZXJlIGlzIHZhbGlkIGJ1ZmZlcnF1ZXVlIGRhdGE7CisgICAgICogICAgICAgICBcYyBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgc3RhdGljCisgICAgYm9vbCBHZXRCdWZmZXJRdWV1ZURhdGEoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8X0MyQmxvY2tQb29sRGF0YT4mIHBvb2xEYXRhLAorICAgICAgICAgICAgdWludDMyX3QqIGdlbmVyYXRpb24gPSBudWxscHRyLAorICAgICAgICAgICAgdWludDY0X3QqIGJxSWQgPSBudWxscHRyLAorICAgICAgICAgICAgaW50MzJfdCogYnFTbG90ID0gbnVsbHB0cik7CisKKyAgICAvKioKKyAgICAgKiBTZXQgYnVmZmVycXVldWUgYXNzaWdubWVudCBhbmQgImhlbGQiIHN0YXR1cyB0byBhIGJsb2NrIGNyZWF0ZWQgYnkgYQorICAgICAqIGJ1ZmZlcnF1ZXVlLWJhc2VkIGJsb2NrcG9vbC4KKyAgICAgKgorICAgICAqIFxwYXJhbSBwb29sRGF0YSBibG9ja3Bvb2wgZGF0YSBhc3NvY2lhdGVkIHRvIHRoZSBibG9jay4KKyAgICAgKiBccGFyYW0gaWdicCAgICAgICBcYyBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyIGluc3RhbmNlIGZyb20gdGhlIGRlc2lnbmF0ZWQKKyAgICAgKiAgICAgICAgICAgICAgICAgICBidWZmZXJxdWV1ZS4KKyAgICAgKiBccGFyYW0gZ2VuZXJhdGlvbiBHZW5lcmF0aW9uIG51bWJlciB0aGF0IHRoZSBidWZmZXIgYmVsb25ncyB0by4KKyAgICAgKiBccGFyYW0gYnFJZCAgICAgICBJZCBvZiB0aGUgYnVmZmVycXVldWUgdGhhdCB3aWxsIG93biB0aGUgYnVmZmVyIChibG9jaykuCisgICAgICogXHBhcmFtIGJxU2xvdCAgICAgU2xvdCBudW1iZXIgb2YgdGhlIGJ1ZmZlci4KKyAgICAgKiBccGFyYW0gaGVsZCAgICAgICBXaGV0aGVyIHRoZSBibG9jayBpcyBoZWxkLiBUaGlzICJoZWxkIiBzdGF0dXMgY2FuIGJlCisgICAgICogICAgICAgICAgICAgICAgICAgY2hhbmdlZCBsYXRlciBieSBjYWxsaW5nIFlpZWxkQmxvY2tUb0J1ZmZlclF1ZXVlKCkgb3IKKyAgICAgKiAgICAgICAgICAgICAgICAgICBIb2xkQmxvY2tGcm9tQnVmZmVyUXVldWUoKS4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gXGMgdHJ1ZSBpZiBccCBwb29sRGF0YSBpcyB2YWxpZCBidWZmZXJxdWV1ZSBkYXRhOworICAgICAqICAgICAgICAgXGMgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqCisgICAgICogTm90ZTogXHAgZ2VuZXJhdGlvbiBzaG91bGQgbWF0Y2ggdGhlIGxhdGVzdCBnZW5lcmF0aW9uIG51bWJlciBzZXQgb24gdGhlCisgICAgICogYnVmZmVycXVldWUsIGFuZCBccCBicUlkIHNob3VsZCBtYXRjaCB0aGUgdW5pcXVlIGlkIGZvciB0aGUgYnVmZmVycXVldWUKKyAgICAgKiAob2J0YWluYWJsZSBieSBjYWxsaW5nIGlnYnAtPmdldFVuaXF1ZUlkKCkpLgorICAgICAqLworICAgIHN0YXRpYworICAgIGJvb2wgQXNzaWduQmxvY2tUb0J1ZmZlclF1ZXVlKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPF9DMkJsb2NrUG9vbERhdGE+JiBwb29sRGF0YSwKKyAgICAgICAgICAgIGNvbnN0IDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmJ1ZmZlcnF1ZXVlOjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVjFfMDo6SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIGlnYnAsCisgICAgICAgICAgICB1aW50MzJfdCBnZW5lcmF0aW9uLAorICAgICAgICAgICAgdWludDY0X3QgYnFJZCwKKyAgICAgICAgICAgIGludDMyX3QgYnFTbG90LAorICAgICAgICAgICAgYm9vbCBoZWxkID0gdHJ1ZSk7CisKKyAgICAvKioKKyAgICAgKiBIb2xkIGEgYmxvY2sgZnJvbSB0aGUgZGVzaWduYXRlZCBidWZmZXJxdWV1ZS4gVGhpcyBjYXVzZXMgdGhlIGRlc3RydWN0aW9uCisgICAgICogb2YgdGhlIGJsb2NrIHRvIHRyaWdnZXIgYSBjYWxsIHRvIGNhbmNlbEJ1ZmZlcigpLgorICAgICAqCisgICAgICogVGhpcyBmdW5jdGlvbiBhc3N1bWVzIHRoYXQgXHAgcG9vbERhdGEgY29tZXMgZnJvbSBhIGJ1ZmZlcnF1ZXVlLWJhc2VkCisgICAgICogYmxvY2suIEl0IGRvZXMgbm90IGNoZWNrIGlmIHRoYXQgaXMgdGhlIGNhc2UuCisgICAgICoKKyAgICAgKiBccGFyYW0gcG9vbERhdGEgYmxvY2twb29sIGRhdGEgYXNzb2NpYXRlZCB0byB0aGUgYmxvY2suCisgICAgICogXHBhcmFtIGlnYnAgICAgIFxjIElHcmFwaGljQnVmZmVyUHJvZHVjZXIgaW5zdGFuY2UgdG8gYmUgYXNzaWduZWQgdG8gdGhlCisgICAgICogICAgICAgICAgICAgICAgIGJsb2NrLiBUaGlzIGlzIG5vdCBuZWVkZWQgd2hlbiB0aGUgYmxvY2sgaXMgbG9jYWwuCisgICAgICoKKyAgICAgKiBccmV0dXJuIFRoZSBwcmV2aW91cyBoZWxkIHN0YXR1cy4KKyAgICAgKi8KKyAgICBzdGF0aWMKKyAgICBib29sIEhvbGRCbG9ja0Zyb21CdWZmZXJRdWV1ZSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxfQzJCbG9ja1Bvb2xEYXRhPiYgcG9vbERhdGEsCisgICAgICAgICAgICBjb25zdCA6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpidWZmZXJxdWV1ZTo6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFYxXzA6OklHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBpZ2JwID0gbnVsbHB0cik7CisKKyAgICAvKioKKyAgICAgKiBZaWVsZCBhIGJsb2NrIHRvIHRoZSBkZXNpZ25hdGVkIGJ1ZmZlcnF1ZXVlLiBUaGlzIGNhdXNlcyB0aGUgZGVzdHJ1Y3Rpb24KKyAgICAgKiBvZiB0aGUgYmxvY2sgbm90IHRvIHRyaWdnZXIgYSBjYWxsIHRvIGNhbmNlbEJ1ZmZlcigpOworICAgICAqCisgICAgICogVGhpcyBmdW5jdGlvbiBhc3N1bWVzIHRoYXQgXHAgcG9vbERhdGEgY29tZXMgZnJvbSBhIGJ1ZmZlcnF1ZXVlLWJhc2VkCisgICAgICogYmxvY2suIEl0IGRvZXMgbm90IGNoZWNrIGlmIHRoYXQgaXMgdGhlIGNhc2UuCisgICAgICoKKyAgICAgKiBccGFyYW0gcG9vbERhdGEgYmxvY2twb29sIGRhdGEgYXNzb2NpYXRlZCB0byB0aGUgYmxvY2suCisgICAgICoKKyAgICAgKiBccmV0dXJuIFRoZSBwcmV2aW91cyBoZWxkIHN0YXR1cy4KKyAgICAgKi8KKyAgICBzdGF0aWMKKyAgICBib29sIFlpZWxkQmxvY2tUb0J1ZmZlclF1ZXVlKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPF9DMkJsb2NrUG9vbERhdGE+JiBwb29sRGF0YSk7CisKK307CisKKyNlbmRpZiAvLyBBTkRST0lEX1NUQUdFRlJJR0hUX0MyQkxPQ0tfSU5URVJOQUxfSF8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvaW50ZXJuYWwvQzJQYXJhbUludGVybmFsLmggYi9tZWRpYS9jb2RlYzIvdm5kay9pbnRlcm5hbC9DMlBhcmFtSW50ZXJuYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNGE4ZjI3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW50ZXJuYWwvQzJQYXJhbUludGVybmFsLmgKQEAgLTAsMCArMSwxMTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfU1RBR0VGUklHSFRfQzJQQVJBTV9JTlRFUk5BTF9IXworI2RlZmluZSBBTkRST0lEX1NUQUdFRlJJR0hUX0MyUEFSQU1fSU5URVJOQUxfSF8KKworI2luY2x1ZGUgPEMyUGFyYW0uaD4KKworc3RydWN0IEMyX0hJREUgX0MyUGFyYW1JbnNwZWN0b3IgeworICAgIGlubGluZSBzdGF0aWMgdWludDMyX3QgR2V0T2Zmc2V0KGNvbnN0IEMyRmllbGREZXNjcmlwdG9yICZmZCkgeworICAgICAgICByZXR1cm4gZmQuX21GaWVsZElkLl9tT2Zmc2V0OworICAgIH0KKworICAgIGlubGluZSBzdGF0aWMgdm9pZCBTZXRPZmZzZXQoQzJGaWVsZERlc2NyaXB0b3IgJmZkLCB1aW50MzJfdCBvZmZzZXQpIHsKKyAgICAgICAgZmQuX21GaWVsZElkLl9tT2Zmc2V0ID0gb2Zmc2V0OworICAgIH0KKworICAgIGlubGluZSBzdGF0aWMgdWludDMyX3QgR2V0RW5kT2Zmc2V0KGNvbnN0IEMyRmllbGREZXNjcmlwdG9yICZmZCwgdWludDMyX3QgcGFyYW1TaXplID0gMCkgeworICAgICAgICB1aW50MzJfdCBlbmRPZmZzZXQgPSBmZC5fbUZpZWxkSWQuX21PZmZzZXQgKyBmZC5fbUV4dGVudCAqIGZkLl9tRmllbGRJZC5fbVNpemU7CisgICAgICAgIC8vLyBmb3IgZmxleCBwYXJhbWV0ZXJzIHJldHVybiBwYXJhbVNpemUgaWYgZ2l2ZW4KKyAgICAgICAgcmV0dXJuIGZkLl9tRXh0ZW50ID8gZW5kT2Zmc2V0IDogc3RkOjptYXgoZW5kT2Zmc2V0LCBwYXJhbVNpemUpOworICAgIH0KKworICAgIGlubGluZSBzdGF0aWMgdWludDMyX3QgR2V0U2l6ZShjb25zdCBDMkZpZWxkRGVzY3JpcHRvciAmZmQpIHsKKyAgICAgICAgcmV0dXJuIGZkLl9tRmllbGRJZC5fbVNpemU7CisgICAgfQorCisgICAgaW5saW5lIHN0YXRpYyB1aW50MzJfdCBHZXRJbmRleChjb25zdCBDMlBhcmFtRmllbGQgJnBmKSB7CisgICAgICAgIHJldHVybiBwZi5fbUluZGV4OworICAgIH0KKworICAgIGlubGluZSBzdGF0aWMgdWludDMyX3QgR2V0T2Zmc2V0KGNvbnN0IEMyUGFyYW1GaWVsZCAmcGYpIHsKKyAgICAgICAgcmV0dXJuIHBmLl9tRmllbGRJZC5fbU9mZnNldDsKKyAgICB9CisKKyAgICBpbmxpbmUgc3RhdGljIHVpbnQzMl90IEdldFNpemUoY29uc3QgQzJQYXJhbUZpZWxkICZwZikgeworICAgICAgICByZXR1cm4gcGYuX21GaWVsZElkLl9tU2l6ZTsKKyAgICB9CisKKyAgICBpbmxpbmUgc3RhdGljIHVpbnQzMl90IEdldE9mZnNldChjb25zdCBfQzJGaWVsZElkICZmKSB7CisgICAgICAgIHJldHVybiBmLl9tT2Zmc2V0OworICAgIH0KKworICAgIGlubGluZSBzdGF0aWMgdWludDMyX3QgR2V0U2l6ZShjb25zdCBfQzJGaWVsZElkICZmKSB7CisgICAgICAgIHJldHVybiBmLl9tU2l6ZTsKKyAgICB9CisKKyAgICBpbmxpbmUgc3RhdGljIF9DMkZpZWxkSWQgR2V0RmllbGQoY29uc3QgQzJGaWVsZERlc2NyaXB0b3IgJmZkKSB7CisgICAgICAgIHJldHVybiBmZC5fbUZpZWxkSWQ7CisgICAgfQorCisgICAgaW5saW5lIHN0YXRpYyB1aW50MzJfdCBHZXRBdHRyaWIoY29uc3QgQzJQYXJhbURlc2NyaXB0b3IgJnBkKSB7CisgICAgICAgIHJldHVybiBwZC5fbUF0dHJpYjsKKyAgICB9CisKKyAgICBpbmxpbmUgc3RhdGljIF9DMkZpZWxkSWQgR2V0RmllbGQoY29uc3QgQzJQYXJhbUZpZWxkICZwZikgeworICAgICAgICByZXR1cm4gcGYuX21GaWVsZElkOworICAgIH0KKworICAgIGlubGluZSBzdGF0aWMKKyAgICBDMlBhcmFtRmllbGQgQ3JlYXRlUGFyYW1GaWVsZChDMlBhcmFtOjpJbmRleCBpbmRleCwgdWludDMyX3Qgb2Zmc2V0LCB1aW50MzJfdCBzaXplKSB7CisgICAgICAgIHJldHVybiBDMlBhcmFtRmllbGQoaW5kZXgsIG9mZnNldCwgc2l6ZSk7CisgICAgfQorCisgICAgaW5saW5lIHN0YXRpYworICAgIEMyUGFyYW1GaWVsZCBDcmVhdGVQYXJhbUZpZWxkKEMyUGFyYW06OkluZGV4IGluZGV4LCBfQzJGaWVsZElkIGZpZWxkKSB7CisgICAgICAgIHJldHVybiBDMlBhcmFtRmllbGQoaW5kZXgsIGZpZWxkLl9tT2Zmc2V0LCBmaWVsZC5fbVNpemUpOworICAgIH0KKworICAgIGlubGluZSBzdGF0aWMKKyAgICB2b2lkIFRyaW1QYXJhbShDMlBhcmFtICpwYXJhbSwgdWludDMyX3QgbmV3U2l6ZSkgeworICAgICAgICBpZiAocGFyYW0gJiYgKnBhcmFtICYmIHBhcmFtLT5zaXplKCkgPiBuZXdTaXplICYmIG5ld1NpemUgPj0gc2l6ZW9mKEMyUGFyYW0pKSB7CisgICAgICAgICAgICBwYXJhbS0+X21TaXplID0gbmV3U2l6ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlubGluZSBzdGF0aWMgdm9pZCBBZGROYW1lZFZhbHVlcygKKyAgICAgICAgICAgIEMyRmllbGREZXNjcmlwdG9yICZmZCwgQzJGaWVsZERlc2NyaXB0b3I6Ok5hbWVkVmFsdWVzVHlwZSAmJm5hbWVkVmFsdWVzKSB7CisgICAgICAgIGZkLl9tTmFtZWRWYWx1ZXMgPSBzdGQ6Om1vdmUobmFtZWRWYWx1ZXMpOworICAgIH0KKworICAgIGlubGluZSBzdGF0aWMKKyAgICBDMlN0cnVjdERlc2NyaXB0b3IgQ3JlYXRlU3RydWN0RGVzY3JpcHRvcihDMlBhcmFtOjpDb3JlSW5kZXggaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+ICYmZmllbGRzKSB7CisgICAgICAgIHJldHVybiBDMlN0cnVjdERlc2NyaXB0b3IoaW5kZXgsIHN0ZDo6bW92ZShmaWVsZHMpKTsKKyAgICB9CisKKyAgICBpbmxpbmUgc3RhdGljCisgICAgQzJGaWVsZERlc2NyaXB0b3IgT2Zmc2V0RmllbGREZXNjcmlwdG9yKGNvbnN0IEMyRmllbGREZXNjcmlwdG9yICZmZCwgc2l6ZV90IG9mZnNldCkgeworICAgICAgICByZXR1cm4gQzJGaWVsZERlc2NyaXB0b3IoZmQsIG9mZnNldCk7CisgICAgfQorCisgICAgLy8gZXhwb3NlIGF0dHJpYnV0ZXMKKyAgICB0eXBlZGVmIEMyUGFyYW1EZXNjcmlwdG9yOjphdHRyaWJfdCBhdHRyaWJfdDsKK307CisKKyNlbmRpZiAvLyBBTkRST0lEX1NUQUdFRlJJR0hUX0MyUEFSQU1fSU5URVJOQUxfSF8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvcGxhdGZvcm0vQzJCcUJ1ZmZlci5jcHAgYi9tZWRpYS9jb2RlYzIvdm5kay9wbGF0Zm9ybS9DMkJxQnVmZmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTI2MDM1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvcGxhdGZvcm0vQzJCcUJ1ZmZlci5jcHAKQEAgLTAsMCArMSw0OTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyQnFCdWZmZXIiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxndWkvQnVmZmVyUXVldWVEZWZzLmg+CisjaW5jbHVkZSA8bGlzdD4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bXV0ZXg+CisKKyNpbmNsdWRlIDxDMkFsbG9jYXRvckdyYWxsb2MuaD4KKyNpbmNsdWRlIDxDMkJxQnVmZmVyUHJpdi5oPgorI2luY2x1ZGUgPEMyQmxvY2tJbnRlcm5hbC5oPgorCit1c2luZyA6OmFuZHJvaWQ6OkFud0J1ZmZlcjsKK3VzaW5nIDo6YW5kcm9pZDo6QnVmZmVyUXVldWVEZWZzOjpOVU1fQlVGRkVSX1NMT1RTOwordXNpbmcgOjphbmRyb2lkOjpDMkFsbG9jYXRvckdyYWxsb2M7Cit1c2luZyA6OmFuZHJvaWQ6OkMyQW5kcm9pZE1lbW9yeVVzYWdlOwordXNpbmcgOjphbmRyb2lkOjpGZW5jZTsKK3VzaW5nIDo6YW5kcm9pZDo6R3JhcGhpY0J1ZmZlcjsKK3VzaW5nIDo6YW5kcm9pZDo6SEdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKK3VzaW5nIDo6YW5kcm9pZDo6SUdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKK3VzaW5nIDo6YW5kcm9pZDo6aGlkbF9oYW5kbGU7Cit1c2luZyA6OmFuZHJvaWQ6OnNwOwordXNpbmcgOjphbmRyb2lkOjpzdGF0dXNfdDsKK3VzaW5nIDo6YW5kcm9pZDo6d3A7CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpjb21tb246OlYxXzA6OlBpeGVsRm9ybWF0OworCitzdHJ1Y3QgQzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGEgOiBwdWJsaWMgX0MyQmxvY2tQb29sRGF0YSB7CisKKyAgICBib29sIGhlbGQ7CisgICAgYm9vbCBsb2NhbDsKKyAgICB1aW50MzJfdCBnZW5lcmF0aW9uOworICAgIHVpbnQ2NF90IGJxSWQ7CisgICAgaW50MzJfdCBicVNsb3Q7CisgICAgc3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gaWdicDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXJRdWV1ZUJsb2NrUG9vbDo6SW1wbD4gbG9jYWxQb29sOworCisgICAgdmlydHVhbCB0eXBlX3QgZ2V0VHlwZSgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIFRZUEVfQlVGRkVSUVVFVUU7CisgICAgfQorCisgICAgLy8gQ3JlYXRlIGEgcmVtb3RlIEJsb2NrUG9vbERhdGEuCisgICAgQzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGEoCisgICAgICAgICAgICB1aW50MzJfdCBnZW5lcmF0aW9uLCB1aW50NjRfdCBicUlkLCBpbnQzMl90IGJxU2xvdCwKKyAgICAgICAgICAgIGNvbnN0IHNwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBwcm9kdWNlciA9IG51bGxwdHIpOworCisgICAgLy8gQ3JlYXRlIGEgbG9jYWwgQmxvY2tQb29sRGF0YS4KKyAgICBDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YSgKKyAgICAgICAgICAgIHVpbnQzMl90IGdlbmVyYXRpb24sIHVpbnQ2NF90IGJxSWQsIGludDMyX3QgYnFTbG90LAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyUXVldWVCbG9ja1Bvb2w6OkltcGw+JiBwb29sKTsKKworICAgIHZpcnR1YWwgfkMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhKCkgb3ZlcnJpZGU7CisKK307CisKK2Jvb2wgX0MyQmxvY2tGYWN0b3J5OjpHZXRCdWZmZXJRdWV1ZURhdGEoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxfQzJCbG9ja1Bvb2xEYXRhPiYgZGF0YSwKKyAgICAgICAgdWludDMyX3QqIGdlbmVyYXRpb24sIHVpbnQ2NF90KiBicUlkLCBpbnQzMl90KiBicVNsb3QpIHsKKyAgICBpZiAoZGF0YSAmJiBkYXRhLT5nZXRUeXBlKCkgPT0gX0MyQmxvY2tQb29sRGF0YTo6VFlQRV9CVUZGRVJRVUVVRSkgeworICAgICAgICBpZiAoZ2VuZXJhdGlvbikgeworICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhPiBwb29sRGF0YSA9CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YT4oZGF0YSk7CisgICAgICAgICAgICAqZ2VuZXJhdGlvbiA9IHBvb2xEYXRhLT5nZW5lcmF0aW9uOworICAgICAgICAgICAgaWYgKGJxSWQpIHsKKyAgICAgICAgICAgICAgICAqYnFJZCA9IHBvb2xEYXRhLT5icUlkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGJxU2xvdCkgeworICAgICAgICAgICAgICAgICpicVNsb3QgPSBwb29sRGF0YS0+YnFTbG90OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgX0MyQmxvY2tGYWN0b3J5OjpBc3NpZ25CbG9ja1RvQnVmZmVyUXVldWUoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxfQzJCbG9ja1Bvb2xEYXRhPiYgZGF0YSwKKyAgICAgICAgY29uc3Qgc3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIGlnYnAsCisgICAgICAgIHVpbnQzMl90IGdlbmVyYXRpb24sCisgICAgICAgIHVpbnQ2NF90IGJxSWQsCisgICAgICAgIGludDMyX3QgYnFTbG90LAorICAgICAgICBib29sIGhlbGQpIHsKKyAgICBpZiAoZGF0YSAmJiBkYXRhLT5nZXRUeXBlKCkgPT0gX0MyQmxvY2tQb29sRGF0YTo6VFlQRV9CVUZGRVJRVUVVRSkgeworICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGE+IHBvb2xEYXRhID0KKyAgICAgICAgICAgICAgICBzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGE+KGRhdGEpOworICAgICAgICBwb29sRGF0YS0+aWdicCA9IGlnYnA7CisgICAgICAgIHBvb2xEYXRhLT5nZW5lcmF0aW9uID0gZ2VuZXJhdGlvbjsKKyAgICAgICAgcG9vbERhdGEtPmJxSWQgPSBicUlkOworICAgICAgICBwb29sRGF0YS0+YnFTbG90ID0gYnFTbG90OworICAgICAgICBwb29sRGF0YS0+aGVsZCA9IGhlbGQ7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgX0MyQmxvY2tGYWN0b3J5OjpIb2xkQmxvY2tGcm9tQnVmZmVyUXVldWUoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxfQzJCbG9ja1Bvb2xEYXRhPiYgZGF0YSwKKyAgICAgICAgY29uc3Qgc3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIGlnYnApIHsKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGE+IHBvb2xEYXRhID0KKyAgICAgICAgICAgIHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YT4oZGF0YSk7CisgICAgaWYgKCFwb29sRGF0YS0+bG9jYWwpIHsKKyAgICAgICAgcG9vbERhdGEtPmlnYnAgPSBpZ2JwOworICAgIH0KKyAgICBpZiAocG9vbERhdGEtPmhlbGQpIHsKKyAgICAgICAgcG9vbERhdGEtPmhlbGQgPSB0cnVlOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHBvb2xEYXRhLT5oZWxkID0gdHJ1ZTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBfQzJCbG9ja0ZhY3Rvcnk6OllpZWxkQmxvY2tUb0J1ZmZlclF1ZXVlKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8X0MyQmxvY2tQb29sRGF0YT4mIGRhdGEpIHsKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGE+IHBvb2xEYXRhID0KKyAgICAgICAgICAgIHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YT4oZGF0YSk7CisgICAgaWYgKCFwb29sRGF0YS0+aGVsZCkgeworICAgICAgICBwb29sRGF0YS0+aGVsZCA9IGZhbHNlOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHBvb2xEYXRhLT5oZWxkID0gZmFsc2U7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gX0MyQmxvY2tGYWN0b3J5OjpDcmVhdGVHcmFwaGljQmxvY2soCisgICAgICAgIGNvbnN0IEMySGFuZGxlICpoYW5kbGUpIHsKKyAgICAvLyBUT0RPOiBnZXQgcHJvcGVyIGFsbG9jYXRvcj8gYW5kIG11dGV4PworICAgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8QzJBbGxvY2F0b3JHcmFsbG9jPiBzQWxsb2NhdG9yID0gc3RkOjptYWtlX3VuaXF1ZTxDMkFsbG9jYXRvckdyYWxsb2M+KDApOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0FsbG9jYXRpb24+IGFsbG9jOworICAgIGlmIChDMkFsbG9jYXRvckdyYWxsb2M6OmlzVmFsaWQoaGFuZGxlKSkgeworICAgICAgICB1aW50MzJfdCB3aWR0aDsKKyAgICAgICAgdWludDMyX3QgaGVpZ2h0OworICAgICAgICB1aW50MzJfdCBmb3JtYXQ7CisgICAgICAgIHVpbnQ2NF90IHVzYWdlOworICAgICAgICB1aW50MzJfdCBzdHJpZGU7CisgICAgICAgIHVpbnQzMl90IGdlbmVyYXRpb247CisgICAgICAgIHVpbnQ2NF90IGJxSWQ7CisgICAgICAgIHVpbnQzMl90IGJxU2xvdDsKKyAgICAgICAgYW5kcm9pZDo6X1Vud3JhcE5hdGl2ZUNvZGVjMkdyYWxsb2NNZXRhZGF0YSgKKyAgICAgICAgICAgICAgICBoYW5kbGUsICZ3aWR0aCwgJmhlaWdodCwgJmZvcm1hdCwgJnVzYWdlLCAmc3RyaWRlLCAmZ2VuZXJhdGlvbiwgJmJxSWQsICZicVNsb3QpOworICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBzQWxsb2NhdG9yLT5wcmlvckdyYXBoaWNBbGxvY2F0aW9uKGhhbmRsZSwgJmFsbG9jKTsKKyAgICAgICAgaWYgKGVyciA9PSBDMl9PSykgeworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiBibG9jazsKKyAgICAgICAgICAgIGlmIChicUlkIHx8IGJxU2xvdCkgeworICAgICAgICAgICAgICAgIC8vIEJRQkJQCisgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhPiBwb29sRGF0YSA9CisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhPihnZW5lcmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnFJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQzMl90KWJxU2xvdCk7CisgICAgICAgICAgICAgICAgYmxvY2sgPSBfQzJCbG9ja0ZhY3Rvcnk6OkNyZWF0ZUdyYXBoaWNCbG9jayhhbGxvYywgcG9vbERhdGEpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBibG9jayA9IF9DMkJsb2NrRmFjdG9yeTo6Q3JlYXRlR3JhcGhpY0Jsb2NrKGFsbG9jKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBibG9jazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbnVsbHB0cjsKK30KKworY2xhc3MgQzJCdWZmZXJRdWV1ZUJsb2NrUG9vbDo6SW1wbAorICAgICAgICA6IHB1YmxpYyBzdGQ6OmVuYWJsZV9zaGFyZWRfZnJvbV90aGlzPEMyQnVmZmVyUXVldWVCbG9ja1Bvb2w6OkltcGw+IHsKK3ByaXZhdGU6CisgICAgYzJfc3RhdHVzX3QgZmV0Y2hGcm9tSWdicF9sKAorICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsCisgICAgICAgICAgICB1aW50MzJfdCBoZWlnaHQsCisgICAgICAgICAgICB1aW50MzJfdCBmb3JtYXQsCisgICAgICAgICAgICBDMk1lbW9yeVVzYWdlIHVzYWdlLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiAqYmxvY2sgLyogbm9ubnVsbCAqLykgeworICAgICAgICAvLyBXZSBoYXZlIGFuIElHQlAgbm93LgorICAgICAgICBzcDxGZW5jZT4gZmVuY2UgPSBuZXcgRmVuY2UoKTsKKyAgICAgICAgQzJBbmRyb2lkTWVtb3J5VXNhZ2UgYW5kcm9pZFVzYWdlID0gdXNhZ2U7CisgICAgICAgIHN0YXR1c190IHN0YXR1czsKKyAgICAgICAgUGl4ZWxGb3JtYXQgcGl4ZWxGb3JtYXQgPSBzdGF0aWNfY2FzdDxQaXhlbEZvcm1hdD4oZm9ybWF0KTsKKyAgICAgICAgaW50IHNsb3Q7CisgICAgICAgIEFMT0dWKCJ0cmllcyB0byBkZXF1ZXVlIGJ1ZmZlciIpOworICAgICAgICBSZXR1cm48dm9pZD4gdHJhbnNTdGF0dXMgPSBtUHJvZHVjZXItPmRlcXVldWVCdWZmZXIoCisgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgcGl4ZWxGb3JtYXQsIGFuZHJvaWRVc2FnZS5hc0dyYWxsb2NVc2FnZSgpLCB0cnVlLAorICAgICAgICAgICAgICAgIFsmc3RhdHVzLCAmc2xvdCwgJmZlbmNlXSgKKyAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgdFN0YXR1cywgaW50MzJfdCB0U2xvdCwgaGlkbF9oYW5kbGUgY29uc3QmIHRGZW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZyYW1lRXZlbnRIaXN0b3J5RGVsdGEgY29uc3QmIHRUcykgeworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSB0U3RhdHVzOworICAgICAgICAgICAgICAgICAgICBzbG90ID0gdFNsb3Q7CisgICAgICAgICAgICAgICAgICAgIGlmICghYW5kcm9pZDo6Y29udmVyc2lvbjo6Y29udmVydFRvKGZlbmNlLmdldCgpLCB0RmVuY2UpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID09IGFuZHJvaWQ6Ok5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBhbmRyb2lkOjpCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgKHZvaWQpIHRUczsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgLy8gZGVxdWV1ZUJ1ZmZlciByZXR1cm5zIGZsYWcuCisgICAgICAgIGlmICghdHJhbnNTdGF0dXMuaXNPaygpIHx8IHN0YXR1cyA8IGFuZHJvaWQ6Ok9LKSB7CisgICAgICAgICAgICBBTE9HRCgiY2Fubm90IGRlcXVldWUgYnVmZmVyICVkIiwgc3RhdHVzKTsKKyAgICAgICAgICAgIGlmICh0cmFuc1N0YXR1cy5pc09rKCkgJiYgc3RhdHVzID09IGFuZHJvaWQ6OklOVkFMSURfT1BFUkFUSU9OKSB7CisgICAgICAgICAgICAgIC8vIFRvbyBtYW55IGJ1ZmZlciBkZXF1ZXVlZC4gcmV0cnlpbmcgYWZ0ZXIgc29tZSB0aW1lIGlzIHJlcXVpcmVkLgorICAgICAgICAgICAgICByZXR1cm4gQzJfVElNRURfT1VUOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBBTE9HVigiZGVxdWV1ZWQgYSBidWZmZXIgc3VjY2Vzc2Z1bGx5Iik7CisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCogbmggPSBudWxscHRyOworICAgICAgICBoaWRsX2hhbmRsZSBmZW5jZUhhbmRsZTsKKyAgICAgICAgaWYgKGZlbmNlKSB7CisgICAgICAgICAgICBhbmRyb2lkOjpjb252ZXJzaW9uOjp3cmFwQXMoJmZlbmNlSGFuZGxlLCAmbmgsICpmZW5jZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZlbmNlKSB7CisgICAgICAgICAgICBzdGF0aWMgY29uc3RleHByIGludCBrRmVuY2VXYWl0VGltZU1zID0gMTA7CisKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGZlbmNlLT53YWl0KGtGZW5jZVdhaXRUaW1lTXMpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSAtRVRJTUUpIHsKKyAgICAgICAgICAgICAgICAvLyBmZW5jZSBpcyBub3Qgc2lnbmFsbGVkIHlldC4KKyAgICAgICAgICAgICAgICAodm9pZCltUHJvZHVjZXItPmNhbmNlbEJ1ZmZlcihzbG90LCBmZW5jZUhhbmRsZSkuaXNPaygpOworICAgICAgICAgICAgICAgIHJldHVybiBDMl9USU1FRF9PVVQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IGFuZHJvaWQ6Ok5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgQUxPR0QoImJ1ZmZlciBmZW5jZSB3YWl0IGVycm9yICVkIiwgc3RhdHVzKTsKKyAgICAgICAgICAgICAgICAodm9pZCltUHJvZHVjZXItPmNhbmNlbEJ1ZmZlcihzbG90LCBmZW5jZUhhbmRsZSkuaXNPaygpOworICAgICAgICAgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1SZW5kZXJDYWxsYmFjaykgeworICAgICAgICAgICAgICAgIG5zZWNzX3Qgc2lnbmFsVGltZSA9IGZlbmNlLT5nZXRTaWduYWxUaW1lKCk7CisgICAgICAgICAgICAgICAgaWYgKHNpZ25hbFRpbWUgPj0gMCAmJiBzaWduYWxUaW1lIDwgSU5UNjRfTUFYKSB7CisgICAgICAgICAgICAgICAgICAgIG1SZW5kZXJDYWxsYmFjayhtUHJvZHVjZXJJZCwgc2xvdCwgc2lnbmFsVGltZSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoImdvdCBmZW5jZSBzaWduYWwgdGltZSBvZiAlbGxkIiwgKGxvbmcgbG9uZylzaWduYWxUaW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzcDxHcmFwaGljQnVmZmVyPiAmc2xvdEJ1ZmZlciA9IG1CdWZmZXJzW3Nsb3RdOworICAgICAgICBpZiAoc3RhdHVzICYgSUdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6QlVGRkVSX05FRURTX1JFQUxMT0NBVElPTiB8fCAhc2xvdEJ1ZmZlcikgeworICAgICAgICAgICAgaWYgKCFzbG90QnVmZmVyKSB7CisgICAgICAgICAgICAgICAgc2xvdEJ1ZmZlciA9IG5ldyBHcmFwaGljQnVmZmVyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBOLkIuIFRoaXMgYXNzdW1lcyByZXF1ZXN0QnVmZmVyIyByZXR1cm5zIGFuIGV4aXN0aW5nIGFsbG9jYXRpb24KKyAgICAgICAgICAgIC8vIGluc3RlYWQgb2YgYSBuZXcgYWxsb2NhdGlvbi4KKyAgICAgICAgICAgIFJldHVybjx2b2lkPiB0cmFuc1N0YXR1cyA9IG1Qcm9kdWNlci0+cmVxdWVzdEJ1ZmZlcigKKyAgICAgICAgICAgICAgICAgICAgc2xvdCwKKyAgICAgICAgICAgICAgICAgICAgWyZzdGF0dXMsICZzbG90QnVmZmVyXShpbnQzMl90IHRTdGF0dXMsIEFud0J1ZmZlciBjb25zdCYgdEJ1ZmZlcil7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSB0U3RhdHVzOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFhbmRyb2lkOjpjb252ZXJzaW9uOjpjb252ZXJ0VG8oc2xvdEJ1ZmZlci5nZXQoKSwgdEJ1ZmZlcikgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID09IGFuZHJvaWQ6Ok5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gYW5kcm9pZDo6QkFEX1ZBTFVFOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgaWYgKCF0cmFuc1N0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgICAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT0gYW5kcm9pZDo6Tk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBzbG90QnVmZmVyLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgKHZvaWQpbVByb2R1Y2VyLT5jYW5jZWxCdWZmZXIoc2xvdCwgZmVuY2VIYW5kbGUpLmlzT2soKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChzbG90QnVmZmVyKSB7CisgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKmdyYWxsb2NIYW5kbGUgPSBuYXRpdmVfaGFuZGxlX2Nsb25lKHNsb3RCdWZmZXItPmhhbmRsZSk7CisKKyAgICAgICAgICAgIGlmIChncmFsbG9jSGFuZGxlKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoImJ1ZmZlciB3cmFwcyAlbGx1ICVkIiwgKHVuc2lnbmVkIGxvbmcgbG9uZyltUHJvZHVjZXJJZCwgc2xvdCk7CisgICAgICAgICAgICAgICAgQzJIYW5kbGUgKmMySGFuZGxlID0gYW5kcm9pZDo6V3JhcE5hdGl2ZUNvZGVjMkdyYWxsb2NIYW5kbGUoCisgICAgICAgICAgICAgICAgICAgICAgICBncmFsbG9jSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgc2xvdEJ1ZmZlci0+d2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICBzbG90QnVmZmVyLT5oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICBzbG90QnVmZmVyLT5mb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICBzbG90QnVmZmVyLT51c2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNsb3RCdWZmZXItPnN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNsb3RCdWZmZXItPmdldEdlbmVyYXRpb25OdW1iZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Qcm9kdWNlcklkLCBzbG90KTsKKyAgICAgICAgICAgICAgICBpZiAoYzJIYW5kbGUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gTW92ZWQgZXZlcnl0aGluZyB0byBjMkhhbmRsZS4KKyAgICAgICAgICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoZ3JhbGxvY0hhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNBbGxvY2F0aW9uPiBhbGxvYzsKKyAgICAgICAgICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gbUFsbG9jYXRvci0+cHJpb3JHcmFwaGljQWxsb2NhdGlvbihjMkhhbmRsZSwgJmFsbG9jKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGE+IHBvb2xEYXRhID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsb3RCdWZmZXItPmdldEdlbmVyYXRpb25OdW1iZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Qcm9kdWNlcklkLCBzbG90LCBzaGFyZWRfZnJvbV90aGlzKCkpOworICAgICAgICAgICAgICAgICAgICAqYmxvY2sgPSBfQzJCbG9ja0ZhY3Rvcnk6OkNyZWF0ZUdyYXBoaWNCbG9jayhhbGxvYywgcG9vbERhdGEpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfY2xvc2UoZ3JhbGxvY0hhbmRsZSk7CisgICAgICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoZ3JhbGxvY0hhbmRsZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBCbG9jayB3YXMgbm90IGNyZWF0ZWQuIGNhbGwgcmVxdWVzdEJ1ZmZlciMgYWdhaW4gbmV4dCB0aW1lLgorICAgICAgICAgICAgc2xvdEJ1ZmZlci5jbGVhcigpOworICAgICAgICAgICAgKHZvaWQpbVByb2R1Y2VyLT5jYW5jZWxCdWZmZXIoc2xvdCwgZmVuY2VIYW5kbGUpLmlzT2soKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgIH0KKworcHVibGljOgorICAgIEltcGwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiAmYWxsb2NhdG9yKQorICAgICAgICA6IG1Jbml0KEMyX09LKSwgbVByb2R1Y2VySWQoMCksIG1BbGxvY2F0b3IoYWxsb2NhdG9yKSB7CisgICAgfQorCisgICAgfkltcGwoKSB7CisgICAgICAgIGJvb2wgbm9Jbml0ID0gZmFsc2U7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTlVNX0JVRkZFUl9TTE9UUzsgKytpKSB7CisgICAgICAgICAgICBpZiAoIW5vSW5pdCAmJiBtUHJvZHVjZXIpIHsKKyAgICAgICAgICAgICAgICBSZXR1cm48aW50MzJfdD4gdHJhbnNSZXN1bHQgPQorICAgICAgICAgICAgICAgICAgICAgICAgbVByb2R1Y2VyLT5kZXRhY2hCdWZmZXIoc3RhdGljX2Nhc3Q8aW50MzJfdD4oaSkpOworICAgICAgICAgICAgICAgIG5vSW5pdCA9ICF0cmFuc1Jlc3VsdC5pc09rKCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90Pih0cmFuc1Jlc3VsdCkgPT0gYW5kcm9pZDo6Tk9fSU5JVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1CdWZmZXJzW2ldLmNsZWFyKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjMl9zdGF0dXNfdCBmZXRjaEdyYXBoaWNCbG9jaygKKyAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLAorICAgICAgICAgICAgdWludDMyX3QgaGVpZ2h0LAorICAgICAgICAgICAgdWludDMyX3QgZm9ybWF0LAorICAgICAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gKmJsb2NrIC8qIG5vbm51bGwgKi8pIHsKKyAgICAgICAgYmxvY2stPnJlc2V0KCk7CisgICAgICAgIGlmIChtSW5pdCAhPSBDMl9PSykgeworICAgICAgICAgICAgcmV0dXJuIG1Jbml0OworICAgICAgICB9CisKKyAgICAgICAgc3RhdGljIGludCBrTWF4SWdicFJldHJ5ID0gMjA7IC8vIFRPRE86IHNtYWxsIG51bWJlciBjYW4gY2F1c2UgY3Jhc2ggaW4gcmVsZWFzaW5nLgorICAgICAgICBzdGF0aWMgaW50IGtNYXhJZ2JwUmV0cnlEZWxheVVzID0gMTAwMDA7CisKKyAgICAgICAgaW50IGN1clRyeSA9IDA7CisKKyAgICAgICAgd2hpbGUgKGN1clRyeSsrIDwga01heElnYnBSZXRyeSkgeworICAgICAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisgICAgICAgICAgICAvLyBUT0RPOiByZXR1cm4gQzJfTk9fSU5JVAorICAgICAgICAgICAgaWYgKG1Qcm9kdWNlcklkID09IDApIHsKKyAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQWxsb2NhdGlvbj4gYWxsb2M7CisgICAgICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gbUFsbG9jYXRvci0+bmV3R3JhcGhpY0FsbG9jYXRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHVzYWdlLCAmYWxsb2MpOworICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhPiBwb29sRGF0YSA9CisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgKHVpbnQ2NF90KTAsIH4wLCBzaGFyZWRfZnJvbV90aGlzKCkpOworICAgICAgICAgICAgICAgIC8vIFRPRE86IGNvbmZpZz8KKyAgICAgICAgICAgICAgICAqYmxvY2sgPSBfQzJCbG9ja0ZhY3Rvcnk6OkNyZWF0ZUdyYXBoaWNCbG9jayhhbGxvYywgcG9vbERhdGEpOworICAgICAgICAgICAgICAgIEFMT0dWKCJhbGxvY2F0ZWQgYSBidWZmZXIgc3VjY2Vzc2Z1bGx5Iik7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPSBmZXRjaEZyb21JZ2JwX2wod2lkdGgsIGhlaWdodCwgZm9ybWF0LCB1c2FnZSwgYmxvY2spOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBDMl9USU1FRF9PVVQpIHsKKyAgICAgICAgICAgICAgICBsb2NrLnVubG9jaygpOworICAgICAgICAgICAgICAgIDo6dXNsZWVwKGtNYXhJZ2JwUmV0cnlEZWxheVVzKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEMyX1RJTUVEX09VVDsKKyAgICB9CisKKyAgICB2b2lkIHNldFJlbmRlckNhbGxiYWNrKGNvbnN0IE9uUmVuZGVyQ2FsbGJhY2sgJnJlbmRlckNhbGxiYWNrKSB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisgICAgICAgIG1SZW5kZXJDYWxsYmFjayA9IHJlbmRlckNhbGxiYWNrOworICAgIH0KKworICAgIHZvaWQgY29uZmlndXJlUHJvZHVjZXIoY29uc3Qgc3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gJnByb2R1Y2VyKSB7CisgICAgICAgIGludDMyX3Qgc3RhdHVzID0gYW5kcm9pZDo6T0s7CisgICAgICAgIHVpbnQ2NF90IHByb2R1Y2VySWQgPSAwOworICAgICAgICBpZiAocHJvZHVjZXIpIHsKKyAgICAgICAgICAgIFJldHVybjx2b2lkPiB0cmFuc1N0YXR1cyA9IHByb2R1Y2VyLT5nZXRVbmlxdWVJZCgKKyAgICAgICAgICAgICAgICAgICAgWyZzdGF0dXMsICZwcm9kdWNlcklkXShpbnQzMl90IHRTdGF0dXMsIGludDY0X3QgdFByb2R1Y2VySWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHRTdGF0dXM7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9kdWNlcklkID0gdFByb2R1Y2VySWQ7CisgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgaWYgKCF0cmFuc1N0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgiY29uZmlndXJlUHJvZHVjZXIgLS0gZmFpbGVkIHRvIGNvbm5lY3QgdG8gdGhlIHByb2R1Y2VyIik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisgICAgICAgICAgICBib29sIG5vSW5pdCA9IGZhbHNlOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOVU1fQlVGRkVSX1NMT1RTOyArK2kpIHsKKyAgICAgICAgICAgICAgICBpZiAoIW5vSW5pdCAmJiBtUHJvZHVjZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgUmV0dXJuPGludDMyX3Q+IHRyYW5zUmVzdWx0ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUHJvZHVjZXItPmRldGFjaEJ1ZmZlcihzdGF0aWNfY2FzdDxpbnQzMl90PihpKSk7CisgICAgICAgICAgICAgICAgICAgIG5vSW5pdCA9ICF0cmFuc1Jlc3VsdC5pc09rKCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4odHJhbnNSZXN1bHQpID09IGFuZHJvaWQ6Ok5PX0lOSVQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1CdWZmZXJzW2ldLmNsZWFyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocHJvZHVjZXIgJiYgc3RhdHVzID09IGFuZHJvaWQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgbVByb2R1Y2VyID0gcHJvZHVjZXI7CisgICAgICAgICAgICAgICAgbVByb2R1Y2VySWQgPSBwcm9kdWNlcklkOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtUHJvZHVjZXIgPSBudWxscHRyOworICAgICAgICAgICAgICAgIG1Qcm9kdWNlcklkID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworcHJpdmF0ZToKKyAgICBmcmllbmQgc3RydWN0IEMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhOworCisgICAgdm9pZCBjYW5jZWwodWludDY0X3QgaWdicF9pZCwgaW50MzJfdCBpZ2JwX3Nsb3QpIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICAgICAgaWYgKGlnYnBfaWQgPT0gbVByb2R1Y2VySWQgJiYgbVByb2R1Y2VyKSB7CisgICAgICAgICAgICAodm9pZCltUHJvZHVjZXItPmNhbmNlbEJ1ZmZlcihpZ2JwX3Nsb3QsIG51bGxwdHIpLmlzT2soKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGMyX3N0YXR1c190IG1Jbml0OworICAgIHVpbnQ2NF90IG1Qcm9kdWNlcklkOworICAgIE9uUmVuZGVyQ2FsbGJhY2sgbVJlbmRlckNhbGxiYWNrOworCisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiBtQWxsb2NhdG9yOworCisgICAgc3RkOjptdXRleCBtTXV0ZXg7CisgICAgc3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gbVByb2R1Y2VyOworCisgICAgc3A8R3JhcGhpY0J1ZmZlcj4gbUJ1ZmZlcnNbTlVNX0JVRkZFUl9TTE9UU107Cit9OworCitDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YTo6QzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGEoCisgICAgICAgIHVpbnQzMl90IGdlbmVyYXRpb24sIHVpbnQ2NF90IGJxSWQsIGludDMyX3QgYnFTbG90LAorICAgICAgICBjb25zdCBzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgcHJvZHVjZXIpIDoKKyAgICAgICAgaGVsZChwcm9kdWNlciAmJiBicUlkICE9IDApLCBsb2NhbChmYWxzZSksCisgICAgICAgIGdlbmVyYXRpb24oZ2VuZXJhdGlvbiksIGJxSWQoYnFJZCksIGJxU2xvdChicVNsb3QpLAorICAgICAgICBpZ2JwKHByb2R1Y2VyKSwKKyAgICAgICAgbG9jYWxQb29sKCkgeworfQorCitDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YTo6QzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGEoCisgICAgICAgIHVpbnQzMl90IGdlbmVyYXRpb24sIHVpbnQ2NF90IGJxSWQsIGludDMyX3QgYnFTbG90LAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXJRdWV1ZUJsb2NrUG9vbDo6SW1wbD4mIHBvb2wpIDoKKyAgICAgICAgaGVsZCh0cnVlKSwgbG9jYWwodHJ1ZSksCisgICAgICAgIGdlbmVyYXRpb24oZ2VuZXJhdGlvbiksIGJxSWQoYnFJZCksIGJxU2xvdChicVNsb3QpLAorICAgICAgICBpZ2JwKHBvb2wgPyBwb29sLT5tUHJvZHVjZXIgOiBudWxscHRyKSwKKyAgICAgICAgbG9jYWxQb29sKHBvb2wpIHsKK30KKworQzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGE6On5DMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YSgpIHsKKyAgICBpZiAoIWhlbGQgfHwgYnFJZCA9PSAwKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKGxvY2FsICYmIGxvY2FsUG9vbCkgeworICAgICAgICBsb2NhbFBvb2wtPmNhbmNlbChicUlkLCBicVNsb3QpOworICAgIH0gZWxzZSBpZiAoaWdicCkgeworICAgICAgICBpZ2JwLT5jYW5jZWxCdWZmZXIoYnFTbG90LCBudWxscHRyKTsKKyAgICB9Cit9CisKK0MyQnVmZmVyUXVldWVCbG9ja1Bvb2w6OkMyQnVmZmVyUXVldWVCbG9ja1Bvb2woCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gJmFsbG9jYXRvciwgY29uc3QgbG9jYWxfaWRfdCBsb2NhbElkKQorICAgICAgICA6IG1BbGxvY2F0b3IoYWxsb2NhdG9yKSwgbUxvY2FsSWQobG9jYWxJZCksIG1JbXBsKG5ldyBJbXBsKGFsbG9jYXRvcikpIHt9CisKK0MyQnVmZmVyUXVldWVCbG9ja1Bvb2w6On5DMkJ1ZmZlclF1ZXVlQmxvY2tQb29sKCkge30KKworYzJfc3RhdHVzX3QgQzJCdWZmZXJRdWV1ZUJsb2NrUG9vbDo6ZmV0Y2hHcmFwaGljQmxvY2soCisgICAgICAgIHVpbnQzMl90IHdpZHRoLAorICAgICAgICB1aW50MzJfdCBoZWlnaHQsCisgICAgICAgIHVpbnQzMl90IGZvcm1hdCwKKyAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiAqYmxvY2sgLyogbm9ubnVsbCAqLykgeworICAgIGlmIChtSW1wbCkgeworICAgICAgICByZXR1cm4gbUltcGwtPmZldGNoR3JhcGhpY0Jsb2NrKHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdXNhZ2UsIGJsb2NrKTsKKyAgICB9CisgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKK30KKwordm9pZCBDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sOjpjb25maWd1cmVQcm9kdWNlcihjb25zdCBzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiAmcHJvZHVjZXIpIHsKKyAgICBpZiAobUltcGwpIHsKKyAgICAgICAgbUltcGwtPmNvbmZpZ3VyZVByb2R1Y2VyKHByb2R1Y2VyKTsKKyAgICB9Cit9CisKK3ZvaWQgQzJCdWZmZXJRdWV1ZUJsb2NrUG9vbDo6c2V0UmVuZGVyQ2FsbGJhY2soY29uc3QgT25SZW5kZXJDYWxsYmFjayAmcmVuZGVyQ2FsbGJhY2spIHsKKyAgICBpZiAobUltcGwpIHsKKyAgICAgICAgbUltcGwtPnNldFJlbmRlckNhbGxiYWNrKHJlbmRlckNhbGxiYWNrKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay91dGlsL0MyRGVidWcuY3BwIGIvbWVkaWEvY29kZWMyL3ZuZGsvdXRpbC9DMkRlYnVnLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGFhNzE5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvdXRpbC9DMkRlYnVnLmNwcApAQCAtMCwwICsxLDI3OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxDMlBhcmFtSW50ZXJuYWwuaD4KKyNpbmNsdWRlIDx1dGlsL0MyRGVidWctaW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8dXRpbC9DMkRlYnVnLXBhcmFtLmg+CisjaW5jbHVkZSA8dXRpbC9DMkludGVyZmFjZVV0aWxzLmg+CisKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdwcmludGYuaD4KKwordXNpbmcgYW5kcm9pZDo6YmFzZTo6U3RyaW5nUHJpbnRmOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBhc1N0cmluZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitjb25zdCBjaGFyICphc1N0cmluZyhjMl9zdGF0dXNfdCBpLCBjb25zdCBjaGFyICpkZWYpIHsKKyAgICBzd2l0Y2ggKGkpIHsKKyAgICAgICAgY2FzZSBDMl9PSzogICAgICAgIHJldHVybiAiT0siOworICAgICAgICBjYXNlIEMyX0JBRF9WQUxVRTogcmV0dXJuICJCQURfVkFMVUUiOworICAgICAgICBjYXNlIEMyX0JBRF9JTkRFWDogcmV0dXJuICJCQURfSU5ERVgiOworICAgICAgICBjYXNlIEMyX0NBTk5PVF9ETzogcmV0dXJuICJDQU5OT1RfRE8iOworICAgICAgICBjYXNlIEMyX0RVUExJQ0FURTogcmV0dXJuICJEVVBMSUNBVEUiOworICAgICAgICBjYXNlIEMyX05PVF9GT1VORDogcmV0dXJuICJOT1RfRk9VTkQiOworICAgICAgICBjYXNlIEMyX0JBRF9TVEFURTogcmV0dXJuICJCQURfU1RBVEUiOworICAgICAgICBjYXNlIEMyX0JMT0NLSU5HOiAgcmV0dXJuICJCTE9DS0lORyI7CisgICAgICAgIGNhc2UgQzJfQ0FOQ0VMRUQ6ICByZXR1cm4gIkNBTkNFTEVEIjsKKyAgICAgICAgY2FzZSBDMl9OT19NRU1PUlk6IHJldHVybiAiTk9fTUVNT1JZIjsKKyAgICAgICAgY2FzZSBDMl9SRUZVU0VEOiAgIHJldHVybiAiUkVGVVNFRCI7CisgICAgICAgIGNhc2UgQzJfVElNRURfT1VUOiByZXR1cm4gIlRJTUVEX09VVCI7CisgICAgICAgIGNhc2UgQzJfT01JVFRFRDogICByZXR1cm4gIk9NSVRURUQiOworICAgICAgICBjYXNlIEMyX0NPUlJVUFRFRDogcmV0dXJuICJDT1JSVVBURUQiOworICAgICAgICBjYXNlIEMyX05PX0lOSVQ6ICAgcmV0dXJuICJOT19JTklUIjsKKyAgICAgICAgZGVmYXVsdDogICAgICAgICAgIHJldHVybiBkZWY7CisgICAgfQorfQorCitjb25zdCBjaGFyICphc1N0cmluZyhDMkZpZWxkRGVzY3JpcHRvcjo6dHlwZV90IGksIGNvbnN0IGNoYXIgKmRlZikgeworICAgIHN3aXRjaCAoaSkgeworICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpCTE9COiAgIHJldHVybiAidTgiOworICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpDTlRSMzI6IHJldHVybiAiYzMyIjsKKyAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6Q05UUjY0OiByZXR1cm4gImM2NCI7CisgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OkZMT0FUOiAgcmV0dXJuICJmcCI7CisgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OklOVDMyOiAgcmV0dXJuICJpMzIiOworICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpJTlQ2NDogIHJldHVybiAiaTY0IjsKKyAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6U1RSSU5HOiByZXR1cm4gImNociI7CisgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OlVJTlQzMjogcmV0dXJuICJ1MzIiOworICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpVSU5UNjQ6IHJldHVybiAidTY0IjsKKyAgICAgICAgZGVmYXVsdDogcmV0dXJuIChpICYgQzJGaWVsZERlc2NyaXB0b3I6OlNUUlVDVF9GTEFHKSA/ICJzdHJ1Y3QiIDogZGVmOworICAgIH0KK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEMyUGFyYW1GaWVsZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHN0ZDo6c3RyaW5nIGF0dHJpYlBhcmFtQ29yZUluZGV4KGNvbnN0IEMyUGFyYW06OkNvcmVJbmRleCAmaSkgeworICAgIHJldHVybiBTdHJpbmdQcmludGYoIiVjJWMlMDN4IiwKKyAgICAgICAgICAgIGkuaXNGbGV4aWJsZSgpID8gJ0YnIDogJy0nLAorICAgICAgICAgICAgaS5pc1ZlbmRvcigpID8gJ1YnIDogJy0nLAorICAgICAgICAgICAgaS5jb3JlSW5kZXgoKSk7Cit9CisKK3N0YXRpYyBzdGQ6OnN0cmluZyBhdHRyaWJQYXJhbUluZGV4KAorICAgICAgICBjb25zdCBDMlBhcmFtOjpUeXBlICZpLCBib29sIGFkZFN0cmVhbSwgdW5zaWduZWQgc3RyZWFtSWQpIHsKKyAgICBzdGQ6OnN0cmluZyB2ID0gU3RyaW5nUHJpbnRmKCIlYyVjIiwKKyAgICAgICAgICAgIGkuZm9ySW5wdXQoKSA/ICdJJyA6IGkuZm9yT3V0cHV0KCkgPyAnTycgOiAnLScsCisgICAgICAgICAgICBpLmZvclN0cmVhbSgpID8gJ1MnIDogaS5mb3JQb3J0KCkgPyAnUCcgOiAnRycpOworICAgIGlmIChhZGRTdHJlYW0pIHsKKyAgICAgICAgaWYgKGkuZm9yU3RyZWFtKCkpIHsKKyAgICAgICAgICAgIHYgKz0gU3RyaW5nUHJpbnRmKCIlMDJkIiwgc3RyZWFtSWQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdiArPSAiLS0iOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHYKKyAgICAgICAgICAgICsgU3RyaW5nUHJpbnRmKCIlYyAiLAorICAgICAgICAgICAgICAgICAgICAgICBpLmtpbmQoKSA9PSBDMlBhcmFtOjpTVFJVQ1QgID8gJ1MnIDoKKyAgICAgICAgICAgICAgICAgICAgICAgaS5raW5kKCkgPT0gQzJQYXJhbTo6SU5GTyAgICA/ICdpJyA6CisgICAgICAgICAgICAgICAgICAgICAgIGkua2luZCgpID09IEMyUGFyYW06OlRVTklORyAgPyAndCcgOgorICAgICAgICAgICAgICAgICAgICAgICBpLmtpbmQoKSA9PSBDMlBhcmFtOjpTRVRUSU5HID8gJ3MnIDoKKyAgICAgICAgICAgICAgICAgICAgICAgaS5raW5kKCkgPT0gQzJQYXJhbTo6Tk9ORSAgICA/ICctJyA6ICc/JykKKyAgICAgICAgICAgICsgYXR0cmliUGFyYW1Db3JlSW5kZXgoaSk7Cit9CisKK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlBhcmFtOjpDb3JlSW5kZXggJmkpIHsKKyAgICByZXR1cm4gb3MgPDwgIlBhcmFtOjpDb3JlSW5kZXgoIiA8PCBhdHRyaWJQYXJhbUNvcmVJbmRleChpKSA8PCAiKSI7Cit9CisKK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlBhcmFtOjpUeXBlICZpKSB7CisgICAgcmV0dXJuIG9zIDw8IFN0cmluZ1ByaW50ZigiUGFyYW06OlR5cGUoJTA4eDogIiwgaS50eXBlKCkpCisgICAgICAgICAgICA8PCBhdHRyaWJQYXJhbUluZGV4KGksIGZhbHNlLCAwKSA8PCAiKSI7Cit9CisKK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlBhcmFtOjpJbmRleCAmaSkgeworICAgIHJldHVybiBvcyA8PCBTdHJpbmdQcmludGYoIlBhcmFtOjpJbmRleCglMDh4OiAiLCAodWludDMyX3QpaSkKKyAgICAgICAgICAgIDw8IGF0dHJpYlBhcmFtSW5kZXgoaSwgdHJ1ZSwgaS5zdHJlYW0oKSkgPDwgIikiOworfQorCitzdGF0aWMgc3RkOjpzdHJpbmcgYXR0cmliRmllbGRJZChjb25zdCBfQzJGaWVsZElkICZpKSB7CisgICAgcmV0dXJuIFN0cmluZ1ByaW50ZigiRmllbGQoQCUwMngrJTAyeCkiLAorICAgICAgICAgICAgX0MyUGFyYW1JbnNwZWN0b3I6OkdldE9mZnNldChpKSwKKyAgICAgICAgICAgIF9DMlBhcmFtSW5zcGVjdG9yOjpHZXRTaXplKGkpKTsKK30KKworCitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgX0MyRmllbGRJZCAmaSkgeworICAgIHJldHVybiBvcyA8PCAiPCIgPDwgYXR0cmliRmllbGRJZChpKSA8PCAiPiI7Cit9CisKKworc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyRmllbGREZXNjcmlwdG9yICZpKSB7CisgICAgb3MgPDwgYXR0cmliRmllbGRJZChfQzJQYXJhbUluc3BlY3Rvcjo6R2V0RmllbGQoaSkpIDw8ICIgIjsKKyAgICBpZiAoaS5uYW1lZFZhbHVlcygpLnNpemUoKSkgeworICAgICAgICBvcyA8PCAiZW51bSAiOworICAgIH0KKyAgICByZXR1cm4gb3MgPDwgYXNTdHJpbmcoaS50eXBlKCkpIDw8ICIgIiA8PCBpLm5hbWUoKQorICAgICAgICAgICAgPDwgU3RyaW5nUHJpbnRmKCJbJXp1XSIsIGkuZXh0ZW50KCkpOworfQorCisKK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlBhcmFtRmllbGQgJmkpIHsKKyAgICBvcyA8PCAiPCIgPDwgQzJQYXJhbTo6SW5kZXgoX0MyUGFyYW1JbnNwZWN0b3I6OkdldEluZGV4KGkpKQorICAgICAgICAgICAgPDwgU3RyaW5nUHJpbnRmKCI6OkZpZWxkKEAlMDJ4KyUwMngpPiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0MyUGFyYW1JbnNwZWN0b3I6OkdldE9mZnNldChpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQzJQYXJhbUluc3BlY3Rvcjo6R2V0U2l6ZShpKSk7CisgICAgcmV0dXJuIG9zOworfQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIF9DMkZpZWxkVmFsdWVIZWxwZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RkOjpvc3RyZWFtJiBfQzJGaWVsZFZhbHVlSGVscGVyPGNoYXI+OjpwdXQoc3RkOjpvc3RyZWFtICZvcywgY29uc3QgQzJWYWx1ZTo6UHJpbWl0aXZlICZwKSB7CisgICAgaWYgKGlzcHJpbnQocC5pMzIpKSB7CisgICAgICAgIHJldHVybiBvcyA8PCBTdHJpbmdQcmludGYoIiclYyciLCBwLmkzMik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIG9zIDw8IFN0cmluZ1ByaW50ZigiJ1xceCUwMngnIiwgKHVpbnQzMl90KXAuaTMyKTsKKyAgICB9Cit9CisKK3N0ZDo6b3N0cmVhbSYgX0MyRmllbGRWYWx1ZUhlbHBlcjx1aW50OF90Pjo6cHV0KHN0ZDo6b3N0cmVhbSAmb3MsIGNvbnN0IEMyVmFsdWU6OlByaW1pdGl2ZSAmcCkgeworICAgIHJldHVybiBvcyA8PCBTdHJpbmdQcmludGYoIjB4JTAyeCIsIHAudTMyKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0gJm9zLCBjb25zdCBjMl9jbnRyX3Q8VD4gJnYpIHsKKyAgICByZXR1cm4gb3MgPDwgImN0cigiIDw8IHYucGVla3UoKSA8PCAiKSI7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRSYW5nZTxUPiAmaSkgeworICAgIG9zIDw8ICJSYW5nZSgiOworICAgIF9DMkZpZWxkVmFsdWVIZWxwZXI8VD46OnB1dChvcywgaS5taW4oKSk7CisgICAgb3MgPDwgIi4uIjsKKyAgICBfQzJGaWVsZFZhbHVlSGVscGVyPFQ+OjpwdXQob3MsIGkubWF4KCkpOworICAgIG9zIDw8ICIgKj0gIiA8PCBpLm51bSgpIDw8ICIgLz0gIiA8PCBpLmRlbm9tKCkgPDwgIiArPSAiIDw8IGkuc3RlcCgpIDw8ICIpIjsKKyAgICByZXR1cm4gb3M7Cit9Cit0ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRSYW5nZTxjaGFyPiAmaSk7Cit0ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRSYW5nZTx1aW50OF90PiAmaSk7Cit0ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRSYW5nZTxpbnQzMl90PiAmaSk7Cit0ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRSYW5nZTx1aW50MzJfdD4gJmkpOworLy90ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRSYW5nZTxjMl9jbnRyMzJfdD4gJmkpOwordGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyU3VwcG9ydGVkUmFuZ2U8aW50NjRfdD4gJmkpOwordGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyU3VwcG9ydGVkUmFuZ2U8dWludDY0X3Q+ICZpKTsKKy8vdGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyU3VwcG9ydGVkUmFuZ2U8YzJfY250cjY0X3Q+ICZpKTsKK3RlbXBsYXRlIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlN1cHBvcnRlZFJhbmdlPGZsb2F0PiAmaSk7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRGbGFnczxUPiAmaSkgeworICAgIG9zIDw8ICJGbGFnc1siOworICAgIGlmICghaS5pc0VtcHR5KCkpIHsKKyAgICAgICAgb3MgPDwgIm1pbj0iOworICAgICAgICBfQzJGaWVsZFZhbHVlSGVscGVyPFQ+OjpwdXQob3MsIGkubWluKCkpOworICAgIH0KKyAgICBib29sIGNvbW1hID0gZmFsc2U7CisgICAgZm9yIChjb25zdCBUICZ2IDogaS5mbGFncygpKSB7CisgICAgICAgIGlmIChjb21tYSkgeworICAgICAgICAgICAgb3MgPDwgIiwgIjsKKyAgICAgICAgfQorICAgICAgICBfQzJGaWVsZFZhbHVlSGVscGVyPFQ+OjpwdXQob3MsIHYpOworICAgICAgICBjb21tYSA9IHRydWU7CisgICAgfQorICAgIG9zIDw8ICJdIjsKKyAgICByZXR1cm4gb3M7Cit9Cit0ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRGbGFnczxjaGFyPiAmaSk7Cit0ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRGbGFnczx1aW50OF90PiAmaSk7Cit0ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRGbGFnczxpbnQzMl90PiAmaSk7Cit0ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRGbGFnczx1aW50MzJfdD4gJmkpOworLy90ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRGbGFnczxjMl9jbnRyMzJfdD4gJmkpOwordGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyU3VwcG9ydGVkRmxhZ3M8aW50NjRfdD4gJmkpOwordGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyU3VwcG9ydGVkRmxhZ3M8dWludDY0X3Q+ICZpKTsKKy8vdGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyU3VwcG9ydGVkRmxhZ3M8YzJfY250cjY0X3Q+ICZpKTsKK3RlbXBsYXRlIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlN1cHBvcnRlZEZsYWdzPGZsb2F0PiAmaSk7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRWYWx1ZVNldDxUPiAmaSkgeworICAgIG9zIDw8ICJWYWx1ZXNbIjsKKyAgICBib29sIGNvbW1hID0gZmFsc2U7CisgICAgZm9yIChjb25zdCBUICZ2IDogaS52YWx1ZXMoKSkgeworICAgICAgICBpZiAoY29tbWEpIHsKKyAgICAgICAgICAgIG9zIDw8ICIsICI7CisgICAgICAgIH0KKyAgICAgICAgX0MyRmllbGRWYWx1ZUhlbHBlcjxUPjo6cHV0KG9zLCB2KTsKKyAgICAgICAgY29tbWEgPSB0cnVlOworICAgIH0KKyAgICBvcyA8PCAiXSI7CisgICAgcmV0dXJuIG9zOworfQordGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyU3VwcG9ydGVkVmFsdWVTZXQ8Y2hhcj4gJmkpOwordGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyU3VwcG9ydGVkVmFsdWVTZXQ8dWludDhfdD4gJmkpOwordGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyU3VwcG9ydGVkVmFsdWVTZXQ8aW50MzJfdD4gJmkpOwordGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyU3VwcG9ydGVkVmFsdWVTZXQ8dWludDMyX3Q+ICZpKTsKKy8vdGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyU3VwcG9ydGVkVmFsdWVTZXQ8YzJfY250cjMyX3Q+ICZpKTsKK3RlbXBsYXRlIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlN1cHBvcnRlZFZhbHVlU2V0PGludDY0X3Q+ICZpKTsKK3RlbXBsYXRlIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlN1cHBvcnRlZFZhbHVlU2V0PHVpbnQ2NF90PiAmaSk7CisvL3RlbXBsYXRlIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlN1cHBvcnRlZFZhbHVlU2V0PGMyX2NudHI2NF90PiAmaSk7Cit0ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRWYWx1ZVNldDxmbG9hdD4gJmkpOworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD46OkltcGwgeworICAgIEltcGwoY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyAmdmFsdWVzKTsKKworcHJpdmF0ZToKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9DMkZpZWxkVmFsdWVIZWxwZXI8VD46OlZhbHVlVHlwZSBWYWx1ZVR5cGU7CisgICAgQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6dHlwZV90IF9tVHlwZTsKKyAgICBDMlN1cHBvcnRlZFJhbmdlPFZhbHVlVHlwZT4gX21SYW5nZTsKKyAgICBDMlN1cHBvcnRlZFZhbHVlU2V0PFZhbHVlVHlwZT4gX21WYWx1ZXM7CisgICAgQzJTdXBwb3J0ZWRGbGFnczxWYWx1ZVR5cGU+IF9tRmxhZ3M7CisKK3B1YmxpYzoKKy8vICAgIGZyaWVuZCBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwgPFQ+KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD46OkltcGwgJmkpOworLy8gICAgZnJpZW5kIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBJbXBsICZpKTsKKyAgICBzdGQ6Om9zdHJlYW0mIHN0cmVhbU91dChzdGQ6Om9zdHJlYW0mIG9zKSBjb25zdDsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdGQ6Om9zdHJlYW0mIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD46OkltcGw6OnN0cmVhbU91dChzdGQ6Om9zdHJlYW0mIG9zKSBjb25zdCB7CisgICAgaWYgKF9tVHlwZSA9PSBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjpSQU5HRSkgeworICAgICAgICBvcyA8PCBfbVJhbmdlOworICAgIH0gZWxzZSBpZiAoX21UeXBlID09IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OlZBTFVFUykgeworICAgICAgICBvcyA8PCBfbVZhbHVlczsKKyAgICB9IGVsc2UgaWYgKF9tVHlwZSA9PSBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjpGTEFHUykgeworICAgICAgICBvcyA8PCBfbUZsYWdzOworICAgIH0gZWxzZSB7CisgICAgICAgIG9zIDw8ICJVbmtub3duIEZTViB0eXBlOiAiIDw8ICh1aW50MzJfdClfbVR5cGU7CisgICAgfQorICAgIHJldHVybiBvczsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+ICZpKSB7CisgICAgcmV0dXJuIGkuX21JbXBsLT5zdHJlYW1PdXQob3MpOworfQordGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8Y2hhcj4gJmkpOwordGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8dWludDhfdD4gJmkpOwordGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8aW50MzJfdD4gJmkpOwordGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8dWludDMyX3Q+ICZpKTsKKy8vdGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8YzJfY250cjMyX3Q+ICZpKTsKK3RlbXBsYXRlIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPGludDY0X3Q+ICZpKTsKK3RlbXBsYXRlIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPHVpbnQ2NF90PiAmaSk7CisvL3RlbXBsYXRlIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPGMyX2NudHI2NF90PiAmaSk7Cit0ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxmbG9hdD4gJmkpOworCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay91dGlsL0MySW50ZXJmYWNlSGVscGVyLmNwcCBiL21lZGlhL2NvZGVjMi92bmRrL3V0aWwvQzJJbnRlcmZhY2VIZWxwZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0NDdmYmUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay91dGlsL0MySW50ZXJmYWNlSGVscGVyLmNwcApAQCAtMCwwICsxLDg0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxDMkRlYnVnLmg+CisjaW5jbHVkZSA8QzJQYXJhbUludGVybmFsLmg+CisjaW5jbHVkZSA8dXRpbC9DMkludGVyZmFjZUhlbHBlci5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3ByaW50Zi5oPgorCit1c2luZyA6OmFuZHJvaWQ6OmJhc2U6OlN0cmluZ1ByaW50ZjsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFJlZmxlY3RvckhlbHBlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordm9pZCBDMlJlZmxlY3RvckhlbHBlcjo6YWRkU3RydWN0RGVzY3JpcHRvcnMoCisgICAgICAgIHN0ZDo6dmVjdG9yPEMyU3RydWN0RGVzY3JpcHRvcj4gJnN0cnVjdHMsIF9UdXBsZTw+ICopIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhfbU11dGV4KTsKKyAgICBmb3IgKEMyU3RydWN0RGVzY3JpcHRvciAmc3RydWt0IDogc3RydWN0cykgeworICAgICAgICAvLyBUT0RPOiBjaGVjayBpZiBzdHJ1Y3R1cmUgZGVzY3JpcHRpb25zIGNvbmZsaWN0IHdpdGggZXhpc3Rpbmcgb25lcworICAgICAgICBhZGRTdHJ1Y3REZXNjcmlwdG9yKHN0ZDo6bW92ZShzdHJ1a3QpKTsKKyAgICB9Cit9CisKK3N0ZDo6dW5pcXVlX3B0cjxDMlN0cnVjdERlc2NyaXB0b3I+CitDMlJlZmxlY3RvckhlbHBlcjo6ZGVzY3JpYmUoQzJQYXJhbTo6Q29yZUluZGV4IHBhcmFtSW5kZXgpIGNvbnN0IHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhfbU11dGV4KTsKKyAgICBhdXRvIGl0ID0gX21TdHJ1Y3RzLmZpbmQocGFyYW1JbmRleCk7CisgICAgaWYgKGl0ID09IF9tU3RydWN0cy5lbmQoKSkgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gc3RkOjptYWtlX3VuaXF1ZTxDMlN0cnVjdERlc2NyaXB0b3I+KGl0LT5zZWNvbmQpOworICAgIH0KK307CisKK3ZvaWQgQzJSZWZsZWN0b3JIZWxwZXI6OmFkZFN0cnVjdERlc2NyaXB0b3IoQzJTdHJ1Y3REZXNjcmlwdG9yICYmc3RydWt0KSB7CisgICAgaWYgKF9tU3RydWN0cy5maW5kKHN0cnVrdC5jb3JlSW5kZXgoKSkgIT0gX21TdHJ1Y3RzLmVuZCgpKSB7CisgICAgICAgIC8vIGFscmVhZHkgYWRkZWQKKyAgICAgICAgLy8gVE9ETzogdmFsaWRhdGUgdGhhdCBkZXNjcmlwdG9yIG1hdGNoZXMgc3RvcmVkIGRlc2NyaXB0b3IKKyAgICB9CisgICAgLy8gdmFsaWRhdGUgdGhhdCBhbGwgc3RydWN0IGZpZWxkcyBhcmUga25vd24gdG8gdGhpcyByZWZsZWN0b3IKKyAgICBmb3IgKGNvbnN0IEMyRmllbGREZXNjcmlwdG9yICZmZCA6IHN0cnVrdCkgeworICAgICAgICBpZiAoZmQudHlwZSgpICYgQzJGaWVsZERlc2NyaXB0b3I6OlNUUlVDVF9GTEFHKSB7CisgICAgICAgICAgICBDMlBhcmFtOjpDb3JlSW5kZXggY29yZUluZGV4ID0gZmQudHlwZSgpICZ+IEMyRmllbGREZXNjcmlwdG9yOjpTVFJVQ1RfRkxBRzsKKyAgICAgICAgICAgIGlmIChfbVN0cnVjdHMuZmluZChjb3JlSW5kZXgpID09IF9tU3RydWN0cy5lbmQoKSkgeworICAgICAgICAgICAgICAgIEMyX0xPRyhJTkZPKSA8PCAibWlzc2luZyBzdHJ1Y3QgZGVzY3JpcHRvciAjIiA8PCBjb3JlSW5kZXggPDwgIiBmb3IgZmllbGQgIgorICAgICAgICAgICAgICAgICAgICAgICAgPDwgZmQubmFtZSgpIDw8ICIgb2Ygc3RydWN0ICMiIDw8IHN0cnVrdC5jb3JlSW5kZXgoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBfbVN0cnVjdHMuZW1wbGFjZShzdHJ1a3QuY29yZUluZGV4KCksIHN0cnVrdCk7Cit9CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQYXJhbUhlbHBlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK2NsYXNzIEMySW50ZXJmYWNlSGVscGVyOjpQYXJhbUhlbHBlcjo6SW1wbCB7CitwdWJsaWM6CisgICAgSW1wbChQYXJhbVJlZiBwYXJhbSwgQzJTdHJpbmdMaXRlcmFsIG5hbWUsIEMyU3RydWN0RGVzY3JpcHRvciAmJnN0cnVrdCkKKyAgICAgICAgOiBtUGFyYW0ocGFyYW0pLCBtTmFtZShuYW1lKSwgX21TdHJ1Y3Qoc3RydWt0KSB7IH0KKworICAgIEltcGwoSW1wbCYmKSA9IGRlZmF1bHQ7CisKKyAgICB2b2lkIGFkZERvd25EZXBlbmRlbmN5KEMyUGFyYW06OkluZGV4IGluZGV4KSB7CisgICAgICAgIG1Eb3duRGVwZW5kZW5jaWVzLnB1c2hfYmFjayhpbmRleCk7CisgICAgfQorCisgICAgQzJJbnRlcmZhY2VIZWxwZXI6OlBhcmFtSGVscGVyOjphdHRyaWJfdCYgYXR0cmliKCkgeworICAgICAgICByZXR1cm4gbUF0dHJpYjsKKyAgICB9CisKKyAgICB2b2lkIGJ1aWxkKCkgeworICAgICAgICAvLyBtb3ZlIGRlcGVuZGVuY2llcyBpbnRvIGRlc2NyaXB0b3IKKyAgICAgICAgbURlc2NyaXB0b3IgPSBzdGQ6Om1ha2Vfc2hhcmVkPEMyUGFyYW1EZXNjcmlwdG9yPigKKyAgICAgICAgICAgICAgICBpbmRleCgpLCAoQzJQYXJhbURlc2NyaXB0b3I6OmF0dHJpYl90KW1BdHRyaWIsCisgICAgICAgICAgICAgICAgc3RkOjptb3ZlKG1OYW1lKSwgc3RkOjptb3ZlKG1EZXBlbmRlbmNpZXMpKTsKKyAgICB9CisKKyAgICB2b2lkIGNyZWF0ZUZpZWxkc0FuZFN1cHBvcnRlZFZhbHVlcyhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gJnJlZmxlY3RvcikgeworICAgICAgICBmb3IgKGNvbnN0IEMyRmllbGRVdGlsczo6SW5mbyAmZiA6CisgICAgICAgICAgICAgICAgQzJGaWVsZFV0aWxzOjplbnVtZXJhdGVGaWVsZHMoKm1EZWZhdWx0VmFsdWUsIHJlZmxlY3RvcikpIHsKKyAgICAgICAgICAgIGlmICghZi5pc0FyaXRobWV0aWMoKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM+IGZzdlBvaW50ZXI7CisKKyAgICAgICAgICAgIC8vIGNyZWF0ZSBhIGJyZWFrYWJsZSBzdHJ1Y3R1cmUKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzIGZzdjsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGYudHlwZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OklOVDMyOiAgZnN2ID0gQzJTdXBwb3J0ZWRSYW5nZTxpbnQzMl90Pjo6QW55KCk7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpVSU5UMzI6IGZzdiA9IEMyU3VwcG9ydGVkUmFuZ2U8dWludDMyX3Q+OjpBbnkoKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OklOVDY0OiAgZnN2ID0gQzJTdXBwb3J0ZWRSYW5nZTxpbnQ2NF90Pjo6QW55KCk7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpVSU5UNjQ6IGZzdiA9IEMyU3VwcG9ydGVkUmFuZ2U8dWludDY0X3Q+OjpBbnkoKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OkZMT0FUOiAgZnN2ID0gQzJTdXBwb3J0ZWRSYW5nZTxmbG9hdD46OkFueSgpOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6QkxPQjogICBmc3YgPSBDMlN1cHBvcnRlZFJhbmdlPHVpbnQ4X3Q+OjpBbnkoKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OlNUUklORzogZnN2ID0gQzJTdXBwb3J0ZWRSYW5nZTxjaGFyPjo6QW55KCk7IGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBicmVhayBvdXQgb2YgZG8ge30gd2hpbGUKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZnN2UG9pbnRlciA9IHN0ZDo6bWFrZV91bmlxdWU8QzJGaWVsZFN1cHBvcnRlZFZhbHVlcz4oZnN2KTsKKyAgICAgICAgICAgIH0gd2hpbGUgKGZhbHNlKTsKKworICAgICAgICAgICAgbUZpZWxkcy5lbXBsYWNlX2hpbnQoCisgICAgICAgICAgICAgICAgICAgIG1GaWVsZHMuZW5kKCksCisgICAgICAgICAgICAgICAgICAgIF9DMkZpZWxkSWQoZi5vZmZzZXQoKSwgZi5zaXplKCkpLAorICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEZpZWxkSGVscGVyPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUGFyYW0sIF9DMkZpZWxkSWQoZi5vZmZzZXQoKSwgZi5zaXplKCkpLCBzdGQ6Om1vdmUoZnN2UG9pbnRlcikpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbmRzIGEgZmllbGQgZGVzY3JpcHRvci4KKyAgICAgKi8KKyAgICBzdGQ6OnNoYXJlZF9wdHI8RmllbGRIZWxwZXI+IGZpbmRGaWVsZChzaXplX3QgYmFzZU9mZnMsIHNpemVfdCBiYXNlU2l6ZSkgY29uc3QgeworICAgICAgICBhdXRvIGl0ID0gbUZpZWxkcy5maW5kKF9DMkZpZWxkSWQoYmFzZU9mZnMsIGJhc2VTaXplKSk7CisgICAgICAgIGlmIChpdCA9PSBtRmllbGRzLmVuZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaXQtPnNlY29uZDsKKyAgICB9CisKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxQYXJhbVJlZj4gZ2V0RGVwZW5kZW5jaWVzQXNSZWZzKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbURlcGVuZGVuY2llc0FzUmVmczsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJQYXJhbURlc2NyaXB0b3I+IGdldERlc2NyaXB0b3IoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtRGVzY3JpcHRvcjsKKyAgICB9CisKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gZ2V0RG93bkRlcGVuZGVuY2llcygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1Eb3duRGVwZW5kZW5jaWVzOworICAgIH0KKworICAgIEMyUGFyYW06OkluZGV4IGluZGV4KCkgY29uc3QgeworICAgICAgICBpZiAoIW1EZWZhdWx0VmFsdWUpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXMgbWlzc2luZyBkZWZhdWx0IHZhbHVlXG4iLCBtTmFtZS5jX3N0cigpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbURlZmF1bHRWYWx1ZS0+aW5kZXgoKTsKKyAgICB9CisKKyAgICBDMlN0cmluZyBuYW1lKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbU5hbWU7CisgICAgfQorCisgICAgY29uc3QgUGFyYW1SZWYgcmVmKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVBhcmFtOworICAgIH0KKworICAgIEMyU3RydWN0RGVzY3JpcHRvciByZXRyaWV2ZVN0cnVjdERlc2NyaXB0b3IoKSB7CisgICAgICAgIHJldHVybiBzdGQ6Om1vdmUoX21TdHJ1Y3QpOworICAgIH0KKworICAgIHZvaWQgc2V0RGVmYXVsdFZhbHVlKHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtPiBkZWZhdWx0XykgeworICAgICAgICBtRGVmYXVsdFZhbHVlID0gZGVmYXVsdF87CisgICAgfQorCisgICAgdm9pZCBzZXREZXBlbmRlbmNpZXMoc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+IGluZGljZXMsIHN0ZDo6dmVjdG9yPFBhcmFtUmVmPiByZWZzKSB7CisgICAgICAgIG1EZXBlbmRlbmNpZXMgPSBpbmRpY2VzOworICAgICAgICBtRGVwZW5kZW5jaWVzQXNSZWZzID0gcmVmczsKKyAgICB9CisKKyAgICB2b2lkIHNldEZpZWxkcyhzdGQ6OnZlY3RvcjxDMlBhcmFtRmllbGRWYWx1ZXM+ICYmZmllbGRzKSB7CisgICAgICAgIC8vIGRvIG5vdCBhbGxvdyBhZGRpbmcgZmllbGRzIG11bHRpcGxlIHRpbWVzLCBvciB0byBjb25zdCB2YWx1ZXMKKyAgICAgICAgaWYgKCFtRmllbGRzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIEMyX0xPRyhGQVRBTCkgPDwgIlRyeWluZyB0byBhZGQgZmllbGRzIHRvIHBhcmFtICIgPDwgbU5hbWUgPDwgIiBtdWx0aXBsZSB0aW1lcyI7CisgICAgICAgIH0gZWxzZSBpZiAobUF0dHJpYiAmIGF0dHJpYl90OjpJU19DT05TVCkgeworICAgICAgICAgICAgQzJfTE9HKEZBVEFMKSA8PCAiVHJ5aW5nIHRvIGFkZCBmaWVsZHMgdG8gY29uc3QgcGFyYW0gIiA8PCBtTmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoQzJQYXJhbUZpZWxkVmFsdWVzICZwZnYgOiBmaWVsZHMpIHsKKyAgICAgICAgICAgIG1GaWVsZHMuZW1wbGFjZV9oaW50KAorICAgICAgICAgICAgICAgICAgICBtRmllbGRzLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAvLyBfQzJGaWVsZElkIGNvbnN0cnVjdG9yCisgICAgICAgICAgICAgICAgICAgIF9DMlBhcmFtSW5zcGVjdG9yOjpHZXRGaWVsZChwZnYucGFyYW1PckZpZWxkKSwKKyAgICAgICAgICAgICAgICAgICAgLy8gRmllbGQgY29uc3RydWN0b3IKKyAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxGaWVsZEhlbHBlcj4obVBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQzJQYXJhbUluc3BlY3Rvcjo6R2V0RmllbGQocGZ2LnBhcmFtT3JGaWVsZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShwZnYudmFsdWVzKSkpOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBzZXRHZXR0ZXIoc3RkOjpmdW5jdGlvbjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbT4oYm9vbCk+IGdldHRlcikgeworICAgICAgICBtR2V0dGVyID0gZ2V0dGVyOworICAgIH0KKworICAgIHZvaWQgc2V0U2V0dGVyKHN0ZDo6ZnVuY3Rpb248QzJSKGNvbnN0IEMyUGFyYW0gKiwgYm9vbCwgYm9vbCAqLCBGYWN0b3J5ICYpPiBzZXR0ZXIpIHsKKyAgICAgICAgbVNldHRlciA9IHNldHRlcjsKKyAgICB9CisKKyAgICBjMl9zdGF0dXNfdCB0cnlTZXQoCisgICAgICAgICAgICBjb25zdCBDMlBhcmFtICp2YWx1ZSwgYm9vbCBtYXlCbG9jaywgYm9vbCAqY2hhbmdlZCwgRmFjdG9yeSAmZiwKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiogY29uc3QgZmFpbHVyZXMpIHsKKyAgICAgICAgQzJSIHJlc3VsdCA9IG1TZXR0ZXIodmFsdWUsIG1heUJsb2NrLCBjaGFuZ2VkLCBmKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdC5yZXRyaWV2ZUZhaWx1cmVzKGZhaWx1cmVzKTsKKyAgICB9CisKKyAgICBjMl9zdGF0dXNfdCB2YWxpZGF0ZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gJnJlZmxlY3RvcikgeworICAgICAgICBpZiAoIW1TZXR0ZXIgJiYgbUZpZWxkcy5lbXB0eSgpKSB7CisgICAgICAgICAgICBDMl9MT0coV0FSTklORykgPDwgIlBhcmFtICIgPDwgbU5hbWUgPDwgIiBoYXMgbm8gc2V0dGVyLCBtYWtpbmcgaXQgY29uc3QiOworICAgICAgICAgICAgLy8gZGVwZW5kZW5jaWVzIGFyZSBlbXB0eSBpbiB0aGlzIGNhc2UKKyAgICAgICAgICAgIG1BdHRyaWIgfD0gYXR0cmliX3Q6OklTX0NPTlNUOworICAgICAgICB9IGVsc2UgaWYgKCFtU2V0dGVyKSB7CisgICAgICAgICAgICBDMl9MT0coRkFUQUwpIDw8ICJQYXJhbSAiIDw8IG1OYW1lIDw8ICIgaGFzIG5vIHNldHRlciI7CisgICAgICAgIH0KKworICAgICAgICBpZiAobUF0dHJpYiAmIGF0dHJpYl90OjpJU19DT05TVCkgeworICAgICAgICAgICAgY3JlYXRlRmllbGRzQW5kU3VwcG9ydGVkVmFsdWVzKHJlZmxlY3Rvcik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBUT0RPOiB1cGRhdGUgZGVmYXVsdCBiYXNlZCBvbiBzZXR0ZXIgYW5kIHZlcmlmeSB0aGF0IEZTViBjb3ZlcnMgdGhlIHZhbHVlcworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1GaWVsZHMuZW1wdHkoKSkgeworICAgICAgICAgICAgQzJfTE9HKEZBVEFMKSA8PCAiUGFyYW0gIiA8PCBtTmFtZSA8PCAiIGhhcyBubyBmaWVsZHMiOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtPiB2YWx1ZSgpIHsKKyAgICAgICAgcmV0dXJuIG1QYXJhbS5nZXQoKTsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJQYXJhbT4gdmFsdWUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtUGFyYW0uZ2V0KCk7CisgICAgfQorCitwcml2YXRlOgorICAgIHR5cGVkZWYgX0MyUGFyYW1JbnNwZWN0b3I6OmF0dHJpYl90IGF0dHJpYl90OworICAgIFBhcmFtUmVmIG1QYXJhbTsKKyAgICBDMlN0cmluZyBtTmFtZTsKKyAgICBDMlN0cnVjdERlc2NyaXB0b3IgX21TdHJ1Y3Q7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW0+IG1EZWZhdWx0VmFsdWU7CisgICAgYXR0cmliX3QgbUF0dHJpYjsKKyAgICBzdGQ6OmZ1bmN0aW9uPEMyUihjb25zdCBDMlBhcmFtICosIGJvb2wsIGJvb2wgKiwgRmFjdG9yeSAmKT4gbVNldHRlcjsKKyAgICBzdGQ6OmZ1bmN0aW9uPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtPihib29sKT4gbUdldHRlcjsKKyAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gbURlcGVuZGVuY2llczsKKyAgICBzdGQ6OnZlY3RvcjxQYXJhbVJlZj4gbURlcGVuZGVuY2llc0FzUmVmczsKKyAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gbURvd25EZXBlbmRlbmNpZXM7IC8vIFRPRE86IHRoaXMgZG9lcyBub3Qgd29yayBmb3Igc3RyZWFtIGRlcGVuZGVuY2llcworICAgIHN0ZDo6bWFwPF9DMkZpZWxkSWQsIHN0ZDo6c2hhcmVkX3B0cjxGaWVsZEhlbHBlcj4+IG1GaWVsZHM7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPiBtRGVzY3JpcHRvcjsKK307CisKK0MySW50ZXJmYWNlSGVscGVyOjpQYXJhbUhlbHBlcjo6UGFyYW1IZWxwZXIoCisgICAgICAgIFBhcmFtUmVmIHBhcmFtLCBDMlN0cmluZ0xpdGVyYWwgbmFtZSwgQzJTdHJ1Y3REZXNjcmlwdG9yICYmc3RydWt0KQorICAgIDogbUltcGwoc3RkOjptYWtlX3VuaXF1ZTxDMkludGVyZmFjZUhlbHBlcjo6UGFyYW1IZWxwZXI6OkltcGw+KAorICAgICAgICAgICAgcGFyYW0sIG5hbWUsIHN0ZDo6bW92ZShzdHJ1a3QpKSkgeyB9CisKK0MySW50ZXJmYWNlSGVscGVyOjpQYXJhbUhlbHBlcjo6UGFyYW1IZWxwZXIoQzJJbnRlcmZhY2VIZWxwZXI6OlBhcmFtSGVscGVyICYmKSA9IGRlZmF1bHQ7CisKK0MySW50ZXJmYWNlSGVscGVyOjpQYXJhbUhlbHBlcjo6flBhcmFtSGVscGVyKCkgPSBkZWZhdWx0OworCit2b2lkIEMySW50ZXJmYWNlSGVscGVyOjpQYXJhbUhlbHBlcjo6YWRkRG93bkRlcGVuZGVuY3koQzJQYXJhbTo6SW5kZXggaW5kZXgpIHsKKyAgICByZXR1cm4gbUltcGwtPmFkZERvd25EZXBlbmRlbmN5KGluZGV4KTsKK30KKworQzJJbnRlcmZhY2VIZWxwZXI6OlBhcmFtSGVscGVyOjphdHRyaWJfdCYgQzJJbnRlcmZhY2VIZWxwZXI6OlBhcmFtSGVscGVyOjphdHRyaWIoKSB7CisgICAgcmV0dXJuIG1JbXBsLT5hdHRyaWIoKTsKK30KKworc3RkOjpzaGFyZWRfcHRyPEMySW50ZXJmYWNlSGVscGVyOjpQYXJhbUhlbHBlcj4gQzJJbnRlcmZhY2VIZWxwZXI6OlBhcmFtSGVscGVyOjpidWlsZCgpIHsKKyAgICBtSW1wbC0+YnVpbGQoKTsKKyAgICByZXR1cm4gc3RkOjptYWtlX3NoYXJlZDxDMkludGVyZmFjZUhlbHBlcjo6UGFyYW1IZWxwZXI+KHN0ZDo6bW92ZSgqdGhpcykpOworfQorCitzdGQ6OnNoYXJlZF9wdHI8QzJJbnRlcmZhY2VIZWxwZXI6OkZpZWxkSGVscGVyPgorQzJJbnRlcmZhY2VIZWxwZXI6OlBhcmFtSGVscGVyOjpmaW5kRmllbGQoc2l6ZV90IGJhc2VPZmZzLCBzaXplX3QgYmFzZVNpemUpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwtPmZpbmRGaWVsZChiYXNlT2ZmcywgYmFzZVNpemUpOworfQorCitjb25zdCBzdGQ6OnZlY3RvcjxDMkludGVyZmFjZUhlbHBlcjo6UGFyYW1SZWY+CitDMkludGVyZmFjZUhlbHBlcjo6UGFyYW1IZWxwZXI6OmdldERlcGVuZGVuY2llc0FzUmVmcygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwtPmdldERlcGVuZGVuY2llc0FzUmVmcygpOworfQorCitzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJQYXJhbURlc2NyaXB0b3I+CitDMkludGVyZmFjZUhlbHBlcjo6UGFyYW1IZWxwZXI6OmdldERlc2NyaXB0b3IoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbXBsLT5nZXREZXNjcmlwdG9yKCk7Cit9CisKK2NvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiBDMkludGVyZmFjZUhlbHBlcjo6UGFyYW1IZWxwZXI6OmdldERvd25EZXBlbmRlbmNpZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbXBsLT5nZXREb3duRGVwZW5kZW5jaWVzKCk7Cit9CisKK0MyUGFyYW06OkluZGV4IEMySW50ZXJmYWNlSGVscGVyOjpQYXJhbUhlbHBlcjo6aW5kZXgoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbXBsLT5pbmRleCgpOworfQorCitDMlN0cmluZyBDMkludGVyZmFjZUhlbHBlcjo6UGFyYW1IZWxwZXI6Om5hbWUoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbXBsLT5uYW1lKCk7Cit9CisKK2NvbnN0IEMySW50ZXJmYWNlSGVscGVyOjpQYXJhbVJlZiBDMkludGVyZmFjZUhlbHBlcjo6UGFyYW1IZWxwZXI6OnJlZigpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwtPnJlZigpOworfQorCitDMlN0cnVjdERlc2NyaXB0b3IgQzJJbnRlcmZhY2VIZWxwZXI6OlBhcmFtSGVscGVyOjpyZXRyaWV2ZVN0cnVjdERlc2NyaXB0b3IoKSB7CisgICAgcmV0dXJuIG1JbXBsLT5yZXRyaWV2ZVN0cnVjdERlc2NyaXB0b3IoKTsKK30KKwordm9pZCBDMkludGVyZmFjZUhlbHBlcjo6UGFyYW1IZWxwZXI6OnNldERlZmF1bHRWYWx1ZShzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbT4gZGVmYXVsdF8pIHsKKyAgICBtSW1wbC0+c2V0RGVmYXVsdFZhbHVlKGRlZmF1bHRfKTsKK30KKwordm9pZCBDMkludGVyZmFjZUhlbHBlcjo6UGFyYW1IZWxwZXI6OnNldERlcGVuZGVuY2llcygKKyAgICAgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+IGluZGljZXMsIHN0ZDo6dmVjdG9yPFBhcmFtUmVmPiByZWZzKSB7CisgICAgbUltcGwtPnNldERlcGVuZGVuY2llcyhpbmRpY2VzLCByZWZzKTsKK30KKwordm9pZCBDMkludGVyZmFjZUhlbHBlcjo6UGFyYW1IZWxwZXI6OnNldEZpZWxkcyhzdGQ6OnZlY3RvcjxDMlBhcmFtRmllbGRWYWx1ZXM+ICYmZmllbGRzKSB7CisgICAgcmV0dXJuIG1JbXBsLT5zZXRGaWVsZHMoc3RkOjptb3ZlKGZpZWxkcykpOworfQorCit2b2lkIEMySW50ZXJmYWNlSGVscGVyOjpQYXJhbUhlbHBlcjo6c2V0R2V0dGVyKAorICAgICAgICBzdGQ6OmZ1bmN0aW9uPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtPihib29sKT4gZ2V0dGVyKSB7CisgICAgbUltcGwtPnNldEdldHRlcihnZXR0ZXIpOworfQorCit2b2lkIEMySW50ZXJmYWNlSGVscGVyOjpQYXJhbUhlbHBlcjo6c2V0U2V0dGVyKAorICAgICAgICBzdGQ6OmZ1bmN0aW9uPEMyUihjb25zdCBDMlBhcmFtICosIGJvb2wsIGJvb2wgKiwgRmFjdG9yeSAmKT4gc2V0dGVyKSB7CisgICAgbUltcGwtPnNldFNldHRlcihzZXR0ZXIpOworfQorCitjMl9zdGF0dXNfdCBDMkludGVyZmFjZUhlbHBlcjo6UGFyYW1IZWxwZXI6OnRyeVNldCgKKyAgICAgICAgY29uc3QgQzJQYXJhbSAqdmFsdWUsIGJvb2wgbWF5QmxvY2ssIGJvb2wgKmNoYW5nZWQsIEZhY3RvcnkgJmYsCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiogY29uc3QgZmFpbHVyZXMpIHsKKyAgICByZXR1cm4gbUltcGwtPnRyeVNldCh2YWx1ZSwgbWF5QmxvY2ssIGNoYW5nZWQsIGYsIGZhaWx1cmVzKTsKK30KKworYzJfc3RhdHVzX3QgQzJJbnRlcmZhY2VIZWxwZXI6OlBhcmFtSGVscGVyOjp2YWxpZGF0ZSgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+ICZyZWZsZWN0b3IpIHsKKyAgICByZXR1cm4gbUltcGwtPnZhbGlkYXRlKHJlZmxlY3Rvcik7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtPiBDMkludGVyZmFjZUhlbHBlcjo6UGFyYW1IZWxwZXI6OnZhbHVlKCkgeworICAgIHJldHVybiBtSW1wbC0+dmFsdWUoKTsKK30KKworc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyUGFyYW0+IEMySW50ZXJmYWNlSGVscGVyOjpQYXJhbUhlbHBlcjo6dmFsdWUoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbXBsLT52YWx1ZSgpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEZpZWxkSGVscGVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworQzJQYXJhbUZpZWxkIEMySW50ZXJmYWNlSGVscGVyOjpGaWVsZEhlbHBlcjo6bWFrZVBhcmFtRmllbGQoQzJQYXJhbTo6SW5kZXggaW5kZXgpIGNvbnN0IHsKKyAgICByZXR1cm4gX0MyUGFyYW1JbnNwZWN0b3I6OkNyZWF0ZVBhcmFtRmllbGQoaW5kZXgsIG1GaWVsZElkKTsKK30KKworQzJJbnRlcmZhY2VIZWxwZXI6OkZpZWxkSGVscGVyOjpGaWVsZEhlbHBlcihjb25zdCBQYXJhbVJlZiAmcGFyYW0sIGNvbnN0IF9DMkZpZWxkSWQgJmZpZWxkLAorICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM+ICYmdmFsdWVzKQorICAgIDogbVBhcmFtKHBhcmFtKSwKKyAgICAgIG1GaWVsZElkKGZpZWxkKSwKKyAgICAgIG1Qb3NzaWJsZShzdGQ6Om1vdmUodmFsdWVzKSkgeworICAgIEMyX0xPRyhWRVJCT1NFKSA8PCAiQ3JlYXRpbmcgZmllbGQgaGVscGVyICIgPDwgZmllbGQgPDwgIiAiCisgICAgICAgICAgICA8PCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPHVpbnQzMl90PigqbVBvc3NpYmxlKTsKK30KKwordm9pZCBDMkludGVyZmFjZUhlbHBlcjo6RmllbGRIZWxwZXI6OnNldFN1cHBvcnRlZFZhbHVlcygKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM+ICYmdmFsdWVzKSB7CisgICAgbVN1cHBvcnRlZCA9IHN0ZDo6bW92ZSh2YWx1ZXMpOworfQorCitjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzICpDMkludGVyZmFjZUhlbHBlcjo6RmllbGRIZWxwZXI6OmdldFN1cHBvcnRlZFZhbHVlcygpIGNvbnN0IHsKKyAgICByZXR1cm4gKG1TdXBwb3J0ZWQgPyBtU3VwcG9ydGVkIDogbVBvc3NpYmxlKS5nZXQoKTsKK30KKworY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyAqQzJJbnRlcmZhY2VIZWxwZXI6OkZpZWxkSGVscGVyOjpnZXRQb3NzaWJsZVZhbHVlcygpIGNvbnN0IHsKKyAgICByZXR1cm4gbVBvc3NpYmxlLmdldCgpOworfQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRmllbGQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioKKyAqIFdyYXBwZXIgYXJvdW5kIGZpZWxkLXN1cHBvcnRlZC12YWx1ZXMgYnVpbGRlciB0aGF0IGdldHMgc3RvcmVkIGluIHRoZQorICogZmllbGQgaGVscGVyIHdoZW4gdGhlIGJ1aWxkZXIgZ29lcyBvdXQgb2Ygc2NvcGUuCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgU3VwcG9ydGVkVmFsdWVzQnVpbGRlciA6IEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD4geworICAgIFN1cHBvcnRlZFZhbHVlc0J1aWxkZXIoCisgICAgICAgICAgICBDMlBhcmFtRmllbGQgJmZpZWxkLCBzdGQ6OnNoYXJlZF9wdHI8QzJJbnRlcmZhY2VIZWxwZXI6OkZpZWxkSGVscGVyPiBoZWxwZXIpCisgICAgICAgIDogQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPihmaWVsZCksIF9tSGVscGVyKGhlbHBlciksIF9tRmllbGQoZmllbGQpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTYXZlIGJ1aWxkZXIgdmFsdWVzIG9uIGRlc3RydWN0aW9uLgorICAgICAqLworICAgIHZpcnR1YWwgflN1cHBvcnRlZFZhbHVlc0J1aWxkZXIoKSBvdmVycmlkZSB7CisgICAgICAgIF9tSGVscGVyLT5zZXRTdXBwb3J0ZWRWYWx1ZXMoc3RkOjptb3ZlKEMyUGFyYW1GaWVsZFZhbHVlcygqdGhpcykudmFsdWVzKSk7CisgICAgfQorCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkludGVyZmFjZUhlbHBlcjo6RmllbGRIZWxwZXI+IF9tSGVscGVyOworICAgIEMyUGFyYW1GaWVsZCBfbUZpZWxkOworfTsKKworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiBDMkludGVyZmFjZUhlbHBlcjo6RmllbGQ8VD46OnNob3VsZEJlKCkgY29uc3QgeworICAgIHJldHVybiBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+KF9tRmllbGQpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiBDMkludGVyZmFjZUhlbHBlcjo6RmllbGQ8VD46Om11c3RCZSgpIHsKKyAgICByZXR1cm4gU3VwcG9ydGVkVmFsdWVzQnVpbGRlcjxUPihfbUZpZWxkLCBfbUhlbHBlcik7Cit9CisKKy8qCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBDMlNldHRpbmdSZXN1bHRzQnVpbGRlciBDMkludGVyZmFjZUhlbHBlcjo6RmllbGQ8VD46OnZhbGlkYXRlUG9zc2libGUoVCAmdmFsdWUpCitjb25zdCB7CisgICAgLy8vIFRPRE8KKyAgICByZXR1cm4gQzJTZXR0aW5nUmVzdWx0c0J1aWxkZXI6Ok9rKCk7Cit9CisqLworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorQzJJbnRlcmZhY2VIZWxwZXI6OkZpZWxkPFQ+OjpGaWVsZChzdGQ6OnNoYXJlZF9wdHI8RmllbGRIZWxwZXI+IGhlbHBlciwgQzJQYXJhbTo6SW5kZXggaW5kZXgpCisgICAgOiBfbUhlbHBlcihoZWxwZXIpLCBfbUZpZWxkKGhlbHBlci0+bWFrZVBhcmFtRmllbGQoaW5kZXgpKSB7IH0KKwordGVtcGxhdGUgc3RydWN0IEMySW50ZXJmYWNlSGVscGVyOjpGaWVsZDx1aW50OF90PjsKK3RlbXBsYXRlIHN0cnVjdCBDMkludGVyZmFjZUhlbHBlcjo6RmllbGQ8Y2hhcj47Cit0ZW1wbGF0ZSBzdHJ1Y3QgQzJJbnRlcmZhY2VIZWxwZXI6OkZpZWxkPGludDMyX3Q+OwordGVtcGxhdGUgc3RydWN0IEMySW50ZXJmYWNlSGVscGVyOjpGaWVsZDx1aW50MzJfdD47CisvL3RlbXBsYXRlIHN0cnVjdCBDMkludGVyZmFjZUhlbHBlcjo6RmllbGQ8YzJfY250cjMyX3Q+OwordGVtcGxhdGUgc3RydWN0IEMySW50ZXJmYWNlSGVscGVyOjpGaWVsZDxpbnQ2NF90PjsKK3RlbXBsYXRlIHN0cnVjdCBDMkludGVyZmFjZUhlbHBlcjo6RmllbGQ8dWludDY0X3Q+OworLy90ZW1wbGF0ZSBzdHJ1Y3QgQzJJbnRlcmZhY2VIZWxwZXI6OkZpZWxkPGMyX2NudHI2NF90PjsKK3RlbXBsYXRlIHN0cnVjdCBDMkludGVyZmFjZUhlbHBlcjo6RmllbGQ8ZmxvYXQ+OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRmFjdG9yeSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RydWN0IEMySW50ZXJmYWNlSGVscGVyOjpGYWN0b3J5SW1wbCA6IHB1YmxpYyBDMkludGVyZmFjZUhlbHBlcjo6RmFjdG9yeSB7CisgICAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gZ2V0UmVmbGVjdG9yKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gX21SZWZsZWN0b3I7CisgICAgfQorCisgICAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8UGFyYW1IZWxwZXI+CisgICAgZ2V0UGFyYW1IZWxwZXIoY29uc3QgUGFyYW1SZWYgJnBhcmFtKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBfbVBhcmFtcy5maW5kKHBhcmFtKS0+c2Vjb25kOworICAgIH0KKworcHVibGljOgorICAgIEZhY3RvcnlJbXBsKHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiByZWZsZWN0b3IpCisgICAgICAgIDogX21SZWZsZWN0b3IocmVmbGVjdG9yKSB7IH0KKworICAgIHZpcnR1YWwgfkZhY3RvcnlJbXBsKCkgPSBkZWZhdWx0OworCisgICAgdm9pZCBhZGRQYXJhbShzdGQ6OnNoYXJlZF9wdHI8UGFyYW1IZWxwZXI+IHBhcmFtKSB7CisgICAgICAgIF9tUGFyYW1zLmluc2VydCh7IHBhcmFtLT5yZWYoKSwgcGFyYW0gfSk7CisgICAgICAgIF9tSW5kZXhUb0hlbHBlci5pbnNlcnQoe3BhcmFtLT5pbmRleCgpLCBwYXJhbX0pOworCisgICAgICAgIC8vIGFkZCBkb3duLWRlcGVuZGVuY2llcyAoYW5kIHZhbGlkYXRlIGRlcGVuZGVuY2llcyBhcyBhIHJlc3VsdCkKKyAgICAgICAgc2l6ZV90IGl4ID0gMDsKKyAgICAgICAgZm9yIChjb25zdCBQYXJhbVJlZiAmcmVmIDogcGFyYW0tPmdldERlcGVuZGVuY2llc0FzUmVmcygpKSB7CisgICAgICAgICAgICAvLyBkZXBlbmRlbmNpZXMgbXVzdCBhbHJlYWR5IGJlIGRlZmluZWQKKyAgICAgICAgICAgIGlmICghX21QYXJhbXMuY291bnQocmVmKSkgeworICAgICAgICAgICAgICAgIEMyX0xPRyhGQVRBTCkgPDwgIlBhcmFtZXRlciAiIDw8IHBhcmFtLT5uYW1lKCkgPDwgIiBoYXMgYSBkZXBlbmRlbmN5IGF0IGluZGV4ICIKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8IGl4IDw8ICIgdGhhdCBpcyBub3QgeWV0IGRlZmluZWQiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgX21QYXJhbXMuZmluZChyZWYpLT5zZWNvbmQtPmFkZERvd25EZXBlbmRlbmN5KHBhcmFtLT5pbmRleCgpKTsKKyAgICAgICAgICAgICsraXg7CisgICAgICAgIH0KKworICAgICAgICBfbURlcGVuZGVuY3lJbmRleC5lbXBsYWNlKHBhcmFtLT5pbmRleCgpLCBfbURlcGVuZGVuY3lJbmRleC5zaXplKCkpOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxQYXJhbUhlbHBlcj4gZ2V0UGFyYW0oQzJQYXJhbTo6SW5kZXggaXgpIGNvbnN0IHsKKyAgICAgICAgLy8gVE9ETzogaGFuZGxlIHN0cmVhbXMgc2VwYXJhdGVseQorICAgICAgICBjb25zdCBhdXRvIGl0ID0gX21JbmRleFRvSGVscGVyLmZpbmQoaXgpOworICAgICAgICBpZiAoaXQgPT0gX21JbmRleFRvSGVscGVyLmVuZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaXQtPnNlY29uZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUT0RPOiB0aGlzIGNvdWxkIHJldHVybiBhIGNvcHkgdXNpbmcgcHJvcGVyIHBvaW50ZXIgY2FzdC4KKyAgICAgKi8KKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbT4gZ2V0UGFyYW1WYWx1ZShDMlBhcmFtOjpJbmRleCBpeCkgY29uc3QgeworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8UGFyYW1IZWxwZXI+IGhlbHBlciA9IGdldFBhcmFtKGl4KTsKKyAgICAgICAgcmV0dXJuIGhlbHBlciA/IGhlbHBlci0+dmFsdWUoKSA6IG51bGxwdHI7CisgICAgfQorCisgICAgYzJfc3RhdHVzX3QgcXVlcnlTdXBwb3J0ZWRQYXJhbXMoCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+PiAqY29uc3QgcGFyYW1zKSBjb25zdCB7CisgICAgICAgIGZvciAoY29uc3QgYXV0byAmaXQgOiBfbVBhcmFtcykgeworICAgICAgICAgICAgLy8gVE9ETzogY2hhbmdlIHF1ZXJ5U3VwcG9ydGVkUGFyYW1zIHNpZ25hdHVyZT8KKyAgICAgICAgICAgIHBhcmFtcy0+cHVzaF9iYWNrKAorICAgICAgICAgICAgICAgICAgICBzdGQ6OmNvbnN0X3BvaW50ZXJfY2FzdDxDMlBhcmFtRGVzY3JpcHRvcj4oaXQuc2Vjb25kLT5nZXREZXNjcmlwdG9yKCkpKTsKKyAgICAgICAgfQorICAgICAgICAvLyBUT0RPOiBoYW5kbGUgZXJyb3JzCisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICBzaXplX3QgZ2V0RGVwZW5kZW5jeUluZGV4KEMyUGFyYW06OkluZGV4IGl4KSB7CisgICAgICAgIC8vIGluIHRoaXMgdmVyc2lvbiBvZiB0aGUgaGVscGVyIHRoZXJlIGlzIG9ubHkgYSBzaW5nbGUgc3RyZWFtIHNvCisgICAgICAgIC8vIHdlIGNhbiBsb29rIHVwIGRpcmVjdGx5IGJ5IGluZGV4CisgICAgICAgIGF1dG8gaXQgPSBfbURlcGVuZGVuY3lJbmRleC5maW5kKGl4KTsKKyAgICAgICAgcmV0dXJuIGl0ID09IF9tRGVwZW5kZW5jeUluZGV4LmVuZCgpID8gU0laRV9NQVggOiBpdC0+c2Vjb25kOworICAgIH0KKworcHJpdmF0ZToKKyAgICBzdGQ6Om1hcDxQYXJhbVJlZiwgc3RkOjpzaGFyZWRfcHRyPFBhcmFtSGVscGVyPj4gX21QYXJhbXM7CisgICAgc3RkOjptYXA8QzJQYXJhbTo6SW5kZXgsIHN0ZDo6c2hhcmVkX3B0cjxQYXJhbUhlbHBlcj4+IF9tSW5kZXhUb0hlbHBlcjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gX21SZWZsZWN0b3I7CisgICAgc3RkOjptYXA8QzJQYXJhbTo6SW5kZXgsIHNpemVfdD4gX21EZXBlbmRlbmN5SW5kZXg7Cit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSGVscGVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCituYW1lc3BhY2UgeworCitzdGF0aWMgc3RkOjpzdHJpbmcgYXNTdHJpbmcoQzJQYXJhbSAqcCkgeworICAgIGNoYXIgYWRkclsyMF07CisgICAgc3ByaW50ZihhZGRyLCAiJXA6WyIsIHApOworICAgIHN0ZDo6c3RyaW5nIHYgPSBhZGRyOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcC0+c2l6ZSgpOyArK2kpIHsKKyAgICAgICAgY2hhciBkWzRdOworICAgICAgICBzcHJpbnRmKGQsICIgJTAyeCIsICooKCh1aW50OF90ICopcCkgKyBpKSk7CisgICAgICAgIHYgKz0gZCArIChpID09IDApOworICAgIH0KKyAgICByZXR1cm4gdiArICJdIjsKK30KKworfQorCitDMkludGVyZmFjZUhlbHBlcjo6QzJJbnRlcmZhY2VIZWxwZXIoc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiByZWZsZWN0b3IpCisgICAgOiBtUmVmbGVjdG9yKHJlZmxlY3RvciksCisgICAgICBfbUZhY3Rvcnkoc3RkOjptYWtlX3NoYXJlZDxGYWN0b3J5SW1wbD4ocmVmbGVjdG9yKSkgeyB9CisKKworc2l6ZV90IEMySW50ZXJmYWNlSGVscGVyOjpHZXRCYXNlT2Zmc2V0KGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiAmcmVmbGVjdG9yLAorICAgICAgICBDMlBhcmFtOjpDb3JlSW5kZXggaW5kZXgsIHNpemVfdCBvZmZzZXQpIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJTdHJ1Y3REZXNjcmlwdG9yPiBwYXJhbSA9IHJlZmxlY3Rvci0+ZGVzY3JpYmUoaW5kZXgpOworICAgIGlmIChwYXJhbSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiB+KHNpemVfdCkwOyAvLyBwYXJhbSBzdHJ1Y3R1cmUgbm90IGRlc2NyaWJlZAorICAgIH0KKworICAgIGZvciAoY29uc3QgQzJGaWVsZERlc2NyaXB0b3IgJmZpZWxkIDogKnBhcmFtKSB7CisgICAgICAgIHNpemVfdCBmaWVsZE9mZnNldCA9IF9DMlBhcmFtSW5zcGVjdG9yOjpHZXRPZmZzZXQoZmllbGQpOworICAgICAgICBzaXplX3QgZmllbGRTaXplID0gX0MyUGFyYW1JbnNwZWN0b3I6OkdldFNpemUoZmllbGQpOworICAgICAgICBzaXplX3QgZmllbGRFeHRlbnQgPSBmaWVsZC5leHRlbnQoKTsKKyAgICAgICAgaWYgKG9mZnNldCA8IGZpZWxkT2Zmc2V0KSB7CisgICAgICAgICAgICByZXR1cm4gfihzaXplX3QpMDsgLy8gbm90IGZvdW5kCisgICAgICAgIH0KKyAgICAgICAgaWYgKG9mZnNldCA9PSBmaWVsZE9mZnNldCkgeworICAgICAgICAgICAgLy8gZXhhY3QgbWF0Y2gKKyAgICAgICAgICAgIHJldHVybiBvZmZzZXQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZpZWxkLmV4dGVudCgpID09IDAgfHwgb2Zmc2V0IDwgZmllbGRPZmZzZXQgKyBmaWVsZFNpemUgKiBmaWVsZEV4dGVudCkgeworICAgICAgICAgICAgLy8gcmVkdWNlIHRvIGZpcnN0IGVsZW1lbnQgaW4gY2FzZSBvZiBhcnJheQorICAgICAgICAgICAgb2Zmc2V0ID0gZmllbGRPZmZzZXQgKyAob2Zmc2V0IC0gZmllbGRPZmZzZXQpICUgZmllbGRTaXplOworICAgICAgICAgICAgaWYgKGZpZWxkLnR5cGUoKSA+PSBDMkZpZWxkRGVzY3JpcHRvcjo6U1RSVUNUX0ZMQUcpIHsKKyAgICAgICAgICAgICAgICAvLyB0aGlzIG9mZnNldCBpcyB3aXRoaW4gYSBmaWVsZAorICAgICAgICAgICAgICAgIG9mZnNldCA9IEdldEJhc2VPZmZzZXQoCisgICAgICAgICAgICAgICAgICAgICAgICByZWZsZWN0b3IsIGZpZWxkLnR5cGUoKSAmIH5DMkZpZWxkRGVzY3JpcHRvcjo6U1RSVUNUX0ZMQUcsCisgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgLSBmaWVsZE9mZnNldCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIH5vZmZzZXQgPyBmaWVsZE9mZnNldCArIG9mZnNldCA6IG9mZnNldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gfihzaXplX3QpMDsgLy8gbm90IGZvdW5kCit9CisKK3ZvaWQgQzJJbnRlcmZhY2VIZWxwZXI6OmFkZFBhcmFtZXRlcihzdGQ6OnNoYXJlZF9wdHI8UGFyYW1IZWxwZXI+IHBhcmFtKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICBtUmVmbGVjdG9yLT5hZGRTdHJ1Y3REZXNjcmlwdG9yKHBhcmFtLT5yZXRyaWV2ZVN0cnVjdERlc2NyaXB0b3IoKSk7CisgICAgYzJfc3RhdHVzX3QgZXJyID0gcGFyYW0tPnZhbGlkYXRlKG1SZWZsZWN0b3IpOworICAgIGlmIChlcnIgIT0gQzJfQ09SUlVQVEVEKSB7CisgICAgICAgIF9tRmFjdG9yeS0+YWRkUGFyYW0ocGFyYW0pOworCisgICAgICAgIC8vIHJ1biBzZXR0ZXIgdG8gZW5zdXJlIGNvcnJlY3QgdmFsdWVzCisgICAgICAgIGJvb2wgY2hhbmdlZCA9IGZhbHNlOworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgICAgICh2b2lkKXBhcmFtLT50cnlTZXQocGFyYW0tPnZhbHVlKCkuZ2V0KCksIEMyX01BWV9CTE9DSywgJmNoYW5nZWQsICpfbUZhY3RvcnksICZmYWlsdXJlcyk7CisgICAgfQorfQorCitjMl9zdGF0dXNfdCBDMkludGVyZmFjZUhlbHBlcjo6Y29uZmlnKAorICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiAmcGFyYW1zLCBjMl9ibG9ja2luZ190IG1heUJsb2NrLAorICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiogY29uc3QgZmFpbHVyZXMsIGJvb2wgdXBkYXRlUGFyYW1zLAorICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtPj4gKmNoYW5nZXMgX191bnVzZWQgLyogVE9ETyAqLykgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisgICAgYm9vbCBwYXJhbVdhc0ludmFsaWQgPSBmYWxzZTsgLy8gVE9ETyBpcyB0aGlzIHRoZSBzYW1lIGFzIGJhZCB2YWx1ZT8KKyAgICBib29sIHBhcmFtTm90Rm91bmQgPSBmYWxzZTsKKyAgICBib29sIHBhcmFtQmFkVmFsdWUgPSBmYWxzZTsKKyAgICBib29sIHBhcmFtTm9NZW1vcnkgPSBmYWxzZTsKKyAgICBib29sIHBhcmFtQmxvY2tpbmcgPSBmYWxzZTsKKyAgICBib29sIHBhcmFtVGltZWRPdXQgPSBmYWxzZTsKKyAgICBib29sIHBhcmFtQ29ycnVwdGVkID0gZmFsc2U7CisKKyAgICAvLyBkZXBlbmRlbmNpZXMKKyAgICAvLyBkb3duIGRlcGVuZGVuY2llcyBhcmUgbWFya2VkIGRpcnR5LCBidXQgcGFyYW1zIHNldCBhcmUgbm90IGltbWVkaWF0ZWx5CisgICAgLy8gbWFya2VkIGRpcnR5ICh1bmxlc3MgdGhleSBiZWNvbWUgZG93biBkZXBlbmRlbmN5KSBzbyB0aGF0IHdlIGNhbgorICAgIC8vIGF2b2lkIHNldHRpbmcgdGhlbSBpZiB0aGV5IGRpZCBub3QgY2hhbmdlCisKKyAgICAvLyBUT0RPOiB0aGVyZSBjb3VsZCBiZSBtdWx0aXBsZSBpbmRpY2VzIGZvciB0aGUgc2FtZSBkZXBlbmRlbmN5IGluZGV4CisgICAgLy8geyBkZXBJeCwgcGFyYW1JeCB9IG1heSBiZSBhIHN1aXRhYmxlIGtleQorICAgIHN0ZDo6bWFwPHNpemVfdCwgc3RkOjpwYWlyPEMyUGFyYW06OkluZGV4LCBib29sPj4gZGVwZW5kZW5jaWVzOworCisgICAgLy8gd2UgY2Fubm90IGRldGVybWluZSB0aGUgbGFzdCB2YWxpZCBwYXJhbWV0ZXIsIHNvIGFkZCBhbiBleHRyYQorICAgIC8vIGxvb3AgaXRlcmF0aW9uIGFmdGVyIHRoZSBsYXN0IHBhcmFtZXRlcgorICAgIGZvciAoc2l6ZV90IHBfaXggPSAwOyBwX2l4IDw9IHBhcmFtcy5zaXplKCk7ICsrcF9peCkgeworICAgICAgICBDMlBhcmFtICpwID0gbnVsbHB0cjsKKyAgICAgICAgQzJQYXJhbTo6SW5kZXggcGFyYW1JeCA9IDB1OworICAgICAgICBzaXplX3QgcGFyYW1EZXBJeCA9IFNJWkVfTUFYOworICAgICAgICBib29sIGxhc3QgPSBwX2l4ID09IHBhcmFtcy5zaXplKCk7CisgICAgICAgIGlmICghbGFzdCkgeworICAgICAgICAgICAgcCA9IHBhcmFtc1twX2l4XTsKKyAgICAgICAgICAgIGlmICghKnApIHsKKyAgICAgICAgICAgICAgICBwYXJhbVdhc0ludmFsaWQgPSB0cnVlOworICAgICAgICAgICAgICAgIHAtPmludmFsaWRhdGUoKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcGFyYW1JeCA9IHAtPmluZGV4KCk7CisgICAgICAgICAgICBwYXJhbURlcEl4ID0gZ2V0RGVwZW5kZW5jeUluZGV4X2wocGFyYW1JeCk7CisgICAgICAgICAgICBpZiAocGFyYW1EZXBJeCA9PSBTSVpFX01BWCkgeworICAgICAgICAgICAgICAgIC8vIHVuc3VwcG9ydGVkIHBhcmFtZXRlcgorICAgICAgICAgICAgICAgIHBhcmFtTm90Rm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gZmlyc3QgaW5zZXJ0IC0gbWFyayBub3QgZGlydHkKKyAgICAgICAgICAgIC8vIGl0IG1heSBoYXZlIGJlZW4gbWFya2VkIGRpcnR5IGJ5IGEgZGVwZW5kZW5jeSB1cGRhdGUKKyAgICAgICAgICAgIC8vIHRoaXMgZG9lcyBub3Qgb3ZlcnJ3cml0ZSghKQorICAgICAgICAgICAgKHZvaWQpZGVwZW5kZW5jaWVzLmluc2VydCh7IHBhcmFtRGVwSXgsIHsgcGFyYW1JeCwgZmFsc2UgLyogZGlydHkgKi8gfX0pOworICAgICAgICAgICAgYXV0byBpdCA9IGRlcGVuZGVuY2llcy5maW5kKHBhcmFtRGVwSXgpOworICAgICAgICAgICAgQzJfTE9HKFZFUkJPU0UpIDw8ICJtYXJraW5nIGRlcGVuZGVuY3kgZm9yIHNldHRpbmcgYXQgIyIgPDwgcGFyYW1EZXBJeCA8PCAiOiAiCisgICAgICAgICAgICAgICAgICAgIDw8IGl0LT5zZWNvbmQuZmlyc3QgPDwgIiwgdXBkYXRlICIKKyAgICAgICAgICAgICAgICAgICAgPDwgKGl0LT5zZWNvbmQuc2Vjb25kID8gImFsd2F5cyAoZGlydHkpIiA6ICJvbmx5IGlmIGNoYW5nZWQiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIHByb2Nlc3MgYW55IHJlbWFpbmluZyBkZXBlbmRlbmNpZXMKKyAgICAgICAgICAgIGlmIChkZXBlbmRlbmNpZXMuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQzJfTE9HKFZFUkJPU0UpIDw8ICJoYW5kbGluZyBkaXJ0eSBkb3duIGRlcGVuZGVuY2llcyBhZnRlciBsYXN0IHNldHRpbmciOworICAgICAgICB9CisKKyAgICAgICAgLy8gcHJvY2VzcyBhbnkgZGlydGllZCBkb3duLWRlcGVuZGVuY2llcyB1bnRpbCB0aGUgbmV4dCBwYXJhbQorICAgICAgICB3aGlsZSAoZGVwZW5kZW5jaWVzLnNpemUoKSAmJiBkZXBlbmRlbmNpZXMuYmVnaW4oKS0+Zmlyc3QgPD0gcGFyYW1EZXBJeCkgeworICAgICAgICAgICAgYXV0byBtaW4gPSBkZXBlbmRlbmNpZXMuYmVnaW4oKTsKKyAgICAgICAgICAgIEMyUGFyYW06OkluZGV4IGl4ID0gbWluLT5zZWNvbmQuZmlyc3Q7CisgICAgICAgICAgICBib29sIGRpcnR5ID0gbWluLT5zZWNvbmQuc2Vjb25kOworICAgICAgICAgICAgZGVwZW5kZW5jaWVzLmVyYXNlKG1pbik7CisKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxQYXJhbUhlbHBlcj4gcGFyYW0gPSBfbUZhY3RvcnktPmdldFBhcmFtKGl4KTsKKyAgICAgICAgICAgIEMyX0xPRyhWRVJCT1NFKSA8PCAib2xkIHZhbHVlICIgPDwgYXNTdHJpbmcocGFyYW0tPnZhbHVlKCkuZ2V0KCkpOworICAgICAgICAgICAgaWYgKCFsYXN0KSB7CisgICAgICAgICAgICAgICAgQzJfTE9HKFZFUkJPU0UpIDw8ICJuZXcgdmFsdWUgIiA8PCBhc1N0cmluZyhwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghbGFzdCAmJiAhZGlydHkgJiYgaXggPT0gcGFyYW1JeCAmJiAqcGFyYW0tPnZhbHVlKCkgPT0gKnApIHsKKyAgICAgICAgICAgICAgICAvLyBubyBjaGFuZ2UgaW4gdmFsdWUgLSBhbmQgZGVwZW5kZW5jaWVzIHdlcmUgbm90IHVwZGF0ZWQKKyAgICAgICAgICAgICAgICAvLyBubyBuZWVkIHRvIHVwZGF0ZQorICAgICAgICAgICAgICAgIEMyX0xPRyhWRVJCT1NFKSA8PCAiaWdub3Jpbmcgc2V0dGluZyB1bmNoYW5nZWQgcGFyYW0gIiA8PCBpeDsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gYXBwbHkgc2V0dGluZworICAgICAgICAgICAgYm9vbCBjaGFuZ2VkID0gZmFsc2U7CisgICAgICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgInNldHRpbmcgcGFyYW0gIiA8PCBpeDsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtPiBvbGRWYWx1ZSA9IHBhcmFtLT52YWx1ZSgpOworICAgICAgICAgICAgYzJfc3RhdHVzX3QgcmVzID0gcGFyYW0tPnRyeVNldCgKKyAgICAgICAgICAgICAgICAgICAgKCFsYXN0ICYmIHBhcmFtSXggPT0gaXgpID8gcCA6IHBhcmFtLT52YWx1ZSgpLmdldCgpLCBtYXlCbG9jaywKKyAgICAgICAgICAgICAgICAgICAgJmNoYW5nZWQsICpfbUZhY3RvcnksIGZhaWx1cmVzKTsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtPiBuZXdWYWx1ZSA9IHBhcmFtLT52YWx1ZSgpOworICAgICAgICAgICAgQzJfQ0hFQ0tfRVEob2xkVmFsdWUgPT0gbmV3VmFsdWUsICpvbGRWYWx1ZSA9PSAqbmV3VmFsdWUpOworICAgICAgICAgICAgc3dpdGNoIChyZXMpIHsKKyAgICAgICAgICAgICAgICBjYXNlIEMyX09LOiBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEMyX0JBRF9WQUxVRTogcGFyYW1CYWRWYWx1ZSA9IHRydWU7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQzJfTk9fTUVNT1JZOiBwYXJhbU5vTWVtb3J5ID0gdHJ1ZTsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDMl9USU1FRF9PVVQ6IHBhcmFtVGltZWRPdXQgPSB0cnVlOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEMyX0JMT0NLSU5HOiAgcGFyYW1CbG9ja2luZyA9IHRydWU7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQzJfQ09SUlVQVEVEOiBwYXJhbUNvcnJ1cHRlZCA9IHRydWU7IGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6IDsvLyBUT0RPIGZhdGFsCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGNvcHkgYmFjayByZXN1bHQgZm9yIGNvbmZpZ3VyZWQgdmFsdWVzIChvciBpbnZhbGlkYXRlIGlmIGl0IGRvZXMgbm90IGZpdCBvciBtYXRjaCkKKyAgICAgICAgICAgIGlmICh1cGRhdGVQYXJhbXMgJiYgIWxhc3QgJiYgcGFyYW1JeCA9PSBpeCkgeworICAgICAgICAgICAgICAgIGlmICghcC0+dXBkYXRlRnJvbSgqcGFyYW0tPnZhbHVlKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIHAtPmludmFsaWRhdGUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGNvbXBhcmUgcHRycyBhcyBwYXJhbXMgYXJlIGNvcHkgb24gd3JpdGUKKyAgICAgICAgICAgIGlmIChjaGFuZ2VkKSB7CisgICAgICAgICAgICAgICAgQzJfTE9HKFZFUkJPU0UpIDw8ICJwYXJhbSAiIDw8IGl4IDw8ICIgdmFsdWUgY2hhbmdlZCI7CisgICAgICAgICAgICAgICAgLy8gdmFsdWUgY2hhbmdlZCB1cGRhdGUgZG93bi1kZXBlbmRlbmNpZXMgYW5kIG1hcmsgdGhlbSBkaXJ0eQorICAgICAgICAgICAgICAgIGZvciAoY29uc3QgQzJQYXJhbTo6SW5kZXggaXggOiBwYXJhbS0+Z2V0RG93bkRlcGVuZGVuY2llcygpKSB7CisgICAgICAgICAgICAgICAgICAgIEMyX0xPRyhWRVJCT1NFKSA8PCAxOworICAgICAgICAgICAgICAgICAgICBhdXRvIGluc2VydF9yZXMgPSBkZXBlbmRlbmNpZXMuaW5zZXJ0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgZ2V0RGVwZW5kZW5jeUluZGV4X2woaXgpLCB7IGl4LCB0cnVlIC8qIGRpcnR5ICovIH19KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFpbnNlcnRfcmVzLnNlY29uZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgKCppbnNlcnRfcmVzLmZpcnN0KS5zZWNvbmQuc2Vjb25kID0gdHJ1ZTsgLy8gbWFyayBkaXJ0eQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgYXV0byBpdCA9IGRlcGVuZGVuY2llcy5maW5kKGdldERlcGVuZGVuY3lJbmRleF9sKGl4KSk7CisgICAgICAgICAgICAgICAgICAgIEMyX0NIRUNLKGl0LT5zZWNvbmQuc2Vjb25kKTsKKyAgICAgICAgICAgICAgICAgICAgQzJfTE9HKFZFUkJPU0UpIDw8ICJtYXJraW5nIGRvd24gZGVwZW5kZW5jaWVzIHRvIHVwZGF0ZSBhdCAjIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGdldERlcGVuZGVuY3lJbmRleF9sKGl4KSA8PCAiOiAiIDw8IGl0LT5zZWNvbmQuZmlyc3Q7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIChwYXJhbUNvcnJ1cHRlZCA/IEMyX0NPUlJVUFRFRCA6CisgICAgICAgICAgICBwYXJhbUJsb2NraW5nID8gQzJfQkxPQ0tJTkcgOgorICAgICAgICAgICAgcGFyYW1UaW1lZE91dCA/IEMyX1RJTUVEX09VVCA6CisgICAgICAgICAgICBwYXJhbU5vTWVtb3J5ID8gQzJfTk9fTUVNT1JZIDoKKyAgICAgICAgICAgIChwYXJhbUJhZFZhbHVlIHx8IHBhcmFtV2FzSW52YWxpZCkgPyBDMl9CQURfVkFMVUUgOgorICAgICAgICAgICAgcGFyYW1Ob3RGb3VuZCA/IEMyX0JBRF9JTkRFWCA6IEMyX09LKTsKK30KKworc2l6ZV90IEMySW50ZXJmYWNlSGVscGVyOjpnZXREZXBlbmRlbmN5SW5kZXhfbChDMlBhcmFtOjpJbmRleCBpeCkgY29uc3QgeworICAgIHJldHVybiBfbUZhY3RvcnktPmdldERlcGVuZGVuY3lJbmRleChpeCk7Cit9CisKK2MyX3N0YXR1c190IEMySW50ZXJmYWNlSGVscGVyOjpxdWVyeSgKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+ICZzdGFja1BhcmFtcywKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+ICZoZWFwUGFyYW1JbmRpY2VzLAorICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrIF9fdW51c2VkIC8qIFRPRE8gKi8sCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4qIGNvbnN0IGhlYXBQYXJhbXMpIGNvbnN0IHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworICAgIGJvb2wgcGFyYW1XYXNJbnZhbGlkID0gZmFsc2U7CisgICAgYm9vbCBwYXJhbU5vdEZvdW5kID0gZmFsc2U7CisgICAgYm9vbCBwYXJhbURpZE5vdEZpdCA9IGZhbHNlOworICAgIGJvb2wgcGFyYW1Ob01lbW9yeSA9IGZhbHNlOworCisgICAgZm9yIChDMlBhcmFtKiBjb25zdCBwIDogc3RhY2tQYXJhbXMpIHsKKyAgICAgICAgaWYgKCEqcCkgeworICAgICAgICAgICAgcGFyYW1XYXNJbnZhbGlkID0gdHJ1ZTsKKyAgICAgICAgICAgIHAtPmludmFsaWRhdGUoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtPiB2YWx1ZSA9IF9tRmFjdG9yeS0+Z2V0UGFyYW1WYWx1ZShwLT5pbmRleCgpKTsKKyAgICAgICAgICAgIGlmICghdmFsdWUpIHsKKyAgICAgICAgICAgICAgICBwYXJhbU5vdEZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBwLT5pbnZhbGlkYXRlKCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFwLT51cGRhdGVGcm9tKCp2YWx1ZSkpIHsKKyAgICAgICAgICAgICAgICBwYXJhbURpZE5vdEZpdCA9IHRydWU7CisgICAgICAgICAgICAgICAgcC0+aW52YWxpZGF0ZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChjb25zdCBDMlBhcmFtOjpJbmRleCBpeCA6IGhlYXBQYXJhbUluZGljZXMpIHsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW0+IHZhbHVlID0gX21GYWN0b3J5LT5nZXRQYXJhbVZhbHVlKGl4KTsKKyAgICAgICAgaWYgKHZhbHVlKSB7CisgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4gcCA9IEMyUGFyYW06OkNvcHkoKnZhbHVlKTsKKyAgICAgICAgICAgIGlmIChwICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBoZWFwUGFyYW1zLT5wdXNoX2JhY2soc3RkOjptb3ZlKHApKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcGFyYW1Ob01lbW9yeSA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwYXJhbU5vdEZvdW5kID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBwYXJhbU5vTWVtb3J5ID8gQzJfTk9fTUVNT1JZIDoKKyAgICAgICAgICAgcGFyYW1Ob3RGb3VuZCA/IEMyX0JBRF9JTkRFWCA6CisgICAgICAgICAgIC8vIHRoZSBmb2xsb3dpbmcgZXJyb3JzIGFyZSBub3QgbWFya2VkIGluIHRoZSByZXR1cm4gdmFsdWUKKyAgICAgICAgICAgcGFyYW1EaWROb3RGaXQgPyBDMl9PSyA6CisgICAgICAgICAgIHBhcmFtV2FzSW52YWxpZCA/IEMyX09LIDogQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMySW50ZXJmYWNlSGVscGVyOjpxdWVyeVN1cHBvcnRlZFBhcmFtcygKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4gKmNvbnN0IHBhcmFtcykgY29uc3QgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisgICAgcmV0dXJuIF9tRmFjdG9yeS0+cXVlcnlTdXBwb3J0ZWRQYXJhbXMocGFyYW1zKTsKK30KKworCitjMl9zdGF0dXNfdCBDMkludGVyZmFjZUhlbHBlcjo6cXVlcnlTdXBwb3J0ZWRWYWx1ZXMoCisgICAgICAgIHN0ZDo6dmVjdG9yPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeT4gJmZpZWxkcywgYzJfYmxvY2tpbmdfdCBtYXlCbG9jayBfX3VudXNlZCkgY29uc3QgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisgICAgZm9yIChDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkgJnF1ZXJ5IDogZmllbGRzKSB7CisgICAgICAgIEMyX0xPRyhWRVJCT1NFKSA8PCAicXVlcnlpbmcgZmllbGQgIiA8PCBxdWVyeS5maWVsZCgpOworICAgICAgICBDMlBhcmFtOjpJbmRleCBpeCA9IF9DMlBhcmFtSW5zcGVjdG9yOjpHZXRJbmRleChxdWVyeS5maWVsZCgpKTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFBhcmFtSGVscGVyPiBwYXJhbSA9IF9tRmFjdG9yeS0+Z2V0UGFyYW0oaXgpOworICAgICAgICBpZiAoIXBhcmFtKSB7CisgICAgICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgImJhZCBwYXJhbSI7CisgICAgICAgICAgICBxdWVyeS5zdGF0dXMgPSBDMl9CQURfSU5ERVg7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBzaXplX3Qgb2ZmcyA9IEdldEJhc2VPZmZzZXQoCisgICAgICAgICAgICAgICAgbVJlZmxlY3RvciwgaXgsCisgICAgICAgICAgICAgICAgX0MyUGFyYW1JbnNwZWN0b3I6OkdldE9mZnNldChxdWVyeS5maWVsZCgpKSAtIHNpemVvZihDMlBhcmFtKSk7CisgICAgICAgIGlmICh+b2ZmcyA9PSAwKSB7CisgICAgICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgImZpZWxkIGNvdWxkIG5vdCBiZSBmb3VuZCI7CisgICAgICAgICAgICBxdWVyeS5zdGF0dXMgPSBDMl9OT1RfRk9VTkQ7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBvZmZzICs9IHNpemVvZihDMlBhcmFtKTsKKyAgICAgICAgQzJfTE9HKFZFUkJPU0UpIDw8ICJmaWVsZCByZXNvbHZlZCB0byAiCisgICAgICAgICAgICAgICAgPDwgU3RyaW5nUHJpbnRmKCJAJTAyengrJTAyeCIsIG9mZnMsIF9DMlBhcmFtSW5zcGVjdG9yOjpHZXRTaXplKHF1ZXJ5LmZpZWxkKCkpKTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEZpZWxkSGVscGVyPiBmaWVsZCA9CisgICAgICAgICAgICBwYXJhbS0+ZmluZEZpZWxkKG9mZnMsIF9DMlBhcmFtSW5zcGVjdG9yOjpHZXRTaXplKHF1ZXJ5LmZpZWxkKCkpKTsKKyAgICAgICAgaWYgKCFmaWVsZCkgeworICAgICAgICAgICAgQzJfTE9HKFZFUkJPU0UpIDw8ICJiYWQgZmllbGQiOworICAgICAgICAgICAgcXVlcnkuc3RhdHVzID0gQzJfTk9UX0ZPVU5EOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzICp2YWx1ZXMgPSBudWxscHRyOworICAgICAgICBzd2l0Y2ggKHF1ZXJ5LnR5cGUoKSkgeworICAgICAgICBjYXNlIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeTo6Q1VSUkVOVDoKKyAgICAgICAgICAgIHZhbHVlcyA9IGZpZWxkLT5nZXRTdXBwb3J0ZWRWYWx1ZXMoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeTo6UE9TU0lCTEU6CisgICAgICAgICAgICB2YWx1ZXMgPSBmaWVsZC0+Z2V0UG9zc2libGVWYWx1ZXMoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQzJfTE9HKFZFUkJPU0UpIDw8ICJiYWQgcXVlcnkgdHlwZTogIiA8PCBxdWVyeS50eXBlKCk7CisgICAgICAgICAgICBxdWVyeS5zdGF0dXMgPSBDMl9CQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHZhbHVlcykgeworICAgICAgICAgICAgcXVlcnkudmFsdWVzID0gKnZhbHVlczsKKyAgICAgICAgICAgIHF1ZXJ5LnN0YXR1cyA9IEMyX09LOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQzJfTE9HKERFQlVHKSA8PCAibm8gdmFsdWVzIHB1Ymxpc2hlZCBieSBjb21wb25lbnQiOworICAgICAgICAgICAgcXVlcnkuc3RhdHVzID0gQzJfQ09SUlVQVEVEOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBDMl9PSzsKK30KKworc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBDMkludGVyZmFjZUhlbHBlcjo6bG9jaygpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PihtTXV0ZXgpOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvdXRpbC9DMkludGVyZmFjZVV0aWxzLmNwcCBiL21lZGlhL2NvZGVjMi92bmRrL3V0aWwvQzJJbnRlcmZhY2VVdGlscy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjFlYzkxMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL3V0aWwvQzJJbnRlcmZhY2VVdGlscy5jcHAKQEAgLTAsMCArMSwxMjkyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHB1c2gKKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV3VudXNlZC1wYXJhbWV0ZXIiCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVd1bnVzZWQtdmFyaWFibGUiCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVd1bnVzZWQtdmFsdWUiCisKKyNkZWZpbmUgQzJfTE9HX1ZFUkJPU0UKKworI2luY2x1ZGUgPEMyRGVidWcuaD4KKyNpbmNsdWRlIDxDMlBhcmFtLmg+CisjaW5jbHVkZSA8QzJQYXJhbURlZi5oPgorI2luY2x1ZGUgPEMyUGFyYW1JbnRlcm5hbC5oPgorI2luY2x1ZGUgPHV0aWwvQzJJbnRlcmZhY2VVdGlscy5oPgorCisjaW5jbHVkZSA8Y21hdGg+CisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdwcmludGYuaD4KKworc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IF9DMkZpZWxkSWQgJmkpOworCitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJQYXJhbUZpZWxkICZpKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDMlN1cHBvcnRlZFJhbmdlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqCisgKiBIZWxwZXIgY2xhc3MgZm9yIHN1cHBvcnRlZCB2YWx1ZXMgcmFuZ2UgY2FsY3VsYXRpb25zLgorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCBib29sIEZQPXN0ZDo6aXNfZmxvYXRpbmdfcG9pbnQ8VD46OnZhbHVlPgorc3RydWN0IF9DMlR5cGVkU3VwcG9ydGVkUmFuZ2VIZWxwZXIgeworICAgIC8qKgorICAgICAqIHR5cGUgb2YgcmFuZ2Ugc2l6ZTogYSAtIGIgaWYgYSA+PSBiIGFuZCBhIGFuZCBiIGFyZSBvZiB0eXBlIFQKKyAgICAgKi8KKyAgICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6bWFrZV91bnNpZ25lZDxUPjo6dHlwZSBEaWZmVHlwZTsKKworICAgIC8qKgorICAgICAqIGNhbGN1bGF0ZSAoaGlnaCAtIGxvdykgbW9kIHN0ZXAKKyAgICAgKi8KKyAgICBzdGF0aWMgRGlmZlR5cGUgbW9kKFQgbG93LCBUIGhpZ2gsIFQgc3RlcCkgeworICAgICAgICByZXR1cm4gRGlmZlR5cGUoaGlnaCAtIGxvdykgJSBEaWZmVHlwZShzdGVwKTsKKyAgICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IF9DMlR5cGVkU3VwcG9ydGVkUmFuZ2VIZWxwZXI8VCwgdHJ1ZT4geworICAgIHR5cGVkZWYgVCBEaWZmVHlwZTsKKworICAgIHN0YXRpYyBEaWZmVHlwZSBtb2QoVCBsb3csIFQgaGlnaCwgVCBzdGVwKSB7CisgICAgICAgIHJldHVybiBmbW9kKGhpZ2ggLSBsb3csIHN0ZXApOworICAgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitDMlN1cHBvcnRlZFJhbmdlPFQ+OjpDMlN1cHBvcnRlZFJhbmdlKGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgJnZhbHVlcykgeworICAgIGlmICh2YWx1ZXMudHlwZSA9PSBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjpSQU5HRSkgeworICAgICAgICBfbU1pbiA9IHZhbHVlcy5yYW5nZS5taW4ucmVmPFZhbHVlVHlwZT4oKTsKKyAgICAgICAgX21NYXggPSB2YWx1ZXMucmFuZ2UubWF4LnJlZjxWYWx1ZVR5cGU+KCk7CisgICAgICAgIF9tU3RlcCA9IHZhbHVlcy5yYW5nZS5zdGVwLnJlZjxWYWx1ZVR5cGU+KCk7CisgICAgICAgIF9tTnVtID0gdmFsdWVzLnJhbmdlLm51bS5yZWY8VmFsdWVUeXBlPigpOworICAgICAgICBfbURlbm9tID0gdmFsdWVzLnJhbmdlLmRlbm9tLnJlZjxWYWx1ZVR5cGU+KCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX21NaW4gPSBNQVhfVkFMVUU7CisgICAgICAgIF9tTWF4ID0gTUlOX1ZBTFVFOworICAgICAgICBfbVN0ZXAgPSBNSU5fU1RFUDsKKyAgICAgICAgX21OdW0gPSAwOworICAgICAgICBfbURlbm9tID0gMDsKKyAgICB9Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+Citib29sIEMyU3VwcG9ydGVkUmFuZ2U8VD46OmNvbnRhaW5zKFQgdmFsdWUpIGNvbnN0IHsKKyAgICAvLyB2YWx1ZSBtdXN0IGZhbGwgYmV0d2VlbiBtaW4gYW5kIG1heAorICAgIGlmICh2YWx1ZSA8IF9tTWluIHx8IHZhbHVlID4gX21NYXgpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAvLyBzaW1wbGUgcmFuZ2VzIGNvbnRhaW4gYWxsIHZhbHVlcyBiZXR3ZWVuIG1pbiBhbmQgbWF4CisgICAgaWYgKGlzU2ltcGxlUmFuZ2UoKSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgLy8gbWluIGlzIGFsd2F5cyBwYXJ0IG9mIHRoZSByYW5nZQorICAgIGlmICh2YWx1ZSA9PSBfbU1pbikgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgLy8gc3RlcHBlZCByYW5nZXMgcmVxdWlyZSAodmFsIC0gbWluKSAlIHN0ZXAgdG8gYmUgemVybworICAgIGlmIChpc0FyaXRobWV0aWNTZXJpZXMoKSkgeworICAgICAgICByZXR1cm4gX0MyVHlwZWRTdXBwb3J0ZWRSYW5nZUhlbHBlcjxUPjo6bW9kKF9tTWluLCB2YWx1ZSwgX21TdGVwKSA9PSAwOworICAgIH0KKyAgICAvLyBwdXJlIGdlb21ldHJpYyBzZXJpZXMgcmVxdWlyZSAodmFsIC8gbWluKSB0byBiZSBpbnRlZ2VyIG11bHRpcGxlIG9mIChudW0vZGVub20pCisgICAgaWYgKGlzR2VvbWV0cmljU2VyaWVzKCkpIHsKKyAgICAgICAgaWYgKHZhbHVlIDw9IDApIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBkb3VibGUgbG9nMmJhc2UgPSBsb2cyKF9tTnVtIC8gX21EZW5vbSk7CisgICAgICAgIGRvdWJsZSBwb3dlciA9IGxscm91bmQobG9nMih2YWx1ZSAvIGRvdWJsZShfbU1pbikpIC8gbG9nMmJhc2UpOworICAgICAgICAvLyBUT0RPOiB2YWxpZGF0ZSB0aGF0IHJlc3VsdCBmYWxscyB3aXRoaW4gcHJlY2lzaW9uIChvdGhlciB0aGFuIHJvdW5kKQorICAgICAgICByZXR1cm4gdmFsdWUgPT0gVChfbU1pbiAqIHBvdyhfbU51bSAvIF9tRGVub20sIHBvd2VyKSArIE1JTl9TVEVQIC8gMik7CisgICAgfQorICAgIC8vIG11bHRpcGx5LWFjY3VtdWxhdGUgc2VyaWVzIHJlcXVpcmUgdmFsaWRhdGluZyBieSB3YWxraW5nIHRocm91Z2ggdGhlIHNlcmllcworICAgIGlmIChpc01hY1NlcmllcygpKSB7CisgICAgICAgIGRvdWJsZSBsYXN0VmFsdWUgPSBfbU1pbjsKKyAgICAgICAgZG91YmxlIGJhc2UgPSBfbU51bSAvIF9tRGVub207CisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICAvLyB0aGlzIGNhc3QgaXMgc2FmZSBhcyBfbU1pbiA8PSBsYXN0VmFsdWUgPD0gX21NYXgKKyAgICAgICAgICAgIGlmIChUKGxhc3RWYWx1ZSArIE1JTl9TVEVQIC8gMikgPT0gdmFsdWUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRvdWJsZSBuZXh0VmFsdWUgPSBmbWEobGFzdFZhbHVlLCBiYXNlLCBfbVN0ZXApOworICAgICAgICAgICAgaWYgKG5leHRWYWx1ZSA8PSBsYXN0VmFsdWUgfHwgbmV4dFZhbHVlID4gX21NYXgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vIHNlcmllcyBpcyBubyBsb25nZXIgbW9ub3RvbmljIG9yIHdpdGhpbiByYW5nZQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbGFzdFZhbHVlID0gbmV4dFZhbHVlOworICAgICAgICB9OworICAgIH0KKyAgICAvLyBpZiB3ZSBhcmUgaGVyZSwgdGhpcyBtdXN0IGJlIGFuIGludmFsaWQgcmFuZ2UKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitDMlN1cHBvcnRlZFJhbmdlPFQ+IEMyU3VwcG9ydGVkUmFuZ2U8VD46OmxpbWl0ZWRUbyhjb25zdCBDMlN1cHBvcnRlZFJhbmdlPFQ+ICZsaW1pdCkgY29uc3QgeworICAgIC8vIFRPRE8gLSB0aGlzIG9ubHkgd29ya3MgZm9yIHNpbXBsZSByYW5nZXMKKyAgICByZXR1cm4gQzJTdXBwb3J0ZWRSYW5nZShzdGQ6Om1heChfbU1pbiwgbGltaXQuX21NaW4pLCBzdGQ6Om1pbihfbU1heCwgbGltaXQuX21NYXgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYXgoX21TdGVwLCBsaW1pdC5fbVN0ZXApKTsKK30KKwordGVtcGxhdGUgY2xhc3MgQzJTdXBwb3J0ZWRSYW5nZTx1aW50OF90PjsKK3RlbXBsYXRlIGNsYXNzIEMyU3VwcG9ydGVkUmFuZ2U8Y2hhcj47Cit0ZW1wbGF0ZSBjbGFzcyBDMlN1cHBvcnRlZFJhbmdlPGludDMyX3Q+OwordGVtcGxhdGUgY2xhc3MgQzJTdXBwb3J0ZWRSYW5nZTx1aW50MzJfdD47CisvL3RlbXBsYXRlIGNsYXNzIEMyU3VwcG9ydGVkUmFuZ2U8YzJfY250cjMyX3Q+OwordGVtcGxhdGUgY2xhc3MgQzJTdXBwb3J0ZWRSYW5nZTxpbnQ2NF90PjsKK3RlbXBsYXRlIGNsYXNzIEMyU3VwcG9ydGVkUmFuZ2U8dWludDY0X3Q+OworLy90ZW1wbGF0ZSBjbGFzcyBDMlN1cHBvcnRlZFJhbmdlPGMyX2NudHI2NF90PjsKK3RlbXBsYXRlIGNsYXNzIEMyU3VwcG9ydGVkUmFuZ2U8ZmxvYXQ+OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDMlN1cHBvcnRlZEZsYWdzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKgorICogT3JkZXJlZCBzdXBwb3J0ZWQgZmxhZyBzZXQgZm9yIGEgZmllbGQgb2YgYSBnaXZlbiB0eXBlLgorICovCisvLyBmbG9hdCBmbGFncyBhcmUgbm90IHN1cHBvcnRlZCwgYnV0IGRlZmluZSBhIGZldyBtZXRob2RzIHRvIHN1cHBvcnQgZ2VuZXJpYyBzdXBwb3J0ZWQgdmFsdWVzIGNvZGUKK3RlbXBsYXRlPD4KK2Jvb2wgQzJTdXBwb3J0ZWRGbGFnczxmbG9hdD46OmNvbnRhaW5zKGZsb2F0IHZhbHVlKSBjb25zdCB7CisgICAgcmV0dXJuIGZhbHNlOworfQorCit0ZW1wbGF0ZTw+Citjb25zdCBzdGQ6OnZlY3RvcjxmbG9hdD4gQzJTdXBwb3J0ZWRGbGFnczxmbG9hdD46OmZsYWdzKCkgY29uc3QgeworICAgIHJldHVybiBzdGQ6OnZlY3RvcjxmbG9hdD4oKTsKK30KKwordGVtcGxhdGU8PgorQzJTdXBwb3J0ZWRGbGFnczxmbG9hdD4gQzJTdXBwb3J0ZWRGbGFnczxmbG9hdD46OmxpbWl0ZWRUbyhjb25zdCBDMlN1cHBvcnRlZEZsYWdzPGZsb2F0PiAmbGltaXQpIGNvbnN0IHsKKyAgICBzdGQ6OnZlY3RvcjxDMlZhbHVlOjpQcmltaXRpdmU+IHZhbHVlczsKKyAgICByZXR1cm4gQzJTdXBwb3J0ZWRGbGFncyhzdGQ6Om1vdmUodmFsdWVzKSk7Cit9CisKK3RlbXBsYXRlPD4KK2Zsb2F0IEMyU3VwcG9ydGVkRmxhZ3M8ZmxvYXQ+OjptaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIDA7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+Citib29sIEMyU3VwcG9ydGVkRmxhZ3M8VD46OmNvbnRhaW5zKFQgdmFsdWUpIGNvbnN0IHsKKyAgICAvLyB2YWx1ZSBtdXN0IGNvbnRhaW4gdGhlIG1pbmltYWwgbWFzaworICAgIFQgbWluTWFzayA9IG1pbigpOworICAgIGlmICh+dmFsdWUgJiBtaW5NYXNrKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgdmFsdWUgJj0gfm1pbk1hc2s7CisgICAgLy8gb3RoZXJ3aXNlLCByZW1vdmUgZmxhZ3MgZnJvbSB2YWx1ZSBhbmQgc2VlIGlmIHdlIGFycml2ZSBhdCAwCisgICAgZm9yIChjb25zdCBDMlZhbHVlOjpQcmltaXRpdmUgJnYgOiBfbVZhbHVlcykgeworICAgICAgICBpZiAodmFsdWUgPT0gMCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCh+dmFsdWUgJiB2LnJlZjxWYWx1ZVR5cGU+KCkpID09IDApIHsKKyAgICAgICAgICAgIHZhbHVlICY9IH52LnJlZjxWYWx1ZVR5cGU+KCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHZhbHVlID09IDA7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+Citjb25zdCBzdGQ6OnZlY3RvcjxUPiBDMlN1cHBvcnRlZEZsYWdzPFQ+OjpmbGFncygpIGNvbnN0IHsKKyAgICBzdGQ6OnZlY3RvcjxUPiB2YWxzKGMyX21heChfbVZhbHVlcy5zaXplKCksIDF1KSAtIDEpOworICAgIGlmICghX21WYWx1ZXMuZW1wdHkoKSkgeworICAgICAgICBzdGQ6OnRyYW5zZm9ybShfbVZhbHVlcy5jYmVnaW4oKSArIDEsIF9tVmFsdWVzLmNlbmQoKSwgdmFscy5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICBbXShjb25zdCBDMlZhbHVlOjpQcmltaXRpdmUgJnApLT5UIHsKKyAgICAgICAgICAgIHJldHVybiBwLnJlZjxWYWx1ZVR5cGU+KCk7CisgICAgICAgIH0pOworICAgIH0KKyAgICByZXR1cm4gdmFsczsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK0MyU3VwcG9ydGVkRmxhZ3M8VD4gQzJTdXBwb3J0ZWRGbGFnczxUPjo6bGltaXRlZFRvKGNvbnN0IEMyU3VwcG9ydGVkRmxhZ3M8VD4gJmxpbWl0KSBjb25zdCB7CisgICAgc3RkOjp2ZWN0b3I8QzJWYWx1ZTo6UHJpbWl0aXZlPiB2YWx1ZXMgPSBfbVZhbHVlczsgLy8gbWFrZSBhIGNvcHkKKyAgICBUIG1pbk1hc2sgPSBtaW4oKSB8IGxpbWl0Lm1pbigpOworICAgIC8vIG1pbmltdW0gbWFzayBtdXN0IGJlIGNvdmVyZWQgYnkgYm90aCB0aGlzIGFuZCBvdGhlcgorICAgIGlmIChsaW1pdC5jb250YWlucyhtaW5NYXNrKSAmJiBjb250YWlucyhtaW5NYXNrKSkgeworICAgICAgICB2YWx1ZXNbMF0gPSBtaW5NYXNrOworICAgICAgICAvLyBrZWVwIG9ubHkgZmxhZ3MgdGhhdCBhcmUgY292ZXJlZCBieSBsaW1pdAorICAgICAgICBzdGQ6OnJlbW92ZV9pZih2YWx1ZXMuYmVnaW4oKSwgdmFsdWVzLmVuZCgpLCBbJmxpbWl0LCBtaW5NYXNrXShjb25zdCBDMlZhbHVlOjpQcmltaXRpdmUgJnYpIC0+IGJvb2wgeworICAgICAgICAgICAgVCB2YWx1ZSA9IHYucmVmPFZhbHVlVHlwZT4oKSB8IG1pbk1hc2s7CisgICAgICAgICAgICByZXR1cm4gdmFsdWUgPT0gbWluTWFzayB8fCAhbGltaXQuY29udGFpbnModmFsdWUpOyB9KTsKKyAgICAgICAgLy8gd2UgYWxzbyBuZWVkIHRvIGRvIGl0IHZpY2UgdmVyc2EKKyAgICAgICAgZm9yIChjb25zdCBDMlZhbHVlOjpQcmltaXRpdmUgJnYgOiBfbVZhbHVlcykgeworICAgICAgICAgICAgVCB2YWx1ZSA9IHYucmVmPFZhbHVlVHlwZT4oKSB8IG1pbk1hc2s7CisgICAgICAgICAgICBpZiAodmFsdWUgIT0gbWluTWFzayAmJiBjb250YWlucyh2YWx1ZSkpIHsKKyAgICAgICAgICAgICAgICB2YWx1ZXMuZW1wbGFjZV9iYWNrKChWYWx1ZVR5cGUpdmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBDMlN1cHBvcnRlZEZsYWdzKHN0ZDo6bW92ZSh2YWx1ZXMpKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK1QgQzJTdXBwb3J0ZWRGbGFnczxUPjo6bWluKCkgY29uc3QgeworICAgIGlmICghX21WYWx1ZXMuZW1wdHkoKSkgeworICAgICAgICByZXR1cm4gX21WYWx1ZXMuZnJvbnQoKS50ZW1wbGF0ZSByZWY8VmFsdWVUeXBlPigpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBUKDApOworICAgIH0KK30KKwordGVtcGxhdGUgY2xhc3MgQzJTdXBwb3J0ZWRGbGFnczx1aW50OF90PjsKK3RlbXBsYXRlIGNsYXNzIEMyU3VwcG9ydGVkRmxhZ3M8Y2hhcj47Cit0ZW1wbGF0ZSBjbGFzcyBDMlN1cHBvcnRlZEZsYWdzPGludDMyX3Q+OwordGVtcGxhdGUgY2xhc3MgQzJTdXBwb3J0ZWRGbGFnczx1aW50MzJfdD47CisvL3RlbXBsYXRlIGNsYXNzIEMyU3VwcG9ydGVkRmxhZ3M8YzJfY250cjMyX3Q+OwordGVtcGxhdGUgY2xhc3MgQzJTdXBwb3J0ZWRGbGFnczxpbnQ2NF90PjsKK3RlbXBsYXRlIGNsYXNzIEMyU3VwcG9ydGVkRmxhZ3M8dWludDY0X3Q+OworLy90ZW1wbGF0ZSBjbGFzcyBDMlN1cHBvcnRlZEZsYWdzPGMyX2NudHI2NF90PjsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQzJTdXBwb3J0ZWRWYWx1ZVNldCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioKKyAqIE9yZGVyZWQgc3VwcG9ydGVkIHZhbHVlIHNldCBmb3IgYSBmaWVsZCBvZiBhIGdpdmVuIHR5cGUuCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+Citib29sIEMyU3VwcG9ydGVkVmFsdWVTZXQ8VD46OmNvbnRhaW5zKFQgdmFsdWUpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjpmaW5kX2lmKF9tVmFsdWVzLmNiZWdpbigpLCBfbVZhbHVlcy5jZW5kKCksCisgICAgICAgICAgICBbdmFsdWVdKGNvbnN0IEMyVmFsdWU6OlByaW1pdGl2ZSAmcCkgLT4gYm9vbCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlID09IHAucmVmPFZhbHVlVHlwZT4oKTsKKyAgICAgICAgICAgIH0pICE9IF9tVmFsdWVzLmNlbmQoKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK0MyU3VwcG9ydGVkVmFsdWVTZXQ8VD4gQzJTdXBwb3J0ZWRWYWx1ZVNldDxUPjo6bGltaXRlZFRvKGNvbnN0IEMyU3VwcG9ydGVkVmFsdWVTZXQ8VD4gJmxpbWl0KSBjb25zdCB7CisgICAgc3RkOjp2ZWN0b3I8QzJWYWx1ZTo6UHJpbWl0aXZlPiB2YWx1ZXMgPSBfbVZhbHVlczsgLy8gbWFrZSBhIGNvcHkKKyAgICBzdGQ6OnJlbW92ZV9pZih2YWx1ZXMuYmVnaW4oKSwgdmFsdWVzLmVuZCgpLCBbJmxpbWl0XShjb25zdCBDMlZhbHVlOjpQcmltaXRpdmUgJnYpIC0+IGJvb2wgeworICAgICAgICByZXR1cm4gIWxpbWl0LmNvbnRhaW5zKHYucmVmPFZhbHVlVHlwZT4oKSk7IH0pOworICAgIHJldHVybiBDMlN1cHBvcnRlZFZhbHVlU2V0KHN0ZDo6bW92ZSh2YWx1ZXMpKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK0MyU3VwcG9ydGVkVmFsdWVTZXQ8VD4gQzJTdXBwb3J0ZWRWYWx1ZVNldDxUPjo6bGltaXRlZFRvKGNvbnN0IEMyU3VwcG9ydGVkUmFuZ2U8VD4gJmxpbWl0KSBjb25zdCB7CisgICAgc3RkOjp2ZWN0b3I8QzJWYWx1ZTo6UHJpbWl0aXZlPiB2YWx1ZXMgPSBfbVZhbHVlczsgLy8gbWFrZSBhIGNvcHkKKyAgICBzdGQ6OnJlbW92ZV9pZih2YWx1ZXMuYmVnaW4oKSwgdmFsdWVzLmVuZCgpLCBbJmxpbWl0XShjb25zdCBDMlZhbHVlOjpQcmltaXRpdmUgJnYpIC0+IGJvb2wgeworICAgICAgICByZXR1cm4gIWxpbWl0LmNvbnRhaW5zKHYucmVmPFZhbHVlVHlwZT4oKSk7IH0pOworICAgIHJldHVybiBDMlN1cHBvcnRlZFZhbHVlU2V0KHN0ZDo6bW92ZSh2YWx1ZXMpKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK0MyU3VwcG9ydGVkVmFsdWVTZXQ8VD4gQzJTdXBwb3J0ZWRWYWx1ZVNldDxUPjo6bGltaXRlZFRvKGNvbnN0IEMyU3VwcG9ydGVkRmxhZ3M8VD4gJmxpbWl0KSBjb25zdCB7CisgICAgc3RkOjp2ZWN0b3I8QzJWYWx1ZTo6UHJpbWl0aXZlPiB2YWx1ZXMgPSBfbVZhbHVlczsgLy8gbWFrZSBhIGNvcHkKKyAgICBzdGQ6OnJlbW92ZV9pZih2YWx1ZXMuYmVnaW4oKSwgdmFsdWVzLmVuZCgpLCBbJmxpbWl0XShjb25zdCBDMlZhbHVlOjpQcmltaXRpdmUgJnYpIC0+IGJvb2wgeworICAgICAgICByZXR1cm4gIWxpbWl0LmNvbnRhaW5zKHYucmVmPFZhbHVlVHlwZT4oKSk7IH0pOworICAgIHJldHVybiBDMlN1cHBvcnRlZFZhbHVlU2V0KHN0ZDo6bW92ZSh2YWx1ZXMpKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2NvbnN0IHN0ZDo6dmVjdG9yPFQ+IEMyU3VwcG9ydGVkVmFsdWVTZXQ8VD46OnZhbHVlcygpIGNvbnN0IHsKKyAgICBzdGQ6OnZlY3RvcjxUPiB2YWxzKF9tVmFsdWVzLnNpemUoKSk7CisgICAgc3RkOjp0cmFuc2Zvcm0oX21WYWx1ZXMuY2JlZ2luKCksIF9tVmFsdWVzLmNlbmQoKSwgdmFscy5iZWdpbigpLCBbXShjb25zdCBDMlZhbHVlOjpQcmltaXRpdmUgJnApIC0+IFQgeworICAgICAgICByZXR1cm4gcC5yZWY8VmFsdWVUeXBlPigpOworICAgIH0pOworICAgIHJldHVybiB2YWxzOworfQorCit0ZW1wbGF0ZSBjbGFzcyBDMlN1cHBvcnRlZFZhbHVlU2V0PHVpbnQ4X3Q+OwordGVtcGxhdGUgY2xhc3MgQzJTdXBwb3J0ZWRWYWx1ZVNldDxjaGFyPjsKK3RlbXBsYXRlIGNsYXNzIEMyU3VwcG9ydGVkVmFsdWVTZXQ8aW50MzJfdD47Cit0ZW1wbGF0ZSBjbGFzcyBDMlN1cHBvcnRlZFZhbHVlU2V0PHVpbnQzMl90PjsKKy8vdGVtcGxhdGUgY2xhc3MgQzJTdXBwb3J0ZWRWYWx1ZVNldDxjMl9jbnRyMzJfdD47Cit0ZW1wbGF0ZSBjbGFzcyBDMlN1cHBvcnRlZFZhbHVlU2V0PGludDY0X3Q+OwordGVtcGxhdGUgY2xhc3MgQzJTdXBwb3J0ZWRWYWx1ZVNldDx1aW50NjRfdD47CisvL3RlbXBsYXRlIGNsYXNzIEMyU3VwcG9ydGVkVmFsdWVTZXQ8YzJfY250cjY0X3Q+OwordGVtcGxhdGUgY2xhc3MgQzJTdXBwb3J0ZWRWYWx1ZVNldDxmbG9hdD47CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPjo6SW1wbCB7CisgICAgSW1wbChjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzICZ2YWx1ZXMpCisgICAgICAgIDogX21UeXBlKHZhbHVlcy50eXBlKSwKKyAgICAgICAgICBfbVJhbmdlKHZhbHVlcyksCisgICAgICAgICAgX21WYWx1ZXModmFsdWVzKSwKKyAgICAgICAgICBfbUZsYWdzKHZhbHVlcykgeyB9CisKKyAgICBib29sIHN1cHBvcnRzKFQgdmFsdWUpIGNvbnN0OworCitwcml2YXRlOgorICAgIHR5cGVkZWYgdHlwZW5hbWUgX0MyRmllbGRWYWx1ZUhlbHBlcjxUPjo6VmFsdWVUeXBlIFZhbHVlVHlwZTsKKyAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjp0eXBlX3QgX21UeXBlOworICAgIEMyU3VwcG9ydGVkUmFuZ2U8VmFsdWVUeXBlPiBfbVJhbmdlOworICAgIEMyU3VwcG9ydGVkVmFsdWVTZXQ8VmFsdWVUeXBlPiBfbVZhbHVlczsKKyAgICBDMlN1cHBvcnRlZFZhbHVlU2V0PFZhbHVlVHlwZT4gX21GbGFnczsKKworLy8gICAgZnJpZW5kIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PCA8VD4oc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPjo6SW1wbCAmaSk7CisvLyAgICBmcmllbmQgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEltcGwgJmkpOworICAgIHN0ZDo6b3N0cmVhbSYgc3RyZWFtT3V0KHN0ZDo6b3N0cmVhbSYgb3MpIGNvbnN0OworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2Jvb2wgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPjo6SW1wbDo6c3VwcG9ydHMoVCB2YWx1ZSkgY29uc3QgeworICAgIHN3aXRjaCAoX21UeXBlKSB7CisgICAgICAgIGNhc2UgQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6UkFOR0U6IHJldHVybiBfbVJhbmdlLmNvbnRhaW5zKHZhbHVlKTsKKyAgICAgICAgY2FzZSBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjpWQUxVRVM6IHJldHVybiBfbVZhbHVlcy5jb250YWlucyh2YWx1ZSk7CisgICAgICAgIGNhc2UgQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6RkxBR1M6IHJldHVybiBfbUZsYWdzLmNvbnRhaW5zKHZhbHVlKTsKKyAgICAgICAgZGVmYXVsdDogcmV0dXJuIGZhbHNlOworICAgIH0KK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK0MyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD46OkMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXIoY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyAmdmFsdWVzKQorICAgIDogX21JbXBsKHN0ZDo6bWFrZV91bmlxdWU8QzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPjo6SW1wbD4odmFsdWVzKSkgeyB9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+Ojp+QzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcigpID0gZGVmYXVsdDsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2Jvb2wgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPjo6c3VwcG9ydHMoVCB2YWx1ZSkgY29uc3QgeworICAgIHJldHVybiBfbUltcGwtPnN1cHBvcnRzKHZhbHVlKTsKK30KKwordGVtcGxhdGUgY2xhc3MgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjx1aW50OF90PjsKK3RlbXBsYXRlIGNsYXNzIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8Y2hhcj47Cit0ZW1wbGF0ZSBjbGFzcyBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPGludDMyX3Q+OwordGVtcGxhdGUgY2xhc3MgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjx1aW50MzJfdD47CisvL3RlbXBsYXRlIGNsYXNzIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8YzJfY250cjMyX3Q+OwordGVtcGxhdGUgY2xhc3MgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxpbnQ2NF90PjsKK3RlbXBsYXRlIGNsYXNzIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8dWludDY0X3Q+OworLy90ZW1wbGF0ZSBjbGFzcyBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPGMyX2NudHI2NF90PjsKK3RlbXBsYXRlIGNsYXNzIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8ZmxvYXQ+OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPjo6SW1wbCB7CisgICAgSW1wbChjb25zdCBDMlBhcmFtRmllbGQgJmZpZWxkKQorICAgICAgICA6IF9tUGFyYW1GaWVsZChmaWVsZCksCisgICAgICAgICAgX21UeXBlKHR5cGVfdDo6UkFOR0UpLAorICAgICAgICAgIF9tRGVmaW5lZChmYWxzZSksCisgICAgICAgICAgX21SYW5nZShDMlN1cHBvcnRlZFJhbmdlPFQ+OjpBbnkoKSksCisgICAgICAgICAgX21WYWx1ZXMoQzJTdXBwb3J0ZWRWYWx1ZVNldDxUPjo6Tm9uZSgpKSwKKyAgICAgICAgICBfbUZsYWdzKEMyU3VwcG9ydGVkRmxhZ3M8VD46Ok5vbmUoKSkgeyB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgQzJQYXJhbUZpZWxkVmFsdWVzIGZyb20gdGhpcyBidWlsZGVyLgorICAgICAqLworICAgIG9wZXJhdG9yIEMyUGFyYW1GaWVsZFZhbHVlcygpIGNvbnN0IHsKKyAgICAgICAgaWYgKCFfbURlZmluZWQpIHsKKyAgICAgICAgICAgIHJldHVybiBDMlBhcmFtRmllbGRWYWx1ZXMoX21QYXJhbUZpZWxkKTsKKyAgICAgICAgfQorICAgICAgICBzd2l0Y2ggKF9tVHlwZSkgeworICAgICAgICBjYXNlIHR5cGVfdDo6RU1QVFk6CisgICAgICAgIGNhc2UgdHlwZV90OjpWQUxVRVM6CisgICAgICAgICAgICByZXR1cm4gQzJQYXJhbUZpZWxkVmFsdWVzKF9tUGFyYW1GaWVsZCwgKEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMpX21WYWx1ZXMpOworICAgICAgICBjYXNlIHR5cGVfdDo6UkFOR0U6CisgICAgICAgICAgICByZXR1cm4gQzJQYXJhbUZpZWxkVmFsdWVzKF9tUGFyYW1GaWVsZCwgKEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMpX21SYW5nZSk7CisgICAgICAgIGNhc2UgdHlwZV90OjpGTEFHUzoKKyAgICAgICAgICAgIHJldHVybiBDMlBhcmFtRmllbGRWYWx1ZXMoX21QYXJhbUZpZWxkLCAoQzJGaWVsZFN1cHBvcnRlZFZhbHVlcylfbUZsYWdzKTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIC8vIFRSRVNQQVNTCisgICAgICAgICAgICAvLyBzaG91bGQgbmV2ZXIgZ2V0IGhlcmUKKyAgICAgICAgICAgIHJldHVybiBDMlBhcmFtRmllbGRWYWx1ZXMoX21QYXJhbUZpZWxkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKiBEZWZpbmUgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgYXMgdGhlIGN1cnJlbnRseSBzdXBwb3J0ZWQgdmFsdWVzIG9mIHRoaXMgYnVpbGRlci4gKi8KKyAgICB2b2lkIGFueSgpIHsKKyAgICAgICAgX21EZWZpbmVkID0gdHJ1ZTsKKyAgICB9CisKKyAgICAvKiogUmVzdHJpY3QgKGFuZCB0aHVzIGRlZmluZSkgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgdG8gbm9uZS4gKi8KKyAgICB2b2lkIG5vbmUoKSB7CisgICAgICAgIF9tRGVmaW5lZCA9IHRydWU7CisgICAgICAgIF9tVHlwZSA9IHR5cGVfdDo6VkFMVUVTOworICAgICAgICBfbVZhbHVlcy5jbGVhcigpOworICAgIH0KKworICAgIC8qKiBSZXN0cmljdCAoYW5kIHRodXMgZGVmaW5lKSB0aGUgc3VwcG9ydGVkIHZhbHVlcyB0byB8dmFsdWV8IGFsb25lLiAqLworICAgIHZvaWQgZXF1YWxUbyhUIHZhbHVlKSB7CisgICAgICAgICByZXR1cm4gbGltaXRUbyhDMlN1cHBvcnRlZFZhbHVlU2V0PFQ+OjpPbmVPZih7dmFsdWV9KSk7CisgICAgfQorCisgICAgLyoqIFJlc3RyaWN0IChhbmQgdGh1cyBkZWZpbmUpIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIHRvIGEgdmFsdWUgc2V0LiAqLworICAgIHZvaWQgbGltaXRUbyhjb25zdCBDMlN1cHBvcnRlZFZhbHVlU2V0PFQ+ICZsaW1pdCkgeworICAgICAgICBpZiAoIV9tRGVmaW5lZCkgeworICAgICAgICAgICAgQzJfTE9HKFZFUkJPU0UpIDw8ICJOQS5saW1pdFRvKCIgPDwgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPihsaW1pdCkgPDwgIikiOworCisgICAgICAgICAgICAvLyBzaG9ydGN1dCBmb3IgZmlyc3QgbGltaXQgYXBwbGllZAorICAgICAgICAgICAgX21EZWZpbmVkID0gdHJ1ZTsKKyAgICAgICAgICAgIF9tVmFsdWVzID0gbGltaXQ7CisgICAgICAgICAgICBfbVR5cGUgPSBfbVZhbHVlcy5pc0VtcHR5KCkgPyB0eXBlX3Q6OkVNUFRZIDogdHlwZV90OjpWQUxVRVM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzd2l0Y2ggKF9tVHlwZSkgeworICAgICAgICAgICAgY2FzZSB0eXBlX3Q6OkVNUFRZOgorICAgICAgICAgICAgY2FzZSB0eXBlX3Q6OlZBTFVFUzoKKyAgICAgICAgICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgIigiIDw8IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD4oX21WYWx1ZXMpIDw8ICIpLmxpbWl0VG8oIgorICAgICAgICAgICAgICAgICAgICAgICAgPDwgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPihsaW1pdCkgPDwgIikiOworCisgICAgICAgICAgICAgICAgX21WYWx1ZXMgPSBfbVZhbHVlcy5saW1pdGVkVG8obGltaXQpOworICAgICAgICAgICAgICAgIF9tVHlwZSA9IF9tVmFsdWVzLmlzRW1wdHkoKSA/IHR5cGVfdDo6RU1QVFkgOiB0eXBlX3Q6OlZBTFVFUzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgdHlwZV90OjpSQU5HRToKKyAgICAgICAgICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgIigiIDw8IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD4oX21SYW5nZSkgPDwgIikubGltaXRUbygiCisgICAgICAgICAgICAgICAgICAgICAgICA8PCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+KGxpbWl0KSA8PCAiKSI7CisKKyAgICAgICAgICAgICAgICBfbVZhbHVlcyA9IGxpbWl0LmxpbWl0ZWRUbyhfbVJhbmdlKTsKKyAgICAgICAgICAgICAgICBfbVR5cGUgPSBfbVZhbHVlcy5pc0VtcHR5KCkgPyB0eXBlX3Q6OkVNUFRZIDogdHlwZV90OjpWQUxVRVM7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIHR5cGVfdDo6RkxBR1M6CisgICAgICAgICAgICAgICAgQzJfTE9HKFZFUkJPU0UpIDw8ICIoIiA8PCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+KF9tUmFuZ2UpIDw8ICIpLmxpbWl0VG8oIgorICAgICAgICAgICAgICAgICAgICAgICAgPDwgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPihsaW1pdCkgPDwgIikiOworCisgICAgICAgICAgICAgICAgX21WYWx1ZXMgPSBsaW1pdC5saW1pdGVkVG8oX21GbGFncyk7CisgICAgICAgICAgICAgICAgX21UeXBlID0gX21WYWx1ZXMuaXNFbXB0eSgpID8gdHlwZV90OjpFTVBUWSA6IHR5cGVfdDo6VkFMVUVTOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBDMl9MT0coRkFUQUwpOyAvLyBzaG91bGQgbm90IGJlIGhlcmUKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFRPRE86IHN1cHBvcnQgZmxhZ3MKKyAgICAgICAgfQorICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgIiA9ICIgPDwgX21UeXBlIDw8ICI6IiA8PCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+KF9tVmFsdWVzKTsKKyAgICB9CisKKyAgICAvKiogUmVzdHJpY3QgKGFuZCB0aHVzIGRlZmluZSkgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgdG8gYSBmbGFnIHNldC4gKi8KKyAgICB2b2lkIGxpbWl0VG8oY29uc3QgQzJTdXBwb3J0ZWRGbGFnczxUPiAmbGltaXQpIHsKKyAgICAgICAgaWYgKCFfbURlZmluZWQpIHsKKyAgICAgICAgICAgIEMyX0xPRyhWRVJCT1NFKSA8PCAiTkEubGltaXRUbygiIDw8IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD4obGltaXQpIDw8ICIpIjsKKworICAgICAgICAgICAgLy8gc2hvcnRjdXQgZm9yIGZpcnN0IGxpbWl0IGFwcGxpZWQKKyAgICAgICAgICAgIF9tRGVmaW5lZCA9IHRydWU7CisgICAgICAgICAgICBfbUZsYWdzID0gbGltaXQ7CisgICAgICAgICAgICBfbVR5cGUgPSBfbUZsYWdzLmlzRW1wdHkoKSA/IHR5cGVfdDo6RU1QVFkgOiB0eXBlX3Q6OkZMQUdTOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3dpdGNoIChfbVR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgdHlwZV90OjpFTVBUWToKKyAgICAgICAgICAgIGNhc2UgdHlwZV90OjpWQUxVRVM6CisgICAgICAgICAgICAgICAgQzJfTE9HKFZFUkJPU0UpIDw8ICIoIiA8PCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+KF9tVmFsdWVzKSA8PCAiKS5saW1pdFRvKCIKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD4obGltaXQpIDw8ICIpIjsKKworICAgICAgICAgICAgICAgIF9tVmFsdWVzID0gX21WYWx1ZXMubGltaXRlZFRvKGxpbWl0KTsKKyAgICAgICAgICAgICAgICBfbVR5cGUgPSBfbVZhbHVlcy5pc0VtcHR5KCkgPyB0eXBlX3Q6OkVNUFRZIDogdHlwZV90OjpWQUxVRVM7CisgICAgICAgICAgICAgICAgQzJfTE9HKFZFUkJPU0UpIDw8ICIgPSAiIDw8IF9tVHlwZSA8PCAiOiIgPDwgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPihfbVZhbHVlcyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIHR5cGVfdDo6RkxBR1M6CisgICAgICAgICAgICAgICAgQzJfTE9HKFZFUkJPU0UpIDw8ICIoIiA8PCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+KF9tRmxhZ3MpIDw8ICIpLmxpbWl0VG8oIgorICAgICAgICAgICAgICAgICAgICAgICAgPDwgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPihsaW1pdCkgPDwgIikiOworCisgICAgICAgICAgICAgICAgX21GbGFncyA9IF9tRmxhZ3MubGltaXRlZFRvKGxpbWl0KTsKKyAgICAgICAgICAgICAgICBfbVR5cGUgPSBfbUZsYWdzLmlzRW1wdHkoKSA/IHR5cGVfdDo6RU1QVFkgOiB0eXBlX3Q6OkZMQUdTOworICAgICAgICAgICAgICAgIEMyX0xPRyhWRVJCT1NFKSA8PCAiID0gIiA8PCBfbVR5cGUgPDwgIjoiIDw8IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD4oX21GbGFncyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIHR5cGVfdDo6UkFOR0U6CisgICAgICAgICAgICAgICAgQzJfTE9HKEZBVEFMKSA8PCAibGltaXRpbmcgcmFuZ2VzIHRvIGZsYWdzIGlzIG5vdCBzdXBwb3J0ZWQiOworICAgICAgICAgICAgICAgIF9tVHlwZSA9IHR5cGVfdDo6RU1QVFk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIEMyX0xPRyhGQVRBTCk7IC8vIHNob3VsZCBub3QgYmUgaGVyZQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBsaW1pdFRvKGNvbnN0IEMyU3VwcG9ydGVkUmFuZ2U8VD4gJmxpbWl0KSB7CisgICAgICAgIGlmICghX21EZWZpbmVkKSB7CisgICAgICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgIk5BLmxpbWl0VG8oIiA8PCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+KGxpbWl0KSA8PCAiKSI7CisKKyAgICAgICAgICAgIC8vIHNob3J0Y3V0IGZvciBmaXJzdCBsaW1pdCBhcHBsaWVkCisgICAgICAgICAgICBfbURlZmluZWQgPSB0cnVlOworICAgICAgICAgICAgX21SYW5nZSA9IGxpbWl0OworICAgICAgICAgICAgX21UeXBlID0gX21SYW5nZS5pc0VtcHR5KCkgPyB0eXBlX3Q6OkVNUFRZIDogdHlwZV90OjpSQU5HRTsKKyAgICAgICAgICAgIEMyX0xPRyhWRVJCT1NFKSA8PCAiID0gIiA8PCBfbVR5cGUgPDwgIjoiIDw8IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD4oX21SYW5nZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzd2l0Y2ggKF9tVHlwZSkgeworICAgICAgICAgICAgY2FzZSB0eXBlX3Q6OkVNUFRZOgorICAgICAgICAgICAgY2FzZSB0eXBlX3Q6OlZBTFVFUzoKKyAgICAgICAgICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgIigiIDw8IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD4oX21WYWx1ZXMpIDw8ICIpLmxpbWl0VG8oIgorICAgICAgICAgICAgICAgICAgICAgICAgPDwgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPihsaW1pdCkgPDwgIikiOworICAgICAgICAgICAgICAgIF9tVmFsdWVzID0gX21WYWx1ZXMubGltaXRlZFRvKGxpbWl0KTsKKyAgICAgICAgICAgICAgICBfbVR5cGUgPSBfbVZhbHVlcy5pc0VtcHR5KCkgPyB0eXBlX3Q6OkVNUFRZIDogdHlwZV90OjpWQUxVRVM7CisgICAgICAgICAgICAgICAgQzJfTE9HKFZFUkJPU0UpIDw8ICIgPSAiIDw8IF9tVHlwZSA8PCAiOiIgPDwgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPihfbVZhbHVlcyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIHR5cGVfdDo6RkxBR1M6CisgICAgICAgICAgICAgICAgQzJfTE9HKEZBVEFMKSA8PCAibGltaXRpbmcgZmxhZ3MgdG8gcmFuZ2VzIGlzIG5vdCBzdXBwb3J0ZWQiOworICAgICAgICAgICAgICAgIF9tVHlwZSA9IHR5cGVfdDo6RU1QVFk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIHR5cGVfdDo6UkFOR0U6CisgICAgICAgICAgICAgICAgQzJfTE9HKFZFUkJPU0UpIDw8ICIoIiA8PCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+KF9tUmFuZ2UpIDw8ICIpLmxpbWl0VG8oIgorICAgICAgICAgICAgICAgICAgICAgICAgPDwgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPihsaW1pdCkgPDwgIikiOworICAgICAgICAgICAgICAgIF9tUmFuZ2UgPSBfbVJhbmdlLmxpbWl0ZWRUbyhsaW1pdCk7CisgICAgICAgICAgICAgICAgQzJfRENIRUNLKF9tVmFsdWVzLmlzRW1wdHkoKSk7CisgICAgICAgICAgICAgICAgX21UeXBlID0gX21SYW5nZS5pc0VtcHR5KCkgPyB0eXBlX3Q6OkVNUFRZIDogdHlwZV90OjpSQU5HRTsKKyAgICAgICAgICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgIiA9ICIgPDwgX21UeXBlIDw8ICI6IiA8PCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+KF9tUmFuZ2UpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBDMl9MT0coRkFUQUwpOyAvLyBzaG91bGQgbm90IGJlIGhlcmUKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworcHJpdmF0ZToKKyAgICB2b2lkIGluc3RhbnRpYXRlKCkgX191bnVzZWQgeworICAgICAgICAodm9pZClfbVZhbHVlcy52YWx1ZXMoKTsgLy8gaW5zdGFudGlhdGUgbm9uLWNvbnN0IHZhbHVlcygpCisgICAgfQorCisgICAgdm9pZCBpbnN0YW50aWF0ZSgpIGNvbnN0IF9fdW51c2VkIHsKKyAgICAgICAgKHZvaWQpX21WYWx1ZXMudmFsdWVzKCk7IC8vIGluc3RhbnRpYXRlIGNvbnN0IHZhbHVlcygpCisgICAgfQorCisgICAgdHlwZWRlZiBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjp0eXBlX3QgdHlwZV90OworCisgICAgQzJQYXJhbUZpZWxkIF9tUGFyYW1GaWVsZDsKKyAgICB0eXBlX3QgX21UeXBlOworICAgIGJvb2wgX21EZWZpbmVkOworICAgIEMyU3VwcG9ydGVkUmFuZ2U8VD4gX21SYW5nZTsKKyAgICBDMlN1cHBvcnRlZFZhbHVlU2V0PFQ+IF9tVmFsdWVzOworICAgIEMyU3VwcG9ydGVkRmxhZ3M8VD4gX21GbGFnczsKKworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK0MyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD46Om9wZXJhdG9yIEMyUGFyYW1GaWVsZFZhbHVlcygpIGNvbnN0IHsKKyAgICByZXR1cm4gKEMyUGFyYW1GaWVsZFZhbHVlcykoKl9tSW1wbC5nZXQoKSk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+OjpDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyKGNvbnN0IEMyUGFyYW1GaWVsZCAmZmllbGQpCisgICAgOiBfbUltcGwoc3RkOjptYWtlX3VuaXF1ZTxDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+OjpJbXBsPihmaWVsZCkpIHsgfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiAmQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPjo6YW55KCkgeworICAgIF9tSW1wbC0+YW55KCk7CisgICAgcmV0dXJuICp0aGlzOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiAmQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPjo6bm9uZSgpIHsKKyAgICBfbUltcGwtPm5vbmUoKTsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+ICZDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+OjplcXVhbFRvKFQgdmFsdWUpIHsKKyAgICBfbUltcGwtPmVxdWFsVG8odmFsdWUpOworICAgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK0MyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD4gJkMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD46OmxpbWl0VG8oY29uc3QgQzJTdXBwb3J0ZWRWYWx1ZVNldDxUPiAmbGltaXQpIHsKKyAgICBfbUltcGwtPmxpbWl0VG8obGltaXQpOworICAgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK0MyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD4gJkMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD46OmxpbWl0VG8oY29uc3QgQzJTdXBwb3J0ZWRGbGFnczxUPiAmbGltaXQpIHsKKyAgICBfbUltcGwtPmxpbWl0VG8obGltaXQpOworICAgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK0MyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD4gJkMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD46OmxpbWl0VG8oY29uc3QgQzJTdXBwb3J0ZWRSYW5nZTxUPiAmbGltaXQpIHsKKyAgICBfbUltcGwtPmxpbWl0VG8obGltaXQpOworICAgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK0MyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD46OkMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXIoY29uc3QgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiAmb3RoZXIpCisgICAgOiBfbUltcGwoc3RkOjptYWtlX3VuaXF1ZTxDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+OjpJbXBsPigqb3RoZXIuX21JbXBsLmdldCgpKSkgeyB9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+ICZDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+OjpvcGVyYXRvcj0oCisgICAgICAgIGNvbnN0IEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD4gJm90aGVyKSB7CisgICAgX21JbXBsID0gc3RkOjptYWtlX3VuaXF1ZTxDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+OjpJbXBsPigqb3RoZXIuX21JbXBsLmdldCgpKTsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+Ojp+QzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcigpID0gZGVmYXVsdDsKKwordGVtcGxhdGUgY2xhc3MgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjx1aW50OF90PjsKK3RlbXBsYXRlIGNsYXNzIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8Y2hhcj47Cit0ZW1wbGF0ZSBjbGFzcyBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPGludDMyX3Q+OwordGVtcGxhdGUgY2xhc3MgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjx1aW50MzJfdD47CisvL3RlbXBsYXRlIGNsYXNzIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8YzJfY250cjMyX3Q+OwordGVtcGxhdGUgY2xhc3MgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxpbnQ2NF90PjsKK3RlbXBsYXRlIGNsYXNzIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8dWludDY0X3Q+OworLy90ZW1wbGF0ZSBjbGFzcyBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPGMyX2NudHI2NF90PjsKK3RlbXBsYXRlIGNsYXNzIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8ZmxvYXQ+OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEMyU2V0dGluZ1Jlc3VsdEJ1aWxkZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitDMlNldHRpbmdDb25mbGljdHNCdWlsZGVyOjpDMlNldHRpbmdDb25mbGljdHNCdWlsZGVyKCkgOiBfbUNvbmZsaWN0cygpIHsgfQorCitDMlNldHRpbmdDb25mbGljdHNCdWlsZGVyOjpDMlNldHRpbmdDb25mbGljdHNCdWlsZGVyKEMyUGFyYW1GaWVsZFZhbHVlcyAmJmNvbmZsaWN0KSB7CisgICAgX21Db25mbGljdHMuZW1wbGFjZV9iYWNrKHN0ZDo6bW92ZShjb25mbGljdCkpOworfQorCitDMlNldHRpbmdDb25mbGljdHNCdWlsZGVyJiBDMlNldHRpbmdDb25mbGljdHNCdWlsZGVyOjp3aXRoKEMyUGFyYW1GaWVsZFZhbHVlcyAmJmNvbmZsaWN0KSB7CisgICAgX21Db25mbGljdHMuZW1wbGFjZV9iYWNrKHN0ZDo6bW92ZShjb25mbGljdCkpOworICAgIHJldHVybiAqdGhpczsKK30KKworc3RkOjp2ZWN0b3I8QzJQYXJhbUZpZWxkVmFsdWVzPiBDMlNldHRpbmdDb25mbGljdHNCdWlsZGVyOjpyZXRyaWV2ZUNvbmZsaWN0cygpIHsKKyAgICByZXR1cm4gc3RkOjptb3ZlKF9tQ29uZmxpY3RzKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDMlNldHRpbmdSZXN1bHQvc0J1aWxkZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitDMlNldHRpbmdSZXN1bHQgQzJTZXR0aW5nUmVzdWx0QnVpbGRlcjo6UmVhZE9ubHkoY29uc3QgQzJQYXJhbUZpZWxkICZwYXJhbSkgeworICAgIHJldHVybiBDMlNldHRpbmdSZXN1bHQgeyBDMlNldHRpbmdSZXN1bHQ6OlJFQURfT05MWSwgeyBwYXJhbSB9LCB7IH0gfTsKK30KKworQzJTZXR0aW5nUmVzdWx0IEMyU2V0dGluZ1Jlc3VsdEJ1aWxkZXI6OkJhZFZhbHVlKGNvbnN0IEMyUGFyYW1GaWVsZCAmcGFyYW1GaWVsZCwgYm9vbCBpc0luZm8pIHsKKyAgICByZXR1cm4geyBpc0luZm8gPyBDMlNldHRpbmdSZXN1bHQ6OklORk9fQkFEX1ZBTFVFIDogQzJTZXR0aW5nUmVzdWx0OjpCQURfVkFMVUUsCisgICAgICAgICAgICAgeyBwYXJhbUZpZWxkIH0sIHsgfSB9OworfQorCitDMlNldHRpbmdSZXN1bHQgQzJTZXR0aW5nUmVzdWx0QnVpbGRlcjo6Q29uZmxpY3QoCisgICAgICAgIEMyUGFyYW1GaWVsZFZhbHVlcyAmJnBhcmFtRmllbGRWYWx1ZXMsIEMyU2V0dGluZ0NvbmZsaWN0c0J1aWxkZXIgJmNvbmZsaWN0cywgYm9vbCBpc0luZm8pIHsKKyAgICBDMl9DSEVDSyghY29uZmxpY3RzLmVtcHR5KCkpOworICAgIGlmIChpc0luZm8pIHsKKyAgICAgICAgcmV0dXJuIEMyU2V0dGluZ1Jlc3VsdCB7CisgICAgICAgICAgICBDMlNldHRpbmdSZXN1bHQ6OklORk9fQ09ORkxJQ1QsCisgICAgICAgICAgICBzdGQ6Om1vdmUocGFyYW1GaWVsZFZhbHVlcyksIGNvbmZsaWN0cy5yZXRyaWV2ZUNvbmZsaWN0cygpCisgICAgICAgIH07CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIEMyU2V0dGluZ1Jlc3VsdCB7CisgICAgICAgICAgICBDMlNldHRpbmdSZXN1bHQ6OkNPTkZMSUNULAorICAgICAgICAgICAgc3RkOjptb3ZlKHBhcmFtRmllbGRWYWx1ZXMpLCBjb25mbGljdHMucmV0cmlldmVDb25mbGljdHMoKQorICAgICAgICB9OworICAgIH0KK30KKworQzJTZXR0aW5nUmVzdWx0c0J1aWxkZXI6OkMyU2V0dGluZ1Jlc3VsdHNCdWlsZGVyKEMyU2V0dGluZ1Jlc3VsdCAmJnJlc3VsdCkKKyAgICAgICAgOiBfbVN0YXR1cyhDMl9CQURfVkFMVUUpIHsKKyAgICBfbVJlc3VsdHMuZW1wbGFjZV9iYWNrKG5ldyBDMlNldHRpbmdSZXN1bHQoc3RkOjptb3ZlKHJlc3VsdCkpKTsKK30KKworQzJTZXR0aW5nUmVzdWx0c0J1aWxkZXIgQzJTZXR0aW5nUmVzdWx0c0J1aWxkZXI6OnBsdXMoQzJTZXR0aW5nUmVzdWx0c0J1aWxkZXImJiByZXN1bHRzKSB7CisgICAgZm9yIChzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0PiAmciA6IHJlc3VsdHMuX21SZXN1bHRzKSB7CisgICAgICAgIF9tUmVzdWx0cy5lbXBsYWNlX2JhY2soc3RkOjptb3ZlKHIpKTsKKyAgICB9CisgICAgcmVzdWx0cy5fbVJlc3VsdHMuY2xlYXIoKTsKKyAgICAvLyBUT0RPOiBtU3RhdHVzCisgICAgcmV0dXJuIHN0ZDo6bW92ZSgqdGhpcyk7Cit9CisKK2MyX3N0YXR1c190IEMyU2V0dGluZ1Jlc3VsdHNCdWlsZGVyOjpyZXRyaWV2ZUZhaWx1cmVzKAorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4qIGNvbnN0IGZhaWx1cmVzKSB7CisgICAgZm9yIChzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0PiAmciA6IF9tUmVzdWx0cykgeworICAgICAgICBmYWlsdXJlcy0+ZW1wbGFjZV9iYWNrKHN0ZDo6bW92ZShyKSk7CisgICAgfQorICAgIF9tUmVzdWx0cy5jbGVhcigpOworICAgIHJldHVybiBfbVN0YXR1czsKK30KKworQzJTZXR0aW5nUmVzdWx0c0J1aWxkZXI6OkMyU2V0dGluZ1Jlc3VsdHNCdWlsZGVyKGMyX3N0YXR1c190IHN0YXR1cykgOiBfbVN0YXR1cyhzdGF0dXMpIHsKKyAgICAvLyBzdGF0dXMgbXVzdCBiZSBvbmUgb2YgT0ssIEJBRF9TVEFURSwgVElNRURfT1VUIG9yIENPUlJVUFRFRAorICAgIC8vIG1haW5seTogQkxPQ0tJTkcsIEJBRF9JTkRFWCwgQkFEX1ZBTFVFIGFuZCBOT19NRU1PUlkgcmVxdWlyZXMgYSBzZXR0aW5nIGF0dGVtcHQKK30KKworI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHBvcAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEMyRmllbGRVdGlscyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0cnVjdCBDMl9ISURFIEMyRmllbGRVdGlsczo6X0luc3BlY3RvciB7CisgICAgLy8vIHJldHVybnMgdGhlIGltcGxlbWVudGF0aW9uIG9iamVjdAorICAgIGlubGluZSBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPEluZm86OkltcGw+IEdldEltcGwoY29uc3QgSW5mbyAmaW5mbykgeworICAgICAgICByZXR1cm4gaW5mby5fbUltcGw7CisgICAgfQorfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDMkZpZWxkVXRpbHM6OkluZm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdHJ1Y3QgQzJfSElERSBDMkZpZWxkVXRpbHM6OkluZm86OkltcGwgeworICAgIEMyRmllbGREZXNjcmlwdG9yIGZpZWxkOworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBwYXJlbnQ7CisgICAgdWludDMyX3QgaW5kZXg7CisgICAgdWludDMyX3QgZGVwdGg7CisgICAgdWludDMyX3QgYmFzZUZpZWxkT2Zmc2V0OworICAgIHVpbnQzMl90IGFycmF5T2Zmc2V0OworICAgIHVpbnQzMl90IHVzZWRFeHRlbnQ7CisKKyAgICAvLy8gY3JlYXRlcyBhIGNvcHkgb2YgdGhpcyBvYmplY3QgaW5jbHVkaW5nIGNvcGllcyBvZiBpdHMgcGFyZW50IGNoYWluCisgICAgSW1wbCBjbG9uZSgpIGNvbnN0OworCisgICAgLy8vIGNyZWF0ZXMgYSBjb3B5IG9mIGEgc2hhcmVkIHBvaW50ZXIgdG8gYW4gb2JqZWN0CisgICAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBDbG9uZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gJik7CisKKyAgICBJbXBsKGNvbnN0IEMyRmllbGREZXNjcmlwdG9yICZmaWVsZF8sIHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBwYXJlbnRfLAorICAgICAgICAgICAgdWludDMyX3QgaW5kZXhfLCB1aW50MzJfdCBkZXB0aF8sIHVpbnQzMl90IGJhc2VGaWVsZE9mZnNldF8sCisgICAgICAgICAgICB1aW50MzJfdCBhcnJheU9mZnNldF8sIHVpbnQzMl90IHVzZWRFeHRlbnRfKQorICAgICAgICA6IGZpZWxkKGZpZWxkXyksIHBhcmVudChwYXJlbnRfKSwgaW5kZXgoaW5kZXhfKSwgZGVwdGgoZGVwdGhfKSwKKyAgICAgICAgICBiYXNlRmllbGRPZmZzZXQoYmFzZUZpZWxkT2Zmc2V0XyksIGFycmF5T2Zmc2V0KGFycmF5T2Zmc2V0XyksIHVzZWRFeHRlbnQodXNlZEV4dGVudF8pIHsgfQorfTsKKworc3RkOjpzaGFyZWRfcHRyPEMyRmllbGRVdGlsczo6SW5mbzo6SW1wbD4gQzJGaWVsZFV0aWxzOjpJbmZvOjpJbXBsOjpDbG9uZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gJmluZm8pIHsKKyAgICBpZiAoaW5mbykgeworICAgICAgICByZXR1cm4gc3RkOjptYWtlX3NoYXJlZDxJbXBsPihpbmZvLT5jbG9uZSgpKTsKKyAgICB9CisgICAgcmV0dXJuIG51bGxwdHI7Cit9CisKK0MyRmllbGRVdGlsczo6SW5mbzo6SW1wbCBDMkZpZWxkVXRpbHM6OkluZm86OkltcGw6OmNsb25lKCkgY29uc3QgeworICAgIEltcGwgcmVzID0gSW1wbCgqdGhpcyk7CisgICAgcmVzLnBhcmVudCA9IENsb25lKHJlcy5wYXJlbnQpOworICAgIHJldHVybiByZXM7Cit9CisKK0MyRmllbGRVdGlsczo6SW5mbzo6SW5mbyhzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gaW1wbCkKKyAgICA6IF9tSW1wbChpbXBsKSB7IH0KKworc2l6ZV90IEMyRmllbGRVdGlsczo6SW5mbzo6YXJyYXlPZmZzZXQoKSBjb25zdCB7CisgICAgcmV0dXJuIF9tSW1wbC0+YXJyYXlPZmZzZXQ7Cit9CisKK3NpemVfdCBDMkZpZWxkVXRpbHM6OkluZm86OmFycmF5U2l6ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gZXh0ZW50KCkgKiBzaXplKCk7Cit9CisKK3NpemVfdCBDMkZpZWxkVXRpbHM6OkluZm86OmJhc2VGaWVsZE9mZnNldCgpIGNvbnN0IHsKKyAgICByZXR1cm4gX21JbXBsLT5iYXNlRmllbGRPZmZzZXQ7Cit9OworCitzaXplX3QgQzJGaWVsZFV0aWxzOjpJbmZvOjpkZXB0aCgpIGNvbnN0IHsKKyAgICByZXR1cm4gX21JbXBsLT5kZXB0aDsKK30KKworc2l6ZV90IEMyRmllbGRVdGlsczo6SW5mbzo6ZXh0ZW50KCkgY29uc3QgeworICAgIHJldHVybiBfbUltcGwtPnVzZWRFeHRlbnQ7Cit9CisKK3NpemVfdCBDMkZpZWxkVXRpbHM6OkluZm86OmluZGV4KCkgY29uc3QgeworICAgIHJldHVybiBfbUltcGwtPmluZGV4OworfQorCitib29sIEMyRmllbGRVdGlsczo6SW5mbzo6aXNBcml0aG1ldGljKCkgY29uc3QgeworICAgIHN3aXRjaCAoX21JbXBsLT5maWVsZC50eXBlKCkpIHsKKyAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpCTE9COgorICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OkNOVFIzMjoKKyAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpDTlRSNjQ6CisgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6RkxPQVQ6CisgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6SU5UMzI6CisgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6SU5UNjQ6CisgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6U1RSSU5HOgorICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OlVJTlQzMjoKKyAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpVSU5UNjQ6CisgICAgICAgIHJldHVybiB0cnVlOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9CisKK2Jvb2wgQzJGaWVsZFV0aWxzOjpJbmZvOjppc0ZsZXhpYmxlKCkgY29uc3QgeworICAgIHJldHVybiBfbUltcGwtPmZpZWxkLmV4dGVudCgpID09IDA7Cit9CisKK0MyU3RyaW5nIEMyRmllbGRVdGlsczo6SW5mbzo6bmFtZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gX21JbXBsLT5maWVsZC5uYW1lKCk7Cit9CisKK2NvbnN0IEMyRmllbGRVdGlsczo6SW5mbzo6TmFtZWRWYWx1ZXNUeXBlICZDMkZpZWxkVXRpbHM6OkluZm86Om5hbWVkVmFsdWVzKCkgY29uc3QgeworICAgIHJldHVybiBfbUltcGwtPmZpZWxkLm5hbWVkVmFsdWVzKCk7Cit9CisKK3NpemVfdCBDMkZpZWxkVXRpbHM6OkluZm86Om9mZnNldCgpIGNvbnN0IHsKKyAgICByZXR1cm4gX0MyUGFyYW1JbnNwZWN0b3I6OkdldE9mZnNldChfbUltcGwtPmZpZWxkKTsKK30KKworQzJGaWVsZFV0aWxzOjpJbmZvIEMyRmllbGRVdGlsczo6SW5mbzo6cGFyZW50KCkgY29uc3QgeworICAgIHJldHVybiBJbmZvKF9tSW1wbC0+cGFyZW50KTsKK307CisKK3NpemVfdCBDMkZpZWxkVXRpbHM6OkluZm86OnNpemUoKSBjb25zdCB7CisgICAgcmV0dXJuIF9DMlBhcmFtSW5zcGVjdG9yOjpHZXRTaXplKF9tSW1wbC0+ZmllbGQpOworfQorCitDMkZpZWxkVXRpbHM6OkluZm86OnR5cGVfdCBDMkZpZWxkVXRpbHM6OkluZm86OnR5cGUoKSBjb25zdCB7CisgICAgcmV0dXJuIF9tSW1wbC0+ZmllbGQudHlwZSgpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEMyRmllbGRVdGlsczo6SXRlcmF0b3IgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdHJ1Y3QgQzJfSElERSBDMkZpZWxkVXRpbHM6Okl0ZXJhdG9yOjpJbXBsIDogcHVibGljIF9DMlBhcmFtSW5zcGVjdG9yIHsKKyAgICBJbXBsKCkgPSBkZWZhdWx0OworCisgICAgdmlydHVhbCB+SW1wbCgpID0gZGVmYXVsdDsKKworICAgIC8vLyBpbXBsZW1lbnRzIG9iamVjdCBlcXVhbGl0eQorICAgIHZpcnR1YWwgYm9vbCBlcXVhbHMoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEltcGw+ICZvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gb3RoZXIgIT0gbnVsbHB0ciAmJiBtSGVhZCA9PSBvdGhlci0+bUhlYWQ7CisgICAgfTsKKworICAgIC8vLyByZXR1cm5zIHRoZSBpbmZvIHBvaW50ZWQgdG8gYnkgdGhpcyBpdGVyYXRvcgorICAgIHZpcnR1YWwgdmFsdWVfdHlwZSBnZXQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBJbmZvKG1IZWFkKTsKKyAgICB9CisKKyAgICAvLy8gaW5jcmVtZW50cyB0aGlzIGl0ZXJhdG9yCisgICAgdmlydHVhbCB2b2lkIGluY3JlbWVudCgpIHsKKyAgICAgICAgLy8gbm90ZTogdGhpcyBjYW5ub3QgYmUgYWJzdHJhY3QgYXMgd2UgaW5zdGFudGlhdGUgdGhpcyBmb3IgTGlzdDo6ZW5kKCkuIGluY3JlbWVudCB0byBlbmQoKQorICAgICAgICAvLyBpbnN0ZWFkLgorICAgICAgICBtSGVhZC5yZXNldCgpOworICAgIH0KKworcHJvdGVjdGVkOgorICAgIEltcGwoc3RkOjpzaGFyZWRfcHRyPEMyRmllbGRVdGlsczo6SW5mbzo6SW1wbD4gaGVhZCkKKyAgICAgICAgOiBtSGVhZChoZWFkKSB7IH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbmZvOjpJbXBsPiBtSGVhZDsgLy8vPCBjdXJyZW50IGZpZWxkCit9OworCitDMkZpZWxkVXRpbHM6Okl0ZXJhdG9yOjpJdGVyYXRvcihzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gaW1wbCkKKyAgICA6IG1JbXBsKGltcGwpIHsgfQorCitDMkZpZWxkVXRpbHM6Okl0ZXJhdG9yOjp2YWx1ZV90eXBlIEMyRmllbGRVdGlsczo6SXRlcmF0b3I6Om9wZXJhdG9yKigpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwtPmdldCgpOworfQorCitDMkZpZWxkVXRpbHM6Okl0ZXJhdG9yJiBDMkZpZWxkVXRpbHM6Okl0ZXJhdG9yOjpvcGVyYXRvcisrKCkgeworICAgIG1JbXBsLT5pbmNyZW1lbnQoKTsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK2Jvb2wgQzJGaWVsZFV0aWxzOjpJdGVyYXRvcjo6b3BlcmF0b3I9PShjb25zdCBJdGVyYXRvciAmb3RoZXIpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwtPmVxdWFscyhvdGhlci5tSW1wbCk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQzJGaWVsZFV0aWxzOjpMaXN0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RydWN0IEMyX0hJREUgQzJGaWVsZFV0aWxzOjpMaXN0OjpJbXBsIHsKKyAgICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxJdGVyYXRvcjo6SW1wbD4gYmVnaW4oKSBjb25zdCA9IDA7CisKKyAgICAvLy8gcmV0dXJucyBhbiBpdGVyYXRvciB0byB0aGUgZW5kIG9mIHRoZSBsaXN0CisgICAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8SXRlcmF0b3I6OkltcGw+IGVuZCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9zaGFyZWQ8SXRlcmF0b3I6OkltcGw+KCk7CisgICAgfQorCisgICAgdmlydHVhbCB+SW1wbCgpID0gZGVmYXVsdDsKK307CisKK0MyRmllbGRVdGlsczo6TGlzdDo6TGlzdChzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gaW1wbCkKKyAgICA6IG1JbXBsKGltcGwpIHsgfQorCitDMkZpZWxkVXRpbHM6Okl0ZXJhdG9yIEMyRmllbGRVdGlsczo6TGlzdDo6YmVnaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIEMyRmllbGRVdGlsczo6SXRlcmF0b3IobUltcGwtPmJlZ2luKCkpOworfQorCitDMkZpZWxkVXRpbHM6Okl0ZXJhdG9yIEMyRmllbGRVdGlsczo6TGlzdDo6ZW5kKCkgY29uc3QgeworICAgIHJldHVybiBDMkZpZWxkVXRpbHM6Okl0ZXJhdG9yKG1JbXBsLT5lbmQoKSk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQzJGaWVsZFV0aWxzOjplbnVtZXJhdGVGaWVsZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCituYW1lc3BhY2UgeworCisvKioKKyAqIEl0ZXJhdG9yIGJhc2UgY2xhc3MgaGVscGVyIHRoYXQgYWxsb3dzIGRlc2NlbmRpbmcgaW50byB0aGUgZmllbGQgaGllcmFyY2h5LgorICovCitzdHJ1Y3QgQzJGaWVsZFV0aWxzRmllbGRzSXRlcmF0b3JIZWxwZXIgOiBwdWJsaWMgQzJGaWVsZFV0aWxzOjpJdGVyYXRvcjo6SW1wbCB7CisgICAgdmlydHVhbCB+QzJGaWVsZFV0aWxzRmllbGRzSXRlcmF0b3JIZWxwZXIoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgICAvLy8gcmV0dXJucyB0aGUgYmFzZS1maWVsZCdzIG9mZnNldCBvZiB0aGUgcGFyZW50IGZpZWxkIChvciB0aGUgcGFyYW0gb2Zmc2V0IGlmIG5vIHBhcmVudCkKKyAgICBzdGF0aWMgaW5saW5lIHVpbnQzMl90IEdldFBhcmVudEJhc2VGaWVsZE9mZnNldCgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkZpZWxkVXRpbHM6OkluZm86OkltcGw+IHBhcmVudCkgeworICAgICAgICByZXR1cm4gcGFyZW50ID09IG51bGxwdHIgPyBzaXplb2YoQzJQYXJhbSkgOiBwYXJlbnQtPmJhc2VGaWVsZE9mZnNldDsKKyAgICB9CisKKyAgICAvLy8gcmV0dXJucyB0aGUgb2Zmc2V0IG9mIHRoZSBwYXJlbnQgZmllbGQgKG9yIHRoZSBwYXJhbSkKKyAgICBzdGF0aWMgaW5saW5lIHVpbnQzMl90IEdldFBhcmVudE9mZnNldChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJGaWVsZFV0aWxzOjpJbmZvOjpJbXBsPiBwYXJlbnQpIHsKKyAgICAgICAgcmV0dXJuIHBhcmVudCA9PSBudWxscHRyID8gc2l6ZW9mKEMyUGFyYW0pIDogR2V0T2Zmc2V0KHBhcmVudC0+ZmllbGQpOworICAgIH0KKworcHJvdGVjdGVkOgorICAgIEMyRmllbGRVdGlsc0ZpZWxkc0l0ZXJhdG9ySGVscGVyKAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+IHJlZmxlY3RvciwKKyAgICAgICAgICAgIHVpbnQzMl90IHBhcmFtU2l6ZSwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkZpZWxkVXRpbHM6OkluZm86OkltcGw+IGhlYWQgPSBudWxscHRyKQorICAgICAgICA6IEMyRmllbGRVdGlsczo6SXRlcmF0b3I6OkltcGwoaGVhZCksCisgICAgICAgICAgbVBhcmFtU2l6ZShwYXJhbVNpemUpLAorICAgICAgICAgIG1SZWZsZWN0b3IocmVmbGVjdG9yKSB7IH0KKworICAgIC8vLyByZXR1cm5zIGEgbGVhZiBpbmZvIG9iamVjdCBhdCBhIHNwZWNpZmljIGluZGV4IGZvciBhIGNoaWxkIGZpZWxkCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyRmllbGRVdGlsczo6SW5mbzo6SW1wbD4gbWFrZUxlYWYoCisgICAgICAgICAgICBjb25zdCBDMkZpZWxkRGVzY3JpcHRvciAmZmllbGQsIHVpbnQzMl90IGluZGV4KSB7CisgICAgICAgIHVpbnQzMl90IHBhcmVudE9mZnNldCA9IEdldFBhcmVudE9mZnNldChtSGVhZCk7CisgICAgICAgIHVpbnQzMl90IGFycmF5T2Zmc2V0ID0gcGFyZW50T2Zmc2V0ICsgR2V0T2Zmc2V0KGZpZWxkKTsKKyAgICAgICAgdWludDMyX3QgdXNlZEV4dGVudCA9IGZpZWxkLmV4dGVudCgpID8gOgorICAgICAgICAgICAgICAgIChzdGQ6Om1heChhcnJheU9mZnNldCwgbVBhcmFtU2l6ZSkgLSBhcnJheU9mZnNldCkgLyBHZXRTaXplKGZpZWxkKTsKKworICAgICAgICByZXR1cm4gc3RkOjptYWtlX3NoYXJlZDxDMkZpZWxkVXRpbHM6OkluZm86OkltcGw+KAorICAgICAgICAgICAgICAgIE9mZnNldEZpZWxkRGVzY3JpcHRvcihmaWVsZCwgcGFyZW50T2Zmc2V0ICsgaW5kZXggKiBHZXRTaXplKGZpZWxkKSksCisgICAgICAgICAgICAgICAgbUhlYWQgLyogcGFyZW50ICovLCBpbmRleCwgbUhlYWQgPT0gbnVsbHB0ciA/IDAgOiBtSGVhZC0+ZGVwdGggKyAxLAorICAgICAgICAgICAgICAgIEdldFBhcmVudEJhc2VGaWVsZE9mZnNldChtSGVhZCkgKyBHZXRPZmZzZXQoZmllbGQpLAorICAgICAgICAgICAgICAgIGFycmF5T2Zmc2V0LCB1c2VkRXh0ZW50KTsKKyAgICB9CisKKyAgICAvLy8gcmV0dXJucyB3aGV0aGVyIHRoaXMgc3RydWN0IGluZGV4IGhhdmUgYmVlbiB0cmF2ZXJzZWQgdG8gZ2V0IHRvIHRoaXMgZmllbGQKKyAgICBib29sIHZpc2l0ZWQoQzJQYXJhbTo6Q29yZUluZGV4IGluZGV4KSBjb25zdCB7CisgICAgICAgIGZvciAoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyU3RydWN0RGVzY3JpcHRvcj4gJnNkIDogbUhpc3RvcnkpIHsKKyAgICAgICAgICAgIGlmIChzZC0+Y29yZUluZGV4KCkgPT0gaW5kZXgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdWludDMyX3QgbVBhcmFtU2l6ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gbVJlZmxlY3RvcjsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJTdHJ1Y3REZXNjcmlwdG9yPj4gbUhpc3Rvcnk7IC8vIHN0cnVjdHVyZSB0eXBlcyB2aXNpdGVkCit9OworCisvKioKKyAqIEl0ZXJhdG9yIGltcGxlbWVudGluZyBlbnVtZXJhdGVGaWVsZHMoKSB0aGF0IHZpc2l0cyBlYWNoIGJhc2UgZmllbGQuCisgKi8KK3N0cnVjdCBDMkZpZWxkVXRpbHNGaWVsZHNJdGVyYXRvciA6IHB1YmxpYyBDMkZpZWxkVXRpbHNGaWVsZHNJdGVyYXRvckhlbHBlciB7CisgICAgLy8vIGVudW1lcmF0ZSBiYXNlIGZpZWxkcyBvZiBhIHBhcmFtZXRlcgorICAgIEMyRmllbGRVdGlsc0ZpZWxkc0l0ZXJhdG9yKGNvbnN0IEMyUGFyYW0gJnBhcmFtLCBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gcmVmbGVjdG9yKQorICAgICAgICA6IEMyRmllbGRVdGlsc0ZpZWxkc0l0ZXJhdG9ySGVscGVyKHJlZmxlY3RvciwgcGFyYW0uc2l6ZSgpKSB7CisgICAgICAgIGRlc2NlbmRJbnRvKHBhcmFtLmNvcmVJbmRleCgpKTsKKyAgICB9CisKKyAgICAvLy8gZW51bWVyYXRlIGJhc2UgZmllbGRzIG9mIGEgZmllbGQKKyAgICBDMkZpZWxkVXRpbHNGaWVsZHNJdGVyYXRvcihzdGQ6OnNoYXJlZF9wdHI8QzJGaWVsZFV0aWxzRmllbGRzSXRlcmF0b3I+IGltcGwpCisgICAgICAgIDogQzJGaWVsZFV0aWxzRmllbGRzSXRlcmF0b3JIZWxwZXIoaW1wbC0+bVJlZmxlY3RvciwgaW1wbC0+bVBhcmFtU2l6ZSwgaW1wbC0+bUhlYWQpIHsKKyAgICAgICAgbUhpc3RvcnkgPSBpbXBsLT5tSGlzdG9yeTsKKyAgICAgICAgaWYgKG1IZWFkLT5maWVsZC50eXBlKCkgJiBDMkZpZWxkRGVzY3JpcHRvcjo6U1RSVUNUX0ZMQUcpIHsKKyAgICAgICAgICAgIEMyUGFyYW06OkNvcmVJbmRleCBpbmRleCA9IHsgbUhlYWQtPmZpZWxkLnR5cGUoKSAmfkMyRmllbGREZXNjcmlwdG9yOjpTVFJVQ1RfRkxBRyB9OworICAgICAgICAgICAgaWYgKCF2aXNpdGVkKGluZGV4KSkgeworICAgICAgICAgICAgICAgIGRlc2NlbmRJbnRvKGluZGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHZpcnR1YWwgfkMyRmllbGRVdGlsc0ZpZWxkc0l0ZXJhdG9yKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICAgLy8vIEluY3JlbWVudHMgdGhpcyBpdGVyYXRvciBieSB2aXNpdGluZyBlYWNoIGJhc2UgZmllbGQuCisgICAgdmlydHVhbCB2b2lkIGluY3JlbWVudCgpIG92ZXJyaWRlIHsKKyAgICAgICAgLy8gZG9uJ3QgZ28gcGFzdCBlbmQKKyAgICAgICAgaWYgKG1IZWFkID09IG51bGxwdHIgfHwgX21GaWVsZHMuZW1wdHkoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gZGVzY2VuZCBpbnRvIHN0cnVjdHVyZXMKKyAgICAgICAgaWYgKG1IZWFkLT5maWVsZC50eXBlKCkgJiBDMkZpZWxkRGVzY3JpcHRvcjo6U1RSVUNUX0ZMQUcpIHsKKyAgICAgICAgICAgIEMyUGFyYW06OkNvcmVJbmRleCBpbmRleCA9IHsgbUhlYWQtPmZpZWxkLnR5cGUoKSAmfkMyRmllbGREZXNjcmlwdG9yOjpTVFJVQ1RfRkxBRyB9OworICAgICAgICAgICAgLy8gZG8gbm90IHJlY3Vyc2UgaW50byB0aGUgc2FtZSBzdHJ1Y3RzCisgICAgICAgICAgICBpZiAoIXZpc2l0ZWQoaW5kZXgpICYmIGRlc2NlbmRJbnRvKGluZGV4KSkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIGFzY2VuZCBhZnRlciB0aGUgbGFzdCBmaWVsZCBpbiB0aGUgY3VycmVudCBzdHJ1Y3QKKyAgICAgICAgd2hpbGUgKCFtSGlzdG9yeS5lbXB0eSgpICYmIF9tRmllbGRzLmJhY2soKSA9PSBtSGlzdG9yeS5iYWNrKCktPmVuZCgpKSB7CisgICAgICAgICAgICBtSGVhZCA9IG1IZWFkLT5wYXJlbnQ7CisgICAgICAgICAgICBtSGlzdG9yeS5wb3BfYmFjaygpOworICAgICAgICAgICAgX21GaWVsZHMucG9wX2JhY2soKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGRvbmUgaWYgaGlzdG9yeSBpcyBub3cgZW1wdHkKKyAgICAgICAgaWYgKF9tRmllbGRzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIC8vIHdlIGNvdWxkIGJlIHRyYXZlcnNpbmcgYSBzdWItdHJlZSBzbyBjbGVhciBoZWFkCisgICAgICAgICAgICBtSGVhZC5yZXNldCgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gbW92ZSB0byB0aGUgbmV4dCBmaWVsZCBpbiB0aGUgY3VycmVudCBzdHJ1Y3QKKyAgICAgICAgQzJTdHJ1Y3REZXNjcmlwdG9yOjpmaWVsZF9pdGVyYXRvciBuZXh0ID0gX21GaWVsZHMuYmFjaygpOworICAgICAgICBtSGVhZC0+ZmllbGQgPSBPZmZzZXRGaWVsZERlc2NyaXB0b3IoKm5leHQsIEdldFBhcmVudE9mZnNldChtSGVhZC0+cGFyZW50KSk7CisgICAgICAgIG1IZWFkLT5pbmRleCA9IDA7IC8vIHJlc2V0IGluZGV4IGp1c3QgaW4gY2FzZSBmb3IgY29ycmVjdG5lc3MKKyAgICAgICAgbUhlYWQtPmJhc2VGaWVsZE9mZnNldCA9IEdldFBhcmVudEJhc2VGaWVsZE9mZnNldChtSGVhZC0+cGFyZW50KSArIEdldE9mZnNldCgqbmV4dCk7CisgICAgICAgIG1IZWFkLT5hcnJheU9mZnNldCA9IEdldE9mZnNldChtSGVhZC0+ZmllbGQpOworICAgICAgICBtSGVhZC0+dXNlZEV4dGVudCA9IG1IZWFkLT5maWVsZC5leHRlbnQoKSA/IDoKKyAgICAgICAgICAgICAgICAoc3RkOjptYXgobUhlYWQtPmFycmF5T2Zmc2V0LCBtUGFyYW1TaXplKSAtIG1IZWFkLT5hcnJheU9mZnNldCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC8gR2V0U2l6ZShtSGVhZC0+ZmllbGQpOworICAgICAgICArK19tRmllbGRzLmJhY2soKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgLy8vIElmIHRoZSBjdXJyZW50IGZpZWxkIGlzIGEga25vd24sIHZhbGlkICh1bnRyYXZlcnNlZCkgc3RydWN0dXJlLCBpdCBtb2RpZmllcyB0aGlzIGl0ZXJhdG9yCisgICAgLy8vIHRvIHBvaW50IHRvIHRoZSBmaXJzdCBmaWVsZCBvZiB0aGUgc3RydWN0dXJlIGFuZCByZXR1cm5zIHRydWUuIE90aGVyd2lzZSwgaXQgZG9lcyBub3QKKyAgICAvLy8gbW9kaWZ5IHRoaXMgaXRlcmF0b3IgYW5kIHJldHVybnMgZmFsc2UuCisgICAgYm9vbCBkZXNjZW5kSW50byhDMlBhcmFtOjpDb3JlSW5kZXggaW5kZXgpIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyU3RydWN0RGVzY3JpcHRvcj4gZGVzY1VuaXF1ZSA9IG1SZWZsZWN0b3ItPmRlc2NyaWJlKGluZGV4KTsKKyAgICAgICAgLy8gZGVzY2VuZCBpbnRvIGtub3duIHN0cnVjdHMgKGFzIGxvbmcgYXMgdGhleSBoYXZlIGF0IGxlYXN0IG9uZSBmaWVsZCkKKyAgICAgICAgaWYgKGRlc2NVbmlxdWUgJiYgZGVzY1VuaXF1ZS0+YmVnaW4oKSAhPSBkZXNjVW5pcXVlLT5lbmQoKSkgeworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RydWN0RGVzY3JpcHRvcj4gZGVzYyhzdGQ6Om1vdmUoZGVzY1VuaXF1ZSkpOworICAgICAgICAgICAgbUhpc3RvcnkuZW1wbGFjZV9iYWNrKGRlc2MpOworICAgICAgICAgICAgQzJTdHJ1Y3REZXNjcmlwdG9yOjpmaWVsZF9pdGVyYXRvciBmaXJzdCA9IGRlc2MtPmJlZ2luKCk7CisgICAgICAgICAgICBtSGVhZCA9IG1ha2VMZWFmKCpmaXJzdCwgMCAvKiBpbmRleCAqLyk7CisgICAgICAgICAgICBfbUZpZWxkcy5lbXBsYWNlX2JhY2soKytmaXJzdCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8vIG5leHQgZmllbGQgcG9pbnRlcnMgZm9yIGVhY2ggZGVwdGguCisgICAgLy8vIG5vdGU6IF9tRmllbGRzIG1heSBiZSBzaG9ydGVkIHRoYW4gbUhpc3RvcnksIGlmIGl0ZXJhdGluZyBhdCBhIGRlcHRoCisgICAgc3RkOjp2ZWN0b3I8QzJTdHJ1Y3REZXNjcmlwdG9yOjpmaWVsZF9pdGVyYXRvcj4gX21GaWVsZHM7Cit9OworCisvKioKKyAqIEl0ZXJhYmxlIGltcGxlbWVudGluZyBlbnVtZXJhdGVGaWVsZHMoKS4KKyAqLworc3RydWN0IEMyRmllbGRVdGlsc0ZpZWxkSXRlcmFibGUgOiBwdWJsaWMgQzJGaWVsZFV0aWxzOjpMaXN0OjpJbXBsIHsKKyAgICAvLy8gcmV0dXJucyBhbiBpdGVyYXRvciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaXN0CisgICAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8QzJGaWVsZFV0aWxzOjpJdGVyYXRvcjo6SW1wbD4gYmVnaW4oKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBzdGQ6Om1ha2Vfc2hhcmVkPEMyRmllbGRVdGlsc0ZpZWxkc0l0ZXJhdG9yPigqX21QYXJhbSwgX21SZWZsZWN0b3IpOworICAgIH07CisKKyAgICBDMkZpZWxkVXRpbHNGaWVsZEl0ZXJhYmxlKGNvbnN0IEMyUGFyYW0gJnBhcmFtLCBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gcmVmbGVjdG9yKQorICAgICAgICA6IF9tUGFyYW0oJnBhcmFtKSwgX21SZWZsZWN0b3IocmVmbGVjdG9yKSB7IH0KKworcHJpdmF0ZToKKyAgICBjb25zdCBDMlBhcmFtICpfbVBhcmFtOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiBfbVJlZmxlY3RvcjsKK307CisKK30KKworQzJGaWVsZFV0aWxzOjpMaXN0IEMyRmllbGRVdGlsczo6ZW51bWVyYXRlRmllbGRzKAorICAgICAgICBjb25zdCBDMlBhcmFtICZwYXJhbSwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+ICZyZWZsZWN0b3IpIHsKKyAgICByZXR1cm4gQzJGaWVsZFV0aWxzOjpMaXN0KHN0ZDo6bWFrZV9zaGFyZWQ8QzJGaWVsZFV0aWxzRmllbGRJdGVyYWJsZT4ocGFyYW0sIHJlZmxlY3RvcikpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEMyRmllbGRVdGlsczo6ZW51bWVyYXRlIHNpYmxpbmdzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworbmFtZXNwYWNlIHsKKworc3RydWN0IEMyRmllbGRVdGlsc0NvdXNpbnNJdGVyYXRvciA6IHB1YmxpYyBDMkZpZWxkVXRpbHM6Okl0ZXJhdG9yOjpJbXBsIHsKKyAgICBDMkZpZWxkVXRpbHNDb3VzaW5zSXRlcmF0b3IoCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyRmllbGRVdGlsczo6SW5mbzo6SW1wbD4gJmluZm8sIHNpemVfdCBsZXZlbCkKKyAgICAgICAgICAvLyBjbG9uZSBpbmZvIGNoYWluIGFzIHRoaXMgaXRlcmF0b3Igd2lsbCBjaGFuZ2UgaXQKKyAgICAgICAgOiBDMkZpZWxkVXRpbHM6Okl0ZXJhdG9yOjpJbXBsKEMyRmllbGRVdGlsczo6SW5mbzo6SW1wbDo6Q2xvbmUoaW5mbykpIHsKKyAgICAgICAgaWYgKGxldmVsID09IDApIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHN0b3JlIHBhcmVudCBjaGFpbiAodXAgdG8gbGV2ZWwpIGZvciBxdWljayBhY2Nlc3MKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyRmllbGRVdGlsczo6SW5mbzo6SW1wbD4gbm9kZSA9IG1IZWFkOworICAgICAgICBzaXplX3QgaXggPSAwOworICAgICAgICBmb3IgKDsgaXggPCBsZXZlbCAmJiBub2RlOyArK2l4KSB7CisgICAgICAgICAgICBub2RlLT5pbmRleCA9IDA7CisgICAgICAgICAgICBfbVBhdGguZW1wbGFjZV9iYWNrKG5vZGUpOworICAgICAgICAgICAgbm9kZSA9IG5vZGUtPnBhcmVudDsKKyAgICAgICAgfQorICAgICAgICBzZXR1cFBhdGgoaXgpOworICAgIH0KKworICAgIHZpcnR1YWwgfkMyRmllbGRVdGlsc0NvdXNpbnNJdGVyYXRvcigpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIC8vLyBJbmNyZW1lbnRzIHRoaXMgaXRlcmF0b3IgYnkgdmlzaXRpbmcgZWFjaCBpbmRleC4KKyAgICB2aXJ0dWFsIHZvaWQgaW5jcmVtZW50KCkgb3ZlcnJpZGUgeworICAgICAgICBzaXplX3QgaXggPSAwOworICAgICAgICB3aGlsZSAoaXggPCBfbVBhdGguc2l6ZSgpKSB7CisgICAgICAgICAgICBpZiAoKytfbVBhdGhbaXhdLT5pbmRleCA8IF9tUGF0aFtpeF0tPnVzZWRFeHRlbnQpIHsKKyAgICAgICAgICAgICAgICBzZXR1cFBhdGgoaXggKyAxKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfbVBhdGhbaXgrK10tPmluZGV4ID0gMDsKKyAgICAgICAgfQorICAgICAgICBtSGVhZC5yZXNldCgpOworICAgIH0KKworcHJpdmF0ZToKKyAgICAvLy8gYWRqdXN0cyBmaWVsZCBvZmZzZXRzIGFsb25nIHRoZSBwYXRoIHVwIHRvIHRoZSBzcGVjaWZpYyBsZXZlbCAtIDEuCisgICAgLy8vIFRoaXMgaW4tZmFjdCBoYXMgdG8gYmUgZG9uZSBkb3duIHRoZSBwYXRoIGZyb20gcGFyZW50IHRvIGNoaWxkIGFzIGNoaWxkIGZpZWxkcyBtdXN0CisgICAgLy8vIGZhbGwgd2l0aGluIHBhcmVudCBmaWVsZHMuCisgICAgdm9pZCBzZXR1cFBhdGgoc2l6ZV90IGxldmVsKSB7CisgICAgICAgIEMyX0NIRUNLX0xFKGxldmVsLCBfbVBhdGguc2l6ZSgpKTsKKyAgICAgICAgdWludDMyX3Qgb2xkQXJyYXlPZmZzZXQgPSBsZXZlbCA/IF9tUGF0aFtsZXZlbCAtIDFdLT5hcnJheU9mZnNldCA6IDAgLyogdW51c2VkICovOworICAgICAgICB3aGlsZSAobGV2ZWwpIHsKKyAgICAgICAgICAgIC0tbGV2ZWw7CisgICAgICAgICAgICBDMkZpZWxkVXRpbHM6OkluZm86OkltcGwgJnBhdGggPSAqX21QYXRoW2xldmVsXTsKKyAgICAgICAgICAgIHVpbnQzMl90IHNpemUgPSBHZXRTaXplKHBhdGguZmllbGQpOworICAgICAgICAgICAgdWludDMyX3Qgb2Zmc2V0ID0gcGF0aC5hcnJheU9mZnNldCArIHNpemUgKiBwYXRoLmluZGV4OworICAgICAgICAgICAgU2V0T2Zmc2V0KHBhdGguZmllbGQsIG9mZnNldCk7CisgICAgICAgICAgICBpZiAobGV2ZWwpIHsKKyAgICAgICAgICAgICAgICAvLyByZXNldCBjaGlsZCdzIGFycmF5IG9mZnNldCB0byBmYWxsIHdpdGhpbiBjdXJyZW50IGluZGV4LCBidXQgaG9sZCBvbnRvIHRoZQorICAgICAgICAgICAgICAgIC8vIG9yaWdpbmFsIHZhbHVlIG9mIHRoZSBhcnJheU9mZnNldCBzbyB0aGF0IHdlIGNhbiBhZGp1c3Qgc3Vic2VxdWVudCBjaGlsZHJlbi4KKyAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGJlY2F1c2UgdGhlIG1vZHVsbyBpcyBvbmx5IGRlZmluZWQgd2l0aGluIHRoZSBjdXJyZW50IGFycmF5LgorICAgICAgICAgICAgICAgIHVpbnQzMl90IGNoaWxkQXJyYXlPZmZzZXQgPQorICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKyAoX21QYXRoW2xldmVsIC0gMV0tPmFycmF5T2Zmc2V0IC0gb2xkQXJyYXlPZmZzZXQpICUgc2l6ZTsKKyAgICAgICAgICAgICAgICBvbGRBcnJheU9mZnNldCA9IF9tUGF0aFtsZXZlbCAtIDFdLT5hcnJheU9mZnNldDsKKyAgICAgICAgICAgICAgICBfbVBhdGhbbGV2ZWwgLSAxXS0+YXJyYXlPZmZzZXQgPSBjaGlsZEFycmF5T2Zmc2V0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyRmllbGRVdGlsczo6SW5mbzo6SW1wbD4+IF9tUGF0aDsKK307CisKKy8qKgorICogSXRlcmFibGUgaW1wbGVtZW50aW5nIGVudW1lcmF0ZUZpZWxkcygpLgorICovCitzdHJ1Y3QgQzJGaWVsZFV0aWxzQ291c2luc0l0ZXJhYmxlIDogcHVibGljIEMyRmllbGRVdGlsczo6TGlzdDo6SW1wbCB7CisgICAgLy8vIHJldHVybnMgYW4gaXRlcmF0b3IgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGlzdAorICAgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPEMyRmllbGRVdGlsczo6SXRlcmF0b3I6OkltcGw+IGJlZ2luKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gc3RkOjptYWtlX3NoYXJlZDxDMkZpZWxkVXRpbHNDb3VzaW5zSXRlcmF0b3I+KF9tSGVhZCwgX21MZXZlbCk7CisgICAgfTsKKworICAgIEMyRmllbGRVdGlsc0NvdXNpbnNJdGVyYWJsZShjb25zdCBDMkZpZWxkVXRpbHM6OkluZm8gJmZpZWxkLCB1aW50MzJfdCBsZXZlbCkKKyAgICAgICAgOiBfbUhlYWQoQzJGaWVsZFV0aWxzOjpfSW5zcGVjdG9yOjpHZXRJbXBsKGZpZWxkKSksIF9tTGV2ZWwobGV2ZWwpIHsgfQorCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkZpZWxkVXRpbHM6OkluZm86OkltcGw+IF9tSGVhZDsKKyAgICBzaXplX3QgX21MZXZlbDsKK307CisKK30KKworQzJGaWVsZFV0aWxzOjpMaXN0IEMyRmllbGRVdGlsczo6ZW51bWVyYXRlQ291c2lucyhjb25zdCBDMkZpZWxkVXRpbHM6OkluZm8gJmZpZWxkLCB1aW50MzJfdCBsZXZlbCkgeworICAgIHJldHVybiBDMkZpZWxkVXRpbHM6Okxpc3Qoc3RkOjptYWtlX3NoYXJlZDxDMkZpZWxkVXRpbHNDb3VzaW5zSXRlcmFibGU+KGZpZWxkLCBsZXZlbCkpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEMyRmllbGRVdGlsczo6bG9jYXRlRmllbGQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCituYW1lc3BhY2UgeworCisvKioKKyAqIEl0ZXJhdG9yIGltcGxlbWVudGluZyBsb2NhdGVGaWVsZCgpLgorICovCitzdHJ1Y3QgQzJGaWVsZFV0aWxzRmllbGRMb2NhdG9yIDogcHVibGljIEMyRmllbGRVdGlsc0ZpZWxkc0l0ZXJhdG9ySGVscGVyIHsKKyAgICBDMkZpZWxkVXRpbHNGaWVsZExvY2F0b3IoCisgICAgICAgICAgICBDMlBhcmFtOjpDb3JlSW5kZXggaW5kZXgsIGNvbnN0IF9DMkZpZWxkSWQgJmZpZWxkLCB1aW50MzJfdCBwYXJhbVNpemUsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gcmVmbGVjdG9yKQorICAgICAgICA6IEMyRmllbGRVdGlsc0ZpZWxkc0l0ZXJhdG9ySGVscGVyKHJlZmxlY3RvciwgcGFyYW1TaXplKSwKKyAgICAgICAgICBfbUZpZWxkKGZpZWxkKSB7CisgICAgICAgIHdoaWxlIChkZXNjZW5kSW50byhpbmRleCkpIHsKKyAgICAgICAgICAgIGlmICgobUhlYWQtPmZpZWxkLnR5cGUoKSAmIEMyRmllbGREZXNjcmlwdG9yOjpTVFJVQ1RfRkxBRykgPT0gMCkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW5kZXggPSBDMlBhcmFtOjpDb3JlSW5kZXgobUhlYWQtPmZpZWxkLnR5cGUoKSAmfiBDMkZpZWxkRGVzY3JpcHRvcjo6U1RSVUNUX0ZMQUcpOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBpbmNyZW1lbnQoKSB7CisgICAgICAgIG1IZWFkID0gX21UYWlsOworICAgICAgICBfbVRhaWwgPSBudWxscHRyOworICAgIH0KKworcHJpdmF0ZToKKyAgICAvLy8gSWYgdGhlIGN1cnJlbnQgZmllbGQgaXMgYSBrbm93biwgdmFsaWQgKHVudHJhdmVyc2VkKSBzdHJ1Y3R1cmUsIGl0IG1vZGlmaWVzIHRoaXMgaXRlcmF0b3IKKyAgICAvLy8gdG8gcG9pbnQgdG8gdGhlIGZpZWxkIGF0IHRoZSBiZWdpbm5pbmcvZW5kIG9mIHRoZSBnaXZlbiBmaWVsZCBvZiB0aGUgc3RydWN0dXJlIGFuZCByZXR1cm5zCisgICAgLy8vIHRydWUuIE90aGVyd2lzZSwgaW5jbHVkaW5nIGlmIG5vIHN1Y2ggZmllbGQgZXhpc3RzIGluIHRoZSBzdHJ1Y3R1cmUsIGl0IGRvZXMgbm90IG1vZGlmeSB0aGlzCisgICAgLy8vIGl0ZXJhdG9yIGFuZCByZXR1cm5zIGZhbHNlLgorICAgIGJvb2wgZGVzY2VuZEludG8oQzJQYXJhbTo6Q29yZUluZGV4IGluZGV4KSB7CisgICAgICAgIC8vIGNoZWNrIHRoYXQgdGhlIGJvdW5kYXJpZXMgb2YgdGhlIGZpZWxkIHRvIGJlIGxvY2F0ZWQgYXJlIHN0aWxsIHdpdGhpbiB0aGUgc2FtZSBwYXJlbnQKKyAgICAgICAgLy8gZmllbGQKKyAgICAgICAgaWYgKG1IZWFkICE9IF9tVGFpbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyU3RydWN0RGVzY3JpcHRvcj4gZGVzY1VuaXF1ZSA9IG1SZWZsZWN0b3ItPmRlc2NyaWJlKGluZGV4KTsKKyAgICAgICAgLy8gZGVzY2VuZCBpbnRvIGtub3duIHN0cnVjdHMgKGFzIGxvbmcgYXMgdGhleSBoYXZlIGF0IGxlYXN0IG9uZSBmaWVsZCkKKyAgICAgICAgaWYgKGRlc2NVbmlxdWUgJiYgZGVzY1VuaXF1ZS0+YmVnaW4oKSAhPSBkZXNjVW5pcXVlLT5lbmQoKSkgeworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RydWN0RGVzY3JpcHRvcj4gZGVzYyhzdGQ6Om1vdmUoZGVzY1VuaXF1ZSkpOworICAgICAgICAgICAgbUhpc3RvcnkuZW1wbGFjZV9iYWNrKGRlc2MpOworCisgICAgICAgICAgICB1aW50MzJfdCBwYXJlbnRPZmZzZXQgPSBHZXRQYXJlbnRPZmZzZXQobUhlYWQpOworCisgICAgICAgICAgICAvLyBsb2NhdGUgZmllbGQgdXNpbmcgYSBkdW1teSBmaWVsZCBkZXNjcmlwdG9yCisgICAgICAgICAgICBDMkZpZWxkRGVzY3JpcHRvciBkdW1teSA9IHsKKyAgICAgICAgICAgICAgICBDMkZpZWxkRGVzY3JpcHRvcjo6QkxPQiwgMSAvKiBleHRlbnQgKi8sICJuYW1lIiwKKyAgICAgICAgICAgICAgICBHZXRPZmZzZXQoX21GaWVsZCkgLSBwYXJlbnRPZmZzZXQsIEdldFNpemUoX21GaWVsZCkKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIC8vIGxvY2F0ZSBmaXJzdCBmaWVsZCB3aGVyZSBvZmZzZXQgaXMgZ3JlYXRlciB0aGFuIGR1bW15IG9mZnNldCAod2hpY2ggaXMgb25lIHBhc3QpCisgICAgICAgICAgICBhdXRvIGl0ID0gc3RkOjp1cHBlcl9ib3VuZCgKKyAgICAgICAgICAgICAgICAgICAgZGVzYy0+Y2JlZ2luKCksIGRlc2MtPmNlbmQoKSwgZHVtbXksCisgICAgICAgICAgICAgICAgICAgIFtdKGNvbnN0IEMyRmllbGREZXNjcmlwdG9yICZhLCBjb25zdCBDMkZpZWxkRGVzY3JpcHRvciAmYikgLT4gYm9vbCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9DMlBhcmFtSW5zcGVjdG9yOjpHZXRPZmZzZXQoYSkgPCBfQzJQYXJhbUluc3BlY3Rvcjo6R2V0T2Zmc2V0KGIpOworICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBpZiAoaXQgPT0gZGVzYy0+YmVnaW4oKSkgeworICAgICAgICAgICAgICAgIC8vIGZpZWxkIGlzIHByaW9yIHRvIGZpcnN0IGZpZWxkCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLS1pdDsKKyAgICAgICAgICAgIGNvbnN0IEMyRmllbGREZXNjcmlwdG9yICZmaWVsZCA9ICppdDsKKworICAgICAgICAgICAgLy8gY2hlY2sgdGhhdCBkdW1teSBlbmQtb2Zmc2V0IGlzIHdpdGhpbiB0aGlzIGZpZWxkCisgICAgICAgICAgICB1aW50MzJfdCBzdHJ1Y3RTaXplID0gc3RkOjptYXgobVBhcmFtU2l6ZSwgcGFyZW50T2Zmc2V0KSAtIHBhcmVudE9mZnNldDsKKyAgICAgICAgICAgIGlmIChHZXRFbmRPZmZzZXQoZHVtbXkpID4gR2V0RW5kT2Zmc2V0KGZpZWxkLCBzdHJ1Y3RTaXplKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdWludDMyX3Qgc3RhcnRJbmRleCA9IChHZXRPZmZzZXQoZHVtbXkpIC0gR2V0T2Zmc2V0KGZpZWxkKSkgLyBHZXRTaXplKGZpZWxkKTsKKyAgICAgICAgICAgIHVpbnQzMl90IGVuZEluZGV4ID0KKyAgICAgICAgICAgICAgICAoR2V0RW5kT2Zmc2V0KGR1bW15KSAtIEdldE9mZnNldChmaWVsZCkgKyBHZXRTaXplKGZpZWxkKSAtIDEpIC8gR2V0U2l6ZShmaWVsZCk7CisgICAgICAgICAgICBpZiAoZW5kSW5kZXggPiBzdGFydEluZGV4KSB7CisgICAgICAgICAgICAgICAgLy8gRmllbGQgc2l6ZSBjb3VsZCBiZSB6ZXJvLCBpbiB3aGljaCBjYXNlIGVuZCBpbmRleCBpcyBzdGlsbCBvbiBzdGFydCBpbmRleC4KKyAgICAgICAgICAgICAgICAvLyBIb3dldmVyLCBmb3IgYWxsIG90aGVyIGNhc2VzLCBlbmRJbmRleCB3YXMgcm91bmRlZCB1cCB0byB0aGUgbmV4dCBpbmRleCwgc28KKyAgICAgICAgICAgICAgICAvLyBkZWNyZW1lbnQgaXQuCisgICAgICAgICAgICAgICAgLS1lbmRJbmRleDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkZpZWxkVXRpbHM6OkluZm86OkltcGw+IHN0YXJ0TGVhZiA9CisgICAgICAgICAgICAgICAgbWFrZUxlYWYoZmllbGQsIHN0YXJ0SW5kZXgpOworICAgICAgICAgICAgaWYgKGVuZEluZGV4ID09IHN0YXJ0SW5kZXgpIHsKKyAgICAgICAgICAgICAgICBfbVRhaWwgPSBzdGFydExlYWY7CisgICAgICAgICAgICAgICAgbUhlYWQgPSBzdGFydExlYWY7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIF9tVGFpbCA9IG1ha2VMZWFmKGZpZWxkLCBlbmRJbmRleCk7CisgICAgICAgICAgICAgICAgbUhlYWQgPSBzdGFydExlYWY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgX0MyRmllbGRJZCBfbUZpZWxkOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkZpZWxkVXRpbHM6OkluZm86OkltcGw+IF9tVGFpbDsKK307CisKKy8qKgorICogSXRlcmFibGUgaW1wbGVtZW50aW5nIGxvY2F0ZUZpZWxkKCkuCisgKi8KK3N0cnVjdCBDMkZpZWxkVXRpbHNGaWVsZExvY2F0aW9uIDogcHVibGljIEMyRmllbGRVdGlsczo6TGlzdDo6SW1wbCB7CisgICAgLy8vIHJldHVybnMgYW4gaXRlcmF0b3IgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGlzdAorICAgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPEMyRmllbGRVdGlsczo6SXRlcmF0b3I6OkltcGw+IGJlZ2luKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gc3RkOjptYWtlX3NoYXJlZDxDMkZpZWxkVXRpbHNGaWVsZExvY2F0b3I+KAorICAgICAgICAgICAgICAgIF9tSW5kZXgsIF9tRmllbGQsIF9tUGFyYW1TaXplLCBfbVJlZmxlY3Rvcik7CisgICAgfTsKKworICAgIEMyRmllbGRVdGlsc0ZpZWxkTG9jYXRpb24oCisgICAgICAgICAgICBjb25zdCBDMlBhcmFtRmllbGQgJnBmLCBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gcmVmbGVjdG9yKQorICAgICAgICA6IF9tSW5kZXgoQzJQYXJhbTo6Q29yZUluZGV4KF9DMlBhcmFtSW5zcGVjdG9yOjpHZXRJbmRleChwZikpKSwKKyAgICAgICAgICBfbUZpZWxkKF9DMlBhcmFtSW5zcGVjdG9yOjpHZXRGaWVsZChwZikpLAorICAgICAgICAgIF9tUGFyYW1TaXplKDApLAorICAgICAgICAgIF9tUmVmbGVjdG9yKHJlZmxlY3RvcikgeyB9CisKKworICAgIEMyRmllbGRVdGlsc0ZpZWxkTG9jYXRpb24oCisgICAgICAgICAgICBjb25zdCBDMlBhcmFtICZwYXJhbSwgY29uc3QgX0MyRmllbGRJZCAmZmllbGQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gcmVmbGVjdG9yKQorICAgICAgICA6IF9tSW5kZXgocGFyYW0uY29yZUluZGV4KCkpLAorICAgICAgICAgIF9tRmllbGQoZmllbGQpLAorICAgICAgICAgIF9tUGFyYW1TaXplKHBhcmFtLnNpemUoKSksCisgICAgICAgICAgX21SZWZsZWN0b3IocmVmbGVjdG9yKSB7IH0KKworcHJpdmF0ZToKKyAgICBDMlBhcmFtOjpDb3JlSW5kZXggX21JbmRleDsKKyAgICBfQzJGaWVsZElkIF9tRmllbGQ7CisgICAgdWludDMyX3QgX21QYXJhbVNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+IF9tUmVmbGVjdG9yOworfTsKKworfQorCitzdGQ6OnZlY3RvcjxDMkZpZWxkVXRpbHM6OkluZm8+IEMyRmllbGRVdGlsczo6bG9jYXRlRmllbGQoCisgICAgICAgIGNvbnN0IEMyUGFyYW1GaWVsZCAmcGYsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiAmcmVmbGVjdG9yKSB7CisgICAgQzJGaWVsZFV0aWxzOjpMaXN0IGxvY2F0aW9uID0geyBzdGQ6Om1ha2Vfc2hhcmVkPEMyRmllbGRVdGlsc0ZpZWxkTG9jYXRpb24+KHBmLCByZWZsZWN0b3IpIH07CisgICAgcmV0dXJuIHN0ZDo6dmVjdG9yPEluZm8+KGxvY2F0aW9uLmJlZ2luKCksIGxvY2F0aW9uLmVuZCgpKTsKK30KKworc3RkOjp2ZWN0b3I8QzJGaWVsZFV0aWxzOjpJbmZvPiBDMkZpZWxkVXRpbHM6OmxvY2F0ZUZpZWxkKAorICAgICAgICBjb25zdCBDMlBhcmFtICZwYXJhbSwgY29uc3QgX0MyRmllbGRJZCAmZmllbGQsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiAmcmVmbGVjdG9yKSB7CisgICAgQzJGaWVsZFV0aWxzOjpMaXN0IGxvY2F0aW9uID0geworICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyRmllbGRVdGlsc0ZpZWxkTG9jYXRpb24+KHBhcmFtLCBmaWVsZCwgcmVmbGVjdG9yKQorICAgIH07CisgICAgcmV0dXJuIHN0ZDo6dmVjdG9yPEluZm8+KGxvY2F0aW9uLmJlZ2luKCksIGxvY2F0aW9uLmVuZCgpKTsKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvdXRpbC9DMlBhcmFtVXRpbHMuY3BwIGIvbWVkaWEvY29kZWMyL3ZuZGsvdXRpbC9DMlBhcmFtVXRpbHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwNTczZDgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay91dGlsL0MyUGFyYW1VdGlscy5jcHAKQEAgLTAsMCArMSwyMDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIF9fQzJfR0VORVJBVEVfR0xPQkFMX1ZBUlNfXyAvLyB0byBiZSBhYmxlIHRvIGltcGxlbWVudCB0aGUgbWV0aG9kcyBkZWZpbmVkCisjaW5jbHVkZSA8QzJFbnVtLmg+CisjaW5jbHVkZSA8dXRpbC9DMkRlYnVnLWxvZy5oPgorI2luY2x1ZGUgPHV0aWwvQzJQYXJhbVV0aWxzLmg+CisKKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworLyoqIFxmaWxlCisgKiBVdGlsaXRpZXMgZm9yIHBhcmFtZXRlciBoYW5kbGluZyB0byBiZSB1c2VkIGJ5IENvZGVjMiBpbXBsZW1lbnRhdGlvbnMuCisgKi8KKworLy8vIFxjb25kIElOVEVSTkFMCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVVRJTElUSUVTIEZPUiBFTlVNRVJBVElPTiBSRUZMRUNUSU9OIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHNpemVfdCBjb3VudExlYWRpbmdVbmRlcnNjb3JlcyhDMlN0cmluZ0xpdGVyYWwgYSkgeworICAgIHNpemVfdCBpID0gMDsKKyAgICB3aGlsZSAoYVtpXSA9PSAnXycpIHsKKyAgICAgICAgKytpOworICAgIH0KKyAgICByZXR1cm4gaTsKK30KKworc3RhdGljIHNpemVfdCBjb3VudE1hdGNoaW5nKEMyU3RyaW5nTGl0ZXJhbCBhLCBjb25zdCBDMlN0cmluZyAmYikgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYi5zaXplKCk7ICsraSkgeworICAgICAgICBpZiAoIWFbaV0gfHwgYVtpXSAhPSBiW2ldKSB7CisgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gYi5zaXplKCk7Cit9CisKKy8vIEFCQ0RlZiA9PiBhYmMtZGVmCisvLyBBQkNEMmVmID0+IGFiY2QyLWVmIC8vIDAKKy8vIEFCQ0QyRWYgPT4gYW5jZDItZWYgLy8gLTEKKy8vIEFiY0RlZiA9PiBhYmMtZGVmIC8vIC0xCisvLyBBYmMyRGVmID0+IGFiYy0yZGVmCisvLyBBYmMyZGVmID0+IGFiYy0yLWRlZgorLy8gX1lvID0+IF95bworLy8gX3lvID0+IF95bworLy8gQzJfeW8gPT4gYzIteW8KKy8vIEMyX195byA9PiBjMi15bworCisvL3N0YXRpYworQzJTdHJpbmcgX0MyRW51bVV0aWxzOjpjYW1lbENhc2VUb0Rhc2hlZChDMlN0cmluZyBuYW1lKSB7CisgICAgZW51bSB7CisgICAgICAgIGtOb25lID0gJy4nLAorICAgICAgICBrTG93ZXIgPSAnYScsCisgICAgICAgIGtVcHBlciA9ICdBJywKKyAgICAgICAga0RpZ2l0ID0gJzEnLAorICAgICAgICBrRGFzaCA9ICctJywKKyAgICAgICAga1VuZGVyc2NvcmUgPSAnXycsCisgICAgfSB0eXBlID0ga05vbmU7CisgICAgc2l6ZV90IHdvcmRfc3RhcnQgPSAwOworICAgIGZvciAoc2l6ZV90IGl4ID0gMDsgaXggPCBuYW1lLnNpemUoKTsgKytpeCkgeworICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgbmFtZS5zdWJzdHIoMCwgd29yZF9zdGFydCkgPDwgInwiCisgICAgICAgICAgICAgICAgPDwgbmFtZS5zdWJzdHIod29yZF9zdGFydCwgaXggLSB3b3JkX3N0YXJ0KSA8PCAiWyIKKyAgICAgICAgICAgICAgICA8PCBuYW1lLnN1YnN0cihpeCwgMSkgPDwgIl0iIDw8IG5hbWUuc3Vic3RyKGl4ICsgMSkKKyAgICAgICAgICAgICAgICA8PCAiOiAiIDw8IChjaGFyKXR5cGU7CisgICAgICAgIGlmIChpc3VwcGVyKG5hbWVbaXhdKSkgeworICAgICAgICAgICAgaWYgKHR5cGUgPT0ga0xvd2VyKSB7CisgICAgICAgICAgICAgICAgbmFtZS5pbnNlcnQoaXgrKywgMSwgJy0nKTsKKyAgICAgICAgICAgICAgICB3b3JkX3N0YXJ0ID0gaXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBuYW1lW2l4XSA9IHRvbG93ZXIobmFtZVtpeF0pOworICAgICAgICAgICAgdHlwZSA9IGtVcHBlcjsKKyAgICAgICAgfSBlbHNlIGlmIChpc2xvd2VyKG5hbWVbaXhdKSkgeworICAgICAgICAgICAgaWYgKHR5cGUgPT0ga0RpZ2l0ICYmIGl4ID4gMCkgeworICAgICAgICAgICAgICAgIG5hbWUuaW5zZXJ0KGl4KyssIDEsICctJyk7CisgICAgICAgICAgICAgICAgd29yZF9zdGFydCA9IGl4OworICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IGtVcHBlciAmJiBpeCA+IHdvcmRfc3RhcnQgKyAxKSB7CisgICAgICAgICAgICAgICAgbmFtZS5pbnNlcnQoaXgrKyAtIDEsIDEsICctJyk7CisgICAgICAgICAgICAgICAgd29yZF9zdGFydCA9IGl4IC0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHR5cGUgPSBrTG93ZXI7CisgICAgICAgIH0gZWxzZSBpZiAoaXNkaWdpdChuYW1lW2l4XSkpIHsKKyAgICAgICAgICAgIGlmICh0eXBlID09IGtMb3dlcikgeworICAgICAgICAgICAgICAgIG5hbWUuaW5zZXJ0KGl4KyssIDEsICctJyk7CisgICAgICAgICAgICAgICAgd29yZF9zdGFydCA9IGl4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHlwZSA9IGtEaWdpdDsKKyAgICAgICAgfSBlbHNlIGlmIChuYW1lW2l4XSA9PSAnXycpIHsKKyAgICAgICAgICAgIGlmICh0eXBlID09IGtEYXNoKSB7CisgICAgICAgICAgICAgICAgbmFtZS5lcmFzZShpeC0tLCAxKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSAhPSBrTm9uZSAmJiB0eXBlICE9IGtVbmRlcnNjb3JlKSB7CisgICAgICAgICAgICAgICAgbmFtZVtpeF0gPSAnLSc7CisgICAgICAgICAgICAgICAgdHlwZSA9IGtEYXNoOworICAgICAgICAgICAgICAgIHdvcmRfc3RhcnQgPSBpeCArIDE7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHR5cGUgPSBrVW5kZXJzY29yZTsKKyAgICAgICAgICAgICAgICB3b3JkX3N0YXJ0ID0gaXggKyAxOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbmFtZS5yZXNpemUoaXgpOworICAgICAgICB9CisgICAgfQorICAgIEMyX0xPRyhWRVJCT1NFKSA8PCAiPT4gIiA8PCBuYW1lOworICAgIHJldHVybiBuYW1lOworfQorCisvL3N0YXRpYworc3RkOjp2ZWN0b3I8QzJTdHJpbmc+IF9DMkVudW1VdGlsczo6c2FuaXRpemVFbnVtVmFsdWVOYW1lcygKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJTdHJpbmdMaXRlcmFsPiBuYW1lcywKKyAgICAgICAgQzJTdHJpbmdMaXRlcmFsIF9wcmVmaXgpIHsKKyAgICBzdGQ6OnZlY3RvcjxDMlN0cmluZz4gc2FuaXRpemVkTmFtZXM7CisgICAgQzJTdHJpbmcgcHJlZml4OworICAgIHNpemVfdCBleHRyYVVuZGVyc2NvcmVzID0gMDsKKyAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICBpZiAoX3ByZWZpeCkgeworICAgICAgICBleHRyYVVuZGVyc2NvcmVzID0gY291bnRMZWFkaW5nVW5kZXJzY29yZXMoX3ByZWZpeCk7CisgICAgICAgIHByZWZpeCA9IF9wcmVmaXggKyBleHRyYVVuZGVyc2NvcmVzOworICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgInByZWZpeDoiIDw8IHByZWZpeCA8PCAiLCB1bmRlcnNjb3JlczoiIDw8IGV4dHJhVW5kZXJzY29yZXM7CisgICAgfQorCisgICAgLy8gY2FsY3VsYXRlIHByZWZpeCBhbmQgbWluaW11bSBsZWFkaW5nIHVuZGVyc2NvcmVzCisgICAgZm9yIChDMlN0cmluZ0xpdGVyYWwgcyA6IG5hbWVzKSB7CisgICAgICAgIEMyX0xPRyhWRVJCT1NFKSA8PCBzOworICAgICAgICBzaXplX3QgdW5kZXJzY29yZXMgPSBjb3VudExlYWRpbmdVbmRlcnNjb3JlcyhzKTsKKyAgICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgICAgICBleHRyYVVuZGVyc2NvcmVzID0gdW5kZXJzY29yZXM7CisgICAgICAgICAgICBwcmVmaXggPSBzICsgdW5kZXJzY29yZXM7CisgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2l6ZV90IG1hdGNoaW5nID0gY291bnRNYXRjaGluZygKKyAgICAgICAgICAgICAgICBzICsgdW5kZXJzY29yZXMsCisgICAgICAgICAgICAgICAgcHJlZml4KTsKKyAgICAgICAgICAgIHByZWZpeC5yZXNpemUobWF0Y2hpbmcpOworICAgICAgICAgICAgZXh0cmFVbmRlcnNjb3JlcyA9IHN0ZDo6bWluKHVuZGVyc2NvcmVzLCBleHRyYVVuZGVyc2NvcmVzKTsKKyAgICAgICAgfQorICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgInByZWZpeDoiIDw8IHByZWZpeCA8PCAiLCB1bmRlcnNjb3JlczoiIDw8IGV4dHJhVW5kZXJzY29yZXM7CisgICAgICAgIGlmIChwcmVmaXguc2l6ZSgpID09IDAgJiYgZXh0cmFVbmRlcnNjb3JlcyA9PSAwKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIHdlIHN3YWxsb3cgdGhlIGZpcnN0IHVuZGVyc2NvcmUgYWZ0ZXIgdXBwZXIgY2FzZSBwcmVmaXhlcworICAgIGJvb2wgdXBwZXJDYXNlUHJlZml4ID0gdHJ1ZTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHByZWZpeC5zaXplKCk7ICsraSkgeworICAgICAgICBpZiAoaXNsb3dlcihwcmVmaXhbaV0pKSB7CisgICAgICAgICAgICB1cHBlckNhc2VQcmVmaXggPSBmYWxzZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChDMlN0cmluZ0xpdGVyYWwgcyA6IG5hbWVzKSB7CisgICAgICAgIHNpemVfdCB1bmRlcnNjb3JlcyA9IGNvdW50TGVhZGluZ1VuZGVyc2NvcmVzKHMpOworICAgICAgICBDMlN0cmluZyBzYW5pdGl6ZWQgPSBDMlN0cmluZyhzLCB1bmRlcnNjb3JlcyAtIGV4dHJhVW5kZXJzY29yZXMpOworICAgICAgICBzYW5pdGl6ZWQuYXBwZW5kKHMgKyBwcmVmaXguc2l6ZSgpICsgdW5kZXJzY29yZXMgKworICAgICAgICAgICAgICAgICAgICAodXBwZXJDYXNlUHJlZml4ICYmIHNbcHJlZml4LnNpemUoKSArIHVuZGVyc2NvcmVzXSA9PSAnXycpKTsKKyAgICAgICAgc2FuaXRpemVkTmFtZXMucHVzaF9iYWNrKGNhbWVsQ2FzZVRvRGFzaGVkKHNhbml0aXplZCkpOworICAgIH0KKworICAgIGZvciAoQzJTdHJpbmcgcyA6IHNhbml0aXplZE5hbWVzKSB7CisgICAgICAgIEMyX0xPRyhWRVJCT1NFKSA8PCBzOworICAgIH0KKworICAgIHJldHVybiBzYW5pdGl6ZWROYW1lczsKK30KKworLy9zdGF0aWMKK3N0ZDo6dmVjdG9yPEMyU3RyaW5nPiBfQzJFbnVtVXRpbHM6OnBhcnNlRW51bVZhbHVlc0Zyb21TdHJpbmcoQzJTdHJpbmdMaXRlcmFsIHZhbHVlKSB7CisgICAgc3RkOjp2ZWN0b3I8QzJTdHJpbmc+IGZvdW5kTmFtZXM7CisgICAgc2l6ZV90IHBvcyA9IDAsIGxlbiA9IHN0cmxlbih2YWx1ZSk7CisgICAgZG8geworICAgICAgICBzaXplX3QgZW5kUG9zID0gc3RyY3Nwbih2YWx1ZSArIHBvcywgIiAsPSIpICsgcG9zOworICAgICAgICBpZiAoZW5kUG9zID4gcG9zKSB7CisgICAgICAgICAgICBmb3VuZE5hbWVzLmVtcGxhY2VfYmFjayh2YWx1ZSArIHBvcywgZW5kUG9zIC0gcG9zKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodmFsdWVbZW5kUG9zXSAmJiB2YWx1ZVtlbmRQb3NdICE9ICcsJykgeworICAgICAgICAgICAgZW5kUG9zICs9IHN0cmNzcG4odmFsdWUgKyBlbmRQb3MsICIsIik7CisgICAgICAgIH0KKyAgICAgICAgcG9zID0gc3Ryc3BuKHZhbHVlICsgZW5kUG9zLCAiICwiKSArIGVuZFBvczsKKyAgICB9IHdoaWxlIChwb3MgPCBsZW4pOworICAgIHJldHVybiBmb3VuZE5hbWVzOworfQorCisvLy8gc2FmZShyKSBwYXJzaW5nIGZyb20gcGFyYW1ldGVyIGJsb2IKKy8vc3RhdGljCitDMlBhcmFtICpDMlBhcmFtVXRpbHM6OlBhcnNlRmlyc3QoY29uc3QgdWludDhfdCAqYmxvYiwgc2l6ZV90IHNpemUpIHsKKyAgICAvLyBfbVNpemUgbXVzdCBmaXQgaW50byBzaXplLCBidXQgcmVhbGx5IEMyUGFyYW0gbXVzdCBhbHNvIHRvIGJlIGEgdmFsaWQgcGFyYW0KKyAgICBpZiAoc2l6ZSA8IHNpemVvZihDMlBhcmFtKSkgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgLy8gX21TaXplIG11c3QgbWF0Y2ggbGVuZ3RoCisgICAgQzJQYXJhbSAqcGFyYW0gPSAoQzJQYXJhbSopYmxvYjsKKyAgICBpZiAocGFyYW0tPnNpemUoKSA+IHNpemUpIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIHJldHVybiBwYXJhbTsKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9hYWMvQUFDRXh0cmFjdG9yLmNwcCBiL21lZGlhL2V4dHJhY3RvcnMvYWFjL0FBQ0V4dHJhY3Rvci5jcHAKaW5kZXggOWZjNWE3Ni4uZjI3ODEwNyAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9hYWMvQUFDRXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9leHRyYWN0b3JzL2FhYy9BQUNFeHRyYWN0b3IuY3BwCkBAIC0xOSwzNCArMTksMzIgQEAKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAogI2luY2x1ZGUgIkFBQ0V4dHJhY3Rvci5oIgotI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2VCYXNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFUcmFjay5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luQXBpLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YVV0aWxzLmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLWNsYXNzIEFBQ1NvdXJjZSA6IHB1YmxpYyBNZWRpYVRyYWNrIHsKK2NsYXNzIEFBQ1NvdXJjZSA6IHB1YmxpYyBNZWRpYVRyYWNrSGVscGVyVjIgewogcHVibGljOgogICAgIEFBQ1NvdXJjZSgKLSAgICAgICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsCi0gICAgICAgICAgICBNZXRhRGF0YUJhc2UgJm1ldGEsCisgICAgICAgICAgICBEYXRhU291cmNlSGVscGVyICpzb3VyY2UsCisgICAgICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGEsCiAgICAgICAgICAgICBjb25zdCBWZWN0b3I8dWludDY0X3Q+ICZvZmZzZXRfdmVjdG9yLAogICAgICAgICAgICAgaW50NjRfdCBmcmFtZV9kdXJhdGlvbl91cyk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhQmFzZSAqcGFyYW1zID0gTlVMTCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBzdGFydCgpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3Qgc3RvcCgpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGb3JtYXQoTWV0YURhdGFCYXNlJik7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRGb3JtYXQoQU1lZGlhRm9ybWF0Kik7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoCisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCByZWFkKAogICAgICAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOwogCiBwcm90ZWN0ZWQ6CkBAIC01NCw4ICs1Miw4IEBACiAKIHByaXZhdGU6CiAgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrTWF4RnJhbWVTaXplOwotICAgIERhdGFTb3VyY2VCYXNlICptRGF0YVNvdXJjZTsKLSAgICBNZXRhRGF0YUJhc2UgbU1ldGE7CisgICAgRGF0YVNvdXJjZUhlbHBlciAqbURhdGFTb3VyY2U7CisgICAgQU1lZGlhRm9ybWF0ICptTWV0YTsKIAogICAgIG9mZjY0X3QgbU9mZnNldDsKICAgICBpbnQ2NF90IG1DdXJyZW50VGltZVVzOwpAQCAtOTIsNyArOTAsNyBAQAogLy8gVGhlIHJldHVybmVkIHZhbHVlIGlzIHRoZSBBQUMgZnJhbWUgc2l6ZSB3aXRoIHRoZSBBRFRTIGhlYWRlciBsZW5ndGggKHJlZ2FyZGxlc3Mgb2YKIC8vICAgICB0aGUgcHJlc2VuY2Ugb2YgdGhlIENSQykuCiAvLyBJZiBoZWFkZXJTaXplIGlzIG5vbi1OVUxMLCBpdCB3aWxsIGJlIHVzZWQgdG8gcmV0dXJuIHRoZSBzaXplIG9mIHRoZSBoZWFkZXIgb2YgdGhpcyBBRFRTIGZyYW1lLgotc3RhdGljIHNpemVfdCBnZXRBZHRzRnJhbWVMZW5ndGgoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgb2ZmNjRfdCBvZmZzZXQsIHNpemVfdCogaGVhZGVyU2l6ZSkgeworc3RhdGljIHNpemVfdCBnZXRBZHRzRnJhbWVMZW5ndGgoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLCBvZmY2NF90IG9mZnNldCwgc2l6ZV90KiBoZWFkZXJTaXplKSB7CiAKICAgICBjb25zdCBzaXplX3Qga0FkdHNIZWFkZXJMZW5ndGhOb0NyYyA9IDc7CiAgICAgY29uc3Qgc2l6ZV90IGtBZHRzSGVhZGVyTGVuZ3RoV2l0aENyYyA9IDk7CkBAIC0xMzMsNyArMTMxLDcgQEAKIH0KIAogQUFDRXh0cmFjdG9yOjpBQUNFeHRyYWN0b3IoCi0gICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIG9mZjY0X3Qgb2Zmc2V0KQorICAgICAgICBEYXRhU291cmNlSGVscGVyICpzb3VyY2UsIG9mZjY0X3Qgb2Zmc2V0KQogICAgIDogbURhdGFTb3VyY2Uoc291cmNlKSwKICAgICAgIG1Jbml0Q2hlY2soTk9fSU5JVCksCiAgICAgICBtRnJhbWVEdXJhdGlvblVzKDApIHsKQEAgLTE1MSw2ICsxNDksNyBAQAogICAgIH0KICAgICBjaGFubmVsID0gKGhlYWRlclswXSAmIDB4MSkgPDwgMiB8IChoZWFkZXJbMV0gPj4gNik7CiAKKyAgICBtTWV0YSA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKICAgICBNYWtlQUFDQ29kZWNTcGVjaWZpY0RhdGEobU1ldGEsIHByb2ZpbGUsIHNmX2luZGV4LCBjaGFubmVsKTsKIAogICAgIG9mZjY0X3Qgc3RyZWFtU2l6ZSwgbnVtRnJhbWVzID0gMDsKQEAgLTE3NCwyOSArMTczLDMwIEBACiAgICAgICAgIC8vIFJvdW5kIHVwIGFuZCBnZXQgdGhlIGR1cmF0aW9uCiAgICAgICAgIG1GcmFtZUR1cmF0aW9uVXMgPSAoMTAyNCAqIDEwMDAwMDBsbCArIChzciAtIDEpKSAvIHNyOwogICAgICAgICBkdXJhdGlvbiA9IG51bUZyYW1lcyAqIG1GcmFtZUR1cmF0aW9uVXM7Ci0gICAgICAgIG1NZXRhLnNldEludDY0KGtLZXlEdXJhdGlvbiwgZHVyYXRpb24pOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04sIGR1cmF0aW9uKTsKICAgICB9CiAKICAgICBtSW5pdENoZWNrID0gT0s7CiB9CiAKIEFBQ0V4dHJhY3Rvcjo6fkFBQ0V4dHJhY3RvcigpIHsKKyAgICBBTWVkaWFGb3JtYXRfZGVsZXRlKG1NZXRhKTsKIH0KIAotc3RhdHVzX3QgQUFDRXh0cmFjdG9yOjpnZXRNZXRhRGF0YShNZXRhRGF0YUJhc2UgJm1ldGEpIHsKLSAgICBtZXRhLmNsZWFyKCk7CittZWRpYV9zdGF0dXNfdCBBQUNFeHRyYWN0b3I6OmdldE1ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSkgeworICAgIEFNZWRpYUZvcm1hdF9jbGVhcihtZXRhKTsKICAgICBpZiAobUluaXRDaGVjayA9PSBPSykgewotICAgICAgICBtZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQUNfQURUUyk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQUNfQURUUyk7CiAgICAgfQogCi0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKIHNpemVfdCBBQUNFeHRyYWN0b3I6OmNvdW50VHJhY2tzKCkgewogICAgIHJldHVybiBtSW5pdENoZWNrID09IE9LID8gMSA6IDA7CiB9CiAKLU1lZGlhVHJhY2sgKkFBQ0V4dHJhY3Rvcjo6Z2V0VHJhY2soc2l6ZV90IGluZGV4KSB7CitNZWRpYVRyYWNrSGVscGVyVjIgKkFBQ0V4dHJhY3Rvcjo6Z2V0VHJhY2soc2l6ZV90IGluZGV4KSB7CiAgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0sgfHwgaW5kZXggIT0gMCkgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CkBAIC0yMDQsMTMgKzIwNCwxMiBAQAogICAgIHJldHVybiBuZXcgQUFDU291cmNlKG1EYXRhU291cmNlLCBtTWV0YSwgbU9mZnNldFZlY3RvciwgbUZyYW1lRHVyYXRpb25Vcyk7CiB9CiAKLXN0YXR1c190IEFBQ0V4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YShNZXRhRGF0YUJhc2UgJm1ldGEsIHNpemVfdCBpbmRleCwgdWludDMyX3QgLyogZmxhZ3MgKi8pIHsKK21lZGlhX3N0YXR1c190IEFBQ0V4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEsIHNpemVfdCBpbmRleCwgdWludDMyX3QgLyogZmxhZ3MgKi8pIHsKICAgICBpZiAobUluaXRDaGVjayAhPSBPSyB8fCBpbmRleCAhPSAwKSB7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgfQogCi0gICAgbWV0YSA9IG1NZXRhOwotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1lZGlhRm9ybWF0X2NvcHkobWV0YSwgbU1ldGEpOwogfQogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwpAQCAtMjE5LDggKzIxOCw4IEBACiBjb25zdCBzaXplX3QgQUFDU291cmNlOjprTWF4RnJhbWVTaXplID0gODE5MjsKIAogQUFDU291cmNlOjpBQUNTb3VyY2UoCi0gICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsCi0gICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSwKKyAgICAgICAgRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLAorICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGEsCiAgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50NjRfdD4gJm9mZnNldF92ZWN0b3IsCiAgICAgICAgIGludDY0X3QgZnJhbWVfZHVyYXRpb25fdXMpCiAgICAgOiBtRGF0YVNvdXJjZShzb3VyY2UpLApAQCAtMjM5LDcgKzIzOCw3IEBACiAgICAgfQogfQogCi1zdGF0dXNfdCBBQUNTb3VyY2U6OnN0YXJ0KE1ldGFEYXRhQmFzZSAqIC8qIHBhcmFtcyAqLykgeworbWVkaWFfc3RhdHVzX3QgQUFDU291cmNlOjpzdGFydCgpIHsKICAgICBDSEVDSyghbVN0YXJ0ZWQpOwogCiAgICAgaWYgKG1PZmZzZXRWZWN0b3IuZW1wdHkoKSkgewpAQCAtMjUzLDI1ICsyNTIsMjQgQEAKICAgICBtR3JvdXAtPmFkZF9idWZmZXIoTWVkaWFCdWZmZXJCYXNlOjpDcmVhdGUoa01heEZyYW1lU2l6ZSkpOwogICAgIG1TdGFydGVkID0gdHJ1ZTsKIAotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCi1zdGF0dXNfdCBBQUNTb3VyY2U6OnN0b3AoKSB7CittZWRpYV9zdGF0dXNfdCBBQUNTb3VyY2U6OnN0b3AoKSB7CiAgICAgQ0hFQ0sobVN0YXJ0ZWQpOwogCiAgICAgZGVsZXRlIG1Hcm91cDsKICAgICBtR3JvdXAgPSBOVUxMOwogCiAgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAotc3RhdHVzX3QgQUFDU291cmNlOjpnZXRGb3JtYXQoTWV0YURhdGFCYXNlICZtZXRhKSB7Ci0gICAgbWV0YSA9IG1NZXRhOwotICAgIHJldHVybiBPSzsKK21lZGlhX3N0YXR1c190IEFBQ1NvdXJjZTo6Z2V0Rm9ybWF0KEFNZWRpYUZvcm1hdCAqbWV0YSkgeworICAgIHJldHVybiBBTWVkaWFGb3JtYXRfY29weShtZXRhLCBtTWV0YSk7CiB9CiAKLXN0YXR1c190IEFBQ1NvdXJjZTo6cmVhZCgKK21lZGlhX3N0YXR1c190IEFBQ1NvdXJjZTo6cmVhZCgKICAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqb3V0LCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgewogICAgICpvdXQgPSBOVUxMOwogCkBAIC0yODIsNyArMjgwLDcgQEAKICAgICAgICAgICAgIGludDY0X3Qgc2Vla0ZyYW1lID0gc2Vla1RpbWVVcyAvIG1GcmFtZUR1cmF0aW9uVXM7CiAgICAgICAgICAgICBpZiAoc2Vla0ZyYW1lIDwgMCB8fCBzZWVrRnJhbWUgPj0gKGludDY0X3QpbU9mZnNldFZlY3Rvci5zaXplKCkpIHsKICAgICAgICAgICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjcwMjM5NTA3Iik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1DdXJyZW50VGltZVVzID0gc2Vla0ZyYW1lICogbUZyYW1lRHVyYXRpb25VczsKIApAQCAtMjkyLDEzICsyOTAsMTMgQEAKIAogICAgIHNpemVfdCBmcmFtZVNpemUsIGZyYW1lU2l6ZVdpdGhvdXRIZWFkZXIsIGhlYWRlclNpemU7CiAgICAgaWYgKChmcmFtZVNpemUgPSBnZXRBZHRzRnJhbWVMZW5ndGgobURhdGFTb3VyY2UsIG1PZmZzZXQsICZoZWFkZXJTaXplKSkgPT0gMCkgewotICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9FTkRfT0ZfU1RSRUFNOwogICAgIH0KIAogICAgIE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyOwogICAgIHN0YXR1c190IGVyciA9IG1Hcm91cC0+YWNxdWlyZV9idWZmZXIoJmJ1ZmZlcik7CiAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgfQogCiAgICAgZnJhbWVTaXplV2l0aG91dEhlYWRlciA9IGZyYW1lU2l6ZSAtIGhlYWRlclNpemU7CkBAIC0zMDcsNyArMzA1LDcgQEAKICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CiAgICAgICAgIGJ1ZmZlciA9IE5VTEw7CiAKLSAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lPOwogICAgIH0KIAogICAgIGJ1ZmZlci0+c2V0X3JhbmdlKDAsIGZyYW1lU2l6ZVdpdGhvdXRIZWFkZXIpOwpAQCAtMzE4LDI2ICszMTYsMjcgQEAKICAgICBtQ3VycmVudFRpbWVVcyArPSBtRnJhbWVEdXJhdGlvblVzOwogCiAgICAgKm91dCA9IGJ1ZmZlcjsKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAotc3RhdGljIE1lZGlhRXh0cmFjdG9yKiBDcmVhdGVFeHRyYWN0b3IoCi0gICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsCitzdGF0aWMgQ01lZGlhRXh0cmFjdG9yVjIqIENyZWF0ZUV4dHJhY3RvcigKKyAgICAgICAgQ0RhdGFTb3VyY2UgKnNvdXJjZSwKICAgICAgICAgdm9pZCAqbWV0YSkgewogICAgIG9mZjY0X3Qgb2Zmc2V0ID0gKnN0YXRpY19jYXN0PG9mZjY0X3QqPihtZXRhKTsKLSAgICByZXR1cm4gbmV3IEFBQ0V4dHJhY3Rvcihzb3VyY2UsIG9mZnNldCk7CisgICAgcmV0dXJuIHdyYXBWMihuZXcgQUFDRXh0cmFjdG9yKG5ldyBEYXRhU291cmNlSGVscGVyKHNvdXJjZSksIG9mZnNldCkpOwogfQogCi1zdGF0aWMgTWVkaWFFeHRyYWN0b3I6OkNyZWF0b3JGdW5jIFNuaWZmKAotICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSwgdm9pZCAqKm1ldGEsCi0gICAgICAgIE1lZGlhRXh0cmFjdG9yOjpGcmVlTWV0YUZ1bmMgKmZyZWVNZXRhKSB7CitzdGF0aWMgQ3JlYXRvckZ1bmNWMiBTbmlmZigKKyAgICAgICAgQ0RhdGFTb3VyY2UgKnNvdXJjZSwgZmxvYXQgKmNvbmZpZGVuY2UsIHZvaWQgKiptZXRhLAorICAgICAgICBGcmVlTWV0YUZ1bmMgKmZyZWVNZXRhKSB7CiAgICAgb2ZmNjRfdCBwb3MgPSAwOwogCisgICAgRGF0YVNvdXJjZUhlbHBlciBoZWxwZXIoc291cmNlKTsKICAgICBmb3IgKDs7KSB7CiAgICAgICAgIHVpbnQ4X3QgaWQzaGVhZGVyWzEwXTsKLSAgICAgICAgaWYgKHNvdXJjZS0+cmVhZEF0KHBvcywgaWQzaGVhZGVyLCBzaXplb2YoaWQzaGVhZGVyKSkKKyAgICAgICAgaWYgKGhlbHBlci5yZWFkQXQocG9zLCBpZDNoZWFkZXIsIHNpemVvZihpZDNoZWFkZXIpKQogICAgICAgICAgICAgICAgIDwgKHNzaXplX3Qpc2l6ZW9mKGlkM2hlYWRlcikpIHsKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9CkBAIC0zNjQsNyArMzYzLDcgQEAKIAogICAgIHVpbnQ4X3QgaGVhZGVyWzJdOwogCi0gICAgaWYgKHNvdXJjZS0+cmVhZEF0KHBvcywgJmhlYWRlciwgMikgIT0gMikgeworICAgIGlmIChoZWxwZXIucmVhZEF0KHBvcywgJmhlYWRlciwgMikgIT0gMikgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKQEAgLTM4NywxMyArMzg2LDEzIEBACiBleHRlcm4gIkMiIHsKIC8vIFRoaXMgaXMgdGhlIG9ubHkgc3ltYm9sIHRoYXQgbmVlZHMgdG8gYmUgZXhwb3J0ZWQKIF9fYXR0cmlidXRlX18gKCh2aXNpYmlsaXR5ICgiZGVmYXVsdCIpKSkKLU1lZGlhRXh0cmFjdG9yOjpFeHRyYWN0b3JEZWYgR0VURVhUUkFDVE9SREVGKCkgeworRXh0cmFjdG9yRGVmIEdFVEVYVFJBQ1RPUkRFRigpIHsKICAgICByZXR1cm4gewotICAgICAgICBNZWRpYUV4dHJhY3Rvcjo6RVhUUkFDVE9SREVGX1ZFUlNJT04sCisgICAgICAgIEVYVFJBQ1RPUkRFRl9WRVJTSU9OX0NVUlJFTlQsCiAgICAgICAgIFVVSUQoIjRmZDgwZWFlLTAzZDItNGQ3Mi05ZWI5LTQ4ZmE2YmI1NDYxMyIpLAogICAgICAgICAxLCAvLyB2ZXJzaW9uCiAgICAgICAgICJBQUMgRXh0cmFjdG9yIiwKLSAgICAgICAgU25pZmYKKyAgICAgICAgeyAudjIgPSBTbmlmZiB9CiAgICAgfTsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9hYWMvQUFDRXh0cmFjdG9yLmggYi9tZWRpYS9leHRyYWN0b3JzL2FhYy9BQUNFeHRyYWN0b3IuaAppbmRleCA5ZGFkYmVkLi4zYjExZjk1IDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL2FhYy9BQUNFeHRyYWN0b3IuaAorKysgYi9tZWRpYS9leHRyYWN0b3JzL2FhYy9BQUNFeHRyYWN0b3IuaApAQCAtMTgsOCArMTgsOSBAQAogCiAjZGVmaW5lIEFBQ19FWFRSQUNUT1JfSF8KIAotI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5BcGkuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlci5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRm9ybWF0Lmg+CiAKICNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KIApAQCAtMjgsMjMgKzI5LDIzIEBACiBzdHJ1Y3QgQU1lc3NhZ2U7CiBjbGFzcyBTdHJpbmc4OwogCi1jbGFzcyBBQUNFeHRyYWN0b3IgOiBwdWJsaWMgTWVkaWFFeHRyYWN0b3IgeworY2xhc3MgQUFDRXh0cmFjdG9yIDogcHVibGljIE1lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyVjIgewogcHVibGljOgotICAgIEFBQ0V4dHJhY3RvcihEYXRhU291cmNlQmFzZSAqc291cmNlLCBvZmY2NF90IG9mZnNldCk7CisgICAgQUFDRXh0cmFjdG9yKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwgb2ZmNjRfdCBvZmZzZXQpOwogCiAgICAgdmlydHVhbCBzaXplX3QgY291bnRUcmFja3MoKTsKLSAgICB2aXJ0dWFsIE1lZGlhVHJhY2sgKmdldFRyYWNrKHNpemVfdCBpbmRleCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRUcmFja01ldGFEYXRhKE1ldGFEYXRhQmFzZSYgbWV0YSwgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncyk7CisgICAgdmlydHVhbCBNZWRpYVRyYWNrSGVscGVyVjIgKmdldFRyYWNrKHNpemVfdCBpbmRleCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRUcmFja01ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSwgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncyk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1ldGFEYXRhKE1ldGFEYXRhQmFzZSYgbWV0YSk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRNZXRhRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEpOwogICAgIHZpcnR1YWwgY29uc3QgY2hhciAqIG5hbWUoKSB7IHJldHVybiAiQUFDRXh0cmFjdG9yIjsgfQogCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+QUFDRXh0cmFjdG9yKCk7CiAKIHByaXZhdGU6Ci0gICAgRGF0YVNvdXJjZUJhc2UgKm1EYXRhU291cmNlOwotICAgIE1ldGFEYXRhQmFzZSBtTWV0YTsKKyAgICBEYXRhU291cmNlSGVscGVyICptRGF0YVNvdXJjZTsKKyAgICBBTWVkaWFGb3JtYXQgKm1NZXRhOwogICAgIHN0YXR1c190IG1Jbml0Q2hlY2s7CiAKICAgICBWZWN0b3I8dWludDY0X3Q+IG1PZmZzZXRWZWN0b3I7CkBAIC01NSw3ICs1Niw3IEBACiB9OwogCiBib29sIFNuaWZmQUFDKAotICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLCBTdHJpbmc4ICptaW1lVHlwZSwgZmxvYXQgKmNvbmZpZGVuY2UsIG9mZjY0X3QgKm9mZnNldCk7CisgICAgICAgIERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwgU3RyaW5nOCAqbWltZVR5cGUsIGZsb2F0ICpjb25maWRlbmNlLCBvZmY2NF90ICpvZmZzZXQpOwogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL2FhYy9BbmRyb2lkLmJwIGIvbWVkaWEvZXh0cmFjdG9ycy9hYWMvQW5kcm9pZC5icAppbmRleCA1ZjA1YjQyLi40MmIwYTY0IDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL2FhYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvYWFjL0FuZHJvaWQuYnAKQEAgLTksNiArOSw3IEBACiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmxvZyIsCiAgICAgICAgICJsaWJtZWRpYWV4dHJhY3RvciIsCisgICAgICAgICJsaWJtZWRpYW5kayIsCiAgICAgXSwKIAogICAgIHN0YXRpY19saWJzOiBbCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL2Ftci9BTVJFeHRyYWN0b3IuY3BwIGIvbWVkaWEvZXh0cmFjdG9ycy9hbXIvQU1SRXh0cmFjdG9yLmNwcAppbmRleCBmNTZkNWVmLi41MTFiMTRkIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL2Ftci9BTVJFeHRyYWN0b3IuY3BwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvYW1yL0FNUkV4dHJhY3Rvci5jcHAKQEAgLTIwLDggKzIwLDYgQEAKIAogI2luY2x1ZGUgIkFNUkV4dHJhY3Rvci5oIgogCi0jaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZUJhc2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYVRyYWNrLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CkBAIC0zMSwyOSArMjksMjkgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1jbGFzcyBBTVJTb3VyY2UgOiBwdWJsaWMgTWVkaWFUcmFjayB7CitjbGFzcyBBTVJTb3VyY2UgOiBwdWJsaWMgTWVkaWFUcmFja0hlbHBlclYyIHsKIHB1YmxpYzoKICAgICBBTVJTb3VyY2UoCi0gICAgICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLAotICAgICAgICAgICAgTWV0YURhdGFCYXNlICZtZXRhLAorICAgICAgICAgICAgRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLAorICAgICAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhLAogICAgICAgICAgICAgYm9vbCBpc1dpZGUsCiAgICAgICAgICAgICBjb25zdCBvZmY2NF90ICpvZmZzZXRfdGFibGUsCiAgICAgICAgICAgICBzaXplX3Qgb2Zmc2V0X3RhYmxlX2xlbmd0aCk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhQmFzZSAqcGFyYW1zID0gTlVMTCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBzdGFydCgpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3Qgc3RvcCgpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGb3JtYXQoTWV0YURhdGFCYXNlICYpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0Rm9ybWF0KEFNZWRpYUZvcm1hdCAqKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCgKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHJlYWQoCiAgICAgICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CiAKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5BTVJTb3VyY2UoKTsKIAogcHJpdmF0ZToKLSAgICBEYXRhU291cmNlQmFzZSAqbURhdGFTb3VyY2U7Ci0gICAgTWV0YURhdGFCYXNlIG1NZXRhOworICAgIERhdGFTb3VyY2VIZWxwZXIgKm1EYXRhU291cmNlOworICAgIEFNZWRpYUZvcm1hdCAqbU1ldGE7CiAgICAgYm9vbCBtSXNXaWRlOwogCiAgICAgb2ZmNjRfdCBtT2Zmc2V0OwpAQCAtOTgsMjcgKzk2LDI3IEBACiAgICAgcmV0dXJuIGZyYW1lU2l6ZTsKIH0KIAotc3RhdGljIHN0YXR1c190IGdldEZyYW1lU2l6ZUJ5T2Zmc2V0KERhdGFTb3VyY2VCYXNlICpzb3VyY2UsCitzdGF0aWMgbWVkaWFfc3RhdHVzX3QgZ2V0RnJhbWVTaXplQnlPZmZzZXQoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLAogICAgICAgICBvZmY2NF90IG9mZnNldCwgYm9vbCBpc1dpZGUsIHNpemVfdCAqZnJhbWVTaXplKSB7CiAgICAgdWludDhfdCBoZWFkZXI7CiAgICAgc3NpemVfdCBjb3VudCA9IHNvdXJjZS0+cmVhZEF0KG9mZnNldCwgJmhlYWRlciwgMSk7CiAgICAgaWYgKGNvdW50ID09IDApIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfRU5EX09GX1NUUkVBTTsKICAgICB9IGVsc2UgaWYgKGNvdW50IDwgMCkgewotICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU87CiAgICAgfQogCiAgICAgdW5zaWduZWQgRlQgPSAoaGVhZGVyID4+IDMpICYgMHgwZjsKIAogICAgICpmcmFtZVNpemUgPSBnZXRGcmFtZVNpemUoaXNXaWRlLCBGVCk7CiAgICAgaWYgKCpmcmFtZVNpemUgPT0gMCkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKICAgICB9Ci0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKIHN0YXRpYyBib29sIFNuaWZmQU1SKAotICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLCBib29sICppc1dpZGUsIGZsb2F0ICpjb25maWRlbmNlKSB7CisgICAgICAgIERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwgYm9vbCAqaXNXaWRlLCBmbG9hdCAqY29uZmlkZW5jZSkgewogICAgIGNoYXIgaGVhZGVyWzldOwogCiAgICAgaWYgKHNvdXJjZS0+cmVhZEF0KDAsIGhlYWRlciwgc2l6ZW9mKGhlYWRlcikpICE9IHNpemVvZihoZWFkZXIpKSB7CkBAIC0xNDQsNyArMTQyLDcgQEAKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKLUFNUkV4dHJhY3Rvcjo6QU1SRXh0cmFjdG9yKERhdGFTb3VyY2VCYXNlICpzb3VyY2UpCitBTVJFeHRyYWN0b3I6OkFNUkV4dHJhY3RvcihEYXRhU291cmNlSGVscGVyICpzb3VyY2UpCiAgICAgOiBtRGF0YVNvdXJjZShzb3VyY2UpLAogICAgICAgbUluaXRDaGVjayhOT19JTklUKSwKICAgICAgIG1PZmZzZXRUYWJsZUxlbmd0aCgwKSB7CkBAIC0xNTMsMTIgKzE1MSwxMiBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgbU1ldGEuc2V0Q1N0cmluZygKLSAgICAgICAgICAgIGtLZXlNSU1FVHlwZSwgbUlzV2lkZSA/IE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9XQgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX05CKTsKKyAgICBtTWV0YSA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1NZXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsCisgICAgICAgICAgICBtSXNXaWRlID8gTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX1dCIDogTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX05CKTsKIAotICAgIG1NZXRhLnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsIDEpOwotICAgIG1NZXRhLnNldEludDMyKGtLZXlTYW1wbGVSYXRlLCBtSXNXaWRlID8gMTYwMDAgOiA4MDAwKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9DT1VOVCwgMSk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1NZXRhLCBBTUVESUFGT1JNQVRfS0VZX1NBTVBMRV9SQVRFLCBtSXNXaWRlID8gMTYwMDAgOiA4MDAwKTsKIAogICAgIG9mZjY0X3Qgb2Zmc2V0ID0gbUlzV2lkZSA/IDkgOiA2OwogICAgIG9mZjY0X3Qgc3RyZWFtU2l6ZTsKQEAgLTE2NiwxMSArMTY0LDExIEBACiAgICAgaW50NjRfdCBkdXJhdGlvbiA9IDA7CiAKICAgICBpZiAobURhdGFTb3VyY2UtPmdldFNpemUoJnN0cmVhbVNpemUpID09IE9LKSB7Ci0gICAgICAgICB3aGlsZSAob2Zmc2V0IDwgc3RyZWFtU2l6ZSkgewotICAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGdldEZyYW1lU2l6ZUJ5T2Zmc2V0KHNvdXJjZSwgb2Zmc2V0LCBtSXNXaWRlLCAmZnJhbWVTaXplKTsKLSAgICAgICAgICAgICBpZiAoc3RhdHVzID09IEVSUk9SX0VORF9PRl9TVFJFQU0pIHsKLSAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgd2hpbGUgKG9mZnNldCA8IHN0cmVhbVNpemUpIHsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGdldEZyYW1lU2l6ZUJ5T2Zmc2V0KHNvdXJjZSwgb2Zmc2V0LCBtSXNXaWRlLCAmZnJhbWVTaXplKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gRVJST1JfRU5EX09GX1NUUkVBTSkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT0gT0spIHsKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CiAKQEAgLTE4NSwzMCArMTgzLDMzIEBACiAgICAgICAgICAgICBudW1GcmFtZXMgKys7CiAgICAgICAgIH0KIAotICAgICAgICBtTWV0YS5zZXRJbnQ2NChrS2V5RHVyYXRpb24sIGR1cmF0aW9uKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KG1NZXRhLCBBTUVESUFGT1JNQVRfS0VZX0RVUkFUSU9OLCBkdXJhdGlvbik7CiAgICAgfQogCiAgICAgbUluaXRDaGVjayA9IE9LOwogfQogCiBBTVJFeHRyYWN0b3I6On5BTVJFeHRyYWN0b3IoKSB7CisgICAgZGVsZXRlIG1EYXRhU291cmNlOworICAgIEFNZWRpYUZvcm1hdF9kZWxldGUobU1ldGEpOwogfQogCi1zdGF0dXNfdCBBTVJFeHRyYWN0b3I6OmdldE1ldGFEYXRhKE1ldGFEYXRhQmFzZSAmbWV0YSkgewotICAgIG1ldGEuY2xlYXIoKTsKK21lZGlhX3N0YXR1c190IEFNUkV4dHJhY3Rvcjo6Z2V0TWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhKSB7CisgICAgQU1lZGlhRm9ybWF0X2NsZWFyKG1ldGEpOwogCiAgICAgaWYgKG1Jbml0Q2hlY2sgPT0gT0spIHsKLSAgICAgICAgbWV0YS5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgbUlzV2lkZSA/ICJhdWRpby9hbXItd2IiIDogImF1ZGlvL2FtciIpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1ldGEsCisgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBtSXNXaWRlID8gImF1ZGlvL2Ftci13YiIgOiAiYXVkaW8vYW1yIik7CiAgICAgfQogCi0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKIHNpemVfdCBBTVJFeHRyYWN0b3I6OmNvdW50VHJhY2tzKCkgewogICAgIHJldHVybiBtSW5pdENoZWNrID09IE9LID8gMSA6IDA7CiB9CiAKLU1lZGlhVHJhY2sgKkFNUkV4dHJhY3Rvcjo6Z2V0VHJhY2soc2l6ZV90IGluZGV4KSB7CitNZWRpYVRyYWNrSGVscGVyVjIgKkFNUkV4dHJhY3Rvcjo6Z2V0VHJhY2soc2l6ZV90IGluZGV4KSB7CiAgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0sgfHwgaW5kZXggIT0gMCkgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CkBAIC0yMTcsMTkgKzIxOCwxOCBAQAogICAgICAgICAgICAgbU9mZnNldFRhYmxlLCBtT2Zmc2V0VGFibGVMZW5ndGgpOwogfQogCi1zdGF0dXNfdCBBTVJFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoTWV0YURhdGFCYXNlICZtZXRhLCBzaXplX3QgaW5kZXgsIHVpbnQzMl90IC8qIGZsYWdzICovKSB7CittZWRpYV9zdGF0dXNfdCBBTVJFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhLCBzaXplX3QgaW5kZXgsIHVpbnQzMl90IC8qIGZsYWdzICovKSB7CiAgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0sgfHwgaW5kZXggIT0gMCkgewotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogICAgIH0KIAotICAgIG1ldGEgPSBtTWV0YTsKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNZWRpYUZvcm1hdF9jb3B5KG1ldGEsIG1NZXRhKTsKIH0KIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAogQU1SU291cmNlOjpBTVJTb3VyY2UoCi0gICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIE1ldGFEYXRhQmFzZSAmbWV0YSwKKyAgICAgICAgRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLCBBTWVkaWFGb3JtYXQgKm1ldGEsCiAgICAgICAgIGJvb2wgaXNXaWRlLCBjb25zdCBvZmY2NF90ICpvZmZzZXRfdGFibGUsIHNpemVfdCBvZmZzZXRfdGFibGVfbGVuZ3RoKQogICAgIDogbURhdGFTb3VyY2Uoc291cmNlKSwKICAgICAgIG1NZXRhKG1ldGEpLApAQCAtMjUwLDcgKzI1MCw3IEBACiAgICAgfQogfQogCi1zdGF0dXNfdCBBTVJTb3VyY2U6OnN0YXJ0KE1ldGFEYXRhQmFzZSAqIC8qIHBhcmFtcyAqLykgeworbWVkaWFfc3RhdHVzX3QgQU1SU291cmNlOjpzdGFydCgpIHsKICAgICBDSEVDSyghbVN0YXJ0ZWQpOwogCiAgICAgbU9mZnNldCA9IG1Jc1dpZGUgPyA5IDogNjsKQEAgLTI1OSwyNSArMjU5LDI0IEBACiAgICAgbUdyb3VwLT5hZGRfYnVmZmVyKE1lZGlhQnVmZmVyQmFzZTo6Q3JlYXRlKDEyOCkpOwogICAgIG1TdGFydGVkID0gdHJ1ZTsKIAotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCi1zdGF0dXNfdCBBTVJTb3VyY2U6OnN0b3AoKSB7CittZWRpYV9zdGF0dXNfdCBBTVJTb3VyY2U6OnN0b3AoKSB7CiAgICAgQ0hFQ0sobVN0YXJ0ZWQpOwogCiAgICAgZGVsZXRlIG1Hcm91cDsKICAgICBtR3JvdXAgPSBOVUxMOwogCiAgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAotc3RhdHVzX3QgQU1SU291cmNlOjpnZXRGb3JtYXQoTWV0YURhdGFCYXNlICZtZXRhKSB7Ci0gICAgbWV0YSA9IG1NZXRhOwotICAgIHJldHVybiBPSzsKK21lZGlhX3N0YXR1c190IEFNUlNvdXJjZTo6Z2V0Rm9ybWF0KEFNZWRpYUZvcm1hdCAqbWV0YSkgeworICAgIHJldHVybiBBTWVkaWFGb3JtYXRfY29weShtZXRhLCBtTWV0YSk7CiB9CiAKLXN0YXR1c190IEFNUlNvdXJjZTo6cmVhZCgKK21lZGlhX3N0YXR1c190IEFNUlNvdXJjZTo6cmVhZCgKICAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqb3V0LCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgewogICAgICpvdXQgPSBOVUxMOwogCkBAIC0yOTYsNyArMjk1LDcgQEAKICAgICAgICAgbU9mZnNldCA9IG1PZmZzZXRUYWJsZVtpbmRleF0gKyAobUlzV2lkZSA/IDkgOiA2KTsKIAogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaTwgc2Vla0ZyYW1lIC0gaW5kZXggKiA1MDsgaSsrKSB7Ci0gICAgICAgICAgICBzdGF0dXNfdCBlcnI7CisgICAgICAgICAgICBtZWRpYV9zdGF0dXNfdCBlcnI7CiAgICAgICAgICAgICBpZiAoKGVyciA9IGdldEZyYW1lU2l6ZUJ5T2Zmc2V0KG1EYXRhU291cmNlLCBtT2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Jc1dpZGUsICZzaXplKSkgIT0gT0spIHsKICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwpAQCAtMzA5LDcgKzMwOCw3IEBACiAgICAgc3NpemVfdCBuID0gbURhdGFTb3VyY2UtPnJlYWRBdChtT2Zmc2V0LCAmaGVhZGVyLCAxKTsKIAogICAgIGlmIChuIDwgMSkgewotICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9FTkRfT0ZfU1RSRUFNOwogICAgIH0KIAogICAgIGlmIChoZWFkZXIgJiAweDgzKSB7CkBAIC0zMTcsMjAgKzMxNiwyMCBAQAogCiAgICAgICAgIEFMT0dFKCJwYWRkaW5nIGJpdHMgbXVzdCBiZSAwLCBoZWFkZXIgaXMgMHglMDJ4IiwgaGVhZGVyKTsKIAotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKICAgICB9CiAKICAgICB1bnNpZ25lZCBGVCA9IChoZWFkZXIgPj4gMykgJiAweDBmOwogCiAgICAgc2l6ZV90IGZyYW1lU2l6ZSA9IGdldEZyYW1lU2l6ZShtSXNXaWRlLCBGVCk7CiAgICAgaWYgKGZyYW1lU2l6ZSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOwogICAgIH0KIAogICAgIE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyOwogICAgIHN0YXR1c190IGVyciA9IG1Hcm91cC0+YWNxdWlyZV9idWZmZXIoJmJ1ZmZlcik7CiAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgfQogCiAgICAgbiA9IG1EYXRhU291cmNlLT5yZWFkQXQobU9mZnNldCwgYnVmZmVyLT5kYXRhKCksIGZyYW1lU2l6ZSk7CkBAIC0zNDAsMTEgKzMzOSwxMSBAQAogICAgICAgICBidWZmZXIgPSBOVUxMOwogCiAgICAgICAgIGlmIChuIDwgMCkgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTzsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8vIG9ubHkgcGFydGlhbCBmcmFtZSBpcyBhdmFpbGFibGUsIHRyZWF0IGl0IGFzIEVPUy4KICAgICAgICAgICAgIG1PZmZzZXQgKz0gbjsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9FTkRfT0ZfU1RSRUFNOwogICAgICAgICB9CiAgICAgfQogCkBAIC0zNTcsNyArMzU2LDcgQEAKIAogICAgICpvdXQgPSBidWZmZXI7CiAKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KQEAgLTM2NSwyNCArMzY0LDI3IEBACiBleHRlcm4gIkMiIHsKIC8vIFRoaXMgaXMgdGhlIG9ubHkgc3ltYm9sIHRoYXQgbmVlZHMgdG8gYmUgZXhwb3J0ZWQKIF9fYXR0cmlidXRlX18gKCh2aXNpYmlsaXR5ICgiZGVmYXVsdCIpKSkKLU1lZGlhRXh0cmFjdG9yOjpFeHRyYWN0b3JEZWYgR0VURVhUUkFDVE9SREVGKCkgeworRXh0cmFjdG9yRGVmIEdFVEVYVFJBQ1RPUkRFRigpIHsKICAgICByZXR1cm4gewotICAgICAgICBNZWRpYUV4dHJhY3Rvcjo6RVhUUkFDVE9SREVGX1ZFUlNJT04sCisgICAgICAgIEVYVFJBQ1RPUkRFRl9WRVJTSU9OX0NVUlJFTlQsCiAgICAgICAgIFVVSUQoImM4NjYzOWM5LTJmMzEtNDBhYy1hNzE1LWZhMDFiNDQ5M2FhZiIpLAogICAgICAgICAxLAogICAgICAgICAiQU1SIEV4dHJhY3RvciIsCi0gICAgICAgIFtdKAotICAgICAgICAgICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsCi0gICAgICAgICAgICAgICAgZmxvYXQgKmNvbmZpZGVuY2UsCi0gICAgICAgICAgICAgICAgdm9pZCAqKiwKLSAgICAgICAgICAgICAgICBNZWRpYUV4dHJhY3Rvcjo6RnJlZU1ldGFGdW5jICopIC0+IE1lZGlhRXh0cmFjdG9yOjpDcmVhdG9yRnVuYyB7Ci0gICAgICAgICAgICBpZiAoU25pZmZBTVIoc291cmNlLCBudWxscHRyLCBjb25maWRlbmNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBbXSgKLSAgICAgICAgICAgICAgICAgICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICB2b2lkICopIC0+IE1lZGlhRXh0cmFjdG9yKiB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQU1SRXh0cmFjdG9yKHNvdXJjZSk7fTsKKyAgICAgICAgeworICAgICAgICAgICAudjIgPSBbXSgKKyAgICAgICAgICAgICAgICAgICAgQ0RhdGFTb3VyY2UgKnNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgKmNvbmZpZGVuY2UsCisgICAgICAgICAgICAgICAgICAgIHZvaWQgKiosCisgICAgICAgICAgICAgICAgICAgIEZyZWVNZXRhRnVuYyAqKSAtPiBDcmVhdG9yRnVuY1YyIHsKKyAgICAgICAgICAgICAgICBEYXRhU291cmNlSGVscGVyIGhlbHBlcihzb3VyY2UpOworICAgICAgICAgICAgICAgIGlmIChTbmlmZkFNUigmaGVscGVyLCBudWxscHRyLCBjb25maWRlbmNlKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gW10oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0RhdGFTb3VyY2UgKnNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICopIC0+IENNZWRpYUV4dHJhY3RvclYyKiB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gd3JhcFYyKG5ldyBBTVJFeHRyYWN0b3IobmV3IERhdGFTb3VyY2VIZWxwZXIoc291cmNlKSkpO307CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KICAgICB9OwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9hbXIvQU1SRXh0cmFjdG9yLmggYi9tZWRpYS9leHRyYWN0b3JzL2Ftci9BTVJFeHRyYWN0b3IuaAppbmRleCBjOTBiMzI1Li40NGIyY2JkIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL2Ftci9BTVJFeHRyYWN0b3IuaAorKysgYi9tZWRpYS9leHRyYWN0b3JzL2Ftci9BTVJFeHRyYWN0b3IuaApAQCAtMTksOCArMTksOSBAQAogI2RlZmluZSBBTVJfRVhUUkFDVE9SX0hfCiAKICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3Rvci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luQXBpLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUZvcm1hdC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTI4LDIzICsyOSwyMyBAQAogY2xhc3MgU3RyaW5nODsKICNkZWZpbmUgT0ZGU0VUX1RBQkxFX0xFTiAgICAzMDAKIAotY2xhc3MgQU1SRXh0cmFjdG9yIDogcHVibGljIE1lZGlhRXh0cmFjdG9yIHsKK2NsYXNzIEFNUkV4dHJhY3RvciA6IHB1YmxpYyBNZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlclYyIHsKIHB1YmxpYzoKLSAgICBleHBsaWNpdCBBTVJFeHRyYWN0b3IoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSk7CisgICAgZXhwbGljaXQgQU1SRXh0cmFjdG9yKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSk7CiAKICAgICB2aXJ0dWFsIHNpemVfdCBjb3VudFRyYWNrcygpOwotICAgIHZpcnR1YWwgTWVkaWFUcmFjayAqZ2V0VHJhY2soc2l6ZV90IGluZGV4KTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFRyYWNrTWV0YURhdGEoTWV0YURhdGFCYXNlJiBtZXRhLCBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKTsKKyAgICB2aXJ0dWFsIE1lZGlhVHJhY2tIZWxwZXJWMiAqZ2V0VHJhY2soc2l6ZV90IGluZGV4KTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IGdldFRyYWNrTWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhLCBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWV0YURhdGEoTWV0YURhdGFCYXNlJiBtZXRhKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IGdldE1ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSk7CiAgICAgdmlydHVhbCBjb25zdCBjaGFyICogbmFtZSgpIHsgcmV0dXJuICJBTVJFeHRyYWN0b3IiOyB9CiAKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5BTVJFeHRyYWN0b3IoKTsKIAogcHJpdmF0ZToKLSAgICBEYXRhU291cmNlQmFzZSAqbURhdGFTb3VyY2U7Ci0gICAgTWV0YURhdGFCYXNlIG1NZXRhOworICAgIERhdGFTb3VyY2VIZWxwZXIgKm1EYXRhU291cmNlOworICAgIEFNZWRpYUZvcm1hdCAqbU1ldGE7CiAgICAgc3RhdHVzX3QgbUluaXRDaGVjazsKICAgICBib29sIG1Jc1dpZGU7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvYW1yL0FuZHJvaWQuYnAgYi9tZWRpYS9leHRyYWN0b3JzL2Ftci9BbmRyb2lkLmJwCmluZGV4IGQ5NjJiOTMuLjgzZWE0YzcgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvYW1yL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9hbXIvQW5kcm9pZC5icApAQCAtOSw2ICs5LDcgQEAKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGlibG9nIiwKICAgICAgICAgImxpYm1lZGlhZXh0cmFjdG9yIiwKKyAgICAgICAgImxpYm1lZGlhbmRrIiwKICAgICBdLAogCiAgICAgc3RhdGljX2xpYnM6IFsKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvZmxhYy9BbmRyb2lkLmJwIGIvbWVkaWEvZXh0cmFjdG9ycy9mbGFjL0FuZHJvaWQuYnAKaW5kZXggNjI4Mjc5My4uNGQwYTRjYyAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9mbGFjL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9mbGFjL0FuZHJvaWQuYnAKQEAgLTgsMTMgKzgsMTggQEAKICAgICBdLAogCiAgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmJpbmRlcl9uZGsiLAogICAgICAgICAibGlibG9nIiwKICAgICAgICAgImxpYm1lZGlhZXh0cmFjdG9yIiwKKyAgICAgICAgImxpYm1lZGlhbmRrIiwKICAgICBdLAogCiAgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAogICAgICAgICAibGliRkxBQyIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X21ldGFkYXRhdXRpbHMiLAorICAgICAgICAibGlidXRpbHMiLAogICAgIF0sCiAKICAgICBuYW1lOiAibGliZmxhY2V4dHJhY3RvciIsCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL2ZsYWMvRkxBQ0V4dHJhY3Rvci5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL2ZsYWMvRkxBQ0V4dHJhY3Rvci5jcHAKaW5kZXggY2NmODBkMC4uZDU0YWFlZiAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9mbGFjL0ZMQUNFeHRyYWN0b3IuY3BwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvZmxhYy9GTEFDRXh0cmFjdG9yLmNwcApAQCAtMjQsNDEgKzI0LDU3IEBACiAvLyBsaWJGTEFDIHBhcnNlcgogI2luY2x1ZGUgIkZMQUMvc3RyZWFtX2RlY29kZXIuaCIKIAotI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2VCYXNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFUcmFjay5oPgotI2luY2x1ZGUgPG1lZGlhL1ZvcmJpc0NvbW1lbnQuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9pYmluZGVyLmg+IC8vIGZvciBBSUJpbmRlcl9nZXRDYWxsaW5nVWlkCisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvcHJpbWl0aXZlcy5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luQXBpLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFGb3JtYXQuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYmFzZTY0Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YVV0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJCYXNlLmg+CisjaW5jbHVkZSA8cHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmg+IC8vIGZvciBBSURfTUVESUEKKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCisvLyBNZWRpYVNlcnZlciBpcyBjYXBhYmxlIG9mIGhhbmRsaW5nIGZsb2F0IGV4dHJhY3RvciBvdXRwdXQsIGJ1dCBnZW5lcmFsIHByb2Nlc3NlcworLy8gbWF5IG5vdCBiZSBhYmxlIHRvIGRvIHNvLgorLy8gVE9ETzogSW1wcm92ZSBBUEkgdG8gc2V0IGV4dHJhY3RvciBmbG9hdCBvdXRwdXQuCisvLyAoTm90ZTogZHVwbGljYXRlZCB3aXRoIFdBVkV4dHJhY3Rvci5jcHApCitzdGF0aWMgaW5saW5lIGJvb2wgc2hvdWxkRXh0cmFjdG9yT3V0cHV0RmxvYXQoaW50IGJpdHNQZXJTYW1wbGUpCit7CisgICAgcmV0dXJuIGJpdHNQZXJTYW1wbGUgPiAxNiAmJiBBSUJpbmRlcl9nZXRDYWxsaW5nVWlkKCkgPT0gQUlEX01FRElBOworfQorCiBjbGFzcyBGTEFDUGFyc2VyOwogCi1jbGFzcyBGTEFDU291cmNlIDogcHVibGljIE1lZGlhVHJhY2sgeworY2xhc3MgRkxBQ1NvdXJjZSA6IHB1YmxpYyBNZWRpYVRyYWNrSGVscGVyVjIgewogCiBwdWJsaWM6CiAgICAgRkxBQ1NvdXJjZSgKLSAgICAgICAgICAgIERhdGFTb3VyY2VCYXNlICpkYXRhU291cmNlLAotICAgICAgICAgICAgTWV0YURhdGFCYXNlICZtZXRhKTsKKyAgICAgICAgICAgIERhdGFTb3VyY2VIZWxwZXIgKmRhdGFTb3VyY2UsCisgICAgICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGEsCisgICAgICAgICAgICBib29sIG91dHB1dEZsb2F0KTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGFCYXNlICpwYXJhbXMpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Rm9ybWF0KE1ldGFEYXRhQmFzZSAmbWV0YSk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBzdGFydCgpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3Qgc3RvcCgpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0Rm9ybWF0KEFNZWRpYUZvcm1hdCAqbWV0YSk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoCisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCByZWFkKAogICAgICAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOwogCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+RkxBQ1NvdXJjZSgpOwogCiBwcml2YXRlOgotICAgIERhdGFTb3VyY2VCYXNlICptRGF0YVNvdXJjZTsKLSAgICBNZXRhRGF0YUJhc2UgbVRyYWNrTWV0YWRhdGE7CisgICAgRGF0YVNvdXJjZUhlbHBlciAqbURhdGFTb3VyY2U7CisgICAgQU1lZGlhRm9ybWF0ICptVHJhY2tNZXRhZGF0YTsKKyAgICBjb25zdCBib29sIG1PdXRwdXRGbG9hdDsKICAgICBGTEFDUGFyc2VyICptUGFyc2VyOwogICAgIGJvb2wgbUluaXRDaGVjazsKICAgICBib29sIG1TdGFydGVkOwpAQCAtNzUsMTQgKzkxLDE1IEBACiAKIHB1YmxpYzoKICAgICBlbnVtIHsKLSAgICAgICAga01heENoYW5uZWxzID0gOCwKKyAgICAgICAga01heENoYW5uZWxzID0gRkNDXzgsCiAgICAgfTsKIAogICAgIGV4cGxpY2l0IEZMQUNQYXJzZXIoCi0gICAgICAgIERhdGFTb3VyY2VCYXNlICpkYXRhU291cmNlLAorICAgICAgICBEYXRhU291cmNlSGVscGVyICpkYXRhU291cmNlLAorICAgICAgICBib29sIG91dHB1dEZsb2F0LAogICAgICAgICAvLyBJZiBtZXRhZGF0YSBwb2ludGVycyBhcmVuJ3QgcHJvdmlkZWQsIHdlIGRvbid0IGZpbGwgdGhlbQotICAgICAgICBNZXRhRGF0YUJhc2UgKmZpbGVNZXRhZGF0YSA9IDAsCi0gICAgICAgIE1ldGFEYXRhQmFzZSAqdHJhY2tNZXRhZGF0YSA9IDApOworICAgICAgICBBTWVkaWFGb3JtYXQgKmZpbGVNZXRhZGF0YSA9IDAsCisgICAgICAgIEFNZWRpYUZvcm1hdCAqdHJhY2tNZXRhZGF0YSA9IDApOwogCiAgICAgdmlydHVhbCB+RkxBQ1BhcnNlcigpOwogCkBAIC0xMTgsOSArMTM1LDEwIEBACiAgICAgfQogCiBwcml2YXRlOgotICAgIERhdGFTb3VyY2VCYXNlICptRGF0YVNvdXJjZTsKLSAgICBNZXRhRGF0YUJhc2UgKm1GaWxlTWV0YWRhdGE7Ci0gICAgTWV0YURhdGFCYXNlICptVHJhY2tNZXRhZGF0YTsKKyAgICBEYXRhU291cmNlSGVscGVyICptRGF0YVNvdXJjZTsKKyAgICBjb25zdCBib29sIG1PdXRwdXRGbG9hdDsKKyAgICBBTWVkaWFGb3JtYXQgKm1GaWxlTWV0YWRhdGE7CisgICAgQU1lZGlhRm9ybWF0ICptVHJhY2tNZXRhZGF0YTsKICAgICBib29sIG1Jbml0Q2hlY2s7CiAKICAgICAvLyBtZWRpYSBidWZmZXJzCkBAIC0xNjksNiArMTg3LDcgQEAKICAgICAgICAgICAgIGNvbnN0IEZMQUNfX0ZyYW1lICpmcmFtZSwgY29uc3QgRkxBQ19faW50MzIgKiBjb25zdCBidWZmZXJbXSk7CiAgICAgdm9pZCBtZXRhZGF0YUNhbGxiYWNrKGNvbnN0IEZMQUNfX1N0cmVhbU1ldGFkYXRhICptZXRhZGF0YSk7CiAgICAgdm9pZCBlcnJvckNhbGxiYWNrKEZMQUNfX1N0cmVhbURlY29kZXJFcnJvclN0YXR1cyBzdGF0dXMpOworICAgIHNpemVfdCBnZXRPdXRwdXRTYW1wbGVTaXplKCkgY29uc3QgeyByZXR1cm4gbU91dHB1dEZsb2F0ID8gc2l6ZW9mKGZsb2F0KSA6IHNpemVvZihpbnQxNl90KTsgfQogCiAgICAgLy8gRkxBQyBwYXJzZXIgY2FsbGJhY2tzIGFzIEMtY2FsbGFibGUgZnVuY3Rpb25zCiAgICAgc3RhdGljIEZMQUNfX1N0cmVhbURlY29kZXJSZWFkU3RhdHVzIHJlYWRfY2FsbGJhY2soCkBAIC0zNjQsOSArMzgzLDggQEAKICAgICBjYXNlIEZMQUNfX01FVEFEQVRBX1RZUEVfUElDVFVSRToKICAgICAgICAgaWYgKG1GaWxlTWV0YWRhdGEgIT0gMCkgewogICAgICAgICAgICAgY29uc3QgRkxBQ19fU3RyZWFtTWV0YWRhdGFfUGljdHVyZSAqcCA9ICZtZXRhZGF0YS0+ZGF0YS5waWN0dXJlOwotICAgICAgICAgICAgbUZpbGVNZXRhZGF0YS0+c2V0RGF0YShrS2V5QWxidW1BcnQsCi0gICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhOjpUWVBFX05PTkUsIHAtPmRhdGEsIHAtPmRhdGFfbGVuZ3RoKTsKLSAgICAgICAgICAgIG1GaWxlTWV0YWRhdGEtPnNldENTdHJpbmcoa0tleUFsYnVtQXJ0TUlNRSwgcC0+bWltZV90eXBlKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobUZpbGVNZXRhZGF0YSwgQU1FRElBRk9STUFUX0tFWV9BTEJVTUFSVCwKKyAgICAgICAgICAgICAgICAgICBwLT5kYXRhLCBwLT5kYXRhX2xlbmd0aCk7CiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKQEAgLTM4MSwxMjIgKzM5OSw1MSBAQAogICAgIG1FcnJvclN0YXR1cyA9IHN0YXR1czsKIH0KIAotLy8gQ29weSBzYW1wbGVzIGZyb20gRkxBQyBuYXRpdmUgMzItYml0IG5vbi1pbnRlcmxlYXZlZCB0byAxNi1iaXQgaW50ZXJsZWF2ZWQuCisvLyBDb3B5IHNhbXBsZXMgZnJvbSBGTEFDIG5hdGl2ZSAzMi1iaXQgbm9uLWludGVybGVhdmVkIHRvIDE2LWJpdCBzaWduZWQKKy8vIG9yIDMyLWJpdCBmbG9hdCBpbnRlcmxlYXZlZC4KIC8vIFRoZXNlIGFyZSBjYW5kaWRhdGVzIGZvciBvcHRpbWl6YXRpb24gaWYgbmVlZGVkLgotCi1zdGF0aWMgdm9pZCBjb3B5TW9ubzgoCi0gICAgICAgIGludDE2X3QgKmRzdCwKLSAgICAgICAgY29uc3QgaW50ICogc3JjW0ZMQUNQYXJzZXI6OmtNYXhDaGFubmVsc10sCitzdGF0aWMgdm9pZCBjb3B5VG8xNlNpZ25lZCgKKyAgICAgICAgc2hvcnQgKmRzdCwKKyAgICAgICAgY29uc3QgaW50ICpjb25zdCAqc3JjLAogICAgICAgICB1bnNpZ25lZCBuU2FtcGxlcywKLSAgICAgICAgdW5zaWduZWQgLyogbkNoYW5uZWxzICovKSB7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG5TYW1wbGVzOyArK2kpIHsKLSAgICAgICAgKmRzdCsrID0gc3JjWzBdW2ldIDw8IDg7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBjb3B5U3RlcmVvOCgKLSAgICAgICAgaW50MTZfdCAqZHN0LAotICAgICAgICBjb25zdCBpbnQgKiBzcmNbRkxBQ1BhcnNlcjo6a01heENoYW5uZWxzXSwKLSAgICAgICAgdW5zaWduZWQgblNhbXBsZXMsCi0gICAgICAgIHVuc2lnbmVkIC8qIG5DaGFubmVscyAqLykgewotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBuU2FtcGxlczsgKytpKSB7Ci0gICAgICAgICpkc3QrKyA9IHNyY1swXVtpXSA8PCA4OwotICAgICAgICAqZHN0KysgPSBzcmNbMV1baV0gPDwgODsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGNvcHlNdWx0aUNoOChpbnQxNl90ICpkc3QsIGNvbnN0IGludCAqIHNyY1tGTEFDUGFyc2VyOjprTWF4Q2hhbm5lbHNdLCB1bnNpZ25lZCBuU2FtcGxlcywgdW5zaWduZWQgbkNoYW5uZWxzKQoteworICAgICAgICB1bnNpZ25lZCBuQ2hhbm5lbHMsCisgICAgICAgIHVuc2lnbmVkIGJpdHNQZXJTYW1wbGUpIHsKKyAgICBjb25zdCB1bnNpZ25lZCBsZWZ0U2hpZnQgPSAxNiAtIGJpdHNQZXJTYW1wbGU7CiAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG5TYW1wbGVzOyArK2kpIHsKICAgICAgICAgZm9yICh1bnNpZ25lZCBjID0gMDsgYyA8IG5DaGFubmVsczsgKytjKSB7Ci0gICAgICAgICAgICAqZHN0KysgPSBzcmNbY11baV0gPDwgODsKKyAgICAgICAgICAgICpkc3QrKyA9IHNyY1tjXVtpXSA8PCBsZWZ0U2hpZnQ7CiAgICAgICAgIH0KICAgICB9CiB9CiAKLXN0YXRpYyB2b2lkIGNvcHlNb25vMTYoCi0gICAgICAgIGludDE2X3QgKmRzdCwKLSAgICAgICAgY29uc3QgaW50ICogc3JjW0ZMQUNQYXJzZXI6OmtNYXhDaGFubmVsc10sCitzdGF0aWMgdm9pZCBjb3B5VG9GbG9hdCgKKyAgICAgICAgZmxvYXQgKmRzdCwKKyAgICAgICAgY29uc3QgaW50ICpjb25zdCAqc3JjLAogICAgICAgICB1bnNpZ25lZCBuU2FtcGxlcywKLSAgICAgICAgdW5zaWduZWQgLyogbkNoYW5uZWxzICovKSB7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG5TYW1wbGVzOyArK2kpIHsKLSAgICAgICAgKmRzdCsrID0gc3JjWzBdW2ldOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgY29weVN0ZXJlbzE2KAotICAgICAgICBpbnQxNl90ICpkc3QsCi0gICAgICAgIGNvbnN0IGludCAqIHNyY1tGTEFDUGFyc2VyOjprTWF4Q2hhbm5lbHNdLAotICAgICAgICB1bnNpZ25lZCBuU2FtcGxlcywKLSAgICAgICAgdW5zaWduZWQgLyogbkNoYW5uZWxzICovKSB7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG5TYW1wbGVzOyArK2kpIHsKLSAgICAgICAgKmRzdCsrID0gc3JjWzBdW2ldOwotICAgICAgICAqZHN0KysgPSBzcmNbMV1baV07Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBjb3B5TXVsdGlDaDE2KGludDE2X3QgKmRzdCwgY29uc3QgaW50ICogc3JjW0ZMQUNQYXJzZXI6OmtNYXhDaGFubmVsc10sIHVuc2lnbmVkIG5TYW1wbGVzLCB1bnNpZ25lZCBuQ2hhbm5lbHMpCi17CisgICAgICAgIHVuc2lnbmVkIG5DaGFubmVscywKKyAgICAgICAgdW5zaWduZWQgYml0c1BlclNhbXBsZSkgeworICAgIGNvbnN0IHVuc2lnbmVkIGxlZnRTaGlmdCA9IDMyIC0gYml0c1BlclNhbXBsZTsKICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgblNhbXBsZXM7ICsraSkgewogICAgICAgICBmb3IgKHVuc2lnbmVkIGMgPSAwOyBjIDwgbkNoYW5uZWxzOyArK2MpIHsKLSAgICAgICAgICAgICpkc3QrKyA9IHNyY1tjXVtpXTsKKyAgICAgICAgICAgICpkc3QrKyA9IGZsb2F0X2Zyb21faTMyKHNyY1tjXVtpXSA8PCBsZWZ0U2hpZnQpOwogICAgICAgICB9CiAgICAgfQogfQogCi0vLyAyNC1iaXQgdmVyc2lvbnMgc2hvdWxkIGRvIGRpdGhlcmluZyBvciBub2lzZS1zaGFwaW5nLCBoZXJlIG9yIGluIEF1ZGlvRmxpbmdlcgotCi1zdGF0aWMgdm9pZCBjb3B5TW9ubzI0KAotICAgICAgICBpbnQxNl90ICpkc3QsCi0gICAgICAgIGNvbnN0IGludCAqIHNyY1tGTEFDUGFyc2VyOjprTWF4Q2hhbm5lbHNdLAotICAgICAgICB1bnNpZ25lZCBuU2FtcGxlcywKLSAgICAgICAgdW5zaWduZWQgLyogbkNoYW5uZWxzICovKSB7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG5TYW1wbGVzOyArK2kpIHsKLSAgICAgICAgKmRzdCsrID0gc3JjWzBdW2ldID4+IDg7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBjb3B5U3RlcmVvMjQoCi0gICAgICAgIGludDE2X3QgKmRzdCwKLSAgICAgICAgY29uc3QgaW50ICogc3JjW0ZMQUNQYXJzZXI6OmtNYXhDaGFubmVsc10sCi0gICAgICAgIHVuc2lnbmVkIG5TYW1wbGVzLAotICAgICAgICB1bnNpZ25lZCAvKiBuQ2hhbm5lbHMgKi8pIHsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgblNhbXBsZXM7ICsraSkgewotICAgICAgICAqZHN0KysgPSBzcmNbMF1baV0gPj4gODsKLSAgICAgICAgKmRzdCsrID0gc3JjWzFdW2ldID4+IDg7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBjb3B5TXVsdGlDaDI0KGludDE2X3QgKmRzdCwgY29uc3QgaW50ICogc3JjW0ZMQUNQYXJzZXI6OmtNYXhDaGFubmVsc10sIHVuc2lnbmVkIG5TYW1wbGVzLCB1bnNpZ25lZCBuQ2hhbm5lbHMpCi17Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG5TYW1wbGVzOyArK2kpIHsKLSAgICAgICAgZm9yICh1bnNpZ25lZCBjID0gMDsgYyA8IG5DaGFubmVsczsgKytjKSB7Ci0gICAgICAgICAgICAqZHN0KysgPSBzcmNbY11baV0gPj4gODsKLSAgICAgICAgfQotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgY29weVRyZXNwYXNzKAotICAgICAgICBpbnQxNl90ICogLyogZHN0ICovLAotICAgICAgICBjb25zdCBpbnQgKltGTEFDUGFyc2VyOjprTWF4Q2hhbm5lbHNdIC8qIHNyYyAqLywKLSAgICAgICAgdW5zaWduZWQgLyogblNhbXBsZXMgKi8sCi0gICAgICAgIHVuc2lnbmVkIC8qIG5DaGFubmVscyAqLykgewotICAgIFRSRVNQQVNTKCk7Ci19Ci0KIC8vIEZMQUNQYXJzZXIKIAogRkxBQ1BhcnNlcjo6RkxBQ1BhcnNlcigKLSAgICAgICAgRGF0YVNvdXJjZUJhc2UgKmRhdGFTb3VyY2UsCi0gICAgICAgIE1ldGFEYXRhQmFzZSAqZmlsZU1ldGFkYXRhLAotICAgICAgICBNZXRhRGF0YUJhc2UgKnRyYWNrTWV0YWRhdGEpCisgICAgICAgIERhdGFTb3VyY2VIZWxwZXIgKmRhdGFTb3VyY2UsCisgICAgICAgIGJvb2wgb3V0cHV0RmxvYXQsCisgICAgICAgIEFNZWRpYUZvcm1hdCAqZmlsZU1ldGFkYXRhLAorICAgICAgICBBTWVkaWFGb3JtYXQgKnRyYWNrTWV0YWRhdGEpCiAgICAgOiBtRGF0YVNvdXJjZShkYXRhU291cmNlKSwKKyAgICAgIG1PdXRwdXRGbG9hdChvdXRwdXRGbG9hdCksCiAgICAgICBtRmlsZU1ldGFkYXRhKGZpbGVNZXRhZGF0YSksCiAgICAgICBtVHJhY2tNZXRhZGF0YSh0cmFja01ldGFkYXRhKSwKICAgICAgIG1Jbml0Q2hlY2soZmFsc2UpLAogICAgICAgbU1heEJ1ZmZlclNpemUoMCksCiAgICAgICBtR3JvdXAoTlVMTCksCi0gICAgICBtQ29weShjb3B5VHJlc3Bhc3MpLAogICAgICAgbURlY29kZXIoTlVMTCksCiAgICAgICBtQ3VycmVudFBvcygwTEwpLAogICAgICAgbUVPRihmYWxzZSksCkBAIC01OTAsNDYgKzUzNywyNyBAQAogICAgICAgICAgICAgQUxPR0UoInVuc3VwcG9ydGVkIHNhbXBsZSByYXRlICV1IiwgZ2V0U2FtcGxlUmF0ZSgpKTsKICAgICAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgICAgICB9Ci0gICAgICAgIC8vIGNvbmZpZ3VyZSB0aGUgYXBwcm9wcmlhdGUgY29weSBmdW5jdGlvbiwgZGVmYXVsdGluZyB0byB0cmVzcGFzcwotICAgICAgICBzdGF0aWMgY29uc3Qgc3RydWN0IHsKLSAgICAgICAgICAgIHVuc2lnbmVkIG1DaGFubmVsczsKLSAgICAgICAgICAgIHVuc2lnbmVkIG1CaXRzUGVyU2FtcGxlOwotICAgICAgICAgICAgdm9pZCAoKm1Db3B5KShpbnQxNl90ICpkc3QsIGNvbnN0IGludCAqIHNyY1trTWF4Q2hhbm5lbHNdLCB1bnNpZ25lZCBuU2FtcGxlcywgdW5zaWduZWQgbkNoYW5uZWxzKTsKLSAgICAgICAgfSB0YWJsZVtdID0gewotICAgICAgICAgICAgeyAxLCAgOCwgY29weU1vbm84ICAgIH0sCi0gICAgICAgICAgICB7IDIsICA4LCBjb3B5U3RlcmVvOCAgfSwKLSAgICAgICAgICAgIHsgOCwgIDgsIGNvcHlNdWx0aUNoOCAgfSwKLSAgICAgICAgICAgIHsgMSwgMTYsIGNvcHlNb25vMTYgICB9LAotICAgICAgICAgICAgeyAyLCAxNiwgY29weVN0ZXJlbzE2IH0sCi0gICAgICAgICAgICB7IDgsIDE2LCBjb3B5TXVsdGlDaDE2IH0sCi0gICAgICAgICAgICB7IDEsIDI0LCBjb3B5TW9ubzI0ICAgfSwKLSAgICAgICAgICAgIHsgMiwgMjQsIGNvcHlTdGVyZW8yNCB9LAotICAgICAgICAgICAgeyA4LCAyNCwgY29weU11bHRpQ2gyNCB9LAotICAgICAgICB9OwotICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgc2l6ZW9mKHRhYmxlKS9zaXplb2YodGFibGVbMF0pOyArK2kpIHsKLSAgICAgICAgICAgIGlmICh0YWJsZVtpXS5tQ2hhbm5lbHMgPj0gZ2V0Q2hhbm5lbHMoKSAmJgotICAgICAgICAgICAgICAgICAgICB0YWJsZVtpXS5tQml0c1BlclNhbXBsZSA9PSBnZXRCaXRzUGVyU2FtcGxlKCkpIHsKLSAgICAgICAgICAgICAgICBtQ29weSA9IHRhYmxlW2ldLm1Db3B5OwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9CiAgICAgICAgIC8vIHBvcHVsYXRlIHRyYWNrIG1ldGFkYXRhCiAgICAgICAgIGlmIChtVHJhY2tNZXRhZGF0YSAhPSAwKSB7Ci0gICAgICAgICAgICBtVHJhY2tNZXRhZGF0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX1JBVyk7Ci0gICAgICAgICAgICBtVHJhY2tNZXRhZGF0YS0+c2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgZ2V0Q2hhbm5lbHMoKSk7Ci0gICAgICAgICAgICBtVHJhY2tNZXRhZGF0YS0+c2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIGdldFNhbXBsZVJhdGUoKSk7Ci0gICAgICAgICAgICBtVHJhY2tNZXRhZGF0YS0+c2V0SW50MzIoa0tleUJpdHNQZXJTYW1wbGUsIGdldEJpdHNQZXJTYW1wbGUoKSk7Ci0gICAgICAgICAgICBtVHJhY2tNZXRhZGF0YS0+c2V0SW50MzIoa0tleVBjbUVuY29kaW5nLCBrQXVkaW9FbmNvZGluZ1BjbTE2Yml0KTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobVRyYWNrTWV0YWRhdGEsCisgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtVHJhY2tNZXRhZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX0NPVU5ULCBnZXRDaGFubmVscygpKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtVHJhY2tNZXRhZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9TQU1QTEVfUkFURSwgZ2V0U2FtcGxlUmF0ZSgpKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtVHJhY2tNZXRhZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9CSVRTX1BFUl9TQU1QTEUsIGdldEJpdHNQZXJTYW1wbGUoKSk7CiAgICAgICAgICAgICAvLyBzYW1wbGUgcmF0ZSBpcyBub24temVybywgc28gZGl2aXNpb24gYnkgemVybyBub3QgcG9zc2libGUKLSAgICAgICAgICAgIG1UcmFja01ldGFkYXRhLT5zZXRJbnQ2NChrS2V5RHVyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgIChnZXRUb3RhbFNhbXBsZXMoKSAqIDEwMDAwMDBMTCkgLyBnZXRTYW1wbGVSYXRlKCkpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KG1UcmFja01ldGFkYXRhLAorICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0RVUkFUSU9OLCAoZ2V0VG90YWxTYW1wbGVzKCkgKiAxMDAwMDAwTEwpIC8gZ2V0U2FtcGxlUmF0ZSgpKTsKICAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIEFMT0dFKCJtaXNzaW5nIFNUUkVBTUlORk8iKTsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQogICAgIGlmIChtRmlsZU1ldGFkYXRhICE9IDApIHsKLSAgICAgICAgbUZpbGVNZXRhZGF0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX0ZMQUMpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1GaWxlTWV0YWRhdGEsCisgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9BVURJT19GTEFDKTsKICAgICB9CiAgICAgcmV0dXJuIE9LOwogfQpAQCAtNjM4LDcgKzU2Niw3IEBACiB7CiAgICAgQ0hFQ0sobUdyb3VwID09IE5VTEwpOwogICAgIG1Hcm91cCA9IG5ldyBNZWRpYUJ1ZmZlckdyb3VwOwotICAgIG1NYXhCdWZmZXJTaXplID0gZ2V0TWF4QmxvY2tTaXplKCkgKiBnZXRDaGFubmVscygpICogc2l6ZW9mKGludDE2X3QpOworICAgIG1NYXhCdWZmZXJTaXplID0gZ2V0TWF4QmxvY2tTaXplKCkgKiBnZXRDaGFubmVscygpICogZ2V0T3V0cHV0U2FtcGxlU2l6ZSgpOwogICAgIG1Hcm91cC0+YWRkX2J1ZmZlcihNZWRpYUJ1ZmZlckJhc2U6OkNyZWF0ZShtTWF4QnVmZmVyU2l6ZSkpOwogfQogCkBAIC02OTEsMTIgKzYxOSwyNCBAQAogICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQotICAgIHNpemVfdCBidWZmZXJTaXplID0gYmxvY2tzaXplICogZ2V0Q2hhbm5lbHMoKSAqIHNpemVvZihpbnQxNl90KTsKKyAgICBjb25zdCBzaXplX3QgYnVmZmVyU2l6ZSA9IGJsb2Nrc2l6ZSAqIGdldENoYW5uZWxzKCkgKiBnZXRPdXRwdXRTYW1wbGVTaXplKCk7CiAgICAgQ0hFQ0soYnVmZmVyU2l6ZSA8PSBtTWF4QnVmZmVyU2l6ZSk7Ci0gICAgaW50MTZfdCAqZGF0YSA9IChpbnQxNl90ICopIGJ1ZmZlci0+ZGF0YSgpOwogICAgIGJ1ZmZlci0+c2V0X3JhbmdlKDAsIGJ1ZmZlclNpemUpOwogICAgIC8vIGNvcHkgUENNIGZyb20gRkxBQyB3cml0ZSBidWZmZXIgdG8gb3VyIG1lZGlhIGJ1ZmZlciwgd2l0aCBpbnRlcmxlYXZpbmcKLSAgICAoKm1Db3B5KShkYXRhLCBtV3JpdGVCdWZmZXIsIGJsb2Nrc2l6ZSwgZ2V0Q2hhbm5lbHMoKSk7CisgICAgY29uc3QgdW5zaWduZWQgYml0c1BlclNhbXBsZSA9IGdldEJpdHNQZXJTYW1wbGUoKTsKKyAgICBpZiAobU91dHB1dEZsb2F0KSB7CisgICAgICAgIGNvcHlUb0Zsb2F0KHJlaW50ZXJwcmV0X2Nhc3Q8ZmxvYXQqPihidWZmZXItPmRhdGEoKSksCisgICAgICAgICAgICAgICAgICAgIG1Xcml0ZUJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgYmxvY2tzaXplLAorICAgICAgICAgICAgICAgICAgICBnZXRDaGFubmVscygpLAorICAgICAgICAgICAgICAgICAgICBiaXRzUGVyU2FtcGxlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBjb3B5VG8xNlNpZ25lZChyZWludGVycHJldF9jYXN0PHNob3J0Kj4oYnVmZmVyLT5kYXRhKCkpLAorICAgICAgICAgICAgICAgICAgICAgICBtV3JpdGVCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgIGJsb2Nrc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q2hhbm5lbHMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgYml0c1BlclNhbXBsZSk7CisgICAgfQogICAgIC8vIGZpbGwgaW4gYnVmZmVyIG1ldGFkYXRhCiAgICAgQ0hFQ0sobVdyaXRlSGVhZGVyLm51bWJlcl90eXBlID09IEZMQUNfX0ZSQU1FX05VTUJFUl9UWVBFX1NBTVBMRV9OVU1CRVIpOwogICAgIEZMQUNfX3VpbnQ2NCBzYW1wbGVOdW1iZXIgPSBtV3JpdGVIZWFkZXIubnVtYmVyLnNhbXBsZV9udW1iZXI7CkBAIC03MDksMTggKzY0OSwxNyBAQAogLy8gRkxBQ3NvdXJjZQogCiBGTEFDU291cmNlOjpGTEFDU291cmNlKAotICAgICAgICBEYXRhU291cmNlQmFzZSAqZGF0YVNvdXJjZSwKLSAgICAgICAgTWV0YURhdGFCYXNlICZ0cmFja01ldGFkYXRhKQorICAgICAgICBEYXRhU291cmNlSGVscGVyICpkYXRhU291cmNlLAorICAgICAgICBBTWVkaWFGb3JtYXQgKnRyYWNrTWV0YWRhdGEsCisgICAgICAgIGJvb2wgb3V0cHV0RmxvYXQpCiAgICAgOiBtRGF0YVNvdXJjZShkYXRhU291cmNlKSwKICAgICAgIG1UcmFja01ldGFkYXRhKHRyYWNrTWV0YWRhdGEpLAotICAgICAgbVBhcnNlcigwKSwKLSAgICAgIG1Jbml0Q2hlY2soZmFsc2UpLAorICAgICAgbU91dHB1dEZsb2F0KG91dHB1dEZsb2F0KSwKKyAgICAgIG1QYXJzZXIobmV3IEZMQUNQYXJzZXIobURhdGFTb3VyY2UsIG91dHB1dEZsb2F0KSksCisgICAgICBtSW5pdENoZWNrKG1QYXJzZXItPmluaXRDaGVjaygpKSwKICAgICAgIG1TdGFydGVkKGZhbHNlKQogewogICAgIEFMT0dWKCJGTEFDU291cmNlOjpGTEFDU291cmNlIik7Ci0gICAgLy8gcmUtdXNlIHRoZSBzYW1lIHRyYWNrIG1ldGFkYXRhIHBhc3NlZCBpbnRvIGNvbnN0cnVjdG9yIGZyb20gRkxBQ0V4dHJhY3RvcgotICAgIG1QYXJzZXIgPSBuZXcgRkxBQ1BhcnNlcihtRGF0YVNvdXJjZSk7Ci0gICAgbUluaXRDaGVjayAgPSBtUGFyc2VyLT5pbml0Q2hlY2soKTsKIH0KIAogRkxBQ1NvdXJjZTo6fkZMQUNTb3VyY2UoKQpAQCAtNzMyLDcgKzY3MSw3IEBACiAgICAgZGVsZXRlIG1QYXJzZXI7CiB9CiAKLXN0YXR1c190IEZMQUNTb3VyY2U6OnN0YXJ0KE1ldGFEYXRhQmFzZSAqIC8qIHBhcmFtcyAqLykKK21lZGlhX3N0YXR1c190IEZMQUNTb3VyY2U6OnN0YXJ0KCkKIHsKICAgICBBTE9HVigiRkxBQ1NvdXJjZTo6c3RhcnQiKTsKIApAQCAtNzQwLDEwICs2NzksMTAgQEAKICAgICBtUGFyc2VyLT5hbGxvY2F0ZUJ1ZmZlcnMoKTsKICAgICBtU3RhcnRlZCA9IHRydWU7CiAKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAotc3RhdHVzX3QgRkxBQ1NvdXJjZTo6c3RvcCgpCittZWRpYV9zdGF0dXNfdCBGTEFDU291cmNlOjpzdG9wKCkKIHsKICAgICBBTE9HVigiRkxBQ1NvdXJjZTo6c3RvcCIpOwogCkBAIC03NTEsMTYgKzY5MCwyMCBAQAogICAgIG1QYXJzZXItPnJlbGVhc2VCdWZmZXJzKCk7CiAgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKIAotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCi1zdGF0dXNfdCBGTEFDU291cmNlOjpnZXRGb3JtYXQoTWV0YURhdGFCYXNlICZtZXRhKQorbWVkaWFfc3RhdHVzX3QgRkxBQ1NvdXJjZTo6Z2V0Rm9ybWF0KEFNZWRpYUZvcm1hdCAqbWV0YSkKIHsKLSAgICBtZXRhID0gbVRyYWNrTWV0YWRhdGE7Ci0gICAgcmV0dXJuIE9LOworICAgIGNvbnN0IG1lZGlhX3N0YXR1c190IHN0YXR1cyA9IEFNZWRpYUZvcm1hdF9jb3B5KG1ldGEsIG1UcmFja01ldGFkYXRhKTsKKyAgICBpZiAoc3RhdHVzID09IE9LKSB7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1BDTV9FTkNPRElORywKKyAgICAgICAgICAgICAgICBtT3V0cHV0RmxvYXQgPyBrQXVkaW9FbmNvZGluZ1BjbUZsb2F0IDoga0F1ZGlvRW5jb2RpbmdQY20xNmJpdCk7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7CiB9CiAKLXN0YXR1c190IEZMQUNTb3VyY2U6OnJlYWQoCittZWRpYV9zdGF0dXNfdCBGTEFDU291cmNlOjpyZWFkKAogICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipvdXRCdWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKQogewogICAgIE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyOwpAQCAtNzg0LDIwICs3MjcsMjIgQEAKICAgICAgICAgYnVmZmVyID0gbVBhcnNlci0+cmVhZEJ1ZmZlcigpOwogICAgIH0KICAgICAqb3V0QnVmZmVyID0gYnVmZmVyOwotICAgIHJldHVybiBidWZmZXIgIT0gTlVMTCA/IChzdGF0dXNfdCkgT0sgOiAoc3RhdHVzX3QpIEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgcmV0dXJuIGJ1ZmZlciAhPSBOVUxMID8gQU1FRElBX09LIDogQU1FRElBX0VSUk9SX0VORF9PRl9TVFJFQU07CiB9CiAKIC8vIEZMQUNFeHRyYWN0b3IKIAogRkxBQ0V4dHJhY3Rvcjo6RkxBQ0V4dHJhY3RvcigKLSAgICAgICAgRGF0YVNvdXJjZUJhc2UgKmRhdGFTb3VyY2UpCisgICAgICAgIERhdGFTb3VyY2VIZWxwZXIgKmRhdGFTb3VyY2UpCiAgICAgOiBtRGF0YVNvdXJjZShkYXRhU291cmNlKSwKICAgICAgIG1QYXJzZXIobnVsbHB0ciksCiAgICAgICBtSW5pdENoZWNrKGZhbHNlKQogewogICAgIEFMT0dWKCJGTEFDRXh0cmFjdG9yOjpGTEFDRXh0cmFjdG9yIik7CiAgICAgLy8gRkxBQ1BhcnNlciB3aWxsIGZpbGwgaW4gdGhlIG1ldGFkYXRhIGZvciB1cwotICAgIG1QYXJzZXIgPSBuZXcgRkxBQ1BhcnNlcihtRGF0YVNvdXJjZSwgJm1GaWxlTWV0YWRhdGEsICZtVHJhY2tNZXRhZGF0YSk7CisgICAgbUZpbGVNZXRhZGF0YSA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKKyAgICBtVHJhY2tNZXRhZGF0YSA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKKyAgICBtUGFyc2VyID0gbmV3IEZMQUNQYXJzZXIobURhdGFTb3VyY2UsIGZhbHNlIC8qIG91dHB1dEZsb2F0ICovLCBtRmlsZU1ldGFkYXRhLCBtVHJhY2tNZXRhZGF0YSk7CiAgICAgbUluaXRDaGVjayA9IG1QYXJzZXItPmluaXRDaGVjaygpOwogfQogCkBAIC04MDUsNiArNzUwLDkgQEAKIHsKICAgICBBTE9HVigifkZMQUNFeHRyYWN0b3I6OkZMQUNFeHRyYWN0b3IiKTsKICAgICBkZWxldGUgbVBhcnNlcjsKKyAgICBkZWxldGUgbURhdGFTb3VyY2U7CisgICAgQU1lZGlhRm9ybWF0X2RlbGV0ZShtRmlsZU1ldGFkYXRhKTsKKyAgICBBTWVkaWFGb3JtYXRfZGVsZXRlKG1UcmFja01ldGFkYXRhKTsKIH0KIAogc2l6ZV90IEZMQUNFeHRyYWN0b3I6OmNvdW50VHJhY2tzKCkKQEAgLTgxMiwzMyArNzYwLDM5IEBACiAgICAgcmV0dXJuIG1Jbml0Q2hlY2sgPT0gT0sgPyAxIDogMDsKIH0KIAotTWVkaWFUcmFjayAqRkxBQ0V4dHJhY3Rvcjo6Z2V0VHJhY2soc2l6ZV90IGluZGV4KQorTWVkaWFUcmFja0hlbHBlclYyICpGTEFDRXh0cmFjdG9yOjpnZXRUcmFjayhzaXplX3QgaW5kZXgpCiB7CiAgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0sgfHwgaW5kZXggPiAwKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KLSAgICByZXR1cm4gbmV3IEZMQUNTb3VyY2UobURhdGFTb3VyY2UsIG1UcmFja01ldGFkYXRhKTsKKworICAgIHJldHVybiBuZXcgRkxBQ1NvdXJjZSgKKyAgICAgICAgICAgIG1EYXRhU291cmNlLCBtVHJhY2tNZXRhZGF0YSwgc2hvdWxkRXh0cmFjdG9yT3V0cHV0RmxvYXQobVBhcnNlci0+Z2V0Qml0c1BlclNhbXBsZSgpKSk7CiB9CiAKLXN0YXR1c190IEZMQUNFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoCi0gICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSwKK21lZGlhX3N0YXR1c190IEZMQUNFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoCisgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YSwKICAgICAgICAgc2l6ZV90IGluZGV4LCB1aW50MzJfdCAvKiBmbGFncyAqLykgewogICAgIGlmIChtSW5pdENoZWNrICE9IE9LIHx8IGluZGV4ID4gMCkgewotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogICAgIH0KLSAgICBtZXRhID0gbVRyYWNrTWV0YWRhdGE7Ci0gICAgcmV0dXJuIE9LOworICAgIGNvbnN0IG1lZGlhX3N0YXR1c190IHN0YXR1cyA9IEFNZWRpYUZvcm1hdF9jb3B5KG1ldGEsIG1UcmFja01ldGFkYXRhKTsKKyAgICBpZiAoc3RhdHVzID09IE9LKSB7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1BDTV9FTkNPRElORywKKyAgICAgICAgICAgICAgICBzaG91bGRFeHRyYWN0b3JPdXRwdXRGbG9hdChtUGFyc2VyLT5nZXRCaXRzUGVyU2FtcGxlKCkpCisgICAgICAgICAgICAgICAgICAgICAgICA/IGtBdWRpb0VuY29kaW5nUGNtRmxvYXQgOiBrQXVkaW9FbmNvZGluZ1BjbTE2Yml0KTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdHVzX3QgRkxBQ0V4dHJhY3Rvcjo6Z2V0TWV0YURhdGEoTWV0YURhdGFCYXNlICZtZXRhKQorbWVkaWFfc3RhdHVzX3QgRkxBQ0V4dHJhY3Rvcjo6Z2V0TWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhKQogewotICAgIG1ldGEgPSBtRmlsZU1ldGFkYXRhOwotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1lZGlhRm9ybWF0X2NvcHkobWV0YSwgbUZpbGVNZXRhZGF0YSk7CiB9CiAKIC8vIFNuaWZmZXIKIAotYm9vbCBTbmlmZkZMQUMoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgZmxvYXQgKmNvbmZpZGVuY2UpCitib29sIFNuaWZmRkxBQyhEYXRhU291cmNlSGVscGVyICpzb3VyY2UsIGZsb2F0ICpjb25maWRlbmNlKQogewogICAgIC8vIGZpcnN0IDQgaXMgdGhlIHNpZ25hdHVyZSB3b3JkCiAgICAgLy8gc2Vjb25kIDQgaXMgdGhlIHNpemVvZiBTVFJFQU1JTkZPCkBAIC04NjAsMjQgKzgxNCwyNyBAQAogZXh0ZXJuICJDIiB7CiAvLyBUaGlzIGlzIHRoZSBvbmx5IHN5bWJvbCB0aGF0IG5lZWRzIHRvIGJlIGV4cG9ydGVkCiBfX2F0dHJpYnV0ZV9fICgodmlzaWJpbGl0eSAoImRlZmF1bHQiKSkpCi1NZWRpYUV4dHJhY3Rvcjo6RXh0cmFjdG9yRGVmIEdFVEVYVFJBQ1RPUkRFRigpIHsKK0V4dHJhY3RvckRlZiBHRVRFWFRSQUNUT1JERUYoKSB7CiAgICAgcmV0dXJuIHsKLSAgICAgICAgTWVkaWFFeHRyYWN0b3I6OkVYVFJBQ1RPUkRFRl9WRVJTSU9OLAorICAgICAgICAgICAgRVhUUkFDVE9SREVGX1ZFUlNJT05fQ1VSUkVOVCwKICAgICAgICAgICAgIFVVSUQoIjEzNjRiMDQ4LWNjNDUtNGZkYS05OTM0LTMyN2QwZWJmOTgyOSIpLAogICAgICAgICAgICAgMSwKICAgICAgICAgICAgICJGTEFDIEV4dHJhY3RvciIsCi0gICAgICAgICAgICBbXSgKLSAgICAgICAgICAgICAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgZmxvYXQgKmNvbmZpZGVuY2UsCi0gICAgICAgICAgICAgICAgICAgIHZvaWQgKiosCi0gICAgICAgICAgICAgICAgICAgIE1lZGlhRXh0cmFjdG9yOjpGcmVlTWV0YUZ1bmMgKikgLT4gTWVkaWFFeHRyYWN0b3I6OkNyZWF0b3JGdW5jIHsKLSAgICAgICAgICAgICAgICBpZiAoU25pZmZGTEFDKHNvdXJjZSwgY29uZmlkZW5jZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtdKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKSAtPiBNZWRpYUV4dHJhY3RvciogewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBGTEFDRXh0cmFjdG9yKHNvdXJjZSk7fTsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAudjIgPSBbXSgKKyAgICAgICAgICAgICAgICAgICAgICAgIENEYXRhU291cmNlICpzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqY29uZmlkZW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKiosCisgICAgICAgICAgICAgICAgICAgICAgICBGcmVlTWV0YUZ1bmMgKikgLT4gQ3JlYXRvckZ1bmNWMiB7CisgICAgICAgICAgICAgICAgICAgIERhdGFTb3VyY2VIZWxwZXIgaGVscGVyKHNvdXJjZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChTbmlmZkZMQUMoJmhlbHBlciwgY29uZmlkZW5jZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbXSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0RhdGFTb3VyY2UgKnNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKSAtPiBDTWVkaWFFeHRyYWN0b3JWMiogeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB3cmFwVjIobmV3IEZMQUNFeHRyYWN0b3IobmV3IERhdGFTb3VyY2VIZWxwZXIoc291cmNlKSkpO307CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICAgfQogICAgICB9OwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9mbGFjL0ZMQUNFeHRyYWN0b3IuaCBiL21lZGlhL2V4dHJhY3RvcnMvZmxhYy9GTEFDRXh0cmFjdG9yLmgKaW5kZXggN2ZiNmVjNi4uMzIzMzA3YiAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9mbGFjL0ZMQUNFeHRyYWN0b3IuaAorKysgYi9tZWRpYS9leHRyYWN0b3JzL2ZsYWMvRkxBQ0V4dHJhY3Rvci5oCkBAIC0xOCw0NSArMTgsNDQgQEAKICNkZWZpbmUgRkxBQ19FWFRSQUNUT1JfSF8KIAogI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2VCYXNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3IuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YUJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkFwaS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFGb3JtYXQuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogY2xhc3MgRkxBQ1BhcnNlcjsKIAotY2xhc3MgRkxBQ0V4dHJhY3RvciA6IHB1YmxpYyBNZWRpYUV4dHJhY3RvciB7CitjbGFzcyBGTEFDRXh0cmFjdG9yIDogcHVibGljIE1lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyVjIgewogCiBwdWJsaWM6Ci0gICAgZXhwbGljaXQgRkxBQ0V4dHJhY3RvcihEYXRhU291cmNlQmFzZSAqc291cmNlKTsKKyAgICBleHBsaWNpdCBGTEFDRXh0cmFjdG9yKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSk7CiAKICAgICB2aXJ0dWFsIHNpemVfdCBjb3VudFRyYWNrcygpOwotICAgIHZpcnR1YWwgTWVkaWFUcmFjayAqZ2V0VHJhY2soc2l6ZV90IGluZGV4KTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFRyYWNrTWV0YURhdGEoTWV0YURhdGFCYXNlJiBtZXRhLCBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKTsKKyAgICB2aXJ0dWFsIE1lZGlhVHJhY2tIZWxwZXJWMiAqZ2V0VHJhY2soc2l6ZV90IGluZGV4KTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IGdldFRyYWNrTWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhLCBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWV0YURhdGEoTWV0YURhdGFCYXNlJiBtZXRhKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IGdldE1ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSk7CiAgICAgdmlydHVhbCBjb25zdCBjaGFyICogbmFtZSgpIHsgcmV0dXJuICJGTEFDRXh0cmFjdG9yIjsgfQogCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+RkxBQ0V4dHJhY3RvcigpOwogCiBwcml2YXRlOgotICAgIERhdGFTb3VyY2VCYXNlICptRGF0YVNvdXJjZTsKKyAgICBEYXRhU291cmNlSGVscGVyICptRGF0YVNvdXJjZTsKICAgICBGTEFDUGFyc2VyICptUGFyc2VyOwogICAgIHN0YXR1c190IG1Jbml0Q2hlY2s7Ci0gICAgTWV0YURhdGFCYXNlIG1GaWxlTWV0YWRhdGE7CisgICAgQU1lZGlhRm9ybWF0ICptRmlsZU1ldGFkYXRhOwogCiAgICAgLy8gVGhlcmUgaXMgb25seSBvbmUgdHJhY2sKLSAgICBNZXRhRGF0YUJhc2UgbVRyYWNrTWV0YWRhdGE7CisgICAgQU1lZGlhRm9ybWF0ICptVHJhY2tNZXRhZGF0YTsKIAogICAgIEZMQUNFeHRyYWN0b3IoY29uc3QgRkxBQ0V4dHJhY3RvciAmKTsKICAgICBGTEFDRXh0cmFjdG9yICZvcGVyYXRvcj0oY29uc3QgRkxBQ0V4dHJhY3RvciAmKTsKIAogfTsKIAotYm9vbCBTbmlmZkZMQUMoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgZmxvYXQgKmNvbmZpZGVuY2UpOwotCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCiAjZW5kaWYgIC8vIEZMQUNfRVhUUkFDVE9SX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21pZGkvQW5kcm9pZC5icCBiL21lZGlhL2V4dHJhY3RvcnMvbWlkaS9BbmRyb2lkLmJwCmluZGV4IGZkZTA5ZGYxOC4uYzVkZjVjNyAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9taWRpL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9taWRpL0FuZHJvaWQuYnAKQEAgLTksNiArOSw3IEBACiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmxvZyIsCiAgICAgICAgICJsaWJtZWRpYWV4dHJhY3RvciIsCisgICAgICAgICJsaWJtZWRpYW5kayIsCiAgICAgXSwKIAogICAgIHN0YXRpY19saWJzOiBbCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21pZGkvTWlkaUV4dHJhY3Rvci5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL21pZGkvTWlkaUV4dHJhY3Rvci5jcHAKaW5kZXggYTMwYjZmOC4uY2QzOWNlYyAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9taWRpL01pZGlFeHRyYWN0b3IuY3BwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbWlkaS9NaWRpRXh0cmFjdG9yLmNwcApAQCAtMjQsOCArMjQsOCBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYVRyYWNrLmg+CiAjaW5jbHVkZSA8bGlic29uaXZveC9lYXNfcmV2ZXJiLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKQEAgLTMzLDE4ICszMywxOCBAQAogLy8gaG93IG1hbnkgU29uaXZveCBvdXRwdXQgYnVmZmVycyB0byBhZ2dyZWdhdGUgaW50byBvbmUgTWVkaWFCdWZmZXJCYXNlCiBzdGF0aWMgY29uc3QgaW50IE5VTV9DT01CSU5FX0JVRkZFUlMgPSA0OwogCi1jbGFzcyBNaWRpU291cmNlIDogcHVibGljIE1lZGlhVHJhY2sgeworY2xhc3MgTWlkaVNvdXJjZSA6IHB1YmxpYyBNZWRpYVRyYWNrSGVscGVyVjIgewogCiBwdWJsaWM6CiAgICAgTWlkaVNvdXJjZSgKICAgICAgICAgICAgIE1pZGlFbmdpbmUgJmVuZ2luZSwKLSAgICAgICAgICAgIE1ldGFEYXRhQmFzZSAmdHJhY2tNZXRhZGF0YSk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXQgKnRyYWNrTWV0YWRhdGEpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChNZXRhRGF0YUJhc2UgKnBhcmFtcyk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGb3JtYXQoTWV0YURhdGFCYXNlJik7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBzdGFydCgpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3Qgc3RvcCgpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0Rm9ybWF0KEFNZWRpYUZvcm1hdCAqKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCgKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHJlYWQoCiAgICAgICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CiAKIHByb3RlY3RlZDoKQEAgLTUyLDcgKzUyLDcgQEAKIAogcHJpdmF0ZToKICAgICBNaWRpRW5naW5lICZtRW5naW5lOwotICAgIE1ldGFEYXRhQmFzZSAmbVRyYWNrTWV0YWRhdGE7CisgICAgQU1lZGlhRm9ybWF0ICptVHJhY2tNZXRhZGF0YTsKICAgICBib29sIG1Jbml0Q2hlY2s7CiAgICAgYm9vbCBtU3RhcnRlZDsKIApAQCAtNjksNyArNjksNyBAQAogCiBNaWRpU291cmNlOjpNaWRpU291cmNlKAogICAgICAgICBNaWRpRW5naW5lICZlbmdpbmUsCi0gICAgICAgIE1ldGFEYXRhQmFzZSAmdHJhY2tNZXRhZGF0YSkKKyAgICAgICAgQU1lZGlhRm9ybWF0ICp0cmFja01ldGFkYXRhKQogICAgIDogbUVuZ2luZShlbmdpbmUpLAogICAgICAgbVRyYWNrTWV0YWRhdGEodHJhY2tNZXRhZGF0YSksCiAgICAgICBtSW5pdENoZWNrKGZhbHNlKSwKQEAgLTg3LDE3ICs4NywxNyBAQAogICAgIH0KIH0KIAotc3RhdHVzX3QgTWlkaVNvdXJjZTo6c3RhcnQoTWV0YURhdGFCYXNlICogLyogcGFyYW1zICovKQorbWVkaWFfc3RhdHVzX3QgTWlkaVNvdXJjZTo6c3RhcnQoKQogewogICAgIEFMT0dWKCJNaWRpU291cmNlOjpzdGFydCIpOwogCiAgICAgQ0hFQ0soIW1TdGFydGVkKTsKICAgICBtU3RhcnRlZCA9IHRydWU7CiAgICAgbUVuZ2luZS5hbGxvY2F0ZUJ1ZmZlcnMoKTsKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAotc3RhdHVzX3QgTWlkaVNvdXJjZTo6c3RvcCgpCittZWRpYV9zdGF0dXNfdCBNaWRpU291cmNlOjpzdG9wKCkKIHsKICAgICBBTE9HVigiTWlkaVNvdXJjZTo6c3RvcCIpOwogCkBAIC0xMDUsMTYgKzEwNSwxNSBAQAogICAgIG1TdGFydGVkID0gZmFsc2U7CiAgICAgbUVuZ2luZS5yZWxlYXNlQnVmZmVycygpOwogCi0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKLXN0YXR1c190IE1pZGlTb3VyY2U6OmdldEZvcm1hdChNZXRhRGF0YUJhc2UgJm1ldGEpCittZWRpYV9zdGF0dXNfdCBNaWRpU291cmNlOjpnZXRGb3JtYXQoQU1lZGlhRm9ybWF0ICptZXRhKQogewotICAgIG1ldGEgPSBtVHJhY2tNZXRhZGF0YTsKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNZWRpYUZvcm1hdF9jb3B5KG1ldGEsIG1UcmFja01ldGFkYXRhKTsKIH0KIAotc3RhdHVzX3QgTWlkaVNvdXJjZTo6cmVhZCgKK21lZGlhX3N0YXR1c190IE1pZGlTb3VyY2U6OnJlYWQoCiAgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKm91dEJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpCiB7CiAgICAgQUxPR1YoIk1pZGlTb3VyY2U6OnJlYWQiKTsKQEAgLTEzMSw3ICsxMzAsNyBAQAogICAgIGJ1ZmZlciA9IG1FbmdpbmUucmVhZEJ1ZmZlcigpOwogICAgICpvdXRCdWZmZXIgPSBidWZmZXI7CiAgICAgQUxPR1YoIk1pZGlTb3VyY2U6OnJlYWQgJXAgZG9uZSIsIHRoaXMpOwotICAgIHJldHVybiBidWZmZXIgIT0gTlVMTCA/IChzdGF0dXNfdCkgT0sgOiAoc3RhdHVzX3QpIEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgcmV0dXJuIGJ1ZmZlciAhPSBOVUxMID8gQU1FRElBX09LIDogQU1FRElBX0VSUk9SX0VORF9PRl9TVFJFQU07CiB9CiAKIHN0YXR1c190IE1pZGlTb3VyY2U6OmluaXQoKQpAQCAtMTQyLDkgKzE0MSw5IEBACiAKIC8vIE1pZGlFbmdpbmUKIAotTWlkaUVuZ2luZTo6TWlkaUVuZ2luZShEYXRhU291cmNlQmFzZSAqZGF0YVNvdXJjZSwKLSAgICAgICAgTWV0YURhdGFCYXNlICpmaWxlTWV0YWRhdGEsCi0gICAgICAgIE1ldGFEYXRhQmFzZSAqdHJhY2tNZXRhZGF0YSkgOgorTWlkaUVuZ2luZTo6TWlkaUVuZ2luZShDRGF0YVNvdXJjZSAqZGF0YVNvdXJjZSwKKyAgICAgICAgQU1lZGlhRm9ybWF0ICpmaWxlTWV0YWRhdGEsCisgICAgICAgIEFNZWRpYUZvcm1hdCAqdHJhY2tNZXRhZGF0YSkgOgogICAgICAgICAgICAgbUdyb3VwKE5VTEwpLAogICAgICAgICAgICAgbUVhc0RhdGEoTlVMTCksCiAgICAgICAgICAgICBtRWFzSGFuZGxlKE5VTEwpLApAQCAtMTcwLDE2ICsxNjksMjAgQEAKICAgICB9CiAKICAgICBpZiAoZmlsZU1ldGFkYXRhICE9IE5VTEwpIHsKLSAgICAgICAgZmlsZU1ldGFkYXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fTUlESSk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcoZmlsZU1ldGFkYXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX0FVRElPX01JREkpOwogICAgIH0KIAogICAgIGlmICh0cmFja01ldGFkYXRhICE9IE5VTEwpIHsKLSAgICAgICAgdHJhY2tNZXRhZGF0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX1JBVyk7Ci0gICAgICAgIHRyYWNrTWV0YWRhdGEtPnNldEludDY0KGtLZXlEdXJhdGlvbiwgMTAwMGxsICogdGVtcCk7IC8vIG1pbGxpLT5taWNybworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKHRyYWNrTWV0YWRhdGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KAorICAgICAgICAgICAgICAgIHRyYWNrTWV0YWRhdGEsIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04sIDEwMDBsbCAqIHRlbXApOyAvLyBtaWxsaS0+bWljcm8KICAgICAgICAgbUVhc0NvbmZpZyA9IEVBU19Db25maWcoKTsKLSAgICAgICAgdHJhY2tNZXRhZGF0YS0+c2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIG1FYXNDb25maWctPnNhbXBsZVJhdGUpOwotICAgICAgICB0cmFja01ldGFkYXRhLT5zZXRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCBtRWFzQ29uZmlnLT5udW1DaGFubmVscyk7Ci0gICAgICAgIHRyYWNrTWV0YWRhdGEtPnNldEludDMyKGtLZXlQY21FbmNvZGluZywga0F1ZGlvRW5jb2RpbmdQY20xNmJpdCk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMigKKyAgICAgICAgICAgICAgICB0cmFja01ldGFkYXRhLCBBTUVESUFGT1JNQVRfS0VZX1NBTVBMRV9SQVRFLCBtRWFzQ29uZmlnLT5zYW1wbGVSYXRlKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKAorICAgICAgICAgICAgICAgIHRyYWNrTWV0YWRhdGEsIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9DT1VOVCwgbUVhc0NvbmZpZy0+bnVtQ2hhbm5lbHMpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIoCisgICAgICAgICAgICAgICAgdHJhY2tNZXRhZGF0YSwgQU1FRElBRk9STUFUX0tFWV9QQ01fRU5DT0RJTkcsIGtBdWRpb0VuY29kaW5nUGNtMTZiaXQpOwogICAgIH0KICAgICBtSXNJbml0aWFsaXplZCA9IHRydWU7CiB9CkBAIC0yNjMsMTggKzI2NiwyMiBAQAogLy8gTWlkaUV4dHJhY3RvcgogCiBNaWRpRXh0cmFjdG9yOjpNaWRpRXh0cmFjdG9yKAotICAgICAgICBEYXRhU291cmNlQmFzZSAqZGF0YVNvdXJjZSkKKyAgICAgICAgQ0RhdGFTb3VyY2UgKmRhdGFTb3VyY2UpCiAgICAgOiBtRGF0YVNvdXJjZShkYXRhU291cmNlKSwKICAgICAgIG1Jbml0Q2hlY2soZmFsc2UpCiB7CiAgICAgQUxPR1YoIk1pZGlFeHRyYWN0b3IgY3RvciIpOwotICAgIG1FbmdpbmUgPSBuZXcgTWlkaUVuZ2luZShtRGF0YVNvdXJjZSwgJm1GaWxlTWV0YWRhdGEsICZtVHJhY2tNZXRhZGF0YSk7CisgICAgbUZpbGVNZXRhZGF0YSA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKKyAgICBtVHJhY2tNZXRhZGF0YSA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKKyAgICBtRW5naW5lID0gbmV3IE1pZGlFbmdpbmUobURhdGFTb3VyY2UsIG1GaWxlTWV0YWRhdGEsIG1UcmFja01ldGFkYXRhKTsKICAgICBtSW5pdENoZWNrID0gbUVuZ2luZS0+aW5pdENoZWNrKCk7CiB9CiAKIE1pZGlFeHRyYWN0b3I6On5NaWRpRXh0cmFjdG9yKCkKIHsKICAgICBBTE9HVigiTWlkaUV4dHJhY3RvciBkdG9yIik7CisgICAgQU1lZGlhRm9ybWF0X2RlbGV0ZShtRmlsZU1ldGFkYXRhKTsKKyAgICBBTWVkaWFGb3JtYXRfZGVsZXRlKG1UcmFja01ldGFkYXRhKTsKIH0KIAogc2l6ZV90IE1pZGlFeHRyYWN0b3I6OmNvdW50VHJhY2tzKCkKQEAgLTI4Miw3ICsyODksNyBAQAogICAgIHJldHVybiBtSW5pdENoZWNrID09IE9LID8gMSA6IDA7CiB9CiAKLU1lZGlhVHJhY2sgKk1pZGlFeHRyYWN0b3I6OmdldFRyYWNrKHNpemVfdCBpbmRleCkKK01lZGlhVHJhY2tIZWxwZXJWMiAqTWlkaUV4dHJhY3Rvcjo6Z2V0VHJhY2soc2l6ZV90IGluZGV4KQogewogICAgIGlmIChtSW5pdENoZWNrICE9IE9LIHx8IGluZGV4ID4gMCkgewogICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTI5MCwyNyArMjk3LDI1IEBACiAgICAgcmV0dXJuIG5ldyBNaWRpU291cmNlKCptRW5naW5lLCBtVHJhY2tNZXRhZGF0YSk7CiB9CiAKLXN0YXR1c190IE1pZGlFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoCi0gICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSwKK21lZGlhX3N0YXR1c190IE1pZGlFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoCisgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YSwKICAgICAgICAgc2l6ZV90IGluZGV4LCB1aW50MzJfdCAvKiBmbGFncyAqLykgewogICAgIEFMT0dWKCJNaWRpRXh0cmFjdG9yOjpnZXRUcmFja01ldGFEYXRhIik7CiAgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0sgfHwgaW5kZXggPiAwKSB7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgfQotICAgIG1ldGEgPSBtVHJhY2tNZXRhZGF0YTsKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNZWRpYUZvcm1hdF9jb3B5KG1ldGEsIG1UcmFja01ldGFkYXRhKTsKIH0KIAotc3RhdHVzX3QgTWlkaUV4dHJhY3Rvcjo6Z2V0TWV0YURhdGEoTWV0YURhdGFCYXNlICZtZXRhKQorbWVkaWFfc3RhdHVzX3QgTWlkaUV4dHJhY3Rvcjo6Z2V0TWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhKQogewogICAgIEFMT0dWKCJNaWRpRXh0cmFjdG9yOjpnZXRNZXRhRGF0YSIpOwotICAgIG1ldGEgPSBtRmlsZU1ldGFkYXRhOwotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1lZGlhRm9ybWF0X2NvcHkobWV0YSwgbUZpbGVNZXRhZGF0YSk7CiB9CiAKIC8vIFNuaWZmZXIKIAotYm9vbCBTbmlmZk1pZGkoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgZmxvYXQgKmNvbmZpZGVuY2UpCitib29sIFNuaWZmTWlkaShDRGF0YVNvdXJjZSAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSkKIHsKICAgICBNaWRpRW5naW5lIHAoc291cmNlLCBOVUxMLCBOVUxMKTsKICAgICBpZiAocC5pbml0Q2hlY2soKSA9PSBPSykgewpAQCAtMzIzLDI3ICszMjgsMzAgQEAKIAogfQogCisKIGV4dGVybiAiQyIgewogLy8gVGhpcyBpcyB0aGUgb25seSBzeW1ib2wgdGhhdCBuZWVkcyB0byBiZSBleHBvcnRlZAogX19hdHRyaWJ1dGVfXyAoKHZpc2liaWxpdHkgKCJkZWZhdWx0IikpKQotTWVkaWFFeHRyYWN0b3I6OkV4dHJhY3RvckRlZiBHRVRFWFRSQUNUT1JERUYoKSB7CitFeHRyYWN0b3JEZWYgR0VURVhUUkFDVE9SREVGKCkgewogICAgIHJldHVybiB7Ci0gICAgICAgIE1lZGlhRXh0cmFjdG9yOjpFWFRSQUNUT1JERUZfVkVSU0lPTiwKKyAgICAgICAgRVhUUkFDVE9SREVGX1ZFUlNJT05fQ1VSUkVOVCwKICAgICAgICAgVVVJRCgiZWY2Y2NhMGEtZjhhMi00M2U2LWJhNWYtZGZjZDdjOWE3ZWYyIiksCiAgICAgICAgIDEsCiAgICAgICAgICJNSURJIEV4dHJhY3RvciIsCi0gICAgICAgIFtdKAotICAgICAgICAgICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsCisgICAgICAgIHsKKyAgICAgICAgICAgIC52MiA9IFtdKAorICAgICAgICAgICAgICAgIENEYXRhU291cmNlICpzb3VyY2UsCiAgICAgICAgICAgICAgICAgZmxvYXQgKmNvbmZpZGVuY2UsCiAgICAgICAgICAgICAgICAgdm9pZCAqKiwKLSAgICAgICAgICAgICAgICBNZWRpYUV4dHJhY3Rvcjo6RnJlZU1ldGFGdW5jICopIC0+IE1lZGlhRXh0cmFjdG9yOjpDcmVhdG9yRnVuYyB7Ci0gICAgICAgICAgICBpZiAoU25pZmZNaWRpKHNvdXJjZSwgY29uZmlkZW5jZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gW10oCi0gICAgICAgICAgICAgICAgICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKSAtPiBNZWRpYUV4dHJhY3RvciogewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE1pZGlFeHRyYWN0b3Ioc291cmNlKTt9OworICAgICAgICAgICAgICAgIEZyZWVNZXRhRnVuYyAqKSAtPiBDcmVhdG9yRnVuY1YyIHsKKyAgICAgICAgICAgICAgICBpZiAoU25pZmZNaWRpKHNvdXJjZSwgY29uZmlkZW5jZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtdKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENEYXRhU291cmNlICpzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKSAtPiBDTWVkaWFFeHRyYWN0b3JWMiogeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdyYXBWMihuZXcgTWlkaUV4dHJhY3Rvcihzb3VyY2UpKTt9OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9CiAgICAgfTsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbWlkaS9NaWRpRXh0cmFjdG9yLmggYi9tZWRpYS9leHRyYWN0b3JzL21pZGkvTWlkaUV4dHJhY3Rvci5oCmluZGV4IDI0NGRkMGYuLjQxMmQ2ZWIgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvbWlkaS9NaWRpRXh0cmFjdG9yLmgKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9taWRpL01pZGlFeHRyYWN0b3IuaApAQCAtMTgsMTEgKzE4LDEyIEBACiAjZGVmaW5lIE1JRElfRVhUUkFDVE9SX0hfCiAKICNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlQmFzZS5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5BcGkuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyQmFzZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YUJhc2UuaD4KICNpbmNsdWRlIDxtZWRpYS9NaWRpSW9XcmFwcGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFGb3JtYXQuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAjaW5jbHVkZSA8bGlic29uaXZveC9lYXMuaD4KIApAQCAtMzAsOSArMzEsOSBAQAogCiBjbGFzcyBNaWRpRW5naW5lIHsKIHB1YmxpYzoKLSAgICBleHBsaWNpdCBNaWRpRW5naW5lKERhdGFTb3VyY2VCYXNlICpkYXRhU291cmNlLAotICAgICAgICAgICAgTWV0YURhdGFCYXNlICpmaWxlTWV0YWRhdGEsCi0gICAgICAgICAgICBNZXRhRGF0YUJhc2UgKnRyYWNrTWV0YWRhdGEpOworICAgIGV4cGxpY2l0IE1pZGlFbmdpbmUoQ0RhdGFTb3VyY2UgKmRhdGFTb3VyY2UsCisgICAgICAgICAgICBBTWVkaWFGb3JtYXQgKmZpbGVNZXRhZGF0YSwKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdCAqdHJhY2tNZXRhZGF0YSk7CiAgICAgfk1pZGlFbmdpbmUoKTsKIAogICAgIHN0YXR1c190IGluaXRDaGVjaygpOwpAQCAtNTAsMjggKzUxLDI4IEBACiAgICAgYm9vbCBtSXNJbml0aWFsaXplZDsKIH07CiAKLWNsYXNzIE1pZGlFeHRyYWN0b3IgOiBwdWJsaWMgTWVkaWFFeHRyYWN0b3IgeworY2xhc3MgTWlkaUV4dHJhY3RvciA6IHB1YmxpYyBNZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlclYyIHsKIAogcHVibGljOgotICAgIGV4cGxpY2l0IE1pZGlFeHRyYWN0b3IoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSk7CisgICAgZXhwbGljaXQgTWlkaUV4dHJhY3RvcihDRGF0YVNvdXJjZSAqc291cmNlKTsKIAogICAgIHZpcnR1YWwgc2l6ZV90IGNvdW50VHJhY2tzKCk7Ci0gICAgdmlydHVhbCBNZWRpYVRyYWNrICpnZXRUcmFjayhzaXplX3QgaW5kZXgpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0VHJhY2tNZXRhRGF0YShNZXRhRGF0YUJhc2UmIG1ldGEsIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpOworICAgIHZpcnR1YWwgTWVkaWFUcmFja0hlbHBlclYyICpnZXRUcmFjayhzaXplX3QgaW5kZXgpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0VHJhY2tNZXRhRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEsIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNZXRhRGF0YShNZXRhRGF0YUJhc2UmIG1ldGEpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0TWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhKTsKICAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKiBuYW1lKCkgeyByZXR1cm4gIk1pZGlFeHRyYWN0b3IiOyB9CiAKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5NaWRpRXh0cmFjdG9yKCk7CiAKIHByaXZhdGU6Ci0gICAgRGF0YVNvdXJjZUJhc2UgKm1EYXRhU291cmNlOworICAgIENEYXRhU291cmNlICptRGF0YVNvdXJjZTsKICAgICBzdGF0dXNfdCBtSW5pdENoZWNrOwotICAgIE1ldGFEYXRhQmFzZSBtRmlsZU1ldGFkYXRhOworICAgIEFNZWRpYUZvcm1hdCAqbUZpbGVNZXRhZGF0YTsKIAogICAgIC8vIFRoZXJlIGlzIG9ubHkgb25lIHRyYWNrCi0gICAgTWV0YURhdGFCYXNlIG1UcmFja01ldGFkYXRhOworICAgIEFNZWRpYUZvcm1hdCAqbVRyYWNrTWV0YWRhdGE7CiAKICAgICBNaWRpRW5naW5lICptRW5naW5lOwogCkBAIC04OCw3ICs4OSw3IEBACiAKIH07CiAKLWJvb2wgU25pZmZNaWRpKERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIGZsb2F0ICpjb25maWRlbmNlKTsKK2Jvb2wgU25pZmZNaWRpKENEYXRhU291cmNlICpzb3VyY2UsIGZsb2F0ICpjb25maWRlbmNlKTsKIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9ta3YvQW5kcm9pZC5icCBiL21lZGlhL2V4dHJhY3RvcnMvbWt2L0FuZHJvaWQuYnAKaW5kZXggNjgxZmQzNS4uYWUxMDhlYyAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9ta3YvQW5kcm9pZC5icAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21rdi9BbmRyb2lkLmJwCkBAIC0xMiw2ICsxMiw3IEBACiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmxvZyIsCiAgICAgICAgICJsaWJtZWRpYWV4dHJhY3RvciIsCisgICAgICAgICJsaWJtZWRpYW5kayIsCiAgICAgXSwKIAogICAgIHN0YXRpY19saWJzOiBbCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21rdi9NYXRyb3NrYUV4dHJhY3Rvci5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL21rdi9NYXRyb3NrYUV4dHJhY3Rvci5jcHAKaW5kZXggZDY1NzU4Mi4uMWZkYWMwNSAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9ta3YvTWF0cm9za2FFeHRyYWN0b3IuY3BwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbWt2L01hdHJvc2thRXh0cmFjdG9yLmNwcApAQCAtMjMsNyArMjMsNiBAQAogCiAjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZUJhc2UuaD4KICNpbmNsdWRlIDxtZWRpYS9FeHRyYWN0b3JVdGlscy5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhVHJhY2suaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CkBAIC00NCw3ICs0Myw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0cnVjdCBEYXRhU291cmNlQmFzZVJlYWRlciA6IHB1YmxpYyBta3ZwYXJzZXI6OklNa3ZSZWFkZXIgewotICAgIGV4cGxpY2l0IERhdGFTb3VyY2VCYXNlUmVhZGVyKERhdGFTb3VyY2VCYXNlICpzb3VyY2UpCisgICAgZXhwbGljaXQgRGF0YVNvdXJjZUJhc2VSZWFkZXIoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlKQogICAgICAgICA6IG1Tb3VyY2Uoc291cmNlKSB7CiAgICAgfQogCkBAIC02OCw4ICs2NywxMiBAQAogICAgIHZpcnR1YWwgaW50IExlbmd0aChsb25nIGxvbmcqIHRvdGFsLCBsb25nIGxvbmcqIGF2YWlsYWJsZSkgewogICAgICAgICBvZmY2NF90IHNpemU7CiAgICAgICAgIGlmIChtU291cmNlLT5nZXRTaXplKCZzaXplKSAhPSBPSykgewotICAgICAgICAgICAgKnRvdGFsID0gLTE7Ci0gICAgICAgICAgICAqYXZhaWxhYmxlID0gKGxvbmcgbG9uZykoKDF1bGwgPDwgNjMpIC0gMSk7CisgICAgICAgICAgICBpZiAodG90YWwpIHsKKyAgICAgICAgICAgICAgICAqdG90YWwgPSAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChhdmFpbGFibGUpIHsKKyAgICAgICAgICAgICAgICAqYXZhaWxhYmxlID0gKGxvbmcgbG9uZykoKDF1bGwgPDwgNjMpIC0gMSk7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICB9CkBAIC04Niw3ICs4OSw3IEBACiAgICAgfQogCiBwcml2YXRlOgotICAgIERhdGFTb3VyY2VCYXNlICptU291cmNlOworICAgIERhdGFTb3VyY2VIZWxwZXIgKm1Tb3VyY2U7CiAKICAgICBEYXRhU291cmNlQmFzZVJlYWRlcihjb25zdCBEYXRhU291cmNlQmFzZVJlYWRlciAmKTsKICAgICBEYXRhU291cmNlQmFzZVJlYWRlciAmb3BlcmF0b3I9KGNvbnN0IERhdGFTb3VyY2VCYXNlUmVhZGVyICYpOwpAQCAtMTI0LDE1ICsxMjcsMTUgQEAKICAgICBCbG9ja0l0ZXJhdG9yICZvcGVyYXRvcj0oY29uc3QgQmxvY2tJdGVyYXRvciAmKTsKIH07CiAKLXN0cnVjdCBNYXRyb3NrYVNvdXJjZSA6IHB1YmxpYyBNZWRpYVRyYWNrIHsKK3N0cnVjdCBNYXRyb3NrYVNvdXJjZSA6IHB1YmxpYyBNZWRpYVRyYWNrSGVscGVyVjIgewogICAgIE1hdHJvc2thU291cmNlKE1hdHJvc2thRXh0cmFjdG9yICpleHRyYWN0b3IsIHNpemVfdCBpbmRleCk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhQmFzZSAqcGFyYW1zKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHN0YXJ0KCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBzdG9wKCk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZvcm1hdChNZXRhRGF0YUJhc2UgJik7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRGb3JtYXQoQU1lZGlhRm9ybWF0ICopOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKAorICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgcmVhZCgKICAgICAgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpOwogCiBwcm90ZWN0ZWQ6CkBAIC0xNTgsNyArMTYxLDcgQEAKICAgICBzdGF0dXNfdCBhZHZhbmNlKCk7CiAKICAgICBzdGF0dXNfdCBzZXRXZWJtQmxvY2tDcnlwdG9JbmZvKE1lZGlhQnVmZmVyQmFzZSAqbWJ1Zik7Ci0gICAgc3RhdHVzX3QgcmVhZEJsb2NrKCk7CisgICAgbWVkaWFfc3RhdHVzX3QgcmVhZEJsb2NrKCk7CiAgICAgdm9pZCBjbGVhclBlbmRpbmdGcmFtZXMoKTsKIAogICAgIE1hdHJvc2thU291cmNlKGNvbnN0IE1hdHJvc2thU291cmNlICYpOwpAQCAtMjIyLDQzICsyMjUsMzEgQEAKICAgICAgICAgICAgICAgICAgbUV4dHJhY3Rvci0+bVRyYWNrcy5pdGVtQXQoaW5kZXgpLm1UcmFja051bSwKICAgICAgICAgICAgICAgICAgaW5kZXgpLAogICAgICAgbU5BTFNpemVMZW4oLTEpIHsKLSAgICBNZXRhRGF0YUJhc2UgJm1ldGEgPSBtRXh0cmFjdG9yLT5tVHJhY2tzLmVkaXRJdGVtQXQoaW5kZXgpLm1NZXRhOworICAgIE1hdHJvc2thRXh0cmFjdG9yOjpUcmFja0luZm8gJnRyYWNrSW5mbyA9IG1FeHRyYWN0b3ItPm1UcmFja3MuZWRpdEl0ZW1BdChpbmRleCk7CisgICAgQU1lZGlhRm9ybWF0ICptZXRhID0gdHJhY2tJbmZvLm1NZXRhOwogCiAgICAgY29uc3QgY2hhciAqbWltZTsKLSAgICBDSEVDSyhtZXRhLmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKTsKKyAgICBDSEVDSyhBTWVkaWFGb3JtYXRfZ2V0U3RyaW5nKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgJm1pbWUpKTsKIAogICAgIG1Jc0F1ZGlvID0gIXN0cm5jYXNlY21wKCJhdWRpby8iLCBtaW1lLCA2KTsKIAogICAgIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpKSB7CiAgICAgICAgIG1UeXBlID0gQVZDOwogCi0gICAgICAgIHVpbnQzMl90IGR1bW15OwotICAgICAgICBjb25zdCB1aW50OF90ICphdmNjOwotICAgICAgICBzaXplX3QgYXZjY1NpemU7Ci0gICAgICAgIGludDMyX3QgbmFsU2l6ZUxlbiA9IDA7Ci0gICAgICAgIGlmIChtZXRhLmZpbmRJbnQzMihrS2V5TmFsTGVuZ3RoU2l6ZSwgJm5hbFNpemVMZW4pKSB7Ci0gICAgICAgICAgICBpZiAobmFsU2l6ZUxlbiA+PSAwICYmIG5hbFNpemVMZW4gPD0gNCkgewotICAgICAgICAgICAgICAgIG1OQUxTaXplTGVuID0gbmFsU2l6ZUxlbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChtZXRhLmZpbmREYXRhKGtLZXlBVkNDLCAmZHVtbXksIChjb25zdCB2b2lkICoqKSZhdmNjLCAmYXZjY1NpemUpCi0gICAgICAgICAgICAgICAgJiYgYXZjY1NpemUgPj0gNXUpIHsKLSAgICAgICAgICAgIG1OQUxTaXplTGVuID0gMSArIChhdmNjWzRdICYgMyk7Ci0gICAgICAgICAgICBBTE9HVigibU5BTFNpemVMZW4gPSAlemQiLCBtTkFMU2l6ZUxlbik7CisgICAgICAgIGludDMyX3QgbmFsU2l6ZUxlbiA9IHRyYWNrSW5mby5tTmFsTGVuZ3RoU2l6ZTsKKyAgICAgICAgaWYgKG5hbFNpemVMZW4gPj0gMCAmJiBuYWxTaXplTGVuIDw9IDQpIHsKKyAgICAgICAgICAgIG1OQUxTaXplTGVuID0gbmFsU2l6ZUxlbjsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dFKCJObyBtTkFMU2l6ZUxlbiIpOworICAgICAgICAgICAgQUxPR0UoIk5vIEFWQyBtTkFMU2l6ZUxlbiIpOwogICAgICAgICB9CiAgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDKSkgewogICAgICAgICBtVHlwZSA9IEhFVkM7CiAKLSAgICAgICAgdWludDMyX3QgZHVtbXk7Ci0gICAgICAgIGNvbnN0IHVpbnQ4X3QgKmh2Y2M7Ci0gICAgICAgIHNpemVfdCBodmNjU2l6ZTsKLSAgICAgICAgaWYgKG1ldGEuZmluZERhdGEoa0tleUhWQ0MsICZkdW1teSwgKGNvbnN0IHZvaWQgKiopJmh2Y2MsICZodmNjU2l6ZSkKLSAgICAgICAgICAgICAgICAmJiBodmNjU2l6ZSA+PSAyMnUpIHsKLSAgICAgICAgICAgIG1OQUxTaXplTGVuID0gMSArIChodmNjWzE0KzddICYgMyk7Ci0gICAgICAgICAgICBBTE9HVigibU5BTFNpemVMZW4gPSAlenUiLCBtTkFMU2l6ZUxlbik7CisgICAgICAgIGludDMyX3QgbmFsU2l6ZUxlbiA9IHRyYWNrSW5mby5tTmFsTGVuZ3RoU2l6ZTsKKyAgICAgICAgaWYgKG5hbFNpemVMZW4gPj0gMCAmJiBuYWxTaXplTGVuIDw9IDQpIHsKKyAgICAgICAgICAgIG1OQUxTaXplTGVuID0gbmFsU2l6ZUxlbjsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dFKCJObyBtTkFMU2l6ZUxlbiIpOworICAgICAgICAgICAgQUxPR0UoIk5vIEhFVkMgbU5BTFNpemVMZW4iKTsKICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDKSkgewogICAgICAgICBtVHlwZSA9IEFBQzsKQEAgLTI2OSwyNSArMjYwLDI0IEBACiAgICAgY2xlYXJQZW5kaW5nRnJhbWVzKCk7CiB9CiAKLXN0YXR1c190IE1hdHJvc2thU291cmNlOjpzdGFydChNZXRhRGF0YUJhc2UgKiAvKiBwYXJhbXMgKi8pIHsKK21lZGlhX3N0YXR1c190IE1hdHJvc2thU291cmNlOjpzdGFydCgpIHsKICAgICBpZiAobVR5cGUgPT0gQVZDICYmIG1OQUxTaXplTGVuIDwgMCkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKICAgICB9CiAKICAgICBtQmxvY2tJdGVyLnJlc2V0KCk7CiAKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAotc3RhdHVzX3QgTWF0cm9za2FTb3VyY2U6OnN0b3AoKSB7CittZWRpYV9zdGF0dXNfdCBNYXRyb3NrYVNvdXJjZTo6c3RvcCgpIHsKICAgICBjbGVhclBlbmRpbmdGcmFtZXMoKTsKIAotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCi1zdGF0dXNfdCBNYXRyb3NrYVNvdXJjZTo6Z2V0Rm9ybWF0KE1ldGFEYXRhQmFzZSAmbWV0YSkgewotICAgIG1ldGEgPSBtRXh0cmFjdG9yLT5tVHJhY2tzLml0ZW1BdChtVHJhY2tJbmRleCkubU1ldGE7Ci0gICAgcmV0dXJuIE9LOworbWVkaWFfc3RhdHVzX3QgTWF0cm9za2FTb3VyY2U6OmdldEZvcm1hdChBTWVkaWFGb3JtYXQgKm1ldGEpIHsKKyAgICByZXR1cm4gQU1lZGlhRm9ybWF0X2NvcHkobWV0YSwgbUV4dHJhY3Rvci0+bVRyYWNrcy5pdGVtQXQobVRyYWNrSW5kZXgpLm1NZXRhKTsKIH0KIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KQEAgLTYwNCwxMSArNTk0LDExIEBACiAgICAgTWV0YURhdGFCYXNlICZtZXRhID0gbWJ1Zi0+bWV0YV9kYXRhKCk7CiAgICAgaWYgKGVuY3J5cHRlZCkgewogICAgICAgICB1aW50OF90IGN0ckNvdW50ZXJbMTZdID0geyAwIH07Ci0gICAgICAgIHVpbnQzMl90IHR5cGU7CiAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmtleUlkOwogICAgICAgICBzaXplX3Qga2V5SWRTaXplOwotICAgICAgICBjb25zdCBNZXRhRGF0YUJhc2UgJnRyYWNrTWV0YSA9IG1FeHRyYWN0b3ItPm1UcmFja3MuaXRlbUF0KG1UcmFja0luZGV4KS5tTWV0YTsKLSAgICAgICAgQ0hFQ0sodHJhY2tNZXRhLmZpbmREYXRhKGtLZXlDcnlwdG9LZXksICZ0eXBlLCAoY29uc3Qgdm9pZCAqKikma2V5SWQsICZrZXlJZFNpemUpKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0ICp0cmFja01ldGEgPSBtRXh0cmFjdG9yLT5tVHJhY2tzLml0ZW1BdChtVHJhY2tJbmRleCkubU1ldGE7CisgICAgICAgIEFNZWRpYUZvcm1hdF9nZXRCdWZmZXIodHJhY2tNZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19LRVksCisgICAgICAgICAgICAgICAgKHZvaWQqKikma2V5SWQsICZrZXlJZFNpemUpOwogICAgICAgICBtZXRhLnNldERhdGEoa0tleUNyeXB0b0tleSwgMCwga2V5SWQsIGtleUlkU2l6ZSk7CiAgICAgICAgIG1lbWNweShjdHJDb3VudGVyLCBkYXRhICsgMSwgOCk7CiAgICAgICAgIG1ldGEuc2V0RGF0YShrS2V5Q3J5cHRvSVYsIDAsIGN0ckNvdW50ZXIsIDE2KTsKQEAgLTcxMSwxMSArNzAxLDExIEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBNYXRyb3NrYVNvdXJjZTo6cmVhZEJsb2NrKCkgeworbWVkaWFfc3RhdHVzX3QgTWF0cm9za2FTb3VyY2U6OnJlYWRCbG9jaygpIHsKICAgICBDSEVDSyhtUGVuZGluZ0ZyYW1lcy5lbXB0eSgpKTsKIAogICAgIGlmIChtQmxvY2tJdGVyLmVvcygpKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0VORF9PRl9TVFJFQU07CiAgICAgfQogCiAgICAgY29uc3QgbWt2cGFyc2VyOjpCbG9jayAqYmxvY2sgPSBtQmxvY2tJdGVyLmJsb2NrKCk7CkBAIC03MjcsNyArNzE3LDcgQEAKICAgICAgICAgY29uc3QgbWt2cGFyc2VyOjpCbG9jazo6RnJhbWUgJmZyYW1lID0gYmxvY2stPkdldEZyYW1lKGkpOwogICAgICAgICBzaXplX3QgbGVuID0gZnJhbWUubGVuOwogICAgICAgICBpZiAoU0laRV9NQVggLSBsZW4gPCB0cmFja0luZm8tPm1IZWFkZXJMZW4pIHsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKICAgICAgICAgfQogCiAgICAgICAgIGxlbiArPSB0cmFja0luZm8tPm1IZWFkZXJMZW47CkBAIC03NTIsNyArNzQyLDcgQEAKIAogICAgICAgICAgICAgbUJsb2NrSXRlci5hZHZhbmNlKCk7CiAgICAgICAgICAgICBtYnVmLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogICAgICAgICB9CiAKICAgICAgICAgbVBlbmRpbmdGcmFtZXMucHVzaF9iYWNrKG1idWYpOwpAQCAtNzYwLDEwICs3NTAsMTAgQEAKIAogICAgIG1CbG9ja0l0ZXIuYWR2YW5jZSgpOwogCi0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKLXN0YXR1c190IE1hdHJvc2thU291cmNlOjpyZWFkKAorbWVkaWFfc3RhdHVzX3QgTWF0cm9za2FTb3VyY2U6OnJlYWQoCiAgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKm91dCwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKICAgICAqb3V0ID0gTlVMTDsKIApAQCAtNzczLDcgKzc2Myw3IEBACiAgICAgUmVhZE9wdGlvbnM6OlNlZWtNb2RlIG1vZGU7CiAgICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy0+Z2V0U2Vla1RvKCZzZWVrVGltZVVzLCAmbW9kZSkpIHsKICAgICAgICAgaWYgKG1vZGUgPT0gUmVhZE9wdGlvbnM6OlNFRUtfRlJBTUVfSU5ERVgpIHsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKKyAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5TVVBQT1JURUQ7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoIW1FeHRyYWN0b3ItPmlzTGl2ZVN0cmVhbWluZygpKSB7CkBAIC03OTEsNyArNzgxLDcgQEAKICAgICB9CiAKICAgICB3aGlsZSAobVBlbmRpbmdGcmFtZXMuZW1wdHkoKSkgewotICAgICAgICBzdGF0dXNfdCBlcnIgPSByZWFkQmxvY2soKTsKKyAgICAgICAgbWVkaWFfc3RhdHVzX3QgZXJyID0gcmVhZEJsb2NrKCk7CiAKICAgICAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICAgICAgY2xlYXJQZW5kaW5nRnJhbWVzKCk7CkBAIC04MTEsNyArODAxLDcgQEAKIAogICAgICAgICAqb3V0ID0gZnJhbWU7CiAKLSAgICAgICAgcmV0dXJuIE9LOworICAgICAgICByZXR1cm4gQU1FRElBX09LOwogICAgIH0KIAogICAgIC8vIEVhY2ggaW5wdXQgZnJhbWUgY29udGFpbnMgb25lIG9yIG1vcmUgTkFMIGZyYWdtZW50cywgZWFjaCBmcmFnbWVudApAQCAtODUwLDcgKzg0MCw3IEBACiAgICAgICAgICAgICAgICAgZnJhbWUtPnJlbGVhc2UoKTsKICAgICAgICAgICAgICAgICBmcmFtZSA9IE5VTEw7CiAKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOwogICAgICAgICAgICAgfSBlbHNlIGlmIChzcmNPZmZzZXQgKyBtTkFMU2l6ZUxlbiArIE5BTHNpemUgPiBzcmNTaXplKSB7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CkBAIC04NzgsNyArODY4LDcgQEAKICAgICAgICAgICAgIGZyYW1lLT5yZWxlYXNlKCk7CiAgICAgICAgICAgICBmcmFtZSA9IE5VTEw7CiAKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChwYXNzID09IDApIHsKQEAgLTkxNiwxMiArOTA2LDEyIEBACiAKICAgICAqb3V0ID0gYnVmZmVyOwogCi0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKLU1hdHJvc2thRXh0cmFjdG9yOjpNYXRyb3NrYUV4dHJhY3RvcihEYXRhU291cmNlQmFzZSAqc291cmNlKQorTWF0cm9za2FFeHRyYWN0b3I6Ok1hdHJvc2thRXh0cmFjdG9yKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSkKICAgICA6IG1EYXRhU291cmNlKHNvdXJjZSksCiAgICAgICBtUmVhZGVyKG5ldyBEYXRhU291cmNlQmFzZVJlYWRlcihtRGF0YVNvdXJjZSkpLAogICAgICAgbVNlZ21lbnQoTlVMTCksCkBAIC05OTQsMTMgKzk4NCwxNSBAQAogCiAgICAgZGVsZXRlIG1SZWFkZXI7CiAgICAgbVJlYWRlciA9IE5VTEw7CisKKyAgICBkZWxldGUgbURhdGFTb3VyY2U7CiB9CiAKIHNpemVfdCBNYXRyb3NrYUV4dHJhY3Rvcjo6Y291bnRUcmFja3MoKSB7CiAgICAgcmV0dXJuIG1UcmFja3Muc2l6ZSgpOwogfQogCi1NZWRpYVRyYWNrICpNYXRyb3NrYUV4dHJhY3Rvcjo6Z2V0VHJhY2soc2l6ZV90IGluZGV4KSB7CitNZWRpYVRyYWNrSGVscGVyVjIgKk1hdHJvc2thRXh0cmFjdG9yOjpnZXRUcmFjayhzaXplX3QgaW5kZXgpIHsKICAgICBpZiAoaW5kZXggPj0gbVRyYWNrcy5zaXplKCkpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQpAQCAtMTAwOCwxMSArMTAwMCwxMSBAQAogICAgIHJldHVybiBuZXcgTWF0cm9za2FTb3VyY2UodGhpcywgaW5kZXgpOwogfQogCi1zdGF0dXNfdCBNYXRyb3NrYUV4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YSgKLSAgICAgICAgTWV0YURhdGFCYXNlICZtZXRhLAorbWVkaWFfc3RhdHVzX3QgTWF0cm9za2FFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoCisgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YSwKICAgICAgICAgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncykgewogICAgIGlmIChpbmRleCA+PSBtVHJhY2tzLnNpemUoKSkgewotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogICAgIH0KIAogICAgIGlmICgoZmxhZ3MgJiBrSW5jbHVkZUV4dGVuc2l2ZU1ldGFEYXRhKSAmJiAhbUV4dHJhY3RlZFRodW1ibmFpbHMKQEAgLTEwMjEsOCArMTAxMyw3IEBACiAgICAgICAgIG1FeHRyYWN0ZWRUaHVtYm5haWxzID0gdHJ1ZTsKICAgICB9CiAKLSAgICBtZXRhID0gbVRyYWNrcy5pdGVtQXQoaW5kZXgpLm1NZXRhOwotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1lZGlhRm9ybWF0X2NvcHkobWV0YSwgbVRyYWNrcy5pdGVtQXQoaW5kZXgpLm1NZXRhKTsKIH0KIAogYm9vbCBNYXRyb3NrYUV4dHJhY3Rvcjo6aXNMaXZlU3RyZWFtaW5nKCkgY29uc3QgewpAQCAtMTA1Nyw3ICsxMDQ4LDcgQEAKIH0KIAogc3RhdGljIHZvaWQgYWRkRVNEU0Zyb21Db2RlY1ByaXZhdGUoCi0gICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSwKKyAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhLAogICAgICAgICBib29sIGlzQXVkaW8sIGNvbnN0IHZvaWQgKnByaXYsIHNpemVfdCBwcml2U2l6ZSkgewogCiAgICAgaW50IHByaXZTaXplQnl0ZXNSZXF1aXJlZCA9IGJ5dGVzRm9yU2l6ZShwcml2U2l6ZSk7CkBAIC0xMDg1LDE0ICsxMDc2LDE0IEBACiAgICAgc3RvcmVTaXplKGVzZHMsIGlkeCwgcHJpdlNpemUpOwogICAgIG1lbWNweShlc2RzICsgaWR4LCBwcml2LCBwcml2U2l6ZSk7CiAKLSAgICBtZXRhLnNldERhdGEoa0tleUVTRFMsIDAsIGVzZHMsIGVzZHNTaXplKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzAsIHByaXYsIHByaXZTaXplKTsKIAogICAgIGRlbGV0ZVtdIGVzZHM7CiAgICAgZXNkcyA9IE5VTEw7CiB9CiAKIHN0YXR1c190IGFkZFZvcmJpc0NvZGVjSW5mbygKLSAgICAgICAgTWV0YURhdGFCYXNlICZtZXRhLAorICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGEsCiAgICAgICAgIGNvbnN0IHZvaWQgKl9jb2RlY1ByaXZhdGUsIHNpemVfdCBjb2RlY1ByaXZhdGVTaXplKSB7CiAgICAgLy8gaGV4ZHVtcChfY29kZWNQcml2YXRlLCBjb2RlY1ByaXZhdGVTaXplKTsKIApAQCAtMTE1MCw3ICsxMTQxLDggQEAKICAgICBpZiAoY29kZWNQcml2YXRlW29mZnNldF0gIT0gMHgwMSkgewogICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgIH0KLSAgICBtZXRhLnNldERhdGEoa0tleVZvcmJpc0luZm8sIDAsICZjb2RlY1ByaXZhdGVbb2Zmc2V0XSwgbGVuMSk7CisgICAgLy8gZm9ybWVybHkga0tleVZvcmJpc0luZm8KKyAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzAsICZjb2RlY1ByaXZhdGVbb2Zmc2V0XSwgbGVuMSk7CiAKICAgICBvZmZzZXQgKz0gbGVuMTsKICAgICBpZiAoY29kZWNQcml2YXRlW29mZnNldF0gIT0gMHgwMykgewpAQCAtMTE2MiwxOSArMTE1NCwyMCBAQAogICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgIH0KIAotICAgIG1ldGEuc2V0RGF0YSgKLSAgICAgICAgICAgIGtLZXlWb3JiaXNCb29rcywgMCwgJmNvZGVjUHJpdmF0ZVtvZmZzZXRdLAotICAgICAgICAgICAgY29kZWNQcml2YXRlU2l6ZSAtIG9mZnNldCk7CisgICAgLy8gZm9ybWVybHkga0tleVZvcmJpc0Jvb2tzCisgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NTRF8xLAorICAgICAgICAgICAgJmNvZGVjUHJpdmF0ZVtvZmZzZXRdLCBjb2RlY1ByaXZhdGVTaXplIC0gb2Zmc2V0KTsKIAogICAgIHJldHVybiBPSzsKIH0KIAogc3RhdGljIHN0YXR1c190IGFkZEZsYWNNZXRhZGF0YSgKLSAgICAgICAgTWV0YURhdGFCYXNlICZtZXRhLAorICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGEsCiAgICAgICAgIGNvbnN0IHZvaWQgKmNvZGVjUHJpdmF0ZSwgc2l6ZV90IGNvZGVjUHJpdmF0ZVNpemUpIHsKICAgICAvLyBoZXhkdW1wKGNvZGVjUHJpdmF0ZSwgY29kZWNQcml2YXRlU2l6ZSk7CiAKLSAgICBtZXRhLnNldERhdGEoa0tleUZsYWNNZXRhZGF0YSwgMCwgY29kZWNQcml2YXRlLCBjb2RlY1ByaXZhdGVTaXplKTsKKyAgICAvLyBmb3JtZXJseSBrS2V5RmxhY01ldGFkYXRhCisgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NTRF8wLCBjb2RlY1ByaXZhdGUsIGNvZGVjUHJpdmF0ZVNpemUpOwogCiAgICAgaW50MzJfdCBtYXhJbnB1dFNpemUgPSA2NCA8PCAxMDsKICAgICBGTEFDRGVjb2RlciAqZmxhY0RlY29kZXIgPSBGTEFDRGVjb2Rlcjo6Q3JlYXRlKCk7CkBAIC0xMTk2LDcgKzExODksNyBAQAogICAgICAgICAgICAgICAgICogc3RyZWFtSW5mby5tYXhfYmxvY2tzaXplICogc3RyZWFtSW5mby5jaGFubmVsczsKICAgICAgICAgfQogICAgIH0KLSAgICBtZXRhLnNldEludDMyKGtLZXlNYXhJbnB1dFNpemUsIG1heElucHV0U2l6ZSk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUFYX0lOUFVUX1NJWkUsIG1heElucHV0U2l6ZSk7CiAKICAgICBkZWxldGUgZmxhY0RlY29kZXI7CiAgICAgcmV0dXJuIE9LOwpAQCAtMTIyNSw3ICsxMjE4LDcgQEAKICAgICB9CiAKICAgICAvLyBPdmVycmlkZSB0aGUgc3ludGhlc2l6ZWQgbmFsIGxlbmd0aCBzaXplLCB3aGljaCBpcyBhcmJpdHJhcnkKLSAgICB0cmFja0luZm8tPm1NZXRhLnNldEludDMyKGtLZXlOYWxMZW5ndGhTaXplLCAwKTsKKyAgICB0cmFja0luZm8tPm1OYWxMZW5ndGhTaXplID0gMDsKICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTEyNDcsNyArMTI0MCw3IEBACiB9CiAKIHZvaWQgTWF0cm9za2FFeHRyYWN0b3I6OmdldENvbG9ySW5mb3JtYXRpb24oCi0gICAgICAgIGNvbnN0IG1rdnBhcnNlcjo6VmlkZW9UcmFjayAqdnRyYWNrLCBNZXRhRGF0YUJhc2UgJm1ldGEpIHsKKyAgICAgICAgY29uc3QgbWt2cGFyc2VyOjpWaWRlb1RyYWNrICp2dHJhY2ssIEFNZWRpYUZvcm1hdCAqbWV0YSkgewogICAgIGNvbnN0IG1rdnBhcnNlcjo6Q29sb3VyICpjb2xvciA9IHZ0cmFjay0+R2V0Q29sb3VyKCk7CiAgICAgaWYgKGNvbG9yID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuOwpAQCAtMTI1Niw3ICsxMjQ5LDcgQEAKICAgICAvLyBDb2xvciBBc3BlY3RzCiAgICAgewogICAgICAgICBpbnQzMl90IHByaW1hcmllcyA9IDI7IC8vIElTTyB1bnNwZWNpZmllZAotICAgICAgICBpbnQzMl90IHRyYW5zZmVyID0gMjsgLy8gSVNPIHVuc3BlY2lmaWVkCisgICAgICAgIGludDMyX3QgaXNvdHJhbnNmZXIgPSAyOyAvLyBJU08gdW5zcGVjaWZpZWQKICAgICAgICAgaW50MzJfdCBjb2VmZnMgPSAyOyAvLyBJU08gdW5zcGVjaWZpZWQKICAgICAgICAgYm9vbCBmdWxsUmFuZ2UgPSBmYWxzZTsgLy8gZGVmYXVsdAogICAgICAgICBib29sIHJhbmdlU3BlY2lmaWVkID0gZmFsc2U7CkBAIC0xMjY1LDcgKzEyNTgsNyBAQAogICAgICAgICAgICAgcHJpbWFyaWVzID0gY29sb3ItPnByaW1hcmllczsKICAgICAgICAgfQogICAgICAgICBpZiAoaXNWYWxpZEludDMyQ29sb3VyVmFsdWUoY29sb3ItPnRyYW5zZmVyX2NoYXJhY3RlcmlzdGljcykpIHsKLSAgICAgICAgICAgIHRyYW5zZmVyID0gY29sb3ItPnRyYW5zZmVyX2NoYXJhY3RlcmlzdGljczsKKyAgICAgICAgICAgIGlzb3RyYW5zZmVyID0gY29sb3ItPnRyYW5zZmVyX2NoYXJhY3RlcmlzdGljczsKICAgICAgICAgfQogICAgICAgICBpZiAoaXNWYWxpZEludDMyQ29sb3VyVmFsdWUoY29sb3ItPm1hdHJpeF9jb2VmZmljaWVudHMpKSB7CiAgICAgICAgICAgICBjb2VmZnMgPSBjb2xvci0+bWF0cml4X2NvZWZmaWNpZW50czsKQEAgLTEyNzgsMTQgKzEyNzEsMjEgQEAKICAgICAgICAgICAgIHJhbmdlU3BlY2lmaWVkID0gdHJ1ZTsKICAgICAgICAgfQogCi0gICAgICAgIENvbG9yQXNwZWN0cyBhc3BlY3RzOwotICAgICAgICBDb2xvclV0aWxzOjpjb252ZXJ0SXNvQ29sb3JBc3BlY3RzVG9Db2RlY0FzcGVjdHMoCi0gICAgICAgICAgICAgICAgcHJpbWFyaWVzLCB0cmFuc2ZlciwgY29lZmZzLCBmdWxsUmFuZ2UsIGFzcGVjdHMpOwotICAgICAgICBtZXRhLnNldEludDMyKGtLZXlDb2xvclByaW1hcmllcywgYXNwZWN0cy5tUHJpbWFyaWVzKTsKLSAgICAgICAgbWV0YS5zZXRJbnQzMihrS2V5VHJhbnNmZXJGdW5jdGlvbiwgYXNwZWN0cy5tVHJhbnNmZXIpOwotICAgICAgICBtZXRhLnNldEludDMyKGtLZXlDb2xvck1hdHJpeCwgYXNwZWN0cy5tTWF0cml4Q29lZmZzKTsKLSAgICAgICAgbWV0YS5zZXRJbnQzMigKLSAgICAgICAgICAgICAgICBrS2V5Q29sb3JSYW5nZSwgcmFuZ2VTcGVjaWZpZWQgPyBhc3BlY3RzLm1SYW5nZSA6IENvbG9yQXNwZWN0czo6UmFuZ2VVbnNwZWNpZmllZCk7CisgICAgICAgIGludDMyX3QgcmFuZ2UgPSAwOworICAgICAgICBpbnQzMl90IHN0YW5kYXJkID0gMDsKKyAgICAgICAgaW50MzJfdCB0cmFuc2ZlciA9IDA7CisgICAgICAgIENvbG9yVXRpbHM6OmNvbnZlcnRJc29Db2xvckFzcGVjdHNUb1BsYXRmb3JtQXNwZWN0cygKKyAgICAgICAgICAgICAgICBwcmltYXJpZXMsIGlzb3RyYW5zZmVyLCBjb2VmZnMsIGZ1bGxSYW5nZSwKKyAgICAgICAgICAgICAgICAmcmFuZ2UsICZzdGFuZGFyZCwgJnRyYW5zZmVyKTsKKyAgICAgICAgaWYgKHJhbmdlICE9IDApIHsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NPTE9SX1JBTkdFLCByYW5nZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0YW5kYXJkICE9IDApIHsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NPTE9SX1NUQU5EQVJELCBzdGFuZGFyZCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRyYW5zZmVyICE9IDApIHsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NPTE9SX1RSQU5TRkVSLCB0cmFuc2Zlcik7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvLyBIRFIgU3RhdGljIEluZm8KQEAgLTEzMjksMjYgKzEzMjksMjggQEAKICAgICAgICAgLy8gT25seSBhZHZlcnRpc2Ugc3RhdGljIGluZm8gaWYgYXQgbGVhc3Qgb25lIG9mIHRoZSBncm91cHMgaGF2ZSBiZWVuIHNwZWNpZmllZC4KICAgICAgICAgaWYgKG1lbWNtcCgmaW5mbywgJm51bGxJbmZvLCBzaXplb2YoaW5mbykpICE9IDApIHsKICAgICAgICAgICAgIGluZm8ubUlEID0gSERSU3RhdGljSW5mbzo6a1R5cGUxOwotICAgICAgICAgICAgbWV0YS5zZXREYXRhKGtLZXlIZHJTdGF0aWNJbmZvLCAnaGRyUycsICZpbmZvLCBzaXplb2YoaW5mbykpOworICAgICAgICAgICAgQ29sb3JVdGlsczo6c2V0SERSU3RhdGljSW5mb0ludG9BTWVkaWFGb3JtYXQoaW5mbywgbWV0YSk7CiAgICAgICAgIH0KICAgICB9CiB9CiAKIHN0YXR1c190IE1hdHJvc2thRXh0cmFjdG9yOjppbml0VHJhY2tJbmZvKAotICAgICAgICBjb25zdCBta3ZwYXJzZXI6OlRyYWNrICp0cmFjaywgTWV0YURhdGFCYXNlICZtZXRhLCBUcmFja0luZm8gKnRyYWNrSW5mbykgeworICAgICAgICBjb25zdCBta3ZwYXJzZXI6OlRyYWNrICp0cmFjaywgQU1lZGlhRm9ybWF0ICptZXRhLCBUcmFja0luZm8gKnRyYWNrSW5mbykgewogICAgIHRyYWNrSW5mby0+bVRyYWNrTnVtID0gdHJhY2stPkdldE51bWJlcigpOwogICAgIHRyYWNrSW5mby0+bU1ldGEgPSBtZXRhOwogICAgIHRyYWNrSW5mby0+bUV4dHJhY3RvciA9IHRoaXM7CiAgICAgdHJhY2tJbmZvLT5tRW5jcnlwdGVkID0gZmFsc2U7CiAgICAgdHJhY2tJbmZvLT5tSGVhZGVyID0gTlVMTDsKICAgICB0cmFja0luZm8tPm1IZWFkZXJMZW4gPSAwOworICAgIHRyYWNrSW5mby0+bU5hbExlbmd0aFNpemUgPSAtMTsKIAogICAgIGZvcihzaXplX3QgaSA9IDA7IGkgPCB0cmFjay0+R2V0Q29udGVudEVuY29kaW5nQ291bnQoKTsgaSsrKSB7CiAgICAgICAgIGNvbnN0IG1rdnBhcnNlcjo6Q29udGVudEVuY29kaW5nICplbmNvZGluZyA9IHRyYWNrLT5HZXRDb250ZW50RW5jb2RpbmdCeUluZGV4KGkpOwogICAgICAgICBmb3Ioc2l6ZV90IGogPSAwOyBqIDwgZW5jb2RpbmctPkdldEVuY3J5cHRpb25Db3VudCgpOyBqKyspIHsKICAgICAgICAgICAgIGNvbnN0IG1rdnBhcnNlcjo6Q29udGVudEVuY29kaW5nOjpDb250ZW50RW5jcnlwdGlvbiAqZW5jcnlwdGlvbjsKICAgICAgICAgICAgIGVuY3J5cHRpb24gPSBlbmNvZGluZy0+R2V0RW5jcnlwdGlvbkJ5SW5kZXgoaik7Ci0gICAgICAgICAgICB0cmFja0luZm8tPm1NZXRhLnNldERhdGEoa0tleUNyeXB0b0tleSwgMCwgZW5jcnlwdGlvbi0+a2V5X2lkLCBlbmNyeXB0aW9uLT5rZXlfaWRfbGVuKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIodHJhY2tJbmZvLT5tTWV0YSwKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fS0VZLCBlbmNyeXB0aW9uLT5rZXlfaWQsIGVuY3J5cHRpb24tPmtleV9pZF9sZW4pOwogICAgICAgICAgICAgdHJhY2tJbmZvLT5tRW5jcnlwdGVkID0gdHJ1ZTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0xMzk3LDkgKzEzOTksMTAgQEAKIAogICAgICAgICBlbnVtIHsgVklERU9fVFJBQ0sgPSAxLCBBVURJT19UUkFDSyA9IDIgfTsKIAotICAgICAgICBNZXRhRGF0YUJhc2UgbWV0YTsKKyAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhID0gQU1lZGlhRm9ybWF0X25ldygpOwogCiAgICAgICAgIHN0YXR1c190IGVyciA9IE9LOworICAgICAgICBpbnQzMl90IG5hbFNpemUgPSAtMTsKIAogICAgICAgICBzd2l0Y2ggKHRyYWNrLT5HZXRUeXBlKCkpIHsKICAgICAgICAgICAgIGNhc2UgVklERU9fVFJBQ0s6CkBAIC0xNDA4LDIwICsxNDExLDI4IEBACiAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGNvbnN0IG1rdnBhcnNlcjo6VmlkZW9UcmFjayAqPih0cmFjayk7CiAKICAgICAgICAgICAgICAgICBpZiAoIXN0cmNtcCgiVl9NUEVHNC9JU08vQVZDIiwgY29kZWNJRCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbWV0YS5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKTsKLSAgICAgICAgICAgICAgICAgICAgbWV0YS5zZXREYXRhKGtLZXlBVkNDLCAwLCBjb2RlY1ByaXZhdGUsIGNvZGVjUHJpdmF0ZVNpemUpOworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKTsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9DU0RfQVZDLCBjb2RlY1ByaXZhdGUsIGNvZGVjUHJpdmF0ZVNpemUpOworICAgICAgICAgICAgICAgICAgICBpZiAoY29kZWNQcml2YXRlU2l6ZSA+IDQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hbFNpemUgPSAxICsgKGNvZGVjUHJpdmF0ZVs0XSAmIDMpOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKCJWX01QRUdIL0lTTy9IRVZDIiwgY29kZWNJRCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbWV0YS5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfVklERU9fSEVWQyk7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGVjUHJpdmF0ZVNpemUgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZXRhLnNldERhdGEoa0tleUhWQ0MsIGtUeXBlSFZDQywgY29kZWNQcml2YXRlLCBjb2RlY1ByaXZhdGVTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NTRF9IRVZDLCBjb2RlY1ByaXZhdGUsIGNvZGVjUHJpdmF0ZVNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGVjUHJpdmF0ZVNpemUgPiAxNCArIDcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYWxTaXplID0gMSArIChjb2RlY1ByaXZhdGVbMTQgKyA3XSAmIDMpOworICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coIkhFVkMgaXMgZGV0ZWN0ZWQsIGJ1dCBkb2VzIG5vdCBoYXZlIGNvbmZpZ3VyYXRpb24uIik7CiAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcCgiVl9NUEVHNC9JU08vQVNQIiwgY29kZWNJRCkpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGVjUHJpdmF0ZVNpemUgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZXRhLnNldENTdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQpOworICAgICAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0KTsKICAgICAgICAgICAgICAgICAgICAgICAgIGFkZEVTRFNGcm9tQ29kZWNQcml2YXRlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhLCBmYWxzZSwgY29kZWNQcml2YXRlLCBjb2RlY1ByaXZhdGVTaXplKTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTE0MzAsMTUgKzE0NDEsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKCJWX1ZQOCIsIGNvZGVjSUQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX1ZQOCk7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9WSURFT19WUDgpOwogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcCgiVl9WUDkiLCBjb2RlY0lEKSkgewotICAgICAgICAgICAgICAgICAgICBtZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19WUDkpOworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfVklERU9fVlA5KTsKICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGVjUHJpdmF0ZVNpemUgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgLy8gJ2NzZC0wJyBmb3IgVlA5IGlzIHRoZSBCbG9iIG9mIENvZGVjIFByaXZhdGUgZGF0YSBhcwogICAgICAgICAgICAgICAgICAgICAgIC8vIHNwZWNpZmllZCBpbiBodHRwOi8vd3d3LndlYm1wcm9qZWN0Lm9yZy92cDkvcHJvZmlsZXMvLgotICAgICAgICAgICAgICAgICAgICAgICAgbWV0YS5zZXREYXRhKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0tleVZwOUNvZGVjUHJpdmF0ZSwgMCwgY29kZWNQcml2YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNQcml2YXRlU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NTRF8wLCBjb2RlY1ByaXZhdGUsIGNvZGVjUHJpdmF0ZVNpemUpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR1coIiVzIGlzIG5vdCBzdXBwb3J0ZWQuIiwgY29kZWNJRCk7CkBAIC0xNDU1LDggKzE0NjUsOCBAQAogICAgICAgICAgICAgICAgICAgICBBTE9HVygidHJhY2sgaGVpZ2h0IGV4Y2VlZHMgaW50MzJfdCwgJWxsZCIsIGhlaWdodCk7CiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtZXRhLnNldEludDMyKGtLZXlXaWR0aCwgKGludDMyX3Qpd2lkdGgpOwotICAgICAgICAgICAgICAgIG1ldGEuc2V0SW50MzIoa0tleUhlaWdodCwgKGludDMyX3QpaGVpZ2h0KTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9XSURUSCwgKGludDMyX3Qpd2lkdGgpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0hFSUdIVCwgKGludDMyX3QpaGVpZ2h0KTsKIAogICAgICAgICAgICAgICAgIC8vIHNldHRpbmcgZGlzcGxheSB3aWR0aC9oZWlnaHQgaXMgb3B0aW9uYWwKICAgICAgICAgICAgICAgICBjb25zdCBsb25nIGxvbmcgZGlzcGxheVVuaXQgPSB2dHJhY2stPkdldERpc3BsYXlVbml0KCk7CkBAIC0xNDY2LDggKzE0NzYsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICYmIGRpc3BsYXlIZWlnaHQgPiAwICYmIGRpc3BsYXlIZWlnaHQgPD0gSU5UMzJfTUFYKSB7CiAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZGlzcGxheVVuaXQpIHsKICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiAvLyBwaXhlbHMKLSAgICAgICAgICAgICAgICAgICAgICAgIG1ldGEuc2V0SW50MzIoa0tleURpc3BsYXlXaWR0aCwgKGludDMyX3QpZGlzcGxheVdpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1ldGEuc2V0SW50MzIoa0tleURpc3BsYXlIZWlnaHQsIChpbnQzMl90KWRpc3BsYXlIZWlnaHQpOworICAgICAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfRElTUExBWV9XSURUSCwgKGludDMyX3QpZGlzcGxheVdpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0RJU1BMQVlfSEVJR0hULCAoaW50MzJfdClkaXNwbGF5SGVpZ2h0KTsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICBjYXNlIDE6IC8vIGNlbnRpbWV0ZXJzCiAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjogLy8gaW5jaGVzCkBAIC0xNDgxLDggKzE0OTMsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvbmcgbG9uZyBjb21wdXRlZEhlaWdodCA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWF4KGhlaWdodCwgd2lkdGggKiBkaXNwbGF5SGVpZ2h0IC8gZGlzcGxheVdpZHRoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb21wdXRlZFdpZHRoIDw9IElOVDMyX01BWCAmJiBjb21wdXRlZEhlaWdodCA8PSBJTlQzMl9NQVgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhLnNldEludDMyKGtLZXlEaXNwbGF5V2lkdGgsIChpbnQzMl90KWNvbXB1dGVkV2lkdGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGEuc2V0SW50MzIoa0tleURpc3BsYXlIZWlnaHQsIChpbnQzMl90KWNvbXB1dGVkSGVpZ2h0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfRElTUExBWV9XSURUSCwgKGludDMyX3QpY29tcHV0ZWRXaWR0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0RJU1BMQVlfSEVJR0hULCAoaW50MzJfdCljb21wdXRlZEhlaWdodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgfQpAQCAtMTUwMiwzNCArMTUxNiwzOSBAQAogICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxjb25zdCBta3ZwYXJzZXI6OkF1ZGlvVHJhY2sgKj4odHJhY2spOwogCiAgICAgICAgICAgICAgICAgaWYgKCFzdHJjbXAoIkFfQUFDIiwgY29kZWNJRCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbWV0YS5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDKTsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtZXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX0FVRElPX0FBQyk7CiAgICAgICAgICAgICAgICAgICAgIENIRUNLKGNvZGVjUHJpdmF0ZVNpemUgPj0gMik7CiAKICAgICAgICAgICAgICAgICAgICAgYWRkRVNEU0Zyb21Db2RlY1ByaXZhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YSwgdHJ1ZSwgY29kZWNQcml2YXRlLCBjb2RlY1ByaXZhdGVTaXplKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoIkFfVk9SQklTIiwgY29kZWNJRCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbWV0YS5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fVk9SQklTKTsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtZXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX0FVRElPX1ZPUkJJUyk7CiAKICAgICAgICAgICAgICAgICAgICAgZXJyID0gYWRkVm9yYmlzQ29kZWNJbmZvKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGEsIGNvZGVjUHJpdmF0ZSwgY29kZWNQcml2YXRlU2l6ZSk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKCJBX09QVVMiLCBjb2RlY0lEKSkgewotICAgICAgICAgICAgICAgICAgICBtZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19PUFVTKTsKLSAgICAgICAgICAgICAgICAgICAgbWV0YS5zZXREYXRhKGtLZXlPcHVzSGVhZGVyLCAwLCBjb2RlY1ByaXZhdGUsIGNvZGVjUHJpdmF0ZVNpemUpOwotICAgICAgICAgICAgICAgICAgICBtZXRhLnNldEludDY0KGtLZXlPcHVzQ29kZWNEZWxheSwgdHJhY2stPkdldENvZGVjRGVsYXkoKSk7Ci0gICAgICAgICAgICAgICAgICAgIG1ldGEuc2V0SW50NjQoa0tleU9wdXNTZWVrUHJlUm9sbCwgdHJhY2stPkdldFNlZWtQcmVSb2xsKCkpOworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9BVURJT19PUFVTKTsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzAsIGNvZGVjUHJpdmF0ZSwgY29kZWNQcml2YXRlU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIGludDY0X3QgY29kZWNEZWxheSA9IHRyYWNrLT5HZXRDb2RlY0RlbGF5KCk7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NTRF8xLCAmY29kZWNEZWxheSwgc2l6ZW9mKGNvZGVjRGVsYXkpKTsKICAgICAgICAgICAgICAgICAgICAgbVNlZWtQcmVSb2xsTnMgPSB0cmFjay0+R2V0U2Vla1ByZVJvbGwoKTsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzIsICZtU2Vla1ByZVJvbGxOcywgc2l6ZW9mKG1TZWVrUHJlUm9sbE5zKSk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKCJBX01QRUcvTDMiLCBjb2RlY0lEKSkgewotICAgICAgICAgICAgICAgICAgICBtZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHKTsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtZXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX0FVRElPX01QRUcpOwogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcCgiQV9GTEFDIiwgY29kZWNJRCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbWV0YS5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fRkxBQyk7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9BVURJT19GTEFDKTsKICAgICAgICAgICAgICAgICAgICAgZXJyID0gYWRkRmxhY01ldGFkYXRhKG1ldGEsIGNvZGVjUHJpdmF0ZSwgY29kZWNQcml2YXRlU2l6ZSk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR1coIiVzIGlzIG5vdCBzdXBwb3J0ZWQuIiwgY29kZWNJRCk7CiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIG1ldGEuc2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIGF0cmFjay0+R2V0U2FtcGxpbmdSYXRlKCkpOwotICAgICAgICAgICAgICAgIG1ldGEuc2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgYXRyYWNrLT5HZXRDaGFubmVscygpKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9TQU1QTEVfUkFURSwgYXRyYWNrLT5HZXRTYW1wbGluZ1JhdGUoKSk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9DT1VOVCwgYXRyYWNrLT5HZXRDaGFubmVscygpKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIApAQCAtMTU0Miw3ICsxNTYxLDcgQEAKICAgICAgICAgICAgY2hhciBsYW5nWzRdOwogICAgICAgICAgICBzdHJuY3B5KGxhbmcsIGxhbmd1YWdlLCAzKTsKICAgICAgICAgICAgbGFuZ1szXSA9ICdcMCc7Ci0gICAgICAgICAgIG1ldGEuc2V0Q1N0cmluZyhrS2V5TWVkaWFMYW5ndWFnZSwgbGFuZyk7CisgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobWV0YSwgQU1FRElBRk9STUFUX0tFWV9MQU5HVUFHRSwgbGFuZyk7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoZXJyICE9IE9LKSB7CkBAIC0xNTUxLDEyICsxNTcwLDEzIEBACiAgICAgICAgIH0KIAogICAgICAgICBsb25nIGxvbmcgZHVyYXRpb25OcyA9IG1TZWdtZW50LT5HZXREdXJhdGlvbigpOwotICAgICAgICBtZXRhLnNldEludDY0KGtLZXlEdXJhdGlvbiwgKGR1cmF0aW9uTnMgKyA1MDApIC8gMTAwMCk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NChtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0RVUkFUSU9OLCAoZHVyYXRpb25OcyArIDUwMCkgLyAxMDAwKTsKIAogICAgICAgICBtVHJhY2tzLnB1c2goKTsKICAgICAgICAgc2l6ZV90IG4gPSBtVHJhY2tzLnNpemUoKSAtIDE7CiAgICAgICAgIFRyYWNrSW5mbyAqdHJhY2tJbmZvID0gJm1UcmFja3MuZWRpdEl0ZW1BdChuKTsKICAgICAgICAgaW5pdFRyYWNrSW5mbyh0cmFjaywgbWV0YSwgdHJhY2tJbmZvKTsKKyAgICAgICAgdHJhY2tJbmZvLT5tTmFsTGVuZ3RoU2l6ZSA9IG5hbFNpemU7CiAKICAgICAgICAgaWYgKCFzdHJjbXAoIlZfTVBFRzQvSVNPL0FWQyIsIGNvZGVjSUQpICYmIGNvZGVjUHJpdmF0ZVNpemUgPT0gMCkgewogICAgICAgICAgICAgLy8gQXR0ZW1wdCB0byByZWNvdmVyIGZyb20gQVZDIHRyYWNrIHdpdGhvdXQgY29kZWMgcHJpdmF0ZSBkYXRhCkBAIC0xNTczLDcgKzE1OTMsNyBAQAogICAgICAgICBUcmFja0luZm8gKmluZm8gPSAmbVRyYWNrcy5lZGl0SXRlbUF0KGkpOwogCiAgICAgICAgIGNvbnN0IGNoYXIgKm1pbWU7Ci0gICAgICAgIENIRUNLKGluZm8tPm1NZXRhLmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKTsKKyAgICAgICAgQ0hFQ0soQU1lZGlhRm9ybWF0X2dldFN0cmluZyhpbmZvLT5tTWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCAmbWltZSkpOwogCiAgICAgICAgIGlmIChzdHJuY2FzZWNtcChtaW1lLCAidmlkZW8vIiwgNikpIHsKICAgICAgICAgICAgIGNvbnRpbnVlOwpAQCAtMTU5OSwxNiArMTYxOSwxNiBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgaXRlci5hZHZhbmNlKCk7CiAgICAgICAgIH0KLSAgICAgICAgaW5mby0+bU1ldGEuc2V0SW50NjQoa0tleVRodW1ibmFpbFRpbWUsIHRodW1ibmFpbFRpbWVVcyk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NChpbmZvLT5tTWV0YSwKKyAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX1RIVU1CTkFJTF9USU1FLCB0aHVtYm5haWxUaW1lVXMpOwogICAgIH0KIH0KIAotc3RhdHVzX3QgTWF0cm9za2FFeHRyYWN0b3I6OmdldE1ldGFEYXRhKE1ldGFEYXRhQmFzZSAmbWV0YSkgewotICAgIG1ldGEuc2V0Q1N0cmluZygKLSAgICAgICAgICAgIGtLZXlNSU1FVHlwZSwKLSAgICAgICAgICAgIG1Jc1dlYm0gPyAidmlkZW8vd2VibSIgOiBNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfTUFUUk9TS0EpOworbWVkaWFfc3RhdHVzX3QgTWF0cm9za2FFeHRyYWN0b3I6OmdldE1ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSkgeworICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobWV0YSwKKyAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgbUlzV2VibSA/ICJ2aWRlby93ZWJtIiA6IE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9NQVRST1NLQSk7CiAKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAogdWludDMyX3QgTWF0cm9za2FFeHRyYWN0b3I6OmZsYWdzKCkgY29uc3QgewpAQCAtMTYyMSw3ICsxNjQxLDcgQEAKIH0KIAogYm9vbCBTbmlmZk1hdHJvc2thKAotICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSkgeworICAgICAgICBEYXRhU291cmNlSGVscGVyICpzb3VyY2UsIGZsb2F0ICpjb25maWRlbmNlKSB7CiAgICAgRGF0YVNvdXJjZUJhc2VSZWFkZXIgcmVhZGVyKHNvdXJjZSk7CiAgICAgbWt2cGFyc2VyOjpFQk1MSGVhZGVyIGVibWxIZWFkZXI7CiAgICAgbG9uZyBsb25nIHBvczsKQEAgLTE2MzgsMjQgKzE2NTgsMjcgQEAKIGV4dGVybiAiQyIgewogLy8gVGhpcyBpcyB0aGUgb25seSBzeW1ib2wgdGhhdCBuZWVkcyB0byBiZSBleHBvcnRlZAogX19hdHRyaWJ1dGVfXyAoKHZpc2liaWxpdHkgKCJkZWZhdWx0IikpKQotTWVkaWFFeHRyYWN0b3I6OkV4dHJhY3RvckRlZiBHRVRFWFRSQUNUT1JERUYoKSB7CitFeHRyYWN0b3JEZWYgR0VURVhUUkFDVE9SREVGKCkgewogICAgIHJldHVybiB7Ci0gICAgICAgIE1lZGlhRXh0cmFjdG9yOjpFWFRSQUNUT1JERUZfVkVSU0lPTiwKKyAgICAgICAgRVhUUkFDVE9SREVGX1ZFUlNJT05fQ1VSUkVOVCwKICAgICAgICAgVVVJRCgiYWJiZWRkOTItMzhjNC00OTA0LWE0YzEtYjNmNDVmODk5OTgwIiksCiAgICAgICAgIDEsCiAgICAgICAgICJNYXRyb3NrYSBFeHRyYWN0b3IiLAotICAgICAgICBbXSgKLSAgICAgICAgICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLAotICAgICAgICAgICAgICAgIGZsb2F0ICpjb25maWRlbmNlLAotICAgICAgICAgICAgICAgIHZvaWQgKiosCi0gICAgICAgICAgICAgICAgTWVkaWFFeHRyYWN0b3I6OkZyZWVNZXRhRnVuYyAqKSAtPiBNZWRpYUV4dHJhY3Rvcjo6Q3JlYXRvckZ1bmMgewotICAgICAgICAgICAgaWYgKFNuaWZmTWF0cm9za2Eoc291cmNlLCBjb25maWRlbmNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBbXSgKLSAgICAgICAgICAgICAgICAgICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICB2b2lkICopIC0+IE1lZGlhRXh0cmFjdG9yKiB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTWF0cm9za2FFeHRyYWN0b3Ioc291cmNlKTt9OworICAgICAgICB7CisgICAgICAgICAgICAudjIgPSBbXSgKKyAgICAgICAgICAgICAgICAgICAgQ0RhdGFTb3VyY2UgKnNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgKmNvbmZpZGVuY2UsCisgICAgICAgICAgICAgICAgICAgIHZvaWQgKiosCisgICAgICAgICAgICAgICAgICAgIEZyZWVNZXRhRnVuYyAqKSAtPiBDcmVhdG9yRnVuY1YyIHsKKyAgICAgICAgICAgICAgICBEYXRhU291cmNlSGVscGVyIGhlbHBlcihzb3VyY2UpOworICAgICAgICAgICAgICAgIGlmIChTbmlmZk1hdHJvc2thKCZoZWxwZXIsIGNvbmZpZGVuY2UpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBbXSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRGF0YVNvdXJjZSAqc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKikgLT4gQ01lZGlhRXh0cmFjdG9yVjIqIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB3cmFwVjIobmV3IE1hdHJvc2thRXh0cmFjdG9yKG5ldyBEYXRhU291cmNlSGVscGVyKHNvdXJjZSkpKTt9OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9CiAgICAgfTsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbWt2L01hdHJvc2thRXh0cmFjdG9yLmggYi9tZWRpYS9leHRyYWN0b3JzL21rdi9NYXRyb3NrYUV4dHJhY3Rvci5oCmluZGV4IDM1NjhlYTEuLjJmYTg4ODEgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvbWt2L01hdHJvc2thRXh0cmFjdG9yLmgKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9ta3YvTWF0cm9za2FFeHRyYWN0b3IuaApAQCAtMjAsOCArMjAsOSBAQAogCiAjaW5jbHVkZSAibWt2cGFyc2VyL21rdnBhcnNlci5oIgogCi0jaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3IuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YUJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkFwaS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFGb3JtYXQuaD4KICNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KICNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CiAKQEAgLTM0LDE2ICszNSwxNiBAQAogc3RydWN0IERhdGFTb3VyY2VCYXNlUmVhZGVyOwogc3RydWN0IE1hdHJvc2thU291cmNlOwogCi1zdHJ1Y3QgTWF0cm9za2FFeHRyYWN0b3IgOiBwdWJsaWMgTWVkaWFFeHRyYWN0b3IgewotICAgIGV4cGxpY2l0IE1hdHJvc2thRXh0cmFjdG9yKERhdGFTb3VyY2VCYXNlICpzb3VyY2UpOworc3RydWN0IE1hdHJvc2thRXh0cmFjdG9yIDogcHVibGljIE1lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyVjIgeworICAgIGV4cGxpY2l0IE1hdHJvc2thRXh0cmFjdG9yKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSk7CiAKICAgICB2aXJ0dWFsIHNpemVfdCBjb3VudFRyYWNrcygpOwogCi0gICAgdmlydHVhbCBNZWRpYVRyYWNrICpnZXRUcmFjayhzaXplX3QgaW5kZXgpOworICAgIHZpcnR1YWwgTWVkaWFUcmFja0hlbHBlclYyICpnZXRUcmFjayhzaXplX3QgaW5kZXgpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRUcmFja01ldGFEYXRhKE1ldGFEYXRhQmFzZSYgbWV0YSwgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncyk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRUcmFja01ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSwgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncyk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1ldGFEYXRhKE1ldGFEYXRhQmFzZSYgbWV0YSk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRNZXRhRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEpOwogCiAgICAgdmlydHVhbCB1aW50MzJfdCBmbGFncygpIGNvbnN0OwogCkBAIC01Nyw5ICs1OCwxNyBAQAogICAgIGZyaWVuZCBzdHJ1Y3QgQmxvY2tJdGVyYXRvcjsKIAogICAgIHN0cnVjdCBUcmFja0luZm8geworICAgICAgICBUcmFja0luZm8oKSB7CisgICAgICAgICAgICBtTWV0YSA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgflRyYWNrSW5mbygpIHsKKyAgICAgICAgICAgIGlmIChtTWV0YSkgeworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9kZWxldGUobU1ldGEpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgICAgIHVuc2lnbmVkIGxvbmcgbVRyYWNrTnVtOwogICAgICAgICBib29sIG1FbmNyeXB0ZWQ7Ci0gICAgICAgIE1ldGFEYXRhQmFzZSBtTWV0YTsKKyAgICAgICAgQU1lZGlhRm9ybWF0ICptTWV0YTsKICAgICAgICAgY29uc3QgTWF0cm9za2FFeHRyYWN0b3IgKm1FeHRyYWN0b3I7CiAgICAgICAgIFZlY3Rvcjxjb25zdCBta3ZwYXJzZXI6OkN1ZVBvaW50Kj4gbUN1ZVBvaW50czsKIApAQCAtNjgsNiArNzcsNyBAQAogICAgICAgICAvLyBpbiB+TWF0cm9za2FFeHRyYWN0b3IuCiAgICAgICAgIHVuc2lnbmVkIGNoYXIgKm1IZWFkZXI7CiAgICAgICAgIHNpemVfdCBtSGVhZGVyTGVuOworICAgICAgICBpbnQzMl90IG1OYWxMZW5ndGhTaXplOwogCiAgICAgICAgIGNvbnN0IG1rdnBhcnNlcjo6VHJhY2sqIGdldFRyYWNrKCkgY29uc3Q7CiAgICAgICAgIGNvbnN0IG1rdnBhcnNlcjo6Q3VlUG9pbnQ6OlRyYWNrUG9zaXRpb24gKmZpbmQobG9uZyBsb25nIHRpbWVOcykgY29uc3Q7CkBAIC03Niw3ICs4Niw3IEBACiAgICAgTXV0ZXggbUxvY2s7CiAgICAgVmVjdG9yPFRyYWNrSW5mbz4gbVRyYWNrczsKIAotICAgIERhdGFTb3VyY2VCYXNlICptRGF0YVNvdXJjZTsKKyAgICBEYXRhU291cmNlSGVscGVyICptRGF0YVNvdXJjZTsKICAgICBEYXRhU291cmNlQmFzZVJlYWRlciAqbVJlYWRlcjsKICAgICBta3ZwYXJzZXI6OlNlZ21lbnQgKm1TZWdtZW50OwogICAgIGJvb2wgbUV4dHJhY3RlZFRodW1ibmFpbHM7CkBAIC04NywxMyArOTcsMTMgQEAKICAgICBzdGF0dXNfdCBzeW50aGVzaXplQVZDQyhUcmFja0luZm8gKnRyYWNrSW5mbywgc2l6ZV90IGluZGV4KTsKICAgICBzdGF0dXNfdCBpbml0VHJhY2tJbmZvKAogICAgICAgICAgICAgY29uc3QgbWt2cGFyc2VyOjpUcmFjayAqdHJhY2ssCi0gICAgICAgICAgICBNZXRhRGF0YUJhc2UgJm1ldGEsCisgICAgICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGEsCiAgICAgICAgICAgICBUcmFja0luZm8gKnRyYWNrSW5mbyk7CiAgICAgdm9pZCBhZGRUcmFja3MoKTsKICAgICB2b2lkIGZpbmRUaHVtYm5haWxzKCk7CiAgICAgdm9pZCBnZXRDb2xvckluZm9ybWF0aW9uKAogICAgICAgICAgICAgY29uc3QgbWt2cGFyc2VyOjpWaWRlb1RyYWNrICp2dHJhY2ssCi0gICAgICAgICAgICBNZXRhRGF0YUJhc2UgJm1ldGEpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhKTsKICAgICBib29sIGlzTGl2ZVN0cmVhbWluZygpIGNvbnN0OwogCiAgICAgTWF0cm9za2FFeHRyYWN0b3IoY29uc3QgTWF0cm9za2FFeHRyYWN0b3IgJik7CmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wMy9BbmRyb2lkLmJwIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDMvQW5kcm9pZC5icAppbmRleCBhM2FlYWNhLi4xMDI1YzQ2IDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21wMy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbXAzL0FuZHJvaWQuYnAKQEAgLTEzLDYgKzEzLDcgQEAKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGlibG9nIiwKICAgICAgICAgImxpYm1lZGlhZXh0cmFjdG9yIiwKKyAgICAgICAgImxpYm1lZGlhbmRrIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAogICAgIF0sCiAKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXAzL01QM0V4dHJhY3Rvci5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL21wMy9NUDNFeHRyYWN0b3IuY3BwCmluZGV4IDMzY2ZmOTYuLjBlMWZmYjQgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvbXAzL01QM0V4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDMvTVAzRXh0cmFjdG9yLmNwcApAQCAtMjQsOCArMjQsNiBAQAogI2luY2x1ZGUgIlZCUklTZWVrZXIuaCIKICNpbmNsdWRlICJYSU5HU2Vla2VyLmgiCiAKLSNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlQmFzZS5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhVHJhY2suaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2F2Y191dGlscy5oPgpAQCAtNDYsNyArNDQsNyBAQAogc3RhdGljIGNvbnN0IHVpbnQzMl90IGtNYXNrID0gMHhmZmZlMGMwMDsKIAogc3RhdGljIGJvb2wgUmVzeW5jKAotICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLCB1aW50MzJfdCBtYXRjaF9oZWFkZXIsCisgICAgICAgIERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwgdWludDMyX3QgbWF0Y2hfaGVhZGVyLAogICAgICAgICBvZmY2NF90ICppbm91dF9wb3MsIG9mZjY0X3QgKnBvc3RfaWQzX3BvcywgdWludDMyX3QgKm91dF9oZWFkZXIpIHsKICAgICBpZiAocG9zdF9pZDNfcG9zICE9IE5VTEwpIHsKICAgICAgICAgKnBvc3RfaWQzX3BvcyA9IDA7CkBAIC0yMDksMTkgKzIwNywxOSBAQAogICAgIHJldHVybiB2YWxpZDsKIH0KIAotY2xhc3MgTVAzU291cmNlIDogcHVibGljIE1lZGlhVHJhY2sgeworY2xhc3MgTVAzU291cmNlIDogcHVibGljIE1lZGlhVHJhY2tIZWxwZXJWMiB7CiBwdWJsaWM6CiAgICAgTVAzU291cmNlKAotICAgICAgICAgICAgTWV0YURhdGFCYXNlICZtZXRhLCBEYXRhU291cmNlQmFzZSAqc291cmNlLAorICAgICAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhLCBEYXRhU291cmNlSGVscGVyICpzb3VyY2UsCiAgICAgICAgICAgICBvZmY2NF90IGZpcnN0X2ZyYW1lX3BvcywgdWludDMyX3QgZml4ZWRfaGVhZGVyLAogICAgICAgICAgICAgTVAzU2Vla2VyICpzZWVrZXIpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChNZXRhRGF0YUJhc2UgKnBhcmFtcyA9IE5VTEwpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3Qgc3RhcnQoKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHN0b3AoKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Rm9ybWF0KE1ldGFEYXRhQmFzZSAmbWV0YSk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRGb3JtYXQoQU1lZGlhRm9ybWF0ICptZXRhKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCgKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHJlYWQoCiAgICAgICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CiAKIHByb3RlY3RlZDoKQEAgLTIyOSw4ICsyMjcsOCBAQAogCiBwcml2YXRlOgogICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga01heEZyYW1lU2l6ZTsKLSAgICBNZXRhRGF0YUJhc2UgJm1NZXRhOwotICAgIERhdGFTb3VyY2VCYXNlICptRGF0YVNvdXJjZTsKKyAgICBBTWVkaWFGb3JtYXQgKm1NZXRhOworICAgIERhdGFTb3VyY2VIZWxwZXIgKm1EYXRhU291cmNlOwogICAgIG9mZjY0X3QgbUZpcnN0RnJhbWVQb3M7CiAgICAgdWludDMyX3QgbUZpeGVkSGVhZGVyOwogICAgIG9mZjY0X3QgbUN1cnJlbnRQb3M7CkBAIC0yNTMsNyArMjUxLDcgQEAKIH07CiAKIE1QM0V4dHJhY3Rvcjo6TVAzRXh0cmFjdG9yKAotICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLCBNcDNNZXRhICptZXRhKQorICAgICAgICBEYXRhU291cmNlSGVscGVyICpzb3VyY2UsIE1wM01ldGEgKm1ldGEpCiAgICAgOiBtSW5pdENoZWNrKE5PX0lOSVQpLAogICAgICAgbURhdGFTb3VyY2Uoc291cmNlKSwKICAgICAgIG1GaXJzdEZyYW1lUG9zKC0xKSwKQEAgLTI4NSw2ICsyODMsNyBAQAogICAgIG1GaXhlZEhlYWRlciA9IGhlYWRlcjsKICAgICBYSU5HU2Vla2VyICpzZWVrZXIgPSBYSU5HU2Vla2VyOjpDcmVhdGVGcm9tU291cmNlKG1EYXRhU291cmNlLCBtRmlyc3RGcmFtZVBvcyk7CiAKKyAgICBtTWV0YSA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKICAgICBpZiAoc2Vla2VyID09IE5VTEwpIHsKICAgICAgICAgbVNlZWtlciA9IFZCUklTZWVrZXI6OkNyZWF0ZUZyb21Tb3VyY2UobURhdGFTb3VyY2UsIHBvc3RfaWQzX3Bvcyk7CiAgICAgfSBlbHNlIHsKQEAgLTI5Miw4ICsyOTEsOCBAQAogICAgICAgICBpbnQgZW5jZCA9IHNlZWtlci0+Z2V0RW5jb2RlckRlbGF5KCk7CiAgICAgICAgIGludCBlbmNwID0gc2Vla2VyLT5nZXRFbmNvZGVyUGFkZGluZygpOwogICAgICAgICBpZiAoZW5jZCAhPSAwIHx8IGVuY3AgIT0gMCkgewotICAgICAgICAgICAgbU1ldGEuc2V0SW50MzIoa0tleUVuY29kZXJEZWxheSwgZW5jZCk7Ci0gICAgICAgICAgICBtTWV0YS5zZXRJbnQzMihrS2V5RW5jb2RlclBhZGRpbmcsIGVuY3ApOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1NZXRhLCBBTUVESUFGT1JNQVRfS0VZX0VOQ09ERVJfREVMQVksIGVuY2QpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1NZXRhLCBBTUVESUFGT1JNQVRfS0VZX0VOQ09ERVJfUEFERElORywgZW5jcCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTMyOSwyMSArMzI4LDIzIEBACiAKICAgICBzd2l0Y2ggKGxheWVyKSB7CiAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgIG1NZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHX0xBWUVSX0kpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtTWV0YSwKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHX0xBWUVSX0kpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgIG1NZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHX0xBWUVSX0lJKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobU1ldGEsCisgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFR19MQVlFUl9JSSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgbU1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX01QRUcpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtTWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgVFJFU1BBU1MoKTsKICAgICB9CiAKLSAgICBtTWV0YS5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgc2FtcGxlX3JhdGUpOwotICAgIG1NZXRhLnNldEludDMyKGtLZXlCaXRSYXRlLCBiaXRyYXRlICogMTAwMCk7Ci0gICAgbU1ldGEuc2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgbnVtX2NoYW5uZWxzKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1JBVEUsIHNhbXBsZV9yYXRlKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQklUX1JBVEUsIGJpdHJhdGUgKiAxMDAwKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9DT1VOVCwgbnVtX2NoYW5uZWxzKTsKIAogICAgIGludDY0X3QgZHVyYXRpb25VczsKIApAQCAtMzYzLDcgKzM2NCw3IEBACiAgICAgfQogCiAgICAgaWYgKGR1cmF0aW9uVXMgPj0gMCkgewotICAgICAgICBtTWV0YS5zZXRJbnQ2NChrS2V5RHVyYXRpb24sIGR1cmF0aW9uVXMpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04sIGR1cmF0aW9uVXMpOwogICAgIH0KIAogICAgIG1Jbml0Q2hlY2sgPSBPSzsKQEAgLTM3MSw3ICszNzIsOCBAQAogICAgIC8vIEdldCBpVHVuZXMtc3R5bGUgZ2FwbGVzcyBpbmZvIGlmIHByZXNlbnQuCiAgICAgLy8gV2hlbiBnZXR0aW5nIHRoZSBpZDMgdGFnLCBza2lwIHRoZSBWMSB0YWdzIHRvIHByZXZlbnQgdGhlIHNvdXJjZSBjYWNoZQogICAgIC8vIGZyb20gYmVpbmcgaXRlcmF0ZWQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZS4KLSAgICBJRDMgaWQzKG1EYXRhU291cmNlLCB0cnVlKTsKKyAgICBEYXRhU291cmNlSGVscGVyIGhlbHBlcihtRGF0YVNvdXJjZSk7CisgICAgSUQzIGlkMygmaGVscGVyLCB0cnVlKTsKICAgICBpZiAoaWQzLmlzVmFsaWQoKSkgewogICAgICAgICBJRDM6Okl0ZXJhdG9yICpjb20gPSBuZXcgSUQzOjpJdGVyYXRvcihpZDMsICJDT00iKTsKICAgICAgICAgaWYgKGNvbS0+ZG9uZSgpKSB7CkBAIC0zOTAsOCArMzkyLDggQEAKIAogICAgICAgICAgICAgICAgIGludDMyX3QgZGVsYXksIHBhZGRpbmc7CiAgICAgICAgICAgICAgICAgaWYgKHNzY2FuZih2YWx1ZSwgIiAlKnggJXggJXggJSp4IiwgJmRlbGF5LCAmcGFkZGluZykgPT0gMikgewotICAgICAgICAgICAgICAgICAgICBtTWV0YS5zZXRJbnQzMihrS2V5RW5jb2RlckRlbGF5LCBkZWxheSk7Ci0gICAgICAgICAgICAgICAgICAgIG1NZXRhLnNldEludDMyKGtLZXlFbmNvZGVyUGFkZGluZywgcGFkZGluZyk7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTWV0YSwgQU1FRElBRk9STUFUX0tFWV9FTkNPREVSX0RFTEFZLCBkZWxheSk7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTWV0YSwgQU1FRElBRk9STUFUX0tFWV9FTkNPREVSX1BBRERJTkcsIHBhZGRpbmcpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KQEAgLTQwNCwxMyArNDA2LDE1IEBACiAKIE1QM0V4dHJhY3Rvcjo6fk1QM0V4dHJhY3RvcigpIHsKICAgICBkZWxldGUgbVNlZWtlcjsKKyAgICBkZWxldGUgbURhdGFTb3VyY2U7CisgICAgQU1lZGlhRm9ybWF0X2RlbGV0ZShtTWV0YSk7CiB9CiAKIHNpemVfdCBNUDNFeHRyYWN0b3I6OmNvdW50VHJhY2tzKCkgewogICAgIHJldHVybiBtSW5pdENoZWNrICE9IE9LID8gMCA6IDE7CiB9CiAKLU1lZGlhVHJhY2sgKk1QM0V4dHJhY3Rvcjo6Z2V0VHJhY2soc2l6ZV90IGluZGV4KSB7CitNZWRpYVRyYWNrSGVscGVyVjIgKk1QM0V4dHJhY3Rvcjo6Z2V0VHJhY2soc2l6ZV90IGluZGV4KSB7CiAgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0sgfHwgaW5kZXggIT0gMCkgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CkBAIC00MjAsMTQgKzQyNCwxNCBAQAogICAgICAgICAgICAgbVNlZWtlcik7CiB9CiAKLXN0YXR1c190IE1QM0V4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YSgKLSAgICAgICAgTWV0YURhdGFCYXNlICZtZXRhLAorbWVkaWFfc3RhdHVzX3QgTVAzRXh0cmFjdG9yOjpnZXRUcmFja01ldGFEYXRhKAorICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGEsCiAgICAgICAgIHNpemVfdCBpbmRleCwgdWludDMyX3QgLyogZmxhZ3MgKi8pIHsKICAgICBpZiAobUluaXRDaGVjayAhPSBPSyB8fCBpbmRleCAhPSAwKSB7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgfQotICAgIG1ldGEgPSBtTWV0YTsKLSAgICByZXR1cm4gT0s7CisgICAgQU1lZGlhRm9ybWF0X2NvcHkobWV0YSwgbU1ldGEpOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCkBAIC00NDAsNyArNDQ0LDcgQEAKIC8vIFNldCBvdXIgbWF4IGZyYW1lIHNpemUgdG8gdGhlIG5lYXJlc3QgcG93ZXIgb2YgMiBhYm92ZSB0aGlzIHNpemUgKGFrYSwgNGtCKQogY29uc3Qgc2l6ZV90IE1QM1NvdXJjZTo6a01heEZyYW1lU2l6ZSA9ICgxIDw8IDEyKTsgLyogNDA5NiBieXRlcyAqLwogTVAzU291cmNlOjpNUDNTb3VyY2UoCi0gICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSwgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwKKyAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhLCBEYXRhU291cmNlSGVscGVyICpzb3VyY2UsCiAgICAgICAgIG9mZjY0X3QgZmlyc3RfZnJhbWVfcG9zLCB1aW50MzJfdCBmaXhlZF9oZWFkZXIsCiAgICAgICAgIE1QM1NlZWtlciAqc2Vla2VyKQogICAgIDogbU1ldGEobWV0YSksCkBAIC00NjIsNyArNDY2LDcgQEAKICAgICB9CiB9CiAKLXN0YXR1c190IE1QM1NvdXJjZTo6c3RhcnQoTWV0YURhdGFCYXNlICopIHsKK21lZGlhX3N0YXR1c190IE1QM1NvdXJjZTo6c3RhcnQoKSB7CiAgICAgQ0hFQ0soIW1TdGFydGVkKTsKIAogICAgIG1Hcm91cCA9IG5ldyBNZWRpYUJ1ZmZlckdyb3VwOwpAQCAtNDc3LDEwICs0ODEsMTAgQEAKIAogICAgIG1TdGFydGVkID0gdHJ1ZTsKIAotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCi1zdGF0dXNfdCBNUDNTb3VyY2U6OnN0b3AoKSB7CittZWRpYV9zdGF0dXNfdCBNUDNTb3VyY2U6OnN0b3AoKSB7CiAgICAgQ0hFQ0sobVN0YXJ0ZWQpOwogCiAgICAgZGVsZXRlIG1Hcm91cDsKQEAgLTQ4OCwxNSArNDkyLDE0IEBACiAKICAgICBtU3RhcnRlZCA9IGZhbHNlOwogCi0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKLXN0YXR1c190IE1QM1NvdXJjZTo6Z2V0Rm9ybWF0KE1ldGFEYXRhQmFzZSAmbWV0YSkgewotICAgIG1ldGEgPSBtTWV0YTsKLSAgICByZXR1cm4gT0s7CittZWRpYV9zdGF0dXNfdCBNUDNTb3VyY2U6OmdldEZvcm1hdChBTWVkaWFGb3JtYXQgKm1ldGEpIHsKKyAgICByZXR1cm4gQU1lZGlhRm9ybWF0X2NvcHkobWV0YSwgbU1ldGEpOwogfQogCi1zdGF0dXNfdCBNUDNTb3VyY2U6OnJlYWQoCittZWRpYV9zdGF0dXNfdCBNUDNTb3VyY2U6OnJlYWQoCiAgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKm91dCwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKICAgICAqb3V0ID0gTlVMTDsKIApAQCAtNTA5LDExICs1MTIsMTEgQEAKICAgICAgICAgaWYgKG1TZWVrZXIgPT0gTlVMTAogICAgICAgICAgICAgICAgIHx8ICFtU2Vla2VyLT5nZXRPZmZzZXRGb3JUaW1lKCZhY3R1YWxTZWVrVGltZVVzLCAmbUN1cnJlbnRQb3MpKSB7CiAgICAgICAgICAgICBpbnQzMl90IGJpdHJhdGU7Ci0gICAgICAgICAgICBpZiAoIW1NZXRhLmZpbmRJbnQzMihrS2V5Qml0UmF0ZSwgJmJpdHJhdGUpKSB7CisgICAgICAgICAgICBpZiAoIUFNZWRpYUZvcm1hdF9nZXRJbnQzMihtTWV0YSwgQU1FRElBRk9STUFUX0tFWV9CSVRfUkFURSwgJmJpdHJhdGUpKSB7CiAgICAgICAgICAgICAgICAgLy8gYml0cmF0ZSBpcyBpbiBiaXRzL3NlYy4KICAgICAgICAgICAgICAgICBBTE9HSSgibm8gYml0cmF0ZSIpOwogCi0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5TVVBQT1JURUQ7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIG1DdXJyZW50VGltZVVzID0gc2Vla1RpbWVVczsKQEAgLTUzMCw3ICs1MzMsNyBAQAogICAgIE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyOwogICAgIHN0YXR1c190IGVyciA9IG1Hcm91cC0+YWNxdWlyZV9idWZmZXIoJmJ1ZmZlcik7CiAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgfQogCiAgICAgc2l6ZV90IGZyYW1lX3NpemU7CkBAIC01NDMsNyArNTQ2LDggQEAKICAgICAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOwogICAgICAgICAgICAgYnVmZmVyID0gTlVMTDsKIAotICAgICAgICAgICAgcmV0dXJuIChuIDwgMCA/IG4gOiBFUlJPUl9FTkRfT0ZfU1RSRUFNKTsKKyAgICAgICAgICAgIHJldHVybiAoKG4gPCAwICYmIG4gIT0gRVJST1JfRU5EX09GX1NUUkVBTSkgPworICAgICAgICAgICAgICAgICAgICBBTUVESUFfRVJST1JfVU5LTk9XTiA6IEFNRURJQV9FUlJPUl9FTkRfT0ZfU1RSRUFNKTsKICAgICAgICAgfQogCiAgICAgICAgIHVpbnQzMl90IGhlYWRlciA9IFUzMl9BVCgoY29uc3QgdWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpKTsKQEAgLTU3Miw3ICs1NzYsNyBAQAogICAgICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CiAgICAgICAgICAgICBidWZmZXIgPSBOVUxMOwogCi0gICAgICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfRU5EX09GX1NUUkVBTTsKICAgICAgICAgfQogCiAgICAgICAgIG1DdXJyZW50UG9zID0gcG9zOwpAQCAtNTg3LDcgKzU5MSw4IEBACiAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOwogICAgICAgICBidWZmZXIgPSBOVUxMOwogCi0gICAgICAgIHJldHVybiAobiA8IDAgPyBuIDogRVJST1JfRU5EX09GX1NUUkVBTSk7CisgICAgICAgIHJldHVybiAoKG4gPCAwICYmIG4gIT0gRVJST1JfRU5EX09GX1NUUkVBTSkgPworICAgICAgICAgICAgICAgIEFNRURJQV9FUlJPUl9VTktOT1dOIDogQU1FRElBX0VSUk9SX0VORF9PRl9TVFJFQU0pOwogICAgIH0KIAogICAgIGJ1ZmZlci0+c2V0X3JhbmdlKDAsIGZyYW1lX3NpemUpOwpAQCAtNjAyLDM5ICs2MDcsNDAgQEAKIAogICAgICpvdXQgPSBidWZmZXI7CiAKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAotc3RhdHVzX3QgTVAzRXh0cmFjdG9yOjpnZXRNZXRhRGF0YShNZXRhRGF0YUJhc2UgJm1ldGEpIHsKLSAgICBtZXRhLmNsZWFyKCk7CittZWRpYV9zdGF0dXNfdCBNUDNFeHRyYWN0b3I6OmdldE1ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSkgeworICAgIEFNZWRpYUZvcm1hdF9jbGVhcihtZXRhKTsKICAgICBpZiAobUluaXRDaGVjayAhPSBPSykgewotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogICAgIH0KLSAgICBtZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCAiYXVkaW8vbXBlZyIpOworICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCAiYXVkaW8vbXBlZyIpOwogCi0gICAgSUQzIGlkMyhtRGF0YVNvdXJjZSk7CisgICAgRGF0YVNvdXJjZUhlbHBlciBoZWxwZXIobURhdGFTb3VyY2UpOworICAgIElEMyBpZDMoJmhlbHBlcik7CiAKICAgICBpZiAoIWlkMy5pc1ZhbGlkKCkpIHsKLSAgICAgICAgcmV0dXJuIE9LOworICAgICAgICByZXR1cm4gQU1FRElBX09LOwogICAgIH0KIAogICAgIHN0cnVjdCBNYXAgewotICAgICAgICBpbnQga2V5OworICAgICAgICBjb25zdCBjaGFyICprZXk7CiAgICAgICAgIGNvbnN0IGNoYXIgKnRhZzE7CiAgICAgICAgIGNvbnN0IGNoYXIgKnRhZzI7CiAgICAgfTsKICAgICBzdGF0aWMgY29uc3QgTWFwIGtNYXBbXSA9IHsKLSAgICAgICAgeyBrS2V5QWxidW0sICJUQUxCIiwgIlRBTCIgfSwKLSAgICAgICAgeyBrS2V5QXJ0aXN0LCAiVFBFMSIsICJUUDEiIH0sCi0gICAgICAgIHsga0tleUFsYnVtQXJ0aXN0LCAiVFBFMiIsICJUUDIiIH0sCi0gICAgICAgIHsga0tleUNvbXBvc2VyLCAiVENPTSIsICJUQ00iIH0sCi0gICAgICAgIHsga0tleUdlbnJlLCAiVENPTiIsICJUQ08iIH0sCi0gICAgICAgIHsga0tleVRpdGxlLCAiVElUMiIsICJUVDIiIH0sCi0gICAgICAgIHsga0tleVllYXIsICJUWUUiLCAiVFlFUiIgfSwKLSAgICAgICAgeyBrS2V5QXV0aG9yLCAiVFhUIiwgIlRFWFQiIH0sCi0gICAgICAgIHsga0tleUNEVHJhY2tOdW1iZXIsICJUUksiLCAiVFJDSyIgfSwKLSAgICAgICAgeyBrS2V5RGlzY051bWJlciwgIlRQQSIsICJUUE9TIiB9LAotICAgICAgICB7IGtLZXlDb21waWxhdGlvbiwgIlRDUCIsICJUQ01QIiB9LAorICAgICAgICB7IEFNRURJQUZPUk1BVF9LRVlfQUxCVU0sICJUQUxCIiwgIlRBTCIgfSwKKyAgICAgICAgeyBBTUVESUFGT1JNQVRfS0VZX0FSVElTVCwgIlRQRTEiLCAiVFAxIiB9LAorICAgICAgICB7IEFNRURJQUZPUk1BVF9LRVlfQUxCVU1BUlRJU1QsICJUUEUyIiwgIlRQMiIgfSwKKyAgICAgICAgeyBBTUVESUFGT1JNQVRfS0VZX0NPTVBPU0VSLCAiVENPTSIsICJUQ00iIH0sCisgICAgICAgIHsgQU1FRElBRk9STUFUX0tFWV9HRU5SRSwgIlRDT04iLCAiVENPIiB9LAorICAgICAgICB7IEFNRURJQUZPUk1BVF9LRVlfVElUTEUsICJUSVQyIiwgIlRUMiIgfSwKKyAgICAgICAgeyBBTUVESUFGT1JNQVRfS0VZX1lFQVIsICJUWUUiLCAiVFlFUiIgfSwKKyAgICAgICAgeyBBTUVESUFGT1JNQVRfS0VZX0FVVEhPUiwgIlRYVCIsICJURVhUIiB9LAorICAgICAgICB7IEFNRURJQUZPUk1BVF9LRVlfQ0RUUkFDS05VTUJFUiwgIlRSSyIsICJUUkNLIiB9LAorICAgICAgICB7IEFNRURJQUZPUk1BVF9LRVlfRElTQ05VTUJFUiwgIlRQQSIsICJUUE9TIiB9LAorICAgICAgICB7IEFNRURJQUZPUk1BVF9LRVlfQ09NUElMQVRJT04sICJUQ1AiLCAiVENNUCIgfSwKICAgICB9OwogICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga051bU1hcEVudHJpZXMgPSBzaXplb2Yoa01hcCkgLyBzaXplb2Yoa01hcFswXSk7CiAKQEAgLTY1NCw3ICs2NjAsNyBAQAogICAgICAgICBpdC0+Z2V0U3RyaW5nKCZzKTsKICAgICAgICAgZGVsZXRlIGl0OwogCi0gICAgICAgIG1ldGEuc2V0Q1N0cmluZyhrTWFwW2ldLmtleSwgcyk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobWV0YSwga01hcFtpXS5rZXksIHMuc3RyaW5nKCkpOwogICAgIH0KIAogICAgIHNpemVfdCBkYXRhU2l6ZTsKQEAgLTY2MiwyOCArNjY4LDI4IEBACiAgICAgY29uc3Qgdm9pZCAqZGF0YSA9IGlkMy5nZXRBbGJ1bUFydCgmZGF0YVNpemUsICZtaW1lKTsKIAogICAgIGlmIChkYXRhKSB7Ci0gICAgICAgIG1ldGEuc2V0RGF0YShrS2V5QWxidW1BcnQsIE1ldGFEYXRhOjpUWVBFX05PTkUsIGRhdGEsIGRhdGFTaXplKTsKLSAgICAgICAgbWV0YS5zZXRDU3RyaW5nKGtLZXlBbGJ1bUFydE1JTUUsIG1pbWUuc3RyaW5nKCkpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQUxCVU1BUlQsIGRhdGEsIGRhdGFTaXplKTsKICAgICB9CiAKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAotc3RhdGljIE1lZGlhRXh0cmFjdG9yKiBDcmVhdGVFeHRyYWN0b3IoCi0gICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsCitzdGF0aWMgQ01lZGlhRXh0cmFjdG9yVjIqIENyZWF0ZUV4dHJhY3RvcigKKyAgICAgICAgQ0RhdGFTb3VyY2UgKnNvdXJjZSwKICAgICAgICAgdm9pZCAqbWV0YSkgewogICAgIE1wM01ldGEgKm1ldGFEYXRhID0gc3RhdGljX2Nhc3Q8TXAzTWV0YSAqPihtZXRhKTsKLSAgICByZXR1cm4gbmV3IE1QM0V4dHJhY3Rvcihzb3VyY2UsIG1ldGFEYXRhKTsKKyAgICByZXR1cm4gd3JhcFYyKG5ldyBNUDNFeHRyYWN0b3IobmV3IERhdGFTb3VyY2VIZWxwZXIoc291cmNlKSwgbWV0YURhdGEpKTsKIH0KIAotc3RhdGljIE1lZGlhRXh0cmFjdG9yOjpDcmVhdG9yRnVuYyBTbmlmZigKLSAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgZmxvYXQgKmNvbmZpZGVuY2UsIHZvaWQgKiptZXRhLAotICAgICAgICBNZWRpYUV4dHJhY3Rvcjo6RnJlZU1ldGFGdW5jICpmcmVlTWV0YSkgeworc3RhdGljIENyZWF0b3JGdW5jVjIgU25pZmYoCisgICAgICAgIENEYXRhU291cmNlICpzb3VyY2UsIGZsb2F0ICpjb25maWRlbmNlLCB2b2lkICoqbWV0YSwKKyAgICAgICAgRnJlZU1ldGFGdW5jICpmcmVlTWV0YSkgewogICAgIG9mZjY0X3QgcG9zID0gMDsKICAgICBvZmY2NF90IHBvc3RfaWQzX3BvczsKICAgICB1aW50MzJfdCBoZWFkZXI7CiAgICAgdWludDhfdCBtcGVnX2hlYWRlcls1XTsKLSAgICBpZiAoc291cmNlLT5yZWFkQXQoMCwgbXBlZ19oZWFkZXIsIHNpemVvZihtcGVnX2hlYWRlcikpIDwgKHNzaXplX3Qpc2l6ZW9mKG1wZWdfaGVhZGVyKSkgeworICAgIERhdGFTb3VyY2VIZWxwZXIgaGVscGVyKHNvdXJjZSk7CisgICAgaWYgKGhlbHBlci5yZWFkQXQoMCwgbXBlZ19oZWFkZXIsIHNpemVvZihtcGVnX2hlYWRlcikpIDwgKHNzaXplX3Qpc2l6ZW9mKG1wZWdfaGVhZGVyKSkgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKQEAgLTY5MSw3ICs2OTcsNyBAQAogICAgICAgICBBTE9HVigiTVBFRzFQUyBjb250YWluZXIgaXMgbm90IHN1cHBvcnRlZCEiKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQotICAgIGlmICghUmVzeW5jKHNvdXJjZSwgMCwgJnBvcywgJnBvc3RfaWQzX3BvcywgJmhlYWRlcikpIHsKKyAgICBpZiAoIVJlc3luYygmaGVscGVyLCAwLCAmcG9zLCAmcG9zdF9pZDNfcG9zLCAmaGVhZGVyKSkgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKQEAgLTcxMCwxMyArNzE2LDEzIEBACiBleHRlcm4gIkMiIHsKIC8vIFRoaXMgaXMgdGhlIG9ubHkgc3ltYm9sIHRoYXQgbmVlZHMgdG8gYmUgZXhwb3J0ZWQKIF9fYXR0cmlidXRlX18gKCh2aXNpYmlsaXR5ICgiZGVmYXVsdCIpKSkKLU1lZGlhRXh0cmFjdG9yOjpFeHRyYWN0b3JEZWYgR0VURVhUUkFDVE9SREVGKCkgeworRXh0cmFjdG9yRGVmIEdFVEVYVFJBQ1RPUkRFRigpIHsKICAgICByZXR1cm4gewotICAgICAgICBNZWRpYUV4dHJhY3Rvcjo6RVhUUkFDVE9SREVGX1ZFUlNJT04sCisgICAgICAgIEVYVFJBQ1RPUkRFRl9WRVJTSU9OX0NVUlJFTlQsCiAgICAgICAgIFVVSUQoIjgxMmEzZjZjLWM4Y2YtNDZkZS1iNTI5LTM3NzRiMTQxMDNkNCIpLAogICAgICAgICAxLCAvLyB2ZXJzaW9uCiAgICAgICAgICJNUDMgRXh0cmFjdG9yIiwKLSAgICAgICAgU25pZmYKKyAgICAgICAgeyAudjIgPSBTbmlmZiB9CiAgICAgfTsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcDMvTVAzRXh0cmFjdG9yLmggYi9tZWRpYS9leHRyYWN0b3JzL21wMy9NUDNFeHRyYWN0b3IuaAppbmRleCA0ODViMGNhLi4yMjU0N2UyIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21wMy9NUDNFeHRyYWN0b3IuaAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wMy9NUDNFeHRyYWN0b3IuaApAQCAtMTksMzUgKzE5LDM3IEBACiAjZGVmaW5lIE1QM19FWFRSQUNUT1JfSF8KIAogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5BcGkuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlci5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRm9ybWF0Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorY2xhc3MgRGF0YVNvdXJjZUhlbHBlcjsKKwogc3RydWN0IEFNZXNzYWdlOwotY2xhc3MgRGF0YVNvdXJjZUJhc2U7CiBzdHJ1Y3QgTVAzU2Vla2VyOwogY2xhc3MgU3RyaW5nODsKIHN0cnVjdCBNcDNNZXRhOwogCi1jbGFzcyBNUDNFeHRyYWN0b3IgOiBwdWJsaWMgTWVkaWFFeHRyYWN0b3IgeworY2xhc3MgTVAzRXh0cmFjdG9yIDogcHVibGljIE1lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyVjIgewogcHVibGljOgotICAgIE1QM0V4dHJhY3RvcihEYXRhU291cmNlQmFzZSAqc291cmNlLCBNcDNNZXRhICptZXRhKTsKKyAgICBNUDNFeHRyYWN0b3IoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLCBNcDNNZXRhICptZXRhKTsKICAgICB+TVAzRXh0cmFjdG9yKCk7CiAKICAgICB2aXJ0dWFsIHNpemVfdCBjb3VudFRyYWNrcygpOwotICAgIHZpcnR1YWwgTWVkaWFUcmFjayAqZ2V0VHJhY2soc2l6ZV90IGluZGV4KTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFRyYWNrTWV0YURhdGEoTWV0YURhdGFCYXNlJiBtZXRhLCBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKTsKKyAgICB2aXJ0dWFsIE1lZGlhVHJhY2tIZWxwZXJWMiAqZ2V0VHJhY2soc2l6ZV90IGluZGV4KTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IGdldFRyYWNrTWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhLCBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWV0YURhdGEoTWV0YURhdGFCYXNlJiBtZXRhKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IGdldE1ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSk7CiAgICAgdmlydHVhbCBjb25zdCBjaGFyICogbmFtZSgpIHsgcmV0dXJuICJNUDNFeHRyYWN0b3IiOyB9CiAKIHByaXZhdGU6CiAgICAgc3RhdHVzX3QgbUluaXRDaGVjazsKIAotICAgIERhdGFTb3VyY2VCYXNlICptRGF0YVNvdXJjZTsKKyAgICBEYXRhU291cmNlSGVscGVyICptRGF0YVNvdXJjZTsKICAgICBvZmY2NF90IG1GaXJzdEZyYW1lUG9zOwotICAgIE1ldGFEYXRhQmFzZSBtTWV0YTsKKyAgICBBTWVkaWFGb3JtYXQgKm1NZXRhOwogICAgIHVpbnQzMl90IG1GaXhlZEhlYWRlcjsKICAgICBNUDNTZWVrZXIgKm1TZWVrZXI7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXAzL1ZCUklTZWVrZXIuY3BwIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDMvVkJSSVNlZWtlci5jcHAKaW5kZXggNTIzZjE0Yy4uOWViNzJhNyAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9tcDMvVkJSSVNlZWtlci5jcHAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDMvVkJSSVNlZWtlci5jcHAKQEAgLTI3LDcgKzI3LDkgQEAKIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9CeXRlVXRpbHMuaD4KLSNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlQmFzZS5oPgorCisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5BcGkuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlci5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTM3LDcgKzM5LDcgQEAKIAogLy8gc3RhdGljCiBWQlJJU2Vla2VyICpWQlJJU2Vla2VyOjpDcmVhdGVGcm9tU291cmNlKAotICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLCBvZmY2NF90IHBvc3RfaWQzX3BvcykgeworICAgICAgICBEYXRhU291cmNlSGVscGVyICpzb3VyY2UsIG9mZjY0X3QgcG9zdF9pZDNfcG9zKSB7CiAgICAgb2ZmNjRfdCBwb3MgPSBwb3N0X2lkM19wb3M7CiAKICAgICB1aW50OF90IGhlYWRlcls0XTsKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXAzL1ZCUklTZWVrZXIuaCBiL21lZGlhL2V4dHJhY3RvcnMvbXAzL1ZCUklTZWVrZXIuaAppbmRleCA5MjEzZjZlLi41MDc4OTljIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21wMy9WQlJJU2Vla2VyLmgKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDMvVkJSSVNlZWtlci5oCkBAIC0yNCwxMSArMjQsMTEgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1jbGFzcyBEYXRhU291cmNlQmFzZTsKK2NsYXNzIERhdGFTb3VyY2VIZWxwZXI7CiAKIHN0cnVjdCBWQlJJU2Vla2VyIDogcHVibGljIE1QM1NlZWtlciB7CiAgICAgc3RhdGljIFZCUklTZWVrZXIgKkNyZWF0ZUZyb21Tb3VyY2UoCi0gICAgICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLCBvZmY2NF90IHBvc3RfaWQzX3Bvcyk7CisgICAgICAgICAgICBEYXRhU291cmNlSGVscGVyICpzb3VyY2UsIG9mZjY0X3QgcG9zdF9pZDNfcG9zKTsKIAogICAgIHZpcnR1YWwgYm9vbCBnZXREdXJhdGlvbihpbnQ2NF90ICpkdXJhdGlvblVzKTsKICAgICB2aXJ0dWFsIGJvb2wgZ2V0T2Zmc2V0Rm9yVGltZShpbnQ2NF90ICp0aW1lVXMsIG9mZjY0X3QgKnBvcyk7CmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wMy9YSU5HU2Vla2VyLmNwcCBiL21lZGlhL2V4dHJhY3RvcnMvbXAzL1hJTkdTZWVrZXIuY3BwCmluZGV4IDAxZTA2Y2EuLjlmMWZkN2EgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvbXAzL1hJTkdTZWVrZXIuY3BwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbXAzL1hJTkdTZWVrZXIuY3BwCkBAIC0yMSw3ICsyMSw5IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9hdmNfdXRpbHMuaD4KIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQnl0ZVV0aWxzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZUJhc2UuaD4KKworI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luQXBpLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC03OSw3ICs4MSw3IEBACiAKIC8vIHN0YXRpYwogWElOR1NlZWtlciAqWElOR1NlZWtlcjo6Q3JlYXRlRnJvbVNvdXJjZSgKLSAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgb2ZmNjRfdCBmaXJzdF9mcmFtZV9wb3MpIHsKKyAgICAgICAgRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLCBvZmY2NF90IGZpcnN0X2ZyYW1lX3BvcykgewogCiAgICAgdWludDhfdCBidWZmZXJbNF07CiAgICAgaW50IG9mZnNldCA9IGZpcnN0X2ZyYW1lX3BvczsKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXAzL1hJTkdTZWVrZXIuaCBiL21lZGlhL2V4dHJhY3RvcnMvbXAzL1hJTkdTZWVrZXIuaAppbmRleCA1ODY3ZWFlLi45YWNlZTM4IDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21wMy9YSU5HU2Vla2VyLmgKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDMvWElOR1NlZWtlci5oCkBAIC0yMiwxMSArMjIsMTEgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1jbGFzcyBEYXRhU291cmNlQmFzZTsKK2NsYXNzIERhdGFTb3VyY2VIZWxwZXI7CiAKIHN0cnVjdCBYSU5HU2Vla2VyIDogcHVibGljIE1QM1NlZWtlciB7CiAgICAgc3RhdGljIFhJTkdTZWVrZXIgKkNyZWF0ZUZyb21Tb3VyY2UoCi0gICAgICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLCBvZmY2NF90IGZpcnN0X2ZyYW1lX3Bvcyk7CisgICAgICAgICAgICBEYXRhU291cmNlSGVscGVyICpzb3VyY2UsIG9mZjY0X3QgZmlyc3RfZnJhbWVfcG9zKTsKIAogICAgIHZpcnR1YWwgYm9vbCBnZXREdXJhdGlvbihpbnQ2NF90ICpkdXJhdGlvblVzKTsKICAgICB2aXJ0dWFsIGJvb2wgZ2V0T2Zmc2V0Rm9yVGltZShpbnQ2NF90ICp0aW1lVXMsIG9mZjY0X3QgKnBvcyk7CmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wNC9BQzRQYXJzZXIuY3BwIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvQUM0UGFyc2VyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTVjMmRiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvQUM0UGFyc2VyLmNwcApAQCAtMCwwICsxLDYyNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQUM0UGFyc2VyIgorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9taXNjLmg+CisKKyNpbmNsdWRlICJBQzRQYXJzZXIuaCIKKworI2RlZmluZSBCT09MU1RSKGEpICAoKGEpPyJ0cnVlIjoiZmFsc2UiKQorI2RlZmluZSBCWVRFX0FMSUdOIG1CaXRSZWFkZXIuc2tpcEJpdHMobUJpdFJlYWRlci5udW1CaXRzTGVmdCgpICUgOCkKKyNkZWZpbmUgQ0hFQ0tfQklUU19MRUZUKG4pIGlmIChtQml0UmVhZGVyLm51bUJpdHNMZWZ0KCkgPCBuKSB7cmV0dXJuIGZhbHNlO30KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitBQzRQYXJzZXI6OkFDNFBhcnNlcigpIHsKK30KKworQUM0RFNJUGFyc2VyOjpBQzREU0lQYXJzZXIoQUJpdFJlYWRlciAmYnIpCisgICAgOiBtQml0UmVhZGVyKGJyKXsKKworICAgIG1EU0lTaXplID0gbUJpdFJlYWRlci5udW1CaXRzTGVmdCgpOworfQorCisvLyBFVFNJIFRTIDEwMyAxOTAtMiBWMS4xLjEgKDIwMTUtMDkpIFRhYmxlIDc5OiBjaGFubmVsX21vZGUKK3N0YXRpYyBjb25zdCBjaGFyICpDaGFubmVsTW9kZXNbXSA9IHsKKyAgICAibW9ubyIsCisgICAgInN0ZXJlbyIsCisgICAgIjMuMCIsCisgICAgIjUuMCIsCisgICAgIjUuMSIsCisgICAgIjcuMCAoMy80LzApIiwKKyAgICAiNy4xICgzLzQvMC4xKSIsCisgICAgIjcuMCAoNS8yLzApIiwKKyAgICAiNy4xICg1LzIvMC4xKSIsCisgICAgIjcuMCAoMy8yLzIpIiwKKyAgICAiNy4xICgzLzIvMi4xKSIsCisgICAgIjcuMC40IiwKKyAgICAiNy4xLjQiLAorICAgICI5LjAuNCIsCisgICAgIjkuMS40IiwKKyAgICAiMjIuMiIKK307CisKK3N0YXRpYyBjb25zdCBjaGFyKiBDb250ZW50Q2xhc3NpZmllcltdID0geworICAgICJDb21wbGV0ZSBNYWluIiwKKyAgICAiTXVzaWMgYW5kIEVmZmVjdHMiLAorICAgICJWaXN1YWxseSBJbXBhaXJlZCIsCisgICAgIkhlYXJpbmcgSW1wYWlyZWQiLAorICAgICJEaWFsb2ciLAorICAgICJDb21tZW50YXJ5IiwKKyAgICAiRW1lcmdlbmN5IiwKKyAgICAiVm9pY2UgT3ZlciIKK307CisKK2Jvb2wgQUM0RFNJUGFyc2VyOjpwYXJzZUxhbmd1YWdlVGFnKHVpbnQzMl90IHByZXNlbnRhdGlvbklELCB1aW50MzJfdCBzdWJzdHJlYW1JRCl7CisgICAgQ0hFQ0tfQklUU19MRUZUKDYpOworICAgIHVpbnQzMl90IG5fbGFuZ3VhZ2VfdGFnX2J5dGVzID0gbUJpdFJlYWRlci5nZXRCaXRzKDYpOworICAgIGlmIChuX2xhbmd1YWdlX3RhZ19ieXRlcyA8IDIgfHwgbl9sYW5ndWFnZV90YWdfYnl0ZXMgPj0gNDIpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBDSEVDS19CSVRTX0xFRlQobl9sYW5ndWFnZV90YWdfYnl0ZXMgKiA4KTsKKyAgICBjaGFyIGxhbmd1YWdlX3RhZ19ieXRlc1s0Ml07IC8vIFRTIDEwMyAxOTAgcGFydCAxIDQuMy4zLjguNworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBuX2xhbmd1YWdlX3RhZ19ieXRlczsgaSsrKSB7CisgICAgICAgIGxhbmd1YWdlX3RhZ19ieXRlc1tpXSA9IChjaGFyKW1CaXRSZWFkZXIuZ2V0Qml0cyg4KTsKKyAgICB9CisgICAgbGFuZ3VhZ2VfdGFnX2J5dGVzW25fbGFuZ3VhZ2VfdGFnX2J5dGVzXSA9IDA7CisgICAgQUxPR1YoIiV1LiV1OiBsYW5ndWFnZV90YWcgPSAlc1xuIiwgcHJlc2VudGF0aW9uSUQsIHN1YnN0cmVhbUlELCBsYW5ndWFnZV90YWdfYnl0ZXMpOworCisgICAgc3RkOjpzdHJpbmcgbGFuZ3VhZ2UobGFuZ3VhZ2VfdGFnX2J5dGVzLCBuX2xhbmd1YWdlX3RhZ19ieXRlcyk7CisgICAgbVByZXNlbnRhdGlvbnNbcHJlc2VudGF0aW9uSURdLm1MYW5ndWFnZSA9IGxhbmd1YWdlOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vIFRTIDEwMyAxOTAtMSB2MS4yLjEgRS41IGFuZCBUUyAxMDMgMTkwLTIgdjEuMS4xIEUuOQorYm9vbCBBQzREU0lQYXJzZXI6OnBhcnNlU3Vic3RyZWFtRFNJKHVpbnQzMl90IHByZXNlbnRhdGlvbklELCB1aW50MzJfdCBzdWJzdHJlYW1JRCl7CisgICAgQ0hFQ0tfQklUU19MRUZUKDUpOworICAgIHVpbnQzMl90IGNoYW5uZWxfbW9kZSA9IG1CaXRSZWFkZXIuZ2V0Qml0cyg1KTsKKyAgICBDSEVDS19CSVRTX0xFRlQoMik7CisgICAgdWludDMyX3QgZHNpX3NmX211bHRpcGxpZXIgPSBtQml0UmVhZGVyLmdldEJpdHMoMik7CisgICAgQ0hFQ0tfQklUU19MRUZUKDEpOworICAgIGJvb2wgYl9zdWJzdHJlYW1fYml0cmF0ZV9pbmRpY2F0b3IgPSAobUJpdFJlYWRlci5nZXRCaXRzKDEpID09IDEpOworICAgIEFMT0dWKCIldS4ldTogY2hhbm5lbF9tb2RlID0gJXUgKCVzKVxuIiwgcHJlc2VudGF0aW9uSUQsIHN1YnN0cmVhbUlELCBjaGFubmVsX21vZGUsCisgICAgY2hhbm5lbF9tb2RlIDwgTkVMRU0oQ2hhbm5lbE1vZGVzKSA/IENoYW5uZWxNb2Rlc1tjaGFubmVsX21vZGVdIDogInJlc2VydmVkIik7CisgICAgQUxPR1YoIiV1LiV1OiBkc2lfc2ZfbXVsdGlwbGllciA9ICV1XG4iLCBwcmVzZW50YXRpb25JRCwKKyAgICAgICAgc3Vic3RyZWFtSUQsIGRzaV9zZl9tdWx0aXBsaWVyKTsKKyAgICBBTE9HVigiJXUuJXU6IGJfc3Vic3RyZWFtX2JpdHJhdGVfaW5kaWNhdG9yID0gJXNcbiIsIHByZXNlbnRhdGlvbklELAorICAgICAgICBzdWJzdHJlYW1JRCwgQk9PTFNUUihiX3N1YnN0cmVhbV9iaXRyYXRlX2luZGljYXRvcikpOworCisgICAgaWYgKGJfc3Vic3RyZWFtX2JpdHJhdGVfaW5kaWNhdG9yKSB7CisgICAgICAgIENIRUNLX0JJVFNfTEVGVCg1KTsKKyAgICAgICAgdWludDMyX3Qgc3Vic3RyZWFtX2JpdHJhdGVfaW5kaWNhdG9yID0gbUJpdFJlYWRlci5nZXRCaXRzKDUpOworICAgICAgICBBTE9HVigiJXUuJXU6IHN1YnN0cmVhbV9iaXRyYXRlX2luZGljYXRvciA9ICV1XG4iLCBwcmVzZW50YXRpb25JRCwgc3Vic3RyZWFtSUQsCisgICAgICAgICAgICBzdWJzdHJlYW1fYml0cmF0ZV9pbmRpY2F0b3IpOworICAgIH0KKyAgICBpZiAoY2hhbm5lbF9tb2RlID49IDcgJiYgY2hhbm5lbF9tb2RlIDw9IDEwKSB7CisgICAgICAgIENIRUNLX0JJVFNfTEVGVCgxKTsKKyAgICAgICAgdWludDMyX3QgYWRkX2NoX2Jhc2UgPSBtQml0UmVhZGVyLmdldEJpdHMoMSk7CisgICAgICAgIEFMT0dWKCIldS4ldTogYWRkX2NoX2Jhc2UgPSAldVxuIiwgcHJlc2VudGF0aW9uSUQsIHN1YnN0cmVhbUlELCBhZGRfY2hfYmFzZSk7CisgICAgfQorICAgIENIRUNLX0JJVFNfTEVGVCgxKTsKKyAgICBib29sIGJfY29udGVudF90eXBlID0gKG1CaXRSZWFkZXIuZ2V0Qml0cygxKSA9PSAxKTsKKyAgICBBTE9HVigiJXUuJXU6IGJfY29udGVudF90eXBlID0gJXNcbiIsIHByZXNlbnRhdGlvbklELCBzdWJzdHJlYW1JRCwgQk9PTFNUUihiX2NvbnRlbnRfdHlwZSkpOworICAgIGlmIChiX2NvbnRlbnRfdHlwZSkgeworICAgICAgICBDSEVDS19CSVRTX0xFRlQoMyk7CisgICAgICAgIHVpbnQzMl90IGNvbnRlbnRfY2xhc3NpZmllciA9IG1CaXRSZWFkZXIuZ2V0Qml0cygzKTsKKyAgICAgICAgQUxPR1YoIiV1LiV1OiBjb250ZW50X2NsYXNzaWZpZXIgPSAldSAoJXMpXG4iLCBwcmVzZW50YXRpb25JRCwgc3Vic3RyZWFtSUQsCisgICAgICAgICAgICBjb250ZW50X2NsYXNzaWZpZXIsIENvbnRlbnRDbGFzc2lmaWVyW2NvbnRlbnRfY2xhc3NpZmllcl0pOworCisgICAgICAgIC8vIEZvciBzdHJlYW1zIGJhc2VkIG9uIFRTIDEwMyAxOTAgcGFydCAxIHRoZSBwcmVzZW50YXRpb24gbGV2ZWwgY2hhbm5lbF9tb2RlIGRvZXNuJ3QKKyAgICAgICAgLy8gZXhpc3QgYW5kIHNvIHdlIHVzZSB0aGUgY2hhbm5lbF9tb2RlIGZyb20gZWl0aGVyIHRoZSBDTSBvciBNJkUgc3Vic3RyZWFtCisgICAgICAgIC8vICh0aGV5IGFyZSBtdXR1YWxseSBleGNsdXNpdmUpCisgICAgICAgIGlmIChtUHJlc2VudGF0aW9uc1twcmVzZW50YXRpb25JRF0ubUNoYW5uZWxNb2RlID09IC0xICYmCisgICAgICAgICAgICAoY29udGVudF9jbGFzc2lmaWVyID09IDAgfHwgY29udGVudF9jbGFzc2lmaWVyID09IDEpKSB7CisgICAgICAgICAgICBtUHJlc2VudGF0aW9uc1twcmVzZW50YXRpb25JRF0ubUNoYW5uZWxNb2RlID0gY2hhbm5lbF9tb2RlOworICAgICAgICB9CisgICAgICAgIG1QcmVzZW50YXRpb25zW3ByZXNlbnRhdGlvbklEXS5tQ29udGVudENsYXNzaWZpZXIgPSBjb250ZW50X2NsYXNzaWZpZXI7CisgICAgICAgIENIRUNLX0JJVFNfTEVGVCgxKTsKKyAgICAgICAgYm9vbCBiX2xhbmd1YWdlX2luZGljYXRvciA9IChtQml0UmVhZGVyLmdldEJpdHMoMSkgPT0gMSk7CisgICAgICAgIEFMT0dWKCIldS4ldTogYl9sYW5ndWFnZV9pbmRpY2F0b3IgPSAlc1xuIiwgcHJlc2VudGF0aW9uSUQsIHN1YnN0cmVhbUlELAorICAgICAgICAgICAgQk9PTFNUUihiX2xhbmd1YWdlX2luZGljYXRvcikpOworICAgICAgICBpZiAoYl9sYW5ndWFnZV9pbmRpY2F0b3IpIHsKKyAgICAgICAgICAgIGlmICghcGFyc2VMYW5ndWFnZVRhZyhwcmVzZW50YXRpb25JRCwgc3Vic3RyZWFtSUQpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vIEVUU0kgVFMgMTAzIDE5MC0yIHYxLjEuMSBzZWN0aW9uIEUuMTEKK2Jvb2wgQUM0RFNJUGFyc2VyOjpwYXJzZVN1YnN0cmVhbUdyb3VwRFNJKHVpbnQzMl90IHByZXNlbnRhdGlvbklELCB1aW50MzJfdCBncm91cElEKQoreworICAgIENIRUNLX0JJVFNfTEVGVCgxKTsKKyAgICBib29sIGJfc3Vic3RyZWFtc19wcmVzZW50ID0gKG1CaXRSZWFkZXIuZ2V0Qml0cygxKSA9PSAxKTsKKyAgICBDSEVDS19CSVRTX0xFRlQoMSk7CisgICAgYm9vbCBiX2hzZl9leHQgPSAobUJpdFJlYWRlci5nZXRCaXRzKDEpID09IDEpOworICAgIENIRUNLX0JJVFNfTEVGVCgxKTsKKyAgICBib29sIGJfY2hhbm5lbF9jb2RlZCA9IChtQml0UmVhZGVyLmdldEJpdHMoMSkgPT0gMSk7CisgICAgQ0hFQ0tfQklUU19MRUZUKDgpOworICAgIHVpbnQzMl90IG5fc3Vic3RyZWFtcyA9IG1CaXRSZWFkZXIuZ2V0Qml0cyg4KTsKKyAgICBBTE9HVigiJXUuJXU6IGJfc3Vic3RyZWFtc19wcmVzZW50ID0gJXNcbiIsIHByZXNlbnRhdGlvbklELCBncm91cElELAorICAgICAgICBCT09MU1RSKGJfc3Vic3RyZWFtc19wcmVzZW50KSk7CisgICAgQUxPR1YoIiV1LiV1OiBiX2hzZl9leHQgPSAlc1xuIiwgcHJlc2VudGF0aW9uSUQsIGdyb3VwSUQsIEJPT0xTVFIoYl9oc2ZfZXh0KSk7CisgICAgQUxPR1YoIiV1LiV1OiBiX2NoYW5uZWxfY29kZWQgPSAlc1xuIiwgcHJlc2VudGF0aW9uSUQsIGdyb3VwSUQsIEJPT0xTVFIoYl9jaGFubmVsX2NvZGVkKSk7CisgICAgQUxPR1YoIiV1LiV1OiBuX3N1YnN0cmVhbXMgPSAldVxuIiwgcHJlc2VudGF0aW9uSUQsIGdyb3VwSUQsIG5fc3Vic3RyZWFtcyk7CisKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbl9zdWJzdHJlYW1zOyBpKyspIHsKKyAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDIpOworICAgICAgICB1aW50MzJfdCBkc2lfc2ZfbXVsdGlwbGllciA9IG1CaXRSZWFkZXIuZ2V0Qml0cygyKTsKKyAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDEpOworICAgICAgICBib29sIGJfc3Vic3RyZWFtX2JpdHJhdGVfaW5kaWNhdG9yID0gKG1CaXRSZWFkZXIuZ2V0Qml0cygxKSA9PSAxKTsKKyAgICAgICAgQUxPR1YoIiV1LiV1LiV1OiBkc2lfc2ZfbXVsdGlwbGllciA9ICV1XG4iLCBwcmVzZW50YXRpb25JRCwgZ3JvdXBJRCwgaSwgZHNpX3NmX211bHRpcGxpZXIpOworICAgICAgICBBTE9HVigiJXUuJXUuJXU6IGJfc3Vic3RyZWFtX2JpdHJhdGVfaW5kaWNhdG9yID0gJXNcbiIsIHByZXNlbnRhdGlvbklELCBncm91cElELCBpLAorICAgICAgICAgICAgQk9PTFNUUihiX3N1YnN0cmVhbV9iaXRyYXRlX2luZGljYXRvcikpOworCisgICAgICAgIGlmIChiX3N1YnN0cmVhbV9iaXRyYXRlX2luZGljYXRvcikgeworICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDUpOworICAgICAgICAgICAgdWludDMyX3Qgc3Vic3RyZWFtX2JpdHJhdGVfaW5kaWNhdG9yID0gbUJpdFJlYWRlci5nZXRCaXRzKDUpOworICAgICAgICAgICAgQUxPR1YoIiV1LiV1LiV1OiBzdWJzdHJlYW1fYml0cmF0ZV9pbmRpY2F0b3IgPSAldVxuIiwgcHJlc2VudGF0aW9uSUQsIGdyb3VwSUQsIGksCisgICAgICAgICAgICAgICAgc3Vic3RyZWFtX2JpdHJhdGVfaW5kaWNhdG9yKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYl9jaGFubmVsX2NvZGVkKSB7CisgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoMjQpOworICAgICAgICAgICAgdWludDMyX3QgZHNpX3N1YnN0cmVhbV9jaGFubmVsX21hc2sgPSBtQml0UmVhZGVyLmdldEJpdHMoMjQpOworICAgICAgICAgICAgQUxPR1YoIiV1LiV1LiV1OiBkc2lfc3Vic3RyZWFtX2NoYW5uZWxfbWFzayA9IDB4JTA2eFxuIiwgcHJlc2VudGF0aW9uSUQsIGdyb3VwSUQsIGksCisgICAgICAgICAgICAgICAgZHNpX3N1YnN0cmVhbV9jaGFubmVsX21hc2spOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDEpOworICAgICAgICAgICAgYm9vbCBiX2Fqb2MgPSAobUJpdFJlYWRlci5nZXRCaXRzKDEpID09IDEpOworICAgICAgICAgICAgQUxPR1YoIiV1LiV1LiV1OiBiX2Fqb2MgPSAlc1xuIiwgcHJlc2VudGF0aW9uSUQsIGdyb3VwSUQsIGksIEJPT0xTVFIoYl9ham9jKSk7CisgICAgICAgICAgICBpZiAoYl9ham9jKSB7CisgICAgICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDEpOworICAgICAgICAgICAgICAgIGJvb2wgYl9zdGF0aWNfZG14ID0gKG1CaXRSZWFkZXIuZ2V0Qml0cygxKSA9PSAxKTsKKyAgICAgICAgICAgICAgICBBTE9HVigiJXUuJXUuJXU6IGJfc3RhdGljX2RteCA9ICVzXG4iLCBwcmVzZW50YXRpb25JRCwgZ3JvdXBJRCwgaSwKKyAgICAgICAgICAgICAgICAgICAgQk9PTFNUUihiX3N0YXRpY19kbXgpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJfc3RhdGljX2RteCkgeworICAgICAgICAgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoNCk7CisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG5fZG14X29iamVjdHNfbWludXMxID0gbUJpdFJlYWRlci5nZXRCaXRzKDQpOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiJXUuJXUuJXU6IG5fZG14X29iamVjdHNfbWludXMxID0gJXVcbiIsIHByZXNlbnRhdGlvbklELCBncm91cElELCBpLAorICAgICAgICAgICAgICAgICAgICAgICAgbl9kbXhfb2JqZWN0c19taW51czEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoNik7CisgICAgICAgICAgICAgICAgdWludDMyX3Qgbl91bXhfb2JqZWN0c19taW51czEgPSBtQml0UmVhZGVyLmdldEJpdHMoNik7CisgICAgICAgICAgICAgICAgQUxPR1YoIiV1LiV1LiV1OiBuX3VteF9vYmplY3RzX21pbnVzMSA9ICV1XG4iLCBwcmVzZW50YXRpb25JRCwgZ3JvdXBJRCwgaSwKKyAgICAgICAgICAgICAgICAgICAgbl91bXhfb2JqZWN0c19taW51czEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDQpOworICAgICAgICAgICAgbUJpdFJlYWRlci5za2lwQml0cyg0KTsgLy8gb2JqZWN0c19hc3NpZ25tZW50X21hc2sKKyAgICAgICAgfQorICAgIH0KKworICAgIENIRUNLX0JJVFNfTEVGVCgxKTsKKyAgICBib29sIGJfY29udGVudF90eXBlID0gKG1CaXRSZWFkZXIuZ2V0Qml0cygxKSA9PSAxKTsKKyAgICBBTE9HVigiJXUuJXU6IGJfY29udGVudF90eXBlID0gJXNcbiIsIHByZXNlbnRhdGlvbklELCBncm91cElELCBCT09MU1RSKGJfY29udGVudF90eXBlKSk7CisgICAgaWYgKGJfY29udGVudF90eXBlKSB7CisgICAgICAgIENIRUNLX0JJVFNfTEVGVCgzKTsKKyAgICAgICAgdWludDMyX3QgY29udGVudF9jbGFzc2lmaWVyID0gbUJpdFJlYWRlci5nZXRCaXRzKDMpOworICAgICAgICBBTE9HVigiJXUuJXU6IGNvbnRlbnRfY2xhc3NpZmllciA9ICVzICgldSlcbiIsIHByZXNlbnRhdGlvbklELCBncm91cElELAorICAgICAgICAgICAgQ29udGVudENsYXNzaWZpZXJbY29udGVudF9jbGFzc2lmaWVyXSwgY29udGVudF9jbGFzc2lmaWVyKTsKKworICAgICAgICBtUHJlc2VudGF0aW9uc1twcmVzZW50YXRpb25JRF0ubUNvbnRlbnRDbGFzc2lmaWVyID0gY29udGVudF9jbGFzc2lmaWVyOworCisgICAgICAgIENIRUNLX0JJVFNfTEVGVCgxKTsKKyAgICAgICAgYm9vbCBiX2xhbmd1YWdlX2luZGljYXRvciA9IChtQml0UmVhZGVyLmdldEJpdHMoMSkgPT0gMSk7CisgICAgICAgIEFMT0dWKCIldS4ldTogYl9sYW5ndWFnZV9pbmRpY2F0b3IgPSAlc1xuIiwgcHJlc2VudGF0aW9uSUQsIGdyb3VwSUQsCisgICAgICAgICAgICBCT09MU1RSKGJfbGFuZ3VhZ2VfaW5kaWNhdG9yKSk7CisKKyAgICAgICAgaWYgKGJfbGFuZ3VhZ2VfaW5kaWNhdG9yKSB7CisgICAgICAgICAgICBpZiAoIXBhcnNlTGFuZ3VhZ2VUYWcocHJlc2VudGF0aW9uSUQsIGdyb3VwSUQpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQUM0RFNJUGFyc2VyOjpwYXJzZUJpdHJhdGVEc2koKSB7CisgICAgQ0hFQ0tfQklUU19MRUZUKDIgKyAzMiArIDMyKTsKKyAgICBtQml0UmVhZGVyLnNraXBCaXRzKDIpOyAvLyBiaXRfcmF0ZV9tb2RlCisgICAgbUJpdFJlYWRlci5za2lwQml0cygzMik7IC8vIGJpdF9yYXRlCisgICAgbUJpdFJlYWRlci5za2lwQml0cygzMik7IC8vIGJpdF9yYXRlX3ByZWNpc2lvbgorCisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vIFRTIDEwMyAxOTAtMSBzZWN0aW9uIEUuNCAoYWM0X2RzaSkgYW5kIFRTIDEwMyAxOTAtMiBzZWN0aW9uIEUuNiAoYWM0X2RzaV92MSkKK2Jvb2wgQUM0RFNJUGFyc2VyOjpwYXJzZSgpIHsKKyAgICBDSEVDS19CSVRTX0xFRlQoMyk7CisgICAgdWludDMyX3QgYWM0X2RzaV92ZXJzaW9uID0gbUJpdFJlYWRlci5nZXRCaXRzKDMpOworICAgIGlmIChhYzRfZHNpX3ZlcnNpb24gPiAxKSB7CisgICAgICAgIEFMT0dFKCJlcnJvciB3aGlsZSBwYXJzaW5nIGFjLTQgZHNpOiBvbmx5IHZlcnNpb25zIDAgYW5kIDEgYXJlIHN1cHBvcnRlZCIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQ0hFQ0tfQklUU19MRUZUKDcgKyAxICsgNCArIDkpOworICAgIHVpbnQzMl90IGJpdHN0cmVhbV92ZXJzaW9uID0gbUJpdFJlYWRlci5nZXRCaXRzKDcpOworICAgIG1CaXRSZWFkZXIuc2tpcEJpdHMoMSk7IC8vIGZzX2luZGV4CisgICAgbUJpdFJlYWRlci5za2lwQml0cyg0KTsgLy8gZnJhbWVfcmF0ZV9pbmRleAorICAgIHVpbnQzMl90IG5fcHJlc2VudGF0aW9ucyA9IG1CaXRSZWFkZXIuZ2V0Qml0cyg5KTsKKworICAgIGludDMyX3Qgc2hvcnRfcHJvZ3JhbV9pZCA9IC0xOworICAgIGlmIChiaXRzdHJlYW1fdmVyc2lvbiA+IDEpIHsKKyAgICAgICAgaWYgKGFjNF9kc2lfdmVyc2lvbiA9PSAwKXsKKyAgICAgICAgICAgIEFMT0dFKCJpbnZhbGlkIGFjNCBkc2kiKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBDSEVDS19CSVRTX0xFRlQoMSk7CisgICAgICAgIGJvb2wgYl9wcm9ncmFtX2lkID0gKG1CaXRSZWFkZXIuZ2V0Qml0cygxKSA9PSAxKTsKKyAgICAgICAgaWYgKGJfcHJvZ3JhbV9pZCkgeworICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDE2ICsgMSk7CisgICAgICAgICAgICBzaG9ydF9wcm9ncmFtX2lkID0gbUJpdFJlYWRlci5nZXRCaXRzKDE2KTsKKyAgICAgICAgICAgIGJvb2wgYl91dWlkID0gKG1CaXRSZWFkZXIuZ2V0Qml0cygxKSA9PSAxKTsKKyAgICAgICAgICAgIGlmIChiX3V1aWQpIHsKKyAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBrQUM0VVVJRFNpemVJbkJ5dGVzID0gMTY7CisgICAgICAgICAgICAgICAgY2hhciBwcm9ncmFtX3V1aWRba0FDNFVVSURTaXplSW5CeXRlc107CisgICAgICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKGtBQzRVVUlEU2l6ZUluQnl0ZXMgKiA4KTsKKyAgICAgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwga0FDNFVVSURTaXplSW5CeXRlczsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHByb2dyYW1fdXVpZFtpXSA9IChjaGFyKShtQml0UmVhZGVyLmdldEJpdHMoOCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBBTE9HVigiVVVJRCA9ICVzIiwgcHJvZ3JhbV91dWlkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChhYzRfZHNpX3ZlcnNpb24gPT0gMSkgeworICAgICAgICBpZiAoIXBhcnNlQml0cmF0ZURzaSgpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgQllURV9BTElHTjsKKyAgICB9CisKKyAgICBmb3IgKHVpbnQzMl90IHByZXNlbnRhdGlvbiA9IDA7IHByZXNlbnRhdGlvbiA8IG5fcHJlc2VudGF0aW9uczsgcHJlc2VudGF0aW9uKyspIHsKKyAgICAgICAgbVByZXNlbnRhdGlvbnNbcHJlc2VudGF0aW9uXS5tUHJvZ3JhbUlEID0gc2hvcnRfcHJvZ3JhbV9pZDsKKyAgICAgICAgLy8ga25vd24gYXMgYl9zaW5nbGVfc3Vic3RyZWFtIGluIGFjNF9kc2lfdmVyc2lvbiAwCisgICAgICAgIGJvb2wgYl9zaW5nbGVfc3Vic3RyZWFtX2dyb3VwID0gZmFsc2U7CisgICAgICAgIHVpbnQzMl90IHByZXNlbnRhdGlvbl9jb25maWcgPSAwLCBwcmVzZW50YXRpb25fdmVyc2lvbiA9IDA7CisgICAgICAgIHVpbnQzMl90IHByZXNfYnl0ZXMgPSAwOworCisgICAgICAgIGlmIChhYzRfZHNpX3ZlcnNpb24gPT0gMCkgeworICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDEgKyA1ICsgNSk7CisgICAgICAgICAgICBiX3NpbmdsZV9zdWJzdHJlYW1fZ3JvdXAgPSAobUJpdFJlYWRlci5nZXRCaXRzKDEpID09IDEpOworICAgICAgICAgICAgcHJlc2VudGF0aW9uX2NvbmZpZyA9IG1CaXRSZWFkZXIuZ2V0Qml0cyg1KTsKKyAgICAgICAgICAgIHByZXNlbnRhdGlvbl92ZXJzaW9uID0gbUJpdFJlYWRlci5nZXRCaXRzKDUpOworICAgICAgICB9IGVsc2UgaWYgKGFjNF9kc2lfdmVyc2lvbiA9PSAxKSB7CisgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoOCArIDgpOworICAgICAgICAgICAgcHJlc2VudGF0aW9uX3ZlcnNpb24gPSBtQml0UmVhZGVyLmdldEJpdHMoOCk7CisgICAgICAgICAgICBwcmVzX2J5dGVzID0gbUJpdFJlYWRlci5nZXRCaXRzKDgpOworICAgICAgICAgICAgaWYgKHByZXNfYnl0ZXMgPT0gMHhmZikgeworICAgICAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCgxNik7CisgICAgICAgICAgICAgICAgcHJlc19ieXRlcyArPSBtQml0UmVhZGVyLmdldEJpdHMoMTYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQUxPR1YoIiV1OiBwcmVzX2J5dGVzID0gJXVcbiIsIHByZXNlbnRhdGlvbiwgcHJlc19ieXRlcyk7CisgICAgICAgICAgICBpZiAocHJlc2VudGF0aW9uX3ZlcnNpb24gPiAxKSB7CisgICAgICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKHByZXNfYnl0ZXMgKiA4KTsKKyAgICAgICAgICAgICAgICBtQml0UmVhZGVyLnNraXBCaXRzKHByZXNfYnl0ZXMgKiA4KTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGFjNF9wcmVzZW50YXRpb25fdjBfZHNpKCkgYW5kIGFjNF9wcmVzZW50YXRpb25fdjFfZHNpKCkgYm90aAorICAgICAgICAgICAgLy8gc3RhcnQgd2l0aCBhIHByZXNlbnRhdGlvbl9jb25maWcgb2YgNSBiaXRzCisgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoNSk7CisgICAgICAgICAgICBwcmVzZW50YXRpb25fY29uZmlnID0gbUJpdFJlYWRlci5nZXRCaXRzKDUpOworICAgICAgICAgICAgYl9zaW5nbGVfc3Vic3RyZWFtX2dyb3VwID0gKHByZXNlbnRhdGlvbl9jb25maWcgPT0gMHgxZik7CisgICAgICAgIH0KKworICAgICAgICBzdGF0aWMgY29uc3QgY2hhciAqUHJlc2VudGF0aW9uQ29uZmlnW10gPSB7CisgICAgICAgICAgICAiTXVzaWMmRWZmZWN0cyArIERpYWxvZyIsCisgICAgICAgICAgICAiTWFpbiArIERFIiwKKyAgICAgICAgICAgICJNYWluICsgQXNzb2NpYXRlIiwKKyAgICAgICAgICAgICJNdXNpYyZFZmZlY3RzICsgRGlhbG9nICsgQXNzb2NpYXRlIiwKKyAgICAgICAgICAgICJNYWluICsgREUgKyBBc3NvY2lhdGUiLAorICAgICAgICAgICAgIkFyYml0cmFyeSBzdWJzdHJlYW0gZ3JvdXBzIiwKKyAgICAgICAgICAgICJFTURGIG9ubHkiCisgICAgICAgIH07CisgICAgICAgIEFMT0dWKCIldTogYl9zaW5nbGVfc3Vic3RyZWFtL2dyb3VwID0gJXNcbiIsIHByZXNlbnRhdGlvbiwKKyAgICAgICAgICAgIEJPT0xTVFIoYl9zaW5nbGVfc3Vic3RyZWFtX2dyb3VwKSk7CisgICAgICAgIEFMT0dWKCIldTogcHJlc2VudGF0aW9uX3ZlcnNpb24gPSAldVxuIiwgcHJlc2VudGF0aW9uLCBwcmVzZW50YXRpb25fdmVyc2lvbik7CisgICAgICAgIEFMT0dWKCIldTogcHJlc2VudGF0aW9uX2NvbmZpZyA9ICV1ICglcylcbiIsIHByZXNlbnRhdGlvbiwgcHJlc2VudGF0aW9uX2NvbmZpZywKKyAgICAgICAgICAgIChwcmVzZW50YXRpb25fY29uZmlnID49IE5FTEVNKFByZXNlbnRhdGlvbkNvbmZpZykgPworICAgICAgICAgICAgInJlc2VydmVkIiA6IFByZXNlbnRhdGlvbkNvbmZpZ1twcmVzZW50YXRpb25fY29uZmlnXSkpOworCisgICAgICAgIC8qIHJlY29yZCBhIG1hcmtlciwgbGVzcyB0aGUgc2l6ZSBvZiB0aGUgcHJlc2VudGF0aW9uX2NvbmZpZyAqLworICAgICAgICB1aW50NjRfdCBzdGFydCA9IChtRFNJU2l6ZSAtIG1CaXRSZWFkZXIubnVtQml0c0xlZnQoKSkgLyA4OworCisgICAgICAgIGJvb2wgYl9hZGRfZW1kZl9zdWJzdHJlYW1zID0gZmFsc2U7CisgICAgICAgIGlmICghYl9zaW5nbGVfc3Vic3RyZWFtX2dyb3VwICYmIHByZXNlbnRhdGlvbl9jb25maWcgPT0gNikgeworICAgICAgICAgICAgYl9hZGRfZW1kZl9zdWJzdHJlYW1zID0gdHJ1ZTsKKyAgICAgICAgICAgIEFMT0dWKCIldTogYl9hZGRfZW1kZl9zdWJzdHJlYW1zID0gJXNcbiIsIHByZXNlbnRhdGlvbiwgQk9PTFNUUihiX2FkZF9lbWRmX3N1YnN0cmVhbXMpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCgzICsgMSk7CisgICAgICAgICAgICB1aW50MzJfdCBtZGNvbXBhdCA9IG1CaXRSZWFkZXIuZ2V0Qml0cygzKTsKKyAgICAgICAgICAgIEFMT0dWKCIldTogbWRjb21wYXQgPSAlZFxuIiwgcHJlc2VudGF0aW9uLCBtZGNvbXBhdCk7CisKKyAgICAgICAgICAgIGJvb2wgYl9wcmVzZW50YXRpb25fZ3JvdXBfaW5kZXggPSAobUJpdFJlYWRlci5nZXRCaXRzKDEpID09IDEpOworICAgICAgICAgICAgQUxPR1YoIiV1OiBiX3ByZXNlbnRhdGlvbl9ncm91cF9pbmRleCA9ICVzXG4iLCBwcmVzZW50YXRpb24sCisgICAgICAgICAgICAgICAgQk9PTFNUUihiX3ByZXNlbnRhdGlvbl9ncm91cF9pbmRleCkpOworICAgICAgICAgICAgaWYgKGJfcHJlc2VudGF0aW9uX2dyb3VwX2luZGV4KSB7CisgICAgICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDUpOworICAgICAgICAgICAgICAgIG1QcmVzZW50YXRpb25zW3ByZXNlbnRhdGlvbl0ubUdyb3VwSW5kZXggPSBtQml0UmVhZGVyLmdldEJpdHMoNSk7CisgICAgICAgICAgICAgICAgQUxPR1YoIiV1OiBwcmVzZW50YXRpb25fZ3JvdXBfaW5kZXggPSAlZFxuIiwgcHJlc2VudGF0aW9uLAorICAgICAgICAgICAgICAgICAgICBtUHJlc2VudGF0aW9uc1twcmVzZW50YXRpb25dLm1Hcm91cEluZGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCgyKTsKKyAgICAgICAgICAgIHVpbnQzMl90IGRzaV9mcmFtZV9yYXRlX211bHRpcGx5X2luZm8gPSBtQml0UmVhZGVyLmdldEJpdHMoMik7CisgICAgICAgICAgICBBTE9HVigiJXU6IGRzaV9mcmFtZV9yYXRlX211bHRpcGx5X2luZm8gPSAlZFxuIiwgcHJlc2VudGF0aW9uLAorICAgICAgICAgICAgICAgIGRzaV9mcmFtZV9yYXRlX211bHRpcGx5X2luZm8pOworICAgICAgICAgICAgaWYgKGFjNF9kc2lfdmVyc2lvbiA9PSAxICYmIHByZXNlbnRhdGlvbl92ZXJzaW9uID09IDEpIHsKKyAgICAgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoMik7CisgICAgICAgICAgICAgICAgdWludDMyX3QgZHNpX2ZyYW1lX3JhdGVfZnJhY3Rpb25faW5mbyA9IG1CaXRSZWFkZXIuZ2V0Qml0cygyKTsKKyAgICAgICAgICAgICAgICBBTE9HVigiJXU6IGRzaV9mcmFtZV9yYXRlX2ZyYWN0aW9uX2luZm8gPSAlZFxuIiwgcHJlc2VudGF0aW9uLAorICAgICAgICAgICAgICAgICAgICBkc2lfZnJhbWVfcmF0ZV9mcmFjdGlvbl9pbmZvKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCg1ICsgMTApOworICAgICAgICAgICAgdWludDMyX3QgcHJlc2VudGF0aW9uX2VtZGZfdmVyc2lvbiA9IG1CaXRSZWFkZXIuZ2V0Qml0cyg1KTsKKyAgICAgICAgICAgIHVpbnQzMl90IHByZXNlbnRhdGlvbl9rZXlfaWQgPSBtQml0UmVhZGVyLmdldEJpdHMoMTApOworICAgICAgICAgICAgQUxPR1YoIiV1OiBwcmVzZW50YXRpb25fZW1kZl92ZXJzaW9uID0gJWRcbiIsIHByZXNlbnRhdGlvbiwgcHJlc2VudGF0aW9uX2VtZGZfdmVyc2lvbik7CisgICAgICAgICAgICBBTE9HVigiJXU6IHByZXNlbnRhdGlvbl9rZXlfaWQgPSAlZFxuIiwgcHJlc2VudGF0aW9uLCBwcmVzZW50YXRpb25fa2V5X2lkKTsKKworICAgICAgICAgICAgaWYgKGFjNF9kc2lfdmVyc2lvbiA9PSAxKSB7CisgICAgICAgICAgICAgICAgYm9vbCBiX3ByZXNlbnRhdGlvbl9jaGFubmVsX2NvZGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgaWYgKHByZXNlbnRhdGlvbl92ZXJzaW9uID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgYl9wcmVzZW50YXRpb25fY2hhbm5lbF9jb2RlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDEpOworICAgICAgICAgICAgICAgICAgICBiX3ByZXNlbnRhdGlvbl9jaGFubmVsX2NvZGVkID0gKG1CaXRSZWFkZXIuZ2V0Qml0cygxKSA9PSAxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQUxPR1YoIiV1OiBiX3ByZXNlbnRhdGlvbl9jaGFubmVsX2NvZGVkID0gJXNcbiIsIHByZXNlbnRhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgQk9PTFNUUihiX3ByZXNlbnRhdGlvbl9jaGFubmVsX2NvZGVkKSk7CisgICAgICAgICAgICAgICAgaWYgKGJfcHJlc2VudGF0aW9uX2NoYW5uZWxfY29kZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHByZXNlbnRhdGlvbl92ZXJzaW9uID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCg1KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRzaV9wcmVzZW50YXRpb25fY2hfbW9kZSA9IG1CaXRSZWFkZXIuZ2V0Qml0cyg1KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1QcmVzZW50YXRpb25zW3ByZXNlbnRhdGlvbl0ubUNoYW5uZWxNb2RlID0gZHNpX3ByZXNlbnRhdGlvbl9jaF9tb2RlOworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIiV1OiBkc2lfcHJlc2VudGF0aW9uX2NoX21vZGUgPSAlZCAoJXMpXG4iLCBwcmVzZW50YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHNpX3ByZXNlbnRhdGlvbl9jaF9tb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzaV9wcmVzZW50YXRpb25fY2hfbW9kZSA8IE5FTEVNKENoYW5uZWxNb2RlcykgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYW5uZWxNb2Rlc1tkc2lfcHJlc2VudGF0aW9uX2NoX21vZGVdIDogInJlc2VydmVkIik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkc2lfcHJlc2VudGF0aW9uX2NoX21vZGUgPj0gMTEgJiYgZHNpX3ByZXNlbnRhdGlvbl9jaF9tb2RlIDw9IDE0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDEgKyAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVzX2JfNF9iYWNrX2NoYW5uZWxzX3ByZXNlbnQgPSBtQml0UmVhZGVyLmdldEJpdHMoMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlc190b3BfY2hhbm5lbF9wYWlycyA9IG1CaXRSZWFkZXIuZ2V0Qml0cygyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiJXU6IHByZXNfYl80X2JhY2tfY2hhbm5lbHNfcHJlc2VudCA9ICVzXG4iLCBwcmVzZW50YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0xTVFIocHJlc19iXzRfYmFja19jaGFubmVsc19wcmVzZW50KSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIiV1OiBwcmVzX3RvcF9jaGFubmVsX3BhaXJzID0gJWRcbiIsIHByZXNlbnRhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlc190b3BfY2hhbm5lbF9wYWlycyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gcHJlc2VudGF0aW9uX2NoYW5uZWxfbWFzayBpbiBhYzRfcHJlc2VudGF0aW9uX3YwX2RzaSgpCisgICAgICAgICAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCgyNCk7CisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZXNlbnRhdGlvbl9jaGFubmVsX21hc2tfdjEgPSBtQml0UmVhZGVyLmdldEJpdHMoMjQpOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiJXU6IHByZXNlbnRhdGlvbl9jaGFubmVsX21hc2tfdjEgPSAweCUwNnhcbiIsIHByZXNlbnRhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHByZXNlbnRhdGlvbl9jaGFubmVsX21hc2tfdjEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocHJlc2VudGF0aW9uX3ZlcnNpb24gPT0gMSkgeworICAgICAgICAgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoMSk7CisgICAgICAgICAgICAgICAgICAgIGJvb2wgYl9wcmVzZW50YXRpb25fY29yZV9kaWZmZXJzID0gKG1CaXRSZWFkZXIuZ2V0Qml0cygxKSA9PSAxKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIiV1OiBiX3ByZXNlbnRhdGlvbl9jb3JlX2RpZmZlcnMgPSAlc1xuIiwgcHJlc2VudGF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgQk9PTFNUUihiX3ByZXNlbnRhdGlvbl9jb3JlX2RpZmZlcnMpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJfcHJlc2VudGF0aW9uX2NvcmVfZGlmZmVycykgeworICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDEpOworICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiX3ByZXNlbnRhdGlvbl9jb3JlX2NoYW5uZWxfY29kZWQgPSAobUJpdFJlYWRlci5nZXRCaXRzKDEpID09IDEpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJfcHJlc2VudGF0aW9uX2NvcmVfY2hhbm5lbF9jb2RlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCgyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQml0UmVhZGVyLnNraXBCaXRzKDIpOyAvLyBkc2lfcHJlc2VudGF0aW9uX2NoYW5uZWxfbW9kZV9jb3JlCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDEpOworICAgICAgICAgICAgICAgICAgICBib29sIGJfcHJlc2VudGF0aW9uX2ZpbHRlciA9IChtQml0UmVhZGVyLmdldEJpdHMoMSkgPT0gMSk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIldTogYl9wcmVzZW50YXRpb25fZmlsdGVyID0gJXNcbiIsIHByZXNlbnRhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJPT0xTVFIoYl9wcmVzZW50YXRpb25fZmlsdGVyKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChiX3ByZXNlbnRhdGlvbl9maWx0ZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCgxICsgOCk7CisgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJfZW5hYmxlX3ByZXNlbnRhdGlvbiA9IChtQml0UmVhZGVyLmdldEJpdHMoMSkgPT0gMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWJfZW5hYmxlX3ByZXNlbnRhdGlvbikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QcmVzZW50YXRpb25zW3ByZXNlbnRhdGlvbl0ubUVuYWJsZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIldTogYl9lbmFibGVfcHJlc2VudGF0aW9uID0gJXNcbiIsIHByZXNlbnRhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MU1RSKGJfZW5hYmxlX3ByZXNlbnRhdGlvbikpOworICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgbl9maWx0ZXJfYnl0ZXMgPSBtQml0UmVhZGVyLmdldEJpdHMoOCk7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQobl9maWx0ZXJfYnl0ZXMgKiA4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBuX2ZpbHRlcl9ieXRlczsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJpdFJlYWRlci5za2lwQml0cyg4KTsgLy8gZmlsdGVyX2RhdGEKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gLyogYWM0X2RzaV92ZXJzaW9uID09IDEgKi8KKworICAgICAgICAgICAgaWYgKGJfc2luZ2xlX3N1YnN0cmVhbV9ncm91cCkgeworICAgICAgICAgICAgICAgIGlmIChwcmVzZW50YXRpb25fdmVyc2lvbiA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghcGFyc2VTdWJzdHJlYW1EU0kocHJlc2VudGF0aW9uLCAwKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXJzZVN1YnN0cmVhbUdyb3VwRFNJKHByZXNlbnRhdGlvbiwgMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGFjNF9kc2lfdmVyc2lvbiA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCgxKTsKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBiX211bHRpX3BpZCA9IChtQml0UmVhZGVyLmdldEJpdHMoMSkgPT0gMSk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIldTogYl9tdWx0aV9waWQgPSAlc1xuIiwgcHJlc2VudGF0aW9uLCBCT09MU1RSKGJfbXVsdGlfcGlkKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDEpOworICAgICAgICAgICAgICAgICAgICBib29sIGJfaHNmX2V4dCA9IChtQml0UmVhZGVyLmdldEJpdHMoMSkgPT0gMSk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIldTogYl9oc2ZfZXh0ID0gJXNcbiIsIHByZXNlbnRhdGlvbiwgQk9PTFNUUihiX2hzZl9leHQpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3dpdGNoIChwcmVzZW50YXRpb25fY29uZmlnKSB7CisgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgIGlmIChwcmVzZW50YXRpb25fdmVyc2lvbiA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcnNlU3Vic3RyZWFtRFNJKHByZXNlbnRhdGlvbiwgMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcnNlU3Vic3RyZWFtRFNJKHByZXNlbnRhdGlvbiwgMSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcnNlU3Vic3RyZWFtR3JvdXBEU0kocHJlc2VudGF0aW9uLCAwKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGFyc2VTdWJzdHJlYW1Hcm91cERTSShwcmVzZW50YXRpb24sIDEpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgICAgIGlmIChwcmVzZW50YXRpb25fdmVyc2lvbiA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcnNlU3Vic3RyZWFtRFNJKHByZXNlbnRhdGlvbiwgMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcnNlU3Vic3RyZWFtRFNJKHByZXNlbnRhdGlvbiwgMSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcnNlU3Vic3RyZWFtRFNJKHByZXNlbnRhdGlvbiwgMikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcnNlU3Vic3RyZWFtR3JvdXBEU0kocHJlc2VudGF0aW9uLCAwKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGFyc2VTdWJzdHJlYW1Hcm91cERTSShwcmVzZW50YXRpb24sIDEpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXJzZVN1YnN0cmVhbUdyb3VwRFNJKHByZXNlbnRhdGlvbiwgMikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgICAgICAgICBpZiAocHJlc2VudGF0aW9uX3ZlcnNpb24gPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXJzZVN1YnN0cmVhbURTSShwcmVzZW50YXRpb24sIDApKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDMpOworICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgbl9zdWJzdHJlYW1fZ3JvdXBzX21pbnVzMiA9IG1CaXRSZWFkZXIuZ2V0Qml0cygzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIldTogbl9zdWJzdHJlYW1fZ3JvdXBzX21pbnVzMiA9ICVkXG4iLCBwcmVzZW50YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbl9zdWJzdHJlYW1fZ3JvdXBzX21pbnVzMik7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHVpbnQzMl90IHNnID0gMDsgc2cgPCBuX3N1YnN0cmVhbV9ncm91cHNfbWludXMyICsgMjsgc2crKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGFyc2VTdWJzdHJlYW1Hcm91cERTSShwcmVzZW50YXRpb24sIHNnKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCg3KTsKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgbl9za2lwX2J5dGVzID0gbUJpdFJlYWRlci5nZXRCaXRzKDcpOworICAgICAgICAgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQobl9za2lwX2J5dGVzICogOCkKKyAgICAgICAgICAgICAgICAgICAgZm9yICh1aW50MzJfdCBqID0gMDsgaiA8IG5fc2tpcF9ieXRlczsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtQml0UmVhZGVyLmdldEJpdHMoOCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCgxICsgMSk7CisgICAgICAgICAgICAgICAgYm9vbCBiX3ByZV92aXJ0dWFsaXplZCA9IChtQml0UmVhZGVyLmdldEJpdHMoMSkgPT0gMSk7CisgICAgICAgICAgICAgICAgbVByZXNlbnRhdGlvbnNbcHJlc2VudGF0aW9uXS5tUHJlVmlydHVhbGl6ZWQgPSBiX3ByZV92aXJ0dWFsaXplZDsKKyAgICAgICAgICAgICAgICBiX2FkZF9lbWRmX3N1YnN0cmVhbXMgPSAobUJpdFJlYWRlci5nZXRCaXRzKDEpID09IDEpOworICAgICAgICAgICAgICAgIEFMT0dWKCIldTogYl9wcmVfdmlydHVhbGl6ZWQgPSAlc1xuIiwgcHJlc2VudGF0aW9uLCBCT09MU1RSKGJfcHJlX3ZpcnR1YWxpemVkKSk7CisgICAgICAgICAgICAgICAgQUxPR1YoIiV1OiBiX2FkZF9lbWRmX3N1YnN0cmVhbXMgPSAlc1xuIiwgcHJlc2VudGF0aW9uLAorICAgICAgICAgICAgICAgICAgICBCT09MU1RSKGJfYWRkX2VtZGZfc3Vic3RyZWFtcykpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChiX2FkZF9lbWRmX3N1YnN0cmVhbXMpIHsKKyAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCg3KTsKKyAgICAgICAgICAgIHVpbnQzMl90IG5fYWRkX2VtZGZfc3Vic3RyZWFtcyA9IG1CaXRSZWFkZXIuZ2V0Qml0cyg3KTsKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgaiA9IDA7IGogPCBuX2FkZF9lbWRmX3N1YnN0cmVhbXM7IGorKykgeworICAgICAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCg1ICsgMTApOworICAgICAgICAgICAgICAgIHVpbnQzMl90IHN1YnN0cmVhbV9lbWRmX3ZlcnNpb24gPSBtQml0UmVhZGVyLmdldEJpdHMoNSk7CisgICAgICAgICAgICAgICAgdWludDMyX3Qgc3Vic3RyZWFtX2tleV9pZCA9IG1CaXRSZWFkZXIuZ2V0Qml0cygxMCk7CisgICAgICAgICAgICAgICAgQUxPR1YoIiV1OiBlbWRmX3N1YnN0cmVhbVslZF06IHZlcnNpb249JWQsIGtleV9pZD0lZFxuIiwgcHJlc2VudGF0aW9uLCBqLAorICAgICAgICAgICAgICAgICAgICBzdWJzdHJlYW1fZW1kZl92ZXJzaW9uLCBzdWJzdHJlYW1fa2V5X2lkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGJvb2wgYl9wcmVzZW50YXRpb25fYml0cmF0ZV9pbmZvID0gZmFsc2U7CisgICAgICAgIGlmIChwcmVzZW50YXRpb25fdmVyc2lvbiA+IDApIHsKKyAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCgxKTsKKyAgICAgICAgICAgIGJfcHJlc2VudGF0aW9uX2JpdHJhdGVfaW5mbyA9IChtQml0UmVhZGVyLmdldEJpdHMoMSkgPT0gMSk7CisgICAgICAgIH0KKworICAgICAgICBBTE9HVigiYl9wcmVzZW50YXRpb25fYml0cmF0ZV9pbmZvID0gJXNcbiIsIEJPT0xTVFIoYl9wcmVzZW50YXRpb25fYml0cmF0ZV9pbmZvKSk7CisgICAgICAgIGlmIChiX3ByZXNlbnRhdGlvbl9iaXRyYXRlX2luZm8pIHsKKyAgICAgICAgICAgIGlmICghcGFyc2VCaXRyYXRlRHNpKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAocHJlc2VudGF0aW9uX3ZlcnNpb24gPiAwKSB7CisgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoMSk7CisgICAgICAgICAgICBib29sIGJfYWx0ZXJuYXRpdmUgPSAobUJpdFJlYWRlci5nZXRCaXRzKDEpID09IDEpOworICAgICAgICAgICAgQUxPR1YoImJfYWx0ZXJuYXRpdmUgPSAlc1xuIiwgQk9PTFNUUihiX2FsdGVybmF0aXZlKSk7CisgICAgICAgICAgICBpZiAoYl9hbHRlcm5hdGl2ZSkgeworICAgICAgICAgICAgICAgIEJZVEVfQUxJR047CisgICAgICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDE2KTsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBuYW1lX2xlbiA9IG1CaXRSZWFkZXIuZ2V0Qml0cygxNik7CisgICAgICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKG5hbWVfbGVuICogOCk7CisgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgJnByZXNlbnRhdGlvbl9uYW1lID0KKyAgICAgICAgICAgICAgICAgICAgbVByZXNlbnRhdGlvbnNbcHJlc2VudGF0aW9uXS5tRGVzY3JpcHRpb247CisgICAgICAgICAgICAgICAgcHJlc2VudGF0aW9uX25hbWUuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICBwcmVzZW50YXRpb25fbmFtZS5yZXNpemUobmFtZV9sZW4pOworICAgICAgICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBuYW1lX2xlbjsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHByZXNlbnRhdGlvbl9uYW1lW2ldID0gKGNoYXIpKG1CaXRSZWFkZXIuZ2V0Qml0cyg4KSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCg1KTsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBuX3RhcmdldHMgPSBtQml0UmVhZGVyLmdldEJpdHMoNSk7CisgICAgICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKG5fdGFyZ2V0cyAqICgzICsgOCkpOworICAgICAgICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBuX3RhcmdldHM7IGkrKyl7CisgICAgICAgICAgICAgICAgICAgIG1CaXRSZWFkZXIuc2tpcEJpdHMoMyk7IC8vIHRhcmdldF9tZF9jb21wYXQKKyAgICAgICAgICAgICAgICAgICAgbUJpdFJlYWRlci5za2lwQml0cyg4KTsgLy8gdGFyZ2V0X2RldmljZV9jYXRlZ29yeQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEJZVEVfQUxJR047CisKKyAgICAgICAgaWYgKGFjNF9kc2lfdmVyc2lvbiA9PSAxKSB7CisgICAgICAgICAgICB1aW50NjRfdCBlbmQgPSAobURTSVNpemUgLSBtQml0UmVhZGVyLm51bUJpdHNMZWZ0KCkpIC8gODsKKyAgICAgICAgICAgIGlmIChtQml0UmVhZGVyLm51bUJpdHNMZWZ0KCkgJSA4ICE9IDApIHsKKyAgICAgICAgICAgICAgICBlbmQgKz0gMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdWludDY0X3QgcHJlc2VudGF0aW9uX2J5dGVzID0gZW5kIC0gc3RhcnQ7CisgICAgICAgICAgICB1aW50NjRfdCBza2lwX2J5dGVzID0gcHJlc19ieXRlcyAtIHByZXNlbnRhdGlvbl9ieXRlczsKKyAgICAgICAgICAgIEFMT0dWKCJza2lwcGluZyA9ICUiIFBSSXU2NCAiIGJ5dGVzIiwgc2tpcF9ieXRlcyk7CisgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoc2tpcF9ieXRlcyAqIDgpOworICAgICAgICAgICAgbUJpdFJlYWRlci5za2lwQml0cyhza2lwX2J5dGVzICogOCk7CisgICAgICAgIH0KKworICAgICAgICAvLyB3ZSBzaG91bGQga25vdyB0aGlzIG9yIHNvbWV0aGluZyBpcyBwcm9iYWJseSB3cm9uZworICAgICAgICAvLyB3aXRoIHRoZSBiaXRzdHJlYW0gKG9yIHdlIGRvbid0IHN1cHBvcnQgaXQpCisgICAgICAgIGlmIChtUHJlc2VudGF0aW9uc1twcmVzZW50YXRpb25dLm1DaGFubmVsTW9kZSA9PSAtMSl7CisgICAgICAgICAgICBBTE9HRSgiY291bGQgbm90IGRldGVybWluZyBjaGFubmVsIG1vZGUgb2YgcHJlc2VudGF0aW9uICVkIiwgcHJlc2VudGF0aW9uKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0gLyogZWFjaCBwcmVzZW50YXRpb24gKi8KKworICAgIHJldHVybiB0cnVlOworfQorCit9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcDQvQUM0UGFyc2VyLmggYi9tZWRpYS9leHRyYWN0b3JzL21wNC9BQzRQYXJzZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43M2I2ZTMxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvQUM0UGFyc2VyLmgKQEAgLTAsMCArMSwxMDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFDNF9QQVJTRVJfSF8KKyNkZWZpbmUgQUM0X1BBUlNFUl9IXworCisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQml0UmVhZGVyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgQUM0UGFyc2VyIHsKK3B1YmxpYzoKKyAgICBBQzRQYXJzZXIoKTsKKyAgICB2aXJ0dWFsIH5BQzRQYXJzZXIoKSB7IH0KKworICAgIHZpcnR1YWwgYm9vbCBwYXJzZSgpID0gMDsKKworICAgIHN0cnVjdCBBQzRQcmVzZW50YXRpb24geworICAgICAgICBpbnQzMl90IG1DaGFubmVsTW9kZSA9IC0xOworICAgICAgICBpbnQzMl90IG1Qcm9ncmFtSUQgPSAtMTsKKyAgICAgICAgaW50MzJfdCBtR3JvdXBJbmRleCA9IC0xOworCisgICAgICAgIC8vIFRTIDEwMyAxOTAtMSB2MS4yLjEgNC4zLjMuOC4xCisgICAgICAgIGVudW0gQ29udGVudENsYXNzaWZpZXJzIHsKKyAgICAgICAgICAgIGtDb21wbGV0ZU1haW4sCisgICAgICAgICAgICBrTXVzaWNBbmRFZmZlY3RzLAorICAgICAgICAgICAga1Zpc3VhbGx5SW1wYWlyZWQsCisgICAgICAgICAgICBrSGVhcmluZ0ltcGFpcmVkLAorICAgICAgICAgICAga0RpYWxvZywKKyAgICAgICAgICAgIGtDb21tZW50YXJ5LAorICAgICAgICAgICAga0VtZXJnZW5jeSwKKyAgICAgICAgICAgIGtWb2ljZU92ZXIKKyAgICAgICAgfTsKKworICAgICAgICB1aW50MzJfdCBtQ29udGVudENsYXNzaWZpZXIgPSBrQ29tcGxldGVNYWluOworCisgICAgICAgIC8vIEVUU0kgVFMgMTAzIDE5MC0yIFYxLjEuMSAoMjAxNS0wOSkgVGFibGUgNzk6IGNoYW5uZWxfbW9kZQorICAgICAgICBlbnVtIElucHV0Q2hhbm5lbE1vZGUgeworICAgICAgICAgICAga0NoYW5uZWxNb2RlX01vbm8sCisgICAgICAgICAgICBrQ2hhbm5lbE1vZGVfU3RlcmVvLAorICAgICAgICAgICAga0NoYW5uZWxNb2RlXzNfMCwKKyAgICAgICAgICAgIGtDaGFubmVsTW9kZV81XzAsCisgICAgICAgICAgICBrQ2hhbm5lbE1vZGVfNV8xLAorICAgICAgICAgICAga0NoYW5uZWxNb2RlXzdfMF8zNCwKKyAgICAgICAgICAgIGtDaGFubmVsTW9kZV83XzFfMzQsCisgICAgICAgICAgICBrQ2hhbm5lbE1vZGVfN18wXzUyLAorICAgICAgICAgICAga0NoYW5uZWxNb2RlXzdfMV81MiwKKyAgICAgICAgICAgIGtDaGFubmVsTW9kZV83XzBfMzIyLAorICAgICAgICAgICAga0NoYW5uZWxNb2RlXzdfMV8zMjIsCisgICAgICAgICAgICBrQ2hhbm5lbE1vZGVfN18wXzQsCisgICAgICAgICAgICBrQ2hhbm5lbE1vZGVfN18xXzQsCisgICAgICAgICAgICBrQ2hhbm5lbE1vZGVfOV8wXzQsCisgICAgICAgICAgICBrQ2hhbm5lbE1vZGVfOV8xXzQsCisgICAgICAgICAgICBrQ2hhbm5lbE1vZGVfMjJfMiwKKyAgICAgICAgICAgIGtDaGFubmVsTW9kZV9SZXNlcnZlZCwKKyAgICAgICAgfTsKKworICAgICAgICBib29sIG1IYXNEaWFsb2dFbmhhbmNlbWVudHMgPSBmYWxzZTsKKyAgICAgICAgYm9vbCBtUHJlVmlydHVhbGl6ZWQgPSBmYWxzZTsKKyAgICAgICAgYm9vbCBtRW5hYmxlZCA9IHRydWU7CisKKyAgICAgICAgc3RkOjpzdHJpbmcgbUxhbmd1YWdlOworICAgICAgICBzdGQ6OnN0cmluZyBtRGVzY3JpcHRpb247CisgICAgfTsKKyAgICB0eXBlZGVmIHN0ZDo6bWFwPHVpbnQzMl90LCBBQzRQcmVzZW50YXRpb24+IEFDNFByZXNlbnRhdGlvbnM7CisKKyAgICBjb25zdCBBQzRQcmVzZW50YXRpb25zJiBnZXRQcmVzZW50YXRpb25zKCkgY29uc3QgeyByZXR1cm4gbVByZXNlbnRhdGlvbnM7IH0KKworcHJvdGVjdGVkOgorICAgIEFDNFByZXNlbnRhdGlvbnMgbVByZXNlbnRhdGlvbnM7Cit9OworCitjbGFzcyBBQzREU0lQYXJzZXI6IHB1YmxpYyBBQzRQYXJzZXIgeworcHVibGljOgorICAgIGV4cGxpY2l0IEFDNERTSVBhcnNlcihBQml0UmVhZGVyICZicik7CisgICAgdmlydHVhbCB+QUM0RFNJUGFyc2VyKCkgeyB9CisKKyAgICBib29sIHBhcnNlKCk7CisKK3ByaXZhdGU6CisgICAgYm9vbCBwYXJzZVN1YnN0cmVhbURTSSh1aW50MzJfdCBwcmVzZW50YXRpb25JRCwgdWludDMyX3Qgc3Vic3RyZWFtSUQpOworICAgIGJvb2wgcGFyc2VTdWJzdHJlYW1Hcm91cERTSSh1aW50MzJfdCBwcmVzZW50YXRpb25JRCwgdWludDMyX3QgZ3JvdXBJRCk7CisgICAgYm9vbCBwYXJzZUxhbmd1YWdlVGFnKHVpbnQzMl90IHByZXNlbnRhdGlvbklELCB1aW50MzJfdCBzdWJzdHJlYW1JRCk7CisgICAgYm9vbCBwYXJzZUJpdHJhdGVEc2koKTsKKworICAgIHVpbnQ2NF90IG1EU0lTaXplOworICAgIEFCaXRSZWFkZXImIG1CaXRSZWFkZXI7Cit9OworCit9OworCisjZW5kaWYgIC8vIEFDNF9QQVJTRVJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXA0L0FuZHJvaWQuYnAgYi9tZWRpYS9leHRyYWN0b3JzL21wNC9BbmRyb2lkLmJwCmluZGV4IGZhNzM5ZTguLjQ3ZGM3MTggMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvbXA0L0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvQW5kcm9pZC5icApAQCAtMiw2ICsyLDcgQEAKICAgICBuYW1lOiAibGlibXA0ZXh0cmFjdG9yX2RlZmF1bHRzIiwKIAogICAgIHNyY3M6IFsKKyAgICAgICAgIkFDNFBhcnNlci5jcHAiLAogICAgICAgICAiSXRlbVRhYmxlLmNwcCIsCiAgICAgICAgICJNUEVHNEV4dHJhY3Rvci5jcHAiLAogICAgICAgICAiU2FtcGxlSXRlcmF0b3IuY3BwIiwKQEAgLTE1LDYgKzE2LDcgQEAKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGlibG9nIiwKICAgICAgICAgImxpYm1lZGlhZXh0cmFjdG9yIiwKKyAgICAgICAgImxpYm1lZGlhbmRrIgogICAgIF0sCiAKICAgICBzdGF0aWNfbGliczogWwpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcDQvSXRlbVRhYmxlLmNwcCBiL21lZGlhL2V4dHJhY3RvcnMvbXA0L0l0ZW1UYWJsZS5jcHAKaW5kZXggY2E5ZGVhYi4uNTVhMGM0NyAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9tcDQvSXRlbVRhYmxlLmNwcAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wNC9JdGVtVGFibGUuY3BwCkBAIC0xOCw3ICsxOCw4IEBACiAjZGVmaW5lIExPR19UQUcgIkl0ZW1UYWJsZSIKIAogI2luY2x1ZGUgPEl0ZW1UYWJsZS5oPgotI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2VCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5BcGkuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KQEAgLTkyLDcgKzkzLDcgQEAKIAogc3RydWN0IEJveCB7CiBwcm90ZWN0ZWQ6Ci0gICAgQm94KERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIHVpbnQzMl90IHR5cGUpIDoKKyAgICBCb3goRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLCB1aW50MzJfdCB0eXBlKSA6CiAgICAgICAgIG1EYXRhU291cmNlKHNvdXJjZSksIG1UeXBlKHR5cGUpIHt9CiAKICAgICB2aXJ0dWFsIH5Cb3goKSB7fQpAQCAtMTA0LDE0ICsxMDUsMTQgQEAKIAogICAgIGlubGluZSB1aW50MzJfdCB0eXBlKCkgY29uc3QgeyByZXR1cm4gbVR5cGU7IH0KIAotICAgIGlubGluZSBEYXRhU291cmNlQmFzZSAqc291cmNlKCkgY29uc3QgeyByZXR1cm4gbURhdGFTb3VyY2U7IH0KKyAgICBpbmxpbmUgRGF0YVNvdXJjZUhlbHBlciAqc291cmNlKCkgY29uc3QgeyByZXR1cm4gbURhdGFTb3VyY2U7IH0KIAogICAgIHN0YXR1c190IHBhcnNlQ2h1bmsob2ZmNjRfdCAqb2Zmc2V0KTsKIAogICAgIHN0YXR1c190IHBhcnNlQ2h1bmtzKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSk7CiAKIHByaXZhdGU6Ci0gICAgRGF0YVNvdXJjZUJhc2UgKm1EYXRhU291cmNlOworICAgIERhdGFTb3VyY2VIZWxwZXIgKm1EYXRhU291cmNlOwogICAgIHVpbnQzMl90IG1UeXBlOwogfTsKIApAQCAtMTg2LDcgKzE4Nyw3IEBACiAKIHN0cnVjdCBGdWxsQm94IDogcHVibGljIEJveCB7CiBwcm90ZWN0ZWQ6Ci0gICAgRnVsbEJveChEYXRhU291cmNlQmFzZSAqc291cmNlLCB1aW50MzJfdCB0eXBlKSA6CisgICAgRnVsbEJveChEYXRhU291cmNlSGVscGVyICpzb3VyY2UsIHVpbnQzMl90IHR5cGUpIDoKICAgICAgICAgQm94KHNvdXJjZSwgdHlwZSksIG1WZXJzaW9uKDApLCBtRmxhZ3MoMCkge30KIAogICAgIGlubGluZSB1aW50OF90IHZlcnNpb24oKSBjb25zdCB7IHJldHVybiBtVmVyc2lvbjsgfQpAQCAtMjIxLDcgKzIyMiw3IEBACiAvLwogCiBzdHJ1Y3QgUGl0bUJveCA6IHB1YmxpYyBGdWxsQm94IHsKLSAgICBQaXRtQm94KERhdGFTb3VyY2VCYXNlICpzb3VyY2UpIDoKKyAgICBQaXRtQm94KERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSkgOgogICAgICAgICBGdWxsQm94KHNvdXJjZSwgRk9VUkNDKCdwJywgJ2knLCAndCcsICdtJykpIHt9CiAKICAgICBzdGF0dXNfdCBwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUsIHVpbnQzMl90ICpwcmltYXJ5SXRlbUlkKTsKQEAgLTMwMSw3ICszMDIsNyBAQAogfTsKIAogc3RydWN0IElsb2NCb3ggOiBwdWJsaWMgRnVsbEJveCB7Ci0gICAgSWxvY0JveChEYXRhU291cmNlQmFzZSAqc291cmNlLCBLZXllZFZlY3Rvcjx1aW50MzJfdCwgSXRlbUxvYz4gKml0ZW1Mb2NzKSA6CisgICAgSWxvY0JveChEYXRhU291cmNlSGVscGVyICpzb3VyY2UsIEtleWVkVmVjdG9yPHVpbnQzMl90LCBJdGVtTG9jPiAqaXRlbUxvY3MpIDoKICAgICAgICAgRnVsbEJveChzb3VyY2UsIEZPVVJDQygnaScsICdsJywgJ28nLCAnYycpKSwKICAgICAgICAgbUl0ZW1Mb2NzKGl0ZW1Mb2NzKSwgbUhhc0NvbnN0cnVjdE1ldGhvZDEoZmFsc2UpIHt9CiAKQEAgLTQ3MSw3ICs0NzIsNyBAQAogLy8KIAogc3RydWN0IEl0ZW1SZWZlcmVuY2UgOiBwdWJsaWMgQm94LCBwdWJsaWMgUmVmQmFzZSB7Ci0gICAgSXRlbVJlZmVyZW5jZShEYXRhU291cmNlQmFzZSAqc291cmNlLCB1aW50MzJfdCB0eXBlLCB1aW50MzJfdCBpdGVtSWRTaXplKSA6CisgICAgSXRlbVJlZmVyZW5jZShEYXRhU291cmNlSGVscGVyICpzb3VyY2UsIHVpbnQzMl90IHR5cGUsIHVpbnQzMl90IGl0ZW1JZFNpemUpIDoKICAgICAgICAgQm94KHNvdXJjZSwgdHlwZSksIG1JdGVtSWQoMCksIG1SZWZJZFNpemUoaXRlbUlkU2l6ZSkge30KIAogICAgIHN0YXR1c190IHBhcnNlKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSk7CkBAIC02MjYsNyArNjI3LDcgQEAKIH0KIAogc3RydWN0IElyZWZCb3ggOiBwdWJsaWMgRnVsbEJveCB7Ci0gICAgSXJlZkJveChEYXRhU291cmNlQmFzZSAqc291cmNlLCBWZWN0b3I8c3A8SXRlbVJlZmVyZW5jZT4gPiAqaXRlbVJlZnMpIDoKKyAgICBJcmVmQm94KERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwgVmVjdG9yPHNwPEl0ZW1SZWZlcmVuY2U+ID4gKml0ZW1SZWZzKSA6CiAgICAgICAgIEZ1bGxCb3goc291cmNlLCBGT1VSQ0MoJ2knLCAncicsICdlJywgJ2YnKSksIG1SZWZJZFNpemUoMCksIG1JdGVtUmVmcyhpdGVtUmVmcykge30KIAogICAgIHN0YXR1c190IHBhcnNlKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSk7CkBAIC02ODgsNyArNjg5LDcgQEAKIH07CiAKIHN0cnVjdCBJc3BlQm94IDogcHVibGljIEZ1bGxCb3gsIHB1YmxpYyBJdGVtUHJvcGVydHkgewotICAgIElzcGVCb3goRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSkgOgorICAgIElzcGVCb3goRGF0YVNvdXJjZUhlbHBlciAqc291cmNlKSA6CiAgICAgICAgIEZ1bGxCb3goc291cmNlLCBGT1VSQ0MoJ2knLCAncycsICdwJywgJ2UnKSksIG1XaWR0aCgwKSwgbUhlaWdodCgwKSB7fQogCiAgICAgc3RhdHVzX3QgcGFyc2Uob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSBvdmVycmlkZTsKQEAgLTcyNCw3ICs3MjUsNyBAQAogfQogCiBzdHJ1Y3QgSHZjY0JveCA6IHB1YmxpYyBCb3gsIHB1YmxpYyBJdGVtUHJvcGVydHkgewotICAgIEh2Y2NCb3goRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSkgOgorICAgIEh2Y2NCb3goRGF0YVNvdXJjZUhlbHBlciAqc291cmNlKSA6CiAgICAgICAgIEJveChzb3VyY2UsIEZPVVJDQygnaCcsICd2JywgJ2MnLCAnQycpKSB7fQogCiAgICAgc3RhdHVzX3QgcGFyc2Uob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSBvdmVycmlkZTsKQEAgLTc1Nyw3ICs3NTgsNyBAQAogfQogCiBzdHJ1Y3QgSXJvdEJveCA6IHB1YmxpYyBCb3gsIHB1YmxpYyBJdGVtUHJvcGVydHkgewotICAgIElyb3RCb3goRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSkgOgorICAgIElyb3RCb3goRGF0YVNvdXJjZUhlbHBlciAqc291cmNlKSA6CiAgICAgICAgIEJveChzb3VyY2UsIEZPVVJDQygnaScsICdyJywgJ28nLCAndCcpKSwgbUFuZ2xlKDApIHt9CiAKICAgICBzdGF0dXNfdCBwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIG92ZXJyaWRlOwpAQCAtNzg2LDcgKzc4Nyw3IEBACiB9CiAKIHN0cnVjdCBDb2xyQm94IDogcHVibGljIEJveCwgcHVibGljIEl0ZW1Qcm9wZXJ0eSB7Ci0gICAgQ29sckJveChEYXRhU291cmNlQmFzZSAqc291cmNlKSA6CisgICAgQ29sckJveChEYXRhU291cmNlSGVscGVyICpzb3VyY2UpIDoKICAgICAgICAgQm94KHNvdXJjZSwgRk9VUkNDKCdjJywgJ28nLCAnbCcsICdyJykpIHt9CiAKICAgICBzdGF0dXNfdCBwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIG92ZXJyaWRlOwpAQCAtODM0LDcgKzgzNSw3IEBACiB9CiAKIHN0cnVjdCBJcG1hQm94IDogcHVibGljIEZ1bGxCb3ggewotICAgIElwbWFCb3goRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgVmVjdG9yPEFzc29jaWF0aW9uRW50cnk+ICphc3NvY2lhdGlvbnMpIDoKKyAgICBJcG1hQm94KERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwgVmVjdG9yPEFzc29jaWF0aW9uRW50cnk+ICphc3NvY2lhdGlvbnMpIDoKICAgICAgICAgRnVsbEJveChzb3VyY2UsIEZPVVJDQygnaScsICdwJywgJ20nLCAnYScpKSwgbUFzc29jaWF0aW9ucyhhc3NvY2lhdGlvbnMpIHt9CiAKICAgICBzdGF0dXNfdCBwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpOwpAQCAtOTA4LDcgKzkwOSw3IEBACiB9CiAKIHN0cnVjdCBJcGNvQm94IDogcHVibGljIEJveCB7Ci0gICAgSXBjb0JveChEYXRhU291cmNlQmFzZSAqc291cmNlLCBWZWN0b3I8c3A8SXRlbVByb3BlcnR5PiA+ICpwcm9wZXJ0aWVzKSA6CisgICAgSXBjb0JveChEYXRhU291cmNlSGVscGVyICpzb3VyY2UsIFZlY3RvcjxzcDxJdGVtUHJvcGVydHk+ID4gKnByb3BlcnRpZXMpIDoKICAgICAgICAgQm94KHNvdXJjZSwgRk9VUkNDKCdpJywgJ3AnLCAnYycsICdvJykpLCBtSXRlbVByb3BlcnRpZXMocHJvcGVydGllcykge30KIAogICAgIHN0YXR1c190IHBhcnNlKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSk7CkBAIC05NjUsNyArOTY2LDcgQEAKIH0KIAogc3RydWN0IElwcnBCb3ggOiBwdWJsaWMgQm94IHsKLSAgICBJcHJwQm94KERhdGFTb3VyY2VCYXNlICpzb3VyY2UsCisgICAgSXBycEJveChEYXRhU291cmNlSGVscGVyICpzb3VyY2UsCiAgICAgICAgICAgICBWZWN0b3I8c3A8SXRlbVByb3BlcnR5PiA+ICpwcm9wZXJ0aWVzLAogICAgICAgICAgICAgVmVjdG9yPEFzc29jaWF0aW9uRW50cnk+ICphc3NvY2lhdGlvbnMpIDoKICAgICAgICAgQm94KHNvdXJjZSwgRk9VUkNDKCdpJywgJ3AnLCAncicsICdwJykpLApAQCAtMTAyMiw3ICsxMDIzLDcgQEAKIH07CiAKIHN0cnVjdCBJbmZlQm94IDogcHVibGljIEZ1bGxCb3ggewotICAgIEluZmVCb3goRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSkgOgorICAgIEluZmVCb3goRGF0YVNvdXJjZUhlbHBlciAqc291cmNlKSA6CiAgICAgICAgIEZ1bGxCb3goc291cmNlLCBGT1VSQ0MoJ2knLCAnbicsICdmJywgJ2UnKSkge30KIAogICAgIHN0YXR1c190IHBhcnNlKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwgSXRlbUluZm8gKml0ZW1JbmZvKTsKQEAgLTExMjcsNyArMTEyOCw3IEBACiB9CiAKIHN0cnVjdCBJaW5mQm94IDogcHVibGljIEZ1bGxCb3ggewotICAgIElpbmZCb3goRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgVmVjdG9yPEl0ZW1JbmZvPiAqaXRlbUluZm9zKSA6CisgICAgSWluZkJveChEYXRhU291cmNlSGVscGVyICpzb3VyY2UsIFZlY3RvcjxJdGVtSW5mbz4gKml0ZW1JbmZvcykgOgogICAgICAgICBGdWxsQm94KHNvdXJjZSwgRk9VUkNDKCdpJywgJ2knLCAnbicsICdmJykpLAogICAgICAgICBtSXRlbUluZm9zKGl0ZW1JbmZvcyksIG1IYXNHcmlkcyhmYWxzZSkge30KIApAQCAtMTE5Niw3ICsxMTk3LDcgQEAKIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKLUl0ZW1UYWJsZTo6SXRlbVRhYmxlKERhdGFTb3VyY2VCYXNlICpzb3VyY2UpCitJdGVtVGFibGU6Okl0ZW1UYWJsZShEYXRhU291cmNlSGVscGVyICpzb3VyY2UpCiAgICAgOiBtRGF0YVNvdXJjZShzb3VyY2UpLAogICAgICAgbVByaW1hcnlJdGVtSWQoMCksCiAgICAgICBtSWRhdE9mZnNldCgwKSwKQEAgLTE0NzYsNyArMTQ3Nyw3IEBACiAgICAgcmV0dXJuIG1JbWFnZUl0ZW1zVmFsaWQgPyBtRGlzcGxheWFibGVzLnNpemUoKSA6IDA7CiB9CiAKLXNwPE1ldGFEYXRhPiBJdGVtVGFibGU6OmdldEltYWdlTWV0YShjb25zdCB1aW50MzJfdCBpbWFnZUluZGV4KSB7CitBTWVkaWFGb3JtYXQgKkl0ZW1UYWJsZTo6Z2V0SW1hZ2VNZXRhKGNvbnN0IHVpbnQzMl90IGltYWdlSW5kZXgpIHsKICAgICBpZiAoIW1JbWFnZUl0ZW1zVmFsaWQpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQpAQCAtMTUwMSw2NCArMTUwMiw3OSBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgc3A8TWV0YURhdGE+IG1ldGEgPSBuZXcgTWV0YURhdGE7Ci0gICAgbWV0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0lNQUdFX0FORFJPSURfSEVJQyk7CisgICAgQU1lZGlhRm9ybWF0ICptZXRhID0gQU1lZGlhRm9ybWF0X25ldygpOworICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9JTUFHRV9BTkRST0lEX0hFSUMpOwogCiAgICAgaWYgKGltYWdlLT5pdGVtSWQgPT0gbVByaW1hcnlJdGVtSWQpIHsKLSAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleVRyYWNrSXNEZWZhdWx0LCAxKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfSVNfREVGQVVMVCwgMSk7CiAgICAgfQogCiAgICAgQUxPR1YoImltYWdlWyV1XTogc2l6ZSAlZHglZCIsIGltYWdlSW5kZXgsIGltYWdlLT53aWR0aCwgaW1hZ2UtPmhlaWdodCk7CiAKLSAgICBtZXRhLT5zZXRJbnQzMihrS2V5V2lkdGgsIGltYWdlLT53aWR0aCk7Ci0gICAgbWV0YS0+c2V0SW50MzIoa0tleUhlaWdodCwgaW1hZ2UtPmhlaWdodCk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfV0lEVEgsIGltYWdlLT53aWR0aCk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfSEVJR0hULCBpbWFnZS0+aGVpZ2h0KTsKICAgICBpZiAoaW1hZ2UtPnJvdGF0aW9uICE9IDApIHsKICAgICAgICAgLy8gUm90YXRpb24gYW5nbGUgaW4gSEVJRiBpcyBDQ1csIGNvbnZlcnQgdG8gQ1cgaGVyZSB0byBiZQogICAgICAgICAvLyBjb25zaXN0ZW50IHdpdGggdGhlIG90aGVyIG1lZGlhIGZvcm1hdHMuCiAgICAgICAgIHN3aXRjaChpbWFnZS0+cm90YXRpb24pIHsKLSAgICAgICAgICAgIGNhc2UgOTA6IG1ldGEtPnNldEludDMyKGtLZXlSb3RhdGlvbiwgMjcwKTsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDE4MDogbWV0YS0+c2V0SW50MzIoa0tleVJvdGF0aW9uLCAxODApOyBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMjcwOiBtZXRhLT5zZXRJbnQzMihrS2V5Um90YXRpb24sIDkwKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDkwOgorICAgICAgICAgICAgY2FzZSAxODA6CisgICAgICAgICAgICBjYXNlIDI3MDoKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9ST1RBVElPTiwgMzYwIC0gaW1hZ2UtPnJvdGF0aW9uKTsKKyAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrOyAvLyBkb24ndCBzZXQgaWYgaW52YWxpZAogICAgICAgICB9CiAgICAgfQotICAgIG1ldGEtPnNldEludDMyKGtLZXlNYXhJbnB1dFNpemUsIGltYWdlLT53aWR0aCAqIGltYWdlLT5oZWlnaHQgKiAxLjUpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLAorICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NQVhfSU5QVVRfU0laRSwgaW1hZ2UtPndpZHRoICogaW1hZ2UtPmhlaWdodCAqIDEuNSk7CiAKICAgICBpZiAoIWltYWdlLT50aHVtYm5haWxzLmVtcHR5KCkpIHsKICAgICAgICAgc3NpemVfdCB0aHVtYkl0ZW1JbmRleCA9IG1JdGVtSWRUb0l0ZW1NYXAuaW5kZXhPZktleShpbWFnZS0+dGh1bWJuYWlsc1swXSk7CiAgICAgICAgIGlmICh0aHVtYkl0ZW1JbmRleCA+PSAwKSB7CiAgICAgICAgICAgICBjb25zdCBJbWFnZUl0ZW0gJnRodW1ibmFpbCA9IG1JdGVtSWRUb0l0ZW1NYXBbdGh1bWJJdGVtSW5kZXhdOwogCi0gICAgICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5VGh1bWJuYWlsV2lkdGgsIHRodW1ibmFpbC53aWR0aCk7Ci0gICAgICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5VGh1bWJuYWlsSGVpZ2h0LCB0aHVtYm5haWwuaGVpZ2h0KTsKLSAgICAgICAgICAgIG1ldGEtPnNldERhdGEoa0tleVRodW1ibmFpbEhWQ0MsIGtUeXBlSFZDQywKLSAgICAgICAgICAgICAgICAgICAgdGh1bWJuYWlsLmh2Y2MtPmRhdGEoKSwgdGh1bWJuYWlsLmh2Y2MtPnNpemUoKSk7Ci0gICAgICAgICAgICBBTE9HVigiaW1hZ2VbJXVdOiB0aHVtYm5haWw6IHNpemUgJWR4JWQsIGl0ZW0gaW5kZXggJXpkIiwKLSAgICAgICAgICAgICAgICAgICAgaW1hZ2VJbmRleCwgdGh1bWJuYWlsLndpZHRoLCB0aHVtYm5haWwuaGVpZ2h0LCB0aHVtYkl0ZW1JbmRleCk7CisgICAgICAgICAgICBpZiAodGh1bWJuYWlsLmh2Y2MgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9USFVNQk5BSUxfV0lEVEgsIHRodW1ibmFpbC53aWR0aCk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX1RIVU1CTkFJTF9IRUlHSFQsIHRodW1ibmFpbC5oZWlnaHQpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQ1NEX0hFVkMsIHRodW1ibmFpbC5odmNjLT5kYXRhKCksIHRodW1ibmFpbC5odmNjLT5zaXplKCkpOworICAgICAgICAgICAgICAgIEFMT0dWKCJpbWFnZVsldV06IHRodW1ibmFpbDogc2l6ZSAlZHglZCwgaXRlbSBpbmRleCAlemQiLAorICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VJbmRleCwgdGh1bWJuYWlsLndpZHRoLCB0aHVtYm5haWwuaGVpZ2h0LCB0aHVtYkl0ZW1JbmRleCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dXKCIlczogdGh1bWJuYWlsIGRhdGEgaXMgbWlzc2luZyBmb3IgaW1hZ2VbJXVdISIsIF9fRlVOQ1RJT05fXywgaW1hZ2VJbmRleCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBBTE9HVygiJXM6IFJlZmVyZW5jZWQgdGh1bWJuYWlsIGRvZXMgbm90IGV4aXN0ISIsIF9fRlVOQ1RJT05fXyk7CiAgICAgICAgIH0KICAgICB9CiAKICAgICBpZiAoaW1hZ2UtPmlzR3JpZCgpKSB7Ci0gICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlHcmlkUm93cywgaW1hZ2UtPnJvd3MpOwotICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5R3JpZENvbHMsIGltYWdlLT5jb2x1bW5zKTsKLQorICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwKKyAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0dSSURfUk9XUywgaW1hZ2UtPnJvd3MpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwKKyAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0dSSURfQ09MVU1OUywgaW1hZ2UtPmNvbHVtbnMpOwogICAgICAgICAvLyBwb2ludCBpbWFnZSB0byB0aGUgZmlyc3QgdGlsZSBmb3IgZ3JpZCBzaXplIGFuZCBIVkNDCiAgICAgICAgIGltYWdlID0gJm1JdGVtSWRUb0l0ZW1NYXAuZWRpdFZhbHVlQXQodGlsZUl0ZW1JbmRleCk7Ci0gICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlUaWxlV2lkdGgsIGltYWdlLT53aWR0aCk7Ci0gICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlUaWxlSGVpZ2h0LCBpbWFnZS0+aGVpZ2h0KTsKLSAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleU1heElucHV0U2l6ZSwgaW1hZ2UtPndpZHRoICogaW1hZ2UtPmhlaWdodCAqIDEuNSk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLAorICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfVElMRV9XSURUSCwgaW1hZ2UtPndpZHRoKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsCisgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9USUxFX0hFSUdIVCwgaW1hZ2UtPmhlaWdodCk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLAorICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTUFYX0lOUFVUX1NJWkUsIGltYWdlLT53aWR0aCAqIGltYWdlLT5oZWlnaHQgKiAxLjUpOwogICAgIH0KIAogICAgIGlmIChpbWFnZS0+aHZjYyA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dFKCIlczogaHZjYyBpcyBtaXNzaW5nIGZvciBpbWFnZVsldV0hIiwgX19GVU5DVElPTl9fLCBpbWFnZUluZGV4KTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQotICAgIG1ldGEtPnNldERhdGEoa0tleUhWQ0MsIGtUeXBlSFZDQywgaW1hZ2UtPmh2Y2MtPmRhdGEoKSwgaW1hZ2UtPmh2Y2MtPnNpemUoKSk7CisgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtZXRhLAorICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9DU0RfSEVWQywgaW1hZ2UtPmh2Y2MtPmRhdGEoKSwgaW1hZ2UtPmh2Y2MtPnNpemUoKSk7CiAKICAgICBpZiAoaW1hZ2UtPmljYyAhPSBOVUxMKSB7Ci0gICAgICAgIG1ldGEtPnNldERhdGEoa0tleUljY1Byb2ZpbGUsIDAsIGltYWdlLT5pY2MtPmRhdGEoKSwgaW1hZ2UtPmljYy0+c2l6ZSgpKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtZXRhLAorICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfSUNDX1BST0ZJTEUsIGltYWdlLT5pY2MtPmRhdGEoKSwgaW1hZ2UtPmljYy0+c2l6ZSgpKTsKICAgICB9CiAgICAgcmV0dXJuIG1ldGE7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wNC9JdGVtVGFibGUuaCBiL21lZGlhL2V4dHJhY3RvcnMvbXA0L0l0ZW1UYWJsZS5oCmluZGV4IDUzNmRjYjAuLmJlODFiNTkgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvbXA0L0l0ZW1UYWJsZS5oCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbXA0L0l0ZW1UYWJsZS5oCkBAIC0xOSwxMyArMTksMTUgQEAKIAogI2luY2x1ZGUgPHNldD4KIAorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRm9ybWF0Lmg+CisKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLWNsYXNzIERhdGFTb3VyY2VCYXNlOworY2xhc3MgRGF0YVNvdXJjZUhlbHBlcjsKIGNsYXNzIE1ldGFEYXRhOwogCiBuYW1lc3BhY2UgaGVpZiB7CkBAIC00NSwxMyArNDcsMTMgQEAKIAogY2xhc3MgSXRlbVRhYmxlIDogcHVibGljIFJlZkJhc2UgewogcHVibGljOgotICAgIGV4cGxpY2l0IEl0ZW1UYWJsZShEYXRhU291cmNlQmFzZSAqc291cmNlKTsKKyAgICBleHBsaWNpdCBJdGVtVGFibGUoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlKTsKIAogICAgIHN0YXR1c190IHBhcnNlKHVpbnQzMl90IHR5cGUsIG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSk7CiAKICAgICBib29sIGlzVmFsaWQoKSB7IHJldHVybiBtSW1hZ2VJdGVtc1ZhbGlkOyB9CiAgICAgdWludDMyX3QgY291bnRJbWFnZXMoKSBjb25zdDsKLSAgICBzcDxNZXRhRGF0YT4gZ2V0SW1hZ2VNZXRhKGNvbnN0IHVpbnQzMl90IGltYWdlSW5kZXgpOworICAgIEFNZWRpYUZvcm1hdCAqZ2V0SW1hZ2VNZXRhKGNvbnN0IHVpbnQzMl90IGltYWdlSW5kZXgpOwogICAgIHN0YXR1c190IGZpbmRJbWFnZUl0ZW0oY29uc3QgdWludDMyX3QgaW1hZ2VJbmRleCwgdWludDMyX3QgKml0ZW1JbmRleCk7CiAgICAgc3RhdHVzX3QgZmluZFRodW1ibmFpbEl0ZW0oY29uc3QgdWludDMyX3QgaW1hZ2VJbmRleCwgdWludDMyX3QgKml0ZW1JbmRleCk7CiAgICAgc3RhdHVzX3QgZ2V0SW1hZ2VPZmZzZXRBbmRTaXplKApAQCAtNjIsNyArNjQsNyBAQAogICAgIH5JdGVtVGFibGUoKTsKIAogcHJpdmF0ZToKLSAgICBEYXRhU291cmNlQmFzZSAqbURhdGFTb3VyY2U7CisgICAgRGF0YVNvdXJjZUhlbHBlciAqbURhdGFTb3VyY2U7CiAKICAgICBLZXllZFZlY3Rvcjx1aW50MzJfdCwgSXRlbUxvYz4gbUl0ZW1Mb2NzOwogICAgIFZlY3RvcjxJdGVtSW5mbz4gbUl0ZW1JbmZvczsKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXA0L01QRUc0RXh0cmFjdG9yLmNwcCBiL21lZGlhL2V4dHJhY3RvcnMvbXA0L01QRUc0RXh0cmFjdG9yLmNwcAppbmRleCAyMWNjZjQ0Li5jM2JkYzkyIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21wNC9NUEVHNEV4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvTVBFRzRFeHRyYWN0b3IuY3BwCkBAIC0yNiwxMyArMjYsMTQgQEAKIAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCisjaW5jbHVkZSAiQUM0UGFyc2VyLmgiCiAjaW5jbHVkZSAiTVBFRzRFeHRyYWN0b3IuaCIKICNpbmNsdWRlICJTYW1wbGVUYWJsZS5oIgogI2luY2x1ZGUgIkl0ZW1UYWJsZS5oIgogI2luY2x1ZGUgImluY2x1ZGUvRVNEUy5oIgogCisjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZUJhc2UuaD4KICNpbmNsdWRlIDxtZWRpYS9FeHRyYWN0b3JVdGlscy5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhVHJhY2suaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCaXRSZWFkZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgpAQCAtNjgsMTMgKzY5LDEyIEBACiAgICAga01heEF0b21TaXplID0gNjQgKiAxMDI0ICogMTAyNCwKIH07CiAKK2NsYXNzIE1QRUc0U291cmNlIDogcHVibGljIE1lZGlhVHJhY2tIZWxwZXJWMiB7CiBzdGF0aWMgY29uc3Qgc2l6ZV90ICBrTWF4UGNtRnJhbWVTaXplID0gODE5MjsKLQotY2xhc3MgTVBFRzRTb3VyY2UgOiBwdWJsaWMgTWVkaWFUcmFjayB7CiBwdWJsaWM6CiAgICAgLy8gQ2FsbGVyIHJldGFpbnMgb3duZXJzaGlwIG9mIGJvdGggImRhdGFTb3VyY2UiIGFuZCAic2FtcGxlVGFibGUiLgotICAgIE1QRUc0U291cmNlKE1ldGFEYXRhQmFzZSAmZm9ybWF0LAotICAgICAgICAgICAgICAgIERhdGFTb3VyY2VCYXNlICpkYXRhU291cmNlLAorICAgIE1QRUc0U291cmNlKEFNZWRpYUZvcm1hdCAqZm9ybWF0LAorICAgICAgICAgICAgICAgIERhdGFTb3VyY2VIZWxwZXIgKmRhdGFTb3VyY2UsCiAgICAgICAgICAgICAgICAgaW50MzJfdCB0aW1lU2NhbGUsCiAgICAgICAgICAgICAgICAgY29uc3Qgc3A8U2FtcGxlVGFibGU+ICZzYW1wbGVUYWJsZSwKICAgICAgICAgICAgICAgICBWZWN0b3I8U2lkeEVudHJ5PiAmc2lkeCwKQEAgLTgzLDIyICs4MywyMyBAQAogICAgICAgICAgICAgICAgIGNvbnN0IHNwPEl0ZW1UYWJsZT4gJml0ZW1UYWJsZSk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0KCk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhQmFzZSAqcGFyYW1zID0gTlVMTCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBzdGFydCgpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3Qgc3RvcCgpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGb3JtYXQoTWV0YURhdGFCYXNlICYpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0Rm9ybWF0KEFNZWRpYUZvcm1hdCAqKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZChNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCByZWFkKE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKICAgICB2aXJ0dWFsIGJvb2wgc3VwcG9ydE5vbmJsb2NraW5nUmVhZCgpIHsgcmV0dXJuIHRydWU7IH0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGZyYWdtZW50ZWRSZWFkKE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IGZyYWdtZW50ZWRSZWFkKAorICAgICAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOwogCiAgICAgdmlydHVhbCB+TVBFRzRTb3VyY2UoKTsKIAogcHJpdmF0ZToKICAgICBNdXRleCBtTG9jazsKIAotICAgIE1ldGFEYXRhQmFzZSAmbUZvcm1hdDsKLSAgICBEYXRhU291cmNlQmFzZSAqbURhdGFTb3VyY2U7CisgICAgQU1lZGlhRm9ybWF0ICptRm9ybWF0OworICAgIERhdGFTb3VyY2VIZWxwZXIgKm1EYXRhU291cmNlOwogICAgIGludDMyX3QgbVRpbWVzY2FsZTsKICAgICBzcDxTYW1wbGVUYWJsZT4gbVNhbXBsZVRhYmxlOwogICAgIHVpbnQzMl90IG1DdXJyZW50U2FtcGxlSW5kZXg7CkBAIC0xMjksNiArMTMwLDcgQEAKIAogICAgIGJvb2wgbUlzQVZDOwogICAgIGJvb2wgbUlzSEVWQzsKKyAgICBib29sIG1Jc0FDNDsKICAgICBib29sIG1Jc1BjbTsKICAgICBzaXplX3QgbU5BTExlbmd0aFNpemU7CiAKQEAgLTEzOCw4ICsxNDAsNiBAQAogCiAgICAgTWVkaWFCdWZmZXJCYXNlICptQnVmZmVyOwogCi0gICAgYm9vbCBtV2FudHNOQUxGcmFnbWVudHM7Ci0KICAgICB1aW50OF90ICptU3JjQnVmZmVyOwogCiAgICAgYm9vbCBtSXNIZWlmOwpAQCAtMTUzLDYgKzE1Myw4IEBACiAgICAgc3RhdHVzX3QgcGFyc2VTYW1wbGVBdXhpbGlhcnlJbmZvcm1hdGlvbk9mZnNldHMob2ZmNjRfdCBvZmZzZXQsIG9mZjY0X3Qgc2l6ZSk7CiAgICAgc3RhdHVzX3QgcGFyc2VDbGVhckVuY3J5cHRlZFNpemVzKG9mZjY0X3Qgb2Zmc2V0LCBib29sIGlzU3Vic2FtcGxlRW5jcnlwdGlvbiwgdWludDMyX3QgZmxhZ3MpOwogICAgIHN0YXR1c190IHBhcnNlU2FtcGxlRW5jcnlwdGlvbihvZmY2NF90IG9mZnNldCk7CisgICAgLy8gcmV0dXJucyAtMSBmb3IgaW52YWxpZCBsYXllciBJRAorICAgIGludDMyX3QgcGFyc2VIRVZDTGF5ZXJJZChjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSk7CiAKICAgICBzdHJ1Y3QgVHJhY2tGcmFnbWVudEhlYWRlckluZm8gewogICAgICAgICBlbnVtIEZsYWdzIHsKQEAgLTE5OCwxNCArMjAwLDE0IEBACiAvLyBwb3NzaWJseSB3cmFwcGluZyBtdWx0aXBsZSB0aW1lcyB0byBjb3ZlciBhbGwgdHJhY2tzLCBpLmUuCiAvLyBFYWNoIENhY2hlZFJhbmdlZERhdGFTb3VyY2UgY2FjaGVzIHRoZSBzYW1wbGV0YWJsZSBtZXRhZGF0YSBmb3IgYSBzaW5nbGUgdHJhY2suCiAKLXN0cnVjdCBDYWNoZWRSYW5nZWREYXRhU291cmNlIDogcHVibGljIERhdGFTb3VyY2VCYXNlIHsKLSAgICBleHBsaWNpdCBDYWNoZWRSYW5nZWREYXRhU291cmNlKERhdGFTb3VyY2VCYXNlICpzb3VyY2UpOworY2xhc3MgQ2FjaGVkUmFuZ2VkRGF0YVNvdXJjZSA6IHB1YmxpYyBEYXRhU291cmNlSGVscGVyIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBDYWNoZWRSYW5nZWREYXRhU291cmNlKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSk7CiAgICAgdmlydHVhbCB+Q2FjaGVkUmFuZ2VkRGF0YVNvdXJjZSgpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKSBjb25zdDsKLSAgICB2aXJ0dWFsIHNzaXplX3QgcmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTaXplKG9mZjY0X3QgKnNpemUpOwotICAgIHZpcnR1YWwgdWludDMyX3QgZmxhZ3MoKTsKKyAgICBzc2l6ZV90IHJlYWRBdChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIG92ZXJyaWRlOworICAgIHN0YXR1c190IGdldFNpemUob2ZmNjRfdCAqc2l6ZSkgb3ZlcnJpZGU7CisgICAgdWludDMyX3QgZmxhZ3MoKSBvdmVycmlkZTsKIAogICAgIHN0YXR1c190IHNldENhY2hlZFJhbmdlKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwgYm9vbCBhc3N1bWVTb3VyY2VPd25lcnNoaXBPblN1Y2Nlc3MpOwogCkBAIC0yMTMsNyArMjE1LDcgQEAKIHByaXZhdGU6CiAgICAgTXV0ZXggbUxvY2s7CiAKLSAgICBEYXRhU291cmNlQmFzZSAqbVNvdXJjZTsKKyAgICBEYXRhU291cmNlSGVscGVyICptU291cmNlOwogICAgIGJvb2wgbU93bnNEYXRhU291cmNlOwogICAgIG9mZjY0X3QgbUNhY2hlZE9mZnNldDsKICAgICBzaXplX3QgbUNhY2hlZFNpemU7CkBAIC0yMjUsOCArMjI3LDkgQEAKICAgICBDYWNoZWRSYW5nZWREYXRhU291cmNlICZvcGVyYXRvcj0oY29uc3QgQ2FjaGVkUmFuZ2VkRGF0YVNvdXJjZSAmKTsKIH07CiAKLUNhY2hlZFJhbmdlZERhdGFTb3VyY2U6OkNhY2hlZFJhbmdlZERhdGFTb3VyY2UoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSkKLSAgICA6IG1Tb3VyY2Uoc291cmNlKSwKK0NhY2hlZFJhbmdlZERhdGFTb3VyY2U6OkNhY2hlZFJhbmdlZERhdGFTb3VyY2UoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlKQorICAgIDogRGF0YVNvdXJjZUhlbHBlcihzb3VyY2UpLAorICAgICAgbVNvdXJjZShzb3VyY2UpLAogICAgICAgbU93bnNEYXRhU291cmNlKGZhbHNlKSwKICAgICAgIG1DYWNoZWRPZmZzZXQoMCksCiAgICAgICBtQ2FjaGVkU2l6ZSgwKSwKQEAgLTIzNiw3ICsyMzksNyBAQAogQ2FjaGVkUmFuZ2VkRGF0YVNvdXJjZTo6fkNhY2hlZFJhbmdlZERhdGFTb3VyY2UoKSB7CiAgICAgY2xlYXJDYWNoZSgpOwogICAgIGlmIChtT3duc0RhdGFTb3VyY2UpIHsKLSAgICAgICAgZGVsZXRlIChDYWNoZWRSYW5nZWREYXRhU291cmNlKiltU291cmNlOworICAgICAgICBkZWxldGUgbVNvdXJjZTsKICAgICB9CiB9CiAKQEAgLTI1MCwxMCArMjUzLDYgQEAKICAgICBtQ2FjaGVkU2l6ZSA9IDA7CiB9CiAKLXN0YXR1c190IENhY2hlZFJhbmdlZERhdGFTb3VyY2U6OmluaXRDaGVjaygpIGNvbnN0IHsKLSAgICByZXR1cm4gbVNvdXJjZS0+aW5pdENoZWNrKCk7Ci19Ci0KIHNzaXplX3QgQ2FjaGVkUmFuZ2VkRGF0YVNvdXJjZTo6cmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKQEAgLTMxNSw2ICszMTQsOSBAQAogICAgICAgICBjYXNlIEZPVVJDQygncycsICdhJywgJ3cnLCAnYicpOgogICAgICAgICAgICAgcmV0dXJuIE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9XQjsKIAorICAgICAgICBjYXNlIEZPVVJDQygnZScsICdjJywgJy0nLCAnMycpOgorICAgICAgICAgICAgcmV0dXJuIE1FRElBX01JTUVUWVBFX0FVRElPX0VBQzM7CisKICAgICAgICAgY2FzZSBGT1VSQ0MoJ20nLCAncCcsICc0JywgJ3YnKToKICAgICAgICAgICAgIHJldHVybiBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNDsKIApAQCAtMzI5LDYgKzMzMSw4IEBACiAgICAgICAgIGNhc2UgRk9VUkNDKCdoJywgJ3YnLCAnYycsICcxJyk6CiAgICAgICAgIGNhc2UgRk9VUkNDKCdoJywgJ2UnLCAndicsICcxJyk6CiAgICAgICAgICAgICByZXR1cm4gTUVESUFfTUlNRVRZUEVfVklERU9fSEVWQzsKKyAgICAgICAgY2FzZSBGT1VSQ0MoJ2EnLCAnYycsICctJywgJzQnKToKKyAgICAgICAgICAgIHJldHVybiBNRURJQV9NSU1FVFlQRV9BVURJT19BQzQ7CiAKICAgICAgICAgY2FzZSBGT1VSQ0MoJ3QnLCAndycsICdvJywgJ3MnKToKICAgICAgICAgY2FzZSBGT1VSQ0MoJ3MnLCAnbycsICd3JywgJ3QnKToKQEAgLTM2MiwxMiArMzY2LDExIEBACiAgICAgcmV0dXJuIGZhbHNlOwogfQogCi1NUEVHNEV4dHJhY3Rvcjo6TVBFRzRFeHRyYWN0b3IoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgY29uc3QgY2hhciAqbWltZSkKK01QRUc0RXh0cmFjdG9yOjpNUEVHNEV4dHJhY3RvcihEYXRhU291cmNlSGVscGVyICpzb3VyY2UsIGNvbnN0IGNoYXIgKm1pbWUpCiAgICAgOiBtTW9vZk9mZnNldCgwKSwKICAgICAgIG1Nb29mRm91bmQoZmFsc2UpLAogICAgICAgbU1kYXRGb3VuZChmYWxzZSksCiAgICAgICBtRGF0YVNvdXJjZShzb3VyY2UpLAotICAgICAgbUNhY2hlZFNvdXJjZShOVUxMKSwKICAgICAgIG1Jbml0Q2hlY2soTk9fSU5JVCksCiAgICAgICBtSGVhZGVyVGltZXNjYWxlKDApLAogICAgICAgbUlzUVQoZmFsc2UpLApAQCAtMzc3LDYgKzM4MCw3IEBACiAgICAgICBtRmlyc3RUcmFjayhOVUxMKSwKICAgICAgIG1MYXN0VHJhY2soTlVMTCkgewogICAgIEFMT0dWKCJtaW1lPSVzLCBtUHJlZmVySGVpZj0lZCIsIG1pbWUsIG1QcmVmZXJIZWlmKTsKKyAgICBtRmlsZU1ldGFEYXRhID0gQU1lZGlhRm9ybWF0X25ldygpOwogfQogCiBNUEVHNEV4dHJhY3Rvcjo6fk1QRUc0RXh0cmFjdG9yKCkgewpAQCAtMzg0LDYgKzM4OCw3IEBACiAgICAgd2hpbGUgKHRyYWNrKSB7CiAgICAgICAgIFRyYWNrICpuZXh0ID0gdHJhY2stPm5leHQ7CiAKKyAgICAgICAgQU1lZGlhRm9ybWF0X2RlbGV0ZSh0cmFjay0+bWV0YSk7CiAgICAgICAgIGRlbGV0ZSB0cmFjazsKICAgICAgICAgdHJhY2sgPSBuZXh0OwogICAgIH0KQEAgLTM5NCw3ICszOTksOCBAQAogICAgIH0KICAgICBtUHNzaC5jbGVhcigpOwogCi0gICAgZGVsZXRlIG1DYWNoZWRTb3VyY2U7CisgICAgZGVsZXRlIG1EYXRhU291cmNlOworICAgIEFNZWRpYUZvcm1hdF9kZWxldGUobUZpbGVNZXRhRGF0YSk7CiB9CiAKIHVpbnQzMl90IE1QRUc0RXh0cmFjdG9yOjpmbGFncygpIGNvbnN0IHsKQEAgLTQwMywxMyArNDA5LDEzIEBACiAgICAgICAgICAgICAgICAgICAgIChDQU5fU0VFS19CQUNLV0FSRCB8IENBTl9TRUVLX0ZPUldBUkQgfCBDQU5fU0VFSykgOiAwKTsKIH0KIAotc3RhdHVzX3QgTVBFRzRFeHRyYWN0b3I6OmdldE1ldGFEYXRhKE1ldGFEYXRhQmFzZSAmbWV0YSkgeworbWVkaWFfc3RhdHVzX3QgTVBFRzRFeHRyYWN0b3I6OmdldE1ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSkgewogICAgIHN0YXR1c190IGVycjsKICAgICBpZiAoKGVyciA9IHJlYWRNZXRhRGF0YSgpKSAhPSBPSykgewotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogICAgIH0KLSAgICBtZXRhID0gbUZpbGVNZXRhRGF0YTsKLSAgICByZXR1cm4gT0s7CisgICAgQU1lZGlhRm9ybWF0X2NvcHkobWV0YSwgbUZpbGVNZXRhRGF0YSk7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAogc2l6ZV90IE1QRUc0RXh0cmFjdG9yOjpjb3VudFRyYWNrcygpIHsKQEAgLTQzMCwxOCArNDM2LDE4IEBACiAgICAgcmV0dXJuIG47CiB9CiAKLXN0YXR1c190IE1QRUc0RXh0cmFjdG9yOjpnZXRUcmFja01ldGFEYXRhKAotICAgICAgICBNZXRhRGF0YUJhc2UgJm1ldGEsCittZWRpYV9zdGF0dXNfdCBNUEVHNEV4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YSgKKyAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhLAogICAgICAgICBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKSB7CiAgICAgc3RhdHVzX3QgZXJyOwogICAgIGlmICgoZXJyID0gcmVhZE1ldGFEYXRhKCkpICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgfQogCiAgICAgVHJhY2sgKnRyYWNrID0gbUZpcnN0VHJhY2s7CiAgICAgd2hpbGUgKGluZGV4ID4gMCkgewogICAgICAgICBpZiAodHJhY2sgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgICAgIH0KIAogICAgICAgICB0cmFjayA9IHRyYWNrLT5uZXh0OwpAQCAtNDQ5LDE1ICs0NTUsMTUgQEAKICAgICB9CiAKICAgICBpZiAodHJhY2sgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogICAgIH0KIAogICAgIFs9XSB7CiAgICAgICAgIGludDY0X3QgZHVyYXRpb247CiAgICAgICAgIGludDMyX3Qgc2FtcGxlcmF0ZTsKICAgICAgICAgaWYgKHRyYWNrLT5oYXNfZWxzdCAmJiBtSGVhZGVyVGltZXNjYWxlICE9IDAgJiYKLSAgICAgICAgICAgICAgICB0cmFjay0+bWV0YS5maW5kSW50NjQoa0tleUR1cmF0aW9uLCAmZHVyYXRpb24pICYmCi0gICAgICAgICAgICAgICAgdHJhY2stPm1ldGEuZmluZEludDMyKGtLZXlTYW1wbGVSYXRlLCAmc2FtcGxlcmF0ZSkpIHsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfZ2V0SW50NjQodHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04sICZkdXJhdGlvbikgJiYKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfZ2V0SW50MzIodHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1JBVEUsICZzYW1wbGVyYXRlKSkgewogCiAgICAgICAgICAgICAvLyBlbHN0IGhhcyB0byBiZSBwcm9jZXNzZWQgb25seSB0aGUgZmlyc3QgdGltZSB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZAogICAgICAgICAgICAgdHJhY2stPmhhc19lbHN0ID0gZmFsc2U7CkBAIC00ODIsMjAgKzQ4OCwxNCBAQAogICAgICAgICAgICAgLy8gZGVsYXkgPSAoKG1lZGlhX3RpbWUgKiBzYW1wbGVyYXRlKSArIGhhbGZzY2FsZSkgLyB0cmFjay0+dGltZXNjYWxlOwogICAgICAgICAgICAgaWYgKF9fYnVpbHRpbl9tdWxfb3ZlcmZsb3cobWVkaWFfdGltZSwgc2FtcGxlcmF0ZSwgJmRlbGF5KSB8fAogICAgICAgICAgICAgICAgICAgICBfX2J1aWx0aW5fYWRkX292ZXJmbG93KGRlbGF5LCBoYWxmc2NhbGUsICZkZWxheSkgfHwKLSAgICAgICAgICAgICAgICAgICAgKGRlbGF5IC89IG1IZWFkZXJUaW1lc2NhbGUsIGZhbHNlKSB8fAotICAgICAgICAgICAgICAgICAgICAvKiB0aGUgY2FsY3VsYXRlZCBkZWxheSBzaG91bGQgYmUgc21hbGwsIGJ1dCBzb21lIGFwcHMKLSAgICAgICAgICAgICAgICAgICAgICogYXBwZWFyIHRvIHdyaXRlIGEgYm9ndXMgZWRpdCBsaXN0IHRoYXQgY2F1c2VzIGEgcmVhbGx5Ci0gICAgICAgICAgICAgICAgICAgICAqIGxhcmdlIGRlbGF5LCByZXN1bHRpbmcgaW4gcGxheWJhY2sgcHJvYmxlbXMuCi0gICAgICAgICAgICAgICAgICAgICAqIElnbm9yZSBzdWNoIGVkaXQgbGlzdHMuCi0gICAgICAgICAgICAgICAgICAgICAqICg0MDk2IGlzIGVub3VnaCB0byBkcm9wIDQgZnVsbCBzYW1wbGVzKQotICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgZGVsYXkgPiA0MDk2IHx8Ci0gICAgICAgICAgICAgICAgICAgIGRlbGF5IDwgMCkgeworICAgICAgICAgICAgICAgICAgICAoZGVsYXkgLz0gdHJhY2stPnRpbWVzY2FsZSwgZmFsc2UpIHx8CisgICAgICAgICAgICAgICAgICAgIGRlbGF5ID4gSU5UMzJfTUFYIHx8CisgICAgICAgICAgICAgICAgICAgIGRlbGF5IDwgSU5UMzJfTUlOKSB7CiAgICAgICAgICAgICAgICAgQUxPR1coImlnbm9yaW5nIGVkaXQgbGlzdCB3aXRoIGJvZ3VzIHZhbHVlcyIpOwogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIEFMT0dWKCJkZWxheSA9ICUiIFBSSWQ2NCwgZGVsYXkpOwotICAgICAgICAgICAgdHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUVuY29kZXJEZWxheSwgZGVsYXkpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKHRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX0VOQ09ERVJfREVMQVksIGRlbGF5KTsKIAogICAgICAgICAgICAgaW50NjRfdCBzY2FsZWRfZHVyYXRpb247CiAgICAgICAgICAgICAvLyBzY2FsZWRfZHVyYXRpb24gPSBkdXJhdGlvbiAqIG1IZWFkZXJUaW1lc2NhbGU7CkBAIC01MjYsOCArNTI2LDggQEAKICAgICAgICAgICAgIEFMT0dWKCJzZWdtZW50X2VuZCA9ICUiIFBSSWQ2NCAiLCBwYWRkaW5nID0gJSIgUFJJZDY0LCBzZWdtZW50X2VuZCwgcGFkZGluZyk7CiAgICAgICAgICAgICBpbnQ2NF90IHBhZGRpbmdzYW1wbGVzID0gMDsKICAgICAgICAgICAgIGlmIChwYWRkaW5nIDwgMCkgewotICAgICAgICAgICAgICAgIC8vIHRyYWNrIGR1cmF0aW9uIGZyb20gbWVkaWEgaGVhZGVyICh3aGljaCBpcyB3aGF0IGtLZXlEdXJhdGlvbiBpcykgbWlnaHQKLSAgICAgICAgICAgICAgICAvLyBiZSBzbGlnaHRseSBzaG9ydGVyIHRoYW4gdGhlIHNlZ21lbnQgZHVyYXRpb24sIHdoaWNoIHdvdWxkIG1ha2UgdGhlCisgICAgICAgICAgICAgICAgLy8gdHJhY2sgZHVyYXRpb24gZnJvbSBtZWRpYSBoZWFkZXIgKHdoaWNoIGlzIHdoYXQgQU1FRElBRk9STUFUX0tFWV9EVVJBVElPTiBpcykKKyAgICAgICAgICAgICAgICAvLyBtaWdodCBiZSBzbGlnaHRseSBzaG9ydGVyIHRoYW4gdGhlIHNlZ21lbnQgZHVyYXRpb24sIHdoaWNoIHdvdWxkIG1ha2UgdGhlCiAgICAgICAgICAgICAgICAgLy8gcGFkZGluZyBuZWdhdGl2ZS4gQ2xhbXAgdG8gemVyby4KICAgICAgICAgICAgICAgICBwYWRkaW5nID0gMDsKICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC01NDUsNyArNTQ1LDcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBBTE9HVigicGFkZGluZ3NhbXBsZXMgPSAlIiBQUklkNjQsIHBhZGRpbmdzYW1wbGVzKTsKLSAgICAgICAgICAgIHRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlFbmNvZGVyUGFkZGluZywgcGFkZGluZ3NhbXBsZXMpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKHRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX0VOQ09ERVJfUEFERElORywgcGFkZGluZ3NhbXBsZXMpOwogICAgICAgICB9CiAgICAgfSgpOwogCkBAIC01NTQsNyArNTU0LDcgQEAKICAgICAgICAgdHJhY2stPmluY2x1ZGVzX2V4cGVuc2l2ZV9tZXRhZGF0YSA9IHRydWU7CiAKICAgICAgICAgY29uc3QgY2hhciAqbWltZTsKLSAgICAgICAgQ0hFQ0sodHJhY2stPm1ldGEuZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpOworICAgICAgICBDSEVDSyhBTWVkaWFGb3JtYXRfZ2V0U3RyaW5nKHRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsICZtaW1lKSk7CiAgICAgICAgIGlmICghc3RybmNhc2VjbXAoInZpZGVvLyIsIG1pbWUsIDYpKSB7CiAgICAgICAgICAgICAvLyBNUEVHMiB0cmFja3MgZG8gbm90IHByb3ZpZGUgQ1NELCBzbyByZWFkIHRoZSBzdHJlYW0gaGVhZGVyCiAgICAgICAgICAgICBpZiAoIXN0cmNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHMikpIHsKQEAgLTU2NywxNyArNTY3LDE5IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBoZWFkZXJba01heFRyYWNrSGVhZGVyU2l6ZV07CiAgICAgICAgICAgICAgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KG9mZnNldCwgJmhlYWRlciwgc2l6ZSkgPT0gKHNzaXplX3Qpc2l6ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2stPm1ldGEuc2V0RGF0YShrS2V5U3RyZWFtSGVhZGVyLCAnbWRhdCcsIGhlYWRlciwgc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKHRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX01QRUcyX1NUUkVBTV9IRUFERVIsIGhlYWRlciwgc2l6ZSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChtTW9vZk9mZnNldCA+IDApIHsKICAgICAgICAgICAgICAgICBpbnQ2NF90IGR1cmF0aW9uOwotICAgICAgICAgICAgICAgIGlmICh0cmFjay0+bWV0YS5maW5kSW50NjQoa0tleUR1cmF0aW9uLCAmZHVyYXRpb24pKSB7CisgICAgICAgICAgICAgICAgaWYgKEFNZWRpYUZvcm1hdF9nZXRJbnQ2NCh0cmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04sICZkdXJhdGlvbikpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gbm90aGluZyBmYW5jeSwganVzdCBwaWNrIGEgZnJhbWUgbmVhciAxLzR0aCBvZiB0aGUgZHVyYXRpb24KLSAgICAgICAgICAgICAgICAgICAgdHJhY2stPm1ldGEuc2V0SW50NjQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAga0tleVRodW1ibmFpbFRpbWUsIGR1cmF0aW9uIC8gNCk7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NCh0cmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX1RIVU1CTkFJTF9USU1FLCBkdXJhdGlvbiAvIDQpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlSW5kZXg7CkBAIC01ODcsMTYgKzU4OSwxNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgJiYgdHJhY2stPnNhbXBsZVRhYmxlLT5nZXRNZXRhRGF0YUZvclNhbXBsZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVJbmRleCwgTlVMTCAvKiBvZmZzZXQgKi8sIE5VTEwgLyogc2l6ZSAqLywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2FtcGxlVGltZSkgPT0gT0spIHsKLSAgICAgICAgICAgICAgICAgICAgdHJhY2stPm1ldGEuc2V0SW50NjQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAga0tleVRodW1ibmFpbFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKChpbnQ2NF90KXNhbXBsZVRpbWUgKiAxMDAwMDAwKSAvIHRyYWNrLT50aW1lc2NhbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KHRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX1RIVU1CTkFJTF9USU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGludDY0X3Qpc2FtcGxlVGltZSAqIDEwMDAwMDApIC8gdHJhY2stPnRpbWVzY2FsZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCi0gICAgbWV0YSA9IHRyYWNrLT5tZXRhOwotICAgIHJldHVybiBPSzsKKyAgICBBTWVkaWFGb3JtYXRfY29weShtZXRhLCB0cmFjay0+bWV0YSk7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAogc3RhdHVzX3QgTVBFRzRFeHRyYWN0b3I6OnJlYWRNZXRhRGF0YSgpIHsKQEAgLTYzMSwxMiArNjMzLDE0IEBACiAgICAgICAgIG9mZjY0X3QgZXhpZk9mZnNldDsKICAgICAgICAgc2l6ZV90IGV4aWZTaXplOwogICAgICAgICBpZiAobUl0ZW1UYWJsZS0+Z2V0RXhpZk9mZnNldEFuZFNpemUoJmV4aWZPZmZzZXQsICZleGlmU2l6ZSkgPT0gT0spIHsKLSAgICAgICAgICAgIG1GaWxlTWV0YURhdGEuc2V0SW50NjQoa0tleUV4aWZPZmZzZXQsIChpbnQ2NF90KWV4aWZPZmZzZXQpOwotICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXRJbnQ2NChrS2V5RXhpZlNpemUsIChpbnQ2NF90KWV4aWZTaXplKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NChtRmlsZU1ldGFEYXRhLAorICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0VYSUZfT0ZGU0VULCAoaW50NjRfdClleGlmT2Zmc2V0KTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NChtRmlsZU1ldGFEYXRhLAorICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0VYSUZfU0laRSwgKGludDY0X3QpZXhpZlNpemUpOwogICAgICAgICB9CiAgICAgICAgIGZvciAodWludDMyX3QgaW1hZ2VJbmRleCA9IDA7CiAgICAgICAgICAgICAgICAgaW1hZ2VJbmRleCA8IG1JdGVtVGFibGUtPmNvdW50SW1hZ2VzKCk7IGltYWdlSW5kZXgrKykgewotICAgICAgICAgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBtSXRlbVRhYmxlLT5nZXRJbWFnZU1ldGEoaW1hZ2VJbmRleCk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGEgPSBtSXRlbVRhYmxlLT5nZXRJbWFnZU1ldGEoaW1hZ2VJbmRleCk7CiAgICAgICAgICAgICBpZiAobWV0YSA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgQUxPR0UoImhlaWYgaW1hZ2UgJXUgaGFzIG5vIG1ldGEhIiwgaW1hZ2VJbmRleCk7CiAgICAgICAgICAgICAgICAgY29udGludWU7CkBAIC02NjEsOCArNjY1LDggQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1MYXN0VHJhY2sgPSB0cmFjazsKIAotICAgICAgICAgICAgdHJhY2stPm1ldGEgPSAqKG1ldGEuZ2V0KCkpOwotICAgICAgICAgICAgdHJhY2stPm1ldGEuc2V0SW50MzIoa0tleVRyYWNrSUQsIGltYWdlSW5kZXgpOworICAgICAgICAgICAgdHJhY2stPm1ldGEgPSBtZXRhOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKHRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX1RSQUNLX0lELCBpbWFnZUluZGV4KTsKICAgICAgICAgICAgIHRyYWNrLT5pbmNsdWRlc19leHBlbnNpdmVfbWV0YWRhdGEgPSBmYWxzZTsKICAgICAgICAgICAgIHRyYWNrLT5za2lwVHJhY2sgPSBmYWxzZTsKICAgICAgICAgICAgIHRyYWNrLT50aW1lc2NhbGUgPSAxMDAwMDAwOwpAQCAtNjcxLDE2ICs2NzUsMTggQEAKIAogICAgIGlmIChtSW5pdENoZWNrID09IE9LKSB7CiAgICAgICAgIGlmIChmaW5kVHJhY2tCeU1pbWVQcmVmaXgoInZpZGVvLyIpICE9IE5VTEwpIHsKLSAgICAgICAgICAgIG1GaWxlTWV0YURhdGEuc2V0Q1N0cmluZygKLSAgICAgICAgICAgICAgICAgICAga0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfTVBFRzQpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtRmlsZU1ldGFEYXRhLAorICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9NUEVHNCk7CiAgICAgICAgIH0gZWxzZSBpZiAoZmluZFRyYWNrQnlNaW1lUHJlZml4KCJhdWRpby8iKSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBtRmlsZU1ldGFEYXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCAiYXVkaW8vbXA0Iik7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1GaWxlTWV0YURhdGEsCisgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgImF1ZGlvL21wNCIpOwogICAgICAgICB9IGVsc2UgaWYgKGZpbmRUcmFja0J5TWltZVByZWZpeCgKICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9JTUFHRV9BTkRST0lEX0hFSUMpICE9IE5VTEwpIHsKLSAgICAgICAgICAgIG1GaWxlTWV0YURhdGEuc2V0Q1N0cmluZygKLSAgICAgICAgICAgICAgICAgICAga0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfSEVJRik7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1GaWxlTWV0YURhdGEsCisgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX0hFSUYpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtRmlsZU1ldGFEYXRhLAorICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX01JTUUsICJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iKTsKICAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIG1Jbml0Q2hlY2sgPSBlcnI7CkBAIC03MDUsNyArNzExLDcgQEAKICAgICAgICAgICAgIG1lbWNweShwdHIgKyAyMCwgbVBzc2hbaV0uZGF0YSwgbVBzc2hbaV0uZGF0YWxlbik7CiAgICAgICAgICAgICBwdHIgKz0gKDIwICsgbVBzc2hbaV0uZGF0YWxlbik7CiAgICAgICAgIH0KLSAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXREYXRhKGtLZXlQc3NoLCAncHNzaCcsIGJ1ZiwgcHNzaHNpemUpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1GaWxlTWV0YURhdGEsIEFNRURJQUZPUk1BVF9LRVlfUFNTSCwgYnVmLCBwc3Noc2l6ZSk7CiAgICAgICAgIGZyZWUoYnVmKTsKICAgICB9CiAKQEAgLTkyMSw4ICs5MjcsOCBAQAogCiAgICAgICAgICAgICAgICAgICAgIGlmIChjYWNoZWRTb3VyY2UtPnNldENhY2hlZFJhbmdlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICpvZmZzZXQsIGNodW5rX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNhY2hlZFNvdXJjZSAhPSBOVUxMIC8qIGFzc3VtZSBvd25lcnNoaXAgb24gc3VjY2VzcyAqLykgPT0gT0spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1EYXRhU291cmNlID0gbUNhY2hlZFNvdXJjZSA9IGNhY2hlZFNvdXJjZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlIC8qIGFzc3VtZSBvd25lcnNoaXAgb24gc3VjY2VzcyAqLykgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1EYXRhU291cmNlID0gY2FjaGVkU291cmNlOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGNhY2hlZFNvdXJjZTsKICAgICAgICAgICAgICAgICAgICAgfQpAQCAtOTU2LDcgKzk2Miw5IEBACiAgICAgICAgICAgICAgICAgdHJhY2stPmluY2x1ZGVzX2V4cGVuc2l2ZV9tZXRhZGF0YSA9IGZhbHNlOwogICAgICAgICAgICAgICAgIHRyYWNrLT5za2lwVHJhY2sgPSBmYWxzZTsKICAgICAgICAgICAgICAgICB0cmFjay0+dGltZXNjYWxlID0gMDsKLSAgICAgICAgICAgICAgICB0cmFjay0+bWV0YS5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIpOworICAgICAgICAgICAgICAgIHRyYWNrLT5tZXRhID0gQU1lZGlhRm9ybWF0X25ldygpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcodHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX01JTUUsICJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iKTsKICAgICAgICAgICAgICAgICB0cmFjay0+aGFzX2Vsc3QgPSBmYWxzZTsKICAgICAgICAgICAgICAgICB0cmFjay0+c3Vic2FtcGxlX2VuY3J5cHRpb24gPSBmYWxzZTsKICAgICAgICAgICAgIH0KQEAgLTk4MCw4ICs5ODgsMTAgQEAKIAogICAgICAgICAgICAgaWYgKGlzVHJhY2spIHsKICAgICAgICAgICAgICAgICBpbnQzMl90IHRyYWNrSWQ7Ci0gICAgICAgICAgICAgICAgLy8gVGhlcmUgbXVzdCBiZSBleGFjdCBvbmUgdHJhY2sgaGVhZGVyIHBlciB0cmFjay4KLSAgICAgICAgICAgICAgICBpZiAoIW1MYXN0VHJhY2stPm1ldGEuZmluZEludDMyKGtLZXlUcmFja0lELCAmdHJhY2tJZCkpIHsKKyAgICAgICAgICAgICAgICAvLyBUaGVyZSBtdXN0IGJlIGV4YWN0bHkgb25lIHRyYWNrIGhlYWRlciBwZXIgdHJhY2suCisKKyAgICAgICAgICAgICAgICBpZiAoIUFNZWRpYUZvcm1hdF9nZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9UUkFDS19JRCwgJnRyYWNrSWQpKSB7CiAgICAgICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPnNraXBUcmFjayA9IHRydWU7CiAgICAgICAgICAgICAgICAgfQogCkBAIC0xMDU3LDcgKzEwNjcsNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChtb2RlICE9IGtDcnlwdG9Nb2RlVW5lbmNyeXB0ZWQpIHsKLSAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlDcnlwdG9Nb2RlLCBtb2RlKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fTU9ERSwgbW9kZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtMTEzMywxMiArMTE0MywxNSBAQAogICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIEZvdXJDQzJNSU1FKG9yaWdpbmFsX2ZvdXJjYykpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX01JTUUsIEZvdXJDQzJNSU1FKG9yaWdpbmFsX2ZvdXJjYykpOwogICAgICAgICAgICAgdWludDMyX3QgbnVtX2NoYW5uZWxzID0gMDsKICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZV9yYXRlID0gMDsKICAgICAgICAgICAgIGlmIChBZGp1c3RDaGFubmVsc0FuZFJhdGUob3JpZ2luYWxfZm91cmNjLCAmbnVtX2NoYW5uZWxzLCAmc2FtcGxlX3JhdGUpKSB7Ci0gICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCBudW1fY2hhbm5lbHMpOwotICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIHNhbXBsZV9yYXRlKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9DT1VOVCwgbnVtX2NoYW5uZWxzKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1JBVEUsIHNhbXBsZV9yYXRlKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLy8gSWYgZm9ybWF0IHR5cGUgaXMgJ2FsYWMnLCBpdCBpcyBuZWNlc3NhcnkgdG8gZ2V0IHRoZSBwYXJhbWV0ZXJzCkBAIC0xMTY3LDExICsxMTgwLDE0IEBACiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgdWludDhfdCBiaXRzUGVyU2FtcGxlID0gY29va2llWzVdOwotICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUJpdHNQZXJTYW1wbGUsIGJpdHNQZXJTYW1wbGUpOwotICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgY29va2llWzldKTsKLSAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlTYW1wbGVSYXRlLCBVMzJfQVQoJmNvb2tpZVsyMF0pKTsKLSAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldERhdGEoCi0gICAgICAgICAgICAgICAgICAgIGtLZXlBbGFjTWFnaWNDb29raWUsIE1ldGFEYXRhOjpUWVBFX05PTkUsIGNvb2tpZSwgc2l6ZW9mKGNvb2tpZSkpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9CSVRTX1BFUl9TQU1QTEUsIGJpdHNQZXJTYW1wbGUpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX0NPVU5ULCBjb29raWVbOV0pOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9TQU1QTEVfUkFURSwgVTMyX0FUKCZjb29raWVbMjBdKSk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9DU0RfMCwgY29va2llLCBzaXplb2YoY29va2llKSk7CiAKICAgICAgICAgICAgICAgICAvLyBBZGQgdGhlIHNpemUgb2YgQUxBQyBTcGVjaWZpYyBJbmZvICgzNiBieXRlcykgYW5kIHRlcm1pbmF0b3IKICAgICAgICAgICAgICAgICAvLyBhdG9tICg4IGJ5dGVzKS4KQEAgLTEyNzIsMTYgKzEyODgsMjMgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaW50MzJfdCB0bXBBbGdvcml0aG1JZDsKLSAgICAgICAgICAgIGlmICghbUxhc3RUcmFjay0+bWV0YS5maW5kSW50MzIoa0tleUNyeXB0b01vZGUsICZ0bXBBbGdvcml0aG1JZCkpIHsKLSAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlDcnlwdG9Nb2RlLCBkZWZhdWx0QWxnb3JpdGhtSWQpOworICAgICAgICAgICAgaWYgKCFBTWVkaWFGb3JtYXRfZ2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fTU9ERSwgJnRtcEFsZ29yaXRobUlkKSkgeworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fTU9ERSwgZGVmYXVsdEFsZ29yaXRobUlkKTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5Q3J5cHRvRGVmYXVsdElWU2l6ZSwgZGVmYXVsdElWU2l6ZSk7Ci0gICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldERhdGEoa0tleUNyeXB0b0tleSwgJ3RlbmMnLCBkZWZhdWx0S2V5SWQsIDE2KTsKLSAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUVuY3J5cHRlZEJ5dGVCbG9jaywgZGVmYXVsdEVuY3J5cHRlZEJ5dGVCbG9jayk7Ci0gICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlTa2lwQnl0ZUJsb2NrLCBkZWZhdWx0U2tpcEJ5dGVCbG9jayk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fREVGQVVMVF9JVl9TSVpFLCBkZWZhdWx0SVZTaXplKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fS0VZLCBkZWZhdWx0S2V5SWQsIDE2KTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19FTkNSWVBURURfQllURV9CTE9DSywgZGVmYXVsdEVuY3J5cHRlZEJ5dGVCbG9jayk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fU0tJUF9CWVRFX0JMT0NLLCBkZWZhdWx0U2tpcEJ5dGVCbG9jayk7CiAgICAgICAgICAgICBpZiAoZGVmYXVsdENvbnN0YW50SXYgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0RGF0YShrS2V5Q3J5cHRvSVYsICdkY2l2JywgZGVmYXVsdENvbnN0YW50SXYtPmRhdGEoKSwgZGVmYXVsdENvbnN0YW50SXYtPnNpemUoKSk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtTGFzdFRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19JViwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRDb25zdGFudEl2LT5kYXRhKCksIGRlZmF1bHRDb25zdGFudEl2LT5zaXplKCkpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTE0MzAsOCArMTQ1Myw4IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKGR1cmF0aW9uICE9IDAgJiYgbUxhc3RUcmFjay0+dGltZXNjYWxlICE9IDApIHsKLSAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDY0KAotICAgICAgICAgICAgICAgICAgICAgICAga0tleUR1cmF0aW9uLCAoZHVyYXRpb24gKiAxMDAwMDAwKSAvIG1MYXN0VHJhY2stPnRpbWVzY2FsZSk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAoZHVyYXRpb24gKiAxMDAwMDAwKSAvIG1MYXN0VHJhY2stPnRpbWVzY2FsZSk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHVpbnQ4X3QgbGFuZ1syXTsKQEAgLTE0NTgsOCArMTQ4MSw3IEBACiAgICAgICAgICAgICBsYW5nX2NvZGVbMl0gPSAobGFuZ1sxXSAmIDB4MWYpICsgMHg2MDsKICAgICAgICAgICAgIGxhbmdfY29kZVszXSA9ICdcMCc7CiAKLSAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0Q1N0cmluZygKLSAgICAgICAgICAgICAgICAgICAga0tleU1lZGlhTGFuZ3VhZ2UsIGxhbmdfY29kZSk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTEFOR1VBR0UsIGxhbmdfY29kZSk7CiAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0xNDkzLDcgKzE1MTUsNyBAQAogICAgICAgICAgICAgICAgIGlmIChtTGFzdFRyYWNrID09IE5VTEwpCiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAKLSAgICAgICAgICAgICAgICBDSEVDSyhtTGFzdFRyYWNrLT5tZXRhLmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKTsKKyAgICAgICAgICAgICAgICBDSEVDSyhBTWVkaWFGb3JtYXRfZ2V0U3RyaW5nKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgJm1pbWUpKTsKICAgICAgICAgICAgICAgICBpZiAoc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9URVhUXzNHUFApICYmCiAgICAgICAgICAgICAgICAgICAgICAgICBzdHJjYXNlY21wKG1pbWUsICJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iKSkgewogICAgICAgICAgICAgICAgICAgICAvLyBGb3Igbm93IHdlIG9ubHkgc3VwcG9ydCBhIHNpbmdsZSB0eXBlIG9mIG1lZGlhIHBlciB0cmFjay4KQEAgLTE1MzQsNyArMTU1Niw3IEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIFN0cmluZzggbWltZUZvcm1hdCgoY29uc3QgY2hhciAqKShidWZmZXIuZ2V0KCkpLCBjaHVua19kYXRhX3NpemUpOwotICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgbWltZUZvcm1hdC5zdHJpbmcoKSk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgbWltZUZvcm1hdC5zdHJpbmcoKSk7CiAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0xNjEzLDIwICsxNjM1LDIzIEBACiAKICAgICAgICAgICAgIGlmIChjaHVua190eXBlICE9IEZPVVJDQygnZScsICduJywgJ2MnLCAnYScpKSB7CiAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIGNodW5rIHR5cGUgaXMgZW5jYSwgd2UnbGwgZ2V0IHRoZSB0eXBlIGZyb20gdGhlIGZybWEgYm94IGxhdGVyCi0gICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgRm91ckNDMk1JTUUoY2h1bmtfdHlwZSkpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgRm91ckNDMk1JTUUoY2h1bmtfdHlwZSkpOwogICAgICAgICAgICAgICAgIEFkanVzdENoYW5uZWxzQW5kUmF0ZShjaHVua190eXBlLCAmbnVtX2NoYW5uZWxzLCAmc2FtcGxlX3JhdGUpOwogCiAgICAgICAgICAgICAgICAgaWYgKCFzdHJjYXNlY21wKE1FRElBX01JTUVUWVBFX0FVRElPX1JBVywgRm91ckNDMk1JTUUoY2h1bmtfdHlwZSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUJpdHNQZXJTYW1wbGUsIHNhbXBsZV9zaXplKTsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9CSVRTX1BFUl9TQU1QTEUsIHNhbXBsZV9zaXplKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKGNodW5rX3R5cGUgPT0gRk9VUkNDKCd0JywgJ3cnLCAnbycsICdzJykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleVBjbUJpZ0VuZGlhbiwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9QQ01fQklHX0VORElBTiwgMSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBBTE9HVigiKioqIGNvZGluZz0nJXMnICVkIGNoYW5uZWxzLCBzaXplICVkLCByYXRlICVkXG4iLAogICAgICAgICAgICAgICAgICAgIGNodW5rLCBudW1fY2hhbm5lbHMsIHNhbXBsZV9zaXplLCBzYW1wbGVfcmF0ZSk7Ci0gICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsIG51bV9jaGFubmVscyk7Ci0gICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlTYW1wbGVSYXRlLCBzYW1wbGVfcmF0ZSk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX0NPVU5ULCBudW1fY2hhbm5lbHMpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1JBVEUsIHNhbXBsZV9yYXRlKTsKIAogICAgICAgICAgICAgaWYgKGNodW5rX3R5cGUgPT0gRk9VUkNDKCdhJywgJ2wnLCAnYScsICdjJykpIHsKIApAQCAtMTY1MiwxMSArMTY3NywxNCBAQAogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIHVpbnQ4X3QgYml0c1BlclNhbXBsZSA9IGNvb2tpZVs1XTsKLSAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlCaXRzUGVyU2FtcGxlLCBiaXRzUGVyU2FtcGxlKTsKLSAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsIGNvb2tpZVs5XSk7Ci0gICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgVTMyX0FUKCZjb29raWVbMjBdKSk7Ci0gICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXREYXRhKAotICAgICAgICAgICAgICAgICAgICAgICAga0tleUFsYWNNYWdpY0Nvb2tpZSwgTWV0YURhdGE6OlRZUEVfTk9ORSwgY29va2llLCBzaXplb2YoY29va2llKSk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0JJVFNfUEVSX1NBTVBMRSwgYml0c1BlclNhbXBsZSk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfQ09VTlQsIGNvb2tpZVs5XSk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX1NBTVBMRV9SQVRFLCBVMzJfQVQoJmNvb2tpZVsyMF0pKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NTRF8wLCBjb29raWUsIHNpemVvZihjb29raWUpKTsKICAgICAgICAgICAgICAgICBkYXRhX29mZnNldCArPSBzaXplb2YoY29va2llKTsKICAgICAgICAgICAgICAgICAqb2Zmc2V0ID0gZGF0YV9vZmZzZXQ7CiAgICAgICAgICAgICAgICAgQ0hFQ0tfRVEoKm9mZnNldCwgc3RvcF9vZmZzZXQpOwpAQCAtMTcxNCwxMCArMTc0MiwxMSBAQAogCiAgICAgICAgICAgICBpZiAoY2h1bmtfdHlwZSAhPSBGT1VSQ0MoJ2UnLCAnbicsICdjJywgJ3YnKSkgewogICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBjaHVuayB0eXBlIGlzIGVuY3YsIHdlJ2xsIGdldCB0aGUgdHlwZSBmcm9tIHRoZSBmcm1hIGJveCBsYXRlcgotICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIEZvdXJDQzJNSU1FKGNodW5rX3R5cGUpKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX01JTUUsIEZvdXJDQzJNSU1FKGNodW5rX3R5cGUpKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleVdpZHRoLCB3aWR0aCk7Ci0gICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlIZWlnaHQsIGhlaWdodCk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9XSURUSCwgd2lkdGgpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfSEVJR0hULCBoZWlnaHQpOwogCiAgICAgICAgICAgICBvZmY2NF90IHN0b3Bfb2Zmc2V0ID0gKm9mZnNldCArIGNodW5rX3NpemU7CiAgICAgICAgICAgICAqb2Zmc2V0ID0gZGF0YV9vZmZzZXQgKyBzaXplb2YoYnVmZmVyKTsKQEAgLTE4MDUsMTIgKzE4MzQsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIm1heCBzYW1wbGUgc2l6ZSB0b28gYmlnOiAlenUiLCBtYXhfc2l6ZSk7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleU1heElucHV0U2l6ZSwgbWF4X3NpemUgKyAxMCAqIDIpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NQVhfSU5QVVRfU0laRSwgbWF4X3NpemUgKyAxMCAqIDIpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAvLyBObyBzaXplIHdhcyBzcGVjaWZpZWQuIFBpY2sgYSBjb25zZXJ2YXRpdmVseSBsYXJnZSBzaXplLgogICAgICAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCBoZWlnaHQ7Ci0gICAgICAgICAgICAgICAgaWYgKCFtTGFzdFRyYWNrLT5tZXRhLmZpbmRJbnQzMihrS2V5V2lkdGgsIChpbnQzMl90Kikmd2lkdGgpIHx8Ci0gICAgICAgICAgICAgICAgICAgICFtTGFzdFRyYWNrLT5tZXRhLmZpbmRJbnQzMihrS2V5SGVpZ2h0LChpbnQzMl90KikgJmhlaWdodCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoIUFNZWRpYUZvcm1hdF9nZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9XSURUSCwgKGludDMyX3QqKSZ3aWR0aCkgfHwKKyAgICAgICAgICAgICAgICAgICAgIUFNZWRpYUZvcm1hdF9nZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfSEVJR0hULChpbnQzMl90KikgJmhlaWdodCkpIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIk5vIHdpZHRoIG9yIGhlaWdodCwgYXNzdW1pbmcgd29yc3QgY2FzZSAxMDgwcCIpOwogICAgICAgICAgICAgICAgICAgICB3aWR0aCA9IDE5MjA7CiAgICAgICAgICAgICAgICAgICAgIGhlaWdodCA9IDEwODA7CkBAIC0xODI1LDcgKzE4NTcsNyBAQAogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm1pbWU7Ci0gICAgICAgICAgICAgICAgQ0hFQ0sobUxhc3RUcmFjay0+bWV0YS5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKSk7CisgICAgICAgICAgICAgICAgQ0hFQ0soQU1lZGlhRm9ybWF0X2dldFN0cmluZyhtTGFzdFRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsICZtaW1lKSk7CiAgICAgICAgICAgICAgICAgaWYgKCFzdHJuY21wKG1pbWUsICJhdWRpby8iLCA2KSkgewogICAgICAgICAgICAgICAgICAgICAvLyBmb3IgYXVkaW8sIHVzZSAxMjhLQgogICAgICAgICAgICAgICAgICAgICBtYXhfc2l6ZSA9IDEwMjQgKiAxMjg7CkBAIC0xODQyLDI2ICsxODc0LDI4IEBACiAgICAgICAgICAgICAgICAgLy8gSEFDSzogYWxsb3cgMTAlIG92ZXJoZWFkCiAgICAgICAgICAgICAgICAgLy8gVE9ETzogcmVhZCBzYW1wbGUgc2l6ZSBmcm9tIHRyYWYgYXRvbSBmb3IgZnJhZ21lbnRlZCBNUEVHNC4KICAgICAgICAgICAgICAgICBtYXhfc2l6ZSArPSBtYXhfc2l6ZSAvIDEwOwotICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleU1heElucHV0U2l6ZSwgbWF4X3NpemUpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX01BWF9JTlBVVF9TSVpFLCBtYXhfc2l6ZSk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8vIE5PVEU6IHNldHRpbmcgYW5vdGhlciBwaWVjZSBvZiBtZXRhZGF0YSBpbnZhbGlkYXRlcyBhbnkgcG9pbnRlcnMgKHN1Y2ggYXMgdGhlCiAgICAgICAgICAgICAvLyBtaW1ldHlwZSkgcHJldmlvdXNseSBvYnRhaW5lZCwgc28gZG9uJ3QgY2FjaGUgdGhlbS4KICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm1pbWU7Ci0gICAgICAgICAgICBDSEVDSyhtTGFzdFRyYWNrLT5tZXRhLmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKTsKKyAgICAgICAgICAgIENIRUNLKEFNZWRpYUZvcm1hdF9nZXRTdHJpbmcobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCAmbWltZSkpOwogICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIGF2ZXJhZ2UgZnJhbWUgcmF0ZS4KICAgICAgICAgICAgIGlmICghc3RybmNhc2VjbXAoInZpZGVvLyIsIG1pbWUsIDYpKSB7CiAgICAgICAgICAgICAgICAgc2l6ZV90IG5TYW1wbGVzID0gbUxhc3RUcmFjay0+c2FtcGxlVGFibGUtPmNvdW50U2FtcGxlcygpOwogICAgICAgICAgICAgICAgIGlmIChuU2FtcGxlcyA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgdHJhY2tJZDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1MYXN0VHJhY2stPm1ldGEuZmluZEludDMyKGtLZXlUcmFja0lELCAmdHJhY2tJZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKEFNZWRpYUZvcm1hdF9nZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfVFJBQ0tfSUQsICZ0cmFja0lkKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtVHJleC5zaXplKCk7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyZXggKnQgPSAmbVRyZXguZWRpdEl0ZW1BdChpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodC0+dHJhY2tfSUQgPT0gKHVpbnQzMl90KSB0cmFja0lkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0LT5kZWZhdWx0X3NhbXBsZV9kdXJhdGlvbiA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZnJhbWVSYXRlID0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+dGltZXNjYWxlIC8gdC0+ZGVmYXVsdF9zYW1wbGVfZHVyYXRpb247Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlGcmFtZVJhdGUsIGZyYW1lUmF0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9GUkFNRV9SQVRFLCBmcmFtZVJhdGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTE4NjksMTUgKzE5MDMsMTggQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgZHVyYXRpb25VczsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1MYXN0VHJhY2stPm1ldGEuZmluZEludDY0KGtLZXlEdXJhdGlvbiwgJmR1cmF0aW9uVXMpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChBTWVkaWFGb3JtYXRfZ2V0SW50NjQobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0RVUkFUSU9OLCAmZHVyYXRpb25VcykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkdXJhdGlvblVzID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZnJhbWVSYXRlID0gKG5TYW1wbGVzICogMTAwMDAwMExMICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZHVyYXRpb25VcyA+PiAxKSkgLyBkdXJhdGlvblVzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUZyYW1lUmF0ZSwgZnJhbWVSYXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfRlJBTUVfUkFURSwgZnJhbWVSYXRlKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBBTE9HVigic2V0dGluZyBmcmFtZSBjb3VudCAlenUiLCBuU2FtcGxlcyk7Ci0gICAgICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUZyYW1lQ291bnQsIG5TYW1wbGVzKTsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9GUkFNRV9DT1VOVCwgblNhbXBsZXMpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIApAQCAtMTk4NSw3ICsyMDIyLDcgQEAKICAgICAgICAgICAgIGlmIChidWZmZXJbbGVuIC0gMV0gIT0gJy8nKSB7CiAgICAgICAgICAgICAgICAgYnVmZmVyW2xlbl0gPSAnLyc7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtRmlsZU1ldGFEYXRhLnNldENTdHJpbmcoa0tleUxvY2F0aW9uLCAmYnVmZmVyWzBdKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUZpbGVNZXRhRGF0YSwgQU1FRElBRk9STUFUX0tFWV9MT0NBVElPTiwgJmJ1ZmZlclswXSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCkBAIC0yMDE1LDggKzIwNTIsOCBAQAogICAgICAgICAgICAgaWYgKG1MYXN0VHJhY2sgPT0gTlVMTCkKICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogCi0gICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldERhdGEoCi0gICAgICAgICAgICAgICAgICAgIGtLZXlFU0RTLCBrVHlwZUVTRFMsICZidWZmZXJbNF0sIGNodW5rX2RhdGFfc2l6ZSAtIDQpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtTGFzdFRyYWNrLT5tZXRhLCAKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9FU0RTLCAmYnVmZmVyWzRdLCBjaHVua19kYXRhX3NpemUgLSA0KTsKIAogICAgICAgICAgICAgaWYgKG1QYXRoLnNpemUoKSA+PSAyCiAgICAgICAgICAgICAgICAgICAgICYmIG1QYXRoW21QYXRoLnNpemUoKSAtIDJdID09IEZPVVJDQygnbScsICdwJywgJzQnLCAnYScpKSB7CkBAIC0yMDQwLDcgKzIwNzcsOCBAQAogICAgICAgICAgICAgICAgIHVpbnQ4X3Qgb2JqZWN0VHlwZUluZGljYXRpb247CiAgICAgICAgICAgICAgICAgaWYgKGVzZHMuZ2V0T2JqZWN0VHlwZUluZGljYXRpb24oJm9iamVjdFR5cGVJbmRpY2F0aW9uKSA9PSBPSykgewogICAgICAgICAgICAgICAgICAgICBpZiAob2JqZWN0VHlwZUluZGljYXRpb24gPj0gMHg2MCAmJiBvYmplY3RUeXBlSW5kaWNhdGlvbiA8PSAweDY1KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHMik7CisgICAgICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzIpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtMjA2NywxMCArMjEwNSwxMiBAQAogICAgICAgICAgICAgdWludDMyX3QgbWF4Qml0cmF0ZSA9IFUzMl9BVCgmYnVmZmVyWzRdKTsKICAgICAgICAgICAgIHVpbnQzMl90IGF2Z0JpdHJhdGUgPSBVMzJfQVQoJmJ1ZmZlcls4XSk7CiAgICAgICAgICAgICBpZiAobWF4Qml0cmF0ZSA+IDAgJiYgbWF4Qml0cmF0ZSA8IElOVDMyX01BWCkgewotICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleU1heEJpdFJhdGUsIChpbnQzMl90KW1heEJpdHJhdGUpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NQVhfQklUX1JBVEUsIChpbnQzMl90KW1heEJpdHJhdGUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKGF2Z0JpdHJhdGUgPiAwICYmIGF2Z0JpdHJhdGUgPCBJTlQzMl9NQVgpIHsKLSAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlCaXRSYXRlLCAoaW50MzJfdClhdmdCaXRyYXRlKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQklUX1JBVEUsIChpbnQzMl90KWF2Z0JpdHJhdGUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTIwOTQsOCArMjEzNCw4IEBACiAgICAgICAgICAgICBpZiAobUxhc3RUcmFjayA9PSBOVUxMKQogICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAKLSAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0RGF0YSgKLSAgICAgICAgICAgICAgICAgICAga0tleUFWQ0MsIGtUeXBlQVZDQywgYnVmZmVyLmdldCgpLCBjaHVua19kYXRhX3NpemUpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtTGFzdFRyYWNrLT5tZXRhLCAKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9DU0RfQVZDLCBidWZmZXIuZ2V0KCksIGNodW5rX2RhdGFfc2l6ZSk7CiAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0yMTE2LDggKzIxNTYsOCBAQAogICAgICAgICAgICAgaWYgKG1MYXN0VHJhY2sgPT0gTlVMTCkKICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogCi0gICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldERhdGEoCi0gICAgICAgICAgICAgICAgICAgIGtLZXlIVkNDLCBrVHlwZUhWQ0MsIGJ1ZmZlci5nZXQoKSwgY2h1bmtfZGF0YV9zaXplKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobUxhc3RUcmFjay0+bWV0YSwgCisgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQ1NEX0hFVkMsIGJ1ZmZlci5nZXQoKSwgY2h1bmtfZGF0YV9zaXplKTsKIAogICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwogICAgICAgICAgICAgYnJlYWs7CkBAIC0yMTUyLDcgKzIxOTIsOCBAQAogICAgICAgICAgICAgaWYgKG1MYXN0VHJhY2sgPT0gTlVMTCkKICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogCi0gICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldERhdGEoa0tleUQyNjMsIGtUeXBlRDI2MywgYnVmZmVyLCBjaHVua19kYXRhX3NpemUpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0QyNjMsIGJ1ZmZlciwgY2h1bmtfZGF0YV9zaXplKTsKIAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTIyODAsMTUgKzIzMjEsMTUgQEAKICAgICAgICAgICAgICAgICBkdXJhdGlvbiA9IGQzMjsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChkdXJhdGlvbiAhPSAwICYmIG1IZWFkZXJUaW1lc2NhbGUgIT0gMCAmJiBkdXJhdGlvbiA8IFVJTlQ2NF9NQVggLyAxMDAwMDAwKSB7Ci0gICAgICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXRJbnQ2NChrS2V5RHVyYXRpb24sIGR1cmF0aW9uICogMTAwMDAwMCAvIG1IZWFkZXJUaW1lc2NhbGUpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NChtRmlsZU1ldGFEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9EVVJBVElPTiwgZHVyYXRpb24gKiAxMDAwMDAwIC8gbUhlYWRlclRpbWVzY2FsZSk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIFN0cmluZzggczsKICAgICAgICAgICAgIGlmIChjb252ZXJ0VGltZVRvRGF0ZShjcmVhdGlvblRpbWUsICZzKSkgewotICAgICAgICAgICAgICAgIG1GaWxlTWV0YURhdGEuc2V0Q1N0cmluZyhrS2V5RGF0ZSwgcy5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtRmlsZU1ldGFEYXRhLCBBTUVESUFGT1JNQVRfS0VZX0RBVEUsIHMuc3RyaW5nKCkpOwogICAgICAgICAgICAgfQogCi0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKQEAgLTIzMzAsNyArMjM3MSw4IEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChkdXJhdGlvbiAhPSAwICYmIG1IZWFkZXJUaW1lc2NhbGUgIT0gMCkgewotICAgICAgICAgICAgICAgIG1GaWxlTWV0YURhdGEuc2V0SW50NjQoa0tleUR1cmF0aW9uLCBkdXJhdGlvbiAqIDEwMDAwMDAgLyBtSGVhZGVyVGltZXNjYWxlKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQobUZpbGVNZXRhRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04sIGR1cmF0aW9uICogMTAwMDAwMCAvIG1IZWFkZXJUaW1lc2NhbGUpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBicmVhazsKQEAgLTIzNjQsNyArMjQwNiw4IEBACiAgICAgICAgICAgICAvLyBmb3IgYSBwcmFjdGljYWwgcmVhc29uIGFzIHZhcmlvdXMgTVBFRzQgY29udGFpbmVycyB1c2UgaXQuCiAgICAgICAgICAgICBpZiAodHlwZSA9PSBGT1VSQ0MoJ3QnLCAnZScsICd4JywgJ3QnKSB8fCB0eXBlID09IEZPVVJDQygncycsICdiJywgJ3QnLCAnbCcpKSB7CiAgICAgICAgICAgICAgICAgaWYgKG1MYXN0VHJhY2sgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9URVhUXzNHUFApOworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9URVhUXzNHUFApOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIApAQCAtMjQwOCwxMSArMjQ1MSwxMCBAQAogICAgICAgICAgICAgaWYgKG1MYXN0VHJhY2sgPT0gTlVMTCkKICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogCi0gICAgICAgICAgICB1aW50MzJfdCB0eXBlOwotICAgICAgICAgICAgY29uc3Qgdm9pZCAqZGF0YTsKKyAgICAgICAgICAgIHZvaWQgKmRhdGE7CiAgICAgICAgICAgICBzaXplX3Qgc2l6ZSA9IDA7Ci0gICAgICAgICAgICBpZiAoIW1MYXN0VHJhY2stPm1ldGEuZmluZERhdGEoCi0gICAgICAgICAgICAgICAgICAgIGtLZXlUZXh0Rm9ybWF0RGF0YSwgJnR5cGUsICZkYXRhLCAmc2l6ZSkpIHsKKyAgICAgICAgICAgIGlmICghQU1lZGlhRm9ybWF0X2dldEJ1ZmZlcihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX1RFWFRfRk9STUFUX0RBVEEsICZkYXRhLCAmc2l6ZSkpIHsKICAgICAgICAgICAgICAgICBzaXplID0gMDsKICAgICAgICAgICAgIH0KIApAQCAtMjQzOSw4ICsyNDgxLDggQEAKICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0RGF0YSgKLSAgICAgICAgICAgICAgICAgICAga0tleVRleHRGb3JtYXREYXRhLCAwLCBidWZmZXIsIHNpemUgKyBjaHVua19zaXplKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9URVhUX0ZPUk1BVF9EQVRBLCBidWZmZXIsIHNpemUgKyBjaHVua19zaXplKTsKIAogICAgICAgICAgICAgZGVsZXRlW10gYnVmZmVyOwogCkBAIC0yNDcyLDggKzI1MTQsOCBAQAogICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIG1GaWxlTWV0YURhdGEuc2V0RGF0YSgKLSAgICAgICAgICAgICAgICBrS2V5QWxidW1BcnQsIE1ldGFEYXRhOjpUWVBFX05PTkUsCisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1GaWxlTWV0YURhdGEsCisgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9BTEJVTUFSVCwKICAgICAgICAgICAgICAgICBidWZmZXIuZ2V0KCkgKyBrU2tpcEJ5dGVzT2ZEYXRhQm94LCBjaHVua19kYXRhX3NpemUgLSBrU2tpcEJ5dGVzT2ZEYXRhQm94KTsKIAogICAgICAgICAgICAgYnJlYWs7CkBAIC0yNTQ3LDcgKzI1ODksMTkgQEAKICAgICAgICAgY2FzZSBGT1VSQ0MoJ2EnLCAnYycsICctJywgJzMnKToKICAgICAgICAgewogICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwotICAgICAgICAgICAgcmV0dXJuIHBhcnNlQUMzU2FtcGxlRW50cnkoZGF0YV9vZmZzZXQpOworICAgICAgICAgICAgcmV0dXJuIHBhcnNlQUMzU3BlY2lmaWNCb3goZGF0YV9vZmZzZXQpOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBGT1VSQ0MoJ2UnLCAnYycsICctJywgJzMnKToKKyAgICAgICAgeworICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOworICAgICAgICAgICAgcmV0dXJuIHBhcnNlRUFDM1NwZWNpZmljQm94KGRhdGFfb2Zmc2V0KTsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgRk9VUkNDKCdhJywgJ2MnLCAnLScsICc0Jyk6CisgICAgICAgIHsKKyAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKKyAgICAgICAgICAgIHJldHVybiBwYXJzZUFDNFNwZWNpZmljQm94KGRhdGFfb2Zmc2V0KTsKICAgICAgICAgfQogCiAgICAgICAgIGNhc2UgRk9VUkNDKCdmJywgJ3QnLCAneScsICdwJyk6CkBAIC0yNjIxLDM2ICsyNjc1LDI2MCBAQAogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgTVBFRzRFeHRyYWN0b3I6OnBhcnNlQUMzU2FtcGxlRW50cnkob2ZmNjRfdCBvZmZzZXQpIHsKK3N0YXR1c190IE1QRUc0RXh0cmFjdG9yOjpwYXJzZUNoYW5uZWxDb3VudFNhbXBsZVJhdGUoCisgICAgICAgIG9mZjY0X3QgKm9mZnNldCwgdWludDE2X3QgKmNoYW5uZWxDb3VudCwgdWludDE2X3QgKnNhbXBsZVJhdGUpIHsKICAgICAvLyBza2lwIDE2IGJ5dGVzOgogICAgIC8vICArIDYtYnl0ZSByZXNlcnZlZCwKICAgICAvLyAgKyAyLWJ5dGUgZGF0YSByZWZlcmVuY2UgaW5kZXgsCiAgICAgLy8gICsgOC1ieXRlIHJlc2VydmVkCi0gICAgb2Zmc2V0ICs9IDE2OwotICAgIHVpbnQxNl90IGNoYW5uZWxDb3VudDsKLSAgICBpZiAoIW1EYXRhU291cmNlLT5nZXRVSW50MTYob2Zmc2V0LCAmY2hhbm5lbENvdW50KSkgeworICAgICpvZmZzZXQgKz0gMTY7CisgICAgaWYgKCFtRGF0YVNvdXJjZS0+Z2V0VUludDE2KCpvZmZzZXQsIGNoYW5uZWxDb3VudCkpIHsKKyAgICAgICAgQUxPR0UoIk1QRUc0RXh0cmFjdG9yOiBlcnJvciB3aGlsZSByZWFkaW5nIHNhbXBsZSBlbnRyeSBib3g6IGNhbm5vdCByZWFkIGNoYW5uZWwgY291bnQiKTsKICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICB9CiAgICAgLy8gc2tpcCA4IGJ5dGVzOgogICAgIC8vICArIDItYnl0ZSBjaGFubmVsQ291bnQsCiAgICAgLy8gICsgMi1ieXRlIHNhbXBsZSBzaXplLAogICAgIC8vICArIDQtYnl0ZSByZXNlcnZlZAotICAgIG9mZnNldCArPSA4OwotICAgIHVpbnQxNl90IHNhbXBsZVJhdGU7Ci0gICAgaWYgKCFtRGF0YVNvdXJjZS0+Z2V0VUludDE2KG9mZnNldCwgJnNhbXBsZVJhdGUpKSB7Ci0gICAgICAgIEFMT0dFKCJNUEVHNEV4dHJhY3RvcjogZXJyb3Igd2hpbGUgcmVhZGluZyBhYy0zIGJsb2NrOiBjYW5ub3QgcmVhZCBzYW1wbGUgcmF0ZSIpOworICAgICpvZmZzZXQgKz0gODsKKyAgICBpZiAoIW1EYXRhU291cmNlLT5nZXRVSW50MTYoKm9mZnNldCwgc2FtcGxlUmF0ZSkpIHsKKyAgICAgICAgQUxPR0UoIk1QRUc0RXh0cmFjdG9yOiBlcnJvciB3aGlsZSByZWFkaW5nIHNhbXBsZSBlbnRyeSBib3g6IGNhbm5vdCByZWFkIHNhbXBsZSByYXRlIik7CiAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgfQotCiAgICAgLy8gc2tpcCA0IGJ5dGVzOgogICAgIC8vICArIDItYnl0ZSBzYW1wbGVSYXRlLAogICAgIC8vICArIDItYnl0ZSByZXNlcnZlZAotICAgIG9mZnNldCArPSA0OwotICAgIHJldHVybiBwYXJzZUFDM1NwZWNpZmljQm94KG9mZnNldCwgc2FtcGxlUmF0ZSk7CisgICAgKm9mZnNldCArPSA0OworICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgTVBFRzRFeHRyYWN0b3I6OnBhcnNlQUMzU3BlY2lmaWNCb3goCi0gICAgICAgIG9mZjY0X3Qgb2Zmc2V0LCB1aW50MTZfdCBzYW1wbGVSYXRlKSB7CitzdGF0dXNfdCBNUEVHNEV4dHJhY3Rvcjo6cGFyc2VBQzRTcGVjaWZpY0JveChvZmY2NF90IG9mZnNldCkgeworICAgIGlmIChtTGFzdFRyYWNrID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICB1aW50MTZfdCBzYW1wbGVSYXRlLCBjaGFubmVsQ291bnQ7CisgICAgc3RhdHVzX3Qgc3RhdHVzOworICAgIGlmICgoc3RhdHVzID0gcGFyc2VDaGFubmVsQ291bnRTYW1wbGVSYXRlKCZvZmZzZXQsICZjaGFubmVsQ291bnQsICZzYW1wbGVSYXRlKSkgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgdWludDMyX3Qgc2l6ZTsKKyAgICAvLyArIDQtYnl0ZSBzaXplCisgICAgLy8gKyA0LWJ5dGUgdHlwZQorICAgIC8vICsgMy1ieXRlIHBheWxvYWQKKyAgICBjb25zdCB1aW50MzJfdCBrQUM0TWluaW11bUJveFNpemUgPSA0ICsgNCArIDM7CisgICAgaWYgKCFtRGF0YVNvdXJjZS0+Z2V0VUludDMyKG9mZnNldCwgJnNpemUpIHx8IHNpemUgPCBrQUM0TWluaW11bUJveFNpemUpIHsKKyAgICAgICAgQUxPR0UoIk1QRUc0RXh0cmFjdG9yOiBlcnJvciB3aGlsZSByZWFkaW5nIGFjLTQgYmxvY2s6IGNhbm5vdCByZWFkIHNwZWNpZmljIGJveCBzaXplIik7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgLy8gKyA0LWJ5dGUgc2l6ZQorICAgIG9mZnNldCArPSA0OworICAgIHVpbnQzMl90IHR5cGU7CisgICAgaWYgKCFtRGF0YVNvdXJjZS0+Z2V0VUludDMyKG9mZnNldCwgJnR5cGUpIHx8IHR5cGUgIT0gRk9VUkNDKCdkJywgJ2EnLCAnYycsICc0JykpIHsKKyAgICAgICAgQUxPR0UoIk1QRUc0RXh0cmFjdG9yOiBlcnJvciB3aGlsZSByZWFkaW5nIGFjLTQgc3BlY2lmaWMgYmxvY2s6IGhlYWRlciBub3QgZGFjNCIpOworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIC8vICsgNC1ieXRlIHR5cGUKKyAgICBvZmZzZXQgKz0gNDsKKyAgICAvLyBhdCBsZWFzdCBmb3IgQUM0IERTSSB2MSB0aGlzIGlzIGJpZyBlbm91Z2gKKyAgICBjb25zdCB1aW50MzJfdCBrQUM0U3BlY2lmaWNCb3hQYXlsb2FkU2l6ZSA9IDI1NjsKKyAgICB1aW50OF90IGNodW5rW2tBQzRTcGVjaWZpY0JveFBheWxvYWRTaXplXTsKKyAgICBzc2l6ZV90IGRzaVNpemUgPSBzaXplIC0gODsgLy8gc2l6ZSBvZiBib3ggLSBzaXplIGFuZCB0eXBlIGZpZWxkcworICAgIGlmIChkc2lTaXplID49IChzc2l6ZV90KWtBQzRTcGVjaWZpY0JveFBheWxvYWRTaXplIHx8CisgICAgICAgIG1EYXRhU291cmNlLT5yZWFkQXQob2Zmc2V0LCBjaHVuaywgZHNpU2l6ZSkgIT0gZHNpU2l6ZSkgeworICAgICAgICBBTE9HRSgiTVBFRzRFeHRyYWN0b3I6IGVycm9yIHdoaWxlIHJlYWRpbmcgYWMtNCBzcGVjaWZpYyBibG9jazogYml0c3RyZWFtIGZpZWxkcyIpOworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKyAgICAvLyArIHNpemUtYnl0ZSBwYXlsb2FkCisgICAgb2Zmc2V0ICs9IGRzaVNpemU7CisgICAgQUJpdFJlYWRlciBicihjaHVuaywgZHNpU2l6ZSk7CisgICAgQUM0RFNJUGFyc2VyIHBhcnNlcihicik7CisgICAgaWYgKCFwYXJzZXIucGFyc2UoKSl7CisgICAgICAgIEFMT0dFKCJNUEVHNEV4dHJhY3RvcjogZXJyb3Igd2hpbGUgcGFyc2luZyBhYy00IHNwZWNpZmljIGJsb2NrIik7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtTGFzdFRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX0FVRElPX0FDNCk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9DT1VOVCwgY2hhbm5lbENvdW50KTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9TQU1QTEVfUkFURSwgc2FtcGxlUmF0ZSk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBNUEVHNEV4dHJhY3Rvcjo6cGFyc2VFQUMzU3BlY2lmaWNCb3gob2ZmNjRfdCBvZmZzZXQpIHsKKyAgICBpZiAobUxhc3RUcmFjayA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgdWludDE2X3Qgc2FtcGxlUmF0ZSwgY2hhbm5lbHM7CisgICAgc3RhdHVzX3Qgc3RhdHVzOworICAgIGlmICgoc3RhdHVzID0gcGFyc2VDaGFubmVsQ291bnRTYW1wbGVSYXRlKCZvZmZzZXQsICZjaGFubmVscywgJnNhbXBsZVJhdGUpKSAhPSBPSykgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICB1aW50MzJfdCBzaXplOworICAgIC8vICsgNC1ieXRlIHNpemUKKyAgICAvLyArIDQtYnl0ZSB0eXBlCisgICAgLy8gKyAzLWJ5dGUgcGF5bG9hZAorICAgIGNvbnN0IHVpbnQzMl90IGtFQUMzU3BlY2lmaWNCb3hNaW5TaXplID0gMTE7CisgICAgLy8gMTMgKyAzICsgKDggKiAoMiArIDUgKyA1ICsgMyArIDEgKyAzICsgNCArICgxNCAqIDkgKyAxKSkpIGJpdHMgPT0gMTUyIGJ5dGVzIHRoZW9yZXRpY2FsIG1heAorICAgIC8vIGNhbGN1bGF0ZWQgZnJvbSB0aGUgcmVxdWlyZWQgYml0cyByZWFkIGJlbG93IGFzIHdlbGwgYXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGluZGVwZW5kZW50CisgICAgLy8gYW5kIGRlcGVuZGFudCBzdWIgc3RyZWFtcyB5b3UgY2FuIGhhdmUKKyAgICBjb25zdCB1aW50MzJfdCBrRUFDM1NwZWNpZmljQm94TWF4U2l6ZSA9IDE1MjsKKyAgICBpZiAoIW1EYXRhU291cmNlLT5nZXRVSW50MzIob2Zmc2V0LCAmc2l6ZSkgfHwKKyAgICAgICAgc2l6ZSA8IGtFQUMzU3BlY2lmaWNCb3hNaW5TaXplIHx8CisgICAgICAgIHNpemUgPiBrRUFDM1NwZWNpZmljQm94TWF4U2l6ZSkgeworICAgICAgICBBTE9HRSgiTVBFRzRFeHRyYWN0b3I6IGVycm9yIHdoaWxlIHJlYWRpbmcgZWFjLTMgYmxvY2s6IGNhbm5vdCByZWFkIHNwZWNpZmljIGJveCBzaXplIik7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgb2Zmc2V0ICs9IDQ7CisgICAgdWludDMyX3QgdHlwZTsKKyAgICBpZiAoIW1EYXRhU291cmNlLT5nZXRVSW50MzIob2Zmc2V0LCAmdHlwZSkgfHwgdHlwZSAhPSBGT1VSQ0MoJ2QnLCAnZScsICdjJywgJzMnKSkgeworICAgICAgICBBTE9HRSgiTVBFRzRFeHRyYWN0b3I6IGVycm9yIHdoaWxlIHJlYWRpbmcgZWFjLTMgc3BlY2lmaWMgYmxvY2s6IGhlYWRlciBub3QgZGVjMyIpOworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIG9mZnNldCArPSA0OworICAgIHVpbnQ4X3QqIGNodW5rID0gbmV3IChzdGQ6Om5vdGhyb3cpIHVpbnQ4X3Rbc2l6ZV07CisgICAgaWYgKGNodW5rID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdChvZmZzZXQsIGNodW5rLCBzaXplKSAhPSAoc3NpemVfdClzaXplKSB7CisgICAgICAgIEFMT0dFKCJNUEVHNEV4dHJhY3RvcjogZXJyb3Igd2hpbGUgcmVhZGluZyBlYWMtMyBzcGVjaWZpYyBibG9jazogYml0c3RyZWFtIGZpZWxkcyIpOworICAgICAgICBkZWxldGVbXSBjaHVuazsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICBBQml0UmVhZGVyIGJyKGNodW5rLCBzaXplKTsKKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhbm5lbENvdW50VGFibGVbXSA9IHsyLCAxLCAyLCAzLCAzLCA0LCA0LCA1fTsKKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgc2FtcGxlUmF0ZVRhYmxlW10gPSB7NDgwMDAsIDQ0MTAwLCAzMjAwMH07CisKKyAgICBpZiAoYnIubnVtQml0c0xlZnQoKSA8IDE2KSB7CisgICAgICAgIGRlbGV0ZVtdIGNodW5rOworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKyAgICB1bnNpZ25lZCBkYXRhX3JhdGUgPSBici5nZXRCaXRzKDEzKTsKKyAgICBBTE9HVigiRUFDMyBkYXRhIHJhdGUgPSAlZCIsIGRhdGFfcmF0ZSk7CisKKyAgICB1bnNpZ25lZCBudW1faW5kX3N1YiA9IGJyLmdldEJpdHMoMykgKyAxOworICAgIEFMT0dWKCJFQUMzIGluZGVwZW5kYW50IHN1YnN0cmVhbXMgPSAlZCIsIG51bV9pbmRfc3ViKTsKKyAgICBpZiAoYnIubnVtQml0c0xlZnQoKSA8IChudW1faW5kX3N1YiAqIDIzKSkgeworICAgICAgICBkZWxldGVbXSBjaHVuazsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICB1bnNpZ25lZCBjaGFubmVsQ291bnQgPSAwOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBudW1faW5kX3N1YjsgaSsrKSB7CisgICAgICAgIHVuc2lnbmVkIGZzY29kID0gYnIuZ2V0Qml0cygyKTsKKyAgICAgICAgaWYgKGZzY29kID09IDMpIHsKKyAgICAgICAgICAgIEFMT0dFKCJJbmNvcnJlY3QgZnNjb2QgKDMpIGluIEVBQzMgaGVhZGVyIik7CisgICAgICAgICAgICBkZWxldGVbXSBjaHVuazsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KKyAgICAgICAgdW5zaWduZWQgYm94U2FtcGxlUmF0ZSA9IHNhbXBsZVJhdGVUYWJsZVtmc2NvZF07CisgICAgICAgIGlmIChib3hTYW1wbGVSYXRlICE9IHNhbXBsZVJhdGUpIHsKKyAgICAgICAgICAgIEFMT0dFKCJzYW1wbGUgcmF0ZSBtaXNtYXRjaDogYm94U2FtcGxlUmF0ZSA9ICVkLCBzYW1wbGVSYXRlID0gJWQiLAorICAgICAgICAgICAgICAgIGJveFNhbXBsZVJhdGUsIHNhbXBsZVJhdGUpOworICAgICAgICAgICAgZGVsZXRlW10gY2h1bms7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CisKKyAgICAgICAgdW5zaWduZWQgYnNpZCA9IGJyLmdldEJpdHMoNSk7CisgICAgICAgIGlmIChic2lkIDwgOCkgeworICAgICAgICAgICAgQUxPR1coIkluY29ycmVjdCBic2lkIGluIEVBQzMgaGVhZGVyLiBQb3NzaWJseSBBQy0zPyIpOworICAgICAgICAgICAgZGVsZXRlW10gY2h1bms7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CisKKyAgICAgICAgLy8gc2tpcAorICAgICAgICBici5za2lwQml0cygyKTsKKyAgICAgICAgdW5zaWduZWQgYnNtb2QgPSBici5nZXRCaXRzKDMpOworICAgICAgICB1bnNpZ25lZCBhY21vZCA9IGJyLmdldEJpdHMoMyk7CisgICAgICAgIHVuc2lnbmVkIGxmZW9uID0gYnIuZ2V0Qml0cygxKTsKKyAgICAgICAgLy8gd2UgY3VycmVudGx5IG9ubHkgc3VwcG9ydCB0aGUgZmlyc3Qgc3RyZWFtCisgICAgICAgIGlmIChpID09IDApCisgICAgICAgICAgICBjaGFubmVsQ291bnQgPSBjaGFubmVsQ291bnRUYWJsZVthY21vZF0gKyBsZmVvbjsKKyAgICAgICAgQUxPR1YoImJzbW9kID0gJWQsIGFjbW9kID0gJWQsIGxmZW9uID0gJWQiLCBic21vZCwgYWNtb2QsIGxmZW9uKTsKKworICAgICAgICBici5za2lwQml0cygzKTsKKyAgICAgICAgdW5zaWduZWQgbnVtX2RlcF9zdWIgPSBici5nZXRCaXRzKDQpOworICAgICAgICBBTE9HVigiRUFDMyBkZXBlbmRhbnQgc3Vic3RyZWFtcyA9ICVkIiwgbnVtX2RlcF9zdWIpOworICAgICAgICBpZiAobnVtX2RlcF9zdWIgIT0gMCkgeworICAgICAgICAgICAgaWYgKGJyLm51bUJpdHNMZWZ0KCkgPCA5KSB7CisgICAgICAgICAgICAgICAgZGVsZXRlW10gY2h1bms7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0YXRpYyBjb25zdCBjaGFyKiBjaGFuX2xvY190YmxbXSA9IHsgIkxjL1JjIiwiTHJzL1JycyIsIkNzIiwiVHMiLCJMc2QvUnNkIiwKKyAgICAgICAgICAgICAgICAiTHcvUnciLCJMdmgvUnZoIiwiQ3ZoIiwiTGZlMiIgfTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGNoYW5fbG9jID0gYnIuZ2V0Qml0cyg5KTsKKyAgICAgICAgICAgIHVuc2lnbmVkIG1hc2sgPSAxOworICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBqID0gMDsgaiA8IDk7IGorKywgbWFzayA8PD0gMSkgeworICAgICAgICAgICAgICAgIGlmICgoY2hhbl9sb2MgJiBtYXNrKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHdlIGN1cnJlbnRseSBvbmx5IHN1cHBvcnQgdGhlIGZpcnN0IHN0cmVhbQorICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsQ291bnQrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZXNlIGFyZSAyIGNoYW5uZWxzIGluIHRoZSBtYXNrCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaiA9PSAwIHx8IGogPT0gMSB8fCBqID09IDQgfHwgaiA9PSA1IHx8IGogPT0gNikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxDb3VudCsrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIgJXMiLCBjaGFuX2xvY190Ymxbal0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChici5udW1CaXRzTGVmdCgpID09IDApIHsKKyAgICAgICAgICAgICAgICBkZWxldGVbXSBjaHVuazsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnIuc2tpcEJpdHMoMSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoYnIubnVtQml0c0xlZnQoKSAhPSAwKSB7CisgICAgICAgIGlmIChici5udW1CaXRzTGVmdCgpIDwgOCkgeworICAgICAgICAgICAgZGVsZXRlW10gY2h1bms7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CisgICAgICAgIHVuc2lnbmVkIG1hc2sgPSBici5nZXRCaXRzKDgpOworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgODsgaSsrKSB7CisgICAgICAgICAgICBpZiAoKCgweDEgPDwgaSkgJiYgbWFzaykgPT0gMCkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgaWYgKGJyLm51bUJpdHNMZWZ0KCkgPCA4KSB7CisgICAgICAgICAgICAgICAgZGVsZXRlW10gY2h1bms7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN3aXRjaCAoaSkgeworICAgICAgICAgICAgICAgIGNhc2UgMDogeworICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjb21wbGV4aXR5ID0gYnIuZ2V0Qml0cyg4KTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkZvdW5kIGEgSk9DIHN0cmVhbSB3aXRoIGNvbXBsZXhpdHkgPSAlZCIsIGNvbXBsZXhpdHkpOworICAgICAgICAgICAgICAgIH1icmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OiB7CisgICAgICAgICAgICAgICAgICAgIGJyLnNraXBCaXRzKDgpOworICAgICAgICAgICAgICAgIH1icmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfQVVESU9fRUFDMyk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9DT1VOVCwgY2hhbm5lbENvdW50KTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9TQU1QTEVfUkFURSwgc2FtcGxlUmF0ZSk7CisKKyAgICBkZWxldGVbXSBjaHVuazsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE1QRUc0RXh0cmFjdG9yOjpwYXJzZUFDM1NwZWNpZmljQm94KG9mZjY0X3Qgb2Zmc2V0KSB7CisgICAgaWYgKG1MYXN0VHJhY2sgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIHVpbnQxNl90IHNhbXBsZVJhdGUsIGNoYW5uZWxzOworICAgIHN0YXR1c190IHN0YXR1czsKKyAgICBpZiAoKHN0YXR1cyA9IHBhcnNlQ2hhbm5lbENvdW50U2FtcGxlUmF0ZSgmb2Zmc2V0LCAmY2hhbm5lbHMsICZzYW1wbGVSYXRlKSkgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CiAgICAgdWludDMyX3Qgc2l6ZTsKICAgICAvLyArIDQtYnl0ZSBzaXplCiAgICAgLy8gKyA0LWJ5dGUgdHlwZQpAQCAtMjcwNSwxMiArMjk4Myw5IEBACiAgICAgdW5zaWduZWQgbGZlb24gPSBici5nZXRCaXRzKDEpOwogICAgIHVuc2lnbmVkIGNoYW5uZWxDb3VudCA9IGNoYW5uZWxDb3VudFRhYmxlW2FjbW9kXSArIGxmZW9uOwogCi0gICAgaWYgKG1MYXN0VHJhY2sgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLSAgICBtTGFzdFRyYWNrLT5tZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQzMpOwotICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgY2hhbm5lbENvdW50KTsKLSAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlTYW1wbGVSYXRlLCBzYW1wbGVSYXRlKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfQVVESU9fQUMzKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX0NPVU5ULCBjaGFubmVsQ291bnQpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX1NBTVBMRV9SQVRFLCBzYW1wbGVSYXRlKTsKICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTI4MzAsOCArMzEwNSw5IEBACiAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAKICAgICBpbnQ2NF90IG1ldGFEdXJhdGlvbjsKLSAgICBpZiAoIW1MYXN0VHJhY2stPm1ldGEuZmluZEludDY0KGtLZXlEdXJhdGlvbiwgJm1ldGFEdXJhdGlvbikgfHwgbWV0YUR1cmF0aW9uID09IDApIHsKLSAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQ2NChrS2V5RHVyYXRpb24sIHNpZHhEdXJhdGlvbik7CisgICAgaWYgKCFBTWVkaWFGb3JtYXRfZ2V0SW50NjQobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0RVUkFUSU9OLCAmbWV0YUR1cmF0aW9uKSB8fCBtZXRhRHVyYXRpb24gPT0gMCkgeworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9EVVJBVElPTiwgc2lkeER1cmF0aW9uKTsKICAgICB9CiAgICAgcmV0dXJuIE9LOwogfQpAQCAtMjkyOSw3ICszMjA1LDcgQEAKICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgIH0KICAgICAgICAgaWYgKCFzdHJjYXNlY21wKG1NZXRhS2V5TWFwW2luZGV4XS5jX3N0cigpLCAiY29tLmFuZHJvaWQuY2FwdHVyZS5mcHMiKSkgewotICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXRGbG9hdChrS2V5Q2FwdHVyZUZyYW1lcmF0ZSwgKihmbG9hdCAqKSZ2YWwpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEZsb2F0KG1GaWxlTWV0YURhdGEsIEFNRURJQUZPUk1BVF9LRVlfQ0FQVFVSRV9SQVRFLCAqKGZsb2F0ICopJnZhbCk7CiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKGRhdGFUeXBlID09IDY3ICYmIGRhdGFTaXplID49IDQpIHsKICAgICAgICAgLy8gQkUgc2lnbmVkIGludDMyCkBAIC0yOTM4LDcgKzMyMTQsOCBAQAogICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgfQogICAgICAgICBpZiAoIXN0cmNhc2VjbXAobU1ldGFLZXlNYXBbaW5kZXhdLmNfc3RyKCksICJjb20uYW5kcm9pZC52aWRlby50ZW1wb3JhbF9sYXllcnNfY291bnQiKSkgewotICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXRJbnQzMihrS2V5VGVtcG9yYWxMYXllckNvdW50LCB2YWwpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1GaWxlTWV0YURhdGEsCisgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfVEVNUE9SQUxfTEFZRVJfQ09VTlQsIHZhbCk7CiAgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICAvLyBhZGQgbW9yZSBrZXlzIGlmIG5lZWRlZApAQCAtMjk5Miw3ICszMjY5LDcgQEAKICAgICBpZiAobUxhc3RUcmFjayA9PSBOVUxMKQogICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogCi0gICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5VHJhY2tJRCwgaWQpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX1RSQUNLX0lELCBpZCk7CiAKICAgICBzaXplX3QgbWF0cml4T2Zmc2V0ID0gZHluU2l6ZSArIDE2OwogICAgIGludDMyX3QgYTAwID0gVTMyX0FUKCZidWZmZXJbbWF0cml4T2Zmc2V0XSk7CkBAIC0zMDI4LDE1ICszMzA1LDE1IEBACiAgICAgfQogCiAgICAgaWYgKHJvdGF0aW9uRGVncmVlcyAhPSAwKSB7Ci0gICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleVJvdGF0aW9uLCByb3RhdGlvbkRlZ3JlZXMpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9ST1RBVElPTiwgcm90YXRpb25EZWdyZWVzKTsKICAgICB9CiAKICAgICAvLyBIYW5kbGUgcHJlc2VudGF0aW9uIGRpc3BsYXkgc2l6ZSwgd2hpY2ggY291bGQgYmUgZGlmZmVyZW50Ci0gICAgLy8gZnJvbSB0aGUgaW1hZ2Ugc2l6ZSBpbmRpY2F0ZWQgYnkga0tleVdpZHRoIGFuZCBrS2V5SGVpZ2h0LgorICAgIC8vIGZyb20gdGhlIGltYWdlIHNpemUgaW5kaWNhdGVkIGJ5IEFNRURJQUZPUk1BVF9LRVlfV0lEVEggYW5kIEFNRURJQUZPUk1BVF9LRVlfSEVJR0hULgogICAgIHVpbnQzMl90IHdpZHRoID0gVTMyX0FUKCZidWZmZXJbZHluU2l6ZSArIDUyXSk7CiAgICAgdWludDMyX3QgaGVpZ2h0ID0gVTMyX0FUKCZidWZmZXJbZHluU2l6ZSArIDU2XSk7Ci0gICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5RGlzcGxheVdpZHRoLCB3aWR0aCA+PiAxNik7Ci0gICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5RGlzcGxheUhlaWdodCwgaGVpZ2h0ID4+IDE2KTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9ESVNQTEFZX1dJRFRILCB3aWR0aCA+PiAxNik7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfRElTUExBWV9IRUlHSFQsIGhlaWdodCA+PiAxNik7CiAKICAgICByZXR1cm4gT0s7CiB9CkBAIC0zMDY0LDU0ICszMzQxLDUwIEBACiAKICAgICB1aW50MzJfdCBmbGFncyA9IFUzMl9BVChidWZmZXIpOwogCi0gICAgdWludDMyX3QgbWV0YWRhdGFLZXkgPSAwOworICAgIGNvbnN0IGNoYXIgKm1ldGFkYXRhS2V5ID0gbnVsbHB0cjsKICAgICBjaGFyIGNodW5rWzVdOwogICAgIE1ha2VGb3VyQ0NTdHJpbmcobVBhdGhbNF0sIGNodW5rKTsKICAgICBBTE9HVigibWV0YTogJXMgQCAlbGxkIiwgY2h1bmssIChsb25nIGxvbmcpb2Zmc2V0KTsKICAgICBzd2l0Y2ggKChpbnQzMl90KW1QYXRoWzRdKSB7CiAgICAgICAgIGNhc2UgRk9VUkNDKDB4YTksICdhJywgJ2wnLCAnYicpOgogICAgICAgICB7Ci0gICAgICAgICAgICBtZXRhZGF0YUtleSA9IGtLZXlBbGJ1bTsKKyAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0gImFsYnVtIjsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGNhc2UgRk9VUkNDKDB4YTksICdBJywgJ1InLCAnVCcpOgogICAgICAgICB7Ci0gICAgICAgICAgICBtZXRhZGF0YUtleSA9IGtLZXlBcnRpc3Q7CisgICAgICAgICAgICBtZXRhZGF0YUtleSA9ICJhcnRpc3QiOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgY2FzZSBGT1VSQ0MoJ2EnLCAnQScsICdSJywgJ1QnKToKICAgICAgICAgewotICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSBrS2V5QWxidW1BcnRpc3Q7CisgICAgICAgICAgICBtZXRhZGF0YUtleSA9ICJhbGJ1bWFydGlzdCI7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBjYXNlIEZPVVJDQygweGE5LCAnZCcsICdhJywgJ3knKToKICAgICAgICAgewotICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSBrS2V5WWVhcjsKKyAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0gInllYXIiOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgY2FzZSBGT1VSQ0MoMHhhOSwgJ24nLCAnYScsICdtJyk6CiAgICAgICAgIHsKLSAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0ga0tleVRpdGxlOworICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSAidGl0bGUiOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgY2FzZSBGT1VSQ0MoMHhhOSwgJ3cnLCAncicsICd0Jyk6CiAgICAgICAgIHsKLSAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0ga0tleVdyaXRlcjsKKyAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0gIndyaXRlciI7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBjYXNlIEZPVVJDQygnYycsICdvJywgJ3YnLCAncicpOgogICAgICAgICB7Ci0gICAgICAgICAgICBtZXRhZGF0YUtleSA9IGtLZXlBbGJ1bUFydDsKKyAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0gImFsYnVtYXJ0IjsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGNhc2UgRk9VUkNDKCdnJywgJ24nLCAncicsICdlJyk6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0ga0tleUdlbnJlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KICAgICAgICAgY2FzZSBGT1VSQ0MoMHhhOSwgJ2cnLCAnZScsICduJyk6CiAgICAgICAgIHsKLSAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0ga0tleUdlbnJlOworICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSAiZ2VucmUiOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgY2FzZSBGT1VSQ0MoJ2MnLCAncCcsICdpJywgJ2wnKToKQEAgLTMxMjEsNyArMzM5NCw3IEBACiAgICAgICAgICAgICAgICAgc3ByaW50Zih0bXAsICIlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KWJ1ZmZlcltzaXplIC0gMV0pOwogCi0gICAgICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXRDU3RyaW5nKGtLZXlDb21waWxhdGlvbiwgdG1wKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1GaWxlTWV0YURhdGEsIEFNRURJQUZPUk1BVF9LRVlfQ09NUElMQVRJT04sIHRtcCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtMzEzMyw3ICszNDA2LDcgQEAKICAgICAgICAgICAgICAgICB1aW50MTZfdCogcFRvdGFsVHJhY2tzID0gKHVpbnQxNl90KikmYnVmZmVyWzEyXTsKICAgICAgICAgICAgICAgICBzcHJpbnRmKHRtcCwgIiVkLyVkIiwgbnRvaHMoKnBUcmFjayksIG50b2hzKCpwVG90YWxUcmFja3MpKTsKIAotICAgICAgICAgICAgICAgIG1GaWxlTWV0YURhdGEuc2V0Q1N0cmluZyhrS2V5Q0RUcmFja051bWJlciwgdG1wKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1GaWxlTWV0YURhdGEsIEFNRURJQUZPUk1BVF9LRVlfQ0RUUkFDS05VTUJFUiwgdG1wKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0zMTQ1LDcgKzM0MTgsNyBAQAogICAgICAgICAgICAgICAgIHVpbnQxNl90KiBwVG90YWxEaXNjcyA9ICh1aW50MTZfdCopJmJ1ZmZlclsxMl07CiAgICAgICAgICAgICAgICAgc3ByaW50Zih0bXAsICIlZC8lZCIsIG50b2hzKCpwRGlzYyksIG50b2hzKCpwVG90YWxEaXNjcykpOwogCi0gICAgICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXRDU3RyaW5nKGtLZXlEaXNjTnVtYmVyLCB0bXApOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUZpbGVNZXRhRGF0YSwgQU1FRElBRk9STUFUX0tFWV9ESVNDTlVNQkVSLCB0bXApOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTMxODksOCArMzQ2MiwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUVuY29kZXJEZWxheSwgZGVsYXkpOwotICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5RW5jb2RlclBhZGRpbmcsIHBhZGRpbmcpOworICAgICAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfRU5DT0RFUl9ERUxBWSwgZGVsYXkpOworICAgICAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfRU5DT0RFUl9QQURESU5HLCBwYWRkaW5nKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KIApAQCAtMzIwNSwxMiArMzQ4MCwxNCBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgfQogCi0gICAgaWYgKHNpemUgPj0gOCAmJiBtZXRhZGF0YUtleSAmJiAhbUZpbGVNZXRhRGF0YS5oYXNEYXRhKG1ldGFkYXRhS2V5KSkgewotICAgICAgICBpZiAobWV0YWRhdGFLZXkgPT0ga0tleUFsYnVtQXJ0KSB7Ci0gICAgICAgICAgICBtRmlsZU1ldGFEYXRhLnNldERhdGEoCi0gICAgICAgICAgICAgICAgICAgIGtLZXlBbGJ1bUFydCwgTWV0YURhdGE6OlRZUEVfTk9ORSwKKyAgICB2b2lkICp0bXBEYXRhOworICAgIHNpemVfdCB0bXBEYXRhU2l6ZTsKKyAgICBpZiAoc2l6ZSA+PSA4ICYmIG1ldGFkYXRhS2V5ICYmCisgICAgICAgICAgICAhQU1lZGlhRm9ybWF0X2dldEJ1ZmZlcihtRmlsZU1ldGFEYXRhLCBtZXRhZGF0YUtleSwgJnRtcERhdGEsICZ0bXBEYXRhU2l6ZSkpIHsKKyAgICAgICAgaWYgKCFzdHJjbXAobWV0YWRhdGFLZXksICJhbGJ1bWFydCIpKSB7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1GaWxlTWV0YURhdGEsIG1ldGFkYXRhS2V5LAogICAgICAgICAgICAgICAgICAgICBidWZmZXIgKyA4LCBzaXplIC0gOCk7Ci0gICAgICAgIH0gZWxzZSBpZiAobWV0YWRhdGFLZXkgPT0ga0tleUdlbnJlKSB7CisgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChtZXRhZGF0YUtleSwgImdlbnJlIikpIHsKICAgICAgICAgICAgIGlmIChmbGFncyA9PSAwKSB7CiAgICAgICAgICAgICAgICAgLy8gdWludDhfdCBnZW5yZSBjb2RlLCBpVHVuZXMgZ2VucmUgY29kZXMgYXJlCiAgICAgICAgICAgICAgICAgLy8gdGhlIHN0YW5kYXJkIGlkMyBjb2RlcywgZXhjZXB0IHRoZXkgc3RhcnQKQEAgLTMyMjQsMTggKzM1MDEsMTggQEAKICAgICAgICAgICAgICAgICBjaGFyIGdlbnJlWzEwXTsKICAgICAgICAgICAgICAgICBzcHJpbnRmKGdlbnJlLCAiJWQiLCBnZW5yZWNvZGUpOwogCi0gICAgICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXRDU3RyaW5nKG1ldGFkYXRhS2V5LCBnZW5yZSk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtRmlsZU1ldGFEYXRhLCBtZXRhZGF0YUtleSwgZ2VucmUpOwogICAgICAgICAgICAgfSBlbHNlIGlmIChmbGFncyA9PSAxKSB7CiAgICAgICAgICAgICAgICAgLy8gY3VzdG9tIGdlbnJlIHN0cmluZwogICAgICAgICAgICAgICAgIGJ1ZmZlcltzaXplXSA9ICdcMCc7CiAKLSAgICAgICAgICAgICAgICBtRmlsZU1ldGFEYXRhLnNldENTdHJpbmcoCisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtRmlsZU1ldGFEYXRhLCAKICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhS2V5LCAoY29uc3QgY2hhciAqKWJ1ZmZlciArIDgpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgYnVmZmVyW3NpemVdID0gJ1wwJzsKIAotICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXRDU3RyaW5nKAorICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtRmlsZU1ldGFEYXRhLCAKICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGFLZXksIChjb25zdCBjaGFyICopYnVmZmVyICsgOCk7CiAgICAgICAgIH0KICAgICB9CkBAIC0zMjY1LDIxICszNTQyLDMxIEBACiAgICAgaW50MzJfdCB0eXBlID0gVTMyX0FUKCZidWZmZXJbMF0pOwogICAgIGlmICgodHlwZSA9PSBGT1VSQ0MoJ24nLCAnYycsICdsJywgJ3gnKSAmJiBzaXplID49IDExKQogICAgICAgICAgICAgfHwgKHR5cGUgPT0gRk9VUkNDKCduJywgJ2MnLCAnbCcsICdjJykgJiYgc2l6ZSA+PSAxMCkpIHsKLSAgICAgICAgaW50MzJfdCBwcmltYXJpZXMgPSBVMTZfQVQoJmJ1ZmZlcls0XSk7Ci0gICAgICAgIGludDMyX3QgdHJhbnNmZXIgPSBVMTZfQVQoJmJ1ZmZlcls2XSk7Ci0gICAgICAgIGludDMyX3QgY29lZmZzID0gVTE2X0FUKCZidWZmZXJbOF0pOwotICAgICAgICBib29sIGZ1bGxSYW5nZSA9ICh0eXBlID09IEZPVVJDQygnbicsICdjJywgJ2wnLCAneCcpKSAmJiAoYnVmZmVyWzEwXSAmIDEyOCk7Ci0KLSAgICAgICAgQ29sb3JBc3BlY3RzIGFzcGVjdHM7Ci0gICAgICAgIENvbG9yVXRpbHM6OmNvbnZlcnRJc29Db2xvckFzcGVjdHNUb0NvZGVjQXNwZWN0cygKLSAgICAgICAgICAgICAgICBwcmltYXJpZXMsIHRyYW5zZmVyLCBjb2VmZnMsIGZ1bGxSYW5nZSwgYXNwZWN0cyk7Ci0KICAgICAgICAgLy8gb25seSBzdG9yZSB0aGUgZmlyc3QgY29sb3Igc3BlY2lmaWNhdGlvbgotICAgICAgICBpZiAoIW1MYXN0VHJhY2stPm1ldGEuaGFzRGF0YShrS2V5Q29sb3JQcmltYXJpZXMpKSB7Ci0gICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlDb2xvclByaW1hcmllcywgYXNwZWN0cy5tUHJpbWFyaWVzKTsKLSAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleVRyYW5zZmVyRnVuY3Rpb24sIGFzcGVjdHMubVRyYW5zZmVyKTsKLSAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUNvbG9yTWF0cml4LCBhc3BlY3RzLm1NYXRyaXhDb2VmZnMpOwotICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5Q29sb3JSYW5nZSwgYXNwZWN0cy5tUmFuZ2UpOworICAgICAgICBpbnQzMl90IGV4aXN0aW5nQ29sb3I7CisgICAgICAgIGlmICghQU1lZGlhRm9ybWF0X2dldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9DT0xPUl9SQU5HRSwgJmV4aXN0aW5nQ29sb3IpKSB7CisgICAgICAgICAgICBpbnQzMl90IHByaW1hcmllcyA9IFUxNl9BVCgmYnVmZmVyWzRdKTsKKyAgICAgICAgICAgIGludDMyX3QgaXNvdHJhbnNmZXIgPSBVMTZfQVQoJmJ1ZmZlcls2XSk7CisgICAgICAgICAgICBpbnQzMl90IGNvZWZmcyA9IFUxNl9BVCgmYnVmZmVyWzhdKTsKKyAgICAgICAgICAgIGJvb2wgZnVsbFJhbmdlID0gKHR5cGUgPT0gRk9VUkNDKCduJywgJ2MnLCAnbCcsICd4JykpICYmIChidWZmZXJbMTBdICYgMTI4KTsKKworICAgICAgICAgICAgaW50MzJfdCByYW5nZSA9IDA7CisgICAgICAgICAgICBpbnQzMl90IHN0YW5kYXJkID0gMDsKKyAgICAgICAgICAgIGludDMyX3QgdHJhbnNmZXIgPSAwOworICAgICAgICAgICAgQ29sb3JVdGlsczo6Y29udmVydElzb0NvbG9yQXNwZWN0c1RvUGxhdGZvcm1Bc3BlY3RzKAorICAgICAgICAgICAgICAgICAgICBwcmltYXJpZXMsIGlzb3RyYW5zZmVyLCBjb2VmZnMsIGZ1bGxSYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgJnJhbmdlLCAmc3RhbmRhcmQsICZ0cmFuc2Zlcik7CisKKyAgICAgICAgICAgIGlmIChyYW5nZSAhPSAwKSB7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ09MT1JfUkFOR0UsIHJhbmdlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzdGFuZGFyZCAhPSAwKSB7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ09MT1JfU1RBTkRBUkQsIHN0YW5kYXJkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh0cmFuc2ZlciAhPSAwKSB7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ09MT1JfVFJBTlNGRVIsIHRyYW5zZmVyKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIApAQCAtMzMwNiwyNiArMzU5MywyNiBAQAogICAgICAgICByZXR1cm4gRVJST1JfSU87CiAgICAgfQogCi0gICAgdWludDMyX3QgbWV0YWRhdGFLZXkgPSAwOworICAgIGNvbnN0IGNoYXIgKm1ldGFkYXRhS2V5ID0gbnVsbHB0cjsKICAgICBzd2l0Y2ggKG1QYXRoW2RlcHRoXSkgewogICAgICAgICBjYXNlIEZPVVJDQygndCcsICdpJywgJ3QnLCAnbCcpOgogICAgICAgICB7Ci0gICAgICAgICAgICBtZXRhZGF0YUtleSA9IGtLZXlUaXRsZTsKKyAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0gInRpdGxlIjsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGNhc2UgRk9VUkNDKCdwJywgJ2UnLCAncicsICdmJyk6CiAgICAgICAgIHsKLSAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0ga0tleUFydGlzdDsKKyAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0gImFydGlzdCI7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBjYXNlIEZPVVJDQygnYScsICd1JywgJ3QnLCAnaCcpOgogICAgICAgICB7Ci0gICAgICAgICAgICBtZXRhZGF0YUtleSA9IGtLZXlXcml0ZXI7CisgICAgICAgICAgICBtZXRhZGF0YUtleSA9ICJ3cml0ZXIiOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgY2FzZSBGT1VSQ0MoJ2cnLCAnbicsICdyJywgJ2UnKToKICAgICAgICAgewotICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSBrS2V5R2VucmU7CisgICAgICAgICAgICBtZXRhZGF0YUtleSA9ICJnZW5yZSI7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBjYXNlIEZPVVJDQygnYScsICdsJywgJ2InLCAnbScpOgpAQCAtMzMzNCwxMCArMzYyMSwxMCBAQAogICAgICAgICAgICAgICBjaGFyIHRtcFs0XTsKICAgICAgICAgICAgICAgc3ByaW50Zih0bXAsICIldSIsIGJ1ZmZlcltzaXplIC0gMV0pOwogCi0gICAgICAgICAgICAgIG1GaWxlTWV0YURhdGEuc2V0Q1N0cmluZyhrS2V5Q0RUcmFja051bWJlciwgdG1wKTsKKyAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtRmlsZU1ldGFEYXRhLCBBTUVESUFGT1JNQVRfS0VZX0NEVFJBQ0tOVU1CRVIsIHRtcCk7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0ga0tleUFsYnVtOworICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSAiYWxidW0iOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgY2FzZSBGT1VSQ0MoJ3knLCAncicsICdyJywgJ2MnKToKQEAgLTMzNTUsNyArMzY0Miw3IEBACiAgICAgICAgICAgICBpZiAoeWVhciA8IDEwMDAwKSB7CiAgICAgICAgICAgICAgICAgc3ByaW50Zih0bXAsICIldSIsIHllYXIpOwogCi0gICAgICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXRDU3RyaW5nKGtLZXlZZWFyLCB0bXApOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUZpbGVNZXRhRGF0YSwgQU1FRElBRk9STUFUX0tFWV9ZRUFSLCB0bXApOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTMzNjQsNyArMzY1MSw3IEBACiAgICAgICAgICAgICBicmVhazsKICAgICB9CiAKLSAgICBpZiAobWV0YWRhdGFLZXkgPiAwKSB7CisgICAgaWYgKG1ldGFkYXRhS2V5KSB7CiAgICAgICAgIGJvb2wgaXNVVEY4ID0gdHJ1ZTsgLy8gQ29tbW9uIGNhc2UKICAgICAgICAgY2hhcjE2X3QgKmZyYW1lZGF0YSA9IE5VTEw7CiAgICAgICAgIGludCBsZW4xNiA9IDA7IC8vIE51bWJlciBvZiBVVEYtMTYgY2hhcmFjdGVycwpAQCAtMzQwMCwxMSArMzY4NywxMSBAQAogCiAgICAgICAgIGlmIChpc1VURjgpIHsKICAgICAgICAgICAgIGJ1ZmZlcltzaXplXSA9IDA7Ci0gICAgICAgICAgICBtRmlsZU1ldGFEYXRhLnNldENTdHJpbmcobWV0YWRhdGFLZXksIChjb25zdCBjaGFyICopYnVmZmVyICsgNik7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1GaWxlTWV0YURhdGEsIG1ldGFkYXRhS2V5LCAoY29uc3QgY2hhciAqKWJ1ZmZlciArIDYpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLy8gQ29udmVydCBmcm9tIFVURi0xNiBzdHJpbmcgdG8gVVRGLTggc3RyaW5nLgogICAgICAgICAgICAgU3RyaW5nOCB0bXBVVEY4c3RyKGZyYW1lZGF0YSwgbGVuMTYpOwotICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXRDU3RyaW5nKG1ldGFkYXRhS2V5LCB0bXBVVEY4c3RyLnN0cmluZygpKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUZpbGVNZXRhRGF0YSwgbWV0YWRhdGFLZXksIHRtcFVURjhzdHIuc3RyaW5nKCkpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0zNDE5LDI3ICszNzA2LDI5IEBACiAKICAgICBpZiAoaWQzLmlzVmFsaWQoKSkgewogICAgICAgICBzdHJ1Y3QgTWFwIHsKLSAgICAgICAgICAgIGludCBrZXk7CisgICAgICAgICAgICBjb25zdCBjaGFyICprZXk7CiAgICAgICAgICAgICBjb25zdCBjaGFyICp0YWcxOwogICAgICAgICAgICAgY29uc3QgY2hhciAqdGFnMjsKICAgICAgICAgfTsKICAgICAgICAgc3RhdGljIGNvbnN0IE1hcCBrTWFwW10gPSB7Ci0gICAgICAgICAgICB7IGtLZXlBbGJ1bSwgIlRBTEIiLCAiVEFMIiB9LAotICAgICAgICAgICAgeyBrS2V5QXJ0aXN0LCAiVFBFMSIsICJUUDEiIH0sCi0gICAgICAgICAgICB7IGtLZXlBbGJ1bUFydGlzdCwgIlRQRTIiLCAiVFAyIiB9LAotICAgICAgICAgICAgeyBrS2V5Q29tcG9zZXIsICJUQ09NIiwgIlRDTSIgfSwKLSAgICAgICAgICAgIHsga0tleUdlbnJlLCAiVENPTiIsICJUQ08iIH0sCi0gICAgICAgICAgICB7IGtLZXlUaXRsZSwgIlRJVDIiLCAiVFQyIiB9LAotICAgICAgICAgICAgeyBrS2V5WWVhciwgIlRZRSIsICJUWUVSIiB9LAotICAgICAgICAgICAgeyBrS2V5QXV0aG9yLCAiVFhUIiwgIlRFWFQiIH0sCi0gICAgICAgICAgICB7IGtLZXlDRFRyYWNrTnVtYmVyLCAiVFJLIiwgIlRSQ0siIH0sCi0gICAgICAgICAgICB7IGtLZXlEaXNjTnVtYmVyLCAiVFBBIiwgIlRQT1MiIH0sCi0gICAgICAgICAgICB7IGtLZXlDb21waWxhdGlvbiwgIlRDUCIsICJUQ01QIiB9LAorICAgICAgICAgICAgeyBBTUVESUFGT1JNQVRfS0VZX0FMQlVNLCAiVEFMQiIsICJUQUwiIH0sCisgICAgICAgICAgICB7IEFNRURJQUZPUk1BVF9LRVlfQVJUSVNULCAiVFBFMSIsICJUUDEiIH0sCisgICAgICAgICAgICB7IEFNRURJQUZPUk1BVF9LRVlfQUxCVU1BUlRJU1QsICJUUEUyIiwgIlRQMiIgfSwKKyAgICAgICAgICAgIHsgQU1FRElBRk9STUFUX0tFWV9DT01QT1NFUiwgIlRDT00iLCAiVENNIiB9LAorICAgICAgICAgICAgeyBBTUVESUFGT1JNQVRfS0VZX0dFTlJFLCAiVENPTiIsICJUQ08iIH0sCisgICAgICAgICAgICB7IEFNRURJQUZPUk1BVF9LRVlfVElUTEUsICJUSVQyIiwgIlRUMiIgfSwKKyAgICAgICAgICAgIHsgQU1FRElBRk9STUFUX0tFWV9ZRUFSLCAiVFlFIiwgIlRZRVIiIH0sCisgICAgICAgICAgICB7IEFNRURJQUZPUk1BVF9LRVlfQVVUSE9SLCAiVFhUIiwgIlRFWFQiIH0sCisgICAgICAgICAgICB7IEFNRURJQUZPUk1BVF9LRVlfQ0RUUkFDS05VTUJFUiwgIlRSSyIsICJUUkNLIiB9LAorICAgICAgICAgICAgeyBBTUVESUFGT1JNQVRfS0VZX0RJU0NOVU1CRVIsICJUUEEiLCAiVFBPUyIgfSwKKyAgICAgICAgICAgIHsgQU1FRElBRk9STUFUX0tFWV9DT01QSUxBVElPTiwgIlRDUCIsICJUQ01QIiB9LAogICAgICAgICB9OwogICAgICAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtOdW1NYXBFbnRyaWVzID0gc2l6ZW9mKGtNYXApIC8gc2l6ZW9mKGtNYXBbMF0pOwogCisgICAgICAgIHZvaWQgKnRtcERhdGE7CisgICAgICAgIHNpemVfdCB0bXBEYXRhU2l6ZTsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrTnVtTWFwRW50cmllczsgKytpKSB7Ci0gICAgICAgICAgICBpZiAoIW1GaWxlTWV0YURhdGEuaGFzRGF0YShrTWFwW2ldLmtleSkpIHsKKyAgICAgICAgICAgIGlmICghQU1lZGlhRm9ybWF0X2dldEJ1ZmZlcihtRmlsZU1ldGFEYXRhLCBrTWFwW2ldLmtleSwgJnRtcERhdGEsICZ0bXBEYXRhU2l6ZSkpIHsKICAgICAgICAgICAgICAgICBJRDM6Okl0ZXJhdG9yICppdCA9IG5ldyBJRDM6Okl0ZXJhdG9yKGlkMywga01hcFtpXS50YWcxKTsKICAgICAgICAgICAgICAgICBpZiAoaXQtPmRvbmUoKSkgewogICAgICAgICAgICAgICAgICAgICBkZWxldGUgaXQ7CkBAIC0zNDU1LDcgKzM3NDQsNyBAQAogICAgICAgICAgICAgICAgIGl0LT5nZXRTdHJpbmcoJnMpOwogICAgICAgICAgICAgICAgIGRlbGV0ZSBpdDsKIAotICAgICAgICAgICAgICAgIG1GaWxlTWV0YURhdGEuc2V0Q1N0cmluZyhrTWFwW2ldLmtleSwgcyk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtRmlsZU1ldGFEYXRhLCBrTWFwW2ldLmtleSwgcyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtMzQ2NCwxMyArMzc1MywxMiBAQAogICAgICAgICBjb25zdCB2b2lkICpkYXRhID0gaWQzLmdldEFsYnVtQXJ0KCZkYXRhU2l6ZSwgJm1pbWUpOwogCiAgICAgICAgIGlmIChkYXRhKSB7Ci0gICAgICAgICAgICBtRmlsZU1ldGFEYXRhLnNldERhdGEoa0tleUFsYnVtQXJ0LCBNZXRhRGF0YTo6VFlQRV9OT05FLCBkYXRhLCBkYXRhU2l6ZSk7Ci0gICAgICAgICAgICBtRmlsZU1ldGFEYXRhLnNldENTdHJpbmcoa0tleUFsYnVtQXJ0TUlNRSwgbWltZS5zdHJpbmcoKSk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1GaWxlTWV0YURhdGEsIEFNRURJQUZPUk1BVF9LRVlfQUxCVU1BUlQsIGRhdGEsIGRhdGFTaXplKTsKICAgICAgICAgfQogICAgIH0KIH0KIAotTWVkaWFUcmFjayAqTVBFRzRFeHRyYWN0b3I6OmdldFRyYWNrKHNpemVfdCBpbmRleCkgeworTWVkaWFUcmFja0hlbHBlclYyICpNUEVHNEV4dHJhY3Rvcjo6Z2V0VHJhY2soc2l6ZV90IGluZGV4KSB7CiAgICAgc3RhdHVzX3QgZXJyOwogICAgIGlmICgoZXJyID0gcmVhZE1ldGFEYXRhKCkpICE9IE9LKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtMzQ5Myw3ICszNzgxLDcgQEAKIAogICAgIFRyZXggKnRyZXggPSBOVUxMOwogICAgIGludDMyX3QgdHJhY2tJZDsKLSAgICBpZiAodHJhY2stPm1ldGEuZmluZEludDMyKGtLZXlUcmFja0lELCAmdHJhY2tJZCkpIHsKKyAgICBpZiAoQU1lZGlhRm9ybWF0X2dldEludDMyKHRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX1RSQUNLX0lELCAmdHJhY2tJZCkpIHsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtVHJleC5zaXplKCk7IGkrKykgewogICAgICAgICAgICAgVHJleCAqdCA9ICZtVHJleC5lZGl0SXRlbUF0KGkpOwogICAgICAgICAgICAgaWYgKHQtPnRyYWNrX0lEID09ICh1aW50MzJfdCkgdHJhY2tJZCkgewpAQCAtMzUwOSwxNiArMzc5NywxNSBAQAogICAgIEFMT0dWKCJnZXRUcmFjayBjYWxsZWQsIHBzc2g6ICV6dSIsIG1Qc3NoLnNpemUoKSk7CiAKICAgICBjb25zdCBjaGFyICptaW1lOwotICAgIGlmICghdHJhY2stPm1ldGEuZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpIHsKKyAgICBpZiAoIUFNZWRpYUZvcm1hdF9nZXRTdHJpbmcodHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgJm1pbWUpKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAogICAgIHNwPEl0ZW1UYWJsZT4gaXRlbVRhYmxlOwogICAgIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpKSB7Ci0gICAgICAgIHVpbnQzMl90IHR5cGU7Ci0gICAgICAgIGNvbnN0IHZvaWQgKmRhdGE7CisgICAgICAgIHZvaWQgKmRhdGE7CiAgICAgICAgIHNpemVfdCBzaXplOwotICAgICAgICBpZiAoIXRyYWNrLT5tZXRhLmZpbmREYXRhKGtLZXlBVkNDLCAmdHlwZSwgJmRhdGEsICZzaXplKSkgeworICAgICAgICBpZiAoIUFNZWRpYUZvcm1hdF9nZXRCdWZmZXIodHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1NEX0FWQywgJmRhdGEsICZzaXplKSkgewogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KIApAQCAtMzUyOSwxMCArMzgxNiw5IEBACiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMpCiAgICAgICAgICAgICB8fCAhc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9JTUFHRV9BTkRST0lEX0hFSUMpKSB7Ci0gICAgICAgIHVpbnQzMl90IHR5cGU7Ci0gICAgICAgIGNvbnN0IHZvaWQgKmRhdGE7CisgICAgICAgIHZvaWQgKmRhdGE7CiAgICAgICAgIHNpemVfdCBzaXplOwotICAgICAgICBpZiAoIXRyYWNrLT5tZXRhLmZpbmREYXRhKGtLZXlIVkNDLCAmdHlwZSwgJmRhdGEsICZzaXplKSkgeworICAgICAgICBpZiAoIUFNZWRpYUZvcm1hdF9nZXRCdWZmZXIodHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1NEX0hFVkMsICZkYXRhLCAmc2l6ZSkpIHsKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9CiAKQEAgLTM1NTksMjYgKzM4NDUsMjIgQEAKIC8vIHN0YXRpYwogc3RhdHVzX3QgTVBFRzRFeHRyYWN0b3I6OnZlcmlmeVRyYWNrKFRyYWNrICp0cmFjaykgewogICAgIGNvbnN0IGNoYXIgKm1pbWU7Ci0gICAgQ0hFQ0sodHJhY2stPm1ldGEuZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpOworICAgIENIRUNLKEFNZWRpYUZvcm1hdF9nZXRTdHJpbmcodHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgJm1pbWUpKTsKIAotICAgIHVpbnQzMl90IHR5cGU7Ci0gICAgY29uc3Qgdm9pZCAqZGF0YTsKKyAgICB2b2lkICpkYXRhOwogICAgIHNpemVfdCBzaXplOwogICAgIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpKSB7Ci0gICAgICAgIGlmICghdHJhY2stPm1ldGEuZmluZERhdGEoa0tleUFWQ0MsICZ0eXBlLCAmZGF0YSwgJnNpemUpCi0gICAgICAgICAgICAgICAgfHwgdHlwZSAhPSBrVHlwZUFWQ0MpIHsKKyAgICAgICAgaWYgKCFBTWVkaWFGb3JtYXRfZ2V0QnVmZmVyKHRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NTRF9BVkMsICZkYXRhLCAmc2l6ZSkpIHsKICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMpKSB7Ci0gICAgICAgIGlmICghdHJhY2stPm1ldGEuZmluZERhdGEoa0tleUhWQ0MsICZ0eXBlLCAmZGF0YSwgJnNpemUpCi0gICAgICAgICAgICAgICAgICAgIHx8IHR5cGUgIT0ga1R5cGVIVkNDKSB7CisgICAgICAgIGlmICghQU1lZGlhRm9ybWF0X2dldEJ1ZmZlcih0cmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9DU0RfSEVWQywgJmRhdGEsICZzaXplKSkgewogICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQpCiAgICAgICAgICAgICB8fCAhc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHMikKICAgICAgICAgICAgIHx8ICFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0FVRElPX0FBQykpIHsKLSAgICAgICAgaWYgKCF0cmFjay0+bWV0YS5maW5kRGF0YShrS2V5RVNEUywgJnR5cGUsICZkYXRhLCAmc2l6ZSkKLSAgICAgICAgICAgICAgICB8fCB0eXBlICE9IGtUeXBlRVNEUykgeworICAgICAgICBpZiAoIUFNZWRpYUZvcm1hdF9nZXRCdWZmZXIodHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfRVNEUywgJmRhdGEsICZzaXplKSkgewogICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgfQogICAgIH0KQEAgLTM2NjMsNyArMzk0NSw3IEBACiAgICAgICAgIGlmIChtTGFzdFRyYWNrID09IE5VTEwpCiAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogCi0gICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX1FDRUxQKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtTGFzdFRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX0FVRElPX1FDRUxQKTsKICAgICAgICAgcmV0dXJuIE9LOwogICAgIH0KIApAQCAtMzY4MCwxMCArMzk2MiwxMiBAQAogICAgICAgICB1aW50MzJfdCBhdmdCaXRyYXRlID0gMDsKICAgICAgICAgZXNkcy5nZXRCaXRSYXRlKCZtYXhCaXRyYXRlLCAmYXZnQml0cmF0ZSk7CiAgICAgICAgIGlmIChtYXhCaXRyYXRlID4gMCAmJiBtYXhCaXRyYXRlIDwgSU5UMzJfTUFYKSB7Ci0gICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlNYXhCaXRSYXRlLCAoaW50MzJfdCltYXhCaXRyYXRlKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX01BWF9CSVRfUkFURSwgKGludDMyX3QpbWF4Qml0cmF0ZSk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGF2Z0JpdHJhdGUgPiAwICYmIGF2Z0JpdHJhdGUgPCBJTlQzMl9NQVgpIHsKLSAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUJpdFJhdGUsIChpbnQzMl90KWF2Z0JpdHJhdGUpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQklUX1JBVEUsIChpbnQzMl90KWF2Z0JpdHJhdGUpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0zNzI3LDcgKzQwMTEsNyBAQAogICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogCiAgICAgLy9rZWVwIEFPVCB0eXBlCi0gICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5QUFDQU9ULCBvYmplY3RUeXBlKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9BQUNfUFJPRklMRSwgb2JqZWN0VHlwZSk7CiAKICAgICB1aW50MzJfdCBmcmVxSW5kZXggPSBici5nZXRCaXRzKDQpOwogCkBAIC0zNzQ4LDcgKzQwMzIsNyBAQAogICAgICAgICBzYW1wbGVSYXRlID0ga1NhbXBsaW5nUmF0ZVtmcmVxSW5kZXhdOwogICAgIH0KIAotICAgIGlmIChvYmplY3RUeXBlID09IEFPVF9TQlIgfHwgb2JqZWN0VHlwZSA9PSBBT1RfUFMpIHsvL1NCUiBzcGVjaWZpYyBjb25maWcgcGVyIDE0NDk2LTMgdGFibGUgMS4xMworICAgIGlmIChvYmplY3RUeXBlID09IEFPVF9TQlIgfHwgb2JqZWN0VHlwZSA9PSBBT1RfUFMpIHsvL1NCUiBzcGVjaWZpYyBjb25maWcgcGVyIDE0NDk2LTMgdGJsIDEuMTMKICAgICAgICAgaWYgKGJyLm51bUJpdHNMZWZ0KCkgPCA0KSByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICB1aW50MzJfdCBleHRGcmVxSW5kZXggPSBici5nZXRCaXRzKDQpOwogICAgICAgICBpbnQzMl90IGV4dFNhbXBsZVJhdGUgX191bnVzZWQ7CkBAIC0zNzY1LDcgKzQwNDksNyBAQAogICAgICAgICAgICAgZXh0U2FtcGxlUmF0ZSA9IGtTYW1wbGluZ1JhdGVbZXh0RnJlcUluZGV4XTsKICAgICAgICAgfQogICAgICAgICAvL1RPRE86IHNhdmUgdGhlIGV4dGVuc2lvbiBzYW1wbGluZyByYXRlIHZhbHVlIGluIG1ldGEgZGF0YSA9PgotICAgICAgICAvLyAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUV4dFNhbXBsZVJhdGUsIGV4dFNhbXBsZVJhdGUpOworICAgICAgICAvLyAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLCBrS2V5RXh0U2FtcGxlUmF0ZSwgZXh0U2FtcGxlUmF0ZSk7CiAgICAgfQogCiAgICAgc3dpdGNoIChudW1DaGFubmVscykgewpAQCAtMzkxOCwyNCArNDIwMiwyNSBAQAogICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogCiAgICAgaW50MzJfdCBwcmV2U2FtcGxlUmF0ZTsKLSAgICBDSEVDSyhtTGFzdFRyYWNrLT5tZXRhLmZpbmRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgJnByZXZTYW1wbGVSYXRlKSk7CisgICAgQ0hFQ0soQU1lZGlhRm9ybWF0X2dldEludDMyKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1JBVEUsICZwcmV2U2FtcGxlUmF0ZSkpOwogCiAgICAgaWYgKHByZXZTYW1wbGVSYXRlICE9IHNhbXBsZVJhdGUpIHsKICAgICAgICAgQUxPR1YoIm1wZWc0IGF1ZGlvIHNhbXBsZSByYXRlIGRpZmZlcmVudCBmcm9tIHByZXZpb3VzIHNldHRpbmcuICIKICAgICAgICAgICAgICAid2FzOiAlZCwgbm93OiAlZCIsIHByZXZTYW1wbGVSYXRlLCBzYW1wbGVSYXRlKTsKICAgICB9CiAKLSAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlTYW1wbGVSYXRlLCBzYW1wbGVSYXRlKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9TQU1QTEVfUkFURSwgc2FtcGxlUmF0ZSk7CiAKICAgICBpbnQzMl90IHByZXZDaGFubmVsQ291bnQ7Ci0gICAgQ0hFQ0sobUxhc3RUcmFjay0+bWV0YS5maW5kSW50MzIoa0tleUNoYW5uZWxDb3VudCwgJnByZXZDaGFubmVsQ291bnQpKTsKKyAgICBDSEVDSyhBTWVkaWFGb3JtYXRfZ2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9DT1VOVCwgJnByZXZDaGFubmVsQ291bnQpKTsKIAogICAgIGlmIChwcmV2Q2hhbm5lbENvdW50ICE9IG51bUNoYW5uZWxzKSB7CiAgICAgICAgIEFMT0dWKCJtcGVnNCBhdWRpbyBjaGFubmVsIGNvdW50IGRpZmZlcmVudCBmcm9tIHByZXZpb3VzIHNldHRpbmcuICIKICAgICAgICAgICAgICAid2FzOiAlZCwgbm93OiAlZCIsIHByZXZDaGFubmVsQ291bnQsIG51bUNoYW5uZWxzKTsKICAgICB9CiAKLSAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsIG51bUNoYW5uZWxzKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX0NPVU5ULCBudW1DaGFubmVscyk7CiAKICAgICByZXR1cm4gT0s7CiB9CkBAIC0zOTQzLDggKzQyMjgsOCBAQAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAogTVBFRzRTb3VyY2U6Ok1QRUc0U291cmNlKAotICAgICAgICBNZXRhRGF0YUJhc2UgJmZvcm1hdCwKLSAgICAgICAgRGF0YVNvdXJjZUJhc2UgKmRhdGFTb3VyY2UsCisgICAgICAgIEFNZWRpYUZvcm1hdCAqZm9ybWF0LAorICAgICAgICBEYXRhU291cmNlSGVscGVyICpkYXRhU291cmNlLAogICAgICAgICBpbnQzMl90IHRpbWVTY2FsZSwKICAgICAgICAgY29uc3Qgc3A8U2FtcGxlVGFibGU+ICZzYW1wbGVUYWJsZSwKICAgICAgICAgVmVjdG9yPFNpZHhFbnRyeT4gJnNpZHgsCkBAIC0zOTcxLDQ2ICs0MjU2LDUwIEBACiAgICAgICBtQ3VycmVudFNhbXBsZUluZm9PZmZzZXRzKE5VTEwpLAogICAgICAgbUlzQVZDKGZhbHNlKSwKICAgICAgIG1Jc0hFVkMoZmFsc2UpLAorICAgICAgbUlzQUM0KGZhbHNlKSwKICAgICAgIG1Jc1BjbShmYWxzZSksCiAgICAgICBtTkFMTGVuZ3RoU2l6ZSgwKSwKICAgICAgIG1TdGFydGVkKGZhbHNlKSwKICAgICAgIG1Hcm91cChOVUxMKSwKICAgICAgIG1CdWZmZXIoTlVMTCksCi0gICAgICBtV2FudHNOQUxGcmFnbWVudHMoZmFsc2UpLAogICAgICAgbVNyY0J1ZmZlcihOVUxMKSwKICAgICAgIG1Jc0hlaWYoaXRlbVRhYmxlICE9IE5VTEwpLAogICAgICAgbUl0ZW1UYWJsZShpdGVtVGFibGUpIHsKIAogICAgIG1lbXNldCgmbVRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvLCAwLCBzaXplb2YobVRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvKSk7CiAKLSAgICBtRm9ybWF0LmZpbmRJbnQzMihrS2V5Q3J5cHRvTW9kZSwgJm1DcnlwdG9Nb2RlKTsKKyAgICBBTWVkaWFGb3JtYXRfZ2V0SW50MzIobUZvcm1hdCwKKyAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX01PREUsICZtQ3J5cHRvTW9kZSk7CiAgICAgbURlZmF1bHRJVlNpemUgPSAwOwotICAgIG1Gb3JtYXQuZmluZEludDMyKGtLZXlDcnlwdG9EZWZhdWx0SVZTaXplLCAmbURlZmF1bHRJVlNpemUpOwotICAgIHVpbnQzMl90IGtleXR5cGU7Ci0gICAgY29uc3Qgdm9pZCAqa2V5OworICAgIEFNZWRpYUZvcm1hdF9nZXRJbnQzMihtRm9ybWF0LAorICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fREVGQVVMVF9JVl9TSVpFLCAmbURlZmF1bHRJVlNpemUpOworICAgIHZvaWQgKmtleTsKICAgICBzaXplX3Qga2V5c2l6ZTsKLSAgICBpZiAobUZvcm1hdC5maW5kRGF0YShrS2V5Q3J5cHRvS2V5LCAma2V5dHlwZSwgJmtleSwgJmtleXNpemUpKSB7CisgICAgaWYgKEFNZWRpYUZvcm1hdF9nZXRCdWZmZXIobUZvcm1hdCwKKyAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0tFWSwgJmtleSwgJmtleXNpemUpKSB7CiAgICAgICAgIENIRUNLKGtleXNpemUgPD0gMTYpOwogICAgICAgICBtZW1zZXQobUNyeXB0b0tleSwgMCwgMTYpOwogICAgICAgICBtZW1jcHkobUNyeXB0b0tleSwga2V5LCBrZXlzaXplKTsKICAgICB9CiAKLSAgICBtRm9ybWF0LmZpbmRJbnQzMihrS2V5RW5jcnlwdGVkQnl0ZUJsb2NrLCAmbURlZmF1bHRFbmNyeXB0ZWRCeXRlQmxvY2spOwotICAgIG1Gb3JtYXQuZmluZEludDMyKGtLZXlTa2lwQnl0ZUJsb2NrLCAmbURlZmF1bHRTa2lwQnl0ZUJsb2NrKTsKKyAgICBBTWVkaWFGb3JtYXRfZ2V0SW50MzIobUZvcm1hdCwKKyAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0VOQ1JZUFRFRF9CWVRFX0JMT0NLLCAmbURlZmF1bHRFbmNyeXB0ZWRCeXRlQmxvY2spOworICAgIEFNZWRpYUZvcm1hdF9nZXRJbnQzMihtRm9ybWF0LAorICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fU0tJUF9CWVRFX0JMT0NLLCAmbURlZmF1bHRTa2lwQnl0ZUJsb2NrKTsKIAogICAgIGNvbnN0IGNoYXIgKm1pbWU7Ci0gICAgYm9vbCBzdWNjZXNzID0gbUZvcm1hdC5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKTsKKyAgICBib29sIHN1Y2Nlc3MgPSBBTWVkaWFGb3JtYXRfZ2V0U3RyaW5nKG1Gb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgJm1pbWUpOwogICAgIENIRUNLKHN1Y2Nlc3MpOwogCiAgICAgbUlzQVZDID0gIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKTsKICAgICBtSXNIRVZDID0gIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fSEVWQykgfHwKICAgICAgICAgICAgICAgIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfSU1BR0VfQU5EUk9JRF9IRUlDKTsKKyAgICBtSXNBQzQgPSAhc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQzQpOwogCiAgICAgaWYgKG1Jc0FWQykgewotICAgICAgICB1aW50MzJfdCB0eXBlOwotICAgICAgICBjb25zdCB2b2lkICpkYXRhOworICAgICAgICB2b2lkICpkYXRhOwogICAgICAgICBzaXplX3Qgc2l6ZTsKLSAgICAgICAgQ0hFQ0soZm9ybWF0LmZpbmREYXRhKGtLZXlBVkNDLCAmdHlwZSwgJmRhdGEsICZzaXplKSk7CisgICAgICAgIENIRUNLKEFNZWRpYUZvcm1hdF9nZXRCdWZmZXIoZm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX0NTRF9BVkMsICZkYXRhLCAmc2l6ZSkpOwogCiAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnB0ciA9IChjb25zdCB1aW50OF90ICopZGF0YTsKIApAQCAtNDAyMCwxMCArNDMwOSw5IEBACiAgICAgICAgIC8vIFRoZSBudW1iZXIgb2YgYnl0ZXMgdXNlZCB0byBlbmNvZGUgdGhlIGxlbmd0aCBvZiBhIE5BTCB1bml0LgogICAgICAgICBtTkFMTGVuZ3RoU2l6ZSA9IDEgKyAocHRyWzRdICYgMyk7CiAgICAgfSBlbHNlIGlmIChtSXNIRVZDKSB7Ci0gICAgICAgIHVpbnQzMl90IHR5cGU7Ci0gICAgICAgIGNvbnN0IHZvaWQgKmRhdGE7CisgICAgICAgIHZvaWQgKmRhdGE7CiAgICAgICAgIHNpemVfdCBzaXplOwotICAgICAgICBDSEVDSyhmb3JtYXQuZmluZERhdGEoa0tleUhWQ0MsICZ0eXBlLCAmZGF0YSwgJnNpemUpKTsKKyAgICAgICAgQ0hFQ0soQU1lZGlhRm9ybWF0X2dldEJ1ZmZlcihmb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfQ1NEX0hFVkMsICZkYXRhLCAmc2l6ZSkpOwogCiAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnB0ciA9IChjb25zdCB1aW50OF90ICopZGF0YTsKIApAQCAtNDAzOCwyMyArNDMyNiwyNSBAQAogICAgIGlmIChtSXNQY20pIHsKICAgICAgICAgaW50MzJfdCBudW1DaGFubmVscyA9IDA7CiAgICAgICAgIGludDMyX3QgYml0c1BlclNhbXBsZSA9IDA7Ci0gICAgICAgIENIRUNLKG1Gb3JtYXQuZmluZEludDMyKGtLZXlCaXRzUGVyU2FtcGxlLCAmYml0c1BlclNhbXBsZSkpOwotICAgICAgICBDSEVDSyhtRm9ybWF0LmZpbmRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCAmbnVtQ2hhbm5lbHMpKTsKKyAgICAgICAgQ0hFQ0soQU1lZGlhRm9ybWF0X2dldEludDMyKG1Gb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfQklUU19QRVJfU0FNUExFLCAmYml0c1BlclNhbXBsZSkpOworICAgICAgICBDSEVDSyhBTWVkaWFGb3JtYXRfZ2V0SW50MzIobUZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX0NPVU5ULCAmbnVtQ2hhbm5lbHMpKTsKIAogICAgICAgICBpbnQzMl90IGJ5dGVzUGVyU2FtcGxlID0gYml0c1BlclNhbXBsZSA+PiAzOwogICAgICAgICBpbnQzMl90IHBjbVNhbXBsZVNpemUgPSBieXRlc1BlclNhbXBsZSAqIG51bUNoYW5uZWxzOwogCiAgICAgICAgIHNpemVfdCBtYXhTYW1wbGVTaXplOwogICAgICAgICBzdGF0dXNfdCBlcnIgPSBtU2FtcGxlVGFibGUtPmdldE1heFNhbXBsZVNpemUoJm1heFNhbXBsZVNpemUpOwotICAgICAgICBpZiAoZXJyICE9IE9LIHx8IG1heFNhbXBsZVNpemUgIT0gc3RhdGljX2Nhc3Q8c2l6ZV90PihwY21TYW1wbGVTaXplKSB8fCBiaXRzUGVyU2FtcGxlICE9IDE2KSB7CisgICAgICAgIGlmIChlcnIgIT0gT0sgfHwgbWF4U2FtcGxlU2l6ZSAhPSBzdGF0aWNfY2FzdDxzaXplX3Q+KHBjbVNhbXBsZVNpemUpCisgICAgICAgICAgICAgICB8fCBiaXRzUGVyU2FtcGxlICE9IDE2KSB7CiAgICAgICAgICAgICAvLyBOb3Qgc3VwcG9ydGVkCiAgICAgICAgICAgICBtSXNQY20gPSBmYWxzZTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1Gb3JtYXQuc2V0SW50MzIoa0tleU1heElucHV0U2l6ZSwgcGNtU2FtcGxlU2l6ZSAqIGtNYXhQY21GcmFtZVNpemUpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1Gb3JtYXQsCisgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTUFYX0lOUFVUX1NJWkUsIHBjbVNhbXBsZVNpemUgKiBrTWF4UGNtRnJhbWVTaXplKTsKICAgICAgICAgfQogICAgIH0KIAotICAgIENIRUNLKGZvcm1hdC5maW5kSW50MzIoa0tleVRyYWNrSUQsICZtVHJhY2tJZCkpOworICAgIENIRUNLKEFNZWRpYUZvcm1hdF9nZXRJbnQzMihmb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfVFJBQ0tfSUQsICZtVHJhY2tJZCkpOwogCiB9CiAKQEAgLTQwNzQsMjEgKzQzNjQsMTMgQEAKICAgICBmcmVlKG1DdXJyZW50U2FtcGxlSW5mb09mZnNldHMpOwogfQogCi1zdGF0dXNfdCBNUEVHNFNvdXJjZTo6c3RhcnQoTWV0YURhdGFCYXNlICpwYXJhbXMpIHsKK21lZGlhX3N0YXR1c190IE1QRUc0U291cmNlOjpzdGFydCgpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCiAgICAgQ0hFQ0soIW1TdGFydGVkKTsKIAotICAgIGludDMyX3QgdmFsOwotICAgIGlmIChwYXJhbXMgJiYgcGFyYW1zLT5maW5kSW50MzIoa0tleVdhbnRzTkFMRnJhZ21lbnRzLCAmdmFsKQotICAgICAgICAmJiB2YWwgIT0gMCkgewotICAgICAgICBtV2FudHNOQUxGcmFnbWVudHMgPSB0cnVlOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1XYW50c05BTEZyYWdtZW50cyA9IGZhbHNlOwotICAgIH0KLQogICAgIGludDMyX3QgdG1wOwotICAgIENIRUNLKG1Gb3JtYXQuZmluZEludDMyKGtLZXlNYXhJbnB1dFNpemUsICZ0bXApKTsKKyAgICBDSEVDSyhBTWVkaWFGb3JtYXRfZ2V0SW50MzIobUZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9NQVhfSU5QVVRfU0laRSwgJnRtcCkpOwogICAgIHNpemVfdCBtYXhfc2l6ZSA9IHRtcDsKIAogICAgIC8vIEEgc29tZXdoYXQgYXJiaXRyYXJ5IGxpbWl0IHRoYXQgc2hvdWxkIGJlIHN1ZmZpY2llbnQgZm9yIDhrIHZpZGVvIGZyYW1lcwpAQCAtNDA5NiwxMSArNDM3OCwxMSBAQAogICAgIGNvbnN0IHNpemVfdCBrTWF4QnVmZmVyU2l6ZSA9IDY0ICogMTAyNCAqIDEwMjQ7CiAgICAgaWYgKG1heF9zaXplID4ga01heEJ1ZmZlclNpemUpIHsKICAgICAgICAgQUxPR0UoImJvZ3VzIG1heCBpbnB1dCBzaXplOiAlenUgPiAlenUiLCBtYXhfc2l6ZSwga01heEJ1ZmZlclNpemUpOwotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKICAgICB9CiAgICAgaWYgKG1heF9zaXplID09IDApIHsKICAgICAgICAgQUxPR0UoInplcm8gbWF4IGlucHV0IHNpemUiKTsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CiAgICAgfQogCiAgICAgLy8gQWxsb3cgdXAgdG8ga01heEJ1ZmZlcnMsIGJ1dCBub3QgaWYgdGhlIHRvdGFsIGV4Y2VlZHMga01heEJ1ZmZlclNpemUuCkBAIC00MTEzLDE1ICs0Mzk1LDE1IEBACiAgICAgICAgIC8vIGZpbGUgcHJvYmFibHkgc3BlY2lmaWVkIGEgYmFkIG1heCBzaXplCiAgICAgICAgIGRlbGV0ZSBtR3JvdXA7CiAgICAgICAgIG1Hcm91cCA9IE5VTEw7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOwogICAgIH0KIAogICAgIG1TdGFydGVkID0gdHJ1ZTsKIAotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCi1zdGF0dXNfdCBNUEVHNFNvdXJjZTo6c3RvcCgpIHsKK21lZGlhX3N0YXR1c190IE1QRUc0U291cmNlOjpzdG9wKCkgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKICAgICBDSEVDSyhtU3RhcnRlZCk7CkBAIC00MTQwLDcgKzQ0MjIsNyBAQAogICAgIG1TdGFydGVkID0gZmFsc2U7CiAgICAgbUN1cnJlbnRTYW1wbGVJbmRleCA9IDA7CiAKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAogc3RhdHVzX3QgTVBFRzRTb3VyY2U6OnBhcnNlQ2h1bmsob2ZmNjRfdCAqb2Zmc2V0KSB7CkBAIC00MjU4LDcgKzQ1NDAsOCBAQAogICAgICAgICB9CiAgICAgICAgIGNhc2UgRk9VUkNDKCdzJywgJ2EnLCAnaScsICdvJyk6IHsKICAgICAgICAgICAgIHN0YXR1c190IGVycjsKLSAgICAgICAgICAgIGlmICgoZXJyID0gcGFyc2VTYW1wbGVBdXhpbGlhcnlJbmZvcm1hdGlvbk9mZnNldHMoZGF0YV9vZmZzZXQsIGNodW5rX2RhdGFfc2l6ZSkpICE9IE9LKSB7CisgICAgICAgICAgICBpZiAoKGVyciA9IHBhcnNlU2FtcGxlQXV4aWxpYXJ5SW5mb3JtYXRpb25PZmZzZXRzKGRhdGFfb2Zmc2V0LCBjaHVua19kYXRhX3NpemUpKQorICAgICAgICAgICAgICAgICAgICAhPSBPSykgewogICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CkBAIC00Mzg5LDcgKzQ2NzIsOCBAQAogICAgIGlmIChlbnRyeWNvdW50ID4gbUN1cnJlbnRTYW1wbGVJbmZvT2Zmc2V0c0FsbG9jU2l6ZSkgewogICAgICAgICB1aW50NjRfdCAqbmV3UHRyID0gKHVpbnQ2NF90ICopcmVhbGxvYyhtQ3VycmVudFNhbXBsZUluZm9PZmZzZXRzLCBlbnRyeWNvdW50ICogOCk7CiAgICAgICAgIGlmIChuZXdQdHIgPT0gTlVMTCkgewotICAgICAgICAgICAgQUxPR0UoImZhaWxlZCB0byByZWFsbG9jICV1IC0+ICV1IiwgbUN1cnJlbnRTYW1wbGVJbmZvT2Zmc2V0c0FsbG9jU2l6ZSwgZW50cnljb3VudCAqIDgpOworICAgICAgICAgICAgQUxPR0UoImZhaWxlZCB0byByZWFsbG9jICV1IC0+ICV1IiwKKyAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRTYW1wbGVJbmZvT2Zmc2V0c0FsbG9jU2l6ZSwgZW50cnljb3VudCAqIDgpOwogICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKICAgICAgICAgfQogICAgICAgICBtQ3VycmVudFNhbXBsZUluZm9PZmZzZXRzID0gbmV3UHRyOwpAQCAtNDQyOCwxMCArNDcxMiwxMSBAQAogICAgIHJldHVybiBwYXJzZUNsZWFyRW5jcnlwdGVkU2l6ZXMoZHJtb2Zmc2V0LCBmYWxzZSwgMCk7CiB9CiAKLXN0YXR1c190IE1QRUc0U291cmNlOjpwYXJzZUNsZWFyRW5jcnlwdGVkU2l6ZXMob2ZmNjRfdCBvZmZzZXQsIGJvb2wgaXNTdWJzYW1wbGVFbmNyeXB0aW9uLCB1aW50MzJfdCBmbGFncykgeworc3RhdHVzX3QgTVBFRzRTb3VyY2U6OnBhcnNlQ2xlYXJFbmNyeXB0ZWRTaXplcygKKyAgICAgICAgb2ZmNjRfdCBvZmZzZXQsIGJvb2wgaXNTdWJzYW1wbGVFbmNyeXB0aW9uLCB1aW50MzJfdCBmbGFncykgewogCi0gICAgaW50IGl2bGVuZ3RoOwotICAgIENIRUNLKG1Gb3JtYXQuZmluZEludDMyKGtLZXlDcnlwdG9EZWZhdWx0SVZTaXplLCAmaXZsZW5ndGgpKTsKKyAgICBpbnQzMl90IGl2bGVuZ3RoOworICAgIENIRUNLKEFNZWRpYUZvcm1hdF9nZXRJbnQzMihtRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19ERUZBVUxUX0lWX1NJWkUsICZpdmxlbmd0aCkpOwogCiAgICAgLy8gb25seSAwLCA4IGFuZCAxNiBieXRlIGluaXRpYWxpemF0aW9uIHZlY3RvcnMgYXJlIHN1cHBvcnRlZAogICAgIGlmIChpdmxlbmd0aCAhPSAwICYmIGl2bGVuZ3RoICE9IDggJiYgaXZsZW5ndGggIT0gMTYpIHsKQEAgLTQ3NzUsMTAgKzUwNjAsMTAgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IE1QRUc0U291cmNlOjpnZXRGb3JtYXQoTWV0YURhdGFCYXNlICZtZXRhKSB7CittZWRpYV9zdGF0dXNfdCBNUEVHNFNvdXJjZTo6Z2V0Rm9ybWF0KEFNZWRpYUZvcm1hdCAqbWV0YSkgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgbWV0YSA9IG1Gb3JtYXQ7Ci0gICAgcmV0dXJuIE9LOworICAgIEFNZWRpYUZvcm1hdF9jb3B5KG1ldGEsIG1Gb3JtYXQpOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKIHNpemVfdCBNUEVHNFNvdXJjZTo6cGFyc2VOQUxTaXplKGNvbnN0IHVpbnQ4X3QgKmRhdGEpIGNvbnN0IHsKQEAgLTQ4MDAsNyArNTA4NSwzNiBAQAogICAgIHJldHVybiAwOwogfQogCi1zdGF0dXNfdCBNUEVHNFNvdXJjZTo6cmVhZCgKK2ludDMyX3QgTVBFRzRTb3VyY2U6OnBhcnNlSEVWQ0xheWVySWQoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBDSEVDSyhkYXRhICE9IG51bGxwdHIgJiYgc2l6ZSA+PSAobU5BTExlbmd0aFNpemUgKyAyKSk7CisKKyAgICAvLyBIRVZDIE5BTC1oZWFkZXIgKDE2LWJpdCkKKyAgICAvLyAgMSAgIDYgICAgICA2ICAgICAzCisgICAgLy8gfC18dXV1dXV1fC0tLS0tLXxpaWl8CisgICAgLy8gICAgICBeICAgICAgICAgICAgXgorICAgIC8vICBOQUxfdHlwZSAgICAgICAgbGF5ZXJfaWQgKyAxCisgICAgLy8KKyAgICAvLyBMYXllci1pZCBpcyBub24temVybyBvbmx5IGZvciBUZW1wb3JhbCBTdWItbGF5ZXIgQWNjZXNzIHBpY3R1cmVzIChUU0EpCisgICAgZW51bSB7CisgICAgICAgIFRTQV9OID0gMiwKKyAgICAgICAgVFNBX1IgPSAzLAorICAgICAgICBTVFNBX04gPSA0LAorICAgICAgICBTVFNBX1IgPSA1LAorICAgIH07CisKKyAgICBkYXRhICs9IG1OQUxMZW5ndGhTaXplOworICAgIHVpbnQxNl90IG5hbEhlYWRlciA9IGRhdGFbMF0gPDwgOCB8IGRhdGFbMV07CisKKyAgICB1aW50MTZfdCBuYWxUeXBlID0gKG5hbEhlYWRlciA+PiA5KSAmIDB4M0Z1OworICAgIGlmIChuYWxUeXBlID09IFRTQV9OIHx8IG5hbFR5cGUgPT0gVFNBX1IgfHwgbmFsVHlwZSA9PSBTVFNBX04gfHwgbmFsVHlwZSA9PSBTVFNBX1IpIHsKKyAgICAgICAgaW50MzJfdCBsYXllcklkUGx1c09uZSA9IG5hbEhlYWRlciAmIDB4N3U7CisgICAgICAgIEFMT0dEX0lGKGxheWVySWRQbHVzT25lID09IDAsICJnb3QgbGF5ZXJJZCAwIGZvciBUU0EgcGljdHVyZSIpOworICAgICAgICByZXR1cm4gbGF5ZXJJZFBsdXNPbmUgLSAxOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworbWVkaWFfc3RhdHVzX3QgTVBFRzRTb3VyY2U6OnJlYWQoCiAgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKm91dCwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCkBAIC00ODA4LDcgKzUxMjIsNyBAQAogCiAgICAgaWYgKG9wdGlvbnMgIT0gbnVsbHB0ciAmJiBvcHRpb25zLT5nZXROb25CbG9ja2luZygpICYmICFtR3JvdXAtPmhhc19idWZmZXJzKCkpIHsKICAgICAgICAgKm91dCA9IG51bGxwdHI7Ci0gICAgICAgIHJldHVybiBXT1VMRF9CTE9DSzsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9XT1VMRF9CTE9DSzsKICAgICB9CiAKICAgICBpZiAobUZpcnN0TW9vZk9mZnNldCA+IDApIHsKQEAgLTQ4MjYsOCArNTE0MCw4IEBACiAgICAgICAgICAgICBDSEVDSyhtU2FtcGxlVGFibGUgPT0gTlVMTCk7CiAgICAgICAgICAgICBDSEVDSyhtSXRlbVRhYmxlICE9IE5VTEwpOwogICAgICAgICAgICAgaW50MzJfdCBpbWFnZUluZGV4OwotICAgICAgICAgICAgaWYgKCFtRm9ybWF0LmZpbmRJbnQzMihrS2V5VHJhY2tJRCwgJmltYWdlSW5kZXgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIGlmICghQU1lZGlhRm9ybWF0X2dldEludDMyKG1Gb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfVFJBQ0tfSUQsICZpbWFnZUluZGV4KSkgeworICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBzdGF0dXNfdCBlcnI7CkBAIC00ODM3LDcgKzUxNTEsNyBAQAogICAgICAgICAgICAgICAgIGVyciA9IG1JdGVtVGFibGUtPmZpbmRUaHVtYm5haWxJdGVtKGltYWdlSW5kZXgsICZtQ3VycmVudFNhbXBsZUluZGV4KTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHVpbnQzMl90IGZpbmRGbGFncyA9IDA7CkBAIC00ODkyLDEwICs1MjA2LDEwIEBACiAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgYWxsIHRoZSB3YXkgdG8gdGhlIE1lZGlhUGxheWVyIHdvdWxkIGNhdXNlIGFibm9ybWFsCiAgICAgICAgICAgICAgICAgICAgIC8vIHRlcm1pbmF0aW9uLiBMZWdhY3kgYmVoYXZpb3VyIGFwcGVhcnMgdG8gYmUgdG8gYmVoYXZlIGFzIGlmCiAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGhhZCBzZWVrZWQgdG8gdGhlIGVuZCBvZiBzdHJlYW0sIGVuZGluZyBub3JtYWxseS4KLSAgICAgICAgICAgICAgICAgICAgZXJyID0gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9FTkRfT0ZfU1RSRUFNOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBBTE9HVigiZW5kIG9mIHN0cmVhbSIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAobW9kZSA9PSBSZWFkT3B0aW9uczo6U0VFS19DTE9TRVNUCkBAIC00OTQ5LDI0ICs1MjYzLDI3IEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgaWYgKGVyciA9PSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogICAgICAgICB9CiAKICAgICAgICAgZXJyID0gbUdyb3VwLT5hY3F1aXJlX2J1ZmZlcigmbUJ1ZmZlcik7CiAKICAgICAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICAgICAgQ0hFQ0sobUJ1ZmZlciA9PSBOVUxMKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgICAgIH0KICAgICAgICAgaWYgKHNpemUgPiBtQnVmZmVyLT5zaXplKCkpIHsKICAgICAgICAgICAgIEFMT0dFKCJidWZmZXIgdG9vIHNtYWxsOiAlenUgPiAlenUiLCBzaXplLCBtQnVmZmVyLT5zaXplKCkpOwogICAgICAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZSgpOwogICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfQlVGRkVSX1RPT19TTUFMTDsKKyAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsgLy8gRVJST1JfQlVGRkVSX1RPT19TTUFMTAogICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKCghbUlzQVZDICYmICFtSXNIRVZDKSB8fCBtV2FudHNOQUxGcmFnbWVudHMpIHsKKyAgICBpZiAoKCFtSXNBVkMgJiYgIW1Jc0hFVkMgJiYgIW1Jc0FDNCkpIHsKICAgICAgICAgaWYgKG5ld0J1ZmZlcikgewogICAgICAgICAgICAgaWYgKG1Jc1BjbSkgewogICAgICAgICAgICAgICAgIC8vIFRoZSB0d29zJyBQQ00gYmxvY2sgcmVhZGVyIGFzc3VtZXMgdGhhdCBhbGwgc2FtcGxlcyBoYXMgdGhlIHNhbWUgc2l6ZS4KQEAgLTQ5ODEsMTQgKzUyOTgsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVzVG9SZWFkLCBzaXplLCBtQ3VycmVudFNhbXBsZUluZGV4LAogICAgICAgICAgICAgICAgICAgICAgIG1TYW1wbGVUYWJsZS0+Z2V0TGFzdFNhbXBsZUluZGV4SW5DaHVuaygpKTsKIAotICAgICAgICAgICAgICAgIHNpemVfdCB0b3RhbFNpemUgPSBzYW1wbGVzVG9SZWFkICogc2l6ZTsKKyAgICAgICAgICAgICAgIHNpemVfdCB0b3RhbFNpemUgPSBzYW1wbGVzVG9SZWFkICogc2l6ZTsKICAgICAgICAgICAgICAgICB1aW50OF90KiBidWYgPSAodWludDhfdCAqKW1CdWZmZXItPmRhdGEoKTsKICAgICAgICAgICAgICAgICBzc2l6ZV90IGJ5dGVzUmVhZCA9IG1EYXRhU291cmNlLT5yZWFkQXQob2Zmc2V0LCBidWYsIHRvdGFsU2l6ZSk7CiAgICAgICAgICAgICAgICAgaWYgKGJ5dGVzUmVhZCA8IChzc2l6ZV90KXRvdGFsU2l6ZSkgewogICAgICAgICAgICAgICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7CiAgICAgICAgICAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOwogCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTzsKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS5jbGVhcigpOwpAQCAtNDk5Niw3ICs1MzEzLDggQEAKICAgICAgICAgICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQzMihrS2V5SXNTeW5jRnJhbWUsIDEpOwogCiAgICAgICAgICAgICAgICAgaW50MzJfdCBieXRlT3JkZXI7Ci0gICAgICAgICAgICAgICAgbUZvcm1hdC5maW5kSW50MzIoa0tleVBjbUJpZ0VuZGlhbiwgJmJ5dGVPcmRlcik7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X2dldEludDMyKG1Gb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX1BDTV9CSUdfRU5ESUFOLCAmYnl0ZU9yZGVyKTsKIAogICAgICAgICAgICAgICAgIGlmIChieXRlT3JkZXIgPT0gMSkgewogICAgICAgICAgICAgICAgICAgICAvLyBCaWctZW5kaWFuIC0+IGxpdHRsZS1lbmRpYW4KQEAgLTUwMTgsNyArNTMzNiw3IEBACiAgICAgICAgICAgICAgICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKICAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7CiAKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lPOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIENIRUNLKG1CdWZmZXIgIT0gTlVMTCk7CkBAIC01MDM3LDE2ICs1MzU1LDIzIEBACiAgICAgICAgICAgICAgICAgaWYgKGlzU3luY1NhbXBsZSkgewogICAgICAgICAgICAgICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQzMihrS2V5SXNTeW5jRnJhbWUsIDEpOwogICAgICAgICAgICAgICAgIH0KLQorIAogICAgICAgICAgICAgICAgICsrbUN1cnJlbnRTYW1wbGVJbmRleDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIGlmICghbUlzQVZDICYmICFtSXNIRVZDKSB7CisgICAgICAgIGlmICghbUlzQVZDICYmICFtSXNIRVZDICYmICFtSXNBQzQpIHsKICAgICAgICAgICAgICpvdXQgPSBtQnVmZmVyOwogICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7CiAKLSAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgICAgIHJldHVybiBBTUVESUFfT0s7CisgICAgICAgIH0KKworICAgICAgICBpZiAobUlzQUM0KSB7CisgICAgICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKKworICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTzsKICAgICAgICAgfQogCiAgICAgICAgIC8vIEVhY2ggTkFMIHVuaXQgaXMgc3BsaXQgdXAgaW50byBpdHMgY29uc3RpdHVlbnQgZnJhZ21lbnRzIGFuZApAQCAtNTA2Nyw3ICs1MzkyLDcgQEAKICAgICAgICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKICAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOwogCi0gICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgIH0KIAogICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKmNsb25lID0gbUJ1ZmZlci0+Y2xvbmUoKTsKQEAgLTUwODYsNzggKzU0MTEsMTE3IEBACiAKICAgICAgICAgKm91dCA9IGNsb25lOwogCi0gICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9PSzsKKyAgICB9IGVsc2UgaWYgKG1Jc0FDNCkgeworICAgICAgICBDSEVDSyhtQnVmZmVyICE9IE5VTEwpOworICAgICAgICAvLyBNYWtlIHN1cmUgdGhlcmUgaXMgZW5vdWdoIHNwYWNlIHRvIHdyaXRlIHRoZSBzeW5jIGhlYWRlciBhbmQgdGhlIHJhdyBmcmFtZQorICAgICAgICBpZiAobUJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgPCAoNyArIHNpemUpKSB7CisgICAgICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKKworICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTzsKKyAgICAgICAgfQorCisgICAgICAgIHVpbnQ4X3QgKmRzdERhdGEgPSAodWludDhfdCAqKW1CdWZmZXItPmRhdGEoKTsKKyAgICAgICAgc2l6ZV90IGRzdE9mZnNldCA9IDA7CisgICAgICAgIC8vIEFkZCBBQy00IHN5bmMgaGVhZGVyIHRvIE1QRUc0IGVuY2Fwc3VsYXRlZCBBQy00IHJhdyBmcmFtZQorICAgICAgICAvLyBBQzQwIHN5bmMgd29yZCwgbWVhbmluZyBubyBDUkMgYXQgdGhlIGVuZCBvZiB0aGUgZnJhbWUKKyAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAweEFDOworICAgICAgICBkc3REYXRhW2RzdE9mZnNldCsrXSA9IDB4NDA7CisgICAgICAgIGRzdERhdGFbZHN0T2Zmc2V0KytdID0gMHhGRjsKKyAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAweEZGOworICAgICAgICBkc3REYXRhW2RzdE9mZnNldCsrXSA9ICh1aW50OF90KSgoc2l6ZSA+PiAxNikgJiAweEZGKTsKKyAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAodWludDhfdCkoKHNpemUgPj4gOCkgJiAweEZGKTsKKyAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAodWludDhfdCkoKHNpemUgPj4gMCkgJiAweEZGKTsKKworICAgICAgICBzc2l6ZV90IG51bUJ5dGVzUmVhZCA9IG1EYXRhU291cmNlLT5yZWFkQXQob2Zmc2V0LCBkc3REYXRhICsgZHN0T2Zmc2V0LCBzaXplKTsKKyAgICAgICAgaWYgKG51bUJ5dGVzUmVhZCAhPSAoc3NpemVfdClzaXplKSB7CisgICAgICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKKworICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTzsKKyAgICAgICAgfQorCisgICAgICAgIG1CdWZmZXItPnNldF9yYW5nZSgwLCBkc3RPZmZzZXQgKyBzaXplKTsKKyAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCkuY2xlYXIoKTsKKyAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50NjQoCisgICAgICAgICAgICAgICAga0tleVRpbWUsICgoaW50NjRfdCljdHMgKiAxMDAwMDAwKSAvIG1UaW1lc2NhbGUpOworICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQ2NCgKKyAgICAgICAgICAgICAgICBrS2V5RHVyYXRpb24sICgoaW50NjRfdClzdHRzICogMTAwMDAwMCkgLyBtVGltZXNjYWxlKTsKKworICAgICAgICBpZiAodGFyZ2V0U2FtcGxlVGltZVVzID49IDApIHsKKyAgICAgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLnNldEludDY0KAorICAgICAgICAgICAgICAgICAgICBrS2V5VGFyZ2V0VGltZSwgdGFyZ2V0U2FtcGxlVGltZVVzKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpc1N5bmNTYW1wbGUpIHsKKyAgICAgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLnNldEludDMyKGtLZXlJc1N5bmNGcmFtZSwgMSk7CisgICAgICAgIH0KKworICAgICAgICArK21DdXJyZW50U2FtcGxlSW5kZXg7CisKKyAgICAgICAgKm91dCA9IG1CdWZmZXI7CisgICAgICAgIG1CdWZmZXIgPSBOVUxMOworCisgICAgICAgIHJldHVybiBBTUVESUFfT0s7CiAgICAgfSBlbHNlIHsKICAgICAgICAgLy8gV2hvbGUgTkFMIHVuaXRzIGFyZSByZXR1cm5lZCBidXQgZWFjaCBmcmFnbWVudCBpcyBwcmVmaXhlZCBieQogICAgICAgICAvLyB0aGUgc3RhcnQgY29kZSAoMHgwMCAwMCAwMCAwMSkuCiAgICAgICAgIHNzaXplX3QgbnVtX2J5dGVzX3JlYWQgPSAwOwotICAgICAgICBpbnQzMl90IGRybSA9IDA7Ci0gICAgICAgIGJvb2wgdXNlc0RSTSA9IChtRm9ybWF0LmZpbmRJbnQzMihrS2V5SXNEUk0sICZkcm0pICYmIGRybSAhPSAwKTsKLSAgICAgICAgaWYgKHVzZXNEUk0pIHsKLSAgICAgICAgICAgIG51bV9ieXRlc19yZWFkID0KLSAgICAgICAgICAgICAgICBtRGF0YVNvdXJjZS0+cmVhZEF0KG9mZnNldCwgKHVpbnQ4X3QqKW1CdWZmZXItPmRhdGEoKSwgc2l6ZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBudW1fYnl0ZXNfcmVhZCA9IG1EYXRhU291cmNlLT5yZWFkQXQob2Zmc2V0LCBtU3JjQnVmZmVyLCBzaXplKTsKLSAgICAgICAgfQorICAgICAgICBudW1fYnl0ZXNfcmVhZCA9IG1EYXRhU291cmNlLT5yZWFkQXQob2Zmc2V0LCBtU3JjQnVmZmVyLCBzaXplKTsKIAogICAgICAgICBpZiAobnVtX2J5dGVzX3JlYWQgPCAoc3NpemVfdClzaXplKSB7CiAgICAgICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7CiAgICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKIAotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTzsKICAgICAgICAgfQogCi0gICAgICAgIGlmICh1c2VzRFJNKSB7Ci0gICAgICAgICAgICBDSEVDSyhtQnVmZmVyICE9IE5VTEwpOwotICAgICAgICAgICAgbUJ1ZmZlci0+c2V0X3JhbmdlKDAsIHNpemUpOworICAgICAgICB1aW50OF90ICpkc3REYXRhID0gKHVpbnQ4X3QgKiltQnVmZmVyLT5kYXRhKCk7CisgICAgICAgIHNpemVfdCBzcmNPZmZzZXQgPSAwOworICAgICAgICBzaXplX3QgZHN0T2Zmc2V0ID0gMDsKIAotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdWludDhfdCAqZHN0RGF0YSA9ICh1aW50OF90ICopbUJ1ZmZlci0+ZGF0YSgpOwotICAgICAgICAgICAgc2l6ZV90IHNyY09mZnNldCA9IDA7Ci0gICAgICAgICAgICBzaXplX3QgZHN0T2Zmc2V0ID0gMDsKLQotICAgICAgICAgICAgd2hpbGUgKHNyY09mZnNldCA8IHNpemUpIHsKLSAgICAgICAgICAgICAgICBib29sIGlzTWFsRm9ybWVkID0gIWlzSW5SYW5nZSgoc2l6ZV90KTB1LCBzaXplLCBzcmNPZmZzZXQsIG1OQUxMZW5ndGhTaXplKTsKLSAgICAgICAgICAgICAgICBzaXplX3QgbmFsTGVuZ3RoID0gMDsKLSAgICAgICAgICAgICAgICBpZiAoIWlzTWFsRm9ybWVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5hbExlbmd0aCA9IHBhcnNlTkFMU2l6ZSgmbVNyY0J1ZmZlcltzcmNPZmZzZXRdKTsKLSAgICAgICAgICAgICAgICAgICAgc3JjT2Zmc2V0ICs9IG1OQUxMZW5ndGhTaXplOwotICAgICAgICAgICAgICAgICAgICBpc01hbEZvcm1lZCA9ICFpc0luUmFuZ2UoKHNpemVfdCkwdSwgc2l6ZSwgc3JjT2Zmc2V0LCBuYWxMZW5ndGgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChpc01hbEZvcm1lZCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HRSgiVmlkZW8gaXMgbWFsZm9ybWVkIik7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG5hbExlbmd0aCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChkc3RPZmZzZXQgPiBTSVpFX01BWCAtIDQgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRzdE9mZnNldCArIDQgPiBTSVpFX01BWCAtIG5hbExlbmd0aCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgZHN0T2Zmc2V0ICsgNCArIG5hbExlbmd0aCA+IG1CdWZmZXItPnNpemUoKSkgewotICAgICAgICAgICAgICAgICAgICBBTE9HRSgiYi8yNzIwODYyMSA6ICV6dSAlenUiLCBkc3RPZmZzZXQsIG1CdWZmZXItPnNpemUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMjcyMDg2MjEiKTsKLSAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICAgICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBkc3REYXRhW2RzdE9mZnNldCsrXSA9IDA7Ci0gICAgICAgICAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAwOwotICAgICAgICAgICAgICAgIGRzdERhdGFbZHN0T2Zmc2V0KytdID0gMDsKLSAgICAgICAgICAgICAgICBkc3REYXRhW2RzdE9mZnNldCsrXSA9IDE7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KCZkc3REYXRhW2RzdE9mZnNldF0sICZtU3JjQnVmZmVyW3NyY09mZnNldF0sIG5hbExlbmd0aCk7Ci0gICAgICAgICAgICAgICAgc3JjT2Zmc2V0ICs9IG5hbExlbmd0aDsKLSAgICAgICAgICAgICAgICBkc3RPZmZzZXQgKz0gbmFsTGVuZ3RoOworICAgICAgICB3aGlsZSAoc3JjT2Zmc2V0IDwgc2l6ZSkgeworICAgICAgICAgICAgYm9vbCBpc01hbEZvcm1lZCA9ICFpc0luUmFuZ2UoKHNpemVfdCkwdSwgc2l6ZSwgc3JjT2Zmc2V0LCBtTkFMTGVuZ3RoU2l6ZSk7CisgICAgICAgICAgICBzaXplX3QgbmFsTGVuZ3RoID0gMDsKKyAgICAgICAgICAgIGlmICghaXNNYWxGb3JtZWQpIHsKKyAgICAgICAgICAgICAgICBuYWxMZW5ndGggPSBwYXJzZU5BTFNpemUoJm1TcmNCdWZmZXJbc3JjT2Zmc2V0XSk7CisgICAgICAgICAgICAgICAgc3JjT2Zmc2V0ICs9IG1OQUxMZW5ndGhTaXplOworICAgICAgICAgICAgICAgIGlzTWFsRm9ybWVkID0gIWlzSW5SYW5nZSgoc2l6ZV90KTB1LCBzaXplLCBzcmNPZmZzZXQsIG5hbExlbmd0aCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBDSEVDS19FUShzcmNPZmZzZXQsIHNpemUpOwotICAgICAgICAgICAgQ0hFQ0sobUJ1ZmZlciAhPSBOVUxMKTsKLSAgICAgICAgICAgIG1CdWZmZXItPnNldF9yYW5nZSgwLCBkc3RPZmZzZXQpOworCisgICAgICAgICAgICBpZiAoaXNNYWxGb3JtZWQpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiVmlkZW8gaXMgbWFsZm9ybWVkIik7CisgICAgICAgICAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOworICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobmFsTGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGRzdE9mZnNldCA+IFNJWkVfTUFYIC0gNCB8fAorICAgICAgICAgICAgICAgICAgICBkc3RPZmZzZXQgKyA0ID4gU0laRV9NQVggLSBuYWxMZW5ndGggfHwKKyAgICAgICAgICAgICAgICAgICAgZHN0T2Zmc2V0ICsgNCArIG5hbExlbmd0aCA+IG1CdWZmZXItPnNpemUoKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJiLzI3MjA4NjIxIDogJXp1ICV6dSIsIGRzdE9mZnNldCwgbUJ1ZmZlci0+c2l6ZSgpKTsKKyAgICAgICAgICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjI3MjA4NjIxIik7CisgICAgICAgICAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOworICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkc3REYXRhW2RzdE9mZnNldCsrXSA9IDA7CisgICAgICAgICAgICBkc3REYXRhW2RzdE9mZnNldCsrXSA9IDA7CisgICAgICAgICAgICBkc3REYXRhW2RzdE9mZnNldCsrXSA9IDA7CisgICAgICAgICAgICBkc3REYXRhW2RzdE9mZnNldCsrXSA9IDE7CisgICAgICAgICAgICBtZW1jcHkoJmRzdERhdGFbZHN0T2Zmc2V0XSwgJm1TcmNCdWZmZXJbc3JjT2Zmc2V0XSwgbmFsTGVuZ3RoKTsKKyAgICAgICAgICAgIHNyY09mZnNldCArPSBuYWxMZW5ndGg7CisgICAgICAgICAgICBkc3RPZmZzZXQgKz0gbmFsTGVuZ3RoOwogICAgICAgICB9CisgICAgICAgIENIRUNLX0VRKHNyY09mZnNldCwgc2l6ZSk7CisgICAgICAgIENIRUNLKG1CdWZmZXIgIT0gTlVMTCk7CisgICAgICAgIG1CdWZmZXItPnNldF9yYW5nZSgwLCBkc3RPZmZzZXQpOwogCiAgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLmNsZWFyKCk7CiAgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLnNldEludDY0KApAQCAtNTE3NCw2ICs1NTM4LDEyIEBACiAgICAgICAgICAgICB1aW50MzJfdCBsYXllcklkID0gRmluZEFWQ0xheWVySWQoCiAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90ICopbUJ1ZmZlci0+ZGF0YSgpLCBtQnVmZmVyLT5yYW5nZV9sZW5ndGgoKSk7CiAgICAgICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQzMihrS2V5VGVtcG9yYWxMYXllcklkLCBsYXllcklkKTsKKyAgICAgICAgfSBlbHNlIGlmIChtSXNIRVZDKSB7CisgICAgICAgICAgICBpbnQzMl90IGxheWVySWQgPSBwYXJzZUhFVkNMYXllcklkKAorICAgICAgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCAqKW1CdWZmZXItPmRhdGEoKSwgbUJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkpOworICAgICAgICAgICAgaWYgKGxheWVySWQgPj0gMCkgeworICAgICAgICAgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLnNldEludDMyKGtLZXlUZW1wb3JhbExheWVySWQsIGxheWVySWQpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgaWYgKGlzU3luY1NhbXBsZSkgewpAQCAtNTE4NSwxMSArNTU1NSwxMSBAQAogICAgICAgICAqb3V0ID0gbUJ1ZmZlcjsKICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7CiAKLSAgICAgICAgcmV0dXJuIE9LOworICAgICAgICByZXR1cm4gQU1FRElBX09LOwogICAgIH0KIH0KIAotc3RhdHVzX3QgTVBFRzRTb3VyY2U6OmZyYWdtZW50ZWRSZWFkKAorbWVkaWFfc3RhdHVzX3QgTVBFRzRTb3VyY2U6OmZyYWdtZW50ZWRSZWFkKAogICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipvdXQsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7CiAKICAgICBBTE9HVigiTVBFRzRTb3VyY2U6OmZyYWdtZW50ZWRSZWFkIik7CkBAIC01MjMxLDcgKzU2MDEsNyBAQAogICAgICAgICAgICAgbUN1cnJlbnRTYW1wbGVJbmRleCA9IDA7CiAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBwYXJzZUNodW5rKCZ0b3RhbE9mZnNldCk7CiAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtQ3VycmVudFRpbWUgPSB0b3RhbFRpbWUgKiBtVGltZXNjYWxlIC8gMTAwMDAwMGxsOwogICAgICAgICB9IGVsc2UgewpAQCAtNTI0Myw3ICs1NjEzLDcgQEAKICAgICAgICAgICAgIG9mZjY0X3QgdG1wID0gbUN1cnJlbnRNb29mT2Zmc2V0OwogICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gcGFyc2VDaHVuaygmdG1wKTsKICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1DdXJyZW50VGltZSA9IDA7CiAgICAgICAgIH0KQEAgLTUyNjEsMTMgKzU2MzEsMTcgQEAKICAgICB1aW50MzJfdCBjdHMgPSAwOwogICAgIGJvb2wgaXNTeW5jU2FtcGxlID0gZmFsc2U7CiAgICAgYm9vbCBuZXdCdWZmZXIgPSBmYWxzZTsKLSAgICBpZiAobUJ1ZmZlciA9PSBOVUxMKSB7CisgICAgaWYgKG1CdWZmZXIgPT0gTlVMTCB8fCBtQ3VycmVudFNhbXBsZUluZGV4ID49IG1DdXJyZW50U2FtcGxlcy5zaXplKCkpIHsKICAgICAgICAgbmV3QnVmZmVyID0gdHJ1ZTsKIAorICAgICAgICBpZiAobUJ1ZmZlciAhPSBOVUxMKSB7CisgICAgICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKKyAgICAgICAgfQogICAgICAgICBpZiAobUN1cnJlbnRTYW1wbGVJbmRleCA+PSBtQ3VycmVudFNhbXBsZXMuc2l6ZSgpKSB7CiAgICAgICAgICAgICAvLyBtb3ZlIHRvIG5leHQgZnJhZ21lbnQgaWYgdGhlcmUgaXMgb25lCiAgICAgICAgICAgICBpZiAobU5leHRNb29mT2Zmc2V0IDw9IG1DdXJyZW50TW9vZk9mZnNldCkgewotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfRU5EX09GX1NUUkVBTTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG9mZjY0X3QgbmV4dE1vb2YgPSBtTmV4dE1vb2ZPZmZzZXQ7CiAgICAgICAgICAgICBtQ3VycmVudE1vb2ZPZmZzZXQgPSBuZXh0TW9vZjsKQEAgLTUyNzUsMTAgKzU2NDksMTAgQEAKICAgICAgICAgICAgIG1DdXJyZW50U2FtcGxlSW5kZXggPSAwOwogICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gcGFyc2VDaHVuaygmbmV4dE1vb2YpOwogICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKG1DdXJyZW50U2FtcGxlSW5kZXggPj0gbUN1cnJlbnRTYW1wbGVzLnNpemUoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfRU5EX09GX1NUUkVBTTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC01Mjg3LDIwICs1NjYxLDIwIEBACiAgICAgICAgIHNpemUgPSBzbXBsLT5zaXplOwogICAgICAgICBjdHMgPSBtQ3VycmVudFRpbWUgKyBzbXBsLT5jb21wb3NpdGlvbk9mZnNldDsKICAgICAgICAgbUN1cnJlbnRUaW1lICs9IHNtcGwtPmR1cmF0aW9uOwotICAgICAgICBpc1N5bmNTYW1wbGUgPSAobUN1cnJlbnRTYW1wbGVJbmRleCA9PSAwKTsgLy8gWFhYCisgICAgICAgIGlzU3luY1NhbXBsZSA9IChtQ3VycmVudFNhbXBsZUluZGV4ID09IDApOwogCiAgICAgICAgIHN0YXR1c190IGVyciA9IG1Hcm91cC0+YWNxdWlyZV9idWZmZXIoJm1CdWZmZXIpOwogCiAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgICAgIENIRUNLKG1CdWZmZXIgPT0gTlVMTCk7CiAgICAgICAgICAgICBBTE9HVigiYWNxdWlyZV9idWZmZXIgcmV0dXJuZWQgJWQiLCBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICAgICAgfQogICAgICAgICBpZiAoc2l6ZSA+IG1CdWZmZXItPnNpemUoKSkgewogICAgICAgICAgICAgQUxPR0UoImJ1ZmZlciB0b28gc21hbGw6ICV6dSA+ICV6dSIsIHNpemUsIG1CdWZmZXItPnNpemUoKSk7CiAgICAgICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7CiAgICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9CVUZGRVJfVE9PX1NNQUxMOworICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogICAgICAgICB9CiAgICAgfQogCkBAIC01MzE5LDI2ICs1NjkzLDI1IEBACiAgICAgICAgIGJ1Zm1ldGEuc2V0SW50MzIoa0tleUVuY3J5cHRlZEJ5dGVCbG9jaywgbURlZmF1bHRFbmNyeXB0ZWRCeXRlQmxvY2spOwogICAgICAgICBidWZtZXRhLnNldEludDMyKGtLZXlTa2lwQnl0ZUJsb2NrLCBtRGVmYXVsdFNraXBCeXRlQmxvY2spOwogCi0gICAgICAgIHVpbnQzMl90IHR5cGUgPSAwOwotICAgICAgICBjb25zdCB2b2lkICppdiA9IE5VTEw7CisgICAgICAgIHZvaWQgKml2ID0gTlVMTDsKICAgICAgICAgc2l6ZV90IGl2bGVuZ3RoID0gMDsKLSAgICAgICAgaWYgKCFtRm9ybWF0LmZpbmREYXRhKAotICAgICAgICAgICAgICAgIGtLZXlDcnlwdG9JViwgJnR5cGUsICZpdiwgJml2bGVuZ3RoKSkgewotICAgICAgICAgICAgaXYgPSBzbXBsLT5pdjsKKyAgICAgICAgaWYgKCFBTWVkaWFGb3JtYXRfZ2V0QnVmZmVyKG1Gb3JtYXQsCisgICAgICAgICAgICAgICAgImNyeXB0by1pdiIsICZpdiwgJml2bGVuZ3RoKSkgeworICAgICAgICAgICAgaXYgPSAodm9pZCAqKSBzbXBsLT5pdjsKICAgICAgICAgICAgIGl2bGVuZ3RoID0gMTY7IC8vIHVzZSAxNiBvciB0aGUgYWN0dWFsIHNpemU/CiAgICAgICAgIH0KICAgICAgICAgYnVmbWV0YS5zZXREYXRhKGtLZXlDcnlwdG9JViwgMCwgaXYsIGl2bGVuZ3RoKTsKIAogICAgIH0KIAotICAgIGlmICgoIW1Jc0FWQyAmJiAhbUlzSEVWQyl8fCBtV2FudHNOQUxGcmFnbWVudHMpIHsKKyAgICBpZiAoKCFtSXNBVkMgJiYgIW1Jc0hFVkMpKSB7CiAgICAgICAgIGlmIChuZXdCdWZmZXIpIHsKICAgICAgICAgICAgIGlmICghaXNJblJhbmdlKChzaXplX3QpMHUsIG1CdWZmZXItPnNpemUoKSwgc2l6ZSkpIHsKICAgICAgICAgICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7CiAgICAgICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7CiAKICAgICAgICAgICAgICAgICBBTE9HRSgiZnJhZ21lbnRlZFJlYWQgRVJST1JfTUFMRk9STUVEIHNpemUgJXp1Iiwgc2l6ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgc3NpemVfdCBudW1fYnl0ZXNfcmVhZCA9CkBAIC01MzQ5LDcgKzU3MjIsNyBAQAogICAgICAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOwogCiAgICAgICAgICAgICAgICAgQUxPR0UoImkvbyBlcnJvciIpOwotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lPOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBDSEVDSyhtQnVmZmVyICE9IE5VTEwpOwpAQCAtNTM2OCw2ICs1NzQxLDEyIEBACiAgICAgICAgICAgICAgICAgdWludDMyX3QgbGF5ZXJJZCA9IEZpbmRBVkNMYXllcklkKAogICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKiltQnVmZmVyLT5kYXRhKCksIG1CdWZmZXItPnJhbmdlX2xlbmd0aCgpKTsKICAgICAgICAgICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQzMihrS2V5VGVtcG9yYWxMYXllcklkLCBsYXllcklkKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobUlzSEVWQykgeworICAgICAgICAgICAgICAgIGludDMyX3QgbGF5ZXJJZCA9IHBhcnNlSEVWQ0xheWVySWQoCisgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCAqKW1CdWZmZXItPmRhdGEoKSwgbUJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkpOworICAgICAgICAgICAgICAgIGlmIChsYXllcklkID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50MzIoa0tleVRlbXBvcmFsTGF5ZXJJZCwgbGF5ZXJJZCk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAoaXNTeW5jU2FtcGxlKSB7CkBAIC01MzgxLDcgKzU3NjAsNyBAQAogICAgICAgICAgICAgKm91dCA9IG1CdWZmZXI7CiAgICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKIAotICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9PSzsKICAgICAgICAgfQogCiAgICAgICAgIC8vIEVhY2ggTkFMIHVuaXQgaXMgc3BsaXQgdXAgaW50byBpdHMgY29uc3RpdHVlbnQgZnJhZ21lbnRzIGFuZApAQCAtNTQwMyw3ICs1NzgyLDcgQEAKICAgICAgICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKICAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOwogCi0gICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgIH0KIAogICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKmNsb25lID0gbUJ1ZmZlci0+Y2xvbmUoKTsKQEAgLTU0MjIsMzAgKzU4MDEsMjAgQEAKIAogICAgICAgICAqb3V0ID0gY2xvbmU7CiAKLSAgICAgICAgcmV0dXJuIE9LOworICAgICAgICByZXR1cm4gQU1FRElBX09LOwogICAgIH0gZWxzZSB7CiAgICAgICAgIEFMT0dWKCJ3aG9sZSBOQUwiKTsKICAgICAgICAgLy8gV2hvbGUgTkFMIHVuaXRzIGFyZSByZXR1cm5lZCBidXQgZWFjaCBmcmFnbWVudCBpcyBwcmVmaXhlZCBieQogICAgICAgICAvLyB0aGUgc3RhcnQgY29kZSAoMHgwMCAwMCAwMCAwMSkuCiAgICAgICAgIHNzaXplX3QgbnVtX2J5dGVzX3JlYWQgPSAwOwotICAgICAgICBpbnQzMl90IGRybSA9IDA7Ci0gICAgICAgIGJvb2wgdXNlc0RSTSA9IChtRm9ybWF0LmZpbmRJbnQzMihrS2V5SXNEUk0sICZkcm0pICYmIGRybSAhPSAwKTsKICAgICAgICAgdm9pZCAqZGF0YSA9IE5VTEw7CiAgICAgICAgIGJvb2wgaXNNYWxGb3JtZWQgPSBmYWxzZTsKLSAgICAgICAgaWYgKHVzZXNEUk0pIHsKLSAgICAgICAgICAgIGlmIChtQnVmZmVyID09IE5VTEwgfHwgIWlzSW5SYW5nZSgoc2l6ZV90KTB1LCBtQnVmZmVyLT5zaXplKCksIHNpemUpKSB7Ci0gICAgICAgICAgICAgICAgaXNNYWxGb3JtZWQgPSB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBkYXRhID0gbUJ1ZmZlci0+ZGF0YSgpOwotICAgICAgICAgICAgfQorICAgICAgICBpbnQzMl90IG1heF9zaXplOworICAgICAgICBpZiAoIUFNZWRpYUZvcm1hdF9nZXRJbnQzMihtRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX01BWF9JTlBVVF9TSVpFLCAmbWF4X3NpemUpCisgICAgICAgICAgICAgICAgfHwgIWlzSW5SYW5nZSgoc2l6ZV90KTB1LCAoc2l6ZV90KW1heF9zaXplLCBzaXplKSkgeworICAgICAgICAgICAgaXNNYWxGb3JtZWQgPSB0cnVlOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaW50MzJfdCBtYXhfc2l6ZTsKLSAgICAgICAgICAgIGlmICghbUZvcm1hdC5maW5kSW50MzIoa0tleU1heElucHV0U2l6ZSwgJm1heF9zaXplKQotICAgICAgICAgICAgICAgICAgICB8fCAhaXNJblJhbmdlKChzaXplX3QpMHUsIChzaXplX3QpbWF4X3NpemUsIHNpemUpKSB7Ci0gICAgICAgICAgICAgICAgaXNNYWxGb3JtZWQgPSB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBkYXRhID0gbVNyY0J1ZmZlcjsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRhdGEgPSBtU3JjQnVmZmVyOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKGlzTWFsRm9ybWVkIHx8IGRhdGEgPT0gTlVMTCkgewpAQCAtNTQ1NCw3ICs1ODIzLDcgQEAKICAgICAgICAgICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7CiAgICAgICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgIH0KICAgICAgICAgbnVtX2J5dGVzX3JlYWQgPSBtRGF0YVNvdXJjZS0+cmVhZEF0KG9mZnNldCwgZGF0YSwgc2l6ZSk7CiAKQEAgLTU0NjMsNjIgKzU4MzIsNTYgQEAKICAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOwogCiAgICAgICAgICAgICBBTE9HRSgiaS9vIGVycm9yIik7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lPOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKHVzZXNEUk0pIHsKLSAgICAgICAgICAgIENIRUNLKG1CdWZmZXIgIT0gTlVMTCk7Ci0gICAgICAgICAgICBtQnVmZmVyLT5zZXRfcmFuZ2UoMCwgc2l6ZSk7CisgICAgICAgIHVpbnQ4X3QgKmRzdERhdGEgPSAodWludDhfdCAqKW1CdWZmZXItPmRhdGEoKTsKKyAgICAgICAgc2l6ZV90IHNyY09mZnNldCA9IDA7CisgICAgICAgIHNpemVfdCBkc3RPZmZzZXQgPSAwOwogCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB1aW50OF90ICpkc3REYXRhID0gKHVpbnQ4X3QgKiltQnVmZmVyLT5kYXRhKCk7Ci0gICAgICAgICAgICBzaXplX3Qgc3JjT2Zmc2V0ID0gMDsKLSAgICAgICAgICAgIHNpemVfdCBkc3RPZmZzZXQgPSAwOwotCi0gICAgICAgICAgICB3aGlsZSAoc3JjT2Zmc2V0IDwgc2l6ZSkgewotICAgICAgICAgICAgICAgIGlzTWFsRm9ybWVkID0gIWlzSW5SYW5nZSgoc2l6ZV90KTB1LCBzaXplLCBzcmNPZmZzZXQsIG1OQUxMZW5ndGhTaXplKTsKLSAgICAgICAgICAgICAgICBzaXplX3QgbmFsTGVuZ3RoID0gMDsKLSAgICAgICAgICAgICAgICBpZiAoIWlzTWFsRm9ybWVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5hbExlbmd0aCA9IHBhcnNlTkFMU2l6ZSgmbVNyY0J1ZmZlcltzcmNPZmZzZXRdKTsKLSAgICAgICAgICAgICAgICAgICAgc3JjT2Zmc2V0ICs9IG1OQUxMZW5ndGhTaXplOwotICAgICAgICAgICAgICAgICAgICBpc01hbEZvcm1lZCA9ICFpc0luUmFuZ2UoKHNpemVfdCkwdSwgc2l6ZSwgc3JjT2Zmc2V0LCBuYWxMZW5ndGgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgIWlzSW5SYW5nZSgoc2l6ZV90KTB1LCBtQnVmZmVyLT5zaXplKCksIGRzdE9mZnNldCwgKHNpemVfdCk0dSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAhaXNJblJhbmdlKChzaXplX3QpMHUsIG1CdWZmZXItPnNpemUoKSwgZHN0T2Zmc2V0ICsgNCwgbmFsTGVuZ3RoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoaXNNYWxGb3JtZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoIlZpZGVvIGlzIG1hbGZvcm1lZDsgbmFsTGVuZ3RoICV6dSIsIG5hbExlbmd0aCk7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG5hbExlbmd0aCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChkc3RPZmZzZXQgPiBTSVpFX01BWCAtIDQgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRzdE9mZnNldCArIDQgPiBTSVpFX01BWCAtIG5hbExlbmd0aCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgZHN0T2Zmc2V0ICsgNCArIG5hbExlbmd0aCA+IG1CdWZmZXItPnNpemUoKSkgewotICAgICAgICAgICAgICAgICAgICBBTE9HRSgiYi8yNjM2NTM0OSA6ICV6dSAlenUiLCBkc3RPZmZzZXQsIG1CdWZmZXItPnNpemUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMjYzNjUzNDkiKTsKLSAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICAgICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBkc3REYXRhW2RzdE9mZnNldCsrXSA9IDA7Ci0gICAgICAgICAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAwOwotICAgICAgICAgICAgICAgIGRzdERhdGFbZHN0T2Zmc2V0KytdID0gMDsKLSAgICAgICAgICAgICAgICBkc3REYXRhW2RzdE9mZnNldCsrXSA9IDE7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KCZkc3REYXRhW2RzdE9mZnNldF0sICZtU3JjQnVmZmVyW3NyY09mZnNldF0sIG5hbExlbmd0aCk7Ci0gICAgICAgICAgICAgICAgc3JjT2Zmc2V0ICs9IG5hbExlbmd0aDsKLSAgICAgICAgICAgICAgICBkc3RPZmZzZXQgKz0gbmFsTGVuZ3RoOworICAgICAgICB3aGlsZSAoc3JjT2Zmc2V0IDwgc2l6ZSkgeworICAgICAgICAgICAgaXNNYWxGb3JtZWQgPSAhaXNJblJhbmdlKChzaXplX3QpMHUsIHNpemUsIHNyY09mZnNldCwgbU5BTExlbmd0aFNpemUpOworICAgICAgICAgICAgc2l6ZV90IG5hbExlbmd0aCA9IDA7CisgICAgICAgICAgICBpZiAoIWlzTWFsRm9ybWVkKSB7CisgICAgICAgICAgICAgICAgbmFsTGVuZ3RoID0gcGFyc2VOQUxTaXplKCZtU3JjQnVmZmVyW3NyY09mZnNldF0pOworICAgICAgICAgICAgICAgIHNyY09mZnNldCArPSBtTkFMTGVuZ3RoU2l6ZTsKKyAgICAgICAgICAgICAgICBpc01hbEZvcm1lZCA9ICFpc0luUmFuZ2UoKHNpemVfdCkwdSwgc2l6ZSwgc3JjT2Zmc2V0LCBuYWxMZW5ndGgpCisgICAgICAgICAgICAgICAgICAgICAgICB8fCAhaXNJblJhbmdlKChzaXplX3QpMHUsIG1CdWZmZXItPnNpemUoKSwgZHN0T2Zmc2V0LCAoc2l6ZV90KTR1KQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgIWlzSW5SYW5nZSgoc2l6ZV90KTB1LCBtQnVmZmVyLT5zaXplKCksIGRzdE9mZnNldCArIDQsIG5hbExlbmd0aCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBDSEVDS19FUShzcmNPZmZzZXQsIHNpemUpOwotICAgICAgICAgICAgQ0hFQ0sobUJ1ZmZlciAhPSBOVUxMKTsKLSAgICAgICAgICAgIG1CdWZmZXItPnNldF9yYW5nZSgwLCBkc3RPZmZzZXQpOworCisgICAgICAgICAgICBpZiAoaXNNYWxGb3JtZWQpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiVmlkZW8gaXMgbWFsZm9ybWVkOyBuYWxMZW5ndGggJXp1IiwgbmFsTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChuYWxMZW5ndGggPT0gMCkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZHN0T2Zmc2V0ID4gU0laRV9NQVggLSA0IHx8CisgICAgICAgICAgICAgICAgICAgIGRzdE9mZnNldCArIDQgPiBTSVpFX01BWCAtIG5hbExlbmd0aCB8fAorICAgICAgICAgICAgICAgICAgICBkc3RPZmZzZXQgKyA0ICsgbmFsTGVuZ3RoID4gbUJ1ZmZlci0+c2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImIvMjYzNjUzNDkgOiAlenUgJXp1IiwgZHN0T2Zmc2V0LCBtQnVmZmVyLT5zaXplKCkpOworICAgICAgICAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMjYzNjUzNDkiKTsKKyAgICAgICAgICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRzdERhdGFbZHN0T2Zmc2V0KytdID0gMDsKKyAgICAgICAgICAgIGRzdERhdGFbZHN0T2Zmc2V0KytdID0gMDsKKyAgICAgICAgICAgIGRzdERhdGFbZHN0T2Zmc2V0KytdID0gMDsKKyAgICAgICAgICAgIGRzdERhdGFbZHN0T2Zmc2V0KytdID0gMTsKKyAgICAgICAgICAgIG1lbWNweSgmZHN0RGF0YVtkc3RPZmZzZXRdLCAmbVNyY0J1ZmZlcltzcmNPZmZzZXRdLCBuYWxMZW5ndGgpOworICAgICAgICAgICAgc3JjT2Zmc2V0ICs9IG5hbExlbmd0aDsKKyAgICAgICAgICAgIGRzdE9mZnNldCArPSBuYWxMZW5ndGg7CiAgICAgICAgIH0KKyAgICAgICAgQ0hFQ0tfRVEoc3JjT2Zmc2V0LCBzaXplKTsKKyAgICAgICAgQ0hFQ0sobUJ1ZmZlciAhPSBOVUxMKTsKKyAgICAgICAgbUJ1ZmZlci0+c2V0X3JhbmdlKDAsIGRzdE9mZnNldCk7CiAKICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50NjQoCiAgICAgICAgICAgICAgICAga0tleVRpbWUsICgoaW50NjRfdCljdHMgKiAxMDAwMDAwKSAvIG1UaW1lc2NhbGUpOwpAQCAtNTUzOSwxNSArNTkwMiwxNyBAQAogICAgICAgICAqb3V0ID0gbUJ1ZmZlcjsKICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7CiAKLSAgICAgICAgcmV0dXJuIE9LOworICAgICAgICByZXR1cm4gQU1FRElBX09LOwogICAgIH0KKworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKIE1QRUc0RXh0cmFjdG9yOjpUcmFjayAqTVBFRzRFeHRyYWN0b3I6OmZpbmRUcmFja0J5TWltZVByZWZpeCgKICAgICAgICAgY29uc3QgY2hhciAqbWltZVByZWZpeCkgewogICAgIGZvciAoVHJhY2sgKnRyYWNrID0gbUZpcnN0VHJhY2s7IHRyYWNrICE9IE5VTEw7IHRyYWNrID0gdHJhY2stPm5leHQpIHsKICAgICAgICAgY29uc3QgY2hhciAqbWltZTsKLSAgICAgICAgaWYgKHRyYWNrLT5tZXRhLmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpCisgICAgICAgIGlmIChBTWVkaWFGb3JtYXRfZ2V0U3RyaW5nKHRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsICZtaW1lKQogICAgICAgICAgICAgICAgICYmICFzdHJuY2FzZWNtcChtaW1lLCBtaW1lUHJlZml4LCBzdHJsZW4obWltZVByZWZpeCkpKSB7CiAgICAgICAgICAgICByZXR1cm4gdHJhY2s7CiAgICAgICAgIH0KQEAgLTU1NTYsNyArNTkyMSw3IEBACiAgICAgcmV0dXJuIE5VTEw7CiB9CiAKLXN0YXRpYyBib29sIExlZ2FjeVNuaWZmTVBFRzQoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgZmxvYXQgKmNvbmZpZGVuY2UpIHsKK3N0YXRpYyBib29sIExlZ2FjeVNuaWZmTVBFRzQoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSkgewogICAgIHVpbnQ4X3QgaGVhZGVyWzhdOwogCiAgICAgc3NpemVfdCBuID0gc291cmNlLT5yZWFkQXQoNCwgaGVhZGVyLCBzaXplb2YoaGVhZGVyKSk7CkBAIC01NjIxLDcgKzU5ODYsNyBAQAogLy8gQWxzbyB0cnkgdG8gaWRlbnRpZnkgd2hlcmUgdGhpcyBmaWxlJ3MgbWV0YWRhdGEgZW5kcwogLy8gKGVuZCBvZiB0aGUgJ21vb3YnIGF0b20pIGFuZCByZXBvcnQgaXQgdG8gdGhlIGNhbGxlciBhcyBwYXJ0IG9mCiAvLyB0aGUgbWV0YWRhdGEuCi1zdGF0aWMgYm9vbCBCZXR0ZXJTbmlmZk1QRUc0KERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIGZsb2F0ICpjb25maWRlbmNlKSB7CitzdGF0aWMgYm9vbCBCZXR0ZXJTbmlmZk1QRUc0KERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwgZmxvYXQgKmNvbmZpZGVuY2UpIHsKICAgICAvLyBXZSBzY2FuIHVwIHRvIDEyOCBieXRlcyB0byBpZGVudGlmeSB0aGlzIGZpbGUgYXMgYW4gTVA0LgogICAgIHN0YXRpYyBjb25zdCBvZmY2NF90IGtNYXhTY2FuT2Zmc2V0ID0gMTI4bGw7CiAKQEAgLTU2NjcsNyArNjAzMiw4IEBACiAKICAgICAgICAgY2hhciBjaHVua3N0cmluZ1s1XTsKICAgICAgICAgTWFrZUZvdXJDQ1N0cmluZyhjaHVua1R5cGUsIGNodW5rc3RyaW5nKTsKLSAgICAgICAgQUxPR1YoInNhdyBjaHVuayB0eXBlICVzLCBzaXplICUiIFBSSXU2NCAiIEAgJWxsZCIsIGNodW5rc3RyaW5nLCBjaHVua1NpemUsIChsb25nIGxvbmcpb2Zmc2V0KTsKKyAgICAgICAgQUxPR1YoInNhdyBjaHVuayB0eXBlICVzLCBzaXplICUiIFBSSXU2NCAiIEAgJWxsZCIsCisgICAgICAgICAgICAgICAgY2h1bmtzdHJpbmcsIGNodW5rU2l6ZSwgKGxvbmcgbG9uZylvZmZzZXQpOwogICAgICAgICBzd2l0Y2ggKGNodW5rVHlwZSkgewogICAgICAgICAgICAgY2FzZSBGT1VSQ0MoJ2YnLCAndCcsICd5JywgJ3AnKToKICAgICAgICAgICAgIHsKQEAgLTU3MjgsMTggKzYwOTQsMTkgQEAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAotc3RhdGljIE1lZGlhRXh0cmFjdG9yKiBDcmVhdGVFeHRyYWN0b3IoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgdm9pZCAqKSB7Ci0gICAgcmV0dXJuIG5ldyBNUEVHNEV4dHJhY3Rvcihzb3VyY2UpOworc3RhdGljIENNZWRpYUV4dHJhY3RvclYyKiBDcmVhdGVFeHRyYWN0b3IoQ0RhdGFTb3VyY2UgKnNvdXJjZSwgdm9pZCAqKSB7CisgICAgcmV0dXJuIHdyYXBWMihuZXcgTVBFRzRFeHRyYWN0b3IobmV3IERhdGFTb3VyY2VIZWxwZXIoc291cmNlKSkpOwogfQogCi1zdGF0aWMgTWVkaWFFeHRyYWN0b3I6OkNyZWF0b3JGdW5jIFNuaWZmKAotICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSwgdm9pZCAqKiwKLSAgICAgICAgTWVkaWFFeHRyYWN0b3I6OkZyZWVNZXRhRnVuYyAqKSB7Ci0gICAgaWYgKEJldHRlclNuaWZmTVBFRzQoc291cmNlLCBjb25maWRlbmNlKSkgeworc3RhdGljIENyZWF0b3JGdW5jVjIgU25pZmYoCisgICAgICAgIENEYXRhU291cmNlICpzb3VyY2UsIGZsb2F0ICpjb25maWRlbmNlLCB2b2lkICoqLAorICAgICAgICBGcmVlTWV0YUZ1bmMgKikgeworICAgIERhdGFTb3VyY2VIZWxwZXIgaGVscGVyKHNvdXJjZSk7CisgICAgaWYgKEJldHRlclNuaWZmTVBFRzQoJmhlbHBlciwgY29uZmlkZW5jZSkpIHsKICAgICAgICAgcmV0dXJuIENyZWF0ZUV4dHJhY3RvcjsKICAgICB9CiAKLSAgICBpZiAoTGVnYWN5U25pZmZNUEVHNChzb3VyY2UsIGNvbmZpZGVuY2UpKSB7CisgICAgaWYgKExlZ2FjeVNuaWZmTVBFRzQoJmhlbHBlciwgY29uZmlkZW5jZSkpIHsKICAgICAgICAgQUxPR1coIklkZW50aWZpZWQgc3VwcG9ydGVkIG1wZWc0IHRocm91Z2ggTGVnYWN5U25pZmZNUEVHNC4iKTsKICAgICAgICAgcmV0dXJuIENyZWF0ZUV4dHJhY3RvcjsKICAgICB9CkBAIC01NzUwLDEzICs2MTE3LDEzIEBACiBleHRlcm4gIkMiIHsKIC8vIFRoaXMgaXMgdGhlIG9ubHkgc3ltYm9sIHRoYXQgbmVlZHMgdG8gYmUgZXhwb3J0ZWQKIF9fYXR0cmlidXRlX18gKCh2aXNpYmlsaXR5ICgiZGVmYXVsdCIpKSkKLU1lZGlhRXh0cmFjdG9yOjpFeHRyYWN0b3JEZWYgR0VURVhUUkFDVE9SREVGKCkgeworRXh0cmFjdG9yRGVmIEdFVEVYVFJBQ1RPUkRFRigpIHsKICAgICByZXR1cm4gewotICAgICAgICBNZWRpYUV4dHJhY3Rvcjo6RVhUUkFDVE9SREVGX1ZFUlNJT04sCisgICAgICAgIEVYVFJBQ1RPUkRFRl9WRVJTSU9OX0NVUlJFTlQsCiAgICAgICAgIFVVSUQoIjI3NTc1YzY3LTQ0MTctNGM1NC04ZDNkLThlNjI2OTg1YTE2NCIpLAotICAgICAgICAxLCAvLyB2ZXJzaW9uCisgICAgICAgIDIsIC8vIHZlcnNpb24KICAgICAgICAgIk1QNCBFeHRyYWN0b3IiLAotICAgICAgICBTbmlmZgorICAgICAgICB7IC52MiA9IFNuaWZmIH0KICAgICB9OwogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wNC9NUEVHNEV4dHJhY3Rvci5oIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvTVBFRzRFeHRyYWN0b3IuaAppbmRleCAzZWEwOTYzLi41NmI2NDFkIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21wNC9NUEVHNEV4dHJhY3Rvci5oCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbXA0L01QRUc0RXh0cmFjdG9yLmgKQEAgLTIwLDkgKzIwLDkgQEAKIAogI2luY2x1ZGUgPGFycGEvaW5ldC5oPgogCi0jaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZUJhc2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3Rvci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luQXBpLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUZvcm1hdC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oPgogI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CiAjaW5jbHVkZSA8dXRpbHMvTGlzdC5oPgpAQCAtMzEsOCArMzEsOCBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBzdHJ1Y3QgQU1lc3NhZ2U7Ci1jbGFzcyBEYXRhU291cmNlQmFzZTsKLXN0cnVjdCBDYWNoZWRSYW5nZWREYXRhU291cmNlOworc3RydWN0IENEYXRhU291cmNlOworY2xhc3MgRGF0YVNvdXJjZUhlbHBlcjsKIGNsYXNzIFNhbXBsZVRhYmxlOwogY2xhc3MgU3RyaW5nODsKIG5hbWVzcGFjZSBoZWlmIHsKQEAgLTUzLDE1ICs1MywxNSBAQAogICAgIHVpbnQzMl90IGRlZmF1bHRfc2FtcGxlX2ZsYWdzOwogfTsKIAotY2xhc3MgTVBFRzRFeHRyYWN0b3IgOiBwdWJsaWMgTWVkaWFFeHRyYWN0b3IgeworY2xhc3MgTVBFRzRFeHRyYWN0b3IgOiBwdWJsaWMgTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXJWMiB7CiBwdWJsaWM6Ci0gICAgZXhwbGljaXQgTVBFRzRFeHRyYWN0b3IoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgY29uc3QgY2hhciAqbWltZSA9IE5VTEwpOworICAgIGV4cGxpY2l0IE1QRUc0RXh0cmFjdG9yKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwgY29uc3QgY2hhciAqbWltZSA9IE5VTEwpOwogCiAgICAgdmlydHVhbCBzaXplX3QgY291bnRUcmFja3MoKTsKLSAgICB2aXJ0dWFsIE1lZGlhVHJhY2sgKmdldFRyYWNrKHNpemVfdCBpbmRleCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRUcmFja01ldGFEYXRhKE1ldGFEYXRhQmFzZSYgbWV0YSwgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncyk7CisgICAgdmlydHVhbCBNZWRpYVRyYWNrSGVscGVyVjIgKmdldFRyYWNrKHNpemVfdCBpbmRleCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRUcmFja01ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSwgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncyk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1ldGFEYXRhKE1ldGFEYXRhQmFzZSYgbWV0YSk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRNZXRhRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEpOwogICAgIHZpcnR1YWwgdWludDMyX3QgZmxhZ3MoKSBjb25zdDsKICAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKiBuYW1lKCkgeyByZXR1cm4gIk1QRUc0RXh0cmFjdG9yIjsgfQogCkBAIC03Nyw3ICs3Nyw3IEBACiAgICAgfTsKICAgICBzdHJ1Y3QgVHJhY2sgewogICAgICAgICBUcmFjayAqbmV4dDsKLSAgICAgICAgTWV0YURhdGFCYXNlIG1ldGE7CisgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YTsKICAgICAgICAgdWludDMyX3QgdGltZXNjYWxlOwogICAgICAgICBzcDxTYW1wbGVUYWJsZT4gc2FtcGxlVGFibGU7CiAgICAgICAgIGJvb2wgaW5jbHVkZXNfZXhwZW5zaXZlX21ldGFkYXRhOwpAQCAtOTcsOCArOTcsNyBAQAogCiAgICAgVmVjdG9yPFRyZXg+IG1UcmV4OwogCi0gICAgRGF0YVNvdXJjZUJhc2UgKm1EYXRhU291cmNlOwotICAgIENhY2hlZFJhbmdlZERhdGFTb3VyY2UgKm1DYWNoZWRTb3VyY2U7CisgICAgRGF0YVNvdXJjZUhlbHBlciAqbURhdGFTb3VyY2U7CiAgICAgc3RhdHVzX3QgbUluaXRDaGVjazsKICAgICB1aW50MzJfdCBtSGVhZGVyVGltZXNjYWxlOwogICAgIGJvb2wgbUlzUVQ7CkBAIC0xMDgsNyArMTA3LDcgQEAKIAogICAgIFRyYWNrICptRmlyc3RUcmFjaywgKm1MYXN0VHJhY2s7CiAKLSAgICBNZXRhRGF0YUJhc2UgbUZpbGVNZXRhRGF0YTsKKyAgICBBTWVkaWFGb3JtYXQgKm1GaWxlTWV0YURhdGE7CiAKICAgICBWZWN0b3I8dWludDMyX3Q+IG1QYXRoOwogICAgIFN0cmluZzggbUxhc3RDb21tZW50TWVhbjsKQEAgLTEzOSwxNyArMTM4LDE2IEBACiAKICAgICBUcmFjayAqZmluZFRyYWNrQnlNaW1lUHJlZml4KGNvbnN0IGNoYXIgKm1pbWVQcmVmaXgpOwogCi0gICAgc3RhdHVzX3QgcGFyc2VBQzNTYW1wbGVFbnRyeShvZmY2NF90IG9mZnNldCk7Ci0gICAgc3RhdHVzX3QgcGFyc2VBQzNTcGVjaWZpY0JveChvZmY2NF90IG9mZnNldCwgdWludDE2X3Qgc2FtcGxlUmF0ZSk7CisgICAgc3RhdHVzX3QgcGFyc2VDaGFubmVsQ291bnRTYW1wbGVSYXRlKAorICAgICAgICAgICAgb2ZmNjRfdCAqb2Zmc2V0LCB1aW50MTZfdCAqY2hhbm5lbENvdW50LCB1aW50MTZfdCAqc2FtcGxlUmF0ZSk7CisgICAgc3RhdHVzX3QgcGFyc2VBQzNTcGVjaWZpY0JveChvZmY2NF90IG9mZnNldCk7CisgICAgc3RhdHVzX3QgcGFyc2VFQUMzU3BlY2lmaWNCb3gob2ZmNjRfdCBvZmZzZXQpOworICAgIHN0YXR1c190IHBhcnNlQUM0U3BlY2lmaWNCb3gob2ZmNjRfdCBvZmZzZXQpOwogCiAgICAgTVBFRzRFeHRyYWN0b3IoY29uc3QgTVBFRzRFeHRyYWN0b3IgJik7CiAgICAgTVBFRzRFeHRyYWN0b3IgJm9wZXJhdG9yPShjb25zdCBNUEVHNEV4dHJhY3RvciAmKTsKIH07CiAKLWJvb2wgU25pZmZNUEVHNCgKLSAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgU3RyaW5nOCAqbWltZVR5cGUsIGZsb2F0ICpjb25maWRlbmNlLAotICAgICAgICBzcDxBTWVzc2FnZT4gKik7Ci0KIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKICNlbmRpZiAgLy8gTVBFRzRfRVhUUkFDVE9SX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wNC9TYW1wbGVJdGVyYXRvci5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL21wNC9TYW1wbGVJdGVyYXRvci5jcHAKaW5kZXggOTNlZTdjNi4uMWE2ZDMwNiAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9tcDQvU2FtcGxlSXRlcmF0b3IuY3BwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbXA0L1NhbXBsZUl0ZXJhdG9yLmNwcApAQCAtMzI4LDcgKzMyOCwxNSBAQAogICAgICAgICArK21UaW1lVG9TYW1wbGVJbmRleDsKICAgICB9CiAKLSAgICAqdGltZSA9IG1UVFNTYW1wbGVUaW1lICsgbVRUU0R1cmF0aW9uICogKHNhbXBsZUluZGV4IC0gbVRUU1NhbXBsZUluZGV4KTsKKyAgICAvLyBiZWxvdyBpcyBlcXVpdmFsZW50IHRvOgorICAgIC8vICp0aW1lID0gbVRUU1NhbXBsZVRpbWUgKyBtVFRTRHVyYXRpb24gKiAoc2FtcGxlSW5kZXggLSBtVFRTU2FtcGxlSW5kZXgpOworICAgIHVpbnQzMl90IHRtcDsKKyAgICBpZiAoX19idWlsdGluX3N1Yl9vdmVyZmxvdyhzYW1wbGVJbmRleCwgbVRUU1NhbXBsZUluZGV4LCAmdG1wKSB8fAorICAgICAgICAgICAgX19idWlsdGluX211bF9vdmVyZmxvdyhtVFRTRHVyYXRpb24sIHRtcCwgJnRtcCkgfHwKKyAgICAgICAgICAgIF9fYnVpbHRpbl9hZGRfb3ZlcmZsb3cobVRUU1NhbXBsZVRpbWUsIHRtcCwgJnRtcCkpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX09VVF9PRl9SQU5HRTsKKyAgICB9CisgICAgKnRpbWUgPSB0bXA7CiAKICAgICBpbnQzMl90IG9mZnNldCA9IG1UYWJsZS0+Z2V0Q29tcG9zaXRpb25UaW1lT2Zmc2V0KHNhbXBsZUluZGV4KTsKICAgICBpZiAoKG9mZnNldCA8IDAgJiYgKnRpbWUgPCAob2Zmc2V0ID09IElOVDMyX01JTiA/CmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wNC9TYW1wbGVUYWJsZS5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL21wNC9TYW1wbGVUYWJsZS5jcHAKaW5kZXggMjhmZTcxNy4uZDI0Mjc5OCAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9tcDQvU2FtcGxlVGFibGUuY3BwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbXA0L1NhbXBsZVRhYmxlLmNwcApAQCAtMjUsNyArMjUsNyBAQAogCiAjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CiAKLSNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luQXBpLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0J5dGVVdGlscy5oPgogCkBAIC0xMTQsNyArMTE0LDcgQEAKIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAotU2FtcGxlVGFibGU6OlNhbXBsZVRhYmxlKERhdGFTb3VyY2VCYXNlICpzb3VyY2UpCitTYW1wbGVUYWJsZTo6U2FtcGxlVGFibGUoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlKQogICAgIDogbURhdGFTb3VyY2Uoc291cmNlKSwKICAgICAgIG1DaHVua09mZnNldE9mZnNldCgtMSksCiAgICAgICBtQ2h1bmtPZmZzZXRUeXBlKDApLApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcDQvU2FtcGxlVGFibGUuaCBiL21lZGlhL2V4dHJhY3RvcnMvbXA0L1NhbXBsZVRhYmxlLmgKaW5kZXggZGQ2ODg2MC4uZDRiNWRjOCAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9tcDQvU2FtcGxlVGFibGUuaAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wNC9TYW1wbGVUYWJsZS5oCkBAIC0yMSwxOCArMjEsMTkgQEAKICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDxzdGRpbnQuaD4KIAorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KICNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CiAjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLWNsYXNzIERhdGFTb3VyY2VCYXNlOworY2xhc3MgRGF0YVNvdXJjZUhlbHBlcjsKIHN0cnVjdCBTYW1wbGVJdGVyYXRvcjsKIAogY2xhc3MgU2FtcGxlVGFibGUgOiBwdWJsaWMgUmVmQmFzZSB7CiBwdWJsaWM6Ci0gICAgZXhwbGljaXQgU2FtcGxlVGFibGUoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSk7CisgICAgZXhwbGljaXQgU2FtcGxlVGFibGUoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlKTsKIAogICAgIGJvb2wgaXNWYWxpZCgpIGNvbnN0OwogCkBAIC0xMDIsNyArMTAzLDcgQEAKICAgICAvLyBMaW1pdCB0aGUgdG90YWwgc2l6ZSBvZiBhbGwgaW50ZXJuYWwgdGFibGVzIHRvIDIwME1pQi4KICAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtNYXhUb3RhbFNpemUgPSAyMDAgKiAoMSA8PCAyMCk7CiAKLSAgICBEYXRhU291cmNlQmFzZSAqbURhdGFTb3VyY2U7CisgICAgRGF0YVNvdXJjZUhlbHBlciAqbURhdGFTb3VyY2U7CiAgICAgTXV0ZXggbUxvY2s7CiAKICAgICBvZmY2NF90IG1DaHVua09mZnNldE9mZnNldDsKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXBlZzIvRXh0cmFjdG9yQnVuZGxlLmNwcCBiL21lZGlhL2V4dHJhY3RvcnMvbXBlZzIvRXh0cmFjdG9yQnVuZGxlLmNwcAppbmRleCA4YTBmYTAzLi4zNjZhYTU5IDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21wZWcyL0V4dHJhY3RvckJ1bmRsZS5jcHAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9FeHRyYWN0b3JCdW5kbGUuY3BwCkBAIC0xOCwzOCArMTgsNDMgQEAKICNkZWZpbmUgTE9HX1RBRyAiTVBFRzJFeHRyYWN0b3JCdW5kbGUiCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKLSNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3Rvci5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyLmg+CiAjaW5jbHVkZSAiTVBFRzJQU0V4dHJhY3Rvci5oIgogI2luY2x1ZGUgIk1QRUcyVFNFeHRyYWN0b3IuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCitzdHJ1Y3QgQ0RhdGFTb3VyY2U7CisKIGV4dGVybiAiQyIgewogLy8gVGhpcyBpcyB0aGUgb25seSBzeW1ib2wgdGhhdCBuZWVkcyB0byBiZSBleHBvcnRlZAogX19hdHRyaWJ1dGVfXyAoKHZpc2liaWxpdHkgKCJkZWZhdWx0IikpKQotTWVkaWFFeHRyYWN0b3I6OkV4dHJhY3RvckRlZiBHRVRFWFRSQUNUT1JERUYoKSB7CitFeHRyYWN0b3JEZWYgR0VURVhUUkFDVE9SREVGKCkgewogICAgIHJldHVybiB7Ci0gICAgICAgIE1lZGlhRXh0cmFjdG9yOjpFWFRSQUNUT1JERUZfVkVSU0lPTiwKKyAgICAgICAgRVhUUkFDVE9SREVGX1ZFUlNJT04sCiAgICAgICAgIFVVSUQoIjNkMWRjZmViLWU0MGEtNDM2ZC1hNTc0LWMyNDM4YTU1NWU1ZiIpLAogICAgICAgICAxLAogICAgICAgICAiTVBFRzItUFMvVFMgRXh0cmFjdG9yIiwKLSAgICAgICAgW10oCi0gICAgICAgICAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwKLSAgICAgICAgICAgICAgICBmbG9hdCAqY29uZmlkZW5jZSwKLSAgICAgICAgICAgICAgICB2b2lkICoqLAotICAgICAgICAgICAgICAgIE1lZGlhRXh0cmFjdG9yOjpGcmVlTWV0YUZ1bmMgKikgLT4gTWVkaWFFeHRyYWN0b3I6OkNyZWF0b3JGdW5jIHsKLSAgICAgICAgICAgIGlmIChTbmlmZk1QRUcyVFMoc291cmNlLCBjb25maWRlbmNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBbXSgKLSAgICAgICAgICAgICAgICAgICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICB2b2lkICopIC0+IE1lZGlhRXh0cmFjdG9yKiB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTVBFRzJUU0V4dHJhY3Rvcihzb3VyY2UpO307Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKFNuaWZmTVBFRzJQUyhzb3VyY2UsIGNvbmZpZGVuY2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW10oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKikgLT4gTWVkaWFFeHRyYWN0b3IqIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE1QRUcyUFNFeHRyYWN0b3Ioc291cmNlKTt9OworICAgICAgICB7CisgICAgICAgICAgICBbXSgKKyAgICAgICAgICAgICAgICAgICAgQ0RhdGFTb3VyY2UgKnNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgKmNvbmZpZGVuY2UsCisgICAgICAgICAgICAgICAgICAgIHZvaWQgKiosCisgICAgICAgICAgICAgICAgICAgIEZyZWVNZXRhRnVuYyAqKSAtPiBDcmVhdG9yRnVuYyB7CisgICAgICAgICAgICAgICAgRGF0YVNvdXJjZUhlbHBlciBoZWxwZXIoc291cmNlKTsKKyAgICAgICAgICAgICAgICBpZiAoU25pZmZNUEVHMlRTKCZoZWxwZXIsIGNvbmZpZGVuY2UpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBbXSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRGF0YVNvdXJjZSAqc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKikgLT4gQ01lZGlhRXh0cmFjdG9yKiB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gd3JhcChuZXcgTVBFRzJUU0V4dHJhY3RvcihuZXcgRGF0YVNvdXJjZUhlbHBlcihzb3VyY2UpKSk7fTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFNuaWZmTVBFRzJQUygmaGVscGVyLCBjb25maWRlbmNlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbXSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENEYXRhU291cmNlICpzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICopIC0+IENNZWRpYUV4dHJhY3RvciogeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gd3JhcChuZXcgTVBFRzJQU0V4dHJhY3RvcihuZXcgRGF0YVNvdXJjZUhlbHBlcihzb3VyY2UpKSk7fTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQogICAgIH07CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wZWcyL01QRUcyUFNFeHRyYWN0b3IuY3BwIGIvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9NUEVHMlBTRXh0cmFjdG9yLmNwcAppbmRleCA2OTgwYjgyLi5mYzEzZDJjIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21wZWcyL01QRUcyUFNFeHRyYWN0b3IuY3BwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbXBlZzIvTVBFRzJQU0V4dHJhY3Rvci5jcHAKQEAgLTI0LDcgKzI0LDYgQEAKICNpbmNsdWRlICJtcGVnMnRzL0VTUXVldWUuaCIKIAogI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2VCYXNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFUcmFjay5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJpdFJlYWRlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CkBAIC00MCwxMSArMzksMTEgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1zdHJ1Y3QgTVBFRzJQU0V4dHJhY3Rvcjo6VHJhY2sgOiBwdWJsaWMgTWVkaWFUcmFjaywgcHVibGljIFJlZkJhc2Ugeworc3RydWN0IE1QRUcyUFNFeHRyYWN0b3I6OlRyYWNrIDogcHVibGljIE1lZGlhVHJhY2tIZWxwZXIsIHB1YmxpYyBSZWZCYXNlIHsKICAgICBUcmFjayhNUEVHMlBTRXh0cmFjdG9yICpleHRyYWN0b3IsCiAgICAgICAgICAgdW5zaWduZWQgc3RyZWFtX2lkLCB1bnNpZ25lZCBzdHJlYW1fdHlwZSk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhQmFzZSAqcGFyYW1zKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGb3JtYXQoTWV0YURhdGFCYXNlICYpOwogCkBAIC03MiwxMCArNzEsMTAgQEAKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhUcmFjayk7CiB9OwogCi1zdHJ1Y3QgTVBFRzJQU0V4dHJhY3Rvcjo6V3JhcHBlZFRyYWNrIDogcHVibGljIE1lZGlhVHJhY2sgeworc3RydWN0IE1QRUcyUFNFeHRyYWN0b3I6OldyYXBwZWRUcmFjayA6IHB1YmxpYyBNZWRpYVRyYWNrSGVscGVyIHsKICAgICBXcmFwcGVkVHJhY2soTVBFRzJQU0V4dHJhY3RvciAqZXh0cmFjdG9yLCBjb25zdCBzcDxUcmFjaz4gJnRyYWNrKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGFCYXNlICpwYXJhbXMpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZvcm1hdChNZXRhRGF0YUJhc2UgJik7CiAKQEAgLTk0LDcgKzkzLDcgQEAKIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAotTVBFRzJQU0V4dHJhY3Rvcjo6TVBFRzJQU0V4dHJhY3RvcihEYXRhU291cmNlQmFzZSAqc291cmNlKQorTVBFRzJQU0V4dHJhY3Rvcjo6TVBFRzJQU0V4dHJhY3RvcihEYXRhU291cmNlSGVscGVyICpzb3VyY2UpCiAgICAgOiBtRGF0YVNvdXJjZShzb3VyY2UpLAogICAgICAgbU9mZnNldCgwKSwKICAgICAgIG1GaW5hbFJlc3VsdChPSyksCkBAIC0xMjAsMTMgKzExOSwxNCBAQAogfQogCiBNUEVHMlBTRXh0cmFjdG9yOjp+TVBFRzJQU0V4dHJhY3RvcigpIHsKKyAgICBkZWxldGUgbURhdGFTb3VyY2U7CiB9CiAKIHNpemVfdCBNUEVHMlBTRXh0cmFjdG9yOjpjb3VudFRyYWNrcygpIHsKICAgICByZXR1cm4gbVRyYWNrcy5zaXplKCk7CiB9CiAKLU1lZGlhVHJhY2sgKk1QRUcyUFNFeHRyYWN0b3I6OmdldFRyYWNrKHNpemVfdCBpbmRleCkgeworTWVkaWFUcmFja0hlbHBlciAqTVBFRzJQU0V4dHJhY3Rvcjo6Z2V0VHJhY2soc2l6ZV90IGluZGV4KSB7CiAgICAgaWYgKGluZGV4ID49IG1UcmFja3Muc2l6ZSgpKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KQEAgLTYzNSw3ICs2MzUsNyBAQAogICAgIG1RdWV1ZSA9IE5VTEw7CiB9CiAKLXN0YXR1c190IE1QRUcyUFNFeHRyYWN0b3I6OlRyYWNrOjpzdGFydChNZXRhRGF0YUJhc2UgKikgeworc3RhdHVzX3QgTVBFRzJQU0V4dHJhY3Rvcjo6VHJhY2s6OnN0YXJ0KCkgewogICAgIGlmIChtU291cmNlID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQpAQCAtNjgwLDcgKzY4MCw3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICByZXR1cm4gbVNvdXJjZS0+cmVhZChidWZmZXIsIG9wdGlvbnMpOworICAgIHJldHVybiBtU291cmNlLT5yZWFkKGJ1ZmZlciwgKE1lZGlhU291cmNlOjpSZWFkT3B0aW9ucyopb3B0aW9ucyk7CiB9CiAKIHN0YXR1c190IE1QRUcyUFNFeHRyYWN0b3I6OlRyYWNrOjphcHBlbmRQRVNEYXRhKApAQCAtNzM0LDggKzczNCw4IEBACiBNUEVHMlBTRXh0cmFjdG9yOjpXcmFwcGVkVHJhY2s6On5XcmFwcGVkVHJhY2soKSB7CiB9CiAKLXN0YXR1c190IE1QRUcyUFNFeHRyYWN0b3I6OldyYXBwZWRUcmFjazo6c3RhcnQoTWV0YURhdGFCYXNlICpwYXJhbXMpIHsKLSAgICByZXR1cm4gbVRyYWNrLT5zdGFydChwYXJhbXMpOworc3RhdHVzX3QgTVBFRzJQU0V4dHJhY3Rvcjo6V3JhcHBlZFRyYWNrOjpzdGFydCgpIHsKKyAgICByZXR1cm4gbVRyYWNrLT5zdGFydCgpOwogfQogCiBzdGF0dXNfdCBNUEVHMlBTRXh0cmFjdG9yOjpXcmFwcGVkVHJhY2s6OnN0b3AoKSB7CkBAIC03NTQsNyArNzU0LDcgQEAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKIGJvb2wgU25pZmZNUEVHMlBTKAotICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSkgeworICAgICAgICBEYXRhU291cmNlSGVscGVyICpzb3VyY2UsIGZsb2F0ICpjb25maWRlbmNlKSB7CiAgICAgdWludDhfdCBoZWFkZXJbNV07CiAgICAgaWYgKHNvdXJjZS0+cmVhZEF0KDAsIGhlYWRlciwgc2l6ZW9mKGhlYWRlcikpIDwgKHNzaXplX3Qpc2l6ZW9mKGhlYWRlcikpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9NUEVHMlBTRXh0cmFjdG9yLmggYi9tZWRpYS9leHRyYWN0b3JzL21wZWcyL01QRUcyUFNFeHRyYWN0b3IuaAppbmRleCA4YjlkYWQ5Li5jNDA4MmVmIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21wZWcyL01QRUcyUFNFeHRyYWN0b3IuaAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wZWcyL01QRUcyUFNFeHRyYWN0b3IuaApAQCAtMTksNyArMTksOCBAQAogI2RlZmluZSBNUEVHMl9QU19FWFRSQUNUT1JfSF8KIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3Rvci5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luQXBpLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YUJhc2UuaD4KICNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CiAjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KQEAgLTMxLDExICszMiwxMSBAQAogc3RydWN0IFRyYWNrOwogY2xhc3MgU3RyaW5nODsKIAotc3RydWN0IE1QRUcyUFNFeHRyYWN0b3IgOiBwdWJsaWMgTWVkaWFFeHRyYWN0b3IgewotICAgIGV4cGxpY2l0IE1QRUcyUFNFeHRyYWN0b3IoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSk7CitzdHJ1Y3QgTVBFRzJQU0V4dHJhY3RvciA6IHB1YmxpYyBNZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlciB7CisgICAgZXhwbGljaXQgTVBFRzJQU0V4dHJhY3RvcihEYXRhU291cmNlSGVscGVyICpzb3VyY2UpOwogCiAgICAgdmlydHVhbCBzaXplX3QgY291bnRUcmFja3MoKTsKLSAgICB2aXJ0dWFsIE1lZGlhVHJhY2sgKmdldFRyYWNrKHNpemVfdCBpbmRleCk7CisgICAgdmlydHVhbCBNZWRpYVRyYWNrSGVscGVyICpnZXRUcmFjayhzaXplX3QgaW5kZXgpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0VHJhY2tNZXRhRGF0YShNZXRhRGF0YUJhc2UmIG1ldGEsIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNZXRhRGF0YShNZXRhRGF0YUJhc2UmIG1ldGEpOwpAQCAtNTEsNyArNTIsNyBAQAogICAgIHN0cnVjdCBXcmFwcGVkVHJhY2s7CiAKICAgICBtdXRhYmxlIE11dGV4IG1Mb2NrOwotICAgIERhdGFTb3VyY2VCYXNlICptRGF0YVNvdXJjZTsKKyAgICBEYXRhU291cmNlSGVscGVyICptRGF0YVNvdXJjZTsKIAogICAgIG9mZjY0X3QgbU9mZnNldDsKICAgICBzdGF0dXNfdCBtRmluYWxSZXN1bHQ7CkBAIC03Miw3ICs3Myw3IEBACiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoTVBFRzJQU0V4dHJhY3Rvcik7CiB9OwogCi1ib29sIFNuaWZmTVBFRzJQUyhEYXRhU291cmNlQmFzZSAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSk7Citib29sIFNuaWZmTVBFRzJQUyhEYXRhU291cmNlSGVscGVyICpzb3VyY2UsIGZsb2F0ICpjb25maWRlbmNlKTsKIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9NUEVHMlRTRXh0cmFjdG9yLmNwcCBiL21lZGlhL2V4dHJhY3RvcnMvbXBlZzIvTVBFRzJUU0V4dHJhY3Rvci5jcHAKaW5kZXggOTE5MTM4Ni4uYTc0ZGRhYSAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9NUEVHMlRTRXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wZWcyL01QRUcyVFNFeHRyYWN0b3IuY3BwCkBAIC0yNiw3ICsyNiw2IEBACiAKICNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlQmFzZS5oPgogI2luY2x1ZGUgPG1lZGlhL0lTdHJlYW1Tb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYVRyYWNrLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaD4KQEAgLTUxLDE0ICs1MCwxNCBAQAogc3RhdGljIGNvbnN0IGludCBrTWF4RHVyYXRpb25SZWFkU2l6ZSA9IDI1MDAwMExMOwogc3RhdGljIGNvbnN0IGludCBrTWF4RHVyYXRpb25SZXRyeSA9IDY7CiAKLXN0cnVjdCBNUEVHMlRTU291cmNlIDogcHVibGljIE1lZGlhVHJhY2sgeworc3RydWN0IE1QRUcyVFNTb3VyY2UgOiBwdWJsaWMgTWVkaWFUcmFja0hlbHBlciB7CiAgICAgTVBFRzJUU1NvdXJjZSgKICAgICAgICAgICAgIE1QRUcyVFNFeHRyYWN0b3IgKmV4dHJhY3RvciwKICAgICAgICAgICAgIGNvbnN0IHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+ICZpbXBsLAogICAgICAgICAgICAgYm9vbCBkb2VzU2Vlayk7CiAgICAgdmlydHVhbCB+TVBFRzJUU1NvdXJjZSgpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChNZXRhRGF0YUJhc2UgKnBhcmFtcyA9IE5VTEwpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZvcm1hdChNZXRhRGF0YUJhc2UgJik7CiAKQEAgLTg4LDcgKzg3LDcgQEAKIE1QRUcyVFNTb3VyY2U6On5NUEVHMlRTU291cmNlKCkgewogfQogCi1zdGF0dXNfdCBNUEVHMlRTU291cmNlOjpzdGFydChNZXRhRGF0YUJhc2UgKikgeworc3RhdHVzX3QgTVBFRzJUU1NvdXJjZTo6c3RhcnQoKSB7CiAgICAgcmV0dXJuIG1JbXBsLT5zdGFydChOVUxMKTsgLy8gQW5vdGhlclBhY2tldFNvdXJjZTo6c3RhcnQoKSBkb2Vzbid0IHVzZSBpdHMgYXJndW1lbnQKIH0KIApAQCAtMTEwLDcgKzEwOSw3IEBACiAgICAgUmVhZE9wdGlvbnM6OlNlZWtNb2RlIHNlZWtNb2RlOwogICAgIGlmIChtRG9lc1NlZWsgJiYgb3B0aW9ucyAmJiBvcHRpb25zLT5nZXRTZWVrVG8oJnNlZWtUaW1lVXMsICZzZWVrTW9kZSkpIHsKICAgICAgICAgLy8gc2VlayBpcyBuZWVkZWQKLSAgICAgICAgc3RhdHVzX3QgZXJyID0gbUV4dHJhY3Rvci0+c2VlayhzZWVrVGltZVVzLCBzZWVrTW9kZSk7CisgICAgICAgIHN0YXR1c190IGVyciA9IG1FeHRyYWN0b3ItPnNlZWsoc2Vla1RpbWVVcywgKFJlYWRPcHRpb25zOjpTZWVrTW9kZSlzZWVrTW9kZSk7CiAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgIH0KQEAgLTEyMCwxMiArMTE5LDEyIEBACiAgICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOwogICAgIH0KIAotICAgIHJldHVybiBtSW1wbC0+cmVhZChvdXQsIG9wdGlvbnMpOworICAgIHJldHVybiBtSW1wbC0+cmVhZChvdXQsIChNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnMqKSBvcHRpb25zKTsKIH0KIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAotTVBFRzJUU0V4dHJhY3Rvcjo6TVBFRzJUU0V4dHJhY3RvcihEYXRhU291cmNlQmFzZSAqc291cmNlKQorTVBFRzJUU0V4dHJhY3Rvcjo6TVBFRzJUU0V4dHJhY3RvcihEYXRhU291cmNlSGVscGVyICpzb3VyY2UpCiAgICAgOiBtRGF0YVNvdXJjZShzb3VyY2UpLAogICAgICAgbVBhcnNlcihuZXcgQVRTUGFyc2VyKSwKICAgICAgIG1MYXN0U3luY0V2ZW50KDApLApAQCAtMTMzLDExICsxMzIsMTUgQEAKICAgICBpbml0KCk7CiB9CiAKK01QRUcyVFNFeHRyYWN0b3I6On5NUEVHMlRTRXh0cmFjdG9yKCkgeworICAgIGRlbGV0ZSBtRGF0YVNvdXJjZTsKK30KKwogc2l6ZV90IE1QRUcyVFNFeHRyYWN0b3I6OmNvdW50VHJhY2tzKCkgewogICAgIHJldHVybiBtU291cmNlSW1wbHMuc2l6ZSgpOwogfQogCi1NZWRpYVRyYWNrICpNUEVHMlRTRXh0cmFjdG9yOjpnZXRUcmFjayhzaXplX3QgaW5kZXgpIHsKK01lZGlhVHJhY2tIZWxwZXIgKk1QRUcyVFNFeHRyYWN0b3I6OmdldFRyYWNrKHNpemVfdCBpbmRleCkgewogICAgIGlmIChpbmRleCA+PSBtU291cmNlSW1wbHMuc2l6ZSgpKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KQEAgLTQ3OSw3ICs0ODIsNyBAQAogfQogCiBzdGF0dXNfdCBNUEVHMlRTRXh0cmFjdG9yOjpzZWVrKGludDY0X3Qgc2Vla1RpbWVVcywKLSAgICAgICAgY29uc3QgTWVkaWFUcmFjazo6UmVhZE9wdGlvbnM6OlNlZWtNb2RlICZzZWVrTW9kZSkgeworICAgICAgICBjb25zdCBNZWRpYVRyYWNrSGVscGVyOjpSZWFkT3B0aW9uczo6U2Vla01vZGUgJnNlZWtNb2RlKSB7CiAgICAgaWYgKG1TZWVrU3luY1BvaW50cyA9PSBOVUxMIHx8IG1TZWVrU3luY1BvaW50cy0+aXNFbXB0eSgpKSB7CiAgICAgICAgIEFMT0dXKCJObyBzeW5jIHBvaW50IHRvIHNlZWsgdG8uIik7CiAgICAgICAgIC8vIC4uLiBhbmQgdGhlcmVmb3JlIHdlIGhhdmUgbm90aGluZyB1c2VmdWwgdG8gZG8gaGVyZS4KQEAgLTUwMCwxOCArNTAzLDE4IEBACiAgICAgfQogCiAgICAgc3dpdGNoIChzZWVrTW9kZSkgewotICAgICAgICBjYXNlIE1lZGlhVHJhY2s6OlJlYWRPcHRpb25zOjpTRUVLX05FWFRfU1lOQzoKKyAgICAgICAgY2FzZSBNZWRpYVRyYWNrSGVscGVyOjpSZWFkT3B0aW9uczo6U0VFS19ORVhUX1NZTkM6CiAgICAgICAgICAgICBpZiAoaW5kZXggPT0gbVNlZWtTeW5jUG9pbnRzLT5zaXplKCkpIHsKICAgICAgICAgICAgICAgICBBTE9HVygiTmV4dCBzeW5jIG5vdCBmb3VuZDsgc3RhcnRpbmcgZnJvbSB0aGUgbGF0ZXN0IHN5bmMuIik7CiAgICAgICAgICAgICAgICAgLS1pbmRleDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE1lZGlhVHJhY2s6OlJlYWRPcHRpb25zOjpTRUVLX0NMT1NFU1RfU1lOQzoKLSAgICAgICAgY2FzZSBNZWRpYVRyYWNrOjpSZWFkT3B0aW9uczo6U0VFS19DTE9TRVNUOgorICAgICAgICBjYXNlIE1lZGlhVHJhY2tIZWxwZXI6OlJlYWRPcHRpb25zOjpTRUVLX0NMT1NFU1RfU1lOQzoKKyAgICAgICAgY2FzZSBNZWRpYVRyYWNrSGVscGVyOjpSZWFkT3B0aW9uczo6U0VFS19DTE9TRVNUOgogICAgICAgICAgICAgQUxPR1coInNlZWtNb2RlIG5vdCBzdXBwb3J0ZWQ6ICVkOyBmYWxsaW5nIGJhY2sgdG8gUFJFVklPVVNfU1lOQyIsCiAgICAgICAgICAgICAgICAgICAgIHNlZWtNb2RlKTsKICAgICAgICAgICAgIEZBTExUSFJPVUdIX0lOVEVOREVEOwotICAgICAgICBjYXNlIE1lZGlhVHJhY2s6OlJlYWRPcHRpb25zOjpTRUVLX1BSRVZJT1VTX1NZTkM6CisgICAgICAgIGNhc2UgTWVkaWFUcmFja0hlbHBlcjo6UmVhZE9wdGlvbnM6OlNFRUtfUFJFVklPVVNfU1lOQzoKICAgICAgICAgICAgIGlmIChpbmRleCA9PSAwKSB7CiAgICAgICAgICAgICAgICAgQUxPR1coIlByZXZpb3VzIHN5bmMgbm90IGZvdW5kOyBzdGFydGluZyBmcm9tIHRoZSBlYXJsaWVzdCAiCiAgICAgICAgICAgICAgICAgICAgICAgICAic3luYy4iKTsKQEAgLTY1NCw3ICs2NTcsNyBAQAogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCi1ib29sIFNuaWZmTVBFRzJUUyhEYXRhU291cmNlQmFzZSAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSkgeworYm9vbCBTbmlmZk1QRUcyVFMoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSkgewogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNTsgKytpKSB7CiAgICAgICAgIGNoYXIgaGVhZGVyOwogICAgICAgICBpZiAoc291cmNlLT5yZWFkQXQoa1RTUGFja2V0U2l6ZSAqIGksICZoZWFkZXIsIDEpICE9IDEKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXBlZzIvTVBFRzJUU0V4dHJhY3Rvci5oIGIvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9NUEVHMlRTRXh0cmFjdG9yLmgKaW5kZXggY2JkZDNjYi4uNDAxMzQ0MiAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9NUEVHMlRTRXh0cmFjdG9yLmgKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9NUEVHMlRTRXh0cmFjdG9yLmgKQEAgLTIwLDggKzIwLDggQEAKICNkZWZpbmUgTVBFRzJfVFNfRVhUUkFDVE9SX0hfCiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3IuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYVRyYWNrLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5BcGkuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhQmFzZS5oPgogI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KICNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgpAQCAtMzQsMTUgKzM0LDE1IEBACiBzdHJ1Y3QgQU1lc3NhZ2U7CiBzdHJ1Y3QgQW5vdGhlclBhY2tldFNvdXJjZTsKIHN0cnVjdCBBVFNQYXJzZXI7Ci1jbGFzcyBEYXRhU291cmNlQmFzZTsKK3N0cnVjdCBDRGF0YVNvdXJjZTsKIHN0cnVjdCBNUEVHMlRTU291cmNlOwogY2xhc3MgU3RyaW5nODsKIAotc3RydWN0IE1QRUcyVFNFeHRyYWN0b3IgOiBwdWJsaWMgTWVkaWFFeHRyYWN0b3IgewotICAgIGV4cGxpY2l0IE1QRUcyVFNFeHRyYWN0b3IoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSk7CitzdHJ1Y3QgTVBFRzJUU0V4dHJhY3RvciA6IHB1YmxpYyBNZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlciB7CisgICAgZXhwbGljaXQgTVBFRzJUU0V4dHJhY3RvcihEYXRhU291cmNlSGVscGVyICpzb3VyY2UpOwogCiAgICAgdmlydHVhbCBzaXplX3QgY291bnRUcmFja3MoKTsKLSAgICB2aXJ0dWFsIE1lZGlhVHJhY2sgKmdldFRyYWNrKHNpemVfdCBpbmRleCk7CisgICAgdmlydHVhbCBNZWRpYVRyYWNrSGVscGVyICpnZXRUcmFjayhzaXplX3QgaW5kZXgpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0VHJhY2tNZXRhRGF0YShNZXRhRGF0YUJhc2UgJm1ldGEsIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNZXRhRGF0YShNZXRhRGF0YUJhc2UmIG1ldGEpOwpAQCAtNTIsMTIgKzUyLDE1IEBACiAgICAgdmlydHVhbCB1aW50MzJfdCBmbGFncygpIGNvbnN0OwogICAgIHZpcnR1YWwgY29uc3QgY2hhciAqIG5hbWUoKSB7IHJldHVybiAiTVBFRzJUU0V4dHJhY3RvciI7IH0KIAorcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfk1QRUcyVFNFeHRyYWN0b3IoKTsKKwogcHJpdmF0ZToKICAgICBmcmllbmQgc3RydWN0IE1QRUcyVFNTb3VyY2U7CiAKICAgICBtdXRhYmxlIE11dGV4IG1Mb2NrOwogCi0gICAgRGF0YVNvdXJjZUJhc2UgKm1EYXRhU291cmNlOworICAgIERhdGFTb3VyY2VIZWxwZXIgKm1EYXRhU291cmNlOwogCiAgICAgc3A8QVRTUGFyc2VyPiBtUGFyc2VyOwogCkBAIC04MSwxMyArODQsMTMgQEAKICAgICAvLyBUcnkgdG8gZmVlZCBtb3JlIGRhdGEgZnJvbSBzb3VyY2UgdG8gcGFyc2VyLgogICAgIC8vIHxpc0luaXR8IG1lYW5zIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGluc2lkZSBpbml0KCkuIFRoaXMgaXMgYSBzaWduYWwgdG8KICAgICAvLyBzYXZlIFN5bmNFdmVudCBzbyB0aGF0IGluaXQoKSBjYW4gYWRkIFN5bmNQb2ludCBhZnRlciBpdCB1cGRhdGVzIHxtU291cmNlSW1wbHN8LgotICAgIC8vIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBPSyBpZiBleHBlY3RlZCBhbW91bnQgb2YgZGF0YSBpcyBmZWQgZnJvbSBEYXRhU291cmNlQmFzZSB0bworICAgIC8vIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBPSyBpZiBleHBlY3RlZCBhbW91bnQgb2YgZGF0YSBpcyBmZWQgZnJvbSBEYXRhU291cmNlSGVscGVyIHRvCiAgICAgLy8gcGFyc2VyIGFuZCBpcyBzdWNjZXNzZnVsbHkgcGFyc2VkLiBPdGhlcndpc2UsIHZhcmlvdXMgZXJyb3IgY29kZXMgY291bGQgYmUKLSAgICAvLyByZXR1cm5lZCwgZS5nLiwgRVJST1JfRU5EX09GX1NUUkVBTSwgb3Igbm8gZGF0YSBhdmFpbGFsYmUgZnJvbSBEYXRhU291cmNlQmFzZSwgb3IKKyAgICAvLyByZXR1cm5lZCwgZS5nLiwgRVJST1JfRU5EX09GX1NUUkVBTSwgb3Igbm8gZGF0YSBhdmFpbGFsYmUgZnJvbSBEYXRhU291cmNlSGVscGVyLCBvcgogICAgIC8vIHRoZSBkYXRhIGhhcyBzeW50YXggZXJyb3IgZHVyaW5nIHBhcnNpbmcsIGV0Yy4KICAgICBzdGF0dXNfdCBmZWVkTW9yZShib29sIGlzSW5pdCA9IGZhbHNlKTsKICAgICBzdGF0dXNfdCBzZWVrKGludDY0X3Qgc2Vla1RpbWVVcywKLSAgICAgICAgICAgIGNvbnN0IE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6U2Vla01vZGUmIHNlZWtNb2RlKTsKKyAgICAgICAgICAgIGNvbnN0IE1lZGlhVHJhY2tIZWxwZXI6OlJlYWRPcHRpb25zOjpTZWVrTW9kZSYgc2Vla01vZGUpOwogICAgIHN0YXR1c190IHF1ZXVlRGlzY29udGludWl0eUZvclNlZWsoaW50NjRfdCBhY3R1YWxTZWVrVGltZVVzKTsKICAgICBzdGF0dXNfdCBzZWVrQmV5b25kKGludDY0X3Qgc2Vla1RpbWVVcyk7CiAKQEAgLTEwMSw3ICsxMDQsNyBAQAogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKE1QRUcyVFNFeHRyYWN0b3IpOwogfTsKIAotYm9vbCBTbmlmZk1QRUcyVFMoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgZmxvYXQgKmNvbmZpZGVuY2UpOworYm9vbCBTbmlmZk1QRUcyVFMoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSk7CiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvb2dnL0FuZHJvaWQuYnAgYi9tZWRpYS9leHRyYWN0b3JzL29nZy9BbmRyb2lkLmJwCmluZGV4IDdjNmZjNzUuLmM2ZGViMTggMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvb2dnL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9vZ2cvQW5kcm9pZC5icApAQCAtMTAsMTAgKzEwLDEyIEBACiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmxvZyIsCiAgICAgICAgICJsaWJtZWRpYWV4dHJhY3RvciIsCisgICAgICAgICJsaWJtZWRpYW5kayIsCiAgICAgXSwKIAogICAgIHN0YXRpY19saWJzOiBbCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X21ldGFkYXRhdXRpbHMiLAogICAgICAgICAibGlidXRpbHMiLAogICAgICAgICAibGlidm9yYmlzaWRlYyIsCiAgICAgXSwKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvb2dnL09nZ0V4dHJhY3Rvci5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL29nZy9PZ2dFeHRyYWN0b3IuY3BwCmluZGV4IGIyZmU2OWMuLmE1MmNjYjEgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvb2dnL09nZ0V4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9vZ2cvT2dnRXh0cmFjdG9yLmNwcApAQCAtMjEsMTAgKzIxLDkgQEAKICNpbmNsdWRlICJPZ2dFeHRyYWN0b3IuaCIKIAogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZUJhc2UuaD4KICNpbmNsdWRlIDxtZWRpYS9FeHRyYWN0b3JVdGlscy5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhVHJhY2suaD4KLSNpbmNsdWRlIDxtZWRpYS9Wb3JiaXNDb21tZW50Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2Jhc2U2NC5oPgpAQCAtMzQsNiArMzMsNyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFVdGlscy5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KIAogZXh0ZXJuICJDIiB7CkBAIC00NywxNSArNDcsMTUgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1zdHJ1Y3QgT2dnU291cmNlIDogcHVibGljIE1lZGlhVHJhY2sgeworc3RydWN0IE9nZ1NvdXJjZSA6IHB1YmxpYyBNZWRpYVRyYWNrSGVscGVyVjIgewogICAgIGV4cGxpY2l0IE9nZ1NvdXJjZShPZ2dFeHRyYWN0b3IgKmV4dHJhY3Rvcik7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZvcm1hdChNZXRhRGF0YUJhc2UgJik7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRGb3JtYXQoQU1lZGlhRm9ybWF0ICopOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChNZXRhRGF0YUJhc2UgKnBhcmFtcyA9IE5VTEwpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3Qgc3RhcnQoKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHN0b3AoKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCgKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHJlYWQoCiAgICAgICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CiAKIHByb3RlY3RlZDoKQEAgLTcxLDI2ICs3MSwyNSBAQAogCiBzdHJ1Y3QgTXlPZ2dFeHRyYWN0b3IgewogICAgIE15T2dnRXh0cmFjdG9yKAotICAgICAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwKKyAgICAgICAgICAgIERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm1pbWVUeXBlLAogICAgICAgICAgICAgc2l6ZV90IG51bUhlYWRlcnMsCiAgICAgICAgICAgICBpbnQ2NF90IHNlZWtQcmVSb2xsVXMpOwogICAgIHZpcnR1YWwgfk15T2dnRXh0cmFjdG9yKCk7CiAKLSAgICBzdGF0dXNfdCBnZXRGb3JtYXQoTWV0YURhdGFCYXNlICYpIGNvbnN0OworICAgIG1lZGlhX3N0YXR1c190IGdldEZvcm1hdChBTWVkaWFGb3JtYXQgKikgY29uc3Q7CiAKICAgICAvLyBSZXR1cm5zIGFuIGFwcHJveGltYXRlIGJpdHJhdGUgaW4gYml0cyBwZXIgc2Vjb25kLgogICAgIHZpcnR1YWwgdWludDY0X3QgYXBwcm94Qml0cmF0ZSgpIGNvbnN0ID0gMDsKIAogICAgIHN0YXR1c190IHNlZWtUb1RpbWUoaW50NjRfdCB0aW1lVXMpOwogICAgIHN0YXR1c190IHNlZWtUb09mZnNldChvZmY2NF90IG9mZnNldCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCByZWFkTmV4dFBhY2tldChNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIpID0gMDsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHJlYWROZXh0UGFja2V0KE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlcikgPSAwOwogCiAgICAgc3RhdHVzX3QgaW5pdCgpOwogCi0gICAgc3RhdHVzX3QgZ2V0RmlsZU1ldGFEYXRhKE1ldGFEYXRhQmFzZSAmbWV0YSkgewotICAgICAgICBtZXRhID0gbUZpbGVNZXRhOwotICAgICAgICByZXR1cm4gT0s7CisgICAgbWVkaWFfc3RhdHVzX3QgZ2V0RmlsZU1ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSkgeworICAgICAgICByZXR1cm4gQU1lZGlhRm9ybWF0X2NvcHkobWV0YSwgbUZpbGVNZXRhKTsKICAgICB9CiAKIHByb3RlY3RlZDoKQEAgLTExMCw3ICsxMDksNyBAQAogICAgICAgICBpbnQ2NF90IG1UaW1lVXM7CiAgICAgfTsKIAotICAgIERhdGFTb3VyY2VCYXNlICptU291cmNlOworICAgIERhdGFTb3VyY2VIZWxwZXIgKm1Tb3VyY2U7CiAgICAgb2ZmNjRfdCBtT2Zmc2V0OwogICAgIFBhZ2UgbUN1cnJlbnRQYWdlOwogICAgIHVpbnQ2NF90IG1DdXJHcmFudWxlUG9zaXRpb247CkBAIC0xMjksOCArMTI4LDggQEAKICAgICB2b3JiaXNfaW5mbyBtVmk7CiAgICAgdm9yYmlzX2NvbW1lbnQgbVZjOwogCi0gICAgTWV0YURhdGFCYXNlIG1NZXRhOwotICAgIE1ldGFEYXRhQmFzZSBtRmlsZU1ldGE7CisgICAgQU1lZGlhRm9ybWF0ICptTWV0YTsKKyAgICBBTWVkaWFGb3JtYXQgKm1GaWxlTWV0YTsKIAogICAgIFZlY3RvcjxUT0NFbnRyeT4gbVRhYmxlT2ZDb250ZW50czsKIApAQCAtMTQ2LDcgKzE0NSw3IEBACiAgICAgLy8gMSAtIGJpdHN0cmVhbSBpZGVudGlmaWNhdGlvbiBoZWFkZXIKICAgICAvLyAzIC0gY29tbWVudCBoZWFkZXIKICAgICAvLyA1IC0gY29kZWMgc2V0dXAgaGVhZGVyIChWb3JiaXMgb25seSkKLSAgICB2aXJ0dWFsIHN0YXR1c190IHZlcmlmeUhlYWRlcihNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlciwgdWludDhfdCB0eXBlKSA9IDA7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCB2ZXJpZnlIZWFkZXIoTWVkaWFCdWZmZXJCYXNlICpidWZmZXIsIHVpbnQ4X3QgdHlwZSkgPSAwOwogCiAgICAgLy8gUmVhZCB0aGUgbmV4dCBvZ2cgcGFja2V0IGZyb20gdGhlIHVuZGVybHlpbmcgZGF0YSBzb3VyY2U7IG9wdGlvbmFsbHkKICAgICAvLyBjYWxjdWxhdGUgdGhlIHRpbWVzdGFtcCBmb3IgdGhlIG91dHB1dCBwYWNrZXQgd2hpbHN0IHByZXRlbmRpbmcKQEAgLTE1NCw3ICsxNTMsNyBAQAogICAgIC8vCiAgICAgLy8gKmJ1ZmZlciBpcyBOVUxMJ2VkIG91dCBpbW1lZGlhdGVseSB1cG9uIGVudHJ5LCBhbmQgaWYgc3VjY2Vzc2Z1bCBhIG5ldyBidWZmZXIgaXMgYWxsb2NhdGVkOwogICAgIC8vIGNsaWVudHMgYXJlIHJlc3BvbnNpYmxlIGZvciByZWxlYXNpbmcgdGhlIG9yaWdpbmFsIGJ1ZmZlci4KLSAgICBzdGF0dXNfdCBfcmVhZE5leHRQYWNrZXQoTWVkaWFCdWZmZXJCYXNlICoqYnVmZmVyLCBib29sIGNhbGNWb3JiaXNUaW1lc3RhbXApOworICAgIG1lZGlhX3N0YXR1c190IF9yZWFkTmV4dFBhY2tldChNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsIGJvb2wgY2FsY1ZvcmJpc1RpbWVzdGFtcCk7CiAKICAgICBpbnQzMl90IGdldFBhY2tldEJsb2NrU2l6ZShNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcik7CiAKQEAgLTE2OSw3ICsxNjgsNyBAQAogfTsKIAogc3RydWN0IE15Vm9yYmlzRXh0cmFjdG9yIDogcHVibGljIE15T2dnRXh0cmFjdG9yIHsKLSAgICBleHBsaWNpdCBNeVZvcmJpc0V4dHJhY3RvcihEYXRhU291cmNlQmFzZSAqc291cmNlKQorICAgIGV4cGxpY2l0IE15Vm9yYmlzRXh0cmFjdG9yKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSkKICAgICAgICAgOiBNeU9nZ0V4dHJhY3Rvcihzb3VyY2UsCiAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fVk9SQklTLAogICAgICAgICAgICAgICAgIC8qIG51bUhlYWRlcnMgKi8gMywKQEAgLTE3OCw3ICsxNzcsNyBAQAogCiAgICAgdmlydHVhbCB1aW50NjRfdCBhcHByb3hCaXRyYXRlKCkgY29uc3Q7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWROZXh0UGFja2V0KE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlcikgeworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgcmVhZE5leHRQYWNrZXQoTWVkaWFCdWZmZXJCYXNlICoqYnVmZmVyKSB7CiAgICAgICAgIHJldHVybiBfcmVhZE5leHRQYWNrZXQoYnVmZmVyLCAvKiBjYWxjVm9yYmlzVGltZXN0YW1wID0gKi8gdHJ1ZSk7CiAgICAgfQogCkBAIC0xOTAsMTQgKzE4OSwxNCBAQAogICAgICAgICByZXR1cm4gZ3JhbnVsZVBvcyAqIDEwMDAwMDBsbCAvIG1WaS5yYXRlOwogICAgIH0KIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgdmVyaWZ5SGVhZGVyKE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyLCB1aW50OF90IHR5cGUpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgdmVyaWZ5SGVhZGVyKE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyLCB1aW50OF90IHR5cGUpOwogfTsKIAogc3RydWN0IE15T3B1c0V4dHJhY3RvciA6IHB1YmxpYyBNeU9nZ0V4dHJhY3RvciB7CiAgICAgc3RhdGljIGNvbnN0IGludDMyX3Qga09wdXNTYW1wbGVSYXRlID0gNDgwMDA7CiAgICAgc3RhdGljIGNvbnN0IGludDY0X3Qga09wdXNTZWVrUHJlUm9sbFVzID0gODAwMDA7IC8vIDgwIG1zCiAKLSAgICBleHBsaWNpdCBNeU9wdXNFeHRyYWN0b3IoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSkKKyAgICBleHBsaWNpdCBNeU9wdXNFeHRyYWN0b3IoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlKQogICAgICAgICA6IE15T2dnRXh0cmFjdG9yKHNvdXJjZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fT1BVUywgLypudW1IZWFkZXJzKi8gMiwga09wdXNTZWVrUHJlUm9sbFVzKSwKICAgICAgICAgICBtQ2hhbm5lbENvdW50KDApLAogICAgICAgICAgIG1Db2RlY0RlbGF5KDApLApAQCAtMjA4LDE1ICsyMDcsMTUgQEAKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWFkTmV4dFBhY2tldChNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgcmVhZE5leHRQYWNrZXQoTWVkaWFCdWZmZXJCYXNlICoqYnVmZmVyKTsKIAogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgaW50NjRfdCBnZXRUaW1lVXNPZkdyYW51bGUodWludDY0X3QgZ3JhbnVsZVBvcykgY29uc3Q7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCB2ZXJpZnlIZWFkZXIoTWVkaWFCdWZmZXJCYXNlICpidWZmZXIsIHVpbnQ4X3QgdHlwZSk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCB2ZXJpZnlIZWFkZXIoTWVkaWFCdWZmZXJCYXNlICpidWZmZXIsIHVpbnQ4X3QgdHlwZSk7CiAKIHByaXZhdGU6Ci0gICAgc3RhdHVzX3QgdmVyaWZ5T3B1c0hlYWRlcihNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcik7Ci0gICAgc3RhdHVzX3QgdmVyaWZ5T3B1c0NvbW1lbnRzKE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyKTsKKyAgICBtZWRpYV9zdGF0dXNfdCB2ZXJpZnlPcHVzSGVhZGVyKE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyKTsKKyAgICBtZWRpYV9zdGF0dXNfdCB2ZXJpZnlPcHVzQ29tbWVudHMoTWVkaWFCdWZmZXJCYXNlICpidWZmZXIpOwogICAgIHVpbnQzMl90IGdldE51bVNhbXBsZXNJblBhY2tldChNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcikgY29uc3Q7CiAKICAgICB1aW50OF90IG1DaGFubmVsQ291bnQ7CkBAIC0yMzcsMjcgKzIzNiwyNyBAQAogICAgIH0KIH0KIAotc3RhdHVzX3QgT2dnU291cmNlOjpnZXRGb3JtYXQoTWV0YURhdGFCYXNlICZtZXRhKSB7CittZWRpYV9zdGF0dXNfdCBPZ2dTb3VyY2U6OmdldEZvcm1hdChBTWVkaWFGb3JtYXQgKm1ldGEpIHsKICAgICByZXR1cm4gbUV4dHJhY3Rvci0+bUltcGwtPmdldEZvcm1hdChtZXRhKTsKIH0KIAotc3RhdHVzX3QgT2dnU291cmNlOjpzdGFydChNZXRhRGF0YUJhc2UgKiAvKiBwYXJhbXMgKi8pIHsKK21lZGlhX3N0YXR1c190IE9nZ1NvdXJjZTo6c3RhcnQoKSB7CiAgICAgaWYgKG1TdGFydGVkKSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKICAgICBtU3RhcnRlZCA9IHRydWU7CiAKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAotc3RhdHVzX3QgT2dnU291cmNlOjpzdG9wKCkgeworbWVkaWFfc3RhdHVzX3QgT2dnU291cmNlOjpzdG9wKCkgewogICAgIG1TdGFydGVkID0gZmFsc2U7CiAKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAotc3RhdHVzX3QgT2dnU291cmNlOjpyZWFkKAorbWVkaWFfc3RhdHVzX3QgT2dnU291cmNlOjpyZWFkKAogICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipvdXQsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7CiAgICAgKm91dCA9IE5VTEw7CiAKQEAgLTI2NiwxNCArMjY1LDE0IEBACiAgICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy0+Z2V0U2Vla1RvKCZzZWVrVGltZVVzLCAmbW9kZSkpIHsKICAgICAgICAgc3RhdHVzX3QgZXJyID0gbUV4dHJhY3Rvci0+bUltcGwtPnNlZWtUb1RpbWUoc2Vla1RpbWVVcyk7CiAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgICAgIH0KICAgICB9CiAKICAgICBNZWRpYUJ1ZmZlckJhc2UgKnBhY2tldDsKLSAgICBzdGF0dXNfdCBlcnIgPSBtRXh0cmFjdG9yLT5tSW1wbC0+cmVhZE5leHRQYWNrZXQoJnBhY2tldCk7CisgICAgbWVkaWFfc3RhdHVzX3QgZXJyID0gbUV4dHJhY3Rvci0+bUltcGwtPnJlYWROZXh0UGFja2V0KCZwYWNrZXQpOwogCi0gICAgaWYgKGVyciAhPSBPSykgeworICAgIGlmIChlcnIgIT0gQU1FRElBX09LKSB7CiAgICAgICAgIHJldHVybiBlcnI7CiAgICAgfQogCkBAIC0yOTAsMTMgKzI4OSwxMyBAQAogCiAgICAgKm91dCA9IHBhY2tldDsKIAotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCiBNeU9nZ0V4dHJhY3Rvcjo6TXlPZ2dFeHRyYWN0b3IoCi0gICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsCisgICAgICAgIERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwKICAgICAgICAgY29uc3QgY2hhciAqbWltZVR5cGUsCiAgICAgICAgIHNpemVfdCBudW1IZWFkZXJzLAogICAgICAgICBpbnQ2NF90IHNlZWtQcmVSb2xsVXMpCkBAIC0zMTYsMTYgKzMxNSwxOSBAQAogCiAgICAgdm9yYmlzX2luZm9faW5pdCgmbVZpKTsKICAgICB2b3JiaXNfY29tbWVudF9pbml0KCZtVmMpOworICAgIG1NZXRhID0gQU1lZGlhRm9ybWF0X25ldygpOworICAgIG1GaWxlTWV0YSA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKIH0KIAogTXlPZ2dFeHRyYWN0b3I6On5NeU9nZ0V4dHJhY3RvcigpIHsKKyAgICBBTWVkaWFGb3JtYXRfZGVsZXRlKG1GaWxlTWV0YSk7CisgICAgQU1lZGlhRm9ybWF0X2RlbGV0ZShtTWV0YSk7CiAgICAgdm9yYmlzX2NvbW1lbnRfY2xlYXIoJm1WYyk7CiAgICAgdm9yYmlzX2luZm9fY2xlYXIoJm1WaSk7CiB9CiAKLXN0YXR1c190IE15T2dnRXh0cmFjdG9yOjpnZXRGb3JtYXQoTWV0YURhdGFCYXNlICZtZXRhKSBjb25zdCB7Ci0gICAgbWV0YSA9IG1NZXRhOwotICAgIHJldHVybiBPSzsKK21lZGlhX3N0YXR1c190IE15T2dnRXh0cmFjdG9yOjpnZXRGb3JtYXQoQU1lZGlhRm9ybWF0ICptZXRhKSBjb25zdCB7CisgICAgcmV0dXJuIEFNZWRpYUZvcm1hdF9jb3B5KG1ldGEsIG1NZXRhKTsKIH0KIAogc3RhdHVzX3QgTXlPZ2dFeHRyYWN0b3I6OmZpbmROZXh0UGFnZSgKQEAgLTUwNSwyNyArNTA3LDI3IEBACiAgICAgICAgIGlmIChuIDwgMCkgewogICAgICAgICAgICAgcmV0dXJuIG47CiAgICAgICAgIH0gZWxzZSBpZiAobiA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfRU5EX09GX1NUUkVBTTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU87CiAgICAgICAgIH0KICAgICB9CiAKICAgICBpZiAobWVtY21wKGhlYWRlciwgIk9nZ1MiLCA0KSkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKICAgICB9CiAKICAgICBpZiAoaGVhZGVyWzRdICE9IDApIHsKICAgICAgICAgLy8gV3JvbmcgdmVyc2lvbi4KIAotICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5TVVBQT1JURUQ7CiAgICAgfQogCiAgICAgcGFnZS0+bUZsYWdzID0gaGVhZGVyWzVdOwogCiAgICAgaWYgKHBhZ2UtPm1GbGFncyAmIH43KSB7CiAgICAgICAgIC8vIE9ubHkgYml0cyAwLTIgYXJlIGRlZmluZWQgaW4gdmVyc2lvbiAwLgotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKICAgICB9CiAKICAgICBwYWdlLT5tR3JhbnVsZVBvc2l0aW9uID0gVTY0TEVfQVQoJmhlYWRlcls2XSk7CkBAIC01NDIsNyArNTQ0LDcgQEAKICAgICBpZiAobVNvdXJjZS0+cmVhZEF0KAogICAgICAgICAgICAgICAgIG9mZnNldCArIHNpemVvZihoZWFkZXIpLCBwYWdlLT5tTGFjZSwgcGFnZS0+bU51bVNlZ21lbnRzKQogICAgICAgICAgICAgPCAoc3NpemVfdClwYWdlLT5tTnVtU2VnbWVudHMpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lPOwogICAgIH0KIAogICAgIHNpemVfdCB0b3RhbFNpemUgPSAwOzsKQEAgLTU2NSw3ICs1NjcsNyBAQAogICAgIHJldHVybiBzaXplb2YoaGVhZGVyKSArIHBhZ2UtPm1OdW1TZWdtZW50cyArIHRvdGFsU2l6ZTsKIH0KIAotc3RhdHVzX3QgTXlPcHVzRXh0cmFjdG9yOjpyZWFkTmV4dFBhY2tldChNZWRpYUJ1ZmZlckJhc2UgKipvdXQpIHsKK21lZGlhX3N0YXR1c190IE15T3B1c0V4dHJhY3Rvcjo6cmVhZE5leHRQYWNrZXQoTWVkaWFCdWZmZXJCYXNlICoqb3V0KSB7CiAgICAgaWYgKG1PZmZzZXQgPD0gbUZpcnN0RGF0YU9mZnNldCAmJiBtU3RhcnRHcmFudWxlUG9zaXRpb24gPCAwKSB7CiAgICAgICAgIC8vIFRoZSBmaXJzdCBzYW1wbGUgbWlnaHQgbm90IHN0YXJ0IGF0IHRpbWUgMDsgZmluZCBvdXQgd2hlcmUgYnkgc3VidHJhY3RpbmcKICAgICAgICAgLy8gdGhlIG51bWJlciBvZiBzYW1wbGVzIG9uIHRoZSBmaXJzdCBwYWdlIGZyb20gdGhlIGdyYW51bGUgcG9zaXRpb24KQEAgLTU3NSwxMiArNTc3LDEyIEBACiAgICAgICAgIHVpbnQzMl90IG51bVNhbXBsZXMgPSAwOwogICAgICAgICB1aW50NjRfdCBjdXJHcmFudWxlUG9zaXRpb24gPSAwOwogICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gX3JlYWROZXh0UGFja2V0KCZtQnVmLCAvKiBjYWxjVm9yYmlzVGltZXN0YW1wID0gKi9mYWxzZSk7Ci0gICAgICAgICAgICBpZiAoZXJyICE9IE9LICYmIGVyciAhPSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgICAgICBtZWRpYV9zdGF0dXNfdCBlcnIgPSBfcmVhZE5leHRQYWNrZXQoJm1CdWYsIC8qIGNhbGNWb3JiaXNUaW1lc3RhbXAgPSAqL2ZhbHNlKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gQU1FRElBX09LICYmIGVyciAhPSBBTUVESUFfRVJST1JfRU5EX09GX1NUUkVBTSkgewogICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBGaXJzdCB0d28gcGFnZXMgYXJlIGhlYWRlciBwYWdlcy4KLSAgICAgICAgICAgIGlmIChlcnIgPT0gRVJST1JfRU5EX09GX1NUUkVBTSB8fCBtQ3VycmVudFBhZ2UubVBhZ2VObyA+IDIpIHsKKyAgICAgICAgICAgIGlmIChlcnIgPT0gQU1FRElBX0VSUk9SX0VORF9PRl9TVFJFQU0gfHwgbUN1cnJlbnRQYWdlLm1QYWdlTm8gPiAyKSB7CiAgICAgICAgICAgICAgICAgaWYgKG1CdWYgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICBtQnVmLT5yZWxlYXNlKCk7CiAgICAgICAgICAgICAgICAgICAgIG1CdWYgPSBOVUxMOwpAQCAtNjAxLDggKzYwMyw4IEBACiAgICAgICAgIHNlZWtUb09mZnNldCgwKTsKICAgICB9CiAKLSAgICBzdGF0dXNfdCBlcnIgPSBfcmVhZE5leHRQYWNrZXQob3V0LCAvKiBjYWxjVm9yYmlzVGltZXN0YW1wID0gKi9mYWxzZSk7Ci0gICAgaWYgKGVyciAhPSBPSykgeworICAgIG1lZGlhX3N0YXR1c190IGVyciA9IF9yZWFkTmV4dFBhY2tldChvdXQsIC8qIGNhbGNWb3JiaXNUaW1lc3RhbXAgPSAqL2ZhbHNlKTsKKyAgICBpZiAoZXJyICE9IEFNRURJQV9PSykgewogICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KIApAQCAtNjIzLDcgKzYyNSw3IEBACiAKICAgICB1aW50MzJfdCBmcmFtZXMgPSBnZXROdW1TYW1wbGVzSW5QYWNrZXQoKm91dCk7CiAgICAgbUN1ckdyYW51bGVQb3NpdGlvbiArPSBmcmFtZXM7Ci0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKIHVpbnQzMl90IE15T3B1c0V4dHJhY3Rvcjo6Z2V0TnVtU2FtcGxlc0luUGFja2V0KE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyKSBjb25zdCB7CkBAIC02NzIsNyArNjc0LDcgQEAKICAgICByZXR1cm4gbnVtU2FtcGxlczsKIH0KIAotc3RhdHVzX3QgTXlPZ2dFeHRyYWN0b3I6Ol9yZWFkTmV4dFBhY2tldChNZWRpYUJ1ZmZlckJhc2UgKipvdXQsIGJvb2wgY2FsY1ZvcmJpc1RpbWVzdGFtcCkgeworbWVkaWFfc3RhdHVzX3QgTXlPZ2dFeHRyYWN0b3I6Ol9yZWFkTmV4dFBhY2tldChNZWRpYUJ1ZmZlckJhc2UgKipvdXQsIGJvb2wgY2FsY1ZvcmJpc1RpbWVzdGFtcCkgewogICAgICpvdXQgPSBOVUxMOwogCiAgICAgTWVkaWFCdWZmZXJCYXNlICpidWZmZXIgPSBOVUxMOwpAQCAtNzA5LDcgKzcxMSw3IEBACiAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBBTE9HRSgiYi8zNjU5MjIwMiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKnRtcCA9IE1lZGlhQnVmZmVyQmFzZTo6Q3JlYXRlKGZ1bGxTaXplKTsKICAgICAgICAgICAgIGlmICh0bXAgPT0gTlVMTCkgewpAQCAtNzE3LDcgKzcxOSw3IEBACiAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBBTE9HRSgiYi8zNjU5MjIwMiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoYnVmZmVyICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICBtZW1jcHkodG1wLT5kYXRhKCksIGJ1ZmZlci0+ZGF0YSgpLCBidWZmZXItPnJhbmdlX2xlbmd0aCgpKTsKQEAgLTczNyw3ICs3MzksNyBAQAogICAgICAgICAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOwogICAgICAgICAgICAgICAgIEFMT0dWKCJmYWlsZWQgdG8gcmVhZCAlenUgYnl0ZXMgYXQgJSMwMTZsbHgsIGdvdCAlemQgYnl0ZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgcGFja2V0U2l6ZSwgKGxvbmcgbG9uZylkYXRhT2Zmc2V0LCBuKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTzsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgYnVmZmVyLT5zZXRfcmFuZ2UoMCwgZnVsbFNpemUpOwpAQCAtNzc0LDcgKzc3Niw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICpvdXQgPSBidWZmZXI7CiAKLSAgICAgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9PSzsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoLCB0aGUgYnVmZmVyIG5vdyBjb250YWlucyB0aGUgc3RhcnQgb2YgdGhlIHBhY2tldC4KQEAgLTc5Myw3ICs3OTUsNyBAQAogCiAgICAgICAgICAgICBBTE9HVigicmVhZFBhZ2UgcmV0dXJuZWQgJXpkIiwgbik7CiAKLSAgICAgICAgICAgIHJldHVybiBuIDwgMCA/IG4gOiAoc3RhdHVzX3QpRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgICAgIHJldHVybiBuIDwgMCA/IChtZWRpYV9zdGF0dXNfdCkgbiA6IEFNRURJQV9FUlJPUl9FTkRfT0ZfU1RSRUFNOwogICAgICAgICB9CiAKICAgICAgICAgLy8gUHJldmVudCBhIGhhcm1sZXNzIHVuc2lnbmVkIGludGVnZXIgb3ZlcmZsb3cgYnkgY2xhbXBpbmcgdG8gMApAQCAtODI1LDI3ICs4MjcsMjcgQEAKIAogICAgICAgICAgICAgICAgICpvdXQgPSBidWZmZXI7CiAKLSAgICAgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9PSzsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIH0KIAogc3RhdHVzX3QgTXlPZ2dFeHRyYWN0b3I6OmluaXQoKSB7Ci0gICAgbU1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIG1NaW1lVHlwZSk7CisgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtTWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBtTWltZVR5cGUpOwogCi0gICAgc3RhdHVzX3QgZXJyOworICAgIG1lZGlhX3N0YXR1c190IGVycjsKICAgICBNZWRpYUJ1ZmZlckJhc2UgKnBhY2tldDsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1OdW1IZWFkZXJzOyArK2kpIHsKICAgICAgICAgLy8gaWdub3JlIHRpbWVzdGFtcCBmb3IgY29uZmlndXJhdGlvbiBwYWNrZXRzCi0gICAgICAgIGlmICgoZXJyID0gX3JlYWROZXh0UGFja2V0KCZwYWNrZXQsIC8qIGNhbGNWb3JiaXNUaW1lc3RhbXAgPSAqLyBmYWxzZSkpICE9IE9LKSB7CisgICAgICAgIGlmICgoZXJyID0gX3JlYWROZXh0UGFja2V0KCZwYWNrZXQsIC8qIGNhbGNWb3JiaXNUaW1lc3RhbXAgPSAqLyBmYWxzZSkpICE9IEFNRURJQV9PSykgewogICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgfQogICAgICAgICBBTE9HVigicmVhZCBwYWNrZXQgb2Ygc2l6ZSAlenVcbiIsIHBhY2tldC0+cmFuZ2VfbGVuZ3RoKCkpOwogICAgICAgICBlcnIgPSB2ZXJpZnlIZWFkZXIocGFja2V0LCAvKiB0eXBlID0gKi8gaSAqIDIgKyAxKTsKICAgICAgICAgcGFja2V0LT5yZWxlYXNlKCk7CiAgICAgICAgIHBhY2tldCA9IE5VTEw7Ci0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgaWYgKGVyciAhPSBBTUVESUFfT0spIHsKICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgIH0KICAgICB9CkBAIC04NjUsMTIgKzg2NywxMiBAQAogCiAgICAgICAgIGludDY0X3QgZHVyYXRpb25VcyA9IGdldFRpbWVVc09mR3JhbnVsZShsYXN0R3JhbnVsZVBvc2l0aW9uKTsKIAotICAgICAgICBtTWV0YS5zZXRJbnQ2NChrS2V5RHVyYXRpb24sIGR1cmF0aW9uVXMpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04sIGR1cmF0aW9uVXMpOwogCiAgICAgICAgIGJ1aWxkVGFibGVPZkNvbnRlbnRzKCk7CiAgICAgfQogCi0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKIHZvaWQgTXlPZ2dFeHRyYWN0b3I6OmJ1aWxkVGFibGVPZkNvbnRlbnRzKCkgewpAQCAtOTUyLDcgKzk1NCw3IEBACiAgICAgcmV0dXJuIHBjbVNhbXBsZVBvc2l0aW9uICogMTAwMDAwMGxsIC8ga09wdXNTYW1wbGVSYXRlOwogfQogCi1zdGF0dXNfdCBNeU9wdXNFeHRyYWN0b3I6OnZlcmlmeUhlYWRlcihNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlciwgdWludDhfdCB0eXBlKSB7CittZWRpYV9zdGF0dXNfdCBNeU9wdXNFeHRyYWN0b3I6OnZlcmlmeUhlYWRlcihNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlciwgdWludDhfdCB0eXBlKSB7CiAgICAgc3dpdGNoICh0eXBlKSB7CiAgICAgICAgIC8vIHRoZXJlIGFyZSBhY3R1YWxseSBubyBoZWFkZXIgdHlwZXMgZGVmaW5lZCBpbiB0aGUgT3B1cyBzcGVjOyB3ZSBjaG9vc2UgMSBhbmQgMyB0byBtZWFuCiAgICAgICAgIC8vIGhlYWRlciBhbmQgY29tbWVudHMgc3VjaCB0aGF0IHdlIGNhbiBzaGFyZSBjb2RlIHdpdGggTXlWb3JiaXNFeHRyYWN0b3IuCkBAIC05NjEsMTEgKzk2MywxMSBAQAogICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgICByZXR1cm4gdmVyaWZ5T3B1c0NvbW1lbnRzKGJ1ZmZlcik7CiAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIH0KIAotc3RhdHVzX3QgTXlPcHVzRXh0cmFjdG9yOjp2ZXJpZnlPcHVzSGVhZGVyKE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyKSB7CittZWRpYV9zdGF0dXNfdCBNeU9wdXNFeHRyYWN0b3I6OnZlcmlmeU9wdXNIZWFkZXIoTWVkaWFCdWZmZXJCYXNlICpidWZmZXIpIHsKICAgICBjb25zdCBzaXplX3Qga09wdXNIZWFkZXJTaXplID0gMTk7CiAgICAgY29uc3QgdWludDhfdCAqZGF0YSA9CiAgICAgICAgIChjb25zdCB1aW50OF90ICopYnVmZmVyLT5kYXRhKCkgKyBidWZmZXItPnJhbmdlX29mZnNldCgpOwpAQCAtOTc1LDI5ICs5NzcsMzEgQEAKICAgICBpZiAoc2l6ZSA8IGtPcHVzSGVhZGVyU2l6ZQogICAgICAgICAgICAgfHwgbWVtY21wKGRhdGEsICJPcHVzSGVhZCIsIDgpCiAgICAgICAgICAgICB8fCAvKiB2ZXJzaW9uID0gKi8gZGF0YVs4XSAhPSAxKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOwogICAgIH0KIAogICAgIG1DaGFubmVsQ291bnQgPSBkYXRhWzldOwogICAgIG1Db2RlY0RlbGF5ID0gVTE2TEVfQVQoJmRhdGFbMTBdKTsKIAotICAgIG1NZXRhLnNldERhdGEoa0tleU9wdXNIZWFkZXIsIDAsIGRhdGEsIHNpemUpOwotICAgIG1NZXRhLnNldEludDMyKGtLZXlTYW1wbGVSYXRlLCBrT3B1c1NhbXBsZVJhdGUpOwotICAgIG1NZXRhLnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsIG1DaGFubmVsQ291bnQpOwotICAgIG1NZXRhLnNldEludDY0KGtLZXlPcHVzU2Vla1ByZVJvbGwgLyogbnMgKi8sIGtPcHVzU2Vla1ByZVJvbGxVcyAqIDEwMDAgLyogPSA4MCBtcyovKTsKLSAgICBtTWV0YS5zZXRJbnQ2NChrS2V5T3B1c0NvZGVjRGVsYXkgLyogbnMgKi8sCi0gICAgICAgICAgICBtQ29kZWNEZWxheSAvKiBzYW1wbGUvcyAqLyAqIDEwMDAwMDAwMDBsbCAvIGtPcHVzU2FtcGxlUmF0ZSk7CisgICAgLy8ga0tleU9wdXNIZWFkZXIgaXMgY3NkLTAKKyAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1NZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NTRF8wLCBkYXRhLCBzaXplKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1JBVEUsIGtPcHVzU2FtcGxlUmF0ZSk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1NZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfQ09VTlQsIG1DaGFubmVsQ291bnQpOworICAgIGludDY0X3QgY29kZWNkZWxheSA9IG1Db2RlY0RlbGF5IC8qIHNhbXBsZS9zICovICogMTAwMDAwMDAwMGxsIC8ga09wdXNTYW1wbGVSYXRlOworICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzEsICZjb2RlY2RlbGF5LCBzaXplb2YoY29kZWNkZWxheSkpOworICAgIGludDY0X3QgcHJlcm9sbCA9IGtPcHVzU2Vla1ByZVJvbGxVcyAqIDEwMDAgLyogPSA4MCBtcyovOworICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzIsICZwcmVyb2xsLCBzaXplb2YocHJlcm9sbCkpOwogCi0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKLXN0YXR1c190IE15T3B1c0V4dHJhY3Rvcjo6dmVyaWZ5T3B1c0NvbW1lbnRzKE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyKSB7CittZWRpYV9zdGF0dXNfdCBNeU9wdXNFeHRyYWN0b3I6OnZlcmlmeU9wdXNDb21tZW50cyhNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcikgewogICAgIC8vIGFkZCBhcnRpZmljaWFsIGZyYW1pbmcgYml0IHNvIHdlIGNhbiByZXVzZSBfdm9yYmlzX3VucGFja19jb21tZW50CiAgICAgaW50MzJfdCBjb21tZW50U2l6ZSA9IGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgKyAxOwogICAgIGF1dG8gdG1wID0gaGVhcGJ1ZmZlcjx1aW50OF90Pihjb21tZW50U2l6ZSk7CiAgICAgdWludDhfdCAqY29tbWVudERhdGEgPSB0bXAuZ2V0KCk7CiAgICAgaWYgKGNvbW1lbnREYXRhID09IG51bGxwdHIpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CiAgICAgfQogCiAgICAgbWVtY3B5KGNvbW1lbnREYXRhLApAQCAtMTAyNiwxNCArMTAzMCwxNCBAQAogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaGVhZGVyTGVuOyArK2kpIHsKICAgICAgICAgY2hhciBjaHIgPSBvZ2dwYWNrX3JlYWQoJmJpdHMsIDgpOwogICAgICAgICBpZiAoY2hyICE9IE9wdXNUYWdzW2ldKSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgIH0KICAgICB9CiAKICAgICBpbnQzMl90IHZlbmRvckxlbiA9IG9nZ3BhY2tfcmVhZCgmYml0cywgMzIpOwogICAgIGZyYW1pbmdCaXRPZmZzZXQgKz0gNDsKICAgICBpZiAodmVuZG9yTGVuIDwgMCB8fCB2ZW5kb3JMZW4gPiBjb21tZW50U2l6ZSAtIDgpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CiAgICAgfQogICAgIC8vIHNraXAgdmVuZG9yIHN0cmluZwogICAgIGZyYW1pbmdCaXRPZmZzZXQgKz0gdmVuZG9yTGVuOwpAQCAtMTA0NCwxMyArMTA0OCwxMyBAQAogICAgIGludDMyX3QgbiA9IG9nZ3BhY2tfcmVhZCgmYml0cywgMzIpOwogICAgIGZyYW1pbmdCaXRPZmZzZXQgKz0gNDsKICAgICBpZiAobiA8IDAgfHwgbiA+ICgoY29tbWVudFNpemUgLSBvZ2dwYWNrX2J5dGVzKCZiaXRzKSkgPj4gMikpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CiAgICAgfQogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgICAgIGludDMyX3QgbGVuID0gb2dncGFja19yZWFkKCZiaXRzLCAzMik7CiAgICAgICAgIGZyYW1pbmdCaXRPZmZzZXQgKz0gNDsKICAgICAgICAgaWYgKGxlbiAgPCAwIHx8IGxlbiAgPiAoY29tbWVudFNpemUgLSBvZ2dwYWNrX2J5dGVzKCZiaXRzKSkpIHsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKICAgICAgICAgfQogICAgICAgICBmcmFtaW5nQml0T2Zmc2V0ICs9IGxlbjsKICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBsZW47ICsraikgewpAQCAtMTA1OCw3ICsxMDYyLDcgQEAKICAgICAgICAgfQogICAgIH0KICAgICBpZiAoZnJhbWluZ0JpdE9mZnNldCA8IDAgfHwgZnJhbWluZ0JpdE9mZnNldCA+PSBjb21tZW50U2l6ZSkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKICAgICB9CiAgICAgY29tbWVudERhdGFbZnJhbWluZ0JpdE9mZnNldF0gPSAxOwogCkBAIC0xMDc1LDE0ICsxMDc5LDE0IEBACiAgICAgb2dncGFja19yZWFkaW5pdCgmYml0cywgJnJlZik7CiAgICAgaW50IGVyciA9IF92b3JiaXNfdW5wYWNrX2NvbW1lbnQoJm1WYywgJmJpdHMpOwogICAgIGlmICgwICE9IGVycikgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKICAgICB9CiAKICAgICBwYXJzZUZpbGVNZXRhRGF0YSgpOwotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCi1zdGF0dXNfdCBNeVZvcmJpc0V4dHJhY3Rvcjo6dmVyaWZ5SGVhZGVyKAorbWVkaWFfc3RhdHVzX3QgTXlWb3JiaXNFeHRyYWN0b3I6OnZlcmlmeUhlYWRlcigKICAgICAgICAgTWVkaWFCdWZmZXJCYXNlICpidWZmZXIsIHVpbnQ4X3QgdHlwZSkgewogICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPQogICAgICAgICAoY29uc3QgdWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpICsgYnVmZmVyLT5yYW5nZV9vZmZzZXQoKTsKQEAgLTEwOTAsNyArMTA5NCw3IEBACiAgICAgc2l6ZV90IHNpemUgPSBidWZmZXItPnJhbmdlX2xlbmd0aCgpOwogCiAgICAgaWYgKHNpemUgPCA3IHx8IGRhdGFbMF0gIT0gdHlwZSB8fCBtZW1jbXAoJmRhdGFbMV0sICJ2b3JiaXMiLCA2KSkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKICAgICB9CiAKICAgICBvZ2dfYnVmZmVyIGJ1ZjsKQEAgLTExMDksNyArMTExMyw3IEBACiAgICAgb2dncGFja19yZWFkaW5pdCgmYml0cywgJnJlZik7CiAKICAgICBpZiAob2dncGFja19yZWFkKCZiaXRzLCA4KSAhPSB0eXBlKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOwogICAgIH0KICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IDY7ICsraSkgewogICAgICAgICBvZ2dwYWNrX3JlYWQoJmJpdHMsIDgpOyAgLy8gc2tpcCAndm9yYmlzJwpAQCAtMTExOSwxMyArMTEyMywxMyBAQAogICAgICAgICBjYXNlIDE6CiAgICAgICAgIHsKICAgICAgICAgICAgIGlmICgwICE9IF92b3JiaXNfdW5wYWNrX2luZm8oJm1WaSwgJmJpdHMpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgbU1ldGEuc2V0RGF0YShrS2V5Vm9yYmlzSW5mbywgMCwgZGF0YSwgc2l6ZSk7Ci0gICAgICAgICAgICBtTWV0YS5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgbVZpLnJhdGUpOwotICAgICAgICAgICAgbU1ldGEuc2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgbVZpLmNoYW5uZWxzKTsKLSAgICAgICAgICAgIG1NZXRhLnNldEludDMyKGtLZXlCaXRSYXRlLCBtVmkuYml0cmF0ZV9ub21pbmFsKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzAsIGRhdGEsIHNpemUpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1NZXRhLCBBTUVESUFGT1JNQVRfS0VZX1NBTVBMRV9SQVRFLCBtVmkucmF0ZSk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9DT1VOVCwgbVZpLmNoYW5uZWxzKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTWV0YSwgQU1FRElBRk9STUFUX0tFWV9CSVRfUkFURSwgbVZpLmJpdHJhdGVfbm9taW5hbCk7CiAKICAgICAgICAgICAgIEFMT0dWKCJsb3dlci1iaXRyYXRlID0gJWxkIiwgbVZpLmJpdHJhdGVfbG93ZXIpOwogICAgICAgICAgICAgQUxPR1YoInVwcGVyLWJpdHJhdGUgPSAlbGQiLCBtVmkuYml0cmF0ZV91cHBlcik7CkBAIC0xMTQwLDcgKzExNDQsNyBAQAogICAgICAgICAgICAgaWYgKG1Tb3VyY2UtPmdldFNpemUoJnNpemUpID09IE9LKSB7CiAgICAgICAgICAgICAgICAgdWludDY0X3QgYnBzID0gYXBwcm94Qml0cmF0ZSgpOwogICAgICAgICAgICAgICAgIGlmIChicHMgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBtTWV0YS5zZXRJbnQ2NChrS2V5RHVyYXRpb24sIHNpemUgKiA4MDAwMDAwbGwgLyBicHMpOworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04sIHNpemUgKiA4MDAwMDAwbGwgLyBicHMpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTE0OSw3ICsxMTUzLDcgQEAKICAgICAgICAgY2FzZSAzOgogICAgICAgICB7CiAgICAgICAgICAgICBpZiAoMCAhPSBfdm9yYmlzX3VucGFja19jb21tZW50KCZtVmMsICZiaXRzKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHBhcnNlRmlsZU1ldGFEYXRhKCk7CkBAIC0xMTU5LDE1ICsxMTYzLDE1IEBACiAgICAgICAgIGNhc2UgNToKICAgICAgICAgewogICAgICAgICAgICAgaWYgKDAgIT0gX3ZvcmJpc191bnBhY2tfYm9va3MoJm1WaSwgJmJpdHMpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgbU1ldGEuc2V0RGF0YShrS2V5Vm9yYmlzQm9va3MsIDAsIGRhdGEsIHNpemUpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtTWV0YSwgQU1FRElBRk9STUFUX0tFWV9DU0RfMSwgZGF0YSwgc2l6ZSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KIAotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCiB1aW50NjRfdCBNeVZvcmJpc0V4dHJhY3Rvcjo6YXBwcm94Qml0cmF0ZSgpIGNvbnN0IHsKQEAgLTExODAsMTIgKzExODQsMTIgQEAKIAogCiB2b2lkIE15T2dnRXh0cmFjdG9yOjpwYXJzZUZpbGVNZXRhRGF0YSgpIHsKLSAgICBtRmlsZU1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9PR0cpOworICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUZpbGVNZXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9PR0cpOwogCiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtVmMuY29tbWVudHM7ICsraSkgewogICAgICAgICBjb25zdCBjaGFyICpjb21tZW50ID0gbVZjLnVzZXJfY29tbWVudHNbaV07CiAgICAgICAgIHNpemVfdCBjb21tZW50TGVuZ3RoID0gbVZjLmNvbW1lbnRfbGVuZ3Roc1tpXTsKLSAgICAgICAgcGFyc2VWb3JiaXNDb21tZW50KCZtRmlsZU1ldGEsIGNvbW1lbnQsIGNvbW1lbnRMZW5ndGgpOworICAgICAgICBwYXJzZVZvcmJpc0NvbW1lbnQobUZpbGVNZXRhLCBjb21tZW50LCBjb21tZW50TGVuZ3RoKTsKICAgICAgICAgLy9BTE9HSSgiY29tbWVudCAjJWQ6ICclcyciLCBpICsgMSwgbVZjLnVzZXJfY29tbWVudHNbaV0pOwogICAgIH0KIH0KQEAgLTExOTMsNyArMTE5Nyw3IEBACiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKLU9nZ0V4dHJhY3Rvcjo6T2dnRXh0cmFjdG9yKERhdGFTb3VyY2VCYXNlICpzb3VyY2UpCitPZ2dFeHRyYWN0b3I6Ok9nZ0V4dHJhY3RvcihEYXRhU291cmNlSGVscGVyICpzb3VyY2UpCiAgICAgOiBtRGF0YVNvdXJjZShzb3VyY2UpLAogICAgICAgbUluaXRDaGVjayhOT19JTklUKSwKICAgICAgIG1JbXBsKE5VTEwpIHsKQEAgLTEyMjAsMTMgKzEyMjQsMTQgQEAKIE9nZ0V4dHJhY3Rvcjo6fk9nZ0V4dHJhY3RvcigpIHsKICAgICBkZWxldGUgbUltcGw7CiAgICAgbUltcGwgPSBOVUxMOworICAgIGRlbGV0ZSBtRGF0YVNvdXJjZTsKIH0KIAogc2l6ZV90IE9nZ0V4dHJhY3Rvcjo6Y291bnRUcmFja3MoKSB7CiAgICAgcmV0dXJuIG1Jbml0Q2hlY2sgIT0gT0sgPyAwIDogMTsKIH0KIAotTWVkaWFUcmFjayAqT2dnRXh0cmFjdG9yOjpnZXRUcmFjayhzaXplX3QgaW5kZXgpIHsKK01lZGlhVHJhY2tIZWxwZXJWMiAqT2dnRXh0cmFjdG9yOjpnZXRUcmFjayhzaXplX3QgaW5kZXgpIHsKICAgICBpZiAoaW5kZXggPj0gMSkgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CkBAIC0xMjM0LDMzICsxMjM5LDM0IEBACiAgICAgcmV0dXJuIG5ldyBPZ2dTb3VyY2UodGhpcyk7CiB9CiAKLXN0YXR1c190IE9nZ0V4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YSgKLSAgICAgICAgTWV0YURhdGFCYXNlICZtZXRhLAorbWVkaWFfc3RhdHVzX3QgT2dnRXh0cmFjdG9yOjpnZXRUcmFja01ldGFEYXRhKAorICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGEsCiAgICAgICAgIHNpemVfdCBpbmRleCwgdWludDMyX3QgLyogZmxhZ3MgKi8pIHsKICAgICBpZiAoaW5kZXggPj0gMSkgewotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogICAgIH0KIAogICAgIHJldHVybiBtSW1wbC0+Z2V0Rm9ybWF0KG1ldGEpOwogfQogCi1zdGF0dXNfdCBPZ2dFeHRyYWN0b3I6OmdldE1ldGFEYXRhKE1ldGFEYXRhQmFzZSAmbWV0YSkgeworbWVkaWFfc3RhdHVzX3QgT2dnRXh0cmFjdG9yOjpnZXRNZXRhRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEpIHsKICAgICByZXR1cm4gbUltcGwtPmdldEZpbGVNZXRhRGF0YShtZXRhKTsKIH0KIAotc3RhdGljIE1lZGlhRXh0cmFjdG9yKiBDcmVhdGVFeHRyYWN0b3IoCi0gICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsCitzdGF0aWMgQ01lZGlhRXh0cmFjdG9yVjIqIENyZWF0ZUV4dHJhY3RvcigKKyAgICAgICAgQ0RhdGFTb3VyY2UgKnNvdXJjZSwKICAgICAgICAgdm9pZCAqKSB7Ci0gICAgcmV0dXJuIG5ldyBPZ2dFeHRyYWN0b3Ioc291cmNlKTsKKyAgICByZXR1cm4gd3JhcFYyKG5ldyBPZ2dFeHRyYWN0b3IobmV3IERhdGFTb3VyY2VIZWxwZXIoc291cmNlKSkpOwogfQogCi1zdGF0aWMgTWVkaWFFeHRyYWN0b3I6OkNyZWF0b3JGdW5jIFNuaWZmKAotICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLAorc3RhdGljIENyZWF0b3JGdW5jVjIgU25pZmYoCisgICAgICAgIENEYXRhU291cmNlICpzb3VyY2UsCiAgICAgICAgIGZsb2F0ICpjb25maWRlbmNlLAogICAgICAgICB2b2lkICoqLAotICAgICAgICBNZWRpYUV4dHJhY3Rvcjo6RnJlZU1ldGFGdW5jICopIHsKKyAgICAgICAgRnJlZU1ldGFGdW5jICopIHsKKyAgICBEYXRhU291cmNlSGVscGVyIGhlbHBlcihzb3VyY2UpOwogICAgIGNoYXIgdG1wWzRdOwotICAgIGlmIChzb3VyY2UtPnJlYWRBdCgwLCB0bXAsIDQpIDwgNCB8fCBtZW1jbXAodG1wLCAiT2dnUyIsIDQpKSB7CisgICAgaWYgKGhlbHBlci5yZWFkQXQoMCwgdG1wLCA0KSA8IDQgfHwgbWVtY21wKHRtcCwgIk9nZ1MiLCA0KSkgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKQEAgLTEyNzIsMTMgKzEyNzgsMTMgQEAKIGV4dGVybiAiQyIgewogLy8gVGhpcyBpcyB0aGUgb25seSBzeW1ib2wgdGhhdCBuZWVkcyB0byBiZSBleHBvcnRlZAogX19hdHRyaWJ1dGVfXyAoKHZpc2liaWxpdHkgKCJkZWZhdWx0IikpKQotTWVkaWFFeHRyYWN0b3I6OkV4dHJhY3RvckRlZiBHRVRFWFRSQUNUT1JERUYoKSB7CitFeHRyYWN0b3JEZWYgR0VURVhUUkFDVE9SREVGKCkgewogICAgIHJldHVybiB7Ci0gICAgICAgIE1lZGlhRXh0cmFjdG9yOjpFWFRSQUNUT1JERUZfVkVSU0lPTiwKKyAgICAgICAgRVhUUkFDVE9SREVGX1ZFUlNJT05fQ1VSUkVOVCwKICAgICAgICAgVVVJRCgiOGNjNWNkMDYtZjc3Mi00OTVlLThhNjItY2JhOTY0OTM3NGU5IiksCiAgICAgICAgIDEsIC8vIHZlcnNpb24KICAgICAgICAgIk9nZyBFeHRyYWN0b3IiLAotICAgICAgICBTbmlmZgorICAgICAgICB7IC52MiA9IFNuaWZmIH0KICAgICB9OwogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL29nZy9PZ2dFeHRyYWN0b3IuaCBiL21lZGlhL2V4dHJhY3RvcnMvb2dnL09nZ0V4dHJhY3Rvci5oCmluZGV4IDlmZTI5NDQuLmNkNjc0ZjMgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvb2dnL09nZ0V4dHJhY3Rvci5oCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvb2dnL09nZ0V4dHJhY3Rvci5oCkBAIC0xOSwyNSArMTksMjYgQEAKICNkZWZpbmUgT0dHX0VYVFJBQ1RPUl9IXwogCiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3IuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkFwaS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFGb3JtYXQuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdHJ1Y3QgQU1lc3NhZ2U7Ci1jbGFzcyBEYXRhU291cmNlQmFzZTsKIGNsYXNzIFN0cmluZzg7CiAKIHN0cnVjdCBNeU9nZ0V4dHJhY3RvcjsKIHN0cnVjdCBPZ2dTb3VyY2U7CiAKLXN0cnVjdCBPZ2dFeHRyYWN0b3IgOiBwdWJsaWMgTWVkaWFFeHRyYWN0b3IgewotICAgIGV4cGxpY2l0IE9nZ0V4dHJhY3RvcihEYXRhU291cmNlQmFzZSAqc291cmNlKTsKK3N0cnVjdCBPZ2dFeHRyYWN0b3IgOiBwdWJsaWMgTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXJWMiB7CisgICAgZXhwbGljaXQgT2dnRXh0cmFjdG9yKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSk7CiAKICAgICB2aXJ0dWFsIHNpemVfdCBjb3VudFRyYWNrcygpOwotICAgIHZpcnR1YWwgTWVkaWFUcmFjayAqZ2V0VHJhY2soc2l6ZV90IGluZGV4KTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFRyYWNrTWV0YURhdGEoTWV0YURhdGFCYXNlJiBtZXRhLCBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKTsKKyAgICB2aXJ0dWFsIE1lZGlhVHJhY2tIZWxwZXJWMiAqZ2V0VHJhY2soc2l6ZV90IGluZGV4KTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IGdldFRyYWNrTWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhLCBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWV0YURhdGEoTWV0YURhdGFCYXNlJiBtZXRhKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IGdldE1ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSk7CiAgICAgdmlydHVhbCBjb25zdCBjaGFyICogbmFtZSgpIHsgcmV0dXJuICJPZ2dFeHRyYWN0b3IiOyB9CiAKIHByb3RlY3RlZDoKQEAgLTQ2LDcgKzQ3LDcgQEAKIHByaXZhdGU6CiAgICAgZnJpZW5kIHN0cnVjdCBPZ2dTb3VyY2U7CiAKLSAgICBEYXRhU291cmNlQmFzZSAqbURhdGFTb3VyY2U7CisgICAgRGF0YVNvdXJjZUhlbHBlciAqbURhdGFTb3VyY2U7CiAgICAgc3RhdHVzX3QgbUluaXRDaGVjazsKIAogICAgIE15T2dnRXh0cmFjdG9yICptSW1wbDsKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvd2F2L0FuZHJvaWQuYnAgYi9tZWRpYS9leHRyYWN0b3JzL3dhdi9BbmRyb2lkLmJwCmluZGV4IDA2NzkzM2UuLjE4NWJiMzIgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvd2F2L0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy93YXYvQW5kcm9pZC5icApAQCAtNywxMSArNywxNCBAQAogICAgIF0sCiAKICAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYmluZGVyX25kayIsCiAgICAgICAgICJsaWJsb2ciLAogICAgICAgICAibGlibWVkaWFleHRyYWN0b3IiLAorICAgICAgICAibGlibWVkaWFuZGsiLAogICAgIF0sCiAKICAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGliYXVkaW91dGlscyIsCiAgICAgICAgICJsaWJmaWZvIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAogICAgIF0sCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL3dhdi9XQVZFeHRyYWN0b3IuY3BwIGIvbWVkaWEvZXh0cmFjdG9ycy93YXYvV0FWRXh0cmFjdG9yLmNwcAppbmRleCBmZTUwOWJmLi44NjUwMGVmIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL3dhdi9XQVZFeHRyYWN0b3IuY3BwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvd2F2L1dBVkV4dHJhY3Rvci5jcHAKQEAgLTIwLDIxICsyMCwzNCBAQAogCiAjaW5jbHVkZSAiV0FWRXh0cmFjdG9yLmgiCiAKKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9pYmluZGVyLmg+IC8vIGZvciBBSUJpbmRlcl9nZXRDYWxsaW5nVWlkCiAjaW5jbHVkZSA8YXVkaW9fdXRpbHMvcHJpbWl0aXZlcy5oPgogI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2VCYXNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFUcmFjay5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKyNpbmNsdWRlIDxwcml2YXRlL2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcuaD4gLy8gZm9yIEFJRF9NRURJQQorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KICNpbmNsdWRlIDxjdXRpbHMvYml0b3BzLmg+CiAKICNkZWZpbmUgQ0hBTk5FTF9NQVNLX1VTRV9DSEFOTkVMX09SREVSIDAKIAorLy8gTk9URTogVGhpcyBjb2RlIGFzc3VtZXMgdGhlIGRldmljZSBwcm9jZXNzb3IgaXMgbGl0dGxlIGVuZGlhbi4KKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCisvLyBNZWRpYVNlcnZlciBpcyBjYXBhYmxlIG9mIGhhbmRsaW5nIGZsb2F0IGV4dHJhY3RvciBvdXRwdXQsIGJ1dCBnZW5lcmFsIHByb2Nlc3NlcworLy8gbWF5IG5vdCBiZSBhYmxlIHRvIGRvIHNvLgorLy8gVE9ETzogSW1wcm92ZSBBUEkgdG8gc2V0IGV4dHJhY3RvciBmbG9hdCBvdXRwdXQuCisvLyAoTm90ZTogZHVwbGljYXRlZCB3aXRoIEZMQUNFeHRyYWN0b3IuY3BwKQorc3RhdGljIGlubGluZSBib29sIHNob3VsZEV4dHJhY3Rvck91dHB1dEZsb2F0KGludCBiaXRzUGVyU2FtcGxlKQoreworICAgIHJldHVybiBiaXRzUGVyU2FtcGxlID4gMTYgJiYgQUlCaW5kZXJfZ2V0Q2FsbGluZ1VpZCgpID09IEFJRF9NRURJQTsKK30KKwogZW51bSB7CiAgICAgV0FWRV9GT1JNQVRfUENNICAgICAgICA9IDB4MDAwMSwKICAgICBXQVZFX0ZPUk1BVF9JRUVFX0ZMT0FUID0gMHgwMDAzLApAQCAtNTUsMTkgKzY4LDE5IEBACiAgICAgcmV0dXJuIHB0clsxXSA8PCA4IHwgcHRyWzBdOwogfQogCi1zdHJ1Y3QgV0FWU291cmNlIDogcHVibGljIE1lZGlhVHJhY2sgeworc3RydWN0IFdBVlNvdXJjZSA6IHB1YmxpYyBNZWRpYVRyYWNrSGVscGVyVjIgewogICAgIFdBVlNvdXJjZSgKLSAgICAgICAgICAgIERhdGFTb3VyY2VCYXNlICpkYXRhU291cmNlLAotICAgICAgICAgICAgTWV0YURhdGFCYXNlICZtZXRhLAorICAgICAgICAgICAgRGF0YVNvdXJjZUhlbHBlciAqZGF0YVNvdXJjZSwKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YSwKICAgICAgICAgICAgIHVpbnQxNl90IHdhdmVGb3JtYXQsCi0gICAgICAgICAgICBpbnQzMl90IGJpdHNQZXJTYW1wbGUsCisgICAgICAgICAgICBib29sIG91dHB1dEZsb2F0LAogICAgICAgICAgICAgb2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGFCYXNlICpwYXJhbXMgPSBOVUxMKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZvcm1hdChNZXRhRGF0YUJhc2UgJm1ldGEpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3Qgc3RhcnQoKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHN0b3AoKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IGdldEZvcm1hdChBTWVkaWFGb3JtYXQgKm1ldGEpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKAorICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgcmVhZCgKICAgICAgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKIAogICAgIHZpcnR1YWwgYm9vbCBzdXBwb3J0Tm9uYmxvY2tpbmdSZWFkKCkgeyByZXR1cm4gdHJ1ZTsgfQpAQCAtNzgsOSArOTEsMTAgQEAKIHByaXZhdGU6CiAgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrTWF4RnJhbWVTaXplOwogCi0gICAgRGF0YVNvdXJjZUJhc2UgKm1EYXRhU291cmNlOwotICAgIE1ldGFEYXRhQmFzZSAmbU1ldGE7CisgICAgRGF0YVNvdXJjZUhlbHBlciAqbURhdGFTb3VyY2U7CisgICAgQU1lZGlhRm9ybWF0ICptTWV0YTsKICAgICB1aW50MTZfdCBtV2F2ZUZvcm1hdDsKKyAgICBjb25zdCBib29sIG1PdXRwdXRGbG9hdDsKICAgICBpbnQzMl90IG1TYW1wbGVSYXRlOwogICAgIGludDMyX3QgbU51bUNoYW5uZWxzOwogICAgIGludDMyX3QgbUJpdHNQZXJTYW1wbGU7CkBAIC05NCw0OCArMTA4LDU2IEBACiAgICAgV0FWU291cmNlICZvcGVyYXRvcj0oY29uc3QgV0FWU291cmNlICYpOwogfTsKIAotV0FWRXh0cmFjdG9yOjpXQVZFeHRyYWN0b3IoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSkKK1dBVkV4dHJhY3Rvcjo6V0FWRXh0cmFjdG9yKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSkKICAgICA6IG1EYXRhU291cmNlKHNvdXJjZSksCiAgICAgICBtVmFsaWRGb3JtYXQoZmFsc2UpLAogICAgICAgbUNoYW5uZWxNYXNrKENIQU5ORUxfTUFTS19VU0VfQ0hBTk5FTF9PUkRFUikgeworICAgIG1UcmFja01ldGEgPSBBTWVkaWFGb3JtYXRfbmV3KCk7CiAgICAgbUluaXRDaGVjayA9IGluaXQoKTsKIH0KIAogV0FWRXh0cmFjdG9yOjp+V0FWRXh0cmFjdG9yKCkgeworICAgIGRlbGV0ZSBtRGF0YVNvdXJjZTsKKyAgICBBTWVkaWFGb3JtYXRfZGVsZXRlKG1UcmFja01ldGEpOwogfQogCi1zdGF0dXNfdCBXQVZFeHRyYWN0b3I6OmdldE1ldGFEYXRhKE1ldGFEYXRhQmFzZSAmbWV0YSkgewotICAgIG1ldGEuY2xlYXIoKTsKK21lZGlhX3N0YXR1c190IFdBVkV4dHJhY3Rvcjo6Z2V0TWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhKSB7CisgICAgQU1lZGlhRm9ybWF0X2NsZWFyKG1ldGEpOwogICAgIGlmIChtSW5pdENoZWNrID09IE9LKSB7Ci0gICAgICAgIG1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9XQVYpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX1dBVik7CiAgICAgfQogCi0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKIHNpemVfdCBXQVZFeHRyYWN0b3I6OmNvdW50VHJhY2tzKCkgewogICAgIHJldHVybiBtSW5pdENoZWNrID09IE9LID8gMSA6IDA7CiB9CiAKLU1lZGlhVHJhY2sgKldBVkV4dHJhY3Rvcjo6Z2V0VHJhY2soc2l6ZV90IGluZGV4KSB7CitNZWRpYVRyYWNrSGVscGVyVjIgKldBVkV4dHJhY3Rvcjo6Z2V0VHJhY2soc2l6ZV90IGluZGV4KSB7CiAgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0sgfHwgaW5kZXggPiAwKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAogICAgIHJldHVybiBuZXcgV0FWU291cmNlKAogICAgICAgICAgICAgbURhdGFTb3VyY2UsIG1UcmFja01ldGEsCi0gICAgICAgICAgICBtV2F2ZUZvcm1hdCwgbUJpdHNQZXJTYW1wbGUsIG1EYXRhT2Zmc2V0LCBtRGF0YVNpemUpOworICAgICAgICAgICAgbVdhdmVGb3JtYXQsIHNob3VsZEV4dHJhY3Rvck91dHB1dEZsb2F0KG1CaXRzUGVyU2FtcGxlKSwgbURhdGFPZmZzZXQsIG1EYXRhU2l6ZSk7CiB9CiAKLXN0YXR1c190IFdBVkV4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YSgKLSAgICAgICAgTWV0YURhdGFCYXNlICZtZXRhLAorbWVkaWFfc3RhdHVzX3QgV0FWRXh0cmFjdG9yOjpnZXRUcmFja01ldGFEYXRhKAorICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGEsCiAgICAgICAgIHNpemVfdCBpbmRleCwgdWludDMyX3QgLyogZmxhZ3MgKi8pIHsKICAgICBpZiAobUluaXRDaGVjayAhPSBPSyB8fCBpbmRleCA+IDApIHsKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICB9CiAKLSAgICBtZXRhID0gbVRyYWNrTWV0YTsKLSAgICByZXR1cm4gT0s7CisgICAgY29uc3QgbWVkaWFfc3RhdHVzX3Qgc3RhdHVzID0gQU1lZGlhRm9ybWF0X2NvcHkobWV0YSwgbVRyYWNrTWV0YSk7CisgICAgaWYgKHN0YXR1cyA9PSBPSykgeworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9QQ01fRU5DT0RJTkcsCisgICAgICAgICAgICAgICAgc2hvdWxkRXh0cmFjdG9yT3V0cHV0RmxvYXQobUJpdHNQZXJTYW1wbGUpCisgICAgICAgICAgICAgICAgICAgICAgICA/IGtBdWRpb0VuY29kaW5nUGNtRmxvYXQgOiBrQXVkaW9FbmNvZGluZ1BjbTE2Yml0KTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKIH0KIAogc3RhdHVzX3QgV0FWRXh0cmFjdG9yOjppbml0KCkgewpAQCAtMTg1LDcgKzIwNyw3IEBACiAgICAgICAgICAgICAgICAgICAgICYmIG1XYXZlRm9ybWF0ICE9IFdBVkVfRk9STUFUX01VTEFXCiAgICAgICAgICAgICAgICAgICAgICYmIG1XYXZlRm9ybWF0ICE9IFdBVkVfRk9STUFUX01TR1NNCiAgICAgICAgICAgICAgICAgICAgICYmIG1XYXZlRm9ybWF0ICE9IFdBVkVfRk9STUFUX0VYVEVOU0lCTEUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTlNVUFBPUlRFRDsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgdWludDhfdCBmbXRTaXplID0gMTY7CkBAIC0xOTgsMTMgKzIyMCwxMyBAQAogCiAgICAgICAgICAgICBtTnVtQ2hhbm5lbHMgPSBVMTZfTEVfQVQoJmZvcm1hdFNwZWNbMl0pOwogCi0gICAgICAgICAgICBpZiAobU51bUNoYW5uZWxzIDwgMSB8fCBtTnVtQ2hhbm5lbHMgPiA4KSB7CisgICAgICAgICAgICBpZiAobU51bUNoYW5uZWxzIDwgMSB8fCBtTnVtQ2hhbm5lbHMgPiBGQ0NfOCkgewogICAgICAgICAgICAgICAgIEFMT0dFKCJVbnN1cHBvcnRlZCBudW1iZXIgb2YgY2hhbm5lbHMgKCVkKSIsIG1OdW1DaGFubmVscyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5TVVBQT1JURUQ7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChtV2F2ZUZvcm1hdCAhPSBXQVZFX0ZPUk1BVF9FWFRFTlNJQkxFKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1OdW1DaGFubmVscyAhPSAxICYmIG1OdW1DaGFubmVscyAhPSAyKSB7CisgICAgICAgICAgICAgICAgaWYgKG1OdW1DaGFubmVscyAhPSAxICYmIG1OdW1DaGFubmVscyAhPSBGQ0NfMikgewogICAgICAgICAgICAgICAgICAgICBBTE9HVygiTW9yZSB0aGFuIDIgY2hhbm5lbHMgKCVkKSBpbiBub24tV0FWRV9FWFQsIHVua25vd24gY2hhbm5lbCBtYXNrIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTnVtQ2hhbm5lbHMpOwogICAgICAgICAgICAgICAgIH0KQEAgLTIyNCw3ICsyNDYsNyBAQAogICAgICAgICAgICAgICAgICAgICBpZiAodmFsaWRCaXRzUGVyU2FtcGxlICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJ2YWxpZEJpdHMoJWQpICE9IGJpdHNQZXJTYW1wbGUoJWQpIGFyZSBub3Qgc3VwcG9ydGVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRCaXRzUGVyU2FtcGxlLCBtQml0c1BlclNhbXBsZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOU1VQUE9SVEVEOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2Ugb25seSBzdXBwb3J0IHZhbGl0Qml0c1BlclNhbXBsZSA9PSBiaXRzUGVyU2FtcGxlIGJ1dCBzb21lIFdBVl9FWFQKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlcnMgZG9uJ3QgY29ycmVjdGx5IHNldCB0aGUgdmFsaWQgYml0cyB2YWx1ZSwgYW5kIGxlYXZlIGl0IGF0IDAuCkBAIC0yODQsMzUgKzMwNiwzMyBAQAogICAgICAgICAgICAgICAgIG1EYXRhT2Zmc2V0ID0gb2Zmc2V0OwogICAgICAgICAgICAgICAgIG1EYXRhU2l6ZSA9IGNodW5rU2l6ZTsKIAotICAgICAgICAgICAgICAgIG1UcmFja01ldGEuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfY2xlYXIobVRyYWNrTWV0YSk7CiAKICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1XYXZlRm9ybWF0KSB7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgV0FWRV9GT1JNQVRfUENNOgogICAgICAgICAgICAgICAgICAgICBjYXNlIFdBVkVfRk9STUFUX0lFRUVfRkxPQVQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBtVHJhY2tNZXRhLnNldENTdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobVRyYWNrTWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9BVURJT19SQVcpOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgV0FWRV9GT1JNQVRfQUxBVzoKLSAgICAgICAgICAgICAgICAgICAgICAgIG1UcmFja01ldGEuc2V0Q1N0cmluZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19HNzExX0FMQVcpOworICAgICAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtVHJhY2tNZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX0FVRElPX0c3MTFfQUxBVyk7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgY2FzZSBXQVZFX0ZPUk1BVF9NU0dTTToKLSAgICAgICAgICAgICAgICAgICAgICAgIG1UcmFja01ldGEuc2V0Q1N0cmluZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19NU0dTTSk7CisgICAgICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1UcmFja01ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfQVVESU9fTVNHU00pOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICBDSEVDS19FUShtV2F2ZUZvcm1hdCwgKHVpbnQxNl90KVdBVkVfRk9STUFUX01VTEFXKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1UcmFja01ldGEuc2V0Q1N0cmluZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19HNzExX01MQVcpOworICAgICAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtVHJhY2tNZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX0FVRElPX0c3MTFfTUxBVyk7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBtVHJhY2tNZXRhLnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsIG1OdW1DaGFubmVscyk7Ci0gICAgICAgICAgICAgICAgbVRyYWNrTWV0YS5zZXRJbnQzMihrS2V5Q2hhbm5lbE1hc2ssIG1DaGFubmVsTWFzayk7Ci0gICAgICAgICAgICAgICAgbVRyYWNrTWV0YS5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgbVNhbXBsZVJhdGUpOwotICAgICAgICAgICAgICAgIG1UcmFja01ldGEuc2V0SW50MzIoa0tleUJpdHNQZXJTYW1wbGUsIG1CaXRzUGVyU2FtcGxlKTsKLSAgICAgICAgICAgICAgICBtVHJhY2tNZXRhLnNldEludDMyKGtLZXlQY21FbmNvZGluZywga0F1ZGlvRW5jb2RpbmdQY20xNmJpdCk7Ci0KKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobVRyYWNrTWV0YSwgQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX0NPVU5ULCBtTnVtQ2hhbm5lbHMpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtVHJhY2tNZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfTUFTSywgbUNoYW5uZWxNYXNrKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobVRyYWNrTWV0YSwgQU1FRElBRk9STUFUX0tFWV9TQU1QTEVfUkFURSwgbVNhbXBsZVJhdGUpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtVHJhY2tNZXRhLCBBTUVESUFGT1JNQVRfS0VZX0JJVFNfUEVSX1NBTVBMRSwgbUJpdHNQZXJTYW1wbGUpOwogICAgICAgICAgICAgICAgIGludDY0X3QgZHVyYXRpb25VcyA9IDA7CiAgICAgICAgICAgICAgICAgaWYgKG1XYXZlRm9ybWF0ID09IFdBVkVfRk9STUFUX01TR1NNKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIDY1IGJ5dGVzIGRlY29kZSB0byAzMjAgOGtIeiBzYW1wbGVzCkBAIC0zMjIsMTggKzM0MiwxOCBAQAogICAgICAgICAgICAgICAgICAgICBzaXplX3QgYnl0ZXNQZXJTYW1wbGUgPSBtQml0c1BlclNhbXBsZSA+PiAzOwogCiAgICAgICAgICAgICAgICAgICAgIGlmICghYnl0ZXNQZXJTYW1wbGUgfHwgIW1OdW1DaGFubmVscykKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKIAogICAgICAgICAgICAgICAgICAgICBzaXplX3QgbnVtX3NhbXBsZXMgPSBtRGF0YVNpemUgLyAobU51bUNoYW5uZWxzICogYnl0ZXNQZXJTYW1wbGUpOwogCiAgICAgICAgICAgICAgICAgICAgIGlmICghbVNhbXBsZVJhdGUpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CiAKICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb25VcyA9CiAgICAgICAgICAgICAgICAgICAgICAgICAxMDAwMDAwTEwgKiBudW1fc2FtcGxlcyAvIG1TYW1wbGVSYXRlOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIG1UcmFja01ldGEuc2V0SW50NjQoa0tleUR1cmF0aW9uLCBkdXJhdGlvblVzKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQobVRyYWNrTWV0YSwgQU1FRElBRk9STUFUX0tFWV9EVVJBVElPTiwgZHVyYXRpb25Vcyk7CiAKICAgICAgICAgICAgICAgICByZXR1cm4gT0s7CiAgICAgICAgICAgICB9CkBAIC0zNDgsMjUgKzM2OCwyMiBAQAogY29uc3Qgc2l6ZV90IFdBVlNvdXJjZTo6a01heEZyYW1lU2l6ZSA9IDMyNzY4OwogCiBXQVZTb3VyY2U6OldBVlNvdXJjZSgKLSAgICAgICAgRGF0YVNvdXJjZUJhc2UgKmRhdGFTb3VyY2UsCi0gICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSwKKyAgICAgICAgRGF0YVNvdXJjZUhlbHBlciAqZGF0YVNvdXJjZSwKKyAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhLAogICAgICAgICB1aW50MTZfdCB3YXZlRm9ybWF0LAotICAgICAgICBpbnQzMl90IGJpdHNQZXJTYW1wbGUsCisgICAgICAgIGJvb2wgb3V0cHV0RmxvYXQsCiAgICAgICAgIG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkKICAgICA6IG1EYXRhU291cmNlKGRhdGFTb3VyY2UpLAogICAgICAgbU1ldGEobWV0YSksCiAgICAgICBtV2F2ZUZvcm1hdCh3YXZlRm9ybWF0KSwKLSAgICAgIG1TYW1wbGVSYXRlKDApLAotICAgICAgbU51bUNoYW5uZWxzKDApLAotICAgICAgbUJpdHNQZXJTYW1wbGUoYml0c1BlclNhbXBsZSksCisgICAgICBtT3V0cHV0RmxvYXQob3V0cHV0RmxvYXQpLAogICAgICAgbU9mZnNldChvZmZzZXQpLAogICAgICAgbVNpemUoc2l6ZSksCiAgICAgICBtU3RhcnRlZChmYWxzZSksCiAgICAgICBtR3JvdXAoTlVMTCkgewotICAgIENIRUNLKG1NZXRhLmZpbmRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgJm1TYW1wbGVSYXRlKSk7Ci0gICAgQ0hFQ0sobU1ldGEuZmluZEludDMyKGtLZXlDaGFubmVsQ291bnQsICZtTnVtQ2hhbm5lbHMpKTsKLQotICAgIG1NZXRhLnNldEludDMyKGtLZXlNYXhJbnB1dFNpemUsIGtNYXhGcmFtZVNpemUpOworICAgIENIRUNLKEFNZWRpYUZvcm1hdF9nZXRJbnQzMihtTWV0YSwgQU1FRElBRk9STUFUX0tFWV9TQU1QTEVfUkFURSwgJm1TYW1wbGVSYXRlKSk7CisgICAgQ0hFQ0soQU1lZGlhRm9ybWF0X2dldEludDMyKG1NZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfQ09VTlQsICZtTnVtQ2hhbm5lbHMpKTsKKyAgICBDSEVDSyhBTWVkaWFGb3JtYXRfZ2V0SW50MzIobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQklUU19QRVJfU0FNUExFLCAmbUJpdHNQZXJTYW1wbGUpKTsKIH0KIAogV0FWU291cmNlOjp+V0FWU291cmNlKCkgewpAQCAtMzc1LDcgKzM5Miw3IEBACiAgICAgfQogfQogCi1zdGF0dXNfdCBXQVZTb3VyY2U6OnN0YXJ0KE1ldGFEYXRhQmFzZSAqIC8qIHBhcmFtcyAqLykgeworbWVkaWFfc3RhdHVzX3QgV0FWU291cmNlOjpzdGFydCgpIHsKICAgICBBTE9HVigiV0FWU291cmNlOjpzdGFydCIpOwogCiAgICAgQ0hFQ0soIW1TdGFydGVkKTsKQEAgLTM4MywxOSArNDAwLDE0IEBACiAgICAgLy8gc29tZSBXQVYgZmlsZXMgbWF5IGhhdmUgbGFyZ2UgYXVkaW8gYnVmZmVycyB0aGF0IHVzZSBzaGFyZWQgbWVtb3J5IHRyYW5zZmVyLgogICAgIG1Hcm91cCA9IG5ldyBNZWRpYUJ1ZmZlckdyb3VwKDQgLyogYnVmZmVycyAqLywga01heEZyYW1lU2l6ZSk7CiAKLSAgICBpZiAobUJpdHNQZXJTYW1wbGUgPT0gOCkgewotICAgICAgICAvLyBBcyBhIHRlbXBvcmFyeSBidWZmZXIgZm9yIDgtPjE2IGJpdCBjb252ZXJzaW9uLgotICAgICAgICBtR3JvdXAtPmFkZF9idWZmZXIoTWVkaWFCdWZmZXJCYXNlOjpDcmVhdGUoa01heEZyYW1lU2l6ZSkpOwotICAgIH0KLQogICAgIG1DdXJyZW50UG9zID0gbU9mZnNldDsKIAogICAgIG1TdGFydGVkID0gdHJ1ZTsKIAotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCi1zdGF0dXNfdCBXQVZTb3VyY2U6OnN0b3AoKSB7CittZWRpYV9zdGF0dXNfdCBXQVZTb3VyY2U6OnN0b3AoKSB7CiAgICAgQUxPR1YoIldBVlNvdXJjZTo6c3RvcCIpOwogCiAgICAgQ0hFQ0sobVN0YXJ0ZWQpOwpAQCAtNDA1LDIyICs0MTcsMjcgQEAKIAogICAgIG1TdGFydGVkID0gZmFsc2U7CiAKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAotc3RhdHVzX3QgV0FWU291cmNlOjpnZXRGb3JtYXQoTWV0YURhdGFCYXNlICZtZXRhKSB7CittZWRpYV9zdGF0dXNfdCBXQVZTb3VyY2U6OmdldEZvcm1hdChBTWVkaWFGb3JtYXQgKm1ldGEpIHsKICAgICBBTE9HVigiV0FWU291cmNlOjpnZXRGb3JtYXQiKTsKIAotICAgIG1ldGEgPSBtTWV0YTsKLSAgICByZXR1cm4gT0s7CisgICAgY29uc3QgbWVkaWFfc3RhdHVzX3Qgc3RhdHVzID0gQU1lZGlhRm9ybWF0X2NvcHkobWV0YSwgbU1ldGEpOworICAgIGlmIChzdGF0dXMgPT0gT0spIHsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUFYX0lOUFVUX1NJWkUsIGtNYXhGcmFtZVNpemUpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9QQ01fRU5DT0RJTkcsCisgICAgICAgICAgICAgICAgbU91dHB1dEZsb2F0ID8ga0F1ZGlvRW5jb2RpbmdQY21GbG9hdCA6IGtBdWRpb0VuY29kaW5nUGNtMTZiaXQpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOwogfQogCi1zdGF0dXNfdCBXQVZTb3VyY2U6OnJlYWQoCittZWRpYV9zdGF0dXNfdCBXQVZTb3VyY2U6OnJlYWQoCiAgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKm91dCwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKICAgICAqb3V0ID0gTlVMTDsKIAogICAgIGlmIChvcHRpb25zICE9IG51bGxwdHIgJiYgb3B0aW9ucy0+Z2V0Tm9uQmxvY2tpbmcoKSAmJiAhbUdyb3VwLT5oYXNfYnVmZmVycygpKSB7Ci0gICAgICAgIHJldHVybiBXT1VMRF9CTE9DSzsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9XT1VMRF9CTE9DSzsKICAgICB9CiAKICAgICBpbnQ2NF90IHNlZWtUaW1lVXM7CkBAIC00NDUsMTUgKzQ2MiwxOSBAQAogICAgIE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyOwogICAgIHN0YXR1c190IGVyciA9IG1Hcm91cC0+YWNxdWlyZV9idWZmZXIoJmJ1ZmZlcik7CiAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgfQogCi0gICAgLy8gbWFrZSBzdXJlIHRoYXQgbWF4Qnl0ZXNUb1JlYWQgaXMgbXVsdGlwbGUgb2YgMywgaW4gMjQtYml0IGNhc2UKLSAgICBzaXplX3QgbWF4Qnl0ZXNUb1JlYWQgPQotICAgICAgICBtQml0c1BlclNhbXBsZSA9PSA4ID8ga01heEZyYW1lU2l6ZSAvIDIgOiAKLSAgICAgICAgKG1CaXRzUGVyU2FtcGxlID09IDI0ID8gMyooa01heEZyYW1lU2l6ZS8zKToga01heEZyYW1lU2l6ZSk7CisgICAgLy8gbWF4Qnl0ZXNUb1JlYWQgbWF5IGJlIHJlZHVjZWQgc28gdGhhdCBpbi1wbGFjZSBkYXRhIGNvbnZlcnNpb24gd2lsbCBmaXQgaW4gYnVmZmVyIHNpemUuCisgICAgY29uc3Qgc2l6ZV90IGJ1ZmZlclNpemUgPSBidWZmZXItPnNpemUoKTsKKyAgICBzaXplX3QgbWF4Qnl0ZXNUb1JlYWQ7CisgICAgaWYgKG1PdXRwdXRGbG9hdCkgeyAvLyBkZXN0aW5hdGlvbiBpcyBmbG9hdCBhdCA0IGJ5dGVzIHBlciBzYW1wbGUsIHNvdXJjZSBtYXkgYmUgbGVzcy4KKyAgICAgICAgbWF4Qnl0ZXNUb1JlYWQgPSAobUJpdHNQZXJTYW1wbGUgLyA4KSAqIChidWZmZXJTaXplIC8gNCk7CisgICAgfSBlbHNlIHsgLy8gZGVzdGluYXRpb24gaXMgaW50MTZfdCBhdCAyIGJ5dGVzIHBlciBzYW1wbGUsIG9ubHkgc291cmNlIG9mIDggYml0cyBpcyBsZXNzLgorICAgICAgICBtYXhCeXRlc1RvUmVhZCA9IG1CaXRzUGVyU2FtcGxlID09IDggPyBidWZmZXJTaXplIC8gMiA6IGJ1ZmZlclNpemU7CisgICAgfQogCi0gICAgc2l6ZV90IG1heEJ5dGVzQXZhaWxhYmxlID0KKyAgICBjb25zdCBzaXplX3QgbWF4Qnl0ZXNBdmFpbGFibGUgPQogICAgICAgICAobUN1cnJlbnRQb3MgLSBtT2Zmc2V0ID49IChvZmY2NF90KW1TaXplKQogICAgICAgICAgICAgPyAwIDogbVNpemUgLSAobUN1cnJlbnRQb3MgLSBtT2Zmc2V0KTsKIApAQCAtNDgyLDQ1ICs1MDMsNjQgQEAKICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CiAgICAgICAgIGJ1ZmZlciA9IE5VTEw7CiAKLSAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfRU5EX09GX1NUUkVBTTsKICAgICB9CiAKICAgICBidWZmZXItPnNldF9yYW5nZSgwLCBuKTsKIAogICAgIC8vIFRPRE86IGFkZCBjYXBhYmlsaXR5IHRvIHJldHVybiBkYXRhIGFzIGZsb2F0IFBDTSBpbnN0ZWFkIG9mIDE2IGJpdCBQQ00uCiAgICAgaWYgKG1XYXZlRm9ybWF0ID09IFdBVkVfRk9STUFUX1BDTSkgewotICAgICAgICBpZiAobUJpdHNQZXJTYW1wbGUgPT0gOCkgewotICAgICAgICAgICAgLy8gQ29udmVydCA4LWJpdCB1bnNpZ25lZCBzYW1wbGVzIHRvIDE2LWJpdCBzaWduZWQuCi0KLSAgICAgICAgICAgIC8vIENyZWF0ZSBuZXcgYnVmZmVyIHdpdGggMiBieXRlIHdpZGUgc2FtcGxlcwotICAgICAgICAgICAgTWVkaWFCdWZmZXJCYXNlICp0bXA7Ci0gICAgICAgICAgICBDSEVDS19FUShtR3JvdXAtPmFjcXVpcmVfYnVmZmVyKCZ0bXApLCAoc3RhdHVzX3QpT0spOwotICAgICAgICAgICAgdG1wLT5zZXRfcmFuZ2UoMCwgMiAqIG4pOwotCi0gICAgICAgICAgICBtZW1jcHlfdG9faTE2X2Zyb21fdTgoKGludDE2X3QgKil0bXAtPmRhdGEoKSwgKGNvbnN0IHVpbnQ4X3QgKilidWZmZXItPmRhdGEoKSwgbik7Ci0gICAgICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgICAgIGJ1ZmZlciA9IHRtcDsKLSAgICAgICAgfSBlbHNlIGlmIChtQml0c1BlclNhbXBsZSA9PSAyNCkgewotICAgICAgICAgICAgLy8gQ29udmVydCAyNC1iaXQgc2lnbmVkIHNhbXBsZXMgdG8gMTYtYml0IHNpZ25lZCBpbiBwbGFjZQotICAgICAgICAgICAgY29uc3Qgc2l6ZV90IG51bVNhbXBsZXMgPSBuIC8gMzsKLQotICAgICAgICAgICAgbWVtY3B5X3RvX2kxNl9mcm9tX3AyNCgoaW50MTZfdCAqKWJ1ZmZlci0+ZGF0YSgpLCAoY29uc3QgdWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpLCBudW1TYW1wbGVzKTsKLSAgICAgICAgICAgIGJ1ZmZlci0+c2V0X3JhbmdlKDAsIDIgKiBudW1TYW1wbGVzKTsKLSAgICAgICAgfSAgZWxzZSBpZiAobUJpdHNQZXJTYW1wbGUgPT0gMzIpIHsKLSAgICAgICAgICAgIC8vIENvbnZlcnQgMzItYml0IHNpZ25lZCBzYW1wbGVzIHRvIDE2LWJpdCBzaWduZWQgaW4gcGxhY2UKLSAgICAgICAgICAgIGNvbnN0IHNpemVfdCBudW1TYW1wbGVzID0gbiAvIDQ7Ci0KLSAgICAgICAgICAgIG1lbWNweV90b19pMTZfZnJvbV9pMzIoKGludDE2X3QgKilidWZmZXItPmRhdGEoKSwgKGNvbnN0IGludDMyX3QgKilidWZmZXItPmRhdGEoKSwgbnVtU2FtcGxlcyk7Ci0gICAgICAgICAgICBidWZmZXItPnNldF9yYW5nZSgwLCAyICogbnVtU2FtcGxlcyk7CisgICAgICAgIGlmIChtT3V0cHV0RmxvYXQpIHsKKyAgICAgICAgICAgIGZsb2F0ICpmZGVzdCA9IChmbG9hdCAqKWJ1ZmZlci0+ZGF0YSgpOworICAgICAgICAgICAgc3dpdGNoIChtQml0c1BlclNhbXBsZSkgeworICAgICAgICAgICAgY2FzZSA4OiB7CisgICAgICAgICAgICAgICAgYnVmZmVyLT5zZXRfcmFuZ2UoMCwgNCAqIG4pOworICAgICAgICAgICAgICAgIG1lbWNweV90b19mbG9hdF9mcm9tX3U4KGZkZXN0LCAoY29uc3QgdWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpLCBuKTsKKyAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE2OiB7CisgICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90IG51bVNhbXBsZXMgPSBuIC8gMjsKKyAgICAgICAgICAgICAgICBidWZmZXItPnNldF9yYW5nZSgwLCA0ICogbnVtU2FtcGxlcyk7CisgICAgICAgICAgICAgICAgbWVtY3B5X3RvX2Zsb2F0X2Zyb21faTE2KGZkZXN0LCAoY29uc3QgaW50MTZfdCAqKWJ1ZmZlci0+ZGF0YSgpLCBudW1TYW1wbGVzKTsKKyAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI0OiB7CisgICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90IG51bVNhbXBsZXMgPSBuIC8gMzsKKyAgICAgICAgICAgICAgICBidWZmZXItPnNldF9yYW5nZSgwLCA0ICogbnVtU2FtcGxlcyk7CisgICAgICAgICAgICAgICAgbWVtY3B5X3RvX2Zsb2F0X2Zyb21fcDI0KGZkZXN0LCAoY29uc3QgdWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpLCBudW1TYW1wbGVzKTsKKyAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICBjYXNlIDMyOiB7IC8vIGJ1ZmZlciByYW5nZSBpcyBjb3JyZWN0CisgICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90IG51bVNhbXBsZXMgPSBuIC8gNDsKKyAgICAgICAgICAgICAgICBtZW1jcHlfdG9fZmxvYXRfZnJvbV9pMzIoZmRlc3QsIChjb25zdCBpbnQzMl90ICopYnVmZmVyLT5kYXRhKCksIG51bVNhbXBsZXMpOworICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludDE2X3QgKmlkZXN0ID0gKGludDE2X3QgKilidWZmZXItPmRhdGEoKTsKKyAgICAgICAgICAgIHN3aXRjaCAobUJpdHNQZXJTYW1wbGUpIHsKKyAgICAgICAgICAgIGNhc2UgODogeworICAgICAgICAgICAgICAgIGJ1ZmZlci0+c2V0X3JhbmdlKDAsIDIgKiBuKTsKKyAgICAgICAgICAgICAgICBtZW1jcHlfdG9faTE2X2Zyb21fdTgoaWRlc3QsIChjb25zdCB1aW50OF90ICopYnVmZmVyLT5kYXRhKCksIG4pOworICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTY6CisgICAgICAgICAgICAgICAgYnJlYWs7IC8vIG5vIHRyYW5zbGF0aW9uIG5lZWRlZAorICAgICAgICAgICAgY2FzZSAyNDogeworICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBudW1TYW1wbGVzID0gbiAvIDM7CisgICAgICAgICAgICAgICAgYnVmZmVyLT5zZXRfcmFuZ2UoMCwgMiAqIG51bVNhbXBsZXMpOworICAgICAgICAgICAgICAgIG1lbWNweV90b19pMTZfZnJvbV9wMjQoaWRlc3QsIChjb25zdCB1aW50OF90ICopYnVmZmVyLT5kYXRhKCksIG51bVNhbXBsZXMpOworICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzI6IHsKKyAgICAgICAgICAgICAgICBjb25zdCBzaXplX3QgbnVtU2FtcGxlcyA9IG4gLyA0OworICAgICAgICAgICAgICAgIGJ1ZmZlci0+c2V0X3JhbmdlKDAsIDIgKiBudW1TYW1wbGVzKTsKKyAgICAgICAgICAgICAgICBtZW1jcHlfdG9faTE2X2Zyb21faTMyKGlkZXN0LCAoY29uc3QgaW50MzJfdCAqKWJ1ZmZlci0+ZGF0YSgpLCBudW1TYW1wbGVzKTsKKyAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKG1XYXZlRm9ybWF0ID09IFdBVkVfRk9STUFUX0lFRUVfRkxPQVQpIHsKLSAgICAgICAgaWYgKG1CaXRzUGVyU2FtcGxlID09IDMyKSB7Ci0gICAgICAgICAgICAvLyBDb252ZXJ0IDMyLWJpdCBmbG9hdCBzYW1wbGVzIHRvIDE2LWJpdCBzaWduZWQgaW4gcGxhY2UKKyAgICAgICAgaWYgKCFtT3V0cHV0RmxvYXQpIHsgLy8gbUJpdHNQZXJTYW1wbGUgPT0gMzIKKyAgICAgICAgICAgIGludDE2X3QgKmlkZXN0ID0gKGludDE2X3QgKilidWZmZXItPmRhdGEoKTsKICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBudW1TYW1wbGVzID0gbiAvIDQ7Ci0KLSAgICAgICAgICAgIG1lbWNweV90b19pMTZfZnJvbV9mbG9hdCgoaW50MTZfdCAqKWJ1ZmZlci0+ZGF0YSgpLCAoY29uc3QgZmxvYXQgKilidWZmZXItPmRhdGEoKSwgbnVtU2FtcGxlcyk7CisgICAgICAgICAgICBtZW1jcHlfdG9faTE2X2Zyb21fZmxvYXQoaWRlc3QsIChjb25zdCBmbG9hdCAqKWJ1ZmZlci0+ZGF0YSgpLCBudW1TYW1wbGVzKTsKICAgICAgICAgICAgIGJ1ZmZlci0+c2V0X3JhbmdlKDAsIDIgKiBudW1TYW1wbGVzKTsKICAgICAgICAgfQorICAgICAgICAvLyBOb3RlOiBpZiBvdXRwdXQgZW5jb2RpbmcgaXMgZmxvYXQsIG5vIG5lZWQgdG8gY29udmVydCBpZiBzb3VyY2UgaXMgZmxvYXQuCiAgICAgfQogCiAgICAgaW50NjRfdCB0aW1lU3RhbXBVcyA9IDA7CkBAIC01NDAsMzIgKzU4MCwzNSBAQAogCiAgICAgKm91dCA9IGJ1ZmZlcjsKIAotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCi1zdGF0aWMgTWVkaWFFeHRyYWN0b3IqIENyZWF0ZUV4dHJhY3RvcigKLSAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwKK3N0YXRpYyBDTWVkaWFFeHRyYWN0b3JWMiogQ3JlYXRlRXh0cmFjdG9yKAorICAgICAgICBDRGF0YVNvdXJjZSAqc291cmNlLAogICAgICAgICB2b2lkICopIHsKLSAgICByZXR1cm4gbmV3IFdBVkV4dHJhY3Rvcihzb3VyY2UpOworICAgIHJldHVybiB3cmFwVjIobmV3IFdBVkV4dHJhY3RvcihuZXcgRGF0YVNvdXJjZUhlbHBlcihzb3VyY2UpKSk7CiB9CiAKLXN0YXRpYyBNZWRpYUV4dHJhY3Rvcjo6Q3JlYXRvckZ1bmMgU25pZmYoCi0gICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsCitzdGF0aWMgQ3JlYXRvckZ1bmNWMiBTbmlmZigKKyAgICAgICAgQ0RhdGFTb3VyY2UgKnNvdXJjZSwKICAgICAgICAgZmxvYXQgKmNvbmZpZGVuY2UsCiAgICAgICAgIHZvaWQgKiosCi0gICAgICAgIE1lZGlhRXh0cmFjdG9yOjpGcmVlTWV0YUZ1bmMgKikgeworICAgICAgICBGcmVlTWV0YUZ1bmMgKikgeworICAgIERhdGFTb3VyY2VIZWxwZXIgKmhlbHBlciA9IG5ldyBEYXRhU291cmNlSGVscGVyKHNvdXJjZSk7CiAgICAgY2hhciBoZWFkZXJbMTJdOwotICAgIGlmIChzb3VyY2UtPnJlYWRBdCgwLCBoZWFkZXIsIHNpemVvZihoZWFkZXIpKSA8IChzc2l6ZV90KXNpemVvZihoZWFkZXIpKSB7CisgICAgaWYgKGhlbHBlci0+cmVhZEF0KDAsIGhlYWRlciwgc2l6ZW9mKGhlYWRlcikpIDwgKHNzaXplX3Qpc2l6ZW9mKGhlYWRlcikpIHsKKyAgICAgICAgZGVsZXRlIGhlbHBlcjsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCiAgICAgaWYgKG1lbWNtcChoZWFkZXIsICJSSUZGIiwgNCkgfHwgbWVtY21wKCZoZWFkZXJbOF0sICJXQVZFIiwgNCkpIHsKKyAgICAgICAgZGVsZXRlIGhlbHBlcjsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCi0gICAgTWVkaWFFeHRyYWN0b3IgKmV4dHJhY3RvciA9IG5ldyBXQVZFeHRyYWN0b3Ioc291cmNlKTsKKyAgICBXQVZFeHRyYWN0b3IgKmV4dHJhY3RvciA9IG5ldyBXQVZFeHRyYWN0b3IoaGVscGVyKTsgLy8gZXh0cmFjdG9yIG93bnMgdGhlIGhlbHBlcgogICAgIGludCBudW1UcmFja3MgPSBleHRyYWN0b3ItPmNvdW50VHJhY2tzKCk7CiAgICAgZGVsZXRlIGV4dHJhY3RvcjsKICAgICBpZiAobnVtVHJhY2tzID09IDApIHsKQEAgLTU4MCwxMyArNjIzLDEzIEBACiBleHRlcm4gIkMiIHsKIC8vIFRoaXMgaXMgdGhlIG9ubHkgc3ltYm9sIHRoYXQgbmVlZHMgdG8gYmUgZXhwb3J0ZWQKIF9fYXR0cmlidXRlX18gKCh2aXNpYmlsaXR5ICgiZGVmYXVsdCIpKSkKLU1lZGlhRXh0cmFjdG9yOjpFeHRyYWN0b3JEZWYgR0VURVhUUkFDVE9SREVGKCkgeworRXh0cmFjdG9yRGVmIEdFVEVYVFJBQ1RPUkRFRigpIHsKICAgICByZXR1cm4gewotICAgICAgICBNZWRpYUV4dHJhY3Rvcjo6RVhUUkFDVE9SREVGX1ZFUlNJT04sCisgICAgICAgIEVYVFJBQ1RPUkRFRl9WRVJTSU9OX0NVUlJFTlQsCiAgICAgICAgIFVVSUQoIjdkNjEzODU4LTU4MzctNGEzOC04NGM1LTMzMmQxY2RkZWUyNyIpLAogICAgICAgICAxLCAvLyB2ZXJzaW9uCiAgICAgICAgICJXQVYgRXh0cmFjdG9yIiwKLSAgICAgICAgU25pZmYKKyAgICAgICAgeyAudjIgPSBTbmlmZiB9CiAgICAgfTsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy93YXYvV0FWRXh0cmFjdG9yLmggYi9tZWRpYS9leHRyYWN0b3JzL3dhdi9XQVZFeHRyYWN0b3IuaAppbmRleCA0NjdkMGI3Li5jZTM0ODgxIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL3dhdi9XQVZFeHRyYWN0b3IuaAorKysgYi9tZWRpYS9leHRyYWN0b3JzL3dhdi9XQVZFeHRyYWN0b3IuaApAQCAtMTksMzAgKzE5LDMxIEBACiAjZGVmaW5lIFdBVl9FWFRSQUNUT1JfSF8KIAogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5BcGkuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlci5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRm9ybWF0Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RydWN0IEFNZXNzYWdlOwotY2xhc3MgRGF0YVNvdXJjZUJhc2U7CitzdHJ1Y3QgQ0RhdGFTb3VyY2U7CiBjbGFzcyBTdHJpbmc4OwogCi1jbGFzcyBXQVZFeHRyYWN0b3IgOiBwdWJsaWMgTWVkaWFFeHRyYWN0b3IgeworY2xhc3MgV0FWRXh0cmFjdG9yIDogcHVibGljIE1lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyVjIgewogcHVibGljOgotICAgIGV4cGxpY2l0IFdBVkV4dHJhY3RvcihEYXRhU291cmNlQmFzZSAqc291cmNlKTsKKyAgICBleHBsaWNpdCBXQVZFeHRyYWN0b3IoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlKTsKIAogICAgIHZpcnR1YWwgc2l6ZV90IGNvdW50VHJhY2tzKCk7Ci0gICAgdmlydHVhbCBNZWRpYVRyYWNrICpnZXRUcmFjayhzaXplX3QgaW5kZXgpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0VHJhY2tNZXRhRGF0YShNZXRhRGF0YUJhc2UmIG1ldGEsIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpOworICAgIHZpcnR1YWwgTWVkaWFUcmFja0hlbHBlclYyICpnZXRUcmFjayhzaXplX3QgaW5kZXgpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0VHJhY2tNZXRhRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEsIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNZXRhRGF0YShNZXRhRGF0YUJhc2UmIG1ldGEpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0TWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhKTsKICAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKiBuYW1lKCkgeyByZXR1cm4gIldBVkV4dHJhY3RvciI7IH0KIAogICAgIHZpcnR1YWwgfldBVkV4dHJhY3RvcigpOwogCiBwcml2YXRlOgotICAgIERhdGFTb3VyY2VCYXNlICptRGF0YVNvdXJjZTsKKyAgICBEYXRhU291cmNlSGVscGVyICptRGF0YVNvdXJjZTsKICAgICBzdGF0dXNfdCBtSW5pdENoZWNrOwogICAgIGJvb2wgbVZhbGlkRm9ybWF0OwogICAgIHVpbnQxNl90IG1XYXZlRm9ybWF0OwpAQCAtNTIsNyArNTMsNyBAQAogICAgIHVpbnQxNl90IG1CaXRzUGVyU2FtcGxlOwogICAgIG9mZjY0X3QgbURhdGFPZmZzZXQ7CiAgICAgc2l6ZV90IG1EYXRhU2l6ZTsKLSAgICBNZXRhRGF0YUJhc2UgbVRyYWNrTWV0YTsKKyAgICBBTWVkaWFGb3JtYXQgKm1UcmFja01ldGE7CiAKICAgICBzdGF0dXNfdCBpbml0KCk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2ltZ191dGlscy9pbmNsdWRlL2ltZ191dGlscy9EbmdVdGlscy5oIGIvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL0RuZ1V0aWxzLmgKaW5kZXggZGU4ZjEyMC4uODgxOWY4NyAxMDA2NDQKLS0tIGEvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL0RuZ1V0aWxzLmgKKysrIGIvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL0RuZ1V0aWxzLmgKQEAgLTQ5LDYgKzQ5LDcgQEAKICAgICAgICAgICAgIENGQV9SR0dCLAogICAgICAgICAgICAgQ0ZBX0JHR1IsCiAgICAgICAgICAgICBDRkFfR0JSRywKKyAgICAgICAgICAgIENGQV9OT05FLAogICAgICAgICB9OwogCiAgICAgICAgIE9wY29kZUxpc3RCdWlsZGVyKCk7CkBAIC04OSw3ICs5MCw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDZmFMYXlvdXQgY2ZhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIGxlbnNTaGFkaW5nTWFwKTsKIAotCiAgICAgICAgIC8qKgogICAgICAgICAgKiBBZGQgYSBHYWluTWFwIG9wY29kZSB3aXRoIHRoZSBnaXZlbiBmaWVsZHMuICBUaGUgbWFwR2FpbnMgYXJyYXkKICAgICAgICAgICogbXVzdCBoYXZlIG1hcFBvaW50c1YgKiBtYXBQb2ludHNIICogbWFwUGxhbmVzIGVsZW1lbnRzLgpAQCAtMTk3LDYgKzE5NywzMyBAQAogCiAgICAgICAgIHN0YXR1c190IGFkZE9wY29kZVByZWFtYmxlKHVpbnQzMl90IG9wY29kZUlkKTsKIAorICAgIHByaXZhdGU6CisgICAgICAgIC8qKgorICAgICAgICAgKiBBZGQgQmF5ZXIgR2Fpbk1hcCBvcGNvZGUocykgZm9yIHRoZSBnaXZlbiBtZXRhZGF0YSBwYXJhbWV0ZXJzLgorICAgICAgICAgKiBDRkEgbGF5b3V0IG11c3QgbWF0Y2ggdGhlIGxheW91dCBvZiB0aGUgc2hhZGluZyBtYXAgcGFzc2VkIGludG8gdGhlCisgICAgICAgICAqIGxlbnNTaGFkaW5nTWFwIHBhcmFtZXRlci4KKyAgICAgICAgICoKKyAgICAgICAgICogUmV0dXJucyBPSyBvbiBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCisgICAgICAgICAqLworICAgICAgICBzdGF0dXNfdCBhZGRCYXllckdhaW5NYXBzRm9yTWV0YWRhdGEodWludDMyX3QgbHNtV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBsc21IZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhY3RpdmVBcmVhV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhY3RpdmVBcmVhSGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2ZhTGF5b3V0IGNmYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBsZW5zU2hhZGluZ01hcCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFkZCBCYXllciBHYWluTWFwIG9wY29kZShzKSBmb3IgdGhlIGdpdmVuIG1ldGFkYXRhIHBhcmFtZXRlcnMuCisgICAgICAgICAqIENGQSBsYXlvdXQgbXVzdCBtYXRjaCB0aGUgbGF5b3V0IG9mIHRoZSBzaGFkaW5nIG1hcCBwYXNzZWQgaW50byB0aGUKKyAgICAgICAgICogbGVuc1NoYWRpbmdNYXAgcGFyYW1ldGVyLgorICAgICAgICAgKgorICAgICAgICAgKiBSZXR1cm5zIE9LIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAgICAgICAgICovCisgICAgICAgIHN0YXR1c190IGFkZE1vbm9jaHJvbWVHYWluTWFwc0Zvck1ldGFkYXRhKHVpbnQzMl90IGxzbVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbHNtSGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYWN0aXZlQXJlYVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYWN0aXZlQXJlYUhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBsZW5zU2hhZGluZ01hcCk7CiB9OwogCiB9IC8qbmFtZXNwYWNlIGltZ191dGlscyovCmRpZmYgLS1naXQgYS9tZWRpYS9pbWdfdXRpbHMvc3JjL0RuZ1V0aWxzLmNwcCBiL21lZGlhL2ltZ191dGlscy9zcmMvRG5nVXRpbHMuY3BwCmluZGV4IDlhYzdlMmEuLjkzMDRmNTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2ltZ191dGlscy9zcmMvRG5nVXRpbHMuY3BwCisrKyBiL21lZGlhL2ltZ191dGlscy9zcmMvRG5nVXRpbHMuY3BwCkBAIC02MCwzNCArNjAsMzYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGFjdGl2ZUFyZWFSaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENmYUxheW91dCBjZmEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogbGVuc1NoYWRpbmdNYXApIHsKKyAgICBzdGF0dXNfdCBlcnIgPSBPSzsKICAgICB1aW50MzJfdCBhY3RpdmVBcmVhV2lkdGggPSBhY3RpdmVBcmVhUmlnaHQgLSBhY3RpdmVBcmVhTGVmdDsKICAgICB1aW50MzJfdCBhY3RpdmVBcmVhSGVpZ2h0ID0gYWN0aXZlQXJlYUJvdHRvbSAtIGFjdGl2ZUFyZWFUb3A7Ci0gICAgZG91YmxlIHNwYWNpbmdWID0gMS4wIC8gc3RkOjptYXgoMXUsIGxzbUhlaWdodCAtIDEpOwotICAgIGRvdWJsZSBzcGFjaW5nSCA9IDEuMCAvIHN0ZDo6bWF4KDF1LCBsc21XaWR0aCAtIDEpOwogCi0gICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IHJlZE1hcFZlY3Rvcihsc21XaWR0aCAqIGxzbUhlaWdodCk7Ci0gICAgZmxvYXQgKnJlZE1hcCA9IHJlZE1hcFZlY3Rvci5kYXRhKCk7Ci0KLSAgICBzdGQ6OnZlY3RvcjxmbG9hdD4gZ3JlZW5FdmVuTWFwVmVjdG9yKGxzbVdpZHRoICogbHNtSGVpZ2h0KTsKLSAgICBmbG9hdCAqZ3JlZW5FdmVuTWFwID0gZ3JlZW5FdmVuTWFwVmVjdG9yLmRhdGEoKTsKLQotICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiBncmVlbk9kZE1hcFZlY3Rvcihsc21XaWR0aCAqIGxzbUhlaWdodCk7Ci0gICAgZmxvYXQgKmdyZWVuT2RkTWFwID0gZ3JlZW5PZGRNYXBWZWN0b3IuZGF0YSgpOwotCi0gICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IGJsdWVNYXBWZWN0b3IobHNtV2lkdGggKiBsc21IZWlnaHQpOwotICAgIGZsb2F0ICpibHVlTWFwID0gYmx1ZU1hcFZlY3Rvci5kYXRhKCk7Ci0KLSAgICBzaXplX3QgbHNtTWFwU2l6ZSA9IGxzbVdpZHRoICogbHNtSGVpZ2h0ICogNDsKLQotICAgIC8vIFNwbGl0IGxlbnMgc2hhZGluZyBtYXAgY2hhbm5lbHMgaW50byBzZXBhcmF0ZSBhcnJheXMKLSAgICBzaXplX3QgaiA9IDA7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBsc21NYXBTaXplOyBpICs9IDQsICsraikgewotICAgICAgICByZWRNYXBbal0gPSBsZW5zU2hhZGluZ01hcFtpICsgTFNNX1JfSU5EXTsKLSAgICAgICAgZ3JlZW5FdmVuTWFwW2pdID0gbGVuc1NoYWRpbmdNYXBbaSArIExTTV9HRV9JTkRdOwotICAgICAgICBncmVlbk9kZE1hcFtqXSA9IGxlbnNTaGFkaW5nTWFwW2kgKyBMU01fR09fSU5EXTsKLSAgICAgICAgYmx1ZU1hcFtqXSA9IGxlbnNTaGFkaW5nTWFwW2kgKyBMU01fQl9JTkRdOworICAgIHN3aXRjaCAoY2ZhKSB7CisgICAgICAgIGNhc2UgQ0ZBX1JHR0I6CisgICAgICAgIGNhc2UgQ0ZBX0dSQkc6CisgICAgICAgIGNhc2UgQ0ZBX0dCUkc6CisgICAgICAgIGNhc2UgQ0ZBX0JHR1I6CisgICAgICAgICAgICBlcnIgPSBhZGRCYXllckdhaW5NYXBzRm9yTWV0YWRhdGEobHNtV2lkdGgsIGxzbUhlaWdodCwgYWN0aXZlQXJlYVdpZHRoLAorICAgICAgICAgICAgICAgICAgICBhY3RpdmVBcmVhSGVpZ2h0LCBjZmEsIGxlbnNTaGFkaW5nTWFwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENGQV9OT05FOgorICAgICAgICAgICAgZXJyID0gYWRkTW9ub2Nocm9tZUdhaW5NYXBzRm9yTWV0YWRhdGEobHNtV2lkdGgsIGxzbUhlaWdodCwgYWN0aXZlQXJlYVdpZHRoLAorICAgICAgICAgICAgICAgICAgICBhY3RpdmVBcmVhSGVpZ2h0LCBsZW5zU2hhZGluZ01hcCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dFKCIlczogVW5rbm93biBDRkEgbGF5b3V0ICVkIiwgX19GVU5DVElPTl9fLCBjZmEpOworICAgICAgICAgICAgZXJyID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgYnJlYWs7CiAgICAgfQorICAgIHJldHVybiBlcnI7Cit9CiAKK3N0YXR1c190IE9wY29kZUxpc3RCdWlsZGVyOjphZGRCYXllckdhaW5NYXBzRm9yTWV0YWRhdGEodWludDMyX3QgbHNtV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBsc21IZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhY3RpdmVBcmVhV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhY3RpdmVBcmVhSGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2ZhTGF5b3V0IGNmYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBsZW5zU2hhZGluZ01hcCkgewogICAgIHVpbnQzMl90IHJlZFRvcCA9IDA7CiAgICAgdWludDMyX3QgcmVkTGVmdCA9IDA7CiAgICAgdWludDMyX3QgZ3JlZW5FdmVuVG9wID0gMDsKQEAgLTE0Myw2ICsxNDUsMzIgQEAKICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCisgICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IHJlZE1hcFZlY3Rvcihsc21XaWR0aCAqIGxzbUhlaWdodCk7CisgICAgZmxvYXQgKnJlZE1hcCA9IHJlZE1hcFZlY3Rvci5kYXRhKCk7CisKKyAgICBzdGQ6OnZlY3RvcjxmbG9hdD4gZ3JlZW5FdmVuTWFwVmVjdG9yKGxzbVdpZHRoICogbHNtSGVpZ2h0KTsKKyAgICBmbG9hdCAqZ3JlZW5FdmVuTWFwID0gZ3JlZW5FdmVuTWFwVmVjdG9yLmRhdGEoKTsKKworICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiBncmVlbk9kZE1hcFZlY3Rvcihsc21XaWR0aCAqIGxzbUhlaWdodCk7CisgICAgZmxvYXQgKmdyZWVuT2RkTWFwID0gZ3JlZW5PZGRNYXBWZWN0b3IuZGF0YSgpOworCisgICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IGJsdWVNYXBWZWN0b3IobHNtV2lkdGggKiBsc21IZWlnaHQpOworICAgIGZsb2F0ICpibHVlTWFwID0gYmx1ZU1hcFZlY3Rvci5kYXRhKCk7CisKKyAgICBkb3VibGUgc3BhY2luZ1YgPSAxLjAgLyBzdGQ6Om1heCgxdSwgbHNtSGVpZ2h0IC0gMSk7CisgICAgZG91YmxlIHNwYWNpbmdIID0gMS4wIC8gc3RkOjptYXgoMXUsIGxzbVdpZHRoIC0gMSk7CisKKyAgICBzaXplX3QgbHNtTWFwU2l6ZSA9IGxzbVdpZHRoICogbHNtSGVpZ2h0ICogNDsKKworICAgIC8vIFNwbGl0IGxlbnMgc2hhZGluZyBtYXAgY2hhbm5lbHMgaW50byBzZXBhcmF0ZSBhcnJheXMKKyAgICBzaXplX3QgaiA9IDA7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBsc21NYXBTaXplOyBpICs9IDQsICsraikgeworICAgICAgICByZWRNYXBbal0gPSBsZW5zU2hhZGluZ01hcFtpICsgTFNNX1JfSU5EXTsKKyAgICAgICAgZ3JlZW5FdmVuTWFwW2pdID0gbGVuc1NoYWRpbmdNYXBbaSArIExTTV9HRV9JTkRdOworICAgICAgICBncmVlbk9kZE1hcFtqXSA9IGxlbnNTaGFkaW5nTWFwW2kgKyBMU01fR09fSU5EXTsKKyAgICAgICAgYmx1ZU1hcFtqXSA9IGxlbnNTaGFkaW5nTWFwW2kgKyBMU01fQl9JTkRdOworICAgIH0KKwogICAgIHN0YXR1c190IGVyciA9IGFkZEdhaW5NYXAoLyp0b3AqL3JlZFRvcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbGVmdCovcmVkTGVmdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qYm90dG9tKi9hY3RpdmVBcmVhSGVpZ2h0IC0gMSwKQEAgLTIxNiw2ICsyNDQsNDYgQEAKICAgICByZXR1cm4gZXJyOwogfQogCitzdGF0dXNfdCBPcGNvZGVMaXN0QnVpbGRlcjo6YWRkTW9ub2Nocm9tZUdhaW5NYXBzRm9yTWV0YWRhdGEodWludDMyX3QgbHNtV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBsc21IZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhY3RpdmVBcmVhV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhY3RpdmVBcmVhSGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIGxlbnNTaGFkaW5nTWFwKSB7CisgICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IG1hcFZlY3Rvcihsc21XaWR0aCAqIGxzbUhlaWdodCk7CisgICAgZmxvYXQgKm1hcCA9IG1hcFZlY3Rvci5kYXRhKCk7CisKKyAgICBkb3VibGUgc3BhY2luZ1YgPSAxLjAgLyBzdGQ6Om1heCgxdSwgbHNtSGVpZ2h0IC0gMSk7CisgICAgZG91YmxlIHNwYWNpbmdIID0gMS4wIC8gc3RkOjptYXgoMXUsIGxzbVdpZHRoIC0gMSk7CisKKyAgICBzaXplX3QgbHNtTWFwU2l6ZSA9IGxzbVdpZHRoICogbHNtSGVpZ2h0ICogNDsKKworICAgIC8vIFNwbGl0IGxlbnMgc2hhZGluZyBtYXAgY2hhbm5lbHMgaW50byBzZXBhcmF0ZSBhcnJheXMKKyAgICBzaXplX3QgaiA9IDA7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBsc21NYXBTaXplOyBpICs9IDQsICsraikgeworICAgICAgICBtYXBbal0gPSBsZW5zU2hhZGluZ01hcFtpXTsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBlcnIgPSBhZGRHYWluTWFwKC8qdG9wKi8wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypsZWZ0Ki8wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypib3R0b20qL2FjdGl2ZUFyZWFIZWlnaHQgLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypyaWdodCovYWN0aXZlQXJlYVdpZHRoIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qcGxhbmUqLzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnBsYW5lcyovMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qcm93UGl0Y2gqLzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmNvbFBpdGNoKi8xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyptYXBQb2ludHNWKi9sc21IZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm1hcFBvaW50c0gqL2xzbVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyptYXBTcGFjaW5nViovc3BhY2luZ1YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm1hcFNwYWNpbmdIKi9zcGFjaW5nSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbWFwT3JpZ2luViovMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbWFwT3JpZ2luSCovMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbWFwUGxhbmVzKi8xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyptYXBHYWlucyovbWFwKTsKKyAgICBpZiAoZXJyICE9IE9LKSByZXR1cm4gZXJyOworCisgICAgcmV0dXJuIGVycjsKK30KKwogc3RhdHVzX3QgT3Bjb2RlTGlzdEJ1aWxkZXI6OmFkZEdhaW5NYXAodWludDMyX3QgdG9wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbGVmdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGJvdHRvbSwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9pbnB1dF9tb25pdG9yL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvaW5wdXRfbW9uaXRvci9BbmRyb2lkLmJwCmluZGV4IGQ4YzU4NDMuLjVkMzk5YjUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9pbnB1dF9tb25pdG9yL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2lucHV0X21vbml0b3IvQW5kcm9pZC5icApAQCAtNSw2ICs1LDcgQEAKICAgICBjZmxhZ3M6IFsiLVdhbGwiLCAiLVdlcnJvciJdLAogICAgIHNoYXJlZF9saWJzOiBbImxpYmFhdWRpbyJdLAogICAgIGhlYWRlcl9saWJzOiBbImxpYmFhdWRpb19leGFtcGxlX3V0aWxzIl0sCisgICAgcGFja19yZWxvY2F0aW9uczogZmFsc2UsCiB9CiAKIGNjX3Rlc3QgewpAQCAtMTQsNCArMTUsNSBAQAogICAgIGNmbGFnczogWyItV2FsbCIsICItV2Vycm9yIl0sCiAgICAgc2hhcmVkX2xpYnM6IFsibGliYWF1ZGlvIl0sCiAgICAgaGVhZGVyX2xpYnM6IFsibGliYWF1ZGlvX2V4YW1wbGVfdXRpbHMiXSwKKyAgICBwYWNrX3JlbG9jYXRpb25zOiBmYWxzZSwKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9pbnB1dF9tb25pdG9yL2puaS9BbmRyb2lkLm1rIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2lucHV0X21vbml0b3Ivam5pL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwYjk4MWMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2lucHV0X21vbml0b3Ivam5pL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi1MT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKLUxPQ0FMX0NfSU5DTFVERVMgOj0gXAotICAgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby11dGlscykgXAotICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGliYWF1ZGlvL2luY2x1ZGUgXAotICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGliYWF1ZGlvL3NyYyBcCi0gICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvdXRpbHMKLQotIyBOREsgcmVjb21tZW5kcyB1c2luZyB0aGlzIGtpbmQgb2YgcmVsYXRpdmUgcGF0aCBpbnN0ZWFkIG9mIGFuIGFic29sdXRlIHBhdGguCi1MT0NBTF9TUkNfRklMRVM6PSAuLi9zcmMvaW5wdXRfbW9uaXRvci5jcHAKLUxPQ0FMX0NGTEFHUyA6PSAtV2FsbCAtV2Vycm9yCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmFhdWRpbwotTE9DQUxfTU9EVUxFIDo9IGlucHV0X21vbml0b3IKLWluY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLUxPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCi1MT0NBTF9DX0lOQ0xVREVTIDo9IFwKLSAgICAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tdXRpbHMpIFwKLSAgICBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmFhdWRpby9pbmNsdWRlIFwKLSAgICBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscwotCi1MT0NBTF9TUkNfRklMRVM6PSAuLi9zcmMvaW5wdXRfbW9uaXRvcl9jYWxsYmFjay5jcHAKLUxPQ0FMX0NGTEFHUyA6PSAtV2FsbCAtV2Vycm9yCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmFhdWRpbwotTE9DQUxfTU9EVUxFIDo9IGlucHV0X21vbml0b3JfY2FsbGJhY2sKLWluY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLUxPQ0FMX01PRFVMRSA6PSBsaWJhYXVkaW9fcHJlYnVpbHQKLUxPQ0FMX1NSQ19GSUxFUyA6PSBsaWJhYXVkaW8uc28KLUxPQ0FMX0VYUE9SVF9DX0lOQ0xVREVTIDo9ICQoTE9DQUxfUEFUSCkvaW5jbHVkZQotaW5jbHVkZSAkKFBSRUJVSUxUX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2lucHV0X21vbml0b3Ivam5pL0FwcGxpY2F0aW9uLm1rIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2lucHV0X21vbml0b3Ivam5pL0FwcGxpY2F0aW9uLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzQ0NzVjLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9pbnB1dF9tb25pdG9yL2puaS9BcHBsaWNhdGlvbi5taworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotIyBUT0RPIHJlbW92ZSB0aGVuIHdoZW4gd2Ugc3VwcG9ydCBvdGhlciBhcmNoaXRlY3R1cmVzCi1BUFBfQUJJIDo9IGFybTY0LXY4YQotQVBQX0NQUEZMQUdTICs9IC1zdGQ9YysrMTEKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9sb29wYmFjay9BbmRyb2lkLmJwIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2xvb3BiYWNrL0FuZHJvaWQuYnAKaW5kZXggNWI3ZDk1Ni4uNTNlNTAyMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2xvb3BiYWNrL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2xvb3BiYWNrL0FuZHJvaWQuYnAKQEAgLTksNCArOSw1IEBACiAgICAgICAgICJsaWJhdWRpb3V0aWxzIiwKICAgICAgICAgXSwKICAgICBoZWFkZXJfbGliczogWyJsaWJhYXVkaW9fZXhhbXBsZV91dGlscyJdLAorICAgIHBhY2tfcmVsb2NhdGlvbnM6IGZhbHNlLAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2xvb3BiYWNrL2puaS9BbmRyb2lkLm1rIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2xvb3BiYWNrL2puaS9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWJlODc3Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9sb29wYmFjay9qbmkvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLUxPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cwotTE9DQUxfQ19JTkNMVURFUyA6PSBcCi0gICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLXV0aWxzKSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJhYXVkaW8vaW5jbHVkZSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvdXRpbHMKLQotIyBOREsgcmVjb21tZW5kcyB1c2luZyB0aGlzIGtpbmQgb2YgcmVsYXRpdmUgcGF0aCBpbnN0ZWFkIG9mIGFuIGFic29sdXRlIHBhdGguCi1MT0NBTF9TUkNfRklMRVM6PSAuLi9zcmMvbG9vcGJhY2suY3BwCi1MT0NBTF9DRkxBR1MgOj0gLVdhbGwgLVdlcnJvcgotTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBsaWJzbmRmaWxlCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmFhdWRpbyBsaWJhdWRpb3V0aWxzCi1MT0NBTF9NT0RVTEUgOj0gYWF1ZGlvX2xvb3BiYWNrCi1pbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9sb29wYmFjay9qbmkvQXBwbGljYXRpb24ubWsgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvbG9vcGJhY2svam5pL0FwcGxpY2F0aW9uLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTQ0ZjM3Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9sb29wYmFjay9qbmkvQXBwbGljYXRpb24ubWsKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1BUFBfQ1BQRkxBR1MgKz0gLXN0ZD1jKysxMQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2xvb3BiYWNrL3NyYy9Mb29wYmFja0FuYWx5emVyLmggYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvbG9vcGJhY2svc3JjL0xvb3BiYWNrQW5hbHl6ZXIuaAppbmRleCBlZjlhNzUzLi45NzExYjg2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvbG9vcGJhY2svc3JjL0xvb3BiYWNrQW5hbHl6ZXIuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvbG9vcGJhY2svc3JjL0xvb3BiYWNrQW5hbHl6ZXIuaApAQCAtMzQsMTIgKzM0LDEyMyBAQAogCiAvLyBUYWcgZm9yIG1hY2hpbmUgcmVhZGFibGUgcmVzdWx0cyBhcyBwcm9wZXJ0eSA9IHZhbHVlIHBhaXJzCiAjZGVmaW5lIExPT1BCQUNLX1JFU1VMVF9UQUcgICAgICAiUkVTVUxUOiAiCi0jZGVmaW5lIExPT1BCQUNLX1NBTVBMRV9SQVRFICAgICA0ODAwMAogCi0jZGVmaW5lIE1JTExJU19QRVJfU0VDT05EICAgICAgICAxMDAwCitjb25zdGV4cHIgaW50MzJfdCBrRGVmYXVsdFNhbXBsZVJhdGUgPSA0ODAwMDsKK2NvbnN0ZXhwciBpbnQzMl90IGtNaWxsaXNQZXJTZWNvbmQgICA9IDEwMDA7Citjb25zdGV4cHIgaW50MzJfdCBrTWluTGF0ZW5jeU1pbGxpcyAgPSA0OyAgICAvLyBhcmJpdHJhcnkgYW5kIHZlcnkgbG93Citjb25zdGV4cHIgaW50MzJfdCBrTWF4TGF0ZW5jeU1pbGxpcyAgPSA0MDA7ICAvLyBhcmJpdHJhcnkgYW5kIGdlbmVyb3VzCitjb25zdGV4cHIgZG91YmxlICBrTWF4RWNob0dhaW4gICAgICAgPSAxMC4wOyAvLyBiYXNlZCBvbiBleHBlcmltZW50cywgb3RoZXJ3aXNlIHRvbyBub2lzeQorY29uc3RleHByIGRvdWJsZSAga01pbmltdW1Db25maWRlbmNlID0gMC41OwogCi0jZGVmaW5lIE1BWF9aRVJPVEhfUEFSVElBTF9CSU5TICA0MAotY29uc3RleHByIGRvdWJsZSBNQVhfRUNIT19HQUlOID0gMTAuMDsgLy8gYmFzZWQgb24gZXhwZXJpbWVudHMsIG90aGVyd2lzZSBhdXRvY29ycmVsYXRpb24gdG9vIG5vaXN5CitzdGF0aWMgdm9pZCBwcmludEF1ZGlvU2NvcGUoZmxvYXQgc2FtcGxlKSB7CisgICAgY29uc3QgaW50IG1heFN0YXJzID0gODA7IC8vIGFyYml0cmFyeSwgZml0cyBvbiBvbmUgbGluZQorICAgIGNoYXIgYyA9ICcqJzsKKyAgICBpZiAoc2FtcGxlIDwgLTEuMCkgeworICAgICAgICBzYW1wbGUgPSAtMS4wOworICAgICAgICBjID0gJyQnOworICAgIH0gZWxzZSBpZiAoc2FtcGxlID4gMS4wKSB7CisgICAgICAgIHNhbXBsZSA9IDEuMDsKKyAgICAgICAgYyA9ICckJzsKKyAgICB9CisgICAgaW50IG51bVNwYWNlcyA9IChpbnQpICgoKHNhbXBsZSArIDEuMCkgKiAwLjUpICogbWF4U3RhcnMpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtU3BhY2VzOyBpKyspIHsKKyAgICAgICAgcHV0Y2hhcignICcpOworICAgIH0KKyAgICBwcmludGYoIiVjXG4iLCBjKTsKK30KKworLyoKKworRklSIGZpbHRlciBkZXNpZ25lZCB3aXRoCitodHRwOi8vdC1maWx0ZXIuYXBwc3BvdC5jb20KKworc2FtcGxpbmcgZnJlcXVlbmN5OiA0ODAwMCBIegorCisqIDAgSHogLSA4MDAwIEh6CisgIGdhaW4gPSAxLjIKKyAgZGVzaXJlZCByaXBwbGUgPSA1IGRCCisgIGFjdHVhbCByaXBwbGUgPSA1LjU5NTI2NjE2OTcwMzY5MyBkQgorCisqIDEyMDAwIEh6IC0gMjAwMDAgSHoKKyAgZ2FpbiA9IDAKKyAgZGVzaXJlZCBhdHRlbnVhdGlvbiA9IC00MCBkQgorICBhY3R1YWwgYXR0ZW51YXRpb24gPSAtMzcuNTg2OTE1NjY1NzE5MTQgZEIKKworKi8KKworI2RlZmluZSBGSUxURVJfVEFQX05VTSAxMQorCitzdGF0aWMgY29uc3QgZmxvYXQgc0ZpbHRlclRhcHM4MDAwW0ZJTFRFUl9UQVBfTlVNXSA9IHsKKyAgICAgICAgLTAuMDU5NDQyMTkzNTMzNDMxODlmLAorICAgICAgICAtMC4wNzMwMzQzNDgzOTUwMzIwOGYsCisgICAgICAgIC0wLjAzNzY5MDQ4NzY3MjY4OTA2NmYsCisgICAgICAgIDAuMTg3MDQ4MDUwNjU5NjUxMmYsCisgICAgICAgIDAuMzkxMDMzNzM1NzgzNjgzM2YsCisgICAgICAgIDAuNTMzMzY3MjM4NTQyNTYzN2YsCisgICAgICAgIDAuMzkxMDMzNzM1NzgzNjgzM2YsCisgICAgICAgIDAuMTg3MDQ4MDUwNjU5NjUxMmYsCisgICAgICAgIC0wLjAzNzY5MDQ4NzY3MjY4OTA2NmYsCisgICAgICAgIC0wLjA3MzAzNDM0ODM5NTAzMjA4ZiwKKyAgICAgICAgLTAuMDU5NDQyMTkzNTMzNDMxODlmCit9OworCitjbGFzcyBMb3dQYXNzRmlsdGVyIHsKK3B1YmxpYzoKKworICAgIC8qCisgICAgICogRmlsdGVyIG9uZSBpbnB1dCBzYW1wbGUuCisgICAgICogQHJldHVybiBmaWx0ZXJlZCBvdXRwdXQKKyAgICAgKi8KKyAgICBmbG9hdCBmaWx0ZXIoZmxvYXQgaW5wdXQpIHsKKyAgICAgICAgZmxvYXQgb3V0cHV0ID0gMC4wZjsKKyAgICAgICAgbVhbbUN1cnNvcl0gPSBpbnB1dDsKKyAgICAgICAgLy8gSW5kZXggYmFja3dhcmRzIG92ZXIgeC4KKyAgICAgICAgaW50IHhJbmRleCA9IG1DdXJzb3IgKyBGSUxURVJfVEFQX05VTTsKKyAgICAgICAgLy8gV3JpdGUgdHdpY2Ugc28gd2UgYXZvaWQgaGF2aW5nIHRvIHdyYXAgaW4gdGhlIG1pZGRsZSBvZiB0aGUgY29udm9sdXRpb24uCisgICAgICAgIG1YW3hJbmRleF0gPSBpbnB1dDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBGSUxURVJfVEFQX05VTTsgaSsrKSB7CisgICAgICAgICAgICBvdXRwdXQgKz0gc0ZpbHRlclRhcHM4MDAwW2ldICogbVhbeEluZGV4LS1dOworICAgICAgICB9CisgICAgICAgIGlmICgrK21DdXJzb3IgPj0gRklMVEVSX1RBUF9OVU0pIHsKKyAgICAgICAgICAgIG1DdXJzb3IgPSAwOworICAgICAgICB9CisgICAgICAgIHJldHVybiBvdXRwdXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0cnVlIGlmIFBBU1NFRAorICAgICAqLworICAgIGJvb2wgdGVzdCgpIHsKKyAgICAgICAgLy8gTWVhc3VyZSB0aGUgaW1wdWxzZSBvZiB0aGUgZmlsdGVyIGF0IGRpZmZlcmVudCBwaGFzZXMgc28gd2UgZXhlcmNpc2UKKyAgICAgICAgLy8gYWxsIHRoZSB3cmFwYXJvdW5kIGNhc2VzIGluIHRoZSBGSVIuCisgICAgICAgIGZvciAoaW50IG9mZnNldCA9IDA7IG9mZnNldCA8IChGSUxURVJfVEFQX05VTSAqIDIpOyBvZmZzZXQrKyApIHsKKyAgICAgICAgICAgIC8vIHByaW50ZigiTG93UGFzc0ZpbHRlcjogY3Vyc29yID0gJWRcbiIsIG1DdXJzb3IpOworICAgICAgICAgICAgLy8gT2Zmc2V0IGJ5IG9uZSBlYWNoIHRpbWUuCisgICAgICAgICAgICBpZiAoZmlsdGVyKDAuMGYpICE9IDAuMGYpIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIkVSUk9SOiBmaWx0ZXIgc2hvdWxkIHJldHVybiAwLjAgYmVmb3JlIGltcHVsc2UgcmVzcG9uc2VcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgRklMVEVSX1RBUF9OVU07IGkrKykgeworICAgICAgICAgICAgICAgIGZsb2F0IG91dHB1dCA9IGZpbHRlcigoaSA9PSAwKSA/IDEuMGYgOiAwLjBmKTsgLy8gaW1wdWxzZQorICAgICAgICAgICAgICAgIGlmIChvdXRwdXQgIT0gc0ZpbHRlclRhcHM4MDAwW2ldKSB7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiRVJST1I6IGZpbHRlciBzaG91bGQgcmV0dXJuIGltcHVsc2UgcmVzcG9uc2VcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBGSUxURVJfVEFQX05VTTsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGZpbHRlcigwLjBmKSAhPSAwLjBmKSB7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiRVJST1I6IGZpbHRlciBzaG91bGQgcmV0dXJuIDAuMCBhZnRlciBpbXB1bHNlIHJlc3BvbnNlXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgZmxvYXQgICBtWFtGSUxURVJfVEFQX05VTSAqIDJde307IC8vIHR3aWNlIGFzIGJpZyBhcyBuZWVkZWQgdG8gYXZvaWQgd3JhcHBpbmcKKyAgICBpbnQzMl90IG1DdXJzb3IgPSAwOworfTsKIAogLy8gQSBuYXJyb3cgaW1wdWxzZSBzZWVtcyB0byBoYXZlIGJldHRlciBpbW11bml0eSBhZ2FpbnN0IG92ZXIgZXN0aW1hdGluZyB0aGUKIC8vIGxhdGVuY3kgZHVlIHRvIGRldGVjdGluZyBzdWJoYXJtb25pY3MgYnkgdGhlIGF1dG8tY29ycmVsYXRvci4KQEAgLTc4LDYgKzE4OSwxMiBAQAogICAgIGludDY0X3QgbVNlZWQgPSA5OTg4Nzc2NjsKIH07CiAKKwordHlwZWRlZiBzdHJ1Y3QgTGF0ZW5jeVJlcG9ydF9zIHsKKyAgICBkb3VibGUgbGF0ZW5jeUluRnJhbWVzOworICAgIGRvdWJsZSBjb25maWRlbmNlOworfSBMYXRlbmN5UmVwb3J0OworCiBzdGF0aWMgZG91YmxlIGNhbGN1bGF0ZUNvcnJlbGF0aW9uKGNvbnN0IGZsb2F0ICphLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqYiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpbmRvd1NpemUpCkBAIC0xMDEsMTMwICsyMTgsNzUgQEAKICAgICByZXR1cm4gY29ycmVsYXRpb247CiB9CiAKLXN0YXRpYyBpbnQgY2FsY3VsYXRlQ29ycmVsYXRpb25zKGNvbnN0IGZsb2F0ICpoYXlzdGFjaywgaW50IGhheXN0YWNrU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICpuZWVkbGUsIGludCBuZWVkbGVTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKnJlc3VsdHMsIGludCByZXN1bHRTaXplKQotewotICAgIGludCBtYXhDb3JyZWxhdGlvbnMgPSBoYXlzdGFja1NpemUgLSBuZWVkbGVTaXplOwotICAgIGludCBudW1Db3JyZWxhdGlvbnMgPSBzdGQ6Om1pbihtYXhDb3JyZWxhdGlvbnMsIHJlc3VsdFNpemUpOwotCi0gICAgZm9yIChpbnQgaWMgPSAwOyBpYyA8IG51bUNvcnJlbGF0aW9uczsgaWMrKykgewotICAgICAgICBkb3VibGUgY29ycmVsYXRpb24gPSBjYWxjdWxhdGVDb3JyZWxhdGlvbigmaGF5c3RhY2tbaWNdLCBuZWVkbGUsIG5lZWRsZVNpemUpOwotICAgICAgICByZXN1bHRzW2ljXSA9IGNvcnJlbGF0aW9uOwotICAgIH0KLQotICAgIHJldHVybiBudW1Db3JyZWxhdGlvbnM7Ci19Ci0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLS8qKgotICogU2NhbiB1bnRpbCB3ZSBnZXQgYSBjb3JyZWxhdGlvbiBvZiBhIHNpbmdsZSBzY2FuIHRoYXQgZ29lcyBvdmVyIHRoZSB0b2xlcmFuY2UgbGV2ZWwsCi0gKiBwZWFrcyB0aGVuIGRyb3BzIGJhY2sgZG93bi4KLSAqLwotc3RhdGljIGRvdWJsZSBmaW5kRmlyc3RNYXRjaChjb25zdCBmbG9hdCAqaGF5c3RhY2ssIGludCBoYXlzdGFja1NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICpuZWVkbGUsIGludCBuZWVkbGVTaXplLCBkb3VibGUgdGhyZXNob2xkICApCi17Ci0gICAgaW50IGljOwotICAgIC8vIEhvdyBtYW55IGNvcnJlbGF0aW9ucyBjYW4gd2UgY2FsY3VsYXRlPwotICAgIGludCBudW1Db3JyZWxhdGlvbnMgPSBoYXlzdGFja1NpemUgLSBuZWVkbGVTaXplOwotICAgIGRvdWJsZSBtYXhDb3JyZWxhdGlvbiA9IDAuMDsKLSAgICBpbnQgcGVha0luZGV4ID0gLTE7Ci0gICAgZG91YmxlIGxvY2F0aW9uID0gLTEuMDsKLSAgICBjb25zdCBkb3VibGUgYmFja1RocmVzaG9sZFNjYWxlciA9IDAuNTsKLQotICAgIGZvciAoaWMgPSAwOyBpYyA8IG51bUNvcnJlbGF0aW9uczsgaWMrKykgewotICAgICAgICBkb3VibGUgY29ycmVsYXRpb24gPSBjYWxjdWxhdGVDb3JyZWxhdGlvbigmaGF5c3RhY2tbaWNdLCBuZWVkbGUsIG5lZWRsZVNpemUpOwotCi0gICAgICAgIGlmKCAoY29ycmVsYXRpb24gPiBtYXhDb3JyZWxhdGlvbikgKSB7Ci0gICAgICAgICAgICBtYXhDb3JyZWxhdGlvbiA9IGNvcnJlbGF0aW9uOwotICAgICAgICAgICAgcGVha0luZGV4ID0gaWM7Ci0gICAgICAgIH0KLQotICAgICAgICAvL3ByaW50ZigiUGFRYV9GaW5kRmlyc3RNYXRjaDogaWMgPSAlNGQsIGNvcnJlbGF0aW9uID0gJThmLCBtYXhTdW0gPSAlOGZcbiIsCi0gICAgICAgIC8vICAgIGljLCBjb3JyZWxhdGlvbiwgbWF4U3VtICk7Ci0gICAgICAgIC8vIEFyZSB3ZSBwYXN0IHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8KLSAgICAgICAgaWYoKG1heENvcnJlbGF0aW9uID4gdGhyZXNob2xkKSAmJiAoY29ycmVsYXRpb24gPCBiYWNrVGhyZXNob2xkU2NhbGVyICogbWF4Q29ycmVsYXRpb24pKSB7Ci0gICAgICAgICAgICBsb2NhdGlvbiA9IHBlYWtJbmRleDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIGxvY2F0aW9uOwotfQotCi10eXBlZGVmIHN0cnVjdCBMYXRlbmN5UmVwb3J0X3MgewotICAgIGRvdWJsZSBsYXRlbmN5SW5GcmFtZXM7Ci0gICAgZG91YmxlIGNvbmZpZGVuY2U7Ci19IExhdGVuY3lSZXBvcnQ7Ci0KLS8vIEFwcGx5IGEgdGVjaG5pcXVlIHNpbWlsYXIgdG8gSGFybW9uaWMgUHJvZHVjdCBTcGVjdHJ1bSBBbmFseXNpcyB0byBmaW5kIGVjaG8gZnVuZGFtZW50YWwuCi0vLyBVc2luZyBmaXJzdCBlY2hvIGluc3RlYWQgb2YgdGhlIG9yaWdpbmFsIGltcHVsc2UgZm9yIGEgYmV0dGVyIG1hdGNoLgotc3RhdGljIGludCBtZWFzdXJlTGF0ZW5jeUZyb21FY2hvcyhjb25zdCBmbG9hdCAqaGF5c3RhY2ssIGludCBoYXlzdGFja1NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKm5lZWRsZSwgaW50IG5lZWRsZVNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTGF0ZW5jeVJlcG9ydCAqcmVwb3J0KSB7Ci0gICAgY29uc3QgZG91YmxlIHRocmVzaG9sZCA9IDAuMTsKLSAgICBwcmludGYoIm1lYXN1cmVMYXRlbmN5RnJvbUVjaG9zOiBoYXlzdGFja1NpemUgPSAlZCwgbmVlZGxlU2l6ZSA9ICVkXG4iLAotICAgICAgICAgICBoYXlzdGFja1NpemUsIG5lZWRsZVNpemUpOwotCi0gICAgLy8gRmluZCBmaXJzdCBwZWFrCi0gICAgaW50IGZpcnN0ID0gKGludCkgKGZpbmRGaXJzdE1hdGNoKGhheXN0YWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXlzdGFja1NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZGxlU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZXNob2xkKSArIDAuNSk7Ci0KLSAgICAvLyBVc2UgZmlyc3QgZWNobyBhcyB0aGUgbmVlZGxlIGZvciB0aGUgb3RoZXIgZWNob3MgYmVjYXVzZQotICAgIC8vIGl0IHdpbGwgYmUgbW9yZSBzaW1pbGFyLgotICAgIG5lZWRsZSA9ICZoYXlzdGFja1tmaXJzdF07Ci0gICAgaW50IGFnYWluID0gKGludCkgKGZpbmRGaXJzdE1hdGNoKGhheXN0YWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXlzdGFja1NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZGxlU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZXNob2xkKSArIDAuNSk7Ci0KLSAgICBwcmludGYoIm1lYXN1cmVMYXRlbmN5RnJvbUVjaG9zOiBmaXJzdCA9ICVkLCBhZ2FpbiBhdCAlZFxuIiwgZmlyc3QsIGFnYWluKTsKLSAgICBmaXJzdCA9IGFnYWluOwotCitzdGF0aWMgaW50IG1lYXN1cmVMYXRlbmN5RnJvbUVjaG9zKGNvbnN0IGZsb2F0ICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bUZsb2F0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMYXRlbmN5UmVwb3J0ICpyZXBvcnQpIHsKICAgICAvLyBBbGxvY2F0ZSByZXN1bHRzIGFycmF5Ci0gICAgaW50IHJlbWFpbmluZyA9IGhheXN0YWNrU2l6ZSAtIGZpcnN0OwotICAgIGNvbnN0IGludCBtYXhSZWFzb25hYmxlTGF0ZW5jeUZyYW1lcyA9IDQ4MDAwICogMjsgLy8gYXJiaXRyYXJ5IGJ1dCBnZW5lcm91cyB2YWx1ZQotICAgIGludCBudW1Db3JyZWxhdGlvbnMgPSBzdGQ6Om1pbihyZW1haW5pbmcsIG1heFJlYXNvbmFibGVMYXRlbmN5RnJhbWVzKTsKLSAgICBmbG9hdCAqY29ycmVsYXRpb25zID0gbmV3IGZsb2F0W251bUNvcnJlbGF0aW9uc107Ci0gICAgZmxvYXQgKmhhcm1vbmljU3VtcyA9IG5ldyBmbG9hdFtudW1Db3JyZWxhdGlvbnNdKCk7IC8vIHNldCB0byB6ZXJvCisgICAgY29uc3QgaW50IG1pblJlYXNvbmFibGVMYXRlbmN5RnJhbWVzID0gc2FtcGxlUmF0ZSAqIGtNaW5MYXRlbmN5TWlsbGlzIC8ga01pbGxpc1BlclNlY29uZDsKKyAgICBjb25zdCBpbnQgbWF4UmVhc29uYWJsZUxhdGVuY3lGcmFtZXMgPSBzYW1wbGVSYXRlICoga01heExhdGVuY3lNaWxsaXMgLyBrTWlsbGlzUGVyU2Vjb25kOworICAgIGludDMyX3QgbWF4Q29ycmVsYXRpb25TaXplID0gbWF4UmVhc29uYWJsZUxhdGVuY3lGcmFtZXMgKiAzOworICAgIGludCBudW1Db3JyZWxhdGlvbnMgPSBzdGQ6Om1pbihudW1GbG9hdHMsIG1heENvcnJlbGF0aW9uU2l6ZSk7CisgICAgZmxvYXQgKmNvcnJlbGF0aW9ucyA9IG5ldyBmbG9hdFtudW1Db3JyZWxhdGlvbnNde307CisgICAgZmxvYXQgKmhhcm1vbmljU3VtcyA9IG5ldyBmbG9hdFtudW1Db3JyZWxhdGlvbnNde307CiAKLSAgICAvLyBHZW5lcmF0ZSBjb3JyZWxhdGlvbiBmb3IgZXZlcnkgcG9zaXRpb24uCi0gICAgbnVtQ29ycmVsYXRpb25zID0gY2FsY3VsYXRlQ29ycmVsYXRpb25zKCZoYXlzdGFja1tmaXJzdF0sIHJlbWFpbmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZGxlLCBuZWVkbGVTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbnMsIG51bUNvcnJlbGF0aW9ucyk7CisgICAgLy8gUGVyZm9ybSBzbGlkaW5nIGF1dG8tY29ycmVsYXRpb24uCisgICAgLy8gU2tpcCBmaXJzdCBmcmFtZXMgdG8gYXZvaWQgaHVnZSBwZWFrIGF0IHplcm8gb2Zmc2V0LgorICAgIGZvciAoaW50IGkgPSBtaW5SZWFzb25hYmxlTGF0ZW5jeUZyYW1lczsgaSA8IG51bUNvcnJlbGF0aW9uczsgaSsrKSB7CisgICAgICAgIGludDMyX3QgcmVtYWluaW5nID0gbnVtRmxvYXRzIC0gaTsKKyAgICAgICAgZmxvYXQgY29ycmVsYXRpb24gPSAoZmxvYXQpIGNhbGN1bGF0ZUNvcnJlbGF0aW9uKCZkYXRhW2ldLCBkYXRhLCByZW1haW5pbmcpOworICAgICAgICBjb3JyZWxhdGlvbnNbaV0gPSBjb3JyZWxhdGlvbjsKKyAgICAgICAgLy8gcHJpbnRmKCJjb3JyZWxhdGlvblslZF0gPSAlZlxuIiwgaWMsIGNvcnJlbGF0aW9uKTsKKyAgICB9CiAKLSAgICAvLyBBZGQgaGlnaGVyIGhhcm1vbmljcyBtYXBwZWQgb250byBsb3dlciBoYXJtb25pY3MuCi0gICAgLy8gVGhpcyByZWluZm9yY2VzIHRoZSAiZnVuZGFtZW50YWwiIGVjaG8uCi0gICAgY29uc3QgaW50IG51bUVjaG9lcyA9IDEwOworICAgIC8vIEFwcGx5IGEgdGVjaG5pcXVlIHNpbWlsYXIgdG8gSGFybW9uaWMgUHJvZHVjdCBTcGVjdHJ1bSBBbmFseXNpcyB0byBmaW5kIGVjaG8gZnVuZGFtZW50YWwuCisgICAgLy8gQWRkIGhpZ2hlciBoYXJtb25pY3MgbWFwcGVkIG9udG8gbG93ZXIgaGFybW9uaWNzLiBUaGlzIHJlaW5mb3JjZXMgdGhlICJmdW5kYW1lbnRhbCIgZWNoby4KKyAgICBjb25zdCBpbnQgbnVtRWNob2VzID0gODsKICAgICBmb3IgKGludCBwYXJ0aWFsID0gMTsgcGFydGlhbCA8IG51bUVjaG9lczsgcGFydGlhbCsrKSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQ29ycmVsYXRpb25zOyBpKyspIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IG1pblJlYXNvbmFibGVMYXRlbmN5RnJhbWVzOyBpIDwgbnVtQ29ycmVsYXRpb25zOyBpKyspIHsKICAgICAgICAgICAgIGhhcm1vbmljU3Vtc1tpIC8gcGFydGlhbF0gKz0gY29ycmVsYXRpb25zW2ldIC8gcGFydGlhbDsKICAgICAgICAgfQogICAgIH0KIAogICAgIC8vIEZpbmQgaGlnaGVzdCBwZWFrIGluIGNvcnJlbGF0aW9uIGFycmF5LgogICAgIGZsb2F0IG1heENvcnJlbGF0aW9uID0gMC4wOwotICAgIGZsb2F0IHN1bU9mUGVha3MgPSAwLjA7CiAgICAgaW50IHBlYWtJbmRleCA9IDA7Ci0gICAgY29uc3QgaW50IHNraXAgPSBNQVhfWkVST1RIX1BBUlRJQUxfQklOUzsgLy8gc2tpcCBsb3cgYmlucwotICAgIGZvciAoaW50IGkgPSBza2lwOyBpIDwgbnVtQ29ycmVsYXRpb25zOyBpKyspIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUNvcnJlbGF0aW9uczsgaSsrKSB7CiAgICAgICAgIGlmIChoYXJtb25pY1N1bXNbaV0gPiBtYXhDb3JyZWxhdGlvbikgewogICAgICAgICAgICAgbWF4Q29ycmVsYXRpb24gPSBoYXJtb25pY1N1bXNbaV07Ci0gICAgICAgICAgICBzdW1PZlBlYWtzICs9IG1heENvcnJlbGF0aW9uOwogICAgICAgICAgICAgcGVha0luZGV4ID0gaTsKLSAgICAgICAgICAgIHByaW50ZigibWF4Q29ycmVsYXRpb24gPSAlZiBhdCAlZFxuIiwgbWF4Q29ycmVsYXRpb24sIHBlYWtJbmRleCk7CisgICAgICAgICAgICAvLyBwcmludGYoIm1heENvcnJlbGF0aW9uID0gJWYgYXQgJWRcbiIsIG1heENvcnJlbGF0aW9uLCBwZWFrSW5kZXgpOwogICAgICAgICB9CiAgICAgfQotCiAgICAgcmVwb3J0LT5sYXRlbmN5SW5GcmFtZXMgPSBwZWFrSW5kZXg7Ci0gICAgaWYgKHN1bU9mUGVha3MgPCAwLjAwMDEpIHsKKy8qCisgICAgeworICAgICAgICBpbnQzMl90IHRvcFBlYWsgPSBwZWFrSW5kZXggKiA3IC8gMjsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0b3BQZWFrOyBpKyspIHsKKyAgICAgICAgICAgIGZsb2F0IHNhbXBsZSA9IGhhcm1vbmljU3Vtc1tpXTsKKyAgICAgICAgICAgIHByaW50ZigiJTRkOiAlNy41ZiAiLCBpLCBzYW1wbGUpOworICAgICAgICAgICAgcHJpbnRBdWRpb1Njb3BlKHNhbXBsZSk7CisgICAgICAgIH0KKyAgICB9CisqLworCisgICAgLy8gQ2FsY3VsYXRlIGNvbmZpZGVuY2UuCisgICAgaWYgKG1heENvcnJlbGF0aW9uIDwgMC4wMDEpIHsKICAgICAgICAgcmVwb3J0LT5jb25maWRlbmNlID0gMC4wOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlcG9ydC0+Y29uZmlkZW5jZSA9IG1heENvcnJlbGF0aW9uIC8gc3VtT2ZQZWFrczsKKyAgICAgICAgLy8gQ29tcGFyZSBwZWFrIHRvIGF2ZXJhZ2UgdmFsdWUgYXJvdW5kIHBlYWsuCisgICAgICAgIGludDMyX3QgbnVtU2FtcGxlcyA9IHN0ZDo6bWluKG51bUNvcnJlbGF0aW9ucywgcGVha0luZGV4ICogMik7CisgICAgICAgIGlmIChudW1TYW1wbGVzIDw9IDApIHsKKyAgICAgICAgICAgIHJlcG9ydC0+Y29uZmlkZW5jZSA9IDAuMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRvdWJsZSBzdW0gPSAwLjA7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVNhbXBsZXM7IGkrKykgeworICAgICAgICAgICAgICAgIHN1bSArPSBoYXJtb25pY1N1bXNbaV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb25zdCBkb3VibGUgYXZlcmFnZSA9IHN1bSAvIG51bVNhbXBsZXM7CisgICAgICAgICAgICBjb25zdCBkb3VibGUgcmF0aW8gPSBhdmVyYWdlIC8gbWF4Q29ycmVsYXRpb247IC8vIHdpbGwgYmUgPCAxLjAKKyAgICAgICAgICAgIHJlcG9ydC0+Y29uZmlkZW5jZSA9IDEuMCAtIHNxcnQocmF0aW8pOworICAgICAgICB9CiAgICAgfQogCiAgICAgZGVsZXRlW10gY29ycmVsYXRpb25zOwpAQCAtMzIwLDcgKzM4Miw5IEBACiAgICAgICAgIH0KIAogICAgICAgICBhc3NlcnQoaW5mby5jaGFubmVscyA9PSAxKTsKKyAgICAgICAgYXNzZXJ0KGluZm8uZm9ybWF0ID09IFNGX0ZPUk1BVF9GTE9BVCk7CiAKKyAgICAgICAgc2V0U2FtcGxlUmF0ZShpbmZvLnNhbXBsZXJhdGUpOwogICAgICAgICBhbGxvY2F0ZShpbmZvLmZyYW1lcyk7CiAgICAgICAgIG1GcmFtZUNvdW50ZXIgPSBzZl9yZWFkZl9mbG9hdChzbmRGaWxlLCBtRGF0YSwgaW5mby5mcmFtZXMpOwogCkBAIC0zMjgsMTEgKzM5Miw0OSBAQAogICAgICAgICByZXR1cm4gbUZyYW1lQ291bnRlcjsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBTcXVhcmUgdGhlIHNhbXBsZXMgc28gdGhleSBhcmUgYWxsIHBvc2l0aXZlIGFuZCBzbyB0aGUgcGVha3MgYXJlIGVtcGhhc2l6ZWQuCisgICAgICovCisgICAgdm9pZCBzcXVhcmUoKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbUZyYW1lQ291bnRlcjsgaSsrKSB7CisgICAgICAgICAgICBjb25zdCBmbG9hdCBzYW1wbGUgPSBtRGF0YVtpXTsKKyAgICAgICAgICAgIG1EYXRhW2ldID0gc2FtcGxlICogc2FtcGxlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogTG93IHBhc3MgZmlsdGVyIHRoZSByZWNvcmRpbmcgdXNpbmcgYSBzaW1wbGUgRklSIGZpbHRlci4KKyAgICAgKiBOb3RlIHRoYXQgdGhlIGxvd3Bhc3MgZmlsdGVyIGN1dG9mZiB0cmFja3MgdGhlIHNhbXBsZSByYXRlLgorICAgICAqIFRoYXQgaXMgT0sgYmVjYXVzZSB0aGUgaW1wdWxzZSB3aWR0aCBpcyBhIGZpeGVkIG51bWJlciBvZiBzYW1wbGVzLgorICAgICAqLworICAgIHZvaWQgbG93UGFzc0ZpbHRlcigpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtRnJhbWVDb3VudGVyOyBpKyspIHsKKyAgICAgICAgICAgIG1EYXRhW2ldID0gbUxvd1Bhc3NGaWx0ZXIuZmlsdGVyKG1EYXRhW2ldKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbW92ZSBEQyBvZmZzZXQgdXNpbmcgYSBvbmUtcG9sZSBvbmUtemVybyBJSVIgZmlsdGVyLgorICAgICAqLworICAgIHZvaWQgZGNCbG9ja2VyKCkgeworICAgICAgICBjb25zdCBmbG9hdCBSID0gMC45OTY7IC8vIG5hcnJvdyBub3RjaCBhdCB6ZXJvIEh6CisgICAgICAgIGZsb2F0IHgxID0gMC4wOworICAgICAgICBmbG9hdCB5MSA9IDAuMDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtRnJhbWVDb3VudGVyOyBpKyspIHsKKyAgICAgICAgICAgIGNvbnN0IGZsb2F0IHggPSBtRGF0YVtpXTsKKyAgICAgICAgICAgIGNvbnN0IGZsb2F0IHkgPSB4IC0geDEgKyAoUiAqIHkxKTsKKyAgICAgICAgICAgIG1EYXRhW2ldID0geTsKKyAgICAgICAgICAgIHkxID0geTsKKyAgICAgICAgICAgIHgxID0geDsKKyAgICAgICAgfQorICAgIH0KKwogcHJpdmF0ZToKLSAgICBmbG9hdCAgKm1EYXRhID0gbnVsbHB0cjsKLSAgICBpbnQzMl90IG1GcmFtZUNvdW50ZXIgPSAwOwotICAgIGludDMyX3QgbU1heEZyYW1lcyA9IDA7Ci0gICAgaW50MzJfdCBtU2FtcGxlUmF0ZSA9IDQ4MDAwOyAvLyBjb21tb24gZGVmYXVsdAorICAgIGZsb2F0ICAgICAgICAqbURhdGEgPSBudWxscHRyOworICAgIGludDMyX3QgICAgICAgbUZyYW1lQ291bnRlciA9IDA7CisgICAgaW50MzJfdCAgICAgICBtTWF4RnJhbWVzID0gMDsKKyAgICBpbnQzMl90ICAgICAgIG1TYW1wbGVSYXRlID0ga0RlZmF1bHRTYW1wbGVSYXRlOyAvLyBjb21tb24gZGVmYXVsdAorICAgIExvd1Bhc3NGaWx0ZXIgbUxvd1Bhc3NGaWx0ZXI7CiB9OwogCiAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KQEAgLTM1Miw4ICs0NTQsMTIgQEAKIAogICAgIHZpcnR1YWwgdm9pZCBwcmludFN0YXR1cygpIHt9OwogCi0gICAgdmlydHVhbCBpbnQgZ2V0UmVzdWx0KCkgewotICAgICAgICByZXR1cm4gLTE7CisgICAgaW50MzJfdCBnZXRSZXN1bHQoKSB7CisgICAgICAgIHJldHVybiBtUmVzdWx0OworICAgIH0KKworICAgIHZvaWQgc2V0UmVzdWx0KGludDMyX3QgcmVzdWx0KSB7CisgICAgICAgIG1SZXN1bHQgPSByZXN1bHQ7CiAgICAgfQogCiAgICAgdmlydHVhbCBib29sIGlzRG9uZSgpIHsKQEAgLTM4Miw3ICs0ODgsNyBAQAogICAgIHN0YXRpYyBmbG9hdCBtZWFzdXJlUGVha0FtcGxpdHVkZShmbG9hdCAqaW5wdXREYXRhLCBpbnQgaW5wdXRDaGFubmVsQ291bnQsIGludCBudW1GcmFtZXMpIHsKICAgICAgICAgZmxvYXQgcGVhayA9IDAuMGY7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtRnJhbWVzOyBpKyspIHsKLSAgICAgICAgICAgIGZsb2F0IHBvcyA9IGZhYnMoKmlucHV0RGF0YSk7CisgICAgICAgICAgICBjb25zdCBmbG9hdCBwb3MgPSBmYWJzKCppbnB1dERhdGEpOwogICAgICAgICAgICAgaWYgKHBvcyA+IHBlYWspIHsKICAgICAgICAgICAgICAgICBwZWFrID0gcG9zOwogICAgICAgICAgICAgfQpAQCAtMzkzLDcgKzQ5OSw4IEBACiAKIAogcHJpdmF0ZToKLSAgICBpbnQzMl90IG1TYW1wbGVSYXRlID0gTE9PUEJBQ0tfU0FNUExFX1JBVEU7CisgICAgaW50MzJfdCBtU2FtcGxlUmF0ZSA9IGtEZWZhdWx0U2FtcGxlUmF0ZTsKKyAgICBpbnQzMl90IG1SZXN1bHQgPSAwOwogfTsKIAogY2xhc3MgUGVha0RldGVjdG9yIHsKQEAgLTQxMiwyNCArNTE5LDYgQEAKICAgICBmbG9hdCAgbVByZXZpb3VzID0gMC4wZjsKIH07CiAKLQotc3RhdGljIHZvaWQgcHJpbnRBdWRpb1Njb3BlKGZsb2F0IHNhbXBsZSkgewotICAgIGNvbnN0IGludCBtYXhTdGFycyA9IDgwOyAvLyBhcmJpdHJhcnksIGZpdHMgb24gb25lIGxpbmUKLSAgICBjaGFyIGMgPSAnKic7Ci0gICAgaWYgKHNhbXBsZSA8IC0xLjApIHsKLSAgICAgICAgc2FtcGxlID0gLTEuMDsKLSAgICAgICAgYyA9ICckJzsKLSAgICB9IGVsc2UgaWYgKHNhbXBsZSA+IDEuMCkgewotICAgICAgICBzYW1wbGUgPSAxLjA7Ci0gICAgICAgIGMgPSAnJCc7Ci0gICAgfQotICAgIGludCBudW1TcGFjZXMgPSAoaW50KSAoKChzYW1wbGUgKyAxLjApICogMC41KSAqIG1heFN0YXJzKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVNwYWNlczsgaSsrKSB7Ci0gICAgICAgIHB1dGNoYXIoJyAnKTsKLSAgICB9Ci0gICAgcHJpbnRmKCIlY1xuIiwgYyk7Ci19Ci0KIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogLyoqCiAgKiBNZWFzdXJlIGxhdGVuY3kgZ2l2ZW4gYSBsb29wYmFjayBzdHJlYW0gZGF0YS4KQEAgLTQ1MCwxNyArNTM5LDEzIEBACiAgICAgfQogCiAgICAgdm9pZCByZXNldCgpIG92ZXJyaWRlIHsKLSAgICAgICAgbURvd25Db3VudGVyID0gMjAwOworICAgICAgICBtRG93bkNvdW50ZXIgPSBnZXRTYW1wbGVSYXRlKCkgLyAyOwogICAgICAgICBtTG9vcENvdW50ZXIgPSAwOwogICAgICAgICBtTWVhc3VyZWRMb29wR2FpbiA9IDAuMGY7CiAgICAgICAgIG1FY2hvR2FpbiA9IDEuMGY7CiAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX0lOSVRJQUxfU0lMRU5DRTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIGludCBnZXRSZXN1bHQoKSB7Ci0gICAgICAgIHJldHVybiBtU3RhdGUgPT0gU1RBVEVfRE9ORSA/IDAgOiAtMTsKLSAgICB9Ci0KICAgICB2aXJ0dWFsIGJvb2wgaXNEb25lKCkgewogICAgICAgICByZXR1cm4gbVN0YXRlID09IFNUQVRFX0RPTkUgfHwgbVN0YXRlID09IFNUQVRFX0ZBSUxFRDsKICAgICB9CkBAIC00NzMsMjcgKzU1OCw1NyBAQAogICAgICAgICByZXR1cm4gbUVjaG9HYWluOwogICAgIH0KIAotICAgIHZvaWQgcmVwb3J0KCkgb3ZlcnJpZGUgeworICAgIGJvb2wgdGVzdExvd1Bhc3NGaWx0ZXIoKSB7CisgICAgICAgIExvd1Bhc3NGaWx0ZXIgZmlsdGVyOworICAgICAgICByZXR1cm4gZmlsdGVyLnRlc3QoKTsKKyAgICB9CiAKKyAgICB2b2lkIHJlcG9ydCgpIG92ZXJyaWRlIHsKICAgICAgICAgcHJpbnRmKCJFY2hvQW5hbHl6ZXIgLS0tLS0tLS0tLS0tLS0tXG4iKTsKLSAgICAgICAgcHJpbnRmKExPT1BCQUNLX1JFU1VMVF9UQUcgIm1lYXN1cmVkLmdhaW4gICAgICAgICAgPSAlZlxuIiwgbU1lYXN1cmVkTG9vcEdhaW4pOwotICAgICAgICBwcmludGYoTE9PUEJBQ0tfUkVTVUxUX1RBRyAiZWNoby5nYWluICAgICAgICAgICAgICA9ICVmXG4iLCBtRWNob0dhaW4pOwotICAgICAgICBwcmludGYoTE9PUEJBQ0tfUkVTVUxUX1RBRyAidGVzdC5zdGF0ZSAgICAgICAgICAgICA9ICVkXG4iLCBtU3RhdGUpOwotICAgICAgICBpZiAobU1lYXN1cmVkTG9vcEdhaW4gPj0gMC45OTk5KSB7CisgICAgICAgIGlmIChnZXRSZXN1bHQoKSAhPSAwKSB7CisgICAgICAgICAgICBwcmludGYoTE9PUEJBQ0tfUkVTVUxUX1RBRyAicmVzdWx0ICAgICAgICAgID0gJWRcbiIsIGdldFJlc3VsdCgpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHByaW50ZigiTG93UGFzc0ZpbHRlciB0ZXN0ICVzXG4iLCB0ZXN0TG93UGFzc0ZpbHRlcigpID8gIlBBU1NFRCIgOiAiRkFJTEVEIik7CisKKyAgICAgICAgcHJpbnRmKExPT1BCQUNLX1JFU1VMVF9UQUcgIm1lYXN1cmVkLmdhaW4gICAgICAgICAgPSAlOGZcbiIsIG1NZWFzdXJlZExvb3BHYWluKTsKKyAgICAgICAgcHJpbnRmKExPT1BCQUNLX1JFU1VMVF9UQUcgImVjaG8uZ2FpbiAgICAgICAgICAgICAgPSAlOGZcbiIsIG1FY2hvR2Fpbik7CisgICAgICAgIHByaW50ZihMT09QQkFDS19SRVNVTFRfVEFHICJ0ZXN0LnN0YXRlICAgICAgICAgICAgID0gJThkXG4iLCBtU3RhdGUpOworICAgICAgICBwcmludGYoTE9PUEJBQ0tfUkVTVUxUX1RBRyAidGVzdC5zdGF0ZS5uYW1lICAgICAgICA9ICU4c1xuIiwgY29udmVydFN0YXRlVG9UZXh0KG1TdGF0ZSkpOworCisgICAgICAgIGlmIChtU3RhdGUgPT0gU1RBVEVfV0FJVElOR19GT1JfU0lMRU5DRSkgeworICAgICAgICAgICAgcHJpbnRmKCJXQVJOSU5HIC0gU3R1Y2sgd2FpdGluZyBmb3Igc2lsZW5jZS4gSW5wdXQgbWF5IGJlIHRvbyBub2lzeSFcbiIpOworICAgICAgICAgICAgc2V0UmVzdWx0KEVSUk9SX05PSVNZKTsKKyAgICAgICAgfSBlbHNlIGlmIChtTWVhc3VyZWRMb29wR2FpbiA+PSAwLjk5OTkpIHsKICAgICAgICAgICAgIHByaW50ZigiICAgRVJST1IgLSBjbGlwcGluZywgdHVybiBkb3duIHZvbHVtZSBzbGlnaHRseVxuIik7CisgICAgICAgICAgICBzZXRSZXN1bHQoRVJST1JfQ0xJUFBJTkcpOworICAgICAgICB9IGVsc2UgaWYgKG1TdGF0ZSAhPSBTVEFURV9ET05FICYmIG1TdGF0ZSAhPSBTVEFURV9HQVRIRVJJTkdfRUNIT1MpIHsKKyAgICAgICAgICAgIHByaW50ZigiV0FSTklORyAtIEJhZCBzdGF0ZS4gQ2hlY2sgdm9sdW1lIG9uIGRldmljZS5cbiIpOworICAgICAgICAgICAgc2V0UmVzdWx0KEVSUk9SX0lOVkFMSURfU1RBVEUpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY29uc3QgZmxvYXQgKm5lZWRsZSA9IHNfSW1wdWxzZTsKLSAgICAgICAgICAgIGludCBuZWVkbGVTaXplID0gKGludCkgKHNpemVvZihzX0ltcHVsc2UpIC8gc2l6ZW9mKGZsb2F0KSk7Ci0gICAgICAgICAgICBmbG9hdCAqaGF5c3RhY2sgPSBtQXVkaW9SZWNvcmRpbmcuZ2V0RGF0YSgpOwotICAgICAgICAgICAgaW50IGhheXN0YWNrU2l6ZSA9IG1BdWRpb1JlY29yZGluZy5zaXplKCk7Ci0gICAgICAgICAgICBtZWFzdXJlTGF0ZW5jeUZyb21FY2hvcyhoYXlzdGFjaywgaGF5c3RhY2tTaXplLCBuZWVkbGUsIG5lZWRsZVNpemUsICZtTGF0ZW5jeVJlcG9ydCk7Ci0gICAgICAgICAgICBpZiAobUxhdGVuY3lSZXBvcnQuY29uZmlkZW5jZSA8IDAuMDEpIHsKLSAgICAgICAgICAgICAgICBwcmludGYoIiAgIEVSUk9SIC0gY29uZmlkZW5jZSB0b28gbG93ID0gJWZcbiIsIG1MYXRlbmN5UmVwb3J0LmNvbmZpZGVuY2UpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBkb3VibGUgbGF0ZW5jeU1pbGxpcyA9IDEwMDAuMCAqIG1MYXRlbmN5UmVwb3J0LmxhdGVuY3lJbkZyYW1lcyAvIGdldFNhbXBsZVJhdGUoKTsKLSAgICAgICAgICAgICAgICBwcmludGYoTE9PUEJBQ0tfUkVTVUxUX1RBRyAibGF0ZW5jeS5mcmFtZXMgICAgICAgID0gJTguMmZcbiIsIG1MYXRlbmN5UmVwb3J0LmxhdGVuY3lJbkZyYW1lcyk7Ci0gICAgICAgICAgICAgICAgcHJpbnRmKExPT1BCQUNLX1JFU1VMVF9UQUcgImxhdGVuY3kubXNlYyAgICAgICAgICA9ICU4LjJmXG4iLCBsYXRlbmN5TWlsbGlzKTsKLSAgICAgICAgICAgICAgICBwcmludGYoTE9PUEJBQ0tfUkVTVUxUX1RBRyAibGF0ZW5jeS5jb25maWRlbmNlICAgID0gJTguNmZcbiIsIG1MYXRlbmN5UmVwb3J0LmNvbmZpZGVuY2UpOworICAgICAgICAgICAgLy8gQ2xlYW51cCB0aGUgc2lnbmFsIHRvIGltcHJvdmUgdGhlIGF1dG8tY29ycmVsYXRpb24uCisgICAgICAgICAgICBtQXVkaW9SZWNvcmRpbmcuZGNCbG9ja2VyKCk7CisgICAgICAgICAgICBtQXVkaW9SZWNvcmRpbmcuc3F1YXJlKCk7CisgICAgICAgICAgICBtQXVkaW9SZWNvcmRpbmcubG93UGFzc0ZpbHRlcigpOworCisgICAgICAgICAgICBwcmludGYoIlBsZWFzZSB3YWl0IHNldmVyYWwgc2Vjb25kcyBmb3IgYXV0by1jb3JyZWxhdGlvbiB0byBjb21wbGV0ZS5cbiIpOworICAgICAgICAgICAgbWVhc3VyZUxhdGVuY3lGcm9tRWNob3MobUF1ZGlvUmVjb3JkaW5nLmdldERhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BdWRpb1JlY29yZGluZy5zaXplKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRTYW1wbGVSYXRlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbUxhdGVuY3lSZXBvcnQpOworCisgICAgICAgICAgICBkb3VibGUgbGF0ZW5jeU1pbGxpcyA9IGtNaWxsaXNQZXJTZWNvbmQgKiAoZG91YmxlKSBtTGF0ZW5jeVJlcG9ydC5sYXRlbmN5SW5GcmFtZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyBnZXRTYW1wbGVSYXRlKCk7CisgICAgICAgICAgICBwcmludGYoTE9PUEJBQ0tfUkVTVUxUX1RBRyAibGF0ZW5jeS5mcmFtZXMgICAgICAgICA9ICU4LjJmXG4iLAorICAgICAgICAgICAgICAgICAgIG1MYXRlbmN5UmVwb3J0LmxhdGVuY3lJbkZyYW1lcyk7CisgICAgICAgICAgICBwcmludGYoTE9PUEJBQ0tfUkVTVUxUX1RBRyAibGF0ZW5jeS5tc2VjICAgICAgICAgICA9ICU4LjJmXG4iLAorICAgICAgICAgICAgICAgICAgIGxhdGVuY3lNaWxsaXMpOworICAgICAgICAgICAgcHJpbnRmKExPT1BCQUNLX1JFU1VMVF9UQUcgImxhdGVuY3kuY29uZmlkZW5jZSAgICAgPSAlOC42ZlxuIiwKKyAgICAgICAgICAgICAgICAgICBtTGF0ZW5jeVJlcG9ydC5jb25maWRlbmNlKTsKKyAgICAgICAgICAgIGlmIChtTGF0ZW5jeVJlcG9ydC5jb25maWRlbmNlIDwga01pbmltdW1Db25maWRlbmNlKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCIgICBFUlJPUiAtIGNvbmZpZGVuY2UgdG9vIGxvdyFcbiIpOworICAgICAgICAgICAgICAgIHNldFJlc3VsdChFUlJPUl9DT05GSURFTkNFKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTUxOSw2ICs2MzQsMTEgQEAKICAgICAgICAgc2VuZEltcHVsc2VzKG91dHB1dERhdGEsIG91dHB1dENoYW5uZWxDb3VudCwga0ltcHVsc2VTaXplSW5GcmFtZXMpOwogICAgIH0KIAorICAgIC8vIEByZXR1cm4gbnVtYmVyIG9mIGZyYW1lcyBmb3IgYSB0eXBpY2FsIGJsb2NrIG9mIHByb2Nlc3NpbmcKKyAgICBpbnQzMl90IGdldEJsb2NrRnJhbWVzKCkgeworICAgICAgICByZXR1cm4gZ2V0U2FtcGxlUmF0ZSgpIC8gODsKKyAgICB9CisKICAgICB2b2lkIHByb2Nlc3MoZmxvYXQgKmlucHV0RGF0YSwgaW50IGlucHV0Q2hhbm5lbENvdW50LAogICAgICAgICAgICAgICAgICBmbG9hdCAqb3V0cHV0RGF0YSwgaW50IG91dHB1dENoYW5uZWxDb3VudCwKICAgICAgICAgICAgICAgICAgaW50IG51bUZyYW1lcykgb3ZlcnJpZGUgewpAQCAtNTI3LDcgKzY0Nyw3IEBACiAgICAgICAgIGludCBudW1Xcml0dGVuOwogICAgICAgICBpbnQgbnVtU2FtcGxlczsKIAotICAgICAgICBlY2hvX3N0YXRlX3QgbmV4dFN0YXRlID0gbVN0YXRlOworICAgICAgICBlY2hvX3N0YXRlIG5leHRTdGF0ZSA9IG1TdGF0ZTsKIAogICAgICAgICBzd2l0Y2ggKG1TdGF0ZSkgewogICAgICAgICAgICAgY2FzZSBTVEFURV9JTklUSUFMX1NJTEVOQ0U6CkBAIC01MzYsMTAgKzY1NiwxMSBAQAogICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtU2FtcGxlczsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgIG91dHB1dERhdGFbaV0gPSAwOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobURvd25Db3VudGVyLS0gPD0gMCkgeworICAgICAgICAgICAgICAgIG1Eb3duQ291bnRlciAtPSBudW1GcmFtZXM7CisgICAgICAgICAgICAgICAgaWYgKG1Eb3duQ291bnRlciA8PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIG5leHRTdGF0ZSA9IFNUQVRFX01FQVNVUklOR19HQUlOOwogICAgICAgICAgICAgICAgICAgICAvL3ByaW50ZigiJTVkOiBzd2l0Y2ggdG8gU1RBVEVfTUVBU1VSSU5HX0dBSU5cbiIsIG1Mb29wQ291bnRlcik7Ci0gICAgICAgICAgICAgICAgICAgIG1Eb3duQ291bnRlciA9IDg7CisgICAgICAgICAgICAgICAgICAgIG1Eb3duQ291bnRlciA9IGdldEJsb2NrRnJhbWVzKCkgKiAyOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKIApAQCAtNTQ4LDE0ICs2NjksMTYgQEAKICAgICAgICAgICAgICAgICBwZWFrID0gbWVhc3VyZVBlYWtBbXBsaXR1ZGUoaW5wdXREYXRhLCBpbnB1dENoYW5uZWxDb3VudCwgbnVtRnJhbWVzKTsKICAgICAgICAgICAgICAgICAvLyBJZiB3ZSBnZXQgc2V2ZXJhbCBpbiBhIHJvdyB0aGVuIGdvIHRvIG5leHQgc3RhdGUuCiAgICAgICAgICAgICAgICAgaWYgKHBlYWsgPiBtUHVsc2VUaHJlc2hvbGQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1Eb3duQ291bnRlci0tIDw9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbURvd25Db3VudGVyIC09IG51bUZyYW1lczsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1Eb3duQ291bnRlciA8PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAvL3ByaW50ZigiJTVkOiBzd2l0Y2ggdG8gU1RBVEVfV0FJVElOR19GT1JfU0lMRU5DRSwgbWVhc3VyZWQgcGVhayA9ICVmXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgbUxvb3BDb3VudGVyLCBwZWFrKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Eb3duQ291bnRlciA9IDg7CisgICAgICAgICAgICAgICAgICAgICAgICBtRG93bkNvdW50ZXIgPSBnZXRCbG9ja0ZyYW1lcygpOwogICAgICAgICAgICAgICAgICAgICAgICAgbU1lYXN1cmVkTG9vcEdhaW4gPSBwZWFrOyAgLy8gYXNzdW1lcyBvcmlnaW5hbCBwdWxzZSBhbXBsaXR1ZGUgaXMgb25lCisgICAgICAgICAgICAgICAgICAgICAgICBtU2lsZW5jZVRocmVzaG9sZCA9IHBlYWsgKiAwLjE7IC8vIHNjYWxlIHNpbGVuY2UgdG8gbWVhc3VyZWQgcHVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENhbGN1bGF0ZSBnYWluIHRoYXQgd2lsbCBnaXZlIHVzIGEgbmljZSBkZWNheWluZyBlY2hvLgogICAgICAgICAgICAgICAgICAgICAgICAgbUVjaG9HYWluID0gbURlc2lyZWRFY2hvR2FpbiAvIG1NZWFzdXJlZExvb3BHYWluOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1FY2hvR2FpbiA+IE1BWF9FQ0hPX0dBSU4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtRWNob0dhaW4gPiBrTWF4RWNob0dhaW4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIkVSUk9SIC0gbG9vcCBnYWluIHRvbyBsb3cuIEluY3JlYXNlIHRoZSB2b2x1bWUuXG4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0U3RhdGUgPSBTVEFURV9GQUlMRUQ7CiAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewpAQCAtNTYzLDcgKzY4Niw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG51bUZyYW1lcyA+IGtJbXB1bHNlU2l6ZUluRnJhbWVzKXsgLy8gaWdub3JlIHNob3J0IGNhbGxiYWNrcwotICAgICAgICAgICAgICAgICAgICBtRG93bkNvdW50ZXIgPSA4OworICAgICAgICAgICAgICAgICAgICBtRG93bkNvdW50ZXIgPSBnZXRCbG9ja0ZyYW1lcygpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKIApAQCAtNTc2LDEzICs2OTksMTQgQEAKICAgICAgICAgICAgICAgICBwZWFrID0gbWVhc3VyZVBlYWtBbXBsaXR1ZGUoaW5wdXREYXRhLCBpbnB1dENoYW5uZWxDb3VudCwgbnVtRnJhbWVzKTsKICAgICAgICAgICAgICAgICAvLyBJZiB3ZSBnZXQgc2V2ZXJhbCBpbiBhIHJvdyB0aGVuIGdvIHRvIG5leHQgc3RhdGUuCiAgICAgICAgICAgICAgICAgaWYgKHBlYWsgPCBtU2lsZW5jZVRocmVzaG9sZCkgewotICAgICAgICAgICAgICAgICAgICBpZiAobURvd25Db3VudGVyLS0gPD0gMCkgeworICAgICAgICAgICAgICAgICAgICBtRG93bkNvdW50ZXIgLT0gbnVtRnJhbWVzOworICAgICAgICAgICAgICAgICAgICBpZiAobURvd25Db3VudGVyIDw9IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRTdGF0ZSA9IFNUQVRFX1NFTkRJTkdfUFVMU0U7CiAgICAgICAgICAgICAgICAgICAgICAgICAvL3ByaW50ZigiJTVkOiBzd2l0Y2ggdG8gU1RBVEVfU0VORElOR19QVUxTRVxuIiwgbUxvb3BDb3VudGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Eb3duQ291bnRlciA9IDg7CisgICAgICAgICAgICAgICAgICAgICAgICBtRG93bkNvdW50ZXIgPSBnZXRCbG9ja0ZyYW1lcygpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbURvd25Db3VudGVyID0gODsKKyAgICAgICAgICAgICAgICAgICAgbURvd25Db3VudGVyID0gZ2V0QmxvY2tGcmFtZXMoKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAKQEAgLTYxNSwxMSArNzM5LDExIEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmIChudW1Xcml0dGVuICA8IG51bUZyYW1lcykgewogICAgICAgICAgICAgICAgICAgICBuZXh0U3RhdGUgPSBTVEFURV9ET05FOwotICAgICAgICAgICAgICAgICAgICAvL3ByaW50ZigiJTVkOiBzd2l0Y2ggdG8gU1RBVEVfRE9ORVxuIiwgbUxvb3BDb3VudGVyKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgICAgIGNhc2UgU1RBVEVfRE9ORToKKyAgICAgICAgICAgIGNhc2UgU1RBVEVfRkFJTEVEOgogICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtNjMzLDEyICs3NTcsMjMgQEAKICAgICB9CiAKICAgICBpbnQgbG9hZChjb25zdCBjaGFyICpmaWxlTmFtZSkgb3ZlcnJpZGUgewotICAgICAgICByZXR1cm4gbUF1ZGlvUmVjb3JkaW5nLmxvYWQoZmlsZU5hbWUpOworICAgICAgICBpbnQgcmVzdWx0ID0gbUF1ZGlvUmVjb3JkaW5nLmxvYWQoZmlsZU5hbWUpOworICAgICAgICBzZXRTYW1wbGVSYXRlKG1BdWRpb1JlY29yZGluZy5nZXRTYW1wbGVSYXRlKCkpOworICAgICAgICBtU3RhdGUgPSBTVEFURV9ET05FOworICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KIAogcHJpdmF0ZToKIAotICAgIGVudW0gZWNob19zdGF0ZV90IHsKKyAgICBlbnVtIGVycm9yX2NvZGUgeworICAgICAgICBFUlJPUl9PSyA9IDAsCisgICAgICAgIEVSUk9SX05PSVNZID0gLTk5LAorICAgICAgICBFUlJPUl9DTElQUElORywKKyAgICAgICAgRVJST1JfQ09ORklERU5DRSwKKyAgICAgICAgRVJST1JfSU5WQUxJRF9TVEFURQorICAgIH07CisKKyAgICBlbnVtIGVjaG9fc3RhdGUgewogICAgICAgICBTVEFURV9JTklUSUFMX1NJTEVOQ0UsCiAgICAgICAgIFNUQVRFX01FQVNVUklOR19HQUlOLAogICAgICAgICBTVEFURV9XQUlUSU5HX0ZPUl9TSUxFTkNFLApAQCAtNjQ4LDYgKzc4MywzNSBAQAogICAgICAgICBTVEFURV9GQUlMRUQKICAgICB9OwogCisgICAgY29uc3QgY2hhciAqY29udmVydFN0YXRlVG9UZXh0KGVjaG9fc3RhdGUgc3RhdGUpIHsKKyAgICAgICAgY29uc3QgY2hhciAqcmVzdWx0ID0gIlVua25vd24iOworICAgICAgICBzd2l0Y2goc3RhdGUpIHsKKyAgICAgICAgICAgIGNhc2UgU1RBVEVfSU5JVElBTF9TSUxFTkNFOgorICAgICAgICAgICAgICAgIHJlc3VsdCA9ICJJTklUIjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU1RBVEVfTUVBU1VSSU5HX0dBSU46CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gIkdBSU4iOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTVEFURV9XQUlUSU5HX0ZPUl9TSUxFTkNFOgorICAgICAgICAgICAgICAgIHJlc3VsdCA9ICJTSUxFTkNFIjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU1RBVEVfU0VORElOR19QVUxTRToKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAiUFVMU0UiOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTVEFURV9HQVRIRVJJTkdfRUNIT1M6CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gIkVDSE9TIjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU1RBVEVfRE9ORToKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAiRE9ORSI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNUQVRFX0ZBSUxFRDoKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAiRkFJTEVEIjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworCiAgICAgaW50MzJfdCAgICAgICAgIG1Eb3duQ291bnRlciA9IDUwMDsKICAgICBpbnQzMl90ICAgICAgICAgbUxvb3BDb3VudGVyID0gMDsKICAgICBpbnQzMl90ICAgICAgICAgbVNhbXBsZUluZGV4ID0gMDsKQEAgLTY1Niw3ICs4MjAsNyBAQAogICAgIGZsb2F0ICAgICAgICAgICBtTWVhc3VyZWRMb29wR2FpbiA9IDAuMGY7CiAgICAgZmxvYXQgICAgICAgICAgIG1EZXNpcmVkRWNob0dhaW4gPSAwLjk1ZjsKICAgICBmbG9hdCAgICAgICAgICAgbUVjaG9HYWluID0gMS4wZjsKLSAgICBlY2hvX3N0YXRlX3QgICAgbVN0YXRlID0gU1RBVEVfSU5JVElBTF9TSUxFTkNFOworICAgIGVjaG9fc3RhdGUgICAgICBtU3RhdGUgPSBTVEFURV9JTklUSUFMX1NJTEVOQ0U7CiAKICAgICBBdWRpb1JlY29yZGluZyAgbUF1ZGlvUmVjb3JkaW5nOyAvLyBjb250YWlucyBvbmx5IHRoZSBpbnB1dCBhZnRlciB0aGUgZ2FpbiBkZXRlY3Rpb24gYnVyc3QKICAgICBMYXRlbmN5UmVwb3J0ICAgbUxhdGVuY3lSZXBvcnQ7CkBAIC02NzQsMjcgKzgzOCwzOCBAQAogY2xhc3MgU2luZUFuYWx5emVyIDogcHVibGljIExvb3BiYWNrUHJvY2Vzc29yIHsKIHB1YmxpYzoKIAotICAgIHZpcnR1YWwgaW50IGdldFJlc3VsdCgpIHsKLSAgICAgICAgcmV0dXJuIG1TdGF0ZSA9PSBTVEFURV9MT0NLRUQgPyAwIDogLTE7Ci0gICAgfQotCiAgICAgdm9pZCByZXBvcnQoKSBvdmVycmlkZSB7CiAgICAgICAgIHByaW50ZigiU2luZUFuYWx5emVyIC0tLS0tLS0tLS0tLS0tLS0tLVxuIik7Ci0gICAgICAgIHByaW50ZihMT09QQkFDS19SRVNVTFRfVEFHICJwZWFrLmFtcGxpdHVkZSAgICAgPSAlNy41ZlxuIiwgbVBlYWtBbXBsaXR1ZGUpOwotICAgICAgICBwcmludGYoTE9PUEJBQ0tfUkVTVUxUX1RBRyAic2luZS5tYWduaXR1ZGUgICAgID0gJTcuNWZcbiIsIG1NYWduaXR1ZGUpOwotICAgICAgICBwcmludGYoTE9PUEJBQ0tfUkVTVUxUX1RBRyAicGhhc2Uub2Zmc2V0ICAgICAgID0gJTcuNWZcbiIsIG1QaGFzZU9mZnNldCk7Ci0gICAgICAgIHByaW50ZihMT09QQkFDS19SRVNVTFRfVEFHICJyZWYucGhhc2UgICAgICAgICAgPSAlNy41ZlxuIiwgbVBoYXNlKTsKLSAgICAgICAgcHJpbnRmKExPT1BCQUNLX1JFU1VMVF9UQUcgImZyYW1lcy5hY2N1bXVsYXRlZCA9ICU2ZFxuIiwgbUZyYW1lc0FjY3VtdWxhdGVkKTsKLSAgICAgICAgcHJpbnRmKExPT1BCQUNLX1JFU1VMVF9UQUcgInNpbmUucGVyaW9kICAgICAgICA9ICU2ZFxuIiwgbVNpbmVQZXJpb2QpOwotICAgICAgICBwcmludGYoTE9PUEJBQ0tfUkVTVUxUX1RBRyAidGVzdC5zdGF0ZSAgICAgICAgID0gJTZkXG4iLCBtU3RhdGUpOwotICAgICAgICBwcmludGYoTE9PUEJBQ0tfUkVTVUxUX1RBRyAiZnJhbWUuY291bnQgICAgICAgID0gJTZkXG4iLCBtRnJhbWVDb3VudGVyKTsKKyAgICAgICAgcHJpbnRmKExPT1BCQUNLX1JFU1VMVF9UQUcgInBlYWsuYW1wbGl0dWRlICAgICA9ICU4ZlxuIiwgbVBlYWtBbXBsaXR1ZGUpOworICAgICAgICBwcmludGYoTE9PUEJBQ0tfUkVTVUxUX1RBRyAic2luZS5tYWduaXR1ZGUgICAgID0gJThmXG4iLCBtTWFnbml0dWRlKTsKKyAgICAgICAgcHJpbnRmKExPT1BCQUNLX1JFU1VMVF9UQUcgInBlYWsubm9pc2UgICAgICAgICA9ICU4ZlxuIiwgbVBlYWtOb2lzZSk7CisgICAgICAgIHByaW50ZihMT09QQkFDS19SRVNVTFRfVEFHICJybXMubm9pc2UgICAgICAgICAgPSAlOGZcbiIsIG1Sb290TWVhblNxdWFyZU5vaXNlKTsKKyAgICAgICAgZmxvYXQgYW1wbGl0dWRlUmF0aW8gPSBtTWFnbml0dWRlIC8gbVBlYWtOb2lzZTsKKyAgICAgICAgZmxvYXQgc2lnbmFsVG9Ob2lzZSA9IGFtcGxpdHVkZVJhdGlvICogYW1wbGl0dWRlUmF0aW87CisgICAgICAgIHByaW50ZihMT09QQkFDS19SRVNVTFRfVEFHICJzaWduYWwudG8ubm9pc2UgICAgPSAlOC4yZlxuIiwgc2lnbmFsVG9Ob2lzZSk7CisgICAgICAgIGZsb2F0IHNpZ25hbFRvTm9pc2VEQiA9IDEwLjAgKiBsb2coc2lnbmFsVG9Ob2lzZSk7CisgICAgICAgIHByaW50ZihMT09QQkFDS19SRVNVTFRfVEFHICJzaWduYWwudG8ubm9pc2UuZGIgPSAlOC4yZlxuIiwgc2lnbmFsVG9Ob2lzZURCKTsKKyAgICAgICAgaWYgKHNpZ25hbFRvTm9pc2VEQiA8IE1JTl9TTlJBVElPX0RCKSB7CisgICAgICAgICAgICBwcmludGYoIkVSUk9SIC0gc2lnbmFsIHRvIG5vaXNlIHJhdGlvIGlzIHRvbyBsb3chIDwgJWQgZEIuIEFkanVzdCB2b2x1bWUuXG4iLCBNSU5fU05SQVRJT19EQik7CisgICAgICAgICAgICBzZXRSZXN1bHQoRVJST1JfTk9JU1kpOworICAgICAgICB9CisgICAgICAgIHByaW50ZihMT09QQkFDS19SRVNVTFRfVEFHICJmcmFtZXMuYWNjdW11bGF0ZWQgPSAlOGRcbiIsIG1GcmFtZXNBY2N1bXVsYXRlZCk7CisgICAgICAgIHByaW50ZihMT09QQkFDS19SRVNVTFRfVEFHICJzaW5lLnBlcmlvZCAgICAgICAgPSAlOGRcbiIsIG1TaW5lUGVyaW9kKTsKKyAgICAgICAgcHJpbnRmKExPT1BCQUNLX1JFU1VMVF9UQUcgInRlc3Quc3RhdGUgICAgICAgICA9ICU4ZFxuIiwgbVN0YXRlKTsKKyAgICAgICAgcHJpbnRmKExPT1BCQUNLX1JFU1VMVF9UQUcgImZyYW1lLmNvdW50ICAgICAgICA9ICU4ZFxuIiwgbUZyYW1lQ291bnRlcik7CiAgICAgICAgIC8vIERpZCB3ZSBldmVyIGdldCBhIGxvY2s/CiAgICAgICAgIGJvb2wgZ290TG9jayA9IChtU3RhdGUgPT0gU1RBVEVfTE9DS0VEKSB8fCAobUdsaXRjaENvdW50ID4gMCk7CiAgICAgICAgIGlmICghZ290TG9jaykgewogICAgICAgICAgICAgcHJpbnRmKCJFUlJPUiAtIGZhaWxlZCB0byBsb2NrIG9uIHJlZmVyZW5jZSBzaW5lIHRvbmVcbiIpOworICAgICAgICAgICAgc2V0UmVzdWx0KEVSUk9SX05PX0xPQ0spOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLy8gT25seSBwcmludCBpZiBtZWFuaW5nZnVsLgotICAgICAgICAgICAgcHJpbnRmKExPT1BCQUNLX1JFU1VMVF9UQUcgImdsaXRjaC5jb3VudCAgICAgICA9ICU2ZFxuIiwgbUdsaXRjaENvdW50KTsKKyAgICAgICAgICAgIHByaW50ZihMT09QQkFDS19SRVNVTFRfVEFHICJnbGl0Y2guY291bnQgICAgICAgPSAlOGRcbiIsIG1HbGl0Y2hDb3VudCk7CisgICAgICAgICAgICBwcmludGYoTE9PUEJBQ0tfUkVTVUxUX1RBRyAibWF4LmdsaXRjaCAgICAgICAgID0gJThmXG4iLCBtTWF4R2xpdGNoRGVsdGEpOworICAgICAgICAgICAgaWYgKG1HbGl0Y2hDb3VudCA+IDApIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIkVSUk9SIC0gbnVtYmVyIG9mIGdsaXRjaGVzID4gMFxuIik7CisgICAgICAgICAgICAgICAgc2V0UmVzdWx0KEVSUk9SX0dMSVRDSEVTKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIApAQCAtNzMyLDE1ICs5MDcsNDggQEAKICAgICAgICAgfQogCiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtRnJhbWVzOyBpKyspIHsKKyAgICAgICAgICAgIGJvb2wgc2luZUVuYWJsZWQgPSB0cnVlOwogICAgICAgICAgICAgZmxvYXQgc2FtcGxlID0gaW5wdXREYXRhW2kgKiBpbnB1dENoYW5uZWxDb3VudF07CiAKICAgICAgICAgICAgIGZsb2F0IHNpbk91dCA9IHNpbmYobVBoYXNlKTsKIAogICAgICAgICAgICAgc3dpdGNoIChtU3RhdGUpIHsKICAgICAgICAgICAgICAgICBjYXNlIFNUQVRFX0lETEU6Ci0gICAgICAgICAgICAgICAgY2FzZSBTVEFURV9JTU1VTkU6Ci0gICAgICAgICAgICAgICAgY2FzZSBTVEFURV9XQUlUSU5HX0ZPUl9TSUdOQUw6CisgICAgICAgICAgICAgICAgICAgIHNpbmVFbmFibGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIG1Eb3duQ291bnRlci0tOworICAgICAgICAgICAgICAgICAgICBpZiAobURvd25Db3VudGVyIDw9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX01FQVNVUkVfTk9JU0U7CisgICAgICAgICAgICAgICAgICAgICAgICBtRG93bkNvdW50ZXIgPSBOT0lTRV9GUkFNRV9DT1VOVDsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNUQVRFX01FQVNVUkVfTk9JU0U6CisgICAgICAgICAgICAgICAgICAgIHNpbmVFbmFibGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIG1QZWFrTm9pc2UgPSBzdGQ6Om1heChhYnMoc2FtcGxlKSwgbVBlYWtOb2lzZSk7CisgICAgICAgICAgICAgICAgICAgIG1Ob2lzZVN1bVNxdWFyZWQgKz0gc2FtcGxlICogc2FtcGxlOworICAgICAgICAgICAgICAgICAgICBtRG93bkNvdW50ZXItLTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1Eb3duQ291bnRlciA8PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9XQUlUSU5HX0ZPUl9TSUdOQUw7CisgICAgICAgICAgICAgICAgICAgICAgICBtUm9vdE1lYW5TcXVhcmVOb2lzZSA9IHNxcnQobU5vaXNlU3VtU3F1YXJlZCAvIE5PSVNFX0ZSQU1FX0NPVU5UKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Ub2xlcmFuY2UgPSBzdGQ6Om1heChNSU5fVE9MRVJBTkNFLCBtUGVha05vaXNlICogMi4wZik7CisgICAgICAgICAgICAgICAgICAgICAgICBtUGhhc2UgPSAwLjA7IC8vIHByZXZlbnQgc3Bpa2UgYXQgc3RhcnQKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgU1RBVEVfSU1NVU5FOgorICAgICAgICAgICAgICAgICAgICBtRG93bkNvdW50ZXItLTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1Eb3duQ291bnRlciA8PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9XQUlUSU5HX0ZPUl9TSUdOQUw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIFNUQVRFX1dBSVRJTkdfRk9SX1NJR05BTDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBlYWsgPiBtVGhyZXNob2xkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9XQUlUSU5HX0ZPUl9MT0NLOworICAgICAgICAgICAgICAgICAgICAgICAgLy9wcmludGYoIiU1ZDogc3dpdGNoIHRvIFNUQVRFX1dBSVRJTkdfRk9SX0xPQ0tcbiIsIG1GcmFtZUNvdW50ZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXRBY2N1bXVsYXRvcigpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCiAgICAgICAgICAgICAgICAgY2FzZSBTVEFURV9XQUlUSU5HX0ZPUl9MT0NLOgogICAgICAgICAgICAgICAgICAgICBtU2luQWNjdW11bGF0b3IgKz0gc2FtcGxlICogc2luT3V0OwogICAgICAgICAgICAgICAgICAgICBtQ29zQWNjdW11bGF0b3IgKz0gc2FtcGxlICogY29zZihtUGhhc2UpOwpAQCAtNzY2LDEzICs5NzQsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgLy8gcHJpbnRmKCIgICAgcHJlZGljdGVkID0gJWYsIGFjdHVhbCA9ICVmXG4iLCBwcmVkaWN0ZWQsIHNhbXBsZSk7CiAKICAgICAgICAgICAgICAgICAgICAgZmxvYXQgZGlmZiA9IHByZWRpY3RlZCAtIHNhbXBsZTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZhYnMoZGlmZikgPiBtVG9sZXJhbmNlKSB7CisgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFic0RpZmYgPSBmYWJzKGRpZmYpOworICAgICAgICAgICAgICAgICAgICBtTWF4R2xpdGNoRGVsdGEgPSBzdGQ6Om1heChtTWF4R2xpdGNoRGVsdGEsIGFic0RpZmYpOworICAgICAgICAgICAgICAgICAgICBpZiAoYWJzRGlmZiA+IG1Ub2xlcmFuY2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1HbGl0Y2hDb3VudCsrOwogICAgICAgICAgICAgICAgICAgICAgICAgLy9wcmludGYoIiU1ZDogR290IGEgZ2xpdGNoICMgJWQsIHByZWRpY3RlZCA9ICVmLCBhY3R1YWwgPSAlZlxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgIG1GcmFtZUNvdW50ZXIsIG1HbGl0Y2hDb3VudCwgcHJlZGljdGVkLCBzYW1wbGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfSU1NVU5FOwotICAgICAgICAgICAgICAgICAgICAgICAgLy9wcmludGYoIiU1ZDogc3dpdGNoIHRvIFNUQVRFX0lNTVVORVxuIiwgbUZyYW1lQ291bnRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRG93bkNvdW50ZXIgPSBtU2luZVBlcmlvZDsgIC8vIFNldCBkdXJhdGlvbiBvZiBJTU1VTkUgc3RhdGUuCisgICAgICAgICAgICAgICAgICAgICAgICBtRG93bkNvdW50ZXIgPSBtU2luZVBlcmlvZCAqIFBFUklPRFNfSU1NVU5FOwogICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgLy8gVHJhY2sgaW5jb21pbmcgc2lnbmFsIGFuZCBzbG93bHkgYWRqdXN0IG1hZ25pdHVkZSB0byBhY2NvdW50CkBAIC03OTIsNDQgKzEwMDEsMjMgQEAKICAgICAgICAgICAgICAgICB9IGJyZWFrOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICBmbG9hdCBvdXRwdXQgPSAwLjBmOwogICAgICAgICAgICAgLy8gT3V0cHV0IHNpbmUgd2F2ZSBzbyB3ZSBjYW4gbWVhc3VyZSBpdC4KLSAgICAgICAgICAgIG91dHB1dERhdGFbaSAqIG91dHB1dENoYW5uZWxDb3VudF0gPSAoc2luT3V0ICogbU91dHB1dEFtcGxpdHVkZSkKLSAgICAgICAgICAgICAgICAgICAgKyAobVdoaXRlTm9pc2UubmV4dFJhbmRvbURvdWJsZSgpICogbU5vaXNlQW1wbGl0dWRlKTsKLSAgICAgICAgICAgIC8vIHByaW50ZigiJTVkOiBzaW4oJWYpID0gJWYsICVmXG4iLCBpLCBtUGhhc2UsIHNpbk91dCwgIG1QaGFzZUluY3JlbWVudCk7Ci0KLSAgICAgICAgICAgIC8vIGFkdmFuY2UgYW5kIHdyYXAgcGhhc2UKLSAgICAgICAgICAgIG1QaGFzZSArPSBtUGhhc2VJbmNyZW1lbnQ7Ci0gICAgICAgICAgICBpZiAobVBoYXNlID4gTV9QSSkgewotICAgICAgICAgICAgICAgIG1QaGFzZSAtPSAoMi4wICogTV9QSSk7CisgICAgICAgICAgICBpZiAoc2luZUVuYWJsZWQpIHsKKyAgICAgICAgICAgICAgICBvdXRwdXQgPSAoc2luT3V0ICogbU91dHB1dEFtcGxpdHVkZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICArIChtV2hpdGVOb2lzZS5uZXh0UmFuZG9tRG91YmxlKCkgKiBtTm9pc2VBbXBsaXR1ZGUpOworICAgICAgICAgICAgICAgIC8vIHByaW50ZigiJTVkOiBzaW4oJWYpID0gJWYsICVmXG4iLCBpLCBtUGhhc2UsIHNpbk91dCwgIG1QaGFzZUluY3JlbWVudCk7CisgICAgICAgICAgICAgICAgLy8gYWR2YW5jZSBhbmQgd3JhcCBwaGFzZQorICAgICAgICAgICAgICAgIG1QaGFzZSArPSBtUGhhc2VJbmNyZW1lbnQ7CisgICAgICAgICAgICAgICAgaWYgKG1QaGFzZSA+IE1fUEkpIHsKKyAgICAgICAgICAgICAgICAgICAgbVBoYXNlIC09ICgyLjAgKiBNX1BJKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBvdXRwdXREYXRhW2kgKiBvdXRwdXRDaGFubmVsQ291bnRdID0gb3V0cHV0OworCiAKICAgICAgICAgICAgIG1GcmFtZUNvdW50ZXIrKzsKICAgICAgICAgfQotCi0gICAgICAgIC8vIERvIHRoZXNlIG9uY2UgcGVyIGJ1ZmZlci4KLSAgICAgICAgc3dpdGNoIChtU3RhdGUpIHsKLSAgICAgICAgICAgIGNhc2UgU1RBVEVfSURMRToKLSAgICAgICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9JTU1VTkU7IC8vIHNvIHdlIGNhbiB0ZWxsIHdoZW4KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgU1RBVEVfSU1NVU5FOgotICAgICAgICAgICAgICAgIG1Eb3duQ291bnRlciAtPSBudW1GcmFtZXM7Ci0gICAgICAgICAgICAgICAgaWYgKG1Eb3duQ291bnRlciA8PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX1dBSVRJTkdfRk9SX1NJR05BTDsKLSAgICAgICAgICAgICAgICAgICAgLy9wcmludGYoIiU1ZDogc3dpdGNoIHRvIFNUQVRFX1dBSVRJTkdfRk9SX1NJR05BTFxuIiwgbUZyYW1lQ291bnRlcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBTVEFURV9XQUlUSU5HX0ZPUl9TSUdOQUw6Ci0gICAgICAgICAgICAgICAgaWYgKHBlYWsgPiBtVGhyZXNob2xkKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX1dBSVRJTkdfRk9SX0xPQ0s7Ci0gICAgICAgICAgICAgICAgICAgIC8vcHJpbnRmKCIlNWQ6IHN3aXRjaCB0byBTVEFURV9XQUlUSU5HX0ZPUl9MT0NLXG4iLCBtRnJhbWVDb3VudGVyKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzZXRBY2N1bXVsYXRvcigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgU1RBVEVfV0FJVElOR19GT1JfTE9DSzoKLSAgICAgICAgICAgIGNhc2UgU1RBVEVfTE9DS0VEOgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KICAgICB9CiAKICAgICB2b2lkIHJlc2V0QWNjdW11bGF0b3IoKSB7CkBAIC04NDAsMTggKzEwMjgsMzEgQEAKIAogICAgIHZvaWQgcmVzZXQoKSBvdmVycmlkZSB7CiAgICAgICAgIG1HbGl0Y2hDb3VudCA9IDA7Ci0gICAgICAgIG1TdGF0ZSA9IFNUQVRFX0lNTVVORTsKLSAgICAgICAgbURvd25Db3VudGVyID0gSU1NVU5FX0ZSQU1FX0NPVU5UOworICAgICAgICBtU3RhdGUgPSBTVEFURV9JRExFOworICAgICAgICBtRG93bkNvdW50ZXIgPSBJRExFX0ZSQU1FX0NPVU5UOwogICAgICAgICBtUGhhc2VJbmNyZW1lbnQgPSAyLjAgKiBNX1BJIC8gbVNpbmVQZXJpb2Q7CiAgICAgICAgIHByaW50ZigicGhhc2VJbmMgPSAlZiBmb3IgcGVyaW9kICVkXG4iLCBtUGhhc2VJbmNyZW1lbnQsIG1TaW5lUGVyaW9kKTsKICAgICAgICAgcmVzZXRBY2N1bXVsYXRvcigpOwogICAgICAgICBtUHJvY2Vzc0NvdW50ID0gMDsKKyAgICAgICAgbVBlYWtOb2lzZSA9IDAuMGY7CisgICAgICAgIG1Ob2lzZVN1bVNxdWFyZWQgPSAwLjA7CisgICAgICAgIG1Sb290TWVhblNxdWFyZU5vaXNlID0gMC4wOworICAgICAgICBtUGhhc2UgPSAwLjBmOworICAgICAgICBtTWF4R2xpdGNoRGVsdGEgPSAwLjA7CiAgICAgfQogCiBwcml2YXRlOgogCisgICAgZW51bSBlcnJvcl9jb2RlIHsKKyAgICAgICAgT0ssCisgICAgICAgIEVSUk9SX05PX0xPQ0sgPSAtODAsCisgICAgICAgIEVSUk9SX0dMSVRDSEVTLAorICAgICAgICBFUlJPUl9OT0lTWQorICAgIH07CisKICAgICBlbnVtIHNpbmVfc3RhdGVfdCB7CiAgICAgICAgIFNUQVRFX0lETEUsCisgICAgICAgIFNUQVRFX01FQVNVUkVfTk9JU0UsCiAgICAgICAgIFNUQVRFX0lNTVVORSwKICAgICAgICAgU1RBVEVfV0FJVElOR19GT1JfU0lHTkFMLAogICAgICAgICBTVEFURV9XQUlUSU5HX0ZPUl9MT0NLLApAQCAtODU5LDEwICsxMDYwLDE2IEBACiAgICAgfTsKIAogICAgIGVudW0gY29uc3RhbnRzIHsKLSAgICAgICAgSU1NVU5FX0ZSQU1FX0NPVU5UID0gNDggKiA1MDAsCi0gICAgICAgIFBFUklPRFNfTkVFREVEX0ZPUl9MT0NLID0gOAorICAgICAgICAvLyBBcmJpdHJhcnkgZHVyYXRpb25zLCBhc3N1bWluZyA0ODAwMCBIegorICAgICAgICBJRExFX0ZSQU1FX0NPVU5UID0gNDggKiAxMDAsCisgICAgICAgIE5PSVNFX0ZSQU1FX0NPVU5UID0gNDggKiA2MDAsCisgICAgICAgIFBFUklPRFNfTkVFREVEX0ZPUl9MT0NLID0gOCwKKyAgICAgICAgUEVSSU9EU19JTU1VTkUgPSAyLAorICAgICAgICBNSU5fU05SQVRJT19EQiA9IDY1CiAgICAgfTsKIAorICAgIHN0YXRpYyBjb25zdGV4cHIgZmxvYXQgTUlOX1RPTEVSQU5DRSA9IDAuMDE7CisKICAgICBpbnQgICAgIG1TaW5lUGVyaW9kID0gNzk7CiAgICAgZG91YmxlICBtUGhhc2VJbmNyZW1lbnQgPSAwLjA7CiAgICAgZG91YmxlICBtUGhhc2UgPSAwLjA7CkBAIC04NzAsMjUgKzEwNzcsMjkgQEAKICAgICBkb3VibGUgIG1QcmV2aW91c1BoYXNlT2Zmc2V0ID0gMC4wOwogICAgIGRvdWJsZSAgbU1hZ25pdHVkZSA9IDAuMDsKICAgICBkb3VibGUgIG1UaHJlc2hvbGQgPSAwLjAwNTsKLSAgICBkb3VibGUgIG1Ub2xlcmFuY2UgPSAwLjAxOworICAgIGRvdWJsZSAgbVRvbGVyYW5jZSA9IE1JTl9UT0xFUkFOQ0U7CiAgICAgaW50MzJfdCBtRnJhbWVzQWNjdW11bGF0ZWQgPSAwOwogICAgIGludDMyX3QgbVByb2Nlc3NDb3VudCA9IDA7CiAgICAgZG91YmxlICBtU2luQWNjdW11bGF0b3IgPSAwLjA7CiAgICAgZG91YmxlICBtQ29zQWNjdW11bGF0b3IgPSAwLjA7CisgICAgZmxvYXQgICBtTWF4R2xpdGNoRGVsdGEgPSAwLjBmOwogICAgIGludDMyX3QgbUdsaXRjaENvdW50ID0gMDsKICAgICBkb3VibGUgIG1QZWFrQW1wbGl0dWRlID0gMC4wOwotICAgIGludCAgICAgbURvd25Db3VudGVyID0gSU1NVU5FX0ZSQU1FX0NPVU5UOworICAgIGludCAgICAgbURvd25Db3VudGVyID0gSURMRV9GUkFNRV9DT1VOVDsKICAgICBpbnQzMl90IG1GcmFtZUNvdW50ZXIgPSAwOwogICAgIGZsb2F0ICAgbU91dHB1dEFtcGxpdHVkZSA9IDAuNzU7CiAKKyAgICAvLyBtZWFzdXJlIGJhY2tncm91bmQgbm9pc2UKKyAgICBmbG9hdCAgIG1QZWFrTm9pc2UgPSAwLjBmOworICAgIGRvdWJsZSAgbU5vaXNlU3VtU3F1YXJlZCA9IDAuMDsKKyAgICBkb3VibGUgIG1Sb290TWVhblNxdWFyZU5vaXNlID0gMC4wOworCiAgICAgUHNldWRvUmFuZG9tICBtV2hpdGVOb2lzZTsKICAgICBmbG9hdCAgIG1Ob2lzZUFtcGxpdHVkZSA9IDAuMDA7IC8vIFVzZWQgdG8gZXhwZXJpbWVudCB3aXRoIHdhcmJsaW5nIGNhdXNlZCBieSBEUkMuCiAKICAgICBzaW5lX3N0YXRlX3QgIG1TdGF0ZSA9IFNUQVRFX0lETEU7CiB9OwogCi0KLSN1bmRlZiBMT09QQkFDS19TQU1QTEVfUkFURQogI3VuZGVmIExPT1BCQUNLX1JFU1VMVF9UQUcKIAogI2VuZGlmIC8qIEFBVURJT19FWEFNUExFU19MT09QQkFDS19BTkFMWVNFUl9IICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvbG9vcGJhY2svc3JjL2xvb3BiYWNrLmNwcCBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9sb29wYmFjay9zcmMvbG9vcGJhY2suY3BwCmluZGV4IDkxZWJmNzMuLjJhMDJiMjAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9sb29wYmFjay9zcmMvbG9vcGJhY2suY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9sb29wYmFjay9zcmMvbG9vcGJhY2suY3BwCkBAIC0zNSwxNSArMzUsMTcgQEAKICNpbmNsdWRlICJBQXVkaW9FeGFtcGxlVXRpbHMuaCIKICNpbmNsdWRlICJMb29wYmFja0FuYWx5emVyLmgiCiAKKy8vIFYwLjQuMDAgPSByZWN0aWZ5IGFuZCBsb3ctcGFzcyBmaWx0ZXIgdGhlIGVjaG9zLCB1c2UgYXV0by1jb3JyZWxhdGlvbiBvbiBlbnRpcmUgZWNobworI2RlZmluZSBBUFBfVkVSU0lPTiAgICAgICAgICAgICAiMC40LjAwIgorCiAvLyBUYWcgZm9yIG1hY2hpbmUgcmVhZGFibGUgcmVzdWx0cyBhcyBwcm9wZXJ0eSA9IHZhbHVlIHBhaXJzCiAjZGVmaW5lIFJFU1VMVF9UQUcgICAgICAgICAgICAgICJSRVNVTFQ6ICIKLSNkZWZpbmUgTlVNX1NFQ09ORFMgICAgICAgICAgICAgNQotI2RlZmluZSBQRVJJT0RfTUlMTElTICAgICAgICAgICAxMDAwCi0jZGVmaW5lIE5VTV9JTlBVVF9DSEFOTkVMUyAgICAgIDEKICNkZWZpbmUgRklMRU5BTUVfQUxMICAgICAgICAgICAgIi9kYXRhL2xvb3BiYWNrX2FsbC53YXYiCiAjZGVmaW5lIEZJTEVOQU1FX0VDSE9TICAgICAgICAgICIvZGF0YS9sb29wYmFja19lY2hvcy53YXYiCi0jZGVmaW5lIEFQUF9WRVJTSU9OICAgICAgICAgICAgICIwLjIuMDQiCisjZGVmaW5lIEZJTEVOQU1FX1BST0NFU1NFRCAgICAgICIvZGF0YS9sb29wYmFja19wcm9jZXNzZWQud2F2IgogCitjb25zdGV4cHIgaW50IGtMb2dQZXJpb2RNaWxsaXMgICAgICAgPSAxMDAwOworY29uc3RleHByIGludCBrTnVtSW5wdXRDaGFubmVscyAgICAgID0gMTsKIGNvbnN0ZXhwciBpbnQga051bUNhbGxiYWNrc1RvRHJhaW4gICA9IDIwOwogY29uc3RleHByIGludCBrTnVtQ2FsbGJhY2tzVG9EaXNjYXJkID0gMjA7CiAKQEAgLTE3NCw3ICsxNzYsOCBAQAogICAgICAgICBpbnQ2NF90IGlucHV0RnJhbWVzV3JpdHRlbiA9IEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNXcml0dGVuKG15RGF0YS0+aW5wdXRTdHJlYW0pOwogICAgICAgICBpbnQ2NF90IGlucHV0RnJhbWVzUmVhZCA9IEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNSZWFkKG15RGF0YS0+aW5wdXRTdHJlYW0pOwogICAgICAgICBpbnQ2NF90IGZyYW1lc0F2YWlsYWJsZSA9IGlucHV0RnJhbWVzV3JpdHRlbiAtIGlucHV0RnJhbWVzUmVhZDsKLSAgICAgICAgYWN0dWFsRnJhbWVzUmVhZCA9IHJlYWRGb3JtYXR0ZWREYXRhKG15RGF0YSwgbnVtRnJhbWVzKTsKKworICAgICAgICBhY3R1YWxGcmFtZXNSZWFkID0gcmVhZEZvcm1hdHRlZERhdGEobXlEYXRhLCBudW1GcmFtZXMpOyAvLyBSRUFECiAgICAgICAgIGlmIChhY3R1YWxGcmFtZXNSZWFkIDwgMCkgewogICAgICAgICAgICAgcmVzdWx0ID0gQUFVRElPX0NBTExCQUNLX1JFU1VMVF9TVE9QOwogICAgICAgICB9IGVsc2UgewpAQCAtMTk0LDYgKzE5Nyw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIG15RGF0YS0+aW5zdWZmaWNpZW50UmVhZENvdW50Kys7CiAgICAgICAgICAgICAgICAgbXlEYXRhLT5pbnN1ZmZpY2llbnRSZWFkRnJhbWVzICs9IG51bUZyYW1lcyAtIGFjdHVhbEZyYW1lc1JlYWQ7IC8vIGRlZmljaXQKKyAgICAgICAgICAgICAgICAvLyBwcmludGYoIkVycm9yIGluc3VmZmljaWVudFJlYWRDb3VudCA9ICVkXG4iLChpbnQpbXlEYXRhLT5pbnN1ZmZpY2llbnRSZWFkQ291bnQpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpbnQzMl90IG51bVNhbXBsZXMgPSBhY3R1YWxGcmFtZXNSZWFkICogbXlEYXRhLT5hY3R1YWxJbnB1dENoYW5uZWxDb3VudDsKQEAgLTMzNiw5ICszNDAsOSBAQAogCiAgICAgYWF1ZGlvX3Jlc3VsdF90ICAgICAgIHJlc3VsdCA9IEFBVURJT19PSzsKICAgICBhYXVkaW9fc2hhcmluZ19tb2RlX3QgcmVxdWVzdGVkSW5wdXRTaGFyaW5nTW9kZSAgPSBBQVVESU9fU0hBUklOR19NT0RFX1NIQVJFRDsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkSW5wdXRDaGFubmVsQ291bnQgPSBOVU1fSU5QVVRfQ0hBTk5FTFM7CisgICAgaW50ICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZElucHV0Q2hhbm5lbENvdW50ID0ga051bUlucHV0Q2hhbm5lbHM7CiAgICAgYWF1ZGlvX2Zvcm1hdF90ICAgICAgIHJlcXVlc3RlZElucHV0Rm9ybWF0ICAgICAgID0gQUFVRElPX0ZPUk1BVF9VTlNQRUNJRklFRDsKLSAgICBpbnQzMl90ICAgICAgICAgICAgICAgcmVxdWVzdGVkSW5wdXRDYXBhY2l0eSAgICAgPSAtMTsKKyAgICBpbnQzMl90ICAgICAgICAgICAgICAgcmVxdWVzdGVkSW5wdXRDYXBhY2l0eSAgICAgPSBBQVVESU9fVU5TUEVDSUZJRUQ7CiAgICAgYWF1ZGlvX3BlcmZvcm1hbmNlX21vZGVfdCBpbnB1dFBlcmZvcm1hbmNlTGV2ZWwgID0gQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTE9XX0xBVEVOQ1k7CiAKICAgICBpbnQzMl90ICAgICAgICAgICAgICAgb3V0cHV0RnJhbWVzUGVyQnVyc3QgPSAwOwpAQCAtMzU2LDYgKzM2MCw5IEBACiAKICAgICBwcmludGYoIiVzIC0gQXVkaW8gbG9vcGJhY2sgdXNpbmcgQUF1ZGlvIFYiIEFQUF9WRVJTSU9OICJcbiIsIGFyZ3ZbMF0pOwogCisgICAgLy8gVXNlIExPV19MQVRFTkNZIGFzIHRoZSBkZWZhdWx0IHRvIG1hdGNoIGlucHV0IGRlZmF1bHQuCisgICAgYXJnUGFyc2VyLnNldFBlcmZvcm1hbmNlTW9kZShBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9MT1dfTEFURU5DWSk7CisKICAgICBmb3IgKGludCBpID0gMTsgaSA8IGFyZ2M7IGkrKykgewogICAgICAgICBjb25zdCBjaGFyICphcmcgPSBhcmd2W2ldOwogICAgICAgICBpZiAoYXJnUGFyc2VyLnBhcnNlQXJnKGFyZykpIHsKQEAgLTQwNCw3ICs0MTEsNyBAQAogICAgIH0KIAogICAgIGludDMyX3QgcmVxdWVzdGVkRHVyYXRpb24gPSBhcmdQYXJzZXIuZ2V0RHVyYXRpb25TZWNvbmRzKCk7Ci0gICAgaW50MzJfdCByZXF1ZXN0ZWREdXJhdGlvbk1pbGxpcyA9IHJlcXVlc3RlZER1cmF0aW9uICogTUlMTElTX1BFUl9TRUNPTkQ7CisgICAgaW50MzJfdCByZXF1ZXN0ZWREdXJhdGlvbk1pbGxpcyA9IHJlcXVlc3RlZER1cmF0aW9uICoga01pbGxpc1BlclNlY29uZDsKICAgICBpbnQzMl90IHRpbWVNaWxsaXMgPSAwOwogICAgIGludDMyX3QgcmVjb3JkaW5nRHVyYXRpb24gPSBzdGQ6Om1pbig2MCAqIDUsIHJlcXVlc3RlZER1cmF0aW9uKTsKIApAQCAtNDIxLDkgKzQyOCwxMSBAQAogCiAgICAgICAgICAgICBsb29wYmFja0RhdGEubG9vcGJhY2tQcm9jZXNzb3IgPSAmbG9vcGJhY2tEYXRhLmVjaG9BbmFseXplcjsKICAgICAgICAgICAgIGludCByZWFkID0gbG9vcGJhY2tEYXRhLmxvb3BiYWNrUHJvY2Vzc29yLT5sb2FkKEZJTEVOQU1FX0VDSE9TKTsKLSAgICAgICAgICAgIHByaW50ZigibWFpbigpIHJlYWQgJWQgbW9ubyBzYW1wbGVzIGZyb20gJXMgb24gQW5kcm9pZCBkZXZpY2VcbiIsIHJlYWQsIEZJTEVOQU1FX0VDSE9TKTsKKyAgICAgICAgICAgIHByaW50ZigibWFpbigpIHJlYWQgJWQgbW9ubyBzYW1wbGVzIGZyb20gJXMgb24gQW5kcm9pZCBkZXZpY2UsIHJhdGUgPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICByZWFkLCBGSUxFTkFNRV9FQ0hPUywKKyAgICAgICAgICAgICAgICAgICBsb29wYmFja0RhdGEubG9vcGJhY2tQcm9jZXNzb3ItPmdldFNhbXBsZVJhdGUoKSk7CiAgICAgICAgICAgICBsb29wYmFja0RhdGEubG9vcGJhY2tQcm9jZXNzb3ItPnJlcG9ydCgpOwotICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICBnb3RvIHJlcG9ydF9yZXN1bHQ7CiAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgpAQCAtNDU5LDE1ICs0NjgsMTAgQEAKICAgICBhcmdQYXJzZXIuc2V0UGVyZm9ybWFuY2VNb2RlKGlucHV0UGVyZm9ybWFuY2VMZXZlbCk7CiAgICAgYXJnUGFyc2VyLnNldENoYW5uZWxDb3VudChyZXF1ZXN0ZWRJbnB1dENoYW5uZWxDb3VudCk7CiAgICAgYXJnUGFyc2VyLnNldFNoYXJpbmdNb2RlKHJlcXVlc3RlZElucHV0U2hhcmluZ01vZGUpOwotCi0gICAgLy8gTWFrZSBzdXJlIHRoZSBpbnB1dCBidWZmZXIgaGFzIHBsZW50eSBvZiBjYXBhY2l0eS4KLSAgICAvLyBFeHRyYSBjYXBhY2l0eSBvbiBpbnB1dCBzaG91bGQgbm90IGluY3JlYXNlIGxhdGVuY3kgaWYgd2Uga2VlcCBpdCBkcmFpbmVkLgotICAgIGludDMyX3QgaW5wdXRCdWZmZXJDYXBhY2l0eSA9IHJlcXVlc3RlZElucHV0Q2FwYWNpdHk7Ci0gICAgaWYgKGlucHV0QnVmZmVyQ2FwYWNpdHkgPCAwKSB7Ci0gICAgICAgIGludDMyX3Qgb3V0cHV0QnVmZmVyQ2FwYWNpdHkgPSBBQXVkaW9TdHJlYW1fZ2V0QnVmZmVyQ2FwYWNpdHlJbkZyYW1lcyhvdXRwdXRTdHJlYW0pOwotICAgICAgICBpbnB1dEJ1ZmZlckNhcGFjaXR5ID0gMiAqIG91dHB1dEJ1ZmZlckNhcGFjaXR5OworICAgIGlmIChyZXF1ZXN0ZWRJbnB1dENhcGFjaXR5ICE9IEFBVURJT19VTlNQRUNJRklFRCkgeworICAgICAgICBwcmludGYoIldhcm5pbmchIElmIHlvdSBzZXQgaW5wdXQgY2FwYWNpdHkgdGhlbiBtYXliZSBubyBGQVNUIHRyYWNrIG9uIExlZ2FjeSBwYXRoIVxuIik7CiAgICAgfQotICAgIGFyZ1BhcnNlci5zZXRCdWZmZXJDYXBhY2l0eShpbnB1dEJ1ZmZlckNhcGFjaXR5KTsKKyAgICBhcmdQYXJzZXIuc2V0QnVmZmVyQ2FwYWNpdHkocmVxdWVzdGVkSW5wdXRDYXBhY2l0eSk7CiAKICAgICByZXN1bHQgPSByZWNvcmRlci5vcGVuKGFyZ1BhcnNlcik7CiAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKQEAgLTUxNywxNSArNTIxLDExIEBACiAgICAgLy8gU3RhcnQgT1VUUFVUIGZpcnN0IHNvIElOUFVUIGRvZXMgbm90IG92ZXJmbG93LgogICAgIHJlc3VsdCA9IHBsYXllci5zdGFydCgpOwogICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7Ci0gICAgICAgIHByaW50ZigiRVJST1IgLSBBQXVkaW9TdHJlYW1fcmVxdWVzdFN0YXJ0KG91dHB1dCkgcmV0dXJuZWQgJWQgPSAlc1xuIiwKLSAgICAgICAgICAgICAgIHJlc3VsdCwgQUF1ZGlvX2NvbnZlcnRSZXN1bHRUb1RleHQocmVzdWx0KSk7CiAgICAgICAgIGdvdG8gZmluaXNoOwogICAgIH0KIAogICAgIHJlc3VsdCA9IHJlY29yZGVyLnN0YXJ0KCk7CiAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKLSAgICAgICAgcHJpbnRmKCJFUlJPUiAtIEFBdWRpb1N0cmVhbV9yZXF1ZXN0U3RhcnQoaW5wdXQpIHJldHVybmVkICVkID0gJXNcbiIsCi0gICAgICAgICAgICAgICByZXN1bHQsIEFBdWRpb19jb252ZXJ0UmVzdWx0VG9UZXh0KHJlc3VsdCkpOwogICAgICAgICBnb3RvIGZpbmlzaDsKICAgICB9CiAKQEAgLTU2OCw3ICs1NjgsNyBAQAogICAgICAgICAgICAgICAgICAgIEFBdWRpb1N0cmVhbV9nZXRYUnVuQ291bnQob3V0cHV0U3RyZWFtKQogICAgICAgICAgICAgKTsKICAgICAgICAgfQotICAgICAgICBpbnQzMl90IHBlcmlvZE1pbGxpcyA9ICh0aW1lTWlsbGlzIDwgMjAwMCkgPyBQRVJJT0RfTUlMTElTIC8gNCA6IFBFUklPRF9NSUxMSVM7CisgICAgICAgIGludDMyX3QgcGVyaW9kTWlsbGlzID0gKHRpbWVNaWxsaXMgPCAyMDAwKSA/IGtMb2dQZXJpb2RNaWxsaXMgLyA0IDoga0xvZ1BlcmlvZE1pbGxpczsKICAgICAgICAgdXNsZWVwKHBlcmlvZE1pbGxpcyAqIDEwMDApOwogICAgICAgICB0aW1lTWlsbGlzICs9IHBlcmlvZE1pbGxpczsKICAgICB9CkBAIC01OTAsNDUgKzU5MCw2IEBACiAgICAgcHJpbnRmKCJpbnB1dCBlcnJvciA9ICVkID0gJXNcbiIsCiAgICAgICAgICAgIGxvb3BiYWNrRGF0YS5pbnB1dEVycm9yLCBBQXVkaW9fY29udmVydFJlc3VsdFRvVGV4dChsb29wYmFja0RhdGEuaW5wdXRFcnJvcikpOwogCi0gICAgaWYgKGxvb3BiYWNrRGF0YS5pbnB1dEVycm9yID09IEFBVURJT19PSykgewotICAgICAgICBpZiAodGVzdE1vZGUgPT0gVEVTVF9TSU5FX01BR05JVFVERSkgewotICAgICAgICAgICAgcHJpbnRBdWRpb0dyYXBoKGxvb3BiYWNrRGF0YS5hdWRpb1JlY29yZGluZywgMjAwKTsKLSAgICAgICAgfQotICAgICAgICAvLyBQcmludCBhZ2FpbiBzbyB3ZSBkb24ndCBoYXZlIHRvIHNjcm9sbCBwYXN0IHdhdmVmb3JtLgotICAgICAgICBwcmludGYoIk9VVFBVVCBTdHJlYW0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7Ci0gICAgICAgIGFyZ1BhcnNlci5jb21wYXJlV2l0aFN0cmVhbShvdXRwdXRTdHJlYW0pOwotICAgICAgICBwcmludGYoIklOUFVUICBTdHJlYW0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7Ci0gICAgICAgIGFyZ1BhcnNlci5jb21wYXJlV2l0aFN0cmVhbShpbnB1dFN0cmVhbSk7Ci0KLSAgICAgICAgbG9vcGJhY2tEYXRhLmxvb3BiYWNrUHJvY2Vzc29yLT5yZXBvcnQoKTsKLSAgICB9Ci0KLSAgICB7Ci0gICAgICAgIGludDMyX3QgZnJhbWVzUmVhZCA9IEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNSZWFkKGlucHV0U3RyZWFtKTsKLSAgICAgICAgaW50MzJfdCBmcmFtZXNXcml0dGVuID0gQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1dyaXR0ZW4oaW5wdXRTdHJlYW0pOwotICAgICAgICBwcmludGYoIkNhbGxiYWNrIFJlc3VsdHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJTlBVVFxuIik7Ci0gICAgICAgIHByaW50ZigiICBpbnB1dCBvdmVycnVucyAgID0gJWRcbiIsIEFBdWRpb1N0cmVhbV9nZXRYUnVuQ291bnQoaW5wdXRTdHJlYW0pKTsKLSAgICAgICAgcHJpbnRmKCIgIGZyYW1lc1dyaXR0ZW4gICAgPSAlOGRcbiIsIGZyYW1lc1dyaXR0ZW4pOwotICAgICAgICBwcmludGYoIiAgZnJhbWVzUmVhZCAgICAgICA9ICU4ZFxuIiwgZnJhbWVzUmVhZCk7Ci0gICAgICAgIHByaW50ZigiICBteUZyYW1lc1JlYWQgICAgID0gJThkXG4iLCAoaW50KSBsb29wYmFja0RhdGEuZnJhbWVzUmVhZFRvdGFsKTsKLSAgICAgICAgcHJpbnRmKCIgIHdyaXR0ZW4gLSByZWFkICAgPSAlOGRcbiIsIChpbnQpIChmcmFtZXNXcml0dGVuIC0gZnJhbWVzUmVhZCkpOwotICAgICAgICBwcmludGYoIiAgaW5zdWZmaWNpZW50ICMgICA9ICU4ZFxuIiwgKGludCkgbG9vcGJhY2tEYXRhLmluc3VmZmljaWVudFJlYWRDb3VudCk7Ci0gICAgICAgIGlmIChsb29wYmFja0RhdGEuaW5zdWZmaWNpZW50UmVhZENvdW50ID4gMCkgewotICAgICAgICAgICAgcHJpbnRmKCIgIGluc3VmZmljaWVudCBmcmFtZXMgPSAlOGRcbiIsIChpbnQpIGxvb3BiYWNrRGF0YS5pbnN1ZmZpY2llbnRSZWFkRnJhbWVzKTsKLSAgICAgICAgfQotICAgIH0KLSAgICB7Ci0gICAgICAgIGludDMyX3QgZnJhbWVzUmVhZCA9IEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNSZWFkKG91dHB1dFN0cmVhbSk7Ci0gICAgICAgIGludDMyX3QgZnJhbWVzV3JpdHRlbiA9IEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNXcml0dGVuKG91dHB1dFN0cmVhbSk7Ci0gICAgICAgIHByaW50ZigiQ2FsbGJhY2sgUmVzdWx0cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE9VVFBVVFxuIik7Ci0gICAgICAgIHByaW50ZigiICBvdXRwdXQgdW5kZXJydW5zID0gJWRcbiIsIEFBdWRpb1N0cmVhbV9nZXRYUnVuQ291bnQob3V0cHV0U3RyZWFtKSk7Ci0gICAgICAgIHByaW50ZigiICBteUZyYW1lc1dyaXR0ZW4gID0gJThkXG4iLCAoaW50KSBsb29wYmFja0RhdGEuZnJhbWVzV3JpdHRlblRvdGFsKTsKLSAgICAgICAgcHJpbnRmKCIgIGZyYW1lc1dyaXR0ZW4gICAgPSAlOGRcbiIsIGZyYW1lc1dyaXR0ZW4pOwotICAgICAgICBwcmludGYoIiAgZnJhbWVzUmVhZCAgICAgICA9ICU4ZFxuIiwgZnJhbWVzUmVhZCk7Ci0gICAgICAgIHByaW50ZigiICBtaW4gbnVtRnJhbWVzICAgID0gJThkXG4iLCAoaW50KSBsb29wYmFja0RhdGEubWluTnVtRnJhbWVzKTsKLSAgICAgICAgcHJpbnRmKCIgIG1heCBudW1GcmFtZXMgICAgPSAlOGRcbiIsIChpbnQpIGxvb3BiYWNrRGF0YS5tYXhOdW1GcmFtZXMpOwotICAgIH0KLQogICAgIHdyaXR0ZW4gPSBsb29wYmFja0RhdGEubG9vcGJhY2tQcm9jZXNzb3ItPnNhdmUoRklMRU5BTUVfRUNIT1MpOwogICAgIGlmICh3cml0dGVuID4gMCkgewogICAgICAgICBwcmludGYoIm1haW4oKSB3cm90ZSAlOGQgbW9ubyBzYW1wbGVzIHRvIFwiJXNcIiBvbiBBbmRyb2lkIGRldmljZVxuIiwKQEAgLTY0MSwxMCArNjAyLDQ2IEBACiAgICAgICAgICAgICAgICB3cml0dGVuLCBGSUxFTkFNRV9BTEwpOwogICAgIH0KIAotICAgIGlmIChsb29wYmFja0RhdGEubG9vcGJhY2tQcm9jZXNzb3ItPmdldFJlc3VsdCgpIDwgMCkgewotICAgICAgICBwcmludGYoIkVSUk9SOiBMT09QQkFDSyBQUk9DRVNTSU5HIEZBSUxFRC4gTWF5YmUgYmVjYXVzZSB0aGUgdm9sdW1lIHdhcyB0b28gbG93LlxuIik7Ci0gICAgICAgIHJlc3VsdCA9IGxvb3BiYWNrRGF0YS5sb29wYmFja1Byb2Nlc3Nvci0+Z2V0UmVzdWx0KCk7CisgICAgaWYgKGxvb3BiYWNrRGF0YS5pbnB1dEVycm9yID09IEFBVURJT19PSykgeworICAgICAgICBpZiAodGVzdE1vZGUgPT0gVEVTVF9TSU5FX01BR05JVFVERSkgeworICAgICAgICAgICAgcHJpbnRBdWRpb0dyYXBoKGxvb3BiYWNrRGF0YS5hdWRpb1JlY29yZGluZywgMjAwKTsKKyAgICAgICAgfQorCisgICAgICAgIGxvb3BiYWNrRGF0YS5sb29wYmFja1Byb2Nlc3Nvci0+cmVwb3J0KCk7CiAgICAgfQorCisgICAgeworICAgICAgICBpbnQzMl90IGZyYW1lc1JlYWQgPSBBQXVkaW9TdHJlYW1fZ2V0RnJhbWVzUmVhZChpbnB1dFN0cmVhbSk7CisgICAgICAgIGludDMyX3QgZnJhbWVzV3JpdHRlbiA9IEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNXcml0dGVuKGlucHV0U3RyZWFtKTsKKyAgICAgICAgY29uc3QgaW50NjRfdCBmcmFtZXNBdmFpbGFibGUgPSBmcmFtZXNXcml0dGVuIC0gZnJhbWVzUmVhZDsKKyAgICAgICAgcHJpbnRmKCJDYWxsYmFjayBSZXN1bHRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSU5QVVRcbiIpOworICAgICAgICBwcmludGYoIiAgaW5wdXQgb3ZlcnJ1bnMgICA9ICU4ZFxuIiwgQUF1ZGlvU3RyZWFtX2dldFhSdW5Db3VudChpbnB1dFN0cmVhbSkpOworICAgICAgICBwcmludGYoIiAgZnJhbWVzV3JpdHRlbiAgICA9ICU4ZFxuIiwgZnJhbWVzV3JpdHRlbik7CisgICAgICAgIHByaW50ZigiICBmcmFtZXNSZWFkICAgICAgID0gJThkXG4iLCBmcmFtZXNSZWFkKTsKKyAgICAgICAgcHJpbnRmKCIgIG15RnJhbWVzUmVhZCAgICAgPSAlOGRcbiIsIChpbnQpIGxvb3BiYWNrRGF0YS5mcmFtZXNSZWFkVG90YWwpOworICAgICAgICBwcmludGYoIiAgd3JpdHRlbiAtIHJlYWQgICA9ICU4ZFxuIiwgKGludCkgZnJhbWVzQXZhaWxhYmxlKTsKKyAgICAgICAgcHJpbnRmKCIgIGluc3VmZmljaWVudCAjICAgPSAlOGRcbiIsIChpbnQpIGxvb3BiYWNrRGF0YS5pbnN1ZmZpY2llbnRSZWFkQ291bnQpOworICAgICAgICBpZiAobG9vcGJhY2tEYXRhLmluc3VmZmljaWVudFJlYWRDb3VudCA+IDApIHsKKyAgICAgICAgICAgIHByaW50ZigiICBpbnN1ZmZpYy4gZnJhbWVzID0gJThkXG4iLCAoaW50KSBsb29wYmFja0RhdGEuaW5zdWZmaWNpZW50UmVhZEZyYW1lcyk7CisgICAgICAgIH0KKyAgICAgICAgaW50MzJfdCBhY3R1YWxJbnB1dENhcGFjaXR5ID0gQUF1ZGlvU3RyZWFtX2dldEJ1ZmZlckNhcGFjaXR5SW5GcmFtZXMoaW5wdXRTdHJlYW0pOworICAgICAgICBpZiAoZnJhbWVzQXZhaWxhYmxlID4gMiAqIGFjdHVhbElucHV0Q2FwYWNpdHkpIHsKKyAgICAgICAgICAgIHByaW50ZigiICBXQVJOSU5HOiB3cml0dGVuIC0gcmVhZCA+IDIqY2FwYWNpdHkgIVxuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB7CisgICAgICAgIGludDMyX3QgZnJhbWVzUmVhZCA9IEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNSZWFkKG91dHB1dFN0cmVhbSk7CisgICAgICAgIGludDMyX3QgZnJhbWVzV3JpdHRlbiA9IEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNXcml0dGVuKG91dHB1dFN0cmVhbSk7CisgICAgICAgIHByaW50ZigiQ2FsbGJhY2sgUmVzdWx0cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE9VVFBVVFxuIik7CisgICAgICAgIHByaW50ZigiICBvdXRwdXQgdW5kZXJydW5zID0gJThkXG4iLCBBQXVkaW9TdHJlYW1fZ2V0WFJ1bkNvdW50KG91dHB1dFN0cmVhbSkpOworICAgICAgICBwcmludGYoIiAgbXlGcmFtZXNXcml0dGVuICA9ICU4ZFxuIiwgKGludCkgbG9vcGJhY2tEYXRhLmZyYW1lc1dyaXR0ZW5Ub3RhbCk7CisgICAgICAgIHByaW50ZigiICBmcmFtZXNXcml0dGVuICAgID0gJThkXG4iLCBmcmFtZXNXcml0dGVuKTsKKyAgICAgICAgcHJpbnRmKCIgIGZyYW1lc1JlYWQgICAgICAgPSAlOGRcbiIsIGZyYW1lc1JlYWQpOworICAgICAgICBwcmludGYoIiAgbWluIG51bUZyYW1lcyAgICA9ICU4ZFxuIiwgKGludCkgbG9vcGJhY2tEYXRhLm1pbk51bUZyYW1lcyk7CisgICAgICAgIHByaW50ZigiICBtYXggbnVtRnJhbWVzICAgID0gJThkXG4iLCAoaW50KSBsb29wYmFja0RhdGEubWF4TnVtRnJhbWVzKTsKKyAgICB9CisKICAgICBpZiAobG9vcGJhY2tEYXRhLmluc3VmZmljaWVudFJlYWRDb3VudCA+IDMpIHsKICAgICAgICAgcHJpbnRmKCJFUlJPUjogTE9PUEJBQ0sgUFJPQ0VTU0lORyBGQUlMRUQuIGluc3VmZmljaWVudFJlYWRDb3VudCB0b28gaGlnaFxuIik7CiAgICAgICAgIHJlc3VsdCA9IEFBVURJT19FUlJPUl9VTkFWQUlMQUJMRTsKQEAgLTY1NiwxNCArNjUzLDIzIEBACiAgICAgZGVsZXRlW10gbG9vcGJhY2tEYXRhLmlucHV0RmxvYXREYXRhOwogICAgIGRlbGV0ZVtdIGxvb3BiYWNrRGF0YS5pbnB1dFNob3J0RGF0YTsKIAorcmVwb3J0X3Jlc3VsdDoKKyAgICB3cml0dGVuID0gbG9vcGJhY2tEYXRhLmxvb3BiYWNrUHJvY2Vzc29yLT5zYXZlKEZJTEVOQU1FX1BST0NFU1NFRCk7CisgICAgaWYgKHdyaXR0ZW4gPiAwKSB7CisgICAgICAgIHByaW50ZigibWFpbigpIHdyb3RlICU4ZCBwcm9jZXNzZWQgc2FtcGxlcyB0byBcIiVzXCIgb24gQW5kcm9pZCBkZXZpY2VcbiIsCisgICAgICAgICAgICAgICB3cml0dGVuLCBGSUxFTkFNRV9QUk9DRVNTRUQpOworICAgIH0KKworICAgIGlmIChsb29wYmFja0RhdGEubG9vcGJhY2tQcm9jZXNzb3ItPmdldFJlc3VsdCgpIDwgMCkgeworICAgICAgICByZXN1bHQgPSBsb29wYmFja0RhdGEubG9vcGJhY2tQcm9jZXNzb3ItPmdldFJlc3VsdCgpOworICAgIH0KICAgICBwcmludGYoUkVTVUxUX1RBRyAicmVzdWx0ID0gJWQgXG4iLCByZXN1bHQpOyAvLyBtYWNoaW5lIHJlYWRhYmxlCiAgICAgcHJpbnRmKCJyZXN1bHQgaXMgJXNcbiIsIEFBdWRpb19jb252ZXJ0UmVzdWx0VG9UZXh0KHJlc3VsdCkpOyAvLyBodW1hbiByZWFkYWJsZQogICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7Ci0gICAgICAgIHByaW50ZigiRkFJTFVSRVxuIik7CisgICAgICAgIHByaW50ZigiVEVTVCBGQUlMRURcbiIpOwogICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIHByaW50ZigiU1VDQ0VTU1xuIik7CisgICAgICAgIHByaW50ZigiVEVTVCBQQVNTRURcbiIpOwogICAgICAgICByZXR1cm4gRVhJVF9TVUNDRVNTOwogICAgIH0KIH0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzL0FBdWRpb0FyZ3NQYXJzZXIuaCBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscy9BQXVkaW9BcmdzUGFyc2VyLmgKaW5kZXggMGU2MTU4OS4uYTVkYzU1ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzL0FBdWRpb0FyZ3NQYXJzZXIuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvdXRpbHMvQUF1ZGlvQXJnc1BhcnNlci5oCkBAIC0xMzAsMTAgKzEzMCwxMiBAQAogICAgIH0KIAogICAgIGludDMyX3QgZ2V0QnVmZmVyQ2FwYWNpdHkoKSBjb25zdCB7CisgICAgICAgIHByaW50ZigiJXMoKSByZXR1cm5zICVkXG4iLCBfX2Z1bmNfXywgbUJ1ZmZlckNhcGFjaXR5KTsKICAgICAgICAgcmV0dXJuIG1CdWZmZXJDYXBhY2l0eTsKICAgICB9CiAKICAgICB2b2lkIHNldEJ1ZmZlckNhcGFjaXR5KGludDMyX3QgZnJhbWVzKSB7CisgICAgICAgIHByaW50ZigiJXMoJWQpXG4iLCBfX2Z1bmNfXywgZnJhbWVzKTsKICAgICAgICAgbUJ1ZmZlckNhcGFjaXR5ID0gZnJhbWVzOwogICAgIH0KIApAQCAtMTg1LDE4ICsxODcsMjYgQEAKICAgICAgICAgbU51bWJlck9mQnVyc3RzID0gbnVtQnVyc3RzOwogICAgIH0KIAorICAgIGludDMyX3QgZ2V0RnJhbWVzUGVyQ2FsbGJhY2soKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtRnJhbWVzUGVyQ2FsbGJhY2s7CisgICAgfQorICAgIHZvaWQgc2V0RnJhbWVzUGVyQ2FsbGJhY2soaW50MzJfdCBzaXplKSB7CisgICAgICAgIG1GcmFtZXNQZXJDYWxsYmFjayA9IHNpemU7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogQXBwbHkgdGhlc2UgcGFyYW1ldGVycyB0byBhIHN0cmVhbSBidWlsZGVyLgogICAgICAqIEBwYXJhbSBidWlsZGVyCiAgICAgICovCiAgICAgdm9pZCBhcHBseVBhcmFtZXRlcnMoQUF1ZGlvU3RyZWFtQnVpbGRlciAqYnVpbGRlcikgY29uc3QgeworICAgICAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldEJ1ZmZlckNhcGFjaXR5SW5GcmFtZXMoYnVpbGRlciwgZ2V0QnVmZmVyQ2FwYWNpdHkoKSk7CiAgICAgICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0Q2hhbm5lbENvdW50KGJ1aWxkZXIsIG1DaGFubmVsQ291bnQpOwotICAgICAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldEZvcm1hdChidWlsZGVyLCBtRm9ybWF0KTsKLSAgICAgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRTYW1wbGVSYXRlKGJ1aWxkZXIsIG1TYW1wbGVSYXRlKTsKLSAgICAgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRCdWZmZXJDYXBhY2l0eUluRnJhbWVzKGJ1aWxkZXIsIG1CdWZmZXJDYXBhY2l0eSk7CiAgICAgICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0RGV2aWNlSWQoYnVpbGRlciwgbURldmljZUlkKTsKLSAgICAgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRTaGFyaW5nTW9kZShidWlsZGVyLCBtU2hhcmluZ01vZGUpOworICAgICAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldEZvcm1hdChidWlsZGVyLCBtRm9ybWF0KTsKKyAgICAgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRGcmFtZXNQZXJEYXRhQ2FsbGJhY2soYnVpbGRlciwgbUZyYW1lc1BlckNhbGxiYWNrKTsKICAgICAgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRQZXJmb3JtYW5jZU1vZGUoYnVpbGRlciwgbVBlcmZvcm1hbmNlTW9kZSk7CisgICAgICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0U2FtcGxlUmF0ZShidWlsZGVyLCBtU2FtcGxlUmF0ZSk7CisgICAgICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0U2hhcmluZ01vZGUoYnVpbGRlciwgbVNoYXJpbmdNb2RlKTsKIAogICAgICAgICAvLyBDYWxsIFAgZnVuY3Rpb25zIGlmIHN1cHBvcnRlZC4KICAgICAgICAgbG9hZEZ1dHVyZUZ1bmN0aW9ucygpOwpAQCAtMjMyLDYgKzI0Miw3IEBACiAgICAgYWF1ZGlvX2lucHV0X3ByZXNldF90ICAgICAgbUlucHV0UHJlc2V0ICAgICA9IEFBVURJT19VTlNQRUNJRklFRDsKIAogICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgIG1OdW1iZXJPZkJ1cnN0cyAgPSBBQVVESU9fVU5TUEVDSUZJRUQ7CisgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgbUZyYW1lc1BlckNhbGxiYWNrID0gQUFVRElPX1VOU1BFQ0lGSUVEOwogfTsKIAogY2xhc3MgQUF1ZGlvQXJnc1BhcnNlciA6IHB1YmxpYyBBQXVkaW9QYXJhbWV0ZXJzIHsKQEAgLTI3Miw3ICsyODMsNyBAQAogICAgICAgICAgICAgICAgICAgICBpZiAoc3RybGVuKGFyZykgPiAyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBwb2xpY3kgPSBhdG9pKCZhcmdbMl0pOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmICghQUF1ZGlvX3NldE1NYXBQb2xpY3kocG9saWN5KSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoQUF1ZGlvX3NldE1NYXBQb2xpY3kocG9saWN5KSAhPSBBQVVESU9fT0spIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiRVJST1I6IGludmFsaWQgTU1BUCBwb2xpY3kgbW9kZSAlaVxuIiwgcG9saWN5KTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0gYnJlYWs7CkBAIC0yOTcsNiArMzA4LDkgQEAKICAgICAgICAgICAgICAgICBjYXNlICd5JzoKICAgICAgICAgICAgICAgICAgICAgc2V0Q29udGVudFR5cGUoYXRvaSgmYXJnWzJdKSk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgJ3onOgorICAgICAgICAgICAgICAgICAgICBzZXRGcmFtZXNQZXJDYWxsYmFjayhhdG9pKCZhcmdbMl0pKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgdW5yZWNvZ25pemVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC0zNTAsNiArMzY0LDcgQEAKICAgICAgICAgcHJpbnRmKCIgICAgICAtdXt1c2FnZX0gZWcuIDE0IGZvciBBQVVESU9fVVNBR0VfR0FNRVxuIik7CiAgICAgICAgIHByaW50ZigiICAgICAgLXggdG8gdXNlIEVYQ0xVU0lWRSBtb2RlXG4iKTsKICAgICAgICAgcHJpbnRmKCIgICAgICAteXtjb250ZW50VHlwZX0gZWcuIDEgZm9yIEFBVURJT19DT05URU5UX1RZUEVfU1BFRUNIXG4iKTsKKyAgICAgICAgcHJpbnRmKCIgICAgICAtentjYWxsYmFja1NpemV9IG9yIGJsb2NrIHNpemUsIGluIGZyYW1lcywgZGVmYXVsdCA9IDBcbiIpOwogICAgIH0KIAogICAgIHN0YXRpYyBhYXVkaW9fcGVyZm9ybWFuY2VfbW9kZV90IHBhcnNlUGVyZm9ybWFuY2VNb2RlKGNoYXIgYykgewpAQCAtNDA2LDYgKzQyMSw5IEBACiAgICAgICAgIHByaW50ZigiICBDYXBhY2l0eTogICAgIHJlcXVlc3RlZCA9ICVkLCBhY3R1YWwgPSAlZFxuIiwgZ2V0QnVmZmVyQ2FwYWNpdHkoKSwKICAgICAgICAgICAgICAgIEFBdWRpb1N0cmVhbV9nZXRCdWZmZXJDYXBhY2l0eUluRnJhbWVzKHN0cmVhbSkpOwogCisgICAgICAgIHByaW50ZigiICBDYWxsYmFja1NpemU6IHJlcXVlc3RlZCA9ICVkLCBhY3R1YWwgPSAlZFxuIiwgZ2V0RnJhbWVzUGVyQ2FsbGJhY2soKSwKKyAgICAgICAgICAgICAgIEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNQZXJEYXRhQ2FsbGJhY2soc3RyZWFtKSk7CisKICAgICAgICAgcHJpbnRmKCIgIFNoYXJpbmdNb2RlOiAgcmVxdWVzdGVkID0gJXMsIGFjdHVhbCA9ICVzXG4iLAogICAgICAgICAgICAgICAgZ2V0U2hhcmluZ01vZGVUZXh0KGdldFNoYXJpbmdNb2RlKCkpLAogICAgICAgICAgICAgICAgZ2V0U2hhcmluZ01vZGVUZXh0KEFBdWRpb1N0cmVhbV9nZXRTaGFyaW5nTW9kZShzdHJlYW0pKSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvdXRpbHMvQUF1ZGlvU2ltcGxlUGxheWVyLmggYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvdXRpbHMvQUF1ZGlvU2ltcGxlUGxheWVyLmgKaW5kZXggNTRiNzdiYS4uMTY0NTk4NiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzL0FBdWRpb1NpbXBsZVBsYXllci5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscy9BQXVkaW9TaW1wbGVQbGF5ZXIuaApAQCAtMTkzLDcgKzE5Myw3IEBACiAgICAgIGFhdWRpb19yZXN1bHRfdCBzdGFydCgpIHsKICAgICAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBdWRpb1N0cmVhbV9yZXF1ZXN0U3RhcnQobVN0cmVhbSk7CiAgICAgICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7Ci0gICAgICAgICAgICBwcmludGYoIkVSUk9SIC0gQUF1ZGlvU3RyZWFtX3JlcXVlc3RTdGFydCgpIHJldHVybmVkICVkICVzXG4iLAorICAgICAgICAgICAgcHJpbnRmKCJFUlJPUiAtIEFBdWRpb1N0cmVhbV9yZXF1ZXN0U3RhcnQob3V0cHV0KSByZXR1cm5lZCAlZCAlc1xuIiwKICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LCBBQXVkaW9fY29udmVydFJlc3VsdFRvVGV4dChyZXN1bHQpKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gcmVzdWx0OwpAQCAtMjAzLDcgKzIwMyw3IEBACiAgICAgYWF1ZGlvX3Jlc3VsdF90IHN0b3AoKSB7CiAgICAgICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQXVkaW9TdHJlYW1fcmVxdWVzdFN0b3AobVN0cmVhbSk7CiAgICAgICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7Ci0gICAgICAgICAgICBwcmludGYoIkVSUk9SIC0gQUF1ZGlvU3RyZWFtX3JlcXVlc3RTdG9wKCkgcmV0dXJuZWQgJWQgJXNcbiIsCisgICAgICAgICAgICBwcmludGYoIkVSUk9SIC0gQUF1ZGlvU3RyZWFtX3JlcXVlc3RTdG9wKG91dHB1dCkgcmV0dXJuZWQgJWQgJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LCBBQXVkaW9fY29udmVydFJlc3VsdFRvVGV4dChyZXN1bHQpKTsKICAgICAgICAgfQogICAgICAgICBpbnQzMl90IHhSdW5Db3VudCA9IEFBdWRpb1N0cmVhbV9nZXRYUnVuQ291bnQobVN0cmVhbSk7CkBAIC0yMTUsNyArMjE1LDcgQEAKICAgICBhYXVkaW9fcmVzdWx0X3QgcGF1c2UoKSB7CiAgICAgICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQXVkaW9TdHJlYW1fcmVxdWVzdFBhdXNlKG1TdHJlYW0pOwogICAgICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgewotICAgICAgICAgICAgcHJpbnRmKCJFUlJPUiAtIEFBdWRpb1N0cmVhbV9yZXF1ZXN0UGF1c2UoKSByZXR1cm5lZCAlZCAlc1xuIiwKKyAgICAgICAgICAgIHByaW50ZigiRVJST1IgLSBBQXVkaW9TdHJlYW1fcmVxdWVzdFBhdXNlKG91dHB1dCkgcmV0dXJuZWQgJWQgJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LCBBQXVkaW9fY29udmVydFJlc3VsdFRvVGV4dChyZXN1bHQpKTsKICAgICAgICAgfQogICAgICAgICBpbnQzMl90IHhSdW5Db3VudCA9IEFBdWRpb1N0cmVhbV9nZXRYUnVuQ291bnQobVN0cmVhbSk7CkBAIC0yMjMsMTEgKzIyMywyNyBAQAogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KIAorICAgIGFhdWRpb19yZXN1bHRfdCB3YWl0VW50aWxQYXVzZWQoKSB7CisgICAgICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQVVESU9fT0s7CisgICAgICAgIGFhdWRpb19zdHJlYW1fc3RhdGVfdCBjdXJyZW50U3RhdGUgPSBBQXVkaW9TdHJlYW1fZ2V0U3RhdGUobVN0cmVhbSk7CisgICAgICAgIGFhdWRpb19zdHJlYW1fc3RhdGVfdCBpbnB1dFN0YXRlID0gQUFVRElPX1NUUkVBTV9TVEFURV9QQVVTSU5HOworICAgICAgICB3aGlsZSAocmVzdWx0ID09IEFBVURJT19PSyAmJiBjdXJyZW50U3RhdGUgPT0gQUFVRElPX1NUUkVBTV9TVEFURV9QQVVTSU5HKSB7CisgICAgICAgICAgICByZXN1bHQgPSBBQXVkaW9TdHJlYW1fd2FpdEZvclN0YXRlQ2hhbmdlKG1TdHJlYW0sIGlucHV0U3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjdXJyZW50U3RhdGUsIE5BTk9TX1BFUl9TRUNPTkQpOworICAgICAgICAgICAgaW5wdXRTdGF0ZSA9IGN1cnJlbnRTdGF0ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgeworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKGN1cnJlbnRTdGF0ZSA9PSBBQVVESU9fU1RSRUFNX1NUQVRFX1BBVVNFRCkKKyAgICAgICAgICAgICAgID8gQUFVRElPX09LIDogQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CisgICAgfQorCiAgICAgLy8gRmx1c2ggdGhlIHN0cmVhbS4gQUF1ZGlvIHdpbGwgc3RvcCBjYWxsaW5nIHlvdXIgY2FsbGJhY2sgZnVuY3Rpb24uCiAgICAgYWF1ZGlvX3Jlc3VsdF90IGZsdXNoKCkgewogICAgICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUF1ZGlvU3RyZWFtX3JlcXVlc3RGbHVzaChtU3RyZWFtKTsKICAgICAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKLSAgICAgICAgICAgIHByaW50ZigiRVJST1IgLSBBQXVkaW9TdHJlYW1fcmVxdWVzdEZsdXNoKCkgcmV0dXJuZWQgJWQgJXNcbiIsCisgICAgICAgICAgICBwcmludGYoIkVSUk9SIC0gQUF1ZGlvU3RyZWFtX3JlcXVlc3RGbHVzaChvdXRwdXQpIHJldHVybmVkICVkICVzXG4iLAogICAgICAgICAgICAgICAgICAgIHJlc3VsdCwgQUF1ZGlvX2NvbnZlcnRSZXN1bHRUb1RleHQocmVzdWx0KSk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHJlc3VsdDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscy9BQXVkaW9TaW1wbGVSZWNvcmRlci5oIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzL0FBdWRpb1NpbXBsZVJlY29yZGVyLmgKaW5kZXggODY5ZmFkMC4uMjQ2ZTJkNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzL0FBdWRpb1NpbXBsZVJlY29yZGVyLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzL0FBdWRpb1NpbXBsZVJlY29yZGVyLmgKQEAgLTIwMSw4ICsyMDEsMTAgQEAKICAgICAgYWF1ZGlvX3Jlc3VsdF90IHN0YXJ0KCkgewogICAgICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUF1ZGlvU3RyZWFtX3JlcXVlc3RTdGFydChtU3RyZWFtKTsKICAgICAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRVJST1IgLSBBQXVkaW9TdHJlYW1fcmVxdWVzdFN0YXJ0KCkgcmV0dXJuZWQgJWQgJXNcbiIsCisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SIC0gQUF1ZGlvU3RyZWFtX3JlcXVlc3RTdGFydChpbnB1dCkgcmV0dXJuZWQgJWQgJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCwgQUF1ZGlvX2NvbnZlcnRSZXN1bHRUb1RleHQocmVzdWx0KSk7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgRGlkIHlvdSByZW1lbWJlciB0byBlbnRlcjogICBhZGIgcm9vdCAgICA/Pz8/XG4iKTsKKwogICAgICAgICB9CiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQpAQCAtMjExLDggKzIxMyw5IEBACiAgICAgYWF1ZGlvX3Jlc3VsdF90IHN0b3AoKSB7CiAgICAgICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQXVkaW9TdHJlYW1fcmVxdWVzdFN0b3AobVN0cmVhbSk7CiAgICAgICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SIC0gQUF1ZGlvU3RyZWFtX3JlcXVlc3RTdG9wKCkgcmV0dXJuZWQgJWQgJXNcbiIsCisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SIC0gQUF1ZGlvU3RyZWFtX3JlcXVlc3RTdG9wKGlucHV0KSByZXR1cm5lZCAlZCAlc1xuIiwKICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LCBBQXVkaW9fY29udmVydFJlc3VsdFRvVGV4dChyZXN1bHQpKTsKKwogICAgICAgICB9CiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQpAQCAtMjIxLDcgKzIyNCw3IEBACiAgICAgYWF1ZGlvX3Jlc3VsdF90IHBhdXNlKCkgewogICAgICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUF1ZGlvU3RyZWFtX3JlcXVlc3RQYXVzZShtU3RyZWFtKTsKICAgICAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRVJST1IgLSBBQXVkaW9TdHJlYW1fcmVxdWVzdFBhdXNlKCkgcmV0dXJuZWQgJWQgJXNcbiIsCisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SIC0gQUF1ZGlvU3RyZWFtX3JlcXVlc3RQYXVzZShpbnB1dCkgcmV0dXJuZWQgJWQgJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCwgQUF1ZGlvX2NvbnZlcnRSZXN1bHRUb1RleHQocmVzdWx0KSk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHJlc3VsdDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy93cml0ZV9zaW5lL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvd3JpdGVfc2luZS9BbmRyb2lkLmJwCmluZGV4IGFhMjVlNjcuLmNjODA4NjEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy93cml0ZV9zaW5lL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3dyaXRlX3NpbmUvQW5kcm9pZC5icApAQCAtNCw2ICs0LDcgQEAKICAgICBjZmxhZ3M6IFsiLVdhbGwiLCAiLVdlcnJvciJdLAogICAgIHNoYXJlZF9saWJzOiBbImxpYmFhdWRpbyJdLAogICAgIGhlYWRlcl9saWJzOiBbImxpYmFhdWRpb19leGFtcGxlX3V0aWxzIl0sCisgICAgcGFja19yZWxvY2F0aW9uczogZmFsc2UsCiB9CiAKIGNjX3Rlc3QgewpAQCAtMTIsNCArMTMsNSBAQAogICAgIGNmbGFnczogWyItV2FsbCIsICItV2Vycm9yIl0sCiAgICAgc2hhcmVkX2xpYnM6IFsibGliYWF1ZGlvIl0sCiAgICAgaGVhZGVyX2xpYnM6IFsibGliYWF1ZGlvX2V4YW1wbGVfdXRpbHMiXSwKKyAgICBwYWNrX3JlbG9jYXRpb25zOiBmYWxzZSwKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy93cml0ZV9zaW5lL2puaS9BbmRyb2lkLm1rIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3dyaXRlX3NpbmUvam5pL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhMWJkNDMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3dyaXRlX3NpbmUvam5pL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi1MT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKLUxPQ0FMX0NfSU5DTFVERVMgOj0gXAotICAgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby11dGlscykgXAotICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGliYWF1ZGlvL2luY2x1ZGUgXAotICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGliYWF1ZGlvL3NyYyBcCi0gICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvdXRpbHMKLQotIyBOREsgcmVjb21tZW5kcyB1c2luZyB0aGlzIGtpbmQgb2YgcmVsYXRpdmUgcGF0aCBpbnN0ZWFkIG9mIGFuIGFic29sdXRlIHBhdGguCi1MT0NBTF9TUkNfRklMRVM6PSAuLi9zcmMvd3JpdGVfc2luZS5jcHAKLUxPQ0FMX0NGTEFHUyA6PSAtV2FsbCAtV2Vycm9yCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmFhdWRpbwotTE9DQUxfTU9EVUxFIDo9IHdyaXRlX3NpbmUKLWluY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLUxPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCi1MT0NBTF9DX0lOQ0xVREVTIDo9IFwKLSAgICAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tdXRpbHMpIFwKLSAgICBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmFhdWRpby9pbmNsdWRlIFwKLSAgICBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscwotCi1MT0NBTF9TUkNfRklMRVM6PSAuLi9zcmMvd3JpdGVfc2luZV9jYWxsYmFjay5jcHAKLUxPQ0FMX0NGTEFHUyA6PSAtV2FsbCAtV2Vycm9yCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmFhdWRpbwotTE9DQUxfTU9EVUxFIDo9IHdyaXRlX3NpbmVfY2FsbGJhY2sKLWluY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLUxPQ0FMX01PRFVMRSA6PSBsaWJhYXVkaW9fcHJlYnVpbHQKLUxPQ0FMX1NSQ19GSUxFUyA6PSBsaWJhYXVkaW8uc28KLUxPQ0FMX0VYUE9SVF9DX0lOQ0xVREVTIDo9ICQoTE9DQUxfUEFUSCkvaW5jbHVkZQotaW5jbHVkZSAkKFBSRUJVSUxUX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3dyaXRlX3NpbmUvam5pL0FwcGxpY2F0aW9uLm1rIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3dyaXRlX3NpbmUvam5pL0FwcGxpY2F0aW9uLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTQ0ZjM3Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy93cml0ZV9zaW5lL2puaS9BcHBsaWNhdGlvbi5taworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLUFQUF9DUFBGTEFHUyArPSAtc3RkPWMrKzExCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvd3JpdGVfc2luZS9zcmMvd3JpdGVfc2luZV9jYWxsYmFjay5jcHAgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvd3JpdGVfc2luZS9zcmMvd3JpdGVfc2luZV9jYWxsYmFjay5jcHAKaW5kZXggZTMzZTlmOC4uN2E0ODE1MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3dyaXRlX3NpbmUvc3JjL3dyaXRlX3NpbmVfY2FsbGJhY2suY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy93cml0ZV9zaW5lL3NyYy93cml0ZV9zaW5lX2NhbGxiYWNrLmNwcApAQCAtMzAsNiArMzAsOCBAQAogI2luY2x1ZGUgIkFBdWRpb1NpbXBsZVBsYXllci5oIgogI2luY2x1ZGUgIkFBdWRpb0FyZ3NQYXJzZXIuaCIKIAorI2RlZmluZSBBUFBfVkVSU0lPTiAgIjAuMS41IgorCiAvKioKICAqIE9wZW4gc3RyZWFtLCBwbGF5IHNvbWUgc2luZSB3YXZlcywgdGhlbiBjbG9zZSB0aGUgc3RyZWFtLgogICoKQEAgLTEwOSwxMyArMTExLDEzIEBACiAgICAgICAgIHN0YXJ0ZWRBdE5hbm9zID0gZ2V0TmFub3NlY29uZHMoQ0xPQ0tfTU9OT1RPTklDKTsKICAgICAgICAgZm9yIChpbnQgc2Vjb25kID0gMDsgc2Vjb25kIDwgZHVyYXRpb25TZWNvbmRzOyBzZWNvbmQrKykgewogICAgICAgICAgICAgLy8gU2xlZXAgYSB3aGlsZS4gV2FrZSB1cCBlYXJseSBpZiB0aGVyZSBpcyBhbiBlcnJvciwgZm9yIGV4YW1wbGUgYSBESVNDT05ORUNULgotICAgICAgICAgICAgbG9uZyByZXQgPSBteURhdGEud2FrZXIud2FpdChBQVVESU9fT0ssIE5BTk9TX1BFUl9TRUNPTkQpOworICAgICAgICAgICAgbXlEYXRhLndha2VyLndhaXQoQUFVRElPX09LLCBOQU5PU19QRVJfU0VDT05EKTsKICAgICAgICAgICAgIGludDY0X3QgbWlsbGlzID0KICAgICAgICAgICAgICAgICAgICAgKGdldE5hbm9zZWNvbmRzKENMT0NLX01PTk9UT05JQykgLSBzdGFydGVkQXROYW5vcykgLyBOQU5PU19QRVJfTUlMTElTRUNPTkQ7CiAgICAgICAgICAgICByZXN1bHQgPSBteURhdGEud2FrZXIuZ2V0KCk7Ci0gICAgICAgICAgICBwcmludGYoIndhaXQoKSByZXR1cm5zICVsZCwgYWF1ZGlvX3Jlc3VsdCA9ICVkLCBhdCAlNmQgbWlsbGlzIgorICAgICAgICAgICAgcHJpbnRmKCIgd2FrZXIgcmVzdWx0ID0gJWQsIGF0ICU2ZCBtaWxsaXMiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLCBzZWNvbmQgPSAlM2QsIGZyYW1lc1dyaXR0ZW4gPSAlOGQsIHVuZGVycnVucyA9ICVkXG4iLAotICAgICAgICAgICAgICAgICAgIHJldCwgcmVzdWx0LCAoaW50KSBtaWxsaXMsCisgICAgICAgICAgICAgICAgICAgcmVzdWx0LCAoaW50KSBtaWxsaXMsCiAgICAgICAgICAgICAgICAgICAgc2Vjb25kLAogICAgICAgICAgICAgICAgICAgIChpbnQpIEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNXcml0dGVuKHBsYXllci5nZXRTdHJlYW0oKSksCiAgICAgICAgICAgICAgICAgICAgKGludCkgQUF1ZGlvU3RyZWFtX2dldFhSdW5Db3VudChwbGF5ZXIuZ2V0U3RyZWFtKCkpKTsKQEAgLTEzOCw2ICsxNDAsMTAgQEAKICAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CiAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlc3VsdCA9IHBsYXllci53YWl0VW50aWxQYXVzZWQoKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJlc3VsdCA9IHBsYXllci5mbHVzaCgpOwogICAgICAgICB9CiAgICAgICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CkBAIC0yMTksNyArMjI1LDcgQEAKICAgICAvLyBpbiBhIGJ1ZmZlciBpZiB3ZSBoYW5nIG9yIGNyYXNoLgogICAgIHNldHZidWYoc3Rkb3V0LCBudWxscHRyLCBfSU9OQkYsIChzaXplX3QpIDApOwogCi0gICAgcHJpbnRmKCIlcyAtIFBsYXkgYSBzaW5lIHN3ZWVwIHVzaW5nIGFuIEFBdWRpbyBjYWxsYmFjayBWMC4xLjRcbiIsIGFyZ3ZbMF0pOworICAgIHByaW50ZigiJXMgLSBQbGF5IGEgc2luZSBzd2VlcCB1c2luZyBhbiBBQXVkaW8gY2FsbGJhY2sgViVzXG4iLCBhcmd2WzBdLCBBUFBfVkVSU0lPTik7CiAKICAgICBmb3IgKGludCBpID0gMTsgaSA8IGFyZ2M7IGkrKykgewogICAgICAgICBjb25zdCBjaGFyICphcmcgPSBhcmd2W2ldOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9BbmRyb2lkLmJwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9BbmRyb2lkLmJwCmluZGV4IGI5ZTI4YTAuLjQwOTAyODYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL0FuZHJvaWQuYnAKQEAgLTYsNiArNiw3IEBACiAgICAgICAgICJjbGllbnQiLAogICAgICAgICAiY29yZSIsCiAgICAgICAgICJmaWZvIiwKKyAgICAgICAgImZsb3dncmFwaCIsCiAgICAgICAgICJsZWdhY3kiLAogICAgICAgICAidXRpbGl0eSIsCiAgICAgXSwKQEAgLTI1LDkgKzI2LDkgQEAKICAgICAgICAgInV0aWxpdHkvRml4ZWRCbG9ja0FkYXB0ZXIuY3BwIiwKICAgICAgICAgInV0aWxpdHkvRml4ZWRCbG9ja1JlYWRlci5jcHAiLAogICAgICAgICAidXRpbGl0eS9GaXhlZEJsb2NrV3JpdGVyLmNwcCIsCi0gICAgICAgICJ1dGlsaXR5L0xpbmVhclJhbXAuY3BwIiwKICAgICAgICAgImZpZm8vRmlmb0J1ZmZlci5jcHAiLAogICAgICAgICAiZmlmby9GaWZvQ29udHJvbGxlckJhc2UuY3BwIiwKKyAgICAgICAgImNsaWVudC9BQXVkaW9GbG93R3JhcGguY3BwIiwKICAgICAgICAgImNsaWVudC9BdWRpb0VuZHBvaW50LmNwcCIsCiAgICAgICAgICJjbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbC5jcHAiLAogICAgICAgICAiY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxDYXB0dXJlLmNwcCIsCkBAIC00Miw2ICs0MywxNiBAQAogICAgICAgICAiYmluZGluZy9SaW5nQnVmZmVyUGFyY2VsYWJsZS5jcHAiLAogICAgICAgICAiYmluZGluZy9TaGFyZWRNZW1vcnlQYXJjZWxhYmxlLmNwcCIsCiAgICAgICAgICJiaW5kaW5nL1NoYXJlZFJlZ2lvblBhcmNlbGFibGUuY3BwIiwKKyAgICAgICAgImZsb3dncmFwaC9BdWRpb1Byb2Nlc3NvckJhc2UuY3BwIiwKKyAgICAgICAgImZsb3dncmFwaC9DbGlwVG9SYW5nZS5jcHAiLAorICAgICAgICAiZmxvd2dyYXBoL01vbm9Ub011bHRpQ29udmVydGVyLmNwcCIsCisgICAgICAgICJmbG93Z3JhcGgvUmFtcExpbmVhci5jcHAiLAorICAgICAgICAiZmxvd2dyYXBoL1NpbmtGbG9hdC5jcHAiLAorICAgICAgICAiZmxvd2dyYXBoL1NpbmtJMTYuY3BwIiwKKyAgICAgICAgImZsb3dncmFwaC9TaW5rSTI0LmNwcCIsCisgICAgICAgICJmbG93Z3JhcGgvU291cmNlRmxvYXQuY3BwIiwKKyAgICAgICAgImZsb3dncmFwaC9Tb3VyY2VJMTYuY3BwIiwKKyAgICAgICAgImZsb3dncmFwaC9Tb3VyY2VJMjQuY3BwIiwKICAgICBdLAogCiAgICAgY2ZsYWdzOiBbCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbi5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbi5jcHAKaW5kZXggOTU5ZGI2MS4uM2QxYmM5YiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0FBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb24uY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uLmNwcApAQCAtMTQsNiArMTQsMTAgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNkZWZpbmUgTE9HX1RBRyAiQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbiIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKwogI2luY2x1ZGUgPHN0ZGludC5oPgogCiAjaW5jbHVkZSA8c3lzL21tYW4uaD4KQEAgLTM2LDYgKzQwLDcgQEAKIAogc3RhdHVzX3QgQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbjo6d3JpdGVUb1BhcmNlbChQYXJjZWwqIHBhcmNlbCkgY29uc3QgewogICAgIHN0YXR1c190IHN0YXR1czsKKwogICAgIHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVJbnQzMihnZXREZXZpY2VJZCgpKTsKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSBnb3RvIGVycm9yOwogICAgIHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVJbnQzMihnZXRTYW1wbGVSYXRlKCkpOwpAQCAtNDYsNiArNTEsNyBAQAogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7CiAgICAgc3RhdHVzID0gcGFyY2VsLT53cml0ZUludDMyKChpbnQzMl90KSBnZXRGb3JtYXQoKSk7CiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKKwogICAgIHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVJbnQzMigoaW50MzJfdCkgZ2V0RGlyZWN0aW9uKCkpOwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7CiAgICAgc3RhdHVzID0gcGFyY2VsLT53cml0ZUludDMyKGdldEJ1ZmZlckNhcGFjaXR5KCkpOwpAQCAtNjAsNyArNjYsNyBAQAogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogZXJyb3I6Ci0gICAgQUxPR0UoIkFBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb24ud3JpdGVUb1BhcmNlbCgpOiB3cml0ZSBmYWlsZWQgPSAlZCIsIHN0YXR1cyk7CisgICAgQUxPR0UoIiVzKCk6IHdyaXRlIGZhaWxlZCA9ICVkIiwgX19mdW5jX18sIHN0YXR1cyk7CiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIApAQCAtODAsNyArODYsOCBAQAogICAgIHNldFNoYXJpbmdNb2RlKChhYXVkaW9fc2hhcmluZ19tb2RlX3QpIHZhbHVlKTsKICAgICBzdGF0dXMgPSBwYXJjZWwtPnJlYWRJbnQzMigmdmFsdWUpOwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7Ci0gICAgc2V0Rm9ybWF0KChhYXVkaW9fZm9ybWF0X3QpIHZhbHVlKTsKKyAgICBzZXRGb3JtYXQoKGF1ZGlvX2Zvcm1hdF90KSB2YWx1ZSk7CisKICAgICBzdGF0dXMgPSBwYXJjZWwtPnJlYWRJbnQzMigmdmFsdWUpOwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7CiAgICAgc2V0RGlyZWN0aW9uKChhYXVkaW9fZGlyZWN0aW9uX3QpIHZhbHVlKTsKQEAgLTk5LDggKzEwNiw5IEBACiAgICAgc3RhdHVzID0gcGFyY2VsLT5yZWFkSW50MzIoJnZhbHVlKTsKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSBnb3RvIGVycm9yOwogICAgIHNldFNlc3Npb25JZCh2YWx1ZSk7CisKICAgICByZXR1cm4gTk9fRVJST1I7CiBlcnJvcjoKLSAgICBBTE9HRSgiQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbi5yZWFkRnJvbVBhcmNlbCgpOiByZWFkIGZhaWxlZCA9ICVkIiwgc3RhdHVzKTsKKyAgICBBTE9HRSgiJXMoKTogcmVhZCBmYWlsZWQgPSAlZCIsIF9fZnVuY19fLCBzdGF0dXMpOwogICAgIHJldHVybiBzdGF0dXM7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvU2hhcmVkTWVtb3J5UGFyY2VsYWJsZS5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvU2hhcmVkTWVtb3J5UGFyY2VsYWJsZS5jcHAKaW5kZXggMGIwY2Y3Ny4uNjc5NTVlOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL1NoYXJlZE1lbW9yeVBhcmNlbGFibGUuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9TaGFyZWRNZW1vcnlQYXJjZWxhYmxlLmNwcApAQCAtNDMsNyArNDMsNyBAQAogCiB2b2lkIFNoYXJlZE1lbW9yeVBhcmNlbGFibGU6OnNldHVwKGNvbnN0IHVuaXF1ZV9mZCYgZmQsIGludDMyX3Qgc2l6ZUluQnl0ZXMpIHsKICAgICBtRmQucmVzZXQoZHVwKGZkLmdldCgpKSk7IC8vIHN0b3JlIGEgZHVwbGljYXRlIGZkCi0gICAgQUxPR1YoInNldHVwKCVkIC0+ICVkLCAlZCkgdGhpcyA9ICVwXG4iLCBmZC5nZXQoKSwgbUZkLmdldCgpLCBzaXplSW5CeXRlcywgdGhpcyk7CisgICAgQUxPR1YoInNldHVwKGZkID0gJWQgLT4gJWQsIHNpemUgPSAlZCkgdGhpcyA9ICVwXG4iLCBmZC5nZXQoKSwgbUZkLmdldCgpLCBzaXplSW5CeXRlcywgdGhpcyk7CiAgICAgbVNpemVJbkJ5dGVzID0gc2l6ZUluQnl0ZXM7CiB9CiAKQEAgLTEwNCw3ICsxMDQsOCBAQAogICAgIG1SZXNvbHZlZEFkZHJlc3MgPSAodWludDhfdCAqKSBtbWFwKDAsIG1TaXplSW5CeXRlcywgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVBfU0hBUkVELCBmZC5nZXQoKSwgMCk7CiAgICAgaWYgKG1SZXNvbHZlZEFkZHJlc3MgPT0gTU1BUF9VTlJFU09MVkVEX0FERFJFU1MpIHsKLSAgICAgICAgQUxPR0UoIm1tYXAoKSBmYWlsZWQgZm9yIGZkID0gJWQsIGVycm5vID0gJXMiLCBmZC5nZXQoKSwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgQUxPR0UoIm1tYXAoKSBmYWlsZWQgZm9yIGZkID0gJWQsIG5CeXRlcyA9ICVkLCBlcnJubyA9ICVzIiwKKyAgICAgICAgICAgICAgZmQuZ2V0KCksIG1TaXplSW5CeXRlcywgc3RyZXJyb3IoZXJybm8pKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlRFUk5BTDsKICAgICB9CiAgICAgcmV0dXJuIEFBVURJT19PSzsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9TaGFyZWRNZW1vcnlQYXJjZWxhYmxlLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvU2hhcmVkTWVtb3J5UGFyY2VsYWJsZS5oCmluZGV4IDgyYzIyNDAuLjRlYzM4YzUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9TaGFyZWRNZW1vcnlQYXJjZWxhYmxlLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL1NoYXJlZE1lbW9yeVBhcmNlbGFibGUuaApAQCAtNzAsOCArNzAsOCBAQAogICAgIGFhdWRpb19yZXN1bHRfdCByZXNvbHZlU2hhcmVkTWVtb3J5KGNvbnN0IGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCYgZmQpOwogCiAgICAgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkICAgbUZkOwotICAgIGludDMyX3QgICAgIG1TaXplSW5CeXRlcyA9IDA7Ci0gICAgdWludDhfdCAgICAqbVJlc29sdmVkQWRkcmVzcyA9IE1NQVBfVU5SRVNPTFZFRF9BRERSRVNTOworICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgIG1TaXplSW5CeXRlcyA9IDA7CisgICAgdWludDhfdCAgICAgICAgICAgICAgICAgICAqbVJlc29sdmVkQWRkcmVzcyA9IE1NQVBfVU5SRVNPTFZFRF9BRERSRVNTOwogCiBwcml2YXRlOgogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BQXVkaW9GbG93R3JhcGguY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQUF1ZGlvRmxvd0dyYXBoLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTQzYzZiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQUF1ZGlvRmxvd0dyYXBoLmNwcApAQCAtMCwwICsxLDExNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQUF1ZGlvRmxvd0dyYXBoIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiQUF1ZGlvRmxvd0dyYXBoLmgiCisKKyNpbmNsdWRlIDxmbG93Z3JhcGgvQ2xpcFRvUmFuZ2UuaD4KKyNpbmNsdWRlIDxmbG93Z3JhcGgvTW9ub1RvTXVsdGlDb252ZXJ0ZXIuaD4KKyNpbmNsdWRlIDxmbG93Z3JhcGgvUmFtcExpbmVhci5oPgorI2luY2x1ZGUgPGZsb3dncmFwaC9TaW5rRmxvYXQuaD4KKyNpbmNsdWRlIDxmbG93Z3JhcGgvU2lua0kxNi5oPgorI2luY2x1ZGUgPGZsb3dncmFwaC9TaW5rSTI0Lmg+CisjaW5jbHVkZSA8Zmxvd2dyYXBoL1NvdXJjZUZsb2F0Lmg+CisjaW5jbHVkZSA8Zmxvd2dyYXBoL1NvdXJjZUkxNi5oPgorI2luY2x1ZGUgPGZsb3dncmFwaC9Tb3VyY2VJMjQuaD4KKwordXNpbmcgbmFtZXNwYWNlIGZsb3dncmFwaDsKKworYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb0Zsb3dHcmFwaDo6Y29uZmlndXJlKGF1ZGlvX2Zvcm1hdF90IHNvdXJjZUZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzb3VyY2VDaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IHNpbmtGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2lua0NoYW5uZWxDb3VudCkgeworICAgIEF1ZGlvRmxvYXRPdXRwdXRQb3J0ICpsYXN0T3V0cHV0ID0gbnVsbHB0cjsKKworICAgIEFMT0dEKCIlcygpIHNvdXJjZSBmb3JtYXQgPSAweCUwOHgsIGNoYW5uZWxzID0gJWQsIHNpbmsgZm9ybWF0ID0gMHglMDh4LCBjaGFubmVscyA9ICVkIiwKKyAgICAgICAgICBfX2Z1bmNfXywgc291cmNlRm9ybWF0LCBzb3VyY2VDaGFubmVsQ291bnQsIHNpbmtGb3JtYXQsIHNpbmtDaGFubmVsQ291bnQpOworCisgICAgc3dpdGNoIChzb3VyY2VGb3JtYXQpIHsKKyAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOgorICAgICAgICAgICAgbVNvdXJjZSA9IHN0ZDo6bWFrZV91bmlxdWU8U291cmNlRmxvYXQ+KHNvdXJjZUNoYW5uZWxDb3VudCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDoKKyAgICAgICAgICAgIG1Tb3VyY2UgPSBzdGQ6Om1ha2VfdW5pcXVlPFNvdXJjZUkxNj4oc291cmNlQ2hhbm5lbENvdW50KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fMjRfQklUX1BBQ0tFRDoKKyAgICAgICAgICAgIG1Tb3VyY2UgPSBzdGQ6Om1ha2VfdW5pcXVlPFNvdXJjZUkyND4oc291cmNlQ2hhbm5lbENvdW50KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OiAvLyBUT0RPIGFkZCBJMzIKKyAgICAgICAgICAgIEFMT0dFKCIlcygpIFVuc3VwcG9ydGVkIHNvdXJjZSBmb3JtYXQgPSAlZCIsIF9fZnVuY19fLCBzb3VyY2VGb3JtYXQpOworICAgICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9VTklNUExFTUVOVEVEOworICAgIH0KKyAgICBsYXN0T3V0cHV0ID0gJm1Tb3VyY2UtPm91dHB1dDsKKworICAgIC8vIEFwcGx5IHZvbHVtZSBhcyBhIHJhbXAgdG8gYXZvaWQgcG9wcy4KKyAgICBtVm9sdW1lUmFtcCA9IHN0ZDo6bWFrZV91bmlxdWU8UmFtcExpbmVhcj4oc291cmNlQ2hhbm5lbENvdW50KTsKKyAgICBsYXN0T3V0cHV0LT5jb25uZWN0KCZtVm9sdW1lUmFtcC0+aW5wdXQpOworICAgIGxhc3RPdXRwdXQgPSAmbVZvbHVtZVJhbXAtPm91dHB1dDsKKworICAgIC8vIEZvciBhIHB1cmUgZmxvYXQgZ3JhcGgsIHRoZXJlIGlzIGNoYW5jZSB0aGF0IHRoZSBkYXRhIHJhbmdlIG1heSBiZSB2ZXJ5IGxhcmdlLgorICAgIC8vIFNvIHdlIHNob3VsZCBjbGlwIHRvIGEgcmVhc29uYWJsZSB2YWx1ZSB0aGF0IGFsbG93cyBhIGxpdHRsZSBoZWFkcm9vbS4KKyAgICBpZiAoc291cmNlRm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQgJiYgc2lua0Zvcm1hdCA9PSBBVURJT19GT1JNQVRfUENNX0ZMT0FUKSB7CisgICAgICAgIG1DbGlwcGVyID0gc3RkOjptYWtlX3VuaXF1ZTxDbGlwVG9SYW5nZT4oc291cmNlQ2hhbm5lbENvdW50KTsKKyAgICAgICAgbGFzdE91dHB1dC0+Y29ubmVjdCgmbUNsaXBwZXItPmlucHV0KTsKKyAgICAgICAgbGFzdE91dHB1dCA9ICZtQ2xpcHBlci0+b3V0cHV0OworICAgIH0KKworICAgIC8vIEV4cGFuZCB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzIGlmIHJlcXVpcmVkLgorICAgIGlmIChzb3VyY2VDaGFubmVsQ291bnQgPT0gMSAmJiBzaW5rQ2hhbm5lbENvdW50ID4gMSkgeworICAgICAgICBtQ2hhbm5lbENvbnZlcnRlciA9IHN0ZDo6bWFrZV91bmlxdWU8TW9ub1RvTXVsdGlDb252ZXJ0ZXI+KHNpbmtDaGFubmVsQ291bnQpOworICAgICAgICBsYXN0T3V0cHV0LT5jb25uZWN0KCZtQ2hhbm5lbENvbnZlcnRlci0+aW5wdXQpOworICAgICAgICBsYXN0T3V0cHV0ID0gJm1DaGFubmVsQ29udmVydGVyLT5vdXRwdXQ7CisgICAgfSBlbHNlIGlmIChzb3VyY2VDaGFubmVsQ291bnQgIT0gc2lua0NoYW5uZWxDb3VudCkgeworICAgICAgICBBTE9HRSgiJXMoKSBDaGFubmVsIHJlZHVjdGlvbiBub3Qgc3VwcG9ydGVkLiIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9VTklNUExFTUVOVEVEOworICAgIH0KKworICAgIHN3aXRjaCAoc2lua0Zvcm1hdCkgeworICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ6CisgICAgICAgICAgICBtU2luayA9IHN0ZDo6bWFrZV91bmlxdWU8U2lua0Zsb2F0PihzaW5rQ2hhbm5lbENvdW50KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOgorICAgICAgICAgICAgbVNpbmsgPSBzdGQ6Om1ha2VfdW5pcXVlPFNpbmtJMTY+KHNpbmtDaGFubmVsQ291bnQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV8yNF9CSVRfUEFDS0VEOgorICAgICAgICAgICAgbVNpbmsgPSBzdGQ6Om1ha2VfdW5pcXVlPFNpbmtJMjQ+KHNpbmtDaGFubmVsQ291bnQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IC8vIFRPRE8gYWRkIEkzMgorICAgICAgICAgICAgQUxPR0UoIiVzKCkgVW5zdXBwb3J0ZWQgc2luayBmb3JtYXQgPSAlZCIsIF9fZnVuY19fLCBzaW5rRm9ybWF0KTsKKyAgICAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfVU5JTVBMRU1FTlRFRDsKKyAgICB9CisgICAgbGFzdE91dHB1dC0+Y29ubmVjdCgmbVNpbmstPmlucHV0KTsKKworICAgIHJldHVybiBBQVVESU9fT0s7Cit9CisKK3ZvaWQgQUF1ZGlvRmxvd0dyYXBoOjpwcm9jZXNzKGNvbnN0IHZvaWQgKnNvdXJjZSwgdm9pZCAqZGVzdGluYXRpb24sIGludDMyX3QgbnVtRnJhbWVzKSB7CisgICAgbVNvdXJjZS0+c2V0RGF0YShzb3VyY2UsIG51bUZyYW1lcyk7CisgICAgbVNpbmstPnJlYWQoZGVzdGluYXRpb24sIG51bUZyYW1lcyk7Cit9CisKKy8qKgorICogQHBhcmFtIHZvbHVtZSBiZXR3ZWVuIDAuMCBhbmQgMS4wCisgKi8KK3ZvaWQgQUF1ZGlvRmxvd0dyYXBoOjpzZXRUYXJnZXRWb2x1bWUoZmxvYXQgdm9sdW1lKSB7CisgICAgbVZvbHVtZVJhbXAtPnNldFRhcmdldCh2b2x1bWUpOworfQorCit2b2lkIEFBdWRpb0Zsb3dHcmFwaDo6c2V0UmFtcExlbmd0aEluRnJhbWVzKGludDMyX3QgbnVtRnJhbWVzKSB7CisgICAgbVZvbHVtZVJhbXAtPnNldExlbmd0aEluRnJhbWVzKG51bUZyYW1lcyk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BQXVkaW9GbG93R3JhcGguaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0FBdWRpb0Zsb3dHcmFwaC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0OWY2NGUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BQXVkaW9GbG93R3JhcGguaApAQCAtMCwwICsxLDY0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0FBVURJT19GTE9XX0dSQVBIX0gKKyNkZWZpbmUgQU5EUk9JRF9BQVVESU9fRkxPV19HUkFQSF9ICisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisKKyNpbmNsdWRlIDxhYXVkaW8vQUF1ZGlvLmg+CisjaW5jbHVkZSA8Zmxvd2dyYXBoL0NsaXBUb1JhbmdlLmg+CisjaW5jbHVkZSA8Zmxvd2dyYXBoL01vbm9Ub011bHRpQ29udmVydGVyLmg+CisjaW5jbHVkZSA8Zmxvd2dyYXBoL1JhbXBMaW5lYXIuaD4KKworY2xhc3MgQUF1ZGlvRmxvd0dyYXBoIHsKK3B1YmxpYzoKKyAgICAvKiogQ29ubmVjdCBzZXZlcmFsIG1vZHVsZXMgdG9nZXRoZXIgdG8gY29udmVydCBmcm9tIHNvdXJjZSB0byBzaW5rLgorICAgICAqIFRoaXMgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIG9uY2UgZm9yIGVhY2ggaW5zdGFuY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc291cmNlRm9ybWF0CisgICAgICogQHBhcmFtIHNvdXJjZUNoYW5uZWxDb3VudAorICAgICAqIEBwYXJhbSBzaW5rRm9ybWF0CisgICAgICogQHBhcmFtIHNpbmtDaGFubmVsQ291bnQKKyAgICAgKiBAcmV0dXJuCisgICAgICovCisgICAgYWF1ZGlvX3Jlc3VsdF90IGNvbmZpZ3VyZShhdWRpb19mb3JtYXRfdCBzb3VyY2VGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNvdXJjZUNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IHNpbmtGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNpbmtDaGFubmVsQ291bnQpOworCisgICAgdm9pZCBwcm9jZXNzKGNvbnN0IHZvaWQgKnNvdXJjZSwgdm9pZCAqZGVzdGluYXRpb24sIGludDMyX3QgbnVtRnJhbWVzKTsKKworICAgIC8qKgorICAgICAqIEBwYXJhbSB2b2x1bWUgYmV0d2VlbiAwLjAgYW5kIDEuMAorICAgICAqLworICAgIHZvaWQgc2V0VGFyZ2V0Vm9sdW1lKGZsb2F0IHZvbHVtZSk7CisKKyAgICB2b2lkIHNldFJhbXBMZW5ndGhJbkZyYW1lcyhpbnQzMl90IG51bUZyYW1lcyk7CisKK3ByaXZhdGU6CisgICAgc3RkOjp1bmlxdWVfcHRyPGZsb3dncmFwaDo6QXVkaW9Tb3VyY2U+ICAgICAgICAgIG1Tb3VyY2U7CisgICAgc3RkOjp1bmlxdWVfcHRyPGZsb3dncmFwaDo6UmFtcExpbmVhcj4gICAgICAgICAgIG1Wb2x1bWVSYW1wOworICAgIHN0ZDo6dW5pcXVlX3B0cjxmbG93Z3JhcGg6OkNsaXBUb1JhbmdlPiAgICAgICAgICBtQ2xpcHBlcjsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Zmxvd2dyYXBoOjpNb25vVG9NdWx0aUNvbnZlcnRlcj4gbUNoYW5uZWxDb252ZXJ0ZXI7CisgICAgc3RkOjp1bmlxdWVfcHRyPGZsb3dncmFwaDo6QXVkaW9TaW5rPiAgICAgICAgICAgIG1TaW5rOworfTsKKworCisjZW5kaWYgLy9BTkRST0lEX0FBVURJT19GTE9XX0dSQVBIX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvRW5kcG9pbnQuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9FbmRwb2ludC5jcHAKaW5kZXggZjhlMzRkMS4uMjE0Zjg4OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9FbmRwb2ludC5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9FbmRwb2ludC5jcHAKQEAgLTE5Niw3ICsxOTYsNyBAQAogCiBpbnQzMl90IEF1ZGlvRW5kcG9pbnQ6OmdldEVtcHR5RnJhbWVzQXZhaWxhYmxlKCkKIHsKLSAgICByZXR1cm4gbURhdGFRdWV1ZS0+Z2V0Rmlmb0NvbnRyb2xsZXJCYXNlKCktPmdldEVtcHR5RnJhbWVzQXZhaWxhYmxlKCk7CisgICAgcmV0dXJuIG1EYXRhUXVldWUtPmdldEVtcHR5RnJhbWVzQXZhaWxhYmxlKCk7CiB9CiAKIGludDMyX3QgQXVkaW9FbmRwb2ludDo6Z2V0RnVsbEZyYW1lc0F2YWlsYWJsZShXcmFwcGluZ0J1ZmZlciAqd3JhcHBpbmdCdWZmZXIpCkBAIC0yMDYsMTUgKzIwNiwxNSBAQAogCiBpbnQzMl90IEF1ZGlvRW5kcG9pbnQ6OmdldEZ1bGxGcmFtZXNBdmFpbGFibGUoKQogewotICAgIHJldHVybiBtRGF0YVF1ZXVlLT5nZXRGaWZvQ29udHJvbGxlckJhc2UoKS0+Z2V0RnVsbEZyYW1lc0F2YWlsYWJsZSgpOworICAgIHJldHVybiBtRGF0YVF1ZXVlLT5nZXRGdWxsRnJhbWVzQXZhaWxhYmxlKCk7CiB9CiAKIHZvaWQgQXVkaW9FbmRwb2ludDo6YWR2YW5jZVdyaXRlSW5kZXgoaW50MzJfdCBkZWx0YUZyYW1lcykgewotICAgIG1EYXRhUXVldWUtPmdldEZpZm9Db250cm9sbGVyQmFzZSgpLT5hZHZhbmNlV3JpdGVJbmRleChkZWx0YUZyYW1lcyk7CisgICAgbURhdGFRdWV1ZS0+YWR2YW5jZVdyaXRlSW5kZXgoZGVsdGFGcmFtZXMpOwogfQogCiB2b2lkIEF1ZGlvRW5kcG9pbnQ6OmFkdmFuY2VSZWFkSW5kZXgoaW50MzJfdCBkZWx0YUZyYW1lcykgewotICAgIG1EYXRhUXVldWUtPmdldEZpZm9Db250cm9sbGVyQmFzZSgpLT5hZHZhbmNlUmVhZEluZGV4KGRlbHRhRnJhbWVzKTsKKyAgICBtRGF0YVF1ZXVlLT5hZHZhbmNlUmVhZEluZGV4KGRlbHRhRnJhbWVzKTsKIH0KIAogdm9pZCBBdWRpb0VuZHBvaW50OjpzZXREYXRhUmVhZENvdW50ZXIoZmlmb19jb3VudGVyX3QgZnJhbWVzUmVhZCkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWwuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbC5jcHAKaW5kZXggOTIwNDgyNC4uMGE4MDIxYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbC5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbC5jcHAKQEAgLTM5LDcgKzM5LDYgQEAKICNpbmNsdWRlICJjb3JlL0F1ZGlvU3RyZWFtQnVpbGRlci5oIgogI2luY2x1ZGUgImZpZm8vRmlmb0J1ZmZlci5oIgogI2luY2x1ZGUgInV0aWxpdHkvQXVkaW9DbG9jay5oIgotI2luY2x1ZGUgInV0aWxpdHkvTGluZWFyUmFtcC5oIgogCiAjaW5jbHVkZSAiQXVkaW9TdHJlYW1JbnRlcm5hbC5oIgogCkBAIC05MiwxMSArOTEsMTEgQEAKICAgICB9CiAKICAgICAvLyBXZSBoYXZlIHRvIGRvIHZvbHVtZSBzY2FsaW5nLiBTbyB3ZSBwcmVmZXIgRkxPQVQgZm9ybWF0LgotICAgIGlmIChnZXRGb3JtYXQoKSA9PSBBQVVESU9fRk9STUFUX1VOU1BFQ0lGSUVEKSB7Ci0gICAgICAgIHNldEZvcm1hdChBQVVESU9fRk9STUFUX1BDTV9GTE9BVCk7CisgICAgaWYgKGdldEZvcm1hdCgpID09IEFVRElPX0ZPUk1BVF9ERUZBVUxUKSB7CisgICAgICAgIHNldEZvcm1hdChBVURJT19GT1JNQVRfUENNX0ZMT0FUKTsKICAgICB9CiAgICAgLy8gUmVxdWVzdCBGTE9BVCBmb3IgdGhlIHNoYXJlZCBtaXhlci4KLSAgICByZXF1ZXN0LmdldENvbmZpZ3VyYXRpb24oKS5zZXRGb3JtYXQoQUFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpOworICAgIHJlcXVlc3QuZ2V0Q29uZmlndXJhdGlvbigpLnNldEZvcm1hdChBVURJT19GT1JNQVRfUENNX0ZMT0FUKTsKIAogICAgIC8vIEJ1aWxkIHRoZSByZXF1ZXN0IHRvIHNlbmQgdG8gdGhlIHNlcnZlci4KICAgICByZXF1ZXN0LnNldFVzZXJJZChnZXR1aWQoKSk7CkBAIC0xMjYsNyArMTI1LDcgQEAKICAgICAgICAgLy8gaWYgdGhhdCBmYWlsZWQgdGhlbiB0cnkgc3dpdGNoaW5nIGZyb20gbW9ubyB0byBzdGVyZW8gaWYgT1VUUFVULgogICAgICAgICAvLyBPbmx5IGRvIHRoaXMgaW4gdGhlIGNsaWVudC4gT3RoZXJ3aXNlIHdlIGVuZCB1cCB3aXRoIGEgbW9ubyBtaXhlciBpbiB0aGUgc2VydmljZQogICAgICAgICAvLyB0aGF0IHdyaXRlcyB0byBhIHN0ZXJlbyBNTUFQIHN0cmVhbS4KLSAgICAgICAgQUxPR0QoIiVzIC0gb3BlblN0cmVhbSgpIHJldHVybmVkICVkLCB0cnkgc3dpdGNoaW5nIGZyb20gTU9OTyB0byBTVEVSRU8iLAorICAgICAgICBBTE9HRCgiJXMoKSAtIG9wZW5TdHJlYW0oKSByZXR1cm5lZCAlZCwgdHJ5IHN3aXRjaGluZyBmcm9tIE1PTk8gdG8gU1RFUkVPIiwKICAgICAgICAgICAgICAgX19mdW5jX18sIG1TZXJ2aWNlU3RyZWFtSGFuZGxlKTsKICAgICAgICAgcmVxdWVzdC5nZXRDb25maWd1cmF0aW9uKCkuc2V0U2FtcGxlc1BlckZyYW1lKDIpOyAvLyBzdGVyZW8KICAgICAgICAgbVNlcnZpY2VTdHJlYW1IYW5kbGUgPSBtU2VydmljZUludGVyZmFjZS5vcGVuU3RyZWFtKHJlcXVlc3QsIGNvbmZpZ3VyYXRpb25PdXRwdXQpOwpAQCAtMjEyLDkgKzIxMSw3IEBACiAgICAgICAgICAgICBtQ2FsbGJhY2tGcmFtZXMgPSBtRnJhbWVzUGVyQnVyc3Q7CiAgICAgICAgIH0KIAotICAgICAgICBpbnQzMl90IGJ5dGVzUGVyRnJhbWUgPSBnZXRTYW1wbGVzUGVyRnJhbWUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEFBdWRpb0NvbnZlcnRfZm9ybWF0VG9TaXplSW5CeXRlcyhnZXRGb3JtYXQoKSk7Ci0gICAgICAgIGludDMyX3QgY2FsbGJhY2tCdWZmZXJTaXplID0gbUNhbGxiYWNrRnJhbWVzICogYnl0ZXNQZXJGcmFtZTsKKyAgICAgICAgY29uc3QgaW50MzJfdCBjYWxsYmFja0J1ZmZlclNpemUgPSBtQ2FsbGJhY2tGcmFtZXMgKiBnZXRCeXRlc1BlckZyYW1lKCk7CiAgICAgICAgIG1DYWxsYmFja0J1ZmZlciA9IG5ldyB1aW50OF90W2NhbGxiYWNrQnVmZmVyU2l6ZV07CiAgICAgfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsLmgKaW5kZXggMDQyNWNkNS4uM2JiOWUxZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbC5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWwuaApAQCAtMjcsNyArMjcsNiBAQAogI2luY2x1ZGUgImNsaWVudC9BdWRpb0VuZHBvaW50LmgiCiAjaW5jbHVkZSAiY29yZS9BdWRpb1N0cmVhbS5oIgogI2luY2x1ZGUgInV0aWxpdHkvQXVkaW9DbG9jay5oIgotI2luY2x1ZGUgInV0aWxpdHkvTGluZWFyUmFtcC5oIgogCiB1c2luZyBhbmRyb2lkOjpzcDsKIHVzaW5nIGFuZHJvaWQ6OklBQXVkaW9TZXJ2aWNlOwpAQCAtMTkzLDYgKzE5Miw4IEBACiAKICAgICBpbnQ2NF90ICAgICAgICAgICAgICAgICAgbVNlcnZpY2VMYXRlbmN5TmFub3MgPSAwOwogCisgICAgLy8gU29tZXRpbWVzIHRoZSBoYXJkd2FyZSBpcyBvcGVyYXRpbmcgd2l0aCBhIGRpZmZlcmVudCBjaGFubmVsIGNvdW50IGZyb20gdGhlIGFwcC4KKyAgICAvLyBUaGVuIHdlIHJlcXVpcmUgY29udmVyc2lvbiBpbiBBQXVkaW8uCiAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgIG1EZXZpY2VDaGFubmVsQ291bnQgPSAwOwogfTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbENhcHR1cmUuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbENhcHR1cmUuY3BwCmluZGV4IDA3MTlmZTEuLjRhMGU2ZGEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxDYXB0dXJlLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsQ2FwdHVyZS5jcHAKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAogI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9wcmltaXRpdmVzLmg+CiAjaW5jbHVkZSA8YWF1ZGlvL0FBdWRpby5oPgogCiAjaW5jbHVkZSAiY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxDYXB0dXJlLmgiCkBAIC0xNjUsMzUgKzE2NiwzNiBAQAogICAgIC8vIFJlYWQgZGF0YSBpbiBvbmUgb3IgdHdvIHBhcnRzLgogICAgIGZvciAoaW50IHBhcnRJbmRleCA9IDA7IGZyYW1lc0xlZnQgPiAwICYmIHBhcnRJbmRleCA8IFdyYXBwaW5nQnVmZmVyOjpTSVpFOyBwYXJ0SW5kZXgrKykgewogICAgICAgICBpbnQzMl90IGZyYW1lc1RvUHJvY2VzcyA9IGZyYW1lc0xlZnQ7Ci0gICAgICAgIGludDMyX3QgZnJhbWVzQXZhaWxhYmxlID0gd3JhcHBpbmdCdWZmZXIubnVtRnJhbWVzW3BhcnRJbmRleF07CisgICAgICAgIGNvbnN0IGludDMyX3QgZnJhbWVzQXZhaWxhYmxlID0gd3JhcHBpbmdCdWZmZXIubnVtRnJhbWVzW3BhcnRJbmRleF07CiAgICAgICAgIGlmIChmcmFtZXNBdmFpbGFibGUgPD0gMCkgYnJlYWs7CiAKICAgICAgICAgaWYgKGZyYW1lc1RvUHJvY2VzcyA+IGZyYW1lc0F2YWlsYWJsZSkgewogICAgICAgICAgICAgZnJhbWVzVG9Qcm9jZXNzID0gZnJhbWVzQXZhaWxhYmxlOwogICAgICAgICB9CiAKLSAgICAgICAgaW50MzJfdCBudW1CeXRlcyA9IGdldEJ5dGVzUGVyRnJhbWUoKSAqIGZyYW1lc1RvUHJvY2VzczsKLSAgICAgICAgaW50MzJfdCBudW1TYW1wbGVzID0gZnJhbWVzVG9Qcm9jZXNzICogZ2V0U2FtcGxlc1BlckZyYW1lKCk7CisgICAgICAgIGNvbnN0IGludDMyX3QgbnVtQnl0ZXMgPSBnZXRCeXRlc1BlckZyYW1lKCkgKiBmcmFtZXNUb1Byb2Nlc3M7CisgICAgICAgIGNvbnN0IGludDMyX3QgbnVtU2FtcGxlcyA9IGZyYW1lc1RvUHJvY2VzcyAqIGdldFNhbXBsZXNQZXJGcmFtZSgpOwogCisgICAgICAgIGNvbnN0IGF1ZGlvX2Zvcm1hdF90IHNvdXJjZUZvcm1hdCA9IGdldERldmljZUZvcm1hdCgpOworICAgICAgICBjb25zdCBhdWRpb19mb3JtYXRfdCBkZXN0aW5hdGlvbkZvcm1hdCA9IGdldEZvcm1hdCgpOwogICAgICAgICAvLyBUT0RPIGZhY3RvciB0aGlzIG91dCBpbnRvIGEgdXRpbGl0eSBmdW5jdGlvbgotICAgICAgICBpZiAoZ2V0RGV2aWNlRm9ybWF0KCkgPT0gZ2V0Rm9ybWF0KCkpIHsKKyAgICAgICAgaWYgKHNvdXJjZUZvcm1hdCA9PSBkZXN0aW5hdGlvbkZvcm1hdCkgewogICAgICAgICAgICAgbWVtY3B5KGRlc3RpbmF0aW9uLCB3cmFwcGluZ0J1ZmZlci5kYXRhW3BhcnRJbmRleF0sIG51bUJ5dGVzKTsKLSAgICAgICAgfSBlbHNlIGlmIChnZXREZXZpY2VGb3JtYXQoKSA9PSBBQVVESU9fRk9STUFUX1BDTV9JMTYKLSAgICAgICAgICAgICAgICAgICAmJiBnZXRGb3JtYXQoKSA9PSBBQVVESU9fRk9STUFUX1BDTV9GTE9BVCkgewotICAgICAgICAgICAgQUF1ZGlvQ29udmVydF9wY20xNlRvRmxvYXQoCi0gICAgICAgICAgICAgICAgICAgIChjb25zdCBpbnQxNl90ICopIHdyYXBwaW5nQnVmZmVyLmRhdGFbcGFydEluZGV4XSwKKyAgICAgICAgfSBlbHNlIGlmIChzb3VyY2VGb3JtYXQgPT0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQKKyAgICAgICAgICAgICAgICAgICAmJiBkZXN0aW5hdGlvbkZvcm1hdCA9PSBBVURJT19GT1JNQVRfUENNX0ZMT0FUKSB7CisgICAgICAgICAgICBtZW1jcHlfdG9fZmxvYXRfZnJvbV9pMTYoCiAgICAgICAgICAgICAgICAgICAgIChmbG9hdCAqKSBkZXN0aW5hdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgbnVtU2FtcGxlcywKLSAgICAgICAgICAgICAgICAgICAgMS4wZik7Ci0gICAgICAgIH0gZWxzZSBpZiAoZ2V0RGV2aWNlRm9ybWF0KCkgPT0gQUFVRElPX0ZPUk1BVF9QQ01fRkxPQVQKLSAgICAgICAgICAgICAgICAgICAmJiBnZXRGb3JtYXQoKSA9PSBBQVVESU9fRk9STUFUX1BDTV9JMTYpIHsKLSAgICAgICAgICAgIEFBdWRpb0NvbnZlcnRfZmxvYXRUb1BjbTE2KAotICAgICAgICAgICAgICAgICAgICAoY29uc3QgZmxvYXQgKikgd3JhcHBpbmdCdWZmZXIuZGF0YVtwYXJ0SW5kZXhdLAorICAgICAgICAgICAgICAgICAgICAoY29uc3QgaW50MTZfdCAqKSB3cmFwcGluZ0J1ZmZlci5kYXRhW3BhcnRJbmRleF0sCisgICAgICAgICAgICAgICAgICAgIG51bVNhbXBsZXMpOworICAgICAgICB9IGVsc2UgaWYgKHNvdXJjZUZvcm1hdCA9PSBBVURJT19GT1JNQVRfUENNX0ZMT0FUCisgICAgICAgICAgICAgICAgICAgJiYgZGVzdGluYXRpb25Gb3JtYXQgPT0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQpIHsKKyAgICAgICAgICAgIG1lbWNweV90b19pMTZfZnJvbV9mbG9hdCgKICAgICAgICAgICAgICAgICAgICAgKGludDE2X3QgKikgZGVzdGluYXRpb24sCi0gICAgICAgICAgICAgICAgICAgIG51bVNhbXBsZXMsCi0gICAgICAgICAgICAgICAgICAgIDEuMGYpOworICAgICAgICAgICAgICAgICAgICAoY29uc3QgZmxvYXQgKikgd3JhcHBpbmdCdWZmZXIuZGF0YVtwYXJ0SW5kZXhdLAorICAgICAgICAgICAgICAgICAgICBudW1TYW1wbGVzKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dFKCJGb3JtYXQgY29udmVyc2lvbiBub3Qgc3VwcG9ydGVkISIpOworICAgICAgICAgICAgQUxPR0UoIiVzKCkgLSBGb3JtYXQgY29udmVyc2lvbiBub3Qgc3VwcG9ydGVkISBhdWRpb19mb3JtYXRfdCBzb3VyY2UgPSAldSwgZGVzdCA9ICV1IiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgc291cmNlRm9ybWF0LCBkZXN0aW5hdGlvbkZvcm1hdCk7CiAgICAgICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfRk9STUFUOwogICAgICAgICB9CiAgICAgICAgIGRlc3RpbmF0aW9uICs9IG51bUJ5dGVzOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXkuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXkuY3BwCmluZGV4IDc5NWJhMmMuLjJhZTM3YTUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5LmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsUGxheS5jcHAKQEAgLTQzLDkgKzQzLDE3IEBACiBhYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXk6Om9wZW4oY29uc3QgQXVkaW9TdHJlYW1CdWlsZGVyICZidWlsZGVyKSB7CiAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEF1ZGlvU3RyZWFtSW50ZXJuYWw6Om9wZW4oYnVpbGRlcik7CiAgICAgaWYgKHJlc3VsdCA9PSBBQVVESU9fT0spIHsKKyAgICAgICAgcmVzdWx0ID0gbUZsb3dHcmFwaC5jb25maWd1cmUoZ2V0Rm9ybWF0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFNhbXBsZXNQZXJGcmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXREZXZpY2VGb3JtYXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RGV2aWNlQ2hhbm5lbENvdW50KCkpOworCisgICAgICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CisgICAgICAgICAgICBjbG9zZSgpOworICAgICAgICB9CiAgICAgICAgIC8vIFNhbXBsZSByYXRlIGlzIGNvbnN0cmFpbmVkIHRvIGNvbW1vbiB2YWx1ZXMgYnkgbm93IGFuZCBzaG91bGQgbm90IG92ZXJmbG93LgogICAgICAgICBpbnQzMl90IG51bUZyYW1lcyA9IGtSYW1wTVNlYyAqIGdldFNhbXBsZVJhdGUoKSAvIEFBVURJT19NSUxMSVNfUEVSX1NFQ09ORDsKLSAgICAgICAgbVZvbHVtZVJhbXAuc2V0TGVuZ3RoSW5GcmFtZXMobnVtRnJhbWVzKTsKKyAgICAgICAgbUZsb3dHcmFwaC5zZXRSYW1wTGVuZ3RoSW5GcmFtZXMobnVtRnJhbWVzKTsKICAgICB9CiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KQEAgLTIxNiwyMiArMjI0LDEwIEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGludDMyX3QgbnVtQnl0ZXMgPSBnZXRCeXRlc1BlckZyYW1lKCkgKiBmcmFtZXNUb1dyaXRlOwotICAgICAgICAgICAgLy8gRGF0YSBjb252ZXJzaW9uLgotICAgICAgICAgICAgZmxvYXQgbGV2ZWxGcm9tOwotICAgICAgICAgICAgZmxvYXQgbGV2ZWxUbzsKLSAgICAgICAgICAgIG1Wb2x1bWVSYW1wLm5leHRTZWdtZW50KGZyYW1lc1RvV3JpdGUsICZsZXZlbEZyb20sICZsZXZlbFRvKTsKIAotICAgICAgICAgICAgQUF1ZGlvRGF0YUNvbnZlcnRlcjo6Rm9ybWF0dGVkRGF0YSBzb3VyY2UoCi0gICAgICAgICAgICAgICAgICAgICh2b2lkICopYnl0ZUJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgZ2V0Rm9ybWF0KCksCi0gICAgICAgICAgICAgICAgICAgIGdldFNhbXBsZXNQZXJGcmFtZSgpKTsKLSAgICAgICAgICAgIEFBdWRpb0RhdGFDb252ZXJ0ZXI6OkZvcm1hdHRlZERhdGEgZGVzdGluYXRpb24oCi0gICAgICAgICAgICAgICAgICAgIHdyYXBwaW5nQnVmZmVyLmRhdGFbcGFydEluZGV4XSwKLSAgICAgICAgICAgICAgICAgICAgZ2V0RGV2aWNlRm9ybWF0KCksCi0gICAgICAgICAgICAgICAgICAgIGdldERldmljZUNoYW5uZWxDb3VudCgpKTsKLQotICAgICAgICAgICAgQUF1ZGlvRGF0YUNvbnZlcnRlcjo6Y29udmVydChzb3VyY2UsIGRlc3RpbmF0aW9uLCBmcmFtZXNUb1dyaXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbEZyb20sIGxldmVsVG8pOworICAgICAgICAgICAgbUZsb3dHcmFwaC5wcm9jZXNzKCh2b2lkICopYnl0ZUJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGluZ0J1ZmZlci5kYXRhW3BhcnRJbmRleF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzVG9Xcml0ZSk7CiAKICAgICAgICAgICAgIGJ5dGVCdWZmZXIgKz0gbnVtQnl0ZXM7CiAgICAgICAgICAgICBmcmFtZXNMZWZ0IC09IGZyYW1lc1RvV3JpdGU7CkBAIC0zMTMsNiArMzA5LDYgQEAKICAgICBmbG9hdCBjb21iaW5lZFZvbHVtZSA9IG1TdHJlYW1Wb2x1bWUgKiBnZXREdWNrQW5kTXV0ZVZvbHVtZSgpOwogICAgIEFMT0dEKCIlcygpIG1TdHJlYW1Wb2x1bWUgKiBkdWNrQW5kTXV0ZVZvbHVtZSA9ICVmICogJWYgPSAlZiIsCiAgICAgICAgICAgX19mdW5jX18sIG1TdHJlYW1Wb2x1bWUsIGdldER1Y2tBbmRNdXRlVm9sdW1lKCksIGNvbWJpbmVkVm9sdW1lKTsKLSAgICBtVm9sdW1lUmFtcC5zZXRUYXJnZXQoY29tYmluZWRWb2x1bWUpOworICAgIG1GbG93R3JhcGguc2V0VGFyZ2V0Vm9sdW1lKGNvbWJpbmVkVm9sdW1lKTsKICAgICByZXR1cm4gYW5kcm9pZDo6Tk9fRVJST1I7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsUGxheS5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXkuaAppbmRleCA5NzdhOTA5Li5jYWIyOTQyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsUGxheS5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5LmgKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDxhYXVkaW8vQUF1ZGlvLmg+CiAKICNpbmNsdWRlICJiaW5kaW5nL0FBdWRpb1NlcnZpY2VJbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJjbGllbnQvQUF1ZGlvRmxvd0dyYXBoLmgiCiAjaW5jbHVkZSAiY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWwuaCIKIAogdXNpbmcgYW5kcm9pZDo6c3A7CkBAIC05Myw3ICs5NCw3IEBACiAKICAgICBpbnQ2NF90ICAgICAgICAgICAgICAgICAgbUxhc3RGcmFtZXNSZWFkID0gMDsgLy8gdXNlZCB0byBwcmV2ZW50IHJldHJvZ3JhZGUgbW90aW9uCiAKLSAgICBMaW5lYXJSYW1wICAgICAgICAgICAgICAgbVZvbHVtZVJhbXA7CisgICAgQUF1ZGlvRmxvd0dyYXBoICAgICAgICAgIG1GbG93R3JhcGg7CiAKIH07CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BQXVkaW9BdWRpby5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQUF1ZGlvQXVkaW8uY3BwCmluZGV4IGRmMGRiNzkuLmUyNzJmMmEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BQXVkaW9BdWRpby5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0FBdWRpb0F1ZGlvLmNwcApAQCAtMTQ2LDE0ICsxNDYsMTQgQEAKIEFBVURJT19BUEkgdm9pZCBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldENoYW5uZWxDb3VudChBQXVkaW9TdHJlYW1CdWlsZGVyKiBidWlsZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY2hhbm5lbENvdW50KQogewotICAgIEF1ZGlvU3RyZWFtQnVpbGRlciAqc3RyZWFtQnVpbGRlciA9IGNvbnZlcnRBQXVkaW9CdWlsZGVyVG9TdHJlYW1CdWlsZGVyKGJ1aWxkZXIpOwotICAgIHN0cmVhbUJ1aWxkZXItPnNldFNhbXBsZXNQZXJGcmFtZShjaGFubmVsQ291bnQpOworICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0U2FtcGxlc1BlckZyYW1lKGJ1aWxkZXIsIGNoYW5uZWxDb3VudCk7CiB9CiAKIEFBVURJT19BUEkgdm9pZCBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldFNhbXBsZXNQZXJGcmFtZShBQXVkaW9TdHJlYW1CdWlsZGVyKiBidWlsZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY2hhbm5lbENvdW50KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lKQogewotICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0Q2hhbm5lbENvdW50KGJ1aWxkZXIsIGNoYW5uZWxDb3VudCk7CisgICAgQXVkaW9TdHJlYW1CdWlsZGVyICpzdHJlYW1CdWlsZGVyID0gY29udmVydEFBdWRpb0J1aWxkZXJUb1N0cmVhbUJ1aWxkZXIoYnVpbGRlcik7CisgICAgc3RyZWFtQnVpbGRlci0+c2V0U2FtcGxlc1BlckZyYW1lKHNhbXBsZXNQZXJGcmFtZSk7CiB9CiAKIEFBVURJT19BUEkgdm9pZCBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldERpcmVjdGlvbihBQXVkaW9TdHJlYW1CdWlsZGVyKiBidWlsZGVyLApAQCAtMTY3LDcgKzE2Nyw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYXVkaW9fZm9ybWF0X3QgZm9ybWF0KQogewogICAgIEF1ZGlvU3RyZWFtQnVpbGRlciAqc3RyZWFtQnVpbGRlciA9IGNvbnZlcnRBQXVkaW9CdWlsZGVyVG9TdHJlYW1CdWlsZGVyKGJ1aWxkZXIpOwotICAgIHN0cmVhbUJ1aWxkZXItPnNldEZvcm1hdChmb3JtYXQpOworICAgIC8vIFVzZSBhdWRpb19mb3JtYXRfdCBldmVyeXdoZXJlIGludGVybmFsbHkuCisgICAgY29uc3QgYXVkaW9fZm9ybWF0X3QgaW50ZXJuYWxGb3JtYXQgPSBBQXVkaW9Db252ZXJ0X2FhdWRpb1RvQW5kcm9pZERhdGFGb3JtYXQoZm9ybWF0KTsKKyAgICBzdHJlYW1CdWlsZGVyLT5zZXRGb3JtYXQoaW50ZXJuYWxGb3JtYXQpOwogfQogCiBBQVVESU9fQVBJIHZvaWQgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRTaGFyaW5nTW9kZShBQXVkaW9TdHJlYW1CdWlsZGVyKiBidWlsZGVyLApAQCAtNDA4LDcgKzQxMCw5IEBACiBBQVVESU9fQVBJIGFhdWRpb19mb3JtYXRfdCBBQXVkaW9TdHJlYW1fZ2V0Rm9ybWF0KEFBdWRpb1N0cmVhbSogc3RyZWFtKQogewogICAgIEF1ZGlvU3RyZWFtICphdWRpb1N0cmVhbSA9IGNvbnZlcnRBQXVkaW9TdHJlYW1Ub0F1ZGlvU3RyZWFtKHN0cmVhbSk7Ci0gICAgcmV0dXJuIGF1ZGlvU3RyZWFtLT5nZXRGb3JtYXQoKTsKKyAgICAvLyBVc2UgYXVkaW9fZm9ybWF0X3QgaW50ZXJuYWxseS4KKyAgICBhdWRpb19mb3JtYXRfdCBpbnRlcm5hbEZvcm1hdCA9IGF1ZGlvU3RyZWFtLT5nZXRGb3JtYXQoKTsKKyAgICByZXR1cm4gQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9EYXRhRm9ybWF0KGludGVybmFsRm9ybWF0KTsKIH0KIAogQUFVRElPX0FQSSBhYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU3RyZWFtX3NldEJ1ZmZlclNpemVJbkZyYW1lcyhBQXVkaW9TdHJlYW0qIHN0cmVhbSwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BQXVkaW9TdHJlYW1QYXJhbWV0ZXJzLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BQXVkaW9TdHJlYW1QYXJhbWV0ZXJzLmNwcAppbmRleCBkNTY3MDFiLi5iZDQyNjk3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQUF1ZGlvU3RyZWFtUGFyYW1ldGVycy5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0FBdWRpb1N0cmVhbVBhcmFtZXRlcnMuY3BwCkBAIC00OCw2ICs0OCwyMCBAQAogICAgIG1JbnB1dFByZXNldCAgICAgPSBvdGhlci5tSW5wdXRQcmVzZXQ7CiB9CiAKK3N0YXRpYyBhYXVkaW9fcmVzdWx0X3QgaXNGb3JtYXRWYWxpZChhdWRpb19mb3JtYXRfdCBmb3JtYXQpIHsKKyAgICBzd2l0Y2ggKGZvcm1hdCkgeworICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9ERUZBVUxUOgorICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOgorICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ6CisgICAgICAgICAgICBicmVhazsgLy8gdmFsaWQKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dFKCJhdWRpb0Zvcm1hdCBub3QgdmFsaWQsIGF1ZGlvX2Zvcm1hdF90ID0gMHglMDh4IiwgZm9ybWF0KTsKKyAgICAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9GT1JNQVQ7CisgICAgICAgICAgICAvLyBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIEFBVURJT19PSzsKK30KKwogYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1N0cmVhbVBhcmFtZXRlcnM6OnZhbGlkYXRlKCkgY29uc3QgewogICAgIGlmIChtU2FtcGxlc1BlckZyYW1lICE9IEFBVURJT19VTlNQRUNJRklFRAogICAgICAgICAmJiAobVNhbXBsZXNQZXJGcmFtZSA8IFNBTVBMRVNfUEVSX0ZSQU1FX01JTiB8fCBtU2FtcGxlc1BlckZyYW1lID4gU0FNUExFU19QRVJfRlJBTUVfTUFYKSkgewpAQCAtNzksMTYgKzkzLDggQEAKICAgICAgICAgICAgIC8vIGJyZWFrOwogICAgIH0KIAotICAgIHN3aXRjaCAobUF1ZGlvRm9ybWF0KSB7Ci0gICAgICAgIGNhc2UgQUFVRElPX0ZPUk1BVF9VTlNQRUNJRklFRDoKLSAgICAgICAgY2FzZSBBQVVESU9fRk9STUFUX1BDTV9JMTY6Ci0gICAgICAgIGNhc2UgQUFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ6Ci0gICAgICAgICAgICBicmVhazsgLy8gdmFsaWQKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIEFMT0dFKCJhdWRpb0Zvcm1hdCBub3QgdmFsaWQgPSAlZCIsIG1BdWRpb0Zvcm1hdCk7Ci0gICAgICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfRk9STUFUOwotICAgICAgICAgICAgLy8gYnJlYWs7Ci0gICAgfQorICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBpc0Zvcm1hdFZhbGlkIChtQXVkaW9Gb3JtYXQpOworICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSByZXR1cm4gcmVzdWx0OwogCiAgICAgaWYgKG1TYW1wbGVSYXRlICE9IEFBVURJT19VTlNQRUNJRklFRAogICAgICAgICAmJiAobVNhbXBsZVJhdGUgPCBTQU1QTEVfUkFURV9IWl9NSU4gfHwgbVNhbXBsZVJhdGUgPiBTQU1QTEVfUkFURV9IWl9NQVgpKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQUF1ZGlvU3RyZWFtUGFyYW1ldGVycy5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0FBdWRpb1N0cmVhbVBhcmFtZXRlcnMuaAppbmRleCBjZTVkYWNkLi42YmViNGIyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQUF1ZGlvU3RyZWFtUGFyYW1ldGVycy5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BQXVkaW9TdHJlYW1QYXJhbWV0ZXJzLmgKQEAgLTU2LDExICs1NiwxMSBAQAogICAgICAgICBtU2FtcGxlc1BlckZyYW1lID0gc2FtcGxlc1BlckZyYW1lOwogICAgIH0KIAotICAgIGFhdWRpb19mb3JtYXRfdCBnZXRGb3JtYXQoKSBjb25zdCB7CisgICAgYXVkaW9fZm9ybWF0X3QgZ2V0Rm9ybWF0KCkgY29uc3QgewogICAgICAgICByZXR1cm4gbUF1ZGlvRm9ybWF0OwogICAgIH0KIAotICAgIHZvaWQgc2V0Rm9ybWF0KGFhdWRpb19mb3JtYXRfdCBhdWRpb0Zvcm1hdCkgeworICAgIHZvaWQgc2V0Rm9ybWF0KGF1ZGlvX2Zvcm1hdF90IGF1ZGlvRm9ybWF0KSB7CiAgICAgICAgIG1BdWRpb0Zvcm1hdCA9IGF1ZGlvRm9ybWF0OwogICAgIH0KIApAQCAtMTIwLDggKzEyMCwxMSBAQAogICAgICAgICBtU2Vzc2lvbklkID0gc2Vzc2lvbklkOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIEByZXR1cm4gYnl0ZXMgcGVyIGZyYW1lIG9mIGdldEZvcm1hdCgpCisgICAgICovCiAgICAgaW50MzJfdCBjYWxjdWxhdGVCeXRlc1BlckZyYW1lKCkgY29uc3QgewotICAgICAgICByZXR1cm4gZ2V0U2FtcGxlc1BlckZyYW1lKCkgKiBBQXVkaW9Db252ZXJ0X2Zvcm1hdFRvU2l6ZUluQnl0ZXMoZ2V0Rm9ybWF0KCkpOworICAgICAgICByZXR1cm4gZ2V0U2FtcGxlc1BlckZyYW1lKCkgKiBhdWRpb19ieXRlc19wZXJfc2FtcGxlKGdldEZvcm1hdCgpKTsKICAgICB9CiAKICAgICAvKioKQEAgLTEzOSw3ICsxNDIsNyBAQAogICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgIG1TYW1wbGVSYXRlICAgICAgPSBBQVVESU9fVU5TUEVDSUZJRUQ7CiAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgbURldmljZUlkICAgICAgICA9IEFBVURJT19VTlNQRUNJRklFRDsKICAgICBhYXVkaW9fc2hhcmluZ19tb2RlX3QgICAgICBtU2hhcmluZ01vZGUgICAgID0gQUFVRElPX1NIQVJJTkdfTU9ERV9TSEFSRUQ7Ci0gICAgYWF1ZGlvX2Zvcm1hdF90ICAgICAgICAgICAgbUF1ZGlvRm9ybWF0ICAgICA9IEFBVURJT19GT1JNQVRfVU5TUEVDSUZJRUQ7CisgICAgYXVkaW9fZm9ybWF0X3QgICAgICAgICAgICAgbUF1ZGlvRm9ybWF0ICAgICA9IEFVRElPX0ZPUk1BVF9ERUZBVUxUOwogICAgIGFhdWRpb19kaXJlY3Rpb25fdCAgICAgICAgIG1EaXJlY3Rpb24gICAgICAgPSBBQVVESU9fRElSRUNUSU9OX09VVFBVVDsKICAgICBhYXVkaW9fdXNhZ2VfdCAgICAgICAgICAgICBtVXNhZ2UgICAgICAgICAgID0gQUFVRElPX1VOU1BFQ0lGSUVEOwogICAgIGFhdWRpb19jb250ZW50X3R5cGVfdCAgICAgIG1Db250ZW50VHlwZSAgICAgPSBBQVVESU9fVU5TUEVDSUZJRUQ7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQXVkaW9TdHJlYW0uaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BdWRpb1N0cmVhbS5oCmluZGV4IDMxYjg5NWMuLjYwMjAwYjIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BdWRpb1N0cmVhbS5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BdWRpb1N0cmVhbS5oCkBAIC0xOTIsNyArMTkyLDcgQEAKICAgICAgICAgcmV0dXJuIG1TYW1wbGVSYXRlOwogICAgIH0KIAotICAgIGFhdWRpb19mb3JtYXRfdCBnZXRGb3JtYXQoKSAgY29uc3QgeworICAgIGF1ZGlvX2Zvcm1hdF90IGdldEZvcm1hdCgpICBjb25zdCB7CiAgICAgICAgIHJldHVybiBtRm9ybWF0OwogICAgIH0KIApAQCAtMjQ5LDIxICsyNDksMTQgQEAKICAgICAgKiBUaGlzIGlzIG9ubHkgdmFsaWQgYWZ0ZXIgc2V0Rm9ybWF0KCkgaGFzIGJlZW4gY2FsbGVkLgogICAgICAqLwogICAgIGludDMyX3QgZ2V0Qnl0ZXNQZXJTYW1wbGUoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBBQXVkaW9Db252ZXJ0X2Zvcm1hdFRvU2l6ZUluQnl0ZXMobUZvcm1hdCk7CisgICAgICAgIHJldHVybiBhdWRpb19ieXRlc19wZXJfc2FtcGxlKG1Gb3JtYXQpOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIFRoaXMgaXMgb25seSB2YWxpZCBhZnRlciBzZXRTYW1wbGVzUGVyRnJhbWUoKSBhbmQgc2V0RGV2aWNlRm9ybWF0KCkgaGF2ZSBiZWVuIGNhbGxlZC4KICAgICAgKi8KICAgICBpbnQzMl90IGdldEJ5dGVzUGVyRGV2aWNlRnJhbWUoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBtU2FtcGxlc1BlckZyYW1lICogZ2V0Qnl0ZXNQZXJEZXZpY2VTYW1wbGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIGlzIG9ubHkgdmFsaWQgYWZ0ZXIgc2V0RGV2aWNlRm9ybWF0KCkgaGFzIGJlZW4gY2FsbGVkLgotICAgICAqLwotICAgIGludDMyX3QgZ2V0Qnl0ZXNQZXJEZXZpY2VTYW1wbGUoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBBQXVkaW9Db252ZXJ0X2Zvcm1hdFRvU2l6ZUluQnl0ZXMoZ2V0RGV2aWNlRm9ybWF0KCkpOworICAgICAgICByZXR1cm4gZ2V0U2FtcGxlc1BlckZyYW1lKCkgKiBhdWRpb19ieXRlc19wZXJfc2FtcGxlKGdldERldmljZUZvcm1hdCgpKTsKICAgICB9CiAKICAgICB2aXJ0dWFsIGludDY0X3QgZ2V0RnJhbWVzV3JpdHRlbigpID0gMDsKQEAgLTQ3OCwxOCArNDcxLDE4IEBACiAgICAgLyoqCiAgICAgICogVGhpcyBzaG91bGQgbm90IGJlIGNhbGxlZCBhZnRlciB0aGUgb3BlbigpIGNhbGwuCiAgICAgICovCi0gICAgdm9pZCBzZXRGb3JtYXQoYWF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgeworICAgIHZvaWQgc2V0Rm9ybWF0KGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgewogICAgICAgICBtRm9ybWF0ID0gZm9ybWF0OwogICAgIH0KIAogICAgIC8qKgogICAgICAqIFRoaXMgc2hvdWxkIG5vdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIG9wZW4oKSBjYWxsLgogICAgICAqLwotICAgIHZvaWQgc2V0RGV2aWNlRm9ybWF0KGFhdWRpb19mb3JtYXRfdCBmb3JtYXQpIHsKKyAgICB2b2lkIHNldERldmljZUZvcm1hdChhdWRpb19mb3JtYXRfdCBmb3JtYXQpIHsKICAgICAgICAgbURldmljZUZvcm1hdCA9IGZvcm1hdDsKICAgICB9CiAKLSAgICBhYXVkaW9fZm9ybWF0X3QgZ2V0RGV2aWNlRm9ybWF0KCkgY29uc3QgeworICAgIGF1ZGlvX2Zvcm1hdF90IGdldERldmljZUZvcm1hdCgpIGNvbnN0IHsKICAgICAgICAgcmV0dXJuIG1EZXZpY2VGb3JtYXQ7CiAgICAgfQogCkBAIC01NjUsNyArNTU4LDcgQEAKICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgbURldmljZUlkID0gQUFVRElPX1VOU1BFQ0lGSUVEOwogICAgIGFhdWRpb19zaGFyaW5nX21vZGVfdCAgICAgICBtU2hhcmluZ01vZGUgPSBBQVVESU9fU0hBUklOR19NT0RFX1NIQVJFRDsKICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgbVNoYXJpbmdNb2RlTWF0Y2hSZXF1aXJlZCA9IGZhbHNlOyAvLyBtdXN0IG1hdGNoIHNoYXJpbmcgbW9kZSByZXF1ZXN0ZWQKLSAgICBhYXVkaW9fZm9ybWF0X3QgICAgICAgICAgICAgbUZvcm1hdCA9IEFBVURJT19GT1JNQVRfVU5TUEVDSUZJRUQ7CisgICAgYXVkaW9fZm9ybWF0X3QgICAgICAgICAgICAgIG1Gb3JtYXQgPSBBVURJT19GT1JNQVRfREVGQVVMVDsKICAgICBhYXVkaW9fc3RyZWFtX3N0YXRlX3QgICAgICAgbVN0YXRlID0gQUFVRElPX1NUUkVBTV9TVEFURV9VTklOSVRJQUxJWkVEOwogICAgIGFhdWRpb19wZXJmb3JtYW5jZV9tb2RlX3QgICBtUGVyZm9ybWFuY2VNb2RlID0gQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTk9ORTsKIApAQCAtNTc3LDcgKzU3MCw3IEBACiAKICAgICAvLyBTb21ldGltZXMgdGhlIGhhcmR3YXJlIGlzIG9wZXJhdGluZyB3aXRoIGEgZGlmZmVyZW50IGZvcm1hdCBmcm9tIHRoZSBhcHAuCiAgICAgLy8gVGhlbiB3ZSByZXF1aXJlIGNvbnZlcnNpb24gaW4gQUF1ZGlvLgotICAgIGFhdWRpb19mb3JtYXRfdCAgICAgICAgICAgICBtRGV2aWNlRm9ybWF0ID0gQUFVRElPX0ZPUk1BVF9VTlNQRUNJRklFRDsKKyAgICBhdWRpb19mb3JtYXRfdCAgICAgICAgICAgICAgbURldmljZUZvcm1hdCA9IEFVRElPX0ZPUk1BVF9JTlZBTElEOwogCiAgICAgLy8gY2FsbGJhY2sgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2ZpZm8vRmlmb0J1ZmZlci5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2ZpZm8vRmlmb0J1ZmZlci5jcHAKaW5kZXggYjA5MjU4ZS4uZjUxMTNmMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9maWZvL0ZpZm9CdWZmZXIuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmlmby9GaWZvQnVmZmVyLmNwcApAQCAtMjMsMzAgKzIzLDI2IEBACiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKICNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8bWVtb3J5PgogCiAjaW5jbHVkZSAiRmlmb0NvbnRyb2xsZXJCYXNlLmgiCiAjaW5jbHVkZSAiRmlmb0NvbnRyb2xsZXIuaCIKICNpbmNsdWRlICJGaWZvQ29udHJvbGxlckluZGlyZWN0LmgiCiAjaW5jbHVkZSAiRmlmb0J1ZmZlci5oIgogCi11c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsgLy8gVE9ETyBqdXN0IGltcG9ydCBuYW1lcyBuZWVkZWQKK3VzaW5nIGFuZHJvaWQ6OkZpZm9CdWZmZXI7Cit1c2luZyBhbmRyb2lkOjpmaWZvX2ZyYW1lc190OwogCiBGaWZvQnVmZmVyOjpGaWZvQnVmZmVyKGludDMyX3QgYnl0ZXNQZXJGcmFtZSwgZmlmb19mcmFtZXNfdCBjYXBhY2l0eUluRnJhbWVzKQotICAgICAgICA6IG1GcmFtZUNhcGFjaXR5KGNhcGFjaXR5SW5GcmFtZXMpCi0gICAgICAgICwgbUJ5dGVzUGVyRnJhbWUoYnl0ZXNQZXJGcmFtZSkKLSAgICAgICAgLCBtU3RvcmFnZShudWxscHRyKQotICAgICAgICAsIG1GcmFtZXNSZWFkQ291bnQoMCkKLSAgICAgICAgLCBtRnJhbWVzVW5kZXJydW5Db3VudCgwKQotICAgICAgICAsIG1VbmRlcnJ1bkNvdW50KDApCisgICAgICAgIDogbUJ5dGVzUGVyRnJhbWUoYnl0ZXNQZXJGcmFtZSkKIHsKLSAgICAvLyBUT0RPIEhhbmRsZSBwb3NzaWJsZSBmYWlsdXJlcyB0byBhbGxvY2F0ZS4gTW92ZSBvdXQgb2YgY29uc3RydWN0b3I/Ci0gICAgbUZpZm8gPSBuZXcgRmlmb0NvbnRyb2xsZXIoY2FwYWNpdHlJbkZyYW1lcywgY2FwYWNpdHlJbkZyYW1lcyk7CisgICAgbUZpZm8gPSBzdGQ6Om1ha2VfdW5pcXVlPEZpZm9Db250cm9sbGVyPihjYXBhY2l0eUluRnJhbWVzLCBjYXBhY2l0eUluRnJhbWVzKTsKICAgICAvLyBhbGxvY2F0ZSBidWZmZXIKICAgICBpbnQzMl90IGJ5dGVzUGVyQnVmZmVyID0gYnl0ZXNQZXJGcmFtZSAqIGNhcGFjaXR5SW5GcmFtZXM7CiAgICAgbVN0b3JhZ2UgPSBuZXcgdWludDhfdFtieXRlc1BlckJ1ZmZlcl07CiAgICAgbVN0b3JhZ2VPd25lZCA9IHRydWU7Ci0gICAgQUxPR1YoImNhcGFjaXR5SW5GcmFtZXMgPSAlZCwgYnl0ZXNQZXJGcmFtZSA9ICVkIiwKLSAgICAgICAgICBjYXBhY2l0eUluRnJhbWVzLCBieXRlc1BlckZyYW1lKTsKKyAgICBBTE9HVigiJXMoKSBjYXBhY2l0eUluRnJhbWVzID0gJWQsIGJ5dGVzUGVyRnJhbWUgPSAlZCIsCisgICAgICAgICAgX19mdW5jX18sIGNhcGFjaXR5SW5GcmFtZXMsIGJ5dGVzUGVyRnJhbWUpOwogfQogCiBGaWZvQnVmZmVyOjpGaWZvQnVmZmVyKCBpbnQzMl90ICAgYnl0ZXNQZXJGcmFtZSwKQEAgLTU1LDE0ICs1MSwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgZmlmb19jb3VudGVyX3QgKiAgd3JpdGVJbmRleEFkZHJlc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICogIGRhdGFTdG9yYWdlQWRkcmVzcwogICAgICAgICAgICAgICAgICAgICAgICAgKQotICAgICAgICA6IG1GcmFtZUNhcGFjaXR5KGNhcGFjaXR5SW5GcmFtZXMpCi0gICAgICAgICwgbUJ5dGVzUGVyRnJhbWUoYnl0ZXNQZXJGcmFtZSkKKyAgICAgICAgOiBtQnl0ZXNQZXJGcmFtZShieXRlc1BlckZyYW1lKQogICAgICAgICAsIG1TdG9yYWdlKHN0YXRpY19jYXN0PHVpbnQ4X3QgKj4oZGF0YVN0b3JhZ2VBZGRyZXNzKSkKLSAgICAgICAgLCBtRnJhbWVzUmVhZENvdW50KDApCi0gICAgICAgICwgbUZyYW1lc1VuZGVycnVuQ291bnQoMCkKLSAgICAgICAgLCBtVW5kZXJydW5Db3VudCgwKQogewotICAgIG1GaWZvID0gbmV3IEZpZm9Db250cm9sbGVySW5kaXJlY3QoY2FwYWNpdHlJbkZyYW1lcywKKyAgICBtRmlmbyA9IHN0ZDo6bWFrZV91bmlxdWU8Rmlmb0NvbnRyb2xsZXJJbmRpcmVjdD4oY2FwYWNpdHlJbkZyYW1lcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGFjaXR5SW5GcmFtZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkSW5kZXhBZGRyZXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVJbmRleEFkZHJlc3MpOwpAQCAtNzMsMTAgKzY1LDggQEAKICAgICBpZiAobVN0b3JhZ2VPd25lZCkgewogICAgICAgICBkZWxldGVbXSBtU3RvcmFnZTsKICAgICB9Ci0gICAgZGVsZXRlIG1GaWZvOwogfQogCi0KIGludDMyX3QgRmlmb0J1ZmZlcjo6Y29udmVydEZyYW1lc1RvQnl0ZXMoZmlmb19mcmFtZXNfdCBmcmFtZXMpIHsKICAgICByZXR1cm4gZnJhbWVzICogbUJ5dGVzUGVyRnJhbWU7CiB9CkBAIC04NywxMSArNzcsMTIgQEAKICAgICB3cmFwcGluZ0J1ZmZlci0+ZGF0YVsxXSA9IG51bGxwdHI7CiAgICAgd3JhcHBpbmdCdWZmZXItPm51bUZyYW1lc1sxXSA9IDA7CiAgICAgaWYgKGZyYW1lc0F2YWlsYWJsZSA+IDApIHsKKyAgICAgICAgZmlmb19mcmFtZXNfdCBjYXBhY2l0eSA9IG1GaWZvLT5nZXRDYXBhY2l0eSgpOwogICAgICAgICB1aW50OF90ICpzb3VyY2UgPSAmbVN0b3JhZ2VbY29udmVydEZyYW1lc1RvQnl0ZXMoc3RhcnRJbmRleCldOwogICAgICAgICAvLyBEb2VzIHRoZSBhdmFpbGFibGUgZGF0YSBjcm9zcyB0aGUgZW5kIG9mIHRoZSBGSUZPPwotICAgICAgICBpZiAoKHN0YXJ0SW5kZXggKyBmcmFtZXNBdmFpbGFibGUpID4gbUZyYW1lQ2FwYWNpdHkpIHsKKyAgICAgICAgaWYgKChzdGFydEluZGV4ICsgZnJhbWVzQXZhaWxhYmxlKSA+IGNhcGFjaXR5KSB7CiAgICAgICAgICAgICB3cmFwcGluZ0J1ZmZlci0+ZGF0YVswXSA9IHNvdXJjZTsKLSAgICAgICAgICAgIGZpZm9fZnJhbWVzX3QgZmlyc3RGcmFtZXMgPSBtRnJhbWVDYXBhY2l0eSAtIHN0YXJ0SW5kZXg7CisgICAgICAgICAgICBmaWZvX2ZyYW1lc190IGZpcnN0RnJhbWVzID0gY2FwYWNpdHkgLSBzdGFydEluZGV4OwogICAgICAgICAgICAgd3JhcHBpbmdCdWZmZXItPm51bUZyYW1lc1swXSA9IGZpcnN0RnJhbWVzOwogICAgICAgICAgICAgd3JhcHBpbmdCdWZmZXItPmRhdGFbMV0gPSAmbVN0b3JhZ2VbMF07CiAgICAgICAgICAgICB3cmFwcGluZ0J1ZmZlci0+bnVtRnJhbWVzWzFdID0gZnJhbWVzQXZhaWxhYmxlIC0gZmlyc3RGcmFtZXM7CkBAIC0xMDcsNyArOTgsOCBAQAogCiBmaWZvX2ZyYW1lc190IEZpZm9CdWZmZXI6OmdldEZ1bGxEYXRhQXZhaWxhYmxlKFdyYXBwaW5nQnVmZmVyICp3cmFwcGluZ0J1ZmZlcikgewogICAgIC8vIFRoZSBGSUZPIG1pZ2h0IGJlIG92ZXJmdWxsIHNvIGNsaXAgdG8gY2FwYWNpdHkuCi0gICAgZmlmb19mcmFtZXNfdCBmcmFtZXNBdmFpbGFibGUgPSBzdGQ6Om1pbihtRmlmby0+Z2V0RnVsbEZyYW1lc0F2YWlsYWJsZSgpLCBtRnJhbWVDYXBhY2l0eSk7CisgICAgZmlmb19mcmFtZXNfdCBmcmFtZXNBdmFpbGFibGUgPSBzdGQ6Om1pbihtRmlmby0+Z2V0RnVsbEZyYW1lc0F2YWlsYWJsZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZpZm8tPmdldENhcGFjaXR5KCkpOwogICAgIGZpZm9fZnJhbWVzX3Qgc3RhcnRJbmRleCA9IG1GaWZvLT5nZXRSZWFkSW5kZXgoKTsKICAgICBmaWxsV3JhcHBpbmdCdWZmZXIod3JhcHBpbmdCdWZmZXIsIGZyYW1lc0F2YWlsYWJsZSwgc3RhcnRJbmRleCk7CiAgICAgcmV0dXJuIGZyYW1lc0F2YWlsYWJsZTsKQEAgLTExNSw3ICsxMDcsOCBAQAogCiBmaWZvX2ZyYW1lc190IEZpZm9CdWZmZXI6OmdldEVtcHR5Um9vbUF2YWlsYWJsZShXcmFwcGluZ0J1ZmZlciAqd3JhcHBpbmdCdWZmZXIpIHsKICAgICAvLyBUaGUgRklGTyBtaWdodCBoYXZlIHVuZGVycnVuIHNvIGNsaXAgdG8gY2FwYWNpdHkuCi0gICAgZmlmb19mcmFtZXNfdCBmcmFtZXNBdmFpbGFibGUgPSBzdGQ6Om1pbihtRmlmby0+Z2V0RW1wdHlGcmFtZXNBdmFpbGFibGUoKSwgbUZyYW1lQ2FwYWNpdHkpOworICAgIGZpZm9fZnJhbWVzX3QgZnJhbWVzQXZhaWxhYmxlID0gc3RkOjptaW4obUZpZm8tPmdldEVtcHR5RnJhbWVzQXZhaWxhYmxlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRmlmby0+Z2V0Q2FwYWNpdHkoKSk7CiAgICAgZmlmb19mcmFtZXNfdCBzdGFydEluZGV4ID0gbUZpZm8tPmdldFdyaXRlSW5kZXgoKTsKICAgICBmaWxsV3JhcHBpbmdCdWZmZXIod3JhcHBpbmdCdWZmZXIsIGZyYW1lc0F2YWlsYWJsZSwgc3RhcnRJbmRleCk7CiAgICAgcmV0dXJuIGZyYW1lc0F2YWlsYWJsZTsKQEAgLTE4MywyMyArMTc2LDYgQEAKICAgICByZXR1cm4gZnJhbWVzV3JpdHRlbjsKIH0KIAotZmlmb19mcmFtZXNfdCBGaWZvQnVmZmVyOjpyZWFkTm93KHZvaWQgKmJ1ZmZlciwgZmlmb19mcmFtZXNfdCBudW1GcmFtZXMpIHsKLSAgICBtTGFzdFJlYWRTaXplID0gbnVtRnJhbWVzOwotICAgIGZpZm9fZnJhbWVzX3QgZnJhbWVzTGVmdCA9IG51bUZyYW1lczsKLSAgICBmaWZvX2ZyYW1lc190IGZyYW1lc1JlYWQgPSByZWFkKGJ1ZmZlciwgbnVtRnJhbWVzKTsKLSAgICBmcmFtZXNMZWZ0IC09IGZyYW1lc1JlYWQ7Ci0gICAgbUZyYW1lc1JlYWRDb3VudCArPSBmcmFtZXNSZWFkOwotICAgIG1GcmFtZXNVbmRlcnJ1bkNvdW50ICs9IGZyYW1lc0xlZnQ7Ci0gICAgLy8gWmVybyBvdXQgYW55IHNhbXBsZXMgd2UgY291bGQgbm90IHNldC4KLSAgICBpZiAoZnJhbWVzTGVmdCA+IDApIHsKLSAgICAgICAgbVVuZGVycnVuQ291bnQrKzsKLSAgICAgICAgaW50MzJfdCBieXRlc1RvWmVybyA9IGNvbnZlcnRGcmFtZXNUb0J5dGVzKGZyYW1lc0xlZnQpOwotICAgICAgICBtZW1zZXQoYnVmZmVyLCAwLCBieXRlc1RvWmVybyk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGZyYW1lc1JlYWQ7Ci19Ci0KIGZpZm9fZnJhbWVzX3QgRmlmb0J1ZmZlcjo6Z2V0VGhyZXNob2xkKCkgewogICAgIHJldHVybiBtRmlmby0+Z2V0VGhyZXNob2xkKCk7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2ZpZm8vRmlmb0J1ZmZlci5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9maWZvL0ZpZm9CdWZmZXIuaAppbmRleCBmNWE5ZTI3Li4wZDE4OGM0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2ZpZm8vRmlmb0J1ZmZlci5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmlmby9GaWZvQnVmZmVyLmgKQEAgLTE3LDYgKzE3LDcgQEAKICNpZm5kZWYgRklGT19GSUZPX0JVRkZFUl9ICiAjZGVmaW5lIEZJRk9fRklGT19CVUZGRVJfSAogCisjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPHN0ZGludC5oPgogCiAjaW5jbHVkZSAiRmlmb0NvbnRyb2xsZXJCYXNlLmgiCkBAIC03NywyNCArNzgsMTIgQEAKICAgICAgKi8KICAgICBmaWZvX2ZyYW1lc190IGdldEVtcHR5Um9vbUF2YWlsYWJsZShXcmFwcGluZ0J1ZmZlciAqd3JhcHBpbmdCdWZmZXIpOwogCi0gICAgLyoqCi0gICAgICogQ29weSBkYXRhIGZyb20gdGhlIEZJRk8gaW50byB0aGUgYnVmZmVyLgotICAgICAqIEBwYXJhbSBidWZmZXIKLSAgICAgKiBAcGFyYW0gbnVtRnJhbWVzCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIGZpZm9fZnJhbWVzX3QgcmVhZE5vdyh2b2lkICpidWZmZXIsIGZpZm9fZnJhbWVzX3QgbnVtRnJhbWVzKTsKLQotICAgIGludDY0X3QgZ2V0TmV4dFJlYWRUaW1lKGludDMyX3QgZnJhbWVSYXRlKTsKLQotICAgIGludDMyX3QgZ2V0VW5kZXJydW5Db3VudCgpIGNvbnN0IHsgcmV0dXJuIG1VbmRlcnJ1bkNvdW50OyB9Ci0KLSAgICBGaWZvQ29udHJvbGxlckJhc2UgKmdldEZpZm9Db250cm9sbGVyQmFzZSgpIHsgcmV0dXJuIG1GaWZvOyB9Ci0KICAgICBpbnQzMl90IGdldEJ5dGVzUGVyRnJhbWUoKSB7CiAgICAgICAgIHJldHVybiBtQnl0ZXNQZXJGcmFtZTsKICAgICB9CiAKKyAgICAvLyBQcm94eSBtZXRob2RzIGZvciB0aGUgaW50ZXJuYWwgRmlmb0NvbnRyb2xsZXIKKwogICAgIGZpZm9fY291bnRlcl90IGdldFJlYWRDb3VudGVyKCkgewogICAgICAgICByZXR1cm4gbUZpZm8tPmdldFJlYWRDb3VudGVyKCk7CiAgICAgfQpAQCAtMTExLDYgKzEwMCwyMiBAQAogICAgICAgICBtRmlmby0+c2V0V3JpdGVDb3VudGVyKG4pOwogICAgIH0KIAorICAgIHZvaWQgYWR2YW5jZVJlYWRJbmRleChmaWZvX2ZyYW1lc190IG51bUZyYW1lcykgeworICAgICAgICBtRmlmby0+YWR2YW5jZVJlYWRJbmRleChudW1GcmFtZXMpOworICAgIH0KKworICAgIHZvaWQgYWR2YW5jZVdyaXRlSW5kZXgoZmlmb19mcmFtZXNfdCBudW1GcmFtZXMpIHsKKyAgICAgICAgbUZpZm8tPmFkdmFuY2VXcml0ZUluZGV4KG51bUZyYW1lcyk7CisgICAgfQorCisgICAgZmlmb19mcmFtZXNfdCBnZXRFbXB0eUZyYW1lc0F2YWlsYWJsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1GaWZvLT5nZXRFbXB0eUZyYW1lc0F2YWlsYWJsZSgpOworICAgIH0KKworICAgIGZpZm9fZnJhbWVzX3QgZ2V0RnVsbEZyYW1lc0F2YWlsYWJsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1GaWZvLT5nZXRGdWxsRnJhbWVzQXZhaWxhYmxlKCk7CisgICAgfQorCiAgICAgLyoKICAgICAgKiBUaGlzIGlzIGdlbmVyYWxseSBvbmx5IGNhbGxlZCBiZWZvcmUgb3IgYWZ0ZXIgdGhlIGJ1ZmZlciBpcyB1c2VkLgogICAgICAqLwpAQCAtMTIxLDE1ICsxMjYsMTIgQEAKICAgICB2b2lkIGZpbGxXcmFwcGluZ0J1ZmZlcihXcmFwcGluZ0J1ZmZlciAqd3JhcHBpbmdCdWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBmcmFtZXNBdmFpbGFibGUsIGludDMyX3Qgc3RhcnRJbmRleCk7CiAKLSAgICBjb25zdCBmaWZvX2ZyYW1lc190IG1GcmFtZUNhcGFjaXR5OwotICAgIGNvbnN0IGludDMyX3QgbUJ5dGVzUGVyRnJhbWU7Ci0gICAgdWludDhfdCAqbVN0b3JhZ2U7Ci0gICAgYm9vbCBtU3RvcmFnZU93bmVkOyAvLyBkaWQgdGhpcyBvYmplY3QgYWxsb2NhdGUgdGhlIHN0b3JhZ2U/Ci0gICAgRmlmb0NvbnRyb2xsZXJCYXNlICptRmlmbzsKLSAgICBmaWZvX2NvdW50ZXJfdCBtRnJhbWVzUmVhZENvdW50OwotICAgIGZpZm9fY291bnRlcl90IG1GcmFtZXNVbmRlcnJ1bkNvdW50OwotICAgIGludDMyX3QgbVVuZGVycnVuQ291bnQ7IC8vIG5lZWQ/IGp1c3QgdXNlIGZyYW1lcwotICAgIGludDMyX3QgbUxhc3RSZWFkU2l6ZTsKKyAgICBjb25zdCBpbnQzMl90ICAgICAgICAgICAgIG1CeXRlc1BlckZyYW1lOworICAgIC8vIFdlIGRvIG5vdCB1c2UgYSBzdGQ6OnVuaXF1ZV9wdHIgZm9yIG1TdG9yYWdlIGJlY2F1c2UgaXQgaXMgb2Z0ZW4gYSBwb2ludGVyIHRvCisgICAgLy8gbWVtb3J5IHNoYXJlZCBiZXR3ZWVuIHByb2Nlc3NlcyBhbmQgY2Fubm90IGJlIGRlbGV0ZWQgdHJpdmlhbGx5LgorICAgIHVpbnQ4X3QgICAgICAgICAgICAgICAgICAqbVN0b3JhZ2UgPSBudWxscHRyOworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgbVN0b3JhZ2VPd25lZCA9IGZhbHNlOyAvLyBkaWQgdGhpcyBvYmplY3QgYWxsb2NhdGUgdGhlIHN0b3JhZ2U/CisgICAgc3RkOjp1bmlxdWVfcHRyPEZpZm9Db250cm9sbGVyQmFzZT4gbUZpZm97fTsKIH07CiAKIH0gIC8vIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmlmby9GaWZvQ29udHJvbGxlci5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9maWZvL0ZpZm9Db250cm9sbGVyLmgKaW5kZXggNzlkOThhMS4uMDU3YTk0ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9maWZvL0ZpZm9Db250cm9sbGVyLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9maWZvL0ZpZm9Db250cm9sbGVyLmgKQEAgLTMwLDcgKzMwLDcgQEAKIGNsYXNzIEZpZm9Db250cm9sbGVyIDogcHVibGljIEZpZm9Db250cm9sbGVyQmFzZQogewogcHVibGljOgotICAgIEZpZm9Db250cm9sbGVyKGZpZm9fY291bnRlcl90IGJ1ZmZlclNpemUsIGZpZm9fY291bnRlcl90IHRocmVzaG9sZCkKKyAgICBGaWZvQ29udHJvbGxlcihmaWZvX2ZyYW1lc190IGJ1ZmZlclNpemUsIGZpZm9fZnJhbWVzX3QgdGhyZXNob2xkKQogICAgIDogRmlmb0NvbnRyb2xsZXJCYXNlKGJ1ZmZlclNpemUsIHRocmVzaG9sZCkKICAgICAsIG1SZWFkQ291bnRlcigwKQogICAgICwgbVdyaXRlQ291bnRlcigwKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9maWZvL0ZpZm9Db250cm9sbGVyQmFzZS5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2ZpZm8vRmlmb0NvbnRyb2xsZXJCYXNlLmNwcAppbmRleCAxNGEyYmUxLi45ODg1Y2IwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2ZpZm8vRmlmb0NvbnRyb2xsZXJCYXNlLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2ZpZm8vRmlmb0NvbnRyb2xsZXJCYXNlLmNwcApAQCAtNTksNSArNTksMTAgQEAKIH0KIAogdm9pZCBGaWZvQ29udHJvbGxlckJhc2U6OnNldFRocmVzaG9sZChmaWZvX2ZyYW1lc190IHRocmVzaG9sZCkgeworICAgIGlmICh0aHJlc2hvbGQgPiBtQ2FwYWNpdHkpIHsKKyAgICAgICAgdGhyZXNob2xkID0gbUNhcGFjaXR5OworICAgIH0gZWxzZSBpZiAodGhyZXNob2xkIDwgMCkgeworICAgICAgICB0aHJlc2hvbGQgPSAwOworICAgIH0KICAgICBtVGhyZXNob2xkID0gdGhyZXNob2xkOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9maWZvL0ZpZm9Db250cm9sbGVyQmFzZS5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9maWZvL0ZpZm9Db250cm9sbGVyQmFzZS5oCmluZGV4IDY0YWY3NzcuLjFlZGI4YTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmlmby9GaWZvQ29udHJvbGxlckJhc2UuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2ZpZm8vRmlmb0NvbnRyb2xsZXJCYXNlLmgKQEAgLTEwMiw2ICsxMDIsOSBAQAogICAgIC8qKgogICAgICAqIFlvdSBjYW4gcmVxdWVzdCB0aGF0IHRoZSBidWZmZXIgbm90IGJlIGZpbGxlZCBhYm92ZSBhIG1heGltdW0KICAgICAgKiBudW1iZXIgb2YgZnJhbWVzLgorICAgICAqCisgICAgICogVGhlIHRocmVzaG9sZCB3aWxsIGJlIGNsaXBwZWQgYmV0d2VlbiB6ZXJvIGFuZCB0aGUgYnVmZmVyIGNhcGFjaXR5LgorICAgICAqCiAgICAgICogQHBhcmFtIHRocmVzaG9sZCBlZmZlY3RpdmUgc2l6ZSBvZiB0aGUgYnVmZmVyCiAgICAgICovCiAgICAgdm9pZCBzZXRUaHJlc2hvbGQoZmlmb19mcmFtZXNfdCB0aHJlc2hvbGQpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvQXVkaW9Qcm9jZXNzb3JCYXNlLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL0F1ZGlvUHJvY2Vzc29yQmFzZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY2N2ZkYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL0F1ZGlvUHJvY2Vzc29yQmFzZS5jcHAKQEAgLTAsMCArMSw4MiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlICJBdWRpb1Byb2Nlc3NvckJhc2UuaCIKKwordXNpbmcgbmFtZXNwYWNlIGZsb3dncmFwaDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludDMyX3QgQXVkaW9Qcm9jZXNzb3JCYXNlOjpwdWxsRGF0YShpbnQ2NF90IGZyYW1lUG9zaXRpb24sIGludDMyX3QgbnVtRnJhbWVzKSB7CisgICAgaWYgKGZyYW1lUG9zaXRpb24gPiBtTGFzdEZyYW1lUG9zaXRpb24pIHsKKyAgICAgICAgbUxhc3RGcmFtZVBvc2l0aW9uID0gZnJhbWVQb3NpdGlvbjsKKyAgICAgICAgbUZyYW1lc1ZhbGlkID0gb25Qcm9jZXNzKGZyYW1lUG9zaXRpb24sIG51bUZyYW1lcyk7CisgICAgfQorICAgIHJldHVybiBtRnJhbWVzVmFsaWQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitBdWRpb0Zsb2F0QmxvY2tQb3J0OjpBdWRpb0Zsb2F0QmxvY2tQb3J0KEF1ZGlvUHJvY2Vzc29yQmFzZSAmcGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZnJhbWVzUGVyQmxvY2spCisgICAgICAgIDogQXVkaW9Qb3J0KHBhcmVudCwgc2FtcGxlc1BlckZyYW1lKQorICAgICAgICAsIG1GcmFtZXNQZXJCbG9jayhmcmFtZXNQZXJCbG9jaykKKyAgICAgICAgLCBtU2FtcGxlQmxvY2soTlVMTCkgeworICAgIGludDMyX3QgbnVtRmxvYXRzID0gZnJhbWVzUGVyQmxvY2sgKiBnZXRTYW1wbGVzUGVyRnJhbWUoKTsKKyAgICBtU2FtcGxlQmxvY2sgPSBuZXcgZmxvYXRbbnVtRmxvYXRzXXswLjBmfTsKK30KKworQXVkaW9GbG9hdEJsb2NrUG9ydDo6fkF1ZGlvRmxvYXRCbG9ja1BvcnQoKSB7CisgICAgZGVsZXRlW10gbVNhbXBsZUJsb2NrOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50MzJfdCBBdWRpb0Zsb2F0T3V0cHV0UG9ydDo6cHVsbERhdGEoaW50NjRfdCBmcmFtZVBvc2l0aW9uLCBpbnQzMl90IG51bUZyYW1lcykgeworICAgIG51bUZyYW1lcyA9IHN0ZDo6bWluKGdldEZyYW1lc1BlckJsb2NrKCksIG51bUZyYW1lcyk7CisgICAgcmV0dXJuIG1QYXJlbnQucHVsbERhdGEoZnJhbWVQb3NpdGlvbiwgbnVtRnJhbWVzKTsKK30KKworLy8gVGhlc2UgbmVlZCB0byBiZSBpbiB0aGUgLmNwcCBmaWxlIGJlY2F1c2Ugb2YgZm9yd2FyZCBjcm9zcyByZWZlcmVuY2VzLgordm9pZCBBdWRpb0Zsb2F0T3V0cHV0UG9ydDo6Y29ubmVjdChBdWRpb0Zsb2F0SW5wdXRQb3J0ICpwb3J0KSB7CisgICAgcG9ydC0+Y29ubmVjdCh0aGlzKTsKK30KKwordm9pZCBBdWRpb0Zsb2F0T3V0cHV0UG9ydDo6ZGlzY29ubmVjdChBdWRpb0Zsb2F0SW5wdXRQb3J0ICpwb3J0KSB7CisgICAgcG9ydC0+ZGlzY29ubmVjdCh0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludDMyX3QgQXVkaW9GbG9hdElucHV0UG9ydDo6cHVsbERhdGEoaW50NjRfdCBmcmFtZVBvc2l0aW9uLCBpbnQzMl90IG51bUZyYW1lcykgeworICAgIHJldHVybiAobUNvbm5lY3RlZCA9PSBOVUxMKQorICAgICAgICAgICAgPyBzdGQ6Om1pbihnZXRGcmFtZXNQZXJCbG9jaygpLCBudW1GcmFtZXMpCisgICAgICAgICAgICA6IG1Db25uZWN0ZWQtPnB1bGxEYXRhKGZyYW1lUG9zaXRpb24sIG51bUZyYW1lcyk7Cit9CisKK2Zsb2F0ICpBdWRpb0Zsb2F0SW5wdXRQb3J0OjpnZXRCbG9jaygpIHsKKyAgICBpZiAobUNvbm5lY3RlZCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBBdWRpb0Zsb2F0QmxvY2tQb3J0OjpnZXRCbG9jaygpOyAvLyBsb2FkZWQgdXNpbmcgc2V0VmFsdWUoKQorICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBtQ29ubmVjdGVkLT5nZXRCbG9jaygpOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludDMyX3QgQXVkaW9TaW5rOjpwdWxsKGludDMyX3QgbnVtRnJhbWVzKSB7CisgICAgaW50MzJfdCBhY3R1YWxGcmFtZXMgPSBpbnB1dC5wdWxsRGF0YShtRnJhbWVQb3NpdGlvbiwgbnVtRnJhbWVzKTsKKyAgICBtRnJhbWVQb3NpdGlvbiArPSBhY3R1YWxGcmFtZXM7CisgICAgcmV0dXJuIGFjdHVhbEZyYW1lczsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9BdWRpb1Byb2Nlc3NvckJhc2UuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL0F1ZGlvUHJvY2Vzc29yQmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkYTQ2YWUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9BdWRpb1Byb2Nlc3NvckJhc2UuaApAQCAtMCwwICsxLDI5MyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoKKyAqIEF1ZGlvUHJvY2Vzc29yQmFzZS5oCisgKgorICogQXVkaW8gcHJvY2Vzc2luZyBub2RlIGFuZCBwb3J0cyB0aGF0IGNhbiBiZSB1c2VkIGluIGEgc2ltcGxlIGRhdGEgZmxvdyBncmFwaC4KKyAqLworCisjaWZuZGVmIEZMT1dHUkFQSF9BVURJT19QUk9DRVNTT1JfQkFTRV9ICisjZGVmaW5lIEZMT1dHUkFQSF9BVURJT19QUk9DRVNTT1JfQkFTRV9ICisKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdHJpbmc+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworLy8gVE9ETyBjb25zaWRlciBwdWJsaXNoaW5nIGFsbCBoZWFkZXIgZmlsZXMgdW5kZXIgImluY2x1ZGUvbGliYWF1ZGlvL0Zsb3dHcmFwaC5oIgorCituYW1lc3BhY2UgZmxvd2dyYXBoIHsKKworLy8gRGVmYXVsdCBibG9jayBzaXplIHRoYXQgY2FuIGJlIG92ZXJyaWRkZW4gd2hlbiB0aGUgQXVkaW9GbG9hdEJsb2NrUG9ydCBpcyBjcmVhdGVkLgorLy8gSWYgaXQgaXMgdG9vIHNtYWxsIHRoZW4gd2Ugd2lsbCBoYXZlIHRvbyBtdWNoIG92ZXJoZWFkIGZyb20gc3dpdGNoaW5nIGJldHdlZW4gbm9kZXMuCisvLyBJZiBpdCBpcyB0b28gaGlnaCB0aGVuIHdlIHdpbGwgdGhyYXNoIHRoZSBjYWNoZXMuCitjb25zdGV4cHIgaW50IGtEZWZhdWx0QmxvY2tTaXplID0gODsgLy8gYXJiaXRyYXJ5CisKK2NsYXNzIEF1ZGlvRmxvYXRJbnB1dFBvcnQ7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitjbGFzcyBBdWRpb1Byb2Nlc3NvckJhc2UgeworcHVibGljOgorICAgIHZpcnR1YWwgfkF1ZGlvUHJvY2Vzc29yQmFzZSgpID0gZGVmYXVsdDsKKworICAgIC8qKgorICAgICAqIFBlcmZvcm0gY3VzdG9tIGZ1bmN0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGZyYW1lUG9zaXRpb24gaW5kZXggb2YgZmlyc3QgZnJhbWUgdG8gYmUgcHJvY2Vzc2VkCisgICAgICogQHBhcmFtIG51bUZyYW1lcyBtYXhpbXVtIG51bWJlciBvZiBmcmFtZXMgcmVxdWVzdGVkIGZvciBwcm9jZXNzaW5nCisgICAgICogQHJldHVybiBudW1iZXIgb2YgZnJhbWVzIGFjdHVhbGx5IHByb2Nlc3NlZAorICAgICAqLworICAgIHZpcnR1YWwgaW50MzJfdCBvblByb2Nlc3MoaW50NjRfdCBmcmFtZVBvc2l0aW9uLCBpbnQzMl90IG51bUZyYW1lcykgPSAwOworCisgICAgLyoqCisgICAgICogSWYgdGhlIGZyYW1lUG9zaXRpb24gaXMgYXQgb3IgYWZ0ZXIgdGhlIGxhc3QgZnJhbWUgcG9zaXRpb24gdGhlbiBjYWxsIG9uUHJvY2VzcygpLgorICAgICAqIFRoaXMgcHJldmVudHMgaW5maW5pdGUgcmVjdXJzaW9uIGluIGNhc2Ugb2YgY3ljbGljIGdyYXBocy4KKyAgICAgKiBJdCBhbHNvIHByZXZlbnRzIG5vZGVzIHVwc3RyZWFtIGZyb20gYSBicmFuY2ggZnJvbSBiZWluZyBleGVjdXRlZCB0d2ljZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmcmFtZVBvc2l0aW9uCisgICAgICogQHBhcmFtIG51bUZyYW1lcworICAgICAqIEByZXR1cm4KKyAgICAgKi8KKyAgICBpbnQzMl90IHB1bGxEYXRhKGludDY0X3QgZnJhbWVQb3NpdGlvbiwgaW50MzJfdCBudW1GcmFtZXMpOworCitwcm90ZWN0ZWQ6CisgICAgaW50NjRfdCAgbUxhc3RGcmFtZVBvc2l0aW9uID0gLTE7IC8vIFN0YXJ0IGF0IC0xIHNvIHRoYXQgdGhlIGZpcnN0IHB1bGwgd29ya3MuCisKK3ByaXZhdGU6CisgICAgaW50MzJfdCAgbUZyYW1lc1ZhbGlkID0gMDsgLy8gbnVtIHZhbGlkIGZyYW1lcyBpbiB0aGUgYmxvY2sKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAgKiBUaGlzIGlzIGEgY29ubmVjdG9yIHRoYXQgYWxsb3dzIGRhdGEgdG8gZmxvdyBiZXR3ZWVuIG1vZHVsZXMuCisgICovCitjbGFzcyBBdWRpb1BvcnQgeworcHVibGljOgorICAgIEF1ZGlvUG9ydChBdWRpb1Byb2Nlc3NvckJhc2UgJnBhcmVudCwgaW50MzJfdCBzYW1wbGVzUGVyRnJhbWUpCisgICAgICAgICAgICA6IG1QYXJlbnQocGFyZW50KQorICAgICAgICAgICAgLCBtU2FtcGxlc1BlckZyYW1lKHNhbXBsZXNQZXJGcmFtZSkgeworICAgIH0KKworICAgIC8vIFBvcnRzIGFyZSBvZnRlbiBkZWNsYXJlZCBwdWJsaWMuIFNvIGxldCdzIG1ha2UgdGhlbSBub24tY29weWFibGUuCisgICAgQXVkaW9Qb3J0KGNvbnN0IEF1ZGlvUG9ydCYpID0gZGVsZXRlOworICAgIEF1ZGlvUG9ydCYgb3BlcmF0b3I9KGNvbnN0IEF1ZGlvUG9ydCYpID0gZGVsZXRlOworCisgICAgaW50MzJfdCBnZXRTYW1wbGVzUGVyRnJhbWUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtU2FtcGxlc1BlckZyYW1lOworICAgIH0KKworcHJvdGVjdGVkOgorICAgIEF1ZGlvUHJvY2Vzc29yQmFzZSAmbVBhcmVudDsKKworcHJpdmF0ZToKKyAgICBjb25zdCBpbnQzMl90ICAgIG1TYW1wbGVzUGVyRnJhbWUgPSAxOworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogVGhpcyBwb3J0IGNvbnRhaW5zIGEgZmxvYXQgdHlwZSBidWZmZXIuCisgKiBUaGUgc2l6ZSBpcyBmcmFtZXNQZXJCbG9jayAqIHNhbXBsZXNQZXJGcmFtZSkuCisgKi8KK2NsYXNzIEF1ZGlvRmxvYXRCbG9ja1BvcnQgIDogcHVibGljIEF1ZGlvUG9ydCB7CitwdWJsaWM6CisgICAgQXVkaW9GbG9hdEJsb2NrUG9ydChBdWRpb1Byb2Nlc3NvckJhc2UgJm1QYXJlbnQsCisgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzYW1wbGVzUGVyRnJhbWUsCisgICAgICAgICAgICAgICAgICAgaW50MzJfdCBmcmFtZXNQZXJCbG9jayA9IGtEZWZhdWx0QmxvY2tTaXplCisgICAgICAgICAgICAgICAgKTsKKworICAgIHZpcnR1YWwgfkF1ZGlvRmxvYXRCbG9ja1BvcnQoKTsKKworICAgIGludDMyX3QgZ2V0RnJhbWVzUGVyQmxvY2soKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtRnJhbWVzUGVyQmxvY2s7CisgICAgfQorCitwcm90ZWN0ZWQ6CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIGJ1ZmZlciBpbnRlcm5hbCB0byB0aGUgcG9ydCBvciBmcm9tIGEgY29ubmVjdGVkIHBvcnQKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGZsb2F0ICpnZXRCbG9jaygpIHsKKyAgICAgICAgcmV0dXJuIG1TYW1wbGVCbG9jazsKKyAgICB9CisKKworcHJpdmF0ZToKKyAgICBjb25zdCBpbnQzMl90ICAgIG1GcmFtZXNQZXJCbG9jayA9IDE7CisgICAgZmxvYXQgICAgICAgICAgICptU2FtcGxlQmxvY2sgPSBudWxscHRyOyAvLyBhbGxvY2F0ZWQgaW4gY29uc3RydWN0b3IKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAgKiBUaGUgcmVzdWx0cyBvZiBhIG1vZHVsZSBhcmUgc3RvcmVkIGluIHRoZSBidWZmZXIgb2YgdGhlIG91dHB1dCBwb3J0cy4KKyAgKi8KK2NsYXNzIEF1ZGlvRmxvYXRPdXRwdXRQb3J0IDogcHVibGljIEF1ZGlvRmxvYXRCbG9ja1BvcnQgeworcHVibGljOgorICAgIEF1ZGlvRmxvYXRPdXRwdXRQb3J0KEF1ZGlvUHJvY2Vzc29yQmFzZSAmcGFyZW50LCBpbnQzMl90IHNhbXBsZXNQZXJGcmFtZSkKKyAgICAgICAgICAgIDogQXVkaW9GbG9hdEJsb2NrUG9ydChwYXJlbnQsIHNhbXBsZXNQZXJGcmFtZSkgeworICAgIH0KKworICAgIHZpcnR1YWwgfkF1ZGlvRmxvYXRPdXRwdXRQb3J0KCkgPSBkZWZhdWx0OworCisgICAgdXNpbmcgQXVkaW9GbG9hdEJsb2NrUG9ydDo6Z2V0QmxvY2s7CisKKyAgICAvKioKKyAgICAgKiBDYWxsIHRoZSBwYXJlbnQgbW9kdWxlJ3Mgb25Qcm9jZXNzKCkgbWV0aG9kLgorICAgICAqIFRoYXQgbWF5IHB1bGwgZGF0YSBmcm9tIGl0cyBpbnB1dHMgYW5kIHJlY3Vyc2l2ZWx5CisgICAgICogcHJvY2VzcyB0aGUgZW50aXJlIGdyYXBoLgorICAgICAqIEByZXR1cm4gbnVtYmVyIG9mIGZyYW1lcyBhY3R1YWxseSBwdWxsZWQKKyAgICAgKi8KKyAgICBpbnQzMl90IHB1bGxEYXRhKGludDY0X3QgZnJhbWVQb3NpdGlvbiwgaW50MzJfdCBudW1GcmFtZXMpOworCisgICAgLyoqCisgICAgICogQ29ubmVjdCB0byB0aGUgaW5wdXQgb2YgYW5vdGhlciBtb2R1bGUuCisgICAgICogQW4gaW5wdXQgcG9ydCBjYW4gb25seSBoYXZlIG9uZSBjb25uZWN0aW9uLgorICAgICAqIEFuIG91dHB1dCBwb3J0IGNhbiBoYXZlIG11bHRpcGxlIGNvbm5lY3Rpb25zLgorICAgICAqIElmIHlvdSBjb25uZWN0IGEgc2Vjb25kIG91dHB1dCBwb3J0IHRvIGFuIGlucHV0IHBvcnQKKyAgICAgKiB0aGVuIGl0IG92ZXJ3cml0ZXMgdGhlIHByZXZpb3VzIGNvbm5lY3Rpb24uCisgICAgICoKKyAgICAgKiBUaGlzIG5vdCB0aHJlYWQgc2FmZS4gRG8gbm90IG1vZGlmeSB0aGUgZ3JhcGggdG9wb2xvZ3kgZm9ybSBhbm90aGVyIHRocmVhZCB3aGlsZSBydW5uaW5nLgorICAgICAqLworICAgIHZvaWQgY29ubmVjdChBdWRpb0Zsb2F0SW5wdXRQb3J0ICpwb3J0KTsKKworICAgIC8qKgorICAgICAqIERpc2Nvbm5lY3QgZnJvbSB0aGUgaW5wdXQgb2YgYW5vdGhlciBtb2R1bGUuCisgICAgICogVGhpcyBub3QgdGhyZWFkIHNhZmUuCisgICAgICovCisgICAgdm9pZCBkaXNjb25uZWN0KEF1ZGlvRmxvYXRJbnB1dFBvcnQgKnBvcnQpOworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2NsYXNzIEF1ZGlvRmxvYXRJbnB1dFBvcnQgOiBwdWJsaWMgQXVkaW9GbG9hdEJsb2NrUG9ydCB7CitwdWJsaWM6CisgICAgQXVkaW9GbG9hdElucHV0UG9ydChBdWRpb1Byb2Nlc3NvckJhc2UgJnBhcmVudCwgaW50MzJfdCBzYW1wbGVzUGVyRnJhbWUpCisgICAgICAgICAgICA6IEF1ZGlvRmxvYXRCbG9ja1BvcnQocGFyZW50LCBzYW1wbGVzUGVyRnJhbWUpIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5BdWRpb0Zsb2F0SW5wdXRQb3J0KCkgPSBkZWZhdWx0OworCisgICAgLyoqCisgICAgICogSWYgY29ubmVjdGVkIHRvIGFuIG91dHB1dCBwb3J0IHRoZW4gdGhpcyB3aWxsIHJldHVybgorICAgICAqIHRoYXQgb3V0cHV0IHBvcnRzIGJ1ZmZlcnMuCisgICAgICogSWYgbm90IGNvbm5lY3RlZCB0aGVuIGl0IHJldHVybnMgdGhlIGlucHV0IHBvcnRzIG93biBidWZmZXIKKyAgICAgKiB3aGljaCBjYW4gYmUgbG9hZGVkIHVzaW5nIHNldFZhbHVlKCkuCisgICAgICovCisgICAgZmxvYXQgKmdldEJsb2NrKCkgb3ZlcnJpZGU7CisKKyAgICAvKioKKyAgICAgKiBQdWxsIGRhdGEgZnJvbSBhbnkgb3V0cHV0IHBvcnQgdGhhdCBpcyBjb25uZWN0ZWQuCisgICAgICovCisgICAgaW50MzJfdCBwdWxsRGF0YShpbnQ2NF90IGZyYW1lUG9zaXRpb24sIGludDMyX3QgbnVtRnJhbWVzKTsKKworICAgIC8qKgorICAgICAqIFdyaXRlIGV2ZXJ5IHZhbHVlIG9mIHRoZSBmbG9hdCBidWZmZXIuCisgICAgICogVGhpcyB2YWx1ZSB3aWxsIGJlIGlnbm9yZWQgaWYgYW4gb3V0cHV0IHBvcnQgaXMgY29ubmVjdGVkCisgICAgICogdG8gdGhpcyBwb3J0LgorICAgICAqLworICAgIHZvaWQgc2V0VmFsdWUoZmxvYXQgdmFsdWUpIHsKKyAgICAgICAgaW50IG51bUZsb2F0cyA9IGtEZWZhdWx0QmxvY2tTaXplICogZ2V0U2FtcGxlc1BlckZyYW1lKCk7CisgICAgICAgIGZsb2F0ICpidWZmZXIgPSBnZXRCbG9jaygpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUZsb2F0czsgaSsrKSB7CisgICAgICAgICAgICAqYnVmZmVyKysgPSB2YWx1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENvbm5lY3QgdG8gdGhlIG91dHB1dCBvZiBhbm90aGVyIG1vZHVsZS4KKyAgICAgKiBBbiBpbnB1dCBwb3J0IGNhbiBvbmx5IGhhdmUgb25lIGNvbm5lY3Rpb24uCisgICAgICogQW4gb3V0cHV0IHBvcnQgY2FuIGhhdmUgbXVsdGlwbGUgY29ubmVjdGlvbnMuCisgICAgICogVGhpcyBub3QgdGhyZWFkIHNhZmUuCisgICAgICovCisgICAgdm9pZCBjb25uZWN0KEF1ZGlvRmxvYXRPdXRwdXRQb3J0ICpwb3J0KSB7CisgICAgICAgIGFzc2VydChnZXRTYW1wbGVzUGVyRnJhbWUoKSA9PSBwb3J0LT5nZXRTYW1wbGVzUGVyRnJhbWUoKSk7CisgICAgICAgIG1Db25uZWN0ZWQgPSBwb3J0OworICAgIH0KKworICAgIHZvaWQgZGlzY29ubmVjdChBdWRpb0Zsb2F0T3V0cHV0UG9ydCAqcG9ydCkgeworICAgICAgICBhc3NlcnQobUNvbm5lY3RlZCA9PSBwb3J0KTsKKyAgICAgICAgKHZvaWQpIHBvcnQ7CisgICAgICAgIG1Db25uZWN0ZWQgPSBudWxscHRyOworICAgIH0KKworICAgIHZvaWQgZGlzY29ubmVjdCgpIHsKKyAgICAgICAgbUNvbm5lY3RlZCA9IG51bGxwdHI7CisgICAgfQorCitwcml2YXRlOgorICAgIEF1ZGlvRmxvYXRPdXRwdXRQb3J0ICptQ29ubmVjdGVkID0gbnVsbHB0cjsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitjbGFzcyBBdWRpb1NvdXJjZSA6IHB1YmxpYyBBdWRpb1Byb2Nlc3NvckJhc2UgeworcHVibGljOgorICAgIGV4cGxpY2l0IEF1ZGlvU291cmNlKGludDMyX3QgY2hhbm5lbENvdW50KQorICAgICAgICAgICAgOiBvdXRwdXQoKnRoaXMsIGNoYW5uZWxDb3VudCkgeworICAgIH0KKworICAgIHZpcnR1YWwgfkF1ZGlvU291cmNlKCkgPSBkZWZhdWx0OworCisgICAgQXVkaW9GbG9hdE91dHB1dFBvcnQgb3V0cHV0OworCisgICAgdm9pZCBzZXREYXRhKGNvbnN0IHZvaWQgKmRhdGEsIGludDMyX3QgbnVtRnJhbWVzKSB7CisgICAgICAgIG1EYXRhID0gZGF0YTsKKyAgICAgICAgbVNpemVJbkZyYW1lcyA9IG51bUZyYW1lczsKKyAgICAgICAgbUZyYW1lSW5kZXggPSAwOworICAgIH0KKworcHJvdGVjdGVkOgorICAgIGNvbnN0IHZvaWQgKm1EYXRhID0gbnVsbHB0cjsKKyAgICBpbnQzMl90ICAgICBtU2l6ZUluRnJhbWVzID0gMDsgLy8gbnVtYmVyIG9mIGZyYW1lcyBpbiBtRGF0YQorICAgIGludDMyX3QgICAgIG1GcmFtZUluZGV4ID0gMDsgLy8gaW5kZXggb2YgbmV4dCBmcmFtZSB0byBiZSBwcm9jZXNzZWQKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitjbGFzcyBBdWRpb1NpbmsgOiBwdWJsaWMgQXVkaW9Qcm9jZXNzb3JCYXNlIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBBdWRpb1NpbmsoaW50MzJfdCBjaGFubmVsQ291bnQpCisgICAgICAgICAgICA6IGlucHV0KCp0aGlzLCBjaGFubmVsQ291bnQpIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5BdWRpb1NpbmsoKSA9IGRlZmF1bHQ7CisKKyAgICBBdWRpb0Zsb2F0SW5wdXRQb3J0IGlucHV0OworCisgICAgLyoqCisgICAgICogRHVtbXkgcHJvY2Vzc29yLiBUaGUgd29yayBoYXBwZW5zIGluIHRoZSByZWFkKCkgbWV0aG9kLgorICAgICAqCisgICAgICogQHBhcmFtIGZyYW1lUG9zaXRpb24gaW5kZXggb2YgZmlyc3QgZnJhbWUgdG8gYmUgcHJvY2Vzc2VkCisgICAgICogQHBhcmFtIG51bUZyYW1lcworICAgICAqIEByZXR1cm4gbnVtYmVyIG9mIGZyYW1lcyBhY3R1YWxseSBwcm9jZXNzZWQKKyAgICAgKi8KKyAgICBpbnQzMl90IG9uUHJvY2VzcyhpbnQ2NF90IGZyYW1lUG9zaXRpb24sIGludDMyX3QgbnVtRnJhbWVzKSBvdmVycmlkZSB7CisgICAgICAgICh2b2lkKSBmcmFtZVBvc2l0aW9uOworICAgICAgICAodm9pZCkgbnVtRnJhbWVzOworICAgICAgICByZXR1cm4gMDsKKyAgICB9OworCisgICAgdmlydHVhbCBpbnQzMl90IHJlYWQodm9pZCAqZGF0YSwgaW50MzJfdCBudW1GcmFtZXMpID0gMDsKKworcHJvdGVjdGVkOgorICAgIGludDMyX3QgcHVsbChpbnQzMl90IG51bUZyYW1lcyk7CisKK3ByaXZhdGU6CisgICAgaW50NjRfdCBtRnJhbWVQb3NpdGlvbiA9IDA7Cit9OworCit9IC8qIG5hbWVzcGFjZSBmbG93Z3JhcGggKi8KKworI2VuZGlmIC8qIEZMT1dHUkFQSF9BVURJT19QUk9DRVNTT1JfQkFTRV9IICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9DbGlwVG9SYW5nZS5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9DbGlwVG9SYW5nZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQ5YzIyYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL0NsaXBUb1JhbmdlLmNwcApAQCAtMCwwICsxLDQwIEBACisvKgorICogQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgIkF1ZGlvUHJvY2Vzc29yQmFzZS5oIgorI2luY2x1ZGUgIkNsaXBUb1JhbmdlLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBmbG93Z3JhcGg7CisKK0NsaXBUb1JhbmdlOjpDbGlwVG9SYW5nZShpbnQzMl90IGNoYW5uZWxDb3VudCkKKyAgICAgICAgOiBpbnB1dCgqdGhpcywgY2hhbm5lbENvdW50KQorICAgICAgICAsIG91dHB1dCgqdGhpcywgY2hhbm5lbENvdW50KSB7Cit9CisKK2ludDMyX3QgQ2xpcFRvUmFuZ2U6Om9uUHJvY2VzcyhpbnQ2NF90IGZyYW1lUG9zaXRpb24sIGludDMyX3QgbnVtRnJhbWVzKSB7CisgICAgaW50MzJfdCBmcmFtZXNUb1Byb2Nlc3MgPSBpbnB1dC5wdWxsRGF0YShmcmFtZVBvc2l0aW9uLCBudW1GcmFtZXMpOworICAgIGNvbnN0IGZsb2F0ICppbnB1dEJ1ZmZlciA9IGlucHV0LmdldEJsb2NrKCk7CisgICAgZmxvYXQgKm91dHB1dEJ1ZmZlciA9IG91dHB1dC5nZXRCbG9jaygpOworCisgICAgaW50MzJfdCBudW1TYW1wbGVzID0gZnJhbWVzVG9Qcm9jZXNzICogb3V0cHV0LmdldFNhbXBsZXNQZXJGcmFtZSgpOworICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG51bVNhbXBsZXM7IGkrKykgeworICAgICAgICAqb3V0cHV0QnVmZmVyKysgPSBzdGQ6Om1pbihtTWF4aW11bSwgc3RkOjptYXgobU1pbmltdW0sICppbnB1dEJ1ZmZlcisrKSk7CisgICAgfQorCisgICAgcmV0dXJuIGZyYW1lc1RvUHJvY2VzczsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL0NsaXBUb1JhbmdlLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9DbGlwVG9SYW5nZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllZWYyNTQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9DbGlwVG9SYW5nZS5oCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgRkxPV0dSQVBIX0NMSVBfVE9fUkFOR0VfSAorI2RlZmluZSBGTE9XR1JBUEhfQ0xJUF9UT19SQU5HRV9ICisKKyNpbmNsdWRlIDxhdG9taWM+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlICJBdWRpb1Byb2Nlc3NvckJhc2UuaCIKKworbmFtZXNwYWNlIGZsb3dncmFwaCB7CisKKy8vIFRoaXMgaXMgMyBkQiwgKDEwXigzLzIwKSksIHRvIG1hdGNoIHRoZSBtYXhpbXVtIGhlYWRyb29tIGluIEF1ZGlvVHJhY2sgZm9yIGZsb2F0IGRhdGEuCisvLyBJdCBpcyBkZXNpZ25lZCB0byBhbGxvdyBvY2Nhc2lvbmFsIHRyYW5zaWVudCBwZWFrcy4KK2NvbnN0ZXhwciBmbG9hdCBrRGVmYXVsdE1heEhlYWRyb29tID0gMS40MTI1Mzc1NGY7Citjb25zdGV4cHIgZmxvYXQga0RlZmF1bHRNaW5IZWFkcm9vbSA9IC1rRGVmYXVsdE1heEhlYWRyb29tOworCitjbGFzcyBDbGlwVG9SYW5nZSA6IHB1YmxpYyBBdWRpb1Byb2Nlc3NvckJhc2UgeworcHVibGljOgorICAgIGV4cGxpY2l0IENsaXBUb1JhbmdlKGludDMyX3QgY2hhbm5lbENvdW50KTsKKworICAgIHZpcnR1YWwgfkNsaXBUb1JhbmdlKCkgPSBkZWZhdWx0OworCisgICAgaW50MzJfdCBvblByb2Nlc3MoaW50NjRfdCBmcmFtZVBvc2l0aW9uLCBpbnQzMl90IG51bUZyYW1lcykgb3ZlcnJpZGU7CisKKyAgICB2b2lkIHNldE1pbmltdW0oZmxvYXQgbWluKSB7CisgICAgICAgIG1NaW5pbXVtID0gbWluOworICAgIH0KKworICAgIGZsb2F0IGdldE1pbmltdW0oKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtTWluaW11bTsKKyAgICB9CisKKyAgICB2b2lkIHNldE1heGltdW0oZmxvYXQgbWluKSB7CisgICAgICAgIG1NYXhpbXVtID0gbWluOworICAgIH0KKworICAgIGZsb2F0IGdldE1heGltdW0oKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtTWF4aW11bTsKKyAgICB9CisKKyAgICBBdWRpb0Zsb2F0SW5wdXRQb3J0IGlucHV0OworICAgIEF1ZGlvRmxvYXRPdXRwdXRQb3J0IG91dHB1dDsKKworcHJpdmF0ZToKKyAgICBmbG9hdCBtTWluaW11bSA9IGtEZWZhdWx0TWluSGVhZHJvb207CisgICAgZmxvYXQgbU1heGltdW0gPSBrRGVmYXVsdE1heEhlYWRyb29tOworfTsKKworfSAvKiBuYW1lc3BhY2UgZmxvd2dyYXBoICovCisKKyNlbmRpZiAvL0ZMT1dHUkFQSF9DTElQX1RPX1JBTkdFX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL01vbm9Ub011bHRpQ29udmVydGVyLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL01vbm9Ub011bHRpQ29udmVydGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGFhZDUyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvTW9ub1RvTXVsdGlDb252ZXJ0ZXIuY3BwCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgIkF1ZGlvUHJvY2Vzc29yQmFzZS5oIgorI2luY2x1ZGUgIk1vbm9Ub011bHRpQ29udmVydGVyLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBmbG93Z3JhcGg7CisKK01vbm9Ub011bHRpQ29udmVydGVyOjpNb25vVG9NdWx0aUNvbnZlcnRlcihpbnQzMl90IGNoYW5uZWxDb3VudCkKKyAgICAgICAgOiBpbnB1dCgqdGhpcywgMSkKKyAgICAgICAgLCBvdXRwdXQoKnRoaXMsIGNoYW5uZWxDb3VudCkgeworfQorCitNb25vVG9NdWx0aUNvbnZlcnRlcjo6fk1vbm9Ub011bHRpQ29udmVydGVyKCkgeyB9CisKK2ludDMyX3QgTW9ub1RvTXVsdGlDb252ZXJ0ZXI6Om9uUHJvY2VzcyhpbnQ2NF90IGZyYW1lUG9zaXRpb24sIGludDMyX3QgbnVtRnJhbWVzKSB7CisgICAgaW50MzJfdCBmcmFtZXNUb1Byb2Nlc3MgPSBpbnB1dC5wdWxsRGF0YShmcmFtZVBvc2l0aW9uLCBudW1GcmFtZXMpOworCisgICAgY29uc3QgZmxvYXQgKmlucHV0QnVmZmVyID0gaW5wdXQuZ2V0QmxvY2soKTsKKyAgICBmbG9hdCAqb3V0cHV0QnVmZmVyID0gb3V0cHV0LmdldEJsb2NrKCk7CisgICAgaW50MzJfdCBjaGFubmVsQ291bnQgPSBvdXRwdXQuZ2V0U2FtcGxlc1BlckZyYW1lKCk7CisgICAgLy8gVE9ETyBtYXliZSBtb3ZlIHRvIGF1ZGlvX3V0aWwgYXMgYXVkaW9fbW9ub190b19tdWx0aSgpCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFtZXNUb1Byb2Nlc3M7IGkrKykgeworICAgICAgICAvLyByZWFkIG9uZSwgd3JpdGUgbWFueQorICAgICAgICBmbG9hdCBzYW1wbGUgPSAqaW5wdXRCdWZmZXIrKzsKKyAgICAgICAgZm9yIChpbnQgY2hhbm5lbCA9IDA7IGNoYW5uZWwgPCBjaGFubmVsQ291bnQ7IGNoYW5uZWwrKykgeworICAgICAgICAgICAgKm91dHB1dEJ1ZmZlcisrID0gc2FtcGxlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmcmFtZXNUb1Byb2Nlc3M7Cit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL01vbm9Ub011bHRpQ29udmVydGVyLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Nb25vVG9NdWx0aUNvbnZlcnRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0ZDUzYzcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Nb25vVG9NdWx0aUNvbnZlcnRlci5oCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworI2lmbmRlZiBGTE9XR1JBUEhfTU9OT19UT19NVUxUSV9DT05WRVJURVJfSAorI2RlZmluZSBGTE9XR1JBUEhfTU9OT19UT19NVUxUSV9DT05WRVJURVJfSAorCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlICJBdWRpb1Byb2Nlc3NvckJhc2UuaCIKKworbmFtZXNwYWNlIGZsb3dncmFwaCB7CisKK2NsYXNzIE1vbm9Ub011bHRpQ29udmVydGVyIDogcHVibGljIEF1ZGlvUHJvY2Vzc29yQmFzZSB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgTW9ub1RvTXVsdGlDb252ZXJ0ZXIoaW50MzJfdCBjaGFubmVsQ291bnQpOworCisgICAgdmlydHVhbCB+TW9ub1RvTXVsdGlDb252ZXJ0ZXIoKTsKKworICAgIGludDMyX3Qgb25Qcm9jZXNzKGludDY0X3QgZnJhbWVQb3NpdGlvbiwgaW50MzJfdCBudW1GcmFtZXMpIG92ZXJyaWRlOworCisgICAgQXVkaW9GbG9hdElucHV0UG9ydCBpbnB1dDsKKyAgICBBdWRpb0Zsb2F0T3V0cHV0UG9ydCBvdXRwdXQ7Cit9OworCit9IC8qIG5hbWVzcGFjZSBmbG93Z3JhcGggKi8KKworI2VuZGlmIC8vRkxPV0dSQVBIX01PTk9fVE9fTVVMVElfQ09OVkVSVEVSX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1JhbXBMaW5lYXIuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvUmFtcExpbmVhci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI2MDgyOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1JhbXBMaW5lYXIuY3BwCkBAIC0wLDAgKzEsODUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiUmFtcExpbmVhciIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlICJBdWRpb1Byb2Nlc3NvckJhc2UuaCIKKyNpbmNsdWRlICJSYW1wTGluZWFyLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBmbG93Z3JhcGg7CisKK1JhbXBMaW5lYXI6OlJhbXBMaW5lYXIoaW50MzJfdCBjaGFubmVsQ291bnQpCisgICAgICAgIDogaW5wdXQoKnRoaXMsIGNoYW5uZWxDb3VudCkKKyAgICAgICAgLCBvdXRwdXQoKnRoaXMsIGNoYW5uZWxDb3VudCkgeworICAgIG1UYXJnZXQuc3RvcmUoMS4wZik7Cit9CisKK3ZvaWQgUmFtcExpbmVhcjo6c2V0TGVuZ3RoSW5GcmFtZXMoaW50MzJfdCBmcmFtZXMpIHsKKyAgICBtTGVuZ3RoSW5GcmFtZXMgPSBmcmFtZXM7Cit9CisKK3ZvaWQgUmFtcExpbmVhcjo6c2V0VGFyZ2V0KGZsb2F0IHRhcmdldCkgeworICAgIG1UYXJnZXQuc3RvcmUodGFyZ2V0KTsKK30KKworZmxvYXQgUmFtcExpbmVhcjo6aW50ZXJwb2xhdGVDdXJyZW50KCkgeworICAgIHJldHVybiBtTGV2ZWxUbyAtIChtUmVtYWluaW5nICogbVNjYWxlcik7Cit9CisKK2ludDMyX3QgUmFtcExpbmVhcjo6b25Qcm9jZXNzKGludDY0X3QgZnJhbWVQb3NpdGlvbiwgaW50MzJfdCBudW1GcmFtZXMpIHsKKyAgICBpbnQzMl90IGZyYW1lc1RvUHJvY2VzcyA9IGlucHV0LnB1bGxEYXRhKGZyYW1lUG9zaXRpb24sIG51bUZyYW1lcyk7CisgICAgY29uc3QgZmxvYXQgKmlucHV0QnVmZmVyID0gaW5wdXQuZ2V0QmxvY2soKTsKKyAgICBmbG9hdCAqb3V0cHV0QnVmZmVyID0gb3V0cHV0LmdldEJsb2NrKCk7CisgICAgaW50MzJfdCBjaGFubmVsQ291bnQgPSBvdXRwdXQuZ2V0U2FtcGxlc1BlckZyYW1lKCk7CisKKyAgICBmbG9hdCB0YXJnZXQgPSBnZXRUYXJnZXQoKTsKKyAgICBpZiAodGFyZ2V0ICE9IG1MZXZlbFRvKSB7CisgICAgICAgIC8vIFN0YXJ0IG5ldyByYW1wLiBDb250aW51ZSBmcm9tIHByZXZpb3VzIGxldmVsLgorICAgICAgICBtTGV2ZWxGcm9tID0gaW50ZXJwb2xhdGVDdXJyZW50KCk7CisgICAgICAgIG1MZXZlbFRvID0gdGFyZ2V0OworICAgICAgICBtUmVtYWluaW5nID0gbUxlbmd0aEluRnJhbWVzOworICAgICAgICBBTE9HVigiJXMoKSBtTGV2ZWxGcm9tID0gJWYsIG1MZXZlbFRvID0gJWYsIG1SZW1haW5pbmcgPSAlZCwgbVNjYWxlciA9ICVmIiwKKyAgICAgICAgICAgICAgX19mdW5jX18sIG1MZXZlbEZyb20sIG1MZXZlbFRvLCBtUmVtYWluaW5nLCBtU2NhbGVyKTsKKyAgICAgICAgbVNjYWxlciA9IChtTGV2ZWxUbyAtIG1MZXZlbEZyb20pIC8gbUxlbmd0aEluRnJhbWVzOyAvLyBmb3IgaW50ZXJwb2xhdGlvbgorICAgIH0KKworICAgIGludDMyX3QgZnJhbWVzTGVmdCA9IGZyYW1lc1RvUHJvY2VzczsKKworICAgIGlmIChtUmVtYWluaW5nID4gMCkgeyAvLyBSYW1waW5nPyBUaGlzIGRvZXNuJ3QgaGFwcGVuIHZlcnkgb2Z0ZW4uCisgICAgICAgIGludDMyX3QgZnJhbWVzVG9SYW1wID0gc3RkOjptaW4oZnJhbWVzTGVmdCwgbVJlbWFpbmluZyk7CisgICAgICAgIGZyYW1lc0xlZnQgLT0gZnJhbWVzVG9SYW1wOworICAgICAgICB3aGlsZSAoZnJhbWVzVG9SYW1wID4gMCkgeworICAgICAgICAgICAgZmxvYXQgY3VycmVudExldmVsID0gaW50ZXJwb2xhdGVDdXJyZW50KCk7CisgICAgICAgICAgICBmb3IgKGludCBjaCA9IDA7IGNoIDwgY2hhbm5lbENvdW50OyBjaCsrKSB7CisgICAgICAgICAgICAgICAgKm91dHB1dEJ1ZmZlcisrID0gKmlucHV0QnVmZmVyKysgKiBjdXJyZW50TGV2ZWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtUmVtYWluaW5nLS07CisgICAgICAgICAgICBmcmFtZXNUb1JhbXAtLTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFByb2Nlc3MgYW55IGZyYW1lcyBhZnRlciB0aGUgcmFtcC4KKyAgICBpbnQzMl90IHNhbXBsZXNMZWZ0ID0gZnJhbWVzTGVmdCAqIGNoYW5uZWxDb3VudDsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHNhbXBsZXNMZWZ0OyBpKyspIHsKKyAgICAgICAgKm91dHB1dEJ1ZmZlcisrID0gKmlucHV0QnVmZmVyKysgKiBtTGV2ZWxUbzsKKyAgICB9CisKKyAgICByZXR1cm4gZnJhbWVzVG9Qcm9jZXNzOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvUmFtcExpbmVhci5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvUmFtcExpbmVhci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkYzhmNDEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9SYW1wTGluZWFyLmgKQEAgLTAsMCArMSw4NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBGTE9XR1JBUEhfUkFNUF9MSU5FQVJfSAorI2RlZmluZSBGTE9XR1JBUEhfUkFNUF9MSU5FQVJfSAorCisjaW5jbHVkZSA8YXRvbWljPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSAiQXVkaW9Qcm9jZXNzb3JCYXNlLmgiCisKK25hbWVzcGFjZSBmbG93Z3JhcGggeworCitjbGFzcyBSYW1wTGluZWFyIDogcHVibGljIEF1ZGlvUHJvY2Vzc29yQmFzZSB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgUmFtcExpbmVhcihpbnQzMl90IGNoYW5uZWxDb3VudCk7CisKKyAgICB2aXJ0dWFsIH5SYW1wTGluZWFyKCkgPSBkZWZhdWx0OworCisgICAgaW50MzJfdCBvblByb2Nlc3MoaW50NjRfdCBmcmFtZVBvc2l0aW9uLCBpbnQzMl90IG51bUZyYW1lcykgb3ZlcnJpZGU7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGlzIHVzZWQgZm9yIHRoZSBuZXh0IHJhbXAuCisgICAgICogQ2FsbGluZyB0aGlzIGRvZXMgbm90IGFmZmVjdCBhIHJhbXAgdGhhdCBpcyBpbiBwcm9ncmVzcy4KKyAgICAgKi8KKyAgICB2b2lkIHNldExlbmd0aEluRnJhbWVzKGludDMyX3QgZnJhbWVzKTsKKworICAgIGludDMyX3QgZ2V0TGVuZ3RoSW5GcmFtZXMoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtTGVuZ3RoSW5GcmFtZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBtYXkgYmUgc2FmZWx5IGNhbGxlZCBieSBhbm90aGVyIHRocmVhZC4KKyAgICAgKiBAcGFyYW0gdGFyZ2V0CisgICAgICovCisgICAgdm9pZCBzZXRUYXJnZXQoZmxvYXQgdGFyZ2V0KTsKKworICAgIGZsb2F0IGdldFRhcmdldCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1UYXJnZXQubG9hZCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZvcmNlIHRoZSBuZXh0U2VnbWVudCB0byBzdGFydCBmcm9tIHRoaXMgbGV2ZWwuCisgICAgICoKKyAgICAgKiBXQVJOSU5HOiB0aGlzIGNhbiBjYXVzZSBhIGRpc2NvbnRpbnVpdHkgaWYgY2FsbGVkIHdoaWxlIHRoZSByYW1wIGlzIGJlaW5nIHVzZWQuCisgICAgICogT25seSBjYWxsIHRoaXMgd2hlbiBzZXR0aW5nIHRoZSBpbml0aWFsIHJhbXAuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGV2ZWwKKyAgICAgKi8KKyAgICB2b2lkIGZvcmNlQ3VycmVudChmbG9hdCBsZXZlbCkgeworICAgICAgICBtTGV2ZWxGcm9tID0gbGV2ZWw7CisgICAgICAgIG1MZXZlbFRvID0gbGV2ZWw7CisgICAgfQorCisgICAgQXVkaW9GbG9hdElucHV0UG9ydCBpbnB1dDsKKyAgICBBdWRpb0Zsb2F0T3V0cHV0UG9ydCBvdXRwdXQ7CisKK3ByaXZhdGU6CisKKyAgICBmbG9hdCBpbnRlcnBvbGF0ZUN1cnJlbnQoKTsKKworICAgIHN0ZDo6YXRvbWljPGZsb2F0PiAgbVRhcmdldDsKKworICAgIGludDMyX3QgICAgICAgICAgICAgbUxlbmd0aEluRnJhbWVzICA9IDQ4MDAwLjBmIC8gMTAwLjBmIDsgLy8gMTAgbXNlYyBhdCA0ODAwMCBIejsKKyAgICBpbnQzMl90ICAgICAgICAgICAgIG1SZW1haW5pbmcgICAgICAgPSAwOworICAgIGZsb2F0ICAgICAgICAgICAgICAgbVNjYWxlciAgICAgICAgICA9IDAuMGY7CisgICAgZmxvYXQgICAgICAgICAgICAgICBtTGV2ZWxGcm9tICAgICAgID0gMC4wZjsKKyAgICBmbG9hdCAgICAgICAgICAgICAgIG1MZXZlbFRvICAgICAgICAgPSAwLjBmOworfTsKKworfSAvKiBuYW1lc3BhY2UgZmxvd2dyYXBoICovCisKKyNlbmRpZiAvL0ZMT1dHUkFQSF9SQU1QX0xJTkVBUl9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9TaW5rRmxvYXQuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU2lua0Zsb2F0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjNkY2JjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU2lua0Zsb2F0LmNwcApAQCAtMCwwICsxLDQ2IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgIkF1ZGlvUHJvY2Vzc29yQmFzZS5oIgorI2luY2x1ZGUgIlNpbmtGbG9hdC5oIgorCit1c2luZyBuYW1lc3BhY2UgZmxvd2dyYXBoOworCitTaW5rRmxvYXQ6OlNpbmtGbG9hdChpbnQzMl90IGNoYW5uZWxDb3VudCkKKyAgICAgICAgOiBBdWRpb1NpbmsoY2hhbm5lbENvdW50KSB7Cit9CisKK2ludDMyX3QgU2lua0Zsb2F0OjpyZWFkKHZvaWQgKmRhdGEsIGludDMyX3QgbnVtRnJhbWVzKSB7CisgICAgZmxvYXQgKmZsb2F0RGF0YSA9IChmbG9hdCAqKSBkYXRhOworICAgIGludDMyX3QgY2hhbm5lbENvdW50ID0gaW5wdXQuZ2V0U2FtcGxlc1BlckZyYW1lKCk7CisKKyAgICBpbnQzMl90IGZyYW1lc0xlZnQgPSBudW1GcmFtZXM7CisgICAgd2hpbGUgKGZyYW1lc0xlZnQgPiAwKSB7CisgICAgICAgIC8vIFJ1biB0aGUgZ3JhcGggYW5kIHB1bGwgZGF0YSB0aHJvdWdoIHRoZSBpbnB1dCBwb3J0LgorICAgICAgICBpbnQzMl90IGZyYW1lc1JlYWQgPSBwdWxsKGZyYW1lc0xlZnQpOworICAgICAgICBpZiAoZnJhbWVzUmVhZCA8PSAwKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjb25zdCBmbG9hdCAqc2lnbmFsID0gaW5wdXQuZ2V0QmxvY2soKTsKKyAgICAgICAgaW50MzJfdCBudW1TYW1wbGVzID0gZnJhbWVzUmVhZCAqIGNoYW5uZWxDb3VudDsKKyAgICAgICAgbWVtY3B5KGZsb2F0RGF0YSwgc2lnbmFsLCBudW1TYW1wbGVzICogc2l6ZW9mKGZsb2F0KSk7CisgICAgICAgIGZsb2F0RGF0YSArPSBudW1TYW1wbGVzOworICAgICAgICBmcmFtZXNMZWZ0IC09IGZyYW1lc1JlYWQ7CisgICAgfQorICAgIHJldHVybiBudW1GcmFtZXMgLSBmcmFtZXNMZWZ0OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU2lua0Zsb2F0LmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9TaW5rRmxvYXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Nzc1YzA4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU2lua0Zsb2F0LmgKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCisjaWZuZGVmIEZMT1dHUkFQSF9TSU5LX0ZMT0FUX0gKKyNkZWZpbmUgRkxPV0dSQVBIX1NJTktfRkxPQVRfSAorCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlICJBdWRpb1Byb2Nlc3NvckJhc2UuaCIKKworbmFtZXNwYWNlIGZsb3dncmFwaCB7CisKK2NsYXNzIFNpbmtGbG9hdCA6IHB1YmxpYyBBdWRpb1NpbmsgeworcHVibGljOgorICAgIGV4cGxpY2l0IFNpbmtGbG9hdChpbnQzMl90IGNoYW5uZWxDb3VudCk7CisKKyAgICBpbnQzMl90IHJlYWQodm9pZCAqZGF0YSwgaW50MzJfdCBudW1GcmFtZXMpIG92ZXJyaWRlOworCit9OworCit9IC8qIG5hbWVzcGFjZSBmbG93Z3JhcGggKi8KKworI2VuZGlmIC8vRkxPV0dSQVBIX1NJTktfRkxPQVRfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU2lua0kxNi5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9TaW5rSTE2LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmVjOGY1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU2lua0kxNi5jcHAKQEAgLTAsMCArMSw1OCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2lmZGVmIF9fQU5EUk9JRF9fCisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvcHJpbWl0aXZlcy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJBdWRpb1Byb2Nlc3NvckJhc2UuaCIKKyNpbmNsdWRlICJTaW5rSTE2LmgiCisKK3VzaW5nIG5hbWVzcGFjZSBmbG93Z3JhcGg7CisKK1NpbmtJMTY6OlNpbmtJMTYoaW50MzJfdCBjaGFubmVsQ291bnQpCisgICAgICAgIDogQXVkaW9TaW5rKGNoYW5uZWxDb3VudCkge30KKworaW50MzJfdCBTaW5rSTE2OjpyZWFkKHZvaWQgKmRhdGEsIGludDMyX3QgbnVtRnJhbWVzKSB7CisgICAgaW50MTZfdCAqc2hvcnREYXRhID0gKGludDE2X3QgKikgZGF0YTsKKyAgICBjb25zdCBpbnQzMl90IGNoYW5uZWxDb3VudCA9IGlucHV0LmdldFNhbXBsZXNQZXJGcmFtZSgpOworCisgICAgaW50MzJfdCBmcmFtZXNMZWZ0ID0gbnVtRnJhbWVzOworICAgIHdoaWxlIChmcmFtZXNMZWZ0ID4gMCkgeworICAgICAgICAvLyBSdW4gdGhlIGdyYXBoIGFuZCBwdWxsIGRhdGEgdGhyb3VnaCB0aGUgaW5wdXQgcG9ydC4KKyAgICAgICAgaW50MzJfdCBmcmFtZXNSZWFkID0gcHVsbChmcmFtZXNMZWZ0KTsKKyAgICAgICAgaWYgKGZyYW1lc1JlYWQgPD0gMCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY29uc3QgZmxvYXQgKnNpZ25hbCA9IGlucHV0LmdldEJsb2NrKCk7CisgICAgICAgIGludDMyX3QgbnVtU2FtcGxlcyA9IGZyYW1lc1JlYWQgKiBjaGFubmVsQ291bnQ7CisjaWZkZWYgX19BTkRST0lEX18KKyAgICAgICAgbWVtY3B5X3RvX2kxNl9mcm9tX2Zsb2F0KHNob3J0RGF0YSwgc2lnbmFsLCBudW1TYW1wbGVzKTsKKyAgICAgICAgc2hvcnREYXRhICs9IG51bVNhbXBsZXM7CisgICAgICAgIHNpZ25hbCArPSBudW1TYW1wbGVzOworI2Vsc2UKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1TYW1wbGVzOyBpKyspIHsKKyAgICAgICAgICAgIGludDMyX3QgbiA9IChpbnQzMl90KSAoKnNpZ25hbCsrICogMzI3NjguMGYpOworICAgICAgICAgICAgKnNob3J0RGF0YSsrID0gc3RkOjptaW4oSU5UMTZfTUFYLCBzdGQ6Om1heChJTlQxNl9NSU4sIG4pKTsgLy8gY2xpcAorICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgZnJhbWVzTGVmdCAtPSBmcmFtZXNSZWFkOworICAgIH0KKyAgICByZXR1cm4gbnVtRnJhbWVzIC0gZnJhbWVzTGVmdDsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NpbmtJMTYuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NpbmtJMTYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDg2MjY2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU2lua0kxNi5oCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgRkxPV0dSQVBIX1NJTktfSTE2X0gKKyNkZWZpbmUgRkxPV0dSQVBIX1NJTktfSTE2X0gKKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSAiQXVkaW9Qcm9jZXNzb3JCYXNlLmgiCisKK25hbWVzcGFjZSBmbG93Z3JhcGggeworCitjbGFzcyBTaW5rSTE2IDogcHVibGljIEF1ZGlvU2luayB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgU2lua0kxNihpbnQzMl90IGNoYW5uZWxDb3VudCk7CisKKyAgICBpbnQzMl90IHJlYWQodm9pZCAqZGF0YSwgaW50MzJfdCBudW1GcmFtZXMpIG92ZXJyaWRlOworfTsKKworfSAvKiBuYW1lc3BhY2UgZmxvd2dyYXBoICovCisKKyNlbmRpZiAvL0ZMT1dHUkFQSF9TSU5LX0kxNl9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9TaW5rSTI0LmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NpbmtJMjQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1OTI4MjgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9TaW5rSTI0LmNwcApAQCAtMCwwICsxLDY2IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaWZkZWYgX19BTkRST0lEX18KKyNpbmNsdWRlIDxhdWRpb191dGlscy9wcmltaXRpdmVzLmg+CisjZW5kaWYKKworI2luY2x1ZGUgIkF1ZGlvUHJvY2Vzc29yQmFzZS5oIgorI2luY2x1ZGUgIlNpbmtJMjQuaCIKKwordXNpbmcgbmFtZXNwYWNlIGZsb3dncmFwaDsKKworCitTaW5rSTI0OjpTaW5rSTI0KGludDMyX3QgY2hhbm5lbENvdW50KQorICAgICAgICA6IEF1ZGlvU2luayhjaGFubmVsQ291bnQpIHt9CisKK2ludDMyX3QgU2lua0kyNDo6cmVhZCh2b2lkICpkYXRhLCBpbnQzMl90IG51bUZyYW1lcykgeworICAgIHVpbnQ4X3QgKmJ5dGVEYXRhID0gKHVpbnQ4X3QgKikgZGF0YTsKKyAgICBjb25zdCBpbnQzMl90IGNoYW5uZWxDb3VudCA9IGlucHV0LmdldFNhbXBsZXNQZXJGcmFtZSgpOworCisgICAgaW50MzJfdCBmcmFtZXNMZWZ0ID0gbnVtRnJhbWVzOworICAgIHdoaWxlIChmcmFtZXNMZWZ0ID4gMCkgeworICAgICAgICAvLyBSdW4gdGhlIGdyYXBoIGFuZCBwdWxsIGRhdGEgdGhyb3VnaCB0aGUgaW5wdXQgcG9ydC4KKyAgICAgICAgaW50MzJfdCBmcmFtZXNSZWFkID0gcHVsbChmcmFtZXNMZWZ0KTsKKyAgICAgICAgaWYgKGZyYW1lc1JlYWQgPD0gMCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY29uc3QgZmxvYXQgKmZsb2F0RGF0YSA9IGlucHV0LmdldEJsb2NrKCk7CisgICAgICAgIGludDMyX3QgbnVtU2FtcGxlcyA9IGZyYW1lc1JlYWQgKiBjaGFubmVsQ291bnQ7CisjaWZkZWYgX19BTkRST0lEX18KKyAgICAgICAgbWVtY3B5X3RvX3AyNF9mcm9tX2Zsb2F0KGJ5dGVEYXRhLCBmbG9hdERhdGEsIG51bVNhbXBsZXMpOworICAgICAgICBzdGF0aWMgY29uc3QgaW50IGtCeXRlc1BlckkyNFBhY2tlZCA9IDM7CisgICAgICAgIGJ5dGVEYXRhICs9IG51bVNhbXBsZXMgKiBrQnl0ZXNQZXJJMjRQYWNrZWQ7CisgICAgICAgIGZsb2F0RGF0YSArPSBudW1TYW1wbGVzOworI2Vsc2UKKyAgICAgICAgY29uc3QgaW50MzJfdCBrSTI0UGFja2VkTWF4ID0gMHgwMDdGRkZGRjsKKyAgICAgICAgY29uc3QgaW50MzJfdCBrSTI0UGFja2VkTWluID0gMHhGRjgwMDAwMDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1TYW1wbGVzOyBpKyspIHsKKyAgICAgICAgICAgIGludDMyX3QgbiA9IChpbnQzMl90KSAoKmZsb2F0RGF0YSsrICogMHgwMDgwMDAwMCk7CisgICAgICAgICAgICBuID0gc3RkOjptaW4oa0kyNFBhY2tlZE1heCwgc3RkOjptYXgoa0kyNFBhY2tlZE1pbiwgbikpOyAvLyBjbGlwCisgICAgICAgICAgICAvLyBXcml0ZSBhcyBhIHBhY2tlZCAyNC1iaXQgaW50ZWdlciBpbiBMaXR0bGUgRW5kaWFuIGZvcm1hdC4KKyAgICAgICAgICAgICpieXRlRGF0YSsrID0gKHVpbnQ4X3QpIG47CisgICAgICAgICAgICAqYnl0ZURhdGErKyA9ICh1aW50OF90KSAobiA+PiA4KTsKKyAgICAgICAgICAgICpieXRlRGF0YSsrID0gKHVpbnQ4X3QpIChuID4+IDE2KTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIGZyYW1lc0xlZnQgLT0gZnJhbWVzUmVhZDsKKyAgICB9CisgICAgcmV0dXJuIG51bUZyYW1lcyAtIGZyYW1lc0xlZnQ7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9TaW5rSTI0LmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9TaW5rSTI0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI5YjUwNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NpbmtJMjQuaApAQCAtMCwwICsxLDM2IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEZMT1dHUkFQSF9TSU5LX0kyNF9ICisjZGVmaW5lIEZMT1dHUkFQSF9TSU5LX0kyNF9ICisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgIkF1ZGlvUHJvY2Vzc29yQmFzZS5oIgorCituYW1lc3BhY2UgZmxvd2dyYXBoIHsKKworY2xhc3MgU2lua0kyNCA6IHB1YmxpYyBBdWRpb1NpbmsgeworcHVibGljOgorICAgIGV4cGxpY2l0IFNpbmtJMjQoaW50MzJfdCBjaGFubmVsQ291bnQpOworCisgICAgaW50MzJfdCByZWFkKHZvaWQgKmRhdGEsIGludDMyX3QgbnVtRnJhbWVzKSBvdmVycmlkZTsKK307CisKK30gLyogbmFtZXNwYWNlIGZsb3dncmFwaCAqLworCisjZW5kaWYgLy9GTE9XR1JBUEhfU0lOS19JMjRfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU291cmNlRmxvYXQuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU291cmNlRmxvYXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiYjY3NGYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Tb3VyY2VGbG9hdC5jcHAKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlICJBdWRpb1Byb2Nlc3NvckJhc2UuaCIKKyNpbmNsdWRlICJTb3VyY2VGbG9hdC5oIgorCit1c2luZyBuYW1lc3BhY2UgZmxvd2dyYXBoOworCitTb3VyY2VGbG9hdDo6U291cmNlRmxvYXQoaW50MzJfdCBjaGFubmVsQ291bnQpCisgICAgICAgIDogQXVkaW9Tb3VyY2UoY2hhbm5lbENvdW50KSB7Cit9CisKK2ludDMyX3QgU291cmNlRmxvYXQ6Om9uUHJvY2VzcyhpbnQ2NF90IGZyYW1lUG9zaXRpb24sIGludDMyX3QgbnVtRnJhbWVzKSB7CisKKyAgICBmbG9hdCAqb3V0cHV0QnVmZmVyID0gb3V0cHV0LmdldEJsb2NrKCk7CisgICAgaW50MzJfdCBjaGFubmVsQ291bnQgPSBvdXRwdXQuZ2V0U2FtcGxlc1BlckZyYW1lKCk7CisKKyAgICBpbnQzMl90IGZyYW1lc0xlZnQgPSBtU2l6ZUluRnJhbWVzIC0gbUZyYW1lSW5kZXg7CisgICAgaW50MzJfdCBmcmFtZXNUb1Byb2Nlc3MgPSBzdGQ6Om1pbihudW1GcmFtZXMsIGZyYW1lc0xlZnQpOworICAgIGludDMyX3QgbnVtU2FtcGxlcyA9IGZyYW1lc1RvUHJvY2VzcyAqIGNoYW5uZWxDb3VudDsKKworICAgIGNvbnN0IGZsb2F0ICpmbG9hdEJhc2UgPSAoZmxvYXQgKikgbURhdGE7CisgICAgY29uc3QgZmxvYXQgKmZsb2F0RGF0YSA9ICZmbG9hdEJhc2VbbUZyYW1lSW5kZXggKiBjaGFubmVsQ291bnRdOworICAgIG1lbWNweShvdXRwdXRCdWZmZXIsIGZsb2F0RGF0YSwgbnVtU2FtcGxlcyAqIHNpemVvZihmbG9hdCkpOworICAgIG1GcmFtZUluZGV4ICs9IGZyYW1lc1RvUHJvY2VzczsKKyAgICByZXR1cm4gZnJhbWVzVG9Qcm9jZXNzOworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Tb3VyY2VGbG9hdC5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU291cmNlRmxvYXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmVlZDlmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU291cmNlRmxvYXQuaApAQCAtMCwwICsxLDM2IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEZMT1dHUkFQSF9TT1VSQ0VfRkxPQVRfSAorI2RlZmluZSBGTE9XR1JBUEhfU09VUkNFX0ZMT0FUX0gKKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSAiQXVkaW9Qcm9jZXNzb3JCYXNlLmgiCisKK25hbWVzcGFjZSBmbG93Z3JhcGggeworCitjbGFzcyBTb3VyY2VGbG9hdCA6IHB1YmxpYyBBdWRpb1NvdXJjZSB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgU291cmNlRmxvYXQoaW50MzJfdCBjaGFubmVsQ291bnQpOworCisgICAgaW50MzJfdCBvblByb2Nlc3MoaW50NjRfdCBmcmFtZVBvc2l0aW9uLCBpbnQzMl90IG51bUZyYW1lcykgb3ZlcnJpZGU7Cit9OworCit9IC8qIG5hbWVzcGFjZSBmbG93Z3JhcGggKi8KKworI2VuZGlmIC8vRkxPV0dSQVBIX1NPVVJDRV9GTE9BVF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Tb3VyY2VJMTYuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU291cmNlSTE2LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2ZjZWMyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU291cmNlSTE2LmNwcApAQCAtMCwwICsxLDU0IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaWZkZWYgX19BTkRST0lEX18KKyNpbmNsdWRlIDxhdWRpb191dGlscy9wcmltaXRpdmVzLmg+CisjZW5kaWYKKworI2luY2x1ZGUgIkF1ZGlvUHJvY2Vzc29yQmFzZS5oIgorI2luY2x1ZGUgIlNvdXJjZUkxNi5oIgorCit1c2luZyBuYW1lc3BhY2UgZmxvd2dyYXBoOworCitTb3VyY2VJMTY6OlNvdXJjZUkxNihpbnQzMl90IGNoYW5uZWxDb3VudCkKKyAgICAgICAgOiBBdWRpb1NvdXJjZShjaGFubmVsQ291bnQpIHsKK30KKworaW50MzJfdCBTb3VyY2VJMTY6Om9uUHJvY2VzcyhpbnQ2NF90IGZyYW1lUG9zaXRpb24sIGludDMyX3QgbnVtRnJhbWVzKSB7CisgICAgZmxvYXQgKmZsb2F0RGF0YSA9IG91dHB1dC5nZXRCbG9jaygpOworICAgIGludDMyX3QgY2hhbm5lbENvdW50ID0gb3V0cHV0LmdldFNhbXBsZXNQZXJGcmFtZSgpOworCisgICAgaW50MzJfdCBmcmFtZXNMZWZ0ID0gbVNpemVJbkZyYW1lcyAtIG1GcmFtZUluZGV4OworICAgIGludDMyX3QgZnJhbWVzVG9Qcm9jZXNzID0gc3RkOjptaW4obnVtRnJhbWVzLCBmcmFtZXNMZWZ0KTsKKyAgICBpbnQzMl90IG51bVNhbXBsZXMgPSBmcmFtZXNUb1Byb2Nlc3MgKiBjaGFubmVsQ291bnQ7CisKKyAgICBjb25zdCBpbnQxNl90ICpzaG9ydEJhc2UgPSBzdGF0aWNfY2FzdDxjb25zdCBpbnQxNl90ICo+KG1EYXRhKTsKKyAgICBjb25zdCBpbnQxNl90ICpzaG9ydERhdGEgPSAmc2hvcnRCYXNlW21GcmFtZUluZGV4ICogY2hhbm5lbENvdW50XTsKKworI2lmZGVmIF9fQU5EUk9JRF9fCisgICAgbWVtY3B5X3RvX2Zsb2F0X2Zyb21faTE2KGZsb2F0RGF0YSwgc2hvcnREYXRhLCBudW1TYW1wbGVzKTsKKyNlbHNlCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1TYW1wbGVzOyBpKyspIHsKKyAgICAgICAgKmZsb2F0RGF0YSsrID0gKnNob3J0RGF0YSsrICogKDEuMGYgLyAzMjc2OCk7CisgICAgfQorI2VuZGlmCisKKyAgICBtRnJhbWVJbmRleCArPSBmcmFtZXNUb1Byb2Nlc3M7CisgICAgcmV0dXJuIGZyYW1lc1RvUHJvY2VzczsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Tb3VyY2VJMTYuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NvdXJjZUkxNi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiMTE2Y2YKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Tb3VyY2VJMTYuaApAQCAtMCwwICsxLDM2IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEZMT1dHUkFQSF9TT1VSQ0VfSTE2X0gKKyNkZWZpbmUgRkxPV0dSQVBIX1NPVVJDRV9JMTZfSAorCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlICJBdWRpb1Byb2Nlc3NvckJhc2UuaCIKKworbmFtZXNwYWNlIGZsb3dncmFwaCB7CisKK2NsYXNzIFNvdXJjZUkxNiA6IHB1YmxpYyBBdWRpb1NvdXJjZSB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgU291cmNlSTE2KGludDMyX3QgY2hhbm5lbENvdW50KTsKKworICAgIGludDMyX3Qgb25Qcm9jZXNzKGludDY0X3QgZnJhbWVQb3NpdGlvbiwgaW50MzJfdCBudW1GcmFtZXMpIG92ZXJyaWRlOworfTsKKworfSAvKiBuYW1lc3BhY2UgZmxvd2dyYXBoICovCisKKyNlbmRpZiAvL0ZMT1dHUkFQSF9TT1VSQ0VfSTE2X0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NvdXJjZUkyNC5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Tb3VyY2VJMjQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzMTk4ODAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Tb3VyY2VJMjQuY3BwCkBAIC0wLDAgKzEsNjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpZmRlZiBfX0FORFJPSURfXworI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3ByaW1pdGl2ZXMuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiQXVkaW9Qcm9jZXNzb3JCYXNlLmgiCisjaW5jbHVkZSAiU291cmNlSTI0LmgiCisKK3VzaW5nIG5hbWVzcGFjZSBmbG93Z3JhcGg7CisKK2NvbnN0ZXhwciBpbnQga0J5dGVzUGVySTI0UGFja2VkID0gMzsKKworU291cmNlSTI0OjpTb3VyY2VJMjQoaW50MzJfdCBjaGFubmVsQ291bnQpCisgICAgICAgIDogQXVkaW9Tb3VyY2UoY2hhbm5lbENvdW50KSB7Cit9CisKK2ludDMyX3QgU291cmNlSTI0OjpvblByb2Nlc3MoaW50NjRfdCBmcmFtZVBvc2l0aW9uLCBpbnQzMl90IG51bUZyYW1lcykgeworICAgIGZsb2F0ICpmbG9hdERhdGEgPSBvdXRwdXQuZ2V0QmxvY2soKTsKKyAgICBpbnQzMl90IGNoYW5uZWxDb3VudCA9IG91dHB1dC5nZXRTYW1wbGVzUGVyRnJhbWUoKTsKKworICAgIGludDMyX3QgZnJhbWVzTGVmdCA9IG1TaXplSW5GcmFtZXMgLSBtRnJhbWVJbmRleDsKKyAgICBpbnQzMl90IGZyYW1lc1RvUHJvY2VzcyA9IHN0ZDo6bWluKG51bUZyYW1lcywgZnJhbWVzTGVmdCk7CisgICAgaW50MzJfdCBudW1TYW1wbGVzID0gZnJhbWVzVG9Qcm9jZXNzICogY2hhbm5lbENvdW50OworCisgICAgY29uc3QgdWludDhfdCAqYnl0ZUJhc2UgPSAodWludDhfdCAqKSBtRGF0YTsKKyAgICBjb25zdCB1aW50OF90ICpieXRlRGF0YSA9ICZieXRlQmFzZVttRnJhbWVJbmRleCAqIGNoYW5uZWxDb3VudCAqIGtCeXRlc1BlckkyNFBhY2tlZF07CisKKyNpZmRlZiBfX0FORFJPSURfXworICAgIG1lbWNweV90b19mbG9hdF9mcm9tX3AyNChmbG9hdERhdGEsIGJ5dGVEYXRhLCBudW1TYW1wbGVzKTsKKyNlbHNlCisgICAgc3RhdGljIGNvbnN0IGZsb2F0IHNjYWxlID0gMS4gLyAoZmxvYXQpKDFVTCA8PCAzMSk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1TYW1wbGVzOyBpKyspIHsKKyAgICAgICAgLy8gQXNzZW1ibGUgdGhlIGRhdGEgYXNzdW1pbmcgTGl0dGxlIEVuZGlhbiBmb3JtYXQuCisgICAgICAgIGludDMyX3QgcGFkID0gYnl0ZURhdGFbMl07CisgICAgICAgIHBhZCA8PD0gODsKKyAgICAgICAgcGFkIHw9IGJ5dGVEYXRhWzFdOworICAgICAgICBwYWQgPDw9IDg7CisgICAgICAgIHBhZCB8PSBieXRlRGF0YVswXTsKKyAgICAgICAgcGFkIDw8PSA4OyAvLyBTaGlmdCB0byAzMiBiaXQgZGF0YSBzbyB0aGUgc2lnbiBpcyBjb3JyZWN0LgorICAgICAgICBieXRlRGF0YSArPSBrQnl0ZXNQZXJJMjRQYWNrZWQ7CisgICAgICAgICpmbG9hdERhdGErKyA9IHBhZCAqIHNjYWxlOyAvLyBzY2FsZSB0byByYW5nZSAtMS4wIHRvIDEuMAorICAgIH0KKyNlbmRpZgorCisgICAgbUZyYW1lSW5kZXggKz0gZnJhbWVzVG9Qcm9jZXNzOworICAgIHJldHVybiBmcmFtZXNUb1Byb2Nlc3M7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU291cmNlSTI0LmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Tb3VyY2VJMjQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWYxNGRhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU291cmNlSTI0LmgKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBGTE9XR1JBUEhfU09VUkNFX0kyNF9ICisjZGVmaW5lIEZMT1dHUkFQSF9TT1VSQ0VfSTI0X0gKKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSAiQXVkaW9Qcm9jZXNzb3JCYXNlLmgiCisKK25hbWVzcGFjZSBmbG93Z3JhcGggeworCitjbGFzcyBTb3VyY2VJMjQgOiBwdWJsaWMgQXVkaW9Tb3VyY2UgeworcHVibGljOgorICAgIGV4cGxpY2l0IFNvdXJjZUkyNChpbnQzMl90IGNoYW5uZWxDb3VudCk7CisKKyAgICBpbnQzMl90IG9uUHJvY2VzcyhpbnQ2NF90IGZyYW1lUG9zaXRpb24sIGludDMyX3QgbnVtRnJhbWVzKSBvdmVycmlkZTsKK307CisKK30gLyogbmFtZXNwYWNlIGZsb3dncmFwaCAqLworCisjZW5kaWYgLy9GTE9XR1JBUEhfU09VUkNFX0kyNF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbUxlZ2FjeS5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1MZWdhY3kuaAppbmRleCA0OTRlZGJjLi44ZTc4NTU0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbUxlZ2FjeS5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtTGVnYWN5LmgKQEAgLTc3LDcgKzc3LDYgQEAKIAogICAgIHZpcnR1YWwgaW50NjRfdCBpbmNyZW1lbnRDbGllbnRGcmFtZUNvdW50ZXIoaW50MzJfdCBmcmFtZXMpICA9IDA7CiAKLQogICAgIHZpcnR1YWwgaW50NjRfdCBnZXRGcmFtZXNXcml0dGVuKCkgb3ZlcnJpZGUgewogICAgICAgICByZXR1cm4gbUZyYW1lc1dyaXR0ZW4uZ2V0KCk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1SZWNvcmQuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1SZWNvcmQuY3BwCmluZGV4IDUwNWYyZWUuLjQwZTIyYWMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtUmVjb3JkLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbVJlY29yZC5jcHAKQEAgLTU3LDYgKzU3LDkgQEAKIAogICAgIC8vIFRyeSB0byBjcmVhdGUgYW4gQXVkaW9SZWNvcmQKIAorICAgIGNvbnN0IGFhdWRpb19zZXNzaW9uX2lkX3QgcmVxdWVzdGVkU2Vzc2lvbklkID0gYnVpbGRlci5nZXRTZXNzaW9uSWQoKTsKKyAgICBjb25zdCBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkID0gQUF1ZGlvQ29udmVydF9hYXVkaW9Ub0FuZHJvaWRTZXNzaW9uSWQocmVxdWVzdGVkU2Vzc2lvbklkKTsKKwogICAgIC8vIFRPRE8gU3VwcG9ydCBVTlNQRUNJRklFRCBpbiBBdWRpb1JlY29yZC4gRm9yIG5vdywgdXNlIHN0ZXJlbyBpZiB1bnNwZWNpZmllZC4KICAgICBpbnQzMl90IHNhbXBsZXNQZXJGcmFtZSA9IChnZXRTYW1wbGVzUGVyRnJhbWUoKSA9PSBBQVVESU9fVU5TUEVDSUZJRUQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IDIgOiBnZXRTYW1wbGVzUGVyRnJhbWUoKTsKQEAgLTY2LDIzICs2OSwyNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgOiBidWlsZGVyLmdldEJ1ZmZlckNhcGFjaXR5KCk7CiAKIAotICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MgPSBBVURJT19JTlBVVF9GTEFHX05PTkU7CisgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFnczsKICAgICBhYXVkaW9fcGVyZm9ybWFuY2VfbW9kZV90IHBlcmZNb2RlID0gZ2V0UGVyZm9ybWFuY2VNb2RlKCk7CiAgICAgc3dpdGNoIChwZXJmTW9kZSkgewogICAgICAgICBjYXNlIEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX0xPV19MQVRFTkNZOgotICAgICAgICAgICAgZmxhZ3MgPSAoYXVkaW9faW5wdXRfZmxhZ3NfdCkgKEFVRElPX0lOUFVUX0ZMQUdfRkFTVCB8IEFVRElPX0lOUFVUX0ZMQUdfUkFXKTsKKyAgICAgICAgICAgIC8vIElmIHRoZSBhcHAgYXNrcyBmb3IgYSBzZXNzaW9uSWQgdGhlbiBpdCBtZWFucyB0aGV5IHdhbnQgdG8gdXNlIGVmZmVjdHMuCisgICAgICAgICAgICAvLyBTbyBkb24ndCB1c2UgUkFXIGZsYWcuCisgICAgICAgICAgICBmbGFncyA9IChhdWRpb19pbnB1dF9mbGFnc190KSAoKHJlcXVlc3RlZFNlc3Npb25JZCA9PSBBQVVESU9fU0VTU0lPTl9JRF9OT05FKQorICAgICAgICAgICAgICAgICAgICA/IChBVURJT19JTlBVVF9GTEFHX0ZBU1QgfCBBVURJT19JTlBVVF9GTEFHX1JBVykKKyAgICAgICAgICAgICAgICAgICAgOiAoQVVESU9fSU5QVVRfRkxBR19GQVNUKSk7CiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX1BPV0VSX1NBVklORzoKICAgICAgICAgY2FzZSBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9OT05FOgogICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgLy8gTm8gZmxhZ3MuCisgICAgICAgICAgICBmbGFncyA9IEFVRElPX0lOUFVUX0ZMQUdfTk9ORTsKICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KIAogICAgIC8vIFByZXNlcnZlIGJlaGF2aW9yIG9mIEFQSSAyNgotICAgIGlmIChnZXRGb3JtYXQoKSA9PSBBQVVESU9fRk9STUFUX1VOU1BFQ0lGSUVEKSB7Ci0gICAgICAgIHNldEZvcm1hdChBQVVESU9fRk9STUFUX1BDTV9GTE9BVCk7CisgICAgaWYgKGdldEZvcm1hdCgpID09IEFVRElPX0ZPUk1BVF9ERUZBVUxUKSB7CisgICAgICAgIHNldEZvcm1hdChBVURJT19GT1JNQVRfUENNX0ZMT0FUKTsKICAgICB9CiAKICAgICAvLyBNYXliZSBjaGFuZ2UgZGV2aWNlIGZvcm1hdCB0byBnZXQgYSBGQVNUIHBhdGguCkBAIC05OSwxMiArMTA2LDEyIEBACiAgICAgLy8gV2UganVzdCBtYXkgbm90IGdldCBhIEZBU1QgdHJhY2suCiAgICAgLy8gQnV0IHdlIHdvdWxkbid0IGhhdmUgYW55d2F5IHdpdGhvdXQgdGhpcyBoYWNrLgogICAgIGNvbnN0ZXhwciBpbnQzMl90IGtNb3N0TGlrZWx5U2FtcGxlUmF0ZUZvckZhc3QgPSA0ODAwMDsKLSAgICBpZiAoZ2V0Rm9ybWF0KCkgPT0gQUFVRElPX0ZPUk1BVF9QQ01fRkxPQVQKKyAgICBpZiAoZ2V0Rm9ybWF0KCkgPT0gQVVESU9fRk9STUFUX1BDTV9GTE9BVAogICAgICAgICAgICAgJiYgcGVyZk1vZGUgPT0gQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTE9XX0xBVEVOQ1kKICAgICAgICAgICAgICYmIChzYW1wbGVzUGVyRnJhbWUgPD0gMikgLy8gRkFTVCBvbmx5IGZvciBtb25vIGFuZCBzdGVyZW8KICAgICAgICAgICAgICYmIChnZXRTYW1wbGVSYXRlKCkgPT0ga01vc3RMaWtlbHlTYW1wbGVSYXRlRm9yRmFzdAogICAgICAgICAgICAgICAgIHx8IGdldFNhbXBsZVJhdGUoKSA9PSBBQVVESU9fVU5TUEVDSUZJRUQpKSB7Ci0gICAgICAgIHNldERldmljZUZvcm1hdChBQVVESU9fRk9STUFUX1BDTV9JMTYpOworICAgICAgICBzZXREZXZpY2VGb3JtYXQoQVVESU9fRk9STUFUX1BDTV8xNl9CSVQpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIHNldERldmljZUZvcm1hdChnZXRGb3JtYXQoKSk7CiAgICAgfQpAQCAtMTQxLDE0ICsxNDgsMTAgQEAKICAgICAgICAgICAgIC50YWdzID0gIiIKICAgICB9OwogCi0gICAgYWF1ZGlvX3Nlc3Npb25faWRfdCByZXF1ZXN0ZWRTZXNzaW9uSWQgPSBidWlsZGVyLmdldFNlc3Npb25JZCgpOwotICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQgPSBBQXVkaW9Db252ZXJ0X2FhdWRpb1RvQW5kcm9pZFNlc3Npb25JZChyZXF1ZXN0ZWRTZXNzaW9uSWQpOwotCiAgICAgLy8gLS0tLS0tLS0tLS0gb3BlbiB0aGUgQXVkaW9SZWNvcmQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgLy8gTWlnaHQgcmV0cnksIGJ1dCBuZXZlciBtb3JlIHRoYW4gb25jZS4KICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI7IGkgKyspIHsKLSAgICAgICAgYXVkaW9fZm9ybWF0X3QgcmVxdWVzdGVkSW50ZXJuYWxGb3JtYXQgPQotICAgICAgICAgICAgICAgIEFBdWRpb0NvbnZlcnRfYWF1ZGlvVG9BbmRyb2lkRGF0YUZvcm1hdChnZXREZXZpY2VGb3JtYXQoKSk7CisgICAgICAgIGNvbnN0IGF1ZGlvX2Zvcm1hdF90IHJlcXVlc3RlZEludGVybmFsRm9ybWF0ID0gZ2V0RGV2aWNlRm9ybWF0KCk7CiAKICAgICAgICAgbUF1ZGlvUmVjb3JkID0gbmV3IEF1ZGlvUmVjb3JkKAogICAgICAgICAgICAgICAgIG1PcFBhY2thZ2VOYW1lIC8vIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lIFRPRE8gZG9lcyBub3QgY29tcGlsZQpAQCAtMjE0LDggKzIxNyw4IEBACiAgICAgfQogCiAgICAgLy8gQWxsb2NhdGUgZm9ybWF0IGNvbnZlcnNpb24gYnVmZmVyIGlmIG5lZWRlZC4KLSAgICBpZiAoZ2V0RGV2aWNlRm9ybWF0KCkgPT0gQUFVRElPX0ZPUk1BVF9QQ01fSTE2Ci0gICAgICAgICYmIGdldEZvcm1hdCgpID09IEFBVURJT19GT1JNQVRfUENNX0ZMT0FUKSB7CisgICAgaWYgKGdldERldmljZUZvcm1hdCgpID09IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUCisgICAgICAgICYmIGdldEZvcm1hdCgpID09IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpIHsKIAogICAgICAgICBpZiAoYnVpbGRlci5nZXREYXRhQ2FsbGJhY2tQcm9jKCkgIT0gbnVsbHB0cikgewogICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSBhIGNhbGxiYWNrIHRoZW4gd2UgbmVlZCB0byBjb252ZXJ0IHRoZSBkYXRhIGludG8gYW4gaW50ZXJuYWwgZmxvYXQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtVHJhY2suY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1UcmFjay5jcHAKaW5kZXggNTA1Y2Q3Ny4uMWFjMjU1OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1UcmFjay5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1UcmFjay5jcHAKQEAgLTU5LDE4ICs1OSwyNSBAQAogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KIAorICAgIGNvbnN0IGFhdWRpb19zZXNzaW9uX2lkX3QgcmVxdWVzdGVkU2Vzc2lvbklkID0gYnVpbGRlci5nZXRTZXNzaW9uSWQoKTsKKyAgICBjb25zdCBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkID0gQUF1ZGlvQ29udmVydF9hYXVkaW9Ub0FuZHJvaWRTZXNzaW9uSWQocmVxdWVzdGVkU2Vzc2lvbklkKTsKKwogICAgIC8vIFRyeSB0byBjcmVhdGUgYW4gQXVkaW9UcmFjawogICAgIC8vIFVzZSBzdGVyZW8gaWYgdW5zcGVjaWZpZWQuCiAgICAgaW50MzJfdCBzYW1wbGVzUGVyRnJhbWUgPSAoZ2V0U2FtcGxlc1BlckZyYW1lKCkgPT0gQUFVRElPX1VOU1BFQ0lGSUVEKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAyIDogZ2V0U2FtcGxlc1BlckZyYW1lKCk7CiAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sgPSBhdWRpb19jaGFubmVsX291dF9tYXNrX2Zyb21fY291bnQoc2FtcGxlc1BlckZyYW1lKTsKIAotICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzID0gQVVESU9fT1VUUFVUX0ZMQUdfTk9ORTsKKyAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFnczsKICAgICBhYXVkaW9fcGVyZm9ybWFuY2VfbW9kZV90IHBlcmZNb2RlID0gZ2V0UGVyZm9ybWFuY2VNb2RlKCk7CiAgICAgc3dpdGNoKHBlcmZNb2RlKSB7CiAgICAgICAgIGNhc2UgQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTE9XX0xBVEVOQ1k6CiAgICAgICAgICAgICAvLyBCeXBhc3MgdGhlIG5vcm1hbCBtaXhlciBhbmQgZ28gc3RyYWlnaHQgdG8gdGhlIEZBU1QgbWl4ZXIuCi0gICAgICAgICAgICBmbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdCkoQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCB8IEFVRElPX09VVFBVVF9GTEFHX1JBVyk7CisgICAgICAgICAgICAvLyBJZiB0aGUgYXBwIGFza3MgZm9yIGEgc2Vzc2lvbklkIHRoZW4gaXQgbWVhbnMgdGhleSB3YW50IHRvIHVzZSBlZmZlY3RzLgorICAgICAgICAgICAgLy8gU28gZG9uJ3QgdXNlIFJBVyBmbGFnLgorICAgICAgICAgICAgZmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpICgocmVxdWVzdGVkU2Vzc2lvbklkID09IEFBVURJT19TRVNTSU9OX0lEX05PTkUpCisgICAgICAgICAgICAgICAgICAgID8gKEFVRElPX09VVFBVVF9GTEFHX0ZBU1QgfCBBVURJT19PVVRQVVRfRkxBR19SQVcpCisgICAgICAgICAgICAgICAgICAgIDogKEFVRElPX09VVFBVVF9GTEFHX0ZBU1QpKTsKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgQUFVRElPX1BFUkZPUk1BTkNFX01PREVfUE9XRVJfU0FWSU5HOgpAQCAtODEsNiArODgsNyBAQAogICAgICAgICBjYXNlIEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX05PTkU6CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAvLyBObyBmbGFncy4gVXNlIGEgbm9ybWFsIG1peGVyIGluIGZyb250IG9mIHRoZSBGQVNUIG1peGVyLgorICAgICAgICAgICAgZmxhZ3MgPSBBVURJT19PVVRQVVRfRkxBR19OT05FOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgfQogCkBAIC04OCw5ICs5Niw5IEBACiAKICAgICBpbnQzMl90IG5vdGlmaWNhdGlvbkZyYW1lcyA9IDA7CiAKLSAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQgPSAoZ2V0Rm9ybWF0KCkgPT0gQUFVRElPX0ZPUk1BVF9VTlNQRUNJRklFRCkKKyAgICBjb25zdCBhdWRpb19mb3JtYXRfdCBmb3JtYXQgPSAoZ2V0Rm9ybWF0KCkgPT0gQVVESU9fRk9STUFUX0RFRkFVTFQpCiAgICAgICAgICAgICA/IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQKLSAgICAgICAgICAgIDogQUF1ZGlvQ29udmVydF9hYXVkaW9Ub0FuZHJvaWREYXRhRm9ybWF0KGdldEZvcm1hdCgpKTsKKyAgICAgICAgICAgIDogZ2V0Rm9ybWF0KCk7CiAKICAgICAvLyBTZXR1cCB0aGUgY2FsbGJhY2sgaWYgdGhlcmUgaXMgb25lLgogICAgIEF1ZGlvVHJhY2s6OmNhbGxiYWNrX3QgY2FsbGJhY2sgPSBudWxscHRyOwpAQCAtMTM1LDExICsxNDMsNiBAQAogICAgICAgICAgICAgLnRhZ3MgPSAiIgogICAgIH07CiAKLSAgICBzdGF0aWNfYXNzZXJ0KEFBVURJT19VTlNQRUNJRklFRCA9PSBBVURJT19TRVNTSU9OX0FMTE9DQVRFLCAiU2Vzc2lvbiBJRHMgc2hvdWxkIG1hdGNoIik7Ci0KLSAgICBhYXVkaW9fc2Vzc2lvbl9pZF90IHJlcXVlc3RlZFNlc3Npb25JZCA9IGJ1aWxkZXIuZ2V0U2Vzc2lvbklkKCk7Ci0gICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCA9IEFBdWRpb0NvbnZlcnRfYWF1ZGlvVG9BbmRyb2lkU2Vzc2lvbklkKHJlcXVlc3RlZFNlc3Npb25JZCk7Ci0KICAgICBtQXVkaW9UcmFjayA9IG5ldyBBdWRpb1RyYWNrKCk7CiAgICAgbUF1ZGlvVHJhY2stPnNldCgKICAgICAgICAgICAgIEFVRElPX1NUUkVBTV9ERUZBVUxULCAgLy8gaWdub3JlZCBiZWNhdXNlIHdlIHBhc3MgYXR0cmlidXRlcyBiZWxvdwpAQCAtMTc4LDEwICsxODEsOCBAQAogCiAgICAgLy8gR2V0IHRoZSBhY3R1YWwgdmFsdWVzIGZyb20gdGhlIEF1ZGlvVHJhY2suCiAgICAgc2V0U2FtcGxlc1BlckZyYW1lKG1BdWRpb1RyYWNrLT5jaGFubmVsQ291bnQoKSk7Ci0gICAgYWF1ZGlvX2Zvcm1hdF90IGFhdWRpb0Zvcm1hdCA9Ci0gICAgICAgICAgICBBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb0RhdGFGb3JtYXQobUF1ZGlvVHJhY2stPmZvcm1hdCgpKTsKLSAgICBzZXRGb3JtYXQoYWF1ZGlvRm9ybWF0KTsKLSAgICBzZXREZXZpY2VGb3JtYXQoYWF1ZGlvRm9ybWF0KTsKKyAgICBzZXRGb3JtYXQobUF1ZGlvVHJhY2stPmZvcm1hdCgpKTsKKyAgICBzZXREZXZpY2VGb3JtYXQobUF1ZGlvVHJhY2stPmZvcm1hdCgpKTsKIAogICAgIGludDMyX3QgYWN0dWFsU2FtcGxlUmF0ZSA9IG1BdWRpb1RyYWNrLT5nZXRTYW1wbGVSYXRlKCk7CiAgICAgQUxPR1dfSUYoYWN0dWFsU2FtcGxlUmF0ZSAhPSBnZXRTYW1wbGVSYXRlKCksCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvQUF1ZGlvVXRpbGl0aWVzLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvdXRpbGl0eS9BQXVkaW9VdGlsaXRpZXMuY3BwCmluZGV4IDQwZWJiNzYuLmY1YjNhZDQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvdXRpbGl0eS9BQXVkaW9VdGlsaXRpZXMuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvdXRpbGl0eS9BQXVkaW9VdGlsaXRpZXMuY3BwCkBAIC0zMywzOTUgKzMzLDYgQEAKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiAKLS8vIFRoaXMgaXMgMyBkQiwgKDEwXigzLzIwKSksIHRvIG1hdGNoIHRoZSBtYXhpbXVtIGhlYWRyb29tIGluIEF1ZGlvVHJhY2sgZm9yIGZsb2F0IGRhdGEuCi0vLyBJdCBpcyBkZXNpZ25lZCB0byBhbGxvdyBvY2Nhc2lvbmFsIHRyYW5zaWVudCBwZWFrcy4KLSNkZWZpbmUgTUFYX0hFQURST09NICgxLjQxMjUzNzU0ZikKLSNkZWZpbmUgTUlOX0hFQURST09NICgwIC0gTUFYX0hFQURST09NKQotCi1pbnQzMl90IEFBdWRpb0NvbnZlcnRfZm9ybWF0VG9TaXplSW5CeXRlcyhhYXVkaW9fZm9ybWF0X3QgZm9ybWF0KSB7Ci0gICAgaW50MzJfdCBzaXplID0gQUFVRElPX0VSUk9SX0lMTEVHQUxfQVJHVU1FTlQ7Ci0gICAgc3dpdGNoIChmb3JtYXQpIHsKLSAgICAgICAgY2FzZSBBQVVESU9fRk9STUFUX1BDTV9JMTY6Ci0gICAgICAgICAgICBzaXplID0gc2l6ZW9mKGludDE2X3QpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQUFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ6Ci0gICAgICAgICAgICBzaXplID0gc2l6ZW9mKGZsb2F0KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIHJldHVybiBzaXplOwotfQotCi0vLyBUT0RPIGV4cG9zZSBhbmQgY2FsbCBjbGFtcDE2X2Zyb21fZmxvYXQgZnVuY3Rpb24gaW4gcHJpbWl0aXZlcy5oCi1zdGF0aWMgaW5saW5lIGludDE2X3QgY2xhbXAxNl9mcm9tX2Zsb2F0KGZsb2F0IGYpIHsKLSAgICBzdGF0aWMgY29uc3QgZmxvYXQgc2NhbGUgPSAxIDw8IDE1OwotICAgIHJldHVybiAoaW50MTZfdCkgcm91bmRmKGZtYXhmKGZtaW5mKGYgKiBzY2FsZSwgc2NhbGUgLSAxLmYpLCAtc2NhbGUpKTsKLX0KLQotLy8gQ2xpcCB0byB2YWxpZCByYW5nZSBvZiBhIGZsb2F0IHNhbXBsZSB0byBwcmV2ZW50IGV4Y2Vzc2l2ZSB2b2x1bWUuCi0vLyBCeSB1c2luZyBmbWluIGFuZCBmbWF4IHdlIGFsc28gcHJvdGVjdCBhZ2FpbnN0IE5hTi4KLXN0YXRpYyBmbG9hdCBjbGlwVG9NaW5NYXhIZWFkcm9vbShmbG9hdCBpbnB1dCkgewotICAgIHJldHVybiBmbWluKE1BWF9IRUFEUk9PTSwgZm1heChNSU5fSEVBRFJPT00sIGlucHV0KSk7Ci19Ci0KLXN0YXRpYyBmbG9hdCBjbGlwQW5kQ2xhbXBGbG9hdFRvUGNtMTYoZmxvYXQgc2FtcGxlLCBmbG9hdCBzY2FsZXIpIHsKLSAgICAvLyBDbGlwIHRvIHZhbGlkIHJhbmdlIG9mIGEgZmxvYXQgc2FtcGxlIHRvIHByZXZlbnQgZXhjZXNzaXZlIHZvbHVtZS4KLSAgICBzYW1wbGUgPSBjbGlwVG9NaW5NYXhIZWFkcm9vbShzYW1wbGUpOwotCi0gICAgLy8gU2NhbGUgYW5kIGNvbnZlcnQgdG8gYSBzaG9ydC4KLSAgICBmbG9hdCBmdmFsID0gc2FtcGxlICogc2NhbGVyOwotICAgIHJldHVybiBjbGFtcDE2X2Zyb21fZmxvYXQoZnZhbCk7Ci19Ci0KLXZvaWQgQUF1ZGlvQ29udmVydF9mbG9hdFRvUGNtMTYoY29uc3QgZmxvYXQgKnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqZGVzdGluYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtU2FtcGxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlKSB7Ci0gICAgY29uc3QgZmxvYXQgc2NhbGVyID0gYW1wbGl0dWRlOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtU2FtcGxlczsgaSsrKSB7Ci0gICAgICAgIGZsb2F0IHNhbXBsZSA9ICpzb3VyY2UrKzsKLSAgICAgICAgKmRlc3RpbmF0aW9uKysgPSBjbGlwQW5kQ2xhbXBGbG9hdFRvUGNtMTYoc2FtcGxlLCBzY2FsZXIpOwotICAgIH0KLX0KLQotdm9pZCBBQXVkaW9Db252ZXJ0X2Zsb2F0VG9QY20xNihjb25zdCBmbG9hdCAqc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpkZXN0aW5hdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUyKSB7Ci0gICAgZmxvYXQgc2NhbGVyID0gYW1wbGl0dWRlMTsKLSAgICAvLyBkaXZpZGUgYnkgbnVtRnJhbWVzIHNvIHRoYXQgd2UgYWxtb3N0IHJlYWNoIGFtcGxpdHVkZTIKLSAgICBmbG9hdCBkZWx0YSA9IChhbXBsaXR1ZGUyIC0gYW1wbGl0dWRlMSkgLyBudW1GcmFtZXM7Ci0gICAgZm9yIChpbnQgZnJhbWVJbmRleCA9IDA7IGZyYW1lSW5kZXggPCBudW1GcmFtZXM7IGZyYW1lSW5kZXgrKykgewotICAgICAgICBmb3IgKGludCBzYW1wbGVJbmRleCA9IDA7IHNhbXBsZUluZGV4IDwgc2FtcGxlc1BlckZyYW1lOyBzYW1wbGVJbmRleCsrKSB7Ci0gICAgICAgICAgICBmbG9hdCBzYW1wbGUgPSAqc291cmNlKys7Ci0gICAgICAgICAgICAqZGVzdGluYXRpb24rKyA9IGNsaXBBbmRDbGFtcEZsb2F0VG9QY20xNihzYW1wbGUsIHNjYWxlcik7Ci0gICAgICAgIH0KLSAgICAgICAgc2NhbGVyICs9IGRlbHRhOwotICAgIH0KLX0KLQotI2RlZmluZSBTSE9SVF9TQ0FMRSAgMzI3NjgKLQotdm9pZCBBQXVkaW9Db252ZXJ0X3BjbTE2VG9GbG9hdChjb25zdCBpbnQxNl90ICpzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICpkZXN0aW5hdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1TYW1wbGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUpIHsKLSAgICBjb25zdCBmbG9hdCBzY2FsZXIgPSBhbXBsaXR1ZGUgLyBTSE9SVF9TQ0FMRTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVNhbXBsZXM7IGkrKykgewotICAgICAgICBkZXN0aW5hdGlvbltpXSA9IHNvdXJjZVtpXSAqIHNjYWxlcjsKLSAgICB9Ci19Ci0KLS8vIFRoaXMgY29kZSBhc3N1bWVzIGFtcGxpdHVkZTEgYW5kIGFtcGxpdHVkZTIgYXJlIGJldHdlZW4gMC4wIGFuZCAxLjAKLXZvaWQgQUF1ZGlvQ29udmVydF9wY20xNlRvRmxvYXQoY29uc3QgaW50MTZfdCAqc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqZGVzdGluYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNhbXBsZXNQZXJGcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlMikgewotICAgIGZsb2F0IHNjYWxlciA9IGFtcGxpdHVkZTEgLyBTSE9SVF9TQ0FMRTsKLSAgICBjb25zdCBmbG9hdCBkZWx0YSA9IChhbXBsaXR1ZGUyIC0gYW1wbGl0dWRlMSkgLyAoU0hPUlRfU0NBTEUgKiAoZmxvYXQpIG51bUZyYW1lcyk7Ci0gICAgZm9yIChpbnQgZnJhbWVJbmRleCA9IDA7IGZyYW1lSW5kZXggPCBudW1GcmFtZXM7IGZyYW1lSW5kZXgrKykgewotICAgICAgICBmb3IgKGludCBzYW1wbGVJbmRleCA9IDA7IHNhbXBsZUluZGV4IDwgc2FtcGxlc1BlckZyYW1lOyBzYW1wbGVJbmRleCsrKSB7Ci0gICAgICAgICAgICAqZGVzdGluYXRpb24rKyA9ICpzb3VyY2UrKyAqIHNjYWxlcjsKLSAgICAgICAgfQotICAgICAgICBzY2FsZXIgKz0gZGVsdGE7Ci0gICAgfQotfQotCi0KLS8vIFRoaXMgY29kZSBhc3N1bWVzIGFtcGxpdHVkZTEgYW5kIGFtcGxpdHVkZTIgYXJlIGJldHdlZW4gMC4wIGFuZCAxLjAKLXZvaWQgQUF1ZGlvX2xpbmVhclJhbXAoY29uc3QgZmxvYXQgKnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKmRlc3RpbmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzYW1wbGVzUGVyRnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZTEsCi0gICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZTIpIHsKLSAgICBmbG9hdCBzY2FsZXIgPSBhbXBsaXR1ZGUxOwotICAgIGNvbnN0IGZsb2F0IGRlbHRhID0gKGFtcGxpdHVkZTIgLSBhbXBsaXR1ZGUxKSAvIG51bUZyYW1lczsKLSAgICBmb3IgKGludCBmcmFtZUluZGV4ID0gMDsgZnJhbWVJbmRleCA8IG51bUZyYW1lczsgZnJhbWVJbmRleCsrKSB7Ci0gICAgICAgIGZvciAoaW50IHNhbXBsZUluZGV4ID0gMDsgc2FtcGxlSW5kZXggPCBzYW1wbGVzUGVyRnJhbWU7IHNhbXBsZUluZGV4KyspIHsKLSAgICAgICAgICAgIGZsb2F0IHNhbXBsZSA9ICpzb3VyY2UrKzsKLSAgICAgICAgICAgIC8vIENsaXAgdG8gdmFsaWQgcmFuZ2Ugb2YgYSBmbG9hdCBzYW1wbGUgdG8gcHJldmVudCBleGNlc3NpdmUgdm9sdW1lLgotICAgICAgICAgICAgc2FtcGxlID0gY2xpcFRvTWluTWF4SGVhZHJvb20oc2FtcGxlKTsKLQotICAgICAgICAgICAgKmRlc3RpbmF0aW9uKysgPSBzYW1wbGUgKiBzY2FsZXI7Ci0gICAgICAgIH0KLSAgICAgICAgc2NhbGVyICs9IGRlbHRhOwotICAgIH0KLX0KLQotLy8gVGhpcyBjb2RlIGFzc3VtZXMgYW1wbGl0dWRlMSBhbmQgYW1wbGl0dWRlMiBhcmUgYmV0d2VlbiAwLjAgYW5kIDEuMAotdm9pZCBBQXVkaW9fbGluZWFyUmFtcChjb25zdCBpbnQxNl90ICpzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmRlc3RpbmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzYW1wbGVzUGVyRnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZTEsCi0gICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZTIpIHsKLSAgICAvLyBCZWNhdXNlIHdlIGFyZSBjb252ZXJ0aW5nIGZyb20gaW50MTYgdG8gMW50MTYsIHdlIGRvIG5vdCBoYXZlIHRvIHNjYWxlIGJ5IDEvMzI3NjguCi0gICAgZmxvYXQgc2NhbGVyID0gYW1wbGl0dWRlMTsKLSAgICBjb25zdCBmbG9hdCBkZWx0YSA9IChhbXBsaXR1ZGUyIC0gYW1wbGl0dWRlMSkgLyBudW1GcmFtZXM7Ci0gICAgZm9yIChpbnQgZnJhbWVJbmRleCA9IDA7IGZyYW1lSW5kZXggPCBudW1GcmFtZXM7IGZyYW1lSW5kZXgrKykgewotICAgICAgICBmb3IgKGludCBzYW1wbGVJbmRleCA9IDA7IHNhbXBsZUluZGV4IDwgc2FtcGxlc1BlckZyYW1lOyBzYW1wbGVJbmRleCsrKSB7Ci0gICAgICAgICAgICAvLyBObyBuZWVkIHRvIGNsaXAgYmVjYXVzZSBpbnQxNl90IHJhbmdlIGlzIGluaGVyZW50bHkgbGltaXRlZC4KLSAgICAgICAgICAgIGZsb2F0IHNhbXBsZSA9ICAqc291cmNlKysgKiBzY2FsZXI7Ci0gICAgICAgICAgICAqZGVzdGluYXRpb24rKyA9IChpbnQxNl90KSByb3VuZGYoc2FtcGxlKTsKLSAgICAgICAgfQotICAgICAgICBzY2FsZXIgKz0gZGVsdGE7Ci0gICAgfQotfQotCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyBDb252ZXJ0IE1vbm8gVG8gU3RlcmVvIGF0IHRoZSBzYW1lIHRpbWUgYXMgY29udmVydGluZyBmb3JtYXQuCi12b2lkIEFBdWRpb0NvbnZlcnRfZm9ybWF0TW9ub1RvU3RlcmVvKGNvbnN0IGZsb2F0ICpzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmRlc3RpbmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlKSB7Ci0gICAgY29uc3QgZmxvYXQgc2NhbGVyID0gYW1wbGl0dWRlOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtRnJhbWVzOyBpKyspIHsKLSAgICAgICAgZmxvYXQgc2FtcGxlID0gKnNvdXJjZSsrOwotICAgICAgICBpbnQxNl90IHNhbXBsZTE2ID0gY2xpcEFuZENsYW1wRmxvYXRUb1BjbTE2KHNhbXBsZSwgc2NhbGVyKTsKLSAgICAgICAgKmRlc3RpbmF0aW9uKysgPSBzYW1wbGUxNjsKLSAgICAgICAgKmRlc3RpbmF0aW9uKysgPSBzYW1wbGUxNjsKLSAgICB9Ci19Ci0KLXZvaWQgQUF1ZGlvQ29udmVydF9mb3JtYXRNb25vVG9TdGVyZW8oY29uc3QgZmxvYXQgKnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqZGVzdGluYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUyKSB7Ci0gICAgLy8gZGl2aWRlIGJ5IG51bUZyYW1lcyBzbyB0aGF0IHdlIGFsbW9zdCByZWFjaCBhbXBsaXR1ZGUyCi0gICAgY29uc3QgZmxvYXQgZGVsdGEgPSAoYW1wbGl0dWRlMiAtIGFtcGxpdHVkZTEpIC8gbnVtRnJhbWVzOwotICAgIGZvciAoaW50IGZyYW1lSW5kZXggPSAwOyBmcmFtZUluZGV4IDwgbnVtRnJhbWVzOyBmcmFtZUluZGV4KyspIHsKLSAgICAgICAgY29uc3QgZmxvYXQgc2NhbGVyID0gYW1wbGl0dWRlMSArIChmcmFtZUluZGV4ICogZGVsdGEpOwotICAgICAgICBjb25zdCBmbG9hdCBzYW1wbGUgPSAqc291cmNlKys7Ci0gICAgICAgIGludDE2X3Qgc2FtcGxlMTYgPSBjbGlwQW5kQ2xhbXBGbG9hdFRvUGNtMTYoc2FtcGxlLCBzY2FsZXIpOwotICAgICAgICAqZGVzdGluYXRpb24rKyA9IHNhbXBsZTE2OwotICAgICAgICAqZGVzdGluYXRpb24rKyA9IHNhbXBsZTE2OwotICAgIH0KLX0KLQotdm9pZCBBQXVkaW9Db252ZXJ0X2Zvcm1hdE1vbm9Ub1N0ZXJlbyhjb25zdCBpbnQxNl90ICpzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICpkZXN0aW5hdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZSkgewotICAgIGNvbnN0IGZsb2F0IHNjYWxlciA9IGFtcGxpdHVkZSAvIFNIT1JUX1NDQUxFOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtRnJhbWVzOyBpKyspIHsKLSAgICAgICAgZmxvYXQgc2FtcGxlID0gc291cmNlW2ldICogc2NhbGVyOwotICAgICAgICAqZGVzdGluYXRpb24rKyA9IHNhbXBsZTsKLSAgICAgICAgKmRlc3RpbmF0aW9uKysgPSBzYW1wbGU7Ci0gICAgfQotfQotCi0vLyBUaGlzIGNvZGUgYXNzdW1lcyBhbXBsaXR1ZGUxIGFuZCBhbXBsaXR1ZGUyIGFyZSBiZXR3ZWVuIDAuMCBhbmQgMS4wCi12b2lkIEFBdWRpb0NvbnZlcnRfZm9ybWF0TW9ub1RvU3RlcmVvKGNvbnN0IGludDE2X3QgKnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKmRlc3RpbmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlMikgewotICAgIGNvbnN0IGZsb2F0IHNjYWxlcjEgPSBhbXBsaXR1ZGUxIC8gU0hPUlRfU0NBTEU7Ci0gICAgY29uc3QgZmxvYXQgZGVsdGEgPSAoYW1wbGl0dWRlMiAtIGFtcGxpdHVkZTEpIC8gKFNIT1JUX1NDQUxFICogKGZsb2F0KSBudW1GcmFtZXMpOwotICAgIGZvciAoaW50IGZyYW1lSW5kZXggPSAwOyBmcmFtZUluZGV4IDwgbnVtRnJhbWVzOyBmcmFtZUluZGV4KyspIHsKLSAgICAgICAgZmxvYXQgc2NhbGVyID0gc2NhbGVyMSArIChmcmFtZUluZGV4ICogZGVsdGEpOwotICAgICAgICBmbG9hdCBzYW1wbGUgPSBzb3VyY2VbZnJhbWVJbmRleF0gKiBzY2FsZXI7Ci0gICAgICAgICpkZXN0aW5hdGlvbisrID0gc2FtcGxlOwotICAgICAgICAqZGVzdGluYXRpb24rKyA9IHNhbXBsZTsKLSAgICB9Ci19Ci0KLS8vIFRoaXMgY29kZSBhc3N1bWVzIGFtcGxpdHVkZTEgYW5kIGFtcGxpdHVkZTIgYXJlIGJldHdlZW4gMC4wIGFuZCAxLjAKLXZvaWQgQUF1ZGlvX2xpbmVhclJhbXBNb25vVG9TdGVyZW8oY29uc3QgZmxvYXQgKnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKmRlc3RpbmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlMikgewotICAgIGNvbnN0IGZsb2F0IGRlbHRhID0gKGFtcGxpdHVkZTIgLSBhbXBsaXR1ZGUxKSAvIG51bUZyYW1lczsKLSAgICBmb3IgKGludCBmcmFtZUluZGV4ID0gMDsgZnJhbWVJbmRleCA8IG51bUZyYW1lczsgZnJhbWVJbmRleCsrKSB7Ci0gICAgICAgIGZsb2F0IHNhbXBsZSA9ICpzb3VyY2UrKzsKLQotICAgICAgICAvLyBDbGlwIHRvIHZhbGlkIHJhbmdlIG9mIGEgZmxvYXQgc2FtcGxlIHRvIHByZXZlbnQgZXhjZXNzaXZlIHZvbHVtZS4KLSAgICAgICAgc2FtcGxlID0gY2xpcFRvTWluTWF4SGVhZHJvb20oc2FtcGxlKTsKLQotICAgICAgICBjb25zdCBmbG9hdCBzY2FsZXIgPSBhbXBsaXR1ZGUxICsgKGZyYW1lSW5kZXggKiBkZWx0YSk7Ci0gICAgICAgIGZsb2F0IHNhbXBsZVNjYWxlZCA9IHNhbXBsZSAqIHNjYWxlcjsKLSAgICAgICAgKmRlc3RpbmF0aW9uKysgPSBzYW1wbGVTY2FsZWQ7Ci0gICAgICAgICpkZXN0aW5hdGlvbisrID0gc2FtcGxlU2NhbGVkOwotICAgIH0KLX0KLQotLy8gVGhpcyBjb2RlIGFzc3VtZXMgYW1wbGl0dWRlMSBhbmQgYW1wbGl0dWRlMiBhcmUgYmV0d2VlbiAwLjAgYW5kIDEuMAotdm9pZCBBQXVkaW9fbGluZWFyUmFtcE1vbm9Ub1N0ZXJlbyhjb25zdCBpbnQxNl90ICpzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmRlc3RpbmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlMikgewotICAgIC8vIEJlY2F1c2Ugd2UgYXJlIGNvbnZlcnRpbmcgZnJvbSBpbnQxNiB0byAxbnQxNiwgd2UgZG8gbm90IGhhdmUgdG8gc2NhbGUgYnkgMS8zMjc2OC4KLSAgICBjb25zdCBmbG9hdCBkZWx0YSA9IChhbXBsaXR1ZGUyIC0gYW1wbGl0dWRlMSkgLyBudW1GcmFtZXM7Ci0gICAgZm9yIChpbnQgZnJhbWVJbmRleCA9IDA7IGZyYW1lSW5kZXggPCBudW1GcmFtZXM7IGZyYW1lSW5kZXgrKykgewotICAgICAgICBjb25zdCBmbG9hdCBzY2FsZXIgPSBhbXBsaXR1ZGUxICsgKGZyYW1lSW5kZXggKiBkZWx0YSk7Ci0gICAgICAgIC8vIE5vIG5lZWQgdG8gY2xpcCBiZWNhdXNlIGludDE2X3QgcmFuZ2UgaXMgaW5oZXJlbnRseSBsaW1pdGVkLgotICAgICAgICBjb25zdCBmbG9hdCBzYW1wbGUgPSAgKnNvdXJjZSsrICogc2NhbGVyOwotICAgICAgICBpbnQxNl90IHNhbXBsZTE2ID0gKGludDE2X3QpIHJvdW5kZihzYW1wbGUpOwotICAgICAgICAqZGVzdGluYXRpb24rKyA9IHNhbXBsZTE2OwotICAgICAgICAqZGVzdGluYXRpb24rKyA9IHNhbXBsZTE2OwotICAgIH0KLX0KLQotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotdm9pZCBBQXVkaW9EYXRhQ29udmVydGVyOjpjb252ZXJ0KAotICAgICAgICBjb25zdCBGb3JtYXR0ZWREYXRhICZzb3VyY2UsCi0gICAgICAgIGNvbnN0IEZvcm1hdHRlZERhdGEgJmRlc3RpbmF0aW9uLAotICAgICAgICBpbnQzMl90IG51bUZyYW1lcywKLSAgICAgICAgZmxvYXQgbGV2ZWxGcm9tLAotICAgICAgICBmbG9hdCBsZXZlbFRvKSB7Ci0KLSAgICBpZiAoc291cmNlLmNoYW5uZWxDb3VudCA9PSAxICYmIGRlc3RpbmF0aW9uLmNoYW5uZWxDb3VudCA9PSAyKSB7Ci0gICAgICAgIGNvbnZlcnRNb25vVG9TdGVyZW8oc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbEZyb20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxUbyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gV2Ugb25seSBzdXBwb3J0IG1vbm8gdG8gc3RlcmVvIGNvbnZlcnNpb24uIE90aGVyd2lzZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uCi0gICAgICAgIC8vIG11c3QgbWF0Y2guCi0gICAgICAgIGFzc2VydChzb3VyY2UuY2hhbm5lbENvdW50ID09IGRlc3RpbmF0aW9uLmNoYW5uZWxDb3VudCk7Ci0gICAgICAgIGNvbnZlcnRDaGFubmVsc01hdGNoKHNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxGcm9tLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbFRvKTsKLSAgICB9Ci19Ci0KLXZvaWQgQUF1ZGlvRGF0YUNvbnZlcnRlcjo6Y29udmVydE1vbm9Ub1N0ZXJlbygKLSAgICAgICAgY29uc3QgRm9ybWF0dGVkRGF0YSAmc291cmNlLAotICAgICAgICBjb25zdCBGb3JtYXR0ZWREYXRhICZkZXN0aW5hdGlvbiwKLSAgICAgICAgaW50MzJfdCBudW1GcmFtZXMsCi0gICAgICAgIGZsb2F0IGxldmVsRnJvbSwKLSAgICAgICAgZmxvYXQgbGV2ZWxUbykgewotCi0gICAgLy8gVGhlIGZvcm1hdHMgYXJlIHZhbGlkYXRlZCB3aGVuIHRoZSBzdHJlYW0gaXMgb3BlbmVkIHNvIHdlIGRvIG5vdCBoYXZlIHRvCi0gICAgLy8gY2hlY2sgZm9yIGlsbGVnYWwgY29tYmluYXRpb25zIGhlcmUuCi0gICAgaWYgKHNvdXJjZS5mb3JtYXQgPT0gQUFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpIHsKLSAgICAgICAgaWYgKGRlc3RpbmF0aW9uLmZvcm1hdCA9PSBBQVVESU9fRk9STUFUX1BDTV9GTE9BVCkgewotICAgICAgICAgICAgQUF1ZGlvX2xpbmVhclJhbXBNb25vVG9TdGVyZW8oCi0gICAgICAgICAgICAgICAgICAgIChjb25zdCBmbG9hdCAqKSBzb3VyY2UuZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgKGZsb2F0ICopIGRlc3RpbmF0aW9uLmRhdGEsCi0gICAgICAgICAgICAgICAgICAgIG51bUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgbGV2ZWxGcm9tLAotICAgICAgICAgICAgICAgICAgICBsZXZlbFRvKTsKLSAgICAgICAgfSBlbHNlIGlmIChkZXN0aW5hdGlvbi5mb3JtYXQgPT0gQUFVRElPX0ZPUk1BVF9QQ01fSTE2KSB7Ci0gICAgICAgICAgICBpZiAobGV2ZWxGcm9tICE9IGxldmVsVG8pIHsKLSAgICAgICAgICAgICAgICBBQXVkaW9Db252ZXJ0X2Zvcm1hdE1vbm9Ub1N0ZXJlbygKLSAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBmbG9hdCAqKSBzb3VyY2UuZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChpbnQxNl90ICopIGRlc3RpbmF0aW9uLmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICBudW1GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBsZXZlbEZyb20sCi0gICAgICAgICAgICAgICAgICAgICAgICBsZXZlbFRvKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgQUF1ZGlvQ29udmVydF9mb3JtYXRNb25vVG9TdGVyZW8oCi0gICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgZmxvYXQgKikgc291cmNlLmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAoaW50MTZfdCAqKSBkZXN0aW5hdGlvbi5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxUbyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHNvdXJjZS5mb3JtYXQgPT0gQUFVRElPX0ZPUk1BVF9QQ01fSTE2KSB7Ci0gICAgICAgIGlmIChkZXN0aW5hdGlvbi5mb3JtYXQgPT0gQUFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpIHsKLSAgICAgICAgICAgIGlmIChsZXZlbEZyb20gIT0gbGV2ZWxUbykgewotICAgICAgICAgICAgICAgIEFBdWRpb0NvbnZlcnRfZm9ybWF0TW9ub1RvU3RlcmVvKAotICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGludDE2X3QgKikgc291cmNlLmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAoZmxvYXQgKikgZGVzdGluYXRpb24uZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsRnJvbSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsVG8pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBBQXVkaW9Db252ZXJ0X2Zvcm1hdE1vbm9Ub1N0ZXJlbygKLSAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBpbnQxNl90ICopIHNvdXJjZS5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgKGZsb2F0ICopIGRlc3RpbmF0aW9uLmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICBudW1GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBsZXZlbFRvKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChkZXN0aW5hdGlvbi5mb3JtYXQgPT0gQUFVRElPX0ZPUk1BVF9QQ01fSTE2KSB7Ci0gICAgICAgICAgICBBQXVkaW9fbGluZWFyUmFtcE1vbm9Ub1N0ZXJlbygKLSAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGludDE2X3QgKikgc291cmNlLmRhdGEsCi0gICAgICAgICAgICAgICAgICAgIChpbnQxNl90ICopIGRlc3RpbmF0aW9uLmRhdGEsCi0gICAgICAgICAgICAgICAgICAgIG51bUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgbGV2ZWxGcm9tLAotICAgICAgICAgICAgICAgICAgICBsZXZlbFRvKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotdm9pZCBBQXVkaW9EYXRhQ29udmVydGVyOjpjb252ZXJ0Q2hhbm5lbHNNYXRjaCgKLSAgICAgICAgY29uc3QgRm9ybWF0dGVkRGF0YSAmc291cmNlLAotICAgICAgICBjb25zdCBGb3JtYXR0ZWREYXRhICZkZXN0aW5hdGlvbiwKLSAgICAgICAgaW50MzJfdCBudW1GcmFtZXMsCi0gICAgICAgIGZsb2F0IGxldmVsRnJvbSwKLSAgICAgICAgZmxvYXQgbGV2ZWxUbykgewotICAgIGNvbnN0IGludDMyX3QgbnVtU2FtcGxlcyA9IG51bUZyYW1lcyAqIHNvdXJjZS5jaGFubmVsQ291bnQ7Ci0KLSAgICAvLyBUaGUgZm9ybWF0cyBhcmUgdmFsaWRhdGVkIHdoZW4gdGhlIHN0cmVhbSBpcyBvcGVuZWQgc28gd2UgZG8gbm90IGhhdmUgdG8KLSAgICAvLyBjaGVjayBmb3IgaWxsZWdhbCBjb21iaW5hdGlvbnMgaGVyZS4KLSAgICBpZiAoc291cmNlLmZvcm1hdCA9PSBBQVVESU9fRk9STUFUX1BDTV9GTE9BVCkgewotICAgICAgICBpZiAoZGVzdGluYXRpb24uZm9ybWF0ID09IEFBVURJT19GT1JNQVRfUENNX0ZMT0FUKSB7Ci0gICAgICAgICAgICBBQXVkaW9fbGluZWFyUmFtcCgKLSAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGZsb2F0ICopIHNvdXJjZS5kYXRhLAotICAgICAgICAgICAgICAgICAgICAoZmxvYXQgKikgZGVzdGluYXRpb24uZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICBzb3VyY2UuY2hhbm5lbENvdW50LAotICAgICAgICAgICAgICAgICAgICBsZXZlbEZyb20sCi0gICAgICAgICAgICAgICAgICAgIGxldmVsVG8pOwotICAgICAgICB9IGVsc2UgaWYgKGRlc3RpbmF0aW9uLmZvcm1hdCA9PSBBQVVESU9fRk9STUFUX1BDTV9JMTYpIHsKLSAgICAgICAgICAgIGlmIChsZXZlbEZyb20gIT0gbGV2ZWxUbykgewotICAgICAgICAgICAgICAgIEFBdWRpb0NvbnZlcnRfZmxvYXRUb1BjbTE2KAotICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGZsb2F0ICopIHNvdXJjZS5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgKGludDE2X3QgKikgZGVzdGluYXRpb24uZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZS5jaGFubmVsQ291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBsZXZlbEZyb20sCi0gICAgICAgICAgICAgICAgICAgICAgICBsZXZlbFRvKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgQUF1ZGlvQ29udmVydF9mbG9hdFRvUGNtMTYoCi0gICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgZmxvYXQgKikgc291cmNlLmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAoaW50MTZfdCAqKSBkZXN0aW5hdGlvbi5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgbnVtU2FtcGxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsVG8pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChzb3VyY2UuZm9ybWF0ID09IEFBVURJT19GT1JNQVRfUENNX0kxNikgewotICAgICAgICBpZiAoZGVzdGluYXRpb24uZm9ybWF0ID09IEFBVURJT19GT1JNQVRfUENNX0ZMT0FUKSB7Ci0gICAgICAgICAgICBpZiAobGV2ZWxGcm9tICE9IGxldmVsVG8pIHsKLSAgICAgICAgICAgICAgICBBQXVkaW9Db252ZXJ0X3BjbTE2VG9GbG9hdCgKLSAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBpbnQxNl90ICopIHNvdXJjZS5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgKGZsb2F0ICopIGRlc3RpbmF0aW9uLmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICBudW1GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UuY2hhbm5lbENvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxGcm9tLAotICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxUbyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEFBdWRpb0NvbnZlcnRfcGNtMTZUb0Zsb2F0KAotICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGludDE2X3QgKikgc291cmNlLmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAoZmxvYXQgKikgZGVzdGluYXRpb24uZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bVNhbXBsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBsZXZlbFRvKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChkZXN0aW5hdGlvbi5mb3JtYXQgPT0gQUFVRElPX0ZPUk1BVF9QQ01fSTE2KSB7Ci0gICAgICAgICAgICBBQXVkaW9fbGluZWFyUmFtcCgKLSAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGludDE2X3QgKikgc291cmNlLmRhdGEsCi0gICAgICAgICAgICAgICAgICAgIChpbnQxNl90ICopIGRlc3RpbmF0aW9uLmRhdGEsCi0gICAgICAgICAgICAgICAgICAgIG51bUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgc291cmNlLmNoYW5uZWxDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgbGV2ZWxGcm9tLAotICAgICAgICAgICAgICAgICAgICBsZXZlbFRvKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQogc3RhdHVzX3QgQUF1ZGlvQ29udmVydF9hYXVkaW9Ub0FuZHJvaWRTdGF0dXMoYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCkgewogICAgIC8vIFRoaXMgY292ZXJzIHRoZSBjYXNlIGZvciBBQVVESU9fT0sgYW5kIGZvciBwb3NpdGl2ZSByZXN1bHRzLgogICAgIGlmIChyZXN1bHQgPj0gMCkgewpAQCAtNTEzLDYgKzEyNCw5IEBACiBhdWRpb19mb3JtYXRfdCBBQXVkaW9Db252ZXJ0X2FhdWRpb1RvQW5kcm9pZERhdGFGb3JtYXQoYWF1ZGlvX2Zvcm1hdF90IGFhdWRpb0Zvcm1hdCkgewogICAgIGF1ZGlvX2Zvcm1hdF90IGFuZHJvaWRGb3JtYXQ7CiAgICAgc3dpdGNoIChhYXVkaW9Gb3JtYXQpIHsKKyAgICBjYXNlIEFBVURJT19GT1JNQVRfVU5TUEVDSUZJRUQ6CisgICAgICAgIGFuZHJvaWRGb3JtYXQgPSBBVURJT19GT1JNQVRfREVGQVVMVDsKKyAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBBQVVESU9fRk9STUFUX1BDTV9JMTY6CiAgICAgICAgIGFuZHJvaWRGb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKICAgICAgICAgYnJlYWs7CkBAIC01MjAsMTYgKzEzNCwxOSBAQAogICAgICAgICBhbmRyb2lkRm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV9GTE9BVDsKICAgICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKLSAgICAgICAgYW5kcm9pZEZvcm1hdCA9IEFVRElPX0ZPUk1BVF9ERUZBVUxUOwotICAgICAgICBBTE9HRSgiQUF1ZGlvQ29udmVydF9hYXVkaW9Ub0FuZHJvaWREYXRhRm9ybWF0IDB4JTA4WCB1bnJlY29nbml6ZWQiLCBhYXVkaW9Gb3JtYXQpOworICAgICAgICBhbmRyb2lkRm9ybWF0ID0gQVVESU9fRk9STUFUX0lOVkFMSUQ7CisgICAgICAgIEFMT0dFKCIlcygpIDB4JTA4WCB1bnJlY29nbml6ZWQiLCBfX2Z1bmNfXywgYWF1ZGlvRm9ybWF0KTsKICAgICAgICAgYnJlYWs7CiAgICAgfQogICAgIHJldHVybiBhbmRyb2lkRm9ybWF0OwogfQogCiBhYXVkaW9fZm9ybWF0X3QgQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9EYXRhRm9ybWF0KGF1ZGlvX2Zvcm1hdF90IGFuZHJvaWRGb3JtYXQpIHsKLSAgICBhYXVkaW9fZm9ybWF0X3QgYWF1ZGlvRm9ybWF0ID0gQUFVRElPX0ZPUk1BVF9JTlZBTElEOworICAgIGFhdWRpb19mb3JtYXRfdCBhYXVkaW9Gb3JtYXQ7CiAgICAgc3dpdGNoIChhbmRyb2lkRm9ybWF0KSB7CisgICAgY2FzZSBBVURJT19GT1JNQVRfREVGQVVMVDoKKyAgICAgICAgYWF1ZGlvRm9ybWF0ID0gQUFVRElPX0ZPUk1BVF9VTlNQRUNJRklFRDsKKyAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDoKICAgICAgICAgYWF1ZGlvRm9ybWF0ID0gQUFVRElPX0ZPUk1BVF9QQ01fSTE2OwogICAgICAgICBicmVhazsKQEAgLTUzOCw3ICsxNTUsNyBAQAogICAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgogICAgICAgICBhYXVkaW9Gb3JtYXQgPSBBQVVESU9fRk9STUFUX0lOVkFMSUQ7Ci0gICAgICAgIEFMT0dFKCJBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb0RhdGFGb3JtYXQgMHglMDhYIHVucmVjb2duaXplZCIsIGFuZHJvaWRGb3JtYXQpOworICAgICAgICBBTE9HRSgiJXMoKSAweCUwOFggdW5yZWNvZ25pemVkIiwgX19mdW5jX18sIGFuZHJvaWRGb3JtYXQpOwogICAgICAgICBicmVhazsKICAgICB9CiAgICAgcmV0dXJuIGFhdWRpb0Zvcm1hdDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvdXRpbGl0eS9BQXVkaW9VdGlsaXRpZXMuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvdXRpbGl0eS9BQXVkaW9VdGlsaXRpZXMuaAppbmRleCA0Yjk3NWU4Li5kYzJiMTk4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvQUF1ZGlvVXRpbGl0aWVzLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0FBdWRpb1V0aWxpdGllcy5oCkBAIC00NSwxNTYgKzQ1LDYgQEAKIGF1ZGlvX3Nlc3Npb25fdCBBQXVkaW9Db252ZXJ0X2FhdWRpb1RvQW5kcm9pZFNlc3Npb25JZChhYXVkaW9fc2Vzc2lvbl9pZF90IHNlc3Npb25JZCk7CiAKIC8qKgotICogQ29udmVydCBhbiBhcnJheSBvZiBmbG9hdHMgdG8gYW4gYXJyYXkgb2YgaW50MTZfdC4KLSAqCi0gKiBAcGFyYW0gc291cmNlCi0gKiBAcGFyYW0gZGVzdGluYXRpb24KLSAqIEBwYXJhbSBudW1TYW1wbGVzIG51bWJlciBvZiB2YWx1ZXMgaW4gdGhlIGFycmF5Ci0gKiBAcGFyYW0gYW1wbGl0dWRlIGxldmVsIGJldHdlZW4gMC4wIGFuZCAxLjAKLSAqLwotdm9pZCBBQXVkaW9Db252ZXJ0X2Zsb2F0VG9QY20xNihjb25zdCBmbG9hdCAqc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpkZXN0aW5hdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1TYW1wbGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUpOwotCi0vKioKLSAqIENvbnZlcnQgZmxvYXRzIHRvIGludDE2X3QgYW5kIHNjYWxlIGJ5IGEgbGluZWFyIHJhbXAuCi0gKgotICogVGhlIHJhbXAgc3RvcHMganVzdCBzaG9ydCBvZiByZWFjaGluZyBhbXBsaXR1ZGUyIHNvIHRoYXQgdGhlIG5leHQKLSAqIHJhbXAgY2FuIHN0YXJ0IGF0IGFtcGxpdHVkZTIgd2l0aG91dCBjYXVzaW5nIGEgZGlzY29udGludWl0eS4KLSAqCi0gKiBAcGFyYW0gc291cmNlCi0gKiBAcGFyYW0gZGVzdGluYXRpb24KLSAqIEBwYXJhbSBudW1GcmFtZXMKLSAqIEBwYXJhbSBzYW1wbGVzUGVyRnJhbWUgQUtBIG51bWJlciBvZiBjaGFubmVscwotICogQHBhcmFtIGFtcGxpdHVkZTEgbGV2ZWwgYXQgc3RhcnQgb2YgcmFtcCwgYmV0d2VlbiAwLjAgYW5kIDEuMAotICogQHBhcmFtIGFtcGxpdHVkZTIgbGV2ZWwgcGFzdCBlbmQgb2YgcmFtcCwgYmV0d2VlbiAwLjAgYW5kIDEuMAotICovCi12b2lkIEFBdWRpb0NvbnZlcnRfZmxvYXRUb1BjbTE2KGNvbnN0IGZsb2F0ICpzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmRlc3RpbmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzYW1wbGVzUGVyRnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZTIpOwotCi0vKioKLSAqIENvbnZlcnQgaW50MTZfdCBhcnJheSB0byBmbG9hdCBhcnJheSByYW5naW5nIGZyb20gLTEuMCB0byArMS4wLgotICogQHBhcmFtIHNvdXJjZQotICogQHBhcmFtIGRlc3RpbmF0aW9uCi0gKiBAcGFyYW0gbnVtU2FtcGxlcwotICovCi0vL3ZvaWQgQUF1ZGlvQ29udmVydF9wY20xNlRvRmxvYXQoY29uc3QgaW50MTZfdCAqc291cmNlLCBpbnQzMl90IG51bVNhbXBsZXMsCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKmRlc3RpbmF0aW9uKTsKLQotLyoqCi0gKgotICogQ29udmVydCBpbnQxNl90IGFycmF5IHRvIGZsb2F0IGFycmF5IHJhbmdpbmcgZnJvbSArLy0gYW1wbGl0dWRlLgotICogQHBhcmFtIHNvdXJjZQotICogQHBhcmFtIGRlc3RpbmF0aW9uCi0gKiBAcGFyYW0gbnVtU2FtcGxlcwotICogQHBhcmFtIGFtcGxpdHVkZQotICovCi12b2lkIEFBdWRpb0NvbnZlcnRfcGNtMTZUb0Zsb2F0KGNvbnN0IGludDE2X3QgKnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKmRlc3RpbmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bVNhbXBsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZSk7Ci0KLS8qKgotICogQ29udmVydCBmbG9hdHMgdG8gaW50MTZfdCBhbmQgc2NhbGUgYnkgYSBsaW5lYXIgcmFtcC4KLSAqCi0gKiBUaGUgcmFtcCBzdG9wcyBqdXN0IHNob3J0IG9mIHJlYWNoaW5nIGFtcGxpdHVkZTIgc28gdGhhdCB0aGUgbmV4dAotICogcmFtcCBjYW4gc3RhcnQgYXQgYW1wbGl0dWRlMiB3aXRob3V0IGNhdXNpbmcgYSBkaXNjb250aW51aXR5LgotICoKLSAqIEBwYXJhbSBzb3VyY2UKLSAqIEBwYXJhbSBkZXN0aW5hdGlvbgotICogQHBhcmFtIG51bUZyYW1lcwotICogQHBhcmFtIHNhbXBsZXNQZXJGcmFtZSBBS0EgbnVtYmVyIG9mIGNoYW5uZWxzCi0gKiBAcGFyYW0gYW1wbGl0dWRlMSBsZXZlbCBhdCBzdGFydCBvZiByYW1wLCBiZXR3ZWVuIDAuMCBhbmQgMS4wCi0gKiBAcGFyYW0gYW1wbGl0dWRlMiBsZXZlbCBhdCBlbmQgb2YgcmFtcCwgYmV0d2VlbiAwLjAgYW5kIDEuMAotICovCi12b2lkIEFBdWRpb0NvbnZlcnRfcGNtMTZUb0Zsb2F0KGNvbnN0IGludDE2X3QgKnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKmRlc3RpbmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzYW1wbGVzUGVyRnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZTIpOwotCi0vKioKLSAqIFNjYWxlIGZsb2F0cyBieSBhIGxpbmVhciByYW1wLgotICoKLSAqIFRoZSByYW1wIHN0b3BzIGp1c3Qgc2hvcnQgb2YgcmVhY2hpbmcgYW1wbGl0dWRlMiBzbyB0aGF0IHRoZSBuZXh0Ci0gKiByYW1wIGNhbiBzdGFydCBhdCBhbXBsaXR1ZGUyIHdpdGhvdXQgY2F1c2luZyBhIGRpc2NvbnRpbnVpdHkuCi0gKgotICogQHBhcmFtIHNvdXJjZQotICogQHBhcmFtIGRlc3RpbmF0aW9uCi0gKiBAcGFyYW0gbnVtRnJhbWVzCi0gKiBAcGFyYW0gc2FtcGxlc1BlckZyYW1lCi0gKiBAcGFyYW0gYW1wbGl0dWRlMQotICogQHBhcmFtIGFtcGxpdHVkZTIKLSAqLwotdm9pZCBBQXVkaW9fbGluZWFyUmFtcChjb25zdCBmbG9hdCAqc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqZGVzdGluYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNhbXBsZXNQZXJGcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlMSwKLSAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlMik7Ci0KLS8qKgotICogU2NhbGUgaW50MTZfdCdzIGJ5IGEgbGluZWFyIHJhbXAuCi0gKgotICogVGhlIHJhbXAgc3RvcHMganVzdCBzaG9ydCBvZiByZWFjaGluZyBhbXBsaXR1ZGUyIHNvIHRoYXQgdGhlIG5leHQKLSAqIHJhbXAgY2FuIHN0YXJ0IGF0IGFtcGxpdHVkZTIgd2l0aG91dCBjYXVzaW5nIGEgZGlzY29udGludWl0eS4KLSAqCi0gKiBAcGFyYW0gc291cmNlCi0gKiBAcGFyYW0gZGVzdGluYXRpb24KLSAqIEBwYXJhbSBudW1GcmFtZXMKLSAqIEBwYXJhbSBzYW1wbGVzUGVyRnJhbWUKLSAqIEBwYXJhbSBhbXBsaXR1ZGUxCi0gKiBAcGFyYW0gYW1wbGl0dWRlMgotICovCi12b2lkIEFBdWRpb19saW5lYXJSYW1wKGNvbnN0IGludDE2X3QgKnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqZGVzdGluYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNhbXBsZXNQZXJGcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlMSwKLSAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlMik7Ci0KLWNsYXNzIEFBdWRpb0RhdGFDb252ZXJ0ZXIgewotcHVibGljOgotCi0gICAgc3RydWN0IEZvcm1hdHRlZERhdGEgewotCi0gICAgICAgIEZvcm1hdHRlZERhdGEodm9pZCAqZGF0YSwgYWF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwgaW50MzJfdCBjaGFubmVsQ291bnQpCi0gICAgICAgICAgICA6IGRhdGEoZGF0YSkKLSAgICAgICAgICAgICwgZm9ybWF0KGZvcm1hdCkKLSAgICAgICAgICAgICwgY2hhbm5lbENvdW50KGNoYW5uZWxDb3VudCkge30KLQotICAgICAgICBjb25zdCB2b2lkICAgICAgICAgICAgKmRhdGEgPSBudWxscHRyOwotICAgICAgICBjb25zdCBhYXVkaW9fZm9ybWF0X3QgIGZvcm1hdCA9IEFBVURJT19GT1JNQVRfVU5TUEVDSUZJRUQ7Ci0gICAgICAgIGNvbnN0IGludDMyX3QgICAgICAgICAgY2hhbm5lbENvdW50ID0gMTsKLSAgICB9OwotCi0gICAgc3RhdGljIHZvaWQgY29udmVydChjb25zdCBGb3JtYXR0ZWREYXRhICZzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGb3JtYXR0ZWREYXRhICZkZXN0aW5hdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgbGV2ZWxGcm9tLAotICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgbGV2ZWxUbyk7Ci0KLXByaXZhdGU6Ci0gICAgc3RhdGljIHZvaWQgY29udmVydE1vbm9Ub1N0ZXJlbyhjb25zdCBGb3JtYXR0ZWREYXRhICZzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGb3JtYXR0ZWREYXRhICZkZXN0aW5hdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgbGV2ZWxGcm9tLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgbGV2ZWxUbyk7Ci0KLSAgICBzdGF0aWMgdm9pZCBjb252ZXJ0Q2hhbm5lbHNNYXRjaChjb25zdCBGb3JtYXR0ZWREYXRhICZzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRm9ybWF0dGVkRGF0YSAmZGVzdGluYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgbGV2ZWxGcm9tLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGxldmVsVG8pOwotfTsKLQotLyoqCiAgKiBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiBieXRlcyBhbmQgcHJldmVudCBudW1lcmljIG92ZXJmbG93LgogICogVGhlICpzaXplSW5CeXRlcyB3aWxsIGJlIHNldCB0byB6ZXJvIGlmIHRoZXJlIGlzIGFuIGVycm9yLgogICoKQEAgLTIzNCwxMiArODQsNiBAQAogICovCiBhdWRpb19zb3VyY2VfdCBBQXVkaW9Db252ZXJ0X2lucHV0UHJlc2V0VG9BdWRpb1NvdXJjZShhYXVkaW9faW5wdXRfcHJlc2V0X3QgcHJlc2V0KTsKIAotLyoqCi0gKiBAcmV0dXJuIHRoZSBzaXplIG9mIGEgc2FtcGxlIG9mIHRoZSBnaXZlbiBmb3JtYXQgaW4gYnl0ZXMgb3IgQUFVRElPX0VSUk9SX0lMTEVHQUxfQVJHVU1FTlQKLSAqLwotaW50MzJfdCBBQXVkaW9Db252ZXJ0X2Zvcm1hdFRvU2l6ZUluQnl0ZXMoYWF1ZGlvX2Zvcm1hdF90IGZvcm1hdCk7Ci0KLQogLy8gTm90ZSB0aGF0IHRoaXMgY29kZSBtYXkgYmUgcmVwbGFjZWQgYnkgU2V0dGluZ3Mgb3IgYnkgc29tZSBvdGhlciBzeXN0ZW0gY29uZmlndXJhdGlvbiB0b29sLgogCiAjZGVmaW5lIEFBVURJT19QUk9QX01NQVBfUE9MSUNZICAgICAgICAgICAiYWF1ZGlvLm1tYXBfcG9saWN5IgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0xpbmVhclJhbXAuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0xpbmVhclJhbXAuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzE0YmJmLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvdXRpbGl0eS9MaW5lYXJSYW1wLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJMaW5lYXJSYW1wLmgiCi0KLWJvb2wgTGluZWFyUmFtcDo6aXNSYW1waW5nKCkgewotICAgIGZsb2F0IHRhcmdldCA9IG1UYXJnZXQubG9hZCgpOwotICAgIGlmICh0YXJnZXQgIT0gbUxldmVsVG8pIHsKLSAgICAgICAgLy8gVXBkYXRlIHRhcmdldC4gQ29udGludWUgZnJvbSBwcmV2aW91cyBsZXZlbC4KLSAgICAgICAgbUxldmVsVG8gPSB0YXJnZXQ7Ci0gICAgICAgIG1SZW1haW5pbmcgPSBtTGVuZ3RoSW5GcmFtZXM7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBtUmVtYWluaW5nID4gMDsKLSAgICB9Ci19Ci0KLWJvb2wgTGluZWFyUmFtcDo6bmV4dFNlZ21lbnQoaW50MzJfdCBmcmFtZXMsIGZsb2F0ICpsZXZlbEZyb20sIGZsb2F0ICpsZXZlbFRvKSB7Ci0gICAgYm9vbCByYW1waW5nID0gaXNSYW1waW5nKCk7Ci0gICAgKmxldmVsRnJvbSA9IG1MZXZlbEZyb207Ci0gICAgaWYgKHJhbXBpbmcpIHsKLSAgICAgICAgZmxvYXQgbGV2ZWw7Ci0gICAgICAgIGlmIChmcmFtZXMgPj0gbVJlbWFpbmluZykgewotICAgICAgICAgICAgbGV2ZWwgPSBtTGV2ZWxUbzsKLSAgICAgICAgICAgIG1SZW1haW5pbmcgPSAwOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gSW50ZXJwb2xhdGUgdG8gYSBwb2ludCBhbG9uZyB0aGUgZnVsbCByYW1wLgotICAgICAgICAgICAgbGV2ZWwgPSBtTGV2ZWxGcm9tICsgKGZyYW1lcyAqIChtTGV2ZWxUbyAtIG1MZXZlbEZyb20pIC8gbVJlbWFpbmluZyk7Ci0gICAgICAgICAgICBtUmVtYWluaW5nIC09IGZyYW1lczsKLSAgICAgICAgfQotICAgICAgICBtTGV2ZWxGcm9tID0gbGV2ZWw7IC8vIGZvciBuZXh0IHJhbXAKLSAgICAgICAgKmxldmVsVG8gPSBsZXZlbDsKLSAgICB9IGVsc2UgewotICAgICAgICAqbGV2ZWxUbyA9IG1MZXZlbFRvOwotICAgIH0KLSAgICByZXR1cm4gcmFtcGluZzsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvTGluZWFyUmFtcC5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0xpbmVhclJhbXAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmIxYjhlMC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvTGluZWFyUmFtcC5oCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBQVVESU9fTElORUFSX1JBTVBfSAotI2RlZmluZSBBQVVESU9fTElORUFSX1JBTVBfSAotCi0jaW5jbHVkZSA8YXRvbWljPgotI2luY2x1ZGUgPHN0ZGludC5oPgotCi0vKioKLSAqIEdlbmVyYXRlIHNlZ21lbnRzIGFsb25nIGEgbGluZWFyIHJhbXAuCi0gKiBUaGUgcmFtcCB0YXJnZXQgY2FuIGJlIHVwZGF0ZWQgZnJvbSBhbm90aGVyIHRocmVhZC4KLSAqIFdoZW4gdGhlIHRhcmdldCBpcyB1cGRhdGVkLCBhIG5ldyByYW1wIGlzIHN0YXJ0ZWQgZnJvbSB0aGUgY3VycmVudCBwb3NpdGlvbi4KLSAqCi0gKiBUaGUgZmlyc3QgcmFtcCBzdGFydHMgYXQgMC4wLgotICoKLSAqLwotY2xhc3MgTGluZWFyUmFtcCB7Ci1wdWJsaWM6Ci0gICAgTGluZWFyUmFtcCgpIHsKLSAgICAgICAgbVRhcmdldC5zdG9yZSgxLjBmKTsKLSAgICB9Ci0KLSAgICB2b2lkIHNldExlbmd0aEluRnJhbWVzKGludDMyX3QgZnJhbWVzKSB7Ci0gICAgICAgIG1MZW5ndGhJbkZyYW1lcyA9IGZyYW1lczsKLSAgICB9Ci0KLSAgICBpbnQzMl90IGdldExlbmd0aEluRnJhbWVzKCkgewotICAgICAgICByZXR1cm4gbUxlbmd0aEluRnJhbWVzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgbWF5IGJlIGNhbGxlZCBieSBhbm90aGVyIHRocmVhZC4KLSAgICAgKiBAcGFyYW0gdGFyZ2V0Ci0gICAgICovCi0gICAgdm9pZCBzZXRUYXJnZXQoZmxvYXQgdGFyZ2V0KSB7Ci0gICAgICAgIG1UYXJnZXQuc3RvcmUodGFyZ2V0KTsKLSAgICB9Ci0KLSAgICBmbG9hdCBnZXRUYXJnZXQoKSB7Ci0gICAgICAgIHJldHVybiBtVGFyZ2V0LmxvYWQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGb3JjZSB0aGUgbmV4dFNlZ21lbnQgdG8gc3RhcnQgZnJvbSB0aGlzIGxldmVsLgotICAgICAqCi0gICAgICogV0FSTklORzogdGhpcyBjYW4gY2F1c2UgYSBkaXNjb250aW51aXR5IGlmIGNhbGxlZCB3aGlsZSB0aGUgcmFtcCBpcyBiZWluZyB1c2VkLgotICAgICAqIE9ubHkgY2FsbCB0aGlzIHdoZW4gc2V0dGluZyB0aGUgaW5pdGlhbCByYW1wLgotICAgICAqCi0gICAgICogQHBhcmFtIGxldmVsCi0gICAgICovCi0gICAgdm9pZCBmb3JjZUN1cnJlbnQoZmxvYXQgbGV2ZWwpIHsKLSAgICAgICAgbUxldmVsRnJvbSA9IGxldmVsOwotICAgICAgICBtTGV2ZWxUbyA9IGxldmVsOyAvLyBmb3JjZXMgYSByYW1wIGlmIGl0IGRvZXMgbm90IG1hdGNoIHRhcmdldAotICAgIH0KLQotICAgIGZsb2F0IGdldEN1cnJlbnQoKSB7Ci0gICAgICAgIHJldHVybiBtTGV2ZWxGcm9tOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBsZXZlbHMgZm9yIG5leHQgcmFtcCBzZWdtZW50LgotICAgICAqCi0gICAgICogQHBhcmFtIGZyYW1lcyBudW1iZXIgb2YgZnJhbWVzIGluIHRoZSBzZWdtZW50Ci0gICAgICogQHBhcmFtIGxldmVsRnJvbSBwb2ludGVyIHRvIHN0YXJ0aW5nIGFtcGxpdHVkZQotICAgICAqIEBwYXJhbSBsZXZlbFRvIHBvaW50ZXIgdG8gZW5kaW5nIGFtcGxpdHVkZQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiByYW1wIGlzIHN0aWxsIG1vdmluZyB0b3dhcmRzIHRoZSB0YXJnZXQKLSAgICAgKi8KLSAgICBib29sIG5leHRTZWdtZW50KGludDMyX3QgZnJhbWVzLCBmbG9hdCAqbGV2ZWxGcm9tLCBmbG9hdCAqbGV2ZWxUbyk7Ci0KLXByaXZhdGU6Ci0KLSAgICBib29sIGlzUmFtcGluZygpOwotCi0gICAgc3RkOjphdG9taWM8ZmxvYXQ+ICAgbVRhcmdldDsKLQotICAgIGludDMyX3QgbUxlbmd0aEluRnJhbWVzICA9IDQ4MDAwIC8gMTAwOyAvLyAxMCBtc2VjIGF0IDQ4MDAwIEh6Ci0gICAgaW50MzJfdCBtUmVtYWluaW5nICAgICAgID0gMDsKLSAgICBmbG9hdCAgIG1MZXZlbEZyb20gICAgICAgPSAwLjBmOwotICAgIGZsb2F0ICAgbUxldmVsVG8gICAgICAgICA9IDAuMGY7Ci19OwotCi0KLSNlbmRpZiAvL0FBVURJT19MSU5FQVJfUkFNUF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vdGVzdHMvQW5kcm9pZC5icCBiL21lZGlhL2xpYmFhdWRpby90ZXN0cy9BbmRyb2lkLmJwCmluZGV4IDY4MTk0ZGIuLjMxOTQ2N2UgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby90ZXN0cy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYmFhdWRpby90ZXN0cy9BbmRyb2lkLmJwCkBAIC0xOSw2ICsxOSwxOCBAQAogfQogCiBjY190ZXN0IHsKKyAgICBuYW1lOiAidGVzdF9jbG9ja19tb2RlbCIsCisgICAgZGVmYXVsdHM6IFsibGliYWF1ZGlvX3Rlc3RzX2RlZmF1bHRzIl0sCisgICAgc3JjczogWyJ0ZXN0X2Nsb2NrX21vZGVsLmNwcCJdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJhYXVkaW8iLAorICAgICAgICAibGliYXVkaW91dGlscyIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCit9CisKK2NjX3Rlc3QgewogICAgIG5hbWU6ICJ0ZXN0X2Jsb2NrX2FkYXB0ZXIiLAogICAgIGRlZmF1bHRzOiBbImxpYmFhdWRpb190ZXN0c19kZWZhdWx0cyJdLAogICAgIHNyY3M6IFsidGVzdF9ibG9ja19hZGFwdGVyLmNwcCJdLApAQCAtMzQsMTMgKzQ2LDYgQEAKIH0KIAogY2NfdGVzdCB7Ci0gICAgbmFtZTogInRlc3RfbGluZWFyX3JhbXAiLAotICAgIGRlZmF1bHRzOiBbImxpYmFhdWRpb190ZXN0c19kZWZhdWx0cyJdLAotICAgIHNyY3M6IFsidGVzdF9saW5lYXJfcmFtcC5jcHAiXSwKLSAgICBzaGFyZWRfbGliczogWyJsaWJhYXVkaW8iXSwKLX0KLQotY2NfdGVzdCB7CiAgICAgbmFtZTogInRlc3Rfb3Blbl9wYXJhbXMiLAogICAgIGRlZmF1bHRzOiBbImxpYmFhdWRpb190ZXN0c19kZWZhdWx0cyJdLAogICAgIHNyY3M6IFsidGVzdF9vcGVuX3BhcmFtcy5jcHAiXSwKQEAgLTE2NywzICsxNzIsMTUgQEAKICAgICBzcmNzOiBbInRlc3RfYXRvbWljX2ZpZm8uY3BwIl0sCiAgICAgc2hhcmVkX2xpYnM6IFsibGliYWF1ZGlvIl0sCiB9CisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJ0ZXN0X2Zsb3dncmFwaCIsCisgICAgZGVmYXVsdHM6IFsibGliYWF1ZGlvX3Rlc3RzX2RlZmF1bHRzIl0sCisgICAgc3JjczogWyJ0ZXN0X2Zsb3dncmFwaC5jcHAiXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYWF1ZGlvIiwKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9hdG9taWNfZmlmby5jcHAgYi9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9hdG9taWNfZmlmby5jcHAKaW5kZXggMDA4NTIxNy4uYTA5Yjc0YyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfYXRvbWljX2ZpZm8uY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X2F0b21pY19maWZvLmNwcApAQCAtOTYsMTQgKzk2LDE0IEBACiAgICAgdm9pZCBjaGVja1dyYXBwaW5nQnVmZmVyKCkgewogICAgICAgICBXcmFwcGluZ0J1ZmZlciB3cmFwcGluZ0J1ZmZlcjsKICAgICAgICAgZmlmb19mcmFtZXNfdCBmcmFtZXNBdmFpbGFibGUgPQotICAgICAgICAgICAgICAgIG1GaWZvQnVmZmVyLmdldEZpZm9Db250cm9sbGVyQmFzZSgpLT5nZXRFbXB0eUZyYW1lc0F2YWlsYWJsZSgpOworICAgICAgICAgICAgICAgIG1GaWZvQnVmZmVyLmdldEVtcHR5RnJhbWVzQXZhaWxhYmxlKCk7CiAgICAgICAgIGZpZm9fZnJhbWVzX3Qgd3JhcEF2YWlsYWJsZSA9IG1GaWZvQnVmZmVyLmdldEVtcHR5Um9vbUF2YWlsYWJsZSgmd3JhcHBpbmdCdWZmZXIpOwogICAgICAgICBFWFBFQ1RfRVEoZnJhbWVzQXZhaWxhYmxlLCB3cmFwQXZhaWxhYmxlKTsKICAgICAgICAgZmlmb19mcmFtZXNfdCBib3RoQXZhaWxhYmxlID0gd3JhcHBpbmdCdWZmZXIubnVtRnJhbWVzWzBdICsgd3JhcHBpbmdCdWZmZXIubnVtRnJhbWVzWzFdOwogICAgICAgICBFWFBFQ1RfRVEoZnJhbWVzQXZhaWxhYmxlLCBib3RoQXZhaWxhYmxlKTsKIAogICAgICAgICBmcmFtZXNBdmFpbGFibGUgPQotICAgICAgICAgICAgICAgIG1GaWZvQnVmZmVyLmdldEZpZm9Db250cm9sbGVyQmFzZSgpLT5nZXRGdWxsRnJhbWVzQXZhaWxhYmxlKCk7CisgICAgICAgICAgICAgICAgbUZpZm9CdWZmZXIuZ2V0RnVsbEZyYW1lc0F2YWlsYWJsZSgpOwogICAgICAgICB3cmFwQXZhaWxhYmxlID0gbUZpZm9CdWZmZXIuZ2V0RnVsbERhdGFBdmFpbGFibGUoJndyYXBwaW5nQnVmZmVyKTsKICAgICAgICAgRVhQRUNUX0VRKGZyYW1lc0F2YWlsYWJsZSwgd3JhcEF2YWlsYWJsZSk7CiAgICAgICAgIGJvdGhBdmFpbGFibGUgPSB3cmFwcGluZ0J1ZmZlci5udW1GcmFtZXNbMF0gKyB3cmFwcGluZ0J1ZmZlci5udW1GcmFtZXNbMV07CkBAIC0xMTMsNyArMTEzLDcgQEAKICAgICAvLyBXcml0ZSBkYXRhIGJ1dCBkbyBub3Qgb3ZlcmZsb3cuCiAgICAgdm9pZCB3cml0ZURhdGEoZmlmb19mcmFtZXNfdCBudW1GcmFtZXMpIHsKICAgICAgICAgZmlmb19mcmFtZXNfdCBmcmFtZXNBdmFpbGFibGUgPQotICAgICAgICAgICAgICAgIG1GaWZvQnVmZmVyLmdldEZpZm9Db250cm9sbGVyQmFzZSgpLT5nZXRFbXB0eUZyYW1lc0F2YWlsYWJsZSgpOworICAgICAgICAgICAgICAgIG1GaWZvQnVmZmVyLmdldEVtcHR5RnJhbWVzQXZhaWxhYmxlKCk7CiAgICAgICAgIGZpZm9fZnJhbWVzX3QgZnJhbWVzVG9Xcml0ZSA9IHN0ZDo6bWluKGZyYW1lc0F2YWlsYWJsZSwgbnVtRnJhbWVzKTsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFtZXNUb1dyaXRlOyBpKyspIHsKICAgICAgICAgICAgIG1EYXRhW2ldID0gbU5leHRXcml0ZUluZGV4Kys7CkBAIC0xMjUsNyArMTI1LDcgQEAKICAgICAvLyBSZWFkIGRhdGEgYnV0IGRvIG5vdCB1bmRlcmZsb3cuCiAgICAgdm9pZCB2ZXJpZnlEYXRhKGZpZm9fZnJhbWVzX3QgbnVtRnJhbWVzKSB7CiAgICAgICAgIGZpZm9fZnJhbWVzX3QgZnJhbWVzQXZhaWxhYmxlID0KLSAgICAgICAgICAgICAgICBtRmlmb0J1ZmZlci5nZXRGaWZvQ29udHJvbGxlckJhc2UoKS0+Z2V0RnVsbEZyYW1lc0F2YWlsYWJsZSgpOworICAgICAgICAgICAgICAgIG1GaWZvQnVmZmVyLmdldEZ1bGxGcmFtZXNBdmFpbGFibGUoKTsKICAgICAgICAgZmlmb19mcmFtZXNfdCBmcmFtZXNUb1JlYWQgPSBzdGQ6Om1pbihmcmFtZXNBdmFpbGFibGUsIG51bUZyYW1lcyk7CiAgICAgICAgIGZpZm9fZnJhbWVzX3QgYWN0dWFsID0gbUZpZm9CdWZmZXIucmVhZChtRGF0YSwgZnJhbWVzVG9SZWFkKTsKICAgICAgICAgQVNTRVJUX0VRKGZyYW1lc1RvUmVhZCwgYWN0dWFsKTsKQEAgLTE3OCwxMiArMTc4LDEyIEBACiAgICAgdm9pZCBjaGVja1JhbmRvbVdyaXRlUmVhZCgpIHsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyMDsgaSsrKSB7CiAgICAgICAgICAgICBmaWZvX2ZyYW1lc190IGZyYW1lc0VtcHR5ID0KLSAgICAgICAgICAgICAgICAgICAgbUZpZm9CdWZmZXIuZ2V0Rmlmb0NvbnRyb2xsZXJCYXNlKCktPmdldEVtcHR5RnJhbWVzQXZhaWxhYmxlKCk7CisgICAgICAgICAgICAgICAgICAgIG1GaWZvQnVmZmVyLmdldEVtcHR5RnJhbWVzQXZhaWxhYmxlKCk7CiAgICAgICAgICAgICBmaWZvX2ZyYW1lc190IG51bUZyYW1lcyA9IChmaWZvX2ZyYW1lc190KShkcmFuZDQ4KCkgKiBmcmFtZXNFbXB0eSk7CiAgICAgICAgICAgICB3cml0ZURhdGEobnVtRnJhbWVzKTsKIAogICAgICAgICAgICAgZmlmb19mcmFtZXNfdCBmcmFtZXNGdWxsID0KLSAgICAgICAgICAgICAgICAgICAgbUZpZm9CdWZmZXIuZ2V0Rmlmb0NvbnRyb2xsZXJCYXNlKCktPmdldEZ1bGxGcmFtZXNBdmFpbGFibGUoKTsKKyAgICAgICAgICAgICAgICAgICAgbUZpZm9CdWZmZXIuZ2V0RnVsbEZyYW1lc0F2YWlsYWJsZSgpOwogICAgICAgICAgICAgbnVtRnJhbWVzID0gKGZpZm9fZnJhbWVzX3QpKGRyYW5kNDgoKSAqIGZyYW1lc0Z1bGwpOwogICAgICAgICAgICAgdmVyaWZ5RGF0YShudW1GcmFtZXMpOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9jbG9ja19tb2RlbC5jcHAgYi9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9jbG9ja19tb2RlbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2MwOTAyNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X2Nsb2NrX21vZGVsLmNwcApAQCAtMCwwICsxLDExNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIFVuaXQgdGVzdHMgZm9yIElzb2Nocm9ub3VzIENsb2NrIE1vZGVsCisKKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKworI2luY2x1ZGUgPGFhdWRpby9BQXVkaW8uaD4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9jbG9jay5oPgorI2luY2x1ZGUgPGNsaWVudC9Jc29jaHJvbm91c0Nsb2NrTW9kZWwuaD4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCit1c2luZyBuYW1lc3BhY2UgYWF1ZGlvOworCisvLyBXZSBjYW4gdXNlIGFyYml0cmFyeSB2YWx1ZXMgaGVyZSBiZWNhdXNlIHdlIGFyZSBub3Qgb3BlbmluZyBhIHJlYWwgYXVkaW8gc3RyZWFtLgorI2RlZmluZSBTQU1QTEVfUkFURSAgICAgICAgICAgICA0ODAwMAorI2RlZmluZSBIV19GUkFNRVNfUEVSX0JVUlNUICAgICA0OAorI2RlZmluZSBOQU5PU19QRVJfQlVSU1QgICAgICAgICAoTkFOT1NfUEVSX1NFQ09ORCAqIEhXX0ZSQU1FU19QRVJfQlVSU1QgLyBTQU1QTEVfUkFURSkKKworY2xhc3MgQ2xvY2tNb2RlbFRlc3RGaXh0dXJlOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKK3B1YmxpYzoKKyAgICBDbG9ja01vZGVsVGVzdEZpeHR1cmUoKSB7CisgICAgfQorCisgICAgdm9pZCBTZXRVcCgpIHsKKyAgICAgICAgbW9kZWwuc2V0U2FtcGxlUmF0ZShTQU1QTEVfUkFURSk7CisgICAgICAgIG1vZGVsLnNldEZyYW1lc1BlckJ1cnN0KEhXX0ZSQU1FU19QRVJfQlVSU1QpOworICAgIH0KKworICAgIHZvaWQgVGVhckRvd24oKSB7CisKKyAgICB9CisKKyAgICB+Q2xvY2tNb2RlbFRlc3RGaXh0dXJlKCkgIHsKKyAgICAgICAgLy8gY2xlYW51cCBhbnkgcGVuZGluZyBzdHVmZiwgYnV0IG5vIGV4Y2VwdGlvbnMgYWxsb3dlZAorICAgIH0KKworICAgIElzb2Nocm9ub3VzQ2xvY2tNb2RlbCBtb2RlbDsKK307CisKKy8vIENoZWNrIGRlZmF1bHQgc2V0dXAuCitURVNUX0YoQ2xvY2tNb2RlbFRlc3RGaXh0dXJlLCBjbG9ja19zZXR1cCkgeworICAgIEFTU0VSVF9FUShTQU1QTEVfUkFURSwgbW9kZWwuZ2V0U2FtcGxlUmF0ZSgpKTsKKyAgICBBU1NFUlRfRVEoSFdfRlJBTUVTX1BFUl9CVVJTVCwgbW9kZWwuZ2V0RnJhbWVzUGVyQnVyc3QoKSk7Cit9CisKKy8vIFRlc3QgZGVsdGEgY2FsY3VsYXRpb25zLgorVEVTVF9GKENsb2NrTW9kZWxUZXN0Rml4dHVyZSwgY2xvY2tfZGVsdGFzKSB7CisgICAgaW50NjRfdCBwb3NpdGlvbiA9IG1vZGVsLmNvbnZlcnREZWx0YVRpbWVUb1Bvc2l0aW9uKE5BTk9TX1BFUl9TRUNPTkQpOworICAgIEFTU0VSVF9FUShTQU1QTEVfUkFURSwgcG9zaXRpb24pOworCisgICAgLy8gRGVsdGFzIGFyZSBub3QgcXVhbnRpemVkLgorICAgIC8vIENvbXBhcmUgdGltZSB0byB0aGUgZXF1aXZhbGVudCBwb3NpdGlvbiBpbiBmcmFtZXMuCisgICAgY29uc3RleHByIGludDY0X3Qga05hbm9zUGVyQnVyc3QgPSBIV19GUkFNRVNfUEVSX0JVUlNUICogTkFOT1NfUEVSX1NFQ09ORCAvIFNBTVBMRV9SQVRFOworICAgIHBvc2l0aW9uID0gbW9kZWwuY29udmVydERlbHRhVGltZVRvUG9zaXRpb24oTkFOT1NfUEVSX1NFQ09ORCArIChrTmFub3NQZXJCdXJzdCAvIDIpKTsKKyAgICBBU1NFUlRfRVEoU0FNUExFX1JBVEUgKyAoSFdfRlJBTUVTX1BFUl9CVVJTVCAvIDIpLCBwb3NpdGlvbik7CisKKyAgICBpbnQ2NF90IHRpbWUgPSBtb2RlbC5jb252ZXJ0RGVsdGFQb3NpdGlvblRvVGltZShTQU1QTEVfUkFURSk7CisgICAgQVNTRVJUX0VRKE5BTk9TX1BFUl9TRUNPTkQsIHRpbWUpOworCisgICAgLy8gQ29tcGFyZSBwb3NpdGlvbiBpbiBmcmFtZXMgdG8gdGhlIGVxdWl2YWxlbnQgdGltZS4KKyAgICB0aW1lID0gbW9kZWwuY29udmVydERlbHRhUG9zaXRpb25Ub1RpbWUoU0FNUExFX1JBVEUgKyAoSFdfRlJBTUVTX1BFUl9CVVJTVCAvIDIpKTsKKyAgICBBU1NFUlRfRVEoTkFOT1NfUEVSX1NFQ09ORCArIChrTmFub3NQZXJCdXJzdCAvIDIpLCB0aW1lKTsKK30KKworLy8gc3RhcnQoKSBzaG91bGQgZm9yY2UgdGhlIGludGVybmFsIG1hcmtlcnMKK1RFU1RfRihDbG9ja01vZGVsVGVzdEZpeHR1cmUsIGNsb2NrX3N0YXJ0KSB7CisgICAgY29uc3QgaW50NjRfdCBzdGFydFRpbWUgPSAxMDAwMDA7CisgICAgbW9kZWwuc3RhcnQoc3RhcnRUaW1lKTsKKworICAgIGludDY0X3QgcG9zaXRpb24gPSBtb2RlbC5jb252ZXJ0VGltZVRvUG9zaXRpb24oc3RhcnRUaW1lKTsKKyAgICBFWFBFQ1RfRVEoMCwgcG9zaXRpb24pOworCisgICAgaW50NjRfdCB0aW1lID0gbW9kZWwuY29udmVydFBvc2l0aW9uVG9UaW1lKHBvc2l0aW9uKTsKKyAgICBFWFBFQ1RfRVEoc3RhcnRUaW1lLCB0aW1lKTsKKworICAgIHRpbWUgPSBzdGFydFRpbWUgKyAoNTAwICogTkFOT1NfUEVSX01JQ1JPU0VDT05EKTsKKyAgICBwb3NpdGlvbiA9IG1vZGVsLmNvbnZlcnRUaW1lVG9Qb3NpdGlvbih0aW1lKTsKKyAgICBFWFBFQ1RfRVEoMCwgcG9zaXRpb24pOworfQorCisvLyB0aW1lc3RhbXBzIG1vdmVzIHRoZSB3aW5kb3cgaWYgb3V0c2lkZSB0aGUgYm91bmRzCisvLyBUT0RPIHRlc3QgbnVkZ2luZyB0aGUgd2luZG93CitURVNUX0YoQ2xvY2tNb2RlbFRlc3RGaXh0dXJlLCBjbG9ja190aW1lc3RhbXApIHsKKyAgICBjb25zdCBpbnQ2NF90IHN0YXJ0VGltZSA9IDEwMDAwMDAwMDsKKyAgICBtb2RlbC5zdGFydChzdGFydFRpbWUpOworCisgICAgY29uc3QgaW50NjRfdCBwb3NpdGlvbiA9IEhXX0ZSQU1FU19QRVJfQlVSU1Q7IC8vIGhhcmR3YXJlCisgICAgaW50NjRfdCBtYXJrZXJUaW1lID0gc3RhcnRUaW1lICsgTkFOT1NfUEVSX01JTExJU0VDT05EICsgKDIwMCAqIE5BTk9TX1BFUl9NSUNST1NFQ09ORCk7CisKKyAgICAvLyBTaG91bGQgc2V0IG1hcmtlci4KKyAgICBtb2RlbC5wcm9jZXNzVGltZXN0YW1wKHBvc2l0aW9uLCBtYXJrZXJUaW1lKTsKKyAgICBFWFBFQ1RfRVEocG9zaXRpb24sIG1vZGVsLmNvbnZlcnRUaW1lVG9Qb3NpdGlvbihtYXJrZXJUaW1lKSk7CisKKyAgICAvLyBjb252ZXJ0VGltZVRvUG9zaXRpb24gcm91bmRzIGRvd24KKyAgICBFWFBFQ1RfRVEocG9zaXRpb24sIG1vZGVsLmNvbnZlcnRUaW1lVG9Qb3NpdGlvbihtYXJrZXJUaW1lICsgKDczICogTkFOT1NfUEVSX01JQ1JPU0VDT05EKSkpOworCisgICAgLy8gY29udmVydFBvc2l0aW9uVG9UaW1lIHJvdW5kcyB1cAorICAgIEVYUEVDVF9FUShtYXJrZXJUaW1lICsgTkFOT1NfUEVSX0JVUlNULCBtb2RlbC5jb252ZXJ0UG9zaXRpb25Ub1RpbWUocG9zaXRpb24gKyAxNykpOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfZmxvd2dyYXBoLmNwcCBiL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X2Zsb3dncmFwaC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDU2M2E3ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X2Zsb3dncmFwaC5jcHAKQEAgLTAsMCArMSwxNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qCisgKiBUZXN0IEZsb3dHcmFwaAorICovCisKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlICJmbG93Z3JhcGgvQ2xpcFRvUmFuZ2UuaCIKKyNpbmNsdWRlICJmbG93Z3JhcGgvTW9ub1RvTXVsdGlDb252ZXJ0ZXIuaCIKKyNpbmNsdWRlICJmbG93Z3JhcGgvU291cmNlRmxvYXQuaCIKKyNpbmNsdWRlICJmbG93Z3JhcGgvUmFtcExpbmVhci5oIgorI2luY2x1ZGUgImZsb3dncmFwaC9TaW5rRmxvYXQuaCIKKyNpbmNsdWRlICJmbG93Z3JhcGgvU2lua0kxNi5oIgorI2luY2x1ZGUgImZsb3dncmFwaC9TaW5rSTI0LmgiCisjaW5jbHVkZSAiZmxvd2dyYXBoL1NvdXJjZUkxNi5oIgorI2luY2x1ZGUgImZsb3dncmFwaC9Tb3VyY2VJMjQuaCIKKwordXNpbmcgbmFtZXNwYWNlIGZsb3dncmFwaDsKKworY29uc3RleHByIGludCBrQnl0ZXNQZXJJMjRQYWNrZWQgPSAzOworCitURVNUKHRlc3RfZmxvd2dyYXBoLCBtb2R1bGVfc2lua2kxNikgeworICAgIHN0YXRpYyBjb25zdCBmbG9hdCBpbnB1dFtdID0gezEuMGYsIDAuNWYsIC0wLjI1ZiwgLTEuMGYsIDAuMGYsIDUzLjlmLCAtODcuMmZ9OworICAgIHN0YXRpYyBjb25zdCBpbnQxNl90IGV4cGVjdGVkW10gPSB7MzI3NjcsIDE2Mzg0LCAtODE5MiwgLTMyNzY4LCAwLCAzMjc2NywgLTMyNzY4fTsKKyAgICBpbnQxNl90IG91dHB1dFsyMF07CisgICAgU291cmNlRmxvYXQgc291cmNlRmxvYXR7MX07CisgICAgU2lua0kxNiBzaW5rSTE2ezF9OworCisgICAgaW50IG51bUlucHV0RnJhbWVzID0gc2l6ZW9mKGlucHV0KSAvIHNpemVvZihpbnB1dFswXSk7CisgICAgc291cmNlRmxvYXQuc2V0RGF0YShpbnB1dCwgbnVtSW5wdXRGcmFtZXMpOworICAgIHNvdXJjZUZsb2F0Lm91dHB1dC5jb25uZWN0KCZzaW5rSTE2LmlucHV0KTsKKworICAgIGludCBudW1PdXRwdXRGcmFtZXMgPSBzaXplb2Yob3V0cHV0KSAvIHNpemVvZihpbnQxNl90KTsKKyAgICBpbnQzMl90IG51bVJlYWQgPSBzaW5rSTE2LnJlYWQob3V0cHV0LCBudW1PdXRwdXRGcmFtZXMpOworICAgIEFTU0VSVF9FUShudW1JbnB1dEZyYW1lcywgbnVtUmVhZCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1SZWFkOyBpKyspIHsKKyAgICAgICAgRVhQRUNUX0VRKGV4cGVjdGVkW2ldLCBvdXRwdXRbaV0pOworICAgIH0KK30KKworVEVTVCh0ZXN0X2Zsb3dncmFwaCwgbW9kdWxlX21vbm9fdG9fc3RlcmVvKSB7CisgICAgc3RhdGljIGNvbnN0IGZsb2F0IGlucHV0W10gPSB7MS4wZiwgMi4wZiwgMy4wZn07CisgICAgZmxvYXQgb3V0cHV0WzEwMF0gPSB7fTsKKyAgICBTb3VyY2VGbG9hdCBzb3VyY2VGbG9hdHsxfTsKKyAgICBNb25vVG9NdWx0aUNvbnZlcnRlciBtb25vVG9TdGVyZW97Mn07CisgICAgU2lua0Zsb2F0IHNpbmtGbG9hdHsyfTsKKworICAgIHNvdXJjZUZsb2F0LnNldERhdGEoaW5wdXQsIDMpOworCisgICAgc291cmNlRmxvYXQub3V0cHV0LmNvbm5lY3QoJm1vbm9Ub1N0ZXJlby5pbnB1dCk7CisgICAgbW9ub1RvU3RlcmVvLm91dHB1dC5jb25uZWN0KCZzaW5rRmxvYXQuaW5wdXQpOworCisgICAgaW50MzJfdCBudW1SZWFkID0gc2lua0Zsb2F0LnJlYWQob3V0cHV0LCA4KTsKKyAgICBBU1NFUlRfRVEoMywgbnVtUmVhZCk7CisgICAgRVhQRUNUX0VRKGlucHV0WzBdLCBvdXRwdXRbMF0pOworICAgIEVYUEVDVF9FUShpbnB1dFswXSwgb3V0cHV0WzFdKTsKKyAgICBFWFBFQ1RfRVEoaW5wdXRbMV0sIG91dHB1dFsyXSk7CisgICAgRVhQRUNUX0VRKGlucHV0WzFdLCBvdXRwdXRbM10pOworfQorCitURVNUKHRlc3RfZmxvd2dyYXBoLCBtb2R1bGVfcmFtcF9saW5lYXIpIHsKKyAgICBjb25zdGV4cHIgaW50IHJhbXBTaXplID0gNTsKKyAgICBjb25zdGV4cHIgaW50IG51bU91dHB1dCA9IDEwMDsKKyAgICBjb25zdGV4cHIgZmxvYXQgdmFsdWUgPSAxLjBmOworICAgIGNvbnN0ZXhwciBmbG9hdCB0YXJnZXQgPSAxMDAuMGY7CisgICAgZmxvYXQgb3V0cHV0W251bU91dHB1dF0gPSB7fTsKKyAgICBSYW1wTGluZWFyIHJhbXBMaW5lYXJ7MX07CisgICAgU2lua0Zsb2F0IHNpbmtGbG9hdHsxfTsKKworICAgIHJhbXBMaW5lYXIuaW5wdXQuc2V0VmFsdWUodmFsdWUpOworICAgIHJhbXBMaW5lYXIuc2V0TGVuZ3RoSW5GcmFtZXMocmFtcFNpemUpOworICAgIHJhbXBMaW5lYXIuc2V0VGFyZ2V0KHRhcmdldCk7CisgICAgcmFtcExpbmVhci5mb3JjZUN1cnJlbnQoMC4wZik7CisKKyAgICByYW1wTGluZWFyLm91dHB1dC5jb25uZWN0KCZzaW5rRmxvYXQuaW5wdXQpOworCisgICAgaW50MzJfdCBudW1SZWFkID0gc2lua0Zsb2F0LnJlYWQob3V0cHV0LCBudW1PdXRwdXQpOworICAgIEFTU0VSVF9FUShudW1PdXRwdXQsIG51bVJlYWQpOworICAgIGNvbnN0ZXhwciBmbG9hdCB0b2xlcmFuY2UgPSAwLjAwMDFmOyAvLyBhcmJpdHJhcnkKKyAgICBpbnQgaSA9IDA7CisgICAgZm9yICg7IGkgPCByYW1wU2l6ZTsgaSsrKSB7CisgICAgICAgIGZsb2F0IGV4cGVjdGVkID0gaSAqIHZhbHVlICogdGFyZ2V0IC8gcmFtcFNpemU7CisgICAgICAgIEVYUEVDVF9ORUFSKGV4cGVjdGVkLCBvdXRwdXRbaV0sIHRvbGVyYW5jZSk7CisgICAgfQorICAgIGZvciAoOyBpIDwgbnVtT3V0cHV0OyBpKyspIHsKKyAgICAgICAgZmxvYXQgZXhwZWN0ZWQgPSB2YWx1ZSAqIHRhcmdldDsKKyAgICAgICAgRVhQRUNUX05FQVIoZXhwZWN0ZWQsIG91dHB1dFtpXSwgdG9sZXJhbmNlKTsKKyAgICB9Cit9CisKKy8vIEl0IGlzIGVhc2llc3QgdG8gcmVwcmVzZW50IHBhY2tlZCAyNC1iaXQgZGF0YSBhcyBhIGJ5dGUgYXJyYXkuCisvLyBUaGlzIHRlc3Qgd2lsbCByZWFkIGZyb20gaW5wdXQsIGNvbnZlcnQgdG8gZmxvYXQsIHRoZW4gd3JpdGUKKy8vIGJhY2sgdG8gb3V0cHV0IGFzIGJ5dGVzLgorVEVTVCh0ZXN0X2Zsb3dncmFwaCwgbW9kdWxlX3BhY2tlZF8yNCkgeworICAgIHN0YXRpYyBjb25zdCB1aW50OF90IGlucHV0W10gPSB7MHgwMSwgMHgyMywgMHg0NSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NjcsIDB4ODksIDB4QUIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweENELCAweEVGLCAweDVBfTsKKyAgICB1aW50OF90IG91dHB1dFs5OV0gPSB7fTsKKyAgICBTb3VyY2VJMjQgc291cmNlSTI0ezF9OworICAgIFNpbmtJMjQgc2lua0kyNHsxfTsKKworICAgIGludCBudW1JbnB1dEZyYW1lcyA9IHNpemVvZihpbnB1dCkgLyBrQnl0ZXNQZXJJMjRQYWNrZWQ7CisgICAgc291cmNlSTI0LnNldERhdGEoaW5wdXQsIG51bUlucHV0RnJhbWVzKTsKKyAgICBzb3VyY2VJMjQub3V0cHV0LmNvbm5lY3QoJnNpbmtJMjQuaW5wdXQpOworCisgICAgaW50MzJfdCBudW1SZWFkID0gc2lua0kyNC5yZWFkKG91dHB1dCwgc2l6ZW9mKG91dHB1dCkgLyBrQnl0ZXNQZXJJMjRQYWNrZWQpOworICAgIEFTU0VSVF9FUShudW1JbnB1dEZyYW1lcywgbnVtUmVhZCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplb2YoaW5wdXQpOyBpKyspIHsKKyAgICAgICAgRVhQRUNUX0VRKGlucHV0W2ldLCBvdXRwdXRbaV0pOworICAgIH0KK30KKworVEVTVCh0ZXN0X2Zsb3dncmFwaCwgbW9kdWxlX2NsaXBfdG9fcmFuZ2UpIHsKKyAgICBjb25zdGV4cHIgZmxvYXQgbXlNaW4gPSAtMi4wZjsKKyAgICBjb25zdGV4cHIgZmxvYXQgbXlNYXggPSAxLjVmOworCisgICAgc3RhdGljIGNvbnN0IGZsb2F0IGlucHV0W10gPSB7LTkuNywgMC41ZiwgLTAuMjUsIDEuMGYsIDEyLjN9OworICAgIHN0YXRpYyBjb25zdCBmbG9hdCBleHBlY3RlZFtdID0ge215TWluLCAwLjVmLCAtMC4yNSwgMS4wZiwgbXlNYXh9OworICAgIGZsb2F0IG91dHB1dFsxMDBdOworICAgIFNvdXJjZUZsb2F0IHNvdXJjZUZsb2F0ezF9OworICAgIENsaXBUb1JhbmdlIGNsaXBwZXJ7MX07CisgICAgU2lua0Zsb2F0IHNpbmtGbG9hdHsxfTsKKworICAgIGludCBudW1JbnB1dEZyYW1lcyA9IHNpemVvZihpbnB1dCkgLyBzaXplb2YoaW5wdXRbMF0pOworICAgIHNvdXJjZUZsb2F0LnNldERhdGEoaW5wdXQsIG51bUlucHV0RnJhbWVzKTsKKworICAgIGNsaXBwZXIuc2V0TWluaW11bShteU1pbik7CisgICAgY2xpcHBlci5zZXRNYXhpbXVtKG15TWF4KTsKKworICAgIHNvdXJjZUZsb2F0Lm91dHB1dC5jb25uZWN0KCZjbGlwcGVyLmlucHV0KTsKKyAgICBjbGlwcGVyLm91dHB1dC5jb25uZWN0KCZzaW5rRmxvYXQuaW5wdXQpOworCisgICAgaW50IG51bU91dHB1dEZyYW1lcyA9IHNpemVvZihvdXRwdXQpIC8gc2l6ZW9mKG91dHB1dFswXSk7CisgICAgaW50MzJfdCBudW1SZWFkID0gc2lua0Zsb2F0LnJlYWQob3V0cHV0LCBudW1PdXRwdXRGcmFtZXMpOworICAgIEFTU0VSVF9FUShudW1JbnB1dEZyYW1lcywgbnVtUmVhZCk7CisgICAgY29uc3RleHByIGZsb2F0IHRvbGVyYW5jZSA9IDAuMDAwMDAxZjsgLy8gYXJiaXRyYXJ5CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1SZWFkOyBpKyspIHsKKyAgICAgICAgRVhQRUNUX05FQVIoZXhwZWN0ZWRbaV0sIG91dHB1dFtpXSwgdG9sZXJhbmNlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9saW5lYXJfcmFtcC5jcHAgYi9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9saW5lYXJfcmFtcC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzMjI2YmEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfbGluZWFyX3JhbXAuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTgwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8bWF0aC5oPgotCi0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLQotI2luY2x1ZGUgInV0aWxpdHkvQUF1ZGlvVXRpbGl0aWVzLmgiCi0jaW5jbHVkZSAidXRpbGl0eS9MaW5lYXJSYW1wLmgiCi0KLVRFU1QodGVzdF9saW5lYXJfcmFtcCwgbGluZWFyX3JhbXBfc2VnbWVudHMpIHsKLSAgICBMaW5lYXJSYW1wIHJhbXA7Ci0gICAgY29uc3QgZmxvYXQgc291cmNlWzRdID0gezEuMGYsIDEuMGYsIDEuMGYsIDEuMGYgfTsKLSAgICBmbG9hdCBkZXN0aW5hdGlvbls0XSA9IHsxLjBmLCAxLjBmLCAxLjBmLCAxLjBmIH07Ci0KLSAgICBmbG9hdCBsZXZlbEZyb20gPSAtMS4wZjsKLSAgICBmbG9hdCBsZXZlbFRvID0gLTEuMGY7Ci0gICAgcmFtcC5zZXRMZW5ndGhJbkZyYW1lcyg4KTsKLSAgICByYW1wLnNldFRhcmdldCg4LjBmKTsKLQotICAgIEVYUEVDVF9FUSg4LCByYW1wLmdldExlbmd0aEluRnJhbWVzKCkpOwotCi0gICAgYm9vbCByYW1waW5nID0gcmFtcC5uZXh0U2VnbWVudCg0LCAmbGV2ZWxGcm9tLCAmbGV2ZWxUbyk7Ci0gICAgRVhQRUNUX0VRKDEsIHJhbXBpbmcpOwotICAgIEVYUEVDVF9FUSgwLjBmLCBsZXZlbEZyb20pOwotICAgIEVYUEVDVF9FUSg0LjBmLCBsZXZlbFRvKTsKLQotICAgIEFBdWRpb19saW5lYXJSYW1wKHNvdXJjZSwgZGVzdGluYXRpb24sIDQsIDEsIGxldmVsRnJvbSwgbGV2ZWxUbyk7Ci0gICAgRVhQRUNUX0VRKDAuMGYsIGRlc3RpbmF0aW9uWzBdKTsKLSAgICBFWFBFQ1RfRVEoMS4wZiwgZGVzdGluYXRpb25bMV0pOwotICAgIEVYUEVDVF9FUSgyLjBmLCBkZXN0aW5hdGlvblsyXSk7Ci0gICAgRVhQRUNUX0VRKDMuMGYsIGRlc3RpbmF0aW9uWzNdKTsKLQotICAgIHJhbXBpbmcgPSByYW1wLm5leHRTZWdtZW50KDQsICZsZXZlbEZyb20sICZsZXZlbFRvKTsKLSAgICBFWFBFQ1RfRVEoMSwgcmFtcGluZyk7Ci0gICAgRVhQRUNUX0VRKDQuMGYsIGxldmVsRnJvbSk7Ci0gICAgRVhQRUNUX0VRKDguMGYsIGxldmVsVG8pOwotCi0gICAgQUF1ZGlvX2xpbmVhclJhbXAoc291cmNlLCBkZXN0aW5hdGlvbiwgNCwgMSwgbGV2ZWxGcm9tLCBsZXZlbFRvKTsKLSAgICBFWFBFQ1RfRVEoNC4wZiwgZGVzdGluYXRpb25bMF0pOwotICAgIEVYUEVDVF9FUSg1LjBmLCBkZXN0aW5hdGlvblsxXSk7Ci0gICAgRVhQRUNUX0VRKDYuMGYsIGRlc3RpbmF0aW9uWzJdKTsKLSAgICBFWFBFQ1RfRVEoNy4wZiwgZGVzdGluYXRpb25bM10pOwotCi0gICAgcmFtcGluZyA9IHJhbXAubmV4dFNlZ21lbnQoNCwgJmxldmVsRnJvbSwgJmxldmVsVG8pOwotICAgIEVYUEVDVF9FUSgwLCByYW1waW5nKTsKLSAgICBFWFBFQ1RfRVEoOC4wZiwgbGV2ZWxGcm9tKTsKLSAgICBFWFBFQ1RfRVEoOC4wZiwgbGV2ZWxUbyk7Ci0KLSAgICBBQXVkaW9fbGluZWFyUmFtcChzb3VyY2UsIGRlc3RpbmF0aW9uLCA0LCAxLCBsZXZlbEZyb20sIGxldmVsVG8pOwotICAgIEVYUEVDVF9FUSg4LjBmLCBkZXN0aW5hdGlvblswXSk7Ci0gICAgRVhQRUNUX0VRKDguMGYsIGRlc3RpbmF0aW9uWzFdKTsKLSAgICBFWFBFQ1RfRVEoOC4wZiwgZGVzdGluYXRpb25bMl0pOwotICAgIEVYUEVDVF9FUSg4LjBmLCBkZXN0aW5hdGlvblszXSk7Ci0KLX07Ci0KLQotVEVTVCh0ZXN0X2xpbmVhcl9yYW1wLCBsaW5lYXJfcmFtcF9mb3JjZWQpIHsKLSAgICBMaW5lYXJSYW1wIHJhbXA7Ci0gICAgY29uc3QgZmxvYXQgc291cmNlWzRdID0gezEuMGYsIDEuMGYsIDEuMGYsIDEuMGYgfTsKLSAgICBmbG9hdCBkZXN0aW5hdGlvbls0XSA9IHsxLjBmLCAxLjBmLCAxLjBmLCAxLjBmIH07Ci0KLSAgICBmbG9hdCBsZXZlbEZyb20gPSAtMS4wZjsKLSAgICBmbG9hdCBsZXZlbFRvID0gLTEuMGY7Ci0gICAgcmFtcC5zZXRMZW5ndGhJbkZyYW1lcyg0KTsKLSAgICByYW1wLnNldFRhcmdldCg4LjBmKTsKLSAgICByYW1wLmZvcmNlQ3VycmVudCg0LjBmKTsKLSAgICBFWFBFQ1RfRVEoNC4wZiwgcmFtcC5nZXRDdXJyZW50KCkpOwotCi0gICAgYm9vbCByYW1waW5nID0gcmFtcC5uZXh0U2VnbWVudCg0LCAmbGV2ZWxGcm9tLCAmbGV2ZWxUbyk7Ci0gICAgRVhQRUNUX0VRKDEsIHJhbXBpbmcpOwotICAgIEVYUEVDVF9FUSg0LjBmLCBsZXZlbEZyb20pOwotICAgIEVYUEVDVF9FUSg4LjBmLCBsZXZlbFRvKTsKLQotICAgIEFBdWRpb19saW5lYXJSYW1wKHNvdXJjZSwgZGVzdGluYXRpb24sIDQsIDEsIGxldmVsRnJvbSwgbGV2ZWxUbyk7Ci0gICAgRVhQRUNUX0VRKDQuMGYsIGRlc3RpbmF0aW9uWzBdKTsKLSAgICBFWFBFQ1RfRVEoNS4wZiwgZGVzdGluYXRpb25bMV0pOwotICAgIEVYUEVDVF9FUSg2LjBmLCBkZXN0aW5hdGlvblsyXSk7Ci0gICAgRVhQRUNUX0VRKDcuMGYsIGRlc3RpbmF0aW9uWzNdKTsKLQotICAgIHJhbXBpbmcgPSByYW1wLm5leHRTZWdtZW50KDQsICZsZXZlbEZyb20sICZsZXZlbFRvKTsKLSAgICBFWFBFQ1RfRVEoMCwgcmFtcGluZyk7Ci0gICAgRVhQRUNUX0VRKDguMGYsIGxldmVsRnJvbSk7Ci0gICAgRVhQRUNUX0VRKDguMGYsIGxldmVsVG8pOwotCi0gICAgQUF1ZGlvX2xpbmVhclJhbXAoc291cmNlLCBkZXN0aW5hdGlvbiwgNCwgMSwgbGV2ZWxGcm9tLCBsZXZlbFRvKTsKLSAgICBFWFBFQ1RfRVEoOC4wZiwgZGVzdGluYXRpb25bMF0pOwotICAgIEVYUEVDVF9FUSg4LjBmLCBkZXN0aW5hdGlvblsxXSk7Ci0gICAgRVhQRUNUX0VRKDguMGYsIGRlc3RpbmF0aW9uWzJdKTsKLSAgICBFWFBFQ1RfRVEoOC4wZiwgZGVzdGluYXRpb25bM10pOwotCi19OwotCi1jb25zdGV4cHIgaW50MTZfdCBrTWF4STE2ID0gSU5UMTZfTUFYOwotY29uc3RleHByIGludDE2X3Qga01pbkkxNiA9IElOVDE2X01JTjsKLWNvbnN0ZXhwciBpbnQxNl90IGtIYWxmSTE2ID0gMTYzODQ7Ci1jb25zdGV4cHIgaW50MTZfdCBrVGVudGhJMTYgPSAzMjc3OwotCi0vL3ZvaWQgQUF1ZGlvQ29udmVydF9mbG9hdFRvUGNtMTYoY29uc3QgZmxvYXQgKnNvdXJjZSwKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpkZXN0aW5hdGlvbiwKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bVNhbXBsZXMsCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlKTsKLVRFU1QodGVzdF9saW5lYXJfcmFtcCwgZmxvYXRfdG9faTE2KSB7Ci0gICAgY29uc3QgZmxvYXQgc291cmNlW10gPSB7MTIzNDUuNmYsIDEuMGYsIDAuNWYsIDAuMWYsIDAuMGYsIC0wLjFmLCAtMC41ZiwgLTEuMGYsIC0xMjM0NS42Zn07Ci0gICAgY29uc3RleHByIHNpemVfdCBjb3VudCA9IHNpemVvZihzb3VyY2UpIC8gc2l6ZW9mKHNvdXJjZVswXSk7Ci0gICAgaW50MTZfdCBkZXN0aW5hdGlvbltjb3VudF07Ci0gICAgY29uc3QgaW50MTZfdCBleHBlY3RlZFtjb3VudF0gPSB7a01heEkxNiwga01heEkxNiwga0hhbGZJMTYsIGtUZW50aEkxNiwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAta1RlbnRoSTE2LCAta0hhbGZJMTYsIGtNaW5JMTYsIGtNaW5JMTZ9OwotCi0gICAgQUF1ZGlvQ29udmVydF9mbG9hdFRvUGNtMTYoc291cmNlLCBkZXN0aW5hdGlvbiwgY291bnQsIDEuMGYpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRbaV0sIGRlc3RpbmF0aW9uW2ldKTsKLSAgICB9Ci0KLX0KLQotLy92b2lkIEFBdWRpb0NvbnZlcnRfcGNtMTZUb0Zsb2F0KGNvbnN0IGludDE2X3QgKnNvdXJjZSwKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqZGVzdGluYXRpb24sCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1TYW1wbGVzLAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZSk7Ci1URVNUKHRlc3RfbGluZWFyX3JhbXAsIGkxNl90b19mbG9hdCkgewotICAgIGNvbnN0IGludDE2X3Qgc291cmNlW10gPSB7a01heEkxNiwga0hhbGZJMTYsIGtUZW50aEkxNiwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1rVGVudGhJMTYsIC1rSGFsZkkxNiwga01pbkkxNn07Ci0gICAgY29uc3RleHByIHNpemVfdCBjb3VudCA9IHNpemVvZihzb3VyY2UpIC8gc2l6ZW9mKHNvdXJjZVswXSk7Ci0gICAgZmxvYXQgZGVzdGluYXRpb25bY291bnRdOwotICAgIGNvbnN0IGZsb2F0IGV4cGVjdGVkW2NvdW50XSA9IHsoMzI3NjcuMGYgLyAzMjc2OC4wZiksIDAuNWYsIDAuMWYsIDAuMGYsIC0wLjFmLCAtMC41ZiwgLTEuMGZ9OwotCi0gICAgQUF1ZGlvQ29udmVydF9wY20xNlRvRmxvYXQoc291cmNlLCBkZXN0aW5hdGlvbiwgY291bnQsIDEuMGYpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICBFWFBFQ1RfTkVBUihleHBlY3RlZFtpXSwgZGVzdGluYXRpb25baV0sIDAuMDAwMWYpOwotICAgIH0KLQotfQotCi0vL3ZvaWQgQUF1ZGlvX2xpbmVhclJhbXAoY29uc3QgaW50MTZfdCAqc291cmNlLAotLy8gICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmRlc3RpbmF0aW9uLAotLy8gICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtRnJhbWVzLAotLy8gICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lLAotLy8gICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZTEsCi0vLyAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlMik7Ci1URVNUKHRlc3RfbGluZWFyX3JhbXAsIHJhbXBfaTE2X3RvX2kxNikgewotICAgIGNvbnN0IGludDE2X3Qgc291cmNlW10gPSB7MSwgMSwgMSwgMSwgMSwgMSwgMSwgMX07Ci0gICAgY29uc3RleHByIHNpemVfdCBjb3VudCA9IHNpemVvZihzb3VyY2UpIC8gc2l6ZW9mKHNvdXJjZVswXSk7Ci0gICAgaW50MTZfdCBkZXN0aW5hdGlvbltjb3VudF07Ci0gICAgLy8gUmFtcCB3aWxsIHN3ZWVwIGZyb20gLTEgdG8gYWxtb3N0ICsxCi0gICAgY29uc3QgaW50MTZfdCBleHBlY3RlZFtjb3VudF0gPSB7Ci0gICAgICAgICAgICAtMSwgLy8gZnJvbSAtMS4wMAotICAgICAgICAgICAgLTEsIC8vIGZyb20gLTAuNzUKLSAgICAgICAgICAgIC0xLCAvLyBmcm9tIC0wLjU1LCByb3VuZCBhd2F5IGZyb20gemVybwotICAgICAgICAgICAgMCwgIC8vIGZyb20gLTAuMjUsIHJvdW5kIHVwIHRvIHplcm8KLSAgICAgICAgICAgIDAsICAvLyBmcm9tICAwLjAwCi0gICAgICAgICAgICAwLCAgLy8gZnJvbSAgMC4yNSwgcm91bmQgZG93biB0byB6ZXJvCi0gICAgICAgICAgICAxLCAgLy8gZnJvbSAgMC41MCwgcm91bmQgYXdheSBmcm9tIHplcm8KLSAgICAgICAgICAgIDEgICAvLyBmcm9tICAwLjc1Ci0gICAgfTsKLQotICAgIC8vIHN3ZWVwIGFjcm9zcyB6ZXJvIHRvIHRlc3Qgc3ltbWV0cnkKLSAgICBjb25zdGV4cHIgZmxvYXQgYW1wbGl0dWRlMSA9IC0xLjA7Ci0gICAgY29uc3RleHByIGZsb2F0IGFtcGxpdHVkZTIgPSAxLjA7Ci0gICAgQUF1ZGlvX2xpbmVhclJhbXAoc291cmNlLCBkZXN0aW5hdGlvbiwgY291bnQsIDEsIGFtcGxpdHVkZTEsIGFtcGxpdHVkZTIpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRbaV0sIGRlc3RpbmF0aW9uW2ldKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0FuZHJvaWQuYnAgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BbmRyb2lkLmJwCmluZGV4IGY5M2Q0NGIuLjgyN2RmNmEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQW5kcm9pZC5icApAQCAtNDAsMTUgKzQwLDE3IEBACiAgICAgICAgICJUcmFja1BsYXllckJhc2UuY3BwIiwKICAgICBdLAogICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJsb2ciLAotICAgICAgICAibGliY3V0aWxzIiwKLSAgICAgICAgImxpYnV0aWxzIiwKLSAgICAgICAgImxpYmJpbmRlciIsCi0gICAgICAgICJsaWJkbCIsCiAgICAgICAgICJsaWJhdWRpb3V0aWxzIiwKICAgICAgICAgImxpYmF1ZGlvbWFuYWdlciIsCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmRsIiwKKyAgICAgICAgImxpYmxvZyIsCiAgICAgICAgICJsaWJtZWRpYV9oZWxwZXIiLAogICAgICAgICAibGlibWVkaWFtZXRyaWNzIiwKKyAgICAgICAgImxpYm1lZGlhdXRpbHMiLAorICAgICAgICAibGlibmJsb2ciLAorICAgICAgICAibGlidXRpbHMiLAogICAgIF0sCiAgICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWyJsaWJiaW5kZXIiXSwKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9FZmZlY3QuY3BwIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9FZmZlY3QuY3BwCmluZGV4IGI0MGYwZGIuLmNmMTE5MzYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvRWZmZWN0LmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb0VmZmVjdC5jcHAKQEAgLTQzMiwxNCArNDMyLDE1IEBACiB9CiAKIHN0YXR1c190IEF1ZGlvRWZmZWN0OjpnZXRFZmZlY3REZXNjcmlwdG9yKGNvbnN0IGVmZmVjdF91dWlkX3QgKnV1aWQsCi0gICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2NyaXB0b3IpIC8qY29uc3QqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZWZlcnJlZFR5cGVGbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzY3JpcHRvcikKIHsKICAgICBjb25zdCBzcDxJQXVkaW9GbGluZ2VyPiYgYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKICAgICBpZiAoYWYgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgIHJldHVybiBhZi0+Z2V0RWZmZWN0RGVzY3JpcHRvcih1dWlkLCBkZXNjcmlwdG9yKTsKKyAgICByZXR1cm4gYWYtPmdldEVmZmVjdERlc2NyaXB0b3IodXVpZCwgdHlwZSwgcHJlZmVycmVkVHlwZUZsYWcsIGRlc2NyaXB0b3IpOwogfQogCi0KIHN0YXR1c190IEF1ZGlvRWZmZWN0OjpxdWVyeURlZmF1bHRQcmVQcm9jZXNzaW5nKGF1ZGlvX3Nlc3Npb25fdCBhdWRpb1Nlc3Npb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjcmlwdG9ycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpjb3VudCkKQEAgLTQ0OCw2ICs0NDksOTUgQEAKICAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKICAgICByZXR1cm4gYXBzLT5xdWVyeURlZmF1bHRQcmVQcm9jZXNzaW5nKGF1ZGlvU2Vzc2lvbiwgZGVzY3JpcHRvcnMsIGNvdW50KTsKIH0KKworc3RhdHVzX3QgQXVkaW9FZmZlY3Q6Om5ld0VmZmVjdFVuaXF1ZUlkKGF1ZGlvX3VuaXF1ZV9pZF90KiBpZCkKK3sKKyAgICBjb25zdCBzcDxJQXVkaW9GbGluZ2VyPiYgYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKKyAgICBpZiAoYWYgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgICppZCA9IGFmLT5uZXdBdWRpb1VuaXF1ZUlkKEFVRElPX1VOSVFVRV9JRF9VU0VfRUZGRUNUKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEF1ZGlvRWZmZWN0OjphZGRTb3VyY2VEZWZhdWx0RWZmZWN0KGNvbnN0IGNoYXIgKnR5cGVTdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnV1aWRTdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fdW5pcXVlX2lkX3QgKmlkKQoreworICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CisgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisKKyAgICBpZiAodHlwZVN0ciA9PSBOVUxMICYmIHV1aWRTdHIgPT0gTlVMTCkgcmV0dXJuIEJBRF9WQUxVRTsKKworICAgIC8vIENvbnZlcnQgdHlwZSAmIHV1aWQgZnJvbSBzdHJpbmcgdG8gZWZmZWN0X3V1aWRfdC4KKyAgICBlZmZlY3RfdXVpZF90IHR5cGU7CisgICAgaWYgKHR5cGVTdHIgIT0gTlVMTCkgeworICAgICAgICBzdGF0dXNfdCByZXMgPSBzdHJpbmdUb0d1aWQodHlwZVN0ciwgJnR5cGUpOworICAgICAgICBpZiAocmVzICE9IE9LKSByZXR1cm4gcmVzOworICAgIH0gZWxzZSB7CisgICAgICAgIHR5cGUgPSAqRUZGRUNUX1VVSURfTlVMTDsKKyAgICB9CisKKyAgICBlZmZlY3RfdXVpZF90IHV1aWQ7CisgICAgaWYgKHV1aWRTdHIgIT0gTlVMTCkgeworICAgICAgICBzdGF0dXNfdCByZXMgPSBzdHJpbmdUb0d1aWQodXVpZFN0ciwgJnV1aWQpOworICAgICAgICBpZiAocmVzICE9IE9LKSByZXR1cm4gcmVzOworICAgIH0gZWxzZSB7CisgICAgICAgIHV1aWQgPSAqRUZGRUNUX1VVSURfTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gYXBzLT5hZGRTb3VyY2VEZWZhdWx0RWZmZWN0KCZ0eXBlLCBvcFBhY2thZ2VOYW1lLCAmdXVpZCwgcHJpb3JpdHksIHNvdXJjZSwgaWQpOworfQorCitzdGF0dXNfdCBBdWRpb0VmZmVjdDo6YWRkU3RyZWFtRGVmYXVsdEVmZmVjdChjb25zdCBjaGFyICp0eXBlU3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp1dWlkU3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3VzYWdlX3QgdXNhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb191bmlxdWVfaWRfdCAqaWQpCit7CisgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKKyAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKworICAgIGlmICh0eXBlU3RyID09IE5VTEwgJiYgdXVpZFN0ciA9PSBOVUxMKSByZXR1cm4gQkFEX1ZBTFVFOworCisgICAgLy8gQ29udmVydCB0eXBlICYgdXVpZCBmcm9tIHN0cmluZyB0byBlZmZlY3RfdXVpZF90LgorICAgIGVmZmVjdF91dWlkX3QgdHlwZTsKKyAgICBpZiAodHlwZVN0ciAhPSBOVUxMKSB7CisgICAgICAgIHN0YXR1c190IHJlcyA9IHN0cmluZ1RvR3VpZCh0eXBlU3RyLCAmdHlwZSk7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHJldHVybiByZXM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdHlwZSA9ICpFRkZFQ1RfVVVJRF9OVUxMOworICAgIH0KKworICAgIGVmZmVjdF91dWlkX3QgdXVpZDsKKyAgICBpZiAodXVpZFN0ciAhPSBOVUxMKSB7CisgICAgICAgIHN0YXR1c190IHJlcyA9IHN0cmluZ1RvR3VpZCh1dWlkU3RyLCAmdXVpZCk7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHJldHVybiByZXM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdXVpZCA9ICpFRkZFQ1RfVVVJRF9OVUxMOworICAgIH0KKworICAgIHJldHVybiBhcHMtPmFkZFN0cmVhbURlZmF1bHRFZmZlY3QoJnR5cGUsIG9wUGFja2FnZU5hbWUsICZ1dWlkLCBwcmlvcml0eSwgdXNhZ2UsIGlkKTsKK30KKworc3RhdHVzX3QgQXVkaW9FZmZlY3Q6OnJlbW92ZVNvdXJjZURlZmF1bHRFZmZlY3QoYXVkaW9fdW5pcXVlX2lkX3QgaWQpCit7CisgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKKyAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKworICAgIHJldHVybiBhcHMtPnJlbW92ZVNvdXJjZURlZmF1bHRFZmZlY3QoaWQpOworfQorCitzdGF0dXNfdCBBdWRpb0VmZmVjdDo6cmVtb3ZlU3RyZWFtRGVmYXVsdEVmZmVjdChhdWRpb191bmlxdWVfaWRfdCBpZCkKK3sKKyAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOworICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworCisgICAgcmV0dXJuIGFwcy0+cmVtb3ZlU3RyZWFtRGVmYXVsdEVmZmVjdChpZCk7Cit9CisKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogc3RhdHVzX3QgQXVkaW9FZmZlY3Q6OnN0cmluZ1RvR3VpZChjb25zdCBjaGFyICpzdHIsIGVmZmVjdF91dWlkX3QgKmd1aWQpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1JlY29yZC5jcHAgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1JlY29yZC5jcHAKaW5kZXggMGFhYmFmNy4uMDM4Yzg1NCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9SZWNvcmQuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvUmVjb3JkLmNwcApAQCAtNDksOCArNDksOSBAQAogICAgIHNpemVfdCBzaXplOwogICAgIHN0YXR1c190IHN0YXR1cyA9IEF1ZGlvU3lzdGVtOjpnZXRJbnB1dEJ1ZmZlclNpemUoc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgJnNpemUpOwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgQUxPR0UoIkF1ZGlvU3lzdGVtIGNvdWxkIG5vdCBxdWVyeSB0aGUgaW5wdXQgYnVmZmVyIHNpemUgZm9yIHNhbXBsZVJhdGUgJXUsIGZvcm1hdCAlI3gsICIKLSAgICAgICAgICAgICAgImNoYW5uZWxNYXNrICUjeDsgc3RhdHVzICVkIiwgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgc3RhdHVzKTsKKyAgICAgICAgQUxPR0UoIiVzKCk6IEF1ZGlvU3lzdGVtIGNvdWxkIG5vdCBxdWVyeSB0aGUgaW5wdXQgYnVmZmVyIHNpemUgZm9yIgorICAgICAgICAgICAgICAiIHNhbXBsZVJhdGUgJXUsIGZvcm1hdCAlI3gsIGNoYW5uZWxNYXNrICUjeDsgc3RhdHVzICVkIiwKKyAgICAgICAgICAgICAgIF9fZnVuY19fLCBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBzdGF0dXMpOwogICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KIApAQCAtNTgsOCArNTksOCBAQAogICAgIC8vIEFzc3VtZXMgYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQpCiAgICAgaWYgKCgqZnJhbWVDb3VudCA9IChzaXplICogMikgLyAoYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX2luX21hc2soY2hhbm5lbE1hc2spICoKICAgICAgICAgICAgIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUoZm9ybWF0KSkpID09IDApIHsKLSAgICAgICAgQUxPR0UoIlVuc3VwcG9ydGVkIGNvbmZpZ3VyYXRpb246IHNhbXBsZVJhdGUgJXUsIGZvcm1hdCAlI3gsIGNoYW5uZWxNYXNrICUjeCIsCi0gICAgICAgICAgICBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrKTsKKyAgICAgICAgQUxPR0UoIiVzKCk6IFVuc3VwcG9ydGVkIGNvbmZpZ3VyYXRpb246IHNhbXBsZVJhdGUgJXUsIGZvcm1hdCAlI3gsIGNoYW5uZWxNYXNrICUjeCIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2spOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIApAQCAtMjA5LDggKzIxMCw4IEBACiAgICAgICAgIG1DYmxrTWVtb3J5LmNsZWFyKCk7CiAgICAgICAgIG1CdWZmZXJNZW1vcnkuY2xlYXIoKTsKICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOwotICAgICAgICBBTE9HVigifkF1ZGlvUmVjb3JkLCByZWxlYXNpbmcgc2Vzc2lvbiBpZCAlZCIsCi0gICAgICAgICAgICAgICAgbVNlc3Npb25JZCk7CisgICAgICAgIEFMT0dWKCIlcyglZCk6IHJlbGVhc2luZyBzZXNzaW9uIGlkICVkIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbUlkLCBtU2Vzc2lvbklkKTsKICAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VBdWRpb1Nlc3Npb25JZChtU2Vzc2lvbklkLCAtMSAvKnBpZCovKTsKICAgICB9CiB9CkBAIC0yMzgsOSArMjM5LDExIEBACiAgICAgcGlkX3QgY2FsbGluZ1BpZDsKICAgICBwaWRfdCBteVBpZDsKIAotICAgIEFMT0dWKCJzZXQoKTogaW5wdXRTb3VyY2UgJWQsIHNhbXBsZVJhdGUgJXUsIGZvcm1hdCAlI3gsIGNoYW5uZWxNYXNrICUjeCwgZnJhbWVDb3VudCAlenUsICIKKyAgICAvLyBOb3RlIG1JZCBpcyBub3QgdmFsaWQgdW50aWwgdGhlIHRyYWNrIGlzIGNyZWF0ZWQsIHNvIG9taXQgbUlkIGluIEFMT0cgZm9yIHNldC4KKyAgICBBTE9HVigiJXMoKTogaW5wdXRTb3VyY2UgJWQsIHNhbXBsZVJhdGUgJXUsIGZvcm1hdCAlI3gsIGNoYW5uZWxNYXNrICUjeCwgZnJhbWVDb3VudCAlenUsICIKICAgICAgICAgICAibm90aWZpY2F0aW9uRnJhbWVzICV1LCBzZXNzaW9uSWQgJWQsIHRyYW5zZmVyVHlwZSAlZCwgZmxhZ3MgJSN4LCBvcFBhY2thZ2VOYW1lICVzICIKICAgICAgICAgICAidWlkICVkLCBwaWQgJWQiLAorICAgICAgICAgIF9fZnVuY19fLAogICAgICAgICAgIGlucHV0U291cmNlLCBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LCBub3RpZmljYXRpb25GcmFtZXMsCiAgICAgICAgICAgc2Vzc2lvbklkLCB0cmFuc2ZlclR5cGUsIGZsYWdzLCBTdHJpbmc4KG1PcFBhY2thZ2VOYW1lKS5zdHJpbmcoKSwgdWlkLCBwaWQpOwogCkBAIC0yNTYsNyArMjU5LDcgQEAKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBUUkFOU0ZFUl9DQUxMQkFDSzoKICAgICAgICAgaWYgKGNiZiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBBTE9HRSgiVHJhbnNmZXIgdHlwZSBUUkFOU0ZFUl9DQUxMQkFDSyBidXQgY2JmID09IE5VTEwiKTsKKyAgICAgICAgICAgIEFMT0dFKCIlcygpOiBUcmFuc2ZlciB0eXBlIFRSQU5TRkVSX0NBTExCQUNLIGJ1dCBjYmYgPT0gTlVMTCIsIF9fZnVuY19fKTsKICAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgICAgIGdvdG8gZXhpdDsKICAgICAgICAgfQpAQCAtMjY1LDcgKzI2OCw3IEBACiAgICAgY2FzZSBUUkFOU0ZFUl9TWU5DOgogICAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgotICAgICAgICBBTE9HRSgiSW52YWxpZCB0cmFuc2ZlciB0eXBlICVkIiwgdHJhbnNmZXJUeXBlKTsKKyAgICAgICAgQUxPR0UoIiVzKCk6IEludmFsaWQgdHJhbnNmZXIgdHlwZSAlZCIsIF9fZnVuY19fLCB0cmFuc2ZlclR5cGUpOwogICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgIGdvdG8gZXhpdDsKICAgICB9CkBAIC0yNzMsNyArMjc2LDcgQEAKIAogICAgIC8vIGludmFyaWFudCB0aGF0IG1BdWRpb1JlY29yZCAhPSAwIGlzIHRydWUgb25seSBhZnRlciBzZXQoKSByZXR1cm5zIHN1Y2Nlc3NmdWxseQogICAgIGlmIChtQXVkaW9SZWNvcmQgIT0gMCkgewotICAgICAgICBBTE9HRSgiVHJhY2sgYWxyZWFkeSBpbiB1c2UiKTsKKyAgICAgICAgQUxPR0UoIiVzKCk6IFRyYWNrIGFscmVhZHkgaW4gdXNlIiwgX19mdW5jX18pOwogICAgICAgICBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgZ290byBleGl0OwogICAgIH0KQEAgLTI4NCw4ICsyODcsOCBAQAogICAgIH0gZWxzZSB7CiAgICAgICAgIC8vIHN0cmVhbSB0eXBlIHNob3VsZG4ndCBiZSBsb29rZWQgYXQsIHRoaXMgdHJhY2sgaGFzIGF1ZGlvIGF0dHJpYnV0ZXMKICAgICAgICAgbWVtY3B5KCZtQXR0cmlidXRlcywgcEF0dHJpYnV0ZXMsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKLSAgICAgICAgQUxPR1YoIkJ1aWxkaW5nIEF1ZGlvUmVjb3JkIHdpdGggYXR0cmlidXRlczogc291cmNlPSVkIGZsYWdzPTB4JXggdGFncz1bJXNdIiwKLSAgICAgICAgICAgICAgbUF0dHJpYnV0ZXMuc291cmNlLCBtQXR0cmlidXRlcy5mbGFncywgbUF0dHJpYnV0ZXMudGFncyk7CisgICAgICAgIEFMT0dWKCIlcygpOiBCdWlsZGluZyBBdWRpb1JlY29yZCB3aXRoIGF0dHJpYnV0ZXM6IHNvdXJjZT0lZCBmbGFncz0weCV4IHRhZ3M9WyVzXSIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIG1BdHRyaWJ1dGVzLnNvdXJjZSwgbUF0dHJpYnV0ZXMuZmxhZ3MsIG1BdHRyaWJ1dGVzLnRhZ3MpOwogICAgIH0KIAogICAgIG1TYW1wbGVSYXRlID0gc2FtcGxlUmF0ZTsKQEAgLTI5OCwxNCArMzAxLDE0IEBACiAgICAgLy8gdmFsaWRhdGUgcGFyYW1ldGVycwogICAgIC8vIEF1ZGlvRmxpbmdlciBjYXB0dXJlIG9ubHkgc3VwcG9ydHMgbGluZWFyIFBDTQogICAgIGlmICghYXVkaW9faXNfdmFsaWRfZm9ybWF0KGZvcm1hdCkgfHwgIWF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0KSkgewotICAgICAgICBBTE9HRSgiRm9ybWF0ICUjeCBpcyBub3QgbGluZWFyIHBjbSIsIGZvcm1hdCk7CisgICAgICAgIEFMT0dFKCIlcygpOiBGb3JtYXQgJSN4IGlzIG5vdCBsaW5lYXIgcGNtIiwgX19mdW5jX18sIGZvcm1hdCk7CiAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgZ290byBleGl0OwogICAgIH0KICAgICBtRm9ybWF0ID0gZm9ybWF0OwogCiAgICAgaWYgKCFhdWRpb19pc19pbnB1dF9jaGFubmVsKGNoYW5uZWxNYXNrKSkgewotICAgICAgICBBTE9HRSgiSW52YWxpZCBjaGFubmVsIG1hc2sgJSN4IiwgY2hhbm5lbE1hc2spOworICAgICAgICBBTE9HRSgiJXMoKTogSW52YWxpZCBjaGFubmVsIG1hc2sgJSN4IiwgX19mdW5jX18sIGNoYW5uZWxNYXNrKTsKICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICBnb3RvIGV4aXQ7CiAgICAgfQpAQCAtMzI2LDcgKzMyOSw3IEBACiAgICAgLy8gbU5vdGlmaWNhdGlvbkZyYW1lc0FjdCBpcyBpbml0aWFsaXplZCBpbiBjcmVhdGVSZWNvcmRfbAogCiAgICAgbVNlc3Npb25JZCA9IHNlc3Npb25JZDsKLSAgICBBTE9HVigic2V0KCk6IG1TZXNzaW9uSWQgJWQiLCBtU2Vzc2lvbklkKTsKKyAgICBBTE9HVigiJXMoKTogbVNlc3Npb25JZCAlZCIsIF9fZnVuY19fLCBtU2Vzc2lvbklkKTsKIAogICAgIGNhbGxpbmdQaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7CiAgICAgbXlQaWQgPSBnZXRwaWQoKTsKQEAgLTM1Myw2ICszNTYsOCBAQAogICAgIC8vIGNyZWF0ZSB0aGUgSUF1ZGlvUmVjb3JkCiAgICAgc3RhdHVzID0gY3JlYXRlUmVjb3JkX2woMCAvKmVwb2NoKi8sIG1PcFBhY2thZ2VOYW1lKTsKIAorICAgIEFMT0dWKCIlcyglZCk6IHN0YXR1cyAlZCIsIF9fZnVuY19fLCBtSWQsIHN0YXR1cyk7CisKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgIGlmIChtQXVkaW9SZWNvcmRUaHJlYWQgIT0gMCkgewogICAgICAgICAgICAgbUF1ZGlvUmVjb3JkVGhyZWFkLT5yZXF1ZXN0RXhpdCgpOyAgIC8vIHNlZSBjb21tZW50IGluIEF1ZGlvUmVjb3JkLmgKQEAgLTM4OCw3ICszOTMsNyBAQAogCiBzdGF0dXNfdCBBdWRpb1JlY29yZDo6c3RhcnQoQXVkaW9TeXN0ZW06OnN5bmNfZXZlbnRfdCBldmVudCwgYXVkaW9fc2Vzc2lvbl90IHRyaWdnZXJTZXNzaW9uKQogewotICAgIEFMT0dWKCJzdGFydCwgc3luYyBldmVudCAlZCB0cmlnZ2VyIHNlc3Npb24gJWQiLCBldmVudCwgdHJpZ2dlclNlc3Npb24pOworICAgIEFMT0dWKCIlcyglZCk6IHN5bmMgZXZlbnQgJWQgdHJpZ2dlciBzZXNzaW9uICVkIiwgX19mdW5jX18sIG1JZCwgZXZlbnQsIHRyaWdnZXJTZXNzaW9uKTsKIAogICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKICAgICBpZiAobUFjdGl2ZSkgewpAQCAtNDI5LDcgKzQzNCw3IEBACiAKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgIG1BY3RpdmUgPSBmYWxzZTsKLSAgICAgICAgQUxPR0UoInN0YXJ0KCkgc3RhdHVzICVkIiwgc3RhdHVzKTsKKyAgICAgICAgQUxPR0UoIiVzKCVkKTogc3RhdHVzICVkIiwgX19mdW5jX18sIG1JZCwgc3RhdHVzKTsKICAgICB9IGVsc2UgewogICAgICAgICBzcDxBdWRpb1JlY29yZFRocmVhZD4gdCA9IG1BdWRpb1JlY29yZFRocmVhZDsKICAgICAgICAgaWYgKHQgIT0gMCkgewpAQCAtNDUzLDYgKzQ1OCw3IEBACiB2b2lkIEF1ZGlvUmVjb3JkOjpzdG9wKCkKIHsKICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CisgICAgQUxPR1YoIiVzKCVkKTogbUFjdGl2ZTolZFxuIiwgX19mdW5jX18sIG1JZCwgbUFjdGl2ZSk7CiAgICAgaWYgKCFtQWN0aXZlKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CkBAIC02MzEsOCArNjM3LDggQEAKICAgICBTdHJpbmc4IHJlc3VsdDsKIAogICAgIHJlc3VsdC5hcHBlbmQoIiBBdWRpb1JlY29yZDo6ZHVtcFxuIik7Ci0gICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiICBzdGF0dXMoJWQpLCBhY3RpdmUoJWQpLCBzZXNzaW9uIElkKCVkKVxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TdGF0dXMsIG1BY3RpdmUsIG1TZXNzaW9uSWQpOworICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAgaWQoJWQpIHN0YXR1cyglZCksIGFjdGl2ZSglZCksIHNlc3Npb24gSWQoJWQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgbUlkLCBtU3RhdHVzLCBtQWN0aXZlLCBtU2Vzc2lvbklkKTsKICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgIGZsYWdzKCUjeCksIHJlcS4gZmxhZ3MoJSN4KSwgYXVkaW8gc291cmNlKCVkKVxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgIG1GbGFncywgbU9yaWdGbGFncywgbUF0dHJpYnV0ZXMuc291cmNlKTsKICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgIGZvcm1hdCglI3gpLCBjaGFubmVsIG1hc2soJSN4KSwgY2hhbm5lbCBjb3VudCgldSksIHNhbXBsZSByYXRlKCV1KVxuIiwKQEAgLTY3NCw3ICs2ODAsNyBAQAogICAgIHN0YXR1c190IHN0YXR1czsKIAogICAgIGlmIChhdWRpb0ZsaW5nZXIgPT0gMCkgewotICAgICAgICBBTE9HRSgiQ291bGQgbm90IGdldCBhdWRpb2ZsaW5nZXIiKTsKKyAgICAgICAgQUxPR0UoIiVzKCVkKTogQ291bGQgbm90IGdldCBhdWRpb2ZsaW5nZXIiLCBfX2Z1bmNfXywgbUlkKTsKICAgICAgICAgc3RhdHVzID0gTk9fSU5JVDsKICAgICAgICAgZ290byBleGl0OwogICAgIH0KQEAgLTcwMSw3ICs3MDcsOCBAQAogICAgICAgICAgICAgLy8gdXNlIGNhc2UgMzogb2J0YWluL3JlbGVhc2UgbW9kZQogICAgICAgICAgICAgKG1UcmFuc2ZlciA9PSBUUkFOU0ZFUl9PQlRBSU4pOwogICAgICAgICBpZiAoIXVzZUNhc2VBbGxvd2VkKSB7Ci0gICAgICAgICAgICBBTE9HVygiQVVESU9fSU5QVVRfRkxBR19GQVNUIGRlbmllZCwgaW5jb21wYXRpYmxlIHRyYW5zZmVyID0gJXMiLAorICAgICAgICAgICAgQUxPR1coIiVzKCVkKTogQVVESU9fSU5QVVRfRkxBR19GQVNUIGRlbmllZCwgaW5jb21wYXRpYmxlIHRyYW5zZmVyID0gJXMiLAorICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1JZCwKICAgICAgICAgICAgICAgICAgIGNvbnZlcnRUcmFuc2ZlclRvVGV4dChtVHJhbnNmZXIpKTsKICAgICAgICAgICAgIG1GbGFncyA9IChhdWRpb19pbnB1dF9mbGFnc190KSAobUZsYWdzICYgfihBVURJT19JTlBVVF9GTEFHX0ZBU1QgfAogICAgICAgICAgICAgICAgICAgICBBVURJT19JTlBVVF9GTEFHX1JBVykpOwpAQCAtNzM2LDcgKzc0Myw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGF0dXMpOwogCiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICBBTE9HRSgiQXVkaW9GbGluZ2VyIGNvdWxkIG5vdCBjcmVhdGUgcmVjb3JkIHRyYWNrLCBzdGF0dXM6ICVkIiwgc3RhdHVzKTsKKyAgICAgICAgQUxPR0UoIiVzKCVkKTogQXVkaW9GbGluZ2VyIGNvdWxkIG5vdCBjcmVhdGUgcmVjb3JkIHRyYWNrLCBzdGF0dXM6ICVkIiwKKyAgICAgICAgICAgICAgX19mdW5jX18sIG1JZCwgc3RhdHVzKTsKICAgICAgICAgZ290byBleGl0OwogICAgIH0KICAgICBBTE9HX0FTU0VSVChyZWNvcmQgIT0gMCk7CkBAIC03NDYsNyArNzU0LDggQEAKIAogICAgIG1Bd2FpdEJvb3N0ID0gZmFsc2U7CiAgICAgaWYgKG91dHB1dC5mbGFncyAmIEFVRElPX0lOUFVUX0ZMQUdfRkFTVCkgewotICAgICAgICBBTE9HSSgiQVVESU9fSU5QVVRfRkxBR19GQVNUIHN1Y2Nlc3NmdWw7IGZyYW1lQ291bnQgJXp1IC0+ICV6dSIsCisgICAgICAgIEFMT0dJKCIlcyglZCk6IEFVRElPX0lOUFVUX0ZMQUdfRkFTVCBzdWNjZXNzZnVsOyBmcmFtZUNvdW50ICV6dSAtPiAlenUiLAorICAgICAgICAgICAgICBfX2Z1bmNfXywgbUlkLAogICAgICAgICAgICAgICBtUmVxRnJhbWVDb3VudCwgb3V0cHV0LmZyYW1lQ291bnQpOwogICAgICAgICBtQXdhaXRCb29zdCA9IHRydWU7CiAgICAgfQpAQCAtNzU2LDEzICs3NjUsMTMgQEAKICAgICBtU2FtcGxlUmF0ZSA9IG91dHB1dC5zYW1wbGVSYXRlOwogCiAgICAgaWYgKG91dHB1dC5jYmxrID09IDApIHsKLSAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBnZXQgY29udHJvbCBibG9jayIpOworICAgICAgICBBTE9HRSgiJXMoJWQpOiBDb3VsZCBub3QgZ2V0IGNvbnRyb2wgYmxvY2siLCBfX2Z1bmNfXywgbUlkKTsKICAgICAgICAgc3RhdHVzID0gTk9fSU5JVDsKICAgICAgICAgZ290byBleGl0OwogICAgIH0KICAgICBpTWVtUG9pbnRlciA9IG91dHB1dC5jYmxrIC0+cG9pbnRlcigpOwogICAgIGlmIChpTWVtUG9pbnRlciA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCJDb3VsZCBub3QgZ2V0IGNvbnRyb2wgYmxvY2sgcG9pbnRlciIpOworICAgICAgICBBTE9HRSgiJXMoJWQpOiBDb3VsZCBub3QgZ2V0IGNvbnRyb2wgYmxvY2sgcG9pbnRlciIsIF9fZnVuY19fLCBtSWQpOwogICAgICAgICBzdGF0dXMgPSBOT19JTklUOwogICAgICAgICBnb3RvIGV4aXQ7CiAgICAgfQpAQCAtNzc3LDcgKzc4Niw3IEBACiAgICAgfSBlbHNlIHsKICAgICAgICAgYnVmZmVycyA9IG91dHB1dC5idWZmZXJzLT5wb2ludGVyKCk7CiAgICAgICAgIGlmIChidWZmZXJzID09IE5VTEwpIHsKLSAgICAgICAgICAgIEFMT0dFKCJDb3VsZCBub3QgZ2V0IGJ1ZmZlciBwb2ludGVyIik7CisgICAgICAgICAgICBBTE9HRSgiJXMoJWQpOiBDb3VsZCBub3QgZ2V0IGJ1ZmZlciBwb2ludGVyIiwgX19mdW5jX18sIG1JZCk7CiAgICAgICAgICAgICBzdGF0dXMgPSBOT19JTklUOwogICAgICAgICAgICAgZ290byBleGl0OwogICAgICAgICB9CkBAIC03OTEsMTkgKzgwMCwyMiBAQAogICAgIG1BdWRpb1JlY29yZCA9IHJlY29yZDsKICAgICBtQ2Jsa01lbW9yeSA9IG91dHB1dC5jYmxrOwogICAgIG1CdWZmZXJNZW1vcnkgPSBvdXRwdXQuYnVmZmVyczsKKyAgICBtSWQgPSBvdXRwdXQudHJhY2tJZDsKICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5mbHVzaENvbW1hbmRzKCk7CiAKICAgICBtQ2JsayA9IGNibGs7CiAgICAgLy8gbm90ZSB0aGF0IG91dHB1dC5mcmFtZUNvdW50IGlzIHRoZSAocG9zc2libHkgcmV2aXNlZCkgdmFsdWUgb2YgbVJlcUZyYW1lQ291bnQKICAgICBpZiAob3V0cHV0LmZyYW1lQ291bnQgPCBtUmVxRnJhbWVDb3VudCB8fCAobVJlcUZyYW1lQ291bnQgPT0gMCAmJiBvdXRwdXQuZnJhbWVDb3VudCA9PSAwKSkgewotICAgICAgICBBTE9HVygiUmVxdWVzdGVkIGZyYW1lQ291bnQgJXp1IGJ1dCByZWNlaXZlZCBmcmFtZUNvdW50ICV6dSIsCisgICAgICAgIEFMT0dXKCIlcyglZCk6IFJlcXVlc3RlZCBmcmFtZUNvdW50ICV6dSBidXQgcmVjZWl2ZWQgZnJhbWVDb3VudCAlenUiLAorICAgICAgICAgICAgICBfX2Z1bmNfXywgbUlkLAogICAgICAgICAgICAgICBtUmVxRnJhbWVDb3VudCwgIG91dHB1dC5mcmFtZUNvdW50KTsKICAgICB9CiAKICAgICAvLyBNYWtlIHN1cmUgdGhhdCBhcHBsaWNhdGlvbiBpcyBub3RpZmllZCB3aXRoIHN1ZmZpY2llbnQgbWFyZ2luIGJlZm9yZSBvdmVycnVuLgogICAgIC8vIFRoZSBjb21wdXRhdGlvbiBpcyBkb25lIG9uIHNlcnZlciBzaWRlLgogICAgIGlmIChtTm90aWZpY2F0aW9uRnJhbWVzUmVxID4gMCAmJiBvdXRwdXQubm90aWZpY2F0aW9uRnJhbWVDb3VudCAhPSBtTm90aWZpY2F0aW9uRnJhbWVzUmVxKSB7Ci0gICAgICAgIEFMT0dXKCJTZXJ2ZXIgYWRqdXN0ZWQgbm90aWZpY2F0aW9uRnJhbWVzIGZyb20gJXUgdG8gJXp1IGZvciBmcmFtZUNvdW50ICV6dSIsCisgICAgICAgIEFMT0dXKCIlcyglZCk6IFNlcnZlciBhZGp1c3RlZCBub3RpZmljYXRpb25GcmFtZXMgZnJvbSAldSB0byAlenUgZm9yIGZyYW1lQ291bnQgJXp1IiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbUlkLAogICAgICAgICAgICAgICAgIG1Ob3RpZmljYXRpb25GcmFtZXNSZXEsIG91dHB1dC5ub3RpZmljYXRpb25GcmFtZUNvdW50LCBvdXRwdXQuZnJhbWVDb3VudCk7CiAgICAgfQogICAgIG1Ob3RpZmljYXRpb25GcmFtZXNBY3QgPSAodWludDMyX3Qpb3V0cHV0Lm5vdGlmaWNhdGlvbkZyYW1lQ291bnQ7CkBAIC04NzEsNyArODgzLDcgQEAKICAgICAgICAgdGltZW91dC50dl9uc2VjID0gKGxvbmcpIChtcyAlIDEwMDApICogMTAwMDAwMDsKICAgICAgICAgcmVxdWVzdGVkID0gJnRpbWVvdXQ7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR0UoIiVzIGludmFsaWQgd2FpdENvdW50ICVkIiwgX19mdW5jX18sIHdhaXRDb3VudCk7CisgICAgICAgIEFMT0dFKCIlcyglZCk6IGludmFsaWQgd2FpdENvdW50ICVkIiwgX19mdW5jX18sIG1JZCwgd2FpdENvdW50KTsKICAgICAgICAgcmVxdWVzdGVkID0gTlVMTDsKICAgICB9CiAgICAgcmV0dXJuIG9idGFpbkJ1ZmZlcihhdWRpb0J1ZmZlciwgcmVxdWVzdGVkLCBOVUxMIC8qZWxhcHNlZCovLCBub25Db250aWcpOwpAQCAtOTgwLDcgKzk5Miw4IEBACiAgICAgaWYgKHNzaXplX3QodXNlclNpemUpIDwgMCB8fCAoYnVmZmVyID09IE5VTEwgJiYgdXNlclNpemUgIT0gMCkpIHsKICAgICAgICAgLy8gc2FuaXR5LWNoZWNrLiB1c2VyIGlzIG1vc3QtbGlrZWx5IHBhc3NpbmcgYW4gZXJyb3IgY29kZSwgYW5kIGl0IHdvdWxkCiAgICAgICAgIC8vIG1ha2UgdGhlIHJldHVybiB2YWx1ZSBhbWJpZ3VvdXMgKGFjdHVhbFNpemUgdnMgZXJyb3IpLgotICAgICAgICBBTE9HRSgiQXVkaW9SZWNvcmQ6OnJlYWQoYnVmZmVyPSVwLCBzaXplPSV6dSAoJXp1KSIsIGJ1ZmZlciwgdXNlclNpemUsIHVzZXJTaXplKTsKKyAgICAgICAgQUxPR0UoIiVzKCVkKSAoYnVmZmVyPSVwLCBzaXplPSV6dSAoJXp1KSIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIG1JZCwgYnVmZmVyLCB1c2VyU2l6ZSwgdXNlclNpemUpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIApAQCAtMTAzNyw3ICsxMDUwLDcgQEAKICAgICAgICAgICAgIHBvbGxVcyA8PD0gMTsKICAgICAgICAgfSB3aGlsZSAodHJ5Q291bnRlci0tID4gMCk7CiAgICAgICAgIGlmICh0cnlDb3VudGVyIDwgMCkgewotICAgICAgICAgICAgQUxPR0UoImRpZCBub3QgcmVjZWl2ZSBleHBlY3RlZCBwcmlvcml0eSBib29zdCBvbiB0aW1lIik7CisgICAgICAgICAgICBBTE9HRSgiJXMoJWQpOiBkaWQgbm90IHJlY2VpdmUgZXhwZWN0ZWQgcHJpb3JpdHkgYm9vc3Qgb24gdGltZSIsIF9fZnVuY19fLCBtSWQpOwogICAgICAgICB9CiAgICAgICAgIC8vIFJ1biBhZ2FpbiBpbW1lZGlhdGVseQogICAgICAgICByZXR1cm4gMDsKQEAgLTExNjAsNyArMTE3Myw4IEBACiAgICAgaWYgKG5zICE9IE5TX1dIRU5FVkVSKSB7CiAgICAgICAgIHRpbWVvdXQudHZfc2VjID0gbnMgLyAxMDAwMDAwMDAwTEw7CiAgICAgICAgIHRpbWVvdXQudHZfbnNlYyA9IG5zICUgMTAwMDAwMDAwMExMOwotICAgICAgICBBTE9HVigidGltZW91dCAlbGQuJTAzZCIsIHRpbWVvdXQudHZfc2VjLCAoaW50KSB0aW1lb3V0LnR2X25zZWMgLyAxMDAwMDAwKTsKKyAgICAgICAgQUxPR1YoIiVzKCVkKTogdGltZW91dCAlbGQuJTAzZCIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIG1JZCwgdGltZW91dC50dl9zZWMsIChpbnQpIHRpbWVvdXQudHZfbnNlYyAvIDEwMDAwMDApOwogICAgICAgICByZXF1ZXN0ZWQgPSAmdGltZW91dDsKICAgICB9CiAKQEAgLTExNzIsMTYgKzExODYsMTggQEAKICAgICAgICAgc2l6ZV90IG5vbkNvbnRpZzsKICAgICAgICAgc3RhdHVzX3QgZXJyID0gb2J0YWluQnVmZmVyKCZhdWRpb0J1ZmZlciwgcmVxdWVzdGVkLCBOVUxMLCAmbm9uQ29udGlnKTsKICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRigoZXJyICE9IE5PX0VSUk9SKSAhPSAoYXVkaW9CdWZmZXIuZnJhbWVDb3VudCA9PSAwKSwKLSAgICAgICAgICAgICAgICAib2J0YWluQnVmZmVyKCkgZXJyPSVkIGZyYW1lQ291bnQ9JXp1IiwgZXJyLCBhdWRpb0J1ZmZlci5mcmFtZUNvdW50KTsKKyAgICAgICAgICAgICAgICAiJXMoJWQpOiBvYnRhaW5CdWZmZXIoKSBlcnI9JWQgZnJhbWVDb3VudD0lenUiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtSWQsIGVyciwgYXVkaW9CdWZmZXIuZnJhbWVDb3VudCk7CiAgICAgICAgIHJlcXVlc3RlZCA9ICZDbGllbnRQcm94eTo6a05vbkJsb2NraW5nOwogICAgICAgICBzaXplX3QgYXZhaWwgPSBhdWRpb0J1ZmZlci5mcmFtZUNvdW50ICsgbm9uQ29udGlnOwotICAgICAgICBBTE9HVigib2J0YWluQnVmZmVyKCV1KSByZXR1cm5lZCAlenUgPSAlenUgKyAlenUgZXJyICVkIiwKLSAgICAgICAgICAgICAgICBtUmVtYWluaW5nRnJhbWVzLCBhdmFpbCwgYXVkaW9CdWZmZXIuZnJhbWVDb3VudCwgbm9uQ29udGlnLCBlcnIpOworICAgICAgICBBTE9HVigiJXMoJWQpOiBvYnRhaW5CdWZmZXIoJXUpIHJldHVybmVkICV6dSA9ICV6dSArICV6dSBlcnIgJWQiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtSWQsIG1SZW1haW5pbmdGcmFtZXMsIGF2YWlsLCBhdWRpb0J1ZmZlci5mcmFtZUNvdW50LCBub25Db250aWcsIGVycik7CiAgICAgICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIGlmIChlcnIgPT0gVElNRURfT1VUIHx8IGVyciA9PSBXT1VMRF9CTE9DSyB8fCBlcnIgPT0gLUVJTlRSKSB7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBBTE9HRSgiRXJyb3IgJWQgb2J0YWluaW5nIGFuIGF1ZGlvIGJ1ZmZlciwgZ2l2aW5nIHVwLiIsIGVycik7CisgICAgICAgICAgICBBTE9HRSgiJXMoJWQpOiBFcnJvciAlZCBvYnRhaW5pbmcgYW4gYXVkaW8gYnVmZmVyLCBnaXZpbmcgdXAuIiwKKyAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1JZCwgZXJyKTsKICAgICAgICAgICAgIHJldHVybiBOU19ORVZFUjsKICAgICAgICAgfQogCkBAIC0xMjAzLDggKzEyMTksOCBAQAogCiAgICAgICAgIC8vIFNhbml0eSBjaGVjayBvbiByZXR1cm5lZCBzaXplCiAgICAgICAgIGlmIChzc2l6ZV90KHJlYWRTaXplKSA8IDAgfHwgcmVhZFNpemUgPiByZXFTaXplKSB7Ci0gICAgICAgICAgICBBTE9HRSgiRVZFTlRfTU9SRV9EQVRBIHJlcXVlc3RlZCAlenUgYnl0ZXMgYnV0IGNhbGxiYWNrIHJldHVybmVkICV6ZCBieXRlcyIsCi0gICAgICAgICAgICAgICAgICAgIHJlcVNpemUsIHNzaXplX3QocmVhZFNpemUpKTsKKyAgICAgICAgICAgIEFMT0dFKCIlcyglZCk6ICBFVkVOVF9NT1JFX0RBVEEgcmVxdWVzdGVkICV6dSBieXRlcyBidXQgY2FsbGJhY2sgcmV0dXJuZWQgJXpkIGJ5dGVzIiwKKyAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1JZCwgcmVxU2l6ZSwgc3NpemVfdChyZWFkU2l6ZSkpOwogICAgICAgICAgICAgcmV0dXJuIE5TX05FVkVSOwogICAgICAgICB9CiAKQEAgLTEyNjQsNyArMTI4MCw3IEBACiAKIHN0YXR1c190IEF1ZGlvUmVjb3JkOjpyZXN0b3JlUmVjb3JkX2woY29uc3QgY2hhciAqZnJvbSkKIHsKLSAgICBBTE9HVygiZGVhZCBJQXVkaW9SZWNvcmQsIGNyZWF0aW5nIGEgbmV3IG9uZSBmcm9tICVzKCkiLCBmcm9tKTsKKyAgICBBTE9HVygiJXMoJWQpOiBkZWFkIElBdWRpb1JlY29yZCwgY3JlYXRpbmcgYSBuZXcgb25lIGZyb20gJXMoKSIsIF9fZnVuY19fLCBtSWQsIGZyb20pOwogICAgICsrbVNlcXVlbmNlOwogCiAgICAgY29uc3QgaW50IElOSVRJQUxfUkVUUklFUyA9IDM7CkBAIC0xMjg0LDEwICsxMzAwLDcgQEAKICAgICBtTmV3UG9zaXRpb24gPSBwb3NpdGlvbiArIG1VcGRhdGVQZXJpb2Q7CiAgICAgc3RhdHVzX3QgcmVzdWx0ID0gY3JlYXRlUmVjb3JkX2wocG9zaXRpb24sIG1PcFBhY2thZ2VOYW1lKTsKIAotICAgIGlmIChyZXN1bHQgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgQUxPR1coIiVzKCk6IGNyZWF0ZVJlY29yZF9sIGZhaWxlZCwgZG8gbm90IHJldHJ5IiwgX19mdW5jX18pOwotICAgICAgICByZXRyaWVzID0gMDsKLSAgICB9IGVsc2UgeworICAgIGlmIChyZXN1bHQgPT0gTk9fRVJST1IpIHsKICAgICAgICAgaWYgKG1BY3RpdmUpIHsKICAgICAgICAgICAgIC8vIGNhbGxiYWNrIHRocmVhZCBvciBzeW5jIGV2ZW50IGhhc24ndCBjaGFuZ2VkCiAgICAgICAgICAgICAvLyBGSVhNRSB0aGlzIGZhaWxzIGlmIHdlIGhhdmUgYSBuZXcgQXVkaW9GbGluZ2VyIGluc3RhbmNlCkBAIC0xMjk4LDE1ICsxMzExLDE3IEBACiAgICAgfQogCiAgICAgaWYgKHJlc3VsdCAhPSBOT19FUlJPUikgewotICAgICAgICBBTE9HVygiJXMoKSBmYWlsZWQgc3RhdHVzICVkLCByZXRyaWVzICVkIiwgX19mdW5jX18sIHJlc3VsdCwgcmV0cmllcyk7CisgICAgICAgIEFMT0dXKCIlcyglZCk6IGZhaWxlZCBzdGF0dXMgJWQsIHJldHJpZXMgJWQiLCBfX2Z1bmNfXywgbUlkLCByZXN1bHQsIHJldHJpZXMpOwogICAgICAgICBpZiAoLS1yZXRyaWVzID4gMCkgeworICAgICAgICAgICAgLy8gbGVhdmUgdGltZSBmb3IgYW4gZXZlbnR1YWwgcmFjZSBjb25kaXRpb24gdG8gY2xlYXIgYmVmb3JlIHJldHJ5aW5nCisgICAgICAgICAgICB1c2xlZXAoNTAwMDAwKTsKICAgICAgICAgICAgIGdvdG8gcmV0cnk7CiAgICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAocmVzdWx0ICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIEFMT0dXKCJyZXN0b3JlUmVjb3JkX2woKSBmYWlsZWQgc3RhdHVzICVkIiwgcmVzdWx0KTsKLSAgICAgICAgbUFjdGl2ZSA9IGZhbHNlOworICAgICAgICAvLyBpZiBubyByZXRyaWVzIGxlZnQsIHNldCBpbnZhbGlkIGJpdCB0byBmb3JjZSByZXN0b3JpbmcgYXQgbmV4dCBvY2Nhc2lvbgorICAgICAgICAvLyBhbmQgYXZvaWQgaW5jb25zaXN0ZW50IGFjdGl2ZSBzdGF0ZSBvbiBjbGllbnQgYW5kIHNlcnZlciBzaWRlcworICAgICAgICBpZiAobUNibGsgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgYW5kcm9pZF9hdG9taWNfb3IoQ0JMS19JTlZBTElELCAmbUNibGstPm1GbGFncyk7CisgICAgICAgIH0KICAgICB9CiAKICAgICByZXR1cm4gcmVzdWx0OwpAQCAtMTMxNSwxOCArMTMzMCwxOCBAQAogc3RhdHVzX3QgQXVkaW9SZWNvcmQ6OmFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2soY29uc3Qgc3A8QXVkaW9TeXN0ZW06OkF1ZGlvRGV2aWNlQ2FsbGJhY2s+JiBjYWxsYmFjaykKIHsKICAgICBpZiAoY2FsbGJhY2sgPT0gMCkgewotICAgICAgICBBTE9HVygiJXMgYWRkaW5nIE5VTEwgY2FsbGJhY2shIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgQUxPR1coIiVzKCVkKTogYWRkaW5nIE5VTEwgY2FsbGJhY2shIiwgX19mdW5jX18sIG1JZCk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKICAgICBpZiAobURldmljZUNhbGxiYWNrLnVuc2FmZV9nZXQoKSA9PSBjYWxsYmFjay5nZXQoKSkgewotICAgICAgICBBTE9HVygiJXMgYWRkaW5nIHNhbWUgY2FsbGJhY2shIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgQUxPR1coIiVzKCVkKTogYWRkaW5nIHNhbWUgY2FsbGJhY2shIiwgX19mdW5jX18sIG1JZCk7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CiAgICAgaWYgKG1JbnB1dCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgewogICAgICAgICBpZiAobURldmljZUNhbGxiYWNrICE9IDApIHsKLSAgICAgICAgICAgIEFMT0dXKCIlcyBjYWxsYmFjayBhbHJlYWR5IHByZXNlbnQhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIEFMT0dXKCIlcyglZCk6IGNhbGxiYWNrIGFscmVhZHkgcHJlc2VudCEiLCBfX2Z1bmNfXywgbUlkKTsKICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrKHRoaXMsIG1JbnB1dCk7CiAgICAgICAgIH0KICAgICAgICAgc3RhdHVzID0gQXVkaW9TeXN0ZW06OmFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2sodGhpcywgbUlucHV0KTsKQEAgLTEzMzksMTIgKzEzNTQsMTIgQEAKICAgICAgICAgY29uc3Qgc3A8QXVkaW9TeXN0ZW06OkF1ZGlvRGV2aWNlQ2FsbGJhY2s+JiBjYWxsYmFjaykKIHsKICAgICBpZiAoY2FsbGJhY2sgPT0gMCkgewotICAgICAgICBBTE9HVygiJXMgcmVtb3ZpbmcgTlVMTCBjYWxsYmFjayEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICBBTE9HVygiJXMoJWQpOiByZW1vdmluZyBOVUxMIGNhbGxiYWNrISIsIF9fZnVuY19fLCBtSWQpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CiAgICAgaWYgKG1EZXZpY2VDYWxsYmFjay51bnNhZmVfZ2V0KCkgIT0gY2FsbGJhY2suZ2V0KCkpIHsKLSAgICAgICAgQUxPR1coIiVzIHJlbW92aW5nIGRpZmZlcmVudCBjYWxsYmFjayEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICBBTE9HVygiJXMoJWQpOiByZW1vdmluZyBkaWZmZXJlbnQgY2FsbGJhY2shIiwgX19mdW5jX18sIG1JZCk7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAgICAgbURldmljZUNhbGxiYWNrLmNsZWFyKCk7CkBAIC0xNDQ5LDcgKzE0NjQsNyBAQAogICAgICAgICBucyA9IElOVDY0X01BWDsKICAgICAgICAgRkFMTFRIUk9VR0hfSU5URU5ERUQ7CiAgICAgZGVmYXVsdDoKLSAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihucyA8IDAsICJwcm9jZXNzQXVkaW9CdWZmZXIoKSByZXR1cm5lZCAlIiBQUklkNjQsIG5zKTsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihucyA8IDAsICIlcygpIHJldHVybmVkICVsbGQiLCBfX2Z1bmNfXywgKGxvbmcgbG9uZylucyk7CiAgICAgICAgIHBhdXNlSW50ZXJuYWwobnMpOwogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1N5c3RlbS5jcHAgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1N5c3RlbS5jcHAKaW5kZXggYzA3MjkwMS4uZTI2MGZkOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9TeXN0ZW0uY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvU3lzdGVtLmNwcApAQCAtODc4LDMxICs4NzgsMjUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLCBzZWxlY3RlZERldmljZUlkLCBwb3J0SWQpOwogfQogCi1zdGF0dXNfdCBBdWRpb1N5c3RlbTo6c3RhcnRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQorc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnN0YXJ0T3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogewogICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CiAgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0gICAgcmV0dXJuIGFwcy0+c3RhcnRPdXRwdXQob3V0cHV0LCBzdHJlYW0sIHNlc3Npb24pOworICAgIHJldHVybiBhcHMtPnN0YXJ0T3V0cHV0KHBvcnRJZCk7CiB9CiAKLXN0YXR1c190IEF1ZGlvU3lzdGVtOjpzdG9wT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6c3RvcE91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKIHsKICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOwogICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgIHJldHVybiBhcHMtPnN0b3BPdXRwdXQob3V0cHV0LCBzdHJlYW0sIHNlc3Npb24pOworICAgIHJldHVybiBhcHMtPnN0b3BPdXRwdXQocG9ydElkKTsKIH0KIAotdm9pZCBBdWRpb1N5c3RlbTo6cmVsZWFzZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKK3ZvaWQgQXVkaW9TeXN0ZW06OnJlbGVhc2VPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiB7CiAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKICAgICBpZiAoYXBzID09IDApIHJldHVybjsKLSAgICBhcHMtPnJlbGVhc2VPdXRwdXQob3V0cHV0LCBzdHJlYW0sIHNlc3Npb24pOworICAgIGFwcy0+cmVsZWFzZU91dHB1dChwb3J0SWQpOwogfQogCiBzdGF0dXNfdCBBdWRpb1N5c3RlbTo6Z2V0SW5wdXRGb3JBdHRyKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKQEAgLTEyNDQsMTggKzEyMzgsMTggQEAKIAogc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnN0YXJ0QXVkaW9Tb3VyY2UoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHJpYnV0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkKQogewogICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CiAgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0gICAgcmV0dXJuIGFwcy0+c3RhcnRBdWRpb1NvdXJjZShzb3VyY2UsIGF0dHJpYnV0ZXMsIGhhbmRsZSk7CisgICAgcmV0dXJuIGFwcy0+c3RhcnRBdWRpb1NvdXJjZShzb3VyY2UsIGF0dHJpYnV0ZXMsIHBvcnRJZCk7CiB9CiAKLXN0YXR1c190IEF1ZGlvU3lzdGVtOjpzdG9wQXVkaW9Tb3VyY2UoYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKQorc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnN0b3BBdWRpb1NvdXJjZShhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKIHsKICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOwogICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgIHJldHVybiBhcHMtPnN0b3BBdWRpb1NvdXJjZShoYW5kbGUpOworICAgIHJldHVybiBhcHMtPnN0b3BBdWRpb1NvdXJjZShwb3J0SWQpOwogfQogCiBzdGF0dXNfdCBBdWRpb1N5c3RlbTo6c2V0TWFzdGVyTW9ubyhib29sIG1vbm8pCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1RyYWNrLmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvVHJhY2suY3BwCmluZGV4IDQ4ODFkZGMuLjk2ZmNjYWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvVHJhY2suY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvVHJhY2suY3BwCkBAIC0xMjAsMjIgKzEyMCwyMiBAQAogICAgIHN0YXR1c190IHN0YXR1czsKICAgICBzdGF0dXMgPSBBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0U2FtcGxpbmdSYXRlKCZhZlNhbXBsZVJhdGUsIHN0cmVhbVR5cGUpOwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBxdWVyeSBvdXRwdXQgc2FtcGxlIHJhdGUgZm9yIHN0cmVhbSB0eXBlICVkOyBzdGF0dXMgJWQiLAotICAgICAgICAgICAgICAgIHN0cmVhbVR5cGUsIHN0YXR1cyk7CisgICAgICAgIEFMT0dFKCIlcygpOiBVbmFibGUgdG8gcXVlcnkgb3V0cHV0IHNhbXBsZSByYXRlIGZvciBzdHJlYW0gdHlwZSAlZDsgc3RhdHVzICVkIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgc3RyZWFtVHlwZSwgc3RhdHVzKTsKICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9CiAgICAgc2l6ZV90IGFmRnJhbWVDb3VudDsKICAgICBzdGF0dXMgPSBBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0RnJhbWVDb3VudCgmYWZGcmFtZUNvdW50LCBzdHJlYW1UeXBlKTsKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIEFMT0dFKCJVbmFibGUgdG8gcXVlcnkgb3V0cHV0IGZyYW1lIGNvdW50IGZvciBzdHJlYW0gdHlwZSAlZDsgc3RhdHVzICVkIiwKLSAgICAgICAgICAgICAgICBzdHJlYW1UeXBlLCBzdGF0dXMpOworICAgICAgICBBTE9HRSgiJXMoKTogVW5hYmxlIHRvIHF1ZXJ5IG91dHB1dCBmcmFtZSBjb3VudCBmb3Igc3RyZWFtIHR5cGUgJWQ7IHN0YXR1cyAlZCIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIHN0cmVhbVR5cGUsIHN0YXR1cyk7CiAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQogICAgIHVpbnQzMl90IGFmTGF0ZW5jeTsKICAgICBzdGF0dXMgPSBBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0TGF0ZW5jeSgmYWZMYXRlbmN5LCBzdHJlYW1UeXBlKTsKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIEFMT0dFKCJVbmFibGUgdG8gcXVlcnkgb3V0cHV0IGxhdGVuY3kgZm9yIHN0cmVhbSB0eXBlICVkOyBzdGF0dXMgJWQiLAotICAgICAgICAgICAgICAgIHN0cmVhbVR5cGUsIHN0YXR1cyk7CisgICAgICAgIEFMT0dFKCIlcygpOiBVbmFibGUgdG8gcXVlcnkgb3V0cHV0IGxhdGVuY3kgZm9yIHN0cmVhbSB0eXBlICVkOyBzdGF0dXMgJWQiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBzdHJlYW1UeXBlLCBzdGF0dXMpOwogICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KIApAQCAtMTQ4LDEyICsxNDgsMTIgQEAKICAgICAvLyBBdWRpb1RyYWNrLlNBTVBMRV9SQVRFX0haX01JTiA8PSBzYW1wbGVSYXRlIDw9IEF1ZGlvVHJhY2suU0FNUExFX1JBVEVfSFpfTUFYLgogICAgIC8vIFJldHVybiBlcnJvciBpbiB0aGUgdW5saWtlbHkgZXZlbnQgdGhhdCBpdCBkb2VzIG5vdCwgYXMgdGhhdCdzIHBhcnQgb2YgdGhlIEFQSSBjb250cmFjdC4KICAgICBpZiAoKmZyYW1lQ291bnQgPT0gMCkgewotICAgICAgICBBTE9HRSgiQXVkaW9UcmFjazo6Z2V0TWluRnJhbWVDb3VudCBmYWlsZWQgZm9yIHN0cmVhbVR5cGUgJWQsIHNhbXBsZVJhdGUgJXUiLAotICAgICAgICAgICAgICAgIHN0cmVhbVR5cGUsIHNhbXBsZVJhdGUpOworICAgICAgICBBTE9HRSgiJXMoKTogZmFpbGVkIGZvciBzdHJlYW1UeXBlICVkLCBzYW1wbGVSYXRlICV1IiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgc3RyZWFtVHlwZSwgc2FtcGxlUmF0ZSk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQotICAgIEFMT0dWKCJnZXRNaW5GcmFtZUNvdW50PSV6dTogYWZGcmFtZUNvdW50PSV6dSwgYWZTYW1wbGVSYXRlPSV1LCBhZkxhdGVuY3k9JXUiLAotICAgICAgICAgICAgKmZyYW1lQ291bnQsIGFmRnJhbWVDb3VudCwgYWZTYW1wbGVSYXRlLCBhZkxhdGVuY3kpOworICAgIEFMT0dWKCIlcygpOiBnZXRNaW5GcmFtZUNvdW50PSV6dTogYWZGcmFtZUNvdW50PSV6dSwgYWZTYW1wbGVSYXRlPSV1LCBhZkxhdGVuY3k9JXUiLAorICAgICAgICAgICAgX19mdW5jX18sICpmcmFtZUNvdW50LCBhZkZyYW1lQ291bnQsIGFmU2FtcGxlUmF0ZSwgYWZMYXRlbmN5KTsKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKQEAgLTIwMSw3ICsyMDEsNyBAQAogICAgIC8vIFhYWDogc2hhbGwgd2UgZ2F0aGVyIGFsdGVybmF0aXZlIGluZm8gaWYgZmFpbGluZz8KICAgICBjb25zdCBzdGF0dXNfdCBsc3RhdHVzID0gdHJhY2stPmluaXRDaGVjaygpOwogICAgIGlmIChsc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIEFMT0dEKCJubyBtZXRyaWNzIGdhdGhlcmVkLCB0cmFjayBzdGF0dXM9JWQiLCAoaW50KSBsc3RhdHVzKTsKKyAgICAgICAgQUxPR0QoIiVzKCk6IG5vIG1ldHJpY3MgZ2F0aGVyZWQsIHRyYWNrIHN0YXR1cz0lZCIsIF9fZnVuY19fLCAoaW50KSBsc3RhdHVzKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIApAQCAtMzQzLDcgKzM0Myw4IEBACiAgICAgICAgIG1DYmxrTWVtb3J5LmNsZWFyKCk7CiAgICAgICAgIG1TaGFyZWRCdWZmZXIuY2xlYXIoKTsKICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOwotICAgICAgICBBTE9HVigifkF1ZGlvVHJhY2ssIHJlbGVhc2luZyBzZXNzaW9uIGlkICVkIGZyb20gJWQgb24gYmVoYWxmIG9mICVkIiwKKyAgICAgICAgQUxPR1YoIiVzKCVkKSwgcmVsZWFzaW5nIHNlc3Npb24gaWQgJWQgZnJvbSAlZCBvbiBiZWhhbGYgb2YgJWQiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtSWQsCiAgICAgICAgICAgICAgICAgbVNlc3Npb25JZCwgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpLCBtQ2xpZW50UGlkKTsKICAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VBdWRpb1Nlc3Npb25JZChtU2Vzc2lvbklkLCBtQ2xpZW50UGlkKTsKICAgICB9CkBAIC0zNzYsOCArMzc3LDEwIEBACiAgICAgcGlkX3QgY2FsbGluZ1BpZDsKICAgICBwaWRfdCBteVBpZDsKIAotICAgIEFMT0dWKCJzZXQoKTogc3RyZWFtVHlwZSAlZCwgc2FtcGxlUmF0ZSAldSwgZm9ybWF0ICUjeCwgY2hhbm5lbE1hc2sgJSN4LCBmcmFtZUNvdW50ICV6dSwgIgorICAgIC8vIE5vdGUgbUlkIGlzIG5vdCB2YWxpZCB1bnRpbCB0aGUgdHJhY2sgaXMgY3JlYXRlZCwgc28gb21pdCBtSWQgaW4gQUxPRyBmb3Igc2V0LgorICAgIEFMT0dWKCIlcygpOiBzdHJlYW1UeXBlICVkLCBzYW1wbGVSYXRlICV1LCBmb3JtYXQgJSN4LCBjaGFubmVsTWFzayAlI3gsIGZyYW1lQ291bnQgJXp1LCAiCiAgICAgICAgICAgImZsYWdzICMleCwgbm90aWZpY2F0aW9uRnJhbWVzICVkLCBzZXNzaW9uSWQgJWQsIHRyYW5zZmVyVHlwZSAlZCwgdWlkICVkLCBwaWQgJWQiLAorICAgICAgICAgIF9fZnVuY19fLAogICAgICAgICAgIHN0cmVhbVR5cGUsIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssIGZyYW1lQ291bnQsIGZsYWdzLCBub3RpZmljYXRpb25GcmFtZXMsCiAgICAgICAgICAgc2Vzc2lvbklkLCB0cmFuc2ZlclR5cGUsIHVpZCwgcGlkKTsKIApAQCAtMzk2LDggKzM5OSwxMCBAQAogICAgICAgICB9CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgVFJBTlNGRVJfQ0FMTEJBQ0s6CisgICAgY2FzZSBUUkFOU0ZFUl9TWU5DX05PVElGX0NBTExCQUNLOgogICAgICAgICBpZiAoY2JmID09IE5VTEwgfHwgc2hhcmVkQnVmZmVyICE9IDApIHsKLSAgICAgICAgICAgIEFMT0dFKCJUcmFuc2ZlciB0eXBlIFRSQU5TRkVSX0NBTExCQUNLIGJ1dCBjYmYgPT0gTlVMTCB8fCBzaGFyZWRCdWZmZXIgIT0gMCIpOworICAgICAgICAgICAgQUxPR0UoIiVzKCk6IFRyYW5zZmVyIHR5cGUgJXMgYnV0IGNiZiA9PSBOVUxMIHx8IHNoYXJlZEJ1ZmZlciAhPSAwIiwKKyAgICAgICAgICAgICAgICAgICAgY29udmVydFRyYW5zZmVyVG9UZXh0KHRyYW5zZmVyVHlwZSksIF9fZnVuY19fKTsKICAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgICAgIGdvdG8gZXhpdDsKICAgICAgICAgfQpAQCAtNDA1LDIwICs0MTAsMjEgQEAKICAgICBjYXNlIFRSQU5TRkVSX09CVEFJTjoKICAgICBjYXNlIFRSQU5TRkVSX1NZTkM6CiAgICAgICAgIGlmIChzaGFyZWRCdWZmZXIgIT0gMCkgewotICAgICAgICAgICAgQUxPR0UoIlRyYW5zZmVyIHR5cGUgVFJBTlNGRVJfT0JUQUlOIGJ1dCBzaGFyZWRCdWZmZXIgIT0gMCIpOworICAgICAgICAgICAgQUxPR0UoIiVzKCk6IFRyYW5zZmVyIHR5cGUgVFJBTlNGRVJfT0JUQUlOIGJ1dCBzaGFyZWRCdWZmZXIgIT0gMCIsIF9fZnVuY19fKTsKICAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgICAgIGdvdG8gZXhpdDsKICAgICAgICAgfQogICAgICAgICBicmVhazsKICAgICBjYXNlIFRSQU5TRkVSX1NIQVJFRDoKICAgICAgICAgaWYgKHNoYXJlZEJ1ZmZlciA9PSAwKSB7Ci0gICAgICAgICAgICBBTE9HRSgiVHJhbnNmZXIgdHlwZSBUUkFOU0ZFUl9TSEFSRUQgYnV0IHNoYXJlZEJ1ZmZlciA9PSAwIik7CisgICAgICAgICAgICBBTE9HRSgiJXMoKTogVHJhbnNmZXIgdHlwZSBUUkFOU0ZFUl9TSEFSRUQgYnV0IHNoYXJlZEJ1ZmZlciA9PSAwIiwgX19mdW5jX18pOwogICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICAgICAgZ290byBleGl0OwogICAgICAgICB9CiAgICAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6Ci0gICAgICAgIEFMT0dFKCJJbnZhbGlkIHRyYW5zZmVyIHR5cGUgJWQiLCB0cmFuc2ZlclR5cGUpOworICAgICAgICBBTE9HRSgiJXMoKTogSW52YWxpZCB0cmFuc2ZlciB0eXBlICVkIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgdHJhbnNmZXJUeXBlKTsKICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICBnb3RvIGV4aXQ7CiAgICAgfQpAQCAtNDI2LDE0ICs0MzIsMTUgQEAKICAgICBtVHJhbnNmZXIgPSB0cmFuc2ZlclR5cGU7CiAgICAgbURvTm90UmVjb25uZWN0ID0gZG9Ob3RSZWNvbm5lY3Q7CiAKLSAgICBBTE9HVl9JRihzaGFyZWRCdWZmZXIgIT0gMCwgInNoYXJlZEJ1ZmZlcjogJXAsIHNpemU6ICV6dSIsIHNoYXJlZEJ1ZmZlci0+cG9pbnRlcigpLAotICAgICAgICAgICAgc2hhcmVkQnVmZmVyLT5zaXplKCkpOworICAgIEFMT0dWX0lGKHNoYXJlZEJ1ZmZlciAhPSAwLCAiJXMoKTogc2hhcmVkQnVmZmVyOiAlcCwgc2l6ZTogJXp1IiwKKyAgICAgICAgICAgIF9fZnVuY19fLCBzaGFyZWRCdWZmZXItPnBvaW50ZXIoKSwgc2hhcmVkQnVmZmVyLT5zaXplKCkpOwogCi0gICAgQUxPR1YoInNldCgpIHN0cmVhbVR5cGUgJWQgZnJhbWVDb3VudCAlenUgZmxhZ3MgJTA0eCIsIHN0cmVhbVR5cGUsIGZyYW1lQ291bnQsIGZsYWdzKTsKKyAgICBBTE9HVigiJXMoKTogc3RyZWFtVHlwZSAlZCBmcmFtZUNvdW50ICV6dSBmbGFncyAlMDR4IiwKKyAgICAgICAgICAgIF9fZnVuY19fLCBzdHJlYW1UeXBlLCBmcmFtZUNvdW50LCBmbGFncyk7CiAKICAgICAvLyBpbnZhcmlhbnQgdGhhdCBtQXVkaW9UcmFjayAhPSAwIGlzIHRydWUgb25seSBhZnRlciBzZXQoKSByZXR1cm5zIHN1Y2Nlc3NmdWxseQogICAgIGlmIChtQXVkaW9UcmFjayAhPSAwKSB7Ci0gICAgICAgIEFMT0dFKCJUcmFjayBhbHJlYWR5IGluIHVzZSIpOworICAgICAgICBBTE9HRSgiJXMoKTogVHJhY2sgYWxyZWFkeSBpbiB1c2UiLCBfX2Z1bmNfXyk7CiAgICAgICAgIHN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICBnb3RvIGV4aXQ7CiAgICAgfQpAQCAtNDQ0LDcgKzQ1MSw3IEBACiAgICAgfQogICAgIGlmIChwQXR0cmlidXRlcyA9PSBOVUxMKSB7CiAgICAgICAgIGlmICh1aW50MzJfdChzdHJlYW1UeXBlKSA+PSBBVURJT19TVFJFQU1fUFVCTElDX0NOVCkgewotICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgc3RyZWFtIHR5cGUgJWQiLCBzdHJlYW1UeXBlKTsKKyAgICAgICAgICAgIEFMT0dFKCIlcygpOiBJbnZhbGlkIHN0cmVhbSB0eXBlICVkIiwgX19mdW5jX18sIHN0cmVhbVR5cGUpOwogICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICAgICAgZ290byBleGl0OwogICAgICAgICB9CkBAIC00NTMsOCArNDYwLDEwIEBACiAgICAgfSBlbHNlIHsKICAgICAgICAgLy8gc3RyZWFtIHR5cGUgc2hvdWxkbid0IGJlIGxvb2tlZCBhdCwgdGhpcyB0cmFjayBoYXMgYXVkaW8gYXR0cmlidXRlcwogICAgICAgICBtZW1jcHkoJm1BdHRyaWJ1dGVzLCBwQXR0cmlidXRlcywgc2l6ZW9mKGF1ZGlvX2F0dHJpYnV0ZXNfdCkpOwotICAgICAgICBBTE9HVigiQnVpbGRpbmcgQXVkaW9UcmFjayB3aXRoIGF0dHJpYnV0ZXM6IHVzYWdlPSVkIGNvbnRlbnQ9JWQgZmxhZ3M9MHgleCB0YWdzPVslc10iLAotICAgICAgICAgICAgICAgIG1BdHRyaWJ1dGVzLnVzYWdlLCBtQXR0cmlidXRlcy5jb250ZW50X3R5cGUsIG1BdHRyaWJ1dGVzLmZsYWdzLCBtQXR0cmlidXRlcy50YWdzKTsKKyAgICAgICAgQUxPR1YoIiVzKCk6IEJ1aWxkaW5nIEF1ZGlvVHJhY2sgd2l0aCBhdHRyaWJ1dGVzOiIKKyAgICAgICAgICAgICAgICAiIHVzYWdlPSVkIGNvbnRlbnQ9JWQgZmxhZ3M9MHgleCB0YWdzPVslc10iLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLAorICAgICAgICAgICAgICAgICBtQXR0cmlidXRlcy51c2FnZSwgbUF0dHJpYnV0ZXMuY29udGVudF90eXBlLCBtQXR0cmlidXRlcy5mbGFncywgbUF0dHJpYnV0ZXMudGFncyk7CiAgICAgICAgIG1TdHJlYW1UeXBlID0gQVVESU9fU1RSRUFNX0RFRkFVTFQ7CiAgICAgICAgIGlmICgobUF0dHJpYnV0ZXMuZmxhZ3MgJiBBVURJT19GTEFHX0hXX0FWX1NZTkMpICE9IDApIHsKICAgICAgICAgICAgIGZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KShmbGFncyB8IEFVRElPX09VVFBVVF9GTEFHX0hXX0FWX1NZTkMpOwpAQCAtNDc3LDE0ICs0ODYsMTQgQEAKIAogICAgIC8vIHZhbGlkYXRlIHBhcmFtZXRlcnMKICAgICBpZiAoIWF1ZGlvX2lzX3ZhbGlkX2Zvcm1hdChmb3JtYXQpKSB7Ci0gICAgICAgIEFMT0dFKCJJbnZhbGlkIGZvcm1hdCAlI3giLCBmb3JtYXQpOworICAgICAgICBBTE9HRSgiJXMoKTogSW52YWxpZCBmb3JtYXQgJSN4IiwgX19mdW5jX18sIGZvcm1hdCk7CiAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgZ290byBleGl0OwogICAgIH0KICAgICBtRm9ybWF0ID0gZm9ybWF0OwogCiAgICAgaWYgKCFhdWRpb19pc19vdXRwdXRfY2hhbm5lbChjaGFubmVsTWFzaykpIHsKLSAgICAgICAgQUxPR0UoIkludmFsaWQgY2hhbm5lbCBtYXNrICUjeCIsIGNoYW5uZWxNYXNrKTsKKyAgICAgICAgQUxPR0UoIiVzKCk6IEludmFsaWQgY2hhbm5lbCBtYXNrICUjeCIsICBfX2Z1bmNfXywgY2hhbm5lbE1hc2spOwogICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgIGdvdG8gZXhpdDsKICAgICB9CkBAIC00OTcsOCArNTA2LDkgQEAKICAgICBpZiAoKGZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCkKICAgICAgICAgICAgIHx8ICFhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdCkpIHsKICAgICAgICAgQUxPR1YoIChmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpCi0gICAgICAgICAgICAgICAgICAgID8gIk9mZmxvYWQgcmVxdWVzdCwgZm9yY2luZyB0byBEaXJlY3QgT3V0cHV0IgotICAgICAgICAgICAgICAgICAgICA6ICJOb3QgbGluZWFyIFBDTSwgZm9yY2luZyB0byBEaXJlY3QgT3V0cHV0Iik7CisgICAgICAgICAgICAgICAgICAgID8gIiVzKCk6IE9mZmxvYWQgcmVxdWVzdCwgZm9yY2luZyB0byBEaXJlY3QgT3V0cHV0IgorICAgICAgICAgICAgICAgICAgICA6ICIlcygpOiBOb3QgbGluZWFyIFBDTSwgZm9yY2luZyB0byBEaXJlY3QgT3V0cHV0IiwKKyAgICAgICAgICAgICAgICAgICAgX19mdW5jX18pOwogICAgICAgICBmbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdCkKICAgICAgICAgICAgICAgICAvLyBGSVhNRSB3aHkgY2FuJ3Qgd2UgYWxsb3cgZGlyZWN0IEFORCBmYXN0PwogICAgICAgICAgICAgICAgICgoZmxhZ3MgfCBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpICYgfkFVRElPX09VVFBVVF9GTEFHX0ZBU1QpOwpAQCAtNTU0LDE0ICs1NjQsMTQgQEAKICAgICAgICAgbU5vdGlmaWNhdGlvbnNQZXJCdWZmZXJSZXEgPSAwOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGlmICghKGZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCkpIHsKLSAgICAgICAgICAgIEFMT0dFKCJub3RpZmljYXRpb25GcmFtZXM9JWQgbm90IHBlcm1pdHRlZCBmb3Igbm9uLWZhc3QgdHJhY2siLAotICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb25GcmFtZXMpOworICAgICAgICAgICAgQUxPR0UoIiVzKCk6IG5vdGlmaWNhdGlvbkZyYW1lcz0lZCBub3QgcGVybWl0dGVkIGZvciBub24tZmFzdCB0cmFjayIsCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBub3RpZmljYXRpb25GcmFtZXMpOwogICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICAgICAgZ290byBleGl0OwogICAgICAgICB9CiAgICAgICAgIGlmIChmcmFtZUNvdW50ID4gMCkgewotICAgICAgICAgICAgQUxPR0UoIm5vdGlmaWNhdGlvbkZyYW1lcz0lZCBub3QgcGVybWl0dGVkIHdpdGggbm9uLXplcm8gZnJhbWVDb3VudD0lenUiLAotICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb25GcmFtZXMsIGZyYW1lQ291bnQpOworICAgICAgICAgICAgQUxPR0UoIiVzKCk6IG5vdGlmaWNhdGlvbkZyYW1lcz0lZCBub3QgcGVybWl0dGVkIHdpdGggbm9uLXplcm8gZnJhbWVDb3VudD0lenUiLAorICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbm90aWZpY2F0aW9uRnJhbWVzLCBmcmFtZUNvdW50KTsKICAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgICAgIGdvdG8gZXhpdDsKICAgICAgICAgfQpAQCAtNTcxLDcgKzU4MSw4IEBACiAgICAgICAgIG1Ob3RpZmljYXRpb25zUGVyQnVmZmVyUmVxID0gbWluKG1heE5vdGlmaWNhdGlvbnNQZXJCdWZmZXIsCiAgICAgICAgICAgICAgICAgbWF4KCh1aW50MzJfdCkgLW5vdGlmaWNhdGlvbkZyYW1lcywgbWluTm90aWZpY2F0aW9uc1BlckJ1ZmZlcikpOwogICAgICAgICBBTE9HV19JRihtTm90aWZpY2F0aW9uc1BlckJ1ZmZlclJlcSAhPSAodWludDMyX3QpIC1ub3RpZmljYXRpb25GcmFtZXMsCi0gICAgICAgICAgICAgICAgIm5vdGlmaWNhdGlvbkZyYW1lcz0lZCBjbGFtcGVkIHRvIHRoZSByYW5nZSAtJXUgdG8gLSV1IiwKKyAgICAgICAgICAgICAgICAiJXMoKTogbm90aWZpY2F0aW9uRnJhbWVzPSVkIGNsYW1wZWQgdG8gdGhlIHJhbmdlIC0ldSB0byAtJXUiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLAogICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbkZyYW1lcywgbWluTm90aWZpY2F0aW9uc1BlckJ1ZmZlciwgbWF4Tm90aWZpY2F0aW9uc1BlckJ1ZmZlcik7CiAgICAgfQogICAgIG1Ob3RpZmljYXRpb25GcmFtZXNBY3QgPSAwOwpAQCAtNjQ3LDYgKzY1OCw3IEBACiBzdGF0dXNfdCBBdWRpb1RyYWNrOjpzdGFydCgpCiB7CiAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOworICAgIEFMT0dWKCIlcyglZCk6IHByaW9yIHN0YXRlOiVzIiwgX19mdW5jX18sIG1JZCwgc3RhdGVUb1N0cmluZyhtU3RhdGUpKTsKIAogICAgIGlmIChtU3RhdGUgPT0gU1RBVEVfQUNUSVZFKSB7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKQEAgLTY4Niw3ICs2OTgsOCBAQAogICAgICAgICAgICAgLy8gU2VydmVyIHNpZGUgaGFzIGNvbnN1bWVkIHNvbWV0aGluZywgYnV0IGlzIGl0IGZpbmlzaGVkIGNvbnN1bWluZz8KICAgICAgICAgICAgIC8vIEl0IGlzIHBvc3NpYmxlIHNpbmNlIGZsdXNoIGFuZCBzdG9wIGFyZSBhc3luY2hyb25vdXMgdGhhdCB0aGUgc2VydmVyCiAgICAgICAgICAgICAvLyBpcyBzdGlsbCBhY3RpdmUgYXQgdGhpcyBwb2ludC4KLSAgICAgICAgICAgIEFMT0dWKCJzdGFydDogc2VydmVyIHJlYWQ6JWxsZCAgY3VtdWxhdGl2ZSBmbHVzaGVkOiVsbGQgIGNsaWVudCB3cml0dGVuOiVsbGQiLAorICAgICAgICAgICAgQUxPR1YoIiVzKCVkKTogc2VydmVyIHJlYWQ6JWxsZCAgY3VtdWxhdGl2ZSBmbHVzaGVkOiVsbGQgIGNsaWVudCB3cml0dGVuOiVsbGQiLAorICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbUlkLAogICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKShtRnJhbWVzV3JpdHRlblNlcnZlck9mZnNldAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbVN0YXJ0RXRzLm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fU0VSVkVSXSksCiAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpbVN0YXJ0RXRzLm1GbHVzaGVkLApAQCAtNzQ3LDcgKzc2MCw3IEBACiAgICAgICAgIC8vIFN0YXJ0IG91ciBsb2NhbCBWb2x1bWVIYW5kbGVyIGZvciByZXN0b3JhdGlvbiBwdXJwb3Nlcy4KICAgICAgICAgbVZvbHVtZUhhbmRsZXItPnNldFN0YXJ0ZWQoKTsKICAgICB9IGVsc2UgewotICAgICAgICBBTE9HRSgic3RhcnQoKSBzdGF0dXMgJWQiLCBzdGF0dXMpOworICAgICAgICBBTE9HRSgiJXMoJWQpOiBzdGF0dXMgJWQiLCBfX2Z1bmNfXywgbUlkLCBzdGF0dXMpOwogICAgICAgICBtU3RhdGUgPSBwcmV2aW91c1N0YXRlOwogICAgICAgICBpZiAodCAhPSAwKSB7CiAgICAgICAgICAgICBpZiAocHJldmlvdXNTdGF0ZSAhPSBTVEFURV9TVE9QUElORykgewpAQCAtNzY1LDYgKzc3OCw4IEBACiB2b2lkIEF1ZGlvVHJhY2s6OnN0b3AoKQogewogICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKKyAgICBBTE9HVigiJXMoJWQpOiBwcmlvciBzdGF0ZTolcyIsIF9fZnVuY19fLCBtSWQsIHN0YXRlVG9TdHJpbmcobVN0YXRlKSk7CisKICAgICBpZiAobVN0YXRlICE9IFNUQVRFX0FDVElWRSAmJiBtU3RhdGUgIT0gU1RBVEVfUEFVU0VEKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CkBAIC03NzQsNyArNzg5LDcgQEAKICAgICB9IGVsc2UgewogICAgICAgICBtU3RhdGUgPSBTVEFURV9TVE9QUEVEOwogICAgICAgICBBTE9HRF9JRihtU2hhcmVkQnVmZmVyID09IG51bGxwdHIsCi0gICAgICAgICAgICAgICAgInN0b3AoKSBjYWxsZWQgd2l0aCAldSBmcmFtZXMgZGVsaXZlcmVkIiwgbVJlbGVhc2VkLnZhbHVlKCkpOworICAgICAgICAgICAgICAgICIlcyglZCk6IGNhbGxlZCB3aXRoICV1IGZyYW1lcyBkZWxpdmVyZWQiLCBfX2Z1bmNfXywgbUlkLCBtUmVsZWFzZWQudmFsdWUoKSk7CiAgICAgICAgIG1SZWxlYXNlZCA9IDA7CiAgICAgfQogCkBAIC03OTUsNiArODEwLDEzIEBACiAgICAgaWYgKHQgIT0gMCkgewogICAgICAgICBpZiAoIWlzT2ZmbG9hZGVkX2woKSkgewogICAgICAgICAgICAgdC0+cGF1c2UoKTsKKyAgICAgICAgfSBlbHNlIGlmIChtVHJhbnNmZXIgPT0gVFJBTlNGRVJfU1lOQ19OT1RJRl9DQUxMQkFDSykgeworICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9UcmFja1RocmVhZD4gdCA9IG1BdWRpb1RyYWNrVGhyZWFkOworICAgICAgICAgICAgaWYgKHQgIT0gMCkgeworICAgICAgICAgICAgICAgIC8vIGNhdXNlcyB3YWtlIHVwIG9mIHRoZSBwbGF5YmFjayB0aHJlYWQsIHRoYXQgd2lsbCBjYWxsYmFjayB0aGUgY2xpZW50IGZvcgorICAgICAgICAgICAgICAgIC8vIEVWRU5UX1NUUkVBTV9FTkQgaW4gcHJvY2Vzc0F1ZGlvQnVmZmVyKCkKKyAgICAgICAgICAgICAgICB0LT53YWtlKCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICBzZXRwcmlvcml0eShQUklPX1BST0NFU1MsIDAsIG1QcmV2aW91c1ByaW9yaXR5KTsKQEAgLTgxMCwxMCArODMyLDEyIEBACiAKIHZvaWQgQXVkaW9UcmFjazo6Zmx1c2goKQogeworICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKKyAgICBBTE9HVigiJXMoJWQpOiBwcmlvciBzdGF0ZTolcyIsIF9fZnVuY19fLCBtSWQsIHN0YXRlVG9TdHJpbmcobVN0YXRlKSk7CisKICAgICBpZiAobVNoYXJlZEJ1ZmZlciAhPSAwKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgQXV0b011dGV4IGxvY2sobUxvY2spOwogICAgIGlmIChtU3RhdGUgPT0gU1RBVEVfQUNUSVZFKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CkBAIC04NDIsNiArODY2LDggQEAKIHZvaWQgQXVkaW9UcmFjazo6cGF1c2UoKQogewogICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKKyAgICBBTE9HVigiJXMoJWQpOiBwcmlvciBzdGF0ZTolcyIsIF9fZnVuY19fLCBtSWQsIHN0YXRlVG9TdHJpbmcobVN0YXRlKSk7CisKICAgICBpZiAobVN0YXRlID09IFNUQVRFX0FDVElWRSkgewogICAgICAgICBtU3RhdGUgPSBTVEFURV9QQVVTRUQ7CiAgICAgfSBlbHNlIGlmIChtU3RhdGUgPT0gU1RBVEVfU1RPUFBJTkcpIHsKQEAgLTg2Nyw3ICs4OTMsOCBAQAogCiAgICAgICAgICAgICB1aW50MzJfdCBoYWxGcmFtZXM7CiAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6Z2V0UmVuZGVyUG9zaXRpb24obU91dHB1dCwgJmhhbEZyYW1lcywgJm1QYXVzZWRQb3NpdGlvbik7Ci0gICAgICAgICAgICBBTE9HVigiQXVkaW9UcmFjazo6cGF1c2UgZm9yIG9mZmxvYWQsIGNhY2hlIGN1cnJlbnQgcG9zaXRpb24gJXUiLCBtUGF1c2VkUG9zaXRpb24pOworICAgICAgICAgICAgQUxPR1YoIiVzKCVkKTogZm9yIG9mZmxvYWQsIGNhY2hlIGN1cnJlbnQgcG9zaXRpb24gJXUiLAorICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbUlkLCBtUGF1c2VkUG9zaXRpb24pOwogICAgICAgICB9CiAgICAgfQogfQpAQCAtOTIxLDYgKzk0OCw4IEBACiBzdGF0dXNfdCBBdWRpb1RyYWNrOjpzZXRTYW1wbGVSYXRlKHVpbnQzMl90IHJhdGUpCiB7CiAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOworICAgIEFMT0dWKCIlcyglZCk6IHByaW9yIHN0YXRlOiVzIHJhdGU6JXUiLCBfX2Z1bmNfXywgbUlkLCBzdGF0ZVRvU3RyaW5nKG1TdGF0ZSksIHJhdGUpOworCiAgICAgaWYgKHJhdGUgPT0gbVNhbXBsZVJhdGUpIHsKICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgIH0KQEAgLTk4Niw4ICsxMDE1LDggQEAKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIAotICAgIEFMT0dWKCJzZXRQbGF5YmFja1JhdGUgKGlucHV0KTogbVNhbXBsZVJhdGU6JXUgIG1TcGVlZDolZiAgbVBpdGNoOiVmIiwKLSAgICAgICAgICAgIG1TYW1wbGVSYXRlLCBwbGF5YmFja1JhdGUubVNwZWVkLCBwbGF5YmFja1JhdGUubVBpdGNoKTsKKyAgICBBTE9HVigiJXMoJWQpOiBtU2FtcGxlUmF0ZToldSAgbVNwZWVkOiVmICBtUGl0Y2g6JWYiLAorICAgICAgICAgICAgX19mdW5jX18sIG1JZCwgbVNhbXBsZVJhdGUsIHBsYXliYWNrUmF0ZS5tU3BlZWQsIHBsYXliYWNrUmF0ZS5tUGl0Y2gpOwogICAgIC8vIHBpdGNoIGlzIGVtdWxhdGVkIGJ5IGFkanVzdGluZyBzcGVlZCBhbmQgc2FtcGxlUmF0ZQogICAgIGNvbnN0IHVpbnQzMl90IGVmZmVjdGl2ZVJhdGUgPSBhZGp1c3RTYW1wbGVSYXRlKG1TYW1wbGVSYXRlLCBwbGF5YmFja1JhdGUubVBpdGNoKTsKICAgICBjb25zdCBmbG9hdCBlZmZlY3RpdmVTcGVlZCA9IGFkanVzdFNwZWVkKHBsYXliYWNrUmF0ZS5tU3BlZWQsIHBsYXliYWNrUmF0ZS5tUGl0Y2gpOwpAQCAtOTk2LDMyICsxMDI1LDMyIEBACiAgICAgcGxheWJhY2tSYXRlVGVtcC5tU3BlZWQgPSBlZmZlY3RpdmVTcGVlZDsKICAgICBwbGF5YmFja1JhdGVUZW1wLm1QaXRjaCA9IGVmZmVjdGl2ZVBpdGNoOwogCi0gICAgQUxPR1YoInNldFBsYXliYWNrUmF0ZSAoZWZmZWN0aXZlKTogbVNhbXBsZVJhdGU6JXUgIG1TcGVlZDolZiAgbVBpdGNoOiVmIiwKLSAgICAgICAgICAgIGVmZmVjdGl2ZVJhdGUsIGVmZmVjdGl2ZVNwZWVkLCBlZmZlY3RpdmVQaXRjaCk7CisgICAgQUxPR1YoIiVzKCVkKSAoZWZmZWN0aXZlKSBtU2FtcGxlUmF0ZToldSAgbVNwZWVkOiVmICBtUGl0Y2g6JWYiLAorICAgICAgICAgICAgX19mdW5jX18sIG1JZCwgZWZmZWN0aXZlUmF0ZSwgZWZmZWN0aXZlU3BlZWQsIGVmZmVjdGl2ZVBpdGNoKTsKIAogICAgIGlmICghaXNBdWRpb1BsYXliYWNrUmF0ZVZhbGlkKHBsYXliYWNrUmF0ZVRlbXApKSB7Ci0gICAgICAgIEFMT0dXKCJzZXRQbGF5YmFja1JhdGUoJWYsICVmKSBmYWlsZWQgKGVmZmVjdGl2ZSByYXRlIG91dCBvZiBib3VuZHMpIiwKLSAgICAgICAgICAgICAgICBwbGF5YmFja1JhdGUubVNwZWVkLCBwbGF5YmFja1JhdGUubVBpdGNoKTsKKyAgICAgICAgQUxPR1coIiVzKCVkKSAoJWYsICVmKSBmYWlsZWQgKGVmZmVjdGl2ZSByYXRlIG91dCBvZiBib3VuZHMpIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbUlkLCBwbGF5YmFja1JhdGUubVNwZWVkLCBwbGF5YmFja1JhdGUubVBpdGNoKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAgICAgLy8gQ2hlY2sgaWYgdGhlIGJ1ZmZlciBzaXplIGlzIGNvbXBhdGlibGUuCiAgICAgaWYgKCFpc1NhbXBsZVJhdGVTcGVlZEFsbG93ZWRfbChlZmZlY3RpdmVSYXRlLCBlZmZlY3RpdmVTcGVlZCkpIHsKLSAgICAgICAgQUxPR1coInNldFBsYXliYWNrUmF0ZSglZiwgJWYpIGZhaWxlZCAoYnVmZmVyIHNpemUpIiwKLSAgICAgICAgICAgICAgICBwbGF5YmFja1JhdGUubVNwZWVkLCBwbGF5YmFja1JhdGUubVBpdGNoKTsKKyAgICAgICAgQUxPR1coIiVzKCVkKSAoJWYsICVmKSBmYWlsZWQgKGJ1ZmZlciBzaXplKSIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIG1JZCwgcGxheWJhY2tSYXRlLm1TcGVlZCwgcGxheWJhY2tSYXRlLm1QaXRjaCk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCiAgICAgLy8gQ2hlY2sgcmVzYW1wbGVyIHJhdGlvcyBhcmUgd2l0aGluIGJvdW5kcwogICAgIGlmICgodWludDY0X3QpZWZmZWN0aXZlUmF0ZSA+ICh1aW50NjRfdCltU2FtcGxlUmF0ZSAqCiAgICAgICAgICAgICAodWludDY0X3QpQVVESU9fUkVTQU1QTEVSX0RPV05fUkFUSU9fTUFYKSB7Ci0gICAgICAgIEFMT0dXKCJzZXRQbGF5YmFja1JhdGUoJWYsICVmKSBmYWlsZWQuIFJlc2FtcGxlIHJhdGUgZXhjZWVkcyBtYXggYWNjZXB0ZWQgdmFsdWUiLAotICAgICAgICAgICAgICAgIHBsYXliYWNrUmF0ZS5tU3BlZWQsIHBsYXliYWNrUmF0ZS5tUGl0Y2gpOworICAgICAgICBBTE9HVygiJXMoJWQpICglZiwgJWYpIGZhaWxlZC4gUmVzYW1wbGUgcmF0ZSBleGNlZWRzIG1heCBhY2NlcHRlZCB2YWx1ZSIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIG1JZCwgcGxheWJhY2tSYXRlLm1TcGVlZCwgcGxheWJhY2tSYXRlLm1QaXRjaCk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCiAgICAgaWYgKCh1aW50NjRfdCllZmZlY3RpdmVSYXRlICogKHVpbnQ2NF90KUFVRElPX1JFU0FNUExFUl9VUF9SQVRJT19NQVggPCAodWludDY0X3QpbVNhbXBsZVJhdGUpIHsKLSAgICAgICAgQUxPR1coInNldFBsYXliYWNrUmF0ZSglZiwgJWYpIGZhaWxlZC4gUmVzYW1wbGUgcmF0ZSBiZWxvdyBtaW4gYWNjZXB0ZWQgdmFsdWUiLAotICAgICAgICAgICAgICAgICAgICAgICAgcGxheWJhY2tSYXRlLm1TcGVlZCwgcGxheWJhY2tSYXRlLm1QaXRjaCk7CisgICAgICAgIEFMT0dXKCIlcyglZCkgKCVmLCAlZikgZmFpbGVkLiBSZXNhbXBsZSByYXRlIGJlbG93IG1pbiBhY2NlcHRlZCB2YWx1ZSIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIG1JZCwgcGxheWJhY2tSYXRlLm1TcGVlZCwgcGxheWJhY2tSYXRlLm1QaXRjaCk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogICAgIG1QbGF5YmFja1JhdGUgPSBwbGF5YmFja1JhdGU7CkBAIC0xMjIyLDcgKzEyNTEsOCBAQAogICAgICAgICB1aW50MzJfdCBkc3BGcmFtZXMgPSAwOwogCiAgICAgICAgIGlmIChpc09mZmxvYWRlZF9sKCkgJiYgKChtU3RhdGUgPT0gU1RBVEVfUEFVU0VEKSB8fCAobVN0YXRlID09IFNUQVRFX1BBVVNFRF9TVE9QUElORykpKSB7Ci0gICAgICAgICAgICBBTE9HVigiZ2V0UG9zaXRpb24gY2FsbGVkIGluIHBhdXNlZCBzdGF0ZSwgcmV0dXJuIGNhY2hlZCBwb3NpdGlvbiAldSIsIG1QYXVzZWRQb3NpdGlvbik7CisgICAgICAgICAgICBBTE9HVigiJXMoJWQpOiBjYWxsZWQgaW4gcGF1c2VkIHN0YXRlLCByZXR1cm4gY2FjaGVkIHBvc2l0aW9uICV1IiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbUlkLCBtUGF1c2VkUG9zaXRpb24pOwogICAgICAgICAgICAgKnBvc2l0aW9uID0gbVBhdXNlZFBvc2l0aW9uOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9CkBAIC0xMzY4LDcgKzEzOTgsNyBAQAogewogICAgIHN0YXR1c190IHN0YXR1cyA9IEF1ZGlvU3lzdGVtOjpnZXRMYXRlbmN5KG1PdXRwdXQsICZtQWZMYXRlbmN5KTsKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIEFMT0dXKCJnZXRMYXRlbmN5KCVkKSBmYWlsZWQgc3RhdHVzICVkIiwgbU91dHB1dCwgc3RhdHVzKTsKKyAgICAgICAgQUxPR1coIiVzKCVkKTogZ2V0TGF0ZW5jeSglZCkgZmFpbGVkIHN0YXR1cyAlZCIsIF9fZnVuY19fLCBtSWQsIG1PdXRwdXQsIHN0YXR1cyk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgLy8gRklYTUUgZG9uJ3QgYmVsaWV2ZSB0aGlzIGxpZQogICAgICAgICBtTGF0ZW5jeSA9IG1BZkxhdGVuY3kgKyAoMTAwMExMICogbUZyYW1lQ291bnQpIC8gbVNhbXBsZVJhdGU7CkBAIC0xMzg0LDYgKzE0MTQsNyBAQAogICAgICAgICBNRURJQV9DQVNFX0VOVU0oVFJBTlNGRVJfT0JUQUlOKTsKICAgICAgICAgTUVESUFfQ0FTRV9FTlVNKFRSQU5TRkVSX1NZTkMpOwogICAgICAgICBNRURJQV9DQVNFX0VOVU0oVFJBTlNGRVJfU0hBUkVEKTsKKyAgICAgICAgTUVESUFfQ0FTRV9FTlVNKFRSQU5TRkVSX1NZTkNfTk9USUZfQ0FMTEJBQ0spOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgcmV0dXJuICJVTlJFQ09HTklaRUQiOwogICAgIH0KQEAgLTEzOTYsNyArMTQyNyw4IEBACiAKICAgICBjb25zdCBzcDxJQXVkaW9GbGluZ2VyPiYgYXVkaW9GbGluZ2VyID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CiAgICAgaWYgKGF1ZGlvRmxpbmdlciA9PSAwKSB7Ci0gICAgICAgIEFMT0dFKCJDb3VsZCBub3QgZ2V0IGF1ZGlvZmxpbmdlciIpOworICAgICAgICBBTE9HRSgiJXMoJWQpOiBDb3VsZCBub3QgZ2V0IGF1ZGlvZmxpbmdlciIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIG1JZCk7CiAgICAgICAgIHN0YXR1cyA9IE5PX0lOSVQ7CiAgICAgICAgIGdvdG8gZXhpdDsKICAgICB9CkBAIC0xNDE1LDExICsxNDQ3LDE0IEBACiAgICAgICAgICAgICAvLyB1c2UgY2FzZSAzOiBvYnRhaW4vcmVsZWFzZSBtb2RlCiAgICAgICAgICAgICAobVRyYW5zZmVyID09IFRSQU5TRkVSX09CVEFJTikgfHwKICAgICAgICAgICAgIC8vIHVzZSBjYXNlIDQ6IHN5bmNocm9ub3VzIHdyaXRlCi0gICAgICAgICAgICAoKG1UcmFuc2ZlciA9PSBUUkFOU0ZFUl9TWU5DKSAmJiBtVGhyZWFkQ2FuQ2FsbEphdmEpOworICAgICAgICAgICAgKChtVHJhbnNmZXIgPT0gVFJBTlNGRVJfU1lOQyB8fCBtVHJhbnNmZXIgPT0gVFJBTlNGRVJfU1lOQ19OT1RJRl9DQUxMQkFDSykKKyAgICAgICAgICAgICAgICAgICAgJiYgbVRocmVhZENhbkNhbGxKYXZhKTsKIAogICAgICAgICBib29sIGZhc3RBbGxvd2VkID0gc2hhcmVkQnVmZmVyIHx8IHRyYW5zZmVyQWxsb3dlZDsKICAgICAgICAgaWYgKCFmYXN0QWxsb3dlZCkgewotICAgICAgICAgICAgQUxPR1coIkFVRElPX09VVFBVVF9GTEFHX0ZBU1QgZGVuaWVkIGJ5IGNsaWVudCwgbm90IHNoYXJlZCBidWZmZXIgYW5kIHRyYW5zZmVyID0gJXMiLAorICAgICAgICAgICAgQUxPR1coIiVzKCVkKTogQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCBkZW5pZWQgYnkgY2xpZW50LCIKKyAgICAgICAgICAgICAgICAgICIgbm90IHNoYXJlZCBidWZmZXIgYW5kIHRyYW5zZmVyID0gJXMiLAorICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1JZCwKICAgICAgICAgICAgICAgICAgIGNvbnZlcnRUcmFuc2ZlclRvVGV4dChtVHJhbnNmZXIpKTsKICAgICAgICAgICAgIG1GbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdCkgKG1GbGFncyAmIH5BVURJT19PVVRQVVRfRkxBR19GQVNUKTsKICAgICAgICAgfQpAQCAtMTQ2OCw3ICsxNTAzLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGF0dXMpOwogCiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUiB8fCBvdXRwdXQub3V0cHV0SWQgPT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKLSAgICAgICAgQUxPR0UoIkF1ZGlvRmxpbmdlciBjb3VsZCBub3QgY3JlYXRlIHRyYWNrLCBzdGF0dXM6ICVkIG91dHB1dCAlZCIsIHN0YXR1cywgb3V0cHV0Lm91dHB1dElkKTsKKyAgICAgICAgQUxPR0UoIiVzKCVkKTogQXVkaW9GbGluZ2VyIGNvdWxkIG5vdCBjcmVhdGUgdHJhY2ssIHN0YXR1czogJWQgb3V0cHV0ICVkIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbUlkLCBzdGF0dXMsIG91dHB1dC5vdXRwdXRJZCk7CiAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIHN0YXR1cyA9IE5PX0lOSVQ7CiAgICAgICAgIH0KQEAgLTE0ODksNiArMTUyNSw3IEBACiAgICAgbUFmRnJhbWVDb3VudCA9IG91dHB1dC5hZkZyYW1lQ291bnQ7CiAgICAgbUFmU2FtcGxlUmF0ZSA9IG91dHB1dC5hZlNhbXBsZVJhdGU7CiAgICAgbUFmTGF0ZW5jeSA9IG91dHB1dC5hZkxhdGVuY3lNczsKKyAgICBtSWQgPSBvdXRwdXQudHJhY2tJZDsKIAogICAgIG1MYXRlbmN5ID0gbUFmTGF0ZW5jeSArICgxMDAwTEwgKiBtRnJhbWVDb3VudCkgLyBtU2FtcGxlUmF0ZTsKIApAQCAtMTQ5OCwxMyArMTUzNSwxMyBAQAogICAgIC8vIEZJWE1FIGNvbXBhcmUgdG8gQXVkaW9SZWNvcmQKICAgICBzcDxJTWVtb3J5PiBpTWVtID0gdHJhY2stPmdldENibGsoKTsKICAgICBpZiAoaU1lbSA9PSAwKSB7Ci0gICAgICAgIEFMT0dFKCJDb3VsZCBub3QgZ2V0IGNvbnRyb2wgYmxvY2siKTsKKyAgICAgICAgQUxPR0UoIiVzKCVkKTogQ291bGQgbm90IGdldCBjb250cm9sIGJsb2NrIiwgX19mdW5jX18sIG1JZCk7CiAgICAgICAgIHN0YXR1cyA9IE5PX0lOSVQ7CiAgICAgICAgIGdvdG8gZXhpdDsKICAgICB9CiAgICAgdm9pZCAqaU1lbVBvaW50ZXIgPSBpTWVtLT5wb2ludGVyKCk7CiAgICAgaWYgKGlNZW1Qb2ludGVyID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBnZXQgY29udHJvbCBibG9jayBwb2ludGVyIik7CisgICAgICAgIEFMT0dFKCIlcyglZCk6IENvdWxkIG5vdCBnZXQgY29udHJvbCBibG9jayBwb2ludGVyIiwgX19mdW5jX18sIG1JZCk7CiAgICAgICAgIHN0YXR1cyA9IE5PX0lOSVQ7CiAgICAgICAgIGdvdG8gZXhpdDsKICAgICB9CkBAIC0xNTIzLDE0ICsxNTYwLDE0IEBACiAgICAgbUF3YWl0Qm9vc3QgPSBmYWxzZTsKICAgICBpZiAobUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCkgewogICAgICAgICBpZiAob3V0cHV0LmZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCkgewotICAgICAgICAgICAgQUxPR0koIkFVRElPX09VVFBVVF9GTEFHX0ZBU1Qgc3VjY2Vzc2Z1bDsgZnJhbWVDb3VudCAlenUgLT4gJXp1IiwKLSAgICAgICAgICAgICAgICAgIG1SZXFGcmFtZUNvdW50LCBtRnJhbWVDb3VudCk7CisgICAgICAgICAgICBBTE9HSSgiJXMoJWQpOiBBVURJT19PVVRQVVRfRkxBR19GQVNUIHN1Y2Nlc3NmdWw7IGZyYW1lQ291bnQgJXp1IC0+ICV6dSIsCisgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbUlkLCBtUmVxRnJhbWVDb3VudCwgbUZyYW1lQ291bnQpOwogICAgICAgICAgICAgaWYgKCFtVGhyZWFkQ2FuQ2FsbEphdmEpIHsKICAgICAgICAgICAgICAgICBtQXdhaXRCb29zdCA9IHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HVygiQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCBkZW5pZWQgYnkgc2VydmVyOyBmcmFtZUNvdW50ICV6dSAtPiAlenUiLCBtUmVxRnJhbWVDb3VudCwKLSAgICAgICAgICAgICAgICAgIG1GcmFtZUNvdW50KTsKKyAgICAgICAgICAgIEFMT0dXKCIlcyglZCk6IEFVRElPX09VVFBVVF9GTEFHX0ZBU1QgZGVuaWVkIGJ5IHNlcnZlcjsgZnJhbWVDb3VudCAlenUgLT4gJXp1IiwKKyAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtSWQsIG1SZXFGcmFtZUNvdW50LCBtRnJhbWVDb3VudCk7CiAgICAgICAgIH0KICAgICB9CiAgICAgbUZsYWdzID0gb3V0cHV0LmZsYWdzOwpAQCAtMTU1OCw3ICsxNTk1LDcgQEAKICAgICB9IGVsc2UgewogICAgICAgICBidWZmZXJzID0gbVNoYXJlZEJ1ZmZlci0+cG9pbnRlcigpOwogICAgICAgICBpZiAoYnVmZmVycyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBBTE9HRSgiQ291bGQgbm90IGdldCBidWZmZXIgcG9pbnRlciIpOworICAgICAgICAgICAgQUxPR0UoIiVzKCVkKTogQ291bGQgbm90IGdldCBidWZmZXIgcG9pbnRlciIsIF9fZnVuY19fLCBtSWQpOwogICAgICAgICAgICAgc3RhdHVzID0gTk9fSU5JVDsKICAgICAgICAgICAgIGdvdG8gZXhpdDsKICAgICAgICAgfQpAQCAtMTY0Nyw3ICsxNjg0LDcgQEAKICAgICAgICAgdGltZW91dC50dl9uc2VjID0gKGxvbmcpIChtcyAlIDEwMDApICogMTAwMDAwMDsKICAgICAgICAgcmVxdWVzdGVkID0gJnRpbWVvdXQ7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR0UoIiVzIGludmFsaWQgd2FpdENvdW50ICVkIiwgX19mdW5jX18sIHdhaXRDb3VudCk7CisgICAgICAgIEFMT0dFKCIlcyglZCk6IGludmFsaWQgd2FpdENvdW50ICVkIiwgX19mdW5jX18sIG1JZCwgd2FpdENvdW50KTsKICAgICAgICAgcmVxdWVzdGVkID0gTlVMTDsKICAgICB9CiAgICAgcmV0dXJuIG9idGFpbkJ1ZmZlcihhdWRpb0J1ZmZlciwgcmVxdWVzdGVkLCBOVUxMIC8qZWxhcHNlZCovLCBub25Db250aWcpOwpAQCAtMTc1Nyw3ICsxNzk0LDggQEAKIHsKICAgICBpbnQzMl90IGZsYWdzID0gYW5kcm9pZF9hdG9taWNfYW5kKH5DQkxLX0RJU0FCTEVELCAmbUNibGstPm1GbGFncyk7CiAgICAgaWYgKChtU3RhdGUgPT0gU1RBVEVfQUNUSVZFKSAmJiAoZmxhZ3MgJiBDQkxLX0RJU0FCTEVEKSkgewotICAgICAgICBBTE9HVygicmVsZWFzZUJ1ZmZlcigpIHRyYWNrICVwIGRpc2FibGVkIGR1ZSB0byBwcmV2aW91cyB1bmRlcnJ1biwgcmVzdGFydGluZyIsIHRoaXMpOworICAgICAgICBBTE9HVygiJXMoJWQpOiByZWxlYXNlQnVmZmVyKCkgdHJhY2sgJXAgZGlzYWJsZWQgZHVlIHRvIHByZXZpb3VzIHVuZGVycnVuLCByZXN0YXJ0aW5nIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbUlkLCB0aGlzKTsKICAgICAgICAgLy8gRklYTUUgaWdub3Jpbmcgc3RhdHVzCiAgICAgICAgIG1BdWRpb1RyYWNrLT5zdGFydCgpOwogICAgIH0KQEAgLTE3NjcsNyArMTgwNSw3IEBACiAKIHNzaXplX3QgQXVkaW9UcmFjazo6d3JpdGUoY29uc3Qgdm9pZCogYnVmZmVyLCBzaXplX3QgdXNlclNpemUsIGJvb2wgYmxvY2tpbmcpCiB7Ci0gICAgaWYgKG1UcmFuc2ZlciAhPSBUUkFOU0ZFUl9TWU5DKSB7CisgICAgaWYgKG1UcmFuc2ZlciAhPSBUUkFOU0ZFUl9TWU5DICYmIG1UcmFuc2ZlciAhPSBUUkFOU0ZFUl9TWU5DX05PVElGX0NBTExCQUNLKSB7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKQEAgLTE3ODQsNyArMTgyMiw4IEBACiAgICAgaWYgKHNzaXplX3QodXNlclNpemUpIDwgMCB8fCAoYnVmZmVyID09IE5VTEwgJiYgdXNlclNpemUgIT0gMCkpIHsKICAgICAgICAgLy8gU2FuaXR5LWNoZWNrOiB1c2VyIGlzIG1vc3QtbGlrZWx5IHBhc3NpbmcgYW4gZXJyb3IgY29kZSwgYW5kIGl0IHdvdWxkCiAgICAgICAgIC8vIG1ha2UgdGhlIHJldHVybiB2YWx1ZSBhbWJpZ3VvdXMgKGFjdHVhbFNpemUgdnMgZXJyb3IpLgotICAgICAgICBBTE9HRSgiQXVkaW9UcmFjazo6d3JpdGUoYnVmZmVyPSVwLCBzaXplPSV6dSAoJXpkKSIsIGJ1ZmZlciwgdXNlclNpemUsIHVzZXJTaXplKTsKKyAgICAgICAgQUxPR0UoIiVzKCVkKTogQXVkaW9UcmFjazo6d3JpdGUoYnVmZmVyPSVwLCBzaXplPSV6dSAoJXpkKSIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIG1JZCwgYnVmZmVyLCB1c2VyU2l6ZSwgdXNlclNpemUpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIApAQCAtMTgxNyw3ICsxODU2LDE3IEBACiAKICAgICBpZiAod3JpdHRlbiA+IDApIHsKICAgICAgICAgbUZyYW1lc1dyaXR0ZW4gKz0gd3JpdHRlbiAvIG1GcmFtZVNpemU7CisKKyAgICAgICAgaWYgKG1UcmFuc2ZlciA9PSBUUkFOU0ZFUl9TWU5DX05PVElGX0NBTExCQUNLKSB7CisgICAgICAgICAgICBjb25zdCBzcDxBdWRpb1RyYWNrVGhyZWFkPiB0ID0gbUF1ZGlvVHJhY2tUaHJlYWQ7CisgICAgICAgICAgICBpZiAodCAhPSAwKSB7CisgICAgICAgICAgICAgICAgLy8gY2F1c2VzIHdha2UgdXAgb2YgdGhlIHBsYXliYWNrIHRocmVhZCwgdGhhdCB3aWxsIGNhbGxiYWNrIHRoZSBjbGllbnQgZm9yCisgICAgICAgICAgICAgICAgLy8gbW9yZSBkYXRhICh3aXRoIEVWRU5UX0NBTl9XUklURV9NT1JFX0RBVEEpIGluIHByb2Nlc3NBdWRpb0J1ZmZlcigpCisgICAgICAgICAgICAgICAgdC0+d2FrZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgfQorCiAgICAgcmV0dXJuIHdyaXR0ZW47CiB9CiAKQEAgLTE4NDYsNyArMTg5NSw4IEBACiAgICAgICAgICAgICBwb2xsVXMgPDw9IDE7CiAgICAgICAgIH0gd2hpbGUgKHRyeUNvdW50ZXItLSA+IDApOwogICAgICAgICBpZiAodHJ5Q291bnRlciA8IDApIHsKLSAgICAgICAgICAgIEFMT0dFKCJkaWQgbm90IHJlY2VpdmUgZXhwZWN0ZWQgcHJpb3JpdHkgYm9vc3Qgb24gdGltZSIpOworICAgICAgICAgICAgQUxPR0UoIiVzKCVkKTogZGlkIG5vdCByZWNlaXZlIGV4cGVjdGVkIHByaW9yaXR5IGJvb3N0IG9uIHRpbWUiLAorICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbUlkKTsKICAgICAgICAgfQogICAgICAgICAvLyBSdW4gYWdhaW4gaW1tZWRpYXRlbHkKICAgICAgICAgcmV0dXJuIDA7CkBAIC0yMDcwLDggKzIxMjAsOCBAQAogICAgICAgICBpZiAobnMgPCAwKSBucyA9IDA7CiAgICAgfQogCi0gICAgLy8gSWYgbm90IHN1cHBseWluZyBkYXRhIGJ5IEVWRU5UX01PUkVfREFUQSwgdGhlbiB3ZSdyZSBkb25lCi0gICAgaWYgKG1UcmFuc2ZlciAhPSBUUkFOU0ZFUl9DQUxMQkFDSykgeworICAgIC8vIElmIG5vdCBzdXBwbHlpbmcgZGF0YSBieSBFVkVOVF9NT1JFX0RBVEEgb3IgRVZFTlRfQ0FOX1dSSVRFX01PUkVfREFUQSwgdGhlbiB3ZSdyZSBkb25lCisgICAgaWYgKG1UcmFuc2ZlciAhPSBUUkFOU0ZFUl9DQUxMQkFDSyAmJiBtVHJhbnNmZXIgIT0gVFJBTlNGRVJfU1lOQ19OT1RJRl9DQUxMQkFDSykgewogICAgICAgICByZXR1cm4gbnM7CiAgICAgfQogCkBAIC0yMDg3LDcgKzIxMzcsOCBAQAogICAgIGlmIChucyAhPSBOU19XSEVORVZFUikgewogICAgICAgICB0aW1lb3V0LnR2X3NlYyA9IG5zIC8gMTAwMDAwMDAwMExMOwogICAgICAgICB0aW1lb3V0LnR2X25zZWMgPSBucyAlIDEwMDAwMDAwMDBMTDsKLSAgICAgICAgQUxPR1YoInRpbWVvdXQgJWxkLiUwM2QiLCB0aW1lb3V0LnR2X3NlYywgKGludCkgdGltZW91dC50dl9uc2VjIC8gMTAwMDAwMCk7CisgICAgICAgIEFMT0dWKCIlcyglZCk6IHRpbWVvdXQgJWxkLiUwM2QiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtSWQsIHRpbWVvdXQudHZfc2VjLCAoaW50KSB0aW1lb3V0LnR2X25zZWMgLyAxMDAwMDAwKTsKICAgICAgICAgcmVxdWVzdGVkID0gJnRpbWVvdXQ7CiAgICAgfQogCkBAIC0yMDk5LDE4ICsyMTUwLDIwIEBACiAgICAgICAgIHNpemVfdCBub25Db250aWc7CiAgICAgICAgIHN0YXR1c190IGVyciA9IG9idGFpbkJ1ZmZlcigmYXVkaW9CdWZmZXIsIHJlcXVlc3RlZCwgTlVMTCwgJm5vbkNvbnRpZyk7CiAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoKGVyciAhPSBOT19FUlJPUikgIT0gKGF1ZGlvQnVmZmVyLmZyYW1lQ291bnQgPT0gMCksCi0gICAgICAgICAgICAgICAgIm9idGFpbkJ1ZmZlcigpIGVycj0lZCBmcmFtZUNvdW50PSV6dSIsIGVyciwgYXVkaW9CdWZmZXIuZnJhbWVDb3VudCk7CisgICAgICAgICAgICAgICAgIiVzKCVkKTogb2J0YWluQnVmZmVyKCkgZXJyPSVkIGZyYW1lQ291bnQ9JXp1IiwKKyAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1JZCwgZXJyLCBhdWRpb0J1ZmZlci5mcmFtZUNvdW50KTsKICAgICAgICAgcmVxdWVzdGVkID0gJkNsaWVudFByb3h5OjprTm9uQmxvY2tpbmc7CiAgICAgICAgIHNpemVfdCBhdmFpbCA9IGF1ZGlvQnVmZmVyLmZyYW1lQ291bnQgKyBub25Db250aWc7Ci0gICAgICAgIEFMT0dWKCJvYnRhaW5CdWZmZXIoJXUpIHJldHVybmVkICV6dSA9ICV6dSArICV6dSBlcnIgJWQiLAotICAgICAgICAgICAgICAgIG1SZW1haW5pbmdGcmFtZXMsIGF2YWlsLCBhdWRpb0J1ZmZlci5mcmFtZUNvdW50LCBub25Db250aWcsIGVycik7CisgICAgICAgIEFMT0dWKCIlcyglZCk6IG9idGFpbkJ1ZmZlcigldSkgcmV0dXJuZWQgJXp1ID0gJXp1ICsgJXp1IGVyciAlZCIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIG1JZCwgbVJlbWFpbmluZ0ZyYW1lcywgYXZhaWwsIGF1ZGlvQnVmZmVyLmZyYW1lQ291bnQsIG5vbkNvbnRpZywgZXJyKTsKICAgICAgICAgaWYgKGVyciAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgaWYgKGVyciA9PSBUSU1FRF9PVVQgfHwgZXJyID09IFdPVUxEX0JMT0NLIHx8IGVyciA9PSAtRUlOVFIgfHwKICAgICAgICAgICAgICAgICAgICAgKGlzT2ZmbG9hZGVkKCkgJiYgKGVyciA9PSBERUFEX09CSkVDVCkpKSB7CiAgICAgICAgICAgICAgICAgLy8gRklYTUUgYnVnIDI1MTk1NzU5CiAgICAgICAgICAgICAgICAgcmV0dXJuIDEwMDAwMDA7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBBTE9HRSgiRXJyb3IgJWQgb2J0YWluaW5nIGFuIGF1ZGlvIGJ1ZmZlciwgZ2l2aW5nIHVwLiIsIGVycik7CisgICAgICAgICAgICBBTE9HRSgiJXMoJWQpOiBFcnJvciAlZCBvYnRhaW5pbmcgYW4gYXVkaW8gYnVmZmVyLCBnaXZpbmcgdXAuIiwKKyAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1JZCwgZXJyKTsKICAgICAgICAgICAgIHJldHVybiBOU19ORVZFUjsKICAgICAgICAgfQogCkBAIC0yMTMwLDE3ICsyMTgzLDMxIEBACiAgICAgICAgIH0KIAogICAgICAgICBzaXplX3QgcmVxU2l6ZSA9IGF1ZGlvQnVmZmVyLnNpemU7Ci0gICAgICAgIG1DYmYoRVZFTlRfTU9SRV9EQVRBLCBtVXNlckRhdGEsICZhdWRpb0J1ZmZlcik7CisgICAgICAgIGlmIChtVHJhbnNmZXIgPT0gVFJBTlNGRVJfU1lOQ19OT1RJRl9DQUxMQkFDSykgeworICAgICAgICAgICAgLy8gd2hlbiBub3RpZnlpbmcgY2xpZW50IGl0IGNhbiB3cml0ZSBtb3JlIGRhdGEsIHBhc3MgdGhlIHRvdGFsIHNpemUgdGhhdCBjYW4gYmUKKyAgICAgICAgICAgIC8vIHdyaXR0ZW4gaW4gdGhlIG5leHQgd3JpdGUoKSBjYWxsLCBzaW5jZSBpdCdzIG5vdCBwYXNzZWQgdGhyb3VnaCB0aGUgY2FsbGJhY2sKKyAgICAgICAgICAgIGF1ZGlvQnVmZmVyLnNpemUgKz0gbm9uQ29udGlnOworICAgICAgICB9CisgICAgICAgIG1DYmYobVRyYW5zZmVyID09IFRSQU5TRkVSX0NBTExCQUNLID8gRVZFTlRfTU9SRV9EQVRBIDogRVZFTlRfQ0FOX1dSSVRFX01PUkVfREFUQSwKKyAgICAgICAgICAgICAgICBtVXNlckRhdGEsICZhdWRpb0J1ZmZlcik7CiAgICAgICAgIHNpemVfdCB3cml0dGVuU2l6ZSA9IGF1ZGlvQnVmZmVyLnNpemU7CiAKICAgICAgICAgLy8gU2FuaXR5IGNoZWNrIG9uIHJldHVybmVkIHNpemUKICAgICAgICAgaWYgKHNzaXplX3Qod3JpdHRlblNpemUpIDwgMCB8fCB3cml0dGVuU2l6ZSA+IHJlcVNpemUpIHsKLSAgICAgICAgICAgIEFMT0dFKCJFVkVOVF9NT1JFX0RBVEEgcmVxdWVzdGVkICV6dSBieXRlcyBidXQgY2FsbGJhY2sgcmV0dXJuZWQgJXpkIGJ5dGVzIiwKLSAgICAgICAgICAgICAgICAgICAgcmVxU2l6ZSwgc3NpemVfdCh3cml0dGVuU2l6ZSkpOworICAgICAgICAgICAgQUxPR0UoIiVzKCVkKTogRVZFTlRfTU9SRV9EQVRBIHJlcXVlc3RlZCAlenUgYnl0ZXMgYnV0IGNhbGxiYWNrIHJldHVybmVkICV6ZCBieXRlcyIsCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtSWQsIHJlcVNpemUsIHNzaXplX3Qod3JpdHRlblNpemUpKTsKICAgICAgICAgICAgIHJldHVybiBOU19ORVZFUjsKICAgICAgICAgfQogCiAgICAgICAgIGlmICh3cml0dGVuU2l6ZSA9PSAwKSB7CisgICAgICAgICAgICBpZiAobVRyYW5zZmVyID09IFRSQU5TRkVSX1NZTkNfTk9USUZfQ0FMTEJBQ0spIHsKKyAgICAgICAgICAgICAgICAvLyBUaGUgY2FsbGJhY2sgRVZFTlRfQ0FOX1dSSVRFX01PUkVfREFUQSB3YXMgcHJvY2Vzc2VkIGluIHRoZSBKTkkgb2YKKyAgICAgICAgICAgICAgICAvLyBhbmRyb2lkLm1lZGlhLkF1ZGlvVHJhY2suIFRoZSBKTkkgaXMgbm90IHVzaW5nIHRoZSBjYWxsYmFjayB0byBwcm92aWRlIGRhdGEsCisgICAgICAgICAgICAgICAgLy8gaXQgb25seSBzaWduYWxzIHRvIHRoZSBKYXZhIGNsaWVudCB0aGF0IGl0IGNhbiBwcm92aWRlIG1vcmUgZGF0YSwgd2hpY2gKKyAgICAgICAgICAgICAgICAvLyB0aGlzIHRyYWNrIGlzIHJlYWQgdG8gYWNjZXB0IG5vdy4KKyAgICAgICAgICAgICAgICAvLyBUaGUgcGxheWJhY2sgdGhyZWFkIHdpbGwgYmUgYXdha2VuIGF0IHRoZSBuZXh0IDo6d3JpdGUoKQorICAgICAgICAgICAgICAgIHJldHVybiBOU19XSEVORVZFUjsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIFRoZSBjYWxsYmFjayBpcyBkb25lIGZpbGxpbmcgYnVmZmVycwogICAgICAgICAgICAgLy8gS2VlcCB0aGlzIHRocmVhZCBnb2luZyB0byBoYW5kbGUgdGltZWQgZXZlbnRzIGFuZAogICAgICAgICAgICAgLy8gc3RpbGwgdHJ5IHRvIGdldCBtb3JlIGRhdGEgaW4gaW50ZXJ2YWxzIG9mIFdBSVRfUEVSSU9EX01TCkBAIC0yMjMxLDggKzIyOTgsOCBAQAogCiBzdGF0dXNfdCBBdWRpb1RyYWNrOjpyZXN0b3JlVHJhY2tfbChjb25zdCBjaGFyICpmcm9tKQogewotICAgIEFMT0dXKCJkZWFkIElBdWRpb1RyYWNrLCAlcywgY3JlYXRpbmcgYSBuZXcgb25lIGZyb20gJXMoKSIsCi0gICAgICAgICAgaXNPZmZsb2FkZWRPckRpcmVjdF9sKCkgPyAiT2ZmbG9hZGVkIG9yIERpcmVjdCIgOiAiUENNIiwgZnJvbSk7CisgICAgQUxPR1coIiVzKCVkKTogZGVhZCBJQXVkaW9UcmFjaywgJXMsIGNyZWF0aW5nIGEgbmV3IG9uZSBmcm9tICVzKCkiLAorICAgICAgICAgICAgX19mdW5jX18sIG1JZCwgaXNPZmZsb2FkZWRPckRpcmVjdF9sKCkgPyAiT2ZmbG9hZGVkIG9yIERpcmVjdCIgOiAiUENNIiwgZnJvbSk7CiAgICAgKyttU2VxdWVuY2U7CiAKICAgICAvLyByZWZyZXNoIHRoZSBhdWRpbyBjb25maWd1cmF0aW9uIGNhY2hlIGluIHRoaXMgcHJvY2VzcyB0byBtYWtlIHN1cmUgd2UgZ2V0IG5ldwpAQCAtMjI3NSwxMCArMjM0Miw3IEBACiAgICAgLy8gSWYgYSBuZXcgSUF1ZGlvVHJhY2sgY2Fubm90IGJlIGNyZWF0ZWQsIHRoZSBwcmV2aW91cyAoZGVhZCkgaW5zdGFuY2Ugd2lsbCBiZSBsZWZ0IGludGFjdC4KICAgICBzdGF0dXNfdCByZXN1bHQgPSBjcmVhdGVUcmFja19sKCk7CiAKLSAgICBpZiAocmVzdWx0ICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIEFMT0dXKCIlcygpOiBjcmVhdGVUcmFja19sIGZhaWxlZCwgZG8gbm90IHJldHJ5IiwgX19mdW5jX18pOwotICAgICAgICByZXRyaWVzID0gMDsKLSAgICB9IGVsc2UgeworICAgIGlmIChyZXN1bHQgPT0gTk9fRVJST1IpIHsKICAgICAgICAgLy8gdGFrZSB0aGUgZnJhbWVzIHRoYXQgd2lsbCBiZSBsb3N0IGJ5IHRyYWNrIHJlY3JlYXRpb24gaW50byBhY2NvdW50IGluIHNhdmVkIHBvc2l0aW9uCiAgICAgICAgIC8vIEZvciBzdHJlYW1pbmcgdHJhY2tzLCB0aGlzIGlzIHRoZSBhbW91bnQgd2Ugb2J0YWluZWQgZnJvbSB0aGUgdXNlci9jbGllbnQKICAgICAgICAgLy8gKG5vdCB0aGUgbnVtYmVyIGFjdHVhbGx5IGNvbnN1bWVkIGF0IHRoZSBzZXJ2ZXIgLSB0aG9zZSBhcmUgYWxyZWFkeSBsb3N0KS4KQEAgLTIyOTMsNyArMjM1Nyw3IEBACiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIG1TdGF0aWNQcm94eS0+c2V0QnVmZmVyUG9zaXRpb24oYnVmZmVyUG9zaXRpb24pOwogICAgICAgICAgICAgICAgIGlmIChidWZmZXJQb3NpdGlvbiA9PSBtRnJhbWVDb3VudCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HRCgicmVzdG9yaW5nIHRyYWNrIGF0IGVuZCBvZiBzdGF0aWMgYnVmZmVyIik7CisgICAgICAgICAgICAgICAgICAgIEFMT0dEKCIlcyglZCk6IHJlc3RvcmluZyB0cmFjayBhdCBlbmQgb2Ygc3RhdGljIGJ1ZmZlciIsIF9fZnVuY19fLCBtSWQpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMjMyMywxNCArMjM4NywxOCBAQAogICAgICAgICBtRnJhbWVzV3JpdHRlbkF0UmVzdG9yZSA9IG1GcmFtZXNXcml0dGVuU2VydmVyT2Zmc2V0OwogICAgIH0KICAgICBpZiAocmVzdWx0ICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIEFMT0dXKCIlcygpIGZhaWxlZCBzdGF0dXMgJWQsIHJldHJpZXMgJWQiLCBfX2Z1bmNfXywgcmVzdWx0LCByZXRyaWVzKTsKKyAgICAgICAgQUxPR1coIiVzKCVkKTogZmFpbGVkIHN0YXR1cyAlZCwgcmV0cmllcyAlZCIsIF9fZnVuY19fLCBtSWQsIHJlc3VsdCwgcmV0cmllcyk7CiAgICAgICAgIGlmICgtLXJldHJpZXMgPiAwKSB7CisgICAgICAgICAgICAvLyBsZWF2ZSB0aW1lIGZvciBhbiBldmVudHVhbCByYWNlIGNvbmRpdGlvbiB0byBjbGVhciBiZWZvcmUgcmV0cnlpbmcKKyAgICAgICAgICAgIHVzbGVlcCg1MDAwMDApOwogICAgICAgICAgICAgZ290byByZXRyeTsKICAgICAgICAgfQotICAgICAgICBtU3RhdGUgPSBTVEFURV9TVE9QUEVEOwotICAgICAgICBtUmVsZWFzZWQgPSAwOworICAgICAgICAvLyBpZiBubyByZXRyaWVzIGxlZnQsIHNldCBpbnZhbGlkIGJpdCB0byBmb3JjZSByZXN0b3JpbmcgYXQgbmV4dCBvY2Nhc2lvbgorICAgICAgICAvLyBhbmQgYXZvaWQgaW5jb25zaXN0ZW50IGFjdGl2ZSBzdGF0ZSBvbiBjbGllbnQgYW5kIHNlcnZlciBzaWRlcworICAgICAgICBpZiAobUNibGsgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgYW5kcm9pZF9hdG9taWNfb3IoQ0JMS19JTlZBTElELCAmbUNibGstPm1GbGFncyk7CisgICAgICAgIH0KICAgICB9Ci0KICAgICByZXR1cm4gcmVzdWx0OwogfQogCkBAIC0yMzQ4LDggKzI0MTYsOCBAQAogICAgIC8vICAgICAgdW5sZXNzIHRoZSBzZXJ2ZXIgaGFzIG1vcmUgdGhhbiAyXjMxIGZyYW1lcyBpbiBpdHMgYnVmZmVyLAogICAgIC8vICAgICAgaW4gd2hpY2ggY2FzZSB0aGUgdXNlIG9mIHVpbnQzMl90IGZvciB0aGVzZSBjb3VudGVycyBoYXMgYmlnZ2VyIGlzc3Vlcy4KICAgICBBTE9HRV9JRihkZWx0YSA8IDAsCi0gICAgICAgICAgICAiZGV0ZWN0ZWQgaWxsZWdhbCByZXRyb2dyYWRlIG1vdGlvbiBieSB0aGUgc2VydmVyOiBtU2VydmVyIGFkdmFuY2VkIGJ5ICVkIiwKLSAgICAgICAgICAgIGRlbHRhKTsKKyAgICAgICAgICAgICIlcyglZCk6IGRldGVjdGVkIGlsbGVnYWwgcmV0cm9ncmFkZSBtb3Rpb24gYnkgdGhlIHNlcnZlcjogbVNlcnZlciBhZHZhbmNlZCBieSAlZCIsCisgICAgICAgICAgICBfX2Z1bmNfXywgbUlkLCBkZWx0YSk7CiAgICAgbVNlcnZlciA9IG5ld1NlcnZlcjsKICAgICBpZiAoZGVsdGEgPiAwKSB7IC8vIGF2b2lkIHJldHJvZ3JhZGUKICAgICAgICAgbVBvc2l0aW9uICs9IGRlbHRhOwpAQCAtMjM2OSw5ICsyNDM3LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsIHNwZWVkIC8qLCAwIG1Ob3RpZmljYXRpb25zUGVyQnVmZmVyUmVxKi8pOwogICAgIGNvbnN0IGJvb2wgYWxsb3dlZCA9IG1GcmFtZUNvdW50ID49IG1pbkZyYW1lQ291bnQ7CiAgICAgQUxPR0RfSUYoIWFsbG93ZWQsCi0gICAgICAgICAgICAiaXNTYW1wbGVSYXRlU3BlZWRBbGxvd2VkX2wgZGVuaWVkICIKKyAgICAgICAgICAgICIlcyglZCk6IGRlbmllZCAiCiAgICAgICAgICAgICAibUFmTGF0ZW5jeToldSAgbUFmRnJhbWVDb3VudDolenUgIG1BZlNhbXBsZVJhdGU6JXUgIHNhbXBsZVJhdGU6JXUgIHNwZWVkOiVmICIKICAgICAgICAgICAgICJtRnJhbWVDb3VudDolenUgPCBtaW5GcmFtZUNvdW50OiV6dSIsCisgICAgICAgICAgICBfX2Z1bmNfXywgbUlkLAogICAgICAgICAgICAgbUFmTGF0ZW5jeSwgbUFmRnJhbWVDb3VudCwgbUFmU2FtcGxlUmF0ZSwgc2FtcGxlUmF0ZSwgc3BlZWQsCiAgICAgICAgICAgICBtRnJhbWVDb3VudCwgbWluRnJhbWVDb3VudCk7CiAgICAgcmV0dXJuIGFsbG93ZWQ7CkBAIC0yMzg5LDcgKzI0NTgsOCBAQAogICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtID0gQXVkaW9QYXJhbWV0ZXIoKTsKICAgICBwYXJhbS5hZGRJbnQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5UHJlc2VudGF0aW9uSWQpLCBwcmVzZW50YXRpb25JZCk7CiAgICAgcGFyYW0uYWRkSW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVByb2dyYW1JZCksIHByb2dyYW1JZCk7Ci0gICAgQUxPR1YoIlByZXNlbnRhdGlvbklkL1Byb2dyYW1JZFslc10iLHBhcmFtLnRvU3RyaW5nKCkuc3RyaW5nKCkpOworICAgIEFMT0dWKCIlcyglZCk6IFByZXNlbnRhdGlvbklkL1Byb2dyYW1JZFslc10iLAorICAgICAgICAgICAgX19mdW5jX18sIG1JZCwgcGFyYW0udG9TdHJpbmcoKS5zdHJpbmcoKSk7CiAKICAgICByZXR1cm4gbUF1ZGlvVHJhY2stPnNldFBhcmFtZXRlcnMocGFyYW0udG9TdHJpbmcoKSk7CiB9CkBAIC0yNDE2LDcgKzI0ODYsNyBAQAogICAgIH0gZWxzZSB7CiAgICAgICAgIC8vIHdhcm4gb25seSBpZiBub3QgYW4gZXhwZWN0ZWQgcmVzdG9yZSBmYWlsdXJlLgogICAgICAgICBBTE9HV19JRighKChpc09mZmxvYWRlZE9yRGlyZWN0X2woKSB8fCBtRG9Ob3RSZWNvbm5lY3QpICYmIHN0YXR1cyA9PSBERUFEX09CSkVDVCksCi0gICAgICAgICAgICAgICAgImFwcGx5Vm9sdW1lU2hhcGVyIGZhaWxlZDogJWQiLCBzdGF0dXMpOworICAgICAgICAgICAgICAgICIlcyglZCk6IGFwcGx5Vm9sdW1lU2hhcGVyIGZhaWxlZDogJWQiLCBfX2Z1bmNfXywgbUlkLCBzdGF0dXMpOwogICAgIH0KICAgICByZXR1cm4gc3RhdHVzOwogfQpAQCAtMjQ1Nyw3ICsyNTI3LDggQEAKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOyAvLyBub3Qgc3VwcG9ydGVkCiAgICAgfQogICAgIHN0YXR1c190IHN0YXR1cyA9IG1Qcm94eS0+Z2V0VGltZXN0YW1wKHRpbWVzdGFtcCk7Ci0gICAgTE9HX0FMV0FZU19GQVRBTF9JRihzdGF0dXMgIT0gT0ssICJzdGF0dXMgJWQgbm90IGFsbG93ZWQgZnJvbSBwcm94eSBnZXRUaW1lc3RhbXAiLCBzdGF0dXMpOworICAgIExPR19BTFdBWVNfRkFUQUxfSUYoc3RhdHVzICE9IE9LLCAiJXMoJWQpOiBzdGF0dXMgJWQgbm90IGFsbG93ZWQgZnJvbSBwcm94eSBnZXRUaW1lc3RhbXAiLAorICAgICAgICAgICAgX19mdW5jX18sIG1JZCwgc3RhdHVzKTsKICAgICBib29sIGZvdW5kID0gZmFsc2U7CiAgICAgdGltZXN0YW1wLT5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0NMSUVOVF0gPSBtRnJhbWVzV3JpdHRlbjsKICAgICB0aW1lc3RhbXAtPm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0NMSUVOVF0gPSAwOwpAQCAtMjUwMCw3ICsyNTcxLDggQEAKICAgICAgICAgfQogICAgICAgICBicmVhazsgLy8gb2ZmbG9hZGVkIHRyYWNrcyBoYW5kbGVkIGJlbG93CiAgICAgZGVmYXVsdDoKLSAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiSW52YWxpZCBtU3RhdGUgaW4gZ2V0VGltZXN0YW1wKCk6ICVkIiwgbVN0YXRlKTsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiJXMoJWQpOiBJbnZhbGlkIG1TdGF0ZSBpbiBnZXRUaW1lc3RhbXAoKTogJWQiLAorICAgICAgICAgICAgICAgX19mdW5jX18sIG1JZCwgbVN0YXRlKTsKICAgICAgICAgYnJlYWs7CiAgICAgfQogCkBAIC0yNTM0LDcgKzI2MDYsOCBAQAogICAgICAgICAgICAgICAgIC8vIEluIHRoaXMgY2FzZSB3ZSBhZGp1c3QgdGhlIHBvc2l0aW9uIGZyb20gdGhlIHByZXZpb3VzIGNvbXB1dGVkIGxhdGVuY3kuCiAgICAgICAgICAgICAgICAgaWYgKGxvY2F0aW9uID09IEV4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9TRVJWRVIpIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR1dfSUYobVByZXZpb3VzTG9jYXRpb24gPT0gRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ2V0VGltZXN0YW1wKCkgbG9jYXRpb24gbW92ZWQgZnJvbSBrZXJuZWwgdG8gc2VydmVyIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzKCVkKTogbG9jYXRpb24gbW92ZWQgZnJvbSBrZXJuZWwgdG8gc2VydmVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbUlkKTsKICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgdGhhdCB0aGUgbGFzdCBrZXJuZWwgT0sgdGltZSBpbmZvIGV4aXN0cyBhbmQgdGhlIHBvc2l0aW9ucwogICAgICAgICAgICAgICAgICAgICAvLyBhcmUgdmFsaWQgKGlmIHRoZXkgcHJlZGF0ZSB0aGUgY3VycmVudCB0cmFjaywgdGhlIHBvc2l0aW9ucyBtYXkKICAgICAgICAgICAgICAgICAgICAgLy8gYmUgemVybyBvciBuZWdhdGl2ZSkuCkBAIC0yNTQ5LDggKzI2MjIsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXRzLm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fU0VSVkVSX0xBU1RLRVJORUxPS10KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIGV0cy5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF9MQVNUS0VSTkVMT0tdKTsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoImZyYW1lIGFkanVzdG1lbnQ6JWxsZCAgdGltZXN0YW1wOiVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKWZyYW1lcywgZXRzLnRvU3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIlcyglZCk6IGZyYW1lIGFkanVzdG1lbnQ6JWxsZCAgdGltZXN0YW1wOiVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbUlkLCAobG9uZyBsb25nKWZyYW1lcywgZXRzLnRvU3RyaW5nKCkuY19zdHIoKSk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChmcmFtZXMgPj0gZXRzLm1Qb3NpdGlvbltsb2NhdGlvbl0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC5tUG9zaXRpb24gPSAwOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewpAQCAtMjU1OCw3ICsyNjMxLDggQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobG9jYXRpb24gPT0gRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTCkgewogICAgICAgICAgICAgICAgICAgICBBTE9HVl9JRihtUHJldmlvdXNMb2NhdGlvbiA9PSBFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fU0VSVkVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnZXRUaW1lc3RhbXAoKSBsb2NhdGlvbiBtb3ZlZCBmcm9tIHNlcnZlciB0byBrZXJuZWwiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXMoJWQpOiBsb2NhdGlvbiBtb3ZlZCBmcm9tIHNlcnZlciB0byBrZXJuZWwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtSWQpOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIC8vIFdlIHVwZGF0ZSB0aGUgdGltZXN0YW1wIHRpbWUgZXZlbiB3aGVuIHBhdXNlZC4KQEAgLTI1ODIsNyArMjY1Niw3IEBACiAgICAgICAgICAgICAgICAgbVByZXZpb3VzTG9jYXRpb24gPSBsb2NhdGlvbjsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgLy8gcmlnaHQgYWZ0ZXIgQXVkaW9UcmFjayBpcyBzdGFydGVkLCBvbmUgbWF5IG5vdCBmaW5kIGEgdGltZXN0YW1wCi0gICAgICAgICAgICAgICAgQUxPR1YoImdldEJlc3RUaW1lc3RhbXAgZGlkIG5vdCBmaW5kIHRpbWVzdGFtcCIpOworICAgICAgICAgICAgICAgIEFMT0dWKCIlcyglZCk6IGdldEJlc3RUaW1lc3RhbXAgZGlkIG5vdCBmaW5kIHRpbWVzdGFtcCIsIF9fZnVuY19fLCBtSWQpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGlmIChzdGF0dXMgPT0gSU5WQUxJRF9PUEVSQVRJT04pIHsKQEAgLTI1OTIsNyArMjY2Niw4IEBACiAgICAgICAgICAgICAvLyB0byBiZSB6ZXJvIHdlIGNvbnZlcnQgdGhpcyB0byBXT1VMRF9CTE9DSyAod2l0aCB0aGUgaW1wbGljaXQgbWVhbmluZyBvZgogICAgICAgICAgICAgLy8gInplcm8iIGZvciBOdVBsYXllcikuICBXZSBkb24ndCBjb252ZXJ0IGZvciB0cmFjayByZXN0b3JhdGlvbiBhcyBwb3NpdGlvbgogICAgICAgICAgICAgLy8gZG9lcyBub3QgcmVzZXQuCi0gICAgICAgICAgICBBTE9HVigidGltZXN0YW1wIHNlcnZlciBvZmZzZXQ6JWxsZCByZXN0b3JlIGZyYW1lczolbGxkIiwKKyAgICAgICAgICAgIEFMT0dWKCIlcyglZCk6IHRpbWVzdGFtcCBzZXJ2ZXIgb2Zmc2V0OiVsbGQgcmVzdG9yZSBmcmFtZXM6JWxsZCIsCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtSWQsCiAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpbUZyYW1lc1dyaXR0ZW5TZXJ2ZXJPZmZzZXQsIChsb25nIGxvbmcpbUZyYW1lc1dyaXR0ZW5BdFJlc3RvcmUpOwogICAgICAgICAgICAgaWYgKG1GcmFtZXNXcml0dGVuU2VydmVyT2Zmc2V0ICE9IG1GcmFtZXNXcml0dGVuQXRSZXN0b3JlKSB7CiAgICAgICAgICAgICAgICAgc3RhdHVzID0gV09VTERfQkxPQ0s7CkBAIC0yNjAwLDcgKzI2NzUsNyBAQAogICAgICAgICB9CiAgICAgfQogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgQUxPR1ZfSUYoc3RhdHVzICE9IFdPVUxEX0JMT0NLLCAiZ2V0VGltZXN0YW1wIGVycm9yOiUjeCIsIHN0YXR1cyk7CisgICAgICAgIEFMT0dWX0lGKHN0YXR1cyAhPSBXT1VMRF9CTE9DSywgIiVzKCVkKTogZ2V0VGltZXN0YW1wIGVycm9yOiUjeCIsIF9fZnVuY19fLCBtSWQsIHN0YXR1cyk7CiAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQogICAgIGlmIChpc09mZmxvYWRlZE9yRGlyZWN0X2woKSkgewpAQCAtMjYzOSw4ICsyNzE0LDkgQEAKICAgICAgICAgICAgICAgICAgICAgLy8gc2luY2UgdGhlIHN0YXJ0IHRpbWUuICBJZiBncmVhdGVyLCB0aGVuIHRoYXQgbWVhbnMgd2UgbWF5IGhhdmUgZmFpbGVkCiAgICAgICAgICAgICAgICAgICAgIC8vIHRvIGNvbXBsZXRlbHkgZmx1c2ggb3Igc3RvcCB0aGUgcHJldmlvdXMgcGxheWluZyB0cmFjay4KICAgICAgICAgICAgICAgICAgICAgQUxPR1dfSUYoIW1UaW1lc3RhbXBTdGFydHVwR2xpdGNoUmVwb3J0ZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgImdldFRpbWVzdGFtcCBzdGFydHVwIGdsaXRjaCBkZXRlY3RlZCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXMoJWQpOiBzdGFydHVwIGdsaXRjaCBkZXRlY3RlZCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGRlbHRhVGltZVVzKCVsbGQpIGRlbHRhUG9zaXRpb25VcyglbGxkKSB0c21Qb3NpdGlvbigldSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZylkZWx0YVRpbWVVcywgKGxvbmcgbG9uZylkZWx0YVBvc2l0aW9uQnlVcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAubVBvc2l0aW9uKTsKICAgICAgICAgICAgICAgICAgICAgbVRpbWVzdGFtcFN0YXJ0dXBHbGl0Y2hSZXBvcnRlZCA9IHRydWU7CkBAIC0yNzA4LDggKzI3ODQsOSBAQAogICAgICAgICAgICAgY29uc3QgaW50NjRfdCBsYWdOcyA9IGludDY0X3QobUFmTGF0ZW5jeSAqIDEwMDAwMDBMTCk7CiAgICAgICAgICAgICBjb25zdCBpbnQ2NF90IGxpbWl0TnMgPSBtU3RhcnROcyAtIGxhZ05zOwogICAgICAgICAgICAgaWYgKGN1cnJlbnRUaW1lTmFub3MgPCBsaW1pdE5zKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0QoImNvcnJlY3RpbmcgdGltZXN0YW1wIHRpbWUgZm9yIHBhdXNlLCAiCisgICAgICAgICAgICAgICAgQUxPR0QoIiVzKCVkKTogY29ycmVjdGluZyB0aW1lc3RhbXAgdGltZSBmb3IgcGF1c2UsICIKICAgICAgICAgICAgICAgICAgICAgICAgICJjdXJyZW50VGltZU5hbm9zOiAlbGxkIDwgbGltaXROczogJWxsZCA8IG1TdGFydE5zOiAlbGxkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKWN1cnJlbnRUaW1lTmFub3MsIChsb25nIGxvbmcpbGltaXROcywgKGxvbmcgbG9uZyltU3RhcnROcyk7CiAgICAgICAgICAgICAgICAgdGltZXN0YW1wLm1UaW1lID0gY29udmVydE5zVG9UaW1lc3BlYyhsaW1pdE5zKTsKICAgICAgICAgICAgICAgICBjdXJyZW50VGltZU5hbm9zID0gbGltaXROczsKQEAgLTI3MTcsNyArMjc5NCw4IEBACiAKICAgICAgICAgICAgIC8vIHJldHJvZ3JhZGUgY2hlY2sKICAgICAgICAgICAgIGlmIChjdXJyZW50VGltZU5hbm9zIDwgcHJldmlvdXNUaW1lTmFub3MpIHsKLSAgICAgICAgICAgICAgICBBTE9HVygicmV0cm9ncmFkZSB0aW1lc3RhbXAgdGltZSBjb3JyZWN0ZWQsICVsbGQgPCAlbGxkIiwKKyAgICAgICAgICAgICAgICBBTE9HVygiJXMoJWQpOiByZXRyb2dyYWRlIHRpbWVzdGFtcCB0aW1lIGNvcnJlY3RlZCwgJWxsZCA8ICVsbGQiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1JZCwKICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpY3VycmVudFRpbWVOYW5vcywgKGxvbmcgbG9uZylwcmV2aW91c1RpbWVOYW5vcyk7CiAgICAgICAgICAgICAgICAgdGltZXN0YW1wLm1UaW1lID0gbVByZXZpb3VzVGltZXN0YW1wLm1UaW1lOwogICAgICAgICAgICAgICAgIC8vIGN1cnJlbnRUaW1lTmFub3Mgbm90IHVzZWQgYmVsb3cuCkBAIC0yNzMwLDcgKzI4MDgsOCBAQAogICAgICAgICAgICAgaWYgKGRlbHRhUG9zaXRpb24gPCAwKSB7CiAgICAgICAgICAgICAgICAgLy8gT25seSByZXBvcnQgb25jZSBwZXIgcG9zaXRpb24gaW5zdGVhZCBvZiBzcGFtbWluZyB0aGUgbG9nLgogICAgICAgICAgICAgICAgIGlmICghbVJldHJvZ3JhZGVNb3Rpb25SZXBvcnRlZCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HVygicmV0cm9ncmFkZSB0aW1lc3RhbXAgcG9zaXRpb24gY29ycmVjdGVkLCAlZCA9ICV1IC0gJXUiLAorICAgICAgICAgICAgICAgICAgICBBTE9HVygiJXMoJWQpOiByZXRyb2dyYWRlIHRpbWVzdGFtcCBwb3NpdGlvbiBjb3JyZWN0ZWQsICVkID0gJXUgLSAldSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1JZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YVBvc2l0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC5tUG9zaXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVByZXZpb3VzVGltZXN0YW1wLm1Qb3NpdGlvbik7CkBAIC0yNzUwLDcgKzI4MjksOCBAQAogICAgICAgICAgICAgaWYgKGRlbHRhVGltZSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgY29uc3QgaW50NjRfdCBjb21wdXRlZFNhbXBsZVJhdGUgPQogICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGFQb3NpdGlvbiAqIChsb25nIGxvbmcpTkFOT1NfUEVSX1NFQ09ORCAvIGRlbHRhVGltZTsKLSAgICAgICAgICAgICAgICBBTE9HRCgiY29tcHV0ZWRTYW1wbGVSYXRlOiV1ICBzYW1wbGVSYXRlOiV1IiwKKyAgICAgICAgICAgICAgICBBTE9HRCgiJXMoJWQpOiBjb21wdXRlZFNhbXBsZVJhdGU6JXUgIHNhbXBsZVJhdGU6JXUiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1JZCwKICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCljb21wdXRlZFNhbXBsZVJhdGUsIG1TYW1wbGVSYXRlKTsKICAgICAgICAgICAgIH0KICNlbmRpZgpAQCAtMjc5Niw4ICsyODc2LDggQEAKICAgICBTdHJpbmc4IHJlc3VsdDsKIAogICAgIHJlc3VsdC5hcHBlbmQoIiBBdWRpb1RyYWNrOjpkdW1wXG4iKTsKLSAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgIHN0YXR1cyglZCksIHN0YXRlKCVkKSwgc2Vzc2lvbiBJZCglZCksIGZsYWdzKCUjeClcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBtU3RhdHVzLCBtU3RhdGUsIG1TZXNzaW9uSWQsIG1GbGFncyk7CisgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiICBpZCglZCkgc3RhdHVzKCVkKSwgc3RhdGUoJWQpLCBzZXNzaW9uIElkKCVkKSwgZmxhZ3MoJSN4KVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1JZCwgbVN0YXR1cywgbVN0YXRlLCBtU2Vzc2lvbklkLCBtRmxhZ3MpOwogICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAgc3RyZWFtIHR5cGUoJWQpLCBsZWZ0IC0gcmlnaHQgdm9sdW1lKCVmLCAlZilcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAobVN0cmVhbVR5cGUgPT0gQVVESU9fU1RSRUFNX0RFRkFVTFQpID8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fYXR0cmlidXRlc190b19zdHJlYW1fdHlwZSgmbUF0dHJpYnV0ZXMpIDogbVN0cmVhbVR5cGUsCkBAIC0yODM5LDE4ICsyOTE5LDE4IEBACiBzdGF0dXNfdCBBdWRpb1RyYWNrOjphZGRBdWRpb0RldmljZUNhbGxiYWNrKGNvbnN0IHNwPEF1ZGlvU3lzdGVtOjpBdWRpb0RldmljZUNhbGxiYWNrPiYgY2FsbGJhY2spCiB7CiAgICAgaWYgKGNhbGxiYWNrID09IDApIHsKLSAgICAgICAgQUxPR1coIiVzIGFkZGluZyBOVUxMIGNhbGxiYWNrISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIEFMT0dXKCIlcyglZCk6IGFkZGluZyBOVUxMIGNhbGxiYWNrISIsIF9fZnVuY19fLCBtSWQpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CiAgICAgaWYgKG1EZXZpY2VDYWxsYmFjay51bnNhZmVfZ2V0KCkgPT0gY2FsbGJhY2suZ2V0KCkpIHsKLSAgICAgICAgQUxPR1coIiVzIGFkZGluZyBzYW1lIGNhbGxiYWNrISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIEFMT0dXKCIlcyglZCk6IGFkZGluZyBzYW1lIGNhbGxiYWNrISIsIF9fZnVuY19fLCBtSWQpOwogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOwogICAgIGlmIChtT3V0cHV0ICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CiAgICAgICAgIGlmIChtRGV2aWNlQ2FsbGJhY2sgIT0gMCkgewotICAgICAgICAgICAgQUxPR1coIiVzIGNhbGxiYWNrIGFscmVhZHkgcHJlc2VudCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgQUxPR1coIiVzKCVkKTogY2FsbGJhY2sgYWxyZWFkeSBwcmVzZW50ISIsIF9fZnVuY19fLCBtSWQpOwogICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2sodGhpcywgbU91dHB1dCk7CiAgICAgICAgIH0KICAgICAgICAgc3RhdHVzID0gQXVkaW9TeXN0ZW06OmFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2sodGhpcywgbU91dHB1dCk7CkBAIC0yODYzLDEyICsyOTQzLDEyIEBACiAgICAgICAgIGNvbnN0IHNwPEF1ZGlvU3lzdGVtOjpBdWRpb0RldmljZUNhbGxiYWNrPiYgY2FsbGJhY2spCiB7CiAgICAgaWYgKGNhbGxiYWNrID09IDApIHsKLSAgICAgICAgQUxPR1coIiVzIHJlbW92aW5nIE5VTEwgY2FsbGJhY2shIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgQUxPR1coIiVzKCVkKTogcmVtb3ZpbmcgTlVMTCBjYWxsYmFjayEiLCBfX2Z1bmNfXywgbUlkKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOwogICAgIGlmIChtRGV2aWNlQ2FsbGJhY2sudW5zYWZlX2dldCgpICE9IGNhbGxiYWNrLmdldCgpKSB7Ci0gICAgICAgIEFMT0dXKCIlcyByZW1vdmluZyBkaWZmZXJlbnQgY2FsbGJhY2shIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgQUxPR1coIiVzKCVkKTogcmVtb3ZpbmcgZGlmZmVyZW50IGNhbGxiYWNrISIsIF9fZnVuY19fLCBtSWQpOwogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogICAgIG1EZXZpY2VDYWxsYmFjay5jbGVhcigpOwpAQCAtMjk3NCw3ICszMDU0LDcgQEAKICAgICBjYXNlIFNUQVRFX0ZMVVNIRUQ6CiAgICAgICAgIHJldHVybiBmYWxzZTsgIC8vIHdlJ3JlIG5vdCBhY3RpdmUKICAgICBkZWZhdWx0OgotICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJJbnZhbGlkIG1TdGF0ZSBpbiBoYXNTdGFydGVkKCk6ICVkIiwgbVN0YXRlKTsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiJXMoJWQpOiBJbnZhbGlkIG1TdGF0ZSBpbiBoYXNTdGFydGVkKCk6ICVkIiwgX19mdW5jX18sIG1JZCwgbVN0YXRlKTsKICAgICAgICAgYnJlYWs7CiAgICAgfQogCkBAIC0yOTkwLDcgKzMwNzAsOCBAQAogICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PSBPSykgewogICAgICAgICAgICAgd2FpdCA9ICh0cy5tUG9zaXRpb24gPT0gMCB8fCB0cy5tUG9zaXRpb24gPT0gbVN0YXJ0VHMubVBvc2l0aW9uKTsKICAgICAgICAgfQotICAgICAgICBBTE9HVigiaGFzU3RhcnRlZCB3YWl0OiVkICB0czoldSAgc3RhcnQgcG9zaXRpb246JWxsZCIsCisgICAgICAgIEFMT0dWKCIlcyglZCk6IGhhc1N0YXJ0ZWQgd2FpdDolZCAgdHM6JXUgIHN0YXJ0IHBvc2l0aW9uOiVsbGQiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtSWQsCiAgICAgICAgICAgICAgICAgKGludCl3YWl0LAogICAgICAgICAgICAgICAgIHRzLm1Qb3NpdGlvbiwKICAgICAgICAgICAgICAgICAobG9uZyBsb25nKW1TdGFydFRzLm1Qb3NpdGlvbik7CkBAIC0zMDExLDcgKzMwOTIsOCBAQAogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIEFMT0dWKCJoYXNTdGFydGVkIHdhaXQ6JWQgIGV0czolbGxkICBzdGFydCBwb3NpdGlvbjolbGxkIiwKKyAgICAgICAgQUxPR1YoIiVzKCVkKTogaGFzU3RhcnRlZCB3YWl0OiVkICBldHM6JWxsZCAgc3RhcnQgcG9zaXRpb246JWxsZCIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIG1JZCwKICAgICAgICAgICAgICAgICAoaW50KXdhaXQsCiAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZylldHMubVBvc2l0aW9uW2xvY2F0aW9uXSwKICAgICAgICAgICAgICAgICAobG9uZyBsb25nKW1TdGFydEV0cy5tUG9zaXRpb25bbG9jYXRpb25dKTsKQEAgLTMwODYsNyArMzE2OCw4IEBACiAgICAgICAgIG5zID0gSU5UNjRfTUFYOwogICAgICAgICBGQUxMVEhST1VHSF9JTlRFTkRFRDsKICAgICBkZWZhdWx0OgotICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG5zIDwgMCwgInByb2Nlc3NBdWRpb0J1ZmZlcigpIHJldHVybmVkICUiIFBSSWQ2NCwgbnMpOworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG5zIDwgMCwgIiVzKCVkKTogcHJvY2Vzc0F1ZGlvQnVmZmVyKCkgcmV0dXJuZWQgJWxsZCIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIG1SZWNlaXZlci5tSWQsIChsb25nIGxvbmcpbnMpOwogICAgICAgICBwYXVzZUludGVybmFsKG5zKTsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9UcmFja1NoYXJlZC5jcHAgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1RyYWNrU2hhcmVkLmNwcAppbmRleCAwMWY0MDBkLi5jOTk3Y2ZhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1RyYWNrU2hhcmVkLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1RyYWNrU2hhcmVkLmNwcApAQCAtMjYsNiArMjYsMjQgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCisvLyBUT0RPOiBjb25zaWRlciBwdWxsaW5nIHRoaXMgaW50byBhIHNoYXJlZCBoZWFkZXIuCisvLyBzYWZlX3N1Yl9vdmVyZmxvdyBpcyB1c2VkIGVuc3VyZSB0aGF0IHN1YnRyYWN0aW9uIG9jY3VycyBpbiB0aGUgc2FtZSBuYXRpdmUgdHlwZQorLy8gd2l0aCBwcm9wZXIgMidzIGNvbXBsZW1lbnQgb3ZlcmZsb3cuICBXaXRob3V0IGNhbGxpbmcgdGhpcyBmdW5jdGlvbiwgaXQgaXMgcG9zc2libGUsCisvLyBmb3IgZXhhbXBsZSwgdGhhdCBvcHRpbWl6aW5nIGNvbXBpbGVycyBtYXkgZWxlY3QgdG8gdHJlYXQgMzIgYml0IHN1YnRyYWN0aW9uCisvLyBhcyA2NCBiaXQgc3VidHJhY3Rpb24gd2hlbiBzdG9yaW5nIGludG8gYSA2NCBiaXQgZGVzdGluYXRpb24gYXMgaW50ZWdlciBvdmVyZmxvdyBpcworLy8gdGVjaG5pY2FsbHkgdW5kZWZpbmVkLgordGVtcGxhdGU8dHlwZW5hbWUgVCwKKyAgICAgICAgIHR5cGVuYW1lIFUsCisgICAgICAgICB0eXBlbmFtZSA9IHN0ZDo6ZW5hYmxlX2lmX3Q8c3RkOjppc19zYW1lPHN0ZDo6ZGVjYXlfdDxUPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6ZGVjYXlfdDxVPj57fT4+CisgICAgICAgICAvLyBlbnN1cmUgYXJndW1lbnRzIGFyZSBzYW1lIHR5cGUgKGlnbm9yaW5nIHZvbGF0aWxlLCB3aGljaCBpcyB1c2VkIGluIGNibGsgdmFyaWFibGVzKS4KK2F1dG8gc2FmZV9zdWJfb3ZlcmZsb3coY29uc3QgVCYgYSwgY29uc3QgVSYgYikgeworICAgIHN0ZDo6ZGVjYXlfdDxUPiByZXN1bHQ7CisgICAgKHZvaWQpX19idWlsdGluX3N1Yl9vdmVyZmxvdyhhLCBiLCAmcmVzdWx0KTsKKyAgICAvLyBub3RlIGlmIF9fYnVpbHRpbl9zdWJfb3ZlcmZsb3cgcmV0dXJucyB0cnVlLCBhbiBvdmVyZmxvdyBvY2N1cnJlZC4KKyAgICByZXR1cm4gcmVzdWx0OworfQorCiAvLyB1c2VkIHRvIGNsYW1wIGEgdmFsdWUgdG8gc2l6ZV90LiAgVE9ETzogbW92ZSB0byBhbm90aGVyIGZpbGUuCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KIHNpemVfdCBjbGFtcFRvU2l6ZShUIHgpIHsKQEAgLTE4Niw3ICsyMDQsNyBAQAogICAgICAgICAgICAgZnJvbnQgPSBjYmxrLT51Lm1TdHJlYW1pbmcubUZyb250OwogICAgICAgICB9CiAgICAgICAgIC8vIHdyaXRlIHRvIHJlYXIsIHJlYWQgZnJvbSBmcm9udAotICAgICAgICBzc2l6ZV90IGZpbGxlZCA9IHJlYXIgLSBmcm9udDsKKyAgICAgICAgc3NpemVfdCBmaWxsZWQgPSBzYWZlX3N1Yl9vdmVyZmxvdyhyZWFyLCBmcm9udCk7CiAgICAgICAgIC8vIHBpcGUgc2hvdWxkIG5vdCBiZSBvdmVyZnVsbAogICAgICAgICBpZiAoISgwIDw9IGZpbGxlZCAmJiAoc2l6ZV90KSBmaWxsZWQgPD0gbUZyYW1lQ291bnQpKSB7CiAgICAgICAgICAgICBpZiAobUlzT3V0KSB7CkBAIC02ODQsNyArNzAyLDcgQEAKICAgICAgICAgY29uc3Qgc2l6ZV90IG92ZXJmbG93Qml0ID0gbUZyYW1lQ291bnRQMiA8PCAxOwogICAgICAgICBjb25zdCBzaXplX3QgbWFzayA9IG92ZXJmbG93Qml0IC0gMTsKICAgICAgICAgaW50MzJfdCBuZXdGcm9udCA9IChmcm9udCAmIH5tYXNrKSB8IChmbHVzaCAmIG1hc2spOwotICAgICAgICBzc2l6ZV90IGZpbGxlZCA9IHJlYXIgLSBuZXdGcm9udDsKKyAgICAgICAgc3NpemVfdCBmaWxsZWQgPSBzYWZlX3N1Yl9vdmVyZmxvdyhyZWFyLCBuZXdGcm9udCk7CiAgICAgICAgIGlmIChmaWxsZWQgPj0gKHNzaXplX3Qpb3ZlcmZsb3dCaXQpIHsKICAgICAgICAgICAgIC8vIGZyb250IGFuZCByZWFyIG9mZnNldHMgc3BhbiB0aGUgb3ZlcmZsb3cgYml0IG9mIHRoZSBwMiBtYXNrCiAgICAgICAgICAgICAvLyBzbyByZWJhc2luZyBuZXdGcm9udCBvbiB0aGUgZnJvbnQgb2Zmc2V0IGlzIG9mZiBieSB0aGUgb3ZlcmZsb3cgYml0LgpAQCAtNzI2LDcgKzc0NCw3IEBACiAgICAgICAgIGNvbnN0IHNpemVfdCBvdmVyZmxvd0JpdCA9IG1GcmFtZUNvdW50UDIgPDwgMTsKICAgICAgICAgY29uc3Qgc2l6ZV90IG1hc2sgPSBvdmVyZmxvd0JpdCAtIDE7CiAgICAgICAgIGludDMyX3QgbmV3UmVhciA9IChyZWFyICYgfm1hc2spIHwgKHN0b3AgJiBtYXNrKTsKLSAgICAgICAgc3NpemVfdCBmaWxsZWQgPSBuZXdSZWFyIC0gZnJvbnQ7CisgICAgICAgIHNzaXplX3QgZmlsbGVkID0gc2FmZV9zdWJfb3ZlcmZsb3cobmV3UmVhciwgZnJvbnQpOwogICAgICAgICAvLyBvdmVyZmxvd0JpdCBpcyB1bnNpZ25lZCwgc28gY2FzdCB0byBzaWduZWQgZm9yIGNvbXBhcmlzb24uCiAgICAgICAgIGlmIChmaWxsZWQgPj0gKHNzaXplX3Qpb3ZlcmZsb3dCaXQpIHsKICAgICAgICAgICAgIC8vIGZyb250IGFuZCByZWFyIG9mZnNldHMgc3BhbiB0aGUgb3ZlcmZsb3cgYml0IG9mIHRoZSBwMiBtYXNrCkBAIC03NzgsNyArNzk2LDcgQEAKICAgICAgICAgZnJvbnQgPSBhbmRyb2lkX2F0b21pY19hY3F1aXJlX2xvYWQoJmNibGstPnUubVN0cmVhbWluZy5tRnJvbnQpOwogICAgICAgICByZWFyID0gY2Jsay0+dS5tU3RyZWFtaW5nLm1SZWFyOwogICAgIH0KLSAgICBzc2l6ZV90IGZpbGxlZCA9IHJlYXIgLSBmcm9udDsKKyAgICBzc2l6ZV90IGZpbGxlZCA9IHNhZmVfc3ViX292ZXJmbG93KHJlYXIsIGZyb250KTsKICAgICAvLyBwaXBlIHNob3VsZCBub3QgYWxyZWFkeSBiZSBvdmVyZnVsbAogICAgIGlmICghKDAgPD0gZmlsbGVkICYmIChzaXplX3QpIGZpbGxlZCA8PSBtRnJhbWVDb3VudCkpIHsKICAgICAgICAgQUxPR0UoIlNoYXJlZCBtZW1vcnkgY29udHJvbCBibG9jayBpcyBjb3JydXB0IChmaWxsZWQ9JXpkLCBtRnJhbWVDb3VudD0lenUpOyBzaHV0dGluZyBkb3duIiwKQEAgLTkwNSw3ICs5MjMsNyBAQAogICAgICAgICByZXR1cm4gbUZyYW1lQ291bnQ7CiAgICAgfQogICAgIGNvbnN0IGludDMyX3QgcmVhciA9IGdldFJlYXIoKTsKLSAgICBzc2l6ZV90IGZpbGxlZCA9IHJlYXIgLSBjYmxrLT51Lm1TdHJlYW1pbmcubUZyb250OworICAgIHNzaXplX3QgZmlsbGVkID0gc2FmZV9zdWJfb3ZlcmZsb3cocmVhciwgY2Jsay0+dS5tU3RyZWFtaW5nLm1Gcm9udCk7CiAgICAgLy8gcGlwZSBzaG91bGQgbm90IGFscmVhZHkgYmUgb3ZlcmZ1bGwKICAgICBpZiAoISgwIDw9IGZpbGxlZCAmJiAoc2l6ZV90KSBmaWxsZWQgPD0gbUZyYW1lQ291bnQpKSB7CiAgICAgICAgIEFMT0dFKCJTaGFyZWQgbWVtb3J5IGNvbnRyb2wgYmxvY2sgaXMgY29ycnVwdCAoZmlsbGVkPSV6ZCwgbUZyYW1lQ291bnQ9JXp1KTsgc2h1dHRpbmcgZG93biIsCkBAIC05MzEsNyArOTQ5LDcgQEAKICAgICAgICAgcmV0dXJuIG1GcmFtZUNvdW50OwogICAgIH0KICAgICBjb25zdCBpbnQzMl90IHJlYXIgPSBnZXRSZWFyKCk7Ci0gICAgY29uc3Qgc3NpemVfdCBmaWxsZWQgPSByZWFyIC0gY2Jsay0+dS5tU3RyZWFtaW5nLm1Gcm9udDsKKyAgICBjb25zdCBzc2l6ZV90IGZpbGxlZCA9IHNhZmVfc3ViX292ZXJmbG93KHJlYXIsIGNibGstPnUubVN0cmVhbWluZy5tRnJvbnQpOwogICAgIGlmICghKDAgPD0gZmlsbGVkICYmIChzaXplX3QpIGZpbGxlZCA8PSBtRnJhbWVDb3VudCkpIHsKICAgICAgICAgcmV0dXJuIDA7IC8vIGVycm9yIGNvbmRpdGlvbiwgc2lsZW50bHkgcmV0dXJuIDAuCiAgICAgfQpAQCAtMTIzMyw2ICsxMjUxLDIxIEBACiAgICAgcmV0dXJuIDA7CiB9CiAKK19fYXR0cmlidXRlX18oKG5vX3Nhbml0aXplKCJpbnRlZ2VyIikpKQorc2l6ZV90IEF1ZGlvUmVjb3JkU2VydmVyUHJveHk6OmZyYW1lc1JlYWR5U2FmZSgpIGNvbnN0Cit7CisgICAgaWYgKG1Jc1NodXRkb3duKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBjb25zdCBpbnQzMl90IGZyb250ID0gYW5kcm9pZF9hdG9taWNfYWNxdWlyZV9sb2FkKCZtQ2Jsay0+dS5tU3RyZWFtaW5nLm1Gcm9udCk7CisgICAgY29uc3QgaW50MzJfdCByZWFyID0gbUNibGstPnUubVN0cmVhbWluZy5tUmVhcjsKKyAgICBjb25zdCBzc2l6ZV90IGZpbGxlZCA9IHNhZmVfc3ViX292ZXJmbG93KHJlYXIsIGZyb250KTsKKyAgICBpZiAoISgwIDw9IGZpbGxlZCAmJiAoc2l6ZV90KSBmaWxsZWQgPD0gbUZyYW1lQ291bnQpKSB7CisgICAgICAgIHJldHVybiAwOyAvLyBlcnJvciBjb25kaXRpb24sIHNpbGVudGx5IHJldHVybiAwLgorICAgIH0KKyAgICByZXR1cm4gZmlsbGVkOworfQorCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9JQXVkaW9GbGluZ2VyLmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lBdWRpb0ZsaW5nZXIuY3BwCmluZGV4IDlmM2I3NDIuLjAwNjc4YzIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lBdWRpb0ZsaW5nZXIuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lBdWRpb0ZsaW5nZXIuY3BwCkBAIC0yNCwxMCArMjQsOCBAQAogCiAjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CiAjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgotI2luY2x1ZGUgPGN1dGlscy9tdWx0aXVzZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9UaW1lQ2hlY2suaD4KLSNpbmNsdWRlIDxwcml2YXRlL2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcuaD4KLQorI2luY2x1ZGUgPG1lZGlhdXRpbHMvU2VydmljZVV0aWxpdGllcy5oPgogI2luY2x1ZGUgIklBdWRpb0ZsaW5nZXIuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewpAQCAtNjAwLDE0ICs1OTgsMTggQEAKICAgICB9CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldEVmZmVjdERlc2NyaXB0b3IoY29uc3QgZWZmZWN0X3V1aWRfdCAqcFV1aWQsCi0gICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcikgY29uc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqcFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZWZlcnJlZFR5cGVGbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcikgY29uc3QKICAgICB7Ci0gICAgICAgIGlmIChwVXVpZCA9PSBOVUxMIHx8IHBEZXNjcmlwdG9yID09IE5VTEwpIHsKKyAgICAgICAgaWYgKHBVdWlkID09IE5VTEwgfHwgcFR5cGUgPT0gTlVMTCB8fCBwRGVzY3JpcHRvciA9PSBOVUxMKSB7CiAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICB9CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb0ZsaW5nZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAgICAgICAgIGRhdGEud3JpdGUocFV1aWQsIHNpemVvZihlZmZlY3RfdXVpZF90KSk7CisgICAgICAgIGRhdGEud3JpdGUocFR5cGUsIHNpemVvZihlZmZlY3RfdXVpZF90KSk7CisgICAgICAgIGRhdGEud3JpdGVVaW50MzIocHJlZmVycmVkVHlwZUZsYWcpOwogICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX0VGRkVDVF9ERVNDUklQVE9SLCBkYXRhLCAmcmVwbHkpOwogICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOwpAQCAtNjM2LDEwICs2MzgsMTAgQEAKICAgICAgICAgc3A8SUVmZmVjdD4gZWZmZWN0OwogCiAgICAgICAgIGlmIChwRGVzYyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gZWZmZWN0OwogICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgKnN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBlZmZlY3Q7CiAgICAgICAgIH0KIAogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvRmxpbmdlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKQEAgLTkxMiw3ICs5MTQsNyBAQAogICAgICAgICBjYXNlIFNFVF9NSUNfTVVURToKICAgICAgICAgY2FzZSBTRVRfTE9XX1JBTV9ERVZJQ0U6CiAgICAgICAgIGNhc2UgU1lTVEVNX1JFQURZOiB7Ci0gICAgICAgICAgICBpZiAobXVsdGl1c2VyX2dldF9hcHBfaWQoSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpKSA+PSBBSURfQVBQX1NUQVJUKSB7CisgICAgICAgICAgICBpZiAoIWlzU2VydmljZVVpZChJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkpKSB7CiAgICAgICAgICAgICAgICAgQUxPR1coIiVzOiB0cmFuc2FjdGlvbiAlZCByZWNlaXZlZCBmcm9tIFBJRCAlZCB1bmF1dGhvcml6ZWQgVUlEICVkIiwKICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgY29kZSwgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpLAogICAgICAgICAgICAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSk7CkBAIC05NTEsOSArOTUzLDggQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KIAotICAgIGNoYXIgdGltZUNoZWNrU3RyaW5nWzY0XTsKLSAgICBzbnByaW50Zih0aW1lQ2hlY2tTdHJpbmcsIHNpemVvZih0aW1lQ2hlY2tTdHJpbmcpLCAiSUF1ZGlvRmxpbmdlcjogJWQiLCBjb2RlKTsKLSAgICBUaW1lQ2hlY2sgY2hlY2sodGltZUNoZWNrU3RyaW5nKTsKKyAgICBzdGQ6OnN0cmluZyB0YWcoIklBdWRpb0ZsaW5nZXIgY29tbWFuZCAiICsgc3RkOjp0b19zdHJpbmcoY29kZSkpOworICAgIFRpbWVDaGVjayBjaGVjayh0YWcuY19zdHIoKSk7CiAKICAgICBzd2l0Y2ggKGNvZGUpIHsKICAgICAgICAgY2FzZSBDUkVBVEVfVFJBQ0s6IHsKQEAgLTEyODAsOCArMTI4MSwxMSBAQAogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb0ZsaW5nZXIsIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIGVmZmVjdF91dWlkX3QgdXVpZDsKICAgICAgICAgICAgIGRhdGEucmVhZCgmdXVpZCwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKTsKKyAgICAgICAgICAgIGVmZmVjdF91dWlkX3QgdHlwZTsKKyAgICAgICAgICAgIGRhdGEucmVhZCgmdHlwZSwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKTsKKyAgICAgICAgICAgIHVpbnQzMl90IHByZWZlcnJlZFR5cGVGbGFnID0gZGF0YS5yZWFkVWludDMyKCk7CiAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90IGRlc2MgPSB7fTsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGdldEVmZmVjdERlc2NyaXB0b3IoJnV1aWQsICZkZXNjKTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGdldEVmZmVjdERlc2NyaXB0b3IoJnV1aWQsICZ0eXBlLCBwcmVmZXJyZWRUeXBlRmxhZywgJmRlc2MpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgICAgICByZXBseS0+d3JpdGUoJmRlc2MsIHNpemVvZihlZmZlY3RfZGVzY3JpcHRvcl90KSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9JQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lBdWRpb1BvbGljeVNlcnZpY2UuY3BwCmluZGV4IDhjZDRhODUuLjMyYTcxZjMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lBdWRpb1BvbGljeVNlcnZpY2UuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lBdWRpb1BvbGljeVNlcnZpY2UuY3BwCkBAIC0yNCwxMSArMjQsMTAgQEAKIAogI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgogI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KLSNpbmNsdWRlIDxjdXRpbHMvbXVsdGl1c2VyLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9FZmZlY3QuaD4KICNpbmNsdWRlIDxtZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvVGltZUNoZWNrLmg+Ci0jaW5jbHVkZSA8cHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmg+CisjaW5jbHVkZSA8bWVkaWF1dGlscy9TZXJ2aWNlVXRpbGl0aWVzLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKQEAgLTgyLDcgKzgxLDExIEBACiAgICAgR0VUX01BU1RFUl9NT05PLAogICAgIEdFVF9TVFJFQU1fVk9MVU1FX0RCLAogICAgIEdFVF9TVVJST1VORF9GT1JNQVRTLAotICAgIFNFVF9TVVJST1VORF9GT1JNQVRfRU5BQkxFRAorICAgIFNFVF9TVVJST1VORF9GT1JNQVRfRU5BQkxFRCwKKyAgICBBRERfU1RSRUFNX0RFRkFVTFRfRUZGRUNULAorICAgIFJFTU9WRV9TVFJFQU1fREVGQVVMVF9FRkZFQ1QsCisgICAgQUREX1NPVVJDRV9ERUZBVUxUX0VGRkVDVCwKKyAgICBSRU1PVkVfU09VUkNFX0RFRkFVTFRfRUZGRUNUCiB9OwogCiAjZGVmaW5lIE1BWF9JVEVNU19QRVJfTElTVCAxMDI0CkBAIC0yNDUsNDEgKzI0OCwyOSBAQAogICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICAgICAgfQogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiAgICAgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIob3V0cHV0KTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KSBzdHJlYW0pOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpIHNlc3Npb24pOworICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpcG9ydElkKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFNUQVJUX09VVFBVVCwgZGF0YSwgJnJlcGx5KTsKICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0IDxzdGF0dXNfdD4gKHJlcGx5LnJlYWRJbnQzMigpKTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wT3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKG91dHB1dCk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdCkgc3RyZWFtKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KSBzZXNzaW9uKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KXBvcnRJZCk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChTVE9QX09VVFBVVCwgZGF0YSwgJnJlcGx5KTsKICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0IDxzdGF0dXNfdD4gKHJlcGx5LnJlYWRJbnQzMigpKTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCisgICAgdmlydHVhbCB2b2lkIHJlbGVhc2VPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiAgICAgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIob3V0cHV0KTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KXN0cmVhbSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdClzZXNzaW9uKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KXBvcnRJZCk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChSRUxFQVNFX09VVFBVVCwgZGF0YSwgJnJlcGx5KTsKICAgICB9CiAKQEAgLTc1MywxMSArNzQ0LDExIEBACiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0QXVkaW9Tb3VyY2UoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0cmlidXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkKQogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgaWYgKHNvdXJjZSA9PSBOVUxMIHx8IGF0dHJpYnV0ZXMgPT0gTlVMTCB8fCBoYW5kbGUgPT0gTlVMTCkgeworICAgICAgICBpZiAoc291cmNlID09IE5VTEwgfHwgYXR0cmlidXRlcyA9PSBOVUxMIHx8IHBvcnRJZCA9PSBOVUxMKSB7CiAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICB9CiAgICAgICAgIGRhdGEud3JpdGUoc291cmNlLCBzaXplb2Yoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnKSk7CkBAIC03NzAsMTUgKzc2MSwxNSBAQAogICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgICAgICB9Ci0gICAgICAgICpoYW5kbGUgPSAoYXVkaW9fcGF0Y2hfaGFuZGxlX3QpcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgICpwb3J0SWQgPSAoYXVkaW9fcG9ydF9oYW5kbGVfdClyZXBseS5yZWFkSW50MzIoKTsKICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BBdWRpb1NvdXJjZShhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wQXVkaW9Tb3VyY2UoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiAgICAgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoaGFuZGxlKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKHBvcnRJZCk7CiAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChTVE9QX0FVRElPX1NPVVJDRSwgZGF0YSwgJnJlcGx5KTsKICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKQEAgLTg3OSw2ICs4NzAsNzcgQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CiAgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBhZGRTdHJlYW1EZWZhdWx0RWZmZWN0KGNvbnN0IGVmZmVjdF91dWlkX3QgKnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90ICp1dWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb191c2FnZV90IHVzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb191bmlxdWVfaWRfdCogaWQpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlKHR5cGUsIHNpemVvZihlZmZlY3RfdXVpZF90KSk7CisgICAgICAgIGRhdGEud3JpdGVTdHJpbmcxNihvcFBhY2thZ2VOYW1lKTsKKyAgICAgICAgZGF0YS53cml0ZSh1dWlkLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIocHJpb3JpdHkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpIHVzYWdlKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEFERF9TVFJFQU1fREVGQVVMVF9FRkZFQ1QsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgc3RhdHVzID0gc3RhdGljX2Nhc3QgPHN0YXR1c190PiAocmVwbHkucmVhZEludDMyKCkpOworICAgICAgICAqaWQgPSByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZVN0cmVhbURlZmF1bHRFZmZlY3QoYXVkaW9fdW5pcXVlX2lkX3QgaWQpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoaWQpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoUkVNT1ZFX1NUUkVBTV9ERUZBVUxUX0VGRkVDVCwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3QgPHN0YXR1c190PiAocmVwbHkucmVhZEludDMyKCkpOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkU291cmNlRGVmYXVsdEVmZmVjdChjb25zdCBlZmZlY3RfdXVpZF90ICp0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqdXVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb191bmlxdWVfaWRfdCogaWQpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlKHR5cGUsIHNpemVvZihlZmZlY3RfdXVpZF90KSk7CisgICAgICAgIGRhdGEud3JpdGVTdHJpbmcxNihvcFBhY2thZ2VOYW1lKTsKKyAgICAgICAgZGF0YS53cml0ZSh1dWlkLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIocHJpb3JpdHkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpIHNvdXJjZSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChBRERfU09VUkNFX0RFRkFVTFRfRUZGRUNULCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHN0YXR1cyA9IHN0YXRpY19jYXN0IDxzdGF0dXNfdD4gKHJlcGx5LnJlYWRJbnQzMigpKTsKKyAgICAgICAgKmlkID0gcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVTb3VyY2VEZWZhdWx0RWZmZWN0KGF1ZGlvX3VuaXF1ZV9pZF90IGlkKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKGlkKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KFJFTU9WRV9TT1VSQ0VfREVGQVVMVF9FRkZFQ1QsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0IDxzdGF0dXNfdD4gKHJlcGx5LnJlYWRJbnQzMigpKTsKKyAgICB9CisKIH07CiAKIElNUExFTUVOVF9NRVRBX0lOVEVSRkFDRShBdWRpb1BvbGljeVNlcnZpY2UsICJhbmRyb2lkLm1lZGlhLklBdWRpb1BvbGljeVNlcnZpY2UiKTsKQEAgLTkzNiw3ICs5OTgsNyBAQAogICAgICAgICBjYXNlIFNUT1BfQVVESU9fU09VUkNFOgogICAgICAgICBjYXNlIEdFVF9TVVJST1VORF9GT1JNQVRTOgogICAgICAgICBjYXNlIFNFVF9TVVJST1VORF9GT1JNQVRfRU5BQkxFRDogewotICAgICAgICAgICAgaWYgKG11bHRpdXNlcl9nZXRfYXBwX2lkKElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSkgPj0gQUlEX0FQUF9TVEFSVCkgeworICAgICAgICAgICAgaWYgKCFpc1NlcnZpY2VVaWQoSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpKSkgewogICAgICAgICAgICAgICAgIEFMT0dXKCIlczogdHJhbnNhY3Rpb24gJWQgcmVjZWl2ZWQgZnJvbSBQSUQgJWQgdW5hdXRob3JpemVkIFVJRCAlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGNvZGUsIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSwKICAgICAgICAgICAgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkpOwpAQCAtOTQ4LDkgKzEwMTAsOCBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgfQogCi0gICAgY2hhciB0aW1lQ2hlY2tTdHJpbmdbNjRdOwotICAgIHNucHJpbnRmKHRpbWVDaGVja1N0cmluZywgc2l6ZW9mKHRpbWVDaGVja1N0cmluZyksICJJQXVkaW9Qb2xpY3lTZXJ2aWNlOiAlZCIsIGNvZGUpOwotICAgIFRpbWVDaGVjayBjaGVjayh0aW1lQ2hlY2tTdHJpbmcpOworICAgIHN0ZDo6c3RyaW5nIHRhZygiSUF1ZGlvUG9saWN5U2VydmljZSBjb21tYW5kICIgKyBzdGQ6OnRvX3N0cmluZyhjb2RlKSk7CisgICAgVGltZUNoZWNrIGNoZWNrKHRhZy5jX3N0cigpKTsKIAogICAgIHN3aXRjaCAoY29kZSkgewogICAgICAgICBjYXNlIFNFVF9ERVZJQ0VfQ09OTkVDVElPTl9TVEFURTogewpAQCAtMTA3NywzNCArMTEzOCwyMiBAQAogCiAgICAgICAgIGNhc2UgU1RBUlRfT1VUUFVUOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gc3RhdGljX2Nhc3QgPGF1ZGlvX2lvX2hhbmRsZV90PihkYXRhLnJlYWRJbnQzMigpKTsKLSAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3QgPGF1ZGlvX3N0cmVhbV90eXBlX3Q+KGRhdGEucmVhZEludDMyKCkpOwotICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24gPSAoYXVkaW9fc2Vzc2lvbl90KWRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8dWludDMyX3Q+KHN0YXJ0T3V0cHV0KG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uKSkpOworICAgICAgICAgICAgY29uc3QgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQgPSBzdGF0aWNfY2FzdCA8YXVkaW9fcG9ydF9oYW5kbGVfdD4oZGF0YS5yZWFkSW50MzIoKSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8dWludDMyX3Q+KHN0YXJ0T3V0cHV0KHBvcnRJZCkpKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKIAogICAgICAgICBjYXNlIFNUT1BfT1VUUFVUOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gc3RhdGljX2Nhc3QgPGF1ZGlvX2lvX2hhbmRsZV90PihkYXRhLnJlYWRJbnQzMigpKTsKLSAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3QgPGF1ZGlvX3N0cmVhbV90eXBlX3Q+KGRhdGEucmVhZEludDMyKCkpOwotICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24gPSAoYXVkaW9fc2Vzc2lvbl90KWRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8dWludDMyX3Q+KHN0b3BPdXRwdXQob3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uKSkpOworICAgICAgICAgICAgY29uc3QgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQgPSBzdGF0aWNfY2FzdCA8YXVkaW9fcG9ydF9oYW5kbGVfdD4oZGF0YS5yZWFkSW50MzIoKSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8dWludDMyX3Q+KHN0b3BPdXRwdXQocG9ydElkKSkpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwogCiAgICAgICAgIGNhc2UgUkVMRUFTRV9PVVRQVVQ6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBzdGF0aWNfY2FzdCA8YXVkaW9faW9faGFuZGxlX3Q+KGRhdGEucmVhZEludDMyKCkpOwotICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0gPSAoYXVkaW9fc3RyZWFtX3R5cGVfdClkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24gPSAoYXVkaW9fc2Vzc2lvbl90KWRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICByZWxlYXNlT3V0cHV0KG91dHB1dCwgc3RyZWFtLCBzZXNzaW9uKTsKKyAgICAgICAgICAgIGNvbnN0IGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkID0gc3RhdGljX2Nhc3QgPGF1ZGlvX3BvcnRfaGFuZGxlX3Q+KGRhdGEucmVhZEludDMyKCkpOworICAgICAgICAgICAgcmVsZWFzZU91dHB1dChwb3J0SWQpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwogCkBAIC0xNDk4LDE3ICsxNTQ3LDE3IEBACiAgICAgICAgICAgICBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cmlidXRlcyA9IHt9OwogICAgICAgICAgICAgZGF0YS5yZWFkKCZhdHRyaWJ1dGVzLCBzaXplb2YoYXVkaW9fYXR0cmlidXRlc190KSk7CiAgICAgICAgICAgICBzYW5ldGl6ZUF1ZGlvQXR0cmlidXRlcygmYXR0cmlidXRlcyk7Ci0gICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHN0YXJ0QXVkaW9Tb3VyY2UoJnNvdXJjZSwgJmF0dHJpYnV0ZXMsICZoYW5kbGUpOworICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gc3RhcnRBdWRpb1NvdXJjZSgmc291cmNlLCAmYXR0cmlidXRlcywgJnBvcnRJZCk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoaGFuZGxlKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHBvcnRJZCk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CiAKICAgICAgICAgY2FzZSBTVE9QX0FVRElPX1NPVVJDRTogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSA9IChhdWRpb19wYXRjaF9oYW5kbGVfdCkgZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHN0b3BBdWRpb1NvdXJjZShoYW5kbGUpOworICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQgPSAoYXVkaW9fcG9ydF9oYW5kbGVfdCkgZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHN0b3BBdWRpb1NvdXJjZShwb3J0SWQpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKQEAgLTE1ODcsNiArMTYzNiw4MCBAQAogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBBRERfU1RSRUFNX0RFRkFVTFRfRUZGRUNUOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgZWZmZWN0X3V1aWRfdCB0eXBlOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGF0YS5yZWFkKCZ0eXBlLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTdHJpbmcxNiBvcFBhY2thZ2VOYW1lOworICAgICAgICAgICAgc3RhdHVzID0gZGF0YS5yZWFkU3RyaW5nMTYoJm9wUGFja2FnZU5hbWUpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlZmZlY3RfdXVpZF90IHV1aWQ7CisgICAgICAgICAgICBzdGF0dXMgPSBkYXRhLnJlYWQoJnV1aWQsIHNpemVvZihlZmZlY3RfdXVpZF90KSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHkgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgYXVkaW9fdXNhZ2VfdCB1c2FnZSA9IChhdWRpb191c2FnZV90KSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgYXVkaW9fdW5pcXVlX2lkX3QgaWQgPSAwOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPGludDMyX3Q+KGFkZFN0cmVhbURlZmF1bHRFZmZlY3QoJnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnV1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlkKSkpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoaWQpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBSRU1PVkVfU1RSRUFNX0RFRkFVTFRfRUZGRUNUOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgYXVkaW9fdW5pcXVlX2lkX3QgaWQgPSBzdGF0aWNfY2FzdDxhdWRpb191bmlxdWVfaWRfdD4oZGF0YS5yZWFkSW50MzIoKSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8aW50MzJfdD4ocmVtb3ZlU3RyZWFtRGVmYXVsdEVmZmVjdChpZCkpKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgQUREX1NPVVJDRV9ERUZBVUxUX0VGRkVDVDogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIGVmZmVjdF91dWlkX3QgdHlwZTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGRhdGEucmVhZCgmdHlwZSwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RyaW5nMTYgb3BQYWNrYWdlTmFtZTsKKyAgICAgICAgICAgIHN0YXR1cyA9IGRhdGEucmVhZFN0cmluZzE2KCZvcFBhY2thZ2VOYW1lKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWZmZWN0X3V1aWRfdCB1dWlkOworICAgICAgICAgICAgc3RhdHVzID0gZGF0YS5yZWFkKCZ1dWlkLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5ID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSA9IChhdWRpb19zb3VyY2VfdCkgZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGF1ZGlvX3VuaXF1ZV9pZF90IGlkID0gMDsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0IDxpbnQzMl90PihhZGRTb3VyY2VEZWZhdWx0RWZmZWN0KCZ0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1dWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpb3JpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaWQpKSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihpZCk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIFJFTU9WRV9TT1VSQ0VfREVGQVVMVF9FRkZFQ1Q6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBhdWRpb191bmlxdWVfaWRfdCBpZCA9IHN0YXRpY19jYXN0PGF1ZGlvX3VuaXF1ZV9pZF90PihkYXRhLnJlYWRJbnQzMigpKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0IDxpbnQzMl90PihyZW1vdmVTb3VyY2VEZWZhdWx0RWZmZWN0KGlkKSkpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHJldHVybiBCQmluZGVyOjpvblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb0VmZmVjdC5oIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb0VmZmVjdC5oCmluZGV4IDMyNGJjYjkuLjZiZDQxMzcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9FZmZlY3QuaAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvRWZmZWN0LmgKQEAgLTkwLDI3ICs5MCwzNCBAQAogICAgICAqLwogICAgIHN0YXRpYyBzdGF0dXNfdCBxdWVyeUVmZmVjdCh1aW50MzJfdCBpbmRleCwgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzY3JpcHRvcik7CiAKLQogICAgIC8qCi0gICAgICogUmV0dXJucyB0aGUgZGVzY3JpcHRvciBmb3IgdGhlIHNwZWNpZmllZCBlZmZlY3QgdXVpZC4KKyAgICAgKiBSZXR1cm5zIGEgZGVzY3JpcHRvciBmb3IgdGhlIHNwZWNpZmllZCBlZmZlY3QgdXVpZCBvciB0eXBlLgorICAgICAqCisgICAgICogTG9va3VwIGFuIGVmZmVjdCBieSB1dWlkLCBvciBpZiB0aGF0J3MgdW5zcGVjaWZpZWQgKEVGRkVDVF9VVUlEX05VTEwpLAorICAgICAqIGRvIHNvIGJ5IHR5cGUgYW5kIHByZWZlcnJlZCBmbGFncyBpbnN0ZWFkLgogICAgICAqCiAgICAgICogUGFyYW1ldGVyczoKICAgICAgKiAgICAgIHV1aWQ6ICAgICAgIHBvaW50ZXIgdG8gZWZmZWN0IHV1aWQuCisgICAgICogICAgICB0eXBlOiAgICAgICBwb2ludGVyIHRvIGVmZmVjdCB0eXBlIHV1aWQuCisgICAgICogICAgICBwcmVmZXJyZWRUeXBlRmxhZ3M6IGlmIG11bHRpcGxlIGVmZmVjdHMgb2YgdGhlIGdpdmVuIHR5cGUgZXhpc3QsCisgICAgICogICAgICAgICAgICAgICAgICBvbmUgd2l0aCBhIG1hdGNoaW5nIHR5cGUgZmxhZyB3aWxsIGJlIGNob3NlbiBvdmVyIG9uZSB3aXRob3V0LgorICAgICAqICAgICAgICAgICAgICAgICAgVXNlIEVGRkVDVF9GTEFHX1RZUEVfTUFTSyB0byBpbmRpY2F0ZSBubyBwcmVmZXJlbmNlLgogICAgICAqICAgICAgZGVzY3JpcHRvcjogYWRkcmVzcyB3aGVyZSB0aGUgZWZmZWN0IGRlc2NyaXB0b3Igc2hvdWxkIGJlIHJldHVybmVkLgogICAgICAqCiAgICAgICogUmV0dXJuZWQgc3RhdHVzIChmcm9tIHV0aWxzL0Vycm9ycy5oKSBjYW4gYmU6CiAgICAgICogICAgICBOT19FUlJPUiAgICAgICAgc3VjY2Vzc2Z1bCBvcGVyYXRpb24uCiAgICAgICogICAgICBQRVJNSVNTSU9OX0RFTklFRCBjb3VsZCBub3QgZ2V0IEF1ZGlvRmxpbmdlciBpbnRlcmZhY2UKICAgICAgKiAgICAgIE5PX0lOSVQgICAgICAgICBlZmZlY3QgbGlicmFyeSBmYWlsZWQgdG8gaW5pdGlhbGl6ZQotICAgICAqICAgICAgQkFEX1ZBTFVFICAgICAgIGludmFsaWQgdXVpZCBvciBkZXNjcmlwdG9yIHBvaW50ZXJzCisgICAgICogICAgICBCQURfVkFMVUUgICAgICAgaW52YWxpZCB0eXBlIG9yIGRlc2NyaXB0b3IgcG9pbnRlcnMKICAgICAgKiAgICAgIE5BTUVfTk9UX0ZPVU5EICBubyBlZmZlY3Qgd2l0aCB0aGlzIHV1aWQgZm91bmQKICAgICAgKgogICAgICAqIFJldHVybmVkIHZhbHVlCiAgICAgICogICAqZGVzY3JpcHRvciB1cGRhdGVkIHdpdGggZWZmZWN0IGRlc2NyaXB0b3IKICAgICAgKi8KICAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0RWZmZWN0RGVzY3JpcHRvcihjb25zdCBlZmZlY3RfdXVpZF90ICp1dWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2NyaXB0b3IpIC8qY29uc3QqLzsKLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlZmVycmVkVHlwZUZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzY3JpcHRvcik7CiAKICAgICAvKgogICAgICAqIFJldHVybnMgYSBsaXN0IG9mIGRlc2NyaXB0b3JzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHByZSBwcm9jZXNzaW5ncyBlbmFibGVkIGJ5IGRlZmF1bHQKQEAgLTE0NCw2ICsxNTEsMTMyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmNvdW50KTsKIAogICAgIC8qCisgICAgICogR2V0cyBhIG5ldyBzeXN0ZW0td2lkZSB1bmlxdWUgZWZmZWN0IGlkLgorICAgICAqCisgICAgICogUGFyYW1ldGVyczoKKyAgICAgKiAgICAgIGlkOiBUaGUgYWRkcmVzcyB0byByZXR1cm4gdGhlIGdlbmVyYXRlZCBpZC4KKyAgICAgKgorICAgICAqIFJldHVybmVkIHN0YXR1cyAoZnJvbSB1dGlscy9FcnJvcnMuaCkgY2FuIGJlOgorICAgICAqICAgICAgTk9fRVJST1IgICAgICAgIHN1Y2Nlc3NmdWwgb3BlcmF0aW9uLgorICAgICAqICAgICAgUEVSTUlTU0lPTl9ERU5JRUQgY291bGQgbm90IGdldCBBdWRpb0ZsaW5nZXIgaW50ZXJmYWNlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICBvciBjYWxsZXIgbGFja3MgcmVxdWlyZWQgcGVybWlzc2lvbnMuCisgICAgICogUmV0dXJuZWQgdmFsdWUKKyAgICAgKiAgICppZDogIFRoZSBuZXcgdW5pcXVlIHN5c3RlbS13aWRlIGVmZmVjdCBpZC4KKyAgICAgKi8KKyAgICBzdGF0aWMgc3RhdHVzX3QgbmV3RWZmZWN0VW5pcXVlSWQoYXVkaW9fdW5pcXVlX2lkX3QqIGlkKTsKKworICAgIC8qCisgICAgICogU3RhdGljIG1ldGhvZHMgZm9yIGFkZGluZy9yZW1vdmluZyBzeXN0ZW0td2lkZSBlZmZlY3RzLgorICAgICAqLworCisgICAgLyoKKyAgICAgKiBBZGRzIGFuIGVmZmVjdCB0byB0aGUgbGlzdCBvZiBkZWZhdWx0IG91dHB1dCBlZmZlY3RzIGZvciBhIGdpdmVuIHNvdXJjZSB0eXBlLgorICAgICAqCisgICAgICogSWYgdGhlIGVmZmVjdCBpcyBubyBsb25nZXIgYXZhaWxhYmxlIHdoZW4gYSBzb3VyY2Ugb2YgdGhlIGdpdmVuIHR5cGUKKyAgICAgKiBpcyBjcmVhdGVkLCB0aGUgc3lzdGVtIHdpbGwgY29udGludWUgd2l0aG91dCBhZGRpbmcgaXQuCisgICAgICoKKyAgICAgKiBQYXJhbWV0ZXJzOgorICAgICAqICAgdHlwZVN0cjogIFR5cGUgdXVpZCBvZiBlZmZlY3QgdG8gYmUgYSBkZWZhdWx0OiBjYW4gYmUgbnVsbCBpZiB1dWlkU3RyIGlzIHNwZWNpZmllZC4KKyAgICAgKiAgICAgICAgICAgICBUaGlzIG1heSBjb3JyZXNwb25kIHRvIHRoZSBPcGVuU0wgRVMgaW50ZXJmYWNlIGltcGxlbWVudGVkIGJ5IHRoaXMgZWZmZWN0LAorICAgICAqICAgICAgICAgICAgIG9yIGNvdWxkIGJlIHNvbWUgdmVuZG9yLWRlZmluZWQgdHlwZS4KKyAgICAgKiAgIG9wUGFja2FnZU5hbWU6IFRoZSBwYWNrYWdlIG5hbWUgdXNlZCBmb3IgYXBwIG9wIGNoZWNrcy4KKyAgICAgKiAgIHV1aWRTdHI6ICBVdWlkIG9mIGVmZmVjdCB0byBiZSBhIGRlZmF1bHQ6IGNhbiBiZSBudWxsIGlmIHR5cGUgaXMgc3BlY2lmaWVkLgorICAgICAqICAgICAgICAgICAgIFRoaXMgdXVpZCBjb3JyZXNwb25kcyB0byBhIHBhcnRpY3VsYXIgaW1wbGVtZW50YXRpb24gb2YgYW4gZWZmZWN0IHR5cGUuCisgICAgICogICAgICAgICAgICAgTm90ZSBpZiBib3RoIHV1aWRTdHIgYW5kIHR5cGVTdHIgYXJlIHNwZWNpZmllZCwgdHlwZVN0ciBpcyBpZ25vcmVkLgorICAgICAqICAgcHJpb3JpdHk6IFJlcXVlc3RlZCBwcmlvcml0eSBmb3IgZWZmZWN0IGNvbnRyb2w6IHRoZSBwcmlvcml0eSBsZXZlbCBjb3JyZXNwb25kcyB0byB0aGUKKyAgICAgKiAgICAgICAgICAgICB2YWx1ZSBvZiBwcmlvcml0eSBwYXJhbWV0ZXI6IG5lZ2F0aXZlIHZhbHVlcyBpbmRpY2F0ZSBsb3dlciBwcmlvcml0aWVzLCBwb3NpdGl2ZQorICAgICAqICAgICAgICAgICAgIHZhbHVlcyBoaWdoZXIgcHJpb3JpdGllcywgMCBiZWluZyB0aGUgbm9ybWFsIHByaW9yaXR5LgorICAgICAqICAgc291cmNlOiAgIFRoZSBzb3VyY2UgdGhpcyBlZmZlY3Qgc2hvdWxkIGJlIGEgZGVmYXVsdCBmb3IuCisgICAgICogICBpZDogICAgICAgQWRkcmVzcyB3aGVyZSB0aGUgc3lzdGVtLXdpZGUgdW5pcXVlIGlkIG9mIHRoZSBkZWZhdWx0IGVmZmVjdCBzaG91bGQgYmUgcmV0dXJuZWQuCisgICAgICoKKyAgICAgKiBSZXR1cm5lZCBzdGF0dXMgKGZyb20gdXRpbHMvRXJyb3JzLmgpIGNhbiBiZToKKyAgICAgKiAgICAgIE5PX0VSUk9SICAgICAgICBzdWNjZXNzZnVsIG9wZXJhdGlvbi4KKyAgICAgKiAgICAgIFBFUk1JU1NJT05fREVOSUVEIGNvdWxkIG5vdCBnZXQgQXVkaW9GbGluZ2VyIGludGVyZmFjZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgb3IgY2FsbGVyIGxhY2tzIHJlcXVpcmVkIHBlcm1pc3Npb25zLgorICAgICAqICAgICAgTk9fSU5JVCAgICAgICAgIGVmZmVjdCBsaWJyYXJ5IGZhaWxlZCB0byBpbml0aWFsaXplLgorICAgICAqICAgICAgQkFEX1ZBTFVFICAgICAgIGludmFsaWQgc291cmNlLCB0eXBlIHV1aWQgb3IgaW1wbGVtZW50YXRpb24gdXVpZC4KKyAgICAgKiAgICAgIE5BTUVfTk9UX0ZPVU5EICBubyBlZmZlY3Qgd2l0aCB0aGlzIHV1aWQgb3IgdHlwZSBmb3VuZC4KKyAgICAgKgorICAgICAqIFJldHVybmVkIHZhbHVlCisgICAgICogICAqaWQ6ICBUaGUgc3lzdGVtLXdpZGUgdW5pcXVlIGlkIG9mIHRoZSBhZGRlZCBkZWZhdWx0IGVmZmVjdC4KKyAgICAgKi8KKyAgICBzdGF0aWMgc3RhdHVzX3QgYWRkU291cmNlRGVmYXVsdEVmZmVjdChjb25zdCBjaGFyKiB0eXBlU3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHV1aWRTdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fdW5pcXVlX2lkX3QqIGlkKTsKKworICAgIC8qCisgICAgICogQWRkcyBhbiBlZmZlY3QgdG8gdGhlIGxpc3Qgb2YgZGVmYXVsdCBvdXRwdXQgZWZmZWN0cyBmb3IgYSBnaXZlbiBzdHJlYW0gdHlwZS4KKyAgICAgKgorICAgICAqIElmIHRoZSBlZmZlY3QgaXMgbm8gbG9uZ2VyIGF2YWlsYWJsZSB3aGVuIGEgc3RyZWFtIG9mIHRoZSBnaXZlbiB0eXBlCisgICAgICogaXMgY3JlYXRlZCwgdGhlIHN5c3RlbSB3aWxsIGNvbnRpbnVlIHdpdGhvdXQgYWRkaW5nIGl0LgorICAgICAqCisgICAgICogUGFyYW1ldGVyczoKKyAgICAgKiAgIHR5cGVTdHI6ICBUeXBlIHV1aWQgb2YgZWZmZWN0IHRvIGJlIGEgZGVmYXVsdDogY2FuIGJlIG51bGwgaWYgdXVpZFN0ciBpcyBzcGVjaWZpZWQuCisgICAgICogICAgICAgICAgICAgVGhpcyBtYXkgY29ycmVzcG9uZCB0byB0aGUgT3BlblNMIEVTIGludGVyZmFjZSBpbXBsZW1lbnRlZCBieSB0aGlzIGVmZmVjdCwKKyAgICAgKiAgICAgICAgICAgICBvciBjb3VsZCBiZSBzb21lIHZlbmRvci1kZWZpbmVkIHR5cGUuCisgICAgICogICBvcFBhY2thZ2VOYW1lOiBUaGUgcGFja2FnZSBuYW1lIHVzZWQgZm9yIGFwcCBvcCBjaGVja3MuCisgICAgICogICB1dWlkU3RyOiAgVXVpZCBvZiBlZmZlY3QgdG8gYmUgYSBkZWZhdWx0OiBjYW4gYmUgbnVsbCBpZiB0eXBlIGlzIHNwZWNpZmllZC4KKyAgICAgKiAgICAgICAgICAgICBUaGlzIHV1aWQgY29ycmVzcG9uZHMgdG8gYSBwYXJ0aWN1bGFyIGltcGxlbWVudGF0aW9uIG9mIGFuIGVmZmVjdCB0eXBlLgorICAgICAqICAgICAgICAgICAgIE5vdGUgaWYgYm90aCB1dWlkU3RyIGFuZCB0eXBlU3RyIGFyZSBzcGVjaWZpZWQsIHR5cGVTdHIgaXMgaWdub3JlZC4KKyAgICAgKiAgIHByaW9yaXR5OiBSZXF1ZXN0ZWQgcHJpb3JpdHkgZm9yIGVmZmVjdCBjb250cm9sOiB0aGUgcHJpb3JpdHkgbGV2ZWwgY29ycmVzcG9uZHMgdG8gdGhlCisgICAgICogICAgICAgICAgICAgdmFsdWUgb2YgcHJpb3JpdHkgcGFyYW1ldGVyOiBuZWdhdGl2ZSB2YWx1ZXMgaW5kaWNhdGUgbG93ZXIgcHJpb3JpdGllcywgcG9zaXRpdmUKKyAgICAgKiAgICAgICAgICAgICB2YWx1ZXMgaGlnaGVyIHByaW9yaXRpZXMsIDAgYmVpbmcgdGhlIG5vcm1hbCBwcmlvcml0eS4KKyAgICAgKiAgIHVzYWdlOiAgICBUaGUgdXNhZ2UgdGhpcyBlZmZlY3Qgc2hvdWxkIGJlIGEgZGVmYXVsdCBmb3IuIFVucmVjb2duaXplZCB2YWx1ZXMgd2lsbCBiZQorICAgICAqICAgICAgICAgICAgIHRyZWF0ZWQgYXMgQVVESU9fVVNBR0VfVU5LTk9XTi4KKyAgICAgKiAgIGlkOiAgICAgICBBZGRyZXNzIHdoZXJlIHRoZSBzeXN0ZW0td2lkZSB1bmlxdWUgaWQgb2YgdGhlIGRlZmF1bHQgZWZmZWN0IHNob3VsZCBiZSByZXR1cm5lZC4KKyAgICAgKgorICAgICAqIFJldHVybmVkIHN0YXR1cyAoZnJvbSB1dGlscy9FcnJvcnMuaCkgY2FuIGJlOgorICAgICAqICAgICAgTk9fRVJST1IgICAgICAgIHN1Y2Nlc3NmdWwgb3BlcmF0aW9uLgorICAgICAqICAgICAgUEVSTUlTU0lPTl9ERU5JRUQgY291bGQgbm90IGdldCBBdWRpb0ZsaW5nZXIgaW50ZXJmYWNlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICBvciBjYWxsZXIgbGFja3MgcmVxdWlyZWQgcGVybWlzc2lvbnMuCisgICAgICogICAgICBOT19JTklUICAgICAgICAgZWZmZWN0IGxpYnJhcnkgZmFpbGVkIHRvIGluaXRpYWxpemUuCisgICAgICogICAgICBCQURfVkFMVUUgICAgICAgaW52YWxpZCB0eXBlIHV1aWQgb3IgaW1wbGVtZW50YXRpb24gdXVpZC4KKyAgICAgKiAgICAgIE5BTUVfTk9UX0ZPVU5EICBubyBlZmZlY3Qgd2l0aCB0aGlzIHV1aWQgb3IgdHlwZSBmb3VuZC4KKyAgICAgKgorICAgICAqIFJldHVybmVkIHZhbHVlCisgICAgICogICAqaWQ6ICBUaGUgc3lzdGVtLXdpZGUgdW5pcXVlIGlkIG9mIHRoZSBhZGRlZCBkZWZhdWx0IGVmZmVjdC4KKyAgICAgKi8KKyAgICBzdGF0aWMgc3RhdHVzX3QgYWRkU3RyZWFtRGVmYXVsdEVmZmVjdChjb25zdCBjaGFyKiB0eXBlU3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHV1aWRTdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb191c2FnZV90IHVzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3VuaXF1ZV9pZF90KiBpZCk7CisKKyAgICAvKgorICAgICAqIFJlbW92ZXMgYW4gZWZmZWN0IGZyb20gdGhlIGxpc3Qgb2YgZGVmYXVsdCBvdXRwdXQgZWZmZWN0cyBmb3IgYSBnaXZlbiBzb3VyY2UgdHlwZS4KKyAgICAgKgorICAgICAqIFBhcmFtZXRlcnM6CisgICAgICogICAgICBpZDogVGhlIHN5c3RlbS13aWRlIHVuaXF1ZSBpZCBvZiB0aGUgZWZmZWN0IHRoYXQgc2hvdWxkIG5vIGxvbmdlciBiZSBhIGRlZmF1bHQuCisgICAgICoKKyAgICAgKiBSZXR1cm5lZCBzdGF0dXMgKGZyb20gdXRpbHMvRXJyb3JzLmgpIGNhbiBiZToKKyAgICAgKiAgICAgIE5PX0VSUk9SICAgICAgICBzdWNjZXNzZnVsIG9wZXJhdGlvbi4KKyAgICAgKiAgICAgIFBFUk1JU1NJT05fREVOSUVEIGNvdWxkIG5vdCBnZXQgQXVkaW9GbGluZ2VyIGludGVyZmFjZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgb3IgY2FsbGVyIGxhY2tzIHJlcXVpcmVkIHBlcm1pc3Npb25zLgorICAgICAqICAgICAgTk9fSU5JVCAgICAgICAgIGVmZmVjdCBsaWJyYXJ5IGZhaWxlZCB0byBpbml0aWFsaXplLgorICAgICAqICAgICAgQkFEX1ZBTFVFICAgICAgIGludmFsaWQgaWQuCisgICAgICovCisgICAgc3RhdGljIHN0YXR1c190IHJlbW92ZVNvdXJjZURlZmF1bHRFZmZlY3QoYXVkaW9fdW5pcXVlX2lkX3QgaWQpOworCisgICAgLyoKKyAgICAgKiBSZW1vdmVzIGFuIGVmZmVjdCBmcm9tIHRoZSBsaXN0IG9mIGRlZmF1bHQgb3V0cHV0IGVmZmVjdHMgZm9yIGEgZ2l2ZW4gc3RyZWFtIHR5cGUuCisgICAgICoKKyAgICAgKiBQYXJhbWV0ZXJzOgorICAgICAqICAgICAgaWQ6IFRoZSBzeXN0ZW0td2lkZSB1bmlxdWUgaWQgb2YgdGhlIGVmZmVjdCB0aGF0IHNob3VsZCBubyBsb25nZXIgYmUgYSBkZWZhdWx0LgorICAgICAqCisgICAgICogUmV0dXJuZWQgc3RhdHVzIChmcm9tIHV0aWxzL0Vycm9ycy5oKSBjYW4gYmU6CisgICAgICogICAgICBOT19FUlJPUiAgICAgICAgc3VjY2Vzc2Z1bCBvcGVyYXRpb24uCisgICAgICogICAgICBQRVJNSVNTSU9OX0RFTklFRCBjb3VsZCBub3QgZ2V0IEF1ZGlvRmxpbmdlciBpbnRlcmZhY2UKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9yIGNhbGxlciBsYWNrcyByZXF1aXJlZCBwZXJtaXNzaW9ucy4KKyAgICAgKiAgICAgIE5PX0lOSVQgICAgICAgICBlZmZlY3QgbGlicmFyeSBmYWlsZWQgdG8gaW5pdGlhbGl6ZS4KKyAgICAgKiAgICAgIEJBRF9WQUxVRSAgICAgICBpbnZhbGlkIGlkLgorICAgICAqLworICAgIHN0YXRpYyBzdGF0dXNfdCByZW1vdmVTdHJlYW1EZWZhdWx0RWZmZWN0KGF1ZGlvX3VuaXF1ZV9pZF90IGlkKTsKKworICAgIC8qCiAgICAgICogRXZlbnRzIHVzZWQgYnkgY2FsbGJhY2sgZnVuY3Rpb24gKGVmZmVjdF9jYWxsYmFja190KS4KICAgICAgKi8KICAgICBlbnVtIGV2ZW50X3R5cGUgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb01peGVyLmggYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvTWl4ZXIuaAppbmRleCBjZjdkOTBmLi5hYTAzNmE4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvTWl4ZXIuaAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvTWl4ZXIuaApAQCAtMTgsMTcgKzE4LDE4IEBACiAjaWZuZGVmIEFORFJPSURfQVVESU9fTUlYRVJfSAogI2RlZmluZSBBTkRST0lEX0FVRElPX01JWEVSX0gKIAorI2luY2x1ZGUgPG1hcD4KICNpbmNsdWRlIDxwdGhyZWFkLmg+CiAjaW5jbHVkZSA8c3N0cmVhbT4KICNpbmNsdWRlIDxzdGRpbnQuaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgorI2luY2x1ZGUgPHZlY3Rvcj4KIAogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvQnVmZmVyUHJvdmlkZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1Jlc2FtcGxlci5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUmVzYW1wbGVyUHVibGljLmg+CiAjaW5jbHVkZSA8bWVkaWEvQnVmZmVyUHJvdmlkZXJzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvbmJsb2cvTkJMb2cuaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KICNpbmNsdWRlIDx1dGlscy9Db21wYXQuaD4KICNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CkBAIC00MSw2ICs0MiwxMCBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKK25hbWVzcGFjZSBOQkxvZyB7CitjbGFzcyBXcml0ZXI7Cit9ICAgLy8gbmFtZXNwYWNlIE5CTG9nCisKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogY2xhc3MgQXVkaW9NaXhlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1BhcmFtZXRlci5oIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1BhcmFtZXRlci5oCmluZGV4IDk2N2Q4OTUuLjI0ODM3ZTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9QYXJhbWV0ZXIuaAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvUGFyYW1ldGVyLmgKQEAgLTY0LDYgKzY0LDkgQEAKICAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGtleVByZXNlbnRhdGlvbklkOwogICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qga2V5UHJvZ3JhbUlkOwogCisgICAgLy8gIGtleUF1ZGlvTGFuZ3VhZ2VQcmVmZXJyZWQ6IFByZWZlcnJlZCBhdWRpbyBsYW5ndWFnZQorICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qga2V5QXVkaW9MYW5ndWFnZVByZWZlcnJlZDsKKwogICAgIC8vICBrZXlTdHJlYW1Db25uZWN0IC8gRGlzY29ubmVjdDogdmFsdWUgaXMgYW4gaW50IGluIGF1ZGlvX2RldmljZXNfdAogICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qga2V5U3RyZWFtQ29ubmVjdDsKICAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGtleVN0cmVhbURpc2Nvbm5lY3Q7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvUG9saWN5SGVscGVyLmggYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvUG9saWN5SGVscGVyLmgKaW5kZXggZmJlOTU0Ni4uNDk0MzJiNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1BvbGljeUhlbHBlci5oCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9Qb2xpY3lIZWxwZXIuaApAQCAtMjAsNiArMjAsNDMgQEAKICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KIAogc3RhdGljIGlubGluZQorYXVkaW9fc3RyZWFtX3R5cGVfdCBhdWRpb191c2FnZV90b19zdHJlYW1fdHlwZShjb25zdCBhdWRpb191c2FnZV90IHVzYWdlKQoreworICAgIHN3aXRjaCh1c2FnZSkgeworICAgICAgICBjYXNlIEFVRElPX1VTQUdFX01FRElBOgorICAgICAgICBjYXNlIEFVRElPX1VTQUdFX0dBTUU6CisgICAgICAgIGNhc2UgQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9OQVZJR0FUSU9OX0dVSURBTkNFOgorICAgICAgICBjYXNlIEFVRElPX1VTQUdFX0FTU0lTVEFOVDoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fTVVTSUM7CisgICAgICAgIGNhc2UgQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9BQ0NFU1NJQklMSVRZOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9BQ0NFU1NJQklMSVRZOworICAgICAgICBjYXNlIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfU09OSUZJQ0FUSU9OOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9TWVNURU07CisgICAgICAgIGNhc2UgQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTjoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTDsKKworICAgICAgICBjYXNlIEFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT05fU0lHTkFMTElORzoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fRFRNRjsKKworICAgICAgICBjYXNlIEFVRElPX1VTQUdFX0FMQVJNOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9BTEFSTTsKKyAgICAgICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fVEVMRVBIT05ZX1JJTkdUT05FOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9SSU5HOworCisgICAgICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OOgorICAgICAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fSU5TVEFOVDoKKyAgICAgICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9ERUxBWUVEOgorICAgICAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9FVkVOVDoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fTk9USUZJQ0FUSU9OOworCisgICAgICAgIGNhc2UgQVVESU9fVVNBR0VfVU5LTk9XTjoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fTVVTSUM7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lCiBhdWRpb19zdHJlYW1fdHlwZV90IGF1ZGlvX2F0dHJpYnV0ZXNfdG9fc3RyZWFtX3R5cGUoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyKQogewogICAgIC8vIGZsYWdzIHRvIHN0cmVhbSB0eXBlIG1hcHBpbmcKQEAgLTMxLDM4ICs2OCw3IEBACiAgICAgfQogCiAgICAgLy8gdXNhZ2UgdG8gc3RyZWFtIHR5cGUgbWFwcGluZwotICAgIHN3aXRjaCAoYXR0ci0+dXNhZ2UpIHsKLSAgICBjYXNlIEFVRElPX1VTQUdFX01FRElBOgotICAgIGNhc2UgQVVESU9fVVNBR0VfR0FNRToKLSAgICBjYXNlIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfTkFWSUdBVElPTl9HVUlEQU5DRToKLSAgICBjYXNlIEFVRElPX1VTQUdFX0FTU0lTVEFOVDoKLSAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9NVVNJQzsKLSAgICBjYXNlIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfQUNDRVNTSUJJTElUWToKLSAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9BQ0NFU1NJQklMSVRZOwotICAgIGNhc2UgQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9TT05JRklDQVRJT046Ci0gICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fU1lTVEVNOwotICAgIGNhc2UgQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTjoKLSAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMOwotCi0gICAgY2FzZSBBVURJT19VU0FHRV9WT0lDRV9DT01NVU5JQ0FUSU9OX1NJR05BTExJTkc6Ci0gICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fRFRNRjsKLQotICAgIGNhc2UgQVVESU9fVVNBR0VfQUxBUk06Ci0gICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fQUxBUk07Ci0gICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fVEVMRVBIT05ZX1JJTkdUT05FOgotICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX1JJTkc7Ci0KLSAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTjoKLSAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX1JFUVVFU1Q6Ci0gICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9JTlNUQU5UOgotICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fREVMQVlFRDoKLSAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9FVkVOVDoKLSAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9OT1RJRklDQVRJT047Ci0KLSAgICBjYXNlIEFVRElPX1VTQUdFX1VOS05PV046Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9NVVNJQzsKLSAgICB9CisgICAgcmV0dXJuIGF1ZGlvX3VzYWdlX3RvX3N0cmVhbV90eXBlKGF0dHItPnVzYWdlKTsKIH0KIAogc3RhdGljIGlubGluZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1JlY29yZC5oIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1JlY29yZC5oCmluZGV4IDgwNjI4MGEuLmMyMjY1NTcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9SZWNvcmQuaAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvUmVjb3JkLmgKQEAgLTY1NCw2ICs2NTQsNyBAQAogICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgICAgIG1PcmlnRmxhZ3M7ICAgICAgICAgICAgIC8vIGFzIHNwZWNpZmllZCBpbiBjb25zdHJ1Y3RvciBvciBzZXQoKSwgY29uc3QKIAogICAgIGF1ZGlvX3Nlc3Npb25fdCAgICAgICAgIG1TZXNzaW9uSWQ7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgbUlkOyAgICAgICAgICAgICAgICAgICAgLy8gSWQgZnJvbSBBdWRpb0ZsaW5nZXIKICAgICB0cmFuc2Zlcl90eXBlICAgICAgICAgICBtVHJhbnNmZXI7CiAKICAgICAvLyBOZXh0IDUgZmllbGRzIG1heSBiZSBjaGFuZ2VkIGlmIElBdWRpb1JlY29yZCBpcyByZS1jcmVhdGVkLCBidXQgYWx3YXlzICE9IDAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9TeXN0ZW0uaCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9TeXN0ZW0uaAppbmRleCA0YzBmNzk2Li5hZGZlZThiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvU3lzdGVtLmgKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1N5c3RlbS5oCkBAIC0yMjQsMTUgKzIyNCw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqc2VsZWN0ZWREZXZpY2VJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQpOwotICAgIHN0YXRpYyBzdGF0dXNfdCBzdGFydE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7Ci0gICAgc3RhdGljIHN0YXR1c190IHN0b3BPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKLSAgICBzdGF0aWMgdm9pZCByZWxlYXNlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOworICAgIHN0YXRpYyBzdGF0dXNfdCBzdGFydE91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCk7CisgICAgc3RhdGljIHN0YXR1c190IHN0b3BPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOworICAgIHN0YXRpYyB2b2lkIHJlbGVhc2VPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOwogCiAgICAgLy8gQ2xpZW50IG11c3Qgc3VjY2Vzc2Z1bGx5IGhhbmQgb2ZmIHRoZSBoYW5kbGUgcmVmZXJlbmNlIHRvIEF1ZGlvRmxpbmdlciB2aWEgY3JlYXRlUmVjb3JkKCksCiAgICAgLy8gb3IgcmVsZWFzZSBpdCB3aXRoIHJlbGVhc2VJbnB1dCgpLgpAQCAtMzI4LDkgKzMyMiw5IEBACiAgICAgc3RhdGljIHN0YXR1c190IHJlZ2lzdGVyUG9saWN5TWl4ZXMoY29uc3QgVmVjdG9yPEF1ZGlvTWl4PiYgbWl4ZXMsIGJvb2wgcmVnaXN0cmF0aW9uKTsKIAogICAgIHN0YXRpYyBzdGF0dXNfdCBzdGFydEF1ZGlvU291cmNlKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHJpYnV0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUpOwotICAgIHN0YXRpYyBzdGF0dXNfdCBzdG9wQXVkaW9Tb3VyY2UoYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkKTsKKyAgICBzdGF0aWMgc3RhdHVzX3Qgc3RvcEF1ZGlvU291cmNlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKIAogICAgIHN0YXRpYyBzdGF0dXNfdCBzZXRNYXN0ZXJNb25vKGJvb2wgbW9ubyk7CiAgICAgc3RhdGljIHN0YXR1c190IGdldE1hc3Rlck1vbm8oYm9vbCAqbW9ubyk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvVGltZXN0YW1wLmggYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvVGltZXN0YW1wLmgKaW5kZXggNDk4ZGU4ZS4uZTU5MjVkZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1RpbWVzdGFtcC5oCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9UaW1lc3RhbXAuaApAQCAtMTM1LDggKzEzNSwyMyBAQAogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCisgICAgZG91YmxlIGdldE91dHB1dFNlcnZlckxhdGVuY3lNcyh1aW50MzJfdCBzYW1wbGVSYXRlKSBjb25zdCB7CisgICAgICAgIHJldHVybiBnZXRMYXRlbmN5TXMoc2FtcGxlUmF0ZSwgTE9DQVRJT05fU0VSVkVSLCBMT0NBVElPTl9LRVJORUwpOworICAgIH0KKworICAgIGRvdWJsZSBnZXRMYXRlbmN5TXModWludDMyX3Qgc2FtcGxlUmF0ZSwgTG9jYXRpb24gbG9jYXRpb24xLCBMb2NhdGlvbiBsb2NhdGlvbjIpIGNvbnN0IHsKKyAgICAgICAgaWYgKHNhbXBsZVJhdGUgPiAwICYmIG1UaW1lTnNbbG9jYXRpb24xXSA+IDAgJiYgbVRpbWVOc1tsb2NhdGlvbjJdID4gMCkgeworICAgICAgICAgICAgY29uc3QgaW50NjRfdCBmcmFtZURpZmZlcmVuY2UgPQorICAgICAgICAgICAgICAgICAgICBtUG9zaXRpb25bbG9jYXRpb24xXSAtIG1Qb3NpdGlvbltsb2NhdGlvbjJdOworICAgICAgICAgICAgY29uc3QgaW50NjRfdCB0aW1lRGlmZmVyZW5jZU5zID0KKyAgICAgICAgICAgICAgICAgICAgbVRpbWVOc1tsb2NhdGlvbjFdIC0gbVRpbWVOc1tsb2NhdGlvbjJdOworICAgICAgICAgICAgcmV0dXJuICgoZG91YmxlKWZyYW1lRGlmZmVyZW5jZSAqIDFlOSAvIHNhbXBsZVJhdGUgLSB0aW1lRGlmZmVyZW5jZU5zKSAqIDFlLTY7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDAuOworICAgIH0KKwogICAgIC8vIGNvbnZlcnQgZmllbGRzIHRvIGEgcHJpbnRhYmxlIHN0cmluZwotICAgIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCkgeworICAgIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCkgY29uc3QgewogICAgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKIAogICAgICAgICBzcyA8PCAiQk9PVFRJTUUgb2Zmc2V0ICIgPDwgbVRpbWViYXNlT2Zmc2V0W1RJTUVCQVNFX0JPT1RUSU1FXSA8PCAiXG4iOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1RyYWNrLmggYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvVHJhY2suaAppbmRleCA1OWM2ZjRjLi40Yjg0ZmQxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvVHJhY2suaAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvVHJhY2suaApAQCAtNzQsNiArNzQsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4gdGhlIG1hcHBpbmcgZnJvbSBmcmFtZSBwb3NpdGlvbiB0byBwcmVzZW50YXRpb24gdGltZS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNlZSBBdWRpb1RpbWVzdGFtcCBmb3IgdGhlIGluZm9ybWF0aW9uIGluY2x1ZGVkIHdpdGggZXZlbnQuCiAjZW5kaWYKKyAgICAgICAgRVZFTlRfQ0FOX1dSSVRFX01PUkVfREFUQSA9IDksLy8gTm90aWZpY2F0aW9uIHRoYXQgbW9yZSBkYXRhIGNhbiBiZSBnaXZlbiBieSB3cml0ZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGV2ZW50IG9ubHkgb2NjdXJzIGZvciBUUkFOU0ZFUl9TWU5DX05PVElGX0NBTExCQUNLLgogICAgIH07CiAKICAgICAvKiBDbGllbnQgc2hvdWxkIGRlY2xhcmUgYSBCdWZmZXIgYW5kIHBhc3MgdGhlIGFkZHJlc3MgdG8gb2J0YWluQnVmZmVyKCkKQEAgLTE1Myw2ICsxNTUsNyBAQAogICAgICAgICBUUkFOU0ZFUl9PQlRBSU4sICAgIC8vIGNhbGwgb2J0YWluQnVmZmVyKCkgYW5kIHJlbGVhc2VCdWZmZXIoKQogICAgICAgICBUUkFOU0ZFUl9TWU5DLCAgICAgIC8vIHN5bmNocm9ub3VzIHdyaXRlKCkKICAgICAgICAgVFJBTlNGRVJfU0hBUkVELCAgICAvLyBzaGFyZWQgbWVtb3J5CisgICAgICAgIFRSQU5TRkVSX1NZTkNfTk9USUZfQ0FMTEJBQ0ssIC8vIHN5bmNocm9ub3VzIHdyaXRlKCksIG5vdGlmIEVWRU5UX0NBTl9XUklURV9NT1JFX0RBVEEKICAgICB9OwogCiAgICAgLyogQ29uc3RydWN0cyBhbiB1bmluaXRpYWxpemVkIEF1ZGlvVHJhY2suIE5vIGNvbm5lY3Rpb24gd2l0aApAQCAtMjk1LDYgKzI5OCw4IEBACiAgICAgICogUGFyYW1ldGVycyBub3QgbGlzdGVkIGluIHRoZSBBdWRpb1RyYWNrIGNvbnN0cnVjdG9ycyBhYm92ZToKICAgICAgKgogICAgICAqIHRocmVhZENhbkNhbGxKYXZhOiAgV2hldGhlciBjYWxsYmFja3MgYXJlIG1hZGUgZnJvbSBhbiBhdHRhY2hlZCB0aHJlYWQgYW5kIHRodXMgY2FuIGNhbGwgSk5JLgorICAgICAqICAgICAgT25seSBzZXQgdG8gdHJ1ZSB3aGVuIEF1ZGlvVHJhY2sgb2JqZWN0IGlzIHVzZWQgZm9yIGEgamF2YSBhbmRyb2lkLm1lZGlhLkF1ZGlvVHJhY2sKKyAgICAgKiAgICAgIGluIGl0cyBKTkkgY29kZS4KICAgICAgKgogICAgICAqIEludGVybmFsIHN0YXRlIHBvc3QgY29uZGl0aW9uOgogICAgICAqICAgICAgKG1TdHJlYW1UeXBlID09IEFVRElPX1NUUkVBTV9ERUZBVUxUKSBpbXBsaWVzIHRoaXMgQXVkaW9UcmFjayBoYXMgdmFsaWQgYXR0cmlidXRlcwpAQCAtMTA1OCw2ICsxMDYzLDE5IEBACiAgICAgICAgIFNUQVRFX1NUT1BQSU5HLAogICAgIH0gICAgICAgICAgICAgICAgICAgICAgIG1TdGF0ZTsKIAorICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqc3RhdGVUb1N0cmluZyhTdGF0ZSBzdGF0ZSkKKyAgICB7CisgICAgICAgIHN3aXRjaCAoc3RhdGUpIHsKKyAgICAgICAgY2FzZSBTVEFURV9BQ1RJVkU6ICAgICAgICAgIHJldHVybiAiU1RBVEVfQUNUSVZFIjsKKyAgICAgICAgY2FzZSBTVEFURV9TVE9QUEVEOiAgICAgICAgIHJldHVybiAiU1RBVEVfU1RPUFBFRCI7CisgICAgICAgIGNhc2UgU1RBVEVfUEFVU0VEOiAgICAgICAgICByZXR1cm4gIlNUQVRFX1BBVVNFRCI7CisgICAgICAgIGNhc2UgU1RBVEVfUEFVU0VEX1NUT1BQSU5HOiByZXR1cm4gIlNUQVRFX1BBVVNFRF9TVE9QUElORyI7CisgICAgICAgIGNhc2UgU1RBVEVfRkxVU0hFRDogICAgICAgICByZXR1cm4gIlNUQVRFX0ZMVVNIRUQiOworICAgICAgICBjYXNlIFNUQVRFX1NUT1BQSU5HOiAgICAgICAgcmV0dXJuICJTVEFURV9TVE9QUElORyI7CisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICByZXR1cm4gIlVOS05PV04iOworICAgICAgICB9CisgICAgfQorCiAgICAgLy8gZm9yIGNsaWVudCBjYWxsYmFjayBoYW5kbGVyCiAgICAgY2FsbGJhY2tfdCAgICAgICAgICAgICAgbUNiZjsgICAgICAgICAgICAgICAgICAgLy8gY2FsbGJhY2sgaGFuZGxlciBmb3IgZXZlbnRzLCBvciBOVUxMCiAgICAgdm9pZCogICAgICAgICAgICAgICAgICAgbVVzZXJEYXRhOwpAQCAtMTE0OCw2ICsxMTY2LDcgQEAKIAogICAgIGF1ZGlvX3Nlc3Npb25fdCAgICAgICAgIG1TZXNzaW9uSWQ7CiAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgbUF1eEVmZmVjdElkOworICAgIGludCAgICAgICAgICAgICAgICAgICAgIG1JZDsgICAgICAgICAgICAgICAgICAgIC8vIElkIGZyb20gQXVkaW9GbGluZ2VyLgogCiAgICAgbXV0YWJsZSBNdXRleCAgICAgICAgICAgbUxvY2s7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvSUF1ZGlvRmxpbmdlci5oIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9JQXVkaW9GbGluZ2VyLmgKaW5kZXggZTZiZjcyZi4uNTJjYzg2MCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9JQXVkaW9GbGluZ2VyLmgKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9JQXVkaW9GbGluZ2VyLmgKQEAgLTE0Niw2ICsxNDYsNyBAQAogICAgICAgICAgICAgYWZTYW1wbGVSYXRlID0gcGFyY2VsLT5yZWFkSW50NjQoKTsKICAgICAgICAgICAgIGFmTGF0ZW5jeU1zID0gcGFyY2VsLT5yZWFkSW50MzIoKTsKICAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+cmVhZCgmb3V0cHV0SWQsIHNpemVvZihhdWRpb19pb19oYW5kbGVfdCkpOworICAgICAgICAgICAgKHZvaWQpcGFyY2VsLT5yZWFkSW50MzIoJnRyYWNrSWQpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9CiAKQEAgLTE2Myw2ICsxNjQsNyBAQAogICAgICAgICAgICAgKHZvaWQpcGFyY2VsLT53cml0ZUludDY0KGFmU2FtcGxlUmF0ZSk7CiAgICAgICAgICAgICAodm9pZClwYXJjZWwtPndyaXRlSW50MzIoYWZMYXRlbmN5TXMpOwogICAgICAgICAgICAgKHZvaWQpcGFyY2VsLT53cml0ZSgmb3V0cHV0SWQsIHNpemVvZihhdWRpb19pb19oYW5kbGVfdCkpOworICAgICAgICAgICAgKHZvaWQpcGFyY2VsLT53cml0ZUludDMyKHRyYWNrSWQpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9CiAKQEAgLTE3OSw2ICsxODEsNyBAQAogICAgICAgICB1aW50MzJfdCBhZlNhbXBsZVJhdGU7CiAgICAgICAgIHVpbnQzMl90IGFmTGF0ZW5jeU1zOwogICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXRJZDsKKyAgICAgICAgaW50MzJfdCB0cmFja0lkOwogICAgIH07CiAKICAgICAvKiBDcmVhdGVSZWNvcmRJbnB1dCBjb250YWlucyBhbGwgaW5wdXQgYXJndW1lbnRzIHNlbnQgYnkgQXVkaW9SZWNvcmQgdG8gQXVkaW9GbGluZ2VyCkBAIC0yNzEsNiArMjc0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CisgICAgICAgICAgICAodm9pZClwYXJjZWwtPnJlYWRJbnQzMigmdHJhY2tJZCk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0KIApAQCAtMjk3LDYgKzMwMSw3IEBACiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+d3JpdGVJbnQzMigwKTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+d3JpdGVJbnQzMih0cmFja0lkKTsKIAogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9CkBAIC0zMTMsNiArMzE4LDcgQEAKICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW5wdXRJZDsKICAgICAgICAgc3A8SU1lbW9yeT4gY2JsazsKICAgICAgICAgc3A8SU1lbW9yeT4gYnVmZmVyczsKKyAgICAgICAgaW50MzJfdCB0cmFja0lkOwogICAgIH07CiAKICAgICAvLyBpbnZhcmlhbnQgb24gZXhpdCBmb3IgYWxsIEFQSXMgdGhhdCByZXR1cm4gYW4gc3A8PjoKQEAgLTQyOCw3ICs0MzQsOSBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgcXVlcnlFZmZlY3QodWludDMyX3QgaW5kZXgsIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKSBjb25zdCA9IDA7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldEVmZmVjdERlc2NyaXB0b3IoY29uc3QgZWZmZWN0X3V1aWRfdCAqcEVmZmVjdFVVSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpIGNvbnN0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqcFR5cGVVVUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVmZXJyZWRUeXBlRmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpIGNvbnN0ID0gMDsKIAogICAgIHZpcnR1YWwgc3A8SUVmZmVjdD4gY3JlYXRlRWZmZWN0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2MsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2UuaCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZS5oCmluZGV4IGMzODc2YWYuLmZkZDhkNTcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZS5oCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZS5oCkBAIC02NiwxNSArNjYsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqc2VsZWN0ZWREZXZpY2VJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkKSA9IDA7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKSA9IDA7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKSA9IDA7Ci0gICAgdmlydHVhbCB2b2lkIHJlbGVhc2VPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydE91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcE91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkgPSAwOworICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlT3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgZ2V0SW5wdXRGb3JBdHRyKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICppbnB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLApAQCAtMTE1LDYgKzEwOSwyMCBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgcXVlcnlEZWZhdWx0UHJlUHJvY2Vzc2luZyhhdWRpb19zZXNzaW9uX3QgYXVkaW9TZXNzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2NyaXB0b3JzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpjb3VudCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkU291cmNlRGVmYXVsdEVmZmVjdChjb25zdCBlZmZlY3RfdXVpZF90ICp0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqdXVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb191bmlxdWVfaWRfdCogaWQpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGFkZFN0cmVhbURlZmF1bHRFZmZlY3QoY29uc3QgZWZmZWN0X3V1aWRfdCAqdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnV1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3VzYWdlX3QgdXNhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3VuaXF1ZV9pZF90KiBpZCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlU291cmNlRGVmYXVsdEVmZmVjdChhdWRpb191bmlxdWVfaWRfdCBpZCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlU3RyZWFtRGVmYXVsdEVmZmVjdChhdWRpb191bmlxdWVfaWRfdCBpZCkgPSAwOwogICAgLy8gQ2hlY2sgaWYgb2ZmbG9hZCBpcyBwb3NzaWJsZSBmb3IgZ2l2ZW4gZm9ybWF0LCBzdHJlYW0gdHlwZSwgc2FtcGxlIHJhdGUsCiAgICAgLy8gYml0IHJhdGUsIGR1cmF0aW9uLCB2aWRlbyBhbmQgc3RyZWFtaW5nIG9yIG9mZmxvYWQgcHJvcGVydHkgaXMgZW5hYmxlZAogICAgIHZpcnR1YWwgYm9vbCBpc09mZmxvYWRTdXBwb3J0ZWQoY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QmIGluZm8pID0gMDsKQEAgLTE1OSw4ICsxNjcsOCBAQAogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydEF1ZGlvU291cmNlKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHJpYnV0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUpID0gMDsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BBdWRpb1NvdXJjZShhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wQXVkaW9Tb3VyY2UoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpID0gMDsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWFzdGVyTW9ubyhib29sIG1vbm8pID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1hc3Rlck1vbm8oYm9vbCAqbW9ubykgPSAwOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJhdWRpb2hhbC8yLjAvQW5kcm9pZC5icApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc0YjQzNS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvQW5kcm9pZC5icAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLWNjX2xpYnJhcnlfc2hhcmVkIHsKLSAgICBuYW1lOiAibGliYXVkaW9oYWxAMi4wIiwKLQotICAgIHNyY3M6IFsKLSAgICAgICAgIkRldmljZUhhbExvY2FsLmNwcCIsCi0gICAgICAgICJEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZC5jcHAiLAotICAgICAgICAiRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbC5jcHAiLAotICAgICAgICAiU3RyZWFtSGFsTG9jYWwuY3BwIiwKLQotICAgICAgICAiQ29udmVyc2lvbkhlbHBlckhpZGwuY3BwIiwKLSAgICAgICAgIkRldmljZUhhbEhpZGwuY3BwIiwKLSAgICAgICAgIkRldmljZXNGYWN0b3J5SGFsSGlkbC5jcHAiLAotICAgICAgICAiRWZmZWN0QnVmZmVySGFsSGlkbC5jcHAiLAotICAgICAgICAiRWZmZWN0SGFsSGlkbC5jcHAiLAotICAgICAgICAiRWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmNwcCIsCi0gICAgICAgICJTdHJlYW1IYWxIaWRsLmNwcCIsCi0gICAgXSwKLQotICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiLiJdLAotCi0gICAgY2ZsYWdzOiBbCi0gICAgICAgICItV2FsbCIsCi0gICAgICAgICItV2Vycm9yIiwKLSAgICBdLAotICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJhdWRpb2hhbF9kZWF0aGhhbmRsZXIiLAotICAgICAgICAibGliYXVkaW91dGlscyIsCi0gICAgICAgICJsaWJjdXRpbHMiLAotICAgICAgICAibGlibG9nIiwKLSAgICAgICAgImxpYnV0aWxzIiwKLSAgICAgICAgImxpYmhhcmR3YXJlIiwKLSAgICAgICAgImxpYmJhc2UiLAotICAgICAgICAibGliZm1xIiwKLSAgICAgICAgImxpYmh3YmluZGVyIiwKLSAgICAgICAgImxpYmhpZGxiYXNlIiwKLSAgICAgICAgImxpYmhpZGxtZW1vcnkiLAotICAgICAgICAibGliaGlkbHRyYW5zcG9ydCIsCi0gICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvQDIuMCIsCi0gICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmNvbW1vbkAyLjAiLAotICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5jb21tb25AMi4wLXV0aWwiLAotICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5lZmZlY3RAMi4wIiwKLSAgICAgICAgImFuZHJvaWQuaGlkbC5hbGxvY2F0b3JAMS4wIiwKLSAgICAgICAgImFuZHJvaWQuaGlkbC5tZW1vcnlAMS4wIiwKLSAgICAgICAgImxpYm1lZGlhX2hlbHBlciIsCi0gICAgICAgICJsaWJtZWRpYXV0aWxzIiwKLSAgICBdLAotICAgIGhlYWRlcl9saWJzOiBbCi0gICAgICAgICJsaWJhdWRpb2hhbF9oZWFkZXJzIgotICAgIF0sCi0KLSAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbCi0gICAgICAgICJsaWJmbXEiLAotICAgIF0sCi19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvQ29udmVyc2lvbkhlbHBlckhpZGwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0NvbnZlcnNpb25IZWxwZXJIaWRsLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjYwYmY4Yi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvQ29udmVyc2lvbkhlbHBlckhpZGwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8c3RyaW5nLmg+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+IG1FZmZlY3RzRmFjdG9yeTsKLSAgICBoaWRsX3ZlYzxFZmZlY3REZXNjcmlwdG9yPiBtTGFzdERlc2NyaXB0b3JzOwotCi0gICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgotICAgIEVmZmVjdHNGYWN0b3J5SGFsSGlkbCgpOwotICAgIHZpcnR1YWwgfkVmZmVjdHNGYWN0b3J5SGFsSGlkbCgpOwotCi0gICAgc3RhdHVzX3QgcXVlcnlBbGxEZXNjcmlwdG9ycygpOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgVjRfMAotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9FRkZFQ1RTX0ZBQ1RPUllfSEFMX0hJRExfNF8wX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJhdWRpb2hhbC9BbmRyb2lkLmJwCmluZGV4IDNhNWRmMjcuLjBmZjBkNGEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvQW5kcm9pZC5icApAQCAtOCw2ICs4LDcgQEAKIAogICAgIGNmbGFnczogWwogICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdleHRyYSIsCiAgICAgICAgICItV2Vycm9yIiwKICAgICBdLAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9EZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZS5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC9EZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZS5jcHAKaW5kZXggNGM4ZWFmNi4uZTYzMWFjZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL0RldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlLmNwcApAQCAtMTcsMTggKzE3LDE3IEBACiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby8yLjAvSURldmljZXNGYWN0b3J5Lmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby80LjAvSURldmljZXNGYWN0b3J5Lmg+CiAKLSNpbmNsdWRlIDxEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZC5oPgotI2luY2x1ZGUgPGxpYmF1ZGlvaGFsLzQuMC9EZXZpY2VzRmFjdG9yeUhhbEh5YnJpZC5oPgorI2luY2x1ZGUgPGxpYmF1ZGlvaGFsL0ZhY3RvcnlIYWxIaWRsLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogLy8gc3RhdGljCiBzcDxEZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZT4gRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2U6OmNyZWF0ZSgpIHsKICAgICBpZiAoaGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpJRGV2aWNlc0ZhY3Rvcnk6OmdldFNlcnZpY2UoKSAhPSBudWxscHRyKSB7Ci0gICAgICAgIHJldHVybiBuZXcgVjRfMDo6RGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQoKTsKKyAgICAgICAgcmV0dXJuIFY0XzA6OmNyZWF0ZURldmljZXNGYWN0b3J5SGFsKCk7CiAgICAgfQogICAgIGlmIChoYXJkd2FyZTo6YXVkaW86OlYyXzA6OklEZXZpY2VzRmFjdG9yeTo6Z2V0U2VydmljZSgpICE9IG51bGxwdHIpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZCgpOworICAgICAgICByZXR1cm4gVjJfMDo6Y3JlYXRlRGV2aWNlc0ZhY3RvcnlIYWwoKTsKICAgICB9CiAgICAgcmV0dXJuIG51bGxwdHI7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9FZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZS5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC9FZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZS5jcHAKaW5kZXggZWFkMWZhMi4uZjc3MzRhOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvRWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2UuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL0VmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlLmNwcApAQCAtMTcsMTkgKzE3LDE3IEBACiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby9lZmZlY3QvMi4wL0lFZmZlY3RzRmFjdG9yeS5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vZWZmZWN0LzQuMC9JRWZmZWN0c0ZhY3RvcnkuaD4KIAotI2luY2x1ZGUgPEVmZmVjdHNGYWN0b3J5SGFsSGlkbC5oPgotI2luY2x1ZGUgPGxpYmF1ZGlvaGFsLzQuMC9FZmZlY3RzRmFjdG9yeUhhbEhpZGwuaD4KLQorI2luY2x1ZGUgPGxpYmF1ZGlvaGFsL0ZhY3RvcnlIYWxIaWRsLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogLy8gc3RhdGljCiBzcDxFZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZT4gRWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2U6OmNyZWF0ZSgpIHsKICAgICBpZiAoaGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlY0XzA6OklFZmZlY3RzRmFjdG9yeTo6Z2V0U2VydmljZSgpICE9IG51bGxwdHIpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBWNF8wOjpFZmZlY3RzRmFjdG9yeUhhbEhpZGwoKTsKKyAgICAgICAgcmV0dXJuIFY0XzA6OmNyZWF0ZUVmZmVjdHNGYWN0b3J5SGFsKCk7CiAgICAgfQogICAgIGlmIChoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjJfMDo6SUVmZmVjdHNGYWN0b3J5OjpnZXRTZXJ2aWNlKCkgIT0gbnVsbHB0cikgewotICAgICAgICByZXR1cm4gbmV3IEVmZmVjdHNGYWN0b3J5SGFsSGlkbCgpOworICAgICAgICByZXR1cm4gVjJfMDo6Y3JlYXRlRWZmZWN0c0ZhY3RvcnlIYWwoKTsKICAgICB9CiAgICAgcmV0dXJuIG51bGxwdHI7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzgyNzMzNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvQW5kcm9pZC5icApAQCAtMCwwICsxLDg2IEBACitjY19kZWZhdWx0cyB7CisgICAgbmFtZTogImxpYmF1ZGlvaGFsX2RlZmF1bHQiLAorCisgICAgc3JjczogWworICAgICAgICAiRGV2aWNlSGFsTG9jYWwuY3BwIiwKKyAgICAgICAgIkRldmljZXNGYWN0b3J5SGFsSHlicmlkLmNwcCIsCisgICAgICAgICJEZXZpY2VzRmFjdG9yeUhhbExvY2FsLmNwcCIsCisgICAgICAgICJTdHJlYW1IYWxMb2NhbC5jcHAiLAorCisgICAgICAgICJDb252ZXJzaW9uSGVscGVySGlkbC5jcHAiLAorICAgICAgICAiRGV2aWNlSGFsSGlkbC5jcHAiLAorICAgICAgICAiRGV2aWNlc0ZhY3RvcnlIYWxIaWRsLmNwcCIsCisgICAgICAgICJFZmZlY3RCdWZmZXJIYWxIaWRsLmNwcCIsCisgICAgICAgICJFZmZlY3RIYWxIaWRsLmNwcCIsCisgICAgICAgICJFZmZlY3RzRmFjdG9yeUhhbEhpZGwuY3BwIiwKKyAgICAgICAgIlN0cmVhbUhhbEhpZGwuY3BwIiwKKyAgICBdLAorCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XYWxsIiwKKyAgICAgICAgIi1XZXh0cmEiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5jb21tb24tdXRpbCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmNvbW1vbkAyLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5jb21tb25ANC4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW8uZWZmZWN0QDIuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmVmZmVjdEA0LjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpb0AyLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpb0A0LjAiLAorICAgICAgICAiYW5kcm9pZC5oaWRsLmFsbG9jYXRvckAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oaWRsLm1lbW9yeUAxLjAiLAorICAgICAgICAibGliYXVkaW9oYWxfZGVhdGhoYW5kbGVyIiwKKyAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAorICAgICAgICAibGliYmFzZSIsCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmZtcSIsCisgICAgICAgICJsaWJoYXJkd2FyZSIsCisgICAgICAgICJsaWJoaWRsYmFzZSIsCisgICAgICAgICJsaWJoaWRsbWVtb3J5IiwKKyAgICAgICAgImxpYmhpZGx0cmFuc3BvcnQiLAorICAgICAgICAibGliaHdiaW5kZXIiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYm1lZGlhX2hlbHBlciIsCisgICAgICAgICJsaWJtZWRpYXV0aWxzIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmNvbW1vbi51dGlsQGFsbC12ZXJzaW9ucyIsCisgICAgICAgICJsaWJhdWRpb2hhbF9oZWFkZXJzIgorICAgIF0sCisKKyAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbCisgICAgICAgICJsaWJmbXEiLAorICAgIF0sCit9CisKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliYXVkaW9oYWxAMi4wIiwKKyAgICBkZWZhdWx0czogWyJsaWJhdWRpb2hhbF9kZWZhdWx0Il0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW8uY29tbW9uQDIuMC11dGlsIiwKKyAgICBdLAorICAgIGNmbGFnczogWworICAgICAgICAiLURNQUpPUl9WRVJTSU9OPTIiLAorICAgICAgICAiLURNSU5PUl9WRVJTSU9OPTAiLAorICAgICAgICAiLWluY2x1ZGUgVmVyc2lvbk1hY3JvLmgiLAorICAgIF0KK30KKworY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJhdWRpb2hhbEA0LjAiLAorICAgIGRlZmF1bHRzOiBbImxpYmF1ZGlvaGFsX2RlZmF1bHQiXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5jb21tb25ANC4wLXV0aWwiLAorICAgIF0sCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItRE1BSk9SX1ZFUlNJT049NCIsCisgICAgICAgICItRE1JTk9SX1ZFUlNJT049MCIsCisgICAgICAgICItaW5jbHVkZSBWZXJzaW9uTWFjcm8uaCIsCisgICAgXQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9Db252ZXJzaW9uSGVscGVySGlkbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0NvbnZlcnNpb25IZWxwZXJIaWRsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDEyZmFkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9Db252ZXJzaW9uSGVscGVySGlkbC5jcHAKQEAgLTAsMCArMSwyNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNkZWZpbmUgTE9HX1RBRyAiSGFsSGlkbCIKKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1BhcmFtZXRlci5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiQ29udmVyc2lvbkhlbHBlckhpZGwuaCIKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOjpSZXN1bHQ7CisKKyNpZiBNQUpPUl9WRVJTSU9OID09IDQKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjo6QXVkaW9NaWNyb3Bob25lQ2hhbm5lbE1hcHBpbmc7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT046OkF1ZGlvTWljcm9waG9uZURpcmVjdGlvbmFsaXR5OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOjpBdWRpb01pY3JvcGhvbmVMb2NhdGlvbjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjo6RGV2aWNlQWRkcmVzczsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjo6TWljcm9waG9uZUluZm87CisjZW5kaWYKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIENQUF9WRVJTSU9OIHsKKworLy8gc3RhdGljCitzdGF0dXNfdCBDb252ZXJzaW9uSGVscGVySGlkbDo6a2V5c0Zyb21IYWwoY29uc3QgU3RyaW5nOCYga2V5cywgaGlkbF92ZWM8aGlkbF9zdHJpbmc+ICpoaWRsS2V5cykgeworICAgIEF1ZGlvUGFyYW1ldGVyIGhhbEtleXMoa2V5cyk7CisgICAgaWYgKGhhbEtleXMuc2l6ZSgpID09IDApIHJldHVybiBCQURfVkFMVUU7CisgICAgaGlkbEtleXMtPnJlc2l6ZShoYWxLZXlzLnNpemUoKSk7CisgICAgLy9GSVhNRTogIGtleVN0cmVhbVN1cHBvcnRlZENoYW5uZWxzIGFuZCBrZXlTdHJlYW1TdXBwb3J0ZWRTYW1wbGluZ1JhdGVzIGNvbWUgd2l0aCBhCisgICAgLy8gImtleUZvcm1hdD08dmFsdWU+IiBwYWlyLiBXZSBuZWVkIHRvIHRyYW5zZm9ybSBpdCBpbnRvIGEgc2luZ2xlIGtleSBzdHJpbmcgc28gdGhhdCBpdCBpcworICAgIC8vIGNhcnJpZWQgb3ZlciB0byB0aGUgbGVnYWN5IEhBTCB2aWEgSElETC4KKyAgICBTdHJpbmc4IHZhbHVlOworICAgIGJvb2wga2VlcEZvcm1hdFZhbHVlID0gaGFsS2V5cy5zaXplKCkgPT0gMiAmJgorICAgICAgICAgKGhhbEtleXMuZ2V0KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVN0cmVhbVN1cHBvcnRlZENoYW5uZWxzKSwgdmFsdWUpID09IE5PX0VSUk9SIHx8CisgICAgICAgICBoYWxLZXlzLmdldChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlTdHJlYW1TdXBwb3J0ZWRTYW1wbGluZ1JhdGVzKSwgdmFsdWUpID09IE5PX0VSUk9SKTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGFsS2V5cy5zaXplKCk7ICsraSkgeworICAgICAgICBTdHJpbmc4IGtleTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gaGFsS2V5cy5nZXRBdChpLCBrZXkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOworICAgICAgICBpZiAoa2VlcEZvcm1hdFZhbHVlICYmIGtleSA9PSBBdWRpb1BhcmFtZXRlcjo6a2V5Rm9ybWF0KSB7CisgICAgICAgICAgICBBdWRpb1BhcmFtZXRlciBmb3JtYXRQYXJhbTsKKyAgICAgICAgICAgIGhhbEtleXMuZ2V0QXQoaSwga2V5LCB2YWx1ZSk7CisgICAgICAgICAgICBmb3JtYXRQYXJhbS5hZGQoa2V5LCB2YWx1ZSk7CisgICAgICAgICAgICBrZXkgPSBmb3JtYXRQYXJhbS50b1N0cmluZygpOworICAgICAgICB9CisgICAgICAgICgqaGlkbEtleXMpW2ldID0ga2V5LnN0cmluZygpOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKKy8vIHN0YXRpYworc3RhdHVzX3QgQ29udmVyc2lvbkhlbHBlckhpZGw6OnBhcmFtZXRlcnNGcm9tSGFsKAorICAgICAgICBjb25zdCBTdHJpbmc4JiBrdlBhaXJzLCBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4gKmhpZGxQYXJhbXMpIHsKKyAgICBBdWRpb1BhcmFtZXRlciBwYXJhbXMoa3ZQYWlycyk7CisgICAgaWYgKHBhcmFtcy5zaXplKCkgPT0gMCkgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICBoaWRsUGFyYW1zLT5yZXNpemUocGFyYW1zLnNpemUoKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwYXJhbXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgU3RyaW5nOCBrZXksIHZhbHVlOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBwYXJhbXMuZ2V0QXQoaSwga2V5LCB2YWx1ZSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7CisgICAgICAgICgqaGlkbFBhcmFtcylbaV0ua2V5ID0ga2V5LnN0cmluZygpOworICAgICAgICAoKmhpZGxQYXJhbXMpW2ldLnZhbHVlID0gdmFsdWUuc3RyaW5nKCk7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworLy8gc3RhdGljCit2b2lkIENvbnZlcnNpb25IZWxwZXJIaWRsOjpwYXJhbWV0ZXJzVG9IYWwoCisgICAgICAgIGNvbnN0IGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiYgcGFyYW1ldGVycywgU3RyaW5nOCAqdmFsdWVzKSB7CisgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW1zOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcGFyYW1ldGVycy5zaXplKCk7ICsraSkgeworICAgICAgICBwYXJhbXMuYWRkKFN0cmluZzgocGFyYW1ldGVyc1tpXS5rZXkuY19zdHIoKSksIFN0cmluZzgocGFyYW1ldGVyc1tpXS52YWx1ZS5jX3N0cigpKSk7CisgICAgfQorICAgIHZhbHVlcy0+c2V0VG8ocGFyYW1zLnRvU3RyaW5nKCkpOworfQorCitDb252ZXJzaW9uSGVscGVySGlkbDo6Q29udmVyc2lvbkhlbHBlckhpZGwoY29uc3QgY2hhciogY2xhc3NOYW1lKQorICAgICAgICA6IG1DbGFzc05hbWUoY2xhc3NOYW1lKSB7Cit9CisKKy8vIHN0YXRpYworc3RhdHVzX3QgQ29udmVyc2lvbkhlbHBlckhpZGw6OmFuYWx5emVSZXN1bHQoY29uc3QgUmVzdWx0JiByZXN1bHQpIHsKKyAgICBzd2l0Y2ggKHJlc3VsdCkgeworICAgICAgICBjYXNlIFJlc3VsdDo6T0s6IHJldHVybiBPSzsKKyAgICAgICAgY2FzZSBSZXN1bHQ6OklOVkFMSURfQVJHVU1FTlRTOiByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICBjYXNlIFJlc3VsdDo6SU5WQUxJRF9TVEFURTogcmV0dXJuIE5PVF9FTk9VR0hfREFUQTsKKyAgICAgICAgY2FzZSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDogcmV0dXJuIE5PX0lOSVQ7CisgICAgICAgIGNhc2UgUmVzdWx0OjpOT1RfU1VQUE9SVEVEOiByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIGRlZmF1bHQ6IHJldHVybiBOT19JTklUOworICAgIH0KK30KKwordm9pZCBDb252ZXJzaW9uSGVscGVySGlkbDo6ZW1pdEVycm9yKGNvbnN0IGNoYXIqIGZ1bmNOYW1lLCBjb25zdCBjaGFyKiBkZXNjcmlwdGlvbikgeworICAgIEFMT0dFKCIlcyAlcCAlczogJXMgKGZyb20gcnBjKSIsIG1DbGFzc05hbWUsIHRoaXMsIGZ1bmNOYW1lLCBkZXNjcmlwdGlvbik7Cit9CisKKyNpZiBNQUpPUl9WRVJTSU9OID09IDQKKy8vIFRPRE86IFVzZSB0aGUgc2FtZSBpbXBsZW1lbnRhdGlvbiBpbiB0aGUgaGFsIHdoZW4gaXQgbW92ZXMgdG8gYSB1dGlsIGxpYnJhcnkuCitzdGF0aWMgc3RkOjpzdHJpbmcgZGV2aWNlQWRkcmVzc1RvSGFsKGNvbnN0IERldmljZUFkZHJlc3MmIGFkZHJlc3MpIHsKKyAgICAvLyBIQUwgYXNzdW1lcyB0aGF0IHRoZSBhZGRyZXNzIGlzIE5VTC10ZXJtaW5hdGVkLgorICAgIGNoYXIgaGFsQWRkcmVzc1tBVURJT19ERVZJQ0VfTUFYX0FERFJFU1NfTEVOXTsKKyAgICBtZW1zZXQoaGFsQWRkcmVzcywgMCwgc2l6ZW9mKGhhbEFkZHJlc3MpKTsKKyAgICBhdWRpb19kZXZpY2VzX3QgaGFsRGV2aWNlID0gc3RhdGljX2Nhc3Q8YXVkaW9fZGV2aWNlc190PihhZGRyZXNzLmRldmljZSk7CisgICAgY29uc3QgYm9vbCBpc0lucHV0ID0gKGhhbERldmljZSAmIEFVRElPX0RFVklDRV9CSVRfSU4pICE9IDA7CisgICAgaWYgKGlzSW5wdXQpIGhhbERldmljZSAmPSB+QVVESU9fREVWSUNFX0JJVF9JTjsKKyAgICBpZiAoKCFpc0lucHV0ICYmIChoYWxEZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX0FMTF9BMkRQKSAhPSAwKSB8fAorICAgICAgICAoaXNJbnB1dCAmJiAoaGFsRGV2aWNlICYgQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9BMkRQKSAhPSAwKSkgeworICAgICAgICBzbnByaW50ZihoYWxBZGRyZXNzLCBzaXplb2YoaGFsQWRkcmVzcyksICIlMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWCIsCisgICAgICAgICAgICAgICAgIGFkZHJlc3MuYWRkcmVzcy5tYWNbMF0sIGFkZHJlc3MuYWRkcmVzcy5tYWNbMV0sIGFkZHJlc3MuYWRkcmVzcy5tYWNbMl0sCisgICAgICAgICAgICAgICAgIGFkZHJlc3MuYWRkcmVzcy5tYWNbM10sIGFkZHJlc3MuYWRkcmVzcy5tYWNbNF0sIGFkZHJlc3MuYWRkcmVzcy5tYWNbNV0pOworICAgIH0gZWxzZSBpZiAoKCFpc0lucHV0ICYmIChoYWxEZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX0lQKSAhPSAwKSB8fAorICAgICAgICAgICAgICAgKGlzSW5wdXQgJiYgKGhhbERldmljZSAmIEFVRElPX0RFVklDRV9JTl9JUCkgIT0gMCkpIHsKKyAgICAgICAgc25wcmludGYoaGFsQWRkcmVzcywgc2l6ZW9mKGhhbEFkZHJlc3MpLCAiJWQuJWQuJWQuJWQiLCBhZGRyZXNzLmFkZHJlc3MuaXB2NFswXSwKKyAgICAgICAgICAgICAgICAgYWRkcmVzcy5hZGRyZXNzLmlwdjRbMV0sIGFkZHJlc3MuYWRkcmVzcy5pcHY0WzJdLCBhZGRyZXNzLmFkZHJlc3MuaXB2NFszXSk7CisgICAgfSBlbHNlIGlmICgoIWlzSW5wdXQgJiYgKGhhbERldmljZSAmIEFVRElPX0RFVklDRV9PVVRfQUxMX1VTQikgIT0gMCkgfHwKKyAgICAgICAgICAgICAgIChpc0lucHV0ICYmIChoYWxEZXZpY2UgJiBBVURJT19ERVZJQ0VfSU5fQUxMX1VTQikgIT0gMCkpIHsKKyAgICAgICAgc25wcmludGYoaGFsQWRkcmVzcywgc2l6ZW9mKGhhbEFkZHJlc3MpLCAiY2FyZD0lZDtkZXZpY2U9JWQiLCBhZGRyZXNzLmFkZHJlc3MuYWxzYS5jYXJkLAorICAgICAgICAgICAgICAgICBhZGRyZXNzLmFkZHJlc3MuYWxzYS5kZXZpY2UpOworICAgIH0gZWxzZSBpZiAoKCFpc0lucHV0ICYmIChoYWxEZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX0JVUykgIT0gMCkgfHwKKyAgICAgICAgICAgICAgIChpc0lucHV0ICYmIChoYWxEZXZpY2UgJiBBVURJT19ERVZJQ0VfSU5fQlVTKSAhPSAwKSkgeworICAgICAgICBzbnByaW50ZihoYWxBZGRyZXNzLCBzaXplb2YoaGFsQWRkcmVzcyksICIlcyIsIGFkZHJlc3MuYnVzQWRkcmVzcy5jX3N0cigpKTsKKyAgICB9IGVsc2UgaWYgKCghaXNJbnB1dCAmJiAoaGFsRGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYKSkgIT0gMCB8fAorICAgICAgICAgICAgICAgKGlzSW5wdXQgJiYgKGhhbERldmljZSAmIEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYKSAhPSAwKSkgeworICAgICAgICBzbnByaW50ZihoYWxBZGRyZXNzLCBzaXplb2YoaGFsQWRkcmVzcyksICIlcyIsIGFkZHJlc3MuclN1Ym1peEFkZHJlc3MuY19zdHIoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc25wcmludGYoaGFsQWRkcmVzcywgc2l6ZW9mKGhhbEFkZHJlc3MpLCAiJXMiLCBhZGRyZXNzLmJ1c0FkZHJlc3MuY19zdHIoKSk7CisgICAgfQorICAgIHJldHVybiBoYWxBZGRyZXNzOworfQorCisvL2xvY2FsIGNvbnZlcnNpb24gaGVscGVycworCitzdGF0aWMgYXVkaW9fbWljcm9waG9uZV9jaGFubmVsX21hcHBpbmdfdCAgY2hhbm5lbE1hcHBpbmdUb0hhbChBdWRpb01pY3JvcGhvbmVDaGFubmVsTWFwcGluZyBtYXBwaW5nKSB7CisgICAgc3dpdGNoIChtYXBwaW5nKSB7CisgICAgICAgIGNhc2UgQXVkaW9NaWNyb3Bob25lQ2hhbm5lbE1hcHBpbmc6OlVOVVNFRDoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19NSUNST1BIT05FX0NIQU5ORUxfTUFQUElOR19VTlVTRUQ7CisgICAgICAgIGNhc2UgQXVkaW9NaWNyb3Bob25lQ2hhbm5lbE1hcHBpbmc6OkRJUkVDVDoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19NSUNST1BIT05FX0NIQU5ORUxfTUFQUElOR19ESVJFQ1Q7CisgICAgICAgIGNhc2UgQXVkaW9NaWNyb3Bob25lQ2hhbm5lbE1hcHBpbmc6OlBST0NFU1NFRDoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19NSUNST1BIT05FX0NIQU5ORUxfTUFQUElOR19QUk9DRVNTRUQ7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJVbmtub3duIGNoYW5uZWxNYXBwaW5nVG9IYWwgY29udmVyc2lvbiAlZCIsIG1hcHBpbmcpOworICAgIH0KK30KKworc3RhdGljIGF1ZGlvX21pY3JvcGhvbmVfbG9jYXRpb25fdCBsb2NhdGlvblRvSGFsKEF1ZGlvTWljcm9waG9uZUxvY2F0aW9uIGxvY2F0aW9uKSB7CisgICAgc3dpdGNoIChsb2NhdGlvbikgeworICAgICAgICBjYXNlIEF1ZGlvTWljcm9waG9uZUxvY2F0aW9uOjpVTktOT1dOOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX01JQ1JPUEhPTkVfTE9DQVRJT05fVU5LTk9XTjsKKyAgICAgICAgY2FzZSBBdWRpb01pY3JvcGhvbmVMb2NhdGlvbjo6TUFJTkJPRFk6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fTUlDUk9QSE9ORV9MT0NBVElPTl9NQUlOQk9EWTsKKyAgICAgICAgY2FzZSBBdWRpb01pY3JvcGhvbmVMb2NhdGlvbjo6TUFJTkJPRFlfTU9WQUJMRToKKyAgICAgICAgICAgIHJldHVybiBBVURJT19NSUNST1BIT05FX0xPQ0FUSU9OX01BSU5CT0RZX01PVkFCTEU7CisgICAgICAgIGNhc2UgQXVkaW9NaWNyb3Bob25lTG9jYXRpb246OlBFUklQSEVSQUw6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fTUlDUk9QSE9ORV9MT0NBVElPTl9QRVJJUEhFUkFMOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiVW5rbm93biBsb2NhdGlvblRvSGFsIGNvbnZlcnNpb24gJWQiLCBsb2NhdGlvbik7CisgICAgfQorfQorc3RhdGljIGF1ZGlvX21pY3JvcGhvbmVfZGlyZWN0aW9uYWxpdHlfdCBkaXJlY3Rpb25hbGl0eVRvSGFsKEF1ZGlvTWljcm9waG9uZURpcmVjdGlvbmFsaXR5IGRpcikgeworICAgIHN3aXRjaCAoZGlyKSB7CisgICAgICAgIGNhc2UgQXVkaW9NaWNyb3Bob25lRGlyZWN0aW9uYWxpdHk6OlVOS05PV046CisgICAgICAgICAgICByZXR1cm4gQVVESU9fTUlDUk9QSE9ORV9ESVJFQ1RJT05BTElUWV9VTktOT1dOOworICAgICAgICBjYXNlIEF1ZGlvTWljcm9waG9uZURpcmVjdGlvbmFsaXR5OjpPTU5JOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX01JQ1JPUEhPTkVfRElSRUNUSU9OQUxJVFlfT01OSTsKKyAgICAgICAgY2FzZSBBdWRpb01pY3JvcGhvbmVEaXJlY3Rpb25hbGl0eTo6QklfRElSRUNUSU9OQUw6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fTUlDUk9QSE9ORV9ESVJFQ1RJT05BTElUWV9CSV9ESVJFQ1RJT05BTDsKKyAgICAgICAgY2FzZSBBdWRpb01pY3JvcGhvbmVEaXJlY3Rpb25hbGl0eTo6Q0FSRElPSUQ6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fTUlDUk9QSE9ORV9ESVJFQ1RJT05BTElUWV9DQVJESU9JRDsKKyAgICAgICAgY2FzZSBBdWRpb01pY3JvcGhvbmVEaXJlY3Rpb25hbGl0eTo6SFlQRVJfQ0FSRElPSUQ6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fTUlDUk9QSE9ORV9ESVJFQ1RJT05BTElUWV9IWVBFUl9DQVJESU9JRDsKKyAgICAgICAgY2FzZSBBdWRpb01pY3JvcGhvbmVEaXJlY3Rpb25hbGl0eTo6U1VQRVJfQ0FSRElPSUQ6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fTUlDUk9QSE9ORV9ESVJFQ1RJT05BTElUWV9TVVBFUl9DQVJESU9JRDsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIlVua25vd24gZGlyZWN0aW9uYWxpdHlUb0hhbCBjb252ZXJzaW9uICVkIiwgZGlyKTsKKyAgICB9Cit9CisKK3ZvaWQgbWljcm9waG9uZUluZm9Ub0hhbChjb25zdCBNaWNyb3Bob25lSW5mbyYgc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX21pY3JvcGhvbmVfY2hhcmFjdGVyaXN0aWNfdCAqcERzdCkgeworICAgIGlmIChwRHN0ICE9IE5VTEwpIHsKKyAgICAgICAgc25wcmludGYocERzdC0+ZGV2aWNlX2lkLCBzaXplb2YocERzdC0+ZGV2aWNlX2lkKSwKKyAgICAgICAgICAgICAgICAgIiVzIiwgc3JjLmRldmljZUlkLmNfc3RyKCkpOworICAgICAgICBwRHN0LT5kZXZpY2UgPSBzdGF0aWNfY2FzdDxhdWRpb19kZXZpY2VzX3Q+KHNyYy5kZXZpY2VBZGRyZXNzLmRldmljZSk7CisgICAgICAgIHNucHJpbnRmKHBEc3QtPmFkZHJlc3MsIHNpemVvZihwRHN0LT5hZGRyZXNzKSwKKyAgICAgICAgICAgICAgICAgIiVzIiwgZGV2aWNlQWRkcmVzc1RvSGFsKHNyYy5kZXZpY2VBZGRyZXNzKS5jX3N0cigpKTsKKyAgICAgICAgaWYgKHNyYy5jaGFubmVsTWFwcGluZy5zaXplKCkgPiBBVURJT19DSEFOTkVMX0NPVU5UX01BWCkgeworICAgICAgICAgICAgQUxPR1coIm1pY3JvcGhvbmVJbmZvVG9TdHJ1Y3QgZm91bmQgJXp1IGNoYW5uZWxNYXBwaW5nIGVsZW1lbnRzLiBNYXggZXhwZWN0ZWQgaXMgJWQiLAorICAgICAgICAgICAgICAgICAgc3JjLmNoYW5uZWxNYXBwaW5nLnNpemUoKSwgQVVESU9fQ0hBTk5FTF9DT1VOVF9NQVgpOworICAgICAgICB9CisgICAgICAgIHNpemVfdCBjaDsKKyAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgc3JjLmNoYW5uZWxNYXBwaW5nLnNpemUoKSAmJiBjaCA8IEFVRElPX0NIQU5ORUxfQ09VTlRfTUFYOyBjaCsrKSB7CisgICAgICAgICAgICBwRHN0LT5jaGFubmVsX21hcHBpbmdbY2hdID0gY2hhbm5lbE1hcHBpbmdUb0hhbChzcmMuY2hhbm5lbE1hcHBpbmdbY2hdKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKDsgY2ggPCBBVURJT19DSEFOTkVMX0NPVU5UX01BWDsgY2grKykgeworICAgICAgICAgICAgcERzdC0+Y2hhbm5lbF9tYXBwaW5nW2NoXSA9IEFVRElPX01JQ1JPUEhPTkVfQ0hBTk5FTF9NQVBQSU5HX1VOVVNFRDsKKyAgICAgICAgfQorICAgICAgICBwRHN0LT5sb2NhdGlvbiA9IGxvY2F0aW9uVG9IYWwoc3JjLmxvY2F0aW9uKTsKKyAgICAgICAgcERzdC0+Z3JvdXAgPSAoYXVkaW9fbWljcm9waG9uZV9ncm91cF90KXNyYy5ncm91cDsKKyAgICAgICAgcERzdC0+aW5kZXhfaW5fdGhlX2dyb3VwID0gKHVuc2lnbmVkIGludClzcmMuaW5kZXhJblRoZUdyb3VwOworICAgICAgICBwRHN0LT5zZW5zaXRpdml0eSA9IHNyYy5zZW5zaXRpdml0eTsKKyAgICAgICAgcERzdC0+bWF4X3NwbCA9IHNyYy5tYXhTcGw7CisgICAgICAgIHBEc3QtPm1pbl9zcGwgPSBzcmMubWluU3BsOworICAgICAgICBwRHN0LT5kaXJlY3Rpb25hbGl0eSA9IGRpcmVjdGlvbmFsaXR5VG9IYWwoc3JjLmRpcmVjdGlvbmFsaXR5KTsKKyAgICAgICAgcERzdC0+bnVtX2ZyZXF1ZW5jeV9yZXNwb25zZXMgPSAodW5zaWduZWQgaW50KXNyYy5mcmVxdWVuY3lSZXNwb25zZS5zaXplKCk7CisgICAgICAgIGlmIChwRHN0LT5udW1fZnJlcXVlbmN5X3Jlc3BvbnNlcyA+IEFVRElPX01JQ1JPUEhPTkVfTUFYX0ZSRVFVRU5DWV9SRVNQT05TRVMpIHsKKyAgICAgICAgICAgIEFMT0dXKCJtaWNyb3Bob25lSW5mb1RvU3RydWN0IGZvdW5kICVkIGZyZXF1ZW5jeSByZXNwb25zZXMuIE1heCBleHBlY3RlZCBpcyAlZCIsCisgICAgICAgICAgICAgICAgICBwRHN0LT5udW1fZnJlcXVlbmN5X3Jlc3BvbnNlcywgQVVESU9fTUlDUk9QSE9ORV9NQVhfRlJFUVVFTkNZX1JFU1BPTlNFUyk7CisgICAgICAgICAgICBwRHN0LT5udW1fZnJlcXVlbmN5X3Jlc3BvbnNlcyA9IEFVRElPX01JQ1JPUEhPTkVfTUFYX0ZSRVFVRU5DWV9SRVNQT05TRVM7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChzaXplX3QgayA9IDA7IGsgPCBwRHN0LT5udW1fZnJlcXVlbmN5X3Jlc3BvbnNlczsgaysrKSB7CisgICAgICAgICAgICBwRHN0LT5mcmVxdWVuY3lfcmVzcG9uc2VzWzBdW2tdID0gc3JjLmZyZXF1ZW5jeVJlc3BvbnNlW2tdLmZyZXF1ZW5jeTsKKyAgICAgICAgICAgIHBEc3QtPmZyZXF1ZW5jeV9yZXNwb25zZXNbMV1ba10gPSBzcmMuZnJlcXVlbmN5UmVzcG9uc2Vba10ubGV2ZWw7CisgICAgICAgIH0KKyAgICAgICAgcERzdC0+Z2VvbWV0cmljX2xvY2F0aW9uLnggPSBzcmMucG9zaXRpb24ueDsKKyAgICAgICAgcERzdC0+Z2VvbWV0cmljX2xvY2F0aW9uLnkgPSBzcmMucG9zaXRpb24ueTsKKyAgICAgICAgcERzdC0+Z2VvbWV0cmljX2xvY2F0aW9uLnogPSBzcmMucG9zaXRpb24uejsKKyAgICAgICAgcERzdC0+b3JpZW50YXRpb24ueCA9IHNyYy5vcmllbnRhdGlvbi54OworICAgICAgICBwRHN0LT5vcmllbnRhdGlvbi55ID0gc3JjLm9yaWVudGF0aW9uLnk7CisgICAgICAgIHBEc3QtPm9yaWVudGF0aW9uLnogPSBzcmMub3JpZW50YXRpb24uejsKKyAgICB9Cit9CisjZW5kaWYKKworfSAgLy8gbmFtZXNwYWNlIENQUF9WRVJTSU9OCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9Db252ZXJzaW9uSGVscGVySGlkbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9Db252ZXJzaW9uSGVscGVySGlkbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhOTMxOWYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0NvbnZlcnNpb25IZWxwZXJIaWRsLmgKQEAgLTAsMCArMSw5NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9DT05WRVJTSU9OX0hFTFBFUl9ISURMX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9DT05WRVJTSU9OX0hFTFBFUl9ISURMX0gKKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vMi4wL3R5cGVzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby80LjAvdHlwZXMuaD4KKyNpbmNsdWRlIDxoaWRsL0hpZGxTdXBwb3J0Lmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT046OlBhcmFtZXRlclZhbHVlOwordXNpbmcgQ29yZVJlc3VsdCA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjo6UmVzdWx0OworCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgQ1BQX1ZFUlNJT04geworCitjbGFzcyBDb252ZXJzaW9uSGVscGVySGlkbCB7CisgIHByb3RlY3RlZDoKKyAgICBzdGF0aWMgc3RhdHVzX3Qga2V5c0Zyb21IYWwoY29uc3QgU3RyaW5nOCYga2V5cywgaGlkbF92ZWM8aGlkbF9zdHJpbmc+ICpoaWRsS2V5cyk7CisgICAgc3RhdGljIHN0YXR1c190IHBhcmFtZXRlcnNGcm9tSGFsKGNvbnN0IFN0cmluZzgmIGt2UGFpcnMsIGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiAqaGlkbFBhcmFtcyk7CisgICAgc3RhdGljIHZvaWQgcGFyYW1ldGVyc1RvSGFsKGNvbnN0IGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiYgcGFyYW1ldGVycywgU3RyaW5nOCAqdmFsdWVzKTsKKworICAgIENvbnZlcnNpb25IZWxwZXJIaWRsKGNvbnN0IGNoYXIqIGNsYXNzTmFtZSk7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBSLCB0eXBlbmFtZSBUPgorICAgIHN0YXR1c190IHByb2Nlc3NSZXR1cm4oY29uc3QgY2hhciogZnVuY05hbWUsIGNvbnN0IFJldHVybjxSPiYgcmV0LCBUICpyZXR2YWwpIHsKKyAgICAgICAgaWYgKHJldC5pc09rKCkpIHsKKyAgICAgICAgICAgIC8vIFRoaXMgd2F5IGl0IGFsc28gd29ya3MgZm9yIGVudW0gY2xhc3MgdG8gdW5zY29wZWQgZW51bSBjb252ZXJzaW9uLgorICAgICAgICAgICAgKnJldHZhbCA9IHN0YXRpY19jYXN0PFQ+KHN0YXRpY19jYXN0PFI+KHJldCkpOworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CisgICAgICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKGZ1bmNOYW1lLCByZXQpOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgc3RhdHVzX3QgcHJvY2Vzc1JldHVybihjb25zdCBjaGFyKiBmdW5jTmFtZSwgY29uc3QgUmV0dXJuPFQ+JiByZXQpIHsKKyAgICAgICAgaWYgKCFyZXQuaXNPaygpKSB7CisgICAgICAgICAgICBlbWl0RXJyb3IoZnVuY05hbWUsIHJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXQuaXNPaygpID8gT0sgOiBGQUlMRURfVFJBTlNBQ1RJT047CisgICAgfQorCisgICAgc3RhdHVzX3QgcHJvY2Vzc1JldHVybihjb25zdCBjaGFyKiBmdW5jTmFtZSwgY29uc3QgUmV0dXJuPENvcmVSZXN1bHQ+JiByZXQpIHsKKyAgICAgICAgaWYgKCFyZXQuaXNPaygpKSB7CisgICAgICAgICAgICBlbWl0RXJyb3IoZnVuY05hbWUsIHJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXQuaXNPaygpID8gYW5hbHl6ZVJlc3VsdChyZXQpIDogRkFJTEVEX1RSQU5TQUNUSU9OOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgc3RhdHVzX3QgcHJvY2Vzc1JldHVybigKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZ1bmNOYW1lLCBjb25zdCBSZXR1cm48VD4mIHJldCwgQ29yZVJlc3VsdCByZXR2YWwpIHsKKyAgICAgICAgaWYgKCFyZXQuaXNPaygpKSB7CisgICAgICAgICAgICBlbWl0RXJyb3IoZnVuY05hbWUsIHJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXQuaXNPaygpID8gYW5hbHl6ZVJlc3VsdChyZXR2YWwpIDogRkFJTEVEX1RSQU5TQUNUSU9OOworICAgIH0KKworICBwcml2YXRlOgorICAgIGNvbnN0IGNoYXIqIG1DbGFzc05hbWU7CisKKyAgICBzdGF0aWMgc3RhdHVzX3QgYW5hbHl6ZVJlc3VsdChjb25zdCBDb3JlUmVzdWx0JiByZXN1bHQpOworCisgICAgdm9pZCBlbWl0RXJyb3IoY29uc3QgY2hhciogZnVuY05hbWUsIGNvbnN0IGNoYXIqIGRlc2NyaXB0aW9uKTsKK307CisKKyNpZiBNQUpPUl9WRVJTSU9OID09IDQKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjo6TWljcm9waG9uZUluZm87Cit2b2lkIG1pY3JvcGhvbmVJbmZvVG9IYWwoY29uc3QgTWljcm9waG9uZUluZm8mIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19taWNyb3Bob25lX2NoYXJhY3RlcmlzdGljX3QgKnBEc3QpOworI2VuZGlmCisKK30gIC8vIG5hbWVzcGFjZSBDUFBfVkVSU0lPTgorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfQ09OVkVSU0lPTl9IRUxQRVJfSElETF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZUhhbEhpZGwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VIYWxIaWRsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjNlMmViCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VIYWxIaWRsLmNwcApAQCAtMCwwICsxLDQwNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjZGVmaW5lIExPR19UQUcgIkRldmljZUhhbEhpZGwiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvLzIuMC9JUHJpbWFyeURldmljZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vNC4wL0lQcmltYXJ5RGV2aWNlLmg+CisjaW5jbHVkZSA8Y3V0aWxzL25hdGl2ZV9oYW5kbGUuaD4KKyNpbmNsdWRlIDxod2JpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8Y29tbW9uL2FsbC12ZXJzaW9ucy9WZXJzaW9uVXRpbHMuaD4KKworI2luY2x1ZGUgIkRldmljZUhhbEhpZGwuaCIKKyNpbmNsdWRlICJIaWRsVXRpbHMuaCIKKyNpbmNsdWRlICJTdHJlYW1IYWxIaWRsLmgiCisjaW5jbHVkZSAiVmVyc2lvblV0aWxzLmgiCisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OkNQUF9WRVJTSU9OOjpBdWRpb0NvbmZpZzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OkNQUF9WRVJTSU9OOjpBdWRpb0RldmljZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OkNQUF9WRVJTSU9OOjpBdWRpb0lucHV0RmxhZzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OkNQUF9WRVJTSU9OOjpBdWRpb091dHB1dEZsYWc7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpDUFBfVkVSU0lPTjo6QXVkaW9QYXRjaEhhbmRsZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OkNQUF9WRVJTSU9OOjpBdWRpb1BvcnQ7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpDUFBfVkVSU0lPTjo6QXVkaW9Qb3J0Q29uZmlnOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6Q1BQX1ZFUlNJT046OkF1ZGlvTW9kZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OkNQUF9WRVJTSU9OOjpBdWRpb1NvdXJjZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OkNQUF9WRVJTSU9OOjpIaWRsVXRpbHM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjp1dGlsczo6bWtFbnVtQ29udmVydGVyOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOjpEZXZpY2VBZGRyZXNzOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOjpJUHJpbWFyeURldmljZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjo6UGFyYW1ldGVyVmFsdWU7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT046OlJlc3VsdDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7CisKKyNpZiBNQUpPUl9WRVJTSU9OID09IDQKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjo6U2lua01ldGFkYXRhOworI2VuZGlmCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBDUFBfVkVSU0lPTiB7CisKK25hbWVzcGFjZSB7CisKK3N0YXR1c190IGRldmljZUFkZHJlc3NGcm9tSGFsKAorICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCBjb25zdCBjaGFyKiBoYWxBZGRyZXNzLCBEZXZpY2VBZGRyZXNzKiBhZGRyZXNzKSB7CisgICAgYWRkcmVzcy0+ZGV2aWNlID0gQXVkaW9EZXZpY2UoZGV2aWNlKTsKKworICAgIGlmIChoYWxBZGRyZXNzID09IG51bGxwdHIgfHwgc3RybmxlbihoYWxBZGRyZXNzLCBBVURJT19ERVZJQ0VfTUFYX0FERFJFU1NfTEVOKSA9PSAwKSB7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisgICAgY29uc3QgYm9vbCBpc0lucHV0ID0gKGRldmljZSAmIEFVRElPX0RFVklDRV9CSVRfSU4pICE9IDA7CisgICAgaWYgKGlzSW5wdXQpIGRldmljZSAmPSB+QVVESU9fREVWSUNFX0JJVF9JTjsKKyAgICBpZiAoKCFpc0lucHV0ICYmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX0FMTF9BMkRQKSAhPSAwKQorICAgICAgICAgICAgfHwgKGlzSW5wdXQgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9JTl9CTFVFVE9PVEhfQTJEUCkgIT0gMCkpIHsKKyAgICAgICAgaW50IHN0YXR1cyA9IHNzY2FuZihoYWxBZGRyZXNzLAorICAgICAgICAgICAgICAgICIlaGhYOiVoaFg6JWhoWDolaGhYOiVoaFg6JWhoWCIsCisgICAgICAgICAgICAgICAgJmFkZHJlc3MtPmFkZHJlc3MubWFjWzBdLCAmYWRkcmVzcy0+YWRkcmVzcy5tYWNbMV0sICZhZGRyZXNzLT5hZGRyZXNzLm1hY1syXSwKKyAgICAgICAgICAgICAgICAmYWRkcmVzcy0+YWRkcmVzcy5tYWNbM10sICZhZGRyZXNzLT5hZGRyZXNzLm1hY1s0XSwgJmFkZHJlc3MtPmFkZHJlc3MubWFjWzVdKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1cyA9PSA2ID8gT0sgOiBCQURfVkFMVUU7CisgICAgfSBlbHNlIGlmICgoIWlzSW5wdXQgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9PVVRfSVApICE9IDApCisgICAgICAgICAgICB8fCAoaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX0lOX0lQKSAhPSAwKSkgeworICAgICAgICBpbnQgc3RhdHVzID0gc3NjYW5mKGhhbEFkZHJlc3MsCisgICAgICAgICAgICAgICAgIiVoaHUuJWhodS4laGh1LiVoaHUiLAorICAgICAgICAgICAgICAgICZhZGRyZXNzLT5hZGRyZXNzLmlwdjRbMF0sICZhZGRyZXNzLT5hZGRyZXNzLmlwdjRbMV0sCisgICAgICAgICAgICAgICAgJmFkZHJlc3MtPmFkZHJlc3MuaXB2NFsyXSwgJmFkZHJlc3MtPmFkZHJlc3MuaXB2NFszXSk7CisgICAgICAgIHJldHVybiBzdGF0dXMgPT0gNCA/IE9LIDogQkFEX1ZBTFVFOworICAgIH0gZWxzZSBpZiAoKCFpc0lucHV0ICYmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX0FMTF9VU0IpKSAhPSAwCisgICAgICAgICAgICB8fCAoaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX0lOX0FMTF9VU0IpKSAhPSAwKSB7CisgICAgICAgIGludCBzdGF0dXMgPSBzc2NhbmYoaGFsQWRkcmVzcywKKyAgICAgICAgICAgICAgICAiY2FyZD0lZDtkZXZpY2U9JWQiLAorICAgICAgICAgICAgICAgICZhZGRyZXNzLT5hZGRyZXNzLmFsc2EuY2FyZCwgJmFkZHJlc3MtPmFkZHJlc3MuYWxzYS5kZXZpY2UpOworICAgICAgICByZXR1cm4gc3RhdHVzID09IDIgPyBPSyA6IEJBRF9WQUxVRTsKKyAgICB9IGVsc2UgaWYgKCghaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9CVVMpICE9IDApCisgICAgICAgICAgICB8fCAoaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX0lOX0JVUykgIT0gMCkpIHsKKyAgICAgICAgaWYgKGhhbEFkZHJlc3MgIT0gTlVMTCkgeworICAgICAgICAgICAgYWRkcmVzcy0+YnVzQWRkcmVzcyA9IGhhbEFkZHJlc3M7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9IGVsc2UgaWYgKCghaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYKSkgIT0gMAorICAgICAgICAgICAgfHwgKGlzSW5wdXQgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYKSAhPSAwKSkgeworICAgICAgICBpZiAoaGFsQWRkcmVzcyAhPSBOVUxMKSB7CisgICAgICAgICAgICBhZGRyZXNzLT5yU3VibWl4QWRkcmVzcyA9IGhhbEFkZHJlc3M7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworRGV2aWNlSGFsSGlkbDo6RGV2aWNlSGFsSGlkbChjb25zdCBzcDxJRGV2aWNlPiYgZGV2aWNlKQorICAgICAgICA6IENvbnZlcnNpb25IZWxwZXJIaWRsKCJEZXZpY2UiKSwgbURldmljZShkZXZpY2UpLAorICAgICAgICAgIG1QcmltYXJ5RGV2aWNlKElQcmltYXJ5RGV2aWNlOjpjYXN0RnJvbShkZXZpY2UpKSB7Cit9CisKK0RldmljZUhhbEhpZGw6On5EZXZpY2VIYWxIaWRsKCkgeworICAgIGlmIChtRGV2aWNlICE9IDApIHsKKyAgICAgICAgbURldmljZS5jbGVhcigpOworICAgICAgICBoYXJkd2FyZTo6SVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOworICAgIH0KK30KKworc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0U3VwcG9ydGVkRGV2aWNlcyh1aW50MzJfdCopIHsKKyAgICAvLyBPYnNvbGV0ZS4KKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisKK3N0YXR1c190IERldmljZUhhbEhpZGw6OmluaXRDaGVjaygpIHsKKyAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiaW5pdENoZWNrIiwgbURldmljZS0+aW5pdENoZWNrKCkpOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUpIHsKKyAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBpZiAobVByaW1hcnlEZXZpY2UgPT0gMCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRWb2ljZVZvbHVtZSIsIG1QcmltYXJ5RGV2aWNlLT5zZXRWb2ljZVZvbHVtZSh2b2x1bWUpKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c2V0TWFzdGVyVm9sdW1lKGZsb2F0IHZvbHVtZSkgeworICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOworICAgIGlmIChtUHJpbWFyeURldmljZSA9PSAwKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldE1hc3RlclZvbHVtZSIsIG1QcmltYXJ5RGV2aWNlLT5zZXRNYXN0ZXJWb2x1bWUodm9sdW1lKSk7Cit9CisKK3N0YXR1c190IERldmljZUhhbEhpZGw6OmdldE1hc3RlclZvbHVtZShmbG9hdCAqdm9sdW1lKSB7CisgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgaWYgKG1QcmltYXJ5RGV2aWNlID09IDApIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICBSZXN1bHQgcmV0dmFsOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtUHJpbWFyeURldmljZS0+Z2V0TWFzdGVyVm9sdW1lKAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBmbG9hdCB2KSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgKnZvbHVtZSA9IHY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldE1hc3RlclZvbHVtZSIsIHJldCwgcmV0dmFsKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c2V0TW9kZShhdWRpb19tb2RlX3QgbW9kZSkgeworICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOworICAgIGlmIChtUHJpbWFyeURldmljZSA9PSAwKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldE1vZGUiLCBtUHJpbWFyeURldmljZS0+c2V0TW9kZShBdWRpb01vZGUobW9kZSkpKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c2V0TWljTXV0ZShib29sIHN0YXRlKSB7CisgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldE1pY011dGUiLCBtRGV2aWNlLT5zZXRNaWNNdXRlKHN0YXRlKSk7Cit9CisKK3N0YXR1c190IERldmljZUhhbEhpZGw6OmdldE1pY011dGUoYm9vbCAqc3RhdGUpIHsKKyAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBSZXN1bHQgcmV0dmFsOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlLT5nZXRNaWNNdXRlKAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBib29sIG11dGUpIHsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgICAgICAqc3RhdGUgPSBtdXRlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRNaWNNdXRlIiwgcmV0LCByZXR2YWwpOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpzZXRNYXN0ZXJNdXRlKGJvb2wgc3RhdGUpIHsKKyAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0TWFzdGVyTXV0ZSIsIG1EZXZpY2UtPnNldE1hc3Rlck11dGUoc3RhdGUpKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0TWFzdGVyTXV0ZShib29sICpzdGF0ZSkgeworICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOworICAgIFJlc3VsdCByZXR2YWw7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPmdldE1hc3Rlck11dGUoCisgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGJvb2wgbXV0ZSkgeworICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgICpzdGF0ZSA9IG11dGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldE1hc3Rlck11dGUiLCByZXQsIHJldHZhbCk7Cit9CisKK3N0YXR1c190IERldmljZUhhbEhpZGw6OnNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycykgeworICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOworICAgIGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiBoaWRsUGFyYW1zOworICAgIHN0YXR1c190IHN0YXR1cyA9IHBhcmFtZXRlcnNGcm9tSGFsKGt2UGFpcnMsICZoaWRsUGFyYW1zKTsKKyAgICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOworICAgIC8vIFRPRE86IGNoYW5nZSB0aGUgQVBJIHNvIHRoYXQgY29udGV4dCBhbmQga3ZQYWlycyBhcmUgc2VwYXJhdGVkCisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldFBhcmFtZXRlcnMiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHV0aWxzOjpzZXRQYXJhbWV0ZXJzKG1EZXZpY2UsIHt9IC8qIGNvbnRleHQgKi8sIGhpZGxQYXJhbXMpKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzLCBTdHJpbmc4ICp2YWx1ZXMpIHsKKyAgICB2YWx1ZXMtPmNsZWFyKCk7CisgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgaGlkbF92ZWM8aGlkbF9zdHJpbmc+IGhpZGxLZXlzOworICAgIHN0YXR1c190IHN0YXR1cyA9IGtleXNGcm9tSGFsKGtleXMsICZoaWRsS2V5cyk7CisgICAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKKyAgICBSZXN1bHQgcmV0dmFsOworICAgIFJldHVybjx2b2lkPiByZXQgPSB1dGlsczo6Z2V0UGFyYW1ldGVycyhtRGV2aWNlLAorICAgICAgICAgICAge30gLyogY29udGV4dCAqLywKKyAgICAgICAgICAgIGhpZGxLZXlzLAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4mIHBhcmFtZXRlcnMpIHsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzVG9IYWwocGFyYW1ldGVycywgdmFsdWVzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0UGFyYW1ldGVycyIsIHJldCwgcmV0dmFsKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0SW5wdXRCdWZmZXJTaXplKAorICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsIHNpemVfdCAqc2l6ZSkgeworICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOworICAgIEF1ZGlvQ29uZmlnIGhpZGxDb25maWc7CisgICAgSGlkbFV0aWxzOjphdWRpb0NvbmZpZ0Zyb21IYWwoKmNvbmZpZywgJmhpZGxDb25maWcpOworICAgIFJlc3VsdCByZXR2YWw7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPmdldElucHV0QnVmZmVyU2l6ZSgKKyAgICAgICAgICAgIGhpZGxDb25maWcsCisgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIHVpbnQ2NF90IGJ1ZmZlclNpemUpIHsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHN0YXRpY19jYXN0PHNpemVfdD4oYnVmZmVyU2l6ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldElucHV0QnVmZmVyU2l6ZSIsIHJldCwgcmV0dmFsKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6b3Blbk91dHB1dFN0cmVhbSgKKyAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAorICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKKyAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgIHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKKyAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcywKKyAgICAgICAgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlPiAqb3V0U3RyZWFtKSB7CisgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgRGV2aWNlQWRkcmVzcyBoaWRsRGV2aWNlOworICAgIHN0YXR1c190IHN0YXR1cyA9IGRldmljZUFkZHJlc3NGcm9tSGFsKGRldmljZXMsIGFkZHJlc3MsICZoaWRsRGV2aWNlKTsKKyAgICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOworICAgIEF1ZGlvQ29uZmlnIGhpZGxDb25maWc7CisgICAgSGlkbFV0aWxzOjphdWRpb0NvbmZpZ0Zyb21IYWwoKmNvbmZpZywgJmhpZGxDb25maWcpOworICAgIFJlc3VsdCByZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+b3Blbk91dHB1dFN0cmVhbSgKKyAgICAgICAgICAgIGhhbmRsZSwKKyAgICAgICAgICAgIGhpZGxEZXZpY2UsCisgICAgICAgICAgICBoaWRsQ29uZmlnLAorICAgICAgICAgICAgbWtFbnVtQ29udmVydGVyPEF1ZGlvT3V0cHV0RmxhZz4oZmxhZ3MpLAorI2lmIE1BSk9SX1ZFUlNJT04gPT0gNAorICAgICAgICAgICAge30gLyogbWV0YWRhdGEgKi8sCisjZW5kaWYKKyAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3Qgc3A8SVN0cmVhbU91dD4mIHJlc3VsdCwgY29uc3QgQXVkaW9Db25maWcmIHN1Z2dlc3RlZENvbmZpZykgeworICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgICpvdXRTdHJlYW0gPSBuZXcgU3RyZWFtT3V0SGFsSGlkbChyZXN1bHQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBIaWRsVXRpbHM6OmF1ZGlvQ29uZmlnVG9IYWwoc3VnZ2VzdGVkQ29uZmlnLCBjb25maWcpOworICAgICAgICAgICAgfSk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oIm9wZW5PdXRwdXRTdHJlYW0iLCByZXQsIHJldHZhbCk7Cit9CisKK3N0YXR1c190IERldmljZUhhbEhpZGw6Om9wZW5JbnB1dFN0cmVhbSgKKyAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAorICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKKyAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAorICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzLAorICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCisgICAgICAgIHNwPFN0cmVhbUluSGFsSW50ZXJmYWNlPiAqaW5TdHJlYW0pIHsKKyAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBEZXZpY2VBZGRyZXNzIGhpZGxEZXZpY2U7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGV2aWNlQWRkcmVzc0Zyb21IYWwoZGV2aWNlcywgYWRkcmVzcywgJmhpZGxEZXZpY2UpOworICAgIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7CisgICAgQXVkaW9Db25maWcgaGlkbENvbmZpZzsKKyAgICBIaWRsVXRpbHM6OmF1ZGlvQ29uZmlnRnJvbUhhbCgqY29uZmlnLCAmaGlkbENvbmZpZyk7CisgICAgUmVzdWx0IHJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOworI2lmIE1BSk9SX1ZFUlNJT04gPT0gMgorICAgIGF1dG8gc291cmNlTWV0YWRhdGEgPSBBdWRpb1NvdXJjZShzb3VyY2UpOworI2VsaWYgTUFKT1JfVkVSU0lPTiA9PSA0CisgICAgLy8gVE9ETzogY29ycmVjdGx5IHByb3BhZ2F0ZSB0aGUgdHJhY2tzIHNvdXJjZXMgYW5kIHZvbHVtZQorICAgIC8vICAgICAgIGZvciBub3csIG9ubHkgc2VuZCB0aGUgbWFpbiBzb3VyY2UgYXQgMWRiZnMKKyAgICBTaW5rTWV0YWRhdGEgc291cmNlTWV0YWRhdGEgPSB7e3tBdWRpb1NvdXJjZShzb3VyY2UpLCAxfX19OworI2VuZGlmCisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPm9wZW5JbnB1dFN0cmVhbSgKKyAgICAgICAgICAgIGhhbmRsZSwKKyAgICAgICAgICAgIGhpZGxEZXZpY2UsCisgICAgICAgICAgICBoaWRsQ29uZmlnLAorICAgICAgICAgICAgbWtFbnVtQ29udmVydGVyPEF1ZGlvSW5wdXRGbGFnPihmbGFncyksCisgICAgICAgICAgICBzb3VyY2VNZXRhZGF0YSwKKyAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3Qgc3A8SVN0cmVhbUluPiYgcmVzdWx0LCBjb25zdCBBdWRpb0NvbmZpZyYgc3VnZ2VzdGVkQ29uZmlnKSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgKmluU3RyZWFtID0gbmV3IFN0cmVhbUluSGFsSGlkbChyZXN1bHQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBIaWRsVXRpbHM6OmF1ZGlvQ29uZmlnVG9IYWwoc3VnZ2VzdGVkQ29uZmlnLCBjb25maWcpOworICAgICAgICAgICAgfSk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oIm9wZW5JbnB1dFN0cmVhbSIsIHJldCwgcmV0dmFsKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c3VwcG9ydHNBdWRpb1BhdGNoZXMoYm9vbCAqc3VwcG9ydHNQYXRjaGVzKSB7CisgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInN1cHBvcnRzQXVkaW9QYXRjaGVzIiwgbURldmljZS0+c3VwcG9ydHNBdWRpb1BhdGNoZXMoKSwgc3VwcG9ydHNQYXRjaGVzKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Y3JlYXRlQXVkaW9QYXRjaCgKKyAgICAgICAgdW5zaWduZWQgaW50IG51bV9zb3VyY2VzLAorICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNvdXJjZXMsCisgICAgICAgIHVuc2lnbmVkIGludCBudW1fc2lua3MsCisgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc2lua3MsCisgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaCkgeworICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOworICAgIGhpZGxfdmVjPEF1ZGlvUG9ydENvbmZpZz4gaGlkbFNvdXJjZXMsIGhpZGxTaW5rczsKKyAgICBIaWRsVXRpbHM6OmF1ZGlvUG9ydENvbmZpZ3NGcm9tSGFsKG51bV9zb3VyY2VzLCBzb3VyY2VzLCAmaGlkbFNvdXJjZXMpOworICAgIEhpZGxVdGlsczo6YXVkaW9Qb3J0Q29uZmlnc0Zyb21IYWwobnVtX3NpbmtzLCBzaW5rcywgJmhpZGxTaW5rcyk7CisgICAgUmVzdWx0IHJldHZhbDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+Y3JlYXRlQXVkaW9QYXRjaCgKKyAgICAgICAgICAgIGhpZGxTb3VyY2VzLCBoaWRsU2lua3MsCisgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIEF1ZGlvUGF0Y2hIYW5kbGUgaGlkbFBhdGNoKSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgKnBhdGNoID0gc3RhdGljX2Nhc3Q8YXVkaW9fcGF0Y2hfaGFuZGxlX3Q+KGhpZGxQYXRjaCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImNyZWF0ZUF1ZGlvUGF0Y2giLCByZXQsIHJldHZhbCk7Cit9CisKK3N0YXR1c190IERldmljZUhhbEhpZGw6OnJlbGVhc2VBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoKSB7CisgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInJlbGVhc2VBdWRpb1BhdGNoIiwgbURldmljZS0+cmVsZWFzZUF1ZGlvUGF0Y2gocGF0Y2gpKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KSB7CisgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgQXVkaW9Qb3J0IGhpZGxQb3J0OworICAgIEhpZGxVdGlsczo6YXVkaW9Qb3J0RnJvbUhhbCgqcG9ydCwgJmhpZGxQb3J0KTsKKyAgICBSZXN1bHQgcmV0dmFsOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlLT5nZXRBdWRpb1BvcnQoCisgICAgICAgICAgICBoaWRsUG9ydCwKKyAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3QgQXVkaW9Qb3J0JiBwKSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgSGlkbFV0aWxzOjphdWRpb1BvcnRUb0hhbChwLCBwb3J0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0QXVkaW9Qb3J0IiwgcmV0LCByZXR2YWwpOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpzZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpIHsKKyAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBBdWRpb1BvcnRDb25maWcgaGlkbENvbmZpZzsKKyAgICBIaWRsVXRpbHM6OmF1ZGlvUG9ydENvbmZpZ0Zyb21IYWwoKmNvbmZpZywgJmhpZGxDb25maWcpOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRBdWRpb1BvcnRDb25maWciLCBtRGV2aWNlLT5zZXRBdWRpb1BvcnRDb25maWcoaGlkbENvbmZpZykpOworfQorCisjaWYgTUFKT1JfVkVSU0lPTiA9PSAyCitzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpnZXRNaWNyb3Bob25lcygKKyAgICAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXNJbmZvIF9fdW51c2VkKSB7CisgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorI2VsaWYgTUFKT1JfVkVSU0lPTiA9PSA0CitzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpnZXRNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lc0luZm8pIHsKKyAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBSZXN1bHQgcmV0dmFsOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlLT5nZXRNaWNyb3Bob25lcygKKyAgICAgICAgICAgIFsmXShSZXN1bHQgciwgaGlkbF92ZWM8TWljcm9waG9uZUluZm8+IG1pY0FycmF5SGFsKSB7CisgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgIGZvciAoc2l6ZV90IGsgPSAwOyBrIDwgbWljQXJyYXlIYWwuc2l6ZSgpOyBrKyspIHsKKyAgICAgICAgICAgIGF1ZGlvX21pY3JvcGhvbmVfY2hhcmFjdGVyaXN0aWNfdCBkc3Q7CisgICAgICAgICAgICAvL2NvbnZlcnQKKyAgICAgICAgICAgIG1pY3JvcGhvbmVJbmZvVG9IYWwobWljQXJyYXlIYWxba10sICZkc3QpOworICAgICAgICAgICAgbWVkaWE6Ok1pY3JvcGhvbmVJbmZvIG1pY3JvcGhvbmUgPSBtZWRpYTo6TWljcm9waG9uZUluZm8oZHN0KTsKKyAgICAgICAgICAgIG1pY3JvcGhvbmVzSW5mby0+cHVzaF9iYWNrKG1pY3JvcGhvbmUpOworICAgICAgICB9CisgICAgfSk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldE1pY3JvcGhvbmVzIiwgcmV0LCByZXR2YWwpOworfQorI2VuZGlmCisKK3N0YXR1c190IERldmljZUhhbEhpZGw6OmR1bXAoaW50IGZkKSB7CisgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgbmF0aXZlX2hhbmRsZV90KiBoaWRsSGFuZGxlID0gbmF0aXZlX2hhbmRsZV9jcmVhdGUoMSwgMCk7CisgICAgaGlkbEhhbmRsZS0+ZGF0YVswXSA9IGZkOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlLT5kZWJ1ZyhoaWRsSGFuZGxlLCB7fSAvKiBvcHRpb25zICovKTsKKyAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShoaWRsSGFuZGxlKTsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZHVtcCIsIHJldCk7Cit9CisKK30gLy8gbmFtZXNwYWNlIENQUF9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZUhhbEhpZGwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlSGFsSGlkbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiNWU3ZTcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZUhhbEhpZGwuaApAQCAtMCwwICsxLDEzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VfSEFMX0hJRExfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0RFVklDRV9IQUxfSElETF9ICisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvLzIuMC9JRGV2aWNlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby80LjAvSURldmljZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vMi4wL0lQcmltYXJ5RGV2aWNlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby80LjAvSVByaW1hcnlEZXZpY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9EZXZpY2VIYWxJbnRlcmZhY2UuaD4KKworI2luY2x1ZGUgIkNvbnZlcnNpb25IZWxwZXJIaWRsLmgiCisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjo6SURldmljZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjo6SVByaW1hcnlEZXZpY2U7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBDUFBfVkVSU0lPTiB7CisKK2NsYXNzIERldmljZUhhbEhpZGwgOiBwdWJsaWMgRGV2aWNlSGFsSW50ZXJmYWNlLCBwdWJsaWMgQ29udmVyc2lvbkhlbHBlckhpZGwKK3sKKyAgcHVibGljOgorICAgIC8vIFNldHMgdGhlIHZhbHVlIG9mICdkZXZpY2VzJyB0byBhIGJpdG1hc2sgb2YgMSBvciBtb3JlIHZhbHVlcyBvZiBhdWRpb19kZXZpY2VzX3QuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTdXBwb3J0ZWREZXZpY2VzKHVpbnQzMl90ICpkZXZpY2VzKTsKKworICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgYXVkaW8gaGFyZHdhcmUgaW50ZXJmYWNlIGhhcyBiZWVuIGluaXRpYWxpemVkLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCk7CisKKyAgICAvLyBTZXQgdGhlIGF1ZGlvIHZvbHVtZSBvZiBhIHZvaWNlIGNhbGwuIFJhbmdlIGlzIGJldHdlZW4gMC4wIGFuZCAxLjAuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUpOworCisgICAgLy8gU2V0IHRoZSBhdWRpbyB2b2x1bWUgZm9yIGFsbCBhdWRpbyBhY3Rpdml0aWVzIG90aGVyIHRoYW4gdm9pY2UgY2FsbC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1hc3RlclZvbHVtZShmbG9hdCB2b2x1bWUpOworCisgICAgLy8gR2V0IHRoZSBjdXJyZW50IG1hc3RlciB2b2x1bWUgdmFsdWUgZm9yIHRoZSBIQUwuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNYXN0ZXJWb2x1bWUoZmxvYXQgKnZvbHVtZSk7CisKKyAgICAvLyBDYWxsZWQgd2hlbiB0aGUgYXVkaW8gbW9kZSBjaGFuZ2VzLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TW9kZShhdWRpb19tb2RlX3QgbW9kZSk7CisKKyAgICAvLyBNdXRpbmcgY29udHJvbC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1pY011dGUoYm9vbCBzdGF0ZSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNaWNNdXRlKGJvb2wgKnN0YXRlKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1hc3Rlck11dGUoYm9vbCBzdGF0ZSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNYXN0ZXJNdXRlKGJvb2wgKnN0YXRlKTsKKworICAgIC8vIFNldCBnbG9iYWwgYXVkaW8gcGFyYW1ldGVycy4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycyk7CisKKyAgICAvLyBHZXQgZ2xvYmFsIGF1ZGlvIHBhcmFtZXRlcnMuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMsIFN0cmluZzggKnZhbHVlcyk7CisKKyAgICAvLyBSZXR1cm5zIGF1ZGlvIGlucHV0IGJ1ZmZlciBzaXplIGFjY29yZGluZyB0byBwYXJhbWV0ZXJzIHBhc3NlZC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldElucHV0QnVmZmVyU2l6ZShjb25zdCBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCisgICAgICAgICAgICBzaXplX3QgKnNpemUpOworCisgICAgLy8gQ3JlYXRlcyBhbmQgb3BlbnMgdGhlIGF1ZGlvIGhhcmR3YXJlIG91dHB1dCBzdHJlYW0uIFRoZSBzdHJlYW0gaXMgY2xvc2VkCisgICAgLy8gYnkgcmVsZWFzaW5nIGFsbCByZWZlcmVuY2VzIHRvIHRoZSByZXR1cm5lZCBvYmplY3QuCisgICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuT3V0cHV0U3RyZWFtKAorICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAorICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMsCisgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgIHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCisgICAgICAgICAgICBzcDxTdHJlYW1PdXRIYWxJbnRlcmZhY2U+ICpvdXRTdHJlYW0pOworCisgICAgLy8gQ3JlYXRlcyBhbmQgb3BlbnMgdGhlIGF1ZGlvIGhhcmR3YXJlIGlucHV0IHN0cmVhbS4gVGhlIHN0cmVhbSBpcyBjbG9zZWQKKyAgICAvLyBieSByZWxlYXNpbmcgYWxsIHJlZmVyZW5jZXMgdG8gdGhlIHJldHVybmVkIG9iamVjdC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5JbnB1dFN0cmVhbSgKKyAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSwKKyAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzLAorICAgICAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAorICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCisgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCisgICAgICAgICAgICBzcDxTdHJlYW1JbkhhbEludGVyZmFjZT4gKmluU3RyZWFtKTsKKworICAgIC8vIFJldHVybnMgd2hldGhlciBjcmVhdGVBdWRpb1BhdGNoIGFuZCByZWxlYXNlQXVkaW9QYXRjaCBvcGVyYXRpb25zIGFyZSBzdXBwb3J0ZWQuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdXBwb3J0c0F1ZGlvUGF0Y2hlcyhib29sICpzdXBwb3J0c1BhdGNoZXMpOworCisgICAgLy8gQ3JlYXRlcyBhbiBhdWRpbyBwYXRjaCBiZXR3ZWVuIHNldmVyYWwgc291cmNlIGFuZCBzaW5rIHBvcnRzLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlQXVkaW9QYXRjaCgKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBudW1fc291cmNlcywKKyAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc291cmNlcywKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBudW1fc2lua3MsCisgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNpbmtzLAorICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoKTsKKworICAgIC8vIFJlbGVhc2VzIGFuIGF1ZGlvIHBhdGNoLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2gpOworCisgICAgLy8gRmlsbHMgdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIGF0dHJpYnV0ZXMgZm9yIGEgZ2l2ZW4gYXVkaW8gcG9ydC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEF1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCk7CisKKyAgICAvLyBTZXQgYXVkaW8gcG9ydCBjb25maWd1cmF0aW9uLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKTsKKworICAgIC8vIExpc3QgbWljcm9waG9uZXMKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1pY3JvcGhvbmVzKHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4gKm1pY3JvcGhvbmVzKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQpOworCisgIHByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIERldmljZXNGYWN0b3J5SGFsSGlkbDsKKyAgICBzcDxJRGV2aWNlPiBtRGV2aWNlOworICAgIHNwPElQcmltYXJ5RGV2aWNlPiBtUHJpbWFyeURldmljZTsgIC8vIE51bGwgaWYgaXQncyBub3QgYSBwcmltYXJ5IGRldmljZS4KKworICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KKyAgICBleHBsaWNpdCBEZXZpY2VIYWxIaWRsKGNvbnN0IHNwPElEZXZpY2U+JiBkZXZpY2UpOworCisgICAgLy8gVGhlIGRlc3RydWN0b3IgYXV0b21hdGljYWxseSBjbG9zZXMgdGhlIGRldmljZS4KKyAgICB2aXJ0dWFsIH5EZXZpY2VIYWxIaWRsKCk7Cit9OworCit9IC8vIG5hbWVzcGFjZSBDUFBfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VfSEFMX0hJRExfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VIYWxMb2NhbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZUhhbExvY2FsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGUyNmY1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VIYWxMb2NhbC5jcHAKQEAgLTAsMCArMSwyMjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkRldmljZUhhbExvY2FsIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJEZXZpY2VIYWxMb2NhbC5oIgorI2luY2x1ZGUgIlN0cmVhbUhhbExvY2FsLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBDUFBfVkVSU0lPTiB7CisKK0RldmljZUhhbExvY2FsOjpEZXZpY2VIYWxMb2NhbChhdWRpb19od19kZXZpY2VfdCAqZGV2KQorICAgICAgICA6IG1EZXYoZGV2KSB7Cit9CisKK0RldmljZUhhbExvY2FsOjp+RGV2aWNlSGFsTG9jYWwoKSB7CisgICAgaW50IHN0YXR1cyA9IGF1ZGlvX2h3X2RldmljZV9jbG9zZShtRGV2KTsKKyAgICBBTE9HV19JRihzdGF0dXMsICJFcnJvciBjbG9zaW5nIGF1ZGlvIGh3IGRldmljZSAlcDogJXMiLCBtRGV2LCBzdHJlcnJvcigtc3RhdHVzKSk7CisgICAgbURldiA9IDA7Cit9CisKK3N0YXR1c190IERldmljZUhhbExvY2FsOjpnZXRTdXBwb3J0ZWREZXZpY2VzKHVpbnQzMl90ICpkZXZpY2VzKSB7CisgICAgaWYgKG1EZXYtPmdldF9zdXBwb3J0ZWRfZGV2aWNlcyA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgKmRldmljZXMgPSBtRGV2LT5nZXRfc3VwcG9ydGVkX2RldmljZXMobURldik7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6aW5pdENoZWNrKCkgeworICAgIHJldHVybiBtRGV2LT5pbml0X2NoZWNrKG1EZXYpOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6c2V0Vm9pY2VWb2x1bWUoZmxvYXQgdm9sdW1lKSB7CisgICAgcmV0dXJuIG1EZXYtPnNldF92b2ljZV92b2x1bWUobURldiwgdm9sdW1lKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OnNldE1hc3RlclZvbHVtZShmbG9hdCB2b2x1bWUpIHsKKyAgICBpZiAobURldi0+c2V0X21hc3Rlcl92b2x1bWUgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBtRGV2LT5zZXRfbWFzdGVyX3ZvbHVtZShtRGV2LCB2b2x1bWUpOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6Z2V0TWFzdGVyVm9sdW1lKGZsb2F0ICp2b2x1bWUpIHsKKyAgICBpZiAobURldi0+Z2V0X21hc3Rlcl92b2x1bWUgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBtRGV2LT5nZXRfbWFzdGVyX3ZvbHVtZShtRGV2LCB2b2x1bWUpOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6c2V0TW9kZShhdWRpb19tb2RlX3QgbW9kZSkgeworICAgIHJldHVybiBtRGV2LT5zZXRfbW9kZShtRGV2LCBtb2RlKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OnNldE1pY011dGUoYm9vbCBzdGF0ZSkgeworICAgIHJldHVybiBtRGV2LT5zZXRfbWljX211dGUobURldiwgc3RhdGUpOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6Z2V0TWljTXV0ZShib29sICpzdGF0ZSkgeworICAgIHJldHVybiBtRGV2LT5nZXRfbWljX211dGUobURldiwgc3RhdGUpOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6c2V0TWFzdGVyTXV0ZShib29sIHN0YXRlKSB7CisgICAgaWYgKG1EZXYtPnNldF9tYXN0ZXJfbXV0ZSA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIG1EZXYtPnNldF9tYXN0ZXJfbXV0ZShtRGV2LCBzdGF0ZSk7Cit9CisKK3N0YXR1c190IERldmljZUhhbExvY2FsOjpnZXRNYXN0ZXJNdXRlKGJvb2wgKnN0YXRlKSB7CisgICAgaWYgKG1EZXYtPmdldF9tYXN0ZXJfbXV0ZSA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIG1EZXYtPmdldF9tYXN0ZXJfbXV0ZShtRGV2LCBzdGF0ZSk7Cit9CisKK3N0YXR1c190IERldmljZUhhbExvY2FsOjpzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGt2UGFpcnMpIHsKKyAgICByZXR1cm4gbURldi0+c2V0X3BhcmFtZXRlcnMobURldiwga3ZQYWlycy5zdHJpbmcoKSk7Cit9CisKK3N0YXR1c190IERldmljZUhhbExvY2FsOjpnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMsIFN0cmluZzggKnZhbHVlcykgeworICAgIGNoYXIgKmhhbFZhbHVlcyA9IG1EZXYtPmdldF9wYXJhbWV0ZXJzKG1EZXYsIGtleXMuc3RyaW5nKCkpOworICAgIGlmIChoYWxWYWx1ZXMgIT0gTlVMTCkgeworICAgICAgICB2YWx1ZXMtPnNldFRvKGhhbFZhbHVlcyk7CisgICAgICAgIGZyZWUoaGFsVmFsdWVzKTsKKyAgICB9IGVsc2UgeworICAgICAgICB2YWx1ZXMtPmNsZWFyKCk7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmdldElucHV0QnVmZmVyU2l6ZSgKKyAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLCBzaXplX3QgKnNpemUpIHsKKyAgICAqc2l6ZSA9IG1EZXYtPmdldF9pbnB1dF9idWZmZXJfc2l6ZShtRGV2LCBjb25maWcpOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6Om9wZW5PdXRwdXRTdHJlYW0oCisgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSwKKyAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMsCisgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCisgICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCisgICAgICAgIHNwPFN0cmVhbU91dEhhbEludGVyZmFjZT4gKm91dFN0cmVhbSkgeworICAgIGF1ZGlvX3N0cmVhbV9vdXRfdCAqaGFsU3RyZWFtOworICAgIEFMT0dWKCJvcGVuX291dHB1dF9zdHJlYW0gaGFuZGxlOiAlZCBkZXZpY2VzOiAleCBmbGFnczogJSN4IgorICAgICAgICAgICAgInNyYXRlOiAlZCBmb3JtYXQgJSN4IGNoYW5uZWxzICV4IGFkZHJlc3MgJXMiLAorICAgICAgICAgICAgaGFuZGxlLCBkZXZpY2VzLCBmbGFncywKKyAgICAgICAgICAgIGNvbmZpZy0+c2FtcGxlX3JhdGUsIGNvbmZpZy0+Zm9ybWF0LCBjb25maWctPmNoYW5uZWxfbWFzaywKKyAgICAgICAgICAgIGFkZHJlc3MpOworICAgIGludCBvcGVuUmVzdXQgPSBtRGV2LT5vcGVuX291dHB1dF9zdHJlYW0oCisgICAgICAgICAgICBtRGV2LCBoYW5kbGUsIGRldmljZXMsIGZsYWdzLCBjb25maWcsICZoYWxTdHJlYW0sIGFkZHJlc3MpOworICAgIGlmIChvcGVuUmVzdXQgPT0gT0spIHsKKyAgICAgICAgKm91dFN0cmVhbSA9IG5ldyBTdHJlYW1PdXRIYWxMb2NhbChoYWxTdHJlYW0sIHRoaXMpOworICAgIH0KKyAgICBBTE9HVigib3Blbl9vdXRwdXRfc3RyZWFtIHN0YXR1cyAlZCBzdHJlYW0gJXAiLCBvcGVuUmVzdXQsIGhhbFN0cmVhbSk7CisgICAgcmV0dXJuIG9wZW5SZXN1dDsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6Om9wZW5JbnB1dFN0cmVhbSgKKyAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAorICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKKyAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAorICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzLAorICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCisgICAgICAgIHNwPFN0cmVhbUluSGFsSW50ZXJmYWNlPiAqaW5TdHJlYW0pIHsKKyAgICBhdWRpb19zdHJlYW1faW5fdCAqaGFsU3RyZWFtOworICAgIEFMT0dWKCJvcGVuX2lucHV0X3N0cmVhbSBoYW5kbGU6ICVkIGRldmljZXM6ICV4IGZsYWdzOiAlI3ggIgorICAgICAgICAgICAgInNyYXRlOiAlZCBmb3JtYXQgJSN4IGNoYW5uZWxzICV4IGFkZHJlc3MgJXMgc291cmNlICVkIiwKKyAgICAgICAgICAgIGhhbmRsZSwgZGV2aWNlcywgZmxhZ3MsCisgICAgICAgICAgICBjb25maWctPnNhbXBsZV9yYXRlLCBjb25maWctPmZvcm1hdCwgY29uZmlnLT5jaGFubmVsX21hc2ssCisgICAgICAgICAgICBhZGRyZXNzLCBzb3VyY2UpOworICAgIGludCBvcGVuUmVzdWx0ID0gbURldi0+b3Blbl9pbnB1dF9zdHJlYW0oCisgICAgICAgICAgICBtRGV2LCBoYW5kbGUsIGRldmljZXMsIGNvbmZpZywgJmhhbFN0cmVhbSwgZmxhZ3MsIGFkZHJlc3MsIHNvdXJjZSk7CisgICAgaWYgKG9wZW5SZXN1bHQgPT0gT0spIHsKKyAgICAgICAgKmluU3RyZWFtID0gbmV3IFN0cmVhbUluSGFsTG9jYWwoaGFsU3RyZWFtLCB0aGlzKTsKKyAgICB9CisgICAgQUxPR1YoIm9wZW5faW5wdXRfc3RyZWFtIHN0YXR1cyAlZCBzdHJlYW0gJXAiLCBvcGVuUmVzdWx0LCBpblN0cmVhbSk7CisgICAgcmV0dXJuIG9wZW5SZXN1bHQ7Cit9CisKK3N0YXR1c190IERldmljZUhhbExvY2FsOjpzdXBwb3J0c0F1ZGlvUGF0Y2hlcyhib29sICpzdXBwb3J0c1BhdGNoZXMpIHsKKyAgICAqc3VwcG9ydHNQYXRjaGVzID0gdmVyc2lvbigpID49IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl8zXzA7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6Y3JlYXRlQXVkaW9QYXRjaCgKKyAgICAgICAgdW5zaWduZWQgaW50IG51bV9zb3VyY2VzLAorICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNvdXJjZXMsCisgICAgICAgIHVuc2lnbmVkIGludCBudW1fc2lua3MsCisgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc2lua3MsCisgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaCkgeworICAgIGlmICh2ZXJzaW9uKCkgPj0gQVVESU9fREVWSUNFX0FQSV9WRVJTSU9OXzNfMCkgeworICAgICAgICByZXR1cm4gbURldi0+Y3JlYXRlX2F1ZGlvX3BhdGNoKAorICAgICAgICAgICAgICAgIG1EZXYsIG51bV9zb3VyY2VzLCBzb3VyY2VzLCBudW1fc2lua3MsIHNpbmtzLCBwYXRjaCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KK30KKworc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OnJlbGVhc2VBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoKSB7CisgICAgaWYgKHZlcnNpb24oKSA+PSBBVURJT19ERVZJQ0VfQVBJX1ZFUlNJT05fM18wKSB7CisgICAgICAgIHJldHVybiBtRGV2LT5yZWxlYXNlX2F1ZGlvX3BhdGNoKG1EZXYsIHBhdGNoKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorfQorCitzdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6Z2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KSB7CisgICAgcmV0dXJuIG1EZXYtPmdldF9hdWRpb19wb3J0KG1EZXYsIHBvcnQpOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6c2V0QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKSB7CisgICAgaWYgKHZlcnNpb24oKSA+PSBBVURJT19ERVZJQ0VfQVBJX1ZFUlNJT05fM18wKQorICAgICAgICByZXR1cm4gbURldi0+c2V0X2F1ZGlvX3BvcnRfY29uZmlnKG1EZXYsIGNvbmZpZyk7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisKKyNpZiBNQUpPUl9WRVJTSU9OID09IDIKK3N0YXR1c190IERldmljZUhhbExvY2FsOjpnZXRNaWNyb3Bob25lcygKKyAgICAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXMgX191bnVzZWQpIHsKKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisjZWxpZiBNQUpPUl9WRVJTSU9OID09IDQKK3N0YXR1c190IERldmljZUhhbExvY2FsOjpnZXRNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lcykgeworICAgIGlmIChtRGV2LT5nZXRfbWljcm9waG9uZXMgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHNpemVfdCBhY3R1YWxfbWljcyA9IEFVRElPX01JQ1JPUEhPTkVfTUFYX0NPVU5UOworICAgIGF1ZGlvX21pY3JvcGhvbmVfY2hhcmFjdGVyaXN0aWNfdCBtaWNfYXJyYXlbQVVESU9fTUlDUk9QSE9ORV9NQVhfQ09VTlRdOworICAgIHN0YXR1c190IHN0YXR1cyA9IG1EZXYtPmdldF9taWNyb3Bob25lcyhtRGV2LCAmbWljX2FycmF5WzBdLCAmYWN0dWFsX21pY3MpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYWN0dWFsX21pY3M7IGkrKykgeworICAgICAgICBtZWRpYTo6TWljcm9waG9uZUluZm8gbWljcm9waG9uZUluZm8gPSBtZWRpYTo6TWljcm9waG9uZUluZm8obWljX2FycmF5W2ldKTsKKyAgICAgICAgbWljcm9waG9uZXMtPnB1c2hfYmFjayhtaWNyb3Bob25lSW5mbyk7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisjZW5kaWYKKworc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmR1bXAoaW50IGZkKSB7CisgICAgcmV0dXJuIG1EZXYtPmR1bXAobURldiwgZmQpOworfQorCit2b2lkIERldmljZUhhbExvY2FsOjpjbG9zZU91dHB1dFN0cmVhbShzdHJ1Y3QgYXVkaW9fc3RyZWFtX291dCAqc3RyZWFtX291dCkgeworICAgIG1EZXYtPmNsb3NlX291dHB1dF9zdHJlYW0obURldiwgc3RyZWFtX291dCk7Cit9CisKK3ZvaWQgRGV2aWNlSGFsTG9jYWw6OmNsb3NlSW5wdXRTdHJlYW0oc3RydWN0IGF1ZGlvX3N0cmVhbV9pbiAqc3RyZWFtX2luKSB7CisgICAgbURldi0+Y2xvc2VfaW5wdXRfc3RyZWFtKG1EZXYsIHN0cmVhbV9pbik7Cit9CisKK30gLy8gbmFtZXNwYWNlIENQUF9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZUhhbExvY2FsLmggYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZUhhbExvY2FsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThiZDg3OQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlSGFsTG9jYWwuaApAQCAtMCwwICsxLDEyOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VfSEFMX0xPQ0FMX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VfSEFMX0xPQ0FMX0gKKworI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvLmg+CisjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRGV2aWNlSGFsSW50ZXJmYWNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBDUFBfVkVSU0lPTiB7CisKK2NsYXNzIERldmljZUhhbExvY2FsIDogcHVibGljIERldmljZUhhbEludGVyZmFjZQoreworICBwdWJsaWM6CisgICAgLy8gU2V0cyB0aGUgdmFsdWUgb2YgJ2RldmljZXMnIHRvIGEgYml0bWFzayBvZiAxIG9yIG1vcmUgdmFsdWVzIG9mIGF1ZGlvX2RldmljZXNfdC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFN1cHBvcnRlZERldmljZXModWludDMyX3QgKmRldmljZXMpOworCisgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSBhdWRpbyBoYXJkd2FyZSBpbnRlcmZhY2UgaGFzIGJlZW4gaW5pdGlhbGl6ZWQuCisgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKTsKKworICAgIC8vIFNldCB0aGUgYXVkaW8gdm9sdW1lIG9mIGEgdm9pY2UgY2FsbC4gUmFuZ2UgaXMgYmV0d2VlbiAwLjAgYW5kIDEuMC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZvaWNlVm9sdW1lKGZsb2F0IHZvbHVtZSk7CisKKyAgICAvLyBTZXQgdGhlIGF1ZGlvIHZvbHVtZSBmb3IgYWxsIGF1ZGlvIGFjdGl2aXRpZXMgb3RoZXIgdGhhbiB2b2ljZSBjYWxsLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWFzdGVyVm9sdW1lKGZsb2F0IHZvbHVtZSk7CisKKyAgICAvLyBHZXQgdGhlIGN1cnJlbnQgbWFzdGVyIHZvbHVtZSB2YWx1ZSBmb3IgdGhlIEhBTC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1hc3RlclZvbHVtZShmbG9hdCAqdm9sdW1lKTsKKworICAgIC8vIENhbGxlZCB3aGVuIHRoZSBhdWRpbyBtb2RlIGNoYW5nZXMuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNb2RlKGF1ZGlvX21vZGVfdCBtb2RlKTsKKworICAgIC8vIE11dGluZyBjb250cm9sLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWljTXV0ZShib29sIHN0YXRlKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1pY011dGUoYm9vbCAqc3RhdGUpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWFzdGVyTXV0ZShib29sIHN0YXRlKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1hc3Rlck11dGUoYm9vbCAqc3RhdGUpOworCisgICAgLy8gU2V0IGdsb2JhbCBhdWRpbyBwYXJhbWV0ZXJzLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrdlBhaXJzKTsKKworICAgIC8vIEdldCBnbG9iYWwgYXVkaW8gcGFyYW1ldGVycy4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cywgU3RyaW5nOCAqdmFsdWVzKTsKKworICAgIC8vIFJldHVybnMgYXVkaW8gaW5wdXQgYnVmZmVyIHNpemUgYWNjb3JkaW5nIHRvIHBhcmFtZXRlcnMgcGFzc2VkLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0SW5wdXRCdWZmZXJTaXplKGNvbnN0IHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKKyAgICAgICAgICAgIHNpemVfdCAqc2l6ZSk7CisKKyAgICAvLyBDcmVhdGVzIGFuZCBvcGVucyB0aGUgYXVkaW8gaGFyZHdhcmUgb3V0cHV0IHN0cmVhbS4gVGhlIHN0cmVhbSBpcyBjbG9zZWQKKyAgICAvLyBieSByZWxlYXNpbmcgYWxsIHJlZmVyZW5jZXMgdG8gdGhlIHJldHVybmVkIG9iamVjdC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5PdXRwdXRTdHJlYW0oCisgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBoYW5kbGUsCisgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKKyAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAorICAgICAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcywKKyAgICAgICAgICAgIHNwPFN0cmVhbU91dEhhbEludGVyZmFjZT4gKm91dFN0cmVhbSk7CisKKyAgICAvLyBDcmVhdGVzIGFuZCBvcGVucyB0aGUgYXVkaW8gaGFyZHdhcmUgaW5wdXQgc3RyZWFtLiBUaGUgc3RyZWFtIGlzIGNsb3NlZAorICAgIC8vIGJ5IHJlbGVhc2luZyBhbGwgcmVmZXJlbmNlcyB0byB0aGUgcmV0dXJuZWQgb2JqZWN0LgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlbklucHV0U3RyZWFtKAorICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAorICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMsCisgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCisgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcywKKyAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKKyAgICAgICAgICAgIHNwPFN0cmVhbUluSGFsSW50ZXJmYWNlPiAqaW5TdHJlYW0pOworCisgICAgLy8gUmV0dXJucyB3aGV0aGVyIGNyZWF0ZUF1ZGlvUGF0Y2ggYW5kIHJlbGVhc2VBdWRpb1BhdGNoIG9wZXJhdGlvbnMgYXJlIHN1cHBvcnRlZC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHN1cHBvcnRzQXVkaW9QYXRjaGVzKGJvb2wgKnN1cHBvcnRzUGF0Y2hlcyk7CisKKyAgICAvLyBDcmVhdGVzIGFuIGF1ZGlvIHBhdGNoIGJldHdlZW4gc2V2ZXJhbCBzb3VyY2UgYW5kIHNpbmsgcG9ydHMuCisgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVBdWRpb1BhdGNoKAorICAgICAgICAgICAgdW5zaWduZWQgaW50IG51bV9zb3VyY2VzLAorICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzb3VyY2VzLAorICAgICAgICAgICAgdW5zaWduZWQgaW50IG51bV9zaW5rcywKKyAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc2lua3MsCisgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqcGF0Y2gpOworCisgICAgLy8gUmVsZWFzZXMgYW4gYXVkaW8gcGF0Y2guCisgICAgdmlydHVhbCBzdGF0dXNfdCByZWxlYXNlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaCk7CisKKyAgICAvLyBGaWxscyB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQgYXR0cmlidXRlcyBmb3IgYSBnaXZlbiBhdWRpbyBwb3J0LgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KTsKKworICAgIC8vIFNldCBhdWRpbyBwb3J0IGNvbmZpZ3VyYXRpb24uCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpOworCisgICAgLy8gTGlzdCBtaWNyb3Bob25lcworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWljcm9waG9uZXMoc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXMpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCk7CisKKyAgICB2b2lkIGNsb3NlT3V0cHV0U3RyZWFtKHN0cnVjdCBhdWRpb19zdHJlYW1fb3V0ICpzdHJlYW1fb3V0KTsKKyAgICB2b2lkIGNsb3NlSW5wdXRTdHJlYW0oc3RydWN0IGF1ZGlvX3N0cmVhbV9pbiAqc3RyZWFtX2luKTsKKworICBwcml2YXRlOgorICAgIGF1ZGlvX2h3X2RldmljZV90ICptRGV2OworCisgICAgZnJpZW5kIGNsYXNzIERldmljZXNGYWN0b3J5SGFsTG9jYWw7CisKKyAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCisgICAgZXhwbGljaXQgRGV2aWNlSGFsTG9jYWwoYXVkaW9faHdfZGV2aWNlX3QgKmRldik7CisKKyAgICAvLyBUaGUgZGVzdHJ1Y3RvciBhdXRvbWF0aWNhbGx5IGNsb3NlcyB0aGUgZGV2aWNlLgorICAgIHZpcnR1YWwgfkRldmljZUhhbExvY2FsKCk7CisKKyAgICB1aW50MzJfdCB2ZXJzaW9uKCkgY29uc3QgeyByZXR1cm4gbURldi0+Y29tbW9uLnZlcnNpb247IH0KK307CisKK30gLy8gbmFtZXNwYWNlIENQUF9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0RFVklDRV9IQUxfTE9DQUxfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VzRmFjdG9yeUhhbEhpZGwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VzRmFjdG9yeUhhbEhpZGwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4MDAxZGEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZXNGYWN0b3J5SGFsSGlkbC5jcHAKQEAgLTAsMCArMSwxMTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjZGVmaW5lIExPR19UQUcgIkRldmljZXNGYWN0b3J5SGFsSGlkbCIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vMi4wL0lEZXZpY2UuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvLzQuMC9JRGV2aWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvaGlkbC9IYWxEZWF0aEhhbmRsZXIuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIkNvbnZlcnNpb25IZWxwZXJIaWRsLmgiCisjaW5jbHVkZSAiRGV2aWNlSGFsSGlkbC5oIgorI2luY2x1ZGUgIkRldmljZXNGYWN0b3J5SGFsSGlkbC5oIgorCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT046OklEZXZpY2U7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT046OlJlc3VsdDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIENQUF9WRVJTSU9OIHsKKworRGV2aWNlc0ZhY3RvcnlIYWxIaWRsOjpEZXZpY2VzRmFjdG9yeUhhbEhpZGwoKSB7CisgICAgc3A8SURldmljZXNGYWN0b3J5PiBkZWZhdWx0RmFjdG9yeXtJRGV2aWNlc0ZhY3Rvcnk6OmdldFNlcnZpY2UoKX07CisgICAgaWYgKCFkZWZhdWx0RmFjdG9yeSkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIG9idGFpbiBJRGV2aWNlc0ZhY3RvcnkvZGVmYXVsdCBzZXJ2aWNlLCB0ZXJtaW5hdGluZyBwcm9jZXNzLiIpOworICAgICAgICBleGl0KDEpOworICAgIH0KKyAgICBtRGV2aWNlRmFjdG9yaWVzLnB1c2hfYmFjayhkZWZhdWx0RmFjdG9yeSk7CisgICAgaWYgKE1BSk9SX1ZFUlNJT04gPj0gNCkgeworICAgICAgICAvLyBUaGUgTVNEIGZhY3RvcnkgaXMgb3B0aW9uYWwgYW5kIG9ubHkgYXZhaWxhYmxlIHN0YXJ0aW5nIGF0IEhBTCA0LjAKKyAgICAgICAgc3A8SURldmljZXNGYWN0b3J5PiBtc2RGYWN0b3J5e0lEZXZpY2VzRmFjdG9yeTo6Z2V0U2VydmljZShBVURJT19IQUxfU0VSVklDRV9OQU1FX01TRCl9OworICAgICAgICBpZiAobXNkRmFjdG9yeSkgeworICAgICAgICAgICAgbURldmljZUZhY3Rvcmllcy5wdXNoX2JhY2sobXNkRmFjdG9yeSk7CisgICAgICAgIH0KKyAgICB9CisgICAgZm9yIChjb25zdCBhdXRvJiBmYWN0b3J5IDogbURldmljZUZhY3RvcmllcykgeworICAgICAgICAvLyBJdCBpcyBhc3N1bWVkIHRoYXQgdGhlIERldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlIGluc3RhbmNlIGlzIG93bmVkCisgICAgICAgIC8vIGJ5IEF1ZGlvRmxpbmdlciBhbmQgdGh1cyBoYXZlIHRoZSBzYW1lIGxpZmVzcGFuLgorICAgICAgICBmYWN0b3J5LT5saW5rVG9EZWF0aChIYWxEZWF0aEhhbmRsZXI6OmdldEluc3RhbmNlKCksIDAgLypjb29raWUqLyk7CisgICAgfQorfQorCisKKyNpZiBNQUpPUl9WRVJTSU9OID09IDIKK3N0YXRpYyBJRGV2aWNlc0ZhY3Rvcnk6OkRldmljZSBpZEZyb21IYWwoY29uc3QgY2hhciAqbmFtZSwgc3RhdHVzX3QqIHN0YXR1cykgeworICAgICpzdGF0dXMgPSBPSzsKKyAgICBpZiAoc3RyY21wKG5hbWUsIEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9QUklNQVJZKSA9PSAwKSB7CisgICAgICAgIHJldHVybiBJRGV2aWNlc0ZhY3Rvcnk6OkRldmljZTo6UFJJTUFSWTsKKyAgICB9IGVsc2UgaWYoc3RyY21wKG5hbWUsIEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9BMkRQKSA9PSAwKSB7CisgICAgICAgIHJldHVybiBJRGV2aWNlc0ZhY3Rvcnk6OkRldmljZTo6QTJEUDsKKyAgICB9IGVsc2UgaWYoc3RyY21wKG5hbWUsIEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9VU0IpID09IDApIHsKKyAgICAgICAgcmV0dXJuIElEZXZpY2VzRmFjdG9yeTo6RGV2aWNlOjpVU0I7CisgICAgfSBlbHNlIGlmKHN0cmNtcChuYW1lLCBBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfUkVNT1RFX1NVQk1JWCkgPT0gMCkgeworICAgICAgICByZXR1cm4gSURldmljZXNGYWN0b3J5OjpEZXZpY2U6OlJfU1VCTUlYOworICAgIH0gZWxzZSBpZihzdHJjbXAobmFtZSwgQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX1NUVUIpID09IDApIHsKKyAgICAgICAgcmV0dXJuIElEZXZpY2VzRmFjdG9yeTo6RGV2aWNlOjpTVFVCOworICAgIH0KKyAgICBBTE9HRSgiSW52YWxpZCBkZXZpY2UgbmFtZSAlcyIsIG5hbWUpOworICAgICpzdGF0dXMgPSBCQURfVkFMVUU7CisgICAgcmV0dXJuIHt9OworfQorI2VsaWYgTUFKT1JfVkVSU0lPTiA9PSA0CitzdGF0aWMgY29uc3QgY2hhciogaWRGcm9tSGFsKGNvbnN0IGNoYXIgKm5hbWUsIHN0YXR1c190KiBzdGF0dXMpIHsKKyAgICAqc3RhdHVzID0gT0s7CisgICAgcmV0dXJuIG5hbWU7Cit9CisjZW5kaWYKKworc3RhdHVzX3QgRGV2aWNlc0ZhY3RvcnlIYWxIaWRsOjpvcGVuRGV2aWNlKGNvbnN0IGNoYXIgKm5hbWUsIHNwPERldmljZUhhbEludGVyZmFjZT4gKmRldmljZSkgeworICAgIGlmIChtRGV2aWNlRmFjdG9yaWVzLmVtcHR5KCkpIHJldHVybiBOT19JTklUOworICAgIHN0YXR1c190IHN0YXR1czsKKyAgICBhdXRvIGhpZGxJZCA9IGlkRnJvbUhhbChuYW1lLCAmc3RhdHVzKTsKKyAgICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOworICAgIFJlc3VsdCByZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGZhY3RvcnkgOiBtRGV2aWNlRmFjdG9yaWVzKSB7CisgICAgICAgIFJldHVybjx2b2lkPiByZXQgPSBmYWN0b3J5LT5vcGVuRGV2aWNlKAorICAgICAgICAgICAgICAgIGhpZGxJZCwKKyAgICAgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IHNwPElEZXZpY2U+JiByZXN1bHQpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAqZGV2aWNlID0gbmV3IERldmljZUhhbEhpZGwocmVzdWx0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICBpZiAoIXJldC5pc09rKCkpIHJldHVybiBGQUlMRURfVFJBTlNBQ1RJT047CisgICAgICAgIHN3aXRjaCAocmV0dmFsKSB7CisgICAgICAgICAgICAvLyBEZXZpY2Ugd2FzIGZvdW5kIGFuZCB3YXMgaW5pdGlhbGl6ZWQgc3VjY2Vzc2Z1bGx5LgorICAgICAgICAgICAgY2FzZSBSZXN1bHQ6Ok9LOiByZXR1cm4gT0s7CisgICAgICAgICAgICAvLyBEZXZpY2Ugd2FzIGZvdW5kIGJ1dCBmYWlsZWQgdG8gaW5pdGFsaXplLgorICAgICAgICAgICAgY2FzZSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDogcmV0dXJuIE5PX0lOSVQ7CisgICAgICAgICAgICAvLyBPdGhlcndpc2UgY29udGludWUgaXRlcmF0aW5nLgorICAgICAgICAgICAgZGVmYXVsdDogOworICAgICAgICB9CisgICAgfQorICAgIEFMT0dXKCJUaGUgc3BlY2lmaWVkIGRldmljZSBuYW1lIGlzIG5vdCByZWNvZ25pemVkOiBcIiVzXCIiLCBuYW1lKTsKKyAgICByZXR1cm4gQkFEX1ZBTFVFOworfQorCit9IC8vIG5hbWVzcGFjZSBDUFBfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VzRmFjdG9yeUhhbEhpZGwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlc0ZhY3RvcnlIYWxIaWRsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQyODJiMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlc0ZhY3RvcnlIYWxIaWRsLmgKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VTX0ZBQ1RPUllfSEFMX0hJRExfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0RFVklDRVNfRkFDVE9SWV9IQUxfSElETF9ICisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvLzIuMC9JRGV2aWNlc0ZhY3RvcnkuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvLzQuMC9JRGV2aWNlc0ZhY3RvcnkuaD4KKyNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9EZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZS5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKworI2luY2x1ZGUgIkRldmljZUhhbEhpZGwuaCIKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOjpJRGV2aWNlc0ZhY3Rvcnk7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBDUFBfVkVSU0lPTiB7CisKK2NsYXNzIERldmljZXNGYWN0b3J5SGFsSGlkbCA6IHB1YmxpYyBEZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZQoreworICBwdWJsaWM6CisgICAgLy8gT3BlbnMgYSBkZXZpY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuIFRvIGNsb3NlIHRoZSBkZXZpY2UsIGl0IGlzCisgICAgLy8gbmVjZXNzYXJ5IHRvIHJlbGVhc2UgcmVmZXJlbmNlcyB0byB0aGUgcmV0dXJuZWQgb2JqZWN0LgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlbkRldmljZShjb25zdCBjaGFyICpuYW1lLCBzcDxEZXZpY2VIYWxJbnRlcmZhY2U+ICpkZXZpY2UpOworCisgIHByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIERldmljZXNGYWN0b3J5SGFsSHlicmlkOworCisgICAgc3RkOjp2ZWN0b3I8c3A8SURldmljZXNGYWN0b3J5Pj4gbURldmljZUZhY3RvcmllczsKKworICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KKyAgICBEZXZpY2VzRmFjdG9yeUhhbEhpZGwoKTsKKworICAgIHZpcnR1YWwgfkRldmljZXNGYWN0b3J5SGFsSGlkbCgpID0gZGVmYXVsdDsKK307CisKK30gLy8gbmFtZXNwYWNlIENQUF9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0RFVklDRVNfRkFDVE9SWV9IQUxfSElETF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZXNGYWN0b3J5SGFsSHlicmlkLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzMzdhOGIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZXNGYWN0b3J5SGFsSHlicmlkLmNwcApAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZCIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgIkRldmljZXNGYWN0b3J5SGFsSHlicmlkLmgiCisjaW5jbHVkZSAiRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbC5oIgorI2luY2x1ZGUgIkRldmljZXNGYWN0b3J5SGFsSGlkbC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgQ1BQX1ZFUlNJT04geworCitEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZDo6RGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQoKQorICAgICAgICA6IG1Mb2NhbEZhY3RvcnkobmV3IERldmljZXNGYWN0b3J5SGFsTG9jYWwoKSksCisgICAgICAgICAgbUhpZGxGYWN0b3J5KG5ldyBEZXZpY2VzRmFjdG9yeUhhbEhpZGwoKSkgeworfQorCitzdGF0dXNfdCBEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZDo6b3BlbkRldmljZShjb25zdCBjaGFyICpuYW1lLCBzcDxEZXZpY2VIYWxJbnRlcmZhY2U+ICpkZXZpY2UpIHsKKyAgICBpZiAobUhpZGxGYWN0b3J5ICE9IDAgJiYgc3RyY21wKEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9BMkRQLCBuYW1lKSAhPSAwICYmCisgICAgICAgIHN0cmNtcChBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfSEVBUklOR19BSUQsIG5hbWUpICE9IDApIHsKKyAgICAgICAgcmV0dXJuIG1IaWRsRmFjdG9yeS0+b3BlbkRldmljZShuYW1lLCBkZXZpY2UpOworICAgIH0KKyAgICByZXR1cm4gbUxvY2FsRmFjdG9yeS0+b3BlbkRldmljZShuYW1lLCBkZXZpY2UpOworfQorCit9IC8vIG5hbWVzcGFjZSBDUFBfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VzRmFjdG9yeUhhbEh5YnJpZC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VzRmFjdG9yeUhhbEh5YnJpZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhYzBkMGQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZXNGYWN0b3J5SGFsSHlicmlkLmgKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VTX0ZBQ1RPUllfSEFMX0hZQlJJRF9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfREVWSUNFU19GQUNUT1JZX0hBTF9IWUJSSURfSAorCisjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBDUFBfVkVSU0lPTiB7CisKK2NsYXNzIERldmljZXNGYWN0b3J5SGFsSHlicmlkIDogcHVibGljIERldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlCit7CisgIHB1YmxpYzoKKyAgICBEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZCgpOworCisgICAgLy8gT3BlbnMgYSBkZXZpY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuIFRvIGNsb3NlIHRoZSBkZXZpY2UsIGl0IGlzCisgICAgLy8gbmVjZXNzYXJ5IHRvIHJlbGVhc2UgcmVmZXJlbmNlcyB0byB0aGUgcmV0dXJuZWQgb2JqZWN0LgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlbkRldmljZShjb25zdCBjaGFyICpuYW1lLCBzcDxEZXZpY2VIYWxJbnRlcmZhY2U+ICpkZXZpY2UpOworCisgIHByaXZhdGU6CisgICAgc3A8RGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2U+IG1Mb2NhbEZhY3Rvcnk7CisgICAgc3A8RGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2U+IG1IaWRsRmFjdG9yeTsKK307CisKK3NwPERldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlPiBjcmVhdGVEZXZpY2VzRmFjdG9yeUhhbCgpIHsKKyAgICByZXR1cm4gbmV3IERldmljZXNGYWN0b3J5SGFsSHlicmlkKCk7Cit9CisKK30gLy8gbmFtZXNwYWNlIENQUF9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0RFVklDRVNfRkFDVE9SWV9IQUxfSFlCUklEX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZXNGYWN0b3J5SGFsTG9jYWwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmNjdmZjUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZXNGYWN0b3J5SGFsTG9jYWwuY3BwCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkRldmljZXNGYWN0b3J5SGFsTG9jYWwiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJEZXZpY2VIYWxMb2NhbC5oIgorI2luY2x1ZGUgIkRldmljZXNGYWN0b3J5SGFsTG9jYWwuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIENQUF9WRVJTSU9OIHsKKworc3RhdGljIHN0YXR1c190IGxvYWRfYXVkaW9faW50ZXJmYWNlKGNvbnN0IGNoYXIgKmlmX25hbWUsIGF1ZGlvX2h3X2RldmljZV90ICoqZGV2KQoreworICAgIGNvbnN0IGh3X21vZHVsZV90ICptb2Q7CisgICAgaW50IHJjOworCisgICAgcmMgPSBod19nZXRfbW9kdWxlX2J5X2NsYXNzKEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRCwgaWZfbmFtZSwgJm1vZCk7CisgICAgaWYgKHJjKSB7CisgICAgICAgIEFMT0dFKCIlcyBjb3VsZG4ndCBsb2FkIGF1ZGlvIGh3IG1vZHVsZSAlcy4lcyAoJXMpIiwgX19mdW5jX18sCisgICAgICAgICAgICAgICAgQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lELCBpZl9uYW1lLCBzdHJlcnJvcigtcmMpKTsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorICAgIHJjID0gYXVkaW9faHdfZGV2aWNlX29wZW4obW9kLCBkZXYpOworICAgIGlmIChyYykgeworICAgICAgICBBTE9HRSgiJXMgY291bGRuJ3Qgb3BlbiBhdWRpbyBodyBkZXZpY2UgaW4gJXMuJXMgKCVzKSIsIF9fZnVuY19fLAorICAgICAgICAgICAgICAgIEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRCwgaWZfbmFtZSwgc3RyZXJyb3IoLXJjKSk7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKyAgICBpZiAoKCpkZXYpLT5jb21tb24udmVyc2lvbiA8IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl9NSU4pIHsKKyAgICAgICAgQUxPR0UoIiVzIHdyb25nIGF1ZGlvIGh3IGRldmljZSB2ZXJzaW9uICUwNHgiLCBfX2Z1bmNfXywgKCpkZXYpLT5jb21tb24udmVyc2lvbik7CisgICAgICAgIHJjID0gQkFEX1ZBTFVFOworICAgICAgICBhdWRpb19od19kZXZpY2VfY2xvc2UoKmRldik7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKyAgICByZXR1cm4gT0s7CisKK291dDoKKyAgICAqZGV2ID0gTlVMTDsKKyAgICByZXR1cm4gcmM7Cit9CisKK3N0YXR1c190IERldmljZXNGYWN0b3J5SGFsTG9jYWw6Om9wZW5EZXZpY2UoY29uc3QgY2hhciAqbmFtZSwgc3A8RGV2aWNlSGFsSW50ZXJmYWNlPiAqZGV2aWNlKSB7CisgICAgYXVkaW9faHdfZGV2aWNlX3QgKmRldjsKKyAgICBzdGF0dXNfdCByYyA9IGxvYWRfYXVkaW9faW50ZXJmYWNlKG5hbWUsICZkZXYpOworICAgIGlmIChyYyA9PSBPSykgeworICAgICAgICAqZGV2aWNlID0gbmV3IERldmljZUhhbExvY2FsKGRldik7CisgICAgfQorICAgIHJldHVybiByYzsKK30KKworfSAvLyBuYW1lc3BhY2UgQ1BQX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VzRmFjdG9yeUhhbExvY2FsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQxMDhkZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbC5oCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfREVWSUNFU19GQUNUT1JZX0hBTF9MT0NBTF9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfREVWSUNFU19GQUNUT1JZX0hBTF9MT0NBTF9ICisKKyNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9EZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZS5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKworI2luY2x1ZGUgIkRldmljZUhhbExvY2FsLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBDUFBfVkVSU0lPTiB7CisKK2NsYXNzIERldmljZXNGYWN0b3J5SGFsTG9jYWwgOiBwdWJsaWMgRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UKK3sKKyAgcHVibGljOgorICAgIC8vIE9wZW5zIGEgZGV2aWNlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLiBUbyBjbG9zZSB0aGUgZGV2aWNlLCBpdCBpcworICAgIC8vIG5lY2Vzc2FyeSB0byByZWxlYXNlIHJlZmVyZW5jZXMgdG8gdGhlIHJldHVybmVkIG9iamVjdC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5EZXZpY2UoY29uc3QgY2hhciAqbmFtZSwgc3A8RGV2aWNlSGFsSW50ZXJmYWNlPiAqZGV2aWNlKTsKKworICBwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZDsKKworICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KKyAgICBEZXZpY2VzRmFjdG9yeUhhbExvY2FsKCkge30KKworICAgIHZpcnR1YWwgfkRldmljZXNGYWN0b3J5SGFsTG9jYWwoKSB7fQorfTsKKworfSAvLyBuYW1lc3BhY2UgQ1BQX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfREVWSUNFU19GQUNUT1JZX0hBTF9MT0NBTF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0VmZmVjdEJ1ZmZlckhhbEhpZGwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9FZmZlY3RCdWZmZXJIYWxIaWRsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWY0ZThhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9FZmZlY3RCdWZmZXJIYWxIaWRsLmNwcApAQCAtMCwwICsxLDE0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxhdG9taWM+CisKKyNkZWZpbmUgTE9HX1RBRyAiRWZmZWN0QnVmZmVySGFsSGlkbCIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPGFuZHJvaWQvaGlkbC9hbGxvY2F0b3IvMS4wL0lBbGxvY2F0b3IuaD4KKyNpbmNsdWRlIDxoaWRsbWVtb3J5L21hcHBpbmcuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIkNvbnZlcnNpb25IZWxwZXJIaWRsLmgiCisjaW5jbHVkZSAiRWZmZWN0QnVmZmVySGFsSGlkbC5oIgorCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Cit1c2luZyA6OmFuZHJvaWQ6OmhpZGw6OmFsbG9jYXRvcjo6VjFfMDo6SUFsbG9jYXRvcjsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIENQUF9WRVJTSU9OIHsKKworLy8gc3RhdGljCit1aW50NjRfdCBFZmZlY3RCdWZmZXJIYWxIaWRsOjptYWtlVW5pcXVlSWQoKSB7CisgICAgc3RhdGljIHN0ZDo6YXRvbWljPHVpbnQ2NF90PiBjb3VudGVyezF9OworICAgIHJldHVybiBjb3VudGVyKys7Cit9CisKK3N0YXR1c190IEVmZmVjdEJ1ZmZlckhhbEhpZGw6OmFsbG9jYXRlKAorICAgICAgICBzaXplX3Qgc2l6ZSwgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiogYnVmZmVyKSB7CisgICAgcmV0dXJuIG1pcnJvcihudWxscHRyLCBzaXplLCBidWZmZXIpOworfQorCitzdGF0dXNfdCBFZmZlY3RCdWZmZXJIYWxIaWRsOjptaXJyb3IoCisgICAgICAgIHZvaWQqIGV4dGVybmFsLCBzaXplX3Qgc2l6ZSwgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiogYnVmZmVyKSB7CisgICAgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiB0ZW1wQnVmZmVyID0gbmV3IEVmZmVjdEJ1ZmZlckhhbEhpZGwoc2l6ZSk7CisgICAgc3RhdHVzX3QgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8RWZmZWN0QnVmZmVySGFsSGlkbCo+KHRlbXBCdWZmZXIuZ2V0KCkpLT5pbml0KCk7CisgICAgaWYgKHJlc3VsdCA9PSBPSykgeworICAgICAgICB0ZW1wQnVmZmVyLT5zZXRFeHRlcm5hbERhdGEoZXh0ZXJuYWwpOworICAgICAgICAqYnVmZmVyID0gdGVtcEJ1ZmZlcjsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworRWZmZWN0QnVmZmVySGFsSGlkbDo6RWZmZWN0QnVmZmVySGFsSGlkbChzaXplX3Qgc2l6ZSkKKyAgICAgICAgOiBtQnVmZmVyU2l6ZShzaXplKSwgbUZyYW1lQ291bnRDaGFuZ2VkKGZhbHNlKSwKKyAgICAgICAgICBtRXh0ZXJuYWxEYXRhKG51bGxwdHIpLCBtQXVkaW9CdWZmZXJ7MCwge251bGxwdHJ9fSB7CisgICAgbUhpZGxCdWZmZXIuaWQgPSBtYWtlVW5pcXVlSWQoKTsKKyAgICBtSGlkbEJ1ZmZlci5mcmFtZUNvdW50ID0gMDsKK30KKworRWZmZWN0QnVmZmVySGFsSGlkbDo6fkVmZmVjdEJ1ZmZlckhhbEhpZGwoKSB7Cit9CisKK3N0YXR1c190IEVmZmVjdEJ1ZmZlckhhbEhpZGw6OmluaXQoKSB7CisgICAgc3A8SUFsbG9jYXRvcj4gYXNobWVtID0gSUFsbG9jYXRvcjo6Z2V0U2VydmljZSgiYXNobWVtIik7CisgICAgaWYgKGFzaG1lbSA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gcmV0cmlldmUgYXNobWVtIGFsbG9jYXRvciBzZXJ2aWNlIik7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBzdGF0dXNfdCByZXR2YWwgPSBOT19NRU1PUlk7CisgICAgUmV0dXJuPHZvaWQ+IHJlc3VsdCA9IGFzaG1lbS0+YWxsb2NhdGUoCisgICAgICAgICAgICBtQnVmZmVyU2l6ZSwKKyAgICAgICAgICAgIFsmXShib29sIHN1Y2Nlc3MsIGNvbnN0IGhpZGxfbWVtb3J5JiBtZW1vcnkpIHsKKyAgICAgICAgICAgICAgICBpZiAoc3VjY2VzcykgeworICAgICAgICAgICAgICAgICAgICBtSGlkbEJ1ZmZlci5kYXRhID0gbWVtb3J5OworICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSBPSzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICBpZiAocmVzdWx0LmlzT2soKSAmJiByZXR2YWwgPT0gT0spIHsKKyAgICAgICAgbU1lbW9yeSA9IGhhcmR3YXJlOjptYXBNZW1vcnkobUhpZGxCdWZmZXIuZGF0YSk7CisgICAgICAgIGlmIChtTWVtb3J5ICE9IDApIHsKKyAgICAgICAgICAgIG1NZW1vcnktPnVwZGF0ZSgpOworICAgICAgICAgICAgbUF1ZGlvQnVmZmVyLnJhdyA9IHN0YXRpY19jYXN0PHZvaWQqPihtTWVtb3J5LT5nZXRQb2ludGVyKCkpOworICAgICAgICAgICAgbWVtc2V0KG1BdWRpb0J1ZmZlci5yYXcsIDAsIG1NZW1vcnktPmdldFNpemUoKSk7CisgICAgICAgICAgICBtTWVtb3J5LT5jb21taXQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gbWFwIGFsbG9jYXRlZCBhc2htZW0iKTsKKyAgICAgICAgICAgIHJldHZhbCA9IE5PX01FTU9SWTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gYWxsb2NhdGUgJWQgYnl0ZXMgZnJvbSBhc2htZW0iLCAoaW50KW1CdWZmZXJTaXplKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdC5pc09rKCkgPyByZXR2YWwgOiBGQUlMRURfVFJBTlNBQ1RJT047Cit9CisKK2F1ZGlvX2J1ZmZlcl90KiBFZmZlY3RCdWZmZXJIYWxIaWRsOjphdWRpb0J1ZmZlcigpIHsKKyAgICByZXR1cm4gJm1BdWRpb0J1ZmZlcjsKK30KKwordm9pZCogRWZmZWN0QnVmZmVySGFsSGlkbDo6ZXh0ZXJuYWxEYXRhKCkgY29uc3QgeworICAgIHJldHVybiBtRXh0ZXJuYWxEYXRhOworfQorCit2b2lkIEVmZmVjdEJ1ZmZlckhhbEhpZGw6OnNldEZyYW1lQ291bnQoc2l6ZV90IGZyYW1lQ291bnQpIHsKKyAgICBtSGlkbEJ1ZmZlci5mcmFtZUNvdW50ID0gZnJhbWVDb3VudDsKKyAgICBtQXVkaW9CdWZmZXIuZnJhbWVDb3VudCA9IGZyYW1lQ291bnQ7CisgICAgbUZyYW1lQ291bnRDaGFuZ2VkID0gdHJ1ZTsKK30KKworYm9vbCBFZmZlY3RCdWZmZXJIYWxIaWRsOjpjaGVja0ZyYW1lQ291bnRDaGFuZ2UoKSB7CisgICAgYm9vbCByZXN1bHQgPSBtRnJhbWVDb3VudENoYW5nZWQ7CisgICAgbUZyYW1lQ291bnRDaGFuZ2VkID0gZmFsc2U7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCBFZmZlY3RCdWZmZXJIYWxIaWRsOjpzZXRFeHRlcm5hbERhdGEodm9pZCogZXh0ZXJuYWwpIHsKKyAgICBtRXh0ZXJuYWxEYXRhID0gZXh0ZXJuYWw7Cit9CisKK3ZvaWQgRWZmZWN0QnVmZmVySGFsSGlkbDo6dXBkYXRlKCkgeworICAgIHVwZGF0ZShtQnVmZmVyU2l6ZSk7Cit9CisKK3ZvaWQgRWZmZWN0QnVmZmVySGFsSGlkbDo6Y29tbWl0KCkgeworICAgIGNvbW1pdChtQnVmZmVyU2l6ZSk7Cit9CisKK3ZvaWQgRWZmZWN0QnVmZmVySGFsSGlkbDo6dXBkYXRlKHNpemVfdCBzaXplKSB7CisgICAgaWYgKG1FeHRlcm5hbERhdGEgPT0gbnVsbHB0cikgcmV0dXJuOworICAgIG1NZW1vcnktPnVwZGF0ZSgpOworICAgIGlmIChzaXplID4gbUJ1ZmZlclNpemUpIHNpemUgPSBtQnVmZmVyU2l6ZTsKKyAgICBtZW1jcHkobUF1ZGlvQnVmZmVyLnJhdywgbUV4dGVybmFsRGF0YSwgc2l6ZSk7CisgICAgbU1lbW9yeS0+Y29tbWl0KCk7Cit9CisKK3ZvaWQgRWZmZWN0QnVmZmVySGFsSGlkbDo6Y29tbWl0KHNpemVfdCBzaXplKSB7CisgICAgaWYgKG1FeHRlcm5hbERhdGEgPT0gbnVsbHB0cikgcmV0dXJuOworICAgIGlmIChzaXplID4gbUJ1ZmZlclNpemUpIHNpemUgPSBtQnVmZmVyU2l6ZTsKKyAgICBtZW1jcHkobUV4dGVybmFsRGF0YSwgbUF1ZGlvQnVmZmVyLnJhdywgc2l6ZSk7Cit9CisKK30gLy8gbmFtZXNwYWNlIENQUF9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0VmZmVjdEJ1ZmZlckhhbEhpZGwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRWZmZWN0QnVmZmVySGFsSGlkbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyOWQ3MWEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0VmZmVjdEJ1ZmZlckhhbEhpZGwuaApAQCAtMCwwICsxLDc5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0VGRkVDVF9CVUZGRVJfSEFMX0hJRExfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0VGRkVDVF9CVUZGRVJfSEFMX0hJRExfSAorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby9lZmZlY3QvMi4wL3R5cGVzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby9lZmZlY3QvNC4wL3R5cGVzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oaWRsL21lbW9yeS8xLjAvSU1lbW9yeS5oPgorI2luY2x1ZGUgPGhpZGwvSGlkbFN1cHBvcnQuaD4KKyNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9FZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fZWZmZWN0Lmg+CisKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpDUFBfVkVSU0lPTjo6QXVkaW9CdWZmZXI7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9tZW1vcnk7Cit1c2luZyBhbmRyb2lkOjpoaWRsOjptZW1vcnk6OlYxXzA6OklNZW1vcnk7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBDUFBfVkVSU0lPTiB7CisKK2NsYXNzIEVmZmVjdEJ1ZmZlckhhbEhpZGwgOiBwdWJsaWMgRWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlCit7CisgIHB1YmxpYzoKKyAgICBzdGF0aWMgc3RhdHVzX3QgYWxsb2NhdGUoc2l6ZV90IHNpemUsIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4qIGJ1ZmZlcik7CisgICAgc3RhdGljIHN0YXR1c190IG1pcnJvcih2b2lkKiBleHRlcm5hbCwgc2l6ZV90IHNpemUsIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4qIGJ1ZmZlcik7CisKKyAgICB2aXJ0dWFsIGF1ZGlvX2J1ZmZlcl90KiBhdWRpb0J1ZmZlcigpOworICAgIHZpcnR1YWwgdm9pZCogZXh0ZXJuYWxEYXRhKCkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIHNpemVfdCBnZXRTaXplKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gbUJ1ZmZlclNpemU7IH0KKworICAgIHZpcnR1YWwgdm9pZCBzZXRFeHRlcm5hbERhdGEodm9pZCogZXh0ZXJuYWwpOworICAgIHZpcnR1YWwgdm9pZCBzZXRGcmFtZUNvdW50KHNpemVfdCBmcmFtZUNvdW50KTsKKyAgICB2aXJ0dWFsIGJvb2wgY2hlY2tGcmFtZUNvdW50Q2hhbmdlKCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlKCk7CisgICAgdmlydHVhbCB2b2lkIGNvbW1pdCgpOworICAgIHZpcnR1YWwgdm9pZCB1cGRhdGUoc2l6ZV90IHNpemUpOworICAgIHZpcnR1YWwgdm9pZCBjb21taXQoc2l6ZV90IHNpemUpOworCisgICAgY29uc3QgQXVkaW9CdWZmZXImIGhpZGxCdWZmZXIoKSBjb25zdCB7IHJldHVybiBtSGlkbEJ1ZmZlcjsgfQorCisgIHByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZTsKKworICAgIHN0YXRpYyB1aW50NjRfdCBtYWtlVW5pcXVlSWQoKTsKKworICAgIGNvbnN0IHNpemVfdCBtQnVmZmVyU2l6ZTsKKyAgICBib29sIG1GcmFtZUNvdW50Q2hhbmdlZDsKKyAgICB2b2lkKiBtRXh0ZXJuYWxEYXRhOworICAgIEF1ZGlvQnVmZmVyIG1IaWRsQnVmZmVyOworICAgIHNwPElNZW1vcnk+IG1NZW1vcnk7CisgICAgYXVkaW9fYnVmZmVyX3QgbUF1ZGlvQnVmZmVyOworCisgICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgorICAgIGV4cGxpY2l0IEVmZmVjdEJ1ZmZlckhhbEhpZGwoc2l6ZV90IHNpemUpOworCisgICAgdmlydHVhbCB+RWZmZWN0QnVmZmVySGFsSGlkbCgpOworCisgICAgc3RhdHVzX3QgaW5pdCgpOworfTsKKworfSAvLyBuYW1lc3BhY2UgQ1BQX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfRUZGRUNUX0JVRkZFUl9IQUxfSElETF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0VmZmVjdEhhbEhpZGwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9FZmZlY3RIYWxIaWRsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjY0OWExCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9FZmZlY3RIYWxIaWRsLmNwcApAQCAtMCwwICsxLDM0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiRWZmZWN0SGFsSGlkbCIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPGNvbW1vbi9hbGwtdmVyc2lvbnMvVmVyc2lvblV0aWxzLmg+CisjaW5jbHVkZSA8aHdiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KKyNpbmNsdWRlIDxtZWRpYS9FZmZlY3RzRmFjdG9yeUFwaS5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiRWZmZWN0QnVmZmVySGFsSGlkbC5oIgorI2luY2x1ZGUgIkVmZmVjdEhhbEhpZGwuaCIKKyNpbmNsdWRlICJIaWRsVXRpbHMuaCIKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6Q1BQX1ZFUlNJT046OkF1ZGlvQnVmZmVyOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6Q1BQX1ZFUlNJT046OkVmZmVjdEJ1ZmZlckFjY2VzczsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OkNQUF9WRVJTSU9OOjpFZmZlY3RDb25maWdQYXJhbWV0ZXJzOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6Q1BQX1ZFUlNJT046Ok1lc3NhZ2VRdWV1ZUZsYWdCaXRzOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6Q1BQX1ZFUlNJT046OlJlc3VsdDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OkNQUF9WRVJTSU9OOjpIaWRsVXRpbHM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpDUFBfVkVSU0lPTjo6QXVkaW9DaGFubmVsTWFzazsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OkNQUF9WRVJTSU9OOjpBdWRpb0Zvcm1hdDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OnV0aWxzOjpta0VudW1Db252ZXJ0ZXI7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Ok1RRGVzY3JpcHRvclN5bmM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBDUFBfVkVSU0lPTiB7CisKK0VmZmVjdEhhbEhpZGw6OkVmZmVjdEhhbEhpZGwoY29uc3Qgc3A8SUVmZmVjdD4mIGVmZmVjdCwgdWludDY0X3QgZWZmZWN0SWQpCisgICAgICAgIDogbUVmZmVjdChlZmZlY3QpLCBtRWZmZWN0SWQoZWZmZWN0SWQpLCBtQnVmZmVyc0NoYW5nZWQodHJ1ZSksIG1FZkdyb3VwKG51bGxwdHIpIHsKK30KKworRWZmZWN0SGFsSGlkbDo6fkVmZmVjdEhhbEhpZGwoKSB7CisgICAgaWYgKG1FZmZlY3QgIT0gMCkgeworICAgICAgICBjbG9zZSgpOworICAgICAgICBtRWZmZWN0LmNsZWFyKCk7CisgICAgICAgIGhhcmR3YXJlOjpJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5mbHVzaENvbW1hbmRzKCk7CisgICAgfQorICAgIGlmIChtRWZHcm91cCkgeworICAgICAgICBFdmVudEZsYWc6OmRlbGV0ZUV2ZW50RmxhZygmbUVmR3JvdXApOworICAgIH0KK30KKworLy8gc3RhdGljCit2b2lkIEVmZmVjdEhhbEhpZGw6OmVmZmVjdERlc2NyaXB0b3JUb0hhbCgKKyAgICAgICAgY29uc3QgRWZmZWN0RGVzY3JpcHRvciYgZGVzY3JpcHRvciwgZWZmZWN0X2Rlc2NyaXB0b3JfdCogaGFsRGVzY3JpcHRvcikgeworICAgIEhpZGxVdGlsczo6dXVpZFRvSGFsKGRlc2NyaXB0b3IudHlwZSwgJmhhbERlc2NyaXB0b3ItPnR5cGUpOworICAgIEhpZGxVdGlsczo6dXVpZFRvSGFsKGRlc2NyaXB0b3IudXVpZCwgJmhhbERlc2NyaXB0b3ItPnV1aWQpOworICAgIGhhbERlc2NyaXB0b3ItPmZsYWdzID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGRlc2NyaXB0b3IuZmxhZ3MpOworICAgIGhhbERlc2NyaXB0b3ItPmNwdUxvYWQgPSBkZXNjcmlwdG9yLmNwdUxvYWQ7CisgICAgaGFsRGVzY3JpcHRvci0+bWVtb3J5VXNhZ2UgPSBkZXNjcmlwdG9yLm1lbW9yeVVzYWdlOworICAgIG1lbWNweShoYWxEZXNjcmlwdG9yLT5uYW1lLCBkZXNjcmlwdG9yLm5hbWUuZGF0YSgpLCBkZXNjcmlwdG9yLm5hbWUuc2l6ZSgpKTsKKyAgICBtZW1jcHkoaGFsRGVzY3JpcHRvci0+aW1wbGVtZW50b3IsCisgICAgICAgICAgICBkZXNjcmlwdG9yLmltcGxlbWVudG9yLmRhdGEoKSwgZGVzY3JpcHRvci5pbXBsZW1lbnRvci5zaXplKCkpOworfQorCisvLyBUT0RPKG1uYWdhbm92KTogVGhlc2UgYnVmZmVyIGNvbnZlcnNpb24gZnVuY3Rpb25zIHNob3VsZCBiZSBzaGFyZWQgd2l0aCBFZmZlY3Qgd3JhcHBlcgorLy8gdmlhIEhpZGxVdGlscy4gTW92ZSB0aGVtIHRoZXJlIHdoZW4gaGFyZHdhcmUvaW50ZXJmYWNlcyB3aWxsIGdldCB1bi1mcm96ZW4gYWdhaW4uCisKKy8vIHN0YXRpYwordm9pZCBFZmZlY3RIYWxIaWRsOjplZmZlY3RCdWZmZXJDb25maWdGcm9tSGFsKAorICAgICAgICBjb25zdCBidWZmZXJfY29uZmlnX3QmIGhhbENvbmZpZywgRWZmZWN0QnVmZmVyQ29uZmlnKiBjb25maWcpIHsKKyAgICBjb25maWctPnNhbXBsaW5nUmF0ZUh6ID0gaGFsQ29uZmlnLnNhbXBsaW5nUmF0ZTsKKyAgICBjb25maWctPmNoYW5uZWxzID0gbWtFbnVtQ29udmVydGVyPEF1ZGlvQ2hhbm5lbE1hc2s+KGhhbENvbmZpZy5jaGFubmVscyk7CisgICAgY29uZmlnLT5mb3JtYXQgPSBBdWRpb0Zvcm1hdChoYWxDb25maWcuZm9ybWF0KTsKKyAgICBjb25maWctPmFjY2Vzc01vZGUgPSBFZmZlY3RCdWZmZXJBY2Nlc3MoaGFsQ29uZmlnLmFjY2Vzc01vZGUpOworICAgIGNvbmZpZy0+bWFzayA9IG1rRW51bUNvbnZlcnRlcjxFZmZlY3RDb25maWdQYXJhbWV0ZXJzPihoYWxDb25maWcubWFzayk7Cit9CisKKy8vIHN0YXRpYwordm9pZCBFZmZlY3RIYWxIaWRsOjplZmZlY3RCdWZmZXJDb25maWdUb0hhbCgKKyAgICAgICAgY29uc3QgRWZmZWN0QnVmZmVyQ29uZmlnJiBjb25maWcsIGJ1ZmZlcl9jb25maWdfdCogaGFsQ29uZmlnKSB7CisgICAgaGFsQ29uZmlnLT5idWZmZXIuZnJhbWVDb3VudCA9IDA7CisgICAgaGFsQ29uZmlnLT5idWZmZXIucmF3ID0gTlVMTDsKKyAgICBoYWxDb25maWctPnNhbXBsaW5nUmF0ZSA9IGNvbmZpZy5zYW1wbGluZ1JhdGVIejsKKyAgICBoYWxDb25maWctPmNoYW5uZWxzID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+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+IHJldCA9IGNtZENvZGUgPT0gRUZGRUNUX0NNRF9TRVRfQ09ORklHID8KKyAgICAgICAgICAgIG1FZmZlY3QtPnNldENvbmZpZyhoaWRsQ29uZmlnLCBudWxscHRyLCBudWxscHRyKSA6CisgICAgICAgICAgICBtRWZmZWN0LT5zZXRDb25maWdSZXZlcnNlKGhpZGxDb25maWcsIG51bGxwdHIsIG51bGxwdHIpOworICAgIHN0YXR1c190IHJlc3VsdCA9IEZBSUxFRF9UUkFOU0FDVElPTjsKKyAgICBpZiAocmV0LmlzT2soKSkgeworICAgICAgICByZXN1bHQgPSBhbmFseXplUmVzdWx0KHJldCk7CisgICAgICAgICpzdGF0aWNfY2FzdDxpbnQzMl90Kj4ocFJlcGx5RGF0YSkgPSByZXN1bHQ7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK30gLy8gbmFtZXNwYWNlIENQUF9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0VmZmVjdEhhbEhpZGwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRWZmZWN0SGFsSGlkbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0ZjQwZDMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0VmZmVjdEhhbEhpZGwuaApAQCAtMCwwICsxLDExMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9FRkZFQ1RfSEFMX0hJRExfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0VGRkVDVF9IQUxfSElETF9ICisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL2VmZmVjdC8yLjAvSUVmZmVjdC5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vZWZmZWN0LzQuMC9JRWZmZWN0Lmg+CisjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRWZmZWN0SGFsSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8Zm1xL0V2ZW50RmxhZy5oPgorI2luY2x1ZGUgPGZtcS9NZXNzYWdlUXVldWUuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fZWZmZWN0Lmg+CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OkNQUF9WRVJTSU9OOjpFZmZlY3RCdWZmZXJDb25maWc7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpDUFBfVkVSU0lPTjo6RWZmZWN0Q29uZmlnOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6Q1BQX1ZFUlNJT046OkVmZmVjdERlc2NyaXB0b3I7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpDUFBfVkVSU0lPTjo6SUVmZmVjdDsKK3VzaW5nIEVmZmVjdFJlc3VsdCA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OkNQUF9WRVJTSU9OOjpSZXN1bHQ7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpFdmVudEZsYWc7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpNZXNzYWdlUXVldWU7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBDUFBfVkVSU0lPTiB7CisKK2NsYXNzIEVmZmVjdEhhbEhpZGwgOiBwdWJsaWMgRWZmZWN0SGFsSW50ZXJmYWNlCit7CisgIHB1YmxpYzoKKyAgICAvLyBTZXQgdGhlIGlucHV0IGJ1ZmZlci4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldEluQnVmZmVyKGNvbnN0IHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4mIGJ1ZmZlcik7CisKKyAgICAvLyBTZXQgdGhlIG91dHB1dCBidWZmZXIuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRPdXRCdWZmZXIoY29uc3Qgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiYgYnVmZmVyKTsKKworICAgIC8vIEVmZmVjdCBwcm9jZXNzIGZ1bmN0aW9uLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJvY2VzcygpOworCisgICAgLy8gUHJvY2VzcyByZXZlcnNlIHN0cmVhbSBmdW5jdGlvbi4gVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHBhc3MKKyAgICAvLyBhIHJlZmVyZW5jZSBzdHJlYW0gdG8gdGhlIGVmZmVjdCBlbmdpbmUuCisgICAgdmlydHVhbCBzdGF0dXNfdCBwcm9jZXNzUmV2ZXJzZSgpOworCisgICAgLy8gU2VuZCBhIGNvbW1hbmQgYW5kIHJlY2VpdmUgYSByZXNwb25zZSB0by9mcm9tIGVmZmVjdCBlbmdpbmUuCisgICAgdmlydHVhbCBzdGF0dXNfdCBjb21tYW5kKHVpbnQzMl90IGNtZENvZGUsIHVpbnQzMl90IGNtZFNpemUsIHZvaWQgKnBDbWREYXRhLAorICAgICAgICAgICAgdWludDMyX3QgKnJlcGx5U2l6ZSwgdm9pZCAqcFJlcGx5RGF0YSk7CisKKyAgICAvLyBSZXR1cm5zIHRoZSBlZmZlY3QgZGVzY3JpcHRvci4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldERlc2NyaXB0b3IoZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpOworCisgICAgLy8gRnJlZSByZXNvdXJjZXMgb24gdGhlIHJlbW90ZSBzaWRlLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgY2xvc2UoKTsKKworICAgIC8vIFdoZXRoZXIgaXQncyBhIGxvY2FsIGltcGxlbWVudGF0aW9uLgorICAgIHZpcnR1YWwgYm9vbCBpc0xvY2FsKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKworICAgIHVpbnQ2NF90IGVmZmVjdElkKCkgY29uc3QgeyByZXR1cm4gbUVmZmVjdElkOyB9CisKKyAgICBzdGF0aWMgdm9pZCBlZmZlY3REZXNjcmlwdG9yVG9IYWwoCisgICAgICAgICAgICBjb25zdCBFZmZlY3REZXNjcmlwdG9yJiBkZXNjcmlwdG9yLCBlZmZlY3RfZGVzY3JpcHRvcl90KiBoYWxEZXNjcmlwdG9yKTsKKworICBwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBFZmZlY3RzRmFjdG9yeUhhbEhpZGw7CisgICAgdHlwZWRlZiBNZXNzYWdlUXVldWU8RWZmZWN0UmVzdWx0LCBoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZT4gU3RhdHVzTVE7CisKKyAgICBzcDxJRWZmZWN0PiBtRWZmZWN0OworICAgIGNvbnN0IHVpbnQ2NF90IG1FZmZlY3RJZDsKKyAgICBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+IG1JbkJ1ZmZlcjsKKyAgICBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+IG1PdXRCdWZmZXI7CisgICAgYm9vbCBtQnVmZmVyc0NoYW5nZWQ7CisgICAgc3RkOjp1bmlxdWVfcHRyPFN0YXR1c01RPiBtU3RhdHVzTVE7CisgICAgRXZlbnRGbGFnKiBtRWZHcm91cDsKKworICAgIHN0YXRpYyBzdGF0dXNfdCBhbmFseXplUmVzdWx0KGNvbnN0IEVmZmVjdFJlc3VsdCYgcmVzdWx0KTsKKyAgICBzdGF0aWMgdm9pZCBlZmZlY3RCdWZmZXJDb25maWdGcm9tSGFsKAorICAgICAgICAgICAgY29uc3QgYnVmZmVyX2NvbmZpZ190JiBoYWxDb25maWcsIEVmZmVjdEJ1ZmZlckNvbmZpZyogY29uZmlnKTsKKyAgICBzdGF0aWMgdm9pZCBlZmZlY3RCdWZmZXJDb25maWdUb0hhbCgKKyAgICAgICAgICAgIGNvbnN0IEVmZmVjdEJ1ZmZlckNvbmZpZyYgY29uZmlnLCBidWZmZXJfY29uZmlnX3QqIGhhbENvbmZpZyk7CisgICAgc3RhdGljIHZvaWQgZWZmZWN0Q29uZmlnRnJvbUhhbChjb25zdCBlZmZlY3RfY29uZmlnX3QmIGhhbENvbmZpZywgRWZmZWN0Q29uZmlnKiBjb25maWcpOworICAgIHN0YXRpYyB2b2lkIGVmZmVjdENvbmZpZ1RvSGFsKGNvbnN0IEVmZmVjdENvbmZpZyYgY29uZmlnLCBlZmZlY3RfY29uZmlnX3QqIGhhbENvbmZpZyk7CisKKyAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCisgICAgRWZmZWN0SGFsSGlkbChjb25zdCBzcDxJRWZmZWN0PiYgZWZmZWN0LCB1aW50NjRfdCBlZmZlY3RJZCk7CisKKyAgICAvLyBUaGUgZGVzdHJ1Y3RvciBhdXRvbWF0aWNhbGx5IHJlbGVhc2VzIHRoZSBlZmZlY3QuCisgICAgdmlydHVhbCB+RWZmZWN0SGFsSGlkbCgpOworCisgICAgc3RhdHVzX3QgZ2V0Q29uZmlnSW1wbCh1aW50MzJfdCBjbWRDb2RlLCB1aW50MzJfdCAqcmVwbHlTaXplLCB2b2lkICpwUmVwbHlEYXRhKTsKKyAgICBzdGF0dXNfdCBwcmVwYXJlRm9yUHJvY2Vzc2luZygpOworICAgIGJvb2wgbmVlZFRvUmVzZXRCdWZmZXJzKCk7CisgICAgc3RhdHVzX3QgcHJvY2Vzc0ltcGwodWludDMyX3QgbXFGbGFnKTsKKyAgICBzdGF0dXNfdCBzZXRDb25maWdJbXBsKAorICAgICAgICAgICAgdWludDMyX3QgY21kQ29kZSwgdWludDMyX3QgY21kU2l6ZSwgdm9pZCAqcENtZERhdGEsCisgICAgICAgICAgICB1aW50MzJfdCAqcmVwbHlTaXplLCB2b2lkICpwUmVwbHlEYXRhKTsKKyAgICBzdGF0dXNfdCBzZXRQcm9jZXNzQnVmZmVycygpOworfTsKKworfSAvLyBuYW1lc3BhY2UgQ1BQX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfRUZGRUNUX0hBTF9ISURMX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODgwNDMzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9FZmZlY3RzRmFjdG9yeUhhbEhpZGwuY3BwCkBAIC0wLDAgKzEsMTQ5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJFZmZlY3RzRmFjdG9yeUhhbEhpZGwiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDxjdXRpbHMvbmF0aXZlX2hhbmRsZS5oPgorCisjaW5jbHVkZSAiRWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmgiCisjaW5jbHVkZSAiQ29udmVyc2lvbkhlbHBlckhpZGwuaCIKKyNpbmNsdWRlICJFZmZlY3RCdWZmZXJIYWxIaWRsLmgiCisjaW5jbHVkZSAiRWZmZWN0SGFsSGlkbC5oIgorI2luY2x1ZGUgIkhpZGxVdGlscy5oIgorCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpDUFBfVkVSU0lPTjo6SGlkbFV0aWxzOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6Q1BQX1ZFUlNJT046OlV1aWQ7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpDUFBfVkVSU0lPTjo6SUVmZmVjdDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OkNQUF9WRVJTSU9OOjpSZXN1bHQ7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBDUFBfVkVSU0lPTiB7CisKK0VmZmVjdHNGYWN0b3J5SGFsSGlkbDo6RWZmZWN0c0ZhY3RvcnlIYWxIaWRsKCkgOiBDb252ZXJzaW9uSGVscGVySGlkbCgiRWZmZWN0c0ZhY3RvcnkiKSB7CisgICAgbUVmZmVjdHNGYWN0b3J5ID0gSUVmZmVjdHNGYWN0b3J5OjpnZXRTZXJ2aWNlKCk7CisgICAgaWYgKG1FZmZlY3RzRmFjdG9yeSA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gb2J0YWluIElFZmZlY3RzRmFjdG9yeSBzZXJ2aWNlLCB0ZXJtaW5hdGluZyBwcm9jZXNzLiIpOworICAgICAgICBleGl0KDEpOworICAgIH0KK30KKworc3RhdHVzX3QgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOjpxdWVyeUFsbERlc2NyaXB0b3JzKCkgeworICAgIGlmIChtRWZmZWN0c0ZhY3RvcnkgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgUmVzdWx0IHJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtRWZmZWN0c0ZhY3RvcnktPmdldEFsbERlc2NyaXB0b3JzKAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBoaWRsX3ZlYzxFZmZlY3REZXNjcmlwdG9yPiYgcmVzdWx0KSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgbUxhc3REZXNjcmlwdG9ycyA9IHJlc3VsdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICBpZiAocmV0LmlzT2soKSkgeworICAgICAgICByZXR1cm4gcmV0dmFsID09IFJlc3VsdDo6T0sgPyBPSyA6IE5PX0lOSVQ7CisgICAgfQorICAgIG1MYXN0RGVzY3JpcHRvcnMucmVzaXplKDApOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKF9fRlVOQ1RJT05fXywgcmV0KTsKK30KKworc3RhdHVzX3QgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOjpxdWVyeU51bWJlckVmZmVjdHModWludDMyX3QgKnBOdW1FZmZlY3RzKSB7CisgICAgc3RhdHVzX3QgcXVlcnlSZXN1bHQgPSBxdWVyeUFsbERlc2NyaXB0b3JzKCk7CisgICAgaWYgKHF1ZXJ5UmVzdWx0ID09IE9LKSB7CisgICAgICAgICpwTnVtRWZmZWN0cyA9IG1MYXN0RGVzY3JpcHRvcnMuc2l6ZSgpOworICAgIH0KKyAgICByZXR1cm4gcXVlcnlSZXN1bHQ7Cit9CisKK3N0YXR1c190IEVmZmVjdHNGYWN0b3J5SGFsSGlkbDo6Z2V0RGVzY3JpcHRvcigKKyAgICAgICAgdWludDMyX3QgaW5kZXgsIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKSB7CisgICAgLy8gVE9ETzogV2UgbmVlZCBzb21laG93IHRvIHRyYWNrIHRoZSBjaGFuZ2VzIG9uIHRoZSBzZXJ2ZXIgc2lkZQorICAgIC8vIG9yIGZpZ3VyZSBvdXQgaG93IHRvIGNvbnZlcnQgZXZlcnlib2R5IHRvIHF1ZXJ5IGFsbCB0aGUgZGVzY3JpcHRvcnMgYXQgb25jZS4KKyAgICAvLyBUT0RPOiBjaGVjayBmb3IgbnVsbHB0cgorICAgIGlmIChtTGFzdERlc2NyaXB0b3JzLnNpemUoKSA9PSAwKSB7CisgICAgICAgIHN0YXR1c190IHF1ZXJ5UmVzdWx0ID0gcXVlcnlBbGxEZXNjcmlwdG9ycygpOworICAgICAgICBpZiAocXVlcnlSZXN1bHQgIT0gT0spIHJldHVybiBxdWVyeVJlc3VsdDsKKyAgICB9CisgICAgaWYgKGluZGV4ID49IG1MYXN0RGVzY3JpcHRvcnMuc2l6ZSgpKSByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7CisgICAgRWZmZWN0SGFsSGlkbDo6ZWZmZWN0RGVzY3JpcHRvclRvSGFsKG1MYXN0RGVzY3JpcHRvcnNbaW5kZXhdLCBwRGVzY3JpcHRvcik7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBFZmZlY3RzRmFjdG9yeUhhbEhpZGw6OmdldERlc2NyaXB0b3IoCisgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnBFZmZlY3RVdWlkLCBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcikgeworICAgIC8vIFRPRE86IGNoZWNrIGZvciBudWxscHRyCisgICAgaWYgKG1FZmZlY3RzRmFjdG9yeSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBVdWlkIGhpZGxVdWlkOworICAgIEhpZGxVdGlsczo6dXVpZEZyb21IYWwoKnBFZmZlY3RVdWlkLCAmaGlkbFV1aWQpOworICAgIFJlc3VsdCByZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbUVmZmVjdHNGYWN0b3J5LT5nZXREZXNjcmlwdG9yKGhpZGxVdWlkLAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBFZmZlY3REZXNjcmlwdG9yJiByZXN1bHQpIHsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgICAgICBFZmZlY3RIYWxIaWRsOjplZmZlY3REZXNjcmlwdG9yVG9IYWwocmVzdWx0LCBwRGVzY3JpcHRvcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgaWYgKHJldC5pc09rKCkpIHsKKyAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSByZXR1cm4gT0s7CisgICAgICAgIGVsc2UgaWYgKHJldHZhbCA9PSBSZXN1bHQ6OklOVkFMSURfQVJHVU1FTlRTKSByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7CisgICAgICAgIGVsc2UgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKF9fRlVOQ1RJT05fXywgcmV0KTsKK30KKworc3RhdHVzX3QgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOjpjcmVhdGVFZmZlY3QoCisgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnBFZmZlY3RVdWlkLCBpbnQzMl90IHNlc3Npb25JZCwgaW50MzJfdCBpb0lkLAorICAgICAgICBzcDxFZmZlY3RIYWxJbnRlcmZhY2U+ICplZmZlY3QpIHsKKyAgICBpZiAobUVmZmVjdHNGYWN0b3J5ID09IDApIHJldHVybiBOT19JTklUOworICAgIFV1aWQgaGlkbFV1aWQ7CisgICAgSGlkbFV0aWxzOjp1dWlkRnJvbUhhbCgqcEVmZmVjdFV1aWQsICZoaWRsVXVpZCk7CisgICAgUmVzdWx0IHJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtRWZmZWN0c0ZhY3RvcnktPmNyZWF0ZUVmZmVjdCgKKyAgICAgICAgICAgIGhpZGxVdWlkLCBzZXNzaW9uSWQsIGlvSWQsCisgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IHNwPElFZmZlY3Q+JiByZXN1bHQsIHVpbnQ2NF90IGVmZmVjdElkKSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgKmVmZmVjdCA9IG5ldyBFZmZlY3RIYWxIaWRsKHJlc3VsdCwgZWZmZWN0SWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIGlmIChyZXQuaXNPaygpKSB7CisgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgcmV0dXJuIE9LOworICAgICAgICBlbHNlIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpJTlZBTElEX0FSR1VNRU5UUykgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOworICAgICAgICBlbHNlIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybihfX0ZVTkNUSU9OX18sIHJldCk7Cit9CisKK3N0YXR1c190IEVmZmVjdHNGYWN0b3J5SGFsSGlkbDo6ZHVtcEVmZmVjdHMoaW50IGZkKSB7CisgICAgaWYgKG1FZmZlY3RzRmFjdG9yeSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBuYXRpdmVfaGFuZGxlX3QqIGhpZGxIYW5kbGUgPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZSgxLCAwKTsKKyAgICBoaWRsSGFuZGxlLT5kYXRhWzBdID0gZmQ7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1FZmZlY3RzRmFjdG9yeS0+ZGVidWcoaGlkbEhhbmRsZSwge30gLyogb3B0aW9ucyAqLyk7CisgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoaGlkbEhhbmRsZSk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oX19GVU5DVElPTl9fLCByZXQpOworfQorCitzdGF0dXNfdCBFZmZlY3RzRmFjdG9yeUhhbEhpZGw6OmFsbG9jYXRlQnVmZmVyKHNpemVfdCBzaXplLCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+KiBidWZmZXIpIHsKKyAgICByZXR1cm4gRWZmZWN0QnVmZmVySGFsSGlkbDo6YWxsb2NhdGUoc2l6ZSwgYnVmZmVyKTsKK30KKworc3RhdHVzX3QgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOjptaXJyb3JCdWZmZXIodm9pZCogZXh0ZXJuYWwsIHNpemVfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+KiBidWZmZXIpIHsKKyAgICByZXR1cm4gRWZmZWN0QnVmZmVySGFsSGlkbDo6bWlycm9yKGV4dGVybmFsLCBzaXplLCBidWZmZXIpOworfQorCisKK30gLy8gbmFtZXNwYWNlIENQUF9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0VmZmVjdHNGYWN0b3J5SGFsSGlkbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9FZmZlY3RzRmFjdG9yeUhhbEhpZGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmZjZWQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9FZmZlY3RzRmFjdG9yeUhhbEhpZGwuaApAQCAtMCwwICsxLDc3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0VGRkVDVFNfRkFDVE9SWV9IQUxfSElETF9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfRUZGRUNUU19GQUNUT1JZX0hBTF9ISURMX0gKKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vZWZmZWN0LzIuMC9JRWZmZWN0c0ZhY3RvcnkuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL2VmZmVjdC80LjAvSUVmZmVjdHNGYWN0b3J5Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby9lZmZlY3QvMi4wL3R5cGVzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby9lZmZlY3QvNC4wL3R5cGVzLmg+CisjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2UuaD4KKworI2luY2x1ZGUgIkNvbnZlcnNpb25IZWxwZXJIaWRsLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBDUFBfVkVSU0lPTiB7CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OkNQUF9WRVJTSU9OOjpFZmZlY3REZXNjcmlwdG9yOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6Q1BQX1ZFUlNJT046OklFZmZlY3RzRmFjdG9yeTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOworCitjbGFzcyBFZmZlY3RzRmFjdG9yeUhhbEhpZGwgOiBwdWJsaWMgRWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2UsIHB1YmxpYyBDb252ZXJzaW9uSGVscGVySGlkbAoreworICBwdWJsaWM6CisgICAgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsKCk7CisKKyAgICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZGlmZmVyZW50IGVmZmVjdHMgaW4gYWxsIGxvYWRlZCBsaWJyYXJpZXMuCisgICAgdmlydHVhbCBzdGF0dXNfdCBxdWVyeU51bWJlckVmZmVjdHModWludDMyX3QgKnBOdW1FZmZlY3RzKTsKKworICAgIC8vIFJldHVybnMgYSBkZXNjcmlwdG9yIG9mIHRoZSBuZXh0IGF2YWlsYWJsZSBlZmZlY3QuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXREZXNjcmlwdG9yKHVpbnQzMl90IGluZGV4LAorICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXREZXNjcmlwdG9yKGNvbnN0IGVmZmVjdF91dWlkX3QgKnBFZmZlY3RVdWlkLAorICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpOworCisgICAgLy8gQ3JlYXRlcyBhbiBlZmZlY3QgZW5naW5lIG9mIHRoZSBzcGVjaWZpZWQgdHlwZS4KKyAgICAvLyBUbyByZWxlYXNlIHRoZSBlZmZlY3QgZW5naW5lLCBpdCBpcyBuZWNlc3NhcnkgdG8gcmVsZWFzZSByZWZlcmVuY2VzCisgICAgLy8gdG8gdGhlIHJldHVybmVkIGVmZmVjdCBvYmplY3QuCisgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVFZmZlY3QoY29uc3QgZWZmZWN0X3V1aWRfdCAqcEVmZmVjdFV1aWQsCisgICAgICAgICAgICBpbnQzMl90IHNlc3Npb25JZCwgaW50MzJfdCBpb0lkLAorICAgICAgICAgICAgc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiAqZWZmZWN0KTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcEVmZmVjdHMoaW50IGZkKTsKKworICAgIHN0YXR1c190IGFsbG9jYXRlQnVmZmVyKHNpemVfdCBzaXplLCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+KiBidWZmZXIpIG92ZXJyaWRlOworICAgIHN0YXR1c190IG1pcnJvckJ1ZmZlcih2b2lkKiBleHRlcm5hbCwgc2l6ZV90IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4qIGJ1ZmZlcikgb3ZlcnJpZGU7CisKKyAgcHJpdmF0ZToKKyAgICBzcDxJRWZmZWN0c0ZhY3Rvcnk+IG1FZmZlY3RzRmFjdG9yeTsKKyAgICBoaWRsX3ZlYzxFZmZlY3REZXNjcmlwdG9yPiBtTGFzdERlc2NyaXB0b3JzOworCisgICAgc3RhdHVzX3QgcXVlcnlBbGxEZXNjcmlwdG9ycygpOworfTsKKworc3A8RWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2U+IGNyZWF0ZUVmZmVjdHNGYWN0b3J5SGFsKCkgeworICAgIHJldHVybiBuZXcgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsKCk7Cit9CisKK30gLy8gbmFtZXNwYWNlIENQUF9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0VGRkVDVFNfRkFDVE9SWV9IQUxfSElETF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL1N0cmVhbUhhbEhpZGwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9TdHJlYW1IYWxIaWRsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmE4MGU4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9TdHJlYW1IYWxIaWRsLmNwcApAQCAtMCwwICsxLDg1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiU3RyZWFtSGFsSGlkbCIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vMi4wL0lTdHJlYW1PdXRDYWxsYmFjay5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vNC4wL0lTdHJlYW1PdXRDYWxsYmFjay5oPgorI2luY2x1ZGUgPGh3YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CisjaW5jbHVkZSA8bWVkaWF1dGlscy9TY2hlZHVsaW5nUG9saWN5U2VydmljZS5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiRGV2aWNlSGFsSGlkbC5oIgorI2luY2x1ZGUgIkVmZmVjdEhhbEhpZGwuaCIKKyNpbmNsdWRlICJTdHJlYW1IYWxIaWRsLmgiCisjaW5jbHVkZSAiVmVyc2lvblV0aWxzLmgiCisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OkNQUF9WRVJTSU9OOjpBdWRpb0NoYW5uZWxNYXNrOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6Q1BQX1ZFUlNJT046OkF1ZGlvRm9ybWF0OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6Q1BQX1ZFUlNJT046OlRocmVhZEluZm87Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT046OkF1ZGlvRHJhaW47Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT046OklTdHJlYW1PdXRDYWxsYmFjazsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjo6TWVzc2FnZVF1ZXVlRmxhZ0JpdHM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT046Ok1tYXBCdWZmZXJJbmZvOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOjpNbWFwUG9zaXRpb247Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT046OlBhcmFtZXRlclZhbHVlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOjpSZXN1bHQ7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT046OlRpbWVTcGVjOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6TVFEZXNjcmlwdG9yU3luYzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7Cit1c2luZyBSZWFkQ29tbWFuZCA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjo6SVN0cmVhbUluOjpSZWFkQ29tbWFuZDsKKworI2lmIE1BSk9SX1ZFUlNJT04gPT0gNAordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6Q1BQX1ZFUlNJT046OkF1ZGlvQ29udGVudFR5cGU7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpDUFBfVkVSU0lPTjo6QXVkaW9Tb3VyY2U7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpDUFBfVkVSU0lPTjo6QXVkaW9Vc2FnZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjo6TWljcm9waG9uZUluZm87Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT046OlBsYXliYWNrVHJhY2tNZXRhZGF0YTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjo6UmVjb3JkVHJhY2tNZXRhZGF0YTsKKyNlbmRpZgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgQ1BQX1ZFUlNJT04geworCitTdHJlYW1IYWxIaWRsOjpTdHJlYW1IYWxIaWRsKElTdHJlYW0gKnN0cmVhbSkKKyAgICAgICAgOiBDb252ZXJzaW9uSGVscGVySGlkbCgiU3RyZWFtIiksCisgICAgICAgICAgbVN0cmVhbShzdHJlYW0pLAorICAgICAgICAgIG1IYWxUaHJlYWRQcmlvcml0eShIQUxfVEhSRUFEX1BSSU9SSVRZX0RFRkFVTFQpLAorICAgICAgICAgIG1DYWNoZWRCdWZmZXJTaXplKDApeworCisgICAgLy8gSW5zdHJ1bWVudCBhdWRpbyBzaWduYWwgcG93ZXIgbG9nZ2luZy4KKyAgICAvLyBOb3RlOiBUaGlzIGFzc3VtZXMgY2hhbm5lbCBtYXNrLCBmb3JtYXQsIGFuZCBzYW1wbGUgcmF0ZSBkbyBub3QgY2hhbmdlIGFmdGVyIGNyZWF0aW9uLgorICAgIGlmIChtU3RyZWFtICE9IG51bGxwdHIgJiYgbVN0cmVhbVBvd2VyTG9nLmlzVXNlckRlYnVnT3JFbmdCdWlsZCgpKSB7CisgICAgICAgIC8vIE9idGFpbiBhdWRpbyBwcm9wZXJ0aWVzIChzZWUgU3RyZWFtSGFsSGlkbDo6Z2V0QXVkaW9Qcm9wZXJ0aWVzKCkgYmVsb3cpLgorICAgICAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+Z2V0QXVkaW9Qcm9wZXJ0aWVzKAorICAgICAgICAgICAgICAgIFsmXShhdXRvIHNyLCBhdXRvIG0sIGF1dG8gZikgeworICAgICAgICAgICAgICAgIG1TdHJlYW1Qb3dlckxvZy5pbml0KHNyLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+KG0pLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YXVkaW9fZm9ybWF0X3Q+KGYpKTsKKyAgICAgICAgICAgIH0pOworICAgIH0KK30KKworU3RyZWFtSGFsSGlkbDo6flN0cmVhbUhhbEhpZGwoKSB7CisgICAgbVN0cmVhbSA9IG51bGxwdHI7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbEhpZGw6OmdldFNhbXBsZVJhdGUodWludDMyX3QgKnJhdGUpIHsKKyAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRTYW1wbGVSYXRlIiwgbVN0cmVhbS0+Z2V0U2FtcGxlUmF0ZSgpLCByYXRlKTsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Z2V0QnVmZmVyU2l6ZShzaXplX3QgKnNpemUpIHsKKyAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOworICAgIHN0YXR1c190IHN0YXR1cyA9IHByb2Nlc3NSZXR1cm4oImdldEJ1ZmZlclNpemUiLCBtU3RyZWFtLT5nZXRCdWZmZXJTaXplKCksIHNpemUpOworICAgIGlmIChzdGF0dXMgPT0gT0spIHsKKyAgICAgICAgbUNhY2hlZEJ1ZmZlclNpemUgPSAqc2l6ZTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Z2V0Q2hhbm5lbE1hc2soYXVkaW9fY2hhbm5lbF9tYXNrX3QgKm1hc2spIHsKKyAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRDaGFubmVsTWFzayIsIG1TdHJlYW0tPmdldENoYW5uZWxNYXNrKCksIG1hc2spOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpnZXRGb3JtYXQoYXVkaW9fZm9ybWF0X3QgKmZvcm1hdCkgeworICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldEZvcm1hdCIsIG1TdHJlYW0tPmdldEZvcm1hdCgpLCBmb3JtYXQpOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpnZXRBdWRpb1Byb3BlcnRpZXMoCisgICAgICAgIHVpbnQzMl90ICpzYW1wbGVSYXRlLCBhdWRpb19jaGFubmVsX21hc2tfdCAqbWFzaywgYXVkaW9fZm9ybWF0X3QgKmZvcm1hdCkgeworICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmdldEF1ZGlvUHJvcGVydGllcygKKyAgICAgICAgICAgIFsmXSh1aW50MzJfdCBzciwgYXV0byBtLCBhdXRvIGYpIHsKKyAgICAgICAgICAgICAgICAqc2FtcGxlUmF0ZSA9IHNyOworICAgICAgICAgICAgICAgICptYXNrID0gc3RhdGljX2Nhc3Q8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+KG0pOworICAgICAgICAgICAgICAgICpmb3JtYXQgPSBzdGF0aWNfY2FzdDxhdWRpb19mb3JtYXRfdD4oZik7CisgICAgICAgICAgICB9KTsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0QXVkaW9Qcm9wZXJ0aWVzIiwgcmV0KTsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6c2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrdlBhaXJzKSB7CisgICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKKyAgICBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4gaGlkbFBhcmFtczsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBwYXJhbWV0ZXJzRnJvbUhhbChrdlBhaXJzLCAmaGlkbFBhcmFtcyk7CisgICAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0UGFyYW1ldGVycyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgdXRpbHM6OnNldFBhcmFtZXRlcnMobVN0cmVhbSwgaGlkbFBhcmFtcywge30gLyogb3B0aW9ucyAqLykpOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMsIFN0cmluZzggKnZhbHVlcykgeworICAgIHZhbHVlcy0+Y2xlYXIoKTsKKyAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOworICAgIGhpZGxfdmVjPGhpZGxfc3RyaW5nPiBoaWRsS2V5czsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBrZXlzRnJvbUhhbChrZXlzLCAmaGlkbEtleXMpOworICAgIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7CisgICAgUmVzdWx0IHJldHZhbDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gdXRpbHM6OmdldFBhcmFtZXRlcnMoCisgICAgICAgICAgICBtU3RyZWFtLAorICAgICAgICAgICAge30gLyogY29udGV4dCAqLywKKyAgICAgICAgICAgIGhpZGxLZXlzLAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4mIHBhcmFtZXRlcnMpIHsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzVG9IYWwocGFyYW1ldGVycywgdmFsdWVzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0UGFyYW1ldGVycyIsIHJldCwgcmV0dmFsKTsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6YWRkRWZmZWN0KHNwPEVmZmVjdEhhbEludGVyZmFjZT4gZWZmZWN0KSB7CisgICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiYWRkRWZmZWN0IiwgbVN0cmVhbS0+YWRkRWZmZWN0KAorICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxFZmZlY3RIYWxIaWRsKj4oZWZmZWN0LmdldCgpKS0+ZWZmZWN0SWQoKSkpOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpyZW1vdmVFZmZlY3Qoc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiBlZmZlY3QpIHsKKyAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJyZW1vdmVFZmZlY3QiLCBtU3RyZWFtLT5yZW1vdmVFZmZlY3QoCisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEVmZmVjdEhhbEhpZGwqPihlZmZlY3QuZ2V0KCkpLT5lZmZlY3RJZCgpKSk7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbEhpZGw6OnN0YW5kYnkoKSB7CisgICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic3RhbmRieSIsIG1TdHJlYW0tPnN0YW5kYnkoKSk7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbEhpZGw6OmR1bXAoaW50IGZkKSB7CisgICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKKyAgICBuYXRpdmVfaGFuZGxlX3QqIGhpZGxIYW5kbGUgPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZSgxLCAwKTsKKyAgICBoaWRsSGFuZGxlLT5kYXRhWzBdID0gZmQ7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmRlYnVnKGhpZGxIYW5kbGUsIHt9IC8qIG9wdGlvbnMgKi8pOworICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKGhpZGxIYW5kbGUpOworICAgIG1TdHJlYW1Qb3dlckxvZy5kdW1wKGZkKTsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZHVtcCIsIHJldCk7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbEhpZGw6OnN0YXJ0KCkgeworICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInN0YXJ0IiwgbVN0cmVhbS0+c3RhcnQoKSk7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbEhpZGw6OnN0b3AoKSB7CisgICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic3RvcCIsIG1TdHJlYW0tPnN0b3AoKSk7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbEhpZGw6OmNyZWF0ZU1tYXBCdWZmZXIoaW50MzJfdCBtaW5TaXplRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19tbWFwX2J1ZmZlcl9pbmZvICppbmZvKSB7CisgICAgUmVzdWx0IHJldHZhbDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+Y3JlYXRlTW1hcEJ1ZmZlcigKKyAgICAgICAgICAgIG1pblNpemVGcmFtZXMsCisgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IE1tYXBCdWZmZXJJbmZvJiBoaWRsSW5mbykgeworICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGUgKmhhbmRsZSA9IGhpZGxJbmZvLnNoYXJlZE1lbW9yeS5oYW5kbGUoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGhhbmRsZS0+bnVtRmRzID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+c2hhcmVkX21lbW9yeV9mZCA9IGhhbmRsZS0+ZGF0YVswXTsKKyNpZiBNQUpPUl9WRVJTSU9OID09IDQKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPmZsYWdzID0gYXVkaW9fbW1hcF9idWZmZXJfZmxhZyhoaWRsSW5mby5mbGFncyk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPmJ1ZmZlcl9zaXplX2ZyYW1lcyA9IGhpZGxJbmZvLmJ1ZmZlclNpemVGcmFtZXM7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBOZWdhdGl2ZSBidWZmZXIgc2l6ZSBmcmFtZSB3YXMgYSBoYWNrIGluIE8gYW5kIFAgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluZGljYXRlIHRoYXQgdGhlIGJ1ZmZlciBpcyBzaGFyZWFibGUgdG8gYXBwbGljYXRpb25zCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5mby0+YnVmZmVyX3NpemVfZnJhbWVzIDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPmJ1ZmZlcl9zaXplX2ZyYW1lcyAqPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5mbGFncyA9IGF1ZGlvX21tYXBfYnVmZmVyX2ZsYWcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5mbGFncyB8IEFVRElPX01NQVBfQVBQTElDQVRJT05fU0hBUkVBQkxFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPmJ1cnN0X3NpemVfZnJhbWVzID0gaGlkbEluZm8uYnVyc3RTaXplRnJhbWVzOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5mby0+c2hhcmVkX21lbW9yeV9hZGRyZXNzIGlzIG5vdCBuZWVkZWQgaW4gSElETCBjb250ZXh0CisgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5zaGFyZWRfbWVtb3J5X2FkZHJlc3MgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiY3JlYXRlTW1hcEJ1ZmZlciIsIHJldCwgcmV0dmFsKTsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Z2V0TW1hcFBvc2l0aW9uKHN0cnVjdCBhdWRpb19tbWFwX3Bvc2l0aW9uICpwb3NpdGlvbikgeworICAgIFJlc3VsdCByZXR2YWw7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmdldE1tYXBQb3NpdGlvbigKKyAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3QgTW1hcFBvc2l0aW9uJiBoaWRsUG9zaXRpb24pIHsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbi0+dGltZV9uYW5vc2Vjb25kcyA9IGhpZGxQb3NpdGlvbi50aW1lTmFub3NlY29uZHM7CisgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uLT5wb3NpdGlvbl9mcmFtZXMgPSBoaWRsUG9zaXRpb24ucG9zaXRpb25GcmFtZXM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldE1tYXBQb3NpdGlvbiIsIHJldCwgcmV0dmFsKTsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6c2V0SGFsVGhyZWFkUHJpb3JpdHkoaW50IHByaW9yaXR5KSB7CisgICAgbUhhbFRocmVhZFByaW9yaXR5ID0gcHJpb3JpdHk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpnZXRDYWNoZWRCdWZmZXJTaXplKHNpemVfdCAqc2l6ZSkgeworICAgIGlmIChtQ2FjaGVkQnVmZmVyU2l6ZSAhPSAwKSB7CisgICAgICAgICpzaXplID0gbUNhY2hlZEJ1ZmZlclNpemU7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisgICAgcmV0dXJuIGdldEJ1ZmZlclNpemUoc2l6ZSk7Cit9CisKK2Jvb2wgU3RyZWFtSGFsSGlkbDo6cmVxdWVzdEhhbFRocmVhZFByaW9yaXR5KHBpZF90IHRocmVhZFBpZCwgcGlkX3QgdGhyZWFkSWQpIHsKKyAgICBpZiAobUhhbFRocmVhZFByaW9yaXR5ID09IEhBTF9USFJFQURfUFJJT1JJVFlfREVGQVVMVCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaW50IGVyciA9IHJlcXVlc3RQcmlvcml0eSgKKyAgICAgICAgICAgIHRocmVhZFBpZCwgdGhyZWFkSWQsCisgICAgICAgICAgICBtSGFsVGhyZWFkUHJpb3JpdHksIGZhbHNlIC8qaXNGb3JBcHAqLywgdHJ1ZSAvKmFzeW5jaHJvbm91cyovKTsKKyAgICBBTE9HRV9JRihlcnIsICJmYWlsZWQgdG8gc2V0IHByaW9yaXR5ICVkIGZvciBwaWQgJWQgdGlkICVkOyBlcnJvciAlZCIsCisgICAgICAgICAgICBtSGFsVGhyZWFkUHJpb3JpdHksIHRocmVhZFBpZCwgdGhyZWFkSWQsIGVycik7CisgICAgLy8gQXVkaW8gd2lsbCBzdGlsbCB3b3JrLCBidXQgbGF0ZW5jeSB3aWxsIGJlIGhpZ2hlciBhbmQgc29tZXRpbWVzIHVuYWNjZXB0YWJsZS4KKyAgICByZXR1cm4gZXJyID09IDA7Cit9CisKK25hbWVzcGFjZSB7CisKKy8qIE5vdGVzIG9uIGNhbGxiYWNrIG93bmVyc2hpcC4KKworVGhpcyBpcyBob3cgKEh3KUJpbmRlciBvd25lcnNoaXAgbW9kZWwgbG9va3MgbGlrZS4gVGhlIHNlcnZlciBpbXBsZW1lbnRhdGlvbgoraXMgb3duZWQgYnkgQmluZGVyIGZyYW1ld29yayAodmlhIHNwPD4pLiBQcm94aWVzIGFyZSBvd25lZCBieSBjbGllbnRzLgorV2hlbiB0aGUgbGFzdCBwcm94eSBkaXNhcHBlYXJzLCBCaW5kZXIgZnJhbWV3b3JrIHJlbGVhc2VzIHRoZSBzZXJ2ZXIgaW1wbC4KKworVGh1cywgaXQgaXMgbm90IG5lZWRlZCB0byBrZWVwIGFueSByZWZlcmVuY2VzIHRvIFN0cmVhbU91dENhbGxiYWNrICh0aGlzIGlzCit0aGUgc2VydmVyIGltcGwpIC0tIGl0IHdpbGwgbGl2ZSBhcyBsb25nIGFzIEhBTCBzZXJ2ZXIgaG9sZHMgYSBzdHJvbmcgcmVmIHRvCitJU3RyZWFtT3V0Q2FsbGJhY2sgcHJveHkuIFdlIGNsZWFyIHRoYXQgcmVmZXJlbmNlIGJ5IGNhbGxpbmcgJ2NsZWFyQ2FsbGJhY2snCitmcm9tIHRoZSBkZXN0cnVjdG9yIG9mIFN0cmVhbU91dEhhbEhpZGwuCisKK1RoZSBjYWxsYmFjayBvbmx5IGtlZXBzIGEgd2VhayByZWZlcmVuY2UgdG8gdGhlIHN0cmVhbS4gVGhlIHN0cmVhbSBpcyBvd25lZAorYnkgQXVkaW9GbGluZ2VyLgorCisqLworCitzdHJ1Y3QgU3RyZWFtT3V0Q2FsbGJhY2sgOiBwdWJsaWMgSVN0cmVhbU91dENhbGxiYWNrIHsKKyAgICBTdHJlYW1PdXRDYWxsYmFjayhjb25zdCB3cDxTdHJlYW1PdXRIYWxIaWRsPiYgc3RyZWFtKSA6IG1TdHJlYW0oc3RyZWFtKSB7fQorCisgICAgLy8gSVN0cmVhbU91dENhbGxiYWNrIGltcGxlbWVudGF0aW9uCisgICAgUmV0dXJuPHZvaWQ+IG9uV3JpdGVSZWFkeSgpICBvdmVycmlkZSB7CisgICAgICAgIHNwPFN0cmVhbU91dEhhbEhpZGw+IHN0cmVhbSA9IG1TdHJlYW0ucHJvbW90ZSgpOworICAgICAgICBpZiAoc3RyZWFtICE9IDApIHsKKyAgICAgICAgICAgIHN0cmVhbS0+b25Xcml0ZVJlYWR5KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisKKyAgICBSZXR1cm48dm9pZD4gb25EcmFpblJlYWR5KCkgIG92ZXJyaWRlIHsKKyAgICAgICAgc3A8U3RyZWFtT3V0SGFsSGlkbD4gc3RyZWFtID0gbVN0cmVhbS5wcm9tb3RlKCk7CisgICAgICAgIGlmIChzdHJlYW0gIT0gMCkgeworICAgICAgICAgICAgc3RyZWFtLT5vbkRyYWluUmVhZHkoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gVm9pZCgpOworICAgIH0KKworICAgIFJldHVybjx2b2lkPiBvbkVycm9yKCkgIG92ZXJyaWRlIHsKKyAgICAgICAgc3A8U3RyZWFtT3V0SGFsSGlkbD4gc3RyZWFtID0gbVN0cmVhbS5wcm9tb3RlKCk7CisgICAgICAgIGlmIChzdHJlYW0gIT0gMCkgeworICAgICAgICAgICAgc3RyZWFtLT5vbkVycm9yKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICB3cDxTdHJlYW1PdXRIYWxIaWRsPiBtU3RyZWFtOworfTsKKworfSAgLy8gbmFtZXNwYWNlCisKK1N0cmVhbU91dEhhbEhpZGw6OlN0cmVhbU91dEhhbEhpZGwoY29uc3Qgc3A8SVN0cmVhbU91dD4mIHN0cmVhbSkKKyAgICAgICAgOiBTdHJlYW1IYWxIaWRsKHN0cmVhbS5nZXQoKSksIG1TdHJlYW0oc3RyZWFtKSwgbVdyaXRlckNsaWVudCgwKSwgbUVmR3JvdXAobnVsbHB0cikgeworfQorCitTdHJlYW1PdXRIYWxIaWRsOjp+U3RyZWFtT3V0SGFsSGlkbCgpIHsKKyAgICBpZiAobVN0cmVhbSAhPSAwKSB7CisgICAgICAgIGlmIChtQ2FsbGJhY2sudW5zYWZlX2dldCgpKSB7CisgICAgICAgICAgICBwcm9jZXNzUmV0dXJuKCJjbGVhckNhbGxiYWNrIiwgbVN0cmVhbS0+Y2xlYXJDYWxsYmFjaygpKTsKKyAgICAgICAgfQorICAgICAgICBwcm9jZXNzUmV0dXJuKCJjbG9zZSIsIG1TdHJlYW0tPmNsb3NlKCkpOworICAgICAgICBtU3RyZWFtLmNsZWFyKCk7CisgICAgfQorICAgIG1DYWxsYmFjay5jbGVhcigpOworICAgIGhhcmR3YXJlOjpJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5mbHVzaENvbW1hbmRzKCk7CisgICAgaWYgKG1FZkdyb3VwKSB7CisgICAgICAgIEV2ZW50RmxhZzo6ZGVsZXRlRXZlbnRGbGFnKCZtRWZHcm91cCk7CisgICAgfQorfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpnZXRGcmFtZVNpemUoc2l6ZV90ICpzaXplKSB7CisgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldEZyYW1lU2l6ZSIsIG1TdHJlYW0tPmdldEZyYW1lU2l6ZSgpLCBzaXplKTsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6Z2V0TGF0ZW5jeSh1aW50MzJfdCAqbGF0ZW5jeSkgeworICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOworICAgIGlmIChtV3JpdGVyQ2xpZW50ID09IGdldHRpZCgpICYmIG1Db21tYW5kTVEpIHsKKyAgICAgICAgcmV0dXJuIGNhbGxXcml0ZXJUaHJlYWQoCisgICAgICAgICAgICAgICAgV3JpdGVDb21tYW5kOjpHRVRfTEFURU5DWSwgImdldExhdGVuY3kiLCBudWxscHRyLCAwLAorICAgICAgICAgICAgICAgIFsmXShjb25zdCBXcml0ZVN0YXR1cyYgd3JpdGVTdGF0dXMpIHsKKyAgICAgICAgICAgICAgICAgICAgKmxhdGVuY3kgPSB3cml0ZVN0YXR1cy5yZXBseS5sYXRlbmN5TXM7CisgICAgICAgICAgICAgICAgfSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldExhdGVuY3kiLCBtU3RyZWFtLT5nZXRMYXRlbmN5KCksIGxhdGVuY3kpOworICAgIH0KK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6c2V0Vm9sdW1lKGZsb2F0IGxlZnQsIGZsb2F0IHJpZ2h0KSB7CisgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldFZvbHVtZSIsIG1TdHJlYW0tPnNldFZvbHVtZShsZWZ0LCByaWdodCkpOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjp3cml0ZShjb25zdCB2b2lkICpidWZmZXIsIHNpemVfdCBieXRlcywgc2l6ZV90ICp3cml0dGVuKSB7CisgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgKndyaXR0ZW4gPSAwOworCisgICAgaWYgKGJ5dGVzID09IDAgJiYgIW1EYXRhTVEpIHsKKyAgICAgICAgLy8gQ2FuJ3QgZGV0ZXJtaW5lIHRoZSBzaXplIGZvciB0aGUgTVEgYnVmZmVyLiBXYWl0IGZvciBhIG5vbi1lbXB0eSB3cml0ZSByZXF1ZXN0LgorICAgICAgICBBTE9HV19JRihtQ2FsbGJhY2sudW5zYWZlX2dldCgpLCAiRmlyc3QgY2FsbCB0byBhc3luYyB3cml0ZSB3aXRoIDAgYnl0ZXMiKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIHN0YXR1c190IHN0YXR1czsKKyAgICBpZiAoIW1EYXRhTVEpIHsKKyAgICAgICAgLy8gSW4gY2FzZSBpZiBwbGF5YmFjayBzdGFydHMgY2xvc2UgdG8gdGhlIGVuZCBvZiBhIGNvbXByZXNzZWQgdHJhY2ssIHRoZSBieXRlcworICAgICAgICAvLyB0aGF0IG5lZWQgdG8gYmUgd3JpdHRlbiBpcyBsZXNzIHRoYW4gdGhlIGFjdHVhbCBidWZmZXIgc2l6ZS4gTmVlZCB0byB1c2UKKyAgICAgICAgLy8gZnVsbCBidWZmZXIgc2l6ZSBmb3IgdGhlIE1RIHNpbmNlIG90aGVyd2lzZSBhZnRlciBzZWVraW5nIGJhY2sgdG8gdGhlIG1pZGRsZQorICAgICAgICAvLyBkYXRhIHdpbGwgYmUgdHJ1bmNhdGVkLgorICAgICAgICBzaXplX3QgYnVmZmVyU2l6ZTsKKyAgICAgICAgaWYgKChzdGF0dXMgPSBnZXRDYWNoZWRCdWZmZXJTaXplKCZidWZmZXJTaXplKSkgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJ5dGVzID4gYnVmZmVyU2l6ZSkgYnVmZmVyU2l6ZSA9IGJ5dGVzOworICAgICAgICBpZiAoKHN0YXR1cyA9IHByZXBhcmVGb3JXcml0aW5nKGJ1ZmZlclNpemUpKSAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXR1cyA9IGNhbGxXcml0ZXJUaHJlYWQoCisgICAgICAgICAgICBXcml0ZUNvbW1hbmQ6OldSSVRFLCAid3JpdGUiLCBzdGF0aWNfY2FzdDxjb25zdCB1aW50OF90Kj4oYnVmZmVyKSwgYnl0ZXMsCisgICAgICAgICAgICBbJl0gKGNvbnN0IFdyaXRlU3RhdHVzJiB3cml0ZVN0YXR1cykgeworICAgICAgICAgICAgICAgICp3cml0dGVuID0gd3JpdGVTdGF0dXMucmVwbHkud3JpdHRlbjsKKyAgICAgICAgICAgICAgICAvLyBEaWFnbm9zdGljcyBvZiB0aGUgY2F1c2Ugb2YgYi8zNTgxMzExMy4KKyAgICAgICAgICAgICAgICBBTE9HRV9JRigqd3JpdHRlbiA+IGJ5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgImhhbCByZXBvcnRzIG1vcmUgYnl0ZXMgd3JpdHRlbiB0aGFuIGFza2VkIGZvcjogJWxsZCA+ICVsbGQiLAorICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZykqd3JpdHRlbiwgKGxvbmcgbG9uZylieXRlcyk7CisgICAgICAgICAgICB9KTsKKyAgICBtU3RyZWFtUG93ZXJMb2cubG9nKGJ1ZmZlciwgKndyaXR0ZW4pOworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OmNhbGxXcml0ZXJUaHJlYWQoCisgICAgICAgIFdyaXRlQ29tbWFuZCBjbWQsIGNvbnN0IGNoYXIqIGNtZE5hbWUsCisgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhU2l6ZSwgU3RyZWFtT3V0SGFsSGlkbDo6V3JpdGVyQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICBpZiAoIW1Db21tYW5kTVEtPndyaXRlKCZjbWQpKSB7CisgICAgICAgIEFMT0dFKCJjb21tYW5kIG1lc3NhZ2UgcXVldWUgd3JpdGUgZmFpbGVkIGZvciBcIiVzXCIiLCBjbWROYW1lKTsKKyAgICAgICAgcmV0dXJuIC1FQUdBSU47CisgICAgfQorICAgIGlmIChkYXRhICE9IG51bGxwdHIpIHsKKyAgICAgICAgc2l6ZV90IGF2YWlsYWJsZVRvV3JpdGUgPSBtRGF0YU1RLT5hdmFpbGFibGVUb1dyaXRlKCk7CisgICAgICAgIGlmIChkYXRhU2l6ZSA+IGF2YWlsYWJsZVRvV3JpdGUpIHsKKyAgICAgICAgICAgIEFMT0dXKCJ0cnVuY2F0aW5nIHdyaXRlIGRhdGEgZnJvbSAlbGxkIHRvICVsbGQgZHVlIHRvIGluc3VmZmljaWVudCBkYXRhIHF1ZXVlIHNwYWNlIiwKKyAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZylkYXRhU2l6ZSwgKGxvbmcgbG9uZylhdmFpbGFibGVUb1dyaXRlKTsKKyAgICAgICAgICAgIGRhdGFTaXplID0gYXZhaWxhYmxlVG9Xcml0ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIW1EYXRhTVEtPndyaXRlKGRhdGEsIGRhdGFTaXplKSkgeworICAgICAgICAgICAgQUxPR0UoImRhdGEgbWVzc2FnZSBxdWV1ZSB3cml0ZSBmYWlsZWQgZm9yIFwiJXNcIiIsIGNtZE5hbWUpOworICAgICAgICB9CisgICAgfQorICAgIG1FZkdyb3VwLT53YWtlKHN0YXRpY19jYXN0PHVpbnQzMl90PihNZXNzYWdlUXVldWVGbGFnQml0czo6Tk9UX0VNUFRZKSk7CisKKyAgICAvLyBUT0RPOiBSZW1vdmUgbWFudWFsIGV2ZW50IGZsYWcgaGFuZGxpbmcgb25jZSBibG9ja2luZyBNUSBpcyBpbXBsZW1lbnRlZC4gYi8zMzgxNTQyMgorICAgIHVpbnQzMl90IGVmU3RhdGUgPSAwOworcmV0cnk6CisgICAgc3RhdHVzX3QgcmV0ID0gbUVmR3JvdXAtPndhaXQoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpOT1RfRlVMTCksICZlZlN0YXRlKTsKKyAgICBpZiAoZWZTdGF0ZSAmIHN0YXRpY19jYXN0PHVpbnQzMl90PihNZXNzYWdlUXVldWVGbGFnQml0czo6Tk9UX0ZVTEwpKSB7CisgICAgICAgIFdyaXRlU3RhdHVzIHdyaXRlU3RhdHVzOworICAgICAgICB3cml0ZVN0YXR1cy5yZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKKyAgICAgICAgaWYgKCFtU3RhdHVzTVEtPnJlYWQoJndyaXRlU3RhdHVzKSkgeworICAgICAgICAgICAgQUxPR0UoInN0YXR1cyBtZXNzYWdlIHJlYWQgZmFpbGVkIGZvciBcIiVzXCIiLCBjbWROYW1lKTsKKyAgICAgICAgfQorICAgICAgICBpZiAod3JpdGVTdGF0dXMucmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgIHJldCA9IE9LOworICAgICAgICAgICAgY2FsbGJhY2sod3JpdGVTdGF0dXMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0ID0gcHJvY2Vzc1JldHVybihjbWROYW1lLCB3cml0ZVN0YXR1cy5yZXR2YWwpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIGlmIChyZXQgPT0gLUVBR0FJTiB8fCByZXQgPT0gLUVJTlRSKSB7CisgICAgICAgIC8vIFNwdXJpb3VzIHdha2V1cC4gVGhpcyBub3JtYWxseSByZXRyaWVzIG5vIG1vcmUgdGhhbiBvbmNlLgorICAgICAgICBnb3RvIHJldHJ5OworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpwcmVwYXJlRm9yV3JpdGluZyhzaXplX3QgYnVmZmVyU2l6ZSkgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxDb21tYW5kTVE+IHRlbXBDb21tYW5kTVE7CisgICAgc3RkOjp1bmlxdWVfcHRyPERhdGFNUT4gdGVtcERhdGFNUTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8U3RhdHVzTVE+IHRlbXBTdGF0dXNNUTsKKyAgICBSZXN1bHQgcmV0dmFsOworICAgIHBpZF90IGhhbFRocmVhZFBpZCwgaGFsVGhyZWFkVGlkOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5wcmVwYXJlRm9yV3JpdGluZygKKyAgICAgICAgICAgIDEsIGJ1ZmZlclNpemUsCisgICAgICAgICAgICBbJl0oUmVzdWx0IHIsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IENvbW1hbmRNUTo6RGVzY3JpcHRvciYgY29tbWFuZE1RLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBEYXRhTVE6OkRlc2NyaXB0b3ImIGRhdGFNUSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RhdHVzTVE6OkRlc2NyaXB0b3ImIHN0YXR1c01RLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJlYWRJbmZvJiBoYWxUaHJlYWRJbmZvKSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgdGVtcENvbW1hbmRNUS5yZXNldChuZXcgQ29tbWFuZE1RKGNvbW1hbmRNUSkpOworICAgICAgICAgICAgICAgICAgICB0ZW1wRGF0YU1RLnJlc2V0KG5ldyBEYXRhTVEoZGF0YU1RKSk7CisgICAgICAgICAgICAgICAgICAgIHRlbXBTdGF0dXNNUS5yZXNldChuZXcgU3RhdHVzTVEoc3RhdHVzTVEpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRlbXBEYXRhTVEtPmlzVmFsaWQoKSAmJiB0ZW1wRGF0YU1RLT5nZXRFdmVudEZsYWdXb3JkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50RmxhZzo6Y3JlYXRlRXZlbnRGbGFnKHRlbXBEYXRhTVEtPmdldEV2ZW50RmxhZ1dvcmQoKSwgJm1FZkdyb3VwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBoYWxUaHJlYWRQaWQgPSBoYWxUaHJlYWRJbmZvLnBpZDsKKyAgICAgICAgICAgICAgICAgICAgaGFsVGhyZWFkVGlkID0gaGFsVGhyZWFkSW5mby50aWQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgaWYgKCFyZXQuaXNPaygpIHx8IHJldHZhbCAhPSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJwcmVwYXJlRm9yV3JpdGluZyIsIHJldCwgcmV0dmFsKTsKKyAgICB9CisgICAgaWYgKCF0ZW1wQ29tbWFuZE1RIHx8ICF0ZW1wQ29tbWFuZE1RLT5pc1ZhbGlkKCkgfHwKKyAgICAgICAgICAgICF0ZW1wRGF0YU1RIHx8ICF0ZW1wRGF0YU1RLT5pc1ZhbGlkKCkgfHwKKyAgICAgICAgICAgICF0ZW1wU3RhdHVzTVEgfHwgIXRlbXBTdGF0dXNNUS0+aXNWYWxpZCgpIHx8CisgICAgICAgICAgICAhbUVmR3JvdXApIHsKKyAgICAgICAgQUxPR0VfSUYoIXRlbXBDb21tYW5kTVEsICJGYWlsZWQgdG8gb2J0YWluIGNvbW1hbmQgbWVzc2FnZSBxdWV1ZSBmb3Igd3JpdGluZyIpOworICAgICAgICBBTE9HRV9JRih0ZW1wQ29tbWFuZE1RICYmICF0ZW1wQ29tbWFuZE1RLT5pc1ZhbGlkKCksCisgICAgICAgICAgICAgICAgIkNvbW1hbmQgbWVzc2FnZSBxdWV1ZSBmb3Igd3JpdGluZyBpcyBpbnZhbGlkIik7CisgICAgICAgIEFMT0dFX0lGKCF0ZW1wRGF0YU1RLCAiRmFpbGVkIHRvIG9idGFpbiBkYXRhIG1lc3NhZ2UgcXVldWUgZm9yIHdyaXRpbmciKTsKKyAgICAgICAgQUxPR0VfSUYodGVtcERhdGFNUSAmJiAhdGVtcERhdGFNUS0+aXNWYWxpZCgpLCAiRGF0YSBtZXNzYWdlIHF1ZXVlIGZvciB3cml0aW5nIGlzIGludmFsaWQiKTsKKyAgICAgICAgQUxPR0VfSUYoIXRlbXBTdGF0dXNNUSwgIkZhaWxlZCB0byBvYnRhaW4gc3RhdHVzIG1lc3NhZ2UgcXVldWUgZm9yIHdyaXRpbmciKTsKKyAgICAgICAgQUxPR0VfSUYodGVtcFN0YXR1c01RICYmICF0ZW1wU3RhdHVzTVEtPmlzVmFsaWQoKSwKKyAgICAgICAgICAgICAgICAiU3RhdHVzIG1lc3NhZ2UgcXVldWUgZm9yIHdyaXRpbmcgaXMgaW52YWxpZCIpOworICAgICAgICBBTE9HRV9JRighbUVmR3JvdXAsICJFdmVudCBmbGFnIGNyZWF0aW9uIGZvciB3cml0aW5nIGZhaWxlZCIpOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgcmVxdWVzdEhhbFRocmVhZFByaW9yaXR5KGhhbFRocmVhZFBpZCwgaGFsVGhyZWFkVGlkKTsKKworICAgIG1Db21tYW5kTVEgPSBzdGQ6Om1vdmUodGVtcENvbW1hbmRNUSk7CisgICAgbURhdGFNUSA9IHN0ZDo6bW92ZSh0ZW1wRGF0YU1RKTsKKyAgICBtU3RhdHVzTVEgPSBzdGQ6Om1vdmUodGVtcFN0YXR1c01RKTsKKyAgICBtV3JpdGVyQ2xpZW50ID0gZ2V0dGlkKCk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpnZXRSZW5kZXJQb3NpdGlvbih1aW50MzJfdCAqZHNwRnJhbWVzKSB7CisgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgUmVzdWx0IHJldHZhbDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+Z2V0UmVuZGVyUG9zaXRpb24oCisgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIHVpbnQzMl90IGQpIHsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgICAgICAqZHNwRnJhbWVzID0gZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0UmVuZGVyUG9zaXRpb24iLCByZXQsIHJldHZhbCk7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OmdldE5leHRXcml0ZVRpbWVzdGFtcChpbnQ2NF90ICp0aW1lc3RhbXApIHsKKyAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBSZXN1bHQgcmV0dmFsOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5nZXROZXh0V3JpdGVUaW1lc3RhbXAoCisgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGludDY0X3QgdCkgeworICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgICp0aW1lc3RhbXAgPSB0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRSZW5kZXJQb3NpdGlvbiIsIHJldCwgcmV0dmFsKTsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6c2V0Q2FsbGJhY2sod3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IGNhbGxiYWNrKSB7CisgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gcHJvY2Vzc1JldHVybigKKyAgICAgICAgICAgICJzZXRDYWxsYmFjayIsIG1TdHJlYW0tPnNldENhbGxiYWNrKG5ldyBTdHJlYW1PdXRDYWxsYmFjayh0aGlzKSkpOworICAgIGlmIChzdGF0dXMgPT0gT0spIHsKKyAgICAgICAgbUNhbGxiYWNrID0gY2FsbGJhY2s7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnN1cHBvcnRzUGF1c2VBbmRSZXN1bWUoYm9vbCAqc3VwcG9ydHNQYXVzZSwgYm9vbCAqc3VwcG9ydHNSZXN1bWUpIHsKKyAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+c3VwcG9ydHNQYXVzZUFuZFJlc3VtZSgKKyAgICAgICAgICAgIFsmXShib29sIHAsIGJvb2wgcikgeworICAgICAgICAgICAgICAgICpzdXBwb3J0c1BhdXNlID0gcDsKKyAgICAgICAgICAgICAgICAqc3VwcG9ydHNSZXN1bWUgPSByOworICAgICAgICAgICAgfSk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInN1cHBvcnRzUGF1c2VBbmRSZXN1bWUiLCByZXQpOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpwYXVzZSgpIHsKKyAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigicGF1c2UiLCBtU3RyZWFtLT5wYXVzZSgpKTsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6cmVzdW1lKCkgeworICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJwYXVzZSIsIG1TdHJlYW0tPnJlc3VtZSgpKTsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6c3VwcG9ydHNEcmFpbihib29sICpzdXBwb3J0c0RyYWluKSB7CisgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInN1cHBvcnRzRHJhaW4iLCBtU3RyZWFtLT5zdXBwb3J0c0RyYWluKCksIHN1cHBvcnRzRHJhaW4pOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpkcmFpbihib29sIGVhcmx5Tm90aWZ5KSB7CisgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oCisgICAgICAgICAgICAiZHJhaW4iLCBtU3RyZWFtLT5kcmFpbihlYXJseU5vdGlmeSA/IEF1ZGlvRHJhaW46OkVBUkxZX05PVElGWSA6IEF1ZGlvRHJhaW46OkFMTCkpOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpmbHVzaCgpIHsKKyAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigicGF1c2UiLCBtU3RyZWFtLT5mbHVzaCgpKTsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6Z2V0UHJlc2VudGF0aW9uUG9zaXRpb24odWludDY0X3QgKmZyYW1lcywgc3RydWN0IHRpbWVzcGVjICp0aW1lc3RhbXApIHsKKyAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBpZiAobVdyaXRlckNsaWVudCA9PSBnZXR0aWQoKSAmJiBtQ29tbWFuZE1RKSB7CisgICAgICAgIHJldHVybiBjYWxsV3JpdGVyVGhyZWFkKAorICAgICAgICAgICAgICAgIFdyaXRlQ29tbWFuZDo6R0VUX1BSRVNFTlRBVElPTl9QT1NJVElPTiwgImdldFByZXNlbnRhdGlvblBvc2l0aW9uIiwgbnVsbHB0ciwgMCwKKyAgICAgICAgICAgICAgICBbJl0oY29uc3QgV3JpdGVTdGF0dXMmIHdyaXRlU3RhdHVzKSB7CisgICAgICAgICAgICAgICAgICAgICpmcmFtZXMgPSB3cml0ZVN0YXR1cy5yZXBseS5wcmVzZW50YXRpb25Qb3NpdGlvbi5mcmFtZXM7CisgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC0+dHZfc2VjID0gd3JpdGVTdGF0dXMucmVwbHkucHJlc2VudGF0aW9uUG9zaXRpb24udGltZVN0YW1wLnR2U2VjOworICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAtPnR2X25zZWMgPSB3cml0ZVN0YXR1cy5yZXBseS5wcmVzZW50YXRpb25Qb3NpdGlvbi50aW1lU3RhbXAudHZOU2VjOworICAgICAgICAgICAgICAgIH0pOworICAgIH0gZWxzZSB7CisgICAgICAgIFJlc3VsdCByZXR2YWw7CisgICAgICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5nZXRQcmVzZW50YXRpb25Qb3NpdGlvbigKKyAgICAgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIHVpbnQ2NF90IGhpZGxGcmFtZXMsIGNvbnN0IFRpbWVTcGVjJiBoaWRsVGltZVN0YW1wKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgKmZyYW1lcyA9IGhpZGxGcmFtZXM7CisgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAtPnR2X3NlYyA9IGhpZGxUaW1lU3RhbXAudHZTZWM7CisgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAtPnR2X25zZWMgPSBoaWRsVGltZVN0YW1wLnR2TlNlYzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0UHJlc2VudGF0aW9uUG9zaXRpb24iLCByZXQsIHJldHZhbCk7CisgICAgfQorfQorCisjaWYgTUFKT1JfVkVSU0lPTiA9PSAyCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjp1cGRhdGVTb3VyY2VNZXRhZGF0YShjb25zdCBTb3VyY2VNZXRhZGF0YSYgLyogc291cmNlTWV0YWRhdGEgKi8pIHsKKyAgICAvLyBBdWRpbyBIQUwgVjIuMCBkb2VzIG5vdCBzdXBwb3J0IHByb3BhZ2F0aW5nIHNvdXJjZSBtZXRhZGF0YQorICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKyNlbGlmIE1BSk9SX1ZFUlNJT04gPT0gNAorLyoqIFRyYW5zZm9ybSBhIHN0YW5kYXJkIGNvbGxlY3Rpb24gdG8gYW4gSElETCB2ZWN0b3IuICovCit0ZW1wbGF0ZSA8Y2xhc3MgVmFsdWVzLCBjbGFzcyBFbGVtZW50Q29udmVydGVyPgorc3RhdGljIGF1dG8gdHJhbnNmb3JtVG9IaWRsVmVjKGNvbnN0IFZhbHVlcyYgdmFsdWVzLCBFbGVtZW50Q29udmVydGVyIGNvbnZlcnRlcikgeworICAgIGhpZGxfdmVjPGRlY2x0eXBlKGNvbnZlcnRlcigqdmFsdWVzLmJlZ2luKCkpKT4gcmVzdWx0e3ZhbHVlcy5zaXplKCl9OworICAgIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CisgICAgdHJhbnNmb3JtKGJlZ2luKHZhbHVlcyksIGVuZCh2YWx1ZXMpLCBiZWdpbihyZXN1bHQpLCBjb252ZXJ0ZXIpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnVwZGF0ZVNvdXJjZU1ldGFkYXRhKGNvbnN0IFNvdXJjZU1ldGFkYXRhJiBzb3VyY2VNZXRhZGF0YSkgeworICAgIGhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT046OlNvdXJjZU1ldGFkYXRhIGhhbE1ldGFkYXRhID0geworICAgICAgICAudHJhY2tzID0gdHJhbnNmb3JtVG9IaWRsVmVjKHNvdXJjZU1ldGFkYXRhLnRyYWNrcywKKyAgICAgICAgICAgICAgW10oY29uc3QgcGxheWJhY2tfdHJhY2tfbWV0YWRhdGEmIG1ldGFkYXRhKSAtPiBQbGF5YmFja1RyYWNrTWV0YWRhdGEgeworICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKKyAgICAgICAgICAgICAgICAgICAgLnVzYWdlPXN0YXRpY19jYXN0PEF1ZGlvVXNhZ2U+KG1ldGFkYXRhLnVzYWdlKSwKKyAgICAgICAgICAgICAgICAgICAgLmNvbnRlbnRUeXBlPXN0YXRpY19jYXN0PEF1ZGlvQ29udGVudFR5cGU+KG1ldGFkYXRhLmNvbnRlbnRfdHlwZSksCisgICAgICAgICAgICAgICAgICAgIC5nYWluPW1ldGFkYXRhLmdhaW4sCisgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICB9KX07CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInVwZGF0ZVNvdXJjZU1ldGFkYXRhIiwgbVN0cmVhbS0+dXBkYXRlU291cmNlTWV0YWRhdGEoaGFsTWV0YWRhdGEpKTsKK30KKyNlbmRpZgorCit2b2lkIFN0cmVhbU91dEhhbEhpZGw6Om9uV3JpdGVSZWFkeSgpIHsKKyAgICBzcDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gY2FsbGJhY2sgPSBtQ2FsbGJhY2sucHJvbW90ZSgpOworICAgIGlmIChjYWxsYmFjayA9PSAwKSByZXR1cm47CisgICAgQUxPR1YoImFzeW5jQ2FsbGJhY2sgb25Xcml0ZVJlYWR5Iik7CisgICAgY2FsbGJhY2stPm9uV3JpdGVSZWFkeSgpOworfQorCit2b2lkIFN0cmVhbU91dEhhbEhpZGw6Om9uRHJhaW5SZWFkeSgpIHsKKyAgICBzcDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gY2FsbGJhY2sgPSBtQ2FsbGJhY2sucHJvbW90ZSgpOworICAgIGlmIChjYWxsYmFjayA9PSAwKSByZXR1cm47CisgICAgQUxPR1YoImFzeW5jQ2FsbGJhY2sgb25EcmFpblJlYWR5Iik7CisgICAgY2FsbGJhY2stPm9uRHJhaW5SZWFkeSgpOworfQorCit2b2lkIFN0cmVhbU91dEhhbEhpZGw6Om9uRXJyb3IoKSB7CisgICAgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IGNhbGxiYWNrID0gbUNhbGxiYWNrLnByb21vdGUoKTsKKyAgICBpZiAoY2FsbGJhY2sgPT0gMCkgcmV0dXJuOworICAgIEFMT0dWKCJhc3luY0NhbGxiYWNrIG9uRXJyb3IiKTsKKyAgICBjYWxsYmFjay0+b25FcnJvcigpOworfQorCisKK1N0cmVhbUluSGFsSGlkbDo6U3RyZWFtSW5IYWxIaWRsKGNvbnN0IHNwPElTdHJlYW1Jbj4mIHN0cmVhbSkKKyAgICAgICAgOiBTdHJlYW1IYWxIaWRsKHN0cmVhbS5nZXQoKSksIG1TdHJlYW0oc3RyZWFtKSwgbVJlYWRlckNsaWVudCgwKSwgbUVmR3JvdXAobnVsbHB0cikgeworfQorCitTdHJlYW1JbkhhbEhpZGw6On5TdHJlYW1JbkhhbEhpZGwoKSB7CisgICAgaWYgKG1TdHJlYW0gIT0gMCkgeworICAgICAgICBwcm9jZXNzUmV0dXJuKCJjbG9zZSIsIG1TdHJlYW0tPmNsb3NlKCkpOworICAgICAgICBtU3RyZWFtLmNsZWFyKCk7CisgICAgICAgIGhhcmR3YXJlOjpJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5mbHVzaENvbW1hbmRzKCk7CisgICAgfQorICAgIGlmIChtRWZHcm91cCkgeworICAgICAgICBFdmVudEZsYWc6OmRlbGV0ZUV2ZW50RmxhZygmbUVmR3JvdXApOworICAgIH0KK30KKworc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpnZXRGcmFtZVNpemUoc2l6ZV90ICpzaXplKSB7CisgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldEZyYW1lU2l6ZSIsIG1TdHJlYW0tPmdldEZyYW1lU2l6ZSgpLCBzaXplKTsKK30KKworc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpzZXRHYWluKGZsb2F0IGdhaW4pIHsKKyAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0R2FpbiIsIG1TdHJlYW0tPnNldEdhaW4oZ2FpbikpOworfQorCitzdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OnJlYWQodm9pZCAqYnVmZmVyLCBzaXplX3QgYnl0ZXMsIHNpemVfdCAqcmVhZCkgeworICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOworICAgICpyZWFkID0gMDsKKworICAgIGlmIChieXRlcyA9PSAwICYmICFtRGF0YU1RKSB7CisgICAgICAgIC8vIENhbid0IGRldGVybWluZSB0aGUgc2l6ZSBmb3IgdGhlIE1RIGJ1ZmZlci4gV2FpdCBmb3IgYSBub24tZW1wdHkgcmVhZCByZXF1ZXN0LgorICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgc3RhdHVzX3Qgc3RhdHVzOworICAgIGlmICghbURhdGFNUSAmJiAoc3RhdHVzID0gcHJlcGFyZUZvclJlYWRpbmcoYnl0ZXMpKSAhPSBPSykgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIFJlYWRQYXJhbWV0ZXJzIHBhcmFtczsKKyAgICBwYXJhbXMuY29tbWFuZCA9IFJlYWRDb21tYW5kOjpSRUFEOworICAgIHBhcmFtcy5wYXJhbXMucmVhZCA9IGJ5dGVzOworICAgIHN0YXR1cyA9IGNhbGxSZWFkZXJUaHJlYWQocGFyYW1zLCAicmVhZCIsCisgICAgICAgICAgICBbJl0oY29uc3QgUmVhZFN0YXR1cyYgcmVhZFN0YXR1cykgeworICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBhdmFpbFRvUmVhZCA9IG1EYXRhTVEtPmF2YWlsYWJsZVRvUmVhZCgpOworICAgICAgICAgICAgICAgIGlmICghbURhdGFNUS0+cmVhZChzdGF0aWNfY2FzdDx1aW50OF90Kj4oYnVmZmVyKSwgc3RkOjptaW4oYnl0ZXMsIGF2YWlsVG9SZWFkKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoImRhdGEgbWVzc2FnZSBxdWV1ZSByZWFkIGZhaWxlZCBmb3IgXCJyZWFkXCIiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQUxPR1dfSUYoYXZhaWxUb1JlYWQgIT0gcmVhZFN0YXR1cy5yZXBseS5yZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgIkhBTCByZWFkIHJlcG9ydCBpbmNvbnNpc3RlbnQ6IG1xID0gJWQsIHN0YXR1cyA9ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIChpbnQzMl90KWF2YWlsVG9SZWFkLCAoaW50MzJfdClyZWFkU3RhdHVzLnJlcGx5LnJlYWQpOworICAgICAgICAgICAgICAgICpyZWFkID0gcmVhZFN0YXR1cy5yZXBseS5yZWFkOworICAgICAgICAgICAgfSk7CisgICAgbVN0cmVhbVBvd2VyTG9nLmxvZyhidWZmZXIsICpyZWFkKTsKKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OmNhbGxSZWFkZXJUaHJlYWQoCisgICAgICAgIGNvbnN0IFJlYWRQYXJhbWV0ZXJzJiBwYXJhbXMsIGNvbnN0IGNoYXIqIGNtZE5hbWUsCisgICAgICAgIFN0cmVhbUluSGFsSGlkbDo6UmVhZGVyQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICBpZiAoIW1Db21tYW5kTVEtPndyaXRlKCZwYXJhbXMpKSB7CisgICAgICAgIEFMT0dXKCJjb21tYW5kIG1lc3NhZ2UgcXVldWUgd3JpdGUgZmFpbGVkIik7CisgICAgICAgIHJldHVybiAtRUFHQUlOOworICAgIH0KKyAgICBtRWZHcm91cC0+d2FrZShzdGF0aWNfY2FzdDx1aW50MzJfdD4oTWVzc2FnZVF1ZXVlRmxhZ0JpdHM6Ok5PVF9GVUxMKSk7CisKKyAgICAvLyBUT0RPOiBSZW1vdmUgbWFudWFsIGV2ZW50IGZsYWcgaGFuZGxpbmcgb25jZSBibG9ja2luZyBNUSBpcyBpbXBsZW1lbnRlZC4gYi8zMzgxNTQyMgorICAgIHVpbnQzMl90IGVmU3RhdGUgPSAwOworcmV0cnk6CisgICAgc3RhdHVzX3QgcmV0ID0gbUVmR3JvdXAtPndhaXQoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpOT1RfRU1QVFkpLCAmZWZTdGF0ZSk7CisgICAgaWYgKGVmU3RhdGUgJiBzdGF0aWNfY2FzdDx1aW50MzJfdD4oTWVzc2FnZVF1ZXVlRmxhZ0JpdHM6Ok5PVF9FTVBUWSkpIHsKKyAgICAgICAgUmVhZFN0YXR1cyByZWFkU3RhdHVzOworICAgICAgICByZWFkU3RhdHVzLnJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOworICAgICAgICBpZiAoIW1TdGF0dXNNUS0+cmVhZCgmcmVhZFN0YXR1cykpIHsKKyAgICAgICAgICAgIEFMT0dFKCJzdGF0dXMgbWVzc2FnZSByZWFkIGZhaWxlZCBmb3IgXCIlc1wiIiwgY21kTmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgIGlmIChyZWFkU3RhdHVzLnJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICByZXQgPSBPSzsKKyAgICAgICAgICAgIGNhbGxiYWNrKHJlYWRTdGF0dXMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0ID0gcHJvY2Vzc1JldHVybihjbWROYW1lLCByZWFkU3RhdHVzLnJldHZhbCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgaWYgKHJldCA9PSAtRUFHQUlOIHx8IHJldCA9PSAtRUlOVFIpIHsKKyAgICAgICAgLy8gU3B1cmlvdXMgd2FrZXVwLiBUaGlzIG5vcm1hbGx5IHJldHJpZXMgbm8gbW9yZSB0aGFuIG9uY2UuCisgICAgICAgIGdvdG8gcmV0cnk7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6cHJlcGFyZUZvclJlYWRpbmcoc2l6ZV90IGJ1ZmZlclNpemUpIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q29tbWFuZE1RPiB0ZW1wQ29tbWFuZE1ROworICAgIHN0ZDo6dW5pcXVlX3B0cjxEYXRhTVE+IHRlbXBEYXRhTVE7CisgICAgc3RkOjp1bmlxdWVfcHRyPFN0YXR1c01RPiB0ZW1wU3RhdHVzTVE7CisgICAgUmVzdWx0IHJldHZhbDsKKyAgICBwaWRfdCBoYWxUaHJlYWRQaWQsIGhhbFRocmVhZFRpZDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+cHJlcGFyZUZvclJlYWRpbmcoCisgICAgICAgICAgICAxLCBidWZmZXJTaXplLAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBDb21tYW5kTVE6OkRlc2NyaXB0b3ImIGNvbW1hbmRNUSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgRGF0YU1ROjpEZXNjcmlwdG9yJiBkYXRhTVEsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0YXR1c01ROjpEZXNjcmlwdG9yJiBzdGF0dXNNUSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyZWFkSW5mbyYgaGFsVGhyZWFkSW5mbykgeworICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgIHRlbXBDb21tYW5kTVEucmVzZXQobmV3IENvbW1hbmRNUShjb21tYW5kTVEpKTsKKyAgICAgICAgICAgICAgICAgICAgdGVtcERhdGFNUS5yZXNldChuZXcgRGF0YU1RKGRhdGFNUSkpOworICAgICAgICAgICAgICAgICAgICB0ZW1wU3RhdHVzTVEucmVzZXQobmV3IFN0YXR1c01RKHN0YXR1c01RKSk7CisgICAgICAgICAgICAgICAgICAgIGlmICh0ZW1wRGF0YU1RLT5pc1ZhbGlkKCkgJiYgdGVtcERhdGFNUS0+Z2V0RXZlbnRGbGFnV29yZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBFdmVudEZsYWc6OmNyZWF0ZUV2ZW50RmxhZyh0ZW1wRGF0YU1RLT5nZXRFdmVudEZsYWdXb3JkKCksICZtRWZHcm91cCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaGFsVGhyZWFkUGlkID0gaGFsVGhyZWFkSW5mby5waWQ7CisgICAgICAgICAgICAgICAgICAgIGhhbFRocmVhZFRpZCA9IGhhbFRocmVhZEluZm8udGlkOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIGlmICghcmV0LmlzT2soKSB8fCByZXR2YWwgIT0gUmVzdWx0OjpPSykgeworICAgICAgICByZXR1cm4gcHJvY2Vzc1JldHVybigicHJlcGFyZUZvclJlYWRpbmciLCByZXQsIHJldHZhbCk7CisgICAgfQorICAgIGlmICghdGVtcENvbW1hbmRNUSB8fCAhdGVtcENvbW1hbmRNUS0+aXNWYWxpZCgpIHx8CisgICAgICAgICAgICAhdGVtcERhdGFNUSB8fCAhdGVtcERhdGFNUS0+aXNWYWxpZCgpIHx8CisgICAgICAgICAgICAhdGVtcFN0YXR1c01RIHx8ICF0ZW1wU3RhdHVzTVEtPmlzVmFsaWQoKSB8fAorICAgICAgICAgICAgIW1FZkdyb3VwKSB7CisgICAgICAgIEFMT0dFX0lGKCF0ZW1wQ29tbWFuZE1RLCAiRmFpbGVkIHRvIG9idGFpbiBjb21tYW5kIG1lc3NhZ2UgcXVldWUgZm9yIHdyaXRpbmciKTsKKyAgICAgICAgQUxPR0VfSUYodGVtcENvbW1hbmRNUSAmJiAhdGVtcENvbW1hbmRNUS0+aXNWYWxpZCgpLAorICAgICAgICAgICAgICAgICJDb21tYW5kIG1lc3NhZ2UgcXVldWUgZm9yIHdyaXRpbmcgaXMgaW52YWxpZCIpOworICAgICAgICBBTE9HRV9JRighdGVtcERhdGFNUSwgIkZhaWxlZCB0byBvYnRhaW4gZGF0YSBtZXNzYWdlIHF1ZXVlIGZvciByZWFkaW5nIik7CisgICAgICAgIEFMT0dFX0lGKHRlbXBEYXRhTVEgJiYgIXRlbXBEYXRhTVEtPmlzVmFsaWQoKSwgIkRhdGEgbWVzc2FnZSBxdWV1ZSBmb3IgcmVhZGluZyBpcyBpbnZhbGlkIik7CisgICAgICAgIEFMT0dFX0lGKCF0ZW1wU3RhdHVzTVEsICJGYWlsZWQgdG8gb2J0YWluIHN0YXR1cyBtZXNzYWdlIHF1ZXVlIGZvciByZWFkaW5nIik7CisgICAgICAgIEFMT0dFX0lGKHRlbXBTdGF0dXNNUSAmJiAhdGVtcFN0YXR1c01RLT5pc1ZhbGlkKCksCisgICAgICAgICAgICAgICAgIlN0YXR1cyBtZXNzYWdlIHF1ZXVlIGZvciByZWFkaW5nIGlzIGludmFsaWQiKTsKKyAgICAgICAgQUxPR0VfSUYoIW1FZkdyb3VwLCAiRXZlbnQgZmxhZyBjcmVhdGlvbiBmb3IgcmVhZGluZyBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIHJlcXVlc3RIYWxUaHJlYWRQcmlvcml0eShoYWxUaHJlYWRQaWQsIGhhbFRocmVhZFRpZCk7CisKKyAgICBtQ29tbWFuZE1RID0gc3RkOjptb3ZlKHRlbXBDb21tYW5kTVEpOworICAgIG1EYXRhTVEgPSBzdGQ6Om1vdmUodGVtcERhdGFNUSk7CisgICAgbVN0YXR1c01RID0gc3RkOjptb3ZlKHRlbXBTdGF0dXNNUSk7CisgICAgbVJlYWRlckNsaWVudCA9IGdldHRpZCgpOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpnZXRJbnB1dEZyYW1lc0xvc3QodWludDMyX3QgKmZyYW1lc0xvc3QpIHsKKyAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0SW5wdXRGcmFtZXNMb3N0IiwgbVN0cmVhbS0+Z2V0SW5wdXRGcmFtZXNMb3N0KCksIGZyYW1lc0xvc3QpOworfQorCitzdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OmdldENhcHR1cmVQb3NpdGlvbihpbnQ2NF90ICpmcmFtZXMsIGludDY0X3QgKnRpbWUpIHsKKyAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBpZiAobVJlYWRlckNsaWVudCA9PSBnZXR0aWQoKSAmJiBtQ29tbWFuZE1RKSB7CisgICAgICAgIFJlYWRQYXJhbWV0ZXJzIHBhcmFtczsKKyAgICAgICAgcGFyYW1zLmNvbW1hbmQgPSBSZWFkQ29tbWFuZDo6R0VUX0NBUFRVUkVfUE9TSVRJT047CisgICAgICAgIHJldHVybiBjYWxsUmVhZGVyVGhyZWFkKHBhcmFtcywgImdldENhcHR1cmVQb3NpdGlvbiIsCisgICAgICAgICAgICAgICAgWyZdKGNvbnN0IFJlYWRTdGF0dXMmIHJlYWRTdGF0dXMpIHsKKyAgICAgICAgICAgICAgICAgICAgKmZyYW1lcyA9IHJlYWRTdGF0dXMucmVwbHkuY2FwdHVyZVBvc2l0aW9uLmZyYW1lczsKKyAgICAgICAgICAgICAgICAgICAgKnRpbWUgPSByZWFkU3RhdHVzLnJlcGx5LmNhcHR1cmVQb3NpdGlvbi50aW1lOworICAgICAgICAgICAgICAgIH0pOworICAgIH0gZWxzZSB7CisgICAgICAgIFJlc3VsdCByZXR2YWw7CisgICAgICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5nZXRDYXB0dXJlUG9zaXRpb24oCisgICAgICAgICAgICAgICAgWyZdKFJlc3VsdCByLCB1aW50NjRfdCBoaWRsRnJhbWVzLCB1aW50NjRfdCBoaWRsVGltZSkgeworICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICpmcmFtZXMgPSBoaWRsRnJhbWVzOworICAgICAgICAgICAgICAgICAgICAgICAgKnRpbWUgPSBoaWRsVGltZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0Q2FwdHVyZVBvc2l0aW9uIiwgcmV0LCByZXR2YWwpOworICAgIH0KK30KKworI2lmIE1BSk9SX1ZFUlNJT04gPT0gMgorc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpnZXRBY3RpdmVNaWNyb3Bob25lcygKKyAgICAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXMgX191bnVzZWQpIHsKKyAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisKK3N0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6dXBkYXRlU2lua01ldGFkYXRhKGNvbnN0IFNpbmtNZXRhZGF0YSYgLyogc2lua01ldGFkYXRhICovKSB7CisgICAgLy8gQXVkaW8gSEFMIFYyLjAgZG9lcyBub3Qgc3VwcG9ydCBwcm9wYWdhdGluZyBzaW5rIG1ldGFkYXRhCisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorCisjZWxpZiBNQUpPUl9WRVJTSU9OID09IDQKK3N0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6Z2V0QWN0aXZlTWljcm9waG9uZXMoCisgICAgICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4gKm1pY3JvcGhvbmVzSW5mbykgeworICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7CisgICAgUmVzdWx0IHJldHZhbDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+Z2V0QWN0aXZlTWljcm9waG9uZXMoCisgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGhpZGxfdmVjPE1pY3JvcGhvbmVJbmZvPiBtaWNBcnJheUhhbCkgeworICAgICAgICByZXR2YWwgPSByOworICAgICAgICBmb3IgKHNpemVfdCBrID0gMDsgayA8IG1pY0FycmF5SGFsLnNpemUoKTsgaysrKSB7CisgICAgICAgICAgICBhdWRpb19taWNyb3Bob25lX2NoYXJhY3RlcmlzdGljX3QgZHN0OworICAgICAgICAgICAgLy8gY29udmVydAorICAgICAgICAgICAgbWljcm9waG9uZUluZm9Ub0hhbChtaWNBcnJheUhhbFtrXSwgJmRzdCk7CisgICAgICAgICAgICBtZWRpYTo6TWljcm9waG9uZUluZm8gbWljcm9waG9uZSA9IG1lZGlhOjpNaWNyb3Bob25lSW5mbyhkc3QpOworICAgICAgICAgICAgbWljcm9waG9uZXNJbmZvLT5wdXNoX2JhY2sobWljcm9waG9uZSk7CisgICAgICAgIH0KKyAgICB9KTsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0QWN0aXZlTWljcm9waG9uZXMiLCByZXQsIHJldHZhbCk7Cit9CisKK3N0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6dXBkYXRlU2lua01ldGFkYXRhKGNvbnN0IFNpbmtNZXRhZGF0YSYgc2lua01ldGFkYXRhKSB7CisgICAgaGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjo6U2lua01ldGFkYXRhIGhhbE1ldGFkYXRhID0geworICAgICAgICAudHJhY2tzID0gdHJhbnNmb3JtVG9IaWRsVmVjKHNpbmtNZXRhZGF0YS50cmFja3MsCisgICAgICAgICAgICAgIFtdKGNvbnN0IHJlY29yZF90cmFja19tZXRhZGF0YSYgbWV0YWRhdGEpIC0+IFJlY29yZFRyYWNrTWV0YWRhdGEgeworICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKKyAgICAgICAgICAgICAgICAgICAgLnNvdXJjZT1zdGF0aWNfY2FzdDxBdWRpb1NvdXJjZT4obWV0YWRhdGEuc291cmNlKSwKKyAgICAgICAgICAgICAgICAgICAgLmdhaW49bWV0YWRhdGEuZ2FpbiwKKyAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgIH0pfTsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigidXBkYXRlU2lua01ldGFkYXRhIiwgbVN0cmVhbS0+dXBkYXRlU2lua01ldGFkYXRhKGhhbE1ldGFkYXRhKSk7Cit9CisjZW5kaWYKKworfSAvLyBuYW1lc3BhY2UgQ1BQX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvU3RyZWFtSGFsSGlkbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9TdHJlYW1IYWxIaWRsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTVlYzdmMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvU3RyZWFtSGFsSGlkbC5oCkBAIC0wLDAgKzEsMjUzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX1NUUkVBTV9IQUxfSElETF9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX0hBTF9ISURMX0gKKworI2luY2x1ZGUgPGF0b21pYz4KKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vMi4wL0lTdHJlYW0uaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvLzQuMC9JU3RyZWFtLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby8yLjAvSVN0cmVhbUluLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby80LjAvSVN0cmVhbUluLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby8yLjAvSVN0cmVhbU91dC5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vNC4wL0lTdHJlYW1PdXQuaD4KKyNpbmNsdWRlIDxmbXEvRXZlbnRGbGFnLmg+CisjaW5jbHVkZSA8Zm1xL01lc3NhZ2VRdWV1ZS5oPgorI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL1N0cmVhbUhhbEludGVyZmFjZS5oPgorCisjaW5jbHVkZSAiQ29udmVyc2lvbkhlbHBlckhpZGwuaCIKKyNpbmNsdWRlICJTdHJlYW1Qb3dlckxvZy5oIgorCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT046OklTdHJlYW07Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT046OklTdHJlYW1JbjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjo6SVN0cmVhbU91dDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OkV2ZW50RmxhZzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Ok1lc3NhZ2VRdWV1ZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIFJlYWRQYXJhbWV0ZXJzID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOjpJU3RyZWFtSW46OlJlYWRQYXJhbWV0ZXJzOwordXNpbmcgUmVhZFN0YXR1cyA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjo6SVN0cmVhbUluOjpSZWFkU3RhdHVzOwordXNpbmcgV3JpdGVDb21tYW5kID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOjpJU3RyZWFtT3V0OjpXcml0ZUNvbW1hbmQ7Cit1c2luZyBXcml0ZVN0YXR1cyA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjo6SVN0cmVhbU91dDo6V3JpdGVTdGF0dXM7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBDUFBfVkVSU0lPTiB7CisKK2NsYXNzIERldmljZUhhbEhpZGw7CisKK2NsYXNzIFN0cmVhbUhhbEhpZGwgOiBwdWJsaWMgdmlydHVhbCBTdHJlYW1IYWxJbnRlcmZhY2UsIHB1YmxpYyBDb252ZXJzaW9uSGVscGVySGlkbAoreworICBwdWJsaWM6CisgICAgLy8gUmV0dXJuIHRoZSBzYW1wbGluZyByYXRlIGluIEh6IC0gZWcuIDQ0MTAwLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2FtcGxlUmF0ZSh1aW50MzJfdCAqcmF0ZSk7CisKKyAgICAvLyBSZXR1cm4gc2l6ZSBvZiBpbnB1dC9vdXRwdXQgYnVmZmVyIGluIGJ5dGVzIGZvciB0aGlzIHN0cmVhbSAtIGVnLiA0ODAwLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QnVmZmVyU2l6ZShzaXplX3QgKnNpemUpOworCisgICAgLy8gUmV0dXJuIHRoZSBjaGFubmVsIG1hc2suCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRDaGFubmVsTWFzayhhdWRpb19jaGFubmVsX21hc2tfdCAqbWFzayk7CisKKyAgICAvLyBSZXR1cm4gdGhlIGF1ZGlvIGZvcm1hdCAtIGUuZy4gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGb3JtYXQoYXVkaW9fZm9ybWF0X3QgKmZvcm1hdCk7CisKKyAgICAvLyBDb252ZW5pZW5jZSBtZXRob2QuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBdWRpb1Byb3BlcnRpZXMoCisgICAgICAgICAgICB1aW50MzJfdCAqc2FtcGxlUmF0ZSwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgKm1hc2ssIGF1ZGlvX2Zvcm1hdF90ICpmb3JtYXQpOworCisgICAgLy8gU2V0IGF1ZGlvIHN0cmVhbSBwYXJhbWV0ZXJzLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrdlBhaXJzKTsKKworICAgIC8vIEdldCBhdWRpbyBzdHJlYW0gcGFyYW1ldGVycy4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cywgU3RyaW5nOCAqdmFsdWVzKTsKKworICAgIC8vIEFkZCBvciByZW1vdmUgdGhlIGVmZmVjdCBvbiB0aGUgc3RyZWFtLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkRWZmZWN0KHNwPEVmZmVjdEhhbEludGVyZmFjZT4gZWZmZWN0KTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZUVmZmVjdChzcDxFZmZlY3RIYWxJbnRlcmZhY2U+IGVmZmVjdCk7CisKKyAgICAvLyBQdXQgdGhlIGF1ZGlvIGhhcmR3YXJlIGlucHV0L291dHB1dCBpbnRvIHN0YW5kYnkgbW9kZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YW5kYnkoKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQpOworCisgICAgLy8gU3RhcnQgYSBzdHJlYW0gb3BlcmF0aW5nIGluIG1tYXAgbW9kZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KCk7CisKKyAgICAvLyBTdG9wIGEgc3RyZWFtIG9wZXJhdGluZyBpbiBtbWFwIG1vZGUuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7CisKKyAgICAvLyBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBvbiB0aGUgZGF0YSBidWZmZXIgaW4gbW1hcCBtb2RlLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlTW1hcEJ1ZmZlcihpbnQzMl90IG1pblNpemVGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19tbWFwX2J1ZmZlcl9pbmZvICppbmZvKTsKKworICAgIC8vIEdldCBjdXJyZW50IHJlYWQvd3JpdGUgcG9zaXRpb24gaW4gdGhlIG1tYXAgYnVmZmVyCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNbWFwUG9zaXRpb24oc3RydWN0IGF1ZGlvX21tYXBfcG9zaXRpb24gKnBvc2l0aW9uKTsKKworICAgIC8vIFNldCB0aGUgcHJpb3JpdHkgb2YgdGhlIHRocmVhZCB0aGF0IGludGVyYWN0cyB3aXRoIHRoZSBIQUwKKyAgICAvLyAobXVzdCBtYXRjaCB0aGUgcHJpb3JpdHkgb2YgdGhlIGF1ZGlvZmxpbmdlcidzIHRocmVhZCB0aGF0IGNhbGxzICdyZWFkJyAvICd3cml0ZScpCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRIYWxUaHJlYWRQcmlvcml0eShpbnQgcHJpb3JpdHkpOworCisgIHByb3RlY3RlZDoKKyAgICAvLyBTdWJjbGFzc2VzIGNhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KKyAgICBleHBsaWNpdCBTdHJlYW1IYWxIaWRsKElTdHJlYW0gKnN0cmVhbSk7CisKKyAgICAvLyBUaGUgZGVzdHJ1Y3RvciBhdXRvbWF0aWNhbGx5IGNsb3NlcyB0aGUgc3RyZWFtLgorICAgIHZpcnR1YWwgflN0cmVhbUhhbEhpZGwoKTsKKworICAgIHN0YXR1c190IGdldENhY2hlZEJ1ZmZlclNpemUoc2l6ZV90ICpzaXplKTsKKworICAgIGJvb2wgcmVxdWVzdEhhbFRocmVhZFByaW9yaXR5KHBpZF90IHRocmVhZFBpZCwgcGlkX3QgdGhyZWFkSWQpOworCisgICAgLy8gbVN0cmVhbVBvd2VyTG9nIGlzIHVzZWQgZm9yIGF1ZGlvIHNpZ25hbCBwb3dlciBsb2dnaW5nLgorICAgIFN0cmVhbVBvd2VyTG9nIG1TdHJlYW1Qb3dlckxvZzsKKworICBwcml2YXRlOgorICAgIGNvbnN0IGludCBIQUxfVEhSRUFEX1BSSU9SSVRZX0RFRkFVTFQgPSAtMTsKKyAgICBJU3RyZWFtICptU3RyZWFtOworICAgIGludCBtSGFsVGhyZWFkUHJpb3JpdHk7CisgICAgc2l6ZV90IG1DYWNoZWRCdWZmZXJTaXplOworfTsKKworY2xhc3MgU3RyZWFtT3V0SGFsSGlkbCA6IHB1YmxpYyBTdHJlYW1PdXRIYWxJbnRlcmZhY2UsIHB1YmxpYyBTdHJlYW1IYWxIaWRsIHsKKyAgcHVibGljOgorICAgIC8vIFJldHVybiB0aGUgZnJhbWUgc2l6ZSAobnVtYmVyIG9mIGJ5dGVzIHBlciBzYW1wbGUpIG9mIGEgc3RyZWFtLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RnJhbWVTaXplKHNpemVfdCAqc2l6ZSk7CisKKyAgICAvLyBSZXR1cm4gdGhlIGF1ZGlvIGhhcmR3YXJlIGRyaXZlciBlc3RpbWF0ZWQgbGF0ZW5jeSBpbiBtaWxsaXNlY29uZHMuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRMYXRlbmN5KHVpbnQzMl90ICpsYXRlbmN5KTsKKworICAgIC8vIFVzZSB0aGlzIG1ldGhvZCBpbiBzaXR1YXRpb25zIHdoZXJlIGF1ZGlvIG1peGluZyBpcyBkb25lIGluIHRoZSBoYXJkd2FyZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZvbHVtZShmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCk7CisKKyAgICAvLyBXcml0ZSBhdWRpbyBidWZmZXIgdG8gZHJpdmVyLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgd3JpdGUoY29uc3Qgdm9pZCAqYnVmZmVyLCBzaXplX3QgYnl0ZXMsIHNpemVfdCAqd3JpdHRlbik7CisKKyAgICAvLyBSZXR1cm4gdGhlIG51bWJlciBvZiBhdWRpbyBmcmFtZXMgd3JpdHRlbiBieSB0aGUgYXVkaW8gZHNwIHRvIERBQyBzaW5jZQorICAgIC8vIHRoZSBvdXRwdXQgaGFzIGV4aXRlZCBzdGFuZGJ5LgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UmVuZGVyUG9zaXRpb24odWludDMyX3QgKmRzcEZyYW1lcyk7CisKKyAgICAvLyBHZXQgdGhlIGxvY2FsIHRpbWUgYXQgd2hpY2ggdGhlIG5leHQgd3JpdGUgdG8gdGhlIGF1ZGlvIGRyaXZlciB3aWxsIGJlIHByZXNlbnRlZC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE5leHRXcml0ZVRpbWVzdGFtcChpbnQ2NF90ICp0aW1lc3RhbXApOworCisgICAgLy8gU2V0IHRoZSBjYWxsYmFjayBmb3Igbm90aWZ5aW5nIGNvbXBsZXRpb24gb2Ygbm9uLWJsb2NraW5nIHdyaXRlIGFuZCBkcmFpbi4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldENhbGxiYWNrKHdwPFN0cmVhbU91dEhhbEludGVyZmFjZUNhbGxiYWNrPiBjYWxsYmFjayk7CisKKyAgICAvLyBSZXR1cm5zIHdoZXRoZXIgcGF1c2UgYW5kIHJlc3VtZSBvcGVyYXRpb25zIGFyZSBzdXBwb3J0ZWQuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdXBwb3J0c1BhdXNlQW5kUmVzdW1lKGJvb2wgKnN1cHBvcnRzUGF1c2UsIGJvb2wgKnN1cHBvcnRzUmVzdW1lKTsKKworICAgIC8vIE5vdGlmaWVzIHRvIHRoZSBhdWRpbyBkcml2ZXIgdG8gcmVzdW1lIHBsYXliYWNrIGZvbGxvd2luZyBhIHBhdXNlLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgcGF1c2UoKTsKKworICAgIC8vIE5vdGlmaWVzIHRvIHRoZSBhdWRpbyBkcml2ZXIgdG8gcmVzdW1lIHBsYXliYWNrIGZvbGxvd2luZyBhIHBhdXNlLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVzdW1lKCk7CisKKyAgICAvLyBSZXR1cm5zIHdoZXRoZXIgZHJhaW4gb3BlcmF0aW9uIGlzIHN1cHBvcnRlZC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHN1cHBvcnRzRHJhaW4oYm9vbCAqc3VwcG9ydHNEcmFpbik7CisKKyAgICAvLyBSZXF1ZXN0cyBub3RpZmljYXRpb24gd2hlbiBkYXRhIGJ1ZmZlcmVkIGJ5IHRoZSBkcml2ZXIvaGFyZHdhcmUgaGFzIGJlZW4gcGxheWVkLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZHJhaW4oYm9vbCBlYXJseU5vdGlmeSk7CisKKyAgICAvLyBOb3RpZmllcyB0byB0aGUgYXVkaW8gZHJpdmVyIHRvIGZsdXNoIHRoZSBxdWV1ZWQgZGF0YS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGZsdXNoKCk7CisKKyAgICAvLyBSZXR1cm4gYSByZWNlbnQgY291bnQgb2YgdGhlIG51bWJlciBvZiBhdWRpbyBmcmFtZXMgcHJlc2VudGVkIHRvIGFuIGV4dGVybmFsIG9ic2VydmVyLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UHJlc2VudGF0aW9uUG9zaXRpb24odWludDY0X3QgKmZyYW1lcywgc3RydWN0IHRpbWVzcGVjICp0aW1lc3RhbXApOworCisgICAgLy8gQ2FsbGVkIHdoZW4gdGhlIG1ldGFkYXRhIG9mIHRoZSBzdHJlYW0ncyBzb3VyY2UgaGFzIGJlZW4gY2hhbmdlZC4KKyAgICBzdGF0dXNfdCB1cGRhdGVTb3VyY2VNZXRhZGF0YShjb25zdCBTb3VyY2VNZXRhZGF0YSYgc291cmNlTWV0YWRhdGEpIG92ZXJyaWRlOworCisgICAgLy8gTWV0aG9kcyB1c2VkIGJ5IFN0cmVhbU91dENhbGxiYWNrIChISURMKS4KKyAgICB2b2lkIG9uV3JpdGVSZWFkeSgpOworICAgIHZvaWQgb25EcmFpblJlYWR5KCk7CisgICAgdm9pZCBvbkVycm9yKCk7CisKKyAgcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgRGV2aWNlSGFsSGlkbDsKKyAgICB0eXBlZGVmIE1lc3NhZ2VRdWV1ZTxXcml0ZUNvbW1hbmQsIGhhcmR3YXJlOjprU3luY2hyb25pemVkUmVhZFdyaXRlPiBDb21tYW5kTVE7CisgICAgdHlwZWRlZiBNZXNzYWdlUXVldWU8dWludDhfdCwgaGFyZHdhcmU6OmtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+IERhdGFNUTsKKyAgICB0eXBlZGVmIE1lc3NhZ2VRdWV1ZTxXcml0ZVN0YXR1cywgaGFyZHdhcmU6OmtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+IFN0YXR1c01ROworCisgICAgd3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IG1DYWxsYmFjazsKKyAgICBzcDxJU3RyZWFtT3V0PiBtU3RyZWFtOworICAgIHN0ZDo6dW5pcXVlX3B0cjxDb21tYW5kTVE+IG1Db21tYW5kTVE7CisgICAgc3RkOjp1bmlxdWVfcHRyPERhdGFNUT4gbURhdGFNUTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8U3RhdHVzTVE+IG1TdGF0dXNNUTsKKyAgICBzdGQ6OmF0b21pYzxwaWRfdD4gbVdyaXRlckNsaWVudDsKKyAgICBFdmVudEZsYWcqIG1FZkdyb3VwOworCisgICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgorICAgIFN0cmVhbU91dEhhbEhpZGwoY29uc3Qgc3A8SVN0cmVhbU91dD4mIHN0cmVhbSk7CisKKyAgICB2aXJ0dWFsIH5TdHJlYW1PdXRIYWxIaWRsKCk7CisKKyAgICB1c2luZyBXcml0ZXJDYWxsYmFjayA9IHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBXcml0ZVN0YXR1cyYgd3JpdGVTdGF0dXMpPjsKKyAgICBzdGF0dXNfdCBjYWxsV3JpdGVyVGhyZWFkKAorICAgICAgICAgICAgV3JpdGVDb21tYW5kIGNtZCwgY29uc3QgY2hhciogY21kTmFtZSwKKyAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhU2l6ZSwgV3JpdGVyQ2FsbGJhY2sgY2FsbGJhY2spOworICAgIHN0YXR1c190IHByZXBhcmVGb3JXcml0aW5nKHNpemVfdCBidWZmZXJTaXplKTsKK307CisKK2NsYXNzIFN0cmVhbUluSGFsSGlkbCA6IHB1YmxpYyBTdHJlYW1JbkhhbEludGVyZmFjZSwgcHVibGljIFN0cmVhbUhhbEhpZGwgeworICBwdWJsaWM6CisgICAgLy8gUmV0dXJuIHRoZSBmcmFtZSBzaXplIChudW1iZXIgb2YgYnl0ZXMgcGVyIHNhbXBsZSkgb2YgYSBzdHJlYW0uCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGcmFtZVNpemUoc2l6ZV90ICpzaXplKTsKKworICAgIC8vIFNldCB0aGUgaW5wdXQgZ2FpbiBmb3IgdGhlIGF1ZGlvIGRyaXZlci4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldEdhaW4oZmxvYXQgZ2Fpbik7CisKKyAgICAvLyBSZWFkIGF1ZGlvIGJ1ZmZlciBpbiBmcm9tIGRyaXZlci4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQodm9pZCAqYnVmZmVyLCBzaXplX3QgYnl0ZXMsIHNpemVfdCAqcmVhZCk7CisKKyAgICAvLyBSZXR1cm4gdGhlIGFtb3VudCBvZiBpbnB1dCBmcmFtZXMgbG9zdCBpbiB0aGUgYXVkaW8gZHJpdmVyLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0SW5wdXRGcmFtZXNMb3N0KHVpbnQzMl90ICpmcmFtZXNMb3N0KTsKKworICAgIC8vIFJldHVybiBhIHJlY2VudCBjb3VudCBvZiB0aGUgbnVtYmVyIG9mIGF1ZGlvIGZyYW1lcyByZWNlaXZlZCBhbmQKKyAgICAvLyB0aGUgY2xvY2sgdGltZSBhc3NvY2lhdGVkIHdpdGggdGhhdCBmcmFtZSBjb3VudC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldENhcHR1cmVQb3NpdGlvbihpbnQ2NF90ICpmcmFtZXMsIGludDY0X3QgKnRpbWUpOworCisgICAgLy8gR2V0IGFjdGl2ZSBtaWNyb3Bob25lcworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QWN0aXZlTWljcm9waG9uZXMoc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXMpOworCisgICAgLy8gQ2FsbGVkIHdoZW4gdGhlIG1ldGFkYXRhIG9mIHRoZSBzdHJlYW0ncyBzaW5rIGhhcyBiZWVuIGNoYW5nZWQuCisgICAgc3RhdHVzX3QgdXBkYXRlU2lua01ldGFkYXRhKGNvbnN0IFNpbmtNZXRhZGF0YSYgc2lua01ldGFkYXRhKSBvdmVycmlkZTsKKworICBwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBEZXZpY2VIYWxIaWRsOworICAgIHR5cGVkZWYgTWVzc2FnZVF1ZXVlPFJlYWRQYXJhbWV0ZXJzLCBoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZT4gQ29tbWFuZE1ROworICAgIHR5cGVkZWYgTWVzc2FnZVF1ZXVlPHVpbnQ4X3QsIGhhcmR3YXJlOjprU3luY2hyb25pemVkUmVhZFdyaXRlPiBEYXRhTVE7CisgICAgdHlwZWRlZiBNZXNzYWdlUXVldWU8UmVhZFN0YXR1cywgaGFyZHdhcmU6OmtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+IFN0YXR1c01ROworCisgICAgc3A8SVN0cmVhbUluPiBtU3RyZWFtOworICAgIHN0ZDo6dW5pcXVlX3B0cjxDb21tYW5kTVE+IG1Db21tYW5kTVE7CisgICAgc3RkOjp1bmlxdWVfcHRyPERhdGFNUT4gbURhdGFNUTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8U3RhdHVzTVE+IG1TdGF0dXNNUTsKKyAgICBzdGQ6OmF0b21pYzxwaWRfdD4gbVJlYWRlckNsaWVudDsKKyAgICBFdmVudEZsYWcqIG1FZkdyb3VwOworCisgICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgorICAgIFN0cmVhbUluSGFsSGlkbChjb25zdCBzcDxJU3RyZWFtSW4+JiBzdHJlYW0pOworCisgICAgdmlydHVhbCB+U3RyZWFtSW5IYWxIaWRsKCk7CisKKyAgICB1c2luZyBSZWFkZXJDYWxsYmFjayA9IHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBSZWFkU3RhdHVzJiByZWFkU3RhdHVzKT47CisgICAgc3RhdHVzX3QgY2FsbFJlYWRlclRocmVhZCgKKyAgICAgICAgICAgIGNvbnN0IFJlYWRQYXJhbWV0ZXJzJiBwYXJhbXMsIGNvbnN0IGNoYXIqIGNtZE5hbWUsIFJlYWRlckNhbGxiYWNrIGNhbGxiYWNrKTsKKyAgICBzdGF0dXNfdCBwcmVwYXJlRm9yUmVhZGluZyhzaXplX3QgYnVmZmVyU2l6ZSk7Cit9OworCit9IC8vIG5hbWVzcGFjZSBDUFBfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9TVFJFQU1fSEFMX0hJRExfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9TdHJlYW1IYWxMb2NhbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL1N0cmVhbUhhbExvY2FsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTM0ZjU3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9TdHJlYW1IYWxMb2NhbC5jcHAKQEAgLTAsMCArMSwzNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIlN0cmVhbUhhbExvY2FsIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8aGFyZHdhcmUvYXVkaW8uaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIkRldmljZUhhbExvY2FsLmgiCisjaW5jbHVkZSAiU3RyZWFtSGFsTG9jYWwuaCIKKyNpbmNsdWRlICJWZXJzaW9uVXRpbHMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIENQUF9WRVJTSU9OIHsKKworU3RyZWFtSGFsTG9jYWw6OlN0cmVhbUhhbExvY2FsKGF1ZGlvX3N0cmVhbV90ICpzdHJlYW0sIHNwPERldmljZUhhbExvY2FsPiBkZXZpY2UpCisgICAgICAgIDogbURldmljZShkZXZpY2UpLAorICAgICAgICAgIG1TdHJlYW0oc3RyZWFtKSB7CisgICAgLy8gSW5zdHJ1bWVudCBhdWRpbyBzaWduYWwgcG93ZXIgbG9nZ2luZy4KKyAgICAvLyBOb3RlOiBUaGlzIGFzc3VtZXMgY2hhbm5lbCBtYXNrLCBmb3JtYXQsIGFuZCBzYW1wbGUgcmF0ZSBkbyBub3QgY2hhbmdlIGFmdGVyIGNyZWF0aW9uLgorICAgIGlmIChtU3RyZWFtICE9IG51bGxwdHIgJiYgbVN0cmVhbVBvd2VyTG9nLmlzVXNlckRlYnVnT3JFbmdCdWlsZCgpKSB7CisgICAgICAgIG1TdHJlYW1Qb3dlckxvZy5pbml0KG1TdHJlYW0tPmdldF9zYW1wbGVfcmF0ZShtU3RyZWFtKSwKKyAgICAgICAgICAgICAgICBtU3RyZWFtLT5nZXRfY2hhbm5lbHMobVN0cmVhbSksCisgICAgICAgICAgICAgICAgbVN0cmVhbS0+Z2V0X2Zvcm1hdChtU3RyZWFtKSk7CisgICAgfQorfQorCitTdHJlYW1IYWxMb2NhbDo6flN0cmVhbUhhbExvY2FsKCkgeworICAgIG1TdHJlYW0gPSAwOworICAgIG1EZXZpY2UuY2xlYXIoKTsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OmdldFNhbXBsZVJhdGUodWludDMyX3QgKnJhdGUpIHsKKyAgICAqcmF0ZSA9IG1TdHJlYW0tPmdldF9zYW1wbGVfcmF0ZShtU3RyZWFtKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbExvY2FsOjpnZXRCdWZmZXJTaXplKHNpemVfdCAqc2l6ZSkgeworICAgICpzaXplID0gbVN0cmVhbS0+Z2V0X2J1ZmZlcl9zaXplKG1TdHJlYW0pOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OmdldENoYW5uZWxNYXNrKGF1ZGlvX2NoYW5uZWxfbWFza190ICptYXNrKSB7CisgICAgKm1hc2sgPSBtU3RyZWFtLT5nZXRfY2hhbm5lbHMobVN0cmVhbSk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6Z2V0Rm9ybWF0KGF1ZGlvX2Zvcm1hdF90ICpmb3JtYXQpIHsKKyAgICAqZm9ybWF0ID0gbVN0cmVhbS0+Z2V0X2Zvcm1hdChtU3RyZWFtKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbExvY2FsOjpnZXRBdWRpb1Byb3BlcnRpZXMoCisgICAgICAgIHVpbnQzMl90ICpzYW1wbGVSYXRlLCBhdWRpb19jaGFubmVsX21hc2tfdCAqbWFzaywgYXVkaW9fZm9ybWF0X3QgKmZvcm1hdCkgeworICAgICpzYW1wbGVSYXRlID0gbVN0cmVhbS0+Z2V0X3NhbXBsZV9yYXRlKG1TdHJlYW0pOworICAgICptYXNrID0gbVN0cmVhbS0+Z2V0X2NoYW5uZWxzKG1TdHJlYW0pOworICAgICpmb3JtYXQgPSBtU3RyZWFtLT5nZXRfZm9ybWF0KG1TdHJlYW0pOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OnNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycykgeworICAgIHJldHVybiBtU3RyZWFtLT5zZXRfcGFyYW1ldGVycyhtU3RyZWFtLCBrdlBhaXJzLnN0cmluZygpKTsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OmdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cywgU3RyaW5nOCAqdmFsdWVzKSB7CisgICAgY2hhciAqaGFsVmFsdWVzID0gbVN0cmVhbS0+Z2V0X3BhcmFtZXRlcnMobVN0cmVhbSwga2V5cy5zdHJpbmcoKSk7CisgICAgaWYgKGhhbFZhbHVlcyAhPSBOVUxMKSB7CisgICAgICAgIHZhbHVlcy0+c2V0VG8oaGFsVmFsdWVzKTsKKyAgICAgICAgZnJlZShoYWxWYWx1ZXMpOworICAgIH0gZWxzZSB7CisgICAgICAgIHZhbHVlcy0+Y2xlYXIoKTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6YWRkRWZmZWN0KHNwPEVmZmVjdEhhbEludGVyZmFjZT4pIHsKKyAgICBMT0dfQUxXQVlTX0ZBVEFMKCJMb2NhbCBzdHJlYW1zIGNhbiBub3QgaGF2ZSBlZmZlY3RzIik7CisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6cmVtb3ZlRWZmZWN0KHNwPEVmZmVjdEhhbEludGVyZmFjZT4pIHsKKyAgICBMT0dfQUxXQVlTX0ZBVEFMKCJMb2NhbCBzdHJlYW1zIGNhbiBub3QgaGF2ZSBlZmZlY3RzIik7CisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6c3RhbmRieSgpIHsKKyAgICByZXR1cm4gbVN0cmVhbS0+c3RhbmRieShtU3RyZWFtKTsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OmR1bXAoaW50IGZkKSB7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbVN0cmVhbS0+ZHVtcChtU3RyZWFtLCBmZCk7CisgICAgbVN0cmVhbVBvd2VyTG9nLmR1bXAoZmQpOworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbExvY2FsOjpzZXRIYWxUaHJlYWRQcmlvcml0eShpbnQpIHsKKyAgICAvLyBEb24ndCBuZWVkIHRvIGRvIGFueXRoaW5nIGFzIGxvY2FsIGhhbCBpcyBleGVjdXRlZCBieSBhdWRpb2ZsaW5nZXIgZGlyZWN0bHkKKyAgICAvLyBvbiB0aGUgc2FtZSB0aHJlYWQuCisgICAgcmV0dXJuIE9LOworfQorCitTdHJlYW1PdXRIYWxMb2NhbDo6U3RyZWFtT3V0SGFsTG9jYWwoYXVkaW9fc3RyZWFtX291dF90ICpzdHJlYW0sIHNwPERldmljZUhhbExvY2FsPiBkZXZpY2UpCisgICAgICAgIDogU3RyZWFtSGFsTG9jYWwoJnN0cmVhbS0+Y29tbW9uLCBkZXZpY2UpLCBtU3RyZWFtKHN0cmVhbSkgeworfQorCitTdHJlYW1PdXRIYWxMb2NhbDo6flN0cmVhbU91dEhhbExvY2FsKCkgeworICAgIG1DYWxsYmFjay5jbGVhcigpOworICAgIG1EZXZpY2UtPmNsb3NlT3V0cHV0U3RyZWFtKG1TdHJlYW0pOworICAgIG1TdHJlYW0gPSAwOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6Z2V0RnJhbWVTaXplKHNpemVfdCAqc2l6ZSkgeworICAgICpzaXplID0gYXVkaW9fc3RyZWFtX291dF9mcmFtZV9zaXplKG1TdHJlYW0pOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OmdldExhdGVuY3kodWludDMyX3QgKmxhdGVuY3kpIHsKKyAgICAqbGF0ZW5jeSA9IG1TdHJlYW0tPmdldF9sYXRlbmN5KG1TdHJlYW0pOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnNldFZvbHVtZShmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCkgeworICAgIGlmIChtU3RyZWFtLT5zZXRfdm9sdW1lID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbVN0cmVhbS0+c2V0X3ZvbHVtZShtU3RyZWFtLCBsZWZ0LCByaWdodCk7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjp3cml0ZShjb25zdCB2b2lkICpidWZmZXIsIHNpemVfdCBieXRlcywgc2l6ZV90ICp3cml0dGVuKSB7CisgICAgc3NpemVfdCB3cml0ZVJlc3VsdCA9IG1TdHJlYW0tPndyaXRlKG1TdHJlYW0sIGJ1ZmZlciwgYnl0ZXMpOworICAgIGlmICh3cml0ZVJlc3VsdCA+IDApIHsKKyAgICAgICAgKndyaXR0ZW4gPSB3cml0ZVJlc3VsdDsKKyAgICAgICAgbVN0cmVhbVBvd2VyTG9nLmxvZyhidWZmZXIsICp3cml0dGVuKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0gZWxzZSB7CisgICAgICAgICp3cml0dGVuID0gMDsKKyAgICAgICAgcmV0dXJuIHdyaXRlUmVzdWx0OworICAgIH0KK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OmdldFJlbmRlclBvc2l0aW9uKHVpbnQzMl90ICpkc3BGcmFtZXMpIHsKKyAgICByZXR1cm4gbVN0cmVhbS0+Z2V0X3JlbmRlcl9wb3NpdGlvbihtU3RyZWFtLCBkc3BGcmFtZXMpOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6Z2V0TmV4dFdyaXRlVGltZXN0YW1wKGludDY0X3QgKnRpbWVzdGFtcCkgeworICAgIGlmIChtU3RyZWFtLT5nZXRfbmV4dF93cml0ZV90aW1lc3RhbXAgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBtU3RyZWFtLT5nZXRfbmV4dF93cml0ZV90aW1lc3RhbXAobVN0cmVhbSwgdGltZXN0YW1wKTsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnNldENhbGxiYWNrKHdwPFN0cmVhbU91dEhhbEludGVyZmFjZUNhbGxiYWNrPiBjYWxsYmFjaykgeworICAgIGlmIChtU3RyZWFtLT5zZXRfY2FsbGJhY2sgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHN0YXR1c190IHJlc3VsdCA9IG1TdHJlYW0tPnNldF9jYWxsYmFjayhtU3RyZWFtLCBTdHJlYW1PdXRIYWxMb2NhbDo6YXN5bmNDYWxsYmFjaywgdGhpcyk7CisgICAgaWYgKHJlc3VsdCA9PSBPSykgeworICAgICAgICBtQ2FsbGJhY2sgPSBjYWxsYmFjazsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworLy8gc3RhdGljCitpbnQgU3RyZWFtT3V0SGFsTG9jYWw6OmFzeW5jQ2FsbGJhY2soc3RyZWFtX2NhbGxiYWNrX2V2ZW50X3QgZXZlbnQsIHZvaWQqLCB2b2lkICpjb29raWUpIHsKKyAgICAvLyBXZSBhY3QgYXMgaWYgd2UgZ2F2ZSBhIHdwPFN0cmVhbU91dEhhbExvY2FsPiB0byBIQUwuIFRoaXMgd2F5IHdlIHNob3VsZCBoYW5kbGUKKyAgICAvLyBjb3JyZWN0bHkgdGhlIGNhc2Ugd2hlbiB0aGUgY2FsbGJhY2sgaXMgaW52b2tlZCB3aGlsZSBTdHJlYW1PdXRIYWxMb2NhbCdzIGRlc3RydWN0b3IgaXMKKyAgICAvLyBhbHJlYWR5IHJ1bm5pbmcsIGJlY2F1c2UgdGhlIGRlc3RydWN0b3IgaXMgaW52b2tlZCBhZnRlciB0aGUgcmVmY291bnQgaGFzIGJlZW4gYXRvbWljYWxseQorICAgIC8vIGRlY3JlbWVudGVkLgorICAgIHdwPFN0cmVhbU91dEhhbExvY2FsPiB3ZWFrU2VsZihzdGF0aWNfY2FzdDxTdHJlYW1PdXRIYWxMb2NhbCo+KGNvb2tpZSkpOworICAgIHNwPFN0cmVhbU91dEhhbExvY2FsPiBzZWxmID0gd2Vha1NlbGYucHJvbW90ZSgpOworICAgIGlmIChzZWxmID09IDApIHJldHVybiAwOworICAgIHNwPFN0cmVhbU91dEhhbEludGVyZmFjZUNhbGxiYWNrPiBjYWxsYmFjayA9IHNlbGYtPm1DYWxsYmFjay5wcm9tb3RlKCk7CisgICAgaWYgKGNhbGxiYWNrID09IDApIHJldHVybiAwOworICAgIEFMT0dWKCJhc3luY0NhbGxiYWNrKCkgZXZlbnQgJWQiLCBldmVudCk7CisgICAgc3dpdGNoIChldmVudCkgeworICAgICAgICBjYXNlIFNUUkVBTV9DQktfRVZFTlRfV1JJVEVfUkVBRFk6CisgICAgICAgICAgICBjYWxsYmFjay0+b25Xcml0ZVJlYWR5KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTVFJFQU1fQ0JLX0VWRU5UX0RSQUlOX1JFQURZOgorICAgICAgICAgICAgY2FsbGJhY2stPm9uRHJhaW5SZWFkeSgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU1RSRUFNX0NCS19FVkVOVF9FUlJPUjoKKyAgICAgICAgICAgIGNhbGxiYWNrLT5vbkVycm9yKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dXKCJhc3luY0NhbGxiYWNrKCkgdW5rbm93biBldmVudCAlZCIsIGV2ZW50KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnN1cHBvcnRzUGF1c2VBbmRSZXN1bWUoYm9vbCAqc3VwcG9ydHNQYXVzZSwgYm9vbCAqc3VwcG9ydHNSZXN1bWUpIHsKKyAgICAqc3VwcG9ydHNQYXVzZSA9IG1TdHJlYW0tPnBhdXNlICE9IE5VTEw7CisgICAgKnN1cHBvcnRzUmVzdW1lID0gbVN0cmVhbS0+cmVzdW1lICE9IE5VTEw7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6cGF1c2UoKSB7CisgICAgaWYgKG1TdHJlYW0tPnBhdXNlID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbVN0cmVhbS0+cGF1c2UobVN0cmVhbSk7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpyZXN1bWUoKSB7CisgICAgaWYgKG1TdHJlYW0tPnJlc3VtZSA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIG1TdHJlYW0tPnJlc3VtZShtU3RyZWFtKTsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnN1cHBvcnRzRHJhaW4oYm9vbCAqc3VwcG9ydHNEcmFpbikgeworICAgICpzdXBwb3J0c0RyYWluID0gbVN0cmVhbS0+ZHJhaW4gIT0gTlVMTDsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpkcmFpbihib29sIGVhcmx5Tm90aWZ5KSB7CisgICAgaWYgKG1TdHJlYW0tPmRyYWluID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbVN0cmVhbS0+ZHJhaW4obVN0cmVhbSwgZWFybHlOb3RpZnkgPyBBVURJT19EUkFJTl9FQVJMWV9OT1RJRlkgOiBBVURJT19EUkFJTl9BTEwpOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6Zmx1c2goKSB7CisgICAgaWYgKG1TdHJlYW0tPmZsdXNoID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbVN0cmVhbS0+Zmx1c2gobVN0cmVhbSk7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpnZXRQcmVzZW50YXRpb25Qb3NpdGlvbih1aW50NjRfdCAqZnJhbWVzLCBzdHJ1Y3QgdGltZXNwZWMgKnRpbWVzdGFtcCkgeworICAgIGlmIChtU3RyZWFtLT5nZXRfcHJlc2VudGF0aW9uX3Bvc2l0aW9uID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbVN0cmVhbS0+Z2V0X3ByZXNlbnRhdGlvbl9wb3NpdGlvbihtU3RyZWFtLCBmcmFtZXMsIHRpbWVzdGFtcCk7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjp1cGRhdGVTb3VyY2VNZXRhZGF0YShjb25zdCBTb3VyY2VNZXRhZGF0YSYgc291cmNlTWV0YWRhdGEpIHsKKyAgICBpZiAobVN0cmVhbS0+dXBkYXRlX3NvdXJjZV9tZXRhZGF0YSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisgICAgY29uc3Qgc291cmNlX21ldGFkYXRhX3QgbWV0YWRhdGEgeworICAgICAgICAudHJhY2tfY291bnQgPSBzb3VyY2VNZXRhZGF0YS50cmFja3Muc2l6ZSgpLAorICAgICAgICAvLyBjb25zdCBjYXN0IGlzIGZpbmUgYXMgaXQgaXMgaW4gYSBjb25zdCBzdHJ1Y3R1cmUKKyAgICAgICAgLnRyYWNrcyA9IGNvbnN0X2Nhc3Q8cGxheWJhY2tfdHJhY2tfbWV0YWRhdGEqPihzb3VyY2VNZXRhZGF0YS50cmFja3MuZGF0YSgpKSwKKyAgICB9OworICAgIG1TdHJlYW0tPnVwZGF0ZV9zb3VyY2VfbWV0YWRhdGEobVN0cmVhbSwgJm1ldGFkYXRhKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpzdGFydCgpIHsKKyAgICBpZiAobVN0cmVhbS0+c3RhcnQgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBtU3RyZWFtLT5zdGFydChtU3RyZWFtKTsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnN0b3AoKSB7CisgICAgaWYgKG1TdHJlYW0tPnN0b3AgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBtU3RyZWFtLT5zdG9wKG1TdHJlYW0pOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6Y3JlYXRlTW1hcEJ1ZmZlcihpbnQzMl90IG1pblNpemVGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX21tYXBfYnVmZmVyX2luZm8gKmluZm8pIHsKKyAgICBpZiAobVN0cmVhbS0+Y3JlYXRlX21tYXBfYnVmZmVyID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbVN0cmVhbS0+Y3JlYXRlX21tYXBfYnVmZmVyKG1TdHJlYW0sIG1pblNpemVGcmFtZXMsIGluZm8pOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6Z2V0TW1hcFBvc2l0aW9uKHN0cnVjdCBhdWRpb19tbWFwX3Bvc2l0aW9uICpwb3NpdGlvbikgeworICAgIGlmIChtU3RyZWFtLT5nZXRfbW1hcF9wb3NpdGlvbiA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIG1TdHJlYW0tPmdldF9tbWFwX3Bvc2l0aW9uKG1TdHJlYW0sIHBvc2l0aW9uKTsKK30KKworU3RyZWFtSW5IYWxMb2NhbDo6U3RyZWFtSW5IYWxMb2NhbChhdWRpb19zdHJlYW1faW5fdCAqc3RyZWFtLCBzcDxEZXZpY2VIYWxMb2NhbD4gZGV2aWNlKQorICAgICAgICA6IFN0cmVhbUhhbExvY2FsKCZzdHJlYW0tPmNvbW1vbiwgZGV2aWNlKSwgbVN0cmVhbShzdHJlYW0pIHsKK30KKworU3RyZWFtSW5IYWxMb2NhbDo6flN0cmVhbUluSGFsTG9jYWwoKSB7CisgICAgbURldmljZS0+Y2xvc2VJbnB1dFN0cmVhbShtU3RyZWFtKTsKKyAgICBtU3RyZWFtID0gMDsKK30KKworc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6Z2V0RnJhbWVTaXplKHNpemVfdCAqc2l6ZSkgeworICAgICpzaXplID0gYXVkaW9fc3RyZWFtX2luX2ZyYW1lX3NpemUobVN0cmVhbSk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpzZXRHYWluKGZsb2F0IGdhaW4pIHsKKyAgICByZXR1cm4gbVN0cmVhbS0+c2V0X2dhaW4obVN0cmVhbSwgZ2Fpbik7Cit9CisKK3N0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OnJlYWQodm9pZCAqYnVmZmVyLCBzaXplX3QgYnl0ZXMsIHNpemVfdCAqcmVhZCkgeworICAgIHNzaXplX3QgcmVhZFJlc3VsdCA9IG1TdHJlYW0tPnJlYWQobVN0cmVhbSwgYnVmZmVyLCBieXRlcyk7CisgICAgaWYgKHJlYWRSZXN1bHQgPiAwKSB7CisgICAgICAgICpyZWFkID0gcmVhZFJlc3VsdDsKKyAgICAgICAgbVN0cmVhbVBvd2VyTG9nLmxvZyggYnVmZmVyLCAqcmVhZCk7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9IGVsc2UgeworICAgICAgICAqcmVhZCA9IDA7CisgICAgICAgIHJldHVybiByZWFkUmVzdWx0OworICAgIH0KK30KKworc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6Z2V0SW5wdXRGcmFtZXNMb3N0KHVpbnQzMl90ICpmcmFtZXNMb3N0KSB7CisgICAgKmZyYW1lc0xvc3QgPSBtU3RyZWFtLT5nZXRfaW5wdXRfZnJhbWVzX2xvc3QobVN0cmVhbSk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpnZXRDYXB0dXJlUG9zaXRpb24oaW50NjRfdCAqZnJhbWVzLCBpbnQ2NF90ICp0aW1lKSB7CisgICAgaWYgKG1TdHJlYW0tPmdldF9jYXB0dXJlX3Bvc2l0aW9uID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbVN0cmVhbS0+Z2V0X2NhcHR1cmVfcG9zaXRpb24obVN0cmVhbSwgZnJhbWVzLCB0aW1lKTsKK30KKworc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6dXBkYXRlU2lua01ldGFkYXRhKGNvbnN0IFNpbmtNZXRhZGF0YSYgc2lua01ldGFkYXRhKSB7CisgICAgaWYgKG1TdHJlYW0tPnVwZGF0ZV9zaW5rX21ldGFkYXRhID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKyAgICBjb25zdCBzaW5rX21ldGFkYXRhX3QgbWV0YWRhdGEgeworICAgICAgICAudHJhY2tfY291bnQgPSBzaW5rTWV0YWRhdGEudHJhY2tzLnNpemUoKSwKKyAgICAgICAgLy8gY29uc3QgY2FzdCBpcyBmaW5lIGFzIGl0IGlzIGluIGEgY29uc3Qgc3RydWN0dXJlCisgICAgICAgIC50cmFja3MgPSBjb25zdF9jYXN0PHJlY29yZF90cmFja19tZXRhZGF0YSo+KHNpbmtNZXRhZGF0YS50cmFja3MuZGF0YSgpKSwKKyAgICB9OworICAgIG1TdHJlYW0tPnVwZGF0ZV9zaW5rX21ldGFkYXRhKG1TdHJlYW0sICZtZXRhZGF0YSk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpzdGFydCgpIHsKKyAgICBpZiAobVN0cmVhbS0+c3RhcnQgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBtU3RyZWFtLT5zdGFydChtU3RyZWFtKTsKK30KKworc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6c3RvcCgpIHsKKyAgICBpZiAobVN0cmVhbS0+c3RvcCA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIG1TdHJlYW0tPnN0b3AobVN0cmVhbSk7Cit9CisKK3N0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OmNyZWF0ZU1tYXBCdWZmZXIoaW50MzJfdCBtaW5TaXplRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19tbWFwX2J1ZmZlcl9pbmZvICppbmZvKSB7CisgICAgaWYgKG1TdHJlYW0tPmNyZWF0ZV9tbWFwX2J1ZmZlciA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIG1TdHJlYW0tPmNyZWF0ZV9tbWFwX2J1ZmZlcihtU3RyZWFtLCBtaW5TaXplRnJhbWVzLCBpbmZvKTsKK30KKworc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6Z2V0TW1hcFBvc2l0aW9uKHN0cnVjdCBhdWRpb19tbWFwX3Bvc2l0aW9uICpwb3NpdGlvbikgeworICAgIGlmIChtU3RyZWFtLT5nZXRfbW1hcF9wb3NpdGlvbiA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIG1TdHJlYW0tPmdldF9tbWFwX3Bvc2l0aW9uKG1TdHJlYW0sIHBvc2l0aW9uKTsKK30KKworI2lmIE1BSk9SX1ZFUlNJT04gPT0gMgorc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6Z2V0QWN0aXZlTWljcm9waG9uZXMoCisgICAgICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4gKm1pY3JvcGhvbmVzIF9fdW51c2VkKSB7CisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorI2VsaWYgTUFKT1JfVkVSU0lPTiA9PSA0CitzdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpnZXRBY3RpdmVNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lcykgeworICAgIGlmIChtU3RyZWFtLT5nZXRfYWN0aXZlX21pY3JvcGhvbmVzID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICBzaXplX3QgYWN0dWFsX21pY3MgPSBBVURJT19NSUNST1BIT05FX01BWF9DT1VOVDsKKyAgICBhdWRpb19taWNyb3Bob25lX2NoYXJhY3RlcmlzdGljX3QgbWljX2FycmF5W0FVRElPX01JQ1JPUEhPTkVfTUFYX0NPVU5UXTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtU3RyZWFtLT5nZXRfYWN0aXZlX21pY3JvcGhvbmVzKG1TdHJlYW0sICZtaWNfYXJyYXlbMF0sICZhY3R1YWxfbWljcyk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhY3R1YWxfbWljczsgaSsrKSB7CisgICAgICAgIG1lZGlhOjpNaWNyb3Bob25lSW5mbyBtaWNyb3Bob25lSW5mbyA9IG1lZGlhOjpNaWNyb3Bob25lSW5mbyhtaWNfYXJyYXlbaV0pOworICAgICAgICBtaWNyb3Bob25lcy0+cHVzaF9iYWNrKG1pY3JvcGhvbmVJbmZvKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKyNlbmRpZgorCit9IC8vIG5hbWVzcGFjZSBDUFBfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9TdHJlYW1IYWxMb2NhbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9TdHJlYW1IYWxMb2NhbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlYTQyMjkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL1N0cmVhbUhhbExvY2FsLmgKQEAgLTAsMCArMSwyMjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX0hBTF9MT0NBTF9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX0hBTF9MT0NBTF9ICisKKyNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9TdHJlYW1IYWxJbnRlcmZhY2UuaD4KKyNpbmNsdWRlICJTdHJlYW1Qb3dlckxvZy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgQ1BQX1ZFUlNJT04geworCitjbGFzcyBEZXZpY2VIYWxMb2NhbDsKKworY2xhc3MgU3RyZWFtSGFsTG9jYWwgOiBwdWJsaWMgdmlydHVhbCBTdHJlYW1IYWxJbnRlcmZhY2UKK3sKKyAgcHVibGljOgorICAgIC8vIFJldHVybiB0aGUgc2FtcGxpbmcgcmF0ZSBpbiBIeiAtIGVnLiA0NDEwMC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNhbXBsZVJhdGUodWludDMyX3QgKnJhdGUpOworCisgICAgLy8gUmV0dXJuIHNpemUgb2YgaW5wdXQvb3V0cHV0IGJ1ZmZlciBpbiBieXRlcyBmb3IgdGhpcyBzdHJlYW0gLSBlZy4gNDgwMC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEJ1ZmZlclNpemUoc2l6ZV90ICpzaXplKTsKKworICAgIC8vIFJldHVybiB0aGUgY2hhbm5lbCBtYXNrLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Q2hhbm5lbE1hc2soYXVkaW9fY2hhbm5lbF9tYXNrX3QgKm1hc2spOworCisgICAgLy8gUmV0dXJuIHRoZSBhdWRpbyBmb3JtYXQgLSBlLmcuIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Rm9ybWF0KGF1ZGlvX2Zvcm1hdF90ICpmb3JtYXQpOworCisgICAgLy8gQ29udmVuaWVuY2UgbWV0aG9kLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QXVkaW9Qcm9wZXJ0aWVzKAorICAgICAgICAgICAgdWludDMyX3QgKnNhbXBsZVJhdGUsIGF1ZGlvX2NoYW5uZWxfbWFza190ICptYXNrLCBhdWRpb19mb3JtYXRfdCAqZm9ybWF0KTsKKworICAgIC8vIFNldCBhdWRpbyBzdHJlYW0gcGFyYW1ldGVycy4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycyk7CisKKyAgICAvLyBHZXQgYXVkaW8gc3RyZWFtIHBhcmFtZXRlcnMuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMsIFN0cmluZzggKnZhbHVlcyk7CisKKyAgICAvLyBBZGQgb3IgcmVtb3ZlIHRoZSBlZmZlY3Qgb24gdGhlIHN0cmVhbS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGFkZEVmZmVjdChzcDxFZmZlY3RIYWxJbnRlcmZhY2U+IGVmZmVjdCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVFZmZlY3Qoc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiBlZmZlY3QpOworCisgICAgLy8gUHV0IHRoZSBhdWRpbyBoYXJkd2FyZSBpbnB1dC9vdXRwdXQgaW50byBzdGFuZGJ5IG1vZGUuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFuZGJ5KCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkKTsKKworICAgIC8vIFN0YXJ0IGEgc3RyZWFtIG9wZXJhdGluZyBpbiBtbWFwIG1vZGUuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydCgpID0gMDsKKworICAgIC8vIFN0b3AgYSBzdHJlYW0gb3BlcmF0aW5nIGluIG1tYXAgbW9kZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKSA9IDA7CisKKyAgICAvLyBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBvbiB0aGUgZGF0YSBidWZmZXIgaW4gbW1hcCBtb2RlLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlTW1hcEJ1ZmZlcihpbnQzMl90IG1pblNpemVGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19tbWFwX2J1ZmZlcl9pbmZvICppbmZvKSA9IDA7CisKKyAgICAvLyBHZXQgY3VycmVudCByZWFkL3dyaXRlIHBvc2l0aW9uIGluIHRoZSBtbWFwIGJ1ZmZlcgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TW1hcFBvc2l0aW9uKHN0cnVjdCBhdWRpb19tbWFwX3Bvc2l0aW9uICpwb3NpdGlvbikgPSAwOworCisgICAgLy8gU2V0IHRoZSBwcmlvcml0eSBvZiB0aGUgdGhyZWFkIHRoYXQgaW50ZXJhY3RzIHdpdGggdGhlIEhBTAorICAgIC8vIChtdXN0IG1hdGNoIHRoZSBwcmlvcml0eSBvZiB0aGUgYXVkaW9mbGluZ2VyJ3MgdGhyZWFkIHRoYXQgY2FsbHMgJ3JlYWQnIC8gJ3dyaXRlJykKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldEhhbFRocmVhZFByaW9yaXR5KGludCBwcmlvcml0eSk7CisKKyAgcHJvdGVjdGVkOgorICAgIC8vIFN1YmNsYXNzZXMgY2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgorICAgIFN0cmVhbUhhbExvY2FsKGF1ZGlvX3N0cmVhbV90ICpzdHJlYW0sIHNwPERldmljZUhhbExvY2FsPiBkZXZpY2UpOworCisgICAgLy8gVGhlIGRlc3RydWN0b3IgYXV0b21hdGljYWxseSBjbG9zZXMgdGhlIHN0cmVhbS4KKyAgICB2aXJ0dWFsIH5TdHJlYW1IYWxMb2NhbCgpOworCisgICAgc3A8RGV2aWNlSGFsTG9jYWw+IG1EZXZpY2U7CisKKyAgICAvLyBtU3RyZWFtUG93ZXJMb2cgaXMgdXNlZCBmb3IgYXVkaW8gc2lnbmFsIHBvd2VyIGxvZ2dpbmcuCisgICAgU3RyZWFtUG93ZXJMb2cgbVN0cmVhbVBvd2VyTG9nOworCisgIHByaXZhdGU6CisgICAgYXVkaW9fc3RyZWFtX3QgKm1TdHJlYW07Cit9OworCitjbGFzcyBTdHJlYW1PdXRIYWxMb2NhbCA6IHB1YmxpYyBTdHJlYW1PdXRIYWxJbnRlcmZhY2UsIHB1YmxpYyBTdHJlYW1IYWxMb2NhbCB7CisgIHB1YmxpYzoKKyAgICAvLyBSZXR1cm4gdGhlIGZyYW1lIHNpemUgKG51bWJlciBvZiBieXRlcyBwZXIgc2FtcGxlKSBvZiBhIHN0cmVhbS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZyYW1lU2l6ZShzaXplX3QgKnNpemUpOworCisgICAgLy8gUmV0dXJuIHRoZSBhdWRpbyBoYXJkd2FyZSBkcml2ZXIgZXN0aW1hdGVkIGxhdGVuY3kgaW4gbWlsbGlzZWNvbmRzLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TGF0ZW5jeSh1aW50MzJfdCAqbGF0ZW5jeSk7CisKKyAgICAvLyBVc2UgdGhpcyBtZXRob2QgaW4gc2l0dWF0aW9ucyB3aGVyZSBhdWRpbyBtaXhpbmcgaXMgZG9uZSBpbiB0aGUgaGFyZHdhcmUuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWb2x1bWUoZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQpOworCisgICAgLy8gV3JpdGUgYXVkaW8gYnVmZmVyIHRvIGRyaXZlci4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHdyaXRlKGNvbnN0IHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJ5dGVzLCBzaXplX3QgKndyaXR0ZW4pOworCisgICAgLy8gUmV0dXJuIHRoZSBudW1iZXIgb2YgYXVkaW8gZnJhbWVzIHdyaXR0ZW4gYnkgdGhlIGF1ZGlvIGRzcCB0byBEQUMgc2luY2UKKyAgICAvLyB0aGUgb3V0cHV0IGhhcyBleGl0ZWQgc3RhbmRieS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFJlbmRlclBvc2l0aW9uKHVpbnQzMl90ICpkc3BGcmFtZXMpOworCisgICAgLy8gR2V0IHRoZSBsb2NhbCB0aW1lIGF0IHdoaWNoIHRoZSBuZXh0IHdyaXRlIHRvIHRoZSBhdWRpbyBkcml2ZXIgd2lsbCBiZSBwcmVzZW50ZWQuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXROZXh0V3JpdGVUaW1lc3RhbXAoaW50NjRfdCAqdGltZXN0YW1wKTsKKworICAgIC8vIFNldCB0aGUgY2FsbGJhY2sgZm9yIG5vdGlmeWluZyBjb21wbGV0aW9uIG9mIG5vbi1ibG9ja2luZyB3cml0ZSBhbmQgZHJhaW4uCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRDYWxsYmFjayh3cDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gY2FsbGJhY2spOworCisgICAgLy8gUmV0dXJucyB3aGV0aGVyIHBhdXNlIGFuZCByZXN1bWUgb3BlcmF0aW9ucyBhcmUgc3VwcG9ydGVkLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3VwcG9ydHNQYXVzZUFuZFJlc3VtZShib29sICpzdXBwb3J0c1BhdXNlLCBib29sICpzdXBwb3J0c1Jlc3VtZSk7CisKKyAgICAvLyBOb3RpZmllcyB0byB0aGUgYXVkaW8gZHJpdmVyIHRvIHJlc3VtZSBwbGF5YmFjayBmb2xsb3dpbmcgYSBwYXVzZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHBhdXNlKCk7CisKKyAgICAvLyBOb3RpZmllcyB0byB0aGUgYXVkaW8gZHJpdmVyIHRvIHJlc3VtZSBwbGF5YmFjayBmb2xsb3dpbmcgYSBwYXVzZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlc3VtZSgpOworCisgICAgLy8gUmV0dXJucyB3aGV0aGVyIGRyYWluIG9wZXJhdGlvbiBpcyBzdXBwb3J0ZWQuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdXBwb3J0c0RyYWluKGJvb2wgKnN1cHBvcnRzRHJhaW4pOworCisgICAgLy8gUmVxdWVzdHMgbm90aWZpY2F0aW9uIHdoZW4gZGF0YSBidWZmZXJlZCBieSB0aGUgZHJpdmVyL2hhcmR3YXJlIGhhcyBiZWVuIHBsYXllZC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGRyYWluKGJvb2wgZWFybHlOb3RpZnkpOworCisgICAgLy8gTm90aWZpZXMgdG8gdGhlIGF1ZGlvIGRyaXZlciB0byBmbHVzaCB0aGUgcXVldWVkIGRhdGEuCisgICAgdmlydHVhbCBzdGF0dXNfdCBmbHVzaCgpOworCisgICAgLy8gUmV0dXJuIGEgcmVjZW50IGNvdW50IG9mIHRoZSBudW1iZXIgb2YgYXVkaW8gZnJhbWVzIHByZXNlbnRlZCB0byBhbiBleHRlcm5hbCBvYnNlcnZlci4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFByZXNlbnRhdGlvblBvc2l0aW9uKHVpbnQ2NF90ICpmcmFtZXMsIHN0cnVjdCB0aW1lc3BlYyAqdGltZXN0YW1wKTsKKworICAgIC8vIFN0YXJ0IGEgc3RyZWFtIG9wZXJhdGluZyBpbiBtbWFwIG1vZGUuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydCgpOworCisgICAgLy8gU3RvcCBhIHN0cmVhbSBvcGVyYXRpbmcgaW4gbW1hcCBtb2RlLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOworCisgICAgLy8gUmV0cmlldmUgaW5mb3JtYXRpb24gb24gdGhlIGRhdGEgYnVmZmVyIGluIG1tYXAgbW9kZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZU1tYXBCdWZmZXIoaW50MzJfdCBtaW5TaXplRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fbW1hcF9idWZmZXJfaW5mbyAqaW5mbyk7CisKKyAgICAvLyBHZXQgY3VycmVudCByZWFkL3dyaXRlIHBvc2l0aW9uIGluIHRoZSBtbWFwIGJ1ZmZlcgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TW1hcFBvc2l0aW9uKHN0cnVjdCBhdWRpb19tbWFwX3Bvc2l0aW9uICpwb3NpdGlvbik7CisKKyAgICAvLyBDYWxsZWQgd2hlbiB0aGUgbWV0YWRhdGEgb2YgdGhlIHN0cmVhbSdzIHNvdXJjZSBoYXMgYmVlbiBjaGFuZ2VkLgorICAgIHN0YXR1c190IHVwZGF0ZVNvdXJjZU1ldGFkYXRhKGNvbnN0IFNvdXJjZU1ldGFkYXRhJiBzb3VyY2VNZXRhZGF0YSkgb3ZlcnJpZGU7CisKKyAgcHJpdmF0ZToKKyAgICBhdWRpb19zdHJlYW1fb3V0X3QgKm1TdHJlYW07CisgICAgd3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IG1DYWxsYmFjazsKKworICAgIGZyaWVuZCBjbGFzcyBEZXZpY2VIYWxMb2NhbDsKKworICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KKyAgICBTdHJlYW1PdXRIYWxMb2NhbChhdWRpb19zdHJlYW1fb3V0X3QgKnN0cmVhbSwgc3A8RGV2aWNlSGFsTG9jYWw+IGRldmljZSk7CisKKyAgICB2aXJ0dWFsIH5TdHJlYW1PdXRIYWxMb2NhbCgpOworCisgICAgc3RhdGljIGludCBhc3luY0NhbGxiYWNrKHN0cmVhbV9jYWxsYmFja19ldmVudF90IGV2ZW50LCB2b2lkICpwYXJhbSwgdm9pZCAqY29va2llKTsKK307CisKK2NsYXNzIFN0cmVhbUluSGFsTG9jYWwgOiBwdWJsaWMgU3RyZWFtSW5IYWxJbnRlcmZhY2UsIHB1YmxpYyBTdHJlYW1IYWxMb2NhbCB7CisgIHB1YmxpYzoKKyAgICAvLyBSZXR1cm4gdGhlIGZyYW1lIHNpemUgKG51bWJlciBvZiBieXRlcyBwZXIgc2FtcGxlKSBvZiBhIHN0cmVhbS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZyYW1lU2l6ZShzaXplX3QgKnNpemUpOworCisgICAgLy8gU2V0IHRoZSBpbnB1dCBnYWluIGZvciB0aGUgYXVkaW8gZHJpdmVyLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0R2FpbihmbG9hdCBnYWluKTsKKworICAgIC8vIFJlYWQgYXVkaW8gYnVmZmVyIGluIGZyb20gZHJpdmVyLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCh2b2lkICpidWZmZXIsIHNpemVfdCBieXRlcywgc2l6ZV90ICpyZWFkKTsKKworICAgIC8vIFJldHVybiB0aGUgYW1vdW50IG9mIGlucHV0IGZyYW1lcyBsb3N0IGluIHRoZSBhdWRpbyBkcml2ZXIuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRJbnB1dEZyYW1lc0xvc3QodWludDMyX3QgKmZyYW1lc0xvc3QpOworCisgICAgLy8gUmV0dXJuIGEgcmVjZW50IGNvdW50IG9mIHRoZSBudW1iZXIgb2YgYXVkaW8gZnJhbWVzIHJlY2VpdmVkIGFuZAorICAgIC8vIHRoZSBjbG9jayB0aW1lIGFzc29jaWF0ZWQgd2l0aCB0aGF0IGZyYW1lIGNvdW50LgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Q2FwdHVyZVBvc2l0aW9uKGludDY0X3QgKmZyYW1lcywgaW50NjRfdCAqdGltZSk7CisKKyAgICAvLyBTdGFydCBhIHN0cmVhbSBvcGVyYXRpbmcgaW4gbW1hcCBtb2RlLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoKTsKKworICAgIC8vIFN0b3AgYSBzdHJlYW0gb3BlcmF0aW5nIGluIG1tYXAgbW9kZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKKworICAgIC8vIFJldHJpZXZlIGluZm9ybWF0aW9uIG9uIHRoZSBkYXRhIGJ1ZmZlciBpbiBtbWFwIG1vZGUuCisgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVNbWFwQnVmZmVyKGludDMyX3QgbWluU2l6ZUZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX21tYXBfYnVmZmVyX2luZm8gKmluZm8pOworCisgICAgLy8gR2V0IGN1cnJlbnQgcmVhZC93cml0ZSBwb3NpdGlvbiBpbiB0aGUgbW1hcCBidWZmZXIKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1tYXBQb3NpdGlvbihzdHJ1Y3QgYXVkaW9fbW1hcF9wb3NpdGlvbiAqcG9zaXRpb24pOworCisgICAgLy8gR2V0IGFjdGl2ZSBtaWNyb3Bob25lcworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QWN0aXZlTWljcm9waG9uZXMoc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXMpOworCisgICAgLy8gQ2FsbGVkIHdoZW4gdGhlIG1ldGFkYXRhIG9mIHRoZSBzdHJlYW0ncyBzaW5rIGhhcyBiZWVuIGNoYW5nZWQuCisgICAgc3RhdHVzX3QgdXBkYXRlU2lua01ldGFkYXRhKGNvbnN0IFNpbmtNZXRhZGF0YSYgc2lua01ldGFkYXRhKSBvdmVycmlkZTsKKworICBwcml2YXRlOgorICAgIGF1ZGlvX3N0cmVhbV9pbl90ICptU3RyZWFtOworCisgICAgZnJpZW5kIGNsYXNzIERldmljZUhhbExvY2FsOworCisgICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgorICAgIFN0cmVhbUluSGFsTG9jYWwoYXVkaW9fc3RyZWFtX2luX3QgKnN0cmVhbSwgc3A8RGV2aWNlSGFsTG9jYWw+IGRldmljZSk7CisKKyAgICB2aXJ0dWFsIH5TdHJlYW1JbkhhbExvY2FsKCk7Cit9OworCit9IC8vIG5hbWVzcGFjZSBDUFBfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9TVFJFQU1fSEFMX0xPQ0FMX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvU3RyZWFtUG93ZXJMb2cuaCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvU3RyZWFtUG93ZXJMb2cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmQzOTEyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9TdHJlYW1Qb3dlckxvZy5oCkBAIC0wLDAgKzEsMTA0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX1NUUkVBTV9QT1dFUl9MT0dfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX1NUUkVBTV9QT1dFUl9MT0dfSAorCisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvY2xvY2suaD4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9Qb3dlckxvZy5oPgorI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBDUFBfVkVSU0lPTiB7CisKK2NsYXNzIFN0cmVhbVBvd2VyTG9nIHsKK3B1YmxpYzoKKyAgICBTdHJlYW1Qb3dlckxvZygpIDoKKyAgICAgICAgbUlzVXNlckRlYnVnT3JFbmdCdWlsZChpc191c2VyZGVidWdfb3JfZW5nX2J1aWxkKCkpLAorICAgICAgICBtUG93ZXJMb2cobnVsbHB0ciksCisgICAgICAgIG1GcmFtZVNpemUoMCkgeworICAgICAgICAvLyB1c2UgaW5pdCgpIHRvIHNldCB1cCB0aGUgcG93ZXIgbG9nLgorICAgIH0KKworICAgIH5TdHJlYW1Qb3dlckxvZygpIHsKKyAgICAgICAgcG93ZXJfbG9nX2Rlc3Ryb3kobVBvd2VyTG9nKTsgLy8gT0sgZm9yIG51bGwgbVBvd2VyTG9nCisgICAgICAgIG1Qb3dlckxvZyA9IG51bGxwdHI7CisgICAgfQorCisgICAgLy8gQSBvbmUtdGltZSBpbml0aWFsaXphdGlvbiAoZG8gbm90IGNhbGwgdHdpY2UpIGJlZm9yZSB1c2luZyBTdHJlYW1Qb3dlckxvZy4KKyAgICB2b2lkIGluaXQodWludDMyX3Qgc2FtcGxlUmF0ZSwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgeworICAgICAgICBpZiAobVBvd2VyTG9nID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIC8vIE5vdGU6IEEgd2F5IHRvIGdldCBjaGFubmVsIGNvdW50IGZvciBib3RoIGlucHV0IGFuZCBvdXRwdXQgY2hhbm5lbCBtYXNrcworICAgICAgICAgICAgLy8gYnV0IGRvZXMgbm90IGNoZWNrIHZhbGlkaXR5IG9mIHRoZSBjaGFubmVsIG1hc2suCisgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBjaGFubmVsQ291bnQgPSBwb3Bjb3VudChhdWRpb19jaGFubmVsX21hc2tfZ2V0X2JpdHMoY2hhbm5lbE1hc2spKTsKKyAgICAgICAgICAgIG1GcmFtZVNpemUgPSBjaGFubmVsQ291bnQgKiBhdWRpb19ieXRlc19wZXJfc2FtcGxlKGZvcm1hdCk7CisgICAgICAgICAgICBpZiAobUZyYW1lU2l6ZSA+IDApIHsKKyAgICAgICAgICAgICAgICBjb25zdCBzaXplX3Qga1Bvd2VyTG9nRnJhbWVzUGVyRW50cnkgPQorICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZylzYW1wbGVSYXRlICoga1Bvd2VyTG9nU2FtcGxpbmdJbnRlcnZhbE1zIC8gMTAwMDsKKyAgICAgICAgICAgICAgICBtUG93ZXJMb2cgPSBwb3dlcl9sb2dfY3JlYXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGtQb3dlckxvZ0VudHJpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICBrUG93ZXJMb2dGcmFtZXNQZXJFbnRyeSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gbVBvd2VyTG9nIG1heSBiZSBOVUxMIChub3QgdGhlIHJpZ2h0IGJ1aWxkLCBmb3JtYXQgbm90IGFjY2VwdGVkLCBldGMuKS4KKyAgICB9CisKKyAgICAvLyBEdW1wIHRoZSBwb3dlciBsb2cgdG8gZmQuCisgICAgdm9pZCBkdW1wKGludCBmZCkgY29uc3QgeworICAgICAgICAvLyBPSyBmb3IgbnVsbCBtUG93ZXJMb2cKKyAgICAgICAgKHZvaWQpcG93ZXJfbG9nX2R1bXAoCisgICAgICAgICAgICAgICAgbVBvd2VyTG9nLCBmZCwgIiAgICAgICIgLyogcHJlZml4ICovLCBrUG93ZXJMb2dMaW5lcywgMCAvKiBsaW1pdF9ucyAqLyk7CisgICAgfQorCisgICAgLy8gTG9nIHRoZSBhdWRpbyBkYXRhIGNvbnRhaW5lZCBpbiBidWZmZXIuCisgICAgdm9pZCBsb2coY29uc3Qgdm9pZCAqYnVmZmVyLCBzaXplX3Qgc2l6ZUluQnl0ZXMpIGNvbnN0IHsKKyAgICAgICAgaWYgKG1Qb3dlckxvZyAhPSBudWxscHRyKSB7IC8vIG1GcmFtZVNpemUgaXMgYWx3YXlzIG5vbnplcm8gaWYgbVBvd2VyTG9nIGV4aXN0cy4KKyAgICAgICAgICAgIHBvd2VyX2xvZ19sb2coCisgICAgICAgICAgICAgICAgICAgIG1Qb3dlckxvZywgYnVmZmVyLCBzaXplSW5CeXRlcyAvIG1GcmFtZVNpemUsIGF1ZGlvX3V0aWxzX2dldF9yZWFsX3RpbWVfbnMoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBib29sIGlzVXNlckRlYnVnT3JFbmdCdWlsZCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1Jc1VzZXJEZWJ1Z09yRW5nQnVpbGQ7CisgICAgfQorCitwcml2YXRlOgorCisgICAgc3RhdGljIGlubGluZSBib29sIGlzX3VzZXJkZWJ1Z19vcl9lbmdfYnVpbGQoKSB7CisgICAgICAgIGNoYXIgdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKyAgICAgICAgKHZvaWQpcHJvcGVydHlfZ2V0KCJyby5idWlsZC50eXBlIiwgdmFsdWUsICJ1bmtub3duIik7IC8vIGlnbm9yZSBhY3R1YWwgbGVuZ3RoCisgICAgICAgIHJldHVybiBzdHJjbXAodmFsdWUsICJ1c2VyZGVidWciKSA9PSAwIHx8IHN0cmNtcCh2YWx1ZSwgImVuZyIpID09IDA7CisgICAgfQorCisgICAgLy8gQXVkaW8gc2lnbmFsIHBvd2VyIGxvZyBjb25maWd1cmF0aW9uLgorICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga1Bvd2VyTG9nTGluZXMgPSA0MDsKKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtQb3dlckxvZ1NhbXBsaW5nSW50ZXJ2YWxNcyA9IDUwOworICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga1Bvd2VyTG9nRW50cmllcyA9ICgxIC8qIG1pbnV0ZXMgKi8gKiA2MCAvKiBzZWNvbmRzICovICogMTAwMCAvKiBtc2VjICovCisgICAgICAgICAgICAvIGtQb3dlckxvZ1NhbXBsaW5nSW50ZXJ2YWxNcyk7CisKKyAgICBjb25zdCBib29sIG1Jc1VzZXJEZWJ1Z09yRW5nQnVpbGQ7CisgICAgcG93ZXJfbG9nX3QgKm1Qb3dlckxvZzsKKyAgICBzaXplX3QgbUZyYW1lU2l6ZTsKK307CisKK30gLy8gbmFtZXNwYWNlIENQUF9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX1NUUkVBTV9QT1dFUl9MT0dfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9WZXJzaW9uTWFjcm8uaCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvVmVyc2lvbk1hY3JvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThlOWMwNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvVmVyc2lvbk1hY3JvLmgKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9WRVJTSU9OX01BQ1JPX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9WRVJTSU9OX01BQ1JPX0gKKworI2lmICFkZWZpbmVkKE1BSk9SX1ZFUlNJT04pIHx8ICFkZWZpbmVkKE1JTk9SX1ZFUlNJT04pCisjZXJyb3IgIk1BSk9SX1ZFUlNJT04gYW5kIE1JTk9SX1ZFUlNJT04gbXVzdCBiZSBkZWZpbmVkIgorI2VuZGlmCisKKyNkZWZpbmUgQ09OQ0FUXzMoYSxiLGMpIGEjI2IjI2MKKyNkZWZpbmUgRVhQQU5EX0NPTkNBVF8zKGEsYixjKSBDT05DQVRfMyhhLGIsYykKKy8qKiBUaGUgZGlyZWN0b3J5IG5hbWUgb2YgdGhlIHZlcnNpb246IDxtYWpvcj4uPG1pbm9yPiAqLworI2RlZmluZSBGSUxFX1ZFUlNJT04gRVhQQU5EX0NPTkNBVF8zKE1BSk9SX1ZFUlNJT04sLixNSU5PUl9WRVJTSU9OKQorCisjZGVmaW5lIENPTkNBVF80KGEsYixjLGQpIGEjI2IjI2MjI2QKKyNkZWZpbmUgRVhQQU5EX0NPTkNBVF80KGEsYixjLGQpIENPTkNBVF80KGEsYixjLGQpCisvKiogVGhlIGMrKyBuYW1lc3BhY2Ugb2YgdGhlIHZlcnNpb246IFY8bWFqb3I+XzxtaW5vcj4gKi8KKyNkZWZpbmUgQ1BQX1ZFUlNJT04gRVhQQU5EX0NPTkNBVF80KFYsTUFKT1JfVkVSU0lPTixfLE1JTk9SX1ZFUlNJT04pCisKKyNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX1ZFUlNJT05fTUFDUk9fSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9WZXJzaW9uVXRpbHMuaCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvVmVyc2lvblV0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTAwNDg5NQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvVmVyc2lvblV0aWxzLmgKQEAgLTAsMCArMSw2NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9WRVJTSU9OX1VUSUxTX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9WRVJTSU9OX1VUSUxTX0gKKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vMi4wL3R5cGVzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby80LjAvdHlwZXMuaD4KKyNpbmNsdWRlIDxoaWRsL0hpZGxTdXBwb3J0Lmg+CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjo6UGFyYW1ldGVyVmFsdWU7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT046OlJlc3VsdDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBDUFBfVkVSU0lPTiB7CituYW1lc3BhY2UgdXRpbHMgeworCisjaWYgTUFKT1JfVkVSU0lPTiA9PSAyCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgQ2FsbGJhY2s+CitSZXR1cm48dm9pZD4gZ2V0UGFyYW1ldGVycyhUJiBvYmplY3QsIGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiAvKmNvbnRleHQqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZGxfdmVjPGhpZGxfc3RyaW5nPiBrZXlzLCBDYWxsYmFjayBjYWxsYmFjaykgeworICAgIHJldHVybiBvYmplY3QtPmdldFBhcmFtZXRlcnMoa2V5cywgY2FsbGJhY2spOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK1JldHVybjxSZXN1bHQ+IHNldFBhcmFtZXRlcnMoVCYgb2JqZWN0LCBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4gLypjb250ZXh0Ki8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiBrZXlzKSB7CisgICAgcmV0dXJuIG9iamVjdC0+c2V0UGFyYW1ldGVycyhrZXlzKTsKK30KKyNlbGlmIE1BSk9SX1ZFUlNJT04gPT0gNAordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIENhbGxiYWNrPgorUmV0dXJuPHZvaWQ+IGdldFBhcmFtZXRlcnMoVCYgb2JqZWN0LCBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4gY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZGxfdmVjPGhpZGxfc3RyaW5nPiBrZXlzLCBDYWxsYmFjayBjYWxsYmFjaykgeworICAgIHJldHVybiBvYmplY3QtPmdldFBhcmFtZXRlcnMoY29udGV4dCwga2V5cywgY2FsbGJhY2spOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK1JldHVybjxSZXN1bHQ+IHNldFBhcmFtZXRlcnMoVCYgb2JqZWN0LCBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4gY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+IGtleXMpIHsKKyAgICByZXR1cm4gb2JqZWN0LT5zZXRQYXJhbWV0ZXJzKGNvbnRleHQsIGtleXMpOworfQorI2VuZGlmCisKK30gLy8gbmFtZXNwYWNlIHV0aWxzCit9IC8vIG5hbWVzcGFjZSBDUFBfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9WRVJTSU9OX1VUSUxTX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvaW5jbHVkZS9saWJhdWRpb2hhbC9GYWN0b3J5SGFsSGlkbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9pbmNsdWRlL2xpYmF1ZGlvaGFsL0ZhY3RvcnlIYWxIaWRsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmEwZWZmYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvaW5jbHVkZS9saWJhdWRpb2hhbC9GYWN0b3J5SGFsSGlkbC5oCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfRkFDVE9SWV9IQUxfSElETF9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfRkFDVE9SWV9IQUxfSElETF9ICisKKy8qKiBAZmlsZSBMaWJyYXJ5IGVudHJ5IHBvaW50cyB0byBjcmVhdGUgdGhlIEhBTCBmYWN0b3JpZXMuICovCisKKyNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9EZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZS5oPgorI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0VmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK25hbWVzcGFjZSBWMl8wIHsKK3NwPEVmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlPiBjcmVhdGVFZmZlY3RzRmFjdG9yeUhhbCgpOworc3A8RGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2U+IGNyZWF0ZURldmljZXNGYWN0b3J5SGFsKCk7Cit9IC8vIG5hbWVzcGFjZSBWMl8wCisKK25hbWVzcGFjZSBWNF8wIHsKK3NwPEVmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlPiBjcmVhdGVFZmZlY3RzRmFjdG9yeUhhbCgpOworc3A8RGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2U+IGNyZWF0ZURldmljZXNGYWN0b3J5SGFsKCk7Cit9IC8vIG5hbWVzcGFjZSBWNF8wCisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfRkFDVE9SWV9IQUxfSElETF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9NaXhlci5jcHAgYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9NaXhlci5jcHAKaW5kZXggZjNlYTgyNi4uYWY1NGIyMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvTWl4ZXIuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BdWRpb01peGVyLmNwcApAQCAtMzM3LDYgKzMzNyw3IEBACiAKIHZvaWQgQXVkaW9NaXhlcjo6VHJhY2s6OnJlY29uZmlndXJlQnVmZmVyUHJvdmlkZXJzKCkKIHsKKyAgICAvLyBjb25maWd1cmUgZnJvbSB1cHN0cmVhbSB0byBkb3duc3RyZWFtIGJ1ZmZlciBwcm92aWRlcnMuCiAgICAgYnVmZmVyUHJvdmlkZXIgPSBtSW5wdXRCdWZmZXJQcm92aWRlcjsKICAgICBpZiAobVJlZm9ybWF0QnVmZmVyUHJvdmlkZXIuZ2V0KCkgIT0gbnVsbHB0cikgewogICAgICAgICBtUmVmb3JtYXRCdWZmZXJQcm92aWRlci0+c2V0QnVmZmVyUHJvdmlkZXIoYnVmZmVyUHJvdmlkZXIpOwpAQCAtODEzLDE0ICs4MTQsMTUgQEAKICAgICBpZiAodHJhY2stPm1JbnB1dEJ1ZmZlclByb3ZpZGVyID09IGJ1ZmZlclByb3ZpZGVyKSB7CiAgICAgICAgIHJldHVybjsgLy8gZG9uJ3QgcmVzZXQgYW55IGJ1ZmZlciBwcm92aWRlcnMgaWYgaWRlbnRpY2FsLgogICAgIH0KLSAgICBpZiAodHJhY2stPm1SZWZvcm1hdEJ1ZmZlclByb3ZpZGVyLmdldCgpICE9IG51bGxwdHIpIHsKLSAgICAgICAgdHJhY2stPm1SZWZvcm1hdEJ1ZmZlclByb3ZpZGVyLT5yZXNldCgpOwotICAgIH0gZWxzZSBpZiAodHJhY2stPm1Eb3dubWl4ZXJCdWZmZXJQcm92aWRlciAhPSBudWxscHRyKSB7Ci0gICAgICAgIHRyYWNrLT5tRG93bm1peGVyQnVmZmVyUHJvdmlkZXItPnJlc2V0KCk7CisgICAgLy8gcmVzZXQgb3JkZXIgZnJvbSBkb3duc3RyZWFtIHRvIHVwc3RyZWFtIGJ1ZmZlciBwcm92aWRlcnMuCisgICAgaWYgKHRyYWNrLT5tVGltZXN0cmV0Y2hCdWZmZXJQcm92aWRlci5nZXQoKSAhPSBudWxscHRyKSB7CisgICAgICAgIHRyYWNrLT5tVGltZXN0cmV0Y2hCdWZmZXJQcm92aWRlci0+cmVzZXQoKTsKICAgICB9IGVsc2UgaWYgKHRyYWNrLT5tUG9zdERvd25taXhSZWZvcm1hdEJ1ZmZlclByb3ZpZGVyLmdldCgpICE9IG51bGxwdHIpIHsKICAgICAgICAgdHJhY2stPm1Qb3N0RG93bm1peFJlZm9ybWF0QnVmZmVyUHJvdmlkZXItPnJlc2V0KCk7Ci0gICAgfSBlbHNlIGlmICh0cmFjay0+bVRpbWVzdHJldGNoQnVmZmVyUHJvdmlkZXIuZ2V0KCkgIT0gbnVsbHB0cikgewotICAgICAgICB0cmFjay0+bVRpbWVzdHJldGNoQnVmZmVyUHJvdmlkZXItPnJlc2V0KCk7CisgICAgfSBlbHNlIGlmICh0cmFjay0+bURvd25taXhlckJ1ZmZlclByb3ZpZGVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgdHJhY2stPm1Eb3dubWl4ZXJCdWZmZXJQcm92aWRlci0+cmVzZXQoKTsKKyAgICB9IGVsc2UgaWYgKHRyYWNrLT5tUmVmb3JtYXRCdWZmZXJQcm92aWRlci5nZXQoKSAhPSBudWxscHRyKSB7CisgICAgICAgIHRyYWNrLT5tUmVmb3JtYXRCdWZmZXJQcm92aWRlci0+cmVzZXQoKTsKICAgICB9CiAKICAgICB0cmFjay0+bUlucHV0QnVmZmVyUHJvdmlkZXIgPSBidWZmZXJQcm92aWRlcjsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BdWRpb1Jlc2FtcGxlckR5bi5oIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvUmVzYW1wbGVyRHluLmgKaW5kZXggOTIxNDRkMC4uNDc5MTQyZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvUmVzYW1wbGVyRHluLmgKKysrIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvUmVzYW1wbGVyRHluLmgKQEAgLTU1LDYgKzU1LDExIEBACiAgICAgdmlydHVhbCBzaXplX3QgcmVzYW1wbGUoaW50MzJfdCogb3V0LCBzaXplX3Qgb3V0RnJhbWVDb3VudCwKICAgICAgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXIqIHByb3ZpZGVyKTsKIAorICAgIHZvaWQgcmVzZXQoKSBvdmVycmlkZSB7CisgICAgICAgIEF1ZGlvUmVzYW1wbGVyOjpyZXNldCgpOworICAgICAgICBtSW5CdWZmZXIucmVzZXQoKTsKKyAgICB9CisKICAgICAvLyBNYWtlIGF2YWlsYWJsZSBrZXkgZGVzaWduIGNyaXRlcmlhIGZvciB0ZXN0aW5nCiAgICAgaW50IGdldEhhbGZMZW5ndGgoKSBjb25zdCB7CiAgICAgICAgIHJldHVybiBtQ29uc3RhbnRzLm1IYWxmTnVtQ29lZnM7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9SZXNhbXBsZXJGaXJQcm9jZXNzLmggYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9SZXNhbXBsZXJGaXJQcm9jZXNzLmgKaW5kZXggYTc0MTY3Ny4uOWI3MGExYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvUmVzYW1wbGVyRmlyUHJvY2Vzcy5oCisrKyBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BdWRpb1Jlc2FtcGxlckZpclByb2Nlc3MuaApAQCAtOTAsNyArOTAsNyBAQAogICAgICAgICBBY2N1bXVsYXRvcjxDSEFOTkVMUy0xLCBUTz46OmFjYyhjb2VmLCBkYXRhKTsKICAgICB9CiAgICAgaW5saW5lIHZvaWQgdm9sdW1lKFRPKiYgb3V0LCBUTyBnYWluKSB7Ci0gICAgICAgICpvdXQrKyA9IHZvbHVtZUFkanVzdCh2YWx1ZSwgZ2Fpbik7CisgICAgICAgICpvdXQrKyArPSB2b2x1bWVBZGp1c3QodmFsdWUsIGdhaW4pOwogICAgICAgICBBY2N1bXVsYXRvcjxDSEFOTkVMUy0xLCBUTz46OnZvbHVtZShvdXQsIGdhaW4pOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvUmVzYW1wbGVyU2luYy5jcHAgYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9SZXNhbXBsZXJTaW5jLmNwcAppbmRleCAzMjBiOGNmLi41YTAzYTBkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9SZXNhbXBsZXJTaW5jLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9SZXNhbXBsZXJTaW5jLmNwcApAQCAtMTksNiArMTksNyBAQAogCiAjZGVmaW5lIF9fU1REQ19DT05TVEFOVF9NQUNST1MKICNpbmNsdWRlIDxtYWxsb2MuaD4KKyNpbmNsdWRlIDxwdGhyZWFkLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8ZGxmY24uaD4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9pbmNsdWRlL21lZGlhL0F1ZGlvUmVzYW1wbGVyUHVibGljLmggYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvaW5jbHVkZS9tZWRpYS9BdWRpb1Jlc2FtcGxlclB1YmxpYy5oCmluZGV4IDA1NWY3MjQuLjUwY2EzM2QgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9pbmNsdWRlL21lZGlhL0F1ZGlvUmVzYW1wbGVyUHVibGljLmgKKysrIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL2luY2x1ZGUvbWVkaWEvQXVkaW9SZXNhbXBsZXJQdWJsaWMuaApAQCAtMTA0LDggKzEwNCw4IEBACiAgICAgICAgIGNvbnN0IEF1ZGlvUGxheWJhY2tSYXRlICZwcjIpIHsKICAgICByZXR1cm4gZmFicyhwcjEubVNwZWVkIC0gcHIyLm1TcGVlZCkgPCBBVURJT19USU1FU1RSRVRDSF9TUEVFRF9NSU5fREVMVEEgJiYKICAgICAgICAgICAgZmFicyhwcjEubVBpdGNoIC0gcHIyLm1QaXRjaCkgPCBBVURJT19USU1FU1RSRVRDSF9QSVRDSF9NSU5fREVMVEEgJiYKLSAgICAgICAgICAgcHIyLm1TdHJldGNoTW9kZSA9PSBwcjIubVN0cmV0Y2hNb2RlICYmCi0gICAgICAgICAgIHByMi5tRmFsbGJhY2tNb2RlID09IHByMi5tRmFsbGJhY2tNb2RlOworICAgICAgICAgICBwcjEubVN0cmV0Y2hNb2RlID09IHByMi5tU3RyZXRjaE1vZGUgJiYKKyAgICAgICAgICAgcHIxLm1GYWxsYmFja01vZGUgPT0gcHIyLm1GYWxsYmFja01vZGU7CiB9CiAKIHN0YXRpYyBpbmxpbmUgYm9vbCBpc0F1ZGlvUGxheWJhY2tSYXRlVmFsaWQoY29uc3QgQXVkaW9QbGF5YmFja1JhdGUgJnBsYXliYWNrUmF0ZSkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sb3VkbmVzcy9FZmZlY3RMb3VkbmVzc0VuaGFuY2VyLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbG91ZG5lc3MvRWZmZWN0TG91ZG5lc3NFbmhhbmNlci5jcHAKaW5kZXggOWQyOWNmMS4uZDYxZWZkMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sb3VkbmVzcy9FZmZlY3RMb3VkbmVzc0VuaGFuY2VyLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2xvdWRuZXNzL0VmZmVjdExvdWRuZXNzRW5oYW5jZXIuY3BwCkBAIC0zMCw2ICszMCwyNiBAQAogI2luY2x1ZGUgPGF1ZGlvX2VmZmVjdHMvZWZmZWN0X2xvdWRuZXNzZW5oYW5jZXIuaD4KICNpbmNsdWRlICJkc3AvY29yZS9keW5hbWljX3JhbmdlX2NvbXByZXNzaW9uLmgiCiAKKy8vIEJVSUxEX0ZMT0FUIHRhcmdldHMgYnVpbGRpbmcgYSBmbG9hdCBlZmZlY3QgaW5zdGVhZCBvZiB0aGUgbGVnYWN5IGludDE2X3QgZWZmZWN0LgorI2RlZmluZSBCVUlMRF9GTE9BVAorCisjaWZkZWYgQlVJTERfRkxPQVQKKworc3RhdGljIGNvbnN0ZXhwciBhdWRpb19mb3JtYXRfdCBrUHJvY2Vzc0Zvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ7CisKKyNlbHNlCisKK3N0YXRpYyBjb25zdGV4cHIgYXVkaW9fZm9ybWF0X3Qga1Byb2Nlc3NGb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKKworc3RhdGljIGlubGluZSBpbnQxNl90IGNsYW1wMTYoaW50MzJfdCBzYW1wbGUpCit7CisgICAgaWYgKChzYW1wbGU+PjE1KSBeIChzYW1wbGU+PjMxKSkKKyAgICAgICAgc2FtcGxlID0gMHg3RkZGIF4gKHNhbXBsZT4+MzEpOworICAgIHJldHVybiBzYW1wbGU7Cit9CisKKyNlbmRpZiAvLyBCVUlMRF9GTE9BVAorCiBleHRlcm4gIkMiIHsKIAogLy8gZWZmZWN0X2hhbmRsZV90IGludGVyZmFjZSBpbXBsZW1lbnRhdGlvbiBmb3IgTEUgZWZmZWN0CkBAIC04MCwxMyArMTAwLDYgQEAKICAgICB9CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50MTZfdCBjbGFtcDE2KGludDMyX3Qgc2FtcGxlKQotewotICAgIGlmICgoc2FtcGxlPj4xNSkgXiAoc2FtcGxlPj4zMSkpCi0gICAgICAgIHNhbXBsZSA9IDB4N0ZGRiBeIChzYW1wbGU+PjMxKTsKLSAgICByZXR1cm4gc2FtcGxlOwotfQotCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vIExFX3NldENvbmZpZygpCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTExMSw3ICsxMjQsNyBAQAogICAgIGlmIChwQ29uZmlnLT5pbnB1dENmZy5jaGFubmVscyAhPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8pIHJldHVybiAtRUlOVkFMOwogICAgIGlmIChwQ29uZmlnLT5vdXRwdXRDZmcuYWNjZXNzTW9kZSAhPSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19XUklURSAmJgogICAgICAgICAgICAgcENvbmZpZy0+b3V0cHV0Q2ZnLmFjY2Vzc01vZGUgIT0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfQUNDVU1VTEFURSkgcmV0dXJuIC1FSU5WQUw7Ci0gICAgaWYgKHBDb25maWctPmlucHV0Q2ZnLmZvcm1hdCAhPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCkgcmV0dXJuIC1FSU5WQUw7CisgICAgaWYgKHBDb25maWctPmlucHV0Q2ZnLmZvcm1hdCAhPSBrUHJvY2Vzc0Zvcm1hdCkgcmV0dXJuIC1FSU5WQUw7CiAKICAgICBwQ29udGV4dC0+bUNvbmZpZyA9ICpwQ29uZmlnOwogCkBAIC0xNTksNyArMTcyLDcgQEAKIAogICAgIHBDb250ZXh0LT5tQ29uZmlnLmlucHV0Q2ZnLmFjY2Vzc01vZGUgPSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19SRUFEOwogICAgIHBDb250ZXh0LT5tQ29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOwotICAgIHBDb250ZXh0LT5tQ29uZmlnLmlucHV0Q2ZnLmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOworICAgIHBDb250ZXh0LT5tQ29uZmlnLmlucHV0Q2ZnLmZvcm1hdCA9IGtQcm9jZXNzRm9ybWF0OwogICAgIHBDb250ZXh0LT5tQ29uZmlnLmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSA9IDQ0MTAwOwogICAgIHBDb250ZXh0LT5tQ29uZmlnLmlucHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmdldEJ1ZmZlciA9IE5VTEw7CiAgICAgcENvbnRleHQtPm1Db25maWcuaW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciA9IE5VTEw7CkBAIC0xNjcsNyArMTgwLDcgQEAKICAgICBwQ29udGV4dC0+bUNvbmZpZy5pbnB1dENmZy5tYXNrID0gRUZGRUNUX0NPTkZJR19BTEw7CiAgICAgcENvbnRleHQtPm1Db25maWcub3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFOwogICAgIHBDb250ZXh0LT5tQ29uZmlnLm91dHB1dENmZy5jaGFubmVscyA9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKLSAgICBwQ29udGV4dC0+bUNvbmZpZy5vdXRwdXRDZmcuZm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CisgICAgcENvbnRleHQtPm1Db25maWcub3V0cHV0Q2ZnLmZvcm1hdCA9IGtQcm9jZXNzRm9ybWF0OwogICAgIHBDb250ZXh0LT5tQ29uZmlnLm91dHB1dENmZy5zYW1wbGluZ1JhdGUgPSA0NDEwMDsKICAgICBwQ29udGV4dC0+bUNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyID0gTlVMTDsKICAgICBwQ29udGV4dC0+bUNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciA9IE5VTEw7CkBAIC0yODQsMTggKzI5Nyw0MSBAQAogCiAgICAgLy9BTE9HVigiTEUgYWJvdXQgdG8gcHJvY2VzcyAlZCBzYW1wbGVzIiwgaW5CdWZmZXItPmZyYW1lQ291bnQpOwogICAgIHVpbnQxNl90IGluSWR4OworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgY29uc3RleHByIGZsb2F0IHNjYWxlID0gMSA8PCAxNTsgLy8gcG93ZXIgb2YgMiBpcyBsb3NzbGVzcyBjb252ZXJzaW9uIHRvIGludDE2X3QgcmFuZ2UKKyAgICBjb25zdGV4cHIgZmxvYXQgaW52ZXJzZVNjYWxlID0gMS5mIC8gc2NhbGU7CisgICAgY29uc3QgZmxvYXQgaW5wdXRBbXAgPSBwb3coMTAsIHBDb250ZXh0LT5tVGFyZ2V0R2Fpbm1CLzIwMDAuMGYpICogc2NhbGU7CisjZWxzZQogICAgIGZsb2F0IGlucHV0QW1wID0gcG93KDEwLCBwQ29udGV4dC0+bVRhcmdldEdhaW5tQi8yMDAwLjBmKTsKKyNlbmRpZgogICAgIGZsb2F0IGxlZnRTYW1wbGUsIHJpZ2h0U2FtcGxlOwogICAgIGZvciAoaW5JZHggPSAwIDsgaW5JZHggPCBpbkJ1ZmZlci0+ZnJhbWVDb3VudCA7IGluSWR4KyspIHsKICAgICAgICAgLy8gbWFrZXVwIGdhaW4gaXMgYXBwbGllZCBvbiB0aGUgaW5wdXQgb2YgdGhlIGNvbXByZXNzb3IKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgICAgICBsZWZ0U2FtcGxlICA9IGlucHV0QW1wICogaW5CdWZmZXItPmYzMlsyKmluSWR4XTsKKyAgICAgICAgcmlnaHRTYW1wbGUgPSBpbnB1dEFtcCAqIGluQnVmZmVyLT5mMzJbMippbklkeCArMV07CisgICAgICAgIHBDb250ZXh0LT5tQ29tcHJlc3Nvci0+Q29tcHJlc3MoJmxlZnRTYW1wbGUsICZyaWdodFNhbXBsZSk7CisgICAgICAgIGluQnVmZmVyLT5mMzJbMippbklkeF0gICAgPSBsZWZ0U2FtcGxlICogaW52ZXJzZVNjYWxlOworICAgICAgICBpbkJ1ZmZlci0+ZjMyWzIqaW5JZHggKzFdID0gcmlnaHRTYW1wbGUgKiBpbnZlcnNlU2NhbGU7CisjZWxzZQogICAgICAgICBsZWZ0U2FtcGxlICA9IGlucHV0QW1wICogKGZsb2F0KWluQnVmZmVyLT5zMTZbMippbklkeF07CiAgICAgICAgIHJpZ2h0U2FtcGxlID0gaW5wdXRBbXAgKiAoZmxvYXQpaW5CdWZmZXItPnMxNlsyKmluSWR4ICsxXTsKICAgICAgICAgcENvbnRleHQtPm1Db21wcmVzc29yLT5Db21wcmVzcygmbGVmdFNhbXBsZSwgJnJpZ2h0U2FtcGxlKTsKICAgICAgICAgaW5CdWZmZXItPnMxNlsyKmluSWR4XSAgICA9IChpbnQxNl90KSBsZWZ0U2FtcGxlOwogICAgICAgICBpbkJ1ZmZlci0+czE2WzIqaW5JZHggKzFdID0gKGludDE2X3QpIHJpZ2h0U2FtcGxlOworI2VuZGlmIC8vIEJVSUxEX0ZMT0FUCiAgICAgfQogCiAgICAgaWYgKGluQnVmZmVyLT5yYXcgIT0gb3V0QnVmZmVyLT5yYXcpIHsKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgICAgICBpZiAocENvbnRleHQtPm1Db25maWcub3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPT0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfQUNDVU1VTEFURSkgeworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvdXRCdWZmZXItPmZyYW1lQ291bnQqMjsgaSsrKSB7CisgICAgICAgICAgICAgICAgb3V0QnVmZmVyLT5mMzJbaV0gKz0gaW5CdWZmZXItPmYzMltpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1lbWNweShvdXRCdWZmZXItPnJhdywgaW5CdWZmZXItPnJhdywgb3V0QnVmZmVyLT5mcmFtZUNvdW50ICogMiAqIHNpemVvZihmbG9hdCkpOworICAgICAgICB9CisjZWxzZQogICAgICAgICBpZiAocENvbnRleHQtPm1Db25maWcub3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPT0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfQUNDVU1VTEFURSkgewogICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvdXRCdWZmZXItPmZyYW1lQ291bnQqMjsgaSsrKSB7CiAgICAgICAgICAgICAgICAgb3V0QnVmZmVyLT5zMTZbaV0gPSBjbGFtcDE2KG91dEJ1ZmZlci0+czE2W2ldICsgaW5CdWZmZXItPnMxNltpXSk7CkBAIC0zMDMsNiArMzM5LDcgQEAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIG1lbWNweShvdXRCdWZmZXItPnJhdywgaW5CdWZmZXItPnJhdywgb3V0QnVmZmVyLT5mcmFtZUNvdW50ICogMiAqIHNpemVvZihpbnQxNl90KSk7CiAgICAgICAgIH0KKyNlbmRpZiAvLyBCVUlMRF9GTE9BVAogICAgIH0KICAgICBpZiAocENvbnRleHQtPm1TdGF0ZSAhPSBMT1VETkVTU19FTkhBTkNFUl9TVEFURV9BQ1RJVkUpIHsKICAgICAgICAgcmV0dXJuIC1FTk9EQVRBOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy92aXN1YWxpemVyL0FuZHJvaWQubWsgYi9tZWRpYS9saWJlZmZlY3RzL3Zpc3VhbGl6ZXIvQW5kcm9pZC5tawppbmRleCA3MDQwOWRlLi4zNWUyZjNkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL3Zpc3VhbGl6ZXIvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJlZmZlY3RzL3Zpc3VhbGl6ZXIvQW5kcm9pZC5tawpAQCAtOSw2ICs5LDcgQEAKIAogTE9DQUxfQ0ZMQUdTKz0gLU8yIC1mdmlzaWJpbGl0eT1oaWRkZW4KIExPQ0FMX0NGTEFHUyArPSAtV2FsbCAtV2Vycm9yCitMT0NBTF9DRkxBR1MgKz0gLURCVUlMRF9GTE9BVCAtRFNVUFBPUlRfTUMKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCiAJbGliY3V0aWxzIFwKQEAgLTE5LDcgKzIwLDggQEAKIExPQ0FMX01PRFVMRTo9IGxpYnZpc3VhbGl6ZXIKIAogTE9DQUxfQ19JTkNMVURFUyA6PSBcCi0JJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLWVmZmVjdHMpCisJJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLWVmZmVjdHMpIFwKKwkkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tdXRpbHMpCiAKIAogTE9DQUxfSEVBREVSX0xJQlJBUklFUyArPSBsaWJoYXJkd2FyZV9oZWFkZXJzCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL3Zpc3VhbGl6ZXIvRWZmZWN0VmlzdWFsaXplci5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL3Zpc3VhbGl6ZXIvRWZmZWN0VmlzdWFsaXplci5jcHAKaW5kZXggODA3ZjI0ZC4uMDBiYzM3MSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy92aXN1YWxpemVyL0VmZmVjdFZpc3VhbGl6ZXIuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvdmlzdWFsaXplci9FZmZlY3RWaXN1YWxpemVyLmNwcApAQCAtMjQsMTEgKzI0LDIzIEBACiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8dGltZS5oPgogCisjaW5jbHVkZSA8YWxnb3JpdGhtPiAvLyBtYXgKICNpbmNsdWRlIDxuZXc+CiAKICNpbmNsdWRlIDxsb2cvbG9nLmg+CiAKICNpbmNsdWRlIDxhdWRpb19lZmZlY3RzL2VmZmVjdF92aXN1YWxpemVyLmg+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvcHJpbWl0aXZlcy5oPgorCisjaWZkZWYgQlVJTERfRkxPQVQKKworc3RhdGljIGNvbnN0ZXhwciBhdWRpb19mb3JtYXRfdCBrUHJvY2Vzc0Zvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ7CisKKyNlbHNlCisKK3N0YXRpYyBjb25zdGV4cHIgYXVkaW9fZm9ybWF0X3Qga1Byb2Nlc3NGb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKKworI2VuZGlmIC8vIEJVSUxEX0ZMT0FUCiAKIGV4dGVybiAiQyIgewogCkBAIC0xNDMsMTAgKzE1NSwxNSBAQAogICAgIGlmIChwQ29uZmlnLT5pbnB1dENmZy5zYW1wbGluZ1JhdGUgIT0gcENvbmZpZy0+b3V0cHV0Q2ZnLnNhbXBsaW5nUmF0ZSkgcmV0dXJuIC1FSU5WQUw7CiAgICAgaWYgKHBDb25maWctPmlucHV0Q2ZnLmNoYW5uZWxzICE9IHBDb25maWctPm91dHB1dENmZy5jaGFubmVscykgcmV0dXJuIC1FSU5WQUw7CiAgICAgaWYgKHBDb25maWctPmlucHV0Q2ZnLmZvcm1hdCAhPSBwQ29uZmlnLT5vdXRwdXRDZmcuZm9ybWF0KSByZXR1cm4gLUVJTlZBTDsKLSAgICBpZiAocENvbmZpZy0+aW5wdXRDZmcuY2hhbm5lbHMgIT0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPKSByZXR1cm4gLUVJTlZBTDsKKyAgICBjb25zdCB1aW50MzJfdCBjaGFubmVsQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2socENvbmZpZy0+aW5wdXRDZmcuY2hhbm5lbHMpOworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICBpZiAoY2hhbm5lbENvdW50IDwgMSB8fCBjaGFubmVsQ291bnQgPiBGQ0NfOCkgcmV0dXJuIC1FSU5WQUw7CisjZWxzZQorICAgIGlmIChjaGFubmVsQ291bnQgIT0gRkNDXzIpIHJldHVybiAtRUlOVkFMOworI2VuZGlmCiAgICAgaWYgKHBDb25maWctPm91dHB1dENmZy5hY2Nlc3NNb2RlICE9IEVGRkVDVF9CVUZGRVJfQUNDRVNTX1dSSVRFICYmCiAgICAgICAgICAgICBwQ29uZmlnLT5vdXRwdXRDZmcuYWNjZXNzTW9kZSAhPSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFKSByZXR1cm4gLUVJTlZBTDsKLSAgICBpZiAocENvbmZpZy0+aW5wdXRDZmcuZm9ybWF0ICE9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKSByZXR1cm4gLUVJTlZBTDsKKyAgICBpZiAocENvbmZpZy0+aW5wdXRDZmcuZm9ybWF0ICE9IGtQcm9jZXNzRm9ybWF0KSByZXR1cm4gLUVJTlZBTDsKIAogICAgIHBDb250ZXh0LT5tQ29uZmlnID0gKnBDb25maWc7CiAKQEAgLTE5Miw3ICsyMDksNyBAQAogewogICAgIHBDb250ZXh0LT5tQ29uZmlnLmlucHV0Q2ZnLmFjY2Vzc01vZGUgPSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19SRUFEOwogICAgIHBDb250ZXh0LT5tQ29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOwotICAgIHBDb250ZXh0LT5tQ29uZmlnLmlucHV0Q2ZnLmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOworICAgIHBDb250ZXh0LT5tQ29uZmlnLmlucHV0Q2ZnLmZvcm1hdCA9IGtQcm9jZXNzRm9ybWF0OwogICAgIHBDb250ZXh0LT5tQ29uZmlnLmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSA9IDQ0MTAwOwogICAgIHBDb250ZXh0LT5tQ29uZmlnLmlucHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmdldEJ1ZmZlciA9IE5VTEw7CiAgICAgcENvbnRleHQtPm1Db25maWcuaW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciA9IE5VTEw7CkBAIC0yMDAsNyArMjE3LDcgQEAKICAgICBwQ29udGV4dC0+bUNvbmZpZy5pbnB1dENmZy5tYXNrID0gRUZGRUNUX0NPTkZJR19BTEw7CiAgICAgcENvbnRleHQtPm1Db25maWcub3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFOwogICAgIHBDb250ZXh0LT5tQ29uZmlnLm91dHB1dENmZy5jaGFubmVscyA9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKLSAgICBwQ29udGV4dC0+bUNvbmZpZy5vdXRwdXRDZmcuZm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CisgICAgcENvbnRleHQtPm1Db25maWcub3V0cHV0Q2ZnLmZvcm1hdCA9IGtQcm9jZXNzRm9ybWF0OwogICAgIHBDb250ZXh0LT5tQ29uZmlnLm91dHB1dENmZy5zYW1wbGluZ1JhdGUgPSA0NDEwMDsKICAgICBwQ29udGV4dC0+bUNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyID0gTlVMTDsKICAgICBwQ29udGV4dC0+bUNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciA9IE5VTEw7CkBAIC0zMDEsMTUgKzMxOCw4IEBACiAvLy0tLSBFZmZlY3QgQ29udHJvbCBJbnRlcmZhY2UgSW1wbGVtZW50YXRpb24KIC8vCiAKLXN0YXRpYyBpbmxpbmUgaW50MTZfdCBjbGFtcDE2KGludDMyX3Qgc2FtcGxlKQotewotICAgIGlmICgoc2FtcGxlPj4xNSkgXiAoc2FtcGxlPj4zMSkpCi0gICAgICAgIHNhbXBsZSA9IDB4N0ZGRiBeIChzYW1wbGU+PjMxKTsKLSAgICByZXR1cm4gc2FtcGxlOwotfQotCiBpbnQgVmlzdWFsaXplcl9wcm9jZXNzKAotICAgICAgICBlZmZlY3RfaGFuZGxlX3Qgc2VsZixhdWRpb19idWZmZXJfdCAqaW5CdWZmZXIsIGF1ZGlvX2J1ZmZlcl90ICpvdXRCdWZmZXIpCisgICAgICAgIGVmZmVjdF9oYW5kbGVfdCBzZWxmLCBhdWRpb19idWZmZXJfdCAqaW5CdWZmZXIsIGF1ZGlvX2J1ZmZlcl90ICpvdXRCdWZmZXIpCiB7CiAgICAgVmlzdWFsaXplckNvbnRleHQgKiBwQ29udGV4dCA9IChWaXN1YWxpemVyQ29udGV4dCAqKXNlbGY7CiAKQEAgLTMyNCw3MSArMzM0LDExOCBAQAogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CiAKKyAgICBjb25zdCBzaXplX3Qgc2FtcGxlTGVuID0gaW5CdWZmZXItPmZyYW1lQ291bnQgKiBwQ29udGV4dC0+bUNoYW5uZWxDb3VudDsKKwogICAgIC8vIHBlcmZvcm0gbWVhc3VyZW1lbnRzIGlmIG5lZWRlZAogICAgIGlmIChwQ29udGV4dC0+bU1lYXN1cmVtZW50TW9kZSAmIE1FQVNVUkVNRU5UX01PREVfUEVBS19STVMpIHsKICAgICAgICAgLy8gZmluZCB0aGUgcGVhayBhbmQgUk1TIHNxdWFyZWQgZm9yIHRoZSBuZXcgYnVmZmVyCi0gICAgICAgIHVpbnQzMl90IGluSWR4OwotICAgICAgICBpbnQxNl90IG1heFNhbXBsZSA9IDA7CiAgICAgICAgIGZsb2F0IHJtc1NxQWNjID0gMDsKLSAgICAgICAgZm9yIChpbklkeCA9IDAgOyBpbklkeCA8IGluQnVmZmVyLT5mcmFtZUNvdW50ICogcENvbnRleHQtPm1DaGFubmVsQ291bnQgOyBpbklkeCsrKSB7Ci0gICAgICAgICAgICBpZiAoaW5CdWZmZXItPnMxNltpbklkeF0gPiBtYXhTYW1wbGUpIHsKLSAgICAgICAgICAgICAgICBtYXhTYW1wbGUgPSBpbkJ1ZmZlci0+czE2W2luSWR4XTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoLWluQnVmZmVyLT5zMTZbaW5JZHhdID4gbWF4U2FtcGxlKSB7Ci0gICAgICAgICAgICAgICAgbWF4U2FtcGxlID0gLWluQnVmZmVyLT5zMTZbaW5JZHhdOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcm1zU3FBY2MgKz0gKGluQnVmZmVyLT5zMTZbaW5JZHhdICogaW5CdWZmZXItPnMxNltpbklkeF0pOworCisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICAgICAgZmxvYXQgbWF4U2FtcGxlID0gMC5mOworICAgICAgICBmb3IgKHNpemVfdCBpbklkeCA9IDA7IGluSWR4IDwgc2FtcGxlTGVuOyArK2luSWR4KSB7CisgICAgICAgICAgICBtYXhTYW1wbGUgPSBmbWF4KG1heFNhbXBsZSwgZmFicyhpbkJ1ZmZlci0+ZjMyW2luSWR4XSkpOworICAgICAgICAgICAgcm1zU3FBY2MgKz0gaW5CdWZmZXItPmYzMltpbklkeF0gKiBpbkJ1ZmZlci0+ZjMyW2luSWR4XTsKICAgICAgICAgfQorICAgICAgICBtYXhTYW1wbGUgKj0gMSA8PCAxNTsgLy8gc2NhbGUgdG8gaW50MTZfdCwgd2l0aCBleGFjdGx5IDEgPDwgMTUgcmVwcmVzZW50aW5nIHBvc2l0aXZlIG51bS4KKyAgICAgICAgcm1zU3FBY2MgKj0gMSA8PCAzMDsgLy8gc2NhbGUgdG8gaW50MTZfdCAqIDIKKyNlbHNlCisgICAgICAgIGludCBtYXhTYW1wbGUgPSAwOworICAgICAgICBmb3IgKHNpemVfdCBpbklkeCA9IDA7IGluSWR4IDwgc2FtcGxlTGVuOyArK2luSWR4KSB7CisgICAgICAgICAgICBtYXhTYW1wbGUgPSBzdGQ6Om1heChtYXhTYW1wbGUsIHN0ZDo6YWJzKGludDMyX3QoaW5CdWZmZXItPnMxNltpbklkeF0pKSk7CisgICAgICAgICAgICBybXNTcUFjYyArPSBpbkJ1ZmZlci0+czE2W2luSWR4XSAqIGluQnVmZmVyLT5zMTZbaW5JZHhdOworICAgICAgICB9CisjZW5kaWYKICAgICAgICAgLy8gc3RvcmUgdGhlIG1lYXN1cmVtZW50CiAgICAgICAgIHBDb250ZXh0LT5tUGFzdE1lYXN1cmVtZW50c1twQ29udGV4dC0+bU1lYXN1cmVtZW50QnVmZmVySWR4XS5tUGVha1UxNiA9ICh1aW50MTZfdCltYXhTYW1wbGU7CiAgICAgICAgIHBDb250ZXh0LT5tUGFzdE1lYXN1cmVtZW50c1twQ29udGV4dC0+bU1lYXN1cmVtZW50QnVmZmVySWR4XS5tUm1zU3F1YXJlZCA9Ci0gICAgICAgICAgICAgICAgcm1zU3FBY2MgLyAoaW5CdWZmZXItPmZyYW1lQ291bnQgKiBwQ29udGV4dC0+bUNoYW5uZWxDb3VudCk7CisgICAgICAgICAgICAgICAgcm1zU3FBY2MgLyBzYW1wbGVMZW47CiAgICAgICAgIHBDb250ZXh0LT5tUGFzdE1lYXN1cmVtZW50c1twQ29udGV4dC0+bU1lYXN1cmVtZW50QnVmZmVySWR4XS5tSXNWYWxpZCA9IHRydWU7CiAgICAgICAgIGlmICgrK3BDb250ZXh0LT5tTWVhc3VyZW1lbnRCdWZmZXJJZHggPj0gcENvbnRleHQtPm1NZWFzdXJlbWVudFdpbmRvd1NpemVJbkJ1ZmZlcnMpIHsKICAgICAgICAgICAgIHBDb250ZXh0LT5tTWVhc3VyZW1lbnRCdWZmZXJJZHggPSAwOwogICAgICAgICB9CiAgICAgfQogCi0gICAgLy8gYWxsIGNvZGUgYmVsb3cgYXNzdW1lcyBzdGVyZW8gMTYgYml0IFBDTSBvdXRwdXQgYW5kIGlucHV0CisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICBmbG9hdCBmc2NhbGU7IC8vIG11bHRpcGxpY2F0aXZlIHNjYWxlCisjZWxzZQogICAgIGludDMyX3Qgc2hpZnQ7CisjZW5kaWYgLy8gQlVJTERfRkxPQVQKIAogICAgIGlmIChwQ29udGV4dC0+bVNjYWxpbmdNb2RlID09IFZJU1VBTElaRVJfU0NBTElOR19NT0RFX05PUk1BTElaRUQpIHsKICAgICAgICAgLy8gZGVyaXZlIGNhcHR1cmUgc2NhbGluZyBmYWN0b3IgZnJvbSBwZWFrIHZhbHVlIGluIGN1cnJlbnQgYnVmZmVyCiAgICAgICAgIC8vIHRoaXMgZ2l2ZXMgbW9yZSBpbnRlcmVzdGluZyBjYXB0dXJlcyBmb3IgZGlzcGxheS4KLSAgICAgICAgc2hpZnQgPSAzMjsKLSAgICAgICAgaW50IGxlbiA9IGluQnVmZmVyLT5mcmFtZUNvdW50ICogMjsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgeworCisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICAgICAgZmxvYXQgbWF4U2FtcGxlID0gMC5mOworICAgICAgICBmb3IgKHNpemVfdCBpbklkeCA9IDA7IGluSWR4IDwgc2FtcGxlTGVuOyApIHsKKyAgICAgICAgICAgIC8vIHdlIHJlY29uc3RydWN0IHRoZSBhY3R1YWwgc3VtbWVkIHZhbHVlIHRvIGVuc3VyZSBwcm9wZXIgbm9ybWFsaXphdGlvbgorICAgICAgICAgICAgLy8gZm9yIG11bHRpY2hhbm5lbCBvdXRwdXRzIChjaGFubmVscyA+IDIgbWF5IG9mdGVuIGJlIDApLgorICAgICAgICAgICAgZmxvYXQgc21wID0gMC5mOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwQ29udGV4dC0+bUNoYW5uZWxDb3VudDsgKytpKSB7CisgICAgICAgICAgICAgICAgc21wICs9IGluQnVmZmVyLT5mMzJbaW5JZHgrK107CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXhTYW1wbGUgPSBmbWF4KG1heFNhbXBsZSwgZmFicyhzbXApKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobWF4U2FtcGxlID4gMC5mKSB7CisgICAgICAgICAgICBmc2NhbGUgPSAxMjcuZiAvIG1heFNhbXBsZTsKKyAgICAgICAgICAgIGludCBleHA7IC8vIHVudXNlZAorICAgICAgICAgICAgY29uc3QgZmxvYXQgc2lnbmlmaWNhbmQgPSBmcmV4cChmc2NhbGUsICZleHApOworICAgICAgICAgICAgaWYgKHNpZ25pZmljYW5kID09IDAuNWYpIHsKKyAgICAgICAgICAgICAgICBmc2NhbGUgKj0gMjU1LmYgLyAyNTYuZjsgLy8gYXZvaWQgcmV0dXJuaW5nIHVuYWx0ZXJlZCBQQ00gc2lnbmFsCisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBzY2FsZSBkb2Vzbid0IG1hdHRlciwgdGhlIHZhbHVlcyBhcmUgYWxsIDAuCisgICAgICAgICAgICBmc2NhbGUgPSAxLmY7CisgICAgICAgIH0KKyNlbHNlCisgICAgICAgIGludDMyX3Qgb3JBY2N1bSA9IDA7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2FtcGxlTGVuOyArK2kpIHsKICAgICAgICAgICAgIGludDMyX3Qgc21wID0gaW5CdWZmZXItPnMxNltpXTsKICAgICAgICAgICAgIGlmIChzbXAgPCAwKSBzbXAgPSAtc21wIC0gMTsgLy8gdGFrZSBjYXJlIHRvIGtlZXAgdGhlIG1heCBuZWdhdGl2ZSBpbiByYW5nZQotICAgICAgICAgICAgaW50MzJfdCBjbHogPSBfX2J1aWx0aW5fY2x6KHNtcCk7Ci0gICAgICAgICAgICBpZiAoc2hpZnQgPiBjbHopIHNoaWZ0ID0gY2x6OworICAgICAgICAgICAgb3JBY2N1bSB8PSBzbXA7CiAgICAgICAgIH0KKwogICAgICAgICAvLyBBIG1heGltdW0gYW1wbGl0dWRlIHNpZ25hbCB3aWxsIGhhdmUgMTcgbGVhZGluZyB6ZXJvcywgd2hpY2ggd2Ugd2FudCB0bwogICAgICAgICAvLyB0cmFuc2xhdGUgdG8gYSBzaGlmdCBvZiA4IChmb3IgY29udmVydGluZyAxNiBiaXQgdG8gOCBiaXQpCi0gICAgICAgIHNoaWZ0ID0gMjUgLSBzaGlmdDsKKyAgICAgICAgc2hpZnQgPSAyNSAtIF9fYnVpbHRpbl9jbHoob3JBY2N1bSk7CisKICAgICAgICAgLy8gTmV2ZXIgc2NhbGUgYnkgbGVzcyB0aGFuIDggdG8gYXZvaWQgcmV0dXJuaW5nIHVuYWx0ZXJlZCBQQ00gc2lnbmFsLgogICAgICAgICBpZiAoc2hpZnQgPCAzKSB7CiAgICAgICAgICAgICBzaGlmdCA9IDM7CiAgICAgICAgIH0KICAgICAgICAgLy8gYWRkIG9uZSB0byBjb21iaW5lIHRoZSBkaXZpc2lvbiBieSAyIG5lZWRlZCBhZnRlciBzdW1taW5nIGxlZnQgYW5kIHJpZ2h0IGNoYW5uZWxzIGJlbG93CiAgICAgICAgIHNoaWZ0Kys7CisjZW5kaWYgLy8gQlVJTERfRkxPQVQKICAgICB9IGVsc2UgewogICAgICAgICBhc3NlcnQocENvbnRleHQtPm1TY2FsaW5nTW9kZSA9PSBWSVNVQUxJWkVSX1NDQUxJTkdfTU9ERV9BU19QTEFZRUQpOworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgIC8vIE5vdGU6IGlmIGNoYW5uZWxzIGFyZSB1bmNvcnJlbGF0ZWQsIDEvc3FydChOKSBjb3VsZCBiZSB1c2VkIGF0IHRoZSByaXNrIG9mIGNsaXBwaW5nLgorICAgICAgICBmc2NhbGUgPSAxLmYgLyBwQ29udGV4dC0+bUNoYW5uZWxDb3VudDsgIC8vIGFjY291bnQgZm9yIHN1bW1pbmcgYWxsIHRoZSBjaGFubmVscyB0b2dldGhlci4KKyNlbHNlCiAgICAgICAgIHNoaWZ0ID0gOTsKKyNlbmRpZiAvLyBCVUlMRF9GTE9BVAogICAgIH0KIAogICAgIHVpbnQzMl90IGNhcHRJZHg7CiAgICAgdWludDMyX3QgaW5JZHg7CiAgICAgdWludDhfdCAqYnVmID0gcENvbnRleHQtPm1DYXB0dXJlQnVmOwogICAgIGZvciAoaW5JZHggPSAwLCBjYXB0SWR4ID0gcENvbnRleHQtPm1DYXB0dXJlSWR4OwotICAgICAgICAgaW5JZHggPCBpbkJ1ZmZlci0+ZnJhbWVDb3VudDsKLSAgICAgICAgIGluSWR4KyssIGNhcHRJZHgrKykgewotICAgICAgICBpZiAoY2FwdElkeCA+PSBDQVBUVVJFX0JVRl9TSVpFKSB7Ci0gICAgICAgICAgICAvLyB3cmFwIGFyb3VuZAotICAgICAgICAgICAgY2FwdElkeCA9IDA7CisgICAgICAgICBpbklkeCA8IHNhbXBsZUxlbjsKKyAgICAgICAgIGNhcHRJZHgrKykgeworICAgICAgICBpZiAoY2FwdElkeCA+PSBDQVBUVVJFX0JVRl9TSVpFKSBjYXB0SWR4ID0gMDsgLy8gd3JhcAorCisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICAgICAgZmxvYXQgc21wID0gMC5mOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgcENvbnRleHQtPm1DaGFubmVsQ291bnQ7ICsraSkgeworICAgICAgICAgICAgc21wICs9IGluQnVmZmVyLT5mMzJbaW5JZHgrK107CiAgICAgICAgIH0KLSAgICAgICAgaW50MzJfdCBzbXAgPSBpbkJ1ZmZlci0+czE2WzIgKiBpbklkeF0gKyBpbkJ1ZmZlci0+czE2WzIgKiBpbklkeCArIDFdOwotICAgICAgICBzbXAgPSBzbXAgPj4gc2hpZnQ7CisgICAgICAgIGJ1ZltjYXB0SWR4XSA9IGNsYW1wOF9mcm9tX2Zsb2F0KHNtcCAqIGZzY2FsZSk7CisjZWxzZQorICAgICAgICBjb25zdCBpbnQzMl90IHNtcCA9IChpbkJ1ZmZlci0+czE2W2luSWR4XSArIGluQnVmZmVyLT5zMTZbaW5JZHggKyAxXSkgPj4gc2hpZnQ7CisgICAgICAgIGluSWR4ICs9IEZDQ18yOyAgLy8gaW50ZWdlciBzdXBwb3J0cyBzdGVyZW8gb25seS4KICAgICAgICAgYnVmW2NhcHRJZHhdID0gKCh1aW50OF90KXNtcCleMHg4MDsKKyNlbmRpZiAvLyBCVUlMRF9GTE9BVAogICAgIH0KIAogICAgIC8vIFhYWCB0aGUgZm9sbG93aW5nIHR3byBzaG91bGQgcmVhbGx5IGJlIGF0b21pYywgdGhvdWdoIGl0IHByb2JhYmx5IGRvZXNuJ3QKQEAgLTQwMCw2ICs0NTcsMTUgQEAKICAgICB9CiAKICAgICBpZiAoaW5CdWZmZXItPnJhdyAhPSBvdXRCdWZmZXItPnJhdykgeworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgIGlmIChwQ29udGV4dC0+bUNvbmZpZy5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9PSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFKSB7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNhbXBsZUxlbjsgKytpKSB7CisgICAgICAgICAgICAgICAgb3V0QnVmZmVyLT5mMzJbaV0gKz0gaW5CdWZmZXItPmYzMltpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1lbWNweShvdXRCdWZmZXItPnJhdywgaW5CdWZmZXItPnJhdywgc2FtcGxlTGVuICogc2l6ZW9mKGZsb2F0KSk7CisgICAgICAgIH0KKyNlbHNlCiAgICAgICAgIGlmIChwQ29udGV4dC0+bUNvbmZpZy5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9PSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFKSB7CiAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG91dEJ1ZmZlci0+ZnJhbWVDb3VudCoyOyBpKyspIHsKICAgICAgICAgICAgICAgICBvdXRCdWZmZXItPnMxNltpXSA9IGNsYW1wMTYob3V0QnVmZmVyLT5zMTZbaV0gKyBpbkJ1ZmZlci0+czE2W2ldKTsKQEAgLTQwNyw2ICs0NzMsNyBAQAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgbWVtY3B5KG91dEJ1ZmZlci0+cmF3LCBpbkJ1ZmZlci0+cmF3LCBvdXRCdWZmZXItPmZyYW1lQ291bnQgKiAyICogc2l6ZW9mKGludDE2X3QpKTsKICAgICAgICAgfQorI2VuZGlmIC8vIEJVSUxEX0ZMT0FUCiAgICAgfQogICAgIGlmIChwQ29udGV4dC0+bVN0YXRlICE9IFZJU1VBTElaRVJfU1RBVEVfQUNUSVZFKSB7CiAgICAgICAgIHJldHVybiAtRU5PREFUQTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmhlaWYvSGVpZkRlY29kZXJJbXBsLmNwcCBiL21lZGlhL2xpYmhlaWYvSGVpZkRlY29kZXJJbXBsLmNwcAppbmRleCAwMWYwMTRmLi5hOTc3MzAwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJoZWlmL0hlaWZEZWNvZGVySW1wbC5jcHAKKysrIGIvbWVkaWEvbGliaGVpZi9IZWlmRGVjb2RlckltcGwuY3BwCkBAIC04Niw3ICs4Niw3IEBACiAgICAgc3A8SU1lbW9yeT4gbU1lbW9yeTsKICAgICBzdGQ6OnVuaXF1ZV9wdHI8SGVpZlN0cmVhbT4gbVN0cmVhbTsKICAgICBib29sIG1FT1M7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPHVpbnQ4X3Q+IG1DYWNoZTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8dWludDhfdFtdPiBtQ2FjaGU7CiAgICAgb2ZmNjRfdCBtQ2FjaGVkT2Zmc2V0OwogICAgIHNpemVfdCBtQ2FjaGVkU2l6ZTsKICAgICBzaXplX3QgbUNhY2hlQnVmZmVyU2l6ZTsKQEAgLTE2NSw3ICsxNjUsNyBAQAogICAgICAgICAvLyBpdCdzIHJlYWNoaW5nIG1heCBjYWNoZSBidWZmZXIgc2l6ZSwgbmVlZCB0byByb2xsIHdpbmRvdywgYW5kIHBvc3NpYmx5CiAgICAgICAgIC8vIGV4cGFuZCB0aGUgY2FjaGUgYnVmZmVyLgogICAgICAgICBzaXplX3QgbmV3Q2FjaGVCdWZmZXJTaXplID0gbUNhY2hlQnVmZmVyU2l6ZTsKLSAgICAgICAgc3RkOjp1bmlxdWVfcHRyPHVpbnQ4X3Q+IG5ld0NhY2hlOworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8dWludDhfdFtdPiBuZXdDYWNoZTsKICAgICAgICAgdWludDhfdCogZHN0ID0gbUNhY2hlLmdldCgpOwogICAgICAgICBpZiAobmV3Q2FjaGVCdWZmZXJTaXplIDwga01heENhY2hlQnVmZmVyU2l6ZSkgewogICAgICAgICAgICAgbmV3Q2FjaGVCdWZmZXJTaXplID0ga01heENhY2hlQnVmZmVyU2l6ZTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmhlaWYvaW5jbHVkZS9IZWlmRGVjb2RlckFQSS5oIGIvbWVkaWEvbGliaGVpZi9pbmNsdWRlL0hlaWZEZWNvZGVyQVBJLmgKaW5kZXggNTE4M2MzOS4uYWExMGYzMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliaGVpZi9pbmNsdWRlL0hlaWZEZWNvZGVyQVBJLmgKKysrIGIvbWVkaWEvbGliaGVpZi9pbmNsdWRlL0hlaWZEZWNvZGVyQVBJLmgKQEAgLTc0LDcgKzc0LDcgQEAKICAgICBpbnQzMl90ICBtUm90YXRpb25BbmdsZTsgICAgICAgICAgIC8vIFJvdGF0aW9uIGFuZ2xlLCBjbG9ja3dpc2UsIHNob3VsZCBiZSBtdWx0aXBsZSBvZiA5MAogICAgIHVpbnQzMl90IG1CeXRlc1BlclBpeGVsOyAgICAgICAgICAgLy8gTnVtYmVyIG9mIGJ5dGVzIGZvciBvbmUgcGl4ZWwKICAgICB1aW50MzJfdCBtSWNjU2l6ZTsgICAgICAgICAgICAgICAgIC8vIE51bWJlciBvZiBieXRlcyBpbiBtSWNjRGF0YQotICAgIHN0ZDo6dW5pcXVlX3B0cjx1aW50OF90PiBtSWNjRGF0YTsgLy8gQWN0dWFsIElDQyBkYXRhLCBtZW1vcnkgaXMgb3duZWQgYnkgdGhpcyBzdHJ1Y3R1cmUKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8dWludDhfdFtdPiBtSWNjRGF0YTsgLy8gQWN0dWFsIElDQyBkYXRhLCBtZW1vcnkgaXMgb3duZWQgYnkgdGhpcyBzdHJ1Y3R1cmUKIH07CiAKIC8qCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9BbmRyb2lkLmJwIGIvbWVkaWEvbGlibWVkaWEvQW5kcm9pZC5icAppbmRleCA4OTIxYjIyLi4zZDllNjJlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYm1lZGlhL0FuZHJvaWQuYnAKQEAgLTIxLDcgKzIxLDcgQEAKICAgICB2bmRrOiB7CiAgICAgICAgIGVuYWJsZWQ6IHRydWUsCiAgICAgfSwKLSAgICBzcmNzOiBbIkF1ZGlvUGFyYW1ldGVyLmNwcCIsICJUeXBlQ29udmVydGVyLmNwcCIsICJUaW1lQ2hlY2suY3BwIl0sCisgICAgc3JjczogWyJBdWRpb1BhcmFtZXRlci5jcHAiLCAiVHlwZUNvbnZlcnRlci5jcHAiXSwKICAgICBjZmxhZ3M6IFsKICAgICAgICAgIi1XZXJyb3IiLAogICAgICAgICAiLVduby1lcnJvcj1kZXByZWNhdGVkLWRlY2xhcmF0aW9ucyIsCkBAIC0zMyw2ICszMyw5IEBACiAgICAgICAgICJsaWJhdWRpb2NsaWVudF9oZWFkZXJzIiwKICAgICAgICAgImxpYmF1ZGlvX3N5c3RlbV9oZWFkZXJzIiwKICAgICBdLAorICAgIGV4cG9ydF9oZWFkZXJfbGliX2hlYWRlcnM6IFsKKyAgICAgICAgImxpYm1lZGlhX2hlYWRlcnMiLAorICAgIF0sCiAgICAgY2xhbmc6IHRydWUsCiB9CiAKQEAgLTEyNSw2ICsxMjgsMTAgQEAKICAgICAgICAgImxpYnNvbml2b3giLAogICAgIF0sCiAKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibWVkaWFfbmRrX2hlYWRlcnMiLAorICAgIF0sCisKICAgICBjZmxhZ3M6IFsKICAgICAgICAgIi1XZXJyb3IiLAogICAgICAgICAiLVduby1lcnJvcj1kZXByZWNhdGVkLWRlY2xhcmF0aW9ucyIsCkBAIC0xNDYsNyArMTUzLDcgQEAKIGZpbGVncm91cCB7CiAgICAgbmFtZTogIm1lZGlhdXBkYXRlc2VydmljZV9haWRsIiwKICAgICBzcmNzOiBbCi0gICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvSU1lZGlhRXh0cmFjdG9yVXBkYXRlU2VydmljZS5haWRsIiwKKyAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9JTWVkaWFVcGRhdGVTZXJ2aWNlLmFpZGwiLAogICAgIF0sCiB9CiAKQEAgLTE4OSw2ICsxOTYsOCBAQAogICAgICAgICAiTWVkaWFSZXNvdXJjZVBvbGljeS5jcHAiLAogICAgICAgICAiVmlzdWFsaXplci5jcHAiLAogICAgICAgICAiU3RyaW5nQXJyYXkuY3BwIiwKKyAgICAgICAgIk5ka01lZGlhRm9ybWF0UHJpdi5jcHAiLAorICAgICAgICAiTmRrTWVkaWFFcnJvclByaXYuY3BwIiwKICAgICBdLAogCiAgICAgYWlkbDogewpAQCAtMTk4LDEwICsyMDcsMTIgQEAKIAogICAgIGhlYWRlcl9saWJzOiBbCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9oZWFkZXJzIiwKKyAgICAgICAgIm1lZGlhX25ka19oZWFkZXJzIiwKICAgICBdLAogCiAgICAgZXhwb3J0X2hlYWRlcl9saWJfaGVhZGVyczogWwogICAgICAgICAibGlic3RhZ2VmcmlnaHRfaGVhZGVycyIsCisgICAgICAgICJtZWRpYV9uZGtfaGVhZGVycyIsCiAgICAgXSwKIAogICAgIHNoYXJlZF9saWJzOiBbCkBAIC0yNjIsMTggKzI3MywxMyBAQAogICAgIH0sCiB9CiAKLWNjX2xpYnJhcnkgeworY2NfbGlicmFyeV9zdGF0aWMgewogICAgIG5hbWU6ICJsaWJtZWRpYV9wbGF5ZXIyX3V0aWwiLAogCiAgICAgc3JjczogWwogICAgICAgICAiQnVmZmVyaW5nU2V0dGluZ3MuY3BwIiwKICAgICAgICAgIkRhdGFTb3VyY2VEZXNjLmNwcCIsCi0gICAgICAgICJJRGF0YVNvdXJjZS5jcHAiLAotICAgICAgICAiSU1lZGlhRXh0cmFjdG9yLmNwcCIsCi0gICAgICAgICJJTWVkaWFFeHRyYWN0b3JTZXJ2aWNlLmNwcCIsCi0gICAgICAgICJJTWVkaWFTb3VyY2UuY3BwIiwKICAgICAgICAgIk1lZGlhQ29kZWNCdWZmZXIuY3BwIiwKLSAgICAgICAgIk1lZGlhVXRpbHMuY3BwIiwKICAgICAgICAgIk1ldGFkYXRhLmNwcCIsCiAgICAgICAgICJOZGtXcmFwcGVyLmNwcCIsCiAgICAgXSwKQEAgLTI4NSw2ICsyOTEsNyBAQAogICAgICAgICAibGlibWVkaWFleHRyYWN0b3IiLAogICAgICAgICAibGlibWVkaWFuZGsiLAogICAgICAgICAibGlibmF0aXZld2luZG93IiwKKyAgICAgICAgImxpYm1lZGlhbmRrX3V0aWxzIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAogICAgICAgICAibGlidWkiLAogICAgICAgICAibGlidXRpbHMiLApAQCAtMjk5LDYgKzMwNiwxMCBAQAogICAgICAgICAibWVkaWFfcGx1Z2luX2hlYWRlcnMiLAogICAgIF0sCiAKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbmRrIiwKKyAgICBdLAorCiAgICAgc3RhdGljX2xpYnM6IFsKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X3J0c3AiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfdGltZWR0ZXh0IiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0F1ZGlvUGFyYW1ldGVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL0F1ZGlvUGFyYW1ldGVyLmNwcAppbmRleCAwMzRmN2MyLi4xYzk1ZTI3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9BdWRpb1BhcmFtZXRlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvQXVkaW9QYXJhbWV0ZXIuY3BwCkBAIC0zNiw2ICszNiw4IEBACiBjb25zdCBjaGFyICogY29uc3QgQXVkaW9QYXJhbWV0ZXI6OmtleUh3QXZTeW5jID0gQVVESU9fUEFSQU1FVEVSX0hXX0FWX1NZTkM7CiBjb25zdCBjaGFyICogY29uc3QgQXVkaW9QYXJhbWV0ZXI6OmtleVByZXNlbnRhdGlvbklkID0gQVVESU9fUEFSQU1FVEVSX1NUUkVBTV9QUkVTRU5UQVRJT05fSUQ7CiBjb25zdCBjaGFyICogY29uc3QgQXVkaW9QYXJhbWV0ZXI6OmtleVByb2dyYW1JZCA9IEFVRElPX1BBUkFNRVRFUl9TVFJFQU1fUFJPR1JBTV9JRDsKK2NvbnN0IGNoYXIgKiBjb25zdCBBdWRpb1BhcmFtZXRlcjo6a2V5QXVkaW9MYW5ndWFnZVByZWZlcnJlZCA9CisgICAgICAgIEFVRElPX1BBUkFNRVRFUl9LRVlfQVVESU9fTEFOR1VBR0VfUFJFRkVSUkVEOwogY29uc3QgY2hhciAqIGNvbnN0IEF1ZGlvUGFyYW1ldGVyOjprZXlNb25vT3V0cHV0ID0gQVVESU9fUEFSQU1FVEVSX01PTk9fT1VUUFVUOwogY29uc3QgY2hhciAqIGNvbnN0IEF1ZGlvUGFyYW1ldGVyOjprZXlTdHJlYW1Id0F2U3luYyA9IEFVRElPX1BBUkFNRVRFUl9TVFJFQU1fSFdfQVZfU1lOQzsKIGNvbnN0IGNoYXIgKiBjb25zdCBBdWRpb1BhcmFtZXRlcjo6a2V5U3RyZWFtQ29ubmVjdCA9IEFVRElPX1BBUkFNRVRFUl9ERVZJQ0VfQ09OTkVDVDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYUV4dHJhY3RvclNlcnZpY2UuY3BwIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhRXh0cmFjdG9yU2VydmljZS5jcHAKaW5kZXggZDc1MzNjYS4uMDI5NWFiYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhRXh0cmFjdG9yU2VydmljZS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhRXh0cmFjdG9yU2VydmljZS5jcHAKQEAgLTIzLDcgKzIzLDYgQEAKICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhRXh0cmFjdG9yU2VydmljZS5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5jcHAgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFQbGF5ZXJTZXJ2aWNlLmNwcAppbmRleCBhY2E3YWQ5Li5iZDE4YTQwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFQbGF5ZXJTZXJ2aWNlLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFQbGF5ZXJTZXJ2aWNlLmNwcApAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUNvZGVjTGlzdC5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5oPgorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYVBsYXllci5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYVJlY29yZGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU9NWC5oPgogI2luY2x1ZGUgPG1lZGlhL0lSZW1vdGVEaXNwbGF5Lmg+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFTb3VyY2UuY3BwIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhU291cmNlLmNwcAppbmRleCBmMTg1ZmQ0Li5lN2RhNDg4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFTb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYVNvdXJjZS5jcHAKQEAgLTE4Niw2ICsxODYsOSBAQAogICAgICAgICByZXQgPSByZXBseS5yZWFkSW50MzIoKTsKICAgICAgICAgQUxPR1YoInJlYWRNdWx0aXBsZSBzdGF0dXMgJWQsIGJ1ZmZlckNvdW50ICV1LCBzaW5jZVN0b3AgJXUiLAogICAgICAgICAgICAgICAgIHJldCwgYnVmZmVyQ291bnQsIG1CdWZmZXJzU2luY2VTdG9wKTsKKyAgICAgICAgaWYgKGJ1ZmZlckNvdW50ICYmIHJldCA9PSBXT1VMRF9CTE9DSykgeworICAgICAgICAgICAgcmV0ID0gT0s7CisgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHJldDsKICAgICB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL01pZGlJb1dyYXBwZXIuY3BwIGIvbWVkaWEvbGlibWVkaWEvTWlkaUlvV3JhcHBlci5jcHAKaW5kZXggNWNhM2I0OC4uMTE1MGQ2MSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvTWlkaUlvV3JhcHBlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvTWlkaUlvV3JhcHBlci5jcHAKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxmY250bC5oPgogCiAjaW5jbHVkZSA8bWVkaWEvTWlkaUlvV3JhcHBlci5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luQXBpLmg+CiAKIHN0YXRpYyBpbnQgcmVhZEF0KHZvaWQgKmhhbmRsZSwgdm9pZCAqYnVmZmVyLCBpbnQgcG9zLCBpbnQgc2l6ZSkgewogICAgIHJldHVybiAoKGFuZHJvaWQ6Ok1pZGlJb1dyYXBwZXIqKWhhbmRsZSktPnJlYWRBdChidWZmZXIsIHBvcywgc2l6ZSk7CkBAIC02MSw2ICs2Miw1MSBAQAogICAgIH0KIH0KIAorY2xhc3MgRGF0YVNvdXJjZVVud3JhcHBlciA6IHB1YmxpYyBEYXRhU291cmNlQmFzZSB7CisKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBEYXRhU291cmNlVW53cmFwcGVyKENEYXRhU291cmNlICpjc291cmNlKSB7CisgICAgICAgIG1Tb3VyY2UgPSBjc291cmNlOworICAgIH0KKyAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRDaGVjaygpIGNvbnN0IHsgcmV0dXJuIE9LOyB9CisKKyAgICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZCwgb3IgLTEgb24gZmFpbHVyZS4gSXQncyBub3QgYW4gZXJyb3IgaWYKKyAgICAvLyB0aGlzIHJldHVybnMgemVybzsgaXQganVzdCBtZWFucyB0aGUgZ2l2ZW4gb2Zmc2V0IGlzIGVxdWFsIHRvLCBvcgorICAgIC8vIGJleW9uZCwgdGhlIGVuZCBvZiB0aGUgc291cmNlLgorICAgIHZpcnR1YWwgc3NpemVfdCByZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgICAgIHJldHVybiBtU291cmNlLT5yZWFkQXQobVNvdXJjZS0+aGFuZGxlLCBvZmZzZXQsIGRhdGEsIHNpemUpOworICAgIH0KKworICAgIC8vIE1heSByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTaXplKG9mZjY0X3QgKnNpemUpIHsKKyAgICAgICAgcmV0dXJuIG1Tb3VyY2UtPmdldFNpemUobVNvdXJjZS0+aGFuZGxlLCBzaXplKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGJvb2wgZ2V0VXJpKGNoYXIgKiAvKnVyaVN0cmluZyovLCBzaXplX3QgLypidWZmZXJTaXplKi8pIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHZpcnR1YWwgdWludDMyX3QgZmxhZ3MoKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBjbG9zZSgpIHt9OworcHJpdmF0ZToKKyAgICBDRGF0YVNvdXJjZSAqbVNvdXJjZTsKK307CisKK01pZGlJb1dyYXBwZXI6Ok1pZGlJb1dyYXBwZXIoQ0RhdGFTb3VyY2UgKmNzb3VyY2UpIHsKKyAgICBBTE9HVigiTWlkaUlvV3JhcHBlcihDRGF0YVNvdXJjZSkiKTsKKyAgICBtRmQgPSAtMTsKKyAgICBtRGF0YVNvdXJjZSA9IG5ldyBEYXRhU291cmNlVW53cmFwcGVyKGNzb3VyY2UpOworICAgIG9mZjY0X3QgbDsKKyAgICBpZiAobURhdGFTb3VyY2UtPmdldFNpemUoJmwpID09IE9LKSB7CisgICAgICAgIG1MZW5ndGggPSBsOworICAgIH0gZWxzZSB7CisgICAgICAgIG1MZW5ndGggPSAwOworICAgIH0KK30KKwogTWlkaUlvV3JhcHBlcjo6fk1pZGlJb1dyYXBwZXIoKSB7CiAgICAgQUxPR1YoIn5NaWRpSW9XcmFwcGVyIik7CiAgICAgaWYgKG1GZCA+PSAwKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9OZGtNZWRpYUVycm9yUHJpdi5jcHAgYi9tZWRpYS9saWJtZWRpYS9OZGtNZWRpYUVycm9yUHJpdi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmEzYjkxOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhL05ka01lZGlhRXJyb3JQcml2LmNwcApAQCAtMCwwICsxLDY0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRXJyb3IuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworbWVkaWFfc3RhdHVzX3QgdHJhbnNsYXRlX2Vycm9yKHN0YXR1c190IGVycikgeworCisgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICByZXR1cm4gQU1FRElBX09LOworICAgIH0gZWxzZSBpZiAoZXJyID09IEVSUk9SX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgIH0gZWxzZSBpZiAoZXJyID09IEVSUk9SX0lPKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU87CisgICAgfSBlbHNlIGlmIChlcnIgPT0gRVJST1JfTUFMRk9STUVEKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOworICAgIH0gZWxzZSBpZiAoZXJyID09IElOVkFMSURfT1BFUkFUSU9OKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU5WQUxJRF9PUEVSQVRJT047CisgICAgfSBlbHNlIGlmIChlcnIgPT0gVU5LTk9XTl9FUlJPUikgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CisgICAgfQorCisgICAgQUxPR0UoInNmIGVycm9yIGNvZGU6ICVkIiwgZXJyKTsKKyAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047Cit9CisKK3N0YXR1c190IHJldmVyc2VfdHJhbnNsYXRlX2Vycm9yKG1lZGlhX3N0YXR1c190IGVycikgeworCisgICAgaWYgKGVyciA9PSBBTUVESUFfT0spIHsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0gZWxzZSBpZiAoZXJyID09IEFNRURJQV9FUlJPUl9FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgIH0gZWxzZSBpZiAoZXJyID09IEFNRURJQV9FUlJPUl9JTykgeworICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgfSBlbHNlIGlmIChlcnIgPT0gQU1FRElBX0VSUk9SX1dPVUxEX0JMT0NLKSB7CisgICAgICAgIHJldHVybiBXT1VMRF9CTE9DSzsKKyAgICB9IGVsc2UgaWYgKGVyciA9PSBBTUVESUFfRVJST1JfTUFMRk9STUVEKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfSBlbHNlIGlmIChlcnIgPT0gQU1FRElBX0VSUk9SX0lOVkFMSURfT1BFUkFUSU9OKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9IGVsc2UgaWYgKGVyciA9PSBBTUVESUFfRVJST1JfVU5LTk9XTikgeworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICBBTE9HRSgibmRrIGVycm9yIGNvZGU6ICVkIiwgZXJyKTsKKyAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL05ka01lZGlhRm9ybWF0UHJpdi5jcHAgYi9tZWRpYS9saWJtZWRpYS9OZGtNZWRpYUZvcm1hdFByaXYuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjODRkNmEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYS9OZGtNZWRpYUZvcm1hdFByaXYuY3BwCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIk5ka01lZGlhRm9ybWF0IgorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworLy8jaW5jbHVkZSA8bmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFGb3JtYXQuaD4KKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUZvcm1hdFByaXYuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisvLyNpbmNsdWRlIDxhbmRyb2lkX3J1bnRpbWUvQW5kcm9pZFJ1bnRpbWUuaD4KKy8vI2luY2x1ZGUgPGFuZHJvaWRfdXRpbF9CaW5kZXIuaD4KKworI2luY2x1ZGUgPGpuaS5oPgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworZXh0ZXJuICJDIiB7CisKKy8vIHByaXZhdGUgZnVuY3Rpb25zIGZvciBjb252ZXJzaW9uIHRvL2Zyb20gQU1lc3NhZ2UKK0FNZWRpYUZvcm1hdCogQU1lZGlhRm9ybWF0X2Zyb21Nc2coY29uc3Qgdm9pZCogZGF0YSkgeworICAgIEFMT0dWKCJwcml2YXRlIGN0b3IiKTsKKyAgICBBTWVkaWFGb3JtYXQqIG1EYXRhID0gbmV3IEFNZWRpYUZvcm1hdCgpOworICAgIG1EYXRhLT5tRm9ybWF0ID0gKigoc3A8QU1lc3NhZ2U+KilkYXRhKTsKKyAgICBpZiAobURhdGEtPm1Gb3JtYXQgPT0gTlVMTCkgeworICAgICAgICBBTE9HVygiZ290IE5VTEwgZm9ybWF0Iik7CisgICAgICAgIG1EYXRhLT5tRm9ybWF0ID0gbmV3IEFNZXNzYWdlOworICAgIH0KKyAgICByZXR1cm4gbURhdGE7Cit9CisKK3ZvaWQgQU1lZGlhRm9ybWF0X2dldEZvcm1hdChjb25zdCBBTWVkaWFGb3JtYXQqIG1EYXRhLCB2b2lkKiBkZXN0KSB7CisgICAgKigoc3A8QU1lc3NhZ2U+KilkZXN0KSA9IG1EYXRhLT5tRm9ybWF0OworfQorCit9IC8vIGV4dGVybiAiQyIKKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9OZGtXcmFwcGVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL05ka1dyYXBwZXIuY3BwCmluZGV4IDI3MmJjMzAuLmVlZDk2ZTcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL05ka1dyYXBwZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL05ka1dyYXBwZXIuY3BwCkBAIC0zMSwxNyArMzEsNyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KIAotLy8gVE9ETzogcmVtb3ZlIGZvcndhcmQgZGVjbGFyYXRpb24gd2hlbiBBTWVkaWFFeHRyYWN0b3JfZGlzY29ubmVjdCBpcyBvZmZjaWFsbHkgYWRkZWQgdG8gTkRLCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotbWVkaWFfc3RhdHVzX3QgQU1lZGlhRXh0cmFjdG9yX2Rpc2Nvbm5lY3QoQU1lZGlhRXh0cmFjdG9yICopOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0gLy8gZXh0ZXJuICJDIgotI2VuZGlmCisjaW5jbHVkZSAiTmRrTWVkaWFEYXRhU291cmNlQ2FsbGJhY2tzUHJpdi5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTEwODAsMTQgKzEwNzAsNiBAQAogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgQU1lZGlhRXh0cmFjdG9yV3JhcHBlcjo6ZGlzY29ubmVjdCgpIHsKLSAgICBpZiAobUFNZWRpYUV4dHJhY3RvciAhPSBOVUxMKSB7Ci0gICAgICAgIG1lZGlhX3N0YXR1c190IGVyciA9IEFNZWRpYUV4dHJhY3Rvcl9kaXNjb25uZWN0KG1BTWVkaWFFeHRyYWN0b3IpOwotICAgICAgICByZXR1cm4gdHJhbnNsYXRlRXJyb3JDb2RlKGVycik7Ci0gICAgfQotICAgIHJldHVybiBERUFEX09CSkVDVDsKLX0KLQogQU1lZGlhRXh0cmFjdG9yICpBTWVkaWFFeHRyYWN0b3JXcmFwcGVyOjpnZXRBTWVkaWFFeHRyYWN0b3IoKSBjb25zdCB7CiAgICAgcmV0dXJuIG1BTWVkaWFFeHRyYWN0b3I7CiB9CkBAIC0xMjY0LDM3ICsxMjQ2LDIxIEBACiAgICAgcmV0dXJuIG5ldyBBTWVkaWFDb2RlY0NyeXB0b0luZm9XcmFwcGVyKEFNZWRpYUV4dHJhY3Rvcl9nZXRTYW1wbGVDcnlwdG9JbmZvKG1BTWVkaWFFeHRyYWN0b3IpKTsKIH0KIAotc3NpemVfdCBBTWVkaWFEYXRhU291cmNlV3JhcHBlcjo6QU1lZGlhRGF0YVNvdXJjZVdyYXBwZXJfZ2V0U2l6ZSh2b2lkICp1c2VyZGF0YSkgewotICAgIERhdGFTb3VyY2UgKnNvdXJjZSA9IHN0YXRpY19jYXN0PERhdGFTb3VyY2UgKj4odXNlcmRhdGEpOwotICAgIG9mZjY0X3Qgc2l6ZSA9IC0xOwotICAgIHNvdXJjZS0+Z2V0U2l6ZSgmc2l6ZSk7Ci0gICAgcmV0dXJuIHNpemU7Ci19Ci0KLXNzaXplX3QgQU1lZGlhRGF0YVNvdXJjZVdyYXBwZXI6OkFNZWRpYURhdGFTb3VyY2VXcmFwcGVyX3JlYWRBdCh2b2lkICp1c2VyZGF0YSwgb2ZmNjRfdCBvZmZzZXQsIHZvaWQgKiBidWYsIHNpemVfdCBzaXplKSB7Ci0gICAgRGF0YVNvdXJjZSAqc291cmNlID0gc3RhdGljX2Nhc3Q8RGF0YVNvdXJjZSAqPih1c2VyZGF0YSk7Ci0gICAgcmV0dXJuIHNvdXJjZS0+cmVhZEF0KG9mZnNldCwgYnVmLCBzaXplKTsKLX0KLQotdm9pZCBBTWVkaWFEYXRhU291cmNlV3JhcHBlcjo6QU1lZGlhRGF0YVNvdXJjZVdyYXBwZXJfY2xvc2Uodm9pZCAqdXNlcmRhdGEpIHsKLSAgICBEYXRhU291cmNlICpzb3VyY2UgPSBzdGF0aWNfY2FzdDxEYXRhU291cmNlICo+KHVzZXJkYXRhKTsKLSAgICBzb3VyY2UtPmNsb3NlKCk7Ci19Ci0KIEFNZWRpYURhdGFTb3VyY2VXcmFwcGVyOjpBTWVkaWFEYXRhU291cmNlV3JhcHBlcihjb25zdCBzcDxEYXRhU291cmNlPiAmZGF0YVNvdXJjZSkKICAgICA6IG1EYXRhU291cmNlKGRhdGFTb3VyY2UpLAotICAgICAgbUFNZWRpYURhdGFTb3VyY2UoQU1lZGlhRGF0YVNvdXJjZV9uZXcoKSkgewotICAgIEFMT0dWKCJzZXREYXRhU291cmNlIChzb3VyY2U6ICVwKSIsIGRhdGFTb3VyY2UuZ2V0KCkpOwotICAgIEFNZWRpYURhdGFTb3VyY2Vfc2V0VXNlcmRhdGEobUFNZWRpYURhdGFTb3VyY2UsIGRhdGFTb3VyY2UuZ2V0KCkpOwotICAgIEFNZWRpYURhdGFTb3VyY2Vfc2V0UmVhZEF0KG1BTWVkaWFEYXRhU291cmNlLCBBTWVkaWFEYXRhU291cmNlV3JhcHBlcl9yZWFkQXQpOwotICAgIEFNZWRpYURhdGFTb3VyY2Vfc2V0R2V0U2l6ZShtQU1lZGlhRGF0YVNvdXJjZSwgQU1lZGlhRGF0YVNvdXJjZVdyYXBwZXJfZ2V0U2l6ZSk7Ci0gICAgQU1lZGlhRGF0YVNvdXJjZV9zZXRDbG9zZShtQU1lZGlhRGF0YVNvdXJjZSwgQU1lZGlhRGF0YVNvdXJjZVdyYXBwZXJfY2xvc2UpOworICAgICAgbUFNZWRpYURhdGFTb3VyY2UoY29udmVydERhdGFTb3VyY2VUb0FNZWRpYURhdGFTb3VyY2UoZGF0YVNvdXJjZSkpIHsKK30KKworQU1lZGlhRGF0YVNvdXJjZVdyYXBwZXI6OkFNZWRpYURhdGFTb3VyY2VXcmFwcGVyKEFNZWRpYURhdGFTb3VyY2UgKmFEYXRhU291cmNlKQorICAgIDogbURhdGFTb3VyY2UoTlVMTCksCisgICAgICBtQU1lZGlhRGF0YVNvdXJjZShhRGF0YVNvdXJjZSkgewogfQogCiBBTWVkaWFEYXRhU291cmNlV3JhcHBlcjo6fkFNZWRpYURhdGFTb3VyY2VXcmFwcGVyKCkgewogICAgIGlmIChtQU1lZGlhRGF0YVNvdXJjZSA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CisgICAgQU1lZGlhRGF0YVNvdXJjZV9jbG9zZShtQU1lZGlhRGF0YVNvdXJjZSk7CiAgICAgQU1lZGlhRGF0YVNvdXJjZV9kZWxldGUobUFNZWRpYURhdGFTb3VyY2UpOwogICAgIG1BTWVkaWFEYXRhU291cmNlID0gTlVMTDsKIH0KQEAgLTEzMDMsNCArMTI2OSw4IEBACiAgICAgcmV0dXJuIG1BTWVkaWFEYXRhU291cmNlOwogfQogCit2b2lkIEFNZWRpYURhdGFTb3VyY2VXcmFwcGVyOjpjbG9zZSgpIHsKKyAgICBBTWVkaWFEYXRhU291cmNlX2Nsb3NlKG1BTWVkaWFEYXRhU291cmNlKTsKK30KKwogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL1RpbWVDaGVjay5jcHAgYi9tZWRpYS9saWJtZWRpYS9UaW1lQ2hlY2suY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWI1ZDRmLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYm1lZGlhL1RpbWVDaGVjay5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi0jaW5jbHVkZSA8bWVkaWEvVGltZUNoZWNrLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLyogc3RhdGljICovCi1zcDxUaW1lQ2hlY2s6OlRpbWVDaGVja1RocmVhZD4gVGltZUNoZWNrOjpnZXRUaW1lQ2hlY2tUaHJlYWQoKQotewotICAgIHN0YXRpYyBzcDxUaW1lQ2hlY2s6OlRpbWVDaGVja1RocmVhZD4gc1RpbWVDaGVja1RocmVhZCA9IG5ldyBUaW1lQ2hlY2s6OlRpbWVDaGVja1RocmVhZCgpOwotICAgIHJldHVybiBzVGltZUNoZWNrVGhyZWFkOwotfQotCi1UaW1lQ2hlY2s6OlRpbWVDaGVjayhjb25zdCBjaGFyICp0YWcsIHVpbnQzMl90IHRpbWVvdXRNcykKLSAgICA6IG1FbmRUaW1lTnMoZ2V0VGltZUNoZWNrVGhyZWFkKCktPnN0YXJ0TW9uaXRvcmluZyh0YWcsIHRpbWVvdXRNcykpCi17Ci19Ci0KLVRpbWVDaGVjazo6flRpbWVDaGVjaygpIHsKLSAgICBnZXRUaW1lQ2hlY2tUaHJlYWQoKS0+c3RvcE1vbml0b3JpbmcobUVuZFRpbWVOcyk7Ci19Ci0KLVRpbWVDaGVjazo6VGltZUNoZWNrVGhyZWFkOjp+VGltZUNoZWNrVGhyZWFkKCkKLXsKLSAgICBBdXRvTXV0ZXggX2wobU11dGV4KTsKLSAgICByZXF1ZXN0RXhpdCgpOwotICAgIG1Nb25pdG9yUmVxdWVzdHMuY2xlYXIoKTsKLSAgICBtQ29uZC5zaWduYWwoKTsKLX0KLQotbnNlY3NfdCBUaW1lQ2hlY2s6OlRpbWVDaGVja1RocmVhZDo6c3RhcnRNb25pdG9yaW5nKGNvbnN0IGNoYXIgKnRhZywgdWludDMyX3QgdGltZW91dE1zKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1NdXRleCk7Ci0gICAgbnNlY3NfdCBlbmRUaW1lTnMgPSBzeXN0ZW1UaW1lKCkgKyBtaWxsaXNlY29uZHModGltZW91dE1zKTsKLSAgICBmb3IgKDsgbU1vbml0b3JSZXF1ZXN0cy5pbmRleE9mS2V5KGVuZFRpbWVOcykgPj0gMDsgKytlbmRUaW1lTnMpOwotICAgIG1Nb25pdG9yUmVxdWVzdHMuYWRkKGVuZFRpbWVOcywgdGFnKTsKLSAgICBtQ29uZC5zaWduYWwoKTsKLSAgICByZXR1cm4gZW5kVGltZU5zOwotfQotCi12b2lkIFRpbWVDaGVjazo6VGltZUNoZWNrVGhyZWFkOjpzdG9wTW9uaXRvcmluZyhuc2Vjc190IGVuZFRpbWVOcykgewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTXV0ZXgpOwotICAgIG1Nb25pdG9yUmVxdWVzdHMucmVtb3ZlSXRlbShlbmRUaW1lTnMpOwotICAgIG1Db25kLnNpZ25hbCgpOwotfQotCi1ib29sIFRpbWVDaGVjazo6VGltZUNoZWNrVGhyZWFkOjp0aHJlYWRMb29wKCkKLXsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBUSU1FRF9PVVQ7Ci0gICAgY29uc3QgY2hhciAqdGFnOwotICAgIHsKLSAgICAgICAgQXV0b011dGV4IF9sKG1NdXRleCk7Ci0KLSAgICAgICAgaWYgKGV4aXRQZW5kaW5nKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIG5zZWNzX3QgZW5kVGltZU5zID0gSU5UNjRfTUFYOwotICAgICAgICAvLyBLZXllZFZlY3RvciBtTW9uaXRvclJlcXVlc3RzIGlzIG9yZGVyZWQgc28gdGFrZSBmaXJzdCBlbnRyeSBhcyBuZXh0IHRpbWVvdXQKLSAgICAgICAgaWYgKG1Nb25pdG9yUmVxdWVzdHMuc2l6ZSgpICE9IDApIHsKLSAgICAgICAgICAgIGVuZFRpbWVOcyA9IG1Nb25pdG9yUmVxdWVzdHMua2V5QXQoMCk7Ci0gICAgICAgICAgICB0YWcgPSBtTW9uaXRvclJlcXVlc3RzLnZhbHVlQXQoMCk7Ci0gICAgICAgIH0KLQotICAgICAgICBjb25zdCBuc2Vjc190IHdhaXRUaW1lTnMgPSBlbmRUaW1lTnMgLSBzeXN0ZW1UaW1lKCk7Ci0gICAgICAgIGlmICh3YWl0VGltZU5zID4gMCkgewotICAgICAgICAgICAgc3RhdHVzID0gbUNvbmQud2FpdFJlbGF0aXZlKG1NdXRleCwgd2FpdFRpbWVOcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgTE9HX0FMV0FZU19GQVRBTF9JRihzdGF0dXMgIT0gTk9fRVJST1IsICJUaW1lQ2hlY2sgdGltZW91dCBmb3IgJXMiLCB0YWcpOwotICAgIHJldHVybiB0cnVlOwotfQotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvVHlwZUNvbnZlcnRlci5jcHAgYi9tZWRpYS9saWJtZWRpYS9UeXBlQ29udmVydGVyLmNwcAppbmRleCBhM2RiNzU0Li41MTRjNzk1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9UeXBlQ29udmVydGVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9UeXBlQ29udmVydGVyLmNwcApAQCAtMTMyLDYgKzEzMiw3IEBACiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0lOUFVUX0ZMQUdfTU1BUF9OT0lSUSksCiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0lOUFVUX0ZMQUdfVk9JUF9UWCksCiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0lOUFVUX0ZMQUdfSFdfQVZfU1lOQyksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0lOUFVUX0ZMQUdfRElSRUNUKSwKICAgICBURVJNSU5BVE9SCiB9OwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9haWRsL2FuZHJvaWQvbWVkaWEvSU1lZGlhRXh0cmFjdG9yVXBkYXRlU2VydmljZS5haWRsIGIvbWVkaWEvbGlibWVkaWEvYWlkbC9hbmRyb2lkL21lZGlhL0lNZWRpYUV4dHJhY3RvclVwZGF0ZVNlcnZpY2UuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdiMWJjOS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJtZWRpYS9haWRsL2FuZHJvaWQvbWVkaWEvSU1lZGlhRXh0cmFjdG9yVXBkYXRlU2VydmljZS5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLm1lZGlhOwotCi0vKioKLSAqIFNlcnZpY2UgdG8gcmVsb2FkIGV4dHJhY3RvciBwbHVnaW5zIHdoZW4gdXBkYXRlIHBhY2thZ2UgaXMgaW5zdGFsbGVkL3VuaW5zdGFsbGVkLgotICogQGhpZGUKLSAqLwotaW50ZXJmYWNlIElNZWRpYUV4dHJhY3RvclVwZGF0ZVNlcnZpY2UgewotICAgIHZvaWQgbG9hZFBsdWdpbnMoQHV0ZjhJbkNwcCBTdHJpbmcgYXBrUGF0aCk7Ci19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9haWRsL2FuZHJvaWQvbWVkaWEvSU1lZGlhVXBkYXRlU2VydmljZS5haWRsIGIvbWVkaWEvbGlibWVkaWEvYWlkbC9hbmRyb2lkL21lZGlhL0lNZWRpYVVwZGF0ZVNlcnZpY2UuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Nzc3OTY5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWEvYWlkbC9hbmRyb2lkL21lZGlhL0lNZWRpYVVwZGF0ZVNlcnZpY2UuYWlkbApAQCAtMCwwICsxLDI1IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWE7CisKKy8qKgorICogU2VydmljZSB0byByZWxvYWQgbWVkaWEgY29tcG9uZW50IHBsdWdpbnMgd2hlbiB1cGRhdGUgcGFja2FnZSBpcyBpbnN0YWxsZWQvdW5pbnN0YWxsZWQuCisgKiBAaGlkZQorICovCitpbnRlcmZhY2UgSU1lZGlhVXBkYXRlU2VydmljZSB7CisgICAgdm9pZCBsb2FkUGx1Z2lucyhAdXRmOEluQ3BwIFN0cmluZyBhcGtQYXRoKTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvRGF0YVNvdXJjZURlc2MuaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvRGF0YVNvdXJjZURlc2MuaAppbmRleCBjMTkwMjYxLi40MzM2NzY3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0RhdGFTb3VyY2VEZXNjLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9EYXRhU291cmNlRGVzYy5oCkBAIC0zMCw2ICszMCwxMSBAQAogLy8gQSBiaW5kZXIgaW50ZXJmYWNlIGZvciBpbXBsZW1lbnRpbmcgYSBzdGFnZWZyaWdodCBEYXRhU291cmNlIHJlbW90ZWx5Lgogc3RydWN0IERhdGFTb3VyY2VEZXNjIDogcHVibGljIFJlZkJhc2UgewogcHVibGljOgorICAgIC8vIGludGVudGlvbmFsbHkgbGVzcyB0aGFuIElOVDY0X01BWAorICAgIC8vIGtlZXAgY29uc2lzdGVudCB3aXRoIEpBVkEgY29kZQorICAgIHN0YXRpYyBjb25zdCBpbnQ2NF90IGtNYXhUaW1lTXMgPSAweDdmZmZmZmZmZmZmZmZmZmxsIC8gMTAwMDsKKyAgICBzdGF0aWMgY29uc3QgaW50NjRfdCBrTWF4VGltZVVzID0ga01heFRpbWVNcyAqIDEwMDA7CisKICAgICBlbnVtIHsKICAgICAgICAgLyogTm8gZGF0YSBzb3VyY2UgaGFzIGJlZW4gc2V0IHlldCAqLwogICAgICAgICBUWVBFX05PTkUgICAgID0gMCwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvRHJtSGFsLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0RybUhhbC5oCmluZGV4IGYyNjdmNzYuLjMzMDI5ODIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvRHJtSGFsLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9Ecm1IYWwuaApAQCAtMjMsNiArMjMsOCBAQAogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMC9JRHJtUGx1Z2luTGlzdGVuZXIuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjEvSURybUZhY3RvcnkuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjEvSURybVBsdWdpbi5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMi9JRHJtRmFjdG9yeS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMi9JRHJtUGx1Z2luLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9NZWRpYUFuYWx5dGljc0l0ZW0uaD4KICNpbmNsdWRlIDxtZWRpYWRybS9Ecm1NZXRyaWNzLmg+CkBAIC0zNiw2ICszOCw3IEBACiB1c2luZyBkcm06OlYxXzA6OklEcm1QbHVnaW47CiB1c2luZyBkcm06OlYxXzA6OklEcm1QbHVnaW5MaXN0ZW5lcjsKIHVzaW5nIGRybTo6VjFfMDo6S2V5U3RhdHVzOwordXNpbmcgZHJtOjpWMV8yOjpPZmZsaW5lTGljZW5zZVN0YXRlOwogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7CiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47CiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpWb2lkOwpAQCAtMTEzLDYgKzExNiwxMSBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2VjdXJpdHlMZXZlbChWZWN0b3I8dWludDhfdD4gY29uc3QgJnNlc3Npb25JZCwKICAgICAgICAgICAgIERybVBsdWdpbjo6U2VjdXJpdHlMZXZlbCAqbGV2ZWwpIGNvbnN0OwogCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRPZmZsaW5lTGljZW5zZUtleVNldElkcyhMaXN0PFZlY3Rvcjx1aW50OF90Pj4gJmtleVNldElkcykgY29uc3Q7CisgICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVPZmZsaW5lTGljZW5zZShWZWN0b3I8dWludDhfdD4gY29uc3QgJmtleVNldElkKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE9mZmxpbmVMaWNlbnNlU3RhdGUoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZrZXlTZXRJZCwKKyAgICAgICAgICAgIERybVBsdWdpbjo6T2ZmbGluZUxpY2Vuc2VTdGF0ZSAqbGljZW5zZVN0YXRlKSBjb25zdDsKKwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UHJvcGVydHlTdHJpbmcoU3RyaW5nOCBjb25zdCAmbmFtZSwgU3RyaW5nOCAmdmFsdWUgKSBjb25zdDsKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFByb3BlcnR5Qnl0ZUFycmF5KFN0cmluZzggY29uc3QgJm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gJnZhbHVlICkgY29uc3Q7CkBAIC0xODIsNiArMTkwLDcgQEAKICAgICBjb25zdCBWZWN0b3I8c3A8SURybUZhY3Rvcnk+PiBtRmFjdG9yaWVzOwogICAgIHNwPElEcm1QbHVnaW4+IG1QbHVnaW47CiAgICAgc3A8ZHJtOjpWMV8xOjpJRHJtUGx1Z2luPiBtUGx1Z2luVjFfMTsKKyAgICBzcDxkcm06OlYxXzI6OklEcm1QbHVnaW4+IG1QbHVnaW5WMV8yOwogICAgIFN0cmluZzggbUFwcFBhY2thZ2VOYW1lOwogCiAgICAgLy8gTXV0YWJsZSB0byBhbGxvdyBtb2RpZmljYXRpb24gd2l0aGluIEdldFByb3BlcnR5Qnl0ZUFycmF5LgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JRHJtLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lEcm0uaAppbmRleCA4ZTllYjNhLi40OTE2NmM2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lEcm0uaAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lEcm0uaApAQCAtNzUsOCArNzUsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiAmY2VydGlmaWNhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+ICZ3cmFwcGVkS2V5KSA9IDA7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNlY3VyZVN0b3BzKExpc3Q8VmVjdG9yPHVpbnQ4X3Q+ID4gJnNlY3VyZVN0b3BzKSA9IDA7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTZWN1cmVTdG9wSWRzKExpc3Q8VmVjdG9yPHVpbnQ4X3Q+ID4gJnNlY3VyZVN0b3BJZHMpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNlY3VyZVN0b3BzKExpc3Q8VmVjdG9yPHVpbnQ4X3Q+PiAmc2VjdXJlU3RvcHMpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNlY3VyZVN0b3BJZHMoTGlzdDxWZWN0b3I8dWludDhfdD4+ICZzZWN1cmVTdG9wSWRzKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTZWN1cmVTdG9wKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc3NpZCwgVmVjdG9yPHVpbnQ4X3Q+ICZzZWN1cmVTdG9wKSA9IDA7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHJlbGVhc2VTZWN1cmVTdG9wcyhWZWN0b3I8dWludDhfdD4gY29uc3QgJnNzUmVsZWFzZSkgPSAwOwpAQCAtOTEsNiArOTEsMTEgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNlY3VyaXR5TGV2ZWwoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzZXNzaW9uSWQsCiAgICAgICAgICAgICBEcm1QbHVnaW46OlNlY3VyaXR5TGV2ZWwgKmxldmVsKSBjb25zdCA9IDA7CiAKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE9mZmxpbmVMaWNlbnNlS2V5U2V0SWRzKExpc3Q8VmVjdG9yPHVpbnQ4X3Q+PiAma2V5U2V0SWRzKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVPZmZsaW5lTGljZW5zZShWZWN0b3I8dWludDhfdD4gY29uc3QgJmtleVNldElkKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRPZmZsaW5lTGljZW5zZVN0YXRlKFZlY3Rvcjx1aW50OF90PiBjb25zdCAma2V5U2V0SWQsCisgICAgICAgICAgICBEcm1QbHVnaW46Ok9mZmxpbmVMaWNlbnNlU3RhdGUgKmxpY2Vuc2VTdGF0ZSkgY29uc3QgPSAwOworCiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQcm9wZXJ0eVN0cmluZyhTdHJpbmc4IGNvbnN0ICZuYW1lLCBTdHJpbmc4ICZ2YWx1ZSkgY29uc3QgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UHJvcGVydHlCeXRlQXJyYXkoU3RyaW5nOCBjb25zdCAmbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiAmdmFsdWUpIGNvbnN0ID0gMDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JTWVkaWFQbGF5ZXJTZXJ2aWNlLmgKaW5kZXggMjE3ZGUxNC4uZjJlMjA2MCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JTWVkaWFQbGF5ZXJTZXJ2aWNlLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JTWVkaWFQbGF5ZXJTZXJ2aWNlLmgKQEAgLTI2LDExICsyNiwxMSBAQAogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogCiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhUGxheWVyQ2xpZW50Lmg+Ci0jaW5jbHVkZSA8bWVkaWEvSU1lZGlhUGxheWVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCitjbGFzcyBJTWVkaWFQbGF5ZXI7CiBjbGFzcyBJTWVkaWFDb2RlY0xpc3Q7CiBzdHJ1Y3QgSU1lZGlhSFRUUFNlcnZpY2U7CiBjbGFzcyBJTWVkaWFSZWNvcmRlcjsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSkF1ZGlvQXR0cmlidXRlcy5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9KQXVkaW9BdHRyaWJ1dGVzLmgKaW5kZXggZmIxMTQzNS4uZWEwYWFhMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9KQXVkaW9BdHRyaWJ1dGVzLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9KQXVkaW9BdHRyaWJ1dGVzLmgKQEAgLTI2LDggKzI2LDcgQEAKIHB1YmxpYzoKICAgICAvKiBDcmVhdGVzIGEgSmF2YSBBdWRpb0F0dHJpYnV0ZXMgb2JqZWN0LiAqLwogICAgIHN0YXRpYyBqb2JqZWN0IGNyZWF0ZUF1ZGlvQXR0cmlidXRlc09iaihKTklFbnYgKmVudiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190KiBwQXR0cmlidXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCogcEF0dHJpYnV0ZXMpIHsKIAogICAgICAgICBqY2xhc3MgakJ1aWxkZXJDbHMgPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9tZWRpYS9BdWRpb0F0dHJpYnV0ZXMkQnVpbGRlciIpOwogICAgICAgICBqbWV0aG9kSUQgakJ1aWxkZXJDdG9yID0gZW52LT5HZXRNZXRob2RJRChqQnVpbGRlckNscywgIjxpbml0PiIsICIoKVYiKTsKQEAgLTU4LDExICs1Nyw2IEBACiAgICAgICAgICAgICAvLyBUT0RPOiBIYW5kbGUgdGhlICd0YWdzJyAoY2hhcltdIHRvIEhhc2hTZXQ8U3RyaW5nPikuCiAgICAgICAgICAgICAvLyBIb3cgdG8gcGFyc2UgdGhlIGNoYXJbXT8gSXMgdGhlcmUgYW55IGV4YW1wbGUgb2YgaXQ/CiAgICAgICAgICAgICAvLyBBbHNvLCB0aGUgYWRkVGFncygpIG1ldGhvZCBpcyBoaWRkZW4uCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBDYWxsIEF1ZGlvQXR0cmlidXRlcy5CdWlsZGVyLnNldExlZ2FjeVN0cmVhbVR5cGUoKS5idWlsZCgpCi0gICAgICAgICAgICBqbWV0aG9kSUQgalNldExlZ2FjeVN0cmVhbVR5cGUgPSBlbnYtPkdldE1ldGhvZElEKGpCdWlsZGVyQ2xzLCAic2V0TGVnYWN5U3RyZWFtVHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICIoSSlMYW5kcm9pZC9tZWRpYS9BdWRpb0F0dHJpYnV0ZXMkQnVpbGRlcjsiKTsKLSAgICAgICAgICAgIGpCdWlsZGVyT2JqID0gZW52LT5DYWxsT2JqZWN0TWV0aG9kKGpCdWlsZGVyT2JqLCBqU2V0TGVnYWN5U3RyZWFtVHlwZSwgc3RyZWFtVHlwZSk7CiAgICAgICAgIH0KIAogICAgICAgICBqbWV0aG9kSUQgakJ1aWxkID0gZW52LT5HZXRNZXRob2RJRChqQnVpbGRlckNscywgImJ1aWxkIiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTWlkaUlvV3JhcHBlci5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NaWRpSW9XcmFwcGVyLmgKaW5kZXggYjVlNTY1ZS4uNjMwOWRkYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NaWRpSW9XcmFwcGVyLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NaWRpSW9XcmFwcGVyLmgKQEAgLTIzLDExICsyMywxNCBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKK3N0cnVjdCBDRGF0YVNvdXJjZTsKKwogY2xhc3MgTWlkaUlvV3JhcHBlciB7CiBwdWJsaWM6CiAgICAgZXhwbGljaXQgTWlkaUlvV3JhcHBlcihjb25zdCBjaGFyICpwYXRoKTsKICAgICBleHBsaWNpdCBNaWRpSW9XcmFwcGVyKGludCBmZCwgb2ZmNjRfdCBvZmZzZXQsIGludDY0X3Qgc2l6ZSk7CiAgICAgZXhwbGljaXQgTWlkaUlvV3JhcHBlcihEYXRhU291cmNlQmFzZSAqc291cmNlKTsKKyAgICBleHBsaWNpdCBNaWRpSW9XcmFwcGVyKENEYXRhU291cmNlICpjc291cmNlKTsKIAogICAgIH5NaWRpSW9XcmFwcGVyKCk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTmRrV3JhcHBlci5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9OZGtXcmFwcGVyLmgKaW5kZXggYzk3ZDE3MS4uOGE0MTdmNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9OZGtXcmFwcGVyLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9OZGtXcmFwcGVyLmgKQEAgLTI3OCw2ICsyNzgsMjUgQEAKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhBTWVkaWFDb2RlY1dyYXBwZXIpOwogfTsKIAorc3RydWN0IEFNZWRpYURhdGFTb3VyY2VXcmFwcGVyIDogcHVibGljIFJlZkJhc2UgeworCisgICAgQU1lZGlhRGF0YVNvdXJjZVdyYXBwZXIoY29uc3Qgc3A8RGF0YVNvdXJjZT4mKTsKKyAgICBBTWVkaWFEYXRhU291cmNlV3JhcHBlcihBTWVkaWFEYXRhU291cmNlKik7CisKKyAgICBBTWVkaWFEYXRhU291cmNlICpnZXRBTWVkaWFEYXRhU291cmNlKCk7CisKKyAgICB2b2lkIGNsb3NlKCk7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5BTWVkaWFEYXRhU291cmNlV3JhcHBlcigpOworCitwcml2YXRlOgorICAgIHNwPERhdGFTb3VyY2U+IG1EYXRhU291cmNlOworICAgIEFNZWRpYURhdGFTb3VyY2UgKm1BTWVkaWFEYXRhU291cmNlOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQU1lZGlhRGF0YVNvdXJjZVdyYXBwZXIpOworfTsKKwogc3RydWN0IEFNZWRpYUV4dHJhY3RvcldyYXBwZXIgOiBwdWJsaWMgUmVmQmFzZSB7CiAKICAgICBBTWVkaWFFeHRyYWN0b3JXcmFwcGVyKEFNZWRpYUV4dHJhY3RvciAqYU1lZGlhRXh0cmFjdG9yKTsKQEAgLTI4Nyw4ICszMDYsNiBAQAogCiAgICAgc3RhdHVzX3QgcmVsZWFzZSgpOwogCi0gICAgc3RhdHVzX3QgZGlzY29ubmVjdCgpOwotCiAgICAgc3RhdHVzX3Qgc2V0RGF0YVNvdXJjZShpbnQgZmQsIG9mZjY0X3Qgb2Zmc2V0LCBvZmY2NF90IGxlbmd0aCk7CiAKICAgICBzdGF0dXNfdCBzZXREYXRhU291cmNlKGNvbnN0IGNoYXIgKmxvY2F0aW9uKTsKQEAgLTMzOSwzMSArMzU2LDYgQEAKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhBTWVkaWFFeHRyYWN0b3JXcmFwcGVyKTsKIH07CiAKLXN0cnVjdCBBTWVkaWFEYXRhU291cmNlV3JhcHBlciA6IHB1YmxpYyBSZWZCYXNlIHsKLQotICAgIHN0YXRpYyBzdGF0dXNfdCB0cmFuc2xhdGVfZXJyb3IobWVkaWFfc3RhdHVzX3QgZXJyKTsKLQotICAgIHN0YXRpYyBzc2l6ZV90IEFNZWRpYURhdGFTb3VyY2VXcmFwcGVyX2dldFNpemUodm9pZCAqdXNlcmRhdGEpOwotCi0gICAgc3RhdGljIHNzaXplX3QgQU1lZGlhRGF0YVNvdXJjZVdyYXBwZXJfcmVhZEF0KHZvaWQgKnVzZXJkYXRhLCBvZmY2NF90IG9mZnNldCwgdm9pZCAqIGJ1Ziwgc2l6ZV90IHNpemUpOwotCi0gICAgc3RhdGljIHZvaWQgQU1lZGlhRGF0YVNvdXJjZVdyYXBwZXJfY2xvc2Uodm9pZCAqdXNlcmRhdGEpOwotCi0gICAgQU1lZGlhRGF0YVNvdXJjZVdyYXBwZXIoY29uc3Qgc3A8RGF0YVNvdXJjZT4gJmRhdGFTb3VyY2UpOwotCi0gICAgQU1lZGlhRGF0YVNvdXJjZSAqZ2V0QU1lZGlhRGF0YVNvdXJjZSgpOwotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB+QU1lZGlhRGF0YVNvdXJjZVdyYXBwZXIoKTsKLQotcHJpdmF0ZToKLSAgICBzcDxEYXRhU291cmNlPiBtRGF0YVNvdXJjZTsKLQotICAgIEFNZWRpYURhdGFTb3VyY2UgKm1BTWVkaWFEYXRhU291cmNlOwotCi0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQU1lZGlhRGF0YVNvdXJjZVdyYXBwZXIpOwotfTsKLQogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogI2VuZGlmICAvLyBOREtfV1JBUFBFUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9QYXRjaEJ1aWxkZXIuaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvUGF0Y2hCdWlsZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjI3MjJhNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvUGF0Y2hCdWlsZGVyLmgKQEAgLTAsMCArMSwxMDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfUEFUQ0hfQlVJTERFUl9ICisjZGVmaW5lIEFORFJPSURfUEFUQ0hfQlVJTERFUl9ICisKKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPHV0aWxpdHk+CisKKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+CisKKy8vIFRoaXMgaXMgYSBoZWFkZXItb25seSB1dGlsaXR5LgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIFBhdGNoQnVpbGRlciB7CisgIHB1YmxpYzoKKyAgICB1c2luZyBtaXhfdXNlY2FzZV90ID0gZGVjbHR5cGUoYXVkaW9fcG9ydF9jb25maWdfbWl4X2V4dDo6dXNlY2FzZSk7CisKKyAgICBQYXRjaEJ1aWxkZXIoKSA9IGRlZmF1bHQ7CisKKyAgICAvLyBBbGwgZXhpc3RpbmcgbWV0aG9kcyBvcGVyYXRpbmcgb24gYXVkaW8gcGF0Y2hlcyB0YWtlIGEgcG9pbnRlciB0byBjb25zdC4KKyAgICAvLyBJdCdzIE9LIHRvIGNvbnN0cnVjdCBhIHRlbXBvcmFyeSBQYXRjaEJ1aWxkZXIgd2hpbGUgcHJlcGFyaW5nIGEgcGFyYW1ldGVyCisgICAgLy8gdG8gc3VjaCBhIGZ1bmN0aW9uIGJlY2F1c2UgdGhlIEJ1aWxkZXIgd2lsbCBiZSBrZXB0IGFsaXZlIHVudGlsIHRoZSBjb2RlCisgICAgLy8gZXhlY3V0aW9uIHJlYWNoZXMgdGhlIGZ1bmN0aW9uIGNhbGwgc3RhdGVtZW50IHNlbWljb2xvbi4KKyAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2gqIHBhdGNoKCkgY29uc3QgeyByZXR1cm4gJm1QYXRjaDsgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUuLi4gUz4KKyAgICBQYXRjaEJ1aWxkZXImIGFkZFNpbmsoVCYmIHQsIFMmJi4uLiBzKSB7CisgICAgICAgIHNpbmtzKCkuYWRkKHN0ZDo6Zm9yd2FyZDxUPih0KSwgc3RkOjpmb3J3YXJkPFM+KHMpLi4uKTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyAgICAvLyBFeHBsaWNpdCB0eXBlIG9mIHRoZSBzZWNvbmQgcGFyYW1ldGVyIGFsbG93cyBjbGllbnRzIHRvIHByb3ZpZGUgdGhlIHN0cnVjdCBpbmxpbmUuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBQYXRjaEJ1aWxkZXImIGFkZFNpbmsoVCYmIHQsIGNvbnN0IG1peF91c2VjYXNlX3QmIHVwZGF0ZSkgeworICAgICAgICBzaW5rcygpLmFkZChzdGQ6OmZvcndhcmQ8VD4odCksIHVwZGF0ZSk7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUuLi4gUz4KKyAgICBQYXRjaEJ1aWxkZXImIGFkZFNvdXJjZShUJiYgdCwgUyYmLi4uIHMpIHsKKyAgICAgICAgc291cmNlcygpLmFkZChzdGQ6OmZvcndhcmQ8VD4odCksIHN0ZDo6Zm9yd2FyZDxTPihzKS4uLik7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisgICAgLy8gRXhwbGljaXQgdHlwZSBvZiB0aGUgc2Vjb25kIHBhcmFtZXRlciBhbGxvd3MgY2xpZW50cyB0byBwcm92aWRlIHRoZSBzdHJ1Y3QgaW5saW5lLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgUGF0Y2hCdWlsZGVyJiBhZGRTb3VyY2UoVCYmIHQsIGNvbnN0IG1peF91c2VjYXNlX3QmIHVwZGF0ZSkgeworICAgICAgICBzb3VyY2VzKCkuYWRkKHN0ZDo6Zm9yd2FyZDxUPih0KSwgdXBkYXRlKTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICBwcml2YXRlOgorICAgIHN0cnVjdCBQb3J0Q2ZncyB7CisgICAgICAgIFBvcnRDZmdzKHVuc2lnbmVkIGludCAqY291bnRQdHIsIHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqcG9ydENmZ3MpCisgICAgICAgICAgICAgICAgOiBtQ291bnRQdHIoY291bnRQdHIpLCBtUG9ydENmZ3MocG9ydENmZ3MpIHt9CisgICAgICAgIGF1ZGlvX3BvcnRfY29uZmlnJiBhZGQoY29uc3QgYXVkaW9fcG9ydF9jb25maWcmIHBvcnRDZmcpIHsKKyAgICAgICAgICAgIHJldHVybiAqYWR2YW5jZSgpID0gcG9ydENmZzsKKyAgICAgICAgfQorICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgICAgICBhdWRpb19wb3J0X2NvbmZpZyYgYWRkKGNvbnN0IHNwPFQ+JiBlbnRpdHkpIHsKKyAgICAgICAgICAgIGF1ZGlvX3BvcnRfY29uZmlnKiBhZGRlZCA9IGFkdmFuY2UoKTsKKyAgICAgICAgICAgIGVudGl0eS0+dG9BdWRpb1BvcnRDb25maWcoYWRkZWQpOworICAgICAgICAgICAgcmV0dXJuICphZGRlZDsKKyAgICAgICAgfQorICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgICAgICB2b2lkIGFkZChjb25zdCBzcDxUPiYgZW50aXR5LCBjb25zdCBtaXhfdXNlY2FzZV90JiB1c2VjYXNlVXBkYXRlKSB7CisgICAgICAgICAgICBhZGQoZW50aXR5KS5leHQubWl4LnVzZWNhc2UgPSB1c2VjYXNlVXBkYXRlOworICAgICAgICB9CisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgICAgIHZvaWQgYWRkKGNvbnN0IHNwPFQ+JiBlbnRpdHksCisgICAgICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjxtaXhfdXNlY2FzZV90KGNvbnN0IG1peF91c2VjYXNlX3QmKT4gdXNlY2FzZVVwZGF0ZXIpIHsKKyAgICAgICAgICAgIG1peF91c2VjYXNlX3QqIHVzZWNhc2UgPSAmYWRkKGVudGl0eSkuZXh0Lm1peC51c2VjYXNlOworICAgICAgICAgICAgKnVzZWNhc2UgPSB1c2VjYXNlVXBkYXRlcigqdXNlY2FzZSk7CisgICAgICAgIH0KKyAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnKiBhZHZhbmNlKCkgeworICAgICAgICAgICAgcmV0dXJuICZtUG9ydENmZ3NbKCptQ291bnRQdHIpKytdOworICAgICAgICB9CisgICAgICAgIHVuc2lnbmVkIGludCAqbUNvdW50UHRyOworICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKm1Qb3J0Q2ZnczsKKyAgICB9OworCisgICAgUG9ydENmZ3Mgc2lua3MoKSB7IHJldHVybiBQb3J0Q2ZncygmbVBhdGNoLm51bV9zaW5rcywgbVBhdGNoLnNpbmtzKTsgfQorICAgIFBvcnRDZmdzIHNvdXJjZXMoKSB7IHJldHVybiBQb3J0Q2ZncygmbVBhdGNoLm51bV9zb3VyY2VzLCBtUGF0Y2guc291cmNlcyk7IH0KKworICAgIHN0cnVjdCBhdWRpb19wYXRjaCBtUGF0Y2ggPSB7fTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9QQVRDSF9CVUlMREVSX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvU2luZ2xlU3RhdGVRdWV1ZS5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9TaW5nbGVTdGF0ZVF1ZXVlLmgKaW5kZXggZDQyMzk2Mi4uYzI3NjFjYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9TaW5nbGVTdGF0ZVF1ZXVlLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9TaW5nbGVTdGF0ZVF1ZXVlLmgKQEAgLTk5LDYgKzk5LDEzIEBACiAgICAgICAgICAgICByZXR1cm4gbVNoYXJlZC0+bUFjayAtIHNlcXVlbmNlID49IDA7CiAgICAgICAgIH0KIAorICAgICAgICAvLyByZXR1cm5zIHRoZSBsYXN0IHZhbHVlIHdyaXR0ZW4gKG9yIHRoZSBjb250ZW50cyBvZiB0aGUgc2hhcmVkIGJ1ZmZlciBhZnRlciBpbml0aWFsaXphdGlvbgorICAgICAgICAvLyBpZiBubyB2YWx1ZSB3YXMgd3JpdHRlbikuCisgICAgICAgIFQgbGFzdCgpIGNvbnN0CisgICAgICAgIHsgICAvLyBhc3N1bWUgbm8gc2VxdWVuY2UgY2hlY2sgcmVxdWlyZWQgLSB3ZSBhcmUgdGhlIHdyaXRlci4KKyAgICAgICAgICAgIHJldHVybiBtU2hhcmVkLT5tVmFsdWU7CisgICAgICAgIH0KKwogICAgIHByaXZhdGU6CiAgICAgICAgIGludDMyX3QgICAgIG1TZXF1ZW5jZTsKICAgICAgICAgU2hhcmVkICogY29uc3QgbVNoYXJlZDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9BbmRyb2lkLmJwCmluZGV4IGI5YjQ3Y2QuLjA4NzFkNjAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvQW5kcm9pZC5icApAQCAtMjIsMTcgKzIyLDIyIEBACiAgICAgICAgICJsaWJsb2ciLAogICAgIF0sCiAKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibWVkaWFfbmRrX2hlYWRlcnMiLAorICAgIF0sCisKKyAgICBleHBvcnRfaGVhZGVyX2xpYl9oZWFkZXJzOiBbCisgICAgICAgICJtZWRpYV9uZGtfaGVhZGVycyIsCisgICAgXSwKKwogICAgIHNyY3M6IFsKICAgICAgICAgIkRhdGFTb3VyY2VCYXNlLmNwcCIsCiAgICAgICAgICJNZWRpYUJ1ZmZlci5jcHAiLAogICAgICAgICAiTWVkaWFCdWZmZXJCYXNlLmNwcCIsCiAgICAgICAgICJNZWRpYUJ1ZmZlckdyb3VwLmNwcCIsCiAgICAgICAgICJNZWRpYVNvdXJjZS5jcHAiLAotICAgICAgICAiTWVkaWFUcmFjay5jcHAiLAotICAgICAgICAiTWVkaWFFeHRyYWN0b3IuY3BwIiwKICAgICAgICAgIk1ldGFEYXRhLmNwcCIsCiAgICAgICAgICJNZXRhRGF0YUJhc2UuY3BwIiwKLSAgICAgICAgIlZvcmJpc0NvbW1lbnQuY3BwIiwKICAgICBdLAogCiAgICAgY2xhbmc6IHRydWUsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9NZWRpYUJ1ZmZlckdyb3VwLmNwcCBiL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL01lZGlhQnVmZmVyR3JvdXAuY3BwCmluZGV4IDJhOGRkNDEuLjYyYjgzY2MgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL01lZGlhQnVmZmVyR3JvdXAuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL01lZGlhQnVmZmVyR3JvdXAuY3BwCkBAIC0xNTcsMTEgKzE1NywxNSBAQAogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtSW50ZXJuYWwtPm1Mb2NrKTsKICAgICBmb3IgKDs7KSB7CiAgICAgICAgIHNpemVfdCBzbWFsbGVzdCA9IHJlcXVlc3RlZFNpemU7CisgICAgICAgIHNpemVfdCBiaWdnZXN0ID0gcmVxdWVzdGVkU2l6ZTsKICAgICAgICAgTWVkaWFCdWZmZXJCYXNlICpidWZmZXIgPSBudWxscHRyOwogICAgICAgICBhdXRvIGZyZWUgPSBtSW50ZXJuYWwtPm1CdWZmZXJzLmVuZCgpOwogICAgICAgICBmb3IgKGF1dG8gaXQgPSBtSW50ZXJuYWwtPm1CdWZmZXJzLmJlZ2luKCk7IGl0ICE9IG1JbnRlcm5hbC0+bUJ1ZmZlcnMuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgICAgIGNvbnN0IHNpemVfdCBzaXplID0gKCppdCktPnNpemUoKTsKKyAgICAgICAgICAgIGlmIChzaXplID4gYmlnZ2VzdCkgeworICAgICAgICAgICAgICAgIGJpZ2dlc3QgPSBzaXplOworICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKCgqaXQpLT5yZWZjb3VudCgpID09IDApIHsKLSAgICAgICAgICAgICAgICBjb25zdCBzaXplX3Qgc2l6ZSA9ICgqaXQpLT5zaXplKCk7CiAgICAgICAgICAgICAgICAgaWYgKHNpemUgPj0gcmVxdWVzdGVkU2l6ZSkgewogICAgICAgICAgICAgICAgICAgICBidWZmZXIgPSAqaXQ7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTc2LDcgKzE4MCw4IEBACiAgICAgICAgICAgICAgICAgJiYgKGZyZWUgIT0gbUludGVybmFsLT5tQnVmZmVycy5lbmQoKQogICAgICAgICAgICAgICAgICAgICB8fCBtSW50ZXJuYWwtPm1CdWZmZXJzLnNpemUoKSA8IG1JbnRlcm5hbC0+bUdyb3d0aExpbWl0KSkgewogICAgICAgICAgICAgLy8gV2UgYWxsb2MgYmVmb3JlIHdlIGZyZWUgc28gZmFpbHVyZSBsZWF2ZXMgZ3JvdXAgdW5jaGFuZ2VkLgotICAgICAgICAgICAgY29uc3Qgc2l6ZV90IGFsbG9jYXRlU2l6ZSA9IHJlcXVlc3RlZFNpemUgPCBTSVpFX01BWCAvIDMgKiAyIC8qIE5COiBvcmRlcmluZyAqLyA/CisgICAgICAgICAgICBjb25zdCBzaXplX3QgYWxsb2NhdGVTaXplID0gcmVxdWVzdGVkU2l6ZSA9PSAwID8gYmlnZ2VzdCA6CisgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZFNpemUgPCBTSVpFX01BWCAvIDMgKiAyIC8qIE5COiBvcmRlcmluZyAqLyA/CiAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZFNpemUgKiAzIC8gMiA6IHJlcXVlc3RlZFNpemU7CiAgICAgICAgICAgICBidWZmZXIgPSBuZXcgTWVkaWFCdWZmZXIoYWxsb2NhdGVTaXplKTsKICAgICAgICAgICAgIGlmIChidWZmZXItPmRhdGEoKSA9PSBudWxscHRyKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9NZWRpYUV4dHJhY3Rvci5jcHAgYi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9NZWRpYUV4dHJhY3Rvci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2YjNkYzkuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvTWVkaWFFeHRyYWN0b3IuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiTWVkaWFFeHRyYWN0b3IiCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8cHdkLmg+Ci0KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3Rvci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1NZWRpYUV4dHJhY3Rvcjo6TWVkaWFFeHRyYWN0b3IoKSB7Ci0gICAgaWYgKCFMT0dfTkRFQlVHKSB7Ci0gICAgICAgIHVpZF90IHVpZCA9IGdldHVpZCgpOwotICAgICAgICBzdHJ1Y3QgcGFzc3dkICpwdyA9IGdldHB3dWlkKHVpZCk7Ci0gICAgICAgIEFMT0dWKCJleHRyYWN0b3IgY3JlYXRlZCBpbiB1aWQ6ICVkICglcykiLCBnZXR1aWQoKSwgcHctPnB3X25hbWUpOwotICAgIH0KLX0KLQotTWVkaWFFeHRyYWN0b3I6On5NZWRpYUV4dHJhY3RvcigpIHt9Ci0KLXVpbnQzMl90IE1lZGlhRXh0cmFjdG9yOjpmbGFncygpIGNvbnN0IHsKLSAgICByZXR1cm4gQ0FOX1NFRUtfQkFDS1dBUkQgfCBDQU5fU0VFS19GT1JXQVJEIHwgQ0FOX1BBVVNFIHwgQ0FOX1NFRUs7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9NZWRpYVRyYWNrLmNwcCBiL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL01lZGlhVHJhY2suY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTYzZjU4Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL01lZGlhVHJhY2suY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYVRyYWNrLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotTWVkaWFUcmFjazo6TWVkaWFUcmFjaygpIHt9Ci0KLU1lZGlhVHJhY2s6On5NZWRpYVRyYWNrKCkge30KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotTWVkaWFUcmFjazo6UmVhZE9wdGlvbnM6OlJlYWRPcHRpb25zKCkgewotICAgIHJlc2V0KCk7Ci19Ci0KLXZvaWQgTWVkaWFUcmFjazo6UmVhZE9wdGlvbnM6OnJlc2V0KCkgewotICAgIG1PcHRpb25zID0gMDsKLSAgICBtU2Vla1RpbWVVcyA9IDA7Ci0gICAgbU5vbkJsb2NraW5nID0gZmFsc2U7Ci19Ci0KLXZvaWQgTWVkaWFUcmFjazo6UmVhZE9wdGlvbnM6OnNldE5vbkJsb2NraW5nKCkgewotICAgIG1Ob25CbG9ja2luZyA9IHRydWU7Ci19Ci0KLXZvaWQgTWVkaWFUcmFjazo6UmVhZE9wdGlvbnM6OmNsZWFyTm9uQmxvY2tpbmcoKSB7Ci0gICAgbU5vbkJsb2NraW5nID0gZmFsc2U7Ci19Ci0KLWJvb2wgTWVkaWFUcmFjazo6UmVhZE9wdGlvbnM6OmdldE5vbkJsb2NraW5nKCkgY29uc3QgewotICAgIHJldHVybiBtTm9uQmxvY2tpbmc7Ci19Ci0KLXZvaWQgTWVkaWFUcmFjazo6UmVhZE9wdGlvbnM6OnNldFNlZWtUbyhpbnQ2NF90IHRpbWVfdXMsIFNlZWtNb2RlIG1vZGUpIHsKLSAgICBtT3B0aW9ucyB8PSBrU2Vla1RvX09wdGlvbjsKLSAgICBtU2Vla1RpbWVVcyA9IHRpbWVfdXM7Ci0gICAgbVNlZWtNb2RlID0gbW9kZTsKLX0KLQotdm9pZCBNZWRpYVRyYWNrOjpSZWFkT3B0aW9uczo6Y2xlYXJTZWVrVG8oKSB7Ci0gICAgbU9wdGlvbnMgJj0gfmtTZWVrVG9fT3B0aW9uOwotICAgIG1TZWVrVGltZVVzID0gMDsKLSAgICBtU2Vla01vZGUgPSBTRUVLX0NMT1NFU1RfU1lOQzsKLX0KLQotYm9vbCBNZWRpYVRyYWNrOjpSZWFkT3B0aW9uczo6Z2V0U2Vla1RvKAotICAgICAgICBpbnQ2NF90ICp0aW1lX3VzLCBTZWVrTW9kZSAqbW9kZSkgY29uc3QgewotICAgICp0aW1lX3VzID0gbVNlZWtUaW1lVXM7Ci0gICAgKm1vZGUgPSBtU2Vla01vZGU7Ci0gICAgcmV0dXJuIChtT3B0aW9ucyAmIGtTZWVrVG9fT3B0aW9uKSAhPSAwOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvVm9yYmlzQ29tbWVudC5jcHAgYi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9Wb3JiaXNDb21tZW50LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFiYWY1MS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9Wb3JiaXNDb21tZW50LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJWb3JiaXNDb21tZW50IgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSAibWVkaWEvVm9yYmlzQ29tbWVudC5oIgotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9iYXNlNjQuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0J5dGVVdGlscy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhQmFzZS5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0YXRpYyB2b2lkIGV4dHJhY3RBbGJ1bUFydCgKLSAgICAgICAgTWV0YURhdGFCYXNlICpmaWxlTWV0YSwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKLSAgICBBTE9HVigiZXh0cmFjdEFsYnVtQXJ0IGZyb20gJyVzJyIsIChjb25zdCBjaGFyICopZGF0YSk7Ci0KLSAgICBzcDxBQnVmZmVyPiBmbGFjQnVmZmVyID0gZGVjb2RlQmFzZTY0KEFTdHJpbmcoKGNvbnN0IGNoYXIgKilkYXRhLCBzaXplKSk7Ci0gICAgaWYgKGZsYWNCdWZmZXIgPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgibWFsZm9ybWVkIGJhc2U2NCBlbmNvZGVkIGRhdGEuIik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBzaXplX3QgZmxhY1NpemUgPSBmbGFjQnVmZmVyLT5zaXplKCk7Ci0gICAgdWludDhfdCAqZmxhYyA9IGZsYWNCdWZmZXItPmRhdGEoKTsKLSAgICBBTE9HVigiZ290IGZsYWMgb2Ygc2l6ZSAlenUiLCBmbGFjU2l6ZSk7Ci0KLSAgICB1aW50MzJfdCBwaWNUeXBlOwotICAgIHVpbnQzMl90IHR5cGVMZW47Ci0gICAgdWludDMyX3QgZGVzY0xlbjsKLSAgICB1aW50MzJfdCBkYXRhTGVuOwotICAgIGNoYXIgdHlwZVsxMjhdOwotCi0gICAgaWYgKGZsYWNTaXplIDwgOCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgcGljVHlwZSA9IFUzMl9BVChmbGFjKTsKLQotICAgIGlmIChwaWNUeXBlICE9IDMpIHsKLSAgICAgICAgLy8gVGhpcyBpcyBub3QgYSBmcm9udCBjb3Zlci4KLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHR5cGVMZW4gPSBVMzJfQVQoJmZsYWNbNF0pOwotICAgIGlmICh0eXBlTGVuID4gc2l6ZW9mKHR5cGUpIC0gMSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gd2UndmUgYWxyZWFkeSBjaGVja2VkIGFib3ZlIHRoYXQgZmxhY1NpemUgPj0gOAotICAgIGlmIChmbGFjU2l6ZSAtIDggPCB0eXBlTGVuKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBtZW1jcHkodHlwZSwgJmZsYWNbOF0sIHR5cGVMZW4pOwotICAgIHR5cGVbdHlwZUxlbl0gPSAnXDAnOwotCi0gICAgQUxPR1YoInBpY1R5cGUgPSAlZCwgdHlwZSA9ICclcyciLCBwaWNUeXBlLCB0eXBlKTsKLQotICAgIGlmICghc3RyY21wKHR5cGUsICItLT4iKSkgewotICAgICAgICAvLyBUaGlzIGlzIG5vdCBpbmxpbmUgY292ZXIgYXJ0LCBidXQgYW4gZXh0ZXJuYWwgdXJsIGluc3RlYWQuCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoZmxhY1NpemUgPCAzMiB8fCBmbGFjU2l6ZSAtIDMyIDwgdHlwZUxlbikgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgZGVzY0xlbiA9IFUzMl9BVCgmZmxhY1s4ICsgdHlwZUxlbl0pOwotICAgIGlmIChmbGFjU2l6ZSAtIDMyIC0gdHlwZUxlbiA8IGRlc2NMZW4pIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGRhdGFMZW4gPSBVMzJfQVQoJmZsYWNbOCArIHR5cGVMZW4gKyA0ICsgZGVzY0xlbiArIDE2XSk7Ci0KLSAgICAvLyB3ZSd2ZSBhbHJlYWR5IGNoZWNrZWQgYWJvdmUgdGhhdCAoZmxhY1NpemUgLSAzMiAtIHR5cGVMZW4gLSBkZXNjTGVuKSA+PSAwCi0gICAgaWYgKGZsYWNTaXplIC0gMzIgLSB0eXBlTGVuIC0gZGVzY0xlbiA8IGRhdGFMZW4pIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIEFMT0dWKCJnb3QgaW1hZ2UgZGF0YSwgJXp1IHRyYWlsaW5nIGJ5dGVzIiwKLSAgICAgICAgIGZsYWNTaXplIC0gMzIgLSB0eXBlTGVuIC0gZGVzY0xlbiAtIGRhdGFMZW4pOwotCi0gICAgZmlsZU1ldGEtPnNldERhdGEoCi0gICAgICAgICAgICBrS2V5QWxidW1BcnQsIDAsICZmbGFjWzggKyB0eXBlTGVuICsgNCArIGRlc2NMZW4gKyAyMF0sIGRhdGFMZW4pOwotCi0gICAgZmlsZU1ldGEtPnNldENTdHJpbmcoa0tleUFsYnVtQXJ0TUlNRSwgdHlwZSk7Ci19Ci0KLXZvaWQgcGFyc2VWb3JiaXNDb21tZW50KAotICAgICAgICBNZXRhRGF0YUJhc2UgKmZpbGVNZXRhLCBjb25zdCBjaGFyICpjb21tZW50LCBzaXplX3QgY29tbWVudExlbmd0aCkKLXsKLSAgICBzdHJ1Y3QgewotICAgICAgICBjb25zdCBjaGFyICpjb25zdCBtVGFnOwotICAgICAgICB1aW50MzJfdCBtS2V5OwotICAgIH0ga01hcFtdID0gewotICAgICAgICB7ICJUSVRMRSIsIGtLZXlUaXRsZSB9LAotICAgICAgICB7ICJBUlRJU1QiLCBrS2V5QXJ0aXN0IH0sCi0gICAgICAgIHsgIkFMQlVNQVJUSVNUIiwga0tleUFsYnVtQXJ0aXN0IH0sCi0gICAgICAgIHsgIkFMQlVNIEFSVElTVCIsIGtLZXlBbGJ1bUFydGlzdCB9LAotICAgICAgICB7ICJDT01QSUxBVElPTiIsIGtLZXlDb21waWxhdGlvbiB9LAotICAgICAgICB7ICJBTEJVTSIsIGtLZXlBbGJ1bSB9LAotICAgICAgICB7ICJDT01QT1NFUiIsIGtLZXlDb21wb3NlciB9LAotICAgICAgICB7ICJHRU5SRSIsIGtLZXlHZW5yZSB9LAotICAgICAgICB7ICJBVVRIT1IiLCBrS2V5QXV0aG9yIH0sCi0gICAgICAgIHsgIlRSQUNLTlVNQkVSIiwga0tleUNEVHJhY2tOdW1iZXIgfSwKLSAgICAgICAgeyAiRElTQ05VTUJFUiIsIGtLZXlEaXNjTnVtYmVyIH0sCi0gICAgICAgIHsgIkRBVEUiLCBrS2V5RGF0ZSB9LAotICAgICAgICB7ICJZRUFSIiwga0tleVllYXIgfSwKLSAgICAgICAgeyAiTFlSSUNJU1QiLCBrS2V5V3JpdGVyIH0sCi0gICAgICAgIHsgIk1FVEFEQVRBX0JMT0NLX1BJQ1RVUkUiLCBrS2V5QWxidW1BcnQgfSwKLSAgICAgICAgeyAiQU5EUk9JRF9MT09QIiwga0tleUF1dG9Mb29wIH0sCi0gICAgfTsKLQotICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IHNpemVvZihrTWFwKSAvIHNpemVvZihrTWFwWzBdKTsgKytqKSB7Ci0gICAgICAgICAgICBzaXplX3QgdGFnTGVuID0gc3RybGVuKGtNYXBbal0ubVRhZyk7Ci0gICAgICAgICAgICBpZiAoIXN0cm5jYXNlY21wKGtNYXBbal0ubVRhZywgY29tbWVudCwgdGFnTGVuKQotICAgICAgICAgICAgICAgICAgICAmJiBjb21tZW50W3RhZ0xlbl0gPT0gJz0nKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGtNYXBbal0ubUtleSA9PSBrS2V5QWxidW1BcnQpIHsKLSAgICAgICAgICAgICAgICAgICAgZXh0cmFjdEFsYnVtQXJ0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVNZXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb21tZW50W3RhZ0xlbiArIDFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnRMZW5ndGggLSB0YWdMZW4gLSAxKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGtNYXBbal0ubUtleSA9PSBrS2V5QXV0b0xvb3ApIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFzdHJjYXNlY21wKCZjb21tZW50W3RhZ0xlbiArIDFdLCAidHJ1ZSIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaWxlTWV0YS0+c2V0SW50MzIoa0tleUF1dG9Mb29wLCB0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbGVNZXRhLT5zZXRDU3RyaW5nKGtNYXBbal0ubUtleSwgJmNvbW1lbnRbdGFnTGVuICsgMV0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL0RhdGFTb3VyY2UuaCBiL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvRGF0YVNvdXJjZS5oCmluZGV4IDBlNTlmMzkuLmNiOTZmZjUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvRGF0YVNvdXJjZS5oCisrKyBiL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvRGF0YVNvdXJjZS5oCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KICNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlQmFzZS5oPgogI2luY2x1ZGUgPG1lZGlhL0lEYXRhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIuaD4KICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KICNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CiAjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgpAQCAtMzQsNyArMzUsNyBAQAogCiBjbGFzcyBEYXRhU291cmNlIDogcHVibGljIERhdGFTb3VyY2VCYXNlLCBwdWJsaWMgdmlydHVhbCBSZWZCYXNlIHsKIHB1YmxpYzoKLSAgICBEYXRhU291cmNlKCkge30KKyAgICBEYXRhU291cmNlKCkgOiBtV3JhcHBlcihOVUxMKSB7fQogCiAgICAgLy8gcmV0dXJucyBhIHBvaW50ZXIgdG8gSURhdGFTb3VyY2UgaWYgaXQgaXMgd3JhcHBlZC4KICAgICB2aXJ0dWFsIHNwPElEYXRhU291cmNlPiBnZXRJRGF0YVNvdXJjZSgpIGNvbnN0IHsKQEAgLTY5LDEwICs3MCwzNSBAQAogICAgICAgICByZXR1cm4gU3RyaW5nOCgiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIik7CiAgICAgfQogCisgICAgQ0RhdGFTb3VyY2UgKndyYXAoKSB7CisgICAgICAgIGlmIChtV3JhcHBlcikgeworICAgICAgICAgICAgcmV0dXJuIG1XcmFwcGVyOworICAgICAgICB9CisgICAgICAgIG1XcmFwcGVyID0gbmV3IENEYXRhU291cmNlKCk7CisgICAgICAgIG1XcmFwcGVyLT5oYW5kbGUgPSB0aGlzOworCisgICAgICAgIG1XcmFwcGVyLT5yZWFkQXQgPSBbXSh2b2lkICpoYW5kbGUsIG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgLT4gc3NpemVfdCB7CisgICAgICAgICAgICByZXR1cm4gKChEYXRhU291cmNlKiloYW5kbGUpLT5yZWFkQXQob2Zmc2V0LCBkYXRhLCBzaXplKTsKKyAgICAgICAgfTsKKyAgICAgICAgbVdyYXBwZXItPmdldFNpemUgPSBbXSh2b2lkICpoYW5kbGUsIG9mZjY0X3QgKnNpemUpIC0+IHN0YXR1c190IHsKKyAgICAgICAgICAgIHJldHVybiAoKERhdGFTb3VyY2UqKWhhbmRsZSktPmdldFNpemUoc2l6ZSk7CisgICAgICAgIH07CisgICAgICAgIG1XcmFwcGVyLT5mbGFncyA9IFtdKHZvaWQgKmhhbmRsZSkgLT4gdWludDMyX3QgeworICAgICAgICAgICAgcmV0dXJuICgoRGF0YVNvdXJjZSopaGFuZGxlKS0+ZmxhZ3MoKTsKKyAgICAgICAgfTsKKyAgICAgICAgbVdyYXBwZXItPmdldFVyaSA9IFtdKHZvaWQgKmhhbmRsZSwgY2hhciAqdXJpU3RyaW5nLCBzaXplX3QgYnVmZmVyU2l6ZSkgLT4gYm9vbCB7CisgICAgICAgICAgICByZXR1cm4gKChEYXRhU291cmNlKiloYW5kbGUpLT5nZXRVcmkodXJpU3RyaW5nLCBidWZmZXJTaXplKTsKKyAgICAgICAgfTsKKyAgICAgICAgcmV0dXJuIG1XcmFwcGVyOworICAgIH0KKwogcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgfkRhdGFTb3VyY2UoKSB7fQorICAgIHZpcnR1YWwgfkRhdGFTb3VyY2UoKSB7CisgICAgICAgIGRlbGV0ZSBtV3JhcHBlcjsKKyAgICB9CiAKIHByaXZhdGU6CisgICAgQ0RhdGFTb3VyY2UgKm1XcmFwcGVyOwogICAgIERhdGFTb3VyY2UoY29uc3QgRGF0YVNvdXJjZSAmKTsKICAgICBEYXRhU291cmNlICZvcGVyYXRvcj0oY29uc3QgRGF0YVNvdXJjZSAmKTsKIH07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL0RhdGFTb3VyY2VCYXNlLmggYi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL0RhdGFTb3VyY2VCYXNlLmgKaW5kZXggNTE5OTNkYS4uYWY1YjgzZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9EYXRhU291cmNlQmFzZS5oCisrKyBiL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvRGF0YVNvdXJjZUJhc2UuaApAQCAtNjYsNiArNjYsMTAgQEAKIAogICAgIHZpcnR1YWwgdm9pZCBjbG9zZSgpIHt9OwogCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBdmFpbGFibGVTaXplKG9mZjY0X3QgLypvZmZzZXQqLywgb2ZmNjRfdCAqIC8qc2l6ZSovKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5EYXRhU291cmNlQmFzZSgpIHt9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvTWVkaWFFeHRyYWN0b3IuaCBiL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvTWVkaWFFeHRyYWN0b3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGJhOThkYS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL01lZGlhRXh0cmFjdG9yLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxOTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgTUVESUFfRVhUUkFDVE9SX0hfCi0KLSNkZWZpbmUgTUVESUFfRVhUUkFDVE9SX0hfCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBEYXRhU291cmNlQmFzZTsKLWNsYXNzIE1ldGFEYXRhQmFzZTsKLXN0cnVjdCBNZWRpYVRyYWNrOwotCi0KLWNsYXNzIEV4dHJhY3RvckFsbG9jVHJhY2tlciB7Ci1wdWJsaWM6Ci0gICAgRXh0cmFjdG9yQWxsb2NUcmFja2VyKCkgewotICAgICAgICBBTE9HRCgiZXh0cmFjdG9yIGFsbG9jYXRlZDogJXAiLCB0aGlzKTsKLSAgICB9Ci0gICAgdmlydHVhbCB+RXh0cmFjdG9yQWxsb2NUcmFja2VyKCkgewotICAgICAgICBBTE9HRCgiZXh0cmFjdG9yIGZyZWVkOiAlcCIsIHRoaXMpOwotICAgIH0KLX07Ci0KLQotY2xhc3MgTWVkaWFFeHRyYWN0b3IKLS8vIDogcHVibGljIEV4dHJhY3RvckFsbG9jVHJhY2tlcgotewotcHVibGljOgotICAgIHZpcnR1YWwgfk1lZGlhRXh0cmFjdG9yKCk7Ci0gICAgdmlydHVhbCBzaXplX3QgY291bnRUcmFja3MoKSA9IDA7Ci0gICAgdmlydHVhbCBNZWRpYVRyYWNrICpnZXRUcmFjayhzaXplX3QgaW5kZXgpID0gMDsKLQotICAgIGVudW0gR2V0VHJhY2tNZXRhRGF0YUZsYWdzIHsKLSAgICAgICAga0luY2x1ZGVFeHRlbnNpdmVNZXRhRGF0YSA9IDEKLSAgICB9OwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0VHJhY2tNZXRhRGF0YSgKLSAgICAgICAgICAgIE1ldGFEYXRhQmFzZSYgbWV0YSwKLSAgICAgICAgICAgIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MgPSAwKSA9IDA7Ci0KLSAgICAvLyBSZXR1cm4gY29udGFpbmVyIHNwZWNpZmljIG1ldGEtZGF0YS4gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24KLSAgICAvLyByZXR1cm5zIGFuIGVtcHR5IG1ldGFkYXRhIG9iamVjdC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1ldGFEYXRhKE1ldGFEYXRhQmFzZSYgbWV0YSkgPSAwOwotCi0gICAgZW51bSBGbGFncyB7Ci0gICAgICAgIENBTl9TRUVLX0JBQ0tXQVJEICA9IDEsICAvLyB0aGUgInNlZWsgMTBzZWNzIGJhY2sgYnV0dG9uIgotICAgICAgICBDQU5fU0VFS19GT1JXQVJEICAgPSAyLCAgLy8gdGhlICJzZWVrIDEwc2VjcyBmb3J3YXJkIGJ1dHRvbiIKLSAgICAgICAgQ0FOX1BBVVNFICAgICAgICAgID0gNCwKLSAgICAgICAgQ0FOX1NFRUsgICAgICAgICAgID0gOCwgIC8vIHRoZSAic2VlayBiYXIiCi0gICAgfTsKLQotICAgIC8vIElmIHN1YmNsYXNzZXMgZG8gX25vdF8gb3ZlcnJpZGUgdGhpcywgdGhlIGRlZmF1bHQgaXMKLSAgICAvLyBDQU5fU0VFS19CQUNLV0FSRCB8IENBTl9TRUVLX0ZPUldBUkQgfCBDQU5fU0VFSyB8IENBTl9QQVVTRQotICAgIHZpcnR1YWwgdWludDMyX3QgZmxhZ3MoKSBjb25zdDsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWVkaWFDYXMoY29uc3QgdWludDhfdCogLypjYXNUb2tlbiovLCBzaXplX3QgLypzaXplKi8pIHsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLQotICAgIHZpcnR1YWwgY29uc3QgY2hhciAqIG5hbWUoKSB7IHJldHVybiAiPHVuc3BlY2lmaWVkPiI7IH0KLQotICAgIHR5cGVkZWYgTWVkaWFFeHRyYWN0b3IqICgqQ3JlYXRvckZ1bmMpKAotICAgICAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgdm9pZCAqbWV0YSk7Ci0gICAgdHlwZWRlZiB2b2lkICgqRnJlZU1ldGFGdW5jKSh2b2lkICptZXRhKTsKLQotICAgIC8vIFRoZSBzbmlmZmVyIGNhbiBvcHRpb25hbGx5IGZpbGwgaW4gYW4gb3BhcXVlIG9iamVjdCwgIm1ldGEiLCB0aGF0IGhlbHBzCi0gICAgLy8gdGhlIGNvcnJlc3BvbmRpbmcgZXh0cmFjdG9yIGluaXRpYWxpemUgaXRzIHN0YXRlIHdpdGhvdXQgZHVwbGljYXRpbmcKLSAgICAvLyBlZmZvcnQgYWxyZWFkeSBleGVydGVkIGJ5IHRoZSBzbmlmZmVyLiBJZiAiZnJlZU1ldGEiIGlzIGdpdmVuLCBpdCB3aWxsIGJlCi0gICAgLy8gY2FsbGVkIGFnYWluc3QgdGhlIG9wYXF1ZSBvYmplY3Qgd2hlbiBpdCBpcyBubyBsb25nZXIgdXNlZC4KLSAgICB0eXBlZGVmIENyZWF0b3JGdW5jICgqU25pZmZlckZ1bmMpKAotICAgICAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgZmxvYXQgKmNvbmZpZGVuY2UsCi0gICAgICAgICAgICB2b2lkICoqbWV0YSwgRnJlZU1ldGFGdW5jICpmcmVlTWV0YSk7Ci0KLSAgICB0eXBlZGVmIHN0cnVjdCB7Ci0gICAgICAgIGNvbnN0IHVpbnQ4X3QgYlsxNl07Ci0gICAgfSB1dWlkX3Q7Ci0KLSAgICB0eXBlZGVmIHN0cnVjdCB7Ci0gICAgICAgIC8vIHZlcnNpb24gbnVtYmVyIG9mIHRoaXMgc3RydWN0dXJlCi0gICAgICAgIGNvbnN0IHVpbnQzMl90IGRlZl92ZXJzaW9uOwotCi0gICAgICAgIC8vIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgZXh0cmFjdG9yLgotICAgICAgICAvLyBTZWUgYmVsb3cgZm9yIGEgY29udmVuaWVuY2UgbWFjcm8gdG8gY3JlYXRlIHRoaXMgZnJvbSBhIHN0cmluZy4KLSAgICAgICAgdXVpZF90IGV4dHJhY3Rvcl91dWlkOwotCi0gICAgICAgIC8vIFZlcnNpb24gbnVtYmVyIG9mIHRoaXMgZXh0cmFjdG9yLiBXaGVuIHR3byBleHRyYWN0b3JzIHdpdGggdGhlIHNhbWUKLSAgICAgICAgLy8gdXVpZCBhcmUgZW5jb3VudGVyZWQsIHRoZSBvbmUgd2l0aCB0aGUgbGFyZ2VzdCB2ZXJzaW9uIG51bWJlciB3aWxsCi0gICAgICAgIC8vIGJlIHVzZWQuCi0gICAgICAgIGNvbnN0IHVpbnQzMl90IGV4dHJhY3Rvcl92ZXJzaW9uOwotCi0gICAgICAgIC8vIGEgaHVtYW4gcmVhZGFibGUgbmFtZQotICAgICAgICBjb25zdCBjaGFyICpleHRyYWN0b3JfbmFtZTsKLQotICAgICAgICAvLyB0aGUgc25pZmZlciBmdW5jdGlvbgotICAgICAgICBjb25zdCBTbmlmZmVyRnVuYyBzbmlmZjsKLSAgICB9IEV4dHJhY3RvckRlZjsKLQotICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBFWFRSQUNUT1JERUZfVkVSU0lPTiA9IDE7Ci0KLSAgICB0eXBlZGVmIEV4dHJhY3RvckRlZiAoKkdldEV4dHJhY3RvckRlZikoKTsKLQotcHJvdGVjdGVkOgotICAgIE1lZGlhRXh0cmFjdG9yKCk7Ci0KLXByaXZhdGU6Ci0gICAgTWVkaWFFeHRyYWN0b3IoY29uc3QgTWVkaWFFeHRyYWN0b3IgJik7Ci0gICAgTWVkaWFFeHRyYWN0b3IgJm9wZXJhdG9yPShjb25zdCBNZWRpYUV4dHJhY3RvciAmKTsKLX07Ci0KLS8vIHB1cnBvc2VseSBub3QgZGVmaW5lZCBhbnl3aGVyZSBzbyB0aGF0IHRoaXMgd2lsbCBmYWlsIHRvIGxpbmsgaWYKLS8vIGV4cHJlc3Npb25zIGJlbG93IGFyZSBub3QgZXZhbHVhdGVkIGF0IGNvbXBpbGUgdGltZQotaW50IGludmFsaWRfdXVpZF9zdHJpbmcoY29uc3QgY2hhciAqKTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHNpemVfdCBOPgotY29uc3RleHByIHVpbnQ4X3QgX2RpZ2l0QXRfKGNvbnN0IFQgKCZzKVtOXSwgY29uc3Qgc2l6ZV90IG4pIHsKLSAgICByZXR1cm4gc1tuXSA+PSAnMCcgJiYgc1tuXSA8PSAnOScgPyBzW25dIC0gJzAnCi0gICAgICAgICAgICA6IHNbbl0gPj0gJ2EnICYmIHNbbl0gPD0gJ2YnID8gc1tuXSAtICdhJyArIDEwCi0gICAgICAgICAgICAgICAgICAgIDogc1tuXSA+PSAnQScgJiYgc1tuXSA8PSAnRicgPyBzW25dIC0gJ0EnICsgMTAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGludmFsaWRfdXVpZF9zdHJpbmcoInV1aWQ6IGJhZCBkaWdpdHMiKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHNpemVfdCBOPgotY29uc3RleHByIHVpbnQ4X3QgX2hleEJ5dGVBdF8oY29uc3QgVCAoJnMpW05dLCBzaXplX3QgbikgewotICAgIHJldHVybiAoX2RpZ2l0QXRfKHMsIG4pIDw8IDQpICsgX2RpZ2l0QXRfKHMsIG4gKyAxKTsKLX0KLQotY29uc3RleHByIGJvb2wgX2Fzc2VydElzRGFzaF8oY2hhciBjKSB7Ci0gICAgcmV0dXJuIGMgPT0gJy0nID8gdHJ1ZSA6IGludmFsaWRfdXVpZF9zdHJpbmcoIldyb25nIGZvcm1hdCIpOwotfQotCi10ZW1wbGF0ZSA8c2l6ZV90IE4+Ci1jb25zdGV4cHIgTWVkaWFFeHRyYWN0b3I6OnV1aWRfdCBjb25zdFVVSUQoY29uc3QgY2hhciAoJnMpIFtOXSkgewotICAgIHN0YXRpY19hc3NlcnQoTiA9PSAzNywgInV1aWQ6IHdyb25nIGxlbmd0aCIpOwotICAgIHJldHVybgotICAgICAgICAgICAgX2Fzc2VydElzRGFzaF8oc1s4XSksCi0gICAgICAgICAgICBfYXNzZXJ0SXNEYXNoXyhzWzEzXSksCi0gICAgICAgICAgICBfYXNzZXJ0SXNEYXNoXyhzWzE4XSksCi0gICAgICAgICAgICBfYXNzZXJ0SXNEYXNoXyhzWzIzXSksCi0gICAgICAgICAgICBNZWRpYUV4dHJhY3Rvcjo6dXVpZF90IHt7Ci0gICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgMCksCi0gICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgMiksCi0gICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgNCksCi0gICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgNiksCi0gICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgOSksCi0gICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgMTEpLAotICAgICAgICAgICAgICAgIF9oZXhCeXRlQXRfKHMsIDE0KSwKLSAgICAgICAgICAgICAgICBfaGV4Qnl0ZUF0XyhzLCAxNiksCi0gICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgMTkpLAotICAgICAgICAgICAgICAgIF9oZXhCeXRlQXRfKHMsIDIxKSwKLSAgICAgICAgICAgICAgICBfaGV4Qnl0ZUF0XyhzLCAyNCksCi0gICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgMjYpLAotICAgICAgICAgICAgICAgIF9oZXhCeXRlQXRfKHMsIDI4KSwKLSAgICAgICAgICAgICAgICBfaGV4Qnl0ZUF0XyhzLCAzMCksCi0gICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgMzIpLAotICAgICAgICAgICAgICAgIF9oZXhCeXRlQXRfKHMsIDM0KSwKLSAgICAgICAgICAgIH19OwotfQotLy8gQ29udmVuaWVuY2UgbWFjcm8gdG8gY3JlYXRlIGEgdXVpZF90IGZyb20gYSBzdHJpbmcgbGl0ZXJhbCwgd2hpY2ggc2hvdWxkCi0vLyBiZSBmb3JtYXR0ZWQgYXMgIjEyMzQ1Njc4LTEyMzQtMTIzNC0xMjM0LTEyMzQ1Njc4OWFiYyIsIGFzIGdlbmVyYXRlZCBieQotLy8gZS5nLiBodHRwczovL3d3dy51dWlkZ2VuZXJhdG9yLm5ldC8gb3IgdGhlICd1dWlkZ2VuJyBsaW51eCBjb21tYW5kLgotLy8gSGV4IGRpZ2l0cyBtYXkgYmUgdXBwZXIgb3IgbG93ZXIgY2FzZS4KLS8vCi0vLyBUaGUgbWFjcm8gY2FsbCBpcyBvdGhlcndpc2UgZXF1aXZhbGVudCB0byBzcGVjaWZ5aW5nIHRoZSBzdHJ1Y3R1cmUgZGlyZWN0bHkKLS8vIChlLmcuIFVVSUQoIjdkNjEzODU4LTU4MzctNGEzOC04NGM1LTMzMmQxY2RkZWUyNyIpIGlzIHRoZSBzYW1lIGFzCi0vLyAgICAgICB7ezB4N2QsIDB4NjEsIDB4MzgsIDB4NTgsIDB4NTgsIDB4MzcsIDB4NGEsIDB4MzgsCi0vLyAgICAgICAgIDB4ODQsIDB4YzUsIDB4MzMsIDB4MmQsIDB4MWMsIDB4ZGQsIDB4ZWUsIDB4Mjd9fSkKLQotI2RlZmluZSBVVUlEKHN0cikgW117IGNvbnN0ZXhwciBNZWRpYUV4dHJhY3Rvcjo6dXVpZF90IHV1aWQgPSBjb25zdFVVSUQoc3RyKTsgcmV0dXJuIHV1aWQ7IH0oKQotCi0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBNRURJQV9FWFRSQUNUT1JfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvTWVkaWFUcmFjay5oIGIvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9NZWRpYVRyYWNrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkZWE2MWEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9NZWRpYVRyYWNrLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgTUVESUFfU09VUkNFX0JBU0VfSF8KLQotI2RlZmluZSBNRURJQV9TT1VSQ0VfQkFTRV9IXwotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgotI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlEZWFsZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIE1lZGlhQnVmZmVyQmFzZTsKLQotY2xhc3MgU291cmNlQmFzZUFsbG9jVHJhY2tlciB7Ci1wdWJsaWM6Ci0gICAgU291cmNlQmFzZUFsbG9jVHJhY2tlcigpIHsKLSAgICAgICAgQUxPR0QoInNvdXJjZWJhc2UgYWxsb2NhdGVkOiAlcCIsIHRoaXMpOwotICAgIH0KLSAgICB2aXJ0dWFsIH5Tb3VyY2VCYXNlQWxsb2NUcmFja2VyKCkgewotICAgICAgICBBTE9HRCgic291cmNlYmFzZSBmcmVlZDogJXAiLCB0aGlzKTsKLSAgICB9Ci19OwotCi1zdHJ1Y3QgTWVkaWFUcmFjawotLy8gICAgOiBwdWJsaWMgU291cmNlQmFzZUFsbG9jVHJhY2tlcgotewotICAgIE1lZGlhVHJhY2soKTsKLQotICAgIC8vIFRvIGJlIGNhbGxlZCBiZWZvcmUgYW55IG90aGVyIG1ldGhvZHMgb24gdGhpcyBvYmplY3QsIGV4Y2VwdAotICAgIC8vIGdldEZvcm1hdCgpLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGFCYXNlICpwYXJhbXMgPSBOVUxMKSA9IDA7Ci0KLSAgICAvLyBBbnkgYmxvY2tpbmcgcmVhZCBjYWxsIHJldHVybnMgaW1tZWRpYXRlbHkgd2l0aCBhIHJlc3VsdCBvZiBOT19JTklULgotICAgIC8vIEl0IGlzIGFuIGVycm9yIHRvIGNhbGwgYW55IG1ldGhvZHMgb3RoZXIgdGhhbiBzdGFydCBhZnRlciB0aGlzIGNhbGwKLSAgICAvLyByZXR1cm5zLiBBbnkgYnVmZmVycyB0aGUgb2JqZWN0IG1heSBiZSBob2xkaW5nIG9udG8gYXQgdGhlIHRpbWUgb2YKLSAgICAvLyB0aGUgc3RvcCgpIGNhbGwgYXJlIHJlbGVhc2VkLgotICAgIC8vIEFsc28sIGl0IGlzIGltcGVyYXRpdmUgdGhhdCBhbnkgYnVmZmVycyBvdXRwdXQgYnkgdGhpcyBvYmplY3QgYW5kCi0gICAgLy8gaGVsZCBvbnRvIGJ5IGNhbGxlcnMgYmUgcmVsZWFzZWQgYmVmb3JlIGEgY2FsbCB0byBzdG9wKCkgISEhCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCkgPSAwOwotCi0gICAgLy8gUmV0dXJucyB0aGUgZm9ybWF0IG9mIHRoZSBkYXRhIG91dHB1dCBieSB0aGlzIG1lZGlhIHRyYWNrLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Rm9ybWF0KE1ldGFEYXRhQmFzZSYgZm9ybWF0KSA9IDA7Ci0KLSAgICAvLyBPcHRpb25zIHRoYXQgbW9kaWZ5IHJlYWQoKSBiZWhhdmlvdXIuIFRoZSBkZWZhdWx0IGlzIHRvCi0gICAgLy8gYSkgbm90IHJlcXVlc3QgYSBzZWVrCi0gICAgLy8gYikgbm90IGJlIGxhdGUsIGkuZS4gbGF0ZW5lc3NfdXMgPSAwCi0gICAgc3RydWN0IFJlYWRPcHRpb25zIHsKLSAgICAgICAgZW51bSBTZWVrTW9kZSA6IGludDMyX3QgewotICAgICAgICAgICAgU0VFS19QUkVWSU9VU19TWU5DLAotICAgICAgICAgICAgU0VFS19ORVhUX1NZTkMsCi0gICAgICAgICAgICBTRUVLX0NMT1NFU1RfU1lOQywKLSAgICAgICAgICAgIFNFRUtfQ0xPU0VTVCwKLSAgICAgICAgICAgIFNFRUtfRlJBTUVfSU5ERVgsCi0gICAgICAgIH07Ci0KLSAgICAgICAgUmVhZE9wdGlvbnMoKTsKLQotICAgICAgICAvLyBSZXNldCBldmVyeXRoaW5nIGJhY2sgdG8gZGVmYXVsdHMuCi0gICAgICAgIHZvaWQgcmVzZXQoKTsKLQotICAgICAgICB2b2lkIHNldFNlZWtUbyhpbnQ2NF90IHRpbWVfdXMsIFNlZWtNb2RlIG1vZGUgPSBTRUVLX0NMT1NFU1RfU1lOQyk7Ci0gICAgICAgIHZvaWQgY2xlYXJTZWVrVG8oKTsKLSAgICAgICAgYm9vbCBnZXRTZWVrVG8oaW50NjRfdCAqdGltZV91cywgU2Vla01vZGUgKm1vZGUpIGNvbnN0OwotCi0gICAgICAgIHZvaWQgc2V0Tm9uQmxvY2tpbmcoKTsKLSAgICAgICAgdm9pZCBjbGVhck5vbkJsb2NraW5nKCk7Ci0gICAgICAgIGJvb2wgZ2V0Tm9uQmxvY2tpbmcoKSBjb25zdDsKLQotICAgICAgICAvLyBVc2VkIHRvIGNsZWFyIGFsbCBub24tcGVyc2lzdGVudCBvcHRpb25zIGZvciBtdWx0aXBsZSBidWZmZXIgcmVhZHMuCi0gICAgICAgIHZvaWQgY2xlYXJOb25QZXJzaXN0ZW50KCkgewotICAgICAgICAgICAgY2xlYXJTZWVrVG8oKTsKLSAgICAgICAgfQotCi0gICAgcHJpdmF0ZToKLSAgICAgICAgZW51bSBPcHRpb25zIHsKLSAgICAgICAgICAgIGtTZWVrVG9fT3B0aW9uICAgICAgPSAxLAotICAgICAgICB9OwotCi0gICAgICAgIHVpbnQzMl90IG1PcHRpb25zOwotICAgICAgICBpbnQ2NF90IG1TZWVrVGltZVVzOwotICAgICAgICBTZWVrTW9kZSBtU2Vla01vZGU7Ci0gICAgICAgIGJvb2wgbU5vbkJsb2NraW5nOwotICAgIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7IC8vIHNlbnQgdGhyb3VnaCBCaW5kZXIKLQotICAgIC8vIFJldHVybnMgYSBuZXcgYnVmZmVyIG9mIGRhdGEuIENhbGwgYmxvY2tzIHVudGlsIGEKLSAgICAvLyBidWZmZXIgaXMgYXZhaWxhYmxlLCBhbiBlcnJvciBpcyBlbmNvdW50ZXJlZCBvZiB0aGUgZW5kIG9mIHRoZSBzdHJlYW0KLSAgICAvLyBpcyByZWFjaGVkLgotICAgIC8vIEVuZCBvZiBzdHJlYW0gaXMgc2lnbmFsbGVkIGJ5IGEgcmVzdWx0IG9mIEVSUk9SX0VORF9PRl9TVFJFQU0uCi0gICAgLy8gQSByZXN1bHQgb2YgSU5GT19GT1JNQVRfQ0hBTkdFRCBpbmRpY2F0ZXMgdGhhdCB0aGUgZm9ybWF0IG9mIHRoaXMKLSAgICAvLyBNZWRpYVNvdXJjZSBoYXMgY2hhbmdlZCBtaWQtc3RyZWFtLCB0aGUgY2xpZW50IGNhbiBjb250aW51ZSByZWFkaW5nCi0gICAgLy8gYnV0IHNob3VsZCBiZSBwcmVwYXJlZCBmb3IgYnVmZmVycyBvZiB0aGUgbmV3IGNvbmZpZ3VyYXRpb24uCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKAotICAgICAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpID0gMDsKLQotICAgIHZpcnR1YWwgfk1lZGlhVHJhY2soKTsKLQotcHJpdmF0ZToKLSAgICBNZWRpYVRyYWNrKGNvbnN0IE1lZGlhVHJhY2sgJik7Ci0gICAgTWVkaWFUcmFjayAmb3BlcmF0b3I9KGNvbnN0IE1lZGlhVHJhY2sgJik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIE1FRElBX1NPVVJDRV9CQVNFX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL1ZvcmJpc0NvbW1lbnQuaCBiL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvVm9yYmlzQ29tbWVudC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YmEzMjk1Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvVm9yYmlzQ29tbWVudC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotI2lmbmRlZiBWT1JCSVNfQ09NTUVOVF9IXwotI2RlZmluZSBWT1JCSVNfQ09NTUVOVF9IXwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIE1ldGFEYXRhQmFzZTsKLQotdm9pZCBwYXJzZVZvcmJpc0NvbW1lbnQoCi0gICAgICAgIE1ldGFEYXRhQmFzZSAqZmlsZU1ldGEsIGNvbnN0IGNoYXIgKmNvbW1lbnQsIHNpemVfdCBjb21tZW50TGVuZ3RoKTsKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIFZPUkJJU19DT01NRU5UX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhQmFzZS5oIGIvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YUJhc2UuaAppbmRleCAzZTRlODZjLi43MmVmY2RmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhQmFzZS5oCisrKyBiL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFCYXNlLmgKQEAgLTY4LDcgKzY4LDYgQEAKICAgICBrS2V5T3B1c1NlZWtQcmVSb2xsICAgPSAnb3NwcicsICAvLyB1aW50NjRfdCAoc2VlayBwcmVyb2xsIGluIG5zKQogICAgIGtLZXlGbGFjTWV0YWRhdGEgICAgICA9ICdmbE1kJywgIC8vIHJhdyBkYXRhCiAgICAga0tleVZwOUNvZGVjUHJpdmF0ZSAgID0gJ3ZwOXAnLCAgLy8gcmF3IGRhdGEgKHZwOSBjc2QgaW5mb3JtYXRpb24pCi0gICAga0tleVdhbnRzTkFMRnJhZ21lbnRzID0gJ05BTGYnLAogICAgIGtLZXlJc1N5bmNGcmFtZSAgICAgICA9ICdzeW5jJywgIC8vIGludDMyX3QgKGJvb2wpCiAgICAga0tleUlzQ29kZWNDb25maWcgICAgID0gJ2NvbmYnLCAgLy8gaW50MzJfdCAoYm9vbCkKICAgICBrS2V5SXNNdXhlckRhdGEgICAgICAgPSAnbXV4ZCcsICAvLyBpbnQzMl90IChib29sKQpAQCAtOTAsNyArODksNiBAQAogICAgIGtLZXlNYXhIZWlnaHQgICAgICAgICA9ICdtYXhIJywKICAgICBrS2V5VGh1bWJuYWlsVGltZSAgICAgPSAndGhiVCcsICAvLyBpbnQ2NF90ICh1c2VjcykKICAgICBrS2V5VHJhY2tJRCAgICAgICAgICAgPSAndHJJRCcsCi0gICAga0tleUlzRFJNICAgICAgICAgICAgID0gJ2lkcm0nLCAgLy8gaW50MzJfdCAoYm9vbCkKICAgICBrS2V5RW5jb2RlckRlbGF5ICAgICAgPSAnZW5jZCcsICAvLyBpbnQzMl90IChmcmFtZXMpCiAgICAga0tleUVuY29kZXJQYWRkaW5nICAgID0gJ2VuY3AnLCAgLy8gaW50MzJfdCAoZnJhbWVzKQogCkBAIC0xMDIsNyArMTAwLDYgQEAKICAgICBrS2V5VGl0bGUgICAgICAgICAgICAgPSAndGl0bCcsICAvLyBjc3RyaW5nCiAgICAga0tleVllYXIgICAgICAgICAgICAgID0gJ3llYXInLCAgLy8gY3N0cmluZwogICAgIGtLZXlBbGJ1bUFydCAgICAgICAgICA9ICdhbGJBJywgIC8vIGNvbXByZXNzZWQgaW1hZ2UgZGF0YQotICAgIGtLZXlBbGJ1bUFydE1JTUUgICAgICA9ICdhbEFNJywgIC8vIGNzdHJpbmcKICAgICBrS2V5QXV0aG9yICAgICAgICAgICAgPSAnYXV0aCcsICAvLyBjc3RyaW5nCiAgICAga0tleUNEVHJhY2tOdW1iZXIgICAgID0gJ2NkdHInLCAgLy8gY3N0cmluZwogICAgIGtLZXlEaXNjTnVtYmVyICAgICAgICA9ICdkbnVtJywgIC8vIGNzdHJpbmcKQEAgLTE4Miw2ICsxNzksNyBAQAogICAgIGtLZXlQc3NoICAgICAgICAgICAgICA9ICdwc3NoJywgIC8vIHJhdyBkYXRhCiAgICAga0tleUNBU3lzdGVtSUQgICAgICAgID0gJ2NhaWQnLCAgLy8gaW50MzJfdAogICAgIGtLZXlDQVNlc3Npb25JRCAgICAgICA9ICdzZWlkJywgIC8vIHJhdyBkYXRhCisgICAga0tleUNBUHJpdmF0ZURhdGEgICAgID0gJ2NhZGMnLCAgLy8gcmF3IGRhdGEKIAogICAgIGtLZXlFbmNyeXB0ZWRCeXRlQmxvY2sgPSAnY2JsaycsICAvLyB1aW50OF90CiAgICAga0tleVNraXBCeXRlQmxvY2sgICAgID0gJ3NibGsnLCAgLy8gdWludDhfdApAQCAtMTk5LDkgKzE5Nyw2IEBACiAgICAgLy8gTVBFRyB1c2VyIGRhdGEgb2Zmc2V0cwogICAgIGtLZXlNcGVnVXNlckRhdGEgICAgICA9ICdtcHVkJywgLy8gc2l6ZV90W10KIAotICAgIC8vIFNpemUgb2YgTkFMVSBsZW5ndGggaW4gbWt2L21wNAotICAgIGtLZXlOYWxMZW5ndGhTaXplICAgICA9ICduYWxzJywgLy8gaW50MzJfdAotCiAgICAgLy8gSERSIHJlbGF0ZWQKICAgICBrS2V5SGRyU3RhdGljSW5mbyAgICA9ICdoZHJTJywgLy8gSERSU3RhdGljSW5mbwogCkBAIC0yMjYsNyArMjIxLDYgQEAKICAgICBrS2V5RXhpZk9mZnNldCAgICAgICA9ICdleG9mJywgLy8gaW50NjRfdCwgRXhpZiBkYXRhIG9mZnNldAogICAgIGtLZXlFeGlmU2l6ZSAgICAgICAgID0gJ2V4c3onLCAvLyBpbnQ2NF90LCBFeGlmIGRhdGEgc2l6ZQogICAgIGtLZXlJc0V4aWYgICAgICAgICAgID0gJ2V4aWYnLCAvLyBib29sIChpbnQzMl90KSBidWZmZXIgY29udGFpbnMgZXhpZiBkYXRhIGJsb2NrCi0KICAgICBrS2V5UGNtQmlnRW5kaWFuICAgICA9ICdwY21iJywgLy8gYm9vbCAoaW50MzJfdCkKIAogICAgIC8vIEtleSBmb3IgQUxBQyBNYWdpYyBDb29raWUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhbWV0cmljcy9NZWRpYUFuYWx5dGljc0l0ZW0uY3BwIGIvbWVkaWEvbGlibWVkaWFtZXRyaWNzL01lZGlhQW5hbHl0aWNzSXRlbS5jcHAKaW5kZXggMTM1YzliNi4uZDNkZTAxZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFtZXRyaWNzL01lZGlhQW5hbHl0aWNzSXRlbS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFtZXRyaWNzL01lZGlhQW5hbHl0aWNzSXRlbS5jcHAKQEAgLTQ3OCw3ICs0NzgsNyBAQAogLy8gY2FsbGVyIHJlc3BvbnNpYmxlIGZvciB0aGUgcmV0dXJuZWQgc3RyaW5nCiBib29sIE1lZGlhQW5hbHl0aWNzSXRlbTo6Z2V0Q1N0cmluZyhNZWRpYUFuYWx5dGljc0l0ZW06OkF0dHIgbmFtZSwgY2hhciAqKnZhbHVlKSB7CiAgICAgUHJvcCAqcHJvcCA9IGZpbmRQcm9wKG5hbWUpOwotICAgIGlmIChwcm9wID09IE5VTEwgfHwgcHJvcC0+bVR5cGUgIT0ga1R5cGVEb3VibGUpIHsKKyAgICBpZiAocHJvcCA9PSBOVUxMIHx8IHByb3AtPm1UeXBlICE9IGtUeXBlQ1N0cmluZykgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmICh2YWx1ZSAhPSBOVUxMKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvQW5kcm9pZC5icCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9BbmRyb2lkLmJwCmluZGV4IDFmYTg3ODkuLjIxMDlhZDEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9BbmRyb2lkLmJwCkBAIC00LDExICs0LDEwIEBACiAgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCiB9CiAKLWNjX2xpYnJhcnkgeworY2NfbGlicmFyeV9zdGF0aWMgewogICAgIG5hbWU6ICJsaWJtZWRpYXBsYXllcjIiLAogCiAgICAgc3JjczogWwotICAgICAgICAiSkF1ZGlvVHJhY2suY3BwIiwKICAgICAgICAgIk1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0LmNwcCIsCiAgICAgICAgICJtZWRpYXBsYXllcjIuY3BwIiwKICAgICBdLApAQCAtMjEsMjIgKzIwLDIwIEBACiAgICAgICAgICJsaWJndWkiLAogICAgICAgICAibGlibG9nIiwKICAgICAgICAgImxpYm1lZGlhX29teCIsCi0gICAgICAgICJsaWJtZWRpYV9wbGF5ZXIyX3V0aWwiLAogICAgICAgICAibGlibWVkaWFleHRyYWN0b3IiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCiAgICAgICAgICJsaWJ1aSIsCiAgICAgICAgICJsaWJ1dGlscyIsCiAKICAgICAgICAgImxpYmNyeXB0byIsCi0gICAgICAgICJsaWJtZWRpYWRybSIsCiAgICAgICAgICJsaWJtZWRpYW1ldHJpY3MiLAogICAgICAgICAibGlibWVkaWFuZGsiLAorICAgICAgICAibGlibWVkaWFuZGtfdXRpbHMiLAogICAgICAgICAibGlibWVkaWF1dGlscyIsCiAgICAgICAgICJsaWJtZW11bnJlYWNoYWJsZSIsCiAgICAgICAgICJsaWJuYXRpdmV3aW5kb3ciLAogICAgICAgICAibGlicG93ZXJtYW5hZ2VyIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2h0dHBsaXZlIiwKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X3BsYXllcjIiLAogICAgIF0sCiAKICAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbCkBAIC00OSwxMSArNDYsMjAgQEAKICAgICAgICAgIm1lZGlhX3BsdWdpbl9oZWFkZXJzIiwKICAgICBdLAogCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJmcmFtZXdvcmtzL2Jhc2UvY29yZS9qbmkiLAorICAgIF0sCisKICAgICBzdGF0aWNfbGliczogWwogICAgICAgICAibGlibWVkaWFfaGVscGVyIiwKKyAgICAgICAgImxpYm1lZGlhcGxheWVyMi1wcm90b3MiLAorICAgICAgICAibGlibWVkaWFfcGxheWVyMl91dGlsIiwKKyAgICAgICAgImxpYnByb3RvYnVmLWNwcC1saXRlIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X251cGxheWVyMiIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9wbGF5ZXIyIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X3J0c3AiLAotICAgICAgICAibGlic3RhZ2VmcmlnaHRfdGltZWR0ZXh0IiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X3RpbWVkdGV4dDIiLAorICAgICAgICAibGlibWVkaWEyX2puaV9jb3JlIiwKICAgICBdLAogCiAgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWwpAQCAtNzcsMyArODMsNTUgQEAKICAgICAgICAgfSwKICAgICB9LAogfQorCitjY19saWJyYXJ5IHsKKyAgICBuYW1lOiAibGlibWVkaWEyX2puaV9jb3JlIiwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIkphdmFWTUhlbHBlci5jcHAiLAorICAgICAgICAiSkF1ZGlvVHJhY2suY3BwIiwKKyAgICAgICAgIkpNZWRpYTJIVFRQU2VydmljZS5jcHAiLAorICAgICAgICAiSk1lZGlhMkhUVFBDb25uZWN0aW9uLmNwcCIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJhbmRyb2lkLmhpZGwudG9rZW5AMS4wLXV0aWxzIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgICAgICAibGlibWVkaWFleHRyYWN0b3IiLAorICAgICAgICAibGliZGwiLAorICAgICAgICAibGliYXVkaW91dGlscyIsCisgICAgICAgICJsaWJhdWRpb2NsaWVudCIsCisgICAgICAgICJsaWJuYXRpdmVoZWxwZXIiLAorICAgIF0sCisKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlibWVkaWEvaW5jbHVkZSIsCisgICAgICAgICJmcmFtZXdvcmtzL2Jhc2UvY29yZS9qbmkiLAorICAgIF0sCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJpbmNsdWRlIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1Xbm8tZXJyb3I9ZGVwcmVjYXRlZC1kZWNsYXJhdGlvbnMiLAorICAgICAgICAiLVdhbGwiLAorICAgIF0sCisKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBtaXNjX3VuZGVmaW5lZDogWworICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgXSwKKyAgICAgICAgY2ZpOiB0cnVlLAorICAgICAgICBkaWFnOiB7CisgICAgICAgICAgICBjZmk6IHRydWUsCisgICAgICAgIH0sCisgICAgfSwKKworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL0pBdWRpb1RyYWNrLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9KQXVkaW9UcmFjay5jcHAKaW5kZXggYWMwY2M1Ny4uN2MyMTkxYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL0pBdWRpb1RyYWNrLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvSkF1ZGlvVHJhY2suY3BwCkBAIC0yMSwyNyArMjEsMjggQEAKICNpbmNsdWRlICJtZWRpYXBsYXllcjIvSkF1ZGlvVHJhY2suaCIKIAogI2luY2x1ZGUgPGFuZHJvaWRfbWVkaWFfQXVkaW9FcnJvcnMuaD4KLSNpbmNsdWRlIDxhbmRyb2lkX3J1bnRpbWUvQW5kcm9pZFJ1bnRpbWUuaD4KKyNpbmNsdWRlIDxtZWRpYXBsYXllcjIvSmF2YVZNSGVscGVyLmg+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+Q2FsbEludE1ldGhvZChtQXVkaW9UcmFja09iaiwgakdldFNhbXBsZVJhdGUpOwogfQpAQCAtNDAzLDcgKzQxNyw3IEBACiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCi0gICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOwogICAgIGptZXRob2RJRCBqR2V0QnVmZmVyU2l6ZUluRnJhbWVzID0gZW52LT5HZXRNZXRob2RJRCgKICAgICAgICAgICAgIG1BdWRpb1RyYWNrQ2xzLCAiZ2V0QnVmZmVyU2l6ZUluRnJhbWVzIiwgIigpSSIpOwogICAgIGludCBidWZmZXJTaXplSW5GcmFtZXMgPSBlbnYtPkNhbGxJbnRNZXRob2QobUF1ZGlvVHJhY2tPYmosIGpHZXRCdWZmZXJTaXplSW5GcmFtZXMpOwpAQCAtNDE3LDEyICs0MzEsNDEgQEAKIH0KIAogYXVkaW9fZm9ybWF0X3QgSkF1ZGlvVHJhY2s6OmZvcm1hdCgpIHsKLSAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBKTklFbnYgKmVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CiAgICAgam1ldGhvZElEIGpHZXRBdWRpb0Zvcm1hdCA9IGVudi0+R2V0TWV0aG9kSUQobUF1ZGlvVHJhY2tDbHMsICJnZXRBdWRpb0Zvcm1hdCIsICIoKUkiKTsKICAgICBpbnQgamF2YUZvcm1hdCA9IGVudi0+Q2FsbEludE1ldGhvZChtQXVkaW9UcmFja09iaiwgakdldEF1ZGlvRm9ybWF0KTsKICAgICByZXR1cm4gYXVkaW9Gb3JtYXRUb05hdGl2ZShqYXZhRm9ybWF0KTsKIH0KIAorc2l6ZV90IEpBdWRpb1RyYWNrOjpmcmFtZVNpemUoKSB7CisgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOworCisgICAgLy8gVE9ETzogQ2FsY3VsYXRlZCBoZXJlIGltcGxlbWVudGluZyB0aGUgbG9naWMgaW4gQXVkaW9UcmFjay5qYXZhCisgICAgLy8gd2FpdCBmb3IgQXVkaW9UcmFjay5qYXZhIGV4cG9zaW5nIHRoaXMgcGFyYW1ldGVyIChpLmUuIGdldEZyYW1lU2l6ZUluQnR5dGVzKCkpCisgICAgam1ldGhvZElEIGpHZXRBdWRpb0Zvcm1hdCA9IGVudi0+R2V0TWV0aG9kSUQobUF1ZGlvVHJhY2tDbHMsICJnZXRBdWRpb0Zvcm1hdCIsICIoKUkiKTsKKyAgICBpbnQgamF2YUZvcm1hdCA9IGVudi0+Q2FsbEludE1ldGhvZChtQXVkaW9UcmFja09iaiwgakdldEF1ZGlvRm9ybWF0KTsKKworICAgIGpjbGFzcyBqQXVkaW9Gb3JtYXRDbHMgPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9tZWRpYS9BdWRpb0Zvcm1hdCIpOworICAgIGptZXRob2RJRCBqSXNFbmNvZGluZ0xpbmVhckZyYW1lcyA9IGVudi0+R2V0U3RhdGljTWV0aG9kSUQoCisgICAgICAgICAgICBqQXVkaW9Gb3JtYXRDbHMsICJpc0VuY29kaW5nTGluZWFyRnJhbWVzIiwgIihJKVoiKTsKKyAgICBqYm9vbGVhbiBqYXZhSXNFbmNvZGluZ0xpbmVhckZyYW1lcyA9IGVudi0+Q2FsbFN0YXRpY0Jvb2xlYW5NZXRob2QoCisgICAgICAgICAgICBqQXVkaW9Gb3JtYXRDbHMsIGpJc0VuY29kaW5nTGluZWFyRnJhbWVzLCBqYXZhRm9ybWF0KTsKKworICAgIGlmIChqYXZhSXNFbmNvZGluZ0xpbmVhckZyYW1lcyA9PSBmYWxzZSkgeworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBqbWV0aG9kSUQgakdldEJ5dGVzUGVyU2FtcGxlID0gZW52LT5HZXRTdGF0aWNNZXRob2RJRChqQXVkaW9Gb3JtYXRDbHMsCisgICAgICAgICAgICAiZ2V0Qnl0ZXNQZXJTYW1wbGUiLCAiKEkpSSIpOworICAgIGludCBqYXZhQnl0ZXNQZXJTYW1wbGUgPSBlbnYtPkNhbGxTdGF0aWNJbnRNZXRob2QoakF1ZGlvRm9ybWF0Q2xzLAorICAgICAgICAgICAgakdldEJ5dGVzUGVyU2FtcGxlLCBqYXZhRm9ybWF0KTsKKworICAgIGptZXRob2RJRCBqR2V0Q2hhbm5lbENvdW50ID0gZW52LT5HZXRNZXRob2RJRChtQXVkaW9UcmFja0NscywgImdldENoYW5uZWxDb3VudCIsICIoKUkiKTsKKyAgICBpbnQgamF2YUNoYW5uZWxDb3VudCA9IGVudi0+Q2FsbEludE1ldGhvZChtQXVkaW9UcmFja09iaiwgakdldENoYW5uZWxDb3VudCk7CisKKyAgICByZXR1cm4gamF2YUNoYW5uZWxDb3VudCAqIGphdmFCeXRlc1BlclNhbXBsZTsKK30KKwogc3RhdHVzX3QgSkF1ZGlvVHJhY2s6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzIF9fdW51c2VkKSBjb25zdAogewogICAgIFN0cmluZzggcmVzdWx0OwpAQCAtNDMyLDEwICs0NzUsNiBAQAogICAgIC8vIFRPRE86IFJlbW92ZSBsb2dzIHRoYXQgaW5jbHVkZXMgdW5hdmFpbGFibGUgaW5mb3JtYXRpb24gZnJvbSBiZWxvdy4KIC8vICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAgc3RhdHVzKCVkKSwgc3RhdGUoJWQpLCBzZXNzaW9uIElkKCVkKSwgZmxhZ3MoJSN4KVxuIiwKIC8vICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXR1cywgbVN0YXRlLCBtU2Vzc2lvbklkLCBtRmxhZ3MpOwotLy8gICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiICBzdHJlYW0gdHlwZSglZCksIGxlZnQgLSByaWdodCB2b2x1bWUoJWYsICVmKVxuIiwKLS8vICAgICAgICAgICAgICAgICAgICAgICAgKG1TdHJlYW1UeXBlID09IEFVRElPX1NUUkVBTV9ERUZBVUxUKSA/Ci0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fYXR0cmlidXRlc190b19zdHJlYW1fdHlwZSgmbUF0dHJpYnV0ZXMpIDogbVN0cmVhbVR5cGUsCi0vLyAgICAgICAgICAgICAgICAgICAgICAgIG1Wb2x1bWVbQVVESU9fSU5URVJMRUFWRV9MRUZUXSwgbVZvbHVtZVtBVURJT19JTlRFUkxFQVZFX1JJR0hUXSk7CiAvLyAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgIGZvcm1hdCglI3gpLCBjaGFubmVsIG1hc2soJSN4KSwgY2hhbm5lbCBjb3VudCgldSlcbiIsCiAvLyAgICAgICAgICAgICAgICAgIGZvcm1hdCgpLCBtQ2hhbm5lbE1hc2ssIGNoYW5uZWxDb3VudCgpKTsKIC8vICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAgc2FtcGxlIHJhdGUoJXUpLCBvcmlnaW5hbCBzYW1wbGUgcmF0ZSgldSksIHNwZWVkKCVmKVxuIiwKQEAgLTQ1MywzOCArNDkyLDQwIEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi1hdWRpb19wb3J0X2hhbmRsZV90IEpBdWRpb1RyYWNrOjpnZXRSb3V0ZWREZXZpY2VJZCgpIHsKLSAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKK2pvYmplY3QgSkF1ZGlvVHJhY2s6OmdldFJvdXRlZERldmljZSgpIHsKKyAgICBKTklFbnYgKmVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CiAgICAgam1ldGhvZElEIGpHZXRSb3V0ZWREZXZpY2UgPSBlbnYtPkdldE1ldGhvZElEKG1BdWRpb1RyYWNrQ2xzLCAiZ2V0Um91dGVkRGV2aWNlIiwKICAgICAgICAgICAgICIoKUxhbmRyb2lkL21lZGlhL0F1ZGlvRGV2aWNlSW5mbzsiKTsKLSAgICBqb2JqZWN0IGpBdWRpb0RldmljZUluZm9PYmogPSBlbnYtPkNhbGxPYmplY3RNZXRob2QobUF1ZGlvVHJhY2tPYmosIGpHZXRSb3V0ZWREZXZpY2UpOwotICAgIGlmIChlbnYtPklzU2FtZU9iamVjdChqQXVkaW9EZXZpY2VJbmZvT2JqLCBOVUxMKSkgewotICAgICAgICByZXR1cm4gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKLSAgICB9Ci0KLSAgICBqY2xhc3MgakF1ZGlvRGV2aWNlSW5mb0NscyA9IGVudi0+RmluZENsYXNzKCJMYW5kcm9pZC9tZWRpYS9BdWRpb0RldmljZUluZm8iKTsKLSAgICBqbWV0aG9kSUQgakdldElkID0gZW52LT5HZXRNZXRob2RJRChqQXVkaW9EZXZpY2VJbmZvQ2xzLCAiZ2V0SWQiLCAiKClJIik7Ci0gICAgamludCByb3V0ZWREZXZpY2VJZCA9IGVudi0+Q2FsbEludE1ldGhvZChqQXVkaW9EZXZpY2VJbmZvT2JqLCBqR2V0SWQpOwotICAgIHJldHVybiByb3V0ZWREZXZpY2VJZDsKKyAgICByZXR1cm4gZW52LT5DYWxsT2JqZWN0TWV0aG9kKG1BdWRpb1RyYWNrT2JqLCBqR2V0Um91dGVkRGV2aWNlKTsKIH0KIAotYXVkaW9fc2Vzc2lvbl90IEpBdWRpb1RyYWNrOjpnZXRBdWRpb1Nlc3Npb25JZCgpIHsKLSAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKK2ludDMyX3QgSkF1ZGlvVHJhY2s6OmdldEF1ZGlvU2Vzc2lvbklkKCkgeworICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKICAgICBqbWV0aG9kSUQgakdldEF1ZGlvU2Vzc2lvbklkID0gZW52LT5HZXRNZXRob2RJRChtQXVkaW9UcmFja0NscywgImdldEF1ZGlvU2Vzc2lvbklkIiwgIigpSSIpOwogICAgIGppbnQgc2Vzc2lvbklkID0gZW52LT5DYWxsSW50TWV0aG9kKG1BdWRpb1RyYWNrT2JqLCBqR2V0QXVkaW9TZXNzaW9uSWQpOwotICAgIHJldHVybiAoYXVkaW9fc2Vzc2lvbl90KSBzZXNzaW9uSWQ7CisgICAgcmV0dXJuIHNlc3Npb25JZDsKIH0KIAotc3RhdHVzX3QgSkF1ZGlvVHJhY2s6OnNldE91dHB1dERldmljZShhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkKSB7Ci0gICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7Ci0gICAgamNsYXNzIGpNUDJJbXBsQ2xzID0gZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvbWVkaWEvTWVkaWFQbGF5ZXIySW1wbCIpOwotICAgIGptZXRob2RJRCBqU2V0QXVkaW9PdXRwdXREZXZpY2VCeUlkID0gZW52LT5HZXRNZXRob2RJRCgKLSAgICAgICAgICAgIGpNUDJJbXBsQ2xzLCAic2V0QXVkaW9PdXRwdXREZXZpY2VCeUlkIiwgIihMYW5kcm9pZC9tZWRpYS9BdWRpb1RyYWNrO0kpWiIpOwotICAgIGpib29sZWFuIHJlc3VsdCA9IGVudi0+Q2FsbFN0YXRpY0Jvb2xlYW5NZXRob2QoCi0gICAgICAgICAgICBqTVAySW1wbENscywgalNldEF1ZGlvT3V0cHV0RGV2aWNlQnlJZCwgbUF1ZGlvVHJhY2tPYmosIGRldmljZUlkKTsKK3N0YXR1c190IEpBdWRpb1RyYWNrOjpzZXRQcmVmZXJyZWREZXZpY2Uoam9iamVjdCBkZXZpY2UpIHsKKyAgICBKTklFbnYgKmVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CisgICAgam1ldGhvZElEIGpTZXRQcmVmZXJyZWREZXZpY2VJZCA9IGVudi0+R2V0TWV0aG9kSUQobUF1ZGlvVHJhY2tDbHMsICJzZXRQcmVmZXJyZWREZXZpY2UiLAorICAgICAgICAgICAgIihMYW5kcm9pZC9tZWRpYS9BdWRpb0RldmljZUluZm87KVoiKTsKKyAgICBqYm9vbGVhbiByZXN1bHQgPSBlbnYtPkNhbGxCb29sZWFuTWV0aG9kKG1BdWRpb1RyYWNrT2JqLCBqU2V0UHJlZmVycmVkRGV2aWNlSWQsIGRldmljZSk7CiAgICAgcmV0dXJuIHJlc3VsdCA9PSB0cnVlID8gTk9fRVJST1IgOiBCQURfVkFMVUU7CiB9CiAKK2F1ZGlvX3N0cmVhbV90eXBlX3QgSkF1ZGlvVHJhY2s6OmdldEF1ZGlvU3RyZWFtVHlwZSgpIHsKKyAgICBKTklFbnYgKmVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CisgICAgam1ldGhvZElEIGpHZXRBdWRpb0F0dHJpYnV0ZXMgPSBlbnYtPkdldE1ldGhvZElEKG1BdWRpb1RyYWNrQ2xzLCAiZ2V0QXVkaW9BdHRyaWJ1dGVzIiwKKyAgICAgICAgICAgICIoKUxhbmRyb2lkL21lZGlhL0F1ZGlvQXR0cmlidXRlczsiKTsKKyAgICBqb2JqZWN0IGpBdWRpb0F0dHJpYnV0ZXMgPSBlbnYtPkNhbGxPYmplY3RNZXRob2QobUF1ZGlvVHJhY2tPYmosIGpHZXRBdWRpb0F0dHJpYnV0ZXMpOworICAgIGpjbGFzcyBqQXVkaW9BdHRyaWJ1dGVzQ2xzID0gZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvbWVkaWEvQXVkaW9BdHRyaWJ1dGVzIik7CisgICAgam1ldGhvZElEIGpHZXRWb2x1bWVDb250cm9sU3RyZWFtID0gZW52LT5HZXRNZXRob2RJRChqQXVkaW9BdHRyaWJ1dGVzQ2xzLAorICAgICAgICAgICAgImdldFZvbHVtZUNvbnRyb2xTdHJlYW0iLCAiKClJIik7CisgICAgaW50IGphdmFBdWRpb1N0cmVhbVR5cGUgPSBlbnYtPkNhbGxJbnRNZXRob2QoakF1ZGlvQXR0cmlidXRlcywgakdldFZvbHVtZUNvbnRyb2xTdHJlYW0pOworICAgIHJldHVybiAoYXVkaW9fc3RyZWFtX3R5cGVfdClqYXZhQXVkaW9TdHJlYW1UeXBlOworfQorCiBzdGF0dXNfdCBKQXVkaW9UcmFjazo6cGVuZGluZ0R1cmF0aW9uKGludDMyX3QgKm1zZWMpIHsKICAgICBpZiAobXNlYyA9PSBudWxscHRyKSB7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CkBAIC01MjYsMTggKzU2Nyw4NSBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotc3RhdHVzX3QgSkF1ZGlvVHJhY2s6OmFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2soCi0gICAgICAgIGNvbnN0IHNwPEF1ZGlvU3lzdGVtOjpBdWRpb0RldmljZUNhbGxiYWNrPiYgY2FsbGJhY2sgX191bnVzZWQpIHsKLSAgICAvLyBUT0RPOiBJbXBsZW1lbnQgdGhpcyBhZnRlciBhcHByb3ByaWF0ZSBKYXZhIEF1ZGlvVHJhY2sgbWV0aG9kIGlzIGF2YWlsYWJsZS4KK3N0YXR1c190IEpBdWRpb1RyYWNrOjphZGRBdWRpb0RldmljZUNhbGxiYWNrKGpvYmplY3QgbGlzdGVuZXIsIGpvYmplY3QgaGFuZGxlcikgeworICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKKyAgICBqbWV0aG9kSUQgakFkZE9uUm91dGluZ0NoYW5nZWRMaXN0ZW5lciA9IGVudi0+R2V0TWV0aG9kSUQobUF1ZGlvVHJhY2tDbHMsCisgICAgICAgICAgICAiYWRkT25Sb3V0aW5nQ2hhbmdlZExpc3RlbmVyIiwKKyAgICAgICAgICAgICIoTGFuZHJvaWQvbWVkaWEvQXVkaW9Sb3V0aW5nJE9uUm91dGluZ0NoYW5nZWRMaXN0ZW5lcjtMYW5kcm9pZC9vcy9IYW5kbGVyOylWIik7CisgICAgZW52LT5DYWxsVm9pZE1ldGhvZChtQXVkaW9UcmFja09iaiwgakFkZE9uUm91dGluZ0NoYW5nZWRMaXN0ZW5lciwgbGlzdGVuZXIsIGhhbmRsZXIpOwogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotc3RhdHVzX3QgSkF1ZGlvVHJhY2s6OnJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2soCi0gICAgICAgIGNvbnN0IHNwPEF1ZGlvU3lzdGVtOjpBdWRpb0RldmljZUNhbGxiYWNrPiYgY2FsbGJhY2sgX191bnVzZWQpIHsKLSAgICAvLyBUT0RPOiBJbXBsZW1lbnQgdGhpcyBhZnRlciBhcHByb3ByaWF0ZSBKYXZhIEF1ZGlvVHJhY2sgbWV0aG9kIGlzIGF2YWlsYWJsZS4KK3N0YXR1c190IEpBdWRpb1RyYWNrOjpyZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrKGpvYmplY3QgbGlzdGVuZXIpIHsKKyAgICBKTklFbnYgKmVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CisgICAgam1ldGhvZElEIGpSZW1vdmVPblJvdXRpbmdDaGFuZ2VkTGlzdGVuZXIgPSBlbnYtPkdldE1ldGhvZElEKG1BdWRpb1RyYWNrQ2xzLAorICAgICAgICAgICAgInJlbW92ZU9uUm91dGluZ0NoYW5nZWRMaXN0ZW5lciIsCisgICAgICAgICAgICAiKExhbmRyb2lkL21lZGlhL0F1ZGlvUm91dGluZyRPblJvdXRpbmdDaGFuZ2VkTGlzdGVuZXI7KVYiKTsKKyAgICBlbnYtPkNhbGxWb2lkTWV0aG9kKG1BdWRpb1RyYWNrT2JqLCBqUmVtb3ZlT25Sb3V0aW5nQ2hhbmdlZExpc3RlbmVyLCBsaXN0ZW5lcik7CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCit2b2lkIEpBdWRpb1RyYWNrOjpyZWdpc3RlclJvdXRpbmdEZWxlZ2F0ZXMoCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxqb2JqZWN0LCBqb2JqZWN0Pj4mIHJvdXRpbmdEZWxlZ2F0ZXMpIHsKKyAgICBmb3IgKHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxqb2JqZWN0LCBqb2JqZWN0Pj46Oml0ZXJhdG9yIGl0ID0gcm91dGluZ0RlbGVnYXRlcy5iZWdpbigpOworICAgICAgICAgICAgaXQgIT0gcm91dGluZ0RlbGVnYXRlcy5lbmQoKTsgaXQrKykgeworICAgICAgICBhZGRBdWRpb0RldmljZUNhbGxiYWNrKGl0LT5zZWNvbmQsIGdldEhhbmRsZXIoaXQtPnNlY29uZCkpOworICAgIH0KK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vICAgICAgICAgICAgICAgIFN0YXRpYyBtZXRob2RzIGJlZ2luICAgICAgICAgICAgICAgICAgIC8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworam9iamVjdCBKQXVkaW9UcmFjazo6Z2V0TGlzdGVuZXIoY29uc3Qgam9iamVjdCByb3V0aW5nRGVsZWdhdGVPYmopIHsKKyAgICBKTklFbnYgKmVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CisgICAgamNsYXNzIGpSb3V0aW5nRGVsZWdhdGVDbHMgPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9tZWRpYS9Sb3V0aW5nRGVsZWdhdGUiKTsKKyAgICBqbWV0aG9kSUQgakdldExpc3RlbmVyID0gZW52LT5HZXRNZXRob2RJRChqUm91dGluZ0RlbGVnYXRlQ2xzLAorICAgICAgICAgICAgImdldExpc3RlbmVyIiwgIigpTGFuZHJvaWQvbWVkaWEvQXVkaW9Sb3V0aW5nJE9uUm91dGluZ0NoYW5nZWRMaXN0ZW5lcjsiKTsKKyAgICByZXR1cm4gZW52LT5DYWxsT2JqZWN0TWV0aG9kKHJvdXRpbmdEZWxlZ2F0ZU9iaiwgakdldExpc3RlbmVyKTsKK30KKworam9iamVjdCBKQXVkaW9UcmFjazo6Z2V0SGFuZGxlcihjb25zdCBqb2JqZWN0IHJvdXRpbmdEZWxlZ2F0ZU9iaikgeworICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKKyAgICBqY2xhc3MgalJvdXRpbmdEZWxlZ2F0ZUNscyA9IGVudi0+RmluZENsYXNzKCJhbmRyb2lkL21lZGlhL1JvdXRpbmdEZWxlZ2F0ZSIpOworICAgIGptZXRob2RJRCBqR2V0SGFuZGxlciA9IGVudi0+R2V0TWV0aG9kSUQoalJvdXRpbmdEZWxlZ2F0ZUNscywKKyAgICAgICAgImdldEhhbmRsZXIiLCAiKClMYW5kcm9pZC9vcy9IYW5kbGVyOyIpOworICAgIHJldHVybiBlbnYtPkNhbGxPYmplY3RNZXRob2Qocm91dGluZ0RlbGVnYXRlT2JqLCBqR2V0SGFuZGxlcik7Cit9CisKK2pvYmplY3QgSkF1ZGlvVHJhY2s6OmFkZEdsb2JhbFJlZihjb25zdCBqb2JqZWN0IG9iaikgeworICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxqb2JqZWN0PihlbnYtPk5ld0dsb2JhbFJlZihvYmopKTsKK30KKworc3RhdHVzX3QgSkF1ZGlvVHJhY2s6OnJlbW92ZUdsb2JhbFJlZihjb25zdCBqb2JqZWN0IG9iaikgeworICAgIGlmIChvYmogPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBKTklFbnYgKmVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CisgICAgZW52LT5EZWxldGVHbG9iYWxSZWYob2JqKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK2pvYmplY3QgSkF1ZGlvVHJhY2s6OmZpbmRCeUtleShzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8am9iamVjdCwgam9iamVjdD4+JiBtcCwgY29uc3Qgam9iamVjdCBrZXkpIHsKKyAgICBKTklFbnYgKmVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CisgICAgZm9yIChzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8am9iamVjdCwgam9iamVjdD4+OjppdGVyYXRvciBpdCA9IG1wLmJlZ2luKCk7IGl0ICE9IG1wLmVuZCgpOyBpdCsrKSB7CisgICAgICAgIGlmIChlbnYtPklzU2FtZU9iamVjdChpdC0+Zmlyc3QsIGtleSkpIHsKKyAgICAgICAgICAgIHJldHVybiBpdC0+c2Vjb25kOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBudWxscHRyOworfQorCit2b2lkIEpBdWRpb1RyYWNrOjplcmFzZUJ5S2V5KHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxqb2JqZWN0LCBqb2JqZWN0Pj4mIG1wLCBjb25zdCBqb2JqZWN0IGtleSkgeworICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKKyAgICBmb3IgKHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxqb2JqZWN0LCBqb2JqZWN0Pj46Oml0ZXJhdG9yIGl0ID0gbXAuYmVnaW4oKTsgaXQgIT0gbXAuZW5kKCk7IGl0KyspIHsKKyAgICAgICAgaWYgKGVudi0+SXNTYW1lT2JqZWN0KGl0LT5maXJzdCwga2V5KSkgeworICAgICAgICAgICAgbXAuZXJhc2UoaXQpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorfQorCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAvLy8gICAgICAgICAgICAgICAgUHJpdmF0ZSBtZXRob2QgYmVnaW5zICAgICAgICAgICAgICAgICAgLy8vCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCkBAIC01NTAsNyArNjU4LDcgQEAKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCi0gICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOwogCiAgICAgLy8gUmVmZXJlbmNlZCAiYW5kcm9pZF9tZWRpYV9Wb2x1bWVTaGFwZXIuaCIuCiAgICAgamZsb2F0QXJyYXkgeGFycmF5ID0gbnVsbHB0cjsKQEAgLTU5NSw3ICs3MDMsNyBAQAogam9iamVjdCBKQXVkaW9UcmFjazo6Y3JlYXRlVm9sdW1lU2hhcGVyT3BlcmF0aW9uT2JqKAogICAgICAgICBjb25zdCBzcDxtZWRpYTo6Vm9sdW1lU2hhcGVyOjpPcGVyYXRpb24+JiBvcGVyYXRpb24pIHsKIAotICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKIAogICAgIGpjbGFzcyBqQnVpbGRlckNscyA9IGVudi0+RmluZENsYXNzKCJhbmRyb2lkL21lZGlhL1ZvbHVtZVNoYXBlciRPcGVyYXRpb24kQnVpbGRlciIpOwogICAgIGptZXRob2RJRCBqQnVpbGRlckN0b3IgPSBlbnYtPkdldE1ldGhvZElEKGpCdWlsZGVyQ2xzLCAiPGluaXQ+IiwgIigpViIpOwpAQCAtNjQ3LDE1ICs3NTUsMTUgQEAKIH0KIAogam9iamVjdCBKQXVkaW9UcmFjazo6Y3JlYXRlU3RyZWFtRXZlbnRDYWxsYmFjayhjYWxsYmFja190IGNiZiwgdm9pZCogdXNlcikgewotICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOwotICAgIGpjbGFzcyBqQ2FsbGJhY2tDbHMgPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9tZWRpYS9NZWRpYVBsYXllcjJJbXBsJFN0cmVhbUV2ZW50Q2FsbGJhY2siKTsKKyAgICBKTklFbnYgKmVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CisgICAgamNsYXNzIGpDYWxsYmFja0NscyA9IGVudi0+RmluZENsYXNzKCJhbmRyb2lkL21lZGlhL01lZGlhUGxheWVyMiRTdHJlYW1FdmVudENhbGxiYWNrIik7CiAgICAgam1ldGhvZElEIGpDYWxsYmFja0N0b3IgPSBlbnYtPkdldE1ldGhvZElEKGpDYWxsYmFja0NscywgIjxpbml0PiIsICIoSkpKKVYiKTsKICAgICBqb2JqZWN0IGpDYWxsYmFja09iaiA9IGVudi0+TmV3T2JqZWN0KGpDYWxsYmFja0NscywgakNhbGxiYWNrQ3RvciwgdGhpcywgY2JmLCB1c2VyKTsKICAgICByZXR1cm4gakNhbGxiYWNrT2JqOwogfQogCiBqb2JqZWN0IEpBdWRpb1RyYWNrOjpjcmVhdGVDYWxsYmFja0V4ZWN1dG9yKCkgewotICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKICAgICBqY2xhc3MgakV4ZWN1dG9yc0NscyA9IGVudi0+RmluZENsYXNzKCJqYXZhL3V0aWwvY29uY3VycmVudC9FeGVjdXRvcnMiKTsKICAgICBqbWV0aG9kSUQgak5ld1NpbmdsZVRocmVhZEV4ZWN1dG9yID0gZW52LT5HZXRTdGF0aWNNZXRob2RJRChqRXhlY3V0b3JzQ2xzLAogICAgICAgICAgICAgIm5ld1NpbmdsZVRocmVhZEV4ZWN1dG9yIiwgIigpTGphdmEvdXRpbC9jb25jdXJyZW50L0V4ZWN1dG9yU2VydmljZTsiKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9KTWVkaWEySFRUUENvbm5lY3Rpb24uY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL0pNZWRpYTJIVFRQQ29ubmVjdGlvbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI2NGE3ZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9KTWVkaWEySFRUUENvbm5lY3Rpb24uY3BwCkBAIC0wLDAgKzEsMTgwIEBACisvKgorICogQ29weXJpZ2h0IDIwMTcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkpNZWRpYTJIVFRQQ29ubmVjdGlvbiIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhcGxheWVyMi9KYXZhVk1IZWxwZXIuaD4KKyNpbmNsdWRlIDxtZWRpYXBsYXllcjIvSk1lZGlhMkhUVFBDb25uZWN0aW9uLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxuYXRpdmVoZWxwZXIvU2NvcGVkTG9jYWxSZWYuaD4KKworI2luY2x1ZGUgImxvZy9sb2cuaCIKKyNpbmNsdWRlICJqbmkuaCIKKyNpbmNsdWRlIDxuYXRpdmVoZWxwZXIvSk5JSGVscC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0YXRpYyBjb25zdCBzaXplX3Qga0J1ZmZlclNpemUgPSAzMjc2ODsKKworSk1lZGlhMkhUVFBDb25uZWN0aW9uOjpKTWVkaWEySFRUUENvbm5lY3Rpb24oSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeikgeworICAgIG1NZWRpYTJIVFRQQ29ubmVjdGlvbk9iaiA9IGVudi0+TmV3R2xvYmFsUmVmKHRoaXopOworICAgIENIRUNLKG1NZWRpYTJIVFRQQ29ubmVjdGlvbk9iaiAhPSBOVUxMKTsKKworICAgIFNjb3BlZExvY2FsUmVmPGpjbGFzcz4gbWVkaWEySFRUUENvbm5lY3Rpb25DbGFzcygKKyAgICAgICAgICAgIGVudiwgZW52LT5HZXRPYmplY3RDbGFzcyhtTWVkaWEySFRUUENvbm5lY3Rpb25PYmopKTsKKyAgICBDSEVDSyhtZWRpYTJIVFRQQ29ubmVjdGlvbkNsYXNzLmdldCgpICE9IE5VTEwpOworCisgICAgbUNvbm5lY3RNZXRob2QgPSBlbnYtPkdldE1ldGhvZElEKAorICAgICAgICAgICAgbWVkaWEySFRUUENvbm5lY3Rpb25DbGFzcy5nZXQoKSwKKyAgICAgICAgICAgICJjb25uZWN0IiwKKyAgICAgICAgICAgICIoTGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7KVoiKTsKKyAgICBDSEVDSyhtQ29ubmVjdE1ldGhvZCAhPSBOVUxMKTsKKworICAgIG1EaXNjb25uZWN0TWV0aG9kID0gZW52LT5HZXRNZXRob2RJRCgKKyAgICAgICAgICAgIG1lZGlhMkhUVFBDb25uZWN0aW9uQ2xhc3MuZ2V0KCksCisgICAgICAgICAgICAiZGlzY29ubmVjdCIsCisgICAgICAgICAgICAiKClWIik7CisgICAgQ0hFQ0sobURpc2Nvbm5lY3RNZXRob2QgIT0gTlVMTCk7CisKKyAgICBtUmVhZEF0TWV0aG9kID0gZW52LT5HZXRNZXRob2RJRCgKKyAgICAgICAgICAgIG1lZGlhMkhUVFBDb25uZWN0aW9uQ2xhc3MuZ2V0KCksCisgICAgICAgICAgICAicmVhZEF0IiwKKyAgICAgICAgICAgICIoSltCSSlJIik7CisgICAgQ0hFQ0sobVJlYWRBdE1ldGhvZCAhPSBOVUxMKTsKKworICAgIG1HZXRTaXplTWV0aG9kID0gZW52LT5HZXRNZXRob2RJRCgKKyAgICAgICAgICAgIG1lZGlhMkhUVFBDb25uZWN0aW9uQ2xhc3MuZ2V0KCksCisgICAgICAgICAgICAiZ2V0U2l6ZSIsCisgICAgICAgICAgICAiKClKIik7CisgICAgQ0hFQ0sobUdldFNpemVNZXRob2QgIT0gTlVMTCk7CisKKyAgICBtR2V0TUlNRVR5cGVNZXRob2QgPSBlbnYtPkdldE1ldGhvZElEKAorICAgICAgICAgICAgbWVkaWEySFRUUENvbm5lY3Rpb25DbGFzcy5nZXQoKSwKKyAgICAgICAgICAgICJnZXRNSU1FVHlwZSIsCisgICAgICAgICAgICAiKClMamF2YS9sYW5nL1N0cmluZzsiKTsKKyAgICBDSEVDSyhtR2V0TUlNRVR5cGVNZXRob2QgIT0gTlVMTCk7CisKKyAgICBtR2V0VXJpTWV0aG9kID0gZW52LT5HZXRNZXRob2RJRCgKKyAgICAgICAgICAgIG1lZGlhMkhUVFBDb25uZWN0aW9uQ2xhc3MuZ2V0KCksCisgICAgICAgICAgICAiZ2V0VXJpIiwKKyAgICAgICAgICAgICIoKUxqYXZhL2xhbmcvU3RyaW5nOyIpOworICAgIENIRUNLKG1HZXRVcmlNZXRob2QgIT0gTlVMTCk7CisKKyAgICBTY29wZWRMb2NhbFJlZjxqYnl0ZUFycmF5PiB0bXAoCisgICAgICAgIGVudiwgZW52LT5OZXdCeXRlQXJyYXkoa0J1ZmZlclNpemUpKTsKKyAgICBtQnl0ZUFycmF5T2JqID0gKGpieXRlQXJyYXkpZW52LT5OZXdHbG9iYWxSZWYodG1wLmdldCgpKTsKKyAgICBDSEVDSyhtQnl0ZUFycmF5T2JqICE9IE5VTEwpOworfQorCitKTWVkaWEySFRUUENvbm5lY3Rpb246On5KTWVkaWEySFRUUENvbm5lY3Rpb24oKSB7CisgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOworICAgIGVudi0+RGVsZXRlR2xvYmFsUmVmKG1NZWRpYTJIVFRQQ29ubmVjdGlvbk9iaik7CisgICAgZW52LT5EZWxldGVHbG9iYWxSZWYobUJ5dGVBcnJheU9iaik7Cit9CisKK2Jvb2wgSk1lZGlhMkhUVFBDb25uZWN0aW9uOjpjb25uZWN0KAorICAgICAgICBjb25zdCBjaGFyICp1cmksIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKSB7CisgICAgU3RyaW5nOCB0bXAoIiIpOworICAgIGlmIChoZWFkZXJzICE9IE5VTEwpIHsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoZWFkZXJzLT5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgdG1wLmFwcGVuZChoZWFkZXJzLT5rZXlBdChpKSk7CisgICAgICAgICAgICB0bXAuYXBwZW5kKFN0cmluZzgoIjogIikpOworICAgICAgICAgICAgdG1wLmFwcGVuZChoZWFkZXJzLT52YWx1ZUF0KGkpKTsKKyAgICAgICAgICAgIHRtcC5hcHBlbmQoU3RyaW5nOCgiXHJcbiIpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEpOSUVudiogZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKKyAgICBqc3RyaW5nIGp1cmkgPSBlbnYtPk5ld1N0cmluZ1VURih1cmkpOworICAgIGpzdHJpbmcgamhlYWRlcnMgPSBlbnYtPk5ld1N0cmluZ1VURih0bXAuc3RyaW5nKCkpOworCisgICAgamJvb2xlYW4gcmV0ID0KKyAgICAgICAgZW52LT5DYWxsQm9vbGVhbk1ldGhvZChtTWVkaWEySFRUUENvbm5lY3Rpb25PYmosIG1Db25uZWN0TWV0aG9kLCBqdXJpLCBqaGVhZGVycyk7CisKKyAgICBlbnYtPkRlbGV0ZUxvY2FsUmVmKGp1cmkpOworICAgIGVudi0+RGVsZXRlTG9jYWxSZWYoamhlYWRlcnMpOworCisgICAgcmV0dXJuIChib29sKXJldDsKK30KKwordm9pZCBKTWVkaWEySFRUUENvbm5lY3Rpb246OmRpc2Nvbm5lY3QoKSB7CisgICAgSk5JRW52KiBlbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOworICAgIGVudi0+Q2FsbFZvaWRNZXRob2QobU1lZGlhMkhUVFBDb25uZWN0aW9uT2JqLCBtRGlzY29ubmVjdE1ldGhvZCk7Cit9CisKK3NzaXplX3QgSk1lZGlhMkhUVFBDb25uZWN0aW9uOjpyZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgSk5JRW52KiBlbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOworCisgICAgaWYgKHNpemUgPiBrQnVmZmVyU2l6ZSkgeworICAgICAgICBzaXplID0ga0J1ZmZlclNpemU7CisgICAgfQorCisgICAgamludCBuID0gZW52LT5DYWxsSW50TWV0aG9kKAorICAgICAgICAgICAgbU1lZGlhMkhUVFBDb25uZWN0aW9uT2JqLCBtUmVhZEF0TWV0aG9kLCAoamxvbmcpb2Zmc2V0LCBtQnl0ZUFycmF5T2JqLCAoamludClzaXplKTsKKworICAgIGlmIChuID4gMCkgeworICAgICAgICBlbnYtPkdldEJ5dGVBcnJheVJlZ2lvbigKKyAgICAgICAgICAgICAgICBtQnl0ZUFycmF5T2JqLAorICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgbiwKKyAgICAgICAgICAgICAgICAoamJ5dGUgKilkYXRhKTsKKyAgICB9CisKKyAgICByZXR1cm4gbjsKK30KKworb2ZmNjRfdCBKTWVkaWEySFRUUENvbm5lY3Rpb246OmdldFNpemUoKSB7CisgICAgSk5JRW52KiBlbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOworICAgIHJldHVybiAob2ZmNjRfdCkoZW52LT5DYWxsTG9uZ01ldGhvZChtTWVkaWEySFRUUENvbm5lY3Rpb25PYmosIG1HZXRTaXplTWV0aG9kKSk7Cit9CisKK3N0YXR1c190IEpNZWRpYTJIVFRQQ29ubmVjdGlvbjo6Z2V0TUlNRVR5cGUoU3RyaW5nOCAqbWltZVR5cGUpIHsKKyAgICBKTklFbnYqIGVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CisgICAganN0cmluZyBqbWltZSA9IChqc3RyaW5nKWVudi0+Q2FsbE9iamVjdE1ldGhvZChtTWVkaWEySFRUUENvbm5lY3Rpb25PYmosIG1HZXRNSU1FVHlwZU1ldGhvZCk7CisgICAgamJvb2xlYW4gZmxhZyA9IGVudi0+RXhjZXB0aW9uQ2hlY2soKTsKKyAgICBpZiAoZmxhZykgeworICAgICAgICBlbnYtPkV4Y2VwdGlvbkNsZWFyKCk7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIGNvbnN0IGNoYXIgKnN0ciA9IGVudi0+R2V0U3RyaW5nVVRGQ2hhcnMoam1pbWUsIDApOworICAgIGlmIChzdHIgIT0gTlVMTCkgeworICAgICAgICAqbWltZVR5cGUgPSBTdHJpbmc4KHN0cik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgKm1pbWVUeXBlID0gImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSI7CisgICAgfQorICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKGptaW1lLCBzdHIpOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgSk1lZGlhMkhUVFBDb25uZWN0aW9uOjpnZXRVcmkoU3RyaW5nOCAqdXJpKSB7CisgICAgSk5JRW52KiBlbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOworICAgIGpzdHJpbmcganVyaSA9IChqc3RyaW5nKWVudi0+Q2FsbE9iamVjdE1ldGhvZChtTWVkaWEySFRUUENvbm5lY3Rpb25PYmosIG1HZXRVcmlNZXRob2QpOworICAgIGpib29sZWFuIGZsYWcgPSBlbnYtPkV4Y2VwdGlvbkNoZWNrKCk7CisgICAgaWYgKGZsYWcpIHsKKyAgICAgICAgZW52LT5FeGNlcHRpb25DbGVhcigpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICBjb25zdCBjaGFyICpzdHIgPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKGp1cmksIDApOworICAgICp1cmkgPSBTdHJpbmc4KHN0cik7CisgICAgZW52LT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnMoanVyaSwgc3RyKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvSk1lZGlhMkhUVFBTZXJ2aWNlLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9KTWVkaWEySFRUUFNlcnZpY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2NGMxNWQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvSk1lZGlhMkhUVFBTZXJ2aWNlLmNwcApAQCAtMCwwICsxLDYwIEBACisvKgorICogQ29weXJpZ2h0IDIwMTcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkpNZWRpYTJIVFRQU2VydmljZSIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPGpuaS5oPgorCisjaW5jbHVkZSA8bWVkaWFwbGF5ZXIyL0phdmFWTUhlbHBlci5oPgorI2luY2x1ZGUgPG1lZGlhcGxheWVyMi9KTWVkaWEySFRUUFNlcnZpY2UuaD4KKyNpbmNsdWRlIDxtZWRpYXBsYXllcjIvSk1lZGlhMkhUVFBDb25uZWN0aW9uLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKworI2luY2x1ZGUgPG5hdGl2ZWhlbHBlci9KTklIZWxwLmg+CisjaW5jbHVkZSA8bmF0aXZlaGVscGVyL1Njb3BlZExvY2FsUmVmLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworSk1lZGlhMkhUVFBTZXJ2aWNlOjpKTWVkaWEySFRUUFNlcnZpY2UoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeikgeworICAgIG1NZWRpYTJIVFRQU2VydmljZU9iaiA9IGVudi0+TmV3R2xvYmFsUmVmKHRoaXopOworICAgIENIRUNLKG1NZWRpYTJIVFRQU2VydmljZU9iaiAhPSBOVUxMKTsKKworICAgIFNjb3BlZExvY2FsUmVmPGpjbGFzcz4gbWVkaWEySFRUUFNlcnZpY2VDbGFzcyhlbnYsIGVudi0+R2V0T2JqZWN0Q2xhc3MobU1lZGlhMkhUVFBTZXJ2aWNlT2JqKSk7CisgICAgQ0hFQ0sobWVkaWEySFRUUFNlcnZpY2VDbGFzcy5nZXQoKSAhPSBOVUxMKTsKKworICAgIG1NYWtlSFRUUENvbm5lY3Rpb25NZXRob2QgPSBlbnYtPkdldE1ldGhvZElEKAorICAgICAgICAgICAgbWVkaWEySFRUUFNlcnZpY2VDbGFzcy5nZXQoKSwKKyAgICAgICAgICAgICJtYWtlSFRUUENvbm5lY3Rpb24iLAorICAgICAgICAgICAgIigpTGFuZHJvaWQvbWVkaWEvTWVkaWEySFRUUENvbm5lY3Rpb247Iik7CisgICAgQ0hFQ0sobU1ha2VIVFRQQ29ubmVjdGlvbk1ldGhvZCAhPSBOVUxMKTsKK30KKworSk1lZGlhMkhUVFBTZXJ2aWNlOjp+Sk1lZGlhMkhUVFBTZXJ2aWNlKCkgeworICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKKyAgICBlbnYtPkRlbGV0ZUdsb2JhbFJlZihtTWVkaWEySFRUUFNlcnZpY2VPYmopOworfQorCitzcDxNZWRpYUhUVFBDb25uZWN0aW9uPiBKTWVkaWEySFRUUFNlcnZpY2U6Om1ha2VIVFRQQ29ubmVjdGlvbigpIHsKKyAgICBKTklFbnYqIGVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CisgICAgam9iamVjdCBtZWRpYTJIVFRQQ29ubmVjdGlvbk9iaiA9CisgICAgICAgIGVudi0+Q2FsbE9iamVjdE1ldGhvZChtTWVkaWEySFRUUFNlcnZpY2VPYmosIG1NYWtlSFRUUENvbm5lY3Rpb25NZXRob2QpOworCisgICAgcmV0dXJuIG5ldyBKTWVkaWEySFRUUENvbm5lY3Rpb24oZW52LCBtZWRpYTJIVFRQQ29ubmVjdGlvbk9iaik7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvSmF2YVZNSGVscGVyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9KYXZhVk1IZWxwZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwYWFhN2YKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvSmF2YVZNSGVscGVyLmNwcApAQCAtMCwwICsxLDQ4IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkphdmFWTUhlbHBlciIKKworI2luY2x1ZGUgIm1lZGlhcGxheWVyMi9KYXZhVk1IZWxwZXIuaCIKKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBzdGF0aWMKK3N0ZDo6YXRvbWljPEphdmFWTSAqPiBKYXZhVk1IZWxwZXI6OnNKYXZhVk0oTlVMTCk7CisKKy8vIHN0YXRpYworSk5JRW52ICpKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpIHsKKyAgICBKTklFbnYgKmVudjsKKyAgICBKYXZhVk0gKnZtID0gc0phdmFWTS5sb2FkKCk7CisgICAgQ0hFQ0sodm0gIT0gTlVMTCk7CisKKyAgICBpZiAodm0tPkdldEVudigodm9pZCAqKikmZW52LCBKTklfVkVSU0lPTl8xXzQpICE9IEpOSV9PSykgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gZW52OworfQorCisvLyBzdGF0aWMKK3ZvaWQgSmF2YVZNSGVscGVyOjpzZXRKYXZhVk0oSmF2YVZNICp2bSkgeworICAgIHNKYXZhVk0uc3RvcmUodm0pOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL01lZGlhUGxheWVyMkF1ZGlvT3V0cHV0LmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9NZWRpYVBsYXllcjJBdWRpb091dHB1dC5jcHAKaW5kZXggYThlMWQxZi4uOThhM2U3NSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL01lZGlhUGxheWVyMkF1ZGlvT3V0cHV0LmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQuY3BwCkBAIC0yMyw3ICsyMyw2IEBACiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9BdWRpb1BvbGljeUhlbHBlci5oPgotI2luY2x1ZGUgPG1lZGlhL0F1ZGlvVHJhY2suaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogCiBuYW1lc3BhY2UgewpAQCAtNDQsMzEgKzQzLDI4IEBACiAgICAgU3RyaW5nOCByZXN1bHQ7CiAKICAgICByZXN1bHQuYXBwZW5kKCIgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXRcbiIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgMjU1LCAiICBzdHJlYW0gdHlwZSglZCksIGxlZnQgLSByaWdodCB2b2x1bWUoJWYsICVmKVxuIiwKLSAgICAgICAgICAgIG1TdHJlYW1UeXBlLCBtTGVmdFZvbHVtZSwgbVJpZ2h0Vm9sdW1lKTsKKyAgICBzbnByaW50ZihidWZmZXIsIDI1NSwgIiAgdm9sdW1lKCVmKVxuIiwgbVZvbHVtZSk7CiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwogICAgIHNucHJpbnRmKGJ1ZmZlciwgMjU1LCAiICBtc2VjIHBlciBmcmFtZSglZiksIGxhdGVuY3kgKCVkKVxuIiwKLSAgICAgICAgICAgIG1Nc2Vjc1BlckZyYW1lLCAobVRyYWNrICE9IDApID8gbVRyYWNrLT5sYXRlbmN5KCkgOiAtMSk7CisgICAgICAgICAgICBtTXNlY3NQZXJGcmFtZSwgKG1KQXVkaW9UcmFjayAhPSBudWxscHRyKSA/IG1KQXVkaW9UcmFjay0+bGF0ZW5jeSgpIDogLTEpOwogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKICAgICBzbnByaW50ZihidWZmZXIsIDI1NSwgIiAgYXV4IGVmZmVjdCBpZCglZCksIHNlbmQgbGV2ZWwgKCVmKVxuIiwKICAgICAgICAgICAgIG1BdXhFZmZlY3RJZCwgbVNlbmRMZXZlbCk7CiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwogCiAgICAgOjp3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKLSAgICBpZiAobVRyYWNrICE9IDApIHsKLSAgICAgICAgbVRyYWNrLT5kdW1wKGZkLCBhcmdzKTsKKyAgICBpZiAobUpBdWRpb1RyYWNrICE9IG51bGxwdHIpIHsKKyAgICAgICAgbUpBdWRpb1RyYWNrLT5kdW1wKGZkLCBhcmdzKTsKICAgICB9CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi1NZWRpYVBsYXllcjJBdWRpb091dHB1dDo6TWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQoYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwgdWlkX3QgdWlkLCBpbnQgcGlkLAotICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QqIGF0dHIsIGNvbnN0IHNwPEF1ZGlvU3lzdGVtOjpBdWRpb0RldmljZUNhbGxiYWNrPiYgZGV2aWNlQ2FsbGJhY2spCi0gICAgOiBtQ2FsbGJhY2soTlVMTCksCi0gICAgICBtQ2FsbGJhY2tDb29raWUoTlVMTCksCi0gICAgICBtQ2FsbGJhY2tEYXRhKE5VTEwpLAotICAgICAgbVN0cmVhbVR5cGUoQVVESU9fU1RSRUFNX01VU0lDKSwKLSAgICAgIG1MZWZ0Vm9sdW1lKDEuMCksCi0gICAgICBtUmlnaHRWb2x1bWUoMS4wKSwKK01lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpNZWRpYVBsYXllcjJBdWRpb091dHB1dChpbnQzMl90IHNlc3Npb25JZCwgdWlkX3QgdWlkLCBpbnQgcGlkLAorICAgICAgICBjb25zdCBqb2JqZWN0IGF0dHJpYnV0ZXMpCisgICAgOiBtQ2FsbGJhY2sobnVsbHB0ciksCisgICAgICBtQ2FsbGJhY2tDb29raWUobnVsbHB0ciksCisgICAgICBtQ2FsbGJhY2tEYXRhKG51bGxwdHIpLAorICAgICAgbVZvbHVtZSgxLjApLAogICAgICAgbVBsYXliYWNrUmF0ZShBVURJT19QTEFZQkFDS19SQVRFX0RFRkFVTFQpLAogICAgICAgbVNhbXBsZVJhdGVIeigwKSwKICAgICAgIG1Nc2Vjc1BlckZyYW1lKDApLApAQCAtNzgsMjggKzc0LDIyIEBACiAgICAgICBtUGlkKHBpZCksCiAgICAgICBtU2VuZExldmVsKDAuMCksCiAgICAgICBtQXV4RWZmZWN0SWQoMCksCi0gICAgICBtRmxhZ3MoQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSksCi0gICAgICBtU2VsZWN0ZWREZXZpY2VJZChBVURJT19QT1JUX0hBTkRMRV9OT05FKSwKLSAgICAgIG1Sb3V0ZWREZXZpY2VJZChBVURJT19QT1JUX0hBTkRMRV9OT05FKSwKLSAgICAgIG1EZXZpY2VDYWxsYmFja0VuYWJsZWQoZmFsc2UpLAotICAgICAgbURldmljZUNhbGxiYWNrKGRldmljZUNhbGxiYWNrKSB7CisgICAgICBtRmxhZ3MoQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSkgewogICAgIEFMT0dWKCJNZWRpYVBsYXllcjJBdWRpb091dHB1dCglZCkiLCBzZXNzaW9uSWQpOwotICAgIGlmIChhdHRyICE9IE5VTEwpIHsKLSAgICAgICAgbUF0dHJpYnV0ZXMgPSAoYXVkaW9fYXR0cmlidXRlc190ICopIGNhbGxvYygxLCBzaXplb2YoYXVkaW9fYXR0cmlidXRlc190KSk7Ci0gICAgICAgIGlmIChtQXR0cmlidXRlcyAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBtZW1jcHkobUF0dHJpYnV0ZXMsIGF0dHIsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKLSAgICAgICAgICAgIG1TdHJlYW1UeXBlID0gYXVkaW9fYXR0cmlidXRlc190b19zdHJlYW1fdHlwZShhdHRyKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1BdHRyaWJ1dGVzID0gTlVMTDsKKworICAgIGlmIChhdHRyaWJ1dGVzICE9IG51bGxwdHIpIHsKKyAgICAgICAgbUF0dHJpYnV0ZXMgPSBuZXcgSk9iamVjdEhvbGRlcihhdHRyaWJ1dGVzKTsKICAgICB9CiAKICAgICBzZXRNaW5CdWZmZXJDb3VudCgpOworICAgIG1Sb3V0aW5nRGVsZWdhdGVzLmNsZWFyKCk7CiB9CiAKIE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0Ojp+TWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQoKSB7CisgICAgZm9yIChhdXRvIHJvdXRpbmdEZWxlZ2F0ZSA6IG1Sb3V0aW5nRGVsZWdhdGVzKSB7CisgICAgICAgIEpBdWRpb1RyYWNrOjpyZW1vdmVHbG9iYWxSZWYocm91dGluZ0RlbGVnYXRlLnNlY29uZCk7CisgICAgfQogICAgIGNsb3NlKCk7Ci0gICAgZnJlZShtQXR0cmlidXRlcyk7CiAgICAgZGVsZXRlIG1DYWxsYmFja0RhdGE7CiB9CiAKQEAgLTEyNiwzMSArMTE2LDMxIEBACiAKIHNzaXplX3QgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OmJ1ZmZlclNpemUoKSBjb25zdCB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIGlmIChtVHJhY2sgPT0gMCkgeworICAgIGlmIChtSkF1ZGlvVHJhY2sgPT0gbnVsbHB0cikgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9Ci0gICAgcmV0dXJuIG1UcmFjay0+ZnJhbWVDb3VudCgpICogbUZyYW1lU2l6ZTsKKyAgICByZXR1cm4gbUpBdWRpb1RyYWNrLT5mcmFtZUNvdW50KCkgKiBtRnJhbWVTaXplOwogfQogCiBzc2l6ZV90IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpmcmFtZUNvdW50KCkgY29uc3QgewogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBpZiAobVRyYWNrID09IDApIHsKKyAgICBpZiAobUpBdWRpb1RyYWNrID09IG51bGxwdHIpIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQotICAgIHJldHVybiBtVHJhY2stPmZyYW1lQ291bnQoKTsKKyAgICByZXR1cm4gbUpBdWRpb1RyYWNrLT5mcmFtZUNvdW50KCk7CiB9CiAKIHNzaXplX3QgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OmNoYW5uZWxDb3VudCgpIGNvbnN0IHsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgaWYgKG1UcmFjayA9PSAwKSB7CisgICAgaWYgKG1KQXVkaW9UcmFjayA9PSBudWxscHRyKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KLSAgICByZXR1cm4gbVRyYWNrLT5jaGFubmVsQ291bnQoKTsKKyAgICByZXR1cm4gbUpBdWRpb1RyYWNrLT5jaGFubmVsQ291bnQoKTsKIH0KIAogc3NpemVfdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6ZnJhbWVTaXplKCkgY29uc3QgewogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBpZiAobVRyYWNrID09IDApIHsKKyAgICBpZiAobUpBdWRpb1RyYWNrID09IG51bGxwdHIpIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQogICAgIHJldHVybiBtRnJhbWVTaXplOwpAQCAtMTU4LDEwICsxNDgsMTAgQEAKIAogdWludDMyX3QgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OmxhdGVuY3kgKCkgY29uc3QgewogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBpZiAobVRyYWNrID09IDApIHsKKyAgICBpZiAobUpBdWRpb1RyYWNrID09IG51bGxwdHIpIHsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQotICAgIHJldHVybiBtVHJhY2stPmxhdGVuY3koKTsKKyAgICByZXR1cm4gbUpBdWRpb1RyYWNrLT5sYXRlbmN5KCk7CiB9CiAKIGZsb2F0IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0Ojptc2Vjc1BlckZyYW1lKCkgY29uc3QgewpAQCAtMTcxLDE4ICsxNjEsMTggQEAKIAogc3RhdHVzX3QgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OmdldFBvc2l0aW9uKHVpbnQzMl90ICpwb3NpdGlvbikgY29uc3QgewogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBpZiAobVRyYWNrID09IDApIHsKKyAgICBpZiAobUpBdWRpb1RyYWNrID09IG51bGxwdHIpIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQotICAgIHJldHVybiBtVHJhY2stPmdldFBvc2l0aW9uKHBvc2l0aW9uKTsKKyAgICByZXR1cm4gbUpBdWRpb1RyYWNrLT5nZXRQb3NpdGlvbihwb3NpdGlvbik7CiB9CiAKIHN0YXR1c190IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpnZXRUaW1lc3RhbXAoQXVkaW9UaW1lc3RhbXAgJnRzKSBjb25zdCB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIGlmIChtVHJhY2sgPT0gMCkgeworICAgIGlmIChtSkF1ZGlvVHJhY2sgPT0gbnVsbHB0cikgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9Ci0gICAgcmV0dXJuIG1UcmFjay0+Z2V0VGltZXN0YW1wKHRzKTsKKyAgICByZXR1cm4gbUpBdWRpb1RyYWNrLT5nZXRUaW1lc3RhbXAodHMpOwogfQogCiAvLyBUT0RPOiBSZW1vdmUgdW5uZWNlc3NhcnkgY2FsbHMgdG8gZ2V0UGxheWVkT3V0RHVyYXRpb25VcygpCkBAIC0xOTUsNyArMTg1LDcgQEAKIC8vIENhbGN1bGF0ZSBkdXJhdGlvbiBvZiBwbGF5ZWQgc2FtcGxlcyBpZiBwbGF5ZWQgYXQgbm9ybWFsIHJhdGUgKGkuZS4sIDEuMCkuCiBpbnQ2NF90IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpnZXRQbGF5ZWRPdXREdXJhdGlvblVzKGludDY0X3Qgbm93VXMpIGNvbnN0IHsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgaWYgKG1UcmFjayA9PSAwIHx8IG1TYW1wbGVSYXRlSHogPT0gMCkgeworICAgIGlmIChtSkF1ZGlvVHJhY2sgPT0gbnVsbHB0ciB8fCBtU2FtcGxlUmF0ZUh6ID09IDApIHsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogCkBAIC0yMDMsMjIgKzE5MywxOCBAQAogICAgIGludDY0X3QgbnVtRnJhbWVzUGxheWVkQXRVczsKICAgICBBdWRpb1RpbWVzdGFtcCB0czsKIAotICAgIHN0YXR1c190IHJlcyA9IG1UcmFjay0+Z2V0VGltZXN0YW1wKHRzKTsKKyAgICBzdGF0dXNfdCByZXMgPSBtSkF1ZGlvVHJhY2stPmdldFRpbWVzdGFtcCh0cyk7CisKICAgICBpZiAocmVzID09IE9LKSB7ICAgICAgICAgICAgICAgICAvLyBjYXNlIDE6IG1peGluZyBhdWRpbyB0cmFja3MgYW5kIG9mZmxvYWRlZCB0cmFja3MuCiAgICAgICAgIG51bUZyYW1lc1BsYXllZCA9IHRzLm1Qb3NpdGlvbjsKICAgICAgICAgbnVtRnJhbWVzUGxheWVkQXRVcyA9IHRzLm1UaW1lLnR2X3NlYyAqIDEwMDAwMDBMTCArIHRzLm1UaW1lLnR2X25zZWMgLyAxMDAwOwogICAgICAgICAvL0FMT0dEKCJnZXRUaW1lc3RhbXA6IE9LICVkICVsbGQiLCBudW1GcmFtZXNQbGF5ZWQsIChsb25nIGxvbmcpbnVtRnJhbWVzUGxheWVkQXRVcyk7Ci0gICAgfSBlbHNlIGlmIChyZXMgPT0gV09VTERfQkxPQ0spIHsgLy8gY2FzZSAyOiB0cmFuc2l0b3J5IHN0YXRlIG9uIHN0YXJ0IG9mIGEgbmV3IHRyYWNrCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FzZSAyOiB0cmFuc2l0b3J5IHN0YXRlIG9uIHN0YXJ0IG9mIGEgbmV3IHRyYWNrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FzZSAzOiB0cmFuc2l0b3J5IGF0IG5ldyB0cmFjayBvciBhdWRpbyBmYXN0IHRyYWNrcy4KICAgICAgICAgbnVtRnJhbWVzUGxheWVkID0gMDsKICAgICAgICAgbnVtRnJhbWVzUGxheWVkQXRVcyA9IG5vd1VzOwogICAgICAgICAvL0FMT0dEKCJnZXRUaW1lc3RhbXA6IFdPVUxEX0JMT0NLICVkICVsbGQiLAogICAgICAgICAvLyAgICAgICAgbnVtRnJhbWVzUGxheWVkLCAobG9uZyBsb25nKW51bUZyYW1lc1BsYXllZEF0VXMpOwotICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhc2UgMzogdHJhbnNpdG9yeSBhdCBuZXcgdHJhY2sgb3IgYXVkaW8gZmFzdCB0cmFja3MuCi0gICAgICAgIHJlcyA9IG1UcmFjay0+Z2V0UG9zaXRpb24oJm51bUZyYW1lc1BsYXllZCk7Ci0gICAgICAgIENIRUNLX0VRKHJlcywgKHN0YXR1c190KU9LKTsKLSAgICAgICAgbnVtRnJhbWVzUGxheWVkQXRVcyA9IG5vd1VzOwotICAgICAgICBudW1GcmFtZXNQbGF5ZWRBdFVzICs9IDEwMDBMTCAqIG1UcmFjay0+bGF0ZW5jeSgpIC8gMjsgLyogWFhYICovCi0gICAgICAgIC8vQUxPR0QoImdldFBvc2l0aW9uOiAldSAlbGxkIiwgbnVtRnJhbWVzUGxheWVkLCAobG9uZyBsb25nKW51bUZyYW1lc1BsYXllZEF0VXMpOwogICAgIH0KIAogICAgIC8vIENIRUNLX0VRKG51bUZyYW1lc1BsYXllZCAmICgxIDw8IDMxKSwgMCk7ICAvLyBjYW4ndCBiZSBuZWdhdGl2ZSB1bnRpbCAxMi40IGhycywgdGVzdApAQCAtMjQ0LDEwOCArMjMwLDU1IEBACiAKIHN0YXR1c190IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpnZXRGcmFtZXNXcml0dGVuKHVpbnQzMl90ICpmcmFtZXN3cml0dGVuKSBjb25zdCB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIGlmIChtVHJhY2sgPT0gMCkgeworICAgIGlmIChtSkF1ZGlvVHJhY2sgPT0gbnVsbHB0cikgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9CiAgICAgRXh0ZW5kZWRUaW1lc3RhbXAgZXRzOwotICAgIHN0YXR1c190IHN0YXR1cyA9IG1UcmFjay0+Z2V0VGltZXN0YW1wKCZldHMpOworICAgIHN0YXR1c190IHN0YXR1cyA9IG1KQXVkaW9UcmFjay0+Z2V0VGltZXN0YW1wKCZldHMpOwogICAgIGlmIChzdGF0dXMgPT0gT0sgfHwgc3RhdHVzID09IFdPVUxEX0JMT0NLKSB7CiAgICAgICAgICpmcmFtZXN3cml0dGVuID0gKHVpbnQzMl90KWV0cy5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0NMSUVOVF07CiAgICAgfQogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKLXN0YXR1c190IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMpIHsKK3ZvaWQgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OnNldEF1ZGlvQXR0cmlidXRlcyhjb25zdCBqb2JqZWN0IGF0dHJpYnV0ZXMpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgaWYgKG1UcmFjayA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICByZXR1cm4gbVRyYWNrLT5zZXRQYXJhbWV0ZXJzKGtleVZhbHVlUGFpcnMpOworICAgIG1BdHRyaWJ1dGVzID0gKGF0dHJpYnV0ZXMgPT0gbnVsbHB0cikgPyBudWxscHRyIDogbmV3IEpPYmplY3RIb2xkZXIoYXR0cmlidXRlcyk7CiB9CiAKLVN0cmluZzggIE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMpIHsKK2F1ZGlvX3N0cmVhbV90eXBlX3QgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OmdldEF1ZGlvU3RyZWFtVHlwZSgpIGNvbnN0IHsKKyAgICBBTE9HVigiZ2V0QXVkaW9TdHJlYW1UeXBlIik7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIGlmIChtVHJhY2sgPT0gMCkgewotICAgICAgICByZXR1cm4gU3RyaW5nODo6ZW1wdHkoKTsKKyAgICBpZiAobUpBdWRpb1RyYWNrID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9ERUZBVUxUOwogICAgIH0KLSAgICByZXR1cm4gbVRyYWNrLT5nZXRQYXJhbWV0ZXJzKGtleXMpOwotfQotCi12b2lkIE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpzZXRBdWRpb0F0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICogYXR0cmlidXRlcykgewotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBpZiAoYXR0cmlidXRlcyA9PSBOVUxMKSB7Ci0gICAgICAgIGZyZWUobUF0dHJpYnV0ZXMpOwotICAgICAgICBtQXR0cmlidXRlcyA9IE5VTEw7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKG1BdHRyaWJ1dGVzID09IE5VTEwpIHsKLSAgICAgICAgICAgIG1BdHRyaWJ1dGVzID0gKGF1ZGlvX2F0dHJpYnV0ZXNfdCAqKSBjYWxsb2MoMSwgc2l6ZW9mKGF1ZGlvX2F0dHJpYnV0ZXNfdCkpOwotICAgICAgICB9Ci0gICAgICAgIG1lbWNweShtQXR0cmlidXRlcywgYXR0cmlidXRlcywgc2l6ZW9mKGF1ZGlvX2F0dHJpYnV0ZXNfdCkpOwotICAgICAgICBtU3RyZWFtVHlwZSA9IGF1ZGlvX2F0dHJpYnV0ZXNfdG9fc3RyZWFtX3R5cGUoYXR0cmlidXRlcyk7Ci0gICAgfQotfQotCi12b2lkIE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpzZXRBdWRpb1N0cmVhbVR5cGUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIC8vIGRvIG5vdCBhbGxvdyBkaXJlY3Qgc3RyZWFtIHR5cGUgbW9kaWZpY2F0aW9uIGlmIGF0dHJpYnV0ZXMgaGF2ZSBiZWVuIHNldAotICAgIGlmIChtQXR0cmlidXRlcyA9PSBOVUxMKSB7Ci0gICAgICAgIG1TdHJlYW1UeXBlID0gc3RyZWFtVHlwZTsKLSAgICB9CisgICAgcmV0dXJuIG1KQXVkaW9UcmFjay0+Z2V0QXVkaW9TdHJlYW1UeXBlKCk7CiB9CiAKIHZvaWQgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OmNsb3NlX2woKSB7Ci0gICAgbVRyYWNrLmNsZWFyKCk7CisgICAgbUpBdWRpb1RyYWNrLmNsZWFyKCk7CiB9CiAKIHN0YXR1c190IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpvcGVuKAogICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLCBpbnQgY2hhbm5lbENvdW50LCBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKLSAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LCBpbnQgYnVmZmVyQ291bnQsCisgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgQXVkaW9DYWxsYmFjayBjYiwgdm9pZCAqY29va2llLAogICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvLAotICAgICAgICBib29sIGRvTm90UmVjb25uZWN0LAogICAgICAgICB1aW50MzJfdCBzdWdnZXN0ZWRGcmFtZUNvdW50KSB7Ci0gICAgQUxPR1YoIm9wZW4oJXUsICVkLCAweCV4LCAweCV4LCAlZCwgJWQgMHgleCkiLCBzYW1wbGVSYXRlLCBjaGFubmVsQ291bnQsIGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgIGZvcm1hdCwgYnVmZmVyQ291bnQsIG1TZXNzaW9uSWQsIGZsYWdzKTsKKyAgICBBTE9HVigib3BlbigldSwgJWQsIDB4JXgsIDB4JXgsICVkIDB4JXgpIiwgc2FtcGxlUmF0ZSwgY2hhbm5lbENvdW50LCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICBmb3JtYXQsIG1TZXNzaW9uSWQsIGZsYWdzKTsKIAogICAgIC8vIG9mZmxvYWRpbmcgaXMgb25seSBzdXBwb3J0ZWQgaW4gY2FsbGJhY2sgbW9kZSBmb3Igbm93LgogICAgIC8vIG9mZmxvYWRJbmZvIG11c3QgYmUgcHJlc2VudCBpZiBvZmZsb2FkIGZsYWcgaXMgc2V0CiAgICAgaWYgKCgoZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEKSAhPSAwKSAmJgotICAgICAgICAgICAgKChjYiA9PSBOVUxMKSB8fCAob2ZmbG9hZEluZm8gPT0gTlVMTCkpKSB7CisgICAgICAgICAgICAoKGNiID09IG51bGxwdHIpIHx8IChvZmZsb2FkSW5mbyA9PSBudWxscHRyKSkpIHsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKICAgICAvLyBjb21wdXRlIGZyYW1lIGNvdW50IGZvciB0aGUgQXVkaW9UcmFjayBpbnRlcm5hbCBidWZmZXIKLSAgICBzaXplX3QgZnJhbWVDb3VudDsKLSAgICBpZiAoKGZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCkgIT0gMCkgewotICAgICAgICBmcmFtZUNvdW50ID0gMDsgLy8gQXVkaW9UcmFjayB3aWxsIGdldCBmcmFtZSBjb3VudCBmcm9tIEF1ZGlvRmxpbmdlcgotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIHRyeSB0byBlc3RpbWF0ZSB0aGUgYnVmZmVyIHByb2Nlc3NpbmcgZmV0Y2ggc2l6ZSBmcm9tIEF1ZGlvRmxpbmdlci4KLSAgICAgICAgLy8gZnJhbWVzUGVyQnVmZmVyIGlzIGFwcHJveGltYXRlIGFuZCBnZW5lcmFsbHkgY29ycmVjdCwgZXhjZXB0IHdoZW4gaXQncyBub3QgOi0pLgotICAgICAgICB1aW50MzJfdCBhZlNhbXBsZVJhdGU7Ci0gICAgICAgIHNpemVfdCBhZkZyYW1lQ291bnQ7Ci0gICAgICAgIGlmIChBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0RnJhbWVDb3VudCgmYWZGcmFtZUNvdW50LCBtU3RyZWFtVHlwZSkgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHJldHVybiBOT19JTklUOwotICAgICAgICB9Ci0gICAgICAgIGlmIChBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0U2FtcGxpbmdSYXRlKCZhZlNhbXBsZVJhdGUsIG1TdHJlYW1UeXBlKSAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgICAgIH0KLSAgICAgICAgY29uc3Qgc2l6ZV90IGZyYW1lc1BlckJ1ZmZlciA9Ci0gICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylzYW1wbGVSYXRlICogYWZGcmFtZUNvdW50IC8gYWZTYW1wbGVSYXRlOwotCi0gICAgICAgIGlmIChidWZmZXJDb3VudCA9PSAwKSB7Ci0gICAgICAgICAgICAvLyB1c2Ugc3VnZ2VzdGVkRnJhbWVDb3VudAotICAgICAgICAgICAgYnVmZmVyQ291bnQgPSAoc3VnZ2VzdGVkRnJhbWVDb3VudCArIGZyYW1lc1BlckJ1ZmZlciAtIDEpIC8gZnJhbWVzUGVyQnVmZmVyOwotICAgICAgICB9Ci0gICAgICAgIC8vIENoZWNrIGFyZ3VtZW50IGJ1ZmZlckNvdW50IGFnYWluc3QgdGhlIG1pbmludW0gYnVmZmVyIGNvdW50Ci0gICAgICAgIGlmIChidWZmZXJDb3VudCAhPSAwICYmIGJ1ZmZlckNvdW50IDwgbU1pbkJ1ZmZlckNvdW50KSB7Ci0gICAgICAgICAgICBBTE9HVigiYnVmZmVyQ291bnQgKCVkKSBpbmNyZWFzZWQgdG8gJWQiLCBidWZmZXJDb3VudCwgbU1pbkJ1ZmZlckNvdW50KTsKLSAgICAgICAgICAgIGJ1ZmZlckNvdW50ID0gbU1pbkJ1ZmZlckNvdW50OwotICAgICAgICB9Ci0gICAgICAgIC8vIGlmIGZyYW1lQ291bnQgaXMgMCwgdGhlbiBBdWRpb1RyYWNrIHdpbGwgZ2V0IGZyYW1lIGNvdW50IGZyb20gQXVkaW9GbGluZ2VyCi0gICAgICAgIC8vIHdoaWNoIHdpbGwgYmUgdGhlIG1pbmltdW0gc2l6ZSBwZXJtaXR0ZWQuCi0gICAgICAgIGZyYW1lQ291bnQgPSBidWZmZXJDb3VudCAqIGZyYW1lc1BlckJ1ZmZlcjsKLSAgICB9CisgICAgY29uc3Qgc2l6ZV90IGZyYW1lQ291bnQgPQorICAgICAgICAgICAoKGZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCkgIT0gMCkgPyAwIDogc3VnZ2VzdGVkRnJhbWVDb3VudDsKIAogICAgIGlmIChjaGFubmVsTWFzayA9PSBDSEFOTkVMX01BU0tfVVNFX0NIQU5ORUxfT1JERVIpIHsKICAgICAgICAgY2hhbm5lbE1hc2sgPSBhdWRpb19jaGFubmVsX291dF9tYXNrX2Zyb21fY291bnQoY2hhbm5lbENvdW50KTsKQEAgLTM1OSwzMiArMjkyLDIzIEBACiAgICAgbUNhbGxiYWNrID0gY2I7CiAgICAgbUNhbGxiYWNrQ29va2llID0gY29va2llOwogCi0gICAgc3A8QXVkaW9UcmFjaz4gdDsKLSAgICBDYWxsYmFja0RhdGEgKm5ld2NiZCA9IE5VTEw7CisgICAgc3A8SkF1ZGlvVHJhY2s+IGpUOworICAgIENhbGxiYWNrRGF0YSAqbmV3Y2JkID0gbnVsbHB0cjsKIAotICAgIEFMT0dWKCJjcmVhdGluZyBuZXcgQXVkaW9UcmFjayIpOworICAgIEFMT0dWKCJjcmVhdGluZyBuZXcgSkF1ZGlvVHJhY2siKTsKIAotICAgIGlmIChtQ2FsbGJhY2sgIT0gTlVMTCkgeworICAgIGlmIChtQ2FsbGJhY2sgIT0gbnVsbHB0cikgewogICAgICAgICBuZXdjYmQgPSBuZXcgQ2FsbGJhY2tEYXRhKHRoaXMpOwotICAgICAgICB0ID0gbmV3IEF1ZGlvVHJhY2soCi0gICAgICAgICAgICAgICAgbVN0cmVhbVR5cGUsCi0gICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICBmb3JtYXQsCi0gICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgZnJhbWVDb3VudCwKLSAgICAgICAgICAgICAgICBmbGFncywKLSAgICAgICAgICAgICAgICBDYWxsYmFja1dyYXBwZXIsCi0gICAgICAgICAgICAgICAgbmV3Y2JkLAotICAgICAgICAgICAgICAgIDAsICAvLyBub3RpZmljYXRpb24gZnJhbWVzCi0gICAgICAgICAgICAgICAgbVNlc3Npb25JZCwKLSAgICAgICAgICAgICAgICBBdWRpb1RyYWNrOjpUUkFOU0ZFUl9DQUxMQkFDSywKLSAgICAgICAgICAgICAgICBvZmZsb2FkSW5mbywKLSAgICAgICAgICAgICAgICBtVWlkLAotICAgICAgICAgICAgICAgIG1QaWQsCi0gICAgICAgICAgICAgICAgbUF0dHJpYnV0ZXMsCi0gICAgICAgICAgICAgICAgZG9Ob3RSZWNvbm5lY3QsCi0gICAgICAgICAgICAgICAgMS4wZiwgIC8vIGRlZmF1bHQgdmFsdWUgZm9yIG1heFJlcXVpcmVkU3BlZWQKLSAgICAgICAgICAgICAgICBtU2VsZWN0ZWREZXZpY2VJZCk7CisgICAgICAgIGpUID0gbmV3IEpBdWRpb1RyYWNrKAorICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICBmb3JtYXQsCisgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICBDYWxsYmFja1dyYXBwZXIsCisgICAgICAgICAgICAgICAgIG5ld2NiZCwKKyAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCwKKyAgICAgICAgICAgICAgICAgbVNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgbUF0dHJpYnV0ZXMgIT0gbnVsbHB0ciA/IG1BdHRyaWJ1dGVzLT5nZXRKT2JqZWN0KCkgOiBudWxscHRyLAorICAgICAgICAgICAgICAgICAxLjBmKTsgIC8vIGRlZmF1bHQgdmFsdWUgZm9yIG1heFJlcXVpcmVkU3BlZWQKICAgICB9IGVsc2UgewogICAgICAgICAvLyBUT0RPOiBEdWUgdG8gYnVmZmVyIG1lbW9yeSBjb25jZXJucywgd2UgdXNlIGEgbWF4IHRhcmdldCBwbGF5YmFjayBzcGVlZAogICAgICAgICAvLyBiYXNlZCBvbiBtUGxheWJhY2tSYXRlIGF0IHRoZSB0aW1lIG9mIG9wZW4gKGluc3RlYWQgb2Yga01heFJlcXVpcmVkU3BlZWQpLApAQCAtMzk0LDczICszMTgsNjIgQEAKICAgICAgICAgQUxPR1dfSUYodGFyZ2V0U3BlZWQgIT0gbVBsYXliYWNrUmF0ZS5tU3BlZWQsCiAgICAgICAgICAgICAgICAgInRyYWNrIHRhcmdldCBzcGVlZDolZiBjbGFtcGVkIGZyb20gcGxheWJhY2sgc3BlZWQ6JWYiLAogICAgICAgICAgICAgICAgIHRhcmdldFNwZWVkLCBtUGxheWJhY2tSYXRlLm1TcGVlZCk7Ci0gICAgICAgIHQgPSBuZXcgQXVkaW9UcmFjaygKLSAgICAgICAgICAgICAgICBtU3RyZWFtVHlwZSwKLSAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgIGZvcm1hdCwKLSAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICBmcmFtZUNvdW50LAotICAgICAgICAgICAgICAgIGZsYWdzLAotICAgICAgICAgICAgICAgIE5VTEwsIC8vIGNhbGxiYWNrCi0gICAgICAgICAgICAgICAgTlVMTCwgLy8gdXNlciBkYXRhCi0gICAgICAgICAgICAgICAgMCwgLy8gbm90aWZpY2F0aW9uIGZyYW1lcwotICAgICAgICAgICAgICAgIG1TZXNzaW9uSWQsCi0gICAgICAgICAgICAgICAgQXVkaW9UcmFjazo6VFJBTlNGRVJfREVGQVVMVCwKLSAgICAgICAgICAgICAgICBOVUxMLCAvLyBvZmZsb2FkIGluZm8KLSAgICAgICAgICAgICAgICBtVWlkLAotICAgICAgICAgICAgICAgIG1QaWQsCi0gICAgICAgICAgICAgICAgbUF0dHJpYnV0ZXMsCi0gICAgICAgICAgICAgICAgZG9Ob3RSZWNvbm5lY3QsCi0gICAgICAgICAgICAgICAgdGFyZ2V0U3BlZWQsCi0gICAgICAgICAgICAgICAgbVNlbGVjdGVkRGV2aWNlSWQpOworICAgICAgICBqVCA9IG5ldyBKQXVkaW9UcmFjaygKKyAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgZm9ybWF0LAorICAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCwKKyAgICAgICAgICAgICAgICAgbVNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgbUF0dHJpYnV0ZXMgIT0gbnVsbHB0ciA/IG1BdHRyaWJ1dGVzLT5nZXRKT2JqZWN0KCkgOiBudWxscHRyLAorICAgICAgICAgICAgICAgICB0YXJnZXRTcGVlZCk7CiAgICAgfQogCi0gICAgaWYgKCh0ID09IDApIHx8ICh0LT5pbml0Q2hlY2soKSAhPSBOT19FUlJPUikpIHsKKyAgICBpZiAoalQgPT0gMCkgewogICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIGNyZWF0ZSBhdWRpbyB0cmFjayIpOwogICAgICAgICBkZWxldGUgbmV3Y2JkOwogICAgICAgICAvLyB0IGdvZXMgb3V0IG9mIHNjb3BlLCBzbyByZWZlcmVuY2UgY291bnQgZHJvcHMgdG8gemVybwogICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9IGVsc2UgewotICAgICAgICAvLyBzdWNjZXNzZnVsIEF1ZGlvVHJhY2sgaW5pdGlhbGl6YXRpb24gaW1wbGllcyBhIGxlZ2FjeSBzdHJlYW0gdHlwZSB3YXMgZ2VuZXJhdGVkCi0gICAgICAgIC8vIGZyb20gdGhlIGF1ZGlvIGF0dHJpYnV0ZXMKLSAgICAgICAgbVN0cmVhbVR5cGUgPSB0LT5zdHJlYW1UeXBlKCk7CiAgICAgfQogCi0gICAgQ0hFQ0soKHQgIT0gTlVMTCkgJiYgKChtQ2FsbGJhY2sgPT0gTlVMTCkgfHwgKG5ld2NiZCAhPSBOVUxMKSkpOworICAgIENIRUNLKChqVCAhPSBudWxscHRyKSAmJiAoKG1DYWxsYmFjayA9PSBudWxscHRyKSB8fCAobmV3Y2JkICE9IG51bGxwdHIpKSk7CiAKICAgICBtQ2FsbGJhY2tEYXRhID0gbmV3Y2JkOwogICAgIEFMT0dWKCJzZXRWb2x1bWUiKTsKLSAgICB0LT5zZXRWb2x1bWUobUxlZnRWb2x1bWUsIG1SaWdodFZvbHVtZSk7CisgICAgalQtPnNldFZvbHVtZShtVm9sdW1lKTsKIAogICAgIG1TYW1wbGVSYXRlSHogPSBzYW1wbGVSYXRlOwogICAgIG1GbGFncyA9IGZsYWdzOwogICAgIG1Nc2Vjc1BlckZyYW1lID0gMUUzZiAvIChtUGxheWJhY2tSYXRlLm1TcGVlZCAqIHNhbXBsZVJhdGUpOwotICAgIG1GcmFtZVNpemUgPSB0LT5mcmFtZVNpemUoKTsKLSAgICBtVHJhY2sgPSB0OworICAgIG1GcmFtZVNpemUgPSBqVC0+ZnJhbWVTaXplKCk7CisgICAgbUpBdWRpb1RyYWNrID0galQ7CiAKICAgICByZXR1cm4gdXBkYXRlVHJhY2tfbCgpOwogfQogCiBzdGF0dXNfdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6dXBkYXRlVHJhY2tfbCgpIHsKLSAgICBpZiAobVRyYWNrID09IE5VTEwpIHsKKyAgICBpZiAobUpBdWRpb1RyYWNrID09IG51bGxwdHIpIHsKICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgIH0KIAogICAgIHN0YXR1c190IHJlcyA9IE5PX0VSUk9SOwogICAgIC8vIE5vdGUgc29tZSBvdXRwdXQgZGV2aWNlcyBtYXkgZ2l2ZSB1cyBhIGRpcmVjdCB0cmFjayBldmVuIHRob3VnaCB3ZSBkb24ndCBzcGVjaWZ5IGl0LgogICAgIC8vIEV4YW1wbGU6IExpbmUgYXBwbGljYXRpb24gYi8xNzQ1OTk4Mi4KLSAgICBpZiAoKG1UcmFjay0+Z2V0RmxhZ3MoKQorICAgIGlmICgobUpBdWRpb1RyYWNrLT5nZXRGbGFncygpCiAgICAgICAgICAgICAmIChBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEIHwgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKSkgPT0gMCkgewotICAgICAgICByZXMgPSBtVHJhY2stPnNldFBsYXliYWNrUmF0ZShtUGxheWJhY2tSYXRlKTsKKyAgICAgICAgcmVzID0gbUpBdWRpb1RyYWNrLT5zZXRQbGF5YmFja1JhdGUobVBsYXliYWNrUmF0ZSk7CiAgICAgICAgIGlmIChyZXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIG1UcmFjay0+c2V0QXV4RWZmZWN0U2VuZExldmVsKG1TZW5kTGV2ZWwpOwotICAgICAgICAgICAgcmVzID0gbVRyYWNrLT5hdHRhY2hBdXhFZmZlY3QobUF1eEVmZmVjdElkKTsKKyAgICAgICAgICAgIG1KQXVkaW9UcmFjay0+c2V0QXV4RWZmZWN0U2VuZExldmVsKG1TZW5kTGV2ZWwpOworICAgICAgICAgICAgcmVzID0gbUpBdWRpb1RyYWNrLT5hdHRhY2hBdXhFZmZlY3QobUF1eEVmZmVjdElkKTsKICAgICAgICAgfQogICAgIH0KLSAgICBtVHJhY2stPnNldE91dHB1dERldmljZShtU2VsZWN0ZWREZXZpY2VJZCk7Ci0gICAgaWYgKG1EZXZpY2VDYWxsYmFja0VuYWJsZWQpIHsKLSAgICAgICAgbVRyYWNrLT5hZGRBdWRpb0RldmljZUNhbGxiYWNrKG1EZXZpY2VDYWxsYmFjay5wcm9tb3RlKCkpOworICAgIGlmIChtUHJlZmVycmVkRGV2aWNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgbUpBdWRpb1RyYWNrLT5zZXRQcmVmZXJyZWREZXZpY2UobVByZWZlcnJlZERldmljZS0+Z2V0Sk9iamVjdCgpKTsKICAgICB9CisKKyAgICBtSkF1ZGlvVHJhY2stPnJlZ2lzdGVyUm91dGluZ0RlbGVnYXRlcyhtUm91dGluZ0RlbGVnYXRlcyk7CisKICAgICBBTE9HVigidXBkYXRlVHJhY2tfbCgpIERPTkUgc3RhdHVzICVkIiwgcmVzKTsKICAgICByZXR1cm4gcmVzOwogfQpAQCAtNDY4LDEzICszODEsMTMgQEAKIHN0YXR1c190IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpzdGFydCgpIHsKICAgICBBTE9HVigic3RhcnQiKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgaWYgKG1DYWxsYmFja0RhdGEgIT0gTlVMTCkgeworICAgIGlmIChtQ2FsbGJhY2tEYXRhICE9IG51bGxwdHIpIHsKICAgICAgICAgbUNhbGxiYWNrRGF0YS0+ZW5kVHJhY2tTd2l0Y2goKTsKICAgICB9Ci0gICAgaWYgKG1UcmFjayAhPSAwKSB7Ci0gICAgICAgIG1UcmFjay0+c2V0Vm9sdW1lKG1MZWZ0Vm9sdW1lLCBtUmlnaHRWb2x1bWUpOwotICAgICAgICBtVHJhY2stPnNldEF1eEVmZmVjdFNlbmRMZXZlbChtU2VuZExldmVsKTsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbVRyYWNrLT5zdGFydCgpOworICAgIGlmIChtSkF1ZGlvVHJhY2sgIT0gbnVsbHB0cikgeworICAgICAgICBtSkF1ZGlvVHJhY2stPnNldFZvbHVtZShtVm9sdW1lKTsKKyAgICAgICAgbUpBdWRpb1RyYWNrLT5zZXRBdXhFZmZlY3RTZW5kTGV2ZWwobVNlbmRMZXZlbCk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1KQXVkaW9UcmFjay0+c3RhcnQoKTsKICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9CiAgICAgcmV0dXJuIE5PX0lOSVQ7CkBAIC00ODIsMTEgKzM5NSwxMSBAQAogCiBzc2l6ZV90IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0Ojp3cml0ZShjb25zdCB2b2lkKiBidWZmZXIsIHNpemVfdCBzaXplLCBib29sIGJsb2NraW5nKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIExPR19BTFdBWVNfRkFUQUxfSUYobUNhbGxiYWNrICE9IE5VTEwsICJEb24ndCBjYWxsIHdyaXRlIGlmIHN1cHBseWluZyBhIGNhbGxiYWNrLiIpOworICAgIExPR19BTFdBWVNfRkFUQUxfSUYobUNhbGxiYWNrICE9IG51bGxwdHIsICJEb24ndCBjYWxsIHdyaXRlIGlmIHN1cHBseWluZyBhIGNhbGxiYWNrLiIpOwogCiAgICAgLy9BTE9HVigid3JpdGUoJXAsICV1KSIsIGJ1ZmZlciwgc2l6ZSk7Ci0gICAgaWYgKG1UcmFjayAhPSAwKSB7Ci0gICAgICAgIHJldHVybiBtVHJhY2stPndyaXRlKGJ1ZmZlciwgc2l6ZSwgYmxvY2tpbmcpOworICAgIGlmIChtSkF1ZGlvVHJhY2sgIT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gbUpBdWRpb1RyYWNrLT53cml0ZShidWZmZXIsIHNpemUsIGJsb2NraW5nKTsKICAgICB9CiAgICAgcmV0dXJuIE5PX0lOSVQ7CiB9CkBAIC00OTQsNDUgKzQwNyw0NCBAQAogdm9pZCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6c3RvcCgpIHsKICAgICBBTE9HVigic3RvcCIpOwogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBpZiAobVRyYWNrICE9IDApIHsKLSAgICAgICAgbVRyYWNrLT5zdG9wKCk7CisgICAgaWYgKG1KQXVkaW9UcmFjayAhPSBudWxscHRyKSB7CisgICAgICAgIG1KQXVkaW9UcmFjay0+c3RvcCgpOwogICAgIH0KIH0KIAogdm9pZCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6Zmx1c2goKSB7CiAgICAgQUxPR1YoImZsdXNoIik7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIGlmIChtVHJhY2sgIT0gMCkgewotICAgICAgICBtVHJhY2stPmZsdXNoKCk7CisgICAgaWYgKG1KQXVkaW9UcmFjayAhPSBudWxscHRyKSB7CisgICAgICAgIG1KQXVkaW9UcmFjay0+Zmx1c2goKTsKICAgICB9CiB9CiAKIHZvaWQgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OnBhdXNlKCkgewogICAgIEFMT0dWKCJwYXVzZSIpOwogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBpZiAobVRyYWNrICE9IDApIHsKLSAgICAgICAgbVRyYWNrLT5wYXVzZSgpOworICAgIGlmIChtSkF1ZGlvVHJhY2sgIT0gbnVsbHB0cikgeworICAgICAgICBtSkF1ZGlvVHJhY2stPnBhdXNlKCk7CiAgICAgfQogfQogCiB2b2lkIE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpjbG9zZSgpIHsKICAgICBBTE9HVigiY2xvc2UiKTsKLSAgICBzcDxBdWRpb1RyYWNrPiB0cmFjazsKKyAgICBzcDxKQXVkaW9UcmFjaz4gdHJhY2s7CiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgICAgIHRyYWNrID0gbVRyYWNrOwotICAgICAgICBjbG9zZV9sKCk7IC8vIGNsZWFycyBtVHJhY2sKKyAgICAgICAgdHJhY2sgPSBtSkF1ZGlvVHJhY2s7CisgICAgICAgIGNsb3NlX2woKTsgLy8gY2xlYXJzIG1KQXVkaW9UcmFjawogICAgIH0KICAgICAvLyBkZXN0cnVjdGlvbiBvZiB0aGUgdHJhY2sgb2NjdXJzIG91dHNpZGUgb2YgbXV0ZXguCiB9CiAKLXZvaWQgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OnNldFZvbHVtZShmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCkgewotICAgIEFMT0dWKCJzZXRWb2x1bWUoJWYsICVmKSIsIGxlZnQsIHJpZ2h0KTsKK3ZvaWQgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OnNldFZvbHVtZShmbG9hdCB2b2x1bWUpIHsKKyAgICBBTE9HVigic2V0Vm9sdW1lKCVmKSIsIHZvbHVtZSk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIG1MZWZ0Vm9sdW1lID0gbGVmdDsKLSAgICBtUmlnaHRWb2x1bWUgPSByaWdodDsKLSAgICBpZiAobVRyYWNrICE9IDApIHsKLSAgICAgICAgbVRyYWNrLT5zZXRWb2x1bWUobGVmdCwgcmlnaHQpOworICAgIG1Wb2x1bWUgPSB2b2x1bWU7CisgICAgaWYgKG1KQXVkaW9UcmFjayAhPSBudWxscHRyKSB7CisgICAgICAgIG1KQXVkaW9UcmFjay0+c2V0Vm9sdW1lKHZvbHVtZSk7CiAgICAgfQogfQogCkBAIC01NDAsMTIgKzQ1MiwxMiBAQAogICAgIEFMT0dWKCJzZXRQbGF5YmFja1JhdGUoJWYgJWYgJWQgJWQpIiwKICAgICAgICAgICAgICAgICByYXRlLm1TcGVlZCwgcmF0ZS5tUGl0Y2gsIHJhdGUubUZhbGxiYWNrTW9kZSwgcmF0ZS5tU3RyZXRjaE1vZGUpOwogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBpZiAobVRyYWNrID09IDApIHsKKyAgICBpZiAobUpBdWRpb1RyYWNrID09IDApIHsKICAgICAgICAgLy8gcmVtZW1iZXIgcmF0ZSBzbyB0aGF0IHdlIGNhbiBzZXQgaXQgd2hlbiB0aGUgdHJhY2sgaXMgb3BlbmVkCiAgICAgICAgIG1QbGF5YmFja1JhdGUgPSByYXRlOwogICAgICAgICByZXR1cm4gT0s7CiAgICAgfQotICAgIHN0YXR1c190IHJlcyA9IG1UcmFjay0+c2V0UGxheWJhY2tSYXRlKHJhdGUpOworICAgIHN0YXR1c190IHJlcyA9IG1KQXVkaW9UcmFjay0+c2V0UGxheWJhY2tSYXRlKHJhdGUpOwogICAgIGlmIChyZXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgcmV0dXJuIHJlczsKICAgICB9CkBAIC01NTksMTIgKzQ3MSwxMiBAQAogfQogCiBzdGF0dXNfdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6Z2V0UGxheWJhY2tSYXRlKEF1ZGlvUGxheWJhY2tSYXRlICpyYXRlKSB7Ci0gICAgQUxPR1YoInNldFBsYXliYWNrUmF0ZSIpOworICAgIEFMT0dWKCJnZXRQbGF5YmFja1JhdGUiKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgaWYgKG1UcmFjayA9PSAwKSB7CisgICAgaWYgKG1KQXVkaW9UcmFjayA9PSAwKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KLSAgICAqcmF0ZSA9IG1UcmFjay0+Z2V0UGxheWJhY2tSYXRlKCk7CisgICAgKnJhdGUgPSBtSkF1ZGlvVHJhY2stPmdldFBsYXliYWNrUmF0ZSgpOwogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIApAQCAtNTcyLDggKzQ4NCw4IEBACiAgICAgQUxPR1YoInNldEF1eEVmZmVjdFNlbmRMZXZlbCglZikiLCBsZXZlbCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwogICAgIG1TZW5kTGV2ZWwgPSBsZXZlbDsKLSAgICBpZiAobVRyYWNrICE9IDApIHsKLSAgICAgICAgcmV0dXJuIG1UcmFjay0+c2V0QXV4RWZmZWN0U2VuZExldmVsKGxldmVsKTsKKyAgICBpZiAobUpBdWRpb1RyYWNrICE9IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIG1KQXVkaW9UcmFjay0+c2V0QXV4RWZmZWN0U2VuZExldmVsKGxldmVsKTsKICAgICB9CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQpAQCAtNTgyLDQ0ICs0OTQsNTkgQEAKICAgICBBTE9HVigiYXR0YWNoQXV4RWZmZWN0KCVkKSIsIGVmZmVjdElkKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CiAgICAgbUF1eEVmZmVjdElkID0gZWZmZWN0SWQ7Ci0gICAgaWYgKG1UcmFjayAhPSAwKSB7Ci0gICAgICAgIHJldHVybiBtVHJhY2stPmF0dGFjaEF1eEVmZmVjdChlZmZlY3RJZCk7CisgICAgaWYgKG1KQXVkaW9UcmFjayAhPSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBtSkF1ZGlvVHJhY2stPmF0dGFjaEF1eEVmZmVjdChlZmZlY3RJZCk7CiAgICAgfQogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotc3RhdHVzX3QgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OnNldE91dHB1dERldmljZShhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkKSB7Ci0gICAgQUxPR1YoInNldE91dHB1dERldmljZSglZCkiLCBkZXZpY2VJZCk7CitzdGF0dXNfdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6c2V0UHJlZmVycmVkRGV2aWNlKGpvYmplY3QgZGV2aWNlKSB7CisgICAgQUxPR1YoInNldFByZWZlcnJlZERldmljZSIpOwogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBtU2VsZWN0ZWREZXZpY2VJZCA9IGRldmljZUlkOwotICAgIGlmIChtVHJhY2sgIT0gMCkgewotICAgICAgICByZXR1cm4gbVRyYWNrLT5zZXRPdXRwdXREZXZpY2UoZGV2aWNlSWQpOworICAgIHN0YXR1c190IHJldCA9IE5PX0VSUk9SOworICAgIGlmIChtSkF1ZGlvVHJhY2sgIT0gbnVsbHB0cikgeworICAgICAgICByZXQgPSBtSkF1ZGlvVHJhY2stPnNldFByZWZlcnJlZERldmljZShkZXZpY2UpOworICAgIH0KKyAgICBpZiAocmV0ID09IE5PX0VSUk9SKSB7CisgICAgICAgIG1QcmVmZXJyZWREZXZpY2UgPSBuZXcgSk9iamVjdEhvbGRlcihkZXZpY2UpOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitqb2JqZWN0IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpnZXRSb3V0ZWREZXZpY2UoKSB7CisgICAgQUxPR1YoImdldFJvdXRlZERldmljZSIpOworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBpZiAobUpBdWRpb1RyYWNrICE9IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIG1KQXVkaW9UcmFjay0+Z2V0Um91dGVkRGV2aWNlKCk7CisgICAgfQorICAgIHJldHVybiBudWxscHRyOworfQorCitzdGF0dXNfdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6YWRkQXVkaW9EZXZpY2VDYWxsYmFjayhqb2JqZWN0IGpSb3V0aW5nRGVsZWdhdGUpIHsKKyAgICBBTE9HVigiYWRkQXVkaW9EZXZpY2VDYWxsYmFjayIpOworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBqb2JqZWN0IGxpc3RlbmVyID0gSkF1ZGlvVHJhY2s6OmdldExpc3RlbmVyKGpSb3V0aW5nRGVsZWdhdGUpOworICAgIGlmIChtSkF1ZGlvVHJhY2sgIT0gbnVsbHB0ciAmJgorICAgICAgICBKQXVkaW9UcmFjazo6ZmluZEJ5S2V5KG1Sb3V0aW5nRGVsZWdhdGVzLCBsaXN0ZW5lcikgPT0gbnVsbHB0cikgeworICAgICAgICBqb2JqZWN0IGhhbmRsZXIgPSBKQXVkaW9UcmFjazo6Z2V0SGFuZGxlcihqUm91dGluZ0RlbGVnYXRlKTsKKyAgICAgICAgam9iamVjdCByb3V0aW5nRGVsZWdhdGUgPSBKQXVkaW9UcmFjazo6YWRkR2xvYmFsUmVmKGpSb3V0aW5nRGVsZWdhdGUpOworICAgICAgICBtUm91dGluZ0RlbGVnYXRlcy5wdXNoX2JhY2soc3RkOjpwYWlyPGpvYmplY3QsIGpvYmplY3Q+KGxpc3RlbmVyLCByb3V0aW5nRGVsZWdhdGUpKTsKKyAgICAgICAgcmV0dXJuIG1KQXVkaW9UcmFjay0+YWRkQXVkaW9EZXZpY2VDYWxsYmFjayhyb3V0aW5nRGVsZWdhdGUsIGhhbmRsZXIpOwogICAgIH0KICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLXN0YXR1c190IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpnZXRSb3V0ZWREZXZpY2VJZChhdWRpb19wb3J0X2hhbmRsZV90KiBkZXZpY2VJZCkgewotICAgIEFMT0dWKCJnZXRSb3V0ZWREZXZpY2VJZCIpOworc3RhdHVzX3QgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OnJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2soam9iamVjdCBsaXN0ZW5lcikgeworICAgIEFMT0dWKCJyZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrIik7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIGlmIChtVHJhY2sgIT0gMCkgewotICAgICAgICBtUm91dGVkRGV2aWNlSWQgPSBtVHJhY2stPmdldFJvdXRlZERldmljZUlkKCk7Ci0gICAgfQotICAgICpkZXZpY2VJZCA9IG1Sb3V0ZWREZXZpY2VJZDsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjplbmFibGVBdWRpb0RldmljZUNhbGxiYWNrKGJvb2wgZW5hYmxlZCkgewotICAgIEFMT0dWKCJlbmFibGVBdWRpb0RldmljZUNhbGxiYWNrLCAlZCIsIGVuYWJsZWQpOwotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBtRGV2aWNlQ2FsbGJhY2tFbmFibGVkID0gZW5hYmxlZDsKLSAgICBpZiAobVRyYWNrICE9IDApIHsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzOwotICAgICAgICBpZiAoZW5hYmxlZCkgewotICAgICAgICAgICAgc3RhdHVzID0gbVRyYWNrLT5hZGRBdWRpb0RldmljZUNhbGxiYWNrKG1EZXZpY2VDYWxsYmFjay5wcm9tb3RlKCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3RhdHVzID0gbVRyYWNrLT5yZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrKG1EZXZpY2VDYWxsYmFjay5wcm9tb3RlKCkpOworICAgIGpvYmplY3Qgcm91dGluZ0RlbGVnYXRlID0gbnVsbHB0cjsKKyAgICBpZiAobUpBdWRpb1RyYWNrICE9IG51bGxwdHIgJiYKKyAgICAgICAgKHJvdXRpbmdEZWxlZ2F0ZSA9IEpBdWRpb1RyYWNrOjpmaW5kQnlLZXkobVJvdXRpbmdEZWxlZ2F0ZXMsIGxpc3RlbmVyKSkgIT0gbnVsbHB0cikgeworICAgICAgICBtSkF1ZGlvVHJhY2stPnJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2socm91dGluZ0RlbGVnYXRlKTsKKyAgICAgICAgSkF1ZGlvVHJhY2s6OmVyYXNlQnlLZXkobVJvdXRpbmdEZWxlZ2F0ZXMsIGxpc3RlbmVyKTsKKyAgICAgICAgaWYgKEpBdWRpb1RyYWNrOjpyZW1vdmVHbG9iYWxSZWYocm91dGluZ0RlbGVnYXRlKSAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KICAgICByZXR1cm4gTk9fRVJST1I7CiB9CkBAIC02MzIsMjEgKzU1OSwyMSBAQAogICAgIC8vIGxvY2sgdG8gZW5zdXJlIHdlIGFyZW4ndCBjYXVnaHQgaW4gdGhlIG1pZGRsZSBvZiBhIHRyYWNrIHN3aXRjaC4KICAgICBkYXRhLT5sb2NrKCk7CiAgICAgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQgKm1lID0gZGF0YS0+Z2V0T3V0cHV0KCk7Ci0gICAgQXVkaW9UcmFjazo6QnVmZmVyICpidWZmZXIgPSAoQXVkaW9UcmFjazo6QnVmZmVyICopaW5mbzsKLSAgICBpZiAobWUgPT0gTlVMTCkgeworICAgIEpBdWRpb1RyYWNrOjpCdWZmZXIgKmJ1ZmZlciA9IChKQXVkaW9UcmFjazo6QnVmZmVyICopaW5mbzsKKyAgICBpZiAobWUgPT0gbnVsbHB0cikgewogICAgICAgICAvLyBubyBvdXRwdXQgc2V0LCBsaWtlbHkgYmVjYXVzZSB0aGUgdHJhY2sgd2FzIHNjaGVkdWxlZCB0byBiZSByZXVzZWQKICAgICAgICAgLy8gYnkgYW5vdGhlciBwbGF5ZXIsIGJ1dCB0aGUgZm9ybWF0IHR1cm5lZCBvdXQgdG8gYmUgaW5jb21wYXRpYmxlLgogICAgICAgICBkYXRhLT51bmxvY2soKTsKLSAgICAgICAgaWYgKGJ1ZmZlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBidWZmZXItPnNpemUgPSAwOworICAgICAgICBpZiAoYnVmZmVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGJ1ZmZlci0+bVNpemUgPSAwOwogICAgICAgICB9CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKICAgICBzd2l0Y2goZXZlbnQpIHsKLSAgICBjYXNlIEF1ZGlvVHJhY2s6OkVWRU5UX01PUkVfREFUQTogeworICAgIGNhc2UgSkF1ZGlvVHJhY2s6OkVWRU5UX01PUkVfREFUQTogewogICAgICAgICBzaXplX3QgYWN0dWFsU2l6ZSA9ICgqbWUtPm1DYWxsYmFjaykoCi0gICAgICAgICAgICAgICAgbWUsIGJ1ZmZlci0+cmF3LCBidWZmZXItPnNpemUsIG1lLT5tQ2FsbGJhY2tDb29raWUsCisgICAgICAgICAgICAgICAgbWUsIGJ1ZmZlci0+bURhdGEsIGJ1ZmZlci0+bVNpemUsIG1lLT5tQ2FsbGJhY2tDb29raWUsCiAgICAgICAgICAgICAgICAgQ0JfRVZFTlRfRklMTF9CVUZGRVIpOwogCiAgICAgICAgIC8vIExvZyB3aGVuIG5vIGRhdGEgaXMgcmV0dXJuZWQgZnJvbSB0aGUgY2FsbGJhY2suCkBAIC02NTgsMjUgKzU4NSwyNSBAQAogICAgICAgICAvLyBUaGlzIGlzIGEgYmVuaWduIGJ1c3ktd2FpdCwgd2l0aCB0aGUgbmV4dCBkYXRhIHJlcXVlc3QgZ2VuZXJhdGVkIDEwIG1zIG9yIG1vcmUgbGF0ZXI7CiAgICAgICAgIC8vIG5ldmVydGhlbGVzcyBmb3IgcG93ZXIgcmVhc29ucywgd2UgZG9uJ3Qgd2FudCB0byBzZWUgdG9vIG1hbnkgb2YgdGhlc2UuCiAKLSAgICAgICAgQUxPR1ZfSUYoYWN0dWFsU2l6ZSA9PSAwICYmIGJ1ZmZlci0+c2l6ZSA+IDAsICJjYWxsYmFja3dyYXBwZXI6IGVtcHR5IGJ1ZmZlciByZXR1cm5lZCIpOworICAgICAgICBBTE9HVl9JRihhY3R1YWxTaXplID09IDAgJiYgYnVmZmVyLT5tU2l6ZSA+IDAsICJjYWxsYmFja3dyYXBwZXI6IGVtcHR5IGJ1ZmZlciByZXR1cm5lZCIpOwogCi0gICAgICAgIGJ1ZmZlci0+c2l6ZSA9IGFjdHVhbFNpemU7CisgICAgICAgIGJ1ZmZlci0+bVNpemUgPSBhY3R1YWxTaXplOwogICAgICAgICB9IGJyZWFrOwogCi0gICAgY2FzZSBBdWRpb1RyYWNrOjpFVkVOVF9TVFJFQU1fRU5EOgorICAgIGNhc2UgSkF1ZGlvVHJhY2s6OkVWRU5UX1NUUkVBTV9FTkQ6CiAgICAgICAgIC8vIGN1cnJlbnRseSBvbmx5IG9jY3VycyBmb3Igb2ZmbG9hZGVkIGNhbGxiYWNrcwogICAgICAgICBBTE9HVigiY2FsbGJhY2t3cmFwcGVyOiBkZWxpdmVyIEVWRU5UX1NUUkVBTV9FTkQiKTsKLSAgICAgICAgKCptZS0+bUNhbGxiYWNrKShtZSwgTlVMTCAvKiBidWZmZXIgKi8sIDAgLyogc2l6ZSAqLywKKyAgICAgICAgKCptZS0+bUNhbGxiYWNrKShtZSwgbnVsbHB0ciAvKiBidWZmZXIgKi8sIDAgLyogc2l6ZSAqLywKICAgICAgICAgICAgICAgICBtZS0+bUNhbGxiYWNrQ29va2llLCBDQl9FVkVOVF9TVFJFQU1fRU5EKTsKICAgICAgICAgYnJlYWs7CiAKLSAgICBjYXNlIEF1ZGlvVHJhY2s6OkVWRU5UX05FV19JQVVESU9UUkFDSyA6CisgICAgY2FzZSBKQXVkaW9UcmFjazo6RVZFTlRfTkVXX0lBVURJT1RSQUNLIDoKICAgICAgICAgQUxPR1YoImNhbGxiYWNrd3JhcHBlcjogZGVsaXZlciBFVkVOVF9URUFSX0RPV04iKTsKLSAgICAgICAgKCptZS0+bUNhbGxiYWNrKShtZSwgIE5VTEwgLyogYnVmZmVyICovLCAwIC8qIHNpemUgKi8sCisgICAgICAgICgqbWUtPm1DYWxsYmFjaykobWUsICBudWxscHRyIC8qIGJ1ZmZlciAqLywgMCAvKiBzaXplICovLAogICAgICAgICAgICAgICAgIG1lLT5tQ2FsbGJhY2tDb29raWUsIENCX0VWRU5UX1RFQVJfRE9XTik7CiAgICAgICAgIGJyZWFrOwogCi0gICAgY2FzZSBBdWRpb1RyYWNrOjpFVkVOVF9VTkRFUlJVTjoKKyAgICBjYXNlIEpBdWRpb1RyYWNrOjpFVkVOVF9VTkRFUlJVTjoKICAgICAgICAgLy8gVGhpcyBvY2N1cnMgd2hlbiB0aGVyZSBpcyBubyBkYXRhIGF2YWlsYWJsZSwgdHlwaWNhbGx5CiAgICAgICAgIC8vIHdoZW4gdGhlcmUgaXMgYSBmYWlsdXJlIHRvIHN1cHBseSBkYXRhIHRvIHRoZSBBdWRpb1RyYWNrLiAgSXQgY2FuIGFsc28KICAgICAgICAgLy8gb2NjdXIgaW4gbm9uLW9mZmxvYWRlZCBtb2RlIHdoZW4gdGhlIGF1ZGlvIGRldmljZSBjb21lcyBvdXQgb2Ygc3RhbmRieS4KQEAgLTY5NiwyOSArNjIzLDMxIEBACiAgICAgZGF0YS0+dW5sb2NrKCk7CiB9CiAKLWF1ZGlvX3Nlc3Npb25fdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6Z2V0U2Vzc2lvbklkKCkgY29uc3QKLXsKK2ludDMyX3QgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OmdldFNlc3Npb25JZCgpIGNvbnN0IHsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CiAgICAgcmV0dXJuIG1TZXNzaW9uSWQ7CiB9CiAKLXVpbnQzMl90IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpnZXRTYW1wbGVSYXRlKCkgY29uc3QKLXsKK3ZvaWQgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OnNldFNlc3Npb25JZChjb25zdCBpbnQzMl90IHNlc3Npb25JZCkgewogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBpZiAobVRyYWNrID09IDApIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiBtVHJhY2stPmdldFNhbXBsZVJhdGUoKTsKKyAgICBtU2Vzc2lvbklkID0gc2Vzc2lvbklkOwogfQogCi1pbnQ2NF90IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpnZXRCdWZmZXJEdXJhdGlvbkluVXMoKSBjb25zdAotewordWludDMyX3QgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OmdldFNhbXBsZVJhdGUoKSBjb25zdCB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIGlmIChtVHJhY2sgPT0gMCkgeworICAgIGlmIChtSkF1ZGlvVHJhY2sgPT0gMCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIG1KQXVkaW9UcmFjay0+Z2V0U2FtcGxlUmF0ZSgpOworfQorCitpbnQ2NF90IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpnZXRCdWZmZXJEdXJhdGlvbkluVXMoKSBjb25zdCB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIGlmIChtSkF1ZGlvVHJhY2sgPT0gMCkgewogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAgICAgaW50NjRfdCBkdXJhdGlvbjsKLSAgICBpZiAobVRyYWNrLT5nZXRCdWZmZXJEdXJhdGlvbkluVXMoJmR1cmF0aW9uKSAhPSBPSykgeworICAgIGlmIChtSkF1ZGlvVHJhY2stPmdldEJ1ZmZlckR1cmF0aW9uSW5VcygmZHVyYXRpb24pICE9IE9LKSB7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KICAgICByZXR1cm4gZHVyYXRpb247CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvaW5jbHVkZS9tZWRpYXBsYXllcjIvSkF1ZGlvVHJhY2suaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9pbmNsdWRlL21lZGlhcGxheWVyMi9KQXVkaW9UcmFjay5oCmluZGV4IDMwMTgyNWIuLjg3ZGM4ODkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9pbmNsdWRlL21lZGlhcGxheWVyMi9KQXVkaW9UcmFjay5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9pbmNsdWRlL21lZGlhcGxheWVyMi9KQXVkaW9UcmFjay5oCkBAIC0xNywxOSArMTcsMjEgQEAKICNpZm5kZWYgQU5EUk9JRF9KQVVESU9UUkFDS19ICiAjZGVmaW5lIEFORFJPSURfSkFVRElPVFJBQ0tfSAogCisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHV0aWxpdHk+CiAjaW5jbHVkZSA8am5pLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9SZXNhbXBsZXJQdWJsaWMuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1N5c3RlbS5oPgogI2luY2x1ZGUgPG1lZGlhL1ZvbHVtZVNoYXBlci5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotCisjaW5jbHVkZSA8bWVkaWFwbGF5ZXIyL0pPYmplY3RIb2xkZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1RpbWVzdGFtcC5oPiAgIC8vIEl0IGhhcyBkZXBlbmRlbmN5IG9uIGF1ZGlvLmgvRXJyb3JzLmgsIGJ1dCBkb2Vzbid0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmNsdWRlIHRoZW0gaW4gaXQuIFRoZXJlZm9yZSBpdCBpcyBpbmNsdWRlZCBoZXJlIGF0IGxhc3QuCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotY2xhc3MgSkF1ZGlvVHJhY2sgeworY2xhc3MgSkF1ZGlvVHJhY2sgOiBwdWJsaWMgUmVmQmFzZSB7CiBwdWJsaWM6CiAKICAgICAvKiBFdmVudHMgdXNlZCBieSBBdWRpb1RyYWNrIGNhbGxiYWNrIGZ1bmN0aW9uIChjYWxsYmFja190KS4KQEAgLTM3LDYgKzM5LDggQEAKICAgICAgKi8KICAgICBlbnVtIGV2ZW50X3R5cGUgewogICAgICAgICBFVkVOVF9NT1JFX0RBVEEgPSAwLCAgICAgICAgLy8gUmVxdWVzdCB0byB3cml0ZSBtb3JlIGRhdGEgdG8gYnVmZmVyLgorICAgICAgICBFVkVOVF9VTkRFUlJVTiA9IDEsICAgICAgICAgLy8gQnVmZmVyIHVuZGVycnVuIG9jY3VycmVkLiBUaGlzIHdpbGwgbm90IG9jY3VyIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RhdGljIHRyYWNrcy4KICAgICAgICAgRVZFTlRfTkVXX0lBVURJT1RSQUNLID0gNiwgIC8vIElBdWRpb1RyYWNrIHdhcyByZS1jcmVhdGVkLCBlaXRoZXIgZHVlIHRvIHJlLXJvdXRpbmcgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB2b2x1bnRhcnkgaW52YWxpZGF0aW9uIGJ5IG1lZGlhc2VydmVyLCBvciBtZWRpYXNlcnZlciBjcmFzaC4KICAgICAgICAgRVZFTlRfU1RSRUFNX0VORCA9IDcsICAgICAgIC8vIFNlbnQgYWZ0ZXIgYWxsIHRoZSBidWZmZXJzIHF1ZXVlZCBpbiBBRiBhbmQgSFcgYXJlIHBsYXllZApAQCAtMTA0LDE1ICsxMDgsMTQgQEAKICAgICAgKgogICAgICAqIFRPRE86IFJldml2ZSByZW1vdmVkIGFyZ3VtZW50cyBhZnRlciBvZmZsb2FkIG1vZGUgaXMgc3VwcG9ydGVkLgogICAgICAqLwotICAgIEpBdWRpb1RyYWNrKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSwKLSAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAorICAgIEpBdWRpb1RyYWNrKHVpbnQzMl90IHNhbXBsZVJhdGUsCiAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgIGNhbGxiYWNrX3QgY2JmLAogICAgICAgICAgICAgICAgIHZvaWQqIHVzZXIsCiAgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQgPSAwLAotICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQgID0gQVVESU9fU0VTU0lPTl9BTExPQ0FURSwKLSAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QqIHBBdHRyaWJ1dGVzID0gTlVMTCwKKyAgICAgICAgICAgICAgICBpbnQzMl90IHNlc3Npb25JZCAgPSBBVURJT19TRVNTSU9OX0FMTE9DQVRFLAorICAgICAgICAgICAgICAgIGNvbnN0IGpvYmplY3QgcEF0dHJpYnV0ZXMgPSBOVUxMLAogICAgICAgICAgICAgICAgIGZsb2F0IG1heFJlcXVpcmVkU3BlZWQgPSAxLjBmKTsKIAogICAgIC8qCkBAIC0xNTgsMTAgKzE2MSwxMCBAQAogICAgICAqIENhdXRpb246IGNhbGxpbmcgdGhpcyBtZXRob2QgdG9vIG9mdGVuIG1heSBiZSBpbmVmZmljaWVudDsKICAgICAgKiBpZiB5b3UgbmVlZCBhIGhpZ2ggcmVzb2x1dGlvbiBtYXBwaW5nIGJldHdlZW4gZnJhbWUgcG9zaXRpb24gYW5kIHByZXNlbnRhdGlvbiB0aW1lLAogICAgICAqIGNvbnNpZGVyIGltcGxlbWVudGluZyB0aGF0IGF0IGFwcGxpY2F0aW9uIGxldmVsLCBiYXNlZCBvbiB0aGUgbG93IHJlc29sdXRpb24gdGltZXN0YW1wcy4KLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGltZXN0YW1wIGlzIHZhbGlkLgotICAgICAqIFRoZSB0aW1lc3RhbXAgcGFyYW1ldGVyIGlzIHVuZGVmaW5lZCBvbiByZXR1cm4sIGlmIGZhbHNlIGlzIHJldHVybmVkLgorICAgICAqIFJldHVybnMgTk9fRVJST1IgaWYgdGltZXN0YW1wIGlzIHZhbGlkLgorICAgICAqICAgICAgICAgTk9fSU5JVCBpZiBmaW5kcyBlcnJvciwgYW5kIHRpbWVzdGFtcCBwYXJhbWV0ZXIgd2lsbCBiZSB1bmRlZmluZWQgb24gcmV0dXJuLgogICAgICAqLwotICAgIGJvb2wgZ2V0VGltZXN0YW1wKEF1ZGlvVGltZXN0YW1wJiB0aW1lc3RhbXApOworICAgIHN0YXR1c190IGdldFRpbWVzdGFtcChBdWRpb1RpbWVzdGFtcCYgdGltZXN0YW1wKTsKIAogICAgIC8vIFRPRE86IFRoaXMgZG9jIGlzIGp1c3QgY29waWVkIGZyb20gQXVkaW9UcmFjay5oLiBSZXZpc2UgaXQgYWZ0ZXIgaW1wbGVtZW5hdGlvbi4KICAgICAvKiBSZXR1cm4gdGhlIGV4dGVuZGVkIHRpbWVzdGFtcCwgd2l0aCBhZGRpdGlvbmFsIHRpbWViYXNlIGluZm8gYW5kIGltcHJvdmVkIGRyYWluIGJlaGF2aW9yLgpAQCAtMzI0LDM3ICszMjcsNDMgQEAKIAogICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCgpOwogCisgICAgc2l6ZV90IGZyYW1lU2l6ZSgpOworCiAgICAgLyoKICAgICAgKiBEdW1wcyB0aGUgc3RhdGUgb2YgYW4gYXVkaW8gdHJhY2suCiAgICAgICogTm90IGEgZ2VuZXJhbC1wdXJwb3NlIEFQSTsgaW50ZW5kZWQgb25seSBmb3IgdXNlIGJ5IG1lZGlhIHBsYXllciBzZXJ2aWNlIHRvIGR1bXAgaXRzIHRyYWNrcy4KICAgICAgKi8KICAgICBzdGF0dXNfdCBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgY29uc3Q7CiAKLSAgICAvKiBSZXR1cm5zIHRoZSBJRCBvZiB0aGUgYXVkaW8gZGV2aWNlIGFjdHVhbGx5IHVzZWQgYnkgdGhlIG91dHB1dCB0byB3aGljaCB0aGlzIEF1ZGlvVHJhY2sgaXMKLSAgICAgKiBhdHRhY2hlZC4gV2hlbiB0aGUgQXVkaW9UcmFjayBpcyBpbmFjdGl2ZSwgaXQgd2lsbCByZXR1cm4gQVVESU9fUE9SVF9IQU5ETEVfTk9ORS4KKyAgICAvKiBSZXR1cm5zIHRoZSBBdWRpb0RldmljZUluZm8gdXNlZCBieSB0aGUgb3V0cHV0IHRvIHdoaWNoIHRoaXMgQXVkaW9UcmFjayBpcworICAgICAqIGF0dGFjaGVkLgogICAgICAqLwotICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgZ2V0Um91dGVkRGV2aWNlSWQoKTsKKyAgICBqb2JqZWN0IGdldFJvdXRlZERldmljZSgpOwogCiAgICAgLyogUmV0dXJucyB0aGUgSUQgb2YgdGhlIGF1ZGlvIHNlc3Npb24gdGhpcyBBdWRpb1RyYWNrIGJlbG9uZ3MgdG8uICovCi0gICAgYXVkaW9fc2Vzc2lvbl90IGdldEF1ZGlvU2Vzc2lvbklkKCk7CisgICAgaW50MzJfdCBnZXRBdWRpb1Nlc3Npb25JZCgpOwogCi0gICAgLyogU2VsZWN0cyB0aGUgYXVkaW8gZGV2aWNlIHRvIHVzZSBmb3Igb3V0cHV0IG9mIHRoaXMgQXVkaW9UcmFjay4gQSB2YWx1ZSBvZgotICAgICAqIEFVRElPX1BPUlRfSEFORExFX05PTkUgaW5kaWNhdGVzIGRlZmF1bHQgcm91dGluZy4KKyAgICAvKiBTZXRzIHRoZSBwcmVmZXJyZWQgYXVkaW8gZGV2aWNlIHRvIHVzZSBmb3Igb3V0cHV0IG9mIHRoaXMgQXVkaW9UcmFjay4KICAgICAgKgogICAgICAqIFBhcmFtZXRlcnM6Ci0gICAgICogIFRoZSBkZXZpY2UgSUQgb2YgdGhlIHNlbGVjdGVkIGRldmljZSAoYXMgcmV0dXJuZWQgYnkgdGhlIEF1ZGlvRGV2aWNlc01hbmFnZXIgQVBJKS4KKyAgICAgKiBEZXZpY2U6IGFuIEF1ZGlvRGV2aWNlSW5mbyBvYmplY3QuCiAgICAgICoKICAgICAgKiBSZXR1cm5lZCB2YWx1ZToKICAgICAgKiAgLSBOT19FUlJPUjogc3VjY2Vzc2Z1bCBvcGVyYXRpb24KLSAgICAgKiAgLSBCQURfVkFMVUU6IGZhaWxlZCB0byBmaW5kIHRoZSB2YWxpZCBvdXRwdXQgZGV2aWNlIHdpdGggZ2l2ZW4gZGV2aWNlIElkLgorICAgICAqICAtIEJBRF9WQUxVRTogZmFpbGVkIHRvIHNldCB0aGUgZGV2aWNlCiAgICAgICovCi0gICAgc3RhdHVzX3Qgc2V0T3V0cHV0RGV2aWNlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQpOworICAgIHN0YXR1c190IHNldFByZWZlcnJlZERldmljZShqb2JqZWN0IGRldmljZSk7CiAKICAgICAvLyBUT0RPOiBBZGQgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUIHdoZW4gaXQgaXMgcG9zc2libGUgdG8gY2hlY2suCiAgICAgLy8gVE9ETzogQWRkIEFVRElPX0ZMQUdfSFdfQVZfU1lOQyB3aGVuIGl0IGlzIHBvc3NpYmxlIHRvIGNoZWNrLgogICAgIC8qIFJldHVybnMgdGhlIGZsYWdzICovCiAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZ2V0RmxhZ3MoKSBjb25zdCB7IHJldHVybiBtRmxhZ3M7IH0KIAorICAgIC8qIFdlIGRvbid0IGtlZXAgc3RyZWFtIHR5cGUgaGVyZSwKKyAgICAgKiBpbnN0ZWFkLCB3ZSBrZWVwIGF0dHJpYnV0ZXMgYW5kIGNhbGwgZ2V0Vm9sdW1lQ29udHJvbFN0cmVhbSgpIHRvIGdldCBzdHJlYW0gdHlwZQorICAgICAqLworICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgZ2V0QXVkaW9TdHJlYW1UeXBlKCk7CisKICAgICAvKiBPYnRhaW4gdGhlIHBlbmRpbmcgZHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzIGZvciBwbGF5YmFjayBvZiBwdXJlIFBDTSBkYXRhIHJlbWFpbmluZyBpbgogICAgICAqIEF1ZGlvVHJhY2suCiAgICAgICoKQEAgLTM2OSwyNyArMzc4LDY4IEBACiAgICAgICogUmVwbGFjZXMgYW55IHByZXZpb3VzbHkgaW5zdGFsbGVkIGNhbGxiYWNrLgogICAgICAqCiAgICAgICogUGFyYW1ldGVyczoKLSAgICAgKgotICAgICAqIGNhbGxiYWNrOiBUaGUgY2FsbGJhY2sgaW50ZXJmYWNlCisgICAgICogTGlzdGVuZXI6IHRoZSBsaXN0ZW5lciB0byByZWNlaXZlIG5vdGlmaWNhdGlvbiBvZiByZXJvdXRpbmcgZXZlbnRzLgorICAgICAqIEhhbmRsZXI6IHRoZSBoYW5kbGVyIHRvIGhhbmRsZXIgdGhlIHJlcm91dGluZyBldmVudHMuCiAgICAgICoKICAgICAgKiBSZXR1cm5zIE5PX0VSUk9SIGlmIHN1Y2Nlc3NmdWwuCi0gICAgICogICAgICAgICBJTlZBTElEX09QRVJBVElPTiBpZiB0aGUgc2FtZSBjYWxsYmFjayBpcyBhbHJlYWR5IGluc3RhbGxlZC4KLSAgICAgKiAgICAgICAgIE5PX0lOSVQgb3IgUFJFTUlTU0lPTl9ERU5JRUQgaWYgQXVkaW9GbGluZ2VyIHNlcnZpY2UgaXMgbm90IHJlYWNoYWJsZQotICAgICAqICAgICAgICAgQkFEX1ZBTFVFIGlmIHRoZSBjYWxsYmFjayBpcyBOVUxMCisgICAgICogICAgICAgICAoVE9ETykgSU5WQUxJRF9PUEVSQVRJT04gaWYgdGhlIHNhbWUgY2FsbGJhY2sgaXMgYWxyZWFkeSBpbnN0YWxsZWQuCisgICAgICogICAgICAgICAoVE9ETykgTk9fSU5JVCBvciBQUkVNSVNTSU9OX0RFTklFRCBpZiBBdWRpb0ZsaW5nZXIgc2VydmljZSBpcyBub3QgcmVhY2hhYmxlCisgICAgICogICAgICAgICAoVE9ETykgQkFEX1ZBTFVFIGlmIHRoZSBjYWxsYmFjayBpcyBOVUxMCiAgICAgICovCi0gICAgc3RhdHVzX3QgYWRkQXVkaW9EZXZpY2VDYWxsYmFjayhjb25zdCBzcDxBdWRpb1N5c3RlbTo6QXVkaW9EZXZpY2VDYWxsYmFjaz4mIGNhbGxiYWNrKTsKKyAgICBzdGF0dXNfdCBhZGRBdWRpb0RldmljZUNhbGxiYWNrKGpvYmplY3QgbGlzdGVuZXIsIGpvYmplY3QgcmQpOwogCiAgICAgLyogUmVtb3ZlcyBhbiBBdWRpb0RldmljZUNhbGxiYWNrLgogICAgICAqCiAgICAgICogUGFyYW1ldGVyczoKLSAgICAgKgotICAgICAqIGNhbGxiYWNrOiBUaGUgY2FsbGJhY2sgaW50ZXJmYWNlCisgICAgICogTGlzdGVuZXI6IHRoZSBsaXN0ZW5lciB0byByZWNlaXZlIG5vdGlmaWNhdGlvbiBvZiByZXJvdXRpbmcgZXZlbnRzLgogICAgICAqCiAgICAgICogUmV0dXJucyBOT19FUlJPUiBpZiBzdWNjZXNzZnVsLgotICAgICAqICAgICAgICAgSU5WQUxJRF9PUEVSQVRJT04gaWYgdGhlIGNhbGxiYWNrIGlzIG5vdCBpbnN0YWxsZWQKLSAgICAgKiAgICAgICAgIEJBRF9WQUxVRSBpZiB0aGUgY2FsbGJhY2sgaXMgTlVMTAorICAgICAqICAgICAgICAgKFRPRE8pIElOVkFMSURfT1BFUkFUSU9OIGlmIHRoZSBjYWxsYmFjayBpcyBub3QgaW5zdGFsbGVkCisgICAgICogICAgICAgICAoVE9ETykgQkFEX1ZBTFVFIGlmIHRoZSBjYWxsYmFjayBpcyBOVUxMCiAgICAgICovCi0gICAgc3RhdHVzX3QgcmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjayhjb25zdCBzcDxBdWRpb1N5c3RlbTo6QXVkaW9EZXZpY2VDYWxsYmFjaz4mIGNhbGxiYWNrKTsKKyAgICBzdGF0dXNfdCByZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrKGpvYmplY3QgbGlzdGVuZXIpOworCisgICAgLyogUmVnaXN0ZXIgYWxsIGJhY2tlZC11cCByb3V0aW5nIGRlbGVnYXRlcy4KKyAgICAgKgorICAgICAqIFBhcmFtZXRlcnM6CisgICAgICogcm91dGluZ0RlbGVnYXRlczogYmFja2VkLXVwIHJvdXRpbmcgZGVsZWdhdGVzCisgICAgICoKKyAgICAgKi8KKyAgICB2b2lkIHJlZ2lzdGVyUm91dGluZ0RlbGVnYXRlcyhzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8am9iamVjdCwgam9iamVjdD4+JiByb3V0aW5nRGVsZWdhdGVzKTsKKworICAgIC8qIGdldCBsaXN0ZW5lciBmcm9tIFJvdXRpbmdEZWxlZ2F0ZSBvYmplY3QKKyAgICAgKi8KKyAgICBzdGF0aWMgam9iamVjdCBnZXRMaXN0ZW5lcihjb25zdCBqb2JqZWN0IHJvdXRpbmdEZWxlZ2F0ZU9iaik7CisKKyAgICAvKiBnZXQgaGFuZGxlciBmcm9tIFJvdXRpbmdEZWxlZ2F0ZSBvYmplY3QKKyAgICAgKi8KKyAgICBzdGF0aWMgam9iamVjdCBnZXRIYW5kbGVyKGNvbnN0IGpvYmplY3Qgcm91dGluZ0RlbGVnYXRlT2JqKTsKKworICAgIC8qIGNvbnZlcnQgbG9jYWwgcmVmZXJlbmNlIHRvIGdsb2JhbCByZWZlcmVuY2UuCisgICAgICovCisgICAgc3RhdGljIGpvYmplY3QgYWRkR2xvYmFsUmVmKGNvbnN0IGpvYmplY3Qgb2JqKTsKKworICAgIC8qIGVyYXNlIGdsb2JhbCByZWZlcmVuY2UuCisgICAgICoKKyAgICAgKiBSZXR1cm5zIE5PX0VSUk9SIGlmIHN1Y2NlZWRzCisgICAgICogICAgICAgICBCQURfVkFMVUUgaWYgb2JqIGlzIE5VTEwKKyAgICAgKi8KKyAgICBzdGF0aWMgc3RhdHVzX3QgcmVtb3ZlR2xvYmFsUmVmKGNvbnN0IGpvYmplY3Qgb2JqKTsKKworICAgIC8qCisgICAgICogUGFyYW1ldGVyczoKKyAgICAgKiBtYXAgYW5kIGtleQorICAgICAqCisgICAgICogUmV0dXJucyB2YWx1ZSBpZiBrZXkgaXMgaW4gdGhlIG1hcAorICAgICAqICAgICAgICAgbnVsbHB0ciBpZiBrZXkgaXMgbm90IGluIHRoZSBtYXAKKyAgICAgKi8KKyAgICBzdGF0aWMgam9iamVjdCBmaW5kQnlLZXkoc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGpvYmplY3QsIGpvYmplY3Q+PiYgbXAsIGNvbnN0IGpvYmplY3Qga2V5KTsKKworICAgIC8qCisgICAgICogUGFyYW1ldGVyczoKKyAgICAgKiBtYXAgYW5kIGtleQorICAgICAqLworICAgIHN0YXRpYyB2b2lkIGVyYXNlQnlLZXkoc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGpvYmplY3QsIGpvYmplY3Q+PiYgbXAsIGNvbnN0IGpvYmplY3Qga2V5KTsKIAogcHJpdmF0ZToKICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBtRmxhZ3M7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvaW5jbHVkZS9tZWRpYXBsYXllcjIvSk1lZGlhMkhUVFBDb25uZWN0aW9uLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvaW5jbHVkZS9tZWRpYXBsYXllcjIvSk1lZGlhMkhUVFBDb25uZWN0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTVmN2Y4MwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9pbmNsdWRlL21lZGlhcGxheWVyMi9KTWVkaWEySFRUUENvbm5lY3Rpb24uaApAQCAtMCwwICsxLDU4IEBACisvKgorICogQ29weXJpZ2h0IDIwMTcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9KX01FRElBMl9IVFRQX0NPTk5FQ1RJT05fSF8KKyNkZWZpbmUgX0pfTUVESUEyX0hUVFBfQ09OTkVDVElPTl9IXworCisjaW5jbHVkZSAiam5pLmgiCisKKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUhUVFBDb25uZWN0aW9uLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBKTWVkaWEySFRUUENvbm5lY3Rpb24gOiBwdWJsaWMgTWVkaWFIVFRQQ29ubmVjdGlvbiB7CisgICAgSk1lZGlhMkhUVFBDb25uZWN0aW9uKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXopOworCisgICAgdmlydHVhbCBib29sIGNvbm5lY3QoCisgICAgICAgICAgICBjb25zdCBjaGFyICp1cmksIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgdm9pZCBkaXNjb25uZWN0KCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzc2l6ZV90IHJlYWRBdChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgb2ZmNjRfdCBnZXRTaXplKCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNSU1FVHlwZShTdHJpbmc4ICptaW1lVHlwZSkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRVcmkoU3RyaW5nOCAqdXJpKSBvdmVycmlkZTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfkpNZWRpYTJIVFRQQ29ubmVjdGlvbigpOworCitwcml2YXRlOgorICAgIGpvYmplY3QgbU1lZGlhMkhUVFBDb25uZWN0aW9uT2JqOworICAgIGptZXRob2RJRCBtQ29ubmVjdE1ldGhvZDsKKyAgICBqbWV0aG9kSUQgbURpc2Nvbm5lY3RNZXRob2Q7CisgICAgam1ldGhvZElEIG1SZWFkQXRNZXRob2Q7CisgICAgam1ldGhvZElEIG1HZXRTaXplTWV0aG9kOworICAgIGptZXRob2RJRCBtR2V0TUlNRVR5cGVNZXRob2Q7CisgICAgam1ldGhvZElEIG1HZXRVcmlNZXRob2Q7CisKKyAgICBqYnl0ZUFycmF5IG1CeXRlQXJyYXlPYmo7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhKTWVkaWEySFRUUENvbm5lY3Rpb24pOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBfSl9NRURJQTJfSFRUUF9DT05ORUNUSU9OX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvaW5jbHVkZS9tZWRpYXBsYXllcjIvSk1lZGlhMkhUVFBTZXJ2aWNlLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvaW5jbHVkZS9tZWRpYXBsYXllcjIvSk1lZGlhMkhUVFBTZXJ2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmY2MWE3ZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9pbmNsdWRlL21lZGlhcGxheWVyMi9KTWVkaWEySFRUUFNlcnZpY2UuaApAQCAtMCwwICsxLDQ3IEBACisvKgorICogQ29weXJpZ2h0IDIwMTcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9KX01FRElBMl9IVFRQX1NFUlZJQ0VfSF8KKyNkZWZpbmUgX0pfTUVESUEyX0hUVFBfU0VSVklDRV9IXworCisjaW5jbHVkZSA8am5pLmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorCisjaW5jbHVkZSA8bWVkaWEvTWVkaWFIVFRQU2VydmljZS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhSFRUUENvbm5lY3Rpb24uaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEpNZWRpYTJIVFRQU2VydmljZSA6IHB1YmxpYyBNZWRpYUhUVFBTZXJ2aWNlIHsKKyAgICBKTWVkaWEySFRUUFNlcnZpY2UoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeik7CisKKyAgICB2aXJ0dWFsIHNwPE1lZGlhSFRUUENvbm5lY3Rpb24+IG1ha2VIVFRQQ29ubmVjdGlvbigpIG92ZXJyaWRlOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+Sk1lZGlhMkhUVFBTZXJ2aWNlKCk7CisKK3ByaXZhdGU6CisgICAgam9iamVjdCBtTWVkaWEySFRUUFNlcnZpY2VPYmo7CisKKyAgICBqbWV0aG9kSUQgbU1ha2VIVFRQQ29ubmVjdGlvbk1ldGhvZDsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEpNZWRpYTJIVFRQU2VydmljZSk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIF9KX01FRElBMl9IVFRQX1NFUlZJQ0VfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9pbmNsdWRlL21lZGlhcGxheWVyMi9KT2JqZWN0SG9sZGVyLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvaW5jbHVkZS9tZWRpYXBsYXllcjIvSk9iamVjdEhvbGRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzZDhiNDAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvaW5jbHVkZS9tZWRpYXBsYXllcjIvSk9iamVjdEhvbGRlci5oCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgSk9CSkVDVF9IT0xERVJfSF8KKworI2RlZmluZSBKT0JKRUNUX0hPTERFUl9IXworCisjaW5jbHVkZSAiam5pLmgiCisjaW5jbHVkZSA8bWVkaWFwbGF5ZXIyL0phdmFWTUhlbHBlci5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBIZWxwZXIgY2xhc3MgZm9yIG1hbmFnaW5nIGdsb2JhbCByZWZlcmVuY2Ugb2Ygam9iamVjdC4KK3N0cnVjdCBKT2JqZWN0SG9sZGVyIDogcHVibGljIFJlZkJhc2UgeworICAgIEpPYmplY3RIb2xkZXIoam9iamVjdCBvYmopIHsKKyAgICAgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOworICAgICAgICBtSk9iamVjdCA9IHJlaW50ZXJwcmV0X2Nhc3Q8am9iamVjdD4oZW52LT5OZXdHbG9iYWxSZWYob2JqKSk7CisgICAgfQorCisgICAgdmlydHVhbCB+Sk9iamVjdEhvbGRlcigpIHsKKyAgICAgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOworICAgICAgICBlbnYtPkRlbGV0ZUdsb2JhbFJlZihtSk9iamVjdCk7CisgICAgfQorCisgICAgam9iamVjdCBnZXRKT2JqZWN0KCkgeyByZXR1cm4gbUpPYmplY3Q7IH0KKworcHJpdmF0ZToKKyAgICBqb2JqZWN0IG1KT2JqZWN0OworfTsKKworfSAgLy8iIGFuZHJvaWQKKworI2VuZGlmICAvLyBKT0JKRUNUX0hPTERFUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL2luY2x1ZGUvbWVkaWFwbGF5ZXIyL0phdmFWTUhlbHBlci5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL2luY2x1ZGUvbWVkaWFwbGF5ZXIyL0phdmFWTUhlbHBlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1MDkxYjcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvaW5jbHVkZS9tZWRpYXBsYXllcjIvSmF2YVZNSGVscGVyLmgKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBKQVZBX1ZNX0hFTFBFUl9IXworCisjZGVmaW5lIEpBVkFfVk1fSEVMUEVSX0hfCisKKyNpbmNsdWRlICJqbmkuaCIKKworI2luY2x1ZGUgPGF0b21pYz4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgSmF2YVZNSGVscGVyIHsKKyAgICBzdGF0aWMgSk5JRW52ICpnZXRKTklFbnYoKTsKKyAgICBzdGF0aWMgdm9pZCBzZXRKYXZhVk0oSmF2YVZNICp2bSk7CisKK3ByaXZhdGU6CisgICAgLy8gT25jZSBhIHZhbGlkIEphdmFWTSBoYXMgYmVlbiBzZXQsIGl0IHNob3VsZCBuZXZlciBiZSByZXNldCBvciBjaGFuZ2VkLgorICAgIC8vIEhvd2V2ZXIsIGFzIGl0IG1heSBiZSBhY2Nlc3NlZCBmcm9tIG11bHRpcGxlIHRocmVhZHMsIGFjY2VzcyBuZWVkcyB0byBiZQorICAgIC8vIHN5bmNocm9uaXplZC4KKyAgICBzdGF0aWMgc3RkOjphdG9taWM8SmF2YVZNICo+IHNKYXZhVk07Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEpBVkFfVk1fSEVMUEVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvaW5jbHVkZS9tZWRpYXBsYXllcjIvTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9pbmNsdWRlL21lZGlhcGxheWVyMi9NZWRpYVBsYXllcjJBdWRpb091dHB1dC5oCmluZGV4IDVkNWI4ZTQuLmJkYTRmNjEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9pbmNsdWRlL21lZGlhcGxheWVyMi9NZWRpYVBsYXllcjJBdWRpb091dHB1dC5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9pbmNsdWRlL21lZGlhcGxheWVyMi9NZWRpYVBsYXllcjJBdWRpb091dHB1dC5oCkBAIC0xOSwxMCArMTksMTYgQEAKICNkZWZpbmUgQU5EUk9JRF9NRURJQVBMQVlFUjJBVURJT09VVFBVVF9ICiAKICNpbmNsdWRlIDxtZWRpYXBsYXllcjIvTWVkaWFQbGF5ZXIySW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8bWVkaWFwbGF5ZXIyL0pBdWRpb1RyYWNrLmg+CisjaW5jbHVkZSA8bWVkaWFwbGF5ZXIyL0pPYmplY3RIb2xkZXIuaD4KIAorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDx1dGlsaXR5PgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzE2Lmg+CiAjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CiAKKyNpbmNsdWRlICJqbmkuaCIKKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBjbGFzcyBBdWRpb1RyYWNrOwpAQCAtMzIsMTUgKzM4LDE0IEBACiAgICAgY2xhc3MgQ2FsbGJhY2tEYXRhOwogCiBwdWJsaWM6Ci0gICAgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQoYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwKKyAgICBNZWRpYVBsYXllcjJBdWRpb091dHB1dChpbnQzMl90IHNlc3Npb25JZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKiBhdHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvU3lzdGVtOjpBdWRpb0RldmljZUNhbGxiYWNrPiYgZGV2aWNlQ2FsbGJhY2spOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGpvYmplY3QgYXR0cmlidXRlcyk7CiAgICAgdmlydHVhbCB+TWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQoKTsKIAogICAgIHZpcnR1YWwgYm9vbCByZWFkeSgpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIG1UcmFjayAhPSAwOworICAgICAgICByZXR1cm4gbUpBdWRpb1RyYWNrICE9IG51bGxwdHI7CiAgICAgfQogICAgIHZpcnR1YWwgc3NpemVfdCBidWZmZXJTaXplKCkgY29uc3Q7CiAgICAgdmlydHVhbCBzc2l6ZV90IGZyYW1lQ291bnQoKSBjb25zdDsKQEAgLTUyLDE3ICs1NywxNyBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0VGltZXN0YW1wKEF1ZGlvVGltZXN0YW1wICZ0cykgY29uc3Q7CiAgICAgdmlydHVhbCBpbnQ2NF90IGdldFBsYXllZE91dER1cmF0aW9uVXMoaW50NjRfdCBub3dVcykgY29uc3Q7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGcmFtZXNXcml0dGVuKHVpbnQzMl90ICpmcmFtZXN3cml0dGVuKSBjb25zdDsKLSAgICB2aXJ0dWFsIGF1ZGlvX3Nlc3Npb25fdCBnZXRTZXNzaW9uSWQoKSBjb25zdDsKKyAgICB2aXJ0dWFsIGludDMyX3QgZ2V0U2Vzc2lvbklkKCkgY29uc3Q7CisgICAgdmlydHVhbCB2b2lkIHNldFNlc3Npb25JZChjb25zdCBpbnQzMl90IGlkKTsKICAgICB2aXJ0dWFsIHVpbnQzMl90IGdldFNhbXBsZVJhdGUoKSBjb25zdDsKICAgICB2aXJ0dWFsIGludDY0X3QgZ2V0QnVmZmVyRHVyYXRpb25JblVzKCkgY29uc3Q7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW4oCiAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLCBpbnQgY2hhbm5lbENvdW50LCBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKLSAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwgaW50IGJ1ZmZlckNvdW50LAorICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICAgICAgQXVkaW9DYWxsYmFjayBjYiwgdm9pZCAqY29va2llLAogICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MgPSBBVURJT19PVVRQVVRfRkxBR19OT05FLAogICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvID0gTlVMTCwKLSAgICAgICAgICAgIGJvb2wgZG9Ob3RSZWNvbm5lY3QgPSBmYWxzZSwKICAgICAgICAgICAgIHVpbnQzMl90IHN1Z2dlc3RlZEZyYW1lQ291bnQgPSAwKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoKTsKQEAgLTcxLDEzICs3NiwxMCBAQAogICAgIHZpcnR1YWwgdm9pZCBmbHVzaCgpOwogICAgIHZpcnR1YWwgdm9pZCBwYXVzZSgpOwogICAgIHZpcnR1YWwgdm9pZCBjbG9zZSgpOwotICAgIHZvaWQgc2V0QXVkaW9TdHJlYW1UeXBlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSk7Ci0gICAgdmlydHVhbCBhdWRpb19zdHJlYW1fdHlwZV90IGdldEF1ZGlvU3RyZWFtVHlwZSgpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIG1TdHJlYW1UeXBlOwotICAgIH0KLSAgICB2b2lkIHNldEF1ZGlvQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKiBhdHRyaWJ1dGVzKTsKKyAgICB2b2lkIHNldEF1ZGlvQXR0cmlidXRlcyhjb25zdCBqb2JqZWN0IGF0dHJpYnV0ZXMpOworICAgIHZpcnR1YWwgYXVkaW9fc3RyZWFtX3R5cGVfdCBnZXRBdWRpb1N0cmVhbVR5cGUoKSBjb25zdDsKIAotICAgIHZvaWQgc2V0Vm9sdW1lKGZsb2F0IGxlZnQsIGZsb2F0IHJpZ2h0KTsKKyAgICB2b2lkIHNldFZvbHVtZShmbG9hdCB2b2x1bWUpOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGxheWJhY2tSYXRlKGNvbnN0IEF1ZGlvUGxheWJhY2tSYXRlJiByYXRlKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFBsYXliYWNrUmF0ZShBdWRpb1BsYXliYWNrUmF0ZSogcmF0ZSAvKiBub25udWxsICovKTsKIApAQCAtOTIsMTMgKzk0LDExIEBACiAgICAgICAgIC8vIFRPRE86IHJldHVybiBjb3JyZWN0IHZhbHVlLgogICAgICAgICAvL3JldHVybiBtTmV4dE91dHB1dCA9PSBOVUxMOwogICAgIH0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlycyk7Ci0gICAgdmlydHVhbCBTdHJpbmc4IGdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cyk7Ci0KICAgICAvLyBBdWRpb1JvdXRpbmcKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldE91dHB1dERldmljZShhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFJvdXRlZERldmljZUlkKGF1ZGlvX3BvcnRfaGFuZGxlX3QqIGRldmljZUlkKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGVuYWJsZUF1ZGlvRGV2aWNlQ2FsbGJhY2soYm9vbCBlbmFibGVkKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFByZWZlcnJlZERldmljZShqb2JqZWN0IGRldmljZSk7CisgICAgdmlydHVhbCBqb2JqZWN0IGdldFJvdXRlZERldmljZSgpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkQXVkaW9EZXZpY2VDYWxsYmFjayhqb2JqZWN0IHJvdXRpbmdEZWxlZ2F0ZSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrKGpvYmplY3QgbGlzdGVuZXIpOwogCiBwcml2YXRlOgogICAgIHN0YXRpYyB2b2lkIHNldE1pbkJ1ZmZlckNvdW50KCk7CkBAIC0xMDcsMjkgKzEwNywyNSBAQAogICAgIHZvaWQgY2xvc2VfbCgpOwogICAgIHN0YXR1c190IHVwZGF0ZVRyYWNrX2woKTsKIAotICAgIHNwPEF1ZGlvVHJhY2s+ICAgICAgICAgIG1UcmFjazsKKyAgICBzcDxKQXVkaW9UcmFjaz4gICAgICAgICBtSkF1ZGlvVHJhY2s7CiAgICAgQXVkaW9DYWxsYmFjayAgICAgICAgICAgbUNhbGxiYWNrOwogICAgIHZvaWQgKiAgICAgICAgICAgICAgICAgIG1DYWxsYmFja0Nvb2tpZTsKICAgICBDYWxsYmFja0RhdGEgKiAgICAgICAgICBtQ2FsbGJhY2tEYXRhOwotICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgICAgIG1TdHJlYW1UeXBlOwotICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCAqICAgIG1BdHRyaWJ1dGVzOwotICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgIG1MZWZ0Vm9sdW1lOwotICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgIG1SaWdodFZvbHVtZTsKKyAgICBzcDxKT2JqZWN0SG9sZGVyPiAgICAgICBtQXR0cmlidXRlczsKKyAgICBmbG9hdCAgICAgICAgICAgICAgICAgICBtVm9sdW1lOwogICAgIEF1ZGlvUGxheWJhY2tSYXRlICAgICAgIG1QbGF5YmFja1JhdGU7CiAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgbVNhbXBsZVJhdGVIejsgLy8gc2FtcGxlIHJhdGUgb2YgdGhlIGNvbnRlbnQsIGFzIHNldCBpbiBvcGVuKCkKICAgICBmbG9hdCAgICAgICAgICAgICAgICAgICBtTXNlY3NQZXJGcmFtZTsKICAgICBzaXplX3QgICAgICAgICAgICAgICAgICBtRnJhbWVTaXplOwotICAgIGF1ZGlvX3Nlc3Npb25fdCAgICAgICAgIG1TZXNzaW9uSWQ7CisgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgbVNlc3Npb25JZDsKICAgICB1aWRfdCAgICAgICAgICAgICAgICAgICBtVWlkOwogICAgIGludCAgICAgICAgICAgICAgICAgICAgIG1QaWQ7CiAgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgbVNlbmRMZXZlbDsKICAgICBpbnQgICAgICAgICAgICAgICAgICAgICBtQXV4RWZmZWN0SWQ7CiAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgICAgbUZsYWdzOwotICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgICAgIG1TZWxlY3RlZERldmljZUlkOwotICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgICAgIG1Sb3V0ZWREZXZpY2VJZDsKLSAgICBib29sICAgICAgICAgICAgICAgICAgICBtRGV2aWNlQ2FsbGJhY2tFbmFibGVkOwotICAgIHdwPEF1ZGlvU3lzdGVtOjpBdWRpb0RldmljZUNhbGxiYWNrPiAgICAgICAgbURldmljZUNhbGxiYWNrOworICAgIHNwPEpPYmplY3RIb2xkZXI+ICAgICAgIG1QcmVmZXJyZWREZXZpY2U7CiAgICAgbXV0YWJsZSBNdXRleCAgICAgICAgICAgbUxvY2s7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGpvYmplY3QsIGpvYmplY3Q+PiBtUm91dGluZ0RlbGVnYXRlczsgLy8gPGxpc3RlbmVyLCByb3V0aW5nRGVsZWdhdGU+CiAKICAgICAvLyBzdGF0aWMgdmFyaWFibGVzIGJlbG93IG5vdCBwcm90ZWN0ZWQgYnkgbXV0ZXgKICAgICBzdGF0aWMgYm9vbCAgICAgICAgICAgICBtSXNPbkVtdWxhdG9yOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL2luY2x1ZGUvbWVkaWFwbGF5ZXIyL01lZGlhUGxheWVyMkludGVyZmFjZS5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL2luY2x1ZGUvbWVkaWFwbGF5ZXIyL01lZGlhUGxheWVyMkludGVyZmFjZS5oCmluZGV4IDAyYmY4OTEuLjRiMTllMzggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9pbmNsdWRlL21lZGlhcGxheWVyMi9NZWRpYVBsYXllcjJJbnRlcmZhY2UuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvaW5jbHVkZS9tZWRpYXBsYXllcjIvTWVkaWFQbGF5ZXIySW50ZXJmYWNlLmgKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPGpuaS5oPgogCiAjaW5jbHVkZSA8bWVkaWEvQVZTeW5jU2V0dGluZ3MuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1Jlc2FtcGxlclB1YmxpYy5oPgpAQCAtMzMsNiArMzQsMTEgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIYW5kbGVyLmg+CiAjaW5jbHVkZSA8bWVkaWFwbGF5ZXIyL01lZGlhUGxheWVyMlR5cGVzLmg+CiAKKyNpbmNsdWRlICJqbmkuaCIKKyNpbmNsdWRlICJtZWRpYXBsYXllcjIucGIuaCIKKwordXNpbmcgYW5kcm9pZDo6bWVkaWE6Ok1lZGlhUGxheWVyMlByb3RvOjpQbGF5ZXJNZXNzYWdlOworCiAvLyBGd2QgZGVjbCB0byBtYWtlIHN1cmUgZXZlcnlvbmUgYWdyZWVzIHRoYXQgdGhlIHNjb3BlIG9mIHN0cnVjdCBzb2NrYWRkcl9pbiBpcwogLy8gZ2xvYmFsLCBhbmQgbm90IGluIGFuZHJvaWQ6Ogogc3RydWN0IHNvY2thZGRyX2luOwpAQCAtNDMsNyArNDksNiBAQAogY2xhc3MgUGFyY2VsOwogc3RydWN0IEFOYXRpdmVXaW5kb3dXcmFwcGVyOwogCi0jZGVmaW5lIERFRkFVTFRfQVVESU9TSU5LX0JVRkZFUkNPVU5UIDQKICNkZWZpbmUgREVGQVVMVF9BVURJT1NJTktfQlVGRkVSU0laRSAxMjAwCiAjZGVmaW5lIERFRkFVTFRfQVVESU9TSU5LX1NBTVBMRVJBVEUgNDQxMDAKIApAQCAtNTYsNyArNjEsOCBAQAogY2xhc3MgTWVkaWFQbGF5ZXIySW50ZXJmYWNlTGlzdGVuZXI6IHB1YmxpYyBSZWZCYXNlCiB7CiBwdWJsaWM6Ci0gICAgdmlydHVhbCB2b2lkIG5vdGlmeShpbnQ2NF90IHNyY0lkLCBpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIsIGNvbnN0IFBhcmNlbCAqb2JqKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIG5vdGlmeShpbnQ2NF90IHNyY0lkLCBpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIsCisgICAgICAgICAgIGNvbnN0IFBsYXllck1lc3NhZ2UgKm9iaikgPSAwOwogfTsKIAogY2xhc3MgTWVkaWFQbGF5ZXIySW50ZXJmYWNlIDogcHVibGljIEFIYW5kbGVyIHsKQEAgLTg4LDcgKzk0LDcgQEAKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRUaW1lc3RhbXAoQXVkaW9UaW1lc3RhbXAgJnRzKSBjb25zdCA9IDA7CiAgICAgICAgIHZpcnR1YWwgaW50NjRfdCBnZXRQbGF5ZWRPdXREdXJhdGlvblVzKGludDY0X3Qgbm93VXMpIGNvbnN0ID0gMDsKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGcmFtZXNXcml0dGVuKHVpbnQzMl90ICpmcmFtZXN3cml0dGVuKSBjb25zdCA9IDA7Ci0gICAgICAgIHZpcnR1YWwgYXVkaW9fc2Vzc2lvbl90IGdldFNlc3Npb25JZCgpIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCBpbnQzMl90IGdldFNlc3Npb25JZCgpIGNvbnN0ID0gMDsKICAgICAgICAgdmlydHVhbCBhdWRpb19zdHJlYW1fdHlwZV90IGdldEF1ZGlvU3RyZWFtVHlwZSgpIGNvbnN0ID0gMDsKICAgICAgICAgdmlydHVhbCB1aW50MzJfdCBnZXRTYW1wbGVSYXRlKCkgY29uc3QgPSAwOwogICAgICAgICB2aXJ0dWFsIGludDY0X3QgZ2V0QnVmZmVyRHVyYXRpb25JblVzKCkgY29uc3QgPSAwOwpAQCAtOTgsMTIgKzEwNCwxMCBAQAogICAgICAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW4oCiAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwgaW50IGNoYW5uZWxDb3VudCwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0PUFVRElPX0ZPUk1BVF9QQ01fMTZfQklULAotICAgICAgICAgICAgICAgIGludCBidWZmZXJDb3VudD1ERUZBVUxUX0FVRElPU0lOS19CVUZGRVJDT1VOVCwKICAgICAgICAgICAgICAgICBBdWRpb0NhbGxiYWNrIGNiID0gTlVMTCwKICAgICAgICAgICAgICAgICB2b2lkICpjb29raWUgPSBOVUxMLAogICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzID0gQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwKICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8gPSBOVUxMLAotICAgICAgICAgICAgICAgIGJvb2wgZG9Ob3RSZWNvbm5lY3QgPSBmYWxzZSwKICAgICAgICAgICAgICAgICB1aW50MzJfdCBzdWdnZXN0ZWRGcmFtZUNvdW50ID0gMCkgPSAwOwogCiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoKSA9IDA7CkBAIC0xMzksOSArMTQzLDEwIEBACiAgICAgICAgIH0KIAogICAgICAgICAvLyBBdWRpb1JvdXRpbmcKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRPdXRwdXREZXZpY2UoYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCk7Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgZ2V0Um91dGVkRGV2aWNlSWQoYXVkaW9fcG9ydF9oYW5kbGVfdCogZGV2aWNlSWQpOwotICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGVuYWJsZUF1ZGlvRGV2aWNlQ2FsbGJhY2soYm9vbCBlbmFibGVkKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRQcmVmZXJyZWREZXZpY2Uoam9iamVjdCBkZXZpY2UpOworICAgICAgICB2aXJ0dWFsIGpvYmplY3QgICAgIGdldFJvdXRlZERldmljZSgpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2soam9iamVjdCByb3V0aW5nRGVsZWdhdGUpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2soam9iamVjdCBsaXN0ZW5lcik7CiAgICAgfTsKIAogICAgIE1lZGlhUGxheWVyMkludGVyZmFjZSgpIDogbUxpc3RlbmVyKE5VTEwpIHsgfQpAQCAtMTcxLDcgKzE3Niw2IEBACiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHByZXBhcmVBc3luYygpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KCkgPSAwOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IHBhdXNlKCkgPSAwOwogICAgIHZpcnR1YWwgYm9vbCBpc1BsYXlpbmcoKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQbGF5YmFja1NldHRpbmdzKGNvbnN0IEF1ZGlvUGxheWJhY2tSYXRlJiByYXRlKSB7CkBAIC0yMTgsNyArMjIyLDcgQEAKICAgICAvLyAgICAgICAgICAgICAgICBkYXRhIHNlbnQgYnkgdGhlIGphdmEgbGF5ZXIuCiAgICAgLy8gQHBhcmFtW291dF0gcmVwbHkgUGFyY2VsIHRvIGhvbGQgdGhlIHJlcGx5IGRhdGEuIENhbm5vdCBiZSBudWxsLgogICAgIC8vIEByZXR1cm4gT0sgaWYgdGhlIGNhbGwgd2FzIHN1Y2Nlc3NmdWwuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBpbnZva2UoY29uc3QgUGFyY2VsJiByZXF1ZXN0LCBQYXJjZWwgKnJlcGx5KSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBpbnZva2UoY29uc3QgUGxheWVyTWVzc2FnZSAmcmVxdWVzdCwgUGxheWVyTWVzc2FnZSAqcmVwbHkpID0gMDsKIAogICAgIC8vIFRoZSBDbGllbnQgaW4gdGhlIE1ldGFkYXRhUGxheWVyU2VydmljZSBjYWxscyB0aGlzIG1ldGhvZCBvbgogICAgIC8vIHRoZSBuYXRpdmUgcGxheWVyIHRvIHJldHJpZXZlIGFsbCBvciBhIHN1YnNldCBvZiBtZXRhZGF0YS4KQEAgLTIzNyw3ICsyNDEsNyBAQAogICAgICAgICBtTGlzdGVuZXIgPSBsaXN0ZW5lcjsKICAgICB9CiAKLSAgICB2b2lkIHNlbmRFdmVudChpbnQ2NF90IHNyY0lkLCBpbnQgbXNnLCBpbnQgZXh0MT0wLCBpbnQgZXh0Mj0wLCBjb25zdCBQYXJjZWwgKm9iaj1OVUxMKSB7CisgICAgdm9pZCBzZW5kRXZlbnQoaW50NjRfdCBzcmNJZCwgaW50IG1zZywgaW50IGV4dDE9MCwgaW50IGV4dDI9MCwgY29uc3QgUGxheWVyTWVzc2FnZSAqb2JqPU5VTEwpIHsKICAgICAgICAgc3A8TWVkaWFQbGF5ZXIySW50ZXJmYWNlTGlzdGVuZXI+IGxpc3RlbmVyOwogICAgICAgICB7CiAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxpc3RlbmVyTG9jayk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvaW5jbHVkZS9tZWRpYXBsYXllcjIvTWVkaWFQbGF5ZXIyVHlwZXMuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9pbmNsdWRlL21lZGlhcGxheWVyMi9NZWRpYVBsYXllcjJUeXBlcy5oCmluZGV4IDM5MDViNTUuLjI0MzAyODkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9pbmNsdWRlL21lZGlhcGxheWVyMi9NZWRpYVBsYXllcjJUeXBlcy5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9pbmNsdWRlL21lZGlhcGxheWVyMi9NZWRpYVBsYXllcjJUeXBlcy5oCkBAIC0zNCw4ICszNCw3IEBACiAgICAgTUVESUEyX1NFVF9WSURFT19TSVpFICAgID0gNSwKICAgICBNRURJQTJfU1RBUlRFRCAgICAgICAgICAgPSA2LAogICAgIE1FRElBMl9QQVVTRUQgICAgICAgICAgICA9IDcsCi0gICAgTUVESUEyX1NUT1BQRUQgICAgICAgICAgID0gOCwKLSAgICBNRURJQTJfU0tJUFBFRCAgICAgICAgICAgPSA5LAorICAgIE1FRElBMl9TS0lQUEVEICAgICAgICAgICA9IDgsCiAgICAgTUVESUEyX05PVElGWV9USU1FICAgICAgID0gOTgsCiAgICAgTUVESUEyX1RJTUVEX1RFWFQgICAgICAgID0gOTksCiAgICAgTUVESUEyX0VSUk9SICAgICAgICAgICAgID0gMTAwLApAQCAtNDMsNyArNDIsNiBAQAogICAgIE1FRElBMl9TVUJUSVRMRV9EQVRBICAgICA9IDIwMSwKICAgICBNRURJQTJfTUVUQV9EQVRBICAgICAgICAgPSAyMDIsCiAgICAgTUVESUEyX0RSTV9JTkZPICAgICAgICAgID0gMjEwLAotICAgIE1FRElBMl9BVURJT19ST1VUSU5HX0NIQU5HRUQgPSAxMDAwMCwKIH07CiAKIC8vIEdlbmVyaWMgZXJyb3IgY29kZXMgZm9yIHRoZSBtZWRpYSBwbGF5ZXIgZnJhbWV3b3JrLiAgRXJyb3JzIGFyZSBmYXRhbCwgdGhlCkBAIC05NiwxNyArOTQsMjAgQEAKIGVudW0gbWVkaWEyX2luZm9fdHlwZSB7CiAgICAgLy8gMHh4CiAgICAgTUVESUEyX0lORk9fVU5LTk9XTiA9IDEsCi0gICAgLy8gVGhlIHBsYXllciB3YXMgc3RhcnRlZCBiZWNhdXNlIGl0IHdhcyB1c2VkIGFzIHRoZSBuZXh0IHBsYXllciBmb3IgYW5vdGhlcgotICAgIC8vIHBsYXllciwgd2hpY2gganVzdCBjb21wbGV0ZWQgcGxheWJhY2sKLSAgICBNRURJQTJfSU5GT19TVEFSVEVEX0FTX05FWFQgPSAyLAorICAgIC8vIFRoZSBwbGF5ZXIganVzdCBzdGFydGVkIHRoZSBwbGF5YmFjayBvZiB0aGlzIGRhdGEgc291cmNlLgorICAgIE1FRElBMl9JTkZPX0RBVEFfU09VUkNFX1NUQVJUID0gMiwKICAgICAvLyBUaGUgcGxheWVyIGp1c3QgcHVzaGVkIHRoZSB2ZXJ5IGZpcnN0IHZpZGVvIGZyYW1lIGZvciByZW5kZXJpbmcKICAgICBNRURJQTJfSU5GT19WSURFT19SRU5ERVJJTkdfU1RBUlQgPSAzLAogICAgIC8vIFRoZSBwbGF5ZXIganVzdCBwdXNoZWQgdGhlIHZlcnkgZmlyc3QgYXVkaW8gZnJhbWUgZm9yIHJlbmRlcmluZwogICAgIE1FRElBMl9JTkZPX0FVRElPX1JFTkRFUklOR19TVEFSVCA9IDQsCiAgICAgLy8gVGhlIHBsYXllciBqdXN0IGNvbXBsZXRlZCB0aGUgcGxheWJhY2sgb2YgdGhpcyBkYXRhIHNvdXJjZQotICAgIE1FRElBMl9JTkZPX1BMQVlCQUNLX0NPTVBMRVRFID0gNSwKLSAgICAvLyBUaGUgcGxheWVyIGp1c3QgY29tcGxldGVkIHRoZSBwbGF5YmFjayBvZiB0aGUgZnVsbCBwbGF5IGxpc3QKLSAgICBNRURJQTJfSU5GT19QTEFZTElTVF9FTkQgPSA2LAorICAgIE1FRElBMl9JTkZPX0RBVEFfU09VUkNFX0VORCA9IDUsCisgICAgLy8gVGhlIHBsYXllciBqdXN0IGNvbXBsZXRlZCB0aGUgcGxheWJhY2sgb2YgYWxsIGRhdGEgc291cmNlcy4KKyAgICAvLyBCdXQgdGhpcyBpcyBub3QgdmlzaWJsZSBpbiBuYXRpdmUgY29kZS4gSnVzdCBrZWVwIHRoaXMgZW50cnkgZm9yIGNvbXBsZXRlbmVzcy4KKyAgICBNRURJQTJfSU5GT19EQVRBX1NPVVJDRV9MSVNUX0VORCA9IDYsCisgICAgLy8gVGhlIHBsYXllciBqdXN0IGNvbXBsZXRlZCBhbiBpdGVyYXRpb24gb2YgcGxheWJhY2sgbG9vcC4gVGhpcyBldmVudCBpcyBzZW50IG9ubHkgd2hlbgorICAgIC8vIGxvb3BpbmcgaXMgZW5hYmxlZC4KKyAgICBNRURJQTJfSU5GT19EQVRBX1NPVVJDRV9SRVBFQVQgPSA3LAogCiAgICAgLy8xeHgKICAgICAvLyBUaGUgcGxheWVyIGp1c3QgcHJlcGFyZWQgYSBkYXRhIHNvdXJjZS4KQEAgLTE1MCwxMSArMTUxLDExIEBACiAKIC8vIERvIG5vdCBjaGFuZ2UgdGhlc2UgdmFsdWVzIHdpdGhvdXQgdXBkYXRpbmcgdGhlaXIgY291bnRlcnBhcnRzIGluIE1lZGlhUGxheWVyMi5qYXZhCiBlbnVtIG1lZGlhcGxheWVyMl9zdGF0ZXMgewotICAgIE1FRElBUExBWUVSMl9TVEFURV9JRExFICAgICAgICAgPSAxLAotICAgIE1FRElBUExBWUVSMl9TVEFURV9QUkVQQVJFRCAgICAgPSAyLAotICAgIE1FRElBUExBWUVSMl9TVEFURV9QTEFZSU5HICAgICAgPSAzLAotICAgIE1FRElBUExBWUVSMl9TVEFURV9QQVVTRUQgICAgICAgPSA0LAotICAgIE1FRElBUExBWUVSMl9TVEFURV9FUlJPUiAgICAgICAgPSA1LAorICAgIE1FRElBUExBWUVSMl9TVEFURV9JRExFICAgICAgICAgPSAxMDAxLAorICAgIE1FRElBUExBWUVSMl9TVEFURV9QUkVQQVJFRCAgICAgPSAxMDAyLAorICAgIE1FRElBUExBWUVSMl9TVEFURV9QQVVTRUQgICAgICAgPSAxMDAzLAorICAgIE1FRElBUExBWUVSMl9TVEFURV9QTEFZSU5HICAgICAgPSAxMDA0LAorICAgIE1FRElBUExBWUVSMl9TVEFURV9FUlJPUiAgICAgICAgPSAxMDA1LAogfTsKIAogZW51bSBtZWRpYV9wbGF5ZXIyX2ludGVybmFsX3N0YXRlcyB7CkBAIC0xNjUsOCArMTY2LDcgQEAKICAgICBNRURJQV9QTEFZRVIyX1BSRVBBUkVEICAgICAgICAgICA9IDEgPDwgMywKICAgICBNRURJQV9QTEFZRVIyX1NUQVJURUQgICAgICAgICAgICA9IDEgPDwgNCwKICAgICBNRURJQV9QTEFZRVIyX1BBVVNFRCAgICAgICAgICAgICA9IDEgPDwgNSwKLSAgICBNRURJQV9QTEFZRVIyX1NUT1BQRUQgICAgICAgICAgICA9IDEgPDwgNiwKLSAgICBNRURJQV9QTEFZRVIyX1BMQVlCQUNLX0NPTVBMRVRFICA9IDEgPDwgNworICAgIE1FRElBX1BMQVlFUjJfUExBWUJBQ0tfQ09NUExFVEUgID0gMSA8PCA2CiB9OwogCiAvLyBLZWVwIEtFWV9QQVJBTUVURVJfKiBpbiBzeW5jIHdpdGggTWVkaWFQbGF5ZXIyLmphdmEuCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvaW5jbHVkZS9tZWRpYXBsYXllcjIvbWVkaWFwbGF5ZXIyLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvaW5jbHVkZS9tZWRpYXBsYXllcjIvbWVkaWFwbGF5ZXIyLmgKaW5kZXggZDU4NjE5Mi4uNGJjMWE0YSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL2luY2x1ZGUvbWVkaWFwbGF5ZXIyL21lZGlhcGxheWVyMi5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9pbmNsdWRlL21lZGlhcGxheWVyMi9tZWRpYXBsYXllcjIuaApAQCAtMjQsNyArMjQsOSBAQAogI2luY2x1ZGUgPG1lZGlhL21lZGlhcGxheWVyX2NvbW1vbi5oPgogI2luY2x1ZGUgPG1lZGlhcGxheWVyMi9NZWRpYVBsYXllcjJJbnRlcmZhY2UuaD4KICNpbmNsdWRlIDxtZWRpYXBsYXllcjIvTWVkaWFQbGF5ZXIyVHlwZXMuaD4KKyNpbmNsdWRlIDxtZWRpYXBsYXllcjIvSk9iamVjdEhvbGRlci5oPgogCisjaW5jbHVkZSA8am5pLmg+CiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CiAjaW5jbHVkZSA8dXRpbHMvTXV0ZXguaD4KICNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CkBAIC0zMiw2ICszNCw4IEBACiAjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLWJhc2UuaD4KIAorI2luY2x1ZGUgImpuaS5oIgorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0cnVjdCBBTmF0aXZlV2luZG93V3JhcHBlcjsKQEAgLTQyLDcgKzQ2LDggQEAKIGNsYXNzIE1lZGlhUGxheWVyMkxpc3RlbmVyOiB2aXJ0dWFsIHB1YmxpYyBSZWZCYXNlCiB7CiBwdWJsaWM6Ci0gICAgdmlydHVhbCB2b2lkIG5vdGlmeShpbnQ2NF90IHNyY0lkLCBpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIsIGNvbnN0IFBhcmNlbCAqb2JqKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIG5vdGlmeShpbnQ2NF90IHNyY0lkLCBpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIsCisgICAgICAgICAgICBjb25zdCBQbGF5ZXJNZXNzYWdlICpvYmogPSBOVUxMKSA9IDA7CiB9OwogCiBjbGFzcyBNZWRpYVBsYXllcjIgOiBwdWJsaWMgTWVkaWFQbGF5ZXIySW50ZXJmYWNlTGlzdGVuZXIKQEAgLTUwLDcgKzU1LDcgQEAKIHB1YmxpYzoKICAgICB+TWVkaWFQbGF5ZXIyKCk7CiAKLSAgICBzdGF0aWMgc3A8TWVkaWFQbGF5ZXIyPiBDcmVhdGUoKTsKKyAgICBzdGF0aWMgc3A8TWVkaWFQbGF5ZXIyPiBDcmVhdGUoaW50MzJfdCBzZXNzaW9uSWQpOwogICAgIHN0YXRpYyBzdGF0dXNfdCBEdW1wQWxsKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CiAKICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICBkaXNjb25uZWN0KCk7CkBAIC02NSwxMCArNzAsOSBAQAogICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHNldEJ1ZmZlcmluZ1NldHRpbmdzKGNvbnN0IEJ1ZmZlcmluZ1NldHRpbmdzJiBidWZmZXJpbmcpOwogICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHByZXBhcmVBc3luYygpOwogICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHN0YXJ0KCk7Ci0gICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgc3RvcCgpOwogICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHBhdXNlKCk7CiAgICAgICAgICAgICBib29sICAgICAgICAgICAgaXNQbGF5aW5nKCk7Ci0gICAgICAgICAgICBtZWRpYXBsYXllcjJfc3RhdGVzIGdldE1lZGlhUGxheWVyMlN0YXRlKCk7CisgICAgICAgICAgICBtZWRpYXBsYXllcjJfc3RhdGVzIGdldFN0YXRlKCk7CiAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgc2V0UGxheWJhY2tTZXR0aW5ncyhjb25zdCBBdWRpb1BsYXliYWNrUmF0ZSYgcmF0ZSk7CiAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgZ2V0UGxheWJhY2tTZXR0aW5ncyhBdWRpb1BsYXliYWNrUmF0ZSogcmF0ZSAvKiBub25udWxsICovKTsKICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzZXRTeW5jU2V0dGluZ3MoY29uc3QgQVZTeW5jU2V0dGluZ3MmIHN5bmMsIGZsb2F0IHZpZGVvRnBzSGludCk7CkBAIC04OCw1NCArOTIsNDQgQEAKICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBnZXRBdWRpb1N0cmVhbVR5cGUoYXVkaW9fc3RyZWFtX3R5cGVfdCAqdHlwZSk7CiAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgc2V0TG9vcGluZyhpbnQgbG9vcCk7CiAgICAgICAgICAgICBib29sICAgICAgICAgICAgaXNMb29waW5nKCk7Ci0gICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgc2V0Vm9sdW1lKGZsb2F0IGxlZnRWb2x1bWUsIGZsb2F0IHJpZ2h0Vm9sdW1lKTsKKyAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzZXRWb2x1bWUoZmxvYXQgdm9sdW1lKTsKICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICBub3RpZnkoaW50NjRfdCBzcmNJZCwgaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYXJjZWwgKm9iaiA9IE5VTEwpOwotICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIGludm9rZShjb25zdCBQYXJjZWwmIHJlcXVlc3QsIFBhcmNlbCAqcmVwbHkpOwotICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHNldE1ldGFkYXRhRmlsdGVyKGNvbnN0IFBhcmNlbCYgZmlsdGVyKTsKLSAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBnZXRNZXRhZGF0YShib29sIHVwZGF0ZV9vbmx5LCBib29sIGFwcGx5X2ZpbHRlciwgUGFyY2VsICptZXRhZGF0YSk7Ci0gICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgc2V0QXVkaW9TZXNzaW9uSWQoYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCk7Ci0gICAgICAgICAgICBhdWRpb19zZXNzaW9uX3QgZ2V0QXVkaW9TZXNzaW9uSWQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGxheWVyTWVzc2FnZSAqb2JqID0gTlVMTCk7CisgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgaW52b2tlKGNvbnN0IFBsYXllck1lc3NhZ2UgJnJlcXVlc3QsIFBsYXllck1lc3NhZ2UgKnJlcGx5KTsKKyAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzZXRBdWRpb1Nlc3Npb25JZChpbnQzMl90IHNlc3Npb25JZCk7CisgICAgICAgICAgICBpbnQzMl90ICAgICAgICAgZ2V0QXVkaW9TZXNzaW9uSWQoKTsKICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzZXRBdXhFZmZlY3RTZW5kTGV2ZWwoZmxvYXQgbGV2ZWwpOwogICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIGF0dGFjaEF1eEVmZmVjdChpbnQgZWZmZWN0SWQpOwotICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHNldFBhcmFtZXRlcihpbnQga2V5LCBjb25zdCBQYXJjZWwmIHJlcXVlc3QpOworICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHNldEF1ZGlvQXR0cmlidXRlcyhjb25zdCBqb2JqZWN0IGF0dHJpYnV0ZXMpOworICAgICAgICAgICAgam9iamVjdCAgICAgICAgIGdldEF1ZGlvQXR0cmlidXRlcygpOwogICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIGdldFBhcmFtZXRlcihpbnQga2V5LCBQYXJjZWwqIHJlcGx5KTsKIAogICAgICAgICAgICAgLy8gTW9kdWxhciBEUk0KICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBwcmVwYXJlRHJtKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgZHJtU2Vzc2lvbklkKTsKICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICByZWxlYXNlRHJtKCk7CiAgICAgICAgICAgICAvLyBBdWRpb1JvdXRpbmcKLSAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzZXRPdXRwdXREZXZpY2UoYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCk7Ci0gICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGdldFJvdXRlZERldmljZUlkKCk7Ci0gICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgZW5hYmxlQXVkaW9EZXZpY2VDYWxsYmFjayhib29sIGVuYWJsZWQpOworICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHNldFByZWZlcnJlZERldmljZShqb2JqZWN0IGRldmljZSk7CisgICAgICAgICAgICBqb2JqZWN0ICAgICAgICAgZ2V0Um91dGVkRGV2aWNlKCk7CisgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgYWRkQXVkaW9EZXZpY2VDYWxsYmFjayhqb2JqZWN0IHJvdXRpbmdEZWxlZ2F0ZSk7CisgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgcmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjayhqb2JqZWN0IGxpc3RlbmVyKTsKIAogICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKIAogcHJpdmF0ZToKLSAgICBNZWRpYVBsYXllcjIoKTsKKyAgICBNZWRpYVBsYXllcjIoaW50MzJfdCBzZXNzaW9uSWQpOwogICAgIGJvb2wgaW5pdCgpOwogCi0gICAgLy8gQHBhcmFtIHR5cGUgT2YgdGhlIG1ldGFkYXRhIHRvIGJlIHRlc3RlZC4KLSAgICAvLyBAcmV0dXJuIHRydWUgaWYgdGhlIG1ldGFkYXRhIHNob3VsZCBiZSBkcm9wcGVkIGFjY29yZGluZyB0bwotICAgIC8vICAgICAgICAgICAgICB0aGUgZmlsdGVycy4KLSAgICBib29sIHNob3VsZERyb3BNZXRhZGF0YShtZWRpYTo6TWV0YWRhdGE6OlR5cGUgdHlwZSkgY29uc3Q7Ci0KLSAgICAvLyBBZGQgYSBuZXcgZWxlbWVudCB0byB0aGUgc2V0IG9mIG1ldGFkYXRhIHVwZGF0ZWQuIE5vb3AgaWYKLSAgICAvLyB0aGUgZWxlbWVudCBleGlzdHMgYWxyZWFkeS4KLSAgICAvLyBAcGFyYW0gdHlwZSBPZiB0aGUgbWV0YWRhdGEgdG8gYmUgcmVjb3JkZWQuCi0gICAgdm9pZCBhZGROZXdNZXRhZGF0YVVwZGF0ZShtZWRpYTo6TWV0YWRhdGE6OlR5cGUgdHlwZSk7Ci0KICAgICAvLyBEaXNjb25uZWN0IGZyb20gdGhlIGN1cnJlbnRseSBjb25uZWN0ZWQgQU5hdGl2ZVdpbmRvdy4KICAgICB2b2lkIGRpc2Nvbm5lY3ROYXRpdmVXaW5kb3dfbCgpOwogCi0gICAgc3RhdHVzX3Qgc2V0QXVkaW9BdHRyaWJ1dGVzX2woY29uc3QgUGFyY2VsICZyZXF1ZXN0KTsKKyAgICBzdGF0dXNfdCBzZXRBdWRpb0F0dHJpYnV0ZXNfbChjb25zdCBqb2JqZWN0IGF0dHJpYnV0ZXMpOwogCiAgICAgdm9pZCBjbGVhcl9sKCk7CiAgICAgc3RhdHVzX3Qgc2Vla1RvX2woaW50NjRfdCBtc2VjLCBNZWRpYVBsYXllcjJTZWVrTW9kZSBtb2RlKTsKICAgICBzdGF0dXNfdCBwcmVwYXJlQXN5bmNfbCgpOwogICAgIHN0YXR1c190IGdldER1cmF0aW9uX2woaW50NjRfdCAqbXNlYyk7CiAgICAgc3RhdHVzX3QgcmVzZXRfbCgpOwotICAgIHN0YXR1c190IGNoZWNrU3RhdGVGb3JLZXlTZXRfbChpbnQga2V5KTsKKyAgICBzdGF0dXNfdCBjaGVja1N0YXRlX2woKTsKIAogICAgIHBpZF90ICAgICAgICAgICAgICAgICAgICAgICBtUGlkOwogICAgIHVpZF90ICAgICAgICAgICAgICAgICAgICAgICBtVWlkOwpAQCAtMTUyLDI3ICsxNDYsMTQgQEAKICAgICBpbnQ2NF90ICAgICAgICAgICAgICAgICAgICAgbVNlZWtQb3NpdGlvbjsKICAgICBNZWRpYVBsYXllcjJTZWVrTW9kZSAgICAgICAgbVNlZWtNb2RlOwogICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgICAgICAgICBtU3RyZWFtVHlwZTsKLSAgICBQYXJjZWwqICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvQXR0cmlidXRlc1BhcmNlbDsKICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgbUxvb3A7Ci0gICAgZmxvYXQgICAgICAgICAgICAgICAgICAgICAgIG1MZWZ0Vm9sdW1lOwotICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgICAgICBtUmlnaHRWb2x1bWU7CisgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgICAgIG1Wb2x1bWU7CiAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIG1WaWRlb1dpZHRoOwogICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICBtVmlkZW9IZWlnaHQ7Ci0gICAgYXVkaW9fc2Vzc2lvbl90ICAgICAgICAgICAgIG1BdWRpb1Nlc3Npb25JZDsKLSAgICBhdWRpb19hdHRyaWJ1dGVzX3QgKiAgICAgICAgbUF1ZGlvQXR0cmlidXRlczsKKyAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvU2Vzc2lvbklkOworICAgIHNwPEpPYmplY3RIb2xkZXI+ICAgICAgICAgICBtQXVkaW9BdHRyaWJ1dGVzOwogICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgICAgICBtU2VuZExldmVsOwotCiAgICAgc3A8QU5hdGl2ZVdpbmRvd1dyYXBwZXI+ICAgIG1Db25uZWN0ZWRXaW5kb3c7Ci0KLSAgICAvLyBNZXRhZGF0YSBmaWx0ZXJzLgotICAgIG1lZGlhOjpNZXRhZGF0YTo6RmlsdGVyIG1NZXRhZGF0YUFsbG93OyAgLy8gcHJvdGVjdGVkIGJ5IG1Mb2NrCi0gICAgbWVkaWE6Ok1ldGFkYXRhOjpGaWx0ZXIgbU1ldGFkYXRhRHJvcDsgIC8vIHByb3RlY3RlZCBieSBtTG9jawotCi0gICAgLy8gTWV0YWRhdGEgdXBkYXRlZC4gRm9yIGVhY2ggTUVESUFfSU5GT19NRVRBREFUQV9VUERBVEUKLSAgICAvLyBub3RpZmljYXRpb24gd2UgdHJ5IHRvIHVwZGF0ZSBtTWV0YWRhdGFVcGRhdGVkIHdoaWNoIGlzIGEKLSAgICAvLyBzZXQ6IG5vIGR1cGxpY2F0ZS4KLSAgICAvLyBnZXRNZXRhZGF0YSBjbGVhcnMgdGhpcyBzZXQuCi0gICAgbWVkaWE6Ok1ldGFkYXRhOjpGaWx0ZXIgbU1ldGFkYXRhVXBkYXRlZDsgIC8vIHByb3RlY3RlZCBieSBtTG9jawogfTsKIAogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9tZWRpYXBsYXllcjIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL21lZGlhcGxheWVyMi5jcHAKaW5kZXggZTU1NjdkYy4uOTIxYTViNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL21lZGlhcGxheWVyMi5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL21lZGlhcGxheWVyMi5jcHAKQEAgLTUzLDE2OSArNTMsNiBAQAogY29uc3QgaW50IGtEdW1wTG9ja1JldHJpZXMgPSA1MDsKIGNvbnN0IGludCBrRHVtcExvY2tTbGVlcFVzID0gMjAwMDA7CiAKLS8vIE1heCBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgZmlsdGVyLgotY29uc3QgaW50IGtNYXhGaWx0ZXJTaXplID0gNjQ7ICAvLyBJIHB1bGxlZCB0aGF0IG91dCBvZiB0aGluIGFpci4KLQotLy8gRklYTUU6IE1vdmUgYWxsIHRoZSBtZXRhZGF0YSByZWxhdGVkIGZ1bmN0aW9uIGluIHRoZSBNZXRhZGF0YS5jcHAKLQotLy8gVW5tYXJzaGFsbCBhIGZpbHRlciBmcm9tIGEgUGFyY2VsLgotLy8gRmlsdGVyIGZvcm1hdCBpbiBhIHBhcmNlbDoKLS8vCi0vLyAgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxCi0vLyArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotLy8gfCAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyIG9mIGVudHJpZXMgKG4pICAgICAgICAgICAgICAgICAgIHwKLS8vICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0vLyB8ICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YSB0eXBlIDEgICAgICAgICAgICAgICAgICAgICAgICAgfAotLy8gKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLS8vIHwgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhIHR5cGUgMiAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0vLyArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotLy8gIC4uLi4KLS8vICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0vLyB8ICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YSB0eXBlIG4gICAgICAgICAgICAgICAgICAgICAgICAgfAotLy8gKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLS8vCi0vLyBAcGFyYW0gcCBQYXJjZWwgdGhhdCBzaG91bGQgc3RhcnQgd2l0aCBhIGZpbHRlci4KLS8vIEBwYXJhbVtvdXRdIGZpbHRlciBPbiBleGl0IGNvbnRhaW5zIHRoZSBsaXN0IG9mIG1ldGFkYXRhIHR5cGUgdG8gYmUKLS8vICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZC4KLS8vIEBwYXJhbVtvdXRdIHN0YXR1cyBPbiBleGl0IGNvbnRhaW5zIHRoZSBzdGF0dXMgY29kZSB0byBiZSByZXR1cm5lZC4KLS8vIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcGFyY2VsIHN0YXJ0cyB3aXRoIGEgdmFsaWQgZmlsdGVyLgotYm9vbCB1bm1hcnNoYWxsRmlsdGVyKGNvbnN0IFBhcmNlbCYgcCwKLSAgICAgICAgICAgICAgICAgICAgICBtZWRpYTo6TWV0YWRhdGE6OkZpbHRlciAqZmlsdGVyLAotICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICpzdGF0dXMpIHsKLSAgICBpbnQzMl90IHZhbDsKLSAgICBpZiAocC5yZWFkSW50MzIoJnZhbCkgIT0gT0spIHsKLSAgICAgICAgQUxPR0UoIkZhaWxlZCB0byByZWFkIGZpbHRlcidzIGxlbmd0aCIpOwotICAgICAgICAqc3RhdHVzID0gTk9UX0VOT1VHSF9EQVRBOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgaWYgKHZhbCA+IGtNYXhGaWx0ZXJTaXplIHx8IHZhbCA8IDApIHsKLSAgICAgICAgQUxPR0UoIkludmFsaWQgZmlsdGVyIGxlbiAlZCIsIHZhbCk7Ci0gICAgICAgICpzdGF0dXMgPSBCQURfVkFMVUU7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBjb25zdCBzaXplX3QgbnVtID0gdmFsOwotCi0gICAgZmlsdGVyLT5jbGVhcigpOwotICAgIGZpbHRlci0+c2V0Q2FwYWNpdHkobnVtKTsKLQotICAgIHNpemVfdCBzaXplID0gbnVtICogc2l6ZW9mKG1lZGlhOjpNZXRhZGF0YTo6VHlwZSk7Ci0KLQotICAgIGlmIChwLmRhdGFBdmFpbCgpIDwgc2l6ZSkgewotICAgICAgICBBTE9HRSgiRmlsdGVyIHRvbyBzaG9ydCBleHBlY3RlZCAlenUgYnV0IGdvdCAlenUiLCBzaXplLCBwLmRhdGFBdmFpbCgpKTsKLSAgICAgICAgKnN0YXR1cyA9IE5PVF9FTk9VR0hfREFUQTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGNvbnN0IG1lZGlhOjpNZXRhZGF0YTo6VHlwZSAqZGF0YSA9Ci0gICAgICAgIHN0YXRpY19jYXN0PGNvbnN0IG1lZGlhOjpNZXRhZGF0YTo6VHlwZSo+KHAucmVhZElucGxhY2Uoc2l6ZSkpOwotCi0gICAgaWYgKE5VTEwgPT0gZGF0YSkgewotICAgICAgICBBTE9HRSgiRmlsdGVyIGhhZCBubyBkYXRhIik7Ci0gICAgICAgICpzdGF0dXMgPSBCQURfVkFMVUU7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvLyBUT0RPOiBUaGUgc3RsIGltcGwgb2YgdmVjdG9yIHdvdWxkIGJlIG1vcmUgZWZmaWNpZW50IGhlcmUKLSAgICAvLyBiZWNhdXNlIGl0IGRlZ2VuZXJhdGVzIGludG8gYSBtZW1jcHkgb24gcG9kIHR5cGVzLiBUcnkgdG8KLSAgICAvLyByZXBsYWNlIGxhdGVyIG9yIHVzZSBzdGw6OnNldC4KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bTsgKytpKSB7Ci0gICAgICAgIGZpbHRlci0+YWRkKCpkYXRhKTsKLSAgICAgICAgKytkYXRhOwotICAgIH0KLSAgICAqc3RhdHVzID0gT0s7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLS8vIEBwYXJhbSBmaWx0ZXIgT2YgbWV0YWRhdGEgdHlwZS4KLS8vIEBwYXJhbSB2YWwgVG8gYmUgc2VhcmNoZWQuCi0vLyBAcmV0dXJuIHRydWUgaWYgYSBtYXRjaCB3YXMgZm91bmQuCi1ib29sIGZpbmRNZXRhZGF0YShjb25zdCBtZWRpYTo6TWV0YWRhdGE6OkZpbHRlciYgZmlsdGVyLCBjb25zdCBpbnQzMl90IHZhbCkgewotICAgIC8vIERlYWwgd2l0aCBlbXB0eSBhbmQgQU5ZIHJpZ2h0IGF3YXkKLSAgICBpZiAoZmlsdGVyLmlzRW1wdHkoKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGlmIChmaWx0ZXJbMF0gPT0gbWVkaWE6Ok1ldGFkYXRhOjprQW55KSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHJldHVybiBmaWx0ZXIuaW5kZXhPZih2YWwpID49IDA7Ci19Ci0KLS8vIG1hcnNoYWxsaW5nIHRhZyBpbmRpY2F0aW5nIGZsYXR0ZW5lZCB1dGYxNiB0YWdzCi0vLyBrZWVwIGluIHN5bmMgd2l0aCBmcmFtZXdvcmtzL2Jhc2UvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL0F1ZGlvQXR0cmlidXRlcy5qYXZhCi1jb25zdCBpbnQzMl90IGtBdWRpb0F0dHJpYnV0ZXNNYXJzaGFsbFRhZ0ZsYXR0ZW5UYWdzID0gMTsKLQotLy8gQXVkaW8gYXR0cmlidXRlcyBmb3JtYXQgaW4gYSBwYXJjZWw6Ci0vLwotLy8gIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMQotLy8gKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLS8vIHwgICAgICAgICAgICAgICAgICAgICAgIHVzYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0vLyArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotLy8gfCAgICAgICAgICAgICAgICAgICAgICAgY29udGVudF90eXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS8vICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0vLyB8ICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLy8gKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLS8vIHwgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0vLyArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotLy8gfCAgICAgICAgICAgICAgICAgICAgICAga0F1ZGlvQXR0cmlidXRlc01hcnNoYWxsVGFnRmxhdHRlblRhZ3MgIHwgLy8gaWdub3JlIHRhZ3MgaWYgbm90IGZvdW5kCi0vLyArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotLy8gfCAgICAgICAgICAgICAgICAgICAgICAgZmxhdHRlbmVkIHRhZ3MgaW4gVVRGMTYgICAgICAgICAgICAgICAgIHwKLS8vIHwgICAgICAgICAgICAgICAgICAgICAgICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0vLyArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotLy8KLS8vIEBwYXJhbSBwIFBhcmNlbCB0aGF0IGNvbnRhaW5zIGF1ZGlvIGF0dHJpYnV0ZXMuCi0vLyBAcGFyYW1bb3V0XSBhdHRyaWJ1dGVzIE9uIGV4aXQgcG9pbnRzIHRvIGFuIGluaXRpYWxpemVkIGF1ZGlvX2F0dHJpYnV0ZXNfdCBzdHJ1Y3R1cmUKLS8vIEBwYXJhbVtvdXRdIHN0YXR1cyBPbiBleGl0IGNvbnRhaW5zIHRoZSBzdGF0dXMgY29kZSB0byBiZSByZXR1cm5lZC4KLXZvaWQgdW5tYXJzaGFsbEF1ZGlvQXR0cmlidXRlcyhjb25zdCBQYXJjZWwmIHBhcmNlbCwgYXVkaW9fYXR0cmlidXRlc190ICphdHRyaWJ1dGVzKSB7Ci0gICAgYXR0cmlidXRlcy0+dXNhZ2UgPSAoYXVkaW9fdXNhZ2VfdCkgcGFyY2VsLnJlYWRJbnQzMigpOwotICAgIGF0dHJpYnV0ZXMtPmNvbnRlbnRfdHlwZSA9IChhdWRpb19jb250ZW50X3R5cGVfdCkgcGFyY2VsLnJlYWRJbnQzMigpOwotICAgIGF0dHJpYnV0ZXMtPnNvdXJjZSA9IChhdWRpb19zb3VyY2VfdCkgcGFyY2VsLnJlYWRJbnQzMigpOwotICAgIGF0dHJpYnV0ZXMtPmZsYWdzID0gKGF1ZGlvX2ZsYWdzX21hc2tfdCkgcGFyY2VsLnJlYWRJbnQzMigpOwotICAgIGNvbnN0IGJvb2wgaGFzRmxhdHRlbmVkVGFnID0gKHBhcmNlbC5yZWFkSW50MzIoKSA9PSBrQXVkaW9BdHRyaWJ1dGVzTWFyc2hhbGxUYWdGbGF0dGVuVGFncyk7Ci0gICAgaWYgKGhhc0ZsYXR0ZW5lZFRhZykgewotICAgICAgICAvLyB0aGUgdGFncyBhcmUgVVRGMTYsIGNvbnZlcnQgdG8gVVRGOAotICAgICAgICBTdHJpbmcxNiB0YWdzID0gcGFyY2VsLnJlYWRTdHJpbmcxNigpOwotICAgICAgICBzc2l6ZV90IHJlYWxUYWdTaXplID0gdXRmMTZfdG9fdXRmOF9sZW5ndGgodGFncy5zdHJpbmcoKSwgdGFncy5zaXplKCkpOwotICAgICAgICBpZiAocmVhbFRhZ1NpemUgPD0gMCkgewotICAgICAgICAgICAgc3RyY3B5KGF0dHJpYnV0ZXMtPnRhZ3MsICIiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIGNvcHkgdGhlIGZsYXR0ZW5lZCBzdHJpbmcgaW50byB0aGUgYXR0cmlidXRlcyBhcyB0aGUgZGVzdGluYXRpb24gZm9yIHRoZSBjb252ZXJzaW9uOgotICAgICAgICAgICAgLy8gY29weWluZyBhcnJheSBzaXplIC0xLCBhcnJheSBmb3IgdGFncyB3YXMgY2FsbG9jJ2QsIG5vIG5lZWQgdG8gTlVMTC10ZXJtaW5hdGUgaXQKLSAgICAgICAgICAgIHNpemVfdCB0YWdTaXplID0gcmVhbFRhZ1NpemUgPiBBVURJT19BVFRSSUJVVEVTX1RBR1NfTUFYX1NJWkUgLSAxID8KLSAgICAgICAgICAgICAgICAgICAgQVVESU9fQVRUUklCVVRFU19UQUdTX01BWF9TSVpFIC0gMSA6IHJlYWxUYWdTaXplOwotICAgICAgICAgICAgdXRmMTZfdG9fdXRmOCh0YWdzLnN0cmluZygpLCB0YWdTaXplLCBhdHRyaWJ1dGVzLT50YWdzLAotICAgICAgICAgICAgICAgICAgICBzaXplb2YoYXR0cmlidXRlcy0+dGFncykgLyBzaXplb2YoYXR0cmlidXRlcy0+dGFnc1swXSkpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR0UoInVubWFyc2hhbGxBdWRpb0F0dHJpYnV0ZXMoKSByZWNlaXZlZCB1bmZsYXR0ZW5lZCB0YWdzLCBpZ25vcmluZyB0YWcgdmFsdWVzIik7Ci0gICAgICAgIHN0cmNweShhdHRyaWJ1dGVzLT50YWdzLCAiIik7Ci0gICAgfQotfQotCi1jbGFzcyBBdWRpb0RldmljZVVwZGF0ZWROb3RpZmllcjogcHVibGljIEF1ZGlvU3lzdGVtOjpBdWRpb0RldmljZUNhbGxiYWNrIHsKLXB1YmxpYzoKLSAgICBBdWRpb0RldmljZVVwZGF0ZWROb3RpZmllcihjb25zdCBzcDxNZWRpYVBsYXllcjJJbnRlcmZhY2U+JiBsaXN0ZW5lcikKLSAgICAgICAgOiBtTGlzdGVuZXIobGlzdGVuZXIpIHsgfQotCi0gICAgfkF1ZGlvRGV2aWNlVXBkYXRlZE5vdGlmaWVyKCkgeyB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgb25BdWRpb0RldmljZVVwZGF0ZShhdWRpb19pb19oYW5kbGVfdCBhdWRpb0lvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQpIG92ZXJyaWRlIHsKLSAgICAgICAgc3A8TWVkaWFQbGF5ZXIySW50ZXJmYWNlPiBsaXN0ZW5lciA9IG1MaXN0ZW5lci5wcm9tb3RlKCk7Ci0gICAgICAgIGlmIChsaXN0ZW5lciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBsaXN0ZW5lci0+c2VuZEV2ZW50KDAsIE1FRElBMl9BVURJT19ST1VUSU5HX0NIQU5HRUQsIGF1ZGlvSW8sIGRldmljZUlkKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dXKCJsaXN0ZW5lciBmb3IgcHJvY2VzcyAlZCBkZWF0aCBpcyBnb25lIiwgTUVESUEyX0FVRElPX1JPVVRJTkdfQ0hBTkdFRCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLXByaXZhdGU6Ci0gICAgd3A8TWVkaWFQbGF5ZXIySW50ZXJmYWNlPiBtTGlzdGVuZXI7Ci19OwotCiBjbGFzcyBwcm94eUxpc3RlbmVyIDogcHVibGljIE1lZGlhUGxheWVyMkludGVyZmFjZUxpc3RlbmVyIHsKIHB1YmxpYzoKICAgICBwcm94eUxpc3RlbmVyKGNvbnN0IHdwPE1lZGlhUGxheWVyMj4gJnBsYXllcikKQEAgLTIyMyw3ICs2MCw4IEBACiAKICAgICB+cHJveHlMaXN0ZW5lcigpIHsgfTsKIAotICAgIHZpcnR1YWwgdm9pZCBub3RpZnkoaW50NjRfdCBzcmNJZCwgaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyLCBjb25zdCBQYXJjZWwgKm9iaikgb3ZlcnJpZGUgeworICAgIHZpcnR1YWwgdm9pZCBub3RpZnkoaW50NjRfdCBzcmNJZCwgaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyLAorICAgICAgICAgICAgY29uc3QgUGxheWVyTWVzc2FnZSAqb2JqKSBvdmVycmlkZSB7CiAgICAgICAgIHNwPE1lZGlhUGxheWVyMj4gcGxheWVyID0gbVBsYXllci5wcm9tb3RlKCk7CiAgICAgICAgIGlmIChwbGF5ZXIgIT0gTlVMTCkgewogICAgICAgICAgICAgcGxheWVyLT5ub3RpZnkoc3JjSWQsIG1zZywgZXh0MSwgZXh0Miwgb2JqKTsKQEAgLTM4MCw4ICsyMTgsOCBAQAogfSAgLy8gYW5vbnltb3VzIG5hbWVzcGFjZQogCiAvL3N0YXRpYwotc3A8TWVkaWFQbGF5ZXIyPiBNZWRpYVBsYXllcjI6OkNyZWF0ZSgpIHsKLSAgICBzcDxNZWRpYVBsYXllcjI+IHBsYXllciA9IG5ldyBNZWRpYVBsYXllcjIoKTsKK3NwPE1lZGlhUGxheWVyMj4gTWVkaWFQbGF5ZXIyOjpDcmVhdGUoaW50MzJfdCBzZXNzaW9uSWQpIHsKKyAgICBzcDxNZWRpYVBsYXllcjI+IHBsYXllciA9IG5ldyBNZWRpYVBsYXllcjIoc2Vzc2lvbklkKTsKIAogICAgIGlmICghcGxheWVyLT5pbml0KCkpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC0zOTgsNDQgKzIzNiwzNCBAQAogICAgIHJldHVybiBkdW1wUGxheWVycyhmZCwgYXJncyk7CiB9CiAKLU1lZGlhUGxheWVyMjo6TWVkaWFQbGF5ZXIyKCkgeworTWVkaWFQbGF5ZXIyOjpNZWRpYVBsYXllcjIoaW50MzJfdCBzZXNzaW9uSWQpIHsKICAgICBBTE9HVigiY29uc3RydWN0b3IiKTsKICAgICBtU3JjSWQgPSAwOwogICAgIG1Mb2NrVGhyZWFkSWQgPSAwOwogICAgIG1MaXN0ZW5lciA9IE5VTEw7CiAgICAgbVN0cmVhbVR5cGUgPSBBVURJT19TVFJFQU1fTVVTSUM7Ci0gICAgbUF1ZGlvQXR0cmlidXRlc1BhcmNlbCA9IE5VTEw7CisgICAgbUF1ZGlvQXR0cmlidXRlcyA9IE5VTEw7CiAgICAgbUN1cnJlbnRQb3NpdGlvbiA9IC0xOwogICAgIG1DdXJyZW50U2Vla01vZGUgPSBNZWRpYVBsYXllcjJTZWVrTW9kZTo6U0VFS19QUkVWSU9VU19TWU5DOwogICAgIG1TZWVrUG9zaXRpb24gPSAtMTsKICAgICBtU2Vla01vZGUgPSBNZWRpYVBsYXllcjJTZWVrTW9kZTo6U0VFS19QUkVWSU9VU19TWU5DOwogICAgIG1DdXJyZW50U3RhdGUgPSBNRURJQV9QTEFZRVIyX0lETEU7CiAgICAgbUxvb3AgPSBmYWxzZTsKLSAgICBtTGVmdFZvbHVtZSA9IG1SaWdodFZvbHVtZSA9IDEuMDsKKyAgICBtVm9sdW1lID0gMS4wOwogICAgIG1WaWRlb1dpZHRoID0gbVZpZGVvSGVpZ2h0ID0gMDsKLSAgICBtQXVkaW9TZXNzaW9uSWQgPSAoYXVkaW9fc2Vzc2lvbl90KSBBdWRpb1N5c3RlbTo6bmV3QXVkaW9VbmlxdWVJZChBVURJT19VTklRVUVfSURfVVNFX1NFU1NJT04pOwotICAgIEF1ZGlvU3lzdGVtOjphY3F1aXJlQXVkaW9TZXNzaW9uSWQobUF1ZGlvU2Vzc2lvbklkLCAtMSk7CiAgICAgbVNlbmRMZXZlbCA9IDA7CiAKICAgICAvLyBUT0RPOiBnZXQgcGlkIGFuZCB1aWQgZnJvbSBKQVZBCiAgICAgbVBpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKTsKICAgICBtVWlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpOwogCi0gICAgbUF1ZGlvQXR0cmlidXRlcyA9IE5VTEw7CisgICAgbUF1ZGlvT3V0cHV0ID0gbmV3IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0KHNlc3Npb25JZCwgbVVpZCwgbVBpZCwgTlVMTCAvKmF0dHJpYnV0ZXMqLyk7CiB9CiAKIE1lZGlhUGxheWVyMjo6fk1lZGlhUGxheWVyMigpIHsKICAgICBBTE9HVigiZGVzdHJ1Y3RvciIpOwotICAgIGlmIChtQXVkaW9BdHRyaWJ1dGVzUGFyY2VsICE9IE5VTEwpIHsKLSAgICAgICAgZGVsZXRlIG1BdWRpb0F0dHJpYnV0ZXNQYXJjZWw7Ci0gICAgICAgIG1BdWRpb0F0dHJpYnV0ZXNQYXJjZWwgPSBOVUxMOwotICAgIH0KLSAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZUF1ZGlvU2Vzc2lvbklkKG1BdWRpb1Nlc3Npb25JZCwgLTEpOwogICAgIGRpc2Nvbm5lY3QoKTsKICAgICByZW1vdmVQbGF5ZXIodGhpcyk7Ci0gICAgaWYgKG1BdWRpb0F0dHJpYnV0ZXMgIT0gTlVMTCkgewotICAgICAgICBmcmVlKG1BdWRpb0F0dHJpYnV0ZXMpOwotICAgIH0KIH0KIAogYm9vbCBNZWRpYVBsYXllcjI6OmluaXQoKSB7CkBAIC00OTMsNiArMzIxLDE1IEBACiAgICAgaWYgKGRzZCA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQorICAgIC8vIE1pY3Jvc2Vjb25kIGlzIHVzZWQgaW4gTnVQbGF5ZXIyLgorICAgIGlmIChkc2QtPm1TdGFydFBvc2l0aW9uTXMgPiBEYXRhU291cmNlRGVzYzo6a01heFRpbWVNcykgeworICAgICAgICBkc2QtPm1TdGFydFBvc2l0aW9uTXMgPSBEYXRhU291cmNlRGVzYzo6a01heFRpbWVNczsKKyAgICAgICAgQUxPR1coInNldERhdGFTb3VyY2UsIHN0YXJ0IHBvaXN0aW9uIGNsYW1wZWQgdG8gJWxsZCBtcyIsIChsb25nIGxvbmcpZHNkLT5tU3RhcnRQb3NpdGlvbk1zKTsKKyAgICB9CisgICAgaWYgKGRzZC0+bUVuZFBvc2l0aW9uTXMgPiBEYXRhU291cmNlRGVzYzo6a01heFRpbWVNcykgeworICAgICAgICBkc2QtPm1FbmRQb3NpdGlvbk1zID0gRGF0YVNvdXJjZURlc2M6OmtNYXhUaW1lTXM7CisgICAgICAgIEFMT0dXKCJzZXREYXRhU291cmNlLCBlbmQgcG9pc3Rpb24gY2xhbXBlZCB0byAlbGxkIG1zIiwgKGxvbmcgbG9uZylkc2QtPm1TdGFydFBvc2l0aW9uTXMpOworICAgIH0KICAgICBBTE9HVigic2V0RGF0YVNvdXJjZSB0eXBlKCVkKSwgc3JjSWQoJWxsZCkiLCBkc2QtPm1UeXBlLCAobG9uZyBsb25nKWRzZC0+bUlkKTsKIAogICAgIHNwPE1lZGlhUGxheWVyMkludGVyZmFjZT4gb2xkUGxheWVyOwpAQCAtNTE1LDggKzM1Miw2IEBACiAgICAgICAgIGNsZWFyX2woKTsKIAogICAgICAgICBwbGF5ZXItPnNldExpc3RlbmVyKG5ldyBwcm94eUxpc3RlbmVyKHRoaXMpKTsKLSAgICAgICAgbUF1ZGlvT3V0cHV0ID0gbmV3IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0KG1BdWRpb1Nlc3Npb25JZCwgbVVpZCwKLSAgICAgICAgICAgICAgICBtUGlkLCBtQXVkaW9BdHRyaWJ1dGVzLCBuZXcgQXVkaW9EZXZpY2VVcGRhdGVkTm90aWZpZXIocGxheWVyKSk7CiAgICAgICAgIHBsYXllci0+c2V0QXVkaW9TaW5rKG1BdWRpb091dHB1dCk7CiAKICAgICAgICAgZXJyID0gcGxheWVyLT5zZXREYXRhU291cmNlKGRzZCk7CkBAIC01NjUsNzkgKzQwMCwxOCBAQAogICAgIHJldHVybiBtUGxheWVyLT5wbGF5TmV4dERhdGFTb3VyY2Uoc3JjSWQpOwogfQogCi1zdGF0dXNfdCBNZWRpYVBsYXllcjI6Omludm9rZShjb25zdCBQYXJjZWwmIHJlcXVlc3QsIFBhcmNlbCAqcmVwbHkpIHsKK3N0YXR1c190IE1lZGlhUGxheWVyMjo6aW52b2tlKGNvbnN0IFBsYXllck1lc3NhZ2UgJnJlcXVlc3QsIFBsYXllck1lc3NhZ2UgKnJlcGx5KSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBjb25zdCBib29sIGhhc0JlZW5Jbml0aWFsaXplZCA9CiAgICAgICAgICAgICAobUN1cnJlbnRTdGF0ZSAhPSBNRURJQV9QTEFZRVIyX1NUQVRFX0VSUk9SKSAmJgogICAgICAgICAgICAgKChtQ3VycmVudFN0YXRlICYgTUVESUFfUExBWUVSMl9JRExFKSAhPSBNRURJQV9QTEFZRVIyX0lETEUpOwogICAgIGlmICgobVBsYXllciA9PSBOVUxMKSB8fCAhaGFzQmVlbkluaXRpYWxpemVkKSB7Ci0gICAgICAgIEFMT0dFKCJpbnZva2UgZmFpbGVkOiB3cm9uZyBzdGF0ZSAlWCwgbVBsYXllciglcCkiLCBtQ3VycmVudFN0YXRlLCBtUGxheWVyLmdldCgpKTsKKyAgICAgICAgQUxPR0UoImludm9rZSgpIGZhaWxlZDogd3Jvbmcgc3RhdGUgJVgsIG1QbGF5ZXIoJXApIiwgbUN1cnJlbnRTdGF0ZSwgbVBsYXllci5nZXQoKSk7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9Ci0gICAgQUxPR1YoImludm9rZSAlenUiLCByZXF1ZXN0LmRhdGFTaXplKCkpOwogICAgIHJldHVybiBtUGxheWVyLT5pbnZva2UocmVxdWVzdCwgcmVwbHkpOwogfQogCi0vLyBUaGlzIGNhbGwgZG9lc24ndCBuZWVkIHRvIGFjY2VzcyB0aGUgbmF0aXZlIHBsYXllci4KLXN0YXR1c190IE1lZGlhUGxheWVyMjo6c2V0TWV0YWRhdGFGaWx0ZXIoY29uc3QgUGFyY2VsJiBmaWx0ZXIpIHsKLSAgICBBTE9HRCgic2V0TWV0YWRhdGFGaWx0ZXIiKTsKLQotICAgIHN0YXR1c190IHN0YXR1czsKLSAgICBtZWRpYTo6TWV0YWRhdGE6OkZpbHRlciBhbGxvdywgZHJvcDsKLQotICAgIGlmICh1bm1hcnNoYWxsRmlsdGVyKGZpbHRlciwgJmFsbG93LCAmc3RhdHVzKSAmJgotICAgICAgICB1bm1hcnNoYWxsRmlsdGVyKGZpbHRlciwgJmRyb3AsICZzdGF0dXMpKSB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLQotICAgICAgICBtTWV0YWRhdGFBbGxvdyA9IGFsbG93OwotICAgICAgICBtTWV0YWRhdGFEcm9wID0gZHJvcDsKLSAgICB9Ci0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpnZXRNZXRhZGF0YShib29sIHVwZGF0ZV9vbmx5LCBib29sIC8qIGFwcGx5X2ZpbHRlciAqLywgUGFyY2VsICpyZXBseSkgewotICAgIEFMT0dEKCJnZXRNZXRhZGF0YSIpOwotICAgIHNwPE1lZGlhUGxheWVyMkludGVyZmFjZT4gcGxheWVyOwotICAgIG1lZGlhOjpNZXRhZGF0YTo6RmlsdGVyIGlkczsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgewotICAgICAgICBpZiAobVBsYXllciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICAgICAgfQotCi0gICAgICAgIHBsYXllciA9IG1QbGF5ZXI7Ci0gICAgICAgIC8vIFBsYWNlaG9sZGVyIGZvciB0aGUgcmV0dXJuIGNvZGUsIHVwZGF0ZWQgYnkgdGhlIGNhbGxlci4KLSAgICAgICAgcmVwbHktPndyaXRlSW50MzIoLTEpOwotCi0gICAgICAgIC8vIFdlIGRvbid0IGJsb2NrIG5vdGlmaWNhdGlvbnMgd2hpbGUgd2UgZmV0Y2ggdGhlIGRhdGEuIFdlIGNsZWFyCi0gICAgICAgIC8vIG1NZXRhZGF0YVVwZGF0ZWQgZmlyc3Qgc28gd2UgZG9uJ3QgbG9zZSBub3RpZmljYXRpb25zIGhhcHBlbmluZwotICAgICAgICAvLyBkdXJpbmcgdGhlIHJlc3Qgb2YgdGhpcyBjYWxsLgotICAgICAgICBpZiAodXBkYXRlX29ubHkpIHsKLSAgICAgICAgICAgIGlkcyA9IG1NZXRhZGF0YVVwZGF0ZWQ7Ci0gICAgICAgIH0KLSAgICAgICAgbU1ldGFkYXRhVXBkYXRlZC5jbGVhcigpOwotICAgIH0KLQotICAgIG1lZGlhOjpNZXRhZGF0YSBtZXRhZGF0YShyZXBseSk7Ci0KLSAgICBtZXRhZGF0YS5hcHBlbmRIZWFkZXIoKTsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBwbGF5ZXItPmdldE1ldGFkYXRhKGlkcywgcmVwbHkpOwotCi0gICAgaWYgKHN0YXR1cyAhPSBPSykgewotICAgICAgICBtZXRhZGF0YS5yZXNldFBhcmNlbCgpOwotICAgICAgICBBTE9HRSgiZ2V0TWV0YWRhdGEgZmFpbGVkICVkIiwgc3RhdHVzKTsKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0KLSAgICAvLyBGSVhNRTogZW1lbnQgZmlsdGVyaW5nIG9uIHRoZSByZXN1bHQuIE5vdCBjcml0aWNhbCBzaW5jZQotICAgIC8vIGZpbHRlcmluZyB0YWtlcyBwbGFjZSBvbiB0aGUgdXBkYXRlIG5vdGlmaWNhdGlvbnMgYWxyZWFkeS4gVGhpcwotICAgIC8vIHdvdWxkIGJlIHdoZW4gYWxsIHRoZSBtZXRhZGF0YSBhcmUgZmV0Y2ggYW5kIGEgZmlsdGVyIGlzIHNldC4KLQotICAgIC8vIEV2ZXJ5dGhpbmcgaXMgZmluZSwgdXBkYXRlIHRoZSBtZXRhZGF0YSBsZW5ndGguCi0gICAgbWV0YWRhdGEudXBkYXRlTGVuZ3RoKCk7Ci0gICAgcmV0dXJuIE9LOwotfQotCiB2b2lkIE1lZGlhUGxheWVyMjo6ZGlzY29ubmVjdE5hdGl2ZVdpbmRvd19sKCkgewogICAgIGlmIChtQ29ubmVjdGVkV2luZG93ICE9IE5VTEwgJiYgbUNvbm5lY3RlZFdpbmRvdy0+Z2V0QU5hdGl2ZVdpbmRvdygpICE9IE5VTEwpIHsKICAgICAgICAgc3RhdHVzX3QgZXJyID0gbmF0aXZlX3dpbmRvd19hcGlfZGlzY29ubmVjdCgKQEAgLTcyNywyMiArNTAxLDkgQEAKICAgICByZXR1cm4gbVBsYXllci0+c2V0QnVmZmVyaW5nU2V0dGluZ3MoYnVmZmVyaW5nKTsKIH0KIAotc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpzZXRBdWRpb0F0dHJpYnV0ZXNfbChjb25zdCBQYXJjZWwgJnBhcmNlbCkgewotICAgIGlmIChtQXVkaW9BdHRyaWJ1dGVzICE9IE5VTEwpIHsKLSAgICAgICAgZnJlZShtQXVkaW9BdHRyaWJ1dGVzKTsKLSAgICB9Ci0gICAgbUF1ZGlvQXR0cmlidXRlcyA9IChhdWRpb19hdHRyaWJ1dGVzX3QgKikgY2FsbG9jKDEsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKLSAgICBpZiAobUF1ZGlvQXR0cmlidXRlcyA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOT19NRU1PUlk7Ci0gICAgfQotICAgIHVubWFyc2hhbGxBdWRpb0F0dHJpYnV0ZXMocGFyY2VsLCBtQXVkaW9BdHRyaWJ1dGVzKTsKLQotICAgIEFMT0dWKCJzZXRBdWRpb0F0dHJpYnV0ZXNfbCgpIHVzYWdlPSVkIGNvbnRlbnQ9JWQgZmxhZ3M9MHgleCB0YWdzPSVzIiwKLSAgICAgICAgICAgIG1BdWRpb0F0dHJpYnV0ZXMtPnVzYWdlLCBtQXVkaW9BdHRyaWJ1dGVzLT5jb250ZW50X3R5cGUsIG1BdWRpb0F0dHJpYnV0ZXMtPmZsYWdzLAotICAgICAgICAgICAgbUF1ZGlvQXR0cmlidXRlcy0+dGFncyk7Ci0KLSAgICBpZiAobUF1ZGlvT3V0cHV0ICE9IDApIHsKLSAgICAgICAgbUF1ZGlvT3V0cHV0LT5zZXRBdWRpb0F0dHJpYnV0ZXMobUF1ZGlvQXR0cmlidXRlcyk7CitzdGF0dXNfdCBNZWRpYVBsYXllcjI6OnNldEF1ZGlvQXR0cmlidXRlc19sKGNvbnN0IGpvYmplY3QgYXR0cmlidXRlcykgeworICAgIGlmIChtQXVkaW9PdXRwdXQgIT0gTlVMTCkgeworICAgICAgICBtQXVkaW9PdXRwdXQtPnNldEF1ZGlvQXR0cmlidXRlcyhhdHRyaWJ1dGVzKTsKICAgICB9CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQpAQCAtNzUwLDE0ICs1MTEsMTIgQEAKIHN0YXR1c190IE1lZGlhUGxheWVyMjo6cHJlcGFyZUFzeW5jKCkgewogICAgIEFMT0dWKCJwcmVwYXJlQXN5bmMiKTsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGlmICgobVBsYXllciAhPSAwKSAmJiAobUN1cnJlbnRTdGF0ZSAmIChNRURJQV9QTEFZRVIyX0lOSVRJQUxJWkVEIHwgTUVESUFfUExBWUVSMl9TVE9QUEVEKSkpIHsKLSAgICAgICAgaWYgKG1BdWRpb0F0dHJpYnV0ZXNQYXJjZWwgIT0gTlVMTCkgewotICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gc2V0QXVkaW9BdHRyaWJ1dGVzX2woKm1BdWRpb0F0dHJpYnV0ZXNQYXJjZWwpOworICAgIGlmICgobVBsYXllciAhPSAwKSAmJiAobUN1cnJlbnRTdGF0ZSAmIE1FRElBX1BMQVlFUjJfSU5JVElBTElaRUQpKSB7CisgICAgICAgIGlmIChtQXVkaW9BdHRyaWJ1dGVzICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHN0YXR1c190IGVyciA9IHNldEF1ZGlvQXR0cmlidXRlc19sKG1BdWRpb0F0dHJpYnV0ZXMtPmdldEpPYmplY3QoKSk7CiAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChtQXVkaW9PdXRwdXQgIT0gMCkgewotICAgICAgICAgICAgbUF1ZGlvT3V0cHV0LT5zZXRBdWRpb1N0cmVhbVR5cGUobVN0cmVhbVR5cGUpOwogICAgICAgICB9CiAgICAgICAgIG1DdXJyZW50U3RhdGUgPSBNRURJQV9QTEFZRVIyX1BSRVBBUklORzsKICAgICAgICAgcmV0dXJuIG1QbGF5ZXItPnByZXBhcmVBc3luYygpOwpAQCAtNzgxLDcgKzU0MCw3IEBACiAgICAgICAgIG1QbGF5ZXItPnNldExvb3BpbmcobUxvb3ApOwogCiAgICAgICAgIGlmIChtQXVkaW9PdXRwdXQgIT0gMCkgewotICAgICAgICAgICAgbUF1ZGlvT3V0cHV0LT5zZXRWb2x1bWUobUxlZnRWb2x1bWUsIG1SaWdodFZvbHVtZSk7CisgICAgICAgICAgICBtQXVkaW9PdXRwdXQtPnNldFZvbHVtZShtVm9sdW1lKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChtQXVkaW9PdXRwdXQgIT0gMCkgewpAQCAtODA2LDMwICs1NjUsMTIgQEAKICAgICByZXR1cm4gcmV0OwogfQogCi1zdGF0dXNfdCBNZWRpYVBsYXllcjI6OnN0b3AoKSB7Ci0gICAgQUxPR1YoInN0b3AiKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGlmIChtQ3VycmVudFN0YXRlICYgTUVESUFfUExBWUVSMl9TVE9QUEVEKSByZXR1cm4gTk9fRVJST1I7Ci0gICAgaWYgKCAobVBsYXllciAhPSAwKSAmJiAoIG1DdXJyZW50U3RhdGUgJiAoIE1FRElBX1BMQVlFUjJfU1RBUlRFRCB8IE1FRElBX1BMQVlFUjJfUFJFUEFSRUQgfAotICAgICAgICAgICAgICAgICAgICBNRURJQV9QTEFZRVIyX1BBVVNFRCB8IE1FRElBX1BMQVlFUjJfUExBWUJBQ0tfQ09NUExFVEUgKSApICkgewotICAgICAgICBzdGF0dXNfdCByZXQgPSBtUGxheWVyLT5zdG9wKCk7Ci0gICAgICAgIGlmIChyZXQgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIG1DdXJyZW50U3RhdGUgPSBNRURJQV9QTEFZRVIyX1NUQVRFX0VSUk9SOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IE1FRElBX1BMQVlFUjJfU1RPUFBFRDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLSAgICBBTE9HRSgic3RvcCBjYWxsZWQgaW4gc3RhdGUgJWQsIG1QbGF5ZXIoJXApIiwgbUN1cnJlbnRTdGF0ZSwgbVBsYXllci5nZXQoKSk7Ci0gICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotfQotCiBzdGF0dXNfdCBNZWRpYVBsYXllcjI6OnBhdXNlKCkgewogICAgIEFMT0dWKCJwYXVzZSIpOwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgaWYgKG1DdXJyZW50U3RhdGUgJiAoTUVESUFfUExBWUVSMl9QQVVTRUR8TUVESUFfUExBWUVSMl9QTEFZQkFDS19DT01QTEVURSkpCiAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICBpZiAoKG1QbGF5ZXIgIT0gMCkgJiYgKG1DdXJyZW50U3RhdGUgJiBNRURJQV9QTEFZRVIyX1NUQVJURUQpKSB7CisgICAgaWYgKChtUGxheWVyICE9IDApICYmIChtQ3VycmVudFN0YXRlICYgKE1FRElBX1BMQVlFUjJfU1RBUlRFRCB8IE1FRElBX1BMQVlFUjJfUFJFUEFSRUQpKSkgewogICAgICAgICBzdGF0dXNfdCByZXQgPSBtUGxheWVyLT5wYXVzZSgpOwogICAgICAgICBpZiAocmV0ICE9IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICBtQ3VycmVudFN0YXRlID0gTUVESUFfUExBWUVSMl9TVEFURV9FUlJPUjsKQEAgLTg2MCw3ICs2MDEsNyBAQAogICAgIHJldHVybiBmYWxzZTsKIH0KIAotbWVkaWFwbGF5ZXIyX3N0YXRlcyBNZWRpYVBsYXllcjI6OmdldE1lZGlhUGxheWVyMlN0YXRlKCkgeworbWVkaWFwbGF5ZXIyX3N0YXRlcyBNZWRpYVBsYXllcjI6OmdldFN0YXRlKCkgewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgaWYgKG1DdXJyZW50U3RhdGUgJiBNRURJQV9QTEFZRVIyX1NUQVRFX0VSUk9SKSB7CiAgICAgICAgIHJldHVybiBNRURJQVBMQVlFUjJfU1RBVEVfRVJST1I7CkBAIC04NzMsOCArNjE0LDcgQEAKICAgICBpZiAobUN1cnJlbnRTdGF0ZSAmIE1FRElBX1BMQVlFUjJfU1RBUlRFRCkgewogICAgICAgICByZXR1cm4gTUVESUFQTEFZRVIyX1NUQVRFX1BMQVlJTkc7CiAgICAgfQotICAgIGlmIChtQ3VycmVudFN0YXRlCi0gICAgICAgICYgKE1FRElBX1BMQVlFUjJfUEFVU0VEIHwgTUVESUFfUExBWUVSMl9TVE9QUEVEIHwgTUVESUFfUExBWUVSMl9QTEFZQkFDS19DT01QTEVURSkpIHsKKyAgICBpZiAobUN1cnJlbnRTdGF0ZSAmIChNRURJQV9QTEFZRVIyX1BBVVNFRCB8IE1FRElBX1BMQVlFUjJfUExBWUJBQ0tfQ09NUExFVEUpKSB7CiAgICAgICAgIHJldHVybiBNRURJQVBMQVlFUjJfU1RBVEVfUEFVU0VEOwogICAgIH0KICAgICAvLyBub3cgb25seSBtQ3VycmVudFN0YXRlICYgTUVESUFfUExBWUVSMl9QUkVQQVJFRCBpcyB0cnVlCkBAIC04OTAsNyArNjMwLDcgQEAKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBpZiAobVBsYXllciA9PSAwIHx8IChtQ3VycmVudFN0YXRlICYgTUVESUFfUExBWUVSMl9TVE9QUEVEKSkgeworICAgIGlmIChtUGxheWVyID09IDApIHsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIApAQCAtOTgyLDcgKzcyMiw3IEBACiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBBTE9HVigiZ2V0RHVyYXRpb25fbCIpOwogICAgIGJvb2wgaXNWYWxpZFN0YXRlID0gKG1DdXJyZW50U3RhdGUgJiAoTUVESUFfUExBWUVSMl9QUkVQQVJFRCB8IE1FRElBX1BMQVlFUjJfU1RBUlRFRCB8Ci0gICAgICAgICAgICBNRURJQV9QTEFZRVIyX1BBVVNFRCB8IE1FRElBX1BMQVlFUjJfU1RPUFBFRCB8IE1FRElBX1BMQVlFUjJfUExBWUJBQ0tfQ09NUExFVEUpKTsKKyAgICAgICAgICAgIE1FRElBX1BMQVlFUjJfUEFVU0VEIHwgTUVESUFfUExBWUVSMl9QTEFZQkFDS19DT01QTEVURSkpOwogICAgIGlmIChtUGxheWVyID09IDAgfHwgIWlzVmFsaWRTdGF0ZSkgewogICAgICAgICBBTE9HRSgiQXR0ZW1wdCB0byBjYWxsIGdldER1cmF0aW9uIGluIHdyb25nIHN0YXRlOiBtUGxheWVyPSVwLCBtQ3VycmVudFN0YXRlPSV1IiwKICAgICAgICAgICAgICAgICBtUGxheWVyLmdldCgpLCBtQ3VycmVudFN0YXRlKTsKQEAgLTExMzgsMTggKzg3OCwxNyBAQAogICAgIHJldHVybiBmYWxzZTsKIH0KIAotc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpzZXRWb2x1bWUoZmxvYXQgbGVmdFZvbHVtZSwgZmxvYXQgcmlnaHRWb2x1bWUpIHsKLSAgICBBTE9HVigiTWVkaWFQbGF5ZXIyOjpzZXRWb2x1bWUoJWYsICVmKSIsIGxlZnRWb2x1bWUsIHJpZ2h0Vm9sdW1lKTsKK3N0YXR1c190IE1lZGlhUGxheWVyMjo6c2V0Vm9sdW1lKGZsb2F0IHZvbHVtZSkgeworICAgIEFMT0dWKCJNZWRpYVBsYXllcjI6OnNldFZvbHVtZSglZikiLCB2b2x1bWUpOwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgbUxlZnRWb2x1bWUgPSBsZWZ0Vm9sdW1lOwotICAgIG1SaWdodFZvbHVtZSA9IHJpZ2h0Vm9sdW1lOworICAgIG1Wb2x1bWUgPSB2b2x1bWU7CiAgICAgaWYgKG1BdWRpb091dHB1dCAhPSAwKSB7Ci0gICAgICAgIG1BdWRpb091dHB1dC0+c2V0Vm9sdW1lKGxlZnRWb2x1bWUsIHJpZ2h0Vm9sdW1lKTsKKyAgICAgICAgbUF1ZGlvT3V0cHV0LT5zZXRWb2x1bWUodm9sdW1lKTsKICAgICB9CiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBNZWRpYVBsYXllcjI6OnNldEF1ZGlvU2Vzc2lvbklkKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQpIHsKK3N0YXR1c190IE1lZGlhUGxheWVyMjo6c2V0QXVkaW9TZXNzaW9uSWQoaW50MzJfdCBzZXNzaW9uSWQpIHsKICAgICBBTE9HVigiTWVkaWFQbGF5ZXIyOjpzZXRBdWRpb1Nlc3Npb25JZCglZCkiLCBzZXNzaW9uSWQpOwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgaWYgKCEobUN1cnJlbnRTdGF0ZSAmIE1FRElBX1BMQVlFUjJfSURMRSkpIHsKQEAgLTExNTksMTcgKzg5OCwxOCBAQAogICAgIGlmIChzZXNzaW9uSWQgPCAwKSB7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQotICAgIGlmIChzZXNzaW9uSWQgIT0gbUF1ZGlvU2Vzc2lvbklkKSB7Ci0gICAgICAgIEF1ZGlvU3lzdGVtOjphY3F1aXJlQXVkaW9TZXNzaW9uSWQoc2Vzc2lvbklkLCAtMSk7Ci0gICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlQXVkaW9TZXNzaW9uSWQobUF1ZGlvU2Vzc2lvbklkLCAtMSk7Ci0gICAgICAgIG1BdWRpb1Nlc3Npb25JZCA9IHNlc3Npb25JZDsKKyAgICBpZiAobUF1ZGlvT3V0cHV0ICE9IE5VTEwgJiYgc2Vzc2lvbklkICE9IG1BdWRpb091dHB1dC0+Z2V0U2Vzc2lvbklkKCkpIHsKKyAgICAgICAgbUF1ZGlvT3V0cHV0LT5zZXRTZXNzaW9uSWQoc2Vzc2lvbklkKTsKICAgICB9CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi1hdWRpb19zZXNzaW9uX3QgTWVkaWFQbGF5ZXIyOjpnZXRBdWRpb1Nlc3Npb25JZCgpIHsKK2ludDMyX3QgTWVkaWFQbGF5ZXIyOjpnZXRBdWRpb1Nlc3Npb25JZCgpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIHJldHVybiBtQXVkaW9TZXNzaW9uSWQ7CisgICAgaWYgKG1BdWRpb091dHB1dCAhPSBOVUxMKSB7CisgICAgICAgIHJldHVybiBtQXVkaW9PdXRwdXQtPmdldFNlc3Npb25JZCgpOworICAgIH0KKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpzZXRBdXhFZmZlY3RTZW5kTGV2ZWwoZmxvYXQgbGV2ZWwpIHsKQEAgLTExOTYsNjcgKzkzNiwzNyBAQAogfQogCiAvLyBhbHdheXMgY2FsbCB3aXRoIGxvY2sgaGVsZAotc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpjaGVja1N0YXRlRm9yS2V5U2V0X2woaW50IGtleSkgewotICAgIHN3aXRjaChrZXkpIHsKLSAgICBjYXNlIE1FRElBMl9LRVlfUEFSQU1FVEVSX0FVRElPX0FUVFJJQlVURVM6Ci0gICAgICAgIGlmIChtQ3VycmVudFN0YXRlICYgKCBNRURJQV9QTEFZRVIyX1BSRVBBUkVEIHwgTUVESUFfUExBWUVSMl9TVEFSVEVEIHwKLSAgICAgICAgICAgICAgICBNRURJQV9QTEFZRVIyX1BBVVNFRCB8IE1FRElBX1BMQVlFUjJfUExBWUJBQ0tfQ09NUExFVEUpICkgewotICAgICAgICAgICAgLy8gQ2FuJ3QgY2hhbmdlIHRoZSBhdWRpbyBhdHRyaWJ1dGVzIGFmdGVyIHByZXBhcmUKLSAgICAgICAgICAgIEFMT0dFKCJ0cnlpbmcgdG8gc2V0IGF1ZGlvIGF0dHJpYnV0ZXMgY2FsbGVkIGluIHN0YXRlICVkIiwgbUN1cnJlbnRTdGF0ZSk7Ci0gICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgLy8gcGFyYW1ldGVyIGRvZXNuJ3QgcmVxdWlyZSBwbGF5ZXIgc3RhdGUgY2hlY2sKLSAgICAgICAgYnJlYWs7CitzdGF0dXNfdCBNZWRpYVBsYXllcjI6OmNoZWNrU3RhdGVfbCgpIHsKKyAgICBpZiAobUN1cnJlbnRTdGF0ZSAmICggTUVESUFfUExBWUVSMl9QUkVQQVJFRCB8IE1FRElBX1BMQVlFUjJfU1RBUlRFRCB8CisgICAgICAgICAgICBNRURJQV9QTEFZRVIyX1BBVVNFRCB8IE1FRElBX1BMQVlFUjJfUExBWUJBQ0tfQ09NUExFVEUpICkgeworICAgICAgICAvLyBDYW4ndCBjaGFuZ2UgdGhlIGF1ZGlvIGF0dHJpYnV0ZXMgYWZ0ZXIgcHJlcGFyZQorICAgICAgICBBTE9HRSgidHJ5aW5nIHRvIHNldCBhdWRpbyBhdHRyaWJ1dGVzIGNhbGxlZCBpbiBzdGF0ZSAlZCIsIG1DdXJyZW50U3RhdGUpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpzZXRQYXJhbWV0ZXIoaW50IGtleSwgY29uc3QgUGFyY2VsJiByZXF1ZXN0KSB7Ci0gICAgQUxPR1YoIk1lZGlhUGxheWVyMjo6c2V0UGFyYW1ldGVyKCVkKSIsIGtleSk7CitzdGF0dXNfdCBNZWRpYVBsYXllcjI6OnNldEF1ZGlvQXR0cmlidXRlcyhjb25zdCBqb2JqZWN0IGF0dHJpYnV0ZXMpIHsKKyAgICBBTE9HVigiTWVkaWFQbGF5ZXIyOjpzZXRBdWRpb0F0dHJpYnV0ZXMiKTsKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGlmIChjaGVja1N0YXRlRm9yS2V5U2V0X2woa2V5KSAhPSBPSykgeworICAgIGlmIChjaGVja1N0YXRlX2woKSAhPSBPSykgewogICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KLSAgICBzd2l0Y2ggKGtleSkgewotICAgIGNhc2UgTUVESUEyX0tFWV9QQVJBTUVURVJfQVVESU9fQVRUUklCVVRFUzoKLSAgICAgICAgLy8gc2F2ZSB0aGUgbWFyc2hhbGxlZCBhdWRpbyBhdHRyaWJ1dGVzCi0gICAgICAgIGlmIChtQXVkaW9BdHRyaWJ1dGVzUGFyY2VsICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGRlbGV0ZSBtQXVkaW9BdHRyaWJ1dGVzUGFyY2VsOwotICAgICAgICB9Ci0gICAgICAgIG1BdWRpb0F0dHJpYnV0ZXNQYXJjZWwgPSBuZXcgUGFyY2VsKCk7Ci0gICAgICAgIG1BdWRpb0F0dHJpYnV0ZXNQYXJjZWwtPmFwcGVuZEZyb20oJnJlcXVlc3QsIDAsIHJlcXVlc3QuZGF0YVNpemUoKSk7Ci0gICAgICAgIHN0YXR1cyA9IHNldEF1ZGlvQXR0cmlidXRlc19sKHJlcXVlc3QpOwotICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIEFMT0dWX0lGKG1QbGF5ZXIgPT0gTlVMTCwgInNldFBhcmFtZXRlcjogbm8gYWN0aXZlIHBsYXllciIpOwotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBpZiAobVBsYXllciAhPSBOVUxMKSB7Ci0gICAgICAgIHN0YXR1cyA9IG1QbGF5ZXItPnNldFBhcmFtZXRlcihrZXksIHJlcXVlc3QpOwotICAgIH0KKyAgICBtQXVkaW9BdHRyaWJ1dGVzID0gbmV3IEpPYmplY3RIb2xkZXIoYXR0cmlidXRlcyk7CisgICAgc3RhdHVzID0gc2V0QXVkaW9BdHRyaWJ1dGVzX2woYXR0cmlidXRlcyk7CiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIAoram9iamVjdCBNZWRpYVBsYXllcjI6OmdldEF1ZGlvQXR0cmlidXRlcygpIHsKKyAgICBBTE9HVigiTWVkaWFQbGF5ZXIyOjpnZXRBdWRpb0F0dHJpYnV0ZXMpIik7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICByZXR1cm4gbUF1ZGlvQXR0cmlidXRlcyAhPSBOVUxMID8gbUF1ZGlvQXR0cmlidXRlcy0+Z2V0Sk9iamVjdCgpIDogTlVMTDsKK30KKwogc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpnZXRQYXJhbWV0ZXIoaW50IGtleSwgUGFyY2VsICpyZXBseSkgewogICAgIEFMT0dWKCJNZWRpYVBsYXllcjI6OmdldFBhcmFtZXRlciglZCkiLCBrZXkpOwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgaWYgKGtleSA9PSBNRURJQTJfS0VZX1BBUkFNRVRFUl9BVURJT19BVFRSSUJVVEVTKSB7Ci0gICAgICAgIGlmIChyZXBseSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtQXVkaW9BdHRyaWJ1dGVzUGFyY2VsICE9IE5VTEwpIHsKLSAgICAgICAgICAgIHJlcGx5LT5hcHBlbmRGcm9tKG1BdWRpb0F0dHJpYnV0ZXNQYXJjZWwsIDAsIG1BdWRpb0F0dHJpYnV0ZXNQYXJjZWwtPmRhdGFTaXplKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0KICAgICBpZiAobVBsYXllciA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dWKCJnZXRQYXJhbWV0ZXI6IG5vIGFjdGl2ZSBwbGF5ZXIiKTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwpAQCAtMTI2OSw0NCArOTc5LDEwIEBACiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIAotYm9vbCBNZWRpYVBsYXllcjI6OnNob3VsZERyb3BNZXRhZGF0YShtZWRpYTo6TWV0YWRhdGE6OlR5cGUgY29kZSkgY29uc3QgewotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLQotICAgIGlmIChmaW5kTWV0YWRhdGEobU1ldGFkYXRhRHJvcCwgY29kZSkpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgaWYgKG1NZXRhZGF0YUFsbG93LmlzRW1wdHkoKSB8fCBmaW5kTWV0YWRhdGEobU1ldGFkYXRhQWxsb3csIGNvZGUpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci19Ci0KLQotdm9pZCBNZWRpYVBsYXllcjI6OmFkZE5ld01ldGFkYXRhVXBkYXRlKG1lZGlhOjpNZXRhZGF0YTo6VHlwZSBtZXRhZGF0YV90eXBlKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIGlmIChtTWV0YWRhdGFVcGRhdGVkLmluZGV4T2YobWV0YWRhdGFfdHlwZSkgPCAwKSB7Ci0gICAgICAgIG1NZXRhZGF0YVVwZGF0ZWQuYWRkKG1ldGFkYXRhX3R5cGUpOwotICAgIH0KLX0KLQotdm9pZCBNZWRpYVBsYXllcjI6Om5vdGlmeShpbnQ2NF90IHNyY0lkLCBpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIsIGNvbnN0IFBhcmNlbCAqb2JqKSB7Cit2b2lkIE1lZGlhUGxheWVyMjo6bm90aWZ5KGludDY0X3Qgc3JjSWQsIGludCBtc2csIGludCBleHQxLCBpbnQgZXh0MiwgY29uc3QgUGxheWVyTWVzc2FnZSAqb2JqKSB7CiAgICAgQUxPR1YoIm1lc3NhZ2UgcmVjZWl2ZWQgc3JjSWQ9JWxsZCwgbXNnPSVkLCBleHQxPSVkLCBleHQyPSVkIiwKICAgICAgICAgICAobG9uZyBsb25nKXNyY0lkLCBtc2csIGV4dDEsIGV4dDIpOwogCi0gICAgaWYgKE1FRElBMl9JTkZPID09IG1zZyAmJiBNRURJQTJfSU5GT19NRVRBREFUQV9VUERBVEUgPT0gZXh0MSkgewotICAgICAgICBjb25zdCBtZWRpYTo6TWV0YWRhdGE6OlR5cGUgbWV0YWRhdGFfdHlwZSA9IGV4dDI7Ci0KLSAgICAgICAgaWYoc2hvdWxkRHJvcE1ldGFkYXRhKG1ldGFkYXRhX3R5cGUpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBVcGRhdGUgdGhlIGxpc3Qgb2YgbWV0YWRhdGEgdGhhdCBoYXZlIGNoYW5nZWQuIGdldE1ldGFkYXRhCi0gICAgICAgIC8vIGFsc28gYWNjZXNzIG1NZXRhZGF0YVVwZGF0ZWQgYW5kIGNsZWFycyBpdC4KLSAgICAgICAgYWRkTmV3TWV0YWRhdGFVcGRhdGUobWV0YWRhdGFfdHlwZSk7Ci0gICAgfQotCiAgICAgYm9vbCBzZW5kID0gdHJ1ZTsKICAgICBib29sIGxvY2tlZCA9IGZhbHNlOwogCkBAIC0xNDc5LDM2ICsxMTU1LDQwIEBACiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpzZXRPdXRwdXREZXZpY2UoYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCkgeworc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpzZXRQcmVmZXJyZWREZXZpY2Uoam9iamVjdCBkZXZpY2UpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIGlmIChtQXVkaW9PdXRwdXQgPT0gTlVMTCkgewotICAgICAgICBBTE9HVigic2V0T3V0cHV0RGV2aWNlOiBhdWRpbyBzaW5rIG5vdCBpbml0Iik7CisgICAgICAgIEFMT0dWKCJzZXRQcmVmZXJyZWREZXZpY2U6IGF1ZGlvIHNpbmsgbm90IGluaXQiKTsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQotICAgIHJldHVybiBtQXVkaW9PdXRwdXQtPnNldE91dHB1dERldmljZShkZXZpY2VJZCk7CisgICAgcmV0dXJuIG1BdWRpb091dHB1dC0+c2V0UHJlZmVycmVkRGV2aWNlKGRldmljZSk7CiB9CiAKLWF1ZGlvX3BvcnRfaGFuZGxlX3QgTWVkaWFQbGF5ZXIyOjpnZXRSb3V0ZWREZXZpY2VJZCgpIHsKK2pvYmplY3QgTWVkaWFQbGF5ZXIyOjpnZXRSb3V0ZWREZXZpY2UoKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBpZiAobUF1ZGlvT3V0cHV0ID09IE5VTEwpIHsKLSAgICAgICAgQUxPR1YoImdldFJvdXRlZERldmljZUlkOiBhdWRpbyBzaW5rIG5vdCBpbml0Iik7Ci0gICAgICAgIHJldHVybiBBVURJT19QT1JUX0hBTkRMRV9OT05FOworICAgICAgICBBTE9HVigiZ2V0Um91dGVkRGV2aWNlOiBhdWRpbyBzaW5rIG5vdCBpbml0Iik7CisgICAgICAgIHJldHVybiBudWxscHRyOwogICAgIH0KLSAgICBhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkOwotICAgIHN0YXR1c190IHN0YXR1cyA9IG1BdWRpb091dHB1dC0+Z2V0Um91dGVkRGV2aWNlSWQoJmRldmljZUlkKTsKLSAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIHJldHVybiBBVURJT19QT1JUX0hBTkRMRV9OT05FOwotICAgIH0KLSAgICByZXR1cm4gZGV2aWNlSWQ7CisgICAgcmV0dXJuIG1BdWRpb091dHB1dC0+Z2V0Um91dGVkRGV2aWNlKCk7CiB9CiAKLXN0YXR1c190IE1lZGlhUGxheWVyMjo6ZW5hYmxlQXVkaW9EZXZpY2VDYWxsYmFjayhib29sIGVuYWJsZWQpIHsKK3N0YXR1c190IE1lZGlhUGxheWVyMjo6YWRkQXVkaW9EZXZpY2VDYWxsYmFjayhqb2JqZWN0IHJvdXRpbmdEZWxlZ2F0ZSkgewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgaWYgKG1BdWRpb091dHB1dCA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dWKCJhZGRBdWRpb0RldmljZUNhbGxiYWNrOiBwbGF5ZXIgbm90IGluaXQiKTsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQotICAgIHJldHVybiBtQXVkaW9PdXRwdXQtPmVuYWJsZUF1ZGlvRGV2aWNlQ2FsbGJhY2soZW5hYmxlZCk7CisgICAgcmV0dXJuIG1BdWRpb091dHB1dC0+YWRkQXVkaW9EZXZpY2VDYWxsYmFjayhyb3V0aW5nRGVsZWdhdGUpOworfQorCitzdGF0dXNfdCBNZWRpYVBsYXllcjI6OnJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2soam9iamVjdCBsaXN0ZW5lcikgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1BdWRpb091dHB1dCA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dWKCJhZGRBdWRpb0RldmljZUNhbGxiYWNrOiBwbGF5ZXIgbm90IGluaXQiKTsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIHJldHVybiBtQXVkaW9PdXRwdXQtPnJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2sobGlzdGVuZXIpOwogfQogCiBzdGF0dXNfdCBNZWRpYVBsYXllcjI6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL0FuZHJvaWQuYnAKaW5kZXggYzhkZGMxMS4uOTNjMjE4ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvQW5kcm9pZC5icApAQCAtMSw2ICsxLDcgQEAKIGNjX2xpYnJhcnlfc3RhdGljIHsKIAogICAgIHNyY3M6IFsKKyAgICAgICAgIkpNZWRpYVBsYXllcjJVdGlscy5jcHAiLAogICAgICAgICAiSldha2VMb2NrLmNwcCIsCiAgICAgICAgICJHZW5lcmljU291cmNlMi5jcHAiLAogICAgICAgICAiSFRUUExpdmVTb3VyY2UyLmNwcCIsCkBAIC0yOCw2ICsyOSw4IEBACiAgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMiLAogICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwIiwKICAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0IiwKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbmRrIiwKKyAgICAgICAgImZyYW1ld29ya3MvYmFzZS9jb3JlL2puaSIsCiAgICAgXSwKIAogICAgIGNmbGFnczogWwpAQCAtNDgsMTMgKzUxLDE1IEBACiAgICAgICAgICJsaWJ1aSIsCiAgICAgICAgICJsaWJndWkiLAogICAgICAgICAibGlibWVkaWEiLAotICAgICAgICAibGlibWVkaWFkcm0iLAogICAgICAgICAibGlibWVkaWFuZGsiLAorICAgICAgICAibGlibWVkaWFuZGtfdXRpbHMiLAogICAgICAgICAibGlicG93ZXJtYW5hZ2VyIiwKICAgICBdLAogCiAgICAgc3RhdGljX2xpYnM6IFsKICAgICAgICAgImxpYm1lZGlhX2hlbHBlciIsCisgICAgICAgICJsaWJtZWRpYXBsYXllcjItcHJvdG9zIiwKKyAgICAgICAgImxpYm1lZGlhMl9qbmlfY29yZSIsCiAgICAgXSwKIAogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9udXBsYXllcjIiLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9HZW5lcmljU291cmNlMi5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL0dlbmVyaWNTb3VyY2UyLmNwcAppbmRleCAxOTZiMTAzLi4xODYwYjBjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL0dlbmVyaWNTb3VyY2UyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL0dlbmVyaWNTb3VyY2UyLmNwcApAQCAtMjEsMzAgKzIxLDE5IEBACiAjaW5jbHVkZSAiTnVQbGF5ZXIyRHJtLmgiCiAKICNpbmNsdWRlICJBbm90aGVyUGFja2V0U291cmNlLmgiCi0jaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL01lZGlhQnVmZmVySG9sZGVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvSU1lZGlhRXh0cmFjdG9yU2VydmljZS5oPgotI2luY2x1ZGUgPG1lZGlhL0lNZWRpYVNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhSFRUUFNlcnZpY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3Rvci5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvTmRrV3JhcHBlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2VGYWN0b3J5Lmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvSW50ZXJmYWNlVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ2xvY2suaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3RvckZhY3RvcnkuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L05ka1V0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KLSNpbmNsdWRlICIuLi8uLi9saWJzdGFnZWZyaWdodC9pbmNsdWRlL051Q2FjaGVkU291cmNlMi5oIgotI2luY2x1ZGUgIi4uLy4uL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvSFRUUEJhc2UuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC04OSw4ICs3OCw2IEBACiB2b2lkIE51UGxheWVyMjo6R2VuZXJpY1NvdXJjZTI6OnJlc2V0RGF0YVNvdXJjZSgpIHsKICAgICBBTE9HVigicmVzZXREYXRhU291cmNlIik7CiAKLSAgICBtSFRUUFNlcnZpY2UuY2xlYXIoKTsKLSAgICBtSHR0cFNvdXJjZS5jbGVhcigpOwogICAgIG1EaXNjb25uZWN0ZWQgPSBmYWxzZTsKICAgICBtVXJpLmNsZWFyKCk7CiAgICAgbVVyaUhlYWRlcnMuY2xlYXIoKTsKQEAgLTExMCw3ICs5Nyw2IEBACiB9CiAKIHN0YXR1c190IE51UGxheWVyMjo6R2VuZXJpY1NvdXJjZTI6OnNldERhdGFTb3VyY2UoCi0gICAgICAgIGNvbnN0IHNwPE1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKICAgICAgICAgY29uc3QgY2hhciAqdXJsLAogICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycykgewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CkBAIC0xMTgsNyArMTA0LDYgQEAKIAogICAgIHJlc2V0RGF0YVNvdXJjZSgpOwogCi0gICAgbUhUVFBTZXJ2aWNlID0gaHR0cFNlcnZpY2U7CiAgICAgbVVyaSA9IHVybDsKIAogICAgIGlmIChoZWFkZXJzKSB7CkBAIC0xNTEsNyArMTM2LDcgQEAKICAgICBBTE9HVigic2V0RGF0YVNvdXJjZSAoc291cmNlOiAlcCkiLCBzb3VyY2UuZ2V0KCkpOwogCiAgICAgcmVzZXREYXRhU291cmNlKCk7Ci0gICAgbURhdGFTb3VyY2UgPSBzb3VyY2U7CisgICAgbURhdGFTb3VyY2VXcmFwcGVyID0gbmV3IEFNZWRpYURhdGFTb3VyY2VXcmFwcGVyKHNvdXJjZSk7CiAgICAgcmV0dXJuIE9LOwogfQogCkBAIC0xNjIsMjQgKzE0NywyMSBAQAogCiBzdGF0dXNfdCBOdVBsYXllcjI6OkdlbmVyaWNTb3VyY2UyOjppbml0RnJvbURhdGFTb3VyY2UoKSB7CiAgICAgbUV4dHJhY3RvciA9IG5ldyBBTWVkaWFFeHRyYWN0b3JXcmFwcGVyKEFNZWRpYUV4dHJhY3Rvcl9uZXcoKSk7Ci0gICAgQ0hFQ0sobURhdGFTb3VyY2UgIT0gTlVMTCB8fCBtRmQgIT0gLTEpOwotICAgIHNwPERhdGFTb3VyY2U+IGRhdGFTb3VyY2UgPSBtRGF0YVNvdXJjZTsKKyAgICBDSEVDSyhtRmQgPj0wIHx8IG1EYXRhU291cmNlV3JhcHBlciAhPSBOVUxMKTsKKyAgICBzcDxBTWVkaWFEYXRhU291cmNlV3JhcHBlcj4gYVNvdXJjZVdyYXBwZXIgPSBtRGF0YVNvdXJjZVdyYXBwZXI7CiAgICAgY29uc3QgaW50IGZkID0gbUZkOwotICAgIGNvbnN0IGludDY0X3Qgb2Zmc2V0ID0gbU9mZnNldDsKLSAgICBjb25zdCBpbnQ2NF90IGxlbmd0aCA9IG1MZW5ndGg7CiAKICAgICBtTG9jay51bmxvY2soKTsKICAgICAvLyBUaGlzIG1pZ2h0IHRha2UgbG9uZyB0aW1lIGlmIGRhdGEgc291cmNlIGlzIG5vdCByZWxpYWJsZS4KICAgICBzdGF0dXNfdCBlcnI7Ci0gICAgaWYgKGRhdGFTb3VyY2UgIT0gbnVsbHB0cikgewotICAgICAgICBtRGF0YVNvdXJjZVdyYXBwZXIgPSBuZXcgQU1lZGlhRGF0YVNvdXJjZVdyYXBwZXIoZGF0YVNvdXJjZSk7Ci0gICAgICAgIGVyciA9IG1FeHRyYWN0b3ItPnNldERhdGFTb3VyY2UobURhdGFTb3VyY2VXcmFwcGVyLT5nZXRBTWVkaWFEYXRhU291cmNlKCkpOworICAgIGlmIChhU291cmNlV3JhcHBlciAhPSBOVUxMKSB7CisgICAgICAgIGVyciA9IG1FeHRyYWN0b3ItPnNldERhdGFTb3VyY2UoYVNvdXJjZVdyYXBwZXItPmdldEFNZWRpYURhdGFTb3VyY2UoKSk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgZXJyID0gbUV4dHJhY3Rvci0+c2V0RGF0YVNvdXJjZShmZCwgb2Zmc2V0LCBsZW5ndGgpOworICAgICAgICBlcnIgPSBtRXh0cmFjdG9yLT5zZXREYXRhU291cmNlKGZkLCBtT2Zmc2V0LCBtTGVuZ3RoKTsKICAgICB9CiAKICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIEFMT0dFKCJpbml0RnJvbURhdGFTb3VyY2UsIGZhaWxlZCB0byBjcmVhdGUgZGF0YSBzb3VyY2UhIik7CisgICAgICAgIEFMT0dFKCJpbml0RnJvbURhdGFTb3VyY2UsIGZhaWxlZCB0byBzZXQgZXh0cmFjdG9yIGRhdGEgc291cmNlISIpOwogICAgICAgICBtTG9jay5sb2NrKCk7CiAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwogICAgIH0KQEAgLTE5MSwxMCArMTczLDggQEAKICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CiAgICAgfQogCi0gICAgbUxvY2subG9jaygpOwotICAgIG1GZCA9IC0xOwotICAgIG1EYXRhU291cmNlID0gZGF0YVNvdXJjZTsKICAgICBtRmlsZU1ldGEgPSBjb252ZXJ0TWVkaWFGb3JtYXRXcmFwcGVyVG9NZXRhRGF0YShtRXh0cmFjdG9yLT5nZXRGb3JtYXQoKSk7CisgICAgbUxvY2subG9jaygpOwogICAgIGlmIChtRmlsZU1ldGEgIT0gTlVMTCkgewogICAgICAgICBpbnQ2NF90IGR1cmF0aW9uOwogICAgICAgICBpZiAobUZpbGVNZXRhLT5maW5kSW50NjQoa0tleUR1cmF0aW9uLCAmZHVyYXRpb24pKSB7CkBAIC0yMTUsMTAgKzE5NSwxMCBAQAogICAgICAgICB9CiAKICAgICAgICAgc3A8QU1lZGlhRXh0cmFjdG9yV3JhcHBlcj4gdHJhY2tFeHRyYWN0b3IgPSBuZXcgQU1lZGlhRXh0cmFjdG9yV3JhcHBlcihBTWVkaWFFeHRyYWN0b3JfbmV3KCkpOwotICAgICAgICBpZiAobURhdGFTb3VyY2VXcmFwcGVyICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgIGVyciA9IHRyYWNrRXh0cmFjdG9yLT5zZXREYXRhU291cmNlKG1EYXRhU291cmNlV3JhcHBlci0+Z2V0QU1lZGlhRGF0YVNvdXJjZSgpKTsKKyAgICAgICAgaWYgKGFTb3VyY2VXcmFwcGVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHRyYWNrRXh0cmFjdG9yLT5zZXREYXRhU291cmNlKGFTb3VyY2VXcmFwcGVyLT5nZXRBTWVkaWFEYXRhU291cmNlKCkpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZXJyID0gdHJhY2tFeHRyYWN0b3ItPnNldERhdGFTb3VyY2UoZmQsIG9mZnNldCwgbGVuZ3RoKTsKKyAgICAgICAgICAgIHRyYWNrRXh0cmFjdG9yLT5zZXREYXRhU291cmNlKGZkLCBtT2Zmc2V0LCBtTGVuZ3RoKTsKICAgICAgICAgfQogCiAgICAgICAgIGNvbnN0IGNoYXIgKm1pbWU7CkBAIC0zMzAsMTMgKzMxMCwxMyBAQAogICAgICAgICBtTG9vcGVyLT51bnJlZ2lzdGVySGFuZGxlcihpZCgpKTsKICAgICAgICAgbUxvb3Blci0+c3RvcCgpOwogICAgIH0KLSAgICBpZiAobURhdGFTb3VyY2UgIT0gTlVMTCkgewotICAgICAgICBtRGF0YVNvdXJjZS0+Y2xvc2UoKTsKKyAgICBpZiAobURhdGFTb3VyY2VXcmFwcGVyICE9IE5VTEwpIHsKKyAgICAgICAgbURhdGFTb3VyY2VXcmFwcGVyLT5jbG9zZSgpOwogICAgIH0KICAgICByZXNldERhdGFTb3VyY2UoKTsKIH0KIAotdm9pZCBOdVBsYXllcjI6OkdlbmVyaWNTb3VyY2UyOjpwcmVwYXJlQXN5bmMoKSB7Cit2b2lkIE51UGxheWVyMjo6R2VuZXJpY1NvdXJjZTI6OnByZXBhcmVBc3luYyhpbnQ2NF90IHN0YXJ0VGltZVVzKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBBTE9HVigicHJlcGFyZUFzeW5jOiAobG9vcGVyOiAlZCkiLCAobUxvb3BlciAhPSBOVUxMKSk7CiAKQEAgLTM1MSw1OSArMzMxLDQ1IEBACiAgICAgfQogCiAgICAgc3A8QU1lc3NhZ2U+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+IGdldEZvcm1hdE1ldGFfbChib29sIGF1ZGlvKTsKICAgICBpbnQzMl90IGdldERhdGFHZW5lcmF0aW9uKG1lZGlhX3RyYWNrX3R5cGUgdHlwZSkgY29uc3Q7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL0hUVFBMaXZlU291cmNlMi5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL0hUVFBMaXZlU291cmNlMi5jcHAKaW5kZXggYTYxY2FjZC4uMTc1YmU1MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9IVFRQTGl2ZVNvdXJjZTIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvSFRUUExpdmVTb3VyY2UyLmNwcApAQCAtOTksNyArOTksOCBAQAogICAgIHJldHVybiBPSzsKIH0KIAotdm9pZCBOdVBsYXllcjI6OkhUVFBMaXZlU291cmNlMjo6cHJlcGFyZUFzeW5jKCkgeworLy8gVE9ETzogZmV0Y2ggZGF0YSBzdGFydGluZyBmcm9tIHxzdGFydFRpbWVVc3wKK3ZvaWQgTnVQbGF5ZXIyOjpIVFRQTGl2ZVNvdXJjZTI6OnByZXBhcmVBc3luYyhpbnQ2NF90IC8qIHN0YXJ0VGltZVVzICovKSB7CiAgICAgaWYgKG1MaXZlTG9vcGVyID09IE5VTEwpIHsKICAgICAgICAgbUxpdmVMb29wZXIgPSBuZXcgQUxvb3BlcjsKICAgICAgICAgbUxpdmVMb29wZXItPnNldE5hbWUoImh0dHAgbGl2ZSIpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9IVFRQTGl2ZVNvdXJjZTIuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvSFRUUExpdmVTb3VyY2UyLmgKaW5kZXggOTdkMzY1My4uOGZjNzFlMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9IVFRQTGl2ZVNvdXJjZTIuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL0hUVFBMaXZlU291cmNlMi5oCkBAIC0zOCw3ICszOCw3IEBACiAgICAgICAgICAgICBCdWZmZXJpbmdTZXR0aW5ncyogYnVmZmVyaW5nIC8qIG5vbm51bGwgKi8pIG92ZXJyaWRlOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QnVmZmVyaW5nU2V0dGluZ3MoY29uc3QgQnVmZmVyaW5nU2V0dGluZ3MmIGJ1ZmZlcmluZykgb3ZlcnJpZGU7CiAKLSAgICB2aXJ0dWFsIHZvaWQgcHJlcGFyZUFzeW5jKCk7CisgICAgdmlydHVhbCB2b2lkIHByZXBhcmVBc3luYyhpbnQ2NF90IHN0YXJ0VGltZVVzKTsKICAgICB2aXJ0dWFsIHZvaWQgc3RhcnQoKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZGVxdWV1ZUFjY2Vzc1VuaXQoYm9vbCBhdWRpbywgc3A8QUJ1ZmZlcj4gKmFjY2Vzc1VuaXQpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9KTWVkaWFQbGF5ZXIyVXRpbHMuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9KTWVkaWFQbGF5ZXIyVXRpbHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiZDIyYmMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL0pNZWRpYVBsYXllcjJVdGlscy5jcHAKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJKTWVkaWFQbGF5ZXIyVXRpbHMiCisKKyNpbmNsdWRlICJKTWVkaWFQbGF5ZXIyVXRpbHMuaCIKKyNpbmNsdWRlIDxtZWRpYXBsYXllcjIvSmF2YVZNSGVscGVyLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgorI2luY2x1ZGUgPG5hdGl2ZWhlbHBlci9KTklIZWxwLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJsb2cvbG9nLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RhdGljIGNvbnN0IGludDY0X3Qga09mZmxvYWRNaW5EdXJhdGlvblNlYyA9IDYwOworCisvLyBzdGF0aWMKK2Jvb2wgSk1lZGlhUGxheWVyMlV0aWxzOjppc09mZmxvYWRlZEF1ZGlvUGxheWJhY2tTdXBwb3J0ZWQoCisgICAgICAgIGNvbnN0IHNwPE1ldGFEYXRhPiYgbWV0YSwgYm9vbCBoYXNWaWRlbywgYm9vbCBpc1N0cmVhbWluZywgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlKQoreworICAgIGlmIChoYXNWaWRlbyB8fCBzdHJlYW1UeXBlICE9IEFVRElPX1NUUkVBTV9NVVNJQykgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgaW5mbyA9IEFVRElPX0lORk9fSU5JVElBTElaRVI7CisgICAgaWYgKE9LICE9IGdldEF1ZGlvT2ZmbG9hZEluZm8obWV0YSwgaGFzVmlkZW8sIGlzU3RyZWFtaW5nLCBzdHJlYW1UeXBlLCAmaW5mbykpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChpbmZvLmR1cmF0aW9uX3VzIDwga09mZmxvYWRNaW5EdXJhdGlvblNlYyAqIDEwMDAwMDApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGludDMyX3QgYXVkaW9Gb3JtYXQgPSBhdWRpb0Zvcm1hdEZyb21OYXRpdmUoaW5mby5mb3JtYXQpOworICAgIGludDMyX3QgY2hhbm5lbE1hc2sgPSBvdXRDaGFubmVsTWFza0Zyb21OYXRpdmUoaW5mby5jaGFubmVsX21hc2spOworICAgIGlmIChhdWRpb0Zvcm1hdCA9PSBFTkNPRElOR19JTlZBTElEIHx8IGNoYW5uZWxNYXNrID09IENIQU5ORUxfSU5WQUxJRCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgSk5JRW52KiBlbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOworICAgIGpjbGFzcyBqTVAyVXRpbHNDbHMgPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9tZWRpYS9NZWRpYVBsYXllcjJVdGlscyIpOworICAgIGptZXRob2RJRCBqU2V0QXVkaW9PdXRwdXREZXZpY2VCeUlkID0gZW52LT5HZXRTdGF0aWNNZXRob2RJRCgKKyAgICAgICAgICAgIGpNUDJVdGlsc0NscywgImlzT2ZmbG9hZGVkQXVkaW9QbGF5YmFja1N1cHBvcnRlZCIsICIoSUlJKVoiKTsKKyAgICBqYm9vbGVhbiByZXN1bHQgPSBlbnYtPkNhbGxTdGF0aWNCb29sZWFuTWV0aG9kKAorICAgICAgICAgICAgak1QMlV0aWxzQ2xzLCBqU2V0QXVkaW9PdXRwdXREZXZpY2VCeUlkLCBhdWRpb0Zvcm1hdCwgaW5mby5zYW1wbGVfcmF0ZSwgY2hhbm5lbE1hc2spOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL0pNZWRpYVBsYXllcjJVdGlscy5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9KTWVkaWFQbGF5ZXIyVXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2JkNDNjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9KTWVkaWFQbGF5ZXIyVXRpbHMuaApAQCAtMCwwICsxLDM1IEBACisvKgorICogQ29weXJpZ2h0IDIwMTgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9KX01FRElBUExBWUVSMl9VVElMUzJfSF8KKyNkZWZpbmUgX0pfTUVESUFQTEFZRVIyX1VUSUxTMl9IXworCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKworI2luY2x1ZGUgImpuaS5oIgorI2luY2x1ZGUgImFuZHJvaWRfbWVkaWFfQXVkaW9Gb3JtYXQuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgSk1lZGlhUGxheWVyMlV0aWxzIHsKKyAgICBzdGF0aWMgYm9vbCBpc09mZmxvYWRlZEF1ZGlvUGxheWJhY2tTdXBwb3J0ZWQoCisgICAgICAgICAgICBjb25zdCBzcDxNZXRhRGF0YT4mIG1ldGEsIGJvb2wgaGFzVmlkZW8sIGJvb2wgaXNTdHJlYW1pbmcsCisgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBfSl9NRURJQVBMQVlFUjJfVVRJTFMyX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMi5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMi5jcHAKaW5kZXggMDYwYjY5OC4uNWVhNjAwZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyLmNwcApAQCAtMjQsNiArMjQsNyBAQAogI2luY2x1ZGUgIk51UGxheWVyMi5oIgogCiAjaW5jbHVkZSAiSFRUUExpdmVTb3VyY2UyLmgiCisjaW5jbHVkZSAiSk1lZGlhUGxheWVyMlV0aWxzLmgiCiAjaW5jbHVkZSAiTnVQbGF5ZXIyQ0NEZWNvZGVyLmgiCiAjaW5jbHVkZSAiTnVQbGF5ZXIyRGVjb2Rlci5oIgogI2luY2x1ZGUgIk51UGxheWVyMkRlY29kZXJCYXNlLmgiCkBAIC0zMyw3ICszNCw3IEBACiAjaW5jbHVkZSAiTnVQbGF5ZXIyU291cmNlLmgiCiAjaW5jbHVkZSAiUlRTUFNvdXJjZTIuaCIKICNpbmNsdWRlICJHZW5lcmljU291cmNlMi5oIgotI2luY2x1ZGUgIlRleHREZXNjcmlwdGlvbnMuaCIKKyNpbmNsdWRlICJUZXh0RGVzY3JpcHRpb25zMi5oIgogCiAjaW5jbHVkZSAiQVRTUGFyc2VyLmgiCiAKQEAgLTIxMiwxMSArMjEzLDExIEBACiAgICAgOiBtUElEKHBpZCksCiAgICAgICBtVUlEKHVpZCksCiAgICAgICBtTWVkaWFDbG9jayhtZWRpYUNsb2NrKSwKLSAgICAgIG1Tb3VyY2VGbGFncygwKSwKICAgICAgIG1PZmZsb2FkQXVkaW8oZmFsc2UpLAogICAgICAgbUF1ZGlvRGVjb2RlckdlbmVyYXRpb24oMCksCiAgICAgICBtVmlkZW9EZWNvZGVyR2VuZXJhdGlvbigwKSwKICAgICAgIG1SZW5kZXJlckdlbmVyYXRpb24oMCksCisgICAgICBtRU9TTW9uaXRvckdlbmVyYXRpb24oMCksCiAgICAgICBtTGFzdFN0YXJ0ZWRQbGF5aW5nVGltZU5zKDApLAogICAgICAgbVByZXZpb3VzU2Vla1RpbWVVcygwKSwKICAgICAgIG1BdWRpb0VPUyhmYWxzZSksCkBAIC0yNDAsOCArMjQxLDcgQEAKICAgICAgIG1QYXVzZWQoZmFsc2UpLAogICAgICAgbVBhdXNlZEJ5Q2xpZW50KHRydWUpLAogICAgICAgbVBhdXNlZEZvckJ1ZmZlcmluZyhmYWxzZSksCi0gICAgICBtSXNEcm1Qcm90ZWN0ZWQoZmFsc2UpLAotICAgICAgbURhdGFTb3VyY2VUeXBlKERBVEFfU09VUkNFX1RZUEVfTk9ORSkgeworICAgICAgbUlzRHJtUHJvdGVjdGVkKGZhbHNlKSB7CiAgICAgQ0hFQ0sobWVkaWFDbG9jayAhPSBOVUxMKTsKICAgICBjbGVhckZsdXNoQ29tcGxldGUoKTsKIH0KQEAgLTMwOSw3ICszMDksNyBAQAogICAgICAgICAgICAgICAgIHNwPEdlbmVyaWNTb3VyY2UyPiBnZW5lcmljU291cmNlID0KICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBHZW5lcmljU291cmNlMihub3RpZnksIG1VSUQsIG1NZWRpYUNsb2NrKTsKIAotICAgICAgICAgICAgICAgIGVyciA9IGdlbmVyaWNTb3VyY2UtPnNldERhdGFTb3VyY2UoaHR0cFNlcnZpY2UsIHVybCwgaGVhZGVycyk7CisgICAgICAgICAgICAgICAgZXJyID0gZ2VuZXJpY1NvdXJjZS0+c2V0RGF0YVNvdXJjZSh1cmwsIGhlYWRlcnMpOwogCiAgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgewogICAgICAgICAgICAgICAgICAgICAqc291cmNlID0gZ2VuZXJpY1NvdXJjZTsKQEAgLTM5MywxMSArMzkzLDEzIEBACiAgICAgLy8gTm93LCBzb3VyY2UgIT0gTlVMTC4KICAgICAqLwogCi0gICAgbURhdGFTb3VyY2VUeXBlID0gZGF0YVNvdXJjZVR5cGU7CisgICAgbUN1cnJlbnRTb3VyY2VJbmZvLm1EYXRhU291cmNlVHlwZSA9IGRhdGFTb3VyY2VUeXBlOwogCiAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNldERhdGFTb3VyY2UsIHRoaXMpOwogICAgIG1zZy0+c2V0T2JqZWN0KCJzb3VyY2UiLCBzb3VyY2UpOwogICAgIG1zZy0+c2V0SW50NjQoInNyY0lkIiwgZHNkLT5tSWQpOworICAgIG1zZy0+c2V0SW50NjQoInN0YXJ0VGltZVVzIiwgZHNkLT5tU3RhcnRQb3NpdGlvbk1zICogMTAwMCk7CisgICAgbXNnLT5zZXRJbnQ2NCgiZW5kVGltZVVzIiwgZHNkLT5tRW5kUG9zaXRpb25NcyAqIDEwMDApOwogICAgIG1zZy0+cG9zdCgpOwogfQogCkBAIC00MTUsMTEgKzQxNywxMyBAQAogICAgIC8vIE5vdywgc291cmNlICE9IE5VTEwuCiAgICAgKi8KIAotICAgIG1OZXh0RGF0YVNvdXJjZVR5cGUgPSBkYXRhU291cmNlVHlwZTsKKyAgICBtTmV4dFNvdXJjZUluZm8ubURhdGFTb3VyY2VUeXBlID0gZGF0YVNvdXJjZVR5cGU7CiAKICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UHJlcGFyZU5leHREYXRhU291cmNlLCB0aGlzKTsKICAgICBtc2ctPnNldE9iamVjdCgic291cmNlIiwgc291cmNlKTsKICAgICBtc2ctPnNldEludDY0KCJzcmNJZCIsIGRzZC0+bUlkKTsKKyAgICBtc2ctPnNldEludDY0KCJzdGFydFRpbWVVcyIsIGRzZC0+bVN0YXJ0UG9zaXRpb25NcyAqIDEwMDApOworICAgIG1zZy0+c2V0SW50NjQoImVuZFRpbWVVcyIsIGRzZC0+bUVuZFBvc2l0aW9uTXMgKiAxMDAwKTsKICAgICBtc2ctPnBvc3QoKTsKIH0KIApAQCAtNDg3LDcgKzQ5MSw3IEBACiBzdGF0dXNfdCBOdVBsYXllcjI6OnNldFBsYXliYWNrU2V0dGluZ3MoY29uc3QgQXVkaW9QbGF5YmFja1JhdGUgJnJhdGUpIHsKICAgICAvLyBkbyBzb21lIGN1cnNvcnkgdmFsaWRhdGlvbiBvZiB0aGUgc2V0dGluZ3MgaGVyZS4gYXVkaW8gbW9kZXMgYXJlCiAgICAgLy8gb25seSB2YWxpZGF0ZWQgd2hlbiBzZXQgb24gdGhlIGF1ZGlvc2luay4KLSAgICAgaWYgKChyYXRlLm1TcGVlZCAhPSAwLmYgJiYgcmF0ZS5tU3BlZWQgPCBBVURJT19USU1FU1RSRVRDSF9TUEVFRF9NSU4pCisgICAgIGlmIChyYXRlLm1TcGVlZCA8IEFVRElPX1RJTUVTVFJFVENIX1NQRUVEX01JTgogICAgICAgICAgICAgfHwgcmF0ZS5tU3BlZWQgPiBBVURJT19USU1FU1RSRVRDSF9TUEVFRF9NQVgKICAgICAgICAgICAgIHx8IHJhdGUubVBpdGNoIDwgQVVESU9fVElNRVNUUkVUQ0hfU1BFRURfTUlOCiAgICAgICAgICAgICB8fCByYXRlLm1QaXRjaCA+IEFVRElPX1RJTUVTVFJFVENIX1NQRUVEX01BWCkgewpAQCAtNTU0LDcgKzU1OCw3IEBACiAgICAgc3A8U291cmNlPiBzb3VyY2U7CiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobVNvdXJjZUxvY2spOwotICAgICAgICBzb3VyY2UgPSBtU291cmNlOworICAgICAgICBzb3VyY2UgPSBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZTsKICAgICB9CiAKICAgICBpZiAoc291cmNlICE9IE5VTEwpIHsKQEAgLTU4NCw5ICs1ODgsMTMgQEAKICAgICBtc2ctPnBvc3QoKTsKIH0KIAordm9pZCBOdVBsYXllcjI6OnJld2luZCgpIHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UmV3aW5kLCB0aGlzKTsKKyAgICBtc2ctPnBvc3QoKTsKK30KIAogdm9pZCBOdVBsYXllcjI6OndyaXRlVHJhY2tJbmZvKAotICAgICAgICBQYXJjZWwqIHJlcGx5LCBjb25zdCBzcDxBTWVzc2FnZT4mIGZvcm1hdCkgY29uc3QgeworICAgICAgICBQbGF5ZXJNZXNzYWdlKiByZXBseSwgY29uc3Qgc3A8QU1lc3NhZ2U+JiBmb3JtYXQpIGNvbnN0IHsKICAgICBpZiAoZm9ybWF0ID09IE5VTEwpIHsKICAgICAgICAgQUxPR0UoIk5VTEwgZm9ybWF0Iik7CiAgICAgICAgIHJldHVybjsKQEAgLTYxOSwxMCArNjI3LDkgQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIHJlcGx5LT53cml0ZUludDMyKDIpOyAvLyB3cml0ZSBzb21ldGhpbmcgbm9uLXplcm8KLSAgICByZXBseS0+d3JpdGVJbnQzMih0cmFja1R5cGUpOwotICAgIHJlcGx5LT53cml0ZVN0cmluZzE2KFN0cmluZzE2KG1pbWUuY19zdHIoKSkpOwotICAgIHJlcGx5LT53cml0ZVN0cmluZzE2KFN0cmluZzE2KGxhbmcuY19zdHIoKSkpOworICAgIHJlcGx5LT5hZGRfdmFsdWVzKCktPnNldF9pbnQzMl92YWx1ZSh0cmFja1R5cGUpOworICAgIHJlcGx5LT5hZGRfdmFsdWVzKCktPnNldF9zdHJpbmdfdmFsdWUobWltZS5jX3N0cigpKTsKKyAgICByZXBseS0+YWRkX3ZhbHVlcygpLT5zZXRfc3RyaW5nX3ZhbHVlKGxhbmcuY19zdHIoKSk7CiAKICAgICBpZiAodHJhY2tUeXBlID09IE1FRElBX1RSQUNLX1RZUEVfU1VCVElUTEUpIHsKICAgICAgICAgaW50MzJfdCBpc0F1dG8sIGlzRGVmYXVsdCwgaXNGb3JjZWQ7CkBAIC02MzAsMjcgKzYzNywzMCBAQAogICAgICAgICBDSEVDSyhmb3JtYXQtPmZpbmRJbnQzMigiZGVmYXVsdCIsICZpc0RlZmF1bHQpKTsKICAgICAgICAgQ0hFQ0soZm9ybWF0LT5maW5kSW50MzIoImZvcmNlZCIsICZpc0ZvcmNlZCkpOwogCi0gICAgICAgIHJlcGx5LT53cml0ZUludDMyKGlzQXV0byk7Ci0gICAgICAgIHJlcGx5LT53cml0ZUludDMyKGlzRGVmYXVsdCk7Ci0gICAgICAgIHJlcGx5LT53cml0ZUludDMyKGlzRm9yY2VkKTsKKyAgICAgICAgcmVwbHktPmFkZF92YWx1ZXMoKS0+c2V0X2ludDMyX3ZhbHVlKGlzQXV0byk7CisgICAgICAgIHJlcGx5LT5hZGRfdmFsdWVzKCktPnNldF9pbnQzMl92YWx1ZShpc0RlZmF1bHQpOworICAgICAgICByZXBseS0+YWRkX3ZhbHVlcygpLT5zZXRfaW50MzJfdmFsdWUoaXNGb3JjZWQpOwogICAgIH0KIH0KIAogdm9pZCBOdVBsYXllcjI6Om9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisKICAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7CiAgICAgICAgIGNhc2Uga1doYXRTZXREYXRhU291cmNlOgogICAgICAgICB7CiAgICAgICAgICAgICBBTE9HVigia1doYXRTZXREYXRhU291cmNlIik7CiAKLSAgICAgICAgICAgIENIRUNLKG1Tb3VyY2UgPT0gTlVMTCk7CisgICAgICAgICAgICBDSEVDSyhtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZSA9PSBOVUxMKTsKIAogICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gT0s7CiAgICAgICAgICAgICBzcDxSZWZCYXNlPiBvYmo7CiAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRPYmplY3QoInNvdXJjZSIsICZvYmopKTsKICAgICAgICAgICAgIGlmIChvYmogIT0gTlVMTCkgewogICAgICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtU291cmNlTG9jayk7Ci0gICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50NjQoInNyY0lkIiwgJm1TcmNJZCkpOwotICAgICAgICAgICAgICAgIG1Tb3VyY2UgPSBzdGF0aWNfY2FzdDxTb3VyY2UgKj4ob2JqLmdldCgpKTsKKyAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgic3JjSWQiLCAmbUN1cnJlbnRTb3VyY2VJbmZvLm1TcmNJZCkpOworICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJzdGFydFRpbWVVcyIsICZtQ3VycmVudFNvdXJjZUluZm8ubVN0YXJ0VGltZVVzKSk7CisgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50NjQoImVuZFRpbWVVcyIsICZtQ3VycmVudFNvdXJjZUluZm8ubUVuZFRpbWVVcykpOworICAgICAgICAgICAgICAgIG1DdXJyZW50U291cmNlSW5mby5tU291cmNlID0gc3RhdGljX2Nhc3Q8U291cmNlICo+KG9iai5nZXQoKSk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGVyciA9IFVOS05PV05fRVJST1I7CiAgICAgICAgICAgICAgICAgQUxPR0UoImtXaGF0U2V0RGF0YVNvdXJjZSwgc291cmNlIHNob3VsZCBub3QgYmUgTlVMTCIpOwpAQCAtNjU5LDcgKzY2OSw3IEBACiAgICAgICAgICAgICBDSEVDSyhtRHJpdmVyICE9IE5VTEwpOwogICAgICAgICAgICAgc3A8TnVQbGF5ZXIyRHJpdmVyPiBkcml2ZXIgPSBtRHJpdmVyLnByb21vdGUoKTsKICAgICAgICAgICAgIGlmIChkcml2ZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGRyaXZlci0+bm90aWZ5U2V0RGF0YVNvdXJjZUNvbXBsZXRlZChtU3JjSWQsIGVycik7CisgICAgICAgICAgICAgICAgZHJpdmVyLT5ub3RpZnlTZXREYXRhU291cmNlQ29tcGxldGVkKG1DdXJyZW50U291cmNlSW5mby5tU3JjSWQsIGVycik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtNjczLDkgKzY4MywxMSBAQAogICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kT2JqZWN0KCJzb3VyY2UiLCAmb2JqKSk7CiAgICAgICAgICAgICBpZiAob2JqICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobVNvdXJjZUxvY2spOwotICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJzcmNJZCIsICZtTmV4dFNyY0lkKSk7Ci0gICAgICAgICAgICAgICAgbU5leHRTb3VyY2UgPSBzdGF0aWNfY2FzdDxTb3VyY2UgKj4ob2JqLmdldCgpKTsKLSAgICAgICAgICAgICAgICBtTmV4dFNvdXJjZS0+cHJlcGFyZUFzeW5jKCk7CisgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50NjQoInNyY0lkIiwgJm1OZXh0U291cmNlSW5mby5tU3JjSWQpKTsKKyAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgic3RhcnRUaW1lVXMiLCAmbU5leHRTb3VyY2VJbmZvLm1TdGFydFRpbWVVcykpOworICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJlbmRUaW1lVXMiLCAmbU5leHRTb3VyY2VJbmZvLm1FbmRUaW1lVXMpKTsKKyAgICAgICAgICAgICAgICBtTmV4dFNvdXJjZUluZm8ubVNvdXJjZSA9IHN0YXRpY19jYXN0PFNvdXJjZSAqPihvYmouZ2V0KCkpOworICAgICAgICAgICAgICAgIG1OZXh0U291cmNlSW5mby5tU291cmNlLT5wcmVwYXJlQXN5bmMobU5leHRTb3VyY2VJbmZvLm1TdGFydFRpbWVVcyk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGVyciA9IFVOS05PV05fRVJST1I7CiAgICAgICAgICAgICB9CkBAIC02ODgsNyArNzAwLDcgQEAKICAgICAgICAgICAgIEFMT0dWKCJrV2hhdFBsYXlOZXh0RGF0YVNvdXJjZSIpOwogICAgICAgICAgICAgaW50NjRfdCBzcmNJZDsKICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJzcmNJZCIsICZzcmNJZCkpOwotICAgICAgICAgICAgaWYgKHNyY0lkICE9IG1OZXh0U3JjSWQpIHsKKyAgICAgICAgICAgIGlmIChzcmNJZCAhPSBtTmV4dFNvdXJjZUluZm8ubVNyY0lkKSB7CiAgICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIoc3JjSWQsIE1FRElBMl9FUlJPUiwgTUVESUEyX0VSUk9SX1VOS05PV04sIDApOwogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KQEAgLTcwOSw2ICs3MjEsMjIgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBrV2hhdEVPU01vbml0b3I6CisgICAgICAgIHsKKyAgICAgICAgICAgIGludDMyX3QgZ2VuZXJhdGlvbjsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJnZW5lcmF0aW9uIiwgJmdlbmVyYXRpb24pKTsKKyAgICAgICAgICAgIGludDMyX3QgcmVhc29uOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInJlYXNvbiIsICZyZWFzb24pKTsKKworICAgICAgICAgICAgaWYgKGdlbmVyYXRpb24gIT0gbUVPU01vbml0b3JHZW5lcmF0aW9uIHx8IHJlYXNvbiAhPSBNZWRpYUNsb2NrOjpUSU1FUl9SRUFTT05fUkVBQ0hFRCkgeworICAgICAgICAgICAgICAgIGJyZWFrOyAgLy8gc3RhbGUgb3IgcmVzZXQKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQUxPR1YoImtXaGF0RU9TTW9uaXRvciIpOworICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIobUN1cnJlbnRTb3VyY2VJbmZvLm1TcmNJZCwgTUVESUEyX1BMQVlCQUNLX0NPTVBMRVRFLCAwLCAwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKICAgICAgICAgY2FzZSBrV2hhdEdldEJ1ZmZlcmluZ1NldHRpbmdzOgogICAgICAgICB7CiAgICAgICAgICAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJRDsKQEAgLTcxNyw4ICs3NDUsOCBAQAogICAgICAgICAgICAgQUxPR1YoImtXaGF0R2V0QnVmZmVyaW5nU2V0dGluZ3MiKTsKICAgICAgICAgICAgIEJ1ZmZlcmluZ1NldHRpbmdzIGJ1ZmZlcmluZzsKICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IE9LOwotICAgICAgICAgICAgaWYgKG1Tb3VyY2UgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGVyciA9IG1Tb3VyY2UtPmdldEJ1ZmZlcmluZ1NldHRpbmdzKCZidWZmZXJpbmcpOworICAgICAgICAgICAgaWYgKG1DdXJyZW50U291cmNlSW5mby5tU291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+Z2V0QnVmZmVyaW5nU2V0dGluZ3MoJmJ1ZmZlcmluZyk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGVyciA9IElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICAgICAgfQpAQCAtNzQwLDggKzc2OCw4IEBACiAgICAgICAgICAgICBCdWZmZXJpbmdTZXR0aW5ncyBidWZmZXJpbmc7CiAgICAgICAgICAgICByZWFkRnJvbUFNZXNzYWdlKG1zZywgJmJ1ZmZlcmluZyk7CiAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBPSzsKLSAgICAgICAgICAgIGlmIChtU291cmNlICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBtU291cmNlLT5zZXRCdWZmZXJpbmdTZXR0aW5ncyhidWZmZXJpbmcpOworICAgICAgICAgICAgaWYgKG1DdXJyZW50U291cmNlSW5mby5tU291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+c2V0QnVmZmVyaW5nU2V0dGluZ3MoYnVmZmVyaW5nKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgZXJyID0gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgICAgICB9CkBAIC03NTUsNyArNzgzLDcgQEAKICAgICAgICAgewogICAgICAgICAgICAgQUxPR1YoIm9uTWVzc2FnZVJlY2VpdmVkIGtXaGF0UHJlcGFyZSIpOwogCi0gICAgICAgICAgICBtU291cmNlLT5wcmVwYXJlQXN5bmMoKTsKKyAgICAgICAgICAgIG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5wcmVwYXJlQXN5bmMobUN1cnJlbnRTb3VyY2VJbmZvLm1TdGFydFRpbWVVcyk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCkBAIC03NjQsMTIgKzc5MiwxMiBAQAogICAgICAgICAgICAgc3A8QVJlcGx5VG9rZW4+IHJlcGx5SUQ7CiAgICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CiAKLSAgICAgICAgICAgIFBhcmNlbCogcmVwbHk7CisgICAgICAgICAgICBQbGF5ZXJNZXNzYWdlKiByZXBseTsKICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZFBvaW50ZXIoInJlcGx5IiwgKHZvaWQqKikmcmVwbHkpKTsKIAogICAgICAgICAgICAgc2l6ZV90IGluYmFuZFRyYWNrcyA9IDA7Ci0gICAgICAgICAgICBpZiAobVNvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgaW5iYW5kVHJhY2tzID0gbVNvdXJjZS0+Z2V0VHJhY2tDb3VudCgpOworICAgICAgICAgICAgaWYgKG1DdXJyZW50U291cmNlSW5mby5tU291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBpbmJhbmRUcmFja3MgPSBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+Z2V0VHJhY2tDb3VudCgpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBzaXplX3QgY2NUcmFja3MgPSAwOwpAQCAtNzc4LDExICs4MDYsMTEgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLy8gdG90YWwgdHJhY2sgY291bnQKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGluYmFuZFRyYWNrcyArIGNjVHJhY2tzKTsKKyAgICAgICAgICAgIHJlcGx5LT5hZGRfdmFsdWVzKCktPnNldF9pbnQzMl92YWx1ZShpbmJhbmRUcmFja3MgKyBjY1RyYWNrcyk7CiAKICAgICAgICAgICAgIC8vIHdyaXRlIGluYmFuZCB0cmFja3MKICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW5iYW5kVHJhY2tzOyArK2kpIHsKLSAgICAgICAgICAgICAgICB3cml0ZVRyYWNrSW5mbyhyZXBseSwgbVNvdXJjZS0+Z2V0VHJhY2tJbmZvKGkpKTsKKyAgICAgICAgICAgICAgICB3cml0ZVRyYWNrSW5mbyhyZXBseSwgbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPmdldFRyYWNrSW5mbyhpKSk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8vIHdyaXRlIENDIHRyYWNrCkBAIC03OTgsMTcgKzgyNiwxNyBAQAogICAgICAgICBjYXNlIGtXaGF0R2V0U2VsZWN0ZWRUcmFjazoKICAgICAgICAgewogICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgICAgICBpZiAobVNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgICAgICBpZiAobUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgIGVyciA9IE9LOwogCiAgICAgICAgICAgICAgICAgaW50MzJfdCB0eXBlMzI7CiAgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInR5cGUiLCAoaW50MzJfdCopJnR5cGUzMikpOwogICAgICAgICAgICAgICAgIG1lZGlhX3RyYWNrX3R5cGUgdHlwZSA9IChtZWRpYV90cmFja190eXBlKXR5cGUzMjsKLSAgICAgICAgICAgICAgICBzc2l6ZV90IHNlbGVjdGVkVHJhY2sgPSBtU291cmNlLT5nZXRTZWxlY3RlZFRyYWNrKHR5cGUpOworICAgICAgICAgICAgICAgIHNzaXplX3Qgc2VsZWN0ZWRUcmFjayA9IG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5nZXRTZWxlY3RlZFRyYWNrKHR5cGUpOwogCi0gICAgICAgICAgICAgICAgUGFyY2VsKiByZXBseTsKKyAgICAgICAgICAgICAgICBQbGF5ZXJNZXNzYWdlKiByZXBseTsKICAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRQb2ludGVyKCJyZXBseSIsICh2b2lkKiopJnJlcGx5KSk7Ci0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2VsZWN0ZWRUcmFjayk7CisgICAgICAgICAgICAgICAgcmVwbHktPmFkZF92YWx1ZXMoKS0+c2V0X2ludDMyX3ZhbHVlKHNlbGVjdGVkVHJhY2spOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7CkBAIC04MzUsOCArODYzLDggQEAKICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IElOVkFMSURfT1BFUkFUSU9OOwogCiAgICAgICAgICAgICBzaXplX3QgaW5iYW5kVHJhY2tzID0gMDsKLSAgICAgICAgICAgIGlmIChtU291cmNlICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBpbmJhbmRUcmFja3MgPSBtU291cmNlLT5nZXRUcmFja0NvdW50KCk7CisgICAgICAgICAgICBpZiAobUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGluYmFuZFRyYWNrcyA9IG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5nZXRUcmFja0NvdW50KCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzaXplX3QgY2NUcmFja3MgPSAwOwogICAgICAgICAgICAgaWYgKG1DQ0RlY29kZXIgIT0gTlVMTCkgewpAQCAtODQ0LDExICs4NzIsMTEgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKHRyYWNrSW5kZXggPCBpbmJhbmRUcmFja3MpIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBtU291cmNlLT5zZWxlY3RUcmFjayh0cmFja0luZGV4LCBzZWxlY3QsIHRpbWVVcyk7CisgICAgICAgICAgICAgICAgZXJyID0gbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPnNlbGVjdFRyYWNrKHRyYWNrSW5kZXgsIHNlbGVjdCwgdGltZVVzKTsKIAogICAgICAgICAgICAgICAgIGlmICghc2VsZWN0ICYmIGVyciA9PSBPSykgewogICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHR5cGU7Ci0gICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBpbmZvID0gbVNvdXJjZS0+Z2V0VHJhY2tJbmZvKHRyYWNrSW5kZXgpOworICAgICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gaW5mbyA9IG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5nZXRUcmFja0luZm8odHJhY2tJbmRleCk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChpbmZvICE9IE5VTEwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBpbmZvLT5maW5kSW50MzIoInR5cGUiLCAmdHlwZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB0eXBlID09IE1FRElBX1RSQUNLX1RZUEVfVElNRURURVhUKSB7CkBAIC04ODEsMTAgKzkwOSwxMCBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpbnQ2NF90IGR1cmF0aW9uVXM7Ci0gICAgICAgICAgICBpZiAobURyaXZlciAhPSBOVUxMICYmIG1Tb3VyY2UtPmdldER1cmF0aW9uKCZkdXJhdGlvblVzKSA9PSBPSykgeworICAgICAgICAgICAgaWYgKG1Ecml2ZXIgIT0gTlVMTCAmJiBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+Z2V0RHVyYXRpb24oJmR1cmF0aW9uVXMpID09IE9LKSB7CiAgICAgICAgICAgICAgICAgc3A8TnVQbGF5ZXIyRHJpdmVyPiBkcml2ZXIgPSBtRHJpdmVyLnByb21vdGUoKTsKICAgICAgICAgICAgICAgICBpZiAoZHJpdmVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgZHJpdmVyLT5ub3RpZnlEdXJhdGlvbihtU3JjSWQsIGR1cmF0aW9uVXMpOworICAgICAgICAgICAgICAgICAgICBkcml2ZXItPm5vdGlmeUR1cmF0aW9uKG1DdXJyZW50U291cmNlSW5mby5tU3JjSWQsIGR1cmF0aW9uVXMpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIApAQCAtOTAxLDEzICs5MjksMTUgQEAKIAogICAgICAgICAgICAgQUxPR0QoIm9uU2V0VmlkZW9TdXJmYWNlKCVwLCAlcyB2aWRlbyBkZWNvZGVyKSIsCiAgICAgICAgICAgICAgICAgICAgIChud3cgPT0gTlVMTCA/IE5VTEwgOiBud3ctPmdldEFOYXRpdmVXaW5kb3coKSksCi0gICAgICAgICAgICAgICAgICAgIChtU291cmNlICE9IE5VTEwgJiYgbVN0YXJ0ZWQgJiYgbVNvdXJjZS0+Z2V0Rm9ybWF0KGZhbHNlIC8qIGF1ZGlvICovKSAhPSBOVUxMCisgICAgICAgICAgICAgICAgICAgIChtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZSAhPSBOVUxMICYmIG1TdGFydGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPmdldEZvcm1hdChmYWxzZSAvKiBhdWRpbyAqLykgIT0gTlVMTAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIG1WaWRlb0RlY29kZXIgIT0gTlVMTCkgPyAiaGF2ZSIgOiAibm8iKTsKIAotICAgICAgICAgICAgLy8gTmVlZCB0byBjaGVjayBtU3RhcnRlZCBiZWZvcmUgY2FsbGluZyBtU291cmNlLT5nZXRGb3JtYXQgYmVjYXVzZSBOdVBsYXllcjIgbWlnaHQKLSAgICAgICAgICAgIC8vIGJlIGluIHByZXBhcmluZyBzdGF0ZSBhbmQgaXQgY291bGQgdGFrZSBsb25nIHRpbWUuCi0gICAgICAgICAgICAvLyBXaGVuIG1TdGFydGVkIGlzIHRydWUsIG1Tb3VyY2UgbXVzdCBoYXZlIGJlZW4gc2V0LgotICAgICAgICAgICAgaWYgKG1Tb3VyY2UgPT0gTlVMTCB8fCAhbVN0YXJ0ZWQgfHwgbVNvdXJjZS0+Z2V0Rm9ybWF0KGZhbHNlIC8qIGF1ZGlvICovKSA9PSBOVUxMCisgICAgICAgICAgICAvLyBOZWVkIHRvIGNoZWNrIG1TdGFydGVkIGJlZm9yZSBjYWxsaW5nIG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5nZXRGb3JtYXQKKyAgICAgICAgICAgIC8vIGJlY2F1c2UgTnVQbGF5ZXIyIG1pZ2h0IGJlIGluIHByZXBhcmluZyBzdGF0ZSBhbmQgaXQgY291bGQgdGFrZSBsb25nIHRpbWUuCisgICAgICAgICAgICAvLyBXaGVuIG1TdGFydGVkIGlzIHRydWUsIG1DdXJyZW50U291cmNlSW5mby5tU291cmNlIG11c3QgaGF2ZSBiZWVuIHNldC4KKyAgICAgICAgICAgIGlmIChtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZSA9PSBOVUxMIHx8ICFtU3RhcnRlZAorICAgICAgICAgICAgICAgICAgICB8fCBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+Z2V0Rm9ybWF0KGZhbHNlIC8qIGF1ZGlvICovKSA9PSBOVUxMCiAgICAgICAgICAgICAgICAgICAgIC8vIE5PVEU6IG1WaWRlb0RlY29kZXIncyBtTmF0aXZlV2luZG93IGlzIGFsd2F5cyBub24tbnVsbAogICAgICAgICAgICAgICAgICAgICB8fCAobVZpZGVvRGVjb2RlciAhPSBOVUxMICYmIG1WaWRlb0RlY29kZXItPnNldFZpZGVvU3VyZmFjZShud3cpID09IE9LKSkgewogICAgICAgICAgICAgICAgIHBlcmZvcm1TZXRTdXJmYWNlKG53dyk7CkBAIC05NzEsMTAgKzEwMDEsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgb25SZXN1bWUoKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG9uU3RhcnQoKTsKKyAgICAgICAgICAgICAgICBvblN0YXJ0KHRydWUgLyogcGxheSAqLyk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtUGF1c2VkQnlDbGllbnQgPSBmYWxzZTsKLSAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKG1TcmNJZCwgTUVESUEyX1NUQVJURUQsIDAsIDApOworICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIobUN1cnJlbnRTb3VyY2VJbmZvLm1TcmNJZCwgTUVESUEyX1NUQVJURUQsIDAsIDApOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIApAQCAtOTg4LDggKzEwMTgsNyBAQAogICAgICAgICAgICAgaWYgKG1SZW5kZXJlciAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgLy8gQXVkaW9TaW5rIGFsbG93cyBvbmx5IDEuZiBhbmQgMC5mIGZvciBvZmZsb2FkIG1vZGUuCiAgICAgICAgICAgICAgICAgLy8gRm9yIG90aGVyIHNwZWVkLCBzd2l0Y2ggdG8gbm9uLW9mZmxvYWQgbW9kZS4KLSAgICAgICAgICAgICAgICBpZiAobU9mZmxvYWRBdWRpbyAmJiAoKHJhdGUubVNwZWVkICE9IDAuZiAmJiByYXRlLm1TcGVlZCAhPSAxLmYpCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCByYXRlLm1QaXRjaCAhPSAxLmYpKSB7CisgICAgICAgICAgICAgICAgaWYgKG1PZmZsb2FkQXVkaW8gJiYgKHJhdGUubVNwZWVkICE9IDEuZiB8fCByYXRlLm1QaXRjaCAhPSAxLmYpKSB7CiAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgY3VycmVudFBvc2l0aW9uVXM7CiAgICAgICAgICAgICAgICAgICAgIGlmIChnZXRDdXJyZW50UG9zaXRpb24oJmN1cnJlbnRQb3NpdGlvblVzKSAhPSBPSykgewogICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFBvc2l0aW9uVXMgPSBtUHJldmlvdXNTZWVrVGltZVVzOwpAQCAtMTAxMiwzNiArMTA0MSwxNSBAQAogICAgICAgICAgICAgICAgIGVyciA9IG1SZW5kZXJlci0+c2V0UGxheWJhY2tTZXR0aW5ncyhyYXRlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKLSAgICAgICAgICAgICAgICBpZiAocmF0ZS5tU3BlZWQgPT0gMC5mKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9uUGF1c2UoKTsKLSAgICAgICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIobVNyY0lkLCBNRURJQTJfUEFVU0VELCAwLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgbVBhdXNlZEJ5Q2xpZW50ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgLy8gc2F2ZSBhbGwgb3RoZXIgc2V0dGluZ3MgKHVzaW5nIG5vbi1wYXVzZWQgc3BlZWQpCi0gICAgICAgICAgICAgICAgICAgIC8vIHNvIHdlIGNhbiByZXN0b3JlIHRoZW0gb24gc3RhcnQKLSAgICAgICAgICAgICAgICAgICAgQXVkaW9QbGF5YmFja1JhdGUgbmV3UmF0ZSA9IHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIG5ld1JhdGUubVNwZWVkID0gbVBsYXliYWNrU2V0dGluZ3MubVNwZWVkOwotICAgICAgICAgICAgICAgICAgICBtUGxheWJhY2tTZXR0aW5ncyA9IG5ld1JhdGU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsgLyogcmF0ZS5tU3BlZWQgIT0gMC5mICovCi0gICAgICAgICAgICAgICAgICAgIG1QbGF5YmFja1NldHRpbmdzID0gcmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1TdGFydGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBkbyBub3QgcmVzdW1lIHlldCBpZiB0aGUgc291cmNlIGlzIHN0aWxsIGJ1ZmZlcmluZwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtUGF1c2VkRm9yQnVmZmVyaW5nKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25SZXN1bWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtUHJlcGFyZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9uU3RhcnQoKTsKLSAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1QbGF5YmFja1NldHRpbmdzID0gcmF0ZTsKIAotICAgICAgICAgICAgICAgICAgICBtUGF1c2VkQnlDbGllbnQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBpZiAobVZpZGVvRGVjb2RlciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBwYXJhbXMgPSBuZXcgQU1lc3NhZ2UoKTsKKyAgICAgICAgICAgICAgICAgICAgcGFyYW1zLT5zZXRGbG9hdCgicGxheWJhY2stc3BlZWQiLCBtUGxheWJhY2tTZXR0aW5ncy5tU3BlZWQpOworICAgICAgICAgICAgICAgICAgICBtVmlkZW9EZWNvZGVyLT5zZXRQYXJhbWV0ZXJzKHBhcmFtcyk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAobVZpZGVvRGVjb2RlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHBhcmFtcyA9IG5ldyBBTWVzc2FnZSgpOwotICAgICAgICAgICAgICAgIHBhcmFtcy0+c2V0RmxvYXQoInBsYXliYWNrLXNwZWVkIiwgbVBsYXliYWNrU2V0dGluZ3MubVNwZWVkKTsKLSAgICAgICAgICAgICAgICBtVmlkZW9EZWNvZGVyLT5zZXRQYXJhbWV0ZXJzKHBhcmFtcyk7Ci0gICAgICAgICAgICB9Ci0KICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKICAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgZXJyKTsKICAgICAgICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7CkBAIC0xMDYxLDkgKzEwNjksNiBAQAogICAgICAgICAgICAgICAgIC8vIGdldCBwbGF5YmFjayBzZXR0aW5ncyB1c2VkIGJ5IHJlbmRlcmVyLCBhcyBpdCBtYXkgYmUKICAgICAgICAgICAgICAgICAvLyBzbGlnaHRseSBvZmYgZHVlIHRvIGF1ZGlvc2luayBub3QgdGFraW5nIHNtYWxsIGNoYW5nZXMuCiAgICAgICAgICAgICAgICAgbVBsYXliYWNrU2V0dGluZ3MgPSByYXRlOwotICAgICAgICAgICAgICAgIGlmIChtUGF1c2VkKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJhdGUubVNwZWVkID0gMC5mOwotICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKICAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKQEAgLTExNTcsMjEgKzExNjIsMjIgQEAKICAgICAgICAgICAgICAgICAgICAgJiYgKG1BdWRpb0RlY29kZXIgIT0gTlVMTCB8fCBtVmlkZW9EZWNvZGVyICE9IE5VTEwpKSB7CiAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgdGltZSB3ZSd2ZSBmb3VuZCBhbnl0aGluZyBwbGF5YWJsZS4KIAotICAgICAgICAgICAgICAgIGlmIChtU291cmNlRmxhZ3MgJiBTb3VyY2U6OkZMQUdfRFlOQU1JQ19EVVJBVElPTikgeworICAgICAgICAgICAgICAgIGlmIChtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZUZsYWdzICYgU291cmNlOjpGTEFHX0RZTkFNSUNfRFVSQVRJT04pIHsKICAgICAgICAgICAgICAgICAgICAgc2NoZWR1bGVQb2xsRHVyYXRpb24oKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHN0YXR1c190IGVycjsKLSAgICAgICAgICAgIGlmICgoZXJyID0gbVNvdXJjZS0+ZmVlZE1vcmVUU0RhdGEoKSkgIT0gT0spIHsKKyAgICAgICAgICAgIGlmICgoZXJyID0gbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPmZlZWRNb3JlVFNEYXRhKCkpICE9IE9LKSB7CiAgICAgICAgICAgICAgICAgaWYgKG1BdWRpb0RlY29kZXIgPT0gTlVMTCAmJiBtVmlkZW9EZWNvZGVyID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gV2UncmUgbm90IGN1cnJlbnRseSBkZWNvZGluZyBhbnl0aGluZyAobm8gYXVkaW8gb3IKICAgICAgICAgICAgICAgICAgICAgLy8gdmlkZW8gdHJhY2tzIGZvdW5kKSBhbmQgd2UganVzdCByYW4gb3V0IG9mIGlucHV0IGRhdGEuCiAKICAgICAgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihtU3JjSWQsIE1FRElBMl9QTEFZQkFDS19DT01QTEVURSwgMCwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkLCBNRURJQTJfUExBWUJBQ0tfQ09NUExFVEUsIDAsIDApOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIobVNyY0lkLCBNRURJQTJfRVJST1IsIE1FRElBMl9FUlJPUl9VTktOT1dOLCBlcnIpOworICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50U291cmNlSW5mby5tU3JjSWQsIE1FRElBMl9FUlJPUiwgTUVESUEyX0VSUk9SX1VOS05PV04sIGVycik7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC0xMjUzLDEwICsxMjU5LDEwIEBACiAgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kTWVzc2FnZSgiZm9ybWF0IiwgJmZvcm1hdCkpOwogCiAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IGlucHV0Rm9ybWF0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1Tb3VyY2UtPmdldEZvcm1hdChmYWxzZSAvKiBhdWRpbyAqLyk7CisgICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+Z2V0Rm9ybWF0KGZhbHNlIC8qIGF1ZGlvICovKTsKIAogICAgICAgICAgICAgICAgIHNldFZpZGVvU2NhbGluZ01vZGUobVZpZGVvU2NhbGluZ01vZGUpOwotICAgICAgICAgICAgICAgIHVwZGF0ZVZpZGVvU2l6ZShtU3JjSWQsIGlucHV0Rm9ybWF0LCBmb3JtYXQpOworICAgICAgICAgICAgICAgIHVwZGF0ZVZpZGVvU2l6ZShtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkLCBpbnB1dEZvcm1hdCwgZm9ybWF0KTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCA9PSBEZWNvZGVyQmFzZTo6a1doYXRTaHV0ZG93bkNvbXBsZXRlZCkgewogICAgICAgICAgICAgICAgIEFMT0dWKCIlcyBzaHV0ZG93biBjb21wbGV0ZWQiLCBhdWRpbyA/ICJhdWRpbyIgOiAidmlkZW8iKTsKICAgICAgICAgICAgICAgICBpZiAoYXVkaW8pIHsKQEAgLTEzMjMsMjggKzEzMjksMzkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmlzaEZsdXNoSWZQb3NzaWJsZSgpOyAgLy8gU2hvdWxkIG5vdCBvY2N1ci4KICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgLy8gRmluaXNoIGFueXdheXMuCiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtU291cmNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBpZiAobUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UgIT0gbnVsbHB0cikgewogICAgICAgICAgICAgICAgICAgICBpZiAoYXVkaW8pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtVmlkZW9EZWNvZGVyRXJyb3IgfHwgbVNvdXJjZS0+Z2V0Rm9ybWF0KGZhbHNlIC8qIGF1ZGlvICovKSA9PSBOVUxMCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1OYXRpdmVXaW5kb3cgPT0gTlVMTCB8fCBtTmF0aXZlV2luZG93LT5nZXRBTmF0aXZlV2luZG93KCkgPT0gTlVMTAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1WaWRlb0RlY29kZXJFcnJvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+Z2V0Rm9ybWF0KGZhbHNlIC8qIGF1ZGlvICovKSA9PSBOVUxMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1OYXRpdmVXaW5kb3cgPT0gTlVMTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBtTmF0aXZlV2luZG93LT5nZXRBTmF0aXZlV2luZG93KCkgPT0gTlVMTAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBtVmlkZW9EZWNvZGVyID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXaGVuIGJvdGggYXVkaW8gYW5kIHZpZGVvIGhhdmUgZXJyb3IsIG9yIHRoaXMgc3RyZWFtIGhhcyBvbmx5IGF1ZGlvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hpY2ggaGFzIGVycm9yLCBub3RpZnkgY2xpZW50IG9mIGVycm9yLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKG1TcmNJZCwgTUVESUEyX0VSUk9SLCBNRURJQTJfRVJST1JfVU5LTk9XTiwgZXJyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50U291cmNlSW5mby5tU3JjSWQsIE1FRElBMl9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBMl9FUlJPUl9VTktOT1dOLCBlcnIpOwogICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IGF1ZGlvIHRyYWNrIGhhcyBlcnJvci4gVmlkZW8gdHJhY2sgY291bGQgYmUgc3RpbGwgZ29vZCB0byBwbGF5LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKG1TcmNJZCwgTUVESUEyX0lORk8sIE1FRElBMl9JTkZPX1BMQVlfQVVESU9fRVJST1IsIGVycik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkLCBNRURJQTJfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBMl9JTkZPX1BMQVlfQVVESU9fRVJST1IsIGVycik7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBtQXVkaW9EZWNvZGVyRXJyb3IgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1BdWRpb0RlY29kZXJFcnJvciB8fCBtU291cmNlLT5nZXRGb3JtYXQodHJ1ZSAvKiBhdWRpbyAqLykgPT0gTlVMTAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1BdWRpb0RlY29kZXJFcnJvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+Z2V0Rm9ybWF0KHRydWUgLyogYXVkaW8gKi8pID09IE5VTEwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgbUF1ZGlvU2luayA9PSBOVUxMIHx8IG1BdWRpb0RlY29kZXIgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdoZW4gYm90aCBhdWRpbyBhbmQgdmlkZW8gaGF2ZSBlcnJvciwgb3IgdGhpcyBzdHJlYW0gaGFzIG9ubHkgdmlkZW8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGljaCBoYXMgZXJyb3IsIG5vdGlmeSBjbGllbnQgb2YgZXJyb3IuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIobVNyY0lkLCBNRURJQTJfRVJST1IsIE1FRElBMl9FUlJPUl9VTktOT1dOLCBlcnIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRTb3VyY2VJbmZvLm1TcmNJZCwgTUVESUEyX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVESUEyX0VSUk9SX1VOS05PV04sIGVycik7CiAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgdmlkZW8gdHJhY2sgaGFzIGVycm9yLiBBdWRpbyB0cmFjayBjb3VsZCBiZSBzdGlsbCBnb29kIHRvIHBsYXkuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIobVNyY0lkLCBNRURJQTJfSU5GTywgTUVESUEyX0lORk9fUExBWV9WSURFT19FUlJPUiwgZXJyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50U291cmNlSW5mby5tU3JjSWQsIE1FRElBMl9JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVESUEyX0lORk9fUExBWV9WSURFT19FUlJPUiwgZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIG1WaWRlb0RlY29kZXJFcnJvciA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTEzOTQsMTIgKzE0MTEsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpbyA/ICJhdWRpbyIgOiAidmlkZW8iLCBmaW5hbFJlc3VsdCk7CiAKICAgICAgICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNyY0lkLCBNRURJQTJfRVJST1IsIE1FRElBMl9FUlJPUl9VTktOT1dOLCBmaW5hbFJlc3VsdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRTb3VyY2VJbmZvLm1TcmNJZCwgTUVESUEyX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBMl9FUlJPUl9VTktOT1dOLCBmaW5hbFJlc3VsdCk7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgaWYgKChtQXVkaW9FT1MgfHwgbUF1ZGlvRGVjb2RlciA9PSBOVUxMKQogICAgICAgICAgICAgICAgICAgICAgICAgJiYgKG1WaWRlb0VPUyB8fCBtVmlkZW9EZWNvZGVyID09IE5VTEwpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKG1TcmNJZCwgTUVESUEyX1BMQVlCQUNLX0NPTVBMRVRFLCAwLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIobUN1cnJlbnRTb3VyY2VJbmZvLm1TcmNJZCwgTUVESUEyX1BMQVlCQUNLX0NPTVBMRVRFLCAwLCAwKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgaWYgKHdoYXQgPT0gUmVuZGVyZXI6OmtXaGF0Rmx1c2hDb21wbGV0ZSkgewogICAgICAgICAgICAgICAgIGludDMyX3QgYXVkaW87CkBAIC0xNDIwLDEwICsxNDM4LDExIEBACiAgICAgICAgICAgICAgICAgaGFuZGxlRmx1c2hDb21wbGV0ZShhdWRpbywgZmFsc2UgLyogaXNEZWNvZGVyICovKTsKICAgICAgICAgICAgICAgICBmaW5pc2hGbHVzaElmUG9zc2libGUoKTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCA9PSBSZW5kZXJlcjo6a1doYXRWaWRlb1JlbmRlcmluZ1N0YXJ0KSB7Ci0gICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIobVNyY0lkLCBNRURJQTJfSU5GTywgTUVESUEyX0lORk9fVklERU9fUkVOREVSSU5HX1NUQVJULCAwKTsKKyAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkLCBNRURJQTJfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRURJQTJfSU5GT19WSURFT19SRU5ERVJJTkdfU1RBUlQsIDApOwogICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IFJlbmRlcmVyOjprV2hhdE1lZGlhUmVuZGVyaW5nU3RhcnQpIHsKICAgICAgICAgICAgICAgICBBTE9HVigibWVkaWEgcmVuZGVyaW5nIHN0YXJ0ZWQiKTsKLSAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihtU3JjSWQsIE1FRElBMl9TVEFSVEVELCAwLCAwKTsKKyAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkLCBNRURJQTJfU1RBUlRFRCwgMCwgMCk7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKHdoYXQgPT0gUmVuZGVyZXI6OmtXaGF0QXVkaW9UZWFyRG93bikgewogICAgICAgICAgICAgICAgIGludDMyX3QgcmVhc29uOwogICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJyZWFzb24iLCAmcmVhc29uKSk7CkBAIC0xNDc2LDcgKzE0OTUsNyBAQAogICAgICAgICAgICAgaW50NjRfdCB0aW1lclVzOwogICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50NjQoInRpbWVyVXMiLCAmdGltZXJVcykpOwogCi0gICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihtU3JjSWQsIE1FRElBMl9OT1RJRllfVElNRSwgdGltZXJVcywgMCk7CisgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkLCBNRURJQTJfTk9USUZZX1RJTUUsIHRpbWVyVXMsIDApOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIApAQCAtMTQ5NSwyMCArMTUxNCwyMCBAQAogICAgICAgICAgICAgaWYgKCFtU3RhcnRlZCkgewogICAgICAgICAgICAgICAgIGlmICghbVNvdXJjZVN0YXJ0ZWQpIHsKICAgICAgICAgICAgICAgICAgICAgbVNvdXJjZVN0YXJ0ZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBtU291cmNlLT5zdGFydCgpOworICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+c3RhcnQoKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYgKHNlZWtUaW1lVXMgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1TZWVrKHNlZWtUaW1lVXMsIChNZWRpYVBsYXllcjJTZWVrTW9kZSltb2RlKTsKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBpZiAobmVlZE5vdGlmeSkgewotICAgICAgICAgICAgICAgICAgICBub3RpZnlEcml2ZXJTZWVrQ29tcGxldGUobVNyY0lkKTsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5RHJpdmVyU2Vla0NvbXBsZXRlKG1DdXJyZW50U291cmNlSW5mby5tU3JjSWQpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLy8gc2Vla3MgY2FuIHRha2UgYSB3aGlsZSwgc28gd2UgZXNzZW50aWFsbHkgcGF1c2VkCi0gICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihtU3JjSWQsIE1FRElBMl9QQVVTRUQsIDAsIDApOworICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIobUN1cnJlbnRTb3VyY2VJbmZvLm1TcmNJZCwgTUVESUEyX1BBVVNFRCwgMCwgMCk7CiAKICAgICAgICAgICAgIG1EZWZlcnJlZEFjdGlvbnMucHVzaF9iYWNrKAogICAgICAgICAgICAgICAgICAgICBuZXcgRmx1c2hEZWNvZGVyQWN0aW9uKEZMVVNIX0NNRF9GTFVTSCAvKiBhdWRpbyAqLywKQEAgLTE1MjcsMTAgKzE1NDYsNDkgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBrV2hhdFJld2luZDoKKyAgICAgICAgeworICAgICAgICAgICAgQUxPR1YoImtXaGF0UmV3aW5kIik7CisKKyAgICAgICAgICAgIGludDY0X3Qgc2Vla1RpbWVVcyA9IG1DdXJyZW50U291cmNlSW5mby5tU3RhcnRUaW1lVXM7CisgICAgICAgICAgICBpbnQzMl90IG1vZGUgPSBNZWRpYVBsYXllcjJTZWVrTW9kZTo6U0VFS19DTE9TRVNUOworCisgICAgICAgICAgICBpZiAoIW1TdGFydGVkKSB7CisgICAgICAgICAgICAgICAgaWYgKCFtU291cmNlU3RhcnRlZCkgeworICAgICAgICAgICAgICAgICAgICBtU291cmNlU3RhcnRlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5zdGFydCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwZXJmb3JtU2VlayhzZWVrVGltZVVzLCAoTWVkaWFQbGF5ZXIyU2Vla01vZGUpbW9kZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHNlZWtzIGNhbiB0YWtlIGEgd2hpbGUsIHNvIHdlIGVzc2VudGlhbGx5IHBhdXNlZAorICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIobUN1cnJlbnRTb3VyY2VJbmZvLm1TcmNJZCwgTUVESUEyX1BBVVNFRCwgMCwgMCk7CisKKyAgICAgICAgICAgIG1EZWZlcnJlZEFjdGlvbnMucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgICAgICBuZXcgRmx1c2hEZWNvZGVyQWN0aW9uKEZMVVNIX0NNRF9GTFVTSCAvKiBhdWRpbyAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTFVTSF9DTURfRkxVU0ggLyogdmlkZW8gKi8pKTsKKworICAgICAgICAgICAgbURlZmVycmVkQWN0aW9ucy5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgICAgIG5ldyBTZWVrQWN0aW9uKHNlZWtUaW1lVXMsIChNZWRpYVBsYXllcjJTZWVrTW9kZSltb2RlKSk7CisKKyAgICAgICAgICAgIC8vIEFmdGVyIGEgZmx1c2ggd2l0aG91dCBzaHV0ZG93biwgZGVjb2RlciBpcyBwYXVzZWQuCisgICAgICAgICAgICAvLyBEb24ndCByZXN1bWUgaXQgdW50aWwgc291cmNlIHNlZWsgaXMgZG9uZSwgb3RoZXJ3aXNlIGl0IGNvdWxkCisgICAgICAgICAgICAvLyBzdGFydCBwdWxsaW5nIHN0YWxlIGRhdGEgdG9vIHNvb24uCisgICAgICAgICAgICBtRGVmZXJyZWRBY3Rpb25zLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICAgICAgbmV3IFJlc3VtZURlY29kZXJBY3Rpb24oZmFsc2UgLyogbmVlZE5vdGlmeSAqLykpOworCisgICAgICAgICAgICBwcm9jZXNzRGVmZXJyZWRBY3Rpb25zKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCiAgICAgICAgIGNhc2Uga1doYXRQYXVzZToKICAgICAgICAgeworICAgICAgICAgICAgaWYgKCFtU3RhcnRlZCkgeworICAgICAgICAgICAgICAgIG9uU3RhcnQoZmFsc2UgLyogcGxheSAqLyk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBvblBhdXNlKCk7Ci0gICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihtU3JjSWQsIE1FRElBMl9QQVVTRUQsIDAsIDApOworICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIobUN1cnJlbnRTb3VyY2VJbmZvLm1TcmNJZCwgTUVESUEyX1BBVVNFRCwgMCwgMCk7CiAgICAgICAgICAgICBtUGF1c2VkQnlDbGllbnQgPSB0cnVlOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTE1ODMsOCArMTY0MSw4IEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAgICAgbVBhdXNlZCA9IGZhbHNlOwotICAgIGlmIChtU291cmNlICE9IE5VTEwpIHsKLSAgICAgICAgbVNvdXJjZS0+cmVzdW1lKCk7CisgICAgaWYgKG1DdXJyZW50U291cmNlSW5mby5tU291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPnJlc3VtZSgpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIEFMT0dXKCJyZXN1bWUgY2FsbGVkIHdoZW4gc291cmNlIGlzIGdvbmUgb3Igbm90IHNldCIpOwogICAgIH0KQEAgLTE2MDIsMTIgKzE2NjAsMTIgQEAKICAgICBzdGFydFBsYXliYWNrVGltZXIoIm9ucmVzdW1lIik7CiB9CiAKLXZvaWQgTnVQbGF5ZXIyOjpvblN0YXJ0KCkgewordm9pZCBOdVBsYXllcjI6Om9uU3RhcnQoYm9vbCBwbGF5KSB7CiAgICAgQUxPR1YoIm9uU3RhcnQ6IG1DcnlwdG86ICVwIiwgbUNyeXB0by5nZXQoKSk7CiAKICAgICBpZiAoIW1Tb3VyY2VTdGFydGVkKSB7CiAgICAgICAgIG1Tb3VyY2VTdGFydGVkID0gdHJ1ZTsKLSAgICAgICAgbVNvdXJjZS0+c3RhcnQoKTsKKyAgICAgICAgbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPnN0YXJ0KCk7CiAgICAgfQogCiAgICAgbU9mZmxvYWRBdWRpbyA9IGZhbHNlOwpAQCAtMTYxOCwyMiArMTY3NiwyMyBAQAogCiAgICAgdWludDMyX3QgZmxhZ3MgPSAwOwogCi0gICAgaWYgKG1Tb3VyY2UtPmlzUmVhbFRpbWUoKSkgeworICAgIGlmIChtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+aXNSZWFsVGltZSgpKSB7CiAgICAgICAgIGZsYWdzIHw9IFJlbmRlcmVyOjpGTEFHX1JFQUxfVElNRTsKICAgICB9CiAKLSAgICBib29sIGhhc0F1ZGlvID0gKG1Tb3VyY2UtPmdldEZvcm1hdCh0cnVlIC8qIGF1ZGlvICovKSAhPSBOVUxMKTsKLSAgICBib29sIGhhc1ZpZGVvID0gKG1Tb3VyY2UtPmdldEZvcm1hdChmYWxzZSAvKiBhdWRpbyAqLykgIT0gTlVMTCk7CisgICAgYm9vbCBoYXNBdWRpbyA9IChtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+Z2V0Rm9ybWF0KHRydWUgLyogYXVkaW8gKi8pICE9IE5VTEwpOworICAgIGJvb2wgaGFzVmlkZW8gPSAobUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPmdldEZvcm1hdChmYWxzZSAvKiBhdWRpbyAqLykgIT0gTlVMTCk7CiAgICAgaWYgKCFoYXNBdWRpbyAmJiAhaGFzVmlkZW8pIHsKICAgICAgICAgQUxPR0UoIm5vIG1ldGFkYXRhIGZvciBlaXRoZXIgYXVkaW8gb3IgdmlkZW8gc291cmNlIik7Ci0gICAgICAgIG1Tb3VyY2UtPnN0b3AoKTsKKyAgICAgICAgbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPnN0b3AoKTsKICAgICAgICAgbVNvdXJjZVN0YXJ0ZWQgPSBmYWxzZTsKLSAgICAgICAgbm90aWZ5TGlzdGVuZXIobVNyY0lkLCBNRURJQTJfRVJST1IsIE1FRElBMl9FUlJPUl9VTktOT1dOLCBFUlJPUl9NQUxGT1JNRUQpOworICAgICAgICBub3RpZnlMaXN0ZW5lcihtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkLCBNRURJQTJfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgIE1FRElBMl9FUlJPUl9VTktOT1dOLCBFUlJPUl9NQUxGT1JNRUQpOwogICAgICAgICByZXR1cm47CiAgICAgfQogICAgIEFMT0dWX0lGKCFoYXNBdWRpbywgIm5vIG1ldGFkYXRhIGZvciBhdWRpbyBzb3VyY2UiKTsgIC8vIHZpZGVvIG9ubHkgc3RyZWFtCiAKLSAgICBzcDxNZXRhRGF0YT4gYXVkaW9NZXRhID0gbVNvdXJjZS0+Z2V0Rm9ybWF0TWV0YSh0cnVlIC8qIGF1ZGlvICovKTsKKyAgICBzcDxNZXRhRGF0YT4gYXVkaW9NZXRhID0gbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPmdldEZvcm1hdE1ldGEodHJ1ZSAvKiBhdWRpbyAqLyk7CiAKICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUgPSBBVURJT19TVFJFQU1fTVVTSUM7CiAgICAgaWYgKG1BdWRpb1NpbmsgIT0gTlVMTCkgewpAQCAtMTY0MSw3ICsxNzAwLDggQEAKICAgICB9CiAKICAgICBtT2ZmbG9hZEF1ZGlvID0KLSAgICAgICAgY2FuT2ZmbG9hZFN0cmVhbShhdWRpb01ldGEsIGhhc1ZpZGVvLCBtU291cmNlLT5pc1N0cmVhbWluZygpLCBzdHJlYW1UeXBlKQorICAgICAgICBKTWVkaWFQbGF5ZXIyVXRpbHM6OmlzT2ZmbG9hZGVkQXVkaW9QbGF5YmFja1N1cHBvcnRlZCgKKyAgICAgICAgICAgICAgICBhdWRpb01ldGEsIGhhc1ZpZGVvLCBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+aXNTdHJlYW1pbmcoKSwgc3RyZWFtVHlwZSkKICAgICAgICAgICAgICAgICAmJiAobVBsYXliYWNrU2V0dGluZ3MubVNwZWVkID09IDEuZiAmJiBtUGxheWJhY2tTZXR0aW5ncy5tUGl0Y2ggPT0gMS5mKTsKIAogICAgIC8vIE1vZHVsYXIgRFJNOiBEaXNhYmxpbmcgYXVkaW8gb2ZmbG9hZCBpZiB0aGUgc291cmNlIGlzIHByb3RlY3RlZApAQCAtMTY2MCwxNCArMTcyMCwxNCBAQAogICAgIG1SZW5kZXJlciA9IG5ldyBSZW5kZXJlcihtQXVkaW9TaW5rLCBtTWVkaWFDbG9jaywgbm90aWZ5LCBmbGFncyk7CiAgICAgbVJlbmRlcmVyTG9vcGVyID0gbmV3IEFMb29wZXI7CiAgICAgbVJlbmRlcmVyTG9vcGVyLT5zZXROYW1lKCJOdVBsYXllclJlbmRlcmVyIik7Ci0gICAgbVJlbmRlcmVyTG9vcGVyLT5zdGFydChmYWxzZSwgZmFsc2UsIEFORFJPSURfUFJJT1JJVFlfQVVESU8pOworICAgIG1SZW5kZXJlckxvb3Blci0+c3RhcnQoZmFsc2UsIHRydWUsIEFORFJPSURfUFJJT1JJVFlfQVVESU8pOwogICAgIG1SZW5kZXJlckxvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKG1SZW5kZXJlcik7CiAKICAgICBzdGF0dXNfdCBlcnIgPSBtUmVuZGVyZXItPnNldFBsYXliYWNrU2V0dGluZ3MobVBsYXliYWNrU2V0dGluZ3MpOwogICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgbVNvdXJjZS0+c3RvcCgpOworICAgICAgICBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+c3RvcCgpOwogICAgICAgICBtU291cmNlU3RhcnRlZCA9IGZhbHNlOwotICAgICAgICBub3RpZnlMaXN0ZW5lcihtU3JjSWQsIE1FRElBMl9FUlJPUiwgTUVESUEyX0VSUk9SX1VOS05PV04sIGVycik7CisgICAgICAgIG5vdGlmeUxpc3RlbmVyKG1DdXJyZW50U291cmNlSW5mby5tU3JjSWQsIE1FRElBMl9FUlJPUiwgTUVESUEyX0VSUk9SX1VOS05PV04sIGVycik7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKQEAgLTE2NzYsNiArMTczNiwxMiBAQAogICAgICAgICBtUmVuZGVyZXItPnNldFZpZGVvRnJhbWVSYXRlKHJhdGUpOwogICAgIH0KIAorICAgIGFkZEVuZFRpbWVNb25pdG9yKCk7CisgICAgLy8gUmVuZGVyZXIgaXMgY3JlYXRlZCBpbiBwYXVzZWQgc3RhdGUuCisgICAgaWYgKHBsYXkpIHsKKyAgICAgICAgbVJlbmRlcmVyLT5yZXN1bWUoKTsKKyAgICB9CisKICAgICBpZiAobVZpZGVvRGVjb2RlciAhPSBOVUxMKSB7CiAgICAgICAgIG1WaWRlb0RlY29kZXItPnNldFJlbmRlcmVyKG1SZW5kZXJlcik7CiAgICAgfQpAQCAtMTY4NCwxMCArMTc1MCwyMyBAQAogICAgIH0KIAogICAgIHN0YXJ0UGxheWJhY2tUaW1lcigib25zdGFydCIpOworICAgIG5vdGlmeUxpc3RlbmVyKG1DdXJyZW50U291cmNlSW5mby5tU3JjSWQsIE1FRElBMl9JTkZPLCBNRURJQTJfSU5GT19EQVRBX1NPVVJDRV9TVEFSVCwgMCk7CiAKICAgICBwb3N0U2NhblNvdXJjZXMoKTsKIH0KIAordm9pZCBOdVBsYXllcjI6OmFkZEVuZFRpbWVNb25pdG9yKCkgeworICAgICsrbUVPU01vbml0b3JHZW5lcmF0aW9uOworCisgICAgaWYgKG1DdXJyZW50U291cmNlSW5mby5tRW5kVGltZVVzID09IERhdGFTb3VyY2VEZXNjOjprTWF4VGltZVVzKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0RU9TTW9uaXRvciwgdGhpcyk7CisgICAgbXNnLT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsIG1FT1NNb25pdG9yR2VuZXJhdGlvbik7CisgICAgbU1lZGlhQ2xvY2stPmFkZFRpbWVyKG1zZywgbUN1cnJlbnRTb3VyY2VJbmZvLm1FbmRUaW1lVXMpOworfQorCiB2b2lkIE51UGxheWVyMjo6c3RhcnRQbGF5YmFja1RpbWVyKGNvbnN0IGNoYXIgKndoZXJlKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1QbGF5aW5nVGltZUxvY2spOwogICAgIGlmIChtTGFzdFN0YXJ0ZWRQbGF5aW5nVGltZU5zID09IDApIHsKQEAgLTE3MDksNyArMTc4OCw3IEBACiAgICAgICAgICAgICBBTE9HVigic3RvcFBsYXliYWNrVGltZXIoKSAgbG9nICAlMjAiIFBSSWQ2NCAiIiwgcGxheWVkKTsKIAogICAgICAgICAgICAgaWYgKHBsYXllZCA+IDApIHsKLSAgICAgICAgICAgICAgICBkcml2ZXItPm5vdGlmeU1vcmVQbGF5aW5nVGltZVVzKG1TcmNJZCwgKHBsYXllZCs1MDApLzEwMDApOworICAgICAgICAgICAgICAgIGRyaXZlci0+bm90aWZ5TW9yZVBsYXlpbmdUaW1lVXMobUN1cnJlbnRTb3VyY2VJbmZvLm1TcmNJZCwgKHBsYXllZCs1MDApLzEwMDApOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIG1MYXN0U3RhcnRlZFBsYXlpbmdUaW1lTnMgPSAwOwpAQCAtMTcyNyw3ICsxODA2LDggQEAKIHZvaWQgTnVQbGF5ZXIyOjpzdG9wUmVidWZmZXJpbmdUaW1lcihib29sIGV4aXRpbmdQbGF5YmFjaykgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtUGxheWluZ1RpbWVMb2NrKTsKIAotICAgIEFMT0dWKCJzdG9wUmVidWZmZXJUaW1lcigpICB0aW1lICUyMCIgUFJJZDY0ICIgKGV4aXRpbmcgJWQpIiwgbUxhc3RTdGFydGVkUmVidWZmZXJpbmdUaW1lTnMsIGV4aXRpbmdQbGF5YmFjayk7CisgICAgQUxPR1YoInN0b3BSZWJ1ZmZlclRpbWVyKCkgIHRpbWUgJTIwIiBQUklkNjQgIiAoZXhpdGluZyAlZCkiLAorICAgICAgICAgIG1MYXN0U3RhcnRlZFJlYnVmZmVyaW5nVGltZU5zLCBleGl0aW5nUGxheWJhY2spOwogCiAgICAgaWYgKG1MYXN0U3RhcnRlZFJlYnVmZmVyaW5nVGltZU5zICE9IDApIHsKICAgICAgICAgc3A8TnVQbGF5ZXIyRHJpdmVyPiBkcml2ZXIgPSBtRHJpdmVyLnByb21vdGUoKTsKQEAgLTE3MzcsOSArMTgxNywxMCBAQAogICAgICAgICAgICAgQUxPR1YoInN0b3BSZWJ1ZmZlcmluZ1RpbWVyKCkgIGxvZyAgJTIwIiBQUklkNjQgIiIsIHJlYnVmZmVyZWQpOwogCiAgICAgICAgICAgICBpZiAocmVidWZmZXJlZCA+IDApIHsKLSAgICAgICAgICAgICAgICBkcml2ZXItPm5vdGlmeU1vcmVSZWJ1ZmZlcmluZ1RpbWVVcyhtU3JjSWQsIChyZWJ1ZmZlcmVkKzUwMCkvMTAwMCk7CisgICAgICAgICAgICAgICAgZHJpdmVyLT5ub3RpZnlNb3JlUmVidWZmZXJpbmdUaW1lVXMoCisgICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkLCAocmVidWZmZXJlZCs1MDApLzEwMDApOwogICAgICAgICAgICAgICAgIGlmIChleGl0aW5nUGxheWJhY2spIHsKLSAgICAgICAgICAgICAgICAgICAgZHJpdmVyLT5ub3RpZnlSZWJ1ZmZlcmluZ1doZW5FeGl0KG1TcmNJZCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIGRyaXZlci0+bm90aWZ5UmVidWZmZXJpbmdXaGVuRXhpdChtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkLCB0cnVlKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTE3NTUsOCArMTgzNiw4IEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAgICAgbVBhdXNlZCA9IHRydWU7Ci0gICAgaWYgKG1Tb3VyY2UgIT0gTlVMTCkgewotICAgICAgICBtU291cmNlLT5wYXVzZSgpOworICAgIGlmIChtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgIG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5wYXVzZSgpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIEFMT0dXKCJwYXVzZSBjYWxsZWQgd2hlbiBzb3VyY2UgaXMgZ29uZSBvciBub3Qgc2V0Iik7CiAgICAgfQpAQCAtMTg0Niw3ICsxOTI3LDcgQEAKIAogICAgIHN0YXR1c190IGVyciA9IG1SZW5kZXJlci0+b3BlbkF1ZGlvU2luaygKICAgICAgICAgICAgIGZvcm1hdCwgdHJ1ZSAvKiBvZmZsb2FkT25seSAqLywgaGFzVmlkZW8sCi0gICAgICAgICAgICBBVURJT19PVVRQVVRfRkxBR19OT05FLCAmbU9mZmxvYWRBdWRpbywgbVNvdXJjZS0+aXNTdHJlYW1pbmcoKSk7CisgICAgICAgICAgICBBVURJT19PVVRQVVRfRkxBR19OT05FLCAmbU9mZmxvYWRBdWRpbywgbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPmlzU3RyZWFtaW5nKCkpOwogICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgLy8gQW55IGZhaWx1cmUgd2UgdHVybiBvZmYgbU9mZmxvYWRBdWRpby4KICAgICAgICAgbU9mZmxvYWRBdWRpbyA9IGZhbHNlOwpAQCAtMTg5OSw3ICsxOTgwLDcgQEAKIH0KIAogdm9pZCBOdVBsYXllcjI6OmRldGVybWluZUF1ZGlvTW9kZUNoYW5nZShjb25zdCBzcDxBTWVzc2FnZT4gJmF1ZGlvRm9ybWF0KSB7Ci0gICAgaWYgKG1Tb3VyY2UgPT0gTlVMTCB8fCBtQXVkaW9TaW5rID09IE5VTEwpIHsKKyAgICBpZiAobUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UgPT0gTlVMTCB8fCBtQXVkaW9TaW5rID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIApAQCAtMTkwOSwxMiArMTk5MCwxMiBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgc3A8TWV0YURhdGE+IGF1ZGlvTWV0YSA9IG1Tb3VyY2UtPmdldEZvcm1hdE1ldGEodHJ1ZSAvKiBhdWRpbyAqLyk7Ci0gICAgc3A8QU1lc3NhZ2U+IHZpZGVvRm9ybWF0ID0gbVNvdXJjZS0+Z2V0Rm9ybWF0KGZhbHNlIC8qIGF1ZGlvICovKTsKKyAgICBzcDxNZXRhRGF0YT4gYXVkaW9NZXRhID0gbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPmdldEZvcm1hdE1ldGEodHJ1ZSAvKiBhdWRpbyAqLyk7CisgICAgc3A8QU1lc3NhZ2U+IHZpZGVvRm9ybWF0ID0gbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPmdldEZvcm1hdChmYWxzZSAvKiBhdWRpbyAqLyk7CiAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlID0gbUF1ZGlvU2luay0+Z2V0QXVkaW9TdHJlYW1UeXBlKCk7CiAgICAgY29uc3QgYm9vbCBoYXNWaWRlbyA9ICh2aWRlb0Zvcm1hdCAhPSBOVUxMKTsKLSAgICBib29sIGNhbk9mZmxvYWQgPSBjYW5PZmZsb2FkU3RyZWFtKAotICAgICAgICAgICAgYXVkaW9NZXRhLCBoYXNWaWRlbywgbVNvdXJjZS0+aXNTdHJlYW1pbmcoKSwgc3RyZWFtVHlwZSkKKyAgICBib29sIGNhbk9mZmxvYWQgPSBKTWVkaWFQbGF5ZXIyVXRpbHM6OmlzT2ZmbG9hZGVkQXVkaW9QbGF5YmFja1N1cHBvcnRlZCgKKyAgICAgICAgICAgIGF1ZGlvTWV0YSwgaGFzVmlkZW8sIG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5pc1N0cmVhbWluZygpLCBzdHJlYW1UeXBlKQogICAgICAgICAgICAgICAgICAgICAmJiAobVBsYXliYWNrU2V0dGluZ3MubVNwZWVkID09IDEuZiAmJiBtUGxheWJhY2tTZXR0aW5ncy5tUGl0Y2ggPT0gMS5mKTsKIAogICAgIC8vIE1vZHVsYXIgRFJNOiBEaXNhYmxpbmcgYXVkaW8gb2ZmbG9hZCBpZiB0aGUgc291cmNlIGlzIHByb3RlY3RlZApAQCAtMTk0NSw3ICsyMDI2LDcgQEAKICAgICAgICAgcmV0dXJuIE9LOwogICAgIH0KIAotICAgIHNwPEFNZXNzYWdlPiBmb3JtYXQgPSBtU291cmNlLT5nZXRGb3JtYXQoYXVkaW8pOworICAgIHNwPEFNZXNzYWdlPiBmb3JtYXQgPSBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+Z2V0Rm9ybWF0KGF1ZGlvKTsKIAogICAgIGlmIChmb3JtYXQgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKQEAgLTE5NjcsMTEgKzIwNDgsMTEgQEAKICAgICAgICAgICAgIG1DQ0RlY29kZXIgPSBuZXcgQ0NEZWNvZGVyKGNjTm90aWZ5KTsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChtU291cmNlRmxhZ3MgJiBTb3VyY2U6OkZMQUdfU0VDVVJFKSB7CisgICAgICAgIGlmIChtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZUZsYWdzICYgU291cmNlOjpGTEFHX1NFQ1VSRSkgewogICAgICAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigic2VjdXJlIiwgdHJ1ZSk7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAobVNvdXJjZUZsYWdzICYgU291cmNlOjpGTEFHX1BST1RFQ1RFRCkgeworICAgICAgICBpZiAobUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2VGbGFncyAmIFNvdXJjZTo6RkxBR19QUk9URUNURUQpIHsKICAgICAgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoInByb3RlY3RlZCIsIHRydWUpOwogICAgICAgICB9CiAKQEAgLTE5OTAsMTYgKzIwNzEsMTYgQEAKICAgICAgICAgICAgIGRldGVybWluZUF1ZGlvTW9kZUNoYW5nZShmb3JtYXQpOwogICAgICAgICB9CiAgICAgICAgIGlmIChtT2ZmbG9hZEF1ZGlvKSB7Ci0gICAgICAgICAgICBtU291cmNlLT5zZXRPZmZsb2FkQXVkaW8odHJ1ZSAvKiBvZmZsb2FkICovKTsKKyAgICAgICAgICAgIG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5zZXRPZmZsb2FkQXVkaW8odHJ1ZSAvKiBvZmZsb2FkICovKTsKIAotICAgICAgICAgICAgY29uc3QgYm9vbCBoYXNWaWRlbyA9IChtU291cmNlLT5nZXRGb3JtYXQoZmFsc2UgLyphdWRpbyAqLykgIT0gTlVMTCk7CisgICAgICAgICAgICBjb25zdCBib29sIGhhc1ZpZGVvID0gKG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5nZXRGb3JtYXQoZmFsc2UgLyphdWRpbyAqLykgIT0gTlVMTCk7CiAgICAgICAgICAgICBmb3JtYXQtPnNldEludDMyKCJoYXMtdmlkZW8iLCBoYXNWaWRlbyk7Ci0gICAgICAgICAgICAqZGVjb2RlciA9IG5ldyBEZWNvZGVyUGFzc1Rocm91Z2gobm90aWZ5LCBtU291cmNlLCBtUmVuZGVyZXIpOworICAgICAgICAgICAgKmRlY29kZXIgPSBuZXcgRGVjb2RlclBhc3NUaHJvdWdoKG5vdGlmeSwgbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UsIG1SZW5kZXJlcik7CiAgICAgICAgICAgICBBTE9HVigiaW5zdGFudGlhdGVEZWNvZGVyIGF1ZGlvIERlY29kZXJQYXNzVGhyb3VnaCAgaGFzVmlkZW86ICVkIiwgaGFzVmlkZW8pOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbVNvdXJjZS0+c2V0T2ZmbG9hZEF1ZGlvKGZhbHNlIC8qIG9mZmxvYWQgKi8pOworICAgICAgICAgICAgbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPnNldE9mZmxvYWRBdWRpbyhmYWxzZSAvKiBvZmZsb2FkICovKTsKIAotICAgICAgICAgICAgKmRlY29kZXIgPSBuZXcgRGVjb2Rlcihub3RpZnksIG1Tb3VyY2UsIG1QSUQsIG1VSUQsIG1SZW5kZXJlcik7CisgICAgICAgICAgICAqZGVjb2RlciA9IG5ldyBEZWNvZGVyKG5vdGlmeSwgbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UsIG1QSUQsIG1VSUQsIG1SZW5kZXJlcik7CiAgICAgICAgICAgICBBTE9HVigiaW5zdGFudGlhdGVEZWNvZGVyIGF1ZGlvIERlY29kZXIiKTsKICAgICAgICAgfQogICAgICAgICBtQXVkaW9EZWNvZGVyRXJyb3IgPSBmYWxzZTsKQEAgLTIwMDksNyArMjA5MCw4IEBACiAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBtVmlkZW9EZWNvZGVyR2VuZXJhdGlvbik7CiAKICAgICAgICAgKmRlY29kZXIgPSBuZXcgRGVjb2RlcigKLSAgICAgICAgICAgICAgICBub3RpZnksIG1Tb3VyY2UsIG1QSUQsIG1VSUQsIG1SZW5kZXJlciwgbU5hdGl2ZVdpbmRvdywgbUNDRGVjb2Rlcik7CisgICAgICAgICAgICAgICAgbm90aWZ5LCBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZSwgbVBJRCwgbVVJRCwgbVJlbmRlcmVyLCBtTmF0aXZlV2luZG93LAorICAgICAgICAgICAgICAgIG1DQ0RlY29kZXIpOwogICAgICAgICBtVmlkZW9EZWNvZGVyRXJyb3IgPSBmYWxzZTsKIAogICAgICAgICAvLyBlbmFibGUgRlJDIGlmIGhpZ2gtcXVhbGl0eSBBViBzeW5jIGlzIHJlcXVlc3RlZCwgZXZlbiBpZiBub3QKQEAgLTIwMjYsOCArMjEwOCw4IEBACiAgICAgLy8gTW9kdWxhciBEUk0KICAgICBpZiAobUlzRHJtUHJvdGVjdGVkKSB7CiAgICAgICAgIGZvcm1hdC0+c2V0T2JqZWN0KCJjcnlwdG8iLCBtQ3J5cHRvKTsKLSAgICAgICAgQUxPR1YoImluc3RhbnRpYXRlRGVjb2RlcjogbUNyeXB0bzogJXAgaXNTZWN1cmU6ICVkIiwgbUNyeXB0by5nZXQoKSwKLSAgICAgICAgICAgICAgICAobVNvdXJjZUZsYWdzICYgU291cmNlOjpGTEFHX1NFQ1VSRSkgIT0gMCk7CisgICAgICAgIEFMT0dWKCJpbnN0YW50aWF0ZURlY29kZXI6IG1DcnlwdG86ICVwIGlzU2VjdXJlOiAlZCIsCisgICAgICAgICAgICAgICAgbUNyeXB0by5nZXQoKSwgKG1DdXJyZW50U291cmNlSW5mby5tU291cmNlRmxhZ3MgJiBTb3VyY2U6OkZMQUdfU0VDVVJFKSAhPSAwKTsKICAgICB9CiAKICAgICAoKmRlY29kZXIpLT5jb25maWd1cmUoZm9ybWF0KTsKQEAgLTIxNDYsNyArMjIyOCw4IEBACiAgICAgICAgICAgICBkaXNwbGF5SGVpZ2h0KTsKIH0KIAotdm9pZCBOdVBsYXllcjI6Om5vdGlmeUxpc3RlbmVyKGludDY0X3Qgc3JjSWQsIGludCBtc2csIGludCBleHQxLCBpbnQgZXh0MiwgY29uc3QgUGFyY2VsICppbikgewordm9pZCBOdVBsYXllcjI6Om5vdGlmeUxpc3RlbmVyKAorICAgICAgICBpbnQ2NF90IHNyY0lkLCBpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIsIGNvbnN0IFBsYXllck1lc3NhZ2UgKmluKSB7CiAgICAgaWYgKG1Ecml2ZXIgPT0gTlVMTCkgewogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtMjIzMCw3ICsyMzEzLDcgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IE51UGxheWVyMjo6Z2V0VHJhY2tJbmZvKFBhcmNlbCogcmVwbHkpIGNvbnN0IHsKK3N0YXR1c190IE51UGxheWVyMjo6Z2V0VHJhY2tJbmZvKFBsYXllck1lc3NhZ2UqIHJlcGx5KSBjb25zdCB7CiAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdEdldFRyYWNrSW5mbywgdGhpcyk7CiAgICAgbXNnLT5zZXRQb2ludGVyKCJyZXBseSIsIHJlcGx5KTsKIApAQCAtMjIzOSw3ICsyMzIyLDcgQEAKICAgICByZXR1cm4gZXJyOwogfQogCi1zdGF0dXNfdCBOdVBsYXllcjI6OmdldFNlbGVjdGVkVHJhY2soaW50MzJfdCB0eXBlLCBQYXJjZWwqIHJlcGx5KSBjb25zdCB7CitzdGF0dXNfdCBOdVBsYXllcjI6OmdldFNlbGVjdGVkVHJhY2soaW50MzJfdCB0eXBlLCBQbGF5ZXJNZXNzYWdlKiByZXBseSkgY29uc3QgewogICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRHZXRTZWxlY3RlZFRyYWNrLCB0aGlzKTsKICAgICBtc2ctPnNldFBvaW50ZXIoInJlcGx5IiwgcmVwbHkpOwogICAgIG1zZy0+c2V0SW50MzIoInR5cGUiLCB0eXBlKTsKQEAgLTIyOTQsMTEgKzIzNzcsMTEgQEAKIH0KIAogc3A8TWV0YURhdGE+IE51UGxheWVyMjo6Z2V0RmlsZU1ldGEoKSB7Ci0gICAgcmV0dXJuIG1Tb3VyY2UtPmdldEZpbGVGb3JtYXRNZXRhKCk7CisgICAgcmV0dXJuIG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5nZXRGaWxlRm9ybWF0TWV0YSgpOwogfQogCiBmbG9hdCBOdVBsYXllcjI6OmdldEZyYW1lUmF0ZSgpIHsKLSAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG1Tb3VyY2UtPmdldEZvcm1hdE1ldGEoZmFsc2UgLyogYXVkaW8gKi8pOworICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPmdldEZvcm1hdE1ldGEoZmFsc2UgLyogYXVkaW8gKi8pOwogICAgIGlmIChtZXRhID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQpAQCAtMjM1NiwxNiArMjQzOSwxNiBAQAogICAgIEFMT0dWKCJwZXJmb3JtU2VlayBzZWVrVGltZVVzPSVsbGQgdXMgKCUuMmYgc2VjcyksIG1vZGU9JWQiLAogICAgICAgICAgIChsb25nIGxvbmcpc2Vla1RpbWVVcywgc2Vla1RpbWVVcyAvIDFFNiwgbW9kZSk7CiAKLSAgICBpZiAobVNvdXJjZSA9PSBOVUxMKSB7CisgICAgaWYgKG1DdXJyZW50U291cmNlSW5mby5tU291cmNlID09IE5VTEwpIHsKICAgICAgICAgLy8gVGhpcyBoYXBwZW5zIHdoZW4gcmVzZXQgb2NjdXJzIHJpZ2h0IGJlZm9yZSB0aGUgbG9vcCBtb2RlCiAgICAgICAgIC8vIGFzeW5jaHJvbm91c2x5IHNlZWtzIHRvIHRoZSBzdGFydCBvZiB0aGUgc3RyZWFtLgogICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG1BdWRpb0RlY29kZXIgIT0gTlVMTCB8fCBtVmlkZW9EZWNvZGVyICE9IE5VTEwsCi0gICAgICAgICAgICAgICAgIm1Tb3VyY2UgaXMgTlVMTCBhbmQgZGVjb2RlcnMgbm90IE5VTEwgYXVkaW8oJXApIHZpZGVvKCVwKSIsCisgICAgICAgICAgICAgICAgIm1DdXJyZW50U291cmNlSW5mby5tU291cmNlIGlzIE5VTEwgYW5kIGRlY29kZXJzIG5vdCBOVUxMIGF1ZGlvKCVwKSB2aWRlbyglcCkiLAogICAgICAgICAgICAgICAgIG1BdWRpb0RlY29kZXIuZ2V0KCksIG1WaWRlb0RlY29kZXIuZ2V0KCkpOwogICAgICAgICByZXR1cm47CiAgICAgfQogICAgIG1QcmV2aW91c1NlZWtUaW1lVXMgPSBzZWVrVGltZVVzOwotICAgIG1Tb3VyY2UtPnNlZWtUbyhzZWVrVGltZVVzLCBtb2RlKTsKKyAgICBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+c2Vla1RvKHNlZWtUaW1lVXMsIG1vZGUpOwogICAgICsrbVRpbWVkVGV4dEdlbmVyYXRpb247CiAKICAgICAvLyBldmVyeXRoaW5nJ3MgZmx1c2hlZCwgY29udGludWUgcGxheWJhY2suCkBAIC0yNDEyLDE3ICsyNDk1LDE3IEBACiAgICAgbVJlbmRlcmVyLmNsZWFyKCk7CiAgICAgKyttUmVuZGVyZXJHZW5lcmF0aW9uOwogCi0gICAgaWYgKG1Tb3VyY2UgIT0gTlVMTCkgewotICAgICAgICBtU291cmNlLT5zdG9wKCk7CisgICAgaWYgKG1DdXJyZW50U291cmNlSW5mby5tU291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPnN0b3AoKTsKIAogICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobVNvdXJjZUxvY2spOwotICAgICAgICBtU291cmNlLmNsZWFyKCk7CisgICAgICAgIG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLmNsZWFyKCk7CiAgICAgfQogCiAgICAgaWYgKG1Ecml2ZXIgIT0gTlVMTCkgewogICAgICAgICBzcDxOdVBsYXllcjJEcml2ZXI+IGRyaXZlciA9IG1Ecml2ZXIucHJvbW90ZSgpOwogICAgICAgICBpZiAoZHJpdmVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGRyaXZlci0+bm90aWZ5UmVzZXRDb21wbGV0ZShtU3JjSWQpOworICAgICAgICAgICAgZHJpdmVyLT5ub3RpZnlSZXNldENvbXBsZXRlKG1DdXJyZW50U291cmNlSW5mby5tU3JjSWQpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0yNDU3LDI1ICsyNTQwLDMxIEBACiAKICAgICArK21SZW5kZXJlckdlbmVyYXRpb247CiAKLSAgICBpZiAobVNvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgIG1Tb3VyY2UtPnN0b3AoKTsKKyAgICBpZiAobUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UgIT0gTlVMTCkgeworICAgICAgICBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+c3RvcCgpOwogICAgIH0KIAogICAgIGxvbmcgcHJldmlvdXNTcmNJZDsKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtU291cmNlTG9jayk7Ci0gICAgICAgIG1Tb3VyY2UgPSBtTmV4dFNvdXJjZTsKLSAgICAgICAgbU5leHRTb3VyY2UgPSBOVUxMOwotICAgICAgICBwcmV2aW91c1NyY0lkID0gbVNyY0lkOwotICAgICAgICBtU3JjSWQgPSBtTmV4dFNyY0lkOwotICAgICAgICArK21OZXh0U3JjSWQ7ICAvLyB0byBkaXN0aW5ndWlzaCB0aGUgdHdvIHNvdXJjZXMuCisgICAgICAgIHByZXZpb3VzU3JjSWQgPSBtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkOworCisgICAgICAgIG1DdXJyZW50U291cmNlSW5mbyA9IG1OZXh0U291cmNlSW5mbzsKKyAgICAgICAgbU5leHRTb3VyY2VJbmZvID0gU291cmNlSW5mbygpOworICAgICAgICBtTmV4dFNvdXJjZUluZm8ubVNyY0lkID0gfm1DdXJyZW50U291cmNlSW5mby5tU3JjSWQ7ICAvLyB0byBkaXN0aW5ndWlzaCB0aGUgdHdvIHNvdXJjZXMuCiAgICAgfQogCiAgICAgaWYgKG1Ecml2ZXIgIT0gTlVMTCkgewogICAgICAgICBzcDxOdVBsYXllcjJEcml2ZXI+IGRyaXZlciA9IG1Ecml2ZXIucHJvbW90ZSgpOwogICAgICAgICBpZiAoZHJpdmVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKHByZXZpb3VzU3JjSWQsIE1FRElBMl9JTkZPLCBNRURJQTJfSU5GT19QTEFZQkFDS19DT01QTEVURSwgMCk7Ci0gICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihtU3JjSWQsIE1FRElBMl9JTkZPLCBNRURJQTJfSU5GT19TVEFSVEVEX0FTX05FWFQsIDApOworICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIocHJldmlvdXNTcmNJZCwgTUVESUEyX0lORk8sIE1FRElBMl9JTkZPX0RBVEFfU09VUkNFX0VORCwgMCk7CisKKyAgICAgICAgICAgIGludDY0X3QgZHVyYXRpb25VczsKKyAgICAgICAgICAgIGlmIChtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+Z2V0RHVyYXRpb24oJmR1cmF0aW9uVXMpID09IE9LKSB7CisgICAgICAgICAgICAgICAgZHJpdmVyLT5ub3RpZnlEdXJhdGlvbihtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkLCBkdXJhdGlvblVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKAorICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkLCBNRURJQTJfSU5GTywgTUVESUEyX0lORk9fREFUQV9TT1VSQ0VfU1RBUlQsIDApOwogICAgICAgICB9CiAgICAgfQogCkBAIC0yNDg0LDYgKzI1NzMsOCBAQAogICAgIG1SZXNldHRpbmcgPSBmYWxzZTsKICAgICBtU291cmNlU3RhcnRlZCA9IGZhbHNlOwogCisgICAgYWRkRW5kVGltZU1vbml0b3IoKTsKKwogICAgIC8vIE1vZHVsYXIgRFJNCiAgICAgaWYgKG1DcnlwdG8gIT0gTlVMTCkgewogICAgICAgICAvLyBkZWNvZGVycyB3aWxsIGJlIGZsdXNoZWQgYmVmb3JlIHRoaXMgc28gdGhlaXIgbUNyeXB0byB3b3VsZCBnbyBhd2F5IG9uIHRoZWlyIG93bgpAQCAtMjQ5Nyw5ICsyNTg4LDkgQEAKICAgICAgICAgbVJlbmRlcmVyLT5yZXN1bWUoKTsKICAgICB9CiAKLSAgICBvblN0YXJ0KCk7CisgICAgb25TdGFydCh0cnVlIC8qIHBsYXkgKi8pOwogICAgIG1QYXVzZWRCeUNsaWVudCA9IGZhbHNlOwotICAgIG5vdGlmeUxpc3RlbmVyKG1TcmNJZCwgTUVESUEyX1NUQVJURUQsIDAsIDApOworICAgIG5vdGlmeUxpc3RlbmVyKG1DdXJyZW50U291cmNlSW5mby5tU3JjSWQsIE1FRElBMl9TVEFSVEVELCAwLCAwKTsKIH0KIAogdm9pZCBOdVBsYXllcjI6OnBlcmZvcm1TY2FuU291cmNlcygpIHsKQEAgLTI1MjUsNyArMjYxNiw3IEBACiAgICAgaWYgKG1Ecml2ZXIgIT0gTlVMTCkgewogICAgICAgICBzcDxOdVBsYXllcjJEcml2ZXI+IGRyaXZlciA9IG1Ecml2ZXIucHJvbW90ZSgpOwogICAgICAgICBpZiAoZHJpdmVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGRyaXZlci0+bm90aWZ5U2V0U3VyZmFjZUNvbXBsZXRlKG1TcmNJZCk7CisgICAgICAgICAgICBkcml2ZXItPm5vdGlmeVNldFN1cmZhY2VDb21wbGV0ZShtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkKTsKICAgICAgICAgfQogICAgIH0KIH0KQEAgLTI1NTcsNyArMjY0OCw3IEBACiB2b2lkIE51UGxheWVyMjo6ZmluaXNoUmVzdW1lKCkgewogICAgIGlmIChtUmVzdW1lUGVuZGluZykgewogICAgICAgICBtUmVzdW1lUGVuZGluZyA9IGZhbHNlOwotICAgICAgICBub3RpZnlEcml2ZXJTZWVrQ29tcGxldGUobVNyY0lkKTsKKyAgICAgICAgbm90aWZ5RHJpdmVyU2Vla0NvbXBsZXRlKG1DdXJyZW50U291cmNlSW5mby5tU3JjSWQpOwogICAgIH0KIH0KIApAQCAtMjU3OSwzNiArMjY3MCw1MCBAQAogICAgIHN3aXRjaCAod2hhdCkgewogICAgICAgICBjYXNlIFNvdXJjZTo6a1doYXRQcmVwYXJlZDoKICAgICAgICAgewotICAgICAgICAgICAgQUxPR1YoIk51UGxheWVyMjo6b25Tb3VyY2VOb3RpZnkgU291cmNlOjprV2hhdFByZXBhcmVkIHNvdXJjZTogJXAiLCBtU291cmNlLmdldCgpKTsKLSAgICAgICAgICAgIGlmIChtU291cmNlID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGEgc3RhbGUgbm90aWZpY2F0aW9uIGZyb20gYSBzb3VyY2UgdGhhdCB3YXMKLSAgICAgICAgICAgICAgICAvLyBhc3luY2hyb25vdXNseSBwcmVwYXJpbmcgd2hlbiB0aGUgY2xpZW50IGNhbGxlZCByZXNldCgpLgotICAgICAgICAgICAgICAgIC8vIFdlIGhhbmRsZWQgdGhlIHJlc2V0LCB0aGUgc291cmNlIGlzIGdvbmUuCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGludDMyX3QgZXJyOwotICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImVyciIsICZlcnIpKTsKLQotICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgICAgIC8vIHNodXQgZG93biBwb3RlbnRpYWwgc2VjdXJlIGNvZGVjcyBpbiBjYXNlIGNsaWVudCBuZXZlciBjYWxscyByZXNldAotICAgICAgICAgICAgICAgIG1EZWZlcnJlZEFjdGlvbnMucHVzaF9iYWNrKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZsdXNoRGVjb2RlckFjdGlvbihGTFVTSF9DTURfU0hVVERPV04gLyogYXVkaW8gKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMVVNIX0NNRF9TSFVURE9XTiAvKiB2aWRlbyAqLykpOwotICAgICAgICAgICAgICAgIHByb2Nlc3NEZWZlcnJlZEFjdGlvbnMoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbVByZXBhcmVkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc3A8TnVQbGF5ZXIyRHJpdmVyPiBkcml2ZXIgPSBtRHJpdmVyLnByb21vdGUoKTsKLSAgICAgICAgICAgIGlmIChkcml2ZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIC8vIG5vdGlmeSBkdXJhdGlvbiBmaXJzdCwgc28gdGhhdCBpdCdzIGRlZmluaXRlbHkgc2V0IHdoZW4KLSAgICAgICAgICAgICAgICAvLyB0aGUgYXBwIHJlY2VpdmVkIHRoZSAicHJlcGFyZSBjb21wbGV0ZSIgY2FsbGJhY2suCi0gICAgICAgICAgICAgICAgaW50NjRfdCBkdXJhdGlvblVzOwotICAgICAgICAgICAgICAgIGlmIChtU291cmNlLT5nZXREdXJhdGlvbigmZHVyYXRpb25VcykgPT0gT0spIHsKLSAgICAgICAgICAgICAgICAgICAgZHJpdmVyLT5ub3RpZnlEdXJhdGlvbihzcmNJZCwgZHVyYXRpb25Vcyk7CisgICAgICAgICAgICBBTE9HVigiTnVQbGF5ZXIyOjpvblNvdXJjZU5vdGlmeSBTb3VyY2U6OmtXaGF0UHJlcGFyZWQgc291cmNlOiVwLCBJZCglbGxkKSIsCisgICAgICAgICAgICAgICAgICBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS5nZXQoKSwgKGxvbmcgbG9uZylzcmNJZCk7CisgICAgICAgICAgICBpZiAoc3JjSWQgPT0gbUN1cnJlbnRTb3VyY2VJbmZvLm1TcmNJZCkgeworICAgICAgICAgICAgICAgIGlmIChtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgYSBzdGFsZSBub3RpZmljYXRpb24gZnJvbSBhIHNvdXJjZSB0aGF0IHdhcworICAgICAgICAgICAgICAgICAgICAvLyBhc3luY2hyb25vdXNseSBwcmVwYXJpbmcgd2hlbiB0aGUgY2xpZW50IGNhbGxlZCByZXNldCgpLgorICAgICAgICAgICAgICAgICAgICAvLyBXZSBoYW5kbGVkIHRoZSByZXNldCwgdGhlIHNvdXJjZSBpcyBnb25lLgorICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZHJpdmVyLT5ub3RpZnlQcmVwYXJlQ29tcGxldGVkKHNyY0lkLCBlcnIpOworCisgICAgICAgICAgICAgICAgaW50MzJfdCBlcnI7CisgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImVyciIsICZlcnIpKTsKKworICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gc2h1dCBkb3duIHBvdGVudGlhbCBzZWN1cmUgY29kZWNzIGluIGNhc2UgY2xpZW50IG5ldmVyIGNhbGxzIHJlc2V0CisgICAgICAgICAgICAgICAgICAgIG1EZWZlcnJlZEFjdGlvbnMucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGbHVzaERlY29kZXJBY3Rpb24oRkxVU0hfQ01EX1NIVVRET1dOIC8qIGF1ZGlvICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkxVU0hfQ01EX1NIVVRET1dOIC8qIHZpZGVvICovKSk7CisgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NEZWZlcnJlZEFjdGlvbnMoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtUHJlcGFyZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHNwPE51UGxheWVyMkRyaXZlcj4gZHJpdmVyID0gbURyaXZlci5wcm9tb3RlKCk7CisgICAgICAgICAgICAgICAgaWYgKGRyaXZlciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIG5vdGlmeSBkdXJhdGlvbiBmaXJzdCwgc28gdGhhdCBpdCdzIGRlZmluaXRlbHkgc2V0IHdoZW4KKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGFwcCByZWNlaXZlZCB0aGUgInByZXBhcmUgY29tcGxldGUiIGNhbGxiYWNrLgorICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGR1cmF0aW9uVXM7CisgICAgICAgICAgICAgICAgICAgIGlmIChtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+Z2V0RHVyYXRpb24oJmR1cmF0aW9uVXMpID09IE9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkcml2ZXItPm5vdGlmeUR1cmF0aW9uKHNyY0lkLCBkdXJhdGlvblVzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBkcml2ZXItPm5vdGlmeVByZXBhcmVDb21wbGV0ZWQoc3JjSWQsIGVycik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChzcmNJZCA9PSBtTmV4dFNvdXJjZUluZm8ubVNyY0lkKSB7CisgICAgICAgICAgICAgICAgaWYgKG1OZXh0U291cmNlSW5mby5tU291cmNlID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAvLyBzdGFsZQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHNwPE51UGxheWVyMkRyaXZlcj4gZHJpdmVyID0gbURyaXZlci5wcm9tb3RlKCk7CisgICAgICAgICAgICAgICAgaWYgKGRyaXZlciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZXJyOworICAgICAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZXJyIiwgJmVycikpOworICAgICAgICAgICAgICAgICAgICBkcml2ZXItPm5vdGlmeVByZXBhcmVDb21wbGV0ZWQoc3JjSWQsIGVycik7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBicmVhazsKQEAgLTI2MTcsMTUgKzI3MjIsMTUgQEAKICAgICAgICAgLy8gTW9kdWxhciBEUk0KICAgICAgICAgY2FzZSBTb3VyY2U6OmtXaGF0RHJtSW5mbzoKICAgICAgICAgewotICAgICAgICAgICAgUGFyY2VsIHBhcmNlbDsKKyAgICAgICAgICAgIFBsYXllck1lc3NhZ2UgcGxheWVyTXNnOwogICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gZHJtSW5mbzsKICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEJ1ZmZlcigiZHJtSW5mbyIsICZkcm1JbmZvKSk7Ci0gICAgICAgICAgICBwYXJjZWwuc2V0RGF0YShkcm1JbmZvLT5kYXRhKCksIGRybUluZm8tPnNpemUoKSk7CisgICAgICAgICAgICBwbGF5ZXJNc2cuUGFyc2VGcm9tQXJyYXkoZHJtSW5mby0+ZGF0YSgpLCBkcm1JbmZvLT5zaXplKCkpOwogCi0gICAgICAgICAgICBBTE9HVigib25Tb3VyY2VOb3RpZnkoKSBrV2hhdERybUluZm8gTUVESUEyX0RSTV9JTkZPIGRybUluZm86ICVwICBwYXJjZWwgc2l6ZTogJXp1IiwKLSAgICAgICAgICAgICAgICAgICAgZHJtSW5mby5nZXQoKSwgcGFyY2VsLmRhdGFTaXplKCkpOworICAgICAgICAgICAgQUxPR1YoIm9uU291cmNlTm90aWZ5KCkga1doYXREcm1JbmZvIE1FRElBMl9EUk1fSU5GTyBkcm1JbmZvOiAlcCAgcGxheWVyTXNnIHNpemU6ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgZHJtSW5mby5nZXQoKSwgcGxheWVyTXNnLkJ5dGVTaXplKCkpOwogCi0gICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihzcmNJZCwgTUVESUEyX0RSTV9JTkZPLCAwIC8qIGV4dDEgKi8sIDAgLyogZXh0MiAqLywgJnBhcmNlbCk7CisgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihzcmNJZCwgTUVESUEyX0RSTV9JTkZPLCAwIC8qIGV4dDEgKi8sIDAgLyogZXh0MiAqLywgJnBsYXllck1zZyk7CiAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0yNjU0LDE5ICsyNzU5LDI2IEBACiAgICAgICAgICAgICAgICAgICAgIGRyaXZlci0+bm90aWZ5TGlzdGVuZXIoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjSWQsIE1FRElBMl9JTkZPLCBNRURJQTJfSU5GT19OT1RfU0VFS0FCTEUsIDApOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBkcml2ZXItPm5vdGlmeUZsYWdzQ2hhbmdlZChzcmNJZCwgZmxhZ3MpOworICAgICAgICAgICAgICAgIGlmIChzcmNJZCA9PSBtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkKSB7CisgICAgICAgICAgICAgICAgICAgIGRyaXZlci0+bm90aWZ5RmxhZ3NDaGFuZ2VkKHNyY0lkLCBmbGFncyk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAoKG1Tb3VyY2VGbGFncyAmIFNvdXJjZTo6RkxBR19EWU5BTUlDX0RVUkFUSU9OKQotICAgICAgICAgICAgICAgICAgICAmJiAoIShmbGFncyAmIFNvdXJjZTo6RkxBR19EWU5BTUlDX0RVUkFUSU9OKSkpIHsKLSAgICAgICAgICAgICAgICBjYW5jZWxQb2xsRHVyYXRpb24oKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIShtU291cmNlRmxhZ3MgJiBTb3VyY2U6OkZMQUdfRFlOQU1JQ19EVVJBVElPTikKLSAgICAgICAgICAgICAgICAgICAgJiYgKGZsYWdzICYgU291cmNlOjpGTEFHX0RZTkFNSUNfRFVSQVRJT04pCi0gICAgICAgICAgICAgICAgICAgICYmIChtQXVkaW9EZWNvZGVyICE9IE5VTEwgfHwgbVZpZGVvRGVjb2RlciAhPSBOVUxMKSkgewotICAgICAgICAgICAgICAgIHNjaGVkdWxlUG9sbER1cmF0aW9uKCk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3JjSWQgPT0gbUN1cnJlbnRTb3VyY2VJbmZvLm1TcmNJZCkgeworICAgICAgICAgICAgICAgIGlmICgobUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2VGbGFncyAmIFNvdXJjZTo6RkxBR19EWU5BTUlDX0RVUkFUSU9OKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgKCEoZmxhZ3MgJiBTb3VyY2U6OkZMQUdfRFlOQU1JQ19EVVJBVElPTikpKSB7CisgICAgICAgICAgICAgICAgICAgIGNhbmNlbFBvbGxEdXJhdGlvbigpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIShtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZUZsYWdzICYgU291cmNlOjpGTEFHX0RZTkFNSUNfRFVSQVRJT04pCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAoZmxhZ3MgJiBTb3VyY2U6OkZMQUdfRFlOQU1JQ19EVVJBVElPTikKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIChtQXVkaW9EZWNvZGVyICE9IE5VTEwgfHwgbVZpZGVvRGVjb2RlciAhPSBOVUxMKSkgeworICAgICAgICAgICAgICAgICAgICBzY2hlZHVsZVBvbGxEdXJhdGlvbigpOworICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgbVNvdXJjZUZsYWdzID0gZmxhZ3M7CisgICAgICAgICAgICAgICAgbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2VGbGFncyA9IGZsYWdzOworICAgICAgICAgICAgfSBlbHNlIGlmIChzcmNJZCA9PSBtTmV4dFNvdXJjZUluZm8ubVNyY0lkKSB7CisgICAgICAgICAgICAgICAgLy8gVE9ETzogaGFuZGxlIGR1cmF0aW9uIHBvbGxpbmcgZm9yIG5leHQgc291cmNlLgorICAgICAgICAgICAgICAgIG1OZXh0U291cmNlSW5mby5tU291cmNlRmxhZ3MgPSBmbGFnczsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKQEAgLTI4MTcsOCArMjkyOSw4IEBACiAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRCdWZmZXIoImJ1ZmZlciIsICZidWZmZXIpKTsKIAogICAgICAgICAgICAgc2l6ZV90IGluYmFuZFRyYWNrcyA9IDA7Ci0gICAgICAgICAgICBpZiAobVNvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgaW5iYW5kVHJhY2tzID0gbVNvdXJjZS0+Z2V0VHJhY2tDb3VudCgpOworICAgICAgICAgICAgaWYgKG1DdXJyZW50U291cmNlSW5mby5tU291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBpbmJhbmRUcmFja3MgPSBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+Z2V0VHJhY2tDb3VudCgpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBzZW5kU3VidGl0bGVEYXRhKGJ1ZmZlciwgaW5iYW5kVHJhY2tzKTsKQEAgLTI4MjcsNyArMjkzOSw3IEBACiAKICAgICAgICAgY2FzZSBOdVBsYXllcjI6OkNDRGVjb2Rlcjo6a1doYXRUcmFja0FkZGVkOgogICAgICAgICB7Ci0gICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihtU3JjSWQsIE1FRElBMl9JTkZPLCBNRURJQTJfSU5GT19NRVRBREFUQV9VUERBVEUsIDApOworICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIobUN1cnJlbnRTb3VyY2VJbmZvLm1TcmNJZCwgTUVESUEyX0lORk8sIE1FRElBMl9JTkZPX01FVEFEQVRBX1VQREFURSwgMCk7CiAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0yODQ2LDM1ICsyOTU4LDMxIEBACiAgICAgQ0hFQ0soYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcykpOwogICAgIENIRUNLKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoImR1cmF0aW9uVXMiLCAmZHVyYXRpb25VcykpOwogCi0gICAgUGFyY2VsIGluOwotICAgIGluLndyaXRlSW50MzIodHJhY2tJbmRleCArIGJhc2VJbmRleCk7Ci0gICAgaW4ud3JpdGVJbnQ2NCh0aW1lVXMpOwotICAgIGluLndyaXRlSW50NjQoZHVyYXRpb25Vcyk7Ci0gICAgaW4ud3JpdGVJbnQzMihidWZmZXItPnNpemUoKSk7Ci0gICAgaW4ud3JpdGVJbnQzMihidWZmZXItPnNpemUoKSk7Ci0gICAgaW4ud3JpdGUoYnVmZmVyLT5kYXRhKCksIGJ1ZmZlci0+c2l6ZSgpKTsKKyAgICBQbGF5ZXJNZXNzYWdlIHBsYXllck1zZzsKKyAgICBwbGF5ZXJNc2cuYWRkX3ZhbHVlcygpLT5zZXRfaW50MzJfdmFsdWUodHJhY2tJbmRleCArIGJhc2VJbmRleCk7CisgICAgcGxheWVyTXNnLmFkZF92YWx1ZXMoKS0+c2V0X2ludDY0X3ZhbHVlKHRpbWVVcyk7CisgICAgcGxheWVyTXNnLmFkZF92YWx1ZXMoKS0+c2V0X2ludDY0X3ZhbHVlKGR1cmF0aW9uVXMpOworICAgIHBsYXllck1zZy5hZGRfdmFsdWVzKCktPnNldF9ieXRlc192YWx1ZShidWZmZXItPmRhdGEoKSwgYnVmZmVyLT5zaXplKCkpOwogCi0gICAgbm90aWZ5TGlzdGVuZXIobVNyY0lkLCBNRURJQTJfU1VCVElUTEVfREFUQSwgMCwgMCwgJmluKTsKKyAgICBub3RpZnlMaXN0ZW5lcihtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkLCBNRURJQTJfU1VCVElUTEVfREFUQSwgMCwgMCwgJnBsYXllck1zZyk7CiB9CiAKIHZvaWQgTnVQbGF5ZXIyOjpzZW5kVGltZWRNZXRhRGF0YShjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKSB7CiAgICAgaW50NjRfdCB0aW1lVXM7CiAgICAgQ0hFQ0soYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcykpOwogCi0gICAgUGFyY2VsIGluOwotICAgIGluLndyaXRlSW50NjQodGltZVVzKTsKLSAgICBpbi53cml0ZUludDMyKGJ1ZmZlci0+c2l6ZSgpKTsKLSAgICBpbi53cml0ZUludDMyKGJ1ZmZlci0+c2l6ZSgpKTsKLSAgICBpbi53cml0ZShidWZmZXItPmRhdGEoKSwgYnVmZmVyLT5zaXplKCkpOworICAgIFBsYXllck1lc3NhZ2UgcGxheWVyTXNnOworICAgIHBsYXllck1zZy5hZGRfdmFsdWVzKCktPnNldF9pbnQ2NF92YWx1ZSh0aW1lVXMpOworICAgIHBsYXllck1zZy5hZGRfdmFsdWVzKCktPnNldF9ieXRlc192YWx1ZShidWZmZXItPmRhdGEoKSwgYnVmZmVyLT5zaXplKCkpOwogCi0gICAgbm90aWZ5TGlzdGVuZXIobVNyY0lkLCBNRURJQTJfTUVUQV9EQVRBLCAwLCAwLCAmaW4pOworICAgIG5vdGlmeUxpc3RlbmVyKG1DdXJyZW50U291cmNlSW5mby5tU3JjSWQsIE1FRElBMl9NRVRBX0RBVEEsIDAsIDAsICZwbGF5ZXJNc2cpOwogfQogCiB2b2lkIE51UGxheWVyMjo6c2VuZFRpbWVkVGV4dERhdGEoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcikgewogICAgIGNvbnN0IHZvaWQgKmRhdGE7CiAgICAgc2l6ZV90IHNpemUgPSAwOwogICAgIGludDY0X3QgdGltZVVzOwotICAgIGludDMyX3QgZmxhZyA9IFRleHREZXNjcmlwdGlvbnM6OklOX0JBTkRfVEVYVF8zR1BQOworICAgIGludDMyX3QgZmxhZyA9IFRleHREZXNjcmlwdGlvbnMyOjpJTl9CQU5EX1RFWFRfM0dQUDsKIAogICAgIEFTdHJpbmcgbWltZTsKICAgICBDSEVDSyhidWZmZXItPm1ldGEoKS0+ZmluZFN0cmluZygibWltZSIsICZtaW1lKSk7CkBAIC0yODgzLDI4ICsyOTkxLDI4IEBACiAgICAgZGF0YSA9IGJ1ZmZlci0+ZGF0YSgpOwogICAgIHNpemUgPSBidWZmZXItPnNpemUoKTsKIAotICAgIFBhcmNlbCBwYXJjZWw7CisgICAgUGxheWVyTWVzc2FnZSBwbGF5ZXJNc2c7CiAgICAgaWYgKHNpemUgPiAwKSB7CiAgICAgICAgIENIRUNLKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZ0aW1lVXMpKTsKICAgICAgICAgaW50MzJfdCBnbG9iYWwgPSAwOwogICAgICAgICBpZiAoYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQzMigiZ2xvYmFsIiwgJmdsb2JhbCkgJiYgZ2xvYmFsKSB7Ci0gICAgICAgICAgICBmbGFnIHw9IFRleHREZXNjcmlwdGlvbnM6OkdMT0JBTF9ERVNDUklQVElPTlM7CisgICAgICAgICAgICBmbGFnIHw9IFRleHREZXNjcmlwdGlvbnMyOjpHTE9CQUxfREVTQ1JJUFRJT05TOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZmxhZyB8PSBUZXh0RGVzY3JpcHRpb25zOjpMT0NBTF9ERVNDUklQVElPTlM7CisgICAgICAgICAgICBmbGFnIHw9IFRleHREZXNjcmlwdGlvbnMyOjpMT0NBTF9ERVNDUklQVElPTlM7CiAgICAgICAgIH0KLSAgICAgICAgVGV4dERlc2NyaXB0aW9uczo6Z2V0UGFyY2VsT2ZEZXNjcmlwdGlvbnMoCi0gICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKilkYXRhLCBzaXplLCBmbGFnLCB0aW1lVXMgLyAxMDAwLCAmcGFyY2VsKTsKKyAgICAgICAgVGV4dERlc2NyaXB0aW9uczI6OmdldFBsYXllck1lc3NhZ2VPZkRlc2NyaXB0aW9ucygKKyAgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCAqKWRhdGEsIHNpemUsIGZsYWcsIHRpbWVVcyAvIDEwMDAsICZwbGF5ZXJNc2cpOwogICAgIH0KIAotICAgIGlmICgocGFyY2VsLmRhdGFTaXplKCkgPiAwKSkgewotICAgICAgICBub3RpZnlMaXN0ZW5lcihtU3JjSWQsIE1FRElBMl9USU1FRF9URVhULCAwLCAwLCAmcGFyY2VsKTsKKyAgICBpZiAocGxheWVyTXNnLnZhbHVlc19zaXplKCkgPiAwKSB7CisgICAgICAgIG5vdGlmeUxpc3RlbmVyKG1DdXJyZW50U291cmNlSW5mby5tU3JjSWQsIE1FRElBMl9USU1FRF9URVhULCAwLCAwLCAmcGxheWVyTXNnKTsKICAgICB9IGVsc2UgeyAgLy8gc2VuZCBhbiBlbXB0eSB0aW1lZCB0ZXh0Ci0gICAgICAgIG5vdGlmeUxpc3RlbmVyKG1TcmNJZCwgTUVESUEyX1RJTUVEX1RFWFQsIDAsIDApOworICAgICAgICBub3RpZnlMaXN0ZW5lcihtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkLCBNRURJQTJfVElNRURfVEVYVCwgMCwgMCk7CiAgICAgfQogfQogCiBjb25zdCBjaGFyICpOdVBsYXllcjI6OmdldERhdGFTb3VyY2VUeXBlKCkgewotICAgIHN3aXRjaCAobURhdGFTb3VyY2VUeXBlKSB7CisgICAgc3dpdGNoIChtQ3VycmVudFNvdXJjZUluZm8ubURhdGFTb3VyY2VUeXBlKSB7CiAgICAgICAgIGNhc2UgREFUQV9TT1VSQ0VfVFlQRV9IVFRQX0xJVkU6CiAgICAgICAgICAgICByZXR1cm4gIkhUVFBMaXZlIjsKIApAQCAtMjk3OCw3ICszMDg2LDcgQEAKICAgICBBTE9HRCgib25QcmVwYXJlRHJtICIpOwogCiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgaWYgKG1Tb3VyY2UgPT0gTlVMTCkgeworICAgIGlmIChtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZSA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dFKCJvblByZXBhcmVEcm06IE5vIHNvdXJjZS4gb25QcmVwYXJlRHJtIGZhaWxlZCB3aXRoICVkLiIsIHN0YXR1cyk7CiAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQpAQCAtMjk5MSwxMiArMzA5OSwxMiBAQAogICAgIHN0YXR1cyA9IE9LOwogICAgIHNwPEFNZWRpYUNyeXB0b1dyYXBwZXI+IGNyeXB0byA9IE5VTEw7CiAKLSAgICBzdGF0dXMgPSBtU291cmNlLT5wcmVwYXJlRHJtKHV1aWQsICpkcm1TZXNzaW9uSWQsICZjcnlwdG8pOworICAgIHN0YXR1cyA9IG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5wcmVwYXJlRHJtKHV1aWQsICpkcm1TZXNzaW9uSWQsICZjcnlwdG8pOwogICAgIGlmIChjcnlwdG8gPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgib25QcmVwYXJlRHJtOiBtU291cmNlLT5wcmVwYXJlRHJtIGZhaWxlZC4gc3RhdHVzOiAlZCIsIHN0YXR1cyk7CisgICAgICAgIEFMT0dFKCJvblByZXBhcmVEcm06IG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5wcmVwYXJlRHJtIGZhaWxlZC4gc3RhdHVzOiAlZCIsIHN0YXR1cyk7CiAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQotICAgIEFMT0dWKCJvblByZXBhcmVEcm06IG1Tb3VyY2UtPnByZXBhcmVEcm0gc3VjY2VlZGVkIik7CisgICAgQUxPR1YoIm9uUHJlcGFyZURybTogbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPnByZXBhcmVEcm0gc3VjY2VlZGVkIik7CiAKICAgICBpZiAobUNyeXB0byAhPSBOVUxMKSB7CiAgICAgICAgIEFMT0dFKCJvblByZXBhcmVEcm06IFVuZXhwZWN0ZWQuIEFscmVhZHkgaGF2aW5nIG1DcnlwdG86ICVwIiwgbUNyeXB0by5nZXQoKSk7CkBAIC0zMDI1LDggKzMxMzMsOCBAQAogICAgIHN0YXR1c190IHN0YXR1czsKICAgICBpZiAobUNyeXB0byAhPSBOVUxMKSB7CiAgICAgICAgIC8vIG5vdGlmeWluZyB0aGUgc291cmNlIGZpcnN0IGJlZm9yZSByZW1vdmluZyBjcnlwdG8gZnJvbSBjb2RlYwotICAgICAgICBpZiAobVNvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBtU291cmNlLT5yZWxlYXNlRHJtKCk7CisgICAgICAgIGlmIChtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgICAgICBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+cmVsZWFzZURybSgpOwogICAgICAgICB9CiAKICAgICAgICAgc3RhdHVzPU9LOwpAQCAtMzExMSw0ICszMjE5LDIyIEBACiAgICAgVFJFU1BBU1MoKTsKIH0KIAorTnVQbGF5ZXIyOjpTb3VyY2VJbmZvOjpTb3VyY2VJbmZvKCkKKyAgICA6IG1EYXRhU291cmNlVHlwZShEQVRBX1NPVVJDRV9UWVBFX05PTkUpLAorICAgICAgbVNyY0lkKDApLAorICAgICAgbVNvdXJjZUZsYWdzKDApLAorICAgICAgbVN0YXJ0VGltZVVzKDApLAorICAgICAgbUVuZFRpbWVVcyhEYXRhU291cmNlRGVzYzo6a01heFRpbWVVcykgeworfQorCitOdVBsYXllcjI6OlNvdXJjZUluZm8gJiBOdVBsYXllcjI6OlNvdXJjZUluZm86Om9wZXJhdG9yPShjb25zdCBOdVBsYXllcjI6OlNvdXJjZUluZm8gJm90aGVyKSB7CisgICAgbVNvdXJjZSA9IG90aGVyLm1Tb3VyY2U7CisgICAgbURhdGFTb3VyY2VUeXBlID0gKERBVEFfU09VUkNFX1RZUEUpb3RoZXIubURhdGFTb3VyY2VUeXBlOworICAgIG1TcmNJZCA9IG90aGVyLm1TcmNJZDsKKyAgICBtU291cmNlRmxhZ3MgPSBvdGhlci5tU291cmNlRmxhZ3M7CisgICAgbVN0YXJ0VGltZVVzID0gb3RoZXIubVN0YXJ0VGltZVVzOworICAgIG1FbmRUaW1lVXMgPSBvdGhlci5tRW5kVGltZVVzOworICAgIHJldHVybiAqdGhpczsKK30KKwogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMi5oCmluZGV4IDk2Zjg1ZjkuLjNlY2RiMDEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjIuaApAQCAtMjMsNiArMjMsMTAgQEAKIAogI2luY2x1ZGUgPG1lZGlhcGxheWVyMi9NZWRpYVBsYXllcjJJbnRlcmZhY2UuaD4KIAorI2luY2x1ZGUgIm1lZGlhcGxheWVyMi5wYi5oIgorCit1c2luZyBhbmRyb2lkOjptZWRpYTo6TWVkaWFQbGF5ZXIyUHJvdG86OlBsYXllck1lc3NhZ2U7CisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RydWN0IEFCdWZmZXI7CkBAIC03NSwxMCArNzksMTEgQEAKICAgICAgICAgICAgIGludDY0X3Qgc2Vla1RpbWVVcywKICAgICAgICAgICAgIE1lZGlhUGxheWVyMlNlZWtNb2RlIG1vZGUgPSBNZWRpYVBsYXllcjJTZWVrTW9kZTo6U0VFS19QUkVWSU9VU19TWU5DLAogICAgICAgICAgICAgYm9vbCBuZWVkTm90aWZ5ID0gZmFsc2UpOworICAgIHZvaWQgcmV3aW5kKCk7CiAKICAgICBzdGF0dXNfdCBzZXRWaWRlb1NjYWxpbmdNb2RlKGludDMyX3QgbW9kZSk7Ci0gICAgc3RhdHVzX3QgZ2V0VHJhY2tJbmZvKFBhcmNlbCogcmVwbHkpIGNvbnN0OwotICAgIHN0YXR1c190IGdldFNlbGVjdGVkVHJhY2soaW50MzJfdCB0eXBlLCBQYXJjZWwqIHJlcGx5KSBjb25zdDsKKyAgICBzdGF0dXNfdCBnZXRUcmFja0luZm8oUGxheWVyTWVzc2FnZSogcmVwbHkpIGNvbnN0OworICAgIHN0YXR1c190IGdldFNlbGVjdGVkVHJhY2soaW50MzJfdCB0eXBlLCBQbGF5ZXJNZXNzYWdlKiByZXBseSkgY29uc3Q7CiAgICAgc3RhdHVzX3Qgc2VsZWN0VHJhY2soc2l6ZV90IHRyYWNrSW5kZXgsIGJvb2wgc2VsZWN0LCBpbnQ2NF90IHRpbWVVcyk7CiAgICAgc3RhdHVzX3QgZ2V0Q3VycmVudFBvc2l0aW9uKGludDY0X3QgKm1lZGlhVXMpOwogICAgIHZvaWQgZ2V0U3RhdHMoVmVjdG9yPHNwPEFNZXNzYWdlPiA+ICptVHJhY2tTdGF0cyk7CkBAIC0xNTAsNiArMTU1LDI5IEBACiAgICAgICAgIGtXaGF0U2V0QnVmZmVyaW5nU2V0dGluZ3MgICAgICAgPSAnc0J1UycsCiAgICAgICAgIGtXaGF0UHJlcGFyZURybSAgICAgICAgICAgICAgICAgPSAncERybScsCiAgICAgICAgIGtXaGF0UmVsZWFzZURybSAgICAgICAgICAgICAgICAgPSAnckRybScsCisgICAgICAgIGtXaGF0UmV3aW5kICAgICAgICAgICAgICAgICAgICAgPSAncmVXZCcsCisgICAgICAgIGtXaGF0RU9TTW9uaXRvciAgICAgICAgICAgICAgICAgPSAnZW9zTScsCisgICAgfTsKKworICAgIHR5cGVkZWYgZW51bSB7CisgICAgICAgIERBVEFfU09VUkNFX1RZUEVfTk9ORSwKKyAgICAgICAgREFUQV9TT1VSQ0VfVFlQRV9IVFRQX0xJVkUsCisgICAgICAgIERBVEFfU09VUkNFX1RZUEVfUlRTUCwKKyAgICAgICAgREFUQV9TT1VSQ0VfVFlQRV9HRU5FUklDX1VSTCwKKyAgICAgICAgREFUQV9TT1VSQ0VfVFlQRV9HRU5FUklDX0ZELAorICAgICAgICBEQVRBX1NPVVJDRV9UWVBFX01FRElBLAorICAgIH0gREFUQV9TT1VSQ0VfVFlQRTsKKworICAgIHN0cnVjdCBTb3VyY2VJbmZvIHsKKyAgICAgICAgU291cmNlSW5mbygpOworICAgICAgICBTb3VyY2VJbmZvICZvcGVyYXRvcj0oY29uc3QgU291cmNlSW5mbyAmKTsKKworICAgICAgICBzcDxTb3VyY2U+IG1Tb3VyY2U7CisgICAgICAgIHN0ZDo6YXRvbWljPERBVEFfU09VUkNFX1RZUEU+IG1EYXRhU291cmNlVHlwZTsKKyAgICAgICAgaW50NjRfdCBtU3JjSWQ7CisgICAgICAgIHVpbnQzMl90IG1Tb3VyY2VGbGFnczsKKyAgICAgICAgaW50NjRfdCBtU3RhcnRUaW1lVXM7CisgICAgICAgIGludDY0X3QgbUVuZFRpbWVVczsKICAgICB9OwogCiAgICAgd3A8TnVQbGF5ZXIyRHJpdmVyPiBtRHJpdmVyOwpAQCAtMTU3LDEyICsxODUsOCBAQAogICAgIHVpZF90IG1VSUQ7CiAgICAgY29uc3Qgc3A8TWVkaWFDbG9jaz4gbU1lZGlhQ2xvY2s7CiAgICAgTXV0ZXggbVNvdXJjZUxvY2s7ICAvLyBndWFyZCB8bVNvdXJjZXwuCi0gICAgc3A8U291cmNlPiBtU291cmNlOwotICAgIGludDY0X3QgbVNyY0lkOwotICAgIHVpbnQzMl90IG1Tb3VyY2VGbGFnczsKLSAgICBzcDxTb3VyY2U+IG1OZXh0U291cmNlOwotICAgIGludDY0X3QgbU5leHRTcmNJZDsKLSAgICB1aW50MzJfdCBtTmV4dFNvdXJjZUZsYWdzOworICAgIFNvdXJjZUluZm8gbUN1cnJlbnRTb3VyY2VJbmZvOworICAgIFNvdXJjZUluZm8gbU5leHRTb3VyY2VJbmZvOwogICAgIHNwPEFOYXRpdmVXaW5kb3dXcmFwcGVyPiBtTmF0aXZlV2luZG93OwogICAgIHNwPE1lZGlhUGxheWVyMkludGVyZmFjZTo6QXVkaW9TaW5rPiBtQXVkaW9TaW5rOwogICAgIHNwPERlY29kZXJCYXNlPiBtVmlkZW9EZWNvZGVyOwpAQCAtMTc0LDYgKzE5OCw3IEBACiAgICAgaW50MzJfdCBtQXVkaW9EZWNvZGVyR2VuZXJhdGlvbjsKICAgICBpbnQzMl90IG1WaWRlb0RlY29kZXJHZW5lcmF0aW9uOwogICAgIGludDMyX3QgbVJlbmRlcmVyR2VuZXJhdGlvbjsKKyAgICBpbnQzMl90IG1FT1NNb25pdG9yR2VuZXJhdGlvbjsKIAogICAgIE11dGV4IG1QbGF5aW5nVGltZUxvY2s7CiAgICAgaW50NjRfdCBtTGFzdFN0YXJ0ZWRQbGF5aW5nVGltZU5zOwpAQCAtMjQ4LDE4ICsyNzMsNiBAQAogICAgIHNwPEFNZWRpYUNyeXB0b1dyYXBwZXI+IG1DcnlwdG87CiAgICAgYm9vbCBtSXNEcm1Qcm90ZWN0ZWQ7CiAKLSAgICB0eXBlZGVmIGVudW0gewotICAgICAgICBEQVRBX1NPVVJDRV9UWVBFX05PTkUsCi0gICAgICAgIERBVEFfU09VUkNFX1RZUEVfSFRUUF9MSVZFLAotICAgICAgICBEQVRBX1NPVVJDRV9UWVBFX1JUU1AsCi0gICAgICAgIERBVEFfU09VUkNFX1RZUEVfR0VORVJJQ19VUkwsCi0gICAgICAgIERBVEFfU09VUkNFX1RZUEVfR0VORVJJQ19GRCwKLSAgICAgICAgREFUQV9TT1VSQ0VfVFlQRV9NRURJQSwKLSAgICB9IERBVEFfU09VUkNFX1RZUEU7Ci0KLSAgICBzdGQ6OmF0b21pYzxEQVRBX1NPVVJDRV9UWVBFPiBtRGF0YVNvdXJjZVR5cGU7Ci0gICAgc3RkOjphdG9taWM8REFUQV9TT1VSQ0VfVFlQRT4gbU5leHREYXRhU291cmNlVHlwZTsKLQogICAgIGlubGluZSBjb25zdCBzcDxEZWNvZGVyQmFzZT4gJmdldERlY29kZXIoYm9vbCBhdWRpbykgewogICAgICAgICByZXR1cm4gYXVkaW8gPyBtQXVkaW9EZWNvZGVyIDogbVZpZGVvRGVjb2RlcjsKICAgICB9CkBAIC0yOTIsMTIgKzMwNSwxNCBAQAogICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZpbnB1dEZvcm1hdCwKICAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmb3V0cHV0Rm9ybWF0ID0gTlVMTCk7CiAKLSAgICB2b2lkIG5vdGlmeUxpc3RlbmVyKGludDY0X3Qgc3JjSWQsIGludCBtc2csIGludCBleHQxLCBpbnQgZXh0MiwgY29uc3QgUGFyY2VsICppbiA9IE5VTEwpOworICAgIHZvaWQgbm90aWZ5TGlzdGVuZXIoaW50NjRfdCBzcmNJZCwgaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyLCBjb25zdCBQbGF5ZXJNZXNzYWdlICppbiA9IE5VTEwpOworCisgICAgdm9pZCBhZGRFbmRUaW1lTW9uaXRvcigpOwogCiAgICAgdm9pZCBoYW5kbGVGbHVzaENvbXBsZXRlKGJvb2wgYXVkaW8sIGJvb2wgaXNEZWNvZGVyKTsKICAgICB2b2lkIGZpbmlzaEZsdXNoSWZQb3NzaWJsZSgpOwogCi0gICAgdm9pZCBvblN0YXJ0KCk7CisgICAgdm9pZCBvblN0YXJ0KGJvb2wgcGxheSk7CiAgICAgdm9pZCBvblJlc3VtZSgpOwogICAgIHZvaWQgb25QYXVzZSgpOwogCkBAIC0zMzMsNyArMzQ4LDcgQEAKICAgICB2b2lkIHNlbmRUaW1lZE1ldGFEYXRhKGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpOwogICAgIHZvaWQgc2VuZFRpbWVkVGV4dERhdGEoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcik7CiAKLSAgICB2b2lkIHdyaXRlVHJhY2tJbmZvKFBhcmNlbCogcmVwbHksIGNvbnN0IHNwPEFNZXNzYWdlPiYgZm9ybWF0KSBjb25zdDsKKyAgICB2b2lkIHdyaXRlVHJhY2tJbmZvKFBsYXllck1lc3NhZ2UqIHJlcGx5LCBjb25zdCBzcDxBTWVzc2FnZT4mIGZvcm1hdCkgY29uc3Q7CiAKICAgICBzdGF0dXNfdCBvblByZXBhcmVEcm0oY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwogICAgIHN0YXR1c190IG9uUmVsZWFzZURybSgpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJEZWNvZGVyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyRGVjb2Rlci5jcHAKaW5kZXggNjQ1MTM4YS4uOTMxYjg2ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJEZWNvZGVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkRlY29kZXIuY3BwCkBAIC0xMDg4LDYgKzEwODgsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PE1lZGlhQnVmZmVySG9sZGVyKj4oaG9sZGVyLmdldCgpKS0+bWVkaWFCdWZmZXIoKSA6IG51bGxwdHI7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmIChtZWRpYUJ1ZiAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtZWRpYUJ1Zi0+c2l6ZSgpID4gY29kZWNCdWZmZXItPmNhcGFjaXR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUVycm9yKEVSUk9SX0JVRkZFUl9UT09fU01BTEwpOworICAgICAgICAgICAgICAgICAgICAgICAgbURlcXVldWVkSW5wdXRCdWZmZXJzLnB1c2hfYmFjayhidWZmZXJJeCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgICAgICBjb2RlY0J1ZmZlci0+c2V0UmFuZ2UoMCwgbWVkaWFCdWYtPnNpemUoKSk7CiAgICAgICAgICAgICAgICAgICAgIG1lbWNweShjb2RlY0J1ZmZlci0+ZGF0YSgpLCBtZWRpYUJ1Zi0+ZGF0YSgpLCBtZWRpYUJ1Zi0+c2l6ZSgpKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJEcml2ZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJEcml2ZXIuY3BwCmluZGV4IGJhZmE2NTMuLjgyMWRjOWYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyRHJpdmVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkRyaXZlci5jcHAKQEAgLTM3LDQ1ICszNyw0NyBAQAogCiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhQW5hbHl0aWNzU2VydmljZS5oPgogCit1c2luZyBnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkOwordXNpbmcgYW5kcm9pZDo6bWVkaWE6Ok1lZGlhUGxheWVyMlByb3RvOjpWYWx1ZTsKKwogc3RhdGljIGNvbnN0IGludCBrRHVtcExvY2tSZXRyaWVzID0gNTA7CiBzdGF0aWMgY29uc3QgaW50IGtEdW1wTG9ja1NsZWVwVXMgPSAyMDAwMDsKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1zdHJ1Y3QgUGFyY2VsV3JhcHBlciA6IHB1YmxpYyBSZWZCYXNlIHsKLSAgICBzdGF0aWMgc3A8UGFyY2VsV3JhcHBlcj4gQ3JlYXRlKGNvbnN0IFBhcmNlbCAqcCkgeworc3RydWN0IFBsYXllck1lc3NhZ2VXcmFwcGVyIDogcHVibGljIFJlZkJhc2UgeworICAgIHN0YXRpYyBzcDxQbGF5ZXJNZXNzYWdlV3JhcHBlcj4gQ3JlYXRlKGNvbnN0IFBsYXllck1lc3NhZ2UgKnApIHsKICAgICAgICAgaWYgKHAgIT0gTlVMTCkgewotICAgICAgICAgICAgc3A8UGFyY2VsV3JhcHBlcj4gcHcgPSBuZXcgUGFyY2VsV3JhcHBlcigpOwotICAgICAgICAgICAgaWYgKHB3LT5hcHBlbmRGcm9tKHApID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHB3OwotICAgICAgICAgICAgfQorICAgICAgICAgICAgc3A8UGxheWVyTWVzc2FnZVdyYXBwZXI+IHB3ID0gbmV3IFBsYXllck1lc3NhZ2VXcmFwcGVyKCk7CisgICAgICAgICAgICBwdy0+Y29weUZyb20ocCk7CisgICAgICAgICAgICByZXR1cm4gcHc7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCi0gICAgY29uc3QgUGFyY2VsICpnZXRQYXJjZWwoKSB7Ci0gICAgICAgIHJldHVybiBtUGFyY2VsOworICAgIGNvbnN0IFBsYXllck1lc3NhZ2UgKmdldFBsYXllck1lc3NhZ2UoKSB7CisgICAgICAgIHJldHVybiBtUGxheWVyTWVzc2FnZTsKICAgICB9CiAKIHByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIH5QYXJjZWxXcmFwcGVyKCkgewotICAgICAgICBpZiAobVBhcmNlbCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBkZWxldGUgbVBhcmNlbDsKKyAgICB2aXJ0dWFsIH5QbGF5ZXJNZXNzYWdlV3JhcHBlcigpIHsKKyAgICAgICAgaWYgKG1QbGF5ZXJNZXNzYWdlICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGRlbGV0ZSBtUGxheWVyTWVzc2FnZTsKICAgICAgICAgfQogICAgIH0KIAogcHJpdmF0ZToKLSAgICBQYXJjZWxXcmFwcGVyKCkKLSAgICAgICAgOiBtUGFyY2VsKE5VTEwpIHsgfQorICAgIFBsYXllck1lc3NhZ2VXcmFwcGVyKCkKKyAgICAgICAgOiBtUGxheWVyTWVzc2FnZShOVUxMKSB7IH0KIAotICAgIHN0YXR1c190IGFwcGVuZEZyb20oY29uc3QgUGFyY2VsICpwKSB7Ci0gICAgICAgIGlmIChtUGFyY2VsID09IE5VTEwpIHsKLSAgICAgICAgICAgIG1QYXJjZWwgPSBuZXcgUGFyY2VsOworICAgIHZvaWQgY29weUZyb20oY29uc3QgUGxheWVyTWVzc2FnZSAqcCkgeworICAgICAgICBpZiAobVBsYXllck1lc3NhZ2UgPT0gTlVMTCkgeworICAgICAgICAgICAgbVBsYXllck1lc3NhZ2UgPSBuZXcgUGxheWVyTWVzc2FnZTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gbVBhcmNlbC0+YXBwZW5kRnJvbShwLCAwIC8qIHN0YXJ0ICovLCBwLT5kYXRhU2l6ZSgpKTsKKyAgICAgICAgbVBsYXllck1lc3NhZ2UtPkNvcHlGcm9tKCpwKTsKICAgICB9CiAKLSAgICBQYXJjZWwgKm1QYXJjZWw7CisgICAgUGxheWVyTWVzc2FnZSAqbVBsYXllck1lc3NhZ2U7CiB9OwogCiAvLyBrZXkgZm9yIG1lZGlhIHN0YXRpc3RpY3MKQEAgLTI3MywxMyArMjc1LDYgQEAKICAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX1BSRVBBUklORzsKICAgICAgICAgICAgIG1QbGF5ZXItPnByZXBhcmVBc3luYygpOwogICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICBjYXNlIFNUQVRFX1NUT1BQRUQ6Ci0gICAgICAgICAgICAvLyB0aGlzIGlzIHJlYWxseSBqdXN0IHBhdXNlZC4gaGFuZGxlIGFzIHNlZWsgdG8gc3RhcnQKLSAgICAgICAgICAgIG1BdEVPUyA9IGZhbHNlOwotICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfU1RPUFBFRF9BTkRfUFJFUEFSSU5HOwotICAgICAgICAgICAgbVBsYXllci0+c2Vla1RvQXN5bmMoMCwgTWVkaWFQbGF5ZXIyU2Vla01vZGU6OlNFRUtfUFJFVklPVVNfU1lOQyAvKiBtb2RlICovLAotICAgICAgICAgICAgICAgICAgICB0cnVlIC8qIG5lZWROb3RpZnkgKi8pOwotICAgICAgICAgICAgcmV0dXJuIE9LOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH07CkBAIC0yOTQsNyArMjg5LDYgQEAKIHN0YXR1c190IE51UGxheWVyMkRyaXZlcjo6c3RhcnRfbCgpIHsKICAgICBzd2l0Y2ggKG1TdGF0ZSkgewogICAgICAgICBjYXNlIFNUQVRFX1BBVVNFRDoKLSAgICAgICAgY2FzZSBTVEFURV9TVE9QUEVEX0FORF9QUkVQQVJFRDoKICAgICAgICAgY2FzZSBTVEFURV9QUkVQQVJFRDoKICAgICAgICAgewogICAgICAgICAgICAgbVBsYXllci0+c3RhcnQoKTsKQEAgLTMwNCw3ICsyOTgsNyBAQAogICAgICAgICBjYXNlIFNUQVRFX1JVTk5JTkc6CiAgICAgICAgIHsKICAgICAgICAgICAgIGlmIChtQXRFT1MpIHsKLSAgICAgICAgICAgICAgICBtUGxheWVyLT5zZWVrVG9Bc3luYygwKTsKKyAgICAgICAgICAgICAgICBtUGxheWVyLT5yZXdpbmQoKTsKICAgICAgICAgICAgICAgICBtQXRFT1MgPSBmYWxzZTsKICAgICAgICAgICAgICAgICBtUG9zaXRpb25VcyA9IC0xOwogICAgICAgICAgICAgfQpAQCAtMzIwLDM0ICszMTQsNiBAQAogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgTnVQbGF5ZXIyRHJpdmVyOjpzdG9wKCkgewotICAgIEFMT0dEKCJzdG9wKCVwKSIsIHRoaXMpOwotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBzd2l0Y2ggKG1TdGF0ZSkgewotICAgICAgICBjYXNlIFNUQVRFX1JVTk5JTkc6Ci0gICAgICAgICAgICBtUGxheWVyLT5wYXVzZSgpOwotICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoCi0KLSAgICAgICAgY2FzZSBTVEFURV9QQVVTRUQ6Ci0gICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9TVE9QUEVEOwotICAgICAgICAgICAgLy9ub3RpZnlMaXN0ZW5lcl9sKE1FRElBMl9TVE9QUEVEKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgU1RBVEVfUFJFUEFSRUQ6Ci0gICAgICAgIGNhc2UgU1RBVEVfU1RPUFBFRDoKLSAgICAgICAgY2FzZSBTVEFURV9TVE9QUEVEX0FORF9QUkVQQVJJTkc6Ci0gICAgICAgIGNhc2UgU1RBVEVfU1RPUFBFRF9BTkRfUFJFUEFSRUQ6Ci0gICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9TVE9QUEVEOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KIHN0YXR1c190IE51UGxheWVyMkRyaXZlcjo6cGF1c2UoKSB7CiAgICAgQUxPR0QoInBhdXNlKCVwKSIsIHRoaXMpOwogICAgIC8vIFRoZSBOdVBsYXllclJlbmRlcmVyIG1heSBnZXQgZmx1c2hlZCBpZiBwYXVzZSBmb3IgbG9uZyBlbm91Z2gsIGUuZy4gdGhlIHBhdXNlIHRpbWVvdXQgdGVhcgpAQCAtMzYxLDkgKzMyNyw5IEBACiAKICAgICBzd2l0Y2ggKG1TdGF0ZSkgewogICAgICAgICBjYXNlIFNUQVRFX1BBVVNFRDoKLSAgICAgICAgY2FzZSBTVEFURV9QUkVQQVJFRDoKICAgICAgICAgICAgIHJldHVybiBPSzsKIAorICAgICAgICBjYXNlIFNUQVRFX1BSRVBBUkVEOgogICAgICAgICBjYXNlIFNUQVRFX1JVTk5JTkc6CiAgICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9QQVVTRUQ7CiAgICAgICAgICAgICBtUGxheWVyLT5wYXVzZSgpOwpAQCAtMzg2LDE1ICszNTIsNiBAQAogICAgICAgICAvLyB0cnkgdG8gdXBkYXRlIHBvc2l0aW9uCiAgICAgICAgIGludDY0X3QgdW51c2VkOwogICAgICAgICBnZXRDdXJyZW50UG9zaXRpb24oJnVudXNlZCk7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgICAgIGlmIChyYXRlLm1TcGVlZCA9PSAwLmYgJiYgbVN0YXRlID09IFNUQVRFX1JVTk5JTkcpIHsKLSAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX1BBVVNFRDsKLSAgICAgICAgfSBlbHNlIGlmIChyYXRlLm1TcGVlZCAhPSAwLmYKLSAgICAgICAgICAgICAgICAmJiAobVN0YXRlID09IFNUQVRFX1BBVVNFRAotICAgICAgICAgICAgICAgICAgICB8fCBtU3RhdGUgPT0gU1RBVEVfU1RPUFBFRF9BTkRfUFJFUEFSRUQKLSAgICAgICAgICAgICAgICAgICAgfHwgbVN0YXRlID09IFNUQVRFX1BSRVBBUkVEKSkgewotICAgICAgICAgICAgZXJyID0gc3RhcnRfbCgpOwotICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiBlcnI7CiB9CkBAIC00MTksNyArMzc2LDYgQEAKIAogICAgIHN3aXRjaCAobVN0YXRlKSB7CiAgICAgICAgIGNhc2UgU1RBVEVfUFJFUEFSRUQ6Ci0gICAgICAgIGNhc2UgU1RBVEVfU1RPUFBFRF9BTkRfUFJFUEFSRUQ6CiAgICAgICAgIGNhc2UgU1RBVEVfUEFVU0VEOgogICAgICAgICBjYXNlIFNUQVRFX1JVTk5JTkc6CiAgICAgICAgIHsKQEAgLTYwMSwxMCArNTU3LDYgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KIAotICAgIGlmIChtU3RhdGUgIT0gU1RBVEVfU1RPUFBFRCkgewotICAgICAgICAvLyBub3RpZnlMaXN0ZW5lcl9sKE1FRElBMl9TVE9QUEVEKTsKLSAgICB9Ci0KICAgICBtU3RhdGUgPSBTVEFURV9SRVNFVF9JTl9QUk9HUkVTUzsKICAgICBtUGxheWVyLT5yZXNldEFzeW5jKCk7CiAKQEAgLTYzMywzNCArNTg1LDMwIEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBOdVBsYXllcjJEcml2ZXI6Omludm9rZShjb25zdCBQYXJjZWwgJnJlcXVlc3QsIFBhcmNlbCAqcmVwbHkpIHsKLSAgICBpZiAocmVwbHkgPT0gTlVMTCkgeworc3RhdHVzX3QgTnVQbGF5ZXIyRHJpdmVyOjppbnZva2UoY29uc3QgUGxheWVyTWVzc2FnZSAmcmVxdWVzdCwgUGxheWVyTWVzc2FnZSAqcmVzcG9uc2UpIHsKKyAgICBpZiAocmVzcG9uc2UgPT0gTlVMTCkgewogICAgICAgICBBTE9HRSgicmVwbHkgaXMgYSBOVUxMIHBvaW50ZXIiKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKLSAgICBpbnQzMl90IG1ldGhvZElkOwotICAgIHN0YXR1c190IHJldCA9IHJlcXVlc3QucmVhZEludDMyKCZtZXRob2RJZCk7Ci0gICAgaWYgKHJldCAhPSBPSykgewotICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHJldHJpZXZlIHRoZSByZXF1ZXN0ZWQgbWV0aG9kIHRvIGludm9rZSwgZXJyKCVkKSIsIHJldCk7Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQorICAgIFJlcGVhdGVkUHRyRmllbGQ8Y29uc3QgVmFsdWU+Ojpjb25zdF9pdGVyYXRvciBpdCA9IHJlcXVlc3QudmFsdWVzKCkuY2JlZ2luKCk7CisgICAgaW50MzJfdCBtZXRob2RJZCA9IChpdCsrKS0+aW50MzJfdmFsdWUoKTsKIAogICAgIHN3aXRjaCAobWV0aG9kSWQpIHsKICAgICAgICAgY2FzZSBNRURJQV9QTEFZRVIyX0lOVk9LRV9JRF9TRVRfVklERU9fU0NBTElOR19NT0RFOgogICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgbW9kZSA9IHJlcXVlc3QucmVhZEludDMyKCk7CisgICAgICAgICAgICBpbnQgbW9kZSA9IChpdCsrKS0+aW50MzJfdmFsdWUoKTsKICAgICAgICAgICAgIHJldHVybiBtUGxheWVyLT5zZXRWaWRlb1NjYWxpbmdNb2RlKG1vZGUpOwogICAgICAgICB9CiAKICAgICAgICAgY2FzZSBNRURJQV9QTEFZRVIyX0lOVk9LRV9JRF9HRVRfVFJBQ0tfSU5GTzoKICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG1QbGF5ZXItPmdldFRyYWNrSW5mbyhyZXBseSk7CisgICAgICAgICAgICByZXR1cm4gbVBsYXllci0+Z2V0VHJhY2tJbmZvKHJlc3BvbnNlKTsKICAgICAgICAgfQogCiAgICAgICAgIGNhc2UgTUVESUFfUExBWUVSMl9JTlZPS0VfSURfU0VMRUNUX1RSQUNLOgogICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgdHJhY2tJbmRleCA9IHJlcXVlc3QucmVhZEludDMyKCk7CisgICAgICAgICAgICBpbnQgdHJhY2tJbmRleCA9IChpdCsrKS0+aW50MzJfdmFsdWUoKTsKICAgICAgICAgICAgIGludDY0X3QgbXNlYyA9IDA7CiAgICAgICAgICAgICAvLyBnZXRDdXJyZW50UG9zaXRpb24gc2hvdWxkIGFsd2F5cyByZXR1cm4gT0sKICAgICAgICAgICAgIGdldEN1cnJlbnRQb3NpdGlvbigmbXNlYyk7CkBAIC02NjksMTQgKzYxNywxNCBAQAogCiAgICAgICAgIGNhc2UgTUVESUFfUExBWUVSMl9JTlZPS0VfSURfVU5TRUxFQ1RfVFJBQ0s6CiAgICAgICAgIHsKLSAgICAgICAgICAgIGludCB0cmFja0luZGV4ID0gcmVxdWVzdC5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGludCB0cmFja0luZGV4ID0gKGl0KyspLT5pbnQzMl92YWx1ZSgpOwogICAgICAgICAgICAgcmV0dXJuIG1QbGF5ZXItPnNlbGVjdFRyYWNrKHRyYWNrSW5kZXgsIGZhbHNlIC8qIHNlbGVjdCAqLywgMHhkZWFkYmVlZiAvKiBub3QgdXNlZCAqLyk7CiAgICAgICAgIH0KIAogICAgICAgICBjYXNlIE1FRElBX1BMQVlFUjJfSU5WT0tFX0lEX0dFVF9TRUxFQ1RFRF9UUkFDSzoKICAgICAgICAgewotICAgICAgICAgICAgaW50MzJfdCB0eXBlID0gcmVxdWVzdC5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIHJldHVybiBtUGxheWVyLT5nZXRTZWxlY3RlZFRyYWNrKHR5cGUsIHJlcGx5KTsKKyAgICAgICAgICAgIGludDMyX3QgdHlwZSA9IChpdCsrKS0+aW50MzJfdmFsdWUoKTsKKyAgICAgICAgICAgIHJldHVybiBtUGxheWVyLT5nZXRTZWxlY3RlZFRyYWNrKHR5cGUsIHJlc3BvbnNlKTsKICAgICAgICAgfQogCiAgICAgICAgIGRlZmF1bHQ6CkBAIC03ODAsMjAgKzcyOCw3IEBACiAgICAgQUxPR1YoIm5vdGlmeVNlZWtDb21wbGV0ZSglcCkiLCB0aGlzKTsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogICAgIG1TZWVrSW5Qcm9ncmVzcyA9IGZhbHNlOwotICAgIG5vdGlmeVNlZWtDb21wbGV0ZV9sKHNyY0lkKTsKLX0KLQotdm9pZCBOdVBsYXllcjJEcml2ZXI6Om5vdGlmeVNlZWtDb21wbGV0ZV9sKGludDY0X3Qgc3JjSWQpIHsKLSAgICBib29sIHdhc1NlZWtpbmcgPSB0cnVlOwotICAgIGlmIChtU3RhdGUgPT0gU1RBVEVfU1RPUFBFRF9BTkRfUFJFUEFSSU5HKSB7Ci0gICAgICAgIHdhc1NlZWtpbmcgPSBmYWxzZTsKLSAgICAgICAgbVN0YXRlID0gU1RBVEVfU1RPUFBFRF9BTkRfUFJFUEFSRUQ7Ci0gICAgICAgIG1Db25kaXRpb24uYnJvYWRjYXN0KCk7Ci0gICAgfSBlbHNlIGlmIChtU3RhdGUgPT0gU1RBVEVfU1RPUFBFRCkgewotICAgICAgICAvLyBubyBuZWVkIHRvIG5vdGlmeSBsaXN0ZW5lcgotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIG5vdGlmeUxpc3RlbmVyX2woc3JjSWQsIHdhc1NlZWtpbmcgPyBNRURJQTJfU0VFS19DT01QTEVURSA6IE1FRElBMl9QUkVQQVJFRCk7CisgICAgbm90aWZ5TGlzdGVuZXJfbChzcmNJZCwgTUVESUEyX1NFRUtfQ09NUExFVEUpOwogfQogCiBzdGF0dXNfdCBOdVBsYXllcjJEcml2ZXI6OmR1bXAoCkBAIC04ODQsMTIgKzgxOSwxMiBAQAogICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoIm1lc3NhZ2VJZCIsICZtc2dJZCkpOwogICAgICAgICAgICAgbXNnLT5maW5kSW50MzIoImV4dDEiLCAmZXh0MSk7CiAgICAgICAgICAgICBtc2ctPmZpbmRJbnQzMigiZXh0MiIsICZleHQyKTsKLSAgICAgICAgICAgIHNwPFBhcmNlbFdyYXBwZXI+IGluOworICAgICAgICAgICAgc3A8UGxheWVyTWVzc2FnZVdyYXBwZXI+IGluOwogICAgICAgICAgICAgc3A8UmVmQmFzZT4gb2JqOwotICAgICAgICAgICAgaWYgKG1zZy0+ZmluZE9iamVjdCgicGFyY2VsIiwgJm9iaikgJiYgb2JqICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBpbiA9IHN0YXRpY19jYXN0PFBhcmNlbFdyYXBwZXIgKj4ob2JqLmdldCgpKTsKKyAgICAgICAgICAgIGlmIChtc2ctPmZpbmRPYmplY3QoIm9iaiIsICZvYmopICYmIG9iaiAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgaW4gPSBzdGF0aWNfY2FzdDxQbGF5ZXJNZXNzYWdlV3JhcHBlciAqPihvYmouZ2V0KCkpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc2VuZEV2ZW50KHNyY0lkLCBtc2dJZCwgZXh0MSwgZXh0MiwgKGluID09IE5VTEwgPyBOVUxMIDogaW4tPmdldFBhcmNlbCgpKSk7CisgICAgICAgICAgICBzZW5kRXZlbnQoc3JjSWQsIG1zZ0lkLCBleHQxLCBleHQyLCAoaW4gPT0gTlVMTCA/IE5VTEwgOiBpbi0+Z2V0UGxheWVyTWVzc2FnZSgpKSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBkZWZhdWx0OgpAQCAtODk4LDE2ICs4MzMsMTYgQEAKIH0KIAogdm9pZCBOdVBsYXllcjJEcml2ZXI6Om5vdGlmeUxpc3RlbmVyKAotICAgICAgICBpbnQ2NF90IHNyY0lkLCBpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIsIGNvbnN0IFBhcmNlbCAqaW4pIHsKKyAgICAgICAgaW50NjRfdCBzcmNJZCwgaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyLCBjb25zdCBQbGF5ZXJNZXNzYWdlICppbikgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAgICAgbm90aWZ5TGlzdGVuZXJfbChzcmNJZCwgbXNnLCBleHQxLCBleHQyLCBpbik7CiB9CiAKIHZvaWQgTnVQbGF5ZXIyRHJpdmVyOjpub3RpZnlMaXN0ZW5lcl9sKAotICAgICAgICBpbnQ2NF90IHNyY0lkLCBpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIsIGNvbnN0IFBhcmNlbCAqaW4pIHsKKyAgICAgICAgaW50NjRfdCBzcmNJZCwgaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyLCBjb25zdCBQbGF5ZXJNZXNzYWdlICppbikgewogICAgIEFMT0dEKCJub3RpZnlMaXN0ZW5lcl9sKCVwKSwgKCVsbGQsICVkLCAlZCwgJWQsICVkKSwgbG9vcCBzZXR0aW5nKCVkLCAlZCkiLAogICAgICAgICAgICAgdGhpcywgKGxvbmcgbG9uZylzcmNJZCwgbXNnLCBleHQxLCBleHQyLAotICAgICAgICAgICAgKGluID09IE5VTEwgPyAtMSA6IChpbnQpaW4tPmRhdGFTaXplKCkpLCBtQXV0b0xvb3AsIG1Mb29waW5nKTsKKyAgICAgICAgICAgIChpbiA9PSBOVUxMID8gLTEgOiAoaW50KWluLT5CeXRlU2l6ZSgpKSwgbUF1dG9Mb29wLCBtTG9vcGluZyk7CiAgICAgaWYgKHNyY0lkID09IG1TcmNJZCkgewogICAgICAgICBzd2l0Y2ggKG1zZykgewogICAgICAgICAgICAgY2FzZSBNRURJQTJfUExBWUJBQ0tfQ09NUExFVEU6CkBAIC05MjQsMTMgKzg1OSwxOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGlmIChtTG9vcGluZyB8fCBtQXV0b0xvb3ApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1QbGF5ZXItPnNlZWtUb0FzeW5jKDApOworICAgICAgICAgICAgICAgICAgICAgICAgbVBsYXllci0+cmV3aW5kKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUF1ZGlvU2luayAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHJlbmRlcmVyIGhhcyBzdG9wcGVkIHRoZSBzaW5rIGF0IHRoZSBlbmQgaW4gb3JkZXIgdG8gcGxheSBvdXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbGFzdCBsaXR0bGUgYml0IG9mIGF1ZGlvLiBJbiBsb29waW5nIG1vZGUsIHdlIG5lZWQgdG8gcmVzdGFydCBpdC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQXVkaW9TaW5rLT5zdGFydCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9uJ3Qgc2VuZCBjb21wbGV0aW9uIGV2ZW50IHdoZW4gbG9vcGluZworCisgICAgICAgICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbmV3IEFNZXNzYWdlKGtXaGF0Tm90aWZ5TGlzdGVuZXIsIHRoaXMpOworICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQ2NCgic3JjSWQiLCBzcmNJZCk7CisgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJtZXNzYWdlSWQiLCBNRURJQTJfSU5GTyk7CisgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJleHQxIiwgTUVESUEyX0lORk9fREFUQV9TT1VSQ0VfUkVQRUFUKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+cG9zdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eV9nZXRfYm9vbCgicGVyc2lzdC5kZWJ1Zy5zZi5zdGF0cyIsIGZhbHNlKSkgewpAQCAtOTY5LDcgKzkwOSw3IEBACiAgICAgbm90aWZ5LT5zZXRJbnQzMigibWVzc2FnZUlkIiwgbXNnKTsKICAgICBub3RpZnktPnNldEludDMyKCJleHQxIiwgZXh0MSk7CiAgICAgbm90aWZ5LT5zZXRJbnQzMigiZXh0MiIsIGV4dDIpOwotICAgIG5vdGlmeS0+c2V0T2JqZWN0KCJwYXJjZWwiLCBQYXJjZWxXcmFwcGVyOjpDcmVhdGUoaW4pKTsKKyAgICBub3RpZnktPnNldE9iamVjdCgib2JqIiwgUGxheWVyTWVzc2FnZVdyYXBwZXI6OkNyZWF0ZSgoUGxheWVyTWVzc2FnZSopaW4pKTsKICAgICBub3RpZnktPnBvc3QoKTsKIH0KIApAQCAtMTA3Myw5ICsxMDEzLDYgQEAKICAgICAgICAgY2FzZSBTVEFURV9SVU5OSU5HOiBydmFsID0gIlJVTk5JTkciOyBicmVhazsKICAgICAgICAgY2FzZSBTVEFURV9QQVVTRUQ6IHJ2YWwgPSAiUEFVU0VEIjsgYnJlYWs7CiAgICAgICAgIGNhc2UgU1RBVEVfUkVTRVRfSU5fUFJPR1JFU1M6IHJ2YWwgPSAiUkVTRVRfSU5fUFJPR1JFU1MiOyBicmVhazsKLSAgICAgICAgY2FzZSBTVEFURV9TVE9QUEVEOiBydmFsID0gIlNUT1BQRUQiOyBicmVhazsKLSAgICAgICAgY2FzZSBTVEFURV9TVE9QUEVEX0FORF9QUkVQQVJJTkc6IHJ2YWwgPSAiU1RPUFBFRF9BTkRfUFJFUEFSSU5HIjsgYnJlYWs7Ci0gICAgICAgIGNhc2UgU1RBVEVfU1RPUFBFRF9BTkRfUFJFUEFSRUQ6IHJ2YWwgPSAiU1RPUFBFRF9BTkRfUFJFUEFSRUQiOyBicmVhazsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIC8vIHllcywgdGhpcyBidWZmZXIgaXMgc2hhcmVkIGFuZCB2dWxuZXJhYmxlIHRvIHJhY2VzCiAgICAgICAgICAgICBzbnByaW50ZihyYXdidWZmZXIsIHNpemVvZihyYXdidWZmZXIpLCAiJWQiLCBzdGF0ZSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkRyaXZlci5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJEcml2ZXIuaAppbmRleCA0ZGEyNTY2Li41MGVlMTczIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkRyaXZlci5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyRHJpdmVyLmgKQEAgLTQwLDMxICs0MCwzMSBAQAogICAgICAgICAgICAgQnVmZmVyaW5nU2V0dGluZ3MqIGJ1ZmZlcmluZyAvKiBub25udWxsICovKSBvdmVycmlkZTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldEJ1ZmZlcmluZ1NldHRpbmdzKGNvbnN0IEJ1ZmZlcmluZ1NldHRpbmdzJiBidWZmZXJpbmcpIG92ZXJyaWRlOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBwcmVwYXJlQXN5bmMoKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBwYXVzZSgpOwotICAgIHZpcnR1YWwgYm9vbCBpc1BsYXlpbmcoKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBsYXliYWNrU2V0dGluZ3MoY29uc3QgQXVkaW9QbGF5YmFja1JhdGUgJnJhdGUpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UGxheWJhY2tTZXR0aW5ncyhBdWRpb1BsYXliYWNrUmF0ZSAqcmF0ZSk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRTeW5jU2V0dGluZ3MoY29uc3QgQVZTeW5jU2V0dGluZ3MgJnN5bmMsIGZsb2F0IHZpZGVvRnBzSGludCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTeW5jU2V0dGluZ3MoQVZTeW5jU2V0dGluZ3MgKnN5bmMsIGZsb2F0ICp2aWRlb0Zwcyk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBwcmVwYXJlQXN5bmMoKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGF0dXNfdCBwYXVzZSgpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgYm9vbCBpc1BsYXlpbmcoKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBsYXliYWNrU2V0dGluZ3MoY29uc3QgQXVkaW9QbGF5YmFja1JhdGUgJnJhdGUpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UGxheWJhY2tTZXR0aW5ncyhBdWRpb1BsYXliYWNrUmF0ZSAqcmF0ZSkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRTeW5jU2V0dGluZ3MoY29uc3QgQVZTeW5jU2V0dGluZ3MgJnN5bmMsIGZsb2F0IHZpZGVvRnBzSGludCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTeW5jU2V0dGluZ3MoQVZTeW5jU2V0dGluZ3MgKnN5bmMsIGZsb2F0ICp2aWRlb0Zwcykgb3ZlcnJpZGU7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZWVrVG8oCi0gICAgICAgICAgICBpbnQ2NF90IG1zZWMsIE1lZGlhUGxheWVyMlNlZWtNb2RlIG1vZGUgPSBNZWRpYVBsYXllcjJTZWVrTW9kZTo6U0VFS19QUkVWSU9VU19TWU5DKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEN1cnJlbnRQb3NpdGlvbihpbnQ2NF90ICptc2VjKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldER1cmF0aW9uKGludDY0X3QgKm1zZWMpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVzZXQoKTsKKyAgICAgICAgICAgIGludDY0X3QgbXNlYywKKyAgICAgICAgICAgIE1lZGlhUGxheWVyMlNlZWtNb2RlIG1vZGUgPSBNZWRpYVBsYXllcjJTZWVrTW9kZTo6U0VFS19QUkVWSU9VU19TWU5DKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEN1cnJlbnRQb3NpdGlvbihpbnQ2NF90ICptc2VjKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldER1cmF0aW9uKGludDY0X3QgKm1zZWMpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVzZXQoKSBvdmVycmlkZTsKICAgICB2aXJ0dWFsIHN0YXR1c190IG5vdGlmeUF0KGludDY0X3QgbWVkaWFUaW1lVXMpIG92ZXJyaWRlOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TG9vcGluZyhpbnQgbG9vcCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBpbnZva2UoY29uc3QgUGFyY2VsICZyZXF1ZXN0LCBQYXJjZWwgKnJlcGx5KTsKLSAgICB2aXJ0dWFsIHZvaWQgc2V0QXVkaW9TaW5rKGNvbnN0IHNwPEF1ZGlvU2luaz4gJmF1ZGlvU2luayk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQYXJhbWV0ZXIoaW50IGtleSwgY29uc3QgUGFyY2VsICZyZXF1ZXN0KTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFBhcmFtZXRlcihpbnQga2V5LCBQYXJjZWwgKnJlcGx5KTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldExvb3BpbmcoaW50IGxvb3ApIG92ZXJyaWRlOworICAgIHZpcnR1YWwgc3RhdHVzX3QgaW52b2tlKGNvbnN0IFBsYXllck1lc3NhZ2UgJnJlcXVlc3QsIFBsYXllck1lc3NhZ2UgKnJlc3BvbnNlKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0QXVkaW9TaW5rKGNvbnN0IHNwPEF1ZGlvU2luaz4gJmF1ZGlvU2luaykgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQYXJhbWV0ZXIoaW50IGtleSwgY29uc3QgUGFyY2VsICZyZXF1ZXN0KSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFBhcmFtZXRlcihpbnQga2V5LCBQYXJjZWwgKnJlcGx5KSBvdmVycmlkZTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWV0YWRhdGEoCi0gICAgICAgICAgICBjb25zdCBtZWRpYTo6TWV0YWRhdGE6OkZpbHRlciYgaWRzLCBQYXJjZWwgKnJlY29yZHMpOworICAgICAgICAgICAgY29uc3QgbWVkaWE6Ok1ldGFkYXRhOjpGaWx0ZXImIGlkcywgUGFyY2VsICpyZWNvcmRzKSBvdmVycmlkZTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4gJmFyZ3MpIGNvbnN0OworICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4gJmFyZ3MpIGNvbnN0IG92ZXJyaWRlOwogCiAgICAgdmlydHVhbCB2b2lkIG9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSBvdmVycmlkZTsKIApAQCAtNzcsOSArNzcsOCBAQAogICAgIHZvaWQgbm90aWZ5TW9yZVJlYnVmZmVyaW5nVGltZVVzKGludDY0X3Qgc3JjSWQsIGludDY0X3QgdGltZVVzKTsKICAgICB2b2lkIG5vdGlmeVJlYnVmZmVyaW5nV2hlbkV4aXQoaW50NjRfdCBzcmNJZCwgYm9vbCBzdGF0dXMpOwogICAgIHZvaWQgbm90aWZ5U2Vla0NvbXBsZXRlKGludDY0X3Qgc3JjSWQpOwotICAgIHZvaWQgbm90aWZ5U2Vla0NvbXBsZXRlX2woaW50NjRfdCBzcmNJZCk7CiAgICAgdm9pZCBub3RpZnlMaXN0ZW5lcihpbnQ2NF90IHNyY0lkLCBpbnQgbXNnLCBpbnQgZXh0MSA9IDAsIGludCBleHQyID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhcmNlbCAqaW4gPSBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBsYXllck1lc3NhZ2UgKmluID0gTlVMTCk7CiAgICAgdm9pZCBub3RpZnlGbGFnc0NoYW5nZWQoaW50NjRfdCBzcmNJZCwgdWludDMyX3QgZmxhZ3MpOwogCiAgICAgLy8gTW9kdWxhciBEUk0KQEAgLTk5LDkgKzk4LDYgQEAKICAgICAgICAgU1RBVEVfUlVOTklORywKICAgICAgICAgU1RBVEVfUEFVU0VELAogICAgICAgICBTVEFURV9SRVNFVF9JTl9QUk9HUkVTUywKLSAgICAgICAgU1RBVEVfU1RPUFBFRCwgICAgICAgICAgICAgICAgICAvLyBlcXVpdmFsZW50IHRvIFBBVVNFRAotICAgICAgICBTVEFURV9TVE9QUEVEX0FORF9QUkVQQVJJTkcsICAgIC8vIGVxdWl2YWxlbnQgdG8gUEFVU0VELCBidXQgc2Vla2luZwotICAgICAgICBTVEFURV9TVE9QUEVEX0FORF9QUkVQQVJFRCwgICAgIC8vIGVxdWl2YWxlbnQgdG8gUEFVU0VELCBidXQgc2VlayBjb21wbGV0ZQogICAgIH07CiAKICAgICBzdGQ6OnN0cmluZyBzdGF0ZVN0cmluZyhTdGF0ZSBzdGF0ZSk7CkBAIC0xNDksNyArMTQ1LDcgQEAKIAogICAgIHN0YXR1c190IHN0YXJ0X2woKTsKICAgICB2b2lkIG5vdGlmeUxpc3RlbmVyX2woaW50NjRfdCBzcmNJZCwgaW50IG1zZywgaW50IGV4dDEgPSAwLCBpbnQgZXh0MiA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhcmNlbCAqaW4gPSBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGxheWVyTWVzc2FnZSAqaW4gPSBOVUxMKTsKIAogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKE51UGxheWVyMkRyaXZlcik7CiB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJEcm0uY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJEcm0uY3BwCmluZGV4IDBlMDk2YjAuLmY0MWE0MzEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyRHJtLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkRybS5jcHAKQEAgLTEzMyw5ICsxMzMsOCBAQAogICAgIHJldHVybiBkcm1JbmZvQnVmZmVyOwogfQogCi1zcDxBQnVmZmVyPiBOdVBsYXllcjJEcm06OnJldHJpZXZlRHJtSW5mbyhQc3NoSW5mbyAqcHNzaEluZm8pCitzdGF0dXNfdCBOdVBsYXllcjJEcm06OnJldHJpZXZlRHJtSW5mbyhQc3NoSW5mbyAqcHNzaEluZm8sIFBsYXllck1lc3NhZ2UgKnBsYXllck1zZykKIHsKLQogICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBwc3NoLCBkcm1JbmZvOwogCiAgICAgLy8gMCkgR2VuZXJhdGUgUFNTSCBieXRlcwpAQCAtMTU0LDIyICsxNTMsMjAgQEAKICAgICAgICAgICAgIERybVVVSUQ6OmFycmF5VG9IZXgocHNzaFB0ciwgcHNzaFNpemUpLnN0cmluZygpKTsKIAogICAgIC8vIDEpIFdyaXRlIFBTU0ggYnl0ZXMKLSAgICBkcm1JbmZvLndyaXRlKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhciAqPigmcHNzaFNpemUpLCBzaXplb2YocHNzaFNpemUpKTsKLSAgICBkcm1JbmZvLndyaXRlKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhciAqPihwc3NoLnN0cigpLmNfc3RyKCkpLCBwc3NoU2l6ZSk7CisgICAgcGxheWVyTXNnLT5hZGRfdmFsdWVzKCktPnNldF9ieXRlc192YWx1ZSgKKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhciAqPihwc3NoLnN0cigpLmNfc3RyKCkpLCBwc3NoU2l6ZSk7CiAKICAgICAvLyAyKSBXcml0ZSBzdXBwb3J0ZWREUk1zCiAgICAgdWludDMyX3QgbnVtZW50cmllcyA9IHBzc2hJbmZvLT5udW1lbnRyaWVzOwotICAgIGRybUluZm8ud3JpdGUocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyICo+KCZudW1lbnRyaWVzKSwgc2l6ZW9mKG51bWVudHJpZXMpKTsKKyAgICBwbGF5ZXJNc2ctPmFkZF92YWx1ZXMoKS0+c2V0X2ludDMyX3ZhbHVlKG51bWVudHJpZXMpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtZW50cmllczsgaSsrKSB7CiAgICAgICAgIFBzc2hFbnRyeSAqZW50cnkgPSAmcHNzaEluZm8tPmVudHJpZXNbaV07Ci0gICAgICAgIGRybUluZm8ud3JpdGUocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyICo+KCZlbnRyeS0+dXVpZCksIHNpemVvZihlbnRyeS0+dXVpZCkpOworICAgICAgICBwbGF5ZXJNc2ctPmFkZF92YWx1ZXMoKS0+c2V0X2J5dGVzX3ZhbHVlKAorICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhciAqPigmZW50cnktPnV1aWQpLCBzaXplb2YoZW50cnktPnV1aWQpKTsKICAgICAgICAgQUxPR1YoInJldHJpZXZlRHJtSW5mbzogTUVESUFfRFJNX0lORk8gIHN1cHBvcnRlZFNjaGVtZVslenVdICVzIiwgaSwKICAgICAgICAgICAgICAgICBEcm1VVUlEOjphcnJheVRvSGV4KChjb25zdCB1aW50OF90KikmZW50cnktPnV1aWQsIHNpemVvZihBTWVkaWFVVUlEKSkuc3RyaW5nKCkpOwogICAgIH0KLQotICAgIHNwPEFCdWZmZXI+IGRybUluZm9CdWYgPSBBQnVmZmVyOjpDcmVhdGVBc0NvcHkoZHJtSW5mby5zdHIoKS5jX3N0cigpLCBkcm1JbmZvLnRlbGxwKCkpOwotICAgIGRybUluZm9CdWYtPnNldFJhbmdlKDAsIGRybUluZm8udGVsbHAoKSk7Ci0gICAgcmV0dXJuIGRybUluZm9CdWY7CisgICAgcmV0dXJuIE9LOwogfQogCiB9ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyRHJtLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkRybS5oCmluZGV4IDk5ZDI0MTUuLjk2OGQxYmUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyRHJtLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJEcm0uaApAQCAtMjMsNiArMjMsMTAgQEAKICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CiAKKyNpbmNsdWRlICJtZWRpYXBsYXllcjIucGIuaCIKKwordXNpbmcgYW5kcm9pZDo6bWVkaWE6Ok1lZGlhUGxheWVyMlByb3RvOjpQbGF5ZXJNZXNzYWdlOworCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKICAgICBzdHJ1Y3QgRHJtVVVJRCB7CkBAIC04MCw3ICs4NCw3IEBACiAKICAgICBwdWJsaWM6CiAgICAgICAgIHN0YXRpYyBzcDxBQnVmZmVyPiByZXRyaWV2ZURybUluZm8oY29uc3Qgdm9pZCAqcHNzaCwgdWludDMyX3QgcHNzaHNpemUpOwotICAgICAgICBzdGF0aWMgc3A8QUJ1ZmZlcj4gcmV0cmlldmVEcm1JbmZvKFBzc2hJbmZvICopOworICAgICAgICBzdGF0aWMgc3RhdHVzX3QgcmV0cmlldmVEcm1JbmZvKFBzc2hJbmZvICosIFBsYXllck1lc3NhZ2UgKik7CiAKICAgICB9OyAgLy8gTnVQbGF5ZXIyRHJtCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyUmVuZGVyZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJSZW5kZXJlci5jcHAKaW5kZXggYTBiZDkwMC4uZDgwMDQxMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJSZW5kZXJlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJSZW5kZXJlci5jcHAKQEAgLTExNSw3ICsxMTUsNyBAQAogICAgICAgbU5vdGlmeUNvbXBsZXRlQXVkaW8oZmFsc2UpLAogICAgICAgbU5vdGlmeUNvbXBsZXRlVmlkZW8oZmFsc2UpLAogICAgICAgbVN5bmNRdWV1ZXMoZmFsc2UpLAotICAgICAgbVBhdXNlZChmYWxzZSksCisgICAgICBtUGF1c2VkKHRydWUpLAogICAgICAgbVBhdXNlRHJhaW5BdWRpb0FsbG93ZWRVcygwKSwKICAgICAgIG1WaWRlb1NhbXBsZVJlY2VpdmVkKGZhbHNlKSwKICAgICAgIG1WaWRlb1JlbmRlcmluZ1N0YXJ0ZWQoZmFsc2UpLApAQCAtMTMzLDggKzEzMyw3IEBACiAgICAgICBtVXNlQXVkaW9DYWxsYmFjayhmYWxzZSksCiAgICAgICBtV2FrZUxvY2sobmV3IEpXYWtlTG9jaygpKSB7CiAgICAgQ0hFQ0sobWVkaWFDbG9jayAhPSBOVUxMKTsKLSAgICBtUGxheWJhY2tSYXRlID0gbVBsYXliYWNrU2V0dGluZ3MubVNwZWVkOwotICAgIG1NZWRpYUNsb2NrLT5zZXRQbGF5YmFja1JhdGUobVBsYXliYWNrUmF0ZSk7CisgICAgbU1lZGlhQ2xvY2stPnNldFBsYXliYWNrUmF0ZShtUGxheWJhY2tTZXR0aW5ncy5tU3BlZWQpOwogfQogCiBOdVBsYXllcjI6OlJlbmRlcmVyOjp+UmVuZGVyZXIoKSB7CkBAIC0xOTAsMjYgKzE4OSwyMCBAQAogfQogCiBzdGF0dXNfdCBOdVBsYXllcjI6OlJlbmRlcmVyOjpvbkNvbmZpZ1BsYXliYWNrKGNvbnN0IEF1ZGlvUGxheWJhY2tSYXRlICZyYXRlIC8qIHNhbml0aXplZCAqLykgewotICAgIGlmIChyYXRlLm1TcGVlZCA9PSAwLmYpIHsKLSAgICAgICAgb25QYXVzZSgpOwotICAgICAgICAvLyBkb24ndCBjYWxsIGF1ZGlvc2luaydzIHNldFBsYXliYWNrUmF0ZSBpZiBwYXVzaW5nLCBhcyBwaXRjaCBkb2VzIG5vdAotICAgICAgICAvLyBoYXZlIHRvIGNvcnJlc3BvbmQgdG8gdGhlIGFueSBub24tMCBzcGVlZCAoZS5nIG9sZCBzcGVlZCkuIEtlZXAKLSAgICAgICAgLy8gc2V0dGluZ3Mgbm9uZXRoZWxlc3MsIHVzaW5nIHRoZSBvbGQgc3BlZWQsIGluIGNhc2UgYXVkaW9zaW5rIGNoYW5nZXMuCi0gICAgICAgIEF1ZGlvUGxheWJhY2tSYXRlIG5ld1JhdGUgPSByYXRlOwotICAgICAgICBuZXdSYXRlLm1TcGVlZCA9IG1QbGF5YmFja1NldHRpbmdzLm1TcGVlZDsKLSAgICAgICAgbVBsYXliYWNrU2V0dGluZ3MgPSBuZXdSYXRlOwotICAgICAgICByZXR1cm4gT0s7CisgICAgaWYgKHJhdGUubVNwZWVkIDw9IDAuZikgeworICAgICAgICBBTE9HVygicGxheWJhY2sgcmF0ZSBjYW5ub3QgYmUgJWYiLCByYXRlLm1TcGVlZCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCiAgICAgaWYgKG1BdWRpb1NpbmsgIT0gTlVMTCAmJiBtQXVkaW9TaW5rLT5yZWFkeSgpKSB7CiAgICAgICAgIHN0YXR1c190IGVyciA9IG1BdWRpb1NpbmstPnNldFBsYXliYWNrUmF0ZShyYXRlKTsKICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgQUxPR1coImZhaWxlZCB0byBnZXQgcGxheWJhY2sgcmF0ZSBmcm9tIGF1ZGlvIHNpbmssIGVyciglZCkiLCBlcnIpOwogICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgfQogICAgIH0KICAgICBtUGxheWJhY2tTZXR0aW5ncyA9IHJhdGU7Ci0gICAgbVBsYXliYWNrUmF0ZSA9IHJhdGUubVNwZWVkOwotICAgIG1NZWRpYUNsb2NrLT5zZXRQbGF5YmFja1JhdGUobVBsYXliYWNrUmF0ZSk7CisgICAgbU1lZGlhQ2xvY2stPnNldFBsYXliYWNrUmF0ZShtUGxheWJhY2tTZXR0aW5ncy5tU3BlZWQpOwogICAgIHJldHVybiBPSzsKIH0KIApAQCAtMjMxLDE0ICsyMjQsMTIgQEAKICAgICAgICAgc3RhdHVzX3QgZXJyID0gbUF1ZGlvU2luay0+Z2V0UGxheWJhY2tSYXRlKHJhdGUpOwogICAgICAgICBpZiAoZXJyID09IE9LKSB7CiAgICAgICAgICAgICBpZiAoIWlzQXVkaW9QbGF5YmFja1JhdGVFcXVhbCgqcmF0ZSwgbVBsYXliYWNrU2V0dGluZ3MpKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coImNvcnJlY3RpbmcgbWlzbWF0Y2ggaW4gaW50ZXJuYWwvZXh0ZXJuYWwgcGxheWJhY2sgcmF0ZSIpOworICAgICAgICAgICAgICAgIEFMT0dXKCJjb3JyZWN0aW5nIG1pc21hdGNoIGluIGludGVybmFsL2V4dGVybmFsIHBsYXliYWNrIHJhdGUsICVmIHZzICVmIiwKKyAgICAgICAgICAgICAgICAgICAgICByYXRlLT5tU3BlZWQsIG1QbGF5YmFja1NldHRpbmdzLm1TcGVlZCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBnZXQgcGxheWJhY2sgc2V0dGluZ3MgdXNlZCBieSBhdWRpb3NpbmssIGFzIGl0IG1heSBiZQogICAgICAgICAgICAgLy8gc2xpZ2h0bHkgb2ZmIGR1ZSB0byBhdWRpb3Npbmsgbm90IHRha2luZyBzbWFsbCBjaGFuZ2VzLgogICAgICAgICAgICAgbVBsYXliYWNrU2V0dGluZ3MgPSAqcmF0ZTsKLSAgICAgICAgICAgIGlmIChtUGF1c2VkKSB7Ci0gICAgICAgICAgICAgICAgcmF0ZS0+bVNwZWVkID0gMC5mOwotICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHJldHVybiBlcnI7CiAgICAgfQpAQCAtNTYwLDggKzU1MSw4IEBACiAgICAgICAgICAgICAgICAgaW50NjRfdCBkZWxheVVzID0KICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvU2luay0+bXNlY3NQZXJGcmFtZSgpCiAgICAgICAgICAgICAgICAgICAgICAgICAqIG51bUZyYW1lc1BlbmRpbmdQbGF5b3V0ICogMTAwMGxsOwotICAgICAgICAgICAgICAgIGlmIChtUGxheWJhY2tSYXRlID4gMS4wZikgewotICAgICAgICAgICAgICAgICAgICBkZWxheVVzIC89IG1QbGF5YmFja1JhdGU7CisgICAgICAgICAgICAgICAgaWYgKG1QbGF5YmFja1NldHRpbmdzLm1TcGVlZCA+IDEuMGYpIHsKKyAgICAgICAgICAgICAgICAgICAgZGVsYXlVcyAvPSBtUGxheWJhY2tTZXR0aW5ncy5tU3BlZWQ7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgLy8gTGV0J3MgZ2l2ZSBpdCBtb3JlIGRhdGEgYWZ0ZXIgYWJvdXQgaGFsZiB0aGF0IHRpbWUKQEAgLTE1NzMsNiArMTU2NCw3IEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBub3RpZnlDb21wbGV0ZSA9IG1Ob3RpZnlDb21wbGV0ZVZpZGVvOwogICAgICAgICAgICAgbU5vdGlmeUNvbXBsZXRlVmlkZW8gPSBmYWxzZTsKKyAgICAgICAgICAgIG1WaWRlb1JlbmRlcmluZ1N0YXJ0ZWQgPSBmYWxzZTsKICAgICAgICAgfQogCiAgICAgICAgIC8vIElmIHdlJ3JlIGN1cnJlbnRseSBzeW5jaW5nIHRoZSBxdWV1ZXMsIGkuZS4gZHJvcHBpbmcgYXVkaW8gd2hpbGUKQEAgLTE3NzMsNyArMTc2NSw3IEBACiAgICAgICAgICAgICBtQXVkaW9TaW5rLT5zZXRQbGF5YmFja1JhdGUobVBsYXliYWNrU2V0dGluZ3MpOwogICAgICAgICB9CiAKLSAgICAgICAgbU1lZGlhQ2xvY2stPnNldFBsYXliYWNrUmF0ZShtUGxheWJhY2tSYXRlKTsKKyAgICAgICAgbU1lZGlhQ2xvY2stPnNldFBsYXliYWNrUmF0ZShtUGxheWJhY2tTZXR0aW5ncy5tU3BlZWQpOwogCiAgICAgICAgIGlmICghbUF1ZGlvUXVldWUuZW1wdHkoKSkgewogICAgICAgICAgICAgcG9zdERyYWluQXVkaW9RdWV1ZV9sKCk7CkBAIC0xODU3LDYgKzE4NDksNyBAQAogICAgICAgICBib29sIGlzU3RyZWFtaW5nKSB7CiAgICAgQUxPR1YoIm9wZW5BdWRpb1Npbms6IG9mZmxvYWRPbmx5KCVkKSBvZmZsb2FkaW5nQXVkaW8oJWQpIiwKICAgICAgICAgICAgIG9mZmxvYWRPbmx5LCBvZmZsb2FkaW5nQXVkaW8oKSk7CisKICAgICBib29sIGF1ZGlvU2lua0NoYW5nZWQgPSBmYWxzZTsKIAogICAgIGludDMyX3QgbnVtQ2hhbm5lbHM7CkBAIC0xOTI4LDcgKzE5MjEsNiBAQAogICAgICAgICAgICAgICAgICAgICBudW1DaGFubmVscywKICAgICAgICAgICAgICAgICAgICAgKGF1ZGlvX2NoYW5uZWxfbWFza190KWNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICBhdWRpb0Zvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgMCAvKiBidWZmZXJDb3VudCAtIHVudXNlZCAqLywKICAgICAgICAgICAgICAgICAgICAgJk51UGxheWVyMjo6UmVuZGVyZXI6OkF1ZGlvU2lua0NhbGxiYWNrLAogICAgICAgICAgICAgICAgICAgICB0aGlzLAogICAgICAgICAgICAgICAgICAgICAoYXVkaW9fb3V0cHV0X2ZsYWdzX3Qpb2ZmbG9hZEZsYWdzLApAQCAtMTk5OSwxMyArMTk5MSw2IEBACiAgICAgICAgIGNvbnN0IHVpbnQzMl90IGZyYW1lQ291bnQgPQogICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpc2FtcGxlUmF0ZSAqIGdldEF1ZGlvU2lua1BjbU1zU2V0dGluZygpIC8gMTAwMDsKIAotICAgICAgICAvLyBUaGUgZG9Ob3RSZWNvbm5lY3QgbWVhbnMgQXVkaW9TaW5rIHdpbGwgc2lnbmFsIGJhY2sgYW5kIGxldCBOdVBsYXllcjIgdG8gcmUtY29uc3RydWN0Ci0gICAgICAgIC8vIEF1ZGlvU2luay4gV2UgZG9uJ3Qgd2FudCB0aGlzIHdoZW4gdGhlcmUncyB2aWRlbyBiZWNhdXNlIGl0IHdpbGwgY2F1c2UgYSB2aWRlbyBzZWVrIHRvCi0gICAgICAgIC8vIHRoZSBwcmV2aW91cyBJIGZyYW1lLiBCdXQgd2UgZG8gd2FudCB0aGlzIHdoZW4gdGhlcmUncyBvbmx5IGF1ZGlvIGJlY2F1c2UgaXQgd2lsbCBnaXZlCi0gICAgICAgIC8vIE51UGxheWVyMiBhIGNoYW5jZSB0byBzd2l0Y2ggZnJvbSBub24tb2ZmbG9hZCBtb2RlIHRvIG9mZmxvYWQgbW9kZS4KLSAgICAgICAgLy8gU28gd2Ugb25seSBzZXQgZG9Ob3RSZWNvbm5lY3Qgd2hlbiB0aGVyZSdzIG5vIHZpZGVvLgotICAgICAgICBjb25zdCBib29sIGRvTm90UmVjb25uZWN0ID0gIWhhc1ZpZGVvOwotCiAgICAgICAgIC8vIFdlIHNob3VsZCBhbHdheXMgYmUgYWJsZSB0byBzZXQgb3VyIHBsYXliYWNrIHNldHRpbmdzIGlmIHRoZSBzaW5rIGlzIGNsb3NlZC4KICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihtQXVkaW9TaW5rLT5zZXRQbGF5YmFja1JhdGUobVBsYXliYWNrU2V0dGluZ3MpICE9IE9LLAogICAgICAgICAgICAgICAgICJvbk9wZW5BdWRpb1Npbms6IGNhbid0IHNldCBwbGF5YmFjayByYXRlIG9uIGNsb3NlZCBzaW5rIik7CkBAIC0yMDE0LDEyICsxOTk5LDEwIEBACiAgICAgICAgICAgICAgICAgICAgIG51bUNoYW5uZWxzLAogICAgICAgICAgICAgICAgICAgICAoYXVkaW9fY2hhbm5lbF9tYXNrX3QpY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULAotICAgICAgICAgICAgICAgICAgICAwIC8qIGJ1ZmZlckNvdW50IC0gdW51c2VkICovLAogICAgICAgICAgICAgICAgICAgICBtVXNlQXVkaW9DYWxsYmFjayA/ICZOdVBsYXllcjI6OlJlbmRlcmVyOjpBdWRpb1NpbmtDYWxsYmFjayA6IE5VTEwsCiAgICAgICAgICAgICAgICAgICAgIG1Vc2VBdWRpb0NhbGxiYWNrID8gdGhpcyA6IE5VTEwsCiAgICAgICAgICAgICAgICAgICAgIChhdWRpb19vdXRwdXRfZmxhZ3NfdClwY21GbGFncywKICAgICAgICAgICAgICAgICAgICAgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgZG9Ob3RSZWNvbm5lY3QsCiAgICAgICAgICAgICAgICAgICAgIGZyYW1lQ291bnQpOwogICAgICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgICAgICBBTE9HVygib3BlbkF1ZGlvU2luazogbm9uIG9mZmxvYWRlZCBvcGVuIGZhaWxlZCBzdGF0dXM6ICVkIiwgZXJyKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyUmVuZGVyZXIuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyUmVuZGVyZXIuaAppbmRleCA2MmNmMGQ4Li4zMDVhZjY4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMlJlbmRlcmVyLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJSZW5kZXJlci5oCkBAIC0xNjcsNyArMTY3LDYgQEAKICAgICBpbnQzMl90IG1BdWRpb0VPU0dlbmVyYXRpb247CiAKICAgICBjb25zdCBzcDxNZWRpYUNsb2NrPiBtTWVkaWFDbG9jazsKLSAgICBmbG9hdCBtUGxheWJhY2tSYXRlOyAvLyBhdWRpbyB0cmFjayByYXRlCiAKICAgICBBdWRpb1BsYXliYWNrUmF0ZSBtUGxheWJhY2tTZXR0aW5nczsKICAgICBBVlN5bmNTZXR0aW5ncyBtU3luY1NldHRpbmdzOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJTb3VyY2UuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyU291cmNlLmgKaW5kZXggNjYyMjM1Zi4uOTI5OGE5OSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJTb3VyY2UuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMlNvdXJjZS5oCkBAIC02OSw3ICs2OSw3IEBACiAgICAgICAgICAgICBCdWZmZXJpbmdTZXR0aW5ncyogYnVmZmVyaW5nIC8qIG5vbm51bGwgKi8pID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldEJ1ZmZlcmluZ1NldHRpbmdzKGNvbnN0IEJ1ZmZlcmluZ1NldHRpbmdzJiBidWZmZXJpbmcpID0gMDsKIAotICAgIHZpcnR1YWwgdm9pZCBwcmVwYXJlQXN5bmMoKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIHByZXBhcmVBc3luYyhpbnQ2NF90IHN0YXJ0VGltZVVzKSA9IDA7CiAKICAgICB2aXJ0dWFsIHZvaWQgc3RhcnQoKSA9IDA7CiAgICAgdmlydHVhbCB2b2lkIHN0b3AoKSB7fQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9SVFNQU291cmNlMi5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL1JUU1BTb3VyY2UyLmNwcAppbmRleCAxZGZlMzgzLi41M2M2NmMwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL1JUU1BTb3VyY2UyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL1JUU1BTb3VyY2UyLmNwcApAQCAtOTYsNyArOTYsOCBAQAogICAgIHJldHVybiBPSzsKIH0KIAotdm9pZCBOdVBsYXllcjI6OlJUU1BTb3VyY2UyOjpwcmVwYXJlQXN5bmMoKSB7CisvLyBUT0RPOiBmZXRjaCBkYXRhIHN0YXJ0aW5nIGZyb20gfHN0YXJ0VGltZVVzfAordm9pZCBOdVBsYXllcjI6OlJUU1BTb3VyY2UyOjpwcmVwYXJlQXN5bmMoaW50NjRfdCAvKiBzdGFydFRpbWVVcyAqLykgewogICAgIGlmIChtSXNTRFAgJiYgbUhUVFBTZXJ2aWNlID09IE5VTEwpIHsKICAgICAgICAgbm90aWZ5UHJlcGFyZWQoQkFEX1ZBTFVFKTsKICAgICAgICAgcmV0dXJuOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9SVFNQU291cmNlMi5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9SVFNQU291cmNlMi5oCmluZGV4IDcxMmMzZTUuLmU1ZjE3MTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvUlRTUFNvdXJjZTIuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL1JUU1BTb3VyY2UyLmgKQEAgLTQzLDcgKzQzLDcgQEAKICAgICAgICAgICAgIEJ1ZmZlcmluZ1NldHRpbmdzKiBidWZmZXJpbmcgLyogbm9ubnVsbCAqLykgb3ZlcnJpZGU7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRCdWZmZXJpbmdTZXR0aW5ncyhjb25zdCBCdWZmZXJpbmdTZXR0aW5ncyYgYnVmZmVyaW5nKSBvdmVycmlkZTsKIAotICAgIHZpcnR1YWwgdm9pZCBwcmVwYXJlQXN5bmMoKTsKKyAgICB2aXJ0dWFsIHZvaWQgcHJlcGFyZUFzeW5jKGludDY0X3Qgc3RhcnRUaW1lVXMpOwogICAgIHZpcnR1YWwgdm9pZCBzdGFydCgpOwogICAgIHZpcnR1YWwgdm9pZCBzdG9wKCk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9BbmRyb2lkLmJwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL0FuZHJvaWQuYnAKaW5kZXggYTM3OTczYi4uMDliMTlkNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL0FuZHJvaWQuYnAKQEAgLTI5LDYgKzI5LDcgQEAKICAgICAgICAgImxpYm1lZGlhbWV0cmljcyIsCiAgICAgICAgICJsaWJtZWRpYXV0aWxzIiwKICAgICAgICAgImxpYm1lbXVucmVhY2hhYmxlIiwKKyAgICAgICAgImxpYm5ldGRfY2xpZW50IiwKICAgICAgICAgImxpYnBvd2VybWFuYWdlciIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodCIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9HZW5lcmljU291cmNlLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9HZW5lcmljU291cmNlLmNwcAppbmRleCAyM2Q2NmJiLi5mM2I2OWQ2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvR2VuZXJpY1NvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0dlbmVyaWNTb3VyY2UuY3BwCkBAIC0yNSw3ICsyNSw2IEBACiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFCdWZmZXJIb2xkZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3Rvci5oPgogI2luY2x1ZGUgPG1lZGlhL01lZGlhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhRXh0cmFjdG9yU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CkBAIC0zOCw2ICszNyw3IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNsb2NrLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3RvckZhY3RvcnkuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CkBAIC0xNTQ3LDYgKzE1NDcsMTYgQEAKICAgICAgICAgICAgIG5vdGlmeUJ1ZmZlcmluZ1VwZGF0ZSgxMDApOwogICAgICAgICB9CiAKKyAgICAgICAgaWYgKG1QcmVwYXJpbmcpIHsKKyAgICAgICAgICAgIG5vdGlmeVByZXBhcmVkQW5kQ2xlYW51cChmaW5hbFN0YXR1cyk7CisgICAgICAgICAgICBtUHJlcGFyaW5nID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSBpZiAobVNlbnRQYXVzZU9uQnVmZmVyaW5nKSB7CisgICAgICAgICAgICBzZW5kQ2FjaGVTdGF0cygpOworICAgICAgICAgICAgbVNlbnRQYXVzZU9uQnVmZmVyaW5nID0gZmFsc2U7CisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gZHVwTm90aWZ5KCk7CisgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRSZXN1bWVPbkJ1ZmZlcmluZ0VuZCk7CisgICAgICAgICAgICBub3RpZnktPnBvc3QoKTsKKyAgICAgICAgfQogICAgICAgICByZXR1cm47CiAgICAgfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEZWNvZGVyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRlY29kZXIuY3BwCmluZGV4IDY5Y2Q4MmUuLjA1MGU0ZmIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRlY29kZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRlY29kZXIuY3BwCkBAIC0xMDY5LDYgKzEwNjksMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PE1lZGlhQnVmZmVySG9sZGVyKj4oaG9sZGVyLmdldCgpKS0+bWVkaWFCdWZmZXIoKSA6IG51bGxwdHI7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmIChtZWRpYUJ1ZiAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtZWRpYUJ1Zi0+c2l6ZSgpID4gY29kZWNCdWZmZXItPmNhcGFjaXR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUVycm9yKEVSUk9SX0JVRkZFUl9UT09fU01BTEwpOworICAgICAgICAgICAgICAgICAgICAgICAgbURlcXVldWVkSW5wdXRCdWZmZXJzLnB1c2hfYmFjayhidWZmZXJJeCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgICAgICBjb2RlY0J1ZmZlci0+c2V0UmFuZ2UoMCwgbWVkaWFCdWYtPnNpemUoKSk7CiAgICAgICAgICAgICAgICAgICAgIG1lbWNweShjb2RlY0J1ZmZlci0+ZGF0YSgpLCBtZWRpYUJ1Zi0+ZGF0YSgpLCBtZWRpYUJ1Zi0+c2l6ZSgpKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRHJtLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRybS5jcHAKaW5kZXggYmRlMDg2Mi4uOGQ4NzZkYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRHJtLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEcm0uY3BwCkBAIC0yMzksOCArMjM5LDE0IEBACiAgICAgICAgIHNpemVfdCAqZW5jcnlwdGVkYnl0ZXMpCiB7CiAgICAgLy8gc2l6ZSBuZWVkZWQgdG8gc3RvcmUgYWxsIHRoZSBjcnlwdG8gZGF0YQotICAgIHNpemVfdCBjcnlwdG9zaXplID0gc2l6ZW9mKENyeXB0b0luZm8pICsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihDcnlwdG9QbHVnaW46OlN1YlNhbXBsZSkgKiBudW1TdWJTYW1wbGVzOworICAgIHNpemVfdCBjcnlwdG9zaXplOworICAgIC8vIHNpemVvZihDcnlwdG9JbmZvKSArIHNpemVvZihDcnlwdG9QbHVnaW46OlN1YlNhbXBsZSkgKiBudW1TdWJTYW1wbGVzOworICAgIGlmIChfX2J1aWx0aW5fbXVsX292ZXJmbG93KHNpemVvZihDcnlwdG9QbHVnaW46OlN1YlNhbXBsZSksIG51bVN1YlNhbXBsZXMsICZjcnlwdG9zaXplKSB8fAorICAgICAgICAgICAgX19idWlsdGluX2FkZF9vdmVyZmxvdyhjcnlwdG9zaXplLCBzaXplb2YoQ3J5cHRvSW5mbyksICZjcnlwdG9zaXplKSkgeworICAgICAgICBBTE9HRSgiY3J5cHRvIHNpemUgb3ZlcmZsb3ciKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCiAgICAgQ3J5cHRvSW5mbyAqcmV0ID0gKENyeXB0b0luZm8qKSBtYWxsb2MoY3J5cHRvc2l6ZSk7CiAgICAgaWYgKHJldCA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dFKCJjb3VsZG4ndCBhbGxvY2F0ZSAlenUgYnl0ZXMiLCBjcnlwdG9zaXplKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclJlbmRlcmVyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclJlbmRlcmVyLmNwcAppbmRleCA1N2EwMTk4Li5iMjU4MzMyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJSZW5kZXJlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyUmVuZGVyZXIuY3BwCkBAIC0yNiw2ICsyNiw4IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDbG9jay5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNDb25zdGFudHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KQEAgLTg3LDYgKzg5LDIwIEBACiAvLyBzdGF0aWMKIGNvbnN0IGludDY0X3QgTnVQbGF5ZXI6OlJlbmRlcmVyOjprTWluUG9zaXRpb25VcGRhdGVEZWxheVVzID0gMTAwMDAwbGw7CiAKK3N0YXRpYyBhdWRpb19mb3JtYXRfdCBjb25zdGV4cHIgYXVkaW9Gb3JtYXRGcm9tRW5jb2RpbmcoaW50MzJfdCBwY21FbmNvZGluZykgeworICAgIHN3aXRjaCAocGNtRW5jb2RpbmcpIHsKKyAgICBjYXNlIGtBdWRpb0VuY29kaW5nUGNtRmxvYXQ6CisgICAgICAgIHJldHVybiBBVURJT19GT1JNQVRfUENNX0ZMT0FUOworICAgIGNhc2Uga0F1ZGlvRW5jb2RpbmdQY20xNmJpdDoKKyAgICAgICAgcmV0dXJuIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOworICAgIGNhc2Uga0F1ZGlvRW5jb2RpbmdQY204Yml0OgorICAgICAgICByZXR1cm4gQVVESU9fRk9STUFUX1BDTV84X0JJVDsgLy8gVE9ETzogZG8gd2Ugd2FudCB0byBzdXBwb3J0IHRoaXM/CisgICAgZGVmYXVsdDoKKyAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIGVuY29kaW5nOiAlZCIsIF9fZnVuY19fLCBwY21FbmNvZGluZyk7CisgICAgICAgIHJldHVybiBBVURJT19GT1JNQVRfSU5WQUxJRDsKKyAgICB9Cit9CisKIE51UGxheWVyOjpSZW5kZXJlcjo6UmVuZGVyZXIoCiAgICAgICAgIGNvbnN0IHNwPE1lZGlhUGxheWVyQmFzZTo6QXVkaW9TaW5rPiAmc2luaywKICAgICAgICAgY29uc3Qgc3A8TWVkaWFDbG9jaz4gJm1lZGlhQ2xvY2ssCkBAIC0xODc3LDggKzE4OTMsMTMgQEAKICAgICBpbnQzMl90IHNhbXBsZVJhdGU7CiAgICAgQ0hFQ0soZm9ybWF0LT5maW5kSW50MzIoInNhbXBsZS1yYXRlIiwgJnNhbXBsZVJhdGUpKTsKIAorICAgIC8vIHJlYWQgcGNtIGVuY29kaW5nIGZyb20gTWVkaWFDb2RlYyBvdXRwdXQgZm9ybWF0LCBpZiBhdmFpbGFibGUKKyAgICBpbnQzMl90IHBjbUVuY29kaW5nOworICAgIGF1ZGlvX2Zvcm1hdF90IGF1ZGlvRm9ybWF0ID0KKyAgICAgICAgICAgIGZvcm1hdC0+ZmluZEludDMyKEtFWV9QQ01fRU5DT0RJTkcsICZwY21FbmNvZGluZykgPworICAgICAgICAgICAgICAgICAgICBhdWRpb0Zvcm1hdEZyb21FbmNvZGluZyhwY21FbmNvZGluZykgOiBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKKwogICAgIGlmIChvZmZsb2FkaW5nQXVkaW8oKSkgewotICAgICAgICBhdWRpb19mb3JtYXRfdCBhdWRpb0Zvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOwogICAgICAgICBBU3RyaW5nIG1pbWU7CiAgICAgICAgIENIRUNLKGZvcm1hdC0+ZmluZFN0cmluZygibWltZSIsICZtaW1lKSk7CiAgICAgICAgIHN0YXR1c190IGVyciA9IG1hcE1pbWVUb0F1ZGlvRm9ybWF0KGF1ZGlvRm9ybWF0LCBtaW1lLmNfc3RyKCkpOwpAQCAtMTk4MCw3ICsyMDAxLDcgQEAKICAgICAgICAgY29uc3QgUGNtSW5mbyBpbmZvID0gewogICAgICAgICAgICAgICAgIChhdWRpb19jaGFubmVsX21hc2tfdCljaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpcGNtRmxhZ3MsCi0gICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQsIC8vIFRPRE86IGNoYW5nZSB0byBhdWRpb0Zvcm1hdAorICAgICAgICAgICAgICAgIGF1ZGlvRm9ybWF0LAogICAgICAgICAgICAgICAgIG51bUNoYW5uZWxzLAogICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUKICAgICAgICAgfTsKQEAgLTIwMTksNyArMjA0MCw3IEBACiAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCiAgICAgICAgICAgICAgICAgICAgIG51bUNoYW5uZWxzLAogICAgICAgICAgICAgICAgICAgICAoYXVkaW9fY2hhbm5lbF9tYXNrX3QpY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULAorICAgICAgICAgICAgICAgICAgICBhdWRpb0Zvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgMCAvKiBidWZmZXJDb3VudCAtIHVudXNlZCAqLywKICAgICAgICAgICAgICAgICAgICAgbVVzZUF1ZGlvQ2FsbGJhY2sgPyAmTnVQbGF5ZXI6OlJlbmRlcmVyOjpBdWRpb1NpbmtDYWxsYmFjayA6IE5VTEwsCiAgICAgICAgICAgICAgICAgICAgIG1Vc2VBdWRpb0NhbGxiYWNrID8gdGhpcyA6IE5VTEwsCkBAIC0yMDc3LDQgKzIwOTgsMyBAQAogfQogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvdGVzdHMvQW5kcm9pZC5icCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS90ZXN0cy9BbmRyb2lkLmJwCmluZGV4IGU4NmI2OGEuLjQ3NDlhOGIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS90ZXN0cy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS90ZXN0cy9BbmRyb2lkLmJwCkBAIC0xMSw2ICsxMSw3IEBACiAgICAgICAgICJsaWJ1dGlscyIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjAiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4xIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMiIsCiAgICAgXSwKIAogICAgIGNvbXBpbGVfbXVsdGlsaWI6ICIzMiIsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmxvZy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlibmJsb2cvQW5kcm9pZC5icAppbmRleCA3NGFhZjc3Li4xMTg4MzIwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJuYmxvZy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYm5ibG9nL0FuZHJvaWQuYnAKQEAgLTMsOSArMywxMyBAQAogICAgIG5hbWU6ICJsaWJuYmxvZyIsCiAKICAgICBzcmNzOiBbCi0gICAgICAgICJOQkxvZy5jcHAiLAorICAgICAgICAiRW50cnkuY3BwIiwKKyAgICAgICAgIk1lcmdlci5jcHAiLAogICAgICAgICAiUGVyZm9ybWFuY2VBbmFseXNpcy5jcHAiLAorICAgICAgICAiUmVhZGVyLmNwcCIsCiAgICAgICAgICJSZXBvcnRQZXJmb3JtYW5jZS5jcHAiLAorICAgICAgICAiVGltZWxpbmUuY3BwIiwKKyAgICAgICAgIldyaXRlci5jcHAiLAogICAgIF0sCiAKICAgICBzaGFyZWRfbGliczogWwpAQCAtMTMsOSArMTcsMTQgQEAKICAgICAgICAgImxpYmJpbmRlciIsCiAgICAgICAgICJsaWJjdXRpbHMiLAogICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYm1lZGlhbWV0cmljcyIsCiAgICAgICAgICJsaWJ1dGlscyIsCiAgICAgXSwKIAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJqc29uY3BwIiwKKyAgICBdLAorCiAgICAgY2ZsYWdzOiBbCiAgICAgICAgICItV2Vycm9yIiwKICAgICAgICAgIi1XYWxsIiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5ibG9nL0VudHJ5LmNwcCBiL21lZGlhL2xpYm5ibG9nL0VudHJ5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODc1NjM5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibmJsb2cvRW50cnkuY3BwCkBAIC0wLDAgKzEsMjYyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJOQkxvZyIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2ZpZm8uaD4KKyNpbmNsdWRlIDxtZWRpYS9uYmxvZy9FbnRyeS5oPgorI2luY2x1ZGUgPG1lZGlhL25ibG9nL0V2ZW50cy5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgTkJMb2cgeworCitpbnQgRW50cnk6OmNvcHlFbnRyeURhdGFBdChzaXplX3Qgb2Zmc2V0KSBjb25zdAoreworICAgIC8vIEZJWE1FIFRoaXMgaXMgdG9vIHNsb3cKKyAgICBpZiAob2Zmc2V0ID09IDApIHsKKyAgICAgICAgcmV0dXJuIG1FdmVudDsKKyAgICB9IGVsc2UgaWYgKG9mZnNldCA9PSAxKSB7CisgICAgICAgIHJldHVybiBtTGVuZ3RoOworICAgIH0gZWxzZSBpZiAob2Zmc2V0IDwgKHNpemVfdCkgKG1MZW5ndGggKyAyKSkgeworICAgICAgICByZXR1cm4gKGludCkgKChjaGFyICopIG1EYXRhKVtvZmZzZXQgLSAyXTsKKyAgICB9IGVsc2UgaWYgKG9mZnNldCA9PSAoc2l6ZV90KSAobUxlbmd0aCArIDIpKSB7CisgICAgICAgIHJldHVybiBtTGVuZ3RoOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiAwOyAgIC8vIEZJWE1FIGlzIHRoaXMgYW4gZXJyb3I/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+ICAgICBtSU1lbW9yeXt9OyAgICAgICAgIC8vIHJlZi1jb3VudGVkIHZlcnNpb24sIGluaXRpYWxpemVkIGluIGNvbnN0cnVjdG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIHRoZW4gY29uc3QKKyAgICBhdWRpb191dGlsc19maWZvICogY29uc3QgbUZpZm97fTsgICAgICAgICAgICAgICAvLyBGSUZPIGl0c2VsZiwgbm9uLU5VTEwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1bmxlc3MgY29uc3RydWN0b3IgZmFpbHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvciBkdW1teSBjb25zdHJ1Y3RvciB1c2VkCisgICAgYXVkaW9fdXRpbHNfZmlmb193cml0ZXIgKiBjb25zdCBtRmlmb1dyaXRlcnt9OyAgLy8gdXNlZCB0byB3cml0ZSB0byBGSUZPLCBub24tTlVMTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVubGVzcyBkdW1teSBjb25zdHJ1Y3RvciB1c2VkCisgICAgYm9vbCAgICAgICAgICAgIG1FbmFibGVkID0gZmFsc2U7ICAgLy8gd2hldGhlciB0byBhY3R1YWxseSBsb2cKKworICAgIC8vIGNhY2hlZCBwaWQgYW5kIHByb2Nlc3MgbmFtZSB0byB1c2UgaW4gJXAgZm9ybWF0IHNwZWNpZmllcgorICAgIC8vIHRvdGFsIHRhZyBsZW5ndGggaXMgbVBpZFRhZ1NpemUgYW5kIHByb2Nlc3MgbmFtZSBpcyBub3QgemVybyB0ZXJtaW5hdGVkCisgICAgY2hhciAgICptUGlkVGFne307CisgICAgc2l6ZV90ICBtUGlkVGFnU2l6ZSA9IDA7Cit9OworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gU2ltaWxhciB0byBXcml0ZXIsIGJ1dCBzYWZlIGZvciBtdWx0aXBsZSB0aHJlYWRzIHRvIGNhbGwgY29uY3VycmVudGx5CitjbGFzcyBMb2NrZWRXcml0ZXIgOiBwdWJsaWMgV3JpdGVyIHsKK3B1YmxpYzoKKyAgICBMb2NrZWRXcml0ZXIoKSA9IGRlZmF1bHQ7CisgICAgTG9ja2VkV3JpdGVyKHZvaWQgKnNoYXJlZCwgc2l6ZV90IHNpemUpOworCisgICAgYm9vbCAgICBpc0VuYWJsZWQoKSBjb25zdCBvdmVycmlkZTsKKyAgICBib29sICAgIHNldEVuYWJsZWQoYm9vbCBlbmFibGVkKSBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICAvLyBMb2NrIG5lZWRzIHRvIGJlIG9idGFpbmVkIGJlZm9yZSB3cml0aW5nIHRvIEZJRk8uCisgICAgdm9pZCBsb2coY29uc3QgRW50cnkgJmVudHJ5LCBib29sIHRydXN0ZWQgPSBmYWxzZSkgb3ZlcnJpZGU7CisKKyAgICBtdXRhYmxlIE11dGV4ICAgbUxvY2s7Cit9OworCit9ICAgLy8gbmFtZXNwYWNlIE5CTG9nCit9ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX01FRElBX05CTE9HX1dSSVRFUl9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BQ29kZWMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUNvZGVjLmNwcAppbmRleCA5MmU3MmI5Li4zMDgwZGI1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BQ29kZWMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FDb2RlYy5jcHAKQEAgLTE3NDgsMjkgKzE3NDgsMzIgQEAKICAgICB9CiAKICAgICBpbnQzMl90IHN0b3JlTWV0YTsKLSAgICBpZiAoZW5jb2RlcgotICAgICAgICAgICAgJiYgbXNnLT5maW5kSW50MzIoImFuZHJvaWQuX2lucHV0LW1ldGFkYXRhLWJ1ZmZlci10eXBlIiwgJnN0b3JlTWV0YSkKLSAgICAgICAgICAgICYmIHN0b3JlTWV0YSAhPSBrTWV0YWRhdGFCdWZmZXJUeXBlSW52YWxpZCkgewotICAgICAgICBJT01YOjpQb3J0TW9kZSBtb2RlOwotICAgICAgICBpZiAoc3RvcmVNZXRhID09IGtNZXRhZGF0YUJ1ZmZlclR5cGVOYXRpdmVIYW5kbGVTb3VyY2UpIHsKLSAgICAgICAgICAgIG1vZGUgPSBJT01YOjprUG9ydE1vZGVEeW5hbWljTmF0aXZlSGFuZGxlOwotICAgICAgICB9IGVsc2UgaWYgKHN0b3JlTWV0YSA9PSBrTWV0YWRhdGFCdWZmZXJUeXBlQU5XQnVmZmVyIHx8Ci0gICAgICAgICAgICAgICAgc3RvcmVNZXRhID09IGtNZXRhZGF0YUJ1ZmZlclR5cGVHcmFsbG9jU291cmNlKSB7Ci0gICAgICAgICAgICBtb2RlID0gSU9NWDo6a1BvcnRNb2RlRHluYW1pY0FOV0J1ZmZlcjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgaWYgKGVuY29kZXIpIHsKKyAgICAgICAgSU9NWDo6UG9ydE1vZGUgbW9kZSA9IElPTVg6OmtQb3J0TW9kZVByZXNldEJ5dGVCdWZmZXI7CisgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMigiYW5kcm9pZC5faW5wdXQtbWV0YWRhdGEtYnVmZmVyLXR5cGUiLCAmc3RvcmVNZXRhKQorICAgICAgICAgICAgICAgICYmIHN0b3JlTWV0YSAhPSBrTWV0YWRhdGFCdWZmZXJUeXBlSW52YWxpZCkgeworICAgICAgICAgICAgaWYgKHN0b3JlTWV0YSA9PSBrTWV0YWRhdGFCdWZmZXJUeXBlTmF0aXZlSGFuZGxlU291cmNlKSB7CisgICAgICAgICAgICAgICAgbW9kZSA9IElPTVg6OmtQb3J0TW9kZUR5bmFtaWNOYXRpdmVIYW5kbGU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHN0b3JlTWV0YSA9PSBrTWV0YWRhdGFCdWZmZXJUeXBlQU5XQnVmZmVyIHx8CisgICAgICAgICAgICAgICAgICAgIHN0b3JlTWV0YSA9PSBrTWV0YWRhdGFCdWZmZXJUeXBlR3JhbGxvY1NvdXJjZSkgeworICAgICAgICAgICAgICAgIG1vZGUgPSBJT01YOjprUG9ydE1vZGVEeW5hbWljQU5XQnVmZmVyOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGVyciA9IHNldFBvcnRNb2RlKGtQb3J0SW5kZXhJbnB1dCwgbW9kZSk7CiAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgIH0KIAotICAgICAgICB1aW50MzJfdCB1c2FnZUJpdHM7Ci0gICAgICAgIGlmIChtT01YTm9kZS0+Z2V0UGFyYW1ldGVyKAotICAgICAgICAgICAgICAgIChPTVhfSU5ERVhUWVBFKU9NWF9JbmRleFBhcmFtQ29uc3VtZXJVc2FnZUJpdHMsCi0gICAgICAgICAgICAgICAgJnVzYWdlQml0cywgc2l6ZW9mKHVzYWdlQml0cykpID09IE9LKSB7Ci0gICAgICAgICAgICBpbnB1dEZvcm1hdC0+c2V0SW50MzIoCi0gICAgICAgICAgICAgICAgICAgICJ1c2luZy1zdy1yZWFkLW9mdGVuIiwgISEodXNhZ2VCaXRzICYgR1JBTExPQ19VU0FHRV9TV19SRUFEX09GVEVOKSk7CisgICAgICAgIGlmIChtb2RlICE9IElPTVg6OmtQb3J0TW9kZVByZXNldEJ5dGVCdWZmZXIpIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHVzYWdlQml0czsKKyAgICAgICAgICAgIGlmIChtT01YTm9kZS0+Z2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgICAgICAgICAoT01YX0lOREVYVFlQRSlPTVhfSW5kZXhQYXJhbUNvbnN1bWVyVXNhZ2VCaXRzLAorICAgICAgICAgICAgICAgICAgICAmdXNhZ2VCaXRzLCBzaXplb2YodXNhZ2VCaXRzKSkgPT0gT0spIHsKKyAgICAgICAgICAgICAgICBpbnB1dEZvcm1hdC0+c2V0SW50MzIoCisgICAgICAgICAgICAgICAgICAgICAgICAidXNpbmctc3ctcmVhZC1vZnRlbiIsICEhKHVzYWdlQml0cyAmIEdSQUxMT0NfVVNBR0VfU1dfUkVBRF9PRlRFTikpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCkBAIC01NTU4LDYgKzU1NjEsMTEgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBrV2hhdENoZWNrSWZTdHVjazogeworICAgICAgICAgICAgQUxPR1YoIk5vLW9wIGJ5IGRlZmF1bHQiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CkBAIC03ODc1LDYgKzc4ODMsMTggQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBrV2hhdENoZWNrSWZTdHVjazoKKyAgICAgICAgeworICAgICAgICAgICAgaW50MzJfdCBnZW5lcmF0aW9uID0gMDsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJnZW5lcmF0aW9uIiwgJmdlbmVyYXRpb24pKTsKKyAgICAgICAgICAgIGlmIChnZW5lcmF0aW9uID09IG1Db2RlYy0+bVN0YXRlR2VuZXJhdGlvbikgeworICAgICAgICAgICAgICAgIG1Db2RlYy0+c2lnbmFsRXJyb3IoT01YX0Vycm9yVW5kZWZpbmVkLCBUSU1FRF9PVVQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIGhhbmRsZWQgPSBCYXNlU3RhdGU6Om9uTWVzc2FnZVJlY2VpdmVkKG1zZyk7CiAgICAgICAgICAgICBicmVhazsKQEAgLTc4ODYsNiArNzkwNiwxMSBAQAogdm9pZCBBQ29kZWM6Ok91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZWRTdGF0ZTo6c3RhdGVFbnRlcmVkKCkgewogICAgIEFMT0dWKCJbJXNdIE5vdyBoYW5kbGluZyBvdXRwdXQgcG9ydCBzZXR0aW5ncyBjaGFuZ2UiLAogICAgICAgICAgbUNvZGVjLT5tQ29tcG9uZW50TmFtZS5jX3N0cigpKTsKKworICAgIC8vIElmIHdlIGhhdmVuJ3QgdHJhbnNpdGlvbmVkIGFmdGVyIDMgc2Vjb25kcywgd2UncmUgcHJvYmFibHkgc3R1Y2suCisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShBQ29kZWM6OmtXaGF0Q2hlY2tJZlN0dWNrLCBtQ29kZWMpOworICAgIG1zZy0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBtQ29kZWMtPm1TdGF0ZUdlbmVyYXRpb24pOworICAgIG1zZy0+cG9zdCgzMDAwMDAwKTsKIH0KIAogYm9vbCBBQ29kZWM6Ok91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZWRTdGF0ZTo6b25PTVhGcmFtZVJlbmRlcmVkKApAQCAtODE0OCw2ICs4MTczLDExIEBACiAgICAgQUxPR1YoIlslc10gTm93IEZsdXNoaW5nIiwgbUNvZGVjLT5tQ29tcG9uZW50TmFtZS5jX3N0cigpKTsKIAogICAgIG1GbHVzaENvbXBsZXRlW2tQb3J0SW5kZXhJbnB1dF0gPSBtRmx1c2hDb21wbGV0ZVtrUG9ydEluZGV4T3V0cHV0XSA9IGZhbHNlOworCisgICAgLy8gSWYgd2UgaGF2ZW4ndCB0cmFuc2l0aW9uZWQgYWZ0ZXIgMyBzZWNvbmRzLCB3ZSdyZSBwcm9iYWJseSBzdHVjay4KKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKEFDb2RlYzo6a1doYXRDaGVja0lmU3R1Y2ssIG1Db2RlYyk7CisgICAgbXNnLT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsIG1Db2RlYy0+bVN0YXRlR2VuZXJhdGlvbik7CisgICAgbXNnLT5wb3N0KDMwMDAwMDApOwogfQogCiBib29sIEFDb2RlYzo6Rmx1c2hpbmdTdGF0ZTo6b25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKQEAgLTgxNjIsNiArODE5Miw3IEBACiAgICAgICAgICAgICAgICAgbXNnLT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsIG1Db2RlYy0+bVN0YXRlR2VuZXJhdGlvbik7CiAgICAgICAgICAgICAgICAgbXNnLT5wb3N0KDMwMDAwMDApOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgaGFuZGxlZCA9IHRydWU7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCkBAIC04MTgyLDYgKzgyMTMsMTggQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBrV2hhdENoZWNrSWZTdHVjazoKKyAgICAgICAgeworICAgICAgICAgICAgaW50MzJfdCBnZW5lcmF0aW9uID0gMDsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJnZW5lcmF0aW9uIiwgJmdlbmVyYXRpb24pKTsKKyAgICAgICAgICAgIGlmIChnZW5lcmF0aW9uID09IG1Db2RlYy0+bVN0YXRlR2VuZXJhdGlvbikgeworICAgICAgICAgICAgICAgIG1Db2RlYy0+c2lnbmFsRXJyb3IoT01YX0Vycm9yVW5kZWZpbmVkLCBUSU1FRF9PVVQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIGhhbmRsZWQgPSBCYXNlU3RhdGU6Om9uTWVzc2FnZVJlY2VpdmVkKG1zZyk7CiAgICAgICAgICAgICBicmVhazsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FDb2RlY0J1ZmZlckNoYW5uZWwuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUNvZGVjQnVmZmVyQ2hhbm5lbC5jcHAKaW5kZXggNzEwYWU2OC4uMjY2YTI0MCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUNvZGVjQnVmZmVyQ2hhbm5lbC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUNvZGVjQnVmZmVyQ2hhbm5lbC5jcHAKQEAgLTEyOSw2ICsxMjksNyBAQAogICAgICAgICBzZWN1cmVIYW5kbGUgPSBzdGF0aWNfY2FzdDxuYXRpdmVfaGFuZGxlX3QgKj4oc2VjdXJlRGF0YS0+Z2V0RGVzdGluYXRpb25Qb2ludGVyKCkpOwogICAgIH0KICAgICBzc2l6ZV90IHJlc3VsdCA9IC0xOworICAgIHNzaXplX3QgY29kZWNEYXRhT2Zmc2V0ID0gMDsKICAgICBpZiAobUNyeXB0byAhPSBOVUxMKSB7CiAgICAgICAgIElDcnlwdG86OkRlc3RpbmF0aW9uQnVmZmVyIGRlc3RpbmF0aW9uOwogICAgICAgICBpZiAoc2VjdXJlKSB7CkBAIC0xODAsOSArMTgxLDE2IEBACiAKICAgICAgICAgU3RhdHVzIHN0YXR1cyA9IFN0YXR1czo6T0s7CiAgICAgICAgIGhpZGxfc3RyaW5nIGRldGFpbGVkRXJyb3I7CisgICAgICAgIFNjcmFtYmxpbmdDb250cm9sIHNjdHJsID0gU2NyYW1ibGluZ0NvbnRyb2w6OlVOU0NSQU1CTEVEOworCisgICAgICAgIGlmIChrZXkgIT0gTlVMTCkgeworICAgICAgICAgICAgc2N0cmwgPSAoU2NyYW1ibGluZ0NvbnRyb2wpa2V5WzBdOworICAgICAgICAgICAgLy8gQWRqdXN0IGZvciB0aGUgUEVTIG9mZnNldAorICAgICAgICAgICAgY29kZWNEYXRhT2Zmc2V0ID0ga2V5WzJdIHwgKGtleVszXSA8PCA4KTsKKyAgICAgICAgfQogCiAgICAgICAgIGF1dG8gcmV0dXJuVm9pZCA9IG1EZXNjcmFtYmxlci0+ZGVzY3JhbWJsZSgKLSAgICAgICAgICAgICAgICBrZXkgIT0gTlVMTCA/IChTY3JhbWJsaW5nQ29udHJvbClrZXlbMF0gOiBTY3JhbWJsaW5nQ29udHJvbDo6VU5TQ1JBTUJMRUQsCisgICAgICAgICAgICAgICAgc2N0cmwsCiAgICAgICAgICAgICAgICAgaGlkbFN1YlNhbXBsZXMsCiAgICAgICAgICAgICAgICAgc3JjQnVmZmVyLAogICAgICAgICAgICAgICAgIDAsCkBAIC0yMDIsNiArMjEwLDExIEBACiAgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKICAgICAgICAgfQogCisgICAgICAgIGlmIChyZXN1bHQgPCBjb2RlY0RhdGFPZmZzZXQpIHsKKyAgICAgICAgICAgIEFMT0dEKCJpbnZhbGlkIGNvZGVjIGRhdGEgb2Zmc2V0OiAlemQsIHJlc3VsdCAlemQiLCBjb2RlY0RhdGFPZmZzZXQsIHJlc3VsdCk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisKICAgICAgICAgQUxPR1YoImRlc2NyYW1ibGUgc3VjY2VlZGVkLCAlemQgYnl0ZXMiLCByZXN1bHQpOwogCiAgICAgICAgIGlmIChkc3RCdWZmZXIudHlwZSA9PSBCdWZmZXJUeXBlOjpTSEFSRURfTUVNT1JZKSB7CkBAIC0yMTAsNyArMjIzLDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIGl0LT5tQ29kZWNCdWZmZXItPnNldFJhbmdlKDAsIHJlc3VsdCk7CisgICAgaXQtPm1Db2RlY0J1ZmZlci0+c2V0UmFuZ2UoY29kZWNEYXRhT2Zmc2V0LCByZXN1bHQgLSBjb2RlY0RhdGFPZmZzZXQpOwogCiAgICAgLy8gQ29weSBtZXRhZGF0YSBmcm9tIGNsaWVudCB0byBjb2RlYyBidWZmZXIuCiAgICAgaXQtPm1Db2RlY0J1ZmZlci0+bWV0YSgpLT5jbGVhcigpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODliOGIwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZS5jcHAKQEAgLTAsMCArMSwxMTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkFIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9BSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitBU3RhdGU6OkFTdGF0ZShjb25zdCBzcDxBU3RhdGU+ICZwYXJlbnRTdGF0ZSkKKyAgICA6IG1QYXJlbnRTdGF0ZShwYXJlbnRTdGF0ZSkgeworfQorCitBU3RhdGU6On5BU3RhdGUoKSB7Cit9CisKK3NwPEFTdGF0ZT4gQVN0YXRlOjpwYXJlbnRTdGF0ZSgpIHsKKyAgICByZXR1cm4gbVBhcmVudFN0YXRlOworfQorCit2b2lkIEFTdGF0ZTo6c3RhdGVFbnRlcmVkKCkgeworfQorCit2b2lkIEFTdGF0ZTo6c3RhdGVFeGl0ZWQoKSB7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK0FIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmU6OkFIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUoKSB7Cit9CisKK0FIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmU6On5BSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lKCkgeworfQorCit2b2lkIEFIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmU6OmhhbmRsZU1lc3NhZ2UoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBzcDxBU3RhdGU+IHNhdmUgPSBtU3RhdGU7CisKKyAgICBzcDxBU3RhdGU+IGN1ciA9IG1TdGF0ZTsKKyAgICB3aGlsZSAoY3VyICE9IE5VTEwgJiYgIWN1ci0+b25NZXNzYWdlUmVjZWl2ZWQobXNnKSkgeworICAgICAgICAvLyBJZiB5b3UgY2xhaW0gbm90IHRvIGhhdmUgaGFuZGxlZCB0aGUgbWVzc2FnZSB5b3Ugc2hvdWxkbid0CisgICAgICAgIC8vIGhhdmUgY2FsbGVkIHNldFN0YXRlLi4uCisgICAgICAgIENIRUNLKHNhdmUgPT0gbVN0YXRlKTsKKworICAgICAgICBjdXIgPSBjdXItPnBhcmVudFN0YXRlKCk7CisgICAgfQorCisgICAgaWYgKGN1ciAhPSBOVUxMKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBBTE9HVygiV2FybmluZyBtZXNzYWdlICVzIHVuaGFuZGxlZCBpbiByb290IHN0YXRlLiIsCisgICAgICAgICBtc2ctPmRlYnVnU3RyaW5nKCkuY19zdHIoKSk7Cit9CisKK3ZvaWQgQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZTo6Y2hhbmdlU3RhdGUoY29uc3Qgc3A8QVN0YXRlPiAmc3RhdGUpIHsKKyAgICBpZiAoc3RhdGUgPT0gbVN0YXRlKSB7CisgICAgICAgIC8vIFF1aWNrIGV4aXQgZm9yIHRoZSBlYXN5IGNhc2UuCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBWZWN0b3I8c3A8QVN0YXRlPiA+IEE7CisgICAgc3A8QVN0YXRlPiBjdXIgPSBtU3RhdGU7CisgICAgZm9yICg7OykgeworICAgICAgICBBLnB1c2goY3VyKTsKKyAgICAgICAgaWYgKGN1ciA9PSBOVUxMKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjdXIgPSBjdXItPnBhcmVudFN0YXRlKCk7CisgICAgfQorCisgICAgVmVjdG9yPHNwPEFTdGF0ZT4gPiBCOworICAgIGN1ciA9IHN0YXRlOworICAgIGZvciAoOzspIHsKKyAgICAgICAgQi5wdXNoKGN1cik7CisgICAgICAgIGlmIChjdXIgPT0gTlVMTCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY3VyID0gY3VyLT5wYXJlbnRTdGF0ZSgpOworICAgIH0KKworICAgIC8vIFJlbW92ZSB0aGUgY29tbW9uIHRhaWwuCisgICAgd2hpbGUgKEEuc2l6ZSgpID4gMCAmJiBCLnNpemUoKSA+IDAgJiYgQS50b3AoKSA9PSBCLnRvcCgpKSB7CisgICAgICAgIEEucG9wKCk7CisgICAgICAgIEIucG9wKCk7CisgICAgfQorCisgICAgbVN0YXRlID0gc3RhdGU7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEEuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgQS5lZGl0SXRlbUF0KGkpLT5zdGF0ZUV4aXRlZCgpOworICAgIH0KKworICAgIGZvciAoc2l6ZV90IGkgPSBCLnNpemUoKTsgaSA+IDA7KSB7CisgICAgICAgIGktLTsKKyAgICAgICAgQi5lZGl0SXRlbUF0KGkpLT5zdGF0ZUVudGVyZWQoKTsKKyAgICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQW5kcm9pZC5icAppbmRleCA0OGUzNTFiLi5kOTZkMzU4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FuZHJvaWQuYnAKQEAgLTQ1LDcgKzQ1LDcgQEAKICAgICAgICAgfSwKICAgICB9LAogCi0gICAgc2hhcmVkX2xpYnM6IFsibGlibWVkaWEiXSwKKyAgICBzaGFyZWRfbGliczogWyJsaWJtZWRpYSIsICJsaWJtZWRpYW5kayJdLAogfQogCiBjY19saWJyYXJ5X3NoYXJlZCB7CkBAIC05MCw5ICs5MCwxMCBAQAogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodCIsCiAKICAgICBzcmNzOiBbCisgICAgICAgICJBQUNXcml0ZXIuY3BwIiwKICAgICAgICAgIkFDb2RlYy5jcHAiLAogICAgICAgICAiQUNvZGVjQnVmZmVyQ2hhbm5lbC5jcHAiLAotICAgICAgICAiQUFDV3JpdGVyLmNwcCIsCisgICAgICAgICJBSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lLmNwcCIsCiAgICAgICAgICJBTVJXcml0ZXIuY3BwIiwKICAgICAgICAgIkF1ZGlvUGxheWVyLmNwcCIsCiAgICAgICAgICJBdWRpb1ByZXNlbnRhdGlvbkluZm8uY3BwIiwKQEAgLTEwNSw2ICsxMDYsNyBAQAogICAgICAgICAiRGF0YUNvbnZlcnRlci5jcHAiLAogICAgICAgICAiRGF0YVNvdXJjZUZhY3RvcnkuY3BwIiwKICAgICAgICAgIkRhdGFVUklTb3VyY2UuY3BwIiwKKyAgICAgICAgIkNsZWFyRmlsZVNvdXJjZS5jcHAiLAogICAgICAgICAiRmlsZVNvdXJjZS5jcHAiLAogICAgICAgICAiRnJhbWVEZWNvZGVyLmNwcCIsCiAgICAgICAgICJIVFRQQmFzZS5jcHAiLApAQCAtMTE5LDggKzEyMSwxMSBAQAogICAgICAgICAiTWVkaWFDb2RlY0xpc3QuY3BwIiwKICAgICAgICAgIk1lZGlhQ29kZWNMaXN0T3ZlcnJpZGVzLmNwcCIsCiAgICAgICAgICJNZWRpYUNvZGVjU291cmNlLmNwcCIsCisgICAgICAgICJNZWRpYUV4dHJhY3Rvci5jcHAiLAogICAgICAgICAiTWVkaWFFeHRyYWN0b3JGYWN0b3J5LmNwcCIsCiAgICAgICAgICJNZWRpYVN5bmMuY3BwIiwKKyAgICAgICAgIk1lZGlhVHJhY2suY3BwIiwKKyAgICAgICAgImh0dHAvQ2xlYXJNZWRpYUhUVFAuY3BwIiwKICAgICAgICAgImh0dHAvTWVkaWFIVFRQLmNwcCIsCiAgICAgICAgICJNZWRpYU11eGVyLmNwcCIsCiAgICAgICAgICJOdUNhY2hlZFNvdXJjZTIuY3BwIiwKQEAgLTE4OSw2ICsxOTQsMTAgQEAKICAgICAgICAgImxpYkZMQUMiLAogICAgIF0sCiAKKyAgICBoZWFkZXJfbGliczpbCisgICAgICAgICJtZWRpYV9uZGtfaGVhZGVycyIsCisgICAgXSwKKwogICAgIGV4cG9ydF9zaGFyZWRfbGliX2hlYWRlcnM6IFsKICAgICAgICAgImxpYm1lZGlhIiwKICAgICAgICAgImFuZHJvaWQuaGlkbC5hbGxvY2F0b3JAMS4wIiwKQEAgLTIyNiw1NyArMjM1LDMwIEBACiAgICAgfSwKIH0KIAotY2NfbGlicmFyeSB7CitjY19saWJyYXJ5X3N0YXRpYyB7CiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X3BsYXllcjIiLAogCiAgICAgc3JjczogWwotICAgICAgICAiQ2FsbGJhY2tEYXRhU291cmNlLmNwcCIsCi0gICAgICAgICJDYWxsYmFja01lZGlhU291cmNlLmNwcCIsCi0gICAgICAgICJEYXRhU291cmNlRmFjdG9yeS5jcHAiLAorICAgICAgICAiQ2xlYXJGaWxlU291cmNlLmNwcCIsCiAgICAgICAgICJEYXRhVVJJU291cmNlLmNwcCIsCi0gICAgICAgICJGaWxlU291cmNlLmNwcCIsCiAgICAgICAgICJIVFRQQmFzZS5jcHAiLAogICAgICAgICAiSGV2Y1V0aWxzLmNwcCIsCi0gICAgICAgICJJbnRlcmZhY2VVdGlscy5jcHAiLAogICAgICAgICAiTWVkaWFDbG9jay5jcHAiLAotICAgICAgICAiTWVkaWFFeHRyYWN0b3JGYWN0b3J5LmNwcCIsCiAgICAgICAgICJOZGtVdGlscy5jcHAiLAotICAgICAgICAiTnVDYWNoZWRTb3VyY2UyLmNwcCIsCi0gICAgICAgICJSZW1vdGVNZWRpYUV4dHJhY3Rvci5jcHAiLAotICAgICAgICAiUmVtb3RlTWVkaWFTb3VyY2UuY3BwIiwKICAgICAgICAgIlV0aWxzLmNwcCIsCiAgICAgICAgICJWaWRlb0ZyYW1lU2NoZWR1bGVyLmNwcCIsCi0gICAgICAgICJodHRwL01lZGlhSFRUUC5jcHAiLAorICAgICAgICAiaHR0cC9DbGVhck1lZGlhSFRUUC5jcHAiLAogICAgIF0sCiAKICAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGliYmluZGVyIiwKLSAgICAgICAgImxpYmN1dGlscyIsCi0gICAgICAgICJsaWJkcm1mcmFtZXdvcmsiLAogICAgICAgICAibGliZ3VpIiwKICAgICAgICAgImxpYmxvZyIsCi0gICAgICAgICJsaWJtZWRpYV9wbGF5ZXIyX3V0aWwiLAotICAgICAgICAibGliYXVkaW9jbGllbnQiLAotICAgICAgICAibGlibWVkaWFleHRyYWN0b3IiLAotICAgICAgICAibGlibWVkaWFtZXRyaWNzIiwKLSAgICAgICAgImxpYm1lZGlhdXRpbHMiLAogICAgICAgICAibGlibmV0ZF9jbGllbnQiLAotICAgICAgICAibGlidWkiLAogICAgICAgICAibGlidXRpbHMiLAotICAgICAgICAibGlibWVkaWFfaGVscGVyIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAotICAgICAgICAibGliemlwYXJjaGl2ZSIsCiAgICAgXSwKIAogICAgIHN0YXRpY19saWJzOiBbCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF9lc2RzIiwKLSAgICBdLAotCi0gICAgaGVhZGVyX2xpYnM6WwotICAgICAgICAibWVkaWFfcGx1Z2luX2hlYWRlcnMiLAotICAgIF0sCi0KLSAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbCiAgICAgICAgICJsaWJtZWRpYV9wbGF5ZXIyX3V0aWwiLAogICAgIF0sCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NsZWFyRmlsZVNvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9DbGVhckZpbGVTb3VyY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzYTJjYjcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9DbGVhckZpbGVTb3VyY2UuY3BwCkBAIC0wLDAgKzEsMTQzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDbGVhckZpbGVTb3VyY2UiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0NsZWFyRmlsZVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK0NsZWFyRmlsZVNvdXJjZTo6Q2xlYXJGaWxlU291cmNlKGNvbnN0IGNoYXIgKmZpbGVuYW1lKQorICAgIDogbUZkKC0xKSwKKyAgICAgIG1PZmZzZXQoMCksCisgICAgICBtTGVuZ3RoKC0xKSwKKyAgICAgIG1OYW1lKCI8bnVsbD4iKSB7CisKKyAgICBpZiAoZmlsZW5hbWUpIHsKKyAgICAgICAgbU5hbWUgPSBTdHJpbmc4Ojpmb3JtYXQoIkZpbGVTb3VyY2UoJXMpIiwgZmlsZW5hbWUpOworICAgIH0KKyAgICBBTE9HVigiJXMiLCBmaWxlbmFtZSk7CisgICAgbUZkID0gb3BlbihmaWxlbmFtZSwgT19MQVJHRUZJTEUgfCBPX1JET05MWSk7CisKKyAgICBpZiAobUZkID49IDApIHsKKyAgICAgICAgbUxlbmd0aCA9IGxzZWVrNjQobUZkLCAwLCBTRUVLX0VORCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBvcGVuIGZpbGUgJyVzJy4gKCVzKSIsIGZpbGVuYW1lLCBzdHJlcnJvcihlcnJubykpOworICAgIH0KK30KKworQ2xlYXJGaWxlU291cmNlOjpDbGVhckZpbGVTb3VyY2UoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpCisgICAgOiBtRmQoZmQpLAorICAgICAgbU9mZnNldChvZmZzZXQpLAorICAgICAgbUxlbmd0aChsZW5ndGgpLAorICAgICAgbU5hbWUoIjxudWxsPiIpIHsKKyAgICBBTE9HVigiZmQ9JWQgKCVzKSwgb2Zmc2V0PSVsbGQsIGxlbmd0aD0lbGxkIiwKKyAgICAgICAgICAgIGZkLCBuYW1lRm9yRmQoZmQpLmNfc3RyKCksIChsb25nIGxvbmcpIG9mZnNldCwgKGxvbmcgbG9uZykgbGVuZ3RoKTsKKworICAgIGlmIChtT2Zmc2V0IDwgMCkgeworICAgICAgICBtT2Zmc2V0ID0gMDsKKyAgICB9CisgICAgaWYgKG1MZW5ndGggPCAwKSB7CisgICAgICAgIG1MZW5ndGggPSAwOworICAgIH0KKyAgICBpZiAobUxlbmd0aCA+IElOVDY0X01BWCAtIG1PZmZzZXQpIHsKKyAgICAgICAgbUxlbmd0aCA9IElOVDY0X01BWCAtIG1PZmZzZXQ7CisgICAgfQorICAgIHN0cnVjdCBzdGF0IHM7CisgICAgaWYgKGZzdGF0KGZkLCAmcykgPT0gMCkgeworICAgICAgICBpZiAobU9mZnNldCA+IHMuc3Rfc2l6ZSkgeworICAgICAgICAgICAgbU9mZnNldCA9IHMuc3Rfc2l6ZTsKKyAgICAgICAgICAgIG1MZW5ndGggPSAwOworICAgICAgICB9CisgICAgICAgIGlmIChtT2Zmc2V0ICsgbUxlbmd0aCA+IHMuc3Rfc2l6ZSkgeworICAgICAgICAgICAgbUxlbmd0aCA9IHMuc3Rfc2l6ZSAtIG1PZmZzZXQ7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKG1PZmZzZXQgIT0gb2Zmc2V0IHx8IG1MZW5ndGggIT0gbGVuZ3RoKSB7CisgICAgICAgIEFMT0dXKCJvZmZzZXQvbGVuZ3RoIGFkanVzdGVkIGZyb20gJWxsZC8lbGxkIHRvICVsbGQvJWxsZCIsCisgICAgICAgICAgICAgICAgKGxvbmcgbG9uZykgb2Zmc2V0LCAobG9uZyBsb25nKSBsZW5ndGgsCisgICAgICAgICAgICAgICAgKGxvbmcgbG9uZykgbU9mZnNldCwgKGxvbmcgbG9uZykgbUxlbmd0aCk7CisgICAgfQorCisgICAgbU5hbWUgPSBTdHJpbmc4Ojpmb3JtYXQoCisgICAgICAgICAgICAiRmlsZVNvdXJjZShmZCglcyksICVsbGQsICVsbGQpIiwKKyAgICAgICAgICAgIG5hbWVGb3JGZChmZCkuY19zdHIoKSwKKyAgICAgICAgICAgIChsb25nIGxvbmcpIG1PZmZzZXQsCisgICAgICAgICAgICAobG9uZyBsb25nKSBtTGVuZ3RoKTsKKworfQorCitDbGVhckZpbGVTb3VyY2U6On5DbGVhckZpbGVTb3VyY2UoKSB7CisgICAgaWYgKG1GZCA+PSAwKSB7CisgICAgICAgIDo6Y2xvc2UobUZkKTsKKyAgICAgICAgbUZkID0gLTE7CisgICAgfQorfQorCitzdGF0dXNfdCBDbGVhckZpbGVTb3VyY2U6OmluaXRDaGVjaygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUZkID49IDAgPyBPSyA6IE5PX0lOSVQ7Cit9CisKK3NzaXplX3QgQ2xlYXJGaWxlU291cmNlOjpyZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgaWYgKG1GZCA8IDApIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorCisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBpZiAobUxlbmd0aCA+PSAwKSB7CisgICAgICAgIGlmIChvZmZzZXQgPj0gbUxlbmd0aCkgeworICAgICAgICAgICAgcmV0dXJuIDA7ICAvLyByZWFkIGJleW9uZCBFT0YuCisgICAgICAgIH0KKyAgICAgICAgdWludDY0X3QgbnVtQXZhaWxhYmxlID0gbUxlbmd0aCAtIG9mZnNldDsKKyAgICAgICAgaWYgKCh1aW50NjRfdClzaXplID4gbnVtQXZhaWxhYmxlKSB7CisgICAgICAgICAgICBzaXplID0gbnVtQXZhaWxhYmxlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZWFkQXRfbChvZmZzZXQsIGRhdGEsIHNpemUpOworfQorCitzc2l6ZV90IENsZWFyRmlsZVNvdXJjZTo6cmVhZEF0X2wob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgb2ZmNjRfdCByZXN1bHQgPSBsc2VlazY0KG1GZCwgb2Zmc2V0ICsgbU9mZnNldCwgU0VFS19TRVQpOworICAgIGlmIChyZXN1bHQgPT0gLTEpIHsKKyAgICAgICAgQUxPR0UoInNlZWsgdG8gJWxsZCBmYWlsZWQiLCAobG9uZyBsb25nKShvZmZzZXQgKyBtT2Zmc2V0KSk7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIHJldHVybiA6OnJlYWQobUZkLCBkYXRhLCBzaXplKTsKK30KKworc3RhdHVzX3QgQ2xlYXJGaWxlU291cmNlOjpnZXRTaXplKG9mZjY0X3QgKnNpemUpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgaWYgKG1GZCA8IDApIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorCisgICAgKnNpemUgPSBtTGVuZ3RoOworCisgICAgcmV0dXJuIE9LOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRmlsZVNvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9GaWxlU291cmNlLmNwcAppbmRleCBlZWY1MzE0Li5hZWU3ZmQ4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9GaWxlU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9GaWxlU291cmNlLmNwcApAQCAtMjIsOTAgKzIyLDI4IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRmlsZVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CiAjaW5jbHVkZSA8cHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxmY250bC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIEZpbGVTb3VyY2U6OkZpbGVTb3VyY2UoY29uc3QgY2hhciAqZmlsZW5hbWUpCi0gICAgOiBtRmQoLTEpLAotICAgICAgbU9mZnNldCgwKSwKLSAgICAgIG1MZW5ndGgoLTEpLAotICAgICAgbU5hbWUoIjxudWxsPiIpLAorICAgIDogQ2xlYXJGaWxlU291cmNlKGZpbGVuYW1lKSwKICAgICAgIG1EZWNyeXB0SGFuZGxlKE5VTEwpLAogICAgICAgbURybU1hbmFnZXJDbGllbnQoTlVMTCksCiAgICAgICBtRHJtQnVmT2Zmc2V0KDApLAogICAgICAgbURybUJ1ZlNpemUoMCksCiAgICAgICBtRHJtQnVmKE5VTEwpewotCi0gICAgaWYgKGZpbGVuYW1lKSB7Ci0gICAgICAgIG1OYW1lID0gU3RyaW5nODo6Zm9ybWF0KCJGaWxlU291cmNlKCVzKSIsIGZpbGVuYW1lKTsKLSAgICB9Ci0gICAgQUxPR1YoIiVzIiwgZmlsZW5hbWUpOwotICAgIG1GZCA9IG9wZW4oZmlsZW5hbWUsIE9fTEFSR0VGSUxFIHwgT19SRE9OTFkpOwotCi0gICAgaWYgKG1GZCA+PSAwKSB7Ci0gICAgICAgIG1MZW5ndGggPSBsc2VlazY0KG1GZCwgMCwgU0VFS19FTkQpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gb3BlbiBmaWxlICclcycuICglcykiLCBmaWxlbmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICB9CiB9CiAKIEZpbGVTb3VyY2U6OkZpbGVTb3VyY2UoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpCi0gICAgOiBtRmQoZmQpLAotICAgICAgbU9mZnNldChvZmZzZXQpLAotICAgICAgbUxlbmd0aChsZW5ndGgpLAotICAgICAgbU5hbWUoIjxudWxsPiIpLAorICAgIDogQ2xlYXJGaWxlU291cmNlKGZkLCBvZmZzZXQsIGxlbmd0aCksCiAgICAgICBtRGVjcnlwdEhhbmRsZShOVUxMKSwKICAgICAgIG1Ecm1NYW5hZ2VyQ2xpZW50KE5VTEwpLAogICAgICAgbURybUJ1Zk9mZnNldCgwKSwKICAgICAgIG1Ecm1CdWZTaXplKDApLAogICAgICAgbURybUJ1ZihOVUxMKSB7Ci0gICAgQUxPR1YoImZkPSVkICglcyksIG9mZnNldD0lbGxkLCBsZW5ndGg9JWxsZCIsCi0gICAgICAgICAgICBmZCwgbmFtZUZvckZkKGZkKS5jX3N0cigpLCAobG9uZyBsb25nKSBvZmZzZXQsIChsb25nIGxvbmcpIGxlbmd0aCk7Ci0KLSAgICBpZiAobU9mZnNldCA8IDApIHsKLSAgICAgICAgbU9mZnNldCA9IDA7Ci0gICAgfQotICAgIGlmIChtTGVuZ3RoIDwgMCkgewotICAgICAgICBtTGVuZ3RoID0gMDsKLSAgICB9Ci0gICAgaWYgKG1MZW5ndGggPiBJTlQ2NF9NQVggLSBtT2Zmc2V0KSB7Ci0gICAgICAgIG1MZW5ndGggPSBJTlQ2NF9NQVggLSBtT2Zmc2V0OwotICAgIH0KLSAgICBzdHJ1Y3Qgc3RhdCBzOwotICAgIGlmIChmc3RhdChmZCwgJnMpID09IDApIHsKLSAgICAgICAgaWYgKG1PZmZzZXQgPiBzLnN0X3NpemUpIHsKLSAgICAgICAgICAgIG1PZmZzZXQgPSBzLnN0X3NpemU7Ci0gICAgICAgICAgICBtTGVuZ3RoID0gMDsKLSAgICAgICAgfQotICAgICAgICBpZiAobU9mZnNldCArIG1MZW5ndGggPiBzLnN0X3NpemUpIHsKLSAgICAgICAgICAgIG1MZW5ndGggPSBzLnN0X3NpemUgLSBtT2Zmc2V0OwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChtT2Zmc2V0ICE9IG9mZnNldCB8fCBtTGVuZ3RoICE9IGxlbmd0aCkgewotICAgICAgICBBTE9HVygib2Zmc2V0L2xlbmd0aCBhZGp1c3RlZCBmcm9tICVsbGQvJWxsZCB0byAlbGxkLyVsbGQiLAotICAgICAgICAgICAgICAgIChsb25nIGxvbmcpIG9mZnNldCwgKGxvbmcgbG9uZykgbGVuZ3RoLAotICAgICAgICAgICAgICAgIChsb25nIGxvbmcpIG1PZmZzZXQsIChsb25nIGxvbmcpIG1MZW5ndGgpOwotICAgIH0KLQotICAgIG1OYW1lID0gU3RyaW5nODo6Zm9ybWF0KAotICAgICAgICAgICAgIkZpbGVTb3VyY2UoZmQoJXMpLCAlbGxkLCAlbGxkKSIsCi0gICAgICAgICAgICBuYW1lRm9yRmQoZmQpLmNfc3RyKCksCi0gICAgICAgICAgICAobG9uZyBsb25nKSBtT2Zmc2V0LAotICAgICAgICAgICAgKGxvbmcgbG9uZykgbUxlbmd0aCk7Ci0KIH0KIAogRmlsZVNvdXJjZTo6fkZpbGVTb3VyY2UoKSB7Ci0gICAgaWYgKG1GZCA+PSAwKSB7Ci0gICAgICAgIDo6Y2xvc2UobUZkKTsKLSAgICAgICAgbUZkID0gLTE7Ci0gICAgfQotCiAgICAgaWYgKG1Ecm1CdWYgIT0gTlVMTCkgewogICAgICAgICBkZWxldGVbXSBtRHJtQnVmOwogICAgICAgICBtRHJtQnVmID0gTlVMTDsKQEAgLTEyNCwxMCArNjIsNiBAQAogICAgIH0KIH0KIAotc3RhdHVzX3QgRmlsZVNvdXJjZTo6aW5pdENoZWNrKCkgY29uc3QgewotICAgIHJldHVybiBtRmQgPj0gMCA/IE9LIDogTk9fSU5JVDsKLX0KLQogc3NpemVfdCBGaWxlU291cmNlOjpyZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7CiAgICAgaWYgKG1GZCA8IDApIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CkBAIC0xNDcsMzAgKzgxLDEyIEBACiAKICAgICBpZiAobURlY3J5cHRIYW5kbGUgIT0gTlVMTCAmJiBEZWNyeXB0QXBpVHlwZTo6Q09OVEFJTkVSX0JBU0VECiAgICAgICAgICAgICA9PSBtRGVjcnlwdEhhbmRsZS0+ZGVjcnlwdEFwaVR5cGUpIHsKLSAgICAgICAgcmV0dXJuIHJlYWRBdERSTShvZmZzZXQsIGRhdGEsIHNpemUpOworICAgICAgICByZXR1cm4gcmVhZEF0RFJNX2wob2Zmc2V0LCBkYXRhLCBzaXplKTsKICAgIH0gZWxzZSB7Ci0gICAgICAgIG9mZjY0X3QgcmVzdWx0ID0gbHNlZWs2NChtRmQsIG9mZnNldCArIG1PZmZzZXQsIFNFRUtfU0VUKTsKLSAgICAgICAgaWYgKHJlc3VsdCA9PSAtMSkgewotICAgICAgICAgICAgQUxPR0UoInNlZWsgdG8gJWxsZCBmYWlsZWQiLCAobG9uZyBsb25nKShvZmZzZXQgKyBtT2Zmc2V0KSk7Ci0gICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiA6OnJlYWQobUZkLCBkYXRhLCBzaXplKTsKKyAgICAgICAgcmV0dXJuIHJlYWRBdF9sKG9mZnNldCwgZGF0YSwgc2l6ZSk7CiAgICAgfQogfQogCi1zdGF0dXNfdCBGaWxlU291cmNlOjpnZXRTaXplKG9mZjY0X3QgKnNpemUpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgaWYgKG1GZCA8IDApIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotCi0gICAgKnNpemUgPSBtTGVuZ3RoOwotCi0gICAgcmV0dXJuIE9LOwotfQotCiBzcDxEZWNyeXB0SGFuZGxlPiBGaWxlU291cmNlOjpEcm1Jbml0aWFsaXphdGlvbihjb25zdCBjaGFyICptaW1lKSB7CiAgICAgaWYgKGdldHVpZCgpID09IEFJRF9NRURJQV9FWCkgcmV0dXJuIG51bGxwdHI7IC8vIG5vIERSTSBpbiBtZWRpYSBleHRyYWN0b3IKICAgICBpZiAobURybU1hbmFnZXJDbGllbnQgPT0gTlVMTCkgewpAQCAtMTk0LDcgKzExMCw3IEBACiAgICAgcmV0dXJuIG1EZWNyeXB0SGFuZGxlOwogfQogCi1zc2l6ZV90IEZpbGVTb3VyY2U6OnJlYWRBdERSTShvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKK3NzaXplX3QgRmlsZVNvdXJjZTo6cmVhZEF0RFJNX2wob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7CiAgICAgc2l6ZV90IERSTV9DQUNIRV9TSVpFID0gMTAyNDsKICAgICBpZiAobURybUJ1ZiA9PSBOVUxMKSB7CiAgICAgICAgIG1Ecm1CdWYgPSBuZXcgdW5zaWduZWQgY2hhcltEUk1fQ0FDSEVfU0laRV07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9GcmFtZURlY29kZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRnJhbWVEZWNvZGVyLmNwcAppbmRleCA2ZTk0NTE3Li5jNjJjMDVhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9GcmFtZURlY29kZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0ZyYW1lRGVjb2Rlci5jcHAKQEAgLTUwMSw5ICs1MDEsMTUgQEAKICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICB9CiAKLSAgICBpbnQzMl90IHdpZHRoLCBoZWlnaHQ7Ci0gICAgQ0hFQ0sob3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoIndpZHRoIiwgJndpZHRoKSk7Ci0gICAgQ0hFQ0sob3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoImhlaWdodCIsICZoZWlnaHQpKTsKKyAgICBpbnQzMl90IHdpZHRoLCBoZWlnaHQsIHN0cmlkZSwgc3JjRm9ybWF0OworICAgIGlmICghb3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoIndpZHRoIiwgJndpZHRoKSB8fAorICAgICAgICAgICAgIW91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJoZWlnaHQiLCAmaGVpZ2h0KSB8fAorICAgICAgICAgICAgIW91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJzdHJpZGUiLCAmc3RyaWRlKSB8fAorICAgICAgICAgICAgIW91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJjb2xvci1mb3JtYXQiLCAmc3JjRm9ybWF0KSkgeworICAgICAgICBBTE9HRSgiZm9ybWF0IG1pc3NpbmcgZGltZW5zaW9uIG9yIGNvbG9yOiAlcyIsCisgICAgICAgICAgICAgICAgb3V0cHV0Rm9ybWF0LT5kZWJ1Z1N0cmluZygpLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KIAogICAgIGludDMyX3QgY3JvcF9sZWZ0LCBjcm9wX3RvcCwgY3JvcF9yaWdodCwgY3JvcF9ib3R0b207CiAgICAgaWYgKCFvdXRwdXRGb3JtYXQtPmZpbmRSZWN0KCJjcm9wIiwgJmNyb3BfbGVmdCwgJmNyb3BfdG9wLCAmY3JvcF9yaWdodCwgJmNyb3BfYm90dG9tKSkgewpAQCAtNTIyLDE5ICs1MjgsMjcgQEAKICAgICBhZGRGcmFtZShmcmFtZU1lbSk7CiAgICAgVmlkZW9GcmFtZSogZnJhbWUgPSBzdGF0aWNfY2FzdDxWaWRlb0ZyYW1lKj4oZnJhbWVNZW0tPnBvaW50ZXIoKSk7CiAKLSAgICBpbnQzMl90IHNyY0Zvcm1hdDsKLSAgICBDSEVDSyhvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigiY29sb3ItZm9ybWF0IiwgJnNyY0Zvcm1hdCkpOwotCiAgICAgQ29sb3JDb252ZXJ0ZXIgY29udmVydGVyKChPTVhfQ09MT1JfRk9STUFUVFlQRSlzcmNGb3JtYXQsIGRzdEZvcm1hdCgpKTsKIAorICAgIHVpbnQzMl90IHN0YW5kYXJkLCByYW5nZSwgdHJhbnNmZXI7CisgICAgaWYgKCFvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigiY29sb3Itc3RhbmRhcmQiLCAoaW50MzJfdCopJnN0YW5kYXJkKSkgeworICAgICAgICBzdGFuZGFyZCA9IDA7CisgICAgfQorICAgIGlmICghb3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoImNvbG9yLXJhbmdlIiwgKGludDMyX3QqKSZyYW5nZSkpIHsKKyAgICAgICAgcmFuZ2UgPSAwOworICAgIH0KKyAgICBpZiAoIW91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJjb2xvci10cmFuc2ZlciIsIChpbnQzMl90KikmdHJhbnNmZXIpKSB7CisgICAgICAgIHRyYW5zZmVyID0gMDsKKyAgICB9CisgICAgY29udmVydGVyLnNldFNyY0NvbG9yU3BhY2Uoc3RhbmRhcmQsIHJhbmdlLCB0cmFuc2Zlcik7CisKICAgICBpZiAoY29udmVydGVyLmlzVmFsaWQoKSkgewogICAgICAgICBjb252ZXJ0ZXIuY29udmVydCgKICAgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCAqKXZpZGVvRnJhbWVCdWZmZXItPmRhdGEoKSwKLSAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LAorICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIHN0cmlkZSwKICAgICAgICAgICAgICAgICBjcm9wX2xlZnQsIGNyb3BfdG9wLCBjcm9wX3JpZ2h0LCBjcm9wX2JvdHRvbSwKICAgICAgICAgICAgICAgICBmcmFtZS0+Z2V0RmxhdHRlbmVkRGF0YSgpLAotICAgICAgICAgICAgICAgIGZyYW1lLT5tV2lkdGgsCi0gICAgICAgICAgICAgICAgZnJhbWUtPm1IZWlnaHQsCisgICAgICAgICAgICAgICAgZnJhbWUtPm1XaWR0aCwgZnJhbWUtPm1IZWlnaHQsIGZyYW1lLT5tUm93Qnl0ZXMsCiAgICAgICAgICAgICAgICAgY3JvcF9sZWZ0LCBjcm9wX3RvcCwgY3JvcF9yaWdodCwgY3JvcF9ib3R0b20pOwogICAgICAgICByZXR1cm4gT0s7CiAgICAgfQpAQCAtNjgxLDkgKzY5NSwxMCBAQAogICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgIH0KIAotICAgIGludDMyX3Qgd2lkdGgsIGhlaWdodDsKKyAgICBpbnQzMl90IHdpZHRoLCBoZWlnaHQsIHN0cmlkZTsKICAgICBDSEVDSyhvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigid2lkdGgiLCAmd2lkdGgpKTsKICAgICBDSEVDSyhvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigiaGVpZ2h0IiwgJmhlaWdodCkpOworICAgIENIRUNLKG91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJzdHJpZGUiLCAmc3RyaWRlKSk7CiAKICAgICBpZiAobUZyYW1lID09IE5VTEwpIHsKICAgICAgICAgc3A8SU1lbW9yeT4gZnJhbWVNZW0gPSBhbGxvY1ZpZGVvRnJhbWUoCkBAIC02OTgsNiArNzEzLDE4IEBACiAKICAgICBDb2xvckNvbnZlcnRlciBjb252ZXJ0ZXIoKE9NWF9DT0xPUl9GT1JNQVRUWVBFKXNyY0Zvcm1hdCwgZHN0Rm9ybWF0KCkpOwogCisgICAgdWludDMyX3Qgc3RhbmRhcmQsIHJhbmdlLCB0cmFuc2ZlcjsKKyAgICBpZiAoIW91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJjb2xvci1zdGFuZGFyZCIsIChpbnQzMl90Kikmc3RhbmRhcmQpKSB7CisgICAgICAgIHN0YW5kYXJkID0gMDsKKyAgICB9CisgICAgaWYgKCFvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigiY29sb3ItcmFuZ2UiLCAoaW50MzJfdCopJnJhbmdlKSkgeworICAgICAgICByYW5nZSA9IDA7CisgICAgfQorICAgIGlmICghb3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoImNvbG9yLXRyYW5zZmVyIiwgKGludDMyX3QqKSZ0cmFuc2ZlcikpIHsKKyAgICAgICAgdHJhbnNmZXIgPSAwOworICAgIH0KKyAgICBjb252ZXJ0ZXIuc2V0U3JjQ29sb3JTcGFjZShzdGFuZGFyZCwgcmFuZ2UsIHRyYW5zZmVyKTsKKwogICAgIGludDMyX3QgZHN0TGVmdCwgZHN0VG9wLCBkc3RSaWdodCwgZHN0Qm90dG9tOwogICAgIGRzdExlZnQgPSBtVGlsZXNEZWNvZGVkICUgbUdyaWRDb2xzICogd2lkdGg7CiAgICAgZHN0VG9wID0gbVRpbGVzRGVjb2RlZCAvIG1HcmlkQ29scyAqIGhlaWdodDsKQEAgLTcyNywxMSArNzU0LDEwIEBACiAgICAgaWYgKGNvbnZlcnRlci5pc1ZhbGlkKCkpIHsKICAgICAgICAgY29udmVydGVyLmNvbnZlcnQoCiAgICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKil2aWRlb0ZyYW1lQnVmZmVyLT5kYXRhKCksCi0gICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwKKyAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBzdHJpZGUsCiAgICAgICAgICAgICAgICAgY3JvcF9sZWZ0LCBjcm9wX3RvcCwgY3JvcF9yaWdodCwgY3JvcF9ib3R0b20sCiAgICAgICAgICAgICAgICAgbUZyYW1lLT5nZXRGbGF0dGVuZWREYXRhKCksCi0gICAgICAgICAgICAgICAgbUZyYW1lLT5tV2lkdGgsCi0gICAgICAgICAgICAgICAgbUZyYW1lLT5tSGVpZ2h0LAorICAgICAgICAgICAgICAgIG1GcmFtZS0+bVdpZHRoLCBtRnJhbWUtPm1IZWlnaHQsIG1GcmFtZS0+bVJvd0J5dGVzLAogICAgICAgICAgICAgICAgIGRzdExlZnQsIGRzdFRvcCwgZHN0UmlnaHQsIGRzdEJvdHRvbSk7CiAgICAgICAgIHJldHVybiBPSzsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9IVFRQQmFzZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9IVFRQQmFzZS5jcHAKaW5kZXggMGYyNDMyOS4uMDNlMGQxMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvSFRUUEJhc2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0hUVFBCYXNlLmNwcApAQCAtMTE0LDMwICsxMTQsNCBAQAogICAgIG1NYXhCYW5kd2lkdGhIaXN0b3J5SXRlbXMgPSBudW1IaXN0b3J5SXRlbXM7CiB9CiAKLS8vIHN0YXRpYwotdm9pZCBIVFRQQmFzZTo6UmVnaXN0ZXJTb2NrZXRVc2VyVGFnKGludCBzb2NrZmQsIHVpZF90IHVpZCwgdWludDMyX3Qga1RhZykgewotICAgIGludCByZXMgPSBxdGFndWlkX3RhZ1NvY2tldChzb2NrZmQsIGtUYWcsIHVpZCk7Ci0gICAgaWYgKHJlcyAhPSAwKSB7Ci0gICAgICAgIEFMT0dFKCJGYWlsZWQgdGFnZ2luZyBzb2NrZXQgJWQgZm9yIHVpZCAlZCAoTXkgVUlEPSVkKSIsIHNvY2tmZCwgdWlkLCBnZXRldWlkKCkpOwotICAgIH0KLX0KLQotLy8gc3RhdGljCi12b2lkIEhUVFBCYXNlOjpVblJlZ2lzdGVyU29ja2V0VXNlclRhZyhpbnQgc29ja2ZkKSB7Ci0gICAgaW50IHJlcyA9IHF0YWd1aWRfdW50YWdTb2NrZXQoc29ja2ZkKTsKLSAgICBpZiAocmVzICE9IDApIHsKLSAgICAgICAgQUxPR0UoIkZhaWxlZCB1bnRhZ2dpbmcgc29ja2V0ICVkIChNeSBVSUQ9JWQpIiwgc29ja2ZkLCBnZXRldWlkKCkpOwotICAgIH0KLX0KLQotLy8gc3RhdGljCi12b2lkIEhUVFBCYXNlOjpSZWdpc3RlclNvY2tldFVzZXJNYXJrKGludCBzb2NrZmQsIHVpZF90IHVpZCkgewotICAgIHNldE5ldHdvcmtGb3JVc2VyKHVpZCwgc29ja2ZkKTsKLX0KLQotLy8gc3RhdGljCi12b2lkIEhUVFBCYXNlOjpVblJlZ2lzdGVyU29ja2V0VXNlck1hcmsoaW50IHNvY2tmZCkgewotICAgIFJlZ2lzdGVyU29ja2V0VXNlck1hcmsoc29ja2ZkLCBnZXRldWlkKCkpOwotfQotCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjLmNwcAppbmRleCAxMjBjODY0Li43MDA2NGVhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjLmNwcApAQCAtMjY3NCw3ICsyNjc0LDcgQEAKICAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKIAogICAgICAgICAgICAgaWYgKG1GbGFncyAmIGtGbGFnSXNBc3luYykgewotICAgICAgICAgICAgICAgIEFMT0dFKCJkZXF1ZXVlT3V0cHV0QnVmZmVyIGNhbid0IGJlIHVzZWQgaW4gYXN5bmMgbW9kZSIpOworICAgICAgICAgICAgICAgIEFMT0dFKCJkZXF1ZXVlSW5wdXRCdWZmZXIgY2FuJ3QgYmUgdXNlZCBpbiBhc3luYyBtb2RlIik7CiAgICAgICAgICAgICAgICAgUG9zdFJlcGx5V2l0aEVycm9yKHJlcGx5SUQsIElOVkFMSURfT1BFUkFUSU9OKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzllYjBiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuY3BwCkBAIC0wLDAgKzEsMTM3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJNZWRpYUV4dHJhY3RvciIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDxwd2QuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFGb3JtYXRQcml2Lmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFFcnJvclByaXYuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitNZWRpYUV4dHJhY3Rvcjo6TWVkaWFFeHRyYWN0b3IoKSB7CisgICAgaWYgKCFMT0dfTkRFQlVHKSB7CisgICAgICAgIHVpZF90IHVpZCA9IGdldHVpZCgpOworICAgICAgICBzdHJ1Y3QgcGFzc3dkICpwdyA9IGdldHB3dWlkKHVpZCk7CisgICAgICAgIEFMT0dWKCJleHRyYWN0b3IgY3JlYXRlZCBpbiB1aWQ6ICVkICglcykiLCBnZXR1aWQoKSwgcHctPnB3X25hbWUpOworICAgIH0KK30KKworTWVkaWFFeHRyYWN0b3I6On5NZWRpYUV4dHJhY3RvcigpIHt9CisKK3VpbnQzMl90IE1lZGlhRXh0cmFjdG9yOjpmbGFncygpIGNvbnN0IHsKKyAgICByZXR1cm4gQ0FOX1NFRUtfQkFDS1dBUkQgfCBDQU5fU0VFS19GT1JXQVJEIHwgQ0FOX1BBVVNFIHwgQ0FOX1NFRUs7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitNZWRpYUV4dHJhY3RvckNVbndyYXBwZXJWMTo6TWVkaWFFeHRyYWN0b3JDVW53cmFwcGVyVjEoQ01lZGlhRXh0cmFjdG9yICpwbHVnaW4pIHsKKyAgICB0aGlzLT5wbHVnaW4gPSBwbHVnaW47Cit9CisKK01lZGlhRXh0cmFjdG9yQ1Vud3JhcHBlclYxOjp+TWVkaWFFeHRyYWN0b3JDVW53cmFwcGVyVjEoKSB7CisgICAgcGx1Z2luLT5mcmVlKHBsdWdpbi0+ZGF0YSk7CisgICAgZnJlZShwbHVnaW4pOworfQorCitzaXplX3QgTWVkaWFFeHRyYWN0b3JDVW53cmFwcGVyVjE6OmNvdW50VHJhY2tzKCkgeworICAgIHJldHVybiBwbHVnaW4tPmNvdW50VHJhY2tzKHBsdWdpbi0+ZGF0YSk7Cit9CisKK01lZGlhVHJhY2sgKk1lZGlhRXh0cmFjdG9yQ1Vud3JhcHBlclYxOjpnZXRUcmFjayhzaXplX3QgaW5kZXgpIHsKKyAgICByZXR1cm4gbmV3IE1lZGlhVHJhY2tDVW53cmFwcGVyKHBsdWdpbi0+Z2V0VHJhY2socGx1Z2luLT5kYXRhLCBpbmRleCkpOworfQorCitzdGF0dXNfdCBNZWRpYUV4dHJhY3RvckNVbndyYXBwZXJWMTo6Z2V0VHJhY2tNZXRhRGF0YSgKKyAgICAgICAgTWV0YURhdGFCYXNlJiBtZXRhLCBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKSB7CisgICAgcmV0dXJuIHBsdWdpbi0+Z2V0VHJhY2tNZXRhRGF0YShwbHVnaW4tPmRhdGEsIG1ldGEsIGluZGV4LCBmbGFncyk7Cit9CisKK3N0YXR1c190IE1lZGlhRXh0cmFjdG9yQ1Vud3JhcHBlclYxOjpnZXRNZXRhRGF0YShNZXRhRGF0YUJhc2UmIG1ldGEpIHsKKyAgICByZXR1cm4gcGx1Z2luLT5nZXRNZXRhRGF0YShwbHVnaW4tPmRhdGEsIG1ldGEpOworfQorCitjb25zdCBjaGFyICogTWVkaWFFeHRyYWN0b3JDVW53cmFwcGVyVjE6Om5hbWUoKSB7CisgICAgcmV0dXJuIHBsdWdpbi0+bmFtZShwbHVnaW4tPmRhdGEpOworfQorCit1aW50MzJfdCBNZWRpYUV4dHJhY3RvckNVbndyYXBwZXJWMTo6ZmxhZ3MoKSBjb25zdCB7CisgICAgcmV0dXJuIHBsdWdpbi0+ZmxhZ3MocGx1Z2luLT5kYXRhKTsKK30KKworc3RhdHVzX3QgTWVkaWFFeHRyYWN0b3JDVW53cmFwcGVyVjE6OnNldE1lZGlhQ2FzKGNvbnN0IHVpbnQ4X3QqIGNhc1Rva2VuLCBzaXplX3Qgc2l6ZSkgeworICAgIHJldHVybiBwbHVnaW4tPnNldE1lZGlhQ2FzKHBsdWdpbi0+ZGF0YSwgY2FzVG9rZW4sIHNpemUpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTWVkaWFFeHRyYWN0b3JDVW53cmFwcGVyVjI6Ok1lZGlhRXh0cmFjdG9yQ1Vud3JhcHBlclYyKENNZWRpYUV4dHJhY3RvclYyICpwbHVnaW4pIHsKKyAgICB0aGlzLT5wbHVnaW4gPSBwbHVnaW47Cit9CisKK01lZGlhRXh0cmFjdG9yQ1Vud3JhcHBlclYyOjp+TWVkaWFFeHRyYWN0b3JDVW53cmFwcGVyVjIoKSB7CisgICAgcGx1Z2luLT5mcmVlKHBsdWdpbi0+ZGF0YSk7CisgICAgZnJlZShwbHVnaW4pOworfQorCitzaXplX3QgTWVkaWFFeHRyYWN0b3JDVW53cmFwcGVyVjI6OmNvdW50VHJhY2tzKCkgeworICAgIHJldHVybiBwbHVnaW4tPmNvdW50VHJhY2tzKHBsdWdpbi0+ZGF0YSk7Cit9CisKK01lZGlhVHJhY2sgKk1lZGlhRXh0cmFjdG9yQ1Vud3JhcHBlclYyOjpnZXRUcmFjayhzaXplX3QgaW5kZXgpIHsKKyAgICByZXR1cm4gbmV3IE1lZGlhVHJhY2tDVW53cmFwcGVyVjIocGx1Z2luLT5nZXRUcmFjayhwbHVnaW4tPmRhdGEsIGluZGV4KSk7Cit9CisKK3N0YXR1c190IE1lZGlhRXh0cmFjdG9yQ1Vud3JhcHBlclYyOjpnZXRUcmFja01ldGFEYXRhKAorICAgICAgICBNZXRhRGF0YUJhc2UmIG1ldGEsIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpIHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKCk7CisgICAgQU1lZGlhRm9ybWF0ICpmb3JtYXQgPSAgQU1lZGlhRm9ybWF0X2Zyb21Nc2coJm1zZyk7CisgICAgbWVkaWFfc3RhdHVzX3QgcmV0ID0gcGx1Z2luLT5nZXRUcmFja01ldGFEYXRhKHBsdWdpbi0+ZGF0YSwgZm9ybWF0LCBpbmRleCwgZmxhZ3MpOworICAgIHNwPE1ldGFEYXRhPiBuZXdNZXRhID0gbmV3IE1ldGFEYXRhKCk7CisgICAgY29udmVydE1lc3NhZ2VUb01ldGFEYXRhKG1zZywgbmV3TWV0YSk7CisgICAgZGVsZXRlIGZvcm1hdDsKKyAgICBtZXRhID0gKm5ld01ldGE7CisgICAgcmV0dXJuIHJldmVyc2VfdHJhbnNsYXRlX2Vycm9yKHJldCk7Cit9CisKK3N0YXR1c190IE1lZGlhRXh0cmFjdG9yQ1Vud3JhcHBlclYyOjpnZXRNZXRhRGF0YShNZXRhRGF0YUJhc2UmIG1ldGEpIHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKCk7CisgICAgQU1lZGlhRm9ybWF0ICpmb3JtYXQgPSAgQU1lZGlhRm9ybWF0X2Zyb21Nc2coJm1zZyk7CisgICAgbWVkaWFfc3RhdHVzX3QgcmV0ID0gcGx1Z2luLT5nZXRNZXRhRGF0YShwbHVnaW4tPmRhdGEsIGZvcm1hdCk7CisgICAgc3A8TWV0YURhdGE+IG5ld01ldGEgPSBuZXcgTWV0YURhdGEoKTsKKyAgICBjb252ZXJ0TWVzc2FnZVRvTWV0YURhdGEobXNnLCBuZXdNZXRhKTsKKyAgICBkZWxldGUgZm9ybWF0OworICAgIG1ldGEgPSAqbmV3TWV0YTsKKyAgICByZXR1cm4gcmV2ZXJzZV90cmFuc2xhdGVfZXJyb3IocmV0KTsKK30KKworY29uc3QgY2hhciAqIE1lZGlhRXh0cmFjdG9yQ1Vud3JhcHBlclYyOjpuYW1lKCkgeworICAgIHJldHVybiBwbHVnaW4tPm5hbWUocGx1Z2luLT5kYXRhKTsKK30KKwordWludDMyX3QgTWVkaWFFeHRyYWN0b3JDVW53cmFwcGVyVjI6OmZsYWdzKCkgY29uc3QgeworICAgIHJldHVybiBwbHVnaW4tPmZsYWdzKHBsdWdpbi0+ZGF0YSk7Cit9CisKK3N0YXR1c190IE1lZGlhRXh0cmFjdG9yQ1Vud3JhcHBlclYyOjpzZXRNZWRpYUNhcyhjb25zdCB1aW50OF90KiBjYXNUb2tlbiwgc2l6ZV90IHNpemUpIHsKKyAgICByZXR1cm4gcGx1Z2luLT5zZXRNZWRpYUNhcyhwbHVnaW4tPmRhdGEsIGNhc1Rva2VuLCBzaXplKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yRmFjdG9yeS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUV4dHJhY3RvckZhY3RvcnkuY3BwCmluZGV4IDA2YWVkYjcuLjhmMWRkMzYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yRmFjdG9yeS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3JGYWN0b3J5LmNwcApAQCAtMjEsOSArMjEsOSBAQAogI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFBbmFseXRpY3NJdGVtLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3IuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvSW50ZXJmYWNlVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yRmFjdG9yeS5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUV4dHJhY3Rvci5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUV4dHJhY3RvclNlcnZpY2UuaD4KQEAgLTc0LDI1ICs3NCwzNiBAQAogICAgIHNvdXJjZS0+RHJtSW5pdGlhbGl6YXRpb24obnVsbHB0ciAvKiBtaW1lICovKTsKIAogICAgIHZvaWQgKm1ldGEgPSBudWxscHRyOwotICAgIE1lZGlhRXh0cmFjdG9yOjpDcmVhdG9yRnVuYyBjcmVhdG9yID0gTlVMTDsKLSAgICBNZWRpYUV4dHJhY3Rvcjo6RnJlZU1ldGFGdW5jIGZyZWVNZXRhID0gbnVsbHB0cjsKKyAgICB2b2lkICpjcmVhdG9yID0gTlVMTDsKKyAgICBGcmVlTWV0YUZ1bmMgZnJlZU1ldGEgPSBudWxscHRyOwogICAgIGZsb2F0IGNvbmZpZGVuY2U7CiAgICAgc3A8RXh0cmFjdG9yUGx1Z2luPiBwbHVnaW47Ci0gICAgY3JlYXRvciA9IHNuaWZmKHNvdXJjZS5nZXQoKSwgJmNvbmZpZGVuY2UsICZtZXRhLCAmZnJlZU1ldGEsIHBsdWdpbik7CisgICAgdWludDMyX3QgY3JlYXRvclZlcnNpb24gPSAwOworICAgIGNyZWF0b3IgPSBzbmlmZihzb3VyY2UsICZjb25maWRlbmNlLCAmbWV0YSwgJmZyZWVNZXRhLCBwbHVnaW4sICZjcmVhdG9yVmVyc2lvbik7CiAgICAgaWYgKCFjcmVhdG9yKSB7CiAgICAgICAgIEFMT0dWKCJGQUlMRUQgdG8gYXV0b2RldGVjdCBtZWRpYSBjb250ZW50LiIpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKLSAgICBNZWRpYUV4dHJhY3RvciAqcmV0ID0gY3JlYXRvcihzb3VyY2UuZ2V0KCksIG1ldGEpOwotICAgIGlmIChtZXRhICE9IG51bGxwdHIgJiYgZnJlZU1ldGEgIT0gbnVsbHB0cikgewotICAgICAgICBmcmVlTWV0YShtZXRhKTsKKyAgICBNZWRpYUV4dHJhY3RvciAqZXggPSBudWxscHRyOworICAgIGlmIChjcmVhdG9yVmVyc2lvbiA9PSAxKSB7CisgICAgICAgIENNZWRpYUV4dHJhY3RvciAqcmV0ID0gKChDcmVhdG9yRnVuY1YxKWNyZWF0b3IpKHNvdXJjZS0+d3JhcCgpLCBtZXRhKTsKKyAgICAgICAgaWYgKG1ldGEgIT0gbnVsbHB0ciAmJiBmcmVlTWV0YSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBmcmVlTWV0YShtZXRhKTsKKyAgICAgICAgfQorICAgICAgICBleCA9IHJldCAhPSBudWxscHRyID8gbmV3IE1lZGlhRXh0cmFjdG9yQ1Vud3JhcHBlclYxKHJldCkgOiBudWxscHRyOworICAgIH0gZWxzZSBpZiAoY3JlYXRvclZlcnNpb24gPT0gMikgeworICAgICAgICBDTWVkaWFFeHRyYWN0b3JWMiAqcmV0ID0gKChDcmVhdG9yRnVuY1YyKWNyZWF0b3IpKHNvdXJjZS0+d3JhcCgpLCBtZXRhKTsKKyAgICAgICAgaWYgKG1ldGEgIT0gbnVsbHB0ciAmJiBmcmVlTWV0YSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBmcmVlTWV0YShtZXRhKTsKKyAgICAgICAgfQorICAgICAgICBleCA9IHJldCAhPSBudWxscHRyID8gbmV3IE1lZGlhRXh0cmFjdG9yQ1Vud3JhcHBlclYyKHJldCkgOiBudWxscHRyOwogICAgIH0KIAogICAgIEFMT0dWKCJDcmVhdGVkIGFuIGV4dHJhY3RvciAnJXMnIHdpdGggY29uZmlkZW5jZSAlLjJmIiwKLSAgICAgICAgIHJldCAhPSBudWxscHRyID8gcmV0LT5uYW1lKCkgOiAiPG51bGw+IiwgY29uZmlkZW5jZSk7CisgICAgICAgICBleCAhPSBudWxscHRyID8gZXgtPm5hbWUoKSA6ICI8bnVsbD4iLCBjb25maWRlbmNlKTsKIAotICAgIHJldHVybiBDcmVhdGVJTWVkaWFFeHRyYWN0b3JGcm9tTWVkaWFFeHRyYWN0b3IocmV0LCBzb3VyY2UsIHBsdWdpbik7CisgICAgcmV0dXJuIENyZWF0ZUlNZWRpYUV4dHJhY3RvckZyb21NZWRpYUV4dHJhY3RvcihleCwgc291cmNlLCBwbHVnaW4pOwogfQogCiAvL3N0YXRpYwpAQCAtMTAzLDE0ICsxMTQsMTQgQEAKIH0KIAogc3RydWN0IEV4dHJhY3RvclBsdWdpbiA6IHB1YmxpYyBSZWZCYXNlIHsKLSAgICBNZWRpYUV4dHJhY3Rvcjo6RXh0cmFjdG9yRGVmIGRlZjsKKyAgICBFeHRyYWN0b3JEZWYgZGVmOwogICAgIHZvaWQgKmxpYkhhbmRsZTsKICAgICBTdHJpbmc4IGxpYlBhdGg7CiAgICAgU3RyaW5nOCB1dWlkU3RyaW5nOwogCi0gICAgRXh0cmFjdG9yUGx1Z2luKE1lZGlhRXh0cmFjdG9yOjpFeHRyYWN0b3JEZWYgZGVmaW5pdGlvbiwgdm9pZCAqaGFuZGxlLCBTdHJpbmc4ICZwYXRoKQorICAgIEV4dHJhY3RvclBsdWdpbihFeHRyYWN0b3JEZWYgZGVmaW5pdGlvbiwgdm9pZCAqaGFuZGxlLCBTdHJpbmc4ICZwYXRoKQogICAgICAgICA6IGRlZihkZWZpbml0aW9uKSwgbGliSGFuZGxlKGhhbmRsZSksIGxpYlBhdGgocGF0aCkgewotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemVvZiBNZWRpYUV4dHJhY3Rvcjo6RXh0cmFjdG9yRGVmOjpleHRyYWN0b3JfdXVpZDsgaSsrKSB7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZW9mIEV4dHJhY3RvckRlZjo6ZXh0cmFjdG9yX3V1aWQ7IGkrKykgewogICAgICAgICAgICAgdXVpZFN0cmluZy5hcHBlbmRGb3JtYXQoIiUwMngiLCBkZWYuZXh0cmFjdG9yX3V1aWQuYltpXSk7CiAgICAgICAgIH0KICAgICB9CkBAIC0xMjMsMTcgKzEzNCwxOCBAQAogfTsKIAogTXV0ZXggTWVkaWFFeHRyYWN0b3JGYWN0b3J5OjpnUGx1Z2luTXV0ZXg7Ci1zdGQ6OnNoYXJlZF9wdHI8TGlzdDxzcDxFeHRyYWN0b3JQbHVnaW4+Pj4gTWVkaWFFeHRyYWN0b3JGYWN0b3J5OjpnUGx1Z2luczsKK3N0ZDo6c2hhcmVkX3B0cjxzdGQ6Omxpc3Q8c3A8RXh0cmFjdG9yUGx1Z2luPj4+IE1lZGlhRXh0cmFjdG9yRmFjdG9yeTo6Z1BsdWdpbnM7CiBib29sIE1lZGlhRXh0cmFjdG9yRmFjdG9yeTo6Z1BsdWdpbnNSZWdpc3RlcmVkID0gZmFsc2U7Citib29sIE1lZGlhRXh0cmFjdG9yRmFjdG9yeTo6Z0lnbm9yZVZlcnNpb24gPSBmYWxzZTsKIAogLy8gc3RhdGljCi1NZWRpYUV4dHJhY3Rvcjo6Q3JlYXRvckZ1bmMgTWVkaWFFeHRyYWN0b3JGYWN0b3J5OjpzbmlmZigKLSAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgZmxvYXQgKmNvbmZpZGVuY2UsIHZvaWQgKiptZXRhLAotICAgICAgICBNZWRpYUV4dHJhY3Rvcjo6RnJlZU1ldGFGdW5jICpmcmVlTWV0YSwgc3A8RXh0cmFjdG9yUGx1Z2luPiAmcGx1Z2luKSB7Cit2b2lkICpNZWRpYUV4dHJhY3RvckZhY3Rvcnk6OnNuaWZmKAorICAgICAgICBjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSwgdm9pZCAqKm1ldGEsCisgICAgICAgIEZyZWVNZXRhRnVuYyAqZnJlZU1ldGEsIHNwPEV4dHJhY3RvclBsdWdpbj4gJnBsdWdpbiwgdWludDMyX3QgKmNyZWF0b3JWZXJzaW9uKSB7CiAgICAgKmNvbmZpZGVuY2UgPSAwLjBmOwogICAgICptZXRhID0gbnVsbHB0cjsKIAotICAgIHN0ZDo6c2hhcmVkX3B0cjxMaXN0PHNwPEV4dHJhY3RvclBsdWdpbj4+PiBwbHVnaW5zOworICAgIHN0ZDo6c2hhcmVkX3B0cjxzdGQ6Omxpc3Q8c3A8RXh0cmFjdG9yUGx1Z2luPj4+IHBsdWdpbnM7CiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2soZ1BsdWdpbk11dGV4KTsKICAgICAgICAgaWYgKCFnUGx1Z2luc1JlZ2lzdGVyZWQpIHsKQEAgLTE0MiwxMyArMTU0LDIzIEBACiAgICAgICAgIHBsdWdpbnMgPSBnUGx1Z2luczsKICAgICB9CiAKLSAgICBNZWRpYUV4dHJhY3Rvcjo6Q3JlYXRvckZ1bmMgY3VyQ3JlYXRvciA9IE5VTEw7Ci0gICAgTWVkaWFFeHRyYWN0b3I6OkNyZWF0b3JGdW5jIGJlc3RDcmVhdG9yID0gTlVMTDsKKyAgICB2b2lkICpiZXN0Q3JlYXRvciA9IE5VTEw7CiAgICAgZm9yIChhdXRvIGl0ID0gcGx1Z2lucy0+YmVnaW4oKTsgaXQgIT0gcGx1Z2lucy0+ZW5kKCk7ICsraXQpIHsKKyAgICAgICAgQUxPR1YoInNuaWZmaW5nICVzIiwgKCppdCktPmRlZi5leHRyYWN0b3JfbmFtZSk7CiAgICAgICAgIGZsb2F0IG5ld0NvbmZpZGVuY2U7CiAgICAgICAgIHZvaWQgKm5ld01ldGEgPSBudWxscHRyOwotICAgICAgICBNZWRpYUV4dHJhY3Rvcjo6RnJlZU1ldGFGdW5jIG5ld0ZyZWVNZXRhID0gbnVsbHB0cjsKLSAgICAgICAgaWYgKChjdXJDcmVhdG9yID0gKCppdCktPmRlZi5zbmlmZihzb3VyY2UsICZuZXdDb25maWRlbmNlLCAmbmV3TWV0YSwgJm5ld0ZyZWVNZXRhKSkpIHsKKyAgICAgICAgRnJlZU1ldGFGdW5jIG5ld0ZyZWVNZXRhID0gbnVsbHB0cjsKKworICAgICAgICB2b2lkICpjdXJDcmVhdG9yID0gTlVMTDsKKyAgICAgICAgaWYgKCgqaXQpLT5kZWYuZGVmX3ZlcnNpb24gPT0gMSkgeworICAgICAgICAgICAgY3VyQ3JlYXRvciA9ICh2b2lkKikgKCppdCktPmRlZi5zbmlmZi52MSgKKyAgICAgICAgICAgICAgICAgICAgc291cmNlLT53cmFwKCksICZuZXdDb25maWRlbmNlLCAmbmV3TWV0YSwgJm5ld0ZyZWVNZXRhKTsKKyAgICAgICAgfSBlbHNlIGlmICgoKml0KS0+ZGVmLmRlZl92ZXJzaW9uID09IDIpIHsKKyAgICAgICAgICAgIGN1ckNyZWF0b3IgPSAodm9pZCopICgqaXQpLT5kZWYuc25pZmYudjIoCisgICAgICAgICAgICAgICAgICAgIHNvdXJjZS0+d3JhcCgpLCAmbmV3Q29uZmlkZW5jZSwgJm5ld01ldGEsICZuZXdGcmVlTWV0YSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY3VyQ3JlYXRvcikgewogICAgICAgICAgICAgaWYgKG5ld0NvbmZpZGVuY2UgPiAqY29uZmlkZW5jZSkgewogICAgICAgICAgICAgICAgICpjb25maWRlbmNlID0gbmV3Q29uZmlkZW5jZTsKICAgICAgICAgICAgICAgICBpZiAoKm1ldGEgIT0gbnVsbHB0ciAmJiAqZnJlZU1ldGEgIT0gbnVsbHB0cikgewpAQCAtMTU4LDYgKzE4MCw3IEBACiAgICAgICAgICAgICAgICAgKmZyZWVNZXRhID0gbmV3RnJlZU1ldGE7CiAgICAgICAgICAgICAgICAgcGx1Z2luID0gKml0OwogICAgICAgICAgICAgICAgIGJlc3RDcmVhdG9yID0gY3VyQ3JlYXRvcjsKKyAgICAgICAgICAgICAgICAqY3JlYXRvclZlcnNpb24gPSAoKml0KS0+ZGVmLmRlZl92ZXJzaW9uOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBpZiAobmV3TWV0YSAhPSBudWxscHRyICYmIG5ld0ZyZWVNZXRhICE9IG51bGxwdHIpIHsKICAgICAgICAgICAgICAgICAgICAgbmV3RnJlZU1ldGEobmV3TWV0YSk7CkBAIC0xNzEsMTAgKzE5NCwxMCBAQAogCiAvLyBzdGF0aWMKIHZvaWQgTWVkaWFFeHRyYWN0b3JGYWN0b3J5OjpSZWdpc3RlckV4dHJhY3Rvcihjb25zdCBzcDxFeHRyYWN0b3JQbHVnaW4+ICZwbHVnaW4sCi0gICAgICAgIExpc3Q8c3A8RXh0cmFjdG9yUGx1Z2luPj4gJnBsdWdpbkxpc3QpIHsKKyAgICAgICAgc3RkOjpsaXN0PHNwPEV4dHJhY3RvclBsdWdpbj4+ICZwbHVnaW5MaXN0KSB7CiAgICAgLy8gc2FuaXR5IGNoZWNrIGNoZWNrIHN0cnVjdCB2ZXJzaW9uLCB1dWlkLCBuYW1lCiAgICAgaWYgKHBsdWdpbi0+ZGVmLmRlZl92ZXJzaW9uID09IDAKLSAgICAgICAgICAgIHx8IHBsdWdpbi0+ZGVmLmRlZl92ZXJzaW9uID4gTWVkaWFFeHRyYWN0b3I6OkVYVFJBQ1RPUkRFRl9WRVJTSU9OKSB7CisgICAgICAgICAgICB8fCBwbHVnaW4tPmRlZi5kZWZfdmVyc2lvbiA+IEVYVFJBQ1RPUkRFRl9WRVJTSU9OX0NVUlJFTlQpIHsKICAgICAgICAgQUxPR0UoImRvbid0IHVuZGVyc3RhbmQgZXh0cmFjdG9yIGZvcm1hdCAldSwgaWdub3JpbmcuIiwgcGx1Z2luLT5kZWYuZGVmX3ZlcnNpb24pOwogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtMTkwLDcgKzIxMyw3IEBACiAgICAgZm9yIChhdXRvIGl0ID0gcGx1Z2luTGlzdC5iZWdpbigpOyBpdCAhPSBwbHVnaW5MaXN0LmVuZCgpOyArK2l0KSB7CiAgICAgICAgIGlmIChtZW1jbXAoJigoKml0KS0+ZGVmLmV4dHJhY3Rvcl91dWlkKSwgJnBsdWdpbi0+ZGVmLmV4dHJhY3Rvcl91dWlkLCAxNikgPT0gMCkgewogICAgICAgICAgICAgLy8gdGhlcmUncyBhbHJlYWR5IGFuIGV4dHJhY3RvciB3aXRoIHRoZSBzYW1lIHV1aWQKLSAgICAgICAgICAgIGlmICgoKml0KS0+ZGVmLmV4dHJhY3Rvcl92ZXJzaW9uIDwgcGx1Z2luLT5kZWYuZXh0cmFjdG9yX3ZlcnNpb24pIHsKKyAgICAgICAgICAgIGlmIChnSWdub3JlVmVyc2lvbiB8fCAoKml0KS0+ZGVmLmV4dHJhY3Rvcl92ZXJzaW9uIDwgcGx1Z2luLT5kZWYuZXh0cmFjdG9yX3ZlcnNpb24pIHsKICAgICAgICAgICAgICAgICAvLyB0aGlzIG9uZSBpcyBuZXdlciwgcmVwbGFjZSB0aGUgb2xkIG9uZQogICAgICAgICAgICAgICAgIEFMT0dXKCJyZXBsYWNpbmcgZXh0cmFjdG9yICclcycgdmVyc2lvbiAldSB3aXRoIHZlcnNpb24gJXUiLAogICAgICAgICAgICAgICAgICAgICAgICAgcGx1Z2luLT5kZWYuZXh0cmFjdG9yX25hbWUsCkBAIC0yMTMsNyArMjM2LDcgQEAKIAogLy9zdGF0aWMKIHZvaWQgTWVkaWFFeHRyYWN0b3JGYWN0b3J5OjpSZWdpc3RlckV4dHJhY3RvcnNJbkFwaygKLSAgICAgICAgY29uc3QgY2hhciAqYXBrUGF0aCwgTGlzdDxzcDxFeHRyYWN0b3JQbHVnaW4+PiAmcGx1Z2luTGlzdCkgeworICAgICAgICBjb25zdCBjaGFyICphcGtQYXRoLCBzdGQ6Omxpc3Q8c3A8RXh0cmFjdG9yUGx1Z2luPj4gJnBsdWdpbkxpc3QpIHsKICAgICBBTE9HVigic2VhcmNoIGZvciBwbHVnaW5zIGF0ICVzIiwgYXBrUGF0aCk7CiAgICAgWmlwQXJjaGl2ZUhhbmRsZSB6aXBIYW5kbGU7CiAgICAgaW50MzJfdCByZXQgPSBPcGVuQXJjaGl2ZShhcGtQYXRoLCAmemlwSGFuZGxlKTsKQEAgLTIzNSw4ICsyNTgsOCBAQAogICAgICAgICAgICAgICAgIC8vIHdpdGhpbiB0aGUgYXBrIGluc3RlYWQgb2Ygc3lzdGVtIGxpYnJhcmllcyBhbHJlYWR5IGxvYWRlZC4KICAgICAgICAgICAgICAgICB2b2lkICpsaWJIYW5kbGUgPSBkbG9wZW4obGliUGF0aC5zdHJpbmcoKSwgUlRMRF9OT1cgfCBSVExEX0xPQ0FMKTsKICAgICAgICAgICAgICAgICBpZiAobGliSGFuZGxlKSB7Ci0gICAgICAgICAgICAgICAgICAgIE1lZGlhRXh0cmFjdG9yOjpHZXRFeHRyYWN0b3JEZWYgZ2V0RGVmID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChNZWRpYUV4dHJhY3Rvcjo6R2V0RXh0cmFjdG9yRGVmKSBkbHN5bShsaWJIYW5kbGUsICJHRVRFWFRSQUNUT1JERUYiKTsKKyAgICAgICAgICAgICAgICAgICAgR2V0RXh0cmFjdG9yRGVmIGdldERlZiA9CisgICAgICAgICAgICAgICAgICAgICAgICAoR2V0RXh0cmFjdG9yRGVmKSBkbHN5bShsaWJIYW5kbGUsICJHRVRFWFRSQUNUT1JERUYiKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKGdldERlZikgewogICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoInJlZ2lzdGVyaW5nIHNuaWZmZXIgZm9yICVzIiwgbGliUGF0aC5zdHJpbmcoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBSZWdpc3RlckV4dHJhY3RvcigKQEAgLTI2MSwxNyArMjg0LDIwIEBACiAKIC8vc3RhdGljCiB2b2lkIE1lZGlhRXh0cmFjdG9yRmFjdG9yeTo6UmVnaXN0ZXJFeHRyYWN0b3JzSW5TeXN0ZW0oCi0gICAgICAgIGNvbnN0IGNoYXIgKmxpYkRpclBhdGgsIExpc3Q8c3A8RXh0cmFjdG9yUGx1Z2luPj4gJnBsdWdpbkxpc3QpIHsKKyAgICAgICAgY29uc3QgY2hhciAqbGliRGlyUGF0aCwgc3RkOjpsaXN0PHNwPEV4dHJhY3RvclBsdWdpbj4+ICZwbHVnaW5MaXN0KSB7CiAgICAgQUxPR1YoInNlYXJjaCBmb3IgcGx1Z2lucyBhdCAlcyIsIGxpYkRpclBhdGgpOwogICAgIERJUiAqbGliRGlyID0gb3BlbmRpcihsaWJEaXJQYXRoKTsKICAgICBpZiAobGliRGlyKSB7CiAgICAgICAgIHN0cnVjdCBkaXJlbnQqIGxpYkVudHJ5OwogICAgICAgICB3aGlsZSAoKGxpYkVudHJ5ID0gcmVhZGRpcihsaWJEaXIpKSkgeworICAgICAgICAgICAgaWYgKGxpYkVudHJ5LT5kX25hbWVbMF0gPT0gJy4nKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBTdHJpbmc4IGxpYlBhdGggPSBTdHJpbmc4KGxpYkRpclBhdGgpICsgIi8iICsgbGliRW50cnktPmRfbmFtZTsKICAgICAgICAgICAgIHZvaWQgKmxpYkhhbmRsZSA9IGRsb3BlbihsaWJQYXRoLnN0cmluZygpLCBSVExEX05PVyB8IFJUTERfTE9DQUwpOwogICAgICAgICAgICAgaWYgKGxpYkhhbmRsZSkgewotICAgICAgICAgICAgICAgIE1lZGlhRXh0cmFjdG9yOjpHZXRFeHRyYWN0b3JEZWYgZ2V0RGVmID0KLSAgICAgICAgICAgICAgICAgICAgKE1lZGlhRXh0cmFjdG9yOjpHZXRFeHRyYWN0b3JEZWYpIGRsc3ltKGxpYkhhbmRsZSwgIkdFVEVYVFJBQ1RPUkRFRiIpOworICAgICAgICAgICAgICAgIEdldEV4dHJhY3RvckRlZiBnZXREZWYgPQorICAgICAgICAgICAgICAgICAgICAoR2V0RXh0cmFjdG9yRGVmKSBkbHN5bShsaWJIYW5kbGUsICJHRVRFWFRSQUNUT1JERUYiKTsKICAgICAgICAgICAgICAgICBpZiAoZ2V0RGVmKSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJyZWdpc3RlcmluZyBzbmlmZmVyIGZvciAlcyIsIGxpYlBhdGguc3RyaW5nKCkpOwogICAgICAgICAgICAgICAgICAgICBSZWdpc3RlckV4dHJhY3RvcigKQEAgLTI5MSw2ICszMTcsMTAgQEAKICAgICB9CiB9CiAKK3N0YXRpYyBib29sIGNvbXBhcmVGdW5jKGNvbnN0IHNwPEV4dHJhY3RvclBsdWdpbj4mIGZpcnN0LCBjb25zdCBzcDxFeHRyYWN0b3JQbHVnaW4+JiBzZWNvbmQpIHsKKyAgICByZXR1cm4gc3RyY21wKGZpcnN0LT5kZWYuZXh0cmFjdG9yX25hbWUsIHNlY29uZC0+ZGVmLmV4dHJhY3Rvcl9uYW1lKSA8IDA7Cit9CisKIC8vIHN0YXRpYwogdm9pZCBNZWRpYUV4dHJhY3RvckZhY3Rvcnk6OlVwZGF0ZUV4dHJhY3RvcnMoY29uc3QgY2hhciAqbmV3VXBkYXRlQXBrUGF0aCkgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhnUGx1Z2luTXV0ZXgpOwpAQCAtMzAxLDcgKzMzMSw5IEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBzdGQ6OnNoYXJlZF9wdHI8TGlzdDxzcDxFeHRyYWN0b3JQbHVnaW4+Pj4gbmV3TGlzdChuZXcgTGlzdDxzcDxFeHRyYWN0b3JQbHVnaW4+PigpKTsKKyAgICBnSWdub3JlVmVyc2lvbiA9IHByb3BlcnR5X2dldF9ib29sKCJkZWJ1Zy5leHRyYWN0b3IuaWdub3JlX3ZlcnNpb24iLCBmYWxzZSk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8c3RkOjpsaXN0PHNwPEV4dHJhY3RvclBsdWdpbj4+PiBuZXdMaXN0KG5ldyBzdGQ6Omxpc3Q8c3A8RXh0cmFjdG9yUGx1Z2luPj4oKSk7CiAKICAgICBSZWdpc3RlckV4dHJhY3RvcnNJblN5c3RlbSgiL3N5c3RlbS9saWIiCiAjaWZkZWYgX19MUDY0X18KQEAgLTMxMyw2ICszNDUsNyBAQAogICAgICAgICBSZWdpc3RlckV4dHJhY3RvcnNJbkFwayhuZXdVcGRhdGVBcGtQYXRoLCAqbmV3TGlzdCk7CiAgICAgfQogCisgICAgbmV3TGlzdC0+c29ydChjb21wYXJlRnVuYyk7CiAgICAgZ1BsdWdpbnMgPSBuZXdMaXN0OwogICAgIGdQbHVnaW5zUmVnaXN0ZXJlZCA9IHRydWU7CiB9CkBAIC0zMjMsOCArMzU2LDkgQEAKICAgICBvdXQuYXBwZW5kKCJBdmFpbGFibGUgZXh0cmFjdG9yczpcbiIpOwogICAgIGlmIChnUGx1Z2luc1JlZ2lzdGVyZWQpIHsKICAgICAgICAgZm9yIChhdXRvIGl0ID0gZ1BsdWdpbnMtPmJlZ2luKCk7IGl0ICE9IGdQbHVnaW5zLT5lbmQoKTsgKytpdCkgewotICAgICAgICAgICAgb3V0LmFwcGVuZEZvcm1hdCgiICAlMjVzOiB1dWlkKCVzKSwgdmVyc2lvbigldSksIHBhdGgoJXMpXG4iLAorICAgICAgICAgICAgb3V0LmFwcGVuZEZvcm1hdCgiICAlMjVzOiBwbHVnaW5fdmVyc2lvbiglZCksIHV1aWQoJXMpLCB2ZXJzaW9uKCV1KSwgcGF0aCglcylcbiIsCiAgICAgICAgICAgICAgICAgICAgICgqaXQpLT5kZWYuZXh0cmFjdG9yX25hbWUsCisgICAgICAgICAgICAgICAgICAgICgqaXQpLT5kZWYuZGVmX3ZlcnNpb24sCiAgICAgICAgICAgICAgICAgICAgICgqaXQpLT51dWlkU3RyaW5nLmNfc3RyKCksCiAgICAgICAgICAgICAgICAgICAgICgqaXQpLT5kZWYuZXh0cmFjdG9yX3ZlcnNpb24sCiAgICAgICAgICAgICAgICAgICAgICgqaXQpLT5saWJQYXRoLmNfc3RyKCkpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFUcmFjay5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYVRyYWNrLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjE2MDVkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFUcmFjay5jcHAKQEAgLTAsMCArMSwxNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8bXV0ZXg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KKworI2luY2x1ZGUgPG1lZGlhL01lZGlhVHJhY2suaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkFwaS5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRXJyb3JQcml2Lmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFGb3JtYXRQcml2Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworTWVkaWFUcmFjazo6TWVkaWFUcmFjaygpIHt9CisKK01lZGlhVHJhY2s6On5NZWRpYVRyYWNrKCkge30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordm9pZCBNZWRpYVRyYWNrOjpSZWFkT3B0aW9uczo6c2V0Tm9uQmxvY2tpbmcoKSB7CisgICAgbU5vbkJsb2NraW5nID0gdHJ1ZTsKK30KKwordm9pZCBNZWRpYVRyYWNrOjpSZWFkT3B0aW9uczo6Y2xlYXJOb25CbG9ja2luZygpIHsKKyAgICBtTm9uQmxvY2tpbmcgPSBmYWxzZTsKK30KKworYm9vbCBNZWRpYVRyYWNrOjpSZWFkT3B0aW9uczo6Z2V0Tm9uQmxvY2tpbmcoKSBjb25zdCB7CisgICAgcmV0dXJuIG1Ob25CbG9ja2luZzsKK30KKwordm9pZCBNZWRpYVRyYWNrOjpSZWFkT3B0aW9uczo6c2V0U2Vla1RvKGludDY0X3QgdGltZV91cywgU2Vla01vZGUgbW9kZSkgeworICAgIG1PcHRpb25zIHw9IGtTZWVrVG9fT3B0aW9uOworICAgIG1TZWVrVGltZVVzID0gdGltZV91czsKKyAgICBtU2Vla01vZGUgPSBtb2RlOworfQorCitib29sIE1lZGlhVHJhY2s6OlJlYWRPcHRpb25zOjpnZXRTZWVrVG8oCisgICAgICAgIGludDY0X3QgKnRpbWVfdXMsIFNlZWtNb2RlICptb2RlKSBjb25zdCB7CisgICAgKnRpbWVfdXMgPSBtU2Vla1RpbWVVczsKKyAgICAqbW9kZSA9IG1TZWVrTW9kZTsKKyAgICByZXR1cm4gKG1PcHRpb25zICYga1NlZWtUb19PcHRpb24pICE9IDA7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tIHVud3JhcHBlciB2MSAtLS0tLS0tLS0tLS0tLS0gKi8KKworTWVkaWFUcmFja0NVbndyYXBwZXI6Ok1lZGlhVHJhY2tDVW53cmFwcGVyKENNZWRpYVRyYWNrICpjbWVkaWF0cmFjaykgeworICAgIHdyYXBwZXIgPSBjbWVkaWF0cmFjazsKK30KKworTWVkaWFUcmFja0NVbndyYXBwZXI6On5NZWRpYVRyYWNrQ1Vud3JhcHBlcigpIHsKKyAgICB3cmFwcGVyLT5mcmVlKHdyYXBwZXItPmRhdGEpOworICAgIGZyZWUod3JhcHBlcik7Cit9CisKK3N0YXR1c190IE1lZGlhVHJhY2tDVW53cmFwcGVyOjpzdGFydCgpIHsKKyAgICByZXR1cm4gd3JhcHBlci0+c3RhcnQod3JhcHBlci0+ZGF0YSk7Cit9CisKK3N0YXR1c190IE1lZGlhVHJhY2tDVW53cmFwcGVyOjpzdG9wKCkgeworICAgIHJldHVybiB3cmFwcGVyLT5zdG9wKHdyYXBwZXItPmRhdGEpOworfQorCitzdGF0dXNfdCBNZWRpYVRyYWNrQ1Vud3JhcHBlcjo6Z2V0Rm9ybWF0KE1ldGFEYXRhQmFzZSYgZm9ybWF0KSB7CisgICAgcmV0dXJuIHdyYXBwZXItPmdldEZvcm1hdCh3cmFwcGVyLT5kYXRhLCBmb3JtYXQpOworfQorCitzdGF0dXNfdCBNZWRpYVRyYWNrQ1Vud3JhcHBlcjo6cmVhZChNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7CisKKyAgICB1aW50MzJfdCBvcHRzID0gMDsKKworICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMtPmdldE5vbkJsb2NraW5nKCkpIHsKKyAgICAgICAgb3B0cyB8PSBDTWVkaWFUcmFja1JlYWRPcHRpb25zOjpOT05CTE9DS0lORzsKKyAgICB9CisKKyAgICBpbnQ2NF90IHNlZWtQb3NpdGlvbiA9IDA7CisgICAgTWVkaWFUcmFjazo6UmVhZE9wdGlvbnM6OlNlZWtNb2RlIHNlZWtNb2RlOworICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMtPmdldFNlZWtUbygmc2Vla1Bvc2l0aW9uLCAmc2Vla01vZGUpKSB7CisgICAgICAgIG9wdHMgfD0gU0VFSzsKKyAgICAgICAgb3B0cyB8PSAodWludDMyX3QpIHNlZWtNb2RlOworICAgIH0KKworCisgICAgcmV0dXJuIHdyYXBwZXItPnJlYWQod3JhcHBlci0+ZGF0YSwgYnVmZmVyLCBvcHRzLCBzZWVrUG9zaXRpb24pOworfQorCitib29sIE1lZGlhVHJhY2tDVW53cmFwcGVyOjpzdXBwb3J0Tm9uYmxvY2tpbmdSZWFkKCkgeworICAgIHJldHVybiB3cmFwcGVyLT5zdXBwb3J0c05vbkJsb2NraW5nUmVhZCh3cmFwcGVyLT5kYXRhKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0gdW53cmFwcGVyIHYyIC0tLS0tLS0tLS0tLS0tLSAqLworCitNZWRpYVRyYWNrQ1Vud3JhcHBlclYyOjpNZWRpYVRyYWNrQ1Vud3JhcHBlclYyKENNZWRpYVRyYWNrVjIgKmNtZWRpYXRyYWNrMikgeworICAgIHdyYXBwZXIgPSBjbWVkaWF0cmFjazI7Cit9CisKK01lZGlhVHJhY2tDVW53cmFwcGVyVjI6On5NZWRpYVRyYWNrQ1Vud3JhcHBlclYyKCkgeworICAgIHdyYXBwZXItPmZyZWUod3JhcHBlci0+ZGF0YSk7CisgICAgZnJlZSh3cmFwcGVyKTsKK30KKworc3RhdHVzX3QgTWVkaWFUcmFja0NVbndyYXBwZXJWMjo6c3RhcnQoKSB7CisgICAgcmV0dXJuIHJldmVyc2VfdHJhbnNsYXRlX2Vycm9yKHdyYXBwZXItPnN0YXJ0KHdyYXBwZXItPmRhdGEpKTsKK30KKworc3RhdHVzX3QgTWVkaWFUcmFja0NVbndyYXBwZXJWMjo6c3RvcCgpIHsKKyAgICByZXR1cm4gcmV2ZXJzZV90cmFuc2xhdGVfZXJyb3Iod3JhcHBlci0+c3RvcCh3cmFwcGVyLT5kYXRhKSk7Cit9CisKK3N0YXR1c190IE1lZGlhVHJhY2tDVW53cmFwcGVyVjI6OmdldEZvcm1hdChNZXRhRGF0YUJhc2UmIGZvcm1hdCkgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2UoKTsKKyAgICBBTWVkaWFGb3JtYXQgKnRtcEZvcm1hdCA9ICBBTWVkaWFGb3JtYXRfZnJvbU1zZygmbXNnKTsKKyAgICBtZWRpYV9zdGF0dXNfdCByZXQgPSB3cmFwcGVyLT5nZXRGb3JtYXQod3JhcHBlci0+ZGF0YSwgdG1wRm9ybWF0KTsKKyAgICBzcDxNZXRhRGF0YT4gbmV3TWV0YSA9IG5ldyBNZXRhRGF0YSgpOworICAgIGNvbnZlcnRNZXNzYWdlVG9NZXRhRGF0YShtc2csIG5ld01ldGEpOworICAgIGRlbGV0ZSB0bXBGb3JtYXQ7CisgICAgZm9ybWF0ID0gKm5ld01ldGE7CisgICAgcmV0dXJuIHJldmVyc2VfdHJhbnNsYXRlX2Vycm9yKHJldCk7Cit9CisKK3N0YXR1c190IE1lZGlhVHJhY2tDVW53cmFwcGVyVjI6OnJlYWQoTWVkaWFCdWZmZXJCYXNlICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgeworCisgICAgdWludDMyX3Qgb3B0cyA9IDA7CisKKyAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLT5nZXROb25CbG9ja2luZygpKSB7CisgICAgICAgIG9wdHMgfD0gQ01lZGlhVHJhY2tSZWFkT3B0aW9uczo6Tk9OQkxPQ0tJTkc7CisgICAgfQorCisgICAgaW50NjRfdCBzZWVrUG9zaXRpb24gPSAwOworICAgIE1lZGlhVHJhY2s6OlJlYWRPcHRpb25zOjpTZWVrTW9kZSBzZWVrTW9kZTsKKyAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLT5nZXRTZWVrVG8oJnNlZWtQb3NpdGlvbiwgJnNlZWtNb2RlKSkgeworICAgICAgICBvcHRzIHw9IFNFRUs7CisgICAgICAgIG9wdHMgfD0gKHVpbnQzMl90KSBzZWVrTW9kZTsKKyAgICB9CisKKyAgICByZXR1cm4gcmV2ZXJzZV90cmFuc2xhdGVfZXJyb3Iod3JhcHBlci0+cmVhZCh3cmFwcGVyLT5kYXRhLCBidWZmZXIsIG9wdHMsIHNlZWtQb3NpdGlvbikpOworfQorCitib29sIE1lZGlhVHJhY2tDVW53cmFwcGVyVjI6OnN1cHBvcnROb25ibG9ja2luZ1JlYWQoKSB7CisgICAgcmV0dXJuIHdyYXBwZXItPnN1cHBvcnRzTm9uQmxvY2tpbmdSZWFkKHdyYXBwZXItPmRhdGEpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWV0YURhdGFVdGlscy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZXRhRGF0YVV0aWxzLmNwcAppbmRleCAwNGY2YWRlLi5hMzI1OWZkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZXRhRGF0YVV0aWxzLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZXRhRGF0YVV0aWxzLmNwcApAQCAtMTYsMTUgKzE2LDI1IEBACiAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiTWV0YURhdGFVdGlscyIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYXZjX3V0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9iYXNlNjQuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCaXRSZWFkZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0J5dGVVdGlscy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRm9ybWF0Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogYm9vbCBNYWtlQVZDQ29kZWNTcGVjaWZpY0RhdGEoTWV0YURhdGFCYXNlICZtZXRhLCBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIGlmIChkYXRhID09IG51bGxwdHIgfHwgc2l6ZSA9PSAwKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKICAgICBpbnQzMl90IHdpZHRoOwogICAgIGludDMyX3QgaGVpZ2h0OwogICAgIGludDMyX3Qgc2FyV2lkdGg7CkBAIC00NiwyMSArNTYsODYgQEAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAorYm9vbCBNYWtlQVZDQ29kZWNTcGVjaWZpY0RhdGEoQU1lZGlhRm9ybWF0ICptZXRhLCBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIGlmIChtZXRhID09IG51bGxwdHIgfHwgZGF0YSA9PSBudWxscHRyIHx8IHNpemUgPT0gMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaW50MzJfdCB3aWR0aDsKKyAgICBpbnQzMl90IGhlaWdodDsKKyAgICBpbnQzMl90IHNhcldpZHRoOworICAgIGludDMyX3Qgc2FySGVpZ2h0OworICAgIHNwPEFCdWZmZXI+IGFjY2Vzc1VuaXQgPSBuZXcgQUJ1ZmZlcigodm9pZCopZGF0YSwgIHNpemUpOworICAgIHNwPEFCdWZmZXI+IGNzZCA9IE1ha2VBVkNDb2RlY1NwZWNpZmljRGF0YShhY2Nlc3NVbml0LCAmd2lkdGgsICZoZWlnaHQsICZzYXJXaWR0aCwgJnNhckhlaWdodCk7CisgICAgaWYgKGNzZCA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtZXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQyk7CisKKyAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1NEX0FWQywgY3NkLT5kYXRhKCksIGNzZC0+c2l6ZSgpKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9XSURUSCwgd2lkdGgpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0hFSUdIVCwgaGVpZ2h0KTsKKyAgICBpZiAoc2FyV2lkdGggPiAwICYmIHNhckhlaWdodCA+IDApIHsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfU0FSX1dJRFRILCBzYXJXaWR0aCk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1NBUl9IRUlHSFQsIHNhckhlaWdodCk7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIE1ha2VBQUNDb2RlY1NwZWNpZmljRGF0YShNZXRhRGF0YUJhc2UgJm1ldGEsIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgaWYgKGRhdGEgPT0gbnVsbHB0ciB8fCBzaXplIDwgNykgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQUJpdFJlYWRlciBiaXRzKGRhdGEsIHNpemUpOworCisgICAgLy8gYWR0c19maXhlZF9oZWFkZXIKKworICAgIGlmIChiaXRzLmdldEJpdHMoMTIpICE9IDB4ZmZmdSkgeworICAgICAgICBBTE9HRSgiV3JvbmcgYXRkc19maXhlZF9oZWFkZXIiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGJpdHMuc2tpcEJpdHMoNCk7ICAvLyBJRCwgbGF5ZXIsIHByb3RlY3Rpb25fYWJzZW50CisKKyAgICB1bnNpZ25lZCBwcm9maWxlID0gYml0cy5nZXRCaXRzKDIpOworICAgIGlmIChwcm9maWxlID09IDN1KSB7CisgICAgICAgIEFMT0dFKCJwcm9maWxlIHNob3VsZCBub3QgYmUgMyIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHVuc2lnbmVkIHNhbXBsaW5nX2ZyZXFfaW5kZXggPSBiaXRzLmdldEJpdHMoNCk7CisgICAgYml0cy5nZXRCaXRzKDEpOyAgLy8gcHJpdmF0ZV9iaXQKKyAgICB1bnNpZ25lZCBjaGFubmVsX2NvbmZpZ3VyYXRpb24gPSBiaXRzLmdldEJpdHMoMyk7CisgICAgaWYgKGNoYW5uZWxfY29uZmlndXJhdGlvbiA9PSAwdSkgeworICAgICAgICBBTE9HRSgiY2hhbm5lbF9jb25maWcgc2hvdWxkIG5vdCBiZSAwIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoIU1ha2VBQUNDb2RlY1NwZWNpZmljRGF0YSgKKyAgICAgICAgICAgIG1ldGEsIHByb2ZpbGUsIHNhbXBsaW5nX2ZyZXFfaW5kZXgsIGNoYW5uZWxfY29uZmlndXJhdGlvbikpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIG1ldGEuc2V0SW50MzIoa0tleUlzQURUUywgdHJ1ZSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKIGJvb2wgTWFrZUFBQ0NvZGVjU3BlY2lmaWNEYXRhKAotICAgICAgICBNZXRhRGF0YUJhc2UgJm1ldGEsCi0gICAgICAgIHVuc2lnbmVkIHByb2ZpbGUsIHVuc2lnbmVkIHNhbXBsaW5nX2ZyZXFfaW5kZXgsCi0gICAgICAgIHVuc2lnbmVkIGNoYW5uZWxfY29uZmlndXJhdGlvbikgeworICAgICAgICB1aW50OF90ICpjc2QsIC8qIG91dCAqLworICAgICAgICBzaXplX3QgKmVzZHNfc2l6ZSwgLyogaW4vb3V0ICovCisgICAgICAgIHVuc2lnbmVkIHByb2ZpbGUsIC8qIGluICovCisgICAgICAgIHVuc2lnbmVkIHNhbXBsaW5nX2ZyZXFfaW5kZXgsIC8qIGluICovCisgICAgICAgIHVuc2lnbmVkIGNoYW5uZWxfY29uZmlndXJhdGlvbiwgLyogaW4gKi8KKyAgICAgICAgaW50MzJfdCAqc2FtcGxpbmdfcmF0ZSAvKiBvdXQgKi8KKykgewogICAgIGlmKHNhbXBsaW5nX2ZyZXFfaW5kZXggPiAxMXUpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICBpbnQzMl90IHNhbXBsZVJhdGU7Ci0gICAgaW50MzJfdCBjaGFubmVsQ291bnQ7CiAgICAgc3RhdGljIGNvbnN0IGludDMyX3Qga1NhbXBsaW5nRnJlcVtdID0gewogICAgICAgICA5NjAwMCwgODgyMDAsIDY0MDAwLCA0ODAwMCwgNDQxMDAsIDMyMDAwLCAyNDAwMCwgMjIwNTAsCiAgICAgICAgIDE2MDAwLCAxMjAwMCwgMTEwMjUsIDgwMDAKICAgICB9OwotICAgIHNhbXBsZVJhdGUgPSBrU2FtcGxpbmdGcmVxW3NhbXBsaW5nX2ZyZXFfaW5kZXhdOwotICAgIGNoYW5uZWxDb3VudCA9IGNoYW5uZWxfY29uZmlndXJhdGlvbjsKKyAgICAqc2FtcGxpbmdfcmF0ZSA9IGtTYW1wbGluZ0ZyZXFbc2FtcGxpbmdfZnJlcV9pbmRleF07CiAKICAgICBzdGF0aWMgY29uc3QgdWludDhfdCBrU3RhdGljRVNEU1tdID0gewogICAgICAgICAweDAzLCAyMiwKQEAgLTgzLDcgKzE1OCw5IEBACiAgICAgfTsKIAogICAgIHNpemVfdCBjc2RTaXplID0gc2l6ZW9mKGtTdGF0aWNFU0RTKSArIDI7Ci0gICAgdWludDhfdCAqY3NkID0gbmV3IHVpbnQ4X3RbY3NkU2l6ZV07CisgICAgaWYgKGNzZFNpemUgPiAqZXNkc19zaXplKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CiAgICAgbWVtY3B5KGNzZCwga1N0YXRpY0VTRFMsIHNpemVvZihrU3RhdGljRVNEUykpOwogCiAgICAgY3NkW3NpemVvZihrU3RhdGljRVNEUyldID0KQEAgLTkyLDE0ICsxNjksMTg2IEBACiAgICAgY3NkW3NpemVvZihrU3RhdGljRVNEUykgKyAxXSA9CiAgICAgICAgICgoc2FtcGxpbmdfZnJlcV9pbmRleCA8PCA3KSAmIDB4ODApIHwgKGNoYW5uZWxfY29uZmlndXJhdGlvbiA8PCAzKTsKIAorICAgICplc2RzX3NpemUgPSBjc2RTaXplOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIE1ha2VBQUNDb2RlY1NwZWNpZmljRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEsIHVuc2lnbmVkIHByb2ZpbGUsIHVuc2lnbmVkIHNhbXBsaW5nX2ZyZXFfaW5kZXgsCisgICAgICAgIHVuc2lnbmVkIGNoYW5uZWxfY29uZmlndXJhdGlvbikgeworCisgICAgaWYoc2FtcGxpbmdfZnJlcV9pbmRleCA+IDExdSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdWludDhfdCBjc2RbMl07CisgICAgY3NkWzBdID0gKChwcm9maWxlICsgMSkgPDwgMykgfCAoc2FtcGxpbmdfZnJlcV9pbmRleCA+PiAxKTsKKyAgICBjc2RbMV0gPSAoKHNhbXBsaW5nX2ZyZXFfaW5kZXggPDwgNykgJiAweDgwKSB8IChjaGFubmVsX2NvbmZpZ3VyYXRpb24gPDwgMyk7CisKKyAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBrU2FtcGxpbmdGcmVxW10gPSB7CisgICAgICAgIDk2MDAwLCA4ODIwMCwgNjQwMDAsIDQ4MDAwLCA0NDEwMCwgMzIwMDAsIDI0MDAwLCAyMjA1MCwKKyAgICAgICAgMTYwMDAsIDEyMDAwLCAxMTAyNSwgODAwMAorICAgIH07CisgICAgaW50MzJfdCBzYW1wbGVSYXRlID0ga1NhbXBsaW5nRnJlcVtzYW1wbGluZ19mcmVxX2luZGV4XTsKKworICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9DU0RfMCwgY3NkLCBzaXplb2YoY3NkKSk7CisgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtZXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX0FVRElPX0FBQyk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1JBVEUsIHNhbXBsZVJhdGUpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfQ09VTlQsIGNoYW5uZWxfY29uZmlndXJhdGlvbik7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBNYWtlQUFDQ29kZWNTcGVjaWZpY0RhdGEoCisgICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSwKKyAgICAgICAgdW5zaWduZWQgcHJvZmlsZSwgdW5zaWduZWQgc2FtcGxpbmdfZnJlcV9pbmRleCwKKyAgICAgICAgdW5zaWduZWQgY2hhbm5lbF9jb25maWd1cmF0aW9uKSB7CisKKyAgICB1aW50OF90IGNzZFsyNF07CisgICAgc2l6ZV90IGNzZFNpemUgPSBzaXplb2YoY3NkKTsKKyAgICBpbnQzMl90IHNhbXBsZVJhdGU7CisKKyAgICBpZiAoIU1ha2VBQUNDb2RlY1NwZWNpZmljRGF0YShjc2QsICZjc2RTaXplLCBwcm9maWxlLCBzYW1wbGluZ19mcmVxX2luZGV4LAorICAgICAgICAgICAgY2hhbm5lbF9jb25maWd1cmF0aW9uLCAmc2FtcGxlUmF0ZSkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKwogICAgIG1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX0FBQyk7CiAKICAgICBtZXRhLnNldEludDMyKGtLZXlTYW1wbGVSYXRlLCBzYW1wbGVSYXRlKTsKLSAgICBtZXRhLnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsIGNoYW5uZWxDb3VudCk7Ci0KKyAgICBtZXRhLnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsIGNoYW5uZWxfY29uZmlndXJhdGlvbik7CiAgICAgbWV0YS5zZXREYXRhKGtLZXlFU0RTLCAwLCBjc2QsIGNzZFNpemUpOwotICAgIGRlbGV0ZSBbXSBjc2Q7CiAgICAgcmV0dXJuIHRydWU7CiB9CiAKKworc3RhdGljIHZvaWQgZXh0cmFjdEFsYnVtQXJ0KAorICAgICAgICBBTWVkaWFGb3JtYXQgKmZpbGVNZXRhLCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIEFMT0dWKCJleHRyYWN0QWxidW1BcnQgZnJvbSAnJXMnIiwgKGNvbnN0IGNoYXIgKilkYXRhKTsKKworICAgIHNpemVfdCBpbkxlbiA9IHN0cm5sZW4oKGNvbnN0IGNoYXIgKilkYXRhLCBzaXplKTsKKyAgICBzaXplX3QgZmxhY1NpemUgPSBpbkxlbiAvIDQgKiAzOworICAgIHVpbnQ4X3QgKmZsYWMgPSBuZXcgdWludDhfdFtmbGFjU2l6ZV07CisgICAgaWYgKCFkZWNvZGVCYXNlNjQoZmxhYywgJmZsYWNTaXplLCAoY29uc3QgY2hhciopZGF0YSkpIHsKKyAgICAgICAgQUxPR0UoIm1hbGZvcm1lZCBiYXNlNjQgZW5jb2RlZCBkYXRhLiIpOworICAgICAgICBkZWxldGVbXSBmbGFjOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQUxPR1YoImdvdCBmbGFjIG9mIHNpemUgJXp1IiwgZmxhY1NpemUpOworCisgICAgdWludDMyX3QgcGljVHlwZTsKKyAgICB1aW50MzJfdCB0eXBlTGVuOworICAgIHVpbnQzMl90IGRlc2NMZW47CisgICAgdWludDMyX3QgZGF0YUxlbjsKKyAgICBjaGFyIHR5cGVbMTI4XTsKKworICAgIGlmIChmbGFjU2l6ZSA8IDgpIHsKKyAgICAgICAgZGVsZXRlW10gZmxhYzsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHBpY1R5cGUgPSBVMzJfQVQoZmxhYyk7CisKKyAgICBpZiAocGljVHlwZSAhPSAzKSB7CisgICAgICAgIC8vIFRoaXMgaXMgbm90IGEgZnJvbnQgY292ZXIuCisgICAgICAgIGRlbGV0ZVtdIGZsYWM7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB0eXBlTGVuID0gVTMyX0FUKCZmbGFjWzRdKTsKKyAgICBpZiAodHlwZUxlbiA+IHNpemVvZih0eXBlKSAtIDEpIHsKKyAgICAgICAgZGVsZXRlW10gZmxhYzsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIHdlJ3ZlIGFscmVhZHkgY2hlY2tlZCBhYm92ZSB0aGF0IGZsYWNTaXplID49IDgKKyAgICBpZiAoZmxhY1NpemUgLSA4IDwgdHlwZUxlbikgeworICAgICAgICBkZWxldGVbXSBmbGFjOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbWVtY3B5KHR5cGUsICZmbGFjWzhdLCB0eXBlTGVuKTsKKyAgICB0eXBlW3R5cGVMZW5dID0gJ1wwJzsKKworICAgIEFMT0dWKCJwaWNUeXBlID0gJWQsIHR5cGUgPSAnJXMnIiwgcGljVHlwZSwgdHlwZSk7CisKKyAgICBpZiAoIXN0cmNtcCh0eXBlLCAiLS0+IikpIHsKKyAgICAgICAgLy8gVGhpcyBpcyBub3QgaW5saW5lIGNvdmVyIGFydCwgYnV0IGFuIGV4dGVybmFsIHVybCBpbnN0ZWFkLgorICAgICAgICBkZWxldGVbXSBmbGFjOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKGZsYWNTaXplIDwgMzIgfHwgZmxhY1NpemUgLSAzMiA8IHR5cGVMZW4pIHsKKyAgICAgICAgZGVsZXRlW10gZmxhYzsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGRlc2NMZW4gPSBVMzJfQVQoJmZsYWNbOCArIHR5cGVMZW5dKTsKKyAgICBpZiAoZmxhY1NpemUgLSAzMiAtIHR5cGVMZW4gPCBkZXNjTGVuKSB7CisgICAgICAgIGRlbGV0ZVtdIGZsYWM7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBkYXRhTGVuID0gVTMyX0FUKCZmbGFjWzggKyB0eXBlTGVuICsgNCArIGRlc2NMZW4gKyAxNl0pOworCisgICAgLy8gd2UndmUgYWxyZWFkeSBjaGVja2VkIGFib3ZlIHRoYXQgKGZsYWNTaXplIC0gMzIgLSB0eXBlTGVuIC0gZGVzY0xlbikgPj0gMAorICAgIGlmIChmbGFjU2l6ZSAtIDMyIC0gdHlwZUxlbiAtIGRlc2NMZW4gPCBkYXRhTGVuKSB7CisgICAgICAgIGRlbGV0ZVtdIGZsYWM7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBBTE9HVigiZ290IGltYWdlIGRhdGEsICV6dSB0cmFpbGluZyBieXRlcyIsCisgICAgICAgICBmbGFjU2l6ZSAtIDMyIC0gdHlwZUxlbiAtIGRlc2NMZW4gLSBkYXRhTGVuKTsKKworICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIoZmlsZU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQUxCVU1BUlQsCisgICAgICAgICAgICAmZmxhY1s4ICsgdHlwZUxlbiArIDQgKyBkZXNjTGVuICsgMjBdLCBkYXRhTGVuKTsKKworICAgIGRlbGV0ZVtdIGZsYWM7Cit9CisKK3ZvaWQgcGFyc2VWb3JiaXNDb21tZW50KAorICAgICAgICBBTWVkaWFGb3JtYXQgKmZpbGVNZXRhLCBjb25zdCBjaGFyICpjb21tZW50LCBzaXplX3QgY29tbWVudExlbmd0aCkgeworICAgIHN0cnVjdCB7CisgICAgICAgIGNvbnN0IGNoYXIgKmNvbnN0IG1UYWc7CisgICAgICAgIGNvbnN0IGNoYXIgKm1LZXk7CisgICAgfSBrTWFwW10gPSB7CisgICAgICAgIHsgIlRJVExFIiwgQU1FRElBRk9STUFUX0tFWV9USVRMRSB9LAorICAgICAgICB7ICJBUlRJU1QiLCBBTUVESUFGT1JNQVRfS0VZX0FSVElTVCB9LAorICAgICAgICB7ICJBTEJVTUFSVElTVCIsIEFNRURJQUZPUk1BVF9LRVlfQUxCVU1BUlRJU1QgfSwKKyAgICAgICAgeyAiQUxCVU0gQVJUSVNUIiwgQU1FRElBRk9STUFUX0tFWV9BTEJVTUFSVElTVCB9LAorICAgICAgICB7ICJDT01QSUxBVElPTiIsIEFNRURJQUZPUk1BVF9LRVlfQ09NUElMQVRJT04gfSwKKyAgICAgICAgeyAiQUxCVU0iLCBBTUVESUFGT1JNQVRfS0VZX0FMQlVNIH0sCisgICAgICAgIHsgIkNPTVBPU0VSIiwgQU1FRElBRk9STUFUX0tFWV9DT01QT1NFUiB9LAorICAgICAgICB7ICJHRU5SRSIsIEFNRURJQUZPUk1BVF9LRVlfR0VOUkUgfSwKKyAgICAgICAgeyAiQVVUSE9SIiwgQU1FRElBRk9STUFUX0tFWV9BVVRIT1IgfSwKKyAgICAgICAgeyAiVFJBQ0tOVU1CRVIiLCBBTUVESUFGT1JNQVRfS0VZX0NEVFJBQ0tOVU1CRVIgfSwKKyAgICAgICAgeyAiRElTQ05VTUJFUiIsIEFNRURJQUZPUk1BVF9LRVlfRElTQ05VTUJFUiB9LAorICAgICAgICB7ICJEQVRFIiwgQU1FRElBRk9STUFUX0tFWV9EQVRFIH0sCisgICAgICAgIHsgIllFQVIiLCBBTUVESUFGT1JNQVRfS0VZX1lFQVIgfSwKKyAgICAgICAgeyAiTFlSSUNJU1QiLCBBTUVESUFGT1JNQVRfS0VZX0xZUklDSVNUIH0sCisgICAgICAgIHsgIk1FVEFEQVRBX0JMT0NLX1BJQ1RVUkUiLCBBTUVESUFGT1JNQVRfS0VZX0FMQlVNQVJUIH0sCisgICAgICAgIHsgIkFORFJPSURfTE9PUCIsIEFNRURJQUZPUk1BVF9LRVlfTE9PUCB9LAorICAgIH07CisKKyAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBzaXplb2Yoa01hcCkgLyBzaXplb2Yoa01hcFswXSk7ICsraikgeworICAgICAgICAgICAgc2l6ZV90IHRhZ0xlbiA9IHN0cmxlbihrTWFwW2pdLm1UYWcpOworICAgICAgICAgICAgaWYgKCFzdHJuY2FzZWNtcChrTWFwW2pdLm1UYWcsIGNvbW1lbnQsIHRhZ0xlbikKKyAgICAgICAgICAgICAgICAgICAgJiYgY29tbWVudFt0YWdMZW5dID09ICc9JykgeworICAgICAgICAgICAgICAgIGlmIChrTWFwW2pdLm1LZXkgPT0gQU1FRElBRk9STUFUX0tFWV9BTEJVTUFSVCkgeworICAgICAgICAgICAgICAgICAgICBleHRyYWN0QWxidW1BcnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZU1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbW1lbnRbdGFnTGVuICsgMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudExlbmd0aCAtIHRhZ0xlbiAtIDEpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoa01hcFtqXS5tS2V5ID09IEFNRURJQUZPUk1BVF9LRVlfTE9PUCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIXN0cmNhc2VjbXAoJmNvbW1lbnRbdGFnTGVuICsgMV0sICJ0cnVlIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihmaWxlTWV0YSwgQU1FRElBRk9STUFUX0tFWV9MT09QLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcoZmlsZU1ldGEsIGtNYXBbal0ubUtleSwgJmNvbW1lbnRbdGFnTGVuICsgMV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCit9CisKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9OdUNhY2hlZFNvdXJjZTIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTnVDYWNoZWRTb3VyY2UyLmNwcAppbmRleCAxOGY0YjEyLi43MDI1YWY3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9OdUNhY2hlZFNvdXJjZTIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L051Q2FjaGVkU291cmNlMi5jcHAKQEAgLTI1Niw2ICsyNTYsMTAgQEAKICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CiB9CiAKK3ZvaWQgTnVDYWNoZWRTb3VyY2UyOjpjbG9zZSgpIHsKKyAgICBkaXNjb25uZWN0KCk7Cit9CisKIHZvaWQgTnVDYWNoZWRTb3VyY2UyOjpkaXNjb25uZWN0KCkgewogICAgIGlmIChtU291cmNlLT5mbGFncygpICYga0lzSFRUUEJhc2VkU291cmNlKSB7CiAgICAgICAgIEFMT0dWKCJkaXNjb25uZWN0aW5nIEhUVFBCYXNlZFNvdXJjZSIpOwpAQCAtNTY3LDEyICs1NzEsMTkgQEAKICAgICByZXR1cm4gbUNhY2hlT2Zmc2V0ICsgbUNhY2hlLT50b3RhbFNpemUoKTsKIH0KIAotc2l6ZV90IE51Q2FjaGVkU291cmNlMjo6YXBwcm94RGF0YVJlbWFpbmluZyhzdGF0dXNfdCAqZmluYWxTdGF0dXMpIGNvbnN0IHsKK3N0YXR1c190IE51Q2FjaGVkU291cmNlMjo6Z2V0QXZhaWxhYmxlU2l6ZShvZmY2NF90IG9mZnNldCwgb2ZmNjRfdCAqc2l6ZSkgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgcmV0dXJuIGFwcHJveERhdGFSZW1haW5pbmdfbChmaW5hbFN0YXR1cyk7CisgICAgc3RhdHVzX3QgZmluYWxTdGF0dXMgPSBVTktOT1dOX0VSUk9SOworICAgICpzaXplID0gYXBwcm94RGF0YVJlbWFpbmluZ19sKG9mZnNldCwgJmZpbmFsU3RhdHVzKTsKKyAgICByZXR1cm4gZmluYWxTdGF0dXM7CiB9CiAKLXNpemVfdCBOdUNhY2hlZFNvdXJjZTI6OmFwcHJveERhdGFSZW1haW5pbmdfbChzdGF0dXNfdCAqZmluYWxTdGF0dXMpIGNvbnN0IHsKK3NpemVfdCBOdUNhY2hlZFNvdXJjZTI6OmFwcHJveERhdGFSZW1haW5pbmcoc3RhdHVzX3QgKmZpbmFsU3RhdHVzKSBjb25zdCB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICByZXR1cm4gYXBwcm94RGF0YVJlbWFpbmluZ19sKG1MYXN0QWNjZXNzUG9zLCBmaW5hbFN0YXR1cyk7Cit9CisKK3NpemVfdCBOdUNhY2hlZFNvdXJjZTI6OmFwcHJveERhdGFSZW1haW5pbmdfbChvZmY2NF90IG9mZnNldCwgc3RhdHVzX3QgKmZpbmFsU3RhdHVzKSBjb25zdCB7CiAgICAgKmZpbmFsU3RhdHVzID0gbUZpbmFsU3RhdHVzOwogCiAgICAgaWYgKG1GaW5hbFN0YXR1cyAhPSBPSyAmJiBtTnVtUmV0cmllc0xlZnQgPiAwKSB7CkBAIC01ODAsOSArNTkxLDEwIEBACiAgICAgICAgICpmaW5hbFN0YXR1cyA9IE9LOwogICAgIH0KIAorICAgIG9mZnNldCA9IG9mZnNldCA+PSAwID8gb2Zmc2V0IDogbUxhc3RBY2Nlc3NQb3M7CiAgICAgb2ZmNjRfdCBsYXN0Qnl0ZVBvc0NhY2hlZCA9IG1DYWNoZU9mZnNldCArIG1DYWNoZS0+dG90YWxTaXplKCk7Ci0gICAgaWYgKG1MYXN0QWNjZXNzUG9zIDwgbGFzdEJ5dGVQb3NDYWNoZWQpIHsKLSAgICAgICAgcmV0dXJuIGxhc3RCeXRlUG9zQ2FjaGVkIC0gbUxhc3RBY2Nlc3NQb3M7CisgICAgaWYgKG9mZnNldCA8IGxhc3RCeXRlUG9zQ2FjaGVkKSB7CisgICAgICAgIHJldHVybiBsYXN0Qnl0ZVBvc0NhY2hlZCAtIG9mZnNldDsKICAgICB9CiAgICAgcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9OdU1lZGlhRXh0cmFjdG9yLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L051TWVkaWFFeHRyYWN0b3IuY3BwCmluZGV4IDRhN2Q2Y2EuLmY5NDY0OGMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L051TWVkaWFFeHRyYWN0b3IuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L051TWVkaWFFeHRyYWN0b3IuY3BwCkBAIC0yMSwxMCArMjEsOCBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L051TWVkaWFFeHRyYWN0b3IuaD4KIAogI2luY2x1ZGUgImluY2x1ZGUvRVNEUy5oIgotI2luY2x1ZGUgImluY2x1ZGUvTnVDYWNoZWRTb3VyY2UyLmgiCiAKICNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3IuaD4KICNpbmNsdWRlIDxtZWRpYS9NZWRpYVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CkBAIC0zNCw2ICszMiw3IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3JGYWN0b3J5Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgpAQCAtMjA1LDE1ICsyMDQsNiBAQAogICAgIHJldHVybiBPSzsKIH0KIAotdm9pZCBOdU1lZGlhRXh0cmFjdG9yOjpkaXNjb25uZWN0KCkgewotICAgIGlmIChtRGF0YVNvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgIC8vIGRpc2Nvbm5lY3QgZGF0YSBzb3VyY2UKLSAgICAgICAgaWYgKG1EYXRhU291cmNlLT5mbGFncygpICYgRGF0YVNvdXJjZTo6a0lzQ2FjaGluZ0RhdGFTb3VyY2UpIHsKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PE51Q2FjaGVkU291cmNlMiAqPihtRGF0YVNvdXJjZS5nZXQoKSktPmRpc2Nvbm5lY3QoKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQogc3RhdHVzX3QgTnVNZWRpYUV4dHJhY3Rvcjo6dXBkYXRlRHVyYXRpb25BbmRCaXRyYXRlKCkgewogICAgIGlmIChtSW1wbC0+Y291bnRUcmFja3MoKSA+IGtNYXhUcmFja0NvdW50KSB7CiAgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKQEAgLTc5MCwxNiArNzgwLDEyIEBACiAgICAgICAgIGludDY0X3QgKmR1cmF0aW9uVXMsIGJvb2wgKmVvcykgY29uc3QgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKKyAgICBvZmY2NF90IGNhY2hlZERhdGFSZW1haW5pbmcgPSAtMTsKKyAgICBzdGF0dXNfdCBmaW5hbFN0YXR1cyA9IG1EYXRhU291cmNlLT5nZXRBdmFpbGFibGVTaXplKC0xLCAmY2FjaGVkRGF0YVJlbWFpbmluZyk7CisKICAgICBpbnQ2NF90IGJpdHJhdGU7Ci0gICAgaWYgKChtRGF0YVNvdXJjZS0+ZmxhZ3MoKSAmIERhdGFTb3VyY2U6OmtJc0NhY2hpbmdEYXRhU291cmNlKQorICAgIGlmIChjYWNoZWREYXRhUmVtYWluaW5nID49IDAKICAgICAgICAgICAgICYmIGdldFRvdGFsQml0cmF0ZSgmYml0cmF0ZSkpIHsKLSAgICAgICAgc3A8TnVDYWNoZWRTb3VyY2UyPiBjYWNoZWRTb3VyY2UgPQotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8TnVDYWNoZWRTb3VyY2UyICo+KG1EYXRhU291cmNlLmdldCgpKTsKLQotICAgICAgICBzdGF0dXNfdCBmaW5hbFN0YXR1czsKLSAgICAgICAgc2l6ZV90IGNhY2hlZERhdGFSZW1haW5pbmcgPQotICAgICAgICAgICAgY2FjaGVkU291cmNlLT5hcHByb3hEYXRhUmVtYWluaW5nKCZmaW5hbFN0YXR1cyk7Ci0KICAgICAgICAgKmR1cmF0aW9uVXMgPSBjYWNoZWREYXRhUmVtYWluaW5nICogODAwMDAwMGxsIC8gYml0cmF0ZTsKICAgICAgICAgKmVvcyA9IChmaW5hbFN0YXR1cyAhPSBPSyk7CiAgICAgICAgIHJldHVybiB0cnVlOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvUmVtb3RlTWVkaWFTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvUmVtb3RlTWVkaWFTb3VyY2UuY3BwCmluZGV4IGQwN2FmZWMuLmRiMzFhZjIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1JlbW90ZU1lZGlhU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9SZW1vdGVNZWRpYVNvdXJjZS5jcHAKQEAgLTI1LDI1ICsyNSwyOSBAQAogICAgICAgICBNZWRpYVRyYWNrICpzb3VyY2UsCiAgICAgICAgIGNvbnN0IHNwPFJlZkJhc2U+ICZwbHVnaW4pCiAgICAgOiBtRXh0cmFjdG9yKGV4dHJhY3RvciksCi0gICAgICBtU291cmNlKHNvdXJjZSksCisgICAgICBtVHJhY2soc291cmNlKSwKICAgICAgIG1FeHRyYWN0b3JQbHVnaW4ocGx1Z2luKSB7fQogCiBSZW1vdGVNZWRpYVNvdXJjZTo6flJlbW90ZU1lZGlhU291cmNlKCkgewotICAgIGRlbGV0ZSBtU291cmNlOworICAgIGRlbGV0ZSBtVHJhY2s7CiAgICAgbUV4dHJhY3RvclBsdWdpbiA9IG51bGxwdHI7CiB9CiAKIHN0YXR1c190IFJlbW90ZU1lZGlhU291cmNlOjpzdGFydChNZXRhRGF0YSAqcGFyYW1zKSB7Ci0gICAgcmV0dXJuIG1Tb3VyY2UtPnN0YXJ0KHBhcmFtcyk7CisgICAgaWYgKHBhcmFtcykgeworICAgICAgICBBTE9HVygiZHJvcHBpbmcgc3RhcnQgcGFyYW1ldGVyczoiKTsKKyAgICAgICAgcGFyYW1zLT5kdW1wVG9Mb2coKTsKKyAgICB9CisgICAgcmV0dXJuIG1UcmFjay0+c3RhcnQoKTsKIH0KIAogc3RhdHVzX3QgUmVtb3RlTWVkaWFTb3VyY2U6OnN0b3AoKSB7Ci0gICAgcmV0dXJuIG1Tb3VyY2UtPnN0b3AoKTsKKyAgICByZXR1cm4gbVRyYWNrLT5zdG9wKCk7CiB9CiAKIHNwPE1ldGFEYXRhPiBSZW1vdGVNZWRpYVNvdXJjZTo6Z2V0Rm9ybWF0KCkgewogICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbmV3IE1ldGFEYXRhKCk7Ci0gICAgaWYgKG1Tb3VyY2UtPmdldEZvcm1hdCgqbWV0YS5nZXQoKSkgPT0gT0spIHsKKyAgICBpZiAobVRyYWNrLT5nZXRGb3JtYXQoKm1ldGEuZ2V0KCkpID09IE9LKSB7CiAgICAgICAgIHJldHVybiBtZXRhOwogICAgIH0KICAgICByZXR1cm4gbnVsbHB0cjsKQEAgLTUxLDcgKzU1LDExIEBACiAKIHN0YXR1c190IFJlbW90ZU1lZGlhU291cmNlOjpyZWFkKAogICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsIGNvbnN0IE1lZGlhU291cmNlOjpSZWFkT3B0aW9ucyAqb3B0aW9ucykgewotICAgIHJldHVybiBtU291cmNlLT5yZWFkKGJ1ZmZlciwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnMqPihvcHRpb25zKSk7CisgICAgcmV0dXJuIG1UcmFjay0+cmVhZChidWZmZXIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zKj4ob3B0aW9ucykpOworfQorCitib29sIFJlbW90ZU1lZGlhU291cmNlOjpzdXBwb3J0Tm9uYmxvY2tpbmdSZWFkKCkgeworICAgIHJldHVybiBtVHJhY2stPnN1cHBvcnROb25ibG9ja2luZ1JlYWQoKTsKIH0KIAogc3RhdHVzX3QgUmVtb3RlTWVkaWFTb3VyY2U6OnBhdXNlKCkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU2ltcGxlRGVjb2RpbmdTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU2ltcGxlRGVjb2RpbmdTb3VyY2UuY3BwCmluZGV4IDQwNGM1MzcuLmJhYmRjN2EgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1NpbXBsZURlY29kaW5nU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9TaW1wbGVEZWNvZGluZ1NvdXJjZS5jcHAKQEAgLTM3LDYgKzM3LDcgQEAKIAogY29uc3QgaW50NjRfdCBrVGltZW91dFdhaXRGb3JPdXRwdXRVcyA9IDUwMDAwMDsgLy8gMC41IHNlY29uZHMKIGNvbnN0IGludDY0X3Qga1RpbWVvdXRXYWl0Rm9ySW5wdXRVcyA9IDUwMDA7IC8vIDUgbWlsbGlzZWNvbmRzCitjb25zdCBpbnQga1RpbWVvdXRNYXhSZXRyaWVzID0gMjA7CiAKIC8vc3RhdGljCiBzcDxTaW1wbGVEZWNvZGluZ1NvdXJjZT4gU2ltcGxlRGVjb2RpbmdTb3VyY2U6OkNyZWF0ZSgKQEAgLTI0Miw3ICsyNDMsNyBAQAogICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKICAgICB9CiAKLSAgICBmb3IgKGludCByZXRyaWVzID0gMDsgKytyZXRyaWVzOyApIHsKKyAgICBmb3IgKGludCByZXRyaWVzID0gMDsgcmV0cmllcyA8IGtUaW1lb3V0TWF4UmV0cmllczsgKytyZXRyaWVzKSB7CiAgICAgICAgIC8vIElmIHdlIGZpbGwgYWxsIGF2YWlsYWJsZSBpbnB1dCBidWZmZXJzLCB3ZSBzaG91bGQgZXhwZWN0IHRoYXQKICAgICAgICAgLy8gdGhlIGNvZGVjIHByb2R1Y2VzIGF0IGxlYXN0IG9uZSBvdXRwdXQgYnVmZmVyLiBBbHNvLCB0aGUgY29kZWMKICAgICAgICAgLy8gc2hvdWxkIHByb2R1Y2UgYW4gb3V0cHV0IGJ1ZmZlciBpbiBhdCBtb3N0IDEgc2Vjb25kcy4gUmV0cnkgYQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9TdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyLmNwcAppbmRleCA4NGE2NDFmLi5mMzRkNTRjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9TdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9TdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyLmNwcApAQCAtMzMsNiArMzMsNyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yRmFjdG9yeS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KQEAgLTI3NSwxMiArMjc2LDYgQEAKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQogCi0gICAgaW50MzJfdCBkcm0gPSAwOwotICAgIGlmIChmaWxlTWV0YS0+ZmluZEludDMyKGtLZXlJc0RSTSwgJmRybSkgJiYgZHJtICE9IDApIHsKLSAgICAgICAgQUxPR0UoImZyYW1lIGdyYWIgbm90IGFsbG93ZWQuIik7Ci0gICAgICAgIHJldHVybiBFUlJPUl9EUk1fVU5LTk9XTjsKLSAgICB9Ci0KICAgICBzaXplX3QgbiA9IG1FeHRyYWN0b3ItPmNvdW50VHJhY2tzKCk7CiAgICAgc2l6ZV90IGk7CiAgICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgewpAQCAtMzQyLDE1ICszMzcsMTUgQEAKIAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbWF0Y2hpbmdDb2RlY3Muc2l6ZSgpOyArK2kpIHsKICAgICAgICAgY29uc3QgQVN0cmluZyAmY29tcG9uZW50TmFtZSA9IG1hdGNoaW5nQ29kZWNzW2ldOwotICAgICAgICBWaWRlb0ZyYW1lRGVjb2RlciBkZWNvZGVyKGNvbXBvbmVudE5hbWUsIHRyYWNrTWV0YSwgc291cmNlKTsKLSAgICAgICAgaWYgKGRlY29kZXIuaW5pdCh0aW1lVXMsIG51bUZyYW1lcywgb3B0aW9uLCBjb2xvckZvcm1hdCkgPT0gT0spIHsKKyAgICAgICAgc3A8VmlkZW9GcmFtZURlY29kZXI+IGRlY29kZXIgPSBuZXcgVmlkZW9GcmFtZURlY29kZXIoY29tcG9uZW50TmFtZSwgdHJhY2tNZXRhLCBzb3VyY2UpOworICAgICAgICBpZiAoZGVjb2Rlci0+aW5pdCh0aW1lVXMsIG51bUZyYW1lcywgb3B0aW9uLCBjb2xvckZvcm1hdCkgPT0gT0spIHsKICAgICAgICAgICAgIGlmIChvdXRGcmFtZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgKm91dEZyYW1lID0gZGVjb2Rlci5leHRyYWN0RnJhbWUoKTsKKyAgICAgICAgICAgICAgICAqb3V0RnJhbWUgPSBkZWNvZGVyLT5leHRyYWN0RnJhbWUoKTsKICAgICAgICAgICAgICAgICBpZiAoKm91dEZyYW1lICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9LOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSBpZiAob3V0RnJhbWVzICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBkZWNvZGVyLmV4dHJhY3RGcmFtZXMob3V0RnJhbWVzKTsKKyAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBkZWNvZGVyLT5leHRyYWN0RnJhbWVzKG91dEZyYW1lcyk7CiAgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgewogICAgICAgICAgICAgICAgICAgICByZXR1cm4gT0s7CiAgICAgICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRQbHVnaW5Mb2FkZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRQbHVnaW5Mb2FkZXIuY3BwCmluZGV4IDUxOWU4NzAuLmRkNTkwM2EgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0UGx1Z2luTG9hZGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9TdGFnZWZyaWdodFBsdWdpbkxvYWRlci5jcHAKQEAgLTQ2LDcgKzQ2LDcgQEAKICAgICB9CiAgICAgbUNyZWF0ZUlucHV0U3VyZmFjZSA9IChDb2RlY0Jhc2U6OkNyZWF0ZUlucHV0U3VyZmFjZUZ1bmMpZGxzeW0oCiAgICAgICAgICAgICBtTGliSGFuZGxlLCAiQ3JlYXRlSW5wdXRTdXJmYWNlIik7Ci0gICAgaWYgKG1DcmVhdGVCdWlsZGVyID09IG51bGxwdHIpIHsKKyAgICBpZiAobUNyZWF0ZUlucHV0U3VyZmFjZSA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dEKCJGYWlsZWQgdG8gZmluZCBzeW1ib2w6IENyZWF0ZUlucHV0U3VyZmFjZSAoJXMpIiwgZGxlcnJvcigpKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9URVNUX01BUFBJTkcgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9URVNUX01BUFBJTkcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY4MThlYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1RFU1RfTUFQUElORwpAQCAtMCwwICsxLDEyIEBACit7CisgICJwb3N0c3VibWl0IjogWworICAgIHsKKyAgICAgICJuYW1lIjogIkN0c01lZGlhVGVzdENhc2VzIiwKKyAgICAgICJvcHRpb25zIjogWworICAgICAgICB7CisgICAgICAgICAgImluY2x1ZGUtYW5ub3RhdGlvbiI6ICJhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuUmVxdWlyZXNEZXZpY2UiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9CisgIF0KK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1V0aWxzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1V0aWxzLmNwcAppbmRleCBjNzU3OWJjLi40YWVlOWQ1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9VdGlscy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVXRpbHMuY3BwCkBAIC03NCw3ICs3NCw3IEBACiB9CiAjZW5kaWYKIAotc3RhdGljIHZvaWQgY29udmVydE1ldGFEYXRhVG9NZXNzYWdlQ29sb3JBc3BlY3RzKGNvbnN0IHNwPE1ldGFEYXRhPiAmbWV0YSwgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKK3N0YXRpYyB2b2lkIGNvbnZlcnRNZXRhRGF0YVRvTWVzc2FnZUNvbG9yQXNwZWN0cyhjb25zdCBNZXRhRGF0YUJhc2UgKm1ldGEsIHNwPEFNZXNzYWdlPiAmbXNnKSB7CiAgICAgLy8gMCB2YWx1ZXMgYXJlIHVuc3BlY2lmaWVkCiAgICAgaW50MzJfdCByYW5nZSA9IDA7CiAgICAgaW50MzJfdCBwcmltYXJpZXMgPSAwOwpAQCAtNTY4LDggKzU2OCwxMzIgQEAKICAgICB9CiB9CiAKKworc3RhdGljIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxjb25zdCBjaGFyICosIHVpbnQzMl90Pj4gc3RyaW5nTWFwcGluZ3MgeworICAgIHsKKyAgICAgICAgeyAiYWxidW0iLCBrS2V5QWxidW0gfSwKKyAgICAgICAgeyAiYWxidW1hcnRpc3QiLCBrS2V5QWxidW1BcnRpc3QgfSwKKyAgICAgICAgeyAiYXJ0aXN0Iiwga0tleUFydGlzdCB9LAorICAgICAgICB7ICJhdXRob3IiLCBrS2V5QXV0aG9yIH0sCisgICAgICAgIHsgImNkdHJhY2tudW0iLCBrS2V5Q0RUcmFja051bWJlciB9LAorICAgICAgICB7ICJjb21waWxhdGlvbiIsIGtLZXlDb21waWxhdGlvbiB9LAorICAgICAgICB7ICJjb21wb3NlciIsIGtLZXlDb21wb3NlciB9LAorICAgICAgICB7ICJkYXRlIiwga0tleURhdGUgfSwKKyAgICAgICAgeyAiZGlzY251bSIsIGtLZXlEaXNjTnVtYmVyIH0sCisgICAgICAgIHsgImdlbnJlIiwga0tleUdlbnJlIH0sCisgICAgICAgIHsgImxvY2F0aW9uIiwga0tleUxvY2F0aW9uIH0sCisgICAgICAgIHsgImx5cmljaXN0Iiwga0tleVdyaXRlciB9LAorICAgICAgICB7ICJ0aXRsZSIsIGtLZXlUaXRsZSB9LAorICAgICAgICB7ICJ5ZWFyIiwga0tleVllYXIgfSwKKyAgICB9Cit9OworCitzdGF0aWMgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGNvbnN0IGNoYXIgKiwgdWludDMyX3Q+PiBpbnQ2NE1hcHBpbmdzIHsKKyAgICB7CisgICAgICAgIHsgImV4aWYtb2Zmc2V0Iiwga0tleUV4aWZPZmZzZXQgfSwKKyAgICAgICAgeyAiZXhpZi1zaXplIiwga0tleUV4aWZTaXplIH0sCisgICAgfQorfTsKKworc3RhdGljIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxjb25zdCBjaGFyICosIHVpbnQzMl90Pj4gaW50MzJNYXBwaW5ncyB7CisgICAgeworICAgICAgICB7ICJsb29wIiwga0tleUF1dG9Mb29wIH0sCisgICAgICAgIHsgInRpbWUtc2NhbGUiLCBrS2V5VGltZVNjYWxlIH0sCisgICAgICAgIHsgImNyeXB0by1tb2RlIiwga0tleUNyeXB0b01vZGUgfSwKKyAgICAgICAgeyAiY3J5cHRvLWRlZmF1bHQtaXYtc2l6ZSIsIGtLZXlDcnlwdG9EZWZhdWx0SVZTaXplIH0sCisgICAgICAgIHsgImNyeXB0by1lbmNyeXB0ZWQtYnl0ZS1ibG9jayIsIGtLZXlFbmNyeXB0ZWRCeXRlQmxvY2sgfSwKKyAgICAgICAgeyAiY3J5cHRvLXNraXAtYnl0ZS1ibG9jayIsIGtLZXlTa2lwQnl0ZUJsb2NrIH0sCisgICAgICAgIHsgIm1heC1iaXRyYXRlIiwga0tleU1heEJpdFJhdGUgfSwKKyAgICAgICAgeyAicGNtLWJpZy1lbmRpYW4iLCBrS2V5UGNtQmlnRW5kaWFuIH0sCisgICAgICAgIHsgInRlbXBvcmFsLWxheWVyLWNvdW50Iiwga0tleVRlbXBvcmFsTGF5ZXJDb3VudCB9LAorICAgICAgICB7ICJ0aHVtYm5haWwtd2lkdGgiLCBrS2V5VGh1bWJuYWlsV2lkdGggfSwKKyAgICAgICAgeyAidGh1bWJuYWlsLWhlaWdodCIsIGtLZXlUaHVtYm5haWxIZWlnaHQgfSwKKyAgICAgICAgeyAiZnJhbWUtY291bnQiLCBrS2V5RnJhbWVDb3VudCB9LAorICAgIH0KK307CisKK3N0YXRpYyBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8Y29uc3QgY2hhciAqLCB1aW50MzJfdD4+IGJ1ZmZlck1hcHBpbmdzIHsKKyAgICB7CisgICAgICAgIHsgImFsYnVtYXJ0Iiwga0tleUFsYnVtQXJ0IH0sCisgICAgICAgIHsgInBzc2giLCBrS2V5UHNzaCB9LAorICAgICAgICB7ICJjcnlwdG8taXYiLCBrS2V5Q3J5cHRvSVYgfSwKKyAgICAgICAgeyAiY3J5cHRvLWtleSIsIGtLZXlDcnlwdG9LZXkgfSwKKyAgICAgICAgeyAiaWNjLXByb2ZpbGUiLCBrS2V5SWNjUHJvZmlsZSB9LAorICAgICAgICB7ICJ0ZXh0LWZvcm1hdC1kYXRhIiwga0tleVRleHRGb3JtYXREYXRhIH0sCisgICAgfQorfTsKKwordm9pZCBjb252ZXJ0TWVzc2FnZVRvTWV0YURhdGFGcm9tTWFwcGluZ3MoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2csIHNwPE1ldGFEYXRhPiAmbWV0YSkgeworICAgIGZvciAoYXV0byBlbGVtIDogc3RyaW5nTWFwcGluZ3MpIHsKKyAgICAgICAgQVN0cmluZyB2YWx1ZTsKKyAgICAgICAgaWYgKG1zZy0+ZmluZFN0cmluZyhlbGVtLmZpcnN0LCAmdmFsdWUpKSB7CisgICAgICAgICAgICBtZXRhLT5zZXRDU3RyaW5nKGVsZW0uc2Vjb25kLCB2YWx1ZS5jX3N0cigpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoYXV0byBlbGVtIDogaW50NjRNYXBwaW5ncykgeworICAgICAgICBpbnQ2NF90IHZhbHVlOworICAgICAgICBpZiAobXNnLT5maW5kSW50NjQoZWxlbS5maXJzdCwgJnZhbHVlKSkgeworICAgICAgICAgICAgbWV0YS0+c2V0SW50NjQoZWxlbS5zZWNvbmQsIHZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoYXV0byBlbGVtIDogaW50MzJNYXBwaW5ncykgeworICAgICAgICBpbnQzMl90IHZhbHVlOworICAgICAgICBpZiAobXNnLT5maW5kSW50MzIoZWxlbS5maXJzdCwgJnZhbHVlKSkgeworICAgICAgICAgICAgbWV0YS0+c2V0SW50MzIoZWxlbS5zZWNvbmQsIHZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoYXV0byBlbGVtIDogYnVmZmVyTWFwcGluZ3MpIHsKKyAgICAgICAgc3A8QUJ1ZmZlcj4gdmFsdWU7CisgICAgICAgIGlmIChtc2ctPmZpbmRCdWZmZXIoZWxlbS5maXJzdCwgJnZhbHVlKSkgeworICAgICAgICAgICAgbWV0YS0+c2V0RGF0YShlbGVtLnNlY29uZCwKKyAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFCYXNlOjpUeXBlOjpUWVBFX05PTkUsIHZhbHVlLT5kYXRhKCksIHZhbHVlLT5zaXplKCkpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIGNvbnZlcnRNZXRhRGF0YVRvTWVzc2FnZUZyb21NYXBwaW5ncyhjb25zdCBNZXRhRGF0YUJhc2UgKm1ldGEsIHNwPEFNZXNzYWdlPiBmb3JtYXQpIHsKKyAgICBmb3IgKGF1dG8gZWxlbSA6IHN0cmluZ01hcHBpbmdzKSB7CisgICAgICAgIGNvbnN0IGNoYXIgKnZhbHVlOworICAgICAgICBpZiAobWV0YS0+ZmluZENTdHJpbmcoZWxlbS5zZWNvbmQsICZ2YWx1ZSkpIHsKKyAgICAgICAgICAgIGZvcm1hdC0+c2V0U3RyaW5nKGVsZW0uZmlyc3QsIHZhbHVlLCBzdHJsZW4odmFsdWUpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoYXV0byBlbGVtIDogaW50NjRNYXBwaW5ncykgeworICAgICAgICBpbnQ2NF90IHZhbHVlOworICAgICAgICBpZiAobWV0YS0+ZmluZEludDY0KGVsZW0uc2Vjb25kLCAmdmFsdWUpKSB7CisgICAgICAgICAgICBmb3JtYXQtPnNldEludDY0KGVsZW0uZmlyc3QsIHZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoYXV0byBlbGVtIDogaW50MzJNYXBwaW5ncykgeworICAgICAgICBpbnQzMl90IHZhbHVlOworICAgICAgICBpZiAobWV0YS0+ZmluZEludDMyKGVsZW0uc2Vjb25kLCAmdmFsdWUpKSB7CisgICAgICAgICAgICBmb3JtYXQtPnNldEludDMyKGVsZW0uZmlyc3QsIHZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoYXV0byBlbGVtIDogYnVmZmVyTWFwcGluZ3MpIHsKKyAgICAgICAgdWludDMyX3QgdHlwZTsKKyAgICAgICAgY29uc3Qgdm9pZCogZGF0YTsKKyAgICAgICAgc2l6ZV90IHNpemU7CisgICAgICAgIGlmIChtZXRhLT5maW5kRGF0YShlbGVtLnNlY29uZCwgJnR5cGUsICZkYXRhLCAmc2l6ZSkpIHsKKyAgICAgICAgICAgIHNwPEFCdWZmZXI+IGJ1ZiA9IEFCdWZmZXI6OkNyZWF0ZUFzQ29weShkYXRhLCBzaXplKTsKKyAgICAgICAgICAgIGZvcm1hdC0+c2V0QnVmZmVyKGVsZW0uZmlyc3QsIGJ1Zik7CisgICAgICAgIH0KKyAgICB9Cit9CisKIHN0YXR1c190IGNvbnZlcnRNZXRhRGF0YVRvTWVzc2FnZSgKICAgICAgICAgY29uc3Qgc3A8TWV0YURhdGE+ICZtZXRhLCBzcDxBTWVzc2FnZT4gKmZvcm1hdCkgeworICAgIHJldHVybiBjb252ZXJ0TWV0YURhdGFUb01lc3NhZ2UobWV0YS5nZXQoKSwgZm9ybWF0KTsKK30KKworc3RhdHVzX3QgY29udmVydE1ldGFEYXRhVG9NZXNzYWdlKAorICAgICAgICBjb25zdCBNZXRhRGF0YUJhc2UgKm1ldGEsIHNwPEFNZXNzYWdlPiAqZm9ybWF0KSB7CiAKICAgICBmb3JtYXQtPmNsZWFyKCk7CiAKQEAgLTU4Niw2ICs3MTAsOCBAQAogICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2U7CiAgICAgbXNnLT5zZXRTdHJpbmcoIm1pbWUiLCBtaW1lKTsKIAorICAgIGNvbnZlcnRNZXRhRGF0YVRvTWVzc2FnZUZyb21NYXBwaW5ncyhtZXRhLCBtc2cpOworCiAgICAgdWludDMyX3QgdHlwZTsKICAgICBjb25zdCB2b2lkICpkYXRhOwogICAgIHNpemVfdCBzaXplOwpAQCAtNTk5LDYgKzcyNSwxNiBAQAogICAgICAgICBtZW1jcHkoYnVmZmVyLT5kYXRhKCksIGRhdGEsIHNpemUpOwogICAgIH0KIAorICAgIGlmIChtZXRhLT5maW5kRGF0YShrS2V5Q0FQcml2YXRlRGF0YSwgJnR5cGUsICZkYXRhLCAmc2l6ZSkpIHsKKyAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gbmV3IChzdGQ6Om5vdGhyb3cpIEFCdWZmZXIoc2l6ZSk7CisgICAgICAgIGlmIChidWZmZXIuZ2V0KCkgPT0gTlVMTCB8fCBidWZmZXItPmJhc2UoKSA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgICAgICB9CisKKyAgICAgICAgbXNnLT5zZXRCdWZmZXIoImNhLXByaXZhdGUtZGF0YSIsIGJ1ZmZlcik7CisgICAgICAgIG1lbWNweShidWZmZXItPmRhdGEoKSwgZGF0YSwgc2l6ZSk7CisgICAgfQorCiAgICAgaW50MzJfdCBzeXN0ZW1JZDsKICAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlDQVN5c3RlbUlELCAmc3lzdGVtSWQpKSB7CiAgICAgICAgIG1zZy0+c2V0SW50MzIoImNhLXN5c3RlbS1pZCIsIHN5c3RlbUlkKTsKQEAgLTcyMyw2ICs4NTksMTEgQEAKICAgICAgICAgbXNnLT5zZXRJbnQzMigiY2hhbm5lbC1jb3VudCIsIG51bUNoYW5uZWxzKTsKICAgICAgICAgbXNnLT5zZXRJbnQzMigic2FtcGxlLXJhdGUiLCBzYW1wbGVSYXRlKTsKIAorICAgICAgICBpbnQzMl90IGJpdHNQZXJTYW1wbGU7CisgICAgICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleUJpdHNQZXJTYW1wbGUsICZiaXRzUGVyU2FtcGxlKSkgeworICAgICAgICAgICAgbXNnLT5zZXRJbnQzMigiYml0cy1wZXItc2FtcGxlIiwgYml0c1BlclNhbXBsZSk7CisgICAgICAgIH0KKwogICAgICAgICBpbnQzMl90IGNoYW5uZWxNYXNrOwogICAgICAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlDaGFubmVsTWFzaywgJmNoYW5uZWxNYXNrKSkgewogICAgICAgICAgICAgbXNnLT5zZXRJbnQzMigiY2hhbm5lbC1tYXNrIiwgY2hhbm5lbE1hc2spOwpAQCAtMTA0OCw3ICsxMTg5LDcgQEAKICAgICAgICAgICAgICAgICBtc2ctPnNldEludDMyKCJtYXgtYml0cmF0ZSIsIChpbnQzMl90KW1heEJpdHJhdGUpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChtZXRhLT5maW5kRGF0YShrVHlwZUQyNjMsICZ0eXBlLCAmZGF0YSwgJnNpemUpKSB7CisgICAgfSBlbHNlIGlmIChtZXRhLT5maW5kRGF0YShrS2V5RDI2MywgJnR5cGUsICZkYXRhLCAmc2l6ZSkpIHsKICAgICAgICAgY29uc3QgdWludDhfdCAqcHRyID0gKGNvbnN0IHVpbnQ4X3QgKilkYXRhOwogICAgICAgICBwYXJzZUgyNjNQcm9maWxlTGV2ZWxGcm9tRDI2MyhwdHIsIHNpemUsIG1zZyk7CiAgICAgfSBlbHNlIGlmIChtZXRhLT5maW5kRGF0YShrS2V5Vm9yYmlzSW5mbywgJnR5cGUsICZkYXRhLCAmc2l6ZSkpIHsKQEAgLTExNDgsMTMgKzEyODksNiBAQAogICAgICAgICBtc2ctPnNldEJ1ZmZlcigiY3NkLTAiLCBidWZmZXIpOwogICAgIH0KIAotICAgIC8vIFRPRE8gZXhwb3NlICJjcnlwdG8ta2V5Ii9rS2V5Q3J5cHRvS2V5IHRocm91Z2ggcHVibGljIGFwaQotICAgIGlmIChtZXRhLT5maW5kRGF0YShrS2V5Q3J5cHRvS2V5LCAmdHlwZSwgJmRhdGEsICZzaXplKSkgewotICAgICAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSBuZXcgKHN0ZDo6bm90aHJvdykgQUJ1ZmZlcihzaXplKTsKLSAgICAgICAgbXNnLT5zZXRCdWZmZXIoImNyeXB0by1rZXkiLCBidWZmZXIpOwotICAgICAgICBtZW1jcHkoYnVmZmVyLT5kYXRhKCksIGRhdGEsIHNpemUpOwotICAgIH0KLQogICAgICpmb3JtYXQgPSBtc2c7CiAKICAgICByZXR1cm4gT0s7CkBAIC0xMzUzLDYgKzE0ODcsMjEgQEAKICAgICAgICAgQUxPR1coImRpZCBub3QgZmluZCBtaW1lIHR5cGUiKTsKICAgICB9CiAKKyAgICBjb252ZXJ0TWVzc2FnZVRvTWV0YURhdGFGcm9tTWFwcGluZ3MobXNnLCBtZXRhKTsKKworICAgIGludDMyX3Qgc3lzdGVtSWQ7CisgICAgaWYgKG1zZy0+ZmluZEludDMyKCJjYS1zeXN0ZW0taWQiLCAmc3lzdGVtSWQpKSB7CisgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlDQVN5c3RlbUlELCBzeXN0ZW1JZCk7CisKKyAgICAgICAgc3A8QUJ1ZmZlcj4gY2FTZXNzaW9uSWQsIGNhUHZ0RGF0YTsKKyAgICAgICAgaWYgKG1zZy0+ZmluZEJ1ZmZlcigiY2Etc2Vzc2lvbi1pZCIsICZjYVNlc3Npb25JZCkpIHsKKyAgICAgICAgICAgIG1ldGEtPnNldERhdGEoa0tleUNBU2Vzc2lvbklELCAwLCBjYVNlc3Npb25JZC0+ZGF0YSgpLCBjYVNlc3Npb25JZC0+c2l6ZSgpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobXNnLT5maW5kQnVmZmVyKCJjYS1wcml2YXRlLWRhdGEiLCAmY2FQdnREYXRhKSkgeworICAgICAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5Q0FQcml2YXRlRGF0YSwgMCwgY2FQdnREYXRhLT5kYXRhKCksIGNhUHZ0RGF0YS0+c2l6ZSgpKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIGludDY0X3QgZHVyYXRpb25VczsKICAgICBpZiAobXNnLT5maW5kSW50NjQoImR1cmF0aW9uVXMiLCAmZHVyYXRpb25VcykpIHsKICAgICAgICAgbWV0YS0+c2V0SW50NjQoa0tleUR1cmF0aW9uLCBkdXJhdGlvblVzKTsKQEAgLTEzODQsNyArMTUzMyw3IEBACiAgICAgICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5V2lkdGgsIHdpZHRoKTsKICAgICAgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlIZWlnaHQsIGhlaWdodCk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HVygiZGlkIG5vdCBmaW5kIHdpZHRoIGFuZC9vciBoZWlnaHQiKTsKKyAgICAgICAgICAgIEFMT0dWKCJkaWQgbm90IGZpbmQgd2lkdGggYW5kL29yIGhlaWdodCIpOwogICAgICAgICB9CiAKICAgICAgICAgaW50MzJfdCBzYXJXaWR0aCwgc2FySGVpZ2h0OwpAQCAtMTQ3MSw2ICsxNjIwLDEwIEBACiAgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMigic2FtcGxlLXJhdGUiLCAmc2FtcGxlUmF0ZSkpIHsKICAgICAgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlTYW1wbGVSYXRlLCBzYW1wbGVSYXRlKTsKICAgICAgICAgfQorICAgICAgICBpbnQzMl90IGJpdHNQZXJTYW1wbGU7CisgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMigiYml0cy1wZXItc2FtcGxlIiwgJmJpdHNQZXJTYW1wbGUpKSB7CisgICAgICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5Qml0c1BlclNhbXBsZSwgYml0c1BlclNhbXBsZSk7CisgICAgICAgIH0KICAgICAgICAgaW50MzJfdCBjaGFubmVsTWFzazsKICAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKCJjaGFubmVsLW1hc2siLCAmY2hhbm5lbE1hc2spKSB7CiAgICAgICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5Q2hhbm5lbE1hc2ssIGNoYW5uZWxNYXNrKTsKQEAgLTE1MjksMTkgKzE2ODIsMTkgQEAKICAgICAgICAgICAgIGlmIChtc2ctPmZpbmRCdWZmZXIoImNzZC0xIiwgJmNzZDEpKSB7CiAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Y2hhcj4gYXZjYyhjc2Qwc2l6ZSArIGNzZDEtPnNpemUoKSArIDEwMjQpOwogICAgICAgICAgICAgICAgIHNpemVfdCBvdXRzaXplID0gcmVhc3NlbWJsZUFWQ0MoY3NkMCwgY3NkMSwgYXZjYy5kYXRhKCkpOwotICAgICAgICAgICAgICAgIG1ldGEtPnNldERhdGEoa0tleUFWQ0MsIGtLZXlBVkNDLCBhdmNjLmRhdGEoKSwgb3V0c2l6ZSk7CisgICAgICAgICAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5QVZDQywga1R5cGVBVkNDLCBhdmNjLmRhdGEoKSwgb3V0c2l6ZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSBpZiAobWltZSA9PSBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMgfHwgbWltZSA9PSBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCkgewogICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Y2hhcj4gZXNkcyhjc2Qwc2l6ZSArIDMxKTsKICAgICAgICAgICAgIC8vIFRoZSB3cml0dGVuIEVTRFMgaXMgYWN0dWFsbHkgZm9yIGFuIGF1ZGlvIHN0cmVhbSwgYnV0IGl0J3MgZW5vdWdoCiAgICAgICAgICAgICAvLyBmb3IgdHJhbnNwb3J0aW5nIHRoZSBDU0QgdG8gbXV4ZXJzLgogICAgICAgICAgICAgcmVhc3NlbWJsZUVTRFMoY3NkMCwgZXNkcy5kYXRhKCkpOwotICAgICAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5RVNEUywga0tleUVTRFMsIGVzZHMuZGF0YSgpLCBlc2RzLnNpemUoKSk7CisgICAgICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlFU0RTLCBrVHlwZUVTRFMsIGVzZHMuZGF0YSgpLCBlc2RzLnNpemUoKSk7CiAgICAgICAgIH0gZWxzZSBpZiAobWltZSA9PSBNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDIHx8CiAgICAgICAgICAgICAgICAgICAgbWltZSA9PSBNRURJQV9NSU1FVFlQRV9JTUFHRV9BTkRST0lEX0hFSUMpIHsKICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGh2Y2MoY3NkMHNpemUgKyAxMDI0KTsKICAgICAgICAgICAgIHNpemVfdCBvdXRzaXplID0gcmVhc3NlbWJsZUhWQ0MoY3NkMCwgaHZjYy5kYXRhKCksIGh2Y2Muc2l6ZSgpLCA0KTsKLSAgICAgICAgICAgIG1ldGEtPnNldERhdGEoa0tleUhWQ0MsIGtLZXlIVkNDLCBodmNjLmRhdGEoKSwgb3V0c2l6ZSk7CisgICAgICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlIVkNDLCBrVHlwZUhWQ0MsIGh2Y2MuZGF0YSgpLCBvdXRzaXplKTsKICAgICAgICAgfSBlbHNlIGlmIChtaW1lID09IE1FRElBX01JTUVUWVBFX1ZJREVPX1ZQOSkgewogICAgICAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5VnA5Q29kZWNQcml2YXRlLCAwLCBjc2QwLT5kYXRhKCksIGNzZDAtPnNpemUoKSk7CiAgICAgICAgIH0gZWxzZSBpZiAobWltZSA9PSBNRURJQV9NSU1FVFlQRV9BVURJT19PUFVTKSB7CkBAIC0xNTYwLDExICsxNzEzLDE3IEBACiAgICAgICAgIH0gZWxzZSBpZiAobWltZSA9PSBNRURJQV9NSU1FVFlQRV9BVURJT19BTEFDKSB7CiAgICAgICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlBbGFjTWFnaWNDb29raWUsIDAsIGNzZDAtPmRhdGEoKSwgY3NkMC0+c2l6ZSgpKTsKICAgICAgICAgfQotICAgIH0KLQotICAgIGludDMyX3QgdGltZVNjYWxlOwotICAgIGlmIChtc2ctPmZpbmRJbnQzMigidGltZS1zY2FsZSIsICZ0aW1lU2NhbGUpKSB7Ci0gICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlUaW1lU2NhbGUsIHRpbWVTY2FsZSk7CisgICAgfSBlbHNlIGlmIChtaW1lID09IE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQyAmJiBtc2ctPmZpbmRCdWZmZXIoImNzZC1hdmMiLCAmY3NkMCkpIHsKKyAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5QVZDQywga1R5cGVBVkNDLCBjc2QwLT5kYXRhKCksIGNzZDAtPnNpemUoKSk7CisgICAgfSBlbHNlIGlmICgobWltZSA9PSBNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDIHx8IG1pbWUgPT0gTUVESUFfTUlNRVRZUEVfSU1BR0VfQU5EUk9JRF9IRUlDKQorICAgICAgICAgICAgJiYgbXNnLT5maW5kQnVmZmVyKCJjc2QtaGV2YyIsICZjc2QwKSkgeworICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlIVkNDLCBrVHlwZUhWQ0MsIGNzZDAtPmRhdGEoKSwgY3NkMC0+c2l6ZSgpKTsKKyAgICB9IGVsc2UgaWYgKG1zZy0+ZmluZEJ1ZmZlcigiZXNkcyIsICZjc2QwKSkgeworICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlFU0RTLCBrVHlwZUVTRFMsIGNzZDAtPmRhdGEoKSwgY3NkMC0+c2l6ZSgpKTsKKyAgICB9IGVsc2UgaWYgKG1zZy0+ZmluZEJ1ZmZlcigibXBlZzItc3RyZWFtLWhlYWRlciIsICZjc2QwKSkgeworICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlTdHJlYW1IZWFkZXIsICdtZGF0JywgY3NkMC0+ZGF0YSgpLCBjc2QwLT5zaXplKCkpOworICAgIH0gZWxzZSBpZiAobXNnLT5maW5kQnVmZmVyKCJkMjYzIiwgJmNzZDApKSB7CisgICAgICAgIG1ldGEtPnNldERhdGEoa0tleUQyNjMsIGtUeXBlRDI2MywgY3NkMC0+ZGF0YSgpLCBjc2QwLT5zaXplKCkpOwogICAgIH0KIAogICAgIC8vIFhYWCBUT0RPIGFkZCB3aGF0ZXZlciBvdGhlciBrZXlzIHRoZXJlIGFyZQpAQCAtMTY0MCw2ICsxNzk5LDggQEAKICAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX1ZPUkJJUywgICAgICBBVURJT19GT1JNQVRfVk9SQklTIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19PUFVTLCAgICAgICAgQVVESU9fRk9STUFUX09QVVN9LAogICAgIHsgTUVESUFfTUlNRVRZUEVfQVVESU9fQUMzLCAgICAgICAgIEFVRElPX0ZPUk1BVF9BQzN9LAorICAgIHsgTUVESUFfTUlNRVRZUEVfQVVESU9fRUFDMywgICAgICAgIEFVRElPX0ZPUk1BVF9FX0FDM30sCisgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19BQzQsICAgICAgICAgQVVESU9fRk9STUFUX0FDNH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19GTEFDLCAgICAgICAgQVVESU9fRk9STUFUX0ZMQUN9LAogICAgIHsgTUVESUFfTUlNRVRZUEVfQVVESU9fQUxBQywgICAgICAgIEFVRElPX0ZPUk1BVF9BTEFDIH0sCiAgICAgeyAwLCBBVURJT19GT1JNQVRfSU5WQUxJRCB9CkBAIC0xNjkzLDQzICsxODU0LDQzIEBACiAgICAgcmV0dXJuOwogfQogCi1ib29sIGNhbk9mZmxvYWRTdHJlYW0oY29uc3Qgc3A8TWV0YURhdGE+JiBtZXRhLCBib29sIGhhc1ZpZGVvLAotICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNTdHJlYW1pbmcsIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSkKK3N0YXR1c190IGdldEF1ZGlvT2ZmbG9hZEluZm8oY29uc3Qgc3A8TWV0YURhdGE+JiBtZXRhLCBib29sIGhhc1ZpZGVvLAorICAgICAgICBib29sIGlzU3RyZWFtaW5nLCBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUsIGF1ZGlvX29mZmxvYWRfaW5mb190ICppbmZvKQogewogICAgIGNvbnN0IGNoYXIgKm1pbWU7CiAgICAgaWYgKG1ldGEgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogICAgIENIRUNLKG1ldGEtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKTsKIAotICAgIGF1ZGlvX29mZmxvYWRfaW5mb190IGluZm8gPSBBVURJT19JTkZPX0lOSVRJQUxJWkVSOworICAgICgqaW5mbykgPSBBVURJT19JTkZPX0lOSVRJQUxJWkVSOwogCi0gICAgaW5mby5mb3JtYXQgPSBBVURJT19GT1JNQVRfSU5WQUxJRDsKLSAgICBpZiAobWFwTWltZVRvQXVkaW9Gb3JtYXQoaW5mby5mb3JtYXQsIG1pbWUpICE9IE9LKSB7CisgICAgaW5mby0+Zm9ybWF0ID0gQVVESU9fRk9STUFUX0lOVkFMSUQ7CisgICAgaWYgKG1hcE1pbWVUb0F1ZGlvRm9ybWF0KGluZm8tPmZvcm1hdCwgbWltZSkgIT0gT0spIHsKICAgICAgICAgQUxPR0UoIiBDb3VsZG4ndCBtYXAgbWltZSB0eXBlIFwiJXNcIiB0byBhIHZhbGlkIEF1ZGlvU3lzdGVtOjphdWRpb19mb3JtYXQgISIsIG1pbWUpOwotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoIk1pbWUgdHlwZSBcIiVzXCIgbWFwcGVkIHRvIGF1ZGlvX2Zvcm1hdCAlZCIsIG1pbWUsIGluZm8uZm9ybWF0KTsKKyAgICAgICAgQUxPR1YoIk1pbWUgdHlwZSBcIiVzXCIgbWFwcGVkIHRvIGF1ZGlvX2Zvcm1hdCAlZCIsIG1pbWUsIGluZm8tPmZvcm1hdCk7CiAgICAgfQogCi0gICAgaWYgKEFVRElPX0ZPUk1BVF9JTlZBTElEID09IGluZm8uZm9ybWF0KSB7CisgICAgaWYgKEFVRElPX0ZPUk1BVF9JTlZBTElEID09IGluZm8tPmZvcm1hdCkgewogICAgICAgICAvLyBjYW4ndCBvZmZsb2FkIGlmIHdlIGRvbid0IGtub3cgd2hhdCB0aGUgc291cmNlIGZvcm1hdCBpcwogICAgICAgICBBTE9HRSgibWltZSB0eXBlIFwiJXNcIiBub3QgYSBrbm93biBhdWRpbyBmb3JtYXQiLCBtaW1lKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAogICAgIC8vIFJlZGVmaW5lIGFhYyBmb3JtYXQgYWNjb3JkaW5nIHRvIGl0cyBwcm9maWxlCiAgICAgLy8gT2ZmbG9hZGluZyBkZXBlbmRzIG9uIGF1ZGlvIERTUCBjYXBhYmlsaXRpZXMuCiAgICAgaW50MzJfdCBhYWNhb3QgPSAtMTsKICAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlBQUNBT1QsICZhYWNhb3QpKSB7Ci0gICAgICAgIG1hcEFBQ1Byb2ZpbGVUb0F1ZGlvRm9ybWF0KGluZm8uZm9ybWF0LChPTVhfQVVESU9fQUFDUFJPRklMRVRZUEUpIGFhY2FvdCk7CisgICAgICAgIG1hcEFBQ1Byb2ZpbGVUb0F1ZGlvRm9ybWF0KGluZm8tPmZvcm1hdCwoT01YX0FVRElPX0FBQ1BST0ZJTEVUWVBFKSBhYWNhb3QpOwogICAgIH0KIAogICAgIGludDMyX3Qgc3JhdGUgPSAtMTsKICAgICBpZiAoIW1ldGEtPmZpbmRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgJnNyYXRlKSkgewogICAgICAgICBBTE9HVigidHJhY2sgb2YgdHlwZSAnJXMnIGRvZXMgbm90IHB1Ymxpc2ggc2FtcGxlIHJhdGUiLCBtaW1lKTsKICAgICB9Ci0gICAgaW5mby5zYW1wbGVfcmF0ZSA9IHNyYXRlOworICAgIGluZm8tPnNhbXBsZV9yYXRlID0gc3JhdGU7CiAKICAgICBpbnQzMl90IGNtYXNrID0gMDsKICAgICBpZiAoIW1ldGEtPmZpbmRJbnQzMihrS2V5Q2hhbm5lbE1hc2ssICZjbWFzaykgfHwgY21hc2sgPT0gQ0hBTk5FTF9NQVNLX1VTRV9DSEFOTkVMX09SREVSKSB7CkBAIC0xNzQzLDI1ICsxOTA0LDM0IEBACiAgICAgICAgICAgICBjbWFzayA9IGF1ZGlvX2NoYW5uZWxfb3V0X21hc2tfZnJvbV9jb3VudChjaGFubmVsQ291bnQpOwogICAgICAgICB9CiAgICAgfQotICAgIGluZm8uY2hhbm5lbF9tYXNrID0gY21hc2s7CisgICAgaW5mby0+Y2hhbm5lbF9tYXNrID0gY21hc2s7CiAKICAgICBpbnQ2NF90IGR1cmF0aW9uID0gMDsKICAgICBpZiAoIW1ldGEtPmZpbmRJbnQ2NChrS2V5RHVyYXRpb24sICZkdXJhdGlvbikpIHsKICAgICAgICAgQUxPR1YoInRyYWNrIG9mIHR5cGUgJyVzJyBkb2VzIG5vdCBwdWJsaXNoIGR1cmF0aW9uIiwgbWltZSk7CiAgICAgfQotICAgIGluZm8uZHVyYXRpb25fdXMgPSBkdXJhdGlvbjsKKyAgICBpbmZvLT5kdXJhdGlvbl91cyA9IGR1cmF0aW9uOwogCiAgICAgaW50MzJfdCBicmF0ZSA9IC0xOwogICAgIGlmICghbWV0YS0+ZmluZEludDMyKGtLZXlCaXRSYXRlLCAmYnJhdGUpKSB7CiAgICAgICAgIEFMT0dWKCJ0cmFjayBvZiB0eXBlICclcycgZG9lcyBub3QgcHVibGlzaCBiaXRyYXRlIiwgbWltZSk7CiAgICAgfQotICAgIGluZm8uYml0X3JhdGUgPSBicmF0ZTsKKyAgICBpbmZvLT5iaXRfcmF0ZSA9IGJyYXRlOwogCiAKLSAgICBpbmZvLnN0cmVhbV90eXBlID0gc3RyZWFtVHlwZTsKLSAgICBpbmZvLmhhc192aWRlbyA9IGhhc1ZpZGVvOwotICAgIGluZm8uaXNfc3RyZWFtaW5nID0gaXNTdHJlYW1pbmc7CisgICAgaW5mby0+c3RyZWFtX3R5cGUgPSBzdHJlYW1UeXBlOworICAgIGluZm8tPmhhc192aWRlbyA9IGhhc1ZpZGVvOworICAgIGluZm8tPmlzX3N0cmVhbWluZyA9IGlzU3RyZWFtaW5nOworICAgIHJldHVybiBPSzsKK30KIAorYm9vbCBjYW5PZmZsb2FkU3RyZWFtKGNvbnN0IHNwPE1ldGFEYXRhPiYgbWV0YSwgYm9vbCBoYXNWaWRlbywKKyAgICAgICAgICAgICAgICAgICAgICBib29sIGlzU3RyZWFtaW5nLCBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUpCit7CisgICAgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgaW5mbyA9IEFVRElPX0lORk9fSU5JVElBTElaRVI7CisgICAgaWYgKE9LICE9IGdldEF1ZGlvT2ZmbG9hZEluZm8obWV0YSwgaGFzVmlkZW8sIGlzU3RyZWFtaW5nLCBzdHJlYW1UeXBlLCAmaW5mbykpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KICAgICAvLyBDaGVjayBpZiBvZmZsb2FkIGlzIHBvc3NpYmxlIGZvciBnaXZlbiBmb3JtYXQsIHN0cmVhbSB0eXBlLCBzYW1wbGUgcmF0ZSwKICAgICAvLyBiaXQgcmF0ZSwgZHVyYXRpb24sIHZpZGVvIGFuZCBzdHJlYW1pbmcKICAgICByZXR1cm4gQXVkaW9TeXN0ZW06OmlzT2ZmbG9hZFN1cHBvcnRlZChpbmZvKTsKQEAgLTE5MzEsNCArMjEwMSwzIEBACiB9CiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2JxaGVscGVyL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9icWhlbHBlci9BbmRyb2lkLmJwCmluZGV4IDRmNDZiZTcuLmM2NDdmNWYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2JxaGVscGVyL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvYnFoZWxwZXIvQW5kcm9pZC5icApAQCAtNCw3ICs0LDcgQEAKICAgICB2bmRrOiB7CiAgICAgICAgIGVuYWJsZWQ6IHRydWUsCiAgICAgfSwKLQorICAgIGRvdWJsZV9sb2FkYWJsZTogdHJ1ZSwKICAgICBzcmNzOiBbCiAgICAgICAgICJDb252ZXJzaW9uLmNwcCIsCiAgICAgICAgICJGcmFtZURyb3BwZXIuY3BwIiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2JxaGVscGVyL0NvbnZlcnNpb24uY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvYnFoZWxwZXIvQ29udmVyc2lvbi5jcHAKaW5kZXggZmZlZDAwNS4uOTFkN2M3NCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvYnFoZWxwZXIvQ29udmVyc2lvbi5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvYnFoZWxwZXIvQ29udmVyc2lvbi5jcHAKQEAgLTk4LDYgKzk4LDE3IEBACiAgKi8KIAogLyoqCisgKiBcYnJpZWYgQ29udmVydCBgUmV0dXJuPHZvaWQ+YCB0byBgc3RhdHVzX3RgLiBUaGlzIGlzIGZvciBsZWdhY3kgYmluZGVyIGNhbGxzLgorICoKKyAqIFxwYXJhbVtpbl0gdCBUaGUgc291cmNlIGBSZXR1cm48dm9pZD5gLgorICogXHJldHVybiBUaGUgY29ycmVzcG9uZGluZyBgc3RhdHVzX3RgLgorICovCisvLyBjb252ZXJ0OiBSZXR1cm48dm9pZD4gLT4gc3RhdHVzX3QKK3N0YXR1c190IHRvU3RhdHVzVChSZXR1cm48dm9pZD4gY29uc3QmIHQpIHsKKyAgICByZXR1cm4gdC5pc09rKCkgPyBPSyA6ICh0LmlzRGVhZE9iamVjdCgpID8gREVBRF9PQkpFQ1QgOiBVTktOT1dOX0VSUk9SKTsKK30KKworLyoqCiAgKiBcYnJpZWYgQ29udmVydCBgUmV0dXJuPHZvaWQ+YCB0byBgYmluZGVyOjpTdGF0dXNgLgogICoKICAqIFxwYXJhbVtpbl0gdCBUaGUgc291cmNlIGBSZXR1cm48dm9pZD5gLgpAQCAtMTA3LDIyICsxMTgsMTEgQEAKIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgdG9CaW5kZXJTdGF0dXMoCiAgICAgICAgIFJldHVybjx2b2lkPiBjb25zdCYgdCkgewogICAgIHJldHVybiA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOjpmcm9tRXhjZXB0aW9uQ29kZSgKLSAgICAgICAgICAgIHQuaXNPaygpID8gT0sgOiBVTktOT1dOX0VSUk9SLAorICAgICAgICAgICAgdG9TdGF0dXNUKHQpLAogICAgICAgICAgICAgdC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOwogfQogCiAvKioKLSAqIFxicmllZiBDb252ZXJ0IGBSZXR1cm48dm9pZD5gIHRvIGBzdGF0dXNfdGAuIFRoaXMgaXMgZm9yIGxlZ2FjeSBiaW5kZXIgY2FsbHMuCi0gKgotICogXHBhcmFtW2luXSB0IFRoZSBzb3VyY2UgYFJldHVybjx2b2lkPmAuCi0gKiBccmV0dXJuIFRoZSBjb3JyZXNwb25kaW5nIGBzdGF0dXNfdGAuCi0gKi8KLS8vIGNvbnZlcnQ6IFJldHVybjx2b2lkPiAtPiBzdGF0dXNfdAotc3RhdHVzX3QgdG9TdGF0dXNUKFJldHVybjx2b2lkPiBjb25zdCYgdCkgewotICAgIHJldHVybiB0LmlzT2soKSA/IE9LIDogVU5LTk9XTl9FUlJPUjsKLX0KLQotLyoqCiAgKiBcYnJpZWYgV3JhcCBgbmF0aXZlX2hhbmRsZV90KmAgaW4gYGhpZGxfaGFuZGxlYC4KICAqCiAgKiBccGFyYW1baW5dIG5oIFRoZSBzb3VyY2UgYG5hdGl2ZV9oYW5kbGVfdCpgLgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvYnFoZWxwZXIvR3JhcGhpY0J1ZmZlclNvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9icWhlbHBlci9HcmFwaGljQnVmZmVyU291cmNlLmNwcAppbmRleCBkZDAzZDM4Li44YzFkYTc2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9icWhlbHBlci9HcmFwaGljQnVmZmVyU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9icWhlbHBlci9HcmFwaGljQnVmZmVyU291cmNlLmNwcApAQCAtNzY3LDcgKzc2Nyw3IEBACiAgICAgICAgICAgICBkb3VibGUgbkZyYW1lcyA9ICh0aW1lVXMgLSBtUHJldkNhcHR1cmVVcykgKiBtQ2FwdHVyZUZwcyAvIDEwMDAwMDA7CiAgICAgICAgICAgICBpZiAobkZyYW1lcyA8IDAuNSAtIGtUaW1lc3RhbXBGbHVjdHVhdGlvbikgewogICAgICAgICAgICAgICAgIC8vIHNraXAgdGhpcyBmcmFtZSBhcyBpdCdzIHRvbyBjbG9zZSB0byBwcmV2aW91cyBjYXB0dXJlCi0gICAgICAgICAgICAgICAgQUxPR1YoInNraXBwaW5nIGZyYW1lLCB0aW1lVXMgJWxsZCIsIHN0YXRpY19jYXN0PGxvbmcgbG9uZz4odGltZVVzKSk7CisgICAgICAgICAgICAgICAgQUxPR0QoInNraXBwaW5nIGZyYW1lLCB0aW1lVXMgJWxsZCIsIHN0YXRpY19jYXN0PGxvbmcgbG9uZz4odGltZVVzKSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKG5GcmFtZXMgPD0gMS4wKSB7CkBAIC0xMTA2LDYgKzExMDYsMTQgQEAKICAgICAgICAgY29uc3VtZXJVc2FnZSB8PSBHUkFMTE9DX1VTQUdFX0hXX1ZJREVPX0VOQ09ERVI7CiAgICAgICAgIG1Db25zdW1lci0+c2V0Q29uc3VtZXJVc2FnZUJpdHMoY29uc3VtZXJVc2FnZSk7CiAKKyAgICAgICAgLy8gU2V0IGltcGwuIGRlZmluZWQgZm9ybWF0IGFzIGRlZmF1bHQuIERlcGVuZGluZyBvbiB0aGUgdXNhZ2UgZmxhZ3MKKyAgICAgICAgLy8gdGhlIGRldmljZS1zcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiB3aWxsIGRlcml2ZSB0aGUgZXhhY3QgZm9ybWF0LgorICAgICAgICBlcnIgPSBtQ29uc3VtZXItPnNldERlZmF1bHRCdWZmZXJGb3JtYXQoSEFMX1BJWEVMX0ZPUk1BVF9JTVBMRU1FTlRBVElPTl9ERUZJTkVEKTsKKyAgICAgICAgaWYgKGVyciAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBjb25maWd1cmUgc3VyZmFjZSBkZWZhdWx0IGZvcm1hdCByZXQ6ICVkIiwgZXJyKTsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKwogICAgICAgICAvLyBTZXRzIHRoZSBkZWZhdWx0IGJ1ZmZlciBkYXRhIHNwYWNlCiAgICAgICAgIEFMT0dEKCJzZXR0aW5nIGRhdGFzcGFjZTogJSN4LCBhY3F1aXJlZD0lZCIsIGRhdGFTcGFjZSwgbU51bU91dHN0YW5kaW5nQWNxdWlyZXMpOwogICAgICAgICBtQ29uc3VtZXItPnNldERlZmF1bHRCdWZmZXJEYXRhU3BhY2UoKGFuZHJvaWRfZGF0YXNwYWNlKWRhdGFTcGFjZSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9wdmRlY19hcGkuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvcHZkZWNfYXBpLmNwcAppbmRleCA3NWNhODQ2Li45YzBmY2ZhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9wdmRlY19hcGkuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3B2ZGVjX2FwaS5jcHAKQEAgLTE4Niw4ICsxODYsOCBAQAogI2lmZGVmIERFQ19JTlRFUk5BTF9NRU1PUllfT1BUCiAgICAgICAgICAgICAgICAgdmlkZW8tPnZvbFtpZHhdID0gSU1FTV92b2xbaWR4XTsKICAgICAgICAgICAgICAgICB2aWRlby0+bWVtb3J5VXNhZ2UgKz0gc2l6ZW9mKFZvbCk7Ci0gICAgICAgICAgICAgICAgb3NjbF9tZW1zZXQodmlkZW8tPnZvbFtpZHhdLCAwLCBzaXplb2YoVm9sKSk7CiAgICAgICAgICAgICAgICAgaWYgKHZpZGVvLT52b2xbaWR4XSA9PSBOVUxMKSBzdGF0dXMgPSBQVl9GQUxTRTsKKyAgICAgICAgICAgICAgICBlbHNlIG9zY2xfbWVtc2V0KHZpZGVvLT52b2xbaWR4XSwgMCwgc2l6ZW9mKFZvbCkpOwogICAgICAgICAgICAgICAgIHN0cmVhbSA9IElNRU1fQml0c3RyZWFtRGVjVmlkZW87CiAjZWxzZQogICAgICAgICAgICAgICAgIHZpZGVvLT52b2xbaWR4XSA9IChWb2wgKikgb3NjbF9tYWxsb2Moc2l6ZW9mKFZvbCkpOwpAQCAtMjEzLDYgKzIxMyw3IEBACiAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaW50MzIgYnVmZmVyX3NpemU7CisgICAgICAgICAgICAgICAgICAgIG9zY2xfbWVtc2V0KHN0cmVhbSwgMCwgc2l6ZW9mKEJpdHN0cmVhbURlY1ZpZGVvKSk7CiAgICAgICAgICAgICAgICAgICAgIGlmICgoYnVmZmVyX3NpemUgPSBCaXRzdHJlYW1PcGVuKHN0cmVhbSwgaWR4KSkgPCAwKQogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICBtcDRkZWNfbG9nKCJJbml0VmlkZW9EZWNvZGVyKCk6IENhbid0IGFsbG9jYXRlIGJpdHN0cmVhbSBidWZmZXIuXG4iKTsKQEAgLTMzOSwyNyArMzQwLDMzIEBACiAjaWZkZWYgREVDX0lOVEVSTkFMX01FTU9SWV9PUFQKICAgICB2aWRlby0+Y3VyclZvcC0+eUNoYW4gPSBJTUVNX2N1cnJWb3BfeUNoYW47IC8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgYWxsIFZPUCBPS0EgMy8yLzEqLwogICAgIGlmICh2aWRlby0+Y3VyclZvcC0+eUNoYW4gPT0gTlVMTCkgc3RhdHVzID0gUFZfRkFMU0U7Ci0gICAgdmlkZW8tPmN1cnJWb3AtPnVDaGFuID0gdmlkZW8tPmN1cnJWb3AtPnlDaGFuICsgc2l6ZTsKLSAgICB2aWRlby0+Y3VyclZvcC0+dkNoYW4gPSB2aWRlby0+Y3VyclZvcC0+dUNoYW4gKyAoc2l6ZSA+PiAyKTsKKyAgICBlbHNlIHsKKyAgICAgICAgdmlkZW8tPmN1cnJWb3AtPnVDaGFuID0gdmlkZW8tPmN1cnJWb3AtPnlDaGFuICsgc2l6ZTsKKyAgICAgICAgdmlkZW8tPmN1cnJWb3AtPnZDaGFuID0gdmlkZW8tPmN1cnJWb3AtPnVDaGFuICsgKHNpemUgPj4gMik7CisgICAgfQogCiAgICAgdmlkZW8tPnByZXZWb3AtPnlDaGFuID0gSU1FTV9wcmV2Vm9wX3lDaGFuOyAvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIGFsbCBWT1AgT0tBIDMvMi8xKi8KICAgICBpZiAodmlkZW8tPnByZXZWb3AtPnlDaGFuID09IE5VTEwpIHN0YXR1cyA9IFBWX0ZBTFNFOwotICAgIHZpZGVvLT5wcmV2Vm9wLT51Q2hhbiA9IHZpZGVvLT5wcmV2Vm9wLT55Q2hhbiArIHNpemU7Ci0gICAgdmlkZW8tPnByZXZWb3AtPnZDaGFuID0gdmlkZW8tPnByZXZWb3AtPnVDaGFuICsgKHNpemUgPj4gMik7CisgICAgZWxzZSB7CisgICAgICAgIHZpZGVvLT5wcmV2Vm9wLT51Q2hhbiA9IHZpZGVvLT5wcmV2Vm9wLT55Q2hhbiArIHNpemU7CisgICAgICAgIHZpZGVvLT5wcmV2Vm9wLT52Q2hhbiA9IHZpZGVvLT5wcmV2Vm9wLT51Q2hhbiArIChzaXplID4+IDIpOworICAgIH0KICNlbHNlCiAgICAgaWYgKHNpemUgPiBJTlQzMl9NQVggLyAzKSB7CiAgICAgICAgIHJldHVybiBQVl9GQUxTRTsKICAgICB9CiAgICAgdmlkZW8tPmN1cnJWb3AtPnlDaGFuID0gKFBJWEVMICopIG9zY2xfbWFsbG9jKHNpemUgKiAzIC8gMik7IC8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgYWxsIFZPUCBPS0EgMy8yLzEqLwogICAgIGlmICh2aWRlby0+Y3VyclZvcC0+eUNoYW4gPT0gTlVMTCkgc3RhdHVzID0gUFZfRkFMU0U7Ci0KLSAgICB2aWRlby0+Y3VyclZvcC0+dUNoYW4gPSB2aWRlby0+Y3VyclZvcC0+eUNoYW4gKyBzaXplOwotICAgIHZpZGVvLT5jdXJyVm9wLT52Q2hhbiA9IHZpZGVvLT5jdXJyVm9wLT51Q2hhbiArIChzaXplID4+IDIpOworICAgIGVsc2UgeworICAgICAgICB2aWRlby0+Y3VyclZvcC0+dUNoYW4gPSB2aWRlby0+Y3VyclZvcC0+eUNoYW4gKyBzaXplOworICAgICAgICB2aWRlby0+Y3VyclZvcC0+dkNoYW4gPSB2aWRlby0+Y3VyclZvcC0+dUNoYW4gKyAoc2l6ZSA+PiAyKTsKKyAgICB9CiAgICAgdmlkZW8tPnByZXZWb3AtPnlDaGFuID0gKFBJWEVMICopIG9zY2xfbWFsbG9jKHNpemUgKiAzIC8gMik7IC8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgYWxsIFZPUCBPS0EgMy8yLzEqLwogICAgIGlmICh2aWRlby0+cHJldlZvcC0+eUNoYW4gPT0gTlVMTCkgc3RhdHVzID0gUFZfRkFMU0U7Ci0KLSAgICB2aWRlby0+cHJldlZvcC0+dUNoYW4gPSB2aWRlby0+cHJldlZvcC0+eUNoYW4gKyBzaXplOwotICAgIHZpZGVvLT5wcmV2Vm9wLT52Q2hhbiA9IHZpZGVvLT5wcmV2Vm9wLT51Q2hhbiArIChzaXplID4+IDIpOworICAgIGVsc2UgeworICAgICAgICB2aWRlby0+cHJldlZvcC0+dUNoYW4gPSB2aWRlby0+cHJldlZvcC0+eUNoYW4gKyBzaXplOworICAgICAgICB2aWRlby0+cHJldlZvcC0+dkNoYW4gPSB2aWRlby0+cHJldlZvcC0+dUNoYW4gKyAoc2l6ZSA+PiAyKTsKKyAgICB9CiAjZW5kaWYKICAgICB2aWRlby0+bWVtb3J5VXNhZ2UgKz0gKHNpemUgKiAzKTsKICNlbmRpZiAgIC8vIE1FTU9SWV9QT09MCkBAIC0zODMsOCArMzkwLDEwIEBACiAKICAgICAgICAgICAgIHZpZGVvLT5wcmV2RW5oY1ZvcC0+eUNoYW4gPSAoUElYRUwgKikgb3NjbF9tYWxsb2Moc2l6ZSAqIDMgLyAyKTsgLyogQWxsb2NhdGUgbWVtb3J5IGZvciBhbGwgVk9QIE9LQSAzLzIvMSovCiAgICAgICAgICAgICBpZiAodmlkZW8tPnByZXZFbmhjVm9wLT55Q2hhbiA9PSBOVUxMKSBzdGF0dXMgPSBQVl9GQUxTRTsKLSAgICAgICAgICAgIHZpZGVvLT5wcmV2RW5oY1ZvcC0+dUNoYW4gPSB2aWRlby0+cHJldkVuaGNWb3AtPnlDaGFuICsgc2l6ZTsKLSAgICAgICAgICAgIHZpZGVvLT5wcmV2RW5oY1ZvcC0+dkNoYW4gPSB2aWRlby0+cHJldkVuaGNWb3AtPnVDaGFuICsgKHNpemUgPj4gMik7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICB2aWRlby0+cHJldkVuaGNWb3AtPnVDaGFuID0gdmlkZW8tPnByZXZFbmhjVm9wLT55Q2hhbiArIHNpemU7CisgICAgICAgICAgICAgICAgdmlkZW8tPnByZXZFbmhjVm9wLT52Q2hhbiA9IHZpZGVvLT5wcmV2RW5oY1ZvcC0+dUNoYW4gKyAoc2l6ZSA+PiAyKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIHZpZGVvLT5tZW1vcnlVc2FnZSArPSAoMyAqIHNpemUgLyAyKTsKICNlbmRpZgogICAgICAgICB9CkBAIC00MzEsMTAgKzQ0MCwxMiBAQAogI2Vsc2UKICAgICB2aWRlby0+c2xpY2VObyA9ICh1aW50OCAqKSBvc2NsX21hbGxvYyhuVG90YWxNQik7CiAgICAgaWYgKHZpZGVvLT5zbGljZU5vID09IE5VTEwpIHN0YXR1cyA9IFBWX0ZBTFNFOworICAgIGVsc2Ugb3NjbF9tZW1zZXQodmlkZW8tPnNsaWNlTm8sIDAsIG5Ub3RhbE1CKTsKICAgICB2aWRlby0+bWVtb3J5VXNhZ2UgKz0gblRvdGFsTUI7CiAKICAgICB2aWRlby0+YWNQcmVkRmxhZyA9ICh1aW50OCAqKSBvc2NsX21hbGxvYyhuVG90YWxNQiAqIHNpemVvZih1aW50OCkpOwogICAgIGlmICh2aWRlby0+YWNQcmVkRmxhZyA9PSBOVUxMKSBzdGF0dXMgPSBQVl9GQUxTRTsKKyAgICBlbHNlIG9zY2xfbWVtc2V0KHZpZGVvLT5hY1ByZWRGbGFnLCAwLCBuVG90YWxNQiAqIHNpemVvZih1aW50OCkpOwogICAgIHZpZGVvLT5tZW1vcnlVc2FnZSArPSAoblRvdGFsTUIpOwogCiAgICAgaWYgKChzaXplX3QpblRvdGFsTUIgPiBTSVpFX01BWCAvIHNpemVvZih0eXBlRENTdG9yZSkpIHsKQEAgLTQ0Miw2ICs0NTMsNyBAQAogICAgIH0KICAgICB2aWRlby0+cHJlZERDID0gKHR5cGVEQ1N0b3JlICopIG9zY2xfbWFsbG9jKG5Ub3RhbE1CICogc2l6ZW9mKHR5cGVEQ1N0b3JlKSk7CiAgICAgaWYgKHZpZGVvLT5wcmVkREMgPT0gTlVMTCkgc3RhdHVzID0gUFZfRkFMU0U7CisgICAgZWxzZSBvc2NsX21lbXNldCh2aWRlby0+cHJlZERDLCAwLCBuVG90YWxNQiAqIHNpemVvZih0eXBlRENTdG9yZSkpOwogICAgIHZpZGVvLT5tZW1vcnlVc2FnZSArPSAoblRvdGFsTUIgKiBzaXplb2YodHlwZURDU3RvcmUpKTsKIAogICAgIGlmIChuTUJQZXJSb3cgPiBJTlQzMl9NQVggLSAxCkBAIC00NTAsNiArNDYyLDcgQEAKICAgICB9CiAgICAgdmlkZW8tPnByZWREQ0FDX2NvbCA9ICh0eXBlRENBQ1N0b3JlICopIG9zY2xfbWFsbG9jKChuTUJQZXJSb3cgKyAxKSAqIHNpemVvZih0eXBlRENBQ1N0b3JlKSk7CiAgICAgaWYgKHZpZGVvLT5wcmVkRENBQ19jb2wgPT0gTlVMTCkgc3RhdHVzID0gUFZfRkFMU0U7CisgICAgZWxzZSBvc2NsX21lbXNldCh2aWRlby0+cHJlZERDQUNfY29sLCAwLCAobk1CUGVyUm93ICsgMSkgKiBzaXplb2YodHlwZURDQUNTdG9yZSkpOwogICAgIHZpZGVvLT5tZW1vcnlVc2FnZSArPSAoKG5NQlBlclJvdyArIDEpICogc2l6ZW9mKHR5cGVEQ0FDU3RvcmUpKTsKIAogICAgIC8qIGVsZW1lbnQgemVybyB3aWxsIGJlIHVzZWQgZm9yIHN0b3JpbmcgdmVydGljYWwgKGNvbCkgQUMgY29lZmZpY2llbnRzICovCkBAIC00NTksOSArNDcyLDExIEBACiAgICAgLyogQWxsb2NhdGluZyBIZWFkZXJJbmZvIHN0cnVjdHVyZSAmIFF1YW50aXplciBhcnJheSAqLwogICAgIHZpZGVvLT5oZWFkZXJJbmZvLk1vZGUgPSAodWludDggKikgb3NjbF9tYWxsb2MoblRvdGFsTUIpOwogICAgIGlmICh2aWRlby0+aGVhZGVySW5mby5Nb2RlID09IE5VTEwpIHN0YXR1cyA9IFBWX0ZBTFNFOworICAgIGVsc2Ugb3NjbF9tZW1zZXQodmlkZW8tPmhlYWRlckluZm8uTW9kZSwgMCwgblRvdGFsTUIpOwogICAgIHZpZGVvLT5tZW1vcnlVc2FnZSArPSBuVG90YWxNQjsKICAgICB2aWRlby0+aGVhZGVySW5mby5DQlAgPSAodWludDggKikgb3NjbF9tYWxsb2MoblRvdGFsTUIpOwogICAgIGlmICh2aWRlby0+aGVhZGVySW5mby5DQlAgPT0gTlVMTCkgc3RhdHVzID0gUFZfRkFMU0U7CisgICAgZWxzZSBvc2NsX21lbXNldCAodmlkZW8tPmhlYWRlckluZm8uQ0JQLCAwLCBuVG90YWxNQik7CiAgICAgdmlkZW8tPm1lbW9yeVVzYWdlICs9IG5Ub3RhbE1COwogCiAgICAgaWYgKChzaXplX3QpblRvdGFsTUIgPiBTSVpFX01BWCAvIHNpemVvZihpbnQxNikpIHsKQEAgLTQ2OSw2ICs0ODQsNyBAQAogICAgIH0KICAgICB2aWRlby0+UVBNQiA9IChpbnQxNiAqKSBvc2NsX21hbGxvYyhuVG90YWxNQiAqIHNpemVvZihpbnQxNikpOwogICAgIGlmICh2aWRlby0+UVBNQiA9PSBOVUxMKSBzdGF0dXMgPSBQVl9GQUxTRTsKKyAgICBlbHNlIG1lbXNldCh2aWRlby0+UVBNQiwgMHgwLCBuVG90YWxNQiAqIHNpemVvZihpbnQxNikpOwogICAgIHZpZGVvLT5tZW1vcnlVc2FnZSArPSAoblRvdGFsTUIgKiBzaXplb2YoaW50KSk7CiAKICAgICAvKiBBbGxvY2F0aW5nIG1hY3JvYmxvY2sgc3BhY2UgKi8KQEAgLTQ4OSw4ICs1MDUsMTAgQEAKICAgICB9CiAgICAgdmlkZW8tPm1vdFggPSAoTU9UICopIG9zY2xfbWFsbG9jKHNpemVvZihNT1QpICogNCAqIG5Ub3RhbE1CKTsKICAgICBpZiAodmlkZW8tPm1vdFggPT0gTlVMTCkgc3RhdHVzID0gUFZfRkFMU0U7CisgICAgZWxzZSBtZW1zZXQodmlkZW8tPm1vdFgsIDAsIHNpemVvZihNT1QpICogNCAqIG5Ub3RhbE1CKTsKICAgICB2aWRlby0+bW90WSA9IChNT1QgKikgb3NjbF9tYWxsb2Moc2l6ZW9mKE1PVCkgKiA0ICogblRvdGFsTUIpOwogICAgIGlmICh2aWRlby0+bW90WSA9PSBOVUxMKSBzdGF0dXMgPSBQVl9GQUxTRTsKKyAgICBlbHNlIG1lbXNldCh2aWRlby0+bW90WSwgMCwgc2l6ZW9mKE1PVCkgKiA0ICogblRvdGFsTUIpOwogICAgIHZpZGVvLT5tZW1vcnlVc2FnZSArPSAoc2l6ZW9mKE1PVCkgKiA4ICogblRvdGFsTUIpOwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvU29mdE1QMy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL1NvZnRNUDMuY3BwCmluZGV4IDIzNjQ2ODQuLmNkOTg0ZjAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvU29mdE1QMy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9Tb2Z0TVAzLmNwcApAQCAtMTE0LDcgKzExNCw3IEBACiAgICAgbUNvbmZpZy0+Y3JjRW5hYmxlZCA9IGZhbHNlOwogCiAgICAgdWludDMyX3QgbWVtUmVxdWlyZW1lbnRzID0gcHZtcDNfZGVjb2Rlck1lbVJlcXVpcmVtZW50cygpOwotICAgIG1EZWNvZGVyQnVmID0gbWFsbG9jKG1lbVJlcXVpcmVtZW50cyk7CisgICAgbURlY29kZXJCdWYgPSBjYWxsb2MoMSwgbWVtUmVxdWlyZW1lbnRzKTsKIAogICAgIHB2bXAzX0luaXREZWNvZGVyKG1Db25maWcsIG1EZWNvZGVyQnVmKTsKICAgICBtSXNGaXJzdCA9IHRydWU7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXBlZzJkZWMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcGVnMmRlYy9BbmRyb2lkLmJwCmluZGV4IGZiMGRiOGYuLmNkODNkYjAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcGVnMmRlYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcGVnMmRlYy9BbmRyb2lkLmJwCkBAIC0xLDkgKzEsNiBAQAogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9zb2Z0X21wZWcyZGVjIiwKICAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAotICAgIHZuZGs6IHsKLSAgICAgICAgZW5hYmxlZDogdHJ1ZSwKLSAgICB9LAogCiAgICAgc3RhdGljX2xpYnM6IFsibGlibXBlZzJkZWMiXSwKICAgICBzcmNzOiBbIlNvZnRNUEVHMi5jcHAiXSwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vcHVzL2RlYy9Tb2Z0T3B1cy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb3B1cy9kZWMvU29mdE9wdXMuY3BwCmluZGV4IDgxMzAwNGIuLjk0MmY4NTAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vcHVzL2RlYy9Tb2Z0T3B1cy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29wdXMvZGVjL1NvZnRPcHVzLmNwcApAQCAtNDMxLDcgKzQzMSw3IEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChtSW5wdXRCdWZmZXJDb3VudCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgQ0hFQ0sobUhlYWRlciA9PSBOVUxMKTsKKyAgICAgICAgICAgICAgICBkZWxldGUgbUhlYWRlcjsKICAgICAgICAgICAgICAgICBtSGVhZGVyID0gbmV3IE9wdXNIZWFkZXIoKTsKICAgICAgICAgICAgICAgICBtZW1zZXQobUhlYWRlciwgMCwgc2l6ZW9mKCptSGVhZGVyKSk7CiAgICAgICAgICAgICAgICAgaWYgKCFQYXJzZU9wdXNIZWFkZXIoZGF0YSwgc2l6ZSwgbUhlYWRlcikpIHsKQEAgLTQ1Miw2ICs0NTIsOSBAQAogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGludCBzdGF0dXMgPSBPUFVTX0lOVkFMSURfU1RBVEU7CisgICAgICAgICAgICAgICAgaWYgKG1EZWNvZGVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgb3B1c19tdWx0aXN0cmVhbV9kZWNvZGVyX2Rlc3Ryb3kobURlY29kZXIpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBtRGVjb2RlciA9IG9wdXNfbXVsdGlzdHJlYW1fZGVjb2Rlcl9jcmVhdGUoa1JhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1IZWFkZXItPmNoYW5uZWxzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSGVhZGVyLT5udW1fc3RyZWFtcywKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy92b3JiaXMvZGVjL1NvZnRWb3JiaXMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3ZvcmJpcy9kZWMvU29mdFZvcmJpcy5jcHAKaW5kZXggZDUzNGY2NC4uY2U4ZDQ1OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3ZvcmJpcy9kZWMvU29mdFZvcmJpcy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3ZvcmJpcy9kZWMvU29mdFZvcmJpcy5jcHAKQEAgLTM1Nyw3ICszNTcsMTAgQEAKICAgICAgICAgaW50MzJfdCBudW1QYWdlU2FtcGxlcyA9IDA7CiAKICAgICAgICAgaWYgKGluSGVhZGVyKSB7Ci0gICAgICAgICAgICBpZiAobUlucHV0QnVmZmVyQ291bnQgPCAyKSB7CisgICAgICAgICAgICAvLyBBc3N1bWUgdGhlIHZlcnkgZmlyc3QgMiBidWZmZXJzIGFyZSBhbHdheXMgY29kZWMgY29uZmlnIChpbiB0aGlzIGNhc2UgbVN0YXRlIGlzIE5VTEwpCisgICAgICAgICAgICAvLyBBZnRlciBmbHVzaCwgaGFuZGxlIENTRAorICAgICAgICAgICAgaWYgKG1JbnB1dEJ1ZmZlckNvdW50IDwgMiAmJgorICAgICAgICAgICAgICAgICAgICAobVN0YXRlID09IE5VTEwgfHwgKGluSGVhZGVyLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19DT0RFQ0NPTkZJRykpKSB7CiAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSA9IGluSGVhZGVyLT5wQnVmZmVyICsgaW5IZWFkZXItPm5PZmZzZXQ7CiAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUgPSBpbkhlYWRlci0+bkZpbGxlZExlbjsKIApAQCAtMzgwLDcgKzM4MywyNCBAQAogCiAgICAgICAgICAgICAgICAgbWFrZUJpdFJlYWRlcigoY29uc3QgdWludDhfdCAqKWRhdGEgKyA3LCBzaXplIC0gNywgJmJ1ZiwgJnJlZiwgJmJpdHMpOwogCi0gICAgICAgICAgICAgICAgaWYgKG1JbnB1dEJ1ZmZlckNvdW50ID09IDApIHsKKyAgICAgICAgICAgICAgICAvLyBBc3N1bWUgdmVyeSBmaXJzdCBmcmFtZSBpcyBpZGVudGlmaWNhdGlvbiBoZWFkZXIgLSBvciByZXNldCBpZGVudGlmaWNhdGlvbgorICAgICAgICAgICAgICAgIC8vIGhlYWRlciBhZnRlciBmbHVzaCwgYnV0IGFsbG93IG9ubHkgc3BlY2lmeWluZyBzZXR1cCBoZWFkZXIgYWZ0ZXIgZmx1c2ggaWYKKyAgICAgICAgICAgICAgICAvLyBpZGVudGlmaWNhdGlvbiBoZWFkZXIgd2FzIGFscmVhZHkgc2V0IHVwLgorICAgICAgICAgICAgICAgIGlmIChtSW5wdXRCdWZmZXJDb3VudCA9PSAwICYmCisgICAgICAgICAgICAgICAgICAgICAgICAobVZpID09IE5VTEwgfHwgZGF0YVswXSA9PSAxIC8qIGlkZW50aWZpY2F0aW9uIGhlYWRlciAqLykpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGFueSBwcmlvciBzdGF0ZQorICAgICAgICAgICAgICAgICAgICBpZiAobVZpICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsc28gY2xlYXIgbVN0YXRlIGFzIGl0IG1heSByZWZlciB0byB0aGUgb2xkIG1WaQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1TdGF0ZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9yYmlzX2RzcF9jbGVhcihtU3RhdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBtU3RhdGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXRlID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHZvcmJpc19pbmZvX2NsZWFyKG1WaSk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgbVZpOworICAgICAgICAgICAgICAgICAgICAgICAgbVZpID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgICAgIENIRUNLKG1WaSA9PSBOVUxMKTsKICAgICAgICAgICAgICAgICAgICAgbVZpID0gbmV3IHZvcmJpc19pbmZvOwogICAgICAgICAgICAgICAgICAgICB2b3JiaXNfaW5mb19pbml0KG1WaSk7CkBAIC0zOTIsOCArNDEyLDE1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmUgYW55IHByaW9yIHN0YXRlCisgICAgICAgICAgICAgICAgICAgIGlmIChtU3RhdGUgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdm9yYmlzX2RzcF9jbGVhcihtU3RhdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIG1TdGF0ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TdGF0ZSA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgICAgICBpbnQgcmV0ID0gX3ZvcmJpc191bnBhY2tfYm9va3MobVZpLCAmYml0cyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXQgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBpZiAocmV0ICE9IDAgfHwgbVN0YXRlICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCByZXQsIE5VTEwpOwogICAgICAgICAgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKQEAgLTQwOSw2ICs0MzYsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudFBvcnRTZXR0aW5nc0NoYW5nZWQsIDEsIDAsIE5VTEwpOwogICAgICAgICAgICAgICAgICAgICAgICAgbU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZSA9IEFXQUlUSU5HX0RJU0FCTEVEOwogICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1JbnB1dEJ1ZmZlckNvdW50ID0gMTsKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBpZiAoaW5IZWFkZXItPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykgewpAQCAtNTUwLDE5ICs1NzgsMTAgQEAKIAogICAgICAgICBtSW5wdXRCdWZmZXJDb3VudCA9IDA7CiAgICAgICAgIG1OdW1GcmFtZXNPdXRwdXQgPSAwOwotICAgICAgICBpZiAobVN0YXRlICE9IE5VTEwpIHsKLSAgICAgICAgICAgIHZvcmJpc19kc3BfY2xlYXIobVN0YXRlKTsKLSAgICAgICAgICAgIGRlbGV0ZSBtU3RhdGU7Ci0gICAgICAgICAgICBtU3RhdGUgPSBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtVmkgIT0gTlVMTCkgewotICAgICAgICAgICAgdm9yYmlzX2luZm9fY2xlYXIobVZpKTsKLSAgICAgICAgICAgIGRlbGV0ZSBtVmk7Ci0gICAgICAgICAgICBtVmkgPSBOVUxMOwotICAgICAgICB9CiAgICAgICAgIG1TYXdJbnB1dEVvcyA9IGZhbHNlOwogICAgICAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CiAgICAgICAgIG1OdW1GcmFtZXNMZWZ0T25QYWdlID0gLTE7CisgICAgICAgIHZvcmJpc19kc3BfcmVzdGFydChtU3RhdGUpOwogICAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3hhYWNkZWMvU29mdFhBQUMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3hhYWNkZWMvU29mdFhBQUMuY3BwCmluZGV4IDA2YjE1YjMuLmYzNTJmYmEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy94YWFjZGVjL1NvZnRYQUFDLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MveGFhY2RlYy9Tb2Z0WEFBQy5jcHAKQEAgLTc5LDcgKzc5LDcgQEAKIAogc3RhdGljIGNvbnN0IE9NWF9VMzIga1N1cHBvcnRlZFByb2ZpbGVzW10gPSB7CiAgICAgT01YX0FVRElPX0FBQ09iamVjdExDLCBPTVhfQVVESU9fQUFDT2JqZWN0SEUsICBPTVhfQVVESU9fQUFDT2JqZWN0SEVfUFMsCi0gICAgT01YX0FVRElPX0FBQ09iamVjdExELCBPTVhfQVVESU9fQUFDT2JqZWN0RUxELAorICAgIE9NWF9BVURJT19BQUNPYmplY3RMRCwgT01YX0FVRElPX0FBQ09iamVjdEVMRCwgT01YX0FVRElPX0FBQ09iamVjdFhIRQogfTsKIAogU29mdFhBQUM6OlNvZnRYQUFDKGNvbnN0IGNoYXIqIG5hbWUsIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUqIGNhbGxiYWNrcywgT01YX1BUUiBhcHBEYXRhLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29sb3Jjb252ZXJzaW9uL0NvbG9yQ29udmVydGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvbG9yY29udmVyc2lvbi9Db2xvckNvbnZlcnRlci5jcHAKaW5kZXggNzBmNTJjMy4uODZiZDlkNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29sb3Jjb252ZXJzaW9uL0NvbG9yQ29udmVydGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2xvcmNvbnZlcnNpb24vQ29sb3JDb252ZXJ0ZXIuY3BwCkBAIC0yMSwxMCArMjEsMTIgQEAKIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9Db2xvclV0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQ29sb3JDb252ZXJ0ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgogCiAjaW5jbHVkZSAibGlieXV2L2NvbnZlcnRfZnJvbS5oIgorI2luY2x1ZGUgImxpYnl1di9jb252ZXJ0X2FyZ2IuaCIKICNpbmNsdWRlICJsaWJ5dXYvdmlkZW9fY29tbW9uLmgiCiAjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KICNpbmNsdWRlIDxzeXMvdGltZS5oPgpAQCAtNDUsMTAgKzQ3LDI4IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorc3RhdGljIGJvb2wgaXNSR0IoT01YX0NPTE9SX0ZPUk1BVFRZUEUgY29sb3JGb3JtYXQpIHsKKyAgICByZXR1cm4gY29sb3JGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdDE2Yml0UkdCNTY1CisgICAgICAgICAgICB8fCBjb2xvckZvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0MzJCaXRSR0JBODg4OAorICAgICAgICAgICAgfHwgY29sb3JGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdDMyYml0QkdSQTg4ODg7Cit9CisKK2Jvb2wgQ29sb3JDb252ZXJ0ZXI6OkNvbG9yU3BhY2U6OmlzQnQ3MDkoKSB7CisgICAgcmV0dXJuIChtU3RhbmRhcmQgPT0gQ29sb3JVdGlsczo6a0NvbG9yU3RhbmRhcmRCVDcwOSk7Cit9CisKKworYm9vbCBDb2xvckNvbnZlcnRlcjo6Q29sb3JTcGFjZTo6aXNKcGVnKCkgeworICAgIHJldHVybiAoKG1TdGFuZGFyZCA9PSBDb2xvclV0aWxzOjprQ29sb3JTdGFuZGFyZEJUNjAxXzYyNSkKKyAgICAgICAgICAgIHx8IChtU3RhbmRhcmQgPT0gQ29sb3JVdGlsczo6a0NvbG9yU3RhbmRhcmRCVDYwMV81MjUpKQorICAgICAgICAgICAgJiYgKG1SYW5nZSA9PSBDb2xvclV0aWxzOjprQ29sb3JSYW5nZUZ1bGwpOworfQorCiBDb2xvckNvbnZlcnRlcjo6Q29sb3JDb252ZXJ0ZXIoCiAgICAgICAgIE9NWF9DT0xPUl9GT1JNQVRUWVBFIGZyb20sIE9NWF9DT0xPUl9GT1JNQVRUWVBFIHRvKQogICAgIDogbVNyY0Zvcm1hdChmcm9tKSwKICAgICAgIG1Ec3RGb3JtYXQodG8pLAorICAgICAgbVNyY0NvbG9yU3BhY2UoezAsIDAsIDB9KSwKICAgICAgIG1DbGlwKE5VTEwpIHsKIH0KIApAQCAtODEsMTQgKzEwMSwyOSBAQAogfQogCiBib29sIENvbG9yQ29udmVydGVyOjppc0RzdFJHQigpIGNvbnN0IHsKLSAgICByZXR1cm4gbURzdEZvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0MTZiaXRSR0I1NjUKLSAgICAgICAgICAgIHx8IG1Ec3RGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdDMyQml0UkdCQTg4ODgKLSAgICAgICAgICAgIHx8IG1Ec3RGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdDMyYml0QkdSQTg4ODg7CisgICAgcmV0dXJuIGlzUkdCKG1Ec3RGb3JtYXQpOwogfQogCit2b2lkIENvbG9yQ29udmVydGVyOjpzZXRTcmNDb2xvclNwYWNlKAorICAgICAgICB1aW50MzJfdCBzdGFuZGFyZCwgdWludDMyX3QgcmFuZ2UsIHVpbnQzMl90IHRyYW5zZmVyKSB7CisgICAgaWYgKGlzUkdCKG1TcmNGb3JtYXQpKSB7CisgICAgICAgIEFMT0dXKCJDYW4ndCBzZXQgY29sb3Igc3BhY2Ugb24gUkdCIHNvdXJjZSIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1TcmNDb2xvclNwYWNlLm1TdGFuZGFyZCA9IHN0YW5kYXJkOworICAgIG1TcmNDb2xvclNwYWNlLm1SYW5nZSA9IHJhbmdlOworICAgIG1TcmNDb2xvclNwYWNlLm1UcmFuc2ZlciA9IHRyYW5zZmVyOworfQorCisvKgorICogSWYgc3RyaWRlIGlzIG5vbi16ZXJvLCBjbGllbnQncyBzdHJpZGUgd2lsbCBiZSB1c2VkLiBGb3IgcGxhbmFyCisgKiBvciBzZW1pLXBsYW5hciBZVVYgZm9ybWF0cywgc3RyaWRlIG11c3QgYmUgZXZlbiBudW1iZXJzLgorICogSWYgc3RyaWRlIGlzIHplcm8sIGl0IHdpbGwgYmUgY2FsY3VsYXRlZCBiYXNlZCBvbiB3aWR0aCBhbmQgYnBwCisgKiBvZiB0aGUgZm9ybWF0LCBhc3N1bWluZyBubyBwYWRkaW5nIG9uIHRoZSByaWdodCBlZGdlLgorICovCiBDb2xvckNvbnZlcnRlcjo6Qml0bWFwUGFyYW1zOjpCaXRtYXBQYXJhbXMoCiAgICAgICAgIHZvaWQgKmJpdHMsCi0gICAgICAgIHNpemVfdCB3aWR0aCwgc2l6ZV90IGhlaWdodCwKKyAgICAgICAgc2l6ZV90IHdpZHRoLCBzaXplX3QgaGVpZ2h0LCBzaXplX3Qgc3RyaWRlLAogICAgICAgICBzaXplX3QgY3JvcExlZnQsIHNpemVfdCBjcm9wVG9wLAogICAgICAgICBzaXplX3QgY3JvcFJpZ2h0LCBzaXplX3QgY3JvcEJvdHRvbSwKICAgICAgICAgT01YX0NPTE9SX0ZPUk1BVFRZUEUgY29sb3JGcm9tYXQpCkBAIC0xMDIsNiArMTM3LDggQEAKICAgICAgIG1Dcm9wQm90dG9tKGNyb3BCb3R0b20pIHsKICAgICBzd2l0Y2gobUNvbG9yRm9ybWF0KSB7CiAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0MTZiaXRSR0I1NjU6CisgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyMTY6CisgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0Q2JZQ3JZOgogICAgICAgICBtQnBwID0gMjsKICAgICAgICAgbVN0cmlkZSA9IDIgKiBtV2lkdGg7CiAgICAgICAgIGJyZWFrOwpAQCAtMTEzLDEzICsxNTAsNyBAQAogICAgICAgICBtU3RyaWRlID0gNCAqIG1XaWR0aDsKICAgICAgICAgYnJlYWs7CiAKLSAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIxNjoKLSAgICAgICAgbUJwcCA9IDI7Ci0gICAgICAgIG1TdHJpZGUgPSAyICogbVdpZHRoOwotICAgICAgICBicmVhazsKLQogICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcjoKLSAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRDYllDclk6CiAgICAgY2FzZSBPTVhfUUNPTV9DT0xPUl9Gb3JtYXRZVlU0MjBTZW1pUGxhbmFyOgogICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXI6CiAgICAgY2FzZSBPTVhfVElfQ09MT1JfRm9ybWF0WVVWNDIwUGFja2VkU2VtaVBsYW5hcjoKQEAgLTEzMyw2ICsxNjQsMTAgQEAKICAgICAgICAgbVN0cmlkZSA9IG1XaWR0aDsKICAgICAgICAgYnJlYWs7CiAgICAgfQorICAgIC8vIHVzZSBjbGllbnQncyBzdHJpZGUgaWYgaXQncyBzcGVjaWZpZWQuCisgICAgaWYgKHN0cmlkZSAhPSAwKSB7CisgICAgICAgIG1TdHJpZGUgPSBzdHJpZGU7CisgICAgfQogfQogCiBzaXplX3QgQ29sb3JDb252ZXJ0ZXI6OkJpdG1hcFBhcmFtczo6Y3JvcFdpZHRoKCkgY29uc3QgewpAQCAtMTQ1LDIxICsxODAsMjEgQEAKIAogc3RhdHVzX3QgQ29sb3JDb252ZXJ0ZXI6OmNvbnZlcnQoCiAgICAgICAgIGNvbnN0IHZvaWQgKnNyY0JpdHMsCi0gICAgICAgIHNpemVfdCBzcmNXaWR0aCwgc2l6ZV90IHNyY0hlaWdodCwKKyAgICAgICAgc2l6ZV90IHNyY1dpZHRoLCBzaXplX3Qgc3JjSGVpZ2h0LCBzaXplX3Qgc3JjU3RyaWRlLAogICAgICAgICBzaXplX3Qgc3JjQ3JvcExlZnQsIHNpemVfdCBzcmNDcm9wVG9wLAogICAgICAgICBzaXplX3Qgc3JjQ3JvcFJpZ2h0LCBzaXplX3Qgc3JjQ3JvcEJvdHRvbSwKICAgICAgICAgdm9pZCAqZHN0Qml0cywKLSAgICAgICAgc2l6ZV90IGRzdFdpZHRoLCBzaXplX3QgZHN0SGVpZ2h0LAorICAgICAgICBzaXplX3QgZHN0V2lkdGgsIHNpemVfdCBkc3RIZWlnaHQsIHNpemVfdCBkc3RTdHJpZGUsCiAgICAgICAgIHNpemVfdCBkc3RDcm9wTGVmdCwgc2l6ZV90IGRzdENyb3BUb3AsCiAgICAgICAgIHNpemVfdCBkc3RDcm9wUmlnaHQsIHNpemVfdCBkc3RDcm9wQm90dG9tKSB7CiAgICAgQml0bWFwUGFyYW1zIHNyYygKICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8dm9pZCAqPihzcmNCaXRzKSwKLSAgICAgICAgICAgIHNyY1dpZHRoLCBzcmNIZWlnaHQsCisgICAgICAgICAgICBzcmNXaWR0aCwgc3JjSGVpZ2h0LCBzcmNTdHJpZGUsCiAgICAgICAgICAgICBzcmNDcm9wTGVmdCwgc3JjQ3JvcFRvcCwgc3JjQ3JvcFJpZ2h0LCBzcmNDcm9wQm90dG9tLCBtU3JjRm9ybWF0KTsKIAogICAgIEJpdG1hcFBhcmFtcyBkc3QoCiAgICAgICAgICAgICBkc3RCaXRzLAotICAgICAgICAgICAgZHN0V2lkdGgsIGRzdEhlaWdodCwKKyAgICAgICAgICAgIGRzdFdpZHRoLCBkc3RIZWlnaHQsIGRzdFN0cmlkZSwKICAgICAgICAgICAgIGRzdENyb3BMZWZ0LCBkc3RDcm9wVG9wLCBkc3RDcm9wUmlnaHQsIGRzdENyb3BCb3R0b20sIG1Ec3RGb3JtYXQpOwogCiAgICAgaWYgKCEoKHNyYy5tQ3JvcExlZnQgJiAxKSA9PSAwCkBAIC0yNzYsNiArMzExLDEzIEBACiAgICAgcmV0dXJuIE9LOwogfQogCisjZGVmaW5lIERFQ0xBUkVfWVVWMlJHQkZVTkMoZnVuYywgcmdiKSBpbnQgKCpmdW5jKSggICAgIFwKKyAgICAgICAgY29uc3QgdWludDgqLCBpbnQsIGNvbnN0IHVpbnQ4KiwgaW50LCAgICAgICAgICAgXAorICAgICAgICBjb25zdCB1aW50OCosIGludCwgdWludDgqLCBpbnQsIGludCwgaW50KSAgICAgICBcCisgICAgICAgID0gbVNyY0NvbG9yU3BhY2UuaXNCdDcwOSgpID8gbGlieXV2OjpINDIwVG8jI3JnYiBcCisgICAgICAgIDogbVNyY0NvbG9yU3BhY2UuaXNKcGVnKCkgPyBsaWJ5dXY6Oko0MjBUbyMjcmdiICBcCisgICAgICAgIDogbGlieXV2OjpJNDIwVG8jI3JnYgorCiBzdGF0dXNfdCBDb2xvckNvbnZlcnRlcjo6Y29udmVydFlVVjQyMFBsYW5hclVzZUxpYllVVigKICAgICAgICAgY29uc3QgQml0bWFwUGFyYW1zICZzcmMsIGNvbnN0IEJpdG1hcFBhcmFtcyAmZHN0KSB7CiAgICAgdWludDhfdCAqZHN0X3B0ciA9ICh1aW50OF90ICopZHN0Lm1CaXRzCkBAIC0yOTMsMTkgKzMzNSwyOCBAQAogCiAgICAgc3dpdGNoIChtRHN0Rm9ybWF0KSB7CiAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0MTZiaXRSR0I1NjU6Ci0gICAgICAgIGxpYnl1djo6STQyMFRvUkdCNTY1KHNyY195LCBzcmMubVN0cmlkZSwgc3JjX3UsIHNyYy5tU3RyaWRlIC8gMiwgc3JjX3YsIHNyYy5tU3RyaWRlIC8gMiwKKyAgICB7CisgICAgICAgIERFQ0xBUkVfWVVWMlJHQkZVTkMoZnVuYywgUkdCNTY1KTsKKyAgICAgICAgKCpmdW5jKShzcmNfeSwgc3JjLm1TdHJpZGUsIHNyY191LCBzcmMubVN0cmlkZSAvIDIsIHNyY192LCBzcmMubVN0cmlkZSAvIDIsCiAgICAgICAgICAgICAgICAgKHVpbnQ4ICopZHN0X3B0ciwgZHN0Lm1TdHJpZGUsIHNyYy5jcm9wV2lkdGgoKSwgc3JjLmNyb3BIZWlnaHQoKSk7CiAgICAgICAgIGJyZWFrOworICAgIH0KIAogICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdDMyQml0UkdCQTg4ODg6Ci0gICAgICAgIGxpYnl1djo6Q29udmVydEZyb21JNDIwKHNyY195LCBzcmMubVN0cmlkZSwgc3JjX3UsIHNyYy5tU3RyaWRlIC8gMiwgc3JjX3YsIHNyYy5tU3RyaWRlIC8gMiwKLSAgICAgICAgICAgICAgICAodWludDggKilkc3RfcHRyLCBkc3QubVN0cmlkZSwgc3JjLmNyb3BXaWR0aCgpLCBzcmMuY3JvcEhlaWdodCgpLCBsaWJ5dXY6OkZPVVJDQ19BQkdSKTsKKyAgICB7CisgICAgICAgIERFQ0xBUkVfWVVWMlJHQkZVTkMoZnVuYywgQUJHUik7CisgICAgICAgICgqZnVuYykoc3JjX3ksIHNyYy5tU3RyaWRlLCBzcmNfdSwgc3JjLm1TdHJpZGUgLyAyLCBzcmNfdiwgc3JjLm1TdHJpZGUgLyAyLAorICAgICAgICAgICAgICAgICh1aW50OCAqKWRzdF9wdHIsIGRzdC5tU3RyaWRlLCBzcmMuY3JvcFdpZHRoKCksIHNyYy5jcm9wSGVpZ2h0KCkpOwogICAgICAgICBicmVhazsKKyAgICB9CiAKICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXQzMmJpdEJHUkE4ODg4OgotICAgICAgICBsaWJ5dXY6OkNvbnZlcnRGcm9tSTQyMChzcmNfeSwgc3JjLm1TdHJpZGUsIHNyY191LCBzcmMubVN0cmlkZSAvIDIsIHNyY192LCBzcmMubVN0cmlkZSAvIDIsCi0gICAgICAgICAgICAgICAgKHVpbnQ4ICopZHN0X3B0ciwgZHN0Lm1TdHJpZGUsIHNyYy5jcm9wV2lkdGgoKSwgc3JjLmNyb3BIZWlnaHQoKSwgbGlieXV2OjpGT1VSQ0NfQVJHQik7CisgICAgeworICAgICAgICBERUNMQVJFX1lVVjJSR0JGVU5DKGZ1bmMsIEFSR0IpOworICAgICAgICAoKmZ1bmMpKHNyY195LCBzcmMubVN0cmlkZSwgc3JjX3UsIHNyYy5tU3RyaWRlIC8gMiwgc3JjX3YsIHNyYy5tU3RyaWRlIC8gMiwKKyAgICAgICAgICAgICAgICAodWludDggKilkc3RfcHRyLCBkc3QubVN0cmlkZSwgc3JjLmNyb3BXaWR0aCgpLCBzcmMuY3JvcEhlaWdodCgpKTsKICAgICAgICAgYnJlYWs7CisgICAgfQogCiAgICAgZGVmYXVsdDoKICAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOwpAQCAtNzkzLDE1ICs4NDQsMTUgQEAKIAogICAgIHVpbnQ4X3QgKmtBZGp1c3RlZENsaXAgPSBpbml0Q2xpcCgpOwogCi0gICAgdWludDE2X3QgKmRzdF9wdHIgPSAodWludDE2X3QgKilkc3QubUJpdHMKLSAgICAgICAgKyBkc3QubUNyb3BUb3AgKiBkc3QubVdpZHRoICsgZHN0Lm1Dcm9wTGVmdDsKKyAgICB1aW50MTZfdCAqZHN0X3B0ciA9ICh1aW50MTZfdCAqKSgodWludDhfdCAqKQorICAgICAgICAgICAgZHN0Lm1CaXRzICsgZHN0Lm1Dcm9wVG9wICogZHN0Lm1TdHJpZGUgKyBkc3QubUNyb3BMZWZ0ICogZHN0Lm1CcHApOwogCiAgICAgY29uc3QgdWludDhfdCAqc3JjX3kgPQotICAgICAgICAoY29uc3QgdWludDhfdCAqKXNyYy5tQml0cyArIHNyYy5tQ3JvcFRvcCAqIHNyYy5tV2lkdGggKyBzcmMubUNyb3BMZWZ0OworICAgICAgICAoY29uc3QgdWludDhfdCAqKXNyYy5tQml0cyArIHNyYy5tQ3JvcFRvcCAqIHNyYy5tU3RyaWRlICsgc3JjLm1Dcm9wTGVmdDsKIAogICAgIGNvbnN0IHVpbnQ4X3QgKnNyY191ID0KLSAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKilzcmNfeSArIHNyYy5tV2lkdGggKiBzcmMubUhlaWdodAotICAgICAgICArIHNyYy5tQ3JvcFRvcCAqIHNyYy5tV2lkdGggKyBzcmMubUNyb3BMZWZ0OworICAgICAgICAoY29uc3QgdWludDhfdCAqKXNyYy5tQml0cyArIHNyYy5tSGVpZ2h0ICogc3JjLm1TdHJpZGUgKworICAgICAgICBzcmMubUNyb3BUb3AgKiBzcmMubVN0cmlkZSAvIDIgKyBzcmMubUNyb3BMZWZ0OwogCiAgICAgZm9yIChzaXplX3QgeSA9IDA7IHkgPCBzcmMuY3JvcEhlaWdodCgpOyArK3kpIHsKICAgICAgICAgZm9yIChzaXplX3QgeCA9IDA7IHggPCBzcmMuY3JvcFdpZHRoKCk7IHggKz0gMikgewpAQCAtODQzLDEzICs4OTQsMTMgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIHNyY195ICs9IHNyYy5tV2lkdGg7CisgICAgICAgIHNyY195ICs9IHNyYy5tU3RyaWRlOwogCiAgICAgICAgIGlmICh5ICYgMSkgewotICAgICAgICAgICAgc3JjX3UgKz0gc3JjLm1XaWR0aDsKKyAgICAgICAgICAgIHNyY191ICs9IHNyYy5tU3RyaWRlOwogICAgICAgICB9CiAKLSAgICAgICAgZHN0X3B0ciArPSBkc3QubVdpZHRoOworICAgICAgICBkc3RfcHRyID0gKHVpbnQxNl90KikoKHVpbnQ4X3QqKWRzdF9wdHIgKyBkc3QubVN0cmlkZSk7CiAgICAgfQogCiAgICAgcmV0dXJuIE9LOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29sb3Jjb252ZXJzaW9uL1NvZnR3YXJlUmVuZGVyZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29sb3Jjb252ZXJzaW9uL1NvZnR3YXJlUmVuZGVyZXIuY3BwCmluZGV4IDY1N2EwNWIuLjM1OWRmM2QgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvbG9yY29udmVyc2lvbi9Tb2Z0d2FyZVJlbmRlcmVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2xvcmNvbnZlcnNpb24vU29mdHdhcmVSZW5kZXJlci5jcHAKQEAgLTQ0LDYgKzQ0LDcgQEAKICAgICAgIG1OYXRpdmVXaW5kb3cobmF0aXZlV2luZG93KSwKICAgICAgIG1XaWR0aCgwKSwKICAgICAgIG1IZWlnaHQoMCksCisgICAgICBtU3RyaWRlKDApLAogICAgICAgbUNyb3BMZWZ0KDApLAogICAgICAgbUNyb3BUb3AoMCksCiAgICAgICBtQ3JvcFJpZ2h0KDApLApAQCAtNjcsOSArNjgsMTAgQEAKICAgICBpbnQzMl90IGNvbG9yRm9ybWF0TmV3OwogICAgIENIRUNLKGZvcm1hdC0+ZmluZEludDMyKCJjb2xvci1mb3JtYXQiLCAmY29sb3JGb3JtYXROZXcpKTsKIAotICAgIGludDMyX3Qgd2lkdGhOZXcsIGhlaWdodE5ldzsKLSAgICBDSEVDSyhmb3JtYXQtPmZpbmRJbnQzMigic3RyaWRlIiwgJndpZHRoTmV3KSk7CisgICAgaW50MzJfdCB3aWR0aE5ldywgaGVpZ2h0TmV3LCBzdHJpZGVOZXc7CisgICAgQ0hFQ0soZm9ybWF0LT5maW5kSW50MzIoIndpZHRoIiwgJndpZHRoTmV3KSk7CiAgICAgQ0hFQ0soZm9ybWF0LT5maW5kSW50MzIoInNsaWNlLWhlaWdodCIsICZoZWlnaHROZXcpKTsKKyAgICBDSEVDSyhmb3JtYXQtPmZpbmRJbnQzMigic3RyaWRlIiwgJnN0cmlkZU5ldykpOwogCiAgICAgaW50MzJfdCBjcm9wTGVmdE5ldywgY3JvcFRvcE5ldywgY3JvcFJpZ2h0TmV3LCBjcm9wQm90dG9tTmV3OwogICAgIGlmICghZm9ybWF0LT5maW5kUmVjdCgKQEAgLTEwNiw2ICsxMDgsNyBAQAogICAgIG1Db2xvckZvcm1hdCA9IHN0YXRpY19jYXN0PE9NWF9DT0xPUl9GT1JNQVRUWVBFPihjb2xvckZvcm1hdE5ldyk7CiAgICAgbVdpZHRoID0gd2lkdGhOZXc7CiAgICAgbUhlaWdodCA9IGhlaWdodE5ldzsKKyAgICBtU3RyaWRlID0gc3RyaWRlTmV3OwogICAgIG1Dcm9wTGVmdCA9IGNyb3BMZWZ0TmV3OwogICAgIG1Dcm9wVG9wID0gY3JvcFRvcE5ldzsKICAgICBtQ3JvcFJpZ2h0ID0gY3JvcFJpZ2h0TmV3OwpAQCAtMjc2LDIwICsyNzksMTUgQEAKICAgICBpZiAobUNvbnZlcnRlcikgewogICAgICAgICBtQ29udmVydGVyLT5jb252ZXJ0KAogICAgICAgICAgICAgICAgIGRhdGEsCi0gICAgICAgICAgICAgICAgbVdpZHRoLCBtSGVpZ2h0LAorICAgICAgICAgICAgICAgIG1XaWR0aCwgbUhlaWdodCwgbVN0cmlkZSwKICAgICAgICAgICAgICAgICBtQ3JvcExlZnQsIG1Dcm9wVG9wLCBtQ3JvcFJpZ2h0LCBtQ3JvcEJvdHRvbSwKICAgICAgICAgICAgICAgICBkc3QsCi0gICAgICAgICAgICAgICAgYnVmLT5zdHJpZGUsIGJ1Zi0+aGVpZ2h0LAorICAgICAgICAgICAgICAgIGJ1Zi0+c3RyaWRlLCBidWYtPmhlaWdodCwgMCwKICAgICAgICAgICAgICAgICAwLCAwLCBtQ3JvcFdpZHRoIC0gMSwgbUNyb3BIZWlnaHQgLSAxKTsKICAgICB9IGVsc2UgaWYgKG1Db2xvckZvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyKSB7Ci0gICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY195ID0gKGNvbnN0IHVpbnQ4X3QgKilkYXRhOwotICAgICAgICBjb25zdCB1aW50OF90ICpzcmNfdSA9Ci0gICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKilkYXRhICsgbVdpZHRoICogbUhlaWdodDsKLSAgICAgICAgY29uc3QgdWludDhfdCAqc3JjX3YgPSBzcmNfdSArIChtV2lkdGggLyAyICogbUhlaWdodCAvIDIpOwotCi0gICAgICAgIHNyY195ICs9bUNyb3BMZWZ0ICsgbUNyb3BUb3AgKiBtV2lkdGg7Ci0gICAgICAgIHNyY191ICs9KG1Dcm9wTGVmdCArIG1Dcm9wVG9wICogbVdpZHRoIC8gMikvMjsKLSAgICAgICAgc3JjX3YgKz0obUNyb3BMZWZ0ICsgbUNyb3BUb3AgKiBtV2lkdGggLyAyKS8yOworICAgICAgICBjb25zdCB1aW50OF90ICpzcmNfeSA9IChjb25zdCB1aW50OF90ICopZGF0YSArIG1Dcm9wVG9wICogbVN0cmlkZSArIG1Dcm9wTGVmdDsKKyAgICAgICAgY29uc3QgdWludDhfdCAqc3JjX3UgPSAoY29uc3QgdWludDhfdCAqKWRhdGEgKyBtU3RyaWRlICogbUhlaWdodCArIG1Dcm9wVG9wICogbVN0cmlkZSAvIDQ7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY192ID0gKGNvbnN0IHVpbnQ4X3QgKilzcmNfdSArIG1TdHJpZGUgKiBtSGVpZ2h0IC8gNDsKIAogICAgICAgICB1aW50OF90ICpkc3RfeSA9ICh1aW50OF90ICopZHN0OwogICAgICAgICBzaXplX3QgZHN0X3lfc2l6ZSA9IGJ1Zi0+c3RyaWRlICogYnVmLT5oZWlnaHQ7CkBAIC0zMDUsNyArMzAzLDcgQEAKICAgICAgICAgZm9yIChpbnQgeSA9IDA7IHkgPCBtQ3JvcEhlaWdodDsgKyt5KSB7CiAgICAgICAgICAgICBtZW1jcHkoZHN0X3ksIHNyY195LCBtQ3JvcFdpZHRoKTsKIAotICAgICAgICAgICAgc3JjX3kgKz0gbVdpZHRoOworICAgICAgICAgICAgc3JjX3kgKz0gbVN0cmlkZTsKICAgICAgICAgICAgIGRzdF95ICs9IGJ1Zi0+c3RyaWRlOwogICAgICAgICB9CiAKQEAgLTMxMywxOSArMzExLDE1IEBACiAgICAgICAgICAgICBtZW1jcHkoZHN0X3UsIHNyY191LCAobUNyb3BXaWR0aCArIDEpIC8gMik7CiAgICAgICAgICAgICBtZW1jcHkoZHN0X3YsIHNyY192LCAobUNyb3BXaWR0aCArIDEpIC8gMik7CiAKLSAgICAgICAgICAgIHNyY191ICs9IG1XaWR0aCAvIDI7Ci0gICAgICAgICAgICBzcmNfdiArPSBtV2lkdGggLyAyOworICAgICAgICAgICAgc3JjX3UgKz0gbVN0cmlkZSAvIDI7CisgICAgICAgICAgICBzcmNfdiArPSBtU3RyaWRlIC8gMjsKICAgICAgICAgICAgIGRzdF91ICs9IGRzdF9jX3N0cmlkZTsKICAgICAgICAgICAgIGRzdF92ICs9IGRzdF9jX3N0cmlkZTsKICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAobUNvbG9yRm9ybWF0ID09IE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIxNikgewotICAgICAgICBjb25zdCB1aW50MTZfdCAqc3JjX3kgPSAoY29uc3QgdWludDE2X3QgKilkYXRhOwotICAgICAgICBjb25zdCB1aW50MTZfdCAqc3JjX3UgPSAoY29uc3QgdWludDE2X3QgKilkYXRhICsgbVdpZHRoICogbUhlaWdodDsKLSAgICAgICAgY29uc3QgdWludDE2X3QgKnNyY192ID0gc3JjX3UgKyAobVdpZHRoIC8gMiAqIG1IZWlnaHQgLyAyKTsKLQotICAgICAgICBzcmNfeSArPSBtQ3JvcExlZnQgKyBtQ3JvcFRvcCAqIG1XaWR0aDsKLSAgICAgICAgc3JjX3UgKz0gKG1Dcm9wTGVmdCArIG1Dcm9wVG9wICogbVdpZHRoIC8gMikgLyAyOwotICAgICAgICBzcmNfdiArPSAobUNyb3BMZWZ0ICsgbUNyb3BUb3AgKiBtV2lkdGggLyAyKSAvIDI7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY195ID0gKGNvbnN0IHVpbnQ4X3QgKilkYXRhICsgbUNyb3BUb3AgKiBtU3RyaWRlICsgbUNyb3BMZWZ0ICogMjsKKyAgICAgICAgY29uc3QgdWludDhfdCAqc3JjX3UgPSAoY29uc3QgdWludDhfdCAqKWRhdGEgKyBtU3RyaWRlICogbUhlaWdodCArIG1Dcm9wVG9wICogbVN0cmlkZSAvIDQ7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY192ID0gKGNvbnN0IHVpbnQ4X3QgKilzcmNfdSArIG1TdHJpZGUgKiBtSGVpZ2h0IC8gNDsKIAogICAgICAgICB1aW50OF90ICpkc3RfeSA9ICh1aW50OF90ICopZHN0OwogICAgICAgICBzaXplX3QgZHN0X3lfc2l6ZSA9IGJ1Zi0+c3RyaWRlICogYnVmLT5oZWlnaHQ7CkBAIC0zNDAsMjEgKzMzNCwyMSBAQAogCiAgICAgICAgIGZvciAoaW50IHkgPSAwOyB5IDwgbUNyb3BIZWlnaHQ7ICsreSkgewogICAgICAgICAgICAgZm9yIChpbnQgeCA9IDA7IHggPCBtQ3JvcFdpZHRoOyArK3gpIHsKLSAgICAgICAgICAgICAgICBkc3RfeVt4XSA9ICh1aW50OF90KShzcmNfeVt4XSA+PiAyKTsKKyAgICAgICAgICAgICAgICBkc3RfeVt4XSA9ICh1aW50OF90KSgoKHVpbnQxNl90ICopc3JjX3kpW3hdID4+IDIpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBzcmNfeSArPSBtV2lkdGg7CisgICAgICAgICAgICBzcmNfeSArPSBtU3RyaWRlOwogICAgICAgICAgICAgZHN0X3kgKz0gYnVmLT5zdHJpZGU7CiAgICAgICAgIH0KIAogICAgICAgICBmb3IgKGludCB5ID0gMDsgeSA8IChtQ3JvcEhlaWdodCArIDEpIC8gMjsgKyt5KSB7CiAgICAgICAgICAgICBmb3IgKGludCB4ID0gMDsgeCA8IChtQ3JvcFdpZHRoICsgMSkgLyAyOyArK3gpIHsKLSAgICAgICAgICAgICAgICBkc3RfdVt4XSA9ICh1aW50OF90KShzcmNfdVt4XSA+PiAyKTsKLSAgICAgICAgICAgICAgICBkc3Rfdlt4XSA9ICh1aW50OF90KShzcmNfdlt4XSA+PiAyKTsKKyAgICAgICAgICAgICAgICBkc3RfdVt4XSA9ICh1aW50OF90KSgoKHVpbnQxNl90ICopc3JjX3UpW3hdID4+IDIpOworICAgICAgICAgICAgICAgIGRzdF92W3hdID0gKHVpbnQ4X3QpKCgodWludDE2X3QgKilzcmNfdilbeF0gPj4gMik7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIHNyY191ICs9IG1XaWR0aCAvIDI7Ci0gICAgICAgICAgICBzcmNfdiArPSBtV2lkdGggLyAyOworICAgICAgICAgICAgc3JjX3UgKz0gbVN0cmlkZSAvIDI7CisgICAgICAgICAgICBzcmNfdiArPSBtU3RyaWRlIC8gMjsKICAgICAgICAgICAgIGRzdF91ICs9IGRzdF9jX3N0cmlkZTsKICAgICAgICAgICAgIGRzdF92ICs9IGRzdF9jX3N0cmlkZTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4MzdmNjYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJBSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lIgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lLmg+Ci0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KLSNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1BU3RhdGU6OkFTdGF0ZShjb25zdCBzcDxBU3RhdGU+ICZwYXJlbnRTdGF0ZSkKLSAgICA6IG1QYXJlbnRTdGF0ZShwYXJlbnRTdGF0ZSkgewotfQotCi1BU3RhdGU6On5BU3RhdGUoKSB7Ci19Ci0KLXNwPEFTdGF0ZT4gQVN0YXRlOjpwYXJlbnRTdGF0ZSgpIHsKLSAgICByZXR1cm4gbVBhcmVudFN0YXRlOwotfQotCi12b2lkIEFTdGF0ZTo6c3RhdGVFbnRlcmVkKCkgewotfQotCi12b2lkIEFTdGF0ZTo6c3RhdGVFeGl0ZWQoKSB7Ci19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLUFIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmU6OkFIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUoKSB7Ci19Ci0KLUFIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmU6On5BSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lKCkgewotfQotCi12b2lkIEFIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmU6OmhhbmRsZU1lc3NhZ2UoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKLSAgICBzcDxBU3RhdGU+IHNhdmUgPSBtU3RhdGU7Ci0KLSAgICBzcDxBU3RhdGU+IGN1ciA9IG1TdGF0ZTsKLSAgICB3aGlsZSAoY3VyICE9IE5VTEwgJiYgIWN1ci0+b25NZXNzYWdlUmVjZWl2ZWQobXNnKSkgewotICAgICAgICAvLyBJZiB5b3UgY2xhaW0gbm90IHRvIGhhdmUgaGFuZGxlZCB0aGUgbWVzc2FnZSB5b3Ugc2hvdWxkbid0Ci0gICAgICAgIC8vIGhhdmUgY2FsbGVkIHNldFN0YXRlLi4uCi0gICAgICAgIENIRUNLKHNhdmUgPT0gbVN0YXRlKTsKLQotICAgICAgICBjdXIgPSBjdXItPnBhcmVudFN0YXRlKCk7Ci0gICAgfQotCi0gICAgaWYgKGN1ciAhPSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBBTE9HVygiV2FybmluZyBtZXNzYWdlICVzIHVuaGFuZGxlZCBpbiByb290IHN0YXRlLiIsCi0gICAgICAgICBtc2ctPmRlYnVnU3RyaW5nKCkuY19zdHIoKSk7Ci19Ci0KLXZvaWQgQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZTo6Y2hhbmdlU3RhdGUoY29uc3Qgc3A8QVN0YXRlPiAmc3RhdGUpIHsKLSAgICBpZiAoc3RhdGUgPT0gbVN0YXRlKSB7Ci0gICAgICAgIC8vIFF1aWNrIGV4aXQgZm9yIHRoZSBlYXN5IGNhc2UuCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBWZWN0b3I8c3A8QVN0YXRlPiA+IEE7Ci0gICAgc3A8QVN0YXRlPiBjdXIgPSBtU3RhdGU7Ci0gICAgZm9yICg7OykgewotICAgICAgICBBLnB1c2goY3VyKTsKLSAgICAgICAgaWYgKGN1ciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjdXIgPSBjdXItPnBhcmVudFN0YXRlKCk7Ci0gICAgfQotCi0gICAgVmVjdG9yPHNwPEFTdGF0ZT4gPiBCOwotICAgIGN1ciA9IHN0YXRlOwotICAgIGZvciAoOzspIHsKLSAgICAgICAgQi5wdXNoKGN1cik7Ci0gICAgICAgIGlmIChjdXIgPT0gTlVMTCkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY3VyID0gY3VyLT5wYXJlbnRTdGF0ZSgpOwotICAgIH0KLQotICAgIC8vIFJlbW92ZSB0aGUgY29tbW9uIHRhaWwuCi0gICAgd2hpbGUgKEEuc2l6ZSgpID4gMCAmJiBCLnNpemUoKSA+IDAgJiYgQS50b3AoKSA9PSBCLnRvcCgpKSB7Ci0gICAgICAgIEEucG9wKCk7Ci0gICAgICAgIEIucG9wKCk7Ci0gICAgfQotCi0gICAgbVN0YXRlID0gc3RhdGU7Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEEuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgQS5lZGl0SXRlbUF0KGkpLT5zdGF0ZUV4aXRlZCgpOwotICAgIH0KLQotICAgIGZvciAoc2l6ZV90IGkgPSBCLnNpemUoKTsgaSA+IDA7KSB7Ci0gICAgICAgIGktLTsKLSAgICAgICAgQi5lZGl0SXRlbUF0KGkpLT5zdGF0ZUVudGVyZWQoKTsKLSAgICB9Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmNwcAppbmRleCA5OTIxNjM2Li43NjhjYmQ2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5jcHAKQEAgLTE3MCw3ICsxNzAsOSBAQAogCiAgICAgaW50NjRfdCB3aGVuVXM7CiAgICAgaWYgKGRlbGF5VXMgPiAwKSB7Ci0gICAgICAgIHdoZW5VcyA9IEdldE5vd1VzKCkgKyBkZWxheVVzOworICAgICAgICBpbnQ2NF90IG5vd1VzID0gR2V0Tm93VXMoKTsKKyAgICAgICAgd2hlblVzID0gKGRlbGF5VXMgPiBJTlQ2NF9NQVggLSBub3dVcyA/IElOVDY0X01BWCA6IG5vd1VzICsgZGVsYXlVcyk7CisKICAgICB9IGVsc2UgewogICAgICAgICB3aGVuVXMgPSBHZXROb3dVcygpOwogICAgIH0KQEAgLTIwOCw2ICsyMTAsOSBAQAogCiAgICAgICAgIGlmICh3aGVuVXMgPiBub3dVcykgewogICAgICAgICAgICAgaW50NjRfdCBkZWxheVVzID0gd2hlblVzIC0gbm93VXM7CisgICAgICAgICAgICBpZiAoZGVsYXlVcyA+IElOVDY0X01BWCAvIDEwMDApIHsKKyAgICAgICAgICAgICAgICBkZWxheVVzID0gSU5UNjRfTUFYIC8gMTAwMDsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1RdWV1ZUNoYW5nZWRDb25kaXRpb24ud2FpdFJlbGF0aXZlKG1Mb2NrLCBkZWxheVVzICogMTAwMGxsKTsKIAogICAgICAgICAgICAgcmV0dXJuIHRydWU7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FOZXR3b3JrU2Vzc2lvbi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FOZXR3b3JrU2Vzc2lvbi5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhZmRjMzcuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTmV0d29ya1Nlc3Npb24uY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTQwMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTIsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jZGVmaW5lIExPR19UQUcgIk5ldHdvcmtTZXNzaW9uIgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSAiQU5ldHdvcmtTZXNzaW9uLmgiCi0jaW5jbHVkZSAiUGFyc2VkTWVzc2FnZS5oIgotCi0jaW5jbHVkZSA8YXJwYS9pbmV0Lmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxsaW51eC90Y3AuaD4KLSNpbmNsdWRlIDxuZXQvaWYuaD4KLSNpbmNsdWRlIDxuZXRkYi5oPgotI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KLSNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KLSNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+Ci0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0J5dGVVdGlscy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaGV4ZHVtcC5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0YXRpYyBjb25zdCBzaXplX3Qga01heFVEUFNpemUgPSAxNTAwOwotc3RhdGljIGNvbnN0IGludDMyX3Qga01heFVEUFJldHJpZXMgPSAyMDA7Ci0KLXN0cnVjdCBBTmV0d29ya1Nlc3Npb246Ok5ldHdvcmtUaHJlYWQgOiBwdWJsaWMgVGhyZWFkIHsKLSAgICBleHBsaWNpdCBOZXR3b3JrVGhyZWFkKEFOZXR3b3JrU2Vzc2lvbiAqc2Vzc2lvbik7Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIH5OZXR3b3JrVGhyZWFkKCk7Ci0KLXByaXZhdGU6Ci0gICAgQU5ldHdvcmtTZXNzaW9uICptU2Vzc2lvbjsKLQotICAgIHZpcnR1YWwgYm9vbCB0aHJlYWRMb29wKCk7Ci0KLSAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhOZXR3b3JrVGhyZWFkKTsKLX07Ci0KLXN0cnVjdCBBTmV0d29ya1Nlc3Npb246OlNlc3Npb24gOiBwdWJsaWMgUmVmQmFzZSB7Ci0gICAgZW51bSBNb2RlIHsKLSAgICAgICAgTU9ERV9SVFNQLAotICAgICAgICBNT0RFX0RBVEFHUkFNLAotICAgICAgICBNT0RFX1dFQlNPQ0tFVCwKLSAgICB9OwotCi0gICAgZW51bSBTdGF0ZSB7Ci0gICAgICAgIENPTk5FQ1RJTkcsCi0gICAgICAgIENPTk5FQ1RFRCwKLSAgICAgICAgTElTVEVOSU5HX1JUU1AsCi0gICAgICAgIExJU1RFTklOR19UQ1BfREdSQU1TLAotICAgICAgICBEQVRBR1JBTSwKLSAgICB9OwotCi0gICAgU2Vzc2lvbihpbnQzMl90IHNlc3Npb25JRCwKLSAgICAgICAgICAgIFN0YXRlIHN0YXRlLAotICAgICAgICAgICAgaW50IHMsCi0gICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSk7Ci0KLSAgICBpbnQzMl90IHNlc3Npb25JRCgpIGNvbnN0OwotICAgIGludCBzb2NrZXQoKSBjb25zdDsKLSAgICBzcDxBTWVzc2FnZT4gZ2V0Tm90aWZpY2F0aW9uTWVzc2FnZSgpIGNvbnN0OwotCi0gICAgYm9vbCBpc1JUU1BTZXJ2ZXIoKSBjb25zdDsKLSAgICBib29sIGlzVENQRGF0YWdyYW1TZXJ2ZXIoKSBjb25zdDsKLQotICAgIGJvb2wgd2FudHNUb1JlYWQoKTsKLSAgICBib29sIHdhbnRzVG9Xcml0ZSgpOwotCi0gICAgc3RhdHVzX3QgcmVhZE1vcmUoKTsKLSAgICBzdGF0dXNfdCB3cml0ZU1vcmUoKTsKLQotICAgIHN0YXR1c190IHNlbmRSZXF1ZXN0KAotICAgICAgICAgICAgY29uc3Qgdm9pZCAqZGF0YSwgc3NpemVfdCBzaXplLCBib29sIHRpbWVWYWxpZCwgaW50NjRfdCB0aW1lVXMpOwotCi0gICAgdm9pZCBzZXRNb2RlKE1vZGUgbW9kZSk7Ci0KLSAgICBzdGF0dXNfdCBzd2l0Y2hUb1dlYlNvY2tldE1vZGUoKTsKLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgflNlc3Npb24oKTsKLQotcHJpdmF0ZToKLSAgICBlbnVtIHsKLSAgICAgICAgRlJBR01FTlRfRkxBR19USU1FX1ZBTElEID0gMSwKLSAgICB9OwotICAgIHN0cnVjdCBGcmFnbWVudCB7Ci0gICAgICAgIHVpbnQzMl90IG1GbGFnczsKLSAgICAgICAgaW50NjRfdCBtVGltZVVzOwotICAgICAgICBzcDxBQnVmZmVyPiBtQnVmZmVyOwotICAgIH07Ci0KLSAgICBpbnQzMl90IG1TZXNzaW9uSUQ7Ci0gICAgU3RhdGUgbVN0YXRlOwotICAgIE1vZGUgbU1vZGU7Ci0gICAgaW50IG1Tb2NrZXQ7Ci0gICAgc3A8QU1lc3NhZ2U+IG1Ob3RpZnk7Ci0gICAgYm9vbCBtU2F3UmVjZWl2ZUZhaWx1cmUsIG1TYXdTZW5kRmFpbHVyZTsKLSAgICBpbnQzMl90IG1VRFBSZXRyaWVzOwotCi0gICAgTGlzdDxGcmFnbWVudD4gbU91dEZyYWdtZW50czsKLQotICAgIEFTdHJpbmcgbUluQnVmZmVyOwotCi0gICAgaW50NjRfdCBtTGFzdFN0YWxsUmVwb3J0VXM7Ci0KLSAgICB2b2lkIG5vdGlmeUVycm9yKGJvb2wgc2VuZCwgc3RhdHVzX3QgZXJyLCBjb25zdCBjaGFyICpkZXRhaWwpOwotICAgIHZvaWQgbm90aWZ5KE5vdGlmaWNhdGlvblJlYXNvbiByZWFzb24pOwotCi0gICAgdm9pZCBkdW1wRnJhZ21lbnRTdGF0cyhjb25zdCBGcmFnbWVudCAmZnJhZyk7Ci0KLSAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhTZXNzaW9uKTsKLX07Ci0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi1BTmV0d29ya1Nlc3Npb246Ok5ldHdvcmtUaHJlYWQ6Ok5ldHdvcmtUaHJlYWQoQU5ldHdvcmtTZXNzaW9uICpzZXNzaW9uKQotICAgIDogbVNlc3Npb24oc2Vzc2lvbikgewotfQotCi1BTmV0d29ya1Nlc3Npb246Ok5ldHdvcmtUaHJlYWQ6On5OZXR3b3JrVGhyZWFkKCkgewotfQotCi1ib29sIEFOZXR3b3JrU2Vzc2lvbjo6TmV0d29ya1RocmVhZDo6dGhyZWFkTG9vcCgpIHsKLSAgICBtU2Vzc2lvbi0+dGhyZWFkTG9vcCgpOwotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLUFOZXR3b3JrU2Vzc2lvbjo6U2Vzc2lvbjo6U2Vzc2lvbigKLSAgICAgICAgaW50MzJfdCBzZXNzaW9uSUQsCi0gICAgICAgIFN0YXRlIHN0YXRlLAotICAgICAgICBpbnQgcywKLSAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnkpCi0gICAgOiBtU2Vzc2lvbklEKHNlc3Npb25JRCksCi0gICAgICBtU3RhdGUoc3RhdGUpLAotICAgICAgbU1vZGUoTU9ERV9EQVRBR1JBTSksCi0gICAgICBtU29ja2V0KHMpLAotICAgICAgbU5vdGlmeShub3RpZnkpLAotICAgICAgbVNhd1JlY2VpdmVGYWlsdXJlKGZhbHNlKSwKLSAgICAgIG1TYXdTZW5kRmFpbHVyZShmYWxzZSksCi0gICAgICBtVURQUmV0cmllcyhrTWF4VURQUmV0cmllcyksCi0gICAgICBtTGFzdFN0YWxsUmVwb3J0VXMoLTFsbCkgewotICAgIGlmIChtU3RhdGUgPT0gQ09OTkVDVEVEKSB7Ci0gICAgICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBsb2NhbEFkZHI7Ci0gICAgICAgIHNvY2tsZW5fdCBsb2NhbEFkZHJMZW4gPSBzaXplb2YobG9jYWxBZGRyKTsKLQotICAgICAgICBpbnQgcmVzID0gZ2V0c29ja25hbWUoCi0gICAgICAgICAgICAgICAgbVNvY2tldCwgKHN0cnVjdCBzb2NrYWRkciAqKSZsb2NhbEFkZHIsICZsb2NhbEFkZHJMZW4pOwotICAgICAgICBDSEVDS19HRShyZXMsIDApOwotCi0gICAgICAgIHN0cnVjdCBzb2NrYWRkcl9pbiByZW1vdGVBZGRyOwotICAgICAgICBzb2NrbGVuX3QgcmVtb3RlQWRkckxlbiA9IHNpemVvZihyZW1vdGVBZGRyKTsKLQotICAgICAgICByZXMgPSBnZXRwZWVybmFtZSgKLSAgICAgICAgICAgICAgICBtU29ja2V0LCAoc3RydWN0IHNvY2thZGRyICopJnJlbW90ZUFkZHIsICZyZW1vdGVBZGRyTGVuKTsKLSAgICAgICAgQ0hFQ0tfR0UocmVzLCAwKTsKLQotICAgICAgICBpbl9hZGRyX3QgYWRkciA9IG50b2hsKGxvY2FsQWRkci5zaW5fYWRkci5zX2FkZHIpOwotICAgICAgICBBU3RyaW5nIGxvY2FsQWRkclN0cmluZyA9IEFTdHJpbmdQcmludGYoCi0gICAgICAgICAgICAgICAgIiVkLiVkLiVkLiVkIiwKLSAgICAgICAgICAgICAgICAoYWRkciA+PiAyNCksCi0gICAgICAgICAgICAgICAgKGFkZHIgPj4gMTYpICYgMHhmZiwKLSAgICAgICAgICAgICAgICAoYWRkciA+PiA4KSAmIDB4ZmYsCi0gICAgICAgICAgICAgICAgYWRkciAmIDB4ZmYpOwotCi0gICAgICAgIGFkZHIgPSBudG9obChyZW1vdGVBZGRyLnNpbl9hZGRyLnNfYWRkcik7Ci0gICAgICAgIEFTdHJpbmcgcmVtb3RlQWRkclN0cmluZyA9IEFTdHJpbmdQcmludGYoCi0gICAgICAgICAgICAgICAgIiVkLiVkLiVkLiVkIiwKLSAgICAgICAgICAgICAgICAoYWRkciA+PiAyNCksCi0gICAgICAgICAgICAgICAgKGFkZHIgPj4gMTYpICYgMHhmZiwKLSAgICAgICAgICAgICAgICAoYWRkciA+PiA4KSAmIDB4ZmYsCi0gICAgICAgICAgICAgICAgYWRkciAmIDB4ZmYpOwotCi0gICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBtTm90aWZ5LT5kdXAoKTsKLSAgICAgICAgbXNnLT5zZXRJbnQzMigic2Vzc2lvbklEIiwgbVNlc3Npb25JRCk7Ci0gICAgICAgIG1zZy0+c2V0SW50MzIoInJlYXNvbiIsIGtXaGF0Q2xpZW50Q29ubmVjdGVkKTsKLSAgICAgICAgbXNnLT5zZXRTdHJpbmcoInNlcnZlci1pcCIsIGxvY2FsQWRkclN0cmluZy5jX3N0cigpKTsKLSAgICAgICAgbXNnLT5zZXRJbnQzMigic2VydmVyLXBvcnQiLCBudG9ocyhsb2NhbEFkZHIuc2luX3BvcnQpKTsKLSAgICAgICAgbXNnLT5zZXRTdHJpbmcoImNsaWVudC1pcCIsIHJlbW90ZUFkZHJTdHJpbmcuY19zdHIoKSk7Ci0gICAgICAgIG1zZy0+c2V0SW50MzIoImNsaWVudC1wb3J0IiwgbnRvaHMocmVtb3RlQWRkci5zaW5fcG9ydCkpOwotICAgICAgICBtc2ctPnBvc3QoKTsKLSAgICB9Ci19Ci0KLUFOZXR3b3JrU2Vzc2lvbjo6U2Vzc2lvbjo6flNlc3Npb24oKSB7Ci0gICAgQUxPR1YoIlNlc3Npb24gJWQgZ29uZSIsIG1TZXNzaW9uSUQpOwotCi0gICAgY2xvc2UobVNvY2tldCk7Ci0gICAgbVNvY2tldCA9IC0xOwotfQotCi1pbnQzMl90IEFOZXR3b3JrU2Vzc2lvbjo6U2Vzc2lvbjo6c2Vzc2lvbklEKCkgY29uc3QgewotICAgIHJldHVybiBtU2Vzc2lvbklEOwotfQotCi1pbnQgQU5ldHdvcmtTZXNzaW9uOjpTZXNzaW9uOjpzb2NrZXQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1Tb2NrZXQ7Ci19Ci0KLXZvaWQgQU5ldHdvcmtTZXNzaW9uOjpTZXNzaW9uOjpzZXRNb2RlKE1vZGUgbW9kZSkgewotICAgIG1Nb2RlID0gbW9kZTsKLX0KLQotc3RhdHVzX3QgQU5ldHdvcmtTZXNzaW9uOjpTZXNzaW9uOjpzd2l0Y2hUb1dlYlNvY2tldE1vZGUoKSB7Ci0gICAgaWYgKG1TdGF0ZSAhPSBDT05ORUNURUQgfHwgbU1vZGUgIT0gTU9ERV9SVFNQKSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0KLSAgICBtTW9kZSA9IE1PREVfV0VCU09DS0VUOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zcDxBTWVzc2FnZT4gQU5ldHdvcmtTZXNzaW9uOjpTZXNzaW9uOjpnZXROb3RpZmljYXRpb25NZXNzYWdlKCkgY29uc3QgewotICAgIHJldHVybiBtTm90aWZ5OwotfQotCi1ib29sIEFOZXR3b3JrU2Vzc2lvbjo6U2Vzc2lvbjo6aXNSVFNQU2VydmVyKCkgY29uc3QgewotICAgIHJldHVybiBtU3RhdGUgPT0gTElTVEVOSU5HX1JUU1A7Ci19Ci0KLWJvb2wgQU5ldHdvcmtTZXNzaW9uOjpTZXNzaW9uOjppc1RDUERhdGFncmFtU2VydmVyKCkgY29uc3QgewotICAgIHJldHVybiBtU3RhdGUgPT0gTElTVEVOSU5HX1RDUF9ER1JBTVM7Ci19Ci0KLWJvb2wgQU5ldHdvcmtTZXNzaW9uOjpTZXNzaW9uOjp3YW50c1RvUmVhZCgpIHsKLSAgICByZXR1cm4gIW1TYXdSZWNlaXZlRmFpbHVyZSAmJiBtU3RhdGUgIT0gQ09OTkVDVElORzsKLX0KLQotYm9vbCBBTmV0d29ya1Nlc3Npb246OlNlc3Npb246OndhbnRzVG9Xcml0ZSgpIHsKLSAgICByZXR1cm4gIW1TYXdTZW5kRmFpbHVyZQotICAgICAgICAmJiAobVN0YXRlID09IENPTk5FQ1RJTkcKLSAgICAgICAgICAgIHx8IChtU3RhdGUgPT0gQ09OTkVDVEVEICYmICFtT3V0RnJhZ21lbnRzLmVtcHR5KCkpCi0gICAgICAgICAgICB8fCAobVN0YXRlID09IERBVEFHUkFNICYmICFtT3V0RnJhZ21lbnRzLmVtcHR5KCkpKTsKLX0KLQotc3RhdHVzX3QgQU5ldHdvcmtTZXNzaW9uOjpTZXNzaW9uOjpyZWFkTW9yZSgpIHsKLSAgICBpZiAobVN0YXRlID09IERBVEFHUkFNKSB7Ci0gICAgICAgIENIRUNLX0VRKG1Nb2RlLCBNT0RFX0RBVEFHUkFNKTsKLQotICAgICAgICBzdGF0dXNfdCBlcnI7Ci0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIHNwPEFCdWZmZXI+IGJ1ZiA9IG5ldyBBQnVmZmVyKGtNYXhVRFBTaXplKTsKLQotICAgICAgICAgICAgc3RydWN0IHNvY2thZGRyX2luIHJlbW90ZUFkZHI7Ci0gICAgICAgICAgICBzb2NrbGVuX3QgcmVtb3RlQWRkckxlbiA9IHNpemVvZihyZW1vdGVBZGRyKTsKLQotICAgICAgICAgICAgc3NpemVfdCBuOwotICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgIG4gPSByZWN2ZnJvbSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Tb2NrZXQsIGJ1Zi0+ZGF0YSgpLCBidWYtPmNhcGFjaXR5KCksIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAoc3RydWN0IHNvY2thZGRyICopJnJlbW90ZUFkZHIsICZyZW1vdGVBZGRyTGVuKTsKLSAgICAgICAgICAgIH0gd2hpbGUgKG4gPCAwICYmIGVycm5vID09IEVJTlRSKTsKLQotICAgICAgICAgICAgZXJyID0gT0s7Ci0gICAgICAgICAgICBpZiAobiA8IDApIHsKLSAgICAgICAgICAgICAgICBlcnIgPSAtZXJybm87Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG4gPT0gMCkgewotICAgICAgICAgICAgICAgIGVyciA9IC1FQ09OTlJFU0VUOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBidWYtPnNldFJhbmdlKDAsIG4pOwotCi0gICAgICAgICAgICAgICAgaW50NjRfdCBub3dVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7Ci0gICAgICAgICAgICAgICAgYnVmLT5tZXRhKCktPnNldEludDY0KCJhcnJpdmFsVGltZVVzIiwgbm93VXMpOwotCi0gICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOwotICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoInNlc3Npb25JRCIsIG1TZXNzaW9uSUQpOwotICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoInJlYXNvbiIsIGtXaGF0RGF0YWdyYW0pOwotCi0gICAgICAgICAgICAgICAgdWludDMyX3QgaXAgPSBudG9obChyZW1vdGVBZGRyLnNpbl9hZGRyLnNfYWRkcik7Ci0gICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRTdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICAiZnJvbUFkZHIiLAotICAgICAgICAgICAgICAgICAgICAgICAgQVN0cmluZ1ByaW50ZigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXUuJXUuJXUuJXUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlwID4+IDI0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpcCA+PiAxNikgJiAweGZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpcCA+PiA4KSAmIDB4ZmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXAgJiAweGZmKS5jX3N0cigpKTsKLQotICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImZyb21Qb3J0IiwgbnRvaHMocmVtb3RlQWRkci5zaW5fcG9ydCkpOwotCi0gICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRCdWZmZXIoImRhdGEiLCBidWYpOwotICAgICAgICAgICAgICAgIG5vdGlmeS0+cG9zdCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9IHdoaWxlIChlcnIgPT0gT0spOwotCi0gICAgICAgIGlmIChlcnIgPT0gLUVBR0FJTikgewotICAgICAgICAgICAgZXJyID0gT0s7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICBpZiAoIW1VRFBSZXRyaWVzKSB7Ci0gICAgICAgICAgICAgICAgbm90aWZ5RXJyb3IoZmFsc2UgLyogc2VuZCAqLywgZXJyLCAiUmVjdmZyb20gZmFpbGVkLiIpOwotICAgICAgICAgICAgICAgIG1TYXdSZWNlaXZlRmFpbHVyZSA9IHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1VRFBSZXRyaWVzLS07Ci0gICAgICAgICAgICAgICAgQUxPR0UoIlJlY3Zmcm9tIGZhaWxlZCwgJWQvJWQgcmV0cmllcyBsZWZ0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1VRFBSZXRyaWVzLCBrTWF4VURQUmV0cmllcyk7Ci0gICAgICAgICAgICAgICAgZXJyID0gT0s7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtVURQUmV0cmllcyA9IGtNYXhVRFBSZXRyaWVzOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBjaGFyIHRtcFs1MTJdOwotICAgIHNzaXplX3QgbjsKLSAgICBkbyB7Ci0gICAgICAgIG4gPSByZWN2KG1Tb2NrZXQsIHRtcCwgc2l6ZW9mKHRtcCksIDApOwotICAgIH0gd2hpbGUgKG4gPCAwICYmIGVycm5vID09IEVJTlRSKTsKLQotICAgIHN0YXR1c190IGVyciA9IE9LOwotCi0gICAgaWYgKG4gPiAwKSB7Ci0gICAgICAgIG1JbkJ1ZmZlci5hcHBlbmQodG1wLCBuKTsKLQotI2lmIDAKLSAgICAgICAgQUxPR0koImluOiIpOwotICAgICAgICBoZXhkdW1wKHRtcCwgbik7Ci0jZW5kaWYKLSAgICB9IGVsc2UgaWYgKG4gPCAwKSB7Ci0gICAgICAgIGVyciA9IC1lcnJubzsKLSAgICB9IGVsc2UgewotICAgICAgICBlcnIgPSAtRUNPTk5SRVNFVDsKLSAgICB9Ci0KLSAgICBpZiAobU1vZGUgPT0gTU9ERV9EQVRBR1JBTSkgewotICAgICAgICAvLyBUQ1Agc3RyZWFtIGNhcnJ5aW5nIDE2LWJpdCBsZW5ndGgtcHJlZml4ZWQgZGF0YWdyYW1zLgotCi0gICAgICAgIHdoaWxlIChtSW5CdWZmZXIuc2l6ZSgpID49IDIpIHsKLSAgICAgICAgICAgIHNpemVfdCBwYWNrZXRTaXplID0gVTE2X0FUKChjb25zdCB1aW50OF90ICopbUluQnVmZmVyLmNfc3RyKCkpOwotCi0gICAgICAgICAgICBpZiAobUluQnVmZmVyLnNpemUoKSA8IHBhY2tldFNpemUgKyAyKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNwPEFCdWZmZXI+IHBhY2tldCA9IG5ldyBBQnVmZmVyKHBhY2tldFNpemUpOwotICAgICAgICAgICAgbWVtY3B5KHBhY2tldC0+ZGF0YSgpLCBtSW5CdWZmZXIuY19zdHIoKSArIDIsIHBhY2tldFNpemUpOwotCi0gICAgICAgICAgICBpbnQ2NF90IG5vd1VzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKLSAgICAgICAgICAgIHBhY2tldC0+bWV0YSgpLT5zZXRJbnQ2NCgiYXJyaXZhbFRpbWVVcyIsIG5vd1VzKTsKLQotICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOwotICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigic2Vzc2lvbklEIiwgbVNlc3Npb25JRCk7Ci0gICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJyZWFzb24iLCBrV2hhdERhdGFncmFtKTsKLSAgICAgICAgICAgIG5vdGlmeS0+c2V0QnVmZmVyKCJkYXRhIiwgcGFja2V0KTsKLSAgICAgICAgICAgIG5vdGlmeS0+cG9zdCgpOwotCi0gICAgICAgICAgICBtSW5CdWZmZXIuZXJhc2UoMCwgcGFja2V0U2l6ZSArIDIpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChtTW9kZSA9PSBNT0RFX1JUU1ApIHsKLSAgICAgICAgZm9yICg7OykgewotICAgICAgICAgICAgc2l6ZV90IGxlbmd0aDsKLQotICAgICAgICAgICAgaWYgKG1JbkJ1ZmZlci5zaXplKCkgPiAwICYmIG1JbkJ1ZmZlci5jX3N0cigpWzBdID09ICckJykgewotICAgICAgICAgICAgICAgIGlmIChtSW5CdWZmZXIuc2l6ZSgpIDwgNCkgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBsZW5ndGggPSBVMTZfQVQoKGNvbnN0IHVpbnQ4X3QgKiltSW5CdWZmZXIuY19zdHIoKSArIDIpOwotCi0gICAgICAgICAgICAgICAgaWYgKG1JbkJ1ZmZlci5zaXplKCkgPCA0ICsgbGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKLSAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJzZXNzaW9uSUQiLCBtU2Vzc2lvbklEKTsKLSAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJyZWFzb24iLCBrV2hhdEJpbmFyeURhdGEpOwotICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImNoYW5uZWwiLCBtSW5CdWZmZXIuY19zdHIoKVsxXSk7Ci0KLSAgICAgICAgICAgICAgICBzcDxBQnVmZmVyPiBkYXRhID0gbmV3IEFCdWZmZXIobGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBtZW1jcHkoZGF0YS0+ZGF0YSgpLCBtSW5CdWZmZXIuY19zdHIoKSArIDQsIGxlbmd0aCk7Ci0KLSAgICAgICAgICAgICAgICBpbnQ2NF90IG5vd1VzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKLSAgICAgICAgICAgICAgICBkYXRhLT5tZXRhKCktPnNldEludDY0KCJhcnJpdmFsVGltZVVzIiwgbm93VXMpOwotCi0gICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRCdWZmZXIoImRhdGEiLCBkYXRhKTsKLSAgICAgICAgICAgICAgICBub3RpZnktPnBvc3QoKTsKLQotICAgICAgICAgICAgICAgIG1JbkJ1ZmZlci5lcmFzZSgwLCA0ICsgbGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc3A8UGFyc2VkTWVzc2FnZT4gbXNnID0KLSAgICAgICAgICAgICAgICBQYXJzZWRNZXNzYWdlOjpQYXJzZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG1JbkJ1ZmZlci5jX3N0cigpLCBtSW5CdWZmZXIuc2l6ZSgpLCBlcnIgIT0gT0ssICZsZW5ndGgpOwotCi0gICAgICAgICAgICBpZiAobXNnID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOwotICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigic2Vzc2lvbklEIiwgbVNlc3Npb25JRCk7Ci0gICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJyZWFzb24iLCBrV2hhdERhdGEpOwotICAgICAgICAgICAgbm90aWZ5LT5zZXRPYmplY3QoImRhdGEiLCBtc2cpOwotICAgICAgICAgICAgbm90aWZ5LT5wb3N0KCk7Ci0KLSNpZiAxCi0gICAgICAgICAgICAvLyBYWFggVGhlIChvbGQpIGRvbmdsZSBzZW5kcyB0aGUgd3JvbmcgY29udGVudCBsZW5ndGggaGVhZGVyIG9uIGEKLSAgICAgICAgICAgIC8vIFNFVF9QQVJBTUVURVIgcmVxdWVzdCB0aGF0IHNpZ25hbHMgYSAid2ZkX2lkcl9yZXF1ZXN0Ii4KLSAgICAgICAgICAgIC8vICgxNyBpbnN0ZWFkIG9mIDE5KS4KLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKmNvbnRlbnQgPSBtc2ctPmdldENvbnRlbnQoKTsKLSAgICAgICAgICAgIGlmIChjb250ZW50Ci0gICAgICAgICAgICAgICAgICAgICYmICFtZW1jbXAoY29udGVudCwgIndmZF9pZHJfcmVxdWVzdFxyXG4iLCAxNykKLSAgICAgICAgICAgICAgICAgICAgJiYgbGVuZ3RoID49IDE5Ci0gICAgICAgICAgICAgICAgICAgICYmIG1JbkJ1ZmZlci5jX3N0cigpW2xlbmd0aF0gPT0gJ1xyJwotICAgICAgICAgICAgICAgICAgICAmJiBtSW5CdWZmZXIuY19zdHIoKVtsZW5ndGggKyAxXSA9PSAnXG4nKSB7Ci0gICAgICAgICAgICAgICAgbGVuZ3RoICs9IDI7Ci0gICAgICAgICAgICB9Ci0jZW5kaWYKLQotICAgICAgICAgICAgbUluQnVmZmVyLmVyYXNlKDAsIGxlbmd0aCk7Ci0KLSAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIENIRUNLX0VRKG1Nb2RlLCBNT0RFX1dFQlNPQ0tFVCk7Ci0KLSAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSA9IChjb25zdCB1aW50OF90ICopbUluQnVmZmVyLmNfc3RyKCk7Ci0gICAgICAgIC8vIGhleGR1bXAoZGF0YSwgbUluQnVmZmVyLnNpemUoKSk7Ci0KLSAgICAgICAgd2hpbGUgKG1JbkJ1ZmZlci5zaXplKCkgPj0gMikgewotICAgICAgICAgICAgc2l6ZV90IG9mZnNldCA9IDI7Ci0KLSAgICAgICAgICAgIHVpbnQ2NF90IHBheWxvYWRMZW4gPSBkYXRhWzFdICYgMHg3ZjsKLSAgICAgICAgICAgIGlmIChwYXlsb2FkTGVuID09IDEyNikgewotICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgKyAyID4gbUluQnVmZmVyLnNpemUoKSkgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwYXlsb2FkTGVuID0gVTE2X0FUKCZkYXRhW29mZnNldF0pOwotICAgICAgICAgICAgICAgIG9mZnNldCArPSAyOwotICAgICAgICAgICAgfSBlbHNlIGlmIChwYXlsb2FkTGVuID09IDEyNykgewotICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgKyA4ID4gbUluQnVmZmVyLnNpemUoKSkgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwYXlsb2FkTGVuID0gVTY0X0FUKCZkYXRhW29mZnNldF0pOwotICAgICAgICAgICAgICAgIG9mZnNldCArPSA4OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB1aW50MzJfdCBtYXNrID0gMDsKLSAgICAgICAgICAgIGlmIChkYXRhWzFdICYgMHg4MCkgewotICAgICAgICAgICAgICAgIC8vIE1BU0s9PTEKLSAgICAgICAgICAgICAgICBpZiAob2Zmc2V0ICsgNCA+IG1JbkJ1ZmZlci5zaXplKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbWFzayA9IFUzMl9BVCgmZGF0YVtvZmZzZXRdKTsKLSAgICAgICAgICAgICAgICBvZmZzZXQgKz0gNDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHBheWxvYWRMZW4gPiBtSW5CdWZmZXIuc2l6ZSgpIHx8IG9mZnNldCA+IG1JbkJ1ZmZlci5zaXplKCkgLSBwYXlsb2FkTGVuKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFdlIGhhdmUgdGhlIGZ1bGwgbWVzc2FnZS4KLQotICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gcGFja2V0ID0gbmV3IEFCdWZmZXIocGF5bG9hZExlbik7Ci0gICAgICAgICAgICBtZW1jcHkocGFja2V0LT5kYXRhKCksICZkYXRhW29mZnNldF0sIHBheWxvYWRMZW4pOwotCi0gICAgICAgICAgICBpZiAobWFzayAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwYXlsb2FkTGVuOyArK2kpIHsKLSAgICAgICAgICAgICAgICAgICAgcGFja2V0LT5kYXRhKClbaV0gPQotICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVtvZmZzZXQgKyBpXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4gKChtYXNrID4+ICg4ICogKDMgLSAoaSAlIDQpKSkpICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7Ci0gICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJzZXNzaW9uSUQiLCBtU2Vzc2lvbklEKTsKLSAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoInJlYXNvbiIsIGtXaGF0V2ViU29ja2V0TWVzc2FnZSk7Ci0gICAgICAgICAgICBub3RpZnktPnNldEJ1ZmZlcigiZGF0YSIsIHBhY2tldCk7Ci0gICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJoZWFkZXJCeXRlIiwgZGF0YVswXSk7Ci0gICAgICAgICAgICBub3RpZnktPnBvc3QoKTsKLQotICAgICAgICAgICAgbUluQnVmZmVyLmVyYXNlKDAsIG9mZnNldCArIHBheWxvYWRMZW4pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICBub3RpZnlFcnJvcihmYWxzZSAvKiBzZW5kICovLCBlcnIsICJSZWN2IGZhaWxlZC4iKTsKLSAgICAgICAgbVNhd1JlY2VpdmVGYWlsdXJlID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi12b2lkIEFOZXR3b3JrU2Vzc2lvbjo6U2Vzc2lvbjo6ZHVtcEZyYWdtZW50U3RhdHMoY29uc3QgRnJhZ21lbnQgJiAvKiBmcmFnICovKSB7Ci0jaWYgMAotICAgIGludDY0X3Qgbm93VXMgPSBBTG9vcGVyOjpHZXROb3dVcygpOwotICAgIGludDY0X3QgZGVsYXlNcyA9IChub3dVcyAtIGZyYWcubVRpbWVVcykgLyAxMDAwbGw7Ci0KLSAgICBzdGF0aWMgY29uc3QgaW50NjRfdCBrTWluRGVsYXlNcyA9IDA7Ci0gICAgc3RhdGljIGNvbnN0IGludDY0X3Qga01heERlbGF5TXMgPSAzMDA7Ci0KLSAgICBjb25zdCBjaGFyICprUGF0dGVybiA9ICIjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIjsKLSAgICBzaXplX3Qga1BhdHRlcm5TaXplID0gc3RybGVuKGtQYXR0ZXJuKTsKLQotICAgIGludCBuID0gKGtQYXR0ZXJuU2l6ZSAqIChkZWxheU1zIC0ga01pbkRlbGF5TXMpKQotICAgICAgICAgICAgICAgIC8gKGtNYXhEZWxheU1zIC0ga01pbkRlbGF5TXMpOwotCi0gICAgaWYgKG4gPCAwKSB7Ci0gICAgICAgIG4gPSAwOwotICAgIH0gZWxzZSBpZiAoKHNpemVfdCluID4ga1BhdHRlcm5TaXplKSB7Ci0gICAgICAgIG4gPSBrUGF0dGVyblNpemU7Ci0gICAgfQotCi0gICAgQUxPR0koIlslbGxkXTogKCU0bGxkIG1zKSAlc1xuIiwKLSAgICAgICAgICBmcmFnLm1UaW1lVXMgLyAxMDAwLAotICAgICAgICAgIGRlbGF5TXMsCi0gICAgICAgICAga1BhdHRlcm4gKyBrUGF0dGVyblNpemUgLSBuKTsKLSNlbmRpZgotfQotCi1zdGF0dXNfdCBBTmV0d29ya1Nlc3Npb246OlNlc3Npb246OndyaXRlTW9yZSgpIHsKLSAgICBpZiAobVN0YXRlID09IERBVEFHUkFNKSB7Ci0gICAgICAgIENIRUNLKCFtT3V0RnJhZ21lbnRzLmVtcHR5KCkpOwotCi0gICAgICAgIHN0YXR1c190IGVycjsKLSAgICAgICAgZG8gewotICAgICAgICAgICAgY29uc3QgRnJhZ21lbnQgJmZyYWcgPSAqbU91dEZyYWdtZW50cy5iZWdpbigpOwotICAgICAgICAgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gJmRhdGFncmFtID0gZnJhZy5tQnVmZmVyOwotCi0gICAgICAgICAgICBpbnQgbjsKLSAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICBuID0gc2VuZChtU29ja2V0LCBkYXRhZ3JhbS0+ZGF0YSgpLCBkYXRhZ3JhbS0+c2l6ZSgpLCAwKTsKLSAgICAgICAgICAgIH0gd2hpbGUgKG4gPCAwICYmIGVycm5vID09IEVJTlRSKTsKLQotICAgICAgICAgICAgZXJyID0gT0s7Ci0KLSAgICAgICAgICAgIGlmIChuID4gMCkgewotICAgICAgICAgICAgICAgIGlmIChmcmFnLm1GbGFncyAmIEZSQUdNRU5UX0ZMQUdfVElNRV9WQUxJRCkgewotICAgICAgICAgICAgICAgICAgICBkdW1wRnJhZ21lbnRTdGF0cyhmcmFnKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBtT3V0RnJhZ21lbnRzLmVyYXNlKG1PdXRGcmFnbWVudHMuYmVnaW4oKSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG4gPCAwKSB7Ci0gICAgICAgICAgICAgICAgZXJyID0gLWVycm5vOwotICAgICAgICAgICAgfSBlbHNlIGlmIChuID09IDApIHsKLSAgICAgICAgICAgICAgICBlcnIgPSAtRUNPTk5SRVNFVDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSB3aGlsZSAoZXJyID09IE9LICYmICFtT3V0RnJhZ21lbnRzLmVtcHR5KCkpOwotCi0gICAgICAgIGlmIChlcnIgPT0gLUVBR0FJTikgewotICAgICAgICAgICAgaWYgKCFtT3V0RnJhZ21lbnRzLmVtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBBTE9HSSgiJXp1IGRhdGFncmFtcyByZW1haW4gcXVldWVkLiIsIG1PdXRGcmFnbWVudHMuc2l6ZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVyciA9IE9LOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgaWYgKCFtVURQUmV0cmllcykgewotICAgICAgICAgICAgICAgIG5vdGlmeUVycm9yKHRydWUgLyogc2VuZCAqLywgZXJyLCAiU2VuZCBkYXRhZ3JhbSBmYWlsZWQuIik7Ci0gICAgICAgICAgICAgICAgbVNhd1NlbmRGYWlsdXJlID0gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbVVEUFJldHJpZXMtLTsKLSAgICAgICAgICAgICAgICBBTE9HRSgiU2VuZCBkYXRhZ3JhbSBmYWlsZWQsICVkLyVkIHJldHJpZXMgbGVmdCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBtVURQUmV0cmllcywga01heFVEUFJldHJpZXMpOwotICAgICAgICAgICAgICAgIGVyciA9IE9LOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbVVEUFJldHJpZXMgPSBrTWF4VURQUmV0cmllczsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgaWYgKG1TdGF0ZSA9PSBDT05ORUNUSU5HKSB7Ci0gICAgICAgIGludCBlcnI7Ci0gICAgICAgIHNvY2tsZW5fdCBvcHRpb25MZW4gPSBzaXplb2YoZXJyKTsKLSAgICAgICAgQ0hFQ0tfRVEoZ2V0c29ja29wdChtU29ja2V0LCBTT0xfU09DS0VULCBTT19FUlJPUiwgJmVyciwgJm9wdGlvbkxlbiksIDApOwotICAgICAgICBDSEVDS19FUShvcHRpb25MZW4sIChzb2NrbGVuX3Qpc2l6ZW9mKGVycikpOwotCi0gICAgICAgIGlmIChlcnIgIT0gMCkgewotICAgICAgICAgICAgbm90aWZ5RXJyb3Ioa1doYXRFcnJvciwgLWVyciwgIkNvbm5lY3Rpb24gZmFpbGVkIik7Ci0gICAgICAgICAgICBtU2F3U2VuZEZhaWx1cmUgPSB0cnVlOwotCi0gICAgICAgICAgICByZXR1cm4gLWVycjsKLSAgICAgICAgfQotCi0gICAgICAgIG1TdGF0ZSA9IENPTk5FQ1RFRDsKLSAgICAgICAgbm90aWZ5KGtXaGF0Q29ubmVjdGVkKTsKLQotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotCi0gICAgQ0hFQ0tfRVEobVN0YXRlLCBDT05ORUNURUQpOwotICAgIENIRUNLKCFtT3V0RnJhZ21lbnRzLmVtcHR5KCkpOwotCi0gICAgc3NpemVfdCBuID0gLTE7Ci0gICAgd2hpbGUgKCFtT3V0RnJhZ21lbnRzLmVtcHR5KCkpIHsKLSAgICAgICAgY29uc3QgRnJhZ21lbnQgJmZyYWcgPSAqbU91dEZyYWdtZW50cy5iZWdpbigpOwotCi0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIG4gPSBzZW5kKG1Tb2NrZXQsIGZyYWcubUJ1ZmZlci0+ZGF0YSgpLCBmcmFnLm1CdWZmZXItPnNpemUoKSwgMCk7Ci0gICAgICAgIH0gd2hpbGUgKG4gPCAwICYmIGVycm5vID09IEVJTlRSKTsKLQotICAgICAgICBpZiAobiA8PSAwKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGZyYWcubUJ1ZmZlci0+c2V0UmFuZ2UoCi0gICAgICAgICAgICAgICAgZnJhZy5tQnVmZmVyLT5vZmZzZXQoKSArIG4sIGZyYWcubUJ1ZmZlci0+c2l6ZSgpIC0gbik7Ci0KLSAgICAgICAgaWYgKGZyYWcubUJ1ZmZlci0+c2l6ZSgpID4gMCkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZnJhZy5tRmxhZ3MgJiBGUkFHTUVOVF9GTEFHX1RJTUVfVkFMSUQpIHsKLSAgICAgICAgICAgIGR1bXBGcmFnbWVudFN0YXRzKGZyYWcpOwotICAgICAgICB9Ci0KLSAgICAgICAgbU91dEZyYWdtZW50cy5lcmFzZShtT3V0RnJhZ21lbnRzLmJlZ2luKCkpOwotICAgIH0KLQotICAgIHN0YXR1c190IGVyciA9IE9LOwotCi0gICAgaWYgKG4gPCAwKSB7Ci0gICAgICAgIGVyciA9IC1lcnJubzsKLSAgICB9IGVsc2UgaWYgKG4gPT0gMCkgewotICAgICAgICBlcnIgPSAtRUNPTk5SRVNFVDsKLSAgICB9Ci0KLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIG5vdGlmeUVycm9yKHRydWUgLyogc2VuZCAqLywgZXJyLCAiU2VuZCBmYWlsZWQuIik7Ci0gICAgICAgIG1TYXdTZW5kRmFpbHVyZSA9IHRydWU7Ci0gICAgfQotCi0jaWYgMAotICAgIGludCBudW1CeXRlc1F1ZXVlZDsKLSAgICBpbnQgcmVzID0gaW9jdGwobVNvY2tldCwgU0lPQ09VVFEsICZudW1CeXRlc1F1ZXVlZCk7Ci0gICAgaWYgKHJlcyA9PSAwICYmIG51bUJ5dGVzUXVldWVkID4gNTAgKiAxMDI0KSB7Ci0gICAgICAgIGlmIChudW1CeXRlc1F1ZXVlZCA+IDQwOTYwMCkgewotICAgICAgICAgICAgQUxPR1coIiEhISBudW1CeXRlc1F1ZXVlZCA9ICVkIiwgbnVtQnl0ZXNRdWV1ZWQpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50NjRfdCBub3dVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7Ci0KLSAgICAgICAgaWYgKG1MYXN0U3RhbGxSZXBvcnRVcyA8IDBsbAotICAgICAgICAgICAgICAgIHx8IG5vd1VzID4gbUxhc3RTdGFsbFJlcG9ydFVzICsgMTAwMDAwbGwpIHsKLSAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBtTm90aWZ5LT5kdXAoKTsKLSAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoInNlc3Npb25JRCIsIG1TZXNzaW9uSUQpOwotICAgICAgICAgICAgbXNnLT5zZXRJbnQzMigicmVhc29uIiwga1doYXROZXR3b3JrU3RhbGwpOwotICAgICAgICAgICAgbXNnLT5zZXRTaXplKCJudW1CeXRlc1F1ZXVlZCIsIG51bUJ5dGVzUXVldWVkKTsKLSAgICAgICAgICAgIG1zZy0+cG9zdCgpOwotCi0gICAgICAgICAgICBtTGFzdFN0YWxsUmVwb3J0VXMgPSBub3dVczsKLSAgICAgICAgfQotICAgIH0KLSNlbmRpZgotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotc3RhdHVzX3QgQU5ldHdvcmtTZXNzaW9uOjpTZXNzaW9uOjpzZW5kUmVxdWVzdCgKLSAgICAgICAgY29uc3Qgdm9pZCAqZGF0YSwgc3NpemVfdCBzaXplLCBib29sIHRpbWVWYWxpZCwgaW50NjRfdCB0aW1lVXMpIHsKLSAgICBDSEVDSyhtU3RhdGUgPT0gQ09OTkVDVEVEIHx8IG1TdGF0ZSA9PSBEQVRBR1JBTSk7Ci0KLSAgICBpZiAoc2l6ZSA8IDApIHsKLSAgICAgICAgc2l6ZSA9IHN0cmxlbigoY29uc3QgY2hhciAqKWRhdGEpOwotICAgIH0KLQotICAgIGlmIChzaXplID09IDApIHsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQotICAgIHNwPEFCdWZmZXI+IGJ1ZmZlcjsKLQotICAgIGlmIChtU3RhdGUgPT0gQ09OTkVDVEVEICYmIG1Nb2RlID09IE1PREVfREFUQUdSQU0pIHsKLSAgICAgICAgQ0hFQ0tfTEUoc2l6ZSwgNjU1MzUpOwotCi0gICAgICAgIGJ1ZmZlciA9IG5ldyBBQnVmZmVyKHNpemUgKyAyKTsKLSAgICAgICAgYnVmZmVyLT5kYXRhKClbMF0gPSBzaXplID4+IDg7Ci0gICAgICAgIGJ1ZmZlci0+ZGF0YSgpWzFdID0gc2l6ZSAmIDB4ZmY7Ci0gICAgICAgIG1lbWNweShidWZmZXItPmRhdGEoKSArIDIsIGRhdGEsIHNpemUpOwotICAgIH0gZWxzZSBpZiAobVN0YXRlID09IENPTk5FQ1RFRCAmJiBtTW9kZSA9PSBNT0RFX1dFQlNPQ0tFVCkgewotICAgICAgICBzdGF0aWMgY29uc3QgYm9vbCBrVXNlTWFzayA9IGZhbHNlOyAgLy8gQ2hyb21pdW0gZG9lc24ndCBsaWtlIGl0LgotCi0gICAgICAgIHNpemVfdCBudW1IZWFkZXJCeXRlcyA9IDIgKyAoa1VzZU1hc2sgPyA0IDogMCk7Ci0gICAgICAgIGlmIChzaXplID4gNjU1MzUpIHsKLSAgICAgICAgICAgIG51bUhlYWRlckJ5dGVzICs9IDg7Ci0gICAgICAgIH0gZWxzZSBpZiAoc2l6ZSA+IDEyNSkgewotICAgICAgICAgICAgbnVtSGVhZGVyQnl0ZXMgKz0gMjsKLSAgICAgICAgfQotCi0gICAgICAgIGJ1ZmZlciA9IG5ldyBBQnVmZmVyKG51bUhlYWRlckJ5dGVzICsgc2l6ZSk7Ci0gICAgICAgIGJ1ZmZlci0+ZGF0YSgpWzBdID0gMHg4MTsgIC8vIEZJTj09MSB8IG9wY29kZT0xICh0ZXh0KQotICAgICAgICBidWZmZXItPmRhdGEoKVsxXSA9IGtVc2VNYXNrID8gMHg4MCA6IDB4MDA7Ci0KLSAgICAgICAgaWYgKHNpemUgPiA2NTUzNSkgewotICAgICAgICAgICAgYnVmZmVyLT5kYXRhKClbMV0gfD0gMTI3OwotICAgICAgICAgICAgYnVmZmVyLT5kYXRhKClbMl0gPSAweDAwOwotICAgICAgICAgICAgYnVmZmVyLT5kYXRhKClbM10gPSAweDAwOwotICAgICAgICAgICAgYnVmZmVyLT5kYXRhKClbNF0gPSAweDAwOwotICAgICAgICAgICAgYnVmZmVyLT5kYXRhKClbNV0gPSAweDAwOwotICAgICAgICAgICAgYnVmZmVyLT5kYXRhKClbNl0gPSAoc2l6ZSA+PiAyNCkgJiAweGZmOwotICAgICAgICAgICAgYnVmZmVyLT5kYXRhKClbN10gPSAoc2l6ZSA+PiAxNikgJiAweGZmOwotICAgICAgICAgICAgYnVmZmVyLT5kYXRhKClbOF0gPSAoc2l6ZSA+PiA4KSAmIDB4ZmY7Ci0gICAgICAgICAgICBidWZmZXItPmRhdGEoKVs5XSA9IHNpemUgJiAweGZmOwotICAgICAgICB9IGVsc2UgaWYgKHNpemUgPiAxMjUpIHsKLSAgICAgICAgICAgIGJ1ZmZlci0+ZGF0YSgpWzFdIHw9IDEyNjsKLSAgICAgICAgICAgIGJ1ZmZlci0+ZGF0YSgpWzJdID0gKHNpemUgPj4gOCkgJiAweGZmOwotICAgICAgICAgICAgYnVmZmVyLT5kYXRhKClbM10gPSBzaXplICYgMHhmZjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGJ1ZmZlci0+ZGF0YSgpWzFdIHw9IHNpemU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoa1VzZU1hc2spIHsKLSAgICAgICAgICAgIHVpbnQzMl90IG1hc2sgPSByYW5kKCk7Ci0KLSAgICAgICAgICAgIGJ1ZmZlci0+ZGF0YSgpW251bUhlYWRlckJ5dGVzIC0gNF0gPSAobWFzayA+PiAyNCkgJiAweGZmOwotICAgICAgICAgICAgYnVmZmVyLT5kYXRhKClbbnVtSGVhZGVyQnl0ZXMgLSAzXSA9IChtYXNrID4+IDE2KSAmIDB4ZmY7Ci0gICAgICAgICAgICBidWZmZXItPmRhdGEoKVtudW1IZWFkZXJCeXRlcyAtIDJdID0gKG1hc2sgPj4gOCkgJiAweGZmOwotICAgICAgICAgICAgYnVmZmVyLT5kYXRhKClbbnVtSGVhZGVyQnl0ZXMgLSAxXSA9IG1hc2sgJiAweGZmOwotCi0gICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IChzaXplX3Qpc2l6ZTsgKytpKSB7Ci0gICAgICAgICAgICAgICAgYnVmZmVyLT5kYXRhKClbbnVtSGVhZGVyQnl0ZXMgKyBpXSA9Ci0gICAgICAgICAgICAgICAgICAgICgoY29uc3QgdWludDhfdCAqKWRhdGEpW2ldCi0gICAgICAgICAgICAgICAgICAgICAgICBeICgobWFzayA+PiAoOCAqICgzIC0gKGkgJSA0KSkpKSAmIDB4ZmYpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbWVtY3B5KGJ1ZmZlci0+ZGF0YSgpICsgbnVtSGVhZGVyQnl0ZXMsIGRhdGEsIHNpemUpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgYnVmZmVyID0gbmV3IEFCdWZmZXIoc2l6ZSk7Ci0gICAgICAgIG1lbWNweShidWZmZXItPmRhdGEoKSwgZGF0YSwgc2l6ZSk7Ci0gICAgfQotCi0gICAgRnJhZ21lbnQgZnJhZzsKLQotICAgIGZyYWcubUZsYWdzID0gMDsKLSAgICBpZiAodGltZVZhbGlkKSB7Ci0gICAgICAgIGZyYWcubUZsYWdzID0gRlJBR01FTlRfRkxBR19USU1FX1ZBTElEOwotICAgICAgICBmcmFnLm1UaW1lVXMgPSB0aW1lVXM7Ci0gICAgfQotCi0gICAgZnJhZy5tQnVmZmVyID0gYnVmZmVyOwotCi0gICAgbU91dEZyYWdtZW50cy5wdXNoX2JhY2soZnJhZyk7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXZvaWQgQU5ldHdvcmtTZXNzaW9uOjpTZXNzaW9uOjpub3RpZnlFcnJvcigKLSAgICAgICAgYm9vbCBzZW5kLCBzdGF0dXNfdCBlcnIsIGNvbnN0IGNoYXIgKmRldGFpbCkgewotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBtTm90aWZ5LT5kdXAoKTsKLSAgICBtc2ctPnNldEludDMyKCJzZXNzaW9uSUQiLCBtU2Vzc2lvbklEKTsKLSAgICBtc2ctPnNldEludDMyKCJyZWFzb24iLCBrV2hhdEVycm9yKTsKLSAgICBtc2ctPnNldEludDMyKCJzZW5kIiwgc2VuZCk7Ci0gICAgbXNnLT5zZXRJbnQzMigiZXJyIiwgZXJyKTsKLSAgICBtc2ctPnNldFN0cmluZygiZGV0YWlsIiwgZGV0YWlsKTsKLSAgICBtc2ctPnBvc3QoKTsKLX0KLQotdm9pZCBBTmV0d29ya1Nlc3Npb246OlNlc3Npb246Om5vdGlmeShOb3RpZmljYXRpb25SZWFzb24gcmVhc29uKSB7Ci0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG1Ob3RpZnktPmR1cCgpOwotICAgIG1zZy0+c2V0SW50MzIoInNlc3Npb25JRCIsIG1TZXNzaW9uSUQpOwotICAgIG1zZy0+c2V0SW50MzIoInJlYXNvbiIsIHJlYXNvbik7Ci0gICAgbXNnLT5wb3N0KCk7Ci19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLUFOZXR3b3JrU2Vzc2lvbjo6QU5ldHdvcmtTZXNzaW9uKCkKLSAgICA6IG1OZXh0U2Vzc2lvbklEKDEpIHsKLSAgICBtUGlwZUZkWzBdID0gbVBpcGVGZFsxXSA9IC0xOwotfQotCi1BTmV0d29ya1Nlc3Npb246On5BTmV0d29ya1Nlc3Npb24oKSB7Ci0gICAgc3RvcCgpOwotfQotCi1zdGF0dXNfdCBBTmV0d29ya1Nlc3Npb246OnN0YXJ0KCkgewotICAgIGlmIChtVGhyZWFkICE9IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLQotICAgIGludCByZXMgPSBwaXBlKG1QaXBlRmQpOwotICAgIGlmIChyZXMgIT0gMCkgewotICAgICAgICBtUGlwZUZkWzBdID0gbVBpcGVGZFsxXSA9IC0xOwotICAgICAgICByZXR1cm4gLWVycm5vOwotICAgIH0KLQotICAgIG1UaHJlYWQgPSBuZXcgTmV0d29ya1RocmVhZCh0aGlzKTsKLQotICAgIHN0YXR1c190IGVyciA9IG1UaHJlYWQtPnJ1bigiQU5ldHdvcmtTZXNzaW9uIiwgQU5EUk9JRF9QUklPUklUWV9BVURJTyk7Ci0KLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIG1UaHJlYWQuY2xlYXIoKTsKLQotICAgICAgICBjbG9zZShtUGlwZUZkWzBdKTsKLSAgICAgICAgY2xvc2UobVBpcGVGZFsxXSk7Ci0gICAgICAgIG1QaXBlRmRbMF0gPSBtUGlwZUZkWzFdID0gLTE7Ci0KLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IEFOZXR3b3JrU2Vzc2lvbjo6c3RvcCgpIHsKLSAgICBpZiAobVRocmVhZCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0KLSAgICBtVGhyZWFkLT5yZXF1ZXN0RXhpdCgpOwotICAgIGludGVycnVwdCgpOwotICAgIG1UaHJlYWQtPnJlcXVlc3RFeGl0QW5kV2FpdCgpOwotCi0gICAgbVRocmVhZC5jbGVhcigpOwotCi0gICAgY2xvc2UobVBpcGVGZFswXSk7Ci0gICAgY2xvc2UobVBpcGVGZFsxXSk7Ci0gICAgbVBpcGVGZFswXSA9IG1QaXBlRmRbMV0gPSAtMTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgQU5ldHdvcmtTZXNzaW9uOjpjcmVhdGVSVFNQQ2xpZW50KAotICAgICAgICBjb25zdCBjaGFyICpob3N0LCB1bnNpZ25lZCBwb3J0LCBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwKLSAgICAgICAgaW50MzJfdCAqc2Vzc2lvbklEKSB7Ci0gICAgcmV0dXJuIGNyZWF0ZUNsaWVudE9yU2VydmVyKAotICAgICAgICAgICAga01vZGVDcmVhdGVSVFNQQ2xpZW50LAotICAgICAgICAgICAgTlVMTCAvKiBhZGRyICovLAotICAgICAgICAgICAgMCAvKiBwb3J0ICovLAotICAgICAgICAgICAgaG9zdCwKLSAgICAgICAgICAgIHBvcnQsCi0gICAgICAgICAgICBub3RpZnksCi0gICAgICAgICAgICBzZXNzaW9uSUQpOwotfQotCi1zdGF0dXNfdCBBTmV0d29ya1Nlc3Npb246OmNyZWF0ZVJUU1BTZXJ2ZXIoCi0gICAgICAgIGNvbnN0IHN0cnVjdCBpbl9hZGRyICZhZGRyLCB1bnNpZ25lZCBwb3J0LAotICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwgaW50MzJfdCAqc2Vzc2lvbklEKSB7Ci0gICAgcmV0dXJuIGNyZWF0ZUNsaWVudE9yU2VydmVyKAotICAgICAgICAgICAga01vZGVDcmVhdGVSVFNQU2VydmVyLAotICAgICAgICAgICAgJmFkZHIsCi0gICAgICAgICAgICBwb3J0LAotICAgICAgICAgICAgTlVMTCAvKiByZW1vdGVIb3N0ICovLAotICAgICAgICAgICAgMCAvKiByZW1vdGVQb3J0ICovLAotICAgICAgICAgICAgbm90aWZ5LAotICAgICAgICAgICAgc2Vzc2lvbklEKTsKLX0KLQotc3RhdHVzX3QgQU5ldHdvcmtTZXNzaW9uOjpjcmVhdGVVRFBTZXNzaW9uKAotICAgICAgICB1bnNpZ25lZCBsb2NhbFBvcnQsIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LCBpbnQzMl90ICpzZXNzaW9uSUQpIHsKLSAgICByZXR1cm4gY3JlYXRlVURQU2Vzc2lvbihsb2NhbFBvcnQsIE5VTEwsIDAsIG5vdGlmeSwgc2Vzc2lvbklEKTsKLX0KLQotc3RhdHVzX3QgQU5ldHdvcmtTZXNzaW9uOjpjcmVhdGVVRFBTZXNzaW9uKAotICAgICAgICB1bnNpZ25lZCBsb2NhbFBvcnQsCi0gICAgICAgIGNvbnN0IGNoYXIgKnJlbW90ZUhvc3QsCi0gICAgICAgIHVuc2lnbmVkIHJlbW90ZVBvcnQsCi0gICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LAotICAgICAgICBpbnQzMl90ICpzZXNzaW9uSUQpIHsKLSAgICByZXR1cm4gY3JlYXRlQ2xpZW50T3JTZXJ2ZXIoCi0gICAgICAgICAgICBrTW9kZUNyZWF0ZVVEUFNlc3Npb24sCi0gICAgICAgICAgICBOVUxMIC8qIGFkZHIgKi8sCi0gICAgICAgICAgICBsb2NhbFBvcnQsCi0gICAgICAgICAgICByZW1vdGVIb3N0LAotICAgICAgICAgICAgcmVtb3RlUG9ydCwKLSAgICAgICAgICAgIG5vdGlmeSwKLSAgICAgICAgICAgIHNlc3Npb25JRCk7Ci19Ci0KLXN0YXR1c190IEFOZXR3b3JrU2Vzc2lvbjo6Y3JlYXRlVENQRGF0YWdyYW1TZXNzaW9uKAotICAgICAgICBjb25zdCBzdHJ1Y3QgaW5fYWRkciAmYWRkciwgdW5zaWduZWQgcG9ydCwKLSAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksIGludDMyX3QgKnNlc3Npb25JRCkgewotICAgIHJldHVybiBjcmVhdGVDbGllbnRPclNlcnZlcigKLSAgICAgICAgICAgIGtNb2RlQ3JlYXRlVENQRGF0YWdyYW1TZXNzaW9uUGFzc2l2ZSwKLSAgICAgICAgICAgICZhZGRyLAotICAgICAgICAgICAgcG9ydCwKLSAgICAgICAgICAgIE5VTEwgLyogcmVtb3RlSG9zdCAqLywKLSAgICAgICAgICAgIDAgLyogcmVtb3RlUG9ydCAqLywKLSAgICAgICAgICAgIG5vdGlmeSwKLSAgICAgICAgICAgIHNlc3Npb25JRCk7Ci19Ci0KLXN0YXR1c190IEFOZXR3b3JrU2Vzc2lvbjo6Y3JlYXRlVENQRGF0YWdyYW1TZXNzaW9uKAotICAgICAgICB1bnNpZ25lZCBsb2NhbFBvcnQsCi0gICAgICAgIGNvbnN0IGNoYXIgKnJlbW90ZUhvc3QsCi0gICAgICAgIHVuc2lnbmVkIHJlbW90ZVBvcnQsCi0gICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LAotICAgICAgICBpbnQzMl90ICpzZXNzaW9uSUQpIHsKLSAgICByZXR1cm4gY3JlYXRlQ2xpZW50T3JTZXJ2ZXIoCi0gICAgICAgICAgICBrTW9kZUNyZWF0ZVRDUERhdGFncmFtU2Vzc2lvbkFjdGl2ZSwKLSAgICAgICAgICAgIE5VTEwgLyogYWRkciAqLywKLSAgICAgICAgICAgIGxvY2FsUG9ydCwKLSAgICAgICAgICAgIHJlbW90ZUhvc3QsCi0gICAgICAgICAgICByZW1vdGVQb3J0LAotICAgICAgICAgICAgbm90aWZ5LAotICAgICAgICAgICAgc2Vzc2lvbklEKTsKLX0KLQotc3RhdHVzX3QgQU5ldHdvcmtTZXNzaW9uOjpkZXN0cm95U2Vzc2lvbihpbnQzMl90IHNlc3Npb25JRCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBzc2l6ZV90IGluZGV4ID0gbVNlc3Npb25zLmluZGV4T2ZLZXkoc2Vzc2lvbklEKTsKLQotICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgcmV0dXJuIC1FTk9FTlQ7Ci0gICAgfQotCi0gICAgbVNlc3Npb25zLnJlbW92ZUl0ZW1zQXQoaW5kZXgpOwotCi0gICAgaW50ZXJydXB0KCk7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLS8vIHN0YXRpYwotc3RhdHVzX3QgQU5ldHdvcmtTZXNzaW9uOjpNYWtlU29ja2V0Tm9uQmxvY2tpbmcoaW50IHMpIHsKLSAgICBpbnQgZmxhZ3MgPSBmY250bChzLCBGX0dFVEZMLCAwKTsKLSAgICBpZiAoZmxhZ3MgPCAwKSB7Ci0gICAgICAgIGZsYWdzID0gMDsKLSAgICB9Ci0KLSAgICBpbnQgcmVzID0gZmNudGwocywgRl9TRVRGTCwgZmxhZ3MgfCBPX05PTkJMT0NLKTsKLSAgICBpZiAocmVzIDwgMCkgewotICAgICAgICByZXR1cm4gLWVycm5vOwotICAgIH0KLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgQU5ldHdvcmtTZXNzaW9uOjpjcmVhdGVDbGllbnRPclNlcnZlcigKLSAgICAgICAgTW9kZSBtb2RlLAotICAgICAgICBjb25zdCBzdHJ1Y3QgaW5fYWRkciAqbG9jYWxBZGRyLAotICAgICAgICB1bnNpZ25lZCBwb3J0LAotICAgICAgICBjb25zdCBjaGFyICpyZW1vdGVIb3N0LAotICAgICAgICB1bnNpZ25lZCByZW1vdGVQb3J0LAotICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwKLSAgICAgICAgaW50MzJfdCAqc2Vzc2lvbklEKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgICpzZXNzaW9uSUQgPSAwOwotICAgIHN0YXR1c190IGVyciA9IE9LOwotICAgIGludCBzLCByZXM7Ci0gICAgc3A8U2Vzc2lvbj4gc2Vzc2lvbjsKLQotICAgIHMgPSBzb2NrZXQoCi0gICAgICAgICAgICBBRl9JTkVULAotICAgICAgICAgICAgKG1vZGUgPT0ga01vZGVDcmVhdGVVRFBTZXNzaW9uKSA/IFNPQ0tfREdSQU0gOiBTT0NLX1NUUkVBTSwKLSAgICAgICAgICAgIDApOwotCi0gICAgaWYgKHMgPCAwKSB7Ci0gICAgICAgIGVyciA9IC1lcnJubzsKLSAgICAgICAgZ290byBiYWlsOwotICAgIH0KLQotICAgIGlmIChtb2RlID09IGtNb2RlQ3JlYXRlUlRTUFNlcnZlcgotICAgICAgICAgICAgfHwgbW9kZSA9PSBrTW9kZUNyZWF0ZVRDUERhdGFncmFtU2Vzc2lvblBhc3NpdmUpIHsKLSAgICAgICAgY29uc3QgaW50IHllcyA9IDE7Ci0gICAgICAgIHJlcyA9IHNldHNvY2tvcHQocywgU09MX1NPQ0tFVCwgU09fUkVVU0VBRERSLCAmeWVzLCBzaXplb2YoeWVzKSk7Ci0KLSAgICAgICAgaWYgKHJlcyA8IDApIHsKLSAgICAgICAgICAgIGVyciA9IC1lcnJubzsKLSAgICAgICAgICAgIGdvdG8gYmFpbDI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAobW9kZSA9PSBrTW9kZUNyZWF0ZVVEUFNlc3Npb24pIHsKLSAgICAgICAgaW50IHNpemUgPSAyNTYgKiAxMDI0OwotCi0gICAgICAgIHJlcyA9IHNldHNvY2tvcHQocywgU09MX1NPQ0tFVCwgU09fUkNWQlVGLCAmc2l6ZSwgc2l6ZW9mKHNpemUpKTsKLQotICAgICAgICBpZiAocmVzIDwgMCkgewotICAgICAgICAgICAgZXJyID0gLWVycm5vOwotICAgICAgICAgICAgZ290byBiYWlsMjsKLSAgICAgICAgfQotCi0gICAgICAgIHJlcyA9IHNldHNvY2tvcHQocywgU09MX1NPQ0tFVCwgU09fU05EQlVGLCAmc2l6ZSwgc2l6ZW9mKHNpemUpKTsKLQotICAgICAgICBpZiAocmVzIDwgMCkgewotICAgICAgICAgICAgZXJyID0gLWVycm5vOwotICAgICAgICAgICAgZ290byBiYWlsMjsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAobW9kZSA9PSBrTW9kZUNyZWF0ZVRDUERhdGFncmFtU2Vzc2lvbkFjdGl2ZSkgewotICAgICAgICBpbnQgZmxhZyA9IDE7Ci0gICAgICAgIHJlcyA9IHNldHNvY2tvcHQocywgSVBQUk9UT19UQ1AsIFRDUF9OT0RFTEFZLCAmZmxhZywgc2l6ZW9mKGZsYWcpKTsKLQotICAgICAgICBpZiAocmVzIDwgMCkgewotICAgICAgICAgICAgZXJyID0gLWVycm5vOwotICAgICAgICAgICAgZ290byBiYWlsMjsKLSAgICAgICAgfQotCi0gICAgICAgIGludCB0b3MgPSAyMjQ7ICAvLyBWT0lDRQotICAgICAgICByZXMgPSBzZXRzb2Nrb3B0KHMsIElQUFJPVE9fSVAsIElQX1RPUywgJnRvcywgc2l6ZW9mKHRvcykpOwotCi0gICAgICAgIGlmIChyZXMgPCAwKSB7Ci0gICAgICAgICAgICBlcnIgPSAtZXJybm87Ci0gICAgICAgICAgICBnb3RvIGJhaWwyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgZXJyID0gTWFrZVNvY2tldE5vbkJsb2NraW5nKHMpOwotCi0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICBnb3RvIGJhaWwyOwotICAgIH0KLQotICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBhZGRyOwotICAgIG1lbXNldChhZGRyLnNpbl96ZXJvLCAwLCBzaXplb2YoYWRkci5zaW5femVybykpOwotICAgIGFkZHIuc2luX2ZhbWlseSA9IEFGX0lORVQ7Ci0KLSAgICBpZiAobW9kZSA9PSBrTW9kZUNyZWF0ZVJUU1BDbGllbnQKLSAgICAgICAgICAgIHx8IG1vZGUgPT0ga01vZGVDcmVhdGVUQ1BEYXRhZ3JhbVNlc3Npb25BY3RpdmUpIHsKLSAgICAgICAgc3RydWN0IGhvc3RlbnQgKmVudD0gZ2V0aG9zdGJ5bmFtZShyZW1vdGVIb3N0KTsKLSAgICAgICAgaWYgKGVudCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBlcnIgPSAtaF9lcnJubzsKLSAgICAgICAgICAgIGdvdG8gYmFpbDI7Ci0gICAgICAgIH0KLQotICAgICAgICBhZGRyLnNpbl9hZGRyLnNfYWRkciA9ICooaW5fYWRkcl90ICopZW50LT5oX2FkZHI7Ci0gICAgICAgIGFkZHIuc2luX3BvcnQgPSBodG9ucyhyZW1vdGVQb3J0KTsKLSAgICB9IGVsc2UgaWYgKGxvY2FsQWRkciAhPSBOVUxMKSB7Ci0gICAgICAgIGFkZHIuc2luX2FkZHIgPSAqbG9jYWxBZGRyOwotICAgICAgICBhZGRyLnNpbl9wb3J0ID0gaHRvbnMocG9ydCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgYWRkci5zaW5fYWRkci5zX2FkZHIgPSBodG9ubChJTkFERFJfQU5ZKTsKLSAgICAgICAgYWRkci5zaW5fcG9ydCA9IGh0b25zKHBvcnQpOwotICAgIH0KLQotICAgIGlmIChtb2RlID09IGtNb2RlQ3JlYXRlUlRTUENsaWVudAotICAgICAgICAgICAgfHwgbW9kZSA9PSBrTW9kZUNyZWF0ZVRDUERhdGFncmFtU2Vzc2lvbkFjdGl2ZSkgewotICAgICAgICBpbl9hZGRyX3QgeCA9IG50b2hsKGFkZHIuc2luX2FkZHIuc19hZGRyKTsKLSAgICAgICAgQUxPR0koImNvbm5lY3Rpbmcgc29ja2V0ICVkIHRvICVkLiVkLiVkLiVkOiVkIiwKLSAgICAgICAgICAgICAgcywKLSAgICAgICAgICAgICAgKHggPj4gMjQpLAotICAgICAgICAgICAgICAoeCA+PiAxNikgJiAweGZmLAotICAgICAgICAgICAgICAoeCA+PiA4KSAmIDB4ZmYsCi0gICAgICAgICAgICAgIHggJiAweGZmLAotICAgICAgICAgICAgICBudG9ocyhhZGRyLnNpbl9wb3J0KSk7Ci0KLSAgICAgICAgcmVzID0gY29ubmVjdChzLCAoY29uc3Qgc3RydWN0IHNvY2thZGRyICopJmFkZHIsIHNpemVvZihhZGRyKSk7Ci0KLSAgICAgICAgQ0hFQ0tfTFQocmVzLCAwKTsKLSAgICAgICAgaWYgKGVycm5vID09IEVJTlBST0dSRVNTKSB7Ci0gICAgICAgICAgICByZXMgPSAwOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmVzID0gYmluZChzLCAoY29uc3Qgc3RydWN0IHNvY2thZGRyICopJmFkZHIsIHNpemVvZihhZGRyKSk7Ci0KLSAgICAgICAgaWYgKHJlcyA9PSAwKSB7Ci0gICAgICAgICAgICBpZiAobW9kZSA9PSBrTW9kZUNyZWF0ZVJUU1BTZXJ2ZXIKLSAgICAgICAgICAgICAgICAgICAgfHwgbW9kZSA9PSBrTW9kZUNyZWF0ZVRDUERhdGFncmFtU2Vzc2lvblBhc3NpdmUpIHsKLSAgICAgICAgICAgICAgICByZXMgPSBsaXN0ZW4ocywgNCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIENIRUNLX0VRKG1vZGUsIGtNb2RlQ3JlYXRlVURQU2Vzc2lvbik7Ci0KLSAgICAgICAgICAgICAgICBpZiAocmVtb3RlSG9zdCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzb2NrYWRkcl9pbiByZW1vdGVBZGRyOwotICAgICAgICAgICAgICAgICAgICBtZW1zZXQocmVtb3RlQWRkci5zaW5femVybywgMCwgc2l6ZW9mKHJlbW90ZUFkZHIuc2luX3plcm8pKTsKLSAgICAgICAgICAgICAgICAgICAgcmVtb3RlQWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKLSAgICAgICAgICAgICAgICAgICAgcmVtb3RlQWRkci5zaW5fcG9ydCA9IGh0b25zKHJlbW90ZVBvcnQpOwotCi0gICAgICAgICAgICAgICAgICAgIHN0cnVjdCBob3N0ZW50ICplbnQ9IGdldGhvc3RieW5hbWUocmVtb3RlSG9zdCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChlbnQgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gLWhfZXJybm87Ci0gICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGJhaWwyOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgcmVtb3RlQWRkci5zaW5fYWRkci5zX2FkZHIgPSAqKGluX2FkZHJfdCAqKWVudC0+aF9hZGRyOwotCi0gICAgICAgICAgICAgICAgICAgIHJlcyA9IGNvbm5lY3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3Qgc3RydWN0IHNvY2thZGRyICopJnJlbW90ZUFkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHJlbW90ZUFkZHIpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAocmVzIDwgMCkgewotICAgICAgICBlcnIgPSAtZXJybm87Ci0gICAgICAgIGdvdG8gYmFpbDI7Ci0gICAgfQotCi0gICAgU2Vzc2lvbjo6U3RhdGUgc3RhdGU7Ci0gICAgc3dpdGNoIChtb2RlKSB7Ci0gICAgICAgIGNhc2Uga01vZGVDcmVhdGVSVFNQQ2xpZW50OgotICAgICAgICAgICAgc3RhdGUgPSBTZXNzaW9uOjpDT05ORUNUSU5HOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBrTW9kZUNyZWF0ZVRDUERhdGFncmFtU2Vzc2lvbkFjdGl2ZToKLSAgICAgICAgICAgIHN0YXRlID0gU2Vzc2lvbjo6Q09OTkVDVElORzsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2Uga01vZGVDcmVhdGVUQ1BEYXRhZ3JhbVNlc3Npb25QYXNzaXZlOgotICAgICAgICAgICAgc3RhdGUgPSBTZXNzaW9uOjpMSVNURU5JTkdfVENQX0RHUkFNUzsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2Uga01vZGVDcmVhdGVSVFNQU2VydmVyOgotICAgICAgICAgICAgc3RhdGUgPSBTZXNzaW9uOjpMSVNURU5JTkdfUlRTUDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBDSEVDS19FUShtb2RlLCBrTW9kZUNyZWF0ZVVEUFNlc3Npb24pOwotICAgICAgICAgICAgc3RhdGUgPSBTZXNzaW9uOjpEQVRBR1JBTTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIHNlc3Npb24gPSBuZXcgU2Vzc2lvbigKLSAgICAgICAgICAgIG1OZXh0U2Vzc2lvbklEKyssCi0gICAgICAgICAgICBzdGF0ZSwKLSAgICAgICAgICAgIHMsCi0gICAgICAgICAgICBub3RpZnkpOwotCi0gICAgaWYgKG1vZGUgPT0ga01vZGVDcmVhdGVUQ1BEYXRhZ3JhbVNlc3Npb25BY3RpdmUpIHsKLSAgICAgICAgc2Vzc2lvbi0+c2V0TW9kZShTZXNzaW9uOjpNT0RFX0RBVEFHUkFNKTsKLSAgICB9IGVsc2UgaWYgKG1vZGUgPT0ga01vZGVDcmVhdGVSVFNQQ2xpZW50KSB7Ci0gICAgICAgIHNlc3Npb24tPnNldE1vZGUoU2Vzc2lvbjo6TU9ERV9SVFNQKTsKLSAgICB9Ci0KLSAgICBtU2Vzc2lvbnMuYWRkKHNlc3Npb24tPnNlc3Npb25JRCgpLCBzZXNzaW9uKTsKLQotICAgIGludGVycnVwdCgpOwotCi0gICAgKnNlc3Npb25JRCA9IHNlc3Npb24tPnNlc3Npb25JRCgpOwotCi0gICAgZ290byBiYWlsOwotCi1iYWlsMjoKLSAgICBjbG9zZShzKTsKLSAgICBzID0gLTE7Ci0KLWJhaWw6Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotc3RhdHVzX3QgQU5ldHdvcmtTZXNzaW9uOjpjb25uZWN0VURQU2Vzc2lvbigKLSAgICAgICAgaW50MzJfdCBzZXNzaW9uSUQsIGNvbnN0IGNoYXIgKnJlbW90ZUhvc3QsIHVuc2lnbmVkIHJlbW90ZVBvcnQpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgc3NpemVfdCBpbmRleCA9IG1TZXNzaW9ucy5pbmRleE9mS2V5KHNlc3Npb25JRCk7Ci0KLSAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIHJldHVybiAtRU5PRU5UOwotICAgIH0KLQotICAgIGNvbnN0IHNwPFNlc3Npb24+IHNlc3Npb24gPSBtU2Vzc2lvbnMudmFsdWVBdChpbmRleCk7Ci0gICAgaW50IHMgPSBzZXNzaW9uLT5zb2NrZXQoKTsKLQotICAgIHN0cnVjdCBzb2NrYWRkcl9pbiByZW1vdGVBZGRyOwotICAgIG1lbXNldChyZW1vdGVBZGRyLnNpbl96ZXJvLCAwLCBzaXplb2YocmVtb3RlQWRkci5zaW5femVybykpOwotICAgIHJlbW90ZUFkZHIuc2luX2ZhbWlseSA9IEFGX0lORVQ7Ci0gICAgcmVtb3RlQWRkci5zaW5fcG9ydCA9IGh0b25zKHJlbW90ZVBvcnQpOwotCi0gICAgc3RhdHVzX3QgZXJyID0gT0s7Ci0gICAgc3RydWN0IGhvc3RlbnQgKmVudCA9IGdldGhvc3RieW5hbWUocmVtb3RlSG9zdCk7Ci0gICAgaWYgKGVudCA9PSBOVUxMKSB7Ci0gICAgICAgIGVyciA9IC1oX2Vycm5vOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlbW90ZUFkZHIuc2luX2FkZHIuc19hZGRyID0gKihpbl9hZGRyX3QgKillbnQtPmhfYWRkcjsKLQotICAgICAgICBpbnQgcmVzID0gY29ubmVjdCgKLSAgICAgICAgICAgICAgICBzLAotICAgICAgICAgICAgICAgIChjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKikmcmVtb3RlQWRkciwKLSAgICAgICAgICAgICAgICBzaXplb2YocmVtb3RlQWRkcikpOwotCi0gICAgICAgIGlmIChyZXMgPCAwKSB7Ci0gICAgICAgICAgICBlcnIgPSAtZXJybm87Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi1zdGF0dXNfdCBBTmV0d29ya1Nlc3Npb246OnNlbmRSZXF1ZXN0KAotICAgICAgICBpbnQzMl90IHNlc3Npb25JRCwgY29uc3Qgdm9pZCAqZGF0YSwgc3NpemVfdCBzaXplLAotICAgICAgICBib29sIHRpbWVWYWxpZCwgaW50NjRfdCB0aW1lVXMpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgc3NpemVfdCBpbmRleCA9IG1TZXNzaW9ucy5pbmRleE9mS2V5KHNlc3Npb25JRCk7Ci0KLSAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIHJldHVybiAtRU5PRU5UOwotICAgIH0KLQotICAgIGNvbnN0IHNwPFNlc3Npb24+IHNlc3Npb24gPSBtU2Vzc2lvbnMudmFsdWVBdChpbmRleCk7Ci0KLSAgICBzdGF0dXNfdCBlcnIgPSBzZXNzaW9uLT5zZW5kUmVxdWVzdChkYXRhLCBzaXplLCB0aW1lVmFsaWQsIHRpbWVVcyk7Ci0KLSAgICBpbnRlcnJ1cHQoKTsKLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLXN0YXR1c190IEFOZXR3b3JrU2Vzc2lvbjo6c3dpdGNoVG9XZWJTb2NrZXRNb2RlKGludDMyX3Qgc2Vzc2lvbklEKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIHNzaXplX3QgaW5kZXggPSBtU2Vzc2lvbnMuaW5kZXhPZktleShzZXNzaW9uSUQpOwotCi0gICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICByZXR1cm4gLUVOT0VOVDsKLSAgICB9Ci0KLSAgICBjb25zdCBzcDxTZXNzaW9uPiBzZXNzaW9uID0gbVNlc3Npb25zLnZhbHVlQXQoaW5kZXgpOwotICAgIHJldHVybiBzZXNzaW9uLT5zd2l0Y2hUb1dlYlNvY2tldE1vZGUoKTsKLX0KLQotdm9pZCBBTmV0d29ya1Nlc3Npb246OmludGVycnVwdCgpIHsKLSAgICBzdGF0aWMgY29uc3QgY2hhciBkdW1teSA9IDA7Ci0KLSAgICBzc2l6ZV90IG47Ci0gICAgZG8gewotICAgICAgICBuID0gd3JpdGUobVBpcGVGZFsxXSwgJmR1bW15LCAxKTsKLSAgICB9IHdoaWxlIChuIDwgMCAmJiBlcnJubyA9PSBFSU5UUik7Ci0KLSAgICBpZiAobiA8IDApIHsKLSAgICAgICAgQUxPR1coIkVycm9yIHdyaXRpbmcgdG8gcGlwZSAoJXMpIiwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICB9Ci19Ci0KLXZvaWQgQU5ldHdvcmtTZXNzaW9uOjp0aHJlYWRMb29wKCkgewotICAgIGZkX3NldCBycywgd3M7Ci0gICAgRkRfWkVSTygmcnMpOwotICAgIEZEX1pFUk8oJndzKTsKLQotICAgIEZEX1NFVChtUGlwZUZkWzBdLCAmcnMpOwotICAgIGludCBtYXhGZCA9IG1QaXBlRmRbMF07Ci0KLSAgICB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU2Vzc2lvbnMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgICAgIGNvbnN0IHNwPFNlc3Npb24+ICZzZXNzaW9uID0gbVNlc3Npb25zLnZhbHVlQXQoaSk7Ci0KLSAgICAgICAgICAgIGludCBzID0gc2Vzc2lvbi0+c29ja2V0KCk7Ci0KLSAgICAgICAgICAgIGlmIChzIDwgMCkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoc2Vzc2lvbi0+d2FudHNUb1JlYWQoKSkgewotICAgICAgICAgICAgICAgIEZEX1NFVChzLCAmcnMpOwotICAgICAgICAgICAgICAgIGlmIChzID4gbWF4RmQpIHsKLSAgICAgICAgICAgICAgICAgICAgbWF4RmQgPSBzOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHNlc3Npb24tPndhbnRzVG9Xcml0ZSgpKSB7Ci0gICAgICAgICAgICAgICAgRkRfU0VUKHMsICZ3cyk7Ci0gICAgICAgICAgICAgICAgaWYgKHMgPiBtYXhGZCkgewotICAgICAgICAgICAgICAgICAgICBtYXhGZCA9IHM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgaW50IHJlcyA9IHNlbGVjdChtYXhGZCArIDEsICZycywgJndzLCBOVUxMLCBOVUxMIC8qIHR2ICovKTsKLQotICAgIGlmIChyZXMgPT0gMCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKHJlcyA8IDApIHsKLSAgICAgICAgaWYgKGVycm5vID09IEVJTlRSKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBBTE9HRSgic2VsZWN0IGZhaWxlZCB3LyBlcnJvciAlZCAoJXMpIiwgZXJybm8sIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoRkRfSVNTRVQobVBpcGVGZFswXSwgJnJzKSkgewotICAgICAgICBjaGFyIGM7Ci0gICAgICAgIHNzaXplX3QgbjsKLSAgICAgICAgZG8gewotICAgICAgICAgICAgbiA9IHJlYWQobVBpcGVGZFswXSwgJmMsIDEpOwotICAgICAgICB9IHdoaWxlIChuIDwgMCAmJiBlcnJubyA9PSBFSU5UUik7Ci0KLSAgICAgICAgaWYgKG4gPCAwKSB7Ci0gICAgICAgICAgICBBTE9HVygiRXJyb3IgcmVhZGluZyBmcm9tIHBpcGUgKCVzKSIsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAtLXJlczsKLSAgICB9Ci0KLSAgICB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICAgICAgTGlzdDxzcDxTZXNzaW9uPiA+IHNlc3Npb25zVG9BZGQ7Ci0KLSAgICAgICAgZm9yIChzaXplX3QgaSA9IG1TZXNzaW9ucy5zaXplKCk7IHJlcyA+IDAgJiYgaSA+IDA7KSB7Ci0gICAgICAgICAgICBpLS07Ci0gICAgICAgICAgICBjb25zdCBzcDxTZXNzaW9uPiAmc2Vzc2lvbiA9IG1TZXNzaW9ucy52YWx1ZUF0KGkpOwotCi0gICAgICAgICAgICBpbnQgcyA9IHNlc3Npb24tPnNvY2tldCgpOwotCi0gICAgICAgICAgICBpZiAocyA8IDApIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKEZEX0lTU0VUKHMsICZycykgfHwgRkRfSVNTRVQocywgJndzKSkgewotICAgICAgICAgICAgICAgIC0tcmVzOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoRkRfSVNTRVQocywgJnJzKSkgewotICAgICAgICAgICAgICAgIGlmIChzZXNzaW9uLT5pc1JUU1BTZXJ2ZXIoKSB8fCBzZXNzaW9uLT5pc1RDUERhdGFncmFtU2VydmVyKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNvY2thZGRyX2luIHJlbW90ZUFkZHI7Ci0gICAgICAgICAgICAgICAgICAgIHNvY2tsZW5fdCByZW1vdGVBZGRyTGVuID0gc2l6ZW9mKHJlbW90ZUFkZHIpOwotCi0gICAgICAgICAgICAgICAgICAgIGludCBjbGllbnRTb2NrZXQgPSBhY2NlcHQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcywgKHN0cnVjdCBzb2NrYWRkciAqKSZyZW1vdGVBZGRyLCAmcmVtb3RlQWRkckxlbik7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGNsaWVudFNvY2tldCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBNYWtlU29ja2V0Tm9uQmxvY2tpbmcoY2xpZW50U29ja2V0KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gbWFrZSBjbGllbnQgc29ja2V0IG5vbiBibG9ja2luZywgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmYWlsZWQgdy8gZXJyb3IgJWQgKCVzKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyLCBzdHJlcnJvcigtZXJyKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9zZShjbGllbnRTb2NrZXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudFNvY2tldCA9IC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbl9hZGRyX3QgYWRkciA9IG50b2hsKHJlbW90ZUFkZHIuc2luX2FkZHIuc19hZGRyKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dJKCJpbmNvbWluZyBjb25uZWN0aW9uIGZyb20gJWQuJWQuJWQuJWQ6JWQgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoc29ja2V0ICVkKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFkZHIgPj4gMjQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhZGRyID4+IDE2KSAmIDB4ZmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFkZHIgPj4gOCkgJiAweGZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHIgJiAweGZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG50b2hzKHJlbW90ZUFkZHIuc2luX3BvcnQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudFNvY2tldCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxTZXNzaW9uPiBjbGllbnRTZXNzaW9uID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFNlc3Npb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5leHRTZXNzaW9uSUQrKywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXNzaW9uOjpDT05ORUNURUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50U29ja2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24tPmdldE5vdGlmaWNhdGlvbk1lc3NhZ2UoKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRTZXNzaW9uLT5zZXRNb2RlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi0+aXNSVFNQU2VydmVyKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFNlc3Npb246Ok1PREVfUlRTUAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogU2Vzc2lvbjo6TU9ERV9EQVRBR1JBTSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uc1RvQWRkLnB1c2hfYmFjayhjbGllbnRTZXNzaW9uKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJhY2NlcHQgcmV0dXJuZWQgZXJyb3IgJWQgKCVzKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJubywgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IHNlc3Npb24tPnJlYWRNb3JlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJyZWFkTW9yZSBvbiBzb2NrZXQgJWQgZmFpbGVkIHcvIGVycm9yICVkICglcykiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcywgZXJyLCBzdHJlcnJvcigtZXJyKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChGRF9JU1NFVChzLCAmd3MpKSB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gc2Vzc2lvbi0+d3JpdGVNb3JlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgICAgICAgICBBTE9HRSgid3JpdGVNb3JlIG9uIHNvY2tldCAlZCBmYWlsZWQgdy8gZXJyb3IgJWQgKCVzKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHMsIGVyciwgc3RyZXJyb3IoLWVycikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHdoaWxlICghc2Vzc2lvbnNUb0FkZC5lbXB0eSgpKSB7Ci0gICAgICAgICAgICBzcDxTZXNzaW9uPiBzZXNzaW9uID0gKnNlc3Npb25zVG9BZGQuYmVnaW4oKTsKLSAgICAgICAgICAgIHNlc3Npb25zVG9BZGQuZXJhc2Uoc2Vzc2lvbnNUb0FkZC5iZWdpbigpKTsKLQotICAgICAgICAgICAgbVNlc3Npb25zLmFkZChzZXNzaW9uLT5zZXNzaW9uSUQoKSwgc2Vzc2lvbik7Ci0KLSAgICAgICAgICAgIEFMT0dJKCJhZGRlZCBjbGllbnRTZXNzaW9uICVkIiwgc2Vzc2lvbi0+c2Vzc2lvbklEKCkpOwotICAgICAgICB9Ci0gICAgfQotfQotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BbmRyb2lkLmJwCmluZGV4IDZiMzg0YzAuLjViNzk2MWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FuZHJvaWQuYnAKQEAgLTU2LDE4ICs1NiwxNSBAQAogICAgICAgICAiQUJ1ZmZlci5jcHAiLAogICAgICAgICAiQURlYnVnLmNwcCIsCiAgICAgICAgICJBSGFuZGxlci5jcHAiLAotICAgICAgICAiQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZS5jcHAiLAogICAgICAgICAiQUxvb3Blci5jcHAiLAogICAgICAgICAiQUxvb3BlclJvc3Rlci5jcHAiLAogICAgICAgICAiQU1lc3NhZ2UuY3BwIiwKLSAgICAgICAgIkFOZXR3b3JrU2Vzc2lvbi5jcHAiLAogICAgICAgICAiQVN0cmluZy5jcHAiLAogICAgICAgICAiQVN0cmluZ1V0aWxzLmNwcCIsCiAgICAgICAgICJCeXRlVXRpbHMuY3BwIiwKICAgICAgICAgIkNvbG9yVXRpbHMuY3BwIiwKICAgICAgICAgIk1lZGlhRGVmcy5jcHAiLAogICAgICAgICAiTWVkaWFLZXlzLmNwcCIsCi0gICAgICAgICJQYXJzZWRNZXNzYWdlLmNwcCIsCiAgICAgICAgICJhdmNfdXRpbHMuY3BwIiwKICAgICAgICAgImJhc2U2NC5jcHAiLAogICAgICAgICAiaGV4ZHVtcC5jcHAiLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9Db2xvclV0aWxzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQ29sb3JVdGlscy5jcHAKaW5kZXggYzRlYWEyNy4uMDcwZTMyNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9Db2xvclV0aWxzLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0NvbG9yVXRpbHMuY3BwCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29rdXAuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0NvbG9yVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUZvcm1hdFByaXYuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC0zNDIsNiArMzQzLDE0IEBACiAgICAgYXNwZWN0cy5tUmFuZ2UgPSBmdWxsUmFuZ2UgPyBDb2xvckFzcGVjdHM6OlJhbmdlRnVsbCA6IENvbG9yQXNwZWN0czo6UmFuZ2VMaW1pdGVkOwogfQogCit2b2lkIENvbG9yVXRpbHM6OmNvbnZlcnRJc29Db2xvckFzcGVjdHNUb1BsYXRmb3JtQXNwZWN0cygKKyAgICAgICAgaW50MzJfdCBwcmltYXJpZXMsIGludDMyX3QgaW50cmFuc2ZlciwgaW50MzJfdCBjb2VmZnMsIGJvb2wgZnVsbFJhbmdlLAorICAgICAgICBpbnQzMl90ICpyYW5nZSwgaW50MzJfdCAqc3RhbmRhcmQsIGludDMyX3QgKm91dHRyYW5zZmVyKSB7CisgICAgQ29sb3JBc3BlY3RzIGFzcGVjdHM7CisgICAgY29udmVydElzb0NvbG9yQXNwZWN0c1RvQ29kZWNBc3BlY3RzKHByaW1hcmllcywgaW50cmFuc2ZlciwgY29lZmZzLCBmdWxsUmFuZ2UsIGFzcGVjdHMpOworICAgIGNvbnZlcnRDb2RlY0NvbG9yQXNwZWN0c1RvUGxhdGZvcm1Bc3BlY3RzKGFzcGVjdHMsIHJhbmdlLCBzdGFuZGFyZCwgb3V0dHJhbnNmZXIpOworfQorCiAvLyBzdGF0aWMKIENvbG9yQXNwZWN0cyBDb2xvclV0aWxzOjp1bnBhY2tUb0NvbG9yQXNwZWN0cyh1aW50MzJfdCBwYWNrZWQpIHsKICAgICBDb2xvckFzcGVjdHMgYXNwZWN0czsKQEAgLTY4NCw2ICs2OTMsMTMgQEAKICAgICAgICAgICAgIHRyYW5zZmVyLCBhc1N0cmluZygoQ29sb3JUcmFuc2Zlcil0cmFuc2ZlcikpOwogfQogCisKKy8vIHN0YXRpYwordm9pZCBDb2xvclV0aWxzOjpzZXRIRFJTdGF0aWNJbmZvSW50b0FNZWRpYUZvcm1hdCgKKyAgICAgICAgY29uc3QgSERSU3RhdGljSW5mbyAmaW5mbywgQU1lZGlhRm9ybWF0ICpmb3JtYXQpIHsKKyAgICBzZXRIRFJTdGF0aWNJbmZvSW50b0Zvcm1hdChpbmZvLCBmb3JtYXQtPm1Gb3JtYXQpOworfQorCiAvLyBzdGF0aWMKIHZvaWQgQ29sb3JVdGlsczo6c2V0SERSU3RhdGljSW5mb0ludG9Gb3JtYXQoCiAgICAgICAgIGNvbnN0IEhEUlN0YXRpY0luZm8gJmluZm8sIHNwPEFNZXNzYWdlPiAmZm9ybWF0KSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5jcHAKaW5kZXggZTVhODVlOS4uZjkzYWU2NSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmNwcApAQCAtNTAsMTIgKzUwLDEzIEBACiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19NU0dTTSA9ICJhdWRpby9nc20iOwogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQUMzID0gImF1ZGlvL2FjMyI7CiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19FQUMzID0gImF1ZGlvL2VhYzMiOworY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQUM0ID0gImF1ZGlvL2FjNCI7CiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19TQ1JBTUJMRUQgPSAiYXVkaW8vc2NyYW1ibGVkIjsKIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FMQUMgPSAiYXVkaW8vYWxhYyI7CiAKIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9NUEVHNCA9ICJ2aWRlby9tcDQiOwogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX1dBViA9ICJhdWRpby94LXdhdiI7Ci1jb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfT0dHID0gImFwcGxpY2F0aW9uL29nZyI7Citjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfT0dHID0gImF1ZGlvL29nZyI7CiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfTUFUUk9TS0EgPSAidmlkZW8veC1tYXRyb3NrYSI7CiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfTVBFRzJUUyA9ICJ2aWRlby9tcDJ0cyI7CiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfQVZJID0gInZpZGVvL2F2aSI7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL1BhcnNlZE1lc3NhZ2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9QYXJzZWRNZXNzYWdlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ5YzlhZC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL1BhcnNlZE1lc3NhZ2UuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzAyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxMiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJQYXJzZWRNZXNzYWdlLmgiCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gc3RhdGljCi1zcDxQYXJzZWRNZXNzYWdlPiBQYXJzZWRNZXNzYWdlOjpQYXJzZSgKLSAgICAgICAgY29uc3QgY2hhciAqZGF0YSwgc2l6ZV90IHNpemUsIGJvb2wgbm9Nb3JlRGF0YSwgc2l6ZV90ICpsZW5ndGgpIHsKLSAgICBzcDxQYXJzZWRNZXNzYWdlPiBtc2cgPSBuZXcgUGFyc2VkTWVzc2FnZTsKLSAgICBzc2l6ZV90IHJlcyA9IG1zZy0+cGFyc2UoZGF0YSwgc2l6ZSwgbm9Nb3JlRGF0YSk7Ci0KLSAgICBpZiAocmVzIDwgMCkgewotICAgICAgICAqbGVuZ3RoID0gMDsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgKmxlbmd0aCA9IHJlczsKLSAgICByZXR1cm4gbXNnOwotfQotCi1QYXJzZWRNZXNzYWdlOjpQYXJzZWRNZXNzYWdlKCkgewotfQotCi1QYXJzZWRNZXNzYWdlOjp+UGFyc2VkTWVzc2FnZSgpIHsKLX0KLQotYm9vbCBQYXJzZWRNZXNzYWdlOjpmaW5kU3RyaW5nKGNvbnN0IGNoYXIgKm5hbWUsIEFTdHJpbmcgKnZhbHVlKSBjb25zdCB7Ci0gICAgQVN0cmluZyBrZXkgPSBuYW1lOwotICAgIGtleS50b2xvd2VyKCk7Ci0KLSAgICBzc2l6ZV90IGluZGV4ID0gbURpY3QuaW5kZXhPZktleShrZXkpOwotCi0gICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICB2YWx1ZS0+Y2xlYXIoKTsKLQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgKnZhbHVlID0gbURpY3QudmFsdWVBdChpbmRleCk7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgUGFyc2VkTWVzc2FnZTo6ZmluZEludDMyKGNvbnN0IGNoYXIgKm5hbWUsIGludDMyX3QgKnZhbHVlKSBjb25zdCB7Ci0gICAgQVN0cmluZyBzdHJpbmdWYWx1ZTsKLQotICAgIGlmICghZmluZFN0cmluZyhuYW1lLCAmc3RyaW5nVmFsdWUpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBjaGFyICplbmQ7Ci0gICAgKnZhbHVlID0gc3RydG9sKHN0cmluZ1ZhbHVlLmNfc3RyKCksICZlbmQsIDEwKTsKLQotICAgIGlmIChlbmQgPT0gc3RyaW5nVmFsdWUuY19zdHIoKSB8fCAqZW5kICE9ICdcMCcpIHsKLSAgICAgICAgKnZhbHVlID0gMDsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotfQotCi1jb25zdCBjaGFyICpQYXJzZWRNZXNzYWdlOjpnZXRDb250ZW50KCkgY29uc3QgewotICAgIHJldHVybiBtQ29udGVudC5jX3N0cigpOwotfQotCi1zc2l6ZV90IFBhcnNlZE1lc3NhZ2U6OnBhcnNlKGNvbnN0IGNoYXIgKmRhdGEsIHNpemVfdCBzaXplLCBib29sIG5vTW9yZURhdGEpIHsKLSAgICBpZiAoc2l6ZSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBzc2l6ZV90IGxhc3REaWN0SW5kZXggPSAtMTsKLQotICAgIHNpemVfdCBvZmZzZXQgPSAwOwotICAgIGJvb2wgaGVhZGVyc0NvbXBsZXRlID0gZmFsc2U7Ci0gICAgd2hpbGUgKG9mZnNldCA8IHNpemUpIHsKLSAgICAgICAgc2l6ZV90IGxpbmVFbmRPZmZzZXQgPSBvZmZzZXQ7Ci0gICAgICAgIHdoaWxlIChsaW5lRW5kT2Zmc2V0ICsgMSA8IHNpemUKLSAgICAgICAgICAgICAgICAmJiAoZGF0YVtsaW5lRW5kT2Zmc2V0XSAhPSAnXHInCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCBkYXRhW2xpbmVFbmRPZmZzZXQgKyAxXSAhPSAnXG4nKSkgewotICAgICAgICAgICAgKytsaW5lRW5kT2Zmc2V0OwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGxpbmVFbmRPZmZzZXQgKyAxID49IHNpemUpIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotCi0gICAgICAgIEFTdHJpbmcgbGluZSgmZGF0YVtvZmZzZXRdLCBsaW5lRW5kT2Zmc2V0IC0gb2Zmc2V0KTsKLQotICAgICAgICBpZiAob2Zmc2V0ID09IDApIHsKLSAgICAgICAgICAgIC8vIFNwZWNpYWwgaGFuZGxpbmcgZm9yIHRoZSByZXF1ZXN0L3N0YXR1cyBsaW5lLgotCi0gICAgICAgICAgICBtRGljdC5hZGQoQVN0cmluZygiXyIpLCBsaW5lKTsKLSAgICAgICAgICAgIG9mZnNldCA9IGxpbmVFbmRPZmZzZXQgKyAyOwotCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChsaW5lRW5kT2Zmc2V0ID09IG9mZnNldCkgewotICAgICAgICAgICAgLy8gQW4gZW1wdHkgbGluZSBzZXBhcmF0ZXMgaGVhZGVycyBmcm9tIGJvZHkuCi0gICAgICAgICAgICBoZWFkZXJzQ29tcGxldGUgPSB0cnVlOwotICAgICAgICAgICAgb2Zmc2V0ICs9IDI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChsaW5lLmNfc3RyKClbMF0gPT0gJyAnIHx8IGxpbmUuY19zdHIoKVswXSA9PSAnXHQnKSB7Ci0gICAgICAgICAgICAvLyBTdXBwb3J0IGZvciBmb2xkZWQgaGVhZGVyIHZhbHVlcy4KLQotICAgICAgICAgICAgaWYgKGxhc3REaWN0SW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSBpdCdzIG1hbGZvcm1lZCBzaW5jZSB0aGUgZmlyc3QgaGVhZGVyIGxpbmUKLSAgICAgICAgICAgICAgICAvLyBjYW5ub3QgY29udGludWUgYW55dGhpbmcuLi4KLQotICAgICAgICAgICAgICAgIEFTdHJpbmcgJnZhbHVlID0gbURpY3QuZWRpdFZhbHVlQXQobGFzdERpY3RJbmRleCk7Ci0gICAgICAgICAgICAgICAgdmFsdWUuYXBwZW5kKGxpbmUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBvZmZzZXQgPSBsaW5lRW5kT2Zmc2V0ICsgMjsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgc3NpemVfdCBjb2xvblBvcyA9IGxpbmUuZmluZCgiOiIpOwotICAgICAgICBpZiAoY29sb25Qb3MgPj0gMCkgewotICAgICAgICAgICAgQVN0cmluZyBrZXkobGluZSwgMCwgY29sb25Qb3MpOwotICAgICAgICAgICAga2V5LnRyaW0oKTsKLSAgICAgICAgICAgIGtleS50b2xvd2VyKCk7Ci0KLSAgICAgICAgICAgIGxpbmUuZXJhc2UoMCwgY29sb25Qb3MgKyAxKTsKLQotICAgICAgICAgICAgbGFzdERpY3RJbmRleCA9IG1EaWN0LmFkZChrZXksIGxpbmUpOwotICAgICAgICB9Ci0KLSAgICAgICAgb2Zmc2V0ID0gbGluZUVuZE9mZnNldCArIDI7Ci0gICAgfQotCi0gICAgaWYgKCFoZWFkZXJzQ29tcGxldGUgJiYgKCFub01vcmVEYXRhIHx8IG9mZnNldCA9PSAwKSkgewotICAgICAgICAvLyBXZSBlaXRoZXIgc2F3IHRoZSBlbXB0eSBsaW5lIHNlcGFyYXRpbmcgaGVhZGVycyBmcm9tIGJvZHkKLSAgICAgICAgLy8gb3Igd2Ugc2F3IGF0IGxlYXN0IHRoZSBzdGF0dXMgbGluZSBhbmQga25vdyB0aGF0IG5vIG1vcmUgZGF0YQotICAgICAgICAvLyBpcyBnb2luZyB0byBmb2xsb3cuCi0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1EaWN0LnNpemUoKTsgKytpKSB7Ci0gICAgICAgIG1EaWN0LmVkaXRWYWx1ZUF0KGkpLnRyaW0oKTsKLSAgICB9Ci0KLSAgICBpbnQzMl90IGNvbnRlbnRMZW5ndGg7Ci0gICAgaWYgKCFmaW5kSW50MzIoImNvbnRlbnQtbGVuZ3RoIiwgJmNvbnRlbnRMZW5ndGgpIHx8IGNvbnRlbnRMZW5ndGggPCAwKSB7Ci0gICAgICAgIGNvbnRlbnRMZW5ndGggPSAwOwotICAgIH0KLQotICAgIHNpemVfdCB0b3RhbExlbmd0aCA9IG9mZnNldCArIGNvbnRlbnRMZW5ndGg7Ci0KLSAgICBpZiAoc2l6ZSA8IHRvdGFsTGVuZ3RoKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBtQ29udGVudC5zZXRUbygmZGF0YVtvZmZzZXRdLCBjb250ZW50TGVuZ3RoKTsKLQotICAgIHJldHVybiB0b3RhbExlbmd0aDsKLX0KLQotYm9vbCBQYXJzZWRNZXNzYWdlOjpnZXRSZXF1ZXN0RmllbGQoc2l6ZV90IGluZGV4LCBBU3RyaW5nICpmaWVsZCkgY29uc3QgewotICAgIEFTdHJpbmcgbGluZTsKLSAgICBDSEVDSyhmaW5kU3RyaW5nKCJfIiwgJmxpbmUpKTsKLQotICAgIHNpemVfdCBwcmV2T2Zmc2V0ID0gMDsKLSAgICBzaXplX3Qgb2Zmc2V0ID0gMDsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8PSBpbmRleDsgKytpKSB7Ci0gICAgICAgIGlmIChvZmZzZXQgPj0gbGluZS5zaXplKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHNzaXplX3Qgc3BhY2VQb3MgPSBsaW5lLmZpbmQoIiAiLCBvZmZzZXQpOwotCi0gICAgICAgIGlmIChzcGFjZVBvcyA8IDApIHsKLSAgICAgICAgICAgIHNwYWNlUG9zID0gbGluZS5zaXplKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcmV2T2Zmc2V0ID0gb2Zmc2V0OwotICAgICAgICBvZmZzZXQgPSBzcGFjZVBvcyArIDE7Ci0gICAgfQotCi0gICAgZmllbGQtPnNldFRvKGxpbmUsIHByZXZPZmZzZXQsIG9mZnNldCAtIHByZXZPZmZzZXQgLSAxKTsKLQotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIFBhcnNlZE1lc3NhZ2U6OmdldFN0YXR1c0NvZGUoaW50MzJfdCAqc3RhdHVzQ29kZSkgY29uc3QgewotICAgIEFTdHJpbmcgc3RhdHVzQ29kZVN0cmluZzsKLSAgICBpZiAoIWdldFJlcXVlc3RGaWVsZCgxLCAmc3RhdHVzQ29kZVN0cmluZykpIHsKLSAgICAgICAgKnN0YXR1c0NvZGUgPSAwOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgY2hhciAqZW5kOwotICAgICpzdGF0dXNDb2RlID0gc3RydG9sKHN0YXR1c0NvZGVTdHJpbmcuY19zdHIoKSwgJmVuZCwgMTApOwotCi0gICAgaWYgKCplbmQgIT0gJ1wwJyB8fCBlbmQgPT0gc3RhdHVzQ29kZVN0cmluZy5jX3N0cigpCi0gICAgICAgICAgICB8fCAoKnN0YXR1c0NvZGUpIDwgMTAwIHx8ICgqc3RhdHVzQ29kZSkgPiA5OTkpIHsKLSAgICAgICAgKnN0YXR1c0NvZGUgPSAwOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLUFTdHJpbmcgUGFyc2VkTWVzc2FnZTo6ZGVidWdTdHJpbmcoKSBjb25zdCB7Ci0gICAgQVN0cmluZyBsaW5lOwotICAgIENIRUNLKGZpbmRTdHJpbmcoIl8iLCAmbGluZSkpOwotCi0gICAgbGluZS5hcHBlbmQoIlxuIik7Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1EaWN0LnNpemUoKTsgKytpKSB7Ci0gICAgICAgIGNvbnN0IEFTdHJpbmcgJmtleSA9IG1EaWN0LmtleUF0KGkpOwotICAgICAgICBjb25zdCBBU3RyaW5nICZ2YWx1ZSA9IG1EaWN0LnZhbHVlQXQoaSk7Ci0KLSAgICAgICAgaWYgKGtleSA9PSBBU3RyaW5nKCJfIikpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgbGluZS5hcHBlbmQoa2V5KTsKLSAgICAgICAgbGluZS5hcHBlbmQoIjogIik7Ci0gICAgICAgIGxpbmUuYXBwZW5kKHZhbHVlKTsKLSAgICAgICAgbGluZS5hcHBlbmQoIlxuIik7Ci0gICAgfQotCi0gICAgbGluZS5hcHBlbmQoIlxuIik7Ci0gICAgbGluZS5hcHBlbmQobUNvbnRlbnQpOwotCi0gICAgcmV0dXJuIGxpbmU7Ci19Ci0KLS8vIHN0YXRpYwotYm9vbCBQYXJzZWRNZXNzYWdlOjpHZXRBdHRyaWJ1dGUoCi0gICAgICAgIGNvbnN0IGNoYXIgKnMsIGNvbnN0IGNoYXIgKmtleSwgQVN0cmluZyAqdmFsdWUpIHsKLSAgICB2YWx1ZS0+Y2xlYXIoKTsKLQotICAgIHNpemVfdCBrZXlMZW4gPSBzdHJsZW4oa2V5KTsKLQotICAgIGZvciAoOzspIHsKLSAgICAgICAgd2hpbGUgKGlzc3BhY2UoKnMpKSB7Ci0gICAgICAgICAgICArK3M7Ci0gICAgICAgIH0KLQotICAgICAgICBjb25zdCBjaGFyICpjb2xvblBvcyA9IHN0cmNocihzLCAnOycpOwotCi0gICAgICAgIHNpemVfdCBsZW4gPQotICAgICAgICAgICAgKGNvbG9uUG9zID09IE5VTEwpID8gc3RybGVuKHMpIDogY29sb25Qb3MgLSBzOwotCi0gICAgICAgIGlmIChsZW4gPj0ga2V5TGVuICsgMSAmJiBzW2tleUxlbl0gPT0gJz0nICYmICFzdHJuY21wKHMsIGtleSwga2V5TGVuKSkgewotICAgICAgICAgICAgdmFsdWUtPnNldFRvKCZzW2tleUxlbiArIDFdLCBsZW4gLSBrZXlMZW4gLSAxKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGNvbG9uUG9zID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHMgPSBjb2xvblBvcyArIDE7Ci0gICAgfQotfQotCi0vLyBzdGF0aWMKLWJvb2wgUGFyc2VkTWVzc2FnZTo6R2V0SW50MzJBdHRyaWJ1dGUoCi0gICAgICAgIGNvbnN0IGNoYXIgKnMsIGNvbnN0IGNoYXIgKmtleSwgaW50MzJfdCAqdmFsdWUpIHsKLSAgICBBU3RyaW5nIHN0cmluZ1ZhbHVlOwotICAgIGlmICghR2V0QXR0cmlidXRlKHMsIGtleSwgJnN0cmluZ1ZhbHVlKSkgewotICAgICAgICAqdmFsdWUgPSAwOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgY2hhciAqZW5kOwotICAgICp2YWx1ZSA9IHN0cnRvbChzdHJpbmdWYWx1ZS5jX3N0cigpLCAmZW5kLCAxMCk7Ci0KLSAgICBpZiAoZW5kID09IHN0cmluZ1ZhbHVlLmNfc3RyKCkgfHwgKmVuZCAhPSAnXDAnKSB7Ci0gICAgICAgICp2YWx1ZSA9IDA7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9iYXNlNjQuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9iYXNlNjQuY3BwCmluZGV4IDhmMzI1ODIuLjgzNGI4OGYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYmFzZTY0LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2Jhc2U2NC5jcHAKQEAgLTI4LDE0ICsyOCwzMSBAQAogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKKyAgICBzaXplX3QgYnVmU2l6ZSA9IG4gLyA0ICogMzsKKyAgICBzcDxBQnVmZmVyPiBidWYgPSBuZXcgQUJ1ZmZlcihidWZTaXplKTsKKworICAgIGlmIChkZWNvZGVCYXNlNjQoYnVmLT5kYXRhKCksICZidWZTaXplLCBzLmNfc3RyKCkpKSB7CisgICAgICAgIGJ1Zi0+c2V0UmFuZ2UoMCwgYnVmU2l6ZSk7CisgICAgICAgIHJldHVybiBidWY7CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCitib29sIGRlY29kZUJhc2U2NCh1aW50OF90ICpvdXQsIHNpemVfdCAqaW5PdXRCdWZTaXplLCBjb25zdCBjaGFyKiBzKSB7CisgICAgc2l6ZV90IG4gPSBzdHJsZW4ocyk7CisKKyAgICBpZiAoKG4gJSA0KSAhPSAwKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKICAgICBzaXplX3QgcGFkZGluZyA9IDA7Ci0gICAgaWYgKG4gPj0gMSAmJiBzLmNfc3RyKClbbiAtIDFdID09ICc9JykgeworICAgIGlmIChuID49IDEgJiYgc1tuIC0gMV0gPT0gJz0nKSB7CiAgICAgICAgIHBhZGRpbmcgPSAxOwogCi0gICAgICAgIGlmIChuID49IDIgJiYgcy5jX3N0cigpW24gLSAyXSA9PSAnPScpIHsKKyAgICAgICAgaWYgKG4gPj0gMiAmJiBzW24gLSAyXSA9PSAnPScpIHsKICAgICAgICAgICAgIHBhZGRpbmcgPSAyOwogCi0gICAgICAgICAgICBpZiAobiA+PSAzICYmIHMuY19zdHIoKVtuIC0gM10gPT0gJz0nKSB7CisgICAgICAgICAgICBpZiAobiA+PSAzICYmIHNbbiAtIDNdID09ICc9JykgewogICAgICAgICAgICAgICAgIHBhZGRpbmcgPSAzOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC00NSwxNSArNjIsMTMgQEAKICAgICAvLyBhbHJlYWR5IG1hZGUgc3VyZSB0aGF0IG4gJSA0ID09IDAuCiAgICAgc2l6ZV90IG91dExlbiA9IChuIC8gNCkgKiAzIC0gcGFkZGluZzsKIAotICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9IG5ldyBBQnVmZmVyKG91dExlbik7Ci0gICAgdWludDhfdCAqb3V0ID0gYnVmZmVyLT5kYXRhKCk7Ci0gICAgaWYgKG91dCA9PSBOVUxMIHx8IGJ1ZmZlci0+c2l6ZSgpIDwgb3V0TGVuKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChvdXQgPT0gTlVMTCB8fCAqaW5PdXRCdWZTaXplIDwgb3V0TGVuKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgc2l6ZV90IGogPSAwOwogICAgIHVpbnQzMl90IGFjY3VtID0gMDsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG47ICsraSkgewotICAgICAgICBjaGFyIGMgPSBzLmNfc3RyKClbaV07CisgICAgICAgIGNoYXIgYyA9IHNbaV07CiAgICAgICAgIHVuc2lnbmVkIHZhbHVlOwogICAgICAgICBpZiAoYyA+PSAnQScgJiYgYyA8PSAnWicpIHsKICAgICAgICAgICAgIHZhbHVlID0gYyAtICdBJzsKQEAgLTY2LDEwICs4MSwxMCBAQAogICAgICAgICB9IGVsc2UgaWYgKGMgPT0gJy8nIHx8IGMgPT0gJ18nKSB7CiAgICAgICAgICAgICB2YWx1ZSA9IDYzOwogICAgICAgICB9IGVsc2UgaWYgKGMgIT0gJz0nKSB7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGlmIChpIDwgbiAtIHBhZGRpbmcpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHZhbHVlID0gMDsKQEAgLTg2LDcgKzEwMSw4IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICByZXR1cm4gYnVmZmVyOworICAgICppbk91dEJ1ZlNpemUgPSBqOworICAgIHJldHVybiB0cnVlOwogfQogCiBzdGF0aWMgY2hhciBlbmNvZGU2Qml0KHVuc2lnbmVkIHgpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FOZXR3b3JrU2Vzc2lvbi5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU5ldHdvcmtTZXNzaW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkM2ViYWEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU5ldHdvcmtTZXNzaW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDEyLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBX05FVFdPUktfU0VTU0lPTl9IXwotCi0jZGVmaW5lIEFfTkVUV09SS19TRVNTSU9OX0hfCi0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvVGhyZWFkLmg+Ci0KLSNpbmNsdWRlIDxuZXRpbmV0L2luLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RydWN0IEFNZXNzYWdlOwotCi0vLyBIZWxwZXIgY2xhc3MgdG8gbWFuYWdlIGEgbnVtYmVyIG9mIGxpdmUgc29ja2V0cyAoZGF0YWdyYW0gYW5kIHN0cmVhbS1iYXNlZCkKLS8vIG9uIGEgc2luZ2xlIHRocmVhZC4gQ2xpZW50cyBhcmUgbm90aWZpZWQgYWJvdXQgYWN0aXZpdHkgdGhyb3VnaCBBTWVzc2FnZXMuCi1zdHJ1Y3QgQU5ldHdvcmtTZXNzaW9uIDogcHVibGljIFJlZkJhc2UgewotICAgIEFOZXR3b3JrU2Vzc2lvbigpOwotCi0gICAgc3RhdHVzX3Qgc3RhcnQoKTsKLSAgICBzdGF0dXNfdCBzdG9wKCk7Ci0KLSAgICBzdGF0dXNfdCBjcmVhdGVSVFNQQ2xpZW50KAotICAgICAgICAgICAgY29uc3QgY2hhciAqaG9zdCwgdW5zaWduZWQgcG9ydCwgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksCi0gICAgICAgICAgICBpbnQzMl90ICpzZXNzaW9uSUQpOwotCi0gICAgc3RhdHVzX3QgY3JlYXRlUlRTUFNlcnZlcigKLSAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBpbl9hZGRyICZhZGRyLCB1bnNpZ25lZCBwb3J0LAotICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksIGludDMyX3QgKnNlc3Npb25JRCk7Ci0KLSAgICBzdGF0dXNfdCBjcmVhdGVVRFBTZXNzaW9uKAotICAgICAgICAgICAgdW5zaWduZWQgbG9jYWxQb3J0LCBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwgaW50MzJfdCAqc2Vzc2lvbklEKTsKLQotICAgIHN0YXR1c190IGNyZWF0ZVVEUFNlc3Npb24oCi0gICAgICAgICAgICB1bnNpZ25lZCBsb2NhbFBvcnQsCi0gICAgICAgICAgICBjb25zdCBjaGFyICpyZW1vdGVIb3N0LAotICAgICAgICAgICAgdW5zaWduZWQgcmVtb3RlUG9ydCwKLSAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LAotICAgICAgICAgICAgaW50MzJfdCAqc2Vzc2lvbklEKTsKLQotICAgIHN0YXR1c190IGNvbm5lY3RVRFBTZXNzaW9uKAotICAgICAgICAgICAgaW50MzJfdCBzZXNzaW9uSUQsIGNvbnN0IGNoYXIgKnJlbW90ZUhvc3QsIHVuc2lnbmVkIHJlbW90ZVBvcnQpOwotCi0gICAgLy8gcGFzc2l2ZQotICAgIHN0YXR1c190IGNyZWF0ZVRDUERhdGFncmFtU2Vzc2lvbigKLSAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBpbl9hZGRyICZhZGRyLCB1bnNpZ25lZCBwb3J0LAotICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksIGludDMyX3QgKnNlc3Npb25JRCk7Ci0KLSAgICAvLyBhY3RpdmUKLSAgICBzdGF0dXNfdCBjcmVhdGVUQ1BEYXRhZ3JhbVNlc3Npb24oCi0gICAgICAgICAgICB1bnNpZ25lZCBsb2NhbFBvcnQsCi0gICAgICAgICAgICBjb25zdCBjaGFyICpyZW1vdGVIb3N0LAotICAgICAgICAgICAgdW5zaWduZWQgcmVtb3RlUG9ydCwKLSAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LAotICAgICAgICAgICAgaW50MzJfdCAqc2Vzc2lvbklEKTsKLQotICAgIHN0YXR1c190IGRlc3Ryb3lTZXNzaW9uKGludDMyX3Qgc2Vzc2lvbklEKTsKLQotICAgIHN0YXR1c190IHNlbmRSZXF1ZXN0KAotICAgICAgICAgICAgaW50MzJfdCBzZXNzaW9uSUQsIGNvbnN0IHZvaWQgKmRhdGEsIHNzaXplX3Qgc2l6ZSA9IC0xLAotICAgICAgICAgICAgYm9vbCB0aW1lVmFsaWQgPSBmYWxzZSwgaW50NjRfdCB0aW1lVXMgPSAtMWxsKTsKLQotICAgIHN0YXR1c190IHN3aXRjaFRvV2ViU29ja2V0TW9kZShpbnQzMl90IHNlc3Npb25JRCk7Ci0KLSAgICBlbnVtIE5vdGlmaWNhdGlvblJlYXNvbiB7Ci0gICAgICAgIGtXaGF0RXJyb3IsCi0gICAgICAgIGtXaGF0Q29ubmVjdGVkLAotICAgICAgICBrV2hhdENsaWVudENvbm5lY3RlZCwKLSAgICAgICAga1doYXREYXRhLAotICAgICAgICBrV2hhdERhdGFncmFtLAotICAgICAgICBrV2hhdEJpbmFyeURhdGEsCi0gICAgICAgIGtXaGF0V2ViU29ja2V0TWVzc2FnZSwKLSAgICAgICAga1doYXROZXR3b3JrU3RhbGwsCi0gICAgfTsKLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgfkFOZXR3b3JrU2Vzc2lvbigpOwotCi1wcml2YXRlOgotICAgIHN0cnVjdCBOZXR3b3JrVGhyZWFkOwotICAgIHN0cnVjdCBTZXNzaW9uOwotCi0gICAgTXV0ZXggbUxvY2s7Ci0gICAgc3A8VGhyZWFkPiBtVGhyZWFkOwotCi0gICAgaW50MzJfdCBtTmV4dFNlc3Npb25JRDsKLQotICAgIGludCBtUGlwZUZkWzJdOwotCi0gICAgS2V5ZWRWZWN0b3I8aW50MzJfdCwgc3A8U2Vzc2lvbj4gPiBtU2Vzc2lvbnM7Ci0KLSAgICBlbnVtIE1vZGUgewotICAgICAgICBrTW9kZUNyZWF0ZVVEUFNlc3Npb24sCi0gICAgICAgIGtNb2RlQ3JlYXRlVENQRGF0YWdyYW1TZXNzaW9uUGFzc2l2ZSwKLSAgICAgICAga01vZGVDcmVhdGVUQ1BEYXRhZ3JhbVNlc3Npb25BY3RpdmUsCi0gICAgICAgIGtNb2RlQ3JlYXRlUlRTUFNlcnZlciwKLSAgICAgICAga01vZGVDcmVhdGVSVFNQQ2xpZW50LAotICAgIH07Ci0gICAgc3RhdHVzX3QgY3JlYXRlQ2xpZW50T3JTZXJ2ZXIoCi0gICAgICAgICAgICBNb2RlIG1vZGUsCi0gICAgICAgICAgICBjb25zdCBzdHJ1Y3QgaW5fYWRkciAqYWRkciwKLSAgICAgICAgICAgIHVuc2lnbmVkIHBvcnQsCi0gICAgICAgICAgICBjb25zdCBjaGFyICpyZW1vdGVIb3N0LAotICAgICAgICAgICAgdW5zaWduZWQgcmVtb3RlUG9ydCwKLSAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LAotICAgICAgICAgICAgaW50MzJfdCAqc2Vzc2lvbklEKTsKLQotICAgIHZvaWQgdGhyZWFkTG9vcCgpOwotICAgIHZvaWQgaW50ZXJydXB0KCk7Ci0KLSAgICBzdGF0aWMgc3RhdHVzX3QgTWFrZVNvY2tldE5vbkJsb2NraW5nKGludCBzKTsKLQotICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEFOZXR3b3JrU2Vzc2lvbik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIEFfTkVUV09SS19TRVNTSU9OX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9Db2xvclV0aWxzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9Db2xvclV0aWxzLmgKaW5kZXggZDZjNzY4ZC4uY2QwYWYyYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQ29sb3JVdGlscy5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0NvbG9yVXRpbHMuaApAQCAtMjcsNiArMjcsOCBAQAogI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL1ZpZGVvQVBJLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2dyYXBoaWNzLmg+CiAKK3N0cnVjdCBBTWVkaWFGb3JtYXQ7CisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RydWN0IENvbG9yVXRpbHMgewpAQCAtMTM1LDYgKzEzNyw5IEBACiAgICAgc3RhdGljIHZvaWQgY29udmVydElzb0NvbG9yQXNwZWN0c1RvQ29kZWNBc3BlY3RzKAogICAgICAgICAgICAgaW50MzJfdCBwcmltYXJpZXMsIGludDMyX3QgdHJhbnNmZXIsIGludDMyX3QgY29lZmZzLCBib29sIGZ1bGxSYW5nZSwKICAgICAgICAgICAgIENvbG9yQXNwZWN0cyAmYXNwZWN0cyk7CisgICAgc3RhdGljIHZvaWQgY29udmVydElzb0NvbG9yQXNwZWN0c1RvUGxhdGZvcm1Bc3BlY3RzKAorICAgICAgICBpbnQzMl90IHByaW1hcmllcywgaW50MzJfdCBpc290cmFuc2ZlciwgaW50MzJfdCBjb2VmZnMsIGJvb2wgZnVsbFJhbmdlLAorICAgICAgICBpbnQzMl90ICpyYW5nZSwgaW50MzJfdCAqc3RhbmRhcmQsIGludDMyX3QgKnRyYW5zZmVyKTsKIAogICAgIC8vIHVucGFjayBhIHVpbnQzMl90IHRvIGEgZnVsbCBDb2xvckFzcGVjdHMgc3RydWN0CiAgICAgc3RhdGljIENvbG9yQXNwZWN0cyB1bnBhY2tUb0NvbG9yQXNwZWN0cyh1aW50MzJfdCBwYWNrZWQpOwpAQCAtMTgwLDYgKzE4NSw4IEBACiAKICAgICAvLyB3cml0ZXMgfGluZm98IGludG8gZm9ybWF0LgogICAgIHN0YXRpYyB2b2lkIHNldEhEUlN0YXRpY0luZm9JbnRvRm9ybWF0KGNvbnN0IEhEUlN0YXRpY0luZm8gJmluZm8sIHNwPEFNZXNzYWdlPiAmZm9ybWF0KTsKKyAgICAvLyB3cml0ZXMgfGluZm98IGludG8gZm9ybWF0LgorICAgIHN0YXRpYyB2b2lkIHNldEhEUlN0YXRpY0luZm9JbnRvQU1lZGlhRm9ybWF0KGNvbnN0IEhEUlN0YXRpY0luZm8gJmluZm8sIEFNZWRpYUZvcm1hdCAqZm9ybWF0KTsKIH07CiAKIGlubGluZSBzdGF0aWMgY29uc3QgY2hhciAqYXNTdHJpbmcoYW5kcm9pZDo6Q29sb3JVdGlsczo6Q29sb3JTdGFuZGFyZCBpLCBjb25zdCBjaGFyICpkZWYgPSAiPz8iKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oCmluZGV4IDU4NzU4YmMuLjUyMzM3OGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oCkBAIC01Miw2ICs1Miw3IEBACiBleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fTVNHU007CiBleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQUMzOwogZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0VBQzM7CitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQUM0OwogZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX1NDUkFNQkxFRDsKIGV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19BTEFDOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9QYXJzZWRNZXNzYWdlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9QYXJzZWRNZXNzYWdlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkNDNhOTMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vUGFyc2VkTWVzc2FnZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDEyLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuaD4KLSNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyBFbmNhcHN1bGF0ZXMgYW4gIkhUVFAvUlRTUCBzdHlsZSIgcmVzcG9uc2UsIGkuZS4gYSBzdGF0dXMgbGluZSwKLS8vIGtleS92YWx1ZSBwYWlycyBtYWtpbmcgdXAgdGhlIGhlYWRlcnMgYW5kIGFuIG9wdGlvbmFsIGJvZHkvY29udGVudC4KLXN0cnVjdCBQYXJzZWRNZXNzYWdlIDogcHVibGljIFJlZkJhc2UgewotICAgIHN0YXRpYyBzcDxQYXJzZWRNZXNzYWdlPiBQYXJzZSgKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRhdGEsIHNpemVfdCBzaXplLCBib29sIG5vTW9yZURhdGEsIHNpemVfdCAqbGVuZ3RoKTsKLQotICAgIGJvb2wgZmluZFN0cmluZyhjb25zdCBjaGFyICpuYW1lLCBBU3RyaW5nICp2YWx1ZSkgY29uc3Q7Ci0gICAgYm9vbCBmaW5kSW50MzIoY29uc3QgY2hhciAqbmFtZSwgaW50MzJfdCAqdmFsdWUpIGNvbnN0OwotCi0gICAgY29uc3QgY2hhciAqZ2V0Q29udGVudCgpIGNvbnN0OwotCi0gICAgYm9vbCBnZXRSZXF1ZXN0RmllbGQoc2l6ZV90IGluZGV4LCBBU3RyaW5nICpmaWVsZCkgY29uc3Q7Ci0gICAgYm9vbCBnZXRTdGF0dXNDb2RlKGludDMyX3QgKnN0YXR1c0NvZGUpIGNvbnN0OwotCi0gICAgQVN0cmluZyBkZWJ1Z1N0cmluZygpIGNvbnN0OwotCi0gICAgc3RhdGljIGJvb2wgR2V0QXR0cmlidXRlKGNvbnN0IGNoYXIgKnMsIGNvbnN0IGNoYXIgKmtleSwgQVN0cmluZyAqdmFsdWUpOwotCi0gICAgc3RhdGljIGJvb2wgR2V0SW50MzJBdHRyaWJ1dGUoCi0gICAgICAgICAgICBjb25zdCBjaGFyICpzLCBjb25zdCBjaGFyICprZXksIGludDMyX3QgKnZhbHVlKTsKLQotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB+UGFyc2VkTWVzc2FnZSgpOwotCi1wcml2YXRlOgotICAgIEtleWVkVmVjdG9yPEFTdHJpbmcsIEFTdHJpbmc+IG1EaWN0OwotICAgIEFTdHJpbmcgbUNvbnRlbnQ7Ci0KLSAgICBQYXJzZWRNZXNzYWdlKCk7Ci0KLSAgICBzc2l6ZV90IHBhcnNlKGNvbnN0IGNoYXIgKmRhdGEsIHNpemVfdCBzaXplLCBib29sIG5vTW9yZURhdGEpOwotCi0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoUGFyc2VkTWVzc2FnZSk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYmFzZTY0LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9iYXNlNjQuaAppbmRleCBhYmM5NWUwLi42MGZiOWZmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9iYXNlNjQuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9iYXNlNjQuaApAQCAtMjYsNiArMjYsOSBAQAogc3RydWN0IEFTdHJpbmc7CiAKIHNwPEFCdWZmZXI+IGRlY29kZUJhc2U2NChjb25zdCBBU3RyaW5nICZzKTsKKworYm9vbCBkZWNvZGVCYXNlNjQodWludDhfdCAqb3V0LCBzaXplX3QgKmluT3V0QnVmU2l6ZSwgY29uc3QgY2hhciogcyk7CisKIHZvaWQgZW5jb2RlQmFzZTY0KGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplLCBBU3RyaW5nICpvdXQpOwogCiB2b2lkIGVuY29kZUJhc2U2NFVybChjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSwgQVN0cmluZyAqb3V0KTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHAvQ2xlYXJNZWRpYUhUVFAuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cC9DbGVhck1lZGlhSFRUUC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU1N2M4YQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHAvQ2xlYXJNZWRpYUhUVFAuY3BwCkBAIC0wLDAgKzEsMTg0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDbGVhck1lZGlhSFRUUCIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0NsZWFyTWVkaWFIVFRQLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUhUVFBDb25uZWN0aW9uLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworQ2xlYXJNZWRpYUhUVFA6OkNsZWFyTWVkaWFIVFRQKGNvbnN0IHNwPE1lZGlhSFRUUENvbm5lY3Rpb24+ICZjb25uKQorICAgIDogbUluaXRDaGVjaygoY29ubiAhPSBOVUxMKSA/IE9LIDogTk9fSU5JVCksCisgICAgICBtSFRUUENvbm5lY3Rpb24oY29ubiksCisgICAgICBtQ2FjaGVkU2l6ZVZhbGlkKGZhbHNlKSwKKyAgICAgIG1DYWNoZWRTaXplKDBsbCkgeworfQorCitDbGVhck1lZGlhSFRUUDo6fkNsZWFyTWVkaWFIVFRQKCkgeworfQorCitzdGF0dXNfdCBDbGVhck1lZGlhSFRUUDo6Y29ubmVjdCgKKyAgICAgICAgY29uc3QgY2hhciAqdXJpLAorICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycywKKyAgICAgICAgb2ZmNjRfdCAvKiBvZmZzZXQgKi8pIHsKKyAgICBpZiAobUluaXRDaGVjayAhPSBPSykgeworICAgICAgICByZXR1cm4gbUluaXRDaGVjazsKKyAgICB9CisKKyAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiBleHRIZWFkZXJzOworICAgIGlmIChoZWFkZXJzICE9IE5VTEwpIHsKKyAgICAgICAgZXh0SGVhZGVycyA9ICpoZWFkZXJzOworICAgIH0KKworICAgIGlmIChleHRIZWFkZXJzLmluZGV4T2ZLZXkoU3RyaW5nOCgiVXNlci1BZ2VudCIpKSA8IDApIHsKKyAgICAgICAgZXh0SGVhZGVycy5hZGQoU3RyaW5nOCgiVXNlci1BZ2VudCIpLCBTdHJpbmc4KE1ha2VVc2VyQWdlbnQoKS5jX3N0cigpKSk7CisgICAgfQorCisgICAgbUxhc3RVUkkgPSB1cmk7CisgICAgLy8gcmVjb25uZWN0KCkgY2FsbHMgd2l0aCB1cmkgPT0gb2xkIG1MYXN0VVJJLmNfc3RyKCksIHdoaWNoIGdldHMgemFwcGVkCisgICAgLy8gYXMgcGFydCBvZiB0aGUgYWJvdmUgYXNzaWdubWVudC4gRW5zdXJlIG5vIGFjY2lkZW50YWwgbGF0ZXIgdXNlLgorICAgIHVyaSA9IE5VTEw7CisKKyAgICBib29sIHN1Y2Nlc3MgPSBtSFRUUENvbm5lY3Rpb24tPmNvbm5lY3QobUxhc3RVUkkuY19zdHIoKSwgJmV4dEhlYWRlcnMpOworCisgICAgbUxhc3RIZWFkZXJzID0gZXh0SGVhZGVyczsKKworICAgIG1DYWNoZWRTaXplVmFsaWQgPSBmYWxzZTsKKworICAgIGlmIChzdWNjZXNzKSB7CisgICAgICAgIEFTdHJpbmcgc2FuaXRpemVkID0gdXJpRGVidWdTdHJpbmcobUxhc3RVUkkpOworICAgICAgICBtTmFtZSA9IFN0cmluZzg6OmZvcm1hdCgiQ2xlYXJNZWRpYUhUVFAoJXMpIiwgc2FuaXRpemVkLmNfc3RyKCkpOworICAgIH0KKworICAgIHJldHVybiBzdWNjZXNzID8gT0sgOiBVTktOT1dOX0VSUk9SOworfQorCit2b2lkIENsZWFyTWVkaWFIVFRQOjpjbG9zZSgpIHsKKyAgICBkaXNjb25uZWN0KCk7Cit9CisKK3ZvaWQgQ2xlYXJNZWRpYUhUVFA6OmRpc2Nvbm5lY3QoKSB7CisgICAgbU5hbWUgPSBTdHJpbmc4KCJDbGVhck1lZGlhSFRUUCg8ZGlzY29ubmVjdGVkPikiKTsKKyAgICBpZiAobUluaXRDaGVjayAhPSBPSykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbUhUVFBDb25uZWN0aW9uLT5kaXNjb25uZWN0KCk7Cit9CisKK3N0YXR1c190IENsZWFyTWVkaWFIVFRQOjppbml0Q2hlY2soKSBjb25zdCB7CisgICAgcmV0dXJuIG1Jbml0Q2hlY2s7Cit9CisKK3NzaXplX3QgQ2xlYXJNZWRpYUhUVFA6OnJlYWRBdChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBpZiAobUluaXRDaGVjayAhPSBPSykgeworICAgICAgICByZXR1cm4gbUluaXRDaGVjazsKKyAgICB9CisKKyAgICBpbnQ2NF90IHN0YXJ0VGltZVVzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKKworICAgIHNpemVfdCBudW1CeXRlc1JlYWQgPSAwOworICAgIHdoaWxlIChudW1CeXRlc1JlYWQgPCBzaXplKSB7CisgICAgICAgIHNpemVfdCBjb3B5ID0gc2l6ZSAtIG51bUJ5dGVzUmVhZDsKKworICAgICAgICBpZiAoY29weSA+IDY0ICogMTAyNCkgeworICAgICAgICAgICAgLy8gbGltaXQgdGhlIGJ1ZmZlciBzaXplcyB0cmFuc2ZlcnJlZCBhY3Jvc3MgYmluZGVyIGJvdW5kYXJpZXMKKyAgICAgICAgICAgIC8vIHRvIGF2b2lkIHNwdXJpb3VzIHRyYW5zYWN0aW9uIGZhaWx1cmVzLgorICAgICAgICAgICAgY29weSA9IDY0ICogMTAyNDsKKyAgICAgICAgfQorCisgICAgICAgIHNzaXplX3QgbiA9IG1IVFRQQ29ubmVjdGlvbi0+cmVhZEF0KAorICAgICAgICAgICAgICAgIG9mZnNldCArIG51bUJ5dGVzUmVhZCwgKHVpbnQ4X3QgKilkYXRhICsgbnVtQnl0ZXNSZWFkLCBjb3B5KTsKKworICAgICAgICBpZiAobiA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiBuOworICAgICAgICB9IGVsc2UgaWYgKG4gPT0gMCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBudW1CeXRlc1JlYWQgKz0gbjsKKyAgICB9CisKKyAgICBpbnQ2NF90IGRlbGF5VXMgPSBBTG9vcGVyOjpHZXROb3dVcygpIC0gc3RhcnRUaW1lVXM7CisKKyAgICBhZGRCYW5kd2lkdGhNZWFzdXJlbWVudChudW1CeXRlc1JlYWQsIGRlbGF5VXMpOworCisgICAgcmV0dXJuIG51bUJ5dGVzUmVhZDsKK30KKworc3RhdHVzX3QgQ2xlYXJNZWRpYUhUVFA6OmdldFNpemUob2ZmNjRfdCAqc2l6ZSkgeworICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CisgICAgICAgIHJldHVybiBtSW5pdENoZWNrOworICAgIH0KKworICAgIC8vIENhY2hpbmcgdGhlIHJldHVybmVkIHNpemUgc28gdGhhdCBpdCBzdGF5cyB2YWxpZCBldmVuIGFmdGVyIGEKKyAgICAvLyBkaXNjb25uZWN0LiBOdUNhY2hlZFNvdXJjZTIgcmVsaWVzIG9uIHRoaXMuCisKKyAgICBpZiAoIW1DYWNoZWRTaXplVmFsaWQpIHsKKyAgICAgICAgbUNhY2hlZFNpemUgPSBtSFRUUENvbm5lY3Rpb24tPmdldFNpemUoKTsKKyAgICAgICAgbUNhY2hlZFNpemVWYWxpZCA9IHRydWU7CisgICAgfQorCisgICAgKnNpemUgPSBtQ2FjaGVkU2l6ZTsKKworICAgIHJldHVybiAqc2l6ZSA8IDAgPyAqc2l6ZSA6IHN0YXRpY19jYXN0PHN0YXR1c190PihPSyk7Cit9CisKK3VpbnQzMl90IENsZWFyTWVkaWFIVFRQOjpmbGFncygpIHsKKyAgICByZXR1cm4ga1dhbnRzUHJlZmV0Y2hpbmcgfCBrSXNIVFRQQmFzZWRTb3VyY2U7Cit9CisKK3N0YXR1c190IENsZWFyTWVkaWFIVFRQOjpyZWNvbm5lY3RBdE9mZnNldChvZmY2NF90IG9mZnNldCkgeworICAgIHJldHVybiBjb25uZWN0KG1MYXN0VVJJLmNfc3RyKCksICZtTGFzdEhlYWRlcnMsIG9mZnNldCk7Cit9CisKKworU3RyaW5nOCBDbGVhck1lZGlhSFRUUDo6Z2V0VXJpKCkgeworICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CisgICAgICAgIHJldHVybiBTdHJpbmc4OjplbXB0eSgpOworICAgIH0KKworICAgIFN0cmluZzggdXJpOworICAgIGlmIChPSyA9PSBtSFRUUENvbm5lY3Rpb24tPmdldFVyaSgmdXJpKSkgeworICAgICAgICByZXR1cm4gdXJpOworICAgIH0KKyAgICByZXR1cm4gU3RyaW5nOChtTGFzdFVSSS5jX3N0cigpKTsKK30KKworU3RyaW5nOCBDbGVhck1lZGlhSFRUUDo6Z2V0TUlNRVR5cGUoKSBjb25zdCB7CisgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZzgoImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIpOworICAgIH0KKworICAgIFN0cmluZzggbWltZVR5cGU7CisgICAgc3RhdHVzX3QgZXJyID0gbUhUVFBDb25uZWN0aW9uLT5nZXRNSU1FVHlwZSgmbWltZVR5cGUpOworCisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICByZXR1cm4gU3RyaW5nOCgiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIik7CisgICAgfQorCisgICAgcmV0dXJuIG1pbWVUeXBlOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cC9NZWRpYUhUVFAuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cC9NZWRpYUhUVFAuY3BwCmluZGV4IDdjOTI0N2UuLjBmYmEzZGMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHAvTWVkaWFIVFRQLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwL01lZGlhSFRUUC5jcHAKQEAgLTMwLDEwICszMCw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIE1lZGlhSFRUUDo6TWVkaWFIVFRQKGNvbnN0IHNwPE1lZGlhSFRUUENvbm5lY3Rpb24+ICZjb25uKQotICAgIDogbUluaXRDaGVjaygoY29ubiAhPSBOVUxMKSA/IE9LIDogTk9fSU5JVCksCi0gICAgICBtSFRUUENvbm5lY3Rpb24oY29ubiksCi0gICAgICBtQ2FjaGVkU2l6ZVZhbGlkKGZhbHNlKSwKLSAgICAgIG1DYWNoZWRTaXplKDBsbCksCisgICAgOiBDbGVhck1lZGlhSFRUUChjb25uKSwKICAgICAgIG1Ecm1NYW5hZ2VyQ2xpZW50KE5VTEwpIHsKIH0KIApAQCAtNDEsMTE3ICszOCw2IEBACiAgICAgY2xlYXJEUk1TdGF0ZV9sKCk7CiB9CiAKLXN0YXR1c190IE1lZGlhSFRUUDo6Y29ubmVjdCgKLSAgICAgICAgY29uc3QgY2hhciAqdXJpLAotICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycywKLSAgICAgICAgb2ZmNjRfdCAvKiBvZmZzZXQgKi8pIHsKLSAgICBpZiAobUluaXRDaGVjayAhPSBPSykgewotICAgICAgICByZXR1cm4gbUluaXRDaGVjazsKLSAgICB9Ci0KLSAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiBleHRIZWFkZXJzOwotICAgIGlmIChoZWFkZXJzICE9IE5VTEwpIHsKLSAgICAgICAgZXh0SGVhZGVycyA9ICpoZWFkZXJzOwotICAgIH0KLQotICAgIGlmIChleHRIZWFkZXJzLmluZGV4T2ZLZXkoU3RyaW5nOCgiVXNlci1BZ2VudCIpKSA8IDApIHsKLSAgICAgICAgZXh0SGVhZGVycy5hZGQoU3RyaW5nOCgiVXNlci1BZ2VudCIpLCBTdHJpbmc4KE1ha2VVc2VyQWdlbnQoKS5jX3N0cigpKSk7Ci0gICAgfQotCi0gICAgbUxhc3RVUkkgPSB1cmk7Ci0gICAgLy8gcmVjb25uZWN0KCkgY2FsbHMgd2l0aCB1cmkgPT0gb2xkIG1MYXN0VVJJLmNfc3RyKCksIHdoaWNoIGdldHMgemFwcGVkCi0gICAgLy8gYXMgcGFydCBvZiB0aGUgYWJvdmUgYXNzaWdubWVudC4gRW5zdXJlIG5vIGFjY2lkZW50YWwgbGF0ZXIgdXNlLgotICAgIHVyaSA9IE5VTEw7Ci0KLSAgICBib29sIHN1Y2Nlc3MgPSBtSFRUUENvbm5lY3Rpb24tPmNvbm5lY3QobUxhc3RVUkkuY19zdHIoKSwgJmV4dEhlYWRlcnMpOwotCi0gICAgbUxhc3RIZWFkZXJzID0gZXh0SGVhZGVyczsKLQotICAgIG1DYWNoZWRTaXplVmFsaWQgPSBmYWxzZTsKLQotICAgIGlmIChzdWNjZXNzKSB7Ci0gICAgICAgIEFTdHJpbmcgc2FuaXRpemVkID0gdXJpRGVidWdTdHJpbmcobUxhc3RVUkkpOwotICAgICAgICBtTmFtZSA9IFN0cmluZzg6OmZvcm1hdCgiTWVkaWFIVFRQKCVzKSIsIHNhbml0aXplZC5jX3N0cigpKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gc3VjY2VzcyA/IE9LIDogVU5LTk9XTl9FUlJPUjsKLX0KLQotdm9pZCBNZWRpYUhUVFA6OmRpc2Nvbm5lY3QoKSB7Ci0gICAgbU5hbWUgPSBTdHJpbmc4KCJNZWRpYUhUVFAoPGRpc2Nvbm5lY3RlZD4pIik7Ci0gICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIG1IVFRQQ29ubmVjdGlvbi0+ZGlzY29ubmVjdCgpOwotfQotCi1zdGF0dXNfdCBNZWRpYUhUVFA6OmluaXRDaGVjaygpIGNvbnN0IHsKLSAgICByZXR1cm4gbUluaXRDaGVjazsKLX0KLQotc3NpemVfdCBNZWRpYUhUVFA6OnJlYWRBdChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKLSAgICBpZiAobUluaXRDaGVjayAhPSBPSykgewotICAgICAgICByZXR1cm4gbUluaXRDaGVjazsKLSAgICB9Ci0KLSAgICBpbnQ2NF90IHN0YXJ0VGltZVVzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKLQotICAgIHNpemVfdCBudW1CeXRlc1JlYWQgPSAwOwotICAgIHdoaWxlIChudW1CeXRlc1JlYWQgPCBzaXplKSB7Ci0gICAgICAgIHNpemVfdCBjb3B5ID0gc2l6ZSAtIG51bUJ5dGVzUmVhZDsKLQotICAgICAgICBpZiAoY29weSA+IDY0ICogMTAyNCkgewotICAgICAgICAgICAgLy8gbGltaXQgdGhlIGJ1ZmZlciBzaXplcyB0cmFuc2ZlcnJlZCBhY3Jvc3MgYmluZGVyIGJvdW5kYXJpZXMKLSAgICAgICAgICAgIC8vIHRvIGF2b2lkIHNwdXJpb3VzIHRyYW5zYWN0aW9uIGZhaWx1cmVzLgotICAgICAgICAgICAgY29weSA9IDY0ICogMTAyNDsKLSAgICAgICAgfQotCi0gICAgICAgIHNzaXplX3QgbiA9IG1IVFRQQ29ubmVjdGlvbi0+cmVhZEF0KAotICAgICAgICAgICAgICAgIG9mZnNldCArIG51bUJ5dGVzUmVhZCwgKHVpbnQ4X3QgKilkYXRhICsgbnVtQnl0ZXNSZWFkLCBjb3B5KTsKLQotICAgICAgICBpZiAobiA8IDApIHsKLSAgICAgICAgICAgIHJldHVybiBuOwotICAgICAgICB9IGVsc2UgaWYgKG4gPT0gMCkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBudW1CeXRlc1JlYWQgKz0gbjsKLSAgICB9Ci0KLSAgICBpbnQ2NF90IGRlbGF5VXMgPSBBTG9vcGVyOjpHZXROb3dVcygpIC0gc3RhcnRUaW1lVXM7Ci0KLSAgICBhZGRCYW5kd2lkdGhNZWFzdXJlbWVudChudW1CeXRlc1JlYWQsIGRlbGF5VXMpOwotCi0gICAgcmV0dXJuIG51bUJ5dGVzUmVhZDsKLX0KLQotc3RhdHVzX3QgTWVkaWFIVFRQOjpnZXRTaXplKG9mZjY0X3QgKnNpemUpIHsKLSAgICBpZiAobUluaXRDaGVjayAhPSBPSykgewotICAgICAgICByZXR1cm4gbUluaXRDaGVjazsKLSAgICB9Ci0KLSAgICAvLyBDYWNoaW5nIHRoZSByZXR1cm5lZCBzaXplIHNvIHRoYXQgaXQgc3RheXMgdmFsaWQgZXZlbiBhZnRlciBhCi0gICAgLy8gZGlzY29ubmVjdC4gTnVDYWNoZWRTb3VyY2UyIHJlbGllcyBvbiB0aGlzLgotCi0gICAgaWYgKCFtQ2FjaGVkU2l6ZVZhbGlkKSB7Ci0gICAgICAgIG1DYWNoZWRTaXplID0gbUhUVFBDb25uZWN0aW9uLT5nZXRTaXplKCk7Ci0gICAgICAgIG1DYWNoZWRTaXplVmFsaWQgPSB0cnVlOwotICAgIH0KLQotICAgICpzaXplID0gbUNhY2hlZFNpemU7Ci0KLSAgICByZXR1cm4gKnNpemUgPCAwID8gKnNpemUgOiBzdGF0aWNfY2FzdDxzdGF0dXNfdD4oT0spOwotfQotCi11aW50MzJfdCBNZWRpYUhUVFA6OmZsYWdzKCkgewotICAgIHJldHVybiBrV2FudHNQcmVmZXRjaGluZyB8IGtJc0hUVFBCYXNlZFNvdXJjZTsKLX0KLQotc3RhdHVzX3QgTWVkaWFIVFRQOjpyZWNvbm5lY3RBdE9mZnNldChvZmY2NF90IG9mZnNldCkgewotICAgIHJldHVybiBjb25uZWN0KG1MYXN0VVJJLmNfc3RyKCksICZtTGFzdEhlYWRlcnMsIG9mZnNldCk7Ci19Ci0KIC8vIERSTS4uLgogCiBzcDxEZWNyeXB0SGFuZGxlPiBNZWRpYUhUVFA6OkRybUluaXRpYWxpemF0aW9uKGNvbnN0IGNoYXIqIG1pbWUpIHsKQEAgLTE3NiwzMyArNjIsNiBAQAogICAgIHJldHVybiBtRGVjcnlwdEhhbmRsZTsKIH0KIAotU3RyaW5nOCBNZWRpYUhUVFA6OmdldFVyaSgpIHsKLSAgICBpZiAobUluaXRDaGVjayAhPSBPSykgewotICAgICAgICByZXR1cm4gU3RyaW5nODo6ZW1wdHkoKTsKLSAgICB9Ci0KLSAgICBTdHJpbmc4IHVyaTsKLSAgICBpZiAoT0sgPT0gbUhUVFBDb25uZWN0aW9uLT5nZXRVcmkoJnVyaSkpIHsKLSAgICAgICAgcmV0dXJuIHVyaTsKLSAgICB9Ci0gICAgcmV0dXJuIFN0cmluZzgobUxhc3RVUkkuY19zdHIoKSk7Ci19Ci0KLVN0cmluZzggTWVkaWFIVFRQOjpnZXRNSU1FVHlwZSgpIGNvbnN0IHsKLSAgICBpZiAobUluaXRDaGVjayAhPSBPSykgewotICAgICAgICByZXR1cm4gU3RyaW5nOCgiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIik7Ci0gICAgfQotCi0gICAgU3RyaW5nOCBtaW1lVHlwZTsKLSAgICBzdGF0dXNfdCBlcnIgPSBtSFRUUENvbm5lY3Rpb24tPmdldE1JTUVUeXBlKCZtaW1lVHlwZSk7Ci0KLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBTdHJpbmc4KCJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gbWltZVR5cGU7Ci19Ci0KIHZvaWQgTWVkaWFIVFRQOjpjbGVhckRSTVN0YXRlX2woKSB7CiAgICAgaWYgKG1EZWNyeXB0SGFuZGxlICE9IE5VTEwpIHsKICAgICAgICAgLy8gVG8gcmVsZWFzZSBtRGVjcnlwdEhhbmRsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0FuZHJvaWQuYnAKaW5kZXggMmY5MzNhMC4uMjkwNzc1MSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9BbmRyb2lkLmJwCkBAIC0zNyw2ICszNyw3IEBACiAgICAgICAgICJsaWJjdXRpbHMiLAogICAgICAgICAibGlibWVkaWEiLAogICAgICAgICAibGlibWVkaWFleHRyYWN0b3IiLAorICAgICAgICAibGlibWVkaWFuZGsiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHQiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCiAgICAgICAgICJsaWJ1dGlscyIsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9IVFRQRG93bmxvYWRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9IVFRQRG93bmxvYWRlci5jcHAKaW5kZXggNzI2MDRlMy4uNTkyNjVmZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvSFRUUERvd25sb2FkZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0hUVFBEb3dubG9hZGVyLmNwcApAQCAtMjYsOCArMjYsOCBAQAogI2luY2x1ZGUgPG1lZGlhL01lZGlhSFRUUFNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhSFRUUC5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0ZpbGVTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9DbGVhck1lZGlhSFRUUC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0NsZWFyRmlsZVNvdXJjZS5oPgogI2luY2x1ZGUgPG9wZW5zc2wvYWVzLmg+CiAjaW5jbHVkZSA8b3BlbnNzbC9tZDUuaD4KICNpbmNsdWRlIDx1dGlscy9NdXRleC5oPgpAQCAtMzgsNyArMzgsNyBAQAogSFRUUERvd25sb2FkZXI6OkhUVFBEb3dubG9hZGVyKAogICAgICAgICBjb25zdCBzcDxNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCiAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICZoZWFkZXJzKSA6Ci0gICAgbUhUVFBEYXRhU291cmNlKG5ldyBNZWRpYUhUVFAoaHR0cFNlcnZpY2UtPm1ha2VIVFRQQ29ubmVjdGlvbigpKSksCisgICAgbUhUVFBEYXRhU291cmNlKG5ldyBDbGVhck1lZGlhSFRUUChodHRwU2VydmljZS0+bWFrZUhUVFBDb25uZWN0aW9uKCkpKSwKICAgICBtRXh0cmFIZWFkZXJzKGhlYWRlcnMpLAogICAgIG1EaXNjb25uZWN0aW5nKGZhbHNlKSB7CiB9CkBAIC05MSw3ICs5MSw3IEBACiAKICAgICBpZiAocmVjb25uZWN0KSB7CiAgICAgICAgIGlmICghc3RybmNhc2VjbXAodXJsLCAiZmlsZTovLyIsIDcpKSB7Ci0gICAgICAgICAgICBtRGF0YVNvdXJjZSA9IG5ldyBGaWxlU291cmNlKHVybCArIDcpOworICAgICAgICAgICAgbURhdGFTb3VyY2UgPSBuZXcgQ2xlYXJGaWxlU291cmNlKHVybCArIDcpOwogICAgICAgICB9IGVsc2UgaWYgKHN0cm5jYXNlY21wKHVybCwgImh0dHA6Ly8iLCA3KQogICAgICAgICAgICAgICAgICYmIHN0cm5jYXNlY21wKHVybCwgImh0dHBzOi8vIiwgOCkpIHsKICAgICAgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2lkMy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL0FuZHJvaWQuYnAKaW5kZXggMzdmOWQ1MC4uYjQyYzA1MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL0FuZHJvaWQuYnAKQEAgLTMsNiArMywxMCBAQAogCiAgICAgc3JjczogWyJJRDMuY3BwIl0sCiAKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibWVkaWFfbmRrX2hlYWRlcnMiLAorICAgIF0sCisKICAgICBjZmxhZ3M6IFsKICAgICAgICAgIi1XZXJyb3IiLAogICAgICAgICAiLVdhbGwiLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL0lEMy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvSUQzLmNwcAppbmRleCBhMGE2MmY0Li5iNDg5MTgzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvSUQzLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvSUQzLmNwcApAQCAtMjEsNiArMjEsOCBAQAogI2luY2x1ZGUgIi4uL2luY2x1ZGUvSUQzLmgiCiAKICNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5BcGkuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9CeXRlVXRpbHMuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CkBAIC01Niw2ICs1OCw1NSBAQAogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKE1lbW9yeVNvdXJjZSk7CiB9OwogCitjbGFzcyBEYXRhU291cmNlVW53cmFwcGVyIDogcHVibGljIERhdGFTb3VyY2VCYXNlIHsKKworcHVibGljOgorICAgIGV4cGxpY2l0IERhdGFTb3VyY2VVbndyYXBwZXIoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlaGVscGVyKSB7CisgICAgICAgIG1Tb3VyY2UgPSBzb3VyY2VoZWxwZXI7CisgICAgfQorICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCkgY29uc3QgeyByZXR1cm4gT0s7IH0KKworICAgIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyByZWFkLCBvciAtMSBvbiBmYWlsdXJlLiBJdCdzIG5vdCBhbiBlcnJvciBpZgorICAgIC8vIHRoaXMgcmV0dXJucyB6ZXJvOyBpdCBqdXN0IG1lYW5zIHRoZSBnaXZlbiBvZmZzZXQgaXMgZXF1YWwgdG8sIG9yCisgICAgLy8gYmV5b25kLCB0aGUgZW5kIG9mIHRoZSBzb3VyY2UuCisgICAgdmlydHVhbCBzc2l6ZV90IHJlYWRBdChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICAgICAgcmV0dXJuIG1Tb3VyY2UtPnJlYWRBdChvZmZzZXQsIGRhdGEsIHNpemUpOworICAgIH0KKworICAgIC8vIE1heSByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTaXplKG9mZjY0X3QgKnNpemUpIHsKKyAgICAgICAgcmV0dXJuIG1Tb3VyY2UtPmdldFNpemUoc2l6ZSk7CisgICAgfQorCisgICAgdmlydHVhbCBib29sIGdldFVyaShjaGFyICogLyp1cmlTdHJpbmcqLywgc2l6ZV90IC8qYnVmZmVyU2l6ZSovKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHVpbnQzMl90IGZsYWdzKCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgY2xvc2UoKSB7fTsKK3ByaXZhdGU6CisgICAgRGF0YVNvdXJjZUhlbHBlciAqbVNvdXJjZTsKK307CisKKworSUQzOjpJRDMoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlaGVscGVyLCBib29sIGlnbm9yZVYxLCBvZmY2NF90IG9mZnNldCkKKyAgICA6IG1Jc1ZhbGlkKGZhbHNlKSwKKyAgICAgIG1EYXRhKE5VTEwpLAorICAgICAgbVNpemUoMCksCisgICAgICBtRmlyc3RGcmFtZU9mZnNldCgwKSwKKyAgICAgIG1WZXJzaW9uKElEM19VTktOT1dOKSwKKyAgICAgIG1SYXdTaXplKDApIHsKKyAgICBEYXRhU291cmNlVW53cmFwcGVyIHNvdXJjZShzb3VyY2VoZWxwZXIpOworICAgIG1Jc1ZhbGlkID0gcGFyc2VWMigmc291cmNlLCBvZmZzZXQpOworCisgICAgaWYgKCFtSXNWYWxpZCAmJiAhaWdub3JlVjEpIHsKKyAgICAgICAgbUlzVmFsaWQgPSBwYXJzZVYxKCZzb3VyY2UpOworICAgIH0KK30KKwogSUQzOjpJRDMoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgYm9vbCBpZ25vcmVWMSwgb2ZmNjRfdCBvZmZzZXQpCiAgICAgOiBtSXNWYWxpZChmYWxzZSksCiAgICAgICBtRGF0YShOVUxMKSwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvSFRUUEJhc2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvSFRUUEJhc2UuaAppbmRleCBhOTI0MTk3Li44YjIwMTg3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0hUVFBCYXNlLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9IVFRQQmFzZS5oCkBAIC01MSwxMiArNTEsNiBAQAogCiAgICAgdmlydHVhbCB2b2lkIHNldEJhbmR3aWR0aEhpc3RvcnlTaXplKHNpemVfdCBudW1IaXN0b3J5SXRlbXMpOwogCi0gICAgc3RhdGljIHZvaWQgUmVnaXN0ZXJTb2NrZXRVc2VyVGFnKGludCBzb2NrZmQsIHVpZF90IHVpZCwgdWludDMyX3Qga1RhZyk7Ci0gICAgc3RhdGljIHZvaWQgVW5SZWdpc3RlclNvY2tldFVzZXJUYWcoaW50IHNvY2tmZCk7Ci0KLSAgICBzdGF0aWMgdm9pZCBSZWdpc3RlclNvY2tldFVzZXJNYXJrKGludCBzb2NrZmQsIHVpZF90IHVpZCk7Ci0gICAgc3RhdGljIHZvaWQgVW5SZWdpc3RlclNvY2tldFVzZXJNYXJrKGludCBzb2NrZmQpOwotCiAgICAgdmlydHVhbCBTdHJpbmc4IHRvU3RyaW5nKCkgewogICAgICAgICByZXR1cm4gbU5hbWU7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9JRDMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvSUQzLmgKaW5kZXggN2MyMzkxZS4uNWU0MzNlYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9JRDMuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0lEMy5oCkBAIC0yNCw2ICsyNCw3IEBACiAKIGNsYXNzIERhdGFTb3VyY2VCYXNlOwogY2xhc3MgU3RyaW5nODsKK2NsYXNzIERhdGFTb3VyY2VIZWxwZXI7CiAKIHN0cnVjdCBJRDMgewogICAgIGVudW0gVmVyc2lvbiB7CkBAIC0zNSw2ICszNiw3IEBACiAgICAgICAgIElEM19WMl80LAogICAgIH07CiAKKyAgICBleHBsaWNpdCBJRDMoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLCBib29sIGlnbm9yZVYxID0gZmFsc2UsIG9mZjY0X3Qgb2Zmc2V0ID0gMCk7CiAgICAgZXhwbGljaXQgSUQzKERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIGJvb2wgaWdub3JlVjEgPSBmYWxzZSwgb2ZmNjRfdCBvZmZzZXQgPSAwKTsKICAgICBJRDMoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUsIGJvb2wgaWdub3JlVjEgPSBmYWxzZSk7CiAgICAgfklEMygpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9OdUNhY2hlZFNvdXJjZTIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTnVDYWNoZWRTb3VyY2UyLmgKaW5kZXggZjQzOWExYy4uNTk2ZWZiOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9OdUNhY2hlZFNvdXJjZTIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL051Q2FjaGVkU291cmNlMi5oCkBAIC0zNyw2ICszNyw4IEBACiAKICAgICB2aXJ0dWFsIHNzaXplX3QgcmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7CiAKKyAgICB2aXJ0dWFsIHZvaWQgY2xvc2UoKTsKKwogICAgIHZpcnR1YWwgdm9pZCBkaXNjb25uZWN0KCk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNpemUob2ZmNjRfdCAqc2l6ZSk7CkBAIC01MSw2ICs1Myw4IEBACiAgICAgICAgIHJldHVybiBtTmFtZTsKICAgICB9CiAKKyAgICBzdGF0dXNfdCBnZXRBdmFpbGFibGVTaXplKG9mZjY0X3Qgb2Zmc2V0LCBvZmY2NF90ICpzaXplKTsKKwogICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAogICAgIHNpemVfdCBjYWNoZWRTaXplKCk7CkBAIC0xMzUsNyArMTM5LDcgQEAKICAgICBzc2l6ZV90IHJlYWRJbnRlcm5hbChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOwogICAgIHN0YXR1c190IHNlZWtJbnRlcm5hbF9sKG9mZjY0X3Qgb2Zmc2V0KTsKIAotICAgIHNpemVfdCBhcHByb3hEYXRhUmVtYWluaW5nX2woc3RhdHVzX3QgKmZpbmFsU3RhdHVzKSBjb25zdDsKKyAgICBzaXplX3QgYXBwcm94RGF0YVJlbWFpbmluZ19sKG9mZjY0X3Qgb2Zmc2V0LCBzdGF0dXNfdCAqZmluYWxTdGF0dXMpIGNvbnN0OwogCiAgICAgdm9pZCByZXN0YXJ0UHJlZmV0Y2hlcklmTmVjZXNzYXJ5X2woCiAgICAgICAgICAgICBib29sIGlnbm9yZUxvd1dhdGVyVGhyZXNob2xkID0gZmFsc2UsIGJvb2wgZm9yY2UgPSBmYWxzZSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NvZnR3YXJlUmVuZGVyZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU29mdHdhcmVSZW5kZXJlci5oCmluZGV4IGMyODY1MTYuLjY0ZGNhNGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU29mdHdhcmVSZW5kZXJlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU29mdHdhcmVSZW5kZXJlci5oCkBAIC01MSw3ICs1MSw3IEBACiAgICAgQ29sb3JDb252ZXJ0ZXIgKm1Db252ZXJ0ZXI7CiAgICAgWVVWTW9kZSBtWVVWTW9kZTsKICAgICBzcDxBTmF0aXZlV2luZG93PiBtTmF0aXZlV2luZG93OwotICAgIGludDMyX3QgbVdpZHRoLCBtSGVpZ2h0OworICAgIGludDMyX3QgbVdpZHRoLCBtSGVpZ2h0LCBtU3RyaWRlOwogICAgIGludDMyX3QgbUNyb3BMZWZ0LCBtQ3JvcFRvcCwgbUNyb3BSaWdodCwgbUNyb3BCb3R0b207CiAgICAgaW50MzJfdCBtQ3JvcFdpZHRoLCBtQ3JvcEhlaWdodDsKICAgICBpbnQzMl90IG1Sb3RhdGlvbkRlZ3JlZXM7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1N0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlci5oCmluZGV4IDFhNDRlMWYuLmM1MDY3N2EgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlci5oCkBAIC0yNiw3ICsyNiw2IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIGNsYXNzIERhdGFTb3VyY2U7Ci1jbGFzcyBNZWRpYUV4dHJhY3RvcjsKIHN0cnVjdCBJbWFnZURlY29kZXI7CiBzdHJ1Y3QgRnJhbWVSZWN0OwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0FDb2RlYy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9BQ29kZWMuaAppbmRleCA5N2QxNWE3Li43M2Y5M2QxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0FDb2RlYy5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQUNvZGVjLmgKQEAgLTIyLDcgKzIyLDcgQEAKICNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9NZXRhZGF0YUJ1ZmZlclR5cGUuaD4KICNpbmNsdWRlIDxtZWRpYS9NZWRpYUNvZGVjSW5mby5oPgogI2luY2x1ZGUgPG1lZGlhL0lPTVguaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9BSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQ29kZWNCYXNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRnJhbWVSZW5kZXJUcmFja2VyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CkBAIC0xMzcsNiArMTM3LDcgQEAKICAgICAgICAga1doYXRPTVhEaWVkICAgICAgICAgICAgICAgICA9ICdPTVhkJywKICAgICAgICAga1doYXRSZWxlYXNlQ29kZWNJbnN0YW5jZSAgICA9ICdyZWxDJywKICAgICAgICAga1doYXRGb3JjZVN0YXRlVHJhbnNpdGlvbiAgICA9ICdmc3R0JywKKyAgICAgICAga1doYXRDaGVja0lmU3R1Y2sgICAgICAgICAgICA9ICdDc3RrJywKICAgICB9OwogCiAgICAgZW51bSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0FIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZS5oCnJlbmFtZSB0byBtZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0FIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9DbGVhckZpbGVTb3VyY2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ2xlYXJGaWxlU291cmNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU4Mzc0OAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ2xlYXJGaWxlU291cmNlLmgKQEAgLTAsMCArMSw2OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQ0xFQVJfRklMRV9TT1VSQ0VfSF8KKworI2RlZmluZSBDTEVBUl9GSUxFX1NPVVJDRV9IXworCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBDbGVhckZpbGVTb3VyY2UgOiBwdWJsaWMgRGF0YVNvdXJjZSB7CitwdWJsaWM6CisgICAgQ2xlYXJGaWxlU291cmNlKGNvbnN0IGNoYXIgKmZpbGVuYW1lKTsKKyAgICAvLyBDbGVhckZpbGVTb3VyY2UgdGFrZXMgb3duZXJzaGlwIGFuZCB3aWxsIGNsb3NlIHRoZSBmZAorICAgIENsZWFyRmlsZVNvdXJjZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRDaGVjaygpIGNvbnN0OworCisgICAgdmlydHVhbCBzc2l6ZV90IHJlYWRBdChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTaXplKG9mZjY0X3QgKnNpemUpOworCisgICAgdmlydHVhbCB1aW50MzJfdCBmbGFncygpIHsKKyAgICAgICAgcmV0dXJuIGtJc0xvY2FsRmlsZVNvdXJjZTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIFN0cmluZzggdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiBtTmFtZTsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5DbGVhckZpbGVTb3VyY2UoKTsKKyAgICB2aXJ0dWFsIHNzaXplX3QgcmVhZEF0X2wob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKKworICAgIGludCBtRmQ7CisgICAgaW50NjRfdCBtT2Zmc2V0OworICAgIGludDY0X3QgbUxlbmd0aDsKKyAgICBNdXRleCBtTG9jazsKKworcHJpdmF0ZToKKyAgICBTdHJpbmc4IG1OYW1lOworCisgICAgQ2xlYXJGaWxlU291cmNlKGNvbnN0IENsZWFyRmlsZVNvdXJjZSAmKTsKKyAgICBDbGVhckZpbGVTb3VyY2UgJm9wZXJhdG9yPShjb25zdCBDbGVhckZpbGVTb3VyY2UgJik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIENMRUFSX0ZJTEVfU09VUkNFX0hfCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ2xlYXJNZWRpYUhUVFAuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ2xlYXJNZWRpYUhUVFAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjkwN2E5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9DbGVhck1lZGlhSFRUUC5oCkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIENMRUFSX01FRElBX0hUVFBfSF8KKworI2RlZmluZSBDTEVBUl9NRURJQV9IVFRQX0hfCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuaD4KKworI2luY2x1ZGUgImluY2x1ZGUvSFRUUEJhc2UuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgTWVkaWFIVFRQQ29ubmVjdGlvbjsKKworc3RydWN0IENsZWFyTWVkaWFIVFRQIDogcHVibGljIEhUVFBCYXNlIHsKKyAgICBDbGVhck1lZGlhSFRUUChjb25zdCBzcDxNZWRpYUhUVFBDb25uZWN0aW9uPiAmY29ubik7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGNvbm5lY3QoCisgICAgICAgICAgICBjb25zdCBjaGFyICp1cmksCisgICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycywKKyAgICAgICAgICAgIG9mZjY0X3Qgb2Zmc2V0KTsKKworICAgIHZpcnR1YWwgdm9pZCBjbG9zZSgpOworCisgICAgdmlydHVhbCB2b2lkIGRpc2Nvbm5lY3QoKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIHNzaXplX3QgcmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNpemUob2ZmNjRfdCAqc2l6ZSk7CisKKyAgICB2aXJ0dWFsIHVpbnQzMl90IGZsYWdzKCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlY29ubmVjdEF0T2Zmc2V0KG9mZjY0X3Qgb2Zmc2V0KTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfkNsZWFyTWVkaWFIVFRQKCk7CisKKyAgICB2aXJ0dWFsIFN0cmluZzggZ2V0VXJpKCk7CisgICAgdmlydHVhbCBTdHJpbmc4IGdldE1JTUVUeXBlKCkgY29uc3Q7CisKKyAgICBBU3RyaW5nIG1MYXN0VVJJOworCitwcml2YXRlOgorICAgIHN0YXR1c190IG1Jbml0Q2hlY2s7CisgICAgc3A8TWVkaWFIVFRQQ29ubmVjdGlvbj4gbUhUVFBDb25uZWN0aW9uOworCisgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gbUxhc3RIZWFkZXJzOworCisgICAgYm9vbCBtQ2FjaGVkU2l6ZVZhbGlkOworICAgIG9mZjY0X3QgbUNhY2hlZFNpemU7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhDbGVhck1lZGlhSFRUUCk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIENMRUFSX01FRElBX0hUVFBfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ29sb3JDb252ZXJ0ZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ29sb3JDb252ZXJ0ZXIuaAppbmRleCA1YjM1NDNkLi42ZDRjMWJmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NvbG9yQ29udmVydGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9Db2xvckNvbnZlcnRlci5oCkBAIC0zNSwyMSArMzUsMzIgQEAKIAogICAgIGJvb2wgaXNEc3RSR0IoKSBjb25zdDsKIAorICAgIHZvaWQgc2V0U3JjQ29sb3JTcGFjZSh1aW50MzJfdCBzdGFuZGFyZCwgdWludDMyX3QgcmFuZ2UsIHVpbnQzMl90IHRyYW5zZmVyKTsKKwogICAgIHN0YXR1c190IGNvbnZlcnQoCiAgICAgICAgICAgICBjb25zdCB2b2lkICpzcmNCaXRzLAotICAgICAgICAgICAgc2l6ZV90IHNyY1dpZHRoLCBzaXplX3Qgc3JjSGVpZ2h0LAorICAgICAgICAgICAgc2l6ZV90IHNyY1dpZHRoLCBzaXplX3Qgc3JjSGVpZ2h0LCBzaXplX3Qgc3JjU3RyaWRlLAogICAgICAgICAgICAgc2l6ZV90IHNyY0Nyb3BMZWZ0LCBzaXplX3Qgc3JjQ3JvcFRvcCwKICAgICAgICAgICAgIHNpemVfdCBzcmNDcm9wUmlnaHQsIHNpemVfdCBzcmNDcm9wQm90dG9tLAogICAgICAgICAgICAgdm9pZCAqZHN0Qml0cywKLSAgICAgICAgICAgIHNpemVfdCBkc3RXaWR0aCwgc2l6ZV90IGRzdEhlaWdodCwKKyAgICAgICAgICAgIHNpemVfdCBkc3RXaWR0aCwgc2l6ZV90IGRzdEhlaWdodCwgc2l6ZV90IGRzdFN0cmlkZSwKICAgICAgICAgICAgIHNpemVfdCBkc3RDcm9wTGVmdCwgc2l6ZV90IGRzdENyb3BUb3AsCiAgICAgICAgICAgICBzaXplX3QgZHN0Q3JvcFJpZ2h0LCBzaXplX3QgZHN0Q3JvcEJvdHRvbSk7CiAKIHByaXZhdGU6CisgICAgc3RydWN0IENvbG9yU3BhY2UgeworICAgICAgICB1aW50MzJfdCBtU3RhbmRhcmQ7CisgICAgICAgIHVpbnQzMl90IG1SYW5nZTsKKyAgICAgICAgdWludDMyX3QgbVRyYW5zZmVyOworCisgICAgICAgIGJvb2wgaXNCdDcwOSgpOworICAgICAgICBib29sIGlzSnBlZygpOworICAgIH07CisKICAgICBzdHJ1Y3QgQml0bWFwUGFyYW1zIHsKICAgICAgICAgQml0bWFwUGFyYW1zKAogICAgICAgICAgICAgICAgIHZvaWQgKmJpdHMsCi0gICAgICAgICAgICAgICAgc2l6ZV90IHdpZHRoLCBzaXplX3QgaGVpZ2h0LAorICAgICAgICAgICAgICAgIHNpemVfdCB3aWR0aCwgc2l6ZV90IGhlaWdodCwgc2l6ZV90IHN0cmlkZSwKICAgICAgICAgICAgICAgICBzaXplX3QgY3JvcExlZnQsIHNpemVfdCBjcm9wVG9wLAogICAgICAgICAgICAgICAgIHNpemVfdCBjcm9wUmlnaHQsIHNpemVfdCBjcm9wQm90dG9tLAogICAgICAgICAgICAgICAgIE9NWF9DT0xPUl9GT1JNQVRUWVBFIGNvbG9yRnJvbWF0KTsKQEAgLTY1LDYgKzc2LDcgQEAKICAgICB9OwogCiAgICAgT01YX0NPTE9SX0ZPUk1BVFRZUEUgbVNyY0Zvcm1hdCwgbURzdEZvcm1hdDsKKyAgICBDb2xvclNwYWNlIG1TcmNDb2xvclNwYWNlOwogICAgIHVpbnQ4X3QgKm1DbGlwOwogCiAgICAgdWludDhfdCAqaW5pdENsaXAoKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvRmlsZVNvdXJjZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9GaWxlU291cmNlLmgKaW5kZXggODYwNDg5MC4uYjYxMGVlZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9GaWxlU291cmNlLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9GaWxlU291cmNlLmgKQEAgLTIwLDQ3ICsyMCwyOSBAQAogCiAjaW5jbHVkZSA8c3RkaW8uaD4KIAotI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9DbGVhckZpbGVTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgogI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KICNpbmNsdWRlIDxkcm0vRHJtTWFuYWdlckNsaWVudC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLWNsYXNzIEZpbGVTb3VyY2UgOiBwdWJsaWMgRGF0YVNvdXJjZSB7CitjbGFzcyBGaWxlU291cmNlIDogcHVibGljIENsZWFyRmlsZVNvdXJjZSB7CiBwdWJsaWM6CiAgICAgRmlsZVNvdXJjZShjb25zdCBjaGFyICpmaWxlbmFtZSk7CiAgICAgLy8gRmlsZVNvdXJjZSB0YWtlcyBvd25lcnNoaXAgYW5kIHdpbGwgY2xvc2UgdGhlIGZkCiAgICAgRmlsZVNvdXJjZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRDaGVjaygpIGNvbnN0OwotCiAgICAgdmlydHVhbCBzc2l6ZV90IHJlYWRBdChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTaXplKG9mZjY0X3QgKnNpemUpOwotCi0gICAgdmlydHVhbCB1aW50MzJfdCBmbGFncygpIHsKLSAgICAgICAgcmV0dXJuIGtJc0xvY2FsRmlsZVNvdXJjZTsKLSAgICB9Ci0KICAgICB2aXJ0dWFsIHNwPERlY3J5cHRIYW5kbGU+IERybUluaXRpYWxpemF0aW9uKGNvbnN0IGNoYXIgKm1pbWUpOwogCi0gICAgdmlydHVhbCBTdHJpbmc4IHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gbU5hbWU7Ci0gICAgfQotCiAgICAgc3RhdGljIGJvb2wgcmVxdWlyZXNEcm0oaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgsIGNvbnN0IGNoYXIgKm1pbWUpOwogCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+RmlsZVNvdXJjZSgpOwogCiBwcml2YXRlOgotICAgIGludCBtRmQ7Ci0gICAgaW50NjRfdCBtT2Zmc2V0OwotICAgIGludDY0X3QgbUxlbmd0aDsKLSAgICBNdXRleCBtTG9jazsKLSAgICBTdHJpbmc4IG1OYW1lOwotCiAgICAgLypmb3IgRFJNKi8KICAgICBzcDxEZWNyeXB0SGFuZGxlPiBtRGVjcnlwdEhhbmRsZTsKICAgICBEcm1NYW5hZ2VyQ2xpZW50ICptRHJtTWFuYWdlckNsaWVudDsKQEAgLTY4LDcgKzUwLDcgQEAKICAgICBzc2l6ZV90IG1Ecm1CdWZTaXplOwogICAgIHVuc2lnbmVkIGNoYXIgKm1Ecm1CdWY7CiAKLSAgICBzc2l6ZV90IHJlYWRBdERSTShvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOworICAgIHNzaXplX3QgcmVhZEF0RFJNX2wob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKIAogICAgIEZpbGVTb3VyY2UoY29uc3QgRmlsZVNvdXJjZSAmKTsKICAgICBGaWxlU291cmNlICZvcGVyYXRvcj0oY29uc3QgRmlsZVNvdXJjZSAmKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvSW50ZXJmYWNlVXRpbHMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvSW50ZXJmYWNlVXRpbHMuaAppbmRleCBmMGViZDQ4Li5iODNhOTU4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0ludGVyZmFjZVV0aWxzLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9JbnRlcmZhY2VVdGlscy5oCkBAIC0xOCw3ICsxOCw2IEBACiAjZGVmaW5lIElOVEVSRkFDRV9VVElMU19IXwogCiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvUmVtb3RlTWVkaWFFeHRyYWN0b3IuaD4KICNpbmNsdWRlIDxtZWRpYS9NZWRpYVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUV4dHJhY3Rvci5oPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjQ29uc3RhbnRzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNDb25zdGFudHMuaAppbmRleCAzZWY0YzBlLi5hNDYyYWU3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNDb25zdGFudHMuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNDb25zdGFudHMuaApAQCAtMzI3LDYgKzMyNyw3IEBACiBjb25zdGV4cHIgY2hhciBLRVlfQklUUkFURV9NT0RFW10gPSAiYml0cmF0ZS1tb2RlIjsKIGNvbnN0ZXhwciBjaGFyIEtFWV9DQV9TRVNTSU9OX0lEW10gPSAiY2Etc2Vzc2lvbi1pZCI7CiBjb25zdGV4cHIgY2hhciBLRVlfQ0FfU1lTVEVNX0lEW10gPSAiY2Etc3lzdGVtLWlkIjsKK2NvbnN0ZXhwciBjaGFyIEtFWV9DQV9QUklWQVRFX0RBVEFbXSA9ICJjYS1wcml2YXRlLWRhdGEiOwogY29uc3RleHByIGNoYXIgS0VZX0NBUFRVUkVfUkFURVtdID0gImNhcHR1cmUtcmF0ZSI7CiBjb25zdGV4cHIgY2hhciBLRVlfQ0hBTk5FTF9DT1VOVFtdID0gImNoYW5uZWwtY291bnQiOwogY29uc3RleHByIGNoYXIgS0VZX0NIQU5ORUxfTUFTS1tdID0gImNoYW5uZWwtbWFzayI7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzEzNDNkNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuaApAQCAtMCwwICsxLDE0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgTUVESUFfRVhUUkFDVE9SX0hfCisKKyNkZWZpbmUgTUVESUFfRVhUUkFDVE9SX0hfCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkFwaS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgRGF0YVNvdXJjZUJhc2U7CitjbGFzcyBNZXRhRGF0YUJhc2U7CitzdHJ1Y3QgTWVkaWFUcmFjazsKKworCitjbGFzcyBFeHRyYWN0b3JBbGxvY1RyYWNrZXIgeworcHVibGljOgorICAgIEV4dHJhY3RvckFsbG9jVHJhY2tlcigpIHsKKyAgICAgICAgQUxPR0QoImV4dHJhY3RvciBhbGxvY2F0ZWQ6ICVwIiwgdGhpcyk7CisgICAgfQorICAgIHZpcnR1YWwgfkV4dHJhY3RvckFsbG9jVHJhY2tlcigpIHsKKyAgICAgICAgQUxPR0QoImV4dHJhY3RvciBmcmVlZDogJXAiLCB0aGlzKTsKKyAgICB9Cit9OworCitjbGFzcyBNZWRpYUV4dHJhY3RvcgorLy8gOiBwdWJsaWMgRXh0cmFjdG9yQWxsb2NUcmFja2VyCit7CitwdWJsaWM6CisgICAgdmlydHVhbCB+TWVkaWFFeHRyYWN0b3IoKTsKKyAgICB2aXJ0dWFsIHNpemVfdCBjb3VudFRyYWNrcygpID0gMDsKKyAgICB2aXJ0dWFsIE1lZGlhVHJhY2sgKmdldFRyYWNrKHNpemVfdCBpbmRleCkgPSAwOworCisgICAgZW51bSBHZXRUcmFja01ldGFEYXRhRmxhZ3MgeworICAgICAgICBrSW5jbHVkZUV4dGVuc2l2ZU1ldGFEYXRhID0gMQorICAgIH07CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRUcmFja01ldGFEYXRhKAorICAgICAgICAgICAgTWV0YURhdGFCYXNlJiBtZXRhLAorICAgICAgICAgICAgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncyA9IDApID0gMDsKKworICAgIC8vIFJldHVybiBjb250YWluZXIgc3BlY2lmaWMgbWV0YS1kYXRhLiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbgorICAgIC8vIHJldHVybnMgYW4gZW1wdHkgbWV0YWRhdGEgb2JqZWN0LgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWV0YURhdGEoTWV0YURhdGFCYXNlJiBtZXRhKSA9IDA7CisKKyAgICBlbnVtIEZsYWdzIHsKKyAgICAgICAgQ0FOX1NFRUtfQkFDS1dBUkQgID0gMSwgIC8vIHRoZSAic2VlayAxMHNlY3MgYmFjayBidXR0b24iCisgICAgICAgIENBTl9TRUVLX0ZPUldBUkQgICA9IDIsICAvLyB0aGUgInNlZWsgMTBzZWNzIGZvcndhcmQgYnV0dG9uIgorICAgICAgICBDQU5fUEFVU0UgICAgICAgICAgPSA0LAorICAgICAgICBDQU5fU0VFSyAgICAgICAgICAgPSA4LCAgLy8gdGhlICJzZWVrIGJhciIKKyAgICB9OworCisgICAgLy8gSWYgc3ViY2xhc3NlcyBkbyBfbm90XyBvdmVycmlkZSB0aGlzLCB0aGUgZGVmYXVsdCBpcworICAgIC8vIENBTl9TRUVLX0JBQ0tXQVJEIHwgQ0FOX1NFRUtfRk9SV0FSRCB8IENBTl9TRUVLIHwgQ0FOX1BBVVNFCisgICAgdmlydHVhbCB1aW50MzJfdCBmbGFncygpIGNvbnN0OworCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNZWRpYUNhcyhjb25zdCB1aW50OF90KiAvKmNhc1Rva2VuKi8sIHNpemVfdCAvKnNpemUqLykgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgdmlydHVhbCBjb25zdCBjaGFyICogbmFtZSgpIHsgcmV0dXJuICI8dW5zcGVjaWZpZWQ+IjsgfQorCitwcm90ZWN0ZWQ6CisgICAgTWVkaWFFeHRyYWN0b3IoKTsKKworcHJpdmF0ZToKKyAgICBNZWRpYUV4dHJhY3Rvcihjb25zdCBNZWRpYUV4dHJhY3RvciAmKTsKKyAgICBNZWRpYUV4dHJhY3RvciAmb3BlcmF0b3I9KGNvbnN0IE1lZGlhRXh0cmFjdG9yICYpOworfTsKKworY2xhc3MgTWVkaWFFeHRyYWN0b3JDVW53cmFwcGVyIDogcHVibGljIE1lZGlhRXh0cmFjdG9yIHsKK3B1YmxpYzoKKyAgICBNZWRpYUV4dHJhY3RvckNVbndyYXBwZXIoKSB7fTsKKyAgICB2aXJ0dWFsIHNpemVfdCBjb3VudFRyYWNrcygpID0gMDsKKyAgICB2aXJ0dWFsIE1lZGlhVHJhY2sgKmdldFRyYWNrKHNpemVfdCBpbmRleCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0VHJhY2tNZXRhRGF0YShNZXRhRGF0YUJhc2UmIG1ldGEsIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MgPSAwKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNZXRhRGF0YShNZXRhRGF0YUJhc2UmIG1ldGEpID0gMDsKKyAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKiBuYW1lKCkgPSAwOworICAgIHZpcnR1YWwgdWludDMyX3QgZmxhZ3MoKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNZWRpYUNhcyhjb25zdCB1aW50OF90KiBjYXNUb2tlbiwgc2l6ZV90IHNpemUpID0gMDsKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5NZWRpYUV4dHJhY3RvckNVbndyYXBwZXIoKSB7fTsKK307CisKKworY2xhc3MgTWVkaWFFeHRyYWN0b3JDVW53cmFwcGVyVjEgOiBwdWJsaWMgTWVkaWFFeHRyYWN0b3JDVW53cmFwcGVyIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBNZWRpYUV4dHJhY3RvckNVbndyYXBwZXJWMShDTWVkaWFFeHRyYWN0b3IgKnBsdWdpbik7CisgICAgdmlydHVhbCBzaXplX3QgY291bnRUcmFja3MoKTsKKyAgICB2aXJ0dWFsIE1lZGlhVHJhY2sgKmdldFRyYWNrKHNpemVfdCBpbmRleCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRUcmFja01ldGFEYXRhKE1ldGFEYXRhQmFzZSYgbWV0YSwgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncyA9IDApOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWV0YURhdGEoTWV0YURhdGFCYXNlJiBtZXRhKTsKKyAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKiBuYW1lKCk7CisgICAgdmlydHVhbCB1aW50MzJfdCBmbGFncygpIGNvbnN0OworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWVkaWFDYXMoY29uc3QgdWludDhfdCogY2FzVG9rZW4sIHNpemVfdCBzaXplKTsKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5NZWRpYUV4dHJhY3RvckNVbndyYXBwZXJWMSgpOworcHJpdmF0ZToKKyAgICBDTWVkaWFFeHRyYWN0b3IgKnBsdWdpbjsKK307CisKK2NsYXNzIE1lZGlhRXh0cmFjdG9yQ1Vud3JhcHBlclYyIDogcHVibGljIE1lZGlhRXh0cmFjdG9yQ1Vud3JhcHBlciB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgTWVkaWFFeHRyYWN0b3JDVW53cmFwcGVyVjIoQ01lZGlhRXh0cmFjdG9yVjIgKnBsdWdpbik7CisgICAgdmlydHVhbCBzaXplX3QgY291bnRUcmFja3MoKTsKKyAgICB2aXJ0dWFsIE1lZGlhVHJhY2sgKmdldFRyYWNrKHNpemVfdCBpbmRleCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRUcmFja01ldGFEYXRhKE1ldGFEYXRhQmFzZSYgbWV0YSwgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncyA9IDApOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWV0YURhdGEoTWV0YURhdGFCYXNlJiBtZXRhKTsKKyAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKiBuYW1lKCk7CisgICAgdmlydHVhbCB1aW50MzJfdCBmbGFncygpIGNvbnN0OworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWVkaWFDYXMoY29uc3QgdWludDhfdCogY2FzVG9rZW4sIHNpemVfdCBzaXplKTsKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5NZWRpYUV4dHJhY3RvckNVbndyYXBwZXJWMigpOworcHJpdmF0ZToKKyAgICBDTWVkaWFFeHRyYWN0b3JWMiAqcGx1Z2luOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBNRURJQV9FWFRSQUNUT1JfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3JGYWN0b3J5LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yRmFjdG9yeS5oCmluZGV4IGZiOWY1YmQuLmVmOWY3ZWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3JGYWN0b3J5LmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3RvckZhY3RvcnkuaApAQCAtMjEsOCArMjEsNiBAQAogI2luY2x1ZGUgPHN0ZGlvLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFFeHRyYWN0b3IuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3Rvci5oPgotI2luY2x1ZGUgPHV0aWxzL0xpc3QuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC00MCwxOSArMzgsMjAgQEAKIAogcHJpdmF0ZToKICAgICBzdGF0aWMgTXV0ZXggZ1BsdWdpbk11dGV4OwotICAgIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8TGlzdDxzcDxFeHRyYWN0b3JQbHVnaW4+Pj4gZ1BsdWdpbnM7CisgICAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxzdGQ6Omxpc3Q8c3A8RXh0cmFjdG9yUGx1Z2luPj4+IGdQbHVnaW5zOwogICAgIHN0YXRpYyBib29sIGdQbHVnaW5zUmVnaXN0ZXJlZDsKKyAgICBzdGF0aWMgYm9vbCBnSWdub3JlVmVyc2lvbjsKIAogICAgIHN0YXRpYyB2b2lkIFJlZ2lzdGVyRXh0cmFjdG9yc0luQXBrKAotICAgICAgICAgICAgY29uc3QgY2hhciAqYXBrUGF0aCwgTGlzdDxzcDxFeHRyYWN0b3JQbHVnaW4+PiAmcGx1Z2luTGlzdCk7CisgICAgICAgICAgICBjb25zdCBjaGFyICphcGtQYXRoLCBzdGQ6Omxpc3Q8c3A8RXh0cmFjdG9yUGx1Z2luPj4gJnBsdWdpbkxpc3QpOwogICAgIHN0YXRpYyB2b2lkIFJlZ2lzdGVyRXh0cmFjdG9yc0luU3lzdGVtKAotICAgICAgICAgICAgY29uc3QgY2hhciAqbGliRGlyUGF0aCwgTGlzdDxzcDxFeHRyYWN0b3JQbHVnaW4+PiAmcGx1Z2luTGlzdCk7CisgICAgICAgICAgICBjb25zdCBjaGFyICpsaWJEaXJQYXRoLCBzdGQ6Omxpc3Q8c3A8RXh0cmFjdG9yUGx1Z2luPj4gJnBsdWdpbkxpc3QpOwogICAgIHN0YXRpYyB2b2lkIFJlZ2lzdGVyRXh0cmFjdG9yKAotICAgICAgICAgICAgY29uc3Qgc3A8RXh0cmFjdG9yUGx1Z2luPiAmcGx1Z2luLCBMaXN0PHNwPEV4dHJhY3RvclBsdWdpbj4+ICZwbHVnaW5MaXN0KTsKKyAgICAgICAgICAgIGNvbnN0IHNwPEV4dHJhY3RvclBsdWdpbj4gJnBsdWdpbiwgc3RkOjpsaXN0PHNwPEV4dHJhY3RvclBsdWdpbj4+ICZwbHVnaW5MaXN0KTsKIAotICAgIHN0YXRpYyBNZWRpYUV4dHJhY3Rvcjo6Q3JlYXRvckZ1bmMgc25pZmYoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwKLSAgICAgICAgICAgIGZsb2F0ICpjb25maWRlbmNlLCB2b2lkICoqbWV0YSwgTWVkaWFFeHRyYWN0b3I6OkZyZWVNZXRhRnVuYyAqZnJlZU1ldGEsCi0gICAgICAgICAgICBzcDxFeHRyYWN0b3JQbHVnaW4+ICZwbHVnaW4pOworICAgIHN0YXRpYyB2b2lkICpzbmlmZihjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlLAorICAgICAgICAgICAgZmxvYXQgKmNvbmZpZGVuY2UsIHZvaWQgKiptZXRhLCBGcmVlTWV0YUZ1bmMgKmZyZWVNZXRhLAorICAgICAgICAgICAgc3A8RXh0cmFjdG9yUGx1Z2luPiAmcGx1Z2luLCB1aW50MzJfdCAqY3JlYXRvclZlcnNpb24pOwogCiAgICAgc3RhdGljIHZvaWQgVXBkYXRlRXh0cmFjdG9ycyhjb25zdCBjaGFyICpuZXdVcGRhdGVBcGtQYXRoKTsKIH07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhSFRUUC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUhUVFAuaAppbmRleCBmZTBlNjEzLi5hY2FhNmM0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhSFRUUC5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFIVFRQLmgKQEAgLTE5LDUwICsxOSwyMSBAQAogI2RlZmluZSBNRURJQV9IVFRQX0hfCiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuaD4KLQotI2luY2x1ZGUgImluY2x1ZGUvSFRUUEJhc2UuaCIKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9DbGVhck1lZGlhSFRUUC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0cnVjdCBNZWRpYUhUVFBDb25uZWN0aW9uOwogCi1zdHJ1Y3QgTWVkaWFIVFRQIDogcHVibGljIEhUVFBCYXNlIHsKK3N0cnVjdCBNZWRpYUhUVFAgOiBwdWJsaWMgQ2xlYXJNZWRpYUhUVFAgewogICAgIE1lZGlhSFRUUChjb25zdCBzcDxNZWRpYUhUVFBDb25uZWN0aW9uPiAmY29ubik7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGNvbm5lY3QoCi0gICAgICAgICAgICBjb25zdCBjaGFyICp1cmksCi0gICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycywKLSAgICAgICAgICAgIG9mZjY0X3Qgb2Zmc2V0KTsKLQotICAgIHZpcnR1YWwgdm9pZCBkaXNjb25uZWN0KCk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRDaGVjaygpIGNvbnN0OwotCi0gICAgdmlydHVhbCBzc2l6ZV90IHJlYWRBdChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTaXplKG9mZjY0X3QgKnNpemUpOwotCi0gICAgdmlydHVhbCB1aW50MzJfdCBmbGFncygpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWNvbm5lY3RBdE9mZnNldChvZmY2NF90IG9mZnNldCk7Ci0KIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5NZWRpYUhUVFAoKTsKIAogICAgIHZpcnR1YWwgc3A8RGVjcnlwdEhhbmRsZT4gRHJtSW5pdGlhbGl6YXRpb24oY29uc3QgY2hhciogbWltZSk7Ci0gICAgdmlydHVhbCBTdHJpbmc4IGdldFVyaSgpOwotICAgIHZpcnR1YWwgU3RyaW5nOCBnZXRNSU1FVHlwZSgpIGNvbnN0OwogCiBwcml2YXRlOgotICAgIHN0YXR1c190IG1Jbml0Q2hlY2s7Ci0gICAgc3A8TWVkaWFIVFRQQ29ubmVjdGlvbj4gbUhUVFBDb25uZWN0aW9uOwotCi0gICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gbUxhc3RIZWFkZXJzOwotICAgIEFTdHJpbmcgbUxhc3RVUkk7Ci0KLSAgICBib29sIG1DYWNoZWRTaXplVmFsaWQ7Ci0gICAgb2ZmNjRfdCBtQ2FjaGVkU2l6ZTsKLQogICAgIHNwPERlY3J5cHRIYW5kbGU+IG1EZWNyeXB0SGFuZGxlOwogICAgIERybU1hbmFnZXJDbGllbnQgKm1Ecm1NYW5hZ2VyQ2xpZW50OwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhVXRpbHMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFVdGlscy5oCmluZGV4IGQ1YTgwODAuLmRjYWYyN2YgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFVdGlscy5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFVdGlscy5oCkBAIC0yMCwxMyArMjAsMjQgQEAKIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CiAKK3N0cnVjdCBBTWVkaWFGb3JtYXQ7CisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RydWN0IEFCdWZmZXI7CiBib29sIE1ha2VBVkNDb2RlY1NwZWNpZmljRGF0YShNZXRhRGF0YUJhc2UgJm1ldGEsIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKTsKK2Jvb2wgTWFrZUFWQ0NvZGVjU3BlY2lmaWNEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSwgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpOworCitib29sIE1ha2VBQUNDb2RlY1NwZWNpZmljRGF0YShNZXRhRGF0YUJhc2UgJm1ldGEsIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKTsKIGJvb2wgTWFrZUFBQ0NvZGVjU3BlY2lmaWNEYXRhKE1ldGFEYXRhQmFzZSAmbWV0YSwgdW5zaWduZWQgcHJvZmlsZSwgdW5zaWduZWQgc2FtcGxpbmdfZnJlcV9pbmRleCwKICAgICAgICAgdW5zaWduZWQgY2hhbm5lbF9jb25maWd1cmF0aW9uKTsKIAorYm9vbCBNYWtlQUFDQ29kZWNTcGVjaWZpY0RhdGEoQU1lZGlhRm9ybWF0ICptZXRhLCB1bnNpZ25lZCBwcm9maWxlLCB1bnNpZ25lZCBzYW1wbGluZ19mcmVxX2luZGV4LAorICAgICAgICB1bnNpZ25lZCBjaGFubmVsX2NvbmZpZ3VyYXRpb24pOworCit2b2lkIHBhcnNlVm9yYmlzQ29tbWVudCgKKyAgICAgICAgQU1lZGlhRm9ybWF0ICpmaWxlTWV0YSwgY29uc3QgY2hhciAqY29tbWVudCwgc2l6ZV90IGNvbW1lbnRMZW5ndGgpOworCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCiAjZW5kaWYgIC8vIE1FVEFfREFUQV9VVElMU19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9OdU1lZGlhRXh0cmFjdG9yLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L051TWVkaWFFeHRyYWN0b3IuaAppbmRleCA1NGE3MDk1Li42NDFjY2ZhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L051TWVkaWFFeHRyYWN0b3IuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L051TWVkaWFFeHRyYWN0b3IuaApAQCAtNjQsOCArNjQsNiBAQAogCiAgICAgc3RhdHVzX3Qgc2V0TWVkaWFDYXMoY29uc3QgSEludGVyZmFjZVRva2VuICZjYXNUb2tlbik7CiAKLSAgICB2b2lkIGRpc2Nvbm5lY3QoKTsKLQogICAgIHNpemVfdCBjb3VudFRyYWNrcygpIGNvbnN0OwogICAgIHN0YXR1c190IGdldFRyYWNrRm9ybWF0KHNpemVfdCBpbmRleCwgc3A8QU1lc3NhZ2U+ICpmb3JtYXQsIHVpbnQzMl90IGZsYWdzID0gMCkgY29uc3Q7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvUmVtb3RlTWVkaWFFeHRyYWN0b3IuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvUmVtb3RlTWVkaWFFeHRyYWN0b3IuaAppbmRleCA1MDllNjY5Li45OTI1MTE0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1JlbW90ZU1lZGlhRXh0cmFjdG9yLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9SZW1vdGVNZWRpYUV4dHJhY3Rvci5oCkBAIC0xOCw3ICsxOCw3IEBACiAjZGVmaW5lIFJFTU9URV9NRURJQV9FWFRSQUNUT1JfSF8KIAogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUV4dHJhY3Rvci5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvUmVtb3RlTWVkaWFTb3VyY2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvUmVtb3RlTWVkaWFTb3VyY2UuaAppbmRleCAxZDcyMGFmLi4wM2QzODY5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1JlbW90ZU1lZGlhU291cmNlLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9SZW1vdGVNZWRpYVNvdXJjZS5oCkBAIC0zNywxMiArMzcsMTMgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoCiAgICAgICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsCiAgICAgICAgICAgICBjb25zdCBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKKyAgICB2aXJ0dWFsIGJvb2wgc3VwcG9ydE5vbmJsb2NraW5nUmVhZCgpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgcGF1c2UoKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN0b3BUaW1lVXMoaW50NjRfdCBzdG9wVGltZVVzKTsKIAogcHJpdmF0ZToKICAgICBzcDxSZW1vdGVNZWRpYUV4dHJhY3Rvcj4gbUV4dHJhY3RvcjsKLSAgICBNZWRpYVRyYWNrICptU291cmNlOworICAgIE1lZGlhVHJhY2sgKm1UcmFjazsKICAgICBzcDxSZWZCYXNlPiBtRXh0cmFjdG9yUGx1Z2luOwogCiAgICAgZXhwbGljaXQgUmVtb3RlTWVkaWFTb3VyY2UoCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmgKaW5kZXggNmEyOGUwYi4uZThlMGExMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaApAQCAtMzAsNiArMzAsOCBAQAogCiBzdHJ1Y3QgQU1lc3NhZ2U7CiBzdGF0dXNfdCBjb252ZXJ0TWV0YURhdGFUb01lc3NhZ2UoCisgICAgICAgIGNvbnN0IE1ldGFEYXRhQmFzZSAqbWV0YSwgc3A8QU1lc3NhZ2U+ICpmb3JtYXQpOworc3RhdHVzX3QgY29udmVydE1ldGFEYXRhVG9NZXNzYWdlKAogICAgICAgICBjb25zdCBzcDxNZXRhRGF0YT4gJm1ldGEsIHNwPEFNZXNzYWdlPiAqZm9ybWF0KTsKIHZvaWQgY29udmVydE1lc3NhZ2VUb01ldGFEYXRhKAogICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwgc3A8TWV0YURhdGE+ICZtZXRhKTsKQEAgLTUwLDYgKzUyLDEwIEBACiAvLyBTZW5kIGluZm9ybWF0aW9uIGZyb20gTWV0YURhdGEgdG8gdGhlIEhBTCB2aWEgQXVkaW9TaW5rCiBzdGF0dXNfdCBzZW5kTWV0YURhdGFUb0hhbChzcDxNZWRpYVBsYXllckJhc2U6OkF1ZGlvU2luaz4mIHNpbmssIGNvbnN0IHNwPE1ldGFEYXRhPiYgbWV0YSk7CiAKKy8vIFJldHVybiB8YXVkaW9fb2ZmbG9hZF9pbmZvX3R8IGZpbGxlZCBmcm9tIGdpdmVuIG1ldGFkYXRhCitzdGF0dXNfdCBnZXRBdWRpb09mZmxvYWRJbmZvKGNvbnN0IHNwPE1ldGFEYXRhPiYgbWV0YSwgYm9vbCBoYXNWaWRlbywKKyAgICAgICAgYm9vbCBpc1N0cmVhbWluZywgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlLCBhdWRpb19vZmZsb2FkX2luZm9fdCAqaW5mbyk7CisKIC8vIENoZWNrIHdoZXRoZXIgdGhlIHN0cmVhbSBkZWZpbmVkIGJ5IG1ldGEgY2FuIGJlIG9mZmxvYWRlZCB0byBoYXJkd2FyZQogYm9vbCBjYW5PZmZsb2FkU3RyZWFtKGNvbnN0IHNwPE1ldGFEYXRhPiYgbWV0YSwgYm9vbCBoYXNWaWRlbywKICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzU3RyZWFtaW5nLCBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BVFNQYXJzZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BVFNQYXJzZXIuY3BwCmluZGV4IDVjYzUwOTMuLmFhNGE0ZGIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQVRTUGFyc2VyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FUU1BhcnNlci5jcHAKQEAgLTExNywxMSArMTE3LDYgQEAKICAgICB2b2lkIHNpZ25hbE5ld1NhbXBsZUFlc0tleShjb25zdCBzcDxBTWVzc2FnZT4gJmtleUl0ZW0pOwogCiBwcml2YXRlOgotICAgIHN0cnVjdCBTdHJlYW1JbmZvIHsKLSAgICAgICAgdW5zaWduZWQgbVR5cGU7Ci0gICAgICAgIHVuc2lnbmVkIG1QSUQ7Ci0gICAgICAgIGludDMyX3QgbUNBU3lzdGVtSWQ7Ci0gICAgfTsKIAogICAgIEFUU1BhcnNlciAqbVBhcnNlcjsKICAgICB1bnNpZ25lZCBtUHJvZ3JhbU51bWJlcjsKQEAgLTE0MiwxMyArMTM3LDEwIEBACiB9OwogCiBzdHJ1Y3QgQVRTUGFyc2VyOjpTdHJlYW0gOiBwdWJsaWMgUmVmQmFzZSB7Ci0gICAgU3RyZWFtKFByb2dyYW0gKnByb2dyYW0sCi0gICAgICAgICAgIHVuc2lnbmVkIGVsZW1lbnRhcnlQSUQsCi0gICAgICAgICAgIHVuc2lnbmVkIHN0cmVhbVR5cGUsCi0gICAgICAgICAgIHVuc2lnbmVkIFBDUl9QSUQsCi0gICAgICAgICAgIGludDMyX3QgQ0Ffc3lzdGVtX0lEKTsKKyAgICBTdHJlYW0oUHJvZ3JhbSAqcHJvZ3JhbSwgdW5zaWduZWQgUENSX1BJRCwgY29uc3QgU3RyZWFtSW5mbyAmaW5mbyk7CiAKICAgICB1bnNpZ25lZCB0eXBlKCkgY29uc3QgeyByZXR1cm4gbVN0cmVhbVR5cGU7IH0KKyAgICB1bnNpZ25lZCB0eXBlRXh0KCkgY29uc3QgeyByZXR1cm4gbVN0cmVhbVR5cGVFeHQ7IH0KICAgICB1bnNpZ25lZCBwaWQoKSBjb25zdCB7IHJldHVybiBtRWxlbWVudGFyeVBJRDsgfQogICAgIHZvaWQgc2V0UElEKHVuc2lnbmVkIHBpZCkgeyBtRWxlbWVudGFyeVBJRCA9IHBpZDsgfQogCkBAIC0xOTQsNiArMTg2LDcgQEAKICAgICBQcm9ncmFtICptUHJvZ3JhbTsKICAgICB1bnNpZ25lZCBtRWxlbWVudGFyeVBJRDsKICAgICB1bnNpZ25lZCBtU3RyZWFtVHlwZTsKKyAgICB1bnNpZ25lZCBtU3RyZWFtVHlwZUV4dDsKICAgICB1bnNpZ25lZCBtUENSX1BJRDsKICAgICBpbnQzMl90IG1FeHBlY3RlZENvbnRpbnVpdHlDb3VudGVyOwogCkBAIC00NDcsNyArNDQwLDcgQEAKICAgICAgICAgaWYgKGRlc2NyaXB0b3JfbGVuZ3RoID4gaW5mb0xlbmd0aCkgewogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKGRlc2NyaXB0b3JfdGFnID09IDkgJiYgZGVzY3JpcHRvcl9sZW5ndGggPj0gNCkgeworICAgICAgICBpZiAoZGVzY3JpcHRvcl90YWcgPT0gREVTQ1JJUFRPUl9DQSAmJiBkZXNjcmlwdG9yX2xlbmd0aCA+PSA0KSB7CiAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CiAgICAgICAgICAgICBjYURlc2NyaXB0b3ItPm1TeXN0ZW1JRCA9IGJyLT5nZXRCaXRzKDE2KTsKICAgICAgICAgICAgIGNhRGVzY3JpcHRvci0+bVBJRCA9IGJyLT5nZXRCaXRzKDE2KSAmIDB4MWZmZjsKQEAgLTUxMywzNyArNTA2LDcxIEBACiAgICAgLy8gaW5mb0J5dGVzUmVtYWluaW5nIGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBtYWtlIHVwIHRoZQogICAgIC8vIHZhcmlhYmxlIGxlbmd0aCBzZWN0aW9uIG9mIEVTX2luZm9zLiBJdCBkb2VzIG5vdCBpbmNsdWRlIHRoZQogICAgIC8vIGZpbmFsIENSQy4KLSAgICBzaXplX3QgaW5mb0J5dGVzUmVtYWluaW5nID0gc2VjdGlvbl9sZW5ndGggLSA5IC0gcHJvZ3JhbV9pbmZvX2xlbmd0aCAtIDQ7CisgICAgaW50MzJfdCBpbmZvQnl0ZXNSZW1haW5pbmcgPSBzZWN0aW9uX2xlbmd0aCAtIDkgLSBwcm9ncmFtX2luZm9fbGVuZ3RoIC0gNDsKIAogICAgIHdoaWxlIChpbmZvQnl0ZXNSZW1haW5pbmcgPj0gNSkgewotCi0gICAgICAgIHVuc2lnbmVkIHN0cmVhbVR5cGUgPSBici0+Z2V0Qml0cyg4KTsKLSAgICAgICAgQUxPR1YoIiAgICBzdHJlYW1fdHlwZSA9IDB4JTAyeCIsIHN0cmVhbVR5cGUpOwotCisgICAgICAgIFN0cmVhbUluZm8gaW5mbzsKKyAgICAgICAgaW5mby5tVHlwZSA9IGJyLT5nZXRCaXRzKDgpOworICAgICAgICBBTE9HVigiICAgIHN0cmVhbV90eXBlID0gMHglMDJ4IiwgaW5mby5tVHlwZSk7CiAgICAgICAgIE1ZX0xPR1YoIiAgICByZXNlcnZlZCA9ICV1IiwgYnItPmdldEJpdHMoMykpOwogCi0gICAgICAgIHVuc2lnbmVkIGVsZW1lbnRhcnlQSUQgPSBici0+Z2V0Qml0cygxMyk7Ci0gICAgICAgIEFMT0dWKCIgICAgZWxlbWVudGFyeV9QSUQgPSAweCUwNHgiLCBlbGVtZW50YXJ5UElEKTsKKyAgICAgICAgaW5mby5tUElEID0gYnItPmdldEJpdHMoMTMpOworICAgICAgICBBTE9HVigiICAgIGVsZW1lbnRhcnlfUElEID0gMHglMDR4IiwgaW5mby5tUElEKTsKIAogICAgICAgICBNWV9MT0dWKCIgICAgcmVzZXJ2ZWQgPSAldSIsIGJyLT5nZXRCaXRzKDQpKTsKIAogICAgICAgICB1bnNpZ25lZCBFU19pbmZvX2xlbmd0aCA9IGJyLT5nZXRCaXRzKDEyKTsKICAgICAgICAgQUxPR1YoIiAgICBFU19pbmZvX2xlbmd0aCA9ICV1IiwgRVNfaW5mb19sZW5ndGgpOworICAgICAgICBpbmZvQnl0ZXNSZW1haW5pbmcgLT0gNSArIEVTX2luZm9fbGVuZ3RoOwogCiAgICAgICAgIENBRGVzY3JpcHRvciBzdHJlYW1DQTsKLSAgICAgICAgYm9vbCBoYXNTdHJlYW1DQSA9IGZpbmRDQURlc2NyaXB0b3IoYnIsIEVTX2luZm9fbGVuZ3RoLCAmc3RyZWFtQ0EpOworICAgICAgICBpbmZvLm1UeXBlRXh0ID0gRVhUX0RFU0NSSVBUT1JfRFZCX1JFU0VSVkVEX01BWDsKKyAgICAgICAgYm9vbCBoYXNTdHJlYW1DQSA9IGZhbHNlOworICAgICAgICB3aGlsZSAoRVNfaW5mb19sZW5ndGggPiAyICYmIGluZm9CeXRlc1JlbWFpbmluZyA+PSAwKSB7CisgICAgICAgICAgICB1bnNpZ25lZCBkZXNjcmlwdG9yX3RhZyA9IGJyLT5nZXRCaXRzKDgpOworICAgICAgICAgICAgQUxPR1YoIiAgICAgIHRhZyA9IDB4JTAyeCIsIGRlc2NyaXB0b3JfdGFnKTsKKworICAgICAgICAgICAgdW5zaWduZWQgZGVzY3JpcHRvcl9sZW5ndGggPSBici0+Z2V0Qml0cyg4KTsKKyAgICAgICAgICAgIEFMT0dWKCIgICAgICBsZW4gPSAldSIsIGRlc2NyaXB0b3JfbGVuZ3RoKTsKKworICAgICAgICAgICAgRVNfaW5mb19sZW5ndGggLT0gMjsKKyAgICAgICAgICAgIGlmIChkZXNjcmlwdG9yX2xlbmd0aCA+IEVTX2luZm9fbGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChkZXNjcmlwdG9yX3RhZyA9PSBERVNDUklQVE9SX0NBICYmIGRlc2NyaXB0b3JfbGVuZ3RoID49IDQpIHsKKyAgICAgICAgICAgICAgICBoYXNTdHJlYW1DQSA9IHRydWU7CisgICAgICAgICAgICAgICAgc3RyZWFtQ0EubVN5c3RlbUlEID0gYnItPmdldEJpdHMoMTYpOworICAgICAgICAgICAgICAgIHN0cmVhbUNBLm1QSUQgPSBici0+Z2V0Qml0cygxNikgJiAweDFmZmY7CisgICAgICAgICAgICAgICAgRVNfaW5mb19sZW5ndGggLT0gZGVzY3JpcHRvcl9sZW5ndGg7CisgICAgICAgICAgICAgICAgZGVzY3JpcHRvcl9sZW5ndGggLT0gNDsKKyAgICAgICAgICAgICAgICBzdHJlYW1DQS5tUHJpdmF0ZURhdGEuYXNzaWduKGJyLT5kYXRhKCksIGJyLT5kYXRhKCkgKyBkZXNjcmlwdG9yX2xlbmd0aCk7CisgICAgICAgICAgICAgICAgYnItPnNraXBCaXRzKGRlc2NyaXB0b3JfbGVuZ3RoICogOCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGluZm8ubVR5cGUgPT0gU1RSRUFNVFlQRV9QRVNfUFJJVkFURV9EQVRBICYmCisgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JfdGFnID09IERFU0NSSVBUT1JfRFZCX0VYVEVOU0lPTiAmJiBkZXNjcmlwdG9yX2xlbmd0aCA+PSAxKSB7CisgICAgICAgICAgICAgICAgdW5zaWduZWQgZGVzY1RhZ0V4dCA9IGJyLT5nZXRCaXRzKDgpOworICAgICAgICAgICAgICAgIEFMT0dWKCIgICAgICB0YWdfZXh0ID0gMHglMDJ4IiwgZGVzY1RhZ0V4dCk7CisgICAgICAgICAgICAgICAgaWYgKGRlc2NUYWdFeHQgPT0gRVhUX0RFU0NSSVBUT1JfRFZCX0FDNCkgeworICAgICAgICAgICAgICAgICAgICBpbmZvLm1UeXBlRXh0ID0gRVhUX0RFU0NSSVBUT1JfRFZCX0FDNDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgRVNfaW5mb19sZW5ndGggLT0gZGVzY3JpcHRvcl9sZW5ndGg7CisgICAgICAgICAgICAgICAgZGVzY3JpcHRvcl9sZW5ndGgtLTsKKyAgICAgICAgICAgICAgICBici0+c2tpcEJpdHMoZGVzY3JpcHRvcl9sZW5ndGggKiA4KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgRVNfaW5mb19sZW5ndGggLT0gZGVzY3JpcHRvcl9sZW5ndGg7CisgICAgICAgICAgICAgICAgYnItPnNraXBCaXRzKGRlc2NyaXB0b3JfbGVuZ3RoICogOCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICAgICAgaWYgKGhhc1N0cmVhbUNBICYmICFtUGFyc2VyLT5tQ2FzTWFuYWdlci0+YWRkU3RyZWFtKAotICAgICAgICAgICAgICAgIG1Qcm9ncmFtTnVtYmVyLCBlbGVtZW50YXJ5UElELCBzdHJlYW1DQSkpIHsKKyAgICAgICAgICAgICAgICBtUHJvZ3JhbU51bWJlciwgaW5mby5tUElELCBzdHJlYW1DQSkpIHsKICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgIH0KLSAgICAgICAgU3RyZWFtSW5mbyBpbmZvOwotICAgICAgICBpbmZvLm1UeXBlID0gc3RyZWFtVHlwZTsKLSAgICAgICAgaW5mby5tUElEID0gZWxlbWVudGFyeVBJRDsKLSAgICAgICAgaW5mby5tQ0FTeXN0ZW1JZCA9IGhhc1Byb2dyYW1DQSA/IHByb2dyYW1DQS5tU3lzdGVtSUQgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzU3RyZWFtQ0EgPyBzdHJlYW1DQS5tU3lzdGVtSUQgIDogLTE7Ci0gICAgICAgIGluZm9zLnB1c2goaW5mbyk7CisgICAgICAgIGlmIChoYXNQcm9ncmFtQ0EpIHsKKyAgICAgICAgICAgIGluZm8ubUNBRGVzY3JpcHRvciA9IHByb2dyYW1DQTsKKyAgICAgICAgfSBlbHNlIGlmIChoYXNTdHJlYW1DQSkgeworICAgICAgICAgICAgaW5mby5tQ0FEZXNjcmlwdG9yID0gc3RyZWFtQ0E7CisgICAgICAgIH0KIAotICAgICAgICBpbmZvQnl0ZXNSZW1haW5pbmcgLT0gNSArIEVTX2luZm9fbGVuZ3RoOworICAgICAgICBpbmZvcy5wdXNoKGluZm8pOwogICAgIH0KIAogICAgIGlmIChpbmZvQnl0ZXNSZW1haW5pbmcgIT0gMCkgewpAQCAtNjAxLDE0ICs2MjgsMTMgQEAKICAgICAgICAgc3NpemVfdCBpbmRleCA9IG1TdHJlYW1zLmluZGV4T2ZLZXkoaW5mby5tUElEKTsKIAogICAgICAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgICAgICBzcDxTdHJlYW0+IHN0cmVhbSA9IG5ldyBTdHJlYW0oCi0gICAgICAgICAgICAgICAgICAgIHRoaXMsIGluZm8ubVBJRCwgaW5mby5tVHlwZSwgUENSX1BJRCwgaW5mby5tQ0FTeXN0ZW1JZCk7CisgICAgICAgICAgICBzcDxTdHJlYW0+IHN0cmVhbSA9IG5ldyBTdHJlYW0odGhpcywgUENSX1BJRCwgaW5mbyk7CiAKICAgICAgICAgICAgIGlmIChtU2FtcGxlQWVzS2V5SXRlbSAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgc3RyZWFtLT5zaWduYWxOZXdTYW1wbGVBZXNLZXkobVNhbXBsZUFlc0tleUl0ZW0pOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpc0FkZGluZ1NjcmFtYmxlZFN0cmVhbSB8PSBpbmZvLm1DQVN5c3RlbUlkID49IDA7CisgICAgICAgICAgICBpc0FkZGluZ1NjcmFtYmxlZFN0cmVhbSB8PSBpbmZvLm1DQURlc2NyaXB0b3IubVN5c3RlbUlEID49IDA7CiAgICAgICAgICAgICBtU3RyZWFtcy5hZGQoaW5mby5tUElELCBzdHJlYW0pOwogICAgICAgICB9CiAgICAgfQpAQCAtNzE3LDM0ICs3NDMsMzIgQEAKIHN0YXRpYyBjb25zdCBzaXplX3Qga0luaXRpYWxTdHJlYW1CdWZmZXJTaXplID0gMTkyICogMTAyNDsKIAogQVRTUGFyc2VyOjpTdHJlYW06OlN0cmVhbSgKLSAgICAgICAgUHJvZ3JhbSAqcHJvZ3JhbSwKLSAgICAgICAgdW5zaWduZWQgZWxlbWVudGFyeVBJRCwKLSAgICAgICAgdW5zaWduZWQgc3RyZWFtVHlwZSwKLSAgICAgICAgdW5zaWduZWQgUENSX1BJRCwKLSAgICAgICAgaW50MzJfdCBDQV9zeXN0ZW1fSUQpCisgICAgICAgIFByb2dyYW0gKnByb2dyYW0sIHVuc2lnbmVkIFBDUl9QSUQsIGNvbnN0IFN0cmVhbUluZm8gJmluZm8pCiAgICAgOiBtUHJvZ3JhbShwcm9ncmFtKSwKLSAgICAgIG1FbGVtZW50YXJ5UElEKGVsZW1lbnRhcnlQSUQpLAotICAgICAgbVN0cmVhbVR5cGUoc3RyZWFtVHlwZSksCisgICAgICBtRWxlbWVudGFyeVBJRChpbmZvLm1QSUQpLAorICAgICAgbVN0cmVhbVR5cGUoaW5mby5tVHlwZSksCisgICAgICBtU3RyZWFtVHlwZUV4dChpbmZvLm1UeXBlRXh0KSwKICAgICAgIG1QQ1JfUElEKFBDUl9QSUQpLAogICAgICAgbUV4cGVjdGVkQ29udGludWl0eUNvdW50ZXIoLTEpLAogICAgICAgbVBheWxvYWRTdGFydGVkKGZhbHNlKSwKICAgICAgIG1FT1NSZWFjaGVkKGZhbHNlKSwKICAgICAgIG1QcmV2UFRTKDApLAogICAgICAgbVF1ZXVlKE5VTEwpLAotICAgICAgbVNjcmFtYmxlZChDQV9zeXN0ZW1fSUQgPj0gMCkgewotCisgICAgICBtU2NyYW1ibGVkKGluZm8ubUNBRGVzY3JpcHRvci5tU3lzdGVtSUQgPj0gMCkgewogICAgIG1TYW1wbGVFbmNyeXB0ZWQgPQogICAgICAgICAgICAgbVN0cmVhbVR5cGUgPT0gU1RSRUFNVFlQRV9IMjY0X0VOQ1JZUFRFRCB8fAogICAgICAgICAgICAgbVN0cmVhbVR5cGUgPT0gU1RSRUFNVFlQRV9BQUNfRU5DUllQVEVEICB8fAogICAgICAgICAgICAgbVN0cmVhbVR5cGUgPT0gU1RSRUFNVFlQRV9BQzNfRU5DUllQVEVEOwogCiAgICAgQUxPR1YoIm5ldyBzdHJlYW0gUElEIDB4JTAyeCwgdHlwZSAweCUwMngsIHNjcmFtYmxlZCAlZCwgU2FtcGxlRW5jcnlwdGVkOiAlZCIsCi0gICAgICAgICAgICBlbGVtZW50YXJ5UElELCBzdHJlYW1UeXBlLCBtU2NyYW1ibGVkLCBtU2FtcGxlRW5jcnlwdGVkKTsKKyAgICAgICAgICAgIGluZm8ubVBJRCwgaW5mby5tVHlwZSwgbVNjcmFtYmxlZCwgbVNhbXBsZUVuY3J5cHRlZCk7CiAKLSAgICB1aW50MzJfdCBmbGFncyA9Ci0gICAgICAgICAgICAoaXNWaWRlbygpICYmIG1TY3JhbWJsZWQpID8gRWxlbWVudGFyeVN0cmVhbVF1ZXVlOjprRmxhZ19TY3JhbWJsZWREYXRhIDoKLSAgICAgICAgICAgIChtU2FtcGxlRW5jcnlwdGVkKSA/IEVsZW1lbnRhcnlTdHJlYW1RdWV1ZTo6a0ZsYWdfU2FtcGxlRW5jcnlwdGVkRGF0YSA6Ci0gICAgICAgICAgICAwOworICAgIHVpbnQzMl90IGZsYWdzID0gMDsKKyAgICBpZiAoKChpc1ZpZGVvKCkgfHwgaXNBdWRpbygpKSAmJiBtU2NyYW1ibGVkKSkgeworICAgICAgICBmbGFncyA9IEVsZW1lbnRhcnlTdHJlYW1RdWV1ZTo6a0ZsYWdfU2NyYW1ibGVkRGF0YTsKKyAgICB9IGVsc2UgaWYgKG1TYW1wbGVFbmNyeXB0ZWQpIHsKKyAgICAgICAgZmxhZ3MgPSBFbGVtZW50YXJ5U3RyZWFtUXVldWU6OmtGbGFnX1NhbXBsZUVuY3J5cHRlZERhdGE7CisgICAgfQogCiAgICAgRWxlbWVudGFyeVN0cmVhbVF1ZXVlOjpNb2RlIG1vZGUgPSBFbGVtZW50YXJ5U3RyZWFtUXVldWU6OklOVkFMSUQ7CiAKQEAgLTc4MSwxMyArODA1LDIzIEBACiAgICAgICAgICAgICBtb2RlID0gRWxlbWVudGFyeVN0cmVhbVF1ZXVlOjpBQzM7CiAgICAgICAgICAgICBicmVhazsKIAorICAgICAgICBjYXNlIFNUUkVBTVRZUEVfRUFDMzoKKyAgICAgICAgICAgIG1vZGUgPSBFbGVtZW50YXJ5U3RyZWFtUXVldWU6OkVBQzM7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFNUUkVBTVRZUEVfUEVTX1BSSVZBVEVfREFUQToKKyAgICAgICAgICAgIGlmIChtU3RyZWFtVHlwZUV4dCA9PSBFWFRfREVTQ1JJUFRPUl9EVkJfQUM0KSB7CisgICAgICAgICAgICAgICAgbW9kZSA9IEVsZW1lbnRhcnlTdHJlYW1RdWV1ZTo6QUM0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKICAgICAgICAgY2FzZSBTVFJFQU1UWVBFX01FVEFEQVRBOgogICAgICAgICAgICAgbW9kZSA9IEVsZW1lbnRhcnlTdHJlYW1RdWV1ZTo6TUVUQURBVEE7CiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgQUxPR0UoInN0cmVhbSBQSUQgMHglMDJ4IGhhcyBpbnZhbGlkIHN0cmVhbSB0eXBlIDB4JTAyeCIsCi0gICAgICAgICAgICAgICAgICAgIGVsZW1lbnRhcnlQSUQsIHN0cmVhbVR5cGUpOworICAgICAgICAgICAgICAgICAgICBpbmZvLm1QSUQsIGluZm8ubVR5cGUpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgIH0KIApAQCAtODA3LDcgKzg0MSwxMyBAQAogICAgICAgICAgICAgICAgICAgICBpc0F1ZGlvKCkgPyBNRURJQV9NSU1FVFlQRV9BVURJT19TQ1JBTUJMRUQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogTUVESUFfTUlNRVRZUEVfVklERU9fU0NSQU1CTEVEKTsKICAgICAgICAgICAgIC8vIGZvciBNZWRpYUV4dHJhY3Rvci5DYXNJbmZvCi0gICAgICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5Q0FTeXN0ZW1JRCwgQ0Ffc3lzdGVtX0lEKTsKKyAgICAgICAgICAgIGNvbnN0IENBRGVzY3JpcHRvciAmZGVzY3JpcHRvciA9IGluZm8ubUNBRGVzY3JpcHRvcjsKKyAgICAgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlDQVN5c3RlbUlELCBkZXNjcmlwdG9yLm1TeXN0ZW1JRCk7CisKKyAgICAgICAgICAgIG1ldGEtPnNldERhdGEoa0tleUNBUHJpdmF0ZURhdGEsIDAsCisgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IubVByaXZhdGVEYXRhLmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvci5tUHJpdmF0ZURhdGEuc2l6ZSgpKTsKKwogICAgICAgICAgICAgbVNvdXJjZSA9IG5ldyBBbm90aGVyUGFja2V0U291cmNlKG1ldGEpOwogICAgICAgICB9CiAgICAgfQpAQCAtOTg2LDkgKzEwMjYsMTIgQEAKICAgICAgICAgY2FzZSBTVFJFQU1UWVBFX01QRUcyX0FVRElPX0FEVFM6CiAgICAgICAgIGNhc2UgU1RSRUFNVFlQRV9MUENNX0FDMzoKICAgICAgICAgY2FzZSBTVFJFQU1UWVBFX0FDMzoKKyAgICAgICAgY2FzZSBTVFJFQU1UWVBFX0VBQzM6CiAgICAgICAgIGNhc2UgU1RSRUFNVFlQRV9BQUNfRU5DUllQVEVEOgogICAgICAgICBjYXNlIFNUUkVBTVRZUEVfQUMzX0VOQ1JZUFRFRDoKICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBjYXNlIFNUUkVBTVRZUEVfUEVTX1BSSVZBVEVfREFUQToKKyAgICAgICAgICAgIHJldHVybiBtU3RyZWFtVHlwZUV4dCA9PSBFWFRfREVTQ1JJUFRPUl9EVkJfQUM0OwogCiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC0xMzk1LDcgKzE0MzgsNyBAQAogICAgIC8vIFBlcmZvcm0gdGhlIDFzdCBwYXNzIGRlc2NyYW1ibGluZyBpZiBuZWVkZWQKICAgICBpZiAoZGVzY3JhbWJsZUJ5dGVzID4gMCkgewogICAgICAgICBtZW1jcHkobURlc2NyYW1ibGVkQnVmZmVyLT5kYXRhKCksIG1CdWZmZXItPmRhdGEoKSwgZGVzY3JhbWJsZUJ5dGVzKTsKLSAgICAgICAgbURlc2NyYW1ibGVkQnVmZmVyLT5zZXRSYW5nZSgwLCBkZXNjcmFtYmxlQnl0ZXMpOworICAgICAgICBtRGVzY3JhbWJsZWRCdWZmZXItPnNldFJhbmdlKDAsIG1CdWZmZXItPnNpemUoKSk7CiAKICAgICAgICAgaGlkbF92ZWM8U3ViU2FtcGxlPiBzdWJTYW1wbGVzOwogICAgICAgICBzdWJTYW1wbGVzLnJlc2l6ZShkZXNjcmFtYmxlU3ViU2FtcGxlcyk7CkBAIC0xNDEyLDEwICsxNDU1LDkgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIHVpbnQ2NF90IHNyY09mZnNldCA9IDAsIGRzdE9mZnNldCA9IDA7Ci0gICAgICAgIC8vIElmIHNjcmFtYmxlZCBhdCBQRVMtbGV2ZWwsIFBFUyBoZWFkZXIgc2hvdWxkIGJlIHNraXBwZWQKKyAgICAgICAgLy8gSWYgc2NyYW1ibGVkIGF0IFBFUy1sZXZlbCwgUEVTIGhlYWRlciBpcyBpbiB0aGUgY2xlYXIKICAgICAgICAgaWYgKHBlc1NjcmFtYmxpbmdDb250cm9sICE9IDApIHsKLSAgICAgICAgICAgIHNyY09mZnNldCA9IGRzdE9mZnNldCA9IHBlc09mZnNldDsKKyAgICAgICAgICAgIHN1YlNhbXBsZXNbMF0ubnVtQnl0ZXNPZkNsZWFyRGF0YSA9IHBlc09mZnNldDsKICAgICAgICAgICAgIHN1YlNhbXBsZXNbMF0ubnVtQnl0ZXNPZkVuY3J5cHRlZERhdGEgLT0gcGVzT2Zmc2V0OwogICAgICAgICB9CiAKQEAgLTE0MzEsOSArMTQ3Myw5IEBACiAgICAgICAgICAgICAgICAgKFNjcmFtYmxpbmdDb250cm9sKSBzY3RybCwKICAgICAgICAgICAgICAgICBzdWJTYW1wbGVzLAogICAgICAgICAgICAgICAgIG1EZXNjcmFtYmxlclNyY0J1ZmZlciwKLSAgICAgICAgICAgICAgICBzcmNPZmZzZXQsCisgICAgICAgICAgICAgICAgMCAvKnNyY09mZnNldCovLAogICAgICAgICAgICAgICAgIGRzdEJ1ZmZlciwKLSAgICAgICAgICAgICAgICBkc3RPZmZzZXQsCisgICAgICAgICAgICAgICAgMCAvKmRzdE9mZnNldCovLAogICAgICAgICAgICAgICAgIFsmc3RhdHVzLCAmYnl0ZXNXcml0dGVuLCAmZGV0YWlsZWRFcnJvcl0gKAogICAgICAgICAgICAgICAgICAgICAgICAgU3RhdHVzIF9zdGF0dXMsIHVpbnQzMl90IF9ieXRlc1dyaXR0ZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgX2RldGFpbGVkRXJyb3IpIHsKQEAgLTE0NTAsOSArMTQ5MiwyMSBAQAogCiAgICAgICAgIEFMT0dWKCJbc3RyZWFtICVkXSBkZXNjcmFtYmxlIHN1Y2NlZWRlZCwgJWQgYnl0ZXMiLAogICAgICAgICAgICAgICAgIG1FbGVtZW50YXJ5UElELCBieXRlc1dyaXR0ZW4pOwotICAgICAgICBtZW1jcHkobUJ1ZmZlci0+ZGF0YSgpLCBtRGVzY3JhbWJsZWRCdWZmZXItPmRhdGEoKSwgZGVzY3JhbWJsZUJ5dGVzKTsKKworICAgICAgICAvLyBTZXQgZGVzY3JhbWJsZUJ5dGVzIHRvIHRoZSByZXR1cm5lZCByZXN1bHQuCisgICAgICAgIC8vIE5vdGUgdGhhdCB0aGlzIG1pZ2h0IGJlIHNtYWxsZXIgdGhhbiB0aGUgdG90YWwgbGVuZ3RoIG9mIGlucHV0IGRhdGEuCisgICAgICAgIC8vIChlZy4gd2hlbiB3ZSdyZSBkZXNjcmFtYmxpbmcgdGhlIFBFUyBoZWFkZXIgcG9ydGlvbiBvZiBhIHNlY3VyZSBzdHJlYW0sCisgICAgICAgIC8vIHRoZSBwbHVnaW4gbWlnaHQgY3V0IGl0IG9mZiByaWdodCBhZnRlciB0aGUgUEVTIGhlYWRlci4pCisgICAgICAgIGRlc2NyYW1ibGVCeXRlcyA9IGJ5dGVzV3JpdHRlbjsKICAgICB9CiAKKyAgICAvLyB8YnVmZmVyfCBwb2ludHMgdG8gdGhlIGJ1ZmZlciBmcm9tIHdoaWNoIHdlJ2QgcGFyc2UgdGhlIFBFUyBoZWFkZXIuCisgICAgLy8gV2hlbiB0aGUgb3V0cHV0IHN0cmVhbSBpcyBzY3JhbWJsZWQsIGl0IHBvaW50cyB0byBtRGVzY3JhbWJsZWRCdWZmZXIKKyAgICAvLyAodW5sZXNzIGFsbCBwYWNrZXRzIGluIHRoaXMgUEVTIGFyZSBhY3R1YWxseSBjbGVhciwgaW4gd2hpY2ggY2FzZSwKKyAgICAvLyBpdCBwb2ludHMgdG8gbUJ1ZmZlciBzaW5jZSB3ZSBuZXZlciBjb3BpZWQgaW50byBtRGVzY3JhbWJsZWRCdWZmZXIpLgorICAgIC8vIFdoZW4gdGhlIG91dHB1dCBzdHJlYW0gaXMgY2xlYXIsIGl0IHBvaW50cyB0byBtQnVmZmVyLCBhbmQgd2UnbGwKKyAgICAvLyBjb3B5IGFsbCBkZXNjcmFtYmxlZCBkYXRhIGJhY2sgdG8gbUJ1ZmZlci4KKyAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSBtQnVmZmVyOwogICAgIGlmIChtUXVldWUtPmlzU2NyYW1ibGVkKCkpIHsKICAgICAgICAgLy8gUXVldWUgc3ViU2FtcGxlIGluZm8gZm9yIHNjcmFtYmxlZCBxdWV1ZQogICAgICAgICBzcDxBQnVmZmVyPiBjbGVhclNpemVzQnVmZmVyID0gbmV3IEFCdWZmZXIobVN1YlNhbXBsZXMuc2l6ZSgpICogNCk7CkBAIC0xNDY0LDggKzE1MTgsNyBAQAogICAgICAgICBmb3IgKGF1dG8gaXQgPSBtU3ViU2FtcGxlcy5iZWdpbigpOwogICAgICAgICAgICAgICAgIGl0ICE9IG1TdWJTYW1wbGVzLmVuZCgpOyBpdCsrLCBpKyspIHsKICAgICAgICAgICAgIGlmICgoaXQtPnRyYW5zcG9ydF9zY3JhbWJsaW5nX21vZGUgPT0gMAotICAgICAgICAgICAgICAgICAgICAmJiBwZXNTY3JhbWJsaW5nQ29udHJvbCA9PSAwKQotICAgICAgICAgICAgICAgICAgICB8fCBpIDwgZGVzY3JhbWJsZVN1YlNhbXBsZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgJiYgcGVzU2NyYW1ibGluZ0NvbnRyb2wgPT0gMCkpIHsKICAgICAgICAgICAgICAgICBjbGVhclNpemVQdHJbaV0gPSBpdC0+c3ViU2FtcGxlU2l6ZTsKICAgICAgICAgICAgICAgICBlbmNTaXplUHRyW2ldID0gMDsKICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC0xNDc0LDE0ICsxNTI3LDI5IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpc1N5bmMgfD0gaXQtPnJhbmRvbV9hY2Nlc3NfaW5kaWNhdG9yOwogICAgICAgICB9CisKKyAgICAgICAgLy8gSWYgc2NyYW1ibGVkIGF0IFBFUy1sZXZlbCwgUEVTIGhlYWRlciBpcyBpbiB0aGUgY2xlYXIKKyAgICAgICAgaWYgKHBlc1NjcmFtYmxpbmdDb250cm9sICE9IDApIHsKKyAgICAgICAgICAgIGNsZWFyU2l6ZVB0clswXSA9IHBlc09mZnNldDsKKyAgICAgICAgICAgIGVuY1NpemVQdHJbMF0gLT0gcGVzT2Zmc2V0OworICAgICAgICB9CiAgICAgICAgIC8vIFBhc3MgdGhlIG9yaWdpbmFsIFRTIHN1YnNhbXBsZSBzaXplIG5vdy4gVGhlIFBFUyBoZWFkZXIgYWRqdXN0CiAgICAgICAgIC8vIHdpbGwgYmUgYXBwbGllZCB3aGVuIHRoZSBzY3JhbWJsZWQgQVUgaXMgZGVxdWV1ZWQuCisgICAgICAgIC8vIE5vdGUgdGhhdCBpZiBkZXNjcmFtYmxlQnl0ZXMgaXMgMCwgaXQgbWVhbnMgdGhpcyBQRVMgY29udGFpbnMgb25seQorICAgICAgICAvLyBhbGwgdHMgcGFja2V0cywgbGVhZGluZ0NsZWFyQnl0ZXMgaXMgZW50aXJlIGJ1ZmZlciBzaXplLgogICAgICAgICBtUXVldWUtPmFwcGVuZFNjcmFtYmxlZERhdGEoCi0gICAgICAgICAgICAgICAgbUJ1ZmZlci0+ZGF0YSgpLCBtQnVmZmVyLT5zaXplKCksIHNjdHJsLAotICAgICAgICAgICAgICAgIGlzU3luYywgY2xlYXJTaXplc0J1ZmZlciwgZW5jU2l6ZXNCdWZmZXIpOworICAgICAgICAgICAgICAgIG1CdWZmZXItPmRhdGEoKSwgbUJ1ZmZlci0+c2l6ZSgpLAorICAgICAgICAgICAgICAgIChkZXNjcmFtYmxlQnl0ZXMgPiAwKSA/IGRlc2NyYW1ibGVCeXRlcyA6IG1CdWZmZXItPnNpemUoKSwKKyAgICAgICAgICAgICAgICBzY3RybCwgaXNTeW5jLCBjbGVhclNpemVzQnVmZmVyLCBlbmNTaXplc0J1ZmZlcik7CisKKyAgICAgICAgaWYgKGRlc2NyYW1ibGVCeXRlcyA+IDApIHsKKyAgICAgICAgICAgIGJ1ZmZlciA9IG1EZXNjcmFtYmxlZEJ1ZmZlcjsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIG1lbWNweShtQnVmZmVyLT5kYXRhKCksIG1EZXNjcmFtYmxlZEJ1ZmZlci0+ZGF0YSgpLCBkZXNjcmFtYmxlQnl0ZXMpOwogICAgIH0KIAotICAgIEFCaXRSZWFkZXIgYnIobUJ1ZmZlci0+ZGF0YSgpLCBtQnVmZmVyLT5zaXplKCkpOworICAgIEFCaXRSZWFkZXIgYnIoYnVmZmVyLT5kYXRhKCksIGJ1ZmZlci0+c2l6ZSgpKTsKICAgICBzdGF0dXNfdCBlcnIgPSBwYXJzZVBFUygmYnIsIGV2ZW50KTsKIAogICAgIGlmIChlcnIgIT0gT0spIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQVRTUGFyc2VyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FUU1BhcnNlci5oCmluZGV4IDQ1Y2EwNmIuLjllY2UyMWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQVRTUGFyc2VyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BVFNQYXJzZXIuaApAQCAtMTQyLDYgKzE0Miw3IEBACiAgICAgICAgIFNUUkVBTVRZUEVfTVBFRzJfVklERU8gICAgICAgICAgPSAweDAyLAogICAgICAgICBTVFJFQU1UWVBFX01QRUcxX0FVRElPICAgICAgICAgID0gMHgwMywKICAgICAgICAgU1RSRUFNVFlQRV9NUEVHMl9BVURJTyAgICAgICAgICA9IDB4MDQsCisgICAgICAgIFNUUkVBTVRZUEVfUEVTX1BSSVZBVEVfREFUQSAgICAgPSAweDA2LAogICAgICAgICBTVFJFQU1UWVBFX01QRUcyX0FVRElPX0FEVFMgICAgID0gMHgwZiwKICAgICAgICAgU1RSRUFNVFlQRV9NUEVHNF9WSURFTyAgICAgICAgICA9IDB4MTAsCiAgICAgICAgIFNUUkVBTVRZUEVfTUVUQURBVEEgICAgICAgICAgICAgPSAweDE1LApAQCAtMTUzLDYgKzE1NCw3IEBACiAgICAgICAgIC8vIFN0cmVhbSB0eXBlIDB4ODMgaXMgbm9uLXN0YW5kYXJkLAogICAgICAgICAvLyBpdCBjb3VsZCBiZSBMUENNIG9yIFRydWVIRCBBQzMKICAgICAgICAgU1RSRUFNVFlQRV9MUENNX0FDMyAgICAgICAgICAgICA9IDB4ODMsCisgICAgICAgIFNUUkVBTVRZUEVfRUFDMyAgICAgICAgICAgICAgICAgPSAweDg3LAogCiAgICAgICAgIC8vU2FtcGxlIEVuY3J5cHRlZCB0eXBlcwogICAgICAgICBTVFJFQU1UWVBFX0gyNjRfRU5DUllQVEVEICAgICAgID0gMHhEQiwKQEAgLTE2MCw2ICsxNjIsMjAgQEAKICAgICAgICAgU1RSRUFNVFlQRV9BQzNfRU5DUllQVEVEICAgICAgICA9IDB4QzEsCiAgICAgfTsKIAorICAgIGVudW0geworICAgICAgICAvLyBGcm9tIElTTy9JRUMgMTM4MTgtMTogMjAwNyAoRSksIFRhYmxlIDItMjkKKyAgICAgICAgREVTQ1JJUFRPUl9DQSAgICAgICAgICAgICAgICAgICA9IDB4MDksCisKKyAgICAgICAgLy8gRFZCIEJsdWVCb29rIEEwMzggVGFibGUgMTIKKyAgICAgICAgREVTQ1JJUFRPUl9EVkJfRVhURU5TSU9OICAgICAgICA9IDB4N0YsCisgICAgfTsKKworICAgIC8vIERWQiBCbHVlQm9vayBBMDM4IFRhYmxlIDEwOQorICAgIGVudW0geworICAgICAgICBFWFRfREVTQ1JJUFRPUl9EVkJfQUM0ICAgICAgICAgICAgICA9IDB4MTUsCisgICAgICAgIEVYVF9ERVNDUklQVE9SX0RWQl9SRVNFUlZFRF9NQVggICAgID0gMHg3RiwKKyAgICB9OworCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+QVRTUGFyc2VyKCk7CiAKQEAgLTE2OSwxMSArMTg1LDE5IEBACiAgICAgc3RydWN0IFBTSVNlY3Rpb247CiAgICAgc3RydWN0IENhc01hbmFnZXI7CiAgICAgc3RydWN0IENBRGVzY3JpcHRvciB7Ci0gICAgICAgIGludDMyX3QgbVN5c3RlbUlEOworICAgICAgICBDQURlc2NyaXB0b3IoKSA6IG1QSUQoMCksIG1TeXN0ZW1JRCgtMSkge30KICAgICAgICAgdW5zaWduZWQgbVBJRDsKKyAgICAgICAgaW50MzJfdCBtU3lzdGVtSUQ7CiAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IG1Qcml2YXRlRGF0YTsKICAgICB9OwogCisgICAgc3RydWN0IFN0cmVhbUluZm8geworICAgICAgICB1bnNpZ25lZCBtVHlwZTsKKyAgICAgICAgdW5zaWduZWQgbVR5cGVFeHQ7CisgICAgICAgIHVuc2lnbmVkIG1QSUQ7CisgICAgICAgIENBRGVzY3JpcHRvciBtQ0FEZXNjcmlwdG9yOworICAgIH07CisKICAgICBzcDxDYXNNYW5hZ2VyPiBtQ2FzTWFuYWdlcjsKIAogICAgIHVpbnQzMl90IG1GbGFnczsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQW5kcm9pZC5icAppbmRleCBmYmYxNDk2Li43ZTAwZWI4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BbmRyb2lkLmJwCkBAIC0zOCw2ICszOCwxMCBAQAogICAgICAgICAiYW5kcm9pZC5oaWRsLm1lbW9yeUAxLjAiLAogICAgIF0sCiAKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibWVkaWFfbmRrX2hlYWRlcnMiLAorICAgIF0sCisKICAgICB3aG9sZV9zdGF0aWNfbGliczogWwogICAgICAgICAibGlic3RhZ2VmcmlnaHRfbWV0YWRhdGF1dGlscyIsCiAgICAgXSwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQW5vdGhlclBhY2tldFNvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0Fub3RoZXJQYWNrZXRTb3VyY2UuY3BwCmluZGV4IGVjZTA2OTIuLjllMTU0YTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQW5vdGhlclBhY2tldFNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9Bbm90aGVyUGFja2V0U291cmNlLmNwcApAQCAtMjI2LDYgKzIyNiw3IEBACiAgICAgICAgIGludDMyX3QgY3J5cHRvTW9kZTsKICAgICAgICAgaWYgKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50MzIoImNyeXB0b01vZGUiLCAmY3J5cHRvTW9kZSkpIHsKICAgICAgICAgICAgIGludDMyX3QgY3J5cHRvS2V5OworICAgICAgICAgICAgaW50MzJfdCBwZXNPZmZzZXQ7CiAgICAgICAgICAgICBzcDxBQnVmZmVyPiBjbGVhckJ5dGVzQnVmZmVyLCBlbmNCeXRlc0J1ZmZlcjsKIAogICAgICAgICAgICAgQ0hFQ0soYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQzMigiY3J5cHRvS2V5IiwgJmNyeXB0b0tleSkpOwpAQCAtMjMzLDYgKzIzNCw4IEBACiAgICAgICAgICAgICAgICAgICAgICYmIGNsZWFyQnl0ZXNCdWZmZXIgIT0gTlVMTCk7CiAgICAgICAgICAgICBDSEVDSyhidWZmZXItPm1ldGEoKS0+ZmluZEJ1ZmZlcigiZW5jQnl0ZXMiLCAmZW5jQnl0ZXNCdWZmZXIpCiAgICAgICAgICAgICAgICAgICAgICYmIGVuY0J5dGVzQnVmZmVyICE9IE5VTEwpOworICAgICAgICAgICAgQ0hFQ0soYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQzMigicGVzT2Zmc2V0IiwgJnBlc09mZnNldCkKKyAgICAgICAgICAgICAgICAgICAgJiYgKHBlc09mZnNldCA+PSAwKSAmJiAocGVzT2Zmc2V0IDwgNjU1MzYpKTsKIAogICAgICAgICAgICAgYnVmbWV0YS5zZXRJbnQzMihrS2V5Q3J5cHRvTW9kZSwgY3J5cHRvTW9kZSk7CiAKQEAgLTI0MCw2ICsyNDMsMTEgQEAKICAgICAgICAgICAgIGJ1Zm1ldGEuc2V0RGF0YShrS2V5Q3J5cHRvSVYsIDAsIGFycmF5LCAxNik7CiAKICAgICAgICAgICAgIGFycmF5WzBdID0gKHVpbnQ4X3QpIChjcnlwdG9LZXkgJiAweGZmKTsKKyAgICAgICAgICAgIC8vIGFycmF5WzFdIGNvbnRhaW5zIFBFUyBoZWFkZXIgZmxhZywgd2hpY2ggd2UgZG9uJ3QgdXNlLgorICAgICAgICAgICAgLy8gYXJyYXlbMn4zXSBjb250YWluIHRoZSBQRVMgb2Zmc2V0LgorICAgICAgICAgICAgYXJyYXlbMl0gPSAodWludDhfdCkgKHBlc09mZnNldCAmIDB4ZmYpOworICAgICAgICAgICAgYXJyYXlbM10gPSAodWludDhfdCkgKChwZXNPZmZzZXQgPj4gOCkgJiAweGZmKTsKKwogICAgICAgICAgICAgYnVmbWV0YS5zZXREYXRhKGtLZXlDcnlwdG9LZXksIDAsIGFycmF5LCAxNik7CiAKICAgICAgICAgICAgIGJ1Zm1ldGEuc2V0RGF0YShrS2V5UGxhaW5TaXplcywgMCwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvRVNRdWV1ZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0VTUXVldWUuY3BwCmluZGV4IDBmYTlmY2IuLmZiOGI5ZmQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvRVNRdWV1ZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9FU1F1ZXVlLmNwcApAQCAtODYsNiArODYsMjEgQEAKICAgICBtQ2FzU2Vzc2lvbklkID0gc2Vzc2lvbklkOwogfQogCitzdGF0aWMgaW50MzJfdCByZWFkVmFyaWFibGVCaXRzKEFCaXRSZWFkZXIgJmJpdHMsIGludDMyX3QgbmJpdHMpIHsKKyAgICBpbnQzMl90IHZhbHVlID0gMDsKKyAgICBpbnQzMl90IG1vcmVfYml0cyA9IDE7CisKKyAgICB3aGlsZSAobW9yZV9iaXRzKSB7CisgICAgICAgIHZhbHVlICs9IGJpdHMuZ2V0Qml0cyhuYml0cyk7CisgICAgICAgIG1vcmVfYml0cyA9IGJpdHMuZ2V0Qml0cygxKTsKKyAgICAgICAgaWYgKCFtb3JlX2JpdHMpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgdmFsdWUrKzsKKyAgICAgICAgdmFsdWUgPDw9IG5iaXRzOworICAgIH0KKyAgICByZXR1cm4gdmFsdWU7Cit9CisKIC8vIFBhcnNlIEFDMyBoZWFkZXIgYXNzdW1pbmcgdGhlIGN1cnJlbnQgcHRyIGlzIHN0YXJ0IHBvc2l0aW9uIG9mIHN5bmNmcmFtZSwKIC8vIHVwZGF0ZSBtZXRhZGF0YSBvbmx5IGFwcGxpY2FibGUsIGFuZCByZXR1cm4gdGhlIHBheWxvYWQgc2l6ZQogc3RhdGljIHVuc2lnbmVkIHBhcnNlQUMzU3luY0ZyYW1lKApAQCAtMTk1LDggKzIxMCwxNTMgQEAKICAgICByZXR1cm4gcGF5bG9hZFNpemU7CiB9CiAKLXN0YXRpYyBib29sIElzU2VlbWluZ2x5VmFsaWRBQzNIZWFkZXIoY29uc3QgdWludDhfdCAqcHRyLCBzaXplX3Qgc2l6ZSkgewotICAgIHJldHVybiBwYXJzZUFDM1N5bmNGcmFtZShwdHIsIHNpemUsIE5VTEwpID4gMDsKKy8vIFBhcnNlIEVBQzMgaGVhZGVyIGFzc3VtaW5nIHRoZSBjdXJyZW50IHB0ciBpcyBzdGFydCBwb3NpdGlvbiBvZiBzeW5jZnJhbWUsCisvLyB1cGRhdGUgbWV0YWRhdGEgb25seSBhcHBsaWNhYmxlLCBhbmQgcmV0dXJuIHRoZSBwYXlsb2FkIHNpemUKKy8vIEFUU0MgQS81MjoyMDEyIEUyLjMuMQorc3RhdGljIHVuc2lnbmVkIHBhcnNlRUFDM1N5bmNGcmFtZSgKKyAgICBjb25zdCB1aW50OF90ICpwdHIsIHNpemVfdCBzaXplLCBzcDxNZXRhRGF0YT4gKm1ldGFEYXRhKSB7CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYW5uZWxDb3VudFRhYmxlW10gPSB7MiwgMSwgMiwgMywgMywgNCwgNCwgNX07CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNhbXBsaW5nUmF0ZVRhYmxlW10gPSB7NDgwMDAsIDQ0MTAwLCAzMjAwMH07CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNhbXBsaW5nUmF0ZVRhYmxlMltdID0gezI0MDAwLCAyMjA1MCwgMTYwMDB9OworCisgICAgQUJpdFJlYWRlciBiaXRzKHB0ciwgc2l6ZSk7CisgICAgaWYgKGJpdHMubnVtQml0c0xlZnQoKSA8IDE2KSB7CisgICAgICAgIEFMT0dFKCJOb3QgZW5vdWdoIGJpdHMgbGVmdCBmb3IgZnVydGhlciBwYXJzaW5nIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoYml0cy5nZXRCaXRzKDE2KSAhPSAweDBCNzcpIHsKKyAgICAgICAgQUxPR0UoIk5vIHZhbGlkIHN5bmMgd29yZCBpbiBFQUMzIGhlYWRlciIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvLyB3ZSBwYXJzZSB1cCB0byBic2lkIHNvIHRoZXJlIG5lZWRzIHRvIGJlIGF0IGxlYXN0IHRoYXQgbWFueSBiaXRzCisgICAgaWYgKGJpdHMubnVtQml0c0xlZnQoKSA8IDIgKyAzICsgMTEgKyAyICsgMiArIDMgKyAxICsgNSkgeworICAgICAgICBBTE9HRSgiTm90IGVub3VnaCBiaXRzIGxlZnQgZm9yIGZ1cnRoZXIgcGFyc2luZyIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICB1bnNpZ25lZCBzdHJtdHlwID0gYml0cy5nZXRCaXRzKDIpOworICAgIGlmIChzdHJtdHlwID09IDMpIHsKKyAgICAgICAgQUxPR0UoIkluY29ycmVjdCBzdHJtdHlwIGluIEVBQzMgaGVhZGVyIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHVuc2lnbmVkIHN1YnN0cmVhbWlkID0gYml0cy5nZXRCaXRzKDMpOworICAgIC8vIG9ubHkgdGhlIGZpcnN0IGluZGVwZW5kZW50IHN0cmVhbSBpcyBzdXBwb3J0ZWQKKyAgICBpZiAoKHN0cm10eXAgPT0gMCB8fCBzdHJtdHlwID09IDIpICYmIHN1YnN0cmVhbWlkICE9IDApCisgICAgICAgIHJldHVybiAwOworCisgICAgdW5zaWduZWQgZnJtc2l6ID0gYml0cy5nZXRCaXRzKDExKTsKKyAgICB1bnNpZ25lZCBmc2NvZCA9IGJpdHMuZ2V0Qml0cygyKTsKKworICAgIHVuc2lnbmVkIHNhbXBsaW5nUmF0ZSA9IDA7CisgICAgaWYgKGZzY29kID09IDB4MykgeworICAgICAgICB1bnNpZ25lZCBmc2NvZDIgPSBiaXRzLmdldEJpdHMoMik7CisgICAgICAgIGlmIChmc2NvZDIgPT0gMykgeworICAgICAgICAgICAgQUxPR1coIkluY29ycmVjdCBmc2NvZDIgaW4gRUFDMyBoZWFkZXIiKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIHNhbXBsaW5nUmF0ZSA9IHNhbXBsaW5nUmF0ZVRhYmxlMltmc2NvZDJdOworICAgIH0gZWxzZSB7CisgICAgICAgIHNhbXBsaW5nUmF0ZSA9IHNhbXBsaW5nUmF0ZVRhYmxlW2ZzY29kXTsKKyAgICAgICAgdW5zaWduZWQgbnVtYmxrc2NvZCBfX3VudXNlZCA9IGJpdHMuZ2V0Qml0cygyKTsKKyAgICB9CisKKyAgICB1bnNpZ25lZCBhY21vZCA9IGJpdHMuZ2V0Qml0cygzKTsKKyAgICB1bnNpZ25lZCBsZmVvbiA9IGJpdHMuZ2V0Qml0cygxKTsKKyAgICB1bnNpZ25lZCBic2lkID0gYml0cy5nZXRCaXRzKDUpOworICAgIGlmIChic2lkIDwgMTEgfHwgYnNpZCA+IDE2KSB7CisgICAgICAgIEFMT0dXKCJJbmNvcnJlY3QgYnNpZCBpbiBFQUMzIGhlYWRlci4gQ291bGQgYmUgQUMtMyBvciBzb21lIHVua25vd24gRUFDMyBmb3JtYXQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLy8gd2UgY3VycmVudGx5IG9ubHkgc3VwcG9ydCB0aGUgZmlyc3QgaW5kZXBlbmRhbnQgc3RyZWFtCisgICAgaWYgKG1ldGFEYXRhICE9IE5VTEwgJiYgKHN0cm10eXAgPT0gMCB8fCBzdHJtdHlwID09IDIpKSB7CisgICAgICAgIHVuc2lnbmVkIGNoYW5uZWxDb3VudCA9IGNoYW5uZWxDb3VudFRhYmxlW2FjbW9kXSArIGxmZW9uOworICAgICAgICBBTE9HVigiRUFDMyBjaGFubmVsQ291bnQgPSAlZCIsIGNoYW5uZWxDb3VudCk7CisgICAgICAgIEFMT0dWKCJFQUMzIHNhbXBsaW5nUmF0ZSA9ICVkIiwgc2FtcGxpbmdSYXRlKTsKKyAgICAgICAgKCptZXRhRGF0YSktPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19FQUMzKTsKKyAgICAgICAgKCptZXRhRGF0YSktPnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsIGNoYW5uZWxDb3VudCk7CisgICAgICAgICgqbWV0YURhdGEpLT5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgc2FtcGxpbmdSYXRlKTsKKyAgICAgICAgKCptZXRhRGF0YSktPnNldEludDMyKGtLZXlJc1N5bmNGcmFtZSwgMSk7CisgICAgfQorCisgICAgdW5zaWduZWQgcGF5bG9hZFNpemUgPSBmcm1zaXogKyAxOworICAgIHBheWxvYWRTaXplIDw8PSAxOyAgLy8gY29udmVydCBmcm9tIDE2LWJpdCB3b3JkcyB0byBieXRlcworCisgICAgcmV0dXJuIHBheWxvYWRTaXplOworfQorCisvLyBQYXJzZSBBQzQgaGVhZGVyIGFzc3VtaW5nIHRoZSBjdXJyZW50IHB0ciBpcyBzdGFydCBwb3NpdGlvbiBvZiBzeW5jZnJhbWUKKy8vIGFuZCB1cGRhdGUgZnJhbWVTaXplIGFuZCBtZXRhZGF0YS4KK3N0YXRpYyBzdGF0dXNfdCBwYXJzZUFDNFN5bmNGcmFtZSgKKyAgICAgICAgY29uc3QgdWludDhfdCAqcHRyLCBzaXplX3Qgc2l6ZSwgdW5zaWduZWQgJmZyYW1lU2l6ZSwgc3A8TWV0YURhdGE+ICptZXRhRGF0YSkgeworICAgIC8vIEVUU0kgVFMgMTAzIDE5MC0yIFYxLjEuMSAoMjAxNS0wOSksIEFubmV4IEMKKyAgICAvLyBUaGUgc3luY193b3JkIGNhbiBiZSBlaXRoZXIgMHhBQzQwIG9yIDB4QUM0MS4KKyAgICBzdGF0aWMgY29uc3QgaW50IGtTeW5jV29yZEFDNDAgPSAweEFDNDA7CisgICAgc3RhdGljIGNvbnN0IGludCBrU3luY1dvcmRBQzQxID0gMHhBQzQxOworCisgICAgc2l6ZV90IGhlYWRlclNpemUgPSAwOworICAgIEFCaXRSZWFkZXIgYml0cyhwdHIsIHNpemUpOworICAgIGludDMyX3Qgc3luY1dvcmQgPSBiaXRzLmdldEJpdHMoMTYpOworICAgIGlmICgoc3luY1dvcmQgIT0ga1N5bmNXb3JkQUM0MCkgJiYgKHN5bmNXb3JkICE9IGtTeW5jV29yZEFDNDEpKSB7CisgICAgICAgIEFMT0dFKCJJbnZhbGlkIHN5bmN3b3JkIGluIEFDNCBoZWFkZXIiKTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisgICAgaGVhZGVyU2l6ZSArPSAyOworCisgICAgZnJhbWVTaXplID0gYml0cy5nZXRCaXRzKDE2KTsKKyAgICBoZWFkZXJTaXplICs9IDI7CisgICAgaWYgKGZyYW1lU2l6ZSA9PSAweEZGRkYpIHsKKyAgICAgICAgZnJhbWVTaXplID0gYml0cy5nZXRCaXRzKDI0KTsKKyAgICAgICAgaGVhZGVyU2l6ZSArPSAzOworICAgIH0KKworICAgIGlmIChmcmFtZVNpemUgPT0gMCkgeworICAgICAgICBBTE9HRSgiSW52YWxpZCBmcmFtZSBzaXplIGluIEFDNCBoZWFkZXIiKTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisgICAgZnJhbWVTaXplICs9IGhlYWRlclNpemU7CisgICAgLy8gSWYgdGhlIHN5bmNfd29yZCBpcyAweEFDNDEsIGEgY3JjX3dvcmQgaXMgYWxzbyB0cmFuc21pdHRlZC4KKyAgICBpZiAoc3luY1dvcmQgPT0ga1N5bmNXb3JkQUM0MSkgeworICAgICAgICBmcmFtZVNpemUgKz0gMjsgLy8gY3JjX3dvcmQKKyAgICB9CisgICAgQUxPR1YoIkFDNCBmcmFtZVNpemUgPSAldSIsIGZyYW1lU2l6ZSk7CisKKyAgICAvLyBFVFNJIFRTIDEwMyAxOTAtMiBWMS4xLjEgNi4yLjEuMQorICAgIHVpbnQzMl90IGJpdHN0cmVhbVZlcnNpb24gPSBiaXRzLmdldEJpdHMoMik7CisgICAgaWYgKGJpdHN0cmVhbVZlcnNpb24gPT0gMykgeworICAgICAgICBiaXRzdHJlYW1WZXJzaW9uICs9IHJlYWRWYXJpYWJsZUJpdHMoYml0cywgMik7CisgICAgfQorCisgICAgYml0cy5za2lwQml0cygxMCk7IC8vIFNlcXVlbmNlIENvdW50ZXIKKworICAgIHVpbnQzMl90IGJXYWl0RnJhbWVzID0gYml0cy5nZXRCaXRzKDEpOworICAgIGlmIChiV2FpdEZyYW1lcykgeworICAgICAgICB1aW50MzJfdCB3YWl0RnJhbWVzID0gYml0cy5nZXRCaXRzKDMpOworICAgICAgICBpZiAod2FpdEZyYW1lcyA+IDApIHsKKyAgICAgICAgICAgIGJpdHMuc2tpcEJpdHMoMik7IC8vIGJyX2NvZGU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBFVFNJIFRTIDEwMyAxOTAgVjEuMS4xIFRhYmxlIDgyCisgICAgYm9vbCBmc0luZGV4ID0gYml0cy5nZXRCaXRzKDEpOworICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSA9IGZzSW5kZXggPyA0ODAwMCA6IDQ0MTAwOworCisgICAgaWYgKG1ldGFEYXRhICE9IE5VTEwpIHsKKyAgICAgICAgQUxPR1YoImRlcXVldWVBY2Nlc3NVbml0QUM0IFNldHRpbmcgbUZvcm1hdCIpOworICAgICAgICAoKm1ldGFEYXRhKS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX0FDNCk7CisgICAgICAgICgqbWV0YURhdGEpLT5zZXRJbnQzMihrS2V5SXNTeW5jRnJhbWUsIDEpOworICAgICAgICAvLyBbRklYTUVdIEFDNCBjaGFubmVsIGNvdW50IGlzIGRlZmluZWQgcGVyIHByZXNlbnRhdGlvbi4gUHJvdmlkZSBhIGRlZmF1bHQgY2hhbm5lbCBjb3VudAorICAgICAgICAvLyBhcyBzdGVyZW8gZm9yIHRoZSBlbnRpcmUgc3RyZWFtLgorICAgICAgICAoKm1ldGFEYXRhKS0+c2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgMik7CisgICAgICAgICgqbWV0YURhdGEpLT5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgc2FtcGxpbmdSYXRlKTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0aWMgc3RhdHVzX3QgSXNTZWVtaW5nbHlWYWxpZEFDNEhlYWRlcihjb25zdCB1aW50OF90ICpwdHIsIHNpemVfdCBzaXplLCB1bnNpZ25lZCAmZnJhbWVTaXplKSB7CisgICAgcmV0dXJuIHBhcnNlQUM0U3luY0ZyYW1lKHB0ciwgc2l6ZSwgZnJhbWVTaXplLCBOVUxMKTsKIH0KIAogc3RhdGljIGJvb2wgSXNTZWVtaW5nbHlWYWxpZEFEVFNIZWFkZXIoCkBAIC0yNzksNyArNDM5LDggQEAKICAgICAgICAgQUxPR0UoImFwcGVuZGluZyBkYXRhIGFmdGVyIEVPUyIpOwogICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgIH0KLSAgICBpZiAobUJ1ZmZlciA9PSBOVUxMIHx8IG1CdWZmZXItPnNpemUoKSA9PSAwKSB7CisKKyAgICBpZiAoIWlzU2NyYW1ibGVkKCkgJiYgKG1CdWZmZXIgPT0gTlVMTCB8fCBtQnVmZmVyLT5zaXplKCkgPT0gMCkpIHsKICAgICAgICAgc3dpdGNoIChtTW9kZSkgewogICAgICAgICAgICAgY2FzZSBIMjY0OgogICAgICAgICAgICAgY2FzZSBNUEVHX1ZJREVPOgpAQCAtMzkwLDEyICs1NTEsMTkgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgY2FzZSBBQzM6CisgICAgICAgICAgICBjYXNlIEVBQzM6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgdWludDhfdCAqcHRyID0gKHVpbnQ4X3QgKilkYXRhOwogCiAgICAgICAgICAgICAgICAgc3NpemVfdCBzdGFydE9mZnNldCA9IC0xOwogICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChJc1NlZW1pbmdseVZhbGlkQUMzSGVhZGVyKCZwdHJbaV0sIHNpemUgLSBpKSkgeworICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBwYXlsb2FkU2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgIGlmIChtTW9kZSA9PSBBQzMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWRTaXplID0gcGFyc2VBQzNTeW5jRnJhbWUoJnB0cltpXSwgc2l6ZSAtIGksIE5VTEwpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1Nb2RlID09IEVBQzMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWRTaXplID0gcGFyc2VFQUMzU3luY0ZyYW1lKCZwdHJbaV0sIHNpemUgLSBpLCBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAocGF5bG9hZFNpemUgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydE9mZnNldCA9IGk7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgfQpAQCAtNDA2LDcgKzU3NCw3IEBACiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgaWYgKHN0YXJ0T2Zmc2V0ID4gMCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HSSgiZm91bmQgc29tZXRoaW5nIHJlc2VtYmxpbmcgYW4gQUMzIHN5bmN3b3JkIGF0ICIKKyAgICAgICAgICAgICAgICAgICAgQUxPR0koImZvdW5kIHNvbWV0aGluZyByZXNlbWJsaW5nIGFuIChFKUFDMyBzeW5jd29yZCBhdCAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJvZmZzZXQgJXpkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRPZmZzZXQpOwogICAgICAgICAgICAgICAgIH0KQEAgLTQxNiw2ICs1ODQsNDMgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgY2FzZSBBQzQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCAqcHRyID0gKHVpbnQ4X3QgKilkYXRhOworICAgICAgICAgICAgICAgIHVuc2lnbmVkIGZyYW1lU2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgc3NpemVfdCBzdGFydE9mZnNldCA9IC0xOworCisgICAgICAgICAgICAgICAgLy8gQSB2YWxpZCBBQzQgc3RyZWFtIHNob3VsZCBoYXZlIG1pbmltdW0gb2YgNyBieXRlcyBpbiBpdHMgYnVmZmVyLgorICAgICAgICAgICAgICAgIC8vIChTeW5jIGhlYWRlciA0IGJ5dGVzICsgQUM0IHRvYyAzIGJ5dGVzKQorICAgICAgICAgICAgICAgIGlmIChzaXplIDwgNykgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7ICsraSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoSXNTZWVtaW5nbHlWYWxpZEFDNEhlYWRlcigmcHRyW2ldLCBzaXplIC0gaSwgZnJhbWVTaXplKSA9PSBPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRPZmZzZXQgPSBpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoc3RhcnRPZmZzZXQgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHN0YXJ0T2Zmc2V0ID4gMCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HSSgiZm91bmQgc29tZXRoaW5nIHJlc2VtYmxpbmcgYW4gQUM0IHN5bmN3b3JkIGF0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIm9mZnNldCAlemQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydE9mZnNldCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChmcmFtZVNpemUgIT0gc2l6ZSAtIHN0YXJ0T2Zmc2V0KSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJBQzQgZnJhbWUgc2l6ZSBpcyAldSBieXRlcywgd2hpbGUgdGhlIGJ1ZmZlciBzaXplIGlzICV6ZCBieXRlcy4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZVNpemUsIHNpemUgLSBzdGFydE9mZnNldCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGF0YSA9ICZwdHJbc3RhcnRPZmZzZXRdOworICAgICAgICAgICAgICAgIHNpemUgLT0gc3RhcnRPZmZzZXQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGNhc2UgTVBFR19BVURJTzoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICB1aW50OF90ICpwdHIgPSAodWludDhfdCAqKWRhdGE7CkBAIC00OTQsNiArNjk5LDcgQEAKIAogdm9pZCBFbGVtZW50YXJ5U3RyZWFtUXVldWU6OmFwcGVuZFNjcmFtYmxlZERhdGEoCiAgICAgICAgIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplLAorICAgICAgICBzaXplX3QgbGVhZGluZ0NsZWFyQnl0ZXMsCiAgICAgICAgIGludDMyX3Qga2V5SWQsIGJvb2wgaXNTeW5jLAogICAgICAgICBzcDxBQnVmZmVyPiBjbGVhclNpemVzLCBzcDxBQnVmZmVyPiBlbmNTaXplcykgewogICAgIGlmICghaXNTY3JhbWJsZWQoKSkgewpAQCAtNTIxLDYgKzcyNyw3IEBACiAKICAgICBTY3JhbWJsZWRSYW5nZUluZm8gc2NyYW1ibGVkSW5mbzsKICAgICBzY3JhbWJsZWRJbmZvLm1MZW5ndGggPSBzaXplOworICAgIHNjcmFtYmxlZEluZm8ubUxlYWRpbmdDbGVhckJ5dGVzID0gbGVhZGluZ0NsZWFyQnl0ZXM7CiAgICAgc2NyYW1ibGVkSW5mby5tS2V5SWQgPSBrZXlJZDsKICAgICBzY3JhbWJsZWRJbmZvLm1Jc1N5bmMgPSBpc1N5bmM7CiAgICAgc2NyYW1ibGVkSW5mby5tQ2xlYXJTaXplcyA9IGNsZWFyU2l6ZXM7CkBAIC01MzMsNyArNzQwLDYgQEAKIAogc3A8QUJ1ZmZlcj4gRWxlbWVudGFyeVN0cmVhbVF1ZXVlOjpkZXF1ZXVlU2NyYW1ibGVkQWNjZXNzVW5pdCgpIHsKICAgICBzaXplX3QgbmV4dFNjYW4gPSBtQnVmZmVyLT5zaXplKCk7Ci0gICAgbUJ1ZmZlci0+c2V0UmFuZ2UoMCwgMCk7CiAgICAgaW50MzJfdCBwZXNPZmZzZXQgPSAwLCBwZXNTY3JhbWJsaW5nQ29udHJvbCA9IDA7CiAgICAgaW50NjRfdCB0aW1lVXMgPSBmZXRjaFRpbWVzdGFtcChuZXh0U2NhbiwgJnBlc09mZnNldCwgJnBlc1NjcmFtYmxpbmdDb250cm9sKTsKICAgICBpZiAodGltZVVzIDwgMGxsKSB7CkBAIC01NDQsNiArNzUwLDcgQEAKICAgICAvLyByZXR1cm4gc2NyYW1ibGVkIHVuaXQKICAgICBpbnQzMl90IGtleUlkID0gcGVzU2NyYW1ibGluZ0NvbnRyb2wsIGlzU3luYyA9IDAsIHNjcmFtYmxlZExlbmd0aCA9IDA7CiAgICAgc3A8QUJ1ZmZlcj4gY2xlYXJTaXplcywgZW5jU2l6ZXM7CisgICAgc2l6ZV90IGxlYWRpbmdDbGVhckJ5dGVzOwogICAgIHdoaWxlIChtU2NyYW1ibGVkUmFuZ2VJbmZvcy5zaXplKCkgPiBtUmFuZ2VJbmZvcy5zaXplKCkpIHsKICAgICAgICAgYXV0byBpdCA9IG1TY3JhbWJsZWRSYW5nZUluZm9zLmJlZ2luKCk7CiAgICAgICAgIEFMT0dWKCJbc3RyZWFtICVkXSBmZXRjaGluZyBzY3JhbWJsZWQgcmFuZ2U6IHNpemU9JXp1IiwgbU1vZGUsIGl0LT5tTGVuZ3RoKTsKQEAgLTU2MSw2ICs3NjgsNyBAQAogICAgICAgICBjbGVhclNpemVzID0gaXQtPm1DbGVhclNpemVzOwogICAgICAgICBlbmNTaXplcyA9IGl0LT5tRW5jU2l6ZXM7CiAgICAgICAgIGlzU3luYyA9IGl0LT5tSXNTeW5jOworICAgICAgICBsZWFkaW5nQ2xlYXJCeXRlcyA9IGl0LT5tTGVhZGluZ0NsZWFyQnl0ZXM7CiAgICAgICAgIG1TY3JhbWJsZWRSYW5nZUluZm9zLmVyYXNlKGl0KTsKICAgICB9CiAgICAgaWYgKHNjcmFtYmxlZExlbmd0aCA9PSAwKSB7CkBAIC01NjgsMjYgKzc3Niw3NCBAQAogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKLSAgICAvLyBza2lwIHRoZSBQRVMgaGVhZGVyLCBhbmQgY29weSB0aGUgcmVzdCBpbnRvIHNjcmFtYmxlZCBhY2Nlc3MgdW5pdAotICAgIHNwPEFCdWZmZXI+IHNjcmFtYmxlZEFjY2Vzc1VuaXQgPSBBQnVmZmVyOjpDcmVhdGVBc0NvcHkoCi0gICAgICAgICAgICBtU2NyYW1ibGVkQnVmZmVyLT5kYXRhKCkgKyBwZXNPZmZzZXQsCi0gICAgICAgICAgICBzY3JhbWJsZWRMZW5ndGggLSBwZXNPZmZzZXQpOwotCi0gICAgLy8gZml4IHVwIGZpcnN0IHNhbXBsZSBzaXplIGFmdGVyIHNraXBwaW5nIHRoZSBQRVMgaGVhZGVyCi0gICAgaWYgKHBlc09mZnNldCA+IDApIHsKLSAgICAgICAgaW50MzJfdCAmZmlyc3RDbGVhclNpemUgPSAqKGludDMyX3QqKWNsZWFyU2l6ZXMtPmRhdGEoKTsKLSAgICAgICAgaW50MzJfdCAmZmlyc3RFbmNTaXplID0gKihpbnQzMl90KillbmNTaXplcy0+ZGF0YSgpOwotICAgICAgICAvLyBDdXQgYXdheSB0aGUgUEVTIGhlYWRlcgotICAgICAgICBpZiAoZmlyc3RDbGVhclNpemUgPj0gcGVzT2Zmc2V0KSB7Ci0gICAgICAgICAgICAvLyBUaGlzIGlzIGZvciBUUy1sZXZlbCBzY3JhbWJsaW5nLCB3ZSBkZXNjcmFtYmxlZCB0aGUgZmlyc3QKLSAgICAgICAgICAgIC8vIChvciBpdCB3YXMgY2xlYXIgdG8gYmVnaW4gd2l0aCkKLSAgICAgICAgICAgIGZpcnN0Q2xlYXJTaXplIC09IHBlc09mZnNldDsKLSAgICAgICAgfSBlbHNlIGlmIChmaXJzdEVuY1NpemUgPj0gcGVzT2Zmc2V0KSB7Ci0gICAgICAgICAgICAvLyBUaGlzIGNhbiBvbmx5IGJlIFBFUy1sZXZlbCBzY3JhbWJsaW5nCi0gICAgICAgICAgICBmaXJzdEVuY1NpemUgLT0gcGVzT2Zmc2V0OwotICAgICAgICB9CisgICAgLy8gUmV0cmlldmUgdGhlIGxlYWRpbmcgY2xlYXIgYnl0ZXMgaW5mbywgYW5kIHVzZSBpdCB0byBzZXQgdGhlIGNsZWFyCisgICAgLy8gcmFuZ2Ugb24gbUJ1ZmZlci4gTm90ZSB0aGF0IHRoZSBsZWFkaW5nIGNsZWFyIGJ5dGVzIGluY2x1ZGVzIHRoZQorICAgIC8vIFBFUyBoZWFkZXIgcG9ydGlvbiwgd2hpbGUgbUJ1ZmZlciBkb2Vzbid0LgorICAgIGlmICgoaW50MzJfdClsZWFkaW5nQ2xlYXJCeXRlcyA+IHBlc09mZnNldCkgeworICAgICAgICBtQnVmZmVyLT5zZXRSYW5nZSgwLCBsZWFkaW5nQ2xlYXJCeXRlcyAtIHBlc09mZnNldCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUJ1ZmZlci0+c2V0UmFuZ2UoMCwgMCk7CiAgICAgfQogCisgICAgLy8gVHJ5IHRvIHBhcnNlIGZvcm1hdHMsIGFuZCBpZiB1bmF2YWlsYWJsZSBzZXQgdXAgYSBkdW1teSBmb3JtYXQuCisgICAgLy8gT25seSBzdXBwb3J0IHRoZSBmb2xsb3dpbmcgbW9kZXMgZm9yIHNjcmFtYmxlZCBjb250ZW50IGZvciBub3cuCisgICAgLy8gKHdpbGwgYmUgZXhwYW5kZWQgbGF0ZXIpLgorICAgIGlmIChtRm9ybWF0ID09IE5VTEwpIHsKKyAgICAgICAgbUZvcm1hdCA9IG5ldyBNZXRhRGF0YTsKKyAgICAgICAgc3dpdGNoIChtTW9kZSkgeworICAgICAgICAgICAgY2FzZSBIMjY0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghTWFrZUFWQ0NvZGVjU3BlY2lmaWNEYXRhKAorICAgICAgICAgICAgICAgICAgICAgICAgKm1Gb3JtYXQsIG1CdWZmZXItPmRhdGEoKSwgbUJ1ZmZlci0+c2l6ZSgpKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HSSgiQ3JlYXRpbmcgZHVtbXkgQVZDIGZvcm1hdCBmb3Igc2NyYW1ibGVkIGNvbnRlbnQiKTsKKworICAgICAgICAgICAgICAgICAgICBtRm9ybWF0LT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKTsKKyAgICAgICAgICAgICAgICAgICAgbUZvcm1hdC0+c2V0SW50MzIoa0tleVdpZHRoLCAxMjgwKTsKKyAgICAgICAgICAgICAgICAgICAgbUZvcm1hdC0+c2V0SW50MzIoa0tleUhlaWdodCwgNzIwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIEFBQzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIU1ha2VBQUNDb2RlY1NwZWNpZmljRGF0YSgKKyAgICAgICAgICAgICAgICAgICAgICAgICptRm9ybWF0LCBtQnVmZmVyLT5kYXRhKCksIG1CdWZmZXItPnNpemUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0koIkNyZWF0aW5nIGR1bW15IEFBQyBmb3JtYXQgZm9yIHNjcmFtYmxlZCBjb250ZW50Iik7CisKKyAgICAgICAgICAgICAgICAgICAgTWFrZUFBQ0NvZGVjU3BlY2lmaWNEYXRhKCptRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgLypwcm9maWxlKi8sIDcgLypzYW1wbGluZ19mcmVxX2luZGV4Ki8sIDEgLypjaGFubmVsX2NvbmZpZyovKTsKKyAgICAgICAgICAgICAgICAgICAgbUZvcm1hdC0+c2V0SW50MzIoa0tleUlzQURUUywgdHJ1ZSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIE1QRUdfVklERU86CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQUxPR0koIkNyZWF0aW5nIGR1bW15IE1QRUcgZm9ybWF0IGZvciBzY3JhbWJsZWQgY29udGVudCIpOworCisgICAgICAgICAgICAgICAgbUZvcm1hdC0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUcyKTsKKyAgICAgICAgICAgICAgICBtRm9ybWF0LT5zZXRJbnQzMihrS2V5V2lkdGgsIDEyODApOworICAgICAgICAgICAgICAgIG1Gb3JtYXQtPnNldEludDMyKGtLZXlIZWlnaHQsIDcyMCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFMT0dFKCJVbmtub3duIG1vZGUgZm9yIHNjcmFtYmxlZCBjb250ZW50Iik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBmb3IgTWVkaWFFeHRyYWN0b3IuQ2FzSW5mbworICAgICAgICBtRm9ybWF0LT5zZXRJbnQzMihrS2V5Q0FTeXN0ZW1JRCwgbUNBU3lzdGVtSWQpOworICAgICAgICBtRm9ybWF0LT5zZXREYXRhKGtLZXlDQVNlc3Npb25JRCwKKyAgICAgICAgICAgICAgICAwLCBtQ2FzU2Vzc2lvbklkLmRhdGEoKSwgbUNhc1Nlc3Npb25JZC5zaXplKCkpOworICAgIH0KKworICAgIG1CdWZmZXItPnNldFJhbmdlKDAsIDApOworCisgICAgLy8gY29weSBpbnRvIHNjcmFtYmxlZCBhY2Nlc3MgdW5pdAorICAgIHNwPEFCdWZmZXI+IHNjcmFtYmxlZEFjY2Vzc1VuaXQgPSBBQnVmZmVyOjpDcmVhdGVBc0NvcHkoCisgICAgICAgICAgICBtU2NyYW1ibGVkQnVmZmVyLT5kYXRhKCksIHNjcmFtYmxlZExlbmd0aCk7CisKICAgICBzY3JhbWJsZWRBY2Nlc3NVbml0LT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCB0aW1lVXMpOwogICAgIGlmIChpc1N5bmMpIHsKICAgICAgICAgc2NyYW1ibGVkQWNjZXNzVW5pdC0+bWV0YSgpLT5zZXRJbnQzMigiaXNTeW5jIiwgMSk7CkBAIC02MDAsNiArODU2LDcgQEAKICAgICBzY3JhbWJsZWRBY2Nlc3NVbml0LT5tZXRhKCktPnNldEludDMyKCJjcnlwdG9LZXkiLCBrZXlJZCk7CiAgICAgc2NyYW1ibGVkQWNjZXNzVW5pdC0+bWV0YSgpLT5zZXRCdWZmZXIoImNsZWFyQnl0ZXMiLCBjbGVhclNpemVzKTsKICAgICBzY3JhbWJsZWRBY2Nlc3NVbml0LT5tZXRhKCktPnNldEJ1ZmZlcigiZW5jQnl0ZXMiLCBlbmNTaXplcyk7CisgICAgc2NyYW1ibGVkQWNjZXNzVW5pdC0+bWV0YSgpLT5zZXRJbnQzMigicGVzT2Zmc2V0IiwgcGVzT2Zmc2V0KTsKIAogICAgIG1lbW1vdmUobVNjcmFtYmxlZEJ1ZmZlci0+ZGF0YSgpLAogICAgICAgICAgICAgbVNjcmFtYmxlZEJ1ZmZlci0+ZGF0YSgpICsgc2NyYW1ibGVkTGVuZ3RoLApAQCAtNjE0LDcgKzg3MSwxMSBAQAogfQogCiBzcDxBQnVmZmVyPiBFbGVtZW50YXJ5U3RyZWFtUXVldWU6OmRlcXVldWVBY2Nlc3NVbml0KCkgewotICAgIGlmICgobUZsYWdzICYga0ZsYWdfQWxpZ25lZERhdGEpICYmIG1Nb2RlID09IEgyNjQgJiYgIWlzU2NyYW1ibGVkKCkpIHsKKyAgICBpZiAoaXNTY3JhbWJsZWQoKSkgeworICAgICAgICByZXR1cm4gZGVxdWV1ZVNjcmFtYmxlZEFjY2Vzc1VuaXQoKTsKKyAgICB9CisKKyAgICBpZiAoKG1GbGFncyAmIGtGbGFnX0FsaWduZWREYXRhKSAmJiBtTW9kZSA9PSBIMjY0KSB7CiAgICAgICAgIGlmIChtUmFuZ2VJbmZvcy5lbXB0eSgpKSB7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQpAQCAtNjQ4LDcgKzkwOSwxMCBAQAogICAgICAgICBjYXNlIEFBQzoKICAgICAgICAgICAgIHJldHVybiBkZXF1ZXVlQWNjZXNzVW5pdEFBQygpOwogICAgICAgICBjYXNlIEFDMzoKLSAgICAgICAgICAgIHJldHVybiBkZXF1ZXVlQWNjZXNzVW5pdEFDMygpOworICAgICAgICBjYXNlIEVBQzM6CisgICAgICAgICAgICByZXR1cm4gZGVxdWV1ZUFjY2Vzc1VuaXRFQUMzKCk7CisgICAgICAgIGNhc2UgQUM0OgorICAgICAgICAgICAgcmV0dXJuIGRlcXVldWVBY2Nlc3NVbml0QUM0KCk7CiAgICAgICAgIGNhc2UgTVBFR19WSURFTzoKICAgICAgICAgICAgIHJldHVybiBkZXF1ZXVlQWNjZXNzVW5pdE1QRUdWaWRlbygpOwogICAgICAgICBjYXNlIE1QRUc0X1ZJREVPOgpAQCAtNjY2LDM0ICs5MzAsMzggQEAKICAgICB9CiB9CiAKLXNwPEFCdWZmZXI+IEVsZW1lbnRhcnlTdHJlYW1RdWV1ZTo6ZGVxdWV1ZUFjY2Vzc1VuaXRBQzMoKSB7CitzcDxBQnVmZmVyPiBFbGVtZW50YXJ5U3RyZWFtUXVldWU6OmRlcXVldWVBY2Nlc3NVbml0RUFDMygpIHsKICAgICB1bnNpZ25lZCBzeW5jU3RhcnRQb3MgPSAwOyAgLy8gaW4gYnl0ZXMKICAgICB1bnNpZ25lZCBwYXlsb2FkU2l6ZSA9IDA7CiAgICAgc3A8TWV0YURhdGE+IGZvcm1hdCA9IG5ldyBNZXRhRGF0YTsKIAotICAgIEFMT0dWKCJkZXF1ZXVlQWNjZXNzVW5pdF9BQzNbJWRdOiBtQnVmZmVyICVwKCV6dSkiLCBtQVVJbmRleCwgbUJ1ZmZlci0+ZGF0YSgpLCBtQnVmZmVyLT5zaXplKCkpOworICAgIEFMT0dWKCJkZXF1ZXVlQWNjZXNzVW5pdEVBQzNbJWRdOiBtQnVmZmVyICVwKCV6dSkiLCBtQVVJbmRleCwKKyAgICAgICAgICAgIG1CdWZmZXItPmRhdGEoKSwgbUJ1ZmZlci0+c2l6ZSgpKTsKIAogICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgIGlmIChzeW5jU3RhcnRQb3MgKyAyID49IG1CdWZmZXItPnNpemUoKSkgewogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KIAotICAgICAgICBwYXlsb2FkU2l6ZSA9IHBhcnNlQUMzU3luY0ZyYW1lKAotICAgICAgICAgICAgICAgIG1CdWZmZXItPmRhdGEoKSArIHN5bmNTdGFydFBvcywKLSAgICAgICAgICAgICAgICBtQnVmZmVyLT5zaXplKCkgLSBzeW5jU3RhcnRQb3MsCi0gICAgICAgICAgICAgICAgJmZvcm1hdCk7CisgICAgICAgIHVpbnQ4X3QgKnB0ciA9IG1CdWZmZXItPmRhdGEoKSArIHN5bmNTdGFydFBvczsKKyAgICAgICAgc2l6ZV90IHNpemUgPSBtQnVmZmVyLT5zaXplKCkgLSBzeW5jU3RhcnRQb3M7CisgICAgICAgIGlmIChtTW9kZSA9PSBBQzMpIHsKKyAgICAgICAgICAgIHBheWxvYWRTaXplID0gcGFyc2VBQzNTeW5jRnJhbWUocHRyLCBzaXplLCAmZm9ybWF0KTsKKyAgICAgICAgfSBlbHNlIGlmIChtTW9kZSA9PSBFQUMzKSB7CisgICAgICAgICAgICBwYXlsb2FkU2l6ZSA9IHBhcnNlRUFDM1N5bmNGcmFtZShwdHIsIHNpemUsICZmb3JtYXQpOworICAgICAgICB9CiAgICAgICAgIGlmIChwYXlsb2FkU2l6ZSA+IDApIHsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKLSAgICAgICAgQUxPR1YoImRlcXVldWVBY2Nlc3NVbml0X0FDM1slZF06IHN5bmNTdGFydFBvcyAldSBwYXlsb2FkU2l6ZSAldSIsCisgICAgICAgIEFMT0dWKCJkZXF1ZXVlQWNjZXNzVW5pdEVBQzNbJWRdOiBzeW5jU3RhcnRQb3MgJXUgcGF5bG9hZFNpemUgJXUiLAogICAgICAgICAgICAgICAgIG1BVUluZGV4LCBzeW5jU3RhcnRQb3MsIHBheWxvYWRTaXplKTsKIAogICAgICAgICArK3N5bmNTdGFydFBvczsKICAgICB9CiAKICAgICBpZiAobUJ1ZmZlci0+c2l6ZSgpIDwgc3luY1N0YXJ0UG9zICsgcGF5bG9hZFNpemUpIHsKLSAgICAgICAgQUxPR1YoIk5vdCBlbm91Z2ggYnVmZmVyIHNpemUgZm9yIEFDMyIpOworICAgICAgICBBTE9HVigiTm90IGVub3VnaCBidWZmZXIgc2l6ZSBmb3IgRS9BQzMiKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCkBAIC03MDEsNyArOTY5LDYgQEAKICAgICAgICAgbUZvcm1hdCA9IGZvcm1hdDsKICAgICB9CiAKLQogICAgIGludDY0X3QgdGltZVVzID0gZmV0Y2hUaW1lc3RhbXAoc3luY1N0YXJ0UG9zICsgcGF5bG9hZFNpemUpOwogICAgIGlmICh0aW1lVXMgPCAwbGwpIHsKICAgICAgICAgQUxPR0UoIm5lZ2F0aXZlIHRpbWVVcyIpOwpAQCAtNzEwLDcgKzk3NywxMiBAQAogCiAgICAgLy8gTm90IGRlY3J5cHRpbmcgaWYga2V5IGluZm8gbm90IGF2YWlsYWJsZSAoZS5nLiwgc2Nhbm5lci9leHRyYWN0b3IgcGFyc2luZyB0cyBmaWxlcykKICAgICBpZiAobVNhbXBsZURlY3J5cHRvciAhPSBOVUxMKSB7Ci0gICAgICAgIG1TYW1wbGVEZWNyeXB0b3ItPnByb2Nlc3NBQzMobUJ1ZmZlci0+ZGF0YSgpICsgc3luY1N0YXJ0UG9zLCBwYXlsb2FkU2l6ZSk7CisgICAgICAgIGlmIChtTW9kZSA9PSBBQzMpIHsKKyAgICAgICAgICAgIG1TYW1wbGVEZWNyeXB0b3ItPnByb2Nlc3NBQzMobUJ1ZmZlci0+ZGF0YSgpICsgc3luY1N0YXJ0UG9zLCBwYXlsb2FkU2l6ZSk7CisgICAgICAgIH0gZWxzZSBpZiAobU1vZGUgPT0gRUFDMykgeworICAgICAgICAgICAgQUxPR0UoIkVBQzMgQVUgaXMgZW5jcnlwdGVkIGFuZCBkZWNyeXB0aW9uIGlzIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CiAgICAgfQogICAgIG1BVUluZGV4Kys7CiAKQEAgLTczMCw2ICsxMDAyLDY5IEBACiAgICAgcmV0dXJuIGFjY2Vzc1VuaXQ7CiB9CiAKK3NwPEFCdWZmZXI+IEVsZW1lbnRhcnlTdHJlYW1RdWV1ZTo6ZGVxdWV1ZUFjY2Vzc1VuaXRBQzQoKSB7CisgICAgdW5zaWduZWQgc3luY1N0YXJ0UG9zID0gMDsKKyAgICB1bnNpZ25lZCBwYXlsb2FkU2l6ZSA9IDA7CisgICAgc3A8TWV0YURhdGE+IGZvcm1hdCA9IG5ldyBNZXRhRGF0YTsKKyAgICBBTE9HVigiZGVxdWV1ZUFjY2Vzc1VuaXRfQUM0WyVkXTogbUJ1ZmZlciAlcCglenUpIiwgbUFVSW5kZXgsIG1CdWZmZXItPmRhdGEoKSwgbUJ1ZmZlci0+c2l6ZSgpKTsKKworICAgIC8vIEEgdmFsaWQgQUM0IHN0cmVhbSBzaG91bGQgaGF2ZSBtaW5pbXVtIG9mIDcgYnl0ZXMgaW4gaXRzIGJ1ZmZlci4KKyAgICAvLyAoU3luYyBoZWFkZXIgNCBieXRlcyArIEFDNCB0b2MgMyBieXRlcykKKyAgICBpZiAobUJ1ZmZlci0+c2l6ZSgpIDwgNykgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBpZiAoc3luY1N0YXJ0UG9zICsgMiA+PSBtQnVmZmVyLT5zaXplKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcGFyc2VBQzRTeW5jRnJhbWUoCisgICAgICAgICAgICAgICAgICAgIG1CdWZmZXItPmRhdGEoKSArIHN5bmNTdGFydFBvcywKKyAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlci0+c2l6ZSgpIC0gc3luY1N0YXJ0UG9zLAorICAgICAgICAgICAgICAgICAgICBwYXlsb2FkU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgJmZvcm1hdCk7CisgICAgICAgIGlmIChzdGF0dXMgPT0gT0spIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgQUxPR1YoImRlcXVldWVBY2Nlc3NVbml0X0FDNFslZF06IHN5bmNTdGFydFBvcyAldSBwYXlsb2FkU2l6ZSAldSIsCisgICAgICAgICAgICAgICAgbUFVSW5kZXgsIHN5bmNTdGFydFBvcywgcGF5bG9hZFNpemUpOworCisgICAgICAgICsrc3luY1N0YXJ0UG9zOworICAgIH0KKworICAgIGlmIChtQnVmZmVyLT5zaXplKCkgPCBzeW5jU3RhcnRQb3MgKyBwYXlsb2FkU2l6ZSkgeworICAgICAgICBBTE9HVigiTm90IGVub3VnaCBidWZmZXIgc2l6ZSBmb3IgQUM0Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGlmIChtRm9ybWF0ID09IE5VTEwpIHsKKyAgICAgICAgbUZvcm1hdCA9IGZvcm1hdDsKKyAgICB9CisKKyAgICBpbnQ2NF90IHRpbWVVcyA9IGZldGNoVGltZXN0YW1wKHN5bmNTdGFydFBvcyArIHBheWxvYWRTaXplKTsKKyAgICBpZiAodGltZVVzIDwgMGxsKSB7CisgICAgICAgIEFMT0dFKCJuZWdhdGl2ZSB0aW1lVXMiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIG1BVUluZGV4Kys7CisKKyAgICBzcDxBQnVmZmVyPiBhY2Nlc3NVbml0ID0gbmV3IEFCdWZmZXIoc3luY1N0YXJ0UG9zICsgcGF5bG9hZFNpemUpOworICAgIG1lbWNweShhY2Nlc3NVbml0LT5kYXRhKCksIG1CdWZmZXItPmRhdGEoKSwgc3luY1N0YXJ0UG9zICsgcGF5bG9hZFNpemUpOworCisgICAgYWNjZXNzVW5pdC0+bWV0YSgpLT5zZXRJbnQ2NCgidGltZVVzIiwgdGltZVVzKTsKKyAgICBhY2Nlc3NVbml0LT5tZXRhKCktPnNldEludDMyKCJpc1N5bmMiLCAxKTsKKworICAgIG1lbW1vdmUoCisgICAgICAgICAgICBtQnVmZmVyLT5kYXRhKCksCisgICAgICAgICAgICBtQnVmZmVyLT5kYXRhKCkgKyBzeW5jU3RhcnRQb3MgKyBwYXlsb2FkU2l6ZSwKKyAgICAgICAgICAgIG1CdWZmZXItPnNpemUoKSAtIHN5bmNTdGFydFBvcyAtIHBheWxvYWRTaXplKTsKKworICAgIG1CdWZmZXItPnNldFJhbmdlKDAsIG1CdWZmZXItPnNpemUoKSAtIHN5bmNTdGFydFBvcyAtIHBheWxvYWRTaXplKTsKKyAgICByZXR1cm4gYWNjZXNzVW5pdDsKK30KKwogc3A8QUJ1ZmZlcj4gRWxlbWVudGFyeVN0cmVhbVF1ZXVlOjpkZXF1ZXVlQWNjZXNzVW5pdFBDTUF1ZGlvKCkgewogICAgIGlmIChtQnVmZmVyLT5zaXplKCkgPCA0KSB7CiAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtODUxLDI1ICsxMTg2LDExIEBACiAgICAgICAgIGJvb2wgcHJvdGVjdGlvbl9hYnNlbnQgPSBiaXRzLmdldEJpdHMoMSkgIT0gMDsKIAogICAgICAgICBpZiAobUZvcm1hdCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICB1bnNpZ25lZCBwcm9maWxlID0gYml0cy5nZXRCaXRzKDIpOwotICAgICAgICAgICAgaWYgKHByb2ZpbGUgPT0gM3UpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgicHJvZmlsZSBzaG91bGQgbm90IGJlIDMiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHVuc2lnbmVkIHNhbXBsaW5nX2ZyZXFfaW5kZXggPSBiaXRzLmdldEJpdHMoNCk7Ci0gICAgICAgICAgICBiaXRzLmdldEJpdHMoMSk7ICAvLyBwcml2YXRlX2JpdAotICAgICAgICAgICAgdW5zaWduZWQgY2hhbm5lbF9jb25maWd1cmF0aW9uID0gYml0cy5nZXRCaXRzKDMpOwotICAgICAgICAgICAgaWYgKGNoYW5uZWxfY29uZmlndXJhdGlvbiA9PSAwdSkgewotICAgICAgICAgICAgICAgIEFMT0dFKCJjaGFubmVsX2NvbmZpZyBzaG91bGQgbm90IGJlIDAiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJpdHMuc2tpcEJpdHMoMik7ICAvLyBvcmlnaW5hbF9jb3B5LCBob21lCi0KICAgICAgICAgICAgIG1Gb3JtYXQgPSBuZXcgTWV0YURhdGE7Ci0gICAgICAgICAgICBNYWtlQUFDQ29kZWNTcGVjaWZpY0RhdGEoKm1Gb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgIHByb2ZpbGUsIHNhbXBsaW5nX2ZyZXFfaW5kZXgsIGNoYW5uZWxfY29uZmlndXJhdGlvbik7Ci0KLSAgICAgICAgICAgIG1Gb3JtYXQtPnNldEludDMyKGtLZXlJc0FEVFMsIHRydWUpOworICAgICAgICAgICAgaWYgKCFNYWtlQUFDQ29kZWNTcGVjaWZpY0RhdGEoCisgICAgICAgICAgICAgICAgICAgICptRm9ybWF0LCBtQnVmZmVyLT5kYXRhKCkgKyBvZmZzZXQsIG1CdWZmZXItPnNpemUoKSAtIG9mZnNldCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaW50MzJfdCBzYW1wbGVSYXRlOwogICAgICAgICAgICAgaW50MzJfdCBudW1DaGFubmVsczsKQEAgLTg4NCwxMiArMTIwNSwxMiBAQAogCiAgICAgICAgICAgICBBTE9HSSgiZm91bmQgQUFDIGNvZGVjIGNvbmZpZyAoJWQgSHosICVkIGNoYW5uZWxzKSIsCiAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsIG51bUNoYW5uZWxzKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIHByb2ZpbGVfT2JqZWN0VHlwZSwgc2FtcGxpbmdfZnJlcXVlbmN5X2luZGV4LCBwcml2YXRlX2JpdHMsCi0gICAgICAgICAgICAvLyBjaGFubmVsX2NvbmZpZ3VyYXRpb24sIG9yaWdpbmFsX2NvcHksIGhvbWUKLSAgICAgICAgICAgIGJpdHMuc2tpcEJpdHMoMTIpOwogICAgICAgICB9CiAKKyAgICAgICAgLy8gcHJvZmlsZV9PYmplY3RUeXBlLCBzYW1wbGluZ19mcmVxdWVuY3lfaW5kZXgsIHByaXZhdGVfYml0cywKKyAgICAgICAgLy8gY2hhbm5lbF9jb25maWd1cmF0aW9uLCBvcmlnaW5hbF9jb3B5LCBob21lCisgICAgICAgIGJpdHMuc2tpcEJpdHMoMTIpOworCiAgICAgICAgIC8vIGFkdHNfdmFyaWFibGVfaGVhZGVyCiAKICAgICAgICAgLy8gY29weXJpZ2h0X2lkZW50aWZpY2F0aW9uX2JpdCwgY29weXJpZ2h0X2lkZW50aWZpY2F0aW9uX3N0YXJ0CkBAIC0xMDA0LDI3ICsxMzI1LDYgQEAKIH0KIAogc3A8QUJ1ZmZlcj4gRWxlbWVudGFyeVN0cmVhbVF1ZXVlOjpkZXF1ZXVlQWNjZXNzVW5pdEgyNjQoKSB7Ci0gICAgaWYgKGlzU2NyYW1ibGVkKCkpIHsKLSAgICAgICAgaWYgKG1CdWZmZXIgPT0gTlVMTCB8fCBtQnVmZmVyLT5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1Gb3JtYXQgPT0gTlVMTCkgewotICAgICAgICAgICAgbUZvcm1hdCA9IG5ldyBNZXRhRGF0YTsKLSAgICAgICAgICAgIGlmICghTWFrZUFWQ0NvZGVjU3BlY2lmaWNEYXRhKCptRm9ybWF0LCBtQnVmZmVyLT5kYXRhKCksIG1CdWZmZXItPnNpemUoKSkpIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiQ3JlYXRpbmcgZHVtbXkgQVZDIGZvcm1hdCBmb3Igc2NyYW1ibGVkIGNvbnRlbnQiKTsKLSAgICAgICAgICAgICAgICBtRm9ybWF0ID0gbmV3IE1ldGFEYXRhOwotICAgICAgICAgICAgICAgIG1Gb3JtYXQtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpOwotICAgICAgICAgICAgICAgIG1Gb3JtYXQtPnNldEludDMyKGtLZXlXaWR0aCwgMTI4MCk7Ci0gICAgICAgICAgICAgICAgbUZvcm1hdC0+c2V0SW50MzIoa0tleUhlaWdodCwgNzIwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIGZvciBNZWRpYUV4dHJhY3Rvci5DYXNJbmZvCi0gICAgICAgICAgICBtRm9ybWF0LT5zZXRJbnQzMihrS2V5Q0FTeXN0ZW1JRCwgbUNBU3lzdGVtSWQpOwotICAgICAgICAgICAgbUZvcm1hdC0+c2V0RGF0YShrS2V5Q0FTZXNzaW9uSUQsIDAsCi0gICAgICAgICAgICAgICAgICAgIG1DYXNTZXNzaW9uSWQuZGF0YSgpLCBtQ2FzU2Vzc2lvbklkLnNpemUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGRlcXVldWVTY3JhbWJsZWRBY2Nlc3NVbml0KCk7Ci0gICAgfQotCiAgICAgY29uc3QgdWludDhfdCAqZGF0YSA9IG1CdWZmZXItPmRhdGEoKTsKIAogICAgIHNpemVfdCBzaXplID0gbUJ1ZmZlci0+c2l6ZSgpOwpAQCAtMTMyNCwyNSArMTYyNCw2IEBACiB9CiAKIHNwPEFCdWZmZXI+IEVsZW1lbnRhcnlTdHJlYW1RdWV1ZTo6ZGVxdWV1ZUFjY2Vzc1VuaXRNUEVHVmlkZW8oKSB7Ci0gICAgaWYgKGlzU2NyYW1ibGVkKCkpIHsKLSAgICAgICAgaWYgKG1CdWZmZXIgPT0gTlVMTCB8fCBtQnVmZmVyLT5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1Gb3JtYXQgPT0gTlVMTCkgewotICAgICAgICAgICAgQUxPR0koIkNyZWF0aW5nIGR1bW15IE1QRUcgZm9ybWF0IGZvciBzY3JhbWJsZWQgY29udGVudCIpOwotICAgICAgICAgICAgbUZvcm1hdCA9IG5ldyBNZXRhRGF0YTsKLSAgICAgICAgICAgIG1Gb3JtYXQtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHMik7Ci0gICAgICAgICAgICBtRm9ybWF0LT5zZXRJbnQzMihrS2V5V2lkdGgsIDEyODApOwotICAgICAgICAgICAgbUZvcm1hdC0+c2V0SW50MzIoa0tleUhlaWdodCwgNzIwKTsKLQotICAgICAgICAgICAgLy8gZm9yIE1lZGlhRXh0cmFjdG9yLkNhc0luZm8KLSAgICAgICAgICAgIG1Gb3JtYXQtPnNldEludDMyKGtLZXlDQVN5c3RlbUlELCBtQ0FTeXN0ZW1JZCk7Ci0gICAgICAgICAgICBtRm9ybWF0LT5zZXREYXRhKGtLZXlDQVNlc3Npb25JRCwgMCwKLSAgICAgICAgICAgICAgICAgICAgbUNhc1Nlc3Npb25JZC5kYXRhKCksIG1DYXNTZXNzaW9uSWQuc2l6ZSgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZGVxdWV1ZVNjcmFtYmxlZEFjY2Vzc1VuaXQoKTsKLSAgICB9Ci0KICAgICBjb25zdCB1aW50OF90ICpkYXRhID0gbUJ1ZmZlci0+ZGF0YSgpOwogICAgIHNpemVfdCBzaXplID0gbUJ1ZmZlci0+c2l6ZSgpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0VTUXVldWUuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvRVNRdWV1ZS5oCmluZGV4IGZmY2I1MDIuLjMyMjdmNDcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvRVNRdWV1ZS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvRVNRdWV1ZS5oCkBAIC0zOCw2ICszOCw4IEBACiAgICAgICAgIEgyNjQsCiAgICAgICAgIEFBQywKICAgICAgICAgQUMzLAorICAgICAgICBFQUMzLAorICAgICAgICBBQzQsCiAgICAgICAgIE1QRUdfQVVESU8sCiAgICAgICAgIE1QRUdfVklERU8sCiAgICAgICAgIE1QRUc0X1ZJREVPLApAQCAtNTksNiArNjEsNyBAQAogCiAgICAgdm9pZCBhcHBlbmRTY3JhbWJsZWREYXRhKAogICAgICAgICAgICAgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUsCisgICAgICAgICAgICBzaXplX3QgbGVhZGluZ0NsZWFyQnl0ZXMsCiAgICAgICAgICAgICBpbnQzMl90IGtleUlkLCBib29sIGlzU3luYywKICAgICAgICAgICAgIHNwPEFCdWZmZXI+IGNsZWFyU2l6ZXMsIHNwPEFCdWZmZXI+IGVuY1NpemVzKTsKIApAQCAtODQsOCArODcsOCBAQAogICAgIH07CiAKICAgICBzdHJ1Y3QgU2NyYW1ibGVkUmFuZ2VJbmZvIHsKLSAgICAgICAgLy9pbnQ2NF90IG1UaW1lc3RhbXBVczsKICAgICAgICAgc2l6ZV90IG1MZW5ndGg7CisgICAgICAgIHNpemVfdCBtTGVhZGluZ0NsZWFyQnl0ZXM7CiAgICAgICAgIGludDMyX3QgbUtleUlkOwogICAgICAgICBpbnQzMl90IG1Jc1N5bmM7CiAgICAgICAgIHNwPEFCdWZmZXI+IG1DbGVhclNpemVzOwpAQCAtMTE1LDcgKzExOCw4IEBACiAKICAgICBzcDxBQnVmZmVyPiBkZXF1ZXVlQWNjZXNzVW5pdEgyNjQoKTsKICAgICBzcDxBQnVmZmVyPiBkZXF1ZXVlQWNjZXNzVW5pdEFBQygpOwotICAgIHNwPEFCdWZmZXI+IGRlcXVldWVBY2Nlc3NVbml0QUMzKCk7CisgICAgc3A8QUJ1ZmZlcj4gZGVxdWV1ZUFjY2Vzc1VuaXRFQUMzKCk7CisgICAgc3A8QUJ1ZmZlcj4gZGVxdWV1ZUFjY2Vzc1VuaXRBQzQoKTsKICAgICBzcDxBQnVmZmVyPiBkZXF1ZXVlQWNjZXNzVW5pdE1QRUdBdWRpbygpOwogICAgIHNwPEFCdWZmZXI+IGRlcXVldWVBY2Nlc3NVbml0TVBFR1ZpZGVvKCk7CiAgICAgc3A8QUJ1ZmZlcj4gZGVxdWV1ZUFjY2Vzc1VuaXRNUEVHNFZpZGVvKCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudC5jcHAKaW5kZXggOTM1ZGMzNC4uZjlmN2VjMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9Tb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50LmNwcApAQCAtMTU0LDEyICsxNTQsMTIgQEAKICAgICBvdXREZWYtPmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aCA9IG91dHB1dEJ1ZmZlcldpZHRoKCk7CiAgICAgb3V0RGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0ID0gb3V0cHV0QnVmZmVySGVpZ2h0KCk7CiAgICAgb3V0RGVmLT5mb3JtYXQudmlkZW8uZUNvbG9yRm9ybWF0ID0gbU91dHB1dEZvcm1hdDsKLSAgICBvdXREZWYtPmZvcm1hdC52aWRlby5uU3RyaWRlID0gb3V0RGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGg7CiAgICAgb3V0RGVmLT5mb3JtYXQudmlkZW8ublNsaWNlSGVpZ2h0ID0gb3V0RGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0OwogCiAgICAgaW50MzJfdCBicHAgPSAobU91dHB1dEZvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyMTYpID8gMiA6IDE7CisgICAgb3V0RGVmLT5mb3JtYXQudmlkZW8ublN0cmlkZSA9IG91dERlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoICogYnBwOwogICAgIG91dERlZi0+bkJ1ZmZlclNpemUgPQotICAgICAgICAob3V0RGVmLT5mb3JtYXQudmlkZW8ublN0cmlkZSAqIG91dERlZi0+Zm9ybWF0LnZpZGVvLm5TbGljZUhlaWdodCAqIGJwcCAqIDMpIC8gMjsKKyAgICAgICAgICAgIChvdXREZWYtPmZvcm1hdC52aWRlby5uU3RyaWRlICogb3V0RGVmLT5mb3JtYXQudmlkZW8ublNsaWNlSGVpZ2h0ICogMykgLyAyOwogCiAgICAgT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSAqaW5EZWYgPSAmZWRpdFBvcnRJbmZvKGtJbnB1dFBvcnRJbmRleCktPm1EZWY7CiAgICAgaW5EZWYtPmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aCA9IG1XaWR0aDsKQEAgLTUwMiw3ICs1MDIsOCBAQAogICAgICAgICAgICAgLy8gVGhlc2UgdmFsdWVzIHdlcmUgY2hvc2VuIHRvIHByZXZlbnQgaW50ZWdlciBvdmVyZmxvd3MgZnVydGhlciBkb3duIHRoZSBsaW5lLCBhbmQgZG8KICAgICAgICAgICAgIC8vIG5vdCBpbmRpY2F0ZSBzdXBwb3J0IGZvciAzMmt4MzJrIHZpZGVvLgogICAgICAgICAgICAgaWYgKG5ld1dpZHRoID4gMzI3NjggfHwgbmV3SGVpZ2h0ID4gMzI3NjgKLSAgICAgICAgICAgICAgICAgICAgfHwgdmlkZW9fZGVmLT5uU3RyaWRlID4gMzI3NjggfHwgdmlkZW9fZGVmLT5uU2xpY2VIZWlnaHQgPiAzMjc2OCkgeworICAgICAgICAgICAgICAgICAgICB8fCB2aWRlb19kZWYtPm5TdHJpZGUgPiAzMjc2OCB8fCB2aWRlb19kZWYtPm5TdHJpZGUgPCAtMzI3NjgKKyAgICAgICAgICAgICAgICAgICAgfHwgdmlkZW9fZGVmLT5uU2xpY2VIZWlnaHQgPiAzMjc2OCkgewogICAgICAgICAgICAgICAgIEFMT0dFKCJiLzIyODg1NDIxIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvQ29udmVyc2lvbi5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9Db252ZXJzaW9uLmgKaW5kZXggYTlmY2U1NS4uMGYyMjlmNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9Db252ZXJzaW9uLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9Db252ZXJzaW9uLmgKQEAgLTE5MCw3ICsxOTAsMTIgQEAKICAqLwogLy8gY29udmVydDogU3RhdHVzIC0+IHN0YXR1c190CiBpbmxpbmUgc3RhdHVzX3QgdG9TdGF0dXNUKFJldHVybjxTdGF0dXM+IGNvbnN0JiB0KSB7Ci0gICAgcmV0dXJuIHQuaXNPaygpID8gdG9TdGF0dXNUKHN0YXRpY19jYXN0PFN0YXR1cz4odCkpIDogVU5LTk9XTl9FUlJPUjsKKyAgICBpZiAodC5pc09rKCkpIHsKKyAgICAgICAgcmV0dXJuIHRvU3RhdHVzVChzdGF0aWNfY2FzdDxTdGF0dXM+KHQpKTsKKyAgICB9IGVsc2UgaWYgKHQuaXNEZWFkT2JqZWN0KCkpIHsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKyAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKIH0KIAogLyoqCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvdGVzdHMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC90ZXN0cy9BbmRyb2lkLmJwCmluZGV4IGVmMzY5ODIuLjMxYmM4MzcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC90ZXN0cy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC90ZXN0cy9BbmRyb2lkLmJwCkBAIC0yOSw2ICsyOSw3IEBACiAKICAgICBoZWFkZXJfbGliczogWwogICAgICAgICAibGliYmFzZV9oZWFkZXJzIiwKKyAgICAgICAgIm1lZGlhX25ka19oZWFkZXJzIiwKICAgICBdLAogCiAgICAgY2ZsYWdzOiBbCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvdGVzdHMvT01YSGFybmVzcy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvdGVzdHMvT01YSGFybmVzcy5jcHAKaW5kZXggMTVhNzY1NS4uYzJmMTA3MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L3Rlc3RzL09NWEhhcm5lc3MuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC90ZXN0cy9PTVhIYXJuZXNzLmNwcApAQCAtMjksNyArMjksNiBAQAogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3IuaD4KICNpbmNsdWRlIDxtZWRpYS9NZWRpYVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL09NWEJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFNQQ29ubmVjdGlvbi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFNQQ29ubmVjdGlvbi5jcHAKaW5kZXggNTYyMGNmOC4uMzNjMWMxOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRTUENvbm5lY3Rpb24uY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUU1BDb25uZWN0aW9uLmNwcApAQCAtMTksNiArMTksNyBAQAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiAjaW5jbHVkZSAiQVJUU1BDb25uZWN0aW9uLmgiCisjaW5jbHVkZSAiTmV0d29ya1V0aWxzLmgiCiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgpAQCAtNTksOCArNjAsOCBAQAogICAgIGlmIChtU29ja2V0ID49IDApIHsKICAgICAgICAgQUxPR0UoIkNvbm5lY3Rpb24gaXMgc3RpbGwgb3BlbiwgY2xvc2luZyB0aGUgc29ja2V0LiIpOwogICAgICAgICBpZiAobVVJRFZhbGlkKSB7Ci0gICAgICAgICAgICBIVFRQQmFzZTo6VW5SZWdpc3RlclNvY2tldFVzZXJUYWcobVNvY2tldCk7Ci0gICAgICAgICAgICBIVFRQQmFzZTo6VW5SZWdpc3RlclNvY2tldFVzZXJNYXJrKG1Tb2NrZXQpOworICAgICAgICAgICAgTmV0d29ya1V0aWxzOjpVblJlZ2lzdGVyU29ja2V0VXNlclRhZyhtU29ja2V0KTsKKyAgICAgICAgICAgIE5ldHdvcmtVdGlsczo6VW5SZWdpc3RlclNvY2tldFVzZXJNYXJrKG1Tb2NrZXQpOwogICAgICAgICB9CiAgICAgICAgIGNsb3NlKG1Tb2NrZXQpOwogICAgICAgICBtU29ja2V0ID0gLTE7CkBAIC0yMTQsOCArMjE1LDggQEAKIAogICAgIGlmIChtU3RhdGUgIT0gRElTQ09OTkVDVEVEKSB7CiAgICAgICAgIGlmIChtVUlEVmFsaWQpIHsKLSAgICAgICAgICAgIEhUVFBCYXNlOjpVblJlZ2lzdGVyU29ja2V0VXNlclRhZyhtU29ja2V0KTsKLSAgICAgICAgICAgIEhUVFBCYXNlOjpVblJlZ2lzdGVyU29ja2V0VXNlck1hcmsobVNvY2tldCk7CisgICAgICAgICAgICBOZXR3b3JrVXRpbHM6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyVGFnKG1Tb2NrZXQpOworICAgICAgICAgICAgTmV0d29ya1V0aWxzOjpVblJlZ2lzdGVyU29ja2V0VXNlck1hcmsobVNvY2tldCk7CiAgICAgICAgIH0KICAgICAgICAgY2xvc2UobVNvY2tldCk7CiAgICAgICAgIG1Tb2NrZXQgPSAtMTsKQEAgLTI2Niw5ICsyNjcsOSBAQAogICAgIG1Tb2NrZXQgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19TVFJFQU0sIDApOwogCiAgICAgaWYgKG1VSURWYWxpZCkgewotICAgICAgICBIVFRQQmFzZTo6UmVnaXN0ZXJTb2NrZXRVc2VyVGFnKG1Tb2NrZXQsIG1VSUQsCisgICAgICAgIE5ldHdvcmtVdGlsczo6UmVnaXN0ZXJTb2NrZXRVc2VyVGFnKG1Tb2NrZXQsIG1VSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KSoodWludDMyX3QqKSAiUlRTUCIpOwotICAgICAgICBIVFRQQmFzZTo6UmVnaXN0ZXJTb2NrZXRVc2VyTWFyayhtU29ja2V0LCBtVUlEKTsKKyAgICAgICAgTmV0d29ya1V0aWxzOjpSZWdpc3RlclNvY2tldFVzZXJNYXJrKG1Tb2NrZXQsIG1VSUQpOwogICAgIH0KIAogICAgIE1ha2VTb2NrZXRCbG9ja2luZyhtU29ja2V0LCBmYWxzZSk7CkBAIC0yOTcsOCArMjk4LDggQEAKICAgICAgICAgbVN0YXRlID0gRElTQ09OTkVDVEVEOwogCiAgICAgICAgIGlmIChtVUlEVmFsaWQpIHsKLSAgICAgICAgICAgIEhUVFBCYXNlOjpVblJlZ2lzdGVyU29ja2V0VXNlclRhZyhtU29ja2V0KTsKLSAgICAgICAgICAgIEhUVFBCYXNlOjpVblJlZ2lzdGVyU29ja2V0VXNlck1hcmsobVNvY2tldCk7CisgICAgICAgICAgICBOZXR3b3JrVXRpbHM6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyVGFnKG1Tb2NrZXQpOworICAgICAgICAgICAgTmV0d29ya1V0aWxzOjpVblJlZ2lzdGVyU29ja2V0VXNlck1hcmsobVNvY2tldCk7CiAgICAgICAgIH0KICAgICAgICAgY2xvc2UobVNvY2tldCk7CiAgICAgICAgIG1Tb2NrZXQgPSAtMTsKQEAgLTMxNSw4ICszMTYsOCBAQAogCiB2b2lkIEFSVFNQQ29ubmVjdGlvbjo6cGVyZm9ybURpc2Nvbm5lY3QoKSB7CiAgICAgaWYgKG1VSURWYWxpZCkgewotICAgICAgICBIVFRQQmFzZTo6VW5SZWdpc3RlclNvY2tldFVzZXJUYWcobVNvY2tldCk7Ci0gICAgICAgIEhUVFBCYXNlOjpVblJlZ2lzdGVyU29ja2V0VXNlck1hcmsobVNvY2tldCk7CisgICAgICAgIE5ldHdvcmtVdGlsczo6VW5SZWdpc3RlclNvY2tldFVzZXJUYWcobVNvY2tldCk7CisgICAgICAgIE5ldHdvcmtVdGlsczo6VW5SZWdpc3RlclNvY2tldFVzZXJNYXJrKG1Tb2NrZXQpOwogICAgIH0KICAgICBjbG9zZShtU29ja2V0KTsKICAgICBtU29ja2V0ID0gLTE7CkBAIC0zODksOCArMzkwLDggQEAKIAogICAgICAgICBtU3RhdGUgPSBESVNDT05ORUNURUQ7CiAgICAgICAgIGlmIChtVUlEVmFsaWQpIHsKLSAgICAgICAgICAgIEhUVFBCYXNlOjpVblJlZ2lzdGVyU29ja2V0VXNlclRhZyhtU29ja2V0KTsKLSAgICAgICAgICAgIEhUVFBCYXNlOjpVblJlZ2lzdGVyU29ja2V0VXNlck1hcmsobVNvY2tldCk7CisgICAgICAgICAgICBOZXR3b3JrVXRpbHM6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyVGFnKG1Tb2NrZXQpOworICAgICAgICAgICAgTmV0d29ya1V0aWxzOjpVblJlZ2lzdGVyU29ja2V0VXNlck1hcmsobVNvY2tldCk7CiAgICAgICAgIH0KICAgICAgICAgY2xvc2UobVNvY2tldCk7CiAgICAgICAgIG1Tb2NrZXQgPSAtMTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQW5kcm9pZC5icAppbmRleCBkZWJkMDdlLi5kMTc2N2QzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BbmRyb2lkLmJwCkBAIC0xLDUgKzEsNSBAQAotY2NfbGlicmFyeV9zdGF0aWMgewotICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9ydHNwIiwKK2NjX2RlZmF1bHRzIHsKKyAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfcnRzcF9kZWZhdWx0cyIsCiAKICAgICBzcmNzOiBbCiAgICAgICAgICJBQU1SQXNzZW1ibGVyLmNwcCIsCkBAIC01Miw2ICs1MiwyMSBAQAogICAgIH0sCiB9CiAKK2NjX2xpYnJhcnlfc3RhdGljIHsKKyAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfcnRzcCIsCisKKyAgICBzcmNzOiBbIk5ldHdvcmtVdGlscy5jcHAiXSwKKyAgICBoZWFkZXJfbGliczogWyJsaWJuZXRkX2NsaWVudF9oZWFkZXJzIl0sCisgICAgZGVmYXVsdHM6IFsibGlic3RhZ2VmcmlnaHRfcnRzcF9kZWZhdWx0cyJdLAorfQorCitjY19saWJyYXJ5X3N0YXRpYyB7CisgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X3J0c3BfcGxheWVyMiIsCisKKyAgICBzcmNzOiBbIk5ldHdvcmtVdGlsc0ZvckFwcFByb2MuY3BwIl0sCisgICAgZGVmYXVsdHM6IFsibGlic3RhZ2VmcmlnaHRfcnRzcF9kZWZhdWx0cyJdLAorfQorCiAvLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIAogY2NfdGVzdCB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL015SGFuZGxlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9NeUhhbmRsZXIuaAppbmRleCBkMTgzNTE2Li41ZDk5M2RiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL015SGFuZGxlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTXlIYW5kbGVyLmgKQEAgLTMxLDYgKzMxLDcgQEAKICNpbmNsdWRlICJBUlRQQ29ubmVjdGlvbi5oIgogI2luY2x1ZGUgIkFSVFNQQ29ubmVjdGlvbi5oIgogI2luY2x1ZGUgIkFTZXNzaW9uRGVzY3JpcHRpb24uaCIKKyNpbmNsdWRlICJOZXR3b3JrVXRpbHMuaCIKIAogI2luY2x1ZGUgPGN0eXBlLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KQEAgLTc1NywxMCArNzU4LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRyYWNrLT5tVXNpbmdJbnRlcmxlYXZlZFRDUCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENsZWFyIHRoZSB0YWcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVVJRFZhbGlkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhUVFBCYXNlOjpVblJlZ2lzdGVyU29ja2V0VXNlclRhZyh0cmFjay0+bVJUUFNvY2tldCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhUVFBCYXNlOjpVblJlZ2lzdGVyU29ja2V0VXNlck1hcmsodHJhY2stPm1SVFBTb2NrZXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIVFRQQmFzZTo6VW5SZWdpc3RlclNvY2tldFVzZXJUYWcodHJhY2stPm1SVENQU29ja2V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFRUUEJhc2U6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyTWFyayh0cmFjay0+bVJUQ1BTb2NrZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXR3b3JrVXRpbHM6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyVGFnKHRyYWNrLT5tUlRQU29ja2V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV0d29ya1V0aWxzOjpVblJlZ2lzdGVyU29ja2V0VXNlck1hcmsodHJhY2stPm1SVFBTb2NrZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXR3b3JrVXRpbHM6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyVGFnKHRyYWNrLT5tUlRDUFNvY2tldCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5ldHdvcmtVdGlsczo6VW5SZWdpc3RlclNvY2tldFVzZXJNYXJrKHRyYWNrLT5tUlRDUFNvY2tldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2UodHJhY2stPm1SVFBTb2NrZXQpOwpAQCAtODg2LDEwICs4ODcsMTAgQEAKIAogICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2xlYXIgdGhlIHRhZwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1VSURWYWxpZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhUVFBCYXNlOjpVblJlZ2lzdGVyU29ja2V0VXNlclRhZyhpbmZvLT5tUlRQU29ja2V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBIVFRQQmFzZTo6VW5SZWdpc3RlclNvY2tldFVzZXJNYXJrKGluZm8tPm1SVFBTb2NrZXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhUVFBCYXNlOjpVblJlZ2lzdGVyU29ja2V0VXNlclRhZyhpbmZvLT5tUlRDUFNvY2tldCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSFRUUEJhc2U6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyTWFyayhpbmZvLT5tUlRDUFNvY2tldCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV0d29ya1V0aWxzOjpVblJlZ2lzdGVyU29ja2V0VXNlclRhZyhpbmZvLT5tUlRQU29ja2V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXR3b3JrVXRpbHM6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyTWFyayhpbmZvLT5tUlRQU29ja2V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXR3b3JrVXRpbHM6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyVGFnKGluZm8tPm1SVENQU29ja2V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXR3b3JrVXRpbHM6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyTWFyayhpbmZvLT5tUlRDUFNvY2tldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlKGluZm8tPm1SVFBTb2NrZXQpOwpAQCAtMTY2NSwxMiArMTY2NiwxMiBAQAogICAgICAgICAgICAgICAgICAgICAmaW5mby0+bVJUUFNvY2tldCwgJmluZm8tPm1SVENQU29ja2V0LCAmcnRwUG9ydCk7CiAKICAgICAgICAgICAgIGlmIChtVUlEVmFsaWQpIHsKLSAgICAgICAgICAgICAgICBIVFRQQmFzZTo6UmVnaXN0ZXJTb2NrZXRVc2VyVGFnKGluZm8tPm1SVFBTb2NrZXQsIG1VSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpKih1aW50MzJfdCopICJSVFBfIik7Ci0gICAgICAgICAgICAgICAgSFRUUEJhc2U6OlJlZ2lzdGVyU29ja2V0VXNlclRhZyhpbmZvLT5tUlRDUFNvY2tldCwgbVVJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCkqKHVpbnQzMl90KikgIlJUUF8iKTsKLSAgICAgICAgICAgICAgICBIVFRQQmFzZTo6UmVnaXN0ZXJTb2NrZXRVc2VyTWFyayhpbmZvLT5tUlRQU29ja2V0LCBtVUlEKTsKLSAgICAgICAgICAgICAgICBIVFRQQmFzZTo6UmVnaXN0ZXJTb2NrZXRVc2VyTWFyayhpbmZvLT5tUlRDUFNvY2tldCwgbVVJRCk7CisgICAgICAgICAgICAgICAgTmV0d29ya1V0aWxzOjpSZWdpc3RlclNvY2tldFVzZXJUYWcoaW5mby0+bVJUUFNvY2tldCwgbVVJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCkqKHVpbnQzMl90KikgIlJUUF8iKTsKKyAgICAgICAgICAgICAgICBOZXR3b3JrVXRpbHM6OlJlZ2lzdGVyU29ja2V0VXNlclRhZyhpbmZvLT5tUlRDUFNvY2tldCwgbVVJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCkqKHVpbnQzMl90KikgIlJUUF8iKTsKKyAgICAgICAgICAgICAgICBOZXR3b3JrVXRpbHM6OlJlZ2lzdGVyU29ja2V0VXNlck1hcmsoaW5mby0+bVJUUFNvY2tldCwgbVVJRCk7CisgICAgICAgICAgICAgICAgTmV0d29ya1V0aWxzOjpSZWdpc3RlclNvY2tldFVzZXJNYXJrKGluZm8tPm1SVENQU29ja2V0LCBtVUlEKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIlRyYW5zcG9ydDogUlRQL0FWUC9VRFA7dW5pY2FzdDtjbGllbnRfcG9ydD0iKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTmV0d29ya1V0aWxzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTmV0d29ya1V0aWxzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzM2Yjc4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9OZXR3b3JrVXRpbHMuY3BwCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIk5ldHdvcmtVdGlscyIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIk5ldHdvcmtVdGlscy5oIgorI2luY2x1ZGUgPGN1dGlscy9xdGFndWlkLmg+CisjaW5jbHVkZSA8TmV0ZENsaWVudC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIHN0YXRpYwordm9pZCBOZXR3b3JrVXRpbHM6OlJlZ2lzdGVyU29ja2V0VXNlclRhZyhpbnQgc29ja2ZkLCB1aWRfdCB1aWQsIHVpbnQzMl90IGtUYWcpIHsKKyAgICBpbnQgcmVzID0gcXRhZ3VpZF90YWdTb2NrZXQoc29ja2ZkLCBrVGFnLCB1aWQpOworICAgIGlmIChyZXMgIT0gMCkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRhZ2dpbmcgc29ja2V0ICVkIGZvciB1aWQgJWQgKE15IFVJRD0lZCkiLCBzb2NrZmQsIHVpZCwgZ2V0ZXVpZCgpKTsKKyAgICB9Cit9CisKKy8vIHN0YXRpYwordm9pZCBOZXR3b3JrVXRpbHM6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyVGFnKGludCBzb2NrZmQpIHsKKyAgICBpbnQgcmVzID0gcXRhZ3VpZF91bnRhZ1NvY2tldChzb2NrZmQpOworICAgIGlmIChyZXMgIT0gMCkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHVudGFnZ2luZyBzb2NrZXQgJWQgKE15IFVJRD0lZCkiLCBzb2NrZmQsIGdldGV1aWQoKSk7CisgICAgfQorfQorCisvLyBzdGF0aWMKK3ZvaWQgTmV0d29ya1V0aWxzOjpSZWdpc3RlclNvY2tldFVzZXJNYXJrKGludCBzb2NrZmQsIHVpZF90IHVpZCkgeworICAgIHNldE5ldHdvcmtGb3JVc2VyKHVpZCwgc29ja2ZkKTsKK30KKworLy8gc3RhdGljCit2b2lkIE5ldHdvcmtVdGlsczo6VW5SZWdpc3RlclNvY2tldFVzZXJNYXJrKGludCBzb2NrZmQpIHsKKyAgICBSZWdpc3RlclNvY2tldFVzZXJNYXJrKHNvY2tmZCwgZ2V0ZXVpZCgpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTmV0d29ya1V0aWxzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL05ldHdvcmtVdGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyNWVlNDYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL05ldHdvcmtVdGlscy5oCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIE5FVFdPUktfVVRJTFNfSF8KKyNkZWZpbmUgTkVUV09SS19VVElMU19IXworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBOZXR3b3JrVXRpbHMgeworICAgIHN0YXRpYyB2b2lkIFJlZ2lzdGVyU29ja2V0VXNlclRhZyhpbnQgc29ja2ZkLCB1aWRfdCB1aWQsIHVpbnQzMl90IGtUYWcpOworICAgIHN0YXRpYyB2b2lkIFVuUmVnaXN0ZXJTb2NrZXRVc2VyVGFnKGludCBzb2NrZmQpOworCisgICAgc3RhdGljIHZvaWQgUmVnaXN0ZXJTb2NrZXRVc2VyTWFyayhpbnQgc29ja2ZkLCB1aWRfdCB1aWQpOworICAgIHN0YXRpYyB2b2lkIFVuUmVnaXN0ZXJTb2NrZXRVc2VyTWFyayhpbnQgc29ja2ZkKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gTkVUV09SS19VVElMU19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9OZXR3b3JrVXRpbHNGb3JBcHBQcm9jLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTmV0d29ya1V0aWxzRm9yQXBwUHJvYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjYyMTU5YwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTmV0d29ya1V0aWxzRm9yQXBwUHJvYy5jcHAKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiTmV0d29ya1V0aWxzIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiTmV0d29ya1V0aWxzLmgiCisKKy8vIE5ldHdvcmtVdGlscyBpbXBsZW1lbnRhdGlvbiBmb3IgYXBwbGljYXRpb24gcHJvY2Vzcy4KK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gc3RhdGljCit2b2lkIE5ldHdvcmtVdGlsczo6UmVnaXN0ZXJTb2NrZXRVc2VyVGFnKGludCwgdWlkX3QsIHVpbnQzMl90KSB7CisgICAgLy8gTm8gb3AuIEZyYW1ld29yayBhbHJlYWR5IGhhbmRsZXMgdGhlIGRhdGEgdXNhZ2UgYmlsbGluZyBmb3IgYXBwbGljYXRpb25zLgorfQorCisvLyBzdGF0aWMKK3ZvaWQgTmV0d29ya1V0aWxzOjpVblJlZ2lzdGVyU29ja2V0VXNlclRhZyhpbnQpIHsKKyAgICAvLyBObyBvcC4KK30KKworLy8gc3RhdGljCit2b2lkIE5ldHdvcmtVdGlsczo6UmVnaXN0ZXJTb2NrZXRVc2VyTWFyayhpbnQsIHVpZF90KSB7CisgICAgLy8gTm8gb3AuIEZyYW1ld29yayBhbHJlYWR5IGhhbmRsZXMgdGhlIGRhdGEgdXNhZ2UgYmlsbGluZyBmb3IgYXBwbGljYXRpb25zLgorfQorCisvLyBzdGF0aWMKK3ZvaWQgTmV0d29ya1V0aWxzOjpVblJlZ2lzdGVyU29ja2V0VXNlck1hcmsoaW50KSB7CisgICAgLy8gTm8gb3AuCit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL1NEUExvYWRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL1NEUExvYWRlci5jcHAKaW5kZXggZDQ1OWNiZC4uNjY1ZDUxYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9TRFBMb2FkZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvU0RQTG9hZGVyLmNwcApAQCAtMjQsNyArMjQsNyBAQAogCiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFIVFRQQ29ubmVjdGlvbi5oPgogI2luY2x1ZGUgPG1lZGlhL01lZGlhSFRUUFNlcnZpY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUhUVFAuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9DbGVhck1lZGlhSFRUUC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KQEAgLTQxLDcgKzQxLDcgQEAKICAgICAgIG1GbGFncyhmbGFncyksCiAgICAgICBtTmV0TG9vcGVyKG5ldyBBTG9vcGVyKSwKICAgICAgIG1DYW5jZWxsZWQoZmFsc2UpLAotICAgICAgbUhUVFBEYXRhU291cmNlKG5ldyBNZWRpYUhUVFAoaHR0cFNlcnZpY2UtPm1ha2VIVFRQQ29ubmVjdGlvbigpKSkgeworICAgICAgbUhUVFBEYXRhU291cmNlKG5ldyBDbGVhck1lZGlhSFRUUChodHRwU2VydmljZS0+bWFrZUhUVFBDb25uZWN0aW9uKCkpKSB7CiAgICAgbU5ldExvb3Blci0+c2V0TmFtZSgic2RwIG5ldCIpOwogICAgIG1OZXRMb29wZXItPnN0YXJ0KGZhbHNlIC8qIHJ1bk9uQ2FsbGluZ1RocmVhZCAqLywKICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBjYW5DYWxsSmF2YSAqLywKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L0FuZHJvaWQuYnAKaW5kZXggYTVhZDZjNi4uN2M1MTMzMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L0FuZHJvaWQuYnAKQEAgLTI1LDMgKzI1LDM2IEBACiAKICAgICBzaGFyZWRfbGliczogWyJsaWJtZWRpYSJdLAogfQorCitjY19saWJyYXJ5X3N0YXRpYyB7CisgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X3RpbWVkdGV4dDIiLAorCisgICAgc3JjczogWyJUZXh0RGVzY3JpcHRpb25zMi5jcHAiXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJtZWRpYXBsYXllcjItcHJvdG9zIiwKKyAgICAgICAgImxpYnByb3RvYnVmLWNwcC1saXRlIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV25vLW11bHRpY2hhciIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICBdLAorCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKKyAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgIF0sCisgICAgICAgIGNmaTogdHJ1ZSwKKyAgICAgICAgZGlhZzogeworICAgICAgICAgICAgY2ZpOiB0cnVlLAorICAgICAgICB9LAorICAgIH0sCisKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWyJsaWJtZWRpYSJdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L1RleHREZXNjcmlwdGlvbnMyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9UZXh0RGVzY3JpcHRpb25zMi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQ4ZWFjYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9UZXh0RGVzY3JpcHRpb25zMi5jcHAKQEAgLTAsMCArMSwxODggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiVGV4dERlc2NyaXB0aW9uczIuaCIKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0J5dGVVdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworVGV4dERlc2NyaXB0aW9uczI6OlRleHREZXNjcmlwdGlvbnMyKCkgeworfQorCitzdGF0dXNfdCBUZXh0RGVzY3JpcHRpb25zMjo6Z2V0UGxheWVyTWVzc2FnZU9mRGVzY3JpcHRpb25zKAorICAgICAgICBjb25zdCB1aW50OF90ICpkYXRhLCBzc2l6ZV90IHNpemUsCisgICAgICAgIHVpbnQzMl90IGZsYWdzLCBpbnQgdGltZU1zLCBQbGF5ZXJNZXNzYWdlICpwbGF5ZXJNc2cpIHsKKyAgICBpZiAoZmxhZ3MgJiBJTl9CQU5EX1RFWFRfM0dQUCkgeworICAgICAgICBpZiAoZmxhZ3MgJiBHTE9CQUxfREVTQ1JJUFRJT05TKSB7CisgICAgICAgICAgICByZXR1cm4gZXh0cmFjdDNHUFBHbG9iYWxEZXNjcmlwdGlvbnMoZGF0YSwgc2l6ZSwgcGxheWVyTXNnKTsKKyAgICAgICAgfSBlbHNlIGlmIChmbGFncyAmIExPQ0FMX0RFU0NSSVBUSU9OUykgeworICAgICAgICAgICAgcmV0dXJuIGV4dHJhY3QzR1BQTG9jYWxEZXNjcmlwdGlvbnMoZGF0YSwgc2l6ZSwgdGltZU1zLCBwbGF5ZXJNc2cpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChmbGFncyAmIE9VVF9PRl9CQU5EX1RFWFRfU1JUKSB7CisgICAgICAgIGlmIChmbGFncyAmIExPQ0FMX0RFU0NSSVBUSU9OUykgeworICAgICAgICAgICAgcmV0dXJuIGV4dHJhY3RTUlRMb2NhbERlc2NyaXB0aW9ucyhkYXRhLCBzaXplLCB0aW1lTXMsIHBsYXllck1zZyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Cit9CisKKy8vIFBhcnNlIHRoZSBTUlQgdGV4dCBzYW1wbGUsIGFuZCBzdG9yZSB0aGUgdGltaW5nIGFuZCB0ZXh0IHNhbXBsZSBpbiBhIFBsYXllck1lc3NhZ2UuCisvLyBUaGUgUGxheWVyTWVzc2FnZSB3aWxsIGJlIHNlbnQgdG8gTWVkaWFQbGF5ZXIyLmphdmEgdGhyb3VnaCBldmVudCwgYW5kIHdpbGwgYmUKKy8vIHBhcnNlZCBpbiBUaW1lZFRleHQuamF2YS4KK3N0YXR1c190IFRleHREZXNjcmlwdGlvbnMyOjpleHRyYWN0U1JUTG9jYWxEZXNjcmlwdGlvbnMoCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNzaXplX3Qgc2l6ZSwgaW50IHRpbWVNcywgUGxheWVyTWVzc2FnZSAqcGxheWVyTXNnKSB7CisgICAgcGxheWVyTXNnLT5hZGRfdmFsdWVzKCktPnNldF9pbnQzMl92YWx1ZShLRVlfTE9DQUxfU0VUVElORyk7CisgICAgcGxheWVyTXNnLT5hZGRfdmFsdWVzKCktPnNldF9pbnQzMl92YWx1ZShLRVlfU1RBUlRfVElNRSk7CisgICAgcGxheWVyTXNnLT5hZGRfdmFsdWVzKCktPnNldF9pbnQzMl92YWx1ZSh0aW1lTXMpOworCisgICAgcGxheWVyTXNnLT5hZGRfdmFsdWVzKCktPnNldF9pbnQzMl92YWx1ZShLRVlfU1RSVUNUX1RFWFQpOworICAgIHBsYXllck1zZy0+YWRkX3ZhbHVlcygpLT5zZXRfYnl0ZXNfdmFsdWUoZGF0YSwgc2l6ZSk7CisKKyAgICByZXR1cm4gT0s7Cit9CisKKy8vIEV4dHJhY3QgdGhlIGxvY2FsIDNHUFAgZGlzcGxheSBkZXNjcmlwdGlvbnMuIDNHUFAgbG9jYWwgZGVzY3JpcHRpb25zCisvLyBhcmUgYXBwZW5kZWQgdG8gdGhlIHRleHQgc2FtcGxlIGlmIGFueS4KK3N0YXR1c190IFRleHREZXNjcmlwdGlvbnMyOjpleHRyYWN0M0dQUExvY2FsRGVzY3JpcHRpb25zKAorICAgICAgICBjb25zdCB1aW50OF90ICpkYXRhLCBzc2l6ZV90IHNpemUsCisgICAgICAgIGludCB0aW1lTXMsIFBsYXllck1lc3NhZ2UgKnBsYXllck1zZykgeworCisgICAgcGxheWVyTXNnLT5hZGRfdmFsdWVzKCktPnNldF9pbnQzMl92YWx1ZShLRVlfTE9DQUxfU0VUVElORyk7CisKKyAgICAvLyB3cml0ZSBzdGFydCB0aW1lIHRvIGRpc3BsYXkgdGhpcyB0ZXh0IHNhbXBsZQorICAgIHBsYXllck1zZy0+YWRkX3ZhbHVlcygpLT5zZXRfaW50MzJfdmFsdWUoS0VZX1NUQVJUX1RJTUUpOworICAgIHBsYXllck1zZy0+YWRkX3ZhbHVlcygpLT5zZXRfaW50MzJfdmFsdWUodGltZU1zKTsKKworICAgIGlmIChzaXplIDwgMikgeworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorICAgIHNzaXplX3QgdGV4dExlbiA9ICgqZGF0YSkgPDwgOCB8ICgqKGRhdGEgKyAxKSk7CisKKyAgICBpZiAoc2l6ZSA8IHRleHRMZW4gKyAyKSB7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICAvLyB3cml0ZSB0ZXh0IHNhbXBsZSBsZW5ndGggYW5kIHRleHQgc2FtcGxlIGl0c2VsZgorICAgIHBsYXllck1zZy0+YWRkX3ZhbHVlcygpLT5zZXRfaW50MzJfdmFsdWUoS0VZX1NUUlVDVF9URVhUKTsKKyAgICBwbGF5ZXJNc2ctPmFkZF92YWx1ZXMoKS0+c2V0X2J5dGVzX3ZhbHVlKGRhdGEgKyAyLCB0ZXh0TGVuKTsKKworICAgIGlmIChzaXplID4gdGV4dExlbiArIDIpIHsKKyAgICAgICAgZGF0YSArPSAodGV4dExlbiArIDIpOworICAgICAgICBzaXplIC09ICh0ZXh0TGVuICsgMik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIHdoaWxlIChzaXplID49IDgpIHsKKyAgICAgICAgY29uc3QgdWludDhfdCAqdG1wRGF0YSA9IGRhdGE7CisgICAgICAgIHNzaXplX3QgY2h1bmtTaXplID0gVTMyX0FUKHRtcERhdGEpOyAgICAgIC8vIHNpemUgaW5jbHVkZXMgc2l6ZSBhbmQgdHlwZQorICAgICAgICB1aW50MzJfdCBjaHVua1R5cGUgPSBVMzJfQVQodG1wRGF0YSArIDQpOworCisgICAgICAgIGlmIChjaHVua1NpemUgPD0gOCB8fCBjaHVua1NpemUgPiBzaXplKSB7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KKworICAgICAgICBzaXplX3QgcmVtYWluaW5nID0gY2h1bmtTaXplIC0gODsKKworICAgICAgICB0bXBEYXRhICs9IDg7CisKKyAgICAgICAgc3dpdGNoKGNodW5rVHlwZSkgeworICAgICAgICAgICAgLy8gJ3Rib3gnIGJveCB0byBpbmRpY2F0ZSB0aGUgcG9zaXRpb24gb2YgdGhlIHRleHQgd2l0aCB2YWx1ZXMKKyAgICAgICAgICAgIC8vIG9mIHRvcCwgbGVmdCwgYm90dG9tIGFuZCByaWdodAorICAgICAgICAgICAgY2FzZSBGT1VSQ0MoJ3QnLCAnYicsICdvJywgJ3gnKToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAocmVtYWluaW5nIDwgOCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBsYXllck1zZy0+YWRkX3ZhbHVlcygpLT5zZXRfaW50MzJfdmFsdWUoS0VZX1NUUlVDVF9URVhUX1BPUyk7CisgICAgICAgICAgICAgICAgcGxheWVyTXNnLT5hZGRfdmFsdWVzKCktPnNldF9pbnQzMl92YWx1ZShVMTZfQVQodG1wRGF0YSkpOworICAgICAgICAgICAgICAgIHBsYXllck1zZy0+YWRkX3ZhbHVlcygpLT5zZXRfaW50MzJfdmFsdWUoVTE2X0FUKHRtcERhdGEgKyAyKSk7CisgICAgICAgICAgICAgICAgcGxheWVyTXNnLT5hZGRfdmFsdWVzKCktPnNldF9pbnQzMl92YWx1ZShVMTZfQVQodG1wRGF0YSArIDQpKTsKKyAgICAgICAgICAgICAgICBwbGF5ZXJNc2ctPmFkZF92YWx1ZXMoKS0+c2V0X2ludDMyX3ZhbHVlKFUxNl9BVCh0bXBEYXRhICsgNikpOworCisgICAgICAgICAgICAgICAgdG1wRGF0YSArPSA4OworICAgICAgICAgICAgICAgIHJlbWFpbmluZyAtPSA4OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGRhdGEgKz0gY2h1bmtTaXplOworICAgICAgICBzaXplIC09IGNodW5rU2l6ZTsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKKy8vIFRvIGV4dHJhY3QgYm94ICd0eDNnJyBkZWZpbmVkIGluIDNHUFAgVFMgMjYuMjQ1LCBhbmQgc3RvcmUgaXQgaW4gYSBQbGF5ZXJNZXNzYWdlCitzdGF0dXNfdCBUZXh0RGVzY3JpcHRpb25zMjo6ZXh0cmFjdDNHUFBHbG9iYWxEZXNjcmlwdGlvbnMoCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNzaXplX3Qgc2l6ZSwgUGxheWVyTWVzc2FnZSAqcGxheWVyTXNnKSB7CisKKyAgICBwbGF5ZXJNc2ctPmFkZF92YWx1ZXMoKS0+c2V0X2ludDMyX3ZhbHVlKEtFWV9HTE9CQUxfU0VUVElORyk7CisKKyAgICB3aGlsZSAoc2l6ZSA+PSA4KSB7CisgICAgICAgIHNzaXplX3QgY2h1bmtTaXplID0gVTMyX0FUKGRhdGEpOworICAgICAgICB1aW50MzJfdCBjaHVua1R5cGUgPSBVMzJfQVQoZGF0YSArIDQpOworICAgICAgICBjb25zdCB1aW50OF90ICp0bXBEYXRhID0gZGF0YTsKKyAgICAgICAgdG1wRGF0YSArPSA4OworICAgICAgICBzaXplX3QgcmVtYWluaW5nID0gc2l6ZSAtIDg7CisKKyAgICAgICAgaWYgKHNpemUgPCBjaHVua1NpemUpIHsKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfQorICAgICAgICBzd2l0Y2goY2h1bmtUeXBlKSB7CisgICAgICAgICAgICBjYXNlIEZPVVJDQygndCcsICd4JywgJzMnLCAnZycpOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChyZW1haW5pbmcgPCAxOCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIFNraXAgRElTUExBWV9GTEFHUywgU1RSVUNUX0pVU1RJRklDQVRJT04sIGFuZCBCQUNLR1JPVU5EX0NPTE9SX1JHQkEKKyAgICAgICAgICAgICAgICB0bXBEYXRhICs9IDE4OworICAgICAgICAgICAgICAgIHJlbWFpbmluZyAtPSAxODsKKworICAgICAgICAgICAgICAgIGlmIChyZW1haW5pbmcgPCA4KSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcGxheWVyTXNnLT5hZGRfdmFsdWVzKCktPnNldF9pbnQzMl92YWx1ZShLRVlfU1RSVUNUX1RFWFRfUE9TKTsKKyAgICAgICAgICAgICAgICBwbGF5ZXJNc2ctPmFkZF92YWx1ZXMoKS0+c2V0X2ludDMyX3ZhbHVlKFUxNl9BVCh0bXBEYXRhKSk7CisgICAgICAgICAgICAgICAgcGxheWVyTXNnLT5hZGRfdmFsdWVzKCktPnNldF9pbnQzMl92YWx1ZShVMTZfQVQodG1wRGF0YSArIDIpKTsKKyAgICAgICAgICAgICAgICBwbGF5ZXJNc2ctPmFkZF92YWx1ZXMoKS0+c2V0X2ludDMyX3ZhbHVlKFUxNl9BVCh0bXBEYXRhICsgNCkpOworICAgICAgICAgICAgICAgIHBsYXllck1zZy0+YWRkX3ZhbHVlcygpLT5zZXRfaW50MzJfdmFsdWUoVTE2X0FUKHRtcERhdGEgKyA2KSk7CisKKyAgICAgICAgICAgICAgICB0bXBEYXRhICs9IDg7CisgICAgICAgICAgICAgICAgcmVtYWluaW5nIC09IDE4OworICAgICAgICAgICAgICAgIC8vIElnbm9yZSByZW1haW5pbmcgZGF0YS4KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBkYXRhICs9IGNodW5rU2l6ZTsKKyAgICAgICAgc2l6ZSAtPSBjaHVua1NpemU7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L1RleHREZXNjcmlwdGlvbnMyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvVGV4dERlc2NyaXB0aW9uczIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzdkMmQwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L1RleHREZXNjcmlwdGlvbnMyLmgKQEAgLTAsMCArMSw4OCBAQAorIC8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRFWFRfREVTQ1JJUFRJT05TMl9IXworCisjZGVmaW5lIFRFWFRfREVTQ1JJUFRJT05TMl9IXworCisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KKworI2luY2x1ZGUgIm1lZGlhcGxheWVyMi5wYi5oIgorCit1c2luZyBhbmRyb2lkOjptZWRpYTo6TWVkaWFQbGF5ZXIyUHJvdG86OlBsYXllck1lc3NhZ2U7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgVGV4dERlc2NyaXB0aW9uczIgeworcHVibGljOgorICAgIGVudW0geworICAgICAgICBJTl9CQU5EX1RFWFRfM0dQUCAgICAgICAgICAgICA9IDB4MDEsCisgICAgICAgIE9VVF9PRl9CQU5EX1RFWFRfU1JUICAgICAgICAgID0gMHgwMiwKKworICAgICAgICBHTE9CQUxfREVTQ1JJUFRJT05TICAgICAgICAgICA9IDB4MTAwLAorICAgICAgICBMT0NBTF9ERVNDUklQVElPTlMgICAgICAgICAgICA9IDB4MjAwLAorICAgIH07CisKKyAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0UGxheWVyTWVzc2FnZU9mRGVzY3JpcHRpb25zKAorICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSwgc3NpemVfdCBzaXplLAorICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MsIGludCB0aW1lTXMsIFBsYXllck1lc3NhZ2UgKnBsYXllck1zZyk7Citwcml2YXRlOgorICAgIFRleHREZXNjcmlwdGlvbnMyKCk7CisKKyAgICBlbnVtIHsKKyAgICAgICAgLy8gVGhlc2Uga2V5cyBtdXN0IGJlIGluIHN5bmMgd2l0aCB0aGUga2V5cyBpbiBUaW1lZFRleHQuamF2YQorICAgICAgICBLRVlfRElTUExBWV9GTEFHUyAgICAgICAgICAgICAgICAgPSAxLCAvLyBpbnQKKyAgICAgICAgS0VZX1NUWUxFX0ZMQUdTICAgICAgICAgICAgICAgICAgID0gMiwgLy8gaW50CisgICAgICAgIEtFWV9CQUNLR1JPVU5EX0NPTE9SX1JHQkEgICAgICAgICA9IDMsIC8vIGludAorICAgICAgICBLRVlfSElHSExJR0hUX0NPTE9SX1JHQkEgICAgICAgICAgPSA0LCAvLyBpbnQKKyAgICAgICAgS0VZX1NDUk9MTF9ERUxBWSAgICAgICAgICAgICAgICAgID0gNSwgLy8gaW50CisgICAgICAgIEtFWV9XUkFQX1RFWFQgICAgICAgICAgICAgICAgICAgICA9IDYsIC8vIGludAorICAgICAgICBLRVlfU1RBUlRfVElNRSAgICAgICAgICAgICAgICAgICAgPSA3LCAvLyBpbnQKKyAgICAgICAgS0VZX1NUUlVDVF9CTElOS0lOR19URVhUX0xJU1QgICAgID0gOCwgLy8gTGlzdDxDaGFyUG9zPgorICAgICAgICBLRVlfU1RSVUNUX0ZPTlRfTElTVCAgICAgICAgICAgICAgPSA5LCAvLyBMaXN0PEZvbnQ+CisgICAgICAgIEtFWV9TVFJVQ1RfSElHSExJR0hUX0xJU1QgICAgICAgICA9IDEwLCAvLyBMaXN0PENoYXJQb3M+CisgICAgICAgIEtFWV9TVFJVQ1RfSFlQRVJfVEVYVF9MSVNUICAgICAgICA9IDExLCAvLyBMaXN0PEh5cGVyVGV4dD4KKyAgICAgICAgS0VZX1NUUlVDVF9LQVJBT0tFX0xJU1QgICAgICAgICAgID0gMTIsIC8vIExpc3Q8S2FyYW9rZT4KKyAgICAgICAgS0VZX1NUUlVDVF9TVFlMRV9MSVNUICAgICAgICAgICAgID0gMTMsIC8vIExpc3Q8U3R5bGU+CisgICAgICAgIEtFWV9TVFJVQ1RfVEVYVF9QT1MgICAgICAgICAgICAgICA9IDE0LCAvLyBUZXh0UG9zCisgICAgICAgIEtFWV9TVFJVQ1RfSlVTVElGSUNBVElPTiAgICAgICAgICA9IDE1LCAvLyBKdXN0aWZpY2F0aW9uCisgICAgICAgIEtFWV9TVFJVQ1RfVEVYVCAgICAgICAgICAgICAgICAgICA9IDE2LCAvLyBUZXh0CisKKyAgICAgICAgS0VZX0dMT0JBTF9TRVRUSU5HICAgICAgICAgICAgICAgID0gMTAxLAorICAgICAgICBLRVlfTE9DQUxfU0VUVElORyAgICAgICAgICAgICAgICAgPSAxMDIsCisgICAgICAgIEtFWV9TVEFSVF9DSEFSICAgICAgICAgICAgICAgICAgICA9IDEwMywKKyAgICAgICAgS0VZX0VORF9DSEFSICAgICAgICAgICAgICAgICAgICAgID0gMTA0LAorICAgICAgICBLRVlfRk9OVF9JRCAgICAgICAgICAgICAgICAgICAgICAgPSAxMDUsCisgICAgICAgIEtFWV9GT05UX1NJWkUgICAgICAgICAgICAgICAgICAgICA9IDEwNiwKKyAgICAgICAgS0VZX1RFWFRfQ09MT1JfUkdCQSAgICAgICAgICAgICAgID0gMTA3LAorICAgIH07CisKKyAgICBzdGF0aWMgc3RhdHVzX3QgZXh0cmFjdFNSVExvY2FsRGVzY3JpcHRpb25zKAorICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSwgc3NpemVfdCBzaXplLAorICAgICAgICAgICAgaW50IHRpbWVNcywgUGxheWVyTWVzc2FnZSAqcGxheWVyTXNnKTsKKyAgICBzdGF0aWMgc3RhdHVzX3QgZXh0cmFjdDNHUFBHbG9iYWxEZXNjcmlwdGlvbnMoCisgICAgICAgICAgICBjb25zdCB1aW50OF90ICpkYXRhLCBzc2l6ZV90IHNpemUsCisgICAgICAgICAgICBQbGF5ZXJNZXNzYWdlICpwbGF5ZXJNc2cpOworICAgIHN0YXRpYyBzdGF0dXNfdCBleHRyYWN0M0dQUExvY2FsRGVzY3JpcHRpb25zKAorICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSwgc3NpemVfdCBzaXplLAorICAgICAgICAgICAgaW50IHRpbWVNcywgUGxheWVyTWVzc2FnZSAqcGxheWVyTXNnKTsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFRleHREZXNjcmlwdGlvbnMyKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisjZW5kaWYgIC8vIFRFWFRfREVTQ1JJUFRJT05TMl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9BbmRyb2lkLmJwCmluZGV4IGY5Njg3ODguLjk3ZTE0NTIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL0FuZHJvaWQuYnAKQEAgLTM0LDQgKzM0LDggQEAKICAgICAgICAgImxpYnV0aWxzIiwKICAgICAgICAgImxpYmxvZyIsCiAgICAgXSwKKworICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJtZWRpYV9uZGtfaGVhZGVycyIsCisgICAgXSwKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci9NZWRpYUNvZGVjc1htbFBhcnNlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvTWVkaWFDb2RlY3NYbWxQYXJzZXIuY3BwCmluZGV4IDA4MzI5NDQuLjJkZWM5ZmEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci9NZWRpYUNvZGVjc1htbFBhcnNlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL01lZGlhQ29kZWNzWG1sUGFyc2VyLmNwcApAQCAtOTIsMTggKzkyLDE4IEBACiBzdGF0dXNfdCBsaW1pdEZvdW5kTWlzc2luZ0F0dHIoY29uc3QgY2hhciogbmFtZSwgY29uc3QgY2hhciAqYXR0ciwgYm9vbCBmb3VuZCA9IHRydWUpIHsKICAgICBBTE9HRSgibGltaXQgJyVzJyB3aXRoICVzJyVzJyBhdHRyaWJ1dGUiLCBuYW1lLAogICAgICAgICAgICAgKGZvdW5kID8gIiIgOiAibm8gIiksIGF0dHIpOwotICAgIHJldHVybiAtRUlOVkFMOworICAgIHJldHVybiBCQURfVkFMVUU7CiB9CiAKIHN0YXR1c190IGxpbWl0RXJyb3IoY29uc3QgY2hhciogbmFtZSwgY29uc3QgY2hhciAqbXNnKSB7CiAgICAgQUxPR0UoImxpbWl0ICclcycgJXMiLCBuYW1lLCBtc2cpOwotICAgIHJldHVybiAtRUlOVkFMOworICAgIHJldHVybiBCQURfVkFMVUU7CiB9CiAKIHN0YXR1c190IGxpbWl0SW52YWxpZEF0dHIoY29uc3QgY2hhciogbmFtZSwgY29uc3QgY2hhciogYXR0ciwgY29uc3QgY2hhciogdmFsdWUpIHsKICAgICBBTE9HRSgibGltaXQgJyVzJyB3aXRoIGludmFsaWQgJyVzJyBhdHRyaWJ1dGUgKCVzKSIsIG5hbWUsCiAgICAgICAgICAgICBhdHRyLCB2YWx1ZSk7Ci0gICAgcmV0dXJuIC1FSU5WQUw7CisgICAgcmV0dXJuIEJBRF9WQUxVRTsKIH0KIAogfTsgLy8gdW5uYW1lZCBuYW1lc3BhY2UKQEAgLTIzMiwxMiArMjMyLDEyIEBACiAgICAgd2hpbGUgKGF0dHJzW2ldICE9IG51bGxwdHIpIHsKICAgICAgICAgaWYgKHN0ckVxKGF0dHJzW2ldLCAiaHJlZiIpKSB7CiAgICAgICAgICAgICBpZiAoYXR0cnNbKytpXSA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGhyZWYgPSBhdHRyc1tpXTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIEFMT0dFKCJpbmNsdWRlWE1MRmlsZTogdW5yZWNvZ25pemVkIGF0dHJpYnV0ZTogJXMiLCBhdHRyc1tpXSk7Ci0gICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KICAgICAgICAgKytpOwogICAgIH0KQEAgLTI1MiwzMiArMjUyLDMyIEBACiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogICAgICAgICBBTE9HRSgiaW52YWxpZCBpbmNsdWRlIGZpbGUgbmFtZTogJXMiLCBocmVmKTsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCiAgICAgc3RkOjpzdHJpbmcgZmlsZW5hbWUgPSBocmVmOwogICAgIGlmIChmaWxlbmFtZS5jb21wYXJlKDAsIDEzLCAibWVkaWFfY29kZWNzXyIpICE9IDAgfHwKICAgICAgICAgICAgIGZpbGVuYW1lLmNvbXBhcmUoZmlsZW5hbWUuc2l6ZSgpIC0gNCwgNCwgIi54bWwiKSAhPSAwKSB7CiAgICAgICAgIEFMT0dFKCJpbnZhbGlkIGluY2x1ZGUgZmlsZSBuYW1lOiAlcyIsIGhyZWYpOwotICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAgICAgZmlsZW5hbWUuaW5zZXJ0KDAsIG1IcmVmQmFzZSk7CiAKKyAgICBzdGF0dXNfdCBvbGRQYXJzaW5nU3RhdHVzID0gbVBhcnNpbmdTdGF0dXM7CisKICAgICBwYXJzZVhNTEZpbGUoZmlsZW5hbWUuY19zdHIoKSk7Ci0gICAgcmV0dXJuIG1QYXJzaW5nU3RhdHVzOworCisgICAgc3RhdHVzX3QgbmV3UGFyc2luZ1N0YXR1cyA9IG1QYXJzaW5nU3RhdHVzOworICAgIG1QYXJzaW5nU3RhdHVzID0gb2xkUGFyc2luZ1N0YXR1czsKKyAgICByZXR1cm4gbmV3UGFyc2luZ1N0YXR1czsKIH0KIAogdm9pZCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6c3RhcnRFbGVtZW50SGFuZGxlcigKICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqKmF0dHJzKSB7Ci0gICAgaWYgKG1QYXJzaW5nU3RhdHVzICE9IE9LKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KICAgICBib29sIGluVHlwZSA9IHRydWU7CiAKICAgICBpZiAoc3RyRXEobmFtZSwgIkluY2x1ZGUiKSkgewotICAgICAgICBtUGFyc2luZ1N0YXR1cyA9IGluY2x1ZGVYTUxGaWxlKGF0dHJzKTsKLSAgICAgICAgaWYgKG1QYXJzaW5nU3RhdHVzID09IE9LKSB7CisgICAgICAgIGlmIChpbmNsdWRlWE1MRmlsZShhdHRycykgPT0gT0spIHsKICAgICAgICAgICAgIG1TZWN0aW9uU3RhY2sucHVzaF9iYWNrKG1DdXJyZW50U2VjdGlvbik7CiAgICAgICAgICAgICBtQ3VycmVudFNlY3Rpb24gPSBTRUNUSU9OX0lOQ0xVREU7CiAgICAgICAgIH0KQEAgLTMwMCw3ICszMDAsNyBAQAogICAgICAgICBjYXNlIFNFQ1RJT05fU0VUVElOR1M6CiAgICAgICAgIHsKICAgICAgICAgICAgIGlmIChzdHJFcShuYW1lLCAiU2V0dGluZyIpKSB7Ci0gICAgICAgICAgICAgICAgbVBhcnNpbmdTdGF0dXMgPSBhZGRTZXR0aW5nRnJvbUF0dHJpYnV0ZXMoYXR0cnMpOworICAgICAgICAgICAgICAgICh2b2lkKWFkZFNldHRpbmdGcm9tQXR0cmlidXRlcyhhdHRycyk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtMzA4LDkgKzMwOCw3IEBACiAgICAgICAgIGNhc2UgU0VDVElPTl9ERUNPREVSUzoKICAgICAgICAgewogICAgICAgICAgICAgaWYgKHN0ckVxKG5hbWUsICJNZWRpYUNvZGVjIikpIHsKLSAgICAgICAgICAgICAgICBtUGFyc2luZ1N0YXR1cyA9Ci0gICAgICAgICAgICAgICAgICAgIGFkZE1lZGlhQ29kZWNGcm9tQXR0cmlidXRlcyhmYWxzZSAvKiBlbmNvZGVyICovLCBhdHRycyk7Ci0KKyAgICAgICAgICAgICAgICAodm9pZClhZGRNZWRpYUNvZGVjRnJvbUF0dHJpYnV0ZXMoZmFsc2UgLyogZW5jb2RlciAqLywgYXR0cnMpOwogICAgICAgICAgICAgICAgIG1DdXJyZW50U2VjdGlvbiA9IFNFQ1RJT05fREVDT0RFUjsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwpAQCAtMzE5LDkgKzMxNyw3IEBACiAgICAgICAgIGNhc2UgU0VDVElPTl9FTkNPREVSUzoKICAgICAgICAgewogICAgICAgICAgICAgaWYgKHN0ckVxKG5hbWUsICJNZWRpYUNvZGVjIikpIHsKLSAgICAgICAgICAgICAgICBtUGFyc2luZ1N0YXR1cyA9Ci0gICAgICAgICAgICAgICAgICAgIGFkZE1lZGlhQ29kZWNGcm9tQXR0cmlidXRlcyh0cnVlIC8qIGVuY29kZXIgKi8sIGF0dHJzKTsKLQorICAgICAgICAgICAgICAgICh2b2lkKWFkZE1lZGlhQ29kZWNGcm9tQXR0cmlidXRlcyh0cnVlIC8qIGVuY29kZXIgKi8sIGF0dHJzKTsKICAgICAgICAgICAgICAgICBtQ3VycmVudFNlY3Rpb24gPSBTRUNUSU9OX0VOQ09ERVI7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKQEAgLTMzMSw5ICszMjcsOSBAQAogICAgICAgICBjYXNlIFNFQ1RJT05fRU5DT0RFUjoKICAgICAgICAgewogICAgICAgICAgICAgaWYgKHN0ckVxKG5hbWUsICJRdWlyayIpKSB7Ci0gICAgICAgICAgICAgICAgbVBhcnNpbmdTdGF0dXMgPSBhZGRRdWlyayhhdHRycyk7CisgICAgICAgICAgICAgICAgKHZvaWQpYWRkUXVpcmsoYXR0cnMpOwogICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJFcShuYW1lLCAiVHlwZSIpKSB7Ci0gICAgICAgICAgICAgICAgbVBhcnNpbmdTdGF0dXMgPSBhZGRUeXBlRnJvbUF0dHJpYnV0ZXMoYXR0cnMsCisgICAgICAgICAgICAgICAgKHZvaWQpYWRkVHlwZUZyb21BdHRyaWJ1dGVzKGF0dHJzLAogICAgICAgICAgICAgICAgICAgICAgICAgKG1DdXJyZW50U2VjdGlvbiA9PSBTRUNUSU9OX0VOQ09ERVIpKTsKICAgICAgICAgICAgICAgICBtQ3VycmVudFNlY3Rpb24gPQogICAgICAgICAgICAgICAgICAgICAgICAgKG1DdXJyZW50U2VjdGlvbiA9PSBTRUNUSU9OX0RFQ09ERVIgPwpAQCAtMzUzLDkgKzM0OSw5IEBACiAgICAgICAgICAgICAgICAgICAgIChzdHJFcShuYW1lLCAiTGltaXQiKSB8fCBzdHJFcShuYW1lLCAiRmVhdHVyZSIpKSkgewogICAgICAgICAgICAgICAgIEFMT0dXKCJpZ25vcmluZyAlcyBzcGVjaWZpZWQgb3V0c2lkZSBvZiBhIFR5cGUiLCBuYW1lKTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyRXEobmFtZSwgIkxpbWl0IikpIHsKLSAgICAgICAgICAgICAgICBtUGFyc2luZ1N0YXR1cyA9IGFkZExpbWl0KGF0dHJzKTsKKyAgICAgICAgICAgICAgICAodm9pZClhZGRMaW1pdChhdHRycyk7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0ckVxKG5hbWUsICJGZWF0dXJlIikpIHsKLSAgICAgICAgICAgICAgICBtUGFyc2luZ1N0YXR1cyA9IGFkZEZlYXR1cmUoYXR0cnMpOworICAgICAgICAgICAgICAgICh2b2lkKWFkZEZlYXR1cmUoYXR0cnMpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTM2NywxMCArMzYzLDYgQEAKIH0KIAogdm9pZCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6ZW5kRWxlbWVudEhhbmRsZXIoY29uc3QgY2hhciAqbmFtZSkgewotICAgIGlmIChtUGFyc2luZ1N0YXR1cyAhPSBPSykgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCiAgICAgc3dpdGNoIChtQ3VycmVudFNlY3Rpb24pIHsKICAgICAgICAgY2FzZSBTRUNUSU9OX1NFVFRJTkdTOgogICAgICAgICB7CkBAIC00NTIsMzEgKzQ0NCwzMSBAQAogICAgICAgICBpZiAoc3RyRXEoYXR0cnNbaV0sICJuYW1lIikpIHsKICAgICAgICAgICAgIGlmIChhdHRyc1srK2ldID09IG51bGxwdHIpIHsKICAgICAgICAgICAgICAgICBBTE9HRSgiYWRkU2V0dGluZ0Zyb21BdHRyaWJ1dGVzOiBuYW1lIGlzIG51bGwiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgbmFtZSA9IGF0dHJzW2ldOwogICAgICAgICB9IGVsc2UgaWYgKHN0ckVxKGF0dHJzW2ldLCAidmFsdWUiKSkgewogICAgICAgICAgICAgaWYgKGF0dHJzWysraV0gPT0gbnVsbHB0cikgewogICAgICAgICAgICAgICAgIEFMT0dFKCJhZGRTZXR0aW5nRnJvbUF0dHJpYnV0ZXM6IHZhbHVlIGlzIG51bGwiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgdmFsdWUgPSBhdHRyc1tpXTsKICAgICAgICAgfSBlbHNlIGlmIChzdHJFcShhdHRyc1tpXSwgInVwZGF0ZSIpKSB7CiAgICAgICAgICAgICBpZiAoYXR0cnNbKytpXSA9PSBudWxscHRyKSB7CiAgICAgICAgICAgICAgICAgQUxPR0UoImFkZFNldHRpbmdGcm9tQXR0cmlidXRlczogdXBkYXRlIGlzIG51bGwiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgdXBkYXRlID0gYXR0cnNbaV07CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBBTE9HRSgiYWRkU2V0dGluZ0Zyb21BdHRyaWJ1dGVzOiB1bnJlY29nbml6ZWQgYXR0cmlidXRlOiAlcyIsIGF0dHJzW2ldKTsKLSAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgfQogICAgICAgICArK2k7CiAgICAgfQogCiAgICAgaWYgKG5hbWUgPT0gbnVsbHB0ciB8fCB2YWx1ZSA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dFKCJhZGRTZXR0aW5nRnJvbUF0dHJpYnV0ZXM6IG5hbWUgb3IgdmFsdWUgdW5zcGVjaWZpZWQiKTsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCiAgICAgLy8gQm9vbGVhbiB2YWx1ZXMgYXJlIGNvbnZlcnRlZCB0byAiMCIgb3IgIjEiLgpAQCAtNDg5LDcgKzQ4MSw3IEBACiAgICAgaWYgKGF0dHJpYnV0ZSA9PSBtU2VydmljZUF0dHJpYnV0ZU1hcC5lbmQoKSkgeyAvLyBOZXcgYXR0cmlidXRlIG5hbWUKICAgICAgICAgaWYgKG1VcGRhdGUpIHsKICAgICAgICAgICAgIEFMT0dFKCJhZGRTZXR0aW5nRnJvbUF0dHJpYnV0ZXM6IHVwZGF0aW5nIG5vbi1leGlzdGluZyBzZXR0aW5nIik7Ci0gICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KICAgICAgICAgbVNlcnZpY2VBdHRyaWJ1dGVNYXAuaW5zZXJ0KEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSkpOwogICAgIH0gZWxzZSB7IC8vIEV4aXN0aW5nIGF0dHJpYnV0ZSBuYW1lCkBAIC01MTMsMzkgKzUwNSw0MCBAQAogICAgICAgICBpZiAoc3RyRXEoYXR0cnNbaV0sICJuYW1lIikpIHsKICAgICAgICAgICAgIGlmIChhdHRyc1srK2ldID09IG51bGxwdHIpIHsKICAgICAgICAgICAgICAgICBBTE9HRSgiYWRkTWVkaWFDb2RlY0Zyb21BdHRyaWJ1dGVzOiBuYW1lIGlzIG51bGwiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgbmFtZSA9IGF0dHJzW2ldOwogICAgICAgICB9IGVsc2UgaWYgKHN0ckVxKGF0dHJzW2ldLCAidHlwZSIpKSB7CiAgICAgICAgICAgICBpZiAoYXR0cnNbKytpXSA9PSBudWxscHRyKSB7CiAgICAgICAgICAgICAgICAgQUxPR0UoImFkZE1lZGlhQ29kZWNGcm9tQXR0cmlidXRlczogdHlwZSBpcyBudWxsIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHR5cGUgPSBhdHRyc1tpXTsKICAgICAgICAgfSBlbHNlIGlmIChzdHJFcShhdHRyc1tpXSwgInVwZGF0ZSIpKSB7CiAgICAgICAgICAgICBpZiAoYXR0cnNbKytpXSA9PSBudWxscHRyKSB7CiAgICAgICAgICAgICAgICAgQUxPR0UoImFkZE1lZGlhQ29kZWNGcm9tQXR0cmlidXRlczogdXBkYXRlIGlzIG51bGwiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgdXBkYXRlID0gYXR0cnNbaV07CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBBTE9HRSgiYWRkTWVkaWFDb2RlY0Zyb21BdHRyaWJ1dGVzOiB1bnJlY29nbml6ZWQgYXR0cmlidXRlOiAlcyIsIGF0dHJzW2ldKTsKLSAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgfQogICAgICAgICArK2k7CiAgICAgfQogCiAgICAgaWYgKG5hbWUgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRSgiYWRkTWVkaWFDb2RlY0Zyb21BdHRyaWJ1dGVzOiBuYW1lIG5vdCBmb3VuZCIpOwotICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKICAgICBtVXBkYXRlID0gKHVwZGF0ZSAhPSBudWxscHRyKSAmJiBwYXJzZUJvb2xlYW4odXBkYXRlKTsKICAgICBtQ3VycmVudENvZGVjID0gbUNvZGVjTWFwLmZpbmQobmFtZSk7CiAgICAgaWYgKG1DdXJyZW50Q29kZWMgPT0gbUNvZGVjTWFwLmVuZCgpKSB7IC8vIE5ldyBjb2RlYyBuYW1lCiAgICAgICAgIGlmIChtVXBkYXRlKSB7Ci0gICAgICAgICAgICBBTE9HRSgiYWRkTWVkaWFDb2RlY0Zyb21BdHRyaWJ1dGVzOiB1cGRhdGluZyBub24tZXhpc3RpbmcgY29kZWMiKTsKLSAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgQUxPR1coImFkZE1lZGlhQ29kZWNGcm9tQXR0cmlidXRlczogY2Fubm90IHVwZGF0ZSAiCisgICAgICAgICAgICAgICAgICAibm9uLWV4aXN0aW5nIGNvZGVjIFwiJXNcIi4iLCBuYW1lKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KICAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IGNvZGVjIGluIG1Db2RlY01hcAogICAgICAgICBtQ3VycmVudENvZGVjID0gbUNvZGVjTWFwLmluc2VydCgKQEAgLTU2MCwxOCArNTUzLDI2IEBACiAgICAgICAgIG1DdXJyZW50Q29kZWMtPnNlY29uZC5vcmRlciA9IG1Db2RlY0NvdW50ZXIrKzsKICAgICB9IGVsc2UgeyAvLyBFeGlzdGluZyBjb2RlYyBuYW1lCiAgICAgICAgIGlmICghbVVwZGF0ZSkgewotICAgICAgICAgICAgQUxPR0UoImFkZE1lZGlhQ29kZWNGcm9tQXR0cmlidXRlczogYWRkaW5nIGV4aXN0aW5nIGNvZGVjIik7Ci0gICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgIEFMT0dXKCJhZGRNZWRpYUNvZGVjRnJvbUF0dHJpYnV0ZXM6IHRyeWluZyB0byBhZGQgIgorICAgICAgICAgICAgICAgICAgImV4aXN0aW5nIGNvZGVjIFwiJXNcIiIsIG5hbWUpOworICAgICAgICAgICAgcmV0dXJuIEFMUkVBRFlfRVhJU1RTOwogICAgICAgICB9CiAgICAgICAgIGlmICh0eXBlICE9IG51bGxwdHIpIHsKICAgICAgICAgICAgIG1DdXJyZW50VHlwZSA9IG1DdXJyZW50Q29kZWMtPnNlY29uZC50eXBlTWFwLmZpbmQodHlwZSk7CiAgICAgICAgICAgICBpZiAobUN1cnJlbnRUeXBlID09IG1DdXJyZW50Q29kZWMtPnNlY29uZC50eXBlTWFwLmVuZCgpKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoImFkZE1lZGlhQ29kZWNGcm9tQXR0cmlidXRlczogdXBkYXRpbmcgbm9uLWV4aXN0aW5nIHR5cGUiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICBBTE9HRSgiYWRkTWVkaWFDb2RlY0Zyb21BdHRyaWJ1dGVzOiBjYW5ub3QgdXBkYXRlICIKKyAgICAgICAgICAgICAgICAgICAgICAibm9uLWV4aXN0aW5nIHR5cGUgXCIlc1wiIGZvciBjb2RlYyBcIiVzXCIiLAorICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSwgbmFtZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8vIFRoaXMgc2hvdWxkIGhhcHBlbiBvbmx5IHdoZW4gdGhlIGNvZGVjIGhhcyBhdCBtb3N0IG9uZSB0eXBlLgogICAgICAgICAgICAgbUN1cnJlbnRUeXBlID0gbUN1cnJlbnRDb2RlYy0+c2Vjb25kLnR5cGVNYXAuYmVnaW4oKTsKKyAgICAgICAgICAgIGlmIChtQ3VycmVudFR5cGUgPT0gbUN1cnJlbnRDb2RlYy0+c2Vjb25kLnR5cGVNYXAuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiYWRkTWVkaWFDb2RlY0Zyb21BdHRyaWJ1dGVzOiBjYW5ub3QgdXBkYXRlICIKKyAgICAgICAgICAgICAgICAgICAgICAiY29kZWMgXCIlc1wiIHdpdGhvdXQgdHlwZSBzcGVjaWZpZWQiLCBuYW1lKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCkBAIC01NzksNiArNTgwLDEwIEBACiB9CiAKIHN0YXR1c190IE1lZGlhQ29kZWNzWG1sUGFyc2VyOjphZGRRdWlyayhjb25zdCBjaGFyICoqYXR0cnMpIHsKKyAgICBpZiAobUN1cnJlbnRDb2RlYyA9PSBtQ29kZWNNYXAuZW5kKCkpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKICAgICBjb25zdCBjaGFyICpuYW1lID0gbnVsbHB0cjsKIAogICAgIHNpemVfdCBpID0gMDsKQEAgLTU4NiwxOSArNTkxLDE5IEBACiAgICAgICAgIGlmIChzdHJFcShhdHRyc1tpXSwgIm5hbWUiKSkgewogICAgICAgICAgICAgaWYgKGF0dHJzWysraV0gPT0gbnVsbHB0cikgewogICAgICAgICAgICAgICAgIEFMT0dFKCJhZGRRdWlyazogbmFtZSBpcyBudWxsIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG5hbWUgPSBhdHRyc1tpXTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIEFMT0dFKCJhZGRRdWlyazogdW5yZWNvZ25pemVkIGF0dHJpYnV0ZTogJXMiLCBhdHRyc1tpXSk7Ci0gICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KICAgICAgICAgKytpOwogICAgIH0KIAogICAgIGlmIChuYW1lID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0UoImFkZFF1aXJrOiBuYW1lIG5vdCBmb3VuZCIpOwotICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKICAgICBtQ3VycmVudENvZGVjLT5zZWNvbmQucXVpcmtTZXQuZW1wbGFjZShuYW1lKTsKQEAgLTYwNiw2ICs2MTEsMTAgQEAKIH0KIAogc3RhdHVzX3QgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OmFkZFR5cGVGcm9tQXR0cmlidXRlcyhjb25zdCBjaGFyICoqYXR0cnMsIGJvb2wgZW5jb2RlcikgeworICAgIGlmIChtQ3VycmVudENvZGVjID09IG1Db2RlY01hcC5lbmQoKSkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKwogICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBudWxscHRyOwogICAgIGNvbnN0IGNoYXIgKnVwZGF0ZSA9IG51bGxwdHI7CiAKQEAgLTYxNCw0MiArNjIzLDUxIEBACiAgICAgICAgIGlmIChzdHJFcShhdHRyc1tpXSwgIm5hbWUiKSkgewogICAgICAgICAgICAgaWYgKGF0dHJzWysraV0gPT0gbnVsbHB0cikgewogICAgICAgICAgICAgICAgIEFMT0dFKCJhZGRUeXBlRnJvbUF0dHJpYnV0ZXM6IG5hbWUgaXMgbnVsbCIpOwotICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBuYW1lID0gYXR0cnNbaV07CiAgICAgICAgIH0gZWxzZSBpZiAoc3RyRXEoYXR0cnNbaV0sICJ1cGRhdGUiKSkgewogICAgICAgICAgICAgaWYgKGF0dHJzWysraV0gPT0gbnVsbHB0cikgewogICAgICAgICAgICAgICAgIEFMT0dFKCJhZGRUeXBlRnJvbUF0dHJpYnV0ZXM6IHVwZGF0ZSBpcyBudWxsIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHVwZGF0ZSA9IGF0dHJzW2ldOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgQUxPR0UoImFkZFR5cGVGcm9tQXR0cmlidXRlczogdW5yZWNvZ25pemVkIGF0dHJpYnV0ZTogJXMiLCBhdHRyc1tpXSk7Ci0gICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KICAgICAgICAgKytpOwogICAgIH0KIAogICAgIGlmIChuYW1lID09IG51bGxwdHIpIHsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCiAgICAgbUN1cnJlbnRDb2RlYy0+c2Vjb25kLmlzRW5jb2RlciA9IGVuY29kZXI7CiAgICAgbUN1cnJlbnRUeXBlID0gbUN1cnJlbnRDb2RlYy0+c2Vjb25kLnR5cGVNYXAuZmluZChuYW1lKTsKICAgICBpZiAoIW1VcGRhdGUpIHsKICAgICAgICAgaWYgKG1DdXJyZW50VHlwZSAhPSBtQ3VycmVudENvZGVjLT5zZWNvbmQudHlwZU1hcC5lbmQoKSkgewotICAgICAgICAgICAgQUxPR0UoImFkZFR5cGVGcm9tQXR0cmlidXRlczogcmUtZGVmaW5pbmcgZXhpc3RpbmcgdHlwZSB3aXRob3V0IHVwZGF0ZSIpOwotICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICBBTE9HVygiYWRkVHlwZUZyb21BdHRyaWJ1dGVzOiB0cnlpbmcgdG8gdXBkYXRlICIKKyAgICAgICAgICAgICAgICAgICJleGlzdGluZyB0eXBlIFwiJXNcIiIsIG5hbWUpOworICAgICAgICAgICAgcmV0dXJuIEFMUkVBRFlfRVhJU1RTOwogICAgICAgICB9CiAgICAgICAgIG1DdXJyZW50VHlwZSA9IG1DdXJyZW50Q29kZWMtPnNlY29uZC50eXBlTWFwLmluc2VydCgKICAgICAgICAgICAgICAgICBUeXBlKG5hbWUsIEF0dHJpYnV0ZU1hcCgpKSkuZmlyc3Q7CiAgICAgfSBlbHNlIGlmIChtQ3VycmVudFR5cGUgPT0gbUN1cnJlbnRDb2RlYy0+c2Vjb25kLnR5cGVNYXAuZW5kKCkpIHsKICAgICAgICAgQUxPR0UoImFkZFR5cGVGcm9tQXR0cmlidXRlczogdXBkYXRpbmcgbm9uLWV4aXN0aW5nIHR5cGUiKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAgICAgcmV0dXJuIE9LOwogfQogCiBzdGF0dXNfdCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6YWRkTGltaXQoY29uc3QgY2hhciAqKmF0dHJzKSB7CisgICAgaWYgKG1DdXJyZW50Q29kZWMgPT0gbUNvZGVjTWFwLmVuZCgpKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIGlmIChtQ3VycmVudFR5cGUgPT0gbUN1cnJlbnRDb2RlYy0+c2Vjb25kLnR5cGVNYXAuZW5kKCkpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKICAgICBjb25zdCBjaGFyKiBhX25hbWUgPSBudWxscHRyOwogICAgIGNvbnN0IGNoYXIqIGFfZGVmYXVsdCA9IG51bGxwdHI7CiAgICAgY29uc3QgY2hhciogYV9pbiA9IG51bGxwdHI7CkBAIC02NjUsNzggKzY4Myw3MyBAQAogICAgICAgICBpZiAoc3RyRXEoYXR0cnNbaV0sICJuYW1lIikpIHsKICAgICAgICAgICAgIGlmIChhdHRyc1srK2ldID09IG51bGxwdHIpIHsKICAgICAgICAgICAgICAgICBBTE9HRSgiYWRkTGltaXQ6IG5hbWUgaXMgbnVsbCIpOwotICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBhX25hbWUgPSBhdHRyc1tpXTsKICAgICAgICAgfSBlbHNlIGlmIChzdHJFcShhdHRyc1tpXSwgImRlZmF1bHQiKSkgewogICAgICAgICAgICAgaWYgKGF0dHJzWysraV0gPT0gbnVsbHB0cikgewogICAgICAgICAgICAgICAgIEFMT0dFKCJhZGRMaW1pdDogZGVmYXVsdCBpcyBudWxsIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGFfZGVmYXVsdCA9IGF0dHJzW2ldOwogICAgICAgICB9IGVsc2UgaWYgKHN0ckVxKGF0dHJzW2ldLCAiaW4iKSkgewogICAgICAgICAgICAgaWYgKGF0dHJzWysraV0gPT0gbnVsbHB0cikgewogICAgICAgICAgICAgICAgIEFMT0dFKCJhZGRMaW1pdDogaW4gaXMgbnVsbCIpOwotICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBhX2luID0gYXR0cnNbaV07CiAgICAgICAgIH0gZWxzZSBpZiAoc3RyRXEoYXR0cnNbaV0sICJtYXgiKSkgewogICAgICAgICAgICAgaWYgKGF0dHJzWysraV0gPT0gbnVsbHB0cikgewogICAgICAgICAgICAgICAgIEFMT0dFKCJhZGRMaW1pdDogbWF4IGlzIG51bGwiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYV9tYXggPSBhdHRyc1tpXTsKICAgICAgICAgfSBlbHNlIGlmIChzdHJFcShhdHRyc1tpXSwgIm1pbiIpKSB7CiAgICAgICAgICAgICBpZiAoYXR0cnNbKytpXSA9PSBudWxscHRyKSB7CiAgICAgICAgICAgICAgICAgQUxPR0UoImFkZExpbWl0OiBtaW4gaXMgbnVsbCIpOwotICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBhX21pbiA9IGF0dHJzW2ldOwogICAgICAgICB9IGVsc2UgaWYgKHN0ckVxKGF0dHJzW2ldLCAicmFuZ2UiKSkgewogICAgICAgICAgICAgaWYgKGF0dHJzWysraV0gPT0gbnVsbHB0cikgewogICAgICAgICAgICAgICAgIEFMT0dFKCJhZGRMaW1pdDogcmFuZ2UgaXMgbnVsbCIpOwotICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBhX3JhbmdlID0gYXR0cnNbaV07CiAgICAgICAgIH0gZWxzZSBpZiAoc3RyRXEoYXR0cnNbaV0sICJyYW5nZXMiKSkgewogICAgICAgICAgICAgaWYgKGF0dHJzWysraV0gPT0gbnVsbHB0cikgewogICAgICAgICAgICAgICAgIEFMT0dFKCJhZGRMaW1pdDogcmFuZ2VzIGlzIG51bGwiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYV9yYW5nZXMgPSBhdHRyc1tpXTsKICAgICAgICAgfSBlbHNlIGlmIChzdHJFcShhdHRyc1tpXSwgInNjYWxlIikpIHsKICAgICAgICAgICAgIGlmIChhdHRyc1srK2ldID09IG51bGxwdHIpIHsKICAgICAgICAgICAgICAgICBBTE9HRSgiYWRkTGltaXQ6IHNjYWxlIGlzIG51bGwiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYV9zY2FsZSA9IGF0dHJzW2ldOwogICAgICAgICB9IGVsc2UgaWYgKHN0ckVxKGF0dHJzW2ldLCAidmFsdWUiKSkgewogICAgICAgICAgICAgaWYgKGF0dHJzWysraV0gPT0gbnVsbHB0cikgewogICAgICAgICAgICAgICAgIEFMT0dFKCJhZGRMaW1pdDogdmFsdWUgaXMgbnVsbCIpOwotICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBhX3ZhbHVlID0gYXR0cnNbaV07CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBBTE9HRSgiYWRkTGltaXQ6IHVucmVjb2duaXplZCBsaW1pdDogJXMiLCBhdHRyc1tpXSk7Ci0gICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KICAgICAgICAgKytpOwogICAgIH0KIAogICAgIGlmIChhX25hbWUgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRSgibGltaXQgd2l0aCBubyAnbmFtZScgYXR0cmlidXRlIik7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAogICAgIC8vIHNpemUsIGJsb2NrcywgYml0cmF0ZSwgZnJhbWUtcmF0ZSwgYmxvY2tzLXBlci1zZWNvbmQsIGFzcGVjdC1yYXRpbywKICAgICAvLyBtZWFzdXJlZC1mcmFtZS1yYXRlLCBtZWFzdXJlZC1ibG9ja3MtcGVyLXNlY29uZDogcmFuZ2UKICAgICAvLyBxdWFsaXR5OiByYW5nZSArIGRlZmF1bHQgKyBbc2NhbGVdCiAgICAgLy8gY29tcGxleGl0eTogcmFuZ2UgKyBkZWZhdWx0Ci0gICAgaWYgKG1DdXJyZW50VHlwZSA9PSBtQ3VycmVudENvZGVjLT5zZWNvbmQudHlwZU1hcC5lbmQoKSkgewotICAgICAgICBBTE9HVygiaWdub3JpbmcgbnVsbCB0eXBlIik7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0KICAgICBzdGQ6OnN0cmluZyByYW5nZTsKICAgICBpZiAoc3RyRXEoYV9uYW1lLCAiYXNwZWN0LXJhdGlvIikgfHwKICAgICAgICAgICAgIHN0ckVxKGFfbmFtZSwgImJpdHJhdGUiKSB8fApAQCAtODgwLDYgKzg5MywxMyBAQAogfQogCiBzdGF0dXNfdCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6YWRkRmVhdHVyZShjb25zdCBjaGFyICoqYXR0cnMpIHsKKyAgICBpZiAobUN1cnJlbnRDb2RlYyA9PSBtQ29kZWNNYXAuZW5kKCkpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgaWYgKG1DdXJyZW50VHlwZSA9PSBtQ3VycmVudENvZGVjLT5zZWNvbmQudHlwZU1hcC5lbmQoKSkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKwogICAgIHNpemVfdCBpID0gMDsKICAgICBjb25zdCBjaGFyICpuYW1lID0gbnVsbHB0cjsKICAgICBpbnQzMl90IG9wdGlvbmFsID0gLTE7CkBAIC04OTAsMzAgKzkxMCwzMCBAQAogICAgICAgICBpZiAoc3RyRXEoYXR0cnNbaV0sICJuYW1lIikpIHsKICAgICAgICAgICAgIGlmIChhdHRyc1srK2ldID09IG51bGxwdHIpIHsKICAgICAgICAgICAgICAgICBBTE9HRSgiYWRkRmVhdHVyZTogbmFtZSBpcyBudWxsIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG5hbWUgPSBhdHRyc1tpXTsKICAgICAgICAgfSBlbHNlIGlmIChzdHJFcShhdHRyc1tpXSwgIm9wdGlvbmFsIikpIHsKICAgICAgICAgICAgIGlmIChhdHRyc1srK2ldID09IG51bGxwdHIpIHsKICAgICAgICAgICAgICAgICBBTE9HRSgiYWRkRmVhdHVyZTogb3B0aW9uYWwgaXMgbnVsbCIpOwotICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBvcHRpb25hbCA9IHBhcnNlQm9vbGVhbihhdHRyc1tpXSkgPyAxIDogMDsKICAgICAgICAgfSBlbHNlIGlmIChzdHJFcShhdHRyc1tpXSwgInJlcXVpcmVkIikpIHsKICAgICAgICAgICAgIGlmIChhdHRyc1srK2ldID09IG51bGxwdHIpIHsKICAgICAgICAgICAgICAgICBBTE9HRSgiYWRkRmVhdHVyZTogcmVxdWlyZWQgaXMgbnVsbCIpOwotICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXF1aXJlZCA9IHBhcnNlQm9vbGVhbihhdHRyc1tpXSkgPyAxIDogMDsKICAgICAgICAgfSBlbHNlIGlmIChzdHJFcShhdHRyc1tpXSwgInZhbHVlIikpIHsKICAgICAgICAgICAgIGlmIChhdHRyc1srK2ldID09IG51bGxwdHIpIHsKICAgICAgICAgICAgICAgICBBTE9HRSgiYWRkRmVhdHVyZTogdmFsdWUgaXMgbnVsbCIpOwotICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICB2YWx1ZSA9IGF0dHJzW2ldOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgQUxPR0UoImFkZEZlYXR1cmU6IHVucmVjb2duaXplZCBhdHRyaWJ1dGU6ICVzIiwgYXR0cnNbaV0pOwotICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICB9CiAgICAgICAgICsraTsKICAgICB9CkBAIC05MjEsMjMgKzk0MSwxOCBAQAogICAgIC8vIEV2ZXJ5IGZlYXR1cmUgbXVzdCBoYXZlIGEgbmFtZS4KICAgICBpZiAobmFtZSA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dFKCJmZWF0dXJlIHdpdGggbm8gJ25hbWUnIGF0dHJpYnV0ZSIpOwotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0KLSAgICBpZiAobUN1cnJlbnRUeXBlID09IG1DdXJyZW50Q29kZWMtPnNlY29uZC50eXBlTWFwLmVuZCgpKSB7Ci0gICAgICAgIEFMT0dXKCJpZ25vcmluZyBudWxsIHR5cGUiKTsKLSAgICAgICAgcmV0dXJuIE9LOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAogICAgIGlmICgob3B0aW9uYWwgIT0gLTEpIHx8IChyZXF1aXJlZCAhPSAtMSkpIHsKICAgICAgICAgaWYgKG9wdGlvbmFsID09IHJlcXVpcmVkKSB7CiAgICAgICAgICAgICBBTE9HRSgiZmVhdHVyZSAnJXMnIGlzIGJvdGgvbmVpdGhlciBvcHRpb25hbCBhbmQgcmVxdWlyZWQiLCBuYW1lKTsKLSAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgfQogICAgICAgICBpZiAoKG9wdGlvbmFsID09IDEpIHx8IChyZXF1aXJlZCA9PSAxKSkgewogICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGxwdHIpIHsKICAgICAgICAgICAgICAgICBBTE9HRSgiZmVhdHVyZSAnJXMnIGNhbm5vdCBoYXZlIGV4dHJhICd2YWx1ZSciLCBuYW1lKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgbUN1cnJlbnRUeXBlLT5zZWNvbmRbc3RkOjpzdHJpbmcoImZlYXR1cmUtIikgKyBuYW1lXSA9CiAgICAgICAgICAgICAgICAgICAgIG9wdGlvbmFsID09IDEgPyAiMCIgOiAiMSI7CmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwRmZzSGFuZGxlLmNwcCBiL21lZGlhL210cC9NdHBGZnNIYW5kbGUuY3BwCmluZGV4IGYyNWZjNzEuLmFkM2MwNjggMTAwNjQ0Ci0tLSBhL21lZGlhL210cC9NdHBGZnNIYW5kbGUuY3BwCisrKyBiL21lZGlhL210cC9NdHBGZnNIYW5kbGUuY3BwCkBAIC0yMTIsNyArMjEyLDYgQEAKICAgICB1aW50MTZfdCB2YWx1ZSA9IHNldHVwLT53VmFsdWU7CiAgICAgc3RkOjp2ZWN0b3I8Y2hhcj4gYnVmOwogICAgIGJ1Zi5yZXNpemUobGVuZ3RoKTsKLSAgICBpbnQgcmV0ID0gMDsKIAogICAgIGlmICghKHR5cGUgJiBVU0JfRElSX0lOKSkgewogICAgICAgICBpZiAoOjpyZWFkKG1Db250cm9sLCBidWYuZGF0YSgpLCBsZW5ndGgpICE9IGxlbmd0aCkgewpAQCAtMjI1LDggKzIyNCw4IEBACiAgICAgICAgIGNhc2UgTVRQX1JFUV9SRVNFVDoKICAgICAgICAgY2FzZSBNVFBfUkVRX0NBTkNFTDoKICAgICAgICAgICAgIGVycm5vID0gRUNBTkNFTEVEOwotICAgICAgICAgICAgcmV0ID0gLTE7Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgLy8gICAgYnJlYWs7CiAgICAgICAgIGNhc2UgTVRQX1JFUV9HRVRfREVWSUNFX1NUQVRVUzoKICAgICAgICAgewogICAgICAgICAgICAgaWYgKGxlbmd0aCA8IHNpemVvZihzdHJ1Y3QgbXRwX2RldmljZV9zdGF0dXMpICsgNCkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cFNlcnZlci5jcHAgYi9tZWRpYS9tdHAvTXRwU2VydmVyLmNwcAppbmRleCBjY2RkZDZlLi5jYThjYjc4IDEwMDY0NAotLS0gYS9tZWRpYS9tdHAvTXRwU2VydmVyLmNwcAorKysgYi9tZWRpYS9tdHAvTXRwU2VydmVyLmNwcApAQCAtOTksNiArOTksNyBAQAogICAgIE1UUF9FVkVOVF9TVE9SRV9BRERFRCwKICAgICBNVFBfRVZFTlRfU1RPUkVfUkVNT1ZFRCwKICAgICBNVFBfRVZFTlRfREVWSUNFX1BST1BfQ0hBTkdFRCwKKyAgICBNVFBfRVZFTlRfT0JKRUNUX0lORk9fQ0hBTkdFRCwKIH07CiAKIE10cFNlcnZlcjo6TXRwU2VydmVyKElNdHBEYXRhYmFzZSogZGF0YWJhc2UsIGludCBjb250cm9sRmQsIGJvb2wgcHRwLApAQCAtMjU5LDYgKzI2MCwxMSBAQAogICAgIHNlbmRFdmVudChNVFBfRVZFTlRfT0JKRUNUX1JFTU9WRUQsIGhhbmRsZSk7CiB9CiAKK3ZvaWQgTXRwU2VydmVyOjpzZW5kT2JqZWN0SW5mb0NoYW5nZWQoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSkgeworICAgIEFMT0dWKCJzZW5kT2JqZWN0SW5mb0NoYW5nZWQgJWRcbiIsIGhhbmRsZSk7CisgICAgc2VuZEV2ZW50KE1UUF9FVkVOVF9PQkpFQ1RfSU5GT19DSEFOR0VELCBoYW5kbGUpOworfQorCiB2b2lkIE10cFNlcnZlcjo6c2VuZFN0b3JlQWRkZWQoTXRwU3RvcmFnZUlEIGlkKSB7CiAgICAgQUxPR1YoInNlbmRTdG9yZUFkZGVkICUwOFhcbiIsIGlkKTsKICAgICBzZW5kRXZlbnQoTVRQX0VWRU5UX1NUT1JFX0FEREVELCBpZCk7CkBAIC00NDIsNiArNDQ4LDkgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KIAorICAgIGlmIChyZXNwb25zZSAhPSBNVFBfUkVTUE9OU0VfT0spCisgICAgICBBTE9HVygiW01UUF0gZ290IHJlc3BvbnNlIDB4JVggaW4gY29tbWFuZCAlcyAoJXgpIiwgcmVzcG9uc2UsCisgICAgICAgICAgICBNdHBEZWJ1Zzo6Z2V0T3BlcmF0aW9uQ29kZU5hbWUob3BlcmF0aW9uKSwgb3BlcmF0aW9uKTsKICAgICBpZiAocmVzcG9uc2UgPT0gTVRQX1JFU1BPTlNFX1RSQU5TQUNUSU9OX0NBTkNFTExFRCkKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIG1SZXNwb25zZS5zZXRSZXNwb25zZUNvZGUocmVzcG9uc2UpOwpAQCAtNjUyLDggKzY2MSw4IEBACiAgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfSU5WQUxJRF9QQVJBTUVURVI7CiAgICAgTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSA9IG1SZXF1ZXN0LmdldFBhcmFtZXRlcigxKTsKICAgICBNdHBPYmplY3RQcm9wZXJ0eSBwcm9wZXJ0eSA9IG1SZXF1ZXN0LmdldFBhcmFtZXRlcigyKTsKLSAgICBBTE9HVigiR2V0T2JqZWN0UHJvcFZhbHVlICVkICVzXG4iLCBoYW5kbGUsCi0gICAgICAgICAgICBNdHBEZWJ1Zzo6Z2V0T2JqZWN0UHJvcENvZGVOYW1lKHByb3BlcnR5KSk7CisgICAgQUxPR1YoIkdldE9iamVjdFByb3BWYWx1ZSAlZCAlcyAoMHglMDRYKVxuIiwgaGFuZGxlLAorICAgICAgICAgIE10cERlYnVnOjpnZXRPYmplY3RQcm9wQ29kZU5hbWUocHJvcGVydHkpLCBwcm9wZXJ0eSk7CiAKICAgICByZXR1cm4gbURhdGFiYXNlLT5nZXRPYmplY3RQcm9wZXJ0eVZhbHVlKGhhbmRsZSwgcHJvcGVydHksIG1EYXRhKTsKIH0KQEAgLTk0Niw3ICs5NTUsOCBAQAogICAgIGlmICghbURhdGEuZ2V0U3RyaW5nKG1vZGlmaWVkKSkgcmV0dXJuIE1UUF9SRVNQT05TRV9JTlZBTElEX1BBUkFNRVRFUjsgICAgIC8vIGRhdGUgbW9kaWZpZWQKICAgICAvLyBrZXl3b3JkcyBmb2xsb3cKIAotICAgIEFMT0dWKCJuYW1lOiAlcyBmb3JtYXQ6ICUwNFhcbiIsIChjb25zdCBjaGFyICopbmFtZSwgZm9ybWF0KTsKKyAgICBBTE9HVigibmFtZTogJXMgZm9ybWF0OiAweCUwNFggKCVzKVxuIiwgKGNvbnN0IGNoYXIqKW5hbWUsIGZvcm1hdCwKKyAgICAgICAgICBNdHBEZWJ1Zzo6Z2V0Rm9ybWF0Q29kZU5hbWUoZm9ybWF0KSk7CiAgICAgdGltZV90IG1vZGlmaWVkVGltZTsKICAgICBpZiAoIXBhcnNlRGF0ZVRpbWUobW9kaWZpZWQsIG1vZGlmaWVkVGltZSkpCiAgICAgICAgIG1vZGlmaWVkVGltZSA9IDA7CkBAIC05NjcsOSArOTc3LDEwIEBACiAgICAgICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX09CSkVDVF9UT09fTEFSR0U7CiAgICAgfQogCi0gICAgQUxPR0QoInBhdGg6ICVzIHBhcmVudDogJWQgc3RvcmFnZUlEOiAlMDhYIiwgKGNvbnN0IGNoYXIqKXBhdGgsIHBhcmVudCwgc3RvcmFnZUlEKTsKKyAgICBBTE9HVigicGF0aDogJXMgcGFyZW50OiAlZCBzdG9yYWdlSUQ6ICUwOFgiLCAoY29uc3QgY2hhciopcGF0aCwgcGFyZW50LCBzdG9yYWdlSUQpOwogICAgIE10cE9iamVjdEhhbmRsZSBoYW5kbGUgPSBtRGF0YWJhc2UtPmJlZ2luU2VuZE9iamVjdCgoY29uc3QgY2hhciopcGF0aCwgZm9ybWF0LAogICAgICAgICAgICAgcGFyZW50LCBzdG9yYWdlSUQpOworICAgIEFMT0dEKCJoYW5kbGU6ICVkLCBwYXJlbnQ6ICVkLCBzdG9yYWdlSUQ6ICUwOFgiLCBoYW5kbGUsIHBhcmVudCwgc3RvcmFnZUlEKTsKICAgICBpZiAoaGFuZGxlID09IGtJbnZhbGlkT2JqZWN0SGFuZGxlKSB7CiAgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfR0VORVJBTF9FUlJPUjsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwU2VydmVyLmggYi9tZWRpYS9tdHAvTXRwU2VydmVyLmgKaW5kZXggZjY5MzlkNy4uMWY4Nzk5ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbXRwL010cFNlcnZlci5oCisrKyBiL21lZGlhL210cC9NdHBTZXJ2ZXIuaApAQCAtMTE1LDYgKzExNSw3IEBACiAKICAgICB2b2lkICAgICAgICAgICAgICAgIHNlbmRPYmplY3RBZGRlZChNdHBPYmplY3RIYW5kbGUgaGFuZGxlKTsKICAgICB2b2lkICAgICAgICAgICAgICAgIHNlbmRPYmplY3RSZW1vdmVkKE10cE9iamVjdEhhbmRsZSBoYW5kbGUpOworICAgIHZvaWQgICAgICAgICAgICAgICAgc2VuZE9iamVjdEluZm9DaGFuZ2VkKE10cE9iamVjdEhhbmRsZSBoYW5kbGUpOwogICAgIHZvaWQgICAgICAgICAgICAgICAgc2VuZERldmljZVByb3BlcnR5Q2hhbmdlZChNdHBEZXZpY2VQcm9wZXJ0eSBwcm9wZXJ0eSk7CiAKIHByaXZhdGU6CmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvQW5kcm9pZC5icCBiL21lZGlhL25kay9BbmRyb2lkLmJwCmluZGV4IDRhMzY2ODEuLjU0MWJhM2UgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9BbmRyb2lkLmJwCisrKyBiL21lZGlhL25kay9BbmRyb2lkLmJwCkBAIC0zMSw2ICszMSwxMyBAQAogICAgIGxpY2Vuc2U6ICJOT1RJQ0UiLAogfQogCisvLyBmb3IgdXNlIHdpdGggaGVhZGVyX2xpYnMKK2NjX2xpYnJhcnlfaGVhZGVycyB7CisgICAgbmFtZTogIm1lZGlhX25ka19oZWFkZXJzIiwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdCit9CisKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGlibWVkaWFuZGsiLAogCkBAIC01Niw3ICs2Myw2IEBACiAgICAgY2ZsYWdzOiBbCiAgICAgICAgICItZnZpc2liaWxpdHk9aGlkZGVuIiwKICAgICAgICAgIi1ERVhQT1JUPV9fYXR0cmlidXRlX18oKHZpc2liaWxpdHkoXCJkZWZhdWx0XCIpKSkiLAotCiAgICAgICAgICItV2Vycm9yIiwKICAgICAgICAgIi1XYWxsIiwKICAgICBdLApAQCAtNjYsNiArNzIsOCBAQAogICAgIF0sCiAKICAgICBzaGFyZWRfbGliczogWworICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5ncmFwaGljcy5idWZmZXJxdWV1ZUAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oaWRsLnRva2VuQDEuMC11dGlscyIsCiAgICAgICAgICJsaWJiaW5kZXIiLAogICAgICAgICAibGlibWVkaWEiLAogICAgICAgICAibGlibWVkaWFfb214IiwKQEAgLTc0LDE0ICs4MiwxOSBAQAogICAgICAgICAibGlibWVkaWFleHRyYWN0b3IiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHQiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9idWZmZXJxdWV1ZV9oZWxwZXIiLAogICAgICAgICAibGlibG9nIiwKICAgICAgICAgImxpYnV0aWxzIiwKICAgICAgICAgImxpYmN1dGlscyIsCiAgICAgICAgICJsaWJhbmRyb2lkIiwKICAgICAgICAgImxpYmFuZHJvaWRfcnVudGltZSIsCiAgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGliaHdiaW5kZXIiLAorICAgICAgICAibGliaGlkbGJhc2UiLAogICAgICAgICAibGliZ3VpIiwKICAgICAgICAgImxpYnVpIiwKKyAgICAgICAgImxpYm1lZGlhMl9qbmlfY29yZSIsCisgICAgICAgICJsaWJtZWRpYW5ka191dGlscyIsCiAgICAgXSwKIAogICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLApAQCAtOTYsNSArMTA5LDcwIEBACiBsbG5ka19saWJyYXJ5IHsKICAgICBuYW1lOiAibGlibWVkaWFuZGsiLAogICAgIHN5bWJvbF9maWxlOiAibGlibWVkaWFuZGsubWFwLnR4dCIsCi0gICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW5jbHVkZSIsCisgICAgXSwKK30KKworY2NfbGlicmFyeSB7CisgICAgbmFtZTogImxpYm1lZGlhbmRrX3V0aWxzIiwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIk5ka01lZGlhRGF0YVNvdXJjZUNhbGxiYWNrcy5jcHAiLAorICAgIF0sCisKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSIsCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL25kay9pbmNsdWRlIiwKKyAgICBdLAorCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW5jbHVkZSIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV25vLWVycm9yPWRlcHJlY2F0ZWQtZGVjbGFyYXRpb25zIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgXSwKKworICAgIHNhbml0aXplOiB7CisgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCisgICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICBdLAorICAgICAgICBjZmk6IHRydWUsCisgICAgICAgIGRpYWc6IHsKKyAgICAgICAgICAgIGNmaTogdHJ1ZSwKKyAgICAgICAgfSwKKyAgICB9LAorfQorCitjY190ZXN0IHsKKyAgICBuYW1lOiAiQUltYWdlUmVhZGVyV2luZG93SGFuZGxlVGVzdCIsCisgICAgc3JjczogWyJ0ZXN0cy9BSW1hZ2VSZWFkZXJXaW5kb3dIYW5kbGVUZXN0LmNwcCJdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGlibWVkaWFuZGsiLAorICAgICAgICAibGlibWVkaWF1dGlscyIsCisgICAgICAgICJsaWJuYXRpdmV3aW5kb3ciLAorICAgICAgICAibGliZ3VpIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYnVpIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmdyYXBoaWNzLmJ1ZmZlcnF1ZXVlQDEuMCIsCisgICAgXSwKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1EX19BTkRST0lEX1ZOREtfXyIsCisgICAgXSwKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbmRrLyIsCisgICAgXSwKIH0KZGlmZiAtLWdpdCBhL21lZGlhL25kay9OZGtJbWFnZVJlYWRlci5jcHAgYi9tZWRpYS9uZGsvTmRrSW1hZ2VSZWFkZXIuY3BwCmluZGV4IGJlNjM1ZmYuLmI4NmFiNDIgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9OZGtJbWFnZVJlYWRlci5jcHAKKysrIGIvbWVkaWEvbmRrL05ka0ltYWdlUmVhZGVyLmNwcApAQCAtMjgsNiArMjgsNyBAQAogI2luY2x1ZGUgPGFuZHJvaWRfcnVudGltZS9hbmRyb2lkX3ZpZXdfU3VyZmFjZS5oPgogI2luY2x1ZGUgPGFuZHJvaWRfcnVudGltZS9hbmRyb2lkX2hhcmR3YXJlX0hhcmR3YXJlQnVmZmVyLmg+CiAjaW5jbHVkZSA8Z3JhbGxvY3VzYWdlL0dyYWxsb2NVc2FnZUNvbnZlcnNpb24uaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9icWhlbHBlci9XR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+CiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogCkBAIC00Myw2ICs0NCwxMCBAQAogY29uc3QgY2hhciogQUltYWdlUmVhZGVyOjprQ29udGV4dEtleSAgICA9ICJDb250ZXh0IjsKIGNvbnN0IGNoYXIqIEFJbWFnZVJlYWRlcjo6a0dyYXBoaWNCdWZmZXJLZXkgPSAiR3JhcGhpY0J1ZmZlciI7CiAKK3N0YXRpYyBjb25zdGV4cHIgaW50IGtXaW5kb3dIYWxUb2tlblNpemVNYXggPSAyNTY7CisKK3N0YXRpYyBuYXRpdmVfaGFuZGxlX3QgKmNvbnZlcnRIYWxUb2tlblRvTmF0aXZlSGFuZGxlKGNvbnN0IEhhbFRva2VuICZoYWxUb2tlbik7CisKIGJvb2wKIEFJbWFnZVJlYWRlcjo6aXNTdXBwb3J0ZWRGb3JtYXRBbmRVc2FnZShpbnQzMl90IGZvcm1hdCwgdWludDY0X3QgdXNhZ2UpIHsKICAgICAvLyBDaGVjayB3aGV0aGVyIHVzYWdlIGhhcyBlaXRoZXIgQ1BVX1JFQURfT0ZURU4gb3IgQ1BVX1JFQUQgc2V0LiBOb3RlIHRoYXQgY2hlY2sgYWdhaW5zdApAQCAtNjMsNiArNjgsNyBAQAogICAgICAgICBjYXNlIEFJTUFHRV9GT1JNQVRfUkFXMTI6CiAgICAgICAgIGNhc2UgQUlNQUdFX0ZPUk1BVF9ERVBUSDE2OgogICAgICAgICBjYXNlIEFJTUFHRV9GT1JNQVRfREVQVEhfUE9JTlRfQ0xPVUQ6CisgICAgICAgIGNhc2UgQUlNQUdFX0ZPUk1BVF9ZODoKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICBjYXNlIEFJTUFHRV9GT1JNQVRfUFJJVkFURToKICAgICAgICAgICAgIC8vIEZvciBwcml2YXRlIGZvcm1hdCwgY3B1IHVzYWdlIGlzIHByb2hpYml0ZWQuCkBAIC04OSw2ICs5NSw3IEBACiAgICAgICAgIGNhc2UgQUlNQUdFX0ZPUk1BVF9SQVcxMjoKICAgICAgICAgY2FzZSBBSU1BR0VfRk9STUFUX0RFUFRIMTY6CiAgICAgICAgIGNhc2UgQUlNQUdFX0ZPUk1BVF9ERVBUSF9QT0lOVF9DTE9VRDoKKyAgICAgICAgY2FzZSBBSU1BR0VfRk9STUFUX1k4OgogICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgIGNhc2UgQUlNQUdFX0ZPUk1BVF9QUklWQVRFOgogICAgICAgICAgICAgcmV0dXJuIDA7CkBAIC0zNjMsNiArMzcwLDE1IEBACiAgICAgICAgIG1CdWZmZXJJdGVtQ29uc3VtZXItPmFiYW5kb24oKTsKICAgICAgICAgbUJ1ZmZlckl0ZW1Db25zdW1lci0+c2V0RnJhbWVBdmFpbGFibGVMaXN0ZW5lcihudWxscHRyKTsKICAgICB9CisKKyAgICBpZiAobVdpbmRvd0hhbmRsZSAhPSBudWxscHRyKSB7CisgICAgICAgIGludCBzaXplID0gbVdpbmRvd0hhbmRsZS0+ZGF0YVswXTsKKyAgICAgICAgaGlkbF92ZWM8dWludDhfdD4gaGFsVG9rZW47CisgICAgICAgIGhhbFRva2VuLnNldFRvRXh0ZXJuYWwoCisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PHVpbnQ4X3QgKj4oJm1XaW5kb3dIYW5kbGUtPmRhdGFbMV0pLCBzaXplKTsKKyAgICAgICAgZGVsZXRlSGFsVG9rZW4oaGFsVG9rZW4pOworICAgICAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShtV2luZG93SGFuZGxlKTsKKyAgICB9CiB9CiAKIG1lZGlhX3N0YXR1c190CkBAIC01MjIsNiArNTM4LDI1IEBACiAgICAgfQogfQogCittZWRpYV9zdGF0dXNfdCBBSW1hZ2VSZWFkZXI6OmdldFdpbmRvd05hdGl2ZUhhbmRsZShuYXRpdmVfaGFuZGxlICoqaGFuZGxlKSB7CisgICAgaWYgKG1XaW5kb3dIYW5kbGUgIT0gbnVsbHB0cikgeworICAgICAgICAqaGFuZGxlID0gbVdpbmRvd0hhbmRsZTsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9PSzsKKyAgICB9CisgICAgc3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gaGdicCA9CisgICAgICAgIG5ldyBUV0dyYXBoaWNCdWZmZXJQcm9kdWNlcjxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPihtUHJvZHVjZXIpOworICAgIEhhbFRva2VuIGhhbFRva2VuOworICAgIGlmICghY3JlYXRlSGFsVG9rZW4oaGdicCwgJmhhbFRva2VuKSkgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CisgICAgfQorICAgIG1XaW5kb3dIYW5kbGUgPSBjb252ZXJ0SGFsVG9rZW5Ub05hdGl2ZUhhbmRsZShoYWxUb2tlbik7CisgICAgaWYgKCFtV2luZG93SGFuZGxlKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKKyAgICB9CisgICAgKmhhbmRsZSA9IG1XaW5kb3dIYW5kbGU7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKK30KKwogaW50CiBBSW1hZ2VSZWFkZXI6OmdldEJ1ZmZlcldpZHRoKEJ1ZmZlckl0ZW0qIGJ1ZmZlcikgewogICAgIGlmIChidWZmZXIgPT0gTlVMTCkgcmV0dXJuIC0xOwpAQCAtNTg1LDYgKzYyMCwzMyBAQAogICAgIH0KIH0KIAorc3RhdGljIG5hdGl2ZV9oYW5kbGVfdCAqY29udmVydEhhbFRva2VuVG9OYXRpdmVIYW5kbGUoCisgICAgICAgIGNvbnN0IEhhbFRva2VuICZoYWxUb2tlbikgeworICAgIC8vIFdlIGF0dGVtcHQgdG8gc3RvcmUgaGFsVG9rZW4gaW4gdGhlIGludHMgb2YgdGhlIG5hdGl2ZV9oYW5kbGVfdCBhZnRlciBpdHMKKyAgICAvLyBzaXplLiBUaGUgZmlyc3QgaW50IHN0b3JlcyB0aGUgc2l6ZSBvZiB0aGUgdG9rZW4uIFdlIHN0b3JlIHRoaXMgaW4gYW4gaW50CisgICAgLy8gdG8gYXZvaWQgYWxpZ25tZW50IGlzc3VlcyB3aGVyZSBzaXplX3QgYW5kIGludCBkbyBub3QgaGF2ZSB0aGUgc2FtZQorICAgIC8vIGFsaWdubWVudC4KKyAgICBzaXplX3QgbmhEYXRhQnl0ZVNpemUgPSBoYWxUb2tlbi5zaXplKCk7CisgICAgaWYgKG5oRGF0YUJ5dGVTaXplID4ga1dpbmRvd0hhbFRva2VuU2l6ZU1heCkgeworICAgICAgICAvLyBUaGUgc2l6ZSBvZiB0aGUgdG9rZW4gaXNuJ3QgcmVhc29uYWJsZS4uCisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBzaXplX3QgbnVtSW50cyA9IGNlaWwobmhEYXRhQnl0ZVNpemUgLyBzaXplb2YoaW50KSkgKyAxOworCisgICAgLy8gV2UgZG9uJ3QgY2hlY2sgZm9yIG92ZXJmbG93LCB3aGV0aGVyIG51bUludHMgY2FuIGZpdCBpbiBhbiBpbnQsIHNpbmNlIHdlCisgICAgLy8gZXhwZWN0IGtXaW5kb3dIYWxUb2tlblNpemVNYXggdG8gYmUgYSByZWFzb25hYmxlIGxpbWl0LgorICAgIC8vIGNyZWF0ZSBhIG5hdGl2ZV9oYW5kbGVfdCB3aXRoIDAgbnVtRmRzIGFuZCBudW1JbnRzIG51bWJlciBvZiBpbnRzLgorICAgIG5hdGl2ZV9oYW5kbGVfdCAqbmggPQorICAgICAgICBuYXRpdmVfaGFuZGxlX2NyZWF0ZSgwLCBudW1JbnRzKTsKKyAgICBpZiAoIW5oKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICAvLyBTdG9yZSB0aGUgc2l6ZSBvZiB0aGUgdG9rZW4gaW4gdGhlIGZpcnN0IGludC4KKyAgICBuaC0+ZGF0YVswXSA9IG5oRGF0YUJ5dGVTaXplOworICAgIG1lbWNweSgmKG5oLT5kYXRhWzFdKSwgaGFsVG9rZW4uZGF0YSgpLCBuaERhdGFCeXRlU2l6ZSk7CisgICAgcmV0dXJuIG5oOworfQorCiBFWFBPUlQKIG1lZGlhX3N0YXR1c190IEFJbWFnZVJlYWRlcl9uZXcoCiAgICAgICAgIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0LCBpbnQzMl90IGZvcm1hdCwgaW50MzJfdCBtYXhJbWFnZXMsCkBAIC01OTQsNiArNjU2LDE5IEBACiAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIEFIQVJEV0FSRUJVRkZFUl9VU0FHRV9DUFVfUkVBRF9PRlRFTiwgbWF4SW1hZ2VzLCByZWFkZXIpOwogfQogCitleHRlcm4gIkMiIHsKKworRVhQT1JUCittZWRpYV9zdGF0dXNfdCBBSW1hZ2VSZWFkZXJfZ2V0V2luZG93TmF0aXZlSGFuZGxlKAorICAgICAgICBBSW1hZ2VSZWFkZXIgKnJlYWRlciwgLypvdXQqL25hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSkgeworICAgIGlmIChyZWFkZXIgPT0gbnVsbHB0ciB8fCBoYW5kbGUgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgIH0KKyAgICByZXR1cm4gcmVhZGVyLT5nZXRXaW5kb3dOYXRpdmVIYW5kbGUoaGFuZGxlKTsKK30KKworfSAvL2V4dGVybiAiQyIKKwogRVhQT1JUCiBtZWRpYV9zdGF0dXNfdCBBSW1hZ2VSZWFkZXJfbmV3V2l0aFVzYWdlKAogICAgICAgICBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCwgaW50MzJfdCBmb3JtYXQsIHVpbnQ2NF90IHVzYWdlLApkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL05ka0ltYWdlUmVhZGVyUHJpdi5oIGIvbWVkaWEvbmRrL05ka0ltYWdlUmVhZGVyUHJpdi5oCmluZGV4IGJlZDhhMjEuLjc4MTUyZDIgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9OZGtJbWFnZVJlYWRlclByaXYuaAorKysgYi9tZWRpYS9uZGsvTmRrSW1hZ2VSZWFkZXJQcml2LmgKQEAgLTY5LDYgKzY5LDggQEAKICAgICBtZWRpYV9zdGF0dXNfdCBhY3F1aXJlTmV4dEltYWdlKC8qb3V0Ki9BSW1hZ2UqKiBpbWFnZSwgLypvdXQqL2ludCogZmVuY2VGZCk7CiAgICAgbWVkaWFfc3RhdHVzX3QgYWNxdWlyZUxhdGVzdEltYWdlKC8qb3V0Ki9BSW1hZ2UqKiBpbWFnZSwgLypvdXQqL2ludCogZmVuY2VGZCk7CiAKKyAgICBtZWRpYV9zdGF0dXNfdCBnZXRXaW5kb3dOYXRpdmVIYW5kbGUoLypvdXQqL25hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSk7CisKICAgICBBTmF0aXZlV2luZG93KiBnZXRXaW5kb3coKSAgICBjb25zdCB7IHJldHVybiBtV2luZG93LmdldCgpOyB9OwogICAgIGludDMyX3QgICAgICAgIGdldFdpZHRoKCkgICAgIGNvbnN0IHsgcmV0dXJuIG1XaWR0aDsgfTsKICAgICBpbnQzMl90ICAgICAgICBnZXRIZWlnaHQoKSAgICBjb25zdCB7IHJldHVybiBtSGVpZ2h0OyB9OwpAQCAtMTYwLDYgKzE2Miw3IEBACiAgICAgc3A8U3VyZmFjZT4gICAgICAgICAgICAgICAgbVN1cmZhY2U7CiAgICAgc3A8QnVmZmVySXRlbUNvbnN1bWVyPiAgICAgbUJ1ZmZlckl0ZW1Db25zdW1lcjsKICAgICBzcDxBTmF0aXZlV2luZG93PiAgICAgICAgICBtV2luZG93OworICAgIG5hdGl2ZV9oYW5kbGVfdCogICAgICAgICAgIG1XaW5kb3dIYW5kbGUgPSBudWxscHRyOwogCiAgICAgTGlzdDxBSW1hZ2UqPiAgICAgICAgICAgICAgbUFjcXVpcmVkSW1hZ2VzOwogCmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvTmRrTWVkaWFDb2RlYy5jcHAgYi9tZWRpYS9uZGsvTmRrTWVkaWFDb2RlYy5jcHAKaW5kZXggNDIyODVmOC4uYzIzZjE5YiAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL05ka01lZGlhQ29kZWMuY3BwCisrKyBiL21lZGlhL25kay9OZGtNZWRpYUNvZGVjLmNwcApAQCAtMjEsOCArMjEsOCBAQAogCiAjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFDb2RlYy5oPgogI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRXJyb3IuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUZvcm1hdFByaXYuaD4KICNpbmNsdWRlICJOZGtNZWRpYUNyeXB0b1ByaXYuaCIKLSNpbmNsdWRlICJOZGtNZWRpYUZvcm1hdFByaXYuaCIKIAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KZGlmZiAtLWdpdCBhL21lZGlhL25kay9OZGtNZWRpYUNyeXB0by5jcHAgYi9tZWRpYS9uZGsvTmRrTWVkaWFDcnlwdG8uY3BwCmluZGV4IGQ3MTkzY2EuLmI4YWY1ZmYgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9OZGtNZWRpYUNyeXB0by5jcHAKKysrIGIvbWVkaWEvbmRrL05ka01lZGlhQ3J5cHRvLmNwcApAQCAtMjAsNyArMjAsNyBAQAogCiAjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFDcnlwdG8uaD4KICNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUNvZGVjLmg+Ci0jaW5jbHVkZSAiTmRrTWVkaWFGb3JtYXRQcml2LmgiCisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFGb3JtYXRQcml2Lmg+CiAKIAogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvTmRrTWVkaWFEYXRhU291cmNlLmNwcCBiL21lZGlhL25kay9OZGtNZWRpYURhdGFTb3VyY2UuY3BwCmluZGV4IDlkMDBlNWUuLjFhYmVlOTMgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9OZGtNZWRpYURhdGFTb3VyY2UuY3BwCisrKyBiL21lZGlhL25kay9OZGtNZWRpYURhdGFTb3VyY2UuY3BwCkBAIC0yMywxNiArMjMsMjMgQEAKICNpbmNsdWRlIDxqbmkuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KIAorI2luY2x1ZGUgPGFuZHJvaWRfcnVudGltZS9BbmRyb2lkUnVudGltZS5oPgorI2luY2x1ZGUgPGFuZHJvaWRfdXRpbF9CaW5kZXIuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUVycm9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFEYXRhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZUZhY3RvcnkuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9JbnRlcmZhY2VVdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhcGxheWVyMi9KYXZhVk1IZWxwZXIuaD4KKyNpbmNsdWRlIDxtZWRpYXBsYXllcjIvSk1lZGlhMkhUVFBTZXJ2aWNlLmg+CiAKICNpbmNsdWRlICIuLi8uLi9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0hUVFBCYXNlLmgiCiAjaW5jbHVkZSAiLi4vLi4vbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9OdUNhY2hlZFNvdXJjZTIuaCIKKyNpbmNsdWRlICJOZGtNZWRpYURhdGFTb3VyY2VDYWxsYmFja3NQcml2LmgiCiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogCkBAIC00MSwxNCArNDgsMjAgQEAKICAgICBBTWVkaWFEYXRhU291cmNlUmVhZEF0IHJlYWRBdDsKICAgICBBTWVkaWFEYXRhU291cmNlR2V0U2l6ZSBnZXRTaXplOwogICAgIEFNZWRpYURhdGFTb3VyY2VDbG9zZSBjbG9zZTsKKyAgICBBTWVkaWFEYXRhU291cmNlR2V0QXZhaWxhYmxlU2l6ZSBnZXRBdmFpbGFibGVTaXplOworICAgIHNwPERhdGFTb3VyY2U+IG1JbXBsOworICAgIHVpbnQzMl90IG1GbGFnczsKIH07CiAKIE5ka0RhdGFTb3VyY2U6Ok5ka0RhdGFTb3VyY2UoQU1lZGlhRGF0YVNvdXJjZSAqZGF0YVNvdXJjZSkKICAgICA6IG1EYXRhU291cmNlKEFNZWRpYURhdGFTb3VyY2VfbmV3KCkpIHsKLSAgICAgIEFNZWRpYURhdGFTb3VyY2Vfc2V0UmVhZEF0KG1EYXRhU291cmNlLCBkYXRhU291cmNlLT5yZWFkQXQpOwotICAgICAgQU1lZGlhRGF0YVNvdXJjZV9zZXRHZXRTaXplKG1EYXRhU291cmNlLCBkYXRhU291cmNlLT5nZXRTaXplKTsKLSAgICAgIEFNZWRpYURhdGFTb3VyY2Vfc2V0Q2xvc2UobURhdGFTb3VyY2UsIGRhdGFTb3VyY2UtPmNsb3NlKTsKLSAgICAgIEFNZWRpYURhdGFTb3VyY2Vfc2V0VXNlcmRhdGEobURhdGFTb3VyY2UsIGRhdGFTb3VyY2UtPnVzZXJkYXRhKTsKKyAgICBBTWVkaWFEYXRhU291cmNlX3NldFJlYWRBdChtRGF0YVNvdXJjZSwgZGF0YVNvdXJjZS0+cmVhZEF0KTsKKyAgICBBTWVkaWFEYXRhU291cmNlX3NldEdldFNpemUobURhdGFTb3VyY2UsIGRhdGFTb3VyY2UtPmdldFNpemUpOworICAgIEFNZWRpYURhdGFTb3VyY2Vfc2V0Q2xvc2UobURhdGFTb3VyY2UsIGRhdGFTb3VyY2UtPmNsb3NlKTsKKyAgICBBTWVkaWFEYXRhU291cmNlX3NldFVzZXJkYXRhKG1EYXRhU291cmNlLCBkYXRhU291cmNlLT51c2VyZGF0YSk7CisgICAgQU1lZGlhRGF0YVNvdXJjZV9zZXRHZXRBdmFpbGFibGVTaXplKG1EYXRhU291cmNlLCBkYXRhU291cmNlLT5nZXRBdmFpbGFibGVTaXplKTsKKyAgICBtRGF0YVNvdXJjZS0+bUltcGwgPSBkYXRhU291cmNlLT5tSW1wbDsKKyAgICBtRGF0YVNvdXJjZS0+bUZsYWdzID0gZGF0YVNvdXJjZS0+bUZsYWdzOwogfQogCiBOZGtEYXRhU291cmNlOjp+TmRrRGF0YVNvdXJjZSgpIHsKQEAgLTU5LDkgKzcyLDEzIEBACiAgICAgcmV0dXJuIE9LOwogfQogCit1aW50MzJfdCBOZGtEYXRhU291cmNlOjpmbGFncygpIHsKKyAgICByZXR1cm4gbURhdGFTb3VyY2UtPm1GbGFnczsKK30KKwogc3NpemVfdCBOZGtEYXRhU291cmNlOjpyZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOwotICAgIGlmIChtRGF0YVNvdXJjZS0+Z2V0U2l6ZSA9PSBOVUxMIHx8IG1EYXRhU291cmNlLT51c2VyZGF0YSA9PSBOVUxMKSB7CisgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQgPT0gTlVMTCB8fCBtRGF0YVNvdXJjZS0+dXNlcmRhdGEgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogICAgIHJldHVybiBtRGF0YVNvdXJjZS0+cmVhZEF0KG1EYXRhU291cmNlLT51c2VyZGF0YSwgb2Zmc2V0LCBkYXRhLCBzaXplKTsKQEAgLTkyLDYgKzEwOSw5NSBAQAogICAgIH0KIH0KIAorc3RhdHVzX3QgTmRrRGF0YVNvdXJjZTo6Z2V0QXZhaWxhYmxlU2l6ZShvZmY2NF90IG9mZnNldCwgb2ZmNjRfdCAqc2l6ZXB0cikgeworICAgIG9mZjY0X3Qgc2l6ZSA9IC0xOworICAgIGlmIChtRGF0YVNvdXJjZS0+Z2V0QXZhaWxhYmxlU2l6ZSAhPSBOVUxMCisgICAgICAgICAgICAmJiBtRGF0YVNvdXJjZS0+dXNlcmRhdGEgIT0gTlVMTAorICAgICAgICAgICAgJiYgc2l6ZXB0ciAhPSBOVUxMKSB7CisgICAgICAgIHNpemUgPSBtRGF0YVNvdXJjZS0+Z2V0QXZhaWxhYmxlU2l6ZShtRGF0YVNvdXJjZS0+dXNlcmRhdGEsIG9mZnNldCk7CisgICAgICAgICpzaXplcHRyID0gc2l6ZTsKKyAgICB9CisgICAgcmV0dXJuIHNpemUgPj0gMCA/IE9LIDogVU5LTk9XTl9FUlJPUjsKK30KKworc3RhdGljIHNwPE1lZGlhSFRUUFNlcnZpY2U+IGNyZWF0ZU1lZGlhSHR0cFNlcnZpY2VGcm9tSmF2YU9iaihKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGludCB2ZXJzaW9uKSB7CisgICAgaWYgKG9iaiA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBzd2l0Y2ggKHZlcnNpb24pIHsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgcmV0dXJuIGludGVyZmFjZV9jYXN0PElNZWRpYUhUVFBTZXJ2aWNlPihpYmluZGVyRm9ySmF2YU9iamVjdChlbnYsIG9iaikpOworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICByZXR1cm4gbmV3IEpNZWRpYTJIVFRQU2VydmljZShlbnYsIG9iaik7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9Cit9CisKK3N0YXRpYyBzcDxNZWRpYUhUVFBTZXJ2aWNlPiBjcmVhdGVNZWRpYUh0dHBTZXJ2aWNlVGVtcGxhdGUoCisgICAgICAgIEpOSUVudiAqZW52LAorICAgICAgICBjb25zdCBjaGFyICp1cmksCisgICAgICAgIGNvbnN0IGNoYXIgKmNsYXp6LAorICAgICAgICBjb25zdCBjaGFyICptZXRob2QsCisgICAgICAgIGNvbnN0IGNoYXIgKnNpZ25hdHVyZSwKKyAgICAgICAgaW50IHZlcnNpb24pIHsKKyAgICBqb2JqZWN0IHNlcnZpY2UgPSBOVUxMOworICAgIGlmIChlbnYgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiaHR0cCBzZXJ2aWNlIG11c3QgYmUgY3JlYXRlZCBmcm9tIEphdmEgdGhyZWFkIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGpjbGFzcyBtZWRpYWh0dHBjbGFzcyA9IGVudi0+RmluZENsYXNzKGNsYXp6KTsKKyAgICBpZiAobWVkaWFodHRwY2xhc3MgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiY2FuJ3QgZmluZCBNZWRpYSgyKUh0dHBTZXJ2aWNlIik7CisgICAgICAgIGVudi0+RXhjZXB0aW9uQ2xlYXIoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgam1ldGhvZElEIG1lZGlhSHR0cENyZWF0ZU1ldGhvZCA9IGVudi0+R2V0U3RhdGljTWV0aG9kSUQobWVkaWFodHRwY2xhc3MsIG1ldGhvZCwgc2lnbmF0dXJlKTsKKyAgICBpZiAobWVkaWFIdHRwQ3JlYXRlTWV0aG9kID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoImNhbid0IGZpbmQgbWV0aG9kIik7CisgICAgICAgIGVudi0+RXhjZXB0aW9uQ2xlYXIoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAganN0cmluZyBqdXJpID0gZW52LT5OZXdTdHJpbmdVVEYodXJpKTsKKworICAgIHNlcnZpY2UgPSBlbnYtPkNhbGxTdGF0aWNPYmplY3RNZXRob2QobWVkaWFodHRwY2xhc3MsIG1lZGlhSHR0cENyZWF0ZU1ldGhvZCwganVyaSk7CisgICAgZW52LT5EZWxldGVMb2NhbFJlZihqdXJpKTsKKworICAgIGVudi0+RXhjZXB0aW9uQ2xlYXIoKTsKKyAgICBzcDxNZWRpYUhUVFBTZXJ2aWNlPiBodHRwU2VydmljZSA9IGNyZWF0ZU1lZGlhSHR0cFNlcnZpY2VGcm9tSmF2YU9iaihlbnYsIHNlcnZpY2UsIHZlcnNpb24pOworICAgIHJldHVybiBodHRwU2VydmljZTsKKworfQorCitzcDxNZWRpYUhUVFBTZXJ2aWNlPiBjcmVhdGVNZWRpYUh0dHBTZXJ2aWNlKGNvbnN0IGNoYXIgKnVyaSwgaW50IHZlcnNpb24pIHsKKworICAgIEpOSUVudiAqZW52OworICAgIGNvbnN0IGNoYXIgKmNsYXp6LCAqbWV0aG9kLCAqc2lnbmF0dXJlOworCisgICAgc3dpdGNoICh2ZXJzaW9uKSB7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIGVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICAgICAgICAgIGNsYXp6ID0gImFuZHJvaWQvbWVkaWEvTWVkaWFIVFRQU2VydmljZSI7CisgICAgICAgICAgICBtZXRob2QgPSAiY3JlYXRlSHR0cFNlcnZpY2VCaW5kZXJJZk5lY2Vzc2FyeSI7CisgICAgICAgICAgICBzaWduYXR1cmUgPSAiKExqYXZhL2xhbmcvU3RyaW5nOylMYW5kcm9pZC9vcy9JQmluZGVyOyI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKKyAgICAgICAgICAgIGNsYXp6ID0gImFuZHJvaWQvbWVkaWEvTWVkaWEySFRUUFNlcnZpY2UiOworICAgICAgICAgICAgbWV0aG9kID0gImNyZWF0ZUhUVFBTZXJ2aWNlIjsKKyAgICAgICAgICAgIHNpZ25hdHVyZSA9ICIoTGphdmEvbGFuZy9TdHJpbmc7KUxhbmRyb2lkL21lZGlhL01lZGlhMkhUVFBTZXJ2aWNlOyI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHJldHVybiBjcmVhdGVNZWRpYUh0dHBTZXJ2aWNlVGVtcGxhdGUoZW52LCB1cmksIGNsYXp6LCBtZXRob2QsIHNpZ25hdHVyZSwgdmVyc2lvbik7CisKK30KKwogZXh0ZXJuICJDIiB7CiAKIEVYUE9SVApAQCAtMTA1LDYgKzIxMSwzMiBAQAogfQogCiBFWFBPUlQKK0FNZWRpYURhdGFTb3VyY2UqIEFNZWRpYURhdGFTb3VyY2VfbmV3VXJpKAorICAgICAgICBjb25zdCBjaGFyICp1cmksCisgICAgICAgIGludCBudW1oZWFkZXJzLAorICAgICAgICBjb25zdCBjaGFyICogY29uc3QgKmtleV92YWx1ZXMpIHsKKworICAgIHNwPE1lZGlhSFRUUFNlcnZpY2U+IHNlcnZpY2UgPSBjcmVhdGVNZWRpYUh0dHBTZXJ2aWNlKHVyaSwgLyogdmVyc2lvbiA9ICovIDEpOworICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+IGhlYWRlcnM7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1oZWFkZXJzOyArK2kpIHsKKyAgICAgICAgU3RyaW5nOCBrZXk4KGtleV92YWx1ZXNbaSAqIDJdKTsKKyAgICAgICAgU3RyaW5nOCB2YWx1ZTgoa2V5X3ZhbHVlc1tpICogMiArIDFdKTsKKyAgICAgICAgaGVhZGVycy5hZGQoa2V5OCwgdmFsdWU4KTsKKyAgICB9CisKKyAgICBzcDxEYXRhU291cmNlPiBzb3VyY2UgPSBEYXRhU291cmNlRmFjdG9yeTo6Q3JlYXRlRnJvbVVSSShzZXJ2aWNlLCB1cmksICZoZWFkZXJzKTsKKyAgICBpZiAoc291cmNlID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIkFNZWRpYURhdGFTb3VyY2VfbmV3VXJpIHNvdXJjZSBpcyBudWxsIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBBTE9HSSgiQU1lZGlhRGF0YVNvdXJjZV9uZXdVcmkgc291cmNlICVzIGZsYWdzICV1Iiwgc291cmNlLT50b1N0cmluZygpLmNfc3RyKCksIHNvdXJjZS0+ZmxhZ3MoKSk7CisgICAgQU1lZGlhRGF0YVNvdXJjZSogYVNvdXJjZSA9IGNvbnZlcnREYXRhU291cmNlVG9BTWVkaWFEYXRhU291cmNlKHNvdXJjZSk7CisgICAgYVNvdXJjZS0+bUltcGwgPSBzb3VyY2U7CisgICAgYVNvdXJjZS0+bUZsYWdzID0gc291cmNlLT5mbGFncygpOworICAgIHJldHVybiBhU291cmNlOworfQorCitFWFBPUlQKIHZvaWQgQU1lZGlhRGF0YVNvdXJjZV9kZWxldGUoQU1lZGlhRGF0YVNvdXJjZSAqbVNvdXJjZSkgewogICAgIEFMT0dWKCJkdG9yIik7CiAgICAgaWYgKG1Tb3VyY2UgIT0gTlVMTCkgewpAQCAtMTMyLDUgKzI2NCwxNiBAQAogICAgIG1Tb3VyY2UtPmNsb3NlID0gY2xvc2U7CiB9CiAKK0VYUE9SVAordm9pZCBBTWVkaWFEYXRhU291cmNlX2Nsb3NlKEFNZWRpYURhdGFTb3VyY2UgKm1Tb3VyY2UpIHsKKyAgICByZXR1cm4gbVNvdXJjZS0+Y2xvc2UobVNvdXJjZS0+dXNlcmRhdGEpOworfQorCitFWFBPUlQKK3ZvaWQgQU1lZGlhRGF0YVNvdXJjZV9zZXRHZXRBdmFpbGFibGVTaXplKEFNZWRpYURhdGFTb3VyY2UgKm1Tb3VyY2UsCisgICAgICAgIEFNZWRpYURhdGFTb3VyY2VHZXRBdmFpbGFibGVTaXplIGdldEF2YWlsYWJsZVNpemUpIHsKKyAgICBtU291cmNlLT5nZXRBdmFpbGFibGVTaXplID0gZ2V0QXZhaWxhYmxlU2l6ZTsKK30KKwogfSAvLyBleHRlcm4gIkMiCiAKZGlmZiAtLWdpdCBhL21lZGlhL25kay9OZGtNZWRpYURhdGFTb3VyY2VDYWxsYmFja3MuY3BwIGIvbWVkaWEvbmRrL05ka01lZGlhRGF0YVNvdXJjZUNhbGxiYWNrcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODZhNTdkYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL25kay9OZGtNZWRpYURhdGFTb3VyY2VDYWxsYmFja3MuY3BwCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiTmRrTWVkaWFEYXRhU291cmNlQ2FsbGJhY2tzIgorCisjaW5jbHVkZSAiTmRrTWVkaWFEYXRhU291cmNlQ2FsbGJhY2tzUHJpdi5oIgorI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUVycm9yUHJpdi5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3NzaXplX3QgRGF0YVNvdXJjZV9nZXRTaXplKHZvaWQgKnVzZXJkYXRhKSB7CisgICAgRGF0YVNvdXJjZSAqc291cmNlID0gc3RhdGljX2Nhc3Q8RGF0YVNvdXJjZSAqPih1c2VyZGF0YSk7CisgICAgb2ZmNjRfdCBzaXplID0gLTE7CisgICAgc291cmNlLT5nZXRTaXplKCZzaXplKTsKKyAgICByZXR1cm4gc2l6ZTsKK30KKworc3NpemVfdCBEYXRhU291cmNlX3JlYWRBdCh2b2lkICp1c2VyZGF0YSwgb2ZmNjRfdCBvZmZzZXQsIHZvaWQgKiBidWYsIHNpemVfdCBzaXplKSB7CisgICAgRGF0YVNvdXJjZSAqc291cmNlID0gc3RhdGljX2Nhc3Q8RGF0YVNvdXJjZSAqPih1c2VyZGF0YSk7CisgICAgcmV0dXJuIHNvdXJjZS0+cmVhZEF0KG9mZnNldCwgYnVmLCBzaXplKTsKK30KKwordm9pZCBEYXRhU291cmNlX2Nsb3NlKHZvaWQgKnVzZXJkYXRhKSB7CisgICAgRGF0YVNvdXJjZSAqc291cmNlID0gc3RhdGljX2Nhc3Q8RGF0YVNvdXJjZSAqPih1c2VyZGF0YSk7CisgICAgc291cmNlLT5jbG9zZSgpOworfQorCitzc2l6ZV90IERhdGFTb3VyY2VfZ2V0QXZhaWxhYmxlU2l6ZSh2b2lkICp1c2VyZGF0YSwgb2ZmNjRfdCBvZmZzZXQpIHsKKyAgICBvZmY2NF90IHNpemUgPSAtMTsKKyAgICBEYXRhU291cmNlICpzb3VyY2UgPSBzdGF0aWNfY2FzdDxEYXRhU291cmNlICo+KHVzZXJkYXRhKTsKKyAgICBzb3VyY2UtPmdldEF2YWlsYWJsZVNpemUob2Zmc2V0LCAmc2l6ZSk7CisgICAgcmV0dXJuICBzaXplOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL05ka01lZGlhRGF0YVNvdXJjZUNhbGxiYWNrc1ByaXYuaCBiL21lZGlhL25kay9OZGtNZWRpYURhdGFTb3VyY2VDYWxsYmFja3NQcml2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjUwMzMwNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL25kay9OZGtNZWRpYURhdGFTb3VyY2VDYWxsYmFja3NQcml2LmgKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBX01FRElBX0RBVEFfU09VUkNFX0NBTExCQUNLU19ICisKKyNkZWZpbmUgQV9NRURJQV9EQVRBX1NPVVJDRV9DQUxMQkFDS1NfSAorCisjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRGF0YVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRXJyb3IuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzc2l6ZV90IERhdGFTb3VyY2VfZ2V0U2l6ZSh2b2lkICp1c2VyZGF0YSk7CisKK3NzaXplX3QgRGF0YVNvdXJjZV9yZWFkQXQodm9pZCAqdXNlcmRhdGEsIG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICogYnVmLCBzaXplX3Qgc2l6ZSk7CisKK3ZvaWQgRGF0YVNvdXJjZV9jbG9zZSh2b2lkICp1c2VyZGF0YSk7CisKK3NzaXplX3QgRGF0YVNvdXJjZV9nZXRBdmFpbGFibGVTaXplKHZvaWQgKnVzZXJkYXRhLCBvZmY2NF90IG9mZnNldCk7CisKK3N0YXRpYyBpbmxpbmUgQU1lZGlhRGF0YVNvdXJjZSogY29udmVydERhdGFTb3VyY2VUb0FNZWRpYURhdGFTb3VyY2UoY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSkgeworICAgIGlmIChzb3VyY2UgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgQU1lZGlhRGF0YVNvdXJjZSAqbVNvdXJjZSA9IEFNZWRpYURhdGFTb3VyY2VfbmV3KCk7CisgICAgQU1lZGlhRGF0YVNvdXJjZV9zZXRVc2VyZGF0YShtU291cmNlLCBzb3VyY2UuZ2V0KCkpOworICAgIEFNZWRpYURhdGFTb3VyY2Vfc2V0UmVhZEF0KG1Tb3VyY2UsIERhdGFTb3VyY2VfcmVhZEF0KTsKKyAgICBBTWVkaWFEYXRhU291cmNlX3NldEdldFNpemUobVNvdXJjZSwgRGF0YVNvdXJjZV9nZXRTaXplKTsKKyAgICBBTWVkaWFEYXRhU291cmNlX3NldENsb3NlKG1Tb3VyY2UsIERhdGFTb3VyY2VfY2xvc2UpOworICAgIEFNZWRpYURhdGFTb3VyY2Vfc2V0R2V0QXZhaWxhYmxlU2l6ZShtU291cmNlLCBEYXRhU291cmNlX2dldEF2YWlsYWJsZVNpemUpOworICAgIHJldHVybiBtU291cmNlOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFfTUVESUFfREFUQV9TT1VSQ0VfQ0FMTEJBQ0tTX0gKZGlmZiAtLWdpdCBhL21lZGlhL25kay9OZGtNZWRpYURhdGFTb3VyY2VQcml2LmggYi9tZWRpYS9uZGsvTmRrTWVkaWFEYXRhU291cmNlUHJpdi5oCmluZGV4IGVhOWM4NjUuLjE2ZmY5NzQgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9OZGtNZWRpYURhdGFTb3VyY2VQcml2LmgKKysrIGIvbWVkaWEvbmRrL05ka01lZGlhRGF0YVNvdXJjZVByaXYuaApAQCAtMzIsNiArMzIsNyBAQAogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogCiAjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhSFRUUFNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYURhdGFTb3VyY2UuaD4KICNpbmNsdWRlIDx1dGlscy9NdXRleC5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KQEAgLTQzLDExICs0NCwxMyBAQAogICAgIE5ka0RhdGFTb3VyY2UoQU1lZGlhRGF0YVNvdXJjZSAqKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCkgY29uc3Q7CisgICAgdmlydHVhbCB1aW50MzJfdCBmbGFncygpOwogICAgIHZpcnR1YWwgc3NpemVfdCByZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNpemUob2ZmNjRfdCAqKTsKICAgICB2aXJ0dWFsIFN0cmluZzggdG9TdHJpbmcoKTsKICAgICB2aXJ0dWFsIFN0cmluZzggZ2V0TUlNRVR5cGUoKSBjb25zdDsKICAgICB2aXJ0dWFsIHZvaWQgY2xvc2UoKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEF2YWlsYWJsZVNpemUob2ZmNjRfdCBvZmZzZXQsIG9mZjY0X3QgKnNpemUpOwogCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+TmRrRGF0YVNvdXJjZSgpOwpAQCAtNTksNSArNjIsNyBAQAogCiB9OwogCitzcDxNZWRpYUhUVFBTZXJ2aWNlPiBjcmVhdGVNZWRpYUh0dHBTZXJ2aWNlKGNvbnN0IGNoYXIgKnVyaSwgaW50IHZlcnNpb24pOworCiAjZW5kaWYgLy8gX05ES19NRURJQV9EQVRBU09VUkNFX1BSSVZfSAogCmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvTmRrTWVkaWFEcm0uY3BwIGIvbWVkaWEvbmRrL05ka01lZGlhRHJtLmNwcAppbmRleCA2ZDEwZjFjLi41NWFmYjMzIDEwMDY0NAotLS0gYS9tZWRpYS9uZGsvTmRrTWVkaWFEcm0uY3BwCisrKyBiL21lZGlhL25kay9OZGtNZWRpYURybS5jcHAKQEAgLTE3LDYgKzE3LDggQEAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiTmRrTWVkaWFEcm0iCiAKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCiAjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFEcm0uaD4KIAogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CkBAIC00MCwxMCArNDIsMzIgQEAKIHsKIHByaXZhdGU6CiAgICAgQU1lZGlhRHJtICptT2JqOwotICAgIEFNZWRpYURybUV2ZW50TGlzdGVuZXIgbUxpc3RlbmVyOworICAgIEFNZWRpYURybUV2ZW50TGlzdGVuZXIgbUV2ZW50TGlzdGVuZXI7CisgICAgQU1lZGlhRHJtRXhwaXJhdGlvblVwZGF0ZUxpc3RlbmVyIG1FeHBpcmF0aW9uVXBkYXRlTGlzdGVuZXI7CisgICAgQU1lZGlhRHJtS2V5c0NoYW5nZUxpc3RlbmVyIG1LZXlzQ2hhbmdlTGlzdGVuZXI7CiAKIHB1YmxpYzoKLSAgICBEcm1MaXN0ZW5lcihBTWVkaWFEcm0gKm9iaiwgQU1lZGlhRHJtRXZlbnRMaXN0ZW5lciBsaXN0ZW5lcikgOiBtT2JqKG9iaiksIG1MaXN0ZW5lcihsaXN0ZW5lcikge30KKyAgICBEcm1MaXN0ZW5lcihBTWVkaWFEcm0gKm9iaiwgQU1lZGlhRHJtRXZlbnRMaXN0ZW5lciBsaXN0ZW5lcikgOiBtT2JqKG9iaiksCisgICAgICAgICAgICBtRXZlbnRMaXN0ZW5lcihsaXN0ZW5lciksIG1FeHBpcmF0aW9uVXBkYXRlTGlzdGVuZXIoTlVMTCksIG1LZXlzQ2hhbmdlTGlzdGVuZXIoTlVMTCkge30KKworICAgIERybUxpc3RlbmVyKEFNZWRpYURybSAqb2JqLCBBTWVkaWFEcm1FeHBpcmF0aW9uVXBkYXRlTGlzdGVuZXIgbGlzdGVuZXIpIDogbU9iaihvYmopLAorICAgICAgICAgICAgbUV2ZW50TGlzdGVuZXIoTlVMTCksIG1FeHBpcmF0aW9uVXBkYXRlTGlzdGVuZXIobGlzdGVuZXIpLCBtS2V5c0NoYW5nZUxpc3RlbmVyKE5VTEwpIHt9CisKKyAgICBEcm1MaXN0ZW5lcihBTWVkaWFEcm0gKm9iaiwgQU1lZGlhRHJtS2V5c0NoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSA6IG1PYmoob2JqKSwKKyAgICAgICAgICAgIG1FdmVudExpc3RlbmVyKE5VTEwpLCBtRXhwaXJhdGlvblVwZGF0ZUxpc3RlbmVyKE5VTEwpLCBtS2V5c0NoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKSB7fQorCisgICAgdm9pZCBzZXRFdmVudExpc3RlbmVyKEFNZWRpYURybUV2ZW50TGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgbUV2ZW50TGlzdGVuZXIgPSBsaXN0ZW5lcjsKKyAgICB9CisKKyAgICB2b2lkIHNldEV4cGlyYXRpb25VcGRhdGVMaXN0ZW5lcihBTWVkaWFEcm1FeHBpcmF0aW9uVXBkYXRlTGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgbUV4cGlyYXRpb25VcGRhdGVMaXN0ZW5lciA9IGxpc3RlbmVyOworICAgIH0KKworICAgIHZvaWQgc2V0S2V5c0NoYW5nZUxpc3RlbmVyKEFNZWRpYURybUtleXNDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICBtS2V5c0NoYW5nZUxpc3RlbmVyID0gbGlzdGVuZXI7CisgICAgfQorCiAgICAgdm9pZCBub3RpZnkoRHJtUGx1Z2luOjpFdmVudFR5cGUgZXZlbnRUeXBlLCBpbnQgZXh0cmEsIGNvbnN0IFBhcmNlbCAqb2JqKTsKIH07CiAKQEAgLTYyLDI3ICs4Niw3NSBAQAogfTsKIAogdm9pZCBEcm1MaXN0ZW5lcjo6bm90aWZ5KERybVBsdWdpbjo6RXZlbnRUeXBlIGV2ZW50VHlwZSwgaW50IGV4dHJhLCBjb25zdCBQYXJjZWwgKm9iaikgewotICAgIGlmICghbUxpc3RlbmVyKSB7CisgICAgaWYgKCFtRXZlbnRMaXN0ZW5lciAmJiAhbUV4cGlyYXRpb25VcGRhdGVMaXN0ZW5lciAmJiAhbUtleXNDaGFuZ2VMaXN0ZW5lcikgeworICAgICAgICBBTE9HRSgiTm8gbGlzdGVuZXJzIGFyZSBzcGVjaWZpZWQiKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAorICAgIG9iai0+c2V0RGF0YVBvc2l0aW9uKDApOworCiAgICAgQU1lZGlhRHJtU2Vzc2lvbklkIHNlc3Npb25JZCA9IHtOVUxMLCAwfTsKICAgICBpbnQzMl90IHNlc3Npb25JZFNpemUgPSBvYmotPnJlYWRJbnQzMigpOwotICAgIGlmIChzZXNzaW9uSWRTaXplKSB7Ci0gICAgICAgIHVpbnQ4X3QgKnNlc3Npb25JZERhdGEgPSBuZXcgdWludDhfdFtzZXNzaW9uSWRTaXplXTsKLSAgICAgICAgc2Vzc2lvbklkLnB0ciA9IHNlc3Npb25JZERhdGE7Ci0gICAgICAgIHNlc3Npb25JZC5sZW5ndGggPSBzZXNzaW9uSWRTaXplOwotICAgICAgICBvYmotPnJlYWQoc2Vzc2lvbklkRGF0YSwgc2Vzc2lvbklkLmxlbmd0aCk7CisgICAgaWYgKHNlc3Npb25JZFNpemUgPD0gMCkgeworICAgICAgICBBTE9HRSgiSW52YWxpZCBzZXNzaW9uIGlkIHNpemUiKTsKKyAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIGludDMyX3QgZGF0YVNpemUgPSBvYmotPnJlYWRJbnQzMigpOwotICAgIHVpbnQ4X3QgKmRhdGEgPSBOVUxMOwotICAgIGlmIChkYXRhU2l6ZSkgewotICAgICAgICBkYXRhID0gbmV3IHVpbnQ4X3RbZGF0YVNpemVdOwotICAgICAgICBvYmotPnJlYWQoZGF0YSwgZGF0YVNpemUpOworICAgIHN0ZDo6dW5pcXVlX3B0cjx1aW50OF90W10+IHNlc3Npb25JZERhdGEobmV3IHVpbnQ4X3Rbc2Vzc2lvbklkU2l6ZV0pOworICAgIHNlc3Npb25JZC5wdHIgPSBzZXNzaW9uSWREYXRhLmdldCgpOworICAgIHNlc3Npb25JZC5sZW5ndGggPSBzZXNzaW9uSWRTaXplOworICAgIHN0YXR1c190IGVyciA9IG9iai0+cmVhZChzZXNzaW9uSWREYXRhLmdldCgpLCBzZXNzaW9uSWQubGVuZ3RoKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gcmVhZCBzZXNzaW9uIGlkLCBlcnJvcj0lZCIsIGVycik7CisgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICAvLyB0cmFuc2xhdGUgRHJtUGx1Z2luIGV2ZW50IHR5cGVzIGludG8gdGhlaXIgTkRLIGVxdWl2YWxlbnRzCisgICAgaWYgKERybVBsdWdpbjo6a0RybVBsdWdpbkV2ZW50RXhwaXJhdGlvblVwZGF0ZSA9PSBldmVudFR5cGUpIHsKKyAgICAgICAgaW50NjRfdCBleHBpcnlUaW1lSW5NUyA9IG9iai0+cmVhZEludDY0KCk7CisgICAgICAgIGlmIChleHBpcnlUaW1lSW5NUyA+PSAwKSB7CisgICAgICAgICAgICAoKm1FeHBpcmF0aW9uVXBkYXRlTGlzdGVuZXIpKG1PYmosICZzZXNzaW9uSWQsIGV4cGlyeVRpbWVJbk1TKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gcmVhZCBleHBpcnkgdGltZSwgc3RhdHVzPSUiIFBSSWQ2NCAiIiwgZXhwaXJ5VGltZUluTVMpOworICAgICAgICB9CisgICAgICAgIHJldHVybjsKKyAgICB9IGVsc2UgaWYgKERybVBsdWdpbjo6a0RybVBsdWdpbkV2ZW50S2V5c0NoYW5nZSA9PSBldmVudFR5cGUpIHsKKyAgICAgICAgaW50MzJfdCBudW1LZXlzID0gMDsKKyAgICAgICAgZXJyID0gb2JqLT5yZWFkSW50MzIoJm51bUtleXMpOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHJlYWQgbnVtYmVyIG9mIGtleXMgc3RhdHVzLCBlcnJvcj0lZCIsIGVycik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBWZWN0b3I8QU1lZGlhRHJtS2V5U3RhdHVzPiBrZXlzU3RhdHVzOworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8dWludDhfdFtdPiA+IGRhdGFQb2ludGVyczsKKyAgICAgICAgQU1lZGlhRHJtS2V5U3RhdHVzIGtleVN0YXR1czsKKworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bUtleXM7ICsraSkgeworICAgICAgICAgICAga2V5U3RhdHVzLmtleUlkLnB0ciA9IG51bGxwdHI7CisgICAgICAgICAgICBrZXlTdGF0dXMua2V5SWQubGVuZ3RoID0gMDsKKyAgICAgICAgICAgIGludDMyX3QgaWRTaXplID0gb2JqLT5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGlmIChpZFNpemUgPiAwKSB7CisgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPHVpbnQ4X3RbXT4gZGF0YShuZXcgdWludDhfdFtpZFNpemVdKTsKKyAgICAgICAgICAgICAgICBlcnIgPSBvYmotPnJlYWQoZGF0YS5nZXQoKSwgaWRTaXplKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gcmVhZCBrZXkgZGF0YSwgZXJyb3I9JWQiLCBlcnIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGtleVN0YXR1cy5rZXlJZC5wdHIgPSBkYXRhLmdldCgpOworICAgICAgICAgICAgICAgIGtleVN0YXR1cy5rZXlJZC5sZW5ndGggPSBpZFNpemU7CisgICAgICAgICAgICAgICAgZGF0YVBvaW50ZXJzLnB1c2hfYmFjayhzdGQ6Om1vdmUoZGF0YSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAga2V5U3RhdHVzLmtleVR5cGUgPSBzdGF0aWNfY2FzdDxBTWVkaWFEcm1LZXlTdGF0dXNUeXBlPihvYmotPnJlYWRJbnQzMigpKTsKKyAgICAgICAgICAgIGtleXNTdGF0dXMucHVzaChrZXlTdGF0dXMpOworICAgICAgICB9CisKKyAgICAgICAgYm9vbCBoYXNOZXdVc2FibGVLZXkgPSBvYmotPnJlYWRJbnQzMigpOworICAgICAgICAoKm1LZXlzQ2hhbmdlTGlzdGVuZXIpKG1PYmosICZzZXNzaW9uSWQsIGtleXNTdGF0dXMuYXJyYXkoKSwgbnVtS2V5cywgaGFzTmV3VXNhYmxlS2V5KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIEhhbmRsZXMgQU1lZGlhRHJtRXZlbnRMaXN0ZW5lciBiZWxvdzoKKyAgICAvLyAgdHJhbnNsYXRlcyBEcm1QbHVnaW4gZXZlbnQgdHlwZXMgaW50byB0aGVpciBOREsgZXF1aXZhbGVudHMKICAgICBBTWVkaWFEcm1FdmVudFR5cGUgbmRrRXZlbnRUeXBlOwogICAgIHN3aXRjaChldmVudFR5cGUpIHsKICAgICAgICAgY2FzZSBEcm1QbHVnaW46OmtEcm1QbHVnaW5FdmVudFByb3Zpc2lvblJlcXVpcmVkOgpAQCAtOTcsMTkgKzE2OSwzMCBAQAogICAgICAgICBjYXNlIERybVBsdWdpbjo6a0RybVBsdWdpbkV2ZW50VmVuZG9yRGVmaW5lZDoKICAgICAgICAgICAgIG5ka0V2ZW50VHlwZSA9IEVWRU5UX1ZFTkRPUl9ERUZJTkVEOwogICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRHJtUGx1Z2luOjprRHJtUGx1Z2luRXZlbnRTZXNzaW9uUmVjbGFpbWVkOgorICAgICAgICAgICAgbmRrRXZlbnRUeXBlID0gRVZFTlRfU0VTU0lPTl9SRUNMQUlNRUQ7CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIEFMT0dFKCJJbnZhbGlkIGV2ZW50IERybVBsdWdpbjo6RXZlbnRUeXBlICVkLCBpZ25vcmVkIiwgKGludClldmVudFR5cGUpOwotICAgICAgICAgICAgZ290byBjbGVhbnVwOworICAgICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgICgqbUxpc3RlbmVyKShtT2JqLCAmc2Vzc2lvbklkLCBuZGtFdmVudFR5cGUsIGV4dHJhLCBkYXRhLCBkYXRhU2l6ZSk7Ci0KLSBjbGVhbnVwOgotICAgIGRlbGV0ZSBbXSBzZXNzaW9uSWQucHRyOwotICAgIGRlbGV0ZSBbXSBkYXRhOworICAgIGludDMyX3QgZGF0YVNpemUgPSBvYmotPnJlYWRJbnQzMigpOworICAgIHVpbnQ4X3QgKmRhdGEgPSBOVUxMOworICAgIGlmIChkYXRhU2l6ZSA+IDApIHsKKyAgICAgICAgZGF0YSA9IG5ldyB1aW50OF90W2RhdGFTaXplXTsKKyAgICAgICAgZXJyID0gb2JqLT5yZWFkKGRhdGEsIGRhdGFTaXplKTsKKyAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgKCptRXZlbnRMaXN0ZW5lcikobU9iaiwgJnNlc3Npb25JZCwgbmRrRXZlbnRUeXBlLCBleHRyYSwgZGF0YSwgZGF0YVNpemUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byByZWFkIGV2ZW50IGRhdGEsIGVycm9yPSVkIiwgZXJyKTsKKyAgICAgICAgfQorICAgICAgICBkZWxldGUgW10gZGF0YTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiRXJyb3IgcmVhZGluZyBwYXJjZWw6IGludmFsaWQgZXZlbnQgZGF0YSBzaXplPSVkIiwgZGF0YVNpemUpOworICAgIH0KIH0KIAotCiBleHRlcm4gIkMiIHsKIAogc3RhdGljIG1lZGlhX3N0YXR1c190IHRyYW5zbGF0ZVN0YXR1cyhzdGF0dXNfdCBzdGF0dXMpIHsKQEAgLTE5OCw2ICsyODEsOCBAQAogQU1lZGlhRHJtKiBBTWVkaWFEcm1fY3JlYXRlQnlVVUlEKGNvbnN0IEFNZWRpYVVVSUQgdXVpZCkgewogICAgIEFNZWRpYURybSAqbU9iaiA9IG5ldyBBTWVkaWFEcm0oKTsKICAgICBtT2JqLT5tRHJtID0gQ3JlYXRlRHJtRnJvbVVVSUQodXVpZCk7CisKKyAgICBtT2JqLT5tTGlzdGVuZXIuY2xlYXIoKTsKICAgICByZXR1cm4gbU9iajsKIH0KIApAQCAtMjE2LDExICszMDEsNDcgQEAKICAgICBpZiAoIW1PYmogfHwgbU9iai0+bURybSA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU5WQUxJRF9PQkpFQ1Q7CiAgICAgfQotICAgIG1PYmotPm1MaXN0ZW5lciA9IG5ldyBEcm1MaXN0ZW5lcihtT2JqLCBsaXN0ZW5lcik7CisKKyAgICBpZiAobU9iai0+bUxpc3RlbmVyLmdldCgpKSB7CisgICAgICAgIG1PYmotPm1MaXN0ZW5lci0+c2V0RXZlbnRMaXN0ZW5lcihsaXN0ZW5lcik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbU9iai0+bUxpc3RlbmVyID0gbmV3IERybUxpc3RlbmVyKG1PYmosIGxpc3RlbmVyKTsKKyAgICB9CiAgICAgbU9iai0+bURybS0+c2V0TGlzdGVuZXIobU9iai0+bUxpc3RlbmVyKTsKICAgICByZXR1cm4gQU1FRElBX09LOwogfQogCitFWFBPUlQKK21lZGlhX3N0YXR1c190IEFNZWRpYURybV9zZXRPbkV4cGlyYXRpb25VcGRhdGVMaXN0ZW5lcihBTWVkaWFEcm0gKm1PYmosCisgICAgICAgIEFNZWRpYURybUV4cGlyYXRpb25VcGRhdGVMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgIGlmICghbU9iaiB8fCBtT2JqLT5tRHJtID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTlZBTElEX09CSkVDVDsKKyAgICB9CisKKyAgICBpZiAobU9iai0+bUxpc3RlbmVyLmdldCgpKSB7CisgICAgICAgIG1PYmotPm1MaXN0ZW5lci0+c2V0RXhwaXJhdGlvblVwZGF0ZUxpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtT2JqLT5tTGlzdGVuZXIgPSBuZXcgRHJtTGlzdGVuZXIobU9iaiwgbGlzdGVuZXIpOworICAgIH0KKyAgICBtT2JqLT5tRHJtLT5zZXRMaXN0ZW5lcihtT2JqLT5tTGlzdGVuZXIpOworICAgIHJldHVybiBBTUVESUFfT0s7Cit9CisKK0VYUE9SVAorbWVkaWFfc3RhdHVzX3QgQU1lZGlhRHJtX3NldE9uS2V5c0NoYW5nZUxpc3RlbmVyKEFNZWRpYURybSAqbU9iaiwKKyAgICAgICAgQU1lZGlhRHJtS2V5c0NoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgaWYgKCFtT2JqIHx8IG1PYmotPm1Ecm0gPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfT0JKRUNUOworICAgIH0KKworICAgIGlmIChtT2JqLT5tTGlzdGVuZXIuZ2V0KCkpIHsKKyAgICAgICAgbU9iai0+bUxpc3RlbmVyLT5zZXRLZXlzQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1PYmotPm1MaXN0ZW5lciA9IG5ldyBEcm1MaXN0ZW5lcihtT2JqLCBsaXN0ZW5lcik7CisgICAgfQorICAgIG1PYmotPm1Ecm0tPnNldExpc3RlbmVyKG1PYmotPm1MaXN0ZW5lcik7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKK30KIAogc3RhdGljIGJvb2wgZmluZElkKEFNZWRpYURybSAqbU9iaiwgY29uc3QgQU1lZGlhRHJtQnl0ZUFycmF5ICZpZCwgTGlzdDxpZHZlY190Pjo6aXRlcmF0b3IgJml0ZXIpIHsKICAgICBmb3IgKGl0ZXIgPSBtT2JqLT5tSWRzLmJlZ2luKCk7IGl0ZXIgIT0gbU9iai0+bUlkcy5lbmQoKTsgKytpdGVyKSB7CkBAIC0zMDksNiArNDMwLDcgQEAKICAgICB9CiAgICAgU3RyaW5nOCBkZWZhdWx0VXJsOwogICAgIERybVBsdWdpbjo6S2V5UmVxdWVzdFR5cGUga2V5UmVxdWVzdFR5cGU7CisgICAgbU9iai0+bUtleVJlcXVlc3QuY2xlYXIoKTsKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtT2JqLT5tRHJtLT5nZXRLZXlSZXF1ZXN0KCppdGVyLCBtZEluaXQsIFN0cmluZzgobWltZVR5cGUpLAogICAgICAgICAgICAgbWRLZXlUeXBlLCBtZE9wdGlvbmFsUGFyYW1ldGVycywgbU9iai0+bUtleVJlcXVlc3QsIGRlZmF1bHRVcmwsCiAgICAgICAgICAgICAma2V5UmVxdWVzdFR5cGUpOwpAQCAtNTc2LDcgKzY5OCw3IEBACiAgICAgVmVjdG9yPHVpbnQ4X3Q+IGJ5dGVBcnJheTsKICAgICBieXRlQXJyYXkuYXBwZW5kQXJyYXkodmFsdWUsIHZhbHVlU2l6ZSk7CiAKLSAgICByZXR1cm4gdHJhbnNsYXRlU3RhdHVzKG1PYmotPm1Ecm0tPmdldFByb3BlcnR5Qnl0ZUFycmF5KFN0cmluZzgocHJvcGVydHlOYW1lKSwKKyAgICByZXR1cm4gdHJhbnNsYXRlU3RhdHVzKG1PYmotPm1Ecm0tPnNldFByb3BlcnR5Qnl0ZUFycmF5KFN0cmluZzgocHJvcGVydHlOYW1lKSwKICAgICAgICAgICAgICAgICAgICAgYnl0ZUFycmF5KSk7CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL25kay9OZGtNZWRpYUV4dHJhY3Rvci5jcHAgYi9tZWRpYS9uZGsvTmRrTWVkaWFFeHRyYWN0b3IuY3BwCmluZGV4IGI1ZTYwYTQuLmY2OTdiZDEgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9OZGtNZWRpYUV4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvbmRrL05ka01lZGlhRXh0cmFjdG9yLmNwcApAQCAtMjAsOCArMjAsOSBAQAogCiAjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFFcnJvci5oPgogI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRXh0cmFjdG9yLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFFcnJvclByaXYuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUZvcm1hdFByaXYuaD4KICNpbmNsdWRlICJOZGtNZWRpYURhdGFTb3VyY2VQcml2LmgiCi0jaW5jbHVkZSAiTmRrTWVkaWFGb3JtYXRQcml2LmgiCiAKIAogI2luY2x1ZGUgPGludHR5cGVzLmg+CkBAIC00MCwxOSArNDEsNiBAQAogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIAotc3RhdGljIG1lZGlhX3N0YXR1c190IHRyYW5zbGF0ZV9lcnJvcihzdGF0dXNfdCBlcnIpIHsKLSAgICBpZiAoZXJyID09IE9LKSB7Ci0gICAgICAgIHJldHVybiBBTUVESUFfT0s7Ci0gICAgfSBlbHNlIGlmIChlcnIgPT0gRVJST1JfRU5EX09GX1NUUkVBTSkgewotICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0VORF9PRl9TVFJFQU07Ci0gICAgfSBlbHNlIGlmIChlcnIgPT0gRVJST1JfSU8pIHsKLSAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTzsKLSAgICB9Ci0KLSAgICBBTE9HRSgic2YgZXJyb3IgY29kZTogJWQiLCBlcnIpOwotICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKLX0KLQogc3RydWN0IEFNZWRpYUV4dHJhY3RvciB7CiAgICAgc3A8TnVNZWRpYUV4dHJhY3Rvcj4gbUltcGw7CiAgICAgc3A8QUJ1ZmZlcj4gbVBzc2hCdWY7CkBAIC04Miw0NyArNzAsMzUgQEAKICAgICByZXR1cm4gdHJhbnNsYXRlX2Vycm9yKG1EYXRhLT5tSW1wbC0+c2V0RGF0YVNvdXJjZShmZCwgb2Zmc2V0LCBsZW5ndGgpKTsKIH0KIAorbWVkaWFfc3RhdHVzX3QgQU1lZGlhRXh0cmFjdG9yX3NldERhdGFTb3VyY2VXaXRoSGVhZGVycyhBTWVkaWFFeHRyYWN0b3IgKm1EYXRhLAorICAgICAgICBjb25zdCBjaGFyICp1cmksCisgICAgICAgIGludCBudW1oZWFkZXJzLAorICAgICAgICBjb25zdCBjaGFyICogY29uc3QgKmtleXMsCisgICAgICAgIGNvbnN0IGNoYXIgKiBjb25zdCAqdmFsdWVzKSB7CisKKyAgICBBTE9HVigic2V0RGF0YVNvdXJjZSglcykiLCB1cmkpOworCisgICAgc3A8TWVkaWFIVFRQU2VydmljZT4gaHR0cFNlcnZpY2UgPSBjcmVhdGVNZWRpYUh0dHBTZXJ2aWNlKHVyaSwgLyogdmVyc2lvbiA9ICovIDEpOworICAgIGlmIChodHRwU2VydmljZSA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJjYW4ndCBjcmVhdGUgaHR0cCBzZXJ2aWNlIik7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5TVVBQT1JURUQ7CisgICAgfQorCisgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gaGVhZGVyczsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bWhlYWRlcnM7ICsraSkgeworICAgICAgICBTdHJpbmc4IGtleTgoa2V5c1tpXSk7CisgICAgICAgIFN0cmluZzggdmFsdWU4KHZhbHVlc1tpXSk7CisgICAgICAgIGhlYWRlcnMuYWRkKGtleTgsIHZhbHVlOCk7CisgICAgfQorCisgICAgc3RhdHVzX3QgZXJyOworICAgIGVyciA9IG1EYXRhLT5tSW1wbC0+c2V0RGF0YVNvdXJjZShodHRwU2VydmljZSwgdXJpLCBudW1oZWFkZXJzID4gMCA/ICZoZWFkZXJzIDogTlVMTCk7CisgICAgcmV0dXJuIHRyYW5zbGF0ZV9lcnJvcihlcnIpOworfQorCiBFWFBPUlQKIG1lZGlhX3N0YXR1c190IEFNZWRpYUV4dHJhY3Rvcl9zZXREYXRhU291cmNlKEFNZWRpYUV4dHJhY3RvciAqbURhdGEsIGNvbnN0IGNoYXIgKmxvY2F0aW9uKSB7Ci0gICAgQUxPR1YoInNldERhdGFTb3VyY2UoJXMpIiwgbG9jYXRpb24pOwotICAgIC8vIFRPRE86IGFkZCBoZWFkZXIgc3VwcG9ydAotCi0gICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7Ci0gICAgam9iamVjdCBzZXJ2aWNlID0gTlVMTDsKLSAgICBpZiAoZW52ID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoInNldERhdGFTb3VyY2UocGF0aCkgbXVzdCBiZSBjYWxsZWQgZnJvbSBKYXZhIHRocmVhZCIpOwotICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOU1VQUE9SVEVEOwotICAgIH0KLQotICAgIGpjbGFzcyBtZWRpYWh0dHBjbGFzcyA9IGVudi0+RmluZENsYXNzKCJhbmRyb2lkL21lZGlhL01lZGlhSFRUUFNlcnZpY2UiKTsKLSAgICBpZiAobWVkaWFodHRwY2xhc3MgPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgiY2FuJ3QgZmluZCBNZWRpYUh0dHBTZXJ2aWNlIik7Ci0gICAgICAgIGVudi0+RXhjZXB0aW9uQ2xlYXIoKTsKLSAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTlNVUFBPUlRFRDsKLSAgICB9Ci0KLSAgICBqbWV0aG9kSUQgbWVkaWFIdHRwQ3JlYXRlTWV0aG9kID0gZW52LT5HZXRTdGF0aWNNZXRob2RJRChtZWRpYWh0dHBjbGFzcywKLSAgICAgICAgICAgICJjcmVhdGVIdHRwU2VydmljZUJpbmRlcklmTmVjZXNzYXJ5IiwgIihMamF2YS9sYW5nL1N0cmluZzspTGFuZHJvaWQvb3MvSUJpbmRlcjsiKTsKLSAgICBpZiAobWVkaWFIdHRwQ3JlYXRlTWV0aG9kID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoImNhbid0IGZpbmQgbWV0aG9kIik7Ci0gICAgICAgIGVudi0+RXhjZXB0aW9uQ2xlYXIoKTsKLSAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTlNVUFBPUlRFRDsKLSAgICB9Ci0KLSAgICBqc3RyaW5nIGpsb2MgPSBlbnYtPk5ld1N0cmluZ1VURihsb2NhdGlvbik7Ci0KLSAgICBzZXJ2aWNlID0gZW52LT5DYWxsU3RhdGljT2JqZWN0TWV0aG9kKG1lZGlhaHR0cGNsYXNzLCBtZWRpYUh0dHBDcmVhdGVNZXRob2QsIGpsb2MpOwotICAgIGVudi0+RGVsZXRlTG9jYWxSZWYoamxvYyk7Ci0KLSAgICBzcDxJTWVkaWFIVFRQU2VydmljZT4gaHR0cFNlcnZpY2U7Ci0gICAgaWYgKHNlcnZpY2UgIT0gTlVMTCkgewotICAgICAgICBzcDxJQmluZGVyPiBiaW5kZXIgPSBpYmluZGVyRm9ySmF2YU9iamVjdChlbnYsIHNlcnZpY2UpOwotICAgICAgICBodHRwU2VydmljZSA9IGludGVyZmFjZV9jYXN0PElNZWRpYUhUVFBTZXJ2aWNlPihiaW5kZXIpOwotICAgIH0KLQotICAgIHN0YXR1c190IGVyciA9IG1EYXRhLT5tSW1wbC0+c2V0RGF0YVNvdXJjZShodHRwU2VydmljZSwgbG9jYXRpb24sIE5VTEwpOwotICAgIGVudi0+RXhjZXB0aW9uQ2xlYXIoKTsKLSAgICByZXR1cm4gdHJhbnNsYXRlX2Vycm9yKGVycik7CisgICAgcmV0dXJuIEFNZWRpYUV4dHJhY3Rvcl9zZXREYXRhU291cmNlV2l0aEhlYWRlcnMobURhdGEsIGxvY2F0aW9uLCAwLCBOVUxMLCBOVUxMKTsKIH0KIAogRVhQT1JUCkBAIC00NzUsMTEgKzQ1MSw1IEBACiAgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAotRVhQT1JUCi1tZWRpYV9zdGF0dXNfdCBBTWVkaWFFeHRyYWN0b3JfZGlzY29ubmVjdChBTWVkaWFFeHRyYWN0b3IgKiBleCkgewotICAgIGV4LT5tSW1wbC0+ZGlzY29ubmVjdCgpOwotICAgIHJldHVybiBBTUVESUFfT0s7Ci19Ci0KIH0gLy8gZXh0ZXJuICJDIgogCmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvTmRrTWVkaWFGb3JtYXQuY3BwIGIvbWVkaWEvbmRrL05ka01lZGlhRm9ybWF0LmNwcAppbmRleCBmMzJiODNlLi5iMjgyZWQ4IDEwMDY0NAotLS0gYS9tZWRpYS9uZGsvTmRrTWVkaWFGb3JtYXQuY3BwCisrKyBiL21lZGlhL25kay9OZGtNZWRpYUZvcm1hdC5jcHAKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDxpbnR0eXBlcy5oPgogCiAjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFGb3JtYXQuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUZvcm1hdFByaXYuaD4KIAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KQEAgLTMyLDMxICszMyw4IEBACiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogCi1zdHJ1Y3QgQU1lZGlhRm9ybWF0IHsKLSAgICBzcDxBTWVzc2FnZT4gbUZvcm1hdDsKLSAgICBTdHJpbmc4IG1EZWJ1ZzsKLSAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiBtU3RyaW5nQ2FjaGU7Ci19OwotCiBleHRlcm4gIkMiIHsKIAotLy8gcHJpdmF0ZSBmdW5jdGlvbnMgZm9yIGNvbnZlcnNpb24gdG8vZnJvbSBBTWVzc2FnZQotQU1lZGlhRm9ybWF0KiBBTWVkaWFGb3JtYXRfZnJvbU1zZyhjb25zdCB2b2lkKiBkYXRhKSB7Ci0gICAgQUxPR1YoInByaXZhdGUgY3RvciIpOwotICAgIEFNZWRpYUZvcm1hdCogbURhdGEgPSBuZXcgQU1lZGlhRm9ybWF0KCk7Ci0gICAgbURhdGEtPm1Gb3JtYXQgPSAqKChzcDxBTWVzc2FnZT4qKWRhdGEpOwotICAgIGlmIChtRGF0YS0+bUZvcm1hdCA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dXKCJnb3QgTlVMTCBmb3JtYXQiKTsKLSAgICAgICAgbURhdGEtPm1Gb3JtYXQgPSBuZXcgQU1lc3NhZ2U7Ci0gICAgfQotICAgIHJldHVybiBtRGF0YTsKLX0KLQotdm9pZCBBTWVkaWFGb3JtYXRfZ2V0Rm9ybWF0KGNvbnN0IEFNZWRpYUZvcm1hdCogbURhdGEsIHZvaWQqIGRlc3QpIHsKLSAgICAqKChzcDxBTWVzc2FnZT4qKWRlc3QpID0gbURhdGEtPm1Gb3JtYXQ7Ci19Ci0KLQogLyoKICAqIHB1YmxpYyBmdW5jdGlvbiBmb2xsb3cKICAqLwpAQCAtNzQsNiArNTIsMjEgQEAKICAgICByZXR1cm4gQU1FRElBX09LOwogfQogCitFWFBPUlQKK3ZvaWQgQU1lZGlhRm9ybWF0X2NsZWFyKEFNZWRpYUZvcm1hdCAqZm9ybWF0KSB7CisgICAgZm9ybWF0LT5tRm9ybWF0LT5jbGVhcigpOworfQorCitFWFBPUlQKK21lZGlhX3N0YXR1c190IEFNZWRpYUZvcm1hdF9jb3B5KEFNZWRpYUZvcm1hdCAqdG8sIEFNZWRpYUZvcm1hdCAqZnJvbSkgeworICAgIGlmICghdG8gfHwgIWZyb20pIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICB9CisgICAgdG8tPm1Gb3JtYXQtPmNsZWFyKCk7CisgICAgdG8tPm1Gb3JtYXQtPmV4dGVuZChmcm9tLT5tRm9ybWF0KTsKKyAgICByZXR1cm4gQU1FRElBX09LOworfQorCiAKIEVYUE9SVAogY29uc3QgY2hhciogQU1lZGlhRm9ybWF0X3RvU3RyaW5nKEFNZWRpYUZvcm1hdCAqbURhdGEpIHsKQEAgLTI1Niw3ICsyNDksNyBAQAogfQogCiBFWFBPUlQKLXZvaWQgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihBTWVkaWFGb3JtYXQqIGZvcm1hdCwgY29uc3QgY2hhciogbmFtZSwgdm9pZCogZGF0YSwgc2l6ZV90IHNpemUpIHsKK3ZvaWQgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihBTWVkaWFGb3JtYXQqIGZvcm1hdCwgY29uc3QgY2hhciogbmFtZSwgY29uc3Qgdm9pZCogZGF0YSwgc2l6ZV90IHNpemUpIHsKICAgICAvLyB0aGUgQUJ1ZmZlcih2b2lkKiwgc2l6ZV90KSBjb25zdHJ1Y3RvciBkb2Vzbid0IHRha2Ugb3duZXJzaGlwIG9mIHRoZSBkYXRhLCBzbyBjcmVhdGUKICAgICAvLyBhIG5ldyBidWZmZXIgYW5kIGNvcHkgdGhlIGRhdGEgaW50byBpdAogICAgIHNwPEFCdWZmZXI+IGJ1ZiA9IG5ldyBBQnVmZmVyKHNpemUpOwpAQCAtMjc1LDMxICsyNjgsNTkgQEAKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FBQ19NQVhfT1VUUFVUX0NIQU5ORUxfQ09VTlQgPSAiYWFjLW1heC1vdXRwdXQtY2hhbm5lbF9jb3VudCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9BQUNfUFJPRklMRSA9ICJhYWMtcHJvZmlsZSI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9BQUNfU0JSX01PREUgPSAiYWFjLXNici1tb2RlIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FMQlVNID0gImFsYnVtIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FMQlVNQVJUID0gImFsYnVtYXJ0IjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FMQlVNQVJUSVNUID0gImFsYnVtYXJ0aXN0IjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FSVElTVCA9ICJhcnRpc3QiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQVVESU9fU0VTU0lPTl9JRCA9ICJhdWRpby1zZXNzaW9uLWlkIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FVVEhPUiA9ICJhdXRob3IiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQklUUkFURV9NT0RFID0gImJpdHJhdGUtbW9kZSI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9CSVRfUkFURSA9ICJiaXRyYXRlIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0JJVFNfUEVSX1NBTVBMRSA9ICJiaXRzLXBlci1zYW1wbGUiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ0FQVFVSRV9SQVRFID0gImNhcHR1cmUtcmF0ZSI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DRFRSQUNLTlVNQkVSID0gImNkdHJhY2tudW0iOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9DT1VOVCA9ICJjaGFubmVsLWNvdW50IjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfTUFTSyA9ICJjaGFubmVsLW1hc2siOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ09MT1JfRk9STUFUID0gImNvbG9yLWZvcm1hdCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DT0xPUl9SQU5HRSA9ICJjb2xvci1yYW5nZSI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DT0xPUl9TVEFOREFSRCA9ICJjb2xvci1zdGFuZGFyZCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DT0xPUl9UUkFOU0ZFUiA9ICJjb2xvci10cmFuc2ZlciI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DT01QSUxBVElPTiA9ICJjb21waWxhdGlvbiI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DT01QTEVYSVRZID0gImNvbXBsZXhpdHkiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ09NUE9TRVIgPSAiY29tcG9zZXIiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0RFRkFVTFRfSVZfU0laRSA9ICJjcnlwdG8tZGVmYXVsdC1pdi1zaXplIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19FTkNSWVBURURfQllURV9CTE9DSyA9ICJjcnlwdG8tZW5jcnlwdGVkLWJ5dGUtYmxvY2siOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0lWID0gImNyeXB0by1pdiI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DUllQVE9fS0VZID0gImNyeXB0by1rZXkiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX01PREUgPSAiY3J5cHRvLW1vZGUiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX1NLSVBfQllURV9CTE9DSyA9ICJjcnlwdG8tc2tpcC1ieXRlLWJsb2NrIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NTRCA9ICJjc2QiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzAgPSAiY3NkLTAiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzEgPSAiY3NkLTEiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzIgPSAiY3NkLTIiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ1NEX0FWQyA9ICJjc2QtYXZjIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NTRF9IRVZDID0gImNzZC1oZXZjIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0QyNjMgPSAiZDI2MyI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9EQVRFID0gImRhdGUiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfRElTQ05VTUJFUiA9ICJkaXNjbnVtIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0RJU1BMQVlfQ1JPUCA9ICJjcm9wIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0RJU1BMQVlfSEVJR0hUID0gImRpc3BsYXktaGVpZ2h0IjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0RJU1BMQVlfV0lEVEggPSAiZGlzcGxheS13aWR0aCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9EVVJBVElPTiA9ICJkdXJhdGlvblVzIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0VOQ09ERVJfREVMQVkgPSAiZW5jb2Rlci1kZWxheSI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9FTkNPREVSX1BBRERJTkcgPSAiZW5jb2Rlci1wYWRkaW5nIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0VTRFMgPSAiZXNkcyI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9FWElGX09GRlNFVCA9ICJleGlmLW9mZnNldCI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9FWElGX1NJWkUgPSAiZXhpZi1zaXplIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0ZMQUNfQ09NUFJFU1NJT05fTEVWRUwgPSAiZmxhYy1jb21wcmVzc2lvbi1sZXZlbCI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9GUkFNRV9DT1VOVCA9ICJmcmFtZS1jb3VudCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9GUkFNRV9SQVRFID0gImZyYW1lLXJhdGUiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfR0VOUkUgPSAiZ2VucmUiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfR1JJRF9DT0xVTU5TID0gImdyaWQtY29scyI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9HUklEX1JPV1MgPSAiZ3JpZC1yb3dzIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0hEUl9TVEFUSUNfSU5GTyA9ICJoZHItc3RhdGljLWluZm8iOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfSEVJR0hUID0gImhlaWdodCI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9JQ0NfUFJPRklMRSA9ICJpY2MtcHJvZmlsZSI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9JTlRSQV9SRUZSRVNIX1BFUklPRCA9ICJpbnRyYS1yZWZyZXNoLXBlcmlvZCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9JU19BRFRTID0gImlzLWFkdHMiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfSVNfQVVUT1NFTEVDVCA9ICJpcy1hdXRvc2VsZWN0IjsKQEAgLTMwOSwzMSArMzMwLDQ2IEBACiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9MQU5HVUFHRSA9ICJsYW5ndWFnZSI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9MQVRFTkNZID0gImxhdGVuY3kiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTEVWRUwgPSAibGV2ZWwiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTE9DQVRJT04gPSAibG9jYXRpb24iOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTE9PUCA9ICJsb29wIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0xZUklDSVNUID0gImx5cmljaXN0IjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX01BWF9CSVRfUkFURSA9ICJtYXgtYml0cmF0ZSI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9NQVhfSEVJR0hUID0gIm1heC1oZWlnaHQiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTUFYX0lOUFVUX1NJWkUgPSAibWF4LWlucHV0LXNpemUiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTUFYX1dJRFRIID0gIm1heC13aWR0aCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9NSU1FID0gIm1pbWUiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTVBFR19VU0VSX0RBVEEgPSAibXBlZy11c2VyLWRhdGEiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTVBFRzJfU1RSRUFNX0hFQURFUiA9ICJtcGVnMi1zdHJlYW0taGVhZGVyIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX09QRVJBVElOR19SQVRFID0gIm9wZXJhdGluZy1yYXRlIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1BDTV9FTkNPRElORyA9ICJwY20tZW5jb2RpbmciOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfUFJJT1JJVFkgPSAicHJpb3JpdHkiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfUFJPRklMRSA9ICJwcm9maWxlIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1BDTV9CSUdfRU5ESUFOID0gInBjbS1iaWctZW5kaWFuIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1BTU0ggPSAicHNzaCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9QVVNIX0JMQU5LX0JVRkZFUlNfT05fU1RPUCA9ICJwdXNoLWJsYW5rLWJ1ZmZlcnMtb24tc2h1dGRvd24iOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfUkVQRUFUX1BSRVZJT1VTX0ZSQU1FX0FGVEVSID0gInJlcGVhdC1wcmV2aW91cy1mcmFtZS1hZnRlciI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9ST1RBVElPTiA9ICJyb3RhdGlvbi1kZWdyZWVzIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1NBTVBMRV9SQVRFID0gInNhbXBsZS1yYXRlIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1NBUl9IRUlHSFQgPSAic2FyLWhlaWdodCI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9TQVJfV0lEVEggPSAic2FyLXdpZHRoIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1NFSSA9ICJzZWkiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfU0xJQ0VfSEVJR0hUID0gInNsaWNlLWhlaWdodCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9TVFJJREUgPSAic3RyaWRlIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1RFTVBPUkFMX0xBWUVSX0NPVU5UID0gInRlbXBvcmFsLWxheWVyLWNvdW50IjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1RFTVBPUkFMX0xBWUVSX0lEID0gInRlbXBvcmFsLWxheWVyLWlkIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1RFTVBPUkFMX0xBWUVSSU5HID0gInRzLXNjaGVtYSI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9URVhUX0ZPUk1BVF9EQVRBID0gInRleHQtZm9ybWF0LWRhdGEiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVEhVTUJOQUlMX0hFSUdIVCA9ICJ0aHVtYm5haWwtaGVpZ2h0IjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1RIVU1CTkFJTF9USU1FID0gInRodW1ibmFpbC10aW1lIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1RIVU1CTkFJTF9XSURUSCA9ICJ0aHVtYm5haWwtd2lkdGgiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVElMRV9IRUlHSFQgPSAidGlsZS1oZWlnaHQiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVElMRV9XSURUSCA9ICJ0aWxlLXdpZHRoIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1RJTUVfVVMgPSAidGltZVVzIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1RJVExFID0gInRpdGxlIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1RSQUNLX0lEID0gInRyYWNrLWlkIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1RSQUNLX0lOREVYID0gInRyYWNrLWluZGV4IjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1dJRFRIID0gIndpZHRoIjsKLQorRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfWUVBUiA9ICJ5ZWFyIjsKIAogfSAvLyBleHRlcm4gIkMiCiAKZGlmZiAtLWdpdCBhL21lZGlhL25kay9OZGtNZWRpYUZvcm1hdFByaXYuaCBiL21lZGlhL25kay9OZGtNZWRpYUZvcm1hdFByaXYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZhNjU2My4uMDAwMDAwMAotLS0gYS9tZWRpYS9uZGsvTmRrTWVkaWFGb3JtYXRQcml2LmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoKLSAqIFRoaXMgZmlsZSBkZWZpbmVzIGFuIE5ESyBBUEkuCi0gKiBEbyBub3QgcmVtb3ZlIG1ldGhvZHMuCi0gKiBEbyBub3QgY2hhbmdlIG1ldGhvZCBzaWduYXR1cmVzLgotICogRG8gbm90IGNoYW5nZSB0aGUgdmFsdWUgb2YgY29uc3RhbnRzLgotICogRG8gbm90IGNoYW5nZSB0aGUgc2l6ZSBvZiBhbnkgb2YgdGhlIGNsYXNzZXMgZGVmaW5lZCBpbiBoZXJlLgotICogRG8gbm90IHJlZmVyZW5jZSB0eXBlcyB0aGF0IGFyZSBub3QgcGFydCBvZiB0aGUgTkRLLgotICogRG8gbm90ICNpbmNsdWRlIGZpbGVzIHRoYXQgYXJlbid0IHBhcnQgb2YgdGhlIE5ESy4KLSAqLwotCi0jaWZuZGVmIF9OREtfTUVESUFfRk9STUFUX1BSSVZfSAotI2RlZmluZSBfTkRLX01FRElBX0ZPUk1BVF9QUklWX0gKLQotI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRm9ybWF0Lmg+Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotQU1lZGlhRm9ybWF0KiBBTWVkaWFGb3JtYXRfZnJvbU1zZyh2b2lkKik7Ci12b2lkIEFNZWRpYUZvcm1hdF9nZXRGb3JtYXQoY29uc3QgQU1lZGlhRm9ybWF0KiBtRGF0YSwgdm9pZCogZGVzdCk7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfSAvLyBleHRlcm4gIkMiCi0jZW5kaWYKLQotI2VuZGlmIC8vIF9OREtfTUVESUFfRk9STUFUX1BSSVZfSAotCmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvTmRrTWVkaWFNdXhlci5jcHAgYi9tZWRpYS9uZGsvTmRrTWVkaWFNdXhlci5jcHAKaW5kZXggZGZmYzRkNy4uZTc5OTI2ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL05ka01lZGlhTXV4ZXIuY3BwCisrKyBiL21lZGlhL25kay9OZGtNZWRpYU11eGVyLmNwcApAQCAtMjAsNyArMjAsOCBAQAogCiAjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFNdXhlci5oPgogI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhQ29kZWMuaD4KLSNpbmNsdWRlICJOZGtNZWRpYUZvcm1hdFByaXYuaCIKKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUVycm9yUHJpdi5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRm9ybWF0UHJpdi5oPgogCiAKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KQEAgLTM2LDE0ICszNyw2IEBACiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogCi1zdGF0aWMgbWVkaWFfc3RhdHVzX3QgdHJhbnNsYXRlX2Vycm9yKHN0YXR1c190IGVycikgewotICAgIGlmIChlcnIgPT0gT0spIHsKLSAgICAgICAgcmV0dXJuIEFNRURJQV9PSzsKLSAgICB9Ci0gICAgQUxPR0UoInNmIGVycm9yIGNvZGU6ICVkIiwgZXJyKTsKLSAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047Ci19Ci0KIHN0cnVjdCBBTWVkaWFNdXhlciB7CiAgICAgc3A8TWVkaWFNdXhlcj4gbUltcGw7CiAKZGlmZiAtLWdpdCBhL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka0ltYWdlLmggYi9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtJbWFnZS5oCmluZGV4IGY5MzYxMTguLjE1YjM0MGMgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka0ltYWdlLmgKKysrIGIvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrSW1hZ2UuaApAQCAtNDk5LDcgKzQ5OSwzNCBAQAogICAgICAqIDxwPldoZW4gYW4ge0BsaW5rIEFJbWFnZX0gb2YgdGhpcyBmb3JtYXQgaXMgb2J0YWluZWQgZnJvbSBhbiB7QGxpbmsgQUltYWdlUmVhZGVyfSBvcgogICAgICAqIHtAbGluayBBSW1hZ2VfZ2V0TnVtYmVyT2ZQbGFuZXMoKX0gbWV0aG9kIHdpbGwgcmV0dXJuIHplcm8uPC9wPgogICAgICAqLwotICAgIEFJTUFHRV9GT1JNQVRfUFJJVkFURSAgICAgICAgICAgPSAweDIyCisgICAgQUlNQUdFX0ZPUk1BVF9QUklWQVRFICAgICAgICAgICA9IDB4MjIsCisKKyAgICAvKioKKyAgICAgKiBBbmRyb2lkIFk4IGZvcm1hdC4KKyAgICAgKgorICAgICAqIDxwPlk4IGlzIGEgcGxhbmFyIGZvcm1hdCBjb21wcmlzZWQgb2YgYSBXeEggWSBwbGFuZSBvbmx5LCB3aXRoIGVhY2ggcGl4ZWwKKyAgICAgKiBiZWluZyByZXByZXNlbnRlZCBieSA4IGJpdHMuPC9wPgorICAgICAqCisgICAgICogPHA+VGhpcyBmb3JtYXQgYXNzdW1lcworICAgICAqIDx1bD4KKyAgICAgKiA8bGk+YW4gZXZlbiB3aWR0aDwvbGk+CisgICAgICogPGxpPmFuIGV2ZW4gaGVpZ2h0PC9saT4KKyAgICAgKiA8bGk+YSBob3Jpem9udGFsIHN0cmlkZSBtdWx0aXBsZSBvZiAxNiBwaXhlbHM8L2xpPgorICAgICAqIDwvdWw+CisgICAgICogPC9wPgorICAgICAqCisgICAgICogPHByZT4gc2l6ZSA9IHN0cmlkZSAqIGhlaWdodCA8L3ByZT4KKyAgICAgKgorICAgICAqIDxwPkZvciBleGFtcGxlLCB0aGUge0BsaW5rIEFJbWFnZX0gb2JqZWN0IGNhbiBwcm92aWRlIGRhdGEKKyAgICAgKiBpbiB0aGlzIGZvcm1hdCBmcm9tIGEge0BsaW5rIEFDYW1lcmFEZXZpY2V9IChpZiBzdXBwb3J0ZWQpIHRocm91Z2ggYQorICAgICAqIHtAbGluayBBSW1hZ2VSZWFkZXJ9IG9iamVjdC4gVGhlIG51bWJlciBvZiBwbGFuZXMgcmV0dXJuZWQgYnkKKyAgICAgKiB7QGxpbmsgQUltYWdlX2dldE51bWJlck9mUGxhbmVzfSB3aWxsIGFsd2F5cyBiZSAxLiBUaGUgcGl4ZWwgc3RyaWRlIHJldHVybmVkIGJ5CisgICAgICoge0BsaW5rIEFJbWFnZV9nZXRQbGFuZVBpeGVsU3RyaWRlfSB3aWxsIGFsd2F5cyBiZSAxLCBhbmQgdGhlCisgICAgICoge0BsaW5rIEFJbWFnZV9nZXRQbGFuZVJvd1N0cmlkZX0gZGVzY3JpYmVkIHRoZSB2ZXJ0aWNhbCBuZWlnaGJvcmluZyBwaXhlbCBkaXN0YW5jZQorICAgICAqIChpbiBieXRlcykgYmV0d2VlbiBhZGphY2VudCByb3dzLjwvcD4KKyAgICAgKgorICAgICAqLworICAgIEFJTUFHRV9GT1JNQVRfWTggPSAweDIwMjAzODU5CiB9OwogCiAvKioKZGlmZiAtLWdpdCBhL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka0ltYWdlUmVhZGVyLmggYi9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtJbWFnZVJlYWRlci5oCmluZGV4IDY4ZGUxNzYuLmU1ZDg2M2MgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka0ltYWdlUmVhZGVyLmgKKysrIGIvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrSW1hZ2VSZWFkZXIuaApAQCAtMzcsNiArMzcsOSBAQAogI2RlZmluZSBfTkRLX0lNQUdFX1JFQURFUl9ICiAKICNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KKyNpZmRlZiBfX0FORFJPSURfVk5ES19fCisjaW5jbHVkZSA8Y3V0aWxzL25hdGl2ZV9oYW5kbGUuaD4KKyNlbmRpZgogCiAjaW5jbHVkZSA8YW5kcm9pZC9uYXRpdmVfd2luZG93Lmg+CiAjaW5jbHVkZSAiTmRrTWVkaWFFcnJvci5oIgpAQCAtNDYxLDYgKzQ2NCwyMyBAQAogbWVkaWFfc3RhdHVzX3QgQUltYWdlUmVhZGVyX3NldEJ1ZmZlclJlbW92ZWRMaXN0ZW5lcigKICAgICAgICAgQUltYWdlUmVhZGVyKiByZWFkZXIsIEFJbWFnZVJlYWRlcl9CdWZmZXJSZW1vdmVkTGlzdGVuZXIqIGxpc3RlbmVyKSBfX0lOVFJPRFVDRURfSU4oMjYpOwogCisjaWZkZWYgX19BTkRST0lEX1ZOREtfXworLyoKKyAqIEdldCB0aGUgbmF0aXZlX2hhbmRsZV90IGNvcnJlc3BvbmRpbmcgdG8gdGhlIEFOYXRpdmVXaW5kb3cgb3duZWQgYnkgdGhlCisgKiBBSW1hZ2VSZWFkZXIgcHJvdmlkZWQuCisgKgorICogQHBhcmFtIHJlYWRlciBUaGUgaW1hZ2UgcmVhZGVyIG9mIGludGVyZXN0LgorICogQHBhcmFtIGhhbmRsZSBUaGUgb3V0cHV0IG5hdGl2ZV9oYW5kbGVfdC4gVGhpcyBuYXRpdmUgaGFuZGxlIGlzIG93bmVkIGJ5CisgKiAgICAgICAgICAgICAgIHRoaXMgaW1hZ2UgcmVhZGVyLgorICoKKyAqIEByZXR1cm4gQU1FRElBX09LIGlmIHRoZSBtZXRob2QgY2FsbCBzdWNjZWVkcy4KKyAqICAgICAgICAgQU1FRElBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSIGlmIHJlYWRlciBvciBoYW5kbGUgYXJlIE5VTEwuCisgKiAgICAgICAgIEFNRURJQV9FUlJPUl9VTktOT1dOIGlmIHNvbWUgb3RoZXIgZXJyb3IgaXMgZW5jb3VudGVyZWQuCisgKi8KK21lZGlhX3N0YXR1c190IEFJbWFnZVJlYWRlcl9nZXRXaW5kb3dOYXRpdmVIYW5kbGUoCisgICAgQUltYWdlUmVhZGVyICpyZWFkZXIsIC8qIG91dCAqL25hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSk7CisjZW5kaWYKKwogI2VuZGlmIC8qIF9fQU5EUk9JRF9BUElfXyA+PSAyNiAqLwogCiBfX0VORF9ERUNMUwpkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFEYXRhU291cmNlLmggYi9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYURhdGFTb3VyY2UuaAppbmRleCBlYTViYTBjLi4xNmIxZWIzIDEwMDY0NAotLS0gYS9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYURhdGFTb3VyY2UuaAorKysgYi9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYURhdGFTb3VyY2UuaApAQCAtNDMsMTQgKzQzLDkgQEAKIC8qCiAgKiBBTWVkaWFEYXRhU291cmNlJ3MgY2FsbGJhY2tzIHdpbGwgYmUgaW52b2tlZCBvbiBhbiBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIHRocmVhZAogICogb3IgdGhyZWFkIHBvb2wuIE5vIGd1YXJhbnRlZXMgYXJlIHByb3ZpZGVkIGFib3V0IHdoaWNoIHRocmVhZChzKSB3aWxsIGJlIHVzZWQgZm9yCi0gKiBjYWxsYmFja3MuIEhvd2V2ZXIsIGl0IGlzIGd1YXJhbnRlZWQgdGhhdCBBTWVkaWFEYXRhU291cmNlJ3MgY2FsbGJhY2tzIHdpbGwgb25seQotICogZXZlciBiZSBpbnZva2VkIGJ5IGEgc2luZ2xlIHRocmVhZCBhdCBhIHRpbWUuCi0gKgotICogVGhlcmUgd2lsbCBiZSBhIHRocmVhZCBzeW5jaHJvbml6YXRpb24gcG9pbnQgYmV0d2VlbiBlYWNoIGNhbGwgdG8gZW5zdXJlIHRoYXQKLSAqIG1vZGlmaWNhdGlvbnMgdG8gdGhlIHN0YXRlIG9mIHlvdXIgQU1lZGlhRGF0YVNvdXJjZSBhcmUgdmlzaWJsZSB0byBmdXR1cmUKLSAqIGNhbGxzLiBUaGlzIG1lYW5zIHlvdSBkb24ndCBuZWVkIHRvIGRvIHlvdXIgb3duIHN5bmNocm9uaXphdGlvbiB1bmxlc3MgeW91J3JlCi0gKiBtb2RpZnlpbmcgdGhlIEFNZWRpYURhdGFTb3VyY2UgZnJvbSBhbm90aGVyIHRocmVhZCB3aGlsZSBpdCdzIGJlaW5nIHVzZWQgYnkgdGhlCi0gKiBmcmFtZXdvcmsuCisgKiBjYWxsYmFja3MuIEZvciBleGFtcGxlLCB8Y2xvc2V8IGNhbiBiZSBpbnZva2VkIGZyb20gYSBkaWZmZXJlbnQgdGhyZWFkIHRoYW4gdGhlCisgKiB0aHJlYWQgaW52b2tpbmcgfHJlYWRBdHwuIEFzIHN1Y2gsIHRoZSBJbXBsZW1lbnRhdGlvbnMgb2YgQU1lZGlhRGF0YVNvdXJjZSBjYWxsYmFja3MKKyAqIG11c3QgYmUgdGhyZWFkc2FmZS4KICAqLwogCiAvKioKQEAgLTc0LDkgKzY5LDE5IEBACiB0eXBlZGVmIHNzaXplX3QgKCpBTWVkaWFEYXRhU291cmNlR2V0U2l6ZSkodm9pZCAqdXNlcmRhdGEpOwogCiAvKioKLSAqIENhbGxlZCB0byBjbG9zZSB0aGUgZGF0YSBzb3VyY2UgYW5kIHJlbGVhc2UgYXNzb2NpYXRlZCByZXNvdXJjZXMuCi0gKiBUaGUgTkRLIG1lZGlhIGZyYW1ld29yayBndWFyYW50ZWVzIHRoYXQgYWZ0ZXIgfGNsb3NlfCBpcyBjYWxsZWQKLSAqIG5vIGZ1dHVyZSBjYWxsYmFja3Mgd2lsbCBiZSBpbnZva2VkIG9uIHRoZSBkYXRhIHNvdXJjZS4KKyAqIENhbGxlZCB0byBjbG9zZSB0aGUgZGF0YSBzb3VyY2UsIHVuYmxvY2sgcmVhZHMsIGFuZCByZWxlYXNlIGFzc29jaWF0ZWQKKyAqIHJlc291cmNlcy4KKyAqCisgKiBUaGUgTkRLIG1lZGlhIGZyYW1ld29yayBndWFyYW50ZWVzIHRoYXQgYWZ0ZXIgdGhlIGZpcnN0IHxjbG9zZXwgaXMKKyAqIGNhbGxlZCwgbm8gZnV0dXJlIGNhbGxiYWNrcyB3aWxsIGJlIGludm9rZWQgb24gdGhlIGRhdGEgc291cmNlIGV4Y2VwdAorICogZm9yIHxjbG9zZXwgaXRzZWxmLgorICoKKyAqIENsb3NpbmcgYSBkYXRhIHNvdXJjZSBhbGxvd3MgcmVhZEF0IGNhbGxzIHRoYXQgd2VyZSBibG9ja2VkIHdhaXRpbmcKKyAqIGZvciBJL08gZGF0YSB0byByZXR1cm4gcHJvbXB0bHkuCisgKgorICogV2hlbiB1c2luZyBBTWVkaWFEYXRhU291cmNlIGFzIGlucHV0IHRvIEFNZWRpYUV4dHJhY3RvciwgY2xvc2luZworICogaGFzIHRoZSBlZmZlY3Qgb2YgdW5ibG9ja2luZyBzbG93IHJlYWRzIGluc2lkZSBvZiBzZXREYXRhU291cmNlCisgKiBhbmQgcmVhZFNhbXBsZURhdGEuCiAgKi8KIHR5cGVkZWYgdm9pZCAoKkFNZWRpYURhdGFTb3VyY2VDbG9zZSkodm9pZCAqdXNlcmRhdGEpOwogCkBAIC04Niw2ICs5MSwzOCBAQAogICovCiBBTWVkaWFEYXRhU291cmNlKiBBTWVkaWFEYXRhU291cmNlX25ldygpIF9fSU5UUk9EVUNFRF9JTigyOCk7CiAKKyNpZiBfX0FORFJPSURfQVBJX18gPj0gMjkKKworLyoqCisgKiBDYWxsZWQgdG8gZ2V0IGFuIGVzdGltYXRlIG9mIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBjYW4gYmUgcmVhZCBmcm9tIHRoaXMgZGF0YSBzb3VyY2UKKyAqIHN0YXJ0aW5nIGF0IHxvZmZzZXR8IHdpdGhvdXQgYmxvY2tpbmcgZm9yIEkvTy4KKyAqCisgKiBSZXR1cm4gLTEgd2hlbiBzdWNoIGFuIGVzdGltYXRlIGlzIG5vdCBwb3NzaWJsZS4KKyAqLwordHlwZWRlZiBzc2l6ZV90ICgqQU1lZGlhRGF0YVNvdXJjZUdldEF2YWlsYWJsZVNpemUpKHZvaWQgKnVzZXJkYXRhLCBvZmY2NF90IG9mZnNldCk7CisKKy8qKgorICogQ3JlYXRlIG5ldyBtZWRpYSBkYXRhIHNvdXJjZS4gUmV0dXJucyBOVUxMIGlmIG1lbW9yeSBhbGxvY2F0aW9uCisgKiBmb3IgdGhlIG5ldyBkYXRhIHNvdXJjZSBvYmplY3QgZmFpbHMuCisgKgorICogU2V0IHRoZSB8dXJpfCBmcm9tIHdoaWNoIHRoZSBkYXRhIHNvdXJjZSB3aWxsIHJlYWQsCisgKiBwbHVzIGFkZGl0aW9uYWwgaHR0cCBoZWFkZXJzIHdoZW4gaW5pdGlhdGluZyB0aGUgcmVxdWVzdC4KKyAqCisgKiBIZWFkZXJzIHdpbGwgY29udGFpbiBjb3JyZXNwb25kaW5nIGl0ZW1zIGZyb20gfGtleV92YWx1ZXN8CisgKiBpbiB0aGUgZm9sbG93aW5nIGZhc2hpb246CisgKgorICoga2V5X3ZhbHVlc1swXTprZXlfdmFsdWVzWzFdCisgKiBrZXlfdmFsdWVzWzJdOmtleV92YWx1ZXNbM10KKyAqIC4uLgorICoga2V5X3ZhbHVlc1sobnVtaGVhZGVycyAtIDEpICogMl06a2V5X3ZhbHVlc1sobnVtaGVhZGVycyAtIDEpICogMiArIDFdCisgKgorICovCitBTWVkaWFEYXRhU291cmNlKiBBTWVkaWFEYXRhU291cmNlX25ld1VyaShjb25zdCBjaGFyICp1cmksCisgICAgICAgIGludCBudW1oZWFkZXJzLAorICAgICAgICBjb25zdCBjaGFyICogY29uc3QgKmtleV92YWx1ZXMpIF9fSU5UUk9EVUNFRF9JTigyOSk7CisKKyNlbmRpZiAgLypfX0FORFJPSURfQVBJX18gPj0gMjkgKi8KKwogLyoqCiAgKiBEZWxldGUgYSBwcmV2aW91c2x5IGNyZWF0ZWQgbWVkaWEgZGF0YSBzb3VyY2UuCiAgKi8KQEAgLTEzNyw2ICsxNzQsMzAgQEAKIAogI2VuZGlmICAvKl9fQU5EUk9JRF9BUElfXyA+PSAyOCAqLwogCisjaWYgX19BTkRST0lEX0FQSV9fID49IDI5CisKKy8qKgorICogQ2xvc2UgdGhlIGRhdGEgc291cmNlLCB1bmJsb2NrIHJlYWRzLCBhbmQgcmVsZWFzZSBhc3NvY2lhdGVkIHJlc291cmNlcy4KKyAqCisgKiBQbGVhc2UgcmVmZXIgdG8gdGhlIGRlZmluaXRpb24gb2YgQU1lZGlhRGF0YVNvdXJjZUNsb3NlIGZvcgorICogYWRkaXRpb25hbCBkZXRhaWxzLgorICovCit2b2lkIEFNZWRpYURhdGFTb3VyY2VfY2xvc2UoQU1lZGlhRGF0YVNvdXJjZSopIF9fSU5UUk9EVUNFRF9JTigyOSk7CisKKy8qKgorICogU2V0IGEgY3VzdG9tIGNhbGxiYWNrIGZvciBzdXBwbHlpbmcgdGhlIGVzdGltYXRlZCBudW1iZXIgb2YgYnl0ZXMKKyAqIHRoYXQgY2FuIGJlIHJlYWQgZnJvbSB0aGlzIGRhdGEgc291cmNlIHN0YXJ0aW5nIGF0IGFuIG9mZnNldCB3aXRob3V0CisgKiBibG9ja2luZyBmb3IgSS9PLgorICoKKyAqIFBsZWFzZSByZWZlciB0byB0aGUgZGVmaW5pdGlvbiBvZiBBTWVkaWFEYXRhU291cmNlR2V0QXZhaWxhYmxlU2l6ZQorICogZm9yIGFkZGl0aW9uYWwgZGV0YWlscy4KKyAqLwordm9pZCBBTWVkaWFEYXRhU291cmNlX3NldEdldEF2YWlsYWJsZVNpemUoCisgICAgICAgIEFNZWRpYURhdGFTb3VyY2UqLAorICAgICAgICBBTWVkaWFEYXRhU291cmNlR2V0QXZhaWxhYmxlU2l6ZSkgX19JTlRST0RVQ0VEX0lOKDI5KTsKKworI2VuZGlmICAvKl9fQU5EUk9JRF9BUElfXyA+PSAyOSAqLworCiBfX0VORF9ERUNMUwogCiAjZW5kaWYgLy8gX05ES19NRURJQV9EQVRBU09VUkNFX0gKZGlmZiAtLWdpdCBhL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRHJtLmggYi9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYURybS5oCmluZGV4IDAyMDk2ODEuLjJlNDM4ZDkgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRHJtLmgKKysrIGIvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFEcm0uaApAQCAtNTYsNiArNTYsNyBAQAogdHlwZWRlZiBBTWVkaWFEcm1CeXRlQXJyYXkgQU1lZGlhRHJtU2NvcGU7CiB0eXBlZGVmIEFNZWRpYURybUJ5dGVBcnJheSBBTWVkaWFEcm1LZXlTZXRJZDsKIHR5cGVkZWYgQU1lZGlhRHJtQnl0ZUFycmF5IEFNZWRpYURybVNlY3VyZVN0b3A7Cit0eXBlZGVmIEFNZWRpYURybUJ5dGVBcnJheSBBTWVkaWFEcm1LZXlJZDsKIAogdHlwZWRlZiBlbnVtIEFNZWRpYURybUV2ZW50VHlwZSB7CiAgICAgLyoqCkBAIC04MSwxMiArODIsODkgQEAKICAgICAgKiBUaGlzIGV2ZW50IG1heSBpbmRpY2F0ZSBzb21lIHNwZWNpZmljIHZlbmRvci1kZWZpbmVkIGNvbmRpdGlvbiwgc2VlIHlvdXIKICAgICAgKiBEUk0gcHJvdmlkZXIgZG9jdW1lbnRhdGlvbiBmb3IgZGV0YWlscwogICAgICAqLwotICAgIEVWRU5UX1ZFTkRPUl9ERUZJTkVEID0gNAorICAgIEVWRU5UX1ZFTkRPUl9ERUZJTkVEID0gNCwKKworICAgIC8qKgorICAgICAqIFRoaXMgZXZlbnQgaW5kaWNhdGVzIHRoYXQgYSBzZXNzaW9uIG9wZW5lZCBieSB0aGUgYXBwIGhhcyBiZWVuIHJlY2xhaW1lZAorICAgICAqIGJ5IHRoZSByZXNvdXJjZSBtYW5hZ2VyLgorICAgICAqLworICAgIEVWRU5UX1NFU1NJT05fUkVDTEFJTUVEID0gNSwKIH0gQU1lZGlhRHJtRXZlbnRUeXBlOwogCit0eXBlZGVmIGVudW0gQU1lZGlhRHJtS2V5VHlwZSB7CisgICAgLyoqCisgICAgICogVGhpcyBrZXkgcmVxdWVzdCB0eXBlIHNwZWNpZmllcyB0aGF0IHRoZSBrZXlzIHdpbGwgYmUgZm9yIG9ubGluZSB1c2UsIHRoZXkgd2lsbAorICAgICAqIG5vdCBiZSBzYXZlZCB0byB0aGUgZGV2aWNlIGZvciBzdWJzZXF1ZW50IHVzZSB3aGVuIHRoZSBkZXZpY2UgaXMgbm90IGNvbm5lY3RlZAorICAgICAqIHRvIGEgbmV0d29yay4KKyAgICAgKi8KKyAgICBLRVlfVFlQRV9TVFJFQU1JTkcgPSAxLAorCisgICAgLyoqCisgICAgICogVGhpcyBrZXkgcmVxdWVzdCB0eXBlIHNwZWNpZmllcyB0aGF0IHRoZSBrZXlzIHdpbGwgYmUgZm9yIG9mZmxpbmUgdXNlLCB0aGV5CisgICAgICogd2lsbCBiZSBzYXZlZCB0byB0aGUgZGV2aWNlIGZvciB1c2Ugd2hlbiB0aGUgZGV2aWNlIGlzIG5vdCBjb25uZWN0ZWQgdG8gYSBuZXR3b3JrLgorICAgICAqLworICAgIEtFWV9UWVBFX09GRkxJTkUgPSAyLAorCisgICAgLyoqCisgICAgICogVGhpcyBrZXkgcmVxdWVzdCB0eXBlIHNwZWNpZmllcyB0aGF0IHByZXZpb3VzbHkgc2F2ZWQgb2ZmbGluZSBrZXlzIHNob3VsZCBiZSByZWxlYXNlZC4KKyAgICAgKi8KKyAgICBLRVlfVFlQRV9SRUxFQVNFID0gMworfSBBTWVkaWFEcm1LZXlUeXBlOworCisvKioKKyAqICBEYXRhIHR5cGUgY29udGFpbmluZyB7a2V5LCB2YWx1ZX0gcGFpcgorICovCit0eXBlZGVmIHN0cnVjdCBBTWVkaWFEcm1LZXlWYWx1ZVBhaXIgeworICAgIGNvbnN0IGNoYXIgKm1LZXk7CisgICAgY29uc3QgY2hhciAqbVZhbHVlOworfSBBTWVkaWFEcm1LZXlWYWx1ZTsKKwordHlwZWRlZiBlbnVtIEFNZWRpYUtleVN0YXR1c1R5cGUgeworICAgIC8qKgorICAgICAqIFRoZSBrZXkgaXMgY3VycmVudGx5IHVzYWJsZSB0byBkZWNyeXB0IG1lZGlhIGRhdGEuCisgICAgICovCisgICAgS0VZX1NUQVRVU19UWVBFX1VTQUJMRSwKKworICAgIC8qKgorICAgICAqIFRoZSBrZXkgaXMgbm8gbG9uZ2VyIHVzYWJsZSB0byBkZWNyeXB0IG1lZGlhIGRhdGEgYmVjYXVzZSBpdHMgZXhwaXJhdGlvbgorICAgICAqIHRpbWUgaGFzIHBhc3NlZC4KKyAgICAgKi8KKyAgICBLRVlfU1RBVFVTX1RZUEVfRVhQSVJFRCwKKworICAgIC8qKgorICAgICAqIFRoZSBrZXkgaXMgbm90IGN1cnJlbnRseSB1c2FibGUgdG8gZGVjcnlwdCBtZWRpYSBkYXRhIGJlY2F1c2UgaXRzIG91dHB1dAorICAgICAqIHJlcXVpcmVtZW50cyBjYW5ub3QgY3VycmVudGx5IGJlIG1ldC4KKyAgICAgKi8KKyAgICBLRVlfU1RBVFVTX1RZUEVfT1VUUFVUTk9UQUxMT1dFRCwKKworICAgIC8qKgorICAgICAqIFRoZSBzdGF0dXMgb2YgdGhlIGtleSBpcyBub3QgeWV0IGtub3duIGFuZCBpcyBiZWluZyBkZXRlcm1pbmVkLgorICAgICAqLworICAgIEtFWV9TVEFUVVNfVFlQRV9TVEFUVVNQRU5ESU5HLAorCisgICAgLyoqCisgICAgICogVGhlIGtleSBpcyBub3QgY3VycmVudGx5IHVzYWJsZSB0byBkZWNyeXB0IG1lZGlhIGRhdGEgYmVjYXVzZSBvZiBhbgorICAgICAqIGludGVybmFsIGVycm9yIGluIHByb2Nlc3NpbmcgdW5yZWxhdGVkIHRvIGlucHV0IHBhcmFtZXRlcnMuCisgICAgICovCisgICAgS0VZX1NUQVRVU19UWVBFX0lOVEVSTkFMRVJST1IsCisKK30gQU1lZGlhRHJtS2V5U3RhdHVzVHlwZTsKKwordHlwZWRlZiBzdHJ1Y3QgQU1lZGlhRHJtS2V5U3RhdHVzIHsKKyAgICBBTWVkaWFEcm1LZXlJZCBrZXlJZDsKKyAgICBBTWVkaWFEcm1LZXlTdGF0dXNUeXBlIGtleVR5cGU7Cit9IEFNZWRpYURybUtleVN0YXR1czsKKwogdHlwZWRlZiB2b2lkICgqQU1lZGlhRHJtRXZlbnRMaXN0ZW5lcikoQU1lZGlhRHJtICosIGNvbnN0IEFNZWRpYURybVNlc3Npb25JZCAqc2Vzc2lvbklkLAogICAgICAgICBBTWVkaWFEcm1FdmVudFR5cGUgZXZlbnRUeXBlLCBpbnQgZXh0cmEsIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBkYXRhU2l6ZSk7CiAKK3R5cGVkZWYgdm9pZCAoKkFNZWRpYURybUV4cGlyYXRpb25VcGRhdGVMaXN0ZW5lcikoQU1lZGlhRHJtICosCisgICAgICAgIGNvbnN0IEFNZWRpYURybVNlc3Npb25JZCAqc2Vzc2lvbklkLCBpbnQ2NF90IGV4cGlyeVRpbWVJbk1TKTsKKwordHlwZWRlZiB2b2lkICgqQU1lZGlhRHJtS2V5c0NoYW5nZUxpc3RlbmVyKShBTWVkaWFEcm0gKiwKKyAgICAgICAgY29uc3QgQU1lZGlhRHJtU2Vzc2lvbklkICpzZXNzaW9uSWQsIGNvbnN0IEFNZWRpYURybUtleVN0YXR1cyAqa2V5U3RhdHVzLAorICAgICAgICBzaXplX3QgbnVtS2V5cywgYm9vbCBoYXNOZXdVc2FibGVLZXkpOworCiAjaWYgX19BTkRST0lEX0FQSV9fID49IDIxCiAKIC8qKgpAQCAtMTIwLDYgKzE5OCwyMiBAQAogICAgICAgICBBTWVkaWFEcm1FdmVudExpc3RlbmVyIGxpc3RlbmVyKSBfX0lOVFJPRFVDRURfSU4oMjEpOwogCiAvKioKKyAqIFJlZ2lzdGVyIGEgY2FsbGJhY2sgdG8gYmUgaW52b2tlZCB3aGVuIGFuIGV4cGlyYXRpb24gdXBkYXRlIGV2ZW50IG9jY3VycworICoKKyAqIGxpc3RlbmVyIGlzIHRoZSBjYWxsYmFjayB0aGF0IHdpbGwgYmUgaW52b2tlZCBvbiBldmVudAorICovCittZWRpYV9zdGF0dXNfdCBBTWVkaWFEcm1fc2V0T25FeHBpcmF0aW9uVXBkYXRlTGlzdGVuZXIoQU1lZGlhRHJtICosCisgICAgICAgIEFNZWRpYURybUV4cGlyYXRpb25VcGRhdGVMaXN0ZW5lciBsaXN0ZW5lcikgX19JTlRST0RVQ0VEX0lOKDI5KTsKKworLyoqCisgKiBSZWdpc3RlciBhIGNhbGxiYWNrIHRvIGJlIGludm9rZWQgd2hlbiBhIGtleSBzdGF0dXMgY2hhbmdlIGV2ZW50IG9jY3VycworICoKKyAqIGxpc3RlbmVyIGlzIHRoZSBjYWxsYmFjayB0aGF0IHdpbGwgYmUgaW52b2tlZCBvbiBldmVudAorICovCittZWRpYV9zdGF0dXNfdCBBTWVkaWFEcm1fc2V0T25LZXlzQ2hhbmdlTGlzdGVuZXIoQU1lZGlhRHJtICosCisgICAgICAgIEFNZWRpYURybUtleXNDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgX19JTlRST0RVQ0VEX0lOKDI5KTsKKworLyoqCiAgKiBPcGVuIGEgbmV3IHNlc3Npb24gd2l0aCB0aGUgTWVkaWFEcm0gb2JqZWN0LiAgQSBzZXNzaW9uIElEIGlzIHJldHVybmVkLgogICoKICAqIHJldHVybnMgTUVESUFEUk1fTk9UX1BST1ZJU0lPTkVEX0VSUk9SIGlmIHByb3Zpc2lvbmluZyBpcyBuZWVkZWQKQEAgLTEzNSwzNCArMjI5LDYgQEAKIG1lZGlhX3N0YXR1c190IEFNZWRpYURybV9jbG9zZVNlc3Npb24oQU1lZGlhRHJtICosCiAgICAgICAgIGNvbnN0IEFNZWRpYURybVNlc3Npb25JZCAqc2Vzc2lvbklkKSBfX0lOVFJPRFVDRURfSU4oMjEpOwogCi10eXBlZGVmIGVudW0gQU1lZGlhRHJtS2V5VHlwZSB7Ci0gICAgLyoqCi0gICAgICogVGhpcyBrZXkgcmVxdWVzdCB0eXBlIHNwZWNpZXMgdGhhdCB0aGUga2V5cyB3aWxsIGJlIGZvciBvbmxpbmUgdXNlLCB0aGV5IHdpbGwKLSAgICAgKiBub3QgYmUgc2F2ZWQgdG8gdGhlIGRldmljZSBmb3Igc3Vic2VxdWVudCB1c2Ugd2hlbiB0aGUgZGV2aWNlIGlzIG5vdCBjb25uZWN0ZWQKLSAgICAgKiB0byBhIG5ldHdvcmsuCi0gICAgICovCi0gICAgS0VZX1RZUEVfU1RSRUFNSU5HID0gMSwKLQotICAgIC8qKgotICAgICAqIFRoaXMga2V5IHJlcXVlc3QgdHlwZSBzcGVjaWZpZXMgdGhhdCB0aGUga2V5cyB3aWxsIGJlIGZvciBvZmZsaW5lIHVzZSwgdGhleQotICAgICAqIHdpbGwgYmUgc2F2ZWQgdG8gdGhlIGRldmljZSBmb3IgdXNlIHdoZW4gdGhlIGRldmljZSBpcyBub3QgY29ubmVjdGVkIHRvIGEgbmV0d29yay4KLSAgICAgKi8KLSAgICBLRVlfVFlQRV9PRkZMSU5FID0gMiwKLQotICAgIC8qKgotICAgICAqIFRoaXMga2V5IHJlcXVlc3QgdHlwZSBzcGVjaWZpZXMgdGhhdCBwcmV2aW91c2x5IHNhdmVkIG9mZmxpbmUga2V5cyBzaG91bGQgYmUgcmVsZWFzZWQuCi0gICAgICovCi0gICAgS0VZX1RZUEVfUkVMRUFTRSA9IDMKLX0gQU1lZGlhRHJtS2V5VHlwZTsKLQotLyoqCi0gKiAgRGF0YSB0eXBlIGNvbnRhaW5pbmcge2tleSwgdmFsdWV9IHBhaXIKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgQU1lZGlhRHJtS2V5VmFsdWVQYWlyIHsKLSAgICBjb25zdCBjaGFyICptS2V5OwotICAgIGNvbnN0IGNoYXIgKm1WYWx1ZTsKLX0gQU1lZGlhRHJtS2V5VmFsdWU7Ci0KIC8qKgogICogQSBrZXkgcmVxdWVzdC9yZXNwb25zZSBleGNoYW5nZSBvY2N1cnMgYmV0d2VlbiB0aGUgYXBwIGFuZCBhIGxpY2Vuc2Ugc2VydmVyCiAgKiB0byBvYnRhaW4gb3IgcmVsZWFzZSBrZXlzIHVzZWQgdG8gZGVjcnlwdCBlbmNyeXB0ZWQgY29udGVudC4KZGlmZiAtLWdpdCBhL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRXJyb3IuaCBiL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRXJyb3IuaAppbmRleCA3NWY0NjA1Li4yYmUxZDZlIDEwMDY0NAotLS0gYS9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUVycm9yLmgKKysrIGIvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFFcnJvci5oCkBAIC02Myw2ICs2Myw3IEBACiAgICAgQU1FRElBX0VSUk9SX0lOVkFMSURfT1BFUkFUSU9OICAgICA9IEFNRURJQV9FUlJPUl9CQVNFIC0gNSwKICAgICBBTUVESUFfRVJST1JfRU5EX09GX1NUUkVBTSAgICAgICAgID0gQU1FRElBX0VSUk9SX0JBU0UgLSA2LAogICAgIEFNRURJQV9FUlJPUl9JTyAgICAgICAgICAgICAgICAgICAgPSBBTUVESUFfRVJST1JfQkFTRSAtIDcsCisgICAgQU1FRElBX0VSUk9SX1dPVUxEX0JMT0NLICAgICAgICAgICA9IEFNRURJQV9FUlJPUl9CQVNFIC0gOCwKIAogICAgIEFNRURJQV9EUk1fRVJST1JfQkFTRSAgICAgICAgICAgICAgPSAtMjAwMDAsCiAgICAgQU1FRElBX0RSTV9OT1RfUFJPVklTSU9ORUQgICAgICAgICA9IEFNRURJQV9EUk1fRVJST1JfQkFTRSAtIDEsCmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUV4dHJhY3Rvci5oIGIvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFFeHRyYWN0b3IuaAppbmRleCA2YTE3OTZmLi5lM2Q5ZmU2IDEwMDY0NAotLS0gYS9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUV4dHJhY3Rvci5oCisrKyBiL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRXh0cmFjdG9yLmgKQEAgLTcyLDcgKzcyLDYgQEAKICAqLwogbWVkaWFfc3RhdHVzX3QgQU1lZGlhRXh0cmFjdG9yX3NldERhdGFTb3VyY2UoQU1lZGlhRXh0cmFjdG9yKiwKICAgICAgICAgY29uc3QgY2hhciAqbG9jYXRpb24pIF9fSU5UUk9EVUNFRF9JTigyMSk7Ci0gICAgICAgIC8vIFRPRE8gc3VwcG9ydCBoZWFkZXJzCiAKICNpZiBfX0FORFJPSURfQVBJX18gPj0gMjgKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFGb3JtYXQuaCBiL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRm9ybWF0LmgKaW5kZXggNWY3ODA0ZC4uODljZmQ1ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFGb3JtYXQuaAorKysgYi9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUZvcm1hdC5oCkBAIC04MywxMyArODMsOSBAQAogLyoqCiAgKiBUaGUgcHJvdmlkZWQgZGF0YSBpcyBjb3BpZWQgaW50byB0aGUgZm9ybWF0LgogICovCi12b2lkIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIoQU1lZGlhRm9ybWF0KiwgY29uc3QgY2hhciogbmFtZSwgdm9pZCogZGF0YSwgc2l6ZV90IHNpemUpIF9fSU5UUk9EVUNFRF9JTigyMSk7Cit2b2lkIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIoQU1lZGlhRm9ybWF0KiwgY29uc3QgY2hhciogbmFtZSwgY29uc3Qgdm9pZCogZGF0YSwgc2l6ZV90IHNpemUpIF9fSU5UUk9EVUNFRF9JTigyMSk7CiAKIAotCi0vKioKLSAqIFhYWCBzaG91bGQgdGhlc2UgYmUgaW50cy9lbnVtcyB0aGF0IHdlIGxvb2sgdXAgaW4gYSB0YWJsZSBhcyBuZWVkZWQ/Ci0gKi8KIGV4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FBQ19EUkNfQVRURU5VQVRJT05fRkFDVE9SIF9fSU5UUk9EVUNFRF9JTigyOCk7CiBleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9BQUNfRFJDX0JPT1NUX0ZBQ1RPUiBfX0lOVFJPRFVDRURfSU4oMjgpOwogZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQUFDX0RSQ19IRUFWWV9DT01QUkVTU0lPTiBfX0lOVFJPRFVDRURfSU4oMjgpOwpAQCAtMTU2LDcgKzE1Miw2IEBACiBleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9UUkFDS19JRCBfX0lOVFJPRFVDRURfSU4oMjgpOwogZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVFJBQ0tfSU5ERVggX19JTlRST0RVQ0VEX0lOKDI4KTsKIGV4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1dJRFRIIF9fSU5UUk9EVUNFRF9JTigyMSk7Ci0KICNlbmRpZiAvKiBfX0FORFJPSURfQVBJX18gPj0gMjEgKi8KIAogI2lmIF9fQU5EUk9JRF9BUElfXyA+PSAyOApAQCAtMTcwLDYgKzE2NSw2OCBAQAogICAgICAgICBpbnQzMl90IGxlZnQsIGludDMyX3QgdG9wLCBpbnQzMl90IHJpZ2h0LCBpbnQzMl90IGJvdHRvbSkgX19JTlRST0RVQ0VEX0lOKDI4KTsKICNlbmRpZiAvKiBfX0FORFJPSURfQVBJX18gPj0gMjggKi8KIAorI2lmIF9fQU5EUk9JRF9BUElfXyA+PSAyOQorLyoqCisgKiByZW1vdmUgYWxsIGtleS92YWx1ZSBwYWlycyBmcm9tIHRoZSBnaXZlbiBBTWVkaWFGb3JtYXQKKyAqLwordm9pZCBBTWVkaWFGb3JtYXRfY2xlYXIoQU1lZGlhRm9ybWF0KikgX19JTlRST0RVQ0VEX0lOKDI5KTsKKworLyoqCisgKiBjb3B5IG9uZSBBTWVkaWFGb3JtYXQgdG8gYW5vdGhlcgorICovCittZWRpYV9zdGF0dXNfdCBBTWVkaWFGb3JtYXRfY29weShBTWVkaWFGb3JtYXQgKnRvLCBBTWVkaWFGb3JtYXQgKmZyb20pIF9fSU5UUk9EVUNFRF9JTigyOSk7CisKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FMQlVNIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9BTEJVTUFSVCBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQUxCVU1BUlRJU1QgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FSVElTVCBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQVVUSE9SIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9CSVRTX1BFUl9TQU1QTEUgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NEVFJBQ0tOVU1CRVIgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NPTE9SX1JBTkdFIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DT0xPUl9TVEFOREFSRCBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ09MT1JfVFJBTlNGRVIgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NPTVBJTEFUSU9OIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DT01QT1NFUiBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0RFRkFVTFRfSVZfU0laRSBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0VOQ1JZUFRFRF9CWVRFX0JMT0NLIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DUllQVE9fSVYgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19LRVkgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19NT0RFIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DUllQVE9fU0tJUF9CWVRFX0JMT0NLIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DU0RfQVZDIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DU0RfSEVWQyBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfRDI2MyBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfREFURSBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfRElTQ05VTUJFUiBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfRU5DT0RFUl9ERUxBWSBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfRU5DT0RFUl9QQURESU5HIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9FU0RTIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9FWElGX09GRlNFVCBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfRVhJRl9TSVpFIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9GUkFNRV9DT1VOVCBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfR0VOUkUgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0hEUl9TVEFUSUNfSU5GTyBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfSUNDX1BST0ZJTEUgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0xPQ0FUSU9OIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9MT09QIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9MWVJJQ0lTVCBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTUFYX0JJVF9SQVRFIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9NUEVHMl9TVFJFQU1fSEVBREVSIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9QQ01fQklHX0VORElBTiBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfUFNTSCBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfU0FSX0hFSUdIVCBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfU0FSX1dJRFRIIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9URU1QT1JBTF9MQVlFUl9DT1VOVCBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVEVYVF9GT1JNQVRfREFUQSBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVEhVTUJOQUlMX0hFSUdIVCBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVEhVTUJOQUlMX1RJTUUgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1RIVU1CTkFJTF9XSURUSCBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVElUTEUgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1lFQVIgX19JTlRST0RVQ0VEX0lOKDI5KTsKKworI2VuZGlmIC8qIF9fQU5EUk9JRF9BUElfXyA+PSAyOSAqLworCiBfX0VORF9ERUNMUwogCiAjZW5kaWYgLy8gX05ES19NRURJQV9GT1JNQVRfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL2xpYm1lZGlhbmRrLm1hcC50eHQgYi9tZWRpYS9uZGsvbGlibWVkaWFuZGsubWFwLnR4dAppbmRleCBkODI4ZDZhLi5kM2JkYmFlIDEwMDY0NAotLS0gYS9tZWRpYS9uZGsvbGlibWVkaWFuZGsubWFwLnR4dAorKysgYi9tZWRpYS9uZGsvbGlibWVkaWFuZGsubWFwLnR4dApAQCAtNCw2ICs0LDcgQEAKICAgICBBSW1hZ2VSZWFkZXJfYWNxdWlyZUxhdGVzdEltYWdlQXN5bmM7ICMgaW50cm9kdWNlZD0yNgogICAgIEFJbWFnZVJlYWRlcl9hY3F1aXJlTmV4dEltYWdlOyAjIGludHJvZHVjZWQ9MjQKICAgICBBSW1hZ2VSZWFkZXJfYWNxdWlyZU5leHRJbWFnZUFzeW5jOyAjIGludHJvZHVjZWQ9MjYKKyAgICBBSW1hZ2VSZWFkZXJfZ2V0V2luZG93TmF0aXZlSGFuZGxlOyAjdm5kawogICAgIEFJbWFnZVJlYWRlcl9kZWxldGU7ICMgaW50cm9kdWNlZD0yNAogICAgIEFJbWFnZVJlYWRlcl9nZXRGb3JtYXQ7ICMgaW50cm9kdWNlZD0yNAogICAgIEFJbWFnZVJlYWRlcl9nZXRIZWlnaHQ7ICMgaW50cm9kdWNlZD0yNApAQCAtMTQxLDYgKzE0Miw5IEBACiAgICAgQU1lZGlhRGF0YVNvdXJjZV9zZXRHZXRTaXplOyAgIyBpbnRyb2R1Y2VkPTI4CiAgICAgQU1lZGlhRGF0YVNvdXJjZV9zZXRSZWFkQXQ7ICAgIyBpbnRyb2R1Y2VkPTI4CiAgICAgQU1lZGlhRGF0YVNvdXJjZV9zZXRVc2VyZGF0YTsgIyBpbnRyb2R1Y2VkPTI4CisgICAgQU1lZGlhRGF0YVNvdXJjZV9uZXdVcmk7ICAgICAgIyBpbnRyb2R1Y2VkPTI5CisgICAgQU1lZGlhRGF0YVNvdXJjZV9jbG9zZTsgICAgICAgIyBpbnRyb2R1Y2VkPTI5CisgICAgQU1lZGlhRGF0YVNvdXJjZV9zZXRHZXRBdmFpbGFibGVTaXplOyAjIGludHJvZHVjZWQ9MjkKICAgICBBTWVkaWFEcm1fY2xvc2VTZXNzaW9uOwogICAgIEFNZWRpYURybV9jcmVhdGVCeVVVSUQ7CiAgICAgQU1lZGlhRHJtX2RlY3J5cHQ7CkBAIC0xNjIsNiArMTY2LDggQEAKICAgICBBTWVkaWFEcm1fc2V0T25FdmVudExpc3RlbmVyOwogICAgIEFNZWRpYURybV9zZXRQcm9wZXJ0eUJ5dGVBcnJheTsKICAgICBBTWVkaWFEcm1fc2V0UHJvcGVydHlTdHJpbmc7CisgICAgQU1lZGlhRHJtX3NldE9uRXhwaXJhdGlvblVwZGF0ZUxpc3RlbmVyOyAjIGludHJvZHVjZWQ9MjkKKyAgICBBTWVkaWFEcm1fc2V0T25LZXlzQ2hhbmdlTGlzdGVuZXI7ICMgaW50cm9kdWNlZD0yOQogICAgIEFNZWRpYURybV9zaWduOwogICAgIEFNZWRpYURybV92ZXJpZnk7CiAgICAgQU1lZGlhRXh0cmFjdG9yX2FkdmFuY2U7CkBAIC0xODUsNiArMTkxLDggQEAKICAgICBBTWVkaWFFeHRyYWN0b3Jfc2V0RGF0YVNvdXJjZUN1c3RvbTsgIyBpbnRyb2R1Y2VkPTI4CiAgICAgQU1lZGlhRXh0cmFjdG9yX3NldERhdGFTb3VyY2VGZDsKICAgICBBTWVkaWFFeHRyYWN0b3JfdW5zZWxlY3RUcmFjazsKKyAgICBBTWVkaWFGb3JtYXRfY2xlYXI7ICMgaW50cm9kdWNlZD0yOQorICAgIEFNZWRpYUZvcm1hdF9jb3B5OyAjIGludHJvZHVjZWQ9MjkKICAgICBBTWVkaWFGb3JtYXRfZGVsZXRlOwogICAgIEFNZWRpYUZvcm1hdF9nZXRCdWZmZXI7CiAgICAgQU1lZGlhRm9ybWF0X2dldERvdWJsZTsgIyBpbnRyb2R1Y2VkPTI4CmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvdGVzdHMvQUltYWdlUmVhZGVyV2luZG93SGFuZGxlVGVzdC5jcHAgYi9tZWRpYS9uZGsvdGVzdHMvQUltYWdlUmVhZGVyV2luZG93SGFuZGxlVGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWYwZmY2NwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL25kay90ZXN0cy9BSW1hZ2VSZWFkZXJXaW5kb3dIYW5kbGVUZXN0LmNwcApAQCAtMCwwICsxLDE4NSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+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+Ci0gICAgPC9hcHBsaWNhdGlvbj4KLQotPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9hcGV4L0FuZHJvaWQuYnAgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvYXBleC9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3OTdlMTQKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvYXBleC9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMzkgQEAKK2ZpbGVncm91cCB7CisgICAgbmFtZTogIm1lZGlhX2FpZGwiLAorICAgIHNyY3M6IFsKKyAgICAgICAgImphdmEvYW5kcm9pZC9tZWRpYS8qKi8qLmFpZGwiLAorICAgICAgICAiamF2YS9hbmRyb2lkL3NlcnZpY2UvKiovKi5haWRsIiwKKyAgICBdLAorICAgIGV4Y2x1ZGVfc3JjczogWworICAgICAgICAvLyBFeGNsdWRlIHRoZXNlIGFpZGxzIHRvIGF2b2lkIGVycm9ycyBzdWNoIGFzCisgICAgICAgIC8vICJSZWZ1c2luZyB0byBnZW5lcmF0ZSBjb2RlIHdpdGggdW5zdHJ1Y3R1cmVkIHBhcmNlbGFibGVzLiIKKyAgICAgICAgImphdmEvYW5kcm9pZC9tZWRpYS9NZWRpYURlc2NyaXB0aW9uLmFpZGwiLAorICAgICAgICAiamF2YS9hbmRyb2lkL21lZGlhL01lZGlhTWV0YWRhdGEuYWlkbCIsCisgICAgICAgICJqYXZhL2FuZHJvaWQvbWVkaWEvUmF0aW5nLmFpZGwiLAorICAgICAgICAiamF2YS9hbmRyb2lkL21lZGlhL2Jyb3dzZS9NZWRpYUJyb3dzZXIuYWlkbCIsCisgICAgICAgICJqYXZhL2FuZHJvaWQvbWVkaWEvc2Vzc2lvbi9NZWRpYVNlc3Npb24uYWlkbCIsCisgICAgICAgICJqYXZhL2FuZHJvaWQvbWVkaWEvc2Vzc2lvbi9QYXJjZWxhYmxlVm9sdW1lSW5mby5haWRsIiwKKyAgICAgICAgImphdmEvYW5kcm9pZC9tZWRpYS9zZXNzaW9uL1BsYXliYWNrU3RhdGUuYWlkbCIsCisgICAgXSwKK30KKworamF2YV9saWJyYXJ5IHsKKyAgICBuYW1lOiAibWVkaWEiLAorICAgIGluc3RhbGxhYmxlOiB0cnVlLAorICAgIHNka192ZXJzaW9uOiAic3lzdGVtX2N1cnJlbnQiLAorICAgIHNyY3M6IFsKKyAgICAgICAgImphdmEvYW5kcm9pZC9tZWRpYS8qKi8qLmphdmEiLAorICAgICAgICAiamF2YS9hbmRyb2lkL3NlcnZpY2UvKiovKi5qYXZhIiwKKyAgICAgICAgIjptZWRpYV9haWRsIiwKKyAgICAgICAgIjpmcmFtZXdvcmstbWVkaWEtYW5ub3RhdGlvbi1zcmNzIiwKKyAgICBdLAorICAgIGFpZGw6IHsKKyAgICAgICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbImphdmEiXSwKKyAgICAgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICAgICAiZnJhbWV3b3Jrcy9iYXNlL2NvcmUvamF2YSIsCisgICAgICAgICAgICAvLyBmb3IgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXAKKyAgICAgICAgICAgIC8vIGZyb20gSU1lZGlhQnJvd3NlclNlcnZpY2VDYWxsYmFjaworICAgICAgICAgICAgImZyYW1ld29ya3MvYmFzZS9ncmFwaGljcy9qYXZhIiwKKyAgICAgICAgICAgIF0sCisgICAgfSwKK30KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9hcGV4L2phdmEvYW5kcm9pZC9tZWRpYS9JUmVtb3RlVm9sdW1lQ29udHJvbGxlci5haWRsIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL2FwZXgvamF2YS9hbmRyb2lkL21lZGlhL0lSZW1vdGVWb2x1bWVDb250cm9sbGVyLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRhNGE0MgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9hcGV4L2phdmEvYW5kcm9pZC9tZWRpYS9JUmVtb3RlVm9sdW1lQ29udHJvbGxlci5haWRsCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWE7CisKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLnNlc3Npb24uSVNlc3Npb25Db250cm9sbGVyOworCisvKioKKyAqIEFJREwgZm9yIHRoZSBNZWRpYVNlc3Npb25TZXJ2aWNlIHRvIHJlcG9ydCBpbnRlcmVzdGluZyBldmVudHMgb24gcmVtb3RlIHBsYXliYWNrCisgKiB0byBhIHZvbHVtZSBjb250cm9sIGRpYWxvZy4gU2VlIGFsc28gSVZvbHVtZUNvbnRyb2xsZXIgZm9yIHRoZSBBdWRpb1NlcnZpY2UgaGFsZi4KKyAqIFRPRE8gYWRkIGluIGJldHRlciBzdXBwb3J0IGZvciBtdWx0aXBsZSByZW1vdGUgc2Vzc2lvbnMuCisgKiBAaGlkZQorICovCitvbmV3YXkgaW50ZXJmYWNlIElSZW1vdGVWb2x1bWVDb250cm9sbGVyIHsKKyAgICB2b2lkIHJlbW90ZVZvbHVtZUNoYW5nZWQoSVNlc3Npb25Db250cm9sbGVyIHNlc3Npb24sIGludCBmbGFncyk7CisgICAgLy8gc2V0cyB0aGUgZGVmYXVsdCBzZXNzaW9uIHRvIHVzZSB3aXRoIHRoZSBzbGlkZXIsIHJlcGxhY2VzIHJlbW90ZVNsaWRlclZpc2liaWxpdHkKKyAgICAvLyBvbiBJVm9sdW1lQ29udHJvbGxlcgorICAgIHZvaWQgdXBkYXRlUmVtb3RlQ29udHJvbGxlcihJU2Vzc2lvbkNvbnRyb2xsZXIgc2Vzc2lvbik7Cit9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvYXBleC9qYXZhL2FuZHJvaWQvbWVkaWEvSVNlc3Npb25Ub2tlbnNMaXN0ZW5lci5haWRsIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL2FwZXgvamF2YS9hbmRyb2lkL21lZGlhL0lTZXNzaW9uVG9rZW5zTGlzdGVuZXIuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODNhMTllCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL2FwZXgvamF2YS9hbmRyb2lkL21lZGlhL0lTZXNzaW9uVG9rZW5zTGlzdGVuZXIuYWlkbApAQCAtMCwwICsxLDI3IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWE7CisKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKKworLyoqCisgKiBMaXN0ZW5zIGZvciBjaGFuZ2VzIHRvIHRoZSBsaXN0IG9mIHNlc3Npb24gdG9rZW5zLgorICogQGhpZGUKKyAqLworb25ld2F5IGludGVyZmFjZSBJU2Vzc2lvblRva2Vuc0xpc3RlbmVyIHsKKyAgICB2b2lkIG9uU2Vzc2lvblRva2Vuc0NoYW5nZWQoaW4gTGlzdDxCdW5kbGU+IHRva2Vucyk7Cit9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvYXBleC9qYXZhL2FuZHJvaWQvbWVkaWEvTWVkaWFEZXNjcmlwdGlvbi5haWRsIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL2FwZXgvamF2YS9hbmRyb2lkL21lZGlhL01lZGlhRGVzY3JpcHRpb24uYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjkzNGY3Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL2FwZXgvamF2YS9hbmRyb2lkL21lZGlhL01lZGlhRGVzY3JpcHRpb24uYWlkbApAQCAtMCwwICsxLDE4IEBACisvKiBDb3B5cmlnaHQgMjAxNCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhOworCitwYXJjZWxhYmxlIE1lZGlhRGVzY3JpcHRpb247CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvYXBleC9qYXZhL2FuZHJvaWQvbWVkaWEvTWVkaWFEZXNjcmlwdGlvbi5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL2FwZXgvamF2YS9hbmRyb2lkL21lZGlhL01lZGlhRGVzY3JpcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTA3OWU1Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL2FwZXgvamF2YS9hbmRyb2lkL21lZGlhL01lZGlhRGVzY3JpcHRpb24uamF2YQpAQCAtMCwwICsxLDM4MyBAQAorcGFja2FnZSBhbmRyb2lkLm1lZGlhOworCitpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLk51bGxhYmxlOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQubWVkaWEuYnJvd3NlLk1lZGlhQnJvd3NlcjsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlOworaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CisKKy8qKgorICogQSBzaW1wbGUgc2V0IG9mIG1ldGFkYXRhIGZvciBhIG1lZGlhIGl0ZW0gc3VpdGFibGUgZm9yIGRpc3BsYXkuIFRoaXMgY2FuIGJlCisgKiBjcmVhdGVkIHVzaW5nIHRoZSBCdWlsZGVyIG9yIHJldHJpZXZlZCBmcm9tIGV4aXN0aW5nIG1ldGFkYXRhIHVzaW5nCisgKiB7QGxpbmsgTWVkaWFNZXRhZGF0YSNnZXREZXNjcmlwdGlvbigpfS4KKyAqLworcHVibGljIGNsYXNzIE1lZGlhRGVzY3JpcHRpb24gaW1wbGVtZW50cyBQYXJjZWxhYmxlIHsKKyAgICAvKioKKyAgICAgKiBBIHVuaXF1ZSBwZXJzaXN0ZW50IGlkIGZvciB0aGUgY29udGVudCBvciBudWxsLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1NZWRpYUlkOworICAgIC8qKgorICAgICAqIEEgcHJpbWFyeSB0aXRsZSBzdWl0YWJsZSBmb3IgZGlzcGxheSBvciBudWxsLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgQ2hhclNlcXVlbmNlIG1UaXRsZTsKKyAgICAvKioKKyAgICAgKiBBIHN1YnRpdGxlIHN1aXRhYmxlIGZvciBkaXNwbGF5IG9yIG51bGwuCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBDaGFyU2VxdWVuY2UgbVN1YnRpdGxlOworICAgIC8qKgorICAgICAqIEEgZGVzY3JpcHRpb24gc3VpdGFibGUgZm9yIGRpc3BsYXkgb3IgbnVsbC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIENoYXJTZXF1ZW5jZSBtRGVzY3JpcHRpb247CisgICAgLyoqCisgICAgICogQSBiaXRtYXAgaWNvbiBzdWl0YWJsZSBmb3IgZGlzcGxheSBvciBudWxsLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgQml0bWFwIG1JY29uOworICAgIC8qKgorICAgICAqIEEgVXJpIGZvciBhbiBpY29uIHN1aXRhYmxlIGZvciBkaXNwbGF5IG9yIG51bGwuCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBVcmkgbUljb25Vcmk7CisgICAgLyoqCisgICAgICogRXh0cmFzIGZvciBvcGFxdWUgdXNlIGJ5IGFwcHMvc3lzdGVtLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgQnVuZGxlIG1FeHRyYXM7CisgICAgLyoqCisgICAgICogQSBVcmkgdG8gaWRlbnRpZnkgdGhpcyBjb250ZW50LgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgVXJpIG1NZWRpYVVyaTsKKworICAgIC8qKgorICAgICAqIFVzZWQgYXMgYSBsb25nIGV4dHJhIGZpZWxkIHRvIGluZGljYXRlIHRoZSBibHVldG9vdGggZm9sZGVyIHR5cGUgb2YgdGhlIG1lZGlhIGl0ZW0gYXMKKyAgICAgKiBzcGVjaWZpZWQgaW4gdGhlIHNlY3Rpb24gNi4xMC4yLjIgb2YgdGhlIEJsdWV0b290aCBBVlJDUCAxLjUuIFRoaXMgaXMgdmFsaWQgb25seSBmb3IKKyAgICAgKiB7QGxpbmsgTWVkaWFCcm93c2VyLk1lZGlhSXRlbX0gd2l0aCB7QGxpbmsgTWVkaWFCcm93c2VyLk1lZGlhSXRlbSNGTEFHX0JST1dTQUJMRX0uIFRoZSB2YWx1ZQorICAgICAqIHNob3VsZCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKyAgICAgKiA8dWw+CisgICAgICogPGxpPntAbGluayAjQlRfRk9MREVSX1RZUEVfTUlYRUR9PC9saT4KKyAgICAgKiA8bGk+e0BsaW5rICNCVF9GT0xERVJfVFlQRV9USVRMRVN9PC9saT4KKyAgICAgKiA8bGk+e0BsaW5rICNCVF9GT0xERVJfVFlQRV9BTEJVTVN9PC9saT4KKyAgICAgKiA8bGk+e0BsaW5rICNCVF9GT0xERVJfVFlQRV9BUlRJU1RTfTwvbGk+CisgICAgICogPGxpPntAbGluayAjQlRfRk9MREVSX1RZUEVfR0VOUkVTfTwvbGk+CisgICAgICogPGxpPntAbGluayAjQlRfRk9MREVSX1RZUEVfUExBWUxJU1RTfTwvbGk+CisgICAgICogPGxpPntAbGluayAjQlRfRk9MREVSX1RZUEVfWUVBUlN9PC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqCisgICAgICogQHNlZSAjZ2V0RXh0cmFzKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9CVF9GT0xERVJfVFlQRSA9ICJhbmRyb2lkLm1lZGlhLmV4dHJhLkJUX0ZPTERFUl9UWVBFIjsKKworICAgIC8qKgorICAgICAqIFRoZSB0eXBlIG9mIGZvbGRlciB0aGF0IGlzIHVua25vd24gb3IgY29udGFpbnMgbWVkaWEgZWxlbWVudHMgb2YgbWl4ZWQgdHlwZXMgYXMgc3BlY2lmaWVkIGluCisgICAgICogdGhlIHNlY3Rpb24gNi4xMC4yLjIgb2YgdGhlIEJsdWV0b290aCBBVlJDUCAxLjUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIEJUX0ZPTERFUl9UWVBFX01JWEVEID0gMDsKKworICAgIC8qKgorICAgICAqIFRoZSB0eXBlIG9mIGZvbGRlciB0aGF0IGNvbnRhaW5zIG1lZGlhIGVsZW1lbnRzIG9ubHkgYXMgc3BlY2lmaWVkIGluIHRoZSBzZWN0aW9uIDYuMTAuMi4yIG9mCisgICAgICogdGhlIEJsdWV0b290aCBBVlJDUCAxLjUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIEJUX0ZPTERFUl9UWVBFX1RJVExFUyA9IDE7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdHlwZSBvZiBmb2xkZXIgdGhhdCBjb250YWlucyBmb2xkZXJzIGNhdGVnb3JpemVkIGJ5IGFsYnVtIGFzIHNwZWNpZmllZCBpbiB0aGUgc2VjdGlvbgorICAgICAqIDYuMTAuMi4yIG9mIHRoZSBCbHVldG9vdGggQVZSQ1AgMS41LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBCVF9GT0xERVJfVFlQRV9BTEJVTVMgPSAyOworCisgICAgLyoqCisgICAgICogVGhlIHR5cGUgb2YgZm9sZGVyIHRoYXQgY29udGFpbnMgZm9sZGVycyBjYXRlZ29yaXplZCBieSBhcnRpc3QgYXMgc3BlY2lmaWVkIGluIHRoZSBzZWN0aW9uCisgICAgICogNi4xMC4yLjIgb2YgdGhlIEJsdWV0b290aCBBVlJDUCAxLjUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIEJUX0ZPTERFUl9UWVBFX0FSVElTVFMgPSAzOworCisgICAgLyoqCisgICAgICogVGhlIHR5cGUgb2YgZm9sZGVyIHRoYXQgY29udGFpbnMgZm9sZGVycyBjYXRlZ29yaXplZCBieSBnZW5yZSBhcyBzcGVjaWZpZWQgaW4gdGhlIHNlY3Rpb24KKyAgICAgKiA2LjEwLjIuMiBvZiB0aGUgQmx1ZXRvb3RoIEFWUkNQIDEuNS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgQlRfRk9MREVSX1RZUEVfR0VOUkVTID0gNDsKKworICAgIC8qKgorICAgICAqIFRoZSB0eXBlIG9mIGZvbGRlciB0aGF0IGNvbnRhaW5zIGZvbGRlcnMgY2F0ZWdvcml6ZWQgYnkgcGxheWxpc3QgYXMgc3BlY2lmaWVkIGluIHRoZSBzZWN0aW9uCisgICAgICogNi4xMC4yLjIgb2YgdGhlIEJsdWV0b290aCBBVlJDUCAxLjUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIEJUX0ZPTERFUl9UWVBFX1BMQVlMSVNUUyA9IDU7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdHlwZSBvZiBmb2xkZXIgdGhhdCBjb250YWlucyBmb2xkZXJzIGNhdGVnb3JpemVkIGJ5IHllYXIgYXMgc3BlY2lmaWVkIGluIHRoZSBzZWN0aW9uCisgICAgICogNi4xMC4yLjIgb2YgdGhlIEJsdWV0b290aCBBVlJDUCAxLjUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIEJUX0ZPTERFUl9UWVBFX1lFQVJTID0gNjsKKworICAgIHByaXZhdGUgTWVkaWFEZXNjcmlwdGlvbihTdHJpbmcgbWVkaWFJZCwgQ2hhclNlcXVlbmNlIHRpdGxlLCBDaGFyU2VxdWVuY2Ugc3VidGl0bGUsCisgICAgICAgICAgICBDaGFyU2VxdWVuY2UgZGVzY3JpcHRpb24sIEJpdG1hcCBpY29uLCBVcmkgaWNvblVyaSwgQnVuZGxlIGV4dHJhcywgVXJpIG1lZGlhVXJpKSB7CisgICAgICAgIG1NZWRpYUlkID0gbWVkaWFJZDsKKyAgICAgICAgbVRpdGxlID0gdGl0bGU7CisgICAgICAgIG1TdWJ0aXRsZSA9IHN1YnRpdGxlOworICAgICAgICBtRGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKKyAgICAgICAgbUljb24gPSBpY29uOworICAgICAgICBtSWNvblVyaSA9IGljb25Vcmk7CisgICAgICAgIG1FeHRyYXMgPSBleHRyYXM7CisgICAgICAgIG1NZWRpYVVyaSA9IG1lZGlhVXJpOworICAgIH0KKworICAgIHByaXZhdGUgTWVkaWFEZXNjcmlwdGlvbihQYXJjZWwgaW4pIHsKKyAgICAgICAgbU1lZGlhSWQgPSBpbi5yZWFkU3RyaW5nKCk7CisgICAgICAgIG1UaXRsZSA9IFRleHRVdGlscy5DSEFSX1NFUVVFTkNFX0NSRUFUT1IuY3JlYXRlRnJvbVBhcmNlbChpbik7CisgICAgICAgIG1TdWJ0aXRsZSA9IFRleHRVdGlscy5DSEFSX1NFUVVFTkNFX0NSRUFUT1IuY3JlYXRlRnJvbVBhcmNlbChpbik7CisgICAgICAgIG1EZXNjcmlwdGlvbiA9IFRleHRVdGlscy5DSEFSX1NFUVVFTkNFX0NSRUFUT1IuY3JlYXRlRnJvbVBhcmNlbChpbik7CisgICAgICAgIG1JY29uID0gaW4ucmVhZFBhcmNlbGFibGUobnVsbCk7CisgICAgICAgIG1JY29uVXJpID0gaW4ucmVhZFBhcmNlbGFibGUobnVsbCk7CisgICAgICAgIG1FeHRyYXMgPSBpbi5yZWFkQnVuZGxlKCk7CisgICAgICAgIG1NZWRpYVVyaSA9IGluLnJlYWRQYXJjZWxhYmxlKG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG1lZGlhIGlkIG9yIG51bGwuIFNlZQorICAgICAqIHtAbGluayBNZWRpYU1ldGFkYXRhI01FVEFEQVRBX0tFWV9NRURJQV9JRH0uCisgICAgICovCisgICAgcHVibGljIEBOdWxsYWJsZSBTdHJpbmcgZ2V0TWVkaWFJZCgpIHsKKyAgICAgICAgcmV0dXJuIG1NZWRpYUlkOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSB0aXRsZSBzdWl0YWJsZSBmb3IgZGlzcGxheSBvciBudWxsLgorICAgICAqCisgICAgICogQHJldHVybiBBIHRpdGxlIG9yIG51bGwuCisgICAgICovCisgICAgcHVibGljIEBOdWxsYWJsZSBDaGFyU2VxdWVuY2UgZ2V0VGl0bGUoKSB7CisgICAgICAgIHJldHVybiBtVGl0bGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHN1YnRpdGxlIHN1aXRhYmxlIGZvciBkaXNwbGF5IG9yIG51bGwuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEEgc3VidGl0bGUgb3IgbnVsbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQE51bGxhYmxlIENoYXJTZXF1ZW5jZSBnZXRTdWJ0aXRsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1TdWJ0aXRsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgZGVzY3JpcHRpb24gc3VpdGFibGUgZm9yIGRpc3BsYXkgb3IgbnVsbC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gQSBkZXNjcmlwdGlvbiBvciBudWxsLgorICAgICAqLworICAgIHB1YmxpYyBATnVsbGFibGUgQ2hhclNlcXVlbmNlIGdldERlc2NyaXB0aW9uKCkgeworICAgICAgICByZXR1cm4gbURlc2NyaXB0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBiaXRtYXAgaWNvbiBzdWl0YWJsZSBmb3IgZGlzcGxheSBvciBudWxsLgorICAgICAqCisgICAgICogQHJldHVybiBBbiBpY29uIG9yIG51bGwuCisgICAgICovCisgICAgcHVibGljIEBOdWxsYWJsZSBCaXRtYXAgZ2V0SWNvbkJpdG1hcCgpIHsKKyAgICAgICAgcmV0dXJuIG1JY29uOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBVcmkgZm9yIGFuIGljb24gc3VpdGFibGUgZm9yIGRpc3BsYXkgb3IgbnVsbC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gQW4gaWNvbiB1cmkgb3IgbnVsbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQE51bGxhYmxlIFVyaSBnZXRJY29uVXJpKCkgeworICAgICAgICByZXR1cm4gbUljb25Vcmk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhbnkgZXh0cmFzIHRoYXQgd2VyZSBhZGRlZCB0byB0aGUgZGVzY3JpcHRpb24uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEEgYnVuZGxlIG9mIGV4dHJhcyBvciBudWxsLgorICAgICAqLworICAgIHB1YmxpYyBATnVsbGFibGUgQnVuZGxlIGdldEV4dHJhcygpIHsKKyAgICAgICAgcmV0dXJuIG1FeHRyYXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIFVyaSByZXByZXNlbnRpbmcgdGhpcyBjb250ZW50IG9yIG51bGwuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEEgbWVkaWEgVXJpIG9yIG51bGwuCisgICAgICovCisgICAgcHVibGljIEBOdWxsYWJsZSBVcmkgZ2V0TWVkaWFVcmkoKSB7CisgICAgICAgIHJldHVybiBtTWVkaWFVcmk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBkZXNjcmliZUNvbnRlbnRzKCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB3cml0ZVRvUGFyY2VsKFBhcmNlbCBkZXN0LCBpbnQgZmxhZ3MpIHsKKyAgICAgICAgZGVzdC53cml0ZVN0cmluZyhtTWVkaWFJZCk7CisgICAgICAgIFRleHRVdGlscy53cml0ZVRvUGFyY2VsKG1UaXRsZSwgZGVzdCwgMCk7CisgICAgICAgIFRleHRVdGlscy53cml0ZVRvUGFyY2VsKG1TdWJ0aXRsZSwgZGVzdCwgMCk7CisgICAgICAgIFRleHRVdGlscy53cml0ZVRvUGFyY2VsKG1EZXNjcmlwdGlvbiwgZGVzdCwgMCk7CisgICAgICAgIGRlc3Qud3JpdGVQYXJjZWxhYmxlKG1JY29uLCBmbGFncyk7CisgICAgICAgIGRlc3Qud3JpdGVQYXJjZWxhYmxlKG1JY29uVXJpLCBmbGFncyk7CisgICAgICAgIGRlc3Qud3JpdGVCdW5kbGUobUV4dHJhcyk7CisgICAgICAgIGRlc3Qud3JpdGVQYXJjZWxhYmxlKG1NZWRpYVVyaSwgZmxhZ3MpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgeworICAgICAgICBpZiAobyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIShvIGluc3RhbmNlb2YgTWVkaWFEZXNjcmlwdGlvbikpeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgTWVkaWFEZXNjcmlwdGlvbiBkID0gKE1lZGlhRGVzY3JpcHRpb24pIG87CisKKyAgICAgICAgaWYgKCFTdHJpbmcudmFsdWVPZihtVGl0bGUpLmVxdWFscyhTdHJpbmcudmFsdWVPZihkLm1UaXRsZSkpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIVN0cmluZy52YWx1ZU9mKG1TdWJ0aXRsZSkuZXF1YWxzKFN0cmluZy52YWx1ZU9mKGQubVN1YnRpdGxlKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghU3RyaW5nLnZhbHVlT2YobURlc2NyaXB0aW9uKS5lcXVhbHMoU3RyaW5nLnZhbHVlT2YoZC5tRGVzY3JpcHRpb24pKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIG1UaXRsZSArICIsICIgKyBtU3VidGl0bGUgKyAiLCAiICsgbURlc2NyaXB0aW9uOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUGFyY2VsYWJsZS5DcmVhdG9yPE1lZGlhRGVzY3JpcHRpb24+IENSRUFUT1IgPQorICAgICAgICAgICAgbmV3IFBhcmNlbGFibGUuQ3JlYXRvcjxNZWRpYURlc2NyaXB0aW9uPigpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgTWVkaWFEZXNjcmlwdGlvbiBjcmVhdGVGcm9tUGFyY2VsKFBhcmNlbCBpbikgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE1lZGlhRGVzY3JpcHRpb24oaW4pOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBNZWRpYURlc2NyaXB0aW9uW10gbmV3QXJyYXkoaW50IHNpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBNZWRpYURlc2NyaXB0aW9uW3NpemVdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisKKyAgICAvKioKKyAgICAgKiBCdWlsZGVyIGZvciB7QGxpbmsgTWVkaWFEZXNjcmlwdGlvbn0gb2JqZWN0cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJ1aWxkZXIgeworICAgICAgICBwcml2YXRlIFN0cmluZyBtTWVkaWFJZDsKKyAgICAgICAgcHJpdmF0ZSBDaGFyU2VxdWVuY2UgbVRpdGxlOworICAgICAgICBwcml2YXRlIENoYXJTZXF1ZW5jZSBtU3VidGl0bGU7CisgICAgICAgIHByaXZhdGUgQ2hhclNlcXVlbmNlIG1EZXNjcmlwdGlvbjsKKyAgICAgICAgcHJpdmF0ZSBCaXRtYXAgbUljb247CisgICAgICAgIHByaXZhdGUgVXJpIG1JY29uVXJpOworICAgICAgICBwcml2YXRlIEJ1bmRsZSBtRXh0cmFzOworICAgICAgICBwcml2YXRlIFVyaSBtTWVkaWFVcmk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZXMgYW4gaW5pdGlhbGx5IGVtcHR5IGJ1aWxkZXIuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlcigpIHsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXRzIHRoZSBtZWRpYSBpZC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG1lZGlhSWQgVGhlIHVuaXF1ZSBpZCBmb3IgdGhlIGl0ZW0gb3IgbnVsbC4KKyAgICAgICAgICogQHJldHVybiB0aGlzCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRNZWRpYUlkKEBOdWxsYWJsZSBTdHJpbmcgbWVkaWFJZCkgeworICAgICAgICAgICAgbU1lZGlhSWQgPSBtZWRpYUlkOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0cyB0aGUgdGl0bGUuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSB0aXRsZSBBIHRpdGxlIHN1aXRhYmxlIGZvciBkaXNwbGF5IHRvIHRoZSB1c2VyIG9yIG51bGwuCisgICAgICAgICAqIEByZXR1cm4gdGhpcworICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0VGl0bGUoQE51bGxhYmxlIENoYXJTZXF1ZW5jZSB0aXRsZSkgeworICAgICAgICAgICAgbVRpdGxlID0gdGl0bGU7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXRzIHRoZSBzdWJ0aXRsZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHN1YnRpdGxlIEEgc3VidGl0bGUgc3VpdGFibGUgZm9yIGRpc3BsYXkgdG8gdGhlIHVzZXIgb3IgbnVsbC4KKyAgICAgICAgICogQHJldHVybiB0aGlzCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRTdWJ0aXRsZShATnVsbGFibGUgQ2hhclNlcXVlbmNlIHN1YnRpdGxlKSB7CisgICAgICAgICAgICBtU3VidGl0bGUgPSBzdWJ0aXRsZTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldHMgdGhlIGRlc2NyaXB0aW9uLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gZGVzY3JpcHRpb24gQSBkZXNjcmlwdGlvbiBzdWl0YWJsZSBmb3IgZGlzcGxheSB0byB0aGUgdXNlciBvcgorICAgICAgICAgKiAgICAgICAgICAgIG51bGwuCisgICAgICAgICAqIEByZXR1cm4gdGhpcworICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0RGVzY3JpcHRpb24oQE51bGxhYmxlIENoYXJTZXF1ZW5jZSBkZXNjcmlwdGlvbikgeworICAgICAgICAgICAgbURlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXRzIHRoZSBpY29uLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gaWNvbiBBIHtAbGluayBCaXRtYXB9IGljb24gc3VpdGFibGUgZm9yIGRpc3BsYXkgdG8gdGhlIHVzZXIgb3IKKyAgICAgICAgICogICAgICAgICAgICBudWxsLgorICAgICAgICAgKiBAcmV0dXJuIHRoaXMKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldEljb25CaXRtYXAoQE51bGxhYmxlIEJpdG1hcCBpY29uKSB7CisgICAgICAgICAgICBtSWNvbiA9IGljb247CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXRzIHRoZSBpY29uIHVyaS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGljb25VcmkgQSB7QGxpbmsgVXJpfSBmb3IgYW4gaWNvbiBzdWl0YWJsZSBmb3IgZGlzcGxheSB0byB0aGUKKyAgICAgICAgICogICAgICAgICAgICB1c2VyIG9yIG51bGwuCisgICAgICAgICAqIEByZXR1cm4gdGhpcworICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0SWNvblVyaShATnVsbGFibGUgVXJpIGljb25VcmkpIHsKKyAgICAgICAgICAgIG1JY29uVXJpID0gaWNvblVyaTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldHMgYSBidW5kbGUgb2YgZXh0cmFzLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gZXh0cmFzIFRoZSBleHRyYXMgdG8gaW5jbHVkZSB3aXRoIHRoaXMgZGVzY3JpcHRpb24gb3IgbnVsbC4KKyAgICAgICAgICogQHJldHVybiB0aGlzCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRFeHRyYXMoQE51bGxhYmxlIEJ1bmRsZSBleHRyYXMpIHsKKyAgICAgICAgICAgIG1FeHRyYXMgPSBleHRyYXM7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXRzIHRoZSBtZWRpYSB1cmkuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBtZWRpYVVyaSBUaGUgY29udGVudCdzIHtAbGluayBVcml9IGZvciB0aGUgaXRlbSBvciBudWxsLgorICAgICAgICAgKiBAcmV0dXJuIHRoaXMKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldE1lZGlhVXJpKEBOdWxsYWJsZSBVcmkgbWVkaWFVcmkpIHsKKyAgICAgICAgICAgIG1NZWRpYVVyaSA9IG1lZGlhVXJpOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgTWVkaWFEZXNjcmlwdGlvbiBidWlsZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgTWVkaWFEZXNjcmlwdGlvbihtTWVkaWFJZCwgbVRpdGxlLCBtU3VidGl0bGUsIG1EZXNjcmlwdGlvbiwgbUljb24sIG1JY29uVXJpLAorICAgICAgICAgICAgICAgICAgICBtRXh0cmFzLCBtTWVkaWFVcmkpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL2FwZXgvamF2YS9hbmRyb2lkL21lZGlhL01lZGlhTWV0YWRhdGEuYWlkbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9hcGV4L2phdmEvYW5kcm9pZC9tZWRpYS9NZWRpYU1ldGFkYXRhLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjZlZTQ4MwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9hcGV4L2phdmEvYW5kcm9pZC9tZWRpYS9NZWRpYU1ldGFkYXRhLmFpZGwKQEAgLTAsMCArMSwxOCBAQAorLyogQ29weXJpZ2h0IDIwMTQsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKworcGFyY2VsYWJsZSBNZWRpYU1ldGFkYXRhOwpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL2FwZXgvamF2YS9hbmRyb2lkL21lZGlhL01lZGlhTWV0YWRhdGEuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9hcGV4L2phdmEvYW5kcm9pZC9tZWRpYS9NZWRpYU1ldGFkYXRhLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNlNjkxNgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9hcGV4L2phdmEvYW5kcm9pZC9tZWRpYS9NZWRpYU1ldGFkYXRhLmphdmEKQEAgLTAsMCArMSw5NDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBhbmRyb2lkLm1lZGlhOworCitpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLk5vbk51bGw7CitpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLlN0cmluZ0RlZjsKK2ltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uVW5zdXBwb3J0ZWRBcHBVc2FnZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwRmFjdG9yeTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLmJyb3dzZS5NZWRpYUJyb3dzZXI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5zZXNzaW9uLk1lZGlhQ29udHJvbGxlcjsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlOworaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CitpbXBvcnQgYW5kcm9pZC51dGlsLkFycmF5TWFwOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC51dGlsLlNwYXJzZUFycmF5OworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5PYmplY3RzOworCisvKioKKyAqIENvbnRhaW5zIG1ldGFkYXRhIGFib3V0IGFuIGl0ZW0sIHN1Y2ggYXMgdGhlIHRpdGxlLCBhcnRpc3QsIGV0Yy4KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIE1lZGlhTWV0YWRhdGEgaW1wbGVtZW50cyBQYXJjZWxhYmxlIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk1lZGlhTWV0YWRhdGEiOworCisgICAgLyoqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBAU3RyaW5nRGVmKHByZWZpeCA9IHsgIk1FVEFEQVRBX0tFWV8iIH0sIHZhbHVlID0geworICAgICAgICAgICAgTUVUQURBVEFfS0VZX1RJVExFLAorICAgICAgICAgICAgTUVUQURBVEFfS0VZX0FSVElTVCwKKyAgICAgICAgICAgIE1FVEFEQVRBX0tFWV9BTEJVTSwKKyAgICAgICAgICAgIE1FVEFEQVRBX0tFWV9BVVRIT1IsCisgICAgICAgICAgICBNRVRBREFUQV9LRVlfV1JJVEVSLAorICAgICAgICAgICAgTUVUQURBVEFfS0VZX0NPTVBPU0VSLAorICAgICAgICAgICAgTUVUQURBVEFfS0VZX0NPTVBJTEFUSU9OLAorICAgICAgICAgICAgTUVUQURBVEFfS0VZX0RBVEUsCisgICAgICAgICAgICBNRVRBREFUQV9LRVlfR0VOUkUsCisgICAgICAgICAgICBNRVRBREFUQV9LRVlfQUxCVU1fQVJUSVNULAorICAgICAgICAgICAgTUVUQURBVEFfS0VZX0FSVF9VUkksCisgICAgICAgICAgICBNRVRBREFUQV9LRVlfQUxCVU1fQVJUX1VSSSwKKyAgICAgICAgICAgIE1FVEFEQVRBX0tFWV9ESVNQTEFZX1RJVExFLAorICAgICAgICAgICAgTUVUQURBVEFfS0VZX0RJU1BMQVlfU1VCVElUTEUsCisgICAgICAgICAgICBNRVRBREFUQV9LRVlfRElTUExBWV9ERVNDUklQVElPTiwKKyAgICAgICAgICAgIE1FVEFEQVRBX0tFWV9ESVNQTEFZX0lDT05fVVJJLAorICAgICAgICAgICAgTUVUQURBVEFfS0VZX01FRElBX0lELAorICAgICAgICAgICAgTUVUQURBVEFfS0VZX01FRElBX1VSSSwKKyAgICB9KQorICAgIEBSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlNPVVJDRSkKKyAgICBwdWJsaWMgQGludGVyZmFjZSBUZXh0S2V5IHt9CisKKyAgICAvKioKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIEBTdHJpbmdEZWYocHJlZml4ID0geyAiTUVUQURBVEFfS0VZXyIgfSwgdmFsdWUgPSB7CisgICAgICAgICAgICBNRVRBREFUQV9LRVlfRFVSQVRJT04sCisgICAgICAgICAgICBNRVRBREFUQV9LRVlfWUVBUiwKKyAgICAgICAgICAgIE1FVEFEQVRBX0tFWV9UUkFDS19OVU1CRVIsCisgICAgICAgICAgICBNRVRBREFUQV9LRVlfTlVNX1RSQUNLUywKKyAgICAgICAgICAgIE1FVEFEQVRBX0tFWV9ESVNDX05VTUJFUiwKKyAgICAgICAgICAgIE1FVEFEQVRBX0tFWV9CVF9GT0xERVJfVFlQRSwKKyAgICB9KQorICAgIEBSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlNPVVJDRSkKKyAgICBwdWJsaWMgQGludGVyZmFjZSBMb25nS2V5IHt9CisKKyAgICAvKioKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIEBTdHJpbmdEZWYocHJlZml4ID0geyAiTUVUQURBVEFfS0VZXyIgfSwgdmFsdWUgPSB7CisgICAgICAgICAgICBNRVRBREFUQV9LRVlfQVJULAorICAgICAgICAgICAgTUVUQURBVEFfS0VZX0FMQlVNX0FSVCwKKyAgICAgICAgICAgIE1FVEFEQVRBX0tFWV9ESVNQTEFZX0lDT04sCisgICAgfSkKKyAgICBAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5TT1VSQ0UpCisgICAgcHVibGljIEBpbnRlcmZhY2UgQml0bWFwS2V5IHt9CisKKyAgICAvKioKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIEBTdHJpbmdEZWYocHJlZml4ID0geyAiTUVUQURBVEFfS0VZXyIgfSwgdmFsdWUgPSB7CisgICAgICAgICAgICBNRVRBREFUQV9LRVlfVVNFUl9SQVRJTkcsCisgICAgICAgICAgICBNRVRBREFUQV9LRVlfUkFUSU5HLAorICAgIH0pCisgICAgQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuU09VUkNFKQorICAgIHB1YmxpYyBAaW50ZXJmYWNlIFJhdGluZ0tleSB7fQorCisgICAgLyoqCisgICAgICogVGhlIHRpdGxlIG9mIHRoZSBtZWRpYS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRBREFUQV9LRVlfVElUTEUgPSAiYW5kcm9pZC5tZWRpYS5tZXRhZGF0YS5USVRMRSI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgYXJ0aXN0IG9mIHRoZSBtZWRpYS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRBREFUQV9LRVlfQVJUSVNUID0gImFuZHJvaWQubWVkaWEubWV0YWRhdGEuQVJUSVNUIjsKKworICAgIC8qKgorICAgICAqIFRoZSBkdXJhdGlvbiBvZiB0aGUgbWVkaWEgaW4gbXMuIEEgbmVnYXRpdmUgZHVyYXRpb24gaW5kaWNhdGVzIHRoYXQgdGhlCisgICAgICogZHVyYXRpb24gaXMgdW5rbm93biAob3IgaW5maW5pdGUpLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEFEQVRBX0tFWV9EVVJBVElPTiA9ICJhbmRyb2lkLm1lZGlhLm1ldGFkYXRhLkRVUkFUSU9OIjsKKworICAgIC8qKgorICAgICAqIFRoZSBhbGJ1bSB0aXRsZSBmb3IgdGhlIG1lZGlhLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEFEQVRBX0tFWV9BTEJVTSA9ICJhbmRyb2lkLm1lZGlhLm1ldGFkYXRhLkFMQlVNIjsKKworICAgIC8qKgorICAgICAqIFRoZSBhdXRob3Igb2YgdGhlIG1lZGlhLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEFEQVRBX0tFWV9BVVRIT1IgPSAiYW5kcm9pZC5tZWRpYS5tZXRhZGF0YS5BVVRIT1IiOworCisgICAgLyoqCisgICAgICogVGhlIHdyaXRlciBvZiB0aGUgbWVkaWEuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUQURBVEFfS0VZX1dSSVRFUiA9ICJhbmRyb2lkLm1lZGlhLm1ldGFkYXRhLldSSVRFUiI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgY29tcG9zZXIgb2YgdGhlIG1lZGlhLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEFEQVRBX0tFWV9DT01QT1NFUiA9ICJhbmRyb2lkLm1lZGlhLm1ldGFkYXRhLkNPTVBPU0VSIjsKKworICAgIC8qKgorICAgICAqIFRoZSBjb21waWxhdGlvbiBzdGF0dXMgb2YgdGhlIG1lZGlhLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEFEQVRBX0tFWV9DT01QSUxBVElPTiA9ICJhbmRyb2lkLm1lZGlhLm1ldGFkYXRhLkNPTVBJTEFUSU9OIjsKKworICAgIC8qKgorICAgICAqIFRoZSBkYXRlIHRoZSBtZWRpYSB3YXMgY3JlYXRlZCBvciBwdWJsaXNoZWQuIFRoZSBmb3JtYXQgaXMgdW5zcGVjaWZpZWQKKyAgICAgKiBidXQgUkZDIDMzMzkgaXMgcmVjb21tZW5kZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUQURBVEFfS0VZX0RBVEUgPSAiYW5kcm9pZC5tZWRpYS5tZXRhZGF0YS5EQVRFIjsKKworICAgIC8qKgorICAgICAqIFRoZSB5ZWFyIHRoZSBtZWRpYSB3YXMgY3JlYXRlZCBvciBwdWJsaXNoZWQgYXMgYSBsb25nLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEFEQVRBX0tFWV9ZRUFSID0gImFuZHJvaWQubWVkaWEubWV0YWRhdGEuWUVBUiI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgZ2VucmUgb2YgdGhlIG1lZGlhLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEFEQVRBX0tFWV9HRU5SRSA9ICJhbmRyb2lkLm1lZGlhLm1ldGFkYXRhLkdFTlJFIjsKKworICAgIC8qKgorICAgICAqIFRoZSB0cmFjayBudW1iZXIgZm9yIHRoZSBtZWRpYS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRBREFUQV9LRVlfVFJBQ0tfTlVNQkVSID0gImFuZHJvaWQubWVkaWEubWV0YWRhdGEuVFJBQ0tfTlVNQkVSIjsKKworICAgIC8qKgorICAgICAqIFRoZSBudW1iZXIgb2YgdHJhY2tzIGluIHRoZSBtZWRpYSdzIG9yaWdpbmFsIHNvdXJjZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRBREFUQV9LRVlfTlVNX1RSQUNLUyA9ICJhbmRyb2lkLm1lZGlhLm1ldGFkYXRhLk5VTV9UUkFDS1MiOworCisgICAgLyoqCisgICAgICogVGhlIGRpc2MgbnVtYmVyIGZvciB0aGUgbWVkaWEncyBvcmlnaW5hbCBzb3VyY2UuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUQURBVEFfS0VZX0RJU0NfTlVNQkVSID0gImFuZHJvaWQubWVkaWEubWV0YWRhdGEuRElTQ19OVU1CRVIiOworCisgICAgLyoqCisgICAgICogVGhlIGFydGlzdCBmb3IgdGhlIGFsYnVtIG9mIHRoZSBtZWRpYSdzIG9yaWdpbmFsIHNvdXJjZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRBREFUQV9LRVlfQUxCVU1fQVJUSVNUID0gImFuZHJvaWQubWVkaWEubWV0YWRhdGEuQUxCVU1fQVJUSVNUIjsKKworICAgIC8qKgorICAgICAqIFRoZSBhcnR3b3JrIGZvciB0aGUgbWVkaWEgYXMgYSB7QGxpbmsgQml0bWFwfS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgYXJ0d29yayBzaG91bGQgYmUgcmVsYXRpdmVseSBzbWFsbCBhbmQgbWF5IGJlIHNjYWxlZCBkb3duIGJ5IHRoZQorICAgICAqIHN5c3RlbSBpZiBpdCBpcyB0b28gbGFyZ2UuIEZvciBoaWdoZXIgcmVzb2x1dGlvbiBhcnR3b3JrCisgICAgICoge0BsaW5rICNNRVRBREFUQV9LRVlfQVJUX1VSSX0gc2hvdWxkIGJlIHVzZWQgaW5zdGVhZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRBREFUQV9LRVlfQVJUID0gImFuZHJvaWQubWVkaWEubWV0YWRhdGEuQVJUIjsKKworICAgIC8qKgorICAgICAqIFRoZSBhcnR3b3JrIGZvciB0aGUgbWVkaWEgYXMgYSBVcmkgZm9ybWF0dGVkIFN0cmluZy4gVGhlIGFydHdvcmsgY2FuIGJlCisgICAgICogbG9hZGVkIHVzaW5nIGEgY29tYmluYXRpb24gb2Yge0BsaW5rIENvbnRlbnRSZXNvbHZlciNvcGVuSW5wdXRTdHJlYW19IGFuZAorICAgICAqIHtAbGluayBCaXRtYXBGYWN0b3J5I2RlY29kZVN0cmVhbX0uCisgICAgICogPHA+CisgICAgICogRm9yIHRoZSBiZXN0IHJlc3VsdHMsIFVyaXMgc2hvdWxkIHVzZSB0aGUgY29udGVudDovLyBzdHlsZSBhbmQgc3VwcG9ydAorICAgICAqIHtAbGluayBDb250ZW50UmVzb2x2ZXIjRVhUUkFfU0laRX0gZm9yIHJldHJpZXZpbmcgc2NhbGVkIGFydHdvcmsgdGhyb3VnaAorICAgICAqIHtAbGluayBDb250ZW50UmVzb2x2ZXIjb3BlblR5cGVkQXNzZXRGaWxlRGVzY3JpcHRvcihVcmksIFN0cmluZywgQnVuZGxlKX0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUQURBVEFfS0VZX0FSVF9VUkkgPSAiYW5kcm9pZC5tZWRpYS5tZXRhZGF0YS5BUlRfVVJJIjsKKworICAgIC8qKgorICAgICAqIFRoZSBhcnR3b3JrIGZvciB0aGUgYWxidW0gb2YgdGhlIG1lZGlhJ3Mgb3JpZ2luYWwgc291cmNlIGFzIGEKKyAgICAgKiB7QGxpbmsgQml0bWFwfS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgYXJ0d29yayBzaG91bGQgYmUgcmVsYXRpdmVseSBzbWFsbCBhbmQgbWF5IGJlIHNjYWxlZCBkb3duIGJ5IHRoZQorICAgICAqIHN5c3RlbSBpZiBpdCBpcyB0b28gbGFyZ2UuIEZvciBoaWdoZXIgcmVzb2x1dGlvbiBhcnR3b3JrCisgICAgICoge0BsaW5rICNNRVRBREFUQV9LRVlfQUxCVU1fQVJUX1VSSX0gc2hvdWxkIGJlIHVzZWQgaW5zdGVhZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRBREFUQV9LRVlfQUxCVU1fQVJUID0gImFuZHJvaWQubWVkaWEubWV0YWRhdGEuQUxCVU1fQVJUIjsKKworICAgIC8qKgorICAgICAqIFRoZSBhcnR3b3JrIGZvciB0aGUgYWxidW0gb2YgdGhlIG1lZGlhJ3Mgb3JpZ2luYWwgc291cmNlIGFzIGEgVXJpCisgICAgICogZm9ybWF0dGVkIFN0cmluZy4gVGhlIGFydHdvcmsgY2FuIGJlIGxvYWRlZCB1c2luZyBhIGNvbWJpbmF0aW9uIG9mCisgICAgICoge0BsaW5rIENvbnRlbnRSZXNvbHZlciNvcGVuSW5wdXRTdHJlYW19IGFuZAorICAgICAqIHtAbGluayBCaXRtYXBGYWN0b3J5I2RlY29kZVN0cmVhbX0uCisgICAgICogPHA+CisgICAgICogRm9yIHRoZSBiZXN0IHJlc3VsdHMsIFVyaXMgc2hvdWxkIHVzZSB0aGUgY29udGVudDovLyBzdHlsZSBhbmQgc3VwcG9ydAorICAgICAqIHtAbGluayBDb250ZW50UmVzb2x2ZXIjRVhUUkFfU0laRX0gZm9yIHJldHJpZXZpbmcgc2NhbGVkIGFydHdvcmsgdGhyb3VnaAorICAgICAqIHtAbGluayBDb250ZW50UmVzb2x2ZXIjb3BlblR5cGVkQXNzZXRGaWxlRGVzY3JpcHRvcihVcmksIFN0cmluZywgQnVuZGxlKX0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUQURBVEFfS0VZX0FMQlVNX0FSVF9VUkkgPSAiYW5kcm9pZC5tZWRpYS5tZXRhZGF0YS5BTEJVTV9BUlRfVVJJIjsKKworICAgIC8qKgorICAgICAqIFRoZSB1c2VyJ3MgcmF0aW5nIGZvciB0aGUgbWVkaWEuCisgICAgICoKKyAgICAgKiBAc2VlIFJhdGluZworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEFEQVRBX0tFWV9VU0VSX1JBVElORyA9ICJhbmRyb2lkLm1lZGlhLm1ldGFkYXRhLlVTRVJfUkFUSU5HIjsKKworICAgIC8qKgorICAgICAqIFRoZSBvdmVyYWxsIHJhdGluZyBmb3IgdGhlIG1lZGlhLgorICAgICAqCisgICAgICogQHNlZSBSYXRpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRBREFUQV9LRVlfUkFUSU5HID0gImFuZHJvaWQubWVkaWEubWV0YWRhdGEuUkFUSU5HIjsKKworICAgIC8qKgorICAgICAqIEEgdGl0bGUgdGhhdCBpcyBzdWl0YWJsZSBmb3IgZGlzcGxheSB0byB0aGUgdXNlci4gVGhpcyB3aWxsIGdlbmVyYWxseSBiZQorICAgICAqIHRoZSBzYW1lIGFzIHtAbGluayAjTUVUQURBVEFfS0VZX1RJVExFfSBidXQgbWF5IGRpZmZlciBmb3Igc29tZSBmb3JtYXRzLgorICAgICAqIFdoZW4gZGlzcGxheWluZyBtZWRpYSBkZXNjcmliZWQgYnkgdGhpcyBtZXRhZGF0YSB0aGlzIHNob3VsZCBiZSBwcmVmZXJyZWQKKyAgICAgKiBpZiBwcmVzZW50LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEFEQVRBX0tFWV9ESVNQTEFZX1RJVExFID0gImFuZHJvaWQubWVkaWEubWV0YWRhdGEuRElTUExBWV9USVRMRSI7CisKKyAgICAvKioKKyAgICAgKiBBIHN1YnRpdGxlIHRoYXQgaXMgc3VpdGFibGUgZm9yIGRpc3BsYXkgdG8gdGhlIHVzZXIuIFdoZW4gZGlzcGxheWluZyBhCisgICAgICogc2Vjb25kIGxpbmUgZm9yIG1lZGlhIGRlc2NyaWJlZCBieSB0aGlzIG1ldGFkYXRhIHRoaXMgc2hvdWxkIGJlIHByZWZlcnJlZAorICAgICAqIHRvIG90aGVyIGZpZWxkcyBpZiBwcmVzZW50LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEFEQVRBX0tFWV9ESVNQTEFZX1NVQlRJVExFCisgICAgICAgICAgICA9ICJhbmRyb2lkLm1lZGlhLm1ldGFkYXRhLkRJU1BMQVlfU1VCVElUTEUiOworCisgICAgLyoqCisgICAgICogQSBkZXNjcmlwdGlvbiB0aGF0IGlzIHN1aXRhYmxlIGZvciBkaXNwbGF5IHRvIHRoZSB1c2VyLiBXaGVuIGRpc3BsYXlpbmcKKyAgICAgKiBtb3JlIGluZm9ybWF0aW9uIGZvciBtZWRpYSBkZXNjcmliZWQgYnkgdGhpcyBtZXRhZGF0YSB0aGlzIHNob3VsZCBiZQorICAgICAqIHByZWZlcnJlZCB0byBvdGhlciBmaWVsZHMgaWYgcHJlc2VudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRBREFUQV9LRVlfRElTUExBWV9ERVNDUklQVElPTgorICAgICAgICAgICAgPSAiYW5kcm9pZC5tZWRpYS5tZXRhZGF0YS5ESVNQTEFZX0RFU0NSSVBUSU9OIjsKKworICAgIC8qKgorICAgICAqIEFuIGljb24gb3IgdGh1bWJuYWlsIHRoYXQgaXMgc3VpdGFibGUgZm9yIGRpc3BsYXkgdG8gdGhlIHVzZXIuIFdoZW4KKyAgICAgKiBkaXNwbGF5aW5nIGFuIGljb24gZm9yIG1lZGlhIGRlc2NyaWJlZCBieSB0aGlzIG1ldGFkYXRhIHRoaXMgc2hvdWxkIGJlCisgICAgICogcHJlZmVycmVkIHRvIG90aGVyIGZpZWxkcyBpZiBwcmVzZW50LiBUaGlzIG11c3QgYmUgYSB7QGxpbmsgQml0bWFwfS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgaWNvbiBzaG91bGQgYmUgcmVsYXRpdmVseSBzbWFsbCBhbmQgbWF5IGJlIHNjYWxlZCBkb3duIGJ5IHRoZSBzeXN0ZW0KKyAgICAgKiBpZiBpdCBpcyB0b28gbGFyZ2UuIEZvciBoaWdoZXIgcmVzb2x1dGlvbiBhcnR3b3JrCisgICAgICoge0BsaW5rICNNRVRBREFUQV9LRVlfRElTUExBWV9JQ09OX1VSSX0gc2hvdWxkIGJlIHVzZWQgaW5zdGVhZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRBREFUQV9LRVlfRElTUExBWV9JQ09OCisgICAgICAgICAgICA9ICJhbmRyb2lkLm1lZGlhLm1ldGFkYXRhLkRJU1BMQVlfSUNPTiI7CisKKyAgICAvKioKKyAgICAgKiBBIFVyaSBmb3JtYXR0ZWQgU3RyaW5nIGZvciBhbiBpY29uIG9yIHRodW1ibmFpbCB0aGF0IGlzIHN1aXRhYmxlIGZvcgorICAgICAqIGRpc3BsYXkgdG8gdGhlIHVzZXIuIFdoZW4gZGlzcGxheWluZyBtb3JlIGluZm9ybWF0aW9uIGZvciBtZWRpYSBkZXNjcmliZWQKKyAgICAgKiBieSB0aGlzIG1ldGFkYXRhIHRoZSBkaXNwbGF5IGRlc2NyaXB0aW9uIHNob3VsZCBiZSBwcmVmZXJyZWQgdG8gb3RoZXIKKyAgICAgKiBmaWVsZHMgd2hlbiBwcmVzZW50LiBUaGUgaWNvbiBjYW4gYmUgbG9hZGVkIHVzaW5nIGEgY29tYmluYXRpb24gb2YKKyAgICAgKiB7QGxpbmsgQ29udGVudFJlc29sdmVyI29wZW5JbnB1dFN0cmVhbX0gYW5kCisgICAgICoge0BsaW5rIEJpdG1hcEZhY3RvcnkjZGVjb2RlU3RyZWFtfS4KKyAgICAgKiA8cD4KKyAgICAgKiBGb3IgdGhlIGJlc3QgcmVzdWx0cywgVXJpcyBzaG91bGQgdXNlIHRoZSBjb250ZW50Oi8vIHN0eWxlIGFuZCBzdXBwb3J0CisgICAgICoge0BsaW5rIENvbnRlbnRSZXNvbHZlciNFWFRSQV9TSVpFfSBmb3IgcmV0cmlldmluZyBzY2FsZWQgYXJ0d29yayB0aHJvdWdoCisgICAgICoge0BsaW5rIENvbnRlbnRSZXNvbHZlciNvcGVuVHlwZWRBc3NldEZpbGVEZXNjcmlwdG9yKFVyaSwgU3RyaW5nLCBCdW5kbGUpfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRBREFUQV9LRVlfRElTUExBWV9JQ09OX1VSSQorICAgICAgICAgICAgPSAiYW5kcm9pZC5tZWRpYS5tZXRhZGF0YS5ESVNQTEFZX0lDT05fVVJJIjsKKworICAgIC8qKgorICAgICAqIEEgU3RyaW5nIGtleSBmb3IgaWRlbnRpZnlpbmcgdGhlIGNvbnRlbnQuIFRoaXMgdmFsdWUgaXMgc3BlY2lmaWMgdG8gdGhlCisgICAgICogc2VydmljZSBwcm92aWRpbmcgdGhlIGNvbnRlbnQuIElmIHVzZWQsIHRoaXMgc2hvdWxkIGJlIGEgcGVyc2lzdGVudAorICAgICAqIHVuaXF1ZSBrZXkgZm9yIHRoZSB1bmRlcmx5aW5nIGNvbnRlbnQuIEl0IG1heSBiZSB1c2VkIHdpdGgKKyAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sbGVyLlRyYW5zcG9ydENvbnRyb2xzI3BsYXlGcm9tTWVkaWFJZChTdHJpbmcsIEJ1bmRsZSl9CisgICAgICogdG8gaW5pdGlhdGUgcGxheWJhY2sgd2hlbiBwcm92aWRlZCBieSBhIHtAbGluayBNZWRpYUJyb3dzZXJ9IGNvbm5lY3RlZCB0bworICAgICAqIHRoZSBzYW1lIGFwcC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRBREFUQV9LRVlfTUVESUFfSUQgPSAiYW5kcm9pZC5tZWRpYS5tZXRhZGF0YS5NRURJQV9JRCI7CisKKyAgICAvKioKKyAgICAgKiBBIFVyaSBmb3JtYXR0ZWQgU3RyaW5nIHJlcHJlc2VudGluZyB0aGUgY29udGVudC4gVGhpcyB2YWx1ZSBpcyBzcGVjaWZpYyB0byB0aGUKKyAgICAgKiBzZXJ2aWNlIHByb3ZpZGluZyB0aGUgY29udGVudC4gSXQgbWF5IGJlIHVzZWQgd2l0aAorICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xsZXIuVHJhbnNwb3J0Q29udHJvbHMjcGxheUZyb21VcmkoVXJpLCBCdW5kbGUpfQorICAgICAqIHRvIGluaXRpYXRlIHBsYXliYWNrIHdoZW4gcHJvdmlkZWQgYnkgYSB7QGxpbmsgTWVkaWFCcm93c2VyfSBjb25uZWN0ZWQgdG8KKyAgICAgKiB0aGUgc2FtZSBhcHAuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUQURBVEFfS0VZX01FRElBX1VSSSA9ICJhbmRyb2lkLm1lZGlhLm1ldGFkYXRhLk1FRElBX1VSSSI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgYmx1ZXRvb3RoIGZvbGRlciB0eXBlIG9mIHRoZSBtZWRpYSBzcGVjaWZpZWQgaW4gdGhlIHNlY3Rpb24gNi4xMC4yLjIgb2YgdGhlIEJsdWV0b290aAorICAgICAqIEFWUkNQIDEuNS4gSXQgc2hvdWxkIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+e0BsaW5rIE1lZGlhRGVzY3JpcHRpb24jQlRfRk9MREVSX1RZUEVfTUlYRUR9PC9saT4KKyAgICAgKiA8bGk+e0BsaW5rIE1lZGlhRGVzY3JpcHRpb24jQlRfRk9MREVSX1RZUEVfVElUTEVTfTwvbGk+CisgICAgICogPGxpPntAbGluayBNZWRpYURlc2NyaXB0aW9uI0JUX0ZPTERFUl9UWVBFX0FMQlVNU308L2xpPgorICAgICAqIDxsaT57QGxpbmsgTWVkaWFEZXNjcmlwdGlvbiNCVF9GT0xERVJfVFlQRV9BUlRJU1RTfTwvbGk+CisgICAgICogPGxpPntAbGluayBNZWRpYURlc2NyaXB0aW9uI0JUX0ZPTERFUl9UWVBFX0dFTlJFU308L2xpPgorICAgICAqIDxsaT57QGxpbmsgTWVkaWFEZXNjcmlwdGlvbiNCVF9GT0xERVJfVFlQRV9QTEFZTElTVFN9PC9saT4KKyAgICAgKiA8bGk+e0BsaW5rIE1lZGlhRGVzY3JpcHRpb24jQlRfRk9MREVSX1RZUEVfWUVBUlN9PC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEFEQVRBX0tFWV9CVF9GT0xERVJfVFlQRQorICAgICAgICAgICAgPSAiYW5kcm9pZC5tZWRpYS5tZXRhZGF0YS5CVF9GT0xERVJfVFlQRSI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBAVGV4dEtleSBTdHJpbmdbXSBQUkVGRVJSRURfREVTQ1JJUFRJT05fT1JERVIgPSB7CisgICAgICAgICAgICBNRVRBREFUQV9LRVlfVElUTEUsCisgICAgICAgICAgICBNRVRBREFUQV9LRVlfQVJUSVNULAorICAgICAgICAgICAgTUVUQURBVEFfS0VZX0FMQlVNLAorICAgICAgICAgICAgTUVUQURBVEFfS0VZX0FMQlVNX0FSVElTVCwKKyAgICAgICAgICAgIE1FVEFEQVRBX0tFWV9XUklURVIsCisgICAgICAgICAgICBNRVRBREFUQV9LRVlfQVVUSE9SLAorICAgICAgICAgICAgTUVUQURBVEFfS0VZX0NPTVBPU0VSCisgICAgfTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEBCaXRtYXBLZXkgU3RyaW5nW10gUFJFRkVSUkVEX0JJVE1BUF9PUkRFUiA9IHsKKyAgICAgICAgICAgIE1FVEFEQVRBX0tFWV9ESVNQTEFZX0lDT04sCisgICAgICAgICAgICBNRVRBREFUQV9LRVlfQVJULAorICAgICAgICAgICAgTUVUQURBVEFfS0VZX0FMQlVNX0FSVAorICAgIH07CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBAVGV4dEtleSBTdHJpbmdbXSBQUkVGRVJSRURfVVJJX09SREVSID0geworICAgICAgICAgICAgTUVUQURBVEFfS0VZX0RJU1BMQVlfSUNPTl9VUkksCisgICAgICAgICAgICBNRVRBREFUQV9LRVlfQVJUX1VSSSwKKyAgICAgICAgICAgIE1FVEFEQVRBX0tFWV9BTEJVTV9BUlRfVVJJCisgICAgfTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNRVRBREFUQV9UWVBFX0lOVkFMSUQgPSAtMTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUVUQURBVEFfVFlQRV9MT05HID0gMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUVUQURBVEFfVFlQRV9URVhUID0gMTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUVUQURBVEFfVFlQRV9CSVRNQVAgPSAyOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNRVRBREFUQV9UWVBFX1JBVElORyA9IDM7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQXJyYXlNYXA8U3RyaW5nLCBJbnRlZ2VyPiBNRVRBREFUQV9LRVlTX1RZUEU7CisKKyAgICBzdGF0aWMgeworICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUgPSBuZXcgQXJyYXlNYXA8U3RyaW5nLCBJbnRlZ2VyPigpOworICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9USVRMRSwgTUVUQURBVEFfVFlQRV9URVhUKTsKKyAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfQVJUSVNULCBNRVRBREFUQV9UWVBFX1RFWFQpOworICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9EVVJBVElPTiwgTUVUQURBVEFfVFlQRV9MT05HKTsKKyAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfQUxCVU0sIE1FVEFEQVRBX1RZUEVfVEVYVCk7CisgICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0FVVEhPUiwgTUVUQURBVEFfVFlQRV9URVhUKTsKKyAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfV1JJVEVSLCBNRVRBREFUQV9UWVBFX1RFWFQpOworICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9DT01QT1NFUiwgTUVUQURBVEFfVFlQRV9URVhUKTsKKyAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfQ09NUElMQVRJT04sIE1FVEFEQVRBX1RZUEVfVEVYVCk7CisgICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0RBVEUsIE1FVEFEQVRBX1RZUEVfVEVYVCk7CisgICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX1lFQVIsIE1FVEFEQVRBX1RZUEVfTE9ORyk7CisgICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0dFTlJFLCBNRVRBREFUQV9UWVBFX1RFWFQpOworICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9UUkFDS19OVU1CRVIsIE1FVEFEQVRBX1RZUEVfTE9ORyk7CisgICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX05VTV9UUkFDS1MsIE1FVEFEQVRBX1RZUEVfTE9ORyk7CisgICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0RJU0NfTlVNQkVSLCBNRVRBREFUQV9UWVBFX0xPTkcpOworICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9BTEJVTV9BUlRJU1QsIE1FVEFEQVRBX1RZUEVfVEVYVCk7CisgICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0FSVCwgTUVUQURBVEFfVFlQRV9CSVRNQVApOworICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9BUlRfVVJJLCBNRVRBREFUQV9UWVBFX1RFWFQpOworICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9BTEJVTV9BUlQsIE1FVEFEQVRBX1RZUEVfQklUTUFQKTsKKyAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfQUxCVU1fQVJUX1VSSSwgTUVUQURBVEFfVFlQRV9URVhUKTsKKyAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfVVNFUl9SQVRJTkcsIE1FVEFEQVRBX1RZUEVfUkFUSU5HKTsKKyAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfUkFUSU5HLCBNRVRBREFUQV9UWVBFX1JBVElORyk7CisgICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0RJU1BMQVlfVElUTEUsIE1FVEFEQVRBX1RZUEVfVEVYVCk7CisgICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0RJU1BMQVlfU1VCVElUTEUsIE1FVEFEQVRBX1RZUEVfVEVYVCk7CisgICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0RJU1BMQVlfREVTQ1JJUFRJT04sIE1FVEFEQVRBX1RZUEVfVEVYVCk7CisgICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0RJU1BMQVlfSUNPTiwgTUVUQURBVEFfVFlQRV9CSVRNQVApOworICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9ESVNQTEFZX0lDT05fVVJJLCBNRVRBREFUQV9UWVBFX1RFWFQpOworICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9CVF9GT0xERVJfVFlQRSwgTUVUQURBVEFfVFlQRV9MT05HKTsKKyAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfTUVESUFfSUQsIE1FVEFEQVRBX1RZUEVfVEVYVCk7CisgICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX01FRElBX1VSSSwgTUVUQURBVEFfVFlQRV9URVhUKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTcGFyc2VBcnJheTxTdHJpbmc+IEVESVRPUl9LRVlfTUFQUElORzsKKworICAgIHN0YXRpYyB7CisgICAgICAgIEVESVRPUl9LRVlfTUFQUElORyA9IG5ldyBTcGFyc2VBcnJheTxTdHJpbmc+KCk7CisgICAgICAgIEVESVRPUl9LRVlfTUFQUElORy5wdXQoTWVkaWFNZXRhZGF0YUVkaXRvci5CSVRNQVBfS0VZX0FSVFdPUkssIE1FVEFEQVRBX0tFWV9BUlQpOworICAgICAgICBFRElUT1JfS0VZX01BUFBJTkcucHV0KE1lZGlhTWV0YWRhdGFFZGl0b3IuUkFUSU5HX0tFWV9CWV9PVEhFUlMsIE1FVEFEQVRBX0tFWV9SQVRJTkcpOworICAgICAgICBFRElUT1JfS0VZX01BUFBJTkcucHV0KE1lZGlhTWV0YWRhdGFFZGl0b3IuUkFUSU5HX0tFWV9CWV9VU0VSLCBNRVRBREFUQV9LRVlfVVNFUl9SQVRJTkcpOworICAgICAgICBFRElUT1JfS0VZX01BUFBJTkcucHV0KE1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIuTUVUQURBVEFfS0VZX0FMQlVNLCBNRVRBREFUQV9LRVlfQUxCVU0pOworICAgICAgICBFRElUT1JfS0VZX01BUFBJTkcucHV0KE1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIuTUVUQURBVEFfS0VZX0FMQlVNQVJUSVNULAorICAgICAgICAgICAgICAgIE1FVEFEQVRBX0tFWV9BTEJVTV9BUlRJU1QpOworICAgICAgICBFRElUT1JfS0VZX01BUFBJTkcucHV0KE1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIuTUVUQURBVEFfS0VZX0FSVElTVCwgTUVUQURBVEFfS0VZX0FSVElTVCk7CisgICAgICAgIEVESVRPUl9LRVlfTUFQUElORy5wdXQoTWVkaWFNZXRhZGF0YVJldHJpZXZlci5NRVRBREFUQV9LRVlfQVVUSE9SLCBNRVRBREFUQV9LRVlfQVVUSE9SKTsKKyAgICAgICAgRURJVE9SX0tFWV9NQVBQSU5HLnB1dChNZWRpYU1ldGFkYXRhUmV0cmlldmVyLk1FVEFEQVRBX0tFWV9DRF9UUkFDS19OVU1CRVIsCisgICAgICAgICAgICAgICAgTUVUQURBVEFfS0VZX1RSQUNLX05VTUJFUik7CisgICAgICAgIEVESVRPUl9LRVlfTUFQUElORy5wdXQoTWVkaWFNZXRhZGF0YVJldHJpZXZlci5NRVRBREFUQV9LRVlfQ09NUE9TRVIsIE1FVEFEQVRBX0tFWV9DT01QT1NFUik7CisgICAgICAgIEVESVRPUl9LRVlfTUFQUElORy5wdXQoTWVkaWFNZXRhZGF0YVJldHJpZXZlci5NRVRBREFUQV9LRVlfQ09NUElMQVRJT04sCisgICAgICAgICAgICAgICAgTUVUQURBVEFfS0VZX0NPTVBJTEFUSU9OKTsKKyAgICAgICAgRURJVE9SX0tFWV9NQVBQSU5HLnB1dChNZWRpYU1ldGFkYXRhUmV0cmlldmVyLk1FVEFEQVRBX0tFWV9EQVRFLCBNRVRBREFUQV9LRVlfREFURSk7CisgICAgICAgIEVESVRPUl9LRVlfTUFQUElORy5wdXQoTWVkaWFNZXRhZGF0YVJldHJpZXZlci5NRVRBREFUQV9LRVlfRElTQ19OVU1CRVIsCisgICAgICAgICAgICAgICAgTUVUQURBVEFfS0VZX0RJU0NfTlVNQkVSKTsKKyAgICAgICAgRURJVE9SX0tFWV9NQVBQSU5HLnB1dChNZWRpYU1ldGFkYXRhUmV0cmlldmVyLk1FVEFEQVRBX0tFWV9EVVJBVElPTiwgTUVUQURBVEFfS0VZX0RVUkFUSU9OKTsKKyAgICAgICAgRURJVE9SX0tFWV9NQVBQSU5HLnB1dChNZWRpYU1ldGFkYXRhUmV0cmlldmVyLk1FVEFEQVRBX0tFWV9HRU5SRSwgTUVUQURBVEFfS0VZX0dFTlJFKTsKKyAgICAgICAgRURJVE9SX0tFWV9NQVBQSU5HLnB1dChNZWRpYU1ldGFkYXRhUmV0cmlldmVyLk1FVEFEQVRBX0tFWV9OVU1fVFJBQ0tTLAorICAgICAgICAgICAgICAgIE1FVEFEQVRBX0tFWV9OVU1fVFJBQ0tTKTsKKyAgICAgICAgRURJVE9SX0tFWV9NQVBQSU5HLnB1dChNZWRpYU1ldGFkYXRhUmV0cmlldmVyLk1FVEFEQVRBX0tFWV9USVRMRSwgTUVUQURBVEFfS0VZX1RJVExFKTsKKyAgICAgICAgRURJVE9SX0tFWV9NQVBQSU5HLnB1dChNZWRpYU1ldGFkYXRhUmV0cmlldmVyLk1FVEFEQVRBX0tFWV9XUklURVIsIE1FVEFEQVRBX0tFWV9XUklURVIpOworICAgICAgICBFRElUT1JfS0VZX01BUFBJTkcucHV0KE1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIuTUVUQURBVEFfS0VZX1lFQVIsIE1FVEFEQVRBX0tFWV9ZRUFSKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIEJ1bmRsZSBtQnVuZGxlOworICAgIHByaXZhdGUgTWVkaWFEZXNjcmlwdGlvbiBtRGVzY3JpcHRpb247CisKKyAgICBwcml2YXRlIE1lZGlhTWV0YWRhdGEoQnVuZGxlIGJ1bmRsZSkgeworICAgICAgICBtQnVuZGxlID0gbmV3IEJ1bmRsZShidW5kbGUpOworICAgIH0KKworICAgIHByaXZhdGUgTWVkaWFNZXRhZGF0YShQYXJjZWwgaW4pIHsKKyAgICAgICAgLy9UT0RPKGIvMTE5Nzg5Mzg3KTogUmVzb2x2ZSBoaWRkZW4gQVBJIHVzYWdlOiBCdW5kbGUjc2V0RGVmdXNhYmxlCisgICAgICAgIC8vbUJ1bmRsZSA9IEJ1bmRsZS5zZXREZWZ1c2FibGUoaW4ucmVhZEJ1bmRsZSgpLCB0cnVlKTsKKyAgICAgICAgbUJ1bmRsZSA9IG5ldyBCdW5kbGUoKTsgIC8vVE9ETzpyZW1vdmUgdGhpcy4KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIGtleSBpcyBjb250YWluZWQgaW4gdGhlIG1ldGFkYXRhCisgICAgICoKKyAgICAgKiBAcGFyYW0ga2V5IGEgU3RyaW5nIGtleQorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUga2V5IGV4aXN0cyBpbiB0aGlzIG1ldGFkYXRhLCBmYWxzZSBvdGhlcndpc2UKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0tleShTdHJpbmcga2V5KSB7CisgICAgICAgIHJldHVybiBtQnVuZGxlLmNvbnRhaW5zS2V5KGtleSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBrZXksIG9yIG51bGwgaWYgbm8gbWFwcGluZyBvZgorICAgICAqIHRoZSBkZXNpcmVkIHR5cGUgZXhpc3RzIGZvciB0aGUgZ2l2ZW4ga2V5IG9yIGEgbnVsbCB2YWx1ZSBpcyBleHBsaWNpdGx5CisgICAgICogYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXkuCisgICAgICoKKyAgICAgKiBAcGFyYW0ga2V5IFRoZSBrZXkgdGhlIHZhbHVlIGlzIHN0b3JlZCB1bmRlcgorICAgICAqIEByZXR1cm4gYSBDaGFyU2VxdWVuY2UgdmFsdWUsIG9yIG51bGwKKyAgICAgKi8KKyAgICBwdWJsaWMgQ2hhclNlcXVlbmNlIGdldFRleHQoQFRleHRLZXkgU3RyaW5nIGtleSkgeworICAgICAgICByZXR1cm4gbUJ1bmRsZS5nZXRDaGFyU2VxdWVuY2Uoa2V5KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB0ZXh0IHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4ga2V5IGFzIGEgU3RyaW5nLCBvciBudWxsCisgICAgICogaWYgbm8gbWFwcGluZyBvZiB0aGUgZGVzaXJlZCB0eXBlIGV4aXN0cyBmb3IgdGhlIGdpdmVuIGtleSBvciBhIG51bGwKKyAgICAgKiB2YWx1ZSBpcyBleHBsaWNpdGx5IGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5LiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8KKyAgICAgKiBjYWxsaW5nIHtAbGluayAjZ2V0VGV4dCBnZXRUZXh0KCkudG9TdHJpbmcoKX0gaWYgdGhlIHZhbHVlIGlzIG5vdCBudWxsLgorICAgICAqCisgICAgICogQHBhcmFtIGtleSBUaGUga2V5IHRoZSB2YWx1ZSBpcyBzdG9yZWQgdW5kZXIKKyAgICAgKiBAcmV0dXJuIGEgU3RyaW5nIHZhbHVlLCBvciBudWxsCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRTdHJpbmcoQFRleHRLZXkgU3RyaW5nIGtleSkgeworICAgICAgICBDaGFyU2VxdWVuY2UgdGV4dCA9IGdldFRleHQoa2V5KTsKKyAgICAgICAgaWYgKHRleHQgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIHRleHQudG9TdHJpbmcoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGtleSwgb3IgMEwgaWYgbm8gbG9uZyBleGlzdHMKKyAgICAgKiBmb3IgdGhlIGdpdmVuIGtleS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBrZXkgVGhlIGtleSB0aGUgdmFsdWUgaXMgc3RvcmVkIHVuZGVyCisgICAgICogQHJldHVybiBhIGxvbmcgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRMb25nKEBMb25nS2V5IFN0cmluZyBrZXkpIHsKKyAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0TG9uZyhrZXksIDApOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSB7QGxpbmsgUmF0aW5nfSBmb3IgdGhlIGdpdmVuIGtleSBvciBudWxsIGlmIG5vIHJhdGluZyBleGlzdHMKKyAgICAgKiBmb3IgdGhlIGdpdmVuIGtleS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBrZXkgVGhlIGtleSB0aGUgdmFsdWUgaXMgc3RvcmVkIHVuZGVyCisgICAgICogQHJldHVybiBBIHtAbGluayBSYXRpbmd9IG9yIG51bGwKKyAgICAgKi8KKyAgICBwdWJsaWMgUmF0aW5nIGdldFJhdGluZyhAUmF0aW5nS2V5IFN0cmluZyBrZXkpIHsKKyAgICAgICAgUmF0aW5nIHJhdGluZyA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByYXRpbmcgPSBtQnVuZGxlLmdldFBhcmNlbGFibGUoa2V5KTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIGlnbm9yZSwgdmFsdWUgd2FzIG5vdCBhIGJpdG1hcAorICAgICAgICAgICAgTG9nLncoVEFHLCAiRmFpbGVkIHRvIHJldHJpZXZlIGEga2V5IGFzIFJhdGluZy4iLCBlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmF0aW5nOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSB7QGxpbmsgQml0bWFwfSBmb3IgdGhlIGdpdmVuIGtleSBvciBudWxsIGlmIG5vIGJpdG1hcCBleGlzdHMKKyAgICAgKiBmb3IgdGhlIGdpdmVuIGtleS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBrZXkgVGhlIGtleSB0aGUgdmFsdWUgaXMgc3RvcmVkIHVuZGVyCisgICAgICogQHJldHVybiBBIHtAbGluayBCaXRtYXB9IG9yIG51bGwKKyAgICAgKi8KKyAgICBwdWJsaWMgQml0bWFwIGdldEJpdG1hcChAQml0bWFwS2V5IFN0cmluZyBrZXkpIHsKKyAgICAgICAgQml0bWFwIGJtcCA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBibXAgPSBtQnVuZGxlLmdldFBhcmNlbGFibGUoa2V5KTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIGlnbm9yZSwgdmFsdWUgd2FzIG5vdCBhIGJpdG1hcAorICAgICAgICAgICAgTG9nLncoVEFHLCAiRmFpbGVkIHRvIHJldHJpZXZlIGEga2V5IGFzIEJpdG1hcC4iLCBlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYm1wOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZGVzY3JpYmVDb250ZW50cygpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgd3JpdGVUb1BhcmNlbChQYXJjZWwgZGVzdCwgaW50IGZsYWdzKSB7CisgICAgICAgIGRlc3Qud3JpdGVCdW5kbGUobUJ1bmRsZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGZpZWxkcyBpbiB0aGlzIG1ldGFkYXRhLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgbnVtYmVyIG9mIGZpZWxkcyBpbiB0aGUgbWV0YWRhdGEuCisgICAgICovCisgICAgcHVibGljIGludCBzaXplKCkgeworICAgICAgICByZXR1cm4gbUJ1bmRsZS5zaXplKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIFNldCBjb250YWluaW5nIHRoZSBTdHJpbmdzIHVzZWQgYXMga2V5cyBpbiB0aGlzIG1ldGFkYXRhLgorICAgICAqCisgICAgICogQHJldHVybiBhIFNldCBvZiBTdHJpbmcga2V5cworICAgICAqLworICAgIHB1YmxpYyBTZXQ8U3RyaW5nPiBrZXlTZXQoKSB7CisgICAgICAgIHJldHVybiBtQnVuZGxlLmtleVNldCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBzaW1wbGUgZGVzY3JpcHRpb24gb2YgdGhpcyBtZXRhZGF0YSBmb3IgZGlzcGxheSBwdXJwb3Nlcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gQSBzaW1wbGUgZGVzY3JpcHRpb24gb2YgdGhpcyBtZXRhZGF0YS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQE5vbk51bGwgTWVkaWFEZXNjcmlwdGlvbiBnZXREZXNjcmlwdGlvbigpIHsKKyAgICAgICAgaWYgKG1EZXNjcmlwdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbURlc2NyaXB0aW9uOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIG1lZGlhSWQgPSBnZXRTdHJpbmcoTUVUQURBVEFfS0VZX01FRElBX0lEKTsKKworICAgICAgICBDaGFyU2VxdWVuY2VbXSB0ZXh0ID0gbmV3IENoYXJTZXF1ZW5jZVszXTsKKyAgICAgICAgQml0bWFwIGljb24gPSBudWxsOworICAgICAgICBVcmkgaWNvblVyaSA9IG51bGw7CisKKyAgICAgICAgLy8gRmlyc3QgaGFuZGxlIHRoZSBjYXNlIHdoZXJlIGRpc3BsYXkgZGF0YSBpcyBzZXQgYWxyZWFkeQorICAgICAgICBDaGFyU2VxdWVuY2UgZGlzcGxheVRleHQgPSBnZXRUZXh0KE1FVEFEQVRBX0tFWV9ESVNQTEFZX1RJVExFKTsKKyAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShkaXNwbGF5VGV4dCkpIHsKKyAgICAgICAgICAgIC8vIElmIHRoZXkgaGF2ZSBhIGRpc3BsYXkgdGl0bGUgdXNlIG9ubHkgZGlzcGxheSBkYXRhLCBvdGhlcndpc2UgdXNlCisgICAgICAgICAgICAvLyBvdXIgYmVzdCBiZXRzCisgICAgICAgICAgICB0ZXh0WzBdID0gZGlzcGxheVRleHQ7CisgICAgICAgICAgICB0ZXh0WzFdID0gZ2V0VGV4dChNRVRBREFUQV9LRVlfRElTUExBWV9TVUJUSVRMRSk7CisgICAgICAgICAgICB0ZXh0WzJdID0gZ2V0VGV4dChNRVRBREFUQV9LRVlfRElTUExBWV9ERVNDUklQVElPTik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBVc2Ugd2hhdGV2ZXIgZmllbGRzIHdlIGNhbgorICAgICAgICAgICAgaW50IHRleHRJbmRleCA9IDA7CisgICAgICAgICAgICBpbnQga2V5SW5kZXggPSAwOworICAgICAgICAgICAgd2hpbGUgKHRleHRJbmRleCA8IHRleHQubGVuZ3RoICYmIGtleUluZGV4IDwgUFJFRkVSUkVEX0RFU0NSSVBUSU9OX09SREVSLmxlbmd0aCkgeworICAgICAgICAgICAgICAgIENoYXJTZXF1ZW5jZSBuZXh0ID0gZ2V0VGV4dChQUkVGRVJSRURfREVTQ1JJUFRJT05fT1JERVJba2V5SW5kZXgrK10pOworICAgICAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkobmV4dCkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gRmlsbCBpbiB0aGUgbmV4dCBlbXB0eSBiaXQgb2YgdGV4dAorICAgICAgICAgICAgICAgICAgICB0ZXh0W3RleHRJbmRleCsrXSA9IG5leHQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gR2V0IHRoZSBiZXN0IGFydCBiaXRtYXAgd2UgY2FuIGZpbmQKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBQUkVGRVJSRURfQklUTUFQX09SREVSLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBCaXRtYXAgbmV4dCA9IGdldEJpdG1hcChQUkVGRVJSRURfQklUTUFQX09SREVSW2ldKTsKKyAgICAgICAgICAgIGlmIChuZXh0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpY29uID0gbmV4dDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIEdldCB0aGUgYmVzdCBVcmkgd2UgY2FuIGZpbmQKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBQUkVGRVJSRURfVVJJX09SREVSLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBTdHJpbmcgbmV4dCA9IGdldFN0cmluZyhQUkVGRVJSRURfVVJJX09SREVSW2ldKTsKKyAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkobmV4dCkpIHsKKyAgICAgICAgICAgICAgICBpY29uVXJpID0gVXJpLnBhcnNlKG5leHQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgVXJpIG1lZGlhVXJpID0gbnVsbDsKKyAgICAgICAgU3RyaW5nIG1lZGlhVXJpU3RyID0gZ2V0U3RyaW5nKE1FVEFEQVRBX0tFWV9NRURJQV9VUkkpOworICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KG1lZGlhVXJpU3RyKSkgeworICAgICAgICAgICAgbWVkaWFVcmkgPSBVcmkucGFyc2UobWVkaWFVcmlTdHIpOworICAgICAgICB9CisKKyAgICAgICAgTWVkaWFEZXNjcmlwdGlvbi5CdWlsZGVyIGJvYiA9IG5ldyBNZWRpYURlc2NyaXB0aW9uLkJ1aWxkZXIoKTsKKyAgICAgICAgYm9iLnNldE1lZGlhSWQobWVkaWFJZCk7CisgICAgICAgIGJvYi5zZXRUaXRsZSh0ZXh0WzBdKTsKKyAgICAgICAgYm9iLnNldFN1YnRpdGxlKHRleHRbMV0pOworICAgICAgICBib2Iuc2V0RGVzY3JpcHRpb24odGV4dFsyXSk7CisgICAgICAgIGJvYi5zZXRJY29uQml0bWFwKGljb24pOworICAgICAgICBib2Iuc2V0SWNvblVyaShpY29uVXJpKTsKKyAgICAgICAgYm9iLnNldE1lZGlhVXJpKG1lZGlhVXJpKTsKKyAgICAgICAgaWYgKG1CdW5kbGUuY29udGFpbnNLZXkoTUVUQURBVEFfS0VZX0JUX0ZPTERFUl9UWVBFKSkgeworICAgICAgICAgICAgQnVuZGxlIGJ1bmRsZSA9IG5ldyBCdW5kbGUoKTsKKyAgICAgICAgICAgIGJ1bmRsZS5wdXRMb25nKE1lZGlhRGVzY3JpcHRpb24uRVhUUkFfQlRfRk9MREVSX1RZUEUsCisgICAgICAgICAgICAgICAgICAgIGdldExvbmcoTUVUQURBVEFfS0VZX0JUX0ZPTERFUl9UWVBFKSk7CisgICAgICAgICAgICBib2Iuc2V0RXh0cmFzKGJ1bmRsZSk7CisgICAgICAgIH0KKyAgICAgICAgbURlc2NyaXB0aW9uID0gYm9iLmJ1aWxkKCk7CisKKyAgICAgICAgcmV0dXJuIG1EZXNjcmlwdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBIZWxwZXIgZm9yIGdldHRpbmcgdGhlIFN0cmluZyBrZXkgdXNlZCBieSB7QGxpbmsgTWVkaWFNZXRhZGF0YX0gZnJvbSB0aGUKKyAgICAgKiBpbnRlZ2VyIGtleSB0aGF0IHtAbGluayBNZWRpYU1ldGFkYXRhRWRpdG9yfSB1c2VzLgorICAgICAqCisgICAgICogQHBhcmFtIGVkaXRvcktleSBUaGUga2V5IHVzZWQgYnkgdGhlIGVkaXRvcgorICAgICAqIEByZXR1cm4gVGhlIGtleSB1c2VkIGJ5IHRoaXMgY2xhc3Mgb3IgbnVsbCBpZiBubyBtYXBwaW5nIGV4aXN0cworICAgICAqIEBoaWRlCisgICAgICovCisgICAgQFVuc3VwcG9ydGVkQXBwVXNhZ2UKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRLZXlGcm9tTWV0YWRhdGFFZGl0b3JLZXkoaW50IGVkaXRvcktleSkgeworICAgICAgICByZXR1cm4gRURJVE9SX0tFWV9NQVBQSU5HLmdldChlZGl0b3JLZXksIG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUGFyY2VsYWJsZS5DcmVhdG9yPE1lZGlhTWV0YWRhdGE+IENSRUFUT1IgPQorICAgICAgICAgICAgbmV3IFBhcmNlbGFibGUuQ3JlYXRvcjxNZWRpYU1ldGFkYXRhPigpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgTWVkaWFNZXRhZGF0YSBjcmVhdGVGcm9tUGFyY2VsKFBhcmNlbCBpbikgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE1lZGlhTWV0YWRhdGEoaW4pOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBNZWRpYU1ldGFkYXRhW10gbmV3QXJyYXkoaW50IHNpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBNZWRpYU1ldGFkYXRhW3NpemVdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisKKyAgICAvKioKKyAgICAgKiBDb21wYXJlcyB0aGUgY29udGVudHMgb2YgdGhpcyBvYmplY3QgdG8gYW5vdGhlciBNZWRpYU1ldGFkYXRhIG9iamVjdC4gSXQKKyAgICAgKiBkb2VzIG5vdCBjb21wYXJlIEJpdG1hcHMgYW5kIFJhdGluZ3MgYXMgdGhlIG1lZGlhIHBsYXllciBjYW4gY2hvb3NlIHRvCisgICAgICogZm9yZ28gdGhlc2UgZmllbGRzIGRlcGVuZGluZyBvbiBob3cgeW91IHJldHJpZXZlIHRoZSBNZWRpYU1ldGFkYXRhLgorICAgICAqCisgICAgICogQHBhcmFtIG8gVGhlIE1ldGFkYXRhIG9iamVjdCB0byBjb21wYXJlIHRoaXMgb2JqZWN0IGFnYWluc3QKKyAgICAgKiBAcmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB0d28gb2JqZWN0cyBoYXZlIG1hdGNoaW5nIGZpZWxkcyAoZXhjbHVkaW5nCisgICAgICogQml0bWFwcyBhbmQgUmF0aW5ncykKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKKyAgICAgICAgaWYgKG8gPT0gdGhpcykgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIShvIGluc3RhbmNlb2YgTWVkaWFNZXRhZGF0YSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIE1lZGlhTWV0YWRhdGEgbSA9IChNZWRpYU1ldGFkYXRhKSBvOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUVUQURBVEFfS0VZU19UWVBFLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBTdHJpbmcga2V5ID0gTUVUQURBVEFfS0VZU19UWVBFLmtleUF0KGkpOworICAgICAgICAgICAgc3dpdGNoIChNRVRBREFUQV9LRVlTX1RZUEUudmFsdWVBdChpKSkgeworICAgICAgICAgICAgICAgIGNhc2UgTUVUQURBVEFfVFlQRV9URVhUOgorICAgICAgICAgICAgICAgICAgICBpZiAoIU9iamVjdHMuZXF1YWxzKGdldFN0cmluZyhrZXkpLCBtLmdldFN0cmluZyhrZXkpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgTUVUQURBVEFfVFlQRV9MT05HOgorICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0TG9uZyhrZXkpICE9IG0uZ2V0TG9uZyhrZXkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgLy8gSWdub3JlIHJhdGluZ3MgYW5kIGJpdG1hcHMgd2hlbiBjb21wYXJpbmcKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICBpbnQgaGFzaENvZGUgPSAxNzsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE1FVEFEQVRBX0tFWVNfVFlQRS5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgU3RyaW5nIGtleSA9IE1FVEFEQVRBX0tFWVNfVFlQRS5rZXlBdChpKTsKKyAgICAgICAgICAgIHN3aXRjaCAoTUVUQURBVEFfS0VZU19UWVBFLnZhbHVlQXQoaSkpIHsKKyAgICAgICAgICAgICAgICBjYXNlIE1FVEFEQVRBX1RZUEVfVEVYVDoKKyAgICAgICAgICAgICAgICAgICAgaGFzaENvZGUgPSAzMSAqIGhhc2hDb2RlICsgT2JqZWN0cy5oYXNoKGdldFN0cmluZyhrZXkpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBNRVRBREFUQV9UWVBFX0xPTkc6CisgICAgICAgICAgICAgICAgICAgIGhhc2hDb2RlID0gMzEgKiBoYXNoQ29kZSArIExvbmcuaGFzaENvZGUoZ2V0TG9uZyhrZXkpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgLy8gSWdub3JlIHJhdGluZ3MgYW5kIGJpdG1hcHMgd2hlbiBjb21wYXJpbmcKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gaGFzaENvZGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogVXNlIHRvIGJ1aWxkIE1lZGlhTWV0YWRhdGEgb2JqZWN0cy4gVGhlIHN5c3RlbSBkZWZpbmVkIG1ldGFkYXRhIGtleXMgbXVzdAorICAgICAqIHVzZSB0aGUgYXBwcm9wcmlhdGUgZGF0YSB0eXBlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQnVpbGRlciB7CisgICAgICAgIHByaXZhdGUgZmluYWwgQnVuZGxlIG1CdW5kbGU7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZSBhbiBlbXB0eSBCdWlsZGVyLiBBbnkgZmllbGQgdGhhdCBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlCisgICAgICAgICAqIHtAbGluayBNZWRpYU1ldGFkYXRhfSBtdXN0IGJlIGFkZGVkLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEJ1aWxkZXIoKSB7CisgICAgICAgICAgICBtQnVuZGxlID0gbmV3IEJ1bmRsZSgpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZSBhIEJ1aWxkZXIgdXNpbmcgYSB7QGxpbmsgTWVkaWFNZXRhZGF0YX0gaW5zdGFuY2UgdG8gc2V0IHRoZQorICAgICAgICAgKiBpbml0aWFsIHZhbHVlcy4gQWxsIGZpZWxkcyBpbiB0aGUgc291cmNlIG1ldGFkYXRhIHdpbGwgYmUgaW5jbHVkZWQgaW4KKyAgICAgICAgICogdGhlIG5ldyBtZXRhZGF0YS4gRmllbGRzIGNhbiBiZSBvdmVyd3JpdHRlbiBieSBhZGRpbmcgdGhlIHNhbWUga2V5LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gc291cmNlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlcihNZWRpYU1ldGFkYXRhIHNvdXJjZSkgeworICAgICAgICAgICAgbUJ1bmRsZSA9IG5ldyBCdW5kbGUoc291cmNlLm1CdW5kbGUpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZSBhIEJ1aWxkZXIgdXNpbmcgYSB7QGxpbmsgTWVkaWFNZXRhZGF0YX0gaW5zdGFuY2UgdG8gc2V0CisgICAgICAgICAqIGluaXRpYWwgdmFsdWVzLCBidXQgcmVwbGFjZSBiaXRtYXBzIHdpdGggYSBzY2FsZWQgZG93biBjb3B5IGlmIHRoZXkKKyAgICAgICAgICogYXJlIGxhcmdlciB0aGFuIG1heEJpdG1hcFNpemUuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBzb3VyY2UgVGhlIG9yaWdpbmFsIG1ldGFkYXRhIHRvIGNvcHkuCisgICAgICAgICAqIEBwYXJhbSBtYXhCaXRtYXBTaXplIFRoZSBtYXhpbXVtIGhlaWdodC93aWR0aCBmb3IgYml0bWFwcyBjb250YWluZWQKKyAgICAgICAgICogICAgICAgICAgICBpbiB0aGUgbWV0YWRhdGEuCisgICAgICAgICAqIEBoaWRlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlcihNZWRpYU1ldGFkYXRhIHNvdXJjZSwgaW50IG1heEJpdG1hcFNpemUpIHsKKyAgICAgICAgICAgIHRoaXMoc291cmNlKTsKKyAgICAgICAgICAgIGZvciAoU3RyaW5nIGtleSA6IG1CdW5kbGUua2V5U2V0KCkpIHsKKyAgICAgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBtQnVuZGxlLmdldChrZXkpOworICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsICYmIHZhbHVlIGluc3RhbmNlb2YgQml0bWFwKSB7CisgICAgICAgICAgICAgICAgICAgIEJpdG1hcCBibXAgPSAoQml0bWFwKSB2YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJtcC5nZXRIZWlnaHQoKSA+IG1heEJpdG1hcFNpemUgfHwgYm1wLmdldFdpZHRoKCkgPiBtYXhCaXRtYXBTaXplKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwdXRCaXRtYXAoa2V5LCBzY2FsZUJpdG1hcChibXAsIG1heEJpdG1hcFNpemUpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBQdXQgYSBDaGFyU2VxdWVuY2UgdmFsdWUgaW50byB0aGUgbWV0YWRhdGEuIEN1c3RvbSBrZXlzIG1heSBiZSB1c2VkLAorICAgICAgICAgKiBidXQgaWYgdGhlIE1FVEFEQVRBX0tFWXMgZGVmaW5lZCBpbiB0aGlzIGNsYXNzIGFyZSB1c2VkIHRoZXkgbWF5IG9ubHkKKyAgICAgICAgICogYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6CisgICAgICAgICAqIDx1bD4KKyAgICAgICAgICogPGxpPntAbGluayAjTUVUQURBVEFfS0VZX1RJVExFfTwvbGk+CisgICAgICAgICAqIDxsaT57QGxpbmsgI01FVEFEQVRBX0tFWV9BUlRJU1R9PC9saT4KKyAgICAgICAgICogPGxpPntAbGluayAjTUVUQURBVEFfS0VZX0FMQlVNfTwvbGk+CisgICAgICAgICAqIDxsaT57QGxpbmsgI01FVEFEQVRBX0tFWV9BVVRIT1J9PC9saT4KKyAgICAgICAgICogPGxpPntAbGluayAjTUVUQURBVEFfS0VZX1dSSVRFUn08L2xpPgorICAgICAgICAgKiA8bGk+e0BsaW5rICNNRVRBREFUQV9LRVlfQ09NUE9TRVJ9PC9saT4KKyAgICAgICAgICogPGxpPntAbGluayAjTUVUQURBVEFfS0VZX0RBVEV9PC9saT4KKyAgICAgICAgICogPGxpPntAbGluayAjTUVUQURBVEFfS0VZX0dFTlJFfTwvbGk+CisgICAgICAgICAqIDxsaT57QGxpbmsgI01FVEFEQVRBX0tFWV9BTEJVTV9BUlRJU1R9PC9saT4KKyAgICAgICAgICogPGxpPntAbGluayAjTUVUQURBVEFfS0VZX0FSVF9VUkl9PC9saT4KKyAgICAgICAgICogPGxpPntAbGluayAjTUVUQURBVEFfS0VZX0FMQlVNX0FSVF9VUkl9PC9saT4KKyAgICAgICAgICogPGxpPntAbGluayAjTUVUQURBVEFfS0VZX0RJU1BMQVlfVElUTEV9PC9saT4KKyAgICAgICAgICogPGxpPntAbGluayAjTUVUQURBVEFfS0VZX0RJU1BMQVlfU1VCVElUTEV9PC9saT4KKyAgICAgICAgICogPGxpPntAbGluayAjTUVUQURBVEFfS0VZX0RJU1BMQVlfREVTQ1JJUFRJT059PC9saT4KKyAgICAgICAgICogPGxpPntAbGluayAjTUVUQURBVEFfS0VZX0RJU1BMQVlfSUNPTl9VUkl9PC9saT4KKyAgICAgICAgICogPC91bD4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGtleSBUaGUga2V5IGZvciByZWZlcmVuY2luZyB0aGlzIHZhbHVlCisgICAgICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgQ2hhclNlcXVlbmNlIHZhbHVlIHRvIHN0b3JlCisgICAgICAgICAqIEByZXR1cm4gVGhlIEJ1aWxkZXIgdG8gYWxsb3cgY2hhaW5pbmcKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHB1dFRleHQoQFRleHRLZXkgU3RyaW5nIGtleSwgQ2hhclNlcXVlbmNlIHZhbHVlKSB7CisgICAgICAgICAgICBpZiAoTUVUQURBVEFfS0VZU19UWVBFLmNvbnRhaW5zS2V5KGtleSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoTUVUQURBVEFfS0VZU19UWVBFLmdldChrZXkpICE9IE1FVEFEQVRBX1RZUEVfVEVYVCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgIiArIGtleQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBrZXkgY2Fubm90IGJlIHVzZWQgdG8gcHV0IGEgQ2hhclNlcXVlbmNlIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbUJ1bmRsZS5wdXRDaGFyU2VxdWVuY2Uoa2V5LCB2YWx1ZSk7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBQdXQgYSBTdHJpbmcgdmFsdWUgaW50byB0aGUgbWV0YWRhdGEuIEN1c3RvbSBrZXlzIG1heSBiZSB1c2VkLCBidXQgaWYKKyAgICAgICAgICogdGhlIE1FVEFEQVRBX0tFWXMgZGVmaW5lZCBpbiB0aGlzIGNsYXNzIGFyZSB1c2VkIHRoZXkgbWF5IG9ubHkgYmUgb25lCisgICAgICAgICAqIG9mIHRoZSBmb2xsb3dpbmc6CisgICAgICAgICAqIDx1bD4KKyAgICAgICAgICogPGxpPntAbGluayAjTUVUQURBVEFfS0VZX1RJVExFfTwvbGk+CisgICAgICAgICAqIDxsaT57QGxpbmsgI01FVEFEQVRBX0tFWV9BUlRJU1R9PC9saT4KKyAgICAgICAgICogPGxpPntAbGluayAjTUVUQURBVEFfS0VZX0FMQlVNfTwvbGk+CisgICAgICAgICAqIDxsaT57QGxpbmsgI01FVEFEQVRBX0tFWV9BVVRIT1J9PC9saT4KKyAgICAgICAgICogPGxpPntAbGluayAjTUVUQURBVEFfS0VZX1dSSVRFUn08L2xpPgorICAgICAgICAgKiA8bGk+e0BsaW5rICNNRVRBREFUQV9LRVlfQ09NUE9TRVJ9PC9saT4KKyAgICAgICAgICogPGxpPntAbGluayAjTUVUQURBVEFfS0VZX0RBVEV9PC9saT4KKyAgICAgICAgICogPGxpPntAbGluayAjTUVUQURBVEFfS0VZX0dFTlJFfTwvbGk+CisgICAgICAgICAqIDxsaT57QGxpbmsgI01FVEFEQVRBX0tFWV9BTEJVTV9BUlRJU1R9PC9saT4KKyAgICAgICAgICogPGxpPntAbGluayAjTUVUQURBVEFfS0VZX0FSVF9VUkl9PC9saT4KKyAgICAgICAgICogPGxpPntAbGluayAjTUVUQURBVEFfS0VZX0FMQlVNX0FSVF9VUkl9PC9saT4KKyAgICAgICAgICogPGxpPntAbGluayAjTUVUQURBVEFfS0VZX0RJU1BMQVlfVElUTEV9PC9saT4KKyAgICAgICAgICogPGxpPntAbGluayAjTUVUQURBVEFfS0VZX0RJU1BMQVlfU1VCVElUTEV9PC9saT4KKyAgICAgICAgICogPGxpPntAbGluayAjTUVUQURBVEFfS0VZX0RJU1BMQVlfREVTQ1JJUFRJT059PC9saT4KKyAgICAgICAgICogPGxpPntAbGluayAjTUVUQURBVEFfS0VZX0RJU1BMQVlfSUNPTl9VUkl9PC9saT4KKyAgICAgICAgICogPC91bD4KKyAgICAgICAgICogPHA+CisgICAgICAgICAqIFVyaXMgZm9yIGFydHdvcmsgc2hvdWxkIHVzZSB0aGUgY29udGVudDovLyBzdHlsZSBhbmQgc3VwcG9ydAorICAgICAgICAgKiB7QGxpbmsgQ29udGVudFJlc29sdmVyI0VYVFJBX1NJWkV9IGZvciByZXRyaWV2aW5nIHNjYWxlZCBhcnR3b3JrCisgICAgICAgICAqIHRocm91Z2gge0BsaW5rIENvbnRlbnRSZXNvbHZlciNvcGVuVHlwZWRBc3NldEZpbGVEZXNjcmlwdG9yKFVyaSwKKyAgICAgICAgICogU3RyaW5nLCBCdW5kbGUpfS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGtleSBUaGUga2V5IGZvciByZWZlcmVuY2luZyB0aGlzIHZhbHVlCisgICAgICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgU3RyaW5nIHZhbHVlIHRvIHN0b3JlCisgICAgICAgICAqIEByZXR1cm4gVGhlIEJ1aWxkZXIgdG8gYWxsb3cgY2hhaW5pbmcKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHB1dFN0cmluZyhAVGV4dEtleSBTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgICAgIGlmIChNRVRBREFUQV9LRVlTX1RZUEUuY29udGFpbnNLZXkoa2V5KSkgeworICAgICAgICAgICAgICAgIGlmIChNRVRBREFUQV9LRVlTX1RZUEUuZ2V0KGtleSkgIT0gTUVUQURBVEFfVFlQRV9URVhUKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSAiICsga2V5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGtleSBjYW5ub3QgYmUgdXNlZCB0byBwdXQgYSBTdHJpbmciKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQnVuZGxlLnB1dENoYXJTZXF1ZW5jZShrZXksIHZhbHVlKTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFB1dCBhIGxvbmcgdmFsdWUgaW50byB0aGUgbWV0YWRhdGEuIEN1c3RvbSBrZXlzIG1heSBiZSB1c2VkLCBidXQgaWYKKyAgICAgICAgICogdGhlIE1FVEFEQVRBX0tFWXMgZGVmaW5lZCBpbiB0aGlzIGNsYXNzIGFyZSB1c2VkIHRoZXkgbWF5IG9ubHkgYmUgb25lCisgICAgICAgICAqIG9mIHRoZSBmb2xsb3dpbmc6CisgICAgICAgICAqIDx1bD4KKyAgICAgICAgICogPGxpPntAbGluayAjTUVUQURBVEFfS0VZX0RVUkFUSU9OfTwvbGk+CisgICAgICAgICAqIDxsaT57QGxpbmsgI01FVEFEQVRBX0tFWV9UUkFDS19OVU1CRVJ9PC9saT4KKyAgICAgICAgICogPGxpPntAbGluayAjTUVUQURBVEFfS0VZX05VTV9UUkFDS1N9PC9saT4KKyAgICAgICAgICogPGxpPntAbGluayAjTUVUQURBVEFfS0VZX0RJU0NfTlVNQkVSfTwvbGk+CisgICAgICAgICAqIDxsaT57QGxpbmsgI01FVEFEQVRBX0tFWV9ZRUFSfTwvbGk+CisgICAgICAgICAqIDwvdWw+CisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBrZXkgVGhlIGtleSBmb3IgcmVmZXJlbmNpbmcgdGhpcyB2YWx1ZQorICAgICAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIGxvbmcgdmFsdWUgdG8gc3RvcmUKKyAgICAgICAgICogQHJldHVybiBUaGUgQnVpbGRlciB0byBhbGxvdyBjaGFpbmluZworICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEJ1aWxkZXIgcHV0TG9uZyhATG9uZ0tleSBTdHJpbmcga2V5LCBsb25nIHZhbHVlKSB7CisgICAgICAgICAgICBpZiAoTUVUQURBVEFfS0VZU19UWVBFLmNvbnRhaW5zS2V5KGtleSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoTUVUQURBVEFfS0VZU19UWVBFLmdldChrZXkpICE9IE1FVEFEQVRBX1RZUEVfTE9ORykgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgIiArIGtleQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBrZXkgY2Fubm90IGJlIHVzZWQgdG8gcHV0IGEgbG9uZyIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1CdW5kbGUucHV0TG9uZyhrZXksIHZhbHVlKTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFB1dCBhIHtAbGluayBSYXRpbmd9IGludG8gdGhlIG1ldGFkYXRhLiBDdXN0b20ga2V5cyBtYXkgYmUgdXNlZCwgYnV0CisgICAgICAgICAqIGlmIHRoZSBNRVRBREFUQV9LRVlzIGRlZmluZWQgaW4gdGhpcyBjbGFzcyBhcmUgdXNlZCB0aGV5IG1heSBvbmx5IGJlCisgICAgICAgICAqIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorICAgICAgICAgKiA8dWw+CisgICAgICAgICAqIDxsaT57QGxpbmsgI01FVEFEQVRBX0tFWV9SQVRJTkd9PC9saT4KKyAgICAgICAgICogPGxpPntAbGluayAjTUVUQURBVEFfS0VZX1VTRVJfUkFUSU5HfTwvbGk+CisgICAgICAgICAqIDwvdWw+CisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBrZXkgVGhlIGtleSBmb3IgcmVmZXJlbmNpbmcgdGhpcyB2YWx1ZQorICAgICAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIFJhdGluZyB2YWx1ZSB0byBzdG9yZQorICAgICAgICAgKiBAcmV0dXJuIFRoZSBCdWlsZGVyIHRvIGFsbG93IGNoYWluaW5nCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlciBwdXRSYXRpbmcoQFJhdGluZ0tleSBTdHJpbmcga2V5LCBSYXRpbmcgdmFsdWUpIHsKKyAgICAgICAgICAgIGlmIChNRVRBREFUQV9LRVlTX1RZUEUuY29udGFpbnNLZXkoa2V5KSkgeworICAgICAgICAgICAgICAgIGlmIChNRVRBREFUQV9LRVlTX1RZUEUuZ2V0KGtleSkgIT0gTUVUQURBVEFfVFlQRV9SQVRJTkcpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlICIgKyBrZXkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIga2V5IGNhbm5vdCBiZSB1c2VkIHRvIHB1dCBhIFJhdGluZyIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1CdW5kbGUucHV0UGFyY2VsYWJsZShrZXksIHZhbHVlKTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFB1dCBhIHtAbGluayBCaXRtYXB9IGludG8gdGhlIG1ldGFkYXRhLiBDdXN0b20ga2V5cyBtYXkgYmUgdXNlZCwgYnV0CisgICAgICAgICAqIGlmIHRoZSBNRVRBREFUQV9LRVlzIGRlZmluZWQgaW4gdGhpcyBjbGFzcyBhcmUgdXNlZCB0aGV5IG1heSBvbmx5IGJlCisgICAgICAgICAqIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorICAgICAgICAgKiA8dWw+CisgICAgICAgICAqIDxsaT57QGxpbmsgI01FVEFEQVRBX0tFWV9BUlR9PC9saT4KKyAgICAgICAgICogPGxpPntAbGluayAjTUVUQURBVEFfS0VZX0FMQlVNX0FSVH08L2xpPgorICAgICAgICAgKiA8bGk+e0BsaW5rICNNRVRBREFUQV9LRVlfRElTUExBWV9JQ09OfTwvbGk+CisgICAgICAgICAqIDwvdWw+CisgICAgICAgICAqIDxwPgorICAgICAgICAgKiBMYXJnZSBiaXRtYXBzIG1heSBiZSBzY2FsZWQgZG93biBieSB0aGUgc3lzdGVtIHdoZW4KKyAgICAgICAgICoge0BsaW5rIGFuZHJvaWQubWVkaWEuc2Vzc2lvbi5NZWRpYVNlc3Npb24jc2V0TWV0YWRhdGF9IGlzIGNhbGxlZC4KKyAgICAgICAgICogVG8gcGFzcyBmdWxsIHJlc29sdXRpb24gaW1hZ2VzIHtAbGluayBVcmkgVXJpc30gc2hvdWxkIGJlIHVzZWQgd2l0aAorICAgICAgICAgKiB7QGxpbmsgI3B1dFN0cmluZ30uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBrZXkgVGhlIGtleSBmb3IgcmVmZXJlbmNpbmcgdGhpcyB2YWx1ZQorICAgICAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIEJpdG1hcCB0byBzdG9yZQorICAgICAgICAgKiBAcmV0dXJuIFRoZSBCdWlsZGVyIHRvIGFsbG93IGNoYWluaW5nCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlciBwdXRCaXRtYXAoQEJpdG1hcEtleSBTdHJpbmcga2V5LCBCaXRtYXAgdmFsdWUpIHsKKyAgICAgICAgICAgIGlmIChNRVRBREFUQV9LRVlTX1RZUEUuY29udGFpbnNLZXkoa2V5KSkgeworICAgICAgICAgICAgICAgIGlmIChNRVRBREFUQV9LRVlTX1RZUEUuZ2V0KGtleSkgIT0gTUVUQURBVEFfVFlQRV9CSVRNQVApIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlICIgKyBrZXkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIga2V5IGNhbm5vdCBiZSB1c2VkIHRvIHB1dCBhIEJpdG1hcCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1CdW5kbGUucHV0UGFyY2VsYWJsZShrZXksIHZhbHVlKTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZXMgYSB7QGxpbmsgTWVkaWFNZXRhZGF0YX0gaW5zdGFuY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIGZpZWxkcy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBUaGUgbmV3IE1lZGlhTWV0YWRhdGEgaW5zdGFuY2UKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBNZWRpYU1ldGFkYXRhIGJ1aWxkKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBNZWRpYU1ldGFkYXRhKG1CdW5kbGUpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBCaXRtYXAgc2NhbGVCaXRtYXAoQml0bWFwIGJtcCwgaW50IG1heFNpemUpIHsKKyAgICAgICAgICAgIGZsb2F0IG1heFNpemVGID0gbWF4U2l6ZTsKKyAgICAgICAgICAgIGZsb2F0IHdpZHRoU2NhbGUgPSBtYXhTaXplRiAvIGJtcC5nZXRXaWR0aCgpOworICAgICAgICAgICAgZmxvYXQgaGVpZ2h0U2NhbGUgPSBtYXhTaXplRiAvIGJtcC5nZXRIZWlnaHQoKTsKKyAgICAgICAgICAgIGZsb2F0IHNjYWxlID0gTWF0aC5taW4od2lkdGhTY2FsZSwgaGVpZ2h0U2NhbGUpOworICAgICAgICAgICAgaW50IGhlaWdodCA9IChpbnQpIChibXAuZ2V0SGVpZ2h0KCkgKiBzY2FsZSk7CisgICAgICAgICAgICBpbnQgd2lkdGggPSAoaW50KSAoYm1wLmdldFdpZHRoKCkgKiBzY2FsZSk7CisgICAgICAgICAgICByZXR1cm4gQml0bWFwLmNyZWF0ZVNjYWxlZEJpdG1hcChibXAsIHdpZHRoLCBoZWlnaHQsIHRydWUpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL2FwZXgvamF2YS9hbmRyb2lkL21lZGlhL01lZGlhVXRpbHMuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9hcGV4L2phdmEvYW5kcm9pZC9tZWRpYS9NZWRpYVV0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGYwY2IwMAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9hcGV4L2phdmEvYW5kcm9pZC9tZWRpYS9NZWRpYVV0aWxzLmphdmEKQEAgLTAsMCArMSwzNCBAQAorcGFja2FnZSBhbmRyb2lkLm1lZGlhOworCitpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OworCisvKioKKyAqIEBoaWRlCisgKi8KK3B1YmxpYyBjbGFzcyBNZWRpYVV0aWxzIHsKKworICAgIC8qKgorICAgICAqIEFkanVzdGluZyB0aGUgdm9sdW1lIGR1ZSB0byBhIGhhcmR3YXJlIGtleSBwcmVzcy4KKyAgICAgKiAoQ29waWVkIHZlcnNpb24gb2YgaGlkZGVuIEF1ZGlvTWFuYWdlci5GTEFHX0ZST01fS0VZKQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFVRElPX01BTkFHRVJfRkxBR19GUk9NX0tFWSA9IDEgPDwgMTI7CisKKyAgICAvLyBLZWVwIHN5bmMgd2l0aCBLZXlFdmVudCNpc01lZGlhS2V5KCkuCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzTWVkaWFLZXkoaW50IGtleUNvZGUpIHsKKyAgICAgICAgc3dpdGNoIChrZXlDb2RlKSB7CisgICAgICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfTUVESUFfUExBWToKKyAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuS0VZQ09ERV9NRURJQV9QQVVTRToKKyAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuS0VZQ09ERV9NRURJQV9QTEFZX1BBVVNFOgorICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFX01VVEU6CisgICAgICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfSEVBRFNFVEhPT0s6CisgICAgICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfTUVESUFfU1RPUDoKKyAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuS0VZQ09ERV9NRURJQV9ORVhUOgorICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFX01FRElBX1BSRVZJT1VTOgorICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFX01FRElBX1JFV0lORDoKKyAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuS0VZQ09ERV9NRURJQV9SRUNPUkQ6CisgICAgICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfTUVESUFfRkFTVF9GT1JXQVJEOgorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvYXBleC9qYXZhL2FuZHJvaWQvbWVkaWEvUmF0aW5nLmFpZGwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvYXBleC9qYXZhL2FuZHJvaWQvbWVkaWEvUmF0aW5nLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWRjMzM2YQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9hcGV4L2phdmEvYW5kcm9pZC9tZWRpYS9SYXRpbmcuYWlkbApAQCAtMCwwICsxLDE5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhOworCitwYXJjZWxhYmxlIFJhdGluZzsKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9hcGV4L2phdmEvYW5kcm9pZC9tZWRpYS9SYXRpbmcuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9hcGV4L2phdmEvYW5kcm9pZC9tZWRpYS9SYXRpbmcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGQ1MzY0Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL2FwZXgvamF2YS9hbmRyb2lkL21lZGlhL1JhdGluZy5qYXZhCkBAIC0wLDAgKzEsMzA4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhOworCitpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLkludERlZjsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7CisKKy8qKgorICogQSBjbGFzcyB0byBlbmNhcHN1bGF0ZSByYXRpbmcgaW5mb3JtYXRpb24gdXNlZCBhcyBjb250ZW50IG1ldGFkYXRhLgorICogQSByYXRpbmcgaXMgZGVmaW5lZCBieSBpdHMgcmF0aW5nIHN0eWxlIChzZWUge0BsaW5rICNSQVRJTkdfSEVBUlR9LAorICoge0BsaW5rICNSQVRJTkdfVEhVTUJfVVBfRE9XTn0sIHtAbGluayAjUkFUSU5HXzNfU1RBUlN9LCB7QGxpbmsgI1JBVElOR180X1NUQVJTfSwKKyAqIHtAbGluayAjUkFUSU5HXzVfU1RBUlN9IG9yIHtAbGluayAjUkFUSU5HX1BFUkNFTlRBR0V9KSBhbmQgdGhlIGFjdHVhbCByYXRpbmcgdmFsdWUgKHdoaWNoIG1heQorICogYmUgZGVmaW5lZCBhcyAidW5yYXRlZCIpLCBib3RoIG9mIHdoaWNoIGFyZSBkZWZpbmVkIHdoZW4gdGhlIHJhdGluZyBpbnN0YW5jZSBpcyBjb25zdHJ1Y3RlZAorICogdGhyb3VnaCBvbmUgb2YgdGhlIGZhY3RvcnkgbWV0aG9kcy4KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFJhdGluZyBpbXBsZW1lbnRzIFBhcmNlbGFibGUgeworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBUQUcgPSAiUmF0aW5nIjsKKworICAgIC8qKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgQEludERlZih7UkFUSU5HX05PTkUsIFJBVElOR19IRUFSVCwgUkFUSU5HX1RIVU1CX1VQX0RPV04sIFJBVElOR18zX1NUQVJTLCBSQVRJTkdfNF9TVEFSUywKKyAgICAgICAgICAgIFJBVElOR181X1NUQVJTLCBSQVRJTkdfUEVSQ0VOVEFHRX0pCisgICAgQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuU09VUkNFKQorICAgIHB1YmxpYyBAaW50ZXJmYWNlIFN0eWxlIHt9CisKKyAgICAvKioKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIEBJbnREZWYoe1JBVElOR18zX1NUQVJTLCBSQVRJTkdfNF9TVEFSUywgUkFUSU5HXzVfU1RBUlN9KQorICAgIEBSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlNPVVJDRSkKKyAgICBwdWJsaWMgQGludGVyZmFjZSBTdGFyU3R5bGUge30KKworICAgIC8qKgorICAgICAqIEluZGljYXRlcyBhIHJhdGluZyBzdHlsZSBpcyBub3Qgc3VwcG9ydGVkLiBBIFJhdGluZyB3aWxsIG5ldmVyIGhhdmUgdGhpcworICAgICAqIHR5cGUsIGJ1dCBjYW4gYmUgdXNlZCBieSBvdGhlciBjbGFzc2VzIHRvIGluZGljYXRlIHRoZXkgZG8gbm90IHN1cHBvcnQKKyAgICAgKiBSYXRpbmcuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgUkFUSU5HX05PTkUgPSAwOworCisgICAgLyoqCisgICAgICogQSByYXRpbmcgc3R5bGUgd2l0aCBhIHNpbmdsZSBkZWdyZWUgb2YgcmF0aW5nLCAiaGVhcnQiIHZzICJubyBoZWFydCIuIENhbiBiZSB1c2VkIHRvCisgICAgICogaW5kaWNhdGUgdGhlIGNvbnRlbnQgcmVmZXJyZWQgdG8gaXMgYSBmYXZvcml0ZSAob3Igbm90KS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBSQVRJTkdfSEVBUlQgPSAxOworCisgICAgLyoqCisgICAgICogQSByYXRpbmcgc3R5bGUgZm9yICJ0aHVtYiB1cCIgdnMgInRodW1iIGRvd24iLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFJBVElOR19USFVNQl9VUF9ET1dOID0gMjsKKworICAgIC8qKgorICAgICAqIEEgcmF0aW5nIHN0eWxlIHdpdGggMCB0byAzIHN0YXJzLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFJBVElOR18zX1NUQVJTID0gMzsKKworICAgIC8qKgorICAgICAqIEEgcmF0aW5nIHN0eWxlIHdpdGggMCB0byA0IHN0YXJzLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFJBVElOR180X1NUQVJTID0gNDsKKworICAgIC8qKgorICAgICAqIEEgcmF0aW5nIHN0eWxlIHdpdGggMCB0byA1IHN0YXJzLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFJBVElOR181X1NUQVJTID0gNTsKKworICAgIC8qKgorICAgICAqIEEgcmF0aW5nIHN0eWxlIGV4cHJlc3NlZCBhcyBhIHBlcmNlbnRhZ2UuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgUkFUSU5HX1BFUkNFTlRBR0UgPSA2OworCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgZmxvYXQgUkFUSU5HX05PVF9SQVRFRCA9IC0xLjBmOworCisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbVJhdGluZ1N0eWxlOworCisgICAgcHJpdmF0ZSBmaW5hbCBmbG9hdCBtUmF0aW5nVmFsdWU7CisKKyAgICBwcml2YXRlIFJhdGluZyhAU3R5bGUgaW50IHJhdGluZ1N0eWxlLCBmbG9hdCByYXRpbmcpIHsKKyAgICAgICAgbVJhdGluZ1N0eWxlID0gcmF0aW5nU3R5bGU7CisgICAgICAgIG1SYXRpbmdWYWx1ZSA9IHJhdGluZzsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gIlJhdGluZzpzdHlsZT0iICsgbVJhdGluZ1N0eWxlICsgIiByYXRpbmc9IgorICAgICAgICAgICAgICAgICsgKG1SYXRpbmdWYWx1ZSA8IDAuMGYgPyAidW5yYXRlZCIgOiBTdHJpbmcudmFsdWVPZihtUmF0aW5nVmFsdWUpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGRlc2NyaWJlQ29udGVudHMoKSB7CisgICAgICAgIHJldHVybiBtUmF0aW5nU3R5bGU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgd3JpdGVUb1BhcmNlbChQYXJjZWwgZGVzdCwgaW50IGZsYWdzKSB7CisgICAgICAgIGRlc3Qud3JpdGVJbnQobVJhdGluZ1N0eWxlKTsKKyAgICAgICAgZGVzdC53cml0ZUZsb2F0KG1SYXRpbmdWYWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBQYXJjZWxhYmxlLkNyZWF0b3I8UmF0aW5nPiBDUkVBVE9SCisgICAgICAgICAgICA9IG5ldyBQYXJjZWxhYmxlLkNyZWF0b3I8UmF0aW5nPigpIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlYnVpbGRzIGEgUmF0aW5nIHByZXZpb3VzbHkgc3RvcmVkIHdpdGggd3JpdGVUb1BhcmNlbCgpLgorICAgICAgICAgKiBAcGFyYW0gcCAgICBQYXJjZWwgb2JqZWN0IHRvIHJlYWQgdGhlIFJhdGluZyBmcm9tCisgICAgICAgICAqIEByZXR1cm4gYSBuZXcgUmF0aW5nIGNyZWF0ZWQgZnJvbSB0aGUgZGF0YSBpbiB0aGUgcGFyY2VsCisgICAgICAgICAqLworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFJhdGluZyBjcmVhdGVGcm9tUGFyY2VsKFBhcmNlbCBwKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFJhdGluZyhwLnJlYWRJbnQoKSwgcC5yZWFkRmxvYXQoKSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFJhdGluZ1tdIG5ld0FycmF5KGludCBzaXplKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFJhdGluZ1tzaXplXTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBSYXRpbmcgaW5zdGFuY2Ugd2l0aCBubyByYXRpbmcuCisgICAgICogQ3JlYXRlIGFuZCByZXR1cm4gYSBuZXcgUmF0aW5nIGluc3RhbmNlIHdpdGggbm8gcmF0aW5nIGtub3duIGZvciB0aGUgZ2l2ZW4KKyAgICAgKiByYXRpbmcgc3R5bGUuCisgICAgICogQHBhcmFtIHJhdGluZ1N0eWxlIG9uZSBvZiB7QGxpbmsgI1JBVElOR19IRUFSVH0sIHtAbGluayAjUkFUSU5HX1RIVU1CX1VQX0RPV059LAorICAgICAqICAgIHtAbGluayAjUkFUSU5HXzNfU1RBUlN9LCB7QGxpbmsgI1JBVElOR180X1NUQVJTfSwge0BsaW5rICNSQVRJTkdfNV9TVEFSU30sCisgICAgICogICAgb3Ige0BsaW5rICNSQVRJTkdfUEVSQ0VOVEFHRX0uCisgICAgICogQHJldHVybiBudWxsIGlmIGFuIGludmFsaWQgcmF0aW5nIHN0eWxlIGlzIHBhc3NlZCwgYSBuZXcgUmF0aW5nIGluc3RhbmNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFJhdGluZyBuZXdVbnJhdGVkUmF0aW5nKEBTdHlsZSBpbnQgcmF0aW5nU3R5bGUpIHsKKyAgICAgICAgc3dpdGNoKHJhdGluZ1N0eWxlKSB7CisgICAgICAgICAgICBjYXNlIFJBVElOR19IRUFSVDoKKyAgICAgICAgICAgIGNhc2UgUkFUSU5HX1RIVU1CX1VQX0RPV046CisgICAgICAgICAgICBjYXNlIFJBVElOR18zX1NUQVJTOgorICAgICAgICAgICAgY2FzZSBSQVRJTkdfNF9TVEFSUzoKKyAgICAgICAgICAgIGNhc2UgUkFUSU5HXzVfU1RBUlM6CisgICAgICAgICAgICBjYXNlIFJBVElOR19QRVJDRU5UQUdFOgorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmF0aW5nKHJhdGluZ1N0eWxlLCBSQVRJTkdfTk9UX1JBVEVEKTsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBSYXRpbmcgaW5zdGFuY2Ugd2l0aCBhIGhlYXJ0LWJhc2VkIHJhdGluZy4KKyAgICAgKiBDcmVhdGUgYW5kIHJldHVybiBhIG5ldyBSYXRpbmcgaW5zdGFuY2Ugd2l0aCBhIHJhdGluZyBzdHlsZSBvZiB7QGxpbmsgI1JBVElOR19IRUFSVH0sCisgICAgICogYW5kIGEgaGVhcnQtYmFzZWQgcmF0aW5nLgorICAgICAqIEBwYXJhbSBoYXNIZWFydCB0cnVlIGZvciBhICJoZWFydCBzZWxlY3RlZCIgcmF0aW5nLCBmYWxzZSBmb3IgImhlYXJ0IHVuc2VsZWN0ZWQiLgorICAgICAqIEByZXR1cm4gYSBuZXcgUmF0aW5nIGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgUmF0aW5nIG5ld0hlYXJ0UmF0aW5nKGJvb2xlYW4gaGFzSGVhcnQpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSYXRpbmcoUkFUSU5HX0hFQVJULCBoYXNIZWFydCA/IDEuMGYgOiAwLjBmKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBSYXRpbmcgaW5zdGFuY2Ugd2l0aCBhIHRodW1iLWJhc2VkIHJhdGluZy4KKyAgICAgKiBDcmVhdGUgYW5kIHJldHVybiBhIG5ldyBSYXRpbmcgaW5zdGFuY2Ugd2l0aCBhIHtAbGluayAjUkFUSU5HX1RIVU1CX1VQX0RPV059CisgICAgICogcmF0aW5nIHN0eWxlLCBhbmQgYSAidGh1bWIgdXAiIG9yICJ0aHVtYiBkb3duIiByYXRpbmcuCisgICAgICogQHBhcmFtIHRodW1iSXNVcCB0cnVlIGZvciBhICJ0aHVtYiB1cCIgcmF0aW5nLCBmYWxzZSBmb3IgInRodW1iIGRvd24iLgorICAgICAqIEByZXR1cm4gYSBuZXcgUmF0aW5nIGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgUmF0aW5nIG5ld1RodW1iUmF0aW5nKGJvb2xlYW4gdGh1bWJJc1VwKSB7CisgICAgICAgIHJldHVybiBuZXcgUmF0aW5nKFJBVElOR19USFVNQl9VUF9ET1dOLCB0aHVtYklzVXAgPyAxLjBmIDogMC4wZik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgUmF0aW5nIGluc3RhbmNlIHdpdGggYSBzdGFyLWJhc2VkIHJhdGluZy4KKyAgICAgKiBDcmVhdGUgYW5kIHJldHVybiBhIG5ldyBSYXRpbmcgaW5zdGFuY2Ugd2l0aCBvbmUgb2YgdGhlIHN0YXItYmFzZSByYXRpbmcgc3R5bGVzCisgICAgICogYW5kIHRoZSBnaXZlbiBpbnRlZ2VyIG9yIGZyYWN0aW9uYWwgbnVtYmVyIG9mIHN0YXJzLiBOb24gaW50ZWdlciB2YWx1ZXMgY2FuIGZvciBpbnN0YW5jZQorICAgICAqIGJlIHVzZWQgdG8gcmVwcmVzZW50IGFuIGF2ZXJhZ2UgcmF0aW5nIHZhbHVlLCB3aGljaCBtaWdodCBub3QgYmUgYW4gaW50ZWdlciBudW1iZXIgb2Ygc3RhcnMuCisgICAgICogQHBhcmFtIHN0YXJSYXRpbmdTdHlsZSBvbmUgb2Yge0BsaW5rICNSQVRJTkdfM19TVEFSU30sIHtAbGluayAjUkFUSU5HXzRfU1RBUlN9LAorICAgICAqICAgICB7QGxpbmsgI1JBVElOR181X1NUQVJTfS4KKyAgICAgKiBAcGFyYW0gc3RhclJhdGluZyBhIG51bWJlciByYW5naW5nIGZyb20gMC4wZiB0byAzLjBmLCA0LjBmIG9yIDUuMGYgYWNjb3JkaW5nIHRvCisgICAgICogICAgIHRoZSByYXRpbmcgc3R5bGUuCisgICAgICogQHJldHVybiBudWxsIGlmIHRoZSByYXRpbmcgc3R5bGUgaXMgaW52YWxpZCwgb3IgdGhlIHJhdGluZyBpcyBvdXQgb2YgcmFuZ2UsCisgICAgICogICAgIGEgbmV3IFJhdGluZyBpbnN0YW5jZSBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBSYXRpbmcgbmV3U3RhclJhdGluZyhAU3RhclN0eWxlIGludCBzdGFyUmF0aW5nU3R5bGUsIGZsb2F0IHN0YXJSYXRpbmcpIHsKKyAgICAgICAgZmxvYXQgbWF4UmF0aW5nID0gLTEuMGY7CisgICAgICAgIHN3aXRjaChzdGFyUmF0aW5nU3R5bGUpIHsKKyAgICAgICAgICAgIGNhc2UgUkFUSU5HXzNfU1RBUlM6CisgICAgICAgICAgICAgICAgbWF4UmF0aW5nID0gMy4wZjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUkFUSU5HXzRfU1RBUlM6CisgICAgICAgICAgICAgICAgbWF4UmF0aW5nID0gNC4wZjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUkFUSU5HXzVfU1RBUlM6CisgICAgICAgICAgICAgICAgbWF4UmF0aW5nID0gNS4wZjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiSW52YWxpZCByYXRpbmcgc3R5bGUgKCIgKyBzdGFyUmF0aW5nU3R5bGUgKyAiKSBmb3IgYSBzdGFyIHJhdGluZyIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChzdGFyUmF0aW5nIDwgMC4wZikgfHwgKHN0YXJSYXRpbmcgPiBtYXhSYXRpbmcpKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJUcnlpbmcgdG8gc2V0IG91dCBvZiByYW5nZSBzdGFyLWJhc2VkIHJhdGluZyIpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBSYXRpbmcoc3RhclJhdGluZ1N0eWxlLCBzdGFyUmF0aW5nKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBSYXRpbmcgaW5zdGFuY2Ugd2l0aCBhIHBlcmNlbnRhZ2UtYmFzZWQgcmF0aW5nLgorICAgICAqIENyZWF0ZSBhbmQgcmV0dXJuIGEgbmV3IFJhdGluZyBpbnN0YW5jZSB3aXRoIGEge0BsaW5rICNSQVRJTkdfUEVSQ0VOVEFHRX0KKyAgICAgKiByYXRpbmcgc3R5bGUsIGFuZCBhIHJhdGluZyBvZiB0aGUgZ2l2ZW4gcGVyY2VudGFnZS4KKyAgICAgKiBAcGFyYW0gcGVyY2VudCB0aGUgdmFsdWUgb2YgdGhlIHJhdGluZworICAgICAqIEByZXR1cm4gbnVsbCBpZiB0aGUgcmF0aW5nIGlzIG91dCBvZiByYW5nZSwgYSBuZXcgUmF0aW5nIGluc3RhbmNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFJhdGluZyBuZXdQZXJjZW50YWdlUmF0aW5nKGZsb2F0IHBlcmNlbnQpIHsKKyAgICAgICAgaWYgKChwZXJjZW50IDwgMC4wZikgfHwgKHBlcmNlbnQgPiAxMDAuMGYpKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJJbnZhbGlkIHBlcmNlbnRhZ2UtYmFzZWQgcmF0aW5nIHZhbHVlIik7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgUmF0aW5nKFJBVElOR19QRVJDRU5UQUdFLCBwZXJjZW50KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB3aGV0aGVyIHRoZXJlIGlzIGEgcmF0aW5nIHZhbHVlIGF2YWlsYWJsZS4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGluc3RhbmNlIHdhcyBub3QgY3JlYXRlZCB3aXRoIHtAbGluayAjbmV3VW5yYXRlZFJhdGluZyhpbnQpfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1JhdGVkKCkgeworICAgICAgICByZXR1cm4gbVJhdGluZ1ZhbHVlID49IDAuMGY7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSByYXRpbmcgc3R5bGUuCisgICAgICogQHJldHVybiBvbmUgb2Yge0BsaW5rICNSQVRJTkdfSEVBUlR9LCB7QGxpbmsgI1JBVElOR19USFVNQl9VUF9ET1dOfSwKKyAgICAgKiAgICB7QGxpbmsgI1JBVElOR18zX1NUQVJTfSwge0BsaW5rICNSQVRJTkdfNF9TVEFSU30sIHtAbGluayAjUkFUSU5HXzVfU1RBUlN9LAorICAgICAqICAgIG9yIHtAbGluayAjUkFUSU5HX1BFUkNFTlRBR0V9LgorICAgICAqLworICAgIEBTdHlsZQorICAgIHB1YmxpYyBpbnQgZ2V0UmF0aW5nU3R5bGUoKSB7CisgICAgICAgIHJldHVybiBtUmF0aW5nU3R5bGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHdoZXRoZXIgdGhlIHJhdGluZyBpcyAiaGVhcnQgc2VsZWN0ZWQiLgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcmF0aW5nIGlzICJoZWFydCBzZWxlY3RlZCIsIGZhbHNlIGlmIHRoZSByYXRpbmcgaXMgImhlYXJ0IHVuc2VsZWN0ZWQiLAorICAgICAqICAgIGlmIHRoZSByYXRpbmcgc3R5bGUgaXMgbm90IHtAbGluayAjUkFUSU5HX0hFQVJUfSBvciBpZiBpdCBpcyB1bnJhdGVkLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGhhc0hlYXJ0KCkgeworICAgICAgICBpZiAobVJhdGluZ1N0eWxlICE9IFJBVElOR19IRUFSVCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIChtUmF0aW5nVmFsdWUgPT0gMS4wZik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gd2hldGhlciB0aGUgcmF0aW5nIGlzICJ0aHVtYiB1cCIuCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSByYXRpbmcgaXMgInRodW1iIHVwIiwgZmFsc2UgaWYgdGhlIHJhdGluZyBpcyAidGh1bWIgZG93biIsCisgICAgICogICAgaWYgdGhlIHJhdGluZyBzdHlsZSBpcyBub3Qge0BsaW5rICNSQVRJTkdfVEhVTUJfVVBfRE9XTn0gb3IgaWYgaXQgaXMgdW5yYXRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1RodW1iVXAoKSB7CisgICAgICAgIGlmIChtUmF0aW5nU3R5bGUgIT0gUkFUSU5HX1RIVU1CX1VQX0RPV04pIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiAobVJhdGluZ1ZhbHVlID09IDEuMGYpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzdGFyLWJhc2VkIHJhdGluZyB2YWx1ZS4KKyAgICAgKiBAcmV0dXJuIGEgcmF0aW5nIHZhbHVlIGdyZWF0ZXIgb3IgZXF1YWwgdG8gMC4wZiwgb3IgYSBuZWdhdGl2ZSB2YWx1ZSBpZiB0aGUgcmF0aW5nIHN0eWxlIGlzCisgICAgICogICAgbm90IHN0YXItYmFzZWQsIG9yIGlmIGl0IGlzIHVucmF0ZWQuCisgICAgICovCisgICAgcHVibGljIGZsb2F0IGdldFN0YXJSYXRpbmcoKSB7CisgICAgICAgIHN3aXRjaCAobVJhdGluZ1N0eWxlKSB7CisgICAgICAgICAgICBjYXNlIFJBVElOR18zX1NUQVJTOgorICAgICAgICAgICAgY2FzZSBSQVRJTkdfNF9TVEFSUzoKKyAgICAgICAgICAgIGNhc2UgUkFUSU5HXzVfU1RBUlM6CisgICAgICAgICAgICAgICAgaWYgKGlzUmF0ZWQoKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbVJhdGluZ1ZhbHVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xLjBmOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBwZXJjZW50YWdlLWJhc2VkIHJhdGluZyB2YWx1ZS4KKyAgICAgKiBAcmV0dXJuIGEgcmF0aW5nIHZhbHVlIGdyZWF0ZXIgb3IgZXF1YWwgdG8gMC4wZiwgb3IgYSBuZWdhdGl2ZSB2YWx1ZSBpZiB0aGUgcmF0aW5nIHN0eWxlIGlzCisgICAgICogICAgbm90IHBlcmNlbnRhZ2UtYmFzZWQsIG9yIGlmIGl0IGlzIHVucmF0ZWQuCisgICAgICovCisgICAgcHVibGljIGZsb2F0IGdldFBlcmNlbnRSYXRpbmcoKSB7CisgICAgICAgIGlmICgobVJhdGluZ1N0eWxlICE9IFJBVElOR19QRVJDRU5UQUdFKSB8fCAhaXNSYXRlZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gLTEuMGY7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gbVJhdGluZ1ZhbHVlOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL2FwZXgvamF2YS9hbmRyb2lkL21lZGlhL1ZvbHVtZVByb3ZpZGVyLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvYXBleC9qYXZhL2FuZHJvaWQvbWVkaWEvVm9sdW1lUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzAxN2M1Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL2FwZXgvamF2YS9hbmRyb2lkL21lZGlhL1ZvbHVtZVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwxNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBhbmRyb2lkLm1lZGlhOworCitpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLkludERlZjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLnNlc3Npb24uTWVkaWFTZXNzaW9uOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKKworLyoqCisgKiBIYW5kbGVzIHJlcXVlc3RzIHRvIGFkanVzdCBvciBzZXQgdGhlIHZvbHVtZSBvbiBhIHNlc3Npb24uIFRoaXMgaXMgYWxzbyB1c2VkCisgKiB0byBwdXNoIHZvbHVtZSB1cGRhdGVzIGJhY2sgdG8gdGhlIHNlc3Npb24uIFRoZSBwcm92aWRlciBtdXN0IGNhbGwKKyAqIHtAbGluayAjc2V0Q3VycmVudFZvbHVtZShpbnQpfSBlYWNoIHRpbWUgdGhlIHZvbHVtZSBiZWluZyBwcm92aWRlZCBjaGFuZ2VzLgorICogPHA+CisgKiBZb3UgY2FuIHNldCBhIHZvbHVtZSBwcm92aWRlciBvbiBhIHNlc3Npb24gYnkgY2FsbGluZworICoge0BsaW5rIE1lZGlhU2Vzc2lvbiNzZXRQbGF5YmFja1RvUmVtb3RlfS4KKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFZvbHVtZVByb3ZpZGVyIHsKKworICAgIC8qKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgQEludERlZih7Vk9MVU1FX0NPTlRST0xfRklYRUQsIFZPTFVNRV9DT05UUk9MX1JFTEFUSVZFLCBWT0xVTUVfQ09OVFJPTF9BQlNPTFVURX0pCisgICAgQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuU09VUkNFKQorICAgIHB1YmxpYyBAaW50ZXJmYWNlIENvbnRyb2xUeXBlIHt9CisKKyAgICAvKioKKyAgICAgKiBUaGUgdm9sdW1lIGlzIGZpeGVkIGFuZCBjYW4gbm90IGJlIG1vZGlmaWVkLiBSZXF1ZXN0cyB0byBjaGFuZ2Ugdm9sdW1lCisgICAgICogc2hvdWxkIGJlIGlnbm9yZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVk9MVU1FX0NPTlRST0xfRklYRUQgPSAwOworCisgICAgLyoqCisgICAgICogVGhlIHZvbHVtZSBjb250cm9sIHVzZXMgcmVsYXRpdmUgYWRqdXN0bWVudCB2aWEKKyAgICAgKiB7QGxpbmsgI29uQWRqdXN0Vm9sdW1lKGludCl9LiBBdHRlbXB0cyB0byBzZXQgdGhlIHZvbHVtZSB0byBhIHNwZWNpZmljCisgICAgICogdmFsdWUgc2hvdWxkIGJlIGlnbm9yZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVk9MVU1FX0NPTlRST0xfUkVMQVRJVkUgPSAxOworCisgICAgLyoqCisgICAgICogVGhlIHZvbHVtZSBjb250cm9sIHVzZXMgYW4gYWJzb2x1dGUgdmFsdWUuIEl0IG1heSBiZSBhZGp1c3RlZCB1c2luZworICAgICAqIHtAbGluayAjb25BZGp1c3RWb2x1bWUoaW50KX0gb3Igc2V0IGRpcmVjdGx5IHVzaW5nCisgICAgICoge0BsaW5rICNvblNldFZvbHVtZVRvKGludCl9LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZPTFVNRV9DT05UUk9MX0FCU09MVVRFID0gMjsKKworICAgIHByaXZhdGUgZmluYWwgaW50IG1Db250cm9sVHlwZTsKKyAgICBwcml2YXRlIGZpbmFsIGludCBtTWF4Vm9sdW1lOworICAgIHByaXZhdGUgaW50IG1DdXJyZW50Vm9sdW1lOworICAgIHByaXZhdGUgQ2FsbGJhY2sgbUNhbGxiYWNrOworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IHZvbHVtZSBwcm92aWRlciBmb3IgaGFuZGxpbmcgdm9sdW1lIGV2ZW50cy4gWW91IG11c3Qgc3BlY2lmeQorICAgICAqIHRoZSB0eXBlIG9mIHZvbHVtZSBjb250cm9sLCB0aGUgbWF4aW11bSB2b2x1bWUgdGhhdCBjYW4gYmUgdXNlZCwgYW5kIHRoZQorICAgICAqIGN1cnJlbnQgdm9sdW1lIG9uIHRoZSBvdXRwdXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdm9sdW1lQ29udHJvbCBUaGUgbWV0aG9kIGZvciBjb250cm9sbGluZyB2b2x1bWUgdGhhdCBpcyB1c2VkIGJ5CisgICAgICogICAgICAgICAgICB0aGlzIHByb3ZpZGVyLgorICAgICAqIEBwYXJhbSBtYXhWb2x1bWUgVGhlIG1heGltdW0gYWxsb3dlZCB2b2x1bWUuCisgICAgICogQHBhcmFtIGN1cnJlbnRWb2x1bWUgVGhlIGN1cnJlbnQgdm9sdW1lIG9uIHRoZSBvdXRwdXQuCisgICAgICovCisgICAgcHVibGljIFZvbHVtZVByb3ZpZGVyKEBDb250cm9sVHlwZSBpbnQgdm9sdW1lQ29udHJvbCwgaW50IG1heFZvbHVtZSwgaW50IGN1cnJlbnRWb2x1bWUpIHsKKyAgICAgICAgbUNvbnRyb2xUeXBlID0gdm9sdW1lQ29udHJvbDsKKyAgICAgICAgbU1heFZvbHVtZSA9IG1heFZvbHVtZTsKKyAgICAgICAgbUN1cnJlbnRWb2x1bWUgPSBjdXJyZW50Vm9sdW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgdm9sdW1lIGNvbnRyb2wgdHlwZSB0aGF0IHRoaXMgdm9sdW1lIHByb3ZpZGVyIHVzZXMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSB2b2x1bWUgY29udHJvbCB0eXBlIGZvciB0aGlzIHZvbHVtZSBwcm92aWRlcgorICAgICAqLworICAgIEBDb250cm9sVHlwZQorICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0Vm9sdW1lQ29udHJvbCgpIHsKKyAgICAgICAgcmV0dXJuIG1Db250cm9sVHlwZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIG1heGltdW0gdm9sdW1lIHRoaXMgcHJvdmlkZXIgYWxsb3dzLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgbWF4IGFsbG93ZWQgdm9sdW1lLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0TWF4Vm9sdW1lKCkgeworICAgICAgICByZXR1cm4gbU1heFZvbHVtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBjdXJyZW50IHZvbHVtZS4gVGhpcyB3aWxsIGJlIHRoZSBsYXN0IHZhbHVlIHNldCBieQorICAgICAqIHtAbGluayAjc2V0Q3VycmVudFZvbHVtZShpbnQpfS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIGN1cnJlbnQgdm9sdW1lLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0Q3VycmVudFZvbHVtZSgpIHsKKyAgICAgICAgcmV0dXJuIG1DdXJyZW50Vm9sdW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIE5vdGlmeSB0aGUgc3lzdGVtIHRoYXQgdGhlIGN1cnJlbnQgdm9sdW1lIGhhcyBiZWVuIGNoYW5nZWQuIFRoaXMgbXVzdCBiZQorICAgICAqIGNhbGxlZCBldmVyeSB0aW1lIHRoZSB2b2x1bWUgY2hhbmdlcyB0byBlbnN1cmUgaXQgaXMgZGlzcGxheWVkIHByb3Blcmx5LgorICAgICAqCisgICAgICogQHBhcmFtIGN1cnJlbnRWb2x1bWUgVGhlIGN1cnJlbnQgdm9sdW1lIG9uIHRoZSBvdXRwdXQuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIHZvaWQgc2V0Q3VycmVudFZvbHVtZShpbnQgY3VycmVudFZvbHVtZSkgeworICAgICAgICBtQ3VycmVudFZvbHVtZSA9IGN1cnJlbnRWb2x1bWU7CisgICAgICAgIGlmIChtQ2FsbGJhY2sgIT0gbnVsbCkgeworICAgICAgICAgICAgbUNhbGxiYWNrLm9uVm9sdW1lQ2hhbmdlZCh0aGlzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIE92ZXJyaWRlIHRvIGhhbmRsZSByZXF1ZXN0cyB0byBzZXQgdGhlIHZvbHVtZSBvZiB0aGUgY3VycmVudCBvdXRwdXQuCisgICAgICogQWZ0ZXIgdGhlIHZvbHVtZSBoYXMgYmVlbiBtb2RpZmllZCB7QGxpbmsgI3NldEN1cnJlbnRWb2x1bWV9IG11c3QgYmUKKyAgICAgKiBjYWxsZWQgdG8gbm90aWZ5IHRoZSBzeXN0ZW0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gdm9sdW1lIFRoZSB2b2x1bWUgdG8gc2V0IHRoZSBvdXRwdXQgdG8uCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25TZXRWb2x1bWVUbyhpbnQgdm9sdW1lKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogT3ZlcnJpZGUgdG8gaGFuZGxlIHJlcXVlc3RzIHRvIGFkanVzdCB0aGUgdm9sdW1lIG9mIHRoZSBjdXJyZW50IG91dHB1dC4KKyAgICAgKiBEaXJlY3Rpb24gd2lsbCBiZSBvbmUgb2Yge0BsaW5rIEF1ZGlvTWFuYWdlciNBREpVU1RfTE9XRVJ9LAorICAgICAqIHtAbGluayBBdWRpb01hbmFnZXIjQURKVVNUX1JBSVNFfSwge0BsaW5rIEF1ZGlvTWFuYWdlciNBREpVU1RfU0FNRX0uCisgICAgICogQWZ0ZXIgdGhlIHZvbHVtZSBoYXMgYmVlbiBtb2RpZmllZCB7QGxpbmsgI3NldEN1cnJlbnRWb2x1bWV9IG11c3QgYmUKKyAgICAgKiBjYWxsZWQgdG8gbm90aWZ5IHRoZSBzeXN0ZW0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGlyZWN0aW9uIFRoZSBkaXJlY3Rpb24gdG8gY2hhbmdlIHRoZSB2b2x1bWUgaW4uCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25BZGp1c3RWb2x1bWUoaW50IGRpcmVjdGlvbikgeworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgYSBjYWxsYmFjayB0byByZWNlaXZlIHZvbHVtZSBjaGFuZ2VzLgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2FsbGJhY2soQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgbUNhbGxiYWNrID0gY2FsbGJhY2s7CisgICAgfQorCisgICAgLyoqCisgICAgICogTGlzdGVucyBmb3IgY2hhbmdlcyB0byB0aGUgdm9sdW1lLgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBDYWxsYmFjayB7CisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIG9uVm9sdW1lQ2hhbmdlZChWb2x1bWVQcm92aWRlciB2b2x1bWVQcm92aWRlcik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL2FwZXgvamF2YS9hbmRyb2lkL21lZGlhL2Jyb3dzZS9NZWRpYUJyb3dzZXIuYWlkbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9hcGV4L2phdmEvYW5kcm9pZC9tZWRpYS9icm93c2UvTWVkaWFCcm93c2VyLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzgyZTA5NAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9hcGV4L2phdmEvYW5kcm9pZC9tZWRpYS9icm93c2UvTWVkaWFCcm93c2VyLmFpZGwKQEAgLTAsMCArMSwxOCBAQAorLyogQ29weXJpZ2h0IDIwMTQsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYS5icm93c2U7CisKK3BhcmNlbGFibGUgTWVkaWFCcm93c2VyLk1lZGlhSXRlbTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvYXBleC9qYXZhL2FuZHJvaWQvbWVkaWEvYnJvd3NlL01lZGlhQnJvd3Nlci5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL2FwZXgvamF2YS9hbmRyb2lkL21lZGlhL2Jyb3dzZS9NZWRpYUJyb3dzZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTA5MWFkCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL2FwZXgvamF2YS9hbmRyb2lkL21lZGlhL2Jyb3dzZS9NZWRpYUJyb3dzZXIuamF2YQpAQCAtMCwwICsxLDExNzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWEuYnJvd3NlOworCitpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLkludERlZjsKK2ltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTm9uTnVsbDsKK2ltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTnVsbGFibGU7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuU2VydmljZUNvbm5lY3Rpb247CisvL2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFyY2VsZWRMaXN0U2xpY2U7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYURlc2NyaXB0aW9uOworaW1wb3J0IGFuZHJvaWQubWVkaWEuc2Vzc2lvbi5NZWRpYUNvbnRyb2xsZXI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5zZXNzaW9uLk1lZGlhU2Vzc2lvbjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJpbmRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsYWJsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlc3VsdFJlY2VpdmVyOworaW1wb3J0IGFuZHJvaWQuc2VydmljZS5tZWRpYS5JTWVkaWFCcm93c2VyU2VydmljZTsKK2ltcG9ydCBhbmRyb2lkLnNlcnZpY2UubWVkaWEuSU1lZGlhQnJvd3NlclNlcnZpY2VDYWxsYmFja3M7CitpbXBvcnQgYW5kcm9pZC5zZXJ2aWNlLm1lZGlhLk1lZGlhQnJvd3NlclNlcnZpY2U7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXJyYXlNYXA7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7CitpbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKKworLyoqCisgKiBCcm93c2VzIG1lZGlhIGNvbnRlbnQgb2ZmZXJlZCBieSBhIGxpbmsgTWVkaWFCcm93c2VyU2VydmljZS4KKyAqIDxwPgorICogVGhpcyBvYmplY3QgaXMgbm90IHRocmVhZC1zYWZlLiBBbGwgY2FsbHMgc2hvdWxkIGhhcHBlbiBvbiB0aGUgdGhyZWFkIG9uIHdoaWNoIHRoZSBicm93c2VyCisgKiB3YXMgY29uc3RydWN0ZWQuCisgKiA8L3A+CisgKiA8aDM+U3RhbmRhcmQgRXh0cmEgRGF0YTwvaDM+CisgKgorICogPHA+VGhlc2UgYXJlIHRoZSBjdXJyZW50IHN0YW5kYXJkIGZpZWxkcyB0aGF0IGNhbiBiZSB1c2VkIGFzIGV4dHJhIGRhdGEgdmlhCisgKiB7QGxpbmsgI3N1YnNjcmliZShTdHJpbmcsIEJ1bmRsZSwgU3Vic2NyaXB0aW9uQ2FsbGJhY2spfSwKKyAqIHtAbGluayAjdW5zdWJzY3JpYmUoU3RyaW5nLCBTdWJzY3JpcHRpb25DYWxsYmFjayl9LCBhbmQKKyAqIHtAbGluayBTdWJzY3JpcHRpb25DYWxsYmFjayNvbkNoaWxkcmVuTG9hZGVkKFN0cmluZywgTGlzdCwgQnVuZGxlKX0uCisgKgorICogPHVsPgorICogICAgIDxsaT4ge0BsaW5rICNFWFRSQV9QQUdFfQorICogICAgIDxsaT4ge0BsaW5rICNFWFRSQV9QQUdFX1NJWkV9CisgKiA8L3VsPgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgTWVkaWFCcm93c2VyIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk1lZGlhQnJvd3NlciI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBEQkcgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIFVzZWQgYXMgYW4gaW50IGV4dHJhIGZpZWxkIHRvIGRlbm90ZSB0aGUgcGFnZSBudW1iZXIgdG8gc3Vic2NyaWJlLgorICAgICAqIFRoZSB2YWx1ZSBvZiB7QGNvZGUgRVhUUkFfUEFHRX0gc2hvdWxkIGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAwLgorICAgICAqCisgICAgICogQHNlZSAjRVhUUkFfUEFHRV9TSVpFCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfUEFHRSA9ICJhbmRyb2lkLm1lZGlhLmJyb3dzZS5leHRyYS5QQUdFIjsKKworICAgIC8qKgorICAgICAqIFVzZWQgYXMgYW4gaW50IGV4dHJhIGZpZWxkIHRvIGRlbm90ZSB0aGUgbnVtYmVyIG9mIG1lZGlhIGl0ZW1zIGluIGEgcGFnZS4KKyAgICAgKiBUaGUgdmFsdWUgb2Yge0Bjb2RlIEVYVFJBX1BBR0VfU0laRX0gc2hvdWxkIGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAxLgorICAgICAqCisgICAgICogQHNlZSAjRVhUUkFfUEFHRQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1BBR0VfU0laRSA9ICJhbmRyb2lkLm1lZGlhLmJyb3dzZS5leHRyYS5QQUdFX1NJWkUiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENPTk5FQ1RfU1RBVEVfRElTQ09OTkVDVElORyA9IDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENPTk5FQ1RfU1RBVEVfRElTQ09OTkVDVEVEID0gMTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09OTkVDVF9TVEFURV9DT05ORUNUSU5HID0gMjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09OTkVDVF9TVEFURV9DT05ORUNURUQgPSAzOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDT05ORUNUX1NUQVRFX1NVU1BFTkRFRCA9IDQ7CisKKyAgICBwcml2YXRlIGZpbmFsIENvbnRleHQgbUNvbnRleHQ7CisgICAgcHJpdmF0ZSBmaW5hbCBDb21wb25lbnROYW1lIG1TZXJ2aWNlQ29tcG9uZW50OworICAgIHByaXZhdGUgZmluYWwgQ29ubmVjdGlvbkNhbGxiYWNrIG1DYWxsYmFjazsKKyAgICBwcml2YXRlIGZpbmFsIEJ1bmRsZSBtUm9vdEhpbnRzOworICAgIHByaXZhdGUgZmluYWwgSGFuZGxlciBtSGFuZGxlciA9IG5ldyBIYW5kbGVyKCk7CisgICAgcHJpdmF0ZSBmaW5hbCBBcnJheU1hcDxTdHJpbmcsIFN1YnNjcmlwdGlvbj4gbVN1YnNjcmlwdGlvbnMgPSBuZXcgQXJyYXlNYXA8PigpOworCisgICAgcHJpdmF0ZSB2b2xhdGlsZSBpbnQgbVN0YXRlID0gQ09OTkVDVF9TVEFURV9ESVNDT05ORUNURUQ7CisgICAgcHJpdmF0ZSB2b2xhdGlsZSBTdHJpbmcgbVJvb3RJZDsKKyAgICBwcml2YXRlIHZvbGF0aWxlIE1lZGlhU2Vzc2lvbi5Ub2tlbiBtTWVkaWFTZXNzaW9uVG9rZW47CisgICAgcHJpdmF0ZSB2b2xhdGlsZSBCdW5kbGUgbUV4dHJhczsKKworICAgIHByaXZhdGUgTWVkaWFTZXJ2aWNlQ29ubmVjdGlvbiBtU2VydmljZUNvbm5lY3Rpb247CisgICAgcHJpdmF0ZSBJTWVkaWFCcm93c2VyU2VydmljZSBtU2VydmljZUJpbmRlcjsKKyAgICBwcml2YXRlIElNZWRpYUJyb3dzZXJTZXJ2aWNlQ2FsbGJhY2tzIG1TZXJ2aWNlQ2FsbGJhY2tzOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG1lZGlhIGJyb3dzZXIgZm9yIHRoZSBzcGVjaWZpZWQgbWVkaWEgYnJvd3NlciBzZXJ2aWNlLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQuCisgICAgICogQHBhcmFtIHNlcnZpY2VDb21wb25lbnQgVGhlIGNvbXBvbmVudCBuYW1lIG9mIHRoZSBtZWRpYSBicm93c2VyIHNlcnZpY2UuCisgICAgICogQHBhcmFtIGNhbGxiYWNrIFRoZSBjb25uZWN0aW9uIGNhbGxiYWNrLgorICAgICAqIEBwYXJhbSByb290SGludHMgQW4gb3B0aW9uYWwgYnVuZGxlIG9mIHNlcnZpY2Utc3BlY2lmaWMgYXJndW1lbnRzIHRvIHNlbmQKKyAgICAgKiB0byB0aGUgbWVkaWEgYnJvd3NlciBzZXJ2aWNlIHdoZW4gY29ubmVjdGluZyBhbmQgcmV0cmlldmluZyB0aGUgcm9vdCBpZAorICAgICAqIGZvciBicm93c2luZywgb3IgbnVsbCBpZiBub25lLiBUaGUgY29udGVudHMgb2YgdGhpcyBidW5kbGUgbWF5IGFmZmVjdAorICAgICAqIHRoZSBpbmZvcm1hdGlvbiByZXR1cm5lZCB3aGVuIGJyb3dzaW5nLgorICAgICAqIEBzZWUgYW5kcm9pZC5zZXJ2aWNlLm1lZGlhLk1lZGlhQnJvd3NlclNlcnZpY2UuQnJvd3NlclJvb3QjRVhUUkFfUkVDRU5UCisgICAgICogQHNlZSBhbmRyb2lkLnNlcnZpY2UubWVkaWEuTWVkaWFCcm93c2VyU2VydmljZS5Ccm93c2VyUm9vdCNFWFRSQV9PRkZMSU5FCisgICAgICogQHNlZSBhbmRyb2lkLnNlcnZpY2UubWVkaWEuTWVkaWFCcm93c2VyU2VydmljZS5Ccm93c2VyUm9vdCNFWFRSQV9TVUdHRVNURUQKKyAgICAgKi8KKyAgICBwdWJsaWMgTWVkaWFCcm93c2VyKENvbnRleHQgY29udGV4dCwgQ29tcG9uZW50TmFtZSBzZXJ2aWNlQ29tcG9uZW50LAorICAgICAgICAgICAgQ29ubmVjdGlvbkNhbGxiYWNrIGNhbGxiYWNrLCBCdW5kbGUgcm9vdEhpbnRzKSB7CisgICAgICAgIGlmIChjb250ZXh0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNvbnRleHQgbXVzdCBub3QgYmUgbnVsbCIpOworICAgICAgICB9CisgICAgICAgIGlmIChzZXJ2aWNlQ29tcG9uZW50ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInNlcnZpY2UgY29tcG9uZW50IG11c3Qgbm90IGJlIG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY2FsbGJhY2sgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY29ubmVjdGlvbiBjYWxsYmFjayBtdXN0IG5vdCBiZSBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OworICAgICAgICBtU2VydmljZUNvbXBvbmVudCA9IHNlcnZpY2VDb21wb25lbnQ7CisgICAgICAgIG1DYWxsYmFjayA9IGNhbGxiYWNrOworICAgICAgICBtUm9vdEhpbnRzID0gcm9vdEhpbnRzID09IG51bGwgPyBudWxsIDogbmV3IEJ1bmRsZShyb290SGludHMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbm5lY3RzIHRvIHRoZSBtZWRpYSBicm93c2VyIHNlcnZpY2UuCisgICAgICogPHA+CisgICAgICogVGhlIGNvbm5lY3Rpb24gY2FsbGJhY2sgc3BlY2lmaWVkIGluIHRoZSBjb25zdHJ1Y3RvciB3aWxsIGJlIGludm9rZWQKKyAgICAgKiB3aGVuIHRoZSBjb25uZWN0aW9uIGNvbXBsZXRlcyBvciBmYWlscy4KKyAgICAgKiA8L3A+CisgICAgICovCisgICAgcHVibGljIHZvaWQgY29ubmVjdCgpIHsKKyAgICAgICAgaWYgKG1TdGF0ZSAhPSBDT05ORUNUX1NUQVRFX0RJU0NPTk5FQ1RJTkcgJiYgbVN0YXRlICE9IENPTk5FQ1RfU1RBVEVfRElTQ09OTkVDVEVEKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJjb25uZWN0KCkgY2FsbGVkIHdoaWxlIG5laXRoZXIgZGlzY29ubmVjdGluZyBub3IgIgorICAgICAgICAgICAgICAgICAgICArICJkaXNjb25uZWN0ZWQgKHN0YXRlPSIgKyBnZXRTdGF0ZUxhYmVsKG1TdGF0ZSkgKyAiKSIpOworICAgICAgICB9CisKKyAgICAgICAgbVN0YXRlID0gQ09OTkVDVF9TVEFURV9DT05ORUNUSU5HOworICAgICAgICBtSGFuZGxlci5wb3N0KG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIGlmIChtU3RhdGUgPT0gQ09OTkVDVF9TVEFURV9ESVNDT05ORUNUSU5HKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbVN0YXRlID0gQ09OTkVDVF9TVEFURV9DT05ORUNUSU5HOworICAgICAgICAgICAgICAgIC8vIFRPRE86IHJlbW92ZSB0aGlzIGV4dHJhIGNoZWNrLgorICAgICAgICAgICAgICAgIGlmIChEQkcpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1TZXJ2aWNlQ29ubmVjdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigibVNlcnZpY2VDb25uZWN0aW9uIHNob3VsZCBiZSBudWxsLiBJbnN0ZWFkIGl0IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgaXMgIiArIG1TZXJ2aWNlQ29ubmVjdGlvbik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1TZXJ2aWNlQmluZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIm1TZXJ2aWNlQmluZGVyIHNob3VsZCBiZSBudWxsLiBJbnN0ZWFkIGl0IGlzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1TZXJ2aWNlQmluZGVyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1TZXJ2aWNlQ2FsbGJhY2tzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIm1TZXJ2aWNlQ2FsbGJhY2tzIHNob3VsZCBiZSBudWxsLiBJbnN0ZWFkIGl0IGlzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1TZXJ2aWNlQ2FsbGJhY2tzKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmaW5hbCBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChNZWRpYUJyb3dzZXJTZXJ2aWNlLlNFUlZJQ0VfSU5URVJGQUNFKTsKKyAgICAgICAgICAgICAgICBpbnRlbnQuc2V0Q29tcG9uZW50KG1TZXJ2aWNlQ29tcG9uZW50KTsKKworICAgICAgICAgICAgICAgIG1TZXJ2aWNlQ29ubmVjdGlvbiA9IG5ldyBNZWRpYVNlcnZpY2VDb25uZWN0aW9uKCk7CisKKyAgICAgICAgICAgICAgICBib29sZWFuIGJvdW5kID0gZmFsc2U7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgYm91bmQgPSBtQ29udGV4dC5iaW5kU2VydmljZShpbnRlbnQsIG1TZXJ2aWNlQ29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZXh0LkJJTkRfQVVUT19DUkVBVEUpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJGYWlsZWQgYmluZGluZyB0byBzZXJ2aWNlICIgKyBtU2VydmljZUNvbXBvbmVudCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFib3VuZCkgeworICAgICAgICAgICAgICAgICAgICAvLyBUZWxsIHRoZW0gdGhhdCBpdCBkaWRuJ3Qgd29yay4KKyAgICAgICAgICAgICAgICAgICAgZm9yY2VDbG9zZUNvbm5lY3Rpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrLm9uQ29ubmVjdGlvbkZhaWxlZCgpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChEQkcpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiY29ubmVjdC4uLiIpOworICAgICAgICAgICAgICAgICAgICBkdW1wKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEaXNjb25uZWN0cyBmcm9tIHRoZSBtZWRpYSBicm93c2VyIHNlcnZpY2UuCisgICAgICogQWZ0ZXIgdGhpcywgbm8gbW9yZSBjYWxsYmFja3Mgd2lsbCBiZSByZWNlaXZlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkaXNjb25uZWN0KCkgeworICAgICAgICAvLyBJdCdzIG9rIHRvIGNhbGwgdGhpcyBhbnkgc3RhdGUsIGJlY2F1c2UgYWxsb3dpbmcgdGhpcyBsZXRzIGFwcHMgbm90IGhhdmUKKyAgICAgICAgLy8gdG8gY2hlY2sgaXNDb25uZWN0ZWQoKSB1bm5lY2Vzc2FyaWx5LiBUaGV5IHdvbid0IGFwcHJlY2lhdGUgdGhlIGV4dHJhCisgICAgICAgIC8vIGFzc2VydGlvbnMgZm9yIHRoaXMuIFdlIGRvIGV2ZXJ5dGhpbmcgd2UgY2FuIGhlcmUgdG8gZ28gYmFjayB0byBhIHNhbmUgc3RhdGUuCisgICAgICAgIG1TdGF0ZSA9IENPTk5FQ1RfU1RBVEVfRElTQ09OTkVDVElORzsKKyAgICAgICAgbUhhbmRsZXIucG9zdChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAvLyBjb25uZWN0KCkgY291bGQgYmUgY2FsbGVkIGJlZm9yZSB0aGlzLiBUaGVuIHdlIHdpbGwgZGlzY29ubmVjdCBhbmQgcmVjb25uZWN0LgorICAgICAgICAgICAgICAgIGlmIChtU2VydmljZUNhbGxiYWNrcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtU2VydmljZUJpbmRlci5kaXNjb25uZWN0KG1TZXJ2aWNlQ2FsbGJhY2tzKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBhcmUgZGlzY29ubmVjdGluZyBhbnl3YXkuIExvZywganVzdCBmb3IgcG9zdGVyaXR5IGJ1dCBpdCdzIG5vdAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gYSBiaWcgcHJvYmxlbS4KKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIlJlbW90ZUV4Y2VwdGlvbiBkdXJpbmcgY29ubmVjdCBmb3IgIiArIG1TZXJ2aWNlQ29tcG9uZW50KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbnQgc3RhdGUgPSBtU3RhdGU7CisgICAgICAgICAgICAgICAgZm9yY2VDbG9zZUNvbm5lY3Rpb24oKTsKKyAgICAgICAgICAgICAgICAvLyBJZiB0aGUgc3RhdGUgd2FzIG5vdCBDT05ORUNUX1NUQVRFX0RJU0NPTk5FQ1RJTkcsIGtlZXAgdGhlIHN0YXRlIHNvIHRoYXQKKyAgICAgICAgICAgICAgICAvLyB0aGUgb3BlcmF0aW9uIGNhbWUgYWZ0ZXIgZGlzY29ubmVjdCgpIGNhbiBiZSBoYW5kbGVkIHByb3Blcmx5LgorICAgICAgICAgICAgICAgIGlmIChzdGF0ZSAhPSBDT05ORUNUX1NUQVRFX0RJU0NPTk5FQ1RJTkcpIHsKKyAgICAgICAgICAgICAgICAgICAgbVN0YXRlID0gc3RhdGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChEQkcpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiZGlzY29ubmVjdC4uLiIpOworICAgICAgICAgICAgICAgICAgICBkdW1wKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBOdWxsIG91dCB0aGUgdmFyaWFibGVzIGFuZCB1bmJpbmQgZnJvbSB0aGUgc2VydmljZS4gVGhpcyBkb2Vzbid0IGluY2x1ZGUKKyAgICAgKiBjYWxsaW5nIGRpc2Nvbm5lY3Qgb24gdGhlIHNlcnZpY2UsIGJlY2F1c2Ugd2Ugb25seSB0cnkgdG8gZG8gdGhhdCBpbiB0aGUKKyAgICAgKiBjbGVhbiBzaHV0ZG93biBjYXNlcy4KKyAgICAgKiA8cD4KKyAgICAgKiBFdmVyeXdoZXJlIHRoYXQgY2FsbHMgdGhpcyBFWENFUFQgZm9yIGRpc2Nvbm5lY3QoKSBzaG91bGQgZm9sbG93IGl0IHdpdGgKKyAgICAgKiBhIGNhbGwgdG8gbUNhbGxiYWNrLm9uQ29ubmVjdGlvbkZhaWxlZCgpLiBEaXNjb25uZWN0IGRvZXNuJ3QgZG8gdGhhdCBjYWxsYmFjaworICAgICAqIGZvciBhIGNsZWFuIHNodXRkb3duLCBidXQgZXZlcnl3aGVyZSBlbHNlIGlzIGEgZGlydHkgc2h1dGRvd24gYW5kIHNob3VsZAorICAgICAqIG5vdGlmeSB0aGUgYXBwLgorICAgICAqIDxwPgorICAgICAqIEFsc28sIG1TdGF0ZSBzaG91bGQgYmUgdXBkYXRlZCBwcm9wZXJseS4gTW9zdGx5IGl0IHNob3VsZCBiZSBDT05ORUNUX1NUQVRFX0RJQUNPTk5FQ1RFRAorICAgICAqIGV4Y2VwdCBmb3IgZGlzY29ubmVjdCgpLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBmb3JjZUNsb3NlQ29ubmVjdGlvbigpIHsKKyAgICAgICAgaWYgKG1TZXJ2aWNlQ29ubmVjdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1Db250ZXh0LnVuYmluZFNlcnZpY2UobVNlcnZpY2VDb25uZWN0aW9uKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgaWYgKERCRykgeworICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJ1bmJpbmRTZXJ2aWNlIGZhaWxlZCIsIGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtU3RhdGUgPSBDT05ORUNUX1NUQVRFX0RJU0NPTk5FQ1RFRDsKKyAgICAgICAgbVNlcnZpY2VDb25uZWN0aW9uID0gbnVsbDsKKyAgICAgICAgbVNlcnZpY2VCaW5kZXIgPSBudWxsOworICAgICAgICBtU2VydmljZUNhbGxiYWNrcyA9IG51bGw7CisgICAgICAgIG1Sb290SWQgPSBudWxsOworICAgICAgICBtTWVkaWFTZXNzaW9uVG9rZW4gPSBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgYnJvd3NlciBpcyBjb25uZWN0ZWQgdG8gdGhlIHNlcnZpY2UuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNDb25uZWN0ZWQoKSB7CisgICAgICAgIHJldHVybiBtU3RhdGUgPT0gQ09OTkVDVF9TVEFURV9DT05ORUNURUQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgc2VydmljZSBjb21wb25lbnQgdGhhdCB0aGUgbWVkaWEgYnJvd3NlciBpcyBjb25uZWN0ZWQgdG8uCisgICAgICovCisgICAgcHVibGljIEBOb25OdWxsIENvbXBvbmVudE5hbWUgZ2V0U2VydmljZUNvbXBvbmVudCgpIHsKKyAgICAgICAgaWYgKCFpc0Nvbm5lY3RlZCgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJnZXRTZXJ2aWNlQ29tcG9uZW50KCkgY2FsbGVkIHdoaWxlIG5vdCBjb25uZWN0ZWQiICsKKyAgICAgICAgICAgICAgICAgICAgIiAoc3RhdGU9IiArIG1TdGF0ZSArICIpIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1TZXJ2aWNlQ29tcG9uZW50OworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHJvb3QgaWQuCisgICAgICogPHA+CisgICAgICogTm90ZSB0aGF0IHRoZSByb290IGlkIG1heSBiZWNvbWUgaW52YWxpZCBvciBjaGFuZ2Ugd2hlbiB0aGUKKyAgICAgKiBicm93c2VyIGlzIGRpc2Nvbm5lY3RlZC4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiBub3QgY29ubmVjdGVkLgorICAgICAqLworICAgIHB1YmxpYyBATm9uTnVsbCBTdHJpbmcgZ2V0Um9vdCgpIHsKKyAgICAgICAgaWYgKCFpc0Nvbm5lY3RlZCgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJnZXRSb290KCkgY2FsbGVkIHdoaWxlIG5vdCBjb25uZWN0ZWQgKHN0YXRlPSIKKyAgICAgICAgICAgICAgICAgICAgKyBnZXRTdGF0ZUxhYmVsKG1TdGF0ZSkgKyAiKSIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtUm9vdElkOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgYW55IGV4dHJhcyBmb3IgdGhlIG1lZGlhIHNlcnZpY2UuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiBub3QgY29ubmVjdGVkLgorICAgICAqLworICAgIHB1YmxpYyBATnVsbGFibGUgQnVuZGxlIGdldEV4dHJhcygpIHsKKyAgICAgICAgaWYgKCFpc0Nvbm5lY3RlZCgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJnZXRFeHRyYXMoKSBjYWxsZWQgd2hpbGUgbm90IGNvbm5lY3RlZCAoc3RhdGU9IgorICAgICAgICAgICAgICAgICAgICArIGdldFN0YXRlTGFiZWwobVN0YXRlKSArICIpIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1FeHRyYXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgbWVkaWEgc2Vzc2lvbiB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIG1lZGlhIGJyb3dzZXIuCisgICAgICogPHA+CisgICAgICogTm90ZSB0aGF0IHRoZSBzZXNzaW9uIHRva2VuIG1heSBiZWNvbWUgaW52YWxpZCBvciBjaGFuZ2Ugd2hlbiB0aGUKKyAgICAgKiBicm93c2VyIGlzIGRpc2Nvbm5lY3RlZC4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBzZXNzaW9uIHRva2VuIGZvciB0aGUgYnJvd3NlciwgbmV2ZXIgbnVsbC4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIG5vdCBjb25uZWN0ZWQuCisgICAgICovCisgICAgIHB1YmxpYyBATm9uTnVsbCBNZWRpYVNlc3Npb24uVG9rZW4gZ2V0U2Vzc2lvblRva2VuKCkgeworICAgICAgICBpZiAoIWlzQ29ubmVjdGVkKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImdldFNlc3Npb25Ub2tlbigpIGNhbGxlZCB3aGlsZSBub3QgY29ubmVjdGVkIChzdGF0ZT0iCisgICAgICAgICAgICAgICAgICAgICsgbVN0YXRlICsgIikiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbU1lZGlhU2Vzc2lvblRva2VuOworICAgIH0KKworICAgIC8qKgorICAgICAqIFF1ZXJpZXMgZm9yIGluZm9ybWF0aW9uIGFib3V0IHRoZSBtZWRpYSBpdGVtcyB0aGF0IGFyZSBjb250YWluZWQgd2l0aGluCisgICAgICogdGhlIHNwZWNpZmllZCBpZCBhbmQgc3Vic2NyaWJlcyB0byByZWNlaXZlIHVwZGF0ZXMgd2hlbiB0aGV5IGNoYW5nZS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgbGlzdCBvZiBzdWJzY3JpcHRpb25zIGlzIG1haW50YWluZWQgZXZlbiB3aGVuIG5vdCBjb25uZWN0ZWQgYW5kIGlzCisgICAgICogcmVzdG9yZWQgYWZ0ZXIgdGhlIHJlY29ubmVjdGlvbi4gSXQgaXMgb2sgdG8gc3Vic2NyaWJlIHdoaWxlIG5vdCBjb25uZWN0ZWQKKyAgICAgKiBidXQgdGhlIHJlc3VsdHMgd2lsbCBub3QgYmUgcmV0dXJuZWQgdW50aWwgdGhlIGNvbm5lY3Rpb24gY29tcGxldGVzLgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiB0aGUgaWQgaXMgYWxyZWFkeSBzdWJzY3JpYmVkIHdpdGggYSBkaWZmZXJlbnQgY2FsbGJhY2sgdGhlbiB0aGUgbmV3CisgICAgICogY2FsbGJhY2sgd2lsbCByZXBsYWNlIHRoZSBwcmV2aW91cyBvbmUgYW5kIHRoZSBjaGlsZCBkYXRhIHdpbGwgYmUKKyAgICAgKiByZWxvYWRlZC4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFyZW50SWQgVGhlIGlkIG9mIHRoZSBwYXJlbnQgbWVkaWEgaXRlbSB3aG9zZSBsaXN0IG9mIGNoaWxkcmVuCisgICAgICogICAgICAgICAgICB3aWxsIGJlIHN1YnNjcmliZWQuCisgICAgICogQHBhcmFtIGNhbGxiYWNrIFRoZSBjYWxsYmFjayB0byByZWNlaXZlIHRoZSBsaXN0IG9mIGNoaWxkcmVuLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN1YnNjcmliZShATm9uTnVsbCBTdHJpbmcgcGFyZW50SWQsIEBOb25OdWxsIFN1YnNjcmlwdGlvbkNhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgICAgIHN1YnNjcmliZUludGVybmFsKHBhcmVudElkLCBudWxsLCBjYWxsYmFjayk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUXVlcmllcyB3aXRoIHNlcnZpY2Utc3BlY2lmaWMgYXJndW1lbnRzIGZvciBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbWVkaWEgaXRlbXMKKyAgICAgKiB0aGF0IGFyZSBjb250YWluZWQgd2l0aGluIHRoZSBzcGVjaWZpZWQgaWQgYW5kIHN1YnNjcmliZXMgdG8gcmVjZWl2ZSB1cGRhdGVzCisgICAgICogd2hlbiB0aGV5IGNoYW5nZS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgbGlzdCBvZiBzdWJzY3JpcHRpb25zIGlzIG1haW50YWluZWQgZXZlbiB3aGVuIG5vdCBjb25uZWN0ZWQgYW5kIGlzCisgICAgICogcmVzdG9yZWQgYWZ0ZXIgdGhlIHJlY29ubmVjdGlvbi4gSXQgaXMgb2sgdG8gc3Vic2NyaWJlIHdoaWxlIG5vdCBjb25uZWN0ZWQKKyAgICAgKiBidXQgdGhlIHJlc3VsdHMgd2lsbCBub3QgYmUgcmV0dXJuZWQgdW50aWwgdGhlIGNvbm5lY3Rpb24gY29tcGxldGVzLgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiB0aGUgaWQgaXMgYWxyZWFkeSBzdWJzY3JpYmVkIHdpdGggYSBkaWZmZXJlbnQgY2FsbGJhY2sgdGhlbiB0aGUgbmV3CisgICAgICogY2FsbGJhY2sgd2lsbCByZXBsYWNlIHRoZSBwcmV2aW91cyBvbmUgYW5kIHRoZSBjaGlsZCBkYXRhIHdpbGwgYmUKKyAgICAgKiByZWxvYWRlZC4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFyZW50SWQgVGhlIGlkIG9mIHRoZSBwYXJlbnQgbWVkaWEgaXRlbSB3aG9zZSBsaXN0IG9mIGNoaWxkcmVuCisgICAgICogICAgICAgICAgICB3aWxsIGJlIHN1YnNjcmliZWQuCisgICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIGJ1bmRsZSBvZiBzZXJ2aWNlLXNwZWNpZmljIGFyZ3VtZW50cyB0byBzZW5kIHRvIHRoZSBtZWRpYQorICAgICAqICAgICAgICAgICAgYnJvd3NlciBzZXJ2aWNlLiBUaGUgY29udGVudHMgb2YgdGhpcyBidW5kbGUgbWF5IGFmZmVjdCB0aGUKKyAgICAgKiAgICAgICAgICAgIGluZm9ybWF0aW9uIHJldHVybmVkIHdoZW4gYnJvd3NpbmcuCisgICAgICogQHBhcmFtIGNhbGxiYWNrIFRoZSBjYWxsYmFjayB0byByZWNlaXZlIHRoZSBsaXN0IG9mIGNoaWxkcmVuLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN1YnNjcmliZShATm9uTnVsbCBTdHJpbmcgcGFyZW50SWQsIEBOb25OdWxsIEJ1bmRsZSBvcHRpb25zLAorICAgICAgICAgICAgQE5vbk51bGwgU3Vic2NyaXB0aW9uQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgaWYgKG9wdGlvbnMgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigib3B0aW9ucyBjYW5ub3QgYmUgbnVsbCIpOworICAgICAgICB9CisgICAgICAgIHN1YnNjcmliZUludGVybmFsKHBhcmVudElkLCBuZXcgQnVuZGxlKG9wdGlvbnMpLCBjYWxsYmFjayk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVW5zdWJzY3JpYmVzIGZvciBjaGFuZ2VzIHRvIHRoZSBjaGlsZHJlbiBvZiB0aGUgc3BlY2lmaWVkIG1lZGlhIGlkLgorICAgICAqIDxwPgorICAgICAqIFRoZSBxdWVyeSBjYWxsYmFjayB3aWxsIG5vIGxvbmdlciBiZSBpbnZva2VkIGZvciByZXN1bHRzIGFzc29jaWF0ZWQgd2l0aAorICAgICAqIHRoaXMgaWQgb25jZSB0aGlzIG1ldGhvZCByZXR1cm5zLgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJlbnRJZCBUaGUgaWQgb2YgdGhlIHBhcmVudCBtZWRpYSBpdGVtIHdob3NlIGxpc3Qgb2YgY2hpbGRyZW4KKyAgICAgKiAgICAgICAgICAgIHdpbGwgYmUgdW5zdWJzY3JpYmVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHVuc3Vic2NyaWJlKEBOb25OdWxsIFN0cmluZyBwYXJlbnRJZCkgeworICAgICAgICB1bnN1YnNjcmliZUludGVybmFsKHBhcmVudElkLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVbnN1YnNjcmliZXMgZm9yIGNoYW5nZXMgdG8gdGhlIGNoaWxkcmVuIG9mIHRoZSBzcGVjaWZpZWQgbWVkaWEgaWQgdGhyb3VnaCBhIGNhbGxiYWNrLgorICAgICAqIDxwPgorICAgICAqIFRoZSBxdWVyeSBjYWxsYmFjayB3aWxsIG5vIGxvbmdlciBiZSBpbnZva2VkIGZvciByZXN1bHRzIGFzc29jaWF0ZWQgd2l0aAorICAgICAqIHRoaXMgaWQgb25jZSB0aGlzIG1ldGhvZCByZXR1cm5zLgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJlbnRJZCBUaGUgaWQgb2YgdGhlIHBhcmVudCBtZWRpYSBpdGVtIHdob3NlIGxpc3Qgb2YgY2hpbGRyZW4KKyAgICAgKiAgICAgICAgICAgIHdpbGwgYmUgdW5zdWJzY3JpYmVkLgorICAgICAqIEBwYXJhbSBjYWxsYmFjayBBIGNhbGxiYWNrIHNlbnQgdG8gdGhlIG1lZGlhIGJyb3dzZXIgc2VydmljZSB0byBzdWJzY3JpYmUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdW5zdWJzY3JpYmUoQE5vbk51bGwgU3RyaW5nIHBhcmVudElkLCBATm9uTnVsbCBTdWJzY3JpcHRpb25DYWxsYmFjayBjYWxsYmFjaykgeworICAgICAgICBpZiAoY2FsbGJhY2sgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY2FsbGJhY2sgY2Fubm90IGJlIG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICB1bnN1YnNjcmliZUludGVybmFsKHBhcmVudElkLCBjYWxsYmFjayk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIGEgc3BlY2lmaWMge0BsaW5rIE1lZGlhSXRlbX0gZnJvbSB0aGUgY29ubmVjdGVkIHNlcnZpY2UuIE5vdAorICAgICAqIGFsbCBzZXJ2aWNlcyBtYXkgc3VwcG9ydCB0aGlzLCBzbyBmYWxsaW5nIGJhY2sgdG8gc3Vic2NyaWJpbmcgdG8gdGhlCisgICAgICogcGFyZW50J3MgaWQgc2hvdWxkIGJlIHVzZWQgd2hlbiB1bmF2YWlsYWJsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtZWRpYUlkIFRoZSBpZCBvZiB0aGUgaXRlbSB0byByZXRyaWV2ZS4KKyAgICAgKiBAcGFyYW0gY2IgVGhlIGNhbGxiYWNrIHRvIHJlY2VpdmUgdGhlIHJlc3VsdCBvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBnZXRJdGVtKGZpbmFsIEBOb25OdWxsIFN0cmluZyBtZWRpYUlkLCBATm9uTnVsbCBmaW5hbCBJdGVtQ2FsbGJhY2sgY2IpIHsKKyAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KG1lZGlhSWQpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJtZWRpYUlkIGNhbm5vdCBiZSBlbXB0eS4iKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY2IgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY2IgY2Fubm90IGJlIG51bGwuIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1TdGF0ZSAhPSBDT05ORUNUX1NUQVRFX0NPTk5FQ1RFRCkgeworICAgICAgICAgICAgTG9nLmkoVEFHLCAiTm90IGNvbm5lY3RlZCwgdW5hYmxlIHRvIHJldHJpZXZlIHRoZSBNZWRpYUl0ZW0uIik7CisgICAgICAgICAgICBtSGFuZGxlci5wb3N0KG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIGNiLm9uRXJyb3IobWVkaWFJZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgUmVzdWx0UmVjZWl2ZXIgcmVjZWl2ZXIgPSBuZXcgUmVzdWx0UmVjZWl2ZXIobUhhbmRsZXIpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25SZWNlaXZlUmVzdWx0KGludCByZXN1bHRDb2RlLCBCdW5kbGUgcmVzdWx0RGF0YSkgeworICAgICAgICAgICAgICAgIGlmICghaXNDb25uZWN0ZWQoKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChyZXN1bHRDb2RlICE9IDAgfHwgcmVzdWx0RGF0YSA9PSBudWxsCisgICAgICAgICAgICAgICAgICAgICAgICB8fCAhcmVzdWx0RGF0YS5jb250YWluc0tleShNZWRpYUJyb3dzZXJTZXJ2aWNlLktFWV9NRURJQV9JVEVNKSkgeworICAgICAgICAgICAgICAgICAgICBjYi5vbkVycm9yKG1lZGlhSWQpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFBhcmNlbGFibGUgaXRlbSA9IHJlc3VsdERhdGEuZ2V0UGFyY2VsYWJsZShNZWRpYUJyb3dzZXJTZXJ2aWNlLktFWV9NRURJQV9JVEVNKTsKKyAgICAgICAgICAgICAgICBpZiAoaXRlbSAhPSBudWxsICYmICEoaXRlbSBpbnN0YW5jZW9mIE1lZGlhSXRlbSkpIHsKKyAgICAgICAgICAgICAgICAgICAgY2Iub25FcnJvcihtZWRpYUlkKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYi5vbkl0ZW1Mb2FkZWQoKE1lZGlhSXRlbSlpdGVtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1TZXJ2aWNlQmluZGVyLmdldE1lZGlhSXRlbShtZWRpYUlkLCByZWNlaXZlciwgbVNlcnZpY2VDYWxsYmFja3MpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmkoVEFHLCAiUmVtb3RlIGVycm9yIGdldHRpbmcgbWVkaWEgaXRlbS4iKTsKKyAgICAgICAgICAgIG1IYW5kbGVyLnBvc3QobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgY2Iub25FcnJvcihtZWRpYUlkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzdWJzY3JpYmVJbnRlcm5hbChTdHJpbmcgcGFyZW50SWQsIEJ1bmRsZSBvcHRpb25zLCBTdWJzY3JpcHRpb25DYWxsYmFjayBjYWxsYmFjaykgeworICAgICAgICAvLyBDaGVjayBhcmd1bWVudHMuCisgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShwYXJlbnRJZCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInBhcmVudElkIGNhbm5vdCBiZSBlbXB0eS4iKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY2FsbGJhY2sgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY2FsbGJhY2sgY2Fubm90IGJlIG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICAvLyBVcGRhdGUgb3IgY3JlYXRlIHRoZSBzdWJzY3JpcHRpb24uCisgICAgICAgIFN1YnNjcmlwdGlvbiBzdWIgPSBtU3Vic2NyaXB0aW9ucy5nZXQocGFyZW50SWQpOworICAgICAgICBpZiAoc3ViID09IG51bGwpIHsKKyAgICAgICAgICAgIHN1YiA9IG5ldyBTdWJzY3JpcHRpb24oKTsKKyAgICAgICAgICAgIG1TdWJzY3JpcHRpb25zLnB1dChwYXJlbnRJZCwgc3ViKTsKKyAgICAgICAgfQorICAgICAgICBzdWIucHV0Q2FsbGJhY2sobUNvbnRleHQsIG9wdGlvbnMsIGNhbGxiYWNrKTsKKworICAgICAgICAvLyBJZiB3ZSBhcmUgY29ubmVjdGVkLCB0ZWxsIHRoZSBzZXJ2aWNlIHRoYXQgd2UgYXJlIHdhdGNoaW5nLiBJZiB3ZSBhcmVuJ3QgY29ubmVjdGVkLAorICAgICAgICAvLyB0aGUgc2VydmljZSB3aWxsIGJlIHRvbGQgd2hlbiB3ZSBjb25uZWN0LgorICAgICAgICBpZiAoaXNDb25uZWN0ZWQoKSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpZiAob3B0aW9ucyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG1TZXJ2aWNlQmluZGVyLmFkZFN1YnNjcmlwdGlvbkRlcHJlY2F0ZWQocGFyZW50SWQsIG1TZXJ2aWNlQ2FsbGJhY2tzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbVNlcnZpY2VCaW5kZXIuYWRkU3Vic2NyaXB0aW9uKHBhcmVudElkLCBjYWxsYmFjay5tVG9rZW4sIG9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICBtU2VydmljZUNhbGxiYWNrcyk7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAvLyBQcm9jZXNzIGlzIGNyYXNoaW5nLiBXZSB3aWxsIGRpc2Nvbm5lY3QsIGFuZCB1cG9uIHJlY29ubmVjdCB3ZSB3aWxsCisgICAgICAgICAgICAgICAgLy8gYXV0b21hdGljYWxseSByZXJlZ2lzdGVyLiBTbyBub3RoaW5nIHRvIGRvIGhlcmUuCisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiYWRkU3Vic2NyaXB0aW9uIGZhaWxlZCB3aXRoIFJlbW90ZUV4Y2VwdGlvbiBwYXJlbnRJZD0iICsgcGFyZW50SWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHVuc3Vic2NyaWJlSW50ZXJuYWwoU3RyaW5nIHBhcmVudElkLCBTdWJzY3JpcHRpb25DYWxsYmFjayBjYWxsYmFjaykgeworICAgICAgICAvLyBDaGVjayBhcmd1bWVudHMuCisgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShwYXJlbnRJZCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInBhcmVudElkIGNhbm5vdCBiZSBlbXB0eS4iKTsKKyAgICAgICAgfQorCisgICAgICAgIFN1YnNjcmlwdGlvbiBzdWIgPSBtU3Vic2NyaXB0aW9ucy5nZXQocGFyZW50SWQpOworICAgICAgICBpZiAoc3ViID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAvLyBUZWxsIHRoZSBzZXJ2aWNlIGlmIG5lY2Vzc2FyeS4KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChjYWxsYmFjayA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKGlzQ29ubmVjdGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbVNlcnZpY2VCaW5kZXIucmVtb3ZlU3Vic2NyaXB0aW9uRGVwcmVjYXRlZChwYXJlbnRJZCwgbVNlcnZpY2VDYWxsYmFja3MpOworICAgICAgICAgICAgICAgICAgICBtU2VydmljZUJpbmRlci5yZW1vdmVTdWJzY3JpcHRpb24ocGFyZW50SWQsIG51bGwsIG1TZXJ2aWNlQ2FsbGJhY2tzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZpbmFsIExpc3Q8U3Vic2NyaXB0aW9uQ2FsbGJhY2s+IGNhbGxiYWNrcyA9IHN1Yi5nZXRDYWxsYmFja3MoKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBMaXN0PEJ1bmRsZT4gb3B0aW9uc0xpc3QgPSBzdWIuZ2V0T3B0aW9uc0xpc3QoKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gY2FsbGJhY2tzLnNpemUoKSAtIDE7IGkgPj0gMDsgLS1pKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFja3MuZ2V0KGkpID09IGNhbGxiYWNrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNDb25uZWN0ZWQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TZXJ2aWNlQmluZGVyLnJlbW92ZVN1YnNjcmlwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudElkLCBjYWxsYmFjay5tVG9rZW4sIG1TZXJ2aWNlQ2FsbGJhY2tzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrcy5yZW1vdmUoaSk7CisgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zTGlzdC5yZW1vdmUoaSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgLy8gUHJvY2VzcyBpcyBjcmFzaGluZy4gV2Ugd2lsbCBkaXNjb25uZWN0LCBhbmQgdXBvbiByZWNvbm5lY3Qgd2Ugd2lsbAorICAgICAgICAgICAgLy8gYXV0b21hdGljYWxseSByZXJlZ2lzdGVyLiBTbyBub3RoaW5nIHRvIGRvIGhlcmUuCisgICAgICAgICAgICBMb2cuZChUQUcsICJyZW1vdmVTdWJzY3JpcHRpb24gZmFpbGVkIHdpdGggUmVtb3RlRXhjZXB0aW9uIHBhcmVudElkPSIgKyBwYXJlbnRJZCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc3ViLmlzRW1wdHkoKSB8fCBjYWxsYmFjayA9PSBudWxsKSB7CisgICAgICAgICAgICBtU3Vic2NyaXB0aW9ucy5yZW1vdmUocGFyZW50SWQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRm9yIGRlYnVnZ2luZy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0U3RhdGVMYWJlbChpbnQgc3RhdGUpIHsKKyAgICAgICAgc3dpdGNoIChzdGF0ZSkgeworICAgICAgICAgICAgY2FzZSBDT05ORUNUX1NUQVRFX0RJU0NPTk5FQ1RJTkc6CisgICAgICAgICAgICAgICAgcmV0dXJuICJDT05ORUNUX1NUQVRFX0RJU0NPTk5FQ1RJTkciOworICAgICAgICAgICAgY2FzZSBDT05ORUNUX1NUQVRFX0RJU0NPTk5FQ1RFRDoKKyAgICAgICAgICAgICAgICByZXR1cm4gIkNPTk5FQ1RfU1RBVEVfRElTQ09OTkVDVEVEIjsKKyAgICAgICAgICAgIGNhc2UgQ09OTkVDVF9TVEFURV9DT05ORUNUSU5HOgorICAgICAgICAgICAgICAgIHJldHVybiAiQ09OTkVDVF9TVEFURV9DT05ORUNUSU5HIjsKKyAgICAgICAgICAgIGNhc2UgQ09OTkVDVF9TVEFURV9DT05ORUNURUQ6CisgICAgICAgICAgICAgICAgcmV0dXJuICJDT05ORUNUX1NUQVRFX0NPTk5FQ1RFRCI7CisgICAgICAgICAgICBjYXNlIENPTk5FQ1RfU1RBVEVfU1VTUEVOREVEOgorICAgICAgICAgICAgICAgIHJldHVybiAiQ09OTkVDVF9TVEFURV9TVVNQRU5ERUQiOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gIlVOS05PV04vIiArIHN0YXRlOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCB2b2lkIG9uU2VydmljZUNvbm5lY3RlZChmaW5hbCBJTWVkaWFCcm93c2VyU2VydmljZUNhbGxiYWNrcyBjYWxsYmFjaywKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyByb290LCBmaW5hbCBNZWRpYVNlc3Npb24uVG9rZW4gc2Vzc2lvbiwgZmluYWwgQnVuZGxlIGV4dHJhKSB7CisgICAgICAgIG1IYW5kbGVyLnBvc3QobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgLy8gQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZXJlIGhhc24ndCBiZWVuIGEgZGlzY29ubmVjdCBvciBhIGRpZmZlcmVudAorICAgICAgICAgICAgICAgIC8vIFNlcnZpY2VDb25uZWN0aW9uLgorICAgICAgICAgICAgICAgIGlmICghaXNDdXJyZW50KGNhbGxiYWNrLCAib25Db25uZWN0IikpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBEb24ndCBhbGxvdyB0aGVtIHRvIGNhbGwgdXMgdHdpY2UuCisgICAgICAgICAgICAgICAgaWYgKG1TdGF0ZSAhPSBDT05ORUNUX1NUQVRFX0NPTk5FQ1RJTkcpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAib25Db25uZWN0IGZyb20gc2VydmljZSB3aGlsZSBtU3RhdGU9IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZ2V0U3RhdGVMYWJlbChtU3RhdGUpICsgIi4uLiBpZ25vcmluZyIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1Sb290SWQgPSByb290OworICAgICAgICAgICAgICAgIG1NZWRpYVNlc3Npb25Ub2tlbiA9IHNlc3Npb247CisgICAgICAgICAgICAgICAgbUV4dHJhcyA9IGV4dHJhOworICAgICAgICAgICAgICAgIG1TdGF0ZSA9IENPTk5FQ1RfU1RBVEVfQ09OTkVDVEVEOworCisgICAgICAgICAgICAgICAgaWYgKERCRykgeworICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJTZXJ2aWNlQ2FsbGJhY2tzLm9uQ29ubmVjdC4uLiIpOworICAgICAgICAgICAgICAgICAgICBkdW1wKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1DYWxsYmFjay5vbkNvbm5lY3RlZCgpOworCisgICAgICAgICAgICAgICAgLy8gd2UgbWF5IHJlY2VpdmUgc29tZSBzdWJzY3JpcHRpb25zIGJlZm9yZSB3ZSBhcmUgY29ubmVjdGVkLCBzbyByZS1zdWJzY3JpYmUKKyAgICAgICAgICAgICAgICAvLyBldmVyeXRoaW5nIG5vdworICAgICAgICAgICAgICAgIGZvciAoRW50cnk8U3RyaW5nLCBTdWJzY3JpcHRpb24+IHN1YnNjcmlwdGlvbkVudHJ5IDogbVN1YnNjcmlwdGlvbnMuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaWQgPSBzdWJzY3JpcHRpb25FbnRyeS5nZXRLZXkoKTsKKyAgICAgICAgICAgICAgICAgICAgU3Vic2NyaXB0aW9uIHN1YiA9IHN1YnNjcmlwdGlvbkVudHJ5LmdldFZhbHVlKCk7CisgICAgICAgICAgICAgICAgICAgIExpc3Q8U3Vic2NyaXB0aW9uQ2FsbGJhY2s+IGNhbGxiYWNrTGlzdCA9IHN1Yi5nZXRDYWxsYmFja3MoKTsKKyAgICAgICAgICAgICAgICAgICAgTGlzdDxCdW5kbGU+IG9wdGlvbnNMaXN0ID0gc3ViLmdldE9wdGlvbnNMaXN0KCk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2FsbGJhY2tMaXN0LnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TZXJ2aWNlQmluZGVyLmFkZFN1YnNjcmlwdGlvbihpZCwgY2FsbGJhY2tMaXN0LmdldChpKS5tVG9rZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zTGlzdC5nZXQoaSksIG1TZXJ2aWNlQ2FsbGJhY2tzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFByb2Nlc3MgaXMgY3Jhc2hpbmcuIFdlIHdpbGwgZGlzY29ubmVjdCwgYW5kIHVwb24gcmVjb25uZWN0IHdlIHdpbGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhdXRvbWF0aWNhbGx5IHJlcmVnaXN0ZXIuIFNvIG5vdGhpbmcgdG8gZG8gaGVyZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJhZGRTdWJzY3JpcHRpb24gZmFpbGVkIHdpdGggUmVtb3RlRXhjZXB0aW9uIHBhcmVudElkPSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgaWQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIHZvaWQgb25Db25uZWN0aW9uRmFpbGVkKGZpbmFsIElNZWRpYUJyb3dzZXJTZXJ2aWNlQ2FsbGJhY2tzIGNhbGxiYWNrKSB7CisgICAgICAgIG1IYW5kbGVyLnBvc3QobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAib25Db25uZWN0RmFpbGVkIGZvciAiICsgbVNlcnZpY2VDb21wb25lbnQpOworCisgICAgICAgICAgICAgICAgLy8gQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZXJlIGhhc24ndCBiZWVuIGEgZGlzY29ubmVjdCBvciBhIGRpZmZlcmVudAorICAgICAgICAgICAgICAgIC8vIFNlcnZpY2VDb25uZWN0aW9uLgorICAgICAgICAgICAgICAgIGlmICghaXNDdXJyZW50KGNhbGxiYWNrLCAib25Db25uZWN0RmFpbGVkIikpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBEb24ndCBhbGxvdyB0aGVtIHRvIGNhbGwgdXMgdHdpY2UuCisgICAgICAgICAgICAgICAgaWYgKG1TdGF0ZSAhPSBDT05ORUNUX1NUQVRFX0NPTk5FQ1RJTkcpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAib25Db25uZWN0IGZyb20gc2VydmljZSB3aGlsZSBtU3RhdGU9IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZ2V0U3RhdGVMYWJlbChtU3RhdGUpICsgIi4uLiBpZ25vcmluZyIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gQ2xlYW4gdXAKKyAgICAgICAgICAgICAgICBmb3JjZUNsb3NlQ29ubmVjdGlvbigpOworCisgICAgICAgICAgICAgICAgLy8gVGVsbCB0aGUgYXBwLgorICAgICAgICAgICAgICAgIG1DYWxsYmFjay5vbkNvbm5lY3Rpb25GYWlsZWQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgLy9UT0RPOihiLzExOTc1MDgwNykgUmVzb2x2ZSBoaWRkZW4gQVBJIHVzYWdlIFBhcmNlbGVkTGlzdFNsaWNlLgorICAgIC8qCisgICAgcHJpdmF0ZSBmaW5hbCB2b2lkIG9uTG9hZENoaWxkcmVuKGZpbmFsIElNZWRpYUJyb3dzZXJTZXJ2aWNlQ2FsbGJhY2tzIGNhbGxiYWNrLAorICAgICAgICAgICAgZmluYWwgU3RyaW5nIHBhcmVudElkLCBmaW5hbCBQYXJjZWxlZExpc3RTbGljZSBsaXN0LCBmaW5hbCBCdW5kbGUgb3B0aW9ucykgeworICAgICAgICBtSGFuZGxlci5wb3N0KG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIC8vIENoZWNrIHRoYXQgdGhlcmUgaGFzbid0IGJlZW4gYSBkaXNjb25uZWN0IG9yIGEgZGlmZmVyZW50CisgICAgICAgICAgICAgICAgLy8gU2VydmljZUNvbm5lY3Rpb24uCisgICAgICAgICAgICAgICAgaWYgKCFpc0N1cnJlbnQoY2FsbGJhY2ssICJvbkxvYWRDaGlsZHJlbiIpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoREJHKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIm9uTG9hZENoaWxkcmVuIGZvciAiICsgbVNlcnZpY2VDb21wb25lbnQgKyAiIGlkPSIgKyBwYXJlbnRJZCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gQ2hlY2sgdGhhdCB0aGUgc3Vic2NyaXB0aW9uIGlzIHN0aWxsIHN1YnNjcmliZWQuCisgICAgICAgICAgICAgICAgZmluYWwgU3Vic2NyaXB0aW9uIHN1YnNjcmlwdGlvbiA9IG1TdWJzY3JpcHRpb25zLmdldChwYXJlbnRJZCk7CisgICAgICAgICAgICAgICAgaWYgKHN1YnNjcmlwdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRlbGwgdGhlIGFwcC4KKyAgICAgICAgICAgICAgICAgICAgU3Vic2NyaXB0aW9uQ2FsbGJhY2sgc3Vic2NyaXB0aW9uQ2FsbGJhY2sgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnNjcmlwdGlvbi5nZXRDYWxsYmFjayhtQ29udGV4dCwgb3B0aW9ucyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdWJzY3JpcHRpb25DYWxsYmFjayAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PE1lZGlhSXRlbT4gZGF0YSA9IGxpc3QgPT0gbnVsbCA/IG51bGwgOiBsaXN0LmdldExpc3QoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnNjcmlwdGlvbkNhbGxiYWNrLm9uRXJyb3IocGFyZW50SWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnNjcmlwdGlvbkNhbGxiYWNrLm9uQ2hpbGRyZW5Mb2FkZWQocGFyZW50SWQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJzY3JpcHRpb25DYWxsYmFjay5vbkVycm9yKHBhcmVudElkLCBvcHRpb25zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJzY3JpcHRpb25DYWxsYmFjay5vbkNoaWxkcmVuTG9hZGVkKHBhcmVudElkLCBkYXRhLCBvcHRpb25zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKERCRykgeworICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJvbkxvYWRDaGlsZHJlbiBmb3IgaWQgdGhhdCBpc24ndCBzdWJzY3JpYmVkIGlkPSIgKyBwYXJlbnRJZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisgICAgKi8KKworICAgIC8qKgorICAgICAqIFJldHVybiB0cnVlIGlmIHtAY29kZSBjYWxsYmFja30gaXMgdGhlIGN1cnJlbnQgU2VydmljZUNhbGxiYWNrcy4gQWxzbyBsb2dzIGlmIGl0J3Mgbm90LgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBpc0N1cnJlbnQoSU1lZGlhQnJvd3NlclNlcnZpY2VDYWxsYmFja3MgY2FsbGJhY2ssIFN0cmluZyBmdW5jTmFtZSkgeworICAgICAgICBpZiAobVNlcnZpY2VDYWxsYmFja3MgIT0gY2FsbGJhY2sgfHwgbVN0YXRlID09IENPTk5FQ1RfU1RBVEVfRElTQ09OTkVDVElORworICAgICAgICAgICAgICAgIHx8IG1TdGF0ZSA9PSBDT05ORUNUX1NUQVRFX0RJU0NPTk5FQ1RFRCkgeworICAgICAgICAgICAgaWYgKG1TdGF0ZSAhPSBDT05ORUNUX1NUQVRFX0RJU0NPTk5FQ1RJTkcgJiYgbVN0YXRlICE9IENPTk5FQ1RfU1RBVEVfRElTQ09OTkVDVEVEKSB7CisgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCBmdW5jTmFtZSArICIgZm9yICIgKyBtU2VydmljZUNvbXBvbmVudCArICIgd2l0aCBtU2VydmljZUNvbm5lY3Rpb249IgorICAgICAgICAgICAgICAgICAgICAgICAgKyBtU2VydmljZUNhbGxiYWNrcyArICIgdGhpcz0iICsgdGhpcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHJpdmF0ZSBTZXJ2aWNlQ2FsbGJhY2tzIGdldE5ld1NlcnZpY2VDYWxsYmFja3MoKSB7CisgICAgICAgIHJldHVybiBuZXcgU2VydmljZUNhbGxiYWNrcyh0aGlzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb2cgaW50ZXJuYWwgc3RhdGUuCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICB2b2lkIGR1bXAoKSB7CisgICAgICAgIExvZy5kKFRBRywgIk1lZGlhQnJvd3Nlci4uLiIpOworICAgICAgICBMb2cuZChUQUcsICIgIG1TZXJ2aWNlQ29tcG9uZW50PSIgKyBtU2VydmljZUNvbXBvbmVudCk7CisgICAgICAgIExvZy5kKFRBRywgIiAgbUNhbGxiYWNrPSIgKyBtQ2FsbGJhY2spOworICAgICAgICBMb2cuZChUQUcsICIgIG1Sb290SGludHM9IiArIG1Sb290SGludHMpOworICAgICAgICBMb2cuZChUQUcsICIgIG1TdGF0ZT0iICsgZ2V0U3RhdGVMYWJlbChtU3RhdGUpKTsKKyAgICAgICAgTG9nLmQoVEFHLCAiICBtU2VydmljZUNvbm5lY3Rpb249IiArIG1TZXJ2aWNlQ29ubmVjdGlvbik7CisgICAgICAgIExvZy5kKFRBRywgIiAgbVNlcnZpY2VCaW5kZXI9IiArIG1TZXJ2aWNlQmluZGVyKTsKKyAgICAgICAgTG9nLmQoVEFHLCAiICBtU2VydmljZUNhbGxiYWNrcz0iICsgbVNlcnZpY2VDYWxsYmFja3MpOworICAgICAgICBMb2cuZChUQUcsICIgIG1Sb290SWQ9IiArIG1Sb290SWQpOworICAgICAgICBMb2cuZChUQUcsICIgIG1NZWRpYVNlc3Npb25Ub2tlbj0iICsgbU1lZGlhU2Vzc2lvblRva2VuKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIGNsYXNzIHdpdGggaW5mb3JtYXRpb24gb24gYSBzaW5nbGUgbWVkaWEgaXRlbSBmb3IgdXNlIGluIGJyb3dzaW5nL3NlYXJjaGluZyBtZWRpYS4KKyAgICAgKiBNZWRpYUl0ZW1zIGFyZSBhcHBsaWNhdGlvbiBkZXBlbmRlbnQgc28gd2UgY2Fubm90IGd1YXJhbnRlZSB0aGF0IHRoZXkgY29udGFpbiB0aGUKKyAgICAgKiByaWdodCB2YWx1ZXMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNZWRpYUl0ZW0gaW1wbGVtZW50cyBQYXJjZWxhYmxlIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbUZsYWdzOworICAgICAgICBwcml2YXRlIGZpbmFsIE1lZGlhRGVzY3JpcHRpb24gbURlc2NyaXB0aW9uOworCisgICAgICAgIC8qKiBAaGlkZSAqLworICAgICAgICBAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5TT1VSQ0UpCisgICAgICAgIEBJbnREZWYoZmxhZz10cnVlLCB2YWx1ZSA9IHsgRkxBR19CUk9XU0FCTEUsIEZMQUdfUExBWUFCTEUgfSkKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRmxhZ3MgeyB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEZsYWc6IEluZGljYXRlcyB0aGF0IHRoZSBpdGVtIGhhcyBjaGlsZHJlbiBvZiBpdHMgb3duLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19CUk9XU0FCTEUgPSAxIDw8IDA7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEZsYWc6IEluZGljYXRlcyB0aGF0IHRoZSBpdGVtIGlzIHBsYXlhYmxlLgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogVGhlIGlkIG9mIHRoaXMgaXRlbSBtYXkgYmUgcGFzc2VkIHRvCisgICAgICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xsZXIuVHJhbnNwb3J0Q29udHJvbHMjcGxheUZyb21NZWRpYUlkKFN0cmluZywgQnVuZGxlKX0KKyAgICAgICAgICogdG8gc3RhcnQgcGxheWluZyBpdC4KKyAgICAgICAgICogPC9wPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19QTEFZQUJMRSA9IDEgPDwgMTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlIGEgbmV3IE1lZGlhSXRlbSBmb3IgdXNlIGluIGJyb3dzaW5nIG1lZGlhLgorICAgICAgICAgKiBAcGFyYW0gZGVzY3JpcHRpb24gVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBtZWRpYSwgd2hpY2ggbXVzdCBpbmNsdWRlIGEKKyAgICAgICAgICogICAgICAgICAgICBtZWRpYSBpZC4KKyAgICAgICAgICogQHBhcmFtIGZsYWdzIFRoZSBmbGFncyBmb3IgdGhpcyBpdGVtLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIE1lZGlhSXRlbShATm9uTnVsbCBNZWRpYURlc2NyaXB0aW9uIGRlc2NyaXB0aW9uLCBARmxhZ3MgaW50IGZsYWdzKSB7CisgICAgICAgICAgICBpZiAoZGVzY3JpcHRpb24gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImRlc2NyaXB0aW9uIGNhbm5vdCBiZSBudWxsIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkoZGVzY3JpcHRpb24uZ2V0TWVkaWFJZCgpKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImRlc2NyaXB0aW9uIG11c3QgaGF2ZSBhIG5vbi1lbXB0eSBtZWRpYSBpZCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUZsYWdzID0gZmxhZ3M7CisgICAgICAgICAgICBtRGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBQcml2YXRlIGNvbnN0cnVjdG9yLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBNZWRpYUl0ZW0oUGFyY2VsIGluKSB7CisgICAgICAgICAgICBtRmxhZ3MgPSBpbi5yZWFkSW50KCk7CisgICAgICAgICAgICBtRGVzY3JpcHRpb24gPSBNZWRpYURlc2NyaXB0aW9uLkNSRUFUT1IuY3JlYXRlRnJvbVBhcmNlbChpbik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBkZXNjcmliZUNvbnRlbnRzKCkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgd3JpdGVUb1BhcmNlbChQYXJjZWwgb3V0LCBpbnQgZmxhZ3MpIHsKKyAgICAgICAgICAgIG91dC53cml0ZUludChtRmxhZ3MpOworICAgICAgICAgICAgbURlc2NyaXB0aW9uLndyaXRlVG9QYXJjZWwob3V0LCBmbGFncyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigiTWVkaWFJdGVteyIpOworICAgICAgICAgICAgc2IuYXBwZW5kKCJtRmxhZ3M9IikuYXBwZW5kKG1GbGFncyk7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiwgbURlc2NyaXB0aW9uPSIpLmFwcGVuZChtRGVzY3JpcHRpb24pOworICAgICAgICAgICAgc2IuYXBwZW5kKCd9Jyk7CisgICAgICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUGFyY2VsYWJsZS5DcmVhdG9yPE1lZGlhSXRlbT4gQ1JFQVRPUiA9CisgICAgICAgICAgICAgICAgbmV3IFBhcmNlbGFibGUuQ3JlYXRvcjxNZWRpYUl0ZW0+KCkgeworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIE1lZGlhSXRlbSBjcmVhdGVGcm9tUGFyY2VsKFBhcmNlbCBpbikgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBNZWRpYUl0ZW0oaW4pOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBNZWRpYUl0ZW1bXSBuZXdBcnJheShpbnQgc2l6ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBNZWRpYUl0ZW1bc2l6ZV07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXRzIHRoZSBmbGFncyBvZiB0aGUgaXRlbS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBARmxhZ3MgaW50IGdldEZsYWdzKCkgeworICAgICAgICAgICAgcmV0dXJuIG1GbGFnczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBpdGVtIGlzIGJyb3dzYWJsZS4KKyAgICAgICAgICogQHNlZSAjRkxBR19CUk9XU0FCTEUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzQnJvd3NhYmxlKCkgeworICAgICAgICAgICAgcmV0dXJuIChtRmxhZ3MgJiBGTEFHX0JST1dTQUJMRSkgIT0gMDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBpdGVtIGlzIHBsYXlhYmxlLgorICAgICAgICAgKiBAc2VlICNGTEFHX1BMQVlBQkxFCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1BsYXlhYmxlKCkgeworICAgICAgICAgICAgcmV0dXJuIChtRmxhZ3MgJiBGTEFHX1BMQVlBQkxFKSAhPSAwOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBtZWRpYS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBATm9uTnVsbCBNZWRpYURlc2NyaXB0aW9uIGdldERlc2NyaXB0aW9uKCkgeworICAgICAgICAgICAgcmV0dXJuIG1EZXNjcmlwdGlvbjsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIHRoZSBtZWRpYSBpZCBpbiB0aGUge0BsaW5rIE1lZGlhRGVzY3JpcHRpb259IGZvciB0aGlzIGl0ZW0uCisgICAgICAgICAqIEBzZWUgYW5kcm9pZC5tZWRpYS5NZWRpYU1ldGFkYXRhI01FVEFEQVRBX0tFWV9NRURJQV9JRAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEBOdWxsYWJsZSBTdHJpbmcgZ2V0TWVkaWFJZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtRGVzY3JpcHRpb24uZ2V0TWVkaWFJZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGJhY2tzIGZvciBjb25uZWN0aW9uIHJlbGF0ZWQgZXZlbnRzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ29ubmVjdGlvbkNhbGxiYWNrIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEludm9rZWQgYWZ0ZXIge0BsaW5rIE1lZGlhQnJvd3NlciNjb25uZWN0KCl9IHdoZW4gdGhlIHJlcXVlc3QgaGFzIHN1Y2Nlc3NmdWxseSBjb21wbGV0ZWQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBvbkNvbm5lY3RlZCgpIHsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBJbnZva2VkIHdoZW4gdGhlIGNsaWVudCBpcyBkaXNjb25uZWN0ZWQgZnJvbSB0aGUgbWVkaWEgYnJvd3Nlci4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ29ubmVjdGlvblN1c3BlbmRlZCgpIHsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBJbnZva2VkIHdoZW4gdGhlIGNvbm5lY3Rpb24gdG8gdGhlIG1lZGlhIGJyb3dzZXIgZmFpbGVkLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25Db25uZWN0aW9uRmFpbGVkKCkgeworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGJhY2tzIGZvciBzdWJzY3JpcHRpb24gcmVsYXRlZCBldmVudHMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBTdWJzY3JpcHRpb25DYWxsYmFjayB7CisgICAgICAgIEJpbmRlciBtVG9rZW47CisKKyAgICAgICAgcHVibGljIFN1YnNjcmlwdGlvbkNhbGxiYWNrKCkgeworICAgICAgICAgICAgbVRva2VuID0gbmV3IEJpbmRlcigpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENhbGxlZCB3aGVuIHRoZSBsaXN0IG9mIGNoaWxkcmVuIGlzIGxvYWRlZCBvciB1cGRhdGVkLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gcGFyZW50SWQgVGhlIG1lZGlhIGlkIG9mIHRoZSBwYXJlbnQgbWVkaWEgaXRlbS4KKyAgICAgICAgICogQHBhcmFtIGNoaWxkcmVuIFRoZSBjaGlsZHJlbiB3aGljaCB3ZXJlIGxvYWRlZC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2hpbGRyZW5Mb2FkZWQoQE5vbk51bGwgU3RyaW5nIHBhcmVudElkLCBATm9uTnVsbCBMaXN0PE1lZGlhSXRlbT4gY2hpbGRyZW4pIHsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgbGlzdCBvZiBjaGlsZHJlbiBpcyBsb2FkZWQgb3IgdXBkYXRlZC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHBhcmVudElkIFRoZSBtZWRpYSBpZCBvZiB0aGUgcGFyZW50IG1lZGlhIGl0ZW0uCisgICAgICAgICAqIEBwYXJhbSBjaGlsZHJlbiBUaGUgY2hpbGRyZW4gd2hpY2ggd2VyZSBsb2FkZWQuCisgICAgICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBidW5kbGUgb2Ygc2VydmljZS1zcGVjaWZpYyBhcmd1bWVudHMgc2VudCB0byB0aGUgbWVkaWEKKyAgICAgICAgICogICAgICAgICAgICBicm93c2VyIHNlcnZpY2UuIFRoZSBjb250ZW50cyBvZiB0aGlzIGJ1bmRsZSBtYXkgYWZmZWN0IHRoZQorICAgICAgICAgKiAgICAgICAgICAgIGluZm9ybWF0aW9uIHJldHVybmVkIHdoZW4gYnJvd3NpbmcuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBvbkNoaWxkcmVuTG9hZGVkKEBOb25OdWxsIFN0cmluZyBwYXJlbnRJZCwgQE5vbk51bGwgTGlzdDxNZWRpYUl0ZW0+IGNoaWxkcmVuLAorICAgICAgICAgICAgICAgIEBOb25OdWxsIEJ1bmRsZSBvcHRpb25zKSB7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ2FsbGVkIHdoZW4gdGhlIGlkIGRvZXNuJ3QgZXhpc3Qgb3Igb3RoZXIgZXJyb3JzIGluIHN1YnNjcmliaW5nLgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogSWYgdGhpcyBpcyBjYWxsZWQsIHRoZSBzdWJzY3JpcHRpb24gcmVtYWlucyB1bnRpbCB7QGxpbmsgTWVkaWFCcm93c2VyI3Vuc3Vic2NyaWJlfQorICAgICAgICAgKiBjYWxsZWQsIGJlY2F1c2Ugc29tZSBlcnJvcnMgbWF5IGhlYWwgdGhlbXNlbHZlcy4KKyAgICAgICAgICogPC9wPgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gcGFyZW50SWQgVGhlIG1lZGlhIGlkIG9mIHRoZSBwYXJlbnQgbWVkaWEgaXRlbSB3aG9zZSBjaGlsZHJlbiBjb3VsZAorICAgICAgICAgKiAgICAgICAgICAgIG5vdCBiZSBsb2FkZWQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBvbkVycm9yKEBOb25OdWxsIFN0cmluZyBwYXJlbnRJZCkgeworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENhbGxlZCB3aGVuIHRoZSBpZCBkb2Vzbid0IGV4aXN0IG9yIG90aGVyIGVycm9ycyBpbiBzdWJzY3JpYmluZy4KKyAgICAgICAgICogPHA+CisgICAgICAgICAqIElmIHRoaXMgaXMgY2FsbGVkLCB0aGUgc3Vic2NyaXB0aW9uIHJlbWFpbnMgdW50aWwge0BsaW5rIE1lZGlhQnJvd3NlciN1bnN1YnNjcmliZX0KKyAgICAgICAgICogY2FsbGVkLCBiZWNhdXNlIHNvbWUgZXJyb3JzIG1heSBoZWFsIHRoZW1zZWx2ZXMuCisgICAgICAgICAqIDwvcD4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHBhcmVudElkIFRoZSBtZWRpYSBpZCBvZiB0aGUgcGFyZW50IG1lZGlhIGl0ZW0gd2hvc2UgY2hpbGRyZW4gY291bGQKKyAgICAgICAgICogICAgICAgICAgICBub3QgYmUgbG9hZGVkLgorICAgICAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgYnVuZGxlIG9mIHNlcnZpY2Utc3BlY2lmaWMgYXJndW1lbnRzIHNlbnQgdG8gdGhlIG1lZGlhCisgICAgICAgICAqICAgICAgICAgICAgYnJvd3NlciBzZXJ2aWNlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25FcnJvcihATm9uTnVsbCBTdHJpbmcgcGFyZW50SWQsIEBOb25OdWxsIEJ1bmRsZSBvcHRpb25zKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsYmFjayBmb3IgcmVjZWl2aW5nIHRoZSByZXN1bHQgb2Yge0BsaW5rICNnZXRJdGVtfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIEl0ZW1DYWxsYmFjayB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgaXRlbSBoYXMgYmVlbiByZXR1cm5lZCBieSB0aGUgY29ubmVjdGVkIHNlcnZpY2UuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBpdGVtIFRoZSBpdGVtIHRoYXQgd2FzIHJldHVybmVkIG9yIG51bGwgaWYgaXQgZG9lc24ndCBleGlzdC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIG9uSXRlbUxvYWRlZChNZWRpYUl0ZW0gaXRlbSkgeworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENhbGxlZCB0aGVyZSB3YXMgYW4gZXJyb3IgcmV0cmlldmluZyBpdCBvciB0aGUgY29ubmVjdGVkIHNlcnZpY2UgZG9lc24ndCBzdXBwb3J0CisgICAgICAgICAqIHtAbGluayAjZ2V0SXRlbX0uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBtZWRpYUlkIFRoZSBtZWRpYSBpZCBvZiB0aGUgbWVkaWEgaXRlbSB3aGljaCBjb3VsZCBub3QgYmUgbG9hZGVkLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25FcnJvcihATm9uTnVsbCBTdHJpbmcgbWVkaWFJZCkgeworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VydmljZUNvbm5lY3Rpb24gdG8gdGhlIG90aGVyIGFwcC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGNsYXNzIE1lZGlhU2VydmljZUNvbm5lY3Rpb24gaW1wbGVtZW50cyBTZXJ2aWNlQ29ubmVjdGlvbiB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblNlcnZpY2VDb25uZWN0ZWQoZmluYWwgQ29tcG9uZW50TmFtZSBuYW1lLCBmaW5hbCBJQmluZGVyIGJpbmRlcikgeworICAgICAgICAgICAgcG9zdE9yUnVuKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChEQkcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIk1lZGlhU2VydmljZUNvbm5lY3Rpb24ub25TZXJ2aWNlQ29ubmVjdGVkIG5hbWU9IiArIG5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGJpbmRlcj0iICsgYmluZGVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGR1bXAoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBhcmUgc3RpbGwgdGhlIGN1cnJlbnQgY29ubmVjdGlvbiwgYW5kIHRoYXQgdGhleSBoYXZlbid0IGNhbGxlZAorICAgICAgICAgICAgICAgICAgICAvLyBkaXNjb25uZWN0KCkuCisgICAgICAgICAgICAgICAgICAgIGlmICghaXNDdXJyZW50KCJvblNlcnZpY2VDb25uZWN0ZWQiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gU2F2ZSB0aGVpciBiaW5kZXIKKyAgICAgICAgICAgICAgICAgICAgbVNlcnZpY2VCaW5kZXIgPSBJTWVkaWFCcm93c2VyU2VydmljZS5TdHViLmFzSW50ZXJmYWNlKGJpbmRlcik7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gV2UgbWFrZSBhIG5ldyBtU2VydmljZUNhbGxiYWNrcyBlYWNoIHRpbWUgd2UgY29ubmVjdCBzbyB0aGF0IHdlIGNhbiBkcm9wCisgICAgICAgICAgICAgICAgICAgIC8vIHJlc3BvbnNlcyBmcm9tIHByZXZpb3VzIGNvbm5lY3Rpb25zLgorICAgICAgICAgICAgICAgICAgICBtU2VydmljZUNhbGxiYWNrcyA9IGdldE5ld1NlcnZpY2VDYWxsYmFja3MoKTsKKyAgICAgICAgICAgICAgICAgICAgbVN0YXRlID0gQ09OTkVDVF9TVEFURV9DT05ORUNUSU5HOworCisgICAgICAgICAgICAgICAgICAgIC8vIENhbGwgY29ubmVjdCwgd2hpY2ggaXMgYXN5bmMuIFdoZW4gd2UgZ2V0IGEgcmVzcG9uc2UgZnJvbSB0aGF0IHdlIHdpbGwKKyAgICAgICAgICAgICAgICAgICAgLy8gc2F5IHRoYXQgd2UncmUgY29ubmVjdGVkLgorICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERCRykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlNlcnZpY2VDYWxsYmFja3Mub25Db25uZWN0Li4uIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVtcCgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgbVNlcnZpY2VCaW5kZXIuY29ubmVjdChtQ29udGV4dC5nZXRQYWNrYWdlTmFtZSgpLCBtUm9vdEhpbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2VydmljZUNhbGxiYWNrcyk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29ubmVjdCBmYWlsZWQsIHdoaWNoIGlzbid0IGdvb2QuIEJ1dCB0aGUgYXV0by1yZWNvbm5lY3Qgb24gdGhlIHNlcnZpY2UKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpbGwgdGFrZSBvdmVyIGFuZCB3ZSB3aWxsIGNvbWUgYmFjay4gV2Ugd2lsbCBhbHNvIGdldCB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9uU2VydmljZURpc2Nvbm5lY3RlZCwgd2hpY2ggaGFzIGFsbCB0aGUgY2xlYW51cCBjb2RlLiBTbyBsZXQgdGhhdCBkbworICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXQuCisgICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJSZW1vdGVFeGNlcHRpb24gZHVyaW5nIGNvbm5lY3QgZm9yICIgKyBtU2VydmljZUNvbXBvbmVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREJHKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiU2VydmljZUNhbGxiYWNrcy5vbkNvbm5lY3QuLi4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdW1wKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblNlcnZpY2VEaXNjb25uZWN0ZWQoZmluYWwgQ29tcG9uZW50TmFtZSBuYW1lKSB7CisgICAgICAgICAgICBwb3N0T3JSdW4obmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKERCRykgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiTWVkaWFTZXJ2aWNlQ29ubmVjdGlvbi5vblNlcnZpY2VEaXNjb25uZWN0ZWQgbmFtZT0iICsgbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgdGhpcz0iICsgdGhpcyArICIgbVNlcnZpY2VDb25uZWN0aW9uPSIgKyBtU2VydmljZUNvbm5lY3Rpb24pOworICAgICAgICAgICAgICAgICAgICAgICAgZHVtcCgpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHdlIGFyZSBzdGlsbCB0aGUgY3VycmVudCBjb25uZWN0aW9uLCBhbmQgdGhhdCB0aGV5IGhhdmVuJ3QgY2FsbGVkCisgICAgICAgICAgICAgICAgICAgIC8vIGRpc2Nvbm5lY3QoKS4KKyAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0N1cnJlbnQoIm9uU2VydmljZURpc2Nvbm5lY3RlZCIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBDbGVhciBvdXQgd2hhdCB3ZSBzZXQgaW4gb25TZXJ2aWNlQ29ubmVjdGVkCisgICAgICAgICAgICAgICAgICAgIG1TZXJ2aWNlQmluZGVyID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgbVNlcnZpY2VDYWxsYmFja3MgPSBudWxsOworCisgICAgICAgICAgICAgICAgICAgIC8vIEFuZCB0ZWxsIHRoZSBhcHAgdGhhdCBpdCdzIHN1c3BlbmRlZC4KKyAgICAgICAgICAgICAgICAgICAgbVN0YXRlID0gQ09OTkVDVF9TVEFURV9TVVNQRU5ERUQ7CisgICAgICAgICAgICAgICAgICAgIG1DYWxsYmFjay5vbkNvbm5lY3Rpb25TdXNwZW5kZWQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBwb3N0T3JSdW4oUnVubmFibGUgcikgeworICAgICAgICAgICAgaWYgKFRocmVhZC5jdXJyZW50VGhyZWFkKCkgPT0gbUhhbmRsZXIuZ2V0TG9vcGVyKCkuZ2V0VGhyZWFkKCkpIHsKKyAgICAgICAgICAgICAgICByLnJ1bigpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtSGFuZGxlci5wb3N0KHIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybiB0cnVlIGlmIHRoaXMgaXMgdGhlIGN1cnJlbnQgU2VydmljZUNvbm5lY3Rpb24uIEFsc28gbG9ncyBpZiBpdCdzIG5vdC4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBpc0N1cnJlbnQoU3RyaW5nIGZ1bmNOYW1lKSB7CisgICAgICAgICAgICBpZiAobVNlcnZpY2VDb25uZWN0aW9uICE9IHRoaXMgfHwgbVN0YXRlID09IENPTk5FQ1RfU1RBVEVfRElTQ09OTkVDVElORworICAgICAgICAgICAgICAgICAgICB8fCBtU3RhdGUgPT0gQ09OTkVDVF9TVEFURV9ESVNDT05ORUNURUQpIHsKKyAgICAgICAgICAgICAgICBpZiAobVN0YXRlICE9IENPTk5FQ1RfU1RBVEVfRElTQ09OTkVDVElORyAmJiBtU3RhdGUgIT0gQ09OTkVDVF9TVEFURV9ESVNDT05ORUNURUQpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgbVN0YXRlLCBiZWNhdXNlIG90aGVyd2lzZSB0aGlzIGxvZyBpcyBub2lzeS4KKyAgICAgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCBmdW5jTmFtZSArICIgZm9yICIgKyBtU2VydmljZUNvbXBvbmVudCArICIgd2l0aCBtU2VydmljZUNvbm5lY3Rpb249IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbVNlcnZpY2VDb25uZWN0aW9uICsgIiB0aGlzPSIgKyB0aGlzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsYmFja3MgZnJvbSB0aGUgc2VydmljZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBTZXJ2aWNlQ2FsbGJhY2tzIGV4dGVuZHMgSU1lZGlhQnJvd3NlclNlcnZpY2VDYWxsYmFja3MuU3R1YiB7CisgICAgICAgIHByaXZhdGUgV2Vha1JlZmVyZW5jZTxNZWRpYUJyb3dzZXI+IG1NZWRpYUJyb3dzZXI7CisKKyAgICAgICAgcHVibGljIFNlcnZpY2VDYWxsYmFja3MoTWVkaWFCcm93c2VyIG1lZGlhQnJvd3NlcikgeworICAgICAgICAgICAgbU1lZGlhQnJvd3NlciA9IG5ldyBXZWFrUmVmZXJlbmNlPE1lZGlhQnJvd3Nlcj4obWVkaWFCcm93c2VyKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgb3RoZXIgc2lkZSBoYXMgYWNrbm93bGVkZ2VkIG91ciBjb25uZWN0aW9uLiBUaGUgcGFyYW1ldGVycyB0byB0aGlzIGZ1bmN0aW9uCisgICAgICAgICAqIGFyZSB0aGUgaW5pdGlhbCBkYXRhIGFzIHJlcXVlc3RlZC4KKyAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkNvbm5lY3QoU3RyaW5nIHJvb3QsIE1lZGlhU2Vzc2lvbi5Ub2tlbiBzZXNzaW9uLAorICAgICAgICAgICAgICAgIGZpbmFsIEJ1bmRsZSBleHRyYXMpIHsKKyAgICAgICAgICAgIE1lZGlhQnJvd3NlciBtZWRpYUJyb3dzZXIgPSBtTWVkaWFCcm93c2VyLmdldCgpOworICAgICAgICAgICAgaWYgKG1lZGlhQnJvd3NlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbWVkaWFCcm93c2VyLm9uU2VydmljZUNvbm5lY3RlZCh0aGlzLCByb290LCBzZXNzaW9uLCBleHRyYXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBvdGhlciBzaWRlIGRvZXMgbm90IGxpa2UgdXMuIFRlbGwgdGhlIGFwcCB2aWEgb25Db25uZWN0aW9uRmFpbGVkLgorICAgICAgICAgKi8KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ29ubmVjdEZhaWxlZCgpIHsKKyAgICAgICAgICAgIE1lZGlhQnJvd3NlciBtZWRpYUJyb3dzZXIgPSBtTWVkaWFCcm93c2VyLmdldCgpOworICAgICAgICAgICAgaWYgKG1lZGlhQnJvd3NlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbWVkaWFCcm93c2VyLm9uQ29ubmVjdGlvbkZhaWxlZCh0aGlzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vVE9ETzooYi8xMTk3NTA4MDcpIFJlc29sdmUgaGlkZGVuIEFQSSB1c2FnZSBQYXJjZWxlZExpc3RTbGljZS4KKyAgICAgICAgLyoKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uTG9hZENoaWxkcmVuKFN0cmluZyBwYXJlbnRJZCwgUGFyY2VsZWRMaXN0U2xpY2UgbGlzdCkgeworICAgICAgICAgICAgb25Mb2FkQ2hpbGRyZW5XaXRoT3B0aW9ucyhwYXJlbnRJZCwgbGlzdCwgbnVsbCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25Mb2FkQ2hpbGRyZW5XaXRoT3B0aW9ucyhTdHJpbmcgcGFyZW50SWQsIFBhcmNlbGVkTGlzdFNsaWNlIGxpc3QsCisgICAgICAgICAgICAgICAgZmluYWwgQnVuZGxlIG9wdGlvbnMpIHsKKyAgICAgICAgICAgIE1lZGlhQnJvd3NlciBtZWRpYUJyb3dzZXIgPSBtTWVkaWFCcm93c2VyLmdldCgpOworICAgICAgICAgICAgaWYgKG1lZGlhQnJvd3NlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbWVkaWFCcm93c2VyLm9uTG9hZENoaWxkcmVuKHRoaXMsIHBhcmVudElkLCBsaXN0LCBvcHRpb25zKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAqLworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFN1YnNjcmlwdGlvbiB7CisgICAgICAgIHByaXZhdGUgZmluYWwgTGlzdDxTdWJzY3JpcHRpb25DYWxsYmFjaz4gbUNhbGxiYWNrczsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PEJ1bmRsZT4gbU9wdGlvbnNMaXN0OworCisgICAgICAgIHB1YmxpYyBTdWJzY3JpcHRpb24oKSB7CisgICAgICAgICAgICBtQ2FsbGJhY2tzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgICAgICBtT3B0aW9uc0xpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7CisgICAgICAgICAgICByZXR1cm4gbUNhbGxiYWNrcy5pc0VtcHR5KCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgTGlzdDxCdW5kbGU+IGdldE9wdGlvbnNMaXN0KCkgeworICAgICAgICAgICAgcmV0dXJuIG1PcHRpb25zTGlzdDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBMaXN0PFN1YnNjcmlwdGlvbkNhbGxiYWNrPiBnZXRDYWxsYmFja3MoKSB7CisgICAgICAgICAgICByZXR1cm4gbUNhbGxiYWNrczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdWJzY3JpcHRpb25DYWxsYmFjayBnZXRDYWxsYmFjayhDb250ZXh0IGNvbnRleHQsIEJ1bmRsZSBvcHRpb25zKSB7CisgICAgICAgICAgICBpZiAob3B0aW9ucyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgb3B0aW9ucy5zZXRDbGFzc0xvYWRlcihjb250ZXh0LmdldENsYXNzTG9hZGVyKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtT3B0aW9uc0xpc3Quc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgICAgICBpZiAoTWVkaWFCcm93c2VyVXRpbHMuYXJlU2FtZU9wdGlvbnMobU9wdGlvbnNMaXN0LmdldChpKSwgb3B0aW9ucykpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1DYWxsYmFja3MuZ2V0KGkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgcHV0Q2FsbGJhY2soQ29udGV4dCBjb250ZXh0LCBCdW5kbGUgb3B0aW9ucywgU3Vic2NyaXB0aW9uQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgICAgIGlmIChvcHRpb25zICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBvcHRpb25zLnNldENsYXNzTG9hZGVyKGNvbnRleHQuZ2V0Q2xhc3NMb2FkZXIoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1PcHRpb25zTGlzdC5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgICAgIGlmIChNZWRpYUJyb3dzZXJVdGlscy5hcmVTYW1lT3B0aW9ucyhtT3B0aW9uc0xpc3QuZ2V0KGkpLCBvcHRpb25zKSkgeworICAgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2tzLnNldChpLCBjYWxsYmFjayk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ2FsbGJhY2tzLmFkZChjYWxsYmFjayk7CisgICAgICAgICAgICBtT3B0aW9uc0xpc3QuYWRkKG9wdGlvbnMpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL2FwZXgvamF2YS9hbmRyb2lkL21lZGlhL2Jyb3dzZS9NZWRpYUJyb3dzZXJVdGlscy5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL2FwZXgvamF2YS9hbmRyb2lkL21lZGlhL2Jyb3dzZS9NZWRpYUJyb3dzZXJVdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5NDNlNjAKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvYXBleC9qYXZhL2FuZHJvaWQvbWVkaWEvYnJvd3NlL01lZGlhQnJvd3NlclV0aWxzLmphdmEKQEAgLTAsMCArMSw3MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYS5icm93c2U7CisKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKKworLyoqCisgKiBAaGlkZQorICovCitwdWJsaWMgY2xhc3MgTWVkaWFCcm93c2VyVXRpbHMgeworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBhcmVTYW1lT3B0aW9ucyhCdW5kbGUgb3B0aW9uczEsIEJ1bmRsZSBvcHRpb25zMikgeworICAgICAgICBpZiAob3B0aW9uczEgPT0gb3B0aW9uczIpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbnMxID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBvcHRpb25zMi5nZXRJbnQoTWVkaWFCcm93c2VyLkVYVFJBX1BBR0UsIC0xKSA9PSAtMQorICAgICAgICAgICAgICAgICAgICAmJiBvcHRpb25zMi5nZXRJbnQoTWVkaWFCcm93c2VyLkVYVFJBX1BBR0VfU0laRSwgLTEpID09IC0xOworICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbnMyID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBvcHRpb25zMS5nZXRJbnQoTWVkaWFCcm93c2VyLkVYVFJBX1BBR0UsIC0xKSA9PSAtMQorICAgICAgICAgICAgICAgICAgICAmJiBvcHRpb25zMS5nZXRJbnQoTWVkaWFCcm93c2VyLkVYVFJBX1BBR0VfU0laRSwgLTEpID09IC0xOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMxLmdldEludChNZWRpYUJyb3dzZXIuRVhUUkFfUEFHRSwgLTEpCisgICAgICAgICAgICAgICAgICAgID09IG9wdGlvbnMyLmdldEludChNZWRpYUJyb3dzZXIuRVhUUkFfUEFHRSwgLTEpCisgICAgICAgICAgICAgICAgICAgICYmIG9wdGlvbnMxLmdldEludChNZWRpYUJyb3dzZXIuRVhUUkFfUEFHRV9TSVpFLCAtMSkKKyAgICAgICAgICAgICAgICAgICAgPT0gb3B0aW9uczIuZ2V0SW50KE1lZGlhQnJvd3Nlci5FWFRSQV9QQUdFX1NJWkUsIC0xKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNEdXBsaWNhdGVkSXRlbXMoQnVuZGxlIG9wdGlvbnMxLCBCdW5kbGUgb3B0aW9uczIpIHsKKyAgICAgICAgaW50IHBhZ2UxID0gb3B0aW9uczEgPT0gbnVsbCA/IC0xIDogb3B0aW9uczEuZ2V0SW50KE1lZGlhQnJvd3Nlci5FWFRSQV9QQUdFLCAtMSk7CisgICAgICAgIGludCBwYWdlMiA9IG9wdGlvbnMyID09IG51bGwgPyAtMSA6IG9wdGlvbnMyLmdldEludChNZWRpYUJyb3dzZXIuRVhUUkFfUEFHRSwgLTEpOworICAgICAgICBpbnQgcGFnZVNpemUxID0gb3B0aW9uczEgPT0gbnVsbCA/IC0xIDogb3B0aW9uczEuZ2V0SW50KE1lZGlhQnJvd3Nlci5FWFRSQV9QQUdFX1NJWkUsIC0xKTsKKyAgICAgICAgaW50IHBhZ2VTaXplMiA9IG9wdGlvbnMyID09IG51bGwgPyAtMSA6IG9wdGlvbnMyLmdldEludChNZWRpYUJyb3dzZXIuRVhUUkFfUEFHRV9TSVpFLCAtMSk7CisKKyAgICAgICAgaW50IHN0YXJ0SW5kZXgxLCBzdGFydEluZGV4MiwgZW5kSW5kZXgxLCBlbmRJbmRleDI7CisgICAgICAgIGlmIChwYWdlMSA9PSAtMSB8fCBwYWdlU2l6ZTEgPT0gLTEpIHsKKyAgICAgICAgICAgIHN0YXJ0SW5kZXgxID0gMDsKKyAgICAgICAgICAgIGVuZEluZGV4MSA9IEludGVnZXIuTUFYX1ZBTFVFOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RhcnRJbmRleDEgPSBwYWdlU2l6ZTEgKiBwYWdlMTsKKyAgICAgICAgICAgIGVuZEluZGV4MSA9IHN0YXJ0SW5kZXgxICsgcGFnZVNpemUxIC0gMTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwYWdlMiA9PSAtMSB8fCBwYWdlU2l6ZTIgPT0gLTEpIHsKKyAgICAgICAgICAgIHN0YXJ0SW5kZXgyID0gMDsKKyAgICAgICAgICAgIGVuZEluZGV4MiA9IEludGVnZXIuTUFYX1ZBTFVFOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RhcnRJbmRleDIgPSBwYWdlU2l6ZTIgKiBwYWdlMjsKKyAgICAgICAgICAgIGVuZEluZGV4MiA9IHN0YXJ0SW5kZXgyICsgcGFnZVNpemUyIC0gMTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzdGFydEluZGV4MSA8PSBzdGFydEluZGV4MiAmJiBzdGFydEluZGV4MiA8PSBlbmRJbmRleDEpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9IGVsc2UgaWYgKHN0YXJ0SW5kZXgxIDw9IGVuZEluZGV4MiAmJiBlbmRJbmRleDIgPD0gZW5kSW5kZXgxKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL2FwZXgvamF2YS9hbmRyb2lkL21lZGlhL3Nlc3Npb24vSUFjdGl2ZVNlc3Npb25zTGlzdGVuZXIuYWlkbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9hcGV4L2phdmEvYW5kcm9pZC9tZWRpYS9zZXNzaW9uL0lBY3RpdmVTZXNzaW9uc0xpc3RlbmVyLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI5ZTRiZAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9hcGV4L2phdmEvYW5kcm9pZC9tZWRpYS9zZXNzaW9uL0lBY3RpdmVTZXNzaW9uc0xpc3RlbmVyLmFpZGwKQEAgLTAsMCArMSwyNiBAQAorLyogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhLnNlc3Npb247CisKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLnNlc3Npb24uTWVkaWFTZXNzaW9uOworCisvKioKKyAqIExpc3RlbnMgZm9yIGNoYW5nZXMgdG8gdGhlIGxpc3Qgb2YgYWN0aXZlIHNlc3Npb25zLgorICogQGhpZGUKKyAqLworb25ld2F5IGludGVyZmFjZSBJQWN0aXZlU2Vzc2lvbnNMaXN0ZW5lciB7CisgICAgdm9pZCBvbkFjdGl2ZVNlc3Npb25zQ2hhbmdlZChpbiBMaXN0PE1lZGlhU2Vzc2lvbi5Ub2tlbj4gc2Vzc2lvbnMpOworfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL2FwZXgvamF2YS9hbmRyb2lkL21lZGlhL3Nlc3Npb24vSUNhbGxiYWNrLmFpZGwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvYXBleC9qYXZhL2FuZHJvaWQvbWVkaWEvc2Vzc2lvbi9JQ2FsbGJhY2suYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjJiZmZhCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL2FwZXgvamF2YS9hbmRyb2lkL21lZGlhL3Nlc3Npb24vSUNhbGxiYWNrLmFpZGwKQEAgLTAsMCArMSwzNSBAQAorLyogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhLnNlc3Npb247CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOworaW1wb3J0IGFuZHJvaWQubWVkaWEuc2Vzc2lvbi5NZWRpYVNlc3Npb247CitpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OworCisvKioKKyAqIEBoaWRlCisgKi8KK29uZXdheSBpbnRlcmZhY2UgSUNhbGxiYWNrIHsKKyAgICB2b2lkIG9uTWVkaWFLZXlFdmVudERpc3BhdGNoZWRUb01lZGlhU2Vzc2lvbihpbiBLZXlFdmVudCBldmVudCwKKyAgICAgICAgICAgIGluIE1lZGlhU2Vzc2lvbi5Ub2tlbiBzZXNzaW9uVG9rZW4pOworICAgIHZvaWQgb25NZWRpYUtleUV2ZW50RGlzcGF0Y2hlZFRvTWVkaWFCdXR0b25SZWNlaXZlcihpbiBLZXlFdmVudCBldmVudCwKKyAgICAgICAgICAgIGluIENvbXBvbmVudE5hbWUgbWVkaWFCdXR0b25SZWNlaXZlcik7CisKKyAgICB2b2lkIG9uQWRkcmVzc2VkUGxheWVyQ2hhbmdlZFRvTWVkaWFTZXNzaW9uKGluIE1lZGlhU2Vzc2lvbi5Ub2tlbiBzZXNzaW9uVG9rZW4pOworICAgIHZvaWQgb25BZGRyZXNzZWRQbGF5ZXJDaGFuZ2VkVG9NZWRpYUJ1dHRvblJlY2VpdmVyKGluIENvbXBvbmVudE5hbWUgbWVkaWFCdXR0b25SZWNlaXZlcik7Cit9CisKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9hcGV4L2phdmEvYW5kcm9pZC9tZWRpYS9zZXNzaW9uL0lPbk1lZGlhS2V5TGlzdGVuZXIuYWlkbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9hcGV4L2phdmEvYW5kcm9pZC9tZWRpYS9zZXNzaW9uL0lPbk1lZGlhS2V5TGlzdGVuZXIuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTk4ZWEzCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL2FwZXgvamF2YS9hbmRyb2lkL21lZGlhL3Nlc3Npb24vSU9uTWVkaWFLZXlMaXN0ZW5lci5haWRsCkBAIC0wLDAgKzEsMjggQEAKKy8qIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYS5zZXNzaW9uOworCitpbXBvcnQgYW5kcm9pZC5vcy5SZXN1bHRSZWNlaXZlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CisKKy8qKgorICogTGlzdGVuZXIgdG8gaGFuZGxlIG1lZGlhIGtleS4KKyAqIEBoaWRlCisgKi8KK29uZXdheSBpbnRlcmZhY2UgSU9uTWVkaWFLZXlMaXN0ZW5lciB7CisgICAgdm9pZCBvbk1lZGlhS2V5KGluIEtleUV2ZW50IGV2ZW50LCBpbiBSZXN1bHRSZWNlaXZlciByZXN1bHQpOworfQorCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvYXBleC9qYXZhL2FuZHJvaWQvbWVkaWEvc2Vzc2lvbi9JT25Wb2x1bWVLZXlMb25nUHJlc3NMaXN0ZW5lci5haWRsIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL2FwZXgvamF2YS9hbmRyb2lkL21lZGlhL3Nlc3Npb24vSU9uVm9sdW1lS2V5TG9uZ1ByZXNzTGlzdGVuZXIuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2I4MzQ3Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL2FwZXgvamF2YS9hbmRyb2lkL21lZGlhL3Nlc3Npb24vSU9uVm9sdW1lS2V5TG9uZ1ByZXNzTGlzdGVuZXIuYWlkbApAQCAtMCwwICsxLDI3IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWEuc2Vzc2lvbjsKKworaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKKworLyoqCisgKiBMaXN0ZW5lciB0byBoYW5kbGUgdm9sdW1lIGtleSBsb25nLXByZXNzLgorICogQGhpZGUKKyAqLworb25ld2F5IGludGVyZmFjZSBJT25Wb2x1bWVLZXlMb25nUHJlc3NMaXN0ZW5lciB7CisgICAgdm9pZCBvblZvbHVtZUtleUxvbmdQcmVzcyhpbiBLZXlFdmVudCBldmVudCk7Cit9CisKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9hcGV4L2phdmEvYW5kcm9pZC9tZWRpYS9zZXNzaW9uL0lTZXNzaW9uLmFpZGwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvYXBleC9qYXZhL2FuZHJvaWQvbWVkaWEvc2Vzc2lvbi9JU2Vzc2lvbi5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiZDkzY2IKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvYXBleC9qYXZhL2FuZHJvaWQvbWVkaWEvc2Vzc2lvbi9JU2Vzc2lvbi5haWRsCkBAIC0wLDAgKzEsNTUgQEAKKy8qIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYS5zZXNzaW9uOworCitpbXBvcnQgYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFyY2VsZWRMaXN0U2xpY2U7CisvL2ltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvQXR0cmlidXRlczsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTWV0YWRhdGE7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5zZXNzaW9uLklTZXNzaW9uQ29udHJvbGxlcjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLnNlc3Npb24uUGxheWJhY2tTdGF0ZTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLnNlc3Npb24uTWVkaWFTZXNzaW9uOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuUmVzdWx0UmVjZWl2ZXI7CisKKy8qKgorICogSW50ZXJmYWNlIHRvIGEgTWVkaWFTZXNzaW9uIGluIHRoZSBzeXN0ZW0uCisgKiBAaGlkZQorICovCitpbnRlcmZhY2UgSVNlc3Npb24geworICAgIHZvaWQgc2VuZEV2ZW50KFN0cmluZyBldmVudCwgaW4gQnVuZGxlIGRhdGEpOworICAgIElTZXNzaW9uQ29udHJvbGxlciBnZXRDb250cm9sbGVyKCk7CisgICAgdm9pZCBzZXRGbGFncyhpbnQgZmxhZ3MpOworICAgIHZvaWQgc2V0QWN0aXZlKGJvb2xlYW4gYWN0aXZlKTsKKyAgICB2b2lkIHNldE1lZGlhQnV0dG9uUmVjZWl2ZXIoaW4gUGVuZGluZ0ludGVudCBtYnIpOworICAgIHZvaWQgc2V0TGF1bmNoUGVuZGluZ0ludGVudChpbiBQZW5kaW5nSW50ZW50IHBpKTsKKyAgICB2b2lkIGRlc3Ryb3koKTsKKworICAgIC8vIFRoZXNlIGNvbW1hbmRzIGFyZSBmb3IgdGhlIFRyYW5zcG9ydFBlcmZvcm1lcgorICAgIHZvaWQgc2V0TWV0YWRhdGEoaW4gTWVkaWFNZXRhZGF0YSBtZXRhZGF0YSk7CisgICAgdm9pZCBzZXRQbGF5YmFja1N0YXRlKGluIFBsYXliYWNrU3RhdGUgc3RhdGUpOworICAgIC8vVE9ETyhiLzExOTc1MDgwNyk6IFJlc29sdmUgaGlkZGVuIEFQSSB1c2FnZSBQYXJjZWxlZExpc3RTbGljZS4KKyAgICAvL3ZvaWQgc2V0UXVldWUoaW4gUGFyY2VsZWRMaXN0U2xpY2UgcXVldWUpOworICAgIHZvaWQgc2V0UXVldWVUaXRsZShDaGFyU2VxdWVuY2UgdGl0bGUpOworICAgIHZvaWQgc2V0RXh0cmFzKGluIEJ1bmRsZSBleHRyYXMpOworICAgIHZvaWQgc2V0UmF0aW5nVHlwZShpbnQgdHlwZSk7CisKKyAgICAvLyBUaGVzZSBjb21tYW5kcyByZWxhdGUgdG8gdm9sdW1lIGhhbmRsaW5nCisgICAgLy9UT0RPKGIvMTE5NzUxNTkyKTogRGVjaWRlIGlmIEF1ZGlvQXR0cmlidXRlcyBzaG91bGQgYmUgdXBkYXRlZC4KKyAgICAvL3ZvaWQgc2V0UGxheWJhY2tUb0xvY2FsKGluIEF1ZGlvQXR0cmlidXRlcyBhdHRyaWJ1dGVzKTsKKyAgICB2b2lkIHNldFBsYXliYWNrVG9SZW1vdGUoaW50IGNvbnRyb2wsIGludCBtYXgpOworICAgIHZvaWQgc2V0Q3VycmVudFZvbHVtZShpbnQgY3VycmVudFZvbHVtZSk7Cit9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvYXBleC9qYXZhL2FuZHJvaWQvbWVkaWEvc2Vzc2lvbi9JU2Vzc2lvbkNhbGxiYWNrLmFpZGwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvYXBleC9qYXZhL2FuZHJvaWQvbWVkaWEvc2Vzc2lvbi9JU2Vzc2lvbkNhbGxiYWNrLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI2MzM4ZAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9hcGV4L2phdmEvYW5kcm9pZC9tZWRpYS9zZXNzaW9uL0lTZXNzaW9uQ2FsbGJhY2suYWlkbApAQCAtMCwwICsxLDcxIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWEuc2Vzc2lvbjsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5SYXRpbmc7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5zZXNzaW9uLklTZXNzaW9uQ29udHJvbGxlckNhbGxiYWNrOworaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlc3VsdFJlY2VpdmVyOworCisvKioKKyAqIEBoaWRlCisgKi8KK29uZXdheSBpbnRlcmZhY2UgSVNlc3Npb25DYWxsYmFjayB7CisgICAgdm9pZCBvbkNvbW1hbmQoU3RyaW5nIHBhY2thZ2VOYW1lLCBpbnQgcGlkLCBpbnQgdWlkLCBJU2Vzc2lvbkNvbnRyb2xsZXJDYWxsYmFjayBjYWxsZXIsCisgICAgICAgICAgICBTdHJpbmcgY29tbWFuZCwgaW4gQnVuZGxlIGFyZ3MsIGluIFJlc3VsdFJlY2VpdmVyIGNiKTsKKyAgICB2b2lkIG9uTWVkaWFCdXR0b24oU3RyaW5nIHBhY2thZ2VOYW1lLCBpbnQgcGlkLCBpbnQgdWlkLCBpbiBJbnRlbnQgbWVkaWFCdXR0b25JbnRlbnQsCisgICAgICAgICAgICBpbnQgc2VxdWVuY2VOdW1iZXIsIGluIFJlc3VsdFJlY2VpdmVyIGNiKTsKKyAgICB2b2lkIG9uTWVkaWFCdXR0b25Gcm9tQ29udHJvbGxlcihTdHJpbmcgcGFja2FnZU5hbWUsIGludCBwaWQsIGludCB1aWQsCisgICAgICAgICAgICBJU2Vzc2lvbkNvbnRyb2xsZXJDYWxsYmFjayBjYWxsZXIsIGluIEludGVudCBtZWRpYUJ1dHRvbkludGVudCk7CisKKyAgICAvLyBUaGVzZSBjYWxsYmFja3MgYXJlIGZvciB0aGUgVHJhbnNwb3J0UGVyZm9ybWVyCisgICAgdm9pZCBvblByZXBhcmUoU3RyaW5nIHBhY2thZ2VOYW1lLCBpbnQgcGlkLCBpbnQgdWlkLCBJU2Vzc2lvbkNvbnRyb2xsZXJDYWxsYmFjayBjYWxsZXIpOworICAgIHZvaWQgb25QcmVwYXJlRnJvbU1lZGlhSWQoU3RyaW5nIHBhY2thZ2VOYW1lLCBpbnQgcGlkLCBpbnQgdWlkLAorICAgICAgICAgICAgSVNlc3Npb25Db250cm9sbGVyQ2FsbGJhY2sgY2FsbGVyLCBTdHJpbmcgbWVkaWFJZCwgaW4gQnVuZGxlIGV4dHJhcyk7CisgICAgdm9pZCBvblByZXBhcmVGcm9tU2VhcmNoKFN0cmluZyBwYWNrYWdlTmFtZSwgaW50IHBpZCwgaW50IHVpZCwKKyAgICAgICAgICAgIElTZXNzaW9uQ29udHJvbGxlckNhbGxiYWNrIGNhbGxlciwgU3RyaW5nIHF1ZXJ5LCBpbiBCdW5kbGUgZXh0cmFzKTsKKyAgICB2b2lkIG9uUHJlcGFyZUZyb21VcmkoU3RyaW5nIHBhY2thZ2VOYW1lLCBpbnQgcGlkLCBpbnQgdWlkLCBJU2Vzc2lvbkNvbnRyb2xsZXJDYWxsYmFjayBjYWxsZXIsCisgICAgICAgICAgICBpbiBVcmkgdXJpLCBpbiBCdW5kbGUgZXh0cmFzKTsKKyAgICB2b2lkIG9uUGxheShTdHJpbmcgcGFja2FnZU5hbWUsIGludCBwaWQsIGludCB1aWQsIElTZXNzaW9uQ29udHJvbGxlckNhbGxiYWNrIGNhbGxlcik7CisgICAgdm9pZCBvblBsYXlGcm9tTWVkaWFJZChTdHJpbmcgcGFja2FnZU5hbWUsIGludCBwaWQsIGludCB1aWQsIElTZXNzaW9uQ29udHJvbGxlckNhbGxiYWNrIGNhbGxlciwKKyAgICAgICAgICAgIFN0cmluZyBtZWRpYUlkLCBpbiBCdW5kbGUgZXh0cmFzKTsKKyAgICB2b2lkIG9uUGxheUZyb21TZWFyY2goU3RyaW5nIHBhY2thZ2VOYW1lLCBpbnQgcGlkLCBpbnQgdWlkLCBJU2Vzc2lvbkNvbnRyb2xsZXJDYWxsYmFjayBjYWxsZXIsCisgICAgICAgICAgICBTdHJpbmcgcXVlcnksIGluIEJ1bmRsZSBleHRyYXMpOworICAgIHZvaWQgb25QbGF5RnJvbVVyaShTdHJpbmcgcGFja2FnZU5hbWUsIGludCBwaWQsIGludCB1aWQsIElTZXNzaW9uQ29udHJvbGxlckNhbGxiYWNrIGNhbGxlciwKKyAgICAgICAgICAgIGluIFVyaSB1cmksIGluIEJ1bmRsZSBleHRyYXMpOworICAgIHZvaWQgb25Ta2lwVG9UcmFjayhTdHJpbmcgcGFja2FnZU5hbWUsIGludCBwaWQsIGludCB1aWQsIElTZXNzaW9uQ29udHJvbGxlckNhbGxiYWNrIGNhbGxlciwKKyAgICAgICAgICAgIGxvbmcgaWQpOworICAgIHZvaWQgb25QYXVzZShTdHJpbmcgcGFja2FnZU5hbWUsIGludCBwaWQsIGludCB1aWQsIElTZXNzaW9uQ29udHJvbGxlckNhbGxiYWNrIGNhbGxlcik7CisgICAgdm9pZCBvblN0b3AoU3RyaW5nIHBhY2thZ2VOYW1lLCBpbnQgcGlkLCBpbnQgdWlkLCBJU2Vzc2lvbkNvbnRyb2xsZXJDYWxsYmFjayBjYWxsZXIpOworICAgIHZvaWQgb25OZXh0KFN0cmluZyBwYWNrYWdlTmFtZSwgaW50IHBpZCwgaW50IHVpZCwgSVNlc3Npb25Db250cm9sbGVyQ2FsbGJhY2sgY2FsbGVyKTsKKyAgICB2b2lkIG9uUHJldmlvdXMoU3RyaW5nIHBhY2thZ2VOYW1lLCBpbnQgcGlkLCBpbnQgdWlkLCBJU2Vzc2lvbkNvbnRyb2xsZXJDYWxsYmFjayBjYWxsZXIpOworICAgIHZvaWQgb25GYXN0Rm9yd2FyZChTdHJpbmcgcGFja2FnZU5hbWUsIGludCBwaWQsIGludCB1aWQsIElTZXNzaW9uQ29udHJvbGxlckNhbGxiYWNrIGNhbGxlcik7CisgICAgdm9pZCBvblJld2luZChTdHJpbmcgcGFja2FnZU5hbWUsIGludCBwaWQsIGludCB1aWQsIElTZXNzaW9uQ29udHJvbGxlckNhbGxiYWNrIGNhbGxlcik7CisgICAgdm9pZCBvblNlZWtUbyhTdHJpbmcgcGFja2FnZU5hbWUsIGludCBwaWQsIGludCB1aWQsIElTZXNzaW9uQ29udHJvbGxlckNhbGxiYWNrIGNhbGxlciwKKyAgICAgICAgICAgIGxvbmcgcG9zKTsKKyAgICB2b2lkIG9uUmF0ZShTdHJpbmcgcGFja2FnZU5hbWUsIGludCBwaWQsIGludCB1aWQsIElTZXNzaW9uQ29udHJvbGxlckNhbGxiYWNrIGNhbGxlciwKKyAgICAgICAgICAgIGluIFJhdGluZyByYXRpbmcpOworICAgIHZvaWQgb25DdXN0b21BY3Rpb24oU3RyaW5nIHBhY2thZ2VOYW1lLCBpbnQgcGlkLCBpbnQgdWlkLCBJU2Vzc2lvbkNvbnRyb2xsZXJDYWxsYmFjayBjYWxsZXIsCisgICAgICAgICAgICBTdHJpbmcgYWN0aW9uLCBpbiBCdW5kbGUgYXJncyk7CisKKyAgICAvLyBUaGVzZSBjYWxsYmFja3MgYXJlIGZvciB2b2x1bWUgaGFuZGxpbmcKKyAgICB2b2lkIG9uQWRqdXN0Vm9sdW1lKFN0cmluZyBwYWNrYWdlTmFtZSwgaW50IHBpZCwgaW50IHVpZCwgSVNlc3Npb25Db250cm9sbGVyQ2FsbGJhY2sgY2FsbGVyLAorICAgICAgICAgICAgaW50IGRpcmVjdGlvbik7CisgICAgdm9pZCBvblNldFZvbHVtZVRvKFN0cmluZyBwYWNrYWdlTmFtZSwgaW50IHBpZCwgaW50IHVpZCwKKyAgICAgICAgICAgIElTZXNzaW9uQ29udHJvbGxlckNhbGxiYWNrIGNhbGxlciwgaW50IHZhbHVlKTsKK30KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9hcGV4L2phdmEvYW5kcm9pZC9tZWRpYS9zZXNzaW9uL0lTZXNzaW9uQ29udHJvbGxlci5haWRsIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL2FwZXgvamF2YS9hbmRyb2lkL21lZGlhL3Nlc3Npb24vSVNlc3Npb25Db250cm9sbGVyLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDMxYTM4OAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9hcGV4L2phdmEvYW5kcm9pZC9tZWRpYS9zZXNzaW9uL0lTZXNzaW9uQ29udHJvbGxlci5haWRsCkBAIC0wLDAgKzEsODkgQEAKKy8qIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYS5zZXNzaW9uOworCitpbXBvcnQgYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworLy9pbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhcmNlbGVkTGlzdFNsaWNlOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFNZXRhZGF0YTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLlJhdGluZzsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLnNlc3Npb24uSVNlc3Npb25Db250cm9sbGVyQ2FsbGJhY2s7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5zZXNzaW9uLk1lZGlhU2Vzc2lvbjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLnNlc3Npb24uUGFyY2VsYWJsZVZvbHVtZUluZm87CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5zZXNzaW9uLlBsYXliYWNrU3RhdGU7CitpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuUmVzdWx0UmVjZWl2ZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogSW50ZXJmYWNlIHRvIE1lZGlhU2Vzc2lvblJlY29yZCBpbiB0aGUgc3lzdGVtLgorICogQGhpZGUKKyAqLworaW50ZXJmYWNlIElTZXNzaW9uQ29udHJvbGxlciB7CisgICAgdm9pZCBzZW5kQ29tbWFuZChTdHJpbmcgcGFja2FnZU5hbWUsIElTZXNzaW9uQ29udHJvbGxlckNhbGxiYWNrIGNhbGxlciwKKyAgICAgICAgICAgIFN0cmluZyBjb21tYW5kLCBpbiBCdW5kbGUgYXJncywgaW4gUmVzdWx0UmVjZWl2ZXIgY2IpOworICAgIGJvb2xlYW4gc2VuZE1lZGlhQnV0dG9uKFN0cmluZyBwYWNrYWdlTmFtZSwgSVNlc3Npb25Db250cm9sbGVyQ2FsbGJhY2sgY2FsbGVyLAorICAgICAgICAgICAgYm9vbGVhbiBhc1N5c3RlbVNlcnZpY2UsIGluIEtleUV2ZW50IG1lZGlhQnV0dG9uKTsKKyAgICB2b2lkIHJlZ2lzdGVyQ2FsbGJhY2tMaXN0ZW5lcihTdHJpbmcgcGFja2FnZU5hbWUsIElTZXNzaW9uQ29udHJvbGxlckNhbGxiYWNrIGNiKTsKKyAgICB2b2lkIHVucmVnaXN0ZXJDYWxsYmFja0xpc3RlbmVyKElTZXNzaW9uQ29udHJvbGxlckNhbGxiYWNrIGNiKTsKKyAgICBib29sZWFuIGlzVHJhbnNwb3J0Q29udHJvbEVuYWJsZWQoKTsKKyAgICBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoKTsKKyAgICBTdHJpbmcgZ2V0VGFnKCk7CisgICAgUGVuZGluZ0ludGVudCBnZXRMYXVuY2hQZW5kaW5nSW50ZW50KCk7CisgICAgbG9uZyBnZXRGbGFncygpOworICAgIFBhcmNlbGFibGVWb2x1bWVJbmZvIGdldFZvbHVtZUF0dHJpYnV0ZXMoKTsKKyAgICB2b2lkIGFkanVzdFZvbHVtZShTdHJpbmcgcGFja2FnZU5hbWUsIElTZXNzaW9uQ29udHJvbGxlckNhbGxiYWNrIGNhbGxlciwKKyAgICAgICAgICAgIGJvb2xlYW4gYXNTeXN0ZW1TZXJ2aWNlLCBpbnQgZGlyZWN0aW9uLCBpbnQgZmxhZ3MpOworICAgIHZvaWQgc2V0Vm9sdW1lVG8oU3RyaW5nIHBhY2thZ2VOYW1lLCBJU2Vzc2lvbkNvbnRyb2xsZXJDYWxsYmFjayBjYWxsZXIsCisgICAgICAgICAgICBpbnQgdmFsdWUsIGludCBmbGFncyk7CisKKyAgICAvLyBUaGVzZSBjb21tYW5kcyBhcmUgZm9yIHRoZSBUcmFuc3BvcnRDb250cm9scworICAgIHZvaWQgcHJlcGFyZShTdHJpbmcgcGFja2FnZU5hbWUsIElTZXNzaW9uQ29udHJvbGxlckNhbGxiYWNrIGNhbGxlcik7CisgICAgdm9pZCBwcmVwYXJlRnJvbU1lZGlhSWQoU3RyaW5nIHBhY2thZ2VOYW1lLCBJU2Vzc2lvbkNvbnRyb2xsZXJDYWxsYmFjayBjYWxsZXIsCisgICAgICAgICAgICBTdHJpbmcgbWVkaWFJZCwgaW4gQnVuZGxlIGV4dHJhcyk7CisgICAgdm9pZCBwcmVwYXJlRnJvbVNlYXJjaChTdHJpbmcgcGFja2FnZU5hbWUsIElTZXNzaW9uQ29udHJvbGxlckNhbGxiYWNrIGNhbGxlciwKKyAgICAgICAgICAgIFN0cmluZyBzdHJpbmcsIGluIEJ1bmRsZSBleHRyYXMpOworICAgIHZvaWQgcHJlcGFyZUZyb21VcmkoU3RyaW5nIHBhY2thZ2VOYW1lLCBJU2Vzc2lvbkNvbnRyb2xsZXJDYWxsYmFjayBjYWxsZXIsCisgICAgICAgICAgICBpbiBVcmkgdXJpLCBpbiBCdW5kbGUgZXh0cmFzKTsKKyAgICB2b2lkIHBsYXkoU3RyaW5nIHBhY2thZ2VOYW1lLCBJU2Vzc2lvbkNvbnRyb2xsZXJDYWxsYmFjayBjYWxsZXIpOworICAgIHZvaWQgcGxheUZyb21NZWRpYUlkKFN0cmluZyBwYWNrYWdlTmFtZSwgSVNlc3Npb25Db250cm9sbGVyQ2FsbGJhY2sgY2FsbGVyLAorICAgICAgICAgICAgU3RyaW5nIG1lZGlhSWQsIGluIEJ1bmRsZSBleHRyYXMpOworICAgIHZvaWQgcGxheUZyb21TZWFyY2goU3RyaW5nIHBhY2thZ2VOYW1lLCBJU2Vzc2lvbkNvbnRyb2xsZXJDYWxsYmFjayBjYWxsZXIsCisgICAgICAgICAgICBTdHJpbmcgc3RyaW5nLCBpbiBCdW5kbGUgZXh0cmFzKTsKKyAgICB2b2lkIHBsYXlGcm9tVXJpKFN0cmluZyBwYWNrYWdlTmFtZSwgSVNlc3Npb25Db250cm9sbGVyQ2FsbGJhY2sgY2FsbGVyLAorICAgICAgICAgICAgaW4gVXJpIHVyaSwgaW4gQnVuZGxlIGV4dHJhcyk7CisgICAgdm9pZCBza2lwVG9RdWV1ZUl0ZW0oU3RyaW5nIHBhY2thZ2VOYW1lLCBJU2Vzc2lvbkNvbnRyb2xsZXJDYWxsYmFjayBjYWxsZXIsIGxvbmcgaWQpOworICAgIHZvaWQgcGF1c2UoU3RyaW5nIHBhY2thZ2VOYW1lLCBJU2Vzc2lvbkNvbnRyb2xsZXJDYWxsYmFjayBjYWxsZXIpOworICAgIHZvaWQgc3RvcChTdHJpbmcgcGFja2FnZU5hbWUsIElTZXNzaW9uQ29udHJvbGxlckNhbGxiYWNrIGNhbGxlcik7CisgICAgdm9pZCBuZXh0KFN0cmluZyBwYWNrYWdlTmFtZSwgSVNlc3Npb25Db250cm9sbGVyQ2FsbGJhY2sgY2FsbGVyKTsKKyAgICB2b2lkIHByZXZpb3VzKFN0cmluZyBwYWNrYWdlTmFtZSwgSVNlc3Npb25Db250cm9sbGVyQ2FsbGJhY2sgY2FsbGVyKTsKKyAgICB2b2lkIGZhc3RGb3J3YXJkKFN0cmluZyBwYWNrYWdlTmFtZSwgSVNlc3Npb25Db250cm9sbGVyQ2FsbGJhY2sgY2FsbGVyKTsKKyAgICB2b2lkIHJld2luZChTdHJpbmcgcGFja2FnZU5hbWUsIElTZXNzaW9uQ29udHJvbGxlckNhbGxiYWNrIGNhbGxlcik7CisgICAgdm9pZCBzZWVrVG8oU3RyaW5nIHBhY2thZ2VOYW1lLCBJU2Vzc2lvbkNvbnRyb2xsZXJDYWxsYmFjayBjYWxsZXIsIGxvbmcgcG9zKTsKKyAgICB2b2lkIHJhdGUoU3RyaW5nIHBhY2thZ2VOYW1lLCBJU2Vzc2lvbkNvbnRyb2xsZXJDYWxsYmFjayBjYWxsZXIsIGluIFJhdGluZyByYXRpbmcpOworICAgIHZvaWQgc2VuZEN1c3RvbUFjdGlvbihTdHJpbmcgcGFja2FnZU5hbWUsIElTZXNzaW9uQ29udHJvbGxlckNhbGxiYWNrIGNhbGxlciwKKyAgICAgICAgICAgIFN0cmluZyBhY3Rpb24sIGluIEJ1bmRsZSBhcmdzKTsKKyAgICBNZWRpYU1ldGFkYXRhIGdldE1ldGFkYXRhKCk7CisgICAgUGxheWJhY2tTdGF0ZSBnZXRQbGF5YmFja1N0YXRlKCk7CisgICAgLy9UT0RPOihiLzExOTc1MDgwNykgUmVzb2x2ZSBoaWRkZW4gQVBJIHVzYWdlIFBhcmNlbGVkTGlzdFNsaWNlLgorICAgIC8vUGFyY2VsZWRMaXN0U2xpY2UgZ2V0UXVldWUoKTsKKyAgICBDaGFyU2VxdWVuY2UgZ2V0UXVldWVUaXRsZSgpOworICAgIEJ1bmRsZSBnZXRFeHRyYXMoKTsKKyAgICBpbnQgZ2V0UmF0aW5nVHlwZSgpOworfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL2FwZXgvamF2YS9hbmRyb2lkL21lZGlhL3Nlc3Npb24vSVNlc3Npb25Db250cm9sbGVyQ2FsbGJhY2suYWlkbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9hcGV4L2phdmEvYW5kcm9pZC9tZWRpYS9zZXNzaW9uL0lTZXNzaW9uQ29udHJvbGxlckNhbGxiYWNrLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTczNTA0YgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9hcGV4L2phdmEvYW5kcm9pZC9tZWRpYS9zZXNzaW9uL0lTZXNzaW9uQ29udHJvbGxlckNhbGxiYWNrLmFpZGwKQEAgLTAsMCArMSw0MCBAQAorLyogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhLnNlc3Npb247CisKKy8vaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYXJjZWxlZExpc3RTbGljZTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTWV0YWRhdGE7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5zZXNzaW9uLlBhcmNlbGFibGVWb2x1bWVJbmZvOworaW1wb3J0IGFuZHJvaWQubWVkaWEuc2Vzc2lvbi5QbGF5YmFja1N0YXRlOworaW1wb3J0IGFuZHJvaWQubWVkaWEuc2Vzc2lvbi5NZWRpYVNlc3Npb247CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CisKKy8qKgorICogQGhpZGUKKyAqLworb25ld2F5IGludGVyZmFjZSBJU2Vzc2lvbkNvbnRyb2xsZXJDYWxsYmFjayB7CisgICAgdm9pZCBvbkV2ZW50KFN0cmluZyBldmVudCwgaW4gQnVuZGxlIGV4dHJhcyk7CisgICAgdm9pZCBvblNlc3Npb25EZXN0cm95ZWQoKTsKKworICAgIC8vIFRoZXNlIGNhbGxiYWNrcyBhcmUgZm9yIHRoZSBUcmFuc3BvcnRDb250cm9sbGVyCisgICAgdm9pZCBvblBsYXliYWNrU3RhdGVDaGFuZ2VkKGluIFBsYXliYWNrU3RhdGUgc3RhdGUpOworICAgIHZvaWQgb25NZXRhZGF0YUNoYW5nZWQoaW4gTWVkaWFNZXRhZGF0YSBtZXRhZGF0YSk7CisgICAgLy9UT0RPOihiLzExOTc1MDgwNykgUmVzb2x2ZSBoaWRkZW4gQVBJIHVzYWdlIFBhcmNlbGVkTGlzdFNsaWNlLgorICAgIC8vdm9pZCBvblF1ZXVlQ2hhbmdlZChpbiBQYXJjZWxlZExpc3RTbGljZSBxdWV1ZSk7CisgICAgdm9pZCBvblF1ZXVlVGl0bGVDaGFuZ2VkKENoYXJTZXF1ZW5jZSB0aXRsZSk7CisgICAgdm9pZCBvbkV4dHJhc0NoYW5nZWQoaW4gQnVuZGxlIGV4dHJhcyk7CisgICAgdm9pZCBvblZvbHVtZUluZm9DaGFuZ2VkKGluIFBhcmNlbGFibGVWb2x1bWVJbmZvIGluZm8pOworfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL2FwZXgvamF2YS9hbmRyb2lkL21lZGlhL3Nlc3Npb24vSVNlc3Npb25NYW5hZ2VyLmFpZGwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvYXBleC9qYXZhL2FuZHJvaWQvbWVkaWEvc2Vzc2lvbi9JU2Vzc2lvbk1hbmFnZXIuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTc4YzE2Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL2FwZXgvamF2YS9hbmRyb2lkL21lZGlhL3Nlc3Npb24vSVNlc3Npb25NYW5hZ2VyLmFpZGwKQEAgLTAsMCArMSw2NiBAQAorLyogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhLnNlc3Npb247CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLklSZW1vdGVWb2x1bWVDb250cm9sbGVyOworaW1wb3J0IGFuZHJvaWQubWVkaWEuSVNlc3Npb25Ub2tlbnNMaXN0ZW5lcjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLnNlc3Npb24uSUFjdGl2ZVNlc3Npb25zTGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5zZXNzaW9uLklDYWxsYmFjazsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLnNlc3Npb24uSU9uTWVkaWFLZXlMaXN0ZW5lcjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLnNlc3Npb24uSU9uVm9sdW1lS2V5TG9uZ1ByZXNzTGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5zZXNzaW9uLklTZXNzaW9uOworaW1wb3J0IGFuZHJvaWQubWVkaWEuc2Vzc2lvbi5JU2Vzc2lvbkNhbGxiYWNrOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKKworLyoqCisgKiBJbnRlcmZhY2UgdG8gdGhlIE1lZGlhU2Vzc2lvbk1hbmFnZXJTZXJ2aWNlCisgKiBAaGlkZQorICovCitpbnRlcmZhY2UgSVNlc3Npb25NYW5hZ2VyIHsKKyAgICBJU2Vzc2lvbiBjcmVhdGVTZXNzaW9uKFN0cmluZyBwYWNrYWdlTmFtZSwgaW4gSVNlc3Npb25DYWxsYmFjayBjYiwgU3RyaW5nIHRhZywgaW50IHVzZXJJZCk7CisgICAgTGlzdDxJQmluZGVyPiBnZXRTZXNzaW9ucyhpbiBDb21wb25lbnROYW1lIGNvbXBOYW1lLCBpbnQgdXNlcklkKTsKKyAgICB2b2lkIGRpc3BhdGNoTWVkaWFLZXlFdmVudChTdHJpbmcgcGFja2FnZU5hbWUsIGJvb2xlYW4gYXNTeXN0ZW1TZXJ2aWNlLCBpbiBLZXlFdmVudCBrZXlFdmVudCwKKyAgICAgICAgICAgIGJvb2xlYW4gbmVlZFdha2VMb2NrKTsKKyAgICB2b2lkIGRpc3BhdGNoVm9sdW1lS2V5RXZlbnQoU3RyaW5nIHBhY2thZ2VOYW1lLCBib29sZWFuIGFzU3lzdGVtU2VydmljZSwgaW4gS2V5RXZlbnQga2V5RXZlbnQsCisgICAgICAgICAgICBpbnQgc3RyZWFtLCBib29sZWFuIG11c2ljT25seSk7CisgICAgdm9pZCBkaXNwYXRjaEFkanVzdFZvbHVtZShTdHJpbmcgcGFja2FnZU5hbWUsIGludCBzdWdnZXN0ZWRTdHJlYW0sIGludCBkZWx0YSwgaW50IGZsYWdzKTsKKyAgICB2b2lkIGFkZFNlc3Npb25zTGlzdGVuZXIoaW4gSUFjdGl2ZVNlc3Npb25zTGlzdGVuZXIgbGlzdGVuZXIsIGluIENvbXBvbmVudE5hbWUgY29tcE5hbWUsCisgICAgICAgICAgICBpbnQgdXNlcklkKTsKKyAgICB2b2lkIHJlbW92ZVNlc3Npb25zTGlzdGVuZXIoaW4gSUFjdGl2ZVNlc3Npb25zTGlzdGVuZXIgbGlzdGVuZXIpOworCisgICAgLy8gVGhpcyBpcyBmb3IgdGhlIHN5c3RlbSB2b2x1bWUgVUkgb25seQorICAgIHZvaWQgc2V0UmVtb3RlVm9sdW1lQ29udHJvbGxlcihpbiBJUmVtb3RlVm9sdW1lQ29udHJvbGxlciBydmMpOworCisgICAgLy8gRm9yIFBob25lV2luZG93TWFuYWdlciB0byBwcmVjaGVjayBtZWRpYSBrZXlzCisgICAgYm9vbGVhbiBpc0dsb2JhbFByaW9yaXR5QWN0aXZlKCk7CisKKyAgICB2b2lkIHNldENhbGxiYWNrKGluIElDYWxsYmFjayBjYWxsYmFjayk7CisgICAgdm9pZCBzZXRPblZvbHVtZUtleUxvbmdQcmVzc0xpc3RlbmVyKGluIElPblZvbHVtZUtleUxvbmdQcmVzc0xpc3RlbmVyIGxpc3RlbmVyKTsKKyAgICB2b2lkIHNldE9uTWVkaWFLZXlMaXN0ZW5lcihpbiBJT25NZWRpYUtleUxpc3RlbmVyIGxpc3RlbmVyKTsKKworICAgIC8vIE1lZGlhU2Vzc2lvbjIKKyAgICBib29sZWFuIGlzVHJ1c3RlZChTdHJpbmcgY29udHJvbGxlclBhY2thZ2VOYW1lLCBpbnQgY29udHJvbGxlclBpZCwgaW50IGNvbnRyb2xsZXJVaWQpOworICAgIGJvb2xlYW4gY3JlYXRlU2Vzc2lvbjIoaW4gQnVuZGxlIHNlc3Npb25Ub2tlbik7CisgICAgdm9pZCBkZXN0cm95U2Vzc2lvbjIoaW4gQnVuZGxlIHNlc3Npb25Ub2tlbik7CisgICAgTGlzdDxCdW5kbGU+IGdldFNlc3Npb25Ub2tlbnMoYm9vbGVhbiBhY3RpdmVTZXNzaW9uT25seSwgYm9vbGVhbiBzZXNzaW9uU2VydmljZU9ubHksCisgICAgICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUpOworCisgICAgdm9pZCBhZGRTZXNzaW9uVG9rZW5zTGlzdGVuZXIoaW4gSVNlc3Npb25Ub2tlbnNMaXN0ZW5lciBsaXN0ZW5lciwgaW50IHVzZXJJZCwKKyAgICAgICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSk7CisgICAgdm9pZCByZW1vdmVTZXNzaW9uVG9rZW5zTGlzdGVuZXIoaW4gSVNlc3Npb25Ub2tlbnNMaXN0ZW5lciBsaXN0ZW5lciwgU3RyaW5nIHBhY2thZ2VOYW1lKTsKK30KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9hcGV4L2phdmEvYW5kcm9pZC9tZWRpYS9zZXNzaW9uL01lZGlhQ29udHJvbGxlci5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL2FwZXgvamF2YS9hbmRyb2lkL21lZGlhL3Nlc3Npb24vTWVkaWFDb250cm9sbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFiNTdlMwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9hcGV4L2phdmEvYW5kcm9pZC9tZWRpYS9zZXNzaW9uL01lZGlhQ29udHJvbGxlci5qYXZhCkBAIC0wLDAgKzEsMTE5NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYS5zZXNzaW9uOworCitpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLk5vbk51bGw7CitpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLk51bGxhYmxlOworaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5VbnN1cHBvcnRlZEFwcFVzYWdlOworaW1wb3J0IGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CisvL2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFyY2VsZWRMaXN0U2xpY2U7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb0F0dHJpYnV0ZXM7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb01hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYU1ldGFkYXRhOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFVdGlsczsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLlJhdGluZzsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLlZvbHVtZVByb3ZpZGVyOworaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5Mb29wZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQub3MuUmVzdWx0UmVjZWl2ZXI7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKKworaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIEFsbG93cyBhbiBhcHAgdG8gaW50ZXJhY3Qgd2l0aCBhbiBvbmdvaW5nIG1lZGlhIHNlc3Npb24uIE1lZGlhIGJ1dHRvbnMgYW5kCisgKiBvdGhlciBjb21tYW5kcyBjYW4gYmUgc2VudCB0byB0aGUgc2Vzc2lvbi4gQSBjYWxsYmFjayBtYXkgYmUgcmVnaXN0ZXJlZCB0bworICogcmVjZWl2ZSB1cGRhdGVzIGZyb20gdGhlIHNlc3Npb24sIHN1Y2ggYXMgbWV0YWRhdGEgYW5kIHBsYXkgc3RhdGUgY2hhbmdlcy4KKyAqIDxwPgorICogQSBNZWRpYUNvbnRyb2xsZXIgY2FuIGJlIGNyZWF0ZWQgdGhyb3VnaCB7QGxpbmsgTWVkaWFTZXNzaW9uTWFuYWdlcn0gaWYgeW91CisgKiBob2xkIHRoZSAiYW5kcm9pZC5wZXJtaXNzaW9uLk1FRElBX0NPTlRFTlRfQ09OVFJPTCIgcGVybWlzc2lvbiBvciBhcmUgYW4KKyAqIGVuYWJsZWQgbm90aWZpY2F0aW9uIGxpc3RlbmVyIG9yIGJ5IGdldHRpbmcgYSB7QGxpbmsgTWVkaWFTZXNzaW9uLlRva2VufQorICogZGlyZWN0bHkgZnJvbSB0aGUgc2Vzc2lvbiBvd25lci4KKyAqIDxwPgorICogTWVkaWFDb250cm9sbGVyIG9iamVjdHMgYXJlIHRocmVhZC1zYWZlLgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgTWVkaWFDb250cm9sbGVyIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk1lZGlhQ29udHJvbGxlciI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0VWRU5UID0gMTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1VQREFURV9QTEFZQkFDS19TVEFURSA9IDI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19VUERBVEVfTUVUQURBVEEgPSAzOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfVVBEQVRFX1ZPTFVNRSA9IDQ7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19VUERBVEVfUVVFVUUgPSA1OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfVVBEQVRFX1FVRVVFX1RJVExFID0gNjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1VQREFURV9FWFRSQVMgPSA3OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfREVTVFJPWUVEID0gODsKKworICAgIHByaXZhdGUgZmluYWwgSVNlc3Npb25Db250cm9sbGVyIG1TZXNzaW9uQmluZGVyOworCisgICAgcHJpdmF0ZSBmaW5hbCBNZWRpYVNlc3Npb24uVG9rZW4gbVRva2VuOworICAgIHByaXZhdGUgZmluYWwgQ29udGV4dCBtQ29udGV4dDsKKyAgICBwcml2YXRlIGZpbmFsIENhbGxiYWNrU3R1YiBtQ2JTdHViID0gbmV3IENhbGxiYWNrU3R1Yih0aGlzKTsKKyAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxNZXNzYWdlSGFuZGxlcj4gbUNhbGxiYWNrcyA9IG5ldyBBcnJheUxpc3Q8TWVzc2FnZUhhbmRsZXI+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBPYmplY3QgbUxvY2sgPSBuZXcgT2JqZWN0KCk7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gbUNiUmVnaXN0ZXJlZCA9IGZhbHNlOworICAgIHByaXZhdGUgU3RyaW5nIG1QYWNrYWdlTmFtZTsKKyAgICBwcml2YXRlIFN0cmluZyBtVGFnOworCisgICAgcHJpdmF0ZSBmaW5hbCBUcmFuc3BvcnRDb250cm9scyBtVHJhbnNwb3J0Q29udHJvbHM7CisKKyAgICAvKioKKyAgICAgKiBDYWxsIGZvciBjcmVhdGluZyBhIE1lZGlhQ29udHJvbGxlciBkaXJlY3RseSBmcm9tIGEgYmluZGVyLiBTaG91bGQgb25seQorICAgICAqIGJlIHVzZWQgYnkgZnJhbWV3b3JrIGNvZGUuCisgICAgICoKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBNZWRpYUNvbnRyb2xsZXIoQ29udGV4dCBjb250ZXh0LCBJU2Vzc2lvbkNvbnRyb2xsZXIgc2Vzc2lvbkJpbmRlcikgeworICAgICAgICBpZiAoc2Vzc2lvbkJpbmRlciA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTZXNzaW9uIHRva2VuIGNhbm5vdCBiZSBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNvbnRleHQgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ29udGV4dCBjYW5ub3QgYmUgbnVsbCIpOworICAgICAgICB9CisgICAgICAgIG1TZXNzaW9uQmluZGVyID0gc2Vzc2lvbkJpbmRlcjsKKyAgICAgICAgbVRyYW5zcG9ydENvbnRyb2xzID0gbmV3IFRyYW5zcG9ydENvbnRyb2xzKCk7CisgICAgICAgIG1Ub2tlbiA9IG5ldyBNZWRpYVNlc3Npb24uVG9rZW4oc2Vzc2lvbkJpbmRlcik7CisgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgTWVkaWFDb250cm9sbGVyIGZyb20gYSBzZXNzaW9uJ3MgdG9rZW4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY2FsbGVyJ3MgY29udGV4dC4KKyAgICAgKiBAcGFyYW0gdG9rZW4gVGhlIHRva2VuIGZvciB0aGUgc2Vzc2lvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWVkaWFDb250cm9sbGVyKEBOb25OdWxsIENvbnRleHQgY29udGV4dCwgQE5vbk51bGwgTWVkaWFTZXNzaW9uLlRva2VuIHRva2VuKSB7CisgICAgICAgIHRoaXMoY29udGV4dCwgdG9rZW4uZ2V0QmluZGVyKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBhIHtAbGluayBUcmFuc3BvcnRDb250cm9sc30gaW5zdGFuY2UgdG8gc2VuZCB0cmFuc3BvcnQgYWN0aW9ucyB0bworICAgICAqIHRoZSBhc3NvY2lhdGVkIHNlc3Npb24uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEEgdHJhbnNwb3J0IGNvbnRyb2xzIGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBATm9uTnVsbCBUcmFuc3BvcnRDb250cm9scyBnZXRUcmFuc3BvcnRDb250cm9scygpIHsKKyAgICAgICAgcmV0dXJuIG1UcmFuc3BvcnRDb250cm9sczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZW5kIHRoZSBzcGVjaWZpZWQgbWVkaWEgYnV0dG9uIGV2ZW50IHRvIHRoZSBzZXNzaW9uLiBPbmx5IG1lZGlhIGtleXMgY2FuCisgICAgICogYmUgc2VudCBieSB0aGlzIG1ldGhvZCwgb3RoZXIga2V5cyB3aWxsIGJlIGlnbm9yZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0ga2V5RXZlbnQgVGhlIG1lZGlhIGJ1dHRvbiBldmVudCB0byBkaXNwYXRjaC4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGV2ZW50IHdhcyBzZW50IHRvIHRoZSBzZXNzaW9uLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZGlzcGF0Y2hNZWRpYUJ1dHRvbkV2ZW50KEBOb25OdWxsIEtleUV2ZW50IGtleUV2ZW50KSB7CisgICAgICAgIHJldHVybiBkaXNwYXRjaE1lZGlhQnV0dG9uRXZlbnRJbnRlcm5hbChmYWxzZSwga2V5RXZlbnQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERpc3BhdGNoZXMgdGhlIG1lZGlhIGJ1dHRvbiBldmVudCBhcyBzeXN0ZW0gc2VydmljZSB0byB0aGUgc2Vzc2lvbi4KKyAgICAgKiA8cD4KKyAgICAgKiBTaG91bGQgYmUgb25seSBjYWxsZWQgYnkgdGhlIHtAbGluayBjb20uYW5kcm9pZC5pbnRlcm5hbC5wb2xpY3kuUGhvbmVXaW5kb3d9IHdoZW4gdGhlCisgICAgICogZm9yZWdyb3VuZCBhY3Rpdml0eSBkaWRuJ3QgY29uc3VtZSB0aGUga2V5IGZyb20gdGhlIGhhcmR3YXJlIGRldmljZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0ga2V5RXZlbnQgbWVkaWEga2V5IGV2ZW50CisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIGV2ZW50IHdhcyBzZW50IHRvIHRoZSBzZXNzaW9uLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZQorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZGlzcGF0Y2hNZWRpYUJ1dHRvbkV2ZW50QXNTeXN0ZW1TZXJ2aWNlKEBOb25OdWxsIEtleUV2ZW50IGtleUV2ZW50KSB7CisgICAgICAgIHJldHVybiBkaXNwYXRjaE1lZGlhQnV0dG9uRXZlbnRJbnRlcm5hbCh0cnVlLCBrZXlFdmVudCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGRpc3BhdGNoTWVkaWFCdXR0b25FdmVudEludGVybmFsKGJvb2xlYW4gYXNTeXN0ZW1TZXJ2aWNlLAorICAgICAgICAgICAgQE5vbk51bGwgS2V5RXZlbnQga2V5RXZlbnQpIHsKKyAgICAgICAgaWYgKGtleUV2ZW50ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIktleUV2ZW50IG1heSBub3QgYmUgbnVsbCIpOworICAgICAgICB9CisgICAgICAgIGlmICghTWVkaWFVdGlscy5pc01lZGlhS2V5KGtleUV2ZW50LmdldEtleUNvZGUoKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy9UT0RPKGIvMTE5NzQ4Njc4KTogUmVzb2x2ZSBtQ29udGV4dC5nZXRPcFBhY2thZ2VOYW1lKCkgdGhyb3VnaCB0aGlzIGZpbGUuCisgICAgICAgICAgICAvLyBUZW1wb3JhcmlsbHkgaXQncyByZXBsYWNlZCB3aXRoICJtQ29udGV4dC5nZXRPcFBhY2thZ2VOYW1lKCkiIGZvciBjb21waWxpbmcuCisgICAgICAgICAgICByZXR1cm4gbVNlc3Npb25CaW5kZXIuc2VuZE1lZGlhQnV0dG9uKCJtQ29udGV4dC5nZXRPcFBhY2thZ2VOYW1lKCkiLCBtQ2JTdHViLAorICAgICAgICAgICAgICAgICAgICBhc1N5c3RlbVNlcnZpY2UsIGtleUV2ZW50KTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIFN5c3RlbSBpcyBkZWFkLiA9KAorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEaXNwYXRjaGVzIHRoZSB2b2x1bWUgYnV0dG9uIGV2ZW50IGFzIHN5c3RlbSBzZXJ2aWNlIHRvIHRoZSBzZXNzaW9uLgorICAgICAqIDxwPgorICAgICAqIFNob3VsZCBiZSBvbmx5IGNhbGxlZCBieSB0aGUge0BsaW5rIGNvbS5hbmRyb2lkLmludGVybmFsLnBvbGljeS5QaG9uZVdpbmRvd30gd2hlbiB0aGUKKyAgICAgKiBmb3JlZ3JvdW5kIGFjdGl2aXR5IGRpZG4ndCBjb25zdW1lIHRoZSBrZXkgZnJvbSB0aGUgaGFyZHdhcmUgZGV2aWNlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBrZXlFdmVudCB2b2x1bWUga2V5IGV2ZW50CisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkaXNwYXRjaFZvbHVtZUJ1dHRvbkV2ZW50QXNTeXN0ZW1TZXJ2aWNlKEBOb25OdWxsIEtleUV2ZW50IGtleUV2ZW50KSB7CisgICAgICAgIHN3aXRjaCAoa2V5RXZlbnQuZ2V0QWN0aW9uKCkpIHsKKyAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuQUNUSU9OX0RPV046IHsKKyAgICAgICAgICAgICAgICBpbnQgZGlyZWN0aW9uID0gMDsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGtleUV2ZW50LmdldEtleUNvZGUoKSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfVk9MVU1FX1VQOgorICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gQXVkaW9NYW5hZ2VyLkFESlVTVF9SQUlTRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfVk9MVU1FX0RPV046CisgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSBBdWRpb01hbmFnZXIuQURKVVNUX0xPV0VSOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuS0VZQ09ERV9WT0xVTUVfTVVURToKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9IEF1ZGlvTWFuYWdlci5BREpVU1RfVE9HR0xFX01VVEU7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgbVNlc3Npb25CaW5kZXIuYWRqdXN0Vm9sdW1lKCJtQ29udGV4dC5nZXRPcFBhY2thZ2VOYW1lKCkiLCBtQ2JTdHViLCB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiwgQXVkaW9NYW5hZ2VyLkZMQUdfU0hPV19VSSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLnd0ZihUQUcsICJFcnJvciBjYWxsaW5nIGFkanVzdFZvbHVtZUJ5IiwgZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlIEtleUV2ZW50LkFDVElPTl9VUDogeworICAgICAgICAgICAgICAgIGZpbmFsIGludCBmbGFncyA9IEF1ZGlvTWFuYWdlci5GTEFHX1BMQVlfU09VTkQgfCBBdWRpb01hbmFnZXIuRkxBR19WSUJSQVRFCisgICAgICAgICAgICAgICAgICAgICAgICB8IE1lZGlhVXRpbHMuQVVESU9fTUFOQUdFUl9GTEFHX0ZST01fS0VZOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uQmluZGVyLmFkanVzdFZvbHVtZSgibUNvbnRleHQuZ2V0T3BQYWNrYWdlTmFtZSgpIiwgbUNiU3R1YiwgdHJ1ZSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLnd0ZihUQUcsICJFcnJvciBjYWxsaW5nIGFkanVzdFZvbHVtZUJ5IiwgZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBjdXJyZW50IHBsYXliYWNrIHN0YXRlIGZvciB0aGlzIHNlc3Npb24uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBjdXJyZW50IFBsYXliYWNrU3RhdGUgb3IgbnVsbAorICAgICAqLworICAgIHB1YmxpYyBATnVsbGFibGUgUGxheWJhY2tTdGF0ZSBnZXRQbGF5YmFja1N0YXRlKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIG1TZXNzaW9uQmluZGVyLmdldFBsYXliYWNrU3RhdGUoKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy53dGYoVEFHLCAiRXJyb3IgY2FsbGluZyBnZXRQbGF5YmFja1N0YXRlLiIsIGUpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGN1cnJlbnQgbWV0YWRhdGEgZm9yIHRoaXMgc2Vzc2lvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIGN1cnJlbnQgTWVkaWFNZXRhZGF0YSBvciBudWxsLgorICAgICAqLworICAgIHB1YmxpYyBATnVsbGFibGUgTWVkaWFNZXRhZGF0YSBnZXRNZXRhZGF0YSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBtU2Vzc2lvbkJpbmRlci5nZXRNZXRhZGF0YSgpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLnd0ZihUQUcsICJFcnJvciBjYWxsaW5nIGdldE1ldGFkYXRhLiIsIGUpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGN1cnJlbnQgcGxheSBxdWV1ZSBmb3IgdGhpcyBzZXNzaW9uIGlmIG9uZSBpcyBzZXQuIElmIHlvdSBvbmx5CisgICAgICogY2FyZSBhYm91dCB0aGUgY3VycmVudCBpdGVtIHtAbGluayAjZ2V0TWV0YWRhdGEoKX0gc2hvdWxkIGJlIHVzZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBjdXJyZW50IHBsYXkgcXVldWUgb3IgbnVsbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQE51bGxhYmxlIExpc3Q8TWVkaWFTZXNzaW9uLlF1ZXVlSXRlbT4gZ2V0UXVldWUoKSB7CisgICAgICAgIC8vVE9ETzooYi8xMTk3NTA4MDcpIFJlc29sdmUgaGlkZGVuIEFQSSB1c2FnZSBQYXJjZWxlZExpc3RTbGljZS4KKyAgICAgICAgLyoKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFBhcmNlbGVkTGlzdFNsaWNlIHF1ZXVlID0gbVNlc3Npb25CaW5kZXIuZ2V0UXVldWUoKTsKKyAgICAgICAgICAgIGlmIChxdWV1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHF1ZXVlLmdldExpc3QoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy53dGYoVEFHLCAiRXJyb3IgY2FsbGluZyBnZXRRdWV1ZS4iLCBlKTsKKyAgICAgICAgfQorICAgICAgICAqLworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHF1ZXVlIHRpdGxlIGZvciB0aGlzIHNlc3Npb24uCisgICAgICovCisgICAgcHVibGljIEBOdWxsYWJsZSBDaGFyU2VxdWVuY2UgZ2V0UXVldWVUaXRsZSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBtU2Vzc2lvbkJpbmRlci5nZXRRdWV1ZVRpdGxlKCk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cud3RmKFRBRywgIkVycm9yIGNhbGxpbmcgZ2V0UXVldWVUaXRsZSIsIGUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgZXh0cmFzIGZvciB0aGlzIHNlc3Npb24uCisgICAgICovCisgICAgcHVibGljIEBOdWxsYWJsZSBCdW5kbGUgZ2V0RXh0cmFzKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIG1TZXNzaW9uQmluZGVyLmdldEV4dHJhcygpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLnd0ZihUQUcsICJFcnJvciBjYWxsaW5nIGdldEV4dHJhcyIsIGUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgcmF0aW5nIHR5cGUgc3VwcG9ydGVkIGJ5IHRoZSBzZXNzaW9uLiBPbmUgb2Y6CisgICAgICogPHVsPgorICAgICAqIDxsaT57QGxpbmsgUmF0aW5nI1JBVElOR19OT05FfTwvbGk+CisgICAgICogPGxpPntAbGluayBSYXRpbmcjUkFUSU5HX0hFQVJUfTwvbGk+CisgICAgICogPGxpPntAbGluayBSYXRpbmcjUkFUSU5HX1RIVU1CX1VQX0RPV059PC9saT4KKyAgICAgKiA8bGk+e0BsaW5rIFJhdGluZyNSQVRJTkdfM19TVEFSU308L2xpPgorICAgICAqIDxsaT57QGxpbmsgUmF0aW5nI1JBVElOR180X1NUQVJTfTwvbGk+CisgICAgICogPGxpPntAbGluayBSYXRpbmcjUkFUSU5HXzVfU1RBUlN9PC9saT4KKyAgICAgKiA8bGk+e0BsaW5rIFJhdGluZyNSQVRJTkdfUEVSQ0VOVEFHRX08L2xpPgorICAgICAqIDwvdWw+CisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBzdXBwb3J0ZWQgcmF0aW5nIHR5cGUKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFJhdGluZ1R5cGUoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gbVNlc3Npb25CaW5kZXIuZ2V0UmF0aW5nVHlwZSgpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLnd0ZihUQUcsICJFcnJvciBjYWxsaW5nIGdldFJhdGluZ1R5cGUuIiwgZSk7CisgICAgICAgICAgICByZXR1cm4gUmF0aW5nLlJBVElOR19OT05FOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBmbGFncyBmb3IgdGhpcyBzZXNzaW9uLiBGbGFncyBhcmUgZGVmaW5lZCBpbiB7QGxpbmsgTWVkaWFTZXNzaW9ufS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIGN1cnJlbnQgc2V0IG9mIGZsYWdzIGZvciB0aGUgc2Vzc2lvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgQE1lZGlhU2Vzc2lvbi5TZXNzaW9uRmxhZ3MgbG9uZyBnZXRGbGFncygpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBtU2Vzc2lvbkJpbmRlci5nZXRGbGFncygpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLnd0ZihUQUcsICJFcnJvciBjYWxsaW5nIGdldEZsYWdzLiIsIGUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgY3VycmVudCBwbGF5YmFjayBpbmZvIGZvciB0aGlzIHNlc3Npb24uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBjdXJyZW50IHBsYXliYWNrIGluZm8gb3IgbnVsbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQE51bGxhYmxlIFBsYXliYWNrSW5mbyBnZXRQbGF5YmFja0luZm8oKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBQYXJjZWxhYmxlVm9sdW1lSW5mbyByZXN1bHQgPSBtU2Vzc2lvbkJpbmRlci5nZXRWb2x1bWVBdHRyaWJ1dGVzKCk7CisgICAgICAgICAgICByZXR1cm4gbmV3IFBsYXliYWNrSW5mbyhyZXN1bHQudm9sdW1lVHlwZSwgcmVzdWx0LmF1ZGlvQXR0cnMsIHJlc3VsdC5jb250cm9sVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0Lm1heFZvbHVtZSwgcmVzdWx0LmN1cnJlbnRWb2x1bWUpOworCisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cud3RmKFRBRywgIkVycm9yIGNhbGxpbmcgZ2V0QXVkaW9JbmZvLiIsIGUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBhbiBpbnRlbnQgZm9yIGxhdW5jaGluZyBVSSBhc3NvY2lhdGVkIHdpdGggdGhpcyBzZXNzaW9uIGlmIG9uZQorICAgICAqIGV4aXN0cy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gQSB7QGxpbmsgUGVuZGluZ0ludGVudH0gdG8gbGF1bmNoIFVJIG9yIG51bGwuCisgICAgICovCisgICAgcHVibGljIEBOdWxsYWJsZSBQZW5kaW5nSW50ZW50IGdldFNlc3Npb25BY3Rpdml0eSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBtU2Vzc2lvbkJpbmRlci5nZXRMYXVuY2hQZW5kaW5nSW50ZW50KCk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cud3RmKFRBRywgIkVycm9yIGNhbGxpbmcgZ2V0UGVuZGluZ0ludGVudC4iLCBlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHRva2VuIGZvciB0aGUgc2Vzc2lvbiB0aGlzIGlzIGNvbm5lY3RlZCB0by4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIHRva2VuIGZvciB0aGUgY29ubmVjdGVkIHNlc3Npb24uCisgICAgICovCisgICAgcHVibGljIEBOb25OdWxsIE1lZGlhU2Vzc2lvbi5Ub2tlbiBnZXRTZXNzaW9uVG9rZW4oKSB7CisgICAgICAgIHJldHVybiBtVG9rZW47CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSB2b2x1bWUgb2YgdGhlIG91dHB1dCB0aGlzIHNlc3Npb24gaXMgcGxheWluZyBvbi4gVGhlIGNvbW1hbmQgd2lsbAorICAgICAqIGJlIGlnbm9yZWQgaWYgaXQgZG9lcyBub3Qgc3VwcG9ydAorICAgICAqIHtAbGluayBWb2x1bWVQcm92aWRlciNWT0xVTUVfQ09OVFJPTF9BQlNPTFVURX0uIFRoZSBmbGFncyBpbgorICAgICAqIHtAbGluayBBdWRpb01hbmFnZXJ9IG1heSBiZSB1c2VkIHRvIGFmZmVjdCB0aGUgaGFuZGxpbmcuCisgICAgICoKKyAgICAgKiBAc2VlICNnZXRQbGF5YmFja0luZm8oKQorICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0IGl0IHRvLCBiZXR3ZWVuIDAgYW5kIHRoZSByZXBvcnRlZCBtYXguCisgICAgICogQHBhcmFtIGZsYWdzIEZsYWdzIGZyb20ge0BsaW5rIEF1ZGlvTWFuYWdlcn0gdG8gaW5jbHVkZSB3aXRoIHRoZSB2b2x1bWUKKyAgICAgKiAgICAgICAgICAgIHJlcXVlc3QuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Vm9sdW1lVG8oaW50IHZhbHVlLCBpbnQgZmxhZ3MpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1TZXNzaW9uQmluZGVyLnNldFZvbHVtZVRvKCJtQ29udGV4dC5nZXRPcFBhY2thZ2VOYW1lKCkiLCBtQ2JTdHViLCB2YWx1ZSwgZmxhZ3MpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLnd0ZihUQUcsICJFcnJvciBjYWxsaW5nIHNldFZvbHVtZVRvLiIsIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRqdXN0IHRoZSB2b2x1bWUgb2YgdGhlIG91dHB1dCB0aGlzIHNlc3Npb24gaXMgcGxheWluZyBvbi4gVGhlIGRpcmVjdGlvbgorICAgICAqIG11c3QgYmUgb25lIG9mIHtAbGluayBBdWRpb01hbmFnZXIjQURKVVNUX0xPV0VSfSwKKyAgICAgKiB7QGxpbmsgQXVkaW9NYW5hZ2VyI0FESlVTVF9SQUlTRX0sIG9yIHtAbGluayBBdWRpb01hbmFnZXIjQURKVVNUX1NBTUV9LgorICAgICAqIFRoZSBjb21tYW5kIHdpbGwgYmUgaWdub3JlZCBpZiB0aGUgc2Vzc2lvbiBkb2VzIG5vdCBzdXBwb3J0CisgICAgICoge0BsaW5rIFZvbHVtZVByb3ZpZGVyI1ZPTFVNRV9DT05UUk9MX1JFTEFUSVZFfSBvcgorICAgICAqIHtAbGluayBWb2x1bWVQcm92aWRlciNWT0xVTUVfQ09OVFJPTF9BQlNPTFVURX0uIFRoZSBmbGFncyBpbgorICAgICAqIHtAbGluayBBdWRpb01hbmFnZXJ9IG1heSBiZSB1c2VkIHRvIGFmZmVjdCB0aGUgaGFuZGxpbmcuCisgICAgICoKKyAgICAgKiBAc2VlICNnZXRQbGF5YmFja0luZm8oKQorICAgICAqIEBwYXJhbSBkaXJlY3Rpb24gVGhlIGRpcmVjdGlvbiB0byBhZGp1c3QgdGhlIHZvbHVtZSBpbi4KKyAgICAgKiBAcGFyYW0gZmxhZ3MgQW55IGZsYWdzIHRvIHBhc3Mgd2l0aCB0aGUgY29tbWFuZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGp1c3RWb2x1bWUoaW50IGRpcmVjdGlvbiwgaW50IGZsYWdzKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtU2Vzc2lvbkJpbmRlci5hZGp1c3RWb2x1bWUoIm1Db250ZXh0LmdldE9wUGFja2FnZU5hbWUoKSIsIG1DYlN0dWIsIGZhbHNlLCBkaXJlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy53dGYoVEFHLCAiRXJyb3IgY2FsbGluZyBhZGp1c3RWb2x1bWVCeS4iLCBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlZ2lzdGVycyBhIGNhbGxiYWNrIHRvIHJlY2VpdmUgdXBkYXRlcyBmcm9tIHRoZSBTZXNzaW9uLiBVcGRhdGVzIHdpbGwgYmUKKyAgICAgKiBwb3N0ZWQgb24gdGhlIGNhbGxlcidzIHRocmVhZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgb2JqZWN0LCBtdXN0IG5vdCBiZSBudWxsLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyQ2FsbGJhY2soQE5vbk51bGwgQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgcmVnaXN0ZXJDYWxsYmFjayhjYWxsYmFjaywgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVnaXN0ZXJzIGEgY2FsbGJhY2sgdG8gcmVjZWl2ZSB1cGRhdGVzIGZyb20gdGhlIHNlc3Npb24uIFVwZGF0ZXMgd2lsbCBiZQorICAgICAqIHBvc3RlZCBvbiB0aGUgc3BlY2lmaWVkIGhhbmRsZXIncyB0aHJlYWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2FsbGJhY2sgVGhlIGNhbGxiYWNrIG9iamVjdCwgbXVzdCBub3QgYmUgbnVsbC4KKyAgICAgKiBAcGFyYW0gaGFuZGxlciBUaGUgaGFuZGxlciB0byBwb3N0IHVwZGF0ZXMgb24uIElmIG51bGwgdGhlIGNhbGxlcnMgdGhyZWFkCisgICAgICogICAgICAgICAgICB3aWxsIGJlIHVzZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVnaXN0ZXJDYWxsYmFjayhATm9uTnVsbCBDYWxsYmFjayBjYWxsYmFjaywgQE51bGxhYmxlIEhhbmRsZXIgaGFuZGxlcikgeworICAgICAgICBpZiAoY2FsbGJhY2sgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY2FsbGJhY2sgbXVzdCBub3QgYmUgbnVsbCIpOworICAgICAgICB9CisgICAgICAgIGlmIChoYW5kbGVyID09IG51bGwpIHsKKyAgICAgICAgICAgIGhhbmRsZXIgPSBuZXcgSGFuZGxlcigpOworICAgICAgICB9CisgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKKyAgICAgICAgICAgIGFkZENhbGxiYWNrTG9ja2VkKGNhbGxiYWNrLCBoYW5kbGVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFVucmVnaXN0ZXJzIHRoZSBzcGVjaWZpZWQgY2FsbGJhY2suIElmIGFuIHVwZGF0ZSBoYXMgYWxyZWFkeSBiZWVuIHBvc3RlZAorICAgICAqIHlvdSBtYXkgc3RpbGwgcmVjZWl2ZSBpdCBhZnRlciBjYWxsaW5nIHRoaXMgbWV0aG9kLgorICAgICAqCisgICAgICogQHBhcmFtIGNhbGxiYWNrIFRoZSBjYWxsYmFjayB0byByZW1vdmUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdW5yZWdpc3RlckNhbGxiYWNrKEBOb25OdWxsIENhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgICAgIGlmIChjYWxsYmFjayA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjYWxsYmFjayBtdXN0IG5vdCBiZSBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgcmVtb3ZlQ2FsbGJhY2tMb2NrZWQoY2FsbGJhY2spOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VuZHMgYSBnZW5lcmljIGNvbW1hbmQgdG8gdGhlIHNlc3Npb24uIEl0IGlzIHVwIHRvIHRoZSBzZXNzaW9uIGNyZWF0b3IKKyAgICAgKiB0byBkZWNpZGUgd2hhdCBjb21tYW5kcyBhbmQgcGFyYW1ldGVycyB0aGV5IHdpbGwgc3VwcG9ydC4gQXMgc3VjaCwKKyAgICAgKiBjb21tYW5kcyBzaG91bGQgb25seSBiZSBzZW50IHRvIHNlc3Npb25zIHRoYXQgdGhlIGNvbnRyb2xsZXIgb3ducy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb21tYW5kIFRoZSBjb21tYW5kIHRvIHNlbmQKKyAgICAgKiBAcGFyYW0gYXJncyBBbnkgcGFyYW1ldGVycyB0byBpbmNsdWRlIHdpdGggdGhlIGNvbW1hbmQKKyAgICAgKiBAcGFyYW0gY2IgVGhlIGNhbGxiYWNrIHRvIHJlY2VpdmUgdGhlIHJlc3VsdCBvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNlbmRDb21tYW5kKEBOb25OdWxsIFN0cmluZyBjb21tYW5kLCBATnVsbGFibGUgQnVuZGxlIGFyZ3MsCisgICAgICAgICAgICBATnVsbGFibGUgUmVzdWx0UmVjZWl2ZXIgY2IpIHsKKyAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KGNvbW1hbmQpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb21tYW5kIGNhbm5vdCBiZSBudWxsIG9yIGVtcHR5Iik7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1TZXNzaW9uQmluZGVyLnNlbmRDb21tYW5kKCJtQ29udGV4dC5nZXRPcFBhY2thZ2VOYW1lKCkiLCBtQ2JTdHViLCBjb21tYW5kLCBhcmdzLCBjYik7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZChUQUcsICJEZWFkIG9iamVjdCBpbiBzZW5kQ29tbWFuZC4iLCBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgc2Vzc2lvbiBvd25lcidzIHBhY2thZ2UgbmFtZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIHBhY2thZ2UgbmFtZSBvZiBvZiB0aGUgc2Vzc2lvbiBvd25lci4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2VOYW1lKCkgeworICAgICAgICBpZiAobVBhY2thZ2VOYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbVBhY2thZ2VOYW1lID0gbVNlc3Npb25CaW5kZXIuZ2V0UGFja2FnZU5hbWUoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiRGVhZCBvYmplY3QgaW4gZ2V0UGFja2FnZU5hbWUuIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1QYWNrYWdlTmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHNlc3Npb24ncyB0YWcgZm9yIGRlYnVnZ2luZyBwdXJwb3Nlcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIHNlc3Npb24ncyB0YWcuCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFRhZygpIHsKKyAgICAgICAgaWYgKG1UYWcgPT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtVGFnID0gbVNlc3Npb25CaW5kZXIuZ2V0VGFnKCk7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkRlYWQgb2JqZWN0IGluIGdldFRhZy4iLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbVRhZzsKKyAgICB9CisKKyAgICAvKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgSVNlc3Npb25Db250cm9sbGVyIGdldFNlc3Npb25CaW5kZXIoKSB7CisgICAgICAgIHJldHVybiBtU2Vzc2lvbkJpbmRlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIEBVbnN1cHBvcnRlZEFwcFVzYWdlCisgICAgcHVibGljIGJvb2xlYW4gY29udHJvbHNTYW1lU2Vzc2lvbihNZWRpYUNvbnRyb2xsZXIgb3RoZXIpIHsKKyAgICAgICAgaWYgKG90aGVyID09IG51bGwpIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIG1TZXNzaW9uQmluZGVyLmFzQmluZGVyKCkgPT0gb3RoZXIuZ2V0U2Vzc2lvbkJpbmRlcigpLmFzQmluZGVyKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFkZENhbGxiYWNrTG9ja2VkKENhbGxiYWNrIGNiLCBIYW5kbGVyIGhhbmRsZXIpIHsKKyAgICAgICAgaWYgKGdldEhhbmRsZXJGb3JDYWxsYmFja0xvY2tlZChjYikgIT0gbnVsbCkgeworICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2FsbGJhY2sgaXMgYWxyZWFkeSBhZGRlZCwgaWdub3JpbmciKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBNZXNzYWdlSGFuZGxlciBob2xkZXIgPSBuZXcgTWVzc2FnZUhhbmRsZXIoaGFuZGxlci5nZXRMb29wZXIoKSwgY2IpOworICAgICAgICBtQ2FsbGJhY2tzLmFkZChob2xkZXIpOworICAgICAgICBob2xkZXIubVJlZ2lzdGVyZWQgPSB0cnVlOworCisgICAgICAgIGlmICghbUNiUmVnaXN0ZXJlZCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtU2Vzc2lvbkJpbmRlci5yZWdpc3RlckNhbGxiYWNrTGlzdGVuZXIoIm1Db250ZXh0LmdldE9wUGFja2FnZU5hbWUoKSIsIG1DYlN0dWIpOworICAgICAgICAgICAgICAgIG1DYlJlZ2lzdGVyZWQgPSB0cnVlOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJEZWFkIG9iamVjdCBpbiByZWdpc3RlckNhbGxiYWNrIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gcmVtb3ZlQ2FsbGJhY2tMb2NrZWQoQ2FsbGJhY2sgY2IpIHsKKyAgICAgICAgYm9vbGVhbiBzdWNjZXNzID0gZmFsc2U7CisgICAgICAgIGZvciAoaW50IGkgPSBtQ2FsbGJhY2tzLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICBNZXNzYWdlSGFuZGxlciBoYW5kbGVyID0gbUNhbGxiYWNrcy5nZXQoaSk7CisgICAgICAgICAgICBpZiAoY2IgPT0gaGFuZGxlci5tQ2FsbGJhY2spIHsKKyAgICAgICAgICAgICAgICBtQ2FsbGJhY2tzLnJlbW92ZShpKTsKKyAgICAgICAgICAgICAgICBzdWNjZXNzID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBoYW5kbGVyLm1SZWdpc3RlcmVkID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1DYlJlZ2lzdGVyZWQgJiYgbUNhbGxiYWNrcy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtU2Vzc2lvbkJpbmRlci51bnJlZ2lzdGVyQ2FsbGJhY2tMaXN0ZW5lcihtQ2JTdHViKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRGVhZCBvYmplY3QgaW4gcmVtb3ZlQ2FsbGJhY2tMb2NrZWQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1DYlJlZ2lzdGVyZWQgPSBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3VjY2VzczsKKyAgICB9CisKKyAgICBwcml2YXRlIE1lc3NhZ2VIYW5kbGVyIGdldEhhbmRsZXJGb3JDYWxsYmFja0xvY2tlZChDYWxsYmFjayBjYikgeworICAgICAgICBpZiAoY2IgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2FsbGJhY2sgY2Fubm90IGJlIG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gbUNhbGxiYWNrcy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgTWVzc2FnZUhhbmRsZXIgaGFuZGxlciA9IG1DYWxsYmFja3MuZ2V0KGkpOworICAgICAgICAgICAgaWYgKGNiID09IGhhbmRsZXIubUNhbGxiYWNrKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZXI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCB2b2lkIHBvc3RNZXNzYWdlKGludCB3aGF0LCBPYmplY3Qgb2JqLCBCdW5kbGUgZGF0YSkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gbUNhbGxiYWNrcy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgICAgIG1DYWxsYmFja3MuZ2V0KGkpLnBvc3Qod2hhdCwgb2JqLCBkYXRhKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxiYWNrIGZvciByZWNlaXZpbmcgdXBkYXRlcyBmcm9tIHRoZSBzZXNzaW9uLiBBIENhbGxiYWNrIGNhbiBiZQorICAgICAqIHJlZ2lzdGVyZWQgdXNpbmcge0BsaW5rICNyZWdpc3RlckNhbGxiYWNrfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIENhbGxiYWNrIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIE92ZXJyaWRlIHRvIGhhbmRsZSB0aGUgc2Vzc2lvbiBiZWluZyBkZXN0cm95ZWQuIFRoZSBzZXNzaW9uIGlzIG5vCisgICAgICAgICAqIGxvbmdlciB2YWxpZCBhZnRlciB0aGlzIGNhbGwgYW5kIGNhbGxzIHRvIGl0IHdpbGwgYmUgaWdub3JlZC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIG9uU2Vzc2lvbkRlc3Ryb3llZCgpIHsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBPdmVycmlkZSB0byBoYW5kbGUgY3VzdG9tIGV2ZW50cyBzZW50IGJ5IHRoZSBzZXNzaW9uIG93bmVyIHdpdGhvdXQgYQorICAgICAgICAgKiBzcGVjaWZpZWQgaW50ZXJmYWNlLiBDb250cm9sbGVycyBzaG91bGQgb25seSBoYW5kbGUgdGhlc2UgZm9yCisgICAgICAgICAqIHNlc3Npb25zIHRoZXkgb3duLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50IGZyb20gdGhlIHNlc3Npb24uCisgICAgICAgICAqIEBwYXJhbSBleHRyYXMgT3B0aW9uYWwgcGFyYW1ldGVycyBmb3IgdGhlIGV2ZW50LCBtYXkgYmUgbnVsbC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIG9uU2Vzc2lvbkV2ZW50KEBOb25OdWxsIFN0cmluZyBldmVudCwgQE51bGxhYmxlIEJ1bmRsZSBleHRyYXMpIHsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBPdmVycmlkZSB0byBoYW5kbGUgY2hhbmdlcyBpbiBwbGF5YmFjayBzdGF0ZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHN0YXRlIFRoZSBuZXcgcGxheWJhY2sgc3RhdGUgb2YgdGhlIHNlc3Npb24KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUGxheWJhY2tTdGF0ZUNoYW5nZWQoQE51bGxhYmxlIFBsYXliYWNrU3RhdGUgc3RhdGUpIHsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBPdmVycmlkZSB0byBoYW5kbGUgY2hhbmdlcyB0byB0aGUgY3VycmVudCBtZXRhZGF0YS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG1ldGFkYXRhIFRoZSBjdXJyZW50IG1ldGFkYXRhIGZvciB0aGUgc2Vzc2lvbiBvciBudWxsIGlmIG5vbmUuCisgICAgICAgICAqIEBzZWUgTWVkaWFNZXRhZGF0YQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25NZXRhZGF0YUNoYW5nZWQoQE51bGxhYmxlIE1lZGlhTWV0YWRhdGEgbWV0YWRhdGEpIHsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBPdmVycmlkZSB0byBoYW5kbGUgY2hhbmdlcyB0byBpdGVtcyBpbiB0aGUgcXVldWUuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBxdWV1ZSBBIGxpc3Qgb2YgaXRlbXMgaW4gdGhlIGN1cnJlbnQgcGxheSBxdWV1ZS4gSXQgc2hvdWxkCisgICAgICAgICAqICAgICAgICAgICAgaW5jbHVkZSB0aGUgY3VycmVudGx5IHBsYXlpbmcgaXRlbSBhcyB3ZWxsIGFzIHByZXZpb3VzIGFuZAorICAgICAgICAgKiAgICAgICAgICAgIHVwY29taW5nIGl0ZW1zIGlmIGFwcGxpY2FibGUuCisgICAgICAgICAqIEBzZWUgTWVkaWFTZXNzaW9uLlF1ZXVlSXRlbQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25RdWV1ZUNoYW5nZWQoQE51bGxhYmxlIExpc3Q8TWVkaWFTZXNzaW9uLlF1ZXVlSXRlbT4gcXVldWUpIHsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBPdmVycmlkZSB0byBoYW5kbGUgY2hhbmdlcyB0byB0aGUgcXVldWUgdGl0bGUuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSB0aXRsZSBUaGUgdGl0bGUgdGhhdCBzaG91bGQgYmUgZGlzcGxheWVkIGFsb25nIHdpdGggdGhlIHBsYXkgcXVldWUgc3VjaCBhcworICAgICAgICAgKiAgICAgICAgICAgICAgIk5vdyBQbGF5aW5nIi4gTWF5IGJlIG51bGwgaWYgdGhlcmUgaXMgbm8gc3VjaCB0aXRsZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUXVldWVUaXRsZUNoYW5nZWQoQE51bGxhYmxlIENoYXJTZXF1ZW5jZSB0aXRsZSkgeworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIE92ZXJyaWRlIHRvIGhhbmRsZSBjaGFuZ2VzIHRvIHRoZSB7QGxpbmsgTWVkaWFTZXNzaW9ufSBleHRyYXMuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBleHRyYXMgVGhlIGV4dHJhcyB0aGF0IGNhbiBpbmNsdWRlIG90aGVyIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUKKyAgICAgICAgICogICAgICAgICAgICAgICB7QGxpbmsgTWVkaWFTZXNzaW9ufS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIG9uRXh0cmFzQ2hhbmdlZChATnVsbGFibGUgQnVuZGxlIGV4dHJhcykgeworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIE92ZXJyaWRlIHRvIGhhbmRsZSBjaGFuZ2VzIHRvIHRoZSBhdWRpbyBpbmZvLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gaW5mbyBUaGUgY3VycmVudCBhdWRpbyBpbmZvIGZvciB0aGlzIHNlc3Npb24uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBvbkF1ZGlvSW5mb0NoYW5nZWQoUGxheWJhY2tJbmZvIGluZm8pIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEludGVyZmFjZSBmb3IgY29udHJvbGxpbmcgbWVkaWEgcGxheWJhY2sgb24gYSBzZXNzaW9uLiBUaGlzIGFsbG93cyBhbiBhcHAKKyAgICAgKiB0byBzZW5kIG1lZGlhIHRyYW5zcG9ydCBjb21tYW5kcyB0byB0aGUgc2Vzc2lvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgY2xhc3MgVHJhbnNwb3J0Q29udHJvbHMgeworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlRyYW5zcG9ydENvbnRyb2xsZXIiOworCisgICAgICAgIHByaXZhdGUgVHJhbnNwb3J0Q29udHJvbHMoKSB7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmVxdWVzdCB0aGF0IHRoZSBwbGF5ZXIgcHJlcGFyZSBpdHMgcGxheWJhY2suIEluIG90aGVyIHdvcmRzLCBvdGhlciBzZXNzaW9ucyBjYW4gY29udGludWUKKyAgICAgICAgICogdG8gcGxheSBkdXJpbmcgdGhlIHByZXBhcmF0aW9uIG9mIHRoaXMgc2Vzc2lvbi4gVGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgdG8gc3BlZWQgdXAgdGhlCisgICAgICAgICAqIHN0YXJ0IG9mIHRoZSBwbGF5YmFjay4gT25jZSB0aGUgcHJlcGFyYXRpb24gaXMgZG9uZSwgdGhlIHNlc3Npb24gd2lsbCBjaGFuZ2UgaXRzIHBsYXliYWNrCisgICAgICAgICAqIHN0YXRlIHRvIHtAbGluayBQbGF5YmFja1N0YXRlI1NUQVRFX1BBVVNFRH0uIEFmdGVyd2FyZHMsIHtAbGluayAjcGxheX0gY2FuIGJlIGNhbGxlZCB0bworICAgICAgICAgKiBzdGFydCBwbGF5YmFjay4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHByZXBhcmUoKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1TZXNzaW9uQmluZGVyLnByZXBhcmUoIm1Db250ZXh0LmdldE9wUGFja2FnZU5hbWUoKSIsIG1DYlN0dWIpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cud3RmKFRBRywgIkVycm9yIGNhbGxpbmcgcHJlcGFyZS4iLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXF1ZXN0IHRoYXQgdGhlIHBsYXllciBwcmVwYXJlIHBsYXliYWNrIGZvciBhIHNwZWNpZmljIG1lZGlhIGlkLiBJbiBvdGhlciB3b3Jkcywgb3RoZXIKKyAgICAgICAgICogc2Vzc2lvbnMgY2FuIGNvbnRpbnVlIHRvIHBsYXkgZHVyaW5nIHRoZSBwcmVwYXJhdGlvbiBvZiB0aGlzIHNlc3Npb24uIFRoaXMgbWV0aG9kIGNhbiBiZQorICAgICAgICAgKiB1c2VkIHRvIHNwZWVkIHVwIHRoZSBzdGFydCBvZiB0aGUgcGxheWJhY2suIE9uY2UgdGhlIHByZXBhcmF0aW9uIGlzIGRvbmUsIHRoZSBzZXNzaW9uCisgICAgICAgICAqIHdpbGwgY2hhbmdlIGl0cyBwbGF5YmFjayBzdGF0ZSB0byB7QGxpbmsgUGxheWJhY2tTdGF0ZSNTVEFURV9QQVVTRUR9LiBBZnRlcndhcmRzLAorICAgICAgICAgKiB7QGxpbmsgI3BsYXl9IGNhbiBiZSBjYWxsZWQgdG8gc3RhcnQgcGxheWJhY2suIElmIHRoZSBwcmVwYXJhdGlvbiBpcyBub3QgbmVlZGVkLAorICAgICAgICAgKiB7QGxpbmsgI3BsYXlGcm9tTWVkaWFJZH0gY2FuIGJlIGRpcmVjdGx5IGNhbGxlZCB3aXRob3V0IHRoaXMgbWV0aG9kLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbWVkaWFJZCBUaGUgaWQgb2YgdGhlIHJlcXVlc3RlZCBtZWRpYS4KKyAgICAgICAgICogQHBhcmFtIGV4dHJhcyBPcHRpb25hbCBleHRyYXMgdGhhdCBjYW4gaW5jbHVkZSBleHRyYSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbWVkaWEgaXRlbQorICAgICAgICAgKiAgICAgICAgICAgICAgIHRvIGJlIHByZXBhcmVkLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgcHJlcGFyZUZyb21NZWRpYUlkKFN0cmluZyBtZWRpYUlkLCBCdW5kbGUgZXh0cmFzKSB7CisgICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkobWVkaWFJZCkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgIllvdSBtdXN0IHNwZWNpZnkgYSBub24tZW1wdHkgU3RyaW5nIGZvciBwcmVwYXJlRnJvbU1lZGlhSWQuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1TZXNzaW9uQmluZGVyLnByZXBhcmVGcm9tTWVkaWFJZCgibUNvbnRleHQuZ2V0T3BQYWNrYWdlTmFtZSgpIiwgbUNiU3R1YiwgbWVkaWFJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhcyk7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy53dGYoVEFHLCAiRXJyb3IgY2FsbGluZyBwcmVwYXJlKCIgKyBtZWRpYUlkICsgIikuIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmVxdWVzdCB0aGF0IHRoZSBwbGF5ZXIgcHJlcGFyZSBwbGF5YmFjayBmb3IgYSBzcGVjaWZpYyBzZWFyY2ggcXVlcnkuIEFuIGVtcHR5IG9yIG51bGwKKyAgICAgICAgICogcXVlcnkgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgYSByZXF1ZXN0IHRvIHByZXBhcmUgYW55IG11c2ljLiBJbiBvdGhlciB3b3Jkcywgb3RoZXIgc2Vzc2lvbnMKKyAgICAgICAgICogY2FuIGNvbnRpbnVlIHRvIHBsYXkgZHVyaW5nIHRoZSBwcmVwYXJhdGlvbiBvZiB0aGlzIHNlc3Npb24uIFRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIHRvCisgICAgICAgICAqIHNwZWVkIHVwIHRoZSBzdGFydCBvZiB0aGUgcGxheWJhY2suIE9uY2UgdGhlIHByZXBhcmF0aW9uIGlzIGRvbmUsIHRoZSBzZXNzaW9uIHdpbGwKKyAgICAgICAgICogY2hhbmdlIGl0cyBwbGF5YmFjayBzdGF0ZSB0byB7QGxpbmsgUGxheWJhY2tTdGF0ZSNTVEFURV9QQVVTRUR9LiBBZnRlcndhcmRzLAorICAgICAgICAgKiB7QGxpbmsgI3BsYXl9IGNhbiBiZSBjYWxsZWQgdG8gc3RhcnQgcGxheWJhY2suIElmIHRoZSBwcmVwYXJhdGlvbiBpcyBub3QgbmVlZGVkLAorICAgICAgICAgKiB7QGxpbmsgI3BsYXlGcm9tU2VhcmNofSBjYW4gYmUgZGlyZWN0bHkgY2FsbGVkIHdpdGhvdXQgdGhpcyBtZXRob2QuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBxdWVyeSBUaGUgc2VhcmNoIHF1ZXJ5LgorICAgICAgICAgKiBAcGFyYW0gZXh0cmFzIE9wdGlvbmFsIGV4dHJhcyB0aGF0IGNhbiBpbmNsdWRlIGV4dHJhIGluZm9ybWF0aW9uCisgICAgICAgICAqICAgICAgICAgICAgICAgYWJvdXQgdGhlIHF1ZXJ5LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgcHJlcGFyZUZyb21TZWFyY2goU3RyaW5nIHF1ZXJ5LCBCdW5kbGUgZXh0cmFzKSB7CisgICAgICAgICAgICBpZiAocXVlcnkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgdG8gcmVtYWluIGNvbXBhdGlibGUgd2l0aAorICAgICAgICAgICAgICAgIC8vIElOVEVOVF9BQ1RJT05fTUVESUFfUExBWV9GUk9NX1NFQVJDSAorICAgICAgICAgICAgICAgIHF1ZXJ5ID0gIiI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1TZXNzaW9uQmluZGVyLnByZXBhcmVGcm9tU2VhcmNoKCJtQ29udGV4dC5nZXRPcFBhY2thZ2VOYW1lKCkiLCBtQ2JTdHViLCBxdWVyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhcyk7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy53dGYoVEFHLCAiRXJyb3IgY2FsbGluZyBwcmVwYXJlKCIgKyBxdWVyeSArICIpLiIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlcXVlc3QgdGhhdCB0aGUgcGxheWVyIHByZXBhcmUgcGxheWJhY2sgZm9yIGEgc3BlY2lmaWMge0BsaW5rIFVyaX0uIEluIG90aGVyIHdvcmRzLAorICAgICAgICAgKiBvdGhlciBzZXNzaW9ucyBjYW4gY29udGludWUgdG8gcGxheSBkdXJpbmcgdGhlIHByZXBhcmF0aW9uIG9mIHRoaXMgc2Vzc2lvbi4gVGhpcyBtZXRob2QKKyAgICAgICAgICogY2FuIGJlIHVzZWQgdG8gc3BlZWQgdXAgdGhlIHN0YXJ0IG9mIHRoZSBwbGF5YmFjay4gT25jZSB0aGUgcHJlcGFyYXRpb24gaXMgZG9uZSwgdGhlCisgICAgICAgICAqIHNlc3Npb24gd2lsbCBjaGFuZ2UgaXRzIHBsYXliYWNrIHN0YXRlIHRvIHtAbGluayBQbGF5YmFja1N0YXRlI1NUQVRFX1BBVVNFRH0uIEFmdGVyd2FyZHMsCisgICAgICAgICAqIHtAbGluayAjcGxheX0gY2FuIGJlIGNhbGxlZCB0byBzdGFydCBwbGF5YmFjay4gSWYgdGhlIHByZXBhcmF0aW9uIGlzIG5vdCBuZWVkZWQsCisgICAgICAgICAqIHtAbGluayAjcGxheUZyb21Vcml9IGNhbiBiZSBkaXJlY3RseSBjYWxsZWQgd2l0aG91dCB0aGlzIG1ldGhvZC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHVyaSBUaGUgVVJJIG9mIHRoZSByZXF1ZXN0ZWQgbWVkaWEuCisgICAgICAgICAqIEBwYXJhbSBleHRyYXMgT3B0aW9uYWwgZXh0cmFzIHRoYXQgY2FuIGluY2x1ZGUgZXh0cmEgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG1lZGlhIGl0ZW0KKyAgICAgICAgICogICAgICAgICAgICAgICB0byBiZSBwcmVwYXJlZC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHByZXBhcmVGcm9tVXJpKFVyaSB1cmksIEJ1bmRsZSBleHRyYXMpIHsKKyAgICAgICAgICAgIGlmICh1cmkgPT0gbnVsbCB8fCBVcmkuRU1QVFkuZXF1YWxzKHVyaSkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgIllvdSBtdXN0IHNwZWNpZnkgYSBub24tZW1wdHkgVXJpIGZvciBwcmVwYXJlRnJvbVVyaS4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbVNlc3Npb25CaW5kZXIucHJlcGFyZUZyb21VcmkoIm1Db250ZXh0LmdldE9wUGFja2FnZU5hbWUoKSIsIG1DYlN0dWIsIHVyaSwgZXh0cmFzKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLnd0ZihUQUcsICJFcnJvciBjYWxsaW5nIHByZXBhcmUoIiArIHVyaSArICIpLiIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlcXVlc3QgdGhhdCB0aGUgcGxheWVyIHN0YXJ0IGl0cyBwbGF5YmFjayBhdCBpdHMgY3VycmVudCBwb3NpdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHBsYXkoKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1TZXNzaW9uQmluZGVyLnBsYXkoIm1Db250ZXh0LmdldE9wUGFja2FnZU5hbWUoKSIsIG1DYlN0dWIpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cud3RmKFRBRywgIkVycm9yIGNhbGxpbmcgcGxheS4iLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXF1ZXN0IHRoYXQgdGhlIHBsYXllciBzdGFydCBwbGF5YmFjayBmb3IgYSBzcGVjaWZpYyBtZWRpYSBpZC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG1lZGlhSWQgVGhlIGlkIG9mIHRoZSByZXF1ZXN0ZWQgbWVkaWEuCisgICAgICAgICAqIEBwYXJhbSBleHRyYXMgT3B0aW9uYWwgZXh0cmFzIHRoYXQgY2FuIGluY2x1ZGUgZXh0cmEgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG1lZGlhIGl0ZW0KKyAgICAgICAgICogICAgICAgICAgICAgICB0byBiZSBwbGF5ZWQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBwbGF5RnJvbU1lZGlhSWQoU3RyaW5nIG1lZGlhSWQsIEJ1bmRsZSBleHRyYXMpIHsKKyAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShtZWRpYUlkKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAiWW91IG11c3Qgc3BlY2lmeSBhIG5vbi1lbXB0eSBTdHJpbmcgZm9yIHBsYXlGcm9tTWVkaWFJZC4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbVNlc3Npb25CaW5kZXIucGxheUZyb21NZWRpYUlkKCJtQ29udGV4dC5nZXRPcFBhY2thZ2VOYW1lKCkiLCBtQ2JTdHViLCBtZWRpYUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFzKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLnd0ZihUQUcsICJFcnJvciBjYWxsaW5nIHBsYXkoIiArIG1lZGlhSWQgKyAiKS4iLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXF1ZXN0IHRoYXQgdGhlIHBsYXllciBzdGFydCBwbGF5YmFjayBmb3IgYSBzcGVjaWZpYyBzZWFyY2ggcXVlcnkuCisgICAgICAgICAqIEFuIGVtcHR5IG9yIG51bGwgcXVlcnkgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgYSByZXF1ZXN0IHRvIHBsYXkgYW55CisgICAgICAgICAqIG11c2ljLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gcXVlcnkgVGhlIHNlYXJjaCBxdWVyeS4KKyAgICAgICAgICogQHBhcmFtIGV4dHJhcyBPcHRpb25hbCBleHRyYXMgdGhhdCBjYW4gaW5jbHVkZSBleHRyYSBpbmZvcm1hdGlvbgorICAgICAgICAgKiAgICAgICAgICAgICAgIGFib3V0IHRoZSBxdWVyeS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHBsYXlGcm9tU2VhcmNoKFN0cmluZyBxdWVyeSwgQnVuZGxlIGV4dHJhcykgeworICAgICAgICAgICAgaWYgKHF1ZXJ5ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIHRvIHJlbWFpbiBjb21wYXRpYmxlIHdpdGgKKyAgICAgICAgICAgICAgICAvLyBJTlRFTlRfQUNUSU9OX01FRElBX1BMQVlfRlJPTV9TRUFSQ0gKKyAgICAgICAgICAgICAgICBxdWVyeSA9ICIiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtU2Vzc2lvbkJpbmRlci5wbGF5RnJvbVNlYXJjaCgibUNvbnRleHQuZ2V0T3BQYWNrYWdlTmFtZSgpIiwgbUNiU3R1YiwgcXVlcnksIGV4dHJhcyk7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy53dGYoVEFHLCAiRXJyb3IgY2FsbGluZyBwbGF5KCIgKyBxdWVyeSArICIpLiIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlcXVlc3QgdGhhdCB0aGUgcGxheWVyIHN0YXJ0IHBsYXliYWNrIGZvciBhIHNwZWNpZmljIHtAbGluayBVcml9LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gdXJpIFRoZSBVUkkgb2YgdGhlIHJlcXVlc3RlZCBtZWRpYS4KKyAgICAgICAgICogQHBhcmFtIGV4dHJhcyBPcHRpb25hbCBleHRyYXMgdGhhdCBjYW4gaW5jbHVkZSBleHRyYSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbWVkaWEgaXRlbQorICAgICAgICAgKiAgICAgICAgICAgICAgIHRvIGJlIHBsYXllZC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHBsYXlGcm9tVXJpKFVyaSB1cmksIEJ1bmRsZSBleHRyYXMpIHsKKyAgICAgICAgICAgIGlmICh1cmkgPT0gbnVsbCB8fCBVcmkuRU1QVFkuZXF1YWxzKHVyaSkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgIllvdSBtdXN0IHNwZWNpZnkgYSBub24tZW1wdHkgVXJpIGZvciBwbGF5RnJvbVVyaS4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbVNlc3Npb25CaW5kZXIucGxheUZyb21VcmkoIm1Db250ZXh0LmdldE9wUGFja2FnZU5hbWUoKSIsIG1DYlN0dWIsIHVyaSwgZXh0cmFzKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLnd0ZihUQUcsICJFcnJvciBjYWxsaW5nIHBsYXkoIiArIHVyaSArICIpLiIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFBsYXkgYW4gaXRlbSB3aXRoIGEgc3BlY2lmaWMgaWQgaW4gdGhlIHBsYXkgcXVldWUuIElmIHlvdSBzcGVjaWZ5IGFuCisgICAgICAgICAqIGlkIHRoYXQgaXMgbm90IGluIHRoZSBwbGF5IHF1ZXVlLCB0aGUgYmVoYXZpb3IgaXMgdW5kZWZpbmVkLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2tpcFRvUXVldWVJdGVtKGxvbmcgaWQpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbVNlc3Npb25CaW5kZXIuc2tpcFRvUXVldWVJdGVtKCJtQ29udGV4dC5nZXRPcFBhY2thZ2VOYW1lKCkiLCBtQ2JTdHViLCBpZCk7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy53dGYoVEFHLCAiRXJyb3IgY2FsbGluZyBza2lwVG9JdGVtKCIgKyBpZCArICIpLiIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlcXVlc3QgdGhhdCB0aGUgcGxheWVyIHBhdXNlIGl0cyBwbGF5YmFjayBhbmQgc3RheSBhdCBpdHMgY3VycmVudAorICAgICAgICAgKiBwb3NpdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHBhdXNlKCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtU2Vzc2lvbkJpbmRlci5wYXVzZSgibUNvbnRleHQuZ2V0T3BQYWNrYWdlTmFtZSgpIiwgbUNiU3R1Yik7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy53dGYoVEFHLCAiRXJyb3IgY2FsbGluZyBwYXVzZS4iLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXF1ZXN0IHRoYXQgdGhlIHBsYXllciBzdG9wIGl0cyBwbGF5YmFjazsgaXQgbWF5IGNsZWFyIGl0cyBzdGF0ZSBpbgorICAgICAgICAgKiB3aGF0ZXZlciB3YXkgaXMgYXBwcm9wcmlhdGUuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBzdG9wKCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtU2Vzc2lvbkJpbmRlci5zdG9wKCJtQ29udGV4dC5nZXRPcFBhY2thZ2VOYW1lKCkiLCBtQ2JTdHViKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLnd0ZihUQUcsICJFcnJvciBjYWxsaW5nIHN0b3AuIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogTW92ZSB0byBhIG5ldyBsb2NhdGlvbiBpbiB0aGUgbWVkaWEgc3RyZWFtLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gcG9zIFBvc2l0aW9uIHRvIG1vdmUgdG8sIGluIG1pbGxpc2Vjb25kcy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHNlZWtUbyhsb25nIHBvcykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtU2Vzc2lvbkJpbmRlci5zZWVrVG8oIm1Db250ZXh0LmdldE9wUGFja2FnZU5hbWUoKSIsIG1DYlN0dWIsIHBvcyk7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy53dGYoVEFHLCAiRXJyb3IgY2FsbGluZyBzZWVrVG8uIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU3RhcnQgZmFzdCBmb3J3YXJkaW5nLiBJZiBwbGF5YmFjayBpcyBhbHJlYWR5IGZhc3QgZm9yd2FyZGluZyB0aGlzCisgICAgICAgICAqIG1heSBpbmNyZWFzZSB0aGUgcmF0ZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIGZhc3RGb3J3YXJkKCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtU2Vzc2lvbkJpbmRlci5mYXN0Rm9yd2FyZCgibUNvbnRleHQuZ2V0T3BQYWNrYWdlTmFtZSgpIiwgbUNiU3R1Yik7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy53dGYoVEFHLCAiRXJyb3IgY2FsbGluZyBmYXN0Rm9yd2FyZC4iLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTa2lwIHRvIHRoZSBuZXh0IGl0ZW0uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBza2lwVG9OZXh0KCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtU2Vzc2lvbkJpbmRlci5uZXh0KCJtQ29udGV4dC5nZXRPcFBhY2thZ2VOYW1lKCkiLCBtQ2JTdHViKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLnd0ZihUQUcsICJFcnJvciBjYWxsaW5nIG5leHQuIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU3RhcnQgcmV3aW5kaW5nLiBJZiBwbGF5YmFjayBpcyBhbHJlYWR5IHJld2luZGluZyB0aGlzIG1heSBpbmNyZWFzZQorICAgICAgICAgKiB0aGUgcmF0ZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHJld2luZCgpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbVNlc3Npb25CaW5kZXIucmV3aW5kKCJtQ29udGV4dC5nZXRPcFBhY2thZ2VOYW1lKCkiLCBtQ2JTdHViKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLnd0ZihUQUcsICJFcnJvciBjYWxsaW5nIHJld2luZC4iLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTa2lwIHRvIHRoZSBwcmV2aW91cyBpdGVtLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2tpcFRvUHJldmlvdXMoKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1TZXNzaW9uQmluZGVyLnByZXZpb3VzKCJtQ29udGV4dC5nZXRPcFBhY2thZ2VOYW1lKCkiLCBtQ2JTdHViKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLnd0ZihUQUcsICJFcnJvciBjYWxsaW5nIHByZXZpb3VzLiIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJhdGUgdGhlIGN1cnJlbnQgY29udGVudC4gVGhpcyB3aWxsIGNhdXNlIHRoZSByYXRpbmcgdG8gYmUgc2V0IGZvcgorICAgICAgICAgKiB0aGUgY3VycmVudCB1c2VyLiBUaGUgUmF0aW5nIHR5cGUgbXVzdCBtYXRjaCB0aGUgdHlwZSByZXR1cm5lZCBieQorICAgICAgICAgKiB7QGxpbmsgI2dldFJhdGluZ1R5cGUoKX0uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSByYXRpbmcgVGhlIHJhdGluZyB0byBzZXQgZm9yIHRoZSBjdXJyZW50IGNvbnRlbnQKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFJhdGluZyhSYXRpbmcgcmF0aW5nKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1TZXNzaW9uQmluZGVyLnJhdGUoIm1Db250ZXh0LmdldE9wUGFja2FnZU5hbWUoKSIsIG1DYlN0dWIsIHJhdGluZyk7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy53dGYoVEFHLCAiRXJyb3IgY2FsbGluZyByYXRlLiIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNlbmQgYSBjdXN0b20gYWN0aW9uIGJhY2sgZm9yIHRoZSB7QGxpbmsgTWVkaWFTZXNzaW9ufSB0byBwZXJmb3JtLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gY3VzdG9tQWN0aW9uIFRoZSBhY3Rpb24gdG8gcGVyZm9ybS4KKyAgICAgICAgICogQHBhcmFtIGFyZ3MgT3B0aW9uYWwgYXJndW1lbnRzIHRvIHN1cHBseSB0byB0aGUge0BsaW5rIE1lZGlhU2Vzc2lvbn0gZm9yIHRoaXMKKyAgICAgICAgICogICAgICAgICAgICAgY3VzdG9tIGFjdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHNlbmRDdXN0b21BY3Rpb24oQE5vbk51bGwgUGxheWJhY2tTdGF0ZS5DdXN0b21BY3Rpb24gY3VzdG9tQWN0aW9uLAorICAgICAgICAgICAgICAgIEBOdWxsYWJsZSBCdW5kbGUgYXJncykgeworICAgICAgICAgICAgaWYgKGN1c3RvbUFjdGlvbiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ3VzdG9tQWN0aW9uIGNhbm5vdCBiZSBudWxsLiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2VuZEN1c3RvbUFjdGlvbihjdXN0b21BY3Rpb24uZ2V0QWN0aW9uKCksIGFyZ3MpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNlbmQgdGhlIGlkIGFuZCBhcmdzIGZyb20gYSBjdXN0b20gYWN0aW9uIGJhY2sgZm9yIHRoZSB7QGxpbmsgTWVkaWFTZXNzaW9ufSB0byBwZXJmb3JtLgorICAgICAgICAgKgorICAgICAgICAgKiBAc2VlICNzZW5kQ3VzdG9tQWN0aW9uKFBsYXliYWNrU3RhdGUuQ3VzdG9tQWN0aW9uIGFjdGlvbiwgQnVuZGxlIGFyZ3MpCisgICAgICAgICAqIEBwYXJhbSBhY3Rpb24gVGhlIGFjdGlvbiBpZGVudGlmaWVyIG9mIHRoZSB7QGxpbmsgUGxheWJhY2tTdGF0ZS5DdXN0b21BY3Rpb259IGFzCisgICAgICAgICAqICAgICAgICAgICAgICAgc3BlY2lmaWVkIGJ5IHRoZSB7QGxpbmsgTWVkaWFTZXNzaW9ufS4KKyAgICAgICAgICogQHBhcmFtIGFyZ3MgT3B0aW9uYWwgYXJndW1lbnRzIHRvIHN1cHBseSB0byB0aGUge0BsaW5rIE1lZGlhU2Vzc2lvbn0gZm9yIHRoaXMKKyAgICAgICAgICogICAgICAgICAgICAgY3VzdG9tIGFjdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHNlbmRDdXN0b21BY3Rpb24oQE5vbk51bGwgU3RyaW5nIGFjdGlvbiwgQE51bGxhYmxlIEJ1bmRsZSBhcmdzKSB7CisgICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkoYWN0aW9uKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkN1c3RvbUFjdGlvbiBjYW5ub3QgYmUgbnVsbC4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbVNlc3Npb25CaW5kZXIuc2VuZEN1c3RvbUFjdGlvbigibUNvbnRleHQuZ2V0T3BQYWNrYWdlTmFtZSgpIiwgbUNiU3R1YiwgYWN0aW9uLCBhcmdzKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiRGVhZCBvYmplY3QgaW4gc2VuZEN1c3RvbUFjdGlvbi4iLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEhvbGRzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjdXJyZW50IHBsYXliYWNrIGFuZCBob3cgYXVkaW8gaXMgaGFuZGxlZCBmb3IKKyAgICAgKiB0aGlzIHNlc3Npb24uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBQbGF5YmFja0luZm8geworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHNlc3Npb24gdXNlcyByZW1vdGUgcGxheWJhY2suCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQTEFZQkFDS19UWVBFX1JFTU9URSA9IDI7CisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgc2Vzc2lvbiB1c2VzIGxvY2FsIHBsYXliYWNrLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUExBWUJBQ0tfVFlQRV9MT0NBTCA9IDE7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbVZvbHVtZVR5cGU7CisgICAgICAgIHByaXZhdGUgZmluYWwgaW50IG1Wb2x1bWVDb250cm9sOworICAgICAgICBwcml2YXRlIGZpbmFsIGludCBtTWF4Vm9sdW1lOworICAgICAgICBwcml2YXRlIGZpbmFsIGludCBtQ3VycmVudFZvbHVtZTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBBdWRpb0F0dHJpYnV0ZXMgbUF1ZGlvQXR0cnM7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBoaWRlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgUGxheWJhY2tJbmZvKGludCB0eXBlLCBBdWRpb0F0dHJpYnV0ZXMgYXR0cnMsIGludCBjb250cm9sLCBpbnQgbWF4LCBpbnQgY3VycmVudCkgeworICAgICAgICAgICAgbVZvbHVtZVR5cGUgPSB0eXBlOworICAgICAgICAgICAgbUF1ZGlvQXR0cnMgPSBhdHRyczsKKyAgICAgICAgICAgIG1Wb2x1bWVDb250cm9sID0gY29udHJvbDsKKyAgICAgICAgICAgIG1NYXhWb2x1bWUgPSBtYXg7CisgICAgICAgICAgICBtQ3VycmVudFZvbHVtZSA9IGN1cnJlbnQ7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IHRoZSB0eXBlIG9mIHBsYXliYWNrIHdoaWNoIGFmZmVjdHMgdm9sdW1lIGhhbmRsaW5nLiBPbmUgb2Y6CisgICAgICAgICAqIDx1bD4KKyAgICAgICAgICogPGxpPntAbGluayAjUExBWUJBQ0tfVFlQRV9MT0NBTH08L2xpPgorICAgICAgICAgKiA8bGk+e0BsaW5rICNQTEFZQkFDS19UWVBFX1JFTU9URX08L2xpPgorICAgICAgICAgKiA8L3VsPgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIFRoZSB0eXBlIG9mIHBsYXliYWNrIHRoaXMgc2Vzc2lvbiBpcyB1c2luZy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0UGxheWJhY2tUeXBlKCkgeworICAgICAgICAgICAgcmV0dXJuIG1Wb2x1bWVUeXBlOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0aGUgYXVkaW8gYXR0cmlidXRlcyBmb3IgdGhpcyBzZXNzaW9uLiBUaGUgYXR0cmlidXRlcyB3aWxsIGFmZmVjdAorICAgICAgICAgKiB2b2x1bWUgaGFuZGxpbmcgZm9yIHRoZSBzZXNzaW9uLiBXaGVuIHRoZSB2b2x1bWUgdHlwZSBpcworICAgICAgICAgKiB7QGxpbmsgUGxheWJhY2tJbmZvI1BMQVlCQUNLX1RZUEVfUkVNT1RFfSB0aGVzZSBtYXkgYmUgaWdub3JlZCBieSB0aGUKKyAgICAgICAgICogcmVtb3RlIHZvbHVtZSBoYW5kbGVyLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIFRoZSBhdHRyaWJ1dGVzIGZvciB0aGlzIHNlc3Npb24uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQXVkaW9BdHRyaWJ1dGVzIGdldEF1ZGlvQXR0cmlidXRlcygpIHsKKyAgICAgICAgICAgIHJldHVybiBtQXVkaW9BdHRyczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgdGhlIHR5cGUgb2Ygdm9sdW1lIGNvbnRyb2wgdGhhdCBjYW4gYmUgdXNlZC4gT25lIG9mOgorICAgICAgICAgKiA8dWw+CisgICAgICAgICAqIDxsaT57QGxpbmsgVm9sdW1lUHJvdmlkZXIjVk9MVU1FX0NPTlRST0xfQUJTT0xVVEV9PC9saT4KKyAgICAgICAgICogPGxpPntAbGluayBWb2x1bWVQcm92aWRlciNWT0xVTUVfQ09OVFJPTF9SRUxBVElWRX08L2xpPgorICAgICAgICAgKiA8bGk+e0BsaW5rIFZvbHVtZVByb3ZpZGVyI1ZPTFVNRV9DT05UUk9MX0ZJWEVEfTwvbGk+CisgICAgICAgICAqIDwvdWw+CisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gVGhlIHR5cGUgb2Ygdm9sdW1lIGNvbnRyb2wgdGhhdCBtYXkgYmUgdXNlZCB3aXRoIHRoaXMKKyAgICAgICAgICogICAgICAgICBzZXNzaW9uLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGludCBnZXRWb2x1bWVDb250cm9sKCkgeworICAgICAgICAgICAgcmV0dXJuIG1Wb2x1bWVDb250cm9sOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0aGUgbWF4aW11bSB2b2x1bWUgdGhhdCBtYXkgYmUgc2V0IGZvciB0aGlzIHNlc3Npb24uCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gVGhlIG1heGltdW0gYWxsb3dlZCB2b2x1bWUgd2hlcmUgdGhpcyBzZXNzaW9uIGlzIHBsYXlpbmcuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgaW50IGdldE1heFZvbHVtZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtTWF4Vm9sdW1lOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0aGUgY3VycmVudCB2b2x1bWUgZm9yIHRoaXMgc2Vzc2lvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBUaGUgY3VycmVudCB2b2x1bWUgd2hlcmUgdGhpcyBzZXNzaW9uIGlzIHBsYXlpbmcuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgaW50IGdldEN1cnJlbnRWb2x1bWUoKSB7CisgICAgICAgICAgICByZXR1cm4gbUN1cnJlbnRWb2x1bWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBjbGFzcyBDYWxsYmFja1N0dWIgZXh0ZW5kcyBJU2Vzc2lvbkNvbnRyb2xsZXJDYWxsYmFjay5TdHViIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBXZWFrUmVmZXJlbmNlPE1lZGlhQ29udHJvbGxlcj4gbUNvbnRyb2xsZXI7CisKKyAgICAgICAgcHVibGljIENhbGxiYWNrU3R1YihNZWRpYUNvbnRyb2xsZXIgY29udHJvbGxlcikgeworICAgICAgICAgICAgbUNvbnRyb2xsZXIgPSBuZXcgV2Vha1JlZmVyZW5jZTxNZWRpYUNvbnRyb2xsZXI+KGNvbnRyb2xsZXIpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uU2Vzc2lvbkRlc3Ryb3llZCgpIHsKKyAgICAgICAgICAgIE1lZGlhQ29udHJvbGxlciBjb250cm9sbGVyID0gbUNvbnRyb2xsZXIuZ2V0KCk7CisgICAgICAgICAgICBpZiAoY29udHJvbGxlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgY29udHJvbGxlci5wb3N0TWVzc2FnZShNU0dfREVTVFJPWUVELCBudWxsLCBudWxsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkV2ZW50KFN0cmluZyBldmVudCwgQnVuZGxlIGV4dHJhcykgeworICAgICAgICAgICAgTWVkaWFDb250cm9sbGVyIGNvbnRyb2xsZXIgPSBtQ29udHJvbGxlci5nZXQoKTsKKyAgICAgICAgICAgIGlmIChjb250cm9sbGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjb250cm9sbGVyLnBvc3RNZXNzYWdlKE1TR19FVkVOVCwgZXZlbnQsIGV4dHJhcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25QbGF5YmFja1N0YXRlQ2hhbmdlZChQbGF5YmFja1N0YXRlIHN0YXRlKSB7CisgICAgICAgICAgICBNZWRpYUNvbnRyb2xsZXIgY29udHJvbGxlciA9IG1Db250cm9sbGVyLmdldCgpOworICAgICAgICAgICAgaWYgKGNvbnRyb2xsZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIucG9zdE1lc3NhZ2UoTVNHX1VQREFURV9QTEFZQkFDS19TVEFURSwgc3RhdGUsIG51bGwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uTWV0YWRhdGFDaGFuZ2VkKE1lZGlhTWV0YWRhdGEgbWV0YWRhdGEpIHsKKyAgICAgICAgICAgIE1lZGlhQ29udHJvbGxlciBjb250cm9sbGVyID0gbUNvbnRyb2xsZXIuZ2V0KCk7CisgICAgICAgICAgICBpZiAoY29udHJvbGxlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgY29udHJvbGxlci5wb3N0TWVzc2FnZShNU0dfVVBEQVRFX01FVEFEQVRBLCBtZXRhZGF0YSwgbnVsbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvL1RPRE86KGIvMTE5NzUwODA3KSBSZXNvbHZlIGhpZGRlbiBBUEkgdXNhZ2UgUGFyY2VsZWRMaXN0U2xpY2UuCisgICAgICAgIC8qCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblF1ZXVlQ2hhbmdlZChQYXJjZWxlZExpc3RTbGljZSBwYXJjZWxlZFF1ZXVlKSB7CisgICAgICAgICAgICBMaXN0PE1lZGlhU2Vzc2lvbi5RdWV1ZUl0ZW0+IHF1ZXVlID0gcGFyY2VsZWRRdWV1ZSA9PSBudWxsID8gbnVsbCA6IHBhcmNlbGVkUXVldWUKKyAgICAgICAgICAgICAgICAgICAgLmdldExpc3QoKTsKKyAgICAgICAgICAgIE1lZGlhQ29udHJvbGxlciBjb250cm9sbGVyID0gbUNvbnRyb2xsZXIuZ2V0KCk7CisgICAgICAgICAgICBpZiAoY29udHJvbGxlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgY29udHJvbGxlci5wb3N0TWVzc2FnZShNU0dfVVBEQVRFX1FVRVVFLCBxdWV1ZSwgbnVsbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgKi8KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25RdWV1ZVRpdGxlQ2hhbmdlZChDaGFyU2VxdWVuY2UgdGl0bGUpIHsKKyAgICAgICAgICAgIE1lZGlhQ29udHJvbGxlciBjb250cm9sbGVyID0gbUNvbnRyb2xsZXIuZ2V0KCk7CisgICAgICAgICAgICBpZiAoY29udHJvbGxlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgY29udHJvbGxlci5wb3N0TWVzc2FnZShNU0dfVVBEQVRFX1FVRVVFX1RJVExFLCB0aXRsZSwgbnVsbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25FeHRyYXNDaGFuZ2VkKEJ1bmRsZSBleHRyYXMpIHsKKyAgICAgICAgICAgIE1lZGlhQ29udHJvbGxlciBjb250cm9sbGVyID0gbUNvbnRyb2xsZXIuZ2V0KCk7CisgICAgICAgICAgICBpZiAoY29udHJvbGxlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgY29udHJvbGxlci5wb3N0TWVzc2FnZShNU0dfVVBEQVRFX0VYVFJBUywgZXh0cmFzLCBudWxsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblZvbHVtZUluZm9DaGFuZ2VkKFBhcmNlbGFibGVWb2x1bWVJbmZvIHB2aSkgeworICAgICAgICAgICAgTWVkaWFDb250cm9sbGVyIGNvbnRyb2xsZXIgPSBtQ29udHJvbGxlci5nZXQoKTsKKyAgICAgICAgICAgIGlmIChjb250cm9sbGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBQbGF5YmFja0luZm8gaW5mbyA9IG5ldyBQbGF5YmFja0luZm8ocHZpLnZvbHVtZVR5cGUsIHB2aS5hdWRpb0F0dHJzLAorICAgICAgICAgICAgICAgICAgICAgICAgcHZpLmNvbnRyb2xUeXBlLCBwdmkubWF4Vm9sdW1lLCBwdmkuY3VycmVudFZvbHVtZSk7CisgICAgICAgICAgICAgICAgY29udHJvbGxlci5wb3N0TWVzc2FnZShNU0dfVVBEQVRFX1ZPTFVNRSwgaW5mbywgbnVsbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGNsYXNzIE1lc3NhZ2VIYW5kbGVyIGV4dGVuZHMgSGFuZGxlciB7CisgICAgICAgIHByaXZhdGUgZmluYWwgTWVkaWFDb250cm9sbGVyLkNhbGxiYWNrIG1DYWxsYmFjazsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1SZWdpc3RlcmVkID0gZmFsc2U7CisKKyAgICAgICAgcHVibGljIE1lc3NhZ2VIYW5kbGVyKExvb3BlciBsb29wZXIsIE1lZGlhQ29udHJvbGxlci5DYWxsYmFjayBjYikgeworICAgICAgICAgICAgLy9UT0RPOihiLzExOTUzOTg0OSkgVW5jb21tZW50IGJlbG93IGxpbmUgYW5kIHJlc29sdmUgdGhlIGVycm9yLgorICAgICAgICAgICAgLy8gc3VwZXIobG9vcGVyLCBudWxsLCB0cnVlKTsKKyAgICAgICAgICAgIG1DYWxsYmFjayA9IGNiOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKKyAgICAgICAgICAgIGlmICghbVJlZ2lzdGVyZWQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzd2l0Y2ggKG1zZy53aGF0KSB7CisgICAgICAgICAgICAgICAgY2FzZSBNU0dfRVZFTlQ6CisgICAgICAgICAgICAgICAgICAgIG1DYWxsYmFjay5vblNlc3Npb25FdmVudCgoU3RyaW5nKSBtc2cub2JqLCBtc2cuZ2V0RGF0YSgpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBNU0dfVVBEQVRFX1BMQVlCQUNLX1NUQVRFOgorICAgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2sub25QbGF5YmFja1N0YXRlQ2hhbmdlZCgoUGxheWJhY2tTdGF0ZSkgbXNnLm9iaik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgTVNHX1VQREFURV9NRVRBREFUQToKKyAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrLm9uTWV0YWRhdGFDaGFuZ2VkKChNZWRpYU1ldGFkYXRhKSBtc2cub2JqKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBNU0dfVVBEQVRFX1FVRVVFOgorICAgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2sub25RdWV1ZUNoYW5nZWQoKExpc3Q8TWVkaWFTZXNzaW9uLlF1ZXVlSXRlbT4pIG1zZy5vYmopOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19VUERBVEVfUVVFVUVfVElUTEU6CisgICAgICAgICAgICAgICAgICAgIG1DYWxsYmFjay5vblF1ZXVlVGl0bGVDaGFuZ2VkKChDaGFyU2VxdWVuY2UpIG1zZy5vYmopOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19VUERBVEVfRVhUUkFTOgorICAgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2sub25FeHRyYXNDaGFuZ2VkKChCdW5kbGUpIG1zZy5vYmopOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19VUERBVEVfVk9MVU1FOgorICAgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2sub25BdWRpb0luZm9DaGFuZ2VkKChQbGF5YmFja0luZm8pIG1zZy5vYmopOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19ERVNUUk9ZRUQ6CisgICAgICAgICAgICAgICAgICAgIG1DYWxsYmFjay5vblNlc3Npb25EZXN0cm95ZWQoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBwb3N0KGludCB3aGF0LCBPYmplY3Qgb2JqLCBCdW5kbGUgZGF0YSkgeworICAgICAgICAgICAgTWVzc2FnZSBtc2cgPSBvYnRhaW5NZXNzYWdlKHdoYXQsIG9iaik7CisgICAgICAgICAgICBtc2cuc2V0RGF0YShkYXRhKTsKKyAgICAgICAgICAgIG1zZy5zZW5kVG9UYXJnZXQoKTsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL2FwZXgvamF2YS9hbmRyb2lkL21lZGlhL3Nlc3Npb24vTWVkaWFTZXNzaW9uLmFpZGwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvYXBleC9qYXZhL2FuZHJvaWQvbWVkaWEvc2Vzc2lvbi9NZWRpYVNlc3Npb24uYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjU3Y2VmCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL2FwZXgvamF2YS9hbmRyb2lkL21lZGlhL3Nlc3Npb24vTWVkaWFTZXNzaW9uLmFpZGwKQEAgLTAsMCArMSwxOSBAQAorLyogQ29weXJpZ2h0IDIwMTQsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYS5zZXNzaW9uOworCitwYXJjZWxhYmxlIE1lZGlhU2Vzc2lvbi5Ub2tlbjsKK3BhcmNlbGFibGUgTWVkaWFTZXNzaW9uLlF1ZXVlSXRlbTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvYXBleC9qYXZhL2FuZHJvaWQvbWVkaWEvc2Vzc2lvbi9NZWRpYVNlc3Npb24uamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9hcGV4L2phdmEvYW5kcm9pZC9tZWRpYS9zZXNzaW9uL01lZGlhU2Vzc2lvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0MGUzYjAKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvYXBleC9qYXZhL2FuZHJvaWQvbWVkaWEvc2Vzc2lvbi9NZWRpYVNlc3Npb24uamF2YQpAQCAtMCwwICsxLDE1NjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWEuc2Vzc2lvbjsKKworaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5JbnREZWY7CitpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLk5vbk51bGw7CitpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLk51bGxhYmxlOworaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5VbnN1cHBvcnRlZEFwcFVzYWdlOworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKKy8vaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYXJjZWxlZExpc3RTbGljZTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvQXR0cmlidXRlczsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhRGVzY3JpcHRpb247CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYU1ldGFkYXRhOworaW1wb3J0IGFuZHJvaWQubWVkaWEuUmF0aW5nOworaW1wb3J0IGFuZHJvaWQubWVkaWEuVm9sdW1lUHJvdmlkZXI7CitpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlOworaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQub3MuUmVzdWx0UmVjZWl2ZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5Vc2VySGFuZGxlOworaW1wb3J0IGFuZHJvaWQubWVkaWEuc2Vzc2lvbi5NZWRpYVNlc3Npb25NYW5hZ2VyLlJlbW90ZVVzZXJJbmZvOworaW1wb3J0IGFuZHJvaWQuc2VydmljZS5tZWRpYS5NZWRpYUJyb3dzZXJTZXJ2aWNlOworaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuUGFpcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdDb25maWd1cmF0aW9uOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKK2ltcG9ydCBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2U7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk9iamVjdHM7CisKKy8qKgorICogQWxsb3dzIGludGVyYWN0aW9uIHdpdGggbWVkaWEgY29udHJvbGxlcnMsIHZvbHVtZSBrZXlzLCBtZWRpYSBidXR0b25zLCBhbmQKKyAqIHRyYW5zcG9ydCBjb250cm9scy4KKyAqIDxwPgorICogQSBNZWRpYVNlc3Npb24gc2hvdWxkIGJlIGNyZWF0ZWQgd2hlbiBhbiBhcHAgd2FudHMgdG8gcHVibGlzaCBtZWRpYSBwbGF5YmFjaworICogaW5mb3JtYXRpb24gb3IgaGFuZGxlIG1lZGlhIGtleXMuIEluIGdlbmVyYWwgYW4gYXBwIG9ubHkgbmVlZHMgb25lIHNlc3Npb24KKyAqIGZvciBhbGwgcGxheWJhY2ssIHRob3VnaCBtdWx0aXBsZSBzZXNzaW9ucyBjYW4gYmUgY3JlYXRlZCB0byBwcm92aWRlIGZpbmVyCisgKiBncmFpbiBjb250cm9scyBvZiBtZWRpYS4KKyAqIDxwPgorICogT25jZSBhIHNlc3Npb24gaXMgY3JlYXRlZCB0aGUgb3duZXIgb2YgdGhlIHNlc3Npb24gbWF5IHBhc3MgaXRzCisgKiB7QGxpbmsgI2dldFNlc3Npb25Ub2tlbigpIHNlc3Npb24gdG9rZW59IHRvIG90aGVyIHByb2Nlc3NlcyB0byBhbGxvdyB0aGVtIHRvCisgKiBjcmVhdGUgYSB7QGxpbmsgTWVkaWFDb250cm9sbGVyfSB0byBpbnRlcmFjdCB3aXRoIHRoZSBzZXNzaW9uLgorICogPHA+CisgKiBUbyByZWNlaXZlIGNvbW1hbmRzLCBtZWRpYSBrZXlzLCBhbmQgb3RoZXIgZXZlbnRzIGEge0BsaW5rIENhbGxiYWNrfSBtdXN0IGJlCisgKiBzZXQgd2l0aCB7QGxpbmsgI3NldENhbGxiYWNrKENhbGxiYWNrKX0gYW5kIHtAbGluayAjc2V0QWN0aXZlKGJvb2xlYW4pCisgKiBzZXRBY3RpdmUodHJ1ZSl9IG11c3QgYmUgY2FsbGVkLgorICogPHA+CisgKiBXaGVuIGFuIGFwcCBpcyBmaW5pc2hlZCBwZXJmb3JtaW5nIHBsYXliYWNrIGl0IG11c3QgY2FsbCB7QGxpbmsgI3JlbGVhc2UoKX0KKyAqIHRvIGNsZWFuIHVwIHRoZSBzZXNzaW9uIGFuZCBub3RpZnkgYW55IGNvbnRyb2xsZXJzLgorICogPHA+CisgKiBNZWRpYVNlc3Npb24gb2JqZWN0cyBhcmUgdGhyZWFkIHNhZmUuCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBNZWRpYVNlc3Npb24geworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTWVkaWFTZXNzaW9uIjsKKworICAgIC8qKgorICAgICAqIFNldCB0aGlzIGZsYWcgb24gdGhlIHNlc3Npb24gdG8gaW5kaWNhdGUgdGhhdCBpdCBjYW4gaGFuZGxlIG1lZGlhIGJ1dHRvbgorICAgICAqIGV2ZW50cy4KKyAgICAgKiBAZGVwcmVjYXRlZCBUaGlzIGZsYWcgaXMgbm8gbG9uZ2VyIHVzZWQuIEFsbCBtZWRpYSBzZXNzaW9ucyBhcmUgZXhwZWN0ZWQgdG8gaGFuZGxlIG1lZGlhCisgICAgICogYnV0dG9uIGV2ZW50cyBub3cuCisgICAgICovCisgICAgQERlcHJlY2F0ZWQKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX0hBTkRMRVNfTUVESUFfQlVUVE9OUyA9IDEgPDwgMDsKKworICAgIC8qKgorICAgICAqIFNldCB0aGlzIGZsYWcgb24gdGhlIHNlc3Npb24gdG8gaW5kaWNhdGUgdGhhdCBpdCBoYW5kbGVzIHRyYW5zcG9ydAorICAgICAqIGNvbnRyb2wgY29tbWFuZHMgdGhyb3VnaCBpdHMge0BsaW5rIENhbGxiYWNrfS4KKyAgICAgKiBAZGVwcmVjYXRlZCBUaGlzIGZsYWcgaXMgbm8gbG9uZ2VyIHVzZWQuIEFsbCBtZWRpYSBzZXNzaW9ucyBhcmUgZXhwZWN0ZWQgdG8gaGFuZGxlIHRyYW5zcG9ydAorICAgICAqIGNvbnRyb2xzIG5vdy4KKyAgICAgKi8KKyAgICBARGVwcmVjYXRlZAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfSEFORExFU19UUkFOU1BPUlRfQ09OVFJPTFMgPSAxIDw8IDE7CisKKyAgICAvKioKKyAgICAgKiBTeXN0ZW0gb25seSBmbGFnIGZvciBhIHNlc3Npb24gdGhhdCBuZWVkcyB0byBoYXZlIHByaW9yaXR5IG92ZXIgYWxsIG90aGVyCisgICAgICogc2Vzc2lvbnMuIFRoaXMgZmxhZyBlbnN1cmVzIHRoaXMgc2Vzc2lvbiB3aWxsIHJlY2VpdmUgbWVkaWEgYnV0dG9uIGV2ZW50cworICAgICAqIHJlZ2FyZGxlc3Mgb2YgdGhlIGN1cnJlbnQgb3JkZXJpbmcgaW4gdGhlIHN5c3RlbS4KKyAgICAgKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19FWENMVVNJVkVfR0xPQkFMX1BSSU9SSVRZID0gMSA8PCAxNjsKKworICAgIC8qKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5WQUxJRF9VSUQgPSAtMTsKKworICAgIC8qKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5WQUxJRF9QSUQgPSAtMTsKKworICAgIC8qKiBAaGlkZSAqLworICAgIEBSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlNPVVJDRSkKKyAgICBASW50RGVmKGZsYWcgPSB0cnVlLCB2YWx1ZSA9IHsKKyAgICAgICAgICAgIEZMQUdfSEFORExFU19NRURJQV9CVVRUT05TLAorICAgICAgICAgICAgRkxBR19IQU5ETEVTX1RSQU5TUE9SVF9DT05UUk9MUywKKyAgICAgICAgICAgIEZMQUdfRVhDTFVTSVZFX0dMT0JBTF9QUklPUklUWSB9KQorICAgIHB1YmxpYyBAaW50ZXJmYWNlIFNlc3Npb25GbGFncyB7IH0KKworICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IG1Mb2NrID0gbmV3IE9iamVjdCgpOworICAgIHByaXZhdGUgZmluYWwgaW50IG1NYXhCaXRtYXBTaXplOworCisgICAgcHJpdmF0ZSBmaW5hbCBNZWRpYVNlc3Npb24uVG9rZW4gbVNlc3Npb25Ub2tlbjsKKyAgICBwcml2YXRlIGZpbmFsIE1lZGlhQ29udHJvbGxlciBtQ29udHJvbGxlcjsKKyAgICBwcml2YXRlIGZpbmFsIElTZXNzaW9uIG1CaW5kZXI7CisgICAgcHJpdmF0ZSBmaW5hbCBDYWxsYmFja1N0dWIgbUNiU3R1YjsKKworICAgIC8vIERvIG5vdCBjaGFuZ2UgdGhlIG5hbWUgb2YgbUNhbGxiYWNrLiBTdXBwb3J0IGxpYiBhY2Nlc3NlcyB0aGlzIGJ5IHVzaW5nIHJlZmxlY3Rpb24uCisgICAgQFVuc3VwcG9ydGVkQXBwVXNhZ2UKKyAgICBwcml2YXRlIENhbGxiYWNrTWVzc2FnZUhhbmRsZXIgbUNhbGxiYWNrOworICAgIHByaXZhdGUgVm9sdW1lUHJvdmlkZXIgbVZvbHVtZVByb3ZpZGVyOworICAgIHByaXZhdGUgUGxheWJhY2tTdGF0ZSBtUGxheWJhY2tTdGF0ZTsKKworICAgIHByaXZhdGUgYm9vbGVhbiBtQWN0aXZlID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHNlc3Npb24uIFRoZSBzZXNzaW9uIHdpbGwgYXV0b21hdGljYWxseSBiZSByZWdpc3RlcmVkIHdpdGgKKyAgICAgKiB0aGUgc3lzdGVtIGJ1dCB3aWxsIG5vdCBiZSBwdWJsaXNoZWQgdW50aWwge0BsaW5rICNzZXRBY3RpdmUoYm9vbGVhbikKKyAgICAgKiBzZXRBY3RpdmUodHJ1ZSl9IGlzIGNhbGxlZC4gWW91IG11c3QgY2FsbCB7QGxpbmsgI3JlbGVhc2UoKX0gd2hlbgorICAgICAqIGZpbmlzaGVkIHdpdGggdGhlIHNlc3Npb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCB0byB1c2UgdG8gY3JlYXRlIHRoZSBzZXNzaW9uLgorICAgICAqIEBwYXJhbSB0YWcgQSBzaG9ydCBuYW1lIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMuCisgICAgICovCisgICAgcHVibGljIE1lZGlhU2Vzc2lvbihATm9uTnVsbCBDb250ZXh0IGNvbnRleHQsIEBOb25OdWxsIFN0cmluZyB0YWcpIHsKKyAgICAgICAgdGhpcyhjb250ZXh0LCB0YWcsIFVzZXJIYW5kbGUubXlVc2VySWQoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBzZXNzaW9uIGFzIHRoZSBzcGVjaWZpZWQgdXNlci4gVG8gY3JlYXRlIGEgc2Vzc2lvbiBhcyBhCisgICAgICogdXNlciBvdGhlciB0aGFuIHlvdXIgb3duIHlvdSBtdXN0IGhvbGQgdGhlCisgICAgICoge0BsaW5rIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbiNJTlRFUkFDVF9BQ1JPU1NfVVNFUlNfRlVMTH0KKyAgICAgKiBwZXJtaXNzaW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgdG8gdXNlIHRvIGNyZWF0ZSB0aGUgc2Vzc2lvbi4KKyAgICAgKiBAcGFyYW0gdGFnIEEgc2hvcnQgbmFtZSBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLgorICAgICAqIEBwYXJhbSB1c2VySWQgVGhlIHVzZXIgaWQgdG8gY3JlYXRlIHRoZSBzZXNzaW9uIGFzLgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIE1lZGlhU2Vzc2lvbihATm9uTnVsbCBDb250ZXh0IGNvbnRleHQsIEBOb25OdWxsIFN0cmluZyB0YWcsIGludCB1c2VySWQpIHsKKyAgICAgICAgaWYgKGNvbnRleHQgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY29udGV4dCBjYW5ub3QgYmUgbnVsbC4iKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkodGFnKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidGFnIGNhbm5vdCBiZSBudWxsIG9yIGVtcHR5Iik7CisgICAgICAgIH0KKyAgICAgICAgLy9UT0RPKGIvMTE5NzQ5Nzk4KTogUmVzb2x2ZSBoaWRkZW4gQVBJIHVzYWdlLiBjb20uYW5kcm9pZC5pbnRlcm5hbC5SCisgICAgICAgIC8vbU1heEJpdG1hcFNpemUgPSBjb250ZXh0LmdldFJlc291cmNlcygpLmdldERpbWVuc2lvblBpeGVsU2l6ZSgKKyAgICAgICAgICAgICAgICAvL2NvbS5hbmRyb2lkLmludGVybmFsLlIuZGltZW4uY29uZmlnX21lZGlhTWV0YWRhdGFCaXRtYXBNYXhTaXplKTsKKyAgICAgICAgbU1heEJpdG1hcFNpemUgPSAxMDI0OyAgLy9UT0RPOiByZW1vdmUgdGhpcy4KKyAgICAgICAgbUNiU3R1YiA9IG5ldyBDYWxsYmFja1N0dWIodGhpcyk7CisgICAgICAgIE1lZGlhU2Vzc2lvbk1hbmFnZXIgbWFuYWdlciA9IChNZWRpYVNlc3Npb25NYW5hZ2VyKSBjb250ZXh0CisgICAgICAgICAgICAgICAgLmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5NRURJQV9TRVNTSU9OX1NFUlZJQ0UpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy9UT0RPKGIvMTE5NzQ5ODYyKTogUmVzb2x2ZSBoaWRkZW4gQVBJIHVzYWdlLiBNZWRpYVNlc3Npb01hbmFnZXIjY3JlYXRlU2Vzc2lvbgorICAgICAgICAgICAgLy9tQmluZGVyID0gbWFuYWdlci5jcmVhdGVTZXNzaW9uKG1DYlN0dWIsIHRhZywgdXNlcklkKTsKKyAgICAgICAgICAgIG1CaW5kZXIgPSBudWxsOyAgLy9UT0RPOiByZW1vdmUgdGhpcy4KKyAgICAgICAgICAgIG1TZXNzaW9uVG9rZW4gPSBuZXcgVG9rZW4obUJpbmRlci5nZXRDb250cm9sbGVyKCkpOworICAgICAgICAgICAgbUNvbnRyb2xsZXIgPSBuZXcgTWVkaWFDb250cm9sbGVyKGNvbnRleHQsIG1TZXNzaW9uVG9rZW4pOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlJlbW90ZSBlcnJvciBjcmVhdGluZyBzZXNzaW9uLiIsIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBjYWxsYmFjayB0byByZWNlaXZlIHVwZGF0ZXMgZm9yIHRoZSBNZWRpYVNlc3Npb24uIFRoaXMgaW5jbHVkZXMKKyAgICAgKiBtZWRpYSBidXR0b24gZXZlbnRzIGFuZCB0cmFuc3BvcnQgY29udHJvbHMuIFRoZSBjYWxsZXIncyB0aHJlYWQgd2lsbCBiZQorICAgICAqIHVzZWQgdG8gcG9zdCB1cGRhdGVzLgorICAgICAqIDxwPgorICAgICAqIFNldCB0aGUgY2FsbGJhY2sgdG8gbnVsbCB0byBzdG9wIHJlY2VpdmluZyB1cGRhdGVzLgorICAgICAqCisgICAgICogQHBhcmFtIGNhbGxiYWNrIFRoZSBjYWxsYmFjayBvYmplY3QKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDYWxsYmFjayhATnVsbGFibGUgQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgc2V0Q2FsbGJhY2soY2FsbGJhY2ssIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgY2FsbGJhY2sgdG8gcmVjZWl2ZSB1cGRhdGVzIGZvciB0aGUgTWVkaWFTZXNzaW9uLiBUaGlzIGluY2x1ZGVzCisgICAgICogbWVkaWEgYnV0dG9uIGV2ZW50cyBhbmQgdHJhbnNwb3J0IGNvbnRyb2xzLgorICAgICAqIDxwPgorICAgICAqIFNldCB0aGUgY2FsbGJhY2sgdG8gbnVsbCB0byBzdG9wIHJlY2VpdmluZyB1cGRhdGVzLgorICAgICAqCisgICAgICogQHBhcmFtIGNhbGxiYWNrIFRoZSBjYWxsYmFjayB0byByZWNlaXZlIHVwZGF0ZXMgb24uCisgICAgICogQHBhcmFtIGhhbmRsZXIgVGhlIGhhbmRsZXIgdGhhdCBldmVudHMgc2hvdWxkIGJlIHBvc3RlZCBvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDYWxsYmFjayhATnVsbGFibGUgQ2FsbGJhY2sgY2FsbGJhY2ssIEBOdWxsYWJsZSBIYW5kbGVyIGhhbmRsZXIpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgaWYgKG1DYWxsYmFjayAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8gV2UncmUgdXBkYXRpbmcgdGhlIGNhbGxiYWNrLCBjbGVhciB0aGUgc2Vzc2lvbiBmcm9tIHRoZSBvbGQgb25lLgorICAgICAgICAgICAgICAgIG1DYWxsYmFjay5tQ2FsbGJhY2subVNlc3Npb24gPSBudWxsOworICAgICAgICAgICAgICAgIG1DYWxsYmFjay5yZW1vdmVDYWxsYmFja3NBbmRNZXNzYWdlcyhudWxsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjYWxsYmFjayA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUNhbGxiYWNrID0gbnVsbDsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaGFuZGxlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgaGFuZGxlciA9IG5ldyBIYW5kbGVyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYWxsYmFjay5tU2Vzc2lvbiA9IHRoaXM7CisgICAgICAgICAgICBDYWxsYmFja01lc3NhZ2VIYW5kbGVyIG1zZ0hhbmRsZXIgPSBuZXcgQ2FsbGJhY2tNZXNzYWdlSGFuZGxlcihoYW5kbGVyLmdldExvb3BlcigpLAorICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayk7CisgICAgICAgICAgICBtQ2FsbGJhY2sgPSBtc2dIYW5kbGVyOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IGFuIGludGVudCBmb3IgbGF1bmNoaW5nIFVJIGZvciB0aGlzIFNlc3Npb24uIFRoaXMgY2FuIGJlIHVzZWQgYXMgYQorICAgICAqIHF1aWNrIGxpbmsgdG8gYW4gb25nb2luZyBtZWRpYSBzY3JlZW4uIFRoZSBpbnRlbnQgc2hvdWxkIGJlIGZvciBhbgorICAgICAqIGFjdGl2aXR5IHRoYXQgbWF5IGJlIHN0YXJ0ZWQgdXNpbmcge0BsaW5rIEFjdGl2aXR5I3N0YXJ0QWN0aXZpdHkoSW50ZW50KX0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGkgVGhlIGludGVudCB0byBsYXVuY2ggdG8gc2hvdyBVSSBmb3IgdGhpcyBTZXNzaW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNlc3Npb25BY3Rpdml0eShATnVsbGFibGUgUGVuZGluZ0ludGVudCBwaSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgbUJpbmRlci5zZXRMYXVuY2hQZW5kaW5nSW50ZW50KHBpKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy53dGYoVEFHLCAiRmFpbHVyZSBpbiBzZXRMYXVuY2hQZW5kaW5nSW50ZW50LiIsIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IGEgcGVuZGluZyBpbnRlbnQgZm9yIHlvdXIgbWVkaWEgYnV0dG9uIHJlY2VpdmVyIHRvIGFsbG93IHJlc3RhcnRpbmcKKyAgICAgKiBwbGF5YmFjayBhZnRlciB0aGUgc2Vzc2lvbiBoYXMgYmVlbiBzdG9wcGVkLiBJZiB5b3VyIGFwcCBpcyBzdGFydGVkIGluCisgICAgICogdGhpcyB3YXkgYW4ge0BsaW5rIEludGVudCNBQ1RJT05fTUVESUFfQlVUVE9OfSBpbnRlbnQgd2lsbCBiZSBzZW50IHZpYQorICAgICAqIHRoZSBwZW5kaW5nIGludGVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYnIgVGhlIHtAbGluayBQZW5kaW5nSW50ZW50fSB0byBzZW5kIHRoZSBtZWRpYSBidXR0b24gZXZlbnQgdG8uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TWVkaWFCdXR0b25SZWNlaXZlcihATnVsbGFibGUgUGVuZGluZ0ludGVudCBtYnIpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1CaW5kZXIuc2V0TWVkaWFCdXR0b25SZWNlaXZlcihtYnIpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLnd0ZihUQUcsICJGYWlsdXJlIGluIHNldE1lZGlhQnV0dG9uUmVjZWl2ZXIuIiwgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgYW55IGZsYWdzIGZvciB0aGUgc2Vzc2lvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmbGFncyBUaGUgZmxhZ3MgdG8gc2V0IGZvciB0aGlzIHNlc3Npb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RmxhZ3MoQFNlc3Npb25GbGFncyBpbnQgZmxhZ3MpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1CaW5kZXIuc2V0RmxhZ3MoZmxhZ3MpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLnd0ZihUQUcsICJGYWlsdXJlIGluIHNldEZsYWdzLiIsIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBhdHRyaWJ1dGVzIGZvciB0aGlzIHNlc3Npb24ncyBhdWRpby4gVGhpcyB3aWxsIGFmZmVjdCB0aGUKKyAgICAgKiBzeXN0ZW0ncyB2b2x1bWUgaGFuZGxpbmcgZm9yIHRoaXMgc2Vzc2lvbi4gSWYKKyAgICAgKiB7QGxpbmsgI3NldFBsYXliYWNrVG9SZW1vdGV9IHdhcyBwcmV2aW91c2x5IGNhbGxlZCBpdCB3aWxsIHN0b3AgcmVjZWl2aW5nCisgICAgICogdm9sdW1lIGNvbW1hbmRzIGFuZCB0aGUgc3lzdGVtIHdpbGwgYmVnaW4gc2VuZGluZyB2b2x1bWUgY2hhbmdlcyB0byB0aGUKKyAgICAgKiBhcHByb3ByaWF0ZSBzdHJlYW0uCisgICAgICogPHA+CisgICAgICogQnkgZGVmYXVsdCBzZXNzaW9ucyB1c2UgYXR0cmlidXRlcyBmb3IgbWVkaWEuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYXR0cmlidXRlcyBUaGUge0BsaW5rIEF1ZGlvQXR0cmlidXRlc30gZm9yIHRoaXMgc2Vzc2lvbidzIGF1ZGlvLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFBsYXliYWNrVG9Mb2NhbChBdWRpb0F0dHJpYnV0ZXMgYXR0cmlidXRlcykgeworICAgICAgICBpZiAoYXR0cmlidXRlcyA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJBdHRyaWJ1dGVzIGNhbm5vdCBiZSBudWxsIGZvciBsb2NhbCBwbGF5YmFjay4iKTsKKyAgICAgICAgfQorICAgICAgICAvL1RPRE8oYi8xMTk3NTE1OTIpOiBEZWNpZGUgaWYgQXVkaW9BdHRyaWJ1dGVzIHNob3VsZCBiZSB1cGRhdGVkLgorICAgICAgICAvKgorICAgICAgICB0cnkgeworICAgICAgICAgICAgbUJpbmRlci5zZXRQbGF5YmFja1RvTG9jYWwoYXR0cmlidXRlcyk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cud3RmKFRBRywgIkZhaWx1cmUgaW4gc2V0UGxheWJhY2tUb0xvY2FsLiIsIGUpOworICAgICAgICB9CisgICAgICAgICovCisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uZmlndXJlIHRoaXMgc2Vzc2lvbiB0byB1c2UgcmVtb3RlIHZvbHVtZSBoYW5kbGluZy4gVGhpcyBtdXN0IGJlIGNhbGxlZAorICAgICAqIHRvIHJlY2VpdmUgdm9sdW1lIGJ1dHRvbiBldmVudHMsIG90aGVyd2lzZSB0aGUgc3lzdGVtIHdpbGwgYWRqdXN0IHRoZQorICAgICAqIGFwcHJvcHJpYXRlIHN0cmVhbSB2b2x1bWUgZm9yIHRoaXMgc2Vzc2lvbi4gSWYKKyAgICAgKiB7QGxpbmsgI3NldFBsYXliYWNrVG9Mb2NhbH0gd2FzIHByZXZpb3VzbHkgY2FsbGVkIHRoZSBzeXN0ZW0gd2lsbCBzdG9wCisgICAgICogaGFuZGxpbmcgdm9sdW1lIGNoYW5nZXMgZm9yIHRoaXMgc2Vzc2lvbiBhbmQgcGFzcyB0aGVtIHRvIHRoZSB2b2x1bWUKKyAgICAgKiBwcm92aWRlciBpbnN0ZWFkLgorICAgICAqCisgICAgICogQHBhcmFtIHZvbHVtZVByb3ZpZGVyIFRoZSBwcm92aWRlciB0aGF0IHdpbGwgaGFuZGxlIHZvbHVtZSBjaGFuZ2VzLiBNYXkKKyAgICAgKiAgICAgICAgICAgIG5vdCBiZSBudWxsLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFBsYXliYWNrVG9SZW1vdGUoQE5vbk51bGwgVm9sdW1lUHJvdmlkZXIgdm9sdW1lUHJvdmlkZXIpIHsKKyAgICAgICAgaWYgKHZvbHVtZVByb3ZpZGVyID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInZvbHVtZVByb3ZpZGVyIG1heSBub3QgYmUgbnVsbCEiKTsKKyAgICAgICAgfQorICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CisgICAgICAgICAgICBtVm9sdW1lUHJvdmlkZXIgPSB2b2x1bWVQcm92aWRlcjsKKyAgICAgICAgfQorICAgICAgICB2b2x1bWVQcm92aWRlci5zZXRDYWxsYmFjayhuZXcgVm9sdW1lUHJvdmlkZXIuQ2FsbGJhY2soKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uVm9sdW1lQ2hhbmdlZChWb2x1bWVQcm92aWRlciB2b2x1bWVQcm92aWRlcikgeworICAgICAgICAgICAgICAgIG5vdGlmeVJlbW90ZVZvbHVtZUNoYW5nZWQodm9sdW1lUHJvdmlkZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgbUJpbmRlci5zZXRQbGF5YmFja1RvUmVtb3RlKHZvbHVtZVByb3ZpZGVyLmdldFZvbHVtZUNvbnRyb2woKSwKKyAgICAgICAgICAgICAgICAgICAgdm9sdW1lUHJvdmlkZXIuZ2V0TWF4Vm9sdW1lKCkpOworICAgICAgICAgICAgbUJpbmRlci5zZXRDdXJyZW50Vm9sdW1lKHZvbHVtZVByb3ZpZGVyLmdldEN1cnJlbnRWb2x1bWUoKSk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cud3RmKFRBRywgIkZhaWx1cmUgaW4gc2V0UGxheWJhY2tUb1JlbW90ZS4iLCBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCBpZiB0aGlzIHNlc3Npb24gaXMgY3VycmVudGx5IGFjdGl2ZSBhbmQgcmVhZHkgdG8gcmVjZWl2ZSBjb21tYW5kcy4gSWYKKyAgICAgKiBzZXQgdG8gZmFsc2UgeW91ciBzZXNzaW9uJ3MgY29udHJvbGxlciBtYXkgbm90IGJlIGRpc2NvdmVyYWJsZS4gWW91IG11c3QKKyAgICAgKiBzZXQgdGhlIHNlc3Npb24gdG8gYWN0aXZlIGJlZm9yZSBpdCBjYW4gc3RhcnQgcmVjZWl2aW5nIG1lZGlhIGJ1dHRvbgorICAgICAqIGV2ZW50cyBvciB0cmFuc3BvcnQgY29tbWFuZHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWN0aXZlIFdoZXRoZXIgdGhpcyBzZXNzaW9uIGlzIGFjdGl2ZSBvciBub3QuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QWN0aXZlKGJvb2xlYW4gYWN0aXZlKSB7CisgICAgICAgIGlmIChtQWN0aXZlID09IGFjdGl2ZSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtQmluZGVyLnNldEFjdGl2ZShhY3RpdmUpOworICAgICAgICAgICAgbUFjdGl2ZSA9IGFjdGl2ZTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy53dGYoVEFHLCAiRmFpbHVyZSBpbiBzZXRBY3RpdmUuIiwgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGN1cnJlbnQgYWN0aXZlIHN0YXRlIG9mIHRoaXMgc2Vzc2lvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgc2Vzc2lvbiBpcyBhY3RpdmUsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0FjdGl2ZSgpIHsKKyAgICAgICAgcmV0dXJuIG1BY3RpdmU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VuZCBhIHByb3ByaWV0YXJ5IGV2ZW50IHRvIGFsbCBNZWRpYUNvbnRyb2xsZXJzIGxpc3RlbmluZyB0byB0aGlzCisgICAgICogU2Vzc2lvbi4gSXQncyB1cCB0byB0aGUgQ29udHJvbGxlci9TZXNzaW9uIG93bmVyIHRvIGRldGVybWluZSB0aGUgbWVhbmluZworICAgICAqIG9mIGFueSBldmVudHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXZlbnQgVGhlIG5hbWUgb2YgdGhlIGV2ZW50IHRvIHNlbmQKKyAgICAgKiBAcGFyYW0gZXh0cmFzIEFueSBleHRyYXMgaW5jbHVkZWQgd2l0aCB0aGUgZXZlbnQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZW5kU2Vzc2lvbkV2ZW50KEBOb25OdWxsIFN0cmluZyBldmVudCwgQE51bGxhYmxlIEJ1bmRsZSBleHRyYXMpIHsKKyAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KGV2ZW50KSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZXZlbnQgY2Fubm90IGJlIG51bGwgb3IgZW1wdHkiKTsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgbUJpbmRlci5zZW5kRXZlbnQoZXZlbnQsIGV4dHJhcyk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cud3RmKFRBRywgIkVycm9yIHNlbmRpbmcgZXZlbnQiLCBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgbXVzdCBiZSBjYWxsZWQgd2hlbiBhbiBhcHAgaGFzIGZpbmlzaGVkIHBlcmZvcm1pbmcgcGxheWJhY2suIElmCisgICAgICogcGxheWJhY2sgaXMgZXhwZWN0ZWQgdG8gc3RhcnQgYWdhaW4gc2hvcnRseSB0aGUgc2Vzc2lvbiBjYW4gYmUgbGVmdCBvcGVuLAorICAgICAqIGJ1dCBpdCBtdXN0IGJlIHJlbGVhc2VkIGlmIHlvdXIgYWN0aXZpdHkgb3Igc2VydmljZSBpcyBiZWluZyBkZXN0cm95ZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1CaW5kZXIuZGVzdHJveSgpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLnd0ZihUQUcsICJFcnJvciByZWxlYXNpbmcgc2Vzc2lvbjogIiwgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZSBhIHRva2VuIG9iamVjdCB0aGF0IGNhbiBiZSB1c2VkIGJ5IGFwcHMgdG8gY3JlYXRlIGEKKyAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sbGVyfSBmb3IgaW50ZXJhY3Rpbmcgd2l0aCB0aGlzIHNlc3Npb24uIFRoZSBvd25lciBvZgorICAgICAqIHRoZSBzZXNzaW9uIGlzIHJlc3BvbnNpYmxlIGZvciBkZWNpZGluZyBob3cgdG8gZGlzdHJpYnV0ZSB0aGVzZSB0b2tlbnMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEEgdG9rZW4gdGhhdCBjYW4gYmUgdXNlZCB0byBjcmVhdGUgYSBNZWRpYUNvbnRyb2xsZXIgZm9yIHRoaXMKKyAgICAgKiAgICAgICAgIHNlc3Npb24KKyAgICAgKi8KKyAgICBwdWJsaWMgQE5vbk51bGwgVG9rZW4gZ2V0U2Vzc2lvblRva2VuKCkgeworICAgICAgICByZXR1cm4gbVNlc3Npb25Ub2tlbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgYSBjb250cm9sbGVyIGZvciB0aGlzIHNlc3Npb24uIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgdG8gYXZvaWQKKyAgICAgKiBoYXZpbmcgdG8gY2FjaGUgeW91ciBvd24gY29udHJvbGxlciBpbiBwcm9jZXNzLgorICAgICAqCisgICAgICogQHJldHVybiBBIGNvbnRyb2xsZXIgZm9yIHRoaXMgc2Vzc2lvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgQE5vbk51bGwgTWVkaWFDb250cm9sbGVyIGdldENvbnRyb2xsZXIoKSB7CisgICAgICAgIHJldHVybiBtQ29udHJvbGxlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVcGRhdGUgdGhlIGN1cnJlbnQgcGxheWJhY2sgc3RhdGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RhdGUgVGhlIGN1cnJlbnQgc3RhdGUgb2YgcGxheWJhY2sKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQbGF5YmFja1N0YXRlKEBOdWxsYWJsZSBQbGF5YmFja1N0YXRlIHN0YXRlKSB7CisgICAgICAgIG1QbGF5YmFja1N0YXRlID0gc3RhdGU7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtQmluZGVyLnNldFBsYXliYWNrU3RhdGUoc3RhdGUpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLnd0ZihUQUcsICJEZWFkIG9iamVjdCBpbiBzZXRQbGF5YmFja1N0YXRlLiIsIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVXBkYXRlIHRoZSBjdXJyZW50IG1ldGFkYXRhLiBOZXcgbWV0YWRhdGEgY2FuIGJlIGNyZWF0ZWQgdXNpbmcKKyAgICAgKiB7QGxpbmsgYW5kcm9pZC5tZWRpYS5NZWRpYU1ldGFkYXRhLkJ1aWxkZXJ9LiBUaGlzIG9wZXJhdGlvbiBtYXkgdGFrZSB0aW1lIHByb3BvcnRpb25hbCB0bworICAgICAqIHRoZSBzaXplIG9mIHRoZSBiaXRtYXAgdG8gcmVwbGFjZSBsYXJnZSBiaXRtYXBzIHdpdGggYSBzY2FsZWQgZG93biBjb3B5LgorICAgICAqCisgICAgICogQHBhcmFtIG1ldGFkYXRhIFRoZSBuZXcgbWV0YWRhdGEKKyAgICAgKiBAc2VlIGFuZHJvaWQubWVkaWEuTWVkaWFNZXRhZGF0YS5CdWlsZGVyI3B1dEJpdG1hcAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE1ldGFkYXRhKEBOdWxsYWJsZSBNZWRpYU1ldGFkYXRhIG1ldGFkYXRhKSB7CisgICAgICAgIGlmIChtZXRhZGF0YSAhPSBudWxsKSB7CisgICAgICAgICAgICBtZXRhZGF0YSA9IChuZXcgTWVkaWFNZXRhZGF0YS5CdWlsZGVyKG1ldGFkYXRhLCBtTWF4Qml0bWFwU2l6ZSkpLmJ1aWxkKCk7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1CaW5kZXIuc2V0TWV0YWRhdGEobWV0YWRhdGEpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLnd0ZihUQUcsICJEZWFkIG9iamVjdCBpbiBzZXRQbGF5YmFja1N0YXRlLiIsIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVXBkYXRlIHRoZSBsaXN0IG9mIGl0ZW1zIGluIHRoZSBwbGF5IHF1ZXVlLiBJdCBpcyBhbiBvcmRlcmVkIGxpc3QgYW5kCisgICAgICogc2hvdWxkIGNvbnRhaW4gdGhlIGN1cnJlbnQgaXRlbSwgYW5kIHByZXZpb3VzIG9yIHVwY29taW5nIGl0ZW1zIGlmIHRoZXkKKyAgICAgKiBleGlzdC4gU3BlY2lmeSBudWxsIGlmIHRoZXJlIGlzIG5vIGN1cnJlbnQgcGxheSBxdWV1ZS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgcXVldWUgc2hvdWxkIGJlIG9mIHJlYXNvbmFibGUgc2l6ZS4gSWYgdGhlIHBsYXkgcXVldWUgaXMgdW5ib3VuZGVkCisgICAgICogd2l0aGluIHlvdXIgYXBwLCBpdCBpcyBiZXR0ZXIgdG8gc2VuZCBhIHJlYXNvbmFibGUgYW1vdW50IGluIGEgc2xpZGluZworICAgICAqIHdpbmRvdyBpbnN0ZWFkLgorICAgICAqCisgICAgICogQHBhcmFtIHF1ZXVlIEEgbGlzdCBvZiBpdGVtcyBpbiB0aGUgcGxheSBxdWV1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRRdWV1ZShATnVsbGFibGUgTGlzdDxRdWV1ZUl0ZW0+IHF1ZXVlKSB7CisgICAgICAgIC8vVE9ETzooYi8xMTk3NTA4MDcpIFJlc29sdmUgaGlkZGVuIEFQSSB1c2FnZSBQYXJjZWxlZExpc3RTbGljZS4KKyAgICAgICAgLyoKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1CaW5kZXIuc2V0UXVldWUocXVldWUgPT0gbnVsbCA/IG51bGwgOiBuZXcgUGFyY2VsZWRMaXN0U2xpY2U8UXVldWVJdGVtPihxdWV1ZSkpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLnd0ZigiRGVhZCBvYmplY3QgaW4gc2V0UXVldWUuIiwgZSk7CisgICAgICAgIH0KKyAgICAgICAgKi8KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHRpdGxlIG9mIHRoZSBwbGF5IHF1ZXVlLiBUaGUgVUkgc2hvdWxkIGRpc3BsYXkgdGhpcyB0aXRsZSBhbG9uZworICAgICAqIHdpdGggdGhlIHBsYXkgcXVldWUgaXRzZWxmLgorICAgICAqIGUuZy4gIlBsYXkgUXVldWUiLCAiTm93IFBsYXlpbmciLCBvciBhbiBhbGJ1bSBuYW1lLgorICAgICAqCisgICAgICogQHBhcmFtIHRpdGxlIFRoZSB0aXRsZSBvZiB0aGUgcGxheSBxdWV1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRRdWV1ZVRpdGxlKEBOdWxsYWJsZSBDaGFyU2VxdWVuY2UgdGl0bGUpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1CaW5kZXIuc2V0UXVldWVUaXRsZSh0aXRsZSk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cud3RmKCJEZWFkIG9iamVjdCBpbiBzZXRRdWV1ZVRpdGxlLiIsIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBzdHlsZSBvZiByYXRpbmcgdXNlZCBieSB0aGlzIHNlc3Npb24uIEFwcHMgdHJ5aW5nIHRvIHNldCB0aGUKKyAgICAgKiByYXRpbmcgc2hvdWxkIHVzZSB0aGlzIHN0eWxlLiBNdXN0IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+e0BsaW5rIFJhdGluZyNSQVRJTkdfTk9ORX08L2xpPgorICAgICAqIDxsaT57QGxpbmsgUmF0aW5nI1JBVElOR18zX1NUQVJTfTwvbGk+CisgICAgICogPGxpPntAbGluayBSYXRpbmcjUkFUSU5HXzRfU1RBUlN9PC9saT4KKyAgICAgKiA8bGk+e0BsaW5rIFJhdGluZyNSQVRJTkdfNV9TVEFSU308L2xpPgorICAgICAqIDxsaT57QGxpbmsgUmF0aW5nI1JBVElOR19IRUFSVH08L2xpPgorICAgICAqIDxsaT57QGxpbmsgUmF0aW5nI1JBVElOR19QRVJDRU5UQUdFfTwvbGk+CisgICAgICogPGxpPntAbGluayBSYXRpbmcjUkFUSU5HX1RIVU1CX1VQX0RPV059PC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJhdGluZ1R5cGUoQFJhdGluZy5TdHlsZSBpbnQgdHlwZSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgbUJpbmRlci5zZXRSYXRpbmdUeXBlKHR5cGUpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiRXJyb3IgaW4gc2V0UmF0aW5nVHlwZS4iLCBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCBzb21lIGV4dHJhcyB0aGF0IGNhbiBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIHtAbGluayBNZWRpYVNlc3Npb259LiBObyBhc3N1bXB0aW9ucyBzaG91bGQKKyAgICAgKiBiZSBtYWRlIGFzIHRvIGhvdyBhIHtAbGluayBNZWRpYUNvbnRyb2xsZXJ9IHdpbGwgaGFuZGxlIHRoZXNlIGV4dHJhcy4KKyAgICAgKiBLZXlzIHNob3VsZCBiZSBmdWxseSBxdWFsaWZpZWQgKGUuZy4gY29tLmV4YW1wbGUuTVlfRVhUUkEpIHRvIGF2b2lkIGNvbmZsaWN0cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBleHRyYXMgVGhlIGV4dHJhcyBhc3NvY2lhdGVkIHdpdGggdGhlIHtAbGluayBNZWRpYVNlc3Npb259LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEV4dHJhcyhATnVsbGFibGUgQnVuZGxlIGV4dHJhcykgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgbUJpbmRlci5zZXRFeHRyYXMoZXh0cmFzKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy53dGYoIkRlYWQgb2JqZWN0IGluIHNldEV4dHJhcy4iLCBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGNvbnRyb2xsZXIgaW5mb3JtYXRpb24gd2hvIHNlbnQgdGhlIGN1cnJlbnQgcmVxdWVzdC4KKyAgICAgKiA8cD4KKyAgICAgKiBOb3RlOiBUaGlzIGlzIG9ubHkgdmFsaWQgd2hpbGUgaW4gYSByZXF1ZXN0IGNhbGxiYWNrLCBzdWNoIGFzIHtAbGluayBDYWxsYmFjayNvblBsYXl9LgorICAgICAqCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gSWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkIG91dHNpZGUgb2Yge0BsaW5rIENhbGxiYWNrfSBtZXRob2RzLgorICAgICAqIEBzZWUgTWVkaWFTZXNzaW9uTWFuYWdlciNpc1RydXN0ZWRGb3JNZWRpYUNvbnRyb2woUmVtb3RlVXNlckluZm8pCisgICAgICovCisgICAgcHVibGljIGZpbmFsIEBOb25OdWxsIFJlbW90ZVVzZXJJbmZvIGdldEN1cnJlbnRDb250cm9sbGVySW5mbygpIHsKKyAgICAgICAgaWYgKG1DYWxsYmFjayA9PSBudWxsIHx8IG1DYWxsYmFjay5tQ3VycmVudENvbnRyb2xsZXJJbmZvID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJUaGlzIHNob3VsZCBiZSBjYWxsZWQgaW5zaWRlIG9mIE1lZGlhU2Vzc2lvbi5DYWxsYmFjayBtZXRob2RzIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1DYWxsYmFjay5tQ3VycmVudENvbnRyb2xsZXJJbmZvOworICAgIH0KKworICAgIC8qKgorICAgICAqIE5vdGlmeSB0aGUgc3lzdGVtIHRoYXQgdGhlIHJlbW90ZSB2b2x1bWUgY2hhbmdlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcm92aWRlciBUaGUgcHJvdmlkZXIgdGhhdCBpcyBoYW5kbGluZyB2b2x1bWUgY2hhbmdlcy4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG5vdGlmeVJlbW90ZVZvbHVtZUNoYW5nZWQoVm9sdW1lUHJvdmlkZXIgcHJvdmlkZXIpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgaWYgKHByb3ZpZGVyID09IG51bGwgfHwgcHJvdmlkZXIgIT0gbVZvbHVtZVByb3ZpZGVyKSB7CisgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiUmVjZWl2ZWQgdXBkYXRlIGZyb20gc3RhbGUgdm9sdW1lIHByb3ZpZGVyIik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtQmluZGVyLnNldEN1cnJlbnRWb2x1bWUocHJvdmlkZXIuZ2V0Q3VycmVudFZvbHVtZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIkVycm9yIGluIG5vdGlmeVZvbHVtZUNoYW5nZWQiLCBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHBhY2thZ2UgdGhhdCBzZW50IHRoZSBsYXN0IG1lZGlhIGJ1dHRvbiwgdHJhbnNwb3J0IGNvbnRyb2wsIG9yCisgICAgICogY29tbWFuZCBmcm9tIGNvbnRyb2xsZXJzIGFuZCB0aGUgc3lzdGVtLiBUaGlzIGlzIG9ubHkgdmFsaWQgd2hpbGUgaW4gYSByZXF1ZXN0IGNhbGxiYWNrLCBzdWNoCisgICAgICogYXMge0BsaW5rIENhbGxiYWNrI29uUGxheX0uCisgICAgICoKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIEBVbnN1cHBvcnRlZEFwcFVzYWdlCisgICAgcHVibGljIFN0cmluZyBnZXRDYWxsaW5nUGFja2FnZSgpIHsKKyAgICAgICAgaWYgKG1DYWxsYmFjayAhPSBudWxsICYmIG1DYWxsYmFjay5tQ3VycmVudENvbnRyb2xsZXJJbmZvICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBtQ2FsbGJhY2subUN1cnJlbnRDb250cm9sbGVySW5mby5nZXRQYWNrYWdlTmFtZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkaXNwYXRjaFByZXBhcmUoUmVtb3RlVXNlckluZm8gY2FsbGVyKSB7CisgICAgICAgIHBvc3RUb0NhbGxiYWNrKGNhbGxlciwgQ2FsbGJhY2tNZXNzYWdlSGFuZGxlci5NU0dfUFJFUEFSRSwgbnVsbCwgbnVsbCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGRpc3BhdGNoUHJlcGFyZUZyb21NZWRpYUlkKFJlbW90ZVVzZXJJbmZvIGNhbGxlciwgU3RyaW5nIG1lZGlhSWQsIEJ1bmRsZSBleHRyYXMpIHsKKyAgICAgICAgcG9zdFRvQ2FsbGJhY2soY2FsbGVyLCBDYWxsYmFja01lc3NhZ2VIYW5kbGVyLk1TR19QUkVQQVJFX01FRElBX0lELCBtZWRpYUlkLCBleHRyYXMpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkaXNwYXRjaFByZXBhcmVGcm9tU2VhcmNoKFJlbW90ZVVzZXJJbmZvIGNhbGxlciwgU3RyaW5nIHF1ZXJ5LCBCdW5kbGUgZXh0cmFzKSB7CisgICAgICAgIHBvc3RUb0NhbGxiYWNrKGNhbGxlciwgQ2FsbGJhY2tNZXNzYWdlSGFuZGxlci5NU0dfUFJFUEFSRV9TRUFSQ0gsIHF1ZXJ5LCBleHRyYXMpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkaXNwYXRjaFByZXBhcmVGcm9tVXJpKFJlbW90ZVVzZXJJbmZvIGNhbGxlciwgVXJpIHVyaSwgQnVuZGxlIGV4dHJhcykgeworICAgICAgICBwb3N0VG9DYWxsYmFjayhjYWxsZXIsIENhbGxiYWNrTWVzc2FnZUhhbmRsZXIuTVNHX1BSRVBBUkVfVVJJLCB1cmksIGV4dHJhcyk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGRpc3BhdGNoUGxheShSZW1vdGVVc2VySW5mbyBjYWxsZXIpIHsKKyAgICAgICAgcG9zdFRvQ2FsbGJhY2soY2FsbGVyLCBDYWxsYmFja01lc3NhZ2VIYW5kbGVyLk1TR19QTEFZLCBudWxsLCBudWxsKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZGlzcGF0Y2hQbGF5RnJvbU1lZGlhSWQoUmVtb3RlVXNlckluZm8gY2FsbGVyLCBTdHJpbmcgbWVkaWFJZCwgQnVuZGxlIGV4dHJhcykgeworICAgICAgICBwb3N0VG9DYWxsYmFjayhjYWxsZXIsIENhbGxiYWNrTWVzc2FnZUhhbmRsZXIuTVNHX1BMQVlfTUVESUFfSUQsIG1lZGlhSWQsIGV4dHJhcyk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGRpc3BhdGNoUGxheUZyb21TZWFyY2goUmVtb3RlVXNlckluZm8gY2FsbGVyLCBTdHJpbmcgcXVlcnksIEJ1bmRsZSBleHRyYXMpIHsKKyAgICAgICAgcG9zdFRvQ2FsbGJhY2soY2FsbGVyLCBDYWxsYmFja01lc3NhZ2VIYW5kbGVyLk1TR19QTEFZX1NFQVJDSCwgcXVlcnksIGV4dHJhcyk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGRpc3BhdGNoUGxheUZyb21VcmkoUmVtb3RlVXNlckluZm8gY2FsbGVyLCBVcmkgdXJpLCBCdW5kbGUgZXh0cmFzKSB7CisgICAgICAgIHBvc3RUb0NhbGxiYWNrKGNhbGxlciwgQ2FsbGJhY2tNZXNzYWdlSGFuZGxlci5NU0dfUExBWV9VUkksIHVyaSwgZXh0cmFzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZGlzcGF0Y2hTa2lwVG9JdGVtKFJlbW90ZVVzZXJJbmZvIGNhbGxlciwgbG9uZyBpZCkgeworICAgICAgICBwb3N0VG9DYWxsYmFjayhjYWxsZXIsIENhbGxiYWNrTWVzc2FnZUhhbmRsZXIuTVNHX1NLSVBfVE9fSVRFTSwgaWQsIG51bGwpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkaXNwYXRjaFBhdXNlKFJlbW90ZVVzZXJJbmZvIGNhbGxlcikgeworICAgICAgICBwb3N0VG9DYWxsYmFjayhjYWxsZXIsIENhbGxiYWNrTWVzc2FnZUhhbmRsZXIuTVNHX1BBVVNFLCBudWxsLCBudWxsKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZGlzcGF0Y2hTdG9wKFJlbW90ZVVzZXJJbmZvIGNhbGxlcikgeworICAgICAgICBwb3N0VG9DYWxsYmFjayhjYWxsZXIsIENhbGxiYWNrTWVzc2FnZUhhbmRsZXIuTVNHX1NUT1AsIG51bGwsIG51bGwpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkaXNwYXRjaE5leHQoUmVtb3RlVXNlckluZm8gY2FsbGVyKSB7CisgICAgICAgIHBvc3RUb0NhbGxiYWNrKGNhbGxlciwgQ2FsbGJhY2tNZXNzYWdlSGFuZGxlci5NU0dfTkVYVCwgbnVsbCwgbnVsbCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGRpc3BhdGNoUHJldmlvdXMoUmVtb3RlVXNlckluZm8gY2FsbGVyKSB7CisgICAgICAgIHBvc3RUb0NhbGxiYWNrKGNhbGxlciwgQ2FsbGJhY2tNZXNzYWdlSGFuZGxlci5NU0dfUFJFVklPVVMsIG51bGwsIG51bGwpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkaXNwYXRjaEZhc3RGb3J3YXJkKFJlbW90ZVVzZXJJbmZvIGNhbGxlcikgeworICAgICAgICBwb3N0VG9DYWxsYmFjayhjYWxsZXIsIENhbGxiYWNrTWVzc2FnZUhhbmRsZXIuTVNHX0ZBU1RfRk9SV0FSRCwgbnVsbCwgbnVsbCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGRpc3BhdGNoUmV3aW5kKFJlbW90ZVVzZXJJbmZvIGNhbGxlcikgeworICAgICAgICBwb3N0VG9DYWxsYmFjayhjYWxsZXIsIENhbGxiYWNrTWVzc2FnZUhhbmRsZXIuTVNHX1JFV0lORCwgbnVsbCwgbnVsbCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGRpc3BhdGNoU2Vla1RvKFJlbW90ZVVzZXJJbmZvIGNhbGxlciwgbG9uZyBwb3MpIHsKKyAgICAgICAgcG9zdFRvQ2FsbGJhY2soY2FsbGVyLCBDYWxsYmFja01lc3NhZ2VIYW5kbGVyLk1TR19TRUVLX1RPLCBwb3MsIG51bGwpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkaXNwYXRjaFJhdGUoUmVtb3RlVXNlckluZm8gY2FsbGVyLCBSYXRpbmcgcmF0aW5nKSB7CisgICAgICAgIHBvc3RUb0NhbGxiYWNrKGNhbGxlciwgQ2FsbGJhY2tNZXNzYWdlSGFuZGxlci5NU0dfUkFURSwgcmF0aW5nLCBudWxsKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZGlzcGF0Y2hDdXN0b21BY3Rpb24oUmVtb3RlVXNlckluZm8gY2FsbGVyLCBTdHJpbmcgYWN0aW9uLCBCdW5kbGUgYXJncykgeworICAgICAgICBwb3N0VG9DYWxsYmFjayhjYWxsZXIsIENhbGxiYWNrTWVzc2FnZUhhbmRsZXIuTVNHX0NVU1RPTV9BQ1RJT04sIGFjdGlvbiwgYXJncyk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGRpc3BhdGNoTWVkaWFCdXR0b24oUmVtb3RlVXNlckluZm8gY2FsbGVyLCBJbnRlbnQgbWVkaWFCdXR0b25JbnRlbnQpIHsKKyAgICAgICAgcG9zdFRvQ2FsbGJhY2soY2FsbGVyLCBDYWxsYmFja01lc3NhZ2VIYW5kbGVyLk1TR19NRURJQV9CVVRUT04sIG1lZGlhQnV0dG9uSW50ZW50LCBudWxsKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZGlzcGF0Y2hNZWRpYUJ1dHRvbkRlbGF5ZWQoUmVtb3RlVXNlckluZm8gaW5mbywgSW50ZW50IG1lZGlhQnV0dG9uSW50ZW50LAorICAgICAgICAgICAgbG9uZyBkZWxheSkgeworICAgICAgICBwb3N0VG9DYWxsYmFja0RlbGF5ZWQoaW5mbywgQ2FsbGJhY2tNZXNzYWdlSGFuZGxlci5NU0dfUExBWV9QQVVTRV9LRVlfRE9VQkxFX1RBUF9USU1FT1VULAorICAgICAgICAgICAgICAgIG1lZGlhQnV0dG9uSW50ZW50LCBudWxsLCBkZWxheSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGRpc3BhdGNoQWRqdXN0Vm9sdW1lKFJlbW90ZVVzZXJJbmZvIGNhbGxlciwgaW50IGRpcmVjdGlvbikgeworICAgICAgICBwb3N0VG9DYWxsYmFjayhjYWxsZXIsIENhbGxiYWNrTWVzc2FnZUhhbmRsZXIuTVNHX0FESlVTVF9WT0xVTUUsIGRpcmVjdGlvbiwgbnVsbCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGRpc3BhdGNoU2V0Vm9sdW1lVG8oUmVtb3RlVXNlckluZm8gY2FsbGVyLCBpbnQgdm9sdW1lKSB7CisgICAgICAgIHBvc3RUb0NhbGxiYWNrKGNhbGxlciwgQ2FsbGJhY2tNZXNzYWdlSGFuZGxlci5NU0dfU0VUX1ZPTFVNRSwgdm9sdW1lLCBudWxsKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZGlzcGF0Y2hDb21tYW5kKFJlbW90ZVVzZXJJbmZvIGNhbGxlciwgU3RyaW5nIGNvbW1hbmQsIEJ1bmRsZSBhcmdzLAorICAgICAgICAgICAgUmVzdWx0UmVjZWl2ZXIgcmVzdWx0Q2IpIHsKKyAgICAgICAgQ29tbWFuZCBjbWQgPSBuZXcgQ29tbWFuZChjb21tYW5kLCBhcmdzLCByZXN1bHRDYik7CisgICAgICAgIHBvc3RUb0NhbGxiYWNrKGNhbGxlciwgQ2FsbGJhY2tNZXNzYWdlSGFuZGxlci5NU0dfQ09NTUFORCwgY21kLCBudWxsKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcG9zdFRvQ2FsbGJhY2soUmVtb3RlVXNlckluZm8gY2FsbGVyLCBpbnQgd2hhdCwgT2JqZWN0IG9iaiwgQnVuZGxlIGRhdGEpIHsKKyAgICAgICAgcG9zdFRvQ2FsbGJhY2tEZWxheWVkKGNhbGxlciwgd2hhdCwgb2JqLCBkYXRhLCAwKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcG9zdFRvQ2FsbGJhY2tEZWxheWVkKFJlbW90ZVVzZXJJbmZvIGNhbGxlciwgaW50IHdoYXQsIE9iamVjdCBvYmosIEJ1bmRsZSBkYXRhLAorICAgICAgICAgICAgbG9uZyBkZWxheSkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CisgICAgICAgICAgICBpZiAobUNhbGxiYWNrICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtQ2FsbGJhY2sucG9zdChjYWxsZXIsIHdoYXQsIG9iaiwgZGF0YSwgZGVsYXkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRydWUgaWYgdGhpcyBpcyBjb25zaWRlcmVkIGFuIGFjdGl2ZSBwbGF5YmFjayBzdGF0ZS4KKyAgICAgKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQWN0aXZlU3RhdGUoaW50IHN0YXRlKSB7CisgICAgICAgIHN3aXRjaCAoc3RhdGUpIHsKKyAgICAgICAgICAgIGNhc2UgUGxheWJhY2tTdGF0ZS5TVEFURV9GQVNUX0ZPUldBUkRJTkc6CisgICAgICAgICAgICBjYXNlIFBsYXliYWNrU3RhdGUuU1RBVEVfUkVXSU5ESU5HOgorICAgICAgICAgICAgY2FzZSBQbGF5YmFja1N0YXRlLlNUQVRFX1NLSVBQSU5HX1RPX1BSRVZJT1VTOgorICAgICAgICAgICAgY2FzZSBQbGF5YmFja1N0YXRlLlNUQVRFX1NLSVBQSU5HX1RPX05FWFQ6CisgICAgICAgICAgICBjYXNlIFBsYXliYWNrU3RhdGUuU1RBVEVfQlVGRkVSSU5HOgorICAgICAgICAgICAgY2FzZSBQbGF5YmFja1N0YXRlLlNUQVRFX0NPTk5FQ1RJTkc6CisgICAgICAgICAgICBjYXNlIFBsYXliYWNrU3RhdGUuU1RBVEVfUExBWUlORzoKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVwcmVzZW50cyBhbiBvbmdvaW5nIHNlc3Npb24uIFRoaXMgbWF5IGJlIHBhc3NlZCB0byBhcHBzIGJ5IHRoZSBzZXNzaW9uCisgICAgICogb3duZXIgdG8gYWxsb3cgdGhlbSB0byBjcmVhdGUgYSB7QGxpbmsgTWVkaWFDb250cm9sbGVyfSB0byBjb21tdW5pY2F0ZSB3aXRoCisgICAgICogdGhlIHNlc3Npb24uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBUb2tlbiBpbXBsZW1lbnRzIFBhcmNlbGFibGUgeworCisgICAgICAgIHByaXZhdGUgSVNlc3Npb25Db250cm9sbGVyIG1CaW5kZXI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBoaWRlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgVG9rZW4oSVNlc3Npb25Db250cm9sbGVyIGJpbmRlcikgeworICAgICAgICAgICAgbUJpbmRlciA9IGJpbmRlcjsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGRlc2NyaWJlQ29udGVudHMoKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZVRvUGFyY2VsKFBhcmNlbCBkZXN0LCBpbnQgZmxhZ3MpIHsKKyAgICAgICAgICAgIGRlc3Qud3JpdGVTdHJvbmdCaW5kZXIobUJpbmRlci5hc0JpbmRlcigpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICAgICAgZmluYWwgaW50IHByaW1lID0gMzE7CisgICAgICAgICAgICBpbnQgcmVzdWx0ID0gMTsKKyAgICAgICAgICAgIHJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKChtQmluZGVyID09IG51bGwpID8gMCA6IG1CaW5kZXIuYXNCaW5kZXIoKS5oYXNoQ29kZSgpKTsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKyAgICAgICAgICAgIGlmICh0aGlzID09IG9iaikKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIGlmIChvYmogPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBpZiAoZ2V0Q2xhc3MoKSAhPSBvYmouZ2V0Q2xhc3MoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBUb2tlbiBvdGhlciA9IChUb2tlbikgb2JqOworICAgICAgICAgICAgaWYgKG1CaW5kZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChvdGhlci5tQmluZGVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIW1CaW5kZXIuYXNCaW5kZXIoKS5lcXVhbHMob3RoZXIubUJpbmRlci5hc0JpbmRlcigpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIElTZXNzaW9uQ29udHJvbGxlciBnZXRCaW5kZXIoKSB7CisgICAgICAgICAgICByZXR1cm4gbUJpbmRlcjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUGFyY2VsYWJsZS5DcmVhdG9yPFRva2VuPiBDUkVBVE9SCisgICAgICAgICAgICAgICAgPSBuZXcgUGFyY2VsYWJsZS5DcmVhdG9yPFRva2VuPigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFRva2VuIGNyZWF0ZUZyb21QYXJjZWwoUGFyY2VsIGluKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUb2tlbihJU2Vzc2lvbkNvbnRyb2xsZXIuU3R1Yi5hc0ludGVyZmFjZShpbi5yZWFkU3Ryb25nQmluZGVyKCkpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgVG9rZW5bXSBuZXdBcnJheShpbnQgc2l6ZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVG9rZW5bc2l6ZV07CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVjZWl2ZXMgbWVkaWEgYnV0dG9ucywgdHJhbnNwb3J0IGNvbnRyb2xzLCBhbmQgY29tbWFuZHMgZnJvbSBjb250cm9sbGVycworICAgICAqIGFuZCB0aGUgc3lzdGVtLiBBIGNhbGxiYWNrIG1heSBiZSBzZXQgdXNpbmcge0BsaW5rICNzZXRDYWxsYmFja30uCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHN0YXRpYyBjbGFzcyBDYWxsYmFjayB7CisKKyAgICAgICAgcHJpdmF0ZSBNZWRpYVNlc3Npb24gbVNlc3Npb247CisgICAgICAgIHByaXZhdGUgQ2FsbGJhY2tNZXNzYWdlSGFuZGxlciBtSGFuZGxlcjsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1NZWRpYVBsYXlQYXVzZUtleVBlbmRpbmc7CisKKyAgICAgICAgcHVibGljIENhbGxiYWNrKCkgeworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENhbGxlZCB3aGVuIGEgY29udHJvbGxlciBoYXMgc2VudCBhIGNvbW1hbmQgdG8gdGhpcyBzZXNzaW9uLgorICAgICAgICAgKiBUaGUgb3duZXIgb2YgdGhlIHNlc3Npb24gbWF5IGhhbmRsZSBjdXN0b20gY29tbWFuZHMgYnV0IGlzIG5vdAorICAgICAgICAgKiByZXF1aXJlZCB0by4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGNvbW1hbmQgVGhlIGNvbW1hbmQgbmFtZS4KKyAgICAgICAgICogQHBhcmFtIGFyZ3MgT3B0aW9uYWwgcGFyYW1ldGVycyBmb3IgdGhlIGNvbW1hbmQsIG1heSBiZSBudWxsLgorICAgICAgICAgKiBAcGFyYW0gY2IgQSByZXN1bHQgcmVjZWl2ZXIgdG8gd2hpY2ggYSByZXN1bHQgbWF5IGJlIHNlbnQgYnkgdGhlIGNvbW1hbmQsIG1heSBiZSBudWxsLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25Db21tYW5kKEBOb25OdWxsIFN0cmluZyBjb21tYW5kLCBATnVsbGFibGUgQnVuZGxlIGFyZ3MsCisgICAgICAgICAgICAgICAgQE51bGxhYmxlIFJlc3VsdFJlY2VpdmVyIGNiKSB7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ2FsbGVkIHdoZW4gYSBtZWRpYSBidXR0b24gaXMgcHJlc3NlZCBhbmQgdGhpcyBzZXNzaW9uIGhhcyB0aGUKKyAgICAgICAgICogaGlnaGVzdCBwcmlvcml0eSBvciBhIGNvbnRyb2xsZXIgc2VuZHMgYSBtZWRpYSBidXR0b24gZXZlbnQgdG8gdGhlCisgICAgICAgICAqIHNlc3Npb24uIFRoZSBkZWZhdWx0IGJlaGF2aW9yIHdpbGwgY2FsbCB0aGUgcmVsZXZhbnQgbWV0aG9kIGlmIHRoZQorICAgICAgICAgKiBhY3Rpb24gZm9yIGl0IHdhcyBzZXQuCisgICAgICAgICAqIDxwPgorICAgICAgICAgKiBUaGUgaW50ZW50IHdpbGwgYmUgb2YgdHlwZSB7QGxpbmsgSW50ZW50I0FDVElPTl9NRURJQV9CVVRUT059IHdpdGggYQorICAgICAgICAgKiBLZXlFdmVudCBpbiB7QGxpbmsgSW50ZW50I0VYVFJBX0tFWV9FVkVOVH0KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG1lZGlhQnV0dG9uSW50ZW50IGFuIGludGVudCBjb250YWluaW5nIHRoZSBLZXlFdmVudCBhcyBhbgorICAgICAgICAgKiAgICAgICAgICAgIGV4dHJhCisgICAgICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgZXZlbnQgd2FzIGhhbmRsZWQsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBib29sZWFuIG9uTWVkaWFCdXR0b25FdmVudChATm9uTnVsbCBJbnRlbnQgbWVkaWFCdXR0b25JbnRlbnQpIHsKKyAgICAgICAgICAgIGlmIChtU2Vzc2lvbiAhPSBudWxsICYmIG1IYW5kbGVyICE9IG51bGwKKyAgICAgICAgICAgICAgICAgICAgJiYgSW50ZW50LkFDVElPTl9NRURJQV9CVVRUT04uZXF1YWxzKG1lZGlhQnV0dG9uSW50ZW50LmdldEFjdGlvbigpKSkgeworICAgICAgICAgICAgICAgIEtleUV2ZW50IGtlID0gbWVkaWFCdXR0b25JbnRlbnQuZ2V0UGFyY2VsYWJsZUV4dHJhKEludGVudC5FWFRSQV9LRVlfRVZFTlQpOworICAgICAgICAgICAgICAgIGlmIChrZSAhPSBudWxsICYmIGtlLmdldEFjdGlvbigpID09IEtleUV2ZW50LkFDVElPTl9ET1dOKSB7CisgICAgICAgICAgICAgICAgICAgIFBsYXliYWNrU3RhdGUgc3RhdGUgPSBtU2Vzc2lvbi5tUGxheWJhY2tTdGF0ZTsKKyAgICAgICAgICAgICAgICAgICAgbG9uZyB2YWxpZEFjdGlvbnMgPSBzdGF0ZSA9PSBudWxsID8gMCA6IHN0YXRlLmdldEFjdGlvbnMoKTsKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChrZS5nZXRLZXlDb2RlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuS0VZQ09ERV9NRURJQV9QTEFZX1BBVVNFOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFX0hFQURTRVRIT09LOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrZS5nZXRSZXBlYXRDb3VudCgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDb25zaWRlciBsb25nLXByZXNzIGFzIGEgc2luZ2xlIHRhcC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlTWVkaWFQbGF5UGF1c2VLZXlTaW5nbGVUYXBJZlBlbmRpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1NZWRpYVBsYXlQYXVzZUtleVBlbmRpbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29uc2lkZXIgZG91YmxlIHRhcCBhcyB0aGUgbmV4dC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUhhbmRsZXIucmVtb3ZlTWVzc2FnZXMoQ2FsbGJhY2tNZXNzYWdlSGFuZGxlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5NU0dfUExBWV9QQVVTRV9LRVlfRE9VQkxFX1RBUF9USU1FT1VUKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1lZGlhUGxheVBhdXNlS2V5UGVuZGluZyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHZhbGlkQWN0aW9ucyAmIFBsYXliYWNrU3RhdGUuQUNUSU9OX1NLSVBfVE9fTkVYVCkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25Ta2lwVG9OZXh0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTWVkaWFQbGF5UGF1c2VLZXlQZW5kaW5nID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNlc3Npb24uZGlzcGF0Y2hNZWRpYUJ1dHRvbkRlbGF5ZWQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNlc3Npb24uZ2V0Q3VycmVudENvbnRyb2xsZXJJbmZvKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFCdXR0b25JbnRlbnQsIFZpZXdDb25maWd1cmF0aW9uLmdldERvdWJsZVRhcFRpbWVvdXQoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBhbm90aGVyIGtleSBpcyBwcmVzc2VkIHdpdGhpbiBkb3VibGUgdGFwIHRpbWVvdXQsIGNvbnNpZGVyIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBlbmRpbmcgcGxheS9wYXVzZSBhcyBhIHNpbmdsZSB0YXAgdG8gaGFuZGxlIG1lZGlhIGtleXMgaW4gb3JkZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlTWVkaWFQbGF5UGF1c2VLZXlTaW5nbGVUYXBJZlBlbmRpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoa2UuZ2V0S2V5Q29kZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfTUVESUFfUExBWToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHZhbGlkQWN0aW9ucyAmIFBsYXliYWNrU3RhdGUuQUNUSU9OX1BMQVkpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25QbGF5KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuS0VZQ09ERV9NRURJQV9QQVVTRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHZhbGlkQWN0aW9ucyAmIFBsYXliYWNrU3RhdGUuQUNUSU9OX1BBVVNFKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uUGF1c2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFX01FRElBX05FWFQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh2YWxpZEFjdGlvbnMgJiBQbGF5YmFja1N0YXRlLkFDVElPTl9TS0lQX1RPX05FWFQpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25Ta2lwVG9OZXh0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuS0VZQ09ERV9NRURJQV9QUkVWSU9VUzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHZhbGlkQWN0aW9ucyAmIFBsYXliYWNrU3RhdGUuQUNUSU9OX1NLSVBfVE9fUFJFVklPVVMpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25Ta2lwVG9QcmV2aW91cygpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfTUVESUFfU1RPUDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHZhbGlkQWN0aW9ucyAmIFBsYXliYWNrU3RhdGUuQUNUSU9OX1NUT1ApICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25TdG9wKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuS0VZQ09ERV9NRURJQV9GQVNUX0ZPUldBUkQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh2YWxpZEFjdGlvbnMgJiBQbGF5YmFja1N0YXRlLkFDVElPTl9GQVNUX0ZPUldBUkQpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25GYXN0Rm9yd2FyZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfTUVESUFfUkVXSU5EOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodmFsaWRBY3Rpb25zICYgUGxheWJhY2tTdGF0ZS5BQ1RJT05fUkVXSU5EKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uUmV3aW5kKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBoYW5kbGVNZWRpYVBsYXlQYXVzZUtleVNpbmdsZVRhcElmUGVuZGluZygpIHsKKyAgICAgICAgICAgIGlmICghbU1lZGlhUGxheVBhdXNlS2V5UGVuZGluZykgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1NZWRpYVBsYXlQYXVzZUtleVBlbmRpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgIG1IYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKENhbGxiYWNrTWVzc2FnZUhhbmRsZXIuTVNHX1BMQVlfUEFVU0VfS0VZX0RPVUJMRV9UQVBfVElNRU9VVCk7CisgICAgICAgICAgICBQbGF5YmFja1N0YXRlIHN0YXRlID0gbVNlc3Npb24ubVBsYXliYWNrU3RhdGU7CisgICAgICAgICAgICBsb25nIHZhbGlkQWN0aW9ucyA9IHN0YXRlID09IG51bGwgPyAwIDogc3RhdGUuZ2V0QWN0aW9ucygpOworICAgICAgICAgICAgYm9vbGVhbiBpc1BsYXlpbmcgPSBzdGF0ZSAhPSBudWxsCisgICAgICAgICAgICAgICAgICAgICYmIHN0YXRlLmdldFN0YXRlKCkgPT0gUGxheWJhY2tTdGF0ZS5TVEFURV9QTEFZSU5HOworICAgICAgICAgICAgYm9vbGVhbiBjYW5QbGF5ID0gKHZhbGlkQWN0aW9ucyAmIChQbGF5YmFja1N0YXRlLkFDVElPTl9QTEFZX1BBVVNFCisgICAgICAgICAgICAgICAgICAgICAgICB8IFBsYXliYWNrU3RhdGUuQUNUSU9OX1BMQVkpKSAhPSAwOworICAgICAgICAgICAgYm9vbGVhbiBjYW5QYXVzZSA9ICh2YWxpZEFjdGlvbnMgJiAoUGxheWJhY2tTdGF0ZS5BQ1RJT05fUExBWV9QQVVTRQorICAgICAgICAgICAgICAgICAgICAgICAgfCBQbGF5YmFja1N0YXRlLkFDVElPTl9QQVVTRSkpICE9IDA7CisgICAgICAgICAgICBpZiAoaXNQbGF5aW5nICYmIGNhblBhdXNlKSB7CisgICAgICAgICAgICAgICAgb25QYXVzZSgpOworICAgICAgICAgICAgfSBlbHNlIGlmICghaXNQbGF5aW5nICYmIGNhblBsYXkpIHsKKyAgICAgICAgICAgICAgICBvblBsYXkoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBPdmVycmlkZSB0byBoYW5kbGUgcmVxdWVzdHMgdG8gcHJlcGFyZSBwbGF5YmFjay4gRHVyaW5nIHRoZSBwcmVwYXJhdGlvbiwgYSBzZXNzaW9uIHNob3VsZAorICAgICAgICAgKiBub3QgaG9sZCBhdWRpbyBmb2N1cyBpbiBvcmRlciB0byBhbGxvdyBvdGhlciBzZXNzaW9ucyBwbGF5IHNlYW1sZXNzbHkuIFRoZSBzdGF0ZSBvZgorICAgICAgICAgKiBwbGF5YmFjayBzaG91bGQgYmUgdXBkYXRlZCB0byB7QGxpbmsgUGxheWJhY2tTdGF0ZSNTVEFURV9QQVVTRUR9IGFmdGVyIHRoZSBwcmVwYXJhdGlvbiBpcworICAgICAgICAgKiBkb25lLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25QcmVwYXJlKCkgeworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIE92ZXJyaWRlIHRvIGhhbmRsZSByZXF1ZXN0cyB0byBwcmVwYXJlIGZvciBwbGF5aW5nIGEgc3BlY2lmaWMgbWVkaWFJZCB0aGF0IHdhcyBwcm92aWRlZAorICAgICAgICAgKiBieSB5b3VyIGFwcCdzIHtAbGluayBNZWRpYUJyb3dzZXJTZXJ2aWNlfS4gRHVyaW5nIHRoZSBwcmVwYXJhdGlvbiwgYSBzZXNzaW9uIHNob3VsZCBub3QKKyAgICAgICAgICogaG9sZCBhdWRpbyBmb2N1cyBpbiBvcmRlciB0byBhbGxvdyBvdGhlciBzZXNzaW9ucyBwbGF5IHNlYW1sZXNzbHkuIFRoZSBzdGF0ZSBvZiBwbGF5YmFjaworICAgICAgICAgKiBzaG91bGQgYmUgdXBkYXRlZCB0byB7QGxpbmsgUGxheWJhY2tTdGF0ZSNTVEFURV9QQVVTRUR9IGFmdGVyIHRoZSBwcmVwYXJhdGlvbiBpcyBkb25lLgorICAgICAgICAgKiBUaGUgcGxheWJhY2sgb2YgdGhlIHByZXBhcmVkIGNvbnRlbnQgc2hvdWxkIHN0YXJ0IGluIHRoZSBpbXBsZW1lbnRhdGlvbiBvZgorICAgICAgICAgKiB7QGxpbmsgI29uUGxheX0uIE92ZXJyaWRlIHtAbGluayAjb25QbGF5RnJvbU1lZGlhSWR9IHRvIGhhbmRsZSByZXF1ZXN0cyBmb3Igc3RhcnRpbmcKKyAgICAgICAgICogcGxheWJhY2sgd2l0aG91dCBwcmVwYXJhdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUHJlcGFyZUZyb21NZWRpYUlkKFN0cmluZyBtZWRpYUlkLCBCdW5kbGUgZXh0cmFzKSB7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogT3ZlcnJpZGUgdG8gaGFuZGxlIHJlcXVlc3RzIHRvIHByZXBhcmUgcGxheWJhY2sgZnJvbSBhIHNlYXJjaCBxdWVyeS4gQW4gZW1wdHkgcXVlcnkKKyAgICAgICAgICogaW5kaWNhdGVzIHRoYXQgdGhlIGFwcCBtYXkgcHJlcGFyZSBhbnkgbXVzaWMuIFRoZSBpbXBsZW1lbnRhdGlvbiBzaG91bGQgYXR0ZW1wdCB0byBtYWtlIGEKKyAgICAgICAgICogc21hcnQgY2hvaWNlIGFib3V0IHdoYXQgdG8gcGxheS4gRHVyaW5nIHRoZSBwcmVwYXJhdGlvbiwgYSBzZXNzaW9uIHNob3VsZCBub3QgaG9sZCBhdWRpbworICAgICAgICAgKiBmb2N1cyBpbiBvcmRlciB0byBhbGxvdyBvdGhlciBzZXNzaW9ucyBwbGF5IHNlYW1sZXNzbHkuIFRoZSBzdGF0ZSBvZiBwbGF5YmFjayBzaG91bGQgYmUKKyAgICAgICAgICogdXBkYXRlZCB0byB7QGxpbmsgUGxheWJhY2tTdGF0ZSNTVEFURV9QQVVTRUR9IGFmdGVyIHRoZSBwcmVwYXJhdGlvbiBpcyBkb25lLiBUaGUgcGxheWJhY2sKKyAgICAgICAgICogb2YgdGhlIHByZXBhcmVkIGNvbnRlbnQgc2hvdWxkIHN0YXJ0IGluIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgI29uUGxheX0uIE92ZXJyaWRlCisgICAgICAgICAqIHtAbGluayAjb25QbGF5RnJvbVNlYXJjaH0gdG8gaGFuZGxlIHJlcXVlc3RzIGZvciBzdGFydGluZyBwbGF5YmFjayB3aXRob3V0IHByZXBhcmF0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25QcmVwYXJlRnJvbVNlYXJjaChTdHJpbmcgcXVlcnksIEJ1bmRsZSBleHRyYXMpIHsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBPdmVycmlkZSB0byBoYW5kbGUgcmVxdWVzdHMgdG8gcHJlcGFyZSBhIHNwZWNpZmljIG1lZGlhIGl0ZW0gcmVwcmVzZW50ZWQgYnkgYSBVUkkuCisgICAgICAgICAqIER1cmluZyB0aGUgcHJlcGFyYXRpb24sIGEgc2Vzc2lvbiBzaG91bGQgbm90IGhvbGQgYXVkaW8gZm9jdXMgaW4gb3JkZXIgdG8gYWxsb3cKKyAgICAgICAgICogb3RoZXIgc2Vzc2lvbnMgcGxheSBzZWFtbGVzc2x5LiBUaGUgc3RhdGUgb2YgcGxheWJhY2sgc2hvdWxkIGJlIHVwZGF0ZWQgdG8KKyAgICAgICAgICoge0BsaW5rIFBsYXliYWNrU3RhdGUjU1RBVEVfUEFVU0VEfSBhZnRlciB0aGUgcHJlcGFyYXRpb24gaXMgZG9uZS4KKyAgICAgICAgICogVGhlIHBsYXliYWNrIG9mIHRoZSBwcmVwYXJlZCBjb250ZW50IHNob3VsZCBzdGFydCBpbiB0aGUgaW1wbGVtZW50YXRpb24gb2YKKyAgICAgICAgICoge0BsaW5rICNvblBsYXl9LiBPdmVycmlkZSB7QGxpbmsgI29uUGxheUZyb21Vcml9IHRvIGhhbmRsZSByZXF1ZXN0cworICAgICAgICAgKiBmb3Igc3RhcnRpbmcgcGxheWJhY2sgd2l0aG91dCBwcmVwYXJhdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUHJlcGFyZUZyb21VcmkoVXJpIHVyaSwgQnVuZGxlIGV4dHJhcykgeworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIE92ZXJyaWRlIHRvIGhhbmRsZSByZXF1ZXN0cyB0byBiZWdpbiBwbGF5YmFjay4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUGxheSgpIHsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBPdmVycmlkZSB0byBoYW5kbGUgcmVxdWVzdHMgdG8gYmVnaW4gcGxheWJhY2sgZnJvbSBhIHNlYXJjaCBxdWVyeS4gQW4KKyAgICAgICAgICogZW1wdHkgcXVlcnkgaW5kaWNhdGVzIHRoYXQgdGhlIGFwcCBtYXkgcGxheSBhbnkgbXVzaWMuIFRoZQorICAgICAgICAgKiBpbXBsZW1lbnRhdGlvbiBzaG91bGQgYXR0ZW1wdCB0byBtYWtlIGEgc21hcnQgY2hvaWNlIGFib3V0IHdoYXQgdG8KKyAgICAgICAgICogcGxheS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUGxheUZyb21TZWFyY2goU3RyaW5nIHF1ZXJ5LCBCdW5kbGUgZXh0cmFzKSB7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogT3ZlcnJpZGUgdG8gaGFuZGxlIHJlcXVlc3RzIHRvIHBsYXkgYSBzcGVjaWZpYyBtZWRpYUlkIHRoYXQgd2FzCisgICAgICAgICAqIHByb3ZpZGVkIGJ5IHlvdXIgYXBwJ3Mge0BsaW5rIE1lZGlhQnJvd3NlclNlcnZpY2V9LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25QbGF5RnJvbU1lZGlhSWQoU3RyaW5nIG1lZGlhSWQsIEJ1bmRsZSBleHRyYXMpIHsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBPdmVycmlkZSB0byBoYW5kbGUgcmVxdWVzdHMgdG8gcGxheSBhIHNwZWNpZmljIG1lZGlhIGl0ZW0gcmVwcmVzZW50ZWQgYnkgYSBVUkkuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBvblBsYXlGcm9tVXJpKFVyaSB1cmksIEJ1bmRsZSBleHRyYXMpIHsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBPdmVycmlkZSB0byBoYW5kbGUgcmVxdWVzdHMgdG8gcGxheSBhbiBpdGVtIHdpdGggYSBnaXZlbiBpZCBmcm9tIHRoZQorICAgICAgICAgKiBwbGF5IHF1ZXVlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25Ta2lwVG9RdWV1ZUl0ZW0obG9uZyBpZCkgeworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIE92ZXJyaWRlIHRvIGhhbmRsZSByZXF1ZXN0cyB0byBwYXVzZSBwbGF5YmFjay4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUGF1c2UoKSB7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogT3ZlcnJpZGUgdG8gaGFuZGxlIHJlcXVlc3RzIHRvIHNraXAgdG8gdGhlIG5leHQgbWVkaWEgaXRlbS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIG9uU2tpcFRvTmV4dCgpIHsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBPdmVycmlkZSB0byBoYW5kbGUgcmVxdWVzdHMgdG8gc2tpcCB0byB0aGUgcHJldmlvdXMgbWVkaWEgaXRlbS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIG9uU2tpcFRvUHJldmlvdXMoKSB7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogT3ZlcnJpZGUgdG8gaGFuZGxlIHJlcXVlc3RzIHRvIGZhc3QgZm9yd2FyZC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIG9uRmFzdEZvcndhcmQoKSB7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogT3ZlcnJpZGUgdG8gaGFuZGxlIHJlcXVlc3RzIHRvIHJld2luZC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUmV3aW5kKCkgeworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIE92ZXJyaWRlIHRvIGhhbmRsZSByZXF1ZXN0cyB0byBzdG9wIHBsYXliYWNrLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25TdG9wKCkgeworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIE92ZXJyaWRlIHRvIGhhbmRsZSByZXF1ZXN0cyB0byBzZWVrIHRvIGEgc3BlY2lmaWMgcG9zaXRpb24gaW4gbXMuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBwb3MgTmV3IHBvc2l0aW9uIHRvIG1vdmUgdG8sIGluIG1pbGxpc2Vjb25kcy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIG9uU2Vla1RvKGxvbmcgcG9zKSB7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogT3ZlcnJpZGUgdG8gaGFuZGxlIHRoZSBpdGVtIGJlaW5nIHJhdGVkLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gcmF0aW5nCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBvblNldFJhdGluZyhATm9uTnVsbCBSYXRpbmcgcmF0aW5nKSB7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ2FsbGVkIHdoZW4gYSB7QGxpbmsgTWVkaWFDb250cm9sbGVyfSB3YW50cyBhIHtAbGluayBQbGF5YmFja1N0YXRlLkN1c3RvbUFjdGlvbn0gdG8gYmUKKyAgICAgICAgICogcGVyZm9ybWVkLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gYWN0aW9uIFRoZSBhY3Rpb24gdGhhdCB3YXMgb3JpZ2luYWxseSBzZW50IGluIHRoZQorICAgICAgICAgKiAgICAgICAgICAgICAgIHtAbGluayBQbGF5YmFja1N0YXRlLkN1c3RvbUFjdGlvbn0uCisgICAgICAgICAqIEBwYXJhbSBleHRyYXMgT3B0aW9uYWwgZXh0cmFzIHNwZWNpZmllZCBieSB0aGUge0BsaW5rIE1lZGlhQ29udHJvbGxlcn0uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBvbkN1c3RvbUFjdGlvbihATm9uTnVsbCBTdHJpbmcgYWN0aW9uLCBATnVsbGFibGUgQnVuZGxlIGV4dHJhcykgeworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENhbGxiYWNrU3R1YiBleHRlbmRzIElTZXNzaW9uQ2FsbGJhY2suU3R1YiB7CisgICAgICAgIHByaXZhdGUgV2Vha1JlZmVyZW5jZTxNZWRpYVNlc3Npb24+IG1NZWRpYVNlc3Npb247CisKKyAgICAgICAgcHVibGljIENhbGxiYWNrU3R1YihNZWRpYVNlc3Npb24gc2Vzc2lvbikgeworICAgICAgICAgICAgbU1lZGlhU2Vzc2lvbiA9IG5ldyBXZWFrUmVmZXJlbmNlPD4oc2Vzc2lvbik7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBSZW1vdGVVc2VySW5mbyBjcmVhdGVSZW1vdGVVc2VySW5mbyhTdHJpbmcgcGFja2FnZU5hbWUsIGludCBwaWQsIGludCB1aWQsCisgICAgICAgICAgICAgICAgSVNlc3Npb25Db250cm9sbGVyQ2FsbGJhY2sgY2FsbGVyKSB7CisgICAgICAgICAgICAvL1RPRE8oYi8xMTk3NTIyMDUpOiBSZXNvbHZlIGhpZGRlbiBBUEkgdXNhZ2UuIDQtcGFyYW0gY29uc3RydWN0b3Igb2YgUmVtb3RlVXNlckluZm8KKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICByZXR1cm4gbmV3IFJlbW90ZVVzZXJJbmZvKHBhY2thZ2VOYW1lLCBwaWQsIHVpZCwKKyAgICAgICAgICAgICAgICAgICAgY2FsbGVyICE9IG51bGwgPyBjYWxsZXIuYXNCaW5kZXIoKSA6IG51bGwpOworICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHJldHVybiBuZXcgUmVtb3RlVXNlckluZm8ocGFja2FnZU5hbWUsIHBpZCwgdWlkKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkNvbW1hbmQoU3RyaW5nIHBhY2thZ2VOYW1lLCBpbnQgcGlkLCBpbnQgdWlkLAorICAgICAgICAgICAgICAgIElTZXNzaW9uQ29udHJvbGxlckNhbGxiYWNrIGNhbGxlciwgU3RyaW5nIGNvbW1hbmQsIEJ1bmRsZSBhcmdzLCBSZXN1bHRSZWNlaXZlciBjYikgeworICAgICAgICAgICAgTWVkaWFTZXNzaW9uIHNlc3Npb24gPSBtTWVkaWFTZXNzaW9uLmdldCgpOworICAgICAgICAgICAgaWYgKHNlc3Npb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHNlc3Npb24uZGlzcGF0Y2hDb21tYW5kKGNyZWF0ZVJlbW90ZVVzZXJJbmZvKHBhY2thZ2VOYW1lLCBwaWQsIHVpZCwgY2FsbGVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQsIGFyZ3MsIGNiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbk1lZGlhQnV0dG9uKFN0cmluZyBwYWNrYWdlTmFtZSwgaW50IHBpZCwgaW50IHVpZCwgSW50ZW50IG1lZGlhQnV0dG9uSW50ZW50LAorICAgICAgICAgICAgICAgIGludCBzZXF1ZW5jZU51bWJlciwgUmVzdWx0UmVjZWl2ZXIgY2IpIHsKKyAgICAgICAgICAgIE1lZGlhU2Vzc2lvbiBzZXNzaW9uID0gbU1lZGlhU2Vzc2lvbi5nZXQoKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaWYgKHNlc3Npb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmRpc3BhdGNoTWVkaWFCdXR0b24oY3JlYXRlUmVtb3RlVXNlckluZm8ocGFja2FnZU5hbWUsIHBpZCwgdWlkLCBudWxsKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUJ1dHRvbkludGVudCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBpZiAoY2IgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBjYi5zZW5kKHNlcXVlbmNlTnVtYmVyLCBudWxsKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25NZWRpYUJ1dHRvbkZyb21Db250cm9sbGVyKFN0cmluZyBwYWNrYWdlTmFtZSwgaW50IHBpZCwgaW50IHVpZCwKKyAgICAgICAgICAgICAgICBJU2Vzc2lvbkNvbnRyb2xsZXJDYWxsYmFjayBjYWxsZXIsIEludGVudCBtZWRpYUJ1dHRvbkludGVudCkgeworICAgICAgICAgICAgTWVkaWFTZXNzaW9uIHNlc3Npb24gPSBtTWVkaWFTZXNzaW9uLmdldCgpOworICAgICAgICAgICAgaWYgKHNlc3Npb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHNlc3Npb24uZGlzcGF0Y2hNZWRpYUJ1dHRvbihjcmVhdGVSZW1vdGVVc2VySW5mbyhwYWNrYWdlTmFtZSwgcGlkLCB1aWQsIGNhbGxlciksCisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUJ1dHRvbkludGVudCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25QcmVwYXJlKFN0cmluZyBwYWNrYWdlTmFtZSwgaW50IHBpZCwgaW50IHVpZCwKKyAgICAgICAgICAgICAgICBJU2Vzc2lvbkNvbnRyb2xsZXJDYWxsYmFjayBjYWxsZXIpIHsKKyAgICAgICAgICAgIE1lZGlhU2Vzc2lvbiBzZXNzaW9uID0gbU1lZGlhU2Vzc2lvbi5nZXQoKTsKKyAgICAgICAgICAgIGlmIChzZXNzaW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzZXNzaW9uLmRpc3BhdGNoUHJlcGFyZShjcmVhdGVSZW1vdGVVc2VySW5mbyhwYWNrYWdlTmFtZSwgcGlkLCB1aWQsIGNhbGxlcikpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUHJlcGFyZUZyb21NZWRpYUlkKFN0cmluZyBwYWNrYWdlTmFtZSwgaW50IHBpZCwgaW50IHVpZCwKKyAgICAgICAgICAgICAgICBJU2Vzc2lvbkNvbnRyb2xsZXJDYWxsYmFjayBjYWxsZXIsIFN0cmluZyBtZWRpYUlkLAorICAgICAgICAgICAgICAgIEJ1bmRsZSBleHRyYXMpIHsKKyAgICAgICAgICAgIE1lZGlhU2Vzc2lvbiBzZXNzaW9uID0gbU1lZGlhU2Vzc2lvbi5nZXQoKTsKKyAgICAgICAgICAgIGlmIChzZXNzaW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzZXNzaW9uLmRpc3BhdGNoUHJlcGFyZUZyb21NZWRpYUlkKAorICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlUmVtb3RlVXNlckluZm8ocGFja2FnZU5hbWUsIHBpZCwgdWlkLCBjYWxsZXIpLCBtZWRpYUlkLCBleHRyYXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUHJlcGFyZUZyb21TZWFyY2goU3RyaW5nIHBhY2thZ2VOYW1lLCBpbnQgcGlkLCBpbnQgdWlkLAorICAgICAgICAgICAgICAgIElTZXNzaW9uQ29udHJvbGxlckNhbGxiYWNrIGNhbGxlciwgU3RyaW5nIHF1ZXJ5LAorICAgICAgICAgICAgICAgIEJ1bmRsZSBleHRyYXMpIHsKKyAgICAgICAgICAgIE1lZGlhU2Vzc2lvbiBzZXNzaW9uID0gbU1lZGlhU2Vzc2lvbi5nZXQoKTsKKyAgICAgICAgICAgIGlmIChzZXNzaW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzZXNzaW9uLmRpc3BhdGNoUHJlcGFyZUZyb21TZWFyY2goCisgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVSZW1vdGVVc2VySW5mbyhwYWNrYWdlTmFtZSwgcGlkLCB1aWQsIGNhbGxlciksIHF1ZXJ5LCBleHRyYXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUHJlcGFyZUZyb21VcmkoU3RyaW5nIHBhY2thZ2VOYW1lLCBpbnQgcGlkLCBpbnQgdWlkLAorICAgICAgICAgICAgICAgIElTZXNzaW9uQ29udHJvbGxlckNhbGxiYWNrIGNhbGxlciwgVXJpIHVyaSwgQnVuZGxlIGV4dHJhcykgeworICAgICAgICAgICAgTWVkaWFTZXNzaW9uIHNlc3Npb24gPSBtTWVkaWFTZXNzaW9uLmdldCgpOworICAgICAgICAgICAgaWYgKHNlc3Npb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHNlc3Npb24uZGlzcGF0Y2hQcmVwYXJlRnJvbVVyaShjcmVhdGVSZW1vdGVVc2VySW5mbyhwYWNrYWdlTmFtZSwgcGlkLCB1aWQsIGNhbGxlciksCisgICAgICAgICAgICAgICAgICAgICAgICB1cmksIGV4dHJhcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25QbGF5KFN0cmluZyBwYWNrYWdlTmFtZSwgaW50IHBpZCwgaW50IHVpZCwKKyAgICAgICAgICAgICAgICBJU2Vzc2lvbkNvbnRyb2xsZXJDYWxsYmFjayBjYWxsZXIpIHsKKyAgICAgICAgICAgIE1lZGlhU2Vzc2lvbiBzZXNzaW9uID0gbU1lZGlhU2Vzc2lvbi5nZXQoKTsKKyAgICAgICAgICAgIGlmIChzZXNzaW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzZXNzaW9uLmRpc3BhdGNoUGxheShjcmVhdGVSZW1vdGVVc2VySW5mbyhwYWNrYWdlTmFtZSwgcGlkLCB1aWQsIGNhbGxlcikpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUGxheUZyb21NZWRpYUlkKFN0cmluZyBwYWNrYWdlTmFtZSwgaW50IHBpZCwgaW50IHVpZCwKKyAgICAgICAgICAgICAgICBJU2Vzc2lvbkNvbnRyb2xsZXJDYWxsYmFjayBjYWxsZXIsIFN0cmluZyBtZWRpYUlkLAorICAgICAgICAgICAgICAgIEJ1bmRsZSBleHRyYXMpIHsKKyAgICAgICAgICAgIE1lZGlhU2Vzc2lvbiBzZXNzaW9uID0gbU1lZGlhU2Vzc2lvbi5nZXQoKTsKKyAgICAgICAgICAgIGlmIChzZXNzaW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzZXNzaW9uLmRpc3BhdGNoUGxheUZyb21NZWRpYUlkKGNyZWF0ZVJlbW90ZVVzZXJJbmZvKHBhY2thZ2VOYW1lLCBwaWQsIHVpZCwgY2FsbGVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSWQsIGV4dHJhcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25QbGF5RnJvbVNlYXJjaChTdHJpbmcgcGFja2FnZU5hbWUsIGludCBwaWQsIGludCB1aWQsCisgICAgICAgICAgICAgICAgSVNlc3Npb25Db250cm9sbGVyQ2FsbGJhY2sgY2FsbGVyLCBTdHJpbmcgcXVlcnksCisgICAgICAgICAgICAgICAgQnVuZGxlIGV4dHJhcykgeworICAgICAgICAgICAgTWVkaWFTZXNzaW9uIHNlc3Npb24gPSBtTWVkaWFTZXNzaW9uLmdldCgpOworICAgICAgICAgICAgaWYgKHNlc3Npb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHNlc3Npb24uZGlzcGF0Y2hQbGF5RnJvbVNlYXJjaChjcmVhdGVSZW1vdGVVc2VySW5mbyhwYWNrYWdlTmFtZSwgcGlkLCB1aWQsIGNhbGxlciksCisgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeSwgZXh0cmFzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblBsYXlGcm9tVXJpKFN0cmluZyBwYWNrYWdlTmFtZSwgaW50IHBpZCwgaW50IHVpZCwKKyAgICAgICAgICAgICAgICBJU2Vzc2lvbkNvbnRyb2xsZXJDYWxsYmFjayBjYWxsZXIsIFVyaSB1cmksIEJ1bmRsZSBleHRyYXMpIHsKKyAgICAgICAgICAgIE1lZGlhU2Vzc2lvbiBzZXNzaW9uID0gbU1lZGlhU2Vzc2lvbi5nZXQoKTsKKyAgICAgICAgICAgIGlmIChzZXNzaW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzZXNzaW9uLmRpc3BhdGNoUGxheUZyb21VcmkoY3JlYXRlUmVtb3RlVXNlckluZm8ocGFja2FnZU5hbWUsIHBpZCwgdWlkLCBjYWxsZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgdXJpLCBleHRyYXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uU2tpcFRvVHJhY2soU3RyaW5nIHBhY2thZ2VOYW1lLCBpbnQgcGlkLCBpbnQgdWlkLAorICAgICAgICAgICAgICAgIElTZXNzaW9uQ29udHJvbGxlckNhbGxiYWNrIGNhbGxlciwgbG9uZyBpZCkgeworICAgICAgICAgICAgTWVkaWFTZXNzaW9uIHNlc3Npb24gPSBtTWVkaWFTZXNzaW9uLmdldCgpOworICAgICAgICAgICAgaWYgKHNlc3Npb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHNlc3Npb24uZGlzcGF0Y2hTa2lwVG9JdGVtKGNyZWF0ZVJlbW90ZVVzZXJJbmZvKHBhY2thZ2VOYW1lLCBwaWQsIHVpZCwgY2FsbGVyKSwgaWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUGF1c2UoU3RyaW5nIHBhY2thZ2VOYW1lLCBpbnQgcGlkLCBpbnQgdWlkLAorICAgICAgICAgICAgICAgIElTZXNzaW9uQ29udHJvbGxlckNhbGxiYWNrIGNhbGxlcikgeworICAgICAgICAgICAgTWVkaWFTZXNzaW9uIHNlc3Npb24gPSBtTWVkaWFTZXNzaW9uLmdldCgpOworICAgICAgICAgICAgaWYgKHNlc3Npb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHNlc3Npb24uZGlzcGF0Y2hQYXVzZShjcmVhdGVSZW1vdGVVc2VySW5mbyhwYWNrYWdlTmFtZSwgcGlkLCB1aWQsIGNhbGxlcikpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uU3RvcChTdHJpbmcgcGFja2FnZU5hbWUsIGludCBwaWQsIGludCB1aWQsCisgICAgICAgICAgICAgICAgSVNlc3Npb25Db250cm9sbGVyQ2FsbGJhY2sgY2FsbGVyKSB7CisgICAgICAgICAgICBNZWRpYVNlc3Npb24gc2Vzc2lvbiA9IG1NZWRpYVNlc3Npb24uZ2V0KCk7CisgICAgICAgICAgICBpZiAoc2Vzc2lvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgc2Vzc2lvbi5kaXNwYXRjaFN0b3AoY3JlYXRlUmVtb3RlVXNlckluZm8ocGFja2FnZU5hbWUsIHBpZCwgdWlkLCBjYWxsZXIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbk5leHQoU3RyaW5nIHBhY2thZ2VOYW1lLCBpbnQgcGlkLCBpbnQgdWlkLAorICAgICAgICAgICAgICAgIElTZXNzaW9uQ29udHJvbGxlckNhbGxiYWNrIGNhbGxlcikgeworICAgICAgICAgICAgTWVkaWFTZXNzaW9uIHNlc3Npb24gPSBtTWVkaWFTZXNzaW9uLmdldCgpOworICAgICAgICAgICAgaWYgKHNlc3Npb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHNlc3Npb24uZGlzcGF0Y2hOZXh0KGNyZWF0ZVJlbW90ZVVzZXJJbmZvKHBhY2thZ2VOYW1lLCBwaWQsIHVpZCwgY2FsbGVyKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25QcmV2aW91cyhTdHJpbmcgcGFja2FnZU5hbWUsIGludCBwaWQsIGludCB1aWQsCisgICAgICAgICAgICAgICAgSVNlc3Npb25Db250cm9sbGVyQ2FsbGJhY2sgY2FsbGVyKSB7CisgICAgICAgICAgICBNZWRpYVNlc3Npb24gc2Vzc2lvbiA9IG1NZWRpYVNlc3Npb24uZ2V0KCk7CisgICAgICAgICAgICBpZiAoc2Vzc2lvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgc2Vzc2lvbi5kaXNwYXRjaFByZXZpb3VzKGNyZWF0ZVJlbW90ZVVzZXJJbmZvKHBhY2thZ2VOYW1lLCBwaWQsIHVpZCwgY2FsbGVyKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25GYXN0Rm9yd2FyZChTdHJpbmcgcGFja2FnZU5hbWUsIGludCBwaWQsIGludCB1aWQsCisgICAgICAgICAgICAgICAgSVNlc3Npb25Db250cm9sbGVyQ2FsbGJhY2sgY2FsbGVyKSB7CisgICAgICAgICAgICBNZWRpYVNlc3Npb24gc2Vzc2lvbiA9IG1NZWRpYVNlc3Npb24uZ2V0KCk7CisgICAgICAgICAgICBpZiAoc2Vzc2lvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgc2Vzc2lvbi5kaXNwYXRjaEZhc3RGb3J3YXJkKGNyZWF0ZVJlbW90ZVVzZXJJbmZvKHBhY2thZ2VOYW1lLCBwaWQsIHVpZCwgY2FsbGVyKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25SZXdpbmQoU3RyaW5nIHBhY2thZ2VOYW1lLCBpbnQgcGlkLCBpbnQgdWlkLAorICAgICAgICAgICAgICAgIElTZXNzaW9uQ29udHJvbGxlckNhbGxiYWNrIGNhbGxlcikgeworICAgICAgICAgICAgTWVkaWFTZXNzaW9uIHNlc3Npb24gPSBtTWVkaWFTZXNzaW9uLmdldCgpOworICAgICAgICAgICAgaWYgKHNlc3Npb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHNlc3Npb24uZGlzcGF0Y2hSZXdpbmQoY3JlYXRlUmVtb3RlVXNlckluZm8ocGFja2FnZU5hbWUsIHBpZCwgdWlkLCBjYWxsZXIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblNlZWtUbyhTdHJpbmcgcGFja2FnZU5hbWUsIGludCBwaWQsIGludCB1aWQsCisgICAgICAgICAgICAgICAgSVNlc3Npb25Db250cm9sbGVyQ2FsbGJhY2sgY2FsbGVyLCBsb25nIHBvcykgeworICAgICAgICAgICAgTWVkaWFTZXNzaW9uIHNlc3Npb24gPSBtTWVkaWFTZXNzaW9uLmdldCgpOworICAgICAgICAgICAgaWYgKHNlc3Npb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHNlc3Npb24uZGlzcGF0Y2hTZWVrVG8oY3JlYXRlUmVtb3RlVXNlckluZm8ocGFja2FnZU5hbWUsIHBpZCwgdWlkLCBjYWxsZXIpLCBwb3MpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUmF0ZShTdHJpbmcgcGFja2FnZU5hbWUsIGludCBwaWQsIGludCB1aWQsIElTZXNzaW9uQ29udHJvbGxlckNhbGxiYWNrIGNhbGxlciwKKyAgICAgICAgICAgICAgICBSYXRpbmcgcmF0aW5nKSB7CisgICAgICAgICAgICBNZWRpYVNlc3Npb24gc2Vzc2lvbiA9IG1NZWRpYVNlc3Npb24uZ2V0KCk7CisgICAgICAgICAgICBpZiAoc2Vzc2lvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgc2Vzc2lvbi5kaXNwYXRjaFJhdGUoY3JlYXRlUmVtb3RlVXNlckluZm8ocGFja2FnZU5hbWUsIHBpZCwgdWlkLCBjYWxsZXIpLCByYXRpbmcpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ3VzdG9tQWN0aW9uKFN0cmluZyBwYWNrYWdlTmFtZSwgaW50IHBpZCwgaW50IHVpZCwKKyAgICAgICAgICAgICAgICBJU2Vzc2lvbkNvbnRyb2xsZXJDYWxsYmFjayBjYWxsZXIsIFN0cmluZyBhY3Rpb24sIEJ1bmRsZSBhcmdzKSB7CisgICAgICAgICAgICBNZWRpYVNlc3Npb24gc2Vzc2lvbiA9IG1NZWRpYVNlc3Npb24uZ2V0KCk7CisgICAgICAgICAgICBpZiAoc2Vzc2lvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgc2Vzc2lvbi5kaXNwYXRjaEN1c3RvbUFjdGlvbihjcmVhdGVSZW1vdGVVc2VySW5mbyhwYWNrYWdlTmFtZSwgcGlkLCB1aWQsIGNhbGxlciksCisgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb24sIGFyZ3MpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQWRqdXN0Vm9sdW1lKFN0cmluZyBwYWNrYWdlTmFtZSwgaW50IHBpZCwgaW50IHVpZCwKKyAgICAgICAgICAgICAgICBJU2Vzc2lvbkNvbnRyb2xsZXJDYWxsYmFjayBjYWxsZXIsIGludCBkaXJlY3Rpb24pIHsKKyAgICAgICAgICAgIE1lZGlhU2Vzc2lvbiBzZXNzaW9uID0gbU1lZGlhU2Vzc2lvbi5nZXQoKTsKKyAgICAgICAgICAgIGlmIChzZXNzaW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzZXNzaW9uLmRpc3BhdGNoQWRqdXN0Vm9sdW1lKGNyZWF0ZVJlbW90ZVVzZXJJbmZvKHBhY2thZ2VOYW1lLCBwaWQsIHVpZCwgY2FsbGVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25TZXRWb2x1bWVUbyhTdHJpbmcgcGFja2FnZU5hbWUsIGludCBwaWQsIGludCB1aWQsCisgICAgICAgICAgICAgICAgSVNlc3Npb25Db250cm9sbGVyQ2FsbGJhY2sgY2FsbGVyLCBpbnQgdmFsdWUpIHsKKyAgICAgICAgICAgIE1lZGlhU2Vzc2lvbiBzZXNzaW9uID0gbU1lZGlhU2Vzc2lvbi5nZXQoKTsKKyAgICAgICAgICAgIGlmIChzZXNzaW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzZXNzaW9uLmRpc3BhdGNoU2V0Vm9sdW1lVG8oY3JlYXRlUmVtb3RlVXNlckluZm8ocGFja2FnZU5hbWUsIHBpZCwgdWlkLCBjYWxsZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBzaW5nbGUgaXRlbSB0aGF0IGlzIHBhcnQgb2YgdGhlIHBsYXkgcXVldWUuIEl0IGNvbnRhaW5zIGEgZGVzY3JpcHRpb24KKyAgICAgKiBvZiB0aGUgaXRlbSBhbmQgaXRzIGlkIGluIHRoZSBxdWV1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFF1ZXVlSXRlbSBpbXBsZW1lbnRzIFBhcmNlbGFibGUgeworICAgICAgICAvKioKKyAgICAgICAgICogVGhpcyBpZCBpcyByZXNlcnZlZC4gTm8gaXRlbXMgY2FuIGJlIGV4cGxpY2l0bHkgYXNzaWduZWQgdGhpcyBpZC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVOS05PV05fSUQgPSAtMTsKKworICAgICAgICBwcml2YXRlIGZpbmFsIE1lZGlhRGVzY3JpcHRpb24gbURlc2NyaXB0aW9uOworICAgICAgICBAVW5zdXBwb3J0ZWRBcHBVc2FnZQorICAgICAgICBwcml2YXRlIGZpbmFsIGxvbmcgbUlkOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGUgYSBuZXcge0BsaW5rIE1lZGlhU2Vzc2lvbi5RdWV1ZUl0ZW19LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gZGVzY3JpcHRpb24gVGhlIHtAbGluayBNZWRpYURlc2NyaXB0aW9ufSBmb3IgdGhpcyBpdGVtLgorICAgICAgICAgKiBAcGFyYW0gaWQgQW4gaWRlbnRpZmllciBmb3IgdGhpcyBpdGVtLiBJdCBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gdGhlCisgICAgICAgICAqICAgICAgICAgICAgcGxheSBxdWV1ZSBhbmQgY2Fubm90IGJlIHtAbGluayAjVU5LTk9XTl9JRH0uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgUXVldWVJdGVtKE1lZGlhRGVzY3JpcHRpb24gZGVzY3JpcHRpb24sIGxvbmcgaWQpIHsKKyAgICAgICAgICAgIGlmIChkZXNjcmlwdGlvbiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiRGVzY3JpcHRpb24gY2Fubm90IGJlIG51bGwuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaWQgPT0gVU5LTk9XTl9JRCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIklkIGNhbm5vdCBiZSBRdWV1ZUl0ZW0uVU5LTk9XTl9JRCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbURlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247CisgICAgICAgICAgICBtSWQgPSBpZDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgUXVldWVJdGVtKFBhcmNlbCBpbikgeworICAgICAgICAgICAgbURlc2NyaXB0aW9uID0gTWVkaWFEZXNjcmlwdGlvbi5DUkVBVE9SLmNyZWF0ZUZyb21QYXJjZWwoaW4pOworICAgICAgICAgICAgbUlkID0gaW4ucmVhZExvbmcoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgdGhlIGRlc2NyaXB0aW9uIGZvciB0aGlzIGl0ZW0uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgTWVkaWFEZXNjcmlwdGlvbiBnZXREZXNjcmlwdGlvbigpIHsKKyAgICAgICAgICAgIHJldHVybiBtRGVzY3JpcHRpb247CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IHRoZSBxdWV1ZSBpZCBmb3IgdGhpcyBpdGVtLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGxvbmcgZ2V0UXVldWVJZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtSWQ7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgd3JpdGVUb1BhcmNlbChQYXJjZWwgZGVzdCwgaW50IGZsYWdzKSB7CisgICAgICAgICAgICBtRGVzY3JpcHRpb24ud3JpdGVUb1BhcmNlbChkZXN0LCBmbGFncyk7CisgICAgICAgICAgICBkZXN0LndyaXRlTG9uZyhtSWQpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgZGVzY3JpYmVDb250ZW50cygpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDcmVhdG9yPE1lZGlhU2Vzc2lvbi5RdWV1ZUl0ZW0+IENSRUFUT1IgPQorICAgICAgICAgICAgICAgIG5ldyBDcmVhdG9yPE1lZGlhU2Vzc2lvbi5RdWV1ZUl0ZW0+KCkgeworCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBNZWRpYVNlc3Npb24uUXVldWVJdGVtIGNyZWF0ZUZyb21QYXJjZWwoUGFyY2VsIHApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE1lZGlhU2Vzc2lvbi5RdWV1ZUl0ZW0ocCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIE1lZGlhU2Vzc2lvbi5RdWV1ZUl0ZW1bXSBuZXdBcnJheShpbnQgc2l6ZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTWVkaWFTZXNzaW9uLlF1ZXVlSXRlbVtzaXplXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiAiTWVkaWFTZXNzaW9uLlF1ZXVlSXRlbSB7IiArCisgICAgICAgICAgICAgICAgICAgICJEZXNjcmlwdGlvbj0iICsgbURlc2NyaXB0aW9uICsKKyAgICAgICAgICAgICAgICAgICAgIiwgSWQ9IiArIG1JZCArICIgfSI7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CisgICAgICAgICAgICBpZiAobyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIShvIGluc3RhbmNlb2YgUXVldWVJdGVtKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmluYWwgUXVldWVJdGVtIGl0ZW0gPSAoUXVldWVJdGVtKSBvOworICAgICAgICAgICAgaWYgKG1JZCAhPSBpdGVtLm1JZCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFPYmplY3RzLmVxdWFscyhtRGVzY3JpcHRpb24sIGl0ZW0ubURlc2NyaXB0aW9uKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBDb21tYW5kIHsKKyAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZyBjb21tYW5kOworICAgICAgICBwdWJsaWMgZmluYWwgQnVuZGxlIGV4dHJhczsKKyAgICAgICAgcHVibGljIGZpbmFsIFJlc3VsdFJlY2VpdmVyIHN0dWI7CisKKyAgICAgICAgcHVibGljIENvbW1hbmQoU3RyaW5nIGNvbW1hbmQsIEJ1bmRsZSBleHRyYXMsIFJlc3VsdFJlY2VpdmVyIHN0dWIpIHsKKyAgICAgICAgICAgIHRoaXMuY29tbWFuZCA9IGNvbW1hbmQ7CisgICAgICAgICAgICB0aGlzLmV4dHJhcyA9IGV4dHJhczsKKyAgICAgICAgICAgIHRoaXMuc3R1YiA9IHN0dWI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIENhbGxiYWNrTWVzc2FnZUhhbmRsZXIgZXh0ZW5kcyBIYW5kbGVyIHsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19DT01NQU5EID0gMTsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19NRURJQV9CVVRUT04gPSAyOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1BSRVBBUkUgPSAzOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1BSRVBBUkVfTUVESUFfSUQgPSA0OworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1BSRVBBUkVfU0VBUkNIID0gNTsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19QUkVQQVJFX1VSSSA9IDY7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfUExBWSA9IDc7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfUExBWV9NRURJQV9JRCA9IDg7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfUExBWV9TRUFSQ0ggPSA5OworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1BMQVlfVVJJID0gMTA7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfU0tJUF9UT19JVEVNID0gMTE7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfUEFVU0UgPSAxMjsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19TVE9QID0gMTM7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfTkVYVCA9IDE0OworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1BSRVZJT1VTID0gMTU7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfRkFTVF9GT1JXQVJEID0gMTY7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfUkVXSU5EID0gMTc7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfU0VFS19UTyA9IDE4OworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1JBVEUgPSAxOTsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19DVVNUT01fQUNUSU9OID0gMjA7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfQURKVVNUX1ZPTFVNRSA9IDIxOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1NFVF9WT0xVTUUgPSAyMjsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19QTEFZX1BBVVNFX0tFWV9ET1VCTEVfVEFQX1RJTUVPVVQgPSAyMzsKKworICAgICAgICBwcml2YXRlIE1lZGlhU2Vzc2lvbi5DYWxsYmFjayBtQ2FsbGJhY2s7CisgICAgICAgIHByaXZhdGUgUmVtb3RlVXNlckluZm8gbUN1cnJlbnRDb250cm9sbGVySW5mbzsKKworICAgICAgICBwdWJsaWMgQ2FsbGJhY2tNZXNzYWdlSGFuZGxlcihMb29wZXIgbG9vcGVyLCBNZWRpYVNlc3Npb24uQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgICAgIC8vVE9ETzooYi8xMTk1Mzk4NDkpIFVuY29tbWVudCBiZWxvdyBsaW5lIGFuZCByZXNvbHZlIHRoZSBlcnJvci4KKyAgICAgICAgICAgIC8vc3VwZXIobG9vcGVyLCBudWxsLCB0cnVlKTsKKyAgICAgICAgICAgIG1DYWxsYmFjayA9IGNhbGxiYWNrOworICAgICAgICAgICAgbUNhbGxiYWNrLm1IYW5kbGVyID0gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHBvc3QoUmVtb3RlVXNlckluZm8gY2FsbGVyLCBpbnQgd2hhdCwgT2JqZWN0IG9iaiwgQnVuZGxlIGRhdGEsIGxvbmcgZGVsYXlNcykgeworICAgICAgICAgICAgUGFpcjxSZW1vdGVVc2VySW5mbywgT2JqZWN0PiBvYmpXaXRoQ2FsbGVyID0gUGFpci5jcmVhdGUoY2FsbGVyLCBvYmopOworICAgICAgICAgICAgTWVzc2FnZSBtc2cgPSBvYnRhaW5NZXNzYWdlKHdoYXQsIG9ialdpdGhDYWxsZXIpOworICAgICAgICAgICAgbXNnLnNldERhdGEoZGF0YSk7CisgICAgICAgICAgICBpZiAoZGVsYXlNcyA+IDApIHsKKyAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZURlbGF5ZWQobXNnLCBkZWxheU1zKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2UobXNnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7CisgICAgICAgICAgICBtQ3VycmVudENvbnRyb2xsZXJJbmZvID0gKChQYWlyPFJlbW90ZVVzZXJJbmZvLCBPYmplY3Q+KSBtc2cub2JqKS5maXJzdDsKKworICAgICAgICAgICAgVm9sdW1lUHJvdmlkZXIgdnA7CisgICAgICAgICAgICBPYmplY3Qgb2JqID0gKChQYWlyPFJlbW90ZVVzZXJJbmZvLCBPYmplY3Q+KSBtc2cub2JqKS5zZWNvbmQ7CisKKyAgICAgICAgICAgIHN3aXRjaCAobXNnLndoYXQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19DT01NQU5EOgorICAgICAgICAgICAgICAgICAgICBDb21tYW5kIGNtZCA9IChDb21tYW5kKSBvYmo7CisgICAgICAgICAgICAgICAgICAgIG1DYWxsYmFjay5vbkNvbW1hbmQoY21kLmNvbW1hbmQsIGNtZC5leHRyYXMsIGNtZC5zdHViKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBNU0dfTUVESUFfQlVUVE9OOgorICAgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2sub25NZWRpYUJ1dHRvbkV2ZW50KChJbnRlbnQpIG9iaik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgTVNHX1BSRVBBUkU6CisgICAgICAgICAgICAgICAgICAgIG1DYWxsYmFjay5vblByZXBhcmUoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBNU0dfUFJFUEFSRV9NRURJQV9JRDoKKyAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrLm9uUHJlcGFyZUZyb21NZWRpYUlkKChTdHJpbmcpIG9iaiwgbXNnLmdldERhdGEoKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgTVNHX1BSRVBBUkVfU0VBUkNIOgorICAgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2sub25QcmVwYXJlRnJvbVNlYXJjaCgoU3RyaW5nKSBvYmosIG1zZy5nZXREYXRhKCkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19QUkVQQVJFX1VSSToKKyAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrLm9uUHJlcGFyZUZyb21VcmkoKFVyaSkgb2JqLCBtc2cuZ2V0RGF0YSgpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBNU0dfUExBWToKKyAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrLm9uUGxheSgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19QTEFZX01FRElBX0lEOgorICAgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2sub25QbGF5RnJvbU1lZGlhSWQoKFN0cmluZykgb2JqLCBtc2cuZ2V0RGF0YSgpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBNU0dfUExBWV9TRUFSQ0g6CisgICAgICAgICAgICAgICAgICAgIG1DYWxsYmFjay5vblBsYXlGcm9tU2VhcmNoKChTdHJpbmcpIG9iaiwgbXNnLmdldERhdGEoKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgTVNHX1BMQVlfVVJJOgorICAgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2sub25QbGF5RnJvbVVyaSgoVXJpKSBvYmosIG1zZy5nZXREYXRhKCkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19TS0lQX1RPX0lURU06CisgICAgICAgICAgICAgICAgICAgIG1DYWxsYmFjay5vblNraXBUb1F1ZXVlSXRlbSgoTG9uZykgb2JqKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBNU0dfUEFVU0U6CisgICAgICAgICAgICAgICAgICAgIG1DYWxsYmFjay5vblBhdXNlKCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgTVNHX1NUT1A6CisgICAgICAgICAgICAgICAgICAgIG1DYWxsYmFjay5vblN0b3AoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBNU0dfTkVYVDoKKyAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrLm9uU2tpcFRvTmV4dCgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19QUkVWSU9VUzoKKyAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrLm9uU2tpcFRvUHJldmlvdXMoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBNU0dfRkFTVF9GT1JXQVJEOgorICAgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2sub25GYXN0Rm9yd2FyZCgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19SRVdJTkQ6CisgICAgICAgICAgICAgICAgICAgIG1DYWxsYmFjay5vblJld2luZCgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19TRUVLX1RPOgorICAgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2sub25TZWVrVG8oKExvbmcpIG9iaik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgTVNHX1JBVEU6CisgICAgICAgICAgICAgICAgICAgIG1DYWxsYmFjay5vblNldFJhdGluZygoUmF0aW5nKSBvYmopOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19DVVNUT01fQUNUSU9OOgorICAgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2sub25DdXN0b21BY3Rpb24oKFN0cmluZykgb2JqLCBtc2cuZ2V0RGF0YSgpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBNU0dfQURKVVNUX1ZPTFVNRToKKyAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgICAgICAgICAgICAgdnAgPSBtVm9sdW1lUHJvdmlkZXI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHZwICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZwLm9uQWRqdXN0Vm9sdW1lKChpbnQpIG9iaik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBNU0dfU0VUX1ZPTFVNRToKKyAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgICAgICAgICAgICAgdnAgPSBtVm9sdW1lUHJvdmlkZXI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHZwICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZwLm9uU2V0Vm9sdW1lVG8oKGludCkgb2JqKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19QTEFZX1BBVVNFX0tFWV9ET1VCTEVfVEFQX1RJTUVPVVQ6CisgICAgICAgICAgICAgICAgICAgIG1DYWxsYmFjay5oYW5kbGVNZWRpYVBsYXlQYXVzZUtleVNpbmdsZVRhcElmUGVuZGluZygpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1DdXJyZW50Q29udHJvbGxlckluZm8gPSBudWxsOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL2FwZXgvamF2YS9hbmRyb2lkL21lZGlhL3Nlc3Npb24vUGFyY2VsYWJsZVZvbHVtZUluZm8uYWlkbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9hcGV4L2phdmEvYW5kcm9pZC9tZWRpYS9zZXNzaW9uL1BhcmNlbGFibGVWb2x1bWVJbmZvLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQyNTBmMAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9hcGV4L2phdmEvYW5kcm9pZC9tZWRpYS9zZXNzaW9uL1BhcmNlbGFibGVWb2x1bWVJbmZvLmFpZGwKQEAgLTAsMCArMSwxOCBAQAorLyogQ29weXJpZ2h0IDIwMTQsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYS5zZXNzaW9uOworCitwYXJjZWxhYmxlIFBhcmNlbGFibGVWb2x1bWVJbmZvOwpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL2FwZXgvamF2YS9hbmRyb2lkL21lZGlhL3Nlc3Npb24vUGFyY2VsYWJsZVZvbHVtZUluZm8uamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9hcGV4L2phdmEvYW5kcm9pZC9tZWRpYS9zZXNzaW9uL1BhcmNlbGFibGVWb2x1bWVJbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjU5Yzk3NQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9hcGV4L2phdmEvYW5kcm9pZC9tZWRpYS9zZXNzaW9uL1BhcmNlbGFibGVWb2x1bWVJbmZvLmphdmEKQEAgLTAsMCArMSw4MCBAQAorLyogQ29weXJpZ2h0IDIwMTQsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqKgorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqKgorICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqKgorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWEuc2Vzc2lvbjsKKworaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9BdHRyaWJ1dGVzOworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsYWJsZTsKKworLyoqCisgKiBDb252ZW5pZW5jZSBjbGFzcyBmb3IgcGFzc2luZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgYXVkaW8gY29uZmlndXJhdGlvbiBvZiBhCisgKiBzZXNzaW9uLiBUaGUgcHVibGljIGltcGxlbWVudGF0aW9uIGlzIHtAbGluayBNZWRpYUNvbnRyb2xsZXIuUGxheWJhY2tJbmZvfS4KKyAqCisgKiBAaGlkZQorICovCitwdWJsaWMgY2xhc3MgUGFyY2VsYWJsZVZvbHVtZUluZm8gaW1wbGVtZW50cyBQYXJjZWxhYmxlIHsKKyAgICBwdWJsaWMgaW50IHZvbHVtZVR5cGU7CisgICAgcHVibGljIEF1ZGlvQXR0cmlidXRlcyBhdWRpb0F0dHJzOworICAgIHB1YmxpYyBpbnQgY29udHJvbFR5cGU7CisgICAgcHVibGljIGludCBtYXhWb2x1bWU7CisgICAgcHVibGljIGludCBjdXJyZW50Vm9sdW1lOworCisgICAgcHVibGljIFBhcmNlbGFibGVWb2x1bWVJbmZvKGludCB2b2x1bWVUeXBlLCBBdWRpb0F0dHJpYnV0ZXMgYXVkaW9BdHRycywgaW50IGNvbnRyb2xUeXBlLAorICAgICAgICAgICAgaW50IG1heFZvbHVtZSwKKyAgICAgICAgICAgIGludCBjdXJyZW50Vm9sdW1lKSB7CisgICAgICAgIHRoaXMudm9sdW1lVHlwZSA9IHZvbHVtZVR5cGU7CisgICAgICAgIHRoaXMuYXVkaW9BdHRycyA9IGF1ZGlvQXR0cnM7CisgICAgICAgIHRoaXMuY29udHJvbFR5cGUgPSBjb250cm9sVHlwZTsKKyAgICAgICAgdGhpcy5tYXhWb2x1bWUgPSBtYXhWb2x1bWU7CisgICAgICAgIHRoaXMuY3VycmVudFZvbHVtZSA9IGN1cnJlbnRWb2x1bWU7CisgICAgfQorCisgICAgcHVibGljIFBhcmNlbGFibGVWb2x1bWVJbmZvKFBhcmNlbCBmcm9tKSB7CisgICAgICAgIHZvbHVtZVR5cGUgPSBmcm9tLnJlYWRJbnQoKTsKKyAgICAgICAgY29udHJvbFR5cGUgPSBmcm9tLnJlYWRJbnQoKTsKKyAgICAgICAgbWF4Vm9sdW1lID0gZnJvbS5yZWFkSW50KCk7CisgICAgICAgIGN1cnJlbnRWb2x1bWUgPSBmcm9tLnJlYWRJbnQoKTsKKyAgICAgICAgYXVkaW9BdHRycyA9IEF1ZGlvQXR0cmlidXRlcy5DUkVBVE9SLmNyZWF0ZUZyb21QYXJjZWwoZnJvbSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBkZXNjcmliZUNvbnRlbnRzKCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB3cml0ZVRvUGFyY2VsKFBhcmNlbCBkZXN0LCBpbnQgZmxhZ3MpIHsKKyAgICAgICAgZGVzdC53cml0ZUludCh2b2x1bWVUeXBlKTsKKyAgICAgICAgZGVzdC53cml0ZUludChjb250cm9sVHlwZSk7CisgICAgICAgIGRlc3Qud3JpdGVJbnQobWF4Vm9sdW1lKTsKKyAgICAgICAgZGVzdC53cml0ZUludChjdXJyZW50Vm9sdW1lKTsKKyAgICAgICAgYXVkaW9BdHRycy53cml0ZVRvUGFyY2VsKGRlc3QsIGZsYWdzKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUGFyY2VsYWJsZS5DcmVhdG9yPFBhcmNlbGFibGVWb2x1bWVJbmZvPiBDUkVBVE9SCisgICAgICAgICAgICA9IG5ldyBQYXJjZWxhYmxlLkNyZWF0b3I8UGFyY2VsYWJsZVZvbHVtZUluZm8+KCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFBhcmNlbGFibGVWb2x1bWVJbmZvIGNyZWF0ZUZyb21QYXJjZWwoUGFyY2VsIGluKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFBhcmNlbGFibGVWb2x1bWVJbmZvKGluKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUGFyY2VsYWJsZVZvbHVtZUluZm9bXSBuZXdBcnJheShpbnQgc2l6ZSkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBQYXJjZWxhYmxlVm9sdW1lSW5mb1tzaXplXTsKKyAgICAgICAgfQorICAgIH07Cit9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvYXBleC9qYXZhL2FuZHJvaWQvbWVkaWEvc2Vzc2lvbi9QbGF5YmFja1N0YXRlLmFpZGwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvYXBleC9qYXZhL2FuZHJvaWQvbWVkaWEvc2Vzc2lvbi9QbGF5YmFja1N0YXRlLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDg3NmViZAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9hcGV4L2phdmEvYW5kcm9pZC9tZWRpYS9zZXNzaW9uL1BsYXliYWNrU3RhdGUuYWlkbApAQCAtMCwwICsxLDE4IEBACisvKiBDb3B5cmlnaHQgMjAxNCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhLnNlc3Npb247CisKK3BhcmNlbGFibGUgUGxheWJhY2tTdGF0ZTsKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9hcGV4L2phdmEvYW5kcm9pZC9tZWRpYS9zZXNzaW9uL1BsYXliYWNrU3RhdGUuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9hcGV4L2phdmEvYW5kcm9pZC9tZWRpYS9zZXNzaW9uL1BsYXliYWNrU3RhdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDRmOWFmCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL2FwZXgvamF2YS9hbmRyb2lkL21lZGlhL3Nlc3Npb24vUGxheWJhY2tTdGF0ZS5qYXZhCkBAIC0wLDAgKzEsMTA4MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGFuZHJvaWQubWVkaWEuc2Vzc2lvbjsKKworaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5EcmF3YWJsZVJlczsKK2ltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uSW50RGVmOworaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5Mb25nRGVmOworaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5OdWxsYWJsZTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLlJlbW90ZUNvbnRyb2xDbGllbnQ7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlOworaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKKworLyoqCisgKiBQbGF5YmFjayBzdGF0ZSBmb3IgYSB7QGxpbmsgTWVkaWFTZXNzaW9ufS4gVGhpcyBpbmNsdWRlcyBhIHN0YXRlIGxpa2UKKyAqIHtAbGluayBQbGF5YmFja1N0YXRlI1NUQVRFX1BMQVlJTkd9LCB0aGUgY3VycmVudCBwbGF5YmFjayBwb3NpdGlvbiwKKyAqIGFuZCB0aGUgY3VycmVudCBjb250cm9sIGNhcGFiaWxpdGllcy4KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFBsYXliYWNrU3RhdGUgaW1wbGVtZW50cyBQYXJjZWxhYmxlIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlBsYXliYWNrU3RhdGUiOworCisgICAgLyoqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBATG9uZ0RlZihmbGFnPXRydWUsIHZhbHVlPXtBQ1RJT05fU1RPUCwgQUNUSU9OX1BBVVNFLCBBQ1RJT05fUExBWSwgQUNUSU9OX1JFV0lORCwKKyAgICAgICAgICAgIEFDVElPTl9TS0lQX1RPX1BSRVZJT1VTLCBBQ1RJT05fU0tJUF9UT19ORVhULCBBQ1RJT05fRkFTVF9GT1JXQVJELCBBQ1RJT05fU0VUX1JBVElORywKKyAgICAgICAgICAgIEFDVElPTl9TRUVLX1RPLCBBQ1RJT05fUExBWV9QQVVTRSwgQUNUSU9OX1BMQVlfRlJPTV9NRURJQV9JRCwgQUNUSU9OX1BMQVlfRlJPTV9TRUFSQ0gsCisgICAgICAgICAgICBBQ1RJT05fU0tJUF9UT19RVUVVRV9JVEVNLCBBQ1RJT05fUExBWV9GUk9NX1VSSSwgQUNUSU9OX1BSRVBBUkUsCisgICAgICAgICAgICBBQ1RJT05fUFJFUEFSRV9GUk9NX01FRElBX0lELCBBQ1RJT05fUFJFUEFSRV9GUk9NX1NFQVJDSCwgQUNUSU9OX1BSRVBBUkVfRlJPTV9VUkl9KQorICAgIEBSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlNPVVJDRSkKKyAgICBwdWJsaWMgQGludGVyZmFjZSBBY3Rpb25zIHt9CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgdGhpcyBzZXNzaW9uIHN1cHBvcnRzIHRoZSBzdG9wIGNvbW1hbmQuCisgICAgICoKKyAgICAgKiBAc2VlIEJ1aWxkZXIjc2V0QWN0aW9ucyhsb25nKQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBBQ1RJT05fU1RPUCA9IDEgPDwgMDsKKworICAgIC8qKgorICAgICAqIEluZGljYXRlcyB0aGlzIHNlc3Npb24gc3VwcG9ydHMgdGhlIHBhdXNlIGNvbW1hbmQuCisgICAgICoKKyAgICAgKiBAc2VlIEJ1aWxkZXIjc2V0QWN0aW9ucyhsb25nKQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBBQ1RJT05fUEFVU0UgPSAxIDw8IDE7CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgdGhpcyBzZXNzaW9uIHN1cHBvcnRzIHRoZSBwbGF5IGNvbW1hbmQuCisgICAgICoKKyAgICAgKiBAc2VlIEJ1aWxkZXIjc2V0QWN0aW9ucyhsb25nKQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBBQ1RJT05fUExBWSA9IDEgPDwgMjsKKworICAgIC8qKgorICAgICAqIEluZGljYXRlcyB0aGlzIHNlc3Npb24gc3VwcG9ydHMgdGhlIHJld2luZCBjb21tYW5kLgorICAgICAqCisgICAgICogQHNlZSBCdWlsZGVyI3NldEFjdGlvbnMobG9uZykKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgQUNUSU9OX1JFV0lORCA9IDEgPDwgMzsKKworICAgIC8qKgorICAgICAqIEluZGljYXRlcyB0aGlzIHNlc3Npb24gc3VwcG9ydHMgdGhlIHByZXZpb3VzIGNvbW1hbmQuCisgICAgICoKKyAgICAgKiBAc2VlIEJ1aWxkZXIjc2V0QWN0aW9ucyhsb25nKQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBBQ1RJT05fU0tJUF9UT19QUkVWSU9VUyA9IDEgPDwgNDsKKworICAgIC8qKgorICAgICAqIEluZGljYXRlcyB0aGlzIHNlc3Npb24gc3VwcG9ydHMgdGhlIG5leHQgY29tbWFuZC4KKyAgICAgKgorICAgICAqIEBzZWUgQnVpbGRlciNzZXRBY3Rpb25zKGxvbmcpCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIEFDVElPTl9TS0lQX1RPX05FWFQgPSAxIDw8IDU7CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgdGhpcyBzZXNzaW9uIHN1cHBvcnRzIHRoZSBmYXN0IGZvcndhcmQgY29tbWFuZC4KKyAgICAgKgorICAgICAqIEBzZWUgQnVpbGRlciNzZXRBY3Rpb25zKGxvbmcpCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIEFDVElPTl9GQVNUX0ZPUldBUkQgPSAxIDw8IDY7CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgdGhpcyBzZXNzaW9uIHN1cHBvcnRzIHRoZSBzZXQgcmF0aW5nIGNvbW1hbmQuCisgICAgICoKKyAgICAgKiBAc2VlIEJ1aWxkZXIjc2V0QWN0aW9ucyhsb25nKQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBBQ1RJT05fU0VUX1JBVElORyA9IDEgPDwgNzsKKworICAgIC8qKgorICAgICAqIEluZGljYXRlcyB0aGlzIHNlc3Npb24gc3VwcG9ydHMgdGhlIHNlZWsgdG8gY29tbWFuZC4KKyAgICAgKgorICAgICAqIEBzZWUgQnVpbGRlciNzZXRBY3Rpb25zKGxvbmcpCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIEFDVElPTl9TRUVLX1RPID0gMSA8PCA4OworCisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIHRoaXMgc2Vzc2lvbiBzdXBwb3J0cyB0aGUgcGxheS9wYXVzZSB0b2dnbGUgY29tbWFuZC4KKyAgICAgKgorICAgICAqIEBzZWUgQnVpbGRlciNzZXRBY3Rpb25zKGxvbmcpCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIEFDVElPTl9QTEFZX1BBVVNFID0gMSA8PCA5OworCisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIHRoaXMgc2Vzc2lvbiBzdXBwb3J0cyB0aGUgcGxheSBmcm9tIG1lZGlhIGlkIGNvbW1hbmQuCisgICAgICoKKyAgICAgKiBAc2VlIEJ1aWxkZXIjc2V0QWN0aW9ucyhsb25nKQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBBQ1RJT05fUExBWV9GUk9NX01FRElBX0lEID0gMSA8PCAxMDsKKworICAgIC8qKgorICAgICAqIEluZGljYXRlcyB0aGlzIHNlc3Npb24gc3VwcG9ydHMgdGhlIHBsYXkgZnJvbSBzZWFyY2ggY29tbWFuZC4KKyAgICAgKgorICAgICAqIEBzZWUgQnVpbGRlciNzZXRBY3Rpb25zKGxvbmcpCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIEFDVElPTl9QTEFZX0ZST01fU0VBUkNIID0gMSA8PCAxMTsKKworICAgIC8qKgorICAgICAqIEluZGljYXRlcyB0aGlzIHNlc3Npb24gc3VwcG9ydHMgdGhlIHNraXAgdG8gcXVldWUgaXRlbSBjb21tYW5kLgorICAgICAqCisgICAgICogQHNlZSBCdWlsZGVyI3NldEFjdGlvbnMobG9uZykKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgQUNUSU9OX1NLSVBfVE9fUVVFVUVfSVRFTSA9IDEgPDwgMTI7CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgdGhpcyBzZXNzaW9uIHN1cHBvcnRzIHRoZSBwbGF5IGZyb20gVVJJIGNvbW1hbmQuCisgICAgICoKKyAgICAgKiBAc2VlIEJ1aWxkZXIjc2V0QWN0aW9ucyhsb25nKQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBBQ1RJT05fUExBWV9GUk9NX1VSSSA9IDEgPDwgMTM7CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgdGhpcyBzZXNzaW9uIHN1cHBvcnRzIHRoZSBwcmVwYXJlIGNvbW1hbmQuCisgICAgICoKKyAgICAgKiBAc2VlIEJ1aWxkZXIjc2V0QWN0aW9ucyhsb25nKQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBBQ1RJT05fUFJFUEFSRSA9IDEgPDwgMTQ7CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgdGhpcyBzZXNzaW9uIHN1cHBvcnRzIHRoZSBwcmVwYXJlIGZyb20gbWVkaWEgaWQgY29tbWFuZC4KKyAgICAgKgorICAgICAqIEBzZWUgQnVpbGRlciNzZXRBY3Rpb25zKGxvbmcpCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIEFDVElPTl9QUkVQQVJFX0ZST01fTUVESUFfSUQgPSAxIDw8IDE1OworCisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIHRoaXMgc2Vzc2lvbiBzdXBwb3J0cyB0aGUgcHJlcGFyZSBmcm9tIHNlYXJjaCBjb21tYW5kLgorICAgICAqCisgICAgICogQHNlZSBCdWlsZGVyI3NldEFjdGlvbnMobG9uZykKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgQUNUSU9OX1BSRVBBUkVfRlJPTV9TRUFSQ0ggPSAxIDw8IDE2OworCisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIHRoaXMgc2Vzc2lvbiBzdXBwb3J0cyB0aGUgcHJlcGFyZSBmcm9tIFVSSSBjb21tYW5kLgorICAgICAqCisgICAgICogQHNlZSBCdWlsZGVyI3NldEFjdGlvbnMobG9uZykKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgQUNUSU9OX1BSRVBBUkVfRlJPTV9VUkkgPSAxIDw8IDE3OworCisgICAgLyoqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBASW50RGVmKHtTVEFURV9OT05FLCBTVEFURV9TVE9QUEVELCBTVEFURV9QQVVTRUQsIFNUQVRFX1BMQVlJTkcsIFNUQVRFX0ZBU1RfRk9SV0FSRElORywKKyAgICAgICAgICAgIFNUQVRFX1JFV0lORElORywgU1RBVEVfQlVGRkVSSU5HLCBTVEFURV9FUlJPUiwgU1RBVEVfQ09OTkVDVElORywKKyAgICAgICAgICAgIFNUQVRFX1NLSVBQSU5HX1RPX1BSRVZJT1VTLCBTVEFURV9TS0lQUElOR19UT19ORVhULCBTVEFURV9TS0lQUElOR19UT19RVUVVRV9JVEVNfSkKKyAgICBAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5TT1VSQ0UpCisgICAgcHVibGljIEBpbnRlcmZhY2UgU3RhdGUge30KKworICAgIC8qKgorICAgICAqIFRoaXMgaXMgdGhlIGRlZmF1bHQgcGxheWJhY2sgc3RhdGUgYW5kIGluZGljYXRlcyB0aGF0IG5vIG1lZGlhIGhhcyBiZWVuCisgICAgICogYWRkZWQgeWV0LCBvciB0aGUgcGVyZm9ybWVyIGhhcyBiZWVuIHJlc2V0IGFuZCBoYXMgbm8gY29udGVudCB0byBwbGF5LgorICAgICAqCisgICAgICogQHNlZSBCdWlsZGVyI3NldFN0YXRlKGludCwgbG9uZywgZmxvYXQpCisgICAgICogQHNlZSBCdWlsZGVyI3NldFN0YXRlKGludCwgbG9uZywgZmxvYXQsIGxvbmcpCisgICAgICovCisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgU1RBVEVfTk9ORSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBTdGF0ZSBpbmRpY2F0aW5nIHRoaXMgaXRlbSBpcyBjdXJyZW50bHkgc3RvcHBlZC4KKyAgICAgKgorICAgICAqIEBzZWUgQnVpbGRlciNzZXRTdGF0ZQorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFNUQVRFX1NUT1BQRUQgPSAxOworCisgICAgLyoqCisgICAgICogU3RhdGUgaW5kaWNhdGluZyB0aGlzIGl0ZW0gaXMgY3VycmVudGx5IHBhdXNlZC4KKyAgICAgKgorICAgICAqIEBzZWUgQnVpbGRlciNzZXRTdGF0ZQorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFNUQVRFX1BBVVNFRCA9IDI7CisKKyAgICAvKioKKyAgICAgKiBTdGF0ZSBpbmRpY2F0aW5nIHRoaXMgaXRlbSBpcyBjdXJyZW50bHkgcGxheWluZy4KKyAgICAgKgorICAgICAqIEBzZWUgQnVpbGRlciNzZXRTdGF0ZQorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFNUQVRFX1BMQVlJTkcgPSAzOworCisgICAgLyoqCisgICAgICogU3RhdGUgaW5kaWNhdGluZyB0aGlzIGl0ZW0gaXMgY3VycmVudGx5IGZhc3QgZm9yd2FyZGluZy4KKyAgICAgKgorICAgICAqIEBzZWUgQnVpbGRlciNzZXRTdGF0ZQorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFNUQVRFX0ZBU1RfRk9SV0FSRElORyA9IDQ7CisKKyAgICAvKioKKyAgICAgKiBTdGF0ZSBpbmRpY2F0aW5nIHRoaXMgaXRlbSBpcyBjdXJyZW50bHkgcmV3aW5kaW5nLgorICAgICAqCisgICAgICogQHNlZSBCdWlsZGVyI3NldFN0YXRlCisgICAgICovCisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgU1RBVEVfUkVXSU5ESU5HID0gNTsKKworICAgIC8qKgorICAgICAqIFN0YXRlIGluZGljYXRpbmcgdGhpcyBpdGVtIGlzIGN1cnJlbnRseSBidWZmZXJpbmcgYW5kIHdpbGwgYmVnaW4gcGxheWluZworICAgICAqIHdoZW4gZW5vdWdoIGRhdGEgaGFzIGJ1ZmZlcmVkLgorICAgICAqCisgICAgICogQHNlZSBCdWlsZGVyI3NldFN0YXRlCisgICAgICovCisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgU1RBVEVfQlVGRkVSSU5HID0gNjsKKworICAgIC8qKgorICAgICAqIFN0YXRlIGluZGljYXRpbmcgdGhpcyBpdGVtIGlzIGN1cnJlbnRseSBpbiBhbiBlcnJvciBzdGF0ZS4gVGhlIGVycm9yCisgICAgICogbWVzc2FnZSBzaG91bGQgYWxzbyBiZSBzZXQgd2hlbiBlbnRlcmluZyB0aGlzIHN0YXRlLgorICAgICAqCisgICAgICogQHNlZSBCdWlsZGVyI3NldFN0YXRlCisgICAgICovCisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgU1RBVEVfRVJST1IgPSA3OworCisgICAgLyoqCisgICAgICogU3RhdGUgaW5kaWNhdGluZyB0aGUgY2xhc3MgZG9pbmcgcGxheWJhY2sgaXMgY3VycmVudGx5IGNvbm5lY3RpbmcgdG8gYQorICAgICAqIG5ldyBkZXN0aW5hdGlvbi4gIERlcGVuZGluZyBvbiB0aGUgaW1wbGVtZW50YXRpb24geW91IG1heSByZXR1cm4gdG8gdGhlIHByZXZpb3VzCisgICAgICogc3RhdGUgd2hlbiB0aGUgY29ubmVjdGlvbiBmaW5pc2hlcyBvciBlbnRlciB7QGxpbmsgI1NUQVRFX05PTkV9LgorICAgICAqIElmIHRoZSBjb25uZWN0aW9uIGZhaWxlZCB7QGxpbmsgI1NUQVRFX0VSUk9SfSBzaG91bGQgYmUgdXNlZC4KKyAgICAgKgorICAgICAqIEBzZWUgQnVpbGRlciNzZXRTdGF0ZQorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFNUQVRFX0NPTk5FQ1RJTkcgPSA4OworCisgICAgLyoqCisgICAgICogU3RhdGUgaW5kaWNhdGluZyB0aGUgcGxheWVyIGlzIGN1cnJlbnRseSBza2lwcGluZyB0byB0aGUgcHJldmlvdXMgaXRlbS4KKyAgICAgKgorICAgICAqIEBzZWUgQnVpbGRlciNzZXRTdGF0ZQorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFNUQVRFX1NLSVBQSU5HX1RPX1BSRVZJT1VTID0gOTsKKworICAgIC8qKgorICAgICAqIFN0YXRlIGluZGljYXRpbmcgdGhlIHBsYXllciBpcyBjdXJyZW50bHkgc2tpcHBpbmcgdG8gdGhlIG5leHQgaXRlbS4KKyAgICAgKgorICAgICAqIEBzZWUgQnVpbGRlciNzZXRTdGF0ZQorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFNUQVRFX1NLSVBQSU5HX1RPX05FWFQgPSAxMDsKKworICAgIC8qKgorICAgICAqIFN0YXRlIGluZGljYXRpbmcgdGhlIHBsYXllciBpcyBjdXJyZW50bHkgc2tpcHBpbmcgdG8gYSBzcGVjaWZpYyBpdGVtIGluCisgICAgICogdGhlIHF1ZXVlLgorICAgICAqCisgICAgICogQHNlZSBCdWlsZGVyI3NldFN0YXRlCisgICAgICovCisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgU1RBVEVfU0tJUFBJTkdfVE9fUVVFVUVfSVRFTSA9IDExOworCisgICAgLyoqCisgICAgICogVXNlIHRoaXMgdmFsdWUgZm9yIHRoZSBwb3NpdGlvbiB0byBpbmRpY2F0ZSB0aGUgcG9zaXRpb24gaXMgbm90IGtub3duLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgbG9uZyBQTEFZQkFDS19QT1NJVElPTl9VTktOT1dOID0gLTE7CisKKyAgICBwcml2YXRlIGZpbmFsIGludCBtU3RhdGU7CisgICAgcHJpdmF0ZSBmaW5hbCBsb25nIG1Qb3NpdGlvbjsKKyAgICBwcml2YXRlIGZpbmFsIGxvbmcgbUJ1ZmZlcmVkUG9zaXRpb247CisgICAgcHJpdmF0ZSBmaW5hbCBmbG9hdCBtU3BlZWQ7CisgICAgcHJpdmF0ZSBmaW5hbCBsb25nIG1BY3Rpb25zOworICAgIHByaXZhdGUgTGlzdDxQbGF5YmFja1N0YXRlLkN1c3RvbUFjdGlvbj4gbUN1c3RvbUFjdGlvbnM7CisgICAgcHJpdmF0ZSBmaW5hbCBDaGFyU2VxdWVuY2UgbUVycm9yTWVzc2FnZTsKKyAgICBwcml2YXRlIGZpbmFsIGxvbmcgbVVwZGF0ZVRpbWU7CisgICAgcHJpdmF0ZSBmaW5hbCBsb25nIG1BY3RpdmVJdGVtSWQ7CisgICAgcHJpdmF0ZSBmaW5hbCBCdW5kbGUgbUV4dHJhczsKKworICAgIHByaXZhdGUgUGxheWJhY2tTdGF0ZShpbnQgc3RhdGUsIGxvbmcgcG9zaXRpb24sIGxvbmcgdXBkYXRlVGltZSwgZmxvYXQgc3BlZWQsCisgICAgICAgICAgICBsb25nIGJ1ZmZlcmVkUG9zaXRpb24sIGxvbmcgdHJhbnNwb3J0Q29udHJvbHMsCisgICAgICAgICAgICBMaXN0PFBsYXliYWNrU3RhdGUuQ3VzdG9tQWN0aW9uPiBjdXN0b21BY3Rpb25zLCBsb25nIGFjdGl2ZUl0ZW1JZCwKKyAgICAgICAgICAgIENoYXJTZXF1ZW5jZSBlcnJvciwgQnVuZGxlIGV4dHJhcykgeworICAgICAgICBtU3RhdGUgPSBzdGF0ZTsKKyAgICAgICAgbVBvc2l0aW9uID0gcG9zaXRpb247CisgICAgICAgIG1TcGVlZCA9IHNwZWVkOworICAgICAgICBtVXBkYXRlVGltZSA9IHVwZGF0ZVRpbWU7CisgICAgICAgIG1CdWZmZXJlZFBvc2l0aW9uID0gYnVmZmVyZWRQb3NpdGlvbjsKKyAgICAgICAgbUFjdGlvbnMgPSB0cmFuc3BvcnRDb250cm9sczsKKyAgICAgICAgbUN1c3RvbUFjdGlvbnMgPSBuZXcgQXJyYXlMaXN0PD4oY3VzdG9tQWN0aW9ucyk7CisgICAgICAgIG1BY3RpdmVJdGVtSWQgPSBhY3RpdmVJdGVtSWQ7CisgICAgICAgIG1FcnJvck1lc3NhZ2UgPSBlcnJvcjsKKyAgICAgICAgbUV4dHJhcyA9IGV4dHJhczsKKyAgICB9CisKKyAgICBwcml2YXRlIFBsYXliYWNrU3RhdGUoUGFyY2VsIGluKSB7CisgICAgICAgIG1TdGF0ZSA9IGluLnJlYWRJbnQoKTsKKyAgICAgICAgbVBvc2l0aW9uID0gaW4ucmVhZExvbmcoKTsKKyAgICAgICAgbVNwZWVkID0gaW4ucmVhZEZsb2F0KCk7CisgICAgICAgIG1VcGRhdGVUaW1lID0gaW4ucmVhZExvbmcoKTsKKyAgICAgICAgbUJ1ZmZlcmVkUG9zaXRpb24gPSBpbi5yZWFkTG9uZygpOworICAgICAgICBtQWN0aW9ucyA9IGluLnJlYWRMb25nKCk7CisgICAgICAgIG1DdXN0b21BY3Rpb25zID0gaW4uY3JlYXRlVHlwZWRBcnJheUxpc3QoQ3VzdG9tQWN0aW9uLkNSRUFUT1IpOworICAgICAgICBtQWN0aXZlSXRlbUlkID0gaW4ucmVhZExvbmcoKTsKKyAgICAgICAgbUVycm9yTWVzc2FnZSA9IFRleHRVdGlscy5DSEFSX1NFUVVFTkNFX0NSRUFUT1IuY3JlYXRlRnJvbVBhcmNlbChpbik7CisgICAgICAgIG1FeHRyYXMgPSBpbi5yZWFkQnVuZGxlKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBib2IgPSBuZXcgU3RyaW5nQnVpbGRlcigiUGxheWJhY2tTdGF0ZSB7Iik7CisgICAgICAgIGJvYi5hcHBlbmQoInN0YXRlPSIpLmFwcGVuZChtU3RhdGUpOworICAgICAgICBib2IuYXBwZW5kKCIsIHBvc2l0aW9uPSIpLmFwcGVuZChtUG9zaXRpb24pOworICAgICAgICBib2IuYXBwZW5kKCIsIGJ1ZmZlcmVkIHBvc2l0aW9uPSIpLmFwcGVuZChtQnVmZmVyZWRQb3NpdGlvbik7CisgICAgICAgIGJvYi5hcHBlbmQoIiwgc3BlZWQ9IikuYXBwZW5kKG1TcGVlZCk7CisgICAgICAgIGJvYi5hcHBlbmQoIiwgdXBkYXRlZD0iKS5hcHBlbmQobVVwZGF0ZVRpbWUpOworICAgICAgICBib2IuYXBwZW5kKCIsIGFjdGlvbnM9IikuYXBwZW5kKG1BY3Rpb25zKTsKKyAgICAgICAgYm9iLmFwcGVuZCgiLCBjdXN0b20gYWN0aW9ucz0iKS5hcHBlbmQobUN1c3RvbUFjdGlvbnMpOworICAgICAgICBib2IuYXBwZW5kKCIsIGFjdGl2ZSBpdGVtIGlkPSIpLmFwcGVuZChtQWN0aXZlSXRlbUlkKTsKKyAgICAgICAgYm9iLmFwcGVuZCgiLCBlcnJvcj0iKS5hcHBlbmQobUVycm9yTWVzc2FnZSk7CisgICAgICAgIGJvYi5hcHBlbmQoIn0iKTsKKyAgICAgICAgcmV0dXJuIGJvYi50b1N0cmluZygpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZGVzY3JpYmVDb250ZW50cygpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgd3JpdGVUb1BhcmNlbChQYXJjZWwgZGVzdCwgaW50IGZsYWdzKSB7CisgICAgICAgIGRlc3Qud3JpdGVJbnQobVN0YXRlKTsKKyAgICAgICAgZGVzdC53cml0ZUxvbmcobVBvc2l0aW9uKTsKKyAgICAgICAgZGVzdC53cml0ZUZsb2F0KG1TcGVlZCk7CisgICAgICAgIGRlc3Qud3JpdGVMb25nKG1VcGRhdGVUaW1lKTsKKyAgICAgICAgZGVzdC53cml0ZUxvbmcobUJ1ZmZlcmVkUG9zaXRpb24pOworICAgICAgICBkZXN0LndyaXRlTG9uZyhtQWN0aW9ucyk7CisgICAgICAgIGRlc3Qud3JpdGVUeXBlZExpc3QobUN1c3RvbUFjdGlvbnMpOworICAgICAgICBkZXN0LndyaXRlTG9uZyhtQWN0aXZlSXRlbUlkKTsKKyAgICAgICAgVGV4dFV0aWxzLndyaXRlVG9QYXJjZWwobUVycm9yTWVzc2FnZSwgZGVzdCwgMCk7CisgICAgICAgIGRlc3Qud3JpdGVCdW5kbGUobUV4dHJhcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBjdXJyZW50IHN0YXRlIG9mIHBsYXliYWNrLiBPbmUgb2YgdGhlIGZvbGxvd2luZzoKKyAgICAgKiA8dWw+CisgICAgICogPGxpPiB7QGxpbmsgUGxheWJhY2tTdGF0ZSNTVEFURV9OT05FfTwvbGk+CisgICAgICogPGxpPiB7QGxpbmsgUGxheWJhY2tTdGF0ZSNTVEFURV9TVE9QUEVEfTwvbGk+CisgICAgICogPGxpPiB7QGxpbmsgUGxheWJhY2tTdGF0ZSNTVEFURV9QTEFZSU5HfTwvbGk+CisgICAgICogPGxpPiB7QGxpbmsgUGxheWJhY2tTdGF0ZSNTVEFURV9QQVVTRUR9PC9saT4KKyAgICAgKiA8bGk+IHtAbGluayBQbGF5YmFja1N0YXRlI1NUQVRFX0ZBU1RfRk9SV0FSRElOR308L2xpPgorICAgICAqIDxsaT4ge0BsaW5rIFBsYXliYWNrU3RhdGUjU1RBVEVfUkVXSU5ESU5HfTwvbGk+CisgICAgICogPGxpPiB7QGxpbmsgUGxheWJhY2tTdGF0ZSNTVEFURV9CVUZGRVJJTkd9PC9saT4KKyAgICAgKiA8bGk+IHtAbGluayBQbGF5YmFja1N0YXRlI1NUQVRFX0VSUk9SfTwvbGk+CisgICAgICogPGxpPiB7QGxpbmsgUGxheWJhY2tTdGF0ZSNTVEFURV9DT05ORUNUSU5HfTwvbGk+CisgICAgICogPGxpPiB7QGxpbmsgUGxheWJhY2tTdGF0ZSNTVEFURV9TS0lQUElOR19UT19QUkVWSU9VU308L2xpPgorICAgICAqIDxsaT4ge0BsaW5rIFBsYXliYWNrU3RhdGUjU1RBVEVfU0tJUFBJTkdfVE9fTkVYVH08L2xpPgorICAgICAqIDxsaT4ge0BsaW5rIFBsYXliYWNrU3RhdGUjU1RBVEVfU0tJUFBJTkdfVE9fUVVFVUVfSVRFTX08L2xpPgorICAgICAqIDwvdWw+CisgICAgICovCisgICAgQFN0YXRlCisgICAgcHVibGljIGludCBnZXRTdGF0ZSgpIHsKKyAgICAgICAgcmV0dXJuIG1TdGF0ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGN1cnJlbnQgcGxheWJhY2sgcG9zaXRpb24gaW4gbXMuCisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0UG9zaXRpb24oKSB7CisgICAgICAgIHJldHVybiBtUG9zaXRpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBjdXJyZW50IGJ1ZmZlcmVkIHBvc2l0aW9uIGluIG1zLiBUaGlzIGlzIHRoZSBmYXJ0aGVzdCBwbGF5YmFjaworICAgICAqIHBvaW50IHRoYXQgY2FuIGJlIHJlYWNoZWQgZnJvbSB0aGUgY3VycmVudCBwb3NpdGlvbiB1c2luZyBvbmx5IGJ1ZmZlcmVkCisgICAgICogY29udGVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRCdWZmZXJlZFBvc2l0aW9uKCkgeworICAgICAgICByZXR1cm4gbUJ1ZmZlcmVkUG9zaXRpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBjdXJyZW50IHBsYXliYWNrIHNwZWVkIGFzIGEgbXVsdGlwbGUgb2Ygbm9ybWFsIHBsYXliYWNrLiBUaGlzCisgICAgICogc2hvdWxkIGJlIG5lZ2F0aXZlIHdoZW4gcmV3aW5kaW5nLiBBIHZhbHVlIG9mIDEgbWVhbnMgbm9ybWFsIHBsYXliYWNrIGFuZAorICAgICAqIDAgbWVhbnMgcGF1c2VkLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgY3VycmVudCBzcGVlZCBvZiBwbGF5YmFjay4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmxvYXQgZ2V0UGxheWJhY2tTcGVlZCgpIHsKKyAgICAgICAgcmV0dXJuIG1TcGVlZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGN1cnJlbnQgYWN0aW9ucyBhdmFpbGFibGUgb24gdGhpcyBzZXNzaW9uLiBUaGlzIHNob3VsZCB1c2UgYQorICAgICAqIGJpdG1hc2sgb2YgdGhlIGF2YWlsYWJsZSBhY3Rpb25zLgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+IHtAbGluayBQbGF5YmFja1N0YXRlI0FDVElPTl9TS0lQX1RPX1BSRVZJT1VTfTwvbGk+CisgICAgICogPGxpPiB7QGxpbmsgUGxheWJhY2tTdGF0ZSNBQ1RJT05fUkVXSU5EfTwvbGk+CisgICAgICogPGxpPiB7QGxpbmsgUGxheWJhY2tTdGF0ZSNBQ1RJT05fUExBWX08L2xpPgorICAgICAqIDxsaT4ge0BsaW5rIFBsYXliYWNrU3RhdGUjQUNUSU9OX1BBVVNFfTwvbGk+CisgICAgICogPGxpPiB7QGxpbmsgUGxheWJhY2tTdGF0ZSNBQ1RJT05fU1RPUH08L2xpPgorICAgICAqIDxsaT4ge0BsaW5rIFBsYXliYWNrU3RhdGUjQUNUSU9OX0ZBU1RfRk9SV0FSRH08L2xpPgorICAgICAqIDxsaT4ge0BsaW5rIFBsYXliYWNrU3RhdGUjQUNUSU9OX1NLSVBfVE9fTkVYVH08L2xpPgorICAgICAqIDxsaT4ge0BsaW5rIFBsYXliYWNrU3RhdGUjQUNUSU9OX1NFRUtfVE99PC9saT4KKyAgICAgKiA8bGk+IHtAbGluayBQbGF5YmFja1N0YXRlI0FDVElPTl9TRVRfUkFUSU5HfTwvbGk+CisgICAgICogPGxpPiB7QGxpbmsgUGxheWJhY2tTdGF0ZSNBQ1RJT05fUExBWV9QQVVTRX08L2xpPgorICAgICAqIDxsaT4ge0BsaW5rIFBsYXliYWNrU3RhdGUjQUNUSU9OX1BMQVlfRlJPTV9NRURJQV9JRH08L2xpPgorICAgICAqIDxsaT4ge0BsaW5rIFBsYXliYWNrU3RhdGUjQUNUSU9OX1BMQVlfRlJPTV9TRUFSQ0h9PC9saT4KKyAgICAgKiA8bGk+IHtAbGluayBQbGF5YmFja1N0YXRlI0FDVElPTl9TS0lQX1RPX1FVRVVFX0lURU19PC9saT4KKyAgICAgKiA8bGk+IHtAbGluayBQbGF5YmFja1N0YXRlI0FDVElPTl9QTEFZX0ZST01fVVJJfTwvbGk+CisgICAgICogPGxpPiB7QGxpbmsgUGxheWJhY2tTdGF0ZSNBQ1RJT05fUFJFUEFSRX08L2xpPgorICAgICAqIDxsaT4ge0BsaW5rIFBsYXliYWNrU3RhdGUjQUNUSU9OX1BSRVBBUkVfRlJPTV9NRURJQV9JRH08L2xpPgorICAgICAqIDxsaT4ge0BsaW5rIFBsYXliYWNrU3RhdGUjQUNUSU9OX1BSRVBBUkVfRlJPTV9TRUFSQ0h9PC9saT4KKyAgICAgKiA8bGk+IHtAbGluayBQbGF5YmFja1N0YXRlI0FDVElPTl9QUkVQQVJFX0ZST01fVVJJfTwvbGk+CisgICAgICogPC91bD4KKyAgICAgKi8KKyAgICBAQWN0aW9ucworICAgIHB1YmxpYyBsb25nIGdldEFjdGlvbnMoKSB7CisgICAgICAgIHJldHVybiBtQWN0aW9uczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGxpc3Qgb2YgY3VzdG9tIGFjdGlvbnMuCisgICAgICovCisgICAgcHVibGljIExpc3Q8UGxheWJhY2tTdGF0ZS5DdXN0b21BY3Rpb24+IGdldEN1c3RvbUFjdGlvbnMoKSB7CisgICAgICAgIHJldHVybiBtQ3VzdG9tQWN0aW9uczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgYSB1c2VyIHJlYWRhYmxlIGVycm9yIG1lc3NhZ2UuIFRoaXMgc2hvdWxkIGJlIHNldCB3aGVuIHRoZSBzdGF0ZSBpcworICAgICAqIHtAbGluayBQbGF5YmFja1N0YXRlI1NUQVRFX0VSUk9SfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2hhclNlcXVlbmNlIGdldEVycm9yTWVzc2FnZSgpIHsKKyAgICAgICAgcmV0dXJuIG1FcnJvck1lc3NhZ2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBlbGFwc2VkIHJlYWwgdGltZSBhdCB3aGljaCBwb3NpdGlvbiB3YXMgbGFzdCB1cGRhdGVkLiBJZiB0aGUKKyAgICAgKiBwb3NpdGlvbiBoYXMgbmV2ZXIgYmVlbiBzZXQgdGhpcyB3aWxsIHJldHVybiAwOworICAgICAqCisgICAgICogQHJldHVybiBUaGUgbGFzdCB0aW1lIHRoZSBwb3NpdGlvbiB3YXMgdXBkYXRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRMYXN0UG9zaXRpb25VcGRhdGVUaW1lKCkgeworICAgICAgICByZXR1cm4gbVVwZGF0ZVRpbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBpZCBvZiB0aGUgY3VycmVudGx5IGFjdGl2ZSBpdGVtIGluIHRoZSBxdWV1ZS4gSWYgdGhlcmUgaXMgbm8KKyAgICAgKiBxdWV1ZSBvciBhIHF1ZXVlIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHNlc3Npb24gdGhpcyB3aWxsIGJlCisgICAgICoge0BsaW5rIE1lZGlhU2Vzc2lvbi5RdWV1ZUl0ZW0jVU5LTk9XTl9JRH0uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBpZCBvZiB0aGUgY3VycmVudGx5IGFjdGl2ZSBpdGVtIGluIHRoZSBxdWV1ZSBvcgorICAgICAqICAgICAgICAge0BsaW5rIE1lZGlhU2Vzc2lvbi5RdWV1ZUl0ZW0jVU5LTk9XTl9JRH0uCisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0QWN0aXZlUXVldWVJdGVtSWQoKSB7CisgICAgICAgIHJldHVybiBtQWN0aXZlSXRlbUlkOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBhbnkgY3VzdG9tIGV4dHJhcyB0aGF0IHdlcmUgc2V0IG9uIHRoaXMgcGxheWJhY2sgc3RhdGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBleHRyYXMgZm9yIHRoaXMgc3RhdGUgb3IgbnVsbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQE51bGxhYmxlIEJ1bmRsZSBnZXRFeHRyYXMoKSB7CisgICAgICAgIHJldHVybiBtRXh0cmFzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUge0BsaW5rIFBsYXliYWNrU3RhdGV9IHN0YXRlIGZvciB0aGUgZ2l2ZW4KKyAgICAgKiB7QGxpbmsgUmVtb3RlQ29udHJvbENsaWVudH0gc3RhdGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmNjU3RhdGUgVGhlIHN0YXRlIHVzZWQgYnkge0BsaW5rIFJlbW90ZUNvbnRyb2xDbGllbnR9LgorICAgICAqIEByZXR1cm4gVGhlIGVxdWl2YWxlbnQgc3RhdGUgdXNlZCBieSB7QGxpbmsgUGxheWJhY2tTdGF0ZX0uCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGludCBnZXRTdGF0ZUZyb21SY2NTdGF0ZShpbnQgcmNjU3RhdGUpIHsKKyAgICAgICAgc3dpdGNoIChyY2NTdGF0ZSkgeworICAgICAgICAgICAgY2FzZSBSZW1vdGVDb250cm9sQ2xpZW50LlBMQVlTVEFURV9CVUZGRVJJTkc6CisgICAgICAgICAgICAgICAgcmV0dXJuIFNUQVRFX0JVRkZFUklORzsKKyAgICAgICAgICAgIGNhc2UgUmVtb3RlQ29udHJvbENsaWVudC5QTEFZU1RBVEVfRVJST1I6CisgICAgICAgICAgICAgICAgcmV0dXJuIFNUQVRFX0VSUk9SOworICAgICAgICAgICAgY2FzZSBSZW1vdGVDb250cm9sQ2xpZW50LlBMQVlTVEFURV9GQVNUX0ZPUldBUkRJTkc6CisgICAgICAgICAgICAgICAgcmV0dXJuIFNUQVRFX0ZBU1RfRk9SV0FSRElORzsKKyAgICAgICAgICAgIC8vUmVtb3RlQ29udHJvbENsaWVudC5QTEFZU1RBVEVfTk9ORSBpcyBoaWRkZW4KKyAgICAgICAgICAgIGNhc2UgMDogIC8vUmVtb3RlQ29udHJvbENsaWVudC5QTEFZU1RBVEVfTk9ORToKKyAgICAgICAgICAgICAgICByZXR1cm4gU1RBVEVfTk9ORTsKKyAgICAgICAgICAgIGNhc2UgUmVtb3RlQ29udHJvbENsaWVudC5QTEFZU1RBVEVfUEFVU0VEOgorICAgICAgICAgICAgICAgIHJldHVybiBTVEFURV9QQVVTRUQ7CisgICAgICAgICAgICBjYXNlIFJlbW90ZUNvbnRyb2xDbGllbnQuUExBWVNUQVRFX1BMQVlJTkc6CisgICAgICAgICAgICAgICAgcmV0dXJuIFNUQVRFX1BMQVlJTkc7CisgICAgICAgICAgICBjYXNlIFJlbW90ZUNvbnRyb2xDbGllbnQuUExBWVNUQVRFX1JFV0lORElORzoKKyAgICAgICAgICAgICAgICByZXR1cm4gU1RBVEVfUkVXSU5ESU5HOworICAgICAgICAgICAgY2FzZSBSZW1vdGVDb250cm9sQ2xpZW50LlBMQVlTVEFURV9TS0lQUElOR19CQUNLV0FSRFM6CisgICAgICAgICAgICAgICAgcmV0dXJuIFNUQVRFX1NLSVBQSU5HX1RPX1BSRVZJT1VTOworICAgICAgICAgICAgY2FzZSBSZW1vdGVDb250cm9sQ2xpZW50LlBMQVlTVEFURV9TS0lQUElOR19GT1JXQVJEUzoKKyAgICAgICAgICAgICAgICByZXR1cm4gU1RBVEVfU0tJUFBJTkdfVE9fTkVYVDsKKyAgICAgICAgICAgIGNhc2UgUmVtb3RlQ29udHJvbENsaWVudC5QTEFZU1RBVEVfU1RPUFBFRDoKKyAgICAgICAgICAgICAgICByZXR1cm4gU1RBVEVfU1RPUFBFRDsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSB7QGxpbmsgUmVtb3RlQ29udHJvbENsaWVudH0gc3RhdGUgZm9yIHRoZSBnaXZlbgorICAgICAqIHtAbGluayBQbGF5YmFja1N0YXRlfSBzdGF0ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdGF0ZSBUaGUgc3RhdGUgdXNlZCBieSB7QGxpbmsgUGxheWJhY2tTdGF0ZX0uCisgICAgICogQHJldHVybiBUaGUgZXF1aXZhbGVudCBzdGF0ZSB1c2VkIGJ5IHtAbGluayBSZW1vdGVDb250cm9sQ2xpZW50fS4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldFJjY1N0YXRlRnJvbVN0YXRlKGludCBzdGF0ZSkgeworICAgICAgICBzd2l0Y2ggKHN0YXRlKSB7CisgICAgICAgICAgICBjYXNlIFNUQVRFX0JVRkZFUklORzoKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVtb3RlQ29udHJvbENsaWVudC5QTEFZU1RBVEVfQlVGRkVSSU5HOworICAgICAgICAgICAgY2FzZSBTVEFURV9FUlJPUjoKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVtb3RlQ29udHJvbENsaWVudC5QTEFZU1RBVEVfRVJST1I7CisgICAgICAgICAgICBjYXNlIFNUQVRFX0ZBU1RfRk9SV0FSRElORzoKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVtb3RlQ29udHJvbENsaWVudC5QTEFZU1RBVEVfRkFTVF9GT1JXQVJESU5HOworICAgICAgICAgICAgY2FzZSBTVEFURV9OT05FOgorICAgICAgICAgICAgICAgIC8vUmVtb3RlQ29udHJvbENsaWVudC5QTEFZU1RBVEVfTk9ORSBpcyBoaWRkZW4KKyAgICAgICAgICAgICAgICByZXR1cm4gMDsgIC8vUmVtb3RlQ29udHJvbENsaWVudC5QTEFZU1RBVEVfTk9ORTsKKyAgICAgICAgICAgIGNhc2UgU1RBVEVfUEFVU0VEOgorICAgICAgICAgICAgICAgIHJldHVybiBSZW1vdGVDb250cm9sQ2xpZW50LlBMQVlTVEFURV9QQVVTRUQ7CisgICAgICAgICAgICBjYXNlIFNUQVRFX1BMQVlJTkc6CisgICAgICAgICAgICAgICAgcmV0dXJuIFJlbW90ZUNvbnRyb2xDbGllbnQuUExBWVNUQVRFX1BMQVlJTkc7CisgICAgICAgICAgICBjYXNlIFNUQVRFX1JFV0lORElORzoKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVtb3RlQ29udHJvbENsaWVudC5QTEFZU1RBVEVfUkVXSU5ESU5HOworICAgICAgICAgICAgY2FzZSBTVEFURV9TS0lQUElOR19UT19QUkVWSU9VUzoKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVtb3RlQ29udHJvbENsaWVudC5QTEFZU1RBVEVfU0tJUFBJTkdfQkFDS1dBUkRTOworICAgICAgICAgICAgY2FzZSBTVEFURV9TS0lQUElOR19UT19ORVhUOgorICAgICAgICAgICAgICAgIHJldHVybiBSZW1vdGVDb250cm9sQ2xpZW50LlBMQVlTVEFURV9TS0lQUElOR19GT1JXQVJEUzsKKyAgICAgICAgICAgIGNhc2UgU1RBVEVfU1RPUFBFRDoKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVtb3RlQ29udHJvbENsaWVudC5QTEFZU1RBVEVfU1RPUFBFRDsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGxvbmcgZ2V0QWN0aW9uc0Zyb21SY2NDb250cm9sRmxhZ3MoaW50IHJjY0ZsYWdzKSB7CisgICAgICAgIGxvbmcgYWN0aW9ucyA9IDA7CisgICAgICAgIGxvbmcgZmxhZyA9IDE7CisgICAgICAgIHdoaWxlIChmbGFnIDw9IHJjY0ZsYWdzKSB7CisgICAgICAgICAgICBpZiAoKGZsYWcgJiByY2NGbGFncykgIT0gMCkgeworICAgICAgICAgICAgICAgIGFjdGlvbnMgfD0gZ2V0QWN0aW9uRm9yUmNjRmxhZygoaW50KSBmbGFnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZsYWcgPSBmbGFnIDw8IDE7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGFjdGlvbnM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGludCBnZXRSY2NDb250cm9sRmxhZ3NGcm9tQWN0aW9ucyhsb25nIGFjdGlvbnMpIHsKKyAgICAgICAgaW50IHJjY0ZsYWdzID0gMDsKKyAgICAgICAgbG9uZyBhY3Rpb24gPSAxOworICAgICAgICB3aGlsZSAoYWN0aW9uIDw9IGFjdGlvbnMgJiYgYWN0aW9uIDwgSW50ZWdlci5NQVhfVkFMVUUpIHsKKyAgICAgICAgICAgIGlmICgoYWN0aW9uICYgYWN0aW9ucykgIT0gMCkgeworICAgICAgICAgICAgICAgIHJjY0ZsYWdzIHw9IGdldFJjY0ZsYWdGb3JBY3Rpb24oYWN0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFjdGlvbiA9IGFjdGlvbiA8PCAxOworICAgICAgICB9CisgICAgICAgIHJldHVybiByY2NGbGFnczsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBsb25nIGdldEFjdGlvbkZvclJjY0ZsYWcoaW50IGZsYWcpIHsKKyAgICAgICAgc3dpdGNoIChmbGFnKSB7CisgICAgICAgICAgICBjYXNlIFJlbW90ZUNvbnRyb2xDbGllbnQuRkxBR19LRVlfTUVESUFfUFJFVklPVVM6CisgICAgICAgICAgICAgICAgcmV0dXJuIEFDVElPTl9TS0lQX1RPX1BSRVZJT1VTOworICAgICAgICAgICAgY2FzZSBSZW1vdGVDb250cm9sQ2xpZW50LkZMQUdfS0VZX01FRElBX1JFV0lORDoKKyAgICAgICAgICAgICAgICByZXR1cm4gQUNUSU9OX1JFV0lORDsKKyAgICAgICAgICAgIGNhc2UgUmVtb3RlQ29udHJvbENsaWVudC5GTEFHX0tFWV9NRURJQV9QTEFZOgorICAgICAgICAgICAgICAgIHJldHVybiBBQ1RJT05fUExBWTsKKyAgICAgICAgICAgIGNhc2UgUmVtb3RlQ29udHJvbENsaWVudC5GTEFHX0tFWV9NRURJQV9QTEFZX1BBVVNFOgorICAgICAgICAgICAgICAgIHJldHVybiBBQ1RJT05fUExBWV9QQVVTRTsKKyAgICAgICAgICAgIGNhc2UgUmVtb3RlQ29udHJvbENsaWVudC5GTEFHX0tFWV9NRURJQV9QQVVTRToKKyAgICAgICAgICAgICAgICByZXR1cm4gQUNUSU9OX1BBVVNFOworICAgICAgICAgICAgY2FzZSBSZW1vdGVDb250cm9sQ2xpZW50LkZMQUdfS0VZX01FRElBX1NUT1A6CisgICAgICAgICAgICAgICAgcmV0dXJuIEFDVElPTl9TVE9QOworICAgICAgICAgICAgY2FzZSBSZW1vdGVDb250cm9sQ2xpZW50LkZMQUdfS0VZX01FRElBX0ZBU1RfRk9SV0FSRDoKKyAgICAgICAgICAgICAgICByZXR1cm4gQUNUSU9OX0ZBU1RfRk9SV0FSRDsKKyAgICAgICAgICAgIGNhc2UgUmVtb3RlQ29udHJvbENsaWVudC5GTEFHX0tFWV9NRURJQV9ORVhUOgorICAgICAgICAgICAgICAgIHJldHVybiBBQ1RJT05fU0tJUF9UT19ORVhUOworICAgICAgICAgICAgY2FzZSBSZW1vdGVDb250cm9sQ2xpZW50LkZMQUdfS0VZX01FRElBX1BPU0lUSU9OX1VQREFURToKKyAgICAgICAgICAgICAgICByZXR1cm4gQUNUSU9OX1NFRUtfVE87CisgICAgICAgICAgICBjYXNlIFJlbW90ZUNvbnRyb2xDbGllbnQuRkxBR19LRVlfTUVESUFfUkFUSU5HOgorICAgICAgICAgICAgICAgIHJldHVybiBBQ1RJT05fU0VUX1JBVElORzsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgZ2V0UmNjRmxhZ0ZvckFjdGlvbihsb25nIGFjdGlvbikgeworICAgICAgICAvLyBXZSBvbmx5IGNhcmUgYWJvdXQgdGhlIGxvd2VyIHNldCBvZiBhY3Rpb25zIHRoYXQgY2FuIG1hcCB0byByY2MKKyAgICAgICAgLy8gZmxhZ3MuCisgICAgICAgIGludCB0ZXN0QWN0aW9uID0gYWN0aW9uIDwgSW50ZWdlci5NQVhfVkFMVUUgPyAoaW50KSBhY3Rpb24gOiAwOworICAgICAgICBzd2l0Y2ggKHRlc3RBY3Rpb24pIHsKKyAgICAgICAgICAgIGNhc2UgKGludCkgQUNUSU9OX1NLSVBfVE9fUFJFVklPVVM6CisgICAgICAgICAgICAgICAgcmV0dXJuIFJlbW90ZUNvbnRyb2xDbGllbnQuRkxBR19LRVlfTUVESUFfUFJFVklPVVM7CisgICAgICAgICAgICBjYXNlIChpbnQpIEFDVElPTl9SRVdJTkQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIFJlbW90ZUNvbnRyb2xDbGllbnQuRkxBR19LRVlfTUVESUFfUkVXSU5EOworICAgICAgICAgICAgY2FzZSAoaW50KSBBQ1RJT05fUExBWToKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVtb3RlQ29udHJvbENsaWVudC5GTEFHX0tFWV9NRURJQV9QTEFZOworICAgICAgICAgICAgY2FzZSAoaW50KSBBQ1RJT05fUExBWV9QQVVTRToKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVtb3RlQ29udHJvbENsaWVudC5GTEFHX0tFWV9NRURJQV9QTEFZX1BBVVNFOworICAgICAgICAgICAgY2FzZSAoaW50KSBBQ1RJT05fUEFVU0U6CisgICAgICAgICAgICAgICAgcmV0dXJuIFJlbW90ZUNvbnRyb2xDbGllbnQuRkxBR19LRVlfTUVESUFfUEFVU0U7CisgICAgICAgICAgICBjYXNlIChpbnQpIEFDVElPTl9TVE9QOgorICAgICAgICAgICAgICAgIHJldHVybiBSZW1vdGVDb250cm9sQ2xpZW50LkZMQUdfS0VZX01FRElBX1NUT1A7CisgICAgICAgICAgICBjYXNlIChpbnQpIEFDVElPTl9GQVNUX0ZPUldBUkQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIFJlbW90ZUNvbnRyb2xDbGllbnQuRkxBR19LRVlfTUVESUFfRkFTVF9GT1JXQVJEOworICAgICAgICAgICAgY2FzZSAoaW50KSBBQ1RJT05fU0tJUF9UT19ORVhUOgorICAgICAgICAgICAgICAgIHJldHVybiBSZW1vdGVDb250cm9sQ2xpZW50LkZMQUdfS0VZX01FRElBX05FWFQ7CisgICAgICAgICAgICBjYXNlIChpbnQpIEFDVElPTl9TRUVLX1RPOgorICAgICAgICAgICAgICAgIHJldHVybiBSZW1vdGVDb250cm9sQ2xpZW50LkZMQUdfS0VZX01FRElBX1BPU0lUSU9OX1VQREFURTsKKyAgICAgICAgICAgIGNhc2UgKGludCkgQUNUSU9OX1NFVF9SQVRJTkc6CisgICAgICAgICAgICAgICAgcmV0dXJuIFJlbW90ZUNvbnRyb2xDbGllbnQuRkxBR19LRVlfTUVESUFfUkFUSU5HOworICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUGFyY2VsYWJsZS5DcmVhdG9yPFBsYXliYWNrU3RhdGU+IENSRUFUT1IgPQorICAgICAgICAgICAgbmV3IFBhcmNlbGFibGUuQ3JlYXRvcjxQbGF5YmFja1N0YXRlPigpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBQbGF5YmFja1N0YXRlIGNyZWF0ZUZyb21QYXJjZWwoUGFyY2VsIGluKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFBsYXliYWNrU3RhdGUoaW4pOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBQbGF5YmFja1N0YXRlW10gbmV3QXJyYXkoaW50IHNpemUpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgUGxheWJhY2tTdGF0ZVtzaXplXTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICAvKioKKyAgICAgKiB7QGxpbmsgUGxheWJhY2tTdGF0ZS5DdXN0b21BY3Rpb24gQ3VzdG9tQWN0aW9uc30gY2FuIGJlIHVzZWQgdG8gZXh0ZW5kIHRoZSBjYXBhYmlsaXRpZXMgb2YKKyAgICAgKiB0aGUgc3RhbmRhcmQgdHJhbnNwb3J0IGNvbnRyb2xzIGJ5IGV4cG9zaW5nIGFwcCBzcGVjaWZpYyBhY3Rpb25zIHRvCisgICAgICoge0BsaW5rIE1lZGlhQ29udHJvbGxlciBNZWRpYUNvbnRyb2xsZXJzfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEN1c3RvbUFjdGlvbiBpbXBsZW1lbnRzIFBhcmNlbGFibGUgeworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtQWN0aW9uOworICAgICAgICBwcml2YXRlIGZpbmFsIENoYXJTZXF1ZW5jZSBtTmFtZTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbUljb247CisgICAgICAgIHByaXZhdGUgZmluYWwgQnVuZGxlIG1FeHRyYXM7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFVzZSB7QGxpbmsgUGxheWJhY2tTdGF0ZS5DdXN0b21BY3Rpb24uQnVpbGRlciNidWlsZCgpfS4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgQ3VzdG9tQWN0aW9uKFN0cmluZyBhY3Rpb24sIENoYXJTZXF1ZW5jZSBuYW1lLCBpbnQgaWNvbiwgQnVuZGxlIGV4dHJhcykgeworICAgICAgICAgICAgbUFjdGlvbiA9IGFjdGlvbjsKKyAgICAgICAgICAgIG1OYW1lID0gbmFtZTsKKyAgICAgICAgICAgIG1JY29uID0gaWNvbjsKKyAgICAgICAgICAgIG1FeHRyYXMgPSBleHRyYXM7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIEN1c3RvbUFjdGlvbihQYXJjZWwgaW4pIHsKKyAgICAgICAgICAgIG1BY3Rpb24gPSBpbi5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgICBtTmFtZSA9IFRleHRVdGlscy5DSEFSX1NFUVVFTkNFX0NSRUFUT1IuY3JlYXRlRnJvbVBhcmNlbChpbik7CisgICAgICAgICAgICBtSWNvbiA9IGluLnJlYWRJbnQoKTsKKyAgICAgICAgICAgIG1FeHRyYXMgPSBpbi5yZWFkQnVuZGxlKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgd3JpdGVUb1BhcmNlbChQYXJjZWwgZGVzdCwgaW50IGZsYWdzKSB7CisgICAgICAgICAgICBkZXN0LndyaXRlU3RyaW5nKG1BY3Rpb24pOworICAgICAgICAgICAgVGV4dFV0aWxzLndyaXRlVG9QYXJjZWwobU5hbWUsIGRlc3QsIGZsYWdzKTsKKyAgICAgICAgICAgIGRlc3Qud3JpdGVJbnQobUljb24pOworICAgICAgICAgICAgZGVzdC53cml0ZUJ1bmRsZShtRXh0cmFzKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGRlc2NyaWJlQ29udGVudHMoKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUGFyY2VsYWJsZS5DcmVhdG9yPFBsYXliYWNrU3RhdGUuQ3VzdG9tQWN0aW9uPiBDUkVBVE9SCisgICAgICAgICAgICAgICAgPSBuZXcgUGFyY2VsYWJsZS5DcmVhdG9yPFBsYXliYWNrU3RhdGUuQ3VzdG9tQWN0aW9uPigpIHsKKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgUGxheWJhY2tTdGF0ZS5DdXN0b21BY3Rpb24gY3JlYXRlRnJvbVBhcmNlbChQYXJjZWwgcCkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUGxheWJhY2tTdGF0ZS5DdXN0b21BY3Rpb24ocCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFBsYXliYWNrU3RhdGUuQ3VzdG9tQWN0aW9uW10gbmV3QXJyYXkoaW50IHNpemUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFBsYXliYWNrU3RhdGUuQ3VzdG9tQWN0aW9uW3NpemVdOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIHRoZSBhY3Rpb24gb2YgdGhlIHtAbGluayBDdXN0b21BY3Rpb259LgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIFRoZSBhY3Rpb24gb2YgdGhlIHtAbGluayBDdXN0b21BY3Rpb259LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRBY3Rpb24oKSB7CisgICAgICAgICAgICByZXR1cm4gbUFjdGlvbjsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIHRoZSBkaXNwbGF5IG5hbWUgb2YgdGhpcyBhY3Rpb24uIGUuZy4gIkZhdm9yaXRlIgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIFRoZSBkaXNwbGF5IG5hbWUgb2YgdGhpcyB7QGxpbmsgQ3VzdG9tQWN0aW9ufS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgZ2V0TmFtZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtTmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIHRoZSByZXNvdXJjZSBpZCBvZiB0aGUgaWNvbiBpbiB0aGUge0BsaW5rIE1lZGlhU2Vzc2lvbiBNZWRpYVNlc3Npb24nc30gcGFja2FnZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBUaGUgcmVzb3VyY2UgaWQgb2YgdGhlIGljb24gaW4gdGhlIHtAbGluayBNZWRpYVNlc3Npb24gTWVkaWFTZXNzaW9uJ3N9IHBhY2thZ2UuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgaW50IGdldEljb24oKSB7CisgICAgICAgICAgICByZXR1cm4gbUljb247CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyBleHRyYXMgd2hpY2ggcHJvdmlkZSBhZGRpdGlvbmFsIGFwcGxpY2F0aW9uLXNwZWNpZmljIGluZm9ybWF0aW9uIGFib3V0IHRoZQorICAgICAgICAgKiBhY3Rpb24sIG9yIG51bGwgaWYgbm9uZS4gVGhlc2UgYXJndW1lbnRzIGFyZSBtZWFudCB0byBiZSBjb25zdW1lZCBieSBhCisgICAgICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xsZXJ9IGlmIGl0IGtub3dzIGhvdyB0byBoYW5kbGUgdGhlbS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBPcHRpb25hbCBhcmd1bWVudHMgZm9yIHRoZSB7QGxpbmsgQ3VzdG9tQWN0aW9ufS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBCdW5kbGUgZ2V0RXh0cmFzKCkgeworICAgICAgICAgICAgcmV0dXJuIG1FeHRyYXM7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiAiQWN0aW9uOiIgKworICAgICAgICAgICAgICAgICAgICAibU5hbWU9JyIgKyBtTmFtZSArCisgICAgICAgICAgICAgICAgICAgICIsIG1JY29uPSIgKyBtSWNvbiArCisgICAgICAgICAgICAgICAgICAgICIsIG1FeHRyYXM9IiArIG1FeHRyYXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQnVpbGRlciBmb3Ige0BsaW5rIEN1c3RvbUFjdGlvbn0gb2JqZWN0cy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQnVpbGRlciB7CisgICAgICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtQWN0aW9uOworICAgICAgICAgICAgcHJpdmF0ZSBmaW5hbCBDaGFyU2VxdWVuY2UgbU5hbWU7CisgICAgICAgICAgICBwcml2YXRlIGZpbmFsIGludCBtSWNvbjsKKyAgICAgICAgICAgIHByaXZhdGUgQnVuZGxlIG1FeHRyYXM7CisKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogQ3JlYXRlcyBhIHtAbGluayBDdXN0b21BY3Rpb259IGJ1aWxkZXIgd2l0aCB0aGUgaWQsIG5hbWUsIGFuZCBpY29uIHNldC4KKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiBAcGFyYW0gYWN0aW9uIFRoZSBhY3Rpb24gb2YgdGhlIHtAbGluayBDdXN0b21BY3Rpb259LgorICAgICAgICAgICAgICogQHBhcmFtIG5hbWUgVGhlIGRpc3BsYXkgbmFtZSBvZiB0aGUge0BsaW5rIEN1c3RvbUFjdGlvbn0uIFRoaXMgbmFtZSB3aWxsIGJlIGRpc3BsYXllZAorICAgICAgICAgICAgICogICAgICAgICAgICAgYWxvbmcgc2lkZSB0aGUgYWN0aW9uIGlmIHRoZSBVSSBzdXBwb3J0cyBpdC4KKyAgICAgICAgICAgICAqIEBwYXJhbSBpY29uIFRoZSBpY29uIHJlc291cmNlIGlkIG9mIHRoZSB7QGxpbmsgQ3VzdG9tQWN0aW9ufS4gVGhpcyByZXNvdXJjZSBpZAorICAgICAgICAgICAgICogICAgICAgICAgICAgbXVzdCBiZSBpbiB0aGUgc2FtZSBwYWNrYWdlIGFzIHRoZSB7QGxpbmsgTWVkaWFTZXNzaW9ufS4gSXQgd2lsbCBiZQorICAgICAgICAgICAgICogICAgICAgICAgICAgZGlzcGxheWVkIHdpdGggdGhlIGN1c3RvbSBhY3Rpb24gaWYgdGhlIFVJIHN1cHBvcnRzIGl0LgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBwdWJsaWMgQnVpbGRlcihTdHJpbmcgYWN0aW9uLCBDaGFyU2VxdWVuY2UgbmFtZSwgQERyYXdhYmxlUmVzIGludCBpY29uKSB7CisgICAgICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KGFjdGlvbikpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiWW91IG11c3Qgc3BlY2lmeSBhbiBhY3Rpb24gdG8gYnVpbGQgYSBDdXN0b21BY3Rpb24uIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShuYW1lKSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJZb3UgbXVzdCBzcGVjaWZ5IGEgbmFtZSB0byBidWlsZCBhIEN1c3RvbUFjdGlvbi4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGljb24gPT0gMCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJZb3UgbXVzdCBzcGVjaWZ5IGFuIGljb24gcmVzb3VyY2UgaWQgdG8gYnVpbGQgYSBDdXN0b21BY3Rpb24uIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1BY3Rpb24gPSBhY3Rpb247CisgICAgICAgICAgICAgICAgbU5hbWUgPSBuYW1lOworICAgICAgICAgICAgICAgIG1JY29uID0gaWNvbjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBTZXQgb3B0aW9uYWwgZXh0cmFzIGZvciB0aGUge0BsaW5rIEN1c3RvbUFjdGlvbn0uIFRoZXNlIGV4dHJhcyBhcmUgbWVhbnQgdG8gYmUKKyAgICAgICAgICAgICAqIGNvbnN1bWVkIGJ5IGEge0BsaW5rIE1lZGlhQ29udHJvbGxlcn0gaWYgaXQga25vd3MgaG93IHRvIGhhbmRsZSB0aGVtLgorICAgICAgICAgICAgICogS2V5cyBzaG91bGQgYmUgZnVsbHkgcXVhbGlmaWVkIChlLmcuICJjb20uZXhhbXBsZS5NWV9BUkciKSB0byBhdm9pZCBjb2xsaXNpb25zLgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqIEBwYXJhbSBleHRyYXMgT3B0aW9uYWwgZXh0cmFzIGZvciB0aGUge0BsaW5rIEN1c3RvbUFjdGlvbn0uCisgICAgICAgICAgICAgKiBAcmV0dXJuIHRoaXMuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldEV4dHJhcyhCdW5kbGUgZXh0cmFzKSB7CisgICAgICAgICAgICAgICAgbUV4dHJhcyA9IGV4dHJhczsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBCdWlsZCBhbmQgcmV0dXJuIHRoZSB7QGxpbmsgQ3VzdG9tQWN0aW9ufSBpbnN0YW5jZSB3aXRoIHRoZSBzcGVjaWZpZWQgdmFsdWVzLgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqIEByZXR1cm4gQSBuZXcge0BsaW5rIEN1c3RvbUFjdGlvbn0gaW5zdGFuY2UuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHB1YmxpYyBDdXN0b21BY3Rpb24gYnVpbGQoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDdXN0b21BY3Rpb24obUFjdGlvbiwgbU5hbWUsIG1JY29uLCBtRXh0cmFzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEJ1aWxkZXIgZm9yIHtAbGluayBQbGF5YmFja1N0YXRlfSBvYmplY3RzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQnVpbGRlciB7CisgICAgICAgIHByaXZhdGUgZmluYWwgTGlzdDxQbGF5YmFja1N0YXRlLkN1c3RvbUFjdGlvbj4gbUN1c3RvbUFjdGlvbnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKworICAgICAgICBwcml2YXRlIGludCBtU3RhdGU7CisgICAgICAgIHByaXZhdGUgbG9uZyBtUG9zaXRpb247CisgICAgICAgIHByaXZhdGUgbG9uZyBtQnVmZmVyZWRQb3NpdGlvbjsKKyAgICAgICAgcHJpdmF0ZSBmbG9hdCBtU3BlZWQ7CisgICAgICAgIHByaXZhdGUgbG9uZyBtQWN0aW9uczsKKyAgICAgICAgcHJpdmF0ZSBDaGFyU2VxdWVuY2UgbUVycm9yTWVzc2FnZTsKKyAgICAgICAgcHJpdmF0ZSBsb25nIG1VcGRhdGVUaW1lOworICAgICAgICBwcml2YXRlIGxvbmcgbUFjdGl2ZUl0ZW1JZCA9IE1lZGlhU2Vzc2lvbi5RdWV1ZUl0ZW0uVU5LTk9XTl9JRDsKKyAgICAgICAgcHJpdmF0ZSBCdW5kbGUgbUV4dHJhczsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlcyBhbiBpbml0aWFsbHkgZW1wdHkgc3RhdGUgYnVpbGRlci4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBCdWlsZGVyKCkgeworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZXMgYSBidWlsZGVyIHdpdGggdGhlIHNhbWUgaW5pdGlhbCB2YWx1ZXMgYXMgdGhvc2UgaW4gdGhlIGZyb20KKyAgICAgICAgICogc3RhdGUuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBmcm9tIFRoZSBzdGF0ZSB0byB1c2UgZm9yIGluaXRpYWxpemluZyB0aGUgYnVpbGRlci4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBCdWlsZGVyKFBsYXliYWNrU3RhdGUgZnJvbSkgeworICAgICAgICAgICAgaWYgKGZyb20gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1TdGF0ZSA9IGZyb20ubVN0YXRlOworICAgICAgICAgICAgbVBvc2l0aW9uID0gZnJvbS5tUG9zaXRpb247CisgICAgICAgICAgICBtQnVmZmVyZWRQb3NpdGlvbiA9IGZyb20ubUJ1ZmZlcmVkUG9zaXRpb247CisgICAgICAgICAgICBtU3BlZWQgPSBmcm9tLm1TcGVlZDsKKyAgICAgICAgICAgIG1BY3Rpb25zID0gZnJvbS5tQWN0aW9uczsKKyAgICAgICAgICAgIGlmIChmcm9tLm1DdXN0b21BY3Rpb25zICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtQ3VzdG9tQWN0aW9ucy5hZGRBbGwoZnJvbS5tQ3VzdG9tQWN0aW9ucyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtRXJyb3JNZXNzYWdlID0gZnJvbS5tRXJyb3JNZXNzYWdlOworICAgICAgICAgICAgbVVwZGF0ZVRpbWUgPSBmcm9tLm1VcGRhdGVUaW1lOworICAgICAgICAgICAgbUFjdGl2ZUl0ZW1JZCA9IGZyb20ubUFjdGl2ZUl0ZW1JZDsKKyAgICAgICAgICAgIG1FeHRyYXMgPSBmcm9tLm1FeHRyYXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0IHRoZSBjdXJyZW50IHN0YXRlIG9mIHBsYXliYWNrLgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogVGhlIHBvc2l0aW9uIG11c3QgYmUgaW4gbXMgYW5kIGluZGljYXRlcyB0aGUgY3VycmVudCBwbGF5YmFjaworICAgICAgICAgKiBwb3NpdGlvbiB3aXRoaW4gdGhlIGl0ZW0uIElmIHRoZSBwb3NpdGlvbiBpcyB1bmtub3duIHVzZQorICAgICAgICAgKiB7QGxpbmsgI1BMQVlCQUNLX1BPU0lUSU9OX1VOS05PV059LiBXaGVuIG5vdCB1c2luZyBhbiB1bmtub3duCisgICAgICAgICAqIHBvc2l0aW9uIHRoZSB0aW1lIGF0IHdoaWNoIHRoZSBwb3NpdGlvbiB3YXMgdXBkYXRlZCBtdXN0IGJlIHByb3ZpZGVkLgorICAgICAgICAgKiBJdCBpcyBva2F5IHRvIHVzZSB7QGxpbmsgU3lzdGVtQ2xvY2sjZWxhcHNlZFJlYWx0aW1lKCl9IGlmIHRoZQorICAgICAgICAgKiBjdXJyZW50IHBvc2l0aW9uIHdhcyBqdXN0IHJldHJpZXZlZC4KKyAgICAgICAgICogPHA+CisgICAgICAgICAqIFRoZSBzcGVlZCBpcyBhIG11bHRpcGxlIG9mIG5vcm1hbCBwbGF5YmFjayBhbmQgc2hvdWxkIGJlIDAgd2hlbgorICAgICAgICAgKiBwYXVzZWQgYW5kIG5lZ2F0aXZlIHdoZW4gcmV3aW5kaW5nLiBOb3JtYWwgcGxheWJhY2sgc3BlZWQgaXMgMS4wLgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogVGhlIHN0YXRlIG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6CisgICAgICAgICAqIDx1bD4KKyAgICAgICAgICogPGxpPiB7QGxpbmsgUGxheWJhY2tTdGF0ZSNTVEFURV9OT05FfTwvbGk+CisgICAgICAgICAqIDxsaT4ge0BsaW5rIFBsYXliYWNrU3RhdGUjU1RBVEVfU1RPUFBFRH08L2xpPgorICAgICAgICAgKiA8bGk+IHtAbGluayBQbGF5YmFja1N0YXRlI1NUQVRFX1BMQVlJTkd9PC9saT4KKyAgICAgICAgICogPGxpPiB7QGxpbmsgUGxheWJhY2tTdGF0ZSNTVEFURV9QQVVTRUR9PC9saT4KKyAgICAgICAgICogPGxpPiB7QGxpbmsgUGxheWJhY2tTdGF0ZSNTVEFURV9GQVNUX0ZPUldBUkRJTkd9PC9saT4KKyAgICAgICAgICogPGxpPiB7QGxpbmsgUGxheWJhY2tTdGF0ZSNTVEFURV9SRVdJTkRJTkd9PC9saT4KKyAgICAgICAgICogPGxpPiB7QGxpbmsgUGxheWJhY2tTdGF0ZSNTVEFURV9CVUZGRVJJTkd9PC9saT4KKyAgICAgICAgICogPGxpPiB7QGxpbmsgUGxheWJhY2tTdGF0ZSNTVEFURV9FUlJPUn08L2xpPgorICAgICAgICAgKiA8bGk+IHtAbGluayBQbGF5YmFja1N0YXRlI1NUQVRFX0NPTk5FQ1RJTkd9PC9saT4KKyAgICAgICAgICogPGxpPiB7QGxpbmsgUGxheWJhY2tTdGF0ZSNTVEFURV9TS0lQUElOR19UT19QUkVWSU9VU308L2xpPgorICAgICAgICAgKiA8bGk+IHtAbGluayBQbGF5YmFja1N0YXRlI1NUQVRFX1NLSVBQSU5HX1RPX05FWFR9PC9saT4KKyAgICAgICAgICogPGxpPiB7QGxpbmsgUGxheWJhY2tTdGF0ZSNTVEFURV9TS0lQUElOR19UT19RVUVVRV9JVEVNfTwvbGk+CisgICAgICAgICAqIDwvdWw+CisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBzdGF0ZSBUaGUgY3VycmVudCBzdGF0ZSBvZiBwbGF5YmFjay4KKyAgICAgICAgICogQHBhcmFtIHBvc2l0aW9uIFRoZSBwb3NpdGlvbiBpbiB0aGUgY3VycmVudCBpdGVtIGluIG1zLgorICAgICAgICAgKiBAcGFyYW0gcGxheWJhY2tTcGVlZCBUaGUgY3VycmVudCBzcGVlZCBvZiBwbGF5YmFjayBhcyBhIG11bHRpcGxlIG9mCisgICAgICAgICAqICAgICAgICAgICAgbm9ybWFsIHBsYXliYWNrLgorICAgICAgICAgKiBAcGFyYW0gdXBkYXRlVGltZSBUaGUgdGltZSBpbiB0aGUge0BsaW5rIFN5c3RlbUNsb2NrI2VsYXBzZWRSZWFsdGltZX0KKyAgICAgICAgICogICAgICAgICAgICB0aW1lYmFzZSB0aGF0IHRoZSBwb3NpdGlvbiB3YXMgdXBkYXRlZCBhdC4KKyAgICAgICAgICogQHJldHVybiB0aGlzCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRTdGF0ZShAU3RhdGUgaW50IHN0YXRlLCBsb25nIHBvc2l0aW9uLCBmbG9hdCBwbGF5YmFja1NwZWVkLAorICAgICAgICAgICAgICAgIGxvbmcgdXBkYXRlVGltZSkgeworICAgICAgICAgICAgbVN0YXRlID0gc3RhdGU7CisgICAgICAgICAgICBtUG9zaXRpb24gPSBwb3NpdGlvbjsKKyAgICAgICAgICAgIG1VcGRhdGVUaW1lID0gdXBkYXRlVGltZTsKKyAgICAgICAgICAgIG1TcGVlZCA9IHBsYXliYWNrU3BlZWQ7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXQgdGhlIGN1cnJlbnQgc3RhdGUgb2YgcGxheWJhY2suCisgICAgICAgICAqIDxwPgorICAgICAgICAgKiBUaGUgcG9zaXRpb24gbXVzdCBiZSBpbiBtcyBhbmQgaW5kaWNhdGVzIHRoZSBjdXJyZW50IHBsYXliYWNrCisgICAgICAgICAqIHBvc2l0aW9uIHdpdGhpbiB0aGUgaXRlbS4gSWYgdGhlIHBvc2l0aW9uIGlzIHVua25vd24gdXNlCisgICAgICAgICAqIHtAbGluayAjUExBWUJBQ0tfUE9TSVRJT05fVU5LTk9XTn0uIFRoZSB1cGRhdGUgdGltZSB3aWxsIGJlIHNldCB0bworICAgICAgICAgKiB0aGUgY3VycmVudCB7QGxpbmsgU3lzdGVtQ2xvY2sjZWxhcHNlZFJlYWx0aW1lKCl9LgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogVGhlIHNwZWVkIGlzIGEgbXVsdGlwbGUgb2Ygbm9ybWFsIHBsYXliYWNrIGFuZCBzaG91bGQgYmUgMCB3aGVuCisgICAgICAgICAqIHBhdXNlZCBhbmQgbmVnYXRpdmUgd2hlbiByZXdpbmRpbmcuIE5vcm1hbCBwbGF5YmFjayBzcGVlZCBpcyAxLjAuCisgICAgICAgICAqIDxwPgorICAgICAgICAgKiBUaGUgc3RhdGUgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKyAgICAgICAgICogPHVsPgorICAgICAgICAgKiA8bGk+IHtAbGluayBQbGF5YmFja1N0YXRlI1NUQVRFX05PTkV9PC9saT4KKyAgICAgICAgICogPGxpPiB7QGxpbmsgUGxheWJhY2tTdGF0ZSNTVEFURV9TVE9QUEVEfTwvbGk+CisgICAgICAgICAqIDxsaT4ge0BsaW5rIFBsYXliYWNrU3RhdGUjU1RBVEVfUExBWUlOR308L2xpPgorICAgICAgICAgKiA8bGk+IHtAbGluayBQbGF5YmFja1N0YXRlI1NUQVRFX1BBVVNFRH08L2xpPgorICAgICAgICAgKiA8bGk+IHtAbGluayBQbGF5YmFja1N0YXRlI1NUQVRFX0ZBU1RfRk9SV0FSRElOR308L2xpPgorICAgICAgICAgKiA8bGk+IHtAbGluayBQbGF5YmFja1N0YXRlI1NUQVRFX1JFV0lORElOR308L2xpPgorICAgICAgICAgKiA8bGk+IHtAbGluayBQbGF5YmFja1N0YXRlI1NUQVRFX0JVRkZFUklOR308L2xpPgorICAgICAgICAgKiA8bGk+IHtAbGluayBQbGF5YmFja1N0YXRlI1NUQVRFX0VSUk9SfTwvbGk+CisgICAgICAgICAqIDxsaT4ge0BsaW5rIFBsYXliYWNrU3RhdGUjU1RBVEVfQ09OTkVDVElOR308L2xpPgorICAgICAgICAgKiA8bGk+IHtAbGluayBQbGF5YmFja1N0YXRlI1NUQVRFX1NLSVBQSU5HX1RPX1BSRVZJT1VTfTwvbGk+CisgICAgICAgICAqIDxsaT4ge0BsaW5rIFBsYXliYWNrU3RhdGUjU1RBVEVfU0tJUFBJTkdfVE9fTkVYVH08L2xpPgorICAgICAgICAgKiA8bGk+IHtAbGluayBQbGF5YmFja1N0YXRlI1NUQVRFX1NLSVBQSU5HX1RPX1FVRVVFX0lURU19PC9saT4KKyAgICAgICAgICogPC91bD4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHN0YXRlIFRoZSBjdXJyZW50IHN0YXRlIG9mIHBsYXliYWNrLgorICAgICAgICAgKiBAcGFyYW0gcG9zaXRpb24gVGhlIHBvc2l0aW9uIGluIHRoZSBjdXJyZW50IGl0ZW0gaW4gbXMuCisgICAgICAgICAqIEBwYXJhbSBwbGF5YmFja1NwZWVkIFRoZSBjdXJyZW50IHNwZWVkIG9mIHBsYXliYWNrIGFzIGEgbXVsdGlwbGUgb2YKKyAgICAgICAgICogICAgICAgICAgICBub3JtYWwgcGxheWJhY2suCisgICAgICAgICAqIEByZXR1cm4gdGhpcworICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0U3RhdGUoQFN0YXRlIGludCBzdGF0ZSwgbG9uZyBwb3NpdGlvbiwgZmxvYXQgcGxheWJhY2tTcGVlZCkgeworICAgICAgICAgICAgcmV0dXJuIHNldFN0YXRlKHN0YXRlLCBwb3NpdGlvbiwgcGxheWJhY2tTcGVlZCwgU3lzdGVtQ2xvY2suZWxhcHNlZFJlYWx0aW1lKCkpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldCB0aGUgY3VycmVudCBhY3Rpb25zIGF2YWlsYWJsZSBvbiB0aGlzIHNlc3Npb24uIFRoaXMgc2hvdWxkIHVzZSBhCisgICAgICAgICAqIGJpdG1hc2sgb2YgcG9zc2libGUgYWN0aW9ucy4KKyAgICAgICAgICogPHVsPgorICAgICAgICAgKiA8bGk+IHtAbGluayBQbGF5YmFja1N0YXRlI0FDVElPTl9TS0lQX1RPX1BSRVZJT1VTfTwvbGk+CisgICAgICAgICAqIDxsaT4ge0BsaW5rIFBsYXliYWNrU3RhdGUjQUNUSU9OX1JFV0lORH08L2xpPgorICAgICAgICAgKiA8bGk+IHtAbGluayBQbGF5YmFja1N0YXRlI0FDVElPTl9QTEFZfTwvbGk+CisgICAgICAgICAqIDxsaT4ge0BsaW5rIFBsYXliYWNrU3RhdGUjQUNUSU9OX1BBVVNFfTwvbGk+CisgICAgICAgICAqIDxsaT4ge0BsaW5rIFBsYXliYWNrU3RhdGUjQUNUSU9OX1NUT1B9PC9saT4KKyAgICAgICAgICogPGxpPiB7QGxpbmsgUGxheWJhY2tTdGF0ZSNBQ1RJT05fRkFTVF9GT1JXQVJEfTwvbGk+CisgICAgICAgICAqIDxsaT4ge0BsaW5rIFBsYXliYWNrU3RhdGUjQUNUSU9OX1NLSVBfVE9fTkVYVH08L2xpPgorICAgICAgICAgKiA8bGk+IHtAbGluayBQbGF5YmFja1N0YXRlI0FDVElPTl9TRUVLX1RPfTwvbGk+CisgICAgICAgICAqIDxsaT4ge0BsaW5rIFBsYXliYWNrU3RhdGUjQUNUSU9OX1NFVF9SQVRJTkd9PC9saT4KKyAgICAgICAgICogPGxpPiB7QGxpbmsgUGxheWJhY2tTdGF0ZSNBQ1RJT05fUExBWV9QQVVTRX08L2xpPgorICAgICAgICAgKiA8bGk+IHtAbGluayBQbGF5YmFja1N0YXRlI0FDVElPTl9QTEFZX0ZST01fTUVESUFfSUR9PC9saT4KKyAgICAgICAgICogPGxpPiB7QGxpbmsgUGxheWJhY2tTdGF0ZSNBQ1RJT05fUExBWV9GUk9NX1NFQVJDSH08L2xpPgorICAgICAgICAgKiA8bGk+IHtAbGluayBQbGF5YmFja1N0YXRlI0FDVElPTl9TS0lQX1RPX1FVRVVFX0lURU19PC9saT4KKyAgICAgICAgICogPGxpPiB7QGxpbmsgUGxheWJhY2tTdGF0ZSNBQ1RJT05fUExBWV9GUk9NX1VSSX08L2xpPgorICAgICAgICAgKiA8bGk+IHtAbGluayBQbGF5YmFja1N0YXRlI0FDVElPTl9QUkVQQVJFfTwvbGk+CisgICAgICAgICAqIDxsaT4ge0BsaW5rIFBsYXliYWNrU3RhdGUjQUNUSU9OX1BSRVBBUkVfRlJPTV9NRURJQV9JRH08L2xpPgorICAgICAgICAgKiA8bGk+IHtAbGluayBQbGF5YmFja1N0YXRlI0FDVElPTl9QUkVQQVJFX0ZST01fU0VBUkNIfTwvbGk+CisgICAgICAgICAqIDxsaT4ge0BsaW5rIFBsYXliYWNrU3RhdGUjQUNUSU9OX1BSRVBBUkVfRlJPTV9VUkl9PC9saT4KKyAgICAgICAgICogPC91bD4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGFjdGlvbnMgVGhlIHNldCBvZiBhY3Rpb25zIGFsbG93ZWQuCisgICAgICAgICAqIEByZXR1cm4gdGhpcworICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0QWN0aW9ucyhAQWN0aW9ucyBsb25nIGFjdGlvbnMpIHsKKyAgICAgICAgICAgIG1BY3Rpb25zID0gYWN0aW9uczsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFkZCBhIGN1c3RvbSBhY3Rpb24gdG8gdGhlIHBsYXliYWNrIHN0YXRlLiBBY3Rpb25zIGNhbiBiZSB1c2VkIHRvCisgICAgICAgICAqIGV4cG9zZSBhZGRpdGlvbmFsIGZ1bmN0aW9uYWxpdHkgdG8ge0BsaW5rIE1lZGlhQ29udHJvbGxlcgorICAgICAgICAgKiBNZWRpYUNvbnRyb2xsZXJzfSBiZXlvbmQgd2hhdCBpcyBvZmZlcmVkIGJ5IHRoZSBzdGFuZGFyZCB0cmFuc3BvcnQKKyAgICAgICAgICogY29udHJvbHMuCisgICAgICAgICAqIDxwPgorICAgICAgICAgKiBlLmcuIHN0YXJ0IGEgcmFkaW8gc3RhdGlvbiBiYXNlZCBvbiB0aGUgY3VycmVudCBpdGVtIG9yIHNraXAgYWhlYWQgYnkKKyAgICAgICAgICogMzAgc2Vjb25kcy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGFjdGlvbiBBbiBpZGVudGlmaWVyIGZvciB0aGlzIGFjdGlvbi4gSXQgY2FuIGJlIHNlbnQgYmFjayB0bworICAgICAgICAgKiAgICAgICAgICAgIHRoZSB7QGxpbmsgTWVkaWFTZXNzaW9ufSB0aHJvdWdoCisgICAgICAgICAqICAgICAgICAgICAge0BsaW5rIE1lZGlhQ29udHJvbGxlci5UcmFuc3BvcnRDb250cm9scyNzZW5kQ3VzdG9tQWN0aW9uKFN0cmluZywgQnVuZGxlKX0uCisgICAgICAgICAqIEBwYXJhbSBuYW1lIFRoZSBkaXNwbGF5IG5hbWUgZm9yIHRoZSBhY3Rpb24uIElmIHRleHQgaXMgc2hvd24gd2l0aAorICAgICAgICAgKiAgICAgICAgICAgIHRoZSBhY3Rpb24gb3IgdXNlZCBmb3IgYWNjZXNzaWJpbGl0eSwgdGhpcyBpcyB3aGF0IHNob3VsZAorICAgICAgICAgKiAgICAgICAgICAgIGJlIHVzZWQuCisgICAgICAgICAqIEBwYXJhbSBpY29uIFRoZSByZXNvdXJjZSBhY3Rpb24gb2YgdGhlIGljb24gdGhhdCBzaG91bGQgYmUgZGlzcGxheWVkCisgICAgICAgICAqICAgICAgICAgICAgZm9yIHRoZSBhY3Rpb24uIFRoZSByZXNvdXJjZSBzaG91bGQgYmUgaW4gdGhlIHBhY2thZ2Ugb2YKKyAgICAgICAgICogICAgICAgICAgICB0aGUge0BsaW5rIE1lZGlhU2Vzc2lvbn0uCisgICAgICAgICAqIEByZXR1cm4gdGhpcworICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEJ1aWxkZXIgYWRkQ3VzdG9tQWN0aW9uKFN0cmluZyBhY3Rpb24sIFN0cmluZyBuYW1lLCBpbnQgaWNvbikgeworICAgICAgICAgICAgcmV0dXJuIGFkZEN1c3RvbUFjdGlvbihuZXcgUGxheWJhY2tTdGF0ZS5DdXN0b21BY3Rpb24oYWN0aW9uLCBuYW1lLCBpY29uLCBudWxsKSk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQWRkIGEgY3VzdG9tIGFjdGlvbiB0byB0aGUgcGxheWJhY2sgc3RhdGUuIEFjdGlvbnMgY2FuIGJlIHVzZWQgdG8gZXhwb3NlIGFkZGl0aW9uYWwKKyAgICAgICAgICogZnVuY3Rpb25hbGl0eSB0byB7QGxpbmsgTWVkaWFDb250cm9sbGVyIE1lZGlhQ29udHJvbGxlcnN9IGJleW9uZCB3aGF0IGlzIG9mZmVyZWQgYnkgdGhlCisgICAgICAgICAqIHN0YW5kYXJkIHRyYW5zcG9ydCBjb250cm9scy4KKyAgICAgICAgICogPHA+CisgICAgICAgICAqIEFuIGV4YW1wbGUgb2YgYW4gYWN0aW9uIHdvdWxkIGJlIHRvIHN0YXJ0IGEgcmFkaW8gc3RhdGlvbiBiYXNlZCBvbiB0aGUgY3VycmVudCBpdGVtCisgICAgICAgICAqIG9yIHRvIHNraXAgYWhlYWQgYnkgMzAgc2Vjb25kcy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGN1c3RvbUFjdGlvbiBUaGUgY3VzdG9tIGFjdGlvbiB0byBhZGQgdG8gdGhlIHtAbGluayBQbGF5YmFja1N0YXRlfS4KKyAgICAgICAgICogQHJldHVybiB0aGlzCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlciBhZGRDdXN0b21BY3Rpb24oUGxheWJhY2tTdGF0ZS5DdXN0b21BY3Rpb24gY3VzdG9tQWN0aW9uKSB7CisgICAgICAgICAgICBpZiAoY3VzdG9tQWN0aW9uID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgIllvdSBtYXkgbm90IGFkZCBhIG51bGwgQ3VzdG9tQWN0aW9uIHRvIFBsYXliYWNrU3RhdGUuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ3VzdG9tQWN0aW9ucy5hZGQoY3VzdG9tQWN0aW9uKTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldCB0aGUgY3VycmVudCBidWZmZXJlZCBwb3NpdGlvbiBpbiBtcy4gVGhpcyBpcyB0aGUgZmFydGhlc3QKKyAgICAgICAgICogcGxheWJhY2sgcG9pbnQgdGhhdCBjYW4gYmUgcmVhY2hlZCBmcm9tIHRoZSBjdXJyZW50IHBvc2l0aW9uIHVzaW5nCisgICAgICAgICAqIG9ubHkgYnVmZmVyZWQgY29udGVudC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGJ1ZmZlcmVkUG9zaXRpb24gVGhlIHBvc2l0aW9uIGluIG1zIHRoYXQgcGxheWJhY2sgaXMgYnVmZmVyZWQKKyAgICAgICAgICogICAgICAgICAgICB0by4KKyAgICAgICAgICogQHJldHVybiB0aGlzCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRCdWZmZXJlZFBvc2l0aW9uKGxvbmcgYnVmZmVyZWRQb3NpdGlvbikgeworICAgICAgICAgICAgbUJ1ZmZlcmVkUG9zaXRpb24gPSBidWZmZXJlZFBvc2l0aW9uOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0IHRoZSBhY3RpdmUgaXRlbSBpbiB0aGUgcGxheSBxdWV1ZSBieSBzcGVjaWZ5aW5nIGl0cyBpZC4gVGhlCisgICAgICAgICAqIGRlZmF1bHQgdmFsdWUgaXMge0BsaW5rIE1lZGlhU2Vzc2lvbi5RdWV1ZUl0ZW0jVU5LTk9XTl9JRH0KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGlkIFRoZSBpZCBvZiB0aGUgYWN0aXZlIGl0ZW0uCisgICAgICAgICAqIEByZXR1cm4gdGhpcworICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0QWN0aXZlUXVldWVJdGVtSWQobG9uZyBpZCkgeworICAgICAgICAgICAgbUFjdGl2ZUl0ZW1JZCA9IGlkOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0IGEgdXNlciByZWFkYWJsZSBlcnJvciBtZXNzYWdlLiBUaGlzIHNob3VsZCBiZSBzZXQgd2hlbiB0aGUgc3RhdGUKKyAgICAgICAgICogaXMge0BsaW5rIFBsYXliYWNrU3RhdGUjU1RBVEVfRVJST1J9LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gZXJyb3IgVGhlIGVycm9yIG1lc3NhZ2UgZm9yIGRpc3BsYXkgdG8gdGhlIHVzZXIuCisgICAgICAgICAqIEByZXR1cm4gdGhpcworICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0RXJyb3JNZXNzYWdlKENoYXJTZXF1ZW5jZSBlcnJvcikgeworICAgICAgICAgICAgbUVycm9yTWVzc2FnZSA9IGVycm9yOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0IGFueSBjdXN0b20gZXh0cmFzIHRvIGJlIGluY2x1ZGVkIHdpdGggdGhlIHBsYXliYWNrIHN0YXRlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gZXh0cmFzIFRoZSBleHRyYXMgdG8gaW5jbHVkZS4KKyAgICAgICAgICogQHJldHVybiB0aGlzCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRFeHRyYXMoQnVuZGxlIGV4dHJhcykgeworICAgICAgICAgICAgbUV4dHJhcyA9IGV4dHJhczsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEJ1aWxkIGFuZCByZXR1cm4gdGhlIHtAbGluayBQbGF5YmFja1N0YXRlfSBpbnN0YW5jZSB3aXRoIHRoZXNlCisgICAgICAgICAqIHZhbHVlcy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBBIG5ldyBzdGF0ZSBpbnN0YW5jZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBQbGF5YmFja1N0YXRlIGJ1aWxkKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBQbGF5YmFja1N0YXRlKG1TdGF0ZSwgbVBvc2l0aW9uLCBtVXBkYXRlVGltZSwgbVNwZWVkLCBtQnVmZmVyZWRQb3NpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgbUFjdGlvbnMsIG1DdXN0b21BY3Rpb25zLCBtQWN0aXZlSXRlbUlkLCBtRXJyb3JNZXNzYWdlLCBtRXh0cmFzKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9hcGV4L2phdmEvYW5kcm9pZC9zZXJ2aWNlL21lZGlhL0lNZWRpYUJyb3dzZXJTZXJ2aWNlLmFpZGwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvYXBleC9qYXZhL2FuZHJvaWQvc2VydmljZS9tZWRpYS9JTWVkaWFCcm93c2VyU2VydmljZS5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0ZjQxZjYKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvYXBleC9qYXZhL2FuZHJvaWQvc2VydmljZS9tZWRpYS9JTWVkaWFCcm93c2VyU2VydmljZS5haWRsCkBAIC0wLDAgKzEsMjcgQEAKKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKK3BhY2thZ2UgYW5kcm9pZC5zZXJ2aWNlLm1lZGlhOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uOworaW1wb3J0IGFuZHJvaWQuc2VydmljZS5tZWRpYS5JTWVkaWFCcm93c2VyU2VydmljZUNhbGxiYWNrczsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5SZXN1bHRSZWNlaXZlcjsKKworLyoqCisgKiBNZWRpYSBBUEkgYWxsb3dzIGNsaWVudHMgdG8gYnJvd3NlIHRocm91Z2ggaGllcmFyY2h5IG9mIGEgdXNlcuKAmXMgbWVkaWEgY29sbGVjdGlvbiwKKyAqIHBsYXliYWNrIGEgc3BlY2lmaWMgbWVkaWEgZW50cnkgYW5kIGludGVyYWN0IHdpdGggdGhlIG5vdyBwbGF5aW5nIHF1ZXVlLgorICogQGhpZGUKKyAqLworb25ld2F5IGludGVyZmFjZSBJTWVkaWFCcm93c2VyU2VydmljZSB7CisgICAgdm9pZCBjb25uZWN0KFN0cmluZyBwa2csIGluIEJ1bmRsZSByb290SGludHMsIElNZWRpYUJyb3dzZXJTZXJ2aWNlQ2FsbGJhY2tzIGNhbGxiYWNrcyk7CisgICAgdm9pZCBkaXNjb25uZWN0KElNZWRpYUJyb3dzZXJTZXJ2aWNlQ2FsbGJhY2tzIGNhbGxiYWNrcyk7CisKKyAgICB2b2lkIGFkZFN1YnNjcmlwdGlvbkRlcHJlY2F0ZWQoU3RyaW5nIHVyaSwgSU1lZGlhQnJvd3NlclNlcnZpY2VDYWxsYmFja3MgY2FsbGJhY2tzKTsKKyAgICB2b2lkIHJlbW92ZVN1YnNjcmlwdGlvbkRlcHJlY2F0ZWQoU3RyaW5nIHVyaSwgSU1lZGlhQnJvd3NlclNlcnZpY2VDYWxsYmFja3MgY2FsbGJhY2tzKTsKKworICAgIHZvaWQgZ2V0TWVkaWFJdGVtKFN0cmluZyB1cmksIGluIFJlc3VsdFJlY2VpdmVyIGNiLCBJTWVkaWFCcm93c2VyU2VydmljZUNhbGxiYWNrcyBjYWxsYmFja3MpOworICAgIHZvaWQgYWRkU3Vic2NyaXB0aW9uKFN0cmluZyB1cmksIGluIElCaW5kZXIgdG9rZW4sIGluIEJ1bmRsZSBvcHRpb25zLAorICAgICAgICAgICAgSU1lZGlhQnJvd3NlclNlcnZpY2VDYWxsYmFja3MgY2FsbGJhY2tzKTsKKyAgICB2b2lkIHJlbW92ZVN1YnNjcmlwdGlvbihTdHJpbmcgdXJpLCBpbiBJQmluZGVyIHRva2VuLCBJTWVkaWFCcm93c2VyU2VydmljZUNhbGxiYWNrcyBjYWxsYmFja3MpOworfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL2FwZXgvamF2YS9hbmRyb2lkL3NlcnZpY2UvbWVkaWEvSU1lZGlhQnJvd3NlclNlcnZpY2VDYWxsYmFja3MuYWlkbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9hcGV4L2phdmEvYW5kcm9pZC9zZXJ2aWNlL21lZGlhL0lNZWRpYUJyb3dzZXJTZXJ2aWNlQ2FsbGJhY2tzLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNjMjgyNgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9hcGV4L2phdmEvYW5kcm9pZC9zZXJ2aWNlL21lZGlhL0lNZWRpYUJyb3dzZXJTZXJ2aWNlQ2FsbGJhY2tzLmFpZGwKQEAgLTAsMCArMSwyOCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworcGFja2FnZSBhbmRyb2lkLnNlcnZpY2UubWVkaWE7CisKKy8vaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYXJjZWxlZExpc3RTbGljZTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLnNlc3Npb24uTWVkaWFTZXNzaW9uOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworCisvKioKKyAqIE1lZGlhIEFQSSBhbGxvd3MgY2xpZW50cyB0byBicm93c2UgdGhyb3VnaCBoaWVyYXJjaHkgb2YgYSB1c2Vy4oCZcyBtZWRpYSBjb2xsZWN0aW9uLAorICogcGxheWJhY2sgYSBzcGVjaWZpYyBtZWRpYSBlbnRyeSBhbmQgaW50ZXJhY3Qgd2l0aCB0aGUgbm93IHBsYXlpbmcgcXVldWUuCisgKiBAaGlkZQorICovCitvbmV3YXkgaW50ZXJmYWNlIElNZWRpYUJyb3dzZXJTZXJ2aWNlQ2FsbGJhY2tzIHsKKyAgICAvKioKKyAgICAgKiBJbnZva2VkIHdoZW4gdGhlIGNvbm5lY3RlZCBoYXMgYmVlbiBlc3RhYmxpc2hlZC4KKyAgICAgKiBAcGFyYW0gcm9vdCBUaGUgcm9vdCBtZWRpYSBpZCBmb3IgYnJvd3NpbmcuCisgICAgICogQHBhcmFtIHNlc3Npb24gVGhlIHtAbGluayBNZWRpYVNlc3Npb24uVG9rZW4gbWVkaWEgc2Vzc2lvbiB0b2tlbn0gdGhhdCBjYW4gYmUgdXNlZCB0byBjb250cm9sCisgICAgICogICAgICAgICB0aGUgcGxheWJhY2sgb2YgdGhlIG1lZGlhIGFwcC4KKyAgICAgKiBAcGFyYW0gZXh0cmEgRXh0cmFzIHJldHVybmVkIGJ5IHRoZSBtZWRpYSBzZXJ2aWNlLgorICAgICAqLworICAgIHZvaWQgb25Db25uZWN0KFN0cmluZyByb290LCBpbiBNZWRpYVNlc3Npb24uVG9rZW4gc2Vzc2lvbiwgaW4gQnVuZGxlIGV4dHJhcyk7CisgICAgdm9pZCBvbkNvbm5lY3RGYWlsZWQoKTsKKyAgICAvL1RPRE86KGIvMTE5NzUwODA3KSBSZXNvbHZlIGhpZGRlbiBBUEkgdXNhZ2UgUGFyY2VsZWRMaXN0U2xpY2UuCisgICAgLy92b2lkIG9uTG9hZENoaWxkcmVuKFN0cmluZyBtZWRpYUlkLCBpbiBQYXJjZWxlZExpc3RTbGljZSBsaXN0KTsKKyAgICAvL3ZvaWQgb25Mb2FkQ2hpbGRyZW5XaXRoT3B0aW9ucyhTdHJpbmcgbWVkaWFJZCwgaW4gUGFyY2VsZWRMaXN0U2xpY2UgbGlzdCwgaW4gQnVuZGxlIG9wdGlvbnMpOworfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL2FwZXgvamF2YS9hbmRyb2lkL3NlcnZpY2UvbWVkaWEvTWVkaWFCcm93c2VyU2VydmljZS5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL2FwZXgvamF2YS9hbmRyb2lkL3NlcnZpY2UvbWVkaWEvTWVkaWFCcm93c2VyU2VydmljZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmMmZiYWYKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvYXBleC9qYXZhL2FuZHJvaWQvc2VydmljZS9tZWRpYS9NZWRpYUJyb3dzZXJTZXJ2aWNlLmphdmEKQEAgLTAsMCArMSw4NjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuc2VydmljZS5tZWRpYTsKKworaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5JbnREZWY7CitpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLk5vbk51bGw7CitpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLk51bGxhYmxlOworaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5TZGtDb25zdGFudDsKK2ltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uU2RrQ29uc3RhbnQuU2RrQ29uc3RhbnRUeXBlOworaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5VbnN1cHBvcnRlZEFwcFVzYWdlOworaW1wb3J0IGFuZHJvaWQuYXBwLlNlcnZpY2U7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7CisvL2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFyY2VsZWRMaXN0U2xpY2U7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5icm93c2UuTWVkaWFCcm93c2VyOworaW1wb3J0IGFuZHJvaWQubWVkaWEuYnJvd3NlLk1lZGlhQnJvd3NlclV0aWxzOworaW1wb3J0IGFuZHJvaWQubWVkaWEuc2Vzc2lvbi5NZWRpYVNlc3Npb247CitpbXBvcnQgYW5kcm9pZC5vcy5CaW5kZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQubWVkaWEuc2Vzc2lvbi5NZWRpYVNlc3Npb25NYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQubWVkaWEuc2Vzc2lvbi5NZWRpYVNlc3Npb25NYW5hZ2VyLlJlbW90ZVVzZXJJbmZvOworaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlc3VsdFJlY2VpdmVyOworaW1wb3J0IGFuZHJvaWQuc2VydmljZS5tZWRpYS5JTWVkaWFCcm93c2VyU2VydmljZTsKK2ltcG9ydCBhbmRyb2lkLnNlcnZpY2UubWVkaWEuSU1lZGlhQnJvd3NlclNlcnZpY2VDYWxsYmFja3M7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXJyYXlNYXA7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuUGFpcjsKKworaW1wb3J0IGphdmEuaW8uRmlsZURlc2NyaXB0b3I7CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBCYXNlIGNsYXNzIGZvciBtZWRpYSBicm93c2VyIHNlcnZpY2VzLgorICogPHA+CisgKiBNZWRpYSBicm93c2VyIHNlcnZpY2VzIGVuYWJsZSBhcHBsaWNhdGlvbnMgdG8gYnJvd3NlIG1lZGlhIGNvbnRlbnQgcHJvdmlkZWQgYnkgYW4gYXBwbGljYXRpb24KKyAqIGFuZCBhc2sgdGhlIGFwcGxpY2F0aW9uIHRvIHN0YXJ0IHBsYXlpbmcgaXQuIFRoZXkgbWF5IGFsc28gYmUgdXNlZCB0byBjb250cm9sIGNvbnRlbnQgdGhhdAorICogaXMgYWxyZWFkeSBwbGF5aW5nIGJ5IHdheSBvZiBhIHtAbGluayBNZWRpYVNlc3Npb259LgorICogPC9wPgorICoKKyAqIFRvIGV4dGVuZCB0aGlzIGNsYXNzLCB5b3UgbXVzdCBkZWNsYXJlIHRoZSBzZXJ2aWNlIGluIHlvdXIgbWFuaWZlc3QgZmlsZSB3aXRoCisgKiBhbiBpbnRlbnQgZmlsdGVyIHdpdGggdGhlIHtAbGluayAjU0VSVklDRV9JTlRFUkZBQ0V9IGFjdGlvbi4KKyAqCisgKiBGb3IgZXhhbXBsZToKKyAqIDwvcD48cHJlPgorICogJmx0O3NlcnZpY2UgYW5kcm9pZDpuYW1lPSIuTXlNZWRpYUJyb3dzZXJTZXJ2aWNlIgorICogICAgICAgICAgYW5kcm9pZDpsYWJlbD0iJiM2NDtzdHJpbmcvc2VydmljZV9uYW1lIiA+CisgKiAgICAgJmx0O2ludGVudC1maWx0ZXI+CisgKiAgICAgICAgICZsdDthY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLm1lZGlhLmJyb3dzZS5NZWRpYUJyb3dzZXJTZXJ2aWNlIiAvPgorICogICAgICZsdDsvaW50ZW50LWZpbHRlcj4KKyAqICZsdDsvc2VydmljZT4KKyAqIDwvcHJlPgorICoKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIE1lZGlhQnJvd3NlclNlcnZpY2UgZXh0ZW5kcyBTZXJ2aWNlIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk1lZGlhQnJvd3NlclNlcnZpY2UiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREJHID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBUaGUge0BsaW5rIEludGVudH0gdGhhdCBtdXN0IGJlIGRlY2xhcmVkIGFzIGhhbmRsZWQgYnkgdGhlIHNlcnZpY2UuCisgICAgICovCisgICAgQFNka0NvbnN0YW50KFNka0NvbnN0YW50VHlwZS5TRVJWSUNFX0FDVElPTikKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWSUNFX0lOVEVSRkFDRSA9ICJhbmRyb2lkLm1lZGlhLmJyb3dzZS5NZWRpYUJyb3dzZXJTZXJ2aWNlIjsKKworICAgIC8qKgorICAgICAqIEEga2V5IGZvciBwYXNzaW5nIHRoZSBNZWRpYUl0ZW0gdG8gdGhlIFJlc3VsdFJlY2VpdmVyIGluIGdldEl0ZW0uCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBAVW5zdXBwb3J0ZWRBcHBVc2FnZQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9NRURJQV9JVEVNID0gIm1lZGlhX2l0ZW0iOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJFU1VMVF9GTEFHX09QVElPTl9OT1RfSEFORExFRCA9IDEgPDwgMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUkVTVUxUX0ZMQUdfT05fTE9BRF9JVEVNX05PVF9JTVBMRU1FTlRFRCA9IDEgPDwgMTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRVNVTFRfRVJST1IgPSAtMTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUkVTVUxUX09LID0gMDsKKworICAgIC8qKiBAaGlkZSAqLworICAgIEBSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlNPVVJDRSkKKyAgICBASW50RGVmKGZsYWc9dHJ1ZSwgdmFsdWUgPSB7IFJFU1VMVF9GTEFHX09QVElPTl9OT1RfSEFORExFRCwKKyAgICAgICAgICAgIFJFU1VMVF9GTEFHX09OX0xPQURfSVRFTV9OT1RfSU1QTEVNRU5URUQgfSkKKyAgICBwcml2YXRlIEBpbnRlcmZhY2UgUmVzdWx0RmxhZ3MgeyB9CisKKyAgICBwcml2YXRlIGZpbmFsIEFycmF5TWFwPElCaW5kZXIsIENvbm5lY3Rpb25SZWNvcmQ+IG1Db25uZWN0aW9ucyA9IG5ldyBBcnJheU1hcDw+KCk7CisgICAgcHJpdmF0ZSBDb25uZWN0aW9uUmVjb3JkIG1DdXJDb25uZWN0aW9uOworICAgIHByaXZhdGUgZmluYWwgSGFuZGxlciBtSGFuZGxlciA9IG5ldyBIYW5kbGVyKCk7CisgICAgcHJpdmF0ZSBTZXJ2aWNlQmluZGVyIG1CaW5kZXI7CisgICAgTWVkaWFTZXNzaW9uLlRva2VuIG1TZXNzaW9uOworCisgICAgLyoqCisgICAgICogQWxsIHRoZSBpbmZvIGFib3V0IGEgY29ubmVjdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIGNsYXNzIENvbm5lY3Rpb25SZWNvcmQgaW1wbGVtZW50cyBJQmluZGVyLkRlYXRoUmVjaXBpZW50IHsKKyAgICAgICAgU3RyaW5nIHBrZzsKKyAgICAgICAgaW50IHVpZDsKKyAgICAgICAgaW50IHBpZDsKKyAgICAgICAgQnVuZGxlIHJvb3RIaW50czsKKyAgICAgICAgSU1lZGlhQnJvd3NlclNlcnZpY2VDYWxsYmFja3MgY2FsbGJhY2tzOworICAgICAgICBCcm93c2VyUm9vdCByb290OworICAgICAgICBIYXNoTWFwPFN0cmluZywgTGlzdDxQYWlyPElCaW5kZXIsIEJ1bmRsZT4+PiBzdWJzY3JpcHRpb25zID0gbmV3IEhhc2hNYXA8PigpOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBiaW5kZXJEaWVkKCkgeworICAgICAgICAgICAgbUhhbmRsZXIucG9zdChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICBtQ29ubmVjdGlvbnMucmVtb3ZlKGNhbGxiYWNrcy5hc0JpbmRlcigpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENvbXBsZXRpb24gaGFuZGxlciBmb3IgYXN5bmNocm9ub3VzIGNhbGxiYWNrIG1ldGhvZHMgaW4ge0BsaW5rIE1lZGlhQnJvd3NlclNlcnZpY2V9LgorICAgICAqIDxwPgorICAgICAqIEVhY2ggb2YgdGhlIG1ldGhvZHMgdGhhdCB0YWtlcyBvbmUgb2YgdGhlc2UgdG8gc2VuZCB0aGUgcmVzdWx0IG11c3QgY2FsbAorICAgICAqIHtAbGluayAjc2VuZFJlc3VsdH0gdG8gcmVzcG9uZCB0byB0aGUgY2FsbGVyIHdpdGggdGhlIGdpdmVuIHJlc3VsdHMuIElmIHRob3NlCisgICAgICogZnVuY3Rpb25zIHJldHVybiB3aXRob3V0IGNhbGxpbmcge0BsaW5rICNzZW5kUmVzdWx0fSwgdGhleSBtdXN0IGluc3RlYWQgY2FsbAorICAgICAqIHtAbGluayAjZGV0YWNofSBiZWZvcmUgcmV0dXJuaW5nLCBhbmQgdGhlbiBtYXkgY2FsbCB7QGxpbmsgI3NlbmRSZXN1bHR9IHdoZW4KKyAgICAgKiB0aGV5IGFyZSBkb25lLiBJZiBtb3JlIHRoYW4gb25lIG9mIHRob3NlIG1ldGhvZHMgaXMgY2FsbGVkLCBhbiBleGNlcHRpb24gd2lsbAorICAgICAqIGJlIHRocm93bi4KKyAgICAgKgorICAgICAqIEBzZWUgI29uTG9hZENoaWxkcmVuCisgICAgICogQHNlZSAjb25Mb2FkSXRlbQorICAgICAqLworICAgIHB1YmxpYyBjbGFzcyBSZXN1bHQ8VD4geworICAgICAgICBwcml2YXRlIE9iamVjdCBtRGVidWc7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtRGV0YWNoQ2FsbGVkOworICAgICAgICBwcml2YXRlIGJvb2xlYW4gbVNlbmRSZXN1bHRDYWxsZWQ7CisgICAgICAgIEBVbnN1cHBvcnRlZEFwcFVzYWdlCisgICAgICAgIHByaXZhdGUgaW50IG1GbGFnczsKKworICAgICAgICBSZXN1bHQoT2JqZWN0IGRlYnVnKSB7CisgICAgICAgICAgICBtRGVidWcgPSBkZWJ1ZzsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZW5kIHRoZSByZXN1bHQgYmFjayB0byB0aGUgY2FsbGVyLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2VuZFJlc3VsdChUIHJlc3VsdCkgeworICAgICAgICAgICAgaWYgKG1TZW5kUmVzdWx0Q2FsbGVkKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigic2VuZFJlc3VsdCgpIGNhbGxlZCB0d2ljZSBmb3I6ICIgKyBtRGVidWcpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVNlbmRSZXN1bHRDYWxsZWQgPSB0cnVlOworICAgICAgICAgICAgb25SZXN1bHRTZW50KHJlc3VsdCwgbUZsYWdzKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBEZXRhY2ggdGhpcyBtZXNzYWdlIGZyb20gdGhlIGN1cnJlbnQgdGhyZWFkIGFuZCBhbGxvdyB0aGUge0BsaW5rICNzZW5kUmVzdWx0fQorICAgICAgICAgKiBjYWxsIHRvIGhhcHBlbiBsYXRlci4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIGRldGFjaCgpIHsKKyAgICAgICAgICAgIGlmIChtRGV0YWNoQ2FsbGVkKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZGV0YWNoKCkgY2FsbGVkIHdoZW4gZGV0YWNoKCkgaGFkIGFscmVhZHkiCisgICAgICAgICAgICAgICAgICAgICAgICArICIgYmVlbiBjYWxsZWQgZm9yOiAiICsgbURlYnVnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtU2VuZFJlc3VsdENhbGxlZCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImRldGFjaCgpIGNhbGxlZCB3aGVuIHNlbmRSZXN1bHQoKSBoYWQgYWxyZWFkeSIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiBiZWVuIGNhbGxlZCBmb3I6ICIgKyBtRGVidWcpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbURldGFjaENhbGxlZCA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICBib29sZWFuIGlzRG9uZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtRGV0YWNoQ2FsbGVkIHx8IG1TZW5kUmVzdWx0Q2FsbGVkOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBzZXRGbGFncyhAUmVzdWx0RmxhZ3MgaW50IGZsYWdzKSB7CisgICAgICAgICAgICBtRmxhZ3MgPSBmbGFnczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgcmVzdWx0IGlzIHNlbnQsIGFmdGVyIGFzc2VydGlvbnMgYWJvdXQgbm90IGJlaW5nIGNhbGxlZCB0d2ljZQorICAgICAgICAgKiBoYXZlIGhhcHBlbmVkLgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBvblJlc3VsdFNlbnQoVCByZXN1bHQsIEBSZXN1bHRGbGFncyBpbnQgZmxhZ3MpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgU2VydmljZUJpbmRlciBleHRlbmRzIElNZWRpYUJyb3dzZXJTZXJ2aWNlLlN0dWIgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgY29ubmVjdChmaW5hbCBTdHJpbmcgcGtnLCBmaW5hbCBCdW5kbGUgcm9vdEhpbnRzLAorICAgICAgICAgICAgICAgIGZpbmFsIElNZWRpYUJyb3dzZXJTZXJ2aWNlQ2FsbGJhY2tzIGNhbGxiYWNrcykgeworCisgICAgICAgICAgICBmaW5hbCBpbnQgcGlkID0gQmluZGVyLmdldENhbGxpbmdQaWQoKTsKKyAgICAgICAgICAgIGZpbmFsIGludCB1aWQgPSBCaW5kZXIuZ2V0Q2FsbGluZ1VpZCgpOworICAgICAgICAgICAgaWYgKCFpc1ZhbGlkUGFja2FnZShwa2csIHVpZCkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJQYWNrYWdlL3VpZCBtaXNtYXRjaDogdWlkPSIgKyB1aWQKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiBwYWNrYWdlPSIgKyBwa2cpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtSGFuZGxlci5wb3N0KG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElCaW5kZXIgYiA9IGNhbGxiYWNrcy5hc0JpbmRlcigpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBDbGVhciBvdXQgdGhlIG9sZCBzdWJzY3JpcHRpb25zLiBXZSBhcmUgZ2V0dGluZyBuZXcgb25lcy4KKyAgICAgICAgICAgICAgICAgICAgICAgIG1Db25uZWN0aW9ucy5yZW1vdmUoYik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENvbm5lY3Rpb25SZWNvcmQgY29ubmVjdGlvbiA9IG5ldyBDb25uZWN0aW9uUmVjb3JkKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLnBrZyA9IHBrZzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24ucGlkID0gcGlkOworICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbi51aWQgPSB1aWQ7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLnJvb3RIaW50cyA9IHJvb3RIaW50czsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24uY2FsbGJhY2tzID0gY2FsbGJhY2tzOworCisgICAgICAgICAgICAgICAgICAgICAgICBtQ3VyQ29ubmVjdGlvbiA9IGNvbm5lY3Rpb247CisgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLnJvb3QgPSBNZWRpYUJyb3dzZXJTZXJ2aWNlLnRoaXMub25HZXRSb290KHBrZywgdWlkLCByb290SGludHMpOworICAgICAgICAgICAgICAgICAgICAgICAgbUN1ckNvbm5lY3Rpb24gPSBudWxsOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGV5IGRpZG4ndCByZXR1cm4gc29tZXRoaW5nLCBkb24ndCBhbGxvdyB0aGlzIGNsaWVudC4KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25uZWN0aW9uLnJvb3QgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIk5vIHJvb3QgZm9yIGNsaWVudCAiICsgcGtnICsgIiBmcm9tIHNlcnZpY2UgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBnZXRDbGFzcygpLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tzLm9uQ29ubmVjdEZhaWxlZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYWxsaW5nIG9uQ29ubmVjdEZhaWxlZCgpIGZhaWxlZC4gSWdub3JpbmcuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJwa2c9IiArIHBrZyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29ubmVjdGlvbnMucHV0KGIsIGNvbm5lY3Rpb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLmxpbmtUb0RlYXRoKGNvbm5lY3Rpb24sIDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVNlc3Npb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tzLm9uQ29ubmVjdChjb25uZWN0aW9uLnJvb3QuZ2V0Um9vdElkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uLCBjb25uZWN0aW9uLnJvb3QuZ2V0RXh0cmFzKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbGxpbmcgb25Db25uZWN0KCkgZmFpbGVkLiBEcm9wcGluZyBjbGllbnQuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJwa2c9IiArIHBrZyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db25uZWN0aW9ucy5yZW1vdmUoYik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZGlzY29ubmVjdChmaW5hbCBJTWVkaWFCcm93c2VyU2VydmljZUNhbGxiYWNrcyBjYWxsYmFja3MpIHsKKyAgICAgICAgICAgIG1IYW5kbGVyLnBvc3QobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSUJpbmRlciBiID0gY2FsbGJhY2tzLmFzQmluZGVyKCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIENsZWFyIG91dCB0aGUgb2xkIHN1YnNjcmlwdGlvbnMuIFdlIGFyZSBnZXR0aW5nIG5ldyBvbmVzLgorICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQ29ubmVjdGlvblJlY29yZCBvbGQgPSBtQ29ubmVjdGlvbnMucmVtb3ZlKGIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9sZCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZC5jYWxsYmFja3MuYXNCaW5kZXIoKS51bmxpbmtUb0RlYXRoKG9sZCwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBhZGRTdWJzY3JpcHRpb25EZXByZWNhdGVkKFN0cmluZyBpZCwgSU1lZGlhQnJvd3NlclNlcnZpY2VDYWxsYmFja3MgY2FsbGJhY2tzKSB7CisgICAgICAgICAgICAvLyBkby1ub3RoaW5nCisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgYWRkU3Vic2NyaXB0aW9uKGZpbmFsIFN0cmluZyBpZCwgZmluYWwgSUJpbmRlciB0b2tlbiwgZmluYWwgQnVuZGxlIG9wdGlvbnMsCisgICAgICAgICAgICAgICAgZmluYWwgSU1lZGlhQnJvd3NlclNlcnZpY2VDYWxsYmFja3MgY2FsbGJhY2tzKSB7CisgICAgICAgICAgICBtSGFuZGxlci5wb3N0KG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElCaW5kZXIgYiA9IGNhbGxiYWNrcy5hc0JpbmRlcigpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIHJlY29yZCBmb3IgdGhlIGNvbm5lY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENvbm5lY3Rpb25SZWNvcmQgY29ubmVjdGlvbiA9IG1Db25uZWN0aW9ucy5nZXQoYik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29ubmVjdGlvbiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiYWRkU3Vic2NyaXB0aW9uIGZvciBjYWxsYmFjayB0aGF0IGlzbid0IHJlZ2lzdGVyZWQgaWQ9IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGlkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhQnJvd3NlclNlcnZpY2UudGhpcy5hZGRTdWJzY3JpcHRpb24oaWQsIGNvbm5lY3Rpb24sIHRva2VuLCBvcHRpb25zKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZVN1YnNjcmlwdGlvbkRlcHJlY2F0ZWQoU3RyaW5nIGlkLCBJTWVkaWFCcm93c2VyU2VydmljZUNhbGxiYWNrcyBjYWxsYmFja3MpIHsKKyAgICAgICAgICAgIC8vIGRvLW5vdGhpbmcKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmVTdWJzY3JpcHRpb24oZmluYWwgU3RyaW5nIGlkLCBmaW5hbCBJQmluZGVyIHRva2VuLAorICAgICAgICAgICAgICAgIGZpbmFsIElNZWRpYUJyb3dzZXJTZXJ2aWNlQ2FsbGJhY2tzIGNhbGxiYWNrcykgeworICAgICAgICAgICAgbUhhbmRsZXIucG9zdChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBJQmluZGVyIGIgPSBjYWxsYmFja3MuYXNCaW5kZXIoKTsKKworICAgICAgICAgICAgICAgICAgICBDb25uZWN0aW9uUmVjb3JkIGNvbm5lY3Rpb24gPSBtQ29ubmVjdGlvbnMuZ2V0KGIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY29ubmVjdGlvbiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJyZW1vdmVTdWJzY3JpcHRpb24gZm9yIGNhbGxiYWNrIHRoYXQgaXNuJ3QgcmVnaXN0ZXJlZCBpZD0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgaWQpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICghTWVkaWFCcm93c2VyU2VydmljZS50aGlzLnJlbW92ZVN1YnNjcmlwdGlvbihpZCwgY29ubmVjdGlvbiwgdG9rZW4pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJyZW1vdmVTdWJzY3JpcHRpb24gY2FsbGVkIGZvciAiICsgaWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHdoaWNoIGlzIG5vdCBzdWJzY3JpYmVkIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBnZXRNZWRpYUl0ZW0oZmluYWwgU3RyaW5nIG1lZGlhSWQsIGZpbmFsIFJlc3VsdFJlY2VpdmVyIHJlY2VpdmVyLAorICAgICAgICAgICAgICAgIGZpbmFsIElNZWRpYUJyb3dzZXJTZXJ2aWNlQ2FsbGJhY2tzIGNhbGxiYWNrcykgeworICAgICAgICAgICAgbUhhbmRsZXIucG9zdChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBJQmluZGVyIGIgPSBjYWxsYmFja3MuYXNCaW5kZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGlvblJlY29yZCBjb25uZWN0aW9uID0gbUNvbm5lY3Rpb25zLmdldChiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvbm5lY3Rpb24gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiZ2V0TWVkaWFJdGVtIGZvciBjYWxsYmFjayB0aGF0IGlzbid0IHJlZ2lzdGVyZWQgaWQ9IiArIG1lZGlhSWQpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1Mb2FkSXRlbShtZWRpYUlkLCBjb25uZWN0aW9uLCByZWNlaXZlcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZSgpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoKTsKKyAgICAgICAgbUJpbmRlciA9IG5ldyBTZXJ2aWNlQmluZGVyKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIElCaW5kZXIgb25CaW5kKEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgaWYgKFNFUlZJQ0VfSU5URVJGQUNFLmVxdWFscyhpbnRlbnQuZ2V0QWN0aW9uKCkpKSB7CisgICAgICAgICAgICByZXR1cm4gbUJpbmRlcjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkdW1wKEZpbGVEZXNjcmlwdG9yIGZkLCBQcmludFdyaXRlciB3cml0ZXIsIFN0cmluZ1tdIGFyZ3MpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgdG8gZ2V0IHRoZSByb290IGluZm9ybWF0aW9uIGZvciBicm93c2luZyBieSBhIHBhcnRpY3VsYXIgY2xpZW50LgorICAgICAqIDxwPgorICAgICAqIFRoZSBpbXBsZW1lbnRhdGlvbiBzaG91bGQgdmVyaWZ5IHRoYXQgdGhlIGNsaWVudCBwYWNrYWdlIGhhcyBwZXJtaXNzaW9uCisgICAgICogdG8gYWNjZXNzIGJyb3dzZSBtZWRpYSBpbmZvcm1hdGlvbiBiZWZvcmUgcmV0dXJuaW5nIHRoZSByb290IGlkOyBpdAorICAgICAqIHNob3VsZCByZXR1cm4gbnVsbCBpZiB0aGUgY2xpZW50IGlzIG5vdCBhbGxvd2VkIHRvIGFjY2VzcyB0aGlzCisgICAgICogaW5mb3JtYXRpb24uCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIGNsaWVudFBhY2thZ2VOYW1lIFRoZSBwYWNrYWdlIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIHdoaWNoIGlzCisgICAgICogICAgICAgICAgICByZXF1ZXN0aW5nIGFjY2VzcyB0byBicm93c2UgbWVkaWEuCisgICAgICogQHBhcmFtIGNsaWVudFVpZCBUaGUgdWlkIG9mIHRoZSBhcHBsaWNhdGlvbiB3aGljaCBpcyByZXF1ZXN0aW5nIGFjY2VzcyB0bworICAgICAqICAgICAgICAgICAgYnJvd3NlIG1lZGlhLgorICAgICAqIEBwYXJhbSByb290SGludHMgQW4gb3B0aW9uYWwgYnVuZGxlIG9mIHNlcnZpY2Utc3BlY2lmaWMgYXJndW1lbnRzIHRvIHNlbmQKKyAgICAgKiAgICAgICAgICAgIHRvIHRoZSBtZWRpYSBicm93c2VyIHNlcnZpY2Ugd2hlbiBjb25uZWN0aW5nIGFuZCByZXRyaWV2aW5nIHRoZQorICAgICAqICAgICAgICAgICAgcm9vdCBpZCBmb3IgYnJvd3NpbmcsIG9yIG51bGwgaWYgbm9uZS4gVGhlIGNvbnRlbnRzIG9mIHRoaXMKKyAgICAgKiAgICAgICAgICAgIGJ1bmRsZSBtYXkgYWZmZWN0IHRoZSBpbmZvcm1hdGlvbiByZXR1cm5lZCB3aGVuIGJyb3dzaW5nLgorICAgICAqIEByZXR1cm4gVGhlIHtAbGluayBCcm93c2VyUm9vdH0gZm9yIGFjY2Vzc2luZyB0aGlzIGFwcCdzIGNvbnRlbnQgb3IgbnVsbC4KKyAgICAgKiBAc2VlIEJyb3dzZXJSb290I0VYVFJBX1JFQ0VOVAorICAgICAqIEBzZWUgQnJvd3NlclJvb3QjRVhUUkFfT0ZGTElORQorICAgICAqIEBzZWUgQnJvd3NlclJvb3QjRVhUUkFfU1VHR0VTVEVECisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IEBOdWxsYWJsZSBCcm93c2VyUm9vdCBvbkdldFJvb3QoQE5vbk51bGwgU3RyaW5nIGNsaWVudFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgaW50IGNsaWVudFVpZCwgQE51bGxhYmxlIEJ1bmRsZSByb290SGludHMpOworCisgICAgLyoqCisgICAgICogQ2FsbGVkIHRvIGdldCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY2hpbGRyZW4gb2YgYSBtZWRpYSBpdGVtLgorICAgICAqIDxwPgorICAgICAqIEltcGxlbWVudGF0aW9ucyBtdXN0IGNhbGwge0BsaW5rIFJlc3VsdCNzZW5kUmVzdWx0IHJlc3VsdC5zZW5kUmVzdWx0fQorICAgICAqIHdpdGggdGhlIGxpc3Qgb2YgY2hpbGRyZW4uIElmIGxvYWRpbmcgdGhlIGNoaWxkcmVuIHdpbGwgYmUgYW4gZXhwZW5zaXZlCisgICAgICogb3BlcmF0aW9uIHRoYXQgc2hvdWxkIGJlIHBlcmZvcm1lZCBvbiBhbm90aGVyIHRocmVhZCwKKyAgICAgKiB7QGxpbmsgUmVzdWx0I2RldGFjaCByZXN1bHQuZGV0YWNofSBtYXkgYmUgY2FsbGVkIGJlZm9yZSByZXR1cm5pbmcgZnJvbQorICAgICAqIHRoaXMgZnVuY3Rpb24sIGFuZCB0aGVuIHtAbGluayBSZXN1bHQjc2VuZFJlc3VsdCByZXN1bHQuc2VuZFJlc3VsdH0KKyAgICAgKiBjYWxsZWQgd2hlbiB0aGUgbG9hZGluZyBpcyBjb21wbGV0ZS4KKyAgICAgKiA8L3A+PHA+CisgICAgICogSW4gY2FzZSB0aGUgbWVkaWEgaXRlbSBkb2VzIG5vdCBoYXZlIGFueSBjaGlsZHJlbiwgY2FsbCB7QGxpbmsgUmVzdWx0I3NlbmRSZXN1bHR9CisgICAgICogd2l0aCBhbiBlbXB0eSBsaXN0LiBXaGVuIHRoZSBnaXZlbiB7QGNvZGUgcGFyZW50SWR9IGlzIGludmFsaWQsIGltcGxlbWVudGF0aW9ucyBtdXN0CisgICAgICogY2FsbCB7QGxpbmsgUmVzdWx0I3NlbmRSZXN1bHQgcmVzdWx0LnNlbmRSZXN1bHR9IHdpdGgge0Bjb2RlIG51bGx9LCB3aGljaCB3aWxsIGludm9rZQorICAgICAqIHtAbGluayBNZWRpYUJyb3dzZXIuU3Vic2NyaXB0aW9uQ2FsbGJhY2sjb25FcnJvcn0uCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIHBhcmVudElkIFRoZSBpZCBvZiB0aGUgcGFyZW50IG1lZGlhIGl0ZW0gd2hvc2UgY2hpbGRyZW4gYXJlIHRvIGJlCisgICAgICogICAgICAgICAgICBxdWVyaWVkLgorICAgICAqIEBwYXJhbSByZXN1bHQgVGhlIFJlc3VsdCB0byBzZW5kIHRoZSBsaXN0IG9mIGNoaWxkcmVuIHRvLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIG9uTG9hZENoaWxkcmVuKEBOb25OdWxsIFN0cmluZyBwYXJlbnRJZCwKKyAgICAgICAgICAgIEBOb25OdWxsIFJlc3VsdDxMaXN0PE1lZGlhQnJvd3Nlci5NZWRpYUl0ZW0+PiByZXN1bHQpOworCisgICAgLyoqCisgICAgICogQ2FsbGVkIHRvIGdldCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY2hpbGRyZW4gb2YgYSBtZWRpYSBpdGVtLgorICAgICAqIDxwPgorICAgICAqIEltcGxlbWVudGF0aW9ucyBtdXN0IGNhbGwge0BsaW5rIFJlc3VsdCNzZW5kUmVzdWx0IHJlc3VsdC5zZW5kUmVzdWx0fQorICAgICAqIHdpdGggdGhlIGxpc3Qgb2YgY2hpbGRyZW4uIElmIGxvYWRpbmcgdGhlIGNoaWxkcmVuIHdpbGwgYmUgYW4gZXhwZW5zaXZlCisgICAgICogb3BlcmF0aW9uIHRoYXQgc2hvdWxkIGJlIHBlcmZvcm1lZCBvbiBhbm90aGVyIHRocmVhZCwKKyAgICAgKiB7QGxpbmsgUmVzdWx0I2RldGFjaCByZXN1bHQuZGV0YWNofSBtYXkgYmUgY2FsbGVkIGJlZm9yZSByZXR1cm5pbmcgZnJvbQorICAgICAqIHRoaXMgZnVuY3Rpb24sIGFuZCB0aGVuIHtAbGluayBSZXN1bHQjc2VuZFJlc3VsdCByZXN1bHQuc2VuZFJlc3VsdH0KKyAgICAgKiBjYWxsZWQgd2hlbiB0aGUgbG9hZGluZyBpcyBjb21wbGV0ZS4KKyAgICAgKiA8L3A+PHA+CisgICAgICogSW4gY2FzZSB0aGUgbWVkaWEgaXRlbSBkb2VzIG5vdCBoYXZlIGFueSBjaGlsZHJlbiwgY2FsbCB7QGxpbmsgUmVzdWx0I3NlbmRSZXN1bHR9CisgICAgICogd2l0aCBhbiBlbXB0eSBsaXN0LiBXaGVuIHRoZSBnaXZlbiB7QGNvZGUgcGFyZW50SWR9IGlzIGludmFsaWQsIGltcGxlbWVudGF0aW9ucyBtdXN0CisgICAgICogY2FsbCB7QGxpbmsgUmVzdWx0I3NlbmRSZXN1bHQgcmVzdWx0LnNlbmRSZXN1bHR9IHdpdGgge0Bjb2RlIG51bGx9LCB3aGljaCB3aWxsIGludm9rZQorICAgICAqIHtAbGluayBNZWRpYUJyb3dzZXIuU3Vic2NyaXB0aW9uQ2FsbGJhY2sjb25FcnJvcn0uCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIHBhcmVudElkIFRoZSBpZCBvZiB0aGUgcGFyZW50IG1lZGlhIGl0ZW0gd2hvc2UgY2hpbGRyZW4gYXJlIHRvIGJlCisgICAgICogICAgICAgICAgICBxdWVyaWVkLgorICAgICAqIEBwYXJhbSByZXN1bHQgVGhlIFJlc3VsdCB0byBzZW5kIHRoZSBsaXN0IG9mIGNoaWxkcmVuIHRvLgorICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBidW5kbGUgb2Ygc2VydmljZS1zcGVjaWZpYyBhcmd1bWVudHMgc2VudCBmcm9tIHRoZSBtZWRpYQorICAgICAqICAgICAgICAgICAgYnJvd3Nlci4gVGhlIGluZm9ybWF0aW9uIHJldHVybmVkIHRocm91Z2ggdGhlIHJlc3VsdCBzaG91bGQgYmUKKyAgICAgKiAgICAgICAgICAgIGFmZmVjdGVkIGJ5IHRoZSBjb250ZW50cyBvZiB0aGlzIGJ1bmRsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvbkxvYWRDaGlsZHJlbihATm9uTnVsbCBTdHJpbmcgcGFyZW50SWQsCisgICAgICAgICAgICBATm9uTnVsbCBSZXN1bHQ8TGlzdDxNZWRpYUJyb3dzZXIuTWVkaWFJdGVtPj4gcmVzdWx0LCBATm9uTnVsbCBCdW5kbGUgb3B0aW9ucykgeworICAgICAgICAvLyBUbyBzdXBwb3J0IGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIHdoZW4gdGhlIGltcGxlbWVudGF0aW9uIG9mIE1lZGlhQnJvd3NlclNlcnZpY2UgZG9lc24ndAorICAgICAgICAvLyBvdmVycmlkZSBvbkxvYWRDaGlsZHJlbigpIHdpdGggb3B0aW9ucywgb25Mb2FkQ2hpbGRyZW4oKSB3aXRob3V0IG9wdGlvbnMgd2lsbCBiZSB1c2VkCisgICAgICAgIC8vIGluc3RlYWQsIGFuZCB0aGUgb3B0aW9ucyB3aWxsIGJlIGFwcGxpZWQgaW4gdGhlIGltcGxlbWVudGF0aW9uIG9mIHJlc3VsdC5vblJlc3VsdFNlbnQoKS4KKyAgICAgICAgcmVzdWx0LnNldEZsYWdzKFJFU1VMVF9GTEFHX09QVElPTl9OT1RfSEFORExFRCk7CisgICAgICAgIG9uTG9hZENoaWxkcmVuKHBhcmVudElkLCByZXN1bHQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxlZCB0byBnZXQgaW5mb3JtYXRpb24gYWJvdXQgYSBzcGVjaWZpYyBtZWRpYSBpdGVtLgorICAgICAqIDxwPgorICAgICAqIEltcGxlbWVudGF0aW9ucyBtdXN0IGNhbGwge0BsaW5rIFJlc3VsdCNzZW5kUmVzdWx0IHJlc3VsdC5zZW5kUmVzdWx0fS4gSWYKKyAgICAgKiBsb2FkaW5nIHRoZSBpdGVtIHdpbGwgYmUgYW4gZXhwZW5zaXZlIG9wZXJhdGlvbiB7QGxpbmsgUmVzdWx0I2RldGFjaAorICAgICAqIHJlc3VsdC5kZXRhY2h9IG1heSBiZSBjYWxsZWQgYmVmb3JlIHJldHVybmluZyBmcm9tIHRoaXMgZnVuY3Rpb24sIGFuZAorICAgICAqIHRoZW4ge0BsaW5rIFJlc3VsdCNzZW5kUmVzdWx0IHJlc3VsdC5zZW5kUmVzdWx0fSBjYWxsZWQgd2hlbiB0aGUgaXRlbSBoYXMKKyAgICAgKiBiZWVuIGxvYWRlZC4KKyAgICAgKiA8L3A+PHA+CisgICAgICogV2hlbiB0aGUgZ2l2ZW4ge0Bjb2RlIGl0ZW1JZH0gaXMgaW52YWxpZCwgaW1wbGVtZW50YXRpb25zIG11c3QgY2FsbAorICAgICAqIHtAbGluayBSZXN1bHQjc2VuZFJlc3VsdCByZXN1bHQuc2VuZFJlc3VsdH0gd2l0aCB7QGNvZGUgbnVsbH0uCisgICAgICogPC9wPjxwPgorICAgICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHdpbGwgaW52b2tlIHtAbGluayBNZWRpYUJyb3dzZXIuSXRlbUNhbGxiYWNrI29uRXJyb3J9LgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpdGVtSWQgVGhlIGlkIGZvciB0aGUgc3BlY2lmaWMKKyAgICAgKiAgICAgICAgICAgIHtAbGluayBhbmRyb2lkLm1lZGlhLmJyb3dzZS5NZWRpYUJyb3dzZXIuTWVkaWFJdGVtfS4KKyAgICAgKiBAcGFyYW0gcmVzdWx0IFRoZSBSZXN1bHQgdG8gc2VuZCB0aGUgaXRlbSB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvbkxvYWRJdGVtKFN0cmluZyBpdGVtSWQsIFJlc3VsdDxNZWRpYUJyb3dzZXIuTWVkaWFJdGVtPiByZXN1bHQpIHsKKyAgICAgICAgcmVzdWx0LnNldEZsYWdzKFJFU1VMVF9GTEFHX09OX0xPQURfSVRFTV9OT1RfSU1QTEVNRU5URUQpOworICAgICAgICByZXN1bHQuc2VuZFJlc3VsdChudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsIHRvIHNldCB0aGUgbWVkaWEgc2Vzc2lvbi4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIHNob3VsZCBiZSBjYWxsZWQgYXMgc29vbiBhcyBwb3NzaWJsZSBkdXJpbmcgdGhlIHNlcnZpY2UncyBzdGFydHVwLgorICAgICAqIEl0IG1heSBvbmx5IGJlIGNhbGxlZCBvbmNlLgorICAgICAqCisgICAgICogQHBhcmFtIHRva2VuIFRoZSB0b2tlbiBmb3IgdGhlIHNlcnZpY2UncyB7QGxpbmsgTWVkaWFTZXNzaW9ufS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTZXNzaW9uVG9rZW4oZmluYWwgTWVkaWFTZXNzaW9uLlRva2VuIHRva2VuKSB7CisgICAgICAgIGlmICh0b2tlbiA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTZXNzaW9uIHRva2VuIG1heSBub3QgYmUgbnVsbC4iKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobVNlc3Npb24gIT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVGhlIHNlc3Npb24gdG9rZW4gaGFzIGFscmVhZHkgYmVlbiBzZXQuIik7CisgICAgICAgIH0KKyAgICAgICAgbVNlc3Npb24gPSB0b2tlbjsKKyAgICAgICAgbUhhbmRsZXIucG9zdChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICBJdGVyYXRvcjxDb25uZWN0aW9uUmVjb3JkPiBpdGVyID0gbUNvbm5lY3Rpb25zLnZhbHVlcygpLml0ZXJhdG9yKCk7CisgICAgICAgICAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKXsKKyAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGlvblJlY29yZCBjb25uZWN0aW9uID0gaXRlci5uZXh0KCk7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLmNhbGxiYWNrcy5vbkNvbm5lY3QoY29ubmVjdGlvbi5yb290LmdldFJvb3RJZCgpLCB0b2tlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbi5yb290LmdldEV4dHJhcygpKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNvbm5lY3Rpb24gZm9yICIgKyBjb25uZWN0aW9uLnBrZyArICIgaXMgbm8gbG9uZ2VyIHZhbGlkLiIpOworICAgICAgICAgICAgICAgICAgICAgICAgaXRlci5yZW1vdmUoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgc2Vzc2lvbiB0b2tlbiwgb3IgbnVsbCBpZiBpdCBoYXMgbm90IHlldCBiZWVuIGNyZWF0ZWQKKyAgICAgKiBvciBpZiBpdCBoYXMgYmVlbiBkZXN0cm95ZWQuCisgICAgICovCisgICAgcHVibGljIEBOdWxsYWJsZSBNZWRpYVNlc3Npb24uVG9rZW4gZ2V0U2Vzc2lvblRva2VuKCkgeworICAgICAgICByZXR1cm4gbVNlc3Npb247CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgcm9vdCBoaW50cyBzZW50IGZyb20gdGhlIGN1cnJlbnRseSBjb25uZWN0ZWQge0BsaW5rIE1lZGlhQnJvd3Nlcn0uCisgICAgICogVGhlIHJvb3QgaGludHMgYXJlIHNlcnZpY2Utc3BlY2lmaWMgYXJndW1lbnRzIGluY2x1ZGVkIGluIGFuIG9wdGlvbmFsIGJ1bmRsZSBzZW50IHRvIHRoZQorICAgICAqIG1lZGlhIGJyb3dzZXIgc2VydmljZSB3aGVuIGNvbm5lY3RpbmcgYW5kIHJldHJpZXZpbmcgdGhlIHJvb3QgaWQgZm9yIGJyb3dzaW5nLCBvciBudWxsIGlmCisgICAgICogbm9uZS4gVGhlIGNvbnRlbnRzIG9mIHRoaXMgYnVuZGxlIG1heSBhZmZlY3QgdGhlIGluZm9ybWF0aW9uIHJldHVybmVkIHdoZW4gYnJvd3NpbmcuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBJZiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgb3V0c2lkZSBvZiB7QGxpbmsgI29uR2V0Um9vdH0gb3IKKyAgICAgKiAgICAgICAgICAgICB7QGxpbmsgI29uTG9hZENoaWxkcmVufSBvciB7QGxpbmsgI29uTG9hZEl0ZW19LgorICAgICAqIEBzZWUgTWVkaWFCcm93c2VyU2VydmljZS5Ccm93c2VyUm9vdCNFWFRSQV9SRUNFTlQKKyAgICAgKiBAc2VlIE1lZGlhQnJvd3NlclNlcnZpY2UuQnJvd3NlclJvb3QjRVhUUkFfT0ZGTElORQorICAgICAqIEBzZWUgTWVkaWFCcm93c2VyU2VydmljZS5Ccm93c2VyUm9vdCNFWFRSQV9TVUdHRVNURUQKKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgQnVuZGxlIGdldEJyb3dzZXJSb290SGludHMoKSB7CisgICAgICAgIGlmIChtQ3VyQ29ubmVjdGlvbiA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUaGlzIHNob3VsZCBiZSBjYWxsZWQgaW5zaWRlIG9mIG9uR2V0Um9vdCBvciIKKyAgICAgICAgICAgICAgICAgICAgKyAiIG9uTG9hZENoaWxkcmVuIG9yIG9uTG9hZEl0ZW0gbWV0aG9kcyIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtQ3VyQ29ubmVjdGlvbi5yb290SGludHMgPT0gbnVsbCA/IG51bGwgOiBuZXcgQnVuZGxlKG1DdXJDb25uZWN0aW9uLnJvb3RIaW50cyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgYnJvd3NlciBpbmZvcm1hdGlvbiB3aG8gc2VudCB0aGUgY3VycmVudCByZXF1ZXN0LgorICAgICAqCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gSWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkIG91dHNpZGUgb2Yge0BsaW5rICNvbkdldFJvb3R9IG9yCisgICAgICogICAgICAgICAgICAge0BsaW5rICNvbkxvYWRDaGlsZHJlbn0gb3Ige0BsaW5rICNvbkxvYWRJdGVtfS4KKyAgICAgKiBAc2VlIE1lZGlhU2Vzc2lvbk1hbmFnZXIjaXNUcnVzdGVkRm9yTWVkaWFDb250cm9sKFJlbW90ZVVzZXJJbmZvKQorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBSZW1vdGVVc2VySW5mbyBnZXRDdXJyZW50QnJvd3NlckluZm8oKSB7CisgICAgICAgIGlmIChtQ3VyQ29ubmVjdGlvbiA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUaGlzIHNob3VsZCBiZSBjYWxsZWQgaW5zaWRlIG9mIG9uR2V0Um9vdCBvciIKKyAgICAgICAgICAgICAgICAgICAgKyAiIG9uTG9hZENoaWxkcmVuIG9yIG9uTG9hZEl0ZW0gbWV0aG9kcyIpOworICAgICAgICB9CisgICAgICAgIC8vVE9ETyhiLzExOTc1MjIwNSk6IFJlc29sdmUgaGlkZGVuIEFQSSB1c2FnZS4gNC1wYXJhbSBjb25zdHJ1Y3RvciBvZiBSZW1vdGVVc2VySW5mbworICAgICAgICAvKgorICAgICAgICByZXR1cm4gbmV3IFJlbW90ZVVzZXJJbmZvKG1DdXJDb25uZWN0aW9uLnBrZywgbUN1ckNvbm5lY3Rpb24ucGlkLCBtQ3VyQ29ubmVjdGlvbi51aWQsCisgICAgICAgICAgICAgICAgbUN1ckNvbm5lY3Rpb24uY2FsbGJhY2tzLmFzQmluZGVyKCkpOworICAgICAgICAqLworICAgICAgICByZXR1cm4gbmV3IFJlbW90ZVVzZXJJbmZvKG1DdXJDb25uZWN0aW9uLnBrZywgbUN1ckNvbm5lY3Rpb24ucGlkLCBtQ3VyQ29ubmVjdGlvbi51aWQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE5vdGlmaWVzIGFsbCBjb25uZWN0ZWQgbWVkaWEgYnJvd3NlcnMgdGhhdCB0aGUgY2hpbGRyZW4gb2YKKyAgICAgKiB0aGUgc3BlY2lmaWVkIHBhcmVudCBpZCBoYXZlIGNoYW5nZWQgaW4gc29tZSB3YXkuCisgICAgICogVGhpcyB3aWxsIGNhdXNlIGJyb3dzZXJzIHRvIGZldGNoIHN1YnNjcmliZWQgY29udGVudCBhZ2Fpbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJlbnRJZCBUaGUgaWQgb2YgdGhlIHBhcmVudCBtZWRpYSBpdGVtIHdob3NlCisgICAgICogY2hpbGRyZW4gY2hhbmdlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBub3RpZnlDaGlsZHJlbkNoYW5nZWQoQE5vbk51bGwgU3RyaW5nIHBhcmVudElkKSB7CisgICAgICAgIG5vdGlmeUNoaWxkcmVuQ2hhbmdlZEludGVybmFsKHBhcmVudElkLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBOb3RpZmllcyBhbGwgY29ubmVjdGVkIG1lZGlhIGJyb3dzZXJzIHRoYXQgdGhlIGNoaWxkcmVuIG9mCisgICAgICogdGhlIHNwZWNpZmllZCBwYXJlbnQgaWQgaGF2ZSBjaGFuZ2VkIGluIHNvbWUgd2F5LgorICAgICAqIFRoaXMgd2lsbCBjYXVzZSBicm93c2VycyB0byBmZXRjaCBzdWJzY3JpYmVkIGNvbnRlbnQgYWdhaW4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFyZW50SWQgVGhlIGlkIG9mIHRoZSBwYXJlbnQgbWVkaWEgaXRlbSB3aG9zZQorICAgICAqICAgICAgICAgICAgY2hpbGRyZW4gY2hhbmdlZC4KKyAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgYnVuZGxlIG9mIHNlcnZpY2Utc3BlY2lmaWMgYXJndW1lbnRzIHRvIHNlbmQKKyAgICAgKiAgICAgICAgICAgIHRvIHRoZSBtZWRpYSBicm93c2VyLiBUaGUgY29udGVudHMgb2YgdGhpcyBidW5kbGUgbWF5CisgICAgICogICAgICAgICAgICBjb250YWluIHRoZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY2hhbmdlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG5vdGlmeUNoaWxkcmVuQ2hhbmdlZChATm9uTnVsbCBTdHJpbmcgcGFyZW50SWQsIEBOb25OdWxsIEJ1bmRsZSBvcHRpb25zKSB7CisgICAgICAgIGlmIChvcHRpb25zID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm9wdGlvbnMgY2Fubm90IGJlIG51bGwgaW4gbm90aWZ5Q2hpbGRyZW5DaGFuZ2VkIik7CisgICAgICAgIH0KKyAgICAgICAgbm90aWZ5Q2hpbGRyZW5DaGFuZ2VkSW50ZXJuYWwocGFyZW50SWQsIG9wdGlvbnMpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBub3RpZnlDaGlsZHJlbkNoYW5nZWRJbnRlcm5hbChmaW5hbCBTdHJpbmcgcGFyZW50SWQsIGZpbmFsIEJ1bmRsZSBvcHRpb25zKSB7CisgICAgICAgIGlmIChwYXJlbnRJZCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJwYXJlbnRJZCBjYW5ub3QgYmUgbnVsbCBpbiBub3RpZnlDaGlsZHJlbkNoYW5nZWQiKTsKKyAgICAgICAgfQorICAgICAgICBtSGFuZGxlci5wb3N0KG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIGZvciAoSUJpbmRlciBiaW5kZXIgOiBtQ29ubmVjdGlvbnMua2V5U2V0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGlvblJlY29yZCBjb25uZWN0aW9uID0gbUNvbm5lY3Rpb25zLmdldChiaW5kZXIpOworICAgICAgICAgICAgICAgICAgICBMaXN0PFBhaXI8SUJpbmRlciwgQnVuZGxlPj4gY2FsbGJhY2tMaXN0ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLnN1YnNjcmlwdGlvbnMuZ2V0KHBhcmVudElkKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrTGlzdCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKFBhaXI8SUJpbmRlciwgQnVuZGxlPiBjYWxsYmFjayA6IGNhbGxiYWNrTGlzdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChNZWRpYUJyb3dzZXJVdGlscy5oYXNEdXBsaWNhdGVkSXRlbXMob3B0aW9ucywgY2FsbGJhY2suc2Vjb25kKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtTG9hZENoaWxkcmVuKHBhcmVudElkLCBjb25uZWN0aW9uLCBjYWxsYmFjay5zZWNvbmQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHdoZXRoZXIgdGhlIGdpdmVuIHBhY2thZ2UgaXMgb25lIG9mIHRoZSBvbmVzIHRoYXQgaXMgb3duZWQgYnkgdGhlIHVpZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gaXNWYWxpZFBhY2thZ2UoU3RyaW5nIHBrZywgaW50IHVpZCkgeworICAgICAgICBpZiAocGtnID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBQYWNrYWdlTWFuYWdlciBwbSA9IGdldFBhY2thZ2VNYW5hZ2VyKCk7CisgICAgICAgIGZpbmFsIFN0cmluZ1tdIHBhY2thZ2VzID0gcG0uZ2V0UGFja2FnZXNGb3JVaWQodWlkKTsKKyAgICAgICAgZmluYWwgaW50IE4gPSBwYWNrYWdlcy5sZW5ndGg7CisgICAgICAgIGZvciAoaW50IGk9MDsgaTxOOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChwYWNrYWdlc1tpXS5lcXVhbHMocGtnKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTYXZlIHRoZSBzdWJzY3JpcHRpb24gYW5kIGlmIGl0IGlzIGEgbmV3IHN1YnNjcmlwdGlvbiBzZW5kIHRoZSByZXN1bHRzLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBhZGRTdWJzY3JpcHRpb24oU3RyaW5nIGlkLCBDb25uZWN0aW9uUmVjb3JkIGNvbm5lY3Rpb24sIElCaW5kZXIgdG9rZW4sCisgICAgICAgICAgICBCdW5kbGUgb3B0aW9ucykgeworICAgICAgICAvLyBTYXZlIHRoZSBzdWJzY3JpcHRpb24KKyAgICAgICAgTGlzdDxQYWlyPElCaW5kZXIsIEJ1bmRsZT4+IGNhbGxiYWNrTGlzdCA9IGNvbm5lY3Rpb24uc3Vic2NyaXB0aW9ucy5nZXQoaWQpOworICAgICAgICBpZiAoY2FsbGJhY2tMaXN0ID09IG51bGwpIHsKKyAgICAgICAgICAgIGNhbGxiYWNrTGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICB9CisgICAgICAgIGZvciAoUGFpcjxJQmluZGVyLCBCdW5kbGU+IGNhbGxiYWNrIDogY2FsbGJhY2tMaXN0KSB7CisgICAgICAgICAgICBpZiAodG9rZW4gPT0gY2FsbGJhY2suZmlyc3QKKyAgICAgICAgICAgICAgICAgICAgJiYgTWVkaWFCcm93c2VyVXRpbHMuYXJlU2FtZU9wdGlvbnMob3B0aW9ucywgY2FsbGJhY2suc2Vjb25kKSkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjYWxsYmFja0xpc3QuYWRkKG5ldyBQYWlyPD4odG9rZW4sIG9wdGlvbnMpKTsKKyAgICAgICAgY29ubmVjdGlvbi5zdWJzY3JpcHRpb25zLnB1dChpZCwgY2FsbGJhY2tMaXN0KTsKKyAgICAgICAgLy8gc2VuZCB0aGUgcmVzdWx0cworICAgICAgICBwZXJmb3JtTG9hZENoaWxkcmVuKGlkLCBjb25uZWN0aW9uLCBvcHRpb25zKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgdGhlIHN1YnNjcmlwdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gcmVtb3ZlU3Vic2NyaXB0aW9uKFN0cmluZyBpZCwgQ29ubmVjdGlvblJlY29yZCBjb25uZWN0aW9uLCBJQmluZGVyIHRva2VuKSB7CisgICAgICAgIGlmICh0b2tlbiA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gY29ubmVjdGlvbi5zdWJzY3JpcHRpb25zLnJlbW92ZShpZCkgIT0gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBib29sZWFuIHJlbW92ZWQgPSBmYWxzZTsKKyAgICAgICAgTGlzdDxQYWlyPElCaW5kZXIsIEJ1bmRsZT4+IGNhbGxiYWNrTGlzdCA9IGNvbm5lY3Rpb24uc3Vic2NyaXB0aW9ucy5nZXQoaWQpOworICAgICAgICBpZiAoY2FsbGJhY2tMaXN0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIEl0ZXJhdG9yPFBhaXI8SUJpbmRlciwgQnVuZGxlPj4gaXRlciA9IGNhbGxiYWNrTGlzdC5pdGVyYXRvcigpOworICAgICAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKXsKKyAgICAgICAgICAgICAgICBpZiAodG9rZW4gPT0gaXRlci5uZXh0KCkuZmlyc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVtb3ZlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGl0ZXIucmVtb3ZlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNhbGxiYWNrTGlzdC5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24uc3Vic2NyaXB0aW9ucy5yZW1vdmUoaWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiByZW1vdmVkOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGwgb25Mb2FkQ2hpbGRyZW4gYW5kIHRoZW4gc2VuZCB0aGUgcmVzdWx0cyBiYWNrIHRvIHRoZSBjb25uZWN0aW9uLgorICAgICAqIDxwPgorICAgICAqIENhbGxlcnMgbXVzdCBtYWtlIHN1cmUgdGhhdCB0aGlzIGNvbm5lY3Rpb24gaXMgc3RpbGwgY29ubmVjdGVkLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBwZXJmb3JtTG9hZENoaWxkcmVuKGZpbmFsIFN0cmluZyBwYXJlbnRJZCwgZmluYWwgQ29ubmVjdGlvblJlY29yZCBjb25uZWN0aW9uLAorICAgICAgICAgICAgZmluYWwgQnVuZGxlIG9wdGlvbnMpIHsKKyAgICAgICAgZmluYWwgUmVzdWx0PExpc3Q8TWVkaWFCcm93c2VyLk1lZGlhSXRlbT4+IHJlc3VsdAorICAgICAgICAgICAgICAgID0gbmV3IFJlc3VsdDxMaXN0PE1lZGlhQnJvd3Nlci5NZWRpYUl0ZW0+PihwYXJlbnRJZCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICB2b2lkIG9uUmVzdWx0U2VudChMaXN0PE1lZGlhQnJvd3Nlci5NZWRpYUl0ZW0+IGxpc3QsIEBSZXN1bHRGbGFncyBpbnQgZmxhZykgeworICAgICAgICAgICAgICAgIGlmIChtQ29ubmVjdGlvbnMuZ2V0KGNvbm5lY3Rpb24uY2FsbGJhY2tzLmFzQmluZGVyKCkpICE9IGNvbm5lY3Rpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKERCRykgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiTm90IHNlbmRpbmcgb25Mb2FkQ2hpbGRyZW4gcmVzdWx0IGZvciBjb25uZWN0aW9uIHRoYXQgaGFzIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgYmVlbiBkaXNjb25uZWN0ZWQuIHBrZz0iICsgY29ubmVjdGlvbi5wa2cgKyAiIGlkPSIgKyBwYXJlbnRJZCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIExpc3Q8TWVkaWFCcm93c2VyLk1lZGlhSXRlbT4gZmlsdGVyZWRMaXN0ID0KKyAgICAgICAgICAgICAgICAgICAgICAgIChmbGFnICYgUkVTVUxUX0ZMQUdfT1BUSU9OX05PVF9IQU5ETEVEKSAhPSAwCisgICAgICAgICAgICAgICAgICAgICAgICA/IGFwcGx5T3B0aW9ucyhsaXN0LCBvcHRpb25zKSA6IGxpc3Q7CisgICAgICAgICAgICAgICAgLy9UT0RPOihiLzExOTc1MDgwNykgUmVzb2x2ZSBoaWRkZW4gQVBJIHVzYWdlIFBhcmNlbGVkTGlzdFNsaWNlLgorICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgZmluYWwgUGFyY2VsZWRMaXN0U2xpY2U8TWVkaWFCcm93c2VyLk1lZGlhSXRlbT4gcGxzID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkTGlzdCA9PSBudWxsID8gbnVsbCA6IG5ldyBQYXJjZWxlZExpc3RTbGljZTw+KGZpbHRlcmVkTGlzdCk7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbi5jYWxsYmFja3Mub25Mb2FkQ2hpbGRyZW5XaXRoT3B0aW9ucyhwYXJlbnRJZCwgcGxzLCBvcHRpb25zKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhlIG90aGVyIHNpZGUgaXMgaW4gdGhlIHByb2Nlc3Mgb2YgY3Jhc2hpbmcuCisgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbGxpbmcgb25Mb2FkQ2hpbGRyZW4oKSBmYWlsZWQgZm9yIGlkPSIgKyBwYXJlbnRJZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBwYWNrYWdlPSIgKyBjb25uZWN0aW9uLnBrZyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgbUN1ckNvbm5lY3Rpb24gPSBjb25uZWN0aW9uOworICAgICAgICBpZiAob3B0aW9ucyA9PSBudWxsKSB7CisgICAgICAgICAgICBvbkxvYWRDaGlsZHJlbihwYXJlbnRJZCwgcmVzdWx0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG9uTG9hZENoaWxkcmVuKHBhcmVudElkLCByZXN1bHQsIG9wdGlvbnMpOworICAgICAgICB9CisgICAgICAgIG1DdXJDb25uZWN0aW9uID0gbnVsbDsKKworICAgICAgICBpZiAoIXJlc3VsdC5pc0RvbmUoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigib25Mb2FkQ2hpbGRyZW4gbXVzdCBjYWxsIGRldGFjaCgpIG9yIHNlbmRSZXN1bHQoKSIKKyAgICAgICAgICAgICAgICAgICAgKyAiIGJlZm9yZSByZXR1cm5pbmcgZm9yIHBhY2thZ2U9IiArIGNvbm5lY3Rpb24ucGtnICsgIiBpZD0iICsgcGFyZW50SWQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBMaXN0PE1lZGlhQnJvd3Nlci5NZWRpYUl0ZW0+IGFwcGx5T3B0aW9ucyhMaXN0PE1lZGlhQnJvd3Nlci5NZWRpYUl0ZW0+IGxpc3QsCisgICAgICAgICAgICBmaW5hbCBCdW5kbGUgb3B0aW9ucykgeworICAgICAgICBpZiAobGlzdCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBpbnQgcGFnZSA9IG9wdGlvbnMuZ2V0SW50KE1lZGlhQnJvd3Nlci5FWFRSQV9QQUdFLCAtMSk7CisgICAgICAgIGludCBwYWdlU2l6ZSA9IG9wdGlvbnMuZ2V0SW50KE1lZGlhQnJvd3Nlci5FWFRSQV9QQUdFX1NJWkUsIC0xKTsKKyAgICAgICAgaWYgKHBhZ2UgPT0gLTEgJiYgcGFnZVNpemUgPT0gLTEpIHsKKyAgICAgICAgICAgIHJldHVybiBsaXN0OworICAgICAgICB9CisgICAgICAgIGludCBmcm9tSW5kZXggPSBwYWdlU2l6ZSAqIHBhZ2U7CisgICAgICAgIGludCB0b0luZGV4ID0gZnJvbUluZGV4ICsgcGFnZVNpemU7CisgICAgICAgIGlmIChwYWdlIDwgMCB8fCBwYWdlU2l6ZSA8IDEgfHwgZnJvbUluZGV4ID49IGxpc3Quc2l6ZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKKyAgICAgICAgfQorICAgICAgICBpZiAodG9JbmRleCA+IGxpc3Quc2l6ZSgpKSB7CisgICAgICAgICAgICB0b0luZGV4ID0gbGlzdC5zaXplKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGxpc3Quc3ViTGlzdChmcm9tSW5kZXgsIHRvSW5kZXgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBwZXJmb3JtTG9hZEl0ZW0oU3RyaW5nIGl0ZW1JZCwgZmluYWwgQ29ubmVjdGlvblJlY29yZCBjb25uZWN0aW9uLAorICAgICAgICAgICAgZmluYWwgUmVzdWx0UmVjZWl2ZXIgcmVjZWl2ZXIpIHsKKyAgICAgICAgZmluYWwgUmVzdWx0PE1lZGlhQnJvd3Nlci5NZWRpYUl0ZW0+IHJlc3VsdCA9CisgICAgICAgICAgICAgICAgbmV3IFJlc3VsdDxNZWRpYUJyb3dzZXIuTWVkaWFJdGVtPihpdGVtSWQpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgdm9pZCBvblJlc3VsdFNlbnQoTWVkaWFCcm93c2VyLk1lZGlhSXRlbSBpdGVtLCBAUmVzdWx0RmxhZ3MgaW50IGZsYWcpIHsKKyAgICAgICAgICAgICAgICBpZiAobUNvbm5lY3Rpb25zLmdldChjb25uZWN0aW9uLmNhbGxiYWNrcy5hc0JpbmRlcigpKSAhPSBjb25uZWN0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChEQkcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIk5vdCBzZW5kaW5nIG9uTG9hZEl0ZW0gcmVzdWx0IGZvciBjb25uZWN0aW9uIHRoYXQgaGFzIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgYmVlbiBkaXNjb25uZWN0ZWQuIHBrZz0iICsgY29ubmVjdGlvbi5wa2cgKyAiIGlkPSIgKyBpdGVtSWQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKChmbGFnICYgUkVTVUxUX0ZMQUdfT05fTE9BRF9JVEVNX05PVF9JTVBMRU1FTlRFRCkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICByZWNlaXZlci5zZW5kKFJFU1VMVF9FUlJPUiwgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQnVuZGxlIGJ1bmRsZSA9IG5ldyBCdW5kbGUoKTsKKyAgICAgICAgICAgICAgICBidW5kbGUucHV0UGFyY2VsYWJsZShLRVlfTUVESUFfSVRFTSwgaXRlbSk7CisgICAgICAgICAgICAgICAgcmVjZWl2ZXIuc2VuZChSRVNVTFRfT0ssIGJ1bmRsZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgbUN1ckNvbm5lY3Rpb24gPSBjb25uZWN0aW9uOworICAgICAgICBvbkxvYWRJdGVtKGl0ZW1JZCwgcmVzdWx0KTsKKyAgICAgICAgbUN1ckNvbm5lY3Rpb24gPSBudWxsOworCisgICAgICAgIGlmICghcmVzdWx0LmlzRG9uZSgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJvbkxvYWRJdGVtIG11c3QgY2FsbCBkZXRhY2goKSBvciBzZW5kUmVzdWx0KCkiCisgICAgICAgICAgICAgICAgICAgICsgIiBiZWZvcmUgcmV0dXJuaW5nIGZvciBpZD0iICsgaXRlbUlkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnRhaW5zIGluZm9ybWF0aW9uIHRoYXQgdGhlIGJyb3dzZXIgc2VydmljZSBuZWVkcyB0byBzZW5kIHRvIHRoZSBjbGllbnQKKyAgICAgKiB3aGVuIGZpcnN0IGNvbm5lY3RlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEJyb3dzZXJSb290IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBsb29rdXAga2V5IGZvciBhIGJvb2xlYW4gdGhhdCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgYnJvd3NlciBzZXJ2aWNlIHNob3VsZCByZXR1cm4gYQorICAgICAgICAgKiBicm93c2VyIHJvb3QgZm9yIHJlY2VudGx5IHBsYXllZCBtZWRpYSBpdGVtcy4KKyAgICAgICAgICoKKyAgICAgICAgICogPHA+V2hlbiBjcmVhdGluZyBhIG1lZGlhIGJyb3dzZXIgZm9yIGEgZ2l2ZW4gbWVkaWEgYnJvd3NlciBzZXJ2aWNlLCB0aGlzIGtleSBjYW4gYmUKKyAgICAgICAgICogc3VwcGxpZWQgYXMgYSByb290IGhpbnQgZm9yIHJldHJpZXZpbmcgbWVkaWEgaXRlbXMgdGhhdCBhcmUgcmVjZW50bHkgcGxheWVkLgorICAgICAgICAgKiBJZiB0aGUgbWVkaWEgYnJvd3NlciBzZXJ2aWNlIGNhbiBwcm92aWRlIHN1Y2ggbWVkaWEgaXRlbXMsIHRoZSBpbXBsZW1lbnRhdGlvbiBtdXN0IHJldHVybgorICAgICAgICAgKiB0aGUga2V5IGluIHRoZSByb290IGhpbnQgd2hlbiB7QGxpbmsgI29uR2V0Um9vdChTdHJpbmcsIGludCwgQnVuZGxlKX0gaXMgY2FsbGVkIGJhY2suCisgICAgICAgICAqCisgICAgICAgICAqIDxwPlRoZSByb290IGhpbnQgbWF5IGNvbnRhaW4gbXVsdGlwbGUga2V5cy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHNlZSAjRVhUUkFfT0ZGTElORQorICAgICAgICAgKiBAc2VlICNFWFRSQV9TVUdHRVNURUQKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1JFQ0VOVCA9ICJhbmRyb2lkLnNlcnZpY2UubWVkaWEuZXh0cmEuUkVDRU5UIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGxvb2t1cCBrZXkgZm9yIGEgYm9vbGVhbiB0aGF0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBicm93c2VyIHNlcnZpY2Ugc2hvdWxkIHJldHVybiBhCisgICAgICAgICAqIGJyb3dzZXIgcm9vdCBmb3Igb2ZmbGluZSBtZWRpYSBpdGVtcy4KKyAgICAgICAgICoKKyAgICAgICAgICogPHA+V2hlbiBjcmVhdGluZyBhIG1lZGlhIGJyb3dzZXIgZm9yIGEgZ2l2ZW4gbWVkaWEgYnJvd3NlciBzZXJ2aWNlLCB0aGlzIGtleSBjYW4gYmUKKyAgICAgICAgICogc3VwcGxpZWQgYXMgYSByb290IGhpbnQgZm9yIHJldHJpZXZpbmcgbWVkaWEgaXRlbXMgdGhhdCBhcmUgY2FuIGJlIHBsYXllZCB3aXRob3V0IGFuCisgICAgICAgICAqIGludGVybmV0IGNvbm5lY3Rpb24uCisgICAgICAgICAqIElmIHRoZSBtZWRpYSBicm93c2VyIHNlcnZpY2UgY2FuIHByb3ZpZGUgc3VjaCBtZWRpYSBpdGVtcywgdGhlIGltcGxlbWVudGF0aW9uIG11c3QgcmV0dXJuCisgICAgICAgICAqIHRoZSBrZXkgaW4gdGhlIHJvb3QgaGludCB3aGVuIHtAbGluayAjb25HZXRSb290KFN0cmluZywgaW50LCBCdW5kbGUpfSBpcyBjYWxsZWQgYmFjay4KKyAgICAgICAgICoKKyAgICAgICAgICogPHA+VGhlIHJvb3QgaGludCBtYXkgY29udGFpbiBtdWx0aXBsZSBrZXlzLgorICAgICAgICAgKgorICAgICAgICAgKiBAc2VlICNFWFRSQV9SRUNFTlQKKyAgICAgICAgICogQHNlZSAjRVhUUkFfU1VHR0VTVEVECisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9PRkZMSU5FID0gImFuZHJvaWQuc2VydmljZS5tZWRpYS5leHRyYS5PRkZMSU5FIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGxvb2t1cCBrZXkgZm9yIGEgYm9vbGVhbiB0aGF0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBicm93c2VyIHNlcnZpY2Ugc2hvdWxkIHJldHVybiBhCisgICAgICAgICAqIGJyb3dzZXIgcm9vdCBmb3Igc3VnZ2VzdGVkIG1lZGlhIGl0ZW1zLgorICAgICAgICAgKgorICAgICAgICAgKiA8cD5XaGVuIGNyZWF0aW5nIGEgbWVkaWEgYnJvd3NlciBmb3IgYSBnaXZlbiBtZWRpYSBicm93c2VyIHNlcnZpY2UsIHRoaXMga2V5IGNhbiBiZQorICAgICAgICAgKiBzdXBwbGllZCBhcyBhIHJvb3QgaGludCBmb3IgcmV0cmlldmluZyB0aGUgbWVkaWEgaXRlbXMgc3VnZ2VzdGVkIGJ5IHRoZSBtZWRpYSBicm93c2VyCisgICAgICAgICAqIHNlcnZpY2UuIFRoZSBsaXN0IG9mIG1lZGlhIGl0ZW1zIHBhc3NlZCBpbiB7QGxpbmsgYW5kcm9pZC5tZWRpYS5icm93c2UuTWVkaWFCcm93c2VyLlN1YnNjcmlwdGlvbkNhbGxiYWNrI29uQ2hpbGRyZW5Mb2FkZWQoU3RyaW5nLCBMaXN0KX0KKyAgICAgICAgICogaXMgY29uc2lkZXJlZCBvcmRlcmVkIGJ5IHJlbGV2YW5jZSwgZmlyc3QgYmVpbmcgdGhlIHRvcCBzdWdnZXN0aW9uLgorICAgICAgICAgKiBJZiB0aGUgbWVkaWEgYnJvd3NlciBzZXJ2aWNlIGNhbiBwcm92aWRlIHN1Y2ggbWVkaWEgaXRlbXMsIHRoZSBpbXBsZW1lbnRhdGlvbiBtdXN0IHJldHVybgorICAgICAgICAgKiB0aGUga2V5IGluIHRoZSByb290IGhpbnQgd2hlbiB7QGxpbmsgI29uR2V0Um9vdChTdHJpbmcsIGludCwgQnVuZGxlKX0gaXMgY2FsbGVkIGJhY2suCisgICAgICAgICAqCisgICAgICAgICAqIDxwPlRoZSByb290IGhpbnQgbWF5IGNvbnRhaW4gbXVsdGlwbGUga2V5cy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHNlZSAjRVhUUkFfUkVDRU5UCisgICAgICAgICAqIEBzZWUgI0VYVFJBX09GRkxJTkUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1NVR0dFU1RFRCA9ICJhbmRyb2lkLnNlcnZpY2UubWVkaWEuZXh0cmEuU1VHR0VTVEVEIjsKKworICAgICAgICBmaW5hbCBwcml2YXRlIFN0cmluZyBtUm9vdElkOworICAgICAgICBmaW5hbCBwcml2YXRlIEJ1bmRsZSBtRXh0cmFzOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDb25zdHJ1Y3RzIGEgYnJvd3NlciByb290LgorICAgICAgICAgKiBAcGFyYW0gcm9vdElkIFRoZSByb290IGlkIGZvciBicm93c2luZy4KKyAgICAgICAgICogQHBhcmFtIGV4dHJhcyBBbnkgZXh0cmFzIGFib3V0IHRoZSBicm93c2VyIHNlcnZpY2UuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnJvd3NlclJvb3QoQE5vbk51bGwgU3RyaW5nIHJvb3RJZCwgQE51bGxhYmxlIEJ1bmRsZSBleHRyYXMpIHsKKyAgICAgICAgICAgIGlmIChyb290SWQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSByb290IGlkIGluIEJyb3dzZXJSb290IGNhbm5vdCBiZSBudWxsLiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICJVc2UgbnVsbCBmb3IgQnJvd3NlclJvb3QgaW5zdGVhZC4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1Sb290SWQgPSByb290SWQ7CisgICAgICAgICAgICBtRXh0cmFzID0gZXh0cmFzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldHMgdGhlIHJvb3QgaWQgZm9yIGJyb3dzaW5nLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRSb290SWQoKSB7CisgICAgICAgICAgICByZXR1cm4gbVJvb3RJZDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXRzIGFueSBleHRyYXMgYWJvdXQgdGhlIGJyb3dzZXIgc2VydmljZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBCdW5kbGUgZ2V0RXh0cmFzKCkgeworICAgICAgICAgICAgcmV0dXJuIG1FeHRyYXM7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcHJvZ3VhcmQuY2ZnIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Byb2d1YXJkLmNmZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdiZjczMC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcHJvZ3VhcmQuY2ZnCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotIwotIyBDb3B5cmlnaHQgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi0jIEtlZXAgZW50cnkgcG9pbnQgZm9yIHVwZGF0YWJsZSBKYXZhIGNsYXNzZXMKLS1rZWVwIHB1YmxpYyBjbGFzcyBjb20uYW5kcm9pZC5tZWRpYS51cGRhdGUuQXBpRmFjdG9yeSB7Ci0gICBwdWJsaWMgc3RhdGljIGNvbS5hbmRyb2lkLm1lZGlhLnVwZGF0ZS5BcGlGYWN0b3J5IGluaXRpYWxpemUoYW5kcm9pZC5jb250ZW50LnBtLkFwcGxpY2F0aW9uSW5mbyk7Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfYXVkaW90cmFja19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19hdWRpb3RyYWNrX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2ZkNTFmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19hdWRpb3RyYWNrX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2F1ZGlvdHJhY2tfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2F1ZGlvdHJhY2tfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2M4MjUyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19hdWRpb3RyYWNrX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19kaWFsb2dfY2xvc2VfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfZGlhbG9nX2Nsb3NlX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjhkZGVhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19kaWFsb2dfY2xvc2VfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfZGlhbG9nX2Nsb3NlX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19kaWFsb2dfY2xvc2VfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTljZDc1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19kaWFsb2dfY2xvc2VfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lZGlhX3BhdXNlX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lZGlhX3BhdXNlX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTkyYWQ0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZWRpYV9wYXVzZV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZWRpYV9wYXVzZV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVkaWFfcGF1c2VfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjcwN2VhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZWRpYV9wYXVzZV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVkaWFfcGxheV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZWRpYV9wbGF5X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzMyZDAwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZWRpYV9wbGF5X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lZGlhX3BsYXlfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lZGlhX3BsYXlfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzQ1ZWUzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZWRpYV9wbGF5X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZWRpYV9zdG9wX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lZGlhX3N0b3BfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwMWQzNDEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lZGlhX3N0b3BfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVkaWFfc3RvcF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVkaWFfc3RvcF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkNmI2NWQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lZGlhX3N0b3BfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lZGlhX3N1YnRpdGxlX2Rpc2FibGVkLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZWRpYV9zdWJ0aXRsZV9kaXNhYmxlZC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzNTRmNjEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lZGlhX3N1YnRpdGxlX2Rpc2FibGVkLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZWRpYV9zdWJ0aXRsZV9lbmFibGVkLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZWRpYV9zdWJ0aXRsZV9lbmFibGVkLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY4ZmViZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVkaWFfc3VidGl0bGVfZW5hYmxlZC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21yX2J1dHRvbl9kaXNhYmxlZF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGFkMzA1ZC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21yX2J1dHRvbl9kaXNhYmxlZF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg3ZmRlNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tcl9idXR0b25fZGlzY29ubmVjdGVkX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3MzlkZjcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbXJfYnV0dG9uX2Rpc2Nvbm5lY3RlZF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbXJfYnV0dG9uX2Rpc2Nvbm5lY3RlZF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4YzM0NGEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21yX2J1dHRvbl9ncmV5LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tcl9idXR0b25fZ3JleS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhMDM0MjAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21yX2J1dHRvbl9ncmV5LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDcyM2U0NTUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9ncm91cF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0MGMyNWEzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZ3JvdXBfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZ3JvdXBfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhZmRiOWMxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODQ2YzEwOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfdm9sX3R5cGVfdHZfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfdm9sX3R5cGVfdHZfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDMzYmY0ODQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX3ZvbF90eXBlX3R2X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX3ZvbF90eXBlX3R2X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY192b2xfdHlwZV90dl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM5MTFiNWMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX3ZvbF90eXBlX3R2X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19hdWRpb3RyYWNrX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2F1ZGlvdHJhY2tfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5NGVkNTAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2F1ZGlvdHJhY2tfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfYXVkaW90cmFja19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfYXVkaW90cmFja19saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjZjdlMGMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2F1ZGlvdHJhY2tfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2RpYWxvZ19jbG9zZV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19kaWFsb2dfY2xvc2VfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2NTU4YTguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2RpYWxvZ19jbG9zZV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19kaWFsb2dfY2xvc2VfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2RpYWxvZ19jbG9zZV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwYTFhODQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2RpYWxvZ19jbG9zZV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVkaWFfcGF1c2VfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVkaWFfcGF1c2VfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0OWFlZDcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3BhdXNlX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3BhdXNlX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZWRpYV9wYXVzZV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0MDY4ZWEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3BhdXNlX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZWRpYV9wbGF5X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3BsYXlfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljYzc3N2MuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3BsYXlfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVkaWFfcGxheV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVkaWFfcGxheV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyMDg3OTUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3BsYXlfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3N0b3BfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVkaWFfc3RvcF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2FkMmM5Yy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVkaWFfc3RvcF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZWRpYV9zdG9wX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZWRpYV9zdG9wX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjAwMmFiNy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVkaWFfc3RvcF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVkaWFfc3VidGl0bGVfZGlzYWJsZWQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3N1YnRpdGxlX2Rpc2FibGVkLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDM1NGY2MS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVkaWFfc3VidGl0bGVfZGlzYWJsZWQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3N1YnRpdGxlX2VuYWJsZWQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3N1YnRpdGxlX2VuYWJsZWQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjhmZWJlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZWRpYV9zdWJ0aXRsZV9lbmFibGVkLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tcl9idXR0b25fZGlzYWJsZWRfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDQ2ZWE0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tcl9idXR0b25fZGlzYWJsZWRfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tcl9idXR0b25fZGlzYWJsZWRfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDc5MGM2Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tcl9idXR0b25fZGlzYWJsZWRfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbXJfYnV0dG9uX2Rpc2Nvbm5lY3RlZF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQwMWRjMC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbXJfYnV0dG9uX2Rpc2Nvbm5lY3RlZF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tcl9idXR0b25fZGlzY29ubmVjdGVkX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tcl9idXR0b25fZGlzY29ubmVjdGVkX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI0ZDU4Ni4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbXJfYnV0dG9uX2Rpc2Nvbm5lY3RlZF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbXJfYnV0dG9uX2dyZXkucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21yX2J1dHRvbl9ncmV5LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NiYjc3Mi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbXJfYnV0dG9uX2dyZXkucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2NjOTg0NS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZ3JvdXBfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDIyNjE3ZTEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZ3JvdXBfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9ncm91cF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9ncm91cF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNlZmVmM2MuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZ3JvdXBfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5YTAwNDdjLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY192b2xfdHlwZV9zcGVha2VyX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY192b2xfdHlwZV90dl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY192b2xfdHlwZV90dl9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2E1ZDZhMi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfdm9sX3R5cGVfdHZfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfdm9sX3R5cGVfdHZfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3ZvbF90eXBlX3R2X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODEzNDMxMC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfdm9sX3R5cGVfdHZfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19hdWRpb3RyYWNrX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19hdWRpb3RyYWNrX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWM4OTlmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfYXVkaW90cmFja19kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfYXVkaW90cmFja19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX2F1ZGlvdHJhY2tfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Nzc4ZTAwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfYXVkaW90cmFja19saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX2RpYWxvZ19jbG9zZV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfZGlhbG9nX2Nsb3NlX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTkyZmM1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfZGlhbG9nX2Nsb3NlX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19kaWFsb2dfY2xvc2VfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19kaWFsb2dfY2xvc2VfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzg4NGU2Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfZGlhbG9nX2Nsb3NlX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbWVkaWFfcGF1c2VfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21lZGlhX3BhdXNlX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjBhYzY1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbWVkaWFfcGF1c2VfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21lZGlhX3BhdXNlX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbWVkaWFfcGF1c2VfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTIxMDRmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbWVkaWFfcGF1c2VfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tZWRpYV9wbGF5X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tZWRpYV9wbGF5X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTVjMDYyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbWVkaWFfcGxheV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbWVkaWFfcGxheV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21lZGlhX3BsYXlfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTJkNDk1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbWVkaWFfcGxheV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21lZGlhX3N0b3BfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21lZGlhX3N0b3BfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyMzkzMzYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tZWRpYV9zdG9wX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tZWRpYV9zdG9wX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbWVkaWFfc3RvcF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViYzVhNmMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tZWRpYV9zdG9wX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjZkZDIxNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDBfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDBfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAwX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI3YmRjZC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDBfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAxX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAxX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2ZlNTc2Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDFfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTVkNmFhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDJfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDJfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhYWRmYTMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAyX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAyX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyNWZlMGIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAyX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wM19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wM19kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVjNDhhNy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDNfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDNfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAzX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQxZTkxMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDNfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA0X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA0X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTQyMThhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDRfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjMwZmFiLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDVfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDVfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3YWE5MDMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA1X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA1X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3ZTJmMjkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA1X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNl9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc4NzFlMi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDZfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDZfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA2X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM1N2Y2My4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDZfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA3X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA3X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDQxYjAxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wN19kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wN19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDdfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGJiNjk0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wN19saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDhfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDhfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4ZTEwMTMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA4X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA4X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjMzUyYzMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA4X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzA1MzJlOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDlfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDlfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA5X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWM2YmEzMC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDlfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEwX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEwX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YmEzYjVmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTBfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDRiYjIyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTFfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTFfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxNTYxMjcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzExX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzExX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0MTdhOWYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzExX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMl9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJmNjMzZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTJfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTJfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEyX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE1MTgxMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTJfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEzX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEzX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTZhNTNjLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xM19kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xM19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTNfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzA1ZGNhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xM19saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTRfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTRfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwZTRlYTMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE0X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE0X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjNjcyNGYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE0X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWUzYjQxMC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTVfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTVfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE1X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmYxOGFiZC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTVfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE2X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE2X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTgxMTMzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNl9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTZfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODBiMTkxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNl9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTdfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTdfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4YWJhM2QuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE3X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE3X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xN19saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhMzRkNWIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE3X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTk5NTdiMy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMThfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMThfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE4X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTVkMzg0Zi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMThfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE5X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE5X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZGM2Mjk3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTlfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOGFiNjg0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjBfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjBfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxZTdmNzUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIwX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIwX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhYTNjYTMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIwX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNhZWNkZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjFfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjFfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIxX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI4ZDBiNi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjFfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIyX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIyX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDBiZTNjLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMl9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjJfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTRmMWJmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMl9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjNfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjNfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlMThiNDYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIzX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIzX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yM19saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0YzJjMDAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIzX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThmYWU0NC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjRfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjRfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI0X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY0YzI4OS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjRfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI1X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI1X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MWY5MzI3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjVfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWUxZjY5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjZfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjZfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlNmZhZmQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI2X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI2X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlMmJkODcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI2X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yN19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yN19kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjczYTFmOC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjdfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjdfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI3X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhjMTA2OS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjdfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI4X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI4X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjJiODAzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjhfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZGZiYTAyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjlfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjlfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1N2YyZDIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI5X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI5X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4ZjU0NzguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI5X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8zMF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8zMF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk5NWFmMC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMzBfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMzBfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzMwX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzUwYjdmMC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMzBfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDBfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2ZGQyMTQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDBfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiN2JkY2QuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAxX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdmZTU3Ni4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAxX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAxX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGE1ZDZhYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAxX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDJfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAyX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWFkZmEzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDJfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAyX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDJfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjVmZTBiLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDJfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wM19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDNfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1YzQ4YTcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wM19kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDNfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wM19saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0MWU5MTEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wM19saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA0X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU0MjE4YS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA0X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA0X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGIzMGZhYi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA0X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDVfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA1X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2FhOTAzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDVfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA1X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDVfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2UyZjI5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDVfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDZfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3ODcxZTIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNl9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDZfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjNTdmNjMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNl9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA3X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wN19kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA0MWIwMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA3X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wN19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA3X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRiYjY5NC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA3X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDhfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA4X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGUxMDEzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDhfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA4X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDhfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzM1MmMzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDhfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wOV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDlfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwNTMyZTkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wOV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDlfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wOV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljNmJhMzAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wOV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEwX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJhM2I1Zi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEwX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEwX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ0YmIyMi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEwX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTFfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzExX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzU3MGY0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTFfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzExX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTFfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWE0MDNlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTFfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTJfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2NDRiZmQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMl9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTJfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3ZDYwNDguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMl9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEzX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xM19kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmUwZDU1OC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEzX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xM19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEzX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjNiYzQ4ZC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEzX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTRfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE0X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNGQ4ZjhlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTRfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE0X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTRfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OGI5MGU1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTRfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTVfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzMjM0YTcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTVfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3ZDQ1MmYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE2X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNl9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjgxY2Y1YS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE2X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE2X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBkMDhiNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE2X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTdfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE3X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZmViM2YxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTdfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE3X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTdfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmFlOGIzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTdfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMThfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiMGZjMDguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMThfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyYTE2YWMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE5X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM1OThjYy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE5X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE5X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQ2ZDE2ZC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE5X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjBfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIwX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDcwNDU1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjBfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIwX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjBfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTZkYjEzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjBfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjFfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmMzgyOGEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjFfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhY2NjNzMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIyX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMl9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWM4Y2VkOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIyX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIyX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQwMWI5ZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIyX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjNfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIzX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTMxZGQzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjNfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIzX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjNfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWY3OGU0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjNfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjRfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3YzJjZGIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjRfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3YzViZWEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI1X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNhZDBkNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI1X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI1X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWZhNTkyMy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI1X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjZfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI2X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjg3ZTI1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjZfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI2X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjZfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzA2ZGI4Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjZfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yN19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjdfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwMjI1YmEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yN19kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjdfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yN19saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5Njk3ZGUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yN19saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI4X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM3ZWMyMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI4X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI4X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE4NDBiZi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI4X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjlfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI5X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDQ1ZTNhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjlfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI5X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjlfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzM3YzY1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjlfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18zMF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMzBfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2ZGQyMTQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18zMF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMzBfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18zMF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiN2JkY2QuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18zMF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9kaXNhYmxlZF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNGRjMTMyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fZGlzYWJsZWRfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fZGlzYWJsZWRfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTQ2MTdjLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Rpc2Nvbm5lY3RlZF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Rpc2Nvbm5lY3RlZF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmIzMDc3My4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fZGlzY29ubmVjdGVkX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTA1ZDdkNy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fZ3JleS5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9ncmV5LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjIzOGQ1OC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9ncmV5LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTQwMzQ5ZC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZ3JvdXBfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZ3JvdXBfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY2N2M0NjMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9ncm91cF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdmY2ViZjUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlYTMyYTdhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX3ZvbF90eXBlX3R2X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY192b2xfdHlwZV90dl9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDYyY2EzNy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX3ZvbF90eXBlX3R2X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY192b2xfdHlwZV90dl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX3ZvbF90eXBlX3R2X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzEzMTI1Ni4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX3ZvbF90eXBlX3R2X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX2F1ZGlvdHJhY2tfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19hdWRpb3RyYWNrX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTMxZTFiLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX2F1ZGlvdHJhY2tfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19hdWRpb3RyYWNrX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX2F1ZGlvdHJhY2tfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTk0NmEyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX2F1ZGlvdHJhY2tfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfZGlhbG9nX2Nsb3NlX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfZGlhbG9nX2Nsb3NlX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODVlODdmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX2RpYWxvZ19jbG9zZV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX2RpYWxvZ19jbG9zZV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19kaWFsb2dfY2xvc2VfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MWI0NDAxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX2RpYWxvZ19jbG9zZV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tZWRpYV9wYXVzZV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21lZGlhX3BhdXNlX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZWE3ZTAzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21lZGlhX3BhdXNlX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbWVkaWFfcGF1c2VfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbWVkaWFfcGF1c2VfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzYzNTM4Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21lZGlhX3BhdXNlX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21lZGlhX3BsYXlfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tZWRpYV9wbGF5X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzQ1YzNhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21lZGlhX3BsYXlfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tZWRpYV9wbGF5X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21lZGlhX3BsYXlfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZGEzYmE1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21lZGlhX3BsYXlfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbWVkaWFfc3RvcF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21lZGlhX3N0b3BfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzNWNhMTguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbWVkaWFfc3RvcF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21lZGlhX3N0b3BfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbWVkaWFfc3RvcF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhYzE4M2QuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbWVkaWFfc3RvcF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAwX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRiNjc5ZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAwX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAwX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTFjNjA1MS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAwX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDFfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAxX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDgzOTE0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDFfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAxX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDFfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjM2MzY2FmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDFfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDJfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjNDQ0Y2YuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMl9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDJfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiZDYzNzcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMl9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAzX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wM19kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRiZDFkYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAzX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wM19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAzX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJlNzEwOC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAzX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDRfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA0X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOWY1OTZiLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDRfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA0X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDRfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjMyZTFhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDRfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDVfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1NjhlMDQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDVfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkMjBkZDkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA2X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNl9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmJlMzllNy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA2X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA2X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWVkYzE1Zi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA2X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDdfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA3X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGFlYmFmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDdfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA3X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDdfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWE2YTRmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDdfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDhfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0YjkxY2UuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDhfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1ZjY2ZjkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA5X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTFlYTM0Yi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA5X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA5X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTUyZGUwNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA5X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTBfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEwX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjFhYTIxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTBfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEwX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTBfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzRiY2MwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTBfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTFfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2NjZiMzUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTFfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0NWE4ZmIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEyX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMl9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWRlYjEzMi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEyX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEyX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRhMmI2MC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEyX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTNfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEzX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjgwYWE5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTNfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEzX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTNfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTVlZmU0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTNfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTRfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjMGNjMzEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTRfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2YWU2ZmMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE1X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjg4MTZjOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE1X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE1X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ0MjkzMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE1X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTZfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE2X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGQ1YjdmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTZfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE2X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTZfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDNhMGZlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTZfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xN19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTdfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjMmE2NTUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xN19kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTdfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xN19saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwZGViYzIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xN19saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE4X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNlNzhhNy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE4X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE4X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2EzZjk5MS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE4X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTlfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE5X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2M2ZhZDllLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTlfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE5X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTlfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmRkOGQ0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTlfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjBfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5MGZkNWYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjBfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiMGI1YzEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIxX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNlMWVmMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIxX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIxX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE3MTBkNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIxX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjJfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIyX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjFjMDgwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjJfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIyX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjJfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzRhYTIxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjJfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yM19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjNfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5YTZiMzAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yM19kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjNfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yM19saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2ZThmZTAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yM19saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI0X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdiODQwZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI0X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI0X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmYyNDA1MC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI0X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjVfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI1X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWMxOGMxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjVfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI1X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjVfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTk3NTNlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjVfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjZfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmMjkxYjEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNl9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjZfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjMWM2MTkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNl9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI3X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yN19kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjUwNGE3MC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI3X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yN19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI3X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdlMGE2MC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI3X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjhfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI4X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2IxZjNlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjhfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI4X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjhfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzU1MWVjLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjhfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjlfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzODY2N2UuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjlfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmYjgxODMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzMwX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8zMF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDg5M2YxOC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzMwX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8zMF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzMwX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWM1ZTE1Ni4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzMwX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAwX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDBfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkYjY3OWUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDBfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxYzYwNTEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDBfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDFfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA4MzkxNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAxX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAxX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzNjM2NhZi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAyX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzQ0NGNmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAyX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDJfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDJfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmQ2Mzc3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAyX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAzX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDNfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkYmQxZGEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDNfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wM19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wM19saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyZTcxMDguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDNfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDRfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDlmNTk2Yi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA0X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA0X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGYzMmUxYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA1X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTY4ZTA0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA1X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDVfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDVfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDIwZGQ5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA1X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA2X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDZfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiZTM5ZTcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDZfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlZGMxNWYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDZfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDdfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wN19kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhhZWJhZi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wN19kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA3X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA3X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjVhNmE0Zi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wN19saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wOF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA4X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGI5MWNlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA4X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDhfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDhfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NWY2NmY5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA4X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA5X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDlfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxZWEzNGIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDlfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wOV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wOV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1MmRlMDQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDlfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTBfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGIxYWEyMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEwX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEwX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTM0YmNjMC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzExX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZmZmYTAxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzExX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTFfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTFfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZmY3ZTU3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzExX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEyX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTJfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2YWM0ZGMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTJfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyYTg2ZjUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTJfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTNfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xM19kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDMwMTA5MC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xM19kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEzX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEzX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDM5NmYwZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xM19saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE0X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTkwMDFiLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE0X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTRfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTRfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjcxNTgxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE0X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE1X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTVfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlOTYyMDguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTVfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmNjk1MDAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTVfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTZfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNl9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDdlMWJkNi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNl9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE2X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE2X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2RlOGYxOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNl9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xN19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE3X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjMyZTk1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE3X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTdfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTdfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWQ1ZDJlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE3X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE4X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMThfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2MGQ1MjcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMThfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3NjFhZTEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMThfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTlfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGFhM2Y4NC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE5X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE5X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjdkMTY2Zi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIwX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmU1MjdlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIwX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjBfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjBfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWIyYThlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIwX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIxX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjFfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczMzdhZjUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjFfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzZjMxZWYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjFfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjJfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMl9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBkOWY1Ny4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMl9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIyX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIyX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY4ZWI3Ny4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMl9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yM19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIzX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmEwZTE0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIzX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjNfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjNfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzQyNWUxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIzX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI0X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjRfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjNzZlMTkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjRfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwMmYxZWQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjRfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjVfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjVmZGNkZC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI1X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI1X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNlOWI4MTkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjVfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjZfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNl9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI5ZTQ0My4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNl9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI2X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI2X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ5Y2E4OS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNl9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yN19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI3X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZmM3NWQ1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI3X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjdfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjdfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Y2JkMjdjLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI3X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI4X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjhfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlYmIwYWMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjhfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViNTE0YWEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjhfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjlfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGU3ZmU1Yy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI5X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI5X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZiMmMxMC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18zMF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzMwX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGI2NzllLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzMwX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMzBfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMzBfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MWM2MDUxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzMwX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9kaXNhYmxlZF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9kaXNhYmxlZF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRiMjEyMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fZGlzYWJsZWRfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fZGlzYWJsZWRfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNlN2UzYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fZGlzYWJsZWRfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Rpc2Nvbm5lY3RlZF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4NjAxY2UuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Rpc2Nvbm5lY3RlZF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Rpc2Nvbm5lY3RlZF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0OTI4ZDcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Rpc2Nvbm5lY3RlZF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fZ3JleS5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fZ3JleS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5MmZkNzcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2dyZXkucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGYxNzFhOGMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZ3JvdXBfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjOGNiNmNhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZ3JvdXBfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZ3JvdXBfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5Yzg4NjNkLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZ3JvdXBfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTMzNTAzOC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX3ZvbF90eXBlX3R2X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfdm9sX3R5cGVfdHZfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE2YTQ4NTguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfdm9sX3R5cGVfdHZfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY192b2xfdHlwZV90dl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY192b2xfdHlwZV90dl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRjYTY3ODcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfdm9sX3R5cGVfdHZfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzAwLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wMC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyMzA1ZDIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzAwLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wMS5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDEucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTM5NWQ0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wMS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDIucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzAyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzBhNzI4Mi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzAzLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wMy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzZjBmNTMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzAzLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wNC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NmE4MGQ5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wNC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDUucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzA1LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGVjMzkzOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDUucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzA2LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wNi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmMDI1MzYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzA2LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wNy5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDcucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTIyOGY0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wNy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDgucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzA4LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA0Mjc3ZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDgucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzA5LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wOS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4NjViZmIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzA5LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8xMC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMTAucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2M1ZDZiLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8xMC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMTEucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzExLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJmNGFkNS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMTEucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzEyLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8xMi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyMzA2NDguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzEyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8xMy5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMTMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTkzMjRlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8xMy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMTQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzE0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg2MThmMC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMTQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzE1LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8xNS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhMGQ3NzAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzE1LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDAucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wMC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhMGQ3NzAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wMC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzAxLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDEucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGI0ZTUwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDEucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wMi5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzAyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODJiNWYwMy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzAyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDMucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wMy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwNWM3NTguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wMy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzA0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTVjN2ZhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wNS5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzA1LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmMyODdlNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzA1LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDYucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wNi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViN2QwY2YuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wNi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzA3LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDcucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NWZhNzJiLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDcucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wOC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzA4LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY1MGVlYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzA4LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDkucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wOS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmNDQzNTUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wOS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzEwLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMTAucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTg3N2MzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMTAucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8xMS5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzExLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzkyN2YwYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzExLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMTIucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8xMi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxYjE5YmIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8xMi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzEzLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMTMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjU5MjFlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMTMucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8xNC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzE0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTRiNzZiMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzE0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMTUucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8xNS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyMzA1ZDIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8xNS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfbXJfYnV0dG9uX2dyZXkucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX21yX2J1dHRvbl9ncmV5LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRhOTUyNS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfbXJfYnV0dG9uX2dyZXkucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9jdXN0b21fcHJvZ3Jlc3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9jdXN0b21fcHJvZ3Jlc3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzMxYTZlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvY3VzdG9tX3Byb2dyZXNzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxsYXllci1saXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIgPgotICAgIDxpdGVtIGFuZHJvaWQ6aWQ9IkBhbmRyb2lkOmlkL2JhY2tncm91bmQiPgotICAgICAgICA8c2hhcGUgYW5kcm9pZDpzaGFwZT0icmVjdGFuZ2xlIiA+Ci0gICAgICAgICAgICA8c29saWQgYW5kcm9pZDpjb2xvcj0iIzI2MDAwMDAwIiAvPgotICAgICAgICA8L3NoYXBlPgotICAgIDwvaXRlbT4KLSAgICA8aXRlbSBhbmRyb2lkOmlkPSJAYW5kcm9pZDppZC9zZWNvbmRhcnlQcm9ncmVzcyI+Ci0gICAgICAgIDxjbGlwPgotICAgICAgICAgICAgPHNoYXBlIGFuZHJvaWQ6c2hhcGU9InJlY3RhbmdsZSIgPgotICAgICAgICAgICAgICAgIDxzb2xpZCBhbmRyb2lkOmNvbG9yPSIjNUNmZmZmZmYiIC8+Ci0gICAgICAgICAgICA8L3NoYXBlPgotICAgICAgICA8L2NsaXA+Ci0gICAgPC9pdGVtPgotICAgIDxpdGVtIGFuZHJvaWQ6aWQ9IkBhbmRyb2lkOmlkL3Byb2dyZXNzIj4KLSAgICAgICAgPGNsaXA+Ci0gICAgICAgICAgICA8c2hhcGUgYW5kcm9pZDpzaGFwZT0icmVjdGFuZ2xlIiA+Ci0gICAgICAgICAgICAgICAgPHNvbGlkIGFuZHJvaWQ6Y29sb3I9IiNmZmZmZmYiIC8+Ci0gICAgICAgICAgICA8L3NoYXBlPgotICAgICAgICA8L2NsaXA+Ci0gICAgPC9pdGVtPgotPC9sYXllci1saXN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvY3VzdG9tX3Byb2dyZXNzX3RodW1iLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvY3VzdG9tX3Byb2dyZXNzX3RodW1iLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWEzNTk3MC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2N1c3RvbV9wcm9ncmVzc190aHVtYi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08c2hhcGUgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6c2hhcGU9Im92YWwiID4KLSAgICA8c29saWQgYW5kcm9pZDpjb2xvcj0iI2ZmZmZmZiIgLz4KLSAgICA8c2l6ZQotICAgICAgICBhbmRyb2lkOmhlaWdodD0iQGRpbWVuL21jdjJfY3VzdG9tX3Byb2dyZXNzX3RodW1iX3NpemUiCi0gICAgICAgIGFuZHJvaWQ6d2lkdGg9IkBkaW1lbi9tY3YyX2N1c3RvbV9wcm9ncmVzc190aHVtYl9zaXplIiAvPgotPC9zaGFwZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2Fycm93X2JhY2sueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19hcnJvd19iYWNrLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI1ZjcxZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2Fycm93X2JhY2sueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08dmVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgYW5kcm9pZDp3aWR0aD0iMjRkcCIKLSAgICAgICAgYW5kcm9pZDpoZWlnaHQ9IjI0ZHAiCi0gICAgICAgIGFuZHJvaWQ6dmlld3BvcnRXaWR0aD0iMjQuMCIKLSAgICAgICAgYW5kcm9pZDp2aWV3cG9ydEhlaWdodD0iMjQuMCI+Ci0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTIwLDExSDcuODNsNS41OSwtNS41OUwxMiw0bC04LDggOCw4IDEuNDEsLTEuNDFMNy44MywxM0gyMHYtMnoiCi0gICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjRkZGRkZGIi8+Ci08L3ZlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfYXNwZWN0X3JhdGlvLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfYXNwZWN0X3JhdGlvLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYyMjhlNi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2FzcGVjdF9yYXRpby54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTx2ZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgICAgICBhbmRyb2lkOndpZHRoPSIyNGRwIgotICAgICAgICBhbmRyb2lkOmhlaWdodD0iMjRkcCIKLSAgICAgICAgYW5kcm9pZDp2aWV3cG9ydFdpZHRoPSIyNC4wIgotICAgICAgICBhbmRyb2lkOnZpZXdwb3J0SGVpZ2h0PSIyNC4wIj4KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNMTksMTJoLTJ2M2gtM3YyaDV2LTV6TTcsOWgzTDEwLDdMNSw3djVoMkw3LDl6TTIxLDNMMywzYy0xLjEsMCAtMiwwLjkgLTIsMnYxNGMwLDEuMSAwLjksMiAyLDJoMThjMS4xLDAgMiwtMC45IDIsLTJMMjMsNWMwLC0xLjEgLTAuOSwtMiAtMiwtMnpNMjEsMTkuMDFMMywxOS4wMUwzLDQuOTloMTh2MTQuMDJ6IgotICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iI0ZGRkZGRiIvPgotPC92ZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2F1ZGlvdHJhY2sueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19hdWRpb3RyYWNrLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjdjMTJiNS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2F1ZGlvdHJhY2sueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08dmVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBhbmRyb2lkOndpZHRoPSIyNGRwIgotICAgIGFuZHJvaWQ6aGVpZ2h0PSIyNGRwIgotICAgIGFuZHJvaWQ6dmlld3BvcnRXaWR0aD0iMjQuMCIKLSAgICBhbmRyb2lkOnZpZXdwb3J0SGVpZ2h0PSIyNC4wIj4KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iI0ZGRkZGRiIKLSAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTEyLDN2OS4yOGMtMC40NywtMC4xNyAtMC45NywtMC4yOCAtMS41LC0wLjI4QzguMDEsMTIgNiwxNC4wMSA2LDE2LjVTOC4wMSwyMSAxMC41LDIxYzIuMzEsMCA0LjIsLTEuNzUgNC40NSwtNEgxNVY2aDRWM2gtN3oiLz4KLTwvdmVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19jaGVjay54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2NoZWNrLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzJmNzIwYi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2NoZWNrLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08dmVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBhbmRyb2lkOndpZHRoPSIyNGRwIgotICAgIGFuZHJvaWQ6aGVpZ2h0PSIyNGRwIgotICAgIGFuZHJvaWQ6dmlld3BvcnRXaWR0aD0iMjQiCi0gICAgYW5kcm9pZDp2aWV3cG9ydEhlaWdodD0iMjQiPgotCi0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTAgMGgyNHYyNEgweiIgLz4KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iI0ZGRkZGRiIKLSAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTkgMTYuMkw0LjggMTJsLTEuNCAxLjRMOSAxOSAyMSA3bC0xLjQtMS40TDkgMTYuMnoiIC8+Ci08L3ZlY3Rvcj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2NoZXZyb25fbGVmdC54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2NoZXZyb25fbGVmdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzMzZkMTcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19jaGV2cm9uX2xlZnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08dmVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgYW5kcm9pZDp3aWR0aD0iMjRkcCIKLSAgICAgICAgYW5kcm9pZDpoZWlnaHQ9IjI0ZHAiCi0gICAgICAgIGFuZHJvaWQ6dmlld3BvcnRXaWR0aD0iMjQuMCIKLSAgICAgICAgYW5kcm9pZDp2aWV3cG9ydEhlaWdodD0iMjQuMCI+Ci0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTE1LjQxLDcuNDFMMTQsNmwtNiw2IDYsNiAxLjQxLC0xLjQxTDEwLjgzLDEyeiIKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiLz4KLTwvdmVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19jaGV2cm9uX3JpZ2h0LnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfY2hldnJvbl9yaWdodC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiMmNlMDkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19jaGV2cm9uX3JpZ2h0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgIGFuZHJvaWQ6d2lkdGg9IjI0ZHAiCi0gICAgICAgIGFuZHJvaWQ6aGVpZ2h0PSIyNGRwIgotICAgICAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjI0LjAiCi0gICAgICAgIGFuZHJvaWQ6dmlld3BvcnRIZWlnaHQ9IjI0LjAiPgotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0xMCw2TDguNTksNy40MSAxMy4xNywxMmwtNC41OCw0LjU5TDEwLDE4bDYsLTZ6IgotICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iI0ZGRkZGRiIvPgotPC92ZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2RlZmF1bHRfYWxidW1faW1hZ2UueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19kZWZhdWx0X2FsYnVtX2ltYWdlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNlZTY0My4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2RlZmF1bHRfYWxidW1faW1hZ2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTx2ZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6d2lkdGg9IjUxMmRwIgotICAgIGFuZHJvaWQ6aGVpZ2h0PSI1MTJkcCIKLSAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjUxMiIKLSAgICBhbmRyb2lkOnZpZXdwb3J0SGVpZ2h0PSI1MTIiPgotCi0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiM2MTYxNjEiCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0gMCAwIEggNTEyIFYgNTEyIEggMCBWIDAgWiIgLz4KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iIzUyNTI1MiIKLSAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTI1NiwxNTF2MTIzLjE0Yy02Ljg4LTQuMDItMTQuODItNi40OC0yMy4zMy02LjQ4IGMtMjUuNzgsMC00Ni42NywyMC44OC00Ni42Nyw0Ni42N2MwLDI1Ljc4LDIwLjg4LDQ2LjY3LDQ2LjY3LDQ2LjY3czQ2LjY3LTIwLjg4LDQ2LjY3LTQ2LjY3VjE5Ny42N0gzMjZWMTUxSDI1NnoiIC8+Ci08L3ZlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfZm9yd2FyZF8zMC54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2ZvcndhcmRfMzAueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWZkZjE2Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfZm9yd2FyZF8zMC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi08dmVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgYW5kcm9pZDp3aWR0aD0iNDBkcCIKLSAgICAgICAgYW5kcm9pZDpoZWlnaHQ9IjQwZHAiCi0gICAgICAgIGFuZHJvaWQ6dmlld3BvcnRXaWR0aD0iMjQuMCIKLSAgICAgICAgYW5kcm9pZDp2aWV3cG9ydEhlaWdodD0iMjQuMCI+Ci0gICAgPGdyb3VwPgotICAgICAgICA8Y2xpcC1wYXRoIGFuZHJvaWQ6cGF0aERhdGE9Ik0yNCwyNEgwVjBoMjR2MjR6IE0gMCwwIiAvPgotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik05LjYgMTMuNWguNGMuMiAwIC40LC0uMS41LC0uMnMuMiwtLjIuMiwtLjR2LS4ycy0uMSwtLjEsLS4xLC0uMiwtLjEsLS4xLC0uMiwtLjFoLS41cy0uMS4xLC0uMi4xLC0uMS4xLC0uMS4ydi4yaC0xYzAsLS4yIDAsLS4zLjEsLS41cy4yLC0uMy4zLC0uNC4zLC0uMi40LC0uMi40LC0uMS41LC0uMWMuMiAwIC40IDAgLjYuMXMuMy4xLjUuMi4yLjIuMy40LjEuMy4xLjV2LjNzLS4xLjIsLS4xLjMsLS4xLjIsLS4yLjIsLS4yLjEsLS4zLjJjLjIuMS40LjIuNS40cy4yLjQuMi42YzAgLjIgMCAuNCwtLjEuNXMtLjIuMywtLjMuNCwtLjMuMiwtLjUuMiwtLjQuMSwtLjYuMWMtLjIgMCwtLjQgMCwtLjUsLS4xcy0uMywtLjEsLS41LC0uMiwtLjIsLS4yLC0uMywtLjQsLS4xLC0uNCwtLjEsLS42aC44di4ycy4xLjEuMS4yLjEuMS4yLjFoLjVzLjEsLS4xLjIsLS4xLjEsLS4xLjEsLS4ydi0uNXMtLjEsLS4xLC0uMSwtLjIsLS4xLC0uMSwtLjIsLS4xaC0uNnYtLjd6bTUuNy43YzAgLjMgMCAuNiwtLjEuOGwtLjMuNnMtLjMuMywtLjUuMywtLjQuMSwtLjYuMSwtLjQgMCwtLjYsLS4xLC0uMywtLjIsLS41LC0uMywtLjIsLS4zLC0uMywtLjYsLS4xLC0uNSwtLjEsLS44di0uN2MwLC0uMyAwLC0uNi4xLC0uOGwuMywtLjZzLjMsLS4zLjUsLS4zLjQsLS4xLjYsLS4xLjQgMCAuNi4xLjMuMi41LjMuMi4zLjMuNi4xLjUuMS44di43em0tLjksLS44di0uNXMtLjEsLS4yLC0uMSwtLjMsLS4xLC0uMSwtLjIsLS4yLC0uMiwtLjEsLS4zLC0uMSwtLjIgMCwtLjMuMWwtLjIuMnMtLjEuMiwtLjEuM3Yycy4xLjIuMS4zLjEuMS4yLjIuMi4xLjMuMS4yIDAgLjMsLS4xbC4yLC0uMnMuMSwtLjIuMSwtLjN2LTEuNXpNNCAxM2MwIDQuNCAzLjYgOCA4IDhzOCwtMy42IDgsLThoLTJjMCAzLjMsLTIuNyA2LC02IDZzLTYsLTIuNywtNiwtNiAyLjcsLTYgNiwtNnY0bDUsLTUsLTUsLTV2NGMtNC40IDAsLTggMy42LC04IDh6IgotICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iI0ZGRkZGRiIvPgotICAgIDwvZ3JvdXA+Ci08L3ZlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfZnVsbHNjcmVlbi54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2Z1bGxzY3JlZW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjRmNmJjLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfZnVsbHNjcmVlbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTx2ZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgICAgICBhbmRyb2lkOndpZHRoPSIyNGRwIgotICAgICAgICBhbmRyb2lkOmhlaWdodD0iMjRkcCIKLSAgICAgICAgYW5kcm9pZDp2aWV3cG9ydFdpZHRoPSIyNC4wIgotICAgICAgICBhbmRyb2lkOnZpZXdwb3J0SGVpZ2h0PSIyNC4wIj4KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNNywxNEw1LDE0djVoNXYtMkw3LDE3di0zek01LDEwaDJMNyw3aDNMMTAsNUw1LDV2NXpNMTcsMTdoLTN2Mmg1di01aC0ydjN6TTE0LDV2MmgzdjNoMkwxOSw1aC01eiIKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiLz4KLTwvdmVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19mdWxsc2NyZWVuX2V4aXQueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19mdWxsc2NyZWVuX2V4aXQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzIwNGUyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfZnVsbHNjcmVlbl9leGl0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgIGFuZHJvaWQ6d2lkdGg9IjI0ZHAiCi0gICAgICAgIGFuZHJvaWQ6aGVpZ2h0PSIyNGRwIgotICAgICAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjI0LjAiCi0gICAgICAgIGFuZHJvaWQ6dmlld3BvcnRIZWlnaHQ9IjI0LjAiPgotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik01LDE2aDN2M2gydi01TDUsMTR2MnpNOCw4TDUsOHYyaDVMMTAsNUw4LDV2M3pNMTQsMTloMnYtM2gzdi0yaC01djV6TTE2LDhMMTYsNWgtMnY1aDVMMTksOGgtM3oiCi0gICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjRkZGRkZGIi8+Ci08L3ZlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfaGVscC54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2hlbHAueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDFkNzVkLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfaGVscC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgYW5kcm9pZDp3aWR0aD0iMjRkcCIKLSAgICBhbmRyb2lkOmhlaWdodD0iMjRkcCIKLSAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjI0IgotICAgIGFuZHJvaWQ6dmlld3BvcnRIZWlnaHQ9IjI0Ij4KLQotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0wIDBoMjR2MjRIMHoiIC8+Ci0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0xMiAyQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0xCi0xN2gtMnYtMmgydjJ6bTIuMDctNy43NWwtLjkgLjkyIEMxMy40NSAxMi45IDEzIDEzLjUgMTMgMTVoLTJ2LS41YzAtMS4xIC40NSAtMi4xCi0xLjE3LTIuODNsMS4yNC0xLjI2Yy4zNy0uMzYgLjU5IC0uODYgLjU5IC0xLjQxIDAtMS4xLS45LTItMi0ycy0yIC45LTIgMkg4YzAtMi4yMQotMS43OS00IDQtNHM0IDEuNzkgNCA0YzAgLjg4LS4zNiAxLjY4LS45MyAyLjI1eiIgLz4KLTwvdmVjdG9yPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfaGlnaF9xdWFsaXR5LnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfaGlnaF9xdWFsaXR5LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjc2ZTIyZi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2hpZ2hfcXVhbGl0eS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgYW5kcm9pZDp3aWR0aD0iMzRkcCIKLSAgICBhbmRyb2lkOmhlaWdodD0iMzRkcCIKLSAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjI0IgotICAgIGFuZHJvaWQ6dmlld3BvcnRIZWlnaHQ9IjI0Ij4KLQotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0wIDBoMjR2MjRIMHoiIC8+Ci0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0xOSA0SDVjLTEuMTEgMC0yIDAuOS0yIDJ2MTJjMCAxLjEgMC44OSAyIDIgMmgxNGMxLjEgMCAyLTAuOSAyLTJWNmMwLTEuMS0wLjktMi0yLTJ6bS04IDExSDkuNXYtMmgtMnYySDZWOWgxLjV2Mi41aDJWOUgxMXY2em03LTFjMCAwLjU1LTAuNDUgMS0xIDFoLTAuNzV2MS41aC0xLjVWMTVIMTRjLTAuNTUgMC0xLTAuNDUtMS0xdi00YzAtMC41NSAwLjQ1IC0xIDEtMWgzYzAuNTUgMCAxIDAuNDUgMSAxdjR6bS0zLjUtMC41aDJ2LTNoLTJ2M3oiIC8+Ci08L3ZlY3Rvcj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2xhdW5jaC54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2xhdW5jaC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3YWY2YWEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19sYXVuY2gueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08dmVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBhbmRyb2lkOndpZHRoPSIyNGRwIgotICAgIGFuZHJvaWQ6aGVpZ2h0PSIyNGRwIgotICAgIGFuZHJvaWQ6dmlld3BvcnRXaWR0aD0iMjQuMCIKLSAgICBhbmRyb2lkOnZpZXdwb3J0SGVpZ2h0PSIyNC4wIj4KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iI0ZGRkZGRiIKLSAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTE5LDE5SDVWNWg3VjNINWMtMS4xMSwwIC0yLDAuOSAtMiwydjE0YzAsMS4xIDAuODksMiAyLDJoMTRjMS4xLDAgMiwtMC45IDIsLTJ2LTdoLTJ2N3pNMTQsM3YyaDMuNTlsLTkuODMsOS44MyAxLjQxLDEuNDFMMTksNi40MVYxMGgyVjNoLTd6Ii8+Ci08L3ZlY3Rvcj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX211dGUueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19tdXRlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTYwYWFlYy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX211dGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08dmVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgYW5kcm9pZDp3aWR0aD0iMjRkcCIKLSAgICAgICAgYW5kcm9pZDpoZWlnaHQ9IjI0ZHAiCi0gICAgICAgIGFuZHJvaWQ6dmlld3BvcnRXaWR0aD0iMjQuMCIKLSAgICAgICAgYW5kcm9pZDp2aWV3cG9ydEhlaWdodD0iMjQuMCI+Ci0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTE2LjUsMTJjMCwtMS43NyAtMS4wMiwtMy4yOSAtMi41LC00LjAzdjIuMjFsMi40NSwyLjQ1YzAuMDMsLTAuMiAwLjA1LC0wLjQxIDAuMDUsLTAuNjN6TTE5LDEyYzAsMC45NCAtMC4yLDEuODIgLTAuNTQsMi42NGwxLjUxLDEuNTFDMjAuNjMsMTQuOTEgMjEsMTMuNSAyMSwxMmMwLC00LjI4IC0yLjk5LC03Ljg2IC03LC04Ljc3djIuMDZjMi44OSwwLjg2IDUsMy41NCA1LDYuNzF6TTQuMjcsM0wzLDQuMjcgNy43Myw5TDMsOXY2aDRsNSw1di02LjczbDQuMjUsNC4yNWMtMC42NywwLjUyIC0xLjQyLDAuOTMgLTIuMjUsMS4xOHYyLjA2YzEuMzgsLTAuMzEgMi42MywtMC45NSAzLjY5LC0xLjgxTDE5LjczLDIxIDIxLDE5LjczbC05LC05TDQuMjcsM3pNMTIsNEw5LjkxLDYuMDkgMTIsOC4xOEwxMiw0eiIKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiLz4KLTwvdmVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19wYXVzZV9jaXJjbGVfZmlsbGVkLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfcGF1c2VfY2lyY2xlX2ZpbGxlZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczYmUyMjguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19wYXVzZV9jaXJjbGVfZmlsbGVkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgIGFuZHJvaWQ6d2lkdGg9IjQwZHAiCi0gICAgICAgIGFuZHJvaWQ6aGVpZ2h0PSI0MGRwIgotICAgICAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjI0LjAiCi0gICAgICAgIGFuZHJvaWQ6dmlld3BvcnRIZWlnaHQ9IjI0LjAiPgotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0xMiwyQzYuNDgsMiAyLDYuNDggMiwxMnM0LjQ4LDEwIDEwLDEwIDEwLC00LjQ4IDEwLC0xMFMxNy41MiwyIDEyLDJ6TTExLDE2TDksMTZMOSw4aDJ2OHpNMTUsMTZoLTJMMTMsOGgydjh6IgotICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iI0ZGRkZGRiIvPgotPC92ZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3BsYXlfY2lyY2xlX2ZpbGxlZC54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3BsYXlfY2lyY2xlX2ZpbGxlZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkMzlkZWYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19wbGF5X2NpcmNsZV9maWxsZWQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08dmVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgYW5kcm9pZDp3aWR0aD0iNDBkcCIKLSAgICAgICAgYW5kcm9pZDpoZWlnaHQ9IjQwZHAiCi0gICAgICAgIGFuZHJvaWQ6dmlld3BvcnRXaWR0aD0iMjQuMCIKLSAgICAgICAgYW5kcm9pZDp2aWV3cG9ydEhlaWdodD0iMjQuMCI+Ci0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTEyLDJDNi40OCwyIDIsNi40OCAyLDEyczQuNDgsMTAgMTAsMTAgMTAsLTQuNDggMTAsLTEwUzE3LjUyLDIgMTIsMnpNMTAsMTYuNXYtOWw2LDQuNSAtNiw0LjV6IgotICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iI0ZGRkZGRiIvPgotPC92ZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3JlcGxheV9jaXJjbGVfZmlsbGVkLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfcmVwbGF5X2NpcmNsZV9maWxsZWQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTZkNWQ5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfcmVwbGF5X2NpcmNsZV9maWxsZWQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTx2ZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6d2lkdGg9IjQwZHAiCi0gICAgYW5kcm9pZDpoZWlnaHQ9IjQwZHAiCi0gICAgYW5kcm9pZDp2aWV3cG9ydFdpZHRoPSIyNCIKLSAgICBhbmRyb2lkOnZpZXdwb3J0SGVpZ2h0PSIyNCI+Ci0KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNMCwwaDI0djI0SDBWMHoiIC8+Ci0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiCi0gICAgICAgIGFuZHJvaWQ6ZmlsbFR5cGU9ImV2ZW5PZGQiCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0xMiwyQzYuNDgsMiwyLDYuNDgsMiwxMmMwLDUuNTIsNC40OCwxMCwxMCwxMGM1LjUyLDAsMTAtNC40OCwxMC0xMAotQzIyLDYuNDgsMTcuNTIsMiwxMiwyegotTTE4LDEyYzAsMy4zMS0yLjY5LDYtNiw2Yy0zLjMxLDAtNi0yLjY5LTYtNmgyYzAsMi4yMSwxLjc5LDQsNCw0czQtMS43OSw0LTRzLTEuNzktNC00LTR2M0w4LDdsNC00djMKLUMxNS4zMSw2LDE4LDguNjksMTgsMTJ6IiAvPgotPC92ZWN0b3I+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19yZXdpbmRfMTAueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19yZXdpbmRfMTAueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTU4NmI0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfcmV3aW5kXzEwLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLTx2ZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgICAgICBhbmRyb2lkOndpZHRoPSI0MGRwIgotICAgICAgICBhbmRyb2lkOmhlaWdodD0iNDBkcCIKLSAgICAgICAgYW5kcm9pZDp2aWV3cG9ydFdpZHRoPSIyNC4wIgotICAgICAgICBhbmRyb2lkOnZpZXdwb3J0SGVpZ2h0PSIyNC4wIj4KLSAgICA8Z3JvdXA+Ci0gICAgICAgIDxjbGlwLXBhdGggYW5kcm9pZDpwYXRoRGF0YT0iTTAsMGgyNHYyNEgwVjB6IE0gMCwwIiAvPgotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0xMiA1VjFMNyA2bDUgNVY3YzMuMyAwIDYgMi43IDYgNnMtMi43IDYsLTYgNiwtNiwtMi43LC02LC02SDRjMCA0LjQgMy42IDggOCA4czgsLTMuNiA4LC04LC0zLjYsLTgsLTgsLTh6bS0xLjEgMTFIMTB2LTMuM0w5IDEzdi0uN2wxLjgsLS42aC4xVjE2em00LjMsLTEuOGMwIC4zIDAgLjYsLS4xLjhsLS4zLjZzLS4zLjMsLS41LjMsLS40LjEsLS42LjEsLS40IDAsLS42LC0uMSwtLjMsLS4yLC0uNSwtLjMsLS4yLC0uMywtLjMsLS42LC0uMSwtLjUsLS4xLC0uOHYtLjdjMCwtLjMgMCwtLjYuMSwtLjhsLjMsLS42cy4zLC0uMy41LC0uMy40LC0uMS42LC0uMS40IDAgLjYuMWMuMi4xLjMuMi41LjNzLjIuMy4zLjYuMS41LjEuOHYuN3ptLS45LC0uOHYtLjVzLS4xLC0uMiwtLjEsLS4zLC0uMSwtLjEsLS4yLC0uMiwtLjIsLS4xLC0uMywtLjEsLS4yIDAsLS4zLjFsLS4yLjJzLS4xLjIsLS4xLjN2MnMuMS4yLjEuMy4xLjEuMi4yLjIuMS4zLjEuMiAwIC4zLC0uMWwuMiwtLjJzLjEsLS4yLjEsLS4zdi0xLjV6IgotICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iI0ZGRkZGRiIvPgotICAgIDwvZ3JvdXA+Ci08L3ZlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfc2QueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19zZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlY2I2ZDIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19zZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgYW5kcm9pZDp3aWR0aD0iMjRkcCIKLSAgICBhbmRyb2lkOmhlaWdodD0iMjRkcCIKLSAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjI0IgotICAgIGFuZHJvaWQ6dmlld3BvcnRIZWlnaHQ9IjI0Ij4KLQotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0wLDBoMjR2MjRIMFYweiIgLz4KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iI0ZGRkZGRiIKLSAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTE5LDNINUMzLjg5LDMsMywzLjksMyw1djE0YzAsMS4xLDAuODksMiwyLDJoMTRjMS4xLDAsMi0wLjksMi0yVjVDMjEsMy45LDIwLjEsMywxOSwzegotTTEzLDloNGMwLjU1LDAsMSwwLjQ1LDEsMXY0IGMwLDAuNTUtMC40NSwxLTEsMWgtNFY5egotTTkuNSwxMy41di0xSDdjLTAuNTUsMC0xLTAuNDUtMS0xVjEwYzAtMC41NSwwLjQ1LTEsMS0xaDNjMC41NSwwLDEsMC40NSwxLDF2MUg5LjV2LTAuNWgtMnYxSDEwCi1jMC41NSwwLDEsMC40NSwxLDFWMTRjMCwwLjU1LTAuNDUsMS0xLDFIN2MtMC41NSwwLTEtMC40NS0xLTF2LTFoMS41djAuNUg5LjV6Ci1NMTQuNSwxMy41aDJ2LTNoLTJWMTMuNXoiIC8+Ci08L3ZlY3Rvcj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3NldHRpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfc2V0dGluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTllY2MxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfc2V0dGluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08dmVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgYW5kcm9pZDp3aWR0aD0iMjRkcCIKLSAgICAgICAgYW5kcm9pZDpoZWlnaHQ9IjI0ZHAiCi0gICAgICAgIGFuZHJvaWQ6dmlld3BvcnRXaWR0aD0iMjQuMCIKLSAgICAgICAgYW5kcm9pZDp2aWV3cG9ydEhlaWdodD0iMjQuMCI+Ci0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTE5LjQzLDEyLjk4YzAuMDQsLTAuMzIgMC4wNywtMC42NCAwLjA3LC0wLjk4cy0wLjAzLC0wLjY2IC0wLjA3LC0wLjk4bDIuMTEsLTEuNjVjMC4xOSwtMC4xNSAwLjI0LC0wLjQyIDAuMTIsLTAuNjRsLTIsLTMuNDZjLTAuMTIsLTAuMjIgLTAuMzksLTAuMyAtMC42MSwtMC4yMmwtMi40OSwxYy0wLjUyLC0wLjQgLTEuMDgsLTAuNzMgLTEuNjksLTAuOThsLTAuMzgsLTIuNjVDMTQuNDYsMi4xOCAxNC4yNSwyIDE0LDJoLTRjLTAuMjUsMCAtMC40NiwwLjE4IC0wLjQ5LDAuNDJsLTAuMzgsMi42NWMtMC42MSwwLjI1IC0xLjE3LDAuNTkgLTEuNjksMC45OGwtMi40OSwtMWMtMC4yMywtMC4wOSAtMC40OSwwIC0wLjYxLDAuMjJsLTIsMy40NmMtMC4xMywwLjIyIC0wLjA3LDAuNDkgMC4xMiwwLjY0bDIuMTEsMS42NWMtMC4wNCwwLjMyIC0wLjA3LDAuNjUgLTAuMDcsMC45OHMwLjAzLDAuNjYgMC4wNywwLjk4bC0yLjExLDEuNjVjLTAuMTksMC4xNSAtMC4yNCwwLjQyIC0wLjEyLDAuNjRsMiwzLjQ2YzAuMTIsMC4yMiAwLjM5LDAuMyAwLjYxLDAuMjJsMi40OSwtMWMwLjUyLDAuNCAxLjA4LDAuNzMgMS42OSwwLjk4bDAuMzgsMi42NWMwLjAzLDAuMjQgMC4yNCwwLjQyIDAuNDksMC40Mmg0YzAuMjUsMCAwLjQ2LC0wLjE4IDAuNDksLTAuNDJsMC4zOCwtMi42NWMwLjYxLC0wLjI1IDEuMTcsLTAuNTkgMS42OSwtMC45OGwyLjQ5LDFjMC4yMywwLjA5IDAuNDksMCAwLjYxLC0wLjIybDIsLTMuNDZjMC4xMiwtMC4yMiAwLjA3LC0wLjQ5IC0wLjEyLC0wLjY0bC0yLjExLC0xLjY1ek0xMiwxNS41Yy0xLjkzLDAgLTMuNSwtMS41NyAtMy41LC0zLjVzMS41NywtMy41IDMuNSwtMy41IDMuNSwxLjU3IDMuNSwzLjUgLTEuNTcsMy41IC0zLjUsMy41eiIKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiLz4KLTwvdmVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19za2lwX25leHQueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19za2lwX25leHQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWYyODEyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfc2tpcF9uZXh0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgIGFuZHJvaWQ6d2lkdGg9IjQwZHAiCi0gICAgICAgIGFuZHJvaWQ6aGVpZ2h0PSI0MGRwIgotICAgICAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjI0LjAiCi0gICAgICAgIGFuZHJvaWQ6dmlld3BvcnRIZWlnaHQ9IjI0LjAiPgotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik02LDE4bDguNSwtNkw2LDZ2MTJ6TTE2LDZ2MTJoMlY2aC0yeiIKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiLz4KLTwvdmVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19za2lwX3ByZXZpb3VzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfc2tpcF9wcmV2aW91cy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxZGEzMTQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19za2lwX3ByZXZpb3VzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgIGFuZHJvaWQ6d2lkdGg9IjQwZHAiCi0gICAgICAgIGFuZHJvaWQ6aGVpZ2h0PSI0MGRwIgotICAgICAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjI0LjAiCi0gICAgICAgIGFuZHJvaWQ6dmlld3BvcnRIZWlnaHQ9IjI0LjAiPgotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik02LDZoMnYxMkw2LDE4ek05LjUsMTJsOC41LDZMMTgsNnoiCi0gICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjRkZGRkZGIi8+Ci08L3ZlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfc3VidGl0bGVfb2ZmLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfc3VidGl0bGVfb2ZmLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBhNzI3YS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3N1YnRpdGxlX29mZi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgYW5kcm9pZDp3aWR0aD0iMjRkcCIKLSAgICBhbmRyb2lkOmhlaWdodD0iMjRkcCIKLSAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjI0IgotICAgIGFuZHJvaWQ6dmlld3BvcnRIZWlnaHQ9IjI0Ij4KLQotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0wLDBoMjR2MjRIMFYweiIgLz4KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iI0ZGRkZGRiIKLSAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTE5LjUsNS41djEzaC0xNXYtMTNIMTkuNXogTTE5LDRINUMzLjg5LDQsMyw0LjksMyw2djEyYzAsMS4xLDAuODksMiwyLDJoMTRjMS4xLDAsMi0wLjksMi0yVjZDMjEsNC45LDIwLjEsNCwxOSw0TDE5LDR6IiAvPgotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjRkZGRkZGIgotICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNMTEsMTFIOS41di0wLjVoLTJ2M2gyVjEzSDExdjFjMCwwLjU1LTAuNDUsMS0xLDFIN2MtMC41NSwwLTEtMC40NS0xLTF2LTRjMC0wLjU1LDAuNDUtMSwxLTFoM2MwLjU1LDAsMSwwLjQ1LDEsMVYxMXoiIC8+Ci0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0xOCwxMWgtMS41di0wLjVoLTJ2M2gyVjEzSDE4djFjMCwwLjU1LTAuNDUsMS0xLDFoLTNjLTAuNTUsMC0xLTAuNDUtMS0xdi00YzAtMC41NSwwLjQ1LTEsMS0xaDNjMC41NSwwLDEsMC40NSwxLDFWMTF6IiAvPgotPC92ZWN0b3I+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19zdWJ0aXRsZV9vbi54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3N1YnRpdGxlX29uLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M5MWMwNi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3N1YnRpdGxlX29uLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08dmVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBhbmRyb2lkOndpZHRoPSIyNGRwIgotICAgIGFuZHJvaWQ6aGVpZ2h0PSIyNGRwIgotICAgIGFuZHJvaWQ6dmlld3BvcnRXaWR0aD0iMjQiCi0gICAgYW5kcm9pZDp2aWV3cG9ydEhlaWdodD0iMjQiPgotCi0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTAgMGgyNHYyNEgweiIgLz4KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iI0ZGRkZGRiIKLSAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTE5IDRINWMtMS4xMSAwLTIgMC45LTIgMnYxMmMwIDEuMSAwLjg5IDIgMiAyaDE0YzEuMSAwIDItMC45IDItMlY2YzAtMS4xLTAuOS0yLTItMnptLTggN0g5LjV2LTAuNWgtMnYzaDJWMTNIMTF2MWMwIDAuNTUtMC40NSAxLTEgMUg3Yy0wLjU1IDAtMS0wLjQ1LTEtMXYtNGMwLTAuNTUgMC40NSAtMSAxLTFoM2MwLjU1IDAgMSAwLjQ1IDEgMXYxem03IDBoLTEuNXYtMC41aC0ydjNoMlYxM0gxOHYxYzAgMC41NS0wLjQ1IDEtMSAxaC0zYy0wLjU1IDAtMS0wLjQ1LTEtMXYtNGMwLTAuNTUgMC40NSAtMSAxLTFoM2MwLjU1IDAgMSAwLjQ1IDEgMXYxeiIgLz4KLTwvdmVjdG9yPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfdW5tdXRlLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfdW5tdXRlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRmYjJiOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3VubXV0ZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTx2ZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgICAgICBhbmRyb2lkOndpZHRoPSIyNGRwIgotICAgICAgICBhbmRyb2lkOmhlaWdodD0iMjRkcCIKLSAgICAgICAgYW5kcm9pZDp2aWV3cG9ydFdpZHRoPSIyNC4wIgotICAgICAgICBhbmRyb2lkOnZpZXdwb3J0SGVpZ2h0PSIyNC4wIj4KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNMyw5djZoNGw1LDVMMTIsNEw3LDlMMyw5ek0xNi41LDEyYzAsLTEuNzcgLTEuMDIsLTMuMjkgLTIuNSwtNC4wM3Y4LjA1YzEuNDgsLTAuNzMgMi41LC0yLjI1IDIuNSwtNC4wMnpNMTQsMy4yM3YyLjA2YzIuODksMC44NiA1LDMuNTQgNSw2Ljcxcy0yLjExLDUuODUgLTUsNi43MXYyLjA2YzQuMDEsLTAuOTEgNywtNC40OSA3LC04Ljc3cy0yLjk5LC03Ljg2IC03LC04Ljc3eiIKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiLz4KLTwvdmVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9idXR0b25fY29ubmVjdGVkX2RhcmsueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9idXR0b25fY29ubmVjdGVkX2RhcmsueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTBmZjEzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfYnV0dG9uX2Nvbm5lY3RlZF9kYXJrLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGFuaW1hdGlvbi1saXN0Ci0gICAgICAgIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgYW5kcm9pZDpvbmVzaG90PSJ0cnVlIj4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMF9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMV9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMl9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wM19kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNF9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNV9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNl9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wN19kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOF9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOV9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMF9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMV9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMl9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xM19kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNF9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNV9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNl9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xN19kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOF9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOV9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMF9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMV9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMl9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yM19kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNF9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNV9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNl9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yN19kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOF9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOV9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8zMF9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLTwvYW5pbWF0aW9uLWxpc3Q+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2J1dHRvbl9jb25uZWN0ZWRfbGlnaHQueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9idXR0b25fY29ubmVjdGVkX2xpZ2h0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNmYzdmZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2J1dHRvbl9jb25uZWN0ZWRfbGlnaHQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08YW5pbWF0aW9uLWxpc3QKLSAgICAgICAgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgICAgICBhbmRyb2lkOm9uZXNob3Q9InRydWUiPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAwX2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMV9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDJfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAzX2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNF9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDVfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA2X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wN19saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDhfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA5X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMF9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTFfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEyX2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xM19saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTRfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE1X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNl9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTdfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE4X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOV9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjBfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIxX2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMl9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjNfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI0X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNV9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjZfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI3X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOF9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjlfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzMwX2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLTwvYW5pbWF0aW9uLWxpc3Q+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2J1dHRvbl9jb25uZWN0aW5nX2RhcmsueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9idXR0b25fY29ubmVjdGluZ19kYXJrLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTVhZjdiMy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2J1dHRvbl9jb25uZWN0aW5nX2RhcmsueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08YW5pbWF0aW9uLWxpc3QKLSAgICAgICAgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgICAgICBhbmRyb2lkOm9uZXNob3Q9ImZhbHNlIj4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDBfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAxX2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMl9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDNfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA0X2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNV9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDZfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA3X2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wOF9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDlfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEwX2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMV9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTJfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEzX2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNF9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTVfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE2X2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xN19kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMThfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE5X2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMF9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjFfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIyX2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yM19kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjRfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI1X2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNl9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjdfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI4X2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOV9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMzBfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci08L2FuaW1hdGlvbi1saXN0PgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9idXR0b25fY29ubmVjdGluZ19saWdodC54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2J1dHRvbl9jb25uZWN0aW5nX2xpZ2h0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNiNDE3MC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2J1dHRvbl9jb25uZWN0aW5nX2xpZ2h0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGFuaW1hdGlvbi1saXN0Ci0gICAgICAgIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgYW5kcm9pZDpvbmVzaG90PSJmYWxzZSI+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAwX2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDFfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMl9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAzX2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDRfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNV9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA2X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDdfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wOF9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA5X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTBfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMV9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEyX2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTNfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNF9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE1X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTZfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xN19saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE4X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTlfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMF9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIxX2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjJfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yM19saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI0X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjVfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNl9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI3X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjhfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOV9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzMwX2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLTwvYW5pbWF0aW9uLWxpc3Q+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2J1dHRvbl9kYXJrLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfYnV0dG9uX2RhcmsueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjFkZmFhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfYnV0dG9uX2RhcmsueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KLSAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9InRydWUiIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0idHJ1ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9tcl9idXR0b25fY29ubmVjdGVkX2RhcmsiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2FibGU9InRydWUiIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0idHJ1ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9tcl9idXR0b25fY29ubmVjdGluZ19kYXJrIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0idHJ1ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fZGlzY29ubmVjdGVkX2RhcmsiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9kaXNhYmxlZF9kYXJrIiAvPgotPC9zZWxlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfYnV0dG9uX2xpZ2h0LnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfYnV0dG9uX2xpZ2h0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQzZDg0ZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2J1dHRvbl9saWdodC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxzZWxlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgotICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2tlZD0idHJ1ZSIgYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJ0cnVlIgotICAgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL21yX2J1dHRvbl9jb25uZWN0ZWRfbGlnaHQiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2FibGU9InRydWUiIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0idHJ1ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9tcl9idXR0b25fY29ubmVjdGluZ19saWdodCIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9InRydWUiCi0gICAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Rpc2Nvbm5lY3RlZF9saWdodCIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2xpZ2h0IiAvPgotPC9zZWxlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfZGlhbG9nX2Nsb3NlX2RhcmsueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9kaWFsb2dfY2xvc2VfZGFyay54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4OGM4YzcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9kaWFsb2dfY2xvc2VfZGFyay54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxzZWxlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19kaWFsb2dfY2xvc2VfZGFyayIgLz4KLTwvc2VsZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2RpYWxvZ19jbG9zZV9saWdodC54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2RpYWxvZ19jbG9zZV9saWdodC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkNTBlMGYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9kaWFsb2dfY2xvc2VfbGlnaHQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KLSAgICA8aXRlbT4KLSAgICAgICAgPGJpdG1hcAotICAgICAgICAgICAgYW5kcm9pZDpzcmM9IkBkcmF3YWJsZS9pY19kaWFsb2dfY2xvc2VfbGlnaHQiCi0gICAgICAgICAgICBhbmRyb2lkOmFscGhhPSIwLjg3IiAvPgotICAgIDwvaXRlbT4KLQotPC9zZWxlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfZGlhbG9nX21hdGVyaWFsX2JhY2tncm91bmRfZGFyay54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2RpYWxvZ19tYXRlcmlhbF9iYWNrZ3JvdW5kX2RhcmsueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmM3ZWNhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfZGlhbG9nX21hdGVyaWFsX2JhY2tncm91bmRfZGFyay54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gVGhpcyBpcyB0aGUgY29weSBvZiBAZHJhd2FibGUvYWJjX2RpYWxvZ19tYXRlcmlhbF9iYWNrZ3JvdW5kX2RhcmsgZXhjZXB0IGZvciBpbnNldAotICAgICB3aGljaCBpbmNsdWRlcyB1bm5lY2Vzc2FyeSBwYWRkaW5nLiAtLT4KLTxzaGFwZSB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgIGFuZHJvaWQ6c2hhcGU9InJlY3RhbmdsZSI+Ci0gICAgPGNvcm5lcnMgYW5kcm9pZDpyYWRpdXM9IjJkcCIgLz4KLSAgICA8c29saWQgYW5kcm9pZDpjb2xvcj0iQGNvbG9yL2JhY2tncm91bmRfZmxvYXRpbmdfbWF0ZXJpYWxfZGFyayIgLz4KLTwvc2hhcGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9kaWFsb2dfbWF0ZXJpYWxfYmFja2dyb3VuZF9saWdodC54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2RpYWxvZ19tYXRlcmlhbF9iYWNrZ3JvdW5kX2xpZ2h0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzFiMjM1YS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2RpYWxvZ19tYXRlcmlhbF9iYWNrZ3JvdW5kX2xpZ2h0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSBUaGlzIGlzIHRoZSBjb3B5IG9mIEBkcmF3YWJsZS9hYmNfZGlhbG9nX21hdGVyaWFsX2JhY2tncm91bmRfbGlnaHQgZXhjZXB0IGZvciBpbnNldAotICAgICB3aGljaCBpbmNsdWRlcyB1bm5lY2Vzc2FyeSBwYWRkaW5nLiAtLT4KLTxzaGFwZSB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgIGFuZHJvaWQ6c2hhcGU9InJlY3RhbmdsZSI+Ci0gICAgPGNvcm5lcnMgYW5kcm9pZDpyYWRpdXM9IjJkcCIgLz4KLSAgICA8c29saWQgYW5kcm9pZDpjb2xvcj0iQGNvbG9yL2JhY2tncm91bmRfZmxvYXRpbmdfbWF0ZXJpYWxfbGlnaHQiIC8+Ci08L3NoYXBlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfZ3JvdXBfY29sbGFwc2UueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9ncm91cF9jb2xsYXBzZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmNzJiYzguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9ncm91cF9jb2xsYXBzZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxhbmltYXRpb24tbGlzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgIGFuZHJvaWQ6b25lc2hvdD0idHJ1ZSI+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2dyb3VwX2NvbGxhcHNlXzAwIiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfY29sbGFwc2VfMDEiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9jb2xsYXBzZV8wMiIgYW5kcm9pZDpkdXJhdGlvbj0iMTMiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2dyb3VwX2NvbGxhcHNlXzAzIiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfY29sbGFwc2VfMDQiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9jb2xsYXBzZV8wNSIgYW5kcm9pZDpkdXJhdGlvbj0iMTMiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2dyb3VwX2NvbGxhcHNlXzA2IiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfY29sbGFwc2VfMDciIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9jb2xsYXBzZV8wOCIgYW5kcm9pZDpkdXJhdGlvbj0iMTMiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2dyb3VwX2NvbGxhcHNlXzA5IiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfY29sbGFwc2VfMTAiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9jb2xsYXBzZV8xMSIgYW5kcm9pZDpkdXJhdGlvbj0iMTMiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2dyb3VwX2NvbGxhcHNlXzEyIiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfY29sbGFwc2VfMTMiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9jb2xsYXBzZV8xNCIgYW5kcm9pZDpkdXJhdGlvbj0iMTMiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2dyb3VwX2NvbGxhcHNlXzE1IiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLTwvYW5pbWF0aW9uLWxpc3Q+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2dyb3VwX2V4cGFuZC54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2dyb3VwX2V4cGFuZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiM2ZkYjYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9ncm91cF9leHBhbmQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08YW5pbWF0aW9uLWxpc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgICAgICBhbmRyb2lkOm9uZXNob3Q9InRydWUiPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9leHBhbmRfMDAiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9leHBhbmRfMDEiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9leHBhbmRfMDIiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9leHBhbmRfMDMiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9leHBhbmRfMDQiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9leHBhbmRfMDUiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9leHBhbmRfMDYiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9leHBhbmRfMDciIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9leHBhbmRfMDgiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9leHBhbmRfMDkiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9leHBhbmRfMTAiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9leHBhbmRfMTEiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9leHBhbmRfMTIiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9leHBhbmRfMTMiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9leHBhbmRfMTQiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9leHBhbmRfMTUiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotPC9hbmltYXRpb24tbGlzdD4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfbWVkaWFfcGF1c2VfZGFyay54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX21lZGlhX3BhdXNlX2RhcmsueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjIxOGE3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfbWVkaWFfcGF1c2VfZGFyay54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxzZWxlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tZWRpYV9wYXVzZV9kYXJrIiAvPgotPC9zZWxlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfbWVkaWFfcGF1c2VfbGlnaHQueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9tZWRpYV9wYXVzZV9saWdodC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkZDFmMDIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9tZWRpYV9wYXVzZV9saWdodC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxzZWxlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgotICAgIDxpdGVtPgotICAgICAgICA8Yml0bWFwCi0gICAgICAgICAgICBhbmRyb2lkOnNyYz0iQGRyYXdhYmxlL2ljX21lZGlhX3BhdXNlX2xpZ2h0IgotICAgICAgICAgICAgYW5kcm9pZDphbHBoYT0iMC44NyIgLz4KLSAgICA8L2l0ZW0+Ci08L3NlbGVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9tZWRpYV9wbGF5X2RhcmsueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9tZWRpYV9wbGF5X2RhcmsueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDQ1YTMzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfbWVkaWFfcGxheV9kYXJrLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21lZGlhX3BsYXlfZGFyayIgLz4KLTwvc2VsZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX21lZGlhX3BsYXlfbGlnaHQueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9tZWRpYV9wbGF5X2xpZ2h0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjFmYjdhNi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX21lZGlhX3BsYXlfbGlnaHQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KLSAgICA8aXRlbT4KLSAgICAgICAgPGJpdG1hcAotICAgICAgICAgICAgYW5kcm9pZDpzcmM9IkBkcmF3YWJsZS9pY19tZWRpYV9wbGF5X2xpZ2h0IgotICAgICAgICAgICAgYW5kcm9pZDphbHBoYT0iMC44NyIgLz4KLSAgICA8L2l0ZW0+Ci08L3NlbGVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9tZWRpYV9zdG9wX2RhcmsueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9tZWRpYV9zdG9wX2RhcmsueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTEwOGE5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfbWVkaWFfc3RvcF9kYXJrLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21lZGlhX3N0b3BfZGFyayIgLz4KLTwvc2VsZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX21lZGlhX3N0b3BfbGlnaHQueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9tZWRpYV9zdG9wX2xpZ2h0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjJjNmNlOC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX21lZGlhX3N0b3BfbGlnaHQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KLSAgICA8aXRlbT4KLSAgICAgICAgPGJpdG1hcAotICAgICAgICAgICAgYW5kcm9pZDpzcmM9IkBkcmF3YWJsZS9pY19tZWRpYV9zdG9wX2xpZ2h0IgotICAgICAgICAgICAgYW5kcm9pZDphbHBoYT0iMC44NyIgLz4KLSAgICA8L2l0ZW0+Ci08L3NlbGVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl92b2xfdHlwZV9hdWRpb3RyYWNrX2RhcmsueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl92b2xfdHlwZV9hdWRpb3RyYWNrX2RhcmsueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGY0ZmQ2Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfdm9sX3R5cGVfYXVkaW90cmFja19kYXJrLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2F1ZGlvdHJhY2tfZGFyayIgLz4KLTwvc2VsZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX3ZvbF90eXBlX2F1ZGlvdHJhY2tfbGlnaHQueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl92b2xfdHlwZV9hdWRpb3RyYWNrX2xpZ2h0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWM5ZGJjMC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX3ZvbF90eXBlX2F1ZGlvdHJhY2tfbGlnaHQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KLSAgICA8aXRlbT4KLSAgICAgICAgPGJpdG1hcAotICAgICAgICAgICAgYW5kcm9pZDpzcmM9IkBkcmF3YWJsZS9pY19hdWRpb3RyYWNrX2xpZ2h0IgotICAgICAgICAgICAgYW5kcm9pZDphbHBoYT0iMC44NyIgLz4KLSAgICA8L2l0ZW0+Ci08L3NlbGVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9pbnRlcnBvbGF0b3IvbXJfZmFzdF9vdXRfc2xvd19pbi54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2ludGVycG9sYXRvci9tcl9mYXN0X291dF9zbG93X2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI2YTE3MS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2ludGVycG9sYXRvci9tcl9mYXN0X291dF9zbG93X2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tCi0gIH4gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICB+Ci0gIH4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIH4geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICB+IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgfiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICB+IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICB+IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgfiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQotICAtLT4KLQotPHBhdGhJbnRlcnBvbGF0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6Y29udHJvbFgxPSIwLjQiCi0gICAgYW5kcm9pZDpjb250cm9sWTE9IjAiCi0gICAgYW5kcm9pZDpjb250cm9sWDI9IjAuMiIKLSAgICBhbmRyb2lkOmNvbnRyb2xZMj0iMSIvPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9pbnRlcnBvbGF0b3IvbXJfbGluZWFyX291dF9zbG93X2luLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvaW50ZXJwb2xhdG9yL21yX2xpbmVhcl9vdXRfc2xvd19pbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwYmYyOTguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9pbnRlcnBvbGF0b3IvbXJfbGluZWFyX291dF9zbG93X2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tCi0gIH4gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICB+Ci0gIH4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIH4geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICB+IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgfiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICB+IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICB+IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgfiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQotICAtLT4KLQotPHBhdGhJbnRlcnBvbGF0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6Y29udHJvbFgxPSIwIgotICAgIGFuZHJvaWQ6Y29udHJvbFkxPSIwIgotICAgIGFuZHJvaWQ6Y29udHJvbFgyPSIwLjIiCi0gICAgYW5kcm9pZDpjb250cm9sWTI9IjEiLz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2VtYmVkZGVkX211c2ljLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2VtYmVkZGVkX211c2ljLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2U0ZDM2NS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9lbWJlZGRlZF9tdXNpYy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCi0gICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiPgotCi0gICAgPFZpZXcKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIwZHAiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMC4yNSIvPgotCi0gICAgPEltYWdlVmlldwotICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2FsYnVtIgotICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjBkcCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIwLjUiCi0gICAgICAgIGFuZHJvaWQ6c2NhbGVUeXBlPSJmaXRDZW50ZXIiCi0gICAgICAgIGFuZHJvaWQ6c3JjPSJAZHJhd2FibGUvaWNfZGVmYXVsdF9hbGJ1bV9pbWFnZSIgLz4KLQotICAgIDxWaWV3Ci0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMGRwIgotICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjAuMjUiLz4KLTwvTGluZWFyTGF5b3V0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2VtYmVkZGVkX3NldHRpbmdzX2xpc3RfaXRlbS54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9lbWJlZGRlZF9zZXR0aW5nc19saXN0X2l0ZW0ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTU2ZGNhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2VtYmVkZGVkX3NldHRpbmdzX2xpc3RfaXRlbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbWN2Ml9lbWJlZGRlZF9zZXR0aW5nc19oZWlnaHQiCi0gICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKLSAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBjb2xvci9ibGFja19vcGFjaXR5XzcwIj4KLQotICAgIDxMaW5lYXJMYXlvdXQKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbWN2Ml9lbWJlZGRlZF9zZXR0aW5nc19oZWlnaHQiCi0gICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgotICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIj4KLQotICAgICAgICA8SW1hZ2VWaWV3Ci0gICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2ljb24iCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iQGRpbWVuL21jdjJfZW1iZWRkZWRfc2V0dGluZ3NfaWNvbl9zaXplIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbWN2Ml9lbWJlZGRlZF9zZXR0aW5nc19pY29uX3NpemUiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW49IjhkcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIiAvPgotICAgIDwvTGluZWFyTGF5b3V0PgotCi0gICAgPFJlbGF0aXZlTGF5b3V0Ci0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfZW1iZWRkZWRfc2V0dGluZ3NfaGVpZ2h0IgotICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKLSAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiPgotCi0gICAgICAgIDxUZXh0VmlldwotICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9tYWluX3RleHQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbWN2Ml9lbWJlZGRlZF9zZXR0aW5nc190ZXh0X2hlaWdodCIKLSAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgotICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iMmRwIgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0Q29sb3I9IkBjb2xvci93aGl0ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IkBkaW1lbi9tY3YyX2VtYmVkZGVkX3NldHRpbmdzX21haW5fdGV4dF9zaXplIi8+Ci0KLSAgICAgICAgPFRleHRWaWV3Ci0gICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3N1Yl90ZXh0IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfZW1iZWRkZWRfc2V0dGluZ3NfdGV4dF9oZWlnaHQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9iZWxvdz0iQGlkL21haW5fdGV4dCIKLSAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgotICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iMmRwIgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0Q29sb3I9IkBjb2xvci93aGl0ZV9vcGFjaXR5XzcwIgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iQGRpbWVuL21jdjJfZW1iZWRkZWRfc2V0dGluZ3Nfc3ViX3RleHRfc2l6ZSIvPgotICAgIDwvUmVsYXRpdmVMYXlvdXQ+Ci08L0xpbmVhckxheW91dD4KLQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvZW1iZWRkZWRfc3ViX3NldHRpbmdzX2xpc3RfaXRlbS54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9lbWJlZGRlZF9zdWJfc2V0dGluZ3NfbGlzdF9pdGVtLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk0N2E3Mi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9lbWJlZGRlZF9zdWJfc2V0dGluZ3NfbGlzdF9pdGVtLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2VtYmVkZGVkX3NldHRpbmdzX2hlaWdodCIKLSAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgotICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGNvbG9yL2JsYWNrX29wYWNpdHlfNzAiPgotCi0gICAgPExpbmVhckxheW91dAotICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2VtYmVkZGVkX3NldHRpbmdzX2hlaWdodCIKLSAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCi0gICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiPgotCi0gICAgICAgIDxJbWFnZVZpZXcKLSAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvY2hlY2siCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iQGRpbWVuL21jdjJfZW1iZWRkZWRfc2V0dGluZ3NfaWNvbl9zaXplIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbWN2Ml9lbWJlZGRlZF9zZXR0aW5nc19pY29uX3NpemUiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW49IjhkcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgotICAgICAgICAgICAgYW5kcm9pZDpzcmM9IkBkcmF3YWJsZS9pY19jaGVjayIvPgotICAgIDwvTGluZWFyTGF5b3V0PgotCi0gICAgPFJlbGF0aXZlTGF5b3V0Ci0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfZW1iZWRkZWRfc2V0dGluZ3NfaGVpZ2h0IgotICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKLSAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiPgotCi0gICAgICAgIDxUZXh0VmlldwotICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC90ZXh0IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfZW1iZWRkZWRfc2V0dGluZ3NfdGV4dF9oZWlnaHQiCi0gICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKLSAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjJkcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSJAY29sb3Ivd2hpdGUiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSJAZGltZW4vbWN2Ml9lbWJlZGRlZF9zZXR0aW5nc19tYWluX3RleHRfc2l6ZSIvPgotICAgIDwvUmVsYXRpdmVMYXlvdXQ+Ci08L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2VtYmVkZGVkX3RyYW5zcG9ydF9jb250cm9scy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9lbWJlZGRlZF90cmFuc3BvcnRfY29udHJvbHMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhM2E1OTU3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2VtYmVkZGVkX3RyYW5zcG9ydF9jb250cm9scy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCi0gICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCi0gICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKLSAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSJAZGltZW4vbWN2Ml90cmFuc3BvcnRfY29udHJvbHNfcGFkZGluZyIKLSAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iQGRpbWVuL21jdjJfdHJhbnNwb3J0X2NvbnRyb2xzX3BhZGRpbmciCi0gICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJ2aXNpYmxlIj4KLQotICAgIDxJbWFnZUJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL3ByZXYiIHN0eWxlPSJAc3R5bGUvRW1iZWRkZWRUcmFuc3BvcnRDb250cm9sc0J1dHRvbi5QcmV2aW91cyIgLz4KLSAgICA8SW1hZ2VCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9yZXciIHN0eWxlPSJAc3R5bGUvRW1iZWRkZWRUcmFuc3BvcnRDb250cm9sc0J1dHRvbi5SZXciIC8+Ci0gICAgPEltYWdlQnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvcGF1c2UiIHN0eWxlPSJAc3R5bGUvRW1iZWRkZWRUcmFuc3BvcnRDb250cm9sc0J1dHRvbi5QYXVzZSIgLz4KLSAgICA8SW1hZ2VCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9mZndkIiBzdHlsZT0iQHN0eWxlL0VtYmVkZGVkVHJhbnNwb3J0Q29udHJvbHNCdXR0b24uRmZ3ZCIgLz4KLSAgICA8SW1hZ2VCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9uZXh0IiBzdHlsZT0iQHN0eWxlL0VtYmVkZGVkVHJhbnNwb3J0Q29udHJvbHNCdXR0b24uTmV4dCIgLz4KLTwvTGluZWFyTGF5b3V0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2Z1bGxfbGFuZHNjYXBlX211c2ljLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2Z1bGxfbGFuZHNjYXBlX211c2ljLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNlNzA1OC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9mdWxsX2xhbmRzY2FwZV9tdXNpYy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCi0gICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSIjQjMwMEZGMDAiCi0gICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCI+Ci0KLSAgICA8TGluZWFyTGF5b3V0Ci0gICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvbXVzaWNfaW1hZ2UiCi0gICAgICAgIHN0eWxlPSJAc3R5bGUvRnVsbE11c2ljTGFuZHNjYXBlLkltYWdlIj4KLQotICAgICAgICA8SW1hZ2VWaWV3Ci0gICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2FsYnVtIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IkBkaW1lbi9tY3YyX2Z1bGxfYWxidW1faW1hZ2VfbGFuZHNjYXBlX3NpemUiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2Z1bGxfYWxidW1faW1hZ2VfbGFuZHNjYXBlX3NpemUiCi0gICAgICAgICAgICBhbmRyb2lkOnNyYz0iQGRyYXdhYmxlL2ljX2RlZmF1bHRfYWxidW1faW1hZ2UiLz4KLSAgICA8L0xpbmVhckxheW91dD4KLQotICAgIDxMaW5lYXJMYXlvdXQKLSAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9tdXNpY190ZXh0IgotICAgICAgICBzdHlsZT0iQHN0eWxlL0Z1bGxNdXNpY0xhbmRzY2FwZS5UZXh0Ij4KLQotICAgICAgICA8VGV4dFZpZXcKLSAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdGl0bGUiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvbWN2Ml9tdXNpY190aXRsZV91bmtub3duX3RleHQiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIyMHNwIgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U3R5bGU9ImJvbGQiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHRDb2xvcj0iI0ZGRkZGRiIgLz4KLSAgICAgICAgPFRleHRWaWV3Ci0gICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2FydGlzdCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9tY3YyX211c2ljX2FydGlzdF91bmtub3duX3RleHQiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIxNnNwIgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0Q29sb3I9IiNCQkJCQkIiIC8+Ci0gICAgPC9MaW5lYXJMYXlvdXQ+Ci08L0xpbmVhckxheW91dD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9mdWxsX3BvcnRyYWl0X211c2ljLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2Z1bGxfcG9ydHJhaXRfbXVzaWMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NWYxYmIzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2Z1bGxfcG9ydHJhaXRfbXVzaWMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgotICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIj4KLQotICAgIDxMaW5lYXJMYXlvdXQKLSAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9tdXNpY19pbWFnZSIKLSAgICAgICAgc3R5bGU9IkBzdHlsZS9GdWxsTXVzaWNQb3J0cmFpdC5JbWFnZSI+Ci0KLSAgICAgICAgPEltYWdlVmlldwotICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9hbGJ1bSIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJAZGltZW4vbWN2Ml9mdWxsX2FsYnVtX2ltYWdlX3BvcnRyYWl0X3NpemUiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2Z1bGxfYWxidW1faW1hZ2VfcG9ydHJhaXRfc2l6ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6c3JjPSJAZHJhd2FibGUvaWNfZGVmYXVsdF9hbGJ1bV9pbWFnZSIvPgotICAgIDwvTGluZWFyTGF5b3V0PgotCi0gICAgPExpbmVhckxheW91dAotICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL211c2ljX3RleHQiCi0gICAgICAgIHN0eWxlPSJAc3R5bGUvRnVsbE11c2ljUG9ydHJhaXQuVGV4dCI+Ci0KLSAgICAgICAgPFRleHRWaWV3Ci0gICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3RpdGxlIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IkBkaW1lbi9tY3YyX2Z1bGxfYWxidW1faW1hZ2VfcG9ydHJhaXRfc2l6ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL21jdjJfbXVzaWNfdGl0bGVfdW5rbm93bl90ZXh0IgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjBzcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFN0eWxlPSJib2xkIgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0Q29sb3I9IiNGRkZGRkYiIC8+Ci0gICAgICAgIDxUZXh0VmlldwotICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9hcnRpc3QiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iQGRpbWVuL21jdjJfZnVsbF9hbGJ1bV9pbWFnZV9wb3J0cmFpdF9zaXplIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvbWN2Ml9tdXNpY19hcnRpc3RfdW5rbm93bl90ZXh0IgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMTZzcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSIjQkJCQkJCIiAvPgotICAgIDwvTGluZWFyTGF5b3V0PgotPC9MaW5lYXJMYXlvdXQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvZnVsbF9zZXR0aW5nc19saXN0X2l0ZW0ueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvZnVsbF9zZXR0aW5nc19saXN0X2l0ZW0ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTJlYTVlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2Z1bGxfc2V0dGluZ3NfbGlzdF9pdGVtLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2Z1bGxfc2V0dGluZ3NfaGVpZ2h0IgotICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCi0gICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAY29sb3IvYmxhY2tfb3BhY2l0eV83MCI+Ci0KLSAgICA8TGluZWFyTGF5b3V0Ci0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfZnVsbF9zZXR0aW5nc19oZWlnaHQiCi0gICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgotICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIj4KLQotICAgICAgICA8SW1hZ2VWaWV3Ci0gICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2ljb24iCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iQGRpbWVuL21jdjJfZnVsbF9zZXR0aW5nc19pY29uX3NpemUiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2Z1bGxfc2V0dGluZ3NfaWNvbl9zaXplIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luPSI4ZHAiCi0gICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIvPgotICAgIDwvTGluZWFyTGF5b3V0PgotCi0gICAgPFJlbGF0aXZlTGF5b3V0Ci0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfZnVsbF9zZXR0aW5nc19oZWlnaHQiCi0gICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgotICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCI+Ci0KLSAgICAgICAgPFRleHRWaWV3Ci0gICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL21haW5fdGV4dCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2Z1bGxfc2V0dGluZ3NfdGV4dF9oZWlnaHQiCi0gICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSIyZHAiCi0gICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSJAY29sb3Ivd2hpdGUiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSJAZGltZW4vbWN2Ml9mdWxsX3NldHRpbmdzX21haW5fdGV4dF9zaXplIi8+Ci0KLSAgICAgICAgPFRleHRWaWV3Ci0gICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3N1Yl90ZXh0IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfZnVsbF9zZXR0aW5nc190ZXh0X2hlaWdodCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2JlbG93PSJAaWQvbWFpbl90ZXh0IgotICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCi0gICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSIyZHAiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHRDb2xvcj0iQGNvbG9yL3doaXRlX29wYWNpdHlfNzAiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSJAZGltZW4vbWN2Ml9mdWxsX3NldHRpbmdzX3N1Yl90ZXh0X3NpemUiLz4KLSAgICA8L1JlbGF0aXZlTGF5b3V0PgotPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9mdWxsX3N1Yl9zZXR0aW5nc19saXN0X2l0ZW0ueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvZnVsbF9zdWJfc2V0dGluZ3NfbGlzdF9pdGVtLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDkxMjhkMC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9mdWxsX3N1Yl9zZXR0aW5nc19saXN0X2l0ZW0ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfZnVsbF9zZXR0aW5nc19oZWlnaHQiCi0gICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKLSAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBjb2xvci9ibGFja19vcGFjaXR5XzcwIj4KLQotICAgIDxMaW5lYXJMYXlvdXQKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbWN2Ml9mdWxsX3NldHRpbmdzX2hlaWdodCIKLSAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCi0gICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiPgotCi0gICAgICAgIDxJbWFnZVZpZXcKLSAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvY2hlY2siCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iQGRpbWVuL21jdjJfZnVsbF9zZXR0aW5nc19pY29uX3NpemUiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2Z1bGxfc2V0dGluZ3NfaWNvbl9zaXplIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luPSI4ZHAiCi0gICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKLSAgICAgICAgICAgIGFuZHJvaWQ6c3JjPSJAZHJhd2FibGUvaWNfY2hlY2siLz4KLSAgICA8L0xpbmVhckxheW91dD4KLQotICAgIDxSZWxhdGl2ZUxheW91dAotICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2Z1bGxfc2V0dGluZ3NfaGVpZ2h0IgotICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKLSAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiPgotCi0gICAgICAgIDxUZXh0VmlldwotICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC90ZXh0IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfZnVsbF9zZXR0aW5nc190ZXh0X2hlaWdodCIKLSAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgotICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iMmRwIgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0Q29sb3I9IkBjb2xvci93aGl0ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IkBkaW1lbi9tY3YyX2Z1bGxfc2V0dGluZ3NfbWFpbl90ZXh0X3NpemUiLz4KLSAgICA8L1JlbGF0aXZlTGF5b3V0PgotPC9MaW5lYXJMYXlvdXQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvZnVsbF90cmFuc3BvcnRfY29udHJvbHMueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvZnVsbF90cmFuc3BvcnRfY29udHJvbHMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTE0Nzg1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2Z1bGxfdHJhbnNwb3J0X2NvbnRyb2xzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKLSAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKLSAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgotICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IkBkaW1lbi9tY3YyX3RyYW5zcG9ydF9jb250cm9sc19wYWRkaW5nIgotICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSJAZGltZW4vbWN2Ml90cmFuc3BvcnRfY29udHJvbHNfcGFkZGluZyIKLSAgICBhbmRyb2lkOnZpc2liaWxpdHk9InZpc2libGUiPgotCi0gICAgPEltYWdlQnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvcHJldiIgc3R5bGU9IkBzdHlsZS9GdWxsVHJhbnNwb3J0Q29udHJvbHNCdXR0b24uUHJldmlvdXMiIC8+Ci0gICAgPEltYWdlQnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvcmV3IiBzdHlsZT0iQHN0eWxlL0Z1bGxUcmFuc3BvcnRDb250cm9sc0J1dHRvbi5SZXciIC8+Ci0gICAgPEltYWdlQnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvcGF1c2UiIHN0eWxlPSJAc3R5bGUvRnVsbFRyYW5zcG9ydENvbnRyb2xzQnV0dG9uLlBhdXNlIiAvPgotICAgIDxJbWFnZUJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL2Zmd2QiIHN0eWxlPSJAc3R5bGUvRnVsbFRyYW5zcG9ydENvbnRyb2xzQnV0dG9uLkZmd2QiIC8+Ci0gICAgPEltYWdlQnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvbmV4dCIgc3R5bGU9IkBzdHlsZS9GdWxsVHJhbnNwb3J0Q29udHJvbHNCdXR0b24uTmV4dCIgLz4KLTwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvbWVkaWFfY29udHJvbGxlci54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9tZWRpYV9jb250cm9sbGVyLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDY1OGYwNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9tZWRpYV9jb250cm9sbGVyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI2NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgotICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgotICAgIGFuZHJvaWQ6bGF5b3V0RGlyZWN0aW9uPSJsdHIiPgotCi0gICAgPFJlbGF0aXZlTGF5b3V0Ci0gICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdGl0bGVfYmFyIgotICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBsYXlvdXQvdGl0bGVfYmFyX2dyYWRpZW50IgotICAgICAgICBzdHlsZT0iQHN0eWxlL1RpdGxlQmFyIj4KLQotICAgICAgICA8TGluZWFyTGF5b3V0Ci0gICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3RpdGxlX2Jhcl9sZWZ0IgotICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudExlZnQ9InRydWUiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9jZW50ZXJWZXJ0aWNhbD0idHJ1ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiPgotCi0gICAgICAgICAgICA8SW1hZ2VCdXR0b24KLSAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2JhY2siCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpjbGlja2FibGU9InRydWUiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudFN0YXJ0PSJ0cnVlIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2NlbnRlclZlcnRpY2FsPSJ0cnVlIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjVkaXAiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJ2aXNpYmxlIgotICAgICAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvVGl0bGVCYXJCdXR0b24uQmFjayIvPgotCi0gICAgICAgICAgICA8VGV4dFZpZXcKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3RpdGxlX3RleHQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDplbGxpcHNpemU9ImVuZCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3RvUmlnaHRPZj0iQGlkL2JhY2siCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfY2VudGVyVmVydGljYWw9InRydWUiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDptYXhMaW5lcz0iMSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSI1ZGlwIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSI1ZGlwIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjE1c3AiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0Q29sb3I9IiNGRkZGRkZGRiIvPgotICAgICAgICA8L0xpbmVhckxheW91dD4KLQotICAgICAgICA8TGluZWFyTGF5b3V0Ci0gICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3RpdGxlX2Jhcl9yaWdodCIKLSAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRSaWdodD0idHJ1ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2NlbnRlclZlcnRpY2FsPSJ0cnVlIgotICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCI+Ci0KLSAgICAgICAgICAgIDxMaW5lYXJMYXlvdXQKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2FkX2V4dGVybmFsX2xpbmsiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpjbGlja2FibGU9InRydWUiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudFJpZ2h0PSJ0cnVlIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2NlbnRlclZlcnRpY2FsPSJ0cnVlIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjVkaXAiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjEwZGlwIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIj4KLQotICAgICAgICAgICAgICAgIDxUZXh0VmlldwotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2FkX3RleHQiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9jZW50ZXJWZXJ0aWNhbD0idHJ1ZSIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjVkaXAiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9NZWRpYUNvbnRyb2xWaWV3Ml9hZF90ZXh0IgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIxMHNwIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRDb2xvcj0iI0ZGRkZGRkZGIiAvPgotCi0gICAgICAgICAgICAgICAgPEltYWdlQnV0dG9uCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYWRfbGF1bmNoIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfY2VudGVyVmVydGljYWw9InRydWUiCi0gICAgICAgICAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvVGl0bGVCYXJCdXR0b24uTGF1bmNoIiAvPgotICAgICAgICAgICAgPC9MaW5lYXJMYXlvdXQ+Ci0KLSAgICAgICAgICAgIDx2aWV3IGNsYXNzPSJjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLmFwcC5NZWRpYVJvdXRlQnV0dG9uIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvY2FzdCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9jZW50ZXJWZXJ0aWNhbD0idHJ1ZSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb249IkBzdHJpbmcvbXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iCi0gICAgICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9UaXRsZUJhckJ1dHRvbiIgLz4KLSAgICAgICAgPC9MaW5lYXJMYXlvdXQ+Ci0KLSAgICA8L1JlbGF0aXZlTGF5b3V0PgotCi0gICAgPExpbmVhckxheW91dAotICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2NlbnRlcl92aWV3IgotICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjBkcCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgotICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKLSAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiPgotICAgIDwvTGluZWFyTGF5b3V0PgotCi0gICAgPExpbmVhckxheW91dAotICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL21pbmltYWxfZXh0cmFfdmlldyIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0icmlnaHQiPgotCi0gICAgICAgIDxJbWFnZUJ1dHRvbgotICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9mdWxsc2NyZWVuIgotICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJyaWdodCIKLSAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvQm90dG9tQmFyQnV0dG9uLkZ1bGxTY3JlZW4iIC8+Ci0gICAgPC9MaW5lYXJMYXlvdXQ+Ci0KLSAgICA8UmVsYXRpdmVMYXlvdXQKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbWN2Ml9jdXN0b21fcHJvZ3Jlc3NfdGh1bWJfc2l6ZSI+Ci0KLSAgICAgICAgPFNlZWtCYXIKLSAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvcHJvZ3Jlc3MiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbWN2Ml9jdXN0b21fcHJvZ3Jlc3NfdGh1bWJfc2l6ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uPSJAc3RyaW5nL21jdjJfc2Vla19iYXJfZGVzYyIKLSAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZz0iMGRwIgotICAgICAgICAgICAgYW5kcm9pZDptYXhIZWlnaHQ9IkBkaW1lbi9tY3YyX2N1c3RvbV9wcm9ncmVzc19tYXhfc2l6ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6bWluSGVpZ2h0PSJAZGltZW4vbWN2Ml9jdXN0b21fcHJvZ3Jlc3NfbWF4X3NpemUiCi0gICAgICAgICAgICBhbmRyb2lkOmVsZXZhdGlvbj0iMTBkcCIvPgotCi0gICAgICAgIDxWaWV3Ci0gICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3Byb2dyZXNzX2J1ZmZlciIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2J1ZmZlcl92aWV3X2hlaWdodCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50Qm90dG9tPSJ0cnVlIgotICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAY29sb3IvYm90dG9tX2Jhcl9iYWNrZ3JvdW5kIgotICAgICAgICAgICAgYW5kcm9pZDplbGV2YXRpb249IjBkcCIvPgotICAgIDwvUmVsYXRpdmVMYXlvdXQ+Ci0KLSAgICA8UmVsYXRpdmVMYXlvdXQKLSAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9ib3R0b21fYmFyIgotICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjQ0ZHAiCi0gICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCi0gICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGNvbG9yL2JvdHRvbV9iYXJfYmFja2dyb3VuZCI+Ci0KLSAgICAgICAgPExpbmVhckxheW91dAotICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9ib3R0b21fYmFyX2xlZnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudFN0YXJ0PSJ0cnVlIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfY2VudGVyVmVydGljYWw9InRydWUiPgotCi0gICAgICAgICAgICA8VGV4dFZpZXcKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2FkX3NraXBfdGltZSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjRkcCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIxMnNwIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSIjRkZGRkZGIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIgLz4KLSAgICAgICAgPC9MaW5lYXJMYXlvdXQ+Ci0KLSAgICAgICAgPExpbmVhckxheW91dAotICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC90aW1lIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfdG9SaWdodE9mPSJAaWQvYm90dG9tX2Jhcl9sZWZ0IgotICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iMTBkcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSIxMGRwIgotICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiID4KLQotICAgICAgICAgICAgPFRleHRWaWV3Ci0gICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC90aW1lX2N1cnJlbnQiCi0gICAgICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9UaW1lVGV4dC5DdXJyZW50Ii8+Ci0gICAgICAgICAgICA8VGV4dFZpZXcKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3RpbWVfaW50ZXJwdW5jdCIKLSAgICAgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL1RpbWVUZXh0LkludGVycHVuY3QiLz4KLSAgICAgICAgICAgIDxUZXh0VmlldwotICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdGltZV9lbmQiCi0gICAgICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9UaW1lVGV4dC5FbmQiLz4KLSAgICAgICAgPC9MaW5lYXJMYXlvdXQ+Ci0KLSAgICAgICAgPExpbmVhckxheW91dAotICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9ib3R0b21fYmFyX3JpZ2h0IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRFbmQ9InRydWUiCi0gICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9InJpZ2h0Ij4KLQotICAgICAgICAgICAgPExpbmVhckxheW91dAotICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYmFzaWNfY29udHJvbHMiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIiA+Ci0KLSAgICAgICAgICAgICAgICA8VGV4dFZpZXcKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9hZF9yZW1haW5pbmciCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMTJzcCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0Q29sb3I9IiNGRkZGRkYiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIgLz4KLQotICAgICAgICAgICAgICAgIDxJbWFnZUJ1dHRvbgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL211dGUiCi0gICAgICAgICAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvQm90dG9tQmFyQnV0dG9uLk11dGUiIC8+Ci0gICAgICAgICAgICAgICAgPEltYWdlQnV0dG9uCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvc3VidGl0bGUiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2NhbGVUeXBlPSJmaXRDZW50ZXIiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIKLSAgICAgICAgICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9Cb3R0b21CYXJCdXR0b24uQ0MiIC8+Ci0gICAgICAgICAgICAgICAgPEltYWdlQnV0dG9uCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvZnVsbHNjcmVlbiIKLSAgICAgICAgICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9Cb3R0b21CYXJCdXR0b24uRnVsbFNjcmVlbiIvPgotICAgICAgICAgICAgICAgIDxJbWFnZUJ1dHRvbgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL292ZXJmbG93X3JpZ2h0IgotICAgICAgICAgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL0JvdHRvbUJhckJ1dHRvbi5PdmVyZmxvd1JpZ2h0Ii8+Ci0gICAgICAgICAgICA8L0xpbmVhckxheW91dD4KLQotICAgICAgICAgICAgPExpbmVhckxheW91dAotICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvZXh0cmFfY29udHJvbHMiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCI+Ci0KLSAgICAgICAgICAgICAgICA8TGluZWFyTGF5b3V0Ci0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvY3VzdG9tX2J1dHRvbnMiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IiAvPgotCi0gICAgICAgICAgICAgICAgPEltYWdlQnV0dG9uCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdmlkZW9fcXVhbGl0eSIKLSAgICAgICAgICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9Cb3R0b21CYXJCdXR0b24uVmlkZW9RdWFsaXR5IiAvPgotICAgICAgICAgICAgICAgIDxJbWFnZUJ1dHRvbgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3NldHRpbmdzIgotICAgICAgICAgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL0JvdHRvbUJhckJ1dHRvbi5TZXR0aW5ncyIgLz4KLSAgICAgICAgICAgICAgICA8SW1hZ2VCdXR0b24KLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9vdmVyZmxvd19sZWZ0IgotICAgICAgICAgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL0JvdHRvbUJhckJ1dHRvbi5PdmVyZmxvd0xlZnQiLz4KLSAgICAgICAgICAgIDwvTGluZWFyTGF5b3V0PgotICAgICAgICA8L0xpbmVhckxheW91dD4KLSAgICA8L1JlbGF0aXZlTGF5b3V0PgotPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9taW5pbWFsX3RyYW5zcG9ydF9jb250cm9scy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9taW5pbWFsX3RyYW5zcG9ydF9jb250cm9scy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwMGM4MGIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvbWluaW1hbF90cmFuc3BvcnRfY29udHJvbHMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgotICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgotICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiPgotCi0gICAgPEltYWdlQnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvcGF1c2UiIHN0eWxlPSJAc3R5bGUvTWluaW1hbFRyYW5zcG9ydENvbnRyb2xzQnV0dG9uIiAvPgotPC9MaW5lYXJMYXlvdXQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvbXJfY2hvb3Nlcl9kaWFsb2cueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvbXJfY2hvb3Nlcl9kaWFsb2cueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTg5ZTE2Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L21yX2Nob29zZXJfZGlhbG9nLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgotICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIj4KLSAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9tcl9jaG9vc2VyX3RpdGxlIgotICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCi0gICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSIyNGRwIgotICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iMjRkcCIKLSAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nVG9wPSIyNGRwIgotICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvbXJfY2hvb3Nlcl90aXRsZSIKLSAgICAgICAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJ0cnVlIgotICAgICAgICAgICAgICBhbmRyb2lkOmVsbGlwc2l6ZT0iZW5kIgotICAgICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSJAc3R5bGUvVGV4dEFwcGVhcmFuY2UuTWVkaWFSb3V0ZXIuVGl0bGUiIC8+Ci0gICAgPExpc3RWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvbXJfY2hvb3Nlcl9saXN0IgotICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCi0gICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICBhbmRyb2lkOmRpdmlkZXI9IkBhbmRyb2lkOmNvbG9yL3RyYW5zcGFyZW50IgotICAgICAgICAgICAgICBhbmRyb2lkOmRpdmlkZXJIZWlnaHQ9IjBkcCIgLz4KLSAgICA8TGluZWFyTGF5b3V0IGFuZHJvaWQ6aWQ9IkBhbmRyb2lkOmlkL2VtcHR5IgotICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCi0gICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMjQwZHAiCi0gICAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgotICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdUb3A9IjkwZHAiCi0gICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjE2ZHAiCi0gICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSIxNmRwIgotICAgICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiPgotICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iY2VudGVyIgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL21yX2Nob29zZXJfc2VhcmNoaW5nIgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iQHN0eWxlL1RleHRBcHBlYXJhbmNlLk1lZGlhUm91dGVyLlNlY29uZGFyeVRleHQiIC8+Ci0gICAgICAgIDxQcm9ncmVzc0JhciBhbmRyb2lkOmxheW91dF93aWR0aD0iMTUwZHAiCi0gICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImNlbnRlciIKLSAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aW5kZXRlcm1pbmF0ZT0idHJ1ZSIKLSAgICAgICAgICAgICAgICAgICAgIHN0eWxlPSI/YW5kcm9pZDphdHRyL3Byb2dyZXNzQmFyU3R5bGVIb3Jpem9udGFsIiAvPgotICAgIDwvTGluZWFyTGF5b3V0PgotPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9tcl9jaG9vc2VyX2xpc3RfaXRlbS54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9tcl9jaG9vc2VyX2xpc3RfaXRlbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1ODg3OWIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvbXJfY2hvb3Nlcl9saXN0X2l0ZW0ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgotICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgYW5kcm9pZDptaW5IZWlnaHQ9IjU2ZHAiCi0gICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjI0ZHAiCi0gICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSIyNGRwIgotICAgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgotICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCIgPgotCi0gICAgPEltYWdlVmlldyBhbmRyb2lkOmlkPSJAK2lkL21yX2Nob29zZXJfcm91dGVfaWNvbiIKLSAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIyNGRwIgotICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIyNGRwIgotICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjI0ZHAiIC8+Ci0KLSAgICA8TGluZWFyTGF5b3V0IGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSIxZHAiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIgPgotCi0gICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL21yX2Nob29zZXJfcm91dGVfbmFtZSIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMzJkcCIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZWxsaXBzaXplPSJtYXJxdWVlIgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iQHN0eWxlL1RleHRBcHBlYXJhbmNlLk1lZGlhUm91dGVyLlByaW1hcnlUZXh0IiAvPgotCi0gICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL21yX2Nob29zZXJfcm91dGVfZGVzYyIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMjRkcCIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZWxsaXBzaXplPSJtYXJxdWVlIgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iQHN0eWxlL1RleHRBcHBlYXJhbmNlLk1lZGlhUm91dGVyLlNlY29uZGFyeVRleHQiIC8+Ci0gICAgPC9MaW5lYXJMYXlvdXQ+Ci0KLTwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvbXJfY29udHJvbGxlcl9tYXRlcmlhbF9kaWFsb2dfYi54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9tcl9jb250cm9sbGVyX21hdGVyaWFsX2RpYWxvZ19iLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjMwNDQ3MS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9tcl9jb250cm9sbGVyX21hdGVyaWFsX2RpYWxvZ19iLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIwNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxGcmFtZUxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgYW5kcm9pZDppZD0iQCtpZC9tcl9leHBhbmRhYmxlX2FyZWEiCi0gICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgotICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iZmlsbF9wYXJlbnQiPgotICAgIDxMaW5lYXJMYXlvdXQgYW5kcm9pZDppZD0iQCtpZC9tcl9kaWFsb2dfYXJlYSIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgotICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iY2VudGVyIgotICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKLSAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSI/YW5kcm9pZDphdHRyL2NvbG9yQmFja2dyb3VuZEZsb2F0aW5nIj4KLSAgICAgICAgPExpbmVhckxheW91dCBhbmRyb2lkOmlkPSJAK2lkL21yX3RpdGxlX2JhciIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iMjRkcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSIxMmRwIgotICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIgPgotICAgICAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvbXJfbmFtZSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMGRwIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iNzJkcCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJ0cnVlIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZWxsaXBzaXplPSJlbmQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iQHN0eWxlL1RleHRBcHBlYXJhbmNlLk1lZGlhUm91dGVyLlRpdGxlIiAvPgotICAgICAgICAgICAgPEltYWdlQnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvbXJfY2xvc2UiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjQ4ZHAiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSI0OGRwIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmNvbnRlbnREZXNjcmlwdGlvbj0iQHN0cmluZy9tcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6c3JjPSI/YXR0ci9tZWRpYVJvdXRlQ2xvc2VEcmF3YWJsZSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9Ij9hbmRyb2lkOmF0dHIvc2VsZWN0YWJsZUl0ZW1CYWNrZ3JvdW5kQm9yZGVybGVzcyIgLz4KLSAgICAgICAgPC9MaW5lYXJMYXlvdXQ+Ci0gICAgICAgIDxGcmFtZUxheW91dCBhbmRyb2lkOmlkPSJAK2lkL21yX2N1c3RvbV9jb250cm9sIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiIC8+Ci0gICAgICAgIDxGcmFtZUxheW91dCBhbmRyb2lkOmlkPSJAK2lkL21yX2RlZmF1bHRfY29udHJvbCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50Ij4KLSAgICAgICAgICAgIDxJbWFnZVZpZXcgYW5kcm9pZDppZD0iQCtpZC9tcl9hcnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6YWRqdXN0Vmlld0JvdW5kcz0idHJ1ZSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnNjYWxlVHlwZT0iZml0WFkiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSI/YW5kcm9pZDphdHRyL2NvbG9yUHJpbWFyeSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJ0b3AiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb249IkBzdHJpbmcvbXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIiAvPgotICAgICAgICAgICAgPExpbmVhckxheW91dCBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iYm90dG9tIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6c3BsaXRNb3Rpb25FdmVudHM9ImZhbHNlIj4KLSAgICAgICAgICAgICAgICA8TGluZWFyTGF5b3V0IGFuZHJvaWQ6aWQ9IkAraWQvbXJfbWVkaWFfbWFpbl9jb250cm9sIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nVG9wPSIxNmRwIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdCb3R0b209IjE2ZHAiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImJvdHRvbSIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iP2F0dHIvbWVkaWFSb3V0ZUNvbnRyb2xQYW5lbFRoZW1lT3ZlcmxheSI+Ci0gICAgICAgICAgICAgICAgICAgIDxSZWxhdGl2ZUxheW91dAotICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9tcl9wbGF5YmFja19jb250cm9sIgotICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgotICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgotICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iMjRkcCIKLSAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSIxMmRwIiA+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8SW1hZ2VCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9tcl9jb250cm9sX3BsYXliYWNrX2N0cmwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSIxMmRwIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50UmlnaHQ9InRydWUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfY2VudGVyVmVydGljYWw9InRydWUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb249IkBzdHJpbmcvbXJfY29udHJvbGxlcl9wbGF5IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iP2FuZHJvaWQ6YXR0ci9zZWxlY3RhYmxlSXRlbUJhY2tncm91bmRCb3JkZXJsZXNzIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxMaW5lYXJMYXlvdXQgYW5kcm9pZDppZD0iQCtpZC9tcl9jb250cm9sX3RpdGxlX2NvbnRhaW5lciIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3RvTGVmdE9mPSJAaWQvbXJfY29udHJvbF9wbGF5YmFja19jdHJsIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50TGVmdD0idHJ1ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9jZW50ZXJWZXJ0aWNhbD0idHJ1ZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvbXJfY29udHJvbF90aXRsZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9IkBzdHlsZS9UZXh0QXBwZWFyYW5jZS5NZWRpYVJvdXRlci5QcmltYXJ5VGV4dCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJ0cnVlIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL21yX2NvbnRyb2xfc3VidGl0bGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSJAc3R5bGUvVGV4dEFwcGVhcmFuY2UuTWVkaWFSb3V0ZXIuU2Vjb25kYXJ5VGV4dCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJ0cnVlIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9MaW5lYXJMYXlvdXQ+Ci0gICAgICAgICAgICAgICAgICAgIDwvUmVsYXRpdmVMYXlvdXQ+Ci0gICAgICAgICAgICAgICAgICAgIDxWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvbXJfY29udHJvbF9kaXZpZGVyIgotICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgotICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSI4ZHAiCi0gICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDxMaW5lYXJMYXlvdXQKLSAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvbXJfdm9sdW1lX2NvbnRyb2wiCi0gICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCi0gICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bWluSGVpZ2h0PSI0OGRwIgotICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiCi0gICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSIyNGRwIgotICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjEyZHAiCi0gICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnNwbGl0TW90aW9uRXZlbnRzPSJmYWxzZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8SW1hZ2VWaWV3Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjI0ZHAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIyNGRwIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c3JjPSI/YXR0ci9tZWRpYVJvdXRlQXVkaW9UcmFja0RyYXdhYmxlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2NhbGVUeXBlPSJjZW50ZXIiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gU2luY2UgZGlhbG9nJ3MgdG9wIGxheW91dCBtcl9leHBhbmRhYmxlX2FyZWEgaXMgY2xpY2thYmxlLCBpdCBwcm9wYWdhdGVzIHByZXNzZWQgc3RhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gaXRzIG5vbi1jbGlja2FibGUgY2hpbGRyZW4uIFNwZWNpZnkgYW5kcm9pZDpjbGlja2FibGU9InRydWUiIHRvIHByZXZlbnQgdm9sdW1lIHNsaWRlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIGhhdmluZyBmYWxzZSBwcmVzc2VkIHN0YXRlLiAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLmFwcC5NZWRpYVJvdXRlVm9sdW1lU2xpZGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9tcl92b2x1bWVfc2xpZGVyIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIwZHAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDptaW5IZWlnaHQ9IjQ4ZHAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDptYXhIZWlnaHQ9IjQ4ZHAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6Y2xpY2thYmxlPSJ0cnVlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uPSJAc3RyaW5nL21yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLmFwcC5NZWRpYVJvdXRlRXhwYW5kQ29sbGFwc2VCdXR0b24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL21yX2dyb3VwX2V4cGFuZF9jb2xsYXBzZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iNDhkcCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjQ4ZHAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nPSIxMmRwIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iP2FuZHJvaWQ6YXR0ci9zZWxlY3RhYmxlSXRlbUJhY2tncm91bmRCb3JkZXJsZXNzIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIvPgotICAgICAgICAgICAgICAgICAgICA8L0xpbmVhckxheW91dD4KLSAgICAgICAgICAgICAgICA8L0xpbmVhckxheW91dD4KLSAgICAgICAgICAgICAgICA8Y29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5hcHAuT3ZlcmxheUxpc3RWaWV3Ci0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvbXJfdm9sdW1lX2dyb3VwX2xpc3QiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1RvcD0iQGRpbWVuL21yX2NvbnRyb2xsZXJfdm9sdW1lX2dyb3VwX2xpc3RfcGFkZGluZ190b3AiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2Nyb2xsYmFyU3R5bGU9Im91dHNpZGVPdmVybGF5IgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmNsaXBUb1BhZGRpbmc9ImZhbHNlIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c3BsaXRNb3Rpb25FdmVudHM9ImZhbHNlIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRoZW1lPSI/YXR0ci9tZWRpYVJvdXRlQ29udHJvbFBhbmVsVGhlbWVPdmVybGF5IiAvPgotICAgICAgICAgICAgPC9MaW5lYXJMYXlvdXQ+Ci0gICAgICAgIDwvRnJhbWVMYXlvdXQ+Ci0gICAgICAgIDxTY3JvbGxWaWV3Ci0gICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2J1dHRvblBhbmVsIgotICAgICAgICAgICAgc3R5bGU9Ij9hdHRyL2J1dHRvbkJhclN0eWxlIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDpmaWxsVmlld3BvcnQ9InRydWUiCi0gICAgICAgICAgICBhbmRyb2lkOnNjcm9sbEluZGljYXRvcnM9InRvcHxib3R0b20iPgotICAgICAgICAgICAgPGFuZHJvaWQuc3VwcG9ydC52Ny53aWRnZXQuQnV0dG9uQmFyTGF5b3V0Ci0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImJvdHRvbSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dERpcmVjdGlvbj0ibG9jYWxlIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nQm90dG9tPSI0ZHAiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iMTJkcCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iMTJkcCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdUb3A9IjRkcCI+Ci0gICAgICAgICAgICAgICAgPEJ1dHRvbgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAYW5kcm9pZDppZC9idXR0b24zIgotICAgICAgICAgICAgICAgICAgICBzdHlsZT0iP2FuZHJvaWQ6YXR0ci9idXR0b25CYXJOZXV0cmFsQnV0dG9uU3R5bGUiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGFuZHJvaWQuc3VwcG9ydC52NC53aWRnZXQuU3BhY2UKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9zcGFjZXIiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIwZHAiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMGRwIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iaW52aXNpYmxlIi8+Ci0gICAgICAgICAgICAgICAgPEJ1dHRvbgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAYW5kcm9pZDppZC9idXR0b24yIgotICAgICAgICAgICAgICAgICAgICBzdHlsZT0iP2FuZHJvaWQ6YXR0ci9idXR0b25CYXJOZWdhdGl2ZUJ1dHRvblN0eWxlIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIvPgotICAgICAgICAgICAgICAgIDxCdXR0b24KLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQGFuZHJvaWQ6aWQvYnV0dG9uMSIKLSAgICAgICAgICAgICAgICAgICAgc3R5bGU9Ij9hbmRyb2lkOmF0dHIvYnV0dG9uQmFyUG9zaXRpdmVCdXR0b25TdHlsZSIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiLz4KLSAgICAgICAgICAgIDwvYW5kcm9pZC5zdXBwb3J0LnY3LndpZGdldC5CdXR0b25CYXJMYXlvdXQ+Ci0gICAgICAgIDwvU2Nyb2xsVmlldz4KLSAgICA8L0xpbmVhckxheW91dD4KLTwvRnJhbWVMYXlvdXQ+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9tcl9jb250cm9sbGVyX3ZvbHVtZV9pdGVtLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L21yX2NvbnRyb2xsZXJfdm9sdW1lX2l0ZW0ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODkwNThiLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L21yX2NvbnRyb2xsZXJfdm9sdW1lX2l0ZW0ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgotICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCI+Ci0gICAgPExpbmVhckxheW91dCBhbmRyb2lkOmlkPSJAK2lkL3ZvbHVtZV9pdGVtX2NvbnRhaW5lciIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21yX2NvbnRyb2xsZXJfdm9sdW1lX2dyb3VwX2xpc3RfaXRlbV9oZWlnaHQiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSIyNGRwIgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjYwZHAiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdCb3R0b209IjhkcCIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIiA+Ci0gICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL21yX25hbWUiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSJAc3R5bGUvVGV4dEFwcGVhcmFuY2UuTWVkaWFSb3V0ZXIuU2Vjb25kYXJ5VGV4dCIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIgLz4KLSAgICAgICAgPExpbmVhckxheW91dCBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCi0gICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKLSAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCI+Ci0gICAgICAgICAgICA8SW1hZ2VWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvbXJfdm9sdW1lX2l0ZW1faWNvbiIKLSAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IkBkaW1lbi9tcl9jb250cm9sbGVyX3ZvbHVtZV9ncm91cF9saXN0X2l0ZW1faWNvbl9zaXplIgotICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tcl9jb250cm9sbGVyX3ZvbHVtZV9ncm91cF9saXN0X2l0ZW1faWNvbl9zaXplIgotICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjhkcCIKLSAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSI4ZHAiCi0gICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2NhbGVUeXBlPSJmaXRDZW50ZXIiCi0gICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c3JjPSI/YXR0ci9tZWRpYVJvdXRlQXVkaW9UcmFja0RyYXdhYmxlIiAvPgotICAgICAgICAgICAgPGFuZHJvaWQuc3VwcG9ydC52Ny5hcHAuTWVkaWFSb3V0ZVZvbHVtZVNsaWRlcgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvbXJfdm9sdW1lX3NsaWRlciIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSI0MGRwIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bWluSGVpZ2h0PSI0MGRwIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bWF4SGVpZ2h0PSI0MGRwIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uPSJAc3RyaW5nL21yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgLz4KLSAgICAgICAgPC9MaW5lYXJMYXlvdXQ+Ci0gICAgPC9MaW5lYXJMYXlvdXQ+Ci08L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L3NldHRpbmdzX2xpc3QueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvc2V0dGluZ3NfbGlzdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhMzA1MzguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvc2V0dGluZ3NfbGlzdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxMaXN0VmlldyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IkBkaW1lbi9tY3YyX2VtYmVkZGVkX3NldHRpbmdzX3dpZHRoIgotICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfZW1iZWRkZWRfc2V0dGluZ3NfaGVpZ2h0IgotICAgIGFuZHJvaWQ6ZGl2aWRlcj0iQG51bGwiCi0gICAgYW5kcm9pZDpkaXZpZGVySGVpZ2h0PSIwZHAiPgotPC9MaXN0Vmlldz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC90aXRsZV9iYXJfZ3JhZGllbnQueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvdGl0bGVfYmFyX2dyYWRpZW50LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWIxZmM2ZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC90aXRsZV9iYXJfZ3JhZGllbnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08c2hhcGUgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6c2hhcGU9InJlY3RhbmdsZSI+Ci0gICAgPGdyYWRpZW50Ci0gICAgICAgIGFuZHJvaWQ6c3RhcnRDb2xvcj0iQGNvbG9yL3RpdGxlX2Jhcl9ncmFkaWVudF9zdGFydCIKLSAgICAgICAgYW5kcm9pZDplbmRDb2xvcj0iQGNvbG9yL3RpdGxlX2Jhcl9ncmFkaWVudF9lbmQiCi0gICAgICAgIGFuZHJvaWQ6YW5nbGU9Ii0yNzAiIC8+Ci08L3NoYXBlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWFmL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYWYvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3MjMwYWQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYWYvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU3RlbHNlbCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJUb2VzdGVsbGUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJDYXN0LWtub3BwaWUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJVaXRzYWFpLWtub3BwaWUuIE9udGtvcHBlbCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iVWl0c2FhaS1rbm9wcGllLiBLb3BwZWwgdGFucyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJVaXRzYWFpLWtub3BwaWUuIEdla29wcGVsIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IlNhYWkgdWl0IG5hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iVmluZCB0YW5zIHRvZXN0ZWxsZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJPbnRrb3BwZWwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJIb3Ugb3AgdWl0c2FhaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iTWFhayB0b2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJTcGVlbCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iTGFhdCB3YWciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJTdG9wIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iVm91IHVpdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iVm91IGluIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iQWxidW1rdW5zd2VyayI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJWb2x1bWVnbHllciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iR2VlbiBtZWRpYSBpcyBnZWtpZXMgbmllIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJHZWVuIGlubGlndGluZyBiZXNraWtiYWFyIG5pZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iU2FhaSB0YW5zIHNrZXJtIHVpdCI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYW0vc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1hbS9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzlhMTkwMy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1hbS9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLhiLXhiK3hi5PhibUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i4YiY4Yij4Yiq4Yur4YuO4Ym9Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i4YuoQ2FzdCDhiqDhi53hiKvhiK0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJDYXN0IOGKoOGLneGIq+GIreGNoiDhjI3hipXhipnhipDhibUg4Ymw4YmL4Yit4Yyn4YiNIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJDYXN0IOGKoOGLneGIq+GIrSDhiaDhiJvhjIjhipPhipjhibUg4YiL4YutIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkNhc3Qg4Yqg4Yud4Yir4Yit4Y2iIOGJsOGMiOGKk+GKneGJt+GIjSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJDYXN0IOGKoOGLteGIreGMjSDhi4jhi7AiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLhiJjhiKPhiKrhi6vhi47hib3hipUg4Ymg4Yib4YyN4YqY4Ym1IOGIi+GLrSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLhjI3hipXhipnhipDhibUg4Yqg4YmL4Yit4YylIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iQ2FzdCDhiJvhi7XhiKjhjI0g4Yqg4YmB4YidIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLhi53hjIsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLhiqDhjKvhi43hibUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IuGIiOGKoOGNjeGJsyDhiqDhiYHhiJ0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLhiqDhiYHhiJ0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLhiqDhiLXhjYsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IuGIsOGJpeGIteGJpSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IuGLqOGKoOGIjeGJoOGInSDhiLXhipAt4Yyl4Ymg4YmlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IuGJsOGKleGIuOGIq+GJs+GJvSDhi6jhi7XhiJ3hjYUg4YiY4YmG4Yyj4Yyg4Yiq4YurIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLhiJ3hipXhiJ0g4Yib4YiF4Yuw4Yio4YiY4Yio4YyDIOGKoOGIjeGJsOGImOGIqOGMoOGInSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i4Yid4YqV4YidIOGImOGIqOGMgyDhiqDhi63hjIjhip3hiJ0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IuGIm+GLqyDhjIjhjL3hipUg4Ymg4YiY4YuN4Yiw4Yu1IOGIi+GLrSI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYXIvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1hci9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjhmYjk3ZC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1hci9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLYp9mE2YbYuNin2YUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i2KfZhNij2KzZh9iy2KkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLYstixINin2YTYpdix2LPYp9mEIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i2LLYsSDYp9mE2KXYsdiz2KfZhC4g2KrZhSDZgti32Lkg2KfZhNin2KrYtdin2YQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+Itiy2LEg2KfZhNil2LHYs9in2YQuINis2KfYsdmNINin2YTYp9iq2LXYp9mEIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+Itiy2LEg2KfZhNil2LHYs9in2YQuINiq2YUg2KfZhNin2KrYtdin2YQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i2KXYsdiz2KfZhCDYpdmE2YkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLYrNin2LHZjSDYp9mE2KjYrdirINi52YYg2KPYrNmH2LLYqSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLZgti32Lkg2KfZhNin2KrYtdin2YQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLYpdmK2YLYp9mBINin2YTYpdix2LPYp9mEIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLYpdi62YTYp9mCIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i2KrYtNi62YrZhCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i2KXZitmC2KfZgSDZhdik2YLYqiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+Itil2YrZgtin2YEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLYqtmI2LPZiti5Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLYqti12LrZitixIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i2LXZiNix2Kkg2KfZhNij2YTYqNmI2YUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i2LTYsdmK2Lcg2KrZhdix2YrYsSDZhdiz2KrZiNmJINin2YTYtdmI2KoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+ItmE2YUg2YrYqtmFINin2K7YqtmK2KfYsSDYo9mKINmI2LPYp9im2LciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+ItmE2Kcg2KrYqtmI2YHYsSDYo9mKINmF2LnZhNmI2YXYp9iqIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLYrNin2LHZjSDYpdix2LPYp9mEINin2YTYtNin2LTYqSI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYXovc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1hei9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNjNjBhYi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1hei9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTaXN0ZW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iQ2loYXpsYXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJZYXnEsW0gZMO8eW3JmXNpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iWWF5xLFtIGTDvHltyZlzaS4gQmHEn2xhbnTEsSBryZlzaWxkaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iWWF5xLFtIGTDvHltyZlzaS4gUW/Fn3VsdXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iWWF5xLFtIGTDvHltyZlzaS4gUW/Fn3VsZHUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iQnVyYSB5YXnEsW1sYXnEsW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJDaWhhemxhciBheHRhcsSxbMSxciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJCYcSfbGFudMSxbsSxIGvJmXNpbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IllhecSxbcSxIGRheWFuZMSxcsSxbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iUWFwYWTEsW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJPeW5hZMSxbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iRHVyZHVydW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJEYXlhbmTEsXLEsW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJHZW5pxZ9syZluZGlyaW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlnEscSfY2FtbGHFn2TEsXLEsW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJBbGJvbSBpbmPJmXPJmW7JmXRpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IlPJmXMgaMmZcm1pIGRpeWlyY8mZeWkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ikhlw6cgYmlyIG1lZGlhIHNlw6dpbG3JmXlpYiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4ixo9sw6dhdGFuIG3JmWx1bWF0IHlveGR1ciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iRWtyYW4geWF5xLFtbGFuxLFyIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1iK3NyK0xhdG4vc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1iK3NyK0xhdG4vc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyNWJkNmUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYitzcitMYXRuL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlNpc3RlbSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJVcmXEkWFqaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkR1Z21lIFByZWJhY2kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJEdWdtZSBQcmViYWNpLiBWZXphIGplIHByZWtpbnV0YSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iRHVnbWUgUHJlYmFjaS4gUG92ZXp1amUgc2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iRHVnbWUgUHJlYmFjaS4gUG92ZXphbiBqZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJQcmViYWN1aiBuYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IlByb25hbGHFvmVuamUgdXJlxJFhamEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iUHJla2luaSB2ZXp1Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iWmF1c3RhdmkgcHJlYmFjaXZhbmplIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJaYXR2b3JpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iUHVzdGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlBhdXppcmFqIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iWmF1c3RhdmkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJQcm/FoWlyaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iU2t1cGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJPbW90IGFsYnVtYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJLbGl6YcSNIHphIGphxI1pbnUgenZ1a2EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik5lbWEgaXphYnJhbmloIG1lZGlqYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iTmlzdSBkb3N0dXBuZSBuaWtha3ZlIGluZm9ybWFjaWplIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJQcmViYWN1amUgc2UgZWtyYW4iPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWJlL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYmUvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjMzkxYzEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYmUvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i0KHRltGB0YLRjdC80LAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i0J/RgNGL0LvQsNC00YsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLQmtC90L7Qv9C60LAg0YLRgNCw0L3RgdC70Y/RhtGL0ZYiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLQmtC90L7Qv9C60LAg0YLRgNCw0L3RgdC70Y/RhtGL0ZYuINCQ0LTQutC70Y7Rh9Cw0L3QsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i0JrQvdC+0L/QutCwINGC0YDQsNC90YHQu9GP0YbRi9GWLiDQhtC00LfQtSDQv9Cw0LTQutC70Y7Rh9GN0L3QvdC1Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+ItCa0L3QvtC/0LrQsCDRgtGA0LDQvdGB0LvRj9GG0YvRli4g0J/QsNC00LrQu9GO0YfQsNC90LAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i0KLRgNCw0L3RgdC70ZbRgNCw0LLQsNGG0Ywg0L3QsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+ItCf0L7RiNGD0Log0L/RgNGL0LvQsNC0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+ItCQ0LTQu9GD0YfRi9GG0YwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLQodC/0YvQvdGW0YbRjCDRgtGA0LDQvdGB0LvRj9GG0YvRjiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i0JfQsNC60YDRi9GG0YwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLQn9GA0LDQudCz0YDQsNGG0YwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+ItCf0YDRi9C/0YvQvdGW0YbRjCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+ItCh0L/Ri9C90ZbRhtGMIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i0KDQsNC30LPQsNGA0L3Rg9GG0YwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+ItCX0LPQsNGA0L3Rg9GG0YwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLQktC+0LrQu9Cw0LTQutCwINCw0LvRjNCx0L7QvNCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+ItCf0LDRntC30YPQvdC+0Log0LPRg9GH0L3QsNGB0YbRliI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i0JzQtdC00YvRj9GE0LDQudC7INC90LUg0LLRi9Cx0YDQsNC90YsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+ItCG0L3RhNCw0YDQvNCw0YbRi9GPINCw0LTRgdGD0YLQvdGW0YfQsNC1Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLQrdC60YDQsNC9INGC0YDQsNC90YHQu9GP0YbRi9GWIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1iZy9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWJnL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjcxMmQ0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWJnL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+ItCh0LjRgdGC0LXQvNCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+ItCj0YHRgtGA0L7QudGB0YLQstCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i0JHRg9GC0L7QvSDQt9CwINC/0YDQtdC00LDQstCw0L3QtSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+ItCR0YPRgtC+0L0g0LfQsCDQv9GA0LXQtNCw0LLQsNC90LUuINCS0YDRitC30LrQsNGC0LAg0LUg0L/RgNC10LrRgNCw0YLQtdC90LAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+ItCR0YPRgtC+0L0g0LfQsCDQv9GA0LXQtNCw0LLQsNC90LUuINCh0LLRitGA0LfQstCwINGB0LUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i0JHRg9GC0L7QvSDQt9CwINC/0YDQtdC00LDQstCw0L3QtS4g0KPRgdGC0LDQvdC+0LLQtdC90LAg0LUg0LLRgNGK0LfQutCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+ItCf0YDQtdC00LDQstCw0L3QtSDQutGK0LwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLQotGK0YDRgdGP0YIg0YHQtSDRg9GB0YLRgNC+0LnRgdGC0LLQsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLQn9GA0LXQutGA0LDRgtGP0LLQsNC90LUg0L3QsCDQstGA0YrQt9C60LDRgtCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i0KHQv9C40YDQsNC90LUg0L3QsCDQv9GA0LXQtNCw0LLQsNC90LXRgtC+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLQl9Cw0YLQstCw0YDRj9C90LUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLQn9GD0YHQutCw0L3QtSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i0J/QvtGB0YLQsNCy0Y/QvdC1INC90LAg0L/QsNGD0LfQsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+ItCh0L/QuNGA0LDQvdC1Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i0KDQsNC30LPRitCy0LDQvdC1Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLQodCy0LjQstCw0L3QtSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+ItCe0LHQu9C+0LbQutCwINC90LAg0LDQu9Cx0YPQvNCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+ItCf0LvRitC30LPQsNGHINC30LAg0YHQuNC70LDRgtCwINC90LAg0LfQstGD0LrQsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i0J3Rj9C80LAg0LjQt9Cx0YDQsNC90LAg0LzRg9C70YLQuNC80LXQtNC40Y8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+ItCd0Y/QvNCwINC90LDQu9C40YfQvdCwINC40L3RhNC+0YDQvNCw0YbQuNGPIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLQldC60YDQsNC90YrRgiDRgdC1INC/0YDQtdC00LDQstCwIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1ibi9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWJuL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYmY1OTMyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWJuL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IuCmuOCmv+CmuOCnjeCmn+Cnh+CmriI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLgpqHgpr/gpq3gpr7gpofgprjgppfgp4HgprLgpr8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLgppXgpr7gprjgp43gpp8g4KaV4Kaw4Ka+4KawIOCmrOCni+CmpOCmvuCmriI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IuCmleCmvuCmuOCnjeCmnyDgppXgprDgpr7gprAg4Kas4KeL4Kak4Ka+4Kau4Ke3IOCmuOCmguCmr+Cni+CmlyDgpqzgpr/gpprgp43gppvgpr/gpqjgp43gpqgg4Ka54Kav4Ka84KeH4Kab4KeHIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLgppXgpr7gprjgp43gpp8g4KaV4Kaw4Ka+4KawIOCmrOCni+CmpOCmvuCmruCntyDgprjgpoLgpq/gp4vgppcg4KaV4Kaw4Ka+IOCmueCmmuCnjeCmm+CnhyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLgppXgpr7gprjgp43gpp8g4KaV4Kaw4Ka+4KawIOCmrOCni+CmpOCmvuCmruCntyDgprjgpoLgpq/gp4HgppXgp43gpqQg4Ka54Kav4Ka84KeH4Kab4KeHIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IuCmj+CmpOCnhyDgppXgpr7gprjgp43gpp8g4KaV4Kaw4KeB4KaoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i4Kah4Ka/4Kat4Ka+4KaH4Ka44KaX4KeB4Kay4Ka/4KaV4KeHIOCmluCni+CmgeCmnOCmviDgprngpprgp43gppvgp4ciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i4Ka44KaC4Kav4KeL4KaXIOCmrOCmv+CmmuCnjeCmm+Cmv+CmqOCnjeCmqCDgppXgprDgp4HgpqgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLgppXgpr7gprjgp43gpp8g4KaV4Kaw4Ka+IOCmrOCmqOCnjeCmpyDgppXgprDgp4HgpqgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IuCmrOCmqOCnjeCmpyDgppXgprDgp4HgpqgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLgpprgpr7gprLgpr7gpqgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IuCmrOCmv+CmsOCmvuCmriDgpqbgpr/gpqgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLgpqXgpr7gpq7gpr7gpqgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLgpqzgpqHgprwg4KaV4Kaw4KeB4KaoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLgprjgppngp43gppXgp4Hgpprgpr/gpqQg4KaV4Kaw4KeB4KaoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i4KaF4KeN4Kav4Ka+4Kay4Kas4Ka+4KauIOCmtuCniOCmsuCmvyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLgpq3gprLgpr/gpongpq4g4Ka44KeN4Kay4Ka+4KaH4Kah4Ka+4KawIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLgppXgp4vgpqjgp4sg4Kau4Ka/4Kah4Ka/4Kav4Ka84Ka+IOCmqOCmv+CmsOCnjeCmrOCmvuCmmuCmqCDgppXgprDgpr4g4Ka54Kav4Ka84Kao4Ka/Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLgppXgp4vgpqjgp4sg4Kak4Kal4KeN4KavIOCmieCmquCmsuCmrOCnjeCmpyDgpqjgp4fgpociPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IuCmuOCnjeCmleCnjeCmsOCngOCmqCDgppXgpr7gprjgp43gpp8g4KaV4Kaw4Ka+IOCmueCmmuCnjeCmm+CnhyI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYnMvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1icy9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzExYzc0Mi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1icy9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTaXN0ZW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iVXJlxJFhamkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJEdWdtZSB6YSBlbWl0aXJhbmplIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iRHVnbWUgemEgZW1pdGlyYW5qZS4gVmV6YSBqZSBwcmVraW51dGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IkR1Z21lIHphIGVtaXRpcmFuamUuIFBvdmV6aXZhbmplIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkR1Z21lIHphIGVtaXRpcmFuamUuIFBvdmV6YW5vIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IkVtaXRpcmFuamUgbmEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJUcmHFvmVuamUgdXJlxJFhamEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iUHJla2luaSB2ZXp1Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iWmF1c3RhdmkgcHJlYmFjaXZhbmplIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJaYXR2b3JpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iUmVwcm9kdWNpcmFqIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJQYXV6aXJhaiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IlphdXN0YXZpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iUHJvxaFpcmkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlNrdXBpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iT21vdCBhbGJ1bWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iS2xpemHEjSB6YSBqYcSNaW51IHp2dWthIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJOaWplZGFuIG1lZGlqIG5pamUgb2RhYnJhbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iTmVtYSBkb3N0dXBuaWggaW5mb3JtYWNpamEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IlByZWJhY3VqZSBzZSBla3JhbiI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtY2Evc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1jYS9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY4NWFjZi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1jYS9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTaXN0ZW1hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkRpc3Bvc2l0aXVzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iQm90w7MgZFwnZW1ldHJlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iQm90w7MgRW1ldC4gRGVzY29ubmVjdGF0LiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iQm90w7MgRW1ldC4gU1wnZXN0w6AgY29ubmVjdGFudC4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iQm90w7MgRW1ldC4gQ29ubmVjdGF0LiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJFbWV0IGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJTXCdlc3RhbiBjZXJjYW50IGRpc3Bvc2l0aXVzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IkRlc2Nvbm5lY3RhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iQXR1cmEgbFwnZW1pc3Npw7MiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IlRhbmNhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iUmVwcm9kdWVpeCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iUG9zYSBlbiBwYXVzYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IkF0dXJhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iRGVzcGxlZ2EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlJlcGxlZ2EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJJbWF0Z2UgZGUgbFwnw6BsYnVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IkNvbnRyb2wgbGxpc2NhbnQgZGUgdm9sdW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik5vIHNcJ2hhIHNlbGVjY2lvbmF0IGNhcCBmaXR4ZXIgbXVsdGltw6hkaWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+Ik5vIGhpIGhhIGluZm9ybWFjacOzIGRpc3BvbmlibGUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IkVtaXNzacOzIGRlIHBhbnRhbGxhIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1jcy9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWNzL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOWE4OTIwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWNzL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlN5c3TDqW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iWmHFmcOtemVuw60iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJUbGHEjcOtdGtvIG9kZXPDrWzDoW7DrSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IlRsYcSNw610a28gb2Rlc8OtbMOhbsOtLiBPZHBvamVubyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iVGxhxI3DrXRrbyBvZGVzw61sw6Fuw60uIFDFmWlwb2pvdsOhbsOtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IlRsYcSNw610a28gb2Rlc8OtbMOhbsOtLiBQxZlpcG9qZW5vIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+Ik9kZXPDrWxhdCBkbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IkhsZWTDoW7DrSB6YcWZw616ZW7DrSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJPZHBvaml0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iWmFzdGF2aXQgb2Rlc8OtbMOhbsOtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJaYXbFmcOtdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlDFmWVocsOhdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iUG96YXN0YXZpdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+Ilphc3Rhdml0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iUm96YmFsaXQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlNiYWxpdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+Ik9iYWwgYWxiYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJQb3N1dm7DrWsgaGxhc2l0b3N0aSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iTmVieWxhIHZ5YnLDoW5hIMW+w6FkbsOhIG3DqWRpYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iTmVqc291IGvCoGRpc3BvemljaSDFvsOhZG7DqSBpbmZvcm1hY2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+Ik9kZXPDrWzDoW7DrSBvYnNhaHUgb2JyYXpvdmt5Ijwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1kYS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWRhL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTdhNzkwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWRhL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlN5c3RlbSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJFbmhlZGVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iQ2FzdC1rbmFwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iQ2FzdC1rbmFwLiBGb3JiaW5kZWxzZW4gZXIgYWZicnVkdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iQ2FzdC1rbmFwLiBPcHJldHRlciBmb3JiaW5kZWxzZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJDYXN0LWtuYXAuIFRpbHNsdXR0ZXQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iQ2FzdCB0aWwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJGaW5kZXIgZW5oZWRlciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJBZmJyeWQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJTdG9wIG1lZCBhdCBjYXN0ZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iTHVrIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iQWZzcGlsIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJTw6Z0IHDDpSBwYXVzZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IlN0b3AiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJVZHZpZCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iU2tqdWwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJBbGJ1bWdyYWZpayI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJMeWRzdHlya2Vza3lkZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IkluZ2VuIG1lZGllciBlciBtYXJrZXJldCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iRGVyIGVyIGluZ2VuIHRpbGfDpm5nZWxpZ2Ugb3BseXNuaW5nZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IlNrw6ZybWVuIGNhc3RlcyI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZGUvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1kZS9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZiZjU3Yy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1kZS9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTeXN0ZW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iR2Vyw6R0ZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkNhc3QtU3ltYm9sIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iU3RyZWFtaW5nLVNjaGFsdGZsw6RjaGUuIE5pY2h0IHZlcmJ1bmRlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iU3RyZWFtaW5nLVNjaGFsdGZsw6RjaGUuIFZlcmJpbmR1bmcgd2lyZCBoZXJnZXN0ZWxsdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJTdHJlYW1pbmctU2NoYWx0ZmzDpGNoZS4gVmVyYnVuZGVuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IlN0cmVhbWVuIGF1ZiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IkdlcsOkdGUgd2VyZGVuIGdlc3VjaHQuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IlZlcmJpbmR1bmcgdHJlbm5lbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IlN0cmVhbWluZyBiZWVuZGVuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJTY2hsaWXDn2VuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iV2llZGVyZ2ViZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlBhdXNpZXJlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IkJlZW5kZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJNYXhpbWllcmVuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJNaW5pbWllcmVuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iQWxidW1jb3ZlciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJTY2hpZWJlcmVnbGVyIGbDvHIgZGllIExhdXRzdMOkcmtlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJLZWluZSBNZWRpZW4gYXVzZ2V3w6RobHQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IktlaW5lIEluZm9ybWF0aW9uZW4gdmVyZsO8Z2JhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iQmlsZHNjaGlybSB3aXJkIGdlc3RyZWFtdC4iPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWVsL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZWwvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4MmY2OWIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZWwvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4izqPPjc+Dz4TOt868zrEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4izqPPhc+DzrrOtc+Fzq3PgiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+Is6azr/Phc68z4DOryBDYXN0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4izprOv8+FzrzPgM6vIM68zrXPhM6szrTOv8+DzrfPgi4gzpHPgM6/z4PPhc69zrTOrc64zrfOus61Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLOms6/z4XOvM+Azq8gzrzOtc+EzqzOtM6/z4POty4gzqPPjc69zrTOtc+Dzrcgz4POtSDOtc6+zq3Ou865zr7OtyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLOms6/z4XOvM+Azq8gzrzOtc+EzqzOtM6/z4POt8+CLiDOo8+Fzr3OtM6tzrjOt866zrUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4izpzOtc+EzqzOtM6/z4POtyDPg861Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4izpXPjc+BzrXPg863IM+Dz4XPg866zrXPhc+Ozr0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4izpHPgM6/z4PPjc69zrTOtc+DzrciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLOlM65zrHOus6/z4DOriDOvM61z4TOrM60zr/Pg863z4IiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+Is6azrvOtc6vz4POuc68zr8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLOkc69zrHPgM6xz4HOsc6zz4nOs86uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLOoM6xz43Pg863Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4izpTOuc6xzrrOv8+Azq4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLOkc69zqzPgM+Ez4XOvs63Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLOo8+NzrzPgM+Ez4XOvs63Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4izpXOvs+Oz4bPhc67zrvOvyDOrM67zrzPgM6/z4XOvCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLOoc+FzrjOvM65z4PPhM65zrrPjCDOrc69z4TOsc+DzrfPgiDOrs+Hzr/PhSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4izpTOtc69IM6tz4fOv8+Fzr0gzrXPgM65zrvOtc6zzrXOryDOvM6tz4POsSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4izpTOtc69IM+Fz4DOrM+Bz4fOv8+Fzr0gzrTOuc6xzrjOrc+DzrnOvM61z4Igz4DOu863z4HOv8+Gzr/Pgc6vzrXPgiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4izpzOtc+EzqzOtM6/z4POtyDOv864z4zOvc63z4IiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWVuLXJBVS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWVuLXJBVS9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQzZjIxOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1lbi1yQVUvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU3lzdGVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkRldmljZXMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJDYXN0IGJ1dHRvbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkNhc3QgYnV0dG9uLiBEaXNjb25uZWN0ZWQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IkNhc3QgYnV0dG9uLiBDb25uZWN0aW5nIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkNhc3QgYnV0dG9uLiBDb25uZWN0ZWQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iQ2FzdCB0byI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IkZpbmRpbmcgZGV2aWNlcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJEaXNjb25uZWN0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iU3RvcCBjYXN0aW5nIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJDbG9zZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlBsYXkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlBhdXNlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iU3RvcCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IkV4cGFuZCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iQ29sbGFwc2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJBbGJ1bSBhcnQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iVm9sdW1lIHNsaWRlciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iTm8gbWVkaWEgc2VsZWN0ZWQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+Ik5vIGluZm8gYXZhaWxhYmxlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJDYXN0aW5nIHNjcmVlbiI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZW4tckNBL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZW4tckNBL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDNmMjE5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWVuLXJDQS9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTeXN0ZW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iRGV2aWNlcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkNhc3QgYnV0dG9uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iQ2FzdCBidXR0b24uIERpc2Nvbm5lY3RlZCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iQ2FzdCBidXR0b24uIENvbm5lY3RpbmciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iQ2FzdCBidXR0b24uIENvbm5lY3RlZCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJDYXN0IHRvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iRmluZGluZyBkZXZpY2VzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IkRpc2Nvbm5lY3QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJTdG9wIGNhc3RpbmciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IkNsb3NlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iUGxheSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iUGF1c2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJTdG9wIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iRXhwYW5kIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJDb2xsYXBzZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkFsYnVtIGFydCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJWb2x1bWUgc2xpZGVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJObyBtZWRpYSBzZWxlY3RlZCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iTm8gaW5mbyBhdmFpbGFibGUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IkNhc3Rpbmcgc2NyZWVuIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1lbi1yR0Ivc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1lbi1yR0Ivc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkM2YyMTkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZW4tckdCL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlN5c3RlbSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJEZXZpY2VzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iQ2FzdCBidXR0b24iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJDYXN0IGJ1dHRvbi4gRGlzY29ubmVjdGVkIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJDYXN0IGJ1dHRvbi4gQ29ubmVjdGluZyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJDYXN0IGJ1dHRvbi4gQ29ubmVjdGVkIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IkNhc3QgdG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJGaW5kaW5nIGRldmljZXMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iRGlzY29ubmVjdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IlN0b3AgY2FzdGluZyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iQ2xvc2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJQbGF5Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJQYXVzZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IlN0b3AiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJFeHBhbmQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IkNvbGxhcHNlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iQWxidW0gYXJ0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IlZvbHVtZSBzbGlkZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik5vIG1lZGlhIHNlbGVjdGVkIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJObyBpbmZvIGF2YWlsYWJsZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iQ2FzdGluZyBzY3JlZW4iPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWVuLXJJTi9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWVuLXJJTi9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQzZjIxOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1lbi1ySU4vc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU3lzdGVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkRldmljZXMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJDYXN0IGJ1dHRvbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkNhc3QgYnV0dG9uLiBEaXNjb25uZWN0ZWQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IkNhc3QgYnV0dG9uLiBDb25uZWN0aW5nIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkNhc3QgYnV0dG9uLiBDb25uZWN0ZWQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iQ2FzdCB0byI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IkZpbmRpbmcgZGV2aWNlcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJEaXNjb25uZWN0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iU3RvcCBjYXN0aW5nIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJDbG9zZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlBsYXkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlBhdXNlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iU3RvcCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IkV4cGFuZCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iQ29sbGFwc2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJBbGJ1bSBhcnQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iVm9sdW1lIHNsaWRlciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iTm8gbWVkaWEgc2VsZWN0ZWQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+Ik5vIGluZm8gYXZhaWxhYmxlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJDYXN0aW5nIHNjcmVlbiI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZW4tclhDL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZW4tclhDL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODcwMDdlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWVuLXJYQy9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLigI7igI/igI7igI7igI7igI7igI7igI/igI7igI/igI/igI/igI7igI7igI7igI7igI7igI/igI7igI7igI/igI7igI7igI7igI7igI/igI/igI/igI/igI/igI/igI/igI/igI7igI7igI/igI7igI/igI/igI/igI7igI7igI7igI7igI/igI7igI7igI7igI7igI/igI/igI7igI7igI/igI7igI/igI7igI7igI/igI7igI7igI7igI/igI/igI/igI7igI7igI/igI7igI7igI7igI7igI7igI/igI/igI/igI7igI7igI7igI7igI7igI/igI/igI/igI7igI/igI7igI/igI/igI/igI/igI7igI7igI7igI/igI5TeXN0ZW3igI7igI/igI7igI7igI/igI4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCO4oCP4oCO4oCP4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCP4oCP4oCO4oCP4oCP4oCO4oCO4oCP4oCP4oCP4oCO4oCO4oCP4oCO4oCP4oCP4oCO4oCO4oCP4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCO4oCO4oCP4oCO4oCP4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCORGV2aWNlc+KAjuKAj+KAjuKAjuKAj+KAjiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IuKAjuKAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAj+KAjuKAj+KAj+KAjuKAjuKAj+KAj+KAjuKAj+KAjuKAj+KAjuKAjuKAj+KAj+KAjuKAj+KAjuKAjuKAjuKAj+KAj+KAj+KAjuKAj+KAjuKAjuKAjuKAj+KAj+KAjuKAjuKAjuKAj+KAj+KAjuKAj+KAj+KAj+KAjuKAjuKAj+KAj+KAj+KAj+KAj+KAjuKAj+KAj+KAj+KAj+KAj+KAjuKAj+KAjuKAjuKAjuKAjuKAj+KAjuKAjuKAjuKAj+KAjkNhc3QgYnV0dG9u4oCO4oCP4oCO4oCO4oCP4oCOIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCO4oCO4oCP4oCO4oCP4oCP4oCO4oCP4oCO4oCP4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCP4oCO4oCO4oCP4oCP4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCP4oCP4oCO4oCP4oCO4oCP4oCP4oCO4oCP4oCO4oCO4oCP4oCP4oCP4oCO4oCP4oCO4oCO4oCO4oCOQ2FzdCBidXR0b24uIERpc2Nvbm5lY3RlZOKAjuKAj+KAjuKAjuKAj+KAjiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCO4oCP4oCP4oCP4oCP4oCP4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCO4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCO4oCP4oCO4oCP4oCO4oCO4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCO4oCP4oCO4oCOQ2FzdCBidXR0b24uIENvbm5lY3RpbmfigI7igI/igI7igI7igI/igI4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCO4oCO4oCO4oCP4oCP4oCO4oCP4oCO4oCO4oCP4oCP4oCP4oCO4oCP4oCP4oCO4oCP4oCP4oCP4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCO4oCO4oCP4oCO4oCP4oCO4oCO4oCP4oCO4oCP4oCO4oCP4oCO4oCP4oCP4oCO4oCO4oCO4oCP4oCP4oCP4oCO4oCP4oCP4oCP4oCP4oCO4oCP4oCO4oCO4oCP4oCO4oCP4oCO4oCP4oCOQ2FzdCBidXR0b24uIENvbm5lY3RlZOKAjuKAj+KAjuKAjuKAj+KAjiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLigI7igI/igI7igI7igI7igI7igI7igI/igI7igI/igI/igI/igI7igI7igI7igI7igI7igI/igI7igI7igI/igI7igI7igI7igI7igI/igI/igI/igI/igI7igI/igI/igI/igI7igI/igI/igI7igI/igI/igI/igI/igI/igI/igI/igI/igI/igI7igI7igI/igI7igI/igI7igI/igI/igI7igI/igI7igI/igI/igI/igI7igI/igI/igI7igI/igI/igI/igI/igI7igI7igI/igI/igI/igI7igI7igI/igI7igI/igI/igI7igI7igI7igI/igI/igI7igI/igI/igI7igI/igI/igI7igI5DYXN0IHRv4oCO4oCP4oCO4oCO4oCP4oCOIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCO4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCO4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCO4oCP4oCP4oCP4oCP4oCO4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCP4oCP4oCO4oCO4oCP4oCO4oCO4oCP4oCP4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCORmluZGluZyBkZXZpY2Vz4oCO4oCP4oCO4oCO4oCP4oCOIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IuKAjuKAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAjuKAj+KAj+KAjuKAjuKAjuKAj+KAjuKAjuKAjuKAjuKAj+KAjuKAjuKAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAjuKAj+KAj+KAj+KAjuKAj+KAjuKAj+KAjuKAjuKAjuKAj+KAjuKAjuKAjuKAj+KAjuKAj+KAj+KAjuKAjuKAjuKAj+KAjuKAj+KAjuKAjuKAj+KAj+KAjuKAjuKAj+KAjuKAj+KAjuKAjuKAjuKAj+KAj+KAjuKAjuKAjkRpc2Nvbm5lY3TigI7igI/igI7igI7igI/igI4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLigI7igI/igI7igI7igI7igI7igI7igI/igI7igI/igI/igI/igI7igI7igI7igI7igI7igI/igI7igI7igI/igI7igI7igI7igI7igI/igI/igI/igI/igI/igI/igI/igI/igI/igI/igI/igI7igI/igI7igI/igI/igI/igI7igI/igI/igI7igI/igI/igI7igI7igI7igI/igI7igI7igI/igI7igI7igI7igI/igI/igI7igI/igI/igI/igI7igI/igI7igI/igI/igI/igI7igI7igI7igI/igI7igI7igI/igI/igI/igI/igI7igI7igI7igI/igI7igI/igI/igI/igI7igI/igI/igI/igI7igI/igI7igI5TdG9wIGNhc3RpbmfigI7igI/igI7igI7igI/igI4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IuKAjuKAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAj+KAj+KAj+KAj+KAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAjuKAjuKAj+KAj+KAj+KAjuKAjuKAjuKAj+KAj+KAj+KAjuKAjuKAj+KAj+KAj+KAjuKAj+KAjuKAj+KAjuKAj+KAjuKAj+KAjuKAj+KAj+KAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAjuKAj+KAjuKAj+KAj+KAj+KAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAjuKAjkNsb3Nl4oCO4oCP4oCO4oCO4oCP4oCOIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCP4oCP4oCO4oCO4oCP4oCP4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCP4oCO4oCP4oCO4oCO4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCOUGxheeKAjuKAj+KAjuKAjuKAj+KAjiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCP4oCO4oCP4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCP4oCO4oCO4oCO4oCP4oCP4oCO4oCP4oCP4oCP4oCP4oCO4oCO4oCP4oCO4oCP4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCO4oCOUGF1c2XigI7igI/igI7igI7igI/igI4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLigI7igI/igI7igI7igI7igI7igI7igI/igI7igI/igI/igI/igI7igI7igI7igI7igI7igI/igI7igI7igI/igI7igI7igI7igI7igI/igI/igI/igI/igI/igI7igI7igI/igI7igI/igI7igI7igI7igI/igI/igI7igI/igI/igI7igI7igI/igI7igI/igI/igI7igI/igI7igI7igI7igI7igI/igI7igI/igI/igI7igI/igI7igI7igI7igI7igI/igI/igI7igI/igI/igI/igI/igI7igI7igI7igI/igI/igI7igI/igI/igI/igI/igI/igI7igI/igI/igI/igI7igI7igI7igI/igI/igI5TdG9w4oCO4oCP4oCO4oCO4oCP4oCOIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCO4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCO4oCO4oCO4oCP4oCP4oCO4oCP4oCP4oCP4oCP4oCP4oCP4oCO4oCP4oCO4oCP4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCP4oCO4oCP4oCO4oCP4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCP4oCO4oCP4oCP4oCORXhwYW5k4oCO4oCP4oCO4oCO4oCP4oCOIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLigI7igI/igI7igI7igI7igI7igI7igI/igI7igI/igI/igI/igI7igI7igI7igI7igI7igI/igI7igI7igI/igI7igI7igI7igI7igI/igI/igI/igI/igI/igI/igI/igI/igI/igI7igI/igI/igI7igI/igI/igI/igI/igI/igI/igI7igI/igI7igI/igI7igI7igI/igI7igI7igI/igI/igI/igI/igI7igI/igI/igI7igI7igI/igI/igI7igI7igI7igI/igI/igI7igI/igI/igI7igI7igI/igI7igI7igI/igI/igI7igI/igI7igI/igI/igI/igI/igI/igI7igI7igI7igI/igI/igI/igI/igI7igI5Db2xsYXBzZeKAjuKAj+KAjuKAjuKAj+KAjiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IuKAjuKAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAj+KAj+KAj+KAjuKAj+KAj+KAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAj+KAjuKAjuKAj+KAj+KAjuKAjuKAjuKAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAj+KAjuKAj+KAjuKAjuKAj+KAjuKAj+KAjuKAj+KAj+KAj+KAj+KAjuKAj+KAjuKAj+KAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAjuKAj+KAj+KAjuKAjuKAjuKAjuKAj+KAjkFsYnVtIGFydOKAjuKAj+KAjuKAjuKAj+KAjiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLigI7igI/igI7igI7igI7igI7igI7igI/igI7igI/igI/igI/igI7igI7igI7igI7igI7igI/igI7igI7igI/igI7igI7igI7igI7igI/igI/igI/igI/igI/igI/igI7igI/igI7igI7igI7igI7igI7igI/igI/igI7igI7igI7igI/igI/igI7igI/igI7igI/igI/igI/igI/igI/igI/igI/igI/igI7igI/igI/igI7igI7igI7igI/igI7igI/igI/igI/igI/igI7igI/igI7igI/igI7igI7igI7igI/igI/igI/igI/igI/igI7igI7igI7igI7igI/igI7igI/igI7igI/igI7igI/igI/igI7igI/igI5Wb2x1bWUgc2xpZGVy4oCO4oCP4oCO4oCO4oCP4oCOIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLigI7igI/igI7igI7igI7igI7igI7igI/igI7igI/igI/igI/igI7igI7igI7igI7igI7igI/igI7igI7igI/igI7igI7igI7igI7igI/igI/igI/igI/igI/igI/igI/igI/igI7igI/igI/igI7igI/igI7igI/igI/igI7igI/igI/igI/igI7igI7igI7igI7igI7igI/igI7igI/igI7igI7igI7igI/igI7igI/igI/igI/igI/igI/igI/igI/igI/igI7igI7igI7igI/igI7igI/igI/igI7igI7igI/igI7igI7igI/igI/igI/igI7igI7igI/igI7igI7igI/igI/igI7igI/igI7igI/igI/igI7igI/igI5ObyBtZWRpYSBzZWxlY3RlZOKAjuKAj+KAjuKAjuKAj+KAjiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCO4oCO4oCP4oCP4oCO4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCP4oCO4oCP4oCP4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCO4oCP4oCP4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCP4oCP4oCO4oCP4oCP4oCP4oCP4oCO4oCO4oCO4oCP4oCP4oCO4oCO4oCOTm8gaW5mbyBhdmFpbGFibGXigI7igI/igI7igI7igI/igI4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IuKAjuKAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAj+KAj+KAj+KAjuKAjuKAjuKAjuKAj+KAj+KAj+KAjuKAjuKAj+KAjuKAjuKAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAjuKAjuKAj+KAjuKAj+KAj+KAjuKAj+KAj+KAj+KAj+KAj+KAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAjuKAj+KAjuKAj+KAjuKAj+KAjuKAj+KAjuKAj+KAj+KAjuKAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAj+KAjkNhc3Rpbmcgc2NyZWVu4oCO4oCP4oCO4oCO4oCP4oCOIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1lcy1yVVMvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1lcy1yVVMvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0MWVhZDEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZXMtclVTL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlNpc3RlbWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iRGlzcG9zaXRpdm9zIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iQm90w7NuIHBhcmEgdHJhbnNtaXRpciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkJvdMOzbiBwYXJhIHRyYW5zbWl0aXIgKGRlc2NvbmVjdGFkbykiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IkJvdMOzbiBwYXJhIHRyYW5zbWl0aXIgKGNvbmVjdGFuZG8pIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkJvdMOzbiBwYXJhIHRyYW5zbWl0aXIgKGNvbmVjdGFkbykiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iVHJhbnNtaXRpciBhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iQnVzY2FuZG8gZGlzcG9zaXRpdm9zIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IkRlc2NvbmVjdGFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iRGV0ZW5lciBsYSB0cmFuc21pc2nDs24iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IkNlcnJhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlJlcHJvZHVjaXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlBhdXNhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IkRldGVuZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJNb3N0cmFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJPY3VsdGFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iSW1hZ2VuIGRlbCDDoWxidW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iQ29udHJvbCBkZXNsaXphbnRlIGRlbCB2b2x1bWVuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJObyBzZSBzZWxlY2Npb27DsyBuaW5nw7puIGNvbnRlbmlkbyBtdWx0aW1lZGlhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJTaW4gaW5mb3JtYWNpw7NuIGRpc3BvbmlibGUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IlRyYW5zbWl0aWVuZG8gcGFudGFsbGEiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWVzL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZXMvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmNDMwMDguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZXMvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU2lzdGVtYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJEaXNwb3NpdGl2b3MiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJCb3TDs24gZGUgZW52aWFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iQm90w7NuIGRlIGVudmlhci4gRGVzY29uZWN0YWRvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJCb3TDs24gZGUgZW52aWFyLiBDb25lY3RhbmRvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkJvdMOzbiBkZSBlbnZpYXIuIENvbmVjdGFkbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJFbnZpYXIgYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IkJ1c2NhbmRvIGRpc3Bvc2l0aXZvcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJEZXNjb25lY3RhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IkRldGVuZXIgZW52w61vIGRlIGNvbnRlbmlkbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iQ2VycmFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iUmVwcm9kdWNpciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iUGF1c2EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJEZXRlbmVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iTW9zdHJhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iT2N1bHRhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IlBvcnRhZGEgZGVsIMOhbGJ1bSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJDb250cm9sIGRlc2xpemFudGUgZGUgdm9sdW1lbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iTm8gc2UgaGEgc2VsZWNjaW9uYWRvIG5pbmfDum4gbWVkaW8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+Ik5vIGhheSBpbmZvcm1hY2nDs24gZGlzcG9uaWJsZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iRW52aWFuZG8gcGFudGFsbGEiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWV0L3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZXQvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1MzIzNWIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZXQvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU8O8c3RlZW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iU2VhZG1lZCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IsOcbGVrYW5kZW51cHAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLDnGxla2FuZGVudXBwLiDDnGhlbmR1cyBvbiBrYXRrZXN0YXR1ZCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iw5xsZWthbmRlbnVwcC4gw5xoZW5kYW1pbmUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iw5xsZWthbmRlbnVwcC4gw5xoZW5kYXR1ZCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLDnGxla2FuZG1pbmUgc2VhZG1lc3NlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iU2VhZG1ldGUgb3RzaW1pbmUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iS2F0a2VzdGEgw7xoZW5kdXMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJQZWF0YSDDvGxla2FuZG1pbmUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IlN1bGdlbWluZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IkVzaXRhbWluZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iUGVhdGFtaW5lIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iUGVhdGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJMYWllbmRhbWluZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iQWhlbmRhbWluZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkFsYnVtaSBrdWp1bmR1cyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJIZWxpdHVnZXZ1c2UgbGl1Z3VyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJNZWVkaWF0IHBvbGUgdmFsaXR1ZCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iVGVhdmUgcHV1ZHViIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJFa3JhYW5pa3V2YSDDvGxla2FuZG1pbmUiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWV1L3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZXUvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiYTE5ZTQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZXUvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU2lzdGVtYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJHYWlsdWFrIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iSWdvcnJpIGJvdG9pYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+Iklnb3J0emVrbyBib3RvaWEuIERlc2tvbmVrdGF0dXRhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJJZ29ydHpla28gYm90b2lhLiBLb25la3RhdHplbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJJZ29ydHpla28gYm90b2lhLiBLb25la3RhdHV0YSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJJZ29ycmkgaG9uYToiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJHYWlsdWFrIGJpbGF0emVuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IkRlc2tvbmVrdGF0dSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IlV0emkgaWdvcnR6ZWFyaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iSXR4aSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IkVycmVwcm9kdXppdHUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlBhdXNhdHUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJHZWxkaXR1Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iWmFiYWxkdSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iVG9sZXN0dSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkFsYnVtYXJlbiBhemFsYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJCb2x1bWVuYXJlbiBncmFkdWF0emFpbGVhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJFeiBkYSBoYXV0YXR1IG11bHRpbWVkaWEtZWR1a2lyaWsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IkV6IGRhZ28gaW5mb3JtYXppb3JpayI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iUGFudGFpbGEgaWdvcnR6ZW4iPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWZhL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZmEvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjNmM3NzkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZmEvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i2LPbjNiz2KrZhSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLYr9iz2Krar9in2YfigIzZh9inIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i2K/aqdmF2Ycg2KfYsdiz2KfZhCDZhdit2KrZiNinIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i2K/aqdmF2Ycg2YHYsdiz2KrYp9iv2YYuINin2LHYqtio2KfYtyDZgti32Lkg2LTYryI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i2K/aqdmF2Ycg2YHYsdiz2KrYp9iv2YYuINiv2LHYrdin2YQg2YXYsdiq2KjYt+KAjNiz2KfYstuMIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+Itiv2qnZhdmHINmB2LHYs9iq2KfYr9mGLiDZhdix2KrYqNi3INi02K8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i2KfYsdiz2KfZhCDZhdit2KrZiNinINio2YciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLZvtuM2K/YpyDaqdix2K/ZhiDYr9iz2Krar9in2YfigIzZh9inIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+ItmC2LfYuSDYp9ix2KrYqNin2LciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLYqtmI2YLZgSDYp9ix2LPYp9mEINmF2K3YqtmI2KciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+Itio2LPYqtmGIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i2b7Yrti0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLZhdqp2KsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLYqtmI2YLZgSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+Itio2LLYsdqvINqp2LHYr9mGIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLaqdmI2obaqSDaqdix2K/ZhiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+Iti52qnYsyDYsdmI24wg2KzZhNivINii2YTYqNmI2YUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i2YTYutiy2YbYr9mHINmF24zYstin2YYg2LXYr9inIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLYsdiz2KfZhtmHINin2YbYqtiu2KfYqCDZhti02K/ZhyDYp9iz2KoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+Itin2LfZhNin2LnYp9iqINiv2LEg2K/Ys9iq2LHYsyDZhtuM2LPYqiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i2K/Ysdit2KfZhCDZgdix2LPYqtin2K/ZhiDYtdmB2K3ZhyI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZmkvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1maS9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY4MzQzNS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1maS9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJKw6RyamVzdGVsbcOkIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkxhaXR0ZWV0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iQ2FzdC1wYWluaWtlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iQ2FzdC1wYWluaWtlLiBZaHRleXMga2F0a2Fpc3R1Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJDYXN0LXBhaW5pa2UuIFloZGlzdGV0w6TDpG4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iQ2FzdC1wYWluaWtlLiBZaGRpc3RldHR5Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IlN1b3JhdG9pc3RvbiBrb2hkZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IkV0c2l0w6TDpG4gbGFpdHRlaXRhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IkthdGthaXNlIHlodGV5cyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IkxvcGV0YSBzdW9yYXRvaXN0byI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iU3VsamUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJUb2lzdGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+Iktlc2tleXTDpCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IlB5c8OkeXTDpCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IkxhYWplbm5hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJUaWl2aXN0w6QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJBbGJ1bWluIGthbnNpa3V2YSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLDhMOkbmVudm9pbWFra3V1ZGVuIGxpdWt1c8Okw6RkaW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IkVpIHZhbGl0dHVhIG1lZGlhYS4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IlRpZXRvamEgZWkgb2xlIHNhYXRhdmlsbGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IlN1b3JhdG9pc3RldGFhbiBuw6R5dHTDtsOkIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1mci1yQ0Evc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1mci1yQ0Evc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0Zjk4NGIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZnItckNBL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlN5c3TDqG1lIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkFwcGFyZWlscyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkJvdXRvbiBEaWZmdXNlciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkJvdXRvbiBEaWZmdXNlci4gRMOpY29ubmVjdMOpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJCb3V0b24gRGlmZnVzZXIuIENvbm5leGlvbiBlbiBjb3Vyc+KApiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJCb3V0b24gRGlmZnVzZXIuIENvbm5lY3TDqSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJEaWZmdXNlciBzdXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJSZWNoZXJjaGUgZFwnYXBwYXJlaWxzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IlNlIGTDqWNvbm5lY3RlciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IkFycsOqdGVyIGxhIGRpZmZ1c2lvbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iRmVybWVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iTGlyZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iSW50ZXJyb21wcmUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJBcnLDqnRlciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IkTDqXZlbG9wcGVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJSw6lkdWlyZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkltYWdlIGRlIGxcJ2FsYnVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IkN1cnNldXIgZGUgcsOpZ2xhZ2UgZHUgdm9sdW1lIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJBdWN1biBtw6lkaWEgc8OpbGVjdGlvbm7DqSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iQXVjdW5lIGluZm9ybWF0aW9uIGRpc3BvbmlibGUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IkRpZmZ1c2lvbiBkZSBsXCfDqWNyYW4gZW4gY291cnMiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWZyL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZnIvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyYzMxMmYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZnIvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU3lzdMOobWUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iQXBwYXJlaWxzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iSWPDtG5lIENhc3QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJJY8O0bmUgQ2FzdC4gRMOpY29ubmVjdMOpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJJY8O0bmUgQ2FzdC4gQ29ubmV4aW9u4oCmIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+Ikljw7RuZSBDYXN0LiBDb25uZWN0w6kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iQ2FzdGVyIHN1ciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IlJlY2hlcmNoZSBkXCdhcHBhcmVpbHPigKYiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iRMOpY29ubmVjdGVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iQXJyw6p0ZXIgbGEgZGlmZnVzaW9uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJGZXJtZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJMZWN0dXJlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJQYXVzZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IkFycsOqdGVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iRMOpdmVsb3BwZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlLDqWR1aXJlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iSW1hZ2UgZGUgbFwnYWxidW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iQ3Vyc2V1ciBkZSB2b2x1bWUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IkF1Y3VuIG3DqWRpYSBzw6lsZWN0aW9ubsOpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJBdWN1bmUgaW5mb3JtYXRpb24gZGlzcG9uaWJsZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iRGlmZnVzaW9uIGRlIGxcJ8OpY3JhbiBlbiBjb3Vyc+KApiI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZ2wvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1nbC9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWIyYzM1NC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1nbC9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTaXN0ZW1hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkRpc3Bvc2l0aXZvcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkJvdMOzbiBkZSBlbWl0aXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJCb3TDs24gZGUgZW1pdGlyLiBEZXNjb25lY3RhZG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IkJvdMOzbiBkZSBlbWl0aXIuIENvbmVjdGFuZG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iQm90w7NuIGRlIGVtaXRpci4gQ29uZWN0YWRvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IkVtaXRpciBhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iQnVzY2FuZG8gZGlzcG9zaXRpdm9zIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IkRlc2NvbmVjdGFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iRGV0ZXIgZW1pc2nDs24iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IlBlY2hhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlJlcHJvZHVjZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iUGF1c2EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJEZXRlciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IkFtcGxpYXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IkNvbnRyYWVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iUG9ydGFkYSBkbyDDoWxidW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iQ29udHJvbCBkZXNwcmF6YWJsZSBkbyB2b2x1bWUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik5vbiBzZSBzZWxlY2Npb25hcm9uIHJlY3Vyc29zIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJOb24gaGFpIGluZm9ybWFjacOzbiBkaXNwb8OxaWJsZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iRW1pc2nDs24gZGUgcGFudGFsbGEiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWd1L3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZ3Uvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjZDVmM2YuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZ3Uvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i4Kq44Kq/4Kq44KuN4Kqf4KquIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IuCqieCqquCqleCqsOCqo+CriyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IuCqleCqvuCquOCrjeCqnyDgqpXgqrDgq4sg4Kqs4Kqf4KqoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i4KqV4Kq+4Kq44KuN4KqfIOCqleCqsOCriyDgqqzgqp/gqqguIOCqoeCqv+CquOCrjeCqleCqqOCrh+CqleCrjeCqnyDgqpXgqrDgq43gqq/gq4HgqoIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IuCqleCqvuCquOCrjeCqnyDgqpXgqrDgq4sg4Kqs4Kqf4KqoLiDgqpXgqqjgq4fgqpXgq43gqp8g4Kql4KqIIOCqsOCqueCrjeCqr+CrgeCqgiDgqpvgq4ciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i4KqV4Kq+4Kq44KuN4KqfIOCqleCqsOCriyDgqqzgqp/gqqguIOCqleCqqOCrh+CqleCrjeCqnyDgqqXgqq/gq4HgqoIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i4KqG4Kqo4Kq+IOCqquCqsCDgqpXgqr7gqrjgq43gqp8g4KqV4Kqw4KuLIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i4KqJ4Kqq4KqV4Kqw4Kqj4KuLIOCqtuCri+Cqp+CrgCDgqrDgqrngq43gqq/gqr7gqoIg4Kqb4KuA4KqPIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IuCqoeCqv+CquOCrjeCqleCqqOCrh+CqleCrjeCqnyDgqpXgqrDgq4siPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLgqpXgqr7gqrjgq43gqp8g4KqV4Kqw4Kq14Kq+4Kqo4KuB4KqCIOCqsOCri+CqleCriyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i4Kqs4KqC4KqnIOCqleCqsOCriyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IuCqmuCqsuCqvuCqteCriyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i4Kql4KuL4Kqt4Kq+4Kq14KuLIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i4Kqw4KuL4KqV4KuLIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i4Kq14Kq/4Kq44KuN4Kqk4KuD4KqkIOCqleCqsOCriyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i4Kq44KqC4KqV4KuB4Kqa4Kq/4KqkIOCqleCqsOCriyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IuCqhuCqsuCrjeCqrOCqriDgqpXgqrLgqr4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i4Kq14KuJ4Kqy4KuN4Kqv4KuB4KquIOCquOCrjeCqsuCqvuCqh+CqoeCqsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i4KqV4KuL4KqIIOCqruCrgOCqoeCqv+Cqr+CqviDgqqrgqrjgqoLgqqYg4KqV4Kqw4KuH4KqyIOCqqOCqpeCrgCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i4KqV4KuL4KqIIOCqruCqvuCqueCqv+CqpOCrgCDgqongqqrgqrLgqqzgq43gqqcg4Kqo4Kql4KuAIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLgqrjgq43gqpXgq43gqrDgq4Dgqqjgqqjgq4cg4KqV4Kq+4Kq44KuN4KqfIOCqleCqsOCrgCDgqrDgqrngq43gqq/gqr7gqoIg4Kqb4KuHIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1oaS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWhpL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTUyYTU5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWhpL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IuCkuOCkv+CkuOCljeCkn+CkriI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLgpKHgpL/gpLXgpL7gpIfgpLgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLgpJXgpL7gpLjgpY3gpJ8g4KSV4KSw4KWH4KSCIOCkrOCkn+CkqCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IuCkleCkvuCkuOCljeCknyDgpJXgpLDgpYfgpIIg4KSs4KSf4KSoLiDgpKHgpL/gpLjgpJXgpKjgpYfgpJXgpY3gpJ8g4KS54KWIIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLgpJXgpL7gpLjgpY3gpJ8g4KSV4KSw4KWH4KSCIOCkrOCkn+CkqC4g4KSV4KSo4KWH4KSV4KWN4KSfIOCkueCliyDgpLDgpLngpL4g4KS54KWIIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IuCkleCkvuCkuOCljeCknyDgpJXgpLDgpYfgpIIg4KSs4KSf4KSoLiDgpJXgpKjgpYfgpJXgpY3gpJ8g4KS54KWIIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IuCkh+CkuCDgpKrgpLAg4KSV4KS+4KS44KWN4oCN4KSfIOCkleCksOClh+CkgiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IuCkoeCkv+CkteCkvuCkh+CkuCDgpKLgpYLgpILgpKIg4KSw4KS54KS+IOCkueCliCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLgpKHgpL/gpLjgpJXgpKjgpYfgpJXgpY3gpJ8g4KSV4KSw4KWH4KSCIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i4KSV4KS+4KS44KWN4KSfIOCkleCksOCkqOCkviDgpKzgpILgpKYg4KSV4KSw4KWH4KSCIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLgpKzgpILgpKYg4KSV4KSw4KWH4KSCIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i4KSa4KSy4KS+4KSP4KSCIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLgpLDgpYvgpJXgpYfgpIIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLgpKzgpILgpKYg4KSV4KSw4KWH4KSCIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i4KS14KS/4KS44KWN4KSk4KS+4KSwIOCkleCksOClh+CkgiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i4KSb4KWL4KSf4KS+IOCkleCksOClh+CkgiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IuCkj+CksuCljeCkrOCkriDgpIbgpLDgpY3gpJ8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i4KS14KWJ4KSy4KWN4KSv4KWC4KSuIOCkuOCljeCksuCkvuCkh+CkoeCksCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i4KSV4KWL4KSIIOCkruClgOCkoeCkv+Ckr+CkviDgpJrgpK/gpKjgpL/gpKQg4KSo4KS54KWA4KSCIOCkueCliCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i4KSV4KWL4KSIIOCknOCkvuCkqOCkleCkvuCksOClgCDgpK7gpYzgpJzgpYLgpKYg4KSo4KS54KWA4KSCIOCkueCliCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i4KS44KWN4KSV4KWN4KSw4KWA4KSoIOCkleCkvuCkuOCljeCknyDgpLngpYsg4KSw4KS54KWAIOCkueCliCI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtaHIvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1oci9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2M0M2VlNy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1oci9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTdXN0YXYiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iVXJlxJFhamkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJHdW1iIHphIGVtaXRpcmFuamUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJHdW1iIHphIGVtaXRpcmFuamUuIFZlemEgcHJla2ludXRhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJHdW1iIHphIGVtaXRpcmFuamUuIFBvdmV6aXZhbmplIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+Ikd1bWIgemEgZW1pdGlyYW5qZS4gUG92ZXphbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJFbWl0aXJhbmplIG5hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iVHJhxb5lbmplIHVyZcSRYWphIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IlByZWtpbmkgdmV6dSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IlphdXN0YXZpIGVtaXRpcmFuamUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IlphdHZhcmFuamUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJSZXByb2R1a2NpamEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlBhdXppcmFuamUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJaYXVzdGF2aSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IlByb8WhaXJpdmFuamUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlNhxb5pbWFuamUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJOYXNsb3ZuaWNhIGFsYnVtYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJLbGl6YcSNIHphIGdsYXNub8SHdSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iTmlqZSBvZGFicmFuIG5pamVkYW4gbWVkaWoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IkluZm9ybWFjaWplIG5pc3UgZG9zdHVwbmUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IkVtaXRpcmFuamUgemFzbG9uYSI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtaHUvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1odS9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM2YmRmZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1odS9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJSZW5kc3plciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJFc3prw7Z6w7ZrIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iw4F0a8O8bGTDqXMgZ29tYiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IsOBdGvDvGxkw6lzIGdvbWIuIEthcGNzb2xhdCBib250dmEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IsOBdGvDvGxkw6lzIGdvbWIuIENzYXRsYWtvesOhcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLDgXRrw7xsZMOpcyBnb21iLiBDc2F0bGFrb3p0YXR2YSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLDgXRrw7xsZMOpcyBpZGUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJFc3prw7Z6w7ZrIGtlcmVzw6lzZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJMZXbDoWxhc3p0w6FzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iw4F0a8O8bGTDqXMgbGXDoWxsw610w6FzYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iQmV6w6Fyw6FzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iTGVqw6F0c3rDoXMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlN6w7xuZXRlbHRldMOpcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+Ikxlw6FsbMOtdMOhcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IktpYm9udMOhcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iw5Zzc3plY3N1a8OhcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkxlbWV6Ym9yw610w7MiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iSGFuZ2VyxZFzemFiw6FseXrDsyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iTmluY3MgbcOpZGlhIGtpdsOhbGFzenR2YSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iTmluY3MgaW5mb3Jtw6FjacOzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJLw6lwZXJuecWRdGFydGFsb20gw6F0a8O8bGTDqXNlIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1oeS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWh5L3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWM4MmI3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWh5L3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+ItWA1aHVtNWh1a/VodaA1aMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i1Y3VodaA1oTVpdaAIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i1YDVpdW81aHWgNWx1aHVr9W01aHVtiDVr9W41bPVodWvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i1YDVpdW81aHWgNWx1aHVr9W01aHVtiDVr9W41bPVodWvOiDVjdWh1oDWhNW2INWh1bbVu9Wh1b/VvtWh1a4g1aciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+ItWA1aXVvNWh1oDVsdWh1a/VtNWh1bYg1a/VuNWz1aHVrzog1Y3VodaA1oTVqCDVr9Wh1brVodWv1oHVvtW41oLVtCDVpyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLVgNWl1bzVodaA1bHVodWv1bTVodW2INWv1bjVs9Wh1a86INWN1aHWgNaE1agg1a/VodW61aHVr9aB1b7VodWuINWnIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+ItS41bbVv9aA1aXWhCDVvdWh1oDWhNWoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i1Y3VodaA1oTVpdaA1asg1bjWgNW41bbVuNaC1bQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i1LHVttW71aHVv9Wl1awiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLUtNWh1aTVodaA1aXWgdW21aXVrCDVsNWl1bzVodaA1bHVodWv1bjWgtW01agiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+ItWT1aHVr9Wl1awiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLVhtW+1aHVo9Wh1oDVr9Wl1awiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+ItS01aHVpNWh1oAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLUtNWh1aTVodaA1aXWgdW21aXVrCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+ItS41bbVpNWh1oDVsdWh1a/VpdWsIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLUv9W41a7Vr9Wl1awiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLUsdWs1aLVuNW01asg1bfVodW61avVryI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLVgdWh1bXVttWrINW41oLVqtWj1bbVuNaC1anVtdWh1bYg1a/VodaA1aPVodW+1bjWgNWr1bkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+ItWE1aXVpNWr1aEg1obVodW11azVpdaAINW51aXVtiDVqNW21b/WgNW+1aXVrCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i1Y/VpdWy1aXVr9W41oLVqdW11bjWgtW21bbVpdaA1agg1bDVodW91aHVttWl1azVqyDVudWl1bYiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+ItS31a/WgNWh1bbVqCDVsNWl1bzVodaA1bHVodWv1b7VuNaC1bQg1aciPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWluL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtaW4vc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiMjc1MmUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtaW4vc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU2lzdGVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IlBlcmFuZ2thdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IlRvbWJvbCBDYXN0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iVG9tYm9sIENhc3QuIFRlcnB1dHVzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJUb21ib2wgQ2FzdC4gTWVuZ2h1YnVuZ2thbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJUb21ib2wgQ2FzdC4gVGVyaHVidW5nIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IlRyYW5zbWlzaWthbiBrZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+Ik1lbmNhcmkgcGVyYW5na2F0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IlB1dHVza2FuIHNhbWJ1bmdhbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IkhlbnRpa2FuIGNhc3QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IlR1dHVwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iUHV0YXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IkplZGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJCZXJoZW50aSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+Ikx1YXNrYW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IkNpdXRrYW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJTYW1wdWwgYWxidW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iQmlsYWggZ2VzZXIgdm9sdW1lIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJUaWRhayBhZGEgbWVkaWEgeWFuZyBkaXBpbGloIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJUaWRhayBhZGEgaW5mbyB5YW5nIHRlcnNlZGlhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJUcmFuc21pc2kgbGF5YXIiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWlzL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtaXMvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhMzVlYTYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtaXMvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iS2VyZmkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iVMOma2kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLDmnRzZW5kaW5nYXJobmFwcHVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iw5p0c2VuZGluZ2FyaG5hcHB1ci4gQWZ0ZW5ndCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iw5p0c2VuZGluZ2FyaG5hcHB1ci4gVGVuZ2lzdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLDmnRzZW5kaW5nYXJobmFwcHVyLiBUZW5ndCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJTZW5kYSDDunQgw60iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJMZWl0YcOwIGHDsCB0w6ZranVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IkFmdGVuZ2phc3QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJTdMO2w7B2YSDDunRzZW5kaW5ndSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iTG9rYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlNwaWxhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJIbMOpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iU3TDtsOwdmEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJTdMOma2thIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJNaW5ua2EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJQbMO2dHV1bXNsYWciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iSGxqw7PDsHN0eXJrc3NsZcOwaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iRW5naW5uIG1pw7BpbGwgdmFsaW5uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJFbmdhciB1cHBsw71zaW5nYXIgw60gYm/DsGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IlNrasOhciBzZW5kdXIgw7p0Ijwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1pdC9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWl0L3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTZlM2FjLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWl0L3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlNpc3RlbWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iRGlzcG9zaXRpdmkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJQdWxzYW50ZSBUcmFzbWV0dGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJQdWxzYW50ZSBUcmFzbWV0dGkuIERpc2Nvbm5lc3NvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJQdWxzYW50ZSBUcmFzbWV0dGkuIENvbm5lc3Npb25lIGluIGNvcnNvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IlB1bHNhbnRlIFRyYXNtZXR0aS4gQ29ubmVzc28iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iVHJhc21ldHRpIGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJSaWNlcmNhIGRpIGRpc3Bvc2l0aXZpIGluIGNvcnNvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IlNjb2xsZWdhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iSW50ZXJyb21waSB0cmFzbWlzc2lvbmUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IkNoaXVkaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlJpcHJvZHVjaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iUGF1c2EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJJbnRlcnJvbXBpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iRXNwYW5kaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iQ29tcHJpbWkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJDb3BlcnRpbmEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iRGlzcG9zaXRpdm8gZGkgc2NvcnJpbWVudG8gZGVsIHZvbHVtZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iTmVzc3VuIGNvbnRlbnV0byBtdWx0aW1lZGlhbGUgc2VsZXppb25hdG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+Ik5lc3N1bmEgaW5mb3JtYXppb25lIGRpc3BvbmliaWxlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJUcmFzbWlzc2lvbmUgZGVsbG8gc2NoZXJtbyBpbiBjb3JzbyI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtaXcvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1pdy9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjUyYjBjZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1pdy9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLXntei16jXm9eqIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+Itee15vXqdeZ16jXmdedIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i4oCP15zXl9em158g15TXpNei15zXqiBDYXN0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i4oCP15zXl9em158g15TXpNei15zXqiBDYXN0LiDXnteg15XXqtenIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLigI/XnNeX16bXnyDXlNek16LXnNeqIENhc3QuINee16rXl9eR16giPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i4oCP15zXl9em158g15TXpNei15zXqiBDYXN0LiDXnteX15XXkdeoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IteU16LXkdeo15Qg15DXnCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+Itee15fXpNepINee15vXqdeZ16jXmdedIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+Iteg16rXpyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IteU16TXodenINeQ16og15TXlNei15HXqNeUIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLXodeS15XXqCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IteU16TXotecIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLXlNep15TXlCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IteU16TXodenIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i15TXqNeX15EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+Iteb15XXldelIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i16LXmNeZ16TXqiDXkNec15HXldedIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+Itee15fXldeV158g16LXldem157XlCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i15zXkCDXoNeR15fXqNeUINee15PXmdeUIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLXkNeZ158g157XmdeT16Ig15bXnteZ158iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IteU16LXkdeo16og157XodeaINee16rXkdem16LXqiI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtamEvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1qYS9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE0OTcyNy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1qYS9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLjgrfjgrnjg4bjg6AiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i56uv5pyrIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i44Kt44Oj44K544OI44Ki44Kk44Kz44OzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i44Kt44Oj44K544OIIOOCouOCpOOCs+ODs+OAguaOpee2muino+mZpOa4iOOBvyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i44Kt44Oj44K544OIIOOCouOCpOOCs+ODs+OAguaOpee2muS4rSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLjgq3jg6Pjgrnjg4gg44Ki44Kk44Kz44Oz44CC5o6l57aa5riI44G/Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IuOCreODo+OCueODiOOBmeOCi+ODh+ODkOOCpOOCuSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+Iuerr+acq+OCkuaknOe0ouOBl+OBpuOBhOOBvuOBmSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLmjqXntprjgpLop6PpmaQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLjgq3jg6Pjgrnjg4jjgpLlgZzmraIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IumWieOBmOOCiyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IuWGjeeUnyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i5LiA5pmC5YGc5q2iIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i5YGc5q2iIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i5bGV6ZaLIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLmipjjgorjgZ/jgZ/jgoAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLjgqLjg6vjg5Djg6DjgqLjg7zjg4giPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i6Z+z6YeP44K544Op44Kk44OA44O8Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLjg6Hjg4fjgqPjgqLjgYzpgbjmip7jgZXjgozjgabjgYTjgb7jgZvjgpMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IuaDheWgseOBjOOBguOCiuOBvuOBm+OCkyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i55S76Z2i44KS44Kt44Oj44K544OI44GX44Gm44GE44G+44GZIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1rYS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWthL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGEwODFhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWthL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IuGDoeGDmOGDoeGDouGDlOGDm+GDkCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLhg5vhg53hg6zhg6fhg53hg5Hhg5jhg5rhg53hg5Hhg5Thg5Hhg5giPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLhg6Lhg6Dhg5Dhg5zhg6Hhg5rhg5jhg6Dhg5Thg5Hhg5jhg6Eg4YOm4YOY4YOa4YOQ4YOZ4YOYIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i4YOi4YOg4YOQ4YOc4YOh4YOa4YOY4YOg4YOU4YOR4YOY4YOhIOGDpuGDmOGDmuGDkOGDmeGDmC4g4YOS4YOQ4YOX4YOY4YOo4YOj4YOa4YOYIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLhg6Lhg6Dhg5Dhg5zhg6Hhg5rhg5jhg6Dhg5Thg5Hhg5jhg6Eg4YOm4YOY4YOa4YOQ4YOZ4YOYLiDhg5vhg5jhg5vhg5Phg5jhg5zhg5Dhg6Dhg5Thg53hg5Hhg6Eg4YOT4YOQ4YOZ4YOQ4YOV4YOo4YOY4YOg4YOU4YOR4YOQIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IuGDouGDoOGDkOGDnOGDoeGDmuGDmOGDoOGDlOGDkeGDmOGDoSDhg6bhg5jhg5rhg5Dhg5nhg5guIOGDk+GDkOGDmeGDkOGDleGDqOGDmOGDoOGDlOGDkeGDo+GDmuGDmCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLhg6Lhg6Dhg5Dhg5zhg6Hhg5rhg5jhg6Dhg5Thg5Hhg5A6Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i4YOb4YOd4YOs4YOn4YOd4YOR4YOY4YOa4YOd4YOR4YOU4YOR4YOY4YOhIOGDm+GDneGDq+GDmOGDlOGDkeGDkC4uLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLhg5nhg5Dhg5Xhg6jhg5jhg6Dhg5jhg6Eg4YOS4YOQ4YOs4YOn4YOV4YOU4YOi4YOQIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i4YOi4YOg4YOQ4YOc4YOh4YOa4YOY4YOg4YOU4YOR4YOY4YOhIOGDqOGDlOGDrOGDp+GDleGDlOGDouGDkCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i4YOT4YOQ4YOu4YOj4YOg4YOV4YOQIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i4YOT4YOQ4YOZ4YOV4YOg4YOQIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLhg57hg5Dhg6Phg5bhg5AiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLhg6jhg5Thg6zhg6fhg5Xhg5Thg6Lhg5AiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLhg5Lhg5Dhg6jhg5rhg5AiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IuGDqeGDkOGDmeGDlOGDquGDleGDkCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IuGDkOGDmuGDkeGDneGDm+GDmOGDoSDhg5Lhg5Dhg6Dhg5Thg5nhg5Dhg5zhg5giPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i4YOu4YOb4YOY4YOhIOGDoeGDmuGDkOGDmOGDk+GDlOGDoOGDmCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i4YOb4YOU4YOT4YOY4YOQIOGDkOGDoOGDqeGDlOGDo+GDmuGDmCDhg5Dhg6Ag4YOQ4YOg4YOY4YOhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLhg5jhg5zhg6Thg53hg6Dhg5vhg5Dhg6rhg5jhg5Ag4YOQ4YOgIOGDkOGDoOGDmOGDoSDhg67hg5Thg5rhg5vhg5jhg6Hhg5Dhg6zhg5Xhg5Phg53hg5vhg5giPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IuGDm+GDmOGDm+GDk+GDmOGDnOGDkOGDoOGDlOGDneGDkeGDoSDhg5Thg5nhg6Dhg5Dhg5zhg5jhg6Eg4YOS4YOQ4YOT4YOQ4YOq4YOU4YOb4YOQIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1ray9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWtrL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NGRjYmIzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWtrL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+ItCW0q/QudC1Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+ItKa0rHRgNGL0LvSk9GL0LvQsNGAIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i0KLRgNCw0L3RgdC70Y/RhtC40Y/Qu9Cw0YMg0YLSr9C50LzQtdGB0ZYiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJcItCi0YDQsNC90YHQu9GP0YbQuNGP0LvQsNGDXCIg0YLSr9C50LzQtdGB0ZYuINCQ0LbRi9GA0LDRgtGD0LvRiyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iXCLQotGA0LDQvdGB0LvRj9GG0LjRj9C70LDRg1wiINGC0q/QudC80LXRgdGWLiDSmtC+0YHRi9C70YPQtNCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+Ilwi0KLRgNCw0L3RgdC70Y/RhtC40Y/Qu9Cw0YNcIiDRgtKv0LnQvNC10YHRli4g0prQvtGB0YvQu9C00YsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i0JrQtdC70LXRgdGW0LPQtSDRgtGA0LDQvdGB0LvRj9GG0LjRj9C70LDRgyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+ItKa0rHRgNGL0LvSk9GL0LvQsNGA0LTRiyDRgtCw0LHRgyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLQkNC20YvRgNCw0YLRgyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+ItCi0YDQsNC90YHQu9GP0YbQuNGP0LvQsNGD0LTRiyDRgtC+0pvRgtCw0YLRgyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i0JbQsNCx0YMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLQntC50L3QsNGC0YMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+ItCa0ZbQtNGW0YDRgtGDIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i0KLQvtKb0YLQsNGC0YMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLQltCw0Y4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+ItCW0LjRjiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+ItCQ0LvRjNCx0L7QvCDRiNC10LHQtdGA0ZYiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i0JTRi9Cx0YvRgSDQtNC10qPQs9C10LnRltC90ZbSoyDQttKv0LPRltGA0YLQutGW0YHRliI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i0JXRiNCx0ZbRgCDRgtCw0YHRg9GI0Ysg0YLQsNKj0LTQsNC70LzQsNKT0LDQvSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i0prQvtC7INC20LXRgtGW0LzQtNGWINCw0pvQv9Cw0YDQsNGCINC20L7SmyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i0K3QutGA0LDQvdC00Ysg0YLRgNCw0L3RgdC70Y/RhtC40Y/Qu9Cw0YMiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWttL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMta20vc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0NDc4MGUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMta20vc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i4Z6U4Z+S4Z6a4Z6W4Z+Q4Z6T4Z+S4Z6SIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IuGep+GelOGegOGemuGejuGfjSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IuGelOGfiuGevOGej+Geu+GehOGegeGetuGenyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IuGegeGetuGen+GelOGfiuGevOGej+Geu+GehOGfliDhnpThnrbhnpPhnoDhnrbhno/hn4vhnpXhn5Lhno/hnrbhnoXhn4siPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IuGegeGetuGen+GelOGfiuGevOGej+Geu+GehOGfliDhnoDhn4bhnpbhnrvhnoThnpfhn5LhnofhnrbhnpThn4siPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i4Z6B4Z624Z6f4Z6U4Z+K4Z684Z6P4Z674Z6E4Z+WIOGelOGetuGek+Gel+GfkuGeh+GetuGelOGfi+GeoOGevuGemSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLhnpThnonhn5LhnofhnrzhnpPhnpHhn4UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLhnoDhn4bhnpbhnrvhnoThnp/hn5Lhnpzhn4LhnoThnprhnoDhnqfhnpThnoDhnprhno7hn40iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i4Z6V4Z+S4Z6K4Z624Z6F4Z+LIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i4Z6I4Z6U4Z+L4Z6X4Z+S4Z6H4Z624Z6U4Z+LIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLhnpThnrfhnpEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLhnoXhnrbhnoDhn4siPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IuGeleGfkuGeouGetuGegCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IuGeiOGelOGfiyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IuGeluGehOGfkuGemuGeuOGegCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i4Z6U4Z6E4Z+S4Z6a4Z694Z6YIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i4Z6f4Z+S4Z6T4Z624Z6K4Z+D4Z6f4Z634Z6b4Z+S4Z6U4Z+I4Z6i4Z624Z6b4Z+L4Z6U4Z+K4Z674Z6YIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IuGemuGelOGetuGemuGegOGemOGfkuGemuGet+Gej+Gen+GfhuGeoeGfgeGehCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i4Z6C4Z+S4Z6Y4Z624Z6T4Z6A4Z624Z6a4Z6H4Z+S4Z6a4Z6+4Z6f4Z6Y4Z+B4Z6M4Z+A4Z6R4Z+BIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLhnpjhnrfhnpPhnpjhnrbhnpPhnpbhn5Dhno/hn4zhnpjhnrbhnpPhnpHhn4EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IuGegOGfhuGeluGeu+GehOGegeGetuGen+GeouGfgeGegOGfkuGemuGehOGfiyI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMta24vc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1rbi9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDIzN2ZkZC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1rbi9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLgsrjgsr/gsrjgs43gsp/gsoIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i4LK44LK+4LKn4LKo4LKX4LKz4LOBIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i4LKs4LK/4LKk4LON4LKk4LKw4LK/4LK44LOBIOCyrOCyn+CyqOCzjeKAjCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IuCyrOCyv+CypOCzjeCypOCysOCyv+CyuOCzgSDgsqzgsp/gsqjgs43igIwuIOCyuOCyguCyquCysOCzjeCylSDgspXgsqHgsr/gsqTgspfgs4rgsrPgsr/gsrjgsrLgsr7gspfgsr/gsqbgs4YiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IuCyrOCyv+CypOCzjeCypOCysOCyv+CyuOCzgSDgsqzgsp/gsqjgs43igIwuIOCyuOCyguCyquCysOCzjeCyleCyv+CyuOCysuCyvuCyl+CzgeCypOCzjeCypOCyv+CypuCzhiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLgsqzgsr/gsqTgs43gsqTgsrDgsr/gsrjgs4Eg4LKs4LKf4LKo4LON4oCMLiDgsrjgsoLgsqrgsrDgs43gspXgsr/gsqTgspfgs4rgsoLgsqHgsr/gsqbgs4YiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i4LKH4LKm4LKV4LON4LKV4LOGIOCyrOCyv+CypOCzjeCypOCysOCyv+CyuOCyvyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IuCyuOCyvuCyp+CyqOCyl+Cys+CyqOCzjeCyqOCzgSDgsrngs4HgsqHgs4HgspXgsrLgsr7gspfgs4HgsqTgs43gsqTgsr/gsqbgs4YiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i4LK44LKC4LKq4LKw4LON4LKVIOCyleCyoeCyv+CypOCyl+CziuCys+Cyv+CyuOCzgSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IuCyrOCyv+CypOCzjeCypOCysOCyv+CyuOCzgeCyteCyv+CyleCzhiDgsqjgsr/gsrLgs43gsrLgsr/gsrjgsr8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IuCyruCzgeCymuCzjeCymuCzgSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IuCyquCzjeCysuCzhyDgsq7gsr7gsqHgsr8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IuCyteCyv+CysOCyvuCyriI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IuCyqOCyv+CysuCzjeCysuCyv+CyuOCyvyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IuCyteCyv+CyuOCzjeCypOCysOCyv+CyuOCzgSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i4LK44LKC4LKV4LOB4LKa4LK/4LK44LOBIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i4LKG4LKy4LON4LKs4LKu4LONIOCyleCysuCzhiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLgsrXgsr7gsrLgs43gsq/gs4Lgsq7gs40g4LK44LON4LKy4LOI4LKh4LKw4LONIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLgsq/gsr7gsrXgs4Hgsqbgs4cg4LKu4LK+4LKn4LON4LKv4LKuIOCyhuCyr+CzjeCyleCzhuCyruCyvuCyoeCysuCyvuCyl+Cyv+CysuCzjeCysiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i4LKv4LK+4LK14LOB4LKm4LOHIOCyruCyvuCyueCyv+CypOCyvyDgsrLgsq3gs43gsq/gsrXgsr/gsrLgs43gsrIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IuCyquCysOCypuCzhuCyr+CyqOCzjeCyqOCzgSDgsqzgsr/gsqTgs43gsqTgsrDgsr/gsrjgsrLgsr7gspfgs4HgsqTgs43gsqTgsr/gsqbgs4YiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWtvL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMta28vc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlODkzYTkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMta28vc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i7Iuc7Iqk7YWcIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+Iuq4sOq4sCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IuyghOyGoSDrsoTtirwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLsoITshqEg67KE7Yq8LiDsl7DqsrAg7ZW07KCc65CoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLsoITshqEg67KE7Yq8LiDsl7DqsrAg7KSRIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IuyghOyGoSDrsoTtirwuIOyXsOqysOuQqCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLsoITshqHtlaAg6riw6riwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i6riw6riw66W8IOywvuuKlCDspJEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i7Jew6rKwIO2VtOygnCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IuyghOyGoSDspJHsp4AiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IuuLq+q4sCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IuyerOyDnSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i7J287Iuc7KSR7KeAIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i7KSR7KeAIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i7Y687LmY6riwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLsoJHquLAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLslajrspTslYTtirgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i67O866WoIOyKrOudvOydtOuNlCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i7ISg7YOd7ZWcIOuvuOuUlOyWtCDsl4bsnYwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IuygleuztOqwgCDsl4bsirXri4jri6QuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLtmZTrqbQg7KCE7IahIOykkSI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMta3kvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1reS9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc4MTNhZi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1reS9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLQotGD0YLRg9C8Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+ItCi0q/Qt9C806nQutGC06nRgCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+ItCi0YvRiNC60Ysg0Y3QutGA0LDQvdCz0LAg0YfRi9Cz0LDRgNGD0YMg0LHQsNGB0LrRi9GH0YsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLQotGL0YjQutGLINGN0LrRgNCw0L3Qs9CwINGH0YvQs9Cw0YDRg9GDINCx0LDRgdC60YvRh9GLLiDQotKv0LfQvNOp0Log0LDQttGL0YDQsNC/INGC0YPRgNCw0YIuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLQotGL0YjQutGLINGN0LrRgNCw0L3Qs9CwINGH0YvQs9Cw0YDRg9GDINCx0LDRgdC60YvRh9GLLiDQotKv0LfQvNOp0Log0YLRg9GC0LDRiNGD0YPQtNCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+ItCi0YvRiNC60Ysg0Y3QutGA0LDQvdCz0LAg0YfRi9Cz0LDRgNGD0YMg0LHQsNGB0LrRi9GH0YsuINCi0q/Qt9C806nQuiDRgtGD0YLQsNGI0YvQvyDRgtGD0YDQsNGCIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+ItCi06nQvNOp0L3QutKv0LPTqSDRh9GL0LPQsNGA0YPRgyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+ItCi0q/Qt9C806nQutGC06nRgCDQuNC30LTQtdC70q/Sr9C006kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i0JDQttGL0YDQsNGC0YPRgyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+ItCi0YvRiNC6INGN0LrRgNCw0L3Qs9CwINGH0YvQs9Cw0YDQvdGDINGC0L7QutGC0L7RgtGD0YMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+ItCW0LDQsdGD0YMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLQntC50L3QvtGC0YPRgyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i0KLRi9C90LTRi9GA0YPRgyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+ItCi0L7QutGC0L7RgtGD0YMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLQltCw0LnRi9C/INC606nRgNGB06nRgtKv0q8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+ItCW0YvQudGL0YjRgtGL0YDRg9GDIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i0JDQu9GM0LHQvtC8INC80YPQutCw0LHQsNGB0YsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i0q7QvdC00q8g0LrQsNGC0YPRg9C70LDRgtGD0YPRh9GDINGB0YvQtNGL0YDQvNCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLQkdC40YAg0LTQsCDQvNC10LTQuNCwINGE0LDQudC7INGC0LDQvdC00LDQu9Cz0LDQvSDQttC+0LoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+ItCt0Ycg0LzQsNCw0LvRi9C80LDRgiDQttC+0LoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+ItCi0YvRiNC60Ysg0Y3QutGA0LDQvdCz0LAg0YfRi9Cz0LDRgNGL0LvRg9GD0LTQsCI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbGFuZC9kaW1lbnMueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbGFuZC9kaW1lbnMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWYxZTFkLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWxhbmQvZGltZW5zLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHJlc291cmNlcz4KLSAgICA8IS0tIE1lZGlhUm91dGVDb250cm9sbGVyJ3Mgdm9sdW1lIGdyb3VwIGxpc3QgLS0+Ci0gICAgPGVhdC1jb21tZW50IC8+Ci0gICAgPCEtLSBNYXhpbXVtIGhlaWdodCBvZiB2b2x1bWUgZ3JvdXAgbGlzdC4gLS0+Ci0gICAgPGRpbWVuIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX2dyb3VwX2xpc3RfbWF4X2hlaWdodCI+MTMyZHA8L2RpbWVuPgotICAgIDwhLS0gSGVpZ2h0IG9mIHZvbHVtZSBncm91cCBpdGVtLiAtLT4KLSAgICA8ZGltZW4gbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfZ3JvdXBfbGlzdF9pdGVtX2hlaWdodCI+NjFkcDwvZGltZW4+Ci0gICAgPCEtLSBTaXplIG9mIGFuIGl0ZW0ncyBpY29uLiAtLT4KLSAgICA8ZGltZW4gbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfZ3JvdXBfbGlzdF9pdGVtX2ljb25fc2l6ZSI+MThkcDwvZGltZW4+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWxvL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbG8vc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxNzM3ZGIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbG8vc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i4Lql4Lqw4Lqa4Lq74LqaIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IuC6reC6uOC6m+C6sOC6geC6reC6mSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IuC6m+C6uOC7iOC6oeKAi+C6hOC6suKAi+C6quKAi+C6l+C7jCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IuC6m+C6uOC7iOC6oeC6quC6u+C7iOC6h+C6quC6seC6meC6jeC6suC6mS4g4LqV4Lqx4LqU4LqB4Lqy4LqZ4LuA4LqK4Lq34LuI4Lqt4Lqh4LqV4LuN4LuI4LuB4Lql4LuJ4LqnIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLgupvgurjgu4jguqHguqrgurvgu4jguofguqrgurHgupnguo3gurLgupkuIOC6geC6s+C6peC6seC6h+C7gOC6iuC6t+C7iOC6reC6oeC6leC7jeC7iCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLgupvgurjgu4jguqHguqrgurvgu4jguofguqrgurHgupnguo3gurLgupkuIOC7gOC6iuC6t+C7iOC6reC6oeC6leC7jeC7iOC7geC6peC7ieC6pyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLguqrgurvgu4jguofguqrgurHgupnguo3gurLgupnguqvgurIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLguoHgurPguqXgurHguofigIvguorguq3guoHigIvguqvgurLigIvguq3gurjigIvgupvgurDigIvguoHguq3gupkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i4LqV4Lqx4LqU4LqB4Lqy4LqZ4LuA4LqK4Lq34LuI4Lqt4Lqh4LqV4LuN4LuIIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i4Lqi4Lq44LqU4LqB4Lqy4LqZ4Lqq4Lq74LuI4LqH4Lqq4Lqx4LqZ4LqN4Lqy4LqZIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLgupvgurTgupQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLguqvgurzgurTgu4ngupkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IuC6ouC6uOC6lOC6iuC6u+C7iOC6p+C6hOC6suC6pyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IuC6ouC6uOC6lCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IuC6guC6sOC6q+C6jeC6suC6jSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i4Lqr4LqN4LuN4LuJ4Lql4Lq74LqHIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i4Luc4LuJ4Lqy4Lqb4Lq74LqB4Lqt4Lqw4Lql4Lqw4Lqa4LuN4LuJ4LqyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IuC6leC6u+C6p+C6m+C6seC6muC6peC6sOC6lOC6seC6muC6quC6veC6hyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i4Lqa4LuN4LuI4oCL4LuE4LqU4LuJ4oCL4LuA4Lql4Lq34Lqt4LqB4oCL4Lqh4Lq14oCL4LuA4LqU4LqN4oCL4LuD4LqU4oCL4LuE4Lqn4LuJIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLguprgu43gu4jigIvguqHgurXigIvguoLgu43gu4nigIvguqHgurngupkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IuC6geC6suC6meC6quC6u+C7iOC6h+C6nuC6suC6muC7nOC7ieC6suC6iOC7jSI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbHQvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1sdC9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmYwMzZkMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1sdC9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTaXN0ZW1hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IsSucmVuZ2luaWFpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iUGVyZGF2aW1vIG15Z3R1a2FzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iUGVyZGF2aW1vIG15Z3R1a2FzLiBBdHNpanVuZ3RhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJQZXJkYXZpbW8gbXlndHVrYXMuIFByaXNpanVuZ2lhbWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iUGVyZGF2aW1vIG15Z3R1a2FzLiBQcmlzaWp1bmd0YSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJQZXJkdW90aSDEryI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IlJhbmRhbWkgxK9yZW5naW5pYWkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iQXRqdW5ndGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJTdXN0YWJkeXRpIHBlcmRhdmltxIUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IlXFvmRhcnl0aSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IkxlaXN0aSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iUHJpc3RhYmR5dGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJTdXN0YWJkeXRpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iScWhc2tsZWlzdGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlN1dHJhdWt0aSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkFsYnVtbyB2aXLFoWVsaXMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iR2Fyc3VtbyDFoWxpYXXFvmlrbGlzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJOZXBhc2lyaW5rdGEgam9raWEgbWVkaWphIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJJbmZvcm1hY2lqYSBuZXBhc2lla2lhbWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IlBlcmR1b2RhbWFzIGVrcmFuYXMiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWx2L3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbHYvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1NDA2M2UuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbHYvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU2lzdMSTbWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iSWVyxKtjZXMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJBcHJhaWRlcyBwb2dhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iQXByYWlkZXMgcG9nYS4gU2F2aWVub2p1bXMgcMSBcnRyYXVrdHMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IkFwcmFpZGVzIHBvZ2EuIE5vdGllayBzYXZpZW5vanVtYSBpenZlaWRlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkFwcmFpZGVzIHBvZ2EuIFNhdmllbm9qdW1zIGl6dmVpZG90cyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJBcHJhaWTEq8WhYW5hIHV6IGllcsSrY2kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJOb3RpZWsgaWVyxKvEjXUgbWVrbMSTxaFhbmEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iQXR2aWVub3QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJBcHR1csSTdCBhcHJhaWRpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJBaXp2xJNydCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IkF0c2thxYZvdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iQXB0dXLEk3QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJBcHR1csSTdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+Ikl6dsSTcnN0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJTYWvEvGF1dCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkFsYnVtYSB2xIFjacWGxaEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iU2thxLx1bWEgc2zEq2RuaXMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik5hdiBhdGxhc8SrdGkgbXVsdGl2aWRlcyBmYWlsaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iTmF2IHBpZWVqYW1hIGluZm9ybcSBY2lqYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iTm90aWVrIGVrcsSBbmEgYXByYWlkZSI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbWsvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1tay9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTJkZWUzNi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1tay9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLQodC40YHRgtC10LwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i0KPRgNC10LTQuCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+ItCa0L7Qv9GH0LXRgtC+INC30LAgQ2FzdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+ItCa0L7Qv9GH0LUg0LfQsCBDYXN0LiDQmNGB0LrQu9GD0YfQtdC90L4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+ItCa0L7Qv9GH0LUg0LfQsCBDYXN0LiDQodC1INC/0L7QstGA0LfRg9Cy0LAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i0JrQvtC/0YfQtSDQt9CwIENhc3QuINCf0L7QstGA0LfQsNC90L4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i0JXQvNC40YLRg9Cy0LDRmCDQvdCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i0KHQtSDQsdCw0YDQsNCw0YIg0YPRgNC10LTQuCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLQmNGB0LrQu9GD0YfQuCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+ItCh0L7Qv9GA0Lgg0LPQviDQtdC80LjRgtGD0LLQsNGa0LXRgtC+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLQl9Cw0YLQstC+0YDQuCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+ItCg0LXQv9GA0L7QtNGD0YbQuNGA0LDRmCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i0J/QsNGD0LfQuNGA0LDRmCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+ItCh0L7Qv9GA0LgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLQn9GA0L7RiNC40YDQuCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i0KHQvtCx0LXRgNC4Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i0JrQvtGA0LjRhtCwINC90LAg0LDQu9Cx0YPQvCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLQm9C40LfQs9Cw0Ycg0LfQsCDRmNCw0YfQuNC90LAg0L3QsCDQt9Cy0YPQuiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i0J3QtSDRgdC1INC40LfQsdGA0LDQvdC4INC80LXQtNC40YPQvNC4Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLQndC10LzQsCDQtNC+0YHRgtCw0L/QvdC4INC40L3RhNC+0YDQvNCw0YbQuNC4Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLQldC60YDQsNC90L7RgiDRgdC1INC10LzQuNGC0YPQstCwIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1tbC9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLW1sL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDkxNGI5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLW1sL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IuC0uOC0v+C0uOC1jeC0seC1jeC0seC0giI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLgtIngtKrgtJXgtLDgtKPgtJngtY3gtJngtb4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLgtJ/gtL7gtKrgtY3gtKrgtYHgtJrgtYbgtK/gtY3gtK/gtYHgtJUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLgtJXgtL7gtLjgtY3gtLHgtY3gtLHgtY0g4LSs4LSf4LWN4LSf4LW6LiDgtLXgtL/gtJrgtY3gtJvgtYfgtKbgtL/gtJrgtY3gtJrgtYEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IuC0leC0vuC0uOC1jeC0seC1jeC0seC1jSDgtKzgtJ/gtY3gtJ/gtbouIOC0leC0o+C0leC1jeKAjOC0seC1jeC0seC1geC0muC1huC0r+C1jeC0r+C1geC0qOC1jeC0qOC1gSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLgtJXgtL7gtLjgtY3gtLHgtY3gtLHgtY0g4LSs4LSf4LWN4LSf4LW6LiDgtJXgtKPgtJXgtY3gtLHgtY3gtLHgtYHgtJrgtYbgtK/gtY3gtKTgtYEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i4LSH4LSk4LS/4LSy4LWH4LSV4LWN4LSV4LWNIOC0leC0vuC0uOC1jeC0seC1jeC0seC1geC0muC1huC0r+C1jeC0r+C1geC0lSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IuC0ieC0quC0leC0sOC0o+C0meC1jeC0meC1viDgtJXgtKPgtY3gtJ/gtYbgtKTgtY3gtKTgtYHgtKjgtY3gtKjgtYEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i4LS14LS/4LSa4LWN4LSb4LWH4LSm4LS/4LSV4LWN4LSV4LWB4LSVIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i4LSV4LS+4LS44LWN4LSx4LWN4LSx4LWB4LSa4LWG4LSv4LWN4LSv4LW9IOC0qOC0v+C1vOC0pOC1jeC0pOC1geC0lSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i4LSF4LS14LS44LS+4LSo4LS/4LSq4LWN4LSq4LS/4LSV4LWN4LSV4LWB4LSVIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i4LSq4LWN4LSy4LWHIOC0muC1huC0r+C1jeC0r+C1geC0lSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i4LSk4LW94LSV4LWN4LSV4LS+4LSy4LSCIOC0qOC0v+C1vOC0pOC1jeC0pOC1giI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IuC0qOC0v+C0sOC1jeKAjeC0pOC1jeC0pOC1geC0lSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IuC0teC0v+C0leC0uOC0v+C0quC1jeC0quC0v+C0leC1jeC0leC1geC0lSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i4LSa4LWB4LSw4LWB4LSV4LWN4LSV4LWB4LSVIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i4LSG4LW94LSs4LSCIOC0huC1vOC0n+C1jeC0n+C1jSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLgtLXgtYvgtLPgtL/gtK/gtIIg4LS44LWN4LSy4LWI4LSh4LW8Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLgtK7gtYDgtKHgtL/gtK/gtK/gtYrgtKjgtY3gtKjgtYHgtIIg4LSk4LS/4LSw4LSe4LWN4LSe4LWG4LSf4LWB4LSk4LWN4LSk4LS/4LSf4LWN4LSf4LS/4LSy4LWN4LSyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLgtLXgtL/gtLXgtLDgtJngtY3gtJngtLPgtYrgtKjgtY3gtKjgtYHgtIIg4LSy4LSt4LWN4LSv4LSu4LSy4LWN4LSyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLgtLjgtY3igIzgtJXgtY3gtLDgtYDgtbsg4LSV4LS+4LS44LWN4LSx4LWN4LSx4LWB4LSa4LWG4LSv4LWN4LSv4LWB4LSo4LWN4LSo4LWBIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1tbi9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLW1uL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjg3YzkyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLW1uL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+ItCh0LjRgdGC0LXQvCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLQotOp0YXTqdOp0YDTqdC80LbSr9Kv0LQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLQlNCw0LzQttGD0YPQu9Cw0YUg0YLQvtCy0YfQu9GD0YPRgCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+ItCU0LDQvNC20YPRg9C70LDRhSDRgtC+0LLRh9C70YPRg9GALiDQodCw0LvRgdCw0L0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+ItCU0LDQvNC20YPRg9C70LDRhSDRgtC+0LLRh9C70YPRg9GALiDQpdC+0LvQsdC+0LYg0LHQsNC50L3QsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLQlNCw0LzQttGD0YPQu9Cw0YUg0YLQvtCy0YfQu9GD0YPRgC4g0KXQvtC70LHQvtCz0LTRgdC+0L0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i0JTQsNC80LbRg9GD0LvQsNGFIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i0KLTqdGF06nTqdGA06nQvNC2INGF0LDQudC2INCx0LDQudC90LAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i0KHQsNC70LPQsNGFIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i0JTQsNC80LbRg9GD0LvQsNGF0YvQsyDQt9C+0LPRgdC+0L7RhSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i0KXQsNCw0YUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLQotC+0LPQu9GD0YPQu9Cw0YUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+ItCi0q/RgCDQt9C+0LPRgdC+0L7RhSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+ItCX0L7Qs9GB0L7QvtGFIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i0JTRjdC70LPRjdGFIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLQpdGD0YDQsNCw0YUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLQptC+0LzQs9C40LnQvSDQt9GD0YDQsNCzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+ItCU0YPRg9C90Ysg0YLSr9Cy0YjQuNC9INGC0LDQsNGA0YPRg9C70LDQs9GHIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLQr9C80LDRgCDRhyDQvNC10LTQuNCwINGB0L7QvdCz0L7QvtCz0q/QuSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i0JzRjdC00Y3RjdC70Y3QuyDQsdCw0LnRhdCz0q/QuSDQsdCw0LnQvdCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLQlNGN0LvQs9GN0YbQuNC50LMg0LTQsNC80LbRg9GD0LvQtiDQsdCw0LnQvdCwIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1tci9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLW1yL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZmZiZWJiLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLW1yL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IuCkuOCkv+CkuOCljeCkn+CkriI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLgpKHgpL/gpLXgpY3gpLngpL7gpIfgpLjgpYfgpLgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLgpJXgpL7gpLjgpY3gpJ8g4KSs4KSf4KSjIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i4KSV4KS+4KS44KWN4KSfIOCkrOCkn+Ckoy4g4KSh4KS/4KS44KWN4KSV4KSo4KWH4KSV4KWN4KSfIOCkleClh+CksuClhyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i4KSV4KS+4KS44KWN4KSfIOCkrOCkn+Ckoy4g4KSV4KSo4KWH4KSV4KWN4KSfIOCkleCksOCkpCDgpIbgpLngpYciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i4KSV4KS+4KS44KWN4KSfIOCkrOCkn+Ckoy4g4KSV4KSo4KWH4KSV4KWN4KSfIOCkleClh+CksuClhyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLgpK/gpL7gpLXgpLAg4KSV4KS+4KS44KWN4KSfIOCkleCksOCkviI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IuCkoeCkv+CkteCljeCkueCkvuCkh+CkuOClh+CkuCDgpLbgpYvgpKfgpKQg4KSG4KS54KWHIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IuCkoeCkv+CkuOCljeKAjeCkleCkqOClh+CkleCljeKAjeCknyDgpJXgpLDgpL4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLgpJXgpL7gpLjgpY3gpJ8g4KSV4KSw4KSj4KWHIOCkpeCkvuCkguCkrOCkteCkviI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i4KSs4KSC4KSmIOCkleCksOCkviI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IuCkquCljeCksuClhyDgpJXgpLDgpL4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IuCkteCkv+CksOCkvuCkriI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IuCkpeCkvuCkguCkrOCkviI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IuCkteCkv+CkuOCljeCkpOClg+CkpCDgpJXgpLDgpL4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IuCkuOCkguCkleClgeCkmuCkv+CkpCDgpJXgpLDgpL4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLgpIXgpLLgpY3gpKzgpK4g4KSV4KSy4KS+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IuCkteCljeCkueClieCksuCljeCkr+ClguCkriDgpLjgpY3gpLLgpL7gpK/gpKHgpLAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IuCkruClgOCkoeCkv+Ckr+CkviDgpKjgpL/gpLXgpKHgpLLgpL4g4KSo4KS+4KS54KWAIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLgpJXgpYvgpKPgpKTgpYDgpLngpYAg4KSu4KS+4KS54KS/4KSk4KWAIOCkieCkquCksuCkrOCljeCkpyDgpKjgpL7gpLngpYAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IuCkuOCljeCkleCljeCksOClgOCkqCDgpJXgpL7gpLjgpY3igI3gpJ8g4KSV4KSw4KSkIOCkhuCkueClhyI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbXMvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1tcy9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDg1ZTQ4MC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1tcy9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTaXN0ZW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iUGVyYW50aSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkJ1dGFuZyBIYW50YXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJCdXRhbmcgaGFudGFyLiBTYW1idW5nYW4gZGlwdXR1c2thbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iQnV0YW5nIGhhbnRhci4gTWVueWFtYnVuZyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJCdXRhbmcgaGFudGFyLiBEaXNhbWJ1bmdrYW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iSGFudGFyIGtlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iTWVuY2FyaSBwZXJhbnRpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IlB1dHVza2FuIHNhbWJ1bmdhbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IkJlcmhlbnRpIG1lbmdoYW50YXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IlR1dHVwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iTWFpbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iSmVkYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IkJlcmhlbnRpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iS2VtYmFuZ2thbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iUnVudHVoa2FuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iU2VuaSBhbGJ1bSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJQZWx1bmN1ciBrZWxhbnRhbmdhbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iVGlhZGEgbWVkaWEgZGlwaWxpaCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iTWFrbHVtYXQgdGlkYWsgdGVyc2VkaWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+Ik1lbmdoYW50YXIgc2tyaW4iPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLW15L3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbXkvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4M2Q4MDUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbXkvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i4YCF4YCU4YCF4YC6Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IuGAheGAgOGAuuGAleGAheGAueGAheGAiuGAuuGAuOGAmeGAu+GArOGAuCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IuGAgOGArOGAheGAuuGAkOGAuuGAnOGAr+GAleGAuuGAm+GAlOGAuiDhgIHhgJzhgK/hgJDhgLoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLhgIDhgKzhgIXhgLrhgIHhgJzhgK/hgJDhgLrhgYsg4YCB4YC74YCt4YCQ4YC64YCG4YCA4YC64YCZ4YCR4YCs4YC44YCV4YCrIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLhgIDhgKzhgIXhgLrhgIHhgJzhgK/hgJDhgLrhgYsg4YCB4YC74YCt4YCQ4YC64YCG4YCA4YC64YCU4YCx4YCe4YCK4YC6Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IuGAgOGArOGAheGAuuGAgeGAnOGAr+GAkOGAuuGBiyDhgIHhgLvhgK3hgJDhgLrhgIbhgIDhgLrhgJHhgKzhgLjhgJ7hgIrhgLoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i4YCA4YCs4YCF4YC64YCc4YCv4YCV4YC64YCb4YCU4YC6IOGAheGAgOGAuiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IuGAheGAgOGAuuGAleGAheGAueGAheGAiuGAuuGAuOGAmeGAu+GArOGAuCDhgJvhgL7hgKzhgJbhgL3hgLHhgIHhgLzhgIThgLrhgLgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i4YCG4YCA4YC64YCe4YC94YCa4YC64YCZ4YC+4YCvIOGAluGAvOGAkOGAuuGAm+GAlOGAuiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IuGAgOGArOGAheGAuuGAnOGAr+GAleGAuuGAgeGAvOGAhOGAuuGAuCDhgJvhgJXhgLrhgJvhgJThgLoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IuGAleGAreGAkOGAuuGAm+GAlOGAuiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IuGAluGAveGAhOGAt+GAuuGAm+GAlOGAuiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i4YCB4YCP4YCb4YCV4YC64YCb4YCU4YC6Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i4YCb4YCV4YC64YCb4YCU4YC6Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i4YCW4YC84YCU4YC34YC64YCB4YC74YCb4YCU4YC64YGDIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLhgIHhgLHhgKvhgIDhgLrhgJ7hgK3hgJnhgLrhgLjhgJvhgJThgLouLi4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLhgKHhgJrhgLrhgJzhgLrhgJjhgJnhgLrhgJXhgK/hgLYiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i4YCh4YCe4YC24YCh4YCQ4YCt4YCv4YC44YCh4YCA4YC74YCa4YC64YCB4YC74YCt4YCU4YC64YCe4YCK4YC34YC6IOGAhuGAnOGAreGAr+GAgOGAuuGAkuGAqyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i4YCZ4YCK4YC64YCe4YCK4YC34YC64YCZ4YCu4YCS4YCu4YCZ4YC+IOGAmeGAm+GAveGAseGAuOGAgeGAu+GAmuGAuuGAkeGArOGAuOGAleGAqyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i4YCh4YCB4YC74YCA4YC64YCh4YCc4YCA4YC6IOGAmeGAm+GAm+GAvuGAreGAlOGAreGAr+GAhOGAuuGAleGAqyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i4YCQ4YCK4YC64YC44YCW4YC84YCQ4YC64YCb4YCx4YC4IOGAmeGAu+GAgOGAuuGAlOGAvuGArOGAleGAvOGAhOGAuiI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbmIvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1uYi9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGY3NjRjOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1uYi9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTeXN0ZW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iRW5oZXRlciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkNhc3QtaWtvbmV0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iQ2FzdC1rbmFwcGVuLiBGcmFrb2JsZXQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IkNhc3Qta25hcHBlbi4gS29ibGVyIHRpbCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJDYXN0LWtuYXBwZW4uIFRpbGtvYmxldCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJDYXN0IHRpbCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IlPDuGtlciBldHRlciBlbmhldGVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IktvYmxlIGZyYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IlN0b3BwIGNhc3RpbmdlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iTHVrayI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlNwaWxsIGF2Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJTZXR0IHDDpSBwYXVzZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IlN0b3BwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iVXR2aWQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlNranVsIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iQWxidW1ncmFmaWtrIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IkdsaWRlYnJ5dGVyIGZvciB2b2x1bSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iRHUgaGFyIGlra2UgdmFsZ3Qgbm9lbiBtZWRpZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IkluZ2VuIGluZm9ybWFzam9uIGVyIHRpbGdqZW5nZWxpZyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iQ2FzdGVyIHNramVybWVuIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1uZS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLW5lL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmMyZTFhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLW5lL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IuCkquCljeCksOCko+CkvuCksuClgCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLgpIngpKrgpJXgpLDgpKPgpLngpLDgpYIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJDYXN0IOCkrOCkn+CkqCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkNhc3Qg4KSs4KSf4KSo4KWkIOCknOCkoeCkvuCkqCDgpLXgpL/gpJrgpY3gpJvgpYfgpKYg4KSt4KSv4KWLIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJDYXN0IOCkrOCkn+CkqOClpCDgpJzgpKHgpL7gpKgg4KS54KWB4KSB4KSm4KWIIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkNhc3Qg4KSs4KSf4KSo4KWkIOCknOCkoeCkvuCkqCDgpK3gpK/gpYsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i4KSv4KS44KSu4KS+IENhc3Qg4KSX4KSw4KWN4KSo4KWB4KS54KWL4KS44KWNIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i4KSv4KSo4KWN4KSk4KWN4KSw4KS54KSw4KWCIOCkquCkpOCljeCkpOCkviDgpLLgpJfgpL7gpIngpIHgpKbgpYgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i4KS14KS/4KSa4KWN4KSb4KWH4KSmIOCkl+CksOCljeCkqOClgeCkueCli+CkuOCljSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+ImNhc3Rpbmcg4KSw4KWL4KSV4KWN4KSo4KWB4KS54KWL4KS44KWNIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLgpKzgpKjgpY3gpKYg4KSX4KSw4KWN4KSo4KWB4KS54KWL4KS44KWNIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i4KSs4KSc4KS+4KSJ4KSo4KWB4KS54KWL4KS44KWNIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLgpLDgpYvgpJXgpY3gpKjgpYHgpLngpYvgpLjgpY0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLgpLDgpYvgpJXgpY3gpKjgpYHgpLngpYvgpLjgpY0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLgpLXgpL/gpLjgpY3gpKTgpL7gpLAg4KSX4KSw4KWN4KSo4KWB4KS54KWL4KS44KWNIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLgpLjgpILgpJXgpY3gpLfgpL/gpKrgpY3gpKQg4KSq4KS+4KSw4KWN4KSo4KWB4KS54KWL4KS44KWNIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i4KSP4KSy4KWN4KSs4KSuIOCkhuCksOCljeCknyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLgpK3gpYvgpLLgpY3gpK/gpYHgpK7gpJXgpYsg4KS44KWN4KSy4KS+4KSH4KSh4KSwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLgpJXgpYHgpKjgpYgg4KSu4KS/4KSh4KS/4KSv4KS+IOCkmuCkr+CkqCDgpK3gpI/gpJXgpYsg4KSb4KWI4KSoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLgpJzgpL7gpKjgpJXgpL7gpLDgpYAg4KSJ4KSq4KSy4KSs4KWN4KSnIOCkm+CliOCkqCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i4KS44KWN4KSV4KWN4KSw4KS/4KSoIGNhc3Qg4KSX4KSw4KWN4KSm4KWIIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1ubC9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLW5sL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWRmNjJkLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLW5sL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlN5c3RlZW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iQXBwYXJhdGVuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iQ2FzdC1pY29vbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkNhc3QtaWNvb24uIFZlcmJpbmRpbmcgdmVyYnJva2VuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJDYXN0LWljb29uLiBWZXJiaW5kaW5nIG1ha2VuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkNhc3QtaWNvb24uIFZlcmJvbmRlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJDYXN0ZW4gbmFhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IkFwcGFyYXRlbiB6b2VrZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iTG9za29wcGVsZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJDYXN0ZW4gc3RvcHBlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iU2x1aXRlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IkFmc3BlbGVuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJPbmRlcmJyZWtlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IlN0b3BwZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJVaXR2b3V3ZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlNhbWVudm91d2VuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iQWxidW1ob2VzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IlZvbHVtZXNjaHVpZnJlZ2VsYWFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJHZWVuIG1lZGlhIGdlc2VsZWN0ZWVyZCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iR2VlbiBpbmZvcm1hdGllIGJlc2NoaWtiYWFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJTY2hlcm0gY2FzdGVuIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1wYS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXBhL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjVkZjcxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXBhL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IuCouOCov+CouOCon+CoriI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLgqKHgqL/gqLXgqL7gqIjgqLjgqL7gqIIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLgqJXgqL7gqLjgqJ8g4Kis4Kif4KioIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i4KiV4Ki+4Ki44KifIOCorOCon+CoqOClpCDgqKHgqL/gqLjgqJXgqKjgqYjgqJXgqJ8g4KiV4KmA4Kik4Ki+IOCol+Cov+CohiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i4KiV4Ki+4Ki44KifIOCorOCon+CoqOClpCDgqJXgqKjgqYjgqJXgqJ8g4KiV4KmA4Kik4Ki+IOConOCoviDgqLDgqL/gqLngqL4g4Ki54KmIIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IuColeCovuCouOConyDgqKzgqJ/gqKjgpaQg4KiV4Kio4KmI4KiV4KifIOColeCpgOCopOCoviDgqJfgqL/gqIYiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i4KiP4Kil4KmHIOColeCovuCouOConyDgqJXgqLDgqYsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLgqKHgqYDgqLXgqL7gqIjgqLjgqL7gqIIg4Kio4KmC4KmwIOCosuCpseCoreCov+CohiDgqJzgqL4g4Kiw4Ki/4Ki54Ki+IOCoueCpiCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLgqKHgqL/gqLjgqJXgqKjgqYjgqJXgqJ8g4KiV4Kiw4KmLIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i4KiV4Ki+4Ki44KifIOColeCosOCoqOCoviDgqKzgqbDgqKYg4KiV4Kiw4KmLIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLgqKzgqbDgqKYg4KiV4Kiw4KmLIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i4Kiq4Kiy4KmHIOColeCosOCpiyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i4Kiw4KmL4KiV4KmLIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i4Kis4Kmw4KimIOColeCosOCpiyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IuCoteCov+CouOCopOCovuCosCDgqJXgqLDgqYsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IuCorOCpsOCopiDgqJXgqLDgqYsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLgqJDgqLLgqKzgqK4g4KiG4Kiw4KifIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IuCoteCpjOCosuCor+CpguCoriDgqLjgqLLgqL7gqIjgqKHgqLAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IuColeCpi+CoiCDgqLXgqYAg4Kiu4KmA4Kih4KmA4KiGIOCoqOCoueCpgOCogiDgqJrgqYHgqKPgqL/gqIYg4KiX4Ki/4KiGIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLgqJXgqYvgqIgg4Kic4Ki+4Kij4KiV4Ki+4Kiw4KmAIOCoieCoquCosuCorOCopyDgqKjgqLngqYDgqIIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IuCouOColeCpjeCosOCpgOCoqCDgqJzgqYvgqZwg4Kiw4Ki/4Ki54Ki+IOCoueCpiCI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtcGwvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1wbC9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc5MmE2ZC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1wbC9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTeXN0ZW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iVXJ6xIVkemVuaWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJQcnp5Y2lzayBDYXN0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iUHJ6eWNpc2sgUHJ6ZcWbbGlqIGVrcmFuLiBSb3rFgsSFY3pvbm8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IlByenljaXNrIFByemXFm2xpaiBla3Jhbi4gxYHEhWN6xJkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iUHJ6eWNpc2sgUHJ6ZcWbbGlqIGVrcmFuLiBQb8WCxIVjem9ubyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJQcnplc3nFgmFqIG5hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iWm5hamRvd2FuaWUgdXJ6xIVkemXFhCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJPZMWCxIVjeiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IlphdHJ6eW1haiBwcnplc3nFgmFuaWUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IlphbWtuaWoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJPZHR3w7NyeiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iV3N0cnp5bWFqIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iWmF0cnp5bWFqIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iUm96d2nFhCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iWndpxYQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJPa8WCYWRrYSBhbGJ1bXUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iU3V3YWsgZ8WCb8Wbbm/Fm2NpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJOaWUgd3licmFubyBtdWx0aW1lZGnDs3ciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IkJyYWsgaW5mb3JtYWNqaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iUHJ6ZXN5xYJhbSBla3JhbiI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtcHQtckJSL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtcHQtckJSL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0M2M2MTlkLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXB0LXJCUi9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTaXN0ZW1hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkRpc3Bvc2l0aXZvcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkJvdMOjbyBUcmFuc21pdGlyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iQm90w6NvIFwiVHJhbnNtaXRpclwiLiBEZXNjb25lY3RhZG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IkJvdMOjbyBcIlRyYW5zbWl0aXJcIi4gQ29uZWN0YW5kbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJCb3TDo28gXCJUcmFuc21pdGlyXCIuIENvbmVjdGFkbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJUcmFuc21pdGlyIHBhcmEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJMb2NhbGl6YW5kbyBkaXNwb3NpdGl2b3MiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iRGVzY29uZWN0YXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJJbnRlcnJvbXBlciB0cmFuc21pc3PDo28iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IkZlY2hhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlJlcHJvZHV6aXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlBhdXNhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IlBhcmFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iRXhwYW5kaXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlJlY29saGVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iQXJ0ZSBkbyDDoWxidW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iQ29udHJvbGUgZGVzbGl6YW50ZSBkZSB2b2x1bWUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik5lbmh1bWEgbcOtZGlhIHNlbGVjaW9uYWRhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJOZW5odW1hIGluZm9ybWHDp8OjbyBkaXNwb27DrXZlbCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iVHJhbnNtaXRpbmRvIGEgdGVsYSI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtcHQtclBUL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtcHQtclBUL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjBhNjFkLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXB0LXJQVC9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTaXN0ZW1hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkRpc3Bvc2l0aXZvcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkJvdMOjbyBUcmFuc21pdGlyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iQm90w6NvIFRyYW5zbWl0aXIuIERlc2xpZ2FkbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iQm90w6NvIFRyYW5zbWl0aXIuIEEgbGlnYXIuLi4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iQm90w6NvIFRyYW5zbWl0aXIuIExpZ2FkbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJUcmFuc21pdGlyIHBhcmEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJBIGxvY2FsaXphciBkaXNwb3NpdGl2b3MiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iRGVzYXNzb2NpYXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJQYXJhciBhIHRyYW5zbWlzc8OjbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iRmVjaGFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iUmVwcm9kdXppciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iSW50ZXJyb21wZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJQYXJhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IkV4cGFuZGlyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJSZWR1emlyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iSW1hZ2VtIGRvIMOhbGJ1bSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJDb250cm9sbyBkZSBkZXNsaXplIGRvIHZvbHVtZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iTmVuaHVtIHN1cG9ydGUgbXVsdGltw6lkaWEgc2VsZWNpb25hZG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+Ik5lbmh1bWEgaW5mb3JtYcOnw6NvIGRpc3BvbsOtdmVsIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJBIHRyYW5zbWl0aXIgbyBlY3LDoyI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtcHQvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1wdC9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNjNjE5ZC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1wdC9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTaXN0ZW1hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkRpc3Bvc2l0aXZvcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkJvdMOjbyBUcmFuc21pdGlyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iQm90w6NvIFwiVHJhbnNtaXRpclwiLiBEZXNjb25lY3RhZG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IkJvdMOjbyBcIlRyYW5zbWl0aXJcIi4gQ29uZWN0YW5kbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJCb3TDo28gXCJUcmFuc21pdGlyXCIuIENvbmVjdGFkbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJUcmFuc21pdGlyIHBhcmEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJMb2NhbGl6YW5kbyBkaXNwb3NpdGl2b3MiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iRGVzY29uZWN0YXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJJbnRlcnJvbXBlciB0cmFuc21pc3PDo28iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IkZlY2hhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlJlcHJvZHV6aXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlBhdXNhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IlBhcmFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iRXhwYW5kaXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlJlY29saGVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iQXJ0ZSBkbyDDoWxidW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iQ29udHJvbGUgZGVzbGl6YW50ZSBkZSB2b2x1bWUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik5lbmh1bWEgbcOtZGlhIHNlbGVjaW9uYWRhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJOZW5odW1hIGluZm9ybWHDp8OjbyBkaXNwb27DrXZlbCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iVHJhbnNtaXRpbmRvIGEgdGVsYSI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtcm8vc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1yby9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmViYjJmNi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1yby9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTaXN0ZW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iRGlzcG96aXRpdmUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJCdXRvbnVsIGRlIHByb2llY8ibaWUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJCdXRvbnVsIGRlIHByb2llY8ibaWUuIERlY29uZWN0YXQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IkJ1dG9udWwgZGUgcHJvaWVjyJtpZS4gU2UgY29uZWN0ZWF6xIMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iQnV0b251bCBkZSBwcm9pZWPIm2llLiBDb25lY3RhdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJQcm9pZWN0YcibaSBwZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IlNlIGNhdXTEgyBkaXNwb3ppdGl2ZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJEZWNvbmVjdGHIm2ktdsSDIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iTnUgbWFpIHByb2llY3RhyJtpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLDjm5jaGlkZcibaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlJlZGHIm2kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IsOObnRyZXJ1cGXIm2kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJPcHJpyJtpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iRXh0aW5kZcibaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iUmVzdHLDom5nZcibaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkdyYWZpY2EgYWxidW11bHVpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IkdsaXNvciBwZW50cnUgdm9sdW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik5pY2l1biBmaciZaWVyIG1lZGlhIHNlbGVjdGF0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJOdSBzdW50IGRpc3BvbmliaWxlIGluZm9ybWHIm2lpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJTZSBwcm9pZWN0ZWF6xIMgZWNyYW51bCI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtcnUvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1ydS9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M0NjJkMi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1ydS9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLQodC40YHRgtC10LzQsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLQo9GB0YLRgNC+0LnRgdGC0LLQsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+ItCa0L3QvtC/0LrQsCDRgtGA0LDQvdGB0LvRj9GG0LjQuCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+ItCa0L3QvtC/0LrQsCDRgtGA0LDQvdGB0LvRj9GG0LjQuC4g0KPRgdGC0YDQvtC50YHRgtCy0L4g0L7RgtC60LvRjtGH0LXQvdC+LiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i0JrQvdC+0L/QutCwINGC0YDQsNC90YHQu9GP0YbQuNC4LiDQo9GB0YLRgNC+0LnRgdGC0LLQviDQv9C+0LTQutC70Y7Rh9Cw0LXRgtGB0Y8uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+ItCa0L3QvtC/0LrQsCDRgtGA0LDQvdGB0LvRj9GG0LjQuC4g0KPRgdGC0YDQvtC50YHRgtCy0L4g0L/QvtC00LrQu9GO0YfQtdC90L4uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+ItCS0YvQsdC10YDQuNGC0LUg0YPRgdGC0YDQvtC50YHRgtCy0L4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLQn9C+0LjRgdC6INGD0YHRgtGA0L7QudGB0YLQsuKApiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLQntGC0LrQu9GO0YfQuNGC0YwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLQn9GA0LXQutGA0LDRgtC40YLRjCDRgtGA0LDQvdGB0LvRj9GG0LjRjiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i0JfQsNC60YDRi9GC0YwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLQktC+0YHQv9GA0L7QuNC30LLQtdGB0YLQuCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i0J/RgNC40L7RgdGC0LDQvdC+0LLQuNGC0YwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLQntGB0YLQsNC90L7QstC40YLRjCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+ItCg0LDQt9Cy0LXRgNC90YPRgtGMIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLQodCy0LXRgNC90YPRgtGMIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i0J7QsdC70L7QttC60LAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i0KDQtdCz0YPQu9GP0YLQvtGAINCz0YDQvtC80LrQvtGB0YLQuCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i0JzQtdC00LjQsNGE0LDQudC7INC90LUg0LLRi9Cx0YDQsNC9Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLQlNCw0L3QvdGL0YUg0L3QtdGCIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLQn9C+0LTQutC70Y7Rh9C10L3QuNC1INC6INGD0LTQsNC70LXQvdC90L7QvNGDINC80L7QvdC40YLQvtGA0YMiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXNpL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtc2kvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1NWNlNTAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtc2kvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i4La04Lav4LeK4Law4Lat4LeS4La6Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IuC2i+C2tOC3j+C2guC2nCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IuC3gOC3kuC2muC3j+C3gSDgtrbgt5zgtq3gt4rgtq3gtrgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLgt4Dgt5Lgtprgt4/gt4Eg4La24Lec4Lat4LeK4Lat4La4LiDgt4Dgt5Lgt4PgtrHgt4rgtrDgt5Ig4Laa4La74LaxIOC2veC2r+C3kyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i4LeA4LeS4Laa4LeP4LeBIOC2tuC3nOC2reC3iuC2reC2uCDgt4Pgtrjgt4rgtrbgtrHgt4rgtrAg4Laa4La74La44LeS4Lax4LeKIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IuC3gOC3kuC2muC3j+C3gSDgtrbgt5zgtq3gt4rgtq3gtrgg4LeD4La44LeK4La24Lax4LeK4LawIOC2muC2u+C2sSDgtr3gtq/gt5MiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i4LeA4LeS4Laa4LeP4LeB4La6Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i4LaL4La04LeP4LaC4LacIOC3g+C3meC3gOC3k+C2uCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLgt4Dgt5Lgt4PgtrHgt4rgtrDgt5Ig4Laa4La74Lax4LeK4LaxIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i4LeA4LeS4Laa4LeP4LeBIOC2muC3kuC2u+C3k+C2uCDgtrHgtq3gtrsg4Laa4La74Lax4LeK4LaxIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLgt4Dgt4PgtrHgt4rgtrEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLgtrDgt4/gt4DgtrHgtrog4Laa4La74Lax4LeK4LaxIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLgt4Dgt5Lgtrvgt4/gtrgg4Lac4Lax4LeK4LeA4Lax4LeK4LaxIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i4Lax4Lat4La7IOC2muC2u+C2seC3iuC2sSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IuC2r+C3kuC2nCDgt4Tgtrvgt5LgtrHgt4rgtrEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IuC3hOC2muC3lOC3heC2seC3iuC2sSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IuC2h+C2veC3iuC2tuC2uCDgtprgtr3gt4/gt4AiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i4LeE4LasIOC2tOC2u+C3kuC2uOC3jyDgt4Pgt4rgtr3gtrrgt5LgtqngtrvgtroiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IuC2uOC3j+C2sOC3iuKAjeC2uuC2uiDgtq3gt53gtrvgt48g4Lax4LeQ4LatIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLgtr3gtrbgt48g4Lac4LatIOC3hOC3kOC2muC3kiDgtq3gt5zgtrvgtq3gt5Tgtrvgt5Qg4Lax4Lec4La44LeQ4LatIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLgt4Dgt5Lgtprgt4/gt4Eg4Lat4LeS4La74La6Ijwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1zay9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXNrL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNThhYTExLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXNrL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlN5c3TDqW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iWmFyaWFkZW5pYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IlRsYcSNaWRsbyBwcmVub3N1Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iVGxhxI1pZGxvIHByZW5vc3UuIE9kcG9qZW7DqSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iVGxhxI1pZGxvIHByZW5vc3UuIFByaXDDoWphIHNhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IlRsYcSNaWRsbyBwcmVub3N1LiBQcmlwb2plbsOpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IlByZW5vcyBkbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IkjEvmFkYWrDuiBzYSB6YXJpYWRlbmlhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+Ik9kcG9qacWlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iWmFzdGF2acWlIHByZW7DocWhYW5pZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iWmF2cmllxaUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJQcmVocmHFpSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iUG96YXN0YXZpxaUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJaYXN0YXZpxaUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJSb3piYWxpxaUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlpiYWxpxaUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJPYnLDoXpvayBhbGJ1bXUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iUG9zw7p2YcSNIGhsYXNpdG9zdGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik5pZSBzw7ogdnlicmFuw6kgxb5pYWRuZSBtw6lkacOhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJOaWUgc8O6IGvCoGRpc3BvesOtY2lpIMW+aWFkbmUgaW5mb3Jtw6FjaWUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IlByZW7DocWhYSBzYSBvYnJhem92a2EiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXNsL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtc2wvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjYTRjZTQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtc2wvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU2lzdGVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+Ik5hcHJhdmUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJHdW1iIHphIHByZWR2YWphbmplIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iR3VtYiB6YSBwcmVkdmFqYW5qZS4gUG92ZXphdmEgamUgcHJla2luamVuYS4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+Ikd1bWIgemEgcHJlZHZhamFuamUuIFZ6cG9zdGF2bGphbmplIHBvdmV6YXZlLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJHdW1iIHphIHByZWR2YWphbmplLiBQb3ZlemF2YSBqZSB2enBvc3RhdmxqZW5hLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJQcmVkdmFqYW5qZSBwcmVrOiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+Iklza2FuamUgbmFwcmF2Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IlByZWtpbmkgcG92ZXphdm8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJVc3RhdmkgcHJlZHZhamFuamUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IlphcHJpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iUHJlZHZhamFuamUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlphdXN0YXZpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iVXN0YXZpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iUmF6xaFpcmkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlN0cm5pIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iTmFzbG92bmljYSBhbGJ1bWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iRHJzbmlrIHphIGdsYXNub3N0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJOaSBpemJyYW5lIHByZWRzdGF2bm9zdGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IlBvZGF0a2kgbmlzbyBuYSB2b2xqbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iUHJlZHZhamFuamUgemFzbG9uYSI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtc3Evc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1zcS9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE2ZTExMC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1zcS9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTaXN0ZW1pIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IlBhamlzamV0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iQnV0b25pIGkgdHJhbnNtZXRpbWl0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iQnV0b25pIGkgdHJhbnNtZXRpbWl0LiBKZSBpIHNoa8OrcHV0dXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IkJ1dG9uaSBpIHRyYW5zbWV0aW1pdC4gUG8gbGlkaGV0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkJ1dG9uaSBpIHRyYW5zbWV0aW1pdC4gSmUgaSBsaWRodXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iVHJhbnNtZXRvIHRlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iUG8ga8OrcmtvbiBwYWppc2plIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IlNoa8OrcHV0ZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+Ik5kYWxvIHRyYW5zbWV0aW1pbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iTWJ5bGwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJMdWFqIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJQYXV6w6siPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJOZGFsbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IlpnamVyb2plIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJQYWxvc2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJLb3BlcnRpbmEgZSBhbGJ1bWl0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IlJyw6tzaHFpdMOrc2kgaSB2b2x1bWl0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJOdWsgdSB6Z2pvZGggYXNuasOrIG1lZGlhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJOdWsgamVwZXQgYXNuasOrIGluZm9ybWFjaW9uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJQbyB0cmFuc21ldG9uIGVrcmFuaW4iPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXNyL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtc3Ivc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhYWJhZDUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtc3Ivc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i0KHQuNGB0YLQtdC8Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+ItCj0YDQtdGS0LDRmNC4Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i0JTRg9Cz0LzQtSDQn9GA0LXQsdCw0YbQuCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+ItCU0YPQs9C80LUg0J/RgNC10LHQsNGG0LguINCS0LXQt9CwINGY0LUg0L/RgNC10LrQuNC90YPRgtCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLQlNGD0LPQvNC1INCf0YDQtdCx0LDRhtC4LiDQn9C+0LLQtdC30YPRmNC1INGB0LUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i0JTRg9Cz0LzQtSDQn9GA0LXQsdCw0YbQuC4g0J/QvtCy0LXQt9Cw0L0g0ZjQtSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLQn9GA0LXQsdCw0YbRg9GYINC90LAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLQn9GA0L7QvdCw0LvQsNC20LXRmtC1INGD0YDQtdGS0LDRmNCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+ItCf0YDQtdC60LjQvdC4INCy0LXQt9GDIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i0JfQsNGD0YHRgtCw0LLQuCDQv9GA0LXQsdCw0YbQuNCy0LDRmtC1Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLQl9Cw0YLQstC+0YDQuCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+ItCf0YPRgdGC0LgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+ItCf0LDRg9C30LjRgNCw0ZgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLQl9Cw0YPRgdGC0LDQstC4Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i0J/RgNC+0YjQuNGA0LgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+ItCh0LrRg9C/0LgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLQntC80L7RgiDQsNC70LHRg9C80LAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i0JrQu9C40LfQsNGHINC30LAg0ZjQsNGH0LjQvdGDINC30LLRg9C60LAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+ItCd0LXQvNCwINC40LfQsNCx0YDQsNC90LjRhSDQvNC10LTQuNGY0LAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+ItCd0LjRgdGDINC00L7RgdGC0YPQv9C90LUg0L3QuNC60LDQutCy0LUg0LjQvdGE0L7RgNC80LDRhtC40ZjQtSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i0J/RgNC10LHQsNGG0YPRmNC1INGB0LUg0LXQutGA0LDQvSI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtc3Yvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1zdi9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2E3ZDNlMC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1zdi9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTeXN0ZW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iRW5oZXRlciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkNhc3Qta25hcHBlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkNhc3Qta25hcHBlbi4gRnLDpW5rb3BwbGFkIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJDYXN0LWtuYXBwZW4uIEFuc2x1dGVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkNhc3Qta25hcHBlbi4gQW5zbHV0ZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iQ2FzdGEgdGlsbCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IkxldGFyIGVmdGVyIGVuaGV0ZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iS29wcGxhIGZyw6VuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iU2x1dGEgY2FzdGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IlN0w6RuZyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlNwZWxhIHVwcCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iUGF1c2EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJBdmJyeXQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJVdMO2a2EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IktvbXByaW1lcmEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJTa2l2b21zbGFnIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IlZvbHltcmVnbGFnZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iSW5nYSBtZWRpYSBoYXIgdmFsdHMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IkRldCBmaW5ucyBpbmdlbiBpbmZvcm1hdGlvbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iU2vDpHJtZW4gY2FzdGFzIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1zdy9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXN3L3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTYyY2IxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXN3L3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+Ik1mdW1vIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IlZpZmFhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iS2l0dWZlIGNoYSBrdXR1bWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJLaXR1ZmUgY2hhIGt1dHVtYS4gS2ltZW9uZG9sZXdhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJLaXR1ZmUgY2hhIGt1dHVtYS4gS2luYXVuZ2FuaXNoYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJLaXR1ZmUgY2hhIGt1dHVtYS4gS2ltZXVuZ2FuaXNod2EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iVHVtYSBrd2VueWUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJJbmF0YWZ1dGEgdmlmYWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iT25kb2EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJBY2hhIGt1dHVtYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iRnVuZ2EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJDaGV6YSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iU2l0aXNoYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IlNpbWFtaXNoYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IlBhbnVhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJLdW5qYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IlNhbmFhIHlhIGFsYmFtdSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJLaXRlbGV6aSBjaGEgc2F1dGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ikhha3VuYSBtYXVkaHVpIHlhbGl5b2NoYWd1bGl3YSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iSGFrdW5hIG1hZWxlem8geWFsaXlvcGF0aWthbmEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IkluYXR1bWEgc2tyaW5pIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1zdzYwMGRwL2RpbWVucy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1zdzYwMGRwL2RpbWVucy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwNDIzNDguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtc3c2MDBkcC9kaW1lbnMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cmVzb3VyY2VzPgotICAgIDwhLS0gVGhlIHBsYXRmb3JtJ3MgZGVzaXJlZCBmaXhlZCB3aWR0aCBmb3IgYSBkaWFsb2cgYWxvbmcgdGhlIG1ham9yIGF4aXMKLSAgICAgICAgICh0aGUgc2NyZWVuIGlzIGluIGxhbmRzY2FwZSkuIFRoaXMgbWF5IGJlIGVpdGhlciBhIGZyYWN0aW9uIG9yIGEgZGltZW5zaW9uLi0tPgotICAgIDxpdGVtIHR5cGU9ImRpbWVuIiBuYW1lPSJtcl9kaWFsb2dfZml4ZWRfd2lkdGhfbWFqb3IiPjYwJTwvaXRlbT4KLSAgICA8IS0tIFRoZSBwbGF0Zm9ybSdzIGRlc2lyZWQgZml4ZWQgd2lkdGggZm9yIGEgZGlhbG9nIGFsb25nIHRoZSBtaW5vciBheGlzCi0gICAgICAgICAodGhlIHNjcmVlbiBpcyBpbiBwb3J0cmFpdCkuIFRoaXMgbWF5IGJlIGVpdGhlciBhIGZyYWN0aW9uIG9yIGEgZGltZW5zaW9uLi0tPgotICAgIDxpdGVtIHR5cGU9ImRpbWVuIiBuYW1lPSJtcl9kaWFsb2dfZml4ZWRfd2lkdGhfbWlub3IiPjkwJTwvaXRlbT4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtc3c3MjBkcC9kaW1lbnMueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtc3c3MjBkcC9kaW1lbnMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzRhYjhkLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXN3NzIwZHAvZGltZW5zLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHJlc291cmNlcz4KLSAgICA8IS0tIFRoZSBwbGF0Zm9ybSdzIGRlc2lyZWQgZml4ZWQgd2lkdGggZm9yIGEgZGlhbG9nIGFsb25nIHRoZSBtYWpvciBheGlzCi0gICAgICAgICAodGhlIHNjcmVlbiBpcyBpbiBsYW5kc2NhcGUpLiBUaGlzIG1heSBiZSBlaXRoZXIgYSBmcmFjdGlvbiBvciBhIGRpbWVuc2lvbi4tLT4KLSAgICA8aXRlbSB0eXBlPSJkaW1lbiIgbmFtZT0ibXJfZGlhbG9nX2ZpeGVkX3dpZHRoX21ham9yIj41MCU8L2l0ZW0+Ci0gICAgPCEtLSBUaGUgcGxhdGZvcm0ncyBkZXNpcmVkIGZpeGVkIHdpZHRoIGZvciBhIGRpYWxvZyBhbG9uZyB0aGUgbWlub3IgYXhpcwotICAgICAgICAgKHRoZSBzY3JlZW4gaXMgaW4gcG9ydHJhaXQpLiBUaGlzIG1heSBiZSBlaXRoZXIgYSBmcmFjdGlvbiBvciBhIGRpbWVuc2lvbi4tLT4KLSAgICA8aXRlbSB0eXBlPSJkaW1lbiIgbmFtZT0ibXJfZGlhbG9nX2ZpeGVkX3dpZHRoX21pbm9yIj43MCU8L2l0ZW0+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXRhL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdGEvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxOTc4ZjMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdGEvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i4K6a4K6/4K644K+N4K6f4K6u4K+NIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IuCumuCuvuCupOCuqeCumeCvjeCuleCus+CvjSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IuCupOCuv+CusOCviOCur+Cuv+Cun+CvgSDgrqrgrp/gr43grp/grqngr40iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLgroXgrqngr4Hgrqrgr43grqrgr4HgrqTgrrLgr40g4K6q4K+K4K6k4K+N4K6k4K6+4K6p4K+NLiDgrqTgr4HgrqPgr43grp/grr/grpXgr43grpXgrqrgr43grqrgrp/gr43grp/grqTgr4EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IuCuheCuqeCvgeCuquCvjeCuquCvgeCupOCusuCvjSDgrqrgr4rgrqTgr43grqTgrr7grqngr40uIOCuh+Cuo+CviOCuleCvjeCuleCuv+CuseCupOCvgSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLgroXgrqngr4Hgrqrgr43grqrgr4HgrqTgrrLgr40g4K6q4K+K4K6k4K+N4K6k4K6+4K6p4K+NLiDgrofgrqPgr4jgrpXgr43grpXgrqrgr43grqrgrp/gr43grp/grqTgr4EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i4K6H4K6k4K6x4K+N4K6V4K+BIOCuheCuqeCvgeCuquCvjeCuquCvgSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IuCumuCuvuCupOCuqeCumeCvjeCuleCus+CviOCupOCvjSDgrqTgr4fgrp/gr4HgrpXgrr/grrHgrqTgr4EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i4K6k4K+K4K6f4K6w4K+N4K6q4K+I4K6k4K+NIOCupOCvgeCuo+CvjeCun+CuvyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IuCuheCuqeCvgeCuquCvjeCuquCvgeCuteCupOCviCDgrqjgrr/grrHgr4HgrqTgr43grqTgr4EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IuCuruCvguCun+CvgeCuruCvjSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IuCuh+Cur+CuleCvjeCuleCvgeCuruCvjSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i4K6H4K6f4K+I4K6o4K6/4K6x4K+B4K6k4K+N4K6k4K+B4K6u4K+NIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i4K6o4K6/4K6x4K+B4K6k4K+N4K6k4K+B4K614K6k4K6x4K+N4K6V4K6+4K6pIOCuquCviuCupOCvjeCupOCuvuCuqeCvjSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IuCuteCuv+CusOCuv+CuteCuvuCuleCvjeCuleCvgSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i4K6a4K+B4K6w4K+B4K6V4K+N4K6V4K+BIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i4K6G4K6y4K+N4K6q4K6u4K+NIOCuhuCusOCvjeCun+CvjSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLgrpLgrrLgrr/grq/grrPgrrXgr4Eg4K644K+N4K6y4K+I4K6f4K6w4K+NIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLgrq7gr4Dgrp/grr/grq/grr4g4K6O4K6k4K+B4K614K+B4K6u4K+NIOCupOCvh+CusOCvjeCuqOCvjeCupOCvhuCun+CvgeCuleCvjeCuleCuquCvjeCuquCun+CuteCuv+CusuCvjeCusuCviCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i4K6k4K6V4K614K6y4K+NIOCujuCupOCvgeCuteCvgeCuruCuv+CusuCvjeCusuCviCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i4K6k4K6/4K6w4K+I4K6v4K+IIOCuheCuqeCvgeCuquCvjeCuquCvgeCuleCuv+CuseCvgOCusOCvjeCuleCus+CvjSI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdGUvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy10ZS9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2QzMTJlMy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy10ZS9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLgsLjgsL/gsLjgsY3gsJ/gsK7gsY0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i4LCq4LCw4LC/4LCV4LCw4LC+4LCy4LGBIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i4LCq4LGN4LCw4LC44LC+4LCw4LCCIOCwmuCxh+Cwr+CwvyDgsKzgsJ/gsKjgsY0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLgsKrgsY3gsLDgsLjgsL7gsLAg4LCs4LCf4LCo4LGNLiDgsKHgsL/gsLjgsY3igIzgsJXgsKjgsYbgsJXgsY3gsJ/gsY0g4LCa4LGH4LCv4LCs4LCh4LC/4LCC4LCm4LC/Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLgsKrgsY3gsLDgsLjgsL7gsLAg4LCs4LCf4LCo4LGNLiDgsJXgsKjgsYbgsJXgsY3gsJ/gsY0g4LCa4LGH4LC44LGN4LCk4LGL4LCC4LCm4LC/Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IuCwquCxjeCwsOCwuOCwvuCwsCDgsKzgsJ/gsKjgsY0uIOCwleCwqOCxhuCwleCxjeCwn+CxjSDgsJrgsYfgsK/gsKzgsKHgsL/gsILgsKbgsL8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i4LCm4LGA4LCo4LC/4LCV4LC/IOCwquCxjeCwsOCwuOCwvuCwsOCwgiDgsJrgsYfgsK/gsILgsKHgsL8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLgsKrgsLDgsL/gsJXgsLDgsL7gsLLgsKjgsYEg4LCV4LCo4LGB4LCX4LGK4LCC4LCf4LGL4LCC4LCm4LC/Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IuCwoeCwv+CwuOCxjeKAjOCwleCwqOCxhuCwleCxjeCwn+CxjSDgsJrgsYfgsK/gsL8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLgsKrgsY3gsLDgsLjgsL7gsLDgsL7gsKjgsY3gsKjgsL8g4LCG4LCq4LC/4LC14LGH4LCv4LC/Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLgsK7gsYLgsLjgsL/gsLXgsYfgsLjgsY3gsKTgsYHgsILgsKbgsL8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLgsKrgsY3gsLLgsYcg4LCa4LGH4LC44LGN4LCk4LGB4LCC4LCm4LC/Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLgsKrgsL7gsJzgsY0g4LCa4LGH4LC44LGN4LCk4LGB4LCC4LCm4LC/Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i4LCG4LCq4LC/4LC14LGH4LCv4LC/Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i4LC14LC/4LC44LGN4LCk4LCw4LC/4LCC4LCq4LCc4LGH4LC44LGN4LCk4LGB4LCC4LCm4LC/Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLgsJXgsYHgsKbgsL/gsLjgsY3gsKTgsYHgsILgsKbgsL8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLgsIbgsLLgsY3gsKzgsK7gsY0g4LCG4LCw4LGN4LCf4LGNIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IuCwteCwvuCwsuCxjeCwr+CxguCwruCxjSDgsLjgsY3gsLLgsK/gsL/gsKHgsLDgsY0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IuCwruCxgOCwoeCwv+Cwr+CwviDgsI/gsKbgsYAg4LCO4LCC4LCa4LGB4LCV4LGL4LCs4LCh4LCy4LGH4LCm4LGBIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLgsLjgsK7gsL7gsJrgsL7gsLDgsIIg4LCF4LCC4LCm4LGB4LCs4LC+4LCf4LGB4LCy4LGLIOCwsuCxh+CwpuCxgSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i4LC44LGN4LCV4LGN4LCw4LGA4LCo4LGN4oCM4LCo4LGBIOCwquCxjeCwsOCwuOCwvuCwsOCwgiDgsJrgsYfgsLjgsY3gsKTgsYvgsILgsKbgsL8iPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXRoL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdGgvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmYThhZTUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdGgvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i4Lij4Liw4Lia4LiaIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IuC4reC4uOC4m+C4geC4o+C4k+C5jCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IuC4m+C4uOC5iOC4oSBcIuC5geC4hOC4quC4leC5jFwiIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i4Lib4Li44LmI4LihIFwi4LmB4LiE4Liq4LiV4LmMXCIg4Lii4LiB4LmA4Lil4Li04LiB4LiB4Liy4Lij4LmA4LiK4Li34LmI4Lit4Lih4LiV4LmI4LitIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLguJvguLjguYjguKEgXCLguYHguITguKrguJXguYxcIiDguIHguLPguKXguLHguIfguYDguIrguLfguYjguK3guKHguJXguYjguK0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i4Lib4Li44LmI4LihIFwi4LmB4LiE4Liq4LiV4LmMXCIg4LmA4LiK4Li34LmI4Lit4Lih4LiV4LmI4Lit4LmB4Lil4LmJ4LinIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IuC5geC4hOC4quC4leC5jOC5hOC4m+C4ouC4seC4hyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IuC4geC4s+C4peC4seC4h+C4hOC5ieC4meC4q+C4suC4reC4uOC4m+C4geC4o+C4k+C5jCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLguKLguIHguYDguKXguLTguIHguIHguLLguKPguYDguIrguLfguYjguK3guKHguJXguYjguK0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLguKvguKLguLjguJTguYHguITguKrguJXguYwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IuC4m+C4tOC4lCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IuC5gOC4peC5iOC4mSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i4Lir4Lii4Li44LiU4LiK4Lix4LmI4Lin4LiE4Lij4Liy4LinIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i4Lir4Lii4Li44LiUIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i4LiC4Lii4Liy4LiiIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLguKLguLjguJoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLguJvguIHguK3guLHguKXguJrguLHguYnguKEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i4LmB4LiW4Lia4LmA4Lil4Li34LmI4Lit4LiZ4Lib4Lij4Lix4Lia4Lij4Liw4LiU4Lix4Lia4LmA4Liq4Li14Lii4LiHIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLguYTguKHguYjguYTguJTguYnguYDguKXguLfguK3guIHguKrguLfguYjguK3guYTguKfguYkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IuC5hOC4oeC5iOC4oeC4teC4guC5ieC4reC4oeC4ueC4pSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i4LiB4Liz4Lil4Lix4LiH4LmB4LiE4Liq4LiV4LmM4Lir4LiZ4LmJ4Liy4LiI4LitIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy10bC9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXRsL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOGJlM2QwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXRsL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlN5c3RlbSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJNZ2EgRGV2aWNlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iQnV0dG9uIG5hIEktY2FzdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkJ1dHRvbiBuYSBJLWNhc3QuIE5hZGlza29uZWt0YSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iQnV0dG9uIG5hIEktY2FzdC4gS3Vtb2tvbmVrdGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iQnV0dG9uIG5hIEktY2FzdC4gTmFrYWtvbmVrdGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iSS1jYXN0IHNhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iTmFnaGFoYW5hcCBuZyBtZ2EgZGV2aWNlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IklkaXNrb25la3RhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iSWhpbnRvIGFuZyBwYWctY2FzdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iSXNhcmEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJJLXBsYXkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IkktcGF1c2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJJaGludG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJQYWxhd2FraW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IkktY29sbGFwc2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJBbGJ1bSBhcnQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iU2xpZGVyIG5nIHZvbHVtZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iV2FsYW5nIHBpbmlsaW5nIG1lZGlhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJXYWxhbmcgYXZhaWxhYmxlIG5hIGltcG9ybWFzeW9uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJLaW5hLWNhc3QgYW5nIHNjcmVlbiI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdHIvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy10ci9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVmNjM5Mi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy10ci9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTaXN0ZW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iQ2loYXpsYXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJZYXnEsW5sYSBkw7zEn21lc2kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJZYXnEsW5sYSBkw7zEn21lc2kuIEJhxJ9sYW50xLEga2VzaWxkaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iWWF5xLFubGEgZMO8xJ9tZXNpLiBCYcSfbGFuxLF5b3IiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iWWF5xLFubGEgZMO8xJ9tZXNpLiBCYcSfbGFuZMSxIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IsWedXJheWEgeWF5xLFubGE6Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iQ2loYXpsYXIgYnVsdW51eW9yIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IkJhxJ9sYW50xLF5xLEga2VzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iWWF5xLFuxLEgZHVyZHVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJLYXBhdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+Ik95bmF0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJEdXJha2xhdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IkR1cmR1ciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IkdlbmnFn2xldCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iRGFyYWx0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iQWxiw7xtIGthcGHEn8SxIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IlNlcyBkw7x6ZXlpIGtheWTEsXJtYSDDp3VidcSfdSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iTWVkeWEgc2XDp2lsbWVkaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iQmlsZ2kgeW9rIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJFa3JhbiB5YXnEsW5sYW7EsXlvciI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdWsvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy11ay9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzNkMzY1ZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy11ay9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLQodC40YHRgtC10LzQsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLQn9GA0LjRgdGC0YDQvtGXIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i0JrQvdC+0L/QutCwINGC0YDQsNC90YHQu9GP0YbRltGXIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i0JrQvdC+0L/QutCwINGC0YDQsNC90YHQu9GP0YbRltGXLiDQktGW0LTigJnRlNC00L3QsNC90L4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+ItCa0L3QvtC/0LrQsCDRgtGA0LDQvdGB0LvRj9GG0ZbRly4g0J/RltC04oCZ0ZTQtNC90LDQvdC90Y8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i0JrQvdC+0L/QutCwINGC0YDQsNC90YHQu9GP0YbRltGXLiDQn9GW0LTigJnRlNC00L3QsNC90L4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i0KLRgNCw0L3RgdC70Y7QstCw0YLQuCDQvdCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i0J/QvtGI0YPQuiDQv9GA0LjRgdGC0YDQvtGX0LIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i0JLRltC00LrQu9GO0YfQuNGC0LgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLQn9GA0LjQv9C40L3QuNGC0Lgg0YLRgNCw0L3RgdC70Y/RhtGW0Y4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+ItCX0LDQutGA0LjRgtC4Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i0JLRltC00YLQstC+0YDQuNGC0LgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+ItCf0YDQuNC30YPQv9C40L3QuNGC0LgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLQn9GA0LjQv9C40L3QuNGC0LgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLQoNC+0LfQs9C+0YDQvdGD0YLQuCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i0JfQs9C+0YDQvdGD0YLQuCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+ItCe0LHQutC70LDQtNC40L3QutCwINCw0LvRjNCx0L7QvNGDIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+ItCf0L7QstC30YPQvdC+0Log0LPRg9GH0L3QvtGB0YLRliI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i0JzQtdC00ZbQsC3RhNCw0LnQuyDQvdC1INCy0LjQsdGA0LDQvdC+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLQndC10LzQsNGUINC00LDQvdC40YUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+ItCi0YDQsNC90YHQu9GP0YbRltGPINC10LrRgNCw0L3QsCI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdXIvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy11ci9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjMyYzU5OC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy11ci9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLYs9iz2bnZhSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLYotmE2KfYqiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+Itqp2KfYs9m5INqp2LHZhtuSINqp2Kcg2KjZudmGIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i2qnYp9iz2bkg2qnYsdmG25Ig2qnYpyDYqNm52YbblCDYutuM2LEg2YXZhtiz2YTaqSDbgduSIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLaqdin2LPZuSDaqdix2YbbkiDaqdinINio2bnZhtuUINmF2YbYs9mE2qkg24HZiCDYsduB2Kcg24HbkiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLaqdin2LPZuSDaqdix2YbbkiDaqdinINio2bnZhtuUINmF2YbYs9mE2qkg24HbkiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLYp9izINmF24zauiDaqdin2LPZuSDaqdix24zauiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+Itii2YTYp9iqINiq2YTYp9i0INuB2Ygg2LHbgduSINuB24zauiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLYutuM2LEg2YXZhtiz2YTaqSDaqdix24zauiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+Itqp2KfYs9m5INqp2LHZhtinINio2YbYryDaqdix24zauiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i2KjZhtivINqp2LHbjNq6Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i2obZhNin2KbbjNq6Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLZhdmI2YLZiNmBINqp2LHbjNq6Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i2LHZiNqp24zauiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+Itm+2r7bjNmE2KfYptuM2roiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+Itiz2qnbjNqR24zauiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+Itin2YTYqNmFINii2LHZuSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLZiNin2YTbjNmI2YUg2LPZhNin2KbbjNqI2LEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Itqp2YjYptuMINmF24zaiNuM2Kcg2YXZhtiq2K7YqCDZhtuB24zauiDbgduSIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLaqdmI2KbbjCDZhdi52YTZiNmF2KfYqiDYr9iz2KrbjNin2Kgg2YbbgduM2roiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+Itiz2qnYsduM2YYg2qnYp9iz2bkg24HZiCDYsduB24wg24HbkiI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdXovc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy11ei9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBhMDgxNy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy11ei9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJUaXppbSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJRdXJpbG1hbGFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iVHJhbnNsYXRzaXlhIHR1Z21hc2kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJUcmFuc2xhdHNpeWEgdHVnbWFzaS4gVXppbGRpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJUcmFuc2xhdHNpeWEgdHVnbWFzaS4gVWxhbm1vcWRhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IlRyYW5zbGF0c2l5YSB0dWdtYXNpLiBVbGFuZGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iUXV5aWRhZ2lnYSB0cmFuc2xhdHNpeWEgcWlsaXNoOiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IlF1cmlsbWFsYXJuaSB0b3Bpc2giPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iVWxhbmlzaG5pIHV6aXNoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iVHJhbnNsYXRzaXlhbmkgdG/igJh4dGF0aXNoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJZb3Bpc2giPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJCb3NobGFzaCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iVG/igJh4dGF0aWIgdHVyaXNoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iVG/igJh4dGF0aXNoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iWW95aXNoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJZaWfigJhpc2giPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJBbGJvbSBtdXFvdmFzaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJUb3Z1c2ggYmFsYW5kbGlnaSBzbGF5ZGVyaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iTXVsdGltZWRpYSB0YW5sYW1hZ2FuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJIZWNoIHFhbmRheSBtYeKAmWx1bW90IHlv4oCYcSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iRWtyYW5uaSB0cmFuc2xhdHNpeWEgcWlsaXNoIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy12aS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXZpL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDk4Y2NhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXZpL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+Ikjhu4cgdGjhu5FuZyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJUaGnhur90IGLhu4siPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJOw7p0IHRydXnhu4FuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iTsO6dCB0cnV54buBbi4gxJDDoyBuZ+G6r3Qga+G6v3QgbuG7kWkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+Ik7DunQgdHJ1eeG7gW4uIMSQYW5nIGvhur90IG7hu5FpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+Ik7DunQgdHJ1eeG7gW4uIMSQw6Mga+G6v3QgbuG7kWkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iVHJ1eeG7gW4gdOG7m2kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLEkGFuZyB0w6xtIHRoaeG6v3QgYuG7iyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJOZ+G6r3Qga+G6v3QgbuG7kWkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJE4burbmcgdHJ1eeG7gW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IsSQw7NuZyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlBow6F0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJU4bqhbSBk4burbmciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJE4burbmciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJN4bufIHLhu5luZyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iVGh1IGfhu41uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i4bqibmggYsOsYSBhbGJ1bSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJUaGFuaCB0csaw4bujdCDDom0gbMaw4bujbmciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Iktow7RuZyBjw7MgcGjGsMahbmcgdGnhu4duIG7DoG8gxJHGsOG7o2MgY2jhu41uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJLaMO0bmcgY8OzIHRow7RuZyB0aW4gbsOgbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4ixJBhbmcgdHJ1eeG7gW4gbcOgbiBow6xuaCI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtemgtckNOL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtemgtckNOL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTIyZDAxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXpoLXJDTi9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLns7vnu58iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i6K6+5aSHIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i5oqV5bCE5oyJ6ZKuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i5oqV5bCE5oyJ6ZKu44CC5bey5pat5byA6L+e5o6lIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLmipXlsITmjInpkq7jgILmraPlnKjov57mjqUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i5oqV5bCE5oyJ6ZKu44CC5bey6L+e5o6lIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IuaKleWwhOWIsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+Iuato+WcqOafpeaJvuiuvuWkhyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLmlq3lvIDov57mjqUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLlgZzmraLmipXlsIQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IuWFs+mXrSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IuaSreaUviI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i5pqC5YGcIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i5YGc5q2iIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i5bGV5byAIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLmlLbotbciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLkuJPovpHlsIHpnaIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i6Z+z6YeP5ruR5Z2XIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLmnKrpgInmi6nku7vkvZXlqpLkvZMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IuayoeacieS7u+S9leebuOWFs+S/oeaBryI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i5q2j5Zyo5oqV5bCE5bGP5bmVIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy16aC1ySEsvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy16aC1ySEsvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1NmU1YzIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtemgtckhLL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+Iuezu+e1sSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLoo53nva4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLmipXmlL7mjInpiJUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLmipXmlL7mjInpiJXjgILlt7Lop6PpmaTpgKPmjqUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IuaKleaUvuaMiemIleOAguato+WcqOmAo+aOpSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLmipXmlL7mjInpiJXjgILlt7LpgKPmjqUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i5oqV5pS+6IezIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i5q2j5Zyo5bCL5om+6KOd572uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IuS4reaWt+mAo+e3miI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IuWBnOatouaKleaUviI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i6Zec6ZaJIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i5pKt5pS+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLmmqvlgZwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLlgZzmraIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLlsZXplosiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IuaUtuWQiCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IuWwiOi8r+WwgemdoiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLpn7Pph4/mu5Hmob8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IuWwmuacqumBuOaTh+WqkumrlCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i5rKS5pyJ6Kmz57Sw6LOH5paZIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLmraPlnKjmipXmlL7onqLluZUiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXpoLXJUVy9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXpoLXJUVy9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmNhZmRlMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy16aC1yVFcvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i57O757WxIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+Iuijnee9riI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IuaKleaUvuaMiemIlSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IuaKleaUvuaMiemIle+8m+W3suS4reaWt+mAo+e3miI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i5oqV5pS+5oyJ6YiV77yb6YCj57ea5LitIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IuaKleaUvuaMiemIle+8m+W3sumAo+e3miI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLmipXmlL7liLAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLmraPlnKjlsIvmib7oo53nva4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i5Lit5pa36YCj57eaIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i5YGc5q2i5oqV5pS+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLpl5zplokiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLmkq3mlL4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+Iuaaq+WBnCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IuWBnOatoiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IuWxlemWiyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i5pS25ZCIIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i5bCI6Lyv5bCB6Z2iIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+Iumfs+mHj+a7keahvyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i5pyq6YG45Y+W5Lu75L2V5aqS6auUIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLmspLmnInlj6/nlKjnmoTos4foqIoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+Iuato+WcqOaKleaUvuieouW5lSI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtenUvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy16dS9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTEwN2M0My4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy16dS9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJJc2lzdGltdSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJBbWFkaXZheWlzaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+Iklua2lub2JobyB5ZS1DYXN0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iSW5raW5vYmhvIHlva3VzYWthemEuIEt1bnFhbnl1bGl3ZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iSW5raW5vYmhvIHlva3VzYWthemEuIEt1eWF4aHVueXdhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+Iklua2lub2JobyB5b2t1c2FrYXphLiBLdXhodW55aXdlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IlNha2F6YSBrdS0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJJdGhvbGEgYW1hZGl2YXlpc2kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iTnFhbXVsYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+Ik1pc2EgdWt1c2FrYXphIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJWYWxhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iRGxhbGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+Ik1pc2EgaXNpa2hhc2hhbmEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJNaXNhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iTndlYmEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IkdvcWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJVYnVjaWtvIGJlLWFsYmhhbXUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iSXNpbGF5aWRhIHNldm9sdW11Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJBeWlraG8gaW1pZGl5YSBla2hldGhpd2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IkFsdWtobyB1bHdhemkgb2x1dGhvbGFrYWxheW8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IklzaWtyaW5pIHNva3VzYWthemEiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL2FycmF5cy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy9hcnJheXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTg3MzIwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL2FycmF5cy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxyZXNvdXJjZXM+Ci0gICAgPGludGVnZXItYXJyYXkgbmFtZT0ic3BlZWRfbXVsdGlwbGllZF9ieV8xMDAiPgotICAgICAgICA8aXRlbT4yNTwvaXRlbT4KLSAgICAgICAgPGl0ZW0+NTA8L2l0ZW0+Ci0gICAgICAgIDxpdGVtPjc1PC9pdGVtPgotICAgICAgICA8aXRlbT4xMDA8L2l0ZW0+Ci0gICAgICAgIDxpdGVtPjEyNTwvaXRlbT4KLSAgICAgICAgPGl0ZW0+MTUwPC9pdGVtPgotICAgICAgICA8aXRlbT4yMDA8L2l0ZW0+Ci0gICAgPC9pbnRlZ2VyLWFycmF5PgotPC9yZXNvdXJjZXM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMvYXR0cnMueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMvYXR0cnMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzcyODViLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL2F0dHJzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHJlc291cmNlcz4KLSAgICA8ZGVjbGFyZS1zdHlsZWFibGUgbmFtZT0iTWVkaWFSb3V0ZUJ1dHRvbiI+Ci0gICAgICAgIDwhLS0gVGhpcyBkcmF3YWJsZSBpcyBhIHN0YXRlIGxpc3Qgd2hlcmUgdGhlICJjaGVja2VkIiBzdGF0ZQotICAgICAgICAgICAgIGluZGljYXRlcyBhY3RpdmUgbWVkaWEgcm91dGluZy4gIENoZWNrYWJsZSBpbmRpY2F0ZXMgY29ubmVjdGluZwotICAgICAgICAgICAgIGFuZCBub24tY2hlY2tlZCAvIG5vbi1jaGVja2FibGUgaW5kaWNhdGVzCi0gICAgICAgICAgICAgdGhhdCBtZWRpYSBpcyBwbGF5aW5nIHRvIHRoZSBsb2NhbCBkZXZpY2Ugb25seS4gLS0+Ci0gICAgICAgIDxhdHRyIG5hbWU9ImV4dGVybmFsUm91dGVFbmFibGVkRHJhd2FibGUiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgotICAgICAgICA8IS0tIFRpbnQgdG8gYXBwbHkgdG8gdGhlIG1lZGlhIHJvdXRlIGJ1dHRvbiAtLT4KLSAgICAgICAgPGF0dHIgbmFtZT0ibWVkaWFSb3V0ZUJ1dHRvblRpbnQiIGZvcm1hdD0iY29sb3IiIC8+Ci0KLSAgICAgICAgPGF0dHIgbmFtZT0iYW5kcm9pZDptaW5XaWR0aCIgLz4KLSAgICAgICAgPGF0dHIgbmFtZT0iYW5kcm9pZDptaW5IZWlnaHQiIC8+Ci0gICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KLQotICAgIDxhdHRyIG5hbWU9Im1lZGlhUm91dGVCdXR0b25TdHlsZSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+Ci0gICAgPGF0dHIgbmFtZT0ibWVkaWFSb3V0ZUNsb3NlRHJhd2FibGUiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgotICAgIDxhdHRyIG5hbWU9Im1lZGlhUm91dGVQbGF5RHJhd2FibGUiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgotICAgIDxhdHRyIG5hbWU9Im1lZGlhUm91dGVQYXVzZURyYXdhYmxlIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KLSAgICA8YXR0ciBuYW1lPSJtZWRpYVJvdXRlU3RvcERyYXdhYmxlIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KLSAgICA8YXR0ciBuYW1lPSJtZWRpYVJvdXRlQXVkaW9UcmFja0RyYXdhYmxlIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KLSAgICA8YXR0ciBuYW1lPSJtZWRpYVJvdXRlRGVmYXVsdEljb25EcmF3YWJsZSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+Ci0gICAgPGF0dHIgbmFtZT0ibWVkaWFSb3V0ZVR2SWNvbkRyYXdhYmxlIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KLSAgICA8YXR0ciBuYW1lPSJtZWRpYVJvdXRlU3BlYWtlckljb25EcmF3YWJsZSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+Ci0gICAgPGF0dHIgbmFtZT0ibWVkaWFSb3V0ZVNwZWFrZXJHcm91cEljb25EcmF3YWJsZSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+Ci0gICAgPGF0dHIgbmFtZT0ibWVkaWFSb3V0ZUNvbnRyb2xQYW5lbFRoZW1lT3ZlcmxheSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+Ci0KLSAgICA8YXR0ciBuYW1lPSJtZWRpYVJvdXRlVGhlbWUiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy9jb2xvcnMueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMvY29sb3JzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdiYzI5OS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy9jb2xvcnMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cmVzb3VyY2VzPgotICAgIDxjb2xvciBuYW1lPSJncmF5Ij4jODA4MDgwPC9jb2xvcj4KLSAgICA8Y29sb3IgbmFtZT0id2hpdGUiPiNmZmZmZmY8L2NvbG9yPgotICAgIDxjb2xvciBuYW1lPSJ3aGl0ZV9vcGFjaXR5XzcwIj4jQjNmZmZmZmY8L2NvbG9yPgotICAgIDxjb2xvciBuYW1lPSJibGFja19vcGFjaXR5XzcwIj4jQjMwMDAwMDA8L2NvbG9yPgotICAgIDxjb2xvciBuYW1lPSJ0aXRsZV9iYXJfZ3JhZGllbnRfc3RhcnQiPiM1MDAwMDAwMDwvY29sb3I+Ci0gICAgPGNvbG9yIG5hbWU9InRpdGxlX2Jhcl9ncmFkaWVudF9lbmQiPiMwMDAwMDAwMDwvY29sb3I+Ci0gICAgPGNvbG9yIG5hbWU9ImJvdHRvbV9iYXJfYmFja2dyb3VuZCI+IzQwMjAyMDIwPC9jb2xvcj4KLTwvcmVzb3VyY2VzPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL2RpbWVucy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy9kaW1lbnMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDdiMDIyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL2RpbWVucy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxyZXNvdXJjZXM+Ci0gICAgPCEtLSBEaWFsb2cgc2l6ZSAtLT4KLSAgICA8ZWF0LWNvbW1lbnQgLz4KLSAgICA8IS0tIFRoZSBwbGF0Zm9ybSdzIGRlc2lyZWQgZml4ZWQgd2lkdGggZm9yIGEgZGlhbG9nIGFsb25nIHRoZSBtYWpvciBheGlzCi0gICAgICAgICAodGhlIHNjcmVlbiBpcyBpbiBsYW5kc2NhcGUpLiBUaGlzIG1heSBiZSBlaXRoZXIgYSBmcmFjdGlvbiBvciBhIGRpbWVuc2lvbi4tLT4KLSAgICA8ZGltZW4gbmFtZT0ibXJfZGlhbG9nX2ZpeGVkX3dpZHRoX21ham9yIj4zMjBkcDwvZGltZW4+Ci0gICAgPCEtLSBUaGUgcGxhdGZvcm0ncyBkZXNpcmVkIGZpeGVkIHdpZHRoIGZvciBhIGRpYWxvZyBhbG9uZyB0aGUgbWlub3IgYXhpcwotICAgICAgICAgKHRoZSBzY3JlZW4gaXMgaW4gcG9ydHJhaXQpLiBUaGlzIG1heSBiZSBlaXRoZXIgYSBmcmFjdGlvbiBvciBhIGRpbWVuc2lvbi4tLT4KLSAgICA8ZGltZW4gbmFtZT0ibXJfZGlhbG9nX2ZpeGVkX3dpZHRoX21pbm9yIj4zMjBkcDwvZGltZW4+Ci0KLSAgICA8IS0tIE1lZGlhUm91dGVDb250cm9sbGVyJ3Mgdm9sdW1lIGdyb3VwIGxpc3QgLS0+Ci0gICAgPGVhdC1jb21tZW50IC8+Ci0gICAgPCEtLSBNYXhpbXVtIGhlaWdodCBvZiB2b2x1bWUgZ3JvdXAgbGlzdC4gLS0+Ci0gICAgPGRpbWVuIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX2dyb3VwX2xpc3RfbWF4X2hlaWdodCI+Mjg4ZHA8L2RpbWVuPgotICAgIDwhLS0gSGVpZ2h0IG9mIHZvbHVtZSBncm91cCBpdGVtLiAtLT4KLSAgICA8ZGltZW4gbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfZ3JvdXBfbGlzdF9pdGVtX2hlaWdodCI+NjhkcDwvZGltZW4+Ci0gICAgPCEtLSBTaXplIG9mIGFuIGl0ZW0ncyBpY29uLiAtLT4KLSAgICA8ZGltZW4gbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfZ3JvdXBfbGlzdF9pdGVtX2ljb25fc2l6ZSI+MjRkcDwvZGltZW4+Ci0KLSAgICA8ZGltZW4gbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfZ3JvdXBfbGlzdF9wYWRkaW5nX3RvcCI+MTZkcDwvZGltZW4+Ci0gICAgPCEtLSBHcm91cCBsaXN0IGV4cGFuZC9jb2xsYXBzZSBhbmltYXRpb24gZHVyYXRpb24uIC0tPgotICAgIDxpbnRlZ2VyIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX2dyb3VwX2xpc3RfYW5pbWF0aW9uX2R1cmF0aW9uX21zIj40MDA8L2ludGVnZXI+Ci0gICAgPCEtLSBHcm91cCBsaXN0IGZhZGUgaW4gYW5pbWF0aW9uIGR1cmF0aW9uLiAtLT4KLSAgICA8aW50ZWdlciBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9ncm91cF9saXN0X2ZhZGVfaW5fZHVyYXRpb25fbXMiPjQwMDwvaW50ZWdlcj4KLSAgICA8IS0tIEdyb3VwIGxpc3QgZmFkZSBvdXQgYW5pbWF0aW9uIGR1cmF0aW9uLiAtLT4KLSAgICA8aW50ZWdlciBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9ncm91cF9saXN0X2ZhZGVfb3V0X2R1cmF0aW9uX21zIj4yMDA8L2ludGVnZXI+Ci0KLSAgICA8ZGltZW4gbmFtZT0ibWN2Ml9lbWJlZGRlZF9zZXR0aW5nc193aWR0aCI+MTUwZHA8L2RpbWVuPgotICAgIDxkaW1lbiBuYW1lPSJtY3YyX2VtYmVkZGVkX3NldHRpbmdzX2hlaWdodCI+MzZkcDwvZGltZW4+Ci0gICAgPGRpbWVuIG5hbWU9Im1jdjJfZW1iZWRkZWRfc2V0dGluZ3NfaWNvbl9zaXplIj4yMGRwPC9kaW1lbj4KLSAgICA8ZGltZW4gbmFtZT0ibWN2Ml9lbWJlZGRlZF9zZXR0aW5nc190ZXh0X2hlaWdodCI+MThkcDwvZGltZW4+Ci0gICAgPGRpbWVuIG5hbWU9Im1jdjJfZW1iZWRkZWRfc2V0dGluZ3NfbWFpbl90ZXh0X3NpemUiPjEyc3A8L2RpbWVuPgotICAgIDxkaW1lbiBuYW1lPSJtY3YyX2VtYmVkZGVkX3NldHRpbmdzX3N1Yl90ZXh0X3NpemUiPjEwc3A8L2RpbWVuPgotICAgIDxkaW1lbiBuYW1lPSJtY3YyX2Z1bGxfc2V0dGluZ3Nfd2lkdGgiPjIyNWRwPC9kaW1lbj4KLSAgICA8ZGltZW4gbmFtZT0ibWN2Ml9mdWxsX3NldHRpbmdzX2hlaWdodCI+NTRkcDwvZGltZW4+Ci0gICAgPGRpbWVuIG5hbWU9Im1jdjJfZnVsbF9zZXR0aW5nc19pY29uX3NpemUiPjMwZHA8L2RpbWVuPgotICAgIDxkaW1lbiBuYW1lPSJtY3YyX2Z1bGxfc2V0dGluZ3NfdGV4dF9oZWlnaHQiPjI3ZHA8L2RpbWVuPgotICAgIDxkaW1lbiBuYW1lPSJtY3YyX2Z1bGxfc2V0dGluZ3NfbWFpbl90ZXh0X3NpemUiPjE2c3A8L2RpbWVuPgotICAgIDxkaW1lbiBuYW1lPSJtY3YyX2Z1bGxfc2V0dGluZ3Nfc3ViX3RleHRfc2l6ZSI+MTNzcDwvZGltZW4+Ci0gICAgPGRpbWVuIG5hbWU9Im1jdjJfc2V0dGluZ3Nfb2Zmc2V0Ij44ZHA8L2RpbWVuPgotCi0gICAgPGRpbWVuIG5hbWU9Im1jdjJfdHJhbnNwb3J0X2NvbnRyb2xzX3BhZGRpbmciPjRkcDwvZGltZW4+Ci0gICAgPGRpbWVuIG5hbWU9Im1jdjJfcGF1c2VfaWNvbl9zaXplIj4zNmRwPC9kaW1lbj4KLSAgICA8ZGltZW4gbmFtZT0ibWN2Ml9mdWxsX2ljb25fc2l6ZSI+MjhkcDwvZGltZW4+Ci0gICAgPGRpbWVuIG5hbWU9Im1jdjJfZW1iZWRkZWRfaWNvbl9zaXplIj4yNGRwPC9kaW1lbj4KLSAgICA8ZGltZW4gbmFtZT0ibWN2Ml9taW5pbWFsX2ljb25fc2l6ZSI+MjRkcDwvZGltZW4+Ci0gICAgPGRpbWVuIG5hbWU9Im1jdjJfaWNvbl9tYXJnaW4iPjEwZHA8L2RpbWVuPgotCi0gICAgPGRpbWVuIG5hbWU9Im1jdjJfZnVsbF9hbGJ1bV9pbWFnZV9wb3J0cmFpdF9zaXplIj4yMzJkcDwvZGltZW4+Ci0gICAgPGRpbWVuIG5hbWU9Im1jdjJfZnVsbF9hbGJ1bV9pbWFnZV9sYW5kc2NhcGVfc2l6ZSI+MTc2ZHA8L2RpbWVuPgotCi0gICAgPGRpbWVuIG5hbWU9Im1jdjJfY3VzdG9tX3Byb2dyZXNzX21heF9zaXplIj4yZHA8L2RpbWVuPgotICAgIDxkaW1lbiBuYW1lPSJtY3YyX2N1c3RvbV9wcm9ncmVzc190aHVtYl9zaXplIj4xMmRwPC9kaW1lbj4KLSAgICA8ZGltZW4gbmFtZT0ibWN2Ml9idWZmZXJfdmlld19oZWlnaHQiPjVkcDwvZGltZW4+Ci0gICAgPCEtLSBUT0RPOiBhZGp1c3QgYm90dG9tIGJhciB2aWV3IC0tPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTk3YTNiLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotCi0gICAgPCEtLSBOYW1lIGZvciB0aGUgZGVmYXVsdCBzeXN0ZW0gcm91dGUgcHJpb3IgdG8gSmVsbHliZWFuLiBbQ0hBUiBMSU1JVD0zMF0gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSI+U3lzdGVtPC9zdHJpbmc+Ci0KLSAgICA8IS0tIE5hbWUgZm9yIHRoZSB1c2VyIHJvdXRlIGNhdGVnb3J5IGNyZWF0ZWQgd2hlbiBwdWJsaXNoaW5nIHJvdXRlcyB0byB0aGUgc3lzdGVtIGluIEplbGx5YmVhbiBhbmQgYWJvdmUuIFtDSEFSIExJTUlUPTMwXSAtLT4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSI+RGV2aWNlczwvc3RyaW5nPgotCi0gICAgPCEtLSBTdHJpbmcgdG8gYmUgc2hvd24gYXMgYSB0b29sdGlwIG9mIE1lZGlhUm91dGVCdXR0b24KLSAgICAgICAgQ2FzdCBpcyB0aGUgc3RhbmRhcmQgYW5kcm9pZCB2ZXJiIGZvciBzZW5kaW5nIGNvbnRlbnQgdG8gYSByZW1vdGUgZGV2aWNlLiBbQ0hBUiBMSU1JVD01MF0gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiI+Q2FzdCBidXR0b248L3N0cmluZz4KLQotICAgIDwhLS0gQ29udGVudCBkZXNjcmlwdGlvbiBvZiBhIE1lZGlhUm91dGVCdXR0b24gZm9yIGFjY2Vzc2liaWxpdHkgc3VwcG9ydCB3aGVuIG5vIHJlbW90ZSBkZXZpY2UgaXMgY29ubmVjdGVkLgotICAgICAgICBDYXN0IGlzIHRoZSBzdGFuZGFyZCBhbmRyb2lkIHZlcmIgZm9yIHNlbmRpbmcgY29udGVudCB0byBhIHJlbW90ZSBkZXZpY2UuIFtDSEFSIExJTUlUPU5PTkVdIC0tPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIj5DYXN0IGJ1dHRvbi4gRGlzY29ubmVjdGVkPC9zdHJpbmc+Ci0KLSAgICA8IS0tIENvbnRlbnQgZGVzY3JpcHRpb24gb2YgYSBNZWRpYVJvdXRlQnV0dG9uIGZvciBhY2Nlc3NpYmlsaXR5IHN1cHBvcnQgd2hpbGUgY29ubmVjdGluZyB0byBhIHJlbW90ZSBkZXZpY2UuCi0gICAgICAgIENhc3QgaXMgdGhlIHN0YW5kYXJkIGFuZHJvaWQgdmVyYiBmb3Igc2VuZGluZyBjb250ZW50IHRvIGEgcmVtb3RlIGRldmljZS4gW0NIQVIgTElNSVQ9Tk9ORV0gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIj5DYXN0IGJ1dHRvbi4gQ29ubmVjdGluZzwvc3RyaW5nPgotCi0gICAgPCEtLSBDb250ZW50IGRlc2NyaXB0aW9uIG9mIGEgTWVkaWFSb3V0ZUJ1dHRvbiBmb3IgYWNjZXNzaWJpbGl0eSBzdXBwb3J0IHdoZW4gYSByZW1vdGUgZGV2aWNlIGlzIGNvbm5lY3RlZC4KLSAgICAgICAgQ2FzdCBpcyB0aGUgc3RhbmRhcmQgYW5kcm9pZCB2ZXJiIGZvciBzZW5kaW5nIGNvbnRlbnQgdG8gYSByZW1vdGUgZGV2aWNlLiBbQ0hBUiBMSU1JVD1OT05FXSAtLT4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCI+Q2FzdCBidXR0b24uIENvbm5lY3RlZDwvc3RyaW5nPgotCi0gICAgPCEtLSBUaXRsZSBvZiB0aGUgbWVkaWEgcm91dGUgY2hvb3NlciBkaWFsb2cuIFtDSEFSIExJTUlUPTMwXSAtLT4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiPkNhc3QgdG88L3N0cmluZz4KLQotICAgIDwhLS0gUGxhY2Vob2xkZXIgdGV4dCB0byBzaG93IHdoZW4gbm8gZGV2aWNlcyBoYXZlIGJlZW4gZm91bmQuIFtDSEFSIExJTUlUPTUwXSAtLT4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIj5GaW5kaW5nIGRldmljZXM8L3N0cmluZz4KLQotICAgIDwhLS0gQnV0dG9uIHRvIGRpc2Nvbm5lY3QgZnJvbSBhIG1lZGlhIHJvdXRlLiAgW0NIQVIgTElNSVQ9MzBdIC0tPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0Ij5EaXNjb25uZWN0PC9zdHJpbmc+Ci0KLSAgICA8IS0tIEJ1dHRvbiB0byBzdG9wIHBsYXliYWNrIGFuZCBkaXNjb25uZWN0IGZyb20gYSBtZWRpYSByb3V0ZS4gW0NIQVIgTElNSVQ9MzBdIC0tPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciPlN0b3AgY2FzdGluZzwvc3RyaW5nPgotCi0gICAgPCEtLSBDb250ZW50IGRlc2NyaXB0aW9uIGZvciBhY2Nlc3NpYmlsaXR5IChub3Qgc2hvd24gb24gdGhlIHNjcmVlbik6IGRpYWxvZyBjbG9zZSBidXR0b24uIFtDSEFSIExJTUlUPU5PTkVdIC0tPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiI+Q2xvc2U8L3N0cmluZz4KLQotICAgIDwhLS0gQ29udGVudCBkZXNjcmlwdGlvbiBmb3IgYWNjZXNzaWJpbGl0eSAobm90IHNob3duIG9uIHRoZSBzY3JlZW4pOiBtZWRpYSBwbGF5IGJ1dHRvbi4gW0NIQVIgTElNSVQ9Tk9ORV0gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiPlBsYXk8L3N0cmluZz4KLQotICAgIDwhLS0gQ29udGVudCBkZXNjcmlwdGlvbiBmb3IgYWNjZXNzaWJpbGl0eSAobm90IHNob3duIG9uIHRoZSBzY3JlZW4pOiBtZWRpYSBwYXVzZSBidXR0b24uIFtDSEFSIExJTUlUPU5PTkVdIC0tPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSI+UGF1c2U8L3N0cmluZz4KLQotICAgIDwhLS0gQ29udGVudCBkZXNjcmlwdGlvbiBmb3IgYWNjZXNzaWJpbGl0eSAobm90IHNob3duIG9uIHRoZSBzY3JlZW4pOiBtZWRpYSBzdG9wIGJ1dHRvbi4gW0NIQVIgTElNSVQ9Tk9ORV0gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiPlN0b3A8L3N0cmluZz4KLQotICAgIDwhLS0gQ29udGVudCBkZXNjcmlwdGlvbiBmb3IgYWNjZXNzaWJpbGl0eSAobm90IHNob3duIG9uIHRoZSBzY3JlZW4pOiBncm91cCBleHBhbmQgYnV0dG9uLiBQcmVzc2luZyBidXR0b24gc2hvd3MgZ3JvdXAgbWVtYmVycyBvZiBhIHNlbGVjdGVkIHJvdXRlIGdyb3VwLiBbQ0hBUiBMSU1JVD1OT05FXSAtLT4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIj5FeHBhbmQ8L3N0cmluZz4KLQotICAgIDwhLS0gQ29udGVudCBkZXNjcmlwdGlvbiBmb3IgYWNjZXNzaWJpbGl0eSAobm90IHNob3duIG9uIHRoZSBzY3JlZW4pOiBncm91cCBjb2xsYXBzZSBidXR0b24uIFByZXNzaW5nIGJ1dHRvbiBoaWRlcyBncm91cCBtZW1iZXJzIG9mIGEgc2VsZWN0ZWQgcm91dGUgZ3JvdXAuIFtDSEFSIExJTUlUPU5PTkVdIC0tPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCI+Q29sbGFwc2U8L3N0cmluZz4KLQotICAgIDwhLS0gQ29udGVudCBkZXNjcmlwdGlvbiBmb3IgYWNjZXNzaWJpbGl0eSAobm90IHNob3duIG9uIHRoZSBzY3JlZW4pOiBhbGJ1bSBhcnQgYnV0dG9uLiBDbGlja2luZyBvbiB0aGUgYWxidW0gYXJ0IHRha2VzIHVzZXIgdG8gYSBwcmVkZWZpbmVkIGFjdGl2aXR5IHBlciBtZWRpYSBhcHAuIFtDSEFSIExJTUlUPTUwXSAtLT4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0Ij5BbGJ1bSBhcnQ8L3N0cmluZz4KLQotICAgIDwhLS0gQ29udGVudCBkZXNjcmlwdGlvbiBmb3IgYWNjZXNzaWJpbGl0eSAobm90IHNob3duIG9uIHRoZSBzY3JlZW4pOiB2b2x1bWUgc2xpZGVyLiBbQ0hBUiBMSU1JVD1OT05FXSAtLT4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciI+Vm9sdW1lIHNsaWRlcjwvc3RyaW5nPgotCi0gICAgPCEtLSBQbGFjZWhvbGRlciB0ZXh0IHRvIHNob3cgd2hlbiBubyBtZWRpYSBoYXZlIGJlZW4gc2VsZWN0ZWQgZm9yIHBsYXliYWNrLiBbQ0hBUiBMSU1JVD01MF0gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIj5ObyBtZWRpYSBzZWxlY3RlZDwvc3RyaW5nPgotCi0gICAgPCEtLSBQbGFjZWhvbGRlciB0ZXh0IHRvIHNob3cgd2hlbiBubyB0aXRsZS9kZXNjcmlwdGlvbiBoYXZlIGJlZW4gZm91bmQgZm9yIGEgZ2l2ZW4gc29uZy92aWRlby4gW0NIQVIgTElNSVQ9NTBdIC0tPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSI+Tm8gaW5mbyBhdmFpbGFibGU8L3N0cmluZz4KLQotICAgIDwhLS0gUGxhY2Vob2xkZXIgdGV4dCBpbmRpY2F0aW5nIHRoYXQgdGhlIHVzZXIgaXMgY3VycmVudGx5IGNhc3Rpbmcgc2NyZWVuLiBbQ0hBUiBMSU1JVD01MF0gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIj5DYXN0aW5nIHNjcmVlbjwvc3RyaW5nPgotCi0gICAgPCEtLSBUZXh0IGZvciBlcnJvciBhbGVydCB3aGVuIGEgdmlkZW8gY29udGFpbmVyIGlzIG5vdCB2YWxpZCBmb3IgcHJvZ3Jlc3NpdmUgZG93bmxvYWQvcGxheWJhY2suIC0tPgotICAgIDxzdHJpbmcgbmFtZT0iVmlkZW9WaWV3Ml9lcnJvcl90ZXh0X2ludmFsaWRfcHJvZ3Jlc3NpdmVfcGxheWJhY2siPlRoaXMgdmlkZW8gaXNuXCd0IHZhbGlkIGZvciBzdHJlYW1pbmcgdG8gdGhpcyBkZXZpY2UuPC9zdHJpbmc+Ci0gICAgPCEtLSBUZXh0IGZvciBlcnJvciBhbGVydCB3aGVuIGEgdmlkZW8gY2Fubm90IGJlIHBsYXllZC4gSXQgY2FuIGJlIHVzZWQgYnkgYW55IGFwcC4gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJWaWRlb1ZpZXcyX2Vycm9yX3RleHRfdW5rbm93biI+Q2FuXCd0IHBsYXkgdGhpcyB2aWRlby48L3N0cmluZz4KLSAgICA8IS0tIEJ1dHRvbiB0byBjbG9zZSBlcnJvciBhbGVydCB3aGVuIGEgdmlkZW8gY2Fubm90IGJlIHBsYXllZC4gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJWaWRlb1ZpZXcyX2Vycm9yX2J1dHRvbiI+T0s8L3N0cmluZz4KLQotICAgIDwhLS0gVGV4dCBmb3IgZGlzcGxheWluZyBhZCBza2lwIHdhaXQgdGltZS4gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJNZWRpYUNvbnRyb2xWaWV3Ml9hZF9za2lwX3dhaXRfdGltZSI+Ci0gICAgICAgIFlvdSBjYW4gc2tpcCBBZCBpbiA8eGxpZmY6ZyBpZD0id2FpdF90aW1lIiBleGFtcGxlPSI1Ij4lMSRkPC94bGlmZjpnPnMKLSAgICA8L3N0cmluZz4KLSAgICA8IS0tIFRleHQgZm9yIGRpc3BsYXlpbmcgYWQgdG90YWwgcmVtYWluaW5nIHRpbWUuIC0tPgotICAgIDxzdHJpbmcgbmFtZT0iTWVkaWFDb250cm9sVmlldzJfYWRfcmVtYWluaW5nX3RpbWUiPgotICAgICAgICBBZCDCtyA8eGxpZmY6ZyBpZD0icmVtYWluaW5nX3RpbWUiIGV4YW1wbGU9IjE6MTUiPiUxJHM8L3hsaWZmOmc+IHJlbWFpbmluZwotICAgIDwvc3RyaW5nPgotICAgIDwhLS0gUGxhY2Vob2xkZXIgdGV4dCBpbmRpY2F0aW5nIHRoYXQgdGhlIHVzZXIgY2FuIHByZXNzIHRoZSBidXR0b24gdG8gZ28gdG8gYW4gZXh0ZXJuYWwgd2Vic2l0ZS4gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJNZWRpYUNvbnRyb2xWaWV3Ml9hZF90ZXh0Ij5WaXNpdCBBZHZlcnRpc2VyPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJNZWRpYUNvbnRyb2xWaWV3Ml9zdWJ0aXRsZV90ZXh0Ij5DbG9zZWQgY2FwdGlvbjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iTWVkaWFDb250cm9sVmlldzJfc3VidGl0bGVfb2ZmX3RleHQiPk9mZjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iTWVkaWFDb250cm9sVmlldzJfYXVkaW9fdHJhY2tfdGV4dCI+QXVkaW8gdHJhY2s8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Ik1lZGlhQ29udHJvbFZpZXcyX2F1ZGlvX3RyYWNrX25vbmVfdGV4dCI+Tm9uZTwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iTWVkaWFDb250cm9sVmlldzJfdmlkZW9fcXVhbGl0eV90ZXh0Ij5WaWRlbyBxdWFsaXR5PC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJNZWRpYUNvbnRyb2xWaWV3Ml92aWRlb19xdWFsaXR5X2F1dG9fdGV4dCI+QXV0bzwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iTWVkaWFDb250cm9sVmlldzJfaGVscF90ZXh0Ij5IZWxwICZhbXA7IGZlZWRiYWNrPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJNZWRpYUNvbnRyb2xWaWV3Ml9wbGF5YmFja19zcGVlZF90ZXh0Ij5QbGF5YmFjayBzcGVlZDwvc3RyaW5nPgotICAgIDxzdHJpbmctYXJyYXkgbmFtZT0iTWVkaWFDb250cm9sVmlldzJfcGxheWJhY2tfc3BlZWRzIj4KLSAgICAgICAgPGl0ZW0+MC4yNXg8L2l0ZW0+Ci0gICAgICAgIDxpdGVtPjAuNXg8L2l0ZW0+Ci0gICAgICAgIDxpdGVtPjAuNzV4PC9pdGVtPgotICAgICAgICA8aXRlbT5Ob3JtYWw8L2l0ZW0+Ci0gICAgICAgIDxpdGVtPjEuMjV4PC9pdGVtPgotICAgICAgICA8aXRlbT4xLjV4PC9pdGVtPgotICAgICAgICA8aXRlbT4yeDwvaXRlbT4KLSAgICA8L3N0cmluZy1hcnJheT4KLSAgICA8IS0tIFBsYWNlaG9sZGVyIHRleHQgZm9yIGRpc3BsYXlpbmcgdGltZS4gVXNlZCB0byBjYWxjdWxhdGUgd2hpY2ggc2l6ZSBsYXlvdXQgdG8gdXNlLiAtLT4KLSAgICA8c3RyaW5nIG5hbWU9Ik1lZGlhQ29udHJvbFZpZXcyX3RpbWVfcGxhY2Vob2xkZXIiPjAwOjAwOjAwPC9zdHJpbmc+Ci0KLSAgICA8IS0tIFRleHQgZm9yIGRpc3BsYXlpbmcgc3VidGl0bGUgdHJhY2sgbnVtYmVyLiAtLT4KLSAgICA8c3RyaW5nIG5hbWU9Ik1lZGlhQ29udHJvbFZpZXcyX3N1YnRpdGxlX3RyYWNrX251bWJlcl90ZXh0Ij4KLSAgICAgICAgVHJhY2sgPHhsaWZmOmcgaWQ9InRyYWNrX251bWJlciIgZXhhbXBsZT0iMSI+JTEkczwveGxpZmY6Zz4KLSAgICA8L3N0cmluZz4KLSAgICA8IS0tIFRleHQgZm9yIGRpc3BsYXlpbmcgYXVkaW8gdHJhY2sgbnVtYmVyLiAtLT4KLSAgICA8c3RyaW5nIG5hbWU9Ik1lZGlhQ29udHJvbFZpZXcyX2F1ZGlvX3RyYWNrX251bWJlcl90ZXh0Ij4KLSAgICAgICAgVHJhY2sgPHhsaWZmOmcgaWQ9ImF1ZGlvX251bWJlciIgZXhhbXBsZT0iMSI+JTEkczwveGxpZmY6Zz4KLSAgICA8L3N0cmluZz4KLSAgICA8IS0tIFRleHQgZm9yIGRpc3BsYXlpbmcgdW5rbm93biBzb25nIHRpdGxlLiAtLT4KLSAgICA8c3RyaW5nIG5hbWU9Im1jdjJfbXVzaWNfdGl0bGVfdW5rbm93bl90ZXh0Ij5Tb25nIHRpdGxlIHVua25vd248L3N0cmluZz4KLSAgICA8IS0tIFRleHQgZm9yIGRpc3BsYXlpbmcgdW5rbm93biBhcnRpc3QgbmFtZS4gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJtY3YyX211c2ljX2FydGlzdF91bmtub3duX3RleHQiPkFydGlzdCB1bmtub3duPC9zdHJpbmc+Ci0KLSAgICA8IS0tQ29udGVudCBEZXNjcmlwdGlvbnMgLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJtY3YyX2JhY2tfYnV0dG9uX2Rlc2MiPkJhY2s8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1jdjJfb3ZlcmZsb3dfbGVmdF9idXR0b25fZGVzYyI+U2VlIG1vcmUgYnV0dG9uczwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibWN2Ml9vdmVyZmxvd19yaWdodF9idXR0b25fZGVzYyI+QmFjayB0byBwcmV2aW91cyBidXR0b24gbGlzdDwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibWN2Ml9zZWVrX2Jhcl9kZXNjIj5QbGF5YmFjayBwcm9ncmVzczwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibWN2Ml9zZXR0aW5nc19idXR0b25fZGVzYyI+U2V0dGluZ3M8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1jdjJfdmlkZW9fcXVhbGl0eV9idXR0b25fZGVzYyI+VmlkZW8gUXVhbGl0eSBTZWxlY3Rpb248L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1jdjJfY2NfaXNfb24iPlN1YnRpdGxlIGlzIG9uLiBDbGljayB0byBoaWRlIGl0Ljwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibWN2Ml9jY19pc19vZmYiPlN1YnRpdGxlIGlzIG9mZi4gQ2xpY2sgdG8gc2hvdyBpdC48L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1jdjJfcmVwbGF5X2J1dHRvbl9kZXNjIj5SZXBsYXk8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1jdjJfcGxheV9idXR0b25fZGVzYyI+UGxheTwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibWN2Ml9wYXVzZV9idXR0b25fZGVzYyI+UGF1c2U8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1jdjJfcHJldmlvdXNfYnV0dG9uX2Rlc2MiPlByZXZpb3VzIG1lZGlhPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtY3YyX25leHRfYnV0dG9uX2Rlc2MiPk5leHQgbWVkaWE8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1jdjJfcmV3aW5kX2J1dHRvbl9kZXNjIj5SZXdpbmQgYnkgMTAgc2Vjb25kczwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibWN2Ml9mZndkX2J1dHRvbl9kZXNjIj5HbyBmb3J3YXJkIGJ5IDMwIHNlY29uZHM8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1jdjJfbGF1bmNoX2J1dHRvbl9kZXNjIj5MYXVuY2ggTGluazwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibWN2Ml9tdXRlZF9idXR0b25fZGVzYyI+TXV0ZWQuIENsaWNrIHRvIHVubXV0ZTwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibWN2Ml91bm11dGVkX2J1dHRvbl9kZXNjIj5DbGljayB0byBNdXRlPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtY3YyX2Z1bGxfc2NyZWVuX2J1dHRvbl9kZXNjIj5GdWxsIHNjcmVlbjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy9zdHlsZS54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy9zdHlsZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViOWE4ZWUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMvc3R5bGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08cmVzb3VyY2VzPgotICAgIDxzdHlsZSBuYW1lPSJGdWxsVHJhbnNwb3J0Q29udHJvbHNCdXR0b24iPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmJhY2tncm91bmQiPkBudWxsPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9tYXJnaW4iPkBkaW1lbi9tY3YyX2ljb25fbWFyZ2luPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNjYWxlVHlwZSI+Zml0WFk8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJGdWxsVHJhbnNwb3J0Q29udHJvbHNCdXR0b24uUHJldmlvdXMiPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNyYyI+QGRyYXdhYmxlL2ljX3NraXBfcHJldmlvdXM8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X3dpZHRoIj5AZGltZW4vbWN2Ml9mdWxsX2ljb25fc2l6ZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfaGVpZ2h0Ij5AZGltZW4vbWN2Ml9mdWxsX2ljb25fc2l6ZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb24iPkBzdHJpbmcvbWN2Ml9wcmV2aW91c19idXR0b25fZGVzYzwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IkZ1bGxUcmFuc3BvcnRDb250cm9sc0J1dHRvbi5OZXh0Ij4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzcmMiPkBkcmF3YWJsZS9pY19za2lwX25leHQ8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X3dpZHRoIj5AZGltZW4vbWN2Ml9mdWxsX2ljb25fc2l6ZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfaGVpZ2h0Ij5AZGltZW4vbWN2Ml9mdWxsX2ljb25fc2l6ZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb24iPkBzdHJpbmcvbWN2Ml9uZXh0X2J1dHRvbl9kZXNjPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iRnVsbFRyYW5zcG9ydENvbnRyb2xzQnV0dG9uLlBhdXNlIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzcmMiPkBkcmF3YWJsZS9pY19wYXVzZV9jaXJjbGVfZmlsbGVkPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93aWR0aCI+QGRpbWVuL21jdjJfcGF1c2VfaWNvbl9zaXplPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9oZWlnaHQiPkBkaW1lbi9tY3YyX3BhdXNlX2ljb25fc2l6ZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb24iPkBzdHJpbmcvbWN2Ml9wYXVzZV9idXR0b25fZGVzYzwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IkZ1bGxUcmFuc3BvcnRDb250cm9sc0J1dHRvbi5GZndkIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzcmMiPkBkcmF3YWJsZS9pY19mb3J3YXJkXzMwPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93aWR0aCI+QGRpbWVuL21jdjJfZnVsbF9pY29uX3NpemU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X2hlaWdodCI+QGRpbWVuL21jdjJfZnVsbF9pY29uX3NpemU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uIj5Ac3RyaW5nL21jdjJfZmZ3ZF9idXR0b25fZGVzYzwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IkZ1bGxUcmFuc3BvcnRDb250cm9sc0J1dHRvbi5SZXciPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNyYyI+QGRyYXdhYmxlL2ljX3Jld2luZF8xMDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfd2lkdGgiPkBkaW1lbi9tY3YyX2Z1bGxfaWNvbl9zaXplPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9oZWlnaHQiPkBkaW1lbi9tY3YyX2Z1bGxfaWNvbl9zaXplPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmNvbnRlbnREZXNjcmlwdGlvbiI+QHN0cmluZy9tY3YyX3Jld2luZF9idXR0b25fZGVzYzwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IkVtYmVkZGVkVHJhbnNwb3J0Q29udHJvbHNCdXR0b24iPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmJhY2tncm91bmQiPkBudWxsPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9tYXJnaW4iPkBkaW1lbi9tY3YyX2ljb25fbWFyZ2luPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNjYWxlVHlwZSI+Zml0WFk8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJFbWJlZGRlZFRyYW5zcG9ydENvbnRyb2xzQnV0dG9uLlByZXZpb3VzIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzcmMiPkBkcmF3YWJsZS9pY19za2lwX3ByZXZpb3VzPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93aWR0aCI+QGRpbWVuL21jdjJfZW1iZWRkZWRfaWNvbl9zaXplPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9oZWlnaHQiPkBkaW1lbi9tY3YyX2VtYmVkZGVkX2ljb25fc2l6ZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb24iPkBzdHJpbmcvbWN2Ml9wcmV2aW91c19idXR0b25fZGVzYzwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IkVtYmVkZGVkVHJhbnNwb3J0Q29udHJvbHNCdXR0b24uTmV4dCI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c3JjIj5AZHJhd2FibGUvaWNfc2tpcF9uZXh0PC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93aWR0aCI+QGRpbWVuL21jdjJfZW1iZWRkZWRfaWNvbl9zaXplPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9oZWlnaHQiPkBkaW1lbi9tY3YyX2VtYmVkZGVkX2ljb25fc2l6ZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb24iPkBzdHJpbmcvbWN2Ml9uZXh0X2J1dHRvbl9kZXNjPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iRW1iZWRkZWRUcmFuc3BvcnRDb250cm9sc0J1dHRvbi5QYXVzZSI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c3JjIj5AZHJhd2FibGUvaWNfcGF1c2VfY2lyY2xlX2ZpbGxlZDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfd2lkdGgiPkBkaW1lbi9tY3YyX3BhdXNlX2ljb25fc2l6ZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfaGVpZ2h0Ij5AZGltZW4vbWN2Ml9wYXVzZV9pY29uX3NpemU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uIj5Ac3RyaW5nL21jdjJfcGF1c2VfYnV0dG9uX2Rlc2M8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJFbWJlZGRlZFRyYW5zcG9ydENvbnRyb2xzQnV0dG9uLkZmd2QiPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNyYyI+QGRyYXdhYmxlL2ljX2ZvcndhcmRfMzA8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X3dpZHRoIj5AZGltZW4vbWN2Ml9lbWJlZGRlZF9pY29uX3NpemU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X2hlaWdodCI+QGRpbWVuL21jdjJfZW1iZWRkZWRfaWNvbl9zaXplPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmNvbnRlbnREZXNjcmlwdGlvbiI+QHN0cmluZy9tY3YyX2Zmd2RfYnV0dG9uX2Rlc2M8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJFbWJlZGRlZFRyYW5zcG9ydENvbnRyb2xzQnV0dG9uLlJldyI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c3JjIj5AZHJhd2FibGUvaWNfcmV3aW5kXzEwPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93aWR0aCI+QGRpbWVuL21jdjJfZW1iZWRkZWRfaWNvbl9zaXplPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9oZWlnaHQiPkBkaW1lbi9tY3YyX2VtYmVkZGVkX2ljb25fc2l6ZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb24iPkBzdHJpbmcvbWN2Ml9yZXdpbmRfYnV0dG9uX2Rlc2M8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJNaW5pbWFsVHJhbnNwb3J0Q29udHJvbHNCdXR0b24iPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmJhY2tncm91bmQiPkBudWxsPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93aWR0aCI+QGRpbWVuL21jdjJfcGF1c2VfaWNvbl9zaXplPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9oZWlnaHQiPkBkaW1lbi9tY3YyX3BhdXNlX2ljb25fc2l6ZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfbWFyZ2luIj5AZGltZW4vbWN2Ml9pY29uX21hcmdpbjwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzY2FsZVR5cGUiPmZpdFhZPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNyYyI+QGRyYXdhYmxlL2ljX3BhdXNlX2NpcmNsZV9maWxsZWQ8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uIj5Ac3RyaW5nL21jdjJfcGF1c2VfYnV0dG9uX2Rlc2M8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJUaXRsZUJhciI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X3dpZHRoIj5tYXRjaF9wYXJlbnQ8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X2hlaWdodCI+NDZkcDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpwYWRkaW5nU3RhcnQiPjVkcDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpwYWRkaW5nRW5kIj41ZHA8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJUaXRsZUJhckJ1dHRvbiI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6YmFja2dyb3VuZCI+QG51bGw8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X3dpZHRoIj4zNmRwPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9oZWlnaHQiPjM2ZHA8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJUaXRsZUJhckJ1dHRvbi5CYWNrIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzcmMiPkBkcmF3YWJsZS9pY19hcnJvd19iYWNrPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmNvbnRlbnREZXNjcmlwdGlvbiI+QHN0cmluZy9tY3YyX2JhY2tfYnV0dG9uX2Rlc2M8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJUaXRsZUJhckJ1dHRvbi5MYXVuY2giPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNyYyI+QGRyYXdhYmxlL2ljX2xhdW5jaDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb24iPkBzdHJpbmcvbWN2Ml9sYXVuY2hfYnV0dG9uX2Rlc2M8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJUaW1lVGV4dCI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X3dpZHRoIj53cmFwX2NvbnRlbnQ8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X2hlaWdodCI+d3JhcF9jb250ZW50PC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnBhZGRpbmdTdGFydCI+NGRwPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnBhZGRpbmdFbmQiPjRkcDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0U3R5bGUiPmJvbGQ8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dFNpemUiPjE0c3A8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Z3Jhdml0eSI+Y2VudGVyPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iVGltZVRleHQuQ3VycmVudCI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9yIj5AY29sb3Ivd2hpdGU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dCI+QHN0cmluZy9NZWRpYUNvbnRyb2xWaWV3Ml90aW1lX3BsYWNlaG9sZGVyPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iVGltZVRleHQuSW50ZXJwdW5jdCI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9yIj5AY29sb3Ivd2hpdGVfb3BhY2l0eV83MDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Ij7CtzwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IlRpbWVUZXh0LkVuZCI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9yIj5AY29sb3Ivd2hpdGVfb3BhY2l0eV83MDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Ij5Ac3RyaW5nL01lZGlhQ29udHJvbFZpZXcyX3RpbWVfcGxhY2Vob2xkZXI8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJCb3R0b21CYXJCdXR0b24iPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmJhY2tncm91bmQiPkBudWxsPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93aWR0aCI+QGRpbWVuL21jdjJfZW1iZWRkZWRfaWNvbl9zaXplPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9oZWlnaHQiPkBkaW1lbi9tY3YyX2VtYmVkZGVkX2ljb25fc2l6ZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfbWFyZ2luIj5AZGltZW4vbWN2Ml9pY29uX21hcmdpbjwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpncmF2aXR5Ij5jZW50ZXJfaG9yaXpvbnRhbDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzY2FsZVR5cGUiPmZpdFhZPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iQm90dG9tQmFyQnV0dG9uLkNDIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzcmMiPkBkcmF3YWJsZS9pY19zdWJ0aXRsZV9vZmY8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uIj5Ac3RyaW5nL21jdjJfY2NfaXNfb2ZmPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iQm90dG9tQmFyQnV0dG9uLkZ1bGxTY3JlZW4iPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNyYyI+QGRyYXdhYmxlL2ljX2Z1bGxzY3JlZW48L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uIj5Ac3RyaW5nL21jdjJfZnVsbF9zY3JlZW5fYnV0dG9uX2Rlc2M8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJCb3R0b21CYXJCdXR0b24uT3ZlcmZsb3dSaWdodCI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c3JjIj5AZHJhd2FibGUvaWNfY2hldnJvbl9yaWdodDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb24iPkBzdHJpbmcvbWN2Ml9vdmVyZmxvd19yaWdodF9idXR0b25fZGVzYzwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IkJvdHRvbUJhckJ1dHRvbi5PdmVyZmxvd0xlZnQiPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNyYyI+QGRyYXdhYmxlL2ljX2NoZXZyb25fbGVmdDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb24iPkBzdHJpbmcvbWN2Ml9vdmVyZmxvd19sZWZ0X2J1dHRvbl9kZXNjPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iQm90dG9tQmFyQnV0dG9uLlNldHRpbmdzIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzcmMiPkBkcmF3YWJsZS9pY19zZXR0aW5nczwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb24iPkBzdHJpbmcvbWN2Ml9zZXR0aW5nc19idXR0b25fZGVzYzwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IkJvdHRvbUJhckJ1dHRvbi5NdXRlIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzcmMiPkBkcmF3YWJsZS9pY191bm11dGU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uIj5Ac3RyaW5nL21jdjJfdW5tdXRlZF9idXR0b25fZGVzYzwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IkJvdHRvbUJhckJ1dHRvbi5WaWRlb1F1YWxpdHkiPgotICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzcmMiPkBkcmF3YWJsZS9pY19oaWdoX3F1YWxpdHk8L2l0ZW0+Ci0gICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmNvbnRlbnREZXNjcmlwdGlvbiI+QHN0cmluZy9tY3YyX3ZpZGVvX3F1YWxpdHlfYnV0dG9uX2Rlc2M8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJGdWxsTXVzaWNQb3J0cmFpdCI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X2hlaWdodCI+MGRwPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iRnVsbE11c2ljUG9ydHJhaXQuSW1hZ2UiPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93aWR0aCI+bWF0Y2hfcGFyZW50PC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93ZWlnaHQiPjAuNjwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpncmF2aXR5Ij5jZW50ZXI8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJGdWxsTXVzaWNQb3J0cmFpdC5UZXh0Ij4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfd2lkdGgiPm1hdGNoX3BhcmVudDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfd2VpZ2h0Ij4wLjQ8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Z3Jhdml0eSI+dG9wfGNlbnRlcjwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpvcmllbnRhdGlvbiI+dmVydGljYWw8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJGdWxsTXVzaWNMYW5kc2NhcGUiPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93aWR0aCI+MGRwPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iRnVsbE11c2ljTGFuZHNjYXBlLkltYWdlIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfaGVpZ2h0Ij5tYXRjaF9wYXJlbnQ8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X3dlaWdodCI+MC4zNTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpncmF2aXR5Ij5jZW50ZXJ8cmlnaHQ8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJGdWxsTXVzaWNMYW5kc2NhcGUuVGV4dCI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X2hlaWdodCI+bWF0Y2hfcGFyZW50PC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93ZWlnaHQiPjAuNjU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQiPjI0ZHA8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Z3Jhdml0eSI+Y2VudGVyfGxlZnQ8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6b3JpZW50YXRpb24iPnZlcnRpY2FsPC9pdGVtPgotICAgIDwvc3R5bGU+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL3N0eWxlcy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy9zdHlsZXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGU2OTAwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL3N0eWxlcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxyZXNvdXJjZXM+Ci0gICAgPHN0eWxlIG5hbWU9IldpZGdldC5NZWRpYVJvdXRlci5NZWRpYVJvdXRlQnV0dG9uIgotICAgICAgICAgICAgcGFyZW50PSJXaWRnZXQuQXBwQ29tcGF0LkFjdGlvbkJ1dHRvbiI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImV4dGVybmFsUm91dGVFbmFibGVkRHJhd2FibGUiPkBkcmF3YWJsZS9tcl9idXR0b25fZGFyazwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IldpZGdldC5NZWRpYVJvdXRlci5MaWdodC5NZWRpYVJvdXRlQnV0dG9uIgotICAgICAgICAgICAgcGFyZW50PSJXaWRnZXQuQXBwQ29tcGF0LkxpZ2h0LkFjdGlvbkJ1dHRvbiI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImV4dGVybmFsUm91dGVFbmFibGVkRHJhd2FibGUiPkBkcmF3YWJsZS9tcl9idXR0b25fbGlnaHQ8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5NZWRpYVJvdXRlci5UaXRsZSIgcGFyZW50PSJUZXh0QXBwZWFyYW5jZS5BcHBDb21wYXQuVGl0bGUiIC8+Ci0KLSAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuTWVkaWFSb3V0ZXIuUHJpbWFyeVRleHQiIHBhcmVudD0iVGV4dEFwcGVhcmFuY2UuQXBwQ29tcGF0LlN1YmhlYWQiIC8+Ci0KLSAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuTWVkaWFSb3V0ZXIuU2Vjb25kYXJ5VGV4dCIgcGFyZW50PSJUZXh0QXBwZWFyYW5jZS5BcHBDb21wYXQuQm9keTEiIC8+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL3N5bWJvbHMueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMvc3ltYm9scy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlMGU4YzYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMvc3ltYm9scy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLQotLyogQ29weXJpZ2h0IDIwMTcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSoqCi0qKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotKioKLSoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSoqCi0qKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0qKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0qKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0qKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSovCi0tLT4KLTxyZXNvdXJjZXM+Ci0gICAgPCEtLWphdmEtc3ltYm9sIHR5cGU9ImlkIiBuYW1lPSJjYyIgLz4KLSAgICA8amF2YS1zeW1ib2wgdHlwZT0iaWQiIG5hbWU9ImZmd2QiIC8+Ci0gICAgPGphdmEtc3ltYm9sIHR5cGU9ImlkIiBuYW1lPSJtZWRpYWNvbnRyb2xsZXJfcHJvZ3Jlc3MiIC8+Ci0gICAgPGphdmEtc3ltYm9sIHR5cGU9ImlkIiBuYW1lPSJuZXh0IiAvPgotICAgIDxqYXZhLXN5bWJvbCB0eXBlPSJpZCIgbmFtZT0icGF1c2UiIC8+Ci0gICAgPGphdmEtc3ltYm9sIHR5cGU9ImlkIiBuYW1lPSJwcmV2IiAvPgotICAgIDxqYXZhLXN5bWJvbCB0eXBlPSJpZCIgbmFtZT0icmV3IiAvPgotICAgIDxqYXZhLXN5bWJvbCB0eXBlPSJpZCIgbmFtZT0idGltZSIgLz4KLSAgICA8amF2YS1zeW1ib2wgdHlwZT0iaWQiIG5hbWU9InRpbWVfY3VycmVudCIgLy0tPgotPC9yZXNvdXJjZXM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMvdGhlbWVzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL3RoZW1lcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5YTc1NGIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMvdGhlbWVzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHJlc291cmNlcz4KLQotICAgIDxzdHlsZSBuYW1lPSJUaGVtZS5NZWRpYVJvdXRlciIgcGFyZW50PSJhbmRyb2lkOlRoZW1lLk1hdGVyaWFsIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp3aW5kb3dOb1RpdGxlIj50cnVlPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlQnV0dG9uU3R5bGUiPkBzdHlsZS9XaWRnZXQuTWVkaWFSb3V0ZXIuTWVkaWFSb3V0ZUJ1dHRvbjwvaXRlbT4KLQotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlQ2xvc2VEcmF3YWJsZSI+QGRyYXdhYmxlL21yX2RpYWxvZ19jbG9zZV9kYXJrPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlUGxheURyYXdhYmxlIj5AZHJhd2FibGUvbXJfbWVkaWFfcGxheV9kYXJrPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlUGF1c2VEcmF3YWJsZSI+QGRyYXdhYmxlL21yX21lZGlhX3BhdXNlX2Rhcms8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9Im1lZGlhUm91dGVTdG9wRHJhd2FibGUiPkBkcmF3YWJsZS9tcl9tZWRpYV9zdG9wX2Rhcms8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9Im1lZGlhUm91dGVBdWRpb1RyYWNrRHJhd2FibGUiPkBkcmF3YWJsZS9tcl92b2xfdHlwZV9hdWRpb3RyYWNrX2Rhcms8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9Im1lZGlhUm91dGVEZWZhdWx0SWNvbkRyYXdhYmxlIj5AZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Rpc2Nvbm5lY3RlZF9kYXJrPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlVHZJY29uRHJhd2FibGUiPkBkcmF3YWJsZS9pY192b2xfdHlwZV90dl9kYXJrPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlU3BlYWtlckljb25EcmF3YWJsZSI+QGRyYXdhYmxlL2ljX3ZvbF90eXBlX3NwZWFrZXJfZGFyazwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZVNwZWFrZXJHcm91cEljb25EcmF3YWJsZSI+QGRyYXdhYmxlL2ljX3ZvbF90eXBlX3NwZWFrZXJfZ3JvdXBfZGFyazwvaXRlbT4KLQotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlQ29udHJvbFBhbmVsVGhlbWVPdmVybGF5Ij5AbnVsbDwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IlRoZW1lLk1lZGlhUm91dGVyLkxpZ2h0Q29udHJvbFBhbmVsIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZUNvbnRyb2xQYW5lbFRoZW1lT3ZlcmxheSI+QHN0eWxlL1RoZW1lT3ZlcmxheS5NZWRpYVJvdXRlci5MaWdodDwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IlRoZW1lLk1lZGlhUm91dGVyLkxpZ2h0IiBwYXJlbnQ9ImFuZHJvaWQ6VGhlbWUuTWF0ZXJpYWwuTGlnaHQiPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOndpbmRvd05vVGl0bGUiPnRydWU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9Im1lZGlhUm91dGVCdXR0b25TdHlsZSI+QHN0eWxlL1dpZGdldC5NZWRpYVJvdXRlci5MaWdodC5NZWRpYVJvdXRlQnV0dG9uPC9pdGVtPgotCi0gICAgICAgIDxpdGVtIG5hbWU9Im1lZGlhUm91dGVDbG9zZURyYXdhYmxlIj5AZHJhd2FibGUvbXJfZGlhbG9nX2Nsb3NlX2xpZ2h0PC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlUGxheURyYXdhYmxlIj5AZHJhd2FibGUvbXJfbWVkaWFfcGxheV9saWdodDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZVBhdXNlRHJhd2FibGUiPkBkcmF3YWJsZS9tcl9tZWRpYV9wYXVzZV9saWdodDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZVN0b3BEcmF3YWJsZSI+QGRyYXdhYmxlL21yX21lZGlhX3N0b3BfbGlnaHQ8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9Im1lZGlhUm91dGVBdWRpb1RyYWNrRHJhd2FibGUiPkBkcmF3YWJsZS9tcl92b2xfdHlwZV9hdWRpb3RyYWNrX2xpZ2h0PC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlRGVmYXVsdEljb25EcmF3YWJsZSI+QGRyYXdhYmxlL2ljX21yX2J1dHRvbl9ncmV5PC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlVHZJY29uRHJhd2FibGUiPkBkcmF3YWJsZS9pY192b2xfdHlwZV90dl9saWdodDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZVNwZWFrZXJJY29uRHJhd2FibGUiPkBkcmF3YWJsZS9pY192b2xfdHlwZV9zcGVha2VyX2xpZ2h0PC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlU3BlYWtlckdyb3VwSWNvbkRyYXdhYmxlIj5AZHJhd2FibGUvaWNfdm9sX3R5cGVfc3BlYWtlcl9ncm91cF9saWdodDwvaXRlbT4KLQotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlQ29udHJvbFBhbmVsVGhlbWVPdmVybGF5Ij5AbnVsbDwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IlRoZW1lLk1lZGlhUm91dGVyLkxpZ2h0LkRhcmtDb250cm9sUGFuZWwiPgotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlQ29udHJvbFBhbmVsVGhlbWVPdmVybGF5Ij5Ac3R5bGUvVGhlbWVPdmVybGF5Lk1lZGlhUm91dGVyLkRhcms8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJUaGVtZU92ZXJsYXkuTWVkaWFSb3V0ZXIuRGFyayIgcGFyZW50PSJhbmRyb2lkOlRoZW1lLk1hdGVyaWFsIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZVBsYXlEcmF3YWJsZSI+QGRyYXdhYmxlL21yX21lZGlhX3BsYXlfZGFyazwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZVBhdXNlRHJhd2FibGUiPkBkcmF3YWJsZS9tcl9tZWRpYV9wYXVzZV9kYXJrPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlU3RvcERyYXdhYmxlIj5AZHJhd2FibGUvbXJfbWVkaWFfc3RvcF9kYXJrPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlQXVkaW9UcmFja0RyYXdhYmxlIj5AZHJhd2FibGUvbXJfdm9sX3R5cGVfYXVkaW90cmFja19kYXJrPC9pdGVtPgotCi0gICAgPC9zdHlsZT4KLSAgICA8c3R5bGUgbmFtZT0iVGhlbWVPdmVybGF5Lk1lZGlhUm91dGVyLkxpZ2h0IiBwYXJlbnQ9ImFuZHJvaWQ6VGhlbWUuTWF0ZXJpYWwuTGlnaHQiPgotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlUGxheURyYXdhYmxlIj5AZHJhd2FibGUvbXJfbWVkaWFfcGxheV9saWdodDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZVBhdXNlRHJhd2FibGUiPkBkcmF3YWJsZS9tcl9tZWRpYV9wYXVzZV9saWdodDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZVN0b3BEcmF3YWJsZSI+QGRyYXdhYmxlL21yX21lZGlhX3N0b3BfbGlnaHQ8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9Im1lZGlhUm91dGVBdWRpb1RyYWNrRHJhd2FibGUiPkBkcmF3YWJsZS9tcl92b2xfdHlwZV9hdWRpb3RyYWNrX2xpZ2h0PC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3J1bmN0cy5zaCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9ydW5jdHMuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxYjFhMWUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3J1bmN0cy5zaAorKysgL2Rldi9udWxsCkBAIC0xLDIyNCArMCwwIEBACi0jIS9iaW4vYmFzaAotIyBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jIFVzYWdlICcuIHJ1bmN0cy5zaCcKLQotZnVuY3Rpb24gX3J1bnRlc3RfY3RzX21lZGlhY29tcG9uZW50X3VzYWdlKCkgewotICBlY2hvICdydW50ZXN0LWN0cy1NZWRpYUNvbXBvbmVudHMgW29wdGlvbl06IEJ1aWxkLCBmbGFzaCBkZXZpY2UsJwotICBlY2hvICcgICAgICAgICAgICAgIGFuZCBydW4gc3Vic2V0IG9mIEN0c01lZGlhVGVzdENhc2VzIHRoYXQgTWVkaWFDb21wb25lbnRzIGNvdmVycy4nCi0gIGVjaG8gJyAgICAgICAgICAqV2FybmluZyogVGhpcyBieXBhc3NlcyBDVFMgc2V0dXAgKGUuZy4gZG93bmxvYWQgbWVkaWEgY29udGVudHMgZnJvbSBzZXJ2ZXIpJwotICBlY2hvICcgICAgICAgICAgRm9yIHJ1bm5pbmcgQ1RTIGluIG9mZmljaWFsIHdheSwgdXNlIGF0ZXN0IG9yIGN0cy10cmFkZWZlZCAnCi0gIGVjaG8gJyAgICAgLWh8LS1oZWxwOiBUaGlzIGhlbHAnCi0gIGVjaG8gJyAgICAgLS1za2lwOiBTa2lwIGJ1aWxkIGFuZCBmbGFzaC4gSnVzdCByZXJ1bi10ZXN0cycKLSAgZWNobyAnICAgICAtLW1pbjogT25seSByZWJ1aWxkIHRlc3RzIGFuZCB1cGRhdGFibGUgbGlicmFyeS4nCi0gIGVjaG8gJyAgICAgLS10ZXN0OiBPbmx5IHJlYnVpbGQgdGVzdHMnCi0gIGVjaG8gJyAgICAgLXMgW2RldmljZV9pZF06IFNwZWNpZnkgYSBkZXZpY2UgbmFtZSB0byBydW4gdGVzdCBhZ2FpbnN0LicKLSAgZWNobyAnICAgICAgICAgICAgICAgICAgICAgWW91IGNhbiBkZWZpbmUgJHtBREJIT1NUfSBpbnN0ZWFkLicKLSAgZWNobyAnICAgICAtciBbY291bnRdOiBSZXBlYXQgdGVzdHMgZm9yIGdpdmVuIGNvdW50LiBJdCB3aWxsIHN0b3Agd2hlbiBmYWlscy4nCi0gIGVjaG8gJyAgICAgLS1pZ25vcmU6IEtlZXAgcmVwZWF0aW5nIHRlc3RzIGV2ZW4gd2hlbiBpdCBmYWlscy4nCi0gIGVjaG8gJyAgICAgLXQgW3Rlc3RdOiBPbmx5IHJ1biB0aGUgc3BlY2lmaWMgdGVzdC4gQ2FuIGJlIGVpdGhlciBhIGNsYXNzIG9yIGEgbWV0aG9kLicKLX0KLQotZnVuY3Rpb24gcnVudGVzdC1jdHMtTWVkaWFDb21wb25lbnRzKCkgewotICAjIEVkaXQgaGVyZSBpZiB5b3Ugd2FudCB0byBzdXBwb3J0IG90aGVyIHRlc3RzLgotICAjIExpc3QgdXAgbGlicyBhbmQgYXBrcyBpbiB0aGUgbWVkaWFfYXBpIG5lZWRlZCBmb3IgdGVzdHMsIGFuZCBwbGFjZSB0ZXN0IHRhcmdldCBhdCB0aGUgbGFzdC4KLSAgbG9jYWwgVEVTVF9QQUNLQUdFX0RJUj0oImZyYW1ld29ya3MvYXYvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Rlc3QiKQotICBsb2NhbCBURVNUX1BBQ0tBR0U9KCJhbmRyb2lkLm1lZGlhLmN0cyIpCi0gIGxvY2FsIEJVSUxEX1RBUkdFVFM9KCJNZWRpYUNvbXBvbmVudHMiICJDdHNNZWRpYVRlc3RDYXNlcyIpCi0gICMgRG9uJ3QgaW5jbHVkZSBNZWRpYUNvbXBvbmVudHMgLS0gaWYgd2Ugc2ltcGx5IGluc3RhbGwgaXQsIHN5c3RlbSBzZXJ2ZXIKLSAgIyB3b3VsZG4ndCB1c2UgdGhlIGluc3RhbGxlZCBvbmUuCi0gIGxvY2FsIElOU1RBTExfVEFSR0VUUz0oIkN0c01lZGlhVGVzdENhc2VzIikKLSAgbG9jYWwgVEVTVF9SVU5ORVI9ImFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCi0gIGxvY2FsIERFUEVOREVOQ0lFUz0oIm1vY2tpdG8tdGFyZ2V0LW1pbnVzLWp1bml0NCIgImFuZHJvaWQtc3VwcG9ydC10ZXN0IiAiY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbCIpCi0gIGxvY2FsIERFRkFVTFRfVEVTVF9UQVJHRVQ9IiIKLSAgREVGQVVMVF9URVNUX1RBUkdFVCs9ImFuZHJvaWQubWVkaWEuY3RzLk1lZGlhQnJvd3NlcjJUZXN0IgotICBERUZBVUxUX1RFU1RfVEFSR0VUKz0iLGFuZHJvaWQubWVkaWEuY3RzLk1lZGlhQ29udHJvbGxlcjJUZXN0IgotICBERUZBVUxUX1RFU1RfVEFSR0VUKz0iLGFuZHJvaWQubWVkaWEuY3RzLk1lZGlhTWV0YWRhdGEyVGVzdCIKLSAgREVGQVVMVF9URVNUX1RBUkdFVCs9IixhbmRyb2lkLm1lZGlhLmN0cy5NZWRpYVNlc3Npb24yVGVzdCIKLSAgREVGQVVMVF9URVNUX1RBUkdFVCs9IixhbmRyb2lkLm1lZGlhLmN0cy5NZWRpYVNlc3Npb24yX1Blcm1pc3Npb25UZXN0IgotICBERUZBVUxUX1RFU1RfVEFSR0VUKz0iLGFuZHJvaWQubWVkaWEuY3RzLk1lZGlhU2Vzc2lvbk1hbmFnZXJfTWVkaWFTZXNzaW9uMlRlc3QiCi0gIERFRkFVTFRfVEVTVF9UQVJHRVQrPSIsYW5kcm9pZC5tZWRpYS5jdHMuU2Vzc2lvblRva2VuMlRlc3QiCi0gIGlmIFtbIC16ICIke0FORFJPSURfQlVJTERfVE9QfSIgXV07IHRoZW4KLSAgICBlY2hvICJOZWVkcyB0byBsdW5jaCBhIHRhcmdldCBmaXJzdCIKLSAgICByZXR1cm4KLSAgZmkKLQotICBsb2NhbCBvbGRfcGF0aD0ke09MRFBXRH0KLSAgd2hpbGUgdHJ1ZTsgZG8KLSAgICBsb2NhbCBPUFRJT05fU0tJUD0iZmFsc2UiCi0gICAgbG9jYWwgT1BUSU9OX01JTj0iZmFsc2UiCi0gICAgbG9jYWwgT1BUSU9OX1RFU1Q9ImZhbHNlIgotICAgIGxvY2FsIE9QVElPTl9SRVBFQVRfQ09VTlQ9IjEiCi0gICAgbG9jYWwgT1BUSU9OX0lHTk9SRT0iZmFsc2UiCi0gICAgbG9jYWwgT1BUSU9OX1RFU1RfVEFSR0VUPSIke0RFRkFVTFRfVEVTVF9UQVJHRVR9IgotICAgIGxvY2FsIGFkYmhvc3RfbG9jYWwKLSAgICB3aGlsZSAoKCAiJCMiICkpOyBkbwotICAgICAgY2FzZSAiJHsxfSIgaW4KLSAgICAgICAgLWh8LS1oZWxwKQotICAgICAgICAgIF9ydW50ZXN0X2N0c19tZWRpYWNvbXBvbmVudF91c2FnZQotICAgICAgICAgIHJldHVybgotICAgICAgICAgIDs7Ci0gICAgICAgIC0tc2tpcCkKLSAgICAgICAgICBPUFRJT05fU0tJUD0idHJ1ZSIKLSAgICAgICAgICA7OwotICAgICAgICAtLW1pbikKLSAgICAgICAgICBPUFRJT05fTUlOPSJ0cnVlIgotICAgICAgICAgIDs7Ci0gICAgICAgIC0tdGVzdCkKLSAgICAgICAgICBPUFRJT05fVEVTVD0idHJ1ZSIKLSAgICAgICAgICA7OwotICAgICAgICAtcykKLSAgICAgICAgICBzaGlmdAotICAgICAgICAgIGFkYmhvc3RfbG9jYWw9JHsxfQotICAgICAgICAgIDs7Ci0gICAgICAgIC1yKQotICAgICAgICAgIHNoaWZ0Ci0gICAgICAgICAgT1BUSU9OX1JFUEVBVF9DT1VOVD0iJHsxfSIKLSAgICAgICAgICA7OwotICAgICAgICAtLWlnbm9yZSkKLSAgICAgICAgICBPUFRJT05fSUdOT1JFPSJ0cnVlIgotICAgICAgICAgIDs7Ci0gICAgICAgIC10KQotICAgICAgICAgIHNoaWZ0Ci0gICAgICAgICAgT1BUSU9OX1RFU1RfVEFSR0VUPSIkezF9IgotICAgICAgZXNhYwotICAgICAgc2hpZnQKLSAgICBkb25lCi0KLSAgICAjIEJ1aWxkIGFkYiBjb21tYW5kLgotICAgIGxvY2FsIGFkYgotICAgIGlmIFtbIC16ICIke2FkYmhvc3RfbG9jYWx9IiBdXTsgdGhlbgotICAgICAgYWRiaG9zdF9sb2NhbD0ke0FEQkhPU1R9Ci0gICAgZmkKLSAgICBpZiBbWyAteiAiJHthZGJob3N0X2xvY2FsfSIgXV07IHRoZW4KLSAgICAgIGxvY2FsIGRldmljZV9jb3VudD0kKGFkYiBkZXZpY2VzIHwgc2VkICcvXltbOnNwYWNlOl1dKiQvZCcgfCB3YyAtbCkKLSAgICAgIGlmIFtbICIke2RldmljZV9jb3VudH0iICE9ICIyIiBdXTsgdGhlbgotICAgICAgICBlY2hvICJUb28gbWFueSBkZXZpY2VzLiBTcGVjaWZ5IGEgZGV2aWNlLiIgJiYgYnJlYWsKLSAgICAgIGZpCi0gICAgICBhZGI9ImFkYiIKLSAgICBlbHNlCi0gICAgICBhZGI9ImFkYiAtcyAke2FkYmhvc3RfbG9jYWx9IgotICAgIGZpCi0KLSAgICBsb2NhbCB0YXJnZXRfZGlyPSIke0FORFJPSURfQlVJTERfVE9QfS8ke1RFU1RfUEFDS0FHRV9ESVJ9IgotICAgICNsb2NhbCBURVNUX1BBQ0tBR0U9JChzZWQgLW4gJ3MvXi4qXGJwYWNrYWdlXGI9IlwoW2EtejAtOVwuXSpcKSIuKiQvXDEvcCcgJHt0YXJnZXRfZGlyfS9BbmRyb2lkTWFuaWZlc3QueG1sKQotCi0gICAgaWYgW1sgIiR7T1BUSU9OX1NLSVB9IiAhPSAidHJ1ZSIgXV07IHRoZW4KLSAgICAgICMgQnVpbGQgZGVwZW5kZW5jaWVzIGlmIG5lZWRlZC4KLSAgICAgIGxvY2FsIGRlcGVuZGVuY3kKLSAgICAgIGxvY2FsIGJ1aWxkX2RlcGVuZGVuY3k9IiIKLSAgICAgIGZvciBkZXBlbmRlbmN5IGluICR7REVQRU5ERU5DSUVTW0BdfTsgZG8KLSAgICAgICAgaWYgW1sgIiR7ZGVwZW5kZW5jeX0iID09ICJvdXQvIiogXV07IHRoZW4KLSAgICAgICAgICBpZiBbWyAhIC1mICR7QU5EUk9JRF9CVUlMRF9UT1B9LyR7ZGVwZW5kZW5jeX0gXV07IHRoZW4KLSAgICAgICAgICAgIGJ1aWxkX2RlcGVuZGVuY3k9InRydWUiCi0gICAgICAgICAgICBicmVhawotICAgICAgICAgIGZpCi0gICAgICAgIGVsc2UKLSAgICAgICAgICBpZiBbWyAiJChmaW5kICR7T1VUfSAtbmFtZSAke2RlcGVuZGVuY3l9X2ludGVybWVkaWF0ZXMgfCB3YyAtbCkiID09ICIwIiBdXTsgdGhlbgotICAgICAgICAgICAgYnVpbGRfZGVwZW5kZW5jeT0idHJ1ZSIKLSAgICAgICAgICAgIGJyZWFrCi0gICAgICAgICAgZmkKLSAgICAgICAgZmkKLSAgICAgIGRvbmUKLSAgICAgIGlmIFtbICIke2J1aWxkX2RlcGVuZGVuY3l9IiA9PSAidHJ1ZSIgXV07IHRoZW4KLSAgICAgICAgZWNobyAiQnVpbGRpbmcgZGVwZW5kZW5jaWVzLiBXaWxsIG9ubHkgcHJpbnQgc3RkZXJyLiIKLSAgICAgICAgbSAke0RFUEVOREVOQ0lFU1tAXX0gLWogPiAvZGV2L251bGwKLSAgICAgIGZpCi0KLSAgICAgICMgQnVpbGQgdGVzdCBhcGsgYW5kIHJlcXVpcmVkIGFway4KLSAgICAgIGxvY2FsIGJ1aWxkX3RhcmdldHMKLSAgICAgIGlmIFtbICIke09QVElPTl9URVNUfSIgPT0gInRydWUiIF1dOyB0aGVuCi0gICAgICAgIGJ1aWxkX3RhcmdldHM9IiR7SU5TVEFMTF9UQVJHRVRTW0BdfSIKLSAgICAgIGVsaWYgW1sgIiR7T1BUSU9OX01JTn0iID09ICJ0cnVlIiBdXTsgdGhlbgotICAgICAgICBidWlsZF90YXJnZXRzPSIke0JVSUxEX1RBUkdFVFNbQF19IgotICAgICAgZWxzZQotICAgICAgICBidWlsZF90YXJnZXRzPSIke0JVSUxEX1RBUkdFVFNbQF19IGRyb2lkIgotICAgICAgZmkKLSAgICAgIG0gJHtidWlsZF90YXJnZXRzfSAtaiB8fCBicmVhawotCi0gICAgICBpZiBbWyAiJHtPUFRJT05fVEVTVH0iICE9ICJ0cnVlIiBdXTsgdGhlbgotICAgICAgICAjIEZsYXNoIG9ubHkgd2hlbiBuZWVkZWQKLSAgICAgICAgbG9jYWwgZGV2aWNlX2J1aWxkX3R5cGU9IiQoJHthZGJ9IHNoZWxsIGdldHByb3Agcm8uYnVpbGQudHlwZSkiCi0gICAgICAgIGlmIFtbICIke2RldmljZV9idWlsZF90eXBlfSIgPT0gInVzZXIiIF1dOyB0aGVuCi0gICAgICAgICAgIyBVc2VyIGJ1aWxkLiBDYW5ub3QgYWRiIHN5bmMKLSAgICAgICAgICAke2FkYn0gcmVib290IGJvb3Rsb2FkZXIKLSAgICAgICAgICBmYXN0Ym9vdCBmbGFzaGFsbAotICAgICAgICBlbHNlCi0gICAgICAgICAgJHthZGJ9IHJvb3QKLSAgICAgICAgICBsb2NhbCBkZXZpY2VfdmVyaXR5X21vZGU9IiQoJHthZGJ9IHNoZWxsIGdldHByb3Agcm8uYm9vdC52ZXJpdHltb2RlKSIKLSAgICAgICAgICBpZiBbWyAiJHtkZXZpY2VfdmVyaXR5X21vZGV9IiAhPSAiZGlzYWJsZWQiIF1dOyB0aGVuCi0gICAgICAgICAgICAke2FkYn0gZGlzYWJsZS12ZXJpdHkKLSAgICAgICAgICAgICR7YWRifSByZWJvb3QKLSAgICAgICAgICAgICR7YWRifSB3YWl0LWZvci1kZXZpY2UgfHwgYnJlYWsKLSAgICAgICAgICAgICR7YWRifSByb290Ci0gICAgICAgICAgZmkKLSAgICAgICAgICAke2FkYn0gcmVtb3VudAotICAgICAgICAgICR7YWRifSBzaGVsbCBzdG9wCi0gICAgICAgICAgJHthZGJ9IHNoZWxsIHNldHByb3AgbG9nLnRhZy5NZWRpYVNlc3Npb25TZXJ2aWNlIERFQlVHCi0gICAgICAgICAgJHthZGJ9IHN5bmMKLSAgICAgICAgICAke2FkYn0gc2hlbGwgc3RhcnQKLSAgICAgICAgZmkKLSAgICAgICAgJHthZGJ9IHdhaXQtZm9yLWRldmljZSB8fCBicmVhawotICAgICAgICAjIEVuc3VyZSBwYWNrYWdlIG1hbmFnZXIgaXMgbG9hZGVkLgotICAgICAgICAjIFRPRE8oamFld2FuKTogRmluZCBiZXR0ZXIgd2F5IHRvIHdhaXQKLSAgICAgICAgc2xlZXAgMTUKLSAgICAgIGZpCi0KLSAgICAgICMgSW5zdGFsbCBhcGtzCi0gICAgICBsb2NhbCBpbnN0YWxsX2ZhaWxlZD0iZmFsc2UiCi0gICAgICBmb3IgdGFyZ2V0IGluICR7SU5TVEFMTF9UQVJHRVRTW0BdfTsgZG8KLSAgICAgICAgbG9jYWwgYXBrX3BhdGg9JChmaW5kICR7T1VUfS9zeXN0ZW0gJHtPVVR9L2RhdGEgLW5hbWUgJHt0YXJnZXR9LmFwaykKLSAgICAgICAgbG9jYWwgYXBrX251bT0kKGZpbmQgJHtPVVR9L3N5c3RlbSAke09VVH0vZGF0YSAtbmFtZSAke3RhcmdldH0uYXBrIHwgd2MgLWwpCi0gICAgICAgIGlmIFtbICIke2Fwa19udW19IiAhPSAiMSIgXV07IHRoZW4KLSAgICAgICAgICBlY2hvICJDYW5ub3QgbG9jYXRlIGEgJHt0YXJnZXR9LmFway4gRm91bmQgJHthcGtfbnVtfSBhcGtzIiAmJiBicmVhawotICAgICAgICBmaQotICAgICAgICBlY2hvICJJbnN0YWxsaW5nICR7dGFyZ2V0fS5hcGsuIHBhdGg9JHthcGtfcGF0aH0iCi0gICAgICAgICR7YWRifSBpbnN0YWxsIC1yICR7YXBrX3BhdGh9Ci0gICAgICAgIGlmIFtbICIkez99IiAhPSAiMCIgXV07IHRoZW4KLSAgICAgICAgICBpbnN0YWxsX2ZhaWxlZD0idHJ1ZSIKLSAgICAgICAgICBicmVhawotICAgICAgICBmaQotICAgICAgZG9uZQotICAgICAgaWYgW1sgIiR7aW5zdGFsbF9mYWlsZWR9IiA9PSAidHJ1ZSIgXV07IHRoZW4KLSAgICAgICAgZWNobyAiRmFpbGVkIHRvIGluc3RhbGwuIFRlc3Qgd291bGRuJ3QgcnVuLiIKLSAgICAgICAgYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLQotICAgIGxvY2FsIHRlc3RfdGFyZ2V0PSIiCi0gICAgaWYgW1sgLW4gIiR7T1BUSU9OX1RFU1RfVEFSR0VUfSIgXV07IHRoZW4KLSAgICAgIHRlc3RfdGFyZ2V0PSItZSBjbGFzcyAke09QVElPTl9URVNUX1RBUkdFVH0iCi0gICAgZmkKLQotICAgIGxvY2FsIGkKLSAgICBsb2NhbCB0bXBmaWxlPSQodGVtcGZpbGUpCi0gICAgZm9yICgoaT0xOyBpIDw9ICR7T1BUSU9OX1JFUEVBVF9DT1VOVH07IGkrKykpOyBkbwotICAgICAgZWNobyAiUnVuIHRlc3QgJHtpfS8ke09QVElPTl9SRVBFQVRfQ09VTlR9IgotICAgICAgJHthZGJ9IHNoZWxsIGFtIGluc3RydW1lbnQgJHt0ZXN0X3RhcmdldH0gLXcgJHtURVNUX1BBQ0tBR0V9LyR7VEVTVF9SVU5ORVJ9ID4mICR7dG1wZmlsZX0KLSAgICAgIGNhdCAke3RtcGZpbGV9Ci0gICAgICBpZiBbWyAiJHtPUFRJT05fSUdOT1JFfSIgIT0gInRydWUiIF1dOyB0aGVuCi0gICAgICAgIGlmIFtbIC1uICIkKGdyZXAgJHt0bXBmaWxlfSAtZSAnRkFJTFVSRVx8Y3Jhc2hlZCcpIiBdXTsgdGhlbgotICAgICAgICAgICMgYW0gaW5zdHJ1bWVudCBkb2Vzbid0IHJldHVybiBlcnJvciBjb2RlIHNvIG5lZWQgdG8gZ3JlcCByZXN1bHQgbWVzc2FnZSBpbnN0ZWFkCi0gICAgICAgICAgYnJlYWsKLSAgICAgICAgZmkKLSAgICAgIGZpCi0gICAgZG9uZQotICAgIHJtICR7dG1wZmlsZX0KLSAgICBicmVhawotICBkb25lCi19Ci0KLWVjaG8gIkZvbGxvd2luZyBmdW5jdGlvbnMgYXJlIGFkZGVkIHRvIHlvdXIgZW52aXJvbm1lbnQ6IgotX3J1bnRlc3RfY3RzX21lZGlhY29tcG9uZW50X3VzYWdlCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL0lNZWRpYUNvbnRyb2xsZXIyLmFpZGwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL0lNZWRpYUNvbnRyb2xsZXIyLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0ODhiNzAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9JTWVkaWFDb250cm9sbGVyMi5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5tZWRpYTsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5SZXN1bHRSZWNlaXZlcjsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLklNZWRpYVNlc3Npb24yOwotCi0vKioKLSAqIEludGVyZmFjZSBmcm9tIE1lZGlhU2Vzc2lvbjIgdG8gTWVkaWFDb250cm9sbGVyMi4KLSAqIDxwPgotICogS2VlcCB0aGlzIGludGVyZmFjZSBvbmV3YXkuIE90aGVyd2lzZSBhIG1hbGljaW91cyBhcHAgbWF5IGltcGxlbWVudCBmYWtlIHZlcnNpb24gb2YgdGhpcywKLSAqIGFuZCBob2xkcyBjYWxscyBmcm9tIHNlc3Npb24gdG8gbWFrZSBzZXNzaW9uIG93bmVyKHMpIGZyb3plbi4KLSAqLwotLy8gVE9ETyhqYWV3YW4pOiAoUG9zdCBQKSBIYW5kbGUgd2hlbiB0aGUgcGxheWxpc3QgYmVjb21lcyB0b28gaHVnZS4KLS8vICAgICAgICAgICAgICAgTm90ZSB0aGF0IFBhcmNlbGxlZFNsaWNlTGlzdCBpc24ndCBhIGdvb2QgaWRlYSBmb3IgdGhlIHB1cnBvc2UuIChzZWU6IGIvMzc0OTM2NzcpCi1vbmV3YXkgaW50ZXJmYWNlIElNZWRpYUNvbnRyb2xsZXIyIHsKLSAgICB2b2lkIG9uUGxheWVyU3RhdGVDaGFuZ2VkKGludCBzdGF0ZSk7Ci0gICAgdm9pZCBvblBvc2l0aW9uQ2hhbmdlZChsb25nIGV2ZW50VGltZU1zLCBsb25nIHBvc2l0aW9uTXMpOwotICAgIHZvaWQgb25QbGF5YmFja1NwZWVkQ2hhbmdlZChmbG9hdCBzcGVlZCk7Ci0gICAgdm9pZCBvbkJ1ZmZlcmVkUG9zaXRpb25DaGFuZ2VkKGxvbmcgYnVmZmVyZWRQb3NpdGlvbk1zKTsKLSAgICB2b2lkIG9uUGxheWxpc3RDaGFuZ2VkKGluIExpc3Q8QnVuZGxlPiBwbGF5bGlzdCwgaW4gQnVuZGxlIG1ldGFkYXRhKTsKLSAgICB2b2lkIG9uUGxheWxpc3RNZXRhZGF0YUNoYW5nZWQoaW4gQnVuZGxlIG1ldGFkYXRhKTsKLSAgICB2b2lkIG9uUGxheWJhY2tJbmZvQ2hhbmdlZChpbiBCdW5kbGUgcGxheWJhY2tJbmZvKTsKLSAgICB2b2lkIG9uUmVwZWF0TW9kZUNoYW5nZWQoaW50IHJlcGVhdE1vZGUpOwotICAgIHZvaWQgb25TaHVmZmxlTW9kZUNoYW5nZWQoaW50IHNodWZmbGVNb2RlKTsKLSAgICB2b2lkIG9uRXJyb3IoaW50IGVycm9yQ29kZSwgaW4gQnVuZGxlIGV4dHJhcyk7Ci0KLSAgICB2b2lkIG9uQ29ubmVjdGVkKElNZWRpYVNlc3Npb24yIHNlc3Npb25CaW5kZXIsIGluIEJ1bmRsZSBjb21tYW5kR3JvdXAsCi0gICAgICAgICAgICBpbnQgcGxheWVyU3RhdGUsIGxvbmcgcG9zaXRpb25FdmVudFRpbWVNcywgbG9uZyBwb3NpdGlvbk1zLCBmbG9hdCBwbGF5YmFja1NwZWVkLAotICAgICAgICAgICAgbG9uZyBidWZmZXJlZFBvc2l0aW9uTXMsIGluIEJ1bmRsZSBwbGF5YmFja0luZm8sIGludCByZXBlYXRNb2RlLCBpbnQgc2h1ZmZsZU1vZGUsCi0gICAgICAgICAgICBpbiBMaXN0PEJ1bmRsZT4gcGxheWxpc3QsIGluIFBlbmRpbmdJbnRlbnQgc2Vzc2lvbkFjdGl2aXR5KTsKLSAgICB2b2lkIG9uRGlzY29ubmVjdGVkKCk7Ci0KLSAgICB2b2lkIG9uQ3VzdG9tTGF5b3V0Q2hhbmdlZChpbiBMaXN0PEJ1bmRsZT4gY29tbWFuZEJ1dHRvbmxpc3QpOwotICAgIHZvaWQgb25BbGxvd2VkQ29tbWFuZHNDaGFuZ2VkKGluIEJ1bmRsZSBjb21tYW5kcyk7Ci0KLSAgICB2b2lkIG9uQ3VzdG9tQ29tbWFuZChpbiBCdW5kbGUgY29tbWFuZCwgaW4gQnVuZGxlIGFyZ3MsIGluIFJlc3VsdFJlY2VpdmVyIHJlY2VpdmVyKTsKLQotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAvLyBCcm93c2VyIHNlcGNpZmljCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIHZvaWQgb25HZXRMaWJyYXJ5Um9vdERvbmUoaW4gQnVuZGxlIHJvb3RIaW50cywgU3RyaW5nIHJvb3RNZWRpYUlkLCBpbiBCdW5kbGUgcm9vdEV4dHJhKTsKLSAgICB2b2lkIG9uR2V0SXRlbURvbmUoU3RyaW5nIG1lZGlhSWQsIGluIEJ1bmRsZSByZXN1bHQpOwotICAgIHZvaWQgb25DaGlsZHJlbkNoYW5nZWQoU3RyaW5nIHJvb3RNZWRpYUlkLCBpbnQgaXRlbUNvdW50LCBpbiBCdW5kbGUgZXh0cmFzKTsKLSAgICB2b2lkIG9uR2V0Q2hpbGRyZW5Eb25lKFN0cmluZyBwYXJlbnRJZCwgaW50IHBhZ2UsIGludCBwYWdlU2l6ZSwgaW4gTGlzdDxCdW5kbGU+IHJlc3VsdCwKLSAgICAgICAgICAgIGluIEJ1bmRsZSBleHRyYXMpOwotICAgIHZvaWQgb25TZWFyY2hSZXN1bHRDaGFuZ2VkKFN0cmluZyBxdWVyeSwgaW50IGl0ZW1Db3VudCwgaW4gQnVuZGxlIGV4dHJhcyk7Ci0gICAgdm9pZCBvbkdldFNlYXJjaFJlc3VsdERvbmUoU3RyaW5nIHF1ZXJ5LCBpbnQgcGFnZSwgaW50IHBhZ2VTaXplLCBpbiBMaXN0PEJ1bmRsZT4gcmVzdWx0LAotICAgICAgICAgICAgaW4gQnVuZGxlIGV4dHJhcyk7Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL0lNZWRpYVNlc3Npb24yLmFpZGwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL0lNZWRpYVNlc3Npb24yLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2NDQ2N2QuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9JTWVkaWFTZXNzaW9uMi5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5tZWRpYTsKLQotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQub3MuUmVzdWx0UmVjZWl2ZXI7Ci1pbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwotCi1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEuSU1lZGlhQ29udHJvbGxlcjI7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZyb20gTWVkaWFDb250cm9sbGVyMiB0byBNZWRpYVNlc3Npb24yLgotICogPHA+Ci0gKiBLZWVwIHRoaXMgaW50ZXJmYWNlIG9uZXdheS4gT3RoZXJ3aXNlIGEgbWFsaWNpb3VzIGFwcCBtYXkgaW1wbGVtZW50IGZha2UgdmVyc2lvbiBvZiB0aGlzLAotICogYW5kIGhvbGRzIGNhbGxzIGZyb20gc2Vzc2lvbiB0byBtYWtlIHNlc3Npb24gb3duZXIocykgZnJvemVuLgotICovCi0gLy8gVE9ETyhqYWV3YW4pOiAoUG9zdCBQKSBIYW5kbGUgd2hlbiB0aGUgcGxheWxpc3QgYmVjb21lcyB0b28gaHVnZS4KLSAvLyAgICAgICAgICAgICAgIE5vdGUgdGhhdCBQYXJjZWxsZWRTbGljZUxpc3QgaXNuJ3QgYSBnb29kIGlkZWEgZm9yIHRoZSBwdXJwb3NlLiAoc2VlOiBiLzM3NDkzNjc3KQotb25ld2F5IGludGVyZmFjZSBJTWVkaWFTZXNzaW9uMiB7Ci0gICAgLy8gVE9ETyhqYWV3YW4pOiBhZGQgb25Db21tYW5kKCkgdG8gc2VuZCBwcml2YXRlIGNvbW1hbmQKLQotICAgIC8vIFRPRE8oamFld2FuKTogKFBvc3QgUCkgV2UgbWF5IGNvbnNpZGVyIHRvIGFkZCBhbm90aGVyIGJpbmRlciBqdXN0IGZvciB0aGUgY29ubmVjdGlvbgotICAgIC8vICAgICAgICAgICAgICAgbm90IHRvIGV4cG9zZSBvdGhlciBtZXRob2RzIHRvIHRoZSBjb250cm9sbGVyIHdob3NlIGNvbm5lY3Rpb24gd2Fzbid0IGFjY2VwdGVkLgotICAgIC8vICAgICAgICAgICAgICAgQnV0IHRoaXMgd291bGQgYmUgZW5vdWdoIGZvciBub3cgYmVjYXVzZSBpdCdzIHRoZSBzYW1lIGFzIGV4aXN0aW5nCi0gICAgLy8gICAgICAgICAgICAgICBNZWRpYUJyb3dzZXIgYW5kIE1lZGlhQnJvd3NlclNlcnZpY2UuCi0gICAgdm9pZCBjb25uZWN0KElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgU3RyaW5nIGNhbGxpbmdQYWNrYWdlKTsKLSAgICB2b2lkIHJlbGVhc2UoSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyKTsKLQotICAgIHZvaWQgc2V0Vm9sdW1lVG8oSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBpbnQgdmFsdWUsIGludCBmbGFncyk7Ci0gICAgdm9pZCBhZGp1c3RWb2x1bWUoSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBpbnQgZGlyZWN0aW9uLCBpbnQgZmxhZ3MpOwotCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIC8vIHNlbmQgY29tbWFuZAotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICB2b2lkIHNlbmRUcmFuc3BvcnRDb250cm9sQ29tbWFuZChJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsCi0gICAgICAgICAgICBpbnQgY29tbWFuZENvZGUsIGluIEJ1bmRsZSBhcmdzKTsKLSAgICB2b2lkIHNlbmRDdXN0b21Db21tYW5kKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgaW4gQnVuZGxlIGNvbW1hbmQsIGluIEJ1bmRsZSBhcmdzLAotICAgICAgICAgICAgaW4gUmVzdWx0UmVjZWl2ZXIgcmVjZWl2ZXIpOwotCi0gICAgdm9pZCBwcmVwYXJlRnJvbVVyaShJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGluIFVyaSB1cmksIGluIEJ1bmRsZSBleHRyYXMpOwotICAgIHZvaWQgcHJlcGFyZUZyb21TZWFyY2goSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBTdHJpbmcgcXVlcnksIGluIEJ1bmRsZSBleHRyYXMpOwotICAgIHZvaWQgcHJlcGFyZUZyb21NZWRpYUlkKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgU3RyaW5nIG1lZGlhSWQsIGluIEJ1bmRsZSBleHRyYXMpOwotICAgIHZvaWQgcGxheUZyb21VcmkoSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBpbiBVcmkgdXJpLCBpbiBCdW5kbGUgZXh0cmFzKTsKLSAgICB2b2lkIHBsYXlGcm9tU2VhcmNoKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgU3RyaW5nIHF1ZXJ5LCBpbiBCdW5kbGUgZXh0cmFzKTsKLSAgICB2b2lkIHBsYXlGcm9tTWVkaWFJZChJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIFN0cmluZyBtZWRpYUlkLCBpbiBCdW5kbGUgZXh0cmFzKTsKLSAgICB2b2lkIHNldFJhdGluZyhJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIFN0cmluZyBtZWRpYUlkLCBpbiBCdW5kbGUgcmF0aW5nKTsKLQotICAgIHZvaWQgc2V0UGxheWxpc3QoSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBpbiBMaXN0PEJ1bmRsZT4gcGxheWxpc3QsIGluIEJ1bmRsZSBtZXRhZGF0YSk7Ci0gICAgdm9pZCB1cGRhdGVQbGF5bGlzdE1ldGFkYXRhKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgaW4gQnVuZGxlIG1ldGFkYXRhKTsKLSAgICB2b2lkIGFkZFBsYXlsaXN0SXRlbShJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGludCBpbmRleCwgaW4gQnVuZGxlIG1lZGlhSXRlbSk7Ci0gICAgdm9pZCByZW1vdmVQbGF5bGlzdEl0ZW0oSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBpbiBCdW5kbGUgbWVkaWFJdGVtKTsKLSAgICB2b2lkIHJlcGxhY2VQbGF5bGlzdEl0ZW0oSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBpbnQgaW5kZXgsIGluIEJ1bmRsZSBtZWRpYUl0ZW0pOwotICAgIHZvaWQgc2tpcFRvUGxheWxpc3RJdGVtKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgaW4gQnVuZGxlIG1lZGlhSXRlbSk7Ci0gICAgdm9pZCBza2lwVG9QcmV2aW91c0l0ZW0oSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyKTsKLSAgICB2b2lkIHNraXBUb05leHRJdGVtKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlcik7Ci0gICAgdm9pZCBzZXRSZXBlYXRNb2RlKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgaW50IHJlcGVhdE1vZGUpOwotICAgIHZvaWQgc2V0U2h1ZmZsZU1vZGUoSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBpbnQgc2h1ZmZsZU1vZGUpOwotCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIC8vIGxpYnJhcnkgc2VydmljZSBzcGVjaWZpYwotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICB2b2lkIGdldExpYnJhcnlSb290KElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgaW4gQnVuZGxlIHJvb3RIaW50cyk7Ci0gICAgdm9pZCBnZXRJdGVtKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgU3RyaW5nIG1lZGlhSWQpOwotICAgIHZvaWQgZ2V0Q2hpbGRyZW4oSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBTdHJpbmcgcGFyZW50SWQsIGludCBwYWdlLCBpbnQgcGFnZVNpemUsCi0gICAgICAgICAgICBpbiBCdW5kbGUgZXh0cmFzKTsKLSAgICB2b2lkIHNlYXJjaChJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIFN0cmluZyBxdWVyeSwgaW4gQnVuZGxlIGV4dHJhcyk7Ci0gICAgdm9pZCBnZXRTZWFyY2hSZXN1bHQoSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBTdHJpbmcgcXVlcnksIGludCBwYWdlLCBpbnQgcGFnZVNpemUsCi0gICAgICAgICAgICBpbiBCdW5kbGUgZXh0cmFzKTsKLSAgICB2b2lkIHN1YnNjcmliZShJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIFN0cmluZyBwYXJlbnRJZCwgaW4gQnVuZGxlIGV4dHJhcyk7Ci0gICAgdm9pZCB1bnN1YnNjcmliZShJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIFN0cmluZyBwYXJlbnRJZCk7Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhQnJvd3NlcjJJbXBsLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhQnJvd3NlcjJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5MDkwOTkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYUJyb3dzZXIySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQubWVkaWE7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhQnJvd3NlcjI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUJyb3dzZXIyLkJyb3dzZXJDYWxsYmFjazsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhQ29udHJvbGxlcjI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUl0ZW0yOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuU2Vzc2lvblRva2VuMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5NZWRpYUJyb3dzZXIyUHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3I7Ci0KLXB1YmxpYyBjbGFzcyBNZWRpYUJyb3dzZXIySW1wbCBleHRlbmRzIE1lZGlhQ29udHJvbGxlcjJJbXBsIGltcGxlbWVudHMgTWVkaWFCcm93c2VyMlByb3ZpZGVyIHsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBUQUcgPSAiTWVkaWFCcm93c2VyMiI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIERFQlVHID0gdHJ1ZTsgLy8gVE9ETyhqYWV3YW4pOiBjaGFuZ2UuCi0KLSAgICBwcml2YXRlIGZpbmFsIE1lZGlhQnJvd3NlcjIgbUluc3RhbmNlOwotICAgIHByaXZhdGUgZmluYWwgTWVkaWFCcm93c2VyMi5Ccm93c2VyQ2FsbGJhY2sgbUNhbGxiYWNrOwotCi0gICAgcHVibGljIE1lZGlhQnJvd3NlcjJJbXBsKENvbnRleHQgY29udGV4dCwgTWVkaWFCcm93c2VyMiBpbnN0YW5jZSwgU2Vzc2lvblRva2VuMiB0b2tlbiwKLSAgICAgICAgICAgIEV4ZWN1dG9yIGV4ZWN1dG9yLCBCcm93c2VyQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgc3VwZXIoY29udGV4dCwgaW5zdGFuY2UsIHRva2VuLCBleGVjdXRvciwgY2FsbGJhY2spOwotICAgICAgICBtSW5zdGFuY2UgPSBpbnN0YW5jZTsKLSAgICAgICAgbUNhbGxiYWNrID0gY2FsbGJhY2s7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlIE1lZGlhQnJvd3NlcjIgZ2V0SW5zdGFuY2UoKSB7Ci0gICAgICAgIHJldHVybiAoTWVkaWFCcm93c2VyMikgc3VwZXIuZ2V0SW5zdGFuY2UoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBnZXRMaWJyYXJ5Um9vdF9pbXBsKEJ1bmRsZSByb290SGludHMpIHsKLSAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gZ2V0U2Vzc2lvbkJpbmRlcigpOwotICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYmluZGVyLmdldExpYnJhcnlSb290KGdldENvbnRyb2xsZXJTdHViKCksIHJvb3RIaW50cyk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogSGFuZGxlIGRpc2Nvbm5lY3QuCi0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBjb25uZWN0IHRvIHRoZSBzZXJ2aWNlIG9yIHRoZSBzZXNzaW9uIGlzIGdvbmUiLCBlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJTZXNzaW9uIGlzbid0IGFjdGl2ZSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzdWJzY3JpYmVfaW1wbChTdHJpbmcgcGFyZW50SWQsIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgaWYgKHBhcmVudElkID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInBhcmVudElkIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBnZXRTZXNzaW9uQmluZGVyKCk7Ci0gICAgICAgIGlmIChiaW5kZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBiaW5kZXIuc3Vic2NyaWJlKGdldENvbnRyb2xsZXJTdHViKCksIHBhcmVudElkLCBleHRyYXMpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IEhhbmRsZSBkaXNjb25uZWN0LgotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgY29ubmVjdCB0byB0aGUgc2VydmljZSBvciB0aGUgc2Vzc2lvbiBpcyBnb25lIiwgZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBpc24ndCBhY3RpdmUiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgdW5zdWJzY3JpYmVfaW1wbChTdHJpbmcgcGFyZW50SWQpIHsKLSAgICAgICAgaWYgKHBhcmVudElkID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInBhcmVudElkIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBnZXRTZXNzaW9uQmluZGVyKCk7Ci0gICAgICAgIGlmIChiaW5kZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBiaW5kZXIudW5zdWJzY3JpYmUoZ2V0Q29udHJvbGxlclN0dWIoKSwgcGFyZW50SWQpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IEhhbmRsZSBkaXNjb25uZWN0LgotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgY29ubmVjdCB0byB0aGUgc2VydmljZSBvciB0aGUgc2Vzc2lvbiBpcyBnb25lIiwgZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBpc24ndCBhY3RpdmUiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZ2V0SXRlbV9pbXBsKFN0cmluZyBtZWRpYUlkKSB7Ci0gICAgICAgIGlmIChtZWRpYUlkID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm1lZGlhSWQgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IGdldFNlc3Npb25CaW5kZXIoKTsKLSAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJpbmRlci5nZXRJdGVtKGdldENvbnRyb2xsZXJTdHViKCksIG1lZGlhSWQpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IEhhbmRsZSBkaXNjb25uZWN0LgotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgY29ubmVjdCB0byB0aGUgc2VydmljZSBvciB0aGUgc2Vzc2lvbiBpcyBnb25lIiwgZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBpc24ndCBhY3RpdmUiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZ2V0Q2hpbGRyZW5faW1wbChTdHJpbmcgcGFyZW50SWQsIGludCBwYWdlLCBpbnQgcGFnZVNpemUsIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgaWYgKHBhcmVudElkID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInBhcmVudElkIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBhZ2UgPCAxIHx8IHBhZ2VTaXplIDwgMSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTmVpdGhlciBwYWdlIG5vciBwYWdlU2l6ZSBzaG91bGQgYmUgbGVzcyB0aGFuIDEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IGdldFNlc3Npb25CaW5kZXIoKTsKLSAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJpbmRlci5nZXRDaGlsZHJlbihnZXRDb250cm9sbGVyU3R1YigpLCBwYXJlbnRJZCwgcGFnZSwgcGFnZVNpemUsIGV4dHJhcyk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogSGFuZGxlIGRpc2Nvbm5lY3QuCi0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBjb25uZWN0IHRvIHRoZSBzZXJ2aWNlIG9yIHRoZSBzZXNzaW9uIGlzIGdvbmUiLCBlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJTZXNzaW9uIGlzbid0IGFjdGl2ZSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZWFyY2hfaW1wbChTdHJpbmcgcXVlcnksIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHF1ZXJ5KSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicXVlcnkgc2hvdWxkbid0IGJlIGVtcHR5Iik7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gZ2V0U2Vzc2lvbkJpbmRlcigpOwotICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYmluZGVyLnNlYXJjaChnZXRDb250cm9sbGVyU3R1YigpLCBxdWVyeSwgZXh0cmFzKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBIYW5kbGUgZGlzY29ubmVjdC4KLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIlNlc3Npb24gaXNuJ3QgYWN0aXZlIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGdldFNlYXJjaFJlc3VsdF9pbXBsKFN0cmluZyBxdWVyeSwgaW50IHBhZ2UsIGludCBwYWdlU2l6ZSwgQnVuZGxlIGV4dHJhcykgewotICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkocXVlcnkpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJxdWVyeSBzaG91bGRuJ3QgYmUgZW1wdHkiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocGFnZSA8IDEgfHwgcGFnZVNpemUgPCAxKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJOZWl0aGVyIHBhZ2Ugbm9yIHBhZ2VTaXplIHNob3VsZCBiZSBsZXNzIHRoYW4gMSIpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IGdldFNlc3Npb25CaW5kZXIoKTsKLSAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJpbmRlci5nZXRTZWFyY2hSZXN1bHQoZ2V0Q29udHJvbGxlclN0dWIoKSwgcXVlcnksIHBhZ2UsIHBhZ2VTaXplLCBleHRyYXMpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IEhhbmRsZSBkaXNjb25uZWN0LgotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgY29ubmVjdCB0byB0aGUgc2VydmljZSBvciB0aGUgc2Vzc2lvbiBpcyBnb25lIiwgZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBpc24ndCBhY3RpdmUiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgb25HZXRMaWJyYXJ5Um9vdERvbmUoCi0gICAgICAgICAgICBmaW5hbCBCdW5kbGUgcm9vdEhpbnRzLCBmaW5hbCBTdHJpbmcgcm9vdE1lZGlhSWQsIGZpbmFsIEJ1bmRsZSByb290RXh0cmEpIHsKLSAgICAgICAgZ2V0Q2FsbGJhY2tFeGVjdXRvcigpLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgbUNhbGxiYWNrLm9uR2V0TGlicmFyeVJvb3REb25lKGdldEluc3RhbmNlKCksIHJvb3RIaW50cywgcm9vdE1lZGlhSWQsIHJvb3RFeHRyYSk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG9uR2V0SXRlbURvbmUoU3RyaW5nIG1lZGlhSWQsIE1lZGlhSXRlbTIgaXRlbSkgewotICAgICAgICBnZXRDYWxsYmFja0V4ZWN1dG9yKCkuZXhlY3V0ZSgoKSAtPiB7Ci0gICAgICAgICAgICBtQ2FsbGJhY2sub25HZXRJdGVtRG9uZShnZXRJbnN0YW5jZSgpLCBtZWRpYUlkLCBpdGVtKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgb25HZXRDaGlsZHJlbkRvbmUoU3RyaW5nIHBhcmVudElkLCBpbnQgcGFnZSwgaW50IHBhZ2VTaXplLCBMaXN0PE1lZGlhSXRlbTI+IHJlc3VsdCwKLSAgICAgICAgICAgIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgZ2V0Q2FsbGJhY2tFeGVjdXRvcigpLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgbUNhbGxiYWNrLm9uR2V0Q2hpbGRyZW5Eb25lKGdldEluc3RhbmNlKCksIHBhcmVudElkLCBwYWdlLCBwYWdlU2l6ZSwgcmVzdWx0LCBleHRyYXMpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBvblNlYXJjaFJlc3VsdENoYW5nZWQoU3RyaW5nIHF1ZXJ5LCBpbnQgaXRlbUNvdW50LCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIGdldENhbGxiYWNrRXhlY3V0b3IoKS5leGVjdXRlKCgpIC0+IHsKLSAgICAgICAgICAgIG1DYWxsYmFjay5vblNlYXJjaFJlc3VsdENoYW5nZWQoZ2V0SW5zdGFuY2UoKSwgcXVlcnksIGl0ZW1Db3VudCwgZXh0cmFzKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgb25HZXRTZWFyY2hSZXN1bHREb25lKFN0cmluZyBxdWVyeSwgaW50IHBhZ2UsIGludCBwYWdlU2l6ZSwgTGlzdDxNZWRpYUl0ZW0yPiByZXN1bHQsCi0gICAgICAgICAgICBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIGdldENhbGxiYWNrRXhlY3V0b3IoKS5leGVjdXRlKCgpIC0+IHsKLSAgICAgICAgICAgIG1DYWxsYmFjay5vbkdldFNlYXJjaFJlc3VsdERvbmUoZ2V0SW5zdGFuY2UoKSwgcXVlcnksIHBhZ2UsIHBhZ2VTaXplLCByZXN1bHQsIGV4dHJhcyk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG9uQ2hpbGRyZW5DaGFuZ2VkKGZpbmFsIFN0cmluZyBwYXJlbnRJZCwgaW50IGl0ZW1Db3VudCwgZmluYWwgQnVuZGxlIGV4dHJhcykgewotICAgICAgICBnZXRDYWxsYmFja0V4ZWN1dG9yKCkuZXhlY3V0ZSgoKSAtPiB7Ci0gICAgICAgICAgICBtQ2FsbGJhY2sub25DaGlsZHJlbkNoYW5nZWQoZ2V0SW5zdGFuY2UoKSwgcGFyZW50SWQsIGl0ZW1Db3VudCwgZXh0cmFzKTsKLSAgICAgICAgfSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYUNvbnRyb2xsZXIySW1wbC5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYUNvbnRyb2xsZXIySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDkzNjVhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFDb250cm9sbGVyMkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNDMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5tZWRpYTsKLQotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfU0VUX1ZPTFVNRTsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5TZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlMSVNUX0FERF9JVEVNOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfUExBWUxJU1RfUkVNT1ZFX0lURU07Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZTElTVF9SRVBMQUNFX0lURU07Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZTElTVF9TRVRfTElTVDsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5TZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlMSVNUX1NFVF9MSVNUX01FVEFEQVRBOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfUExBWUxJU1RfU0VUX1JFUEVBVF9NT0RFOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfUExBWUxJU1RfU0VUX1NIVUZGTEVfTU9ERTsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5TZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1NFU1NJT05fUExBWV9GUk9NX01FRElBX0lEOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfU0VTU0lPTl9QTEFZX0ZST01fU0VBUkNIOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfU0VTU0lPTl9QTEFZX0ZST01fVVJJOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfU0VTU0lPTl9QUkVQQVJFX0ZST01fTUVESUFfSUQ7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9TRVNTSU9OX1BSRVBBUkVfRlJPTV9TRUFSQ0g7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9TRVNTSU9OX1BSRVBBUkVfRlJPTV9VUkk7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LlNlcnZpY2VDb25uZWN0aW9uOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9BdHRyaWJ1dGVzOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFDb250cm9sbGVyMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhQ29udHJvbGxlcjIuQ29udHJvbGxlckNhbGxiYWNrOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFDb250cm9sbGVyMi5QbGF5YmFja0luZm87Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUl0ZW0yOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFNZXRhZGF0YTI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXlsaXN0QWdlbnQuUmVwZWF0TW9kZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWxpc3RBZ2VudC5TaHVmZmxlTW9kZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvbjIuQ29tbWFuZEJ1dHRvbjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kR3JvdXAyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uU2VydmljZTI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5SYXRpbmcyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuU2Vzc2lvblRva2VuMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5NZWRpYUNvbnRyb2xsZXIyUHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKLWltcG9ydCBhbmRyb2lkLm9zLlByb2Nlc3M7Ci1pbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC5vcy5SZXN1bHRSZWNlaXZlcjsKLWltcG9ydCBhbmRyb2lkLm9zLlVzZXJIYW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uR3VhcmRlZEJ5OwotaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3I7Ci0KLXB1YmxpYyBjbGFzcyBNZWRpYUNvbnRyb2xsZXIySW1wbCBpbXBsZW1lbnRzIE1lZGlhQ29udHJvbGxlcjJQcm92aWRlciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNZWRpYUNvbnRyb2xsZXIyIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gdHJ1ZTsgLy8gVE9ETyhqYWV3YW4pOiBDaGFuZ2UKLQotICAgIHByaXZhdGUgZmluYWwgTWVkaWFDb250cm9sbGVyMiBtSW5zdGFuY2U7Ci0gICAgcHJpdmF0ZSBmaW5hbCBDb250ZXh0IG1Db250ZXh0OwotICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IG1Mb2NrID0gbmV3IE9iamVjdCgpOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBNZWRpYUNvbnRyb2xsZXIyU3R1YiBtQ29udHJvbGxlclN0dWI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTZXNzaW9uVG9rZW4yIG1Ub2tlbjsKLSAgICBwcml2YXRlIGZpbmFsIENvbnRyb2xsZXJDYWxsYmFjayBtQ2FsbGJhY2s7Ci0gICAgcHJpdmF0ZSBmaW5hbCBFeGVjdXRvciBtQ2FsbGJhY2tFeGVjdXRvcjsKLSAgICBwcml2YXRlIGZpbmFsIElCaW5kZXIuRGVhdGhSZWNpcGllbnQgbURlYXRoUmVjaXBpZW50OwotCi0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgU2Vzc2lvblNlcnZpY2VDb25uZWN0aW9uIG1TZXJ2aWNlQ29ubmVjdGlvbjsKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBib29sZWFuIG1Jc1JlbGVhc2VkOwotICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKLSAgICBwcml2YXRlIExpc3Q8TWVkaWFJdGVtMj4gbVBsYXlsaXN0OwotICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKLSAgICBwcml2YXRlIE1lZGlhTWV0YWRhdGEyIG1QbGF5bGlzdE1ldGFkYXRhOwotICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKLSAgICBwcml2YXRlIEBSZXBlYXRNb2RlIGludCBtUmVwZWF0TW9kZTsKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBAU2h1ZmZsZU1vZGUgaW50IG1TaHVmZmxlTW9kZTsKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBpbnQgbVBsYXllclN0YXRlOwotICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKLSAgICBwcml2YXRlIGxvbmcgbVBvc2l0aW9uRXZlbnRUaW1lTXM7Ci0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgbG9uZyBtUG9zaXRpb25NczsKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBmbG9hdCBtUGxheWJhY2tTcGVlZDsKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBsb25nIG1CdWZmZXJlZFBvc2l0aW9uTXM7Ci0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgUGxheWJhY2tJbmZvIG1QbGF5YmFja0luZm87Ci0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgUGVuZGluZ0ludGVudCBtU2Vzc2lvbkFjdGl2aXR5OwotICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKLSAgICBwcml2YXRlIFNlc3Npb25Db21tYW5kR3JvdXAyIG1BbGxvd2VkQ29tbWFuZHM7Ci0KLSAgICAvLyBBc3NpZ25tZW50IHNob3VsZCBiZSB1c2VkIHdpdGggdGhlIGxvY2sgaG9sZCwgYnV0IHNob3VsZCBiZSB1c2VkIHdpdGhvdXQgYSBsb2NrIHRvIHByZXZlbnQKLSAgICAvLyBwb3RlbnRpYWwgZGVhZGxvY2suCi0gICAgLy8gUG9zdGZpeCAtQmluZGVyIGlzIGFkZGVkIHRvIGV4cGxpY2l0bHkgc2hvdyB0aGF0IGl0J3MgcG90ZW50aWFsbHkgcmVtb3RlIHByb2Nlc3MgY2FsbC4KLSAgICAvLyBUZWNobmljYWxseSAtSW50ZXJmYWNlIGlzIG1vcmUgY29ycmVjdCwgYnV0IGl0IG1heSBtaXNyZWFkIHRoYXQgaXQncyBpbnRlcmZhY2UgKHZzIGNsYXNzKQotICAgIC8vIHNvIGxldCdzIGtlZXAgdGhpcyBwb3N0Zml4IHVudGlsIHdlIGZpbmQgYmV0dGVyIHBvc3RmaXguCi0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgdm9sYXRpbGUgSU1lZGlhU2Vzc2lvbjIgbVNlc3Npb25CaW5kZXI7Ci0KLSAgICAvLyBUT0RPKGphZXdhbik6IFJlcXVpcmUgc2Vzc2lvbiBhY3RpdmVuZXNzIGNoYW5nZWQgbGlzdGVuZXIsIGJlY2F1c2UgY29udHJvbGxlciBjYW4gYmUKLSAgICAvLyAgICAgICAgICAgICAgIGF2YWlsYWJsZSB3aGVuIHRoZSBzZXNzaW9uJ3MgcGxheWVyIGlzIG51bGwuCi0gICAgcHVibGljIE1lZGlhQ29udHJvbGxlcjJJbXBsKENvbnRleHQgY29udGV4dCwgTWVkaWFDb250cm9sbGVyMiBpbnN0YW5jZSwgU2Vzc2lvblRva2VuMiB0b2tlbiwKLSAgICAgICAgICAgIEV4ZWN1dG9yIGV4ZWN1dG9yLCBDb250cm9sbGVyQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgbUluc3RhbmNlID0gaW5zdGFuY2U7Ci0gICAgICAgIGlmIChjb250ZXh0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNvbnRleHQgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAodG9rZW4gPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidG9rZW4gc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoY2FsbGJhY2sgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY2FsbGJhY2sgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZXhlY3V0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZXhlY3V0b3Igc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7Ci0gICAgICAgIG1Db250cm9sbGVyU3R1YiA9IG5ldyBNZWRpYUNvbnRyb2xsZXIyU3R1Yih0aGlzKTsKLSAgICAgICAgbVRva2VuID0gdG9rZW47Ci0gICAgICAgIG1DYWxsYmFjayA9IGNhbGxiYWNrOwotICAgICAgICBtQ2FsbGJhY2tFeGVjdXRvciA9IGV4ZWN1dG9yOwotICAgICAgICBtRGVhdGhSZWNpcGllbnQgPSAoKSAtPiB7Ci0gICAgICAgICAgICBtSW5zdGFuY2UuY2xvc2UoKTsKLSAgICAgICAgfTsKLQotICAgICAgICBtU2Vzc2lvbkJpbmRlciA9IG51bGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLSAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBNb3JlIHNhbml0eSBjaGVja3MuCi0gICAgICAgIGlmIChtVG9rZW4uZ2V0VHlwZSgpID09IFNlc3Npb25Ub2tlbjIuVFlQRV9TRVNTSU9OKSB7Ci0gICAgICAgICAgICAvLyBTZXNzaW9uCi0gICAgICAgICAgICBtU2VydmljZUNvbm5lY3Rpb24gPSBudWxsOwotICAgICAgICAgICAgY29ubmVjdFRvU2Vzc2lvbihTZXNzaW9uVG9rZW4ySW1wbC5mcm9tKG1Ub2tlbikuZ2V0U2Vzc2lvbkJpbmRlcigpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIFNlc3Npb24gc2VydmljZQotICAgICAgICAgICAgaWYgKFByb2Nlc3MubXlVaWQoKSA9PSBQcm9jZXNzLlNZU1RFTV9VSUQpIHsKLSAgICAgICAgICAgICAgICAvLyBJdCdzIHN5c3RlbSBzZXJ2ZXIgKE1lZGlhU2Vzc2lvblNlcnZpY2UpIHRoYXQgd2FudHMgdG8gbW9uaXRvciBzZXNzaW9uLgotICAgICAgICAgICAgICAgIC8vIERvbid0IGJpbmQgaWYgYWJsZS4uCi0gICAgICAgICAgICAgICAgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gU2Vzc2lvblRva2VuMkltcGwuZnJvbShtVG9rZW4pLmdldFNlc3Npb25CaW5kZXIoKTsKLSAgICAgICAgICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVXNlIGJpbmRlciBpbiB0aGUgc2Vzc2lvbiB0b2tlbiBpbnN0ZWFkIG9mIGJpbmQgYnkgaXRzIG93bi4KLSAgICAgICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlIHNlcnZlciB3aWxsIGhvbGRzIHRoZSBiaW5kaW5nIHRvIHRoZSBzZXJ2aWNlICpmb3JldmVyKiBhbmQgc2VydmljZQotICAgICAgICAgICAgICAgICAgICAvLyB3aWxsIG5ldmVyIHN0b3AuCi0gICAgICAgICAgICAgICAgICAgIG1TZXJ2aWNlQ29ubmVjdGlvbiA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGNvbm5lY3RUb1Nlc3Npb24oU2Vzc2lvblRva2VuMkltcGwuZnJvbShtVG9rZW4pLmdldFNlc3Npb25CaW5kZXIoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFNob3VsZCBoYXBwZW4gb25seSB3aGVuIHN5c3RlbSBzZXJ2ZXIgd2FudHMgdG8gZGlzcGF0Y2ggbWVkaWEga2V5IGV2ZW50cyB0bwotICAgICAgICAgICAgICAgICAgICAvLyBhIGRlYWQgc2VydmljZS4KLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiU3lzdGVtIHNlcnZlciBiaW5kcyB0byBhIHNlc3Npb24gc2VydmljZS4gU2hvdWxkIHVuYmluZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIHVzZS4iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtU2VydmljZUNvbm5lY3Rpb24gPSBuZXcgU2Vzc2lvblNlcnZpY2VDb25uZWN0aW9uKCk7Ci0gICAgICAgICAgICBjb25uZWN0VG9TZXJ2aWNlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY29ubmVjdFRvU2VydmljZSgpIHsKLSAgICAgICAgLy8gU2VydmljZS4gTmVlZHMgdG8gZ2V0IGZyZXNoIGJpbmRlciB3aGVuZXZlciBjb25uZWN0aW9uIGlzIG5lZWRlZC4KLSAgICAgICAgU2Vzc2lvblRva2VuMkltcGwgaW1wbCA9IFNlc3Npb25Ub2tlbjJJbXBsLmZyb20obVRva2VuKTsKLSAgICAgICAgZmluYWwgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoTWVkaWFTZXNzaW9uU2VydmljZTIuU0VSVklDRV9JTlRFUkZBQ0UpOwotICAgICAgICBpbnRlbnQuc2V0Q2xhc3NOYW1lKG1Ub2tlbi5nZXRQYWNrYWdlTmFtZSgpLCBpbXBsLmdldFNlcnZpY2VOYW1lKCkpOwotCi0gICAgICAgIC8vIFVzZSBiaW5kU2VydmljZSgpIGluc3RlYWQgb2Ygc3RhcnRGb3JlZ3JvdW5kU2VydmljZSgpIHRvIHN0YXJ0IHNlc3Npb24gc2VydmljZSBmb3IgdGhyZWUKLSAgICAgICAgLy8gcmVhc29ucy4KLSAgICAgICAgLy8gMS4gUHJldmVudCBzZXNzaW9uIHNlcnZpY2Ugb3duZXIncyBzdG9wU2VsZigpIGZyb20gZGVzdHJveWluZyBzZXJ2aWNlLgotICAgICAgICAvLyAgICBXaXRoIHRoZSBzdGFydEZvcmVncm91bmRTZXJ2aWNlKCksIHNlcnZpY2UncyBjYWxsIG9mIHN0b3BTZWxmKCkgd2lsbCB0cmlnZ2VyIGltbWVkaWF0ZQotICAgICAgICAvLyAgICBvbkRlc3Ryb3koKSBjYWxscyBvbiB0aGUgbWFpbiB0aHJlYWQgZXZlbiB3aGVuIG9uQ29ubmVjdCgpIGlzIHJ1bm5pbmcgaW4gYW5vdGhlcgotICAgICAgICAvLyAgICB0aHJlYWQuCi0gICAgICAgIC8vIDIuIE1pbmltaXplIEFQSXMgZm9yIGRldmVsb3BlcnMgdG8gdGFrZSBjYXJlIGFib3V0LgotICAgICAgICAvLyAgICBXaXRoIGJpbmRTZXJ2aWNlKCksIGRldmVsb3BlcnMgb25seSBuZWVkIHRvIHRha2UgY2FyZSBhYm91dCBTZXJ2aWNlLm9uQmluZCgpCi0gICAgICAgIC8vICAgIGJ1dCBTZXJ2aWNlLm9uU3RhcnRDb21tYW5kKCkgc2hvdWxkIGJlIGFsc28gdGFrZW4gY2FyZSBhYm91dCB3aXRoIHRoZQotICAgICAgICAvLyAgICBzdGFydEZvcmVncm91bmRTZXJ2aWNlKCkuCi0gICAgICAgIC8vIDMuIEZ1dHVyZSBzdXBwb3J0IGZvciBVSS1sZXNzIHBsYXliYWNrCi0gICAgICAgIC8vICAgIElmIGEgc2VydmljZSB3YW50cyB0byBrZWVwIHJ1bm5pbmcsIGl0IHNob3VsZCBiZSBlaXRoZXIgZm9yZWdyb3VuZCBzZXJ2aWNlIG9yCi0gICAgICAgIC8vICAgIGJvdW5kZWQgc2VydmljZS4gQnV0IHRoZXJlIGhhZCBiZWVuIHJlcXVlc3QgZm9yIHRoZSBmZWF0dXJlIGZvciBzeXN0ZW0gYXBwcwotICAgICAgICAvLyAgICBhbmQgdXNpbmcgYmluZFNlcnZpY2UoKSB3aWxsIGJlIGJldHRlciBmaXQgd2l0aCBpdC4KLSAgICAgICAgYm9vbGVhbiByZXN1bHQ7Ci0gICAgICAgIGlmIChQcm9jZXNzLm15VWlkKCkgPT0gUHJvY2Vzcy5TWVNURU1fVUlEKSB7Ci0gICAgICAgICAgICAvLyBVc2UgYmluZFNlcnZpY2VBc1VzZXIoKSBmb3IgYmluZGluZyBmcm9tIHN5c3RlbSBzZXJ2aWNlIHRvIGF2b2lkIGZvbGxvd2luZyB3YXJuaW5nLgotICAgICAgICAgICAgLy8gQ29udGV4dEltcGw6IENhbGxpbmcgYSBtZXRob2QgaW4gdGhlIHN5c3RlbSBwcm9jZXNzIHdpdGhvdXQgYSBxdWFsaWZpZWQgdXNlcgotICAgICAgICAgICAgcmVzdWx0ID0gbUNvbnRleHQuYmluZFNlcnZpY2VBc1VzZXIoaW50ZW50LCBtU2VydmljZUNvbm5lY3Rpb24sIENvbnRleHQuQklORF9BVVRPX0NSRUFURSwKLSAgICAgICAgICAgICAgICAgICAgVXNlckhhbmRsZS5nZXRVc2VySGFuZGxlRm9yVWlkKG1Ub2tlbi5nZXRVaWQoKSkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmVzdWx0ID0gbUNvbnRleHQuYmluZFNlcnZpY2UoaW50ZW50LCBtU2VydmljZUNvbm5lY3Rpb24sIENvbnRleHQuQklORF9BVVRPX0NSRUFURSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFyZXN1bHQpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgImJpbmQgdG8gIiArIG1Ub2tlbiArICIgZmFpbGVkIik7Ci0gICAgICAgIH0gZWxzZSBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgImJpbmQgdG8gIiArIG1Ub2tlbiArICIgc3VjY2VzcyIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNvbm5lY3RUb1Nlc3Npb24oSU1lZGlhU2Vzc2lvbjIgc2Vzc2lvbkJpbmRlcikgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgc2Vzc2lvbkJpbmRlci5jb25uZWN0KG1Db250cm9sbGVyU3R1YiwgbUNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJGYWlsZWQgdG8gY2FsbCBjb25uZWN0aW9uIHJlcXVlc3QuIEZyYW1ld29yayB3aWxsIHJldHJ5IgotICAgICAgICAgICAgICAgICAgICArICIgYXV0b21hdGljYWxseSIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgY2xvc2VfaW1wbCgpIHsKLSAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJyZWxlYXNlIGZyb20gIiArIG1Ub2tlbik7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyOwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBpZiAobUlzUmVsZWFzZWQpIHsKLSAgICAgICAgICAgICAgICAvLyBQcmV2ZW50IHJlLWVudGVyYW5jZSBmcm9tIHRoZSBDb250cm9sbGVyQ2FsbGJhY2sub25EaXNjb25uZWN0ZWQoKQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1Jc1JlbGVhc2VkID0gdHJ1ZTsKLSAgICAgICAgICAgIGlmIChtU2VydmljZUNvbm5lY3Rpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1Db250ZXh0LnVuYmluZFNlcnZpY2UobVNlcnZpY2VDb25uZWN0aW9uKTsKLSAgICAgICAgICAgICAgICBtU2VydmljZUNvbm5lY3Rpb24gPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYmluZGVyID0gbVNlc3Npb25CaW5kZXI7Ci0gICAgICAgICAgICBtU2Vzc2lvbkJpbmRlciA9IG51bGw7Ci0gICAgICAgICAgICBtQ29udHJvbGxlclN0dWIuZGVzdHJveSgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChiaW5kZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBiaW5kZXIuYXNCaW5kZXIoKS51bmxpbmtUb0RlYXRoKG1EZWF0aFJlY2lwaWVudCwgMCk7Ci0gICAgICAgICAgICAgICAgYmluZGVyLnJlbGVhc2UobUNvbnRyb2xsZXJTdHViKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gTm8tb3AuCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbUNhbGxiYWNrRXhlY3V0b3IuZXhlY3V0ZSgoKSAtPiB7Ci0gICAgICAgICAgICBtQ2FsbGJhY2sub25EaXNjb25uZWN0ZWQobUluc3RhbmNlKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgSU1lZGlhU2Vzc2lvbjIgZ2V0U2Vzc2lvbkJpbmRlcigpIHsKLSAgICAgICAgcmV0dXJuIG1TZXNzaW9uQmluZGVyOwotICAgIH0KLQotICAgIE1lZGlhQ29udHJvbGxlcjJTdHViIGdldENvbnRyb2xsZXJTdHViKCkgewotICAgICAgICByZXR1cm4gbUNvbnRyb2xsZXJTdHViOwotICAgIH0KLQotICAgIEV4ZWN1dG9yIGdldENhbGxiYWNrRXhlY3V0b3IoKSB7Ci0gICAgICAgIHJldHVybiBtQ2FsbGJhY2tFeGVjdXRvcjsKLSAgICB9Ci0KLSAgICBDb250ZXh0IGdldENvbnRleHQoKSB7Ci0gICAgICAgIHJldHVybiBtQ29udGV4dDsKLSAgICB9Ci0KLSAgICBNZWRpYUNvbnRyb2xsZXIyIGdldEluc3RhbmNlKCkgewotICAgICAgICByZXR1cm4gbUluc3RhbmNlOwotICAgIH0KLQotICAgIC8vIFJldHVybnMgc2Vzc2lvbiBiaW5kZXIgaWYgdGhlIGNvbnRyb2xsZXIgY2FuIHNlbmQgdGhlIGNvbW1hbmQuCi0gICAgSU1lZGlhU2Vzc2lvbjIgZ2V0U2Vzc2lvbkJpbmRlcklmQWJsZShpbnQgY29tbWFuZENvZGUpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgaWYgKCFtQWxsb3dlZENvbW1hbmRzLmhhc0NvbW1hbmQoY29tbWFuZENvZGUpKSB7Ci0gICAgICAgICAgICAgICAgLy8gQ2Fubm90IHNlbmQgYmVjYXVzZSBpc24ndCBhbGxvd2VkIHRvLgotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNvbnRyb2xsZXIgaXNuJ3QgYWxsb3dlZCB0byBjYWxsIGNvbW1hbmQsIGNvbW1hbmRDb2RlPSIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgY29tbWFuZENvZGUpOwotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIFRPRE8oamFld2FuKTogU2hvdWxkIHdlIGRvIHRoaXMgd2l0aCB0aGUgbG9jayBob2xkPwotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBtU2Vzc2lvbkJpbmRlcjsKLSAgICAgICAgaWYgKGJpbmRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBDYW5ub3Qgc2VuZCBiZWNhdXNlIGRpc2Nvbm5lY3RlZC4KLSAgICAgICAgICAgIExvZy53KFRBRywgIlNlc3Npb24gaXMgZGlzY29ubmVjdGVkIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJpbmRlcjsKLSAgICB9Ci0KLSAgICAvLyBSZXR1cm5zIHNlc3Npb24gYmluZGVyIGlmIHRoZSBjb250cm9sbGVyIGNhbiBzZW5kIHRoZSBjb21tYW5kLgotICAgIElNZWRpYVNlc3Npb24yIGdldFNlc3Npb25CaW5kZXJJZkFibGUoU2Vzc2lvbkNvbW1hbmQyIGNvbW1hbmQpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgaWYgKCFtQWxsb3dlZENvbW1hbmRzLmhhc0NvbW1hbmQoY29tbWFuZCkpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDb250cm9sbGVyIGlzbid0IGFsbG93ZWQgdG8gY2FsbCBjb21tYW5kLCBjb21tYW5kPSIgKyBjb21tYW5kKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyBUT0RPKGphZXdhbik6IFNob3VsZCB3ZSBkbyB0aGlzIHdpdGggdGhlIGxvY2sgaG9sZD8KLSAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gbVNlc3Npb25CaW5kZXI7Ci0gICAgICAgIGlmIChiaW5kZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gQ2Fubm90IHNlbmQgYmVjYXVzZSBkaXNjb25uZWN0ZWQuCi0gICAgICAgICAgICBMb2cudyhUQUcsICJTZXNzaW9uIGlzIGRpc2Nvbm5lY3RlZCIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBiaW5kZXI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFNlc3Npb25Ub2tlbjIgZ2V0U2Vzc2lvblRva2VuX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtVG9rZW47Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNDb25uZWN0ZWRfaW1wbCgpIHsKLSAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gbVNlc3Npb25CaW5kZXI7Ci0gICAgICAgIHJldHVybiBiaW5kZXIgIT0gbnVsbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwbGF5X2ltcGwoKSB7Ci0gICAgICAgIHNlbmRUcmFuc3BvcnRDb250cm9sQ29tbWFuZChTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlCQUNLX1BMQVkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHBhdXNlX2ltcGwoKSB7Ci0gICAgICAgIHNlbmRUcmFuc3BvcnRDb250cm9sQ29tbWFuZChTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlCQUNLX1BBVVNFKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzdG9wX2ltcGwoKSB7Ci0gICAgICAgIHNlbmRUcmFuc3BvcnRDb250cm9sQ29tbWFuZChTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlCQUNLX1NUT1ApOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNraXBUb1BsYXlsaXN0SXRlbV9pbXBsKE1lZGlhSXRlbTIgaXRlbSkgewotICAgICAgICBpZiAoaXRlbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpdGVtIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gbVNlc3Npb25CaW5kZXI7Ci0gICAgICAgIGlmIChiaW5kZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBiaW5kZXIuc2tpcFRvUGxheWxpc3RJdGVtKG1Db250cm9sbGVyU3R1YiwgaXRlbS50b0J1bmRsZSgpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBpc24ndCBhY3RpdmUiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2tpcFRvUHJldmlvdXNJdGVtX2ltcGwoKSB7Ci0gICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IG1TZXNzaW9uQmluZGVyOwotICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYmluZGVyLnNraXBUb1ByZXZpb3VzSXRlbShtQ29udHJvbGxlclN0dWIpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgY29ubmVjdCB0byB0aGUgc2VydmljZSBvciB0aGUgc2Vzc2lvbiBpcyBnb25lIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJTZXNzaW9uIGlzbid0IGFjdGl2ZSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBza2lwVG9OZXh0SXRlbV9pbXBsKCkgewotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBtU2Vzc2lvbkJpbmRlcjsKLSAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJpbmRlci5za2lwVG9OZXh0SXRlbShtQ29udHJvbGxlclN0dWIpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgY29ubmVjdCB0byB0aGUgc2VydmljZSBvciB0aGUgc2Vzc2lvbiBpcyBnb25lIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJTZXNzaW9uIGlzbid0IGFjdGl2ZSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2VuZFRyYW5zcG9ydENvbnRyb2xDb21tYW5kKGludCBjb21tYW5kQ29kZSkgewotICAgICAgICBzZW5kVHJhbnNwb3J0Q29udHJvbENvbW1hbmQoY29tbWFuZENvZGUsIG51bGwpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzZW5kVHJhbnNwb3J0Q29udHJvbENvbW1hbmQoaW50IGNvbW1hbmRDb2RlLCBCdW5kbGUgYXJncykgewotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBtU2Vzc2lvbkJpbmRlcjsKLSAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJpbmRlci5zZW5kVHJhbnNwb3J0Q29udHJvbENvbW1hbmQobUNvbnRyb2xsZXJTdHViLCBjb21tYW5kQ29kZSwgYXJncyk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBjb25uZWN0IHRvIHRoZSBzZXJ2aWNlIG9yIHRoZSBzZXNzaW9uIGlzIGdvbmUiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIlNlc3Npb24gaXNuJ3QgYWN0aXZlIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBQZW5kaW5nSW50ZW50IGdldFNlc3Npb25BY3Rpdml0eV9pbXBsKCkgewotICAgICAgICByZXR1cm4gbVNlc3Npb25BY3Rpdml0eTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRWb2x1bWVUb19pbXBsKGludCB2YWx1ZSwgaW50IGZsYWdzKSB7Ci0gICAgICAgIC8vIFRPRE8oaGRtb29uKTogc2FuaXR5IGNoZWNrCi0gICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IGdldFNlc3Npb25CaW5kZXJJZkFibGUoQ09NTUFORF9DT0RFX1NFVF9WT0xVTUUpOwotICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYmluZGVyLnNldFZvbHVtZVRvKG1Db250cm9sbGVyU3R1YiwgdmFsdWUsIGZsYWdzKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBpc24ndCBhY3RpdmUiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgYWRqdXN0Vm9sdW1lX2ltcGwoaW50IGRpcmVjdGlvbiwgaW50IGZsYWdzKSB7Ci0gICAgICAgIC8vIFRPRE8oaGRtb29uKTogc2FuaXR5IGNoZWNrCi0gICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IGdldFNlc3Npb25CaW5kZXJJZkFibGUoQ09NTUFORF9DT0RFX1NFVF9WT0xVTUUpOwotICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYmluZGVyLmFkanVzdFZvbHVtZShtQ29udHJvbGxlclN0dWIsIGRpcmVjdGlvbiwgZmxhZ3MpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgY29ubmVjdCB0byB0aGUgc2VydmljZSBvciB0aGUgc2Vzc2lvbiBpcyBnb25lIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJTZXNzaW9uIGlzbid0IGFjdGl2ZSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwcmVwYXJlRnJvbVVyaV9pbXBsKFVyaSB1cmksIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gZ2V0U2Vzc2lvbkJpbmRlcklmQWJsZShDT01NQU5EX0NPREVfU0VTU0lPTl9QUkVQQVJFX0ZST01fVVJJKTsKLSAgICAgICAgaWYgKHVyaSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1cmkgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYmluZGVyLnByZXBhcmVGcm9tVXJpKG1Db250cm9sbGVyU3R1YiwgdXJpLCBleHRyYXMpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgY29ubmVjdCB0byB0aGUgc2VydmljZSBvciB0aGUgc2Vzc2lvbiBpcyBnb25lIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IEhhbmRsZS4KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHByZXBhcmVGcm9tU2VhcmNoX2ltcGwoU3RyaW5nIHF1ZXJ5LCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IGdldFNlc3Npb25CaW5kZXJJZkFibGUoCi0gICAgICAgICAgICAgICAgQ09NTUFORF9DT0RFX1NFU1NJT05fUFJFUEFSRV9GUk9NX1NFQVJDSCk7Ci0gICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShxdWVyeSkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInF1ZXJ5IHNob3VsZG4ndCBiZSBlbXB0eSIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChiaW5kZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBiaW5kZXIucHJlcGFyZUZyb21TZWFyY2gobUNvbnRyb2xsZXJTdHViLCBxdWVyeSwgZXh0cmFzKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBIYW5kbGUuCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwcmVwYXJlRnJvbU1lZGlhSWRfaW1wbChTdHJpbmcgbWVkaWFJZCwgQnVuZGxlIGV4dHJhcykgewotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBnZXRTZXNzaW9uQmluZGVySWZBYmxlKAotICAgICAgICAgICAgICAgIENPTU1BTkRfQ09ERV9TRVNTSU9OX1BSRVBBUkVfRlJPTV9NRURJQV9JRCk7Ci0gICAgICAgIGlmIChtZWRpYUlkID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm1lZGlhSWQgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYmluZGVyLnByZXBhcmVGcm9tTWVkaWFJZChtQ29udHJvbGxlclN0dWIsIG1lZGlhSWQsIGV4dHJhcyk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBjb25uZWN0IHRvIHRoZSBzZXJ2aWNlIG9yIHRoZSBzZXNzaW9uIGlzIGdvbmUiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogSGFuZGxlLgotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcGxheUZyb21VcmlfaW1wbChVcmkgdXJpLCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IGdldFNlc3Npb25CaW5kZXJJZkFibGUoQ09NTUFORF9DT0RFX1NFU1NJT05fUExBWV9GUk9NX1VSSSk7Ci0gICAgICAgIGlmICh1cmkgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidXJpIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJpbmRlci5wbGF5RnJvbVVyaShtQ29udHJvbGxlclN0dWIsIHVyaSwgZXh0cmFzKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBIYW5kbGUuCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwbGF5RnJvbVNlYXJjaF9pbXBsKFN0cmluZyBxdWVyeSwgQnVuZGxlIGV4dHJhcykgewotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBnZXRTZXNzaW9uQmluZGVySWZBYmxlKENPTU1BTkRfQ09ERV9TRVNTSU9OX1BMQVlfRlJPTV9TRUFSQ0gpOwotICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkocXVlcnkpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJxdWVyeSBzaG91bGRuJ3QgYmUgZW1wdHkiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYmluZGVyLnBsYXlGcm9tU2VhcmNoKG1Db250cm9sbGVyU3R1YiwgcXVlcnksIGV4dHJhcyk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBjb25uZWN0IHRvIHRoZSBzZXJ2aWNlIG9yIHRoZSBzZXNzaW9uIGlzIGdvbmUiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogSGFuZGxlLgotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcGxheUZyb21NZWRpYUlkX2ltcGwoU3RyaW5nIG1lZGlhSWQsIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gZ2V0U2Vzc2lvbkJpbmRlcklmQWJsZSgKLSAgICAgICAgICAgICAgICBDT01NQU5EX0NPREVfU0VTU0lPTl9QTEFZX0ZST01fTUVESUFfSUQpOwotICAgICAgICBpZiAobWVkaWFJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJtZWRpYUlkIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJpbmRlci5wbGF5RnJvbU1lZGlhSWQobUNvbnRyb2xsZXJTdHViLCBtZWRpYUlkLCBleHRyYXMpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgY29ubmVjdCB0byB0aGUgc2VydmljZSBvciB0aGUgc2Vzc2lvbiBpcyBnb25lIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IEhhbmRsZS4KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFJhdGluZ19pbXBsKFN0cmluZyBtZWRpYUlkLCBSYXRpbmcyIHJhdGluZykgewotICAgICAgICBpZiAobWVkaWFJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJtZWRpYUlkIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJhdGluZyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJyYXRpbmcgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IG1TZXNzaW9uQmluZGVyOwotICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYmluZGVyLnNldFJhdGluZyhtQ29udHJvbGxlclN0dWIsIG1lZGlhSWQsIHJhdGluZy50b0J1bmRsZSgpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBIYW5kbGUuCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZW5kQ3VzdG9tQ29tbWFuZF9pbXBsKFNlc3Npb25Db21tYW5kMiBjb21tYW5kLCBCdW5kbGUgYXJncywgUmVzdWx0UmVjZWl2ZXIgY2IpIHsKLSAgICAgICAgaWYgKGNvbW1hbmQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY29tbWFuZCBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IGdldFNlc3Npb25CaW5kZXJJZkFibGUoY29tbWFuZCk7Ci0gICAgICAgIGlmIChiaW5kZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBiaW5kZXIuc2VuZEN1c3RvbUNvbW1hbmQobUNvbnRyb2xsZXJTdHViLCBjb21tYW5kLnRvQnVuZGxlKCksIGFyZ3MsIGNiKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBpc24ndCBhY3RpdmUiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIExpc3Q8TWVkaWFJdGVtMj4gZ2V0UGxheWxpc3RfaW1wbCgpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgcmV0dXJuIG1QbGF5bGlzdDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFBsYXlsaXN0X2ltcGwoTGlzdDxNZWRpYUl0ZW0yPiBsaXN0LCBNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSkgewotICAgICAgICBpZiAobGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJsaXN0IHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gZ2V0U2Vzc2lvbkJpbmRlcklmQWJsZShDT01NQU5EX0NPREVfUExBWUxJU1RfU0VUX0xJU1QpOwotICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIExpc3Q8QnVuZGxlPiBidW5kbGVMaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBidW5kbGVMaXN0LmFkZChsaXN0LmdldChpKS50b0J1bmRsZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEJ1bmRsZSBtZXRhZGF0YUJ1bmRsZSA9IChtZXRhZGF0YSA9PSBudWxsKSA/IG51bGwgOiBtZXRhZGF0YS50b0J1bmRsZSgpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBiaW5kZXIuc2V0UGxheWxpc3QobUNvbnRyb2xsZXJTdHViLCBidW5kbGVMaXN0LCBtZXRhZGF0YUJ1bmRsZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBjb25uZWN0IHRvIHRoZSBzZXJ2aWNlIG9yIHRoZSBzZXNzaW9uIGlzIGdvbmUiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIlNlc3Npb24gaXNuJ3QgYWN0aXZlIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNZWRpYU1ldGFkYXRhMiBnZXRQbGF5bGlzdE1ldGFkYXRhX2ltcGwoKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIHJldHVybiBtUGxheWxpc3RNZXRhZGF0YTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZVBsYXlsaXN0TWV0YWRhdGFfaW1wbChNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSkgewotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBnZXRTZXNzaW9uQmluZGVySWZBYmxlKAotICAgICAgICAgICAgICAgIENPTU1BTkRfQ09ERV9QTEFZTElTVF9TRVRfTElTVF9NRVRBREFUQSk7Ci0gICAgICAgIGlmIChiaW5kZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgQnVuZGxlIG1ldGFkYXRhQnVuZGxlID0gKG1ldGFkYXRhID09IG51bGwpID8gbnVsbCA6IG1ldGFkYXRhLnRvQnVuZGxlKCk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJpbmRlci51cGRhdGVQbGF5bGlzdE1ldGFkYXRhKG1Db250cm9sbGVyU3R1YiwgbWV0YWRhdGFCdW5kbGUpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgY29ubmVjdCB0byB0aGUgc2VydmljZSBvciB0aGUgc2Vzc2lvbiBpcyBnb25lIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJTZXNzaW9uIGlzbid0IGFjdGl2ZSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwcmVwYXJlX2ltcGwoKSB7Ci0gICAgICAgIHNlbmRUcmFuc3BvcnRDb250cm9sQ29tbWFuZChTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlCQUNLX1BSRVBBUkUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGZhc3RGb3J3YXJkX2ltcGwoKSB7Ci0gICAgICAgIC8vIFRPRE8oamFld2FuKTogSW1wbGVtZW50IHRoaXMuIE5vdGUgdGhhdCBmYXN0IGZvcndhcmQgaXNuJ3QgYSB0cmFuc3BvcnQgY29tbWFuZCBhbnltb3JlCi0gICAgICAgIC8vc2VuZFRyYW5zcG9ydENvbnRyb2xDb21tYW5kKE1lZGlhU2Vzc2lvbjIuQ09NTUFORF9DT0RFX1NFU1NJT05fRkFTVF9GT1JXQVJEKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCByZXdpbmRfaW1wbCgpIHsKLSAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBJbXBsZW1lbnQgdGhpcy4gTm90ZSB0aGF0IHJld2luZCBpc24ndCBhIHRyYW5zcG9ydCBjb21tYW5kIGFueW1vcmUKLSAgICAgICAgLy9zZW5kVHJhbnNwb3J0Q29udHJvbENvbW1hbmQoTWVkaWFTZXNzaW9uMi5DT01NQU5EX0NPREVfU0VTU0lPTl9SRVdJTkQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNlZWtUb19pbXBsKGxvbmcgcG9zKSB7Ci0gICAgICAgIGlmIChwb3MgPCAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJwb3NpdGlvbiBzaG91bGRuJ3QgYmUgbmVnYXRpdmUiKTsKLSAgICAgICAgfQotICAgICAgICBCdW5kbGUgYXJncyA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgYXJncy5wdXRMb25nKE1lZGlhU2Vzc2lvbjJTdHViLkFSR1VNRU5UX0tFWV9QT1NJVElPTiwgcG9zKTsKLSAgICAgICAgc2VuZFRyYW5zcG9ydENvbnRyb2xDb21tYW5kKFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfUExBWUJBQ0tfU0VFS19UTywgYXJncyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgYWRkUGxheWxpc3RJdGVtX2ltcGwoaW50IGluZGV4LCBNZWRpYUl0ZW0yIGl0ZW0pIHsKLSAgICAgICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW5kZXggc2hvdWxkbid0IGJlIG5lZ2F0aXZlIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGl0ZW0gPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaXRlbSBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IGdldFNlc3Npb25CaW5kZXJJZkFibGUoQ09NTUFORF9DT0RFX1BMQVlMSVNUX0FERF9JVEVNKTsKLSAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJpbmRlci5hZGRQbGF5bGlzdEl0ZW0obUNvbnRyb2xsZXJTdHViLCBpbmRleCwgaXRlbS50b0J1bmRsZSgpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBpc24ndCBhY3RpdmUiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlUGxheWxpc3RJdGVtX2ltcGwoTWVkaWFJdGVtMiBpdGVtKSB7Ci0gICAgICAgIGlmIChpdGVtID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIml0ZW0gc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBnZXRTZXNzaW9uQmluZGVySWZBYmxlKENPTU1BTkRfQ09ERV9QTEFZTElTVF9SRU1PVkVfSVRFTSk7Ci0gICAgICAgIGlmIChiaW5kZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBiaW5kZXIucmVtb3ZlUGxheWxpc3RJdGVtKG1Db250cm9sbGVyU3R1YiwgaXRlbS50b0J1bmRsZSgpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBpc24ndCBhY3RpdmUiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcmVwbGFjZVBsYXlsaXN0SXRlbV9pbXBsKGludCBpbmRleCwgTWVkaWFJdGVtMiBpdGVtKSB7Ci0gICAgICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImluZGV4IHNob3VsZG4ndCBiZSBuZWdhdGl2ZSIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpdGVtID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIml0ZW0gc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBnZXRTZXNzaW9uQmluZGVySWZBYmxlKENPTU1BTkRfQ09ERV9QTEFZTElTVF9SRVBMQUNFX0lURU0pOwotICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYmluZGVyLnJlcGxhY2VQbGF5bGlzdEl0ZW0obUNvbnRyb2xsZXJTdHViLCBpbmRleCwgaXRlbS50b0J1bmRsZSgpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBpc24ndCBhY3RpdmUiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBnZXRTaHVmZmxlTW9kZV9pbXBsKCkgewotICAgICAgICByZXR1cm4gbVNodWZmbGVNb2RlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFNodWZmbGVNb2RlX2ltcGwoaW50IHNodWZmbGVNb2RlKSB7Ci0gICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IGdldFNlc3Npb25CaW5kZXJJZkFibGUoCi0gICAgICAgICAgICAgICAgQ09NTUFORF9DT0RFX1BMQVlMSVNUX1NFVF9TSFVGRkxFX01PREUpOwotICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYmluZGVyLnNldFNodWZmbGVNb2RlKG1Db250cm9sbGVyU3R1Yiwgc2h1ZmZsZU1vZGUpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgY29ubmVjdCB0byB0aGUgc2VydmljZSBvciB0aGUgc2Vzc2lvbiBpcyBnb25lIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJTZXNzaW9uIGlzbid0IGFjdGl2ZSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGdldFJlcGVhdE1vZGVfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG1SZXBlYXRNb2RlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFJlcGVhdE1vZGVfaW1wbChpbnQgcmVwZWF0TW9kZSkgewotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBnZXRTZXNzaW9uQmluZGVySWZBYmxlKENPTU1BTkRfQ09ERV9QTEFZTElTVF9TRVRfUkVQRUFUX01PREUpOwotICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYmluZGVyLnNldFJlcGVhdE1vZGUobUNvbnRyb2xsZXJTdHViLCByZXBlYXRNb2RlKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBpc24ndCBhY3RpdmUiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFBsYXliYWNrSW5mbyBnZXRQbGF5YmFja0luZm9faW1wbCgpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgcmV0dXJuIG1QbGF5YmFja0luZm87Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGdldFBsYXllclN0YXRlX2ltcGwoKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIHJldHVybiBtUGxheWVyU3RhdGU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgbG9uZyBnZXRDdXJyZW50UG9zaXRpb25faW1wbCgpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgbG9uZyB0aW1lRGlmZiA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gbVBvc2l0aW9uRXZlbnRUaW1lTXM7Ci0gICAgICAgICAgICBsb25nIGV4cGVjdGVkUG9zaXRpb24gPSBtUG9zaXRpb25NcyArIChsb25nKSAobVBsYXliYWNrU3BlZWQgKiB0aW1lRGlmZik7Ci0gICAgICAgICAgICByZXR1cm4gTWF0aC5tYXgoMCwgZXhwZWN0ZWRQb3NpdGlvbik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZmxvYXQgZ2V0UGxheWJhY2tTcGVlZF9pbXBsKCkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVBsYXliYWNrU3BlZWQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgbG9uZyBnZXRCdWZmZXJlZFBvc2l0aW9uX2ltcGwoKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIHJldHVybiBtQnVmZmVyZWRQb3NpdGlvbk1zOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1lZGlhSXRlbTIgZ2V0Q3VycmVudE1lZGlhSXRlbV9pbXBsKCkgewotICAgICAgICAvLyBUT0RPKGphZXdhbik6IEltcGxlbWVudAotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICB2b2lkIHB1c2hQbGF5ZXJTdGF0ZUNoYW5nZXMoZmluYWwgaW50IHN0YXRlKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIG1QbGF5ZXJTdGF0ZSA9IHN0YXRlOwotICAgICAgICB9Ci0gICAgICAgIG1DYWxsYmFja0V4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgaWYgKCFtSW5zdGFuY2UuaXNDb25uZWN0ZWQoKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1DYWxsYmFjay5vblBsYXllclN0YXRlQ2hhbmdlZChtSW5zdGFuY2UsIHN0YXRlKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgLy8gVE9ETyhqYWV3YW4pOiBSZW5hbWUgdG8gc2VlayBjb21wbGV0ZWQKLSAgICB2b2lkIHB1c2hQb3NpdGlvbkNoYW5nZXMoZmluYWwgbG9uZyBldmVudFRpbWVNcywgZmluYWwgbG9uZyBwb3NpdGlvbk1zKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIG1Qb3NpdGlvbkV2ZW50VGltZU1zID0gZXZlbnRUaW1lTXM7Ci0gICAgICAgICAgICBtUG9zaXRpb25NcyA9IHBvc2l0aW9uTXM7Ci0gICAgICAgIH0KLSAgICAgICAgbUNhbGxiYWNrRXhlY3V0b3IuZXhlY3V0ZSgoKSAtPiB7Ci0gICAgICAgICAgICBpZiAoIW1JbnN0YW5jZS5pc0Nvbm5lY3RlZCgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUNhbGxiYWNrLm9uU2Vla0NvbXBsZXRlZChtSW5zdGFuY2UsIHBvc2l0aW9uTXMpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICB2b2lkIHB1c2hQbGF5YmFja1NwZWVkQ2hhbmdlcyhmaW5hbCBmbG9hdCBzcGVlZCkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBtUGxheWJhY2tTcGVlZCA9IHNwZWVkOwotICAgICAgICB9Ci0gICAgICAgIG1DYWxsYmFja0V4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgaWYgKCFtSW5zdGFuY2UuaXNDb25uZWN0ZWQoKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1DYWxsYmFjay5vblBsYXliYWNrU3BlZWRDaGFuZ2VkKG1JbnN0YW5jZSwgc3BlZWQpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICB2b2lkIHB1c2hCdWZmZXJlZFBvc2l0aW9uQ2hhbmdlcyhmaW5hbCBsb25nIGJ1ZmZlcmVkUG9zaXRpb25NcykgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBtQnVmZmVyZWRQb3NpdGlvbk1zID0gYnVmZmVyZWRQb3NpdGlvbk1zOwotICAgICAgICB9Ci0gICAgICAgIG1DYWxsYmFja0V4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgaWYgKCFtSW5zdGFuY2UuaXNDb25uZWN0ZWQoKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogRml4IHRoaXMgLS0gaXQncyBub3cgYnVmZmVyZWQgc3RhdGUKLSAgICAgICAgICAgIC8vbUNhbGxiYWNrLm9uQnVmZmVyZWRQb3NpdGlvbkNoYW5nZWQobUluc3RhbmNlLCBidWZmZXJlZFBvc2l0aW9uTXMpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICB2b2lkIHB1c2hQbGF5YmFja0luZm9DaGFuZ2VzKGZpbmFsIFBsYXliYWNrSW5mbyBpbmZvKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIG1QbGF5YmFja0luZm8gPSBpbmZvOwotICAgICAgICB9Ci0gICAgICAgIG1DYWxsYmFja0V4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgaWYgKCFtSW5zdGFuY2UuaXNDb25uZWN0ZWQoKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1DYWxsYmFjay5vblBsYXliYWNrSW5mb0NoYW5nZWQobUluc3RhbmNlLCBpbmZvKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgdm9pZCBwdXNoUGxheWxpc3RDaGFuZ2VzKGZpbmFsIExpc3Q8TWVkaWFJdGVtMj4gcGxheWxpc3QsIGZpbmFsIE1lZGlhTWV0YWRhdGEyIG1ldGFkYXRhKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIG1QbGF5bGlzdCA9IHBsYXlsaXN0OwotICAgICAgICAgICAgbVBsYXlsaXN0TWV0YWRhdGEgPSBtZXRhZGF0YTsKLSAgICAgICAgfQotICAgICAgICBtQ2FsbGJhY2tFeGVjdXRvci5leGVjdXRlKCgpIC0+IHsKLSAgICAgICAgICAgIGlmICghbUluc3RhbmNlLmlzQ29ubmVjdGVkKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQ2FsbGJhY2sub25QbGF5bGlzdENoYW5nZWQobUluc3RhbmNlLCBwbGF5bGlzdCwgbWV0YWRhdGEpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICB2b2lkIHB1c2hQbGF5bGlzdE1ldGFkYXRhQ2hhbmdlcyhNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBtUGxheWxpc3RNZXRhZGF0YSA9IG1ldGFkYXRhOwotICAgICAgICB9Ci0gICAgICAgIG1DYWxsYmFja0V4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgaWYgKCFtSW5zdGFuY2UuaXNDb25uZWN0ZWQoKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1DYWxsYmFjay5vblBsYXlsaXN0TWV0YWRhdGFDaGFuZ2VkKG1JbnN0YW5jZSwgbWV0YWRhdGEpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICB2b2lkIHB1c2hTaHVmZmxlTW9kZUNoYW5nZXMoaW50IHNodWZmbGVNb2RlKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIG1TaHVmZmxlTW9kZSA9IHNodWZmbGVNb2RlOwotICAgICAgICB9Ci0gICAgICAgIG1DYWxsYmFja0V4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgaWYgKCFtSW5zdGFuY2UuaXNDb25uZWN0ZWQoKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1DYWxsYmFjay5vblNodWZmbGVNb2RlQ2hhbmdlZChtSW5zdGFuY2UsIHNodWZmbGVNb2RlKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgdm9pZCBwdXNoUmVwZWF0TW9kZUNoYW5nZXMoaW50IHJlcGVhdE1vZGUpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgbVJlcGVhdE1vZGUgPSByZXBlYXRNb2RlOwotICAgICAgICB9Ci0gICAgICAgIG1DYWxsYmFja0V4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgaWYgKCFtSW5zdGFuY2UuaXNDb25uZWN0ZWQoKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1DYWxsYmFjay5vblJlcGVhdE1vZGVDaGFuZ2VkKG1JbnN0YW5jZSwgcmVwZWF0TW9kZSk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHZvaWQgcHVzaEVycm9yKGludCBlcnJvckNvZGUsIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgbUNhbGxiYWNrRXhlY3V0b3IuZXhlY3V0ZSgoKSAtPiB7Ci0gICAgICAgICAgICBpZiAoIW1JbnN0YW5jZS5pc0Nvbm5lY3RlZCgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUNhbGxiYWNrLm9uRXJyb3IobUluc3RhbmNlLCBlcnJvckNvZGUsIGV4dHJhcyk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIC8vIFNob3VsZCBiZSB1c2VkIHdpdGhvdXQgYSBsb2NrIHRvIHByZXZlbnQgcG90ZW50aWFsIGRlYWRsb2NrLgotICAgIHZvaWQgb25Db25uZWN0ZWROb3RMb2NrZWQoSU1lZGlhU2Vzc2lvbjIgc2Vzc2lvbkJpbmRlciwKLSAgICAgICAgICAgIGZpbmFsIFNlc3Npb25Db21tYW5kR3JvdXAyIGFsbG93ZWRDb21tYW5kcywKLSAgICAgICAgICAgIGZpbmFsIGludCBwbGF5ZXJTdGF0ZSwKLSAgICAgICAgICAgIGZpbmFsIGxvbmcgcG9zaXRpb25FdmVudFRpbWVNcywKLSAgICAgICAgICAgIGZpbmFsIGxvbmcgcG9zaXRpb25NcywKLSAgICAgICAgICAgIGZpbmFsIGZsb2F0IHBsYXliYWNrU3BlZWQsCi0gICAgICAgICAgICBmaW5hbCBsb25nIGJ1ZmZlcmVkUG9zaXRpb25NcywKLSAgICAgICAgICAgIGZpbmFsIFBsYXliYWNrSW5mbyBpbmZvLAotICAgICAgICAgICAgZmluYWwgaW50IHJlcGVhdE1vZGUsCi0gICAgICAgICAgICBmaW5hbCBpbnQgc2h1ZmZsZU1vZGUsCi0gICAgICAgICAgICBmaW5hbCBMaXN0PE1lZGlhSXRlbTI+IHBsYXlsaXN0LAotICAgICAgICAgICAgZmluYWwgUGVuZGluZ0ludGVudCBzZXNzaW9uQWN0aXZpdHkpIHsKLSAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJvbkNvbm5lY3RlZE5vdExvY2tlZCBzZXNzaW9uQmluZGVyPSIgKyBzZXNzaW9uQmluZGVyCi0gICAgICAgICAgICAgICAgICAgICsgIiwgYWxsb3dlZENvbW1hbmRzPSIgKyBhbGxvd2VkQ29tbWFuZHMpOwotICAgICAgICB9Ci0gICAgICAgIGJvb2xlYW4gY2xvc2UgPSBmYWxzZTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChzZXNzaW9uQmluZGVyID09IG51bGwgfHwgYWxsb3dlZENvbW1hbmRzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBDb25uZWN0aW9uIHJlamVjdGVkLgotICAgICAgICAgICAgICAgIGNsb3NlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1Jc1JlbGVhc2VkKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1TZXNzaW9uQmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiQ2Fubm90IGJlIG5vdGlmaWVkIGFib3V0IHRoZSBjb25uZWN0aW9uIHJlc3VsdCBtYW55IHRpbWVzLiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgUHJvYmFibHkgYSBidWcgb3IgbWFsaWNpb3VzIGFwcC4iKTsKLSAgICAgICAgICAgICAgICAgICAgY2xvc2UgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1BbGxvd2VkQ29tbWFuZHMgPSBhbGxvd2VkQ29tbWFuZHM7Ci0gICAgICAgICAgICAgICAgbVBsYXllclN0YXRlID0gcGxheWVyU3RhdGU7Ci0gICAgICAgICAgICAgICAgbVBvc2l0aW9uRXZlbnRUaW1lTXMgPSBwb3NpdGlvbkV2ZW50VGltZU1zOwotICAgICAgICAgICAgICAgIG1Qb3NpdGlvbk1zID0gcG9zaXRpb25NczsKLSAgICAgICAgICAgICAgICBtUGxheWJhY2tTcGVlZCA9IHBsYXliYWNrU3BlZWQ7Ci0gICAgICAgICAgICAgICAgbUJ1ZmZlcmVkUG9zaXRpb25NcyA9IGJ1ZmZlcmVkUG9zaXRpb25NczsKLSAgICAgICAgICAgICAgICBtUGxheWJhY2tJbmZvID0gaW5mbzsKLSAgICAgICAgICAgICAgICBtUmVwZWF0TW9kZSA9IHJlcGVhdE1vZGU7Ci0gICAgICAgICAgICAgICAgbVNodWZmbGVNb2RlID0gc2h1ZmZsZU1vZGU7Ci0gICAgICAgICAgICAgICAgbVBsYXlsaXN0ID0gcGxheWxpc3Q7Ci0gICAgICAgICAgICAgICAgbVNlc3Npb25BY3Rpdml0eSA9IHNlc3Npb25BY3Rpdml0eTsKLSAgICAgICAgICAgICAgICBtU2Vzc2lvbkJpbmRlciA9IHNlc3Npb25CaW5kZXI7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW1wbGVtZW50YXRpb24gZm9yIHRoZSBsb2NhbCBiaW5kZXIgaXMgbm8tb3AsCi0gICAgICAgICAgICAgICAgICAgIC8vIHNvIGNhbiBiZSB1c2VkIHdpdGhvdXQgd29ycnlpbmcgYWJvdXQgZGVhZGxvY2suCi0gICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uQmluZGVyLmFzQmluZGVyKCkubGlua1RvRGVhdGgobURlYXRoUmVjaXBpZW50LCAwKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlNlc3Npb24gZGllZCB0b28gZWFybHkuIiwgZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2xvc2UgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBLZWVwIGNvbW1hbmRzIHRvIHByZXZlbnRzIGlsbGVnYWwgQVBJIGNhbGxzLgotICAgICAgICAgICAgbUNhbGxiYWNrRXhlY3V0b3IuZXhlY3V0ZSgoKSAtPiB7Ci0gICAgICAgICAgICAgICAgLy8gTm90ZTogV2UgbWF5IHRyaWdnZXIgQ29udHJvbGxlckNhbGxiYWNrcyB3aXRoIHRoZSBpbml0aWFsIHZhbHVlcwotICAgICAgICAgICAgICAgIC8vIEJ1dCBpdCdzIGhhcmQgdG8gZGVmaW5lIHRoZSBvcmRlciBvZiB0aGUgY29udHJvbGxlciBjYWxsYmFja3MKLSAgICAgICAgICAgICAgICAvLyBPbmx5IG5vdGlmeSBhYm91dCB0aGUKLSAgICAgICAgICAgICAgICBtQ2FsbGJhY2sub25Db25uZWN0ZWQobUluc3RhbmNlLCBhbGxvd2VkQ29tbWFuZHMpOwotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoY2xvc2UpIHsKLSAgICAgICAgICAgICAgICAvLyBUcmljayB0byBjYWxsIHJlbGVhc2UoKSB3aXRob3V0IGhvbGRpbmcgdGhlIGxvY2ssIHRvIHByZXZlbnQgcG90ZW50aWFsIGRlYWRsb2NrCi0gICAgICAgICAgICAgICAgLy8gd2l0aCB0aGUgZGV2ZWxvcGVyJ3MgY3VzdG9tIGxvY2sgd2l0aGluIHRoZSBDb250cm9sbGVyQ2FsbGJhY2sub25EaXNjb25uZWN0ZWQoKS4KLSAgICAgICAgICAgICAgICBtSW5zdGFuY2UuY2xvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgb25DdXN0b21Db21tYW5kKGZpbmFsIFNlc3Npb25Db21tYW5kMiBjb21tYW5kLCBmaW5hbCBCdW5kbGUgYXJncywKLSAgICAgICAgICAgIGZpbmFsIFJlc3VsdFJlY2VpdmVyIHJlY2VpdmVyKSB7Ci0gICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAib25DdXN0b21Db21tYW5kIGNtZD0iICsgY29tbWFuZCk7Ci0gICAgICAgIH0KLSAgICAgICAgbUNhbGxiYWNrRXhlY3V0b3IuZXhlY3V0ZSgoKSAtPiB7Ci0gICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IERvdWJsZSBjaGVjayBpZiB0aGUgY29udHJvbGxlciBleGlzdHMuCi0gICAgICAgICAgICBtQ2FsbGJhY2sub25DdXN0b21Db21tYW5kKG1JbnN0YW5jZSwgY29tbWFuZCwgYXJncywgcmVjZWl2ZXIpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICB2b2lkIG9uQWxsb3dlZENvbW1hbmRzQ2hhbmdlZChmaW5hbCBTZXNzaW9uQ29tbWFuZEdyb3VwMiBjb21tYW5kcykgewotICAgICAgICBtQ2FsbGJhY2tFeGVjdXRvci5leGVjdXRlKCgpIC0+IHsKLSAgICAgICAgICAgIG1DYWxsYmFjay5vbkFsbG93ZWRDb21tYW5kc0NoYW5nZWQobUluc3RhbmNlLCBjb21tYW5kcyk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHZvaWQgb25DdXN0b21MYXlvdXRDaGFuZ2VkKGZpbmFsIExpc3Q8Q29tbWFuZEJ1dHRvbj4gbGF5b3V0KSB7Ci0gICAgICAgIG1DYWxsYmFja0V4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgbUNhbGxiYWNrLm9uQ3VzdG9tTGF5b3V0Q2hhbmdlZChtSW5zdGFuY2UsIGxheW91dCk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIC8vIFRoaXMgd2lsbCBiZSBjYWxsZWQgb24gdGhlIG1haW4gdGhyZWFkLgotICAgIHByaXZhdGUgY2xhc3MgU2Vzc2lvblNlcnZpY2VDb25uZWN0aW9uIGltcGxlbWVudHMgU2VydmljZUNvbm5lY3Rpb24gewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25TZXJ2aWNlQ29ubmVjdGVkKENvbXBvbmVudE5hbWUgbmFtZSwgSUJpbmRlciBzZXJ2aWNlKSB7Ci0gICAgICAgICAgICAvLyBOb3RlIHRoYXQgaXQncyBhbHdheXMgbWFpbi10aHJlYWQuCi0gICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJvblNlcnZpY2VDb25uZWN0ZWQgIiArIG5hbWUgKyAiICIgKyB0aGlzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIFNhbml0eSBjaGVjawotICAgICAgICAgICAgaWYgKCFtVG9rZW4uZ2V0UGFja2FnZU5hbWUoKS5lcXVhbHMobmFtZS5nZXRQYWNrYWdlTmFtZSgpKSkgewotICAgICAgICAgICAgICAgIExvZy53dGYoVEFHLCBuYW1lICsgIiB3YXMgY29ubmVjdGVkLCBidXQgZXhwZWN0ZWQgcGtnPSIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgbVRva2VuLmdldFBhY2thZ2VOYW1lKCkgKyAiIHdpdGggaWQ9IiArIG1Ub2tlbi5nZXRJZCgpKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBzZXNzaW9uQmluZGVyID0gSU1lZGlhU2Vzc2lvbjIuU3R1Yi5hc0ludGVyZmFjZShzZXJ2aWNlKTsKLSAgICAgICAgICAgIGNvbm5lY3RUb1Nlc3Npb24oc2Vzc2lvbkJpbmRlcik7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25TZXJ2aWNlRGlzY29ubmVjdGVkKENvbXBvbmVudE5hbWUgbmFtZSkgewotICAgICAgICAgICAgLy8gVGVtcG9yYWwgbG9zZSBvZiB0aGUgYmluZGluZyBiZWNhdXNlIG9mIHRoZSBzZXJ2aWNlIGNyYXNoLiBTeXN0ZW0gd2lsbCBhdXRvbWF0aWNhbGx5Ci0gICAgICAgICAgICAvLyByZWJpbmQsIHNvIGp1c3Qgbm8tb3AuCi0gICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IFJlYWxseT8gRWl0aGVyIGRpc2Nvbm5lY3QgY2xlYW5seSBvcgotICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBzZXJ2aWNlICIgKyBuYW1lICsgIiBpcyBkaXNjb25uZWN0ZWQuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25CaW5kaW5nRGllZChDb21wb25lbnROYW1lIG5hbWUpIHsKLSAgICAgICAgICAgIC8vIFBlcm1hbmVudCBsb3NlIG9mIHRoZSBiaW5kaW5nIGJlY2F1c2Ugb2YgdGhlIHNlcnZpY2UgcGFja2FnZSB1cGRhdGUgb3IgcmVtb3ZlZC4KLSAgICAgICAgICAgIC8vIFRoaXMgU2Vzc2lvblNlcnZpY2VSZWNvcmQgd2lsbCBiZSByZW1vdmVkIGFjY29yZGluZ2x5LCBidXQgZm9yZ2V0IHNlc3Npb24gYmluZGVyIGhlcmUKLSAgICAgICAgICAgIC8vIGZvciBzdXJlLgotICAgICAgICAgICAgbUluc3RhbmNlLmNsb3NlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFBsYXliYWNrSW5mb0ltcGwgaW1wbGVtZW50cyBQbGF5YmFja0luZm9Qcm92aWRlciB7Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9QTEFZQkFDS19UWVBFID0KLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5tZWRpYS5wbGF5YmFja2luZm9faW1wbC5wbGF5YmFja190eXBlIjsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9DT05UUk9MX1RZUEUgPQotICAgICAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhLnBsYXliYWNraW5mb19pbXBsLmNvbnRyb2xfdHlwZSI7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfTUFYX1ZPTFVNRSA9Ci0gICAgICAgICAgICAgICAgImFuZHJvaWQubWVkaWEucGxheWJhY2tpbmZvX2ltcGwubWF4X3ZvbHVtZSI7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQ1VSUkVOVF9WT0xVTUUgPQotICAgICAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhLnBsYXliYWNraW5mb19pbXBsLmN1cnJlbnRfdm9sdW1lIjsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9BVURJT19BVFRSSUJVVEVTID0KLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5tZWRpYS5wbGF5YmFja2luZm9faW1wbC5hdWRpb19hdHRycyI7Ci0KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBQbGF5YmFja0luZm8gbUluc3RhbmNlOwotCi0gICAgICAgIHByaXZhdGUgZmluYWwgaW50IG1QbGF5YmFja1R5cGU7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgaW50IG1Db250cm9sVHlwZTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbU1heFZvbHVtZTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbUN1cnJlbnRWb2x1bWU7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgQXVkaW9BdHRyaWJ1dGVzIG1BdWRpb0F0dHJzOwotCi0gICAgICAgIHByaXZhdGUgUGxheWJhY2tJbmZvSW1wbChpbnQgcGxheWJhY2tUeXBlLCBBdWRpb0F0dHJpYnV0ZXMgYXR0cnMsIGludCBjb250cm9sVHlwZSwKLSAgICAgICAgICAgICAgICBpbnQgbWF4LCBpbnQgY3VycmVudCkgewotICAgICAgICAgICAgbVBsYXliYWNrVHlwZSA9IHBsYXliYWNrVHlwZTsKLSAgICAgICAgICAgIG1BdWRpb0F0dHJzID0gYXR0cnM7Ci0gICAgICAgICAgICBtQ29udHJvbFR5cGUgPSBjb250cm9sVHlwZTsKLSAgICAgICAgICAgIG1NYXhWb2x1bWUgPSBtYXg7Ci0gICAgICAgICAgICBtQ3VycmVudFZvbHVtZSA9IGN1cnJlbnQ7Ci0gICAgICAgICAgICBtSW5zdGFuY2UgPSBuZXcgUGxheWJhY2tJbmZvKHRoaXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0UGxheWJhY2tUeXBlX2ltcGwoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVBsYXliYWNrVHlwZTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQXVkaW9BdHRyaWJ1dGVzIGdldEF1ZGlvQXR0cmlidXRlc19pbXBsKCkgewotICAgICAgICAgICAgcmV0dXJuIG1BdWRpb0F0dHJzOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0Q29udHJvbFR5cGVfaW1wbCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtQ29udHJvbFR5cGU7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGludCBnZXRNYXhWb2x1bWVfaW1wbCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtTWF4Vm9sdW1lOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0Q3VycmVudFZvbHVtZV9pbXBsKCkgewotICAgICAgICAgICAgcmV0dXJuIG1DdXJyZW50Vm9sdW1lOwotICAgICAgICB9Ci0KLSAgICAgICAgUGxheWJhY2tJbmZvIGdldEluc3RhbmNlKCkgewotICAgICAgICAgICAgcmV0dXJuIG1JbnN0YW5jZTsKLSAgICAgICAgfQotCi0gICAgICAgIEJ1bmRsZSB0b0J1bmRsZSgpIHsKLSAgICAgICAgICAgIEJ1bmRsZSBidW5kbGUgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgICAgICBidW5kbGUucHV0SW50KEtFWV9QTEFZQkFDS19UWVBFLCBtUGxheWJhY2tUeXBlKTsKLSAgICAgICAgICAgIGJ1bmRsZS5wdXRJbnQoS0VZX0NPTlRST0xfVFlQRSwgbUNvbnRyb2xUeXBlKTsKLSAgICAgICAgICAgIGJ1bmRsZS5wdXRJbnQoS0VZX01BWF9WT0xVTUUsIG1NYXhWb2x1bWUpOwotICAgICAgICAgICAgYnVuZGxlLnB1dEludChLRVlfQ1VSUkVOVF9WT0xVTUUsIG1DdXJyZW50Vm9sdW1lKTsKLSAgICAgICAgICAgIGJ1bmRsZS5wdXRQYXJjZWxhYmxlKEtFWV9BVURJT19BVFRSSUJVVEVTLCBtQXVkaW9BdHRycyk7Ci0gICAgICAgICAgICByZXR1cm4gYnVuZGxlOwotICAgICAgICB9Ci0KLSAgICAgICAgc3RhdGljIFBsYXliYWNrSW5mbyBjcmVhdGVQbGF5YmFja0luZm8oaW50IHBsYXliYWNrVHlwZSwgQXVkaW9BdHRyaWJ1dGVzIGF0dHJzLAotICAgICAgICAgICAgICAgIGludCBjb250cm9sVHlwZSwgaW50IG1heCwgaW50IGN1cnJlbnQpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgUGxheWJhY2tJbmZvSW1wbChwbGF5YmFja1R5cGUsIGF0dHJzLCBjb250cm9sVHlwZSwgbWF4LCBjdXJyZW50KQotICAgICAgICAgICAgICAgICAgICAuZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHN0YXRpYyBQbGF5YmFja0luZm8gZnJvbUJ1bmRsZShCdW5kbGUgYnVuZGxlKSB7Ci0gICAgICAgICAgICBpZiAoYnVuZGxlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsIGludCB2b2x1bWVUeXBlID0gYnVuZGxlLmdldEludChLRVlfUExBWUJBQ0tfVFlQRSk7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgdm9sdW1lQ29udHJvbCA9IGJ1bmRsZS5nZXRJbnQoS0VZX0NPTlRST0xfVFlQRSk7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgbWF4Vm9sdW1lID0gYnVuZGxlLmdldEludChLRVlfTUFYX1ZPTFVNRSk7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgY3VycmVudFZvbHVtZSA9IGJ1bmRsZS5nZXRJbnQoS0VZX0NVUlJFTlRfVk9MVU1FKTsKLSAgICAgICAgICAgIGZpbmFsIEF1ZGlvQXR0cmlidXRlcyBhdHRycyA9IGJ1bmRsZS5nZXRQYXJjZWxhYmxlKEtFWV9BVURJT19BVFRSSUJVVEVTKTsKLQotICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVBsYXliYWNrSW5mbyh2b2x1bWVUeXBlLCBhdHRycywgdm9sdW1lQ29udHJvbCwgbWF4Vm9sdW1lLCBjdXJyZW50Vm9sdW1lKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFDb250cm9sbGVyMlN0dWIuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFDb250cm9sbGVyMlN0dWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmNmYzVkZi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhQ29udHJvbGxlcjJTdHViLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NzAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5tZWRpYTsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUNvbnRyb2xsZXIyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFJdGVtMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTWV0YWRhdGEyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuU2Vzc2lvbkNvbW1hbmQyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uMi5Db21tYW5kQnV0dG9uOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuU2Vzc2lvbkNvbW1hbmRHcm91cDI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5SZXN1bHRSZWNlaXZlcjsKLWltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5NZWRpYUNvbnRyb2xsZXIySW1wbC5QbGF5YmFja0luZm9JbXBsOwotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvbjJJbXBsLkNvbW1hbmRCdXR0b25JbXBsOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBNZWRpYUNvbnRyb2xsZXIyU3R1YiBleHRlbmRzIElNZWRpYUNvbnRyb2xsZXIyLlN0dWIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTWVkaWFDb250cm9sbGVyMlN0dWIiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSB0cnVlOyAvLyBUT0RPKGphZXdhbik6IENoYW5nZQotCi0gICAgcHJpdmF0ZSBmaW5hbCBXZWFrUmVmZXJlbmNlPE1lZGlhQ29udHJvbGxlcjJJbXBsPiBtQ29udHJvbGxlcjsKLQotICAgIE1lZGlhQ29udHJvbGxlcjJTdHViKE1lZGlhQ29udHJvbGxlcjJJbXBsIGNvbnRyb2xsZXIpIHsKLSAgICAgICAgbUNvbnRyb2xsZXIgPSBuZXcgV2Vha1JlZmVyZW5jZTw+KGNvbnRyb2xsZXIpOwotICAgIH0KLQotICAgIHByaXZhdGUgTWVkaWFDb250cm9sbGVyMkltcGwgZ2V0Q29udHJvbGxlcigpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBNZWRpYUNvbnRyb2xsZXIySW1wbCBjb250cm9sbGVyID0gbUNvbnRyb2xsZXIuZ2V0KCk7Ci0gICAgICAgIGlmIChjb250cm9sbGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkNvbnRyb2xsZXIgaXMgcmVsZWFzZWQiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY29udHJvbGxlcjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIE1lZGlhQnJvd3NlcjJJbXBsIGdldEJyb3dzZXIoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgTWVkaWFDb250cm9sbGVyMkltcGwgY29udHJvbGxlciA9IGdldENvbnRyb2xsZXIoKTsKLSAgICAgICAgaWYgKGNvbnRyb2xsZXIgaW5zdGFuY2VvZiBNZWRpYUJyb3dzZXIySW1wbCkgewotICAgICAgICAgICAgcmV0dXJuIChNZWRpYUJyb3dzZXIySW1wbCkgY29udHJvbGxlcjsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkZXN0cm95KCkgewotICAgICAgICBtQ29udHJvbGxlci5jbGVhcigpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uUGxheWVyU3RhdGVDaGFuZ2VkKGludCBzdGF0ZSkgewotICAgICAgICBmaW5hbCBNZWRpYUNvbnRyb2xsZXIySW1wbCBjb250cm9sbGVyOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgY29udHJvbGxlciA9IGdldENvbnRyb2xsZXIoKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIkRvbid0IGZhaWwgc2lsZW50bHkgaGVyZS4gSGlnaGx5IGxpa2VseSBhIGJ1ZyIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGNvbnRyb2xsZXIucHVzaFBsYXllclN0YXRlQ2hhbmdlcyhzdGF0ZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25Qb3NpdGlvbkNoYW5nZWQobG9uZyBldmVudFRpbWVNcywgbG9uZyBwb3NpdGlvbk1zKSB7Ci0gICAgICAgIGZpbmFsIE1lZGlhQ29udHJvbGxlcjJJbXBsIGNvbnRyb2xsZXI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjb250cm9sbGVyID0gZ2V0Q29udHJvbGxlcigpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiRG9uJ3QgZmFpbCBzaWxlbnRseSBoZXJlLiBIaWdobHkgbGlrZWx5IGEgYnVnIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGV2ZW50VGltZU1zIDwgMCkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAib25Qb3NpdGlvbkNoYW5nZWQoKTogSWdub3JpbmcgbmVnYXRpdmUgZXZlbnRUaW1lTXMiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAocG9zaXRpb25NcyA8IDApIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIm9uUG9zaXRpb25DaGFuZ2VkKCk6IElnbm9yaW5nIG5lZ2F0aXZlIHBvc2l0aW9uTXMiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBjb250cm9sbGVyLnB1c2hQb3NpdGlvbkNoYW5nZXMoZXZlbnRUaW1lTXMsIHBvc2l0aW9uTXMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uUGxheWJhY2tTcGVlZENoYW5nZWQoZmxvYXQgc3BlZWQpIHsKLSAgICAgICAgZmluYWwgTWVkaWFDb250cm9sbGVyMkltcGwgY29udHJvbGxlcjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNvbnRyb2xsZXIgPSBnZXRDb250cm9sbGVyKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJEb24ndCBmYWlsIHNpbGVudGx5IGhlcmUuIEhpZ2hseSBsaWtlbHkgYSBidWciKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBjb250cm9sbGVyLnB1c2hQbGF5YmFja1NwZWVkQ2hhbmdlcyhzcGVlZCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25CdWZmZXJlZFBvc2l0aW9uQ2hhbmdlZChsb25nIGJ1ZmZlcmVkUG9zaXRpb25NcykgewotICAgICAgICBmaW5hbCBNZWRpYUNvbnRyb2xsZXIySW1wbCBjb250cm9sbGVyOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgY29udHJvbGxlciA9IGdldENvbnRyb2xsZXIoKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIkRvbid0IGZhaWwgc2lsZW50bHkgaGVyZS4gSGlnaGx5IGxpa2VseSBhIGJ1ZyIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChidWZmZXJlZFBvc2l0aW9uTXMgPCAwKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJvbkJ1ZmZlcmVkUG9zaXRpb25DaGFuZ2VkKCk6IElnbm9yaW5nIG5lZ2F0aXZlIGJ1ZmZlcmVkUG9zaXRpb25NcyIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGNvbnRyb2xsZXIucHVzaEJ1ZmZlcmVkUG9zaXRpb25DaGFuZ2VzKGJ1ZmZlcmVkUG9zaXRpb25Ncyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25QbGF5bGlzdENoYW5nZWQoTGlzdDxCdW5kbGU+IHBsYXlsaXN0QnVuZGxlLCBCdW5kbGUgbWV0YWRhdGFCdW5kbGUpIHsKLSAgICAgICAgZmluYWwgTWVkaWFDb250cm9sbGVyMkltcGwgY29udHJvbGxlcjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNvbnRyb2xsZXIgPSBnZXRDb250cm9sbGVyKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJEb24ndCBmYWlsIHNpbGVudGx5IGhlcmUuIEhpZ2hseSBsaWtlbHkgYSBidWciKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAocGxheWxpc3RCdW5kbGUgPT0gbnVsbCkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAib25QbGF5bGlzdENoYW5nZWQoKTogSWdub3JpbmcgbnVsbCBwbGF5bGlzdCBmcm9tICIgKyBjb250cm9sbGVyKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBMaXN0PE1lZGlhSXRlbTI+IHBsYXlsaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgIGZvciAoQnVuZGxlIGJ1bmRsZSA6IHBsYXlsaXN0QnVuZGxlKSB7Ci0gICAgICAgICAgICBNZWRpYUl0ZW0yIGl0ZW0gPSBNZWRpYUl0ZW0yLmZyb21CdW5kbGUoYnVuZGxlKTsKLSAgICAgICAgICAgIGlmIChpdGVtID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJvblBsYXlsaXN0Q2hhbmdlZCgpOiBJZ25vcmluZyBudWxsIGl0ZW0gaW4gcGxheWxpc3QiKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcGxheWxpc3QuYWRkKGl0ZW0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIE1lZGlhTWV0YWRhdGEyIG1ldGFkYXRhID0gTWVkaWFNZXRhZGF0YTIuZnJvbUJ1bmRsZShtZXRhZGF0YUJ1bmRsZSk7Ci0gICAgICAgIGNvbnRyb2xsZXIucHVzaFBsYXlsaXN0Q2hhbmdlcyhwbGF5bGlzdCwgbWV0YWRhdGEpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uUGxheWxpc3RNZXRhZGF0YUNoYW5nZWQoQnVuZGxlIG1ldGFkYXRhQnVuZGxlKSB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIE1lZGlhQ29udHJvbGxlcjJJbXBsIGNvbnRyb2xsZXI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjb250cm9sbGVyID0gZ2V0Q29udHJvbGxlcigpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiRG9uJ3QgZmFpbCBzaWxlbnRseSBoZXJlLiBIaWdobHkgbGlrZWx5IGEgYnVnIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEgPSBNZWRpYU1ldGFkYXRhMi5mcm9tQnVuZGxlKG1ldGFkYXRhQnVuZGxlKTsKLSAgICAgICAgY29udHJvbGxlci5wdXNoUGxheWxpc3RNZXRhZGF0YUNoYW5nZXMobWV0YWRhdGEpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uUmVwZWF0TW9kZUNoYW5nZWQoaW50IHJlcGVhdE1vZGUpIHsKLSAgICAgICAgZmluYWwgTWVkaWFDb250cm9sbGVyMkltcGwgY29udHJvbGxlcjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNvbnRyb2xsZXIgPSBnZXRDb250cm9sbGVyKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJEb24ndCBmYWlsIHNpbGVudGx5IGhlcmUuIEhpZ2hseSBsaWtlbHkgYSBidWciKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBjb250cm9sbGVyLnB1c2hSZXBlYXRNb2RlQ2hhbmdlcyhyZXBlYXRNb2RlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblBsYXliYWNrSW5mb0NoYW5nZWQoQnVuZGxlIHBsYXliYWNrSW5mbykgdGhyb3dzIFJ1bnRpbWVFeGNlcHRpb24gewotICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIm9uUGxheWJhY2tJbmZvQ2hhbmdlZCIpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIE1lZGlhQ29udHJvbGxlcjJJbXBsIGNvbnRyb2xsZXI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjb250cm9sbGVyID0gZ2V0Q29udHJvbGxlcigpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiRG9uJ3QgZmFpbCBzaWxlbnRseSBoZXJlLiBIaWdobHkgbGlrZWx5IGEgYnVnIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgTWVkaWFDb250cm9sbGVyMi5QbGF5YmFja0luZm8gaW5mbyA9IFBsYXliYWNrSW5mb0ltcGwuZnJvbUJ1bmRsZShwbGF5YmFja0luZm8pOwotICAgICAgICBpZiAoaW5mbyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJvblBsYXliYWNrSW5mb0NoYW5nZWQoKTogSWdub3JpbmcgbnVsbCBwbGF5YmFja0luZm8iKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBjb250cm9sbGVyLnB1c2hQbGF5YmFja0luZm9DaGFuZ2VzKGluZm8pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uU2h1ZmZsZU1vZGVDaGFuZ2VkKGludCBzaHVmZmxlTW9kZSkgewotICAgICAgICBmaW5hbCBNZWRpYUNvbnRyb2xsZXIySW1wbCBjb250cm9sbGVyOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgY29udHJvbGxlciA9IGdldENvbnRyb2xsZXIoKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIkRvbid0IGZhaWwgc2lsZW50bHkgaGVyZS4gSGlnaGx5IGxpa2VseSBhIGJ1ZyIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGNvbnRyb2xsZXIucHVzaFNodWZmbGVNb2RlQ2hhbmdlcyhzaHVmZmxlTW9kZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25FcnJvcihpbnQgZXJyb3JDb2RlLCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIGZpbmFsIE1lZGlhQ29udHJvbGxlcjJJbXBsIGNvbnRyb2xsZXI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjb250cm9sbGVyID0gZ2V0Q29udHJvbGxlcigpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiRG9uJ3QgZmFpbCBzaWxlbnRseSBoZXJlLiBIaWdobHkgbGlrZWx5IGEgYnVnIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgY29udHJvbGxlci5wdXNoRXJyb3IoZXJyb3JDb2RlLCBleHRyYXMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uQ29ubmVjdGVkKElNZWRpYVNlc3Npb24yIHNlc3Npb25CaW5kZXIsIEJ1bmRsZSBjb21tYW5kR3JvdXAsCi0gICAgICAgICAgICBpbnQgcGxheWVyU3RhdGUsIGxvbmcgcG9zaXRpb25FdmVudFRpbWVNcywgbG9uZyBwb3NpdGlvbk1zLCBmbG9hdCBwbGF5YmFja1NwZWVkLAotICAgICAgICAgICAgbG9uZyBidWZmZXJlZFBvc2l0aW9uTXMsIEJ1bmRsZSBwbGF5YmFja0luZm8sIGludCBzaHVmZmxlTW9kZSwgaW50IHJlcGVhdE1vZGUsCi0gICAgICAgICAgICBMaXN0PEJ1bmRsZT4gaXRlbUJ1bmRsZUxpc3QsIFBlbmRpbmdJbnRlbnQgc2Vzc2lvbkFjdGl2aXR5KSB7Ci0gICAgICAgIGZpbmFsIE1lZGlhQ29udHJvbGxlcjJJbXBsIGNvbnRyb2xsZXIgPSBtQ29udHJvbGxlci5nZXQoKTsKLSAgICAgICAgaWYgKGNvbnRyb2xsZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAib25Db25uZWN0ZWQgYWZ0ZXIgTWVkaWFDb250cm9sbGVyMi5jbG9zZSgpIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgQ29udGV4dCBjb250ZXh0ID0gY29udHJvbGxlci5nZXRDb250ZXh0KCk7Ci0gICAgICAgIExpc3Q8TWVkaWFJdGVtMj4gaXRlbUxpc3QgPSBudWxsOwotICAgICAgICBpZiAoaXRlbUJ1bmRsZUxpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgaXRlbUxpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlbUJ1bmRsZUxpc3Quc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBNZWRpYUl0ZW0yIGl0ZW0gPSBNZWRpYUl0ZW0yLmZyb21CdW5kbGUoaXRlbUJ1bmRsZUxpc3QuZ2V0KGkpKTsKLSAgICAgICAgICAgICAgICBpZiAoaXRlbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGl0ZW1MaXN0LmFkZChpdGVtKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY29udHJvbGxlci5vbkNvbm5lY3RlZE5vdExvY2tlZChzZXNzaW9uQmluZGVyLAotICAgICAgICAgICAgICAgIFNlc3Npb25Db21tYW5kR3JvdXAyLmZyb21CdW5kbGUoY29tbWFuZEdyb3VwKSwKLSAgICAgICAgICAgICAgICBwbGF5ZXJTdGF0ZSwgcG9zaXRpb25FdmVudFRpbWVNcywgcG9zaXRpb25NcywgcGxheWJhY2tTcGVlZCwgYnVmZmVyZWRQb3NpdGlvbk1zLAotICAgICAgICAgICAgICAgIFBsYXliYWNrSW5mb0ltcGwuZnJvbUJ1bmRsZShwbGF5YmFja0luZm8pLCByZXBlYXRNb2RlLCBzaHVmZmxlTW9kZSwKLSAgICAgICAgICAgICAgICBpdGVtTGlzdCwgc2Vzc2lvbkFjdGl2aXR5KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkRpc2Nvbm5lY3RlZCgpIHsKLSAgICAgICAgZmluYWwgTWVkaWFDb250cm9sbGVyMkltcGwgY29udHJvbGxlciA9IG1Db250cm9sbGVyLmdldCgpOwotICAgICAgICBpZiAoY29udHJvbGxlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJvbkRpc2Nvbm5lY3RlZCBhZnRlciBNZWRpYUNvbnRyb2xsZXIyLmNsb3NlKCkiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBjb250cm9sbGVyLmdldEluc3RhbmNlKCkuY2xvc2UoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkN1c3RvbUxheW91dENoYW5nZWQoTGlzdDxCdW5kbGU+IGNvbW1hbmRCdXR0b25saXN0KSB7Ci0gICAgICAgIGlmIChjb21tYW5kQnV0dG9ubGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJvbkN1c3RvbUxheW91dENoYW5nZWQoKTogSWdub3JpbmcgbnVsbCBjb21tYW5kQnV0dG9ubGlzdCIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIE1lZGlhQ29udHJvbGxlcjJJbXBsIGNvbnRyb2xsZXI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjb250cm9sbGVyID0gZ2V0Q29udHJvbGxlcigpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiRG9uJ3QgZmFpbCBzaWxlbnRseSBoZXJlLiBIaWdobHkgbGlrZWx5IGEgYnVnIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNvbnRyb2xsZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBSZXZpc2l0IGhlcmUuIENvdWxkIGJlIGEgYnVnCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgTGlzdDxDb21tYW5kQnV0dG9uPiBsYXlvdXQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb21tYW5kQnV0dG9ubGlzdC5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgQ29tbWFuZEJ1dHRvbiBidXR0b24gPSBDb21tYW5kQnV0dG9uSW1wbC5mcm9tQnVuZGxlKGNvbW1hbmRCdXR0b25saXN0LmdldChpKSk7Ci0gICAgICAgICAgICBpZiAoYnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBsYXlvdXQuYWRkKGJ1dHRvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY29udHJvbGxlci5vbkN1c3RvbUxheW91dENoYW5nZWQobGF5b3V0KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkFsbG93ZWRDb21tYW5kc0NoYW5nZWQoQnVuZGxlIGNvbW1hbmRzQnVuZGxlKSB7Ci0gICAgICAgIGZpbmFsIE1lZGlhQ29udHJvbGxlcjJJbXBsIGNvbnRyb2xsZXI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjb250cm9sbGVyID0gZ2V0Q29udHJvbGxlcigpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiRG9uJ3QgZmFpbCBzaWxlbnRseSBoZXJlLiBIaWdobHkgbGlrZWx5IGEgYnVnIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNvbnRyb2xsZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBSZXZpc2l0IGhlcmUuIENvdWxkIGJlIGEgYnVnCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgU2Vzc2lvbkNvbW1hbmRHcm91cDIgY29tbWFuZHMgPSBTZXNzaW9uQ29tbWFuZEdyb3VwMi5mcm9tQnVuZGxlKGNvbW1hbmRzQnVuZGxlKTsKLSAgICAgICAgaWYgKGNvbW1hbmRzID09IG51bGwpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIm9uQWxsb3dlZENvbW1hbmRzQ2hhbmdlZCgpOiBJZ25vcmluZyBudWxsIGNvbW1hbmRzIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgY29udHJvbGxlci5vbkFsbG93ZWRDb21tYW5kc0NoYW5nZWQoY29tbWFuZHMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uQ3VzdG9tQ29tbWFuZChCdW5kbGUgY29tbWFuZEJ1bmRsZSwgQnVuZGxlIGFyZ3MsIFJlc3VsdFJlY2VpdmVyIHJlY2VpdmVyKSB7Ci0gICAgICAgIGZpbmFsIE1lZGlhQ29udHJvbGxlcjJJbXBsIGNvbnRyb2xsZXI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjb250cm9sbGVyID0gZ2V0Q29udHJvbGxlcigpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiRG9uJ3QgZmFpbCBzaWxlbnRseSBoZXJlLiBIaWdobHkgbGlrZWx5IGEgYnVnIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgU2Vzc2lvbkNvbW1hbmQyIGNvbW1hbmQgPSBTZXNzaW9uQ29tbWFuZDIuZnJvbUJ1bmRsZShjb21tYW5kQnVuZGxlKTsKLSAgICAgICAgaWYgKGNvbW1hbmQgPT0gbnVsbCkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAib25DdXN0b21Db21tYW5kKCk6IElnbm9yaW5nIG51bGwgY29tbWFuZCIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGNvbnRyb2xsZXIub25DdXN0b21Db21tYW5kKGNvbW1hbmQsIGFyZ3MsIHJlY2VpdmVyKTsKLSAgICB9Ci0KLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIC8vIE1lZGlhQnJvd3NlciBzcGVjaWZpYwotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25HZXRMaWJyYXJ5Um9vdERvbmUoQnVuZGxlIHJvb3RIaW50cywgU3RyaW5nIHJvb3RNZWRpYUlkLCBCdW5kbGUgcm9vdEV4dHJhKQotICAgICAgICAgICAgdGhyb3dzIFJ1bnRpbWVFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBNZWRpYUJyb3dzZXIySW1wbCBicm93c2VyOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnJvd3NlciA9IGdldEJyb3dzZXIoKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIkRvbid0IGZhaWwgc2lsZW50bHkgaGVyZS4gSGlnaGx5IGxpa2VseSBhIGJ1ZyIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChicm93c2VyID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogUmV2aXNpdCBoZXJlLiBDb3VsZCBiZSBhIGJ1ZwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGJyb3dzZXIub25HZXRMaWJyYXJ5Um9vdERvbmUocm9vdEhpbnRzLCByb290TWVkaWFJZCwgcm9vdEV4dHJhKTsKLSAgICB9Ci0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uR2V0SXRlbURvbmUoU3RyaW5nIG1lZGlhSWQsIEJ1bmRsZSBpdGVtQnVuZGxlKSB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChtZWRpYUlkID09IG51bGwpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIm9uR2V0SXRlbURvbmUoKTogSWdub3JpbmcgbnVsbCBtZWRpYUlkIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgTWVkaWFCcm93c2VyMkltcGwgYnJvd3NlcjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJyb3dzZXIgPSBnZXRCcm93c2VyKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJEb24ndCBmYWlsIHNpbGVudGx5IGhlcmUuIEhpZ2hseSBsaWtlbHkgYSBidWciKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoYnJvd3NlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IFJldmlzaXQgaGVyZS4gQ291bGQgYmUgYSBidWcKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBicm93c2VyLm9uR2V0SXRlbURvbmUobWVkaWFJZCwgTWVkaWFJdGVtMi5mcm9tQnVuZGxlKGl0ZW1CdW5kbGUpKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkdldENoaWxkcmVuRG9uZShTdHJpbmcgcGFyZW50SWQsIGludCBwYWdlLCBpbnQgcGFnZVNpemUsCi0gICAgICAgICAgICBMaXN0PEJ1bmRsZT4gaXRlbUJ1bmRsZUxpc3QsIEJ1bmRsZSBleHRyYXMpIHRocm93cyBSdW50aW1lRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHBhcmVudElkID09IG51bGwpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIm9uR2V0Q2hpbGRyZW5Eb25lKCk6IElnbm9yaW5nIG51bGwgcGFyZW50SWQiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBNZWRpYUJyb3dzZXIySW1wbCBicm93c2VyOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnJvd3NlciA9IGdldEJyb3dzZXIoKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIkRvbid0IGZhaWwgc2lsZW50bHkgaGVyZS4gSGlnaGx5IGxpa2VseSBhIGJ1ZyIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChicm93c2VyID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogUmV2aXNpdCBoZXJlLiBDb3VsZCBiZSBhIGJ1ZwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgTGlzdDxNZWRpYUl0ZW0yPiByZXN1bHQgPSBudWxsOwotICAgICAgICBpZiAoaXRlbUJ1bmRsZUxpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgcmVzdWx0ID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgICAgICBmb3IgKEJ1bmRsZSBidW5kbGUgOiBpdGVtQnVuZGxlTGlzdCkgewotICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQoTWVkaWFJdGVtMi5mcm9tQnVuZGxlKGJ1bmRsZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJyb3dzZXIub25HZXRDaGlsZHJlbkRvbmUocGFyZW50SWQsIHBhZ2UsIHBhZ2VTaXplLCByZXN1bHQsIGV4dHJhcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25TZWFyY2hSZXN1bHRDaGFuZ2VkKFN0cmluZyBxdWVyeSwgaW50IGl0ZW1Db3VudCwgQnVuZGxlIGV4dHJhcykKLSAgICAgICAgICAgIHRocm93cyBSdW50aW1lRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHF1ZXJ5KSkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAib25TZWFyY2hSZXN1bHRDaGFuZ2VkKCk6IElnbm9yaW5nIGVtcHR5IHF1ZXJ5Iik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgTWVkaWFCcm93c2VyMkltcGwgYnJvd3NlcjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJyb3dzZXIgPSBnZXRCcm93c2VyKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJEb24ndCBmYWlsIHNpbGVudGx5IGhlcmUuIEhpZ2hseSBsaWtlbHkgYSBidWciKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoYnJvd3NlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IFJldmlzaXQgaGVyZS4gQ291bGQgYmUgYSBidWcKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBicm93c2VyLm9uU2VhcmNoUmVzdWx0Q2hhbmdlZChxdWVyeSwgaXRlbUNvdW50LCBleHRyYXMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uR2V0U2VhcmNoUmVzdWx0RG9uZShTdHJpbmcgcXVlcnksIGludCBwYWdlLCBpbnQgcGFnZVNpemUsCi0gICAgICAgICAgICBMaXN0PEJ1bmRsZT4gaXRlbUJ1bmRsZUxpc3QsIEJ1bmRsZSBleHRyYXMpIHRocm93cyBSdW50aW1lRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHF1ZXJ5KSkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAib25HZXRTZWFyY2hSZXN1bHREb25lKCk6IElnbm9yaW5nIGVtcHR5IHF1ZXJ5Iik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgTWVkaWFCcm93c2VyMkltcGwgYnJvd3NlcjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJyb3dzZXIgPSBnZXRCcm93c2VyKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJEb24ndCBmYWlsIHNpbGVudGx5IGhlcmUuIEhpZ2hseSBsaWtlbHkgYSBidWciKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoYnJvd3NlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IFJldmlzaXQgaGVyZS4gQ291bGQgYmUgYSBidWcKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIExpc3Q8TWVkaWFJdGVtMj4gcmVzdWx0ID0gbnVsbDsKLSAgICAgICAgaWYgKGl0ZW1CdW5kbGVMaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICAgICAgZm9yIChCdW5kbGUgYnVuZGxlIDogaXRlbUJ1bmRsZUxpc3QpIHsKLSAgICAgICAgICAgICAgICByZXN1bHQuYWRkKE1lZGlhSXRlbTIuZnJvbUJ1bmRsZShidW5kbGUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBicm93c2VyLm9uR2V0U2VhcmNoUmVzdWx0RG9uZShxdWVyeSwgcGFnZSwgcGFnZVNpemUsIHJlc3VsdCwgZXh0cmFzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkNoaWxkcmVuQ2hhbmdlZChTdHJpbmcgcGFyZW50SWQsIGludCBpdGVtQ291bnQsIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgaWYgKHBhcmVudElkID09IG51bGwpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIm9uQ2hpbGRyZW5DaGFuZ2VkKCk6IElnbm9yaW5nIG51bGwgcGFyZW50SWQiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBNZWRpYUJyb3dzZXIySW1wbCBicm93c2VyOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnJvd3NlciA9IGdldEJyb3dzZXIoKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIkRvbid0IGZhaWwgc2lsZW50bHkgaGVyZS4gSGlnaGx5IGxpa2VseSBhIGJ1ZyIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChicm93c2VyID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogUmV2aXNpdCBoZXJlLiBDb3VsZCBiZSBhIGJ1ZwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGJyb3dzZXIub25DaGlsZHJlbkNoYW5nZWQocGFyZW50SWQsIGl0ZW1Db3VudCwgZXh0cmFzKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhSXRlbTJJbXBsLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhSXRlbTJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxMGEwZjEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYUl0ZW0ySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQubWVkaWE7Ci0KLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5NZWRpYUl0ZW0yLkZMQUdfQlJPV1NBQkxFOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLk1lZGlhSXRlbTIuRkxBR19QTEFZQUJMRTsKLQotaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5Ob25OdWxsOwotaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5OdWxsYWJsZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkRhdGFTb3VyY2VEZXNjOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFJdGVtMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhSXRlbTIuQnVpbGRlcjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhSXRlbTIuRmxhZ3M7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYU1ldGFkYXRhMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5NZWRpYUl0ZW0yUHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKLQotaW1wb3J0IGphdmEudXRpbC5VVUlEOwotCi1wdWJsaWMgY2xhc3MgTWVkaWFJdGVtMkltcGwgaW1wbGVtZW50cyBNZWRpYUl0ZW0yUHJvdmlkZXIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfSUQgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYWl0ZW0yLmlkIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0ZMQUdTID0gImFuZHJvaWQubWVkaWEubWVkaWFpdGVtMi5mbGFncyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9NRVRBREFUQSA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhaXRlbTIubWV0YWRhdGEiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfVVVJRCA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhaXRlbTIudXVpZCI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIE1lZGlhSXRlbTIgbUluc3RhbmNlOwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1JZDsKLSAgICBwcml2YXRlIGZpbmFsIGludCBtRmxhZ3M7Ci0gICAgcHJpdmF0ZSBmaW5hbCBVVUlEIG1VVUlEOwotICAgIHByaXZhdGUgTWVkaWFNZXRhZGF0YTIgbU1ldGFkYXRhOwotICAgIHByaXZhdGUgRGF0YVNvdXJjZURlc2MgbURhdGFTb3VyY2VEZXNjOwotCi0gICAgLy8gRnJvbSB0aGUgcHVibGljIEFQSQotICAgIHB1YmxpYyBNZWRpYUl0ZW0ySW1wbChATm9uTnVsbCBTdHJpbmcgbWVkaWFJZCwgQE51bGxhYmxlIERhdGFTb3VyY2VEZXNjIGRzZCwKLSAgICAgICAgICAgIEBOdWxsYWJsZSBNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSwgQEZsYWdzIGludCBmbGFncykgewotICAgICAgICB0aGlzKG1lZGlhSWQsIGRzZCwgbWV0YWRhdGEsIGZsYWdzLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIE1lZGlhSXRlbTJJbXBsKEBOb25OdWxsIFN0cmluZyBtZWRpYUlkLCBATnVsbGFibGUgRGF0YVNvdXJjZURlc2MgZHNkLAotICAgICAgICAgICAgQE51bGxhYmxlIE1lZGlhTWV0YWRhdGEyIG1ldGFkYXRhLCBARmxhZ3MgaW50IGZsYWdzLCBATnVsbGFibGUgVVVJRCB1dWlkKSB7Ci0gICAgICAgIGlmIChtZWRpYUlkID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm1lZGlhSWQgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobWV0YWRhdGEgIT0gbnVsbCAmJiAhVGV4dFV0aWxzLmVxdWFscyhtZWRpYUlkLCBtZXRhZGF0YS5nZXRNZWRpYUlkKCkpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJtZXRhZGF0YSdzIGlkIHNob3VsZCBiZSBtYXRjaGVkIHdpdGggdGhlIG1lZGlhaWQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1JZCA9IG1lZGlhSWQ7Ci0gICAgICAgIG1EYXRhU291cmNlRGVzYyA9IGRzZDsKLSAgICAgICAgbU1ldGFkYXRhID0gbWV0YWRhdGE7Ci0gICAgICAgIG1GbGFncyA9IGZsYWdzOwotICAgICAgICBtVVVJRCA9ICh1dWlkID09IG51bGwpID8gVVVJRC5yYW5kb21VVUlEKCkgOiB1dWlkOwotCi0gICAgICAgIG1JbnN0YW5jZSA9IG5ldyBNZWRpYUl0ZW0yKHRoaXMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFsc19pbXBsKE9iamVjdCBvYmopIHsKLSAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgTWVkaWFJdGVtMikpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBNZWRpYUl0ZW0yIG90aGVyID0gKE1lZGlhSXRlbTIpIG9iajsKLSAgICAgICAgcmV0dXJuIG1VVUlELmVxdWFscygoKE1lZGlhSXRlbTJJbXBsKSBvdGhlci5nZXRQcm92aWRlcigpKS5tVVVJRCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoaXMgb2JqZWN0IGFzIGEgYnVuZGxlIHRvIHNoYXJlIGJldHdlZW4gcHJvY2Vzc2VzLgotICAgICAqCi0gICAgICogQHJldHVybiBhIG5ldyBidW5kbGUgaW5zdGFuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgQnVuZGxlIHRvQnVuZGxlX2ltcGwoKSB7Ci0gICAgICAgIEJ1bmRsZSBidW5kbGUgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgIGJ1bmRsZS5wdXRTdHJpbmcoS0VZX0lELCBtSWQpOwotICAgICAgICBidW5kbGUucHV0SW50KEtFWV9GTEFHUywgbUZsYWdzKTsKLSAgICAgICAgaWYgKG1NZXRhZGF0YSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBidW5kbGUucHV0QnVuZGxlKEtFWV9NRVRBREFUQSwgbU1ldGFkYXRhLnRvQnVuZGxlKCkpOwotICAgICAgICB9Ci0gICAgICAgIGJ1bmRsZS5wdXRTdHJpbmcoS0VZX1VVSUQsIG1VVUlELnRvU3RyaW5nKCkpOwotICAgICAgICByZXR1cm4gYnVuZGxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIE1lZGlhSXRlbTIgZnJvbSB0aGUge0BsaW5rIEJ1bmRsZX0uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYnVuZGxlIFRoZSBidW5kbGUgd2hpY2ggd2FzIHB1Ymxpc2hlZCBieSB7QGxpbmsgTWVkaWFJdGVtMiN0b0J1bmRsZSgpfS4KLSAgICAgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIE1lZGlhSXRlbTIKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE1lZGlhSXRlbTIgZnJvbUJ1bmRsZV9pbXBsKEBOb25OdWxsIEJ1bmRsZSBidW5kbGUpIHsKLSAgICAgICAgaWYgKGJ1bmRsZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBTdHJpbmcgdXVpZFN0cmluZyA9IGJ1bmRsZS5nZXRTdHJpbmcoS0VZX1VVSUQpOwotICAgICAgICByZXR1cm4gZnJvbUJ1bmRsZShidW5kbGUsIFVVSUQuZnJvbVN0cmluZyh1dWlkU3RyaW5nKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgTWVkaWFJdGVtMiBmcm9tIHRoZSB7QGxpbmsgQnVuZGxlfSB3aXRoIHRoZSBzcGVjaWZpZWQge0BsaW5rIFVVSUR9LgotICAgICAqIElmIHtAbGluayBVVUlEfQotICAgICAqIGNhbiBiZSBudWxsIGZvciBjcmVhdGluZyBuZXcuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYnVuZGxlIFRoZSBidW5kbGUgd2hpY2ggd2FzIHB1Ymxpc2hlZCBieSB7QGxpbmsgTWVkaWFJdGVtMiN0b0J1bmRsZSgpfS4KLSAgICAgKiBAcGFyYW0gdXVpZCBBIHtAbGluayBVVUlEfSB0byBvdmVycmlkZS4gQ2FuIGJlIHtAbGluayBudWxsfSBmb3Igb3ZlcnJpZGUuCi0gICAgICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCBNZWRpYUl0ZW0yCi0gICAgICovCi0gICAgc3RhdGljIE1lZGlhSXRlbTIgZnJvbUJ1bmRsZShATm9uTnVsbCBCdW5kbGUgYnVuZGxlLCBATnVsbGFibGUgVVVJRCB1dWlkKSB7Ci0gICAgICAgIGlmIChidW5kbGUgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgU3RyaW5nIGlkID0gYnVuZGxlLmdldFN0cmluZyhLRVlfSUQpOwotICAgICAgICBmaW5hbCBCdW5kbGUgbWV0YWRhdGFCdW5kbGUgPSBidW5kbGUuZ2V0QnVuZGxlKEtFWV9NRVRBREFUQSk7Ci0gICAgICAgIGZpbmFsIE1lZGlhTWV0YWRhdGEyIG1ldGFkYXRhID0gTWVkaWFNZXRhZGF0YTIuZnJvbUJ1bmRsZShtZXRhZGF0YUJ1bmRsZSk7Ci0gICAgICAgIGZpbmFsIGludCBmbGFncyA9IGJ1bmRsZS5nZXRJbnQoS0VZX0ZMQUdTKTsKLSAgICAgICAgcmV0dXJuIG5ldyBNZWRpYUl0ZW0ySW1wbChpZCwgbnVsbCwgbWV0YWRhdGEsIGZsYWdzLCB1dWlkKS5nZXRJbnN0YW5jZSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgTWVkaWFJdGVtMiBnZXRJbnN0YW5jZSgpIHsKLSAgICAgICAgcmV0dXJuIG1JbnN0YW5jZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nX2ltcGwoKSB7Ci0gICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigiTWVkaWFJdGVtMnsiKTsKLSAgICAgICAgc2IuYXBwZW5kKCJtRmxhZ3M9IikuYXBwZW5kKG1GbGFncyk7Ci0gICAgICAgIHNiLmFwcGVuZCgiLCBtTWV0YWRhdGE9IikuYXBwZW5kKG1NZXRhZGF0YSk7Ci0gICAgICAgIHNiLmFwcGVuZCgnfScpOwotICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQEZsYWdzIGludCBnZXRGbGFnc19pbXBsKCkgewotICAgICAgICByZXR1cm4gbUZsYWdzOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzQnJvd3NhYmxlX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiAobUZsYWdzICYgRkxBR19CUk9XU0FCTEUpICE9IDA7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNQbGF5YWJsZV9pbXBsKCkgewotICAgICAgICByZXR1cm4gKG1GbGFncyAmIEZMQUdfUExBWUFCTEUpICE9IDA7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0TWV0YWRhdGFfaW1wbChATnVsbGFibGUgTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEpIHsKLSAgICAgICAgaWYgKG1ldGFkYXRhICE9IG51bGwgJiYgIVRleHRVdGlscy5lcXVhbHMobUlkLCBtZXRhZGF0YS5nZXRNZWRpYUlkKCkpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJtZXRhZGF0YSdzIGlkIHNob3VsZCBiZSBtYXRjaGVkIHdpdGggdGhlIG1lZGlhSWQiKTsKLSAgICAgICAgfQotICAgICAgICBtTWV0YWRhdGEgPSBtZXRhZGF0YTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQE51bGxhYmxlIE1lZGlhTWV0YWRhdGEyIGdldE1ldGFkYXRhX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtTWV0YWRhdGE7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEBOb25OdWxsIFN0cmluZyBnZXRNZWRpYUlkX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtSWQ7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEBOdWxsYWJsZSBEYXRhU291cmNlRGVzYyBnZXREYXRhU291cmNlRGVzY19pbXBsKCkgewotICAgICAgICByZXR1cm4gbURhdGFTb3VyY2VEZXNjOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQnVpbGRlckltcGwgaW1wbGVtZW50cyBNZWRpYUl0ZW0yUHJvdmlkZXIuQnVpbGRlclByb3ZpZGVyIHsKLSAgICAgICAgcHJpdmF0ZSBCdWlsZGVyIG1JbnN0YW5jZTsKLSAgICAgICAgcHJpdmF0ZSBARmxhZ3MgaW50IG1GbGFnczsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbU1lZGlhSWQ7Ci0gICAgICAgIHByaXZhdGUgTWVkaWFNZXRhZGF0YTIgbU1ldGFkYXRhOwotICAgICAgICBwcml2YXRlIERhdGFTb3VyY2VEZXNjIG1EYXRhU291cmNlRGVzYzsKLQotICAgICAgICBwdWJsaWMgQnVpbGRlckltcGwoQnVpbGRlciBpbnN0YW5jZSwgaW50IGZsYWdzKSB7Ci0gICAgICAgICAgICBtSW5zdGFuY2UgPSBpbnN0YW5jZTsKLSAgICAgICAgICAgIG1GbGFncyA9IGZsYWdzOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldE1lZGlhSWRfaW1wbChATnVsbGFibGUgU3RyaW5nIG1lZGlhSWQpIHsKLSAgICAgICAgICAgIG1NZWRpYUlkID0gbWVkaWFJZDsKLSAgICAgICAgICAgIHJldHVybiBtSW5zdGFuY2U7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0TWV0YWRhdGFfaW1wbChATnVsbGFibGUgTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEpIHsKLSAgICAgICAgICAgIG1NZXRhZGF0YSA9IG1ldGFkYXRhOwotICAgICAgICAgICAgcmV0dXJuIG1JbnN0YW5jZTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXREYXRhU291cmNlRGVzY19pbXBsKEBOdWxsYWJsZSBEYXRhU291cmNlRGVzYyBkYXRhU291cmNlRGVzYykgewotICAgICAgICAgICAgbURhdGFTb3VyY2VEZXNjID0gZGF0YVNvdXJjZURlc2M7Ci0gICAgICAgICAgICByZXR1cm4gbUluc3RhbmNlOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBNZWRpYUl0ZW0yIGJ1aWxkX2ltcGwoKSB7Ci0gICAgICAgICAgICBTdHJpbmcgaWQgPSAobU1ldGFkYXRhICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgID8gbU1ldGFkYXRhLmdldFN0cmluZyhNZWRpYU1ldGFkYXRhMi5NRVRBREFUQV9LRVlfTUVESUFfSUQpIDogbnVsbDsKLSAgICAgICAgICAgIGlmIChpZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gIFRPRE8oamFld2FuKTogRG91YmxlIGNoZWNrIGlmIGl0cyBzdWZmaWNpZW50IChlLmcuIFVzZSBVVUlEIGluc3RlYWQ/KQotICAgICAgICAgICAgICAgIGlkID0gKG1NZWRpYUlkICE9IG51bGwpID8gbU1lZGlhSWQgOiB0b1N0cmluZygpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG5ldyBNZWRpYUl0ZW0ySW1wbChpZCwgbURhdGFTb3VyY2VEZXNjLCBtTWV0YWRhdGEsIG1GbGFncykuZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFMaWJyYXJ5U2VydmljZTJJbXBsLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhTGlicmFyeVNlcnZpY2UySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjM0Y2Q0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFMaWJyYXJ5U2VydmljZTJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5tZWRpYTsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUxpYnJhcnlTZXJ2aWNlMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTGlicmFyeVNlcnZpY2UyLkxpYnJhcnlSb290OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFMaWJyYXJ5U2VydmljZTIuTWVkaWFMaWJyYXJ5U2Vzc2lvbjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTGlicmFyeVNlcnZpY2UyLk1lZGlhTGlicmFyeVNlc3Npb24uQnVpbGRlcjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTGlicmFyeVNlcnZpY2UyLk1lZGlhTGlicmFyeVNlc3Npb24uTWVkaWFMaWJyYXJ5U2Vzc2lvbkNhbGxiYWNrOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXJCYXNlOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5bGlzdEFnZW50OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvbjIuQ29udHJvbGxlckluZm87Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb25TZXJ2aWNlMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlNlc3Npb25Ub2tlbjI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5Wb2x1bWVQcm92aWRlcjI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuTWVkaWFMaWJyYXJ5U2VydmljZTJQcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwotCi1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uMkltcGwuQnVpbGRlckJhc2VJbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3I7Ci0KLXB1YmxpYyBjbGFzcyBNZWRpYUxpYnJhcnlTZXJ2aWNlMkltcGwgZXh0ZW5kcyBNZWRpYVNlc3Npb25TZXJ2aWNlMkltcGwgaW1wbGVtZW50cwotICAgICAgICBNZWRpYUxpYnJhcnlTZXJ2aWNlMlByb3ZpZGVyIHsKLSAgICBwcml2YXRlIGZpbmFsIE1lZGlhU2Vzc2lvblNlcnZpY2UyIG1JbnN0YW5jZTsKLSAgICBwcml2YXRlIE1lZGlhTGlicmFyeVNlc3Npb24gbUxpYnJhcnlTZXNzaW9uOwotCi0gICAgcHVibGljIE1lZGlhTGlicmFyeVNlcnZpY2UySW1wbChNZWRpYUxpYnJhcnlTZXJ2aWNlMiBpbnN0YW5jZSkgewotICAgICAgICBzdXBlcihpbnN0YW5jZSk7Ci0gICAgICAgIG1JbnN0YW5jZSA9IGluc3RhbmNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlX2ltcGwoKSB7Ci0gICAgICAgIHN1cGVyLm9uQ3JlYXRlX2ltcGwoKTsKLQotICAgICAgICAvLyBFZmZlY3RpdmVseSBmaW5hbAotICAgICAgICBNZWRpYVNlc3Npb24yIHNlc3Npb24gPSBnZXRTZXNzaW9uKCk7Ci0gICAgICAgIGlmICghKHNlc3Npb24gaW5zdGFuY2VvZiBNZWRpYUxpYnJhcnlTZXNzaW9uKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkV4cGVjdGVkIE1lZGlhTGlicmFyeVNlc3Npb24sIGJ1dCByZXR1cm5lZCBNZWRpYVNlc3Npb24yIik7Ci0gICAgICAgIH0KLSAgICAgICAgbUxpYnJhcnlTZXNzaW9uID0gKE1lZGlhTGlicmFyeVNlc3Npb24pIGdldFNlc3Npb24oKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBpbnQgZ2V0U2Vzc2lvblR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBTZXNzaW9uVG9rZW4yLlRZUEVfTElCUkFSWV9TRVJWSUNFOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTWVkaWFMaWJyYXJ5U2Vzc2lvbkltcGwgZXh0ZW5kcyBNZWRpYVNlc3Npb24ySW1wbAotICAgICAgICAgICAgaW1wbGVtZW50cyBNZWRpYUxpYnJhcnlTZXNzaW9uUHJvdmlkZXIgewotICAgICAgICBwdWJsaWMgTWVkaWFMaWJyYXJ5U2Vzc2lvbkltcGwoQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgIE1lZGlhUGxheWVyQmFzZSBwbGF5ZXIsIFN0cmluZyBpZCwgTWVkaWFQbGF5bGlzdEFnZW50IHBsYXlsaXN0QWdlbnQsCi0gICAgICAgICAgICAgICAgVm9sdW1lUHJvdmlkZXIyIHZvbHVtZVByb3ZpZGVyLAotICAgICAgICAgICAgICAgIFBlbmRpbmdJbnRlbnQgc2Vzc2lvbkFjdGl2aXR5LCBFeGVjdXRvciBjYWxsYmFja0V4ZWN1dG9yLAotICAgICAgICAgICAgICAgIE1lZGlhTGlicmFyeVNlc3Npb25DYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgcGxheWVyLCBpZCwgcGxheWxpc3RBZ2VudCwgdm9sdW1lUHJvdmlkZXIsIHNlc3Npb25BY3Rpdml0eSwKLSAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tFeGVjdXRvciwgY2FsbGJhY2spOwotICAgICAgICAgICAgLy8gRG9uJ3QgcHV0IGFueSBleHRyYSBpbml0aWFsaXphdGlvbiBoZXJlLiBIZXJlJ3MgdGhlIHJlYXNvbi4KLSAgICAgICAgICAgIC8vIFN5c3RlbSBzZXJ2aWNlIHdpbGwgcmVjb2duaXplIHRoaXMgc2Vzc2lvbiBpbnNpZGUgb2YgdGhlIHN1cGVyIGNvbnN0cnVjdG9yIGFuZCB3b3VsZAotICAgICAgICAgICAgLy8gY29ubmVjdCB0byB0aGlzIHNlc3Npb24gYXNzdW1pbmcgdGhhdCBpbml0aWFsaXphdGlvbiBpcyBmaW5pc2hlZC4gSG93ZXZlciwgaWYgYW55Ci0gICAgICAgICAgICAvLyBpbml0aWFsaXphdGlvbiBsb2dpYyBpcyBoZXJlLCBjYWxscyBmcm9tIHRoZSBzZXJ2ZXIgd291bGQgZmFpbC4KLSAgICAgICAgICAgIC8vIHNlZTogTWVkaWFTZXNzaW9uMlN0dWIjY29ubmVjdCgpCi0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgTWVkaWFMaWJyYXJ5U2Vzc2lvbiBjcmVhdGVJbnN0YW5jZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgTWVkaWFMaWJyYXJ5U2Vzc2lvbih0aGlzKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBNZWRpYUxpYnJhcnlTZXNzaW9uIGdldEluc3RhbmNlKCkgewotICAgICAgICAgICAgcmV0dXJuIChNZWRpYUxpYnJhcnlTZXNzaW9uKSBzdXBlci5nZXRJbnN0YW5jZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIE1lZGlhTGlicmFyeVNlc3Npb25DYWxsYmFjayBnZXRDYWxsYmFjaygpIHsKLSAgICAgICAgICAgIHJldHVybiAoTWVkaWFMaWJyYXJ5U2Vzc2lvbkNhbGxiYWNrKSBzdXBlci5nZXRDYWxsYmFjaygpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG5vdGlmeUNoaWxkcmVuQ2hhbmdlZF9pbXBsKENvbnRyb2xsZXJJbmZvIGNvbnRyb2xsZXIsIFN0cmluZyBwYXJlbnRJZCwKLSAgICAgICAgICAgICAgICBpbnQgaXRlbUNvdW50LCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgICAgICBpZiAoY29udHJvbGxlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY29udHJvbGxlciBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHBhcmVudElkID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJwYXJlbnRJZCBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZ2V0U2Vzc2lvblN0dWIoKS5ub3RpZnlDaGlsZHJlbkNoYW5nZWROb3RMb2NrZWQoY29udHJvbGxlciwgcGFyZW50SWQsIGl0ZW1Db3VudCwKLSAgICAgICAgICAgICAgICAgICAgZXh0cmFzKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBub3RpZnlDaGlsZHJlbkNoYW5nZWRfaW1wbChTdHJpbmcgcGFyZW50SWQsIGludCBpdGVtQ291bnQsIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgICAgIGlmIChwYXJlbnRJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicGFyZW50SWQgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGdldFNlc3Npb25TdHViKCkubm90aWZ5Q2hpbGRyZW5DaGFuZ2VkTm90TG9ja2VkKHBhcmVudElkLCBpdGVtQ291bnQsIGV4dHJhcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgbm90aWZ5U2VhcmNoUmVzdWx0Q2hhbmdlZF9pbXBsKENvbnRyb2xsZXJJbmZvIGNvbnRyb2xsZXIsIFN0cmluZyBxdWVyeSwKLSAgICAgICAgICAgICAgICBpbnQgaXRlbUNvdW50LCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgICAgICBlbnN1cmVDYWxsaW5nVGhyZWFkKCk7Ci0gICAgICAgICAgICBpZiAoY29udHJvbGxlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY29udHJvbGxlciBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHF1ZXJ5KSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInF1ZXJ5IHNob3VsZG4ndCBiZSBlbXB0eSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZ2V0U2Vzc2lvblN0dWIoKS5ub3RpZnlTZWFyY2hSZXN1bHRDaGFuZ2VkKGNvbnRyb2xsZXIsIHF1ZXJ5LCBpdGVtQ291bnQsIGV4dHJhcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJ1aWxkZXJJbXBsCi0gICAgICAgICAgICBleHRlbmRzIEJ1aWxkZXJCYXNlSW1wbDxNZWRpYUxpYnJhcnlTZXNzaW9uLCBNZWRpYUxpYnJhcnlTZXNzaW9uQ2FsbGJhY2s+IHsKLSAgICAgICAgcHVibGljIEJ1aWxkZXJJbXBsKE1lZGlhTGlicmFyeVNlcnZpY2UyIHNlcnZpY2UsIEJ1aWxkZXIgaW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgRXhlY3V0b3IgY2FsbGJhY2tFeGVjdXRvciwgTWVkaWFMaWJyYXJ5U2Vzc2lvbkNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgICAgICBzdXBlcihzZXJ2aWNlKTsKLSAgICAgICAgICAgIHNldFNlc3Npb25DYWxsYmFja19pbXBsKGNhbGxiYWNrRXhlY3V0b3IsIGNhbGxiYWNrKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgTWVkaWFMaWJyYXJ5U2Vzc2lvbiBidWlsZF9pbXBsKCkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBNZWRpYUxpYnJhcnlTZXNzaW9uSW1wbChtQ29udGV4dCwgbVBsYXllciwgbUlkLCBtUGxheWxpc3RBZ2VudCwKLSAgICAgICAgICAgICAgICAgICAgbVZvbHVtZVByb3ZpZGVyLCBtU2Vzc2lvbkFjdGl2aXR5LCBtQ2FsbGJhY2tFeGVjdXRvciwgbUNhbGxiYWNrKS5nZXRJbnN0YW5jZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBMaWJyYXJ5Um9vdEltcGwgaW1wbGVtZW50cyBMaWJyYXJ5Um9vdFByb3ZpZGVyIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBMaWJyYXJ5Um9vdCBtSW5zdGFuY2U7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1Sb290SWQ7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgQnVuZGxlIG1FeHRyYXM7Ci0KLSAgICAgICAgcHVibGljIExpYnJhcnlSb290SW1wbChMaWJyYXJ5Um9vdCBpbnN0YW5jZSwgU3RyaW5nIHJvb3RJZCwgQnVuZGxlIGV4dHJhcykgewotICAgICAgICAgICAgaWYgKHJvb3RJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicm9vdElkIHNob3VsZG4ndCBiZSBudWxsLiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUluc3RhbmNlID0gaW5zdGFuY2U7Ci0gICAgICAgICAgICBtUm9vdElkID0gcm9vdElkOwotICAgICAgICAgICAgbUV4dHJhcyA9IGV4dHJhczsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFJvb3RJZF9pbXBsKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Sb290SWQ7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEJ1bmRsZSBnZXRFeHRyYXNfaW1wbCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtRXh0cmFzOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYU1ldGFkYXRhMkltcGwuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFNZXRhZGF0YTJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmMWM1MzIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYU1ldGFkYXRhMkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLm1lZGlhOwotCi1pbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuTWVkaWFNZXRhZGF0YTIuKjsKLQotaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5OdWxsYWJsZTsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTWV0YWRhdGEyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFNZXRhZGF0YTIuQml0bWFwS2V5OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFNZXRhZGF0YTIuQnVpbGRlcjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTWV0YWRhdGEyLkxvbmdLZXk7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYU1ldGFkYXRhMi5SYXRpbmdLZXk7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYU1ldGFkYXRhMi5UZXh0S2V5OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuUmF0aW5nMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5NZWRpYU1ldGFkYXRhMlByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQudXRpbC5BcnJheU1hcDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCi1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotcHVibGljIGNsYXNzIE1lZGlhTWV0YWRhdGEySW1wbCBpbXBsZW1lbnRzIE1lZGlhTWV0YWRhdGEyUHJvdmlkZXIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTWVkaWFNZXRhZGF0YTIiOwotCi0gICAgc3RhdGljIGZpbmFsIGludCBNRVRBREFUQV9UWVBFX0xPTkcgPSAwOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgTUVUQURBVEFfVFlQRV9URVhUID0gMTsKLSAgICBzdGF0aWMgZmluYWwgaW50IE1FVEFEQVRBX1RZUEVfQklUTUFQID0gMjsKLSAgICBzdGF0aWMgZmluYWwgaW50IE1FVEFEQVRBX1RZUEVfUkFUSU5HID0gMzsKLSAgICBzdGF0aWMgZmluYWwgaW50IE1FVEFEQVRBX1RZUEVfRkxPQVQgPSA0OwotICAgIHN0YXRpYyBmaW5hbCBBcnJheU1hcDxTdHJpbmcsIEludGVnZXI+IE1FVEFEQVRBX0tFWVNfVFlQRTsKLQotICAgIHN0YXRpYyB7Ci0gICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRSA9IG5ldyBBcnJheU1hcDxTdHJpbmcsIEludGVnZXI+KCk7Ci0gICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX1RJVExFLCBNRVRBREFUQV9UWVBFX1RFWFQpOwotICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9BUlRJU1QsIE1FVEFEQVRBX1RZUEVfVEVYVCk7Ci0gICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0RVUkFUSU9OLCBNRVRBREFUQV9UWVBFX0xPTkcpOwotICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9BTEJVTSwgTUVUQURBVEFfVFlQRV9URVhUKTsKLSAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfQVVUSE9SLCBNRVRBREFUQV9UWVBFX1RFWFQpOwotICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9XUklURVIsIE1FVEFEQVRBX1RZUEVfVEVYVCk7Ci0gICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0NPTVBPU0VSLCBNRVRBREFUQV9UWVBFX1RFWFQpOwotICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9DT01QSUxBVElPTiwgTUVUQURBVEFfVFlQRV9URVhUKTsKLSAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfREFURSwgTUVUQURBVEFfVFlQRV9URVhUKTsKLSAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfWUVBUiwgTUVUQURBVEFfVFlQRV9MT05HKTsKLSAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfR0VOUkUsIE1FVEFEQVRBX1RZUEVfVEVYVCk7Ci0gICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX1RSQUNLX05VTUJFUiwgTUVUQURBVEFfVFlQRV9MT05HKTsKLSAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfTlVNX1RSQUNLUywgTUVUQURBVEFfVFlQRV9MT05HKTsKLSAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfRElTQ19OVU1CRVIsIE1FVEFEQVRBX1RZUEVfTE9ORyk7Ci0gICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0FMQlVNX0FSVElTVCwgTUVUQURBVEFfVFlQRV9URVhUKTsKLSAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfQVJULCBNRVRBREFUQV9UWVBFX0JJVE1BUCk7Ci0gICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0FSVF9VUkksIE1FVEFEQVRBX1RZUEVfVEVYVCk7Ci0gICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0FMQlVNX0FSVCwgTUVUQURBVEFfVFlQRV9CSVRNQVApOwotICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9BTEJVTV9BUlRfVVJJLCBNRVRBREFUQV9UWVBFX1RFWFQpOwotICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9VU0VSX1JBVElORywgTUVUQURBVEFfVFlQRV9SQVRJTkcpOwotICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9SQVRJTkcsIE1FVEFEQVRBX1RZUEVfUkFUSU5HKTsKLSAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfRElTUExBWV9USVRMRSwgTUVUQURBVEFfVFlQRV9URVhUKTsKLSAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfRElTUExBWV9TVUJUSVRMRSwgTUVUQURBVEFfVFlQRV9URVhUKTsKLSAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfRElTUExBWV9ERVNDUklQVElPTiwgTUVUQURBVEFfVFlQRV9URVhUKTsKLSAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfRElTUExBWV9JQ09OLCBNRVRBREFUQV9UWVBFX0JJVE1BUCk7Ci0gICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0RJU1BMQVlfSUNPTl9VUkksIE1FVEFEQVRBX1RZUEVfVEVYVCk7Ci0gICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX01FRElBX0lELCBNRVRBREFUQV9UWVBFX1RFWFQpOwotICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9CVF9GT0xERVJfVFlQRSwgTUVUQURBVEFfVFlQRV9MT05HKTsKLSAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfTUVESUFfVVJJLCBNRVRBREFUQV9UWVBFX1RFWFQpOwotICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9BRFZFUlRJU0VNRU5ULCBNRVRBREFUQV9UWVBFX0xPTkcpOwotICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9ET1dOTE9BRF9TVEFUVVMsIE1FVEFEQVRBX1RZUEVfTE9ORyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQFRleHRLZXkKLSAgICBTdHJpbmdbXSBQUkVGRVJSRURfREVTQ1JJUFRJT05fT1JERVIgPSB7Ci0gICAgICAgICAgICBNRVRBREFUQV9LRVlfVElUTEUsCi0gICAgICAgICAgICBNRVRBREFUQV9LRVlfQVJUSVNULAotICAgICAgICAgICAgTUVUQURBVEFfS0VZX0FMQlVNLAotICAgICAgICAgICAgTUVUQURBVEFfS0VZX0FMQlVNX0FSVElTVCwKLSAgICAgICAgICAgIE1FVEFEQVRBX0tFWV9XUklURVIsCi0gICAgICAgICAgICBNRVRBREFUQV9LRVlfQVVUSE9SLAotICAgICAgICAgICAgTUVUQURBVEFfS0VZX0NPTVBPU0VSCi0gICAgfTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEBCaXRtYXBLZXkKLSAgICBTdHJpbmdbXSBQUkVGRVJSRURfQklUTUFQX09SREVSID0gewotICAgICAgICAgICAgTUVUQURBVEFfS0VZX0RJU1BMQVlfSUNPTiwKLSAgICAgICAgICAgIE1FVEFEQVRBX0tFWV9BUlQsCi0gICAgICAgICAgICBNRVRBREFUQV9LRVlfQUxCVU1fQVJUCi0gICAgfTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEBUZXh0S2V5Ci0gICAgU3RyaW5nW10gUFJFRkVSUkVEX1VSSV9PUkRFUiA9IHsKLSAgICAgICAgICAgIE1FVEFEQVRBX0tFWV9ESVNQTEFZX0lDT05fVVJJLAotICAgICAgICAgICAgTUVUQURBVEFfS0VZX0FSVF9VUkksCi0gICAgICAgICAgICBNRVRBREFUQV9LRVlfQUxCVU1fQVJUX1VSSQotICAgIH07Ci0KLSAgICBwcml2YXRlIGZpbmFsIE1lZGlhTWV0YWRhdGEyIG1JbnN0YW5jZTsKLSAgICBwcml2YXRlIGZpbmFsIEJ1bmRsZSBtQnVuZGxlOwotCi0gICAgcHVibGljIE1lZGlhTWV0YWRhdGEySW1wbChCdW5kbGUgYnVuZGxlKSB7Ci0gICAgICAgIG1JbnN0YW5jZSA9IG5ldyBNZWRpYU1ldGFkYXRhMih0aGlzKTsKLSAgICAgICAgbUJ1bmRsZSA9IGJ1bmRsZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWVkaWFNZXRhZGF0YTIgZ2V0SW5zdGFuY2UoKSB7Ci0gICAgICAgIHJldHVybiBtSW5zdGFuY2U7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNLZXlfaW1wbChTdHJpbmcga2V5KSB7Ci0gICAgICAgIGlmIChrZXkgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigia2V5IHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuY29udGFpbnNLZXkoa2V5KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQ2hhclNlcXVlbmNlIGdldFRleHRfaW1wbChAVGV4dEtleSBTdHJpbmcga2V5KSB7Ci0gICAgICAgIGlmIChrZXkgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigia2V5IHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0Q2hhclNlcXVlbmNlKGtleSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEBOdWxsYWJsZSBTdHJpbmcgZ2V0TWVkaWFJZF9pbXBsKCkgewotICAgICAgICByZXR1cm4gbUluc3RhbmNlLmdldFN0cmluZyhNRVRBREFUQV9LRVlfTUVESUFfSUQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nX2ltcGwoQFRleHRLZXkgU3RyaW5nIGtleSkgewotICAgICAgICBpZiAoa2V5ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImtleSBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIENoYXJTZXF1ZW5jZSB0ZXh0ID0gbUJ1bmRsZS5nZXRDaGFyU2VxdWVuY2Uoa2V5KTsKLSAgICAgICAgaWYgKHRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHRleHQudG9TdHJpbmcoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgbG9uZyBnZXRMb25nX2ltcGwoQExvbmdLZXkgU3RyaW5nIGtleSkgewotICAgICAgICBpZiAoa2V5ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImtleSBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldExvbmcoa2V5LCAwKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgUmF0aW5nMiBnZXRSYXRpbmdfaW1wbChAUmF0aW5nS2V5IFN0cmluZyBrZXkpIHsKLSAgICAgICAgaWYgKGtleSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJrZXkgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICAvLyBUT0RPKGphZXdhbik6IEFkZCBiYWNrd2FyZCBjb21wYXRpYmlsaXR5Ci0gICAgICAgIFJhdGluZzIgcmF0aW5nID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJhdGluZyA9IFJhdGluZzIuZnJvbUJ1bmRsZShtQnVuZGxlLmdldEJ1bmRsZShrZXkpKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIGlnbm9yZSwgdmFsdWUgd2FzIG5vdCBhIHJhdGluZwotICAgICAgICAgICAgTG9nLncoVEFHLCAiRmFpbGVkIHRvIHJldHJpZXZlIGEga2V5IGFzIFJhdGluZy4iLCBlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmF0aW5nOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBmbG9hdCBnZXRGbG9hdF9pbXBsKEBGbG9hdEtleSBTdHJpbmcga2V5KSB7Ci0gICAgICAgIGlmIChrZXkgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigia2V5IHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0RmxvYXQoa2V5KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQml0bWFwIGdldEJpdG1hcF9pbXBsKEBCaXRtYXBLZXkgU3RyaW5nIGtleSkgewotICAgICAgICBpZiAoa2V5ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImtleSBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIEJpdG1hcCBibXAgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgYm1wID0gbUJ1bmRsZS5nZXRQYXJjZWxhYmxlKGtleSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBpZ25vcmUsIHZhbHVlIHdhcyBub3QgYSBiaXRtYXAKLSAgICAgICAgICAgIExvZy53KFRBRywgIkZhaWxlZCB0byByZXRyaWV2ZSBhIGtleSBhcyBCaXRtYXAuIiwgZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJtcDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQnVuZGxlIGdldEV4dHJhc19pbXBsKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0QnVuZGxlKE1FVEFEQVRBX0tFWV9FWFRSQVMpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gaWdub3JlLCB2YWx1ZSB3YXMgbm90IGFuIGJ1bmRsZQotICAgICAgICAgICAgTG9nLncoVEFHLCAiRmFpbGVkIHRvIHJldHJpZXZlIGFuIGV4dHJhIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBzaXplX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLnNpemUoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU2V0PFN0cmluZz4ga2V5U2V0X2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmtleVNldCgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBCdW5kbGUgdG9CdW5kbGVfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGU7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBNZWRpYU1ldGFkYXRhMiBmcm9tQnVuZGxlX2ltcGwoQnVuZGxlIGJ1bmRsZSkgewotICAgICAgICByZXR1cm4gKGJ1bmRsZSA9PSBudWxsKSA/IG51bGwgOiBuZXcgTWVkaWFNZXRhZGF0YTJJbXBsKGJ1bmRsZSkuZ2V0SW5zdGFuY2UoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEJ1aWxkZXJJbXBsIGltcGxlbWVudHMgTWVkaWFNZXRhZGF0YTJQcm92aWRlci5CdWlsZGVyUHJvdmlkZXIgewotICAgICAgICBwcml2YXRlIGZpbmFsIE1lZGlhTWV0YWRhdGEyLkJ1aWxkZXIgbUluc3RhbmNlOwotICAgICAgICBwcml2YXRlIGZpbmFsIEJ1bmRsZSBtQnVuZGxlOwotCi0gICAgICAgIHB1YmxpYyBCdWlsZGVySW1wbChNZWRpYU1ldGFkYXRhMi5CdWlsZGVyIGluc3RhbmNlKSB7Ci0gICAgICAgICAgICBtSW5zdGFuY2UgPSBpbnN0YW5jZTsKLSAgICAgICAgICAgIG1CdW5kbGUgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgQnVpbGRlckltcGwoTWVkaWFNZXRhZGF0YTIuQnVpbGRlciBpbnN0YW5jZSwgTWVkaWFNZXRhZGF0YTIgc291cmNlKSB7Ci0gICAgICAgICAgICBpZiAoc291cmNlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzb3VyY2Ugc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1JbnN0YW5jZSA9IGluc3RhbmNlOwotICAgICAgICAgICAgbUJ1bmRsZSA9IG5ldyBCdW5kbGUoc291cmNlLnRvQnVuZGxlKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEJ1aWxkZXJJbXBsKGludCBtYXhCaXRtYXBTaXplKSB7Ci0gICAgICAgICAgICBtSW5zdGFuY2UgPSBuZXcgTWVkaWFNZXRhZGF0YTIuQnVpbGRlcih0aGlzKTsKLSAgICAgICAgICAgIG1CdW5kbGUgPSBuZXcgQnVuZGxlKCk7Ci0KLSAgICAgICAgICAgIGZvciAoU3RyaW5nIGtleSA6IG1CdW5kbGUua2V5U2V0KCkpIHsKLSAgICAgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBtQnVuZGxlLmdldChrZXkpOwotICAgICAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEJpdG1hcCkgewotICAgICAgICAgICAgICAgICAgICBCaXRtYXAgYm1wID0gKEJpdG1hcCkgdmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChibXAuZ2V0SGVpZ2h0KCkgPiBtYXhCaXRtYXBTaXplIHx8IGJtcC5nZXRXaWR0aCgpID4gbWF4Qml0bWFwU2l6ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUluc3RhbmNlLnB1dEJpdG1hcChrZXksIHNjYWxlQml0bWFwKGJtcCwgbWF4Qml0bWFwU2l6ZSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHB1dFRleHRfaW1wbChAVGV4dEtleSBTdHJpbmcga2V5LCBDaGFyU2VxdWVuY2UgdmFsdWUpIHsKLSAgICAgICAgICAgIGlmIChrZXkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImtleSBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKE1FVEFEQVRBX0tFWVNfVFlQRS5jb250YWluc0tleShrZXkpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKE1FVEFEQVRBX0tFWVNfVFlQRS5nZXQoa2V5KSAhPSBNRVRBREFUQV9UWVBFX1RFWFQpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlICIgKyBrZXkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIga2V5IGNhbm5vdCBiZSB1c2VkIHRvIHB1dCBhIENoYXJTZXF1ZW5jZSIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1CdW5kbGUucHV0Q2hhclNlcXVlbmNlKGtleSwgdmFsdWUpOwotICAgICAgICAgICAgcmV0dXJuIG1JbnN0YW5jZTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQnVpbGRlciBwdXRTdHJpbmdfaW1wbChAVGV4dEtleSBTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgICAgIGlmIChrZXkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImtleSBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKE1FVEFEQVRBX0tFWVNfVFlQRS5jb250YWluc0tleShrZXkpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKE1FVEFEQVRBX0tFWVNfVFlQRS5nZXQoa2V5KSAhPSBNRVRBREFUQV9UWVBFX1RFWFQpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlICIgKyBrZXkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIga2V5IGNhbm5vdCBiZSB1c2VkIHRvIHB1dCBhIFN0cmluZyIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1CdW5kbGUucHV0Q2hhclNlcXVlbmNlKGtleSwgdmFsdWUpOwotICAgICAgICAgICAgcmV0dXJuIG1JbnN0YW5jZTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQnVpbGRlciBwdXRMb25nX2ltcGwoQExvbmdLZXkgU3RyaW5nIGtleSwgbG9uZyB2YWx1ZSkgewotICAgICAgICAgICAgaWYgKGtleSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigia2V5IHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoTUVUQURBVEFfS0VZU19UWVBFLmNvbnRhaW5zS2V5KGtleSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoTUVUQURBVEFfS0VZU19UWVBFLmdldChrZXkpICE9IE1FVEFEQVRBX1RZUEVfTE9ORykgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgIiArIGtleQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBrZXkgY2Fubm90IGJlIHVzZWQgdG8gcHV0IGEgbG9uZyIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1CdW5kbGUucHV0TG9uZyhrZXksIHZhbHVlKTsKLSAgICAgICAgICAgIHJldHVybiBtSW5zdGFuY2U7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEJ1aWxkZXIgcHV0UmF0aW5nX2ltcGwoQFJhdGluZ0tleSBTdHJpbmcga2V5LCBSYXRpbmcyIHZhbHVlKSB7Ci0gICAgICAgICAgICBpZiAoa2V5ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJrZXkgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChNRVRBREFUQV9LRVlTX1RZUEUuY29udGFpbnNLZXkoa2V5KSkgewotICAgICAgICAgICAgICAgIGlmIChNRVRBREFUQV9LRVlTX1RZUEUuZ2V0KGtleSkgIT0gTUVUQURBVEFfVFlQRV9SQVRJTkcpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlICIgKyBrZXkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIga2V5IGNhbm5vdCBiZSB1c2VkIHRvIHB1dCBhIFJhdGluZyIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1CdW5kbGUucHV0QnVuZGxlKGtleSwgdmFsdWUudG9CdW5kbGUoKSk7Ci0gICAgICAgICAgICByZXR1cm4gbUluc3RhbmNlOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHB1dEJpdG1hcF9pbXBsKEBCaXRtYXBLZXkgU3RyaW5nIGtleSwgQml0bWFwIHZhbHVlKSB7Ci0gICAgICAgICAgICBpZiAoa2V5ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJrZXkgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChNRVRBREFUQV9LRVlTX1RZUEUuY29udGFpbnNLZXkoa2V5KSkgewotICAgICAgICAgICAgICAgIGlmIChNRVRBREFUQV9LRVlTX1RZUEUuZ2V0KGtleSkgIT0gTUVUQURBVEFfVFlQRV9CSVRNQVApIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlICIgKyBrZXkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIga2V5IGNhbm5vdCBiZSB1c2VkIHRvIHB1dCBhIEJpdG1hcCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1CdW5kbGUucHV0UGFyY2VsYWJsZShrZXksIHZhbHVlKTsKLSAgICAgICAgICAgIHJldHVybiBtSW5zdGFuY2U7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEJ1aWxkZXIgcHV0RmxvYXRfaW1wbChARmxvYXRLZXkgU3RyaW5nIGtleSwgZmxvYXQgdmFsdWUpIHsKLSAgICAgICAgICAgIGlmIChrZXkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImtleSBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKE1FVEFEQVRBX0tFWVNfVFlQRS5jb250YWluc0tleShrZXkpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKE1FVEFEQVRBX0tFWVNfVFlQRS5nZXQoa2V5KSAhPSBNRVRBREFUQV9UWVBFX0ZMT0FUKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSAiICsga2V5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGtleSBjYW5ub3QgYmUgdXNlZCB0byBwdXQgYSBmbG9hdCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1CdW5kbGUucHV0RmxvYXQoa2V5LCB2YWx1ZSk7Ci0gICAgICAgICAgICByZXR1cm4gbUluc3RhbmNlOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldEV4dHJhc19pbXBsKEJ1bmRsZSBidW5kbGUpIHsKLSAgICAgICAgICAgIG1CdW5kbGUucHV0QnVuZGxlKE1FVEFEQVRBX0tFWV9FWFRSQVMsIGJ1bmRsZSk7Ci0gICAgICAgICAgICByZXR1cm4gbUluc3RhbmNlOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBNZWRpYU1ldGFkYXRhMiBidWlsZF9pbXBsKCkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBNZWRpYU1ldGFkYXRhMkltcGwobUJ1bmRsZSkuZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgQml0bWFwIHNjYWxlQml0bWFwKEJpdG1hcCBibXAsIGludCBtYXhTaXplKSB7Ci0gICAgICAgICAgICBmbG9hdCBtYXhTaXplRiA9IG1heFNpemU7Ci0gICAgICAgICAgICBmbG9hdCB3aWR0aFNjYWxlID0gbWF4U2l6ZUYgLyBibXAuZ2V0V2lkdGgoKTsKLSAgICAgICAgICAgIGZsb2F0IGhlaWdodFNjYWxlID0gbWF4U2l6ZUYgLyBibXAuZ2V0SGVpZ2h0KCk7Ci0gICAgICAgICAgICBmbG9hdCBzY2FsZSA9IE1hdGgubWluKHdpZHRoU2NhbGUsIGhlaWdodFNjYWxlKTsKLSAgICAgICAgICAgIGludCBoZWlnaHQgPSAoaW50KSAoYm1wLmdldEhlaWdodCgpICogc2NhbGUpOwotICAgICAgICAgICAgaW50IHdpZHRoID0gKGludCkgKGJtcC5nZXRXaWR0aCgpICogc2NhbGUpOwotICAgICAgICAgICAgcmV0dXJuIEJpdG1hcC5jcmVhdGVTY2FsZWRCaXRtYXAoYm1wLCB3aWR0aCwgaGVpZ2h0LCB0cnVlKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYVBsYXlsaXN0QWdlbnRJbXBsLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhUGxheWxpc3RBZ2VudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGZkNGUxYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhUGxheWxpc3RBZ2VudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLm1lZGlhOwotCi1pbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLkNhbGxiYWNrRXhlY3V0b3I7Ci1pbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLk5vbk51bGw7Ci1pbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLk51bGxhYmxlOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuRGF0YVNvdXJjZURlc2M7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUl0ZW0yOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFNZXRhZGF0YTI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXlsaXN0QWdlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXlsaXN0QWdlbnQuUGxheWxpc3RFdmVudENhbGxiYWNrOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLk1lZGlhUGxheWxpc3RBZ2VudFByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQudXRpbC5BcnJheU1hcDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuYW5ub3RhdGlvbnMuR3VhcmRlZEJ5OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3I7Ci0KLXB1YmxpYyBjbGFzcyBNZWRpYVBsYXlsaXN0QWdlbnRJbXBsIGltcGxlbWVudHMgTWVkaWFQbGF5bGlzdEFnZW50UHJvdmlkZXIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTWVkaWFQbGF5bGlzdEFnZW50IjsKLQotICAgIHByaXZhdGUgZmluYWwgTWVkaWFQbGF5bGlzdEFnZW50IG1JbnN0YW5jZTsKLQotICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IG1Mb2NrID0gbmV3IE9iamVjdCgpOwotICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKLSAgICBwcml2YXRlIGZpbmFsIEFycmF5TWFwPFBsYXlsaXN0RXZlbnRDYWxsYmFjaywgRXhlY3V0b3I+IG1DYWxsYmFja3MgPSBuZXcgQXJyYXlNYXA8PigpOwotCi0gICAgcHVibGljIE1lZGlhUGxheWxpc3RBZ2VudEltcGwoTWVkaWFQbGF5bGlzdEFnZW50IGluc3RhbmNlKSB7Ci0gICAgICAgIG1JbnN0YW5jZSA9IGluc3RhbmNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIGZpbmFsIHB1YmxpYyB2b2lkIHJlZ2lzdGVyUGxheWxpc3RFdmVudENhbGxiYWNrX2ltcGwoCi0gICAgICAgICAgICBATm9uTnVsbCBAQ2FsbGJhY2tFeGVjdXRvciBFeGVjdXRvciBleGVjdXRvciwgQE5vbk51bGwgUGxheWxpc3RFdmVudENhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIGlmIChleGVjdXRvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJleGVjdXRvciBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjYWxsYmFjayA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjYWxsYmFjayBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgaWYgKG1DYWxsYmFja3MuZ2V0KGNhbGxiYWNrKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiY2FsbGJhY2sgaXMgYWxyZWFkeSBhZGRlZC4gSWdub3JpbmcuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUNhbGxiYWNrcy5wdXQoY2FsbGJhY2ssIGV4ZWN1dG9yKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIGZpbmFsIHB1YmxpYyB2b2lkIHVucmVnaXN0ZXJQbGF5bGlzdEV2ZW50Q2FsbGJhY2tfaW1wbCgKLSAgICAgICAgICAgIEBOb25OdWxsIFBsYXlsaXN0RXZlbnRDYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICBpZiAoY2FsbGJhY2sgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY2FsbGJhY2sgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBtQ2FsbGJhY2tzLnJlbW92ZShjYWxsYmFjayk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBmaW5hbCBwdWJsaWMgdm9pZCBub3RpZnlQbGF5bGlzdENoYW5nZWRfaW1wbCgpIHsKLSAgICAgICAgQXJyYXlNYXA8UGxheWxpc3RFdmVudENhbGxiYWNrLCBFeGVjdXRvcj4gY2FsbGJhY2tzID0gZ2V0Q2FsbGJhY2tzKCk7Ci0gICAgICAgIExpc3Q8TWVkaWFJdGVtMj4gcGxheWxpc3Q9IG1JbnN0YW5jZS5nZXRQbGF5bGlzdCgpOwotICAgICAgICBNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSA9IG1JbnN0YW5jZS5nZXRQbGF5bGlzdE1ldGFkYXRhKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2FsbGJhY2tzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBmaW5hbCBQbGF5bGlzdEV2ZW50Q2FsbGJhY2sgY2FsbGJhY2sgPSBjYWxsYmFja3Mua2V5QXQoaSk7Ci0gICAgICAgICAgICBmaW5hbCBFeGVjdXRvciBleGVjdXRvciA9IGNhbGxiYWNrcy52YWx1ZUF0KGkpOwotICAgICAgICAgICAgZXhlY3V0b3IuZXhlY3V0ZSgoKSAtPiBjYWxsYmFjay5vblBsYXlsaXN0Q2hhbmdlZCgKLSAgICAgICAgICAgICAgICAgICAgbUluc3RhbmNlLCBwbGF5bGlzdCwgbWV0YWRhdGEpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIGZpbmFsIHB1YmxpYyB2b2lkIG5vdGlmeVBsYXlsaXN0TWV0YWRhdGFDaGFuZ2VkX2ltcGwoKSB7Ci0gICAgICAgIEFycmF5TWFwPFBsYXlsaXN0RXZlbnRDYWxsYmFjaywgRXhlY3V0b3I+IGNhbGxiYWNrcyA9IGdldENhbGxiYWNrcygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNhbGxiYWNrcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgZmluYWwgUGxheWxpc3RFdmVudENhbGxiYWNrIGNhbGxiYWNrID0gY2FsbGJhY2tzLmtleUF0KGkpOwotICAgICAgICAgICAgZmluYWwgRXhlY3V0b3IgZXhlY3V0b3IgPSBjYWxsYmFja3MudmFsdWVBdChpKTsKLSAgICAgICAgICAgIGV4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4gY2FsbGJhY2sub25QbGF5bGlzdE1ldGFkYXRhQ2hhbmdlZCgKLSAgICAgICAgICAgICAgICAgICAgbUluc3RhbmNlLCBtSW5zdGFuY2UuZ2V0UGxheWxpc3RNZXRhZGF0YSgpKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBmaW5hbCBwdWJsaWMgdm9pZCBub3RpZnlTaHVmZmxlTW9kZUNoYW5nZWRfaW1wbCgpIHsKLSAgICAgICAgQXJyYXlNYXA8UGxheWxpc3RFdmVudENhbGxiYWNrLCBFeGVjdXRvcj4gY2FsbGJhY2tzID0gZ2V0Q2FsbGJhY2tzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2FsbGJhY2tzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBmaW5hbCBQbGF5bGlzdEV2ZW50Q2FsbGJhY2sgY2FsbGJhY2sgPSBjYWxsYmFja3Mua2V5QXQoaSk7Ci0gICAgICAgICAgICBmaW5hbCBFeGVjdXRvciBleGVjdXRvciA9IGNhbGxiYWNrcy52YWx1ZUF0KGkpOwotICAgICAgICAgICAgZXhlY3V0b3IuZXhlY3V0ZSgoKSAtPiBjYWxsYmFjay5vblNodWZmbGVNb2RlQ2hhbmdlZCgKLSAgICAgICAgICAgICAgICAgICAgbUluc3RhbmNlLCBtSW5zdGFuY2UuZ2V0U2h1ZmZsZU1vZGUoKSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgZmluYWwgcHVibGljIHZvaWQgbm90aWZ5UmVwZWF0TW9kZUNoYW5nZWRfaW1wbCgpIHsKLSAgICAgICAgQXJyYXlNYXA8UGxheWxpc3RFdmVudENhbGxiYWNrLCBFeGVjdXRvcj4gY2FsbGJhY2tzID0gZ2V0Q2FsbGJhY2tzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2FsbGJhY2tzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBmaW5hbCBQbGF5bGlzdEV2ZW50Q2FsbGJhY2sgY2FsbGJhY2sgPSBjYWxsYmFja3Mua2V5QXQoaSk7Ci0gICAgICAgICAgICBmaW5hbCBFeGVjdXRvciBleGVjdXRvciA9IGNhbGxiYWNrcy52YWx1ZUF0KGkpOwotICAgICAgICAgICAgZXhlY3V0b3IuZXhlY3V0ZSgoKSAtPiBjYWxsYmFjay5vblJlcGVhdE1vZGVDaGFuZ2VkKAotICAgICAgICAgICAgICAgICAgICBtSW5zdGFuY2UsIG1JbnN0YW5jZS5nZXRSZXBlYXRNb2RlKCkpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBATnVsbGFibGUgTGlzdDxNZWRpYUl0ZW0yPiBnZXRQbGF5bGlzdF9pbXBsKCkgewotICAgICAgICAvLyBlbXB0eSBpbXBsZW1lbnRhdGlvbgotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRQbGF5bGlzdF9pbXBsKEBOb25OdWxsIExpc3Q8TWVkaWFJdGVtMj4gbGlzdCwKLSAgICAgICAgICAgIEBOdWxsYWJsZSBNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSkgewotICAgICAgICAvLyBlbXB0eSBpbXBsZW1lbnRhdGlvbgotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBATnVsbGFibGUgTWVkaWFNZXRhZGF0YTIgZ2V0UGxheWxpc3RNZXRhZGF0YV9pbXBsKCkgewotICAgICAgICAvLyBlbXB0eSBpbXBsZW1lbnRhdGlvbgotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB1cGRhdGVQbGF5bGlzdE1ldGFkYXRhX2ltcGwoQE51bGxhYmxlIE1lZGlhTWV0YWRhdGEyIG1ldGFkYXRhKSB7Ci0gICAgICAgIC8vIGVtcHR5IGltcGxlbWVudGF0aW9uCi0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgYWRkUGxheWxpc3RJdGVtX2ltcGwoaW50IGluZGV4LCBATm9uTnVsbCBNZWRpYUl0ZW0yIGl0ZW0pIHsKLSAgICAgICAgLy8gZW1wdHkgaW1wbGVtZW50YXRpb24KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCByZW1vdmVQbGF5bGlzdEl0ZW1faW1wbChATm9uTnVsbCBNZWRpYUl0ZW0yIGl0ZW0pIHsKLSAgICAgICAgLy8gZW1wdHkgaW1wbGVtZW50YXRpb24KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCByZXBsYWNlUGxheWxpc3RJdGVtX2ltcGwoaW50IGluZGV4LCBATm9uTnVsbCBNZWRpYUl0ZW0yIGl0ZW0pIHsKLSAgICAgICAgLy8gZW1wdHkgaW1wbGVtZW50YXRpb24KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBza2lwVG9QbGF5bGlzdEl0ZW1faW1wbChATm9uTnVsbCBNZWRpYUl0ZW0yIGl0ZW0pIHsKLSAgICAgICAgLy8gZW1wdHkgaW1wbGVtZW50YXRpb24KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBza2lwVG9QcmV2aW91c0l0ZW1faW1wbCgpIHsKLSAgICAgICAgLy8gZW1wdHkgaW1wbGVtZW50YXRpb24KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBza2lwVG9OZXh0SXRlbV9pbXBsKCkgewotICAgICAgICAvLyBlbXB0eSBpbXBsZW1lbnRhdGlvbgotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgZ2V0UmVwZWF0TW9kZV9pbXBsKCkgewotICAgICAgICByZXR1cm4gTWVkaWFQbGF5bGlzdEFnZW50LlJFUEVBVF9NT0RFX05PTkU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0UmVwZWF0TW9kZV9pbXBsKGludCByZXBlYXRNb2RlKSB7Ci0gICAgICAgIC8vIGVtcHR5IGltcGxlbWVudGF0aW9uCi0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBnZXRTaHVmZmxlTW9kZV9pbXBsKCkgewotICAgICAgICAvLyBlbXB0eSBpbXBsZW1lbnRhdGlvbgotICAgICAgICByZXR1cm4gTWVkaWFQbGF5bGlzdEFnZW50LlNIVUZGTEVfTU9ERV9OT05FOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFNodWZmbGVNb2RlX2ltcGwoaW50IHNodWZmbGVNb2RlKSB7Ci0gICAgICAgIC8vIGVtcHR5IGltcGxlbWVudGF0aW9uCi0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEBOdWxsYWJsZSBNZWRpYUl0ZW0yIGdldE1lZGlhSXRlbV9pbXBsKEBOb25OdWxsIERhdGFTb3VyY2VEZXNjIGRzZCkgewotICAgICAgICBpZiAoZHNkID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImRzZCBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIExpc3Q8TWVkaWFJdGVtMj4gaXRlbUxpc3QgPSBtSW5zdGFuY2UuZ2V0UGxheWxpc3QoKTsKLSAgICAgICAgaWYgKGl0ZW1MaXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlbUxpc3Quc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIE1lZGlhSXRlbTIgaXRlbSA9IGl0ZW1MaXN0LmdldChpKTsKLSAgICAgICAgICAgIGlmIChpdGVtICE9IG51bGwgJiYgaXRlbS5nZXREYXRhU291cmNlRGVzYygpID09IGRzZCkgewotICAgICAgICAgICAgICAgIHJldHVybiBpdGVtOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByaXZhdGUgQXJyYXlNYXA8UGxheWxpc3RFdmVudENhbGxiYWNrLCBFeGVjdXRvcj4gZ2V0Q2FsbGJhY2tzKCkgewotICAgICAgICBBcnJheU1hcDxQbGF5bGlzdEV2ZW50Q2FsbGJhY2ssIEV4ZWN1dG9yPiBjYWxsYmFja3MgPSBuZXcgQXJyYXlNYXA8PigpOwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBjYWxsYmFja3MucHV0QWxsKG1DYWxsYmFja3MpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjYWxsYmFja3M7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYVNlc3Npb24ySW1wbC5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYVNlc3Npb24ySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWM2MDQyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFTZXNzaW9uMkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5tZWRpYTsKLQotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfQ1VTVE9NOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlNlc3Npb25Ub2tlbjIuVFlQRV9MSUJSQVJZX1NFUlZJQ0U7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuU2Vzc2lvblRva2VuMi5UWVBFX1NFU1NJT047Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuU2Vzc2lvblRva2VuMi5UWVBFX1NFU1NJT05fU0VSVklDRTsKLQotaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5Ob25OdWxsOwotaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5OdWxsYWJsZTsKLWltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5SZXNvbHZlSW5mbzsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvQXR0cmlidXRlczsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvRm9jdXNSZXF1ZXN0OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9NYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuRGF0YVNvdXJjZURlc2M7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUNvbnRyb2xsZXIyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFDb250cm9sbGVyMi5QbGF5YmFja0luZm87Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUl0ZW0yOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFMaWJyYXJ5U2VydmljZTI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYU1ldGFkYXRhMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyQmFzZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyQmFzZS5QbGF5ZXJFdmVudENhbGxiYWNrOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXJCYXNlLlBsYXllclN0YXRlOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5bGlzdEFnZW50OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5bGlzdEFnZW50LlBsYXlsaXN0RXZlbnRDYWxsYmFjazsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvbjI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb24yLkJ1aWxkZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5TZXNzaW9uQ29tbWFuZDI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb24yLkNvbW1hbmRCdXR0b247Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5TZXNzaW9uQ29tbWFuZEdyb3VwMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvbjIuQ29udHJvbGxlckluZm87Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb24yLk9uRGF0YVNvdXJjZU1pc3NpbmdIZWxwZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb24yLlNlc3Npb25DYWxsYmFjazsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvblNlcnZpY2UyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuU2Vzc2lvblRva2VuMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlZvbHVtZVByb3ZpZGVyMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnNlc3Npb24uTWVkaWFTZXNzaW9uTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5NZWRpYVNlc3Npb24yUHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOwotaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsYWJsZTsKLWltcG9ydCBhbmRyb2lkLm9zLlByb2Nlc3M7Ci1pbXBvcnQgYW5kcm9pZC5vcy5SZXN1bHRSZWNlaXZlcjsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5HdWFyZGVkQnk7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3I7Ci0KLXB1YmxpYyBjbGFzcyBNZWRpYVNlc3Npb24ySW1wbCBpbXBsZW1lbnRzIE1lZGlhU2Vzc2lvbjJQcm92aWRlciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNZWRpYVNlc3Npb24yIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gdHJ1ZTsvL0xvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKTsKLQotICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IG1Mb2NrID0gbmV3IE9iamVjdCgpOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBNZWRpYVNlc3Npb24yIG1JbnN0YW5jZTsKLSAgICBwcml2YXRlIGZpbmFsIENvbnRleHQgbUNvbnRleHQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbUlkOwotICAgIHByaXZhdGUgZmluYWwgRXhlY3V0b3IgbUNhbGxiYWNrRXhlY3V0b3I7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTZXNzaW9uQ2FsbGJhY2sgbUNhbGxiYWNrOwotICAgIHByaXZhdGUgZmluYWwgTWVkaWFTZXNzaW9uMlN0dWIgbVNlc3Npb25TdHViOwotICAgIHByaXZhdGUgZmluYWwgU2Vzc2lvblRva2VuMiBtU2Vzc2lvblRva2VuOwotICAgIHByaXZhdGUgZmluYWwgQXVkaW9NYW5hZ2VyIG1BdWRpb01hbmFnZXI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBQZW5kaW5nSW50ZW50IG1TZXNzaW9uQWN0aXZpdHk7Ci0gICAgcHJpdmF0ZSBmaW5hbCBQbGF5ZXJFdmVudENhbGxiYWNrIG1QbGF5ZXJFdmVudENhbGxiYWNrOwotICAgIHByaXZhdGUgZmluYWwgUGxheWxpc3RFdmVudENhbGxiYWNrIG1QbGF5bGlzdEV2ZW50Q2FsbGJhY2s7Ci0KLSAgICAvLyBtUGxheWVyIGlzIHNldCB0byBudWxsIHdoZW4gdGhlIHNlc3Npb24gaXMgY2xvc2VkLCBhbmQgd2Ugc2hvdWxkbid0IHRocm93IGFuIGV4Y2VwdGlvbgotICAgIC8vIG5vciBsZWF2ZSBsb2cgYWx3YXlzIGZvciB1c2luZyBtUGxheWVyIHdoZW4gaXQncyBudWxsLiBIZXJlJ3MgdGhlIHJlYXNvbi4KLSAgICAvLyBXaGVuIGEgTWVkaWFTZXNzaW9uMiBpcyBjbG9zZWQsIHRoZXJlIGNvdWxkIGJlIGEgcGVuZGVkIG9wZXJhdGlvbiBpbiB0aGUgc2Vzc2lvbiBjYWxsYmFjawotICAgIC8vIGV4ZWN1dG9yIHRoYXQgbWF5IHdhbnQgdG8gYWNjZXNzIHRoZSBwbGF5ZXIuIEhlcmUncyB0aGUgc2FtcGxlIGNvZGUgc25pcHBldCBmb3IgdGhhdC4KLSAgICAvLwotICAgIC8vICAgcHVibGljIHZvaWQgb25Gb28oKSB7Ci0gICAgLy8gICAgIGlmIChtUGxheWVyID09IG51bGwpIHJldHVybjsgLy8gZmlyc3QgY2hlY2sKLSAgICAvLyAgICAgbVNlc3Npb25DYWxsYmFja0V4ZWN1dG9yLmV4ZWN1dG9yKCgpIC0+IHsKLSAgICAvLyAgICAgICAvLyBFcnJvci4gU2Vzc2lvbiBtYXkgYmUgY2xvc2VkIGFuZCBtUGxheWVyIGNhbiBiZSBudWxsIGhlcmUuCi0gICAgLy8gICAgICAgbVBsYXllci5mb28oKTsKLSAgICAvLyAgICAgfSk7Ci0gICAgLy8gICB9Ci0gICAgLy8KLSAgICAvLyBCeSBhZGRpbmcgcHJvdGVjdGl2ZSBjb2RlLCB3ZSBjYW4gYWxzbyBwcm90ZWN0IEFQSXMgZnJvbSBiZWluZyBjYWxsZWQgYWZ0ZXIgdGhlIGNsb3NlKCkKLSAgICAvLwotICAgIC8vIFRPRE8oamFld2FuKTogU2hvdWxkIHdlIHB1dCB2b2xhdGlsZSBoZXJlPwotICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKLSAgICBwcml2YXRlIE1lZGlhUGxheWVyQmFzZSBtUGxheWVyOwotICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKLSAgICBwcml2YXRlIE1lZGlhUGxheWxpc3RBZ2VudCBtUGxheWxpc3RBZ2VudDsKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBTZXNzaW9uUGxheWxpc3RBZ2VudCBtU2Vzc2lvblBsYXlsaXN0QWdlbnQ7Ci0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgVm9sdW1lUHJvdmlkZXIyIG1Wb2x1bWVQcm92aWRlcjsKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBQbGF5YmFja0luZm8gbVBsYXliYWNrSW5mbzsKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBPbkRhdGFTb3VyY2VNaXNzaW5nSGVscGVyIG1Ec21IZWxwZXI7Ci0KLSAgICAvKioKLSAgICAgKiBDYW4gYmUgb25seSBjYWxsZWQgYnkgdGhlIHtAbGluayBCdWlsZGVyI2J1aWxkKCl9LgotICAgICAqIEBwYXJhbSBjb250ZXh0Ci0gICAgICogQHBhcmFtIHBsYXllcgotICAgICAqIEBwYXJhbSBpZAotICAgICAqIEBwYXJhbSBwbGF5bGlzdEFnZW50Ci0gICAgICogQHBhcmFtIHZvbHVtZVByb3ZpZGVyCi0gICAgICogQHBhcmFtIHNlc3Npb25BY3Rpdml0eQotICAgICAqIEBwYXJhbSBjYWxsYmFja0V4ZWN1dG9yCi0gICAgICogQHBhcmFtIGNhbGxiYWNrCi0gICAgICovCi0gICAgcHVibGljIE1lZGlhU2Vzc2lvbjJJbXBsKENvbnRleHQgY29udGV4dCwgTWVkaWFQbGF5ZXJCYXNlIHBsYXllciwgU3RyaW5nIGlkLAotICAgICAgICAgICAgTWVkaWFQbGF5bGlzdEFnZW50IHBsYXlsaXN0QWdlbnQsIFZvbHVtZVByb3ZpZGVyMiB2b2x1bWVQcm92aWRlciwKLSAgICAgICAgICAgIFBlbmRpbmdJbnRlbnQgc2Vzc2lvbkFjdGl2aXR5LAotICAgICAgICAgICAgRXhlY3V0b3IgY2FsbGJhY2tFeGVjdXRvciwgU2Vzc2lvbkNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIC8vIFRPRE8oamFld2FuKTogS2VlcCBvdGhlciBwYXJhbXMuCi0gICAgICAgIG1JbnN0YW5jZSA9IGNyZWF0ZUluc3RhbmNlKCk7Ci0KLSAgICAgICAgLy8gQXJndW1lbnQgY2hlY2tzIGFyZSBkb25lIGJ5IGJ1aWxkZXIgYWxyZWFkeS4KLSAgICAgICAgLy8gSW5pdGlhbGl6ZSBmaW5hbHMgZmlyc3QuCi0gICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKLSAgICAgICAgbUlkID0gaWQ7Ci0gICAgICAgIG1DYWxsYmFjayA9IGNhbGxiYWNrOwotICAgICAgICBtQ2FsbGJhY2tFeGVjdXRvciA9IGNhbGxiYWNrRXhlY3V0b3I7Ci0gICAgICAgIG1TZXNzaW9uQWN0aXZpdHkgPSBzZXNzaW9uQWN0aXZpdHk7Ci0gICAgICAgIG1TZXNzaW9uU3R1YiA9IG5ldyBNZWRpYVNlc3Npb24yU3R1Yih0aGlzKTsKLSAgICAgICAgbUF1ZGlvTWFuYWdlciA9IChBdWRpb01hbmFnZXIpIGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkFVRElPX1NFUlZJQ0UpOwotICAgICAgICBtUGxheWVyRXZlbnRDYWxsYmFjayA9IG5ldyBNeVBsYXllckV2ZW50Q2FsbGJhY2sodGhpcyk7Ci0gICAgICAgIG1QbGF5bGlzdEV2ZW50Q2FsbGJhY2sgPSBuZXcgTXlQbGF5bGlzdEV2ZW50Q2FsbGJhY2sodGhpcyk7Ci0KLSAgICAgICAgLy8gSW5mZXIgdHlwZSBmcm9tIHRoZSBpZCBhbmQgcGFja2FnZSBuYW1lLgotICAgICAgICBTdHJpbmcgbGlicmFyeVNlcnZpY2UgPSBnZXRTZXJ2aWNlTmFtZShjb250ZXh0LCBNZWRpYUxpYnJhcnlTZXJ2aWNlMi5TRVJWSUNFX0lOVEVSRkFDRSwgaWQpOwotICAgICAgICBTdHJpbmcgc2Vzc2lvblNlcnZpY2UgPSBnZXRTZXJ2aWNlTmFtZShjb250ZXh0LCBNZWRpYVNlc3Npb25TZXJ2aWNlMi5TRVJWSUNFX0lOVEVSRkFDRSwgaWQpOwotICAgICAgICBpZiAoc2Vzc2lvblNlcnZpY2UgIT0gbnVsbCAmJiBsaWJyYXJ5U2VydmljZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJBbWJpZ3VvdXMgc2Vzc2lvbiB0eXBlLiBNdWx0aXBsZSIKLSAgICAgICAgICAgICAgICAgICAgKyAiIHNlc3Npb24gc2VydmljZXMgZGVmaW5lIHRoZSBzYW1lIGlkPSIgKyBpZCk7Ci0gICAgICAgIH0gZWxzZSBpZiAobGlicmFyeVNlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgbVNlc3Npb25Ub2tlbiA9IG5ldyBTZXNzaW9uVG9rZW4ySW1wbChQcm9jZXNzLm15VWlkKCksIFRZUEVfTElCUkFSWV9TRVJWSUNFLAotICAgICAgICAgICAgICAgICAgICBtQ29udGV4dC5nZXRQYWNrYWdlTmFtZSgpLCBsaWJyYXJ5U2VydmljZSwgaWQsIG1TZXNzaW9uU3R1YikuZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgfSBlbHNlIGlmIChzZXNzaW9uU2VydmljZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtU2Vzc2lvblRva2VuID0gbmV3IFNlc3Npb25Ub2tlbjJJbXBsKFByb2Nlc3MubXlVaWQoKSwgVFlQRV9TRVNTSU9OX1NFUlZJQ0UsCi0gICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LmdldFBhY2thZ2VOYW1lKCksIHNlc3Npb25TZXJ2aWNlLCBpZCwgbVNlc3Npb25TdHViKS5nZXRJbnN0YW5jZSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbVNlc3Npb25Ub2tlbiA9IG5ldyBTZXNzaW9uVG9rZW4ySW1wbChQcm9jZXNzLm15VWlkKCksIFRZUEVfU0VTU0lPTiwKLSAgICAgICAgICAgICAgICAgICAgbUNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKSwgbnVsbCwgaWQsIG1TZXNzaW9uU3R1YikuZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHVwZGF0ZVBsYXllcihwbGF5ZXIsIHBsYXlsaXN0QWdlbnQsIHZvbHVtZVByb3ZpZGVyKTsKLQotICAgICAgICAvLyBBc2sgc2VydmVyIGZvciB0aGUgc2FuaXR5IGNoZWNrLCBhbmQgc3RhcnRzCi0gICAgICAgIC8vIFNhbml0eSBjaGVjayBmb3IgbWFraW5nIHNlc3Npb24gSUQgdW5pcXVlICdwZXIgcGFja2FnZScgY2Fubm90IGJlIGRvbmUgaW4gaGVyZS4KLSAgICAgICAgLy8gU2VydmVyIGNhbiBvbmx5IGtub3cgaWYgdGhlIHBhY2thZ2UgaGFzIGFub3RoZXIgcHJvY2VzcyBhbmQgaGFzIGFub3RoZXIgc2Vzc2lvbiB3aXRoIHRoZQotICAgICAgICAvLyBzYW1lIGlkLiBOb3RlIHRoYXQgJ0lEIGlzIHVuaXF1ZSBwZXIgcGFja2FnZScgaXMgaW1wb3J0YW50IGZvciBjb250cm9sbGVyIHRvIGRpc3Rpbmd1aXNoCi0gICAgICAgIC8vIGEgc2Vzc2lvbiBpbiBhbm90aGVyIHBhY2thZ2UuCi0gICAgICAgIE1lZGlhU2Vzc2lvbk1hbmFnZXIgbWFuYWdlciA9Ci0gICAgICAgICAgICAgICAgKE1lZGlhU2Vzc2lvbk1hbmFnZXIpIG1Db250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5NRURJQV9TRVNTSU9OX1NFUlZJQ0UpOwotICAgICAgICBpZiAoIW1hbmFnZXIuY3JlYXRlU2Vzc2lvbjIobVNlc3Npb25Ub2tlbikpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlNlc3Npb24gd2l0aCB0aGUgc2FtZSBpZCBpcyBhbHJlYWR5IHVzZWQgYnkiCi0gICAgICAgICAgICAgICAgICAgICsgIiBhbm90aGVyIHByb2Nlc3MuIFVzZSBNZWRpYUNvbnRyb2xsZXIyIGluc3RlYWQuIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBNZWRpYVNlc3Npb24yIGNyZWF0ZUluc3RhbmNlKCkgewotICAgICAgICByZXR1cm4gbmV3IE1lZGlhU2Vzc2lvbjIodGhpcyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFNlcnZpY2VOYW1lKENvbnRleHQgY29udGV4dCwgU3RyaW5nIHNlcnZpY2VBY3Rpb24sIFN0cmluZyBpZCkgewotICAgICAgICBQYWNrYWdlTWFuYWdlciBtYW5hZ2VyID0gY29udGV4dC5nZXRQYWNrYWdlTWFuYWdlcigpOwotICAgICAgICBJbnRlbnQgc2VydmljZUludGVudCA9IG5ldyBJbnRlbnQoc2VydmljZUFjdGlvbik7Ci0gICAgICAgIHNlcnZpY2VJbnRlbnQuc2V0UGFja2FnZShjb250ZXh0LmdldFBhY2thZ2VOYW1lKCkpOwotICAgICAgICBMaXN0PFJlc29sdmVJbmZvPiBzZXJ2aWNlcyA9IG1hbmFnZXIucXVlcnlJbnRlbnRTZXJ2aWNlcyhzZXJ2aWNlSW50ZW50LAotICAgICAgICAgICAgICAgIFBhY2thZ2VNYW5hZ2VyLkdFVF9NRVRBX0RBVEEpOwotICAgICAgICBTdHJpbmcgc2VydmljZU5hbWUgPSBudWxsOwotICAgICAgICBpZiAoc2VydmljZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZXJ2aWNlcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIFN0cmluZyBzZXJ2aWNlSWQgPSBTZXNzaW9uVG9rZW4ySW1wbC5nZXRTZXNzaW9uSWQoc2VydmljZXMuZ2V0KGkpKTsKLSAgICAgICAgICAgICAgICBpZiAoc2VydmljZUlkICE9IG51bGwgJiYgVGV4dFV0aWxzLmVxdWFscyhpZCwgc2VydmljZUlkKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoc2VydmljZXMuZ2V0KGkpLnNlcnZpY2VJbmZvID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzZXJ2aWNlTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJBbWJpZ3VvdXMgc2Vzc2lvbiB0eXBlLiBNdWx0aXBsZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHNlc3Npb24gc2VydmljZXMgZGVmaW5lIHRoZSBzYW1lIGlkPSIgKyBpZCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc2VydmljZU5hbWUgPSBzZXJ2aWNlcy5nZXQoaSkuc2VydmljZUluZm8ubmFtZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNlcnZpY2VOYW1lOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZVBsYXllcl9pbXBsKEBOb25OdWxsIE1lZGlhUGxheWVyQmFzZSBwbGF5ZXIsIE1lZGlhUGxheWxpc3RBZ2VudCBwbGF5bGlzdEFnZW50LAotICAgICAgICAgICAgVm9sdW1lUHJvdmlkZXIyIHZvbHVtZVByb3ZpZGVyKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLSAgICAgICAgZW5zdXJlQ2FsbGluZ1RocmVhZCgpOwotICAgICAgICBpZiAocGxheWVyID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInBsYXllciBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIHVwZGF0ZVBsYXllcihwbGF5ZXIsIHBsYXlsaXN0QWdlbnQsIHZvbHVtZVByb3ZpZGVyKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlUGxheWVyKE1lZGlhUGxheWVyQmFzZSBwbGF5ZXIsIE1lZGlhUGxheWxpc3RBZ2VudCBhZ2VudCwKLSAgICAgICAgICAgIFZvbHVtZVByb3ZpZGVyMiB2b2x1bWVQcm92aWRlcikgewotICAgICAgICBmaW5hbCBNZWRpYVBsYXllckJhc2Ugb2xkUGxheWVyOwotICAgICAgICBmaW5hbCBNZWRpYVBsYXlsaXN0QWdlbnQgb2xkQWdlbnQ7Ci0gICAgICAgIGZpbmFsIFBsYXliYWNrSW5mbyBpbmZvID0gY3JlYXRlUGxheWJhY2tJbmZvKHZvbHVtZVByb3ZpZGVyLCBwbGF5ZXIuZ2V0QXVkaW9BdHRyaWJ1dGVzKCkpOwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBvbGRQbGF5ZXIgPSBtUGxheWVyOwotICAgICAgICAgICAgb2xkQWdlbnQgPSBtUGxheWxpc3RBZ2VudDsKLSAgICAgICAgICAgIG1QbGF5ZXIgPSBwbGF5ZXI7Ci0gICAgICAgICAgICBpZiAoYWdlbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1TZXNzaW9uUGxheWxpc3RBZ2VudCA9IG5ldyBTZXNzaW9uUGxheWxpc3RBZ2VudCh0aGlzLCBtUGxheWVyKTsKLSAgICAgICAgICAgICAgICBpZiAobURzbUhlbHBlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uUGxheWxpc3RBZ2VudC5zZXRPbkRhdGFTb3VyY2VNaXNzaW5nSGVscGVyKG1Ec21IZWxwZXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBhZ2VudCA9IG1TZXNzaW9uUGxheWxpc3RBZ2VudDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1QbGF5bGlzdEFnZW50ID0gYWdlbnQ7Ci0gICAgICAgICAgICBtVm9sdW1lUHJvdmlkZXIgPSB2b2x1bWVQcm92aWRlcjsKLSAgICAgICAgICAgIG1QbGF5YmFja0luZm8gPSBpbmZvOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwbGF5ZXIgIT0gb2xkUGxheWVyKSB7Ci0gICAgICAgICAgICBwbGF5ZXIucmVnaXN0ZXJQbGF5ZXJFdmVudENhbGxiYWNrKG1DYWxsYmFja0V4ZWN1dG9yLCBtUGxheWVyRXZlbnRDYWxsYmFjayk7Ci0gICAgICAgICAgICBpZiAob2xkUGxheWVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBXYXJuaW5nOiBQb29ybHkgaW1wbGVtZW50IHBsYXllciBtYXkgaWdub3JlIHRoaXMKLSAgICAgICAgICAgICAgICBvbGRQbGF5ZXIudW5yZWdpc3RlclBsYXllckV2ZW50Q2FsbGJhY2sobVBsYXllckV2ZW50Q2FsbGJhY2spOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChhZ2VudCAhPSBvbGRBZ2VudCkgewotICAgICAgICAgICAgYWdlbnQucmVnaXN0ZXJQbGF5bGlzdEV2ZW50Q2FsbGJhY2sobUNhbGxiYWNrRXhlY3V0b3IsIG1QbGF5bGlzdEV2ZW50Q2FsbGJhY2spOwotICAgICAgICAgICAgaWYgKG9sZEFnZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBXYXJuaW5nOiBQb29ybHkgaW1wbGVtZW50IHBsYXllciBtYXkgaWdub3JlIHRoaXMKLSAgICAgICAgICAgICAgICBvbGRBZ2VudC51bnJlZ2lzdGVyUGxheWxpc3RFdmVudENhbGxiYWNrKG1QbGF5bGlzdEV2ZW50Q2FsbGJhY2spOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG9sZFBsYXllciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtU2Vzc2lvblN0dWIubm90aWZ5UGxheWJhY2tJbmZvQ2hhbmdlZChpbmZvKTsKLSAgICAgICAgICAgIG5vdGlmeVBsYXllclVwZGF0ZWROb3RMb2NrZWQob2xkUGxheWVyKTsKLSAgICAgICAgfQotICAgICAgICAvLyBUT0RPKGphZXdhbik6IFJlcGVhdCB0aGUgc2FtZSB0aGluZyBmb3IgdGhlIHBsYXlsaXN0IGFnZW50LgotICAgIH0KLQotICAgIHByaXZhdGUgUGxheWJhY2tJbmZvIGNyZWF0ZVBsYXliYWNrSW5mbyhWb2x1bWVQcm92aWRlcjIgdm9sdW1lUHJvdmlkZXIsIEF1ZGlvQXR0cmlidXRlcyBhdHRycykgewotICAgICAgICBQbGF5YmFja0luZm8gaW5mbzsKLSAgICAgICAgaWYgKHZvbHVtZVByb3ZpZGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIGludCBzdHJlYW07Ci0gICAgICAgICAgICBpZiAoYXR0cnMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHN0cmVhbSA9IEF1ZGlvTWFuYWdlci5TVFJFQU1fTVVTSUM7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHN0cmVhbSA9IGF0dHJzLmdldFZvbHVtZUNvbnRyb2xTdHJlYW0oKTsKLSAgICAgICAgICAgICAgICBpZiAoc3RyZWFtID09IEF1ZGlvTWFuYWdlci5VU0VfREVGQVVMVF9TVFJFQU1fVFlQRSkgewotICAgICAgICAgICAgICAgICAgICAvLyBJdCBtYXkgaGFwcGVuIGlmIHRoZSBBdWRpb0F0dHJpYnV0ZXMgZG9lc24ndCBoYXZlIHVzYWdlLgotICAgICAgICAgICAgICAgICAgICAvLyBDaGFuZ2UgaXQgdG8gdGhlIFNUUkVBTV9NVVNJQyBiZWNhdXNlIGl0J3Mgbm90IHN1cHBvcnRlZCBieSBhdWRpbyBtYW5hZ2VyCi0gICAgICAgICAgICAgICAgICAgIC8vIGZvciBxdWVyeWluZyB2b2x1bWUgbGV2ZWwuCi0gICAgICAgICAgICAgICAgICAgIHN0cmVhbSA9IEF1ZGlvTWFuYWdlci5TVFJFQU1fTVVTSUM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW5mbyA9IE1lZGlhQ29udHJvbGxlcjJJbXBsLlBsYXliYWNrSW5mb0ltcGwuY3JlYXRlUGxheWJhY2tJbmZvKAotICAgICAgICAgICAgICAgICAgICBQbGF5YmFja0luZm8uUExBWUJBQ0tfVFlQRV9MT0NBTCwKLSAgICAgICAgICAgICAgICAgICAgYXR0cnMsCi0gICAgICAgICAgICAgICAgICAgIG1BdWRpb01hbmFnZXIuaXNWb2x1bWVGaXhlZCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBWb2x1bWVQcm92aWRlcjIuVk9MVU1FX0NPTlRST0xfRklYRUQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFZvbHVtZVByb3ZpZGVyMi5WT0xVTUVfQ09OVFJPTF9BQlNPTFVURSwKLSAgICAgICAgICAgICAgICAgICAgbUF1ZGlvTWFuYWdlci5nZXRTdHJlYW1NYXhWb2x1bWUoc3RyZWFtKSwKLSAgICAgICAgICAgICAgICAgICAgbUF1ZGlvTWFuYWdlci5nZXRTdHJlYW1Wb2x1bWUoc3RyZWFtKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpbmZvID0gTWVkaWFDb250cm9sbGVyMkltcGwuUGxheWJhY2tJbmZvSW1wbC5jcmVhdGVQbGF5YmFja0luZm8oCi0gICAgICAgICAgICAgICAgICAgIFBsYXliYWNrSW5mby5QTEFZQkFDS19UWVBFX1JFTU9URSAvKiBDb250cm9sVHlwZSAqLywKLSAgICAgICAgICAgICAgICAgICAgYXR0cnMsCi0gICAgICAgICAgICAgICAgICAgIHZvbHVtZVByb3ZpZGVyLmdldENvbnRyb2xUeXBlKCksCi0gICAgICAgICAgICAgICAgICAgIHZvbHVtZVByb3ZpZGVyLmdldE1heFZvbHVtZSgpLAotICAgICAgICAgICAgICAgICAgICB2b2x1bWVQcm92aWRlci5nZXRDdXJyZW50Vm9sdW1lKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpbmZvOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGNsb3NlX2ltcGwoKSB7Ci0gICAgICAgIC8vIFN0b3Agc3lzdGVtIHNlcnZpY2UgZnJvbSBsaXN0ZW5pbmcgdGhpcyBzZXNzaW9uIGZpcnN0LgotICAgICAgICBNZWRpYVNlc3Npb25NYW5hZ2VyIG1hbmFnZXIgPQotICAgICAgICAgICAgICAgIChNZWRpYVNlc3Npb25NYW5hZ2VyKSBtQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuTUVESUFfU0VTU0lPTl9TRVJWSUNFKTsKLSAgICAgICAgbWFuYWdlci5kZXN0cm95U2Vzc2lvbjIobVNlc3Npb25Ub2tlbik7Ci0KLSAgICAgICAgaWYgKG1TZXNzaW9uU3R1YiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJzZXNzaW9uIGlzIG5vdyB1bmF2YWlsYWJsZSwgaWQ9IiArIG1JZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnZhbGlkYXRlIHByZXZpb3VzbHkgcHVibGlzaGVkIHNlc3Npb24gc3R1Yi4KLSAgICAgICAgICAgIG1TZXNzaW9uU3R1Yi5kZXN0cm95Tm90TG9ja2VkKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgTWVkaWFQbGF5ZXJCYXNlIHBsYXllcjsKLSAgICAgICAgZmluYWwgTWVkaWFQbGF5bGlzdEFnZW50IGFnZW50OwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBwbGF5ZXIgPSBtUGxheWVyOwotICAgICAgICAgICAgbVBsYXllciA9IG51bGw7Ci0gICAgICAgICAgICBhZ2VudCA9IG1QbGF5bGlzdEFnZW50OwotICAgICAgICAgICAgbVBsYXlsaXN0QWdlbnQgPSBudWxsOwotICAgICAgICAgICAgbVNlc3Npb25QbGF5bGlzdEFnZW50ID0gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBpZiAocGxheWVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHBsYXllci51bnJlZ2lzdGVyUGxheWVyRXZlbnRDYWxsYmFjayhtUGxheWVyRXZlbnRDYWxsYmFjayk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGFnZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGFnZW50LnVucmVnaXN0ZXJQbGF5bGlzdEV2ZW50Q2FsbGJhY2sobVBsYXlsaXN0RXZlbnRDYWxsYmFjayk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTWVkaWFQbGF5ZXJCYXNlIGdldFBsYXllcl9pbXBsKCkgewotICAgICAgICByZXR1cm4gZ2V0UGxheWVyKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1lZGlhUGxheWxpc3RBZ2VudCBnZXRQbGF5bGlzdEFnZW50X2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtUGxheWxpc3RBZ2VudDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgVm9sdW1lUHJvdmlkZXIyIGdldFZvbHVtZVByb3ZpZGVyX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtVm9sdW1lUHJvdmlkZXI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFNlc3Npb25Ub2tlbjIgZ2V0VG9rZW5faW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG1TZXNzaW9uVG9rZW47Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIExpc3Q8Q29udHJvbGxlckluZm8+IGdldENvbm5lY3RlZENvbnRyb2xsZXJzX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtU2Vzc2lvblN0dWIuZ2V0Q29udHJvbGxlcnMoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRBdWRpb0ZvY3VzUmVxdWVzdF9pbXBsKEF1ZGlvRm9jdXNSZXF1ZXN0IGFmcikgewotICAgICAgICAvLyBpbXBsZW1lbnQKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwbGF5X2ltcGwoKSB7Ci0gICAgICAgIGVuc3VyZUNhbGxpbmdUaHJlYWQoKTsKLSAgICAgICAgZmluYWwgTWVkaWFQbGF5ZXJCYXNlIHBsYXllciA9IG1QbGF5ZXI7Ci0gICAgICAgIGlmIChwbGF5ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgcGxheWVyLnBsYXkoKTsKLSAgICAgICAgfSBlbHNlIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiQVBJIGNhbGxzIGFmdGVyIHRoZSBjbG9zZSgpIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHBhdXNlX2ltcGwoKSB7Ci0gICAgICAgIGVuc3VyZUNhbGxpbmdUaHJlYWQoKTsKLSAgICAgICAgZmluYWwgTWVkaWFQbGF5ZXJCYXNlIHBsYXllciA9IG1QbGF5ZXI7Ci0gICAgICAgIGlmIChwbGF5ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgcGxheWVyLnBhdXNlKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIkFQSSBjYWxscyBhZnRlciB0aGUgY2xvc2UoKSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzdG9wX2ltcGwoKSB7Ci0gICAgICAgIGVuc3VyZUNhbGxpbmdUaHJlYWQoKTsKLSAgICAgICAgZmluYWwgTWVkaWFQbGF5ZXJCYXNlIHBsYXllciA9IG1QbGF5ZXI7Ci0gICAgICAgIGlmIChwbGF5ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgcGxheWVyLnJlc2V0KCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIkFQSSBjYWxscyBhZnRlciB0aGUgY2xvc2UoKSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBza2lwVG9QbGF5bGlzdEl0ZW1faW1wbChATm9uTnVsbCBNZWRpYUl0ZW0yIGl0ZW0pIHsKLSAgICAgICAgaWYgKGl0ZW0gPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaXRlbSBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIE1lZGlhUGxheWxpc3RBZ2VudCBhZ2VudCA9IG1QbGF5bGlzdEFnZW50OwotICAgICAgICBpZiAoYWdlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgYWdlbnQuc2tpcFRvUGxheWxpc3RJdGVtKGl0ZW0pOwotICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJBUEkgY2FsbHMgYWZ0ZXIgdGhlIGNsb3NlKCkiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2tpcFRvUHJldmlvdXNJdGVtX2ltcGwoKSB7Ci0gICAgICAgIGZpbmFsIE1lZGlhUGxheWxpc3RBZ2VudCBhZ2VudCA9IG1QbGF5bGlzdEFnZW50OwotICAgICAgICBpZiAoYWdlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgYWdlbnQuc2tpcFRvUHJldmlvdXNJdGVtKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIkFQSSBjYWxscyBhZnRlciB0aGUgY2xvc2UoKSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBza2lwVG9OZXh0SXRlbV9pbXBsKCkgewotICAgICAgICBmaW5hbCBNZWRpYVBsYXlsaXN0QWdlbnQgYWdlbnQgPSBtUGxheWxpc3RBZ2VudDsKLSAgICAgICAgaWYgKGFnZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGFnZW50LnNraXBUb05leHRJdGVtKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIkFQSSBjYWxscyBhZnRlciB0aGUgY2xvc2UoKSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRDdXN0b21MYXlvdXRfaW1wbChATm9uTnVsbCBDb250cm9sbGVySW5mbyBjb250cm9sbGVyLAotICAgICAgICAgICAgQE5vbk51bGwgTGlzdDxDb21tYW5kQnV0dG9uPiBsYXlvdXQpIHsKLSAgICAgICAgZW5zdXJlQ2FsbGluZ1RocmVhZCgpOwotICAgICAgICBpZiAoY29udHJvbGxlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb250cm9sbGVyIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGxheW91dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJsYXlvdXQgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBtU2Vzc2lvblN0dWIubm90aWZ5Q3VzdG9tTGF5b3V0Tm90TG9ja2VkKGNvbnRyb2xsZXIsIGxheW91dCk7Ci0gICAgfQotCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAvLyBUT0RPKGphZXdhbik6IEltcGxlbWVudCBmb2xsb3dzCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldEFsbG93ZWRDb21tYW5kc19pbXBsKEBOb25OdWxsIENvbnRyb2xsZXJJbmZvIGNvbnRyb2xsZXIsCi0gICAgICAgICAgICBATm9uTnVsbCBTZXNzaW9uQ29tbWFuZEdyb3VwMiBjb21tYW5kcykgewotICAgICAgICBpZiAoY29udHJvbGxlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb250cm9sbGVyIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNvbW1hbmRzID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNvbW1hbmRzIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgbVNlc3Npb25TdHViLnNldEFsbG93ZWRDb21tYW5kcyhjb250cm9sbGVyLCBjb21tYW5kcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2VuZEN1c3RvbUNvbW1hbmRfaW1wbChATm9uTnVsbCBDb250cm9sbGVySW5mbyBjb250cm9sbGVyLAotICAgICAgICAgICAgQE5vbk51bGwgU2Vzc2lvbkNvbW1hbmQyIGNvbW1hbmQsIEJ1bmRsZSBhcmdzLCBSZXN1bHRSZWNlaXZlciByZWNlaXZlcikgewotICAgICAgICBpZiAoY29udHJvbGxlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb250cm9sbGVyIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNvbW1hbmQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY29tbWFuZCBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIG1TZXNzaW9uU3R1Yi5zZW5kQ3VzdG9tQ29tbWFuZChjb250cm9sbGVyLCBjb21tYW5kLCBhcmdzLCByZWNlaXZlcik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2VuZEN1c3RvbUNvbW1hbmRfaW1wbChATm9uTnVsbCBTZXNzaW9uQ29tbWFuZDIgY29tbWFuZCwgQnVuZGxlIGFyZ3MpIHsKLSAgICAgICAgaWYgKGNvbW1hbmQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY29tbWFuZCBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIG1TZXNzaW9uU3R1Yi5zZW5kQ3VzdG9tQ29tbWFuZChjb21tYW5kLCBhcmdzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRQbGF5bGlzdF9pbXBsKEBOb25OdWxsIExpc3Q8TWVkaWFJdGVtMj4gbGlzdCwgTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEpIHsKLSAgICAgICAgaWYgKGxpc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibGlzdCBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGVuc3VyZUNhbGxpbmdUaHJlYWQoKTsKLSAgICAgICAgZmluYWwgTWVkaWFQbGF5bGlzdEFnZW50IGFnZW50ID0gbVBsYXlsaXN0QWdlbnQ7Ci0gICAgICAgIGlmIChhZ2VudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBhZ2VudC5zZXRQbGF5bGlzdChsaXN0LCBtZXRhZGF0YSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIkFQSSBjYWxscyBhZnRlciB0aGUgY2xvc2UoKSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB1cGRhdGVQbGF5bGlzdE1ldGFkYXRhX2ltcGwoTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEpIHsKLSAgICAgICAgZmluYWwgTWVkaWFQbGF5bGlzdEFnZW50IGFnZW50ID0gbVBsYXlsaXN0QWdlbnQ7Ci0gICAgICAgIGlmIChhZ2VudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBhZ2VudC51cGRhdGVQbGF5bGlzdE1ldGFkYXRhKG1ldGFkYXRhKTsKLSAgICAgICAgfSBlbHNlIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiQVBJIGNhbGxzIGFmdGVyIHRoZSBjbG9zZSgpIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGFkZFBsYXlsaXN0SXRlbV9pbXBsKGludCBpbmRleCwgQE5vbk51bGwgTWVkaWFJdGVtMiBpdGVtKSB7Ci0gICAgICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImluZGV4IHNob3VsZG4ndCBiZSBuZWdhdGl2ZSIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpdGVtID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIml0ZW0gc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBNZWRpYVBsYXlsaXN0QWdlbnQgYWdlbnQgPSBtUGxheWxpc3RBZ2VudDsKLSAgICAgICAgaWYgKGFnZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGFnZW50LmFkZFBsYXlsaXN0SXRlbShpbmRleCwgaXRlbSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIkFQSSBjYWxscyBhZnRlciB0aGUgY2xvc2UoKSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCByZW1vdmVQbGF5bGlzdEl0ZW1faW1wbChATm9uTnVsbCBNZWRpYUl0ZW0yIGl0ZW0pIHsKLSAgICAgICAgaWYgKGl0ZW0gPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaXRlbSBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIE1lZGlhUGxheWxpc3RBZ2VudCBhZ2VudCA9IG1QbGF5bGlzdEFnZW50OwotICAgICAgICBpZiAoYWdlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgYWdlbnQucmVtb3ZlUGxheWxpc3RJdGVtKGl0ZW0pOwotICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJBUEkgY2FsbHMgYWZ0ZXIgdGhlIGNsb3NlKCkiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcmVwbGFjZVBsYXlsaXN0SXRlbV9pbXBsKGludCBpbmRleCwgQE5vbk51bGwgTWVkaWFJdGVtMiBpdGVtKSB7Ci0gICAgICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImluZGV4IHNob3VsZG4ndCBiZSBuZWdhdGl2ZSIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpdGVtID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIml0ZW0gc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBNZWRpYVBsYXlsaXN0QWdlbnQgYWdlbnQgPSBtUGxheWxpc3RBZ2VudDsKLSAgICAgICAgaWYgKGFnZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGFnZW50LnJlcGxhY2VQbGF5bGlzdEl0ZW0oaW5kZXgsIGl0ZW0pOwotICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJBUEkgY2FsbHMgYWZ0ZXIgdGhlIGNsb3NlKCkiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIExpc3Q8TWVkaWFJdGVtMj4gZ2V0UGxheWxpc3RfaW1wbCgpIHsKLSAgICAgICAgZmluYWwgTWVkaWFQbGF5bGlzdEFnZW50IGFnZW50ID0gbVBsYXlsaXN0QWdlbnQ7Ci0gICAgICAgIGlmIChhZ2VudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gYWdlbnQuZ2V0UGxheWxpc3QoKTsKLSAgICAgICAgfSBlbHNlIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiQVBJIGNhbGxzIGFmdGVyIHRoZSBjbG9zZSgpIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTWVkaWFNZXRhZGF0YTIgZ2V0UGxheWxpc3RNZXRhZGF0YV9pbXBsKCkgewotICAgICAgICBmaW5hbCBNZWRpYVBsYXlsaXN0QWdlbnQgYWdlbnQgPSBtUGxheWxpc3RBZ2VudDsKLSAgICAgICAgaWYgKGFnZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBhZ2VudC5nZXRQbGF5bGlzdE1ldGFkYXRhKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIkFQSSBjYWxscyBhZnRlciB0aGUgY2xvc2UoKSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1lZGlhSXRlbTIgZ2V0Q3VycmVudFBsYXlsaXN0SXRlbV9pbXBsKCkgewotICAgICAgICAvLyBUT0RPKGphZXdhbik6IEltcGxlbWVudAotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGdldFJlcGVhdE1vZGVfaW1wbCgpIHsKLSAgICAgICAgZmluYWwgTWVkaWFQbGF5bGlzdEFnZW50IGFnZW50ID0gbVBsYXlsaXN0QWdlbnQ7Ci0gICAgICAgIGlmIChhZ2VudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gYWdlbnQuZ2V0UmVwZWF0TW9kZSgpOwotICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJBUEkgY2FsbHMgYWZ0ZXIgdGhlIGNsb3NlKCkiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBNZWRpYVBsYXlsaXN0QWdlbnQuUkVQRUFUX01PREVfTk9ORTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRSZXBlYXRNb2RlX2ltcGwoaW50IHJlcGVhdE1vZGUpIHsKLSAgICAgICAgZmluYWwgTWVkaWFQbGF5bGlzdEFnZW50IGFnZW50ID0gbVBsYXlsaXN0QWdlbnQ7Ci0gICAgICAgIGlmIChhZ2VudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBhZ2VudC5zZXRSZXBlYXRNb2RlKHJlcGVhdE1vZGUpOwotICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJBUEkgY2FsbHMgYWZ0ZXIgdGhlIGNsb3NlKCkiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBnZXRTaHVmZmxlTW9kZV9pbXBsKCkgewotICAgICAgICBmaW5hbCBNZWRpYVBsYXlsaXN0QWdlbnQgYWdlbnQgPSBtUGxheWxpc3RBZ2VudDsKLSAgICAgICAgaWYgKGFnZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBhZ2VudC5nZXRTaHVmZmxlTW9kZSgpOwotICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJBUEkgY2FsbHMgYWZ0ZXIgdGhlIGNsb3NlKCkiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBNZWRpYVBsYXlsaXN0QWdlbnQuU0hVRkZMRV9NT0RFX05PTkU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0U2h1ZmZsZU1vZGVfaW1wbChpbnQgc2h1ZmZsZU1vZGUpIHsKLSAgICAgICAgZmluYWwgTWVkaWFQbGF5bGlzdEFnZW50IGFnZW50ID0gbVBsYXlsaXN0QWdlbnQ7Ci0gICAgICAgIGlmIChhZ2VudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBhZ2VudC5zZXRTaHVmZmxlTW9kZShzaHVmZmxlTW9kZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIkFQSSBjYWxscyBhZnRlciB0aGUgY2xvc2UoKSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwcmVwYXJlX2ltcGwoKSB7Ci0gICAgICAgIGVuc3VyZUNhbGxpbmdUaHJlYWQoKTsKLSAgICAgICAgZmluYWwgTWVkaWFQbGF5ZXJCYXNlIHBsYXllciA9IG1QbGF5ZXI7Ci0gICAgICAgIGlmIChwbGF5ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgcGxheWVyLnByZXBhcmUoKTsKLSAgICAgICAgfSBlbHNlIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiQVBJIGNhbGxzIGFmdGVyIHRoZSBjbG9zZSgpIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNlZWtUb19pbXBsKGxvbmcgcG9zKSB7Ci0gICAgICAgIGVuc3VyZUNhbGxpbmdUaHJlYWQoKTsKLSAgICAgICAgZmluYWwgTWVkaWFQbGF5ZXJCYXNlIHBsYXllciA9IG1QbGF5ZXI7Ci0gICAgICAgIGlmIChwbGF5ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgcGxheWVyLnNlZWtUbyhwb3MpOwotICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJBUEkgY2FsbHMgYWZ0ZXIgdGhlIGNsb3NlKCkiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEBQbGF5ZXJTdGF0ZSBpbnQgZ2V0UGxheWVyU3RhdGVfaW1wbCgpIHsKLSAgICAgICAgZmluYWwgTWVkaWFQbGF5ZXJCYXNlIHBsYXllciA9IG1QbGF5ZXI7Ci0gICAgICAgIGlmIChwbGF5ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG1QbGF5ZXIuZ2V0UGxheWVyU3RhdGUoKTsKLSAgICAgICAgfSBlbHNlIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiQVBJIGNhbGxzIGFmdGVyIHRoZSBjbG9zZSgpIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gTWVkaWFQbGF5ZXJCYXNlLlBMQVlFUl9TVEFURV9FUlJPUjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgbG9uZyBnZXRDdXJyZW50UG9zaXRpb25faW1wbCgpIHsKLSAgICAgICAgZmluYWwgTWVkaWFQbGF5ZXJCYXNlIHBsYXllciA9IG1QbGF5ZXI7Ci0gICAgICAgIGlmIChwbGF5ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG1QbGF5ZXIuZ2V0Q3VycmVudFBvc2l0aW9uKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIkFQSSBjYWxscyBhZnRlciB0aGUgY2xvc2UoKSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIE1lZGlhUGxheWVyQmFzZS5VTktOT1dOX1RJTUU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGxvbmcgZ2V0QnVmZmVyZWRQb3NpdGlvbl9pbXBsKCkgewotICAgICAgICBmaW5hbCBNZWRpYVBsYXllckJhc2UgcGxheWVyID0gbVBsYXllcjsKLSAgICAgICAgaWYgKHBsYXllciAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVBsYXllci5nZXRCdWZmZXJlZFBvc2l0aW9uKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIkFQSSBjYWxscyBhZnRlciB0aGUgY2xvc2UoKSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIE1lZGlhUGxheWVyQmFzZS5VTktOT1dOX1RJTUU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgbm90aWZ5RXJyb3JfaW1wbChpbnQgZXJyb3JDb2RlLCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIG1TZXNzaW9uU3R1Yi5ub3RpZnlFcnJvcihlcnJvckNvZGUsIGV4dHJhcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0T25EYXRhU291cmNlTWlzc2luZ0hlbHBlcl9pbXBsKEBOb25OdWxsIE9uRGF0YVNvdXJjZU1pc3NpbmdIZWxwZXIgaGVscGVyKSB7Ci0gICAgICAgIGlmIChoZWxwZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaGVscGVyIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgbURzbUhlbHBlciA9IGhlbHBlcjsKLSAgICAgICAgICAgIGlmIChtU2Vzc2lvblBsYXlsaXN0QWdlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1TZXNzaW9uUGxheWxpc3RBZ2VudC5zZXRPbkRhdGFTb3VyY2VNaXNzaW5nSGVscGVyKGhlbHBlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBjbGVhck9uRGF0YVNvdXJjZU1pc3NpbmdIZWxwZXJfaW1wbCgpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgbURzbUhlbHBlciA9IG51bGw7Ci0gICAgICAgICAgICBpZiAobVNlc3Npb25QbGF5bGlzdEFnZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtU2Vzc2lvblBsYXlsaXN0QWdlbnQuY2xlYXJPbkRhdGFTb3VyY2VNaXNzaW5nSGVscGVyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAvLyBQcm90ZWN0ZWQgb3IgcHJpdmF0ZSBtZXRob2RzCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLSAgICAvLyBFbmZvcmNlcyBkZXZlbG9wZXJzIHRvIGNhbGwgYWxsIHRoZSBtZXRob2RzIG9uIHRoZSBpbml0aWFsbHkgZ2l2ZW4gdGhyZWFkCi0gICAgLy8gYmVjYXVzZSBjYWxscyBmcm9tIHRoZSBNZWRpYUNvbnRyb2xsZXIyIHdpbGwgYmUgcnVuIG9uIHRoZSB0aHJlYWQuCi0gICAgLy8gVE9ETyhqYWV3YW4pOiBTaG91bGQgd2UgYWxsb3cgY2FsbHMgZnJvbSB0aGUgbXVsdGlwbGUgdGhyZWFkPwotICAgIC8vICAgICAgICAgICAgICAgSSBwcmVmZXIgdGhpcyB3YXkgYmVjYXVzZSBhbGxvd2luZyBtdWx0aXBsZSB0aHJlYWQgbWF5IGNhc2UgdHJpY2t5IGlzc3VlIGxpa2UKLSAgICAvLyAgICAgICAgICAgICAgIGIvNjM0NDYzNjAuIElmIHRoZSB7QGxpbmsgI3NldFBsYXllcigpfSB3aXRoIHtAY29kZSBudWxsfSBjYW4gYmUgY2FsbGVkIGZyb20KLSAgICAvLyAgICAgICAgICAgICAgIGFub3RoZXIgdGhyZWFkLCB0cmFuc3BvcnQgY29udHJvbHMgY2FuIGJlIGNhbGxlZCBhZnRlciB0aGF0LgotICAgIC8vICAgICAgICAgICAgICAgVGhhdCdzIGJhc2ljYWxseSB0aGUgZGV2ZWxvcGVyJ3MgbWlzdGFrZSwgYnV0IHRoZXkgY2Fubm90IHVuZGVyc3RhbmQgd2hhdCdzCi0gICAgLy8gICAgICAgICAgICAgICBoYXBwZW5pbmcgYmVoaW5kIHVudGlsIHdlIHRlbGwgdGhlbSBzby4KLSAgICAvLyAgICAgICAgICAgICAgIElmIGVuZm9yY2luZyBjYWxsbGluZyB0aHJlYWQgZG9lc24ndCBsb29rIGdvb2QsIHdlIGNhbiBhbHRlcm5hdGl2ZWx5IHBpY2sKLSAgICAvLyAgICAgICAgICAgICAgIDEuIEFsbG93IGNhbGxzIGZyb20gcmFuZG9tIHRocmVhZHMgZm9yIGFsbCBtZXRob2RzLgotICAgIC8vICAgICAgICAgICAgICAgMi4gQWxsb3cgY2FsbHMgZnJvbSByYW5kb20gdGhyZWFkcyBmb3IgYWxsIG1ldGhvZHMsIGV4Y2VwdCBmb3IgdGhlCi0gICAgLy8gICAgICAgICAgICAgICAgICB7QGxpbmsgI3NldFBsYXllcigpfS4KLSAgICB2b2lkIGVuc3VyZUNhbGxpbmdUaHJlYWQoKSB7Ci0gICAgICAgIC8vIFRPRE8oamFld2FuKTogVW5jb21tZW50IG9yIHJlbW92ZQotICAgICAgICAvKgotICAgICAgICBpZiAobUhhbmRsZXIuZ2V0TG9vcGVyKCkgIT0gTG9vcGVyLm15TG9vcGVyKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlJ1biB0aGlzIG9uIHRoZSBnaXZlbiB0aHJlYWQiKTsKLSAgICAgICAgfSovCi0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIG5vdGlmeVBsYXlsaXN0Q2hhbmdlZE9uRXhlY3V0b3IoTWVkaWFQbGF5bGlzdEFnZW50IHBsYXlsaXN0QWdlbnQsCi0gICAgICAgICAgICBMaXN0PE1lZGlhSXRlbTI+IGxpc3QsIE1lZGlhTWV0YWRhdGEyIG1ldGFkYXRhKSB7Ci0gICAgICAgIGlmIChwbGF5bGlzdEFnZW50ICE9IG1QbGF5bGlzdEFnZW50KSB7Ci0gICAgICAgICAgICAvLyBJZ25vcmUgY2FsbHMgZnJvbSB0aGUgb2xkIGFnZW50LgotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIG1DYWxsYmFjay5vblBsYXlsaXN0Q2hhbmdlZChtSW5zdGFuY2UsIHBsYXlsaXN0QWdlbnQsIGxpc3QsIG1ldGFkYXRhKTsKLSAgICAgICAgbVNlc3Npb25TdHViLm5vdGlmeVBsYXlsaXN0Q2hhbmdlZE5vdExvY2tlZChsaXN0LCBtZXRhZGF0YSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIG5vdGlmeVBsYXlsaXN0TWV0YWRhdGFDaGFuZ2VkT25FeGVjdXRvcihNZWRpYVBsYXlsaXN0QWdlbnQgcGxheWxpc3RBZ2VudCwKLSAgICAgICAgICAgIE1lZGlhTWV0YWRhdGEyIG1ldGFkYXRhKSB7Ci0gICAgICAgIGlmIChwbGF5bGlzdEFnZW50ICE9IG1QbGF5bGlzdEFnZW50KSB7Ci0gICAgICAgICAgICAvLyBJZ25vcmUgY2FsbHMgZnJvbSB0aGUgb2xkIGFnZW50LgotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIG1DYWxsYmFjay5vblBsYXlsaXN0TWV0YWRhdGFDaGFuZ2VkKG1JbnN0YW5jZSwgcGxheWxpc3RBZ2VudCwgbWV0YWRhdGEpOwotICAgICAgICBtU2Vzc2lvblN0dWIubm90aWZ5UGxheWxpc3RNZXRhZGF0YUNoYW5nZWROb3RMb2NrZWQobWV0YWRhdGEpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBub3RpZnlSZXBlYXRNb2RlQ2hhbmdlZE9uRXhlY3V0b3IoTWVkaWFQbGF5bGlzdEFnZW50IHBsYXlsaXN0QWdlbnQsCi0gICAgICAgICAgICBpbnQgcmVwZWF0TW9kZSkgewotICAgICAgICBpZiAocGxheWxpc3RBZ2VudCAhPSBtUGxheWxpc3RBZ2VudCkgewotICAgICAgICAgICAgLy8gSWdub3JlIGNhbGxzIGZyb20gdGhlIG9sZCBhZ2VudC4KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBtQ2FsbGJhY2sub25SZXBlYXRNb2RlQ2hhbmdlZChtSW5zdGFuY2UsIHBsYXlsaXN0QWdlbnQsIHJlcGVhdE1vZGUpOwotICAgICAgICBtU2Vzc2lvblN0dWIubm90aWZ5UmVwZWF0TW9kZUNoYW5nZWROb3RMb2NrZWQocmVwZWF0TW9kZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIG5vdGlmeVNodWZmbGVNb2RlQ2hhbmdlZE9uRXhlY3V0b3IoTWVkaWFQbGF5bGlzdEFnZW50IHBsYXlsaXN0QWdlbnQsCi0gICAgICAgICAgICBpbnQgc2h1ZmZsZU1vZGUpIHsKLSAgICAgICAgaWYgKHBsYXlsaXN0QWdlbnQgIT0gbVBsYXlsaXN0QWdlbnQpIHsKLSAgICAgICAgICAgIC8vIElnbm9yZSBjYWxscyBmcm9tIHRoZSBvbGQgYWdlbnQuCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgbUNhbGxiYWNrLm9uU2h1ZmZsZU1vZGVDaGFuZ2VkKG1JbnN0YW5jZSwgcGxheWxpc3RBZ2VudCwgc2h1ZmZsZU1vZGUpOwotICAgICAgICBtU2Vzc2lvblN0dWIubm90aWZ5U2h1ZmZsZU1vZGVDaGFuZ2VkTm90TG9ja2VkKHNodWZmbGVNb2RlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgbm90aWZ5UGxheWVyVXBkYXRlZE5vdExvY2tlZChNZWRpYVBsYXllckJhc2Ugb2xkUGxheWVyKSB7Ci0gICAgICAgIGZpbmFsIE1lZGlhUGxheWVyQmFzZSBwbGF5ZXIgPSBtUGxheWVyOwotICAgICAgICAvLyBUT0RPKGphZXdhbik6IChDYW4gYmUgcG9zdC1QKSBGaW5kIGJldHRlciB3YXkgZm9yIHBsYXllci5nZXRQbGF5ZXJTdGF0ZSgpIC8vCi0gICAgICAgIC8vICAgICAgICAgICAgICAgSW4gdGhlb3J5LCBTZXNzaW9uLmdldFhYWCgpIG1heSBub3QgYmUgdGhlIHNhbWUgYXMgUGxheWVyLmdldFhYWCgpCi0gICAgICAgIC8vICAgICAgICAgICAgICAgYW5kIHdlIHNob3VsZCBub3RpZnkgaW5mb3JtYXRpb24gb2YgdGhlIHNlc3Npb24uZ2V0WFhYKCkgaW5zdGVhZCBvZgotICAgICAgICAvLyAgICAgICAgICAgICAgIHBsYXllci5nZXRYWFgoKQotICAgICAgICAvLyBOb3RpZnkgdG8gY29udHJvbGxlcnMgYXMgd2VsbC4KLSAgICAgICAgZmluYWwgaW50IHN0YXRlID0gcGxheWVyLmdldFBsYXllclN0YXRlKCk7Ci0gICAgICAgIGlmIChzdGF0ZSAhPSBvbGRQbGF5ZXIuZ2V0UGxheWVyU3RhdGUoKSkgewotICAgICAgICAgICAgbVNlc3Npb25TdHViLm5vdGlmeVBsYXllclN0YXRlQ2hhbmdlZE5vdExvY2tlZChzdGF0ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBsb25nIGN1cnJlbnRUaW1lTXMgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgZmluYWwgbG9uZyBwb3NpdGlvbiA9IHBsYXllci5nZXRDdXJyZW50UG9zaXRpb24oKTsKLSAgICAgICAgaWYgKHBvc2l0aW9uICE9IG9sZFBsYXllci5nZXRDdXJyZW50UG9zaXRpb24oKSkgewotICAgICAgICAgICAgbVNlc3Npb25TdHViLm5vdGlmeVBvc2l0aW9uQ2hhbmdlZE5vdExvY2tlZChjdXJyZW50VGltZU1zLCBwb3NpdGlvbik7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBmbG9hdCBzcGVlZCA9IHBsYXllci5nZXRQbGF5YmFja1NwZWVkKCk7Ci0gICAgICAgIGlmIChzcGVlZCAhPSBvbGRQbGF5ZXIuZ2V0UGxheWJhY2tTcGVlZCgpKSB7Ci0gICAgICAgICAgICBtU2Vzc2lvblN0dWIubm90aWZ5UGxheWJhY2tTcGVlZENoYW5nZWROb3RMb2NrZWQoc3BlZWQpOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgbG9uZyBidWZmZXJlZFBvc2l0aW9uID0gcGxheWVyLmdldEJ1ZmZlcmVkUG9zaXRpb24oKTsKLSAgICAgICAgaWYgKGJ1ZmZlcmVkUG9zaXRpb24gIT0gb2xkUGxheWVyLmdldEJ1ZmZlcmVkUG9zaXRpb24oKSkgewotICAgICAgICAgICAgbVNlc3Npb25TdHViLm5vdGlmeUJ1ZmZlcmVkUG9zaXRpb25DaGFuZ2VkTm90TG9ja2VkKGJ1ZmZlcmVkUG9zaXRpb24pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQ29udGV4dCBnZXRDb250ZXh0KCkgewotICAgICAgICByZXR1cm4gbUNvbnRleHQ7Ci0gICAgfQotCi0gICAgTWVkaWFTZXNzaW9uMiBnZXRJbnN0YW5jZSgpIHsKLSAgICAgICAgcmV0dXJuIG1JbnN0YW5jZTsKLSAgICB9Ci0KLSAgICBNZWRpYVBsYXllckJhc2UgZ2V0UGxheWVyKCkgewotICAgICAgICByZXR1cm4gbVBsYXllcjsKLSAgICB9Ci0KLSAgICBNZWRpYVBsYXlsaXN0QWdlbnQgZ2V0UGxheWxpc3RBZ2VudCgpIHsKLSAgICAgICAgcmV0dXJuIG1QbGF5bGlzdEFnZW50OwotICAgIH0KLQotICAgIEV4ZWN1dG9yIGdldENhbGxiYWNrRXhlY3V0b3IoKSB7Ci0gICAgICAgIHJldHVybiBtQ2FsbGJhY2tFeGVjdXRvcjsKLSAgICB9Ci0KLSAgICBTZXNzaW9uQ2FsbGJhY2sgZ2V0Q2FsbGJhY2soKSB7Ci0gICAgICAgIHJldHVybiBtQ2FsbGJhY2s7Ci0gICAgfQotCi0gICAgTWVkaWFTZXNzaW9uMlN0dWIgZ2V0U2Vzc2lvblN0dWIoKSB7Ci0gICAgICAgIHJldHVybiBtU2Vzc2lvblN0dWI7Ci0gICAgfQotCi0gICAgVm9sdW1lUHJvdmlkZXIyIGdldFZvbHVtZVByb3ZpZGVyKCkgewotICAgICAgICByZXR1cm4gbVZvbHVtZVByb3ZpZGVyOwotICAgIH0KLQotICAgIFBsYXliYWNrSW5mbyBnZXRQbGF5YmFja0luZm8oKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIHJldHVybiBtUGxheWJhY2tJbmZvOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgUGVuZGluZ0ludGVudCBnZXRTZXNzaW9uQWN0aXZpdHkoKSB7Ci0gICAgICAgIHJldHVybiBtU2Vzc2lvbkFjdGl2aXR5OwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE15UGxheWVyRXZlbnRDYWxsYmFjayBleHRlbmRzIFBsYXllckV2ZW50Q2FsbGJhY2sgewotICAgICAgICBwcml2YXRlIGZpbmFsIFdlYWtSZWZlcmVuY2U8TWVkaWFTZXNzaW9uMkltcGw+IG1TZXNzaW9uOwotCi0gICAgICAgIHByaXZhdGUgTXlQbGF5ZXJFdmVudENhbGxiYWNrKE1lZGlhU2Vzc2lvbjJJbXBsIHNlc3Npb24pIHsKLSAgICAgICAgICAgIG1TZXNzaW9uID0gbmV3IFdlYWtSZWZlcmVuY2U8PihzZXNzaW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbkN1cnJlbnREYXRhU291cmNlQ2hhbmdlZChNZWRpYVBsYXllckJhc2UgbXBiLCBEYXRhU291cmNlRGVzYyBkc2QpIHsKLSAgICAgICAgICAgIE1lZGlhU2Vzc2lvbjJJbXBsIHNlc3Npb24gPSBnZXRTZXNzaW9uKCk7Ci0gICAgICAgICAgICBpZiAoc2Vzc2lvbiA9PSBudWxsIHx8IGRzZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2Vzc2lvbi5nZXRDYWxsYmFja0V4ZWN1dG9yKCkuZXhlY3V0ZSgoKSAtPiB7Ci0gICAgICAgICAgICAgICAgTWVkaWFJdGVtMiBpdGVtID0gZ2V0TWVkaWFJdGVtKHNlc3Npb24sIGRzZCk7Ci0gICAgICAgICAgICAgICAgaWYgKGl0ZW0gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0Q2FsbGJhY2soKS5vbkN1cnJlbnRNZWRpYUl0ZW1DaGFuZ2VkKHNlc3Npb24uZ2V0SW5zdGFuY2UoKSwgbXBiLCBpdGVtKTsKLSAgICAgICAgICAgICAgICAvLyBUT0RPIChqYWV3YW4pOiBOb3RpZnkgY29udHJvbGxlcnMgdGhyb3VnaCBhcHByb3ByaWF0ZSBjYWxsYmFjay4gKGIvNzQ1MDU5MzYpCi0gICAgICAgICAgICB9KTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbk1lZGlhUHJlcGFyZWQoTWVkaWFQbGF5ZXJCYXNlIG1wYiwgRGF0YVNvdXJjZURlc2MgZHNkKSB7Ci0gICAgICAgICAgICBNZWRpYVNlc3Npb24ySW1wbCBzZXNzaW9uID0gZ2V0U2Vzc2lvbigpOwotICAgICAgICAgICAgaWYgKHNlc3Npb24gPT0gbnVsbCB8fCBkc2QgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNlc3Npb24uZ2V0Q2FsbGJhY2tFeGVjdXRvcigpLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgICAgIE1lZGlhSXRlbTIgaXRlbSA9IGdldE1lZGlhSXRlbShzZXNzaW9uLCBkc2QpOwotICAgICAgICAgICAgICAgIGlmIChpdGVtID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzZXNzaW9uLmdldENhbGxiYWNrKCkub25NZWRpYVByZXBhcmVkKHNlc3Npb24uZ2V0SW5zdGFuY2UoKSwgbXBiLCBpdGVtKTsKLSAgICAgICAgICAgICAgICAvLyBUT0RPIChqYWV3YW4pOiBOb3RpZnkgY29udHJvbGxlcnMgdGhyb3VnaCBhcHByb3ByaWF0ZSBjYWxsYmFjay4gKGIvNzQ1MDU5MzYpCi0gICAgICAgICAgICB9KTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblBsYXllclN0YXRlQ2hhbmdlZChNZWRpYVBsYXllckJhc2UgbXBiLCBpbnQgc3RhdGUpIHsKLSAgICAgICAgICAgIE1lZGlhU2Vzc2lvbjJJbXBsIHNlc3Npb24gPSBnZXRTZXNzaW9uKCk7Ci0gICAgICAgICAgICBpZiAoc2Vzc2lvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2Vzc2lvbi5nZXRDYWxsYmFja0V4ZWN1dG9yKCkuZXhlY3V0ZSgoKSAtPiB7Ci0gICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRDYWxsYmFjaygpLm9uUGxheWVyU3RhdGVDaGFuZ2VkKHNlc3Npb24uZ2V0SW5zdGFuY2UoKSwgbXBiLCBzdGF0ZSk7Ci0gICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRTZXNzaW9uU3R1YigpLm5vdGlmeVBsYXllclN0YXRlQ2hhbmdlZE5vdExvY2tlZChzdGF0ZSk7Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbkJ1ZmZlcmluZ1N0YXRlQ2hhbmdlZChNZWRpYVBsYXllckJhc2UgbXBiLCBEYXRhU291cmNlRGVzYyBkc2QsIGludCBzdGF0ZSkgewotICAgICAgICAgICAgTWVkaWFTZXNzaW9uMkltcGwgc2Vzc2lvbiA9IGdldFNlc3Npb24oKTsKLSAgICAgICAgICAgIGlmIChzZXNzaW9uID09IG51bGwgfHwgZHNkID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXNzaW9uLmdldENhbGxiYWNrRXhlY3V0b3IoKS5leGVjdXRlKCgpIC0+IHsKLSAgICAgICAgICAgICAgICBNZWRpYUl0ZW0yIGl0ZW0gPSBnZXRNZWRpYUl0ZW0oc2Vzc2lvbiwgZHNkKTsKLSAgICAgICAgICAgICAgICBpZiAoaXRlbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRDYWxsYmFjaygpLm9uQnVmZmVyaW5nU3RhdGVDaGFuZ2VkKAotICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLCBtcGIsIGl0ZW0sIHN0YXRlKTsKLSAgICAgICAgICAgICAgICAvLyBUT0RPIChqYWV3YW4pOiBOb3RpZnkgY29udHJvbGxlcnMgdGhyb3VnaCBhcHByb3ByaWF0ZSBjYWxsYmFjay4gKGIvNzQ1MDU5MzYpCi0gICAgICAgICAgICB9KTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgTWVkaWFTZXNzaW9uMkltcGwgZ2V0U2Vzc2lvbigpIHsKLSAgICAgICAgICAgIGZpbmFsIE1lZGlhU2Vzc2lvbjJJbXBsIHNlc3Npb24gPSBtU2Vzc2lvbi5nZXQoKTsKLSAgICAgICAgICAgIGlmIChzZXNzaW9uID09IG51bGwgJiYgREVCVUcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJTZXNzaW9uIGlzIGNsb3NlZCIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gc2Vzc2lvbjsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgTWVkaWFJdGVtMiBnZXRNZWRpYUl0ZW0oTWVkaWFTZXNzaW9uMkltcGwgc2Vzc2lvbiwgRGF0YVNvdXJjZURlc2MgZHNkKSB7Ci0gICAgICAgICAgICBNZWRpYVBsYXlsaXN0QWdlbnQgYWdlbnQgPSBzZXNzaW9uLmdldFBsYXlsaXN0QWdlbnQoKTsKLSAgICAgICAgICAgIGlmIChhZ2VudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlNlc3Npb24gaXMgY2xvc2VkIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBNZWRpYUl0ZW0yIGl0ZW0gPSBhZ2VudC5nZXRNZWRpYUl0ZW0oZHNkKTsKLSAgICAgICAgICAgIGlmIChpdGVtID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiQ291bGQgbm90IGZpbmQgbWF0Y2hpbmcgaXRlbSBmb3IgZHNkPSIgKyBkc2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGl0ZW07Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBNeVBsYXlsaXN0RXZlbnRDYWxsYmFjayBleHRlbmRzIFBsYXlsaXN0RXZlbnRDYWxsYmFjayB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgV2Vha1JlZmVyZW5jZTxNZWRpYVNlc3Npb24ySW1wbD4gbVNlc3Npb247Ci0KLSAgICAgICAgcHJpdmF0ZSBNeVBsYXlsaXN0RXZlbnRDYWxsYmFjayhNZWRpYVNlc3Npb24ySW1wbCBzZXNzaW9uKSB7Ci0gICAgICAgICAgICBtU2Vzc2lvbiA9IG5ldyBXZWFrUmVmZXJlbmNlPD4oc2Vzc2lvbik7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25QbGF5bGlzdENoYW5nZWQoTWVkaWFQbGF5bGlzdEFnZW50IHBsYXlsaXN0QWdlbnQsIExpc3Q8TWVkaWFJdGVtMj4gbGlzdCwKLSAgICAgICAgICAgICAgICBNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSkgewotICAgICAgICAgICAgZmluYWwgTWVkaWFTZXNzaW9uMkltcGwgc2Vzc2lvbiA9IG1TZXNzaW9uLmdldCgpOwotICAgICAgICAgICAgaWYgKHNlc3Npb24gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNlc3Npb24ubm90aWZ5UGxheWxpc3RDaGFuZ2VkT25FeGVjdXRvcihwbGF5bGlzdEFnZW50LCBsaXN0LCBtZXRhZGF0YSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25QbGF5bGlzdE1ldGFkYXRhQ2hhbmdlZChNZWRpYVBsYXlsaXN0QWdlbnQgcGxheWxpc3RBZ2VudCwKLSAgICAgICAgICAgICAgICBNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSkgewotICAgICAgICAgICAgZmluYWwgTWVkaWFTZXNzaW9uMkltcGwgc2Vzc2lvbiA9IG1TZXNzaW9uLmdldCgpOwotICAgICAgICAgICAgaWYgKHNlc3Npb24gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNlc3Npb24ubm90aWZ5UGxheWxpc3RNZXRhZGF0YUNoYW5nZWRPbkV4ZWN1dG9yKHBsYXlsaXN0QWdlbnQsIG1ldGFkYXRhKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJlcGVhdE1vZGVDaGFuZ2VkKE1lZGlhUGxheWxpc3RBZ2VudCBwbGF5bGlzdEFnZW50LCBpbnQgcmVwZWF0TW9kZSkgewotICAgICAgICAgICAgZmluYWwgTWVkaWFTZXNzaW9uMkltcGwgc2Vzc2lvbiA9IG1TZXNzaW9uLmdldCgpOwotICAgICAgICAgICAgaWYgKHNlc3Npb24gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNlc3Npb24ubm90aWZ5UmVwZWF0TW9kZUNoYW5nZWRPbkV4ZWN1dG9yKHBsYXlsaXN0QWdlbnQsIHJlcGVhdE1vZGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU2h1ZmZsZU1vZGVDaGFuZ2VkKE1lZGlhUGxheWxpc3RBZ2VudCBwbGF5bGlzdEFnZW50LCBpbnQgc2h1ZmZsZU1vZGUpIHsKLSAgICAgICAgICAgIGZpbmFsIE1lZGlhU2Vzc2lvbjJJbXBsIHNlc3Npb24gPSBtU2Vzc2lvbi5nZXQoKTsKLSAgICAgICAgICAgIGlmIChzZXNzaW9uID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXNzaW9uLm5vdGlmeVNodWZmbGVNb2RlQ2hhbmdlZE9uRXhlY3V0b3IocGxheWxpc3RBZ2VudCwgc2h1ZmZsZU1vZGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBDb21tYW5kSW1wbCBpbXBsZW1lbnRzIENvbW1hbmRQcm92aWRlciB7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQ09NTUFORF9DT0RFCi0gICAgICAgICAgICAgICAgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYV9zZXNzaW9uMi5jb21tYW5kLmNvbW1hbmRfY29kZSI7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQ09NTUFORF9DVVNUT01fQ09NTUFORAotICAgICAgICAgICAgICAgID0gImFuZHJvaWQubWVkaWEubWVkaWFfc2Vzc2lvbjIuY29tbWFuZC5jdXN0b21fY29tbWFuZCI7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQ09NTUFORF9FWFRSQVMKLSAgICAgICAgICAgICAgICA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhX3Nlc3Npb24yLmNvbW1hbmQuZXh0cmFzIjsKLQotICAgICAgICBwcml2YXRlIGZpbmFsIFNlc3Npb25Db21tYW5kMiBtSW5zdGFuY2U7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgaW50IG1Db21tYW5kQ29kZTsKLSAgICAgICAgLy8gTm9ubnVsbCBpZiBpdCdzIGN1c3RvbSBjb21tYW5kCi0gICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1DdXN0b21Db21tYW5kOwotICAgICAgICBwcml2YXRlIGZpbmFsIEJ1bmRsZSBtRXh0cmFzOwotCi0gICAgICAgIHB1YmxpYyBDb21tYW5kSW1wbChTZXNzaW9uQ29tbWFuZDIgaW5zdGFuY2UsIGludCBjb21tYW5kQ29kZSkgewotICAgICAgICAgICAgbUluc3RhbmNlID0gaW5zdGFuY2U7Ci0gICAgICAgICAgICBtQ29tbWFuZENvZGUgPSBjb21tYW5kQ29kZTsKLSAgICAgICAgICAgIG1DdXN0b21Db21tYW5kID0gbnVsbDsKLSAgICAgICAgICAgIG1FeHRyYXMgPSBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIENvbW1hbmRJbXBsKFNlc3Npb25Db21tYW5kMiBpbnN0YW5jZSwgQE5vbk51bGwgU3RyaW5nIGFjdGlvbiwKLSAgICAgICAgICAgICAgICBATnVsbGFibGUgQnVuZGxlIGV4dHJhcykgewotICAgICAgICAgICAgaWYgKGFjdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiYWN0aW9uIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtSW5zdGFuY2UgPSBpbnN0YW5jZTsKLSAgICAgICAgICAgIG1Db21tYW5kQ29kZSA9IENPTU1BTkRfQ09ERV9DVVNUT007Ci0gICAgICAgICAgICBtQ3VzdG9tQ29tbWFuZCA9IGFjdGlvbjsKLSAgICAgICAgICAgIG1FeHRyYXMgPSBleHRyYXM7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGludCBnZXRDb21tYW5kQ29kZV9pbXBsKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Db21tYW5kQ29kZTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQE51bGxhYmxlIFN0cmluZyBnZXRDdXN0b21Db21tYW5kX2ltcGwoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUN1c3RvbUNvbW1hbmQ7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEBOdWxsYWJsZSBCdW5kbGUgZ2V0RXh0cmFzX2ltcGwoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUV4dHJhczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBAcmV0dXJuIGEgbmV3IEJ1bmRsZSBpbnN0YW5jZSBmcm9tIHRoZSBDb21tYW5kCi0gICAgICAgICAqLwotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEJ1bmRsZSB0b0J1bmRsZV9pbXBsKCkgewotICAgICAgICAgICAgQnVuZGxlIGJ1bmRsZSA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgICAgIGJ1bmRsZS5wdXRJbnQoS0VZX0NPTU1BTkRfQ09ERSwgbUNvbW1hbmRDb2RlKTsKLSAgICAgICAgICAgIGJ1bmRsZS5wdXRTdHJpbmcoS0VZX0NPTU1BTkRfQ1VTVE9NX0NPTU1BTkQsIG1DdXN0b21Db21tYW5kKTsKLSAgICAgICAgICAgIGJ1bmRsZS5wdXRCdW5kbGUoS0VZX0NPTU1BTkRfRVhUUkFTLCBtRXh0cmFzKTsKLSAgICAgICAgICAgIHJldHVybiBidW5kbGU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQHJldHVybiBhIG5ldyBDb21tYW5kIGluc3RhbmNlIGZyb20gdGhlIEJ1bmRsZQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBTZXNzaW9uQ29tbWFuZDIgZnJvbUJ1bmRsZV9pbXBsKEBOb25OdWxsIEJ1bmRsZSBjb21tYW5kKSB7Ci0gICAgICAgICAgICBpZiAoY29tbWFuZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY29tbWFuZCBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW50IGNvZGUgPSBjb21tYW5kLmdldEludChLRVlfQ09NTUFORF9DT0RFKTsKLSAgICAgICAgICAgIGlmIChjb2RlICE9IENPTU1BTkRfQ09ERV9DVVNUT00pIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNlc3Npb25Db21tYW5kMihjb2RlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGN1c3RvbUNvbW1hbmQgPSBjb21tYW5kLmdldFN0cmluZyhLRVlfQ09NTUFORF9DVVNUT01fQ09NTUFORCk7Ci0gICAgICAgICAgICAgICAgaWYgKGN1c3RvbUNvbW1hbmQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTZXNzaW9uQ29tbWFuZDIoY3VzdG9tQ29tbWFuZCwgY29tbWFuZC5nZXRCdW5kbGUoS0VZX0NPTU1BTkRfRVhUUkFTKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzX2ltcGwoT2JqZWN0IG9iaikgewotICAgICAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgQ29tbWFuZEltcGwpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQ29tbWFuZEltcGwgb3RoZXIgPSAoQ29tbWFuZEltcGwpIG9iajsKLSAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogQ29tcGFyZSBDb21tYW5kcyB3aXRoIHRoZSBnZW5lcmF0ZWQgVVVJRCwgYXMgd2UncmUgZG9pbmcgZm9yIHRoZSBNSTIuCi0gICAgICAgICAgICByZXR1cm4gbUNvbW1hbmRDb2RlID09IG90aGVyLm1Db21tYW5kQ29kZQotICAgICAgICAgICAgICAgICAgICAmJiBUZXh0VXRpbHMuZXF1YWxzKG1DdXN0b21Db21tYW5kLCBvdGhlci5tQ3VzdG9tQ29tbWFuZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGludCBoYXNoQ29kZV9pbXBsKCkgewotICAgICAgICAgICAgZmluYWwgaW50IHByaW1lID0gMzE7Ci0gICAgICAgICAgICByZXR1cm4gKChtQ3VzdG9tQ29tbWFuZCAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICA/IG1DdXN0b21Db21tYW5kLmhhc2hDb2RlKCkgOiAwKSAqIHByaW1lICsgbUNvbW1hbmRDb2RlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVwcmVzZW50IHNldCBvZiB7QGxpbmsgU2Vzc2lvbkNvbW1hbmQyfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENvbW1hbmRHcm91cEltcGwgaW1wbGVtZW50cyBDb21tYW5kR3JvdXBQcm92aWRlciB7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQ09NTUFORFMgPQotICAgICAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhLm1lZGlhc2Vzc2lvbjIuY29tbWFuZGdyb3VwLmNvbW1hbmRzIjsKLQotICAgICAgICAvLyBQcmVmaXggZm9yIGFsbCBjb21tYW5kIGNvZGVzCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVhfQ09NTUFORF9DT0RFID0gIkNPTU1BTkRfQ09ERV8iOwotCi0gICAgICAgIC8vIFByZWZpeCBmb3IgY29tbWFuZCBjb2RlcyB0aGF0IHdpbGwgYmUgc2VudCBkaXJlY3RseSB0byB0aGUgTWVkaWFQbGF5ZXJCYXNlCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVhfQ09NTUFORF9DT0RFX1BMQVlCQUNLID0gIkNPTU1BTkRfQ09ERV9QTEFZQkFDS18iOwotCi0gICAgICAgIC8vIFByZWZpeCBmb3IgY29tbWFuZCBjb2RlcyB0aGF0IHdpbGwgYmUgc2VudCBkaXJlY3RseSB0byB0aGUgTWVkaWFQbGF5bGlzdEFnZW50Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVhfQ09NTUFORF9DT0RFX1BMQVlMSVNUID0gIkNPTU1BTkRfQ09ERV9QTEFZTElTVF8iOwotCi0gICAgICAgIHByaXZhdGUgU2V0PFNlc3Npb25Db21tYW5kMj4gbUNvbW1hbmRzID0gbmV3IEhhc2hTZXQ8PigpOwotICAgICAgICBwcml2YXRlIGZpbmFsIFNlc3Npb25Db21tYW5kR3JvdXAyIG1JbnN0YW5jZTsKLQotICAgICAgICBwdWJsaWMgQ29tbWFuZEdyb3VwSW1wbChTZXNzaW9uQ29tbWFuZEdyb3VwMiBpbnN0YW5jZSwgT2JqZWN0IG90aGVyKSB7Ci0gICAgICAgICAgICBtSW5zdGFuY2UgPSBpbnN0YW5jZTsKLSAgICAgICAgICAgIGlmIChvdGhlciAhPSBudWxsICYmIG90aGVyIGluc3RhbmNlb2YgQ29tbWFuZEdyb3VwSW1wbCkgewotICAgICAgICAgICAgICAgIG1Db21tYW5kcy5hZGRBbGwoKChDb21tYW5kR3JvdXBJbXBsKSBvdGhlcikubUNvbW1hbmRzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBDb21tYW5kR3JvdXBJbXBsKCkgewotICAgICAgICAgICAgbUluc3RhbmNlID0gbmV3IFNlc3Npb25Db21tYW5kR3JvdXAyKHRoaXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIGFkZENvbW1hbmRfaW1wbChATm9uTnVsbCBTZXNzaW9uQ29tbWFuZDIgY29tbWFuZCkgewotICAgICAgICAgICAgaWYgKGNvbW1hbmQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNvbW1hbmQgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1Db21tYW5kcy5hZGQoY29tbWFuZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgYWRkQWxsUHJlZGVmaW5lZENvbW1hbmRzX2ltcGwoKSB7Ci0gICAgICAgICAgICBhZGRDb21tYW5kc1dpdGhQcmVmaXgoUFJFRklYX0NPTU1BTkRfQ09ERSk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIGFkZEFsbFBsYXliYWNrQ29tbWFuZHMoKSB7Ci0gICAgICAgICAgICBhZGRDb21tYW5kc1dpdGhQcmVmaXgoUFJFRklYX0NPTU1BTkRfQ09ERV9QTEFZQkFDSyk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIGFkZEFsbFBsYXlsaXN0Q29tbWFuZHMoKSB7Ci0gICAgICAgICAgICBhZGRDb21tYW5kc1dpdGhQcmVmaXgoUFJFRklYX0NPTU1BTkRfQ09ERV9QTEFZTElTVCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgYWRkQ29tbWFuZHNXaXRoUHJlZml4KFN0cmluZyBwcmVmaXgpIHsKLSAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogKENhbiBiZSBwb3N0LVApOiBEb24ndCB1c2UgcmVmbGVjdGlvbiBmb3IgdGhpcyBwdXJwb3NlLgotICAgICAgICAgICAgZmluYWwgRmllbGRbXSBmaWVsZHMgPSBNZWRpYVNlc3Npb24yLmNsYXNzLmdldEZpZWxkcygpOwotICAgICAgICAgICAgaWYgKGZpZWxkcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkc1tpXS5nZXROYW1lKCkuc3RhcnRzV2l0aChwcmVmaXgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db21tYW5kcy5hZGQobmV3IFNlc3Npb25Db21tYW5kMihmaWVsZHNbaV0uZ2V0SW50KG51bGwpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJVbmV4cGVjdGVkICIgKyBmaWVsZHNbaV0gKyAiIGluIE1lZGlhU2Vzc2lvbjIiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmVDb21tYW5kX2ltcGwoQE5vbk51bGwgU2Vzc2lvbkNvbW1hbmQyIGNvbW1hbmQpIHsKLSAgICAgICAgICAgIGlmIChjb21tYW5kID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb21tYW5kIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQ29tbWFuZHMucmVtb3ZlKGNvbW1hbmQpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGhhc0NvbW1hbmRfaW1wbChATm9uTnVsbCBTZXNzaW9uQ29tbWFuZDIgY29tbWFuZCkgewotICAgICAgICAgICAgaWYgKGNvbW1hbmQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNvbW1hbmQgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBtQ29tbWFuZHMuY29udGFpbnMoY29tbWFuZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzQ29tbWFuZF9pbXBsKGludCBjb2RlKSB7Ci0gICAgICAgICAgICBpZiAoY29kZSA9PSBDT01NQU5EX0NPREVfQ1VTVE9NKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVXNlIGhhc0NvbW1hbmQoQ29tbWFuZCkgZm9yIGN1c3RvbSBjb21tYW5kIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKFNlc3Npb25Db21tYW5kMiBjb21tYW5kIDogbUNvbW1hbmRzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbW1hbmQuZ2V0Q29tbWFuZENvZGUoKSA9PSBjb2RlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU2V0PFNlc3Npb25Db21tYW5kMj4gZ2V0Q29tbWFuZHNfaW1wbCgpIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRDb21tYW5kcygpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFNldDxTZXNzaW9uQ29tbWFuZDI+IGdldENvbW1hbmRzKCkgewotICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNldChtQ29tbWFuZHMpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEByZXR1cm4gbmV3IGJ1bmRsZSBmcm9tIHRoZSBDb21tYW5kR3JvdXAKLSAgICAgICAgICogQGhpZGUKLSAgICAgICAgICovCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQnVuZGxlIHRvQnVuZGxlX2ltcGwoKSB7Ci0gICAgICAgICAgICBBcnJheUxpc3Q8QnVuZGxlPiBsaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgICAgICBmb3IgKFNlc3Npb25Db21tYW5kMiBjb21tYW5kIDogbUNvbW1hbmRzKSB7Ci0gICAgICAgICAgICAgICAgbGlzdC5hZGQoY29tbWFuZC50b0J1bmRsZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEJ1bmRsZSBidW5kbGUgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgICAgICBidW5kbGUucHV0UGFyY2VsYWJsZUFycmF5TGlzdChLRVlfQ09NTUFORFMsIGxpc3QpOwotICAgICAgICAgICAgcmV0dXJuIGJ1bmRsZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBAcmV0dXJuIG5ldyBpbnN0YW5jZSBvZiBDb21tYW5kR3JvdXAgZnJvbSB0aGUgYnVuZGxlCi0gICAgICAgICAqIEBoaWRlCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIEBOdWxsYWJsZSBTZXNzaW9uQ29tbWFuZEdyb3VwMiBmcm9tQnVuZGxlX2ltcGwoQnVuZGxlIGNvbW1hbmRzKSB7Ci0gICAgICAgICAgICBpZiAoY29tbWFuZHMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTGlzdDxQYXJjZWxhYmxlPiBsaXN0ID0gY29tbWFuZHMuZ2V0UGFyY2VsYWJsZUFycmF5TGlzdChLRVlfQ09NTUFORFMpOwotICAgICAgICAgICAgaWYgKGxpc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgU2Vzc2lvbkNvbW1hbmRHcm91cDIgY29tbWFuZEdyb3VwID0gbmV3IFNlc3Npb25Db21tYW5kR3JvdXAyKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBQYXJjZWxhYmxlIHBhcmNlbGFibGUgPSBsaXN0LmdldChpKTsKLSAgICAgICAgICAgICAgICBpZiAoIShwYXJjZWxhYmxlIGluc3RhbmNlb2YgQnVuZGxlKSkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQnVuZGxlIGNvbW1hbmRCdW5kbGUgPSAoQnVuZGxlKSBwYXJjZWxhYmxlOwotICAgICAgICAgICAgICAgIFNlc3Npb25Db21tYW5kMiBjb21tYW5kID0gU2Vzc2lvbkNvbW1hbmQyLmZyb21CdW5kbGUoY29tbWFuZEJ1bmRsZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbW1hbmQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBjb21tYW5kR3JvdXAuYWRkQ29tbWFuZChjb21tYW5kKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gY29tbWFuZEdyb3VwOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBDb250cm9sbGVySW5mb0ltcGwgaW1wbGVtZW50cyBDb250cm9sbGVySW5mb1Byb3ZpZGVyIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBDb250cm9sbGVySW5mbyBtSW5zdGFuY2U7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgaW50IG1VaWQ7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1QYWNrYWdlTmFtZTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1Jc1RydXN0ZWQ7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgSU1lZGlhQ29udHJvbGxlcjIgbUNvbnRyb2xsZXJCaW5kZXI7Ci0KLSAgICAgICAgcHVibGljIENvbnRyb2xsZXJJbmZvSW1wbChDb250ZXh0IGNvbnRleHQsIENvbnRyb2xsZXJJbmZvIGluc3RhbmNlLCBpbnQgdWlkLAotICAgICAgICAgICAgICAgIGludCBwaWQsIEBOb25OdWxsIFN0cmluZyBwYWNrYWdlTmFtZSwgQE5vbk51bGwgSU1lZGlhQ29udHJvbGxlcjIgY2FsbGJhY2spIHsKLSAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShwYWNrYWdlTmFtZSkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJwYWNrYWdlTmFtZSBzaG91bGRuJ3QgYmUgZW1wdHkiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChjYWxsYmFjayA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY2FsbGJhY2sgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbUluc3RhbmNlID0gaW5zdGFuY2U7Ci0gICAgICAgICAgICBtVWlkID0gdWlkOwotICAgICAgICAgICAgbVBhY2thZ2VOYW1lID0gcGFja2FnZU5hbWU7Ci0gICAgICAgICAgICBtQ29udHJvbGxlckJpbmRlciA9IGNhbGxiYWNrOwotICAgICAgICAgICAgTWVkaWFTZXNzaW9uTWFuYWdlciBtYW5hZ2VyID0KLSAgICAgICAgICAgICAgICAgIChNZWRpYVNlc3Npb25NYW5hZ2VyKSBjb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5NRURJQV9TRVNTSU9OX1NFUlZJQ0UpOwotICAgICAgICAgICAgLy8gQXNrIHNlcnZlciB3aGV0aGVyIHRoZSBjb250cm9sbGVyIGlzIHRydXN0ZWQuCi0gICAgICAgICAgICAvLyBBcHAgY2Fubm90IGtub3cgdGhpcyBiZWNhdXNlIGFwcHMgY2Fubm90IHF1ZXJ5IGVuYWJsZWQgbm90aWZpY2F0aW9uIGxpc3RlbmVyIGZvcgotICAgICAgICAgICAgLy8gYW5vdGhlciBwYWNrYWdlLCBidXQgc3lzdGVtIHNlcnZlciBjYW4gZG8uCi0gICAgICAgICAgICBtSXNUcnVzdGVkID0gbWFuYWdlci5pc1RydXN0ZWRGb3JNZWRpYUNvbnRyb2woCi0gICAgICAgICAgICAgICAgICAgIG5ldyBNZWRpYVNlc3Npb25NYW5hZ2VyLlJlbW90ZVVzZXJJbmZvKHBhY2thZ2VOYW1lLCBwaWQsIHVpZCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFja2FnZU5hbWVfaW1wbCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtUGFja2FnZU5hbWU7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGludCBnZXRVaWRfaW1wbCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtVWlkOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzVHJ1c3RlZF9pbXBsKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Jc1RydXN0ZWQ7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGludCBoYXNoQ29kZV9pbXBsKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Db250cm9sbGVyQmluZGVyLmhhc2hDb2RlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzX2ltcGwoT2JqZWN0IG9iaikgewotICAgICAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgQ29udHJvbGxlckluZm8pKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGVxdWFscygoKENvbnRyb2xsZXJJbmZvKSBvYmopLmdldFByb3ZpZGVyKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmdfaW1wbCgpIHsKLSAgICAgICAgICAgIHJldHVybiAiQ29udHJvbGxlckluZm8ge3BrZz0iICsgbVBhY2thZ2VOYW1lICsgIiwgdWlkPSIgKyBtVWlkICsgIiwgdHJ1c3RlZD0iCi0gICAgICAgICAgICAgICAgICAgICsgbUlzVHJ1c3RlZCArICJ9IjsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Db250cm9sbGVyQmluZGVyLmhhc2hDb2RlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLSAgICAgICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIENvbnRyb2xsZXJJbmZvSW1wbCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBDb250cm9sbGVySW5mb0ltcGwgb3RoZXIgPSAoQ29udHJvbGxlckluZm9JbXBsKSBvYmo7Ci0gICAgICAgICAgICByZXR1cm4gbUNvbnRyb2xsZXJCaW5kZXIuYXNCaW5kZXIoKS5lcXVhbHMob3RoZXIubUNvbnRyb2xsZXJCaW5kZXIuYXNCaW5kZXIoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBDb250cm9sbGVySW5mbyBnZXRJbnN0YW5jZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBtSW5zdGFuY2U7Ci0gICAgICAgIH0KLQotICAgICAgICBJQmluZGVyIGdldElkKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Db250cm9sbGVyQmluZGVyLmFzQmluZGVyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBJTWVkaWFDb250cm9sbGVyMiBnZXRDb250cm9sbGVyQmluZGVyKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Db250cm9sbGVyQmluZGVyOwotICAgICAgICB9Ci0KLSAgICAgICAgc3RhdGljIENvbnRyb2xsZXJJbmZvSW1wbCBmcm9tKENvbnRyb2xsZXJJbmZvIGNvbnRyb2xsZXIpIHsKLSAgICAgICAgICAgIHJldHVybiAoQ29udHJvbGxlckluZm9JbXBsKSBjb250cm9sbGVyLmdldFByb3ZpZGVyKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENvbW1hbmRCdXR0b25JbXBsIGltcGxlbWVudHMgQ29tbWFuZEJ1dHRvblByb3ZpZGVyIHsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9DT01NQU5ECi0gICAgICAgICAgICAgICAgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYV9zZXNzaW9uMi5jb21tYW5kX2J1dHRvbi5jb21tYW5kIjsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9JQ09OX1JFU19JRAotICAgICAgICAgICAgICAgID0gImFuZHJvaWQubWVkaWEubWVkaWFfc2Vzc2lvbjIuY29tbWFuZF9idXR0b24uaWNvbl9yZXNfaWQiOwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0RJU1BMQVlfTkFNRQotICAgICAgICAgICAgICAgID0gImFuZHJvaWQubWVkaWEubWVkaWFfc2Vzc2lvbjIuY29tbWFuZF9idXR0b24uZGlzcGxheV9uYW1lIjsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9FWFRSQVMKLSAgICAgICAgICAgICAgICA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhX3Nlc3Npb24yLmNvbW1hbmRfYnV0dG9uLmV4dHJhcyI7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfRU5BQkxFRAotICAgICAgICAgICAgICAgID0gImFuZHJvaWQubWVkaWEubWVkaWFfc2Vzc2lvbjIuY29tbWFuZF9idXR0b24uZW5hYmxlZCI7Ci0KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBDb21tYW5kQnV0dG9uIG1JbnN0YW5jZTsKLSAgICAgICAgcHJpdmF0ZSBTZXNzaW9uQ29tbWFuZDIgbUNvbW1hbmQ7Ci0gICAgICAgIHByaXZhdGUgaW50IG1JY29uUmVzSWQ7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIG1EaXNwbGF5TmFtZTsKLSAgICAgICAgcHJpdmF0ZSBCdW5kbGUgbUV4dHJhczsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1FbmFibGVkOwotCi0gICAgICAgIHB1YmxpYyBDb21tYW5kQnV0dG9uSW1wbChATnVsbGFibGUgU2Vzc2lvbkNvbW1hbmQyIGNvbW1hbmQsIGludCBpY29uUmVzSWQsCi0gICAgICAgICAgICAgICAgQE51bGxhYmxlIFN0cmluZyBkaXNwbGF5TmFtZSwgQnVuZGxlIGV4dHJhcywgYm9vbGVhbiBlbmFibGVkKSB7Ci0gICAgICAgICAgICBtQ29tbWFuZCA9IGNvbW1hbmQ7Ci0gICAgICAgICAgICBtSWNvblJlc0lkID0gaWNvblJlc0lkOwotICAgICAgICAgICAgbURpc3BsYXlOYW1lID0gZGlzcGxheU5hbWU7Ci0gICAgICAgICAgICBtRXh0cmFzID0gZXh0cmFzOwotICAgICAgICAgICAgbUVuYWJsZWQgPSBlbmFibGVkOwotICAgICAgICAgICAgbUluc3RhbmNlID0gbmV3IENvbW1hbmRCdXR0b24odGhpcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEBOdWxsYWJsZQotICAgICAgICBTZXNzaW9uQ29tbWFuZDIgZ2V0Q29tbWFuZF9pbXBsKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Db21tYW5kOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0SWNvblJlc0lkX2ltcGwoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUljb25SZXNJZDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQE51bGxhYmxlIFN0cmluZyBnZXREaXNwbGF5TmFtZV9pbXBsKCkgewotICAgICAgICAgICAgcmV0dXJuIG1EaXNwbGF5TmFtZTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQE51bGxhYmxlIEJ1bmRsZSBnZXRFeHRyYXNfaW1wbCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtRXh0cmFzOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzRW5hYmxlZF9pbXBsKCkgewotICAgICAgICAgICAgcmV0dXJuIG1FbmFibGVkOwotICAgICAgICB9Ci0KLSAgICAgICAgQE5vbk51bGwgQnVuZGxlIHRvQnVuZGxlKCkgewotICAgICAgICAgICAgQnVuZGxlIGJ1bmRsZSA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgICAgIGJ1bmRsZS5wdXRCdW5kbGUoS0VZX0NPTU1BTkQsIG1Db21tYW5kLnRvQnVuZGxlKCkpOwotICAgICAgICAgICAgYnVuZGxlLnB1dEludChLRVlfSUNPTl9SRVNfSUQsIG1JY29uUmVzSWQpOwotICAgICAgICAgICAgYnVuZGxlLnB1dFN0cmluZyhLRVlfRElTUExBWV9OQU1FLCBtRGlzcGxheU5hbWUpOwotICAgICAgICAgICAgYnVuZGxlLnB1dEJ1bmRsZShLRVlfRVhUUkFTLCBtRXh0cmFzKTsKLSAgICAgICAgICAgIGJ1bmRsZS5wdXRCb29sZWFuKEtFWV9FTkFCTEVELCBtRW5hYmxlZCk7Ci0gICAgICAgICAgICByZXR1cm4gYnVuZGxlOwotICAgICAgICB9Ci0KLSAgICAgICAgc3RhdGljIEBOdWxsYWJsZSBDb21tYW5kQnV0dG9uIGZyb21CdW5kbGUoQnVuZGxlIGJ1bmRsZSkgewotICAgICAgICAgICAgaWYgKGJ1bmRsZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBDb21tYW5kQnV0dG9uLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBDb21tYW5kQnV0dG9uLkJ1aWxkZXIoKTsKLSAgICAgICAgICAgIGJ1aWxkZXIuc2V0Q29tbWFuZChTZXNzaW9uQ29tbWFuZDIuZnJvbUJ1bmRsZShidW5kbGUuZ2V0QnVuZGxlKEtFWV9DT01NQU5EKSkpOwotICAgICAgICAgICAgYnVpbGRlci5zZXRJY29uUmVzSWQoYnVuZGxlLmdldEludChLRVlfSUNPTl9SRVNfSUQsIDApKTsKLSAgICAgICAgICAgIGJ1aWxkZXIuc2V0RGlzcGxheU5hbWUoYnVuZGxlLmdldFN0cmluZyhLRVlfRElTUExBWV9OQU1FKSk7Ci0gICAgICAgICAgICBidWlsZGVyLnNldEV4dHJhcyhidW5kbGUuZ2V0QnVuZGxlKEtFWV9FWFRSQVMpKTsKLSAgICAgICAgICAgIGJ1aWxkZXIuc2V0RW5hYmxlZChidW5kbGUuZ2V0Qm9vbGVhbihLRVlfRU5BQkxFRCkpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICByZXR1cm4gYnVpbGRlci5idWlsZCgpOwotICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBNYWxmb3JtZWQgb3IgdmVyc2lvbiBtaXNtYXRjaC4gUmV0dXJuIG51bGwgZm9yIG5vdy4KLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBCdWlsZGVyIGZvciB7QGxpbmsgQ29tbWFuZEJ1dHRvbn0uCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJ1aWxkZXJJbXBsIGltcGxlbWVudHMgQ29tbWFuZEJ1dHRvblByb3ZpZGVyLkJ1aWxkZXJQcm92aWRlciB7Ci0gICAgICAgICAgICBwcml2YXRlIGZpbmFsIENvbW1hbmRCdXR0b24uQnVpbGRlciBtSW5zdGFuY2U7Ci0gICAgICAgICAgICBwcml2YXRlIFNlc3Npb25Db21tYW5kMiBtQ29tbWFuZDsKLSAgICAgICAgICAgIHByaXZhdGUgaW50IG1JY29uUmVzSWQ7Ci0gICAgICAgICAgICBwcml2YXRlIFN0cmluZyBtRGlzcGxheU5hbWU7Ci0gICAgICAgICAgICBwcml2YXRlIEJ1bmRsZSBtRXh0cmFzOwotICAgICAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1FbmFibGVkOwotCi0gICAgICAgICAgICBwdWJsaWMgQnVpbGRlckltcGwoQ29tbWFuZEJ1dHRvbi5CdWlsZGVyIGluc3RhbmNlKSB7Ci0gICAgICAgICAgICAgICAgbUluc3RhbmNlID0gaW5zdGFuY2U7Ci0gICAgICAgICAgICAgICAgbUVuYWJsZWQgPSB0cnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBDb21tYW5kQnV0dG9uLkJ1aWxkZXIgc2V0Q29tbWFuZF9pbXBsKFNlc3Npb25Db21tYW5kMiBjb21tYW5kKSB7Ci0gICAgICAgICAgICAgICAgbUNvbW1hbmQgPSBjb21tYW5kOwotICAgICAgICAgICAgICAgIHJldHVybiBtSW5zdGFuY2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIENvbW1hbmRCdXR0b24uQnVpbGRlciBzZXRJY29uUmVzSWRfaW1wbChpbnQgcmVzSWQpIHsKLSAgICAgICAgICAgICAgICBtSWNvblJlc0lkID0gcmVzSWQ7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1JbnN0YW5jZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgQ29tbWFuZEJ1dHRvbi5CdWlsZGVyIHNldERpc3BsYXlOYW1lX2ltcGwoU3RyaW5nIGRpc3BsYXlOYW1lKSB7Ci0gICAgICAgICAgICAgICAgbURpc3BsYXlOYW1lID0gZGlzcGxheU5hbWU7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1JbnN0YW5jZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgQ29tbWFuZEJ1dHRvbi5CdWlsZGVyIHNldEVuYWJsZWRfaW1wbChib29sZWFuIGVuYWJsZWQpIHsKLSAgICAgICAgICAgICAgICBtRW5hYmxlZCA9IGVuYWJsZWQ7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1JbnN0YW5jZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgQ29tbWFuZEJ1dHRvbi5CdWlsZGVyIHNldEV4dHJhc19pbXBsKEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgICAgICAgICBtRXh0cmFzID0gZXh0cmFzOwotICAgICAgICAgICAgICAgIHJldHVybiBtSW5zdGFuY2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIENvbW1hbmRCdXR0b24gYnVpbGRfaW1wbCgpIHsKLSAgICAgICAgICAgICAgICBpZiAobUVuYWJsZWQgJiYgbUNvbW1hbmQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJFbmFibGVkIGJ1dHRvbiBuZWVkcyBDb21tYW5kIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBmb3IgY29udHJvbGxlciB0byBpbnZva2UgdGhlIGNvbW1hbmQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1Db21tYW5kICE9IG51bGwgJiYgbUNvbW1hbmQuZ2V0Q29tbWFuZENvZGUoKSA9PSBDT01NQU5EX0NPREVfQ1VTVE9NCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAobUljb25SZXNJZCA9PSAwIHx8IFRleHRVdGlscy5pc0VtcHR5KG1EaXNwbGF5TmFtZSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkN1c3RvbSBjb21tYW5kcyBuZWVkcyBpY29uIGFuZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgYW5kIG5hbWUgdG8gZGlzcGxheSIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENvbW1hbmRCdXR0b25JbXBsKG1Db21tYW5kLCBtSWNvblJlc0lkLCBtRGlzcGxheU5hbWUsIG1FeHRyYXMsIG1FbmFibGVkKQotICAgICAgICAgICAgICAgICAgICAgICAgLm1JbnN0YW5jZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgQnVpbGRlckJhc2VJbXBsPFQgZXh0ZW5kcyBNZWRpYVNlc3Npb24yLCBDIGV4dGVuZHMgU2Vzc2lvbkNhbGxiYWNrPgotICAgICAgICAgICAgaW1wbGVtZW50cyBCdWlsZGVyQmFzZVByb3ZpZGVyPFQsIEM+IHsKLSAgICAgICAgZmluYWwgQ29udGV4dCBtQ29udGV4dDsKLSAgICAgICAgTWVkaWFQbGF5ZXJCYXNlIG1QbGF5ZXI7Ci0gICAgICAgIFN0cmluZyBtSWQ7Ci0gICAgICAgIEV4ZWN1dG9yIG1DYWxsYmFja0V4ZWN1dG9yOwotICAgICAgICBDIG1DYWxsYmFjazsKLSAgICAgICAgTWVkaWFQbGF5bGlzdEFnZW50IG1QbGF5bGlzdEFnZW50OwotICAgICAgICBWb2x1bWVQcm92aWRlcjIgbVZvbHVtZVByb3ZpZGVyOwotICAgICAgICBQZW5kaW5nSW50ZW50IG1TZXNzaW9uQWN0aXZpdHk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENvbnN0cnVjdG9yLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gY29udGV4dCBhIGNvbnRleHQKLSAgICAgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgYW55IHBhcmFtZXRlciBpcyBudWxsLCBvciB0aGUgcGxheWVyIGlzIGEKLSAgICAgICAgICogICAgICB7QGxpbmsgTWVkaWFTZXNzaW9uMn0gb3Ige0BsaW5rIE1lZGlhQ29udHJvbGxlcjJ9LgotICAgICAgICAgKi8KLSAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBBbHNvIG5lZWQgZXhlY3V0b3IKLSAgICAgICAgcHVibGljIEJ1aWxkZXJCYXNlSW1wbChATm9uTnVsbCBDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgICAgIGlmIChjb250ZXh0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb250ZXh0IHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7Ci0gICAgICAgICAgICAvLyBFbnN1cmUgbm9uLW51bGwKLSAgICAgICAgICAgIG1JZCA9ICIiOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFBsYXllcl9pbXBsKEBOb25OdWxsIE1lZGlhUGxheWVyQmFzZSBwbGF5ZXIpIHsKLSAgICAgICAgICAgIGlmIChwbGF5ZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInBsYXllciBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVBsYXllciA9IHBsYXllcjsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRQbGF5bGlzdEFnZW50X2ltcGwoQE5vbk51bGwgTWVkaWFQbGF5bGlzdEFnZW50IHBsYXlsaXN0QWdlbnQpIHsKLSAgICAgICAgICAgIGlmIChwbGF5bGlzdEFnZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJwbGF5bGlzdEFnZW50IHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtUGxheWxpc3RBZ2VudCA9IHBsYXlsaXN0QWdlbnQ7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgc2V0Vm9sdW1lUHJvdmlkZXJfaW1wbChWb2x1bWVQcm92aWRlcjIgdm9sdW1lUHJvdmlkZXIpIHsKLSAgICAgICAgICAgIG1Wb2x1bWVQcm92aWRlciA9IHZvbHVtZVByb3ZpZGVyOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFNlc3Npb25BY3Rpdml0eV9pbXBsKFBlbmRpbmdJbnRlbnQgcGkpIHsKLSAgICAgICAgICAgIG1TZXNzaW9uQWN0aXZpdHkgPSBwaTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRJZF9pbXBsKEBOb25OdWxsIFN0cmluZyBpZCkgewotICAgICAgICAgICAgaWYgKGlkID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpZCBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUlkID0gaWQ7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgc2V0U2Vzc2lvbkNhbGxiYWNrX2ltcGwoQE5vbk51bGwgRXhlY3V0b3IgZXhlY3V0b3IsIEBOb25OdWxsIEMgY2FsbGJhY2spIHsKLSAgICAgICAgICAgIGlmIChleGVjdXRvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZXhlY3V0b3Igc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChjYWxsYmFjayA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY2FsbGJhY2sgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1DYWxsYmFja0V4ZWN1dG9yID0gZXhlY3V0b3I7Ci0gICAgICAgICAgICBtQ2FsbGJhY2sgPSBjYWxsYmFjazsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVCBidWlsZF9pbXBsKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBCdWlsZGVySW1wbCBleHRlbmRzIEJ1aWxkZXJCYXNlSW1wbDxNZWRpYVNlc3Npb24yLCBTZXNzaW9uQ2FsbGJhY2s+IHsKLSAgICAgICAgcHVibGljIEJ1aWxkZXJJbXBsKENvbnRleHQgY29udGV4dCwgQnVpbGRlciBpbnN0YW5jZSkgewotICAgICAgICAgICAgc3VwZXIoY29udGV4dCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIE1lZGlhU2Vzc2lvbjIgYnVpbGRfaW1wbCgpIHsKLSAgICAgICAgICAgIGlmIChtQ2FsbGJhY2tFeGVjdXRvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUNhbGxiYWNrRXhlY3V0b3IgPSBtQ29udGV4dC5nZXRNYWluRXhlY3V0b3IoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtQ2FsbGJhY2sgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1DYWxsYmFjayA9IG5ldyBTZXNzaW9uQ2FsbGJhY2soKSB7fTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBuZXcgTWVkaWFTZXNzaW9uMkltcGwobUNvbnRleHQsIG1QbGF5ZXIsIG1JZCwgbVBsYXlsaXN0QWdlbnQsCi0gICAgICAgICAgICAgICAgICAgIG1Wb2x1bWVQcm92aWRlciwgbVNlc3Npb25BY3Rpdml0eSwgbUNhbGxiYWNrRXhlY3V0b3IsIG1DYWxsYmFjaykuZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFTZXNzaW9uMlN0dWIuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFTZXNzaW9uMlN0dWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM2NTdkNy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhU2Vzc2lvbjJTdHViLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQubWVkaWE7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFDb250cm9sbGVyMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhSXRlbTI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUxpYnJhcnlTZXJ2aWNlMi5MaWJyYXJ5Um9vdDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTWV0YWRhdGEyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuU2Vzc2lvbkNvbW1hbmQyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uMi5Db21tYW5kQnV0dG9uOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuU2Vzc2lvbkNvbW1hbmRHcm91cDI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb24yLkNvbnRyb2xsZXJJbmZvOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuUmF0aW5nMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlZvbHVtZVByb3ZpZGVyMjsKLWltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CaW5kZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5EZWFkT2JqZWN0RXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKLWltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLm9zLlJlc3VsdFJlY2VpdmVyOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLkd1YXJkZWRCeTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5Ob25OdWxsOwotaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkFycmF5TWFwOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLlNwYXJzZUFycmF5OwotCi1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEuTWVkaWFMaWJyYXJ5U2VydmljZTJJbXBsLk1lZGlhTGlicmFyeVNlc3Npb25JbXBsOwotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvbjJJbXBsLkNvbW1hbmRCdXR0b25JbXBsOwotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvbjJJbXBsLkNvbW1hbmRHcm91cEltcGw7Ci1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uMkltcGwuQ29udHJvbGxlckluZm9JbXBsOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotcHVibGljIGNsYXNzIE1lZGlhU2Vzc2lvbjJTdHViIGV4dGVuZHMgSU1lZGlhU2Vzc2lvbjIuU3R1YiB7Ci0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEFSR1VNRU5UX0tFWV9QT1NJVElPTiA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhX3Nlc3Npb24yLmtleV9wb3NpdGlvbiI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBBUkdVTUVOVF9LRVlfSVRFTV9JTkRFWCA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhX3Nlc3Npb24yLmtleV9pdGVtX2luZGV4IjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEFSR1VNRU5UX0tFWV9QTEFZTElTVF9QQVJBTVMgPQotICAgICAgICAgICAgImFuZHJvaWQubWVkaWEubWVkaWFfc2Vzc2lvbjIua2V5X3BsYXlsaXN0X3BhcmFtcyI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk1lZGlhU2Vzc2lvbjJTdHViIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gdHJ1ZTsgLy8gVE9ETyhqYWV3YW4pOiBSZW5hbWUuCi0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTcGFyc2VBcnJheTxTZXNzaW9uQ29tbWFuZDI+IHNDb21tYW5kc0Zvck9uQ29tbWFuZFJlcXVlc3QgPQotICAgICAgICAgICAgbmV3IFNwYXJzZUFycmF5PD4oKTsKLQotICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IG1Mb2NrID0gbmV3IE9iamVjdCgpOwotICAgIHByaXZhdGUgZmluYWwgV2Vha1JlZmVyZW5jZTxNZWRpYVNlc3Npb24ySW1wbD4gbVNlc3Npb247Ci0KLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBmaW5hbCBBcnJheU1hcDxJQmluZGVyLCBDb250cm9sbGVySW5mbz4gbUNvbnRyb2xsZXJzID0gbmV3IEFycmF5TWFwPD4oKTsKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBmaW5hbCBTZXQ8SUJpbmRlcj4gbUNvbm5lY3RpbmdDb250cm9sbGVycyA9IG5ldyBIYXNoU2V0PD4oKTsKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBmaW5hbCBBcnJheU1hcDxDb250cm9sbGVySW5mbywgU2Vzc2lvbkNvbW1hbmRHcm91cDI+IG1BbGxvd2VkQ29tbWFuZEdyb3VwTWFwID0KLSAgICAgICAgICAgIG5ldyBBcnJheU1hcDw+KCk7Ci0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgZmluYWwgQXJyYXlNYXA8Q29udHJvbGxlckluZm8sIFNldDxTdHJpbmc+PiBtU3Vic2NyaXB0aW9ucyA9IG5ldyBBcnJheU1hcDw+KCk7Ci0KLSAgICBwdWJsaWMgTWVkaWFTZXNzaW9uMlN0dWIoTWVkaWFTZXNzaW9uMkltcGwgc2Vzc2lvbikgewotICAgICAgICBtU2Vzc2lvbiA9IG5ldyBXZWFrUmVmZXJlbmNlPD4oc2Vzc2lvbik7Ci0KLSAgICAgICAgc3luY2hyb25pemVkIChzQ29tbWFuZHNGb3JPbkNvbW1hbmRSZXF1ZXN0KSB7Ci0gICAgICAgICAgICBpZiAoc0NvbW1hbmRzRm9yT25Db21tYW5kUmVxdWVzdC5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgICAgIENvbW1hbmRHcm91cEltcGwgZ3JvdXAgPSBuZXcgQ29tbWFuZEdyb3VwSW1wbCgpOwotICAgICAgICAgICAgICAgIGdyb3VwLmFkZEFsbFBsYXliYWNrQ29tbWFuZHMoKTsKLSAgICAgICAgICAgICAgICBncm91cC5hZGRBbGxQbGF5bGlzdENvbW1hbmRzKCk7Ci0gICAgICAgICAgICAgICAgU2V0PFNlc3Npb25Db21tYW5kMj4gY29tbWFuZHMgPSBncm91cC5nZXRDb21tYW5kcygpOwotICAgICAgICAgICAgICAgIGZvciAoU2Vzc2lvbkNvbW1hbmQyIGNvbW1hbmQgOiBjb21tYW5kcykgewotICAgICAgICAgICAgICAgICAgICBzQ29tbWFuZHNGb3JPbkNvbW1hbmRSZXF1ZXN0LmFwcGVuZChjb21tYW5kLmdldENvbW1hbmRDb2RlKCksIGNvbW1hbmQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRlc3Ryb3lOb3RMb2NrZWQoKSB7Ci0gICAgICAgIGZpbmFsIExpc3Q8Q29udHJvbGxlckluZm8+IGxpc3Q7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIG1TZXNzaW9uLmNsZWFyKCk7Ci0gICAgICAgICAgICBsaXN0ID0gZ2V0Q29udHJvbGxlcnMoKTsKLSAgICAgICAgICAgIG1Db250cm9sbGVycy5jbGVhcigpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgSU1lZGlhQ29udHJvbGxlcjIgY29udHJvbGxlckJpbmRlciA9Ci0gICAgICAgICAgICAgICAgICAgICgoQ29udHJvbGxlckluZm9JbXBsKSBsaXN0LmdldChpKS5nZXRQcm92aWRlcigpKS5nZXRDb250cm9sbGVyQmluZGVyKCk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIC8vIFNob3VsZCBiZSB1c2VkIHdpdGhvdXQgYSBsb2NrIGhvbGQgdG8gcHJldmVudCBwb3RlbnRpYWwgZGVhZGxvY2suCi0gICAgICAgICAgICAgICAgY29udHJvbGxlckJpbmRlci5vbkRpc2Nvbm5lY3RlZCgpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBDb250cm9sbGVyIGlzIGdvbmUuIFNob3VsZCBiZSBmaW5lIGJlY2F1c2Ugd2UncmUgZGVzdHJveWluZy4KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgTWVkaWFTZXNzaW9uMkltcGwgZ2V0U2Vzc2lvbigpIHsKLSAgICAgICAgZmluYWwgTWVkaWFTZXNzaW9uMkltcGwgc2Vzc2lvbiA9IG1TZXNzaW9uLmdldCgpOwotICAgICAgICBpZiAoc2Vzc2lvbiA9PSBudWxsICYmIERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJTZXNzaW9uIGlzIGNsb3NlZCIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNlc3Npb247Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBNZWRpYUxpYnJhcnlTZXNzaW9uSW1wbCBnZXRMaWJyYXJ5U2Vzc2lvbigpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBNZWRpYVNlc3Npb24ySW1wbCBzZXNzaW9uID0gZ2V0U2Vzc2lvbigpOwotICAgICAgICBpZiAoIShzZXNzaW9uIGluc3RhbmNlb2YgTWVkaWFMaWJyYXJ5U2Vzc2lvbkltcGwpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiU2Vzc2lvbiBpc24ndCBhIGxpYnJhcnkgc2Vzc2lvbiIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAoTWVkaWFMaWJyYXJ5U2Vzc2lvbkltcGwpIHNlc3Npb247Ci0gICAgfQotCi0gICAgLy8gR2V0IGNvbnRyb2xsZXIgaWYgdGhlIGNvbW1hbmQgZnJvbSBjYWxsZXIgdG8gc2Vzc2lvbiBpcyBhYmxlIHRvIGJlIGhhbmRsZWQuCi0gICAgcHJpdmF0ZSBDb250cm9sbGVySW5mbyBnZXRDb250cm9sbGVySWZBYmxlKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlcikgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBmaW5hbCBDb250cm9sbGVySW5mbyBjb250cm9sbGVySW5mbyA9IG1Db250cm9sbGVycy5nZXQoY2FsbGVyLmFzQmluZGVyKCkpOwotICAgICAgICAgICAgaWYgKGNvbnRyb2xsZXJJbmZvID09IG51bGwgJiYgREVCVUcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJDb250cm9sbGVyIGlzIGRpc2Nvbm5lY3RlZCIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gY29udHJvbGxlckluZm87Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBHZXQgY29udHJvbGxlciBpZiB0aGUgY29tbWFuZCBmcm9tIGNhbGxlciB0byBzZXNzaW9uIGlzIGFibGUgdG8gYmUgaGFuZGxlZC4KLSAgICBwcml2YXRlIENvbnRyb2xsZXJJbmZvIGdldENvbnRyb2xsZXJJZkFibGUoSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBpbnQgY29tbWFuZENvZGUpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgZmluYWwgQ29udHJvbGxlckluZm8gY29udHJvbGxlckluZm8gPSBnZXRDb250cm9sbGVySWZBYmxlKGNhbGxlcik7Ci0gICAgICAgICAgICBpZiAoY29udHJvbGxlckluZm8gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgU2Vzc2lvbkNvbW1hbmRHcm91cDIgYWxsb3dlZENvbW1hbmRzID0gbUFsbG93ZWRDb21tYW5kR3JvdXBNYXAuZ2V0KGNvbnRyb2xsZXJJbmZvKTsKLSAgICAgICAgICAgIGlmIChhbGxvd2VkQ29tbWFuZHMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNvbnRyb2xsZXIgd2l0aCBudWxsIGFsbG93ZWQgY29tbWFuZHMuIElnbm9yaW5nIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIWFsbG93ZWRDb21tYW5kcy5oYXNDb21tYW5kKGNvbW1hbmRDb2RlKSkgewotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJDb250cm9sbGVyIGlzbid0IGFsbG93ZWQgZm9yIGNvbW1hbmQgIiArIGNvbW1hbmRDb2RlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gY29udHJvbGxlckluZm87Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBHZXQgY29udHJvbGxlciBpZiB0aGUgY29tbWFuZCBmcm9tIGNhbGxlciB0byBzZXNzaW9uIGlzIGFibGUgdG8gYmUgaGFuZGxlZC4KLSAgICBwcml2YXRlIENvbnRyb2xsZXJJbmZvIGdldENvbnRyb2xsZXJJZkFibGUoSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBTZXNzaW9uQ29tbWFuZDIgY29tbWFuZCkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBmaW5hbCBDb250cm9sbGVySW5mbyBjb250cm9sbGVySW5mbyA9IGdldENvbnRyb2xsZXJJZkFibGUoY2FsbGVyKTsKLSAgICAgICAgICAgIGlmIChjb250cm9sbGVySW5mbyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTZXNzaW9uQ29tbWFuZEdyb3VwMiBhbGxvd2VkQ29tbWFuZHMgPSBtQWxsb3dlZENvbW1hbmRHcm91cE1hcC5nZXQoY29udHJvbGxlckluZm8pOwotICAgICAgICAgICAgaWYgKGFsbG93ZWRDb21tYW5kcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ29udHJvbGxlciB3aXRoIG51bGwgYWxsb3dlZCBjb21tYW5kcy4gSWdub3JpbmciLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghYWxsb3dlZENvbW1hbmRzLmhhc0NvbW1hbmQoY29tbWFuZCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiQ29udHJvbGxlciBpc24ndCBhbGxvd2VkIGZvciBjb21tYW5kICIgKyBjb21tYW5kKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gY29udHJvbGxlckluZm87Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBSZXR1cm4gYmluZGVyIGlmIHRoZSBzZXNzaW9uIGlzIGFibGUgdG8gc2VuZCBhIGNvbW1hbmQgdG8gdGhlIGNvbnRyb2xsZXIuCi0gICAgcHJpdmF0ZSBJTWVkaWFDb250cm9sbGVyMiBnZXRDb250cm9sbGVyQmluZGVySWZBYmxlKENvbnRyb2xsZXJJbmZvIGNvbnRyb2xsZXIpIHsKLSAgICAgICAgaWYgKGdldFNlc3Npb24oKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBnZXRTZXNzaW9uKCkgYWxyZWFkeSBsb2dnZWQgaWYgc2Vzc2lvbiBpcyBjbG9zZWQuCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBDb250cm9sbGVySW5mb0ltcGwgaW1wbCA9IENvbnRyb2xsZXJJbmZvSW1wbC5mcm9tKGNvbnRyb2xsZXIpOwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBpZiAobUNvbnRyb2xsZXJzLmdldChpbXBsLmdldElkKCkpICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICAgfHwgbUNvbm5lY3RpbmdDb250cm9sbGVycy5jb250YWlucyhpbXBsLmdldElkKCkpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGltcGwuZ2V0Q29udHJvbGxlckJpbmRlcigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCBjb250cm9sbGVyICsgIiBpc24ndCBjb25uZWN0ZWQgbm9yIGNvbm5lY3RpbmciLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gUmV0dXJuIGJpbmRlciBpZiB0aGUgc2Vzc2lvbiBpcyBhYmxlIHRvIHNlbmQgYSBjb21tYW5kIHRvIHRoZSBjb250cm9sbGVyLgotICAgIHByaXZhdGUgSU1lZGlhQ29udHJvbGxlcjIgZ2V0Q29udHJvbGxlckJpbmRlcklmQWJsZShDb250cm9sbGVySW5mbyBjb250cm9sbGVyLAotICAgICAgICAgICAgaW50IGNvbW1hbmRDb2RlKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIFNlc3Npb25Db21tYW5kR3JvdXAyIGFsbG93ZWRDb21tYW5kcyA9IG1BbGxvd2VkQ29tbWFuZEdyb3VwTWFwLmdldChjb250cm9sbGVyKTsKLSAgICAgICAgICAgIGlmIChhbGxvd2VkQ29tbWFuZHMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNvbnRyb2xsZXIgd2l0aCBudWxsIGFsbG93ZWQgY29tbWFuZHMuIElnbm9yaW5nIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIWFsbG93ZWRDb21tYW5kcy5oYXNDb21tYW5kKGNvbW1hbmRDb2RlKSkgewotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJDb250cm9sbGVyIGlzbid0IGFsbG93ZWQgZm9yIGNvbW1hbmQgIiArIGNvbW1hbmRDb2RlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZ2V0Q29udHJvbGxlckJpbmRlcklmQWJsZShjb250cm9sbGVyKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBvbkNvbW1hbmQoQE5vbk51bGwgSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBpbnQgY29tbWFuZENvZGUsCi0gICAgICAgICAgICBATm9uTnVsbCBTZXNzaW9uUnVubmFibGUgcnVubmFibGUpIHsKLSAgICAgICAgZmluYWwgTWVkaWFTZXNzaW9uMkltcGwgc2Vzc2lvbiA9IGdldFNlc3Npb24oKTsKLSAgICAgICAgZmluYWwgQ29udHJvbGxlckluZm8gY29udHJvbGxlciA9IGdldENvbnRyb2xsZXJJZkFibGUoY2FsbGVyLCBjb21tYW5kQ29kZSk7Ci0gICAgICAgIGlmIChzZXNzaW9uID09IG51bGwgfHwgY29udHJvbGxlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgc2Vzc2lvbi5nZXRDYWxsYmFja0V4ZWN1dG9yKCkuZXhlY3V0ZSgoKSAtPiB7Ci0gICAgICAgICAgICBpZiAoZ2V0Q29udHJvbGxlcklmQWJsZShjYWxsZXIsIGNvbW1hbmRDb2RlKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgU2Vzc2lvbkNvbW1hbmQyIGNvbW1hbmQgPSBzQ29tbWFuZHNGb3JPbkNvbW1hbmRSZXF1ZXN0LmdldChjb21tYW5kQ29kZSk7Ci0gICAgICAgICAgICBpZiAoY29tbWFuZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBhY2NlcHRlZCA9IHNlc3Npb24uZ2V0Q2FsbGJhY2soKS5vbkNvbW1hbmRSZXF1ZXN0KHNlc3Npb24uZ2V0SW5zdGFuY2UoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIsIGNvbW1hbmQpOwotICAgICAgICAgICAgICAgIGlmICghYWNjZXB0ZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gRG9uJ3QgcnVuIHJlamVjdGVkIGNvbW1hbmQuCi0gICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiQ29tbWFuZCAoY29kZT0iICsgY29tbWFuZENvZGUgKyAiKSBmcm9tICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBjb250cm9sbGVyICsgIiB3YXMgcmVqZWN0ZWQgYnkgIiArIHNlc3Npb24pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBydW5uYWJsZS5ydW4oc2Vzc2lvbiwgY29udHJvbGxlcik7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBvbkJyb3dzZXJDb21tYW5kKEBOb25OdWxsIElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwKLSAgICAgICAgICAgIEBOb25OdWxsIExpYnJhcnlTZXNzaW9uUnVubmFibGUgcnVubmFibGUpIHsKLSAgICAgICAgZmluYWwgTWVkaWFMaWJyYXJ5U2Vzc2lvbkltcGwgc2Vzc2lvbiA9IGdldExpYnJhcnlTZXNzaW9uKCk7Ci0gICAgICAgIC8vIFRPRE8oamFld2FuKTogQ29uc2lkZXIgY29tbWFuZCBjb2RlCi0gICAgICAgIGZpbmFsIENvbnRyb2xsZXJJbmZvIGNvbnRyb2xsZXIgPSBnZXRDb250cm9sbGVySWZBYmxlKGNhbGxlcik7Ci0gICAgICAgIGlmIChzZXNzaW9uID09IG51bGwgfHwgY29udHJvbGxlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgc2Vzc2lvbi5nZXRDYWxsYmFja0V4ZWN1dG9yKCkuZXhlY3V0ZSgoKSAtPiB7Ci0gICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IENvbnNpZGVyIGNvbW1hbmQgY29kZQotICAgICAgICAgICAgaWYgKGdldENvbnRyb2xsZXJJZkFibGUoY2FsbGVyKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcnVubmFibGUucnVuKHNlc3Npb24sIGNvbnRyb2xsZXIpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLQotICAgIHByaXZhdGUgdm9pZCBub3RpZnlBbGwoaW50IGNvbW1hbmRDb2RlLCBATm9uTnVsbCBOb3RpZnlSdW5uYWJsZSBydW5uYWJsZSkgewotICAgICAgICBMaXN0PENvbnRyb2xsZXJJbmZvPiBjb250cm9sbGVycyA9IGdldENvbnRyb2xsZXJzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29udHJvbGxlcnMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIG5vdGlmeUludGVybmFsKGNvbnRyb2xsZXJzLmdldChpKSwKLSAgICAgICAgICAgICAgICAgICAgZ2V0Q29udHJvbGxlckJpbmRlcklmQWJsZShjb250cm9sbGVycy5nZXQoaSksIGNvbW1hbmRDb2RlKSwgcnVubmFibGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIG5vdGlmeUFsbChATm9uTnVsbCBOb3RpZnlSdW5uYWJsZSBydW5uYWJsZSkgewotICAgICAgICBMaXN0PENvbnRyb2xsZXJJbmZvPiBjb250cm9sbGVycyA9IGdldENvbnRyb2xsZXJzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29udHJvbGxlcnMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIG5vdGlmeUludGVybmFsKGNvbnRyb2xsZXJzLmdldChpKSwKLSAgICAgICAgICAgICAgICAgICAgZ2V0Q29udHJvbGxlckJpbmRlcklmQWJsZShjb250cm9sbGVycy5nZXQoaSkpLCBydW5uYWJsZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgbm90aWZ5KEBOb25OdWxsIENvbnRyb2xsZXJJbmZvIGNvbnRyb2xsZXIsIEBOb25OdWxsIE5vdGlmeVJ1bm5hYmxlIHJ1bm5hYmxlKSB7Ci0gICAgICAgIG5vdGlmeUludGVybmFsKGNvbnRyb2xsZXIsIGdldENvbnRyb2xsZXJCaW5kZXJJZkFibGUoY29udHJvbGxlciksIHJ1bm5hYmxlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgbm90aWZ5KEBOb25OdWxsIENvbnRyb2xsZXJJbmZvIGNvbnRyb2xsZXIsIGludCBjb21tYW5kQ29kZSwKLSAgICAgICAgICAgIEBOb25OdWxsIE5vdGlmeVJ1bm5hYmxlIHJ1bm5hYmxlKSB7Ci0gICAgICAgIG5vdGlmeUludGVybmFsKGNvbnRyb2xsZXIsIGdldENvbnRyb2xsZXJCaW5kZXJJZkFibGUoY29udHJvbGxlciwgY29tbWFuZENvZGUpLCBydW5uYWJsZSk7Ci0gICAgfQotCi0gICAgLy8gRG8gbm90IGNhbGwgdGhpcyBBUEkgZGlyZWN0bHkuIFVzZSBub3RpZnkoKSBpbnN0ZWFkLgotICAgIHByaXZhdGUgdm9pZCBub3RpZnlJbnRlcm5hbChATm9uTnVsbCBDb250cm9sbGVySW5mbyBjb250cm9sbGVyLAotICAgICAgICAgICAgQE5vbk51bGwgSU1lZGlhQ29udHJvbGxlcjIgaUNvbnRyb2xsZXIsIEBOb25OdWxsIE5vdGlmeVJ1bm5hYmxlIHJ1bm5hYmxlKSB7Ci0gICAgICAgIGlmIChjb250cm9sbGVyID09IG51bGwgfHwgaUNvbnRyb2xsZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBydW5uYWJsZS5ydW4oY29udHJvbGxlciwgaUNvbnRyb2xsZXIpOwotICAgICAgICB9IGNhdGNoIChEZWFkT2JqZWN0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgY29udHJvbGxlci50b1N0cmluZygpICsgIiBpcyBnb25lIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBvbkNvbnRyb2xsZXJDbG9zZWQoaUNvbnRyb2xsZXIpOwotICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gQ3VycmVudGx5IGl0J3MgVHJhbnNhY3Rpb25Ub29MYXJnZUV4Y2VwdGlvbiBvciBEZWFkU3lzdGVtRXhjZXB0aW9uLgotICAgICAgICAgICAgLy8gV2UnZCBiZXR0ZXIgdG8gbGVhdmUgbG9nIGZvciB0aG9zZSBjYXNlcyBiZWNhdXNlCi0gICAgICAgICAgICAvLyAgIC0gVHJhbnNhY3Rpb25Ub29MYXJnZUV4Y2VwdGlvbiBtZWFucyB0aGF0IHdlIG1heSBuZWVkIHRvIGZpeCBvdXIgY29kZS4KLSAgICAgICAgICAgIC8vICAgICAoZS5nLiBhZGQgcGFnaW5hdGlvbiBvciBzcGVjaWFsIHdheSB0byBkZWxpdmVyIEJpdG1hcCkKLSAgICAgICAgICAgIC8vICAgLSBEZWFkU3lzdGVtRXhjZXB0aW9uIG1lYW5zIHRoYXQgZXJyb3JzIGFyb3VuZCBpdCBjYW4gYmUgaWdub3JlZC4KLSAgICAgICAgICAgIExvZy53KFRBRywgIkV4Y2VwdGlvbiBpbiAiICsgY29udHJvbGxlci50b1N0cmluZygpLCBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBvbkNvbnRyb2xsZXJDbG9zZWQoSU1lZGlhQ29udHJvbGxlcjIgaUNvbnRyb2xsZXIpIHsKLSAgICAgICAgQ29udHJvbGxlckluZm8gY29udHJvbGxlcjsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgY29udHJvbGxlciA9IG1Db250cm9sbGVycy5yZW1vdmUoaUNvbnRyb2xsZXIuYXNCaW5kZXIoKSk7Ci0gICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJyZWxlYXNpbmcgIiArIGNvbnRyb2xsZXIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVN1YnNjcmlwdGlvbnMucmVtb3ZlKGNvbnRyb2xsZXIpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIE1lZGlhU2Vzc2lvbjJJbXBsIHNlc3Npb24gPSBnZXRTZXNzaW9uKCk7Ci0gICAgICAgIGlmIChzZXNzaW9uID09IG51bGwgfHwgY29udHJvbGxlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgc2Vzc2lvbi5nZXRDYWxsYmFja0V4ZWN1dG9yKCkuZXhlY3V0ZSgoKSAtPiB7Ci0gICAgICAgICAgICBzZXNzaW9uLmdldENhbGxiYWNrKCkub25EaXNjb25uZWN0ZWQoc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLCBjb250cm9sbGVyKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIC8vIEFJREwgbWV0aG9kcyBmb3Igc2Vzc2lvbiBvdmVycmlkZXMKLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgY29ubmVjdChmaW5hbCBJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGZpbmFsIFN0cmluZyBjYWxsaW5nUGFja2FnZSkKLSAgICAgICAgICAgIHRocm93cyBSdW50aW1lRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgTWVkaWFTZXNzaW9uMkltcGwgc2Vzc2lvbiA9IGdldFNlc3Npb24oKTsKLSAgICAgICAgaWYgKHNlc3Npb24gPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIENvbnRleHQgY29udGV4dCA9IHNlc3Npb24uZ2V0Q29udGV4dCgpOwotICAgICAgICBmaW5hbCBDb250cm9sbGVySW5mbyBjb250cm9sbGVySW5mbyA9IG5ldyBDb250cm9sbGVySW5mbyhjb250ZXh0LAotICAgICAgICAgICAgICAgIEJpbmRlci5nZXRDYWxsaW5nVWlkKCksIEJpbmRlci5nZXRDYWxsaW5nUGlkKCksIGNhbGxpbmdQYWNrYWdlLCBjYWxsZXIpOwotICAgICAgICBzZXNzaW9uLmdldENhbGxiYWNrRXhlY3V0b3IoKS5leGVjdXRlKCgpIC0+IHsKLSAgICAgICAgICAgIGlmIChnZXRTZXNzaW9uKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgICAgICAvLyBLZWVwIGNvbm5lY3RpbmcgY29udHJvbGxlcnMuCi0gICAgICAgICAgICAgICAgLy8gVGhpcyBoZWxwcyBzZXNzaW9ucyB0byBjYWxsIEFQSXMgaW4gdGhlIG9uQ29ubmVjdCgpIChlLmcuIHNldEN1c3RvbUxheW91dCgpKQotICAgICAgICAgICAgICAgIC8vIGluc3RlYWQgb2YgcGVuZGluZyB0aGVtLgotICAgICAgICAgICAgICAgIG1Db25uZWN0aW5nQ29udHJvbGxlcnMuYWRkKENvbnRyb2xsZXJJbmZvSW1wbC5mcm9tKGNvbnRyb2xsZXJJbmZvKS5nZXRJZCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFNlc3Npb25Db21tYW5kR3JvdXAyIGFsbG93ZWRDb21tYW5kcyA9IHNlc3Npb24uZ2V0Q2FsbGJhY2soKS5vbkNvbm5lY3QoCi0gICAgICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0SW5zdGFuY2UoKSwgY29udHJvbGxlckluZm8pOwotICAgICAgICAgICAgLy8gRG9uJ3QgcmVqZWN0IGNvbm5lY3Rpb24gZm9yIHRoZSByZXF1ZXN0IGZyb20gdHJ1c3RlZCBhcHAuCi0gICAgICAgICAgICAvLyBPdGhlcndpc2Ugc2VydmVyIHdpbGwgZmFpbCB0byByZXRyaWV2ZSBzZXNzaW9uJ3MgaW5mb3JtYXRpb24gdG8gZGlzcGF0Y2gKLSAgICAgICAgICAgIC8vIG1lZGlhIGtleXMgdG8uCi0gICAgICAgICAgICBib29sZWFuIGFjY2VwdCA9IGFsbG93ZWRDb21tYW5kcyAhPSBudWxsIHx8IGNvbnRyb2xsZXJJbmZvLmlzVHJ1c3RlZCgpOwotICAgICAgICAgICAgaWYgKGFjY2VwdCkgewotICAgICAgICAgICAgICAgIENvbnRyb2xsZXJJbmZvSW1wbCBjb250cm9sbGVySW1wbCA9IENvbnRyb2xsZXJJbmZvSW1wbC5mcm9tKGNvbnRyb2xsZXJJbmZvKTsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiQWNjZXB0aW5nIGNvbm5lY3Rpb24sIGNvbnRyb2xsZXJJbmZvPSIgKyBjb250cm9sbGVySW5mbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBhbGxvd2VkQ29tbWFuZHM9IiArIGFsbG93ZWRDb21tYW5kcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChhbGxvd2VkQ29tbWFuZHMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAvLyBGb3IgdHJ1c3RlZCBhcHBzLCBzZW5kIG5vbi1udWxsIGFsbG93ZWQgY29tbWFuZHMgdG8ga2VlcCBjb25uZWN0aW9uLgotICAgICAgICAgICAgICAgICAgICBhbGxvd2VkQ29tbWFuZHMgPSBuZXcgU2Vzc2lvbkNvbW1hbmRHcm91cDIoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgICAgICAgICBtQ29ubmVjdGluZ0NvbnRyb2xsZXJzLnJlbW92ZShjb250cm9sbGVySW1wbC5nZXRJZCgpKTsKLSAgICAgICAgICAgICAgICAgICAgbUNvbnRyb2xsZXJzLnB1dChjb250cm9sbGVySW1wbC5nZXRJZCgpLCAgY29udHJvbGxlckluZm8pOwotICAgICAgICAgICAgICAgICAgICBtQWxsb3dlZENvbW1hbmRHcm91cE1hcC5wdXQoY29udHJvbGxlckluZm8sIGFsbG93ZWRDb21tYW5kcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIElmIGNvbm5lY3Rpb24gaXMgYWNjZXB0ZWQsIG5vdGlmeSB0aGUgY3VycmVudCBzdGF0ZSB0byB0aGUgY29udHJvbGxlci4KLSAgICAgICAgICAgICAgICAvLyBJdCdzIG5lZWRlZCBiZWNhdXNlIHdlIGNhbm5vdCBjYWxsIHN5bmNocm9ub3VzIGNhbGxzIGJldHdlZW4gc2Vzc2lvbi9jb250cm9sbGVyLgotICAgICAgICAgICAgICAgIC8vIE5vdGU6IFdlJ3JlIGRvaW5nIHRoaXMgYWZ0ZXIgdGhlIG9uQ29ubmVjdGlvbkNoYW5nZWQoKSwgYnV0IHRoZXJlJ3Mgbm8gZ3VhcmFudGVlCi0gICAgICAgICAgICAgICAgLy8gICAgICAgdGhhdCBldmVudHMgaGVyZSBhcmUgbm90aWZpZWQgYWZ0ZXIgdGhlIG9uQ29ubmVjdGVkKCkgYmVjYXVzZQotICAgICAgICAgICAgICAgIC8vICAgICAgIElNZWRpYUNvbnRyb2xsZXIyIGlzIG9uZXdheSAoaS5lLiBhc3luYyBjYWxsKSBhbmQgU3R1YiB3aWxsCi0gICAgICAgICAgICAgICAgLy8gICAgICAgdXNlIHRocmVhZCBwb2xsIGZvciBpbmNvbWluZyBjYWxscy4KLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgcGxheWVyU3RhdGUgPSBzZXNzaW9uLmdldEluc3RhbmNlKCkuZ2V0UGxheWVyU3RhdGUoKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBsb25nIHBvc2l0aW9uRXZlbnRUaW1lTXMgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBsb25nIHBvc2l0aW9uTXMgPSBzZXNzaW9uLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudFBvc2l0aW9uKCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgZmxvYXQgcGxheWJhY2tTcGVlZCA9IHNlc3Npb24uZ2V0SW5zdGFuY2UoKS5nZXRQbGF5YmFja1NwZWVkKCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgbG9uZyBidWZmZXJlZFBvc2l0aW9uTXMgPSBzZXNzaW9uLmdldEluc3RhbmNlKCkuZ2V0QnVmZmVyZWRQb3NpdGlvbigpOwotICAgICAgICAgICAgICAgIGZpbmFsIEJ1bmRsZSBwbGF5YmFja0luZm9CdW5kbGUgPSAoKE1lZGlhQ29udHJvbGxlcjJJbXBsLlBsYXliYWNrSW5mb0ltcGwpCi0gICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldFBsYXliYWNrSW5mbygpLmdldFByb3ZpZGVyKCkpLnRvQnVuZGxlKCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IHJlcGVhdE1vZGUgPSBzZXNzaW9uLmdldEluc3RhbmNlKCkuZ2V0UmVwZWF0TW9kZSgpOwotICAgICAgICAgICAgICAgIGZpbmFsIGludCBzaHVmZmxlTW9kZSA9IHNlc3Npb24uZ2V0SW5zdGFuY2UoKS5nZXRTaHVmZmxlTW9kZSgpOwotICAgICAgICAgICAgICAgIGZpbmFsIFBlbmRpbmdJbnRlbnQgc2Vzc2lvbkFjdGl2aXR5ID0gc2Vzc2lvbi5nZXRTZXNzaW9uQWN0aXZpdHkoKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBMaXN0PE1lZGlhSXRlbTI+IHBsYXlsaXN0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93ZWRDb21tYW5kcy5oYXNDb21tYW5kKFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfUExBWUxJU1RfR0VUX0xJU1QpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLmdldFBsYXlsaXN0KCkgOiBudWxsOwotICAgICAgICAgICAgICAgIGZpbmFsIExpc3Q8QnVuZGxlPiBwbGF5bGlzdEJ1bmRsZTsKLSAgICAgICAgICAgICAgICBpZiAocGxheWxpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwbGF5bGlzdEJ1bmRsZSA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICAgICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IEZpbmQgYSB3YXkgdG8gYXZvaWQgY29uY3VycmVudCBtb2RpZmljYXRpb24gZXhjZXB0aW9uLgotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBsYXlsaXN0LnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYUl0ZW0yIGl0ZW0gPSBwbGF5bGlzdC5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQnVuZGxlIGl0ZW1CdW5kbGUgPSBpdGVtLnRvQnVuZGxlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW1CdW5kbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5bGlzdEJ1bmRsZS5hZGQoaXRlbUJ1bmRsZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcGxheWxpc3RCdW5kbGUgPSBudWxsOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIERvdWJsZSBjaGVjayBpZiBzZXNzaW9uIGlzIHN0aWxsIHRoZXJlLCBiZWNhdXNlIGNsb3NlKCkgY2FuIGJlIGNhbGxlZCBpbiBhbm90aGVyCi0gICAgICAgICAgICAgICAgLy8gdGhyZWFkLgotICAgICAgICAgICAgICAgIGlmIChnZXRTZXNzaW9uKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhbGxlci5vbkNvbm5lY3RlZChNZWRpYVNlc3Npb24yU3R1Yi50aGlzLCBhbGxvd2VkQ29tbWFuZHMudG9CdW5kbGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJTdGF0ZSwgcG9zaXRpb25FdmVudFRpbWVNcywgcG9zaXRpb25NcywgcGxheWJhY2tTcGVlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJlZFBvc2l0aW9uTXMsIHBsYXliYWNrSW5mb0J1bmRsZSwgcmVwZWF0TW9kZSwgc2h1ZmZsZU1vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWxpc3RCdW5kbGUsIHNlc3Npb25BY3Rpdml0eSk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gQ29udHJvbGxlciBtYXkgYmUgZGllZCBwcmVtYXR1cmVseS4KLSAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBIYW5kbGUgaGVyZS4KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgICAgICAgICAgbUNvbm5lY3RpbmdDb250cm9sbGVycy5yZW1vdmUoQ29udHJvbGxlckluZm9JbXBsLmZyb20oY29udHJvbGxlckluZm8pLmdldElkKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiUmVqZWN0aW5nIGNvbm5lY3Rpb24sIGNvbnRyb2xsZXJJbmZvPSIgKyBjb250cm9sbGVySW5mbyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhbGxlci5vbkRpc2Nvbm5lY3RlZCgpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIENvbnRyb2xsZXIgbWF5IGJlIGRpZWQgcHJlbWF0dXJlbHkuCi0gICAgICAgICAgICAgICAgICAgIC8vIE5vdCBhbiBpc3N1ZSBiZWNhdXNlIHdlJ2xsIGlnbm9yZSBpdCBhbnl3YXkuCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCByZWxlYXNlKGZpbmFsIElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlcikgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIG9uQ29udHJvbGxlckNsb3NlZChjYWxsZXIpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFZvbHVtZVRvKGZpbmFsIElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgZmluYWwgaW50IHZhbHVlLCBmaW5hbCBpbnQgZmxhZ3MpCi0gICAgICAgICAgICB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbiB7Ci0gICAgICAgIG9uQ29tbWFuZChjYWxsZXIsIFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfU0VUX1ZPTFVNRSwKLSAgICAgICAgICAgICAgICAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgICAgICAgICBWb2x1bWVQcm92aWRlcjIgdm9sdW1lUHJvdmlkZXIgPSBzZXNzaW9uLmdldFZvbHVtZVByb3ZpZGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh2b2x1bWVQcm92aWRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IFNldCBsb2NhbCBzdHJlYW0gdm9sdW1lCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWVQcm92aWRlci5vblNldFZvbHVtZVRvKHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGFkanVzdFZvbHVtZShJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGludCBkaXJlY3Rpb24sIGludCBmbGFncykKLSAgICAgICAgICAgIHRocm93cyBSdW50aW1lRXhjZXB0aW9uIHsKLSAgICAgICAgb25Db21tYW5kKGNhbGxlciwgU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9TRVRfVk9MVU1FLAotICAgICAgICAgICAgICAgIChzZXNzaW9uLCBjb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICAgICAgICAgIFZvbHVtZVByb3ZpZGVyMiB2b2x1bWVQcm92aWRlciA9IHNlc3Npb24uZ2V0Vm9sdW1lUHJvdmlkZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHZvbHVtZVByb3ZpZGVyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogQWRqdXN0IGxvY2FsIHN0cmVhbSB2b2x1bWUKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZVByb3ZpZGVyLm9uQWRqdXN0Vm9sdW1lKGRpcmVjdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZW5kVHJhbnNwb3J0Q29udHJvbENvbW1hbmQoSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLAotICAgICAgICAgICAgaW50IGNvbW1hbmRDb2RlLCBCdW5kbGUgYXJncykgdGhyb3dzIFJ1bnRpbWVFeGNlcHRpb24gewotICAgICAgICBvbkNvbW1hbmQoY2FsbGVyLCBjb21tYW5kQ29kZSwgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgIHN3aXRjaCAoY29tbWFuZENvZGUpIHsKLSAgICAgICAgICAgICAgICBjYXNlIFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfUExBWUJBQ0tfUExBWToKLSAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLnBsYXkoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlCQUNLX1BBVVNFOgotICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldEluc3RhbmNlKCkucGF1c2UoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlCQUNLX1NUT1A6Ci0gICAgICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0SW5zdGFuY2UoKS5zdG9wKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZQkFDS19QUkVQQVJFOgotICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldEluc3RhbmNlKCkucHJlcGFyZSgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfUExBWUJBQ0tfU0VFS19UTzoKLSAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLnNlZWtUbyhhcmdzLmdldExvbmcoQVJHVU1FTlRfS0VZX1BPU0lUSU9OKSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogUmVzZW5kIHVua25vd24gKG5ldykgY29tbWFuZHMgdGhyb3VnaCB0aGUgY3VzdG9tIGNvbW1hbmQuCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNlbmRDdXN0b21Db21tYW5kKGZpbmFsIElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgZmluYWwgQnVuZGxlIGNvbW1hbmRCdW5kbGUsCi0gICAgICAgICAgICBmaW5hbCBCdW5kbGUgYXJncywgZmluYWwgUmVzdWx0UmVjZWl2ZXIgcmVjZWl2ZXIpIHsKLSAgICAgICAgZmluYWwgTWVkaWFTZXNzaW9uMkltcGwgc2Vzc2lvbiA9IGdldFNlc3Npb24oKTsKLSAgICAgICAgaWYgKHNlc3Npb24gPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIFNlc3Npb25Db21tYW5kMiBjb21tYW5kID0gU2Vzc2lvbkNvbW1hbmQyLmZyb21CdW5kbGUoY29tbWFuZEJ1bmRsZSk7Ci0gICAgICAgIGlmIChjb21tYW5kID09IG51bGwpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgInNlbmRDdXN0b21Db21tYW5kKCk6IElnbm9yaW5nIG51bGwgY29tbWFuZCBmcm9tICIKLSAgICAgICAgICAgICAgICAgICAgKyBnZXRDb250cm9sbGVySWZBYmxlKGNhbGxlcikpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIENvbnRyb2xsZXJJbmZvIGNvbnRyb2xsZXIgPSBnZXRDb250cm9sbGVySWZBYmxlKGNhbGxlciwgY29tbWFuZCk7Ci0gICAgICAgIGlmIChjb250cm9sbGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBzZXNzaW9uLmdldENhbGxiYWNrRXhlY3V0b3IoKS5leGVjdXRlKCgpIC0+IHsKLSAgICAgICAgICAgIGlmIChnZXRDb250cm9sbGVySWZBYmxlKGNhbGxlciwgY29tbWFuZCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNlc3Npb24uZ2V0Q2FsbGJhY2soKS5vbkN1c3RvbUNvbW1hbmQoc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLAotICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLCBjb21tYW5kLCBhcmdzLCByZWNlaXZlcik7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHByZXBhcmVGcm9tVXJpKGZpbmFsIElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgZmluYWwgVXJpIHVyaSwKLSAgICAgICAgICAgIGZpbmFsIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgb25Db21tYW5kKGNhbGxlciwgU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9TRVNTSU9OX1BSRVBBUkVfRlJPTV9VUkksCi0gICAgICAgICAgICAgICAgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHVyaSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJwcmVwYXJlRnJvbVVyaSgpOiBJZ25vcmluZyBudWxsIHVyaSBmcm9tICIgKyBjb250cm9sbGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldENhbGxiYWNrKCkub25QcmVwYXJlRnJvbVVyaShzZXNzaW9uLmdldEluc3RhbmNlKCksIGNvbnRyb2xsZXIsIHVyaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYXMpOwotICAgICAgICAgICAgICAgIH0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHByZXBhcmVGcm9tU2VhcmNoKGZpbmFsIElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgZmluYWwgU3RyaW5nIHF1ZXJ5LAotICAgICAgICAgICAgZmluYWwgQnVuZGxlIGV4dHJhcykgewotICAgICAgICBvbkNvbW1hbmQoY2FsbGVyLCBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1NFU1NJT05fUFJFUEFSRV9GUk9NX1NFQVJDSCwKLSAgICAgICAgICAgICAgICAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkocXVlcnkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJwcmVwYXJlRnJvbVNlYXJjaCgpOiBJZ25vcmluZyBlbXB0eSBxdWVyeSBmcm9tICIgKyBjb250cm9sbGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldENhbGxiYWNrKCkub25QcmVwYXJlRnJvbVNlYXJjaChzZXNzaW9uLmdldEluc3RhbmNlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlciwgcXVlcnksIGV4dHJhcyk7Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcHJlcGFyZUZyb21NZWRpYUlkKGZpbmFsIElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgZmluYWwgU3RyaW5nIG1lZGlhSWQsCi0gICAgICAgICAgICBmaW5hbCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIG9uQ29tbWFuZChjYWxsZXIsIFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfU0VTU0lPTl9QUkVQQVJFX0ZST01fTUVESUFfSUQsCi0gICAgICAgICAgICAgICAgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgIGlmIChtZWRpYUlkID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJwcmVwYXJlRnJvbU1lZGlhSWQoKTogSWdub3JpbmcgbnVsbCBtZWRpYUlkIGZyb20gIiArIGNvbnRyb2xsZXIpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNlc3Npb24uZ2V0Q2FsbGJhY2soKS5vblByZXBhcmVGcm9tTWVkaWFJZChzZXNzaW9uLmdldEluc3RhbmNlKCksCi0gICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIsIG1lZGlhSWQsIGV4dHJhcyk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHBsYXlGcm9tVXJpKGZpbmFsIElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgZmluYWwgVXJpIHVyaSwKLSAgICAgICAgICAgIGZpbmFsIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgb25Db21tYW5kKGNhbGxlciwgU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9TRVNTSU9OX1BMQVlfRlJPTV9VUkksCi0gICAgICAgICAgICAgICAgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHVyaSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJwbGF5RnJvbVVyaSgpOiBJZ25vcmluZyBudWxsIHVyaSBmcm9tICIgKyBjb250cm9sbGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldENhbGxiYWNrKCkub25QbGF5RnJvbVVyaShzZXNzaW9uLmdldEluc3RhbmNlKCksIGNvbnRyb2xsZXIsIHVyaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYXMpOwotICAgICAgICAgICAgICAgIH0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHBsYXlGcm9tU2VhcmNoKGZpbmFsIElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgZmluYWwgU3RyaW5nIHF1ZXJ5LAotICAgICAgICAgICAgZmluYWwgQnVuZGxlIGV4dHJhcykgewotICAgICAgICBvbkNvbW1hbmQoY2FsbGVyLCBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1NFU1NJT05fUExBWV9GUk9NX1NFQVJDSCwKLSAgICAgICAgICAgICAgICAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkocXVlcnkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJwbGF5RnJvbVNlYXJjaCgpOiBJZ25vcmluZyBlbXB0eSBxdWVyeSBmcm9tICIgKyBjb250cm9sbGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldENhbGxiYWNrKCkub25QbGF5RnJvbVNlYXJjaChzZXNzaW9uLmdldEluc3RhbmNlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlciwgcXVlcnksIGV4dHJhcyk7Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcGxheUZyb21NZWRpYUlkKGZpbmFsIElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgZmluYWwgU3RyaW5nIG1lZGlhSWQsCi0gICAgICAgICAgICBmaW5hbCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIG9uQ29tbWFuZChjYWxsZXIsIFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfU0VTU0lPTl9QTEFZX0ZST01fTUVESUFfSUQsCi0gICAgICAgICAgICAgICAgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1lZGlhSWQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAicGxheUZyb21NZWRpYUlkKCk6IElnbm9yaW5nIG51bGwgbWVkaWFJZCBmcm9tICIgKyBjb250cm9sbGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldENhbGxiYWNrKCkub25QbGF5RnJvbU1lZGlhSWQoc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLCBjb250cm9sbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSWQsIGV4dHJhcyk7Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0UmF0aW5nKGZpbmFsIElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgZmluYWwgU3RyaW5nIG1lZGlhSWQsCi0gICAgICAgICAgICBmaW5hbCBCdW5kbGUgcmF0aW5nQnVuZGxlKSB7Ci0gICAgICAgIG9uQ29tbWFuZChjYWxsZXIsIFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfU0VTU0lPTl9TRVRfUkFUSU5HLAotICAgICAgICAgICAgICAgIChzZXNzaW9uLCBjb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtZWRpYUlkID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgInNldFJhdGluZygpOiBJZ25vcmluZyBudWxsIG1lZGlhSWQgZnJvbSAiICsgY29udHJvbGxlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHJhdGluZ0J1bmRsZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJzZXRSYXRpbmcoKTogSWdub3JpbmcgbnVsbCByYXRpbmdCdW5kbGUgZnJvbSAiICsgY29udHJvbGxlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgUmF0aW5nMiByYXRpbmcgPSBSYXRpbmcyLmZyb21CdW5kbGUocmF0aW5nQnVuZGxlKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJhdGluZyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmF0aW5nQnVuZGxlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJzZXRSYXRpbmcoKTogSWdub3JpbmcgbnVsbCByYXRpbmcgZnJvbSAiICsgY29udHJvbGxlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0Q2FsbGJhY2soKS5vblNldFJhdGluZyhzZXNzaW9uLmdldEluc3RhbmNlKCksIGNvbnRyb2xsZXIsIG1lZGlhSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF0aW5nKTsKLSAgICAgICAgICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRQbGF5bGlzdChmaW5hbCBJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGZpbmFsIExpc3Q8QnVuZGxlPiBwbGF5bGlzdCwKLSAgICAgICAgICAgIGZpbmFsIEJ1bmRsZSBtZXRhZGF0YSkgewotICAgICAgICBvbkNvbW1hbmQoY2FsbGVyLCBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlMSVNUX1NFVF9MSVNULCAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgaWYgKHBsYXlsaXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJzZXRQbGF5bGlzdCgpOiBJZ25vcmluZyBudWxsIHBsYXlsaXN0IGZyb20gIiArIGNvbnRyb2xsZXIpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIExpc3Q8TWVkaWFJdGVtMj4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwbGF5bGlzdC5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIC8vIFJlY3JlYXRlcyBVVUlEIGluIHRoZSBwbGF5bGlzdAotICAgICAgICAgICAgICAgIE1lZGlhSXRlbTIgaXRlbSA9IE1lZGlhSXRlbTJJbXBsLmZyb21CdW5kbGUocGxheWxpc3QuZ2V0KGkpLCBudWxsKTsKLSAgICAgICAgICAgICAgICBpZiAoaXRlbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxpc3QuYWRkKGl0ZW0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNlc3Npb24uZ2V0SW5zdGFuY2UoKS5zZXRQbGF5bGlzdChsaXN0LCBNZWRpYU1ldGFkYXRhMi5mcm9tQnVuZGxlKG1ldGFkYXRhKSk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZVBsYXlsaXN0TWV0YWRhdGEoZmluYWwgSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBmaW5hbCBCdW5kbGUgbWV0YWRhdGEpIHsKLSAgICAgICAgb25Db21tYW5kKGNhbGxlciwgU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZTElTVF9TRVRfTElTVF9NRVRBREFUQSwKLSAgICAgICAgICAgICAgICAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLnVwZGF0ZVBsYXlsaXN0TWV0YWRhdGEoTWVkaWFNZXRhZGF0YTIuZnJvbUJ1bmRsZShtZXRhZGF0YSkpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBhZGRQbGF5bGlzdEl0ZW0oSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBpbnQgaW5kZXgsIEJ1bmRsZSBtZWRpYUl0ZW0pIHsKLSAgICAgICAgb25Db21tYW5kKGNhbGxlciwgU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZTElTVF9BRERfSVRFTSwKLSAgICAgICAgICAgICAgICAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgICAgICAgICAvLyBSZXNldHMgdGhlIFVVSUQgZnJvbSB0aGUgaW5jb21pbmcgbWVkaWEgaWQsIHNvIGNvbnRyb2xsZXIgbWF5IHJldXNlIGEgbWVkaWEKLSAgICAgICAgICAgICAgICAgICAgLy8gaXRlbSBtdWx0aXBsZSB0aW1lcyBmb3IgYWRkUGxheWxpc3RJdGVtLgotICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldEluc3RhbmNlKCkuYWRkUGxheWxpc3RJdGVtKGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhSXRlbTJJbXBsLmZyb21CdW5kbGUobWVkaWFJdGVtLCBudWxsKSk7Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlUGxheWxpc3RJdGVtKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgQnVuZGxlIG1lZGlhSXRlbSkgewotICAgICAgICBvbkNvbW1hbmQoY2FsbGVyLCBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlMSVNUX1JFTU9WRV9JVEVNLAotICAgICAgICAgICAgICAgIChzZXNzaW9uLCBjb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICBNZWRpYUl0ZW0yIGl0ZW0gPSBNZWRpYUl0ZW0yLmZyb21CdW5kbGUobWVkaWFJdGVtKTsKLSAgICAgICAgICAgIC8vIE5vdGU6IE1lZGlhSXRlbTIgaGFzIGhpZGRlbiBVVUlEIHRvIGlkZW50aWZ5IGl0IGFjcm9zcyB0aGUgcHJvY2Vzc2VzLgotICAgICAgICAgICAgc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLnJlbW92ZVBsYXlsaXN0SXRlbShpdGVtKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcmVwbGFjZVBsYXlsaXN0SXRlbShJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGludCBpbmRleCwgQnVuZGxlIG1lZGlhSXRlbSkgewotICAgICAgICBvbkNvbW1hbmQoY2FsbGVyLCBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlMSVNUX1JFUExBQ0VfSVRFTSwKLSAgICAgICAgICAgICAgICAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgICAgICAgICAvLyBSZXNldHMgdGhlIFVVSUQgZnJvbSB0aGUgaW5jb21pbmcgbWVkaWEgaWQsIHNvIGNvbnRyb2xsZXIgbWF5IHJldXNlIGEgbWVkaWEKLSAgICAgICAgICAgICAgICAgICAgLy8gaXRlbSBtdWx0aXBsZSB0aW1lcyBmb3IgcmVwbGFjZVBsYXlsaXN0SXRlbS4KLSAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLnJlcGxhY2VQbGF5bGlzdEl0ZW0oaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFJdGVtMkltcGwuZnJvbUJ1bmRsZShtZWRpYUl0ZW0sIG51bGwpKTsKLSAgICAgICAgICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBza2lwVG9QbGF5bGlzdEl0ZW0oSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBCdW5kbGUgbWVkaWFJdGVtKSB7Ci0gICAgICAgIG9uQ29tbWFuZChjYWxsZXIsIFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfUExBWUxJU1RfU0tJUF9UT19QTEFZTElTVF9JVEVNLAotICAgICAgICAgICAgICAgIChzZXNzaW9uLCBjb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtZWRpYUl0ZW0gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAic2tpcFRvUGxheWxpc3RJdGVtKCk6IElnbm9yaW5nIG51bGwgbWVkaWFJdGVtIGZyb20gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGNvbnRyb2xsZXIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIE5vdGU6IE1lZGlhSXRlbTIgaGFzIGhpZGRlbiBVVUlEIHRvIGlkZW50aWZ5IGl0IGFjcm9zcyB0aGUgcHJvY2Vzc2VzLgotICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldEluc3RhbmNlKCkuc2tpcFRvUGxheWxpc3RJdGVtKE1lZGlhSXRlbTIuZnJvbUJ1bmRsZShtZWRpYUl0ZW0pKTsKLSAgICAgICAgICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBza2lwVG9QcmV2aW91c0l0ZW0oSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyKSB7Ci0gICAgICAgIG9uQ29tbWFuZChjYWxsZXIsIFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfUExBWUxJU1RfU0tJUF9QUkVWX0lURU0sCi0gICAgICAgICAgICAgICAgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLnNraXBUb1ByZXZpb3VzSXRlbSgpOwotICAgICAgICAgICAgICAgIH0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNraXBUb05leHRJdGVtKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlcikgewotICAgICAgICBvbkNvbW1hbmQoY2FsbGVyLCBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlMSVNUX1NLSVBfTkVYVF9JVEVNLAotICAgICAgICAgICAgICAgIChzZXNzaW9uLCBjb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0SW5zdGFuY2UoKS5za2lwVG9OZXh0SXRlbSgpOwotICAgICAgICAgICAgICAgIH0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFJlcGVhdE1vZGUoSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBpbnQgcmVwZWF0TW9kZSkgewotICAgICAgICBvbkNvbW1hbmQoY2FsbGVyLCBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlMSVNUX1NFVF9SRVBFQVRfTU9ERSwKLSAgICAgICAgICAgICAgICAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldEluc3RhbmNlKCkuc2V0UmVwZWF0TW9kZShyZXBlYXRNb2RlKTsKLSAgICAgICAgICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRTaHVmZmxlTW9kZShJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGludCBzaHVmZmxlTW9kZSkgewotICAgICAgICBvbkNvbW1hbmQoY2FsbGVyLCBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlMSVNUX1NFVF9TSFVGRkxFX01PREUsCi0gICAgICAgICAgICAgICAgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLnNldFNodWZmbGVNb2RlKHNodWZmbGVNb2RlKTsKLSAgICAgICAgICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgLy8gQUlETCBtZXRob2RzIGZvciBMaWJyYXJ5U2Vzc2lvbiBvdmVycmlkZXMKLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBnZXRMaWJyYXJ5Um9vdChmaW5hbCBJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGZpbmFsIEJ1bmRsZSByb290SGludHMpCi0gICAgICAgICAgICB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbiB7Ci0gICAgICAgIG9uQnJvd3NlckNvbW1hbmQoY2FsbGVyLCAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgZmluYWwgTGlicmFyeVJvb3Qgcm9vdCA9IHNlc3Npb24uZ2V0Q2FsbGJhY2soKS5vbkdldExpYnJhcnlSb290KHNlc3Npb24uZ2V0SW5zdGFuY2UoKSwKLSAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlciwgcm9vdEhpbnRzKTsKLSAgICAgICAgICAgIG5vdGlmeShjb250cm9sbGVyLCAodW51c2VkLCBpQ29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgICAgIGlDb250cm9sbGVyLm9uR2V0TGlicmFyeVJvb3REb25lKHJvb3RIaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgIHJvb3QgPT0gbnVsbCA/IG51bGwgOiByb290LmdldFJvb3RJZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgcm9vdCA9PSBudWxsID8gbnVsbCA6IHJvb3QuZ2V0RXh0cmFzKCkpOwotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGdldEl0ZW0oZmluYWwgSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBmaW5hbCBTdHJpbmcgbWVkaWFJZCkKLSAgICAgICAgICAgIHRocm93cyBSdW50aW1lRXhjZXB0aW9uIHsKLSAgICAgICAgb25Ccm93c2VyQ29tbWFuZChjYWxsZXIsIChzZXNzaW9uLCBjb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICBpZiAobWVkaWFJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIm1lZGlhSWQgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWwgTWVkaWFJdGVtMiByZXN1bHQgPSBzZXNzaW9uLmdldENhbGxiYWNrKCkub25HZXRJdGVtKHNlc3Npb24uZ2V0SW5zdGFuY2UoKSwKLSAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlciwgbWVkaWFJZCk7Ci0gICAgICAgICAgICBub3RpZnkoY29udHJvbGxlciwgKHVudXNlZCwgaUNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgICAgICBpQ29udHJvbGxlci5vbkdldEl0ZW1Eb25lKG1lZGlhSWQsIHJlc3VsdCA9PSBudWxsID8gbnVsbCA6IHJlc3VsdC50b0J1bmRsZSgpKTsKLSAgICAgICAgICAgIH0pOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBnZXRDaGlsZHJlbihmaW5hbCBJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGZpbmFsIFN0cmluZyBwYXJlbnRJZCwKLSAgICAgICAgICAgIGZpbmFsIGludCBwYWdlLCBmaW5hbCBpbnQgcGFnZVNpemUsIGZpbmFsIEJ1bmRsZSBleHRyYXMpIHRocm93cyBSdW50aW1lRXhjZXB0aW9uIHsKLSAgICAgICAgb25Ccm93c2VyQ29tbWFuZChjYWxsZXIsIChzZXNzaW9uLCBjb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICBpZiAocGFyZW50SWQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJwYXJlbnRJZCBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocGFnZSA8IDEgfHwgcGFnZVNpemUgPCAxKSB7Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIk5laXRoZXIgcGFnZSBub3IgcGFnZVNpemUgc2hvdWxkIGJlIGxlc3MgdGhhbiAxIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIExpc3Q8TWVkaWFJdGVtMj4gcmVzdWx0ID0gc2Vzc2lvbi5nZXRDYWxsYmFjaygpLm9uR2V0Q2hpbGRyZW4oc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLAotICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLCBwYXJlbnRJZCwgcGFnZSwgcGFnZVNpemUsIGV4dHJhcyk7Ci0gICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwgJiYgcmVzdWx0LnNpemUoKSA+IHBhZ2VTaXplKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigib25HZXRDaGlsZHJlbigpIHNob3VsZG4ndCByZXR1cm4gbWVkaWEgaXRlbXMgIgotICAgICAgICAgICAgICAgICAgICAgICAgKyAibW9yZSB0aGFuIHBhZ2VTaXplLiByZXN1bHQuc2l6ZSgpPSIgKyByZXN1bHQuc2l6ZSgpICsgIiBwYWdlU2l6ZT0iCi0gICAgICAgICAgICAgICAgICAgICAgICArIHBhZ2VTaXplKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsIExpc3Q8QnVuZGxlPiBidW5kbGVMaXN0OwotICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYnVuZGxlTGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICAgICAgICAgIGZvciAoTWVkaWFJdGVtMiBpdGVtIDogcmVzdWx0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1bmRsZUxpc3QuYWRkKGl0ZW0gPT0gbnVsbCA/IG51bGwgOiBpdGVtLnRvQnVuZGxlKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYnVuZGxlTGlzdCA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBub3RpZnkoY29udHJvbGxlciwgKHVudXNlZCwgaUNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgICAgICBpQ29udHJvbGxlci5vbkdldENoaWxkcmVuRG9uZShwYXJlbnRJZCwgcGFnZSwgcGFnZVNpemUsIGJ1bmRsZUxpc3QsIGV4dHJhcyk7Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2VhcmNoKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgU3RyaW5nIHF1ZXJ5LCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIG9uQnJvd3NlckNvbW1hbmQoY2FsbGVyLCAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHF1ZXJ5KSkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgInNlYXJjaCgpOiBJZ25vcmluZyBlbXB0eSBxdWVyeSBmcm9tICIgKyBjb250cm9sbGVyKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXNzaW9uLmdldENhbGxiYWNrKCkub25TZWFyY2goc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLCBjb250cm9sbGVyLCBxdWVyeSwgZXh0cmFzKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZ2V0U2VhcmNoUmVzdWx0KGZpbmFsIElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgZmluYWwgU3RyaW5nIHF1ZXJ5LAotICAgICAgICAgICAgZmluYWwgaW50IHBhZ2UsIGZpbmFsIGludCBwYWdlU2l6ZSwgZmluYWwgQnVuZGxlIGV4dHJhcykgewotICAgICAgICBvbkJyb3dzZXJDb21tYW5kKGNhbGxlciwgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShxdWVyeSkpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJnZXRTZWFyY2hSZXN1bHQoKTogSWdub3JpbmcgZW1wdHkgcXVlcnkgZnJvbSAiICsgY29udHJvbGxlcik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHBhZ2UgPCAxIHx8IHBhZ2VTaXplIDwgMSkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgImdldFNlYXJjaFJlc3VsdCgpOiBJZ25vcmluZyBuZWdhdGl2ZSBwYWdlIC8gcGFnZVNpemUuIgotICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHBhZ2U9IiArIHBhZ2UgKyAiIHBhZ2VTaXplPSIgKyBwYWdlU2l6ZSArICIgZnJvbSAiICsgY29udHJvbGxlcik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTGlzdDxNZWRpYUl0ZW0yPiByZXN1bHQgPSBzZXNzaW9uLmdldENhbGxiYWNrKCkub25HZXRTZWFyY2hSZXN1bHQoc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLAotICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLCBxdWVyeSwgcGFnZSwgcGFnZVNpemUsIGV4dHJhcyk7Ci0gICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwgJiYgcmVzdWx0LnNpemUoKSA+IHBhZ2VTaXplKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigib25HZXRTZWFyY2hSZXN1bHQoKSBzaG91bGRuJ3QgcmV0dXJuIG1lZGlhICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIml0ZW1zIG1vcmUgdGhhbiBwYWdlU2l6ZS4gcmVzdWx0LnNpemUoKT0iICsgcmVzdWx0LnNpemUoKSArICIgcGFnZVNpemU9IgotICAgICAgICAgICAgICAgICAgICAgICAgKyBwYWdlU2l6ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbCBMaXN0PEJ1bmRsZT4gYnVuZGxlTGlzdDsKLSAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGJ1bmRsZUxpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgICAgICAgICBmb3IgKE1lZGlhSXRlbTIgaXRlbSA6IHJlc3VsdCkgewotICAgICAgICAgICAgICAgICAgICBidW5kbGVMaXN0LmFkZChpdGVtID09IG51bGwgPyBudWxsIDogaXRlbS50b0J1bmRsZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGJ1bmRsZUxpc3QgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbm90aWZ5KGNvbnRyb2xsZXIsICh1bnVzZWQsIGlDb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICAgICAgaUNvbnRyb2xsZXIub25HZXRTZWFyY2hSZXN1bHREb25lKHF1ZXJ5LCBwYWdlLCBwYWdlU2l6ZSwgYnVuZGxlTGlzdCwgZXh0cmFzKTsKLSAgICAgICAgICAgIH0pOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzdWJzY3JpYmUoZmluYWwgSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBmaW5hbCBTdHJpbmcgcGFyZW50SWQsCi0gICAgICAgICAgICBmaW5hbCBCdW5kbGUgb3B0aW9uKSB7Ci0gICAgICAgIG9uQnJvd3NlckNvbW1hbmQoY2FsbGVyLCAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgaWYgKHBhcmVudElkID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJzdWJzY3JpYmUoKTogSWdub3JpbmcgbnVsbCBwYXJlbnRJZCBmcm9tICIgKyBjb250cm9sbGVyKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXNzaW9uLmdldENhbGxiYWNrKCkub25TdWJzY3JpYmUoc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLAotICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLCBwYXJlbnRJZCwgb3B0aW9uKTsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgICAgICBTZXQ8U3RyaW5nPiBzdWJzY3JpcHRpb24gPSBtU3Vic2NyaXB0aW9ucy5nZXQoY29udHJvbGxlcik7Ci0gICAgICAgICAgICAgICAgaWYgKHN1YnNjcmlwdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN1YnNjcmlwdGlvbiA9IG5ldyBIYXNoU2V0PD4oKTsKLSAgICAgICAgICAgICAgICAgICAgbVN1YnNjcmlwdGlvbnMucHV0KGNvbnRyb2xsZXIsIHN1YnNjcmlwdGlvbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHN1YnNjcmlwdGlvbi5hZGQocGFyZW50SWQpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB1bnN1YnNjcmliZShmaW5hbCBJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGZpbmFsIFN0cmluZyBwYXJlbnRJZCkgewotICAgICAgICBvbkJyb3dzZXJDb21tYW5kKGNhbGxlciwgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgIGlmIChwYXJlbnRJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAidW5zdWJzY3JpYmUoKTogSWdub3JpbmcgbnVsbCBwYXJlbnRJZCBmcm9tICIgKyBjb250cm9sbGVyKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXNzaW9uLmdldENhbGxiYWNrKCkub25VbnN1YnNjcmliZShzZXNzaW9uLmdldEluc3RhbmNlKCksIGNvbnRyb2xsZXIsIHBhcmVudElkKTsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgICAgICBtU3Vic2NyaXB0aW9ucy5yZW1vdmUoY29udHJvbGxlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAvLyBBUElzIGZvciBNZWRpYVNlc3Npb24ySW1wbAotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotICAgIC8vIFRPRE8oamFld2FuKTogKENhbiBiZSBQb3N0LVApIE5lZWQgYSB3YXkgdG8gZ2V0IGNvbnRyb2xsZXIgd2l0aCBwZXJtaXNzaW9ucwotICAgIHB1YmxpYyBMaXN0PENvbnRyb2xsZXJJbmZvPiBnZXRDb250cm9sbGVycygpIHsKLSAgICAgICAgQXJyYXlMaXN0PENvbnRyb2xsZXJJbmZvPiBjb250cm9sbGVycyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1Db250cm9sbGVycy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIGNvbnRyb2xsZXJzLmFkZChtQ29udHJvbGxlcnMudmFsdWVBdChpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNvbnRyb2xsZXJzOwotICAgIH0KLQotICAgIC8vIFNob3VsZCBiZSB1c2VkIHdpdGhvdXQgYSBsb2NrIHRvIHByZXZlbnQgcG90ZW50aWFsIGRlYWRsb2NrLgotICAgIHB1YmxpYyB2b2lkIG5vdGlmeVBsYXllclN0YXRlQ2hhbmdlZE5vdExvY2tlZChpbnQgc3RhdGUpIHsKLSAgICAgICAgbm90aWZ5QWxsKChjb250cm9sbGVyLCBpQ29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgaUNvbnRyb2xsZXIub25QbGF5ZXJTdGF0ZUNoYW5nZWQoc3RhdGUpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICAvLyBUT0RPKGphZXdhbik6IFJlbmFtZQotICAgIHB1YmxpYyB2b2lkIG5vdGlmeVBvc2l0aW9uQ2hhbmdlZE5vdExvY2tlZChsb25nIGV2ZW50VGltZU1zLCBsb25nIHBvc2l0aW9uTXMpIHsKLSAgICAgICAgbm90aWZ5QWxsKChjb250cm9sbGVyLCBpQ29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgaUNvbnRyb2xsZXIub25Qb3NpdGlvbkNoYW5nZWQoZXZlbnRUaW1lTXMsIHBvc2l0aW9uTXMpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBub3RpZnlQbGF5YmFja1NwZWVkQ2hhbmdlZE5vdExvY2tlZChmbG9hdCBzcGVlZCkgewotICAgICAgICBub3RpZnlBbGwoKGNvbnRyb2xsZXIsIGlDb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICBpQ29udHJvbGxlci5vblBsYXliYWNrU3BlZWRDaGFuZ2VkKHNwZWVkKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbm90aWZ5QnVmZmVyZWRQb3NpdGlvbkNoYW5nZWROb3RMb2NrZWQobG9uZyBidWZmZXJlZFBvc2l0aW9uTXMpIHsKLSAgICAgICAgbm90aWZ5QWxsKChjb250cm9sbGVyLCBpQ29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgaUNvbnRyb2xsZXIub25CdWZmZXJlZFBvc2l0aW9uQ2hhbmdlZChidWZmZXJlZFBvc2l0aW9uTXMpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBub3RpZnlDdXN0b21MYXlvdXROb3RMb2NrZWQoQ29udHJvbGxlckluZm8gY29udHJvbGxlciwgTGlzdDxDb21tYW5kQnV0dG9uPiBsYXlvdXQpIHsKLSAgICAgICAgbm90aWZ5KGNvbnRyb2xsZXIsICh1bnVzZWQsIGlDb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICBMaXN0PEJ1bmRsZT4gbGF5b3V0QnVuZGxlcyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsYXlvdXQuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBCdW5kbGUgYnVuZGxlID0gKChDb21tYW5kQnV0dG9uSW1wbCkgbGF5b3V0LmdldChpKS5nZXRQcm92aWRlcigpKS50b0J1bmRsZSgpOwotICAgICAgICAgICAgICAgIGlmIChidW5kbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBsYXlvdXRCdW5kbGVzLmFkZChidW5kbGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlDb250cm9sbGVyLm9uQ3VzdG9tTGF5b3V0Q2hhbmdlZChsYXlvdXRCdW5kbGVzKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbm90aWZ5UGxheWxpc3RDaGFuZ2VkTm90TG9ja2VkKExpc3Q8TWVkaWFJdGVtMj4gcGxheWxpc3QsIE1lZGlhTWV0YWRhdGEyIG1ldGFkYXRhKSB7Ci0gICAgICAgIGZpbmFsIExpc3Q8QnVuZGxlPiBidW5kbGVMaXN0OwotICAgICAgICBpZiAocGxheWxpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgYnVuZGxlTGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwbGF5bGlzdC5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIGlmIChwbGF5bGlzdC5nZXQoaSkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBCdW5kbGUgYnVuZGxlID0gcGxheWxpc3QuZ2V0KGkpLnRvQnVuZGxlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChidW5kbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgYnVuZGxlTGlzdC5hZGQoYnVuZGxlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGJ1bmRsZUxpc3QgPSBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIEJ1bmRsZSBtZXRhZGF0YUJ1bmRsZSA9IChtZXRhZGF0YSA9PSBudWxsKSA/IG51bGwgOiBtZXRhZGF0YS50b0J1bmRsZSgpOwotICAgICAgICBub3RpZnlBbGwoKGNvbnRyb2xsZXIsIGlDb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICBpZiAoZ2V0Q29udHJvbGxlckJpbmRlcklmQWJsZShjb250cm9sbGVyLAotICAgICAgICAgICAgICAgICAgICBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlMSVNUX0dFVF9MSVNUKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaUNvbnRyb2xsZXIub25QbGF5bGlzdENoYW5nZWQoYnVuZGxlTGlzdCwgbWV0YWRhdGFCdW5kbGUpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChnZXRDb250cm9sbGVyQmluZGVySWZBYmxlKGNvbnRyb2xsZXIsCi0gICAgICAgICAgICAgICAgICAgIFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfUExBWUxJU1RfR0VUX0xJU1RfTUVUQURBVEEpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpQ29udHJvbGxlci5vblBsYXlsaXN0TWV0YWRhdGFDaGFuZ2VkKG1ldGFkYXRhQnVuZGxlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbm90aWZ5UGxheWxpc3RNZXRhZGF0YUNoYW5nZWROb3RMb2NrZWQoTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEpIHsKLSAgICAgICAgZmluYWwgQnVuZGxlIG1ldGFkYXRhQnVuZGxlID0gKG1ldGFkYXRhID09IG51bGwpID8gbnVsbCA6IG1ldGFkYXRhLnRvQnVuZGxlKCk7Ci0gICAgICAgIG5vdGlmeUFsbChTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlMSVNUX0dFVF9MSVNUX01FVEFEQVRBLAotICAgICAgICAgICAgICAgICh1bnVzZWQsIGlDb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICAgICAgICAgIGlDb250cm9sbGVyLm9uUGxheWxpc3RNZXRhZGF0YUNoYW5nZWQobWV0YWRhdGFCdW5kbGUpOwotICAgICAgICAgICAgICAgIH0pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG5vdGlmeVJlcGVhdE1vZGVDaGFuZ2VkTm90TG9ja2VkKGludCByZXBlYXRNb2RlKSB7Ci0gICAgICAgIG5vdGlmeUFsbCgodW51c2VkLCBpQ29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgaUNvbnRyb2xsZXIub25SZXBlYXRNb2RlQ2hhbmdlZChyZXBlYXRNb2RlKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbm90aWZ5U2h1ZmZsZU1vZGVDaGFuZ2VkTm90TG9ja2VkKGludCBzaHVmZmxlTW9kZSkgewotICAgICAgICBub3RpZnlBbGwoKHVudXNlZCwgaUNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgIGlDb250cm9sbGVyLm9uU2h1ZmZsZU1vZGVDaGFuZ2VkKHNodWZmbGVNb2RlKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbm90aWZ5UGxheWJhY2tJbmZvQ2hhbmdlZChNZWRpYUNvbnRyb2xsZXIyLlBsYXliYWNrSW5mbyBwbGF5YmFja0luZm8pIHsKLSAgICAgICAgZmluYWwgQnVuZGxlIHBsYXliYWNrSW5mb0J1bmRsZSA9Ci0gICAgICAgICAgICAgICAgKChNZWRpYUNvbnRyb2xsZXIySW1wbC5QbGF5YmFja0luZm9JbXBsKSBwbGF5YmFja0luZm8uZ2V0UHJvdmlkZXIoKSkudG9CdW5kbGUoKTsKLSAgICAgICAgbm90aWZ5QWxsKCh1bnVzZWQsIGlDb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICBpQ29udHJvbGxlci5vblBsYXliYWNrSW5mb0NoYW5nZWQocGxheWJhY2tJbmZvQnVuZGxlKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QWxsb3dlZENvbW1hbmRzKENvbnRyb2xsZXJJbmZvIGNvbnRyb2xsZXIsIFNlc3Npb25Db21tYW5kR3JvdXAyIGNvbW1hbmRzKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIG1BbGxvd2VkQ29tbWFuZEdyb3VwTWFwLnB1dChjb250cm9sbGVyLCBjb21tYW5kcyk7Ci0gICAgICAgIH0KLSAgICAgICAgbm90aWZ5KGNvbnRyb2xsZXIsICh1bnVzZWQsIGlDb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICBpQ29udHJvbGxlci5vbkFsbG93ZWRDb21tYW5kc0NoYW5nZWQoY29tbWFuZHMudG9CdW5kbGUoKSk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNlbmRDdXN0b21Db21tYW5kKENvbnRyb2xsZXJJbmZvIGNvbnRyb2xsZXIsIFNlc3Npb25Db21tYW5kMiBjb21tYW5kLCBCdW5kbGUgYXJncywKLSAgICAgICAgICAgIFJlc3VsdFJlY2VpdmVyIHJlY2VpdmVyKSB7Ci0gICAgICAgIGlmIChyZWNlaXZlciAhPSBudWxsICYmIGNvbnRyb2xsZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ29udHJvbGxlciBzaG91bGRuJ3QgYmUgbnVsbCBpZiByZXN1bHQgcmVjZWl2ZXIgaXMiCi0gICAgICAgICAgICAgICAgICAgICsgIiBzcGVjaWZpZWQiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoY29tbWFuZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb21tYW5kIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgbm90aWZ5KGNvbnRyb2xsZXIsICh1bnVzZWQsIGlDb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICBCdW5kbGUgY29tbWFuZEJ1bmRsZSA9IGNvbW1hbmQudG9CdW5kbGUoKTsKLSAgICAgICAgICAgIGlDb250cm9sbGVyLm9uQ3VzdG9tQ29tbWFuZChjb21tYW5kQnVuZGxlLCBhcmdzLCBudWxsKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2VuZEN1c3RvbUNvbW1hbmQoU2Vzc2lvbkNvbW1hbmQyIGNvbW1hbmQsIEJ1bmRsZSBhcmdzKSB7Ci0gICAgICAgIGlmIChjb21tYW5kID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNvbW1hbmQgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBCdW5kbGUgY29tbWFuZEJ1bmRsZSA9IGNvbW1hbmQudG9CdW5kbGUoKTsKLSAgICAgICAgbm90aWZ5QWxsKCh1bnVzZWQsIGlDb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICBpQ29udHJvbGxlci5vbkN1c3RvbUNvbW1hbmQoY29tbWFuZEJ1bmRsZSwgYXJncywgbnVsbCk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG5vdGlmeUVycm9yKGludCBlcnJvckNvZGUsIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgbm90aWZ5QWxsKCh1bnVzZWQsIGlDb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICBpQ29udHJvbGxlci5vbkVycm9yKGVycm9yQ29kZSwgZXh0cmFzKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIC8vIEFQSXMgZm9yIE1lZGlhTGlicmFyeVNlc3Npb25JbXBsCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0gICAgcHVibGljIHZvaWQgbm90aWZ5U2VhcmNoUmVzdWx0Q2hhbmdlZChDb250cm9sbGVySW5mbyBjb250cm9sbGVyLCBTdHJpbmcgcXVlcnksIGludCBpdGVtQ291bnQsCi0gICAgICAgICAgICBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIG5vdGlmeShjb250cm9sbGVyLCAodW51c2VkLCBpQ29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgaUNvbnRyb2xsZXIub25TZWFyY2hSZXN1bHRDaGFuZ2VkKHF1ZXJ5LCBpdGVtQ291bnQsIGV4dHJhcyk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG5vdGlmeUNoaWxkcmVuQ2hhbmdlZE5vdExvY2tlZChDb250cm9sbGVySW5mbyBjb250cm9sbGVyLCBTdHJpbmcgcGFyZW50SWQsCi0gICAgICAgICAgICBpbnQgaXRlbUNvdW50LCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIG5vdGlmeShjb250cm9sbGVyLCAodW51c2VkLCBpQ29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgaWYgKGlzU3Vic2NyaWJlZChjb250cm9sbGVyLCBwYXJlbnRJZCkpIHsKLSAgICAgICAgICAgICAgICBpQ29udHJvbGxlci5vbkNoaWxkcmVuQ2hhbmdlZChwYXJlbnRJZCwgaXRlbUNvdW50LCBleHRyYXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBub3RpZnlDaGlsZHJlbkNoYW5nZWROb3RMb2NrZWQoU3RyaW5nIHBhcmVudElkLCBpbnQgaXRlbUNvdW50LCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIG5vdGlmeUFsbCgoY29udHJvbGxlciwgaUNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgIGlmIChpc1N1YnNjcmliZWQoY29udHJvbGxlciwgcGFyZW50SWQpKSB7Ci0gICAgICAgICAgICAgICAgaUNvbnRyb2xsZXIub25DaGlsZHJlbkNoYW5nZWQocGFyZW50SWQsIGl0ZW1Db3VudCwgZXh0cmFzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzU3Vic2NyaWJlZChDb250cm9sbGVySW5mbyBjb250cm9sbGVyLCBTdHJpbmcgcGFyZW50SWQpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgU2V0PFN0cmluZz4gc3Vic2NyaXB0aW9ucyA9IG1TdWJzY3JpcHRpb25zLmdldChjb250cm9sbGVyKTsKLSAgICAgICAgICAgIGlmIChzdWJzY3JpcHRpb25zID09IG51bGwgfHwgIXN1YnNjcmlwdGlvbnMuY29udGFpbnMocGFyZW50SWQpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAvLyBNaXNjCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0gICAgQEZ1bmN0aW9uYWxJbnRlcmZhY2UKLSAgICBwcml2YXRlIGludGVyZmFjZSBTZXNzaW9uUnVubmFibGUgewotICAgICAgICB2b2lkIHJ1bihmaW5hbCBNZWRpYVNlc3Npb24ySW1wbCBzZXNzaW9uLCBmaW5hbCBDb250cm9sbGVySW5mbyBjb250cm9sbGVyKTsKLSAgICB9Ci0KLSAgICBARnVuY3Rpb25hbEludGVyZmFjZQotICAgIHByaXZhdGUgaW50ZXJmYWNlIExpYnJhcnlTZXNzaW9uUnVubmFibGUgewotICAgICAgICB2b2lkIHJ1bihmaW5hbCBNZWRpYUxpYnJhcnlTZXNzaW9uSW1wbCBzZXNzaW9uLCBmaW5hbCBDb250cm9sbGVySW5mbyBjb250cm9sbGVyKTsKLSAgICB9Ci0KLSAgICBARnVuY3Rpb25hbEludGVyZmFjZQotICAgIHByaXZhdGUgaW50ZXJmYWNlIE5vdGlmeVJ1bm5hYmxlIHsKLSAgICAgICAgdm9pZCBydW4oZmluYWwgQ29udHJvbGxlckluZm8gY29udHJvbGxlciwKLSAgICAgICAgICAgICAgICBmaW5hbCBJTWVkaWFDb250cm9sbGVyMiBpQ29udHJvbGxlcikgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhU2Vzc2lvblNlcnZpY2UySW1wbC5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYVNlc3Npb25TZXJ2aWNlMkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzMzZWI2NS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhU2Vzc2lvblNlcnZpY2UySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQubWVkaWE7Ci0KLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5jb250ZW50LkNvbnRleHQuTk9USUZJQ0FUSU9OX1NFUlZJQ0U7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5Ob3RpZmljYXRpb247Ci1pbXBvcnQgYW5kcm9pZC5hcHAuTm90aWZpY2F0aW9uTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXJCYXNlOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXJCYXNlLlBsYXllckV2ZW50Q2FsbGJhY2s7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb24yOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uU2VydmljZTI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb25TZXJ2aWNlMi5NZWRpYU5vdGlmaWNhdGlvbjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlNlc3Npb25Ub2tlbjI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5TZXNzaW9uVG9rZW4yLlRva2VuVHlwZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5NZWRpYVNlc3Npb25TZXJ2aWNlMlByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5HdWFyZGVkQnk7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotLy8gVE9ETyhqYWV3YW4pOiBOZWVkIGEgdGVzdCBmb3Igc2Vzc2lvbiBzZXJ2aWNlIGl0c2VsZi4KLXB1YmxpYyBjbGFzcyBNZWRpYVNlc3Npb25TZXJ2aWNlMkltcGwgaW1wbGVtZW50cyBNZWRpYVNlc3Npb25TZXJ2aWNlMlByb3ZpZGVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTVBTZXNzaW9uU2VydmljZSI7IC8vIHRvIG1lZXQgMjMgY2hhciBsaW1pdCBpbiBMb2cgdGFnCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IHRydWU7IC8vIFRPRE8oamFld2FuKTogQ2hhbmdlIHRoaXMuIChiLzc0MDk0NjExKQotCi0gICAgcHJpdmF0ZSBmaW5hbCBNZWRpYVNlc3Npb25TZXJ2aWNlMiBtSW5zdGFuY2U7Ci0gICAgcHJpdmF0ZSBmaW5hbCBQbGF5ZXJFdmVudENhbGxiYWNrIG1DYWxsYmFjayA9IG5ldyBTZXNzaW9uU2VydmljZUV2ZW50Q2FsbGJhY2soKTsKLQotICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IG1Mb2NrID0gbmV3IE9iamVjdCgpOwotICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKLSAgICBwcml2YXRlIE5vdGlmaWNhdGlvbk1hbmFnZXIgbU5vdGlmaWNhdGlvbk1hbmFnZXI7Ci0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgSW50ZW50IG1TdGFydFNlbGZJbnRlbnQ7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gbUlzUnVubmluZ0ZvcmVncm91bmQ7Ci0gICAgcHJpdmF0ZSBNZWRpYVNlc3Npb24yIG1TZXNzaW9uOwotCi0gICAgcHVibGljIE1lZGlhU2Vzc2lvblNlcnZpY2UySW1wbChNZWRpYVNlc3Npb25TZXJ2aWNlMiBpbnN0YW5jZSkgewotICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIk1lZGlhU2Vzc2lvblNlcnZpY2UySW1wbCgiICsgaW5zdGFuY2UgKyAiKSIpOwotICAgICAgICB9Ci0gICAgICAgIG1JbnN0YW5jZSA9IGluc3RhbmNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNZWRpYVNlc3Npb24yIGdldFNlc3Npb25faW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIGdldFNlc3Npb24oKTsKLSAgICB9Ci0KLSAgICBNZWRpYVNlc3Npb24yIGdldFNlc3Npb24oKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIHJldHVybiBtU2Vzc2lvbjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNZWRpYU5vdGlmaWNhdGlvbiBvblVwZGF0ZU5vdGlmaWNhdGlvbl9pbXBsKCkgewotICAgICAgICAvLyBQcm92aWRlIGRlZmF1bHQgbm90aWZpY2F0aW9uIFVJIGxhdGVyLgotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZV9pbXBsKCkgewotICAgICAgICBtTm90aWZpY2F0aW9uTWFuYWdlciA9IChOb3RpZmljYXRpb25NYW5hZ2VyKSBtSW5zdGFuY2UuZ2V0U3lzdGVtU2VydmljZSgKLSAgICAgICAgICAgICAgICBOT1RJRklDQVRJT05fU0VSVklDRSk7Ci0gICAgICAgIG1TdGFydFNlbGZJbnRlbnQgPSBuZXcgSW50ZW50KG1JbnN0YW5jZSwgbUluc3RhbmNlLmdldENsYXNzKCkpOwotCi0gICAgICAgIFNlc3Npb25Ub2tlbjIgdG9rZW4gPSBuZXcgU2Vzc2lvblRva2VuMihtSW5zdGFuY2UsIG1JbnN0YW5jZS5nZXRQYWNrYWdlTmFtZSgpLAotICAgICAgICAgICAgICAgIG1JbnN0YW5jZS5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgIGlmICh0b2tlbi5nZXRUeXBlKCkgIT0gZ2V0U2Vzc2lvblR5cGUoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkV4cGVjdGVkIHNlc3Npb24gc2VydmljZSwgYnV0IHdhcyAiICsgdG9rZW4uZ2V0VHlwZSgpKTsKLSAgICAgICAgfQotICAgICAgICBtU2Vzc2lvbiA9IG1JbnN0YW5jZS5vbkNyZWF0ZVNlc3Npb24odG9rZW4uZ2V0SWQoKSk7Ci0gICAgICAgIGlmIChtU2Vzc2lvbiA9PSBudWxsIHx8ICF0b2tlbi5nZXRJZCgpLmVxdWFscyhtU2Vzc2lvbi5nZXRUb2tlbigpLmdldElkKCkpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiRXhwZWN0ZWQgc2Vzc2lvbiB3aXRoIGlkICIgKyB0b2tlbi5nZXRJZCgpCi0gICAgICAgICAgICAgICAgICAgICsgIiwgYnV0IGdvdCAiICsgbVNlc3Npb24pOwotICAgICAgICB9Ci0gICAgICAgIC8vIFRPRE8oamFld2FuKTogVW5jb21tZW50IGhlcmUuCi0gICAgICAgIC8vIG1TZXNzaW9uLnJlZ2lzdGVyUGxheWVyRXZlbnRDYWxsYmFjayhtQ2FsbGJhY2ssIG1TZXNzaW9uLmdldEV4ZWN1dG9yKCkpOwotICAgIH0KLQotICAgIEBUb2tlblR5cGUgaW50IGdldFNlc3Npb25UeXBlKCkgewotICAgICAgICByZXR1cm4gU2Vzc2lvblRva2VuMi5UWVBFX1NFU1NJT05fU0VSVklDRTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSUJpbmRlciBvbkJpbmRfaW1wbChJbnRlbnQgaW50ZW50KSB7Ci0gICAgICAgIGlmIChNZWRpYVNlc3Npb25TZXJ2aWNlMi5TRVJWSUNFX0lOVEVSRkFDRS5lcXVhbHMoaW50ZW50LmdldEFjdGlvbigpKSkgewotICAgICAgICAgICAgcmV0dXJuICgoTWVkaWFTZXNzaW9uMkltcGwpIG1TZXNzaW9uLmdldFByb3ZpZGVyKCkpLmdldFNlc3Npb25TdHViKCkuYXNCaW5kZXIoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlTm90aWZpY2F0aW9uKGludCBwbGF5ZXJTdGF0ZSkgewotICAgICAgICBNZWRpYU5vdGlmaWNhdGlvbiBtZWRpYU5vdGlmaWNhdGlvbiA9IG1JbnN0YW5jZS5vblVwZGF0ZU5vdGlmaWNhdGlvbigpOwotICAgICAgICBpZiAobWVkaWFOb3RpZmljYXRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHN3aXRjaChwbGF5ZXJTdGF0ZSkgewotICAgICAgICAgICAgY2FzZSBNZWRpYVBsYXllckJhc2UuUExBWUVSX1NUQVRFX1BMQVlJTkc6Ci0gICAgICAgICAgICAgICAgaWYgKCFtSXNSdW5uaW5nRm9yZWdyb3VuZCkgewotICAgICAgICAgICAgICAgICAgICBtSXNSdW5uaW5nRm9yZWdyb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIG1JbnN0YW5jZS5zdGFydEZvcmVncm91bmRTZXJ2aWNlKG1TdGFydFNlbGZJbnRlbnQpOwotICAgICAgICAgICAgICAgICAgICBtSW5zdGFuY2Uuc3RhcnRGb3JlZ3JvdW5kKG1lZGlhTm90aWZpY2F0aW9uLmdldE5vdGlmaWNhdGlvbklkKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFOb3RpZmljYXRpb24uZ2V0Tm90aWZpY2F0aW9uKCkpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBNZWRpYVBsYXllckJhc2UuUExBWUVSX1NUQVRFX0lETEU6Ci0gICAgICAgICAgICBjYXNlIE1lZGlhUGxheWVyQmFzZS5QTEFZRVJfU1RBVEVfRVJST1I6Ci0gICAgICAgICAgICAgICAgaWYgKG1Jc1J1bm5pbmdGb3JlZ3JvdW5kKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Jc1J1bm5pbmdGb3JlZ3JvdW5kID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIG1JbnN0YW5jZS5zdG9wRm9yZWdyb3VuZCh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBtTm90aWZpY2F0aW9uTWFuYWdlci5ub3RpZnkobWVkaWFOb3RpZmljYXRpb24uZ2V0Tm90aWZpY2F0aW9uSWQoKSwKLSAgICAgICAgICAgICAgICBtZWRpYU5vdGlmaWNhdGlvbi5nZXROb3RpZmljYXRpb24oKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBjbGFzcyBTZXNzaW9uU2VydmljZUV2ZW50Q2FsbGJhY2sgZXh0ZW5kcyBQbGF5ZXJFdmVudENhbGxiYWNrIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUGxheWVyU3RhdGVDaGFuZ2VkKE1lZGlhUGxheWVyQmFzZSBwbGF5ZXIsIGludCBzdGF0ZSkgewotICAgICAgICAgICAgLy8gVE9ETzogSW1wbGVtZW50IHRoaXMKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTWVkaWFOb3RpZmljYXRpb25JbXBsIGltcGxlbWVudHMgTWVkaWFOb3RpZmljYXRpb25Qcm92aWRlciB7Ci0gICAgICAgIHByaXZhdGUgaW50IG1Ob3RpZmljYXRpb25JZDsKLSAgICAgICAgcHJpdmF0ZSBOb3RpZmljYXRpb24gbU5vdGlmaWNhdGlvbjsKLQotICAgICAgICBwdWJsaWMgTWVkaWFOb3RpZmljYXRpb25JbXBsKE1lZGlhTm90aWZpY2F0aW9uIGluc3RhbmNlLCBpbnQgbm90aWZpY2F0aW9uSWQsCi0gICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotICAgICAgICAgICAgaWYgKG5vdGlmaWNhdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibm90aWZpY2F0aW9uIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtTm90aWZpY2F0aW9uSWQgPSBub3RpZmljYXRpb25JZDsKLSAgICAgICAgICAgIG1Ob3RpZmljYXRpb24gPSBub3RpZmljYXRpb247Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGludCBnZXROb3RpZmljYXRpb25JZF9pbXBsKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Ob3RpZmljYXRpb25JZDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgTm90aWZpY2F0aW9uIGdldE5vdGlmaWNhdGlvbl9pbXBsKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Ob3RpZmljYXRpb247Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL1JhdGluZzJJbXBsLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL1JhdGluZzJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1NTgxMjkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9SYXRpbmcySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQubWVkaWE7Ci0KLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5SYXRpbmcyLio7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlJhdGluZzI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5SYXRpbmcyLlN0eWxlOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLlJhdGluZzJQcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCi1pbXBvcnQgamF2YS51dGlsLk9iamVjdHM7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBSYXRpbmcySW1wbCBpbXBsZW1lbnRzIFJhdGluZzJQcm92aWRlciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJSYXRpbmcyIjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfU1RZTEUgPSAiYW5kcm9pZC5tZWRpYS5yYXRpbmcyLnN0eWxlIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1ZBTFVFID0gImFuZHJvaWQubWVkaWEucmF0aW5nMi52YWx1ZSI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBmbG9hdCBSQVRJTkdfTk9UX1JBVEVEID0gLTEuMGY7Ci0KLSAgICBwcml2YXRlIGZpbmFsIFJhdGluZzIgbUluc3RhbmNlOwotICAgIHByaXZhdGUgZmluYWwgaW50IG1SYXRpbmdTdHlsZTsKLSAgICBwcml2YXRlIGZpbmFsIGZsb2F0IG1SYXRpbmdWYWx1ZTsKLQotICAgIHByaXZhdGUgUmF0aW5nMkltcGwoQFN0eWxlIGludCByYXRpbmdTdHlsZSwgZmxvYXQgcmF0aW5nKSB7Ci0gICAgICAgIG1SYXRpbmdTdHlsZSA9IHJhdGluZ1N0eWxlOwotICAgICAgICBtUmF0aW5nVmFsdWUgPSByYXRpbmc7Ci0gICAgICAgIG1JbnN0YW5jZSA9IG5ldyBSYXRpbmcyKHRoaXMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmdfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuICJSYXRpbmcyOnN0eWxlPSIgKyBtUmF0aW5nU3R5bGUgKyAiIHJhdGluZz0iCi0gICAgICAgICAgICAgICAgKyAobVJhdGluZ1ZhbHVlIDwgMC4wZiA/ICJ1bnJhdGVkIiA6IFN0cmluZy52YWx1ZU9mKG1SYXRpbmdWYWx1ZSkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFsc19pbXBsKE9iamVjdCBvYmopIHsKLSAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgUmF0aW5nMikpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBSYXRpbmcySW1wbCBvdGhlciA9IChSYXRpbmcySW1wbCkgKChSYXRpbmcyKSBvYmopLmdldFByb3ZpZGVyKCk7Ci0gICAgICAgIHJldHVybiBtUmF0aW5nU3R5bGUgPT0gb3RoZXIubVJhdGluZ1N0eWxlCi0gICAgICAgICAgICAgICAgJiYgbVJhdGluZ1ZhbHVlID09IG90aGVyLm1SYXRpbmdWYWx1ZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBPYmplY3RzLmhhc2gobVJhdGluZ1N0eWxlLCBtUmF0aW5nVmFsdWUpOwotICAgIH0KLQotICAgIFJhdGluZzIgZ2V0SW5zdGFuY2UoKSB7Ci0gICAgICAgIHJldHVybiBtSW5zdGFuY2U7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBSYXRpbmcyIGZyb21CdW5kbGVfaW1wbChCdW5kbGUgYnVuZGxlKSB7Ci0gICAgICAgIGlmIChidW5kbGUgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBSYXRpbmcySW1wbChidW5kbGUuZ2V0SW50KEtFWV9TVFlMRSksIGJ1bmRsZS5nZXRGbG9hdChLRVlfVkFMVUUpKS5nZXRJbnN0YW5jZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBCdW5kbGUgdG9CdW5kbGVfaW1wbCgpIHsKLSAgICAgICAgQnVuZGxlIGJ1bmRsZSA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgYnVuZGxlLnB1dEludChLRVlfU1RZTEUsIG1SYXRpbmdTdHlsZSk7Ci0gICAgICAgIGJ1bmRsZS5wdXRGbG9hdChLRVlfVkFMVUUsIG1SYXRpbmdWYWx1ZSk7Ci0gICAgICAgIHJldHVybiBidW5kbGU7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBSYXRpbmcyIG5ld1VucmF0ZWRSYXRpbmdfaW1wbChAU3R5bGUgaW50IHJhdGluZ1N0eWxlKSB7Ci0gICAgICAgIHN3aXRjaChyYXRpbmdTdHlsZSkgewotICAgICAgICAgICAgY2FzZSBSQVRJTkdfSEVBUlQ6Ci0gICAgICAgICAgICBjYXNlIFJBVElOR19USFVNQl9VUF9ET1dOOgotICAgICAgICAgICAgY2FzZSBSQVRJTkdfM19TVEFSUzoKLSAgICAgICAgICAgIGNhc2UgUkFUSU5HXzRfU1RBUlM6Ci0gICAgICAgICAgICBjYXNlIFJBVElOR181X1NUQVJTOgotICAgICAgICAgICAgY2FzZSBSQVRJTkdfUEVSQ0VOVEFHRToKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJhdGluZzJJbXBsKHJhdGluZ1N0eWxlLCBSQVRJTkdfTk9UX1JBVEVEKS5nZXRJbnN0YW5jZSgpOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgUmF0aW5nMiBuZXdIZWFydFJhdGluZ19pbXBsKGJvb2xlYW4gaGFzSGVhcnQpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBSYXRpbmcySW1wbChSQVRJTkdfSEVBUlQsIGhhc0hlYXJ0ID8gMS4wZiA6IDAuMGYpLmdldEluc3RhbmNlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBSYXRpbmcyIG5ld1RodW1iUmF0aW5nX2ltcGwoYm9vbGVhbiB0aHVtYklzVXApIHsKLSAgICAgICAgcmV0dXJuIG5ldyBSYXRpbmcySW1wbChSQVRJTkdfVEhVTUJfVVBfRE9XTiwgdGh1bWJJc1VwID8gMS4wZiA6IDAuMGYpLmdldEluc3RhbmNlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBSYXRpbmcyIG5ld1N0YXJSYXRpbmdfaW1wbChpbnQgc3RhclJhdGluZ1N0eWxlLCBmbG9hdCBzdGFyUmF0aW5nKSB7Ci0gICAgICAgIGZsb2F0IG1heFJhdGluZyA9IFJBVElOR19OT1RfUkFURUQ7Ci0gICAgICAgIHN3aXRjaChzdGFyUmF0aW5nU3R5bGUpIHsKLSAgICAgICAgICAgIGNhc2UgUkFUSU5HXzNfU1RBUlM6Ci0gICAgICAgICAgICAgICAgbWF4UmF0aW5nID0gMy4wZjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgUkFUSU5HXzRfU1RBUlM6Ci0gICAgICAgICAgICAgICAgbWF4UmF0aW5nID0gNC4wZjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgUkFUSU5HXzVfU1RBUlM6Ci0gICAgICAgICAgICAgICAgbWF4UmF0aW5nID0gNS4wZjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiSW52YWxpZCByYXRpbmcgc3R5bGUgKCIgKyBzdGFyUmF0aW5nU3R5bGUgKyAiKSBmb3IgYSBzdGFyIHJhdGluZyIpOwotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGlmICgoc3RhclJhdGluZyA8IDAuMGYpIHx8IChzdGFyUmF0aW5nID4gbWF4UmF0aW5nKSkgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAiVHJ5aW5nIHRvIHNldCBvdXQgb2YgcmFuZ2Ugc3Rhci1iYXNlZCByYXRpbmciKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgUmF0aW5nMkltcGwoc3RhclJhdGluZ1N0eWxlLCBzdGFyUmF0aW5nKS5nZXRJbnN0YW5jZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgUmF0aW5nMiBuZXdQZXJjZW50YWdlUmF0aW5nX2ltcGwoZmxvYXQgcGVyY2VudCkgewotICAgICAgICBpZiAoKHBlcmNlbnQgPCAwLjBmKSB8fCAocGVyY2VudCA+IDEwMC4wZikpIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgIkludmFsaWQgcGVyY2VudGFnZS1iYXNlZCByYXRpbmcgdmFsdWUiKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBSYXRpbmcySW1wbChSQVRJTkdfUEVSQ0VOVEFHRSwgcGVyY2VudCkuZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzUmF0ZWRfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG1SYXRpbmdWYWx1ZSA+PSAwLjBmOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgZ2V0UmF0aW5nU3R5bGVfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG1SYXRpbmdTdHlsZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNIZWFydF9pbXBsKCkgewotICAgICAgICBpZiAobVJhdGluZ1N0eWxlICE9IFJBVElOR19IRUFSVCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIChtUmF0aW5nVmFsdWUgPT0gMS4wZik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc1RodW1iVXBfaW1wbCgpIHsKLSAgICAgICAgaWYgKG1SYXRpbmdTdHlsZSAhPSBSQVRJTkdfVEhVTUJfVVBfRE9XTikgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIChtUmF0aW5nVmFsdWUgPT0gMS4wZik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZmxvYXQgZ2V0U3RhclJhdGluZ19pbXBsKCkgewotICAgICAgICBzd2l0Y2ggKG1SYXRpbmdTdHlsZSkgewotICAgICAgICAgICAgY2FzZSBSQVRJTkdfM19TVEFSUzoKLSAgICAgICAgICAgIGNhc2UgUkFUSU5HXzRfU1RBUlM6Ci0gICAgICAgICAgICBjYXNlIFJBVElOR181X1NUQVJTOgotICAgICAgICAgICAgICAgIGlmIChtSW5zdGFuY2UuaXNSYXRlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBtUmF0aW5nVmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICByZXR1cm4gLTEuMGY7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZmxvYXQgZ2V0UGVyY2VudFJhdGluZ19pbXBsKCkgewotICAgICAgICBpZiAoKG1SYXRpbmdTdHlsZSAhPSBSQVRJTkdfUEVSQ0VOVEFHRSkgfHwgIW1JbnN0YW5jZS5pc1JhdGVkKCkpIHsKLSAgICAgICAgICAgIHJldHVybiAtMS4wZjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBtUmF0aW5nVmFsdWU7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL1JvdXRlUGxheWVyLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL1JvdXRlUGxheWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0NTBkMzQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9Sb3V0ZVBsYXllci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQubWVkaWE7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkRhdGFTb3VyY2VEZXNjOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuc2Vzc2lvbi5NZWRpYVNlc3Npb247Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5zZXNzaW9uLlBsYXliYWNrU3RhdGU7Ci1pbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwotaW1wb3J0IGFuZHJvaWQub3MuQnVpbGQ7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uUmVxdWlyZXNBcGk7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhSXRlbVN0YXR1czsKLWltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFTZXNzaW9uU3RhdHVzOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuUmVtb3RlUGxheWJhY2tDbGllbnQ7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5SZW1vdGVQbGF5YmFja0NsaWVudC5JdGVtQWN0aW9uQ2FsbGJhY2s7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5SZW1vdGVQbGF5YmFja0NsaWVudC5TZXNzaW9uQWN0aW9uQ2FsbGJhY2s7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5SZW1vdGVQbGF5YmFja0NsaWVudC5TdGF0dXNDYWxsYmFjazsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLUBSZXF1aXJlc0FwaShhcGkgPSBCdWlsZC5WRVJTSU9OX0NPREVTLkxPTExJUE9QKQotcHVibGljIGNsYXNzIFJvdXRlUGxheWVyIGV4dGVuZHMgTWVkaWFTZXNzaW9uLkNhbGxiYWNrIHsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgUExBWUJBQ0tfQUNUSU9OUyA9IFBsYXliYWNrU3RhdGUuQUNUSU9OX1BBVVNFCi0gICAgICAgICAgICB8IFBsYXliYWNrU3RhdGUuQUNUSU9OX1BMQVkgfCBQbGF5YmFja1N0YXRlLkFDVElPTl9TRUVLX1RPCi0gICAgICAgICAgICB8IFBsYXliYWNrU3RhdGUuQUNUSU9OX0ZBU1RfRk9SV0FSRCB8IFBsYXliYWNrU3RhdGUuQUNUSU9OX1JFV0lORDsKLQotICAgIHByaXZhdGUgUmVtb3RlUGxheWJhY2tDbGllbnQgbUNsaWVudDsKLSAgICBwcml2YXRlIFN0cmluZyBtU2Vzc2lvbklkOwotICAgIHByaXZhdGUgU3RyaW5nIG1JdGVtSWQ7Ci0gICAgcHJpdmF0ZSBQbGF5ZXJFdmVudENhbGxiYWNrIG1DYWxsYmFjazsKLQotICAgIHByaXZhdGUgU3RhdHVzQ2FsbGJhY2sgbVN0YXR1c0NhbGxiYWNrID0gbmV3IFN0YXR1c0NhbGxiYWNrKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25JdGVtU3RhdHVzQ2hhbmdlZChCdW5kbGUgZGF0YSwKLSAgICAgICAgICAgICAgICBTdHJpbmcgc2Vzc2lvbklkLCBNZWRpYVNlc3Npb25TdGF0dXMgc2Vzc2lvblN0YXR1cywKLSAgICAgICAgICAgICAgICBTdHJpbmcgaXRlbUlkLCBNZWRpYUl0ZW1TdGF0dXMgaXRlbVN0YXR1cykgewotICAgICAgICAgICAgdXBkYXRlU2Vzc2lvblN0YXR1cyhzZXNzaW9uSWQsIHNlc3Npb25TdGF0dXMpOwotICAgICAgICAgICAgdXBkYXRlSXRlbVN0YXR1cyhpdGVtSWQsIGl0ZW1TdGF0dXMpOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHB1YmxpYyBSb3V0ZVBsYXllcihDb250ZXh0IGNvbnRleHQsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICBtQ2xpZW50ID0gbmV3IFJlbW90ZVBsYXliYWNrQ2xpZW50KGNvbnRleHQsIHJvdXRlKTsKLSAgICAgICAgbUNsaWVudC5zZXRTdGF0dXNDYWxsYmFjayhtU3RhdHVzQ2FsbGJhY2spOwotICAgICAgICBtQ2xpZW50LnN0YXJ0U2Vzc2lvbihudWxsLCBuZXcgU2Vzc2lvbkFjdGlvbkNhbGxiYWNrKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvblJlc3VsdChCdW5kbGUgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNlc3Npb25JZCwgTWVkaWFTZXNzaW9uU3RhdHVzIHNlc3Npb25TdGF0dXMpIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVTZXNzaW9uU3RhdHVzKHNlc3Npb25JZCwgc2Vzc2lvblN0YXR1cyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uUGxheSgpIHsKLSAgICAgICAgbUNsaWVudC5yZXN1bWUobnVsbCwgbmV3IFNlc3Npb25BY3Rpb25DYWxsYmFjaygpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25SZXN1bHQoQnVuZGxlIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZXNzaW9uSWQsIE1lZGlhU2Vzc2lvblN0YXR1cyBzZXNzaW9uU3RhdHVzKSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlU2Vzc2lvblN0YXR1cyhzZXNzaW9uSWQsIHNlc3Npb25TdGF0dXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblBhdXNlKCkgewotICAgICAgICBtQ2xpZW50LnBhdXNlKG51bGwsIG5ldyBTZXNzaW9uQWN0aW9uQ2FsbGJhY2soKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVzdWx0KEJ1bmRsZSBkYXRhLAotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2Vzc2lvbklkLCBNZWRpYVNlc3Npb25TdGF0dXMgc2Vzc2lvblN0YXR1cykgewotICAgICAgICAgICAgICAgIHVwZGF0ZVNlc3Npb25TdGF0dXMoc2Vzc2lvbklkLCBzZXNzaW9uU3RhdHVzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25TZWVrVG8obG9uZyBwb3MpIHsKLSAgICAgICAgbUNsaWVudC5zZWVrKG1JdGVtSWQsIHBvcywgbnVsbCwgbmV3IEl0ZW1BY3Rpb25DYWxsYmFjaygpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25SZXN1bHQoQnVuZGxlIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZXNzaW9uSWQsIE1lZGlhU2Vzc2lvblN0YXR1cyBzZXNzaW9uU3RhdHVzLAotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaXRlbUlkLCBNZWRpYUl0ZW1TdGF0dXMgaXRlbVN0YXR1cykgewotICAgICAgICAgICAgICAgIHVwZGF0ZVNlc3Npb25TdGF0dXMoc2Vzc2lvbklkLCBzZXNzaW9uU3RhdHVzKTsKLSAgICAgICAgICAgICAgICB1cGRhdGVJdGVtU3RhdHVzKGl0ZW1JZCwgaXRlbVN0YXR1cyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uU3RvcCgpIHsKLSAgICAgICAgbUNsaWVudC5zdG9wKG51bGwsIG5ldyBTZXNzaW9uQWN0aW9uQ2FsbGJhY2soKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVzdWx0KEJ1bmRsZSBkYXRhLAotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2Vzc2lvbklkLCBNZWRpYVNlc3Npb25TdGF0dXMgc2Vzc2lvblN0YXR1cykgewotICAgICAgICAgICAgICAgIHVwZGF0ZVNlc3Npb25TdGF0dXMoc2Vzc2lvbklkLCBzZXNzaW9uU3RhdHVzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGxheWVyRXZlbnRDYWxsYmFjayhQbGF5ZXJFdmVudENhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIG1DYWxsYmFjayA9IGNhbGxiYWNrOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG9wZW5WaWRlbyhEYXRhU291cmNlRGVzYyBkc2QpIHsKLSAgICAgICAgbUNsaWVudC5wbGF5KGRzZC5nZXRVcmkoKSwgInZpZGVvL21wNCIsIG51bGwsIDAsIG51bGwsIG5ldyBJdGVtQWN0aW9uQ2FsbGJhY2soKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVzdWx0KEJ1bmRsZSBkYXRhLAotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2Vzc2lvbklkLCBNZWRpYVNlc3Npb25TdGF0dXMgc2Vzc2lvblN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGl0ZW1JZCwgTWVkaWFJdGVtU3RhdHVzIGl0ZW1TdGF0dXMpIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVTZXNzaW9uU3RhdHVzKHNlc3Npb25JZCwgc2Vzc2lvblN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgdXBkYXRlSXRlbVN0YXR1cyhpdGVtSWQsIGl0ZW1TdGF0dXMpOwotICAgICAgICAgICAgICAgIHBsYXlJbnRlcm5hbChkc2QuZ2V0VXJpKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotICAgICAgICBpZiAobUNsaWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtQ2xpZW50LnJlbGVhc2UoKTsKLSAgICAgICAgICAgIG1DbGllbnQgPSBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtQ2FsbGJhY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgbUNhbGxiYWNrID0gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBwbGF5SW50ZXJuYWwoVXJpIHVyaSkgewotICAgICAgICBtQ2xpZW50LnBsYXkodXJpLCAidmlkZW8vbXA0IiwgbnVsbCwgMCwgbnVsbCwgbmV3IEl0ZW1BY3Rpb25DYWxsYmFjaygpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25SZXN1bHQoQnVuZGxlIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZXNzaW9uSWQsIE1lZGlhU2Vzc2lvblN0YXR1cyBzZXNzaW9uU3RhdHVzLAotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaXRlbUlkLCBNZWRpYUl0ZW1TdGF0dXMgaXRlbVN0YXR1cykgewotICAgICAgICAgICAgICAgIHVwZGF0ZVNlc3Npb25TdGF0dXMoc2Vzc2lvbklkLCBzZXNzaW9uU3RhdHVzKTsKLSAgICAgICAgICAgICAgICB1cGRhdGVJdGVtU3RhdHVzKGl0ZW1JZCwgaXRlbVN0YXR1cyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVTZXNzaW9uU3RhdHVzKFN0cmluZyBzZXNzaW9uSWQsIE1lZGlhU2Vzc2lvblN0YXR1cyBzZXNzaW9uU3RhdHVzKSB7Ci0gICAgICAgIG1TZXNzaW9uSWQgPSBzZXNzaW9uSWQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUl0ZW1TdGF0dXMoU3RyaW5nIGl0ZW1JZCwgTWVkaWFJdGVtU3RhdHVzIGl0ZW1TdGF0dXMpIHsKLSAgICAgICAgbUl0ZW1JZCA9IGl0ZW1JZDsKLSAgICAgICAgaWYgKGl0ZW1TdGF0dXMgPT0gbnVsbCB8fCBtQ2FsbGJhY2sgPT0gbnVsbCkgcmV0dXJuOwotICAgICAgICBtQ2FsbGJhY2sub25QbGF5ZXJTdGF0ZUNoYW5nZWQoaXRlbVN0YXR1cyk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBQbGF5ZXJFdmVudENhbGxiYWNrIHsKLSAgICAgICAgcHVibGljIHZvaWQgb25QbGF5ZXJTdGF0ZUNoYW5nZWQoTWVkaWFJdGVtU3RhdHVzIGl0ZW1TdGF0dXMpIHsgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvU2Vzc2lvblBsYXlsaXN0QWdlbnQuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvU2Vzc2lvblBsYXlsaXN0QWdlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWM1NzBhYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL1Nlc3Npb25QbGF5bGlzdEFnZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5tZWRpYTsKLQotaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5Ob25OdWxsOwotaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5OdWxsYWJsZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkRhdGFTb3VyY2VEZXNjOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFJdGVtMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTWV0YWRhdGEyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXJCYXNlOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXJCYXNlLlBsYXllckV2ZW50Q2FsbGJhY2s7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXlsaXN0QWdlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb24yLk9uRGF0YVNvdXJjZU1pc3NpbmdIZWxwZXI7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkFycmF5TWFwOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuYW5ub3RhdGlvbnMuR3VhcmRlZEJ5OwotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRMb2NhbFJhbmRvbTsKLQotcHVibGljIGNsYXNzIFNlc3Npb25QbGF5bGlzdEFnZW50IGV4dGVuZHMgTWVkaWFQbGF5bGlzdEFnZW50IHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlNlc3Npb25QbGF5bGlzdEFnZW50IjsKLSAgICBAVmlzaWJsZUZvclRlc3RpbmcKLSAgICBzdGF0aWMgZmluYWwgaW50IEVORF9PRl9QTEFZTElTVCA9IC0xOwotICAgIEBWaXNpYmxlRm9yVGVzdGluZwotICAgIHN0YXRpYyBmaW5hbCBpbnQgTk9fVkFMSURfSVRFTVMgPSAtMjsKLQotICAgIHByaXZhdGUgZmluYWwgUGxheUl0ZW0gbUVvcFBsYXlJdGVtID0gbmV3IFBsYXlJdGVtKEVORF9PRl9QTEFZTElTVCwgbnVsbCk7Ci0KLSAgICBwcml2YXRlIGZpbmFsIE9iamVjdCBtTG9jayA9IG5ldyBPYmplY3QoKTsKLSAgICBwcml2YXRlIGZpbmFsIE1lZGlhU2Vzc2lvbjJJbXBsIG1TZXNzaW9uSW1wbDsKLSAgICBwcml2YXRlIGZpbmFsIE15UGxheWVyRXZlbnRDYWxsYmFjayBtUGxheWVyQ2FsbGJhY2s7Ci0KLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBNZWRpYVBsYXllckJhc2UgbVBsYXllcjsKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBPbkRhdGFTb3VyY2VNaXNzaW5nSGVscGVyIG1Ec21IZWxwZXI7Ci0gICAgLy8gVE9ETzogQ2hlY2sgaWYgaGF2aW5nIHRoZSBzYW1lIGl0ZW0gaXMgb2theSAoYi83NDA5MDc0MSkKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBBcnJheUxpc3Q8TWVkaWFJdGVtMj4gbVBsYXlsaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgQXJyYXlMaXN0PE1lZGlhSXRlbTI+IG1TaHVmZmxlZExpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBNYXA8TWVkaWFJdGVtMiwgRGF0YVNvdXJjZURlc2M+IG1JdGVtRHNkTWFwID0gbmV3IEFycmF5TWFwPD4oKTsKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBNZWRpYU1ldGFkYXRhMiBtTWV0YWRhdGE7Ci0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgaW50IG1SZXBlYXRNb2RlOwotICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKLSAgICBwcml2YXRlIGludCBtU2h1ZmZsZU1vZGU7Ci0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgUGxheUl0ZW0gbUN1cnJlbnQ7Ci0KLSAgICAvLyBDYWxsZWQgb24gc2Vzc2lvbiBjYWxsYmFjayBleGVjdXRvci4KLSAgICBwcml2YXRlIGNsYXNzIE15UGxheWVyRXZlbnRDYWxsYmFjayBleHRlbmRzIFBsYXllckV2ZW50Q2FsbGJhY2sgewotICAgICAgICBwdWJsaWMgdm9pZCBvbkN1cnJlbnREYXRhU291cmNlQ2hhbmdlZChATm9uTnVsbCBNZWRpYVBsYXllckJhc2UgbXBiLAotICAgICAgICAgICAgICAgIEBOdWxsYWJsZSBEYXRhU291cmNlRGVzYyBkc2QpIHsKLSAgICAgICAgICAgIGlmIChtUGxheWVyICE9IG1wYikgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgICAgICBpZiAoZHNkID09IG51bGwgJiYgbUN1cnJlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtQ3VycmVudCA9IGdldE5leHRWYWxpZFBsYXlJdGVtTG9ja2VkKG1DdXJyZW50LnNodWZmbGVkSWR4LCAxKTsKLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlQ3VycmVudElmTmVlZGVkTG9ja2VkKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBjbGFzcyBQbGF5SXRlbSB7Ci0gICAgICAgIGludCBzaHVmZmxlZElkeDsKLSAgICAgICAgRGF0YVNvdXJjZURlc2MgZHNkOwotICAgICAgICBNZWRpYUl0ZW0yIG1lZGlhSXRlbTsKLQotICAgICAgICBQbGF5SXRlbShpbnQgc2h1ZmZsZWRJZHgpIHsKLSAgICAgICAgICAgIHRoaXMoc2h1ZmZsZWRJZHgsIG51bGwpOwotICAgICAgICB9Ci0KLSAgICAgICAgUGxheUl0ZW0oaW50IHNodWZmbGVkSWR4LCBEYXRhU291cmNlRGVzYyBkc2QpIHsKLSAgICAgICAgICAgIHRoaXMuc2h1ZmZsZWRJZHggPSBzaHVmZmxlZElkeDsKLSAgICAgICAgICAgIGlmIChzaHVmZmxlZElkeCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5tZWRpYUl0ZW0gPSBtU2h1ZmZsZWRMaXN0LmdldChzaHVmZmxlZElkeCk7Ci0gICAgICAgICAgICAgICAgaWYgKGRzZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZHNkID0gcmV0cmlldmVEYXRhU291cmNlRGVzY0xvY2tlZCh0aGlzLm1lZGlhSXRlbSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0aGlzLmRzZCA9IGRzZDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBib29sZWFuIGlzVmFsaWQoKSB7Ci0gICAgICAgICAgICBpZiAodGhpcyA9PSBtRW9wUGxheUl0ZW0pIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtZWRpYUl0ZW0gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChkc2QgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzaHVmZmxlZElkeCA+PSBtU2h1ZmZsZWRMaXN0LnNpemUoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtZWRpYUl0ZW0gIT0gbVNodWZmbGVkTGlzdC5nZXQoc2h1ZmZsZWRJZHgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1lZGlhSXRlbS5nZXREYXRhU291cmNlRGVzYygpICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICAgJiYgIW1lZGlhSXRlbS5nZXREYXRhU291cmNlRGVzYygpLmVxdWFscyhkc2QpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU2Vzc2lvblBsYXlsaXN0QWdlbnQoQE5vbk51bGwgTWVkaWFTZXNzaW9uMkltcGwgc2Vzc2lvbkltcGwsCi0gICAgICAgICAgICBATm9uTnVsbCBNZWRpYVBsYXllckJhc2UgcGxheWVyKSB7Ci0gICAgICAgIGlmIChzZXNzaW9uSW1wbCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzZXNzaW9uSW1wbCBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwbGF5ZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicGxheWVyIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgbVNlc3Npb25JbXBsID0gc2Vzc2lvbkltcGw7Ci0gICAgICAgIG1QbGF5ZXIgPSBwbGF5ZXI7Ci0gICAgICAgIG1QbGF5ZXJDYWxsYmFjayA9IG5ldyBNeVBsYXllckV2ZW50Q2FsbGJhY2soKTsKLSAgICAgICAgbVBsYXllci5yZWdpc3RlclBsYXllckV2ZW50Q2FsbGJhY2sobVNlc3Npb25JbXBsLmdldENhbGxiYWNrRXhlY3V0b3IoKSwgbVBsYXllckNhbGxiYWNrKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQbGF5ZXIoQE5vbk51bGwgTWVkaWFQbGF5ZXJCYXNlIHBsYXllcikgewotICAgICAgICBpZiAocGxheWVyID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInBsYXllciBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIGlmIChwbGF5ZXIgPT0gbVBsYXllcikgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1QbGF5ZXIudW5yZWdpc3RlclBsYXllckV2ZW50Q2FsbGJhY2sobVBsYXllckNhbGxiYWNrKTsKLSAgICAgICAgICAgIG1QbGF5ZXIgPSBwbGF5ZXI7Ci0gICAgICAgICAgICBtUGxheWVyLnJlZ2lzdGVyUGxheWVyRXZlbnRDYWxsYmFjaygKLSAgICAgICAgICAgICAgICAgICAgbVNlc3Npb25JbXBsLmdldENhbGxiYWNrRXhlY3V0b3IoKSwgbVBsYXllckNhbGxiYWNrKTsKLSAgICAgICAgICAgIHVwZGF0ZVBsYXllckRhdGFTb3VyY2VMb2NrZWQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE9uRGF0YVNvdXJjZU1pc3NpbmdIZWxwZXIoT25EYXRhU291cmNlTWlzc2luZ0hlbHBlciBoZWxwZXIpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgbURzbUhlbHBlciA9IGhlbHBlcjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNsZWFyT25EYXRhU291cmNlTWlzc2luZ0hlbHBlcigpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgbURzbUhlbHBlciA9IG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQE51bGxhYmxlIExpc3Q8TWVkaWFJdGVtMj4gZ2V0UGxheWxpc3QoKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KG1QbGF5bGlzdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRQbGF5bGlzdChATm9uTnVsbCBMaXN0PE1lZGlhSXRlbTI+IGxpc3QsIEBOdWxsYWJsZSBNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSkgewotICAgICAgICBpZiAobGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJsaXN0IHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLQotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBtSXRlbURzZE1hcC5jbGVhcigpOwotCi0gICAgICAgICAgICBtUGxheWxpc3QuY2xlYXIoKTsKLSAgICAgICAgICAgIG1QbGF5bGlzdC5hZGRBbGwobGlzdCk7Ci0gICAgICAgICAgICBhcHBseVNodWZmbGVNb2RlTG9ja2VkKCk7Ci0KLSAgICAgICAgICAgIG1NZXRhZGF0YSA9IG1ldGFkYXRhOwotICAgICAgICAgICAgbUN1cnJlbnQgPSBnZXROZXh0VmFsaWRQbGF5SXRlbUxvY2tlZChFTkRfT0ZfUExBWUxJU1QsIDEpOwotICAgICAgICAgICAgdXBkYXRlUGxheWVyRGF0YVNvdXJjZUxvY2tlZCgpOwotICAgICAgICB9Ci0gICAgICAgIG5vdGlmeVBsYXlsaXN0Q2hhbmdlZCgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBATnVsbGFibGUgTWVkaWFNZXRhZGF0YTIgZ2V0UGxheWxpc3RNZXRhZGF0YSgpIHsKLSAgICAgICAgcmV0dXJuIG1NZXRhZGF0YTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB1cGRhdGVQbGF5bGlzdE1ldGFkYXRhKEBOdWxsYWJsZSBNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBpZiAobWV0YWRhdGEgPT0gbU1ldGFkYXRhKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbU1ldGFkYXRhID0gbWV0YWRhdGE7Ci0gICAgICAgIH0KLSAgICAgICAgbm90aWZ5UGxheWxpc3RNZXRhZGF0YUNoYW5nZWQoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBhZGRQbGF5bGlzdEl0ZW0oaW50IGluZGV4LCBATm9uTnVsbCBNZWRpYUl0ZW0yIGl0ZW0pIHsKLSAgICAgICAgaWYgKGl0ZW0gPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaXRlbSBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIGluZGV4ID0gY2xhbXAoaW5kZXgsIG1QbGF5bGlzdC5zaXplKCkpOwotICAgICAgICAgICAgaW50IHNodWZmbGVkSWR4ID0gaW5kZXg7Ci0gICAgICAgICAgICBtUGxheWxpc3QuYWRkKGluZGV4LCBpdGVtKTsKLSAgICAgICAgICAgIGlmIChtU2h1ZmZsZU1vZGUgPT0gTWVkaWFQbGF5bGlzdEFnZW50LlNIVUZGTEVfTU9ERV9OT05FKSB7Ci0gICAgICAgICAgICAgICAgbVNodWZmbGVkTGlzdC5hZGQoaW5kZXgsIGl0ZW0pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBBZGQgdGhlIGl0ZW0gaW4gcmFuZG9tIHBvc2l0aW9uIG9mIG1TaHVmZmxlZExpc3QuCi0gICAgICAgICAgICAgICAgc2h1ZmZsZWRJZHggPSBUaHJlYWRMb2NhbFJhbmRvbS5jdXJyZW50KCkubmV4dEludChtU2h1ZmZsZWRMaXN0LnNpemUoKSArIDEpOwotICAgICAgICAgICAgICAgIG1TaHVmZmxlZExpc3QuYWRkKHNodWZmbGVkSWR4LCBpdGVtKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghaGFzVmFsaWRJdGVtKCkpIHsKLSAgICAgICAgICAgICAgICBtQ3VycmVudCA9IGdldE5leHRWYWxpZFBsYXlJdGVtTG9ja2VkKEVORF9PRl9QTEFZTElTVCwgMSk7Ci0gICAgICAgICAgICAgICAgdXBkYXRlUGxheWVyRGF0YVNvdXJjZUxvY2tlZCgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVDdXJyZW50SWZOZWVkZWRMb2NrZWQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBub3RpZnlQbGF5bGlzdENoYW5nZWQoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCByZW1vdmVQbGF5bGlzdEl0ZW0oQE5vbk51bGwgTWVkaWFJdGVtMiBpdGVtKSB7Ci0gICAgICAgIGlmIChpdGVtID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIml0ZW0gc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBpZiAoIW1QbGF5bGlzdC5yZW1vdmUoaXRlbSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtU2h1ZmZsZWRMaXN0LnJlbW92ZShpdGVtKTsKLSAgICAgICAgICAgIG1JdGVtRHNkTWFwLnJlbW92ZShpdGVtKTsKLSAgICAgICAgICAgIHVwZGF0ZUN1cnJlbnRJZk5lZWRlZExvY2tlZCgpOwotICAgICAgICB9Ci0gICAgICAgIG5vdGlmeVBsYXlsaXN0Q2hhbmdlZCgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHJlcGxhY2VQbGF5bGlzdEl0ZW0oaW50IGluZGV4LCBATm9uTnVsbCBNZWRpYUl0ZW0yIGl0ZW0pIHsKLSAgICAgICAgaWYgKGl0ZW0gPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaXRlbSBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIGlmIChtUGxheWxpc3Quc2l6ZSgpIDw9IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbmRleCA9IGNsYW1wKGluZGV4LCBtUGxheWxpc3Quc2l6ZSgpIC0gMSk7Ci0gICAgICAgICAgICBpbnQgc2h1ZmZsZWRJZHggPSBtU2h1ZmZsZWRMaXN0LmluZGV4T2YobVBsYXlsaXN0LmdldChpbmRleCkpOwotICAgICAgICAgICAgbUl0ZW1Ec2RNYXAucmVtb3ZlKG1TaHVmZmxlZExpc3QuZ2V0KHNodWZmbGVkSWR4KSk7Ci0gICAgICAgICAgICBtU2h1ZmZsZWRMaXN0LnNldChzaHVmZmxlZElkeCwgaXRlbSk7Ci0gICAgICAgICAgICBtUGxheWxpc3Quc2V0KGluZGV4LCBpdGVtKTsKLSAgICAgICAgICAgIGlmICghaGFzVmFsaWRJdGVtKCkpIHsKLSAgICAgICAgICAgICAgICBtQ3VycmVudCA9IGdldE5leHRWYWxpZFBsYXlJdGVtTG9ja2VkKEVORF9PRl9QTEFZTElTVCwgMSk7Ci0gICAgICAgICAgICAgICAgdXBkYXRlUGxheWVyRGF0YVNvdXJjZUxvY2tlZCgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVDdXJyZW50SWZOZWVkZWRMb2NrZWQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBub3RpZnlQbGF5bGlzdENoYW5nZWQoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBza2lwVG9QbGF5bGlzdEl0ZW0oQE5vbk51bGwgTWVkaWFJdGVtMiBpdGVtKSB7Ci0gICAgICAgIGlmIChpdGVtID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIml0ZW0gc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBpZiAoIWhhc1ZhbGlkSXRlbSgpIHx8IGl0ZW0uZXF1YWxzKG1DdXJyZW50Lm1lZGlhSXRlbSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnQgc2h1ZmZsZWRJZHggPSBtU2h1ZmZsZWRMaXN0LmluZGV4T2YoaXRlbSk7Ci0gICAgICAgICAgICBpZiAoc2h1ZmZsZWRJZHggPCAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUN1cnJlbnQgPSBuZXcgUGxheUl0ZW0oc2h1ZmZsZWRJZHgpOwotICAgICAgICAgICAgdXBkYXRlQ3VycmVudElmTmVlZGVkTG9ja2VkKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBza2lwVG9QcmV2aW91c0l0ZW0oKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIGlmICghaGFzVmFsaWRJdGVtKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBQbGF5SXRlbSBwcmV2ID0gZ2V0TmV4dFZhbGlkUGxheUl0ZW1Mb2NrZWQobUN1cnJlbnQuc2h1ZmZsZWRJZHgsIC0xKTsKLSAgICAgICAgICAgIGlmIChwcmV2ICE9IG1Fb3BQbGF5SXRlbSkgewotICAgICAgICAgICAgICAgIG1DdXJyZW50ID0gcHJldjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHVwZGF0ZUN1cnJlbnRJZk5lZWRlZExvY2tlZCgpOwotICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBza2lwVG9OZXh0SXRlbSgpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgaWYgKCFoYXNWYWxpZEl0ZW0oKSB8fCBtQ3VycmVudCA9PSBtRW9wUGxheUl0ZW0pIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBQbGF5SXRlbSBuZXh0ID0gZ2V0TmV4dFZhbGlkUGxheUl0ZW1Mb2NrZWQobUN1cnJlbnQuc2h1ZmZsZWRJZHgsIDEpOwotICAgICAgICAgICAgaWYgKG5leHQgIT0gbUVvcFBsYXlJdGVtKSB7Ci0gICAgICAgICAgICAgICAgbUN1cnJlbnQgPSBuZXh0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdXBkYXRlQ3VycmVudElmTmVlZGVkTG9ja2VkKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGdldFJlcGVhdE1vZGUoKSB7Ci0gICAgICAgIHJldHVybiBtUmVwZWF0TW9kZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRSZXBlYXRNb2RlKGludCByZXBlYXRNb2RlKSB7Ci0gICAgICAgIGlmIChyZXBlYXRNb2RlIDwgTWVkaWFQbGF5bGlzdEFnZW50LlJFUEVBVF9NT0RFX05PTkUKLSAgICAgICAgICAgICAgICB8fCByZXBlYXRNb2RlID4gTWVkaWFQbGF5bGlzdEFnZW50LlJFUEVBVF9NT0RFX0dST1VQKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgaWYgKG1SZXBlYXRNb2RlID09IHJlcGVhdE1vZGUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtUmVwZWF0TW9kZSA9IHJlcGVhdE1vZGU7Ci0gICAgICAgICAgICBzd2l0Y2ggKHJlcGVhdE1vZGUpIHsKLSAgICAgICAgICAgICAgICBjYXNlIE1lZGlhUGxheWxpc3RBZ2VudC5SRVBFQVRfTU9ERV9PTkU6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtQ3VycmVudCAhPSBudWxsICYmIG1DdXJyZW50ICE9IG1Fb3BQbGF5SXRlbSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbVBsYXllci5sb29wQ3VycmVudCh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIE1lZGlhUGxheWxpc3RBZ2VudC5SRVBFQVRfTU9ERV9BTEw6Ci0gICAgICAgICAgICAgICAgY2FzZSBNZWRpYVBsYXlsaXN0QWdlbnQuUkVQRUFUX01PREVfR1JPVVA6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtQ3VycmVudCA9PSBtRW9wUGxheUl0ZW0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50ID0gZ2V0TmV4dFZhbGlkUGxheUl0ZW1Mb2NrZWQoRU5EX09GX1BMQVlMSVNULCAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVBsYXllckRhdGFTb3VyY2VMb2NrZWQoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBwYXNzIHRocm91Z2gKLSAgICAgICAgICAgICAgICBjYXNlIE1lZGlhUGxheWxpc3RBZ2VudC5SRVBFQVRfTU9ERV9OT05FOgotICAgICAgICAgICAgICAgICAgICBtUGxheWVyLmxvb3BDdXJyZW50KGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbm90aWZ5UmVwZWF0TW9kZUNoYW5nZWQoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGdldFNodWZmbGVNb2RlKCkgewotICAgICAgICByZXR1cm4gbVNodWZmbGVNb2RlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFNodWZmbGVNb2RlKGludCBzaHVmZmxlTW9kZSkgewotICAgICAgICBpZiAoc2h1ZmZsZU1vZGUgPCBNZWRpYVBsYXlsaXN0QWdlbnQuU0hVRkZMRV9NT0RFX05PTkUKLSAgICAgICAgICAgICAgICB8fCBzaHVmZmxlTW9kZSA+IE1lZGlhUGxheWxpc3RBZ2VudC5TSFVGRkxFX01PREVfR1JPVVApIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBpZiAobVNodWZmbGVNb2RlID09IHNodWZmbGVNb2RlKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVNodWZmbGVNb2RlID0gc2h1ZmZsZU1vZGU7Ci0gICAgICAgICAgICBhcHBseVNodWZmbGVNb2RlTG9ja2VkKCk7Ci0gICAgICAgICAgICB1cGRhdGVDdXJyZW50SWZOZWVkZWRMb2NrZWQoKTsKLSAgICAgICAgfQotICAgICAgICBub3RpZnlTaHVmZmxlTW9kZUNoYW5nZWQoKTsKLSAgICB9Ci0KLSAgICBAVmlzaWJsZUZvclRlc3RpbmcKLSAgICBpbnQgZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpIHsKLSAgICAgICAgcmV0dXJuIGhhc1ZhbGlkSXRlbSgpID8gbUN1cnJlbnQuc2h1ZmZsZWRJZHggOiBOT19WQUxJRF9JVEVNUzsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaGFzVmFsaWRJdGVtKCkgewotICAgICAgICByZXR1cm4gbUN1cnJlbnQgIT0gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIERhdGFTb3VyY2VEZXNjIHJldHJpZXZlRGF0YVNvdXJjZURlc2NMb2NrZWQoTWVkaWFJdGVtMiBpdGVtKSB7Ci0gICAgICAgIERhdGFTb3VyY2VEZXNjIGRzZCA9IGl0ZW0uZ2V0RGF0YVNvdXJjZURlc2MoKTsKLSAgICAgICAgaWYgKGRzZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtSXRlbURzZE1hcC5wdXQoaXRlbSwgZHNkKTsKLSAgICAgICAgICAgIHJldHVybiBkc2Q7Ci0gICAgICAgIH0KLSAgICAgICAgZHNkID0gbUl0ZW1Ec2RNYXAuZ2V0KGl0ZW0pOwotICAgICAgICBpZiAoZHNkICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBkc2Q7Ci0gICAgICAgIH0KLSAgICAgICAgT25EYXRhU291cmNlTWlzc2luZ0hlbHBlciBoZWxwZXIgPSBtRHNtSGVscGVyOwotICAgICAgICBpZiAoaGVscGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIFRPRE86IERvIG5vdCBjYWxsIG9uRGF0YVNvdXJjZU1pc3Npbmcgd2l0aCB0aGUgbG9jayAoYi83NDA5MDc0MSkuCi0gICAgICAgICAgICBkc2QgPSBoZWxwZXIub25EYXRhU291cmNlTWlzc2luZyhtU2Vzc2lvbkltcGwuZ2V0SW5zdGFuY2UoKSwgaXRlbSk7Ci0gICAgICAgICAgICBpZiAoZHNkICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtSXRlbURzZE1hcC5wdXQoaXRlbSwgZHNkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZHNkOwotICAgIH0KLQotICAgIC8vIFRPRE86IGNvbnNpZGVyIHRvIGNhbGwgdXBkYXRlQ3VycmVudElmTmVlZGVkTG9ja2VkIGluc2lkZSAoYi83NDA5MDc0MSkKLSAgICBwcml2YXRlIFBsYXlJdGVtIGdldE5leHRWYWxpZFBsYXlJdGVtTG9ja2VkKGludCBjdXJTaHVmZmxlZElkeCwgaW50IGRpcmVjdGlvbikgewotICAgICAgICBpbnQgc2l6ZSA9IG1QbGF5bGlzdC5zaXplKCk7Ci0gICAgICAgIGlmIChjdXJTaHVmZmxlZElkeCA9PSBFTkRfT0ZfUExBWUxJU1QpIHsKLSAgICAgICAgICAgIGN1clNodWZmbGVkSWR4ID0gKGRpcmVjdGlvbiA+IDApID8gLTEgOiBzaXplOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICBjdXJTaHVmZmxlZElkeCArPSBkaXJlY3Rpb247Ci0gICAgICAgICAgICBpZiAoY3VyU2h1ZmZsZWRJZHggPCAwIHx8IGN1clNodWZmbGVkSWR4ID49IG1QbGF5bGlzdC5zaXplKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAobVJlcGVhdE1vZGUgPT0gUkVQRUFUX01PREVfTk9ORSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGkgPT0gc2l6ZSAtIDEpID8gbnVsbCA6IG1Fb3BQbGF5SXRlbTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBjdXJTaHVmZmxlZElkeCA9IGN1clNodWZmbGVkSWR4IDwgMCA/IG1QbGF5bGlzdC5zaXplKCkgLSAxIDogMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBEYXRhU291cmNlRGVzYyBkc2QgPSByZXRyaWV2ZURhdGFTb3VyY2VEZXNjTG9ja2VkKG1TaHVmZmxlZExpc3QuZ2V0KGN1clNodWZmbGVkSWR4KSk7Ci0gICAgICAgICAgICBpZiAoZHNkICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFBsYXlJdGVtKGN1clNodWZmbGVkSWR4LCBkc2QpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVDdXJyZW50SWZOZWVkZWRMb2NrZWQoKSB7Ci0gICAgICAgIGlmICghaGFzVmFsaWRJdGVtKCkgfHwgbUN1cnJlbnQuaXNWYWxpZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaW50IHNodWZmbGVkSWR4ID0gbVNodWZmbGVkTGlzdC5pbmRleE9mKG1DdXJyZW50Lm1lZGlhSXRlbSk7Ci0gICAgICAgIGlmIChzaHVmZmxlZElkeCA+PSAwKSB7Ci0gICAgICAgICAgICAvLyBBZGRlZCBhbiBpdGVtLgotICAgICAgICAgICAgbUN1cnJlbnQuc2h1ZmZsZWRJZHggPSBzaHVmZmxlZElkeDsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtQ3VycmVudC5zaHVmZmxlZElkeCA+PSBtU2h1ZmZsZWRMaXN0LnNpemUoKSkgewotICAgICAgICAgICAgbUN1cnJlbnQgPSBnZXROZXh0VmFsaWRQbGF5SXRlbUxvY2tlZChtU2h1ZmZsZWRMaXN0LnNpemUoKSAtIDEsIDEpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUN1cnJlbnQubWVkaWFJdGVtID0gbVNodWZmbGVkTGlzdC5nZXQobUN1cnJlbnQuc2h1ZmZsZWRJZHgpOwotICAgICAgICAgICAgaWYgKHJldHJpZXZlRGF0YVNvdXJjZURlc2NMb2NrZWQobUN1cnJlbnQubWVkaWFJdGVtKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUN1cnJlbnQgPSBnZXROZXh0VmFsaWRQbGF5SXRlbUxvY2tlZChtQ3VycmVudC5zaHVmZmxlZElkeCwgMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgdXBkYXRlUGxheWVyRGF0YVNvdXJjZUxvY2tlZCgpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVBsYXllckRhdGFTb3VyY2VMb2NrZWQoKSB7Ci0gICAgICAgIGlmIChtQ3VycmVudCA9PSBudWxsIHx8IG1DdXJyZW50ID09IG1Fb3BQbGF5SXRlbSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtUGxheWVyLmdldEN1cnJlbnREYXRhU291cmNlKCkgIT0gbUN1cnJlbnQuZHNkKSB7Ci0gICAgICAgICAgICBtUGxheWVyLnNldERhdGFTb3VyY2UobUN1cnJlbnQuZHNkKTsKLSAgICAgICAgICAgIG1QbGF5ZXIubG9vcEN1cnJlbnQobVJlcGVhdE1vZGUgPT0gTWVkaWFQbGF5bGlzdEFnZW50LlJFUEVBVF9NT0RFX09ORSk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gVE9ETzogQ2FsbCBzZXROZXh0RGF0YVNvdXJjZSAoYi83NDA5MDc0MSkKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYXBwbHlTaHVmZmxlTW9kZUxvY2tlZCgpIHsKLSAgICAgICAgbVNodWZmbGVkTGlzdC5jbGVhcigpOwotICAgICAgICBtU2h1ZmZsZWRMaXN0LmFkZEFsbChtUGxheWxpc3QpOwotICAgICAgICBpZiAobVNodWZmbGVNb2RlID09IE1lZGlhUGxheWxpc3RBZ2VudC5TSFVGRkxFX01PREVfQUxMCi0gICAgICAgICAgICAgICAgfHwgbVNodWZmbGVNb2RlID09IE1lZGlhUGxheWxpc3RBZ2VudC5TSFVGRkxFX01PREVfR1JPVVApIHsKLSAgICAgICAgICAgIENvbGxlY3Rpb25zLnNodWZmbGUobVNodWZmbGVkTGlzdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBDbGFtcHMgdmFsdWUgdG8gWzAsIHNpemVdCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IGNsYW1wKGludCB2YWx1ZSwgaW50IHNpemUpIHsKLSAgICAgICAgaWYgKHZhbHVlIDwgMCkgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuICh2YWx1ZSA+IHNpemUpID8gc2l6ZSA6IHZhbHVlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvU2Vzc2lvblRva2VuMkltcGwuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvU2Vzc2lvblRva2VuMkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTVjZjhjNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL1Nlc3Npb25Ub2tlbjJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5tZWRpYTsKLQotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlNlc3Npb25Ub2tlbjIuVFlQRV9TRVNTSU9OOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlNlc3Npb25Ub2tlbjIuVFlQRV9TRVNTSU9OX1NFUlZJQ0U7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuU2Vzc2lvblRva2VuMi5UWVBFX0xJQlJBUllfU0VSVklDRTsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlci5OYW1lTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlJlc29sdmVJbmZvOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFMaWJyYXJ5U2VydmljZTI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb25TZXJ2aWNlMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlNlc3Npb25Ub2tlbjI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5TZXNzaW9uVG9rZW4yLlRva2VuVHlwZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5TZXNzaW9uVG9rZW4yUHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOwotaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotcHVibGljIGNsYXNzIFNlc3Npb25Ub2tlbjJJbXBsIGltcGxlbWVudHMgU2Vzc2lvblRva2VuMlByb3ZpZGVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1VJRCA9ICJhbmRyb2lkLm1lZGlhLnRva2VuLnVpZCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9UWVBFID0gImFuZHJvaWQubWVkaWEudG9rZW4udHlwZSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9QQUNLQUdFX05BTUUgPSAiYW5kcm9pZC5tZWRpYS50b2tlbi5wYWNrYWdlX25hbWUiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfU0VSVklDRV9OQU1FID0gImFuZHJvaWQubWVkaWEudG9rZW4uc2VydmljZV9uYW1lIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0lEID0gImFuZHJvaWQubWVkaWEudG9rZW4uaWQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfU0VTU0lPTl9CSU5ERVIgPSAiYW5kcm9pZC5tZWRpYS50b2tlbi5zZXNzaW9uX2JpbmRlciI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIFNlc3Npb25Ub2tlbjIgbUluc3RhbmNlOwotICAgIHByaXZhdGUgZmluYWwgaW50IG1VaWQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBAVG9rZW5UeXBlIGludCBtVHlwZTsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtUGFja2FnZU5hbWU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbVNlcnZpY2VOYW1lOwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1JZDsKLSAgICBwcml2YXRlIGZpbmFsIElNZWRpYVNlc3Npb24yIG1TZXNzaW9uQmluZGVyOwotCi0gICAgLyoqCi0gICAgICogUHVibGljIGNvbnN0cnVjdG9yIGZvciB0aGUgbGVnYWN5IHN1cHBvcnQgKGkuZS4gYnJvd3NlciBjYW4gdHJ5IGNvbm5lY3RpbmcgdG8gYW55IGJyb3dzZXIKLSAgICAgKiBzZXJ2aWNlIGlmIGl0IGtub3dzIHRoZSBzZXJ2aWNlIG5hbWUpCi0gICAgICovCi0gICAgcHVibGljIFNlc3Npb25Ub2tlbjJJbXBsKENvbnRleHQgY29udGV4dCwgU2Vzc2lvblRva2VuMiBpbnN0YW5jZSwKLSAgICAgICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIHNlcnZpY2VOYW1lLCBpbnQgdWlkKSB7Ci0gICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShwYWNrYWdlTmFtZSkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInBhY2thZ2VOYW1lIHNob3VsZG4ndCBiZSBlbXB0eSIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShzZXJ2aWNlTmFtZSkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInNlcnZpY2VOYW1lIHNob3VsZG4ndCBiZSBlbXB0eSIpOwotICAgICAgICB9Ci0gICAgICAgIG1JbnN0YW5jZSA9IGluc3RhbmNlOwotICAgICAgICAvLyBDYWxjdWxhdGUgdWlkIGlmIGl0J3Mgbm90IHNwZWNpZmllZC4KLSAgICAgICAgZmluYWwgUGFja2FnZU1hbmFnZXIgbWFuYWdlciA9IGNvbnRleHQuZ2V0UGFja2FnZU1hbmFnZXIoKTsKLSAgICAgICAgaWYgKHVpZCA8IDApIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgdWlkID0gbWFuYWdlci5nZXRQYWNrYWdlVWlkKHBhY2thZ2VOYW1lLCAwKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKE5hbWVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2Fubm90IGZpbmQgcGFja2FnZSAiICsgcGFja2FnZU5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG1VaWQgPSB1aWQ7Ci0KLSAgICAgICAgLy8gSW5mZXIgaWQgYW5kIHR5cGUgZnJvbSBwYWNrYWdlIG5hbWUgYW5kIHNlcnZpY2UgbmFtZQotICAgICAgICAvLyBUT0RPKGphZXdhbik6IEhhbmRsZSBtdWx0aS11c2VyLgotICAgICAgICBTdHJpbmcgaWQgPSBnZXRTZXNzaW9uSWRGcm9tU2VydmljZShtYW5hZ2VyLCBNZWRpYUxpYnJhcnlTZXJ2aWNlMi5TRVJWSUNFX0lOVEVSRkFDRSwKLSAgICAgICAgICAgICAgICBwYWNrYWdlTmFtZSwgc2VydmljZU5hbWUpOwotICAgICAgICBpZiAoaWQgIT0gbnVsbCkgewotICAgICAgICAgICAgbUlkID0gaWQ7Ci0gICAgICAgICAgICBtVHlwZSA9IFRZUEVfTElCUkFSWV9TRVJWSUNFOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gcmV0cnkgd2l0aCBzZXNzaW9uIHNlcnZpY2UKLSAgICAgICAgICAgIG1JZCA9IGdldFNlc3Npb25JZEZyb21TZXJ2aWNlKG1hbmFnZXIsIE1lZGlhU2Vzc2lvblNlcnZpY2UyLlNFUlZJQ0VfSU5URVJGQUNFLAotICAgICAgICAgICAgICAgICAgICBwYWNrYWdlTmFtZSwgc2VydmljZU5hbWUpOwotICAgICAgICAgICAgbVR5cGUgPSBUWVBFX1NFU1NJT05fU0VSVklDRTsKLSAgICAgICAgfQotICAgICAgICBpZiAobUlkID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInNlcnZpY2UgIiArIHNlcnZpY2VOYW1lICsgIiBkb2Vzbid0IGltcGxlbWVudCIKLSAgICAgICAgICAgICAgICAgICAgKyAiIHNlc3Npb24gc2VydmljZSBub3IgbGlicmFyeSBzZXJ2aWNlLiBVc2Ugc2VydmljZSdzIGZ1bGwgbmFtZS4iKTsKLSAgICAgICAgfQotICAgICAgICBtUGFja2FnZU5hbWUgPSBwYWNrYWdlTmFtZTsKLSAgICAgICAgbVNlcnZpY2VOYW1lID0gc2VydmljZU5hbWU7Ci0gICAgICAgIG1TZXNzaW9uQmluZGVyID0gbnVsbDsKLSAgICB9Ci0KLSAgICBTZXNzaW9uVG9rZW4ySW1wbChpbnQgdWlkLCBpbnQgdHlwZSwgU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgc2VydmljZU5hbWUsIFN0cmluZyBpZCwKLSAgICAgICAgICAgIElNZWRpYVNlc3Npb24yIHNlc3Npb25CaW5kZXIpIHsKLSAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBBZGQgc2FuaXR5IGNoZWNrIChiLzczODYzODY1KQotICAgICAgICBtVWlkID0gdWlkOwotICAgICAgICBtVHlwZSA9IHR5cGU7Ci0gICAgICAgIG1QYWNrYWdlTmFtZSA9IHBhY2thZ2VOYW1lOwotICAgICAgICBtU2VydmljZU5hbWUgPSBzZXJ2aWNlTmFtZTsKLSAgICAgICAgbUlkID0gaWQ7Ci0gICAgICAgIG1TZXNzaW9uQmluZGVyID0gc2Vzc2lvbkJpbmRlcjsKLSAgICAgICAgbUluc3RhbmNlID0gbmV3IFNlc3Npb25Ub2tlbjIodGhpcyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFNlc3Npb25JZEZyb21TZXJ2aWNlKFBhY2thZ2VNYW5hZ2VyIG1hbmFnZXIsIFN0cmluZyBzZXJ2aWNlSW50ZXJmYWNlLAotICAgICAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgc2VydmljZU5hbWUpIHsKLSAgICAgICAgSW50ZW50IHNlcnZpY2VJbnRlbnQgPSBuZXcgSW50ZW50KHNlcnZpY2VJbnRlcmZhY2UpOwotICAgICAgICBzZXJ2aWNlSW50ZW50LnNldFBhY2thZ2UocGFja2FnZU5hbWUpOwotICAgICAgICAvLyBVc2UgcXVlcnlJbnRlbnRTZXJ2aWNlcyB0byBmaW5kIHNlcnZpY2VzIHdpdGggTWVkaWFMaWJyYXJ5U2VydmljZTIuU0VSVklDRV9JTlRFUkZBQ0UuCi0gICAgICAgIC8vIFdlIGNhbm5vdCB1c2UgcmVzb2x2ZVNlcnZpY2Ugd2l0aCBpbnRlbnQgc3BlY2lmaWVkIGNsYXNzIG5hbWUsIGJlY2F1c2UgcmVzb2x2ZVNlcnZpY2UKLSAgICAgICAgLy8gaWdub3JlcyBhY3Rpb25zIGlmIEludGVudC5zZXRDbGFzc05hbWUoKSBpcyBzcGVjaWZpZWQuCi0gICAgICAgIExpc3Q8UmVzb2x2ZUluZm8+IGxpc3QgPSBtYW5hZ2VyLnF1ZXJ5SW50ZW50U2VydmljZXMoCi0gICAgICAgICAgICAgICAgc2VydmljZUludGVudCwgUGFja2FnZU1hbmFnZXIuR0VUX01FVEFfREFUQSk7Ci0gICAgICAgIGlmIChsaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIFJlc29sdmVJbmZvIHJlc29sdmVJbmZvID0gbGlzdC5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc29sdmVJbmZvID09IG51bGwgfHwgcmVzb2x2ZUluZm8uc2VydmljZUluZm8gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKFRleHRVdGlscy5lcXVhbHMocmVzb2x2ZUluZm8uc2VydmljZUluZm8ubmFtZSwgc2VydmljZU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRTZXNzaW9uSWQocmVzb2x2ZUluZm8pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTZXNzaW9uSWQoUmVzb2x2ZUluZm8gcmVzb2x2ZUluZm8pIHsKLSAgICAgICAgaWYgKHJlc29sdmVJbmZvID09IG51bGwgfHwgcmVzb2x2ZUluZm8uc2VydmljZUluZm8gPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0gZWxzZSBpZiAocmVzb2x2ZUluZm8uc2VydmljZUluZm8ubWV0YURhdGEgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuICIiOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVJbmZvLnNlcnZpY2VJbmZvLm1ldGFEYXRhLmdldFN0cmluZygKLSAgICAgICAgICAgICAgICAgICAgTWVkaWFTZXNzaW9uU2VydmljZTIuU0VSVklDRV9NRVRBX0RBVEEsICIiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTZXNzaW9uVG9rZW4yIGdldEluc3RhbmNlKCkgewotICAgICAgICByZXR1cm4gbUluc3RhbmNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFja2FnZU5hbWVfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG1QYWNrYWdlTmFtZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGdldFVpZF9pbXBsKCkgewotICAgICAgICByZXR1cm4gbVVpZDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldElkX2ltcCgpIHsKLSAgICAgICAgcmV0dXJuIG1JZDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGdldFR5cGVfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG1UeXBlOwotICAgIH0KLQotICAgIFN0cmluZyBnZXRTZXJ2aWNlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG1TZXJ2aWNlTmFtZTsKLSAgICB9Ci0KLSAgICBJTWVkaWFTZXNzaW9uMiBnZXRTZXNzaW9uQmluZGVyKCkgewotICAgICAgICByZXR1cm4gbVNlc3Npb25CaW5kZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTZXNzaW9uVG9rZW4yIGZyb21CdW5kbGVfaW1wbChCdW5kbGUgYnVuZGxlKSB7Ci0gICAgICAgIGlmIChidW5kbGUgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgaW50IHVpZCA9IGJ1bmRsZS5nZXRJbnQoS0VZX1VJRCk7Ci0gICAgICAgIGZpbmFsIEBUb2tlblR5cGUgaW50IHR5cGUgPSBidW5kbGUuZ2V0SW50KEtFWV9UWVBFLCAtMSk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBwYWNrYWdlTmFtZSA9IGJ1bmRsZS5nZXRTdHJpbmcoS0VZX1BBQ0tBR0VfTkFNRSk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBzZXJ2aWNlTmFtZSA9IGJ1bmRsZS5nZXRTdHJpbmcoS0VZX1NFUlZJQ0VfTkFNRSk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBpZCA9IGJ1bmRsZS5nZXRTdHJpbmcoS0VZX0lEKTsKLSAgICAgICAgZmluYWwgSUJpbmRlciBzZXNzaW9uQmluZGVyID0gYnVuZGxlLmdldEJpbmRlcihLRVlfU0VTU0lPTl9CSU5ERVIpOwotCi0gICAgICAgIC8vIFNhbml0eSBjaGVjay4KLSAgICAgICAgc3dpdGNoICh0eXBlKSB7Ci0gICAgICAgICAgICBjYXNlIFRZUEVfU0VTU0lPTjoKLSAgICAgICAgICAgICAgICBpZiAoc2Vzc2lvbkJpbmRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVuZXhwZWN0ZWQgc2Vzc2lvbkJpbmRlciBmb3Igc2Vzc2lvbiwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGJpbmRlcj0iICsgc2Vzc2lvbkJpbmRlcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBUWVBFX1NFU1NJT05fU0VSVklDRToKLSAgICAgICAgICAgIGNhc2UgVFlQRV9MSUJSQVJZX1NFUlZJQ0U6Ci0gICAgICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHNlcnZpY2VOYW1lKSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTZXNzaW9uIHNlcnZpY2UgbmVlZHMgc2VydmljZSBuYW1lIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIHR5cGUiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkocGFja2FnZU5hbWUpIHx8IGlkID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlBhY2thZ2UgbmFtZSBub3IgSUQgY2Fubm90IGJlIG51bGwuIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBTZXNzaW9uVG9rZW4ySW1wbCh1aWQsIHR5cGUsIHBhY2thZ2VOYW1lLCBzZXJ2aWNlTmFtZSwgaWQsCi0gICAgICAgICAgICAgICAgc2Vzc2lvbkJpbmRlciAhPSBudWxsID8gSU1lZGlhU2Vzc2lvbjIuU3R1Yi5hc0ludGVyZmFjZShzZXNzaW9uQmluZGVyKSA6IG51bGwpCi0gICAgICAgICAgICAgICAgLmdldEluc3RhbmNlKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEJ1bmRsZSB0b0J1bmRsZV9pbXBsKCkgewotICAgICAgICBCdW5kbGUgYnVuZGxlID0gbmV3IEJ1bmRsZSgpOwotICAgICAgICBidW5kbGUucHV0SW50KEtFWV9VSUQsIG1VaWQpOwotICAgICAgICBidW5kbGUucHV0U3RyaW5nKEtFWV9QQUNLQUdFX05BTUUsIG1QYWNrYWdlTmFtZSk7Ci0gICAgICAgIGJ1bmRsZS5wdXRTdHJpbmcoS0VZX1NFUlZJQ0VfTkFNRSwgbVNlcnZpY2VOYW1lKTsKLSAgICAgICAgYnVuZGxlLnB1dFN0cmluZyhLRVlfSUQsIG1JZCk7Ci0gICAgICAgIGJ1bmRsZS5wdXRJbnQoS0VZX1RZUEUsIG1UeXBlKTsKLSAgICAgICAgYnVuZGxlLnB1dEJpbmRlcihLRVlfU0VTU0lPTl9CSU5ERVIsCi0gICAgICAgICAgICAgICAgbVNlc3Npb25CaW5kZXIgIT0gbnVsbCA/IG1TZXNzaW9uQmluZGVyLmFzQmluZGVyKCkgOiBudWxsKTsKLSAgICAgICAgcmV0dXJuIGJ1bmRsZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlX2ltcGwoKSB7Ci0gICAgICAgIGZpbmFsIGludCBwcmltZSA9IDMxOwotICAgICAgICByZXR1cm4gbVR5cGUKLSAgICAgICAgICAgICAgICArIHByaW1lICogKG1VaWQKLSAgICAgICAgICAgICAgICArIHByaW1lICogKG1QYWNrYWdlTmFtZS5oYXNoQ29kZSgpCi0gICAgICAgICAgICAgICAgKyBwcmltZSAqIChtSWQuaGFzaENvZGUoKQotICAgICAgICAgICAgICAgICsgcHJpbWUgKiAobVNlcnZpY2VOYW1lICE9IG51bGwgPyBtU2VydmljZU5hbWUuaGFzaENvZGUoKSA6IDApKSkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFsc19pbXBsKE9iamVjdCBvYmopIHsKLSAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgU2Vzc2lvblRva2VuMikpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBTZXNzaW9uVG9rZW4ySW1wbCBvdGhlciA9IGZyb20oKFNlc3Npb25Ub2tlbjIpIG9iaik7Ci0gICAgICAgIHJldHVybiBtVWlkID09IG90aGVyLm1VaWQKLSAgICAgICAgICAgICAgICAmJiBUZXh0VXRpbHMuZXF1YWxzKG1QYWNrYWdlTmFtZSwgb3RoZXIubVBhY2thZ2VOYW1lKQotICAgICAgICAgICAgICAgICYmIFRleHRVdGlscy5lcXVhbHMobVNlcnZpY2VOYW1lLCBvdGhlci5tU2VydmljZU5hbWUpCi0gICAgICAgICAgICAgICAgJiYgVGV4dFV0aWxzLmVxdWFscyhtSWQsIG90aGVyLm1JZCkKLSAgICAgICAgICAgICAgICAmJiBtVHlwZSA9PSBvdGhlci5tVHlwZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiAiU2Vzc2lvblRva2VuIHtwa2c9IiArIG1QYWNrYWdlTmFtZSArICIgaWQ9IiArIG1JZCArICIgdHlwZT0iICsgbVR5cGUKLSAgICAgICAgICAgICAgICArICIgc2VydmljZT0iICsgbVNlcnZpY2VOYW1lICsgIiBiaW5kZXI9IiArIG1TZXNzaW9uQmluZGVyICsgIn0iOwotICAgIH0KLQotICAgIHN0YXRpYyBTZXNzaW9uVG9rZW4ySW1wbCBmcm9tKFNlc3Npb25Ub2tlbjIgdG9rZW4pIHsKLSAgICAgICAgcmV0dXJuICgoU2Vzc2lvblRva2VuMkltcGwpIHRva2VuLmdldFByb3ZpZGVyKCkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvVm9sdW1lUHJvdmlkZXIySW1wbC5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9Wb2x1bWVQcm92aWRlcjJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmMjJlMWIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9Wb2x1bWVQcm92aWRlcjJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBjb20uYW5kcm9pZC5tZWRpYTsKLQotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlZvbHVtZVByb3ZpZGVyMi5WT0xVTUVfQ09OVFJPTF9BQlNPTFVURTsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5Wb2x1bWVQcm92aWRlcjIuVk9MVU1FX0NPTlRST0xfRklYRUQ7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuVm9sdW1lUHJvdmlkZXIyLlZPTFVNRV9DT05UUk9MX1JFTEFUSVZFOwotCi1pbXBvcnQgYW5kcm9pZC5tZWRpYS5Wb2x1bWVQcm92aWRlcjI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuVm9sdW1lUHJvdmlkZXIyUHJvdmlkZXI7Ci0KLXB1YmxpYyBjbGFzcyBWb2x1bWVQcm92aWRlcjJJbXBsIGltcGxlbWVudHMgVm9sdW1lUHJvdmlkZXIyUHJvdmlkZXIgewotICAgIHByaXZhdGUgZmluYWwgVm9sdW1lUHJvdmlkZXIyIG1JbnN0YW5jZTsKLSAgICBwcml2YXRlIGZpbmFsIGludCBtQ29udHJvbFR5cGU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgbU1heFZvbHVtZTsKLQotICAgIHByaXZhdGUgaW50IG1DdXJyZW50Vm9sdW1lOwotICAgIHByaXZhdGUgQ2FsbGJhY2sgbUNhbGxiYWNrOwotCi0gICAgcHVibGljIFZvbHVtZVByb3ZpZGVyMkltcGwoVm9sdW1lUHJvdmlkZXIyIGluc3RhbmNlLAotICAgICAgICAgICAgQFZvbHVtZVByb3ZpZGVyMi5Db250cm9sVHlwZSBpbnQgY29udHJvbFR5cGUsIGludCBtYXhWb2x1bWUsIGludCBjdXJyZW50Vm9sdW1lKSB7Ci0gICAgICAgIGlmIChjb250cm9sVHlwZSAhPSBWT0xVTUVfQ09OVFJPTF9GSVhFRCAmJiBjb250cm9sVHlwZSAhPSBWT0xVTUVfQ09OVFJPTF9SRUxBVElWRQotICAgICAgICAgICAgICAgICYmIGNvbnRyb2xUeXBlICE9IFZPTFVNRV9DT05UUk9MX0FCU09MVVRFKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ3cm9uZyBjb250cm9sVHlwZSAiICsgY29udHJvbFR5cGUpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtYXhWb2x1bWUgPCAwIHx8IGN1cnJlbnRWb2x1bWUgPCAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ2b2x1bWUgc2hvdWxkbid0IGJlIG5lZ2F0aXZlIgotICAgICAgICAgICAgICAgICAgICArICIsIG1heFZvbHVtZT0iICsgbWF4Vm9sdW1lICsgIiwgY3VycmVudFZvbHVtZT0iICsgY3VycmVudFZvbHVtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGN1cnJlbnRWb2x1bWUgPiBtYXhWb2x1bWUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImN1cnJlbnRWb2x1bWUgc2hvdWxkbid0IGJlIGdyZWF0ZXIgdGhhbiBtYXhWb2x1bWUiCi0gICAgICAgICAgICAgICAgICAgICsgIiwgbWF4Vm9sdW1lPSIgKyBtYXhWb2x1bWUgKyAiLCBjdXJyZW50Vm9sdW1lPSIgKyBjdXJyZW50Vm9sdW1lKTsKLSAgICAgICAgfQotICAgICAgICBtSW5zdGFuY2UgPSBpbnN0YW5jZTsKLSAgICAgICAgbUNvbnRyb2xUeXBlID0gY29udHJvbFR5cGU7Ci0gICAgICAgIG1NYXhWb2x1bWUgPSBtYXhWb2x1bWU7Ci0gICAgICAgIG1DdXJyZW50Vm9sdW1lID0gY3VycmVudFZvbHVtZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGdldENvbnRyb2xUeXBlX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtQ29udHJvbFR5cGU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBnZXRNYXhWb2x1bWVfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG1NYXhWb2x1bWU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBnZXRDdXJyZW50Vm9sdW1lX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtQ3VycmVudFZvbHVtZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRDdXJyZW50Vm9sdW1lX2ltcGwoaW50IGN1cnJlbnRWb2x1bWUpIHsKLSAgICAgICAgaWYgKGN1cnJlbnRWb2x1bWUgPCAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjdXJyZW50Vm9sdW1lIHNob3VsZG4ndCBiZSBuZWdhdGl2ZSIKLSAgICAgICAgICAgICAgICAgICAgKyAiLCBjdXJyZW50Vm9sdW1lPSIgKyBjdXJyZW50Vm9sdW1lKTsKLSAgICAgICAgfQotICAgICAgICBtQ3VycmVudFZvbHVtZSA9IGN1cnJlbnRWb2x1bWU7Ci0gICAgICAgIGlmIChtQ2FsbGJhY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgbUNhbGxiYWNrLm9uVm9sdW1lQ2hhbmdlZChtSW5zdGFuY2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyBhIGNhbGxiYWNrIHRvIHJlY2VpdmUgdm9sdW1lIGNoYW5nZXMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q2FsbGJhY2soQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgbUNhbGxiYWNrID0gY2FsbGJhY2s7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTGlzdGVucyBmb3IgY2hhbmdlcyB0byB0aGUgdm9sdW1lLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgQ2FsbGJhY2sgewotICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBvblZvbHVtZUNoYW5nZWQoVm9sdW1lUHJvdmlkZXIyIHZvbHVtZVByb3ZpZGVyKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL3N1YnRpdGxlL0Nsb3NlZENhcHRpb25SZW5kZXJlci5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9zdWJ0aXRsZS9DbG9zZWRDYXB0aW9uUmVuZGVyZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmY3ZWVjOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL3N1YnRpdGxlL0Nsb3NlZENhcHRpb25SZW5kZXJlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUwMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLm1lZGlhLnN1YnRpdGxlOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlR5cGVmYWNlOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFGb3JtYXQ7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LlNwYW5uYWJsZTsKLWltcG9ydCBhbmRyb2lkLnRleHQuU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcjsKLWltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFBhaW50OwotaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5DaGFyYWN0ZXJTdHlsZTsKLWltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuU3R5bGVTcGFuOwotaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5VbmRlcmxpbmVTcGFuOwotaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5VcGRhdGVBcHBlYXJhbmNlOwotaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBhbmRyb2lkLnV0aWwuVHlwZWRWYWx1ZTsKLWltcG9ydCBhbmRyb2lkLnZpZXcuR3Jhdml0eTsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwotaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkNhcHRpb25pbmdNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkNhcHRpb25pbmdNYW5hZ2VyLkNhcHRpb25TdHlsZTsKLWltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5DYXB0aW9uaW5nTWFuYWdlci5DYXB0aW9uaW5nQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuTGluZWFyTGF5b3V0OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLS8vIE5vdGU6IFRoaXMgaXMgZm9ya2VkIGZyb20gYW5kcm9pZC5tZWRpYS5DbG9zZWRDYXB0aW9uUmVuZGVyZXIgc2luY2UgUAotcHVibGljIGNsYXNzIENsb3NlZENhcHRpb25SZW5kZXJlciBleHRlbmRzIFN1YnRpdGxlQ29udHJvbGxlci5SZW5kZXJlciB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBDb250ZXh0IG1Db250ZXh0OwotICAgIHByaXZhdGUgQ2VhNjA4Q0NXaWRnZXQgbUNDV2lkZ2V0OwotCi0gICAgcHVibGljIENsb3NlZENhcHRpb25SZW5kZXJlcihDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzKE1lZGlhRm9ybWF0IGZvcm1hdCkgewotICAgICAgICBpZiAoZm9ybWF0LmNvbnRhaW5zS2V5KE1lZGlhRm9ybWF0LktFWV9NSU1FKSkgewotICAgICAgICAgICAgU3RyaW5nIG1pbWVUeXBlID0gZm9ybWF0LmdldFN0cmluZyhNZWRpYUZvcm1hdC5LRVlfTUlNRSk7Ci0gICAgICAgICAgICByZXR1cm4gTWVkaWFGb3JtYXQuTUlNRVRZUEVfVEVYVF9DRUFfNjA4LmVxdWFscyhtaW1lVHlwZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdWJ0aXRsZVRyYWNrIGNyZWF0ZVRyYWNrKE1lZGlhRm9ybWF0IGZvcm1hdCkgewotICAgICAgICBTdHJpbmcgbWltZVR5cGUgPSBmb3JtYXQuZ2V0U3RyaW5nKE1lZGlhRm9ybWF0LktFWV9NSU1FKTsKLSAgICAgICAgaWYgKE1lZGlhRm9ybWF0Lk1JTUVUWVBFX1RFWFRfQ0VBXzYwOC5lcXVhbHMobWltZVR5cGUpKSB7Ci0gICAgICAgICAgICBpZiAobUNDV2lkZ2V0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtQ0NXaWRnZXQgPSBuZXcgQ2VhNjA4Q0NXaWRnZXQobUNvbnRleHQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG5ldyBDZWE2MDhDYXB0aW9uVHJhY2sobUNDV2lkZ2V0LCBmb3JtYXQpOwotICAgICAgICB9Ci0gICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJObyBtYXRjaGluZyBmb3JtYXQ6ICIgKyBmb3JtYXQudG9TdHJpbmcoKSk7Ci0gICAgfQotfQotCi1jbGFzcyBDZWE2MDhDYXB0aW9uVHJhY2sgZXh0ZW5kcyBTdWJ0aXRsZVRyYWNrIHsKLSAgICBwcml2YXRlIGZpbmFsIENlYTYwOENDUGFyc2VyIG1DQ1BhcnNlcjsKLSAgICBwcml2YXRlIGZpbmFsIENlYTYwOENDV2lkZ2V0IG1SZW5kZXJpbmdXaWRnZXQ7Ci0KLSAgICBDZWE2MDhDYXB0aW9uVHJhY2soQ2VhNjA4Q0NXaWRnZXQgcmVuZGVyaW5nV2lkZ2V0LCBNZWRpYUZvcm1hdCBmb3JtYXQpIHsKLSAgICAgICAgc3VwZXIoZm9ybWF0KTsKLQotICAgICAgICBtUmVuZGVyaW5nV2lkZ2V0ID0gcmVuZGVyaW5nV2lkZ2V0OwotICAgICAgICBtQ0NQYXJzZXIgPSBuZXcgQ2VhNjA4Q0NQYXJzZXIobVJlbmRlcmluZ1dpZGdldCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25EYXRhKGJ5dGVbXSBkYXRhLCBib29sZWFuIGVvcywgbG9uZyBydW5JRCkgewotICAgICAgICBtQ0NQYXJzZXIucGFyc2UoZGF0YSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFJlbmRlcmluZ1dpZGdldCBnZXRSZW5kZXJpbmdXaWRnZXQoKSB7Ci0gICAgICAgIHJldHVybiBtUmVuZGVyaW5nV2lkZ2V0OwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZVZpZXcoVmVjdG9yPEN1ZT4gYWN0aXZlQ3VlcykgewotICAgICAgICAvLyBPdmVycmlkaW5nIHdpdGggTk8tT1AsIENDIHJlbmRlcmluZyBieS1wYXNzZXMgdGhpcwotICAgIH0KLX0KLQotLyoqCi0gKiBBYnN0cmFjdCB3aWRnZXQgY2xhc3MgdG8gcmVuZGVyIGEgY2xvc2VkIGNhcHRpb24gdHJhY2suCi0gKi8KLWFic3RyYWN0IGNsYXNzIENsb3NlZENhcHRpb25XaWRnZXQgZXh0ZW5kcyBWaWV3R3JvdXAgaW1wbGVtZW50cyBTdWJ0aXRsZVRyYWNrLlJlbmRlcmluZ1dpZGdldCB7Ci0KLSAgICBpbnRlcmZhY2UgQ2xvc2VkQ2FwdGlvbkxheW91dCB7Ci0gICAgICAgIHZvaWQgc2V0Q2FwdGlvblN0eWxlKENhcHRpb25TdHlsZSBjYXB0aW9uU3R5bGUpOwotICAgICAgICB2b2lkIHNldEZvbnRTY2FsZShmbG9hdCBzY2FsZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2FwdGlvblN0eWxlIERFRkFVTFRfQ0FQVElPTl9TVFlMRSA9IENhcHRpb25TdHlsZS5ERUZBVUxUOwotCi0gICAgLyoqIENhcHRpb25pbmcgbWFuYWdlciwgdXNlZCB0byBvYnRhaW4gYW5kIHRyYWNrIGNhcHRpb24gcHJvcGVydGllcy4gKi8KLSAgICBwcml2YXRlIGZpbmFsIENhcHRpb25pbmdNYW5hZ2VyIG1NYW5hZ2VyOwotCi0gICAgLyoqIEN1cnJlbnQgY2FwdGlvbiBzdHlsZS4gKi8KLSAgICBwcm90ZWN0ZWQgQ2FwdGlvblN0eWxlIG1DYXB0aW9uU3R5bGU7Ci0KLSAgICAvKiogQ2FsbGJhY2sgZm9yIHJlbmRlcmluZyBjaGFuZ2VzLiAqLwotICAgIHByb3RlY3RlZCBPbkNoYW5nZWRMaXN0ZW5lciBtTGlzdGVuZXI7Ci0KLSAgICAvKiogQ29uY3JldGUgbGF5b3V0IG9mIENDLiAqLwotICAgIHByb3RlY3RlZCBDbG9zZWRDYXB0aW9uTGF5b3V0IG1DbG9zZWRDYXB0aW9uTGF5b3V0OwotCi0gICAgLyoqIFdoZXRoZXIgYSBjYXB0aW9uIHN0eWxlIGNoYW5nZSBsaXN0ZW5lciBpcyByZWdpc3RlcmVkLiAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBtSGFzQ2hhbmdlTGlzdGVuZXI7Ci0KLSAgICBwdWJsaWMgQ2xvc2VkQ2FwdGlvbldpZGdldChDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgdGhpcyhjb250ZXh0LCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ2xvc2VkQ2FwdGlvbldpZGdldChDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgewotICAgICAgICB0aGlzKGNvbnRleHQsIGF0dHJzLCAwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ2xvc2VkQ2FwdGlvbldpZGdldChDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlKSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlLCAwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ2xvc2VkQ2FwdGlvbldpZGdldChDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlQXR0ciwKLSAgICAgICAgICAgIGludCBkZWZTdHlsZVJlcykgewotICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycywgZGVmU3R5bGVBdHRyLCBkZWZTdHlsZVJlcyk7Ci0KLSAgICAgICAgLy8gQ2Fubm90IHJlbmRlciB0ZXh0IG92ZXIgdmlkZW8gd2hlbiBsYXllciB0eXBlIGlzIGhhcmR3YXJlLgotICAgICAgICBzZXRMYXllclR5cGUoVmlldy5MQVlFUl9UWVBFX1NPRlRXQVJFLCBudWxsKTsKLQotICAgICAgICBtTWFuYWdlciA9IChDYXB0aW9uaW5nTWFuYWdlcikgY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuQ0FQVElPTklOR19TRVJWSUNFKTsKLSAgICAgICAgbUNhcHRpb25TdHlsZSA9IERFRkFVTFRfQ0FQVElPTl9TVFlMRS5hcHBseVN0eWxlKG1NYW5hZ2VyLmdldFVzZXJTdHlsZSgpKTsKLQotICAgICAgICBtQ2xvc2VkQ2FwdGlvbkxheW91dCA9IGNyZWF0ZUNhcHRpb25MYXlvdXQoY29udGV4dCk7Ci0gICAgICAgIG1DbG9zZWRDYXB0aW9uTGF5b3V0LnNldENhcHRpb25TdHlsZShtQ2FwdGlvblN0eWxlKTsKLSAgICAgICAgbUNsb3NlZENhcHRpb25MYXlvdXQuc2V0Rm9udFNjYWxlKG1NYW5hZ2VyLmdldEZvbnRTY2FsZSgpKTsKLSAgICAgICAgYWRkVmlldygoVmlld0dyb3VwKSBtQ2xvc2VkQ2FwdGlvbkxheW91dCwgTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCwKLSAgICAgICAgICAgICAgICBMYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UKTsKLQotICAgICAgICByZXF1ZXN0TGF5b3V0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIGFic3RyYWN0IENsb3NlZENhcHRpb25MYXlvdXQgY3JlYXRlQ2FwdGlvbkxheW91dChDb250ZXh0IGNvbnRleHQpOwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0T25DaGFuZ2VkTGlzdGVuZXIoT25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgbUxpc3RlbmVyID0gbGlzdGVuZXI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0U2l6ZShpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLSAgICAgICAgZmluYWwgaW50IHdpZHRoU3BlYyA9IE1lYXN1cmVTcGVjLm1ha2VNZWFzdXJlU3BlYyh3aWR0aCwgTWVhc3VyZVNwZWMuRVhBQ1RMWSk7Ci0gICAgICAgIGZpbmFsIGludCBoZWlnaHRTcGVjID0gTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKGhlaWdodCwgTWVhc3VyZVNwZWMuRVhBQ1RMWSk7Ci0KLSAgICAgICAgbWVhc3VyZSh3aWR0aFNwZWMsIGhlaWdodFNwZWMpOwotICAgICAgICBsYXlvdXQoMCwgMCwgd2lkdGgsIGhlaWdodCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKLSAgICAgICAgaWYgKHZpc2libGUpIHsKLSAgICAgICAgICAgIHNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1hbmFnZUNoYW5nZUxpc3RlbmVyKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25BdHRhY2hlZFRvV2luZG93KCkgewotICAgICAgICBzdXBlci5vbkF0dGFjaGVkVG9XaW5kb3coKTsKLQotICAgICAgICBtYW5hZ2VDaGFuZ2VMaXN0ZW5lcigpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uRGV0YWNoZWRGcm9tV2luZG93KCkgewotICAgICAgICBzdXBlci5vbkRldGFjaGVkRnJvbVdpbmRvdygpOwotCi0gICAgICAgIG1hbmFnZUNoYW5nZUxpc3RlbmVyKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25NZWFzdXJlKGludCB3aWR0aE1lYXN1cmVTcGVjLCBpbnQgaGVpZ2h0TWVhc3VyZVNwZWMpIHsKLSAgICAgICAgc3VwZXIub25NZWFzdXJlKHdpZHRoTWVhc3VyZVNwZWMsIGhlaWdodE1lYXN1cmVTcGVjKTsKLSAgICAgICAgKChWaWV3R3JvdXApIG1DbG9zZWRDYXB0aW9uTGF5b3V0KS5tZWFzdXJlKHdpZHRoTWVhc3VyZVNwZWMsIGhlaWdodE1lYXN1cmVTcGVjKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBvbkxheW91dChib29sZWFuIGNoYW5nZWQsIGludCBsLCBpbnQgdCwgaW50IHIsIGludCBiKSB7Ci0gICAgICAgICgoVmlld0dyb3VwKSBtQ2xvc2VkQ2FwdGlvbkxheW91dCkubGF5b3V0KGwsIHQsIHIsIGIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1hbmFnZXMgd2hldGhlciB0aGlzIHJlbmRlcmVyIGlzIGxpc3RlbmluZyBmb3IgY2FwdGlvbiBzdHlsZSBjaGFuZ2VzLgotICAgICAqLwotICAgIHByaXZhdGUgZmluYWwgQ2FwdGlvbmluZ0NoYW5nZUxpc3RlbmVyIG1DYXB0aW9uaW5nTGlzdGVuZXIgPSBuZXcgQ2FwdGlvbmluZ0NoYW5nZUxpc3RlbmVyKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Vc2VyU3R5bGVDaGFuZ2VkKENhcHRpb25TdHlsZSB1c2VyU3R5bGUpIHsKLSAgICAgICAgICAgIG1DYXB0aW9uU3R5bGUgPSBERUZBVUxUX0NBUFRJT05fU1RZTEUuYXBwbHlTdHlsZSh1c2VyU3R5bGUpOwotICAgICAgICAgICAgbUNsb3NlZENhcHRpb25MYXlvdXQuc2V0Q2FwdGlvblN0eWxlKG1DYXB0aW9uU3R5bGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uRm9udFNjYWxlQ2hhbmdlZChmbG9hdCBmb250U2NhbGUpIHsKLSAgICAgICAgICAgIG1DbG9zZWRDYXB0aW9uTGF5b3V0LnNldEZvbnRTY2FsZShmb250U2NhbGUpOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHByaXZhdGUgdm9pZCBtYW5hZ2VDaGFuZ2VMaXN0ZW5lcigpIHsKLSAgICAgICAgZmluYWwgYm9vbGVhbiBuZWVkc0xpc3RlbmVyID0gaXNBdHRhY2hlZFRvV2luZG93KCkgJiYgZ2V0VmlzaWJpbGl0eSgpID09IFZpZXcuVklTSUJMRTsKLSAgICAgICAgaWYgKG1IYXNDaGFuZ2VMaXN0ZW5lciAhPSBuZWVkc0xpc3RlbmVyKSB7Ci0gICAgICAgICAgICBtSGFzQ2hhbmdlTGlzdGVuZXIgPSBuZWVkc0xpc3RlbmVyOwotCi0gICAgICAgICAgICBpZiAobmVlZHNMaXN0ZW5lcikgewotICAgICAgICAgICAgICAgIG1NYW5hZ2VyLmFkZENhcHRpb25pbmdDaGFuZ2VMaXN0ZW5lcihtQ2FwdGlvbmluZ0xpc3RlbmVyKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbU1hbmFnZXIucmVtb3ZlQ2FwdGlvbmluZ0NoYW5nZUxpc3RlbmVyKG1DYXB0aW9uaW5nTGlzdGVuZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotCi0vKioKLSAqIENDUGFyc2VyIHByb2Nlc3NlcyBDRUEtNjA4IGNsb3NlZCBjYXB0aW9uIGRhdGEuCi0gKgotICogSXQgY2FsbHMgYmFjayBpbnRvIE9uRGlzcGxheUNoYW5nZWRMaXN0ZW5lciB1cG9uCi0gKiBkaXNwbGF5IGNoYW5nZSB3aXRoIHN0eWxlZCB0ZXh0IGZvciByZW5kZXJpbmcuCi0gKgotICovCi1jbGFzcyBDZWE2MDhDQ1BhcnNlciB7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1JPV1MgPSAxNTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQVhfQ09MUyA9IDMyOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJDZWE2MDhDQ1BhcnNlciI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJTlZBTElEID0gLTE7Ci0KLSAgICAvLyBFSUEtQ0VBLTYwODogVGFibGUgNzAgLSBDb250cm9sIENvZGVzCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJDTCA9IDB4MjA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJTICA9IDB4MjE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFPRiA9IDB4MjI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFPTiA9IDB4MjM7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFUiA9IDB4MjQ7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJVMiA9IDB4MjU7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJVMyA9IDB4MjY7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJVNCA9IDB4Mjc7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZPTiA9IDB4Mjg7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJEQyA9IDB4Mjk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRSICA9IDB4MmE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJURCA9IDB4MmI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVETSA9IDB4MmM7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENSICA9IDB4MmQ7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVOTSA9IDB4MmU7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVPQyA9IDB4MmY7Ci0KLSAgICAvLyBUcmFuc3BhcmVudCBTcGFjZQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgVFMgPSAnXHUwMEEwJzsKLQotICAgIC8vIENhcHRpb25pbmcgTW9kZXMKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTU9ERV9VTktOT1dOID0gMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTU9ERV9QQUlOVF9PTiA9IDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1PREVfUk9MTF9VUCA9IDI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1PREVfUE9QX09OID0gMzsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTU9ERV9URVhUID0gNDsKLQotICAgIHByaXZhdGUgZmluYWwgRGlzcGxheUxpc3RlbmVyIG1MaXN0ZW5lcjsKLQotICAgIHByaXZhdGUgaW50IG1Nb2RlID0gTU9ERV9QQUlOVF9PTjsKLSAgICBwcml2YXRlIGludCBtUm9sbFVwU2l6ZSA9IDQ7Ci0gICAgcHJpdmF0ZSBpbnQgbVByZXZDdHJsQ29kZSA9IElOVkFMSUQ7Ci0KLSAgICBwcml2YXRlIENDTWVtb3J5IG1EaXNwbGF5ID0gbmV3IENDTWVtb3J5KCk7Ci0gICAgcHJpdmF0ZSBDQ01lbW9yeSBtTm9uRGlzcGxheSA9IG5ldyBDQ01lbW9yeSgpOwotICAgIHByaXZhdGUgQ0NNZW1vcnkgbVRleHRNZW0gPSBuZXcgQ0NNZW1vcnkoKTsKLQotICAgIENlYTYwOENDUGFyc2VyKERpc3BsYXlMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICBtTGlzdGVuZXIgPSBsaXN0ZW5lcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwYXJzZShieXRlW10gZGF0YSkgewotICAgICAgICBDQ0RhdGFbXSBjY0RhdGEgPSBDQ0RhdGEuZnJvbUJ5dGVBcnJheShkYXRhKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNjRGF0YS5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCBjY0RhdGFbaV0udG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChoYW5kbGVDdHJsQ29kZShjY0RhdGFbaV0pCi0gICAgICAgICAgICAgICAgICAgIHx8IGhhbmRsZVRhYk9mZnNldHMoY2NEYXRhW2ldKQotICAgICAgICAgICAgICAgICAgICB8fCBoYW5kbGVQQUNDb2RlKGNjRGF0YVtpXSkKLSAgICAgICAgICAgICAgICAgICAgfHwgaGFuZGxlTWlkUm93Q29kZShjY0RhdGFbaV0pKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGhhbmRsZURpc3BsYXlhYmxlQ2hhcnMoY2NEYXRhW2ldKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGludGVyZmFjZSBEaXNwbGF5TGlzdGVuZXIgewotICAgICAgICB2b2lkIG9uRGlzcGxheUNoYW5nZWQoU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcltdIHN0eWxlZFRleHRzKTsKLSAgICAgICAgQ2FwdGlvblN0eWxlIGdldENhcHRpb25TdHlsZSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgQ0NNZW1vcnkgZ2V0TWVtb3J5KCkgewotICAgICAgICAvLyBnZXQgdGhlIENDIG1lbW9yeSB0byBvcGVyYXRlIG9uIGZvciBjdXJyZW50IG1vZGUKLSAgICAgICAgc3dpdGNoIChtTW9kZSkgewotICAgICAgICBjYXNlIE1PREVfUE9QX09OOgotICAgICAgICAgICAgcmV0dXJuIG1Ob25EaXNwbGF5OwotICAgICAgICBjYXNlIE1PREVfVEVYVDoKLSAgICAgICAgICAgIC8vIFRPRE8oY2h6KTogc3VwcG9ydCBvbmx5IGNhcHRpb24gbW9kZSBmb3Igbm93LAotICAgICAgICAgICAgLy8gaW4gdGV4dCBtb2RlLCBkdW1wIGV2ZXJ5dGhpbmcgdG8gdGV4dCBtZW0uCi0gICAgICAgICAgICByZXR1cm4gbVRleHRNZW07Ci0gICAgICAgIGNhc2UgTU9ERV9QQUlOVF9PTjoKLSAgICAgICAgY2FzZSBNT0RFX1JPTExfVVA6Ci0gICAgICAgICAgICByZXR1cm4gbURpc3BsYXk7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJ1bnJlY29naW5pemVkIG1vZGU6ICIgKyBtTW9kZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1EaXNwbGF5OwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBoYW5kbGVEaXNwbGF5YWJsZUNoYXJzKENDRGF0YSBjY0RhdGEpIHsKLSAgICAgICAgaWYgKCFjY0RhdGEuaXNEaXNwbGF5YWJsZUNoYXIoKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gRXh0ZW5kZWQgY2hhciBpbmNsdWRlcyAxIGF1dG9tYXRpYyBiYWNrc3BhY2UKLSAgICAgICAgaWYgKGNjRGF0YS5pc0V4dGVuZGVkQ2hhcigpKSB7Ci0gICAgICAgICAgICBnZXRNZW1vcnkoKS5icygpOwotICAgICAgICB9Ci0KLSAgICAgICAgZ2V0TWVtb3J5KCkud3JpdGVUZXh0KGNjRGF0YS5nZXREaXNwbGF5VGV4dCgpKTsKLQotICAgICAgICBpZiAobU1vZGUgPT0gTU9ERV9QQUlOVF9PTiB8fCBtTW9kZSA9PSBNT0RFX1JPTExfVVApIHsKLSAgICAgICAgICAgIHVwZGF0ZURpc3BsYXkoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBoYW5kbGVNaWRSb3dDb2RlKENDRGF0YSBjY0RhdGEpIHsKLSAgICAgICAgU3R5bGVDb2RlIG0gPSBjY0RhdGEuZ2V0TWlkUm93KCk7Ci0gICAgICAgIGlmIChtICE9IG51bGwpIHsKLSAgICAgICAgICAgIGdldE1lbW9yeSgpLndyaXRlTWlkUm93Q29kZShtKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaGFuZGxlUEFDQ29kZShDQ0RhdGEgY2NEYXRhKSB7Ci0gICAgICAgIFBBQyBwYWMgPSBjY0RhdGEuZ2V0UEFDKCk7Ci0KLSAgICAgICAgaWYgKHBhYyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAobU1vZGUgPT0gTU9ERV9ST0xMX1VQKSB7Ci0gICAgICAgICAgICAgICAgZ2V0TWVtb3J5KCkubW92ZUJhc2VsaW5lVG8ocGFjLmdldFJvdygpLCBtUm9sbFVwU2l6ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBnZXRNZW1vcnkoKS53cml0ZVBBQyhwYWMpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGhhbmRsZVRhYk9mZnNldHMoQ0NEYXRhIGNjRGF0YSkgewotICAgICAgICBpbnQgdGFicyA9IGNjRGF0YS5nZXRUYWJPZmZzZXQoKTsKLQotICAgICAgICBpZiAodGFicyA+IDApIHsKLSAgICAgICAgICAgIGdldE1lbW9yeSgpLnRhYih0YWJzKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBoYW5kbGVDdHJsQ29kZShDQ0RhdGEgY2NEYXRhKSB7Ci0gICAgICAgIGludCBjdHJsQ29kZSA9IGNjRGF0YS5nZXRDdHJsQ29kZSgpOwotCi0gICAgICAgIGlmIChtUHJldkN0cmxDb2RlICE9IElOVkFMSUQgJiYgbVByZXZDdHJsQ29kZSA9PSBjdHJsQ29kZSkgewotICAgICAgICAgICAgLy8gZGlzY2FyZCBkb3VibGUgY3RybCBjb2RlcyAoYnV0IGlmIHRoZXJlJ3MgYSAzcmQgb25lLCB3ZSBzdGlsbCB0YWtlIHRoYXQpCi0gICAgICAgICAgICBtUHJldkN0cmxDb2RlID0gSU5WQUxJRDsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgc3dpdGNoKGN0cmxDb2RlKSB7Ci0gICAgICAgIGNhc2UgUkNMOgotICAgICAgICAgICAgLy8gc2VsZWN0IHBvcC1vbiBzdHlsZQotICAgICAgICAgICAgbU1vZGUgPSBNT0RFX1BPUF9PTjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEJTOgotICAgICAgICAgICAgZ2V0TWVtb3J5KCkuYnMoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIERFUjoKLSAgICAgICAgICAgIGdldE1lbW9yeSgpLmRlcigpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUlUyOgotICAgICAgICBjYXNlIFJVMzoKLSAgICAgICAgY2FzZSBSVTQ6Ci0gICAgICAgICAgICBtUm9sbFVwU2l6ZSA9IChjdHJsQ29kZSAtIDB4MjMpOwotICAgICAgICAgICAgLy8gZXJhc2UgbWVtb3J5IGlmIGN1cnJlbnRseSBpbiBvdGhlciBzdHlsZQotICAgICAgICAgICAgaWYgKG1Nb2RlICE9IE1PREVfUk9MTF9VUCkgewotICAgICAgICAgICAgICAgIG1EaXNwbGF5LmVyYXNlKCk7Ci0gICAgICAgICAgICAgICAgbU5vbkRpc3BsYXkuZXJhc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIHNlbGVjdCByb2xsLXVwIHN0eWxlCi0gICAgICAgICAgICBtTW9kZSA9IE1PREVfUk9MTF9VUDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEZPTjoKLSAgICAgICAgICAgIExvZy5pKFRBRywgIkZsYXNoIE9uIik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBSREM6Ci0gICAgICAgICAgICAvLyBzZWxlY3QgcGFpbnQtb24gc3R5bGUKLSAgICAgICAgICAgIG1Nb2RlID0gTU9ERV9QQUlOVF9PTjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFRSOgotICAgICAgICAgICAgbU1vZGUgPSBNT0RFX1RFWFQ7Ci0gICAgICAgICAgICBtVGV4dE1lbS5lcmFzZSgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUlREOgotICAgICAgICAgICAgbU1vZGUgPSBNT0RFX1RFWFQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBFRE06Ci0gICAgICAgICAgICAvLyBlcmFzZSBkaXNwbGF5IG1lbW9yeQotICAgICAgICAgICAgbURpc3BsYXkuZXJhc2UoKTsKLSAgICAgICAgICAgIHVwZGF0ZURpc3BsYXkoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIENSOgotICAgICAgICAgICAgaWYgKG1Nb2RlID09IE1PREVfUk9MTF9VUCkgewotICAgICAgICAgICAgICAgIGdldE1lbW9yeSgpLnJvbGxVcChtUm9sbFVwU2l6ZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGdldE1lbW9yeSgpLmNyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobU1vZGUgPT0gTU9ERV9ST0xMX1VQKSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlRGlzcGxheSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRU5NOgotICAgICAgICAgICAgLy8gZXJhc2Ugbm9uLWRpc3BsYXkgbWVtb3J5Ci0gICAgICAgICAgICBtTm9uRGlzcGxheS5lcmFzZSgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRU9DOgotICAgICAgICAgICAgLy8gc3dhcCBkaXNwbGF5L25vbi1kaXNwbGF5IG1lbW9yeQotICAgICAgICAgICAgc3dhcE1lbW9yeSgpOwotICAgICAgICAgICAgLy8gc3dpdGNoIHRvIHBvcC1vbiBzdHlsZQotICAgICAgICAgICAgbU1vZGUgPSBNT0RFX1BPUF9PTjsKLSAgICAgICAgICAgIHVwZGF0ZURpc3BsYXkoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIElOVkFMSUQ6Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBtUHJldkN0cmxDb2RlID0gSU5WQUxJRDsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIG1QcmV2Q3RybENvZGUgPSBjdHJsQ29kZTsKLQotICAgICAgICAvLyBoYW5kbGVkCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVEaXNwbGF5KCkgewotICAgICAgICBpZiAobUxpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIENhcHRpb25TdHlsZSBjYXB0aW9uU3R5bGUgPSBtTGlzdGVuZXIuZ2V0Q2FwdGlvblN0eWxlKCk7Ci0gICAgICAgICAgICBtTGlzdGVuZXIub25EaXNwbGF5Q2hhbmdlZChtRGlzcGxheS5nZXRTdHlsZWRUZXh0KGNhcHRpb25TdHlsZSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHN3YXBNZW1vcnkoKSB7Ci0gICAgICAgIENDTWVtb3J5IHRlbXAgPSBtRGlzcGxheTsKLSAgICAgICAgbURpc3BsYXkgPSBtTm9uRGlzcGxheTsKLSAgICAgICAgbU5vbkRpc3BsYXkgPSB0ZW1wOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFN0eWxlQ29kZSB7Ci0gICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgQ09MT1JfV0hJVEUgPSAwOwotICAgICAgICBzdGF0aWMgZmluYWwgaW50IENPTE9SX0dSRUVOID0gMTsKLSAgICAgICAgc3RhdGljIGZpbmFsIGludCBDT0xPUl9CTFVFID0gMjsKLSAgICAgICAgc3RhdGljIGZpbmFsIGludCBDT0xPUl9DWUFOID0gMzsKLSAgICAgICAgc3RhdGljIGZpbmFsIGludCBDT0xPUl9SRUQgPSA0OwotICAgICAgICBzdGF0aWMgZmluYWwgaW50IENPTE9SX1lFTExPVyA9IDU7Ci0gICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgQ09MT1JfTUFHRU5UQSA9IDY7Ci0gICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgQ09MT1JfSU5WQUxJRCA9IDc7Ci0KLSAgICAgICAgc3RhdGljIGZpbmFsIGludCBTVFlMRV9JVEFMSUNTICAgPSAweDAwMDAwMDAxOwotICAgICAgICBzdGF0aWMgZmluYWwgaW50IFNUWUxFX1VOREVSTElORSA9IDB4MDAwMDAwMDI7Ci0KLSAgICAgICAgc3RhdGljIGZpbmFsIFN0cmluZ1tdIG1Db2xvck1hcCA9IHsKLSAgICAgICAgICAgICJXSElURSIsICJHUkVFTiIsICJCTFVFIiwgIkNZQU4iLCAiUkVEIiwgIllFTExPVyIsICJNQUdFTlRBIiwgIklOVkFMSUQiCi0gICAgICAgIH07Ci0KLSAgICAgICAgZmluYWwgaW50IG1TdHlsZTsKLSAgICAgICAgZmluYWwgaW50IG1Db2xvcjsKLQotICAgICAgICBzdGF0aWMgU3R5bGVDb2RlIGZyb21CeXRlKGJ5dGUgZGF0YTIpIHsKLSAgICAgICAgICAgIGludCBzdHlsZSA9IDA7Ci0gICAgICAgICAgICBpbnQgY29sb3IgPSAoZGF0YTIgPj4gMSkgJiAweDc7Ci0KLSAgICAgICAgICAgIGlmICgoZGF0YTIgJiAweDEpICE9IDApIHsKLSAgICAgICAgICAgICAgICBzdHlsZSB8PSBTVFlMRV9VTkRFUkxJTkU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChjb2xvciA9PSBDT0xPUl9JTlZBTElEKSB7Ci0gICAgICAgICAgICAgICAgLy8gV0hJVEUgSVRBTElDUwotICAgICAgICAgICAgICAgIGNvbG9yID0gQ09MT1JfV0hJVEU7Ci0gICAgICAgICAgICAgICAgc3R5bGUgfD0gU1RZTEVfSVRBTElDUzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHlsZUNvZGUoc3R5bGUsIGNvbG9yKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0eWxlQ29kZShpbnQgc3R5bGUsIGludCBjb2xvcikgewotICAgICAgICAgICAgbVN0eWxlID0gc3R5bGU7Ci0gICAgICAgICAgICBtQ29sb3IgPSBjb2xvcjsKLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gaXNJdGFsaWNzKCkgewotICAgICAgICAgICAgcmV0dXJuIChtU3R5bGUgJiBTVFlMRV9JVEFMSUNTKSAhPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgYm9vbGVhbiBpc1VuZGVybGluZSgpIHsKLSAgICAgICAgICAgIHJldHVybiAobVN0eWxlICYgU1RZTEVfVU5ERVJMSU5FKSAhPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGdldENvbG9yKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Db2xvcjsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzdHIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgc3RyLmFwcGVuZCgieyIpOwotICAgICAgICAgICAgc3RyLmFwcGVuZChtQ29sb3JNYXBbbUNvbG9yXSk7Ci0gICAgICAgICAgICBpZiAoKG1TdHlsZSAmIFNUWUxFX0lUQUxJQ1MpICE9IDApIHsKLSAgICAgICAgICAgICAgICBzdHIuYXBwZW5kKCIsIElUQUxJQ1MiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICgobVN0eWxlICYgU1RZTEVfVU5ERVJMSU5FKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgc3RyLmFwcGVuZCgiLCBVTkRFUkxJTkUiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN0ci5hcHBlbmQoIn0iKTsKLQotICAgICAgICAgICAgcmV0dXJuIHN0ci50b1N0cmluZygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUEFDIGV4dGVuZHMgU3R5bGVDb2RlIHsKLSAgICAgICAgZmluYWwgaW50IG1Sb3c7Ci0gICAgICAgIGZpbmFsIGludCBtQ29sOwotCi0gICAgICAgIHN0YXRpYyBQQUMgZnJvbUJ5dGVzKGJ5dGUgZGF0YTEsIGJ5dGUgZGF0YTIpIHsKLSAgICAgICAgICAgIGludFtdIHJvd1RhYmxlID0gezExLCAxLCAzLCAxMiwgMTQsIDUsIDcsIDl9OwotICAgICAgICAgICAgaW50IHJvdyA9IHJvd1RhYmxlW2RhdGExICYgMHgwN10gKyAoKGRhdGEyICYgMHgyMCkgPj4gNSk7Ci0gICAgICAgICAgICBpbnQgc3R5bGUgPSAwOwotICAgICAgICAgICAgaWYgKChkYXRhMiAmIDEpICE9IDApIHsKLSAgICAgICAgICAgICAgICBzdHlsZSB8PSBTVFlMRV9VTkRFUkxJTkU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoKGRhdGEyICYgMHgxMCkgIT0gMCkgewotICAgICAgICAgICAgICAgIC8vIGluZGVudCBjb2RlCi0gICAgICAgICAgICAgICAgaW50IGluZGVudCA9IChkYXRhMiA+PiAxKSAmIDB4NzsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFBBQyhyb3csIGluZGVudCAqIDQsIHN0eWxlLCBDT0xPUl9XSElURSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIHN0eWxlIGNvZGUKLSAgICAgICAgICAgICAgICBpbnQgY29sb3IgPSAoZGF0YTIgPj4gMSkgJiAweDc7Ci0KLSAgICAgICAgICAgICAgICBpZiAoY29sb3IgPT0gQ09MT1JfSU5WQUxJRCkgewotICAgICAgICAgICAgICAgICAgICAvLyBXSElURSBJVEFMSUNTCi0gICAgICAgICAgICAgICAgICAgIGNvbG9yID0gQ09MT1JfV0hJVEU7Ci0gICAgICAgICAgICAgICAgICAgIHN0eWxlIHw9IFNUWUxFX0lUQUxJQ1M7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUEFDKHJvdywgLTEsIHN0eWxlLCBjb2xvcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBQQUMoaW50IHJvdywgaW50IGNvbCwgaW50IHN0eWxlLCBpbnQgY29sb3IpIHsKLSAgICAgICAgICAgIHN1cGVyKHN0eWxlLCBjb2xvcik7Ci0gICAgICAgICAgICBtUm93ID0gcm93OwotICAgICAgICAgICAgbUNvbCA9IGNvbDsKLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gaXNJbmRlbnRQQUMoKSB7Ci0gICAgICAgICAgICByZXR1cm4gKG1Db2wgPj0gMCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgZ2V0Um93KCkgewotICAgICAgICAgICAgcmV0dXJuIG1Sb3c7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgZ2V0Q29sKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Db2w7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJ7JWQsICVkfSwgJXMiLAotICAgICAgICAgICAgICAgICAgICBtUm93LCBtQ29sLCBzdXBlci50b1N0cmluZygpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIE11dGFibGUgdmVyc2lvbiBvZiBCYWNrZ3JvdW5kU3BhbiB0byBmYWNpbGl0YXRlIHRleHQgcmVuZGVyaW5nIHdpdGggZWRnZSBzdHlsZXMuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBNdXRhYmxlQmFja2dyb3VuZENvbG9yU3BhbiBleHRlbmRzIENoYXJhY3RlclN0eWxlCi0gICAgICAgICAgICBpbXBsZW1lbnRzIFVwZGF0ZUFwcGVhcmFuY2UgewotICAgICAgICBwcml2YXRlIGludCBtQ29sb3I7Ci0KLSAgICAgICAgcHVibGljIE11dGFibGVCYWNrZ3JvdW5kQ29sb3JTcGFuKGludCBjb2xvcikgewotICAgICAgICAgICAgbUNvbG9yID0gY29sb3I7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRCYWNrZ3JvdW5kQ29sb3IoaW50IGNvbG9yKSB7Ci0gICAgICAgICAgICBtQ29sb3IgPSBjb2xvcjsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0QmFja2dyb3VuZENvbG9yKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Db2xvcjsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCB1cGRhdGVEcmF3U3RhdGUoVGV4dFBhaW50IGRzKSB7Ci0gICAgICAgICAgICBkcy5iZ0NvbG9yID0gbUNvbG9yOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogQ0NMaW5lQnVpbGRlciBrZWVwcyB0cmFjayBvZiBkaXNwbGF5YWJsZSBjaGFycywgYXMgd2VsbCBhcwotICAgICAqIE1pZFJvdyBzdHlsZXMgYW5kIFBBQ3MsIGZvciBhIHNpbmdsZSBsaW5lIG9mIENDIG1lbW9yeS4KLSAgICAgKgotICAgICAqIEl0IGdlbmVyYXRlcyBzdHlsZWQgdGV4dCB2aWEgZ2V0U3R5bGVkVGV4dCgpIG1ldGhvZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBDQ0xpbmVCdWlsZGVyIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmdCdWlsZGVyIG1EaXNwbGF5Q2hhcnM7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgU3R5bGVDb2RlW10gbU1pZFJvd1N0eWxlczsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHlsZUNvZGVbXSBtUEFDU3R5bGVzOwotCi0gICAgICAgIENDTGluZUJ1aWxkZXIoU3RyaW5nIHN0cikgewotICAgICAgICAgICAgbURpc3BsYXlDaGFycyA9IG5ldyBTdHJpbmdCdWlsZGVyKHN0cik7Ci0gICAgICAgICAgICBtTWlkUm93U3R5bGVzID0gbmV3IFN0eWxlQ29kZVttRGlzcGxheUNoYXJzLmxlbmd0aCgpXTsKLSAgICAgICAgICAgIG1QQUNTdHlsZXMgPSBuZXcgU3R5bGVDb2RlW21EaXNwbGF5Q2hhcnMubGVuZ3RoKCldOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBzZXRDaGFyQXQoaW50IGluZGV4LCBjaGFyIGNoKSB7Ci0gICAgICAgICAgICBtRGlzcGxheUNoYXJzLnNldENoYXJBdChpbmRleCwgY2gpOwotICAgICAgICAgICAgbU1pZFJvd1N0eWxlc1tpbmRleF0gPSBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBzZXRNaWRSb3dBdChpbnQgaW5kZXgsIFN0eWxlQ29kZSBtKSB7Ci0gICAgICAgICAgICBtRGlzcGxheUNoYXJzLnNldENoYXJBdChpbmRleCwgJyAnKTsKLSAgICAgICAgICAgIG1NaWRSb3dTdHlsZXNbaW5kZXhdID0gbTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgc2V0UEFDQXQoaW50IGluZGV4LCBQQUMgcGFjKSB7Ci0gICAgICAgICAgICBtUEFDU3R5bGVzW2luZGV4XSA9IHBhYzsKLSAgICAgICAgfQotCi0gICAgICAgIGNoYXIgY2hhckF0KGludCBpbmRleCkgewotICAgICAgICAgICAgcmV0dXJuIG1EaXNwbGF5Q2hhcnMuY2hhckF0KGluZGV4KTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBsZW5ndGgoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbURpc3BsYXlDaGFycy5sZW5ndGgoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgYXBwbHlTdHlsZVNwYW4oCi0gICAgICAgICAgICAgICAgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlciBzdHlsZWRUZXh0LAotICAgICAgICAgICAgICAgIFN0eWxlQ29kZSBzLCBpbnQgc3RhcnQsIGludCBlbmQpIHsKLSAgICAgICAgICAgIGlmIChzLmlzSXRhbGljcygpKSB7Ci0gICAgICAgICAgICAgICAgc3R5bGVkVGV4dC5zZXRTcGFuKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0eWxlU3BhbihhbmRyb2lkLmdyYXBoaWNzLlR5cGVmYWNlLklUQUxJQyksCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGFydCwgZW5kLCBTcGFubmFibGUuU1BBTl9FWENMVVNJVkVfRVhDTFVTSVZFKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzLmlzVW5kZXJsaW5lKCkpIHsKLSAgICAgICAgICAgICAgICBzdHlsZWRUZXh0LnNldFNwYW4oCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgVW5kZXJsaW5lU3BhbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQsIGVuZCwgU3Bhbm5hYmxlLlNQQU5fRVhDTFVTSVZFX0VYQ0xVU0lWRSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBTcGFubmFibGVTdHJpbmdCdWlsZGVyIGdldFN0eWxlZFRleHQoQ2FwdGlvblN0eWxlIGNhcHRpb25TdHlsZSkgewotICAgICAgICAgICAgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlciBzdHlsZWRUZXh0ID0gbmV3IFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIobURpc3BsYXlDaGFycyk7Ci0gICAgICAgICAgICBpbnQgc3RhcnQgPSAtMSwgbmV4dCA9IDA7Ci0gICAgICAgICAgICBpbnQgc3R5bGVTdGFydCA9IC0xOwotICAgICAgICAgICAgU3R5bGVDb2RlIGN1clN0eWxlID0gbnVsbDsKLSAgICAgICAgICAgIHdoaWxlIChuZXh0IDwgbURpc3BsYXlDaGFycy5sZW5ndGgoKSkgewotICAgICAgICAgICAgICAgIFN0eWxlQ29kZSBuZXdTdHlsZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgaWYgKG1NaWRSb3dTdHlsZXNbbmV4dF0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAvLyBhcHBseSBtaWQtcm93IHN0eWxlIGNoYW5nZQotICAgICAgICAgICAgICAgICAgICBuZXdTdHlsZSA9IG1NaWRSb3dTdHlsZXNbbmV4dF07Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtUEFDU3R5bGVzW25leHRdICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICAgJiYgKHN0eWxlU3RhcnQgPCAwIHx8IHN0YXJ0IDwgMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gYXBwbHkgUEFDIHN0eWxlIGNoYW5nZSwgb25seSBpZjoKLSAgICAgICAgICAgICAgICAgICAgLy8gMS4gbm8gc3R5bGUgc2V0LCBvcgotICAgICAgICAgICAgICAgICAgICAvLyAyLiBzdHlsZSBzZXQsIGJ1dCBwcmV2IGNoYXIgaXMgbm9uZS1kaXNwbGF5YWJsZQotICAgICAgICAgICAgICAgICAgICBuZXdTdHlsZSA9IG1QQUNTdHlsZXNbbmV4dF07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChuZXdTdHlsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGN1clN0eWxlID0gbmV3U3R5bGU7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzdHlsZVN0YXJ0ID49IDAgJiYgc3RhcnQgPj0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgYXBwbHlTdHlsZVNwYW4oc3R5bGVkVGV4dCwgbmV3U3R5bGUsIHN0eWxlU3RhcnQsIG5leHQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHN0eWxlU3RhcnQgPSBuZXh0OwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChtRGlzcGxheUNoYXJzLmNoYXJBdChuZXh0KSAhPSBUUykgewotICAgICAgICAgICAgICAgICAgICBpZiAoc3RhcnQgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGFydCA9IG5leHQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXJ0ID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGV4cGFuZGVkU3RhcnQgPSBtRGlzcGxheUNoYXJzLmNoYXJBdChzdGFydCkgPT0gJyAnID8gc3RhcnQgOiBzdGFydCAtIDE7Ci0gICAgICAgICAgICAgICAgICAgIGludCBleHBhbmRlZEVuZCA9IG1EaXNwbGF5Q2hhcnMuY2hhckF0KG5leHQgLSAxKSA9PSAnICcgPyBuZXh0IDogbmV4dCArIDE7Ci0gICAgICAgICAgICAgICAgICAgIHN0eWxlZFRleHQuc2V0U3BhbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTXV0YWJsZUJhY2tncm91bmRDb2xvclNwYW4oY2FwdGlvblN0eWxlLmJhY2tncm91bmRDb2xvciksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwYW5kZWRTdGFydCwgZXhwYW5kZWRFbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3Bhbm5hYmxlLlNQQU5fRVhDTFVTSVZFX0VYQ0xVU0lWRSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzdHlsZVN0YXJ0ID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFwcGx5U3R5bGVTcGFuKHN0eWxlZFRleHQsIGN1clN0eWxlLCBzdHlsZVN0YXJ0LCBleHBhbmRlZEVuZCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSAtMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbmV4dCsrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gc3R5bGVkVGV4dDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogQ0NNZW1vcnkgbW9kZWxzIGEgY29uc29sZS1zdHlsZSBkaXNwbGF5LgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIENDTWVtb3J5IHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbUJsYW5rTGluZTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBDQ0xpbmVCdWlsZGVyW10gbUxpbmVzID0gbmV3IENDTGluZUJ1aWxkZXJbTUFYX1JPV1MgKyAyXTsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbVJvdzsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbUNvbDsKLQotICAgICAgICBDQ01lbW9yeSgpIHsKLSAgICAgICAgICAgIGNoYXJbXSBibGFuayA9IG5ldyBjaGFyW01BWF9DT0xTICsgMl07Ci0gICAgICAgICAgICBBcnJheXMuZmlsbChibGFuaywgVFMpOwotICAgICAgICAgICAgbUJsYW5rTGluZSA9IG5ldyBTdHJpbmcoYmxhbmspOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBlcmFzZSgpIHsKLSAgICAgICAgICAgIC8vIGVyYXNlIGFsbCBsaW5lcwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtTGluZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBtTGluZXNbaV0gPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVJvdyA9IE1BWF9ST1dTOwotICAgICAgICAgICAgbUNvbCA9IDE7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIGRlcigpIHsKLSAgICAgICAgICAgIGlmIChtTGluZXNbbVJvd10gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbUNvbDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtTGluZXNbbVJvd10uY2hhckF0KGkpICE9IFRTKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gbUNvbDsgaiA8IG1MaW5lc1ttUm93XS5sZW5ndGgoKTsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxpbmVzW2pdLnNldENoYXJBdChqLCBUUyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUxpbmVzW21Sb3ddID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgdGFiKGludCB0YWJzKSB7Ci0gICAgICAgICAgICBtb3ZlQ3Vyc29yQnlDb2wodGFicyk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIGJzKCkgewotICAgICAgICAgICAgbW92ZUN1cnNvckJ5Q29sKC0xKTsKLSAgICAgICAgICAgIGlmIChtTGluZXNbbVJvd10gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1MaW5lc1ttUm93XS5zZXRDaGFyQXQobUNvbCwgVFMpOwotICAgICAgICAgICAgICAgIGlmIChtQ29sID09IE1BWF9DT0xTIC0gMSkgewotICAgICAgICAgICAgICAgICAgICAvLyBTcGVjIHJlY29tbWVuZGF0aW9uOgotICAgICAgICAgICAgICAgICAgICAvLyBpZiBjdXJzb3Igd2FzIGF0IGNvbCAzMiwgbW92ZSBjdXJzb3IKLSAgICAgICAgICAgICAgICAgICAgLy8gYmFjayB0byBjb2wgMzEgYW5kIGVyYXNlIGJvdGggY29sIDMxJjMyCi0gICAgICAgICAgICAgICAgICAgIG1MaW5lc1ttUm93XS5zZXRDaGFyQXQoTUFYX0NPTFMsIFRTKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIGNyKCkgewotICAgICAgICAgICAgbW92ZUN1cnNvclRvKG1Sb3cgKyAxLCAxKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgcm9sbFVwKGludCB3aW5kb3dTaXplKSB7Ci0gICAgICAgICAgICBpbnQgaTsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPD0gbVJvdyAtIHdpbmRvd1NpemU7IGkrKykgewotICAgICAgICAgICAgICAgIG1MaW5lc1tpXSA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnQgc3RhcnRSb3cgPSBtUm93IC0gd2luZG93U2l6ZSArIDE7Ci0gICAgICAgICAgICBpZiAoc3RhcnRSb3cgPCAxKSB7Ci0gICAgICAgICAgICAgICAgc3RhcnRSb3cgPSAxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChpID0gc3RhcnRSb3c7IGkgPCBtUm93OyBpKyspIHsKLSAgICAgICAgICAgICAgICBtTGluZXNbaV0gPSBtTGluZXNbaSArIDFdOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChpID0gbVJvdzsgaSA8IG1MaW5lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIC8vIGNsZWFyIGJhc2Ugcm93Ci0gICAgICAgICAgICAgICAgbUxpbmVzW2ldID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIGRlZmF1bHQgdG8gY29sIDEsIGluIGNhc2UgUEFDIGlzIG5vdCBzZW50Ci0gICAgICAgICAgICBtQ29sID0gMTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgd3JpdGVUZXh0KFN0cmluZyB0ZXh0KSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRleHQubGVuZ3RoKCk7IGkrKykgewotICAgICAgICAgICAgICAgIGdldExpbmVCdWZmZXIobVJvdykuc2V0Q2hhckF0KG1Db2wsIHRleHQuY2hhckF0KGkpKTsKLSAgICAgICAgICAgICAgICBtb3ZlQ3Vyc29yQnlDb2woMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHdyaXRlTWlkUm93Q29kZShTdHlsZUNvZGUgbSkgewotICAgICAgICAgICAgZ2V0TGluZUJ1ZmZlcihtUm93KS5zZXRNaWRSb3dBdChtQ29sLCBtKTsKLSAgICAgICAgICAgIG1vdmVDdXJzb3JCeUNvbCgxKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgd3JpdGVQQUMoUEFDIHBhYykgewotICAgICAgICAgICAgaWYgKHBhYy5pc0luZGVudFBBQygpKSB7Ci0gICAgICAgICAgICAgICAgbW92ZUN1cnNvclRvKHBhYy5nZXRSb3coKSwgcGFjLmdldENvbCgpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbW92ZUN1cnNvclRvKHBhYy5nZXRSb3coKSwgMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBnZXRMaW5lQnVmZmVyKG1Sb3cpLnNldFBBQ0F0KG1Db2wsIHBhYyk7Ci0gICAgICAgIH0KLQotICAgICAgICBTcGFubmFibGVTdHJpbmdCdWlsZGVyW10gZ2V0U3R5bGVkVGV4dChDYXB0aW9uU3R5bGUgY2FwdGlvblN0eWxlKSB7Ci0gICAgICAgICAgICBBcnJheUxpc3Q8U3Bhbm5hYmxlU3RyaW5nQnVpbGRlcj4gcm93cyA9IG5ldyBBcnJheUxpc3Q8PihNQVhfUk9XUyk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8PSBNQVhfUk9XUzsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgcm93cy5hZGQobUxpbmVzW2ldICE9IG51bGwgPwotICAgICAgICAgICAgICAgICAgICAgICAgbUxpbmVzW2ldLmdldFN0eWxlZFRleHQoY2FwdGlvblN0eWxlKSA6IG51bGwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHJvd3MudG9BcnJheShuZXcgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcltNQVhfUk9XU10pOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGNsYW1wKGludCB4LCBpbnQgbWluLCBpbnQgbWF4KSB7Ci0gICAgICAgICAgICByZXR1cm4geCA8IG1pbiA/IG1pbiA6ICh4ID4gbWF4ID8gbWF4IDogeCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgbW92ZUN1cnNvclRvKGludCByb3csIGludCBjb2wpIHsKLSAgICAgICAgICAgIG1Sb3cgPSBjbGFtcChyb3csIDEsIE1BWF9ST1dTKTsKLSAgICAgICAgICAgIG1Db2wgPSBjbGFtcChjb2wsIDEsIE1BWF9DT0xTKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBtb3ZlQ3Vyc29yVG9Sb3coaW50IHJvdykgewotICAgICAgICAgICAgbVJvdyA9IGNsYW1wKHJvdywgMSwgTUFYX1JPV1MpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIG1vdmVDdXJzb3JCeUNvbChpbnQgY29sKSB7Ci0gICAgICAgICAgICBtQ29sID0gY2xhbXAobUNvbCArIGNvbCwgMSwgTUFYX0NPTFMpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIG1vdmVCYXNlbGluZVRvKGludCBiYXNlUm93LCBpbnQgd2luZG93U2l6ZSkgewotICAgICAgICAgICAgaWYgKG1Sb3cgPT0gYmFzZVJvdykgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludCBhY3R1YWxXaW5kb3dTaXplID0gd2luZG93U2l6ZTsKLSAgICAgICAgICAgIGlmIChiYXNlUm93IDwgYWN0dWFsV2luZG93U2l6ZSkgewotICAgICAgICAgICAgICAgIGFjdHVhbFdpbmRvd1NpemUgPSBiYXNlUm93OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1Sb3cgPCBhY3R1YWxXaW5kb3dTaXplKSB7Ci0gICAgICAgICAgICAgICAgYWN0dWFsV2luZG93U2l6ZSA9IG1Sb3c7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGludCBpOwotICAgICAgICAgICAgaWYgKGJhc2VSb3cgPCBtUm93KSB7Ci0gICAgICAgICAgICAgICAgLy8gY29weSBmcm9tIGJvdHRvbSB0byB0b3Agcm93Ci0gICAgICAgICAgICAgICAgZm9yIChpID0gYWN0dWFsV2luZG93U2l6ZSAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1MaW5lc1tiYXNlUm93IC0gaV0gPSBtTGluZXNbbVJvdyAtIGldOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gY29weSBmcm9tIHRvcCB0byBib3R0b20gcm93Ci0gICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGFjdHVhbFdpbmRvd1NpemU7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBtTGluZXNbYmFzZVJvdyAtIGldID0gbUxpbmVzW21Sb3cgLSBpXTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBjbGVhciByZXN0IG9mIHRoZSByb3dzCi0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDw9IGJhc2VSb3cgLSB3aW5kb3dTaXplOyBpKyspIHsKLSAgICAgICAgICAgICAgICBtTGluZXNbaV0gPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChpID0gYmFzZVJvdyArIDE7IGkgPCBtTGluZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBtTGluZXNbaV0gPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBDQ0xpbmVCdWlsZGVyIGdldExpbmVCdWZmZXIoaW50IHJvdykgewotICAgICAgICAgICAgaWYgKG1MaW5lc1tyb3ddID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtTGluZXNbcm93XSA9IG5ldyBDQ0xpbmVCdWlsZGVyKG1CbGFua0xpbmUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG1MaW5lc1tyb3ddOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBDQ0RhdGEgcGFyc2VzIHRoZSByYXcgQ0MgYnl0ZSBwYWlyIGludG8gZGlzcGxheWFibGUgY2hhcnMsCi0gICAgICogbWlzYyBjb250cm9sIGNvZGVzLCBNaWQtUm93IG9yIFByZWFtYmxlIEFkZHJlc3MgQ29kZXMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ0NEYXRhIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBieXRlIG1UeXBlOwotICAgICAgICBwcml2YXRlIGZpbmFsIGJ5dGUgbURhdGExOwotICAgICAgICBwcml2YXRlIGZpbmFsIGJ5dGUgbURhdGEyOwotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIG1DdHJsQ29kZU1hcCA9IHsKLSAgICAgICAgICAgICJSQ0wiLCAiQlMiICwgIkFPRiIsICJBT04iLAotICAgICAgICAgICAgIkRFUiIsICJSVTIiLCAiUlUzIiwgIlJVNCIsCi0gICAgICAgICAgICAiRk9OIiwgIlJEQyIsICJUUiIgLCAiUlREIiwKLSAgICAgICAgICAgICJFRE0iLCAiQ1IiICwgIkVOTSIsICJFT0MiLAotICAgICAgICB9OwotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIG1TcGVjaWFsQ2hhck1hcCA9IHsKLSAgICAgICAgICAgICJcdTAwQUUiLAotICAgICAgICAgICAgIlx1MDBCMCIsCi0gICAgICAgICAgICAiXHUwMEJEIiwKLSAgICAgICAgICAgICJcdTAwQkYiLAotICAgICAgICAgICAgIlx1MjEyMiIsCi0gICAgICAgICAgICAiXHUwMEEyIiwKLSAgICAgICAgICAgICJcdTAwQTMiLAotICAgICAgICAgICAgIlx1MjY2QSIsIC8vIEVpZ2h0aCBub3RlCi0gICAgICAgICAgICAiXHUwMEUwIiwKLSAgICAgICAgICAgICJcdTAwQTAiLCAvLyBUcmFuc3BhcmVudCBzcGFjZQotICAgICAgICAgICAgIlx1MDBFOCIsCi0gICAgICAgICAgICAiXHUwMEUyIiwKLSAgICAgICAgICAgICJcdTAwRUEiLAotICAgICAgICAgICAgIlx1MDBFRSIsCi0gICAgICAgICAgICAiXHUwMEY0IiwKLSAgICAgICAgICAgICJcdTAwRkIiLAotICAgICAgICB9OwotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIG1TcGFuaXNoQ2hhck1hcCA9IHsKLSAgICAgICAgICAgIC8vIFNwYW5pc2ggYW5kIG1pc2MgY2hhcnMKLSAgICAgICAgICAgICJcdTAwQzEiLCAvLyBBCi0gICAgICAgICAgICAiXHUwMEM5IiwgLy8gRQotICAgICAgICAgICAgIlx1MDBEMyIsIC8vIEkKLSAgICAgICAgICAgICJcdTAwREEiLCAvLyBPCi0gICAgICAgICAgICAiXHUwMERDIiwgLy8gVQotICAgICAgICAgICAgIlx1MDBGQyIsIC8vIHUKLSAgICAgICAgICAgICJcdTIwMTgiLCAvLyBvcGVuaW5nIHNpbmdsZSBxdW90ZQotICAgICAgICAgICAgIlx1MDBBMSIsIC8vIGludmVydGVkIGV4Y2xhbWF0aW9uIG1hcmsKLSAgICAgICAgICAgICIqIiwKLSAgICAgICAgICAgICInIiwKLSAgICAgICAgICAgICJcdTIwMTQiLCAvLyBlbSBkYXNoCi0gICAgICAgICAgICAiXHUwMEE5IiwgLy8gQ29weXJpZ2h0Ci0gICAgICAgICAgICAiXHUyMTIwIiwgLy8gU2VydmljZW1hcmsKLSAgICAgICAgICAgICJcdTIwMjIiLCAvLyByb3VuZCBidWxsZXQKLSAgICAgICAgICAgICJcdTIwMUMiLCAvLyBvcGVuaW5nIGRvdWJsZSBxdW90ZQotICAgICAgICAgICAgIlx1MjAxRCIsIC8vIGNsb3NpbmcgZG91YmxlIHF1b3RlCi0gICAgICAgICAgICAvLyBGcmVuY2gKLSAgICAgICAgICAgICJcdTAwQzAiLAotICAgICAgICAgICAgIlx1MDBDMiIsCi0gICAgICAgICAgICAiXHUwMEM3IiwKLSAgICAgICAgICAgICJcdTAwQzgiLAotICAgICAgICAgICAgIlx1MDBDQSIsCi0gICAgICAgICAgICAiXHUwMENCIiwKLSAgICAgICAgICAgICJcdTAwRUIiLAotICAgICAgICAgICAgIlx1MDBDRSIsCi0gICAgICAgICAgICAiXHUwMENGIiwKLSAgICAgICAgICAgICJcdTAwRUYiLAotICAgICAgICAgICAgIlx1MDBENCIsCi0gICAgICAgICAgICAiXHUwMEQ5IiwKLSAgICAgICAgICAgICJcdTAwRjkiLAotICAgICAgICAgICAgIlx1MDBEQiIsCi0gICAgICAgICAgICAiXHUwMEFCIiwKLSAgICAgICAgICAgICJcdTAwQkIiCi0gICAgICAgIH07Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gbVByb3R1Z3Vlc2VDaGFyTWFwID0gewotICAgICAgICAgICAgLy8gUG9ydHVndWVzZQotICAgICAgICAgICAgIlx1MDBDMyIsCi0gICAgICAgICAgICAiXHUwMEUzIiwKLSAgICAgICAgICAgICJcdTAwQ0QiLAotICAgICAgICAgICAgIlx1MDBDQyIsCi0gICAgICAgICAgICAiXHUwMEVDIiwKLSAgICAgICAgICAgICJcdTAwRDIiLAotICAgICAgICAgICAgIlx1MDBGMiIsCi0gICAgICAgICAgICAiXHUwMEQ1IiwKLSAgICAgICAgICAgICJcdTAwRjUiLAotICAgICAgICAgICAgInsiLAotICAgICAgICAgICAgIn0iLAotICAgICAgICAgICAgIlxcIiwKLSAgICAgICAgICAgICJeIiwKLSAgICAgICAgICAgICJfIiwKLSAgICAgICAgICAgICJ8IiwKLSAgICAgICAgICAgICJ+IiwKLSAgICAgICAgICAgIC8vIEdlcm1hbiBhbmQgbWlzYyBjaGFycwotICAgICAgICAgICAgIlx1MDBDNCIsCi0gICAgICAgICAgICAiXHUwMEU0IiwKLSAgICAgICAgICAgICJcdTAwRDYiLAotICAgICAgICAgICAgIlx1MDBGNiIsCi0gICAgICAgICAgICAiXHUwMERGIiwKLSAgICAgICAgICAgICJcdTAwQTUiLAotICAgICAgICAgICAgIlx1MDBBNCIsCi0gICAgICAgICAgICAiXHUyNTAyIiwgLy8gdmVydGljYWwgYmFyCi0gICAgICAgICAgICAiXHUwMEM1IiwKLSAgICAgICAgICAgICJcdTAwRTUiLAotICAgICAgICAgICAgIlx1MDBEOCIsCi0gICAgICAgICAgICAiXHUwMEY4IiwKLSAgICAgICAgICAgICJcdTI1MEMiLCAvLyB0b3AtbGVmdCBjb3JuZXIKLSAgICAgICAgICAgICJcdTI1MTAiLCAvLyB0b3AtcmlnaHQgY29ybmVyCi0gICAgICAgICAgICAiXHUyNTE0IiwgLy8gbG93ZXItbGVmdCBjb3JuZXIKLSAgICAgICAgICAgICJcdTI1MTgiLCAvLyBsb3dlci1yaWdodCBjb3JuZXIKLSAgICAgICAgfTsKLQotICAgICAgICBzdGF0aWMgQ0NEYXRhW10gZnJvbUJ5dGVBcnJheShieXRlW10gZGF0YSkgewotICAgICAgICAgICAgQ0NEYXRhW10gY2NEYXRhID0gbmV3IENDRGF0YVtkYXRhLmxlbmd0aCAvIDNdOwotCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNjRGF0YS5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIGNjRGF0YVtpXSA9IG5ldyBDQ0RhdGEoCi0gICAgICAgICAgICAgICAgICAgICAgICBkYXRhW2kgKiAzXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFbaSAqIDMgKyAxXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFbaSAqIDMgKyAyXSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBjY0RhdGE7Ci0gICAgICAgIH0KLQotICAgICAgICBDQ0RhdGEoYnl0ZSB0eXBlLCBieXRlIGRhdGExLCBieXRlIGRhdGEyKSB7Ci0gICAgICAgICAgICBtVHlwZSA9IHR5cGU7Ci0gICAgICAgICAgICBtRGF0YTEgPSBkYXRhMTsKLSAgICAgICAgICAgIG1EYXRhMiA9IGRhdGEyOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGdldEN0cmxDb2RlKCkgewotICAgICAgICAgICAgaWYgKChtRGF0YTEgPT0gMHgxNCB8fCBtRGF0YTEgPT0gMHgxYykKLSAgICAgICAgICAgICAgICAgICAgJiYgbURhdGEyID49IDB4MjAgJiYgbURhdGEyIDw9IDB4MmYpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbURhdGEyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHlsZUNvZGUgZ2V0TWlkUm93KCkgewotICAgICAgICAgICAgLy8gb25seSBzdXBwb3J0IHN0YW5kYXJkIE1pZC1yb3cgY29kZXMsIGlnbm9yZQotICAgICAgICAgICAgLy8gb3B0aW9uYWwgYmFja2dyb3VuZC9mb3JlZ3JvdW5kIG1pZC1yb3cgY29kZXMKLSAgICAgICAgICAgIGlmICgobURhdGExID09IDB4MTEgfHwgbURhdGExID09IDB4MTkpCi0gICAgICAgICAgICAgICAgICAgICYmIG1EYXRhMiA+PSAweDIwICYmIG1EYXRhMiA8PSAweDJmKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFN0eWxlQ29kZS5mcm9tQnl0ZShtRGF0YTIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBQQUMgZ2V0UEFDKCkgewotICAgICAgICAgICAgaWYgKChtRGF0YTEgJiAweDcwKSA9PSAweDEwCi0gICAgICAgICAgICAgICAgICAgICYmIChtRGF0YTIgJiAweDQwKSA9PSAweDQwCi0gICAgICAgICAgICAgICAgICAgICYmICgobURhdGExICYgMHgwNykgIT0gMCB8fCAobURhdGEyICYgMHgyMCkgPT0gMCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gUEFDLmZyb21CeXRlcyhtRGF0YTEsIG1EYXRhMik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBnZXRUYWJPZmZzZXQoKSB7Ci0gICAgICAgICAgICBpZiAoKG1EYXRhMSA9PSAweDE3IHx8IG1EYXRhMSA9PSAweDFmKQotICAgICAgICAgICAgICAgICAgICAmJiBtRGF0YTIgPj0gMHgyMSAmJiBtRGF0YTIgPD0gMHgyMykgewotICAgICAgICAgICAgICAgIHJldHVybiBtRGF0YTIgJiAweDM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gaXNEaXNwbGF5YWJsZUNoYXIoKSB7Ci0gICAgICAgICAgICByZXR1cm4gaXNCYXNpY0NoYXIoKSB8fCBpc1NwZWNpYWxDaGFyKCkgfHwgaXNFeHRlbmRlZENoYXIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBnZXREaXNwbGF5VGV4dCgpIHsKLSAgICAgICAgICAgIFN0cmluZyBzdHIgPSBnZXRCYXNpY0NoYXJzKCk7Ci0KLSAgICAgICAgICAgIGlmIChzdHIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHN0ciA9ICBnZXRTcGVjaWFsQ2hhcigpOwotCi0gICAgICAgICAgICAgICAgaWYgKHN0ciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0ciA9IGdldEV4dGVuZGVkQ2hhcigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIHN0cjsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgU3RyaW5nIGN0cmxDb2RlVG9TdHJpbmcoaW50IGN0cmxDb2RlKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUN0cmxDb2RlTWFwW2N0cmxDb2RlIC0gMHgyMF07Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gaXNCYXNpY0NoYXIoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbURhdGExID49IDB4MjAgJiYgbURhdGExIDw9IDB4N2Y7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gaXNTcGVjaWFsQ2hhcigpIHsKLSAgICAgICAgICAgIHJldHVybiAoKG1EYXRhMSA9PSAweDExIHx8IG1EYXRhMSA9PSAweDE5KQotICAgICAgICAgICAgICAgICAgICAmJiBtRGF0YTIgPj0gMHgzMCAmJiBtRGF0YTIgPD0gMHgzZik7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gaXNFeHRlbmRlZENoYXIoKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChtRGF0YTEgPT0gMHgxMiB8fCBtRGF0YTEgPT0gMHgxQQotICAgICAgICAgICAgICAgICAgICB8fCBtRGF0YTEgPT0gMHgxMyB8fCBtRGF0YTEgPT0gMHgxQikKLSAgICAgICAgICAgICAgICAgICAgJiYgbURhdGEyID49IDB4MjAgJiYgbURhdGEyIDw9IDB4M2YpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBjaGFyIGdldEJhc2ljQ2hhcihieXRlIGRhdGEpIHsKLSAgICAgICAgICAgIGNoYXIgYzsKLSAgICAgICAgICAgIC8vIHJlcGxhY2UgdGhlIG5vbi1BU0NJSSBvbmVzCi0gICAgICAgICAgICBzd2l0Y2ggKGRhdGEpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDB4MkE6IGMgPSAnXHUwMEUxJzsgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAweDVDOiBjID0gJ1x1MDBFOSc7IGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMHg1RTogYyA9ICdcdTAwRUQnOyBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDB4NUY6IGMgPSAnXHUwMEYzJzsgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAweDYwOiBjID0gJ1x1MDBGQSc7IGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMHg3QjogYyA9ICdcdTAwRTcnOyBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDB4N0M6IGMgPSAnXHUwMEY3JzsgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAweDdEOiBjID0gJ1x1MDBEMSc7IGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMHg3RTogYyA9ICdcdTAwRjEnOyBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDB4N0Y6IGMgPSAnXHUyNTg4JzsgYnJlYWs7IC8vIEZ1bGwgYmxvY2sKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBjID0gKGNoYXIpIGRhdGE7IGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGM7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIFN0cmluZyBnZXRCYXNpY0NoYXJzKCkgewotICAgICAgICAgICAgaWYgKG1EYXRhMSA+PSAweDIwICYmIG1EYXRhMSA8PSAweDdmKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoMik7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoZ2V0QmFzaWNDaGFyKG1EYXRhMSkpOwotICAgICAgICAgICAgICAgIGlmIChtRGF0YTIgPj0gMHgyMCAmJiBtRGF0YTIgPD0gMHg3ZikgewotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChnZXRCYXNpY0NoYXIobURhdGEyKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0U3BlY2lhbENoYXIoKSB7Ci0gICAgICAgICAgICBpZiAoKG1EYXRhMSA9PSAweDExIHx8IG1EYXRhMSA9PSAweDE5KQotICAgICAgICAgICAgICAgICAgICAmJiBtRGF0YTIgPj0gMHgzMCAmJiBtRGF0YTIgPD0gMHgzZikgewotICAgICAgICAgICAgICAgIHJldHVybiBtU3BlY2lhbENoYXJNYXBbbURhdGEyIC0gMHgzMF07Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0RXh0ZW5kZWRDaGFyKCkgewotICAgICAgICAgICAgaWYgKChtRGF0YTEgPT0gMHgxMiB8fCBtRGF0YTEgPT0gMHgxQSkKLSAgICAgICAgICAgICAgICAgICAgJiYgbURhdGEyID49IDB4MjAgJiYgbURhdGEyIDw9IDB4M2YpewotICAgICAgICAgICAgICAgIC8vIDEgU3BhbmlzaC9GcmVuY2ggY2hhcgotICAgICAgICAgICAgICAgIHJldHVybiBtU3BhbmlzaENoYXJNYXBbbURhdGEyIC0gMHgyMF07Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKChtRGF0YTEgPT0gMHgxMyB8fCBtRGF0YTEgPT0gMHgxQikKLSAgICAgICAgICAgICAgICAgICAgJiYgbURhdGEyID49IDB4MjAgJiYgbURhdGEyIDw9IDB4M2YpewotICAgICAgICAgICAgICAgIC8vIDEgUG9ydHVndWVzZS9HZXJtYW4vRGFuaXNoIGNoYXIKLSAgICAgICAgICAgICAgICByZXR1cm4gbVByb3R1Z3Vlc2VDaGFyTWFwW21EYXRhMiAtIDB4MjBdOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAgICAgU3RyaW5nIHN0cjsKLQotICAgICAgICAgICAgaWYgKG1EYXRhMSA8IDB4MTAgJiYgbURhdGEyIDwgMHgxMCkgewotICAgICAgICAgICAgICAgIC8vIE51bGwgUGFkLCBpZ25vcmUKLSAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiWyVkXU51bGw6ICUwMnggJTAyeCIsIG1UeXBlLCBtRGF0YTEsIG1EYXRhMik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGludCBjdHJsQ29kZSA9IGdldEN0cmxDb2RlKCk7Ci0gICAgICAgICAgICBpZiAoY3RybENvZGUgIT0gSU5WQUxJRCkgewotICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJbJWRdJXMiLCBtVHlwZSwgY3RybENvZGVUb1N0cmluZyhjdHJsQ29kZSkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnQgdGFiT2Zmc2V0ID0gZ2V0VGFiT2Zmc2V0KCk7Ci0gICAgICAgICAgICBpZiAodGFiT2Zmc2V0ID4gMCkgewotICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJbJWRdVGFiJWQiLCBtVHlwZSwgdGFiT2Zmc2V0KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgUEFDIHBhYyA9IGdldFBBQygpOwotICAgICAgICAgICAgaWYgKHBhYyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIlslZF1QQUM6ICVzIiwgbVR5cGUsIHBhYy50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU3R5bGVDb2RlIG0gPSBnZXRNaWRSb3coKTsKLSAgICAgICAgICAgIGlmIChtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiWyVkXU1pZC1yb3c6ICVzIiwgbVR5cGUsIG0udG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChpc0Rpc3BsYXlhYmxlQ2hhcigpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIlslZF1EaXNwbGF5YWJsZTogJXMgKCUwMnggJTAyeCkiLAotICAgICAgICAgICAgICAgICAgICAgICAgbVR5cGUsIGdldERpc3BsYXlUZXh0KCksIG1EYXRhMSwgbURhdGEyKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIlslZF1JbnZhbGlkOiAlMDJ4ICUwMngiLCBtVHlwZSwgbURhdGExLCBtRGF0YTIpOwotICAgICAgICB9Ci0gICAgfQotfQotCi0vKioKLSAqIFdpZGdldCBjYXBhYmxlIG9mIHJlbmRlcmluZyBDRUEtNjA4IGNsb3NlZCBjYXB0aW9ucy4KLSAqLwotY2xhc3MgQ2VhNjA4Q0NXaWRnZXQgZXh0ZW5kcyBDbG9zZWRDYXB0aW9uV2lkZ2V0IGltcGxlbWVudHMgQ2VhNjA4Q0NQYXJzZXIuRGlzcGxheUxpc3RlbmVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBSZWN0IG1UZXh0Qm91bmRzID0gbmV3IFJlY3QoKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgbUR1bW15VGV4dCA9ICIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0IjsKLQotICAgIHB1YmxpYyBDZWE2MDhDQ1dpZGdldChDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgdGhpcyhjb250ZXh0LCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ2VhNjA4Q0NXaWRnZXQoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKLSAgICAgICAgdGhpcyhjb250ZXh0LCBhdHRycywgMCk7Ci0gICAgfQotCi0gICAgcHVibGljIENlYTYwOENDV2lkZ2V0KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGUpIHsKLSAgICAgICAgdGhpcyhjb250ZXh0LCBhdHRycywgZGVmU3R5bGUsIDApOwotICAgIH0KLQotICAgIHB1YmxpYyBDZWE2MDhDQ1dpZGdldChDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlQXR0ciwKLSAgICAgICAgICAgIGludCBkZWZTdHlsZVJlcykgewotICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycywgZGVmU3R5bGVBdHRyLCBkZWZTdHlsZVJlcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIENsb3NlZENhcHRpb25MYXlvdXQgY3JlYXRlQ2FwdGlvbkxheW91dChDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBDQ0xheW91dChjb250ZXh0KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkRpc3BsYXlDaGFuZ2VkKFNwYW5uYWJsZVN0cmluZ0J1aWxkZXJbXSBzdHlsZWRUZXh0cykgewotICAgICAgICAoKENDTGF5b3V0KSBtQ2xvc2VkQ2FwdGlvbkxheW91dCkudXBkYXRlKHN0eWxlZFRleHRzKTsKLQotICAgICAgICBpZiAobUxpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1MaXN0ZW5lci5vbkNoYW5nZWQodGhpcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQ2FwdGlvblN0eWxlIGdldENhcHRpb25TdHlsZSgpIHsKLSAgICAgICAgcmV0dXJuIG1DYXB0aW9uU3R5bGU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ0NMaW5lQm94IGV4dGVuZHMgVGV4dFZpZXcgewotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdCBGT05UX1BBRERJTkdfUkFUSU8gPSAwLjc1ZjsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgRURHRV9PVVRMSU5FX1JBVElPID0gMC4xZjsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgRURHRV9TSEFET1dfUkFUSU8gPSAwLjA1ZjsKLSAgICAgICAgcHJpdmF0ZSBmbG9hdCBtT3V0bGluZVdpZHRoOwotICAgICAgICBwcml2YXRlIGZsb2F0IG1TaGFkb3dSYWRpdXM7Ci0gICAgICAgIHByaXZhdGUgZmxvYXQgbVNoYWRvd09mZnNldDsKLQotICAgICAgICBwcml2YXRlIGludCBtVGV4dENvbG9yID0gQ29sb3IuV0hJVEU7Ci0gICAgICAgIHByaXZhdGUgaW50IG1CZ0NvbG9yID0gQ29sb3IuQkxBQ0s7Ci0gICAgICAgIHByaXZhdGUgaW50IG1FZGdlVHlwZSA9IENhcHRpb25TdHlsZS5FREdFX1RZUEVfTk9ORTsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbUVkZ2VDb2xvciA9IENvbG9yLlRSQU5TUEFSRU5UOwotCi0gICAgICAgIENDTGluZUJveChDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgICAgIHN1cGVyKGNvbnRleHQpOwotICAgICAgICAgICAgc2V0R3Jhdml0eShHcmF2aXR5LkNFTlRFUik7Ci0gICAgICAgICAgICBzZXRCYWNrZ3JvdW5kQ29sb3IoQ29sb3IuVFJBTlNQQVJFTlQpOwotICAgICAgICAgICAgc2V0VGV4dENvbG9yKENvbG9yLldISVRFKTsKLSAgICAgICAgICAgIHNldFR5cGVmYWNlKFR5cGVmYWNlLk1PTk9TUEFDRSk7Ci0gICAgICAgICAgICBzZXRWaXNpYmlsaXR5KFZpZXcuSU5WSVNJQkxFKTsKLQotICAgICAgICAgICAgZmluYWwgUmVzb3VyY2VzIHJlcyA9IGdldENvbnRleHQoKS5nZXRSZXNvdXJjZXMoKTsKLQotICAgICAgICAgICAgLy8gZ2V0IHRoZSBkZWZhdWx0ICh3aWxsIGJlIHVwZGF0ZWQgbGF0ZXIgZHVyaW5nIG1lYXN1cmUpCi0gICAgICAgICAgICBtT3V0bGluZVdpZHRoID0gcmVzLmdldERpbWVuc2lvblBpeGVsU2l6ZSgKLSAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5kaW1lbi5zdWJ0aXRsZV9vdXRsaW5lX3dpZHRoKTsKLSAgICAgICAgICAgIG1TaGFkb3dSYWRpdXMgPSByZXMuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKAotICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmRpbWVuLnN1YnRpdGxlX3NoYWRvd19yYWRpdXMpOwotICAgICAgICAgICAgbVNoYWRvd09mZnNldCA9IHJlcy5nZXREaW1lbnNpb25QaXhlbFNpemUoCi0gICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuZGltZW4uc3VidGl0bGVfc2hhZG93X29mZnNldCk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHNldENhcHRpb25TdHlsZShDYXB0aW9uU3R5bGUgY2FwdGlvblN0eWxlKSB7Ci0gICAgICAgICAgICBtVGV4dENvbG9yID0gY2FwdGlvblN0eWxlLmZvcmVncm91bmRDb2xvcjsKLSAgICAgICAgICAgIG1CZ0NvbG9yID0gY2FwdGlvblN0eWxlLmJhY2tncm91bmRDb2xvcjsKLSAgICAgICAgICAgIG1FZGdlVHlwZSA9IGNhcHRpb25TdHlsZS5lZGdlVHlwZTsKLSAgICAgICAgICAgIG1FZGdlQ29sb3IgPSBjYXB0aW9uU3R5bGUuZWRnZUNvbG9yOwotCi0gICAgICAgICAgICBzZXRUZXh0Q29sb3IobVRleHRDb2xvcik7Ci0gICAgICAgICAgICBpZiAobUVkZ2VUeXBlID09IENhcHRpb25TdHlsZS5FREdFX1RZUEVfRFJPUF9TSEFET1cpIHsKLSAgICAgICAgICAgICAgICBzZXRTaGFkb3dMYXllcihtU2hhZG93UmFkaXVzLCBtU2hhZG93T2Zmc2V0LCBtU2hhZG93T2Zmc2V0LCBtRWRnZUNvbG9yKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc2V0U2hhZG93TGF5ZXIoMCwgMCwgMCwgMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnZhbGlkYXRlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25NZWFzdXJlKGludCB3aWR0aE1lYXN1cmVTcGVjLCBpbnQgaGVpZ2h0TWVhc3VyZVNwZWMpIHsKLSAgICAgICAgICAgIGZsb2F0IGZvbnRTaXplID0gTWVhc3VyZVNwZWMuZ2V0U2l6ZShoZWlnaHRNZWFzdXJlU3BlYykgKiBGT05UX1BBRERJTkdfUkFUSU87Ci0gICAgICAgICAgICBzZXRUZXh0U2l6ZShUeXBlZFZhbHVlLkNPTVBMRVhfVU5JVF9QWCwgZm9udFNpemUpOwotCi0gICAgICAgICAgICBtT3V0bGluZVdpZHRoID0gRURHRV9PVVRMSU5FX1JBVElPICogZm9udFNpemUgKyAxLjBmOwotICAgICAgICAgICAgbVNoYWRvd1JhZGl1cyA9IEVER0VfU0hBRE9XX1JBVElPICogZm9udFNpemUgKyAxLjBmOzsKLSAgICAgICAgICAgIG1TaGFkb3dPZmZzZXQgPSBtU2hhZG93UmFkaXVzOwotCi0gICAgICAgICAgICAvLyBzZXQgZm9udCBzY2FsZSBpbiB0aGUgWCBkaXJlY3Rpb24gdG8gbWF0Y2ggdGhlIHJlcXVpcmVkIHdpZHRoCi0gICAgICAgICAgICBzZXRTY2FsZVgoMS4wZik7Ci0gICAgICAgICAgICBnZXRQYWludCgpLmdldFRleHRCb3VuZHMobUR1bW15VGV4dCwgMCwgbUR1bW15VGV4dC5sZW5ndGgoKSwgbVRleHRCb3VuZHMpOwotICAgICAgICAgICAgZmxvYXQgYWN0dWFsVGV4dFdpZHRoID0gbVRleHRCb3VuZHMud2lkdGgoKTsKLSAgICAgICAgICAgIGZsb2F0IHJlcXVpcmVkVGV4dFdpZHRoID0gTWVhc3VyZVNwZWMuZ2V0U2l6ZSh3aWR0aE1lYXN1cmVTcGVjKTsKLSAgICAgICAgICAgIHNldFNjYWxlWChyZXF1aXJlZFRleHRXaWR0aCAvIGFjdHVhbFRleHRXaWR0aCk7Ci0KLSAgICAgICAgICAgIHN1cGVyLm9uTWVhc3VyZSh3aWR0aE1lYXN1cmVTcGVjLCBoZWlnaHRNZWFzdXJlU3BlYyk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25EcmF3KENhbnZhcyBjKSB7Ci0gICAgICAgICAgICBpZiAobUVkZ2VUeXBlID09IENhcHRpb25TdHlsZS5FREdFX1RZUEVfVU5TUEVDSUZJRUQKLSAgICAgICAgICAgICAgICAgICAgfHwgbUVkZ2VUeXBlID09IENhcHRpb25TdHlsZS5FREdFX1RZUEVfTk9ORQotICAgICAgICAgICAgICAgICAgICB8fCBtRWRnZVR5cGUgPT0gQ2FwdGlvblN0eWxlLkVER0VfVFlQRV9EUk9QX1NIQURPVykgewotICAgICAgICAgICAgICAgIC8vIHRoZXNlIGVkZ2Ugc3R5bGVzIGRvbid0IHJlcXVpcmUgYSBzZWNvbmQgcGFzcwotICAgICAgICAgICAgICAgIHN1cGVyLm9uRHJhdyhjKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtRWRnZVR5cGUgPT0gQ2FwdGlvblN0eWxlLkVER0VfVFlQRV9PVVRMSU5FKSB7Ci0gICAgICAgICAgICAgICAgZHJhd0VkZ2VPdXRsaW5lKGMpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBSYWlzZWQgb3IgZGVwcmVzc2VkCi0gICAgICAgICAgICAgICAgZHJhd0VkZ2VSYWlzZWRPckRlcHJlc3NlZChjKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBkcmF3RWRnZU91dGxpbmUoQ2FudmFzIGMpIHsKLSAgICAgICAgICAgIFRleHRQYWludCB0ZXh0UGFpbnQgPSBnZXRQYWludCgpOwotCi0gICAgICAgICAgICBQYWludC5TdHlsZSBwcmV2aW91c1N0eWxlID0gdGV4dFBhaW50LmdldFN0eWxlKCk7Ci0gICAgICAgICAgICBQYWludC5Kb2luIHByZXZpb3VzSm9pbiA9IHRleHRQYWludC5nZXRTdHJva2VKb2luKCk7Ci0gICAgICAgICAgICBmbG9hdCBwcmV2aW91c1dpZHRoID0gdGV4dFBhaW50LmdldFN0cm9rZVdpZHRoKCk7Ci0KLSAgICAgICAgICAgIHNldFRleHRDb2xvcihtRWRnZUNvbG9yKTsKLSAgICAgICAgICAgIHRleHRQYWludC5zZXRTdHlsZShQYWludC5TdHlsZS5GSUxMX0FORF9TVFJPS0UpOwotICAgICAgICAgICAgdGV4dFBhaW50LnNldFN0cm9rZUpvaW4oUGFpbnQuSm9pbi5ST1VORCk7Ci0gICAgICAgICAgICB0ZXh0UGFpbnQuc2V0U3Ryb2tlV2lkdGgobU91dGxpbmVXaWR0aCk7Ci0KLSAgICAgICAgICAgIC8vIERyYXcgb3V0bGluZSBhbmQgYmFja2dyb3VuZCBvbmx5LgotICAgICAgICAgICAgc3VwZXIub25EcmF3KGMpOwotCi0gICAgICAgICAgICAvLyBSZXN0b3JlIG9yaWdpbmFsIHNldHRpbmdzLgotICAgICAgICAgICAgc2V0VGV4dENvbG9yKG1UZXh0Q29sb3IpOwotICAgICAgICAgICAgdGV4dFBhaW50LnNldFN0eWxlKHByZXZpb3VzU3R5bGUpOwotICAgICAgICAgICAgdGV4dFBhaW50LnNldFN0cm9rZUpvaW4ocHJldmlvdXNKb2luKTsKLSAgICAgICAgICAgIHRleHRQYWludC5zZXRTdHJva2VXaWR0aChwcmV2aW91c1dpZHRoKTsKLQotICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBiYWNrZ3JvdW5kLgotICAgICAgICAgICAgc2V0QmFja2dyb3VuZFNwYW5zKENvbG9yLlRSQU5TUEFSRU5UKTsKLSAgICAgICAgICAgIC8vIERyYXcgZm9yZWdyb3VuZCBvbmx5LgotICAgICAgICAgICAgc3VwZXIub25EcmF3KGMpOwotICAgICAgICAgICAgLy8gUmVzdG9yZSB0aGUgYmFja2dyb3VuZC4KLSAgICAgICAgICAgIHNldEJhY2tncm91bmRTcGFucyhtQmdDb2xvcik7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgZHJhd0VkZ2VSYWlzZWRPckRlcHJlc3NlZChDYW52YXMgYykgewotICAgICAgICAgICAgVGV4dFBhaW50IHRleHRQYWludCA9IGdldFBhaW50KCk7Ci0KLSAgICAgICAgICAgIFBhaW50LlN0eWxlIHByZXZpb3VzU3R5bGUgPSB0ZXh0UGFpbnQuZ2V0U3R5bGUoKTsKLSAgICAgICAgICAgIHRleHRQYWludC5zZXRTdHlsZShQYWludC5TdHlsZS5GSUxMKTsKLQotICAgICAgICAgICAgZmluYWwgYm9vbGVhbiByYWlzZWQgPSBtRWRnZVR5cGUgPT0gQ2FwdGlvblN0eWxlLkVER0VfVFlQRV9SQUlTRUQ7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgY29sb3JVcCA9IHJhaXNlZCA/IENvbG9yLldISVRFIDogbUVkZ2VDb2xvcjsKLSAgICAgICAgICAgIGZpbmFsIGludCBjb2xvckRvd24gPSByYWlzZWQgPyBtRWRnZUNvbG9yIDogQ29sb3IuV0hJVEU7Ci0gICAgICAgICAgICBmaW5hbCBmbG9hdCBvZmZzZXQgPSBtU2hhZG93UmFkaXVzIC8gMmY7Ci0KLSAgICAgICAgICAgIC8vIERyYXcgYmFja2dyb3VuZCBhbmQgdGV4dCB3aXRoIHNoYWRvdyB1cAotICAgICAgICAgICAgc2V0U2hhZG93TGF5ZXIobVNoYWRvd1JhZGl1cywgLW9mZnNldCwgLW9mZnNldCwgY29sb3JVcCk7Ci0gICAgICAgICAgICBzdXBlci5vbkRyYXcoYyk7Ci0KLSAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgYmFja2dyb3VuZC4KLSAgICAgICAgICAgIHNldEJhY2tncm91bmRTcGFucyhDb2xvci5UUkFOU1BBUkVOVCk7Ci0KLSAgICAgICAgICAgIC8vIERyYXcgdGV4dCB3aXRoIHNoYWRvdyBkb3duCi0gICAgICAgICAgICBzZXRTaGFkb3dMYXllcihtU2hhZG93UmFkaXVzLCArb2Zmc2V0LCArb2Zmc2V0LCBjb2xvckRvd24pOwotICAgICAgICAgICAgc3VwZXIub25EcmF3KGMpOwotCi0gICAgICAgICAgICAvLyBSZXN0b3JlIHNldHRpbmdzCi0gICAgICAgICAgICB0ZXh0UGFpbnQuc2V0U3R5bGUocHJldmlvdXNTdHlsZSk7Ci0KLSAgICAgICAgICAgIC8vIFJlc3RvcmUgdGhlIGJhY2tncm91bmQuCi0gICAgICAgICAgICBzZXRCYWNrZ3JvdW5kU3BhbnMobUJnQ29sb3IpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHNldEJhY2tncm91bmRTcGFucyhpbnQgY29sb3IpIHsKLSAgICAgICAgICAgIENoYXJTZXF1ZW5jZSB0ZXh0ID0gZ2V0VGV4dCgpOwotICAgICAgICAgICAgaWYgKHRleHQgaW5zdGFuY2VvZiBTcGFubmFibGUpIHsKLSAgICAgICAgICAgICAgICBTcGFubmFibGUgc3Bhbm5hYmxlID0gKFNwYW5uYWJsZSkgdGV4dDsKLSAgICAgICAgICAgICAgICBDZWE2MDhDQ1BhcnNlci5NdXRhYmxlQmFja2dyb3VuZENvbG9yU3BhbltdIGJnU3BhbnMgPSBzcGFubmFibGUuZ2V0U3BhbnMoCi0gICAgICAgICAgICAgICAgICAgICAgICAwLCBzcGFubmFibGUubGVuZ3RoKCksIENlYTYwOENDUGFyc2VyLk11dGFibGVCYWNrZ3JvdW5kQ29sb3JTcGFuLmNsYXNzKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJnU3BhbnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgYmdTcGFuc1tpXS5zZXRCYWNrZ3JvdW5kQ29sb3IoY29sb3IpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIENDTGF5b3V0IGV4dGVuZHMgTGluZWFyTGF5b3V0IGltcGxlbWVudHMgQ2xvc2VkQ2FwdGlvbkxheW91dCB7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfUk9XUyA9IENlYTYwOENDUGFyc2VyLk1BWF9ST1dTOwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdCBTQUZFX0FSRUFfUkFUSU8gPSAwLjlmOwotCi0gICAgICAgIHByaXZhdGUgZmluYWwgQ0NMaW5lQm94W10gbUxpbmVCb3hlcyA9IG5ldyBDQ0xpbmVCb3hbTUFYX1JPV1NdOwotCi0gICAgICAgIENDTGF5b3V0KENvbnRleHQgY29udGV4dCkgewotICAgICAgICAgICAgc3VwZXIoY29udGV4dCk7Ci0gICAgICAgICAgICBzZXRHcmF2aXR5KEdyYXZpdHkuU1RBUlQpOwotICAgICAgICAgICAgc2V0T3JpZW50YXRpb24oTGluZWFyTGF5b3V0LlZFUlRJQ0FMKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX1JPV1M7IGkrKykgewotICAgICAgICAgICAgICAgIG1MaW5lQm94ZXNbaV0gPSBuZXcgQ0NMaW5lQm94KGdldENvbnRleHQoKSk7Ci0gICAgICAgICAgICAgICAgYWRkVmlldyhtTGluZUJveGVzW2ldLCBMYXlvdXRQYXJhbXMuV1JBUF9DT05URU5ULCBMYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRDYXB0aW9uU3R5bGUoQ2FwdGlvblN0eWxlIGNhcHRpb25TdHlsZSkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfUk9XUzsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbUxpbmVCb3hlc1tpXS5zZXRDYXB0aW9uU3R5bGUoY2FwdGlvblN0eWxlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRGb250U2NhbGUoZmxvYXQgZm9udFNjYWxlKSB7Ci0gICAgICAgICAgICAvLyBJZ25vcmVzIHRoZSBmb250IHNjYWxlIGNoYW5nZXMgb2YgdGhlIHN5c3RlbSB3aWRlIENDIHByZWZlcmVuY2UuCi0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHVwZGF0ZShTcGFubmFibGVTdHJpbmdCdWlsZGVyW10gdGV4dEJ1ZmZlcikgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfUk9XUzsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHRleHRCdWZmZXJbaV0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtTGluZUJveGVzW2ldLnNldFRleHQodGV4dEJ1ZmZlcltpXSwgVGV4dFZpZXcuQnVmZmVyVHlwZS5TUEFOTkFCTEUpOwotICAgICAgICAgICAgICAgICAgICBtTGluZUJveGVzW2ldLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtTGluZUJveGVzW2ldLnNldFZpc2liaWxpdHkoVmlldy5JTlZJU0lCTEUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvbk1lYXN1cmUoaW50IHdpZHRoTWVhc3VyZVNwZWMsIGludCBoZWlnaHRNZWFzdXJlU3BlYykgewotICAgICAgICAgICAgc3VwZXIub25NZWFzdXJlKHdpZHRoTWVhc3VyZVNwZWMsIGhlaWdodE1lYXN1cmVTcGVjKTsKLQotICAgICAgICAgICAgaW50IHNhZmVXaWR0aCA9IGdldE1lYXN1cmVkV2lkdGgoKTsKLSAgICAgICAgICAgIGludCBzYWZlSGVpZ2h0ID0gZ2V0TWVhc3VyZWRIZWlnaHQoKTsKLQotICAgICAgICAgICAgLy8gQ0VBLTYwOCBhc3N1bWVzIDQ6MyB2aWRlbwotICAgICAgICAgICAgaWYgKHNhZmVXaWR0aCAqIDMgPj0gc2FmZUhlaWdodCAqIDQpIHsKLSAgICAgICAgICAgICAgICBzYWZlV2lkdGggPSBzYWZlSGVpZ2h0ICogNCAvIDM7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHNhZmVIZWlnaHQgPSBzYWZlV2lkdGggKiAzIC8gNDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNhZmVXaWR0aCAqPSBTQUZFX0FSRUFfUkFUSU87Ci0gICAgICAgICAgICBzYWZlSGVpZ2h0ICo9IFNBRkVfQVJFQV9SQVRJTzsKLQotICAgICAgICAgICAgaW50IGxpbmVIZWlnaHQgPSBzYWZlSGVpZ2h0IC8gTUFYX1JPV1M7Ci0gICAgICAgICAgICBpbnQgbGluZUhlaWdodE1lYXN1cmVTcGVjID0gTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKAotICAgICAgICAgICAgICAgICAgICBsaW5lSGVpZ2h0LCBNZWFzdXJlU3BlYy5FWEFDVExZKTsKLSAgICAgICAgICAgIGludCBsaW5lV2lkdGhNZWFzdXJlU3BlYyA9IE1lYXN1cmVTcGVjLm1ha2VNZWFzdXJlU3BlYygKLSAgICAgICAgICAgICAgICAgICAgc2FmZVdpZHRoLCBNZWFzdXJlU3BlYy5FWEFDVExZKTsKLQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfUk9XUzsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbUxpbmVCb3hlc1tpXS5tZWFzdXJlKGxpbmVXaWR0aE1lYXN1cmVTcGVjLCBsaW5lSGVpZ2h0TWVhc3VyZVNwZWMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIG9uTGF5b3V0KGJvb2xlYW4gY2hhbmdlZCwgaW50IGwsIGludCB0LCBpbnQgciwgaW50IGIpIHsKLSAgICAgICAgICAgIC8vIHNhZmUgY2FwdGlvbiBhcmVhCi0gICAgICAgICAgICBpbnQgdmlld1BvcnRXaWR0aCA9IHIgLSBsOwotICAgICAgICAgICAgaW50IHZpZXdQb3J0SGVpZ2h0ID0gYiAtIHQ7Ci0gICAgICAgICAgICBpbnQgc2FmZVdpZHRoLCBzYWZlSGVpZ2h0OwotICAgICAgICAgICAgLy8gQ0VBLTYwOCBhc3N1bWVzIDQ6MyB2aWRlbwotICAgICAgICAgICAgaWYgKHZpZXdQb3J0V2lkdGggKiAzID49IHZpZXdQb3J0SGVpZ2h0ICogNCkgewotICAgICAgICAgICAgICAgIHNhZmVXaWR0aCA9IHZpZXdQb3J0SGVpZ2h0ICogNCAvIDM7Ci0gICAgICAgICAgICAgICAgc2FmZUhlaWdodCA9IHZpZXdQb3J0SGVpZ2h0OwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzYWZlV2lkdGggPSB2aWV3UG9ydFdpZHRoOwotICAgICAgICAgICAgICAgIHNhZmVIZWlnaHQgPSB2aWV3UG9ydFdpZHRoICogMyAvIDQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzYWZlV2lkdGggKj0gU0FGRV9BUkVBX1JBVElPOwotICAgICAgICAgICAgc2FmZUhlaWdodCAqPSBTQUZFX0FSRUFfUkFUSU87Ci0gICAgICAgICAgICBpbnQgbGVmdCA9ICh2aWV3UG9ydFdpZHRoIC0gc2FmZVdpZHRoKSAvIDI7Ci0gICAgICAgICAgICBpbnQgdG9wID0gKHZpZXdQb3J0SGVpZ2h0IC0gc2FmZUhlaWdodCkgLyAyOwotCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE1BWF9ST1dTOyBpKyspIHsKLSAgICAgICAgICAgICAgICBtTGluZUJveGVzW2ldLmxheW91dCgKLSAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICB0b3AgKyBzYWZlSGVpZ2h0ICogaSAvIE1BWF9ST1dTLAotICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCArIHNhZmVXaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRvcCArIHNhZmVIZWlnaHQgKiAoaSArIDEpIC8gTUFYX1JPV1MpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9zdWJ0aXRsZS9NZWRpYVRpbWVQcm92aWRlci5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9zdWJ0aXRsZS9NZWRpYVRpbWVQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjM2ZDdmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvc3VidGl0bGUvTWVkaWFUaW1lUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQubWVkaWEuc3VidGl0bGU7Ci0KLS8vIE5vdGU6IFRoaXMgaXMganVzdCBjb3BpZWQgZnJvbSBhbmRyb2lkLm1lZGlhLk1lZGlhVGltZVByb3ZpZGVyLgotcHVibGljIGludGVyZmFjZSBNZWRpYVRpbWVQcm92aWRlciB7Ci0gICAgLy8gd2UgZG8gbm90IGFsbG93IG5lZ2F0aXZlIG1lZGlhIHRpbWUKLSAgICAvKioKLSAgICAgKiBQcmVzZW50YXRpb24gdGltZSB2YWx1ZSBpZiBubyB0aW1lZCBldmVudCBub3RpZmljYXRpb24gaXMgcmVxdWVzdGVkLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgbG9uZyBOT19USU1FID0gLTE7Ci0KLSAgICAvKioKLSAgICAgKiBDYW5jZWxzIGFsbCBwcmV2aW91cyBub3RpZmljYXRpb24gcmVxdWVzdCBmcm9tIHRoaXMgbGlzdGVuZXIgaWYgYW55LiAgSXQKLSAgICAgKiByZWdpc3RlcnMgdGhlIGxpc3RlbmVyIHRvIGdldCBzZWVrIGFuZCBzdG9wIG5vdGlmaWNhdGlvbnMuICBJZiB0aW1lVXMgaXMKLSAgICAgKiBub3QgbmVnYXRpdmUsIGl0IGFsc28gcmVnaXN0ZXJzIHRoZSBsaXN0ZW5lciBmb3IgYSB0aW1lZCBldmVudAotICAgICAqIG5vdGlmaWNhdGlvbiB3aGVuIHRoZSBwcmVzZW50YXRpb24gdGltZSByZWFjaGVzIChiZWNvbWVzIGdyZWF0ZXIpIHRoYW4KLSAgICAgKiB0aGUgdmFsdWUgc3BlY2lmaWVkLiAgVGhpcyBoYXBwZW5zIGltbWVkaWF0ZWx5IGlmIHRoZSBjdXJyZW50IG1lZGlhIHRpbWUKLSAgICAgKiBpcyBsYXJnZXIgdGhhbiBvciBlcXVhbCB0byB0aW1lVXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdGltZVVzIHByZXNlbnRhdGlvbiB0aW1lIHRvIGdldCB0aW1lZCBldmVudCBjYWxsYmFjayBhdCAob3IKLSAgICAgKiAgICAgICAgICAgICAgIHtAbGluayAjTk9fVElNRX0pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgbm90aWZ5QXQobG9uZyB0aW1lVXMsIE9uTWVkaWFUaW1lTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0gICAgLyoqCi0gICAgICogQ2FuY2VscyBhbGwgcHJldmlvdXMgbm90aWZpY2F0aW9uIHJlcXVlc3QgZnJvbSB0aGlzIGxpc3RlbmVyIGlmIGFueS4gIEl0Ci0gICAgICogcmVnaXN0ZXJzIHRoZSBsaXN0ZW5lciB0byBnZXQgc2VlayBhbmQgc3RvcCBub3RpZmljYXRpb25zLiAgSWYgdGhlIG1lZGlhCi0gICAgICogaXMgc3RvcHBlZCwgdGhlIGxpc3RlbmVyIHdpbGwgaW1tZWRpYXRlbHkgcmVjZWl2ZSBhIHN0b3Agbm90aWZpY2F0aW9uLgotICAgICAqIE90aGVyd2lzZSwgaXQgd2lsbCByZWNlaXZlIGEgdGltZWQgZXZlbnQgbm90aWZpY2F0b24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2NoZWR1bGVVcGRhdGUoT25NZWRpYVRpbWVMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLSAgICAvKioKLSAgICAgKiBDYW5jZWxzIGFsbCBwcmV2aW91cyBub3RpZmljYXRpb24gcmVxdWVzdCBmcm9tIHRoaXMgbGlzdGVuZXIgaWYgYW55LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNhbmNlbE5vdGlmaWNhdGlvbnMoT25NZWRpYVRpbWVMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGN1cnJlbnQgcHJlc2VudGF0aW9uIHRpbWUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcHJlY2lzZSAgIFdoZXRoZXIgZ2V0dGluZyBhIHByZWNpc2UgdGltZSBpcyBpbXBvcnRhbnQuIFRoaXMgaXMKLSAgICAgKiAgICAgICAgICAgICAgICAgIG1vcmUgY29zdGx5LgotICAgICAqIEBwYXJhbSBtb25vdG9uaWMgV2hldGhlciByZXR1cm5lZCB0aW1lIHNob3VsZCBiZSBtb25vdG9uaWM6IHRoYXQgaXMsCi0gICAgICogICAgICAgICAgICAgICAgICBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGxhc3QgcmV0dXJuZWQgdGltZS4gIERvbid0Ci0gICAgICogICAgICAgICAgICAgICAgICBhbHdheXMgc2V0IHRoaXMgdG8gdHJ1ZS4gIEUuZy4gdGhpcyBoYXMgdW5kZXNpcmVkCi0gICAgICogICAgICAgICAgICAgICAgICBjb25zZXF1ZW5jZXMgaWYgdGhlIG1lZGlhIGlzIHNlZWtlZCBiZXR3ZWVuIGNhbGxzLgotICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZSBtZWRpYSBpcyBub3QgaW5pdGlhbGl6ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgbG9uZyBnZXRDdXJyZW50VGltZVVzKGJvb2xlYW4gcHJlY2lzZSwgYm9vbGVhbiBtb25vdG9uaWMpCi0gICAgICAgICAgICB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uOwotCi0gICAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgT25NZWRpYVRpbWVMaXN0ZW5lciB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgcmVnaXN0ZXJlZCB0aW1lIHdhcyByZWFjaGVkIG5hdHVyYWxseS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHRpbWVVcyBjdXJyZW50IG1lZGlhIHRpbWUKLSAgICAgICAgICovCi0gICAgICAgIHZvaWQgb25UaW1lZEV2ZW50KGxvbmcgdGltZVVzKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIHdoZW4gdGhlIG1lZGlhIHRpbWUgY2hhbmdlZCBkdWUgdG8gc2Vla2luZy4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHRpbWVVcyBjdXJyZW50IG1lZGlhIHRpbWUKLSAgICAgICAgICovCi0gICAgICAgIHZvaWQgb25TZWVrKGxvbmcgdGltZVVzKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIHdoZW4gdGhlIHBsYXliYWNrIHN0b3BwZWQuICBUaGlzIGlzIG5vdCBjYWxsZWQgb24gcGF1c2UsIG9ubHkKLSAgICAgICAgICogb24gZnVsbCBzdG9wLCBhdCB3aGljaCBwb2ludCB0aGVyZSBpcyBubyBmdXJ0aGVyIGN1cnJlbnQgbWVkaWEgdGltZS4KLSAgICAgICAgICovCi0gICAgICAgIHZvaWQgb25TdG9wKCk7Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL3N1YnRpdGxlL1N1YnRpdGxlQ29udHJvbGxlci5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9zdWJ0aXRsZS9TdWJ0aXRsZUNvbnRyb2xsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRkNTVkNy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL3N1YnRpdGxlL1N1YnRpdGxlQ29udHJvbGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTA4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQubWVkaWEuc3VidGl0bGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhRm9ybWF0OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXIyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXIyLlRyYWNrSW5mbzsKLWltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5Mb29wZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwotaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkNhcHRpb25pbmdNYW5hZ2VyOwotCi1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEuc3VidGl0bGUuU3VidGl0bGVUcmFjay5SZW5kZXJpbmdXaWRnZXQ7Ci0KLS8vIE5vdGU6IFRoaXMgaXMgZm9ya2VkIGZyb20gYW5kcm9pZC5tZWRpYS5TdWJ0aXRsZUNvbnRyb2xsZXIgc2luY2UgUAotLyoqCi0gKiBUaGUgc3VidGl0bGUgY29udHJvbGxlciBwcm92aWRlcyB0aGUgYXJjaGl0ZWN0dXJlIHRvIGRpc3BsYXkgc3VidGl0bGVzIGZvciBhCi0gKiBtZWRpYSBzb3VyY2UuICBJdCBhbGxvd3Mgc3BlY2lmeWluZyB3aGljaCB0cmFja3MgdG8gZGlzcGxheSwgb24gd2hpY2ggYW5jaG9yCi0gKiB0byBkaXNwbGF5IHRoZW0sIGFuZCBhbHNvIGFsbG93cyBhZGRpbmcgZXh0ZXJuYWwsIG91dC1vZi1iYW5kIHN1YnRpdGxlIHRyYWNrcy4KLSAqLwotcHVibGljIGNsYXNzIFN1YnRpdGxlQ29udHJvbGxlciB7Ci0gICAgcHJpdmF0ZSBNZWRpYVRpbWVQcm92aWRlciBtVGltZVByb3ZpZGVyOwotICAgIHByaXZhdGUgVmVjdG9yPFJlbmRlcmVyPiBtUmVuZGVyZXJzOwotICAgIHByaXZhdGUgVmVjdG9yPFN1YnRpdGxlVHJhY2s+IG1UcmFja3M7Ci0gICAgcHJpdmF0ZSBTdWJ0aXRsZVRyYWNrIG1TZWxlY3RlZFRyYWNrOwotICAgIHByaXZhdGUgYm9vbGVhbiBtU2hvd2luZzsKLSAgICBwcml2YXRlIENhcHRpb25pbmdNYW5hZ2VyIG1DYXB0aW9uaW5nTWFuYWdlcjsKLSAgICBwcml2YXRlIEhhbmRsZXIgbUhhbmRsZXI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgV0hBVF9TSE9XID0gMTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgV0hBVF9ISURFID0gMjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgV0hBVF9TRUxFQ1RfVFJBQ0sgPSAzOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBXSEFUX1NFTEVDVF9ERUZBVUxUX1RSQUNLID0gNDsKLQotICAgIHByaXZhdGUgZmluYWwgSGFuZGxlci5DYWxsYmFjayBtQ2FsbGJhY2sgPSBuZXcgSGFuZGxlci5DYWxsYmFjaygpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKLSAgICAgICAgICAgIHN3aXRjaCAobXNnLndoYXQpIHsKLSAgICAgICAgICAgIGNhc2UgV0hBVF9TSE9XOgotICAgICAgICAgICAgICAgIGRvU2hvdygpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgY2FzZSBXSEFUX0hJREU6Ci0gICAgICAgICAgICAgICAgZG9IaWRlKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICBjYXNlIFdIQVRfU0VMRUNUX1RSQUNLOgotICAgICAgICAgICAgICAgIGRvU2VsZWN0VHJhY2soKFN1YnRpdGxlVHJhY2spbXNnLm9iaik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICBjYXNlIFdIQVRfU0VMRUNUX0RFRkFVTFRfVFJBQ0s6Ci0gICAgICAgICAgICAgICAgZG9TZWxlY3REZWZhdWx0VHJhY2soKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHByaXZhdGUgQ2FwdGlvbmluZ01hbmFnZXIuQ2FwdGlvbmluZ0NoYW5nZUxpc3RlbmVyIG1DYXB0aW9uaW5nQ2hhbmdlTGlzdGVuZXIgPQotICAgICAgICBuZXcgQ2FwdGlvbmluZ01hbmFnZXIuQ2FwdGlvbmluZ0NoYW5nZUxpc3RlbmVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkVuYWJsZWRDaGFuZ2VkKGJvb2xlYW4gZW5hYmxlZCkgewotICAgICAgICAgICAgICAgIHNlbGVjdERlZmF1bHRUcmFjaygpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uTG9jYWxlQ2hhbmdlZChMb2NhbGUgbG9jYWxlKSB7Ci0gICAgICAgICAgICAgICAgc2VsZWN0RGVmYXVsdFRyYWNrKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0KLSAgICBwdWJsaWMgU3VidGl0bGVDb250cm9sbGVyKENvbnRleHQgY29udGV4dCkgewotICAgICAgICB0aGlzKGNvbnRleHQsIG51bGwsIG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBzdWJ0aXRsZSBjb250cm9sbGVyIGZvciBhIG1lZGlhIHBsYXliYWNrIG9iamVjdCB0aGF0IGltcGxlbWVudHMKLSAgICAgKiB0aGUgTWVkaWFUaW1lUHJvdmlkZXIgaW50ZXJmYWNlLgotICAgICAqCi0gICAgICogQHBhcmFtIHRpbWVQcm92aWRlcgotICAgICAqLwotICAgIHB1YmxpYyBTdWJ0aXRsZUNvbnRyb2xsZXIoCi0gICAgICAgICAgICBDb250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgICBNZWRpYVRpbWVQcm92aWRlciB0aW1lUHJvdmlkZXIsCi0gICAgICAgICAgICBMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICBtVGltZVByb3ZpZGVyID0gdGltZVByb3ZpZGVyOwotICAgICAgICBtTGlzdGVuZXIgPSBsaXN0ZW5lcjsKLQotICAgICAgICBtUmVuZGVyZXJzID0gbmV3IFZlY3RvcjxSZW5kZXJlcj4oKTsKLSAgICAgICAgbVNob3dpbmcgPSBmYWxzZTsKLSAgICAgICAgbVRyYWNrcyA9IG5ldyBWZWN0b3I8U3VidGl0bGVUcmFjaz4oKTsKLSAgICAgICAgbUNhcHRpb25pbmdNYW5hZ2VyID0KLSAgICAgICAgICAgIChDYXB0aW9uaW5nTWFuYWdlciljb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5DQVBUSU9OSU5HX1NFUlZJQ0UpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIG1DYXB0aW9uaW5nTWFuYWdlci5yZW1vdmVDYXB0aW9uaW5nQ2hhbmdlTGlzdGVuZXIoCi0gICAgICAgICAgICAgICAgbUNhcHRpb25pbmdDaGFuZ2VMaXN0ZW5lcik7Ci0gICAgICAgIHN1cGVyLmZpbmFsaXplKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgYXZhaWxhYmxlIHN1YnRpdGxlIHRyYWNrcyBmb3IgdGhpcyBtZWRpYS4gVGhlc2UgaW5jbHVkZQotICAgICAqIHRoZSB0cmFja3MgZm91bmQgYnkge0BsaW5rIE1lZGlhUGxheWVyfSBhcyB3ZWxsIGFzIGFueSB0cmFja3MgYWRkZWQKLSAgICAgKiBtYW51YWxseSB2aWEge0BsaW5rICNhZGRUcmFja30uCi0gICAgICovCi0gICAgcHVibGljIFN1YnRpdGxlVHJhY2tbXSBnZXRUcmFja3MoKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZChtVHJhY2tzKSB7Ci0gICAgICAgICAgICBTdWJ0aXRsZVRyYWNrW10gdHJhY2tzID0gbmV3IFN1YnRpdGxlVHJhY2tbbVRyYWNrcy5zaXplKCldOwotICAgICAgICAgICAgbVRyYWNrcy50b0FycmF5KHRyYWNrcyk7Ci0gICAgICAgICAgICByZXR1cm4gdHJhY2tzOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHN1YnRpdGxlIHRyYWNrCi0gICAgICovCi0gICAgcHVibGljIFN1YnRpdGxlVHJhY2sgZ2V0U2VsZWN0ZWRUcmFjaygpIHsKLSAgICAgICAgcmV0dXJuIG1TZWxlY3RlZFRyYWNrOwotICAgIH0KLQotICAgIHByaXZhdGUgUmVuZGVyaW5nV2lkZ2V0IGdldFJlbmRlcmluZ1dpZGdldCgpIHsKLSAgICAgICAgaWYgKG1TZWxlY3RlZFRyYWNrID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtU2VsZWN0ZWRUcmFjay5nZXRSZW5kZXJpbmdXaWRnZXQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZWxlY3RzIGEgc3VidGl0bGUgdHJhY2suICBBcyBhIHJlc3VsdCwgdGhpcyB0cmFjayB3aWxsIHJlY2VpdmUKLSAgICAgKiBpbi1iYW5kIGRhdGEgZnJvbSB0aGUge0BsaW5rIE1lZGlhUGxheWVyfS4gIEhvd2V2ZXIsIHRoaXMgZG9lcwotICAgICAqIG5vdCBjaGFuZ2UgdGhlIHN1YnRpdGxlIHZpc2liaWxpdHkuCi0gICAgICoKLSAgICAgKiBTaG91bGQgYmUgY2FsbGVkIGZyb20gdGhlIGFuY2hvcidzIChVSSkgdGhyZWFkLiB7QHNlZSAjQW5jaG9yLmdldFN1YnRpdGxlTG9vcGVyfQotICAgICAqCi0gICAgICogQHBhcmFtIHRyYWNrIFRoZSBzdWJ0aXRsZSB0cmFjayB0byBzZWxlY3QuICBUaGlzIG11c3QgYmUgb25lIG9mIHRoZQotICAgICAqICAgICAgICAgICAgICB0cmFja3MgaW4ge0BsaW5rICNnZXRUcmFja3N9LgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdHJhY2sgd2FzIHN1Y2Nlc3NmdWxseSBzZWxlY3RlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBzZWxlY3RUcmFjayhTdWJ0aXRsZVRyYWNrIHRyYWNrKSB7Ci0gICAgICAgIGlmICh0cmFjayAhPSBudWxsICYmICFtVHJhY2tzLmNvbnRhaW5zKHRyYWNrKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvY2Vzc09uQW5jaG9yKG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoV0hBVF9TRUxFQ1RfVFJBQ0ssIHRyYWNrKSk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBkb1NlbGVjdFRyYWNrKFN1YnRpdGxlVHJhY2sgdHJhY2spIHsKLSAgICAgICAgbVRyYWNrSXNFeHBsaWNpdCA9IHRydWU7Ci0gICAgICAgIGlmIChtU2VsZWN0ZWRUcmFjayA9PSB0cmFjaykgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1TZWxlY3RlZFRyYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1TZWxlY3RlZFRyYWNrLmhpZGUoKTsKLSAgICAgICAgICAgIG1TZWxlY3RlZFRyYWNrLnNldFRpbWVQcm92aWRlcihudWxsKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1TZWxlY3RlZFRyYWNrID0gdHJhY2s7Ci0gICAgICAgIGlmIChtQW5jaG9yICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1BbmNob3Iuc2V0U3VidGl0bGVXaWRnZXQoZ2V0UmVuZGVyaW5nV2lkZ2V0KCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1TZWxlY3RlZFRyYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1TZWxlY3RlZFRyYWNrLnNldFRpbWVQcm92aWRlcihtVGltZVByb3ZpZGVyKTsKLSAgICAgICAgICAgIG1TZWxlY3RlZFRyYWNrLnNob3coKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtTGlzdGVuZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbUxpc3RlbmVyLm9uU3VidGl0bGVUcmFja1NlbGVjdGVkKHRyYWNrKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIGRlZmF1bHQgc3VidGl0bGUgdHJhY2sgYmFzZWQgb24gc3lzdGVtIHByZWZlcmVuY2VzLCBvciBudWxsLAotICAgICAqIGlmIG5vIHN1Y2ggdHJhY2sgZXhpc3RzIGluIHRoaXMgbWFuYWdlci4KLSAgICAgKgotICAgICAqIFN1cHBvcnRzIEhMUy1mbGFnczogQVVUT1NFTEVDVCwgRk9SQ0VEICYgREVGQVVMVC4KLSAgICAgKgotICAgICAqIDEuIElmIGNhcHRpb25pbmcgaXMgZGlzYWJsZWQsIG9ubHkgY29uc2lkZXIgRk9SQ0VEIHRyYWNrcy4gT3RoZXJ3aXNlLAotICAgICAqIGNvbnNpZGVyIGFsbCB0cmFja3MsIGJ1dCBwcmVmZXIgbm9uLUZPUkNFRCBvbmVzLgotICAgICAqIDIuIElmIHVzZXIgc2VsZWN0ZWQgIkRlZmF1bHQiIGNhcHRpb24gbGFuZ3VhZ2U6Ci0gICAgICogICBhLiBJZiB0aGVyZSBpcyBhIGNvbnNpZGVyZWQgdHJhY2sgd2l0aCBERUZBVUxUPXllcywgcmV0dXJucyB0aGF0IHRyYWNrCi0gICAgICogICAgICAoZmF2b3IgdGhlIGZpcnN0IG9uZSBpbiB0aGUgY3VycmVudCBsYW5ndWFnZSBpZiB0aGVyZSBhcmUgbW9yZSB0aGFuCi0gICAgICogICAgICBvbmUgZGVmYXVsdCB0cmFja3MsIG9yIHRoZSBmaXJzdCBpbiBnZW5lcmFsIGlmIG5vbmUgb2YgdGhlbSBhcmUgaW4KLSAgICAgKiAgICAgIHRoZSBjdXJyZW50IGxhbmd1YWdlKS4KLSAgICAgKiAgIGIuIE90aGVyd2lzZSwgaWYgdGhlcmUgaXMgYSB0cmFjayB3aXRoIEFVVE9TRUxFQ1Q9eWVzIGluIHRoZSBjdXJyZW50Ci0gICAgICogICAgICBsYW5ndWFnZSwgcmV0dXJuIHRoYXQgb25lLgotICAgICAqICAgYy4gSWYgdGhlcmUgYXJlIG5vIGRlZmF1bHQgdHJhY2tzLCBhbmQgbm8gYXV0b3NlbGVjdGFibGUgdHJhY2tzIGluIHRoZQotICAgICAqICAgICAgY3VycmVudCBsYW5ndWFnZSwgcmV0dXJuIG51bGwuCi0gICAgICogMy4gSWYgdGhlcmUgaXMgYSB0cmFjayB3aXRoIHRoZSBjYXB0aW9uIGxhbmd1YWdlLCBzZWxlY3QgdGhhdCBvbmUuICBQcmVmZXIKLSAgICAgKiB0aGUgb25lIHdpdGggQVVUT1NFTEVDVD1uby4KLSAgICAgKgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlcyBmb3IgdGhlc2UgZmxhZ3MgYXJlIERFRkFVTFQ9bm8sIEFVVE9TRUxFQ1Q9eWVzCi0gICAgICogYW5kIEZPUkNFRD1uby4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3VidGl0bGVUcmFjayBnZXREZWZhdWx0VHJhY2soKSB7Ci0gICAgICAgIFN1YnRpdGxlVHJhY2sgYmVzdFRyYWNrID0gbnVsbDsKLSAgICAgICAgaW50IGJlc3RTY29yZSA9IC0xOwotCi0gICAgICAgIExvY2FsZSBzZWxlY3RlZExvY2FsZSA9IG1DYXB0aW9uaW5nTWFuYWdlci5nZXRMb2NhbGUoKTsKLSAgICAgICAgTG9jYWxlIGxvY2FsZSA9IHNlbGVjdGVkTG9jYWxlOwotICAgICAgICBpZiAobG9jYWxlID09IG51bGwpIHsKLSAgICAgICAgICAgIGxvY2FsZSA9IExvY2FsZS5nZXREZWZhdWx0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgYm9vbGVhbiBzZWxlY3RGb3JjZWQgPSAhbUNhcHRpb25pbmdNYW5hZ2VyLmlzRW5hYmxlZCgpOwotCi0gICAgICAgIHN5bmNocm9uaXplZChtVHJhY2tzKSB7Ci0gICAgICAgICAgICBmb3IgKFN1YnRpdGxlVHJhY2sgdHJhY2s6IG1UcmFja3MpIHsKLSAgICAgICAgICAgICAgICBNZWRpYUZvcm1hdCBmb3JtYXQgPSB0cmFjay5nZXRGb3JtYXQoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbGFuZ3VhZ2UgPSBmb3JtYXQuZ2V0U3RyaW5nKE1lZGlhRm9ybWF0LktFWV9MQU5HVUFHRSk7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBmb3JjZWQgPQotICAgICAgICAgICAgICAgICAgICBmb3JtYXQuZ2V0SW50ZWdlcihNZWRpYUZvcm1hdC5LRVlfSVNfRk9SQ0VEX1NVQlRJVExFLCAwKSAhPSAwOwotICAgICAgICAgICAgICAgIGJvb2xlYW4gYXV0b3NlbGVjdCA9Ci0gICAgICAgICAgICAgICAgICAgIGZvcm1hdC5nZXRJbnRlZ2VyKE1lZGlhRm9ybWF0LktFWV9JU19BVVRPU0VMRUNULCAxKSAhPSAwOwotICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNfZGVmYXVsdCA9Ci0gICAgICAgICAgICAgICAgICAgIGZvcm1hdC5nZXRJbnRlZ2VyKE1lZGlhRm9ybWF0LktFWV9JU19ERUZBVUxULCAwKSAhPSAwOwotCi0gICAgICAgICAgICAgICAgYm9vbGVhbiBsYW5ndWFnZU1hdGNoZXMgPQotICAgICAgICAgICAgICAgICAgICAobG9jYWxlID09IG51bGwgfHwKLSAgICAgICAgICAgICAgICAgICAgbG9jYWxlLmdldExhbmd1YWdlKCkuZXF1YWxzKCIiKSB8fAotICAgICAgICAgICAgICAgICAgICBsb2NhbGUuZ2V0SVNPM0xhbmd1YWdlKCkuZXF1YWxzKGxhbmd1YWdlKSB8fAotICAgICAgICAgICAgICAgICAgICBsb2NhbGUuZ2V0TGFuZ3VhZ2UoKS5lcXVhbHMobGFuZ3VhZ2UpKTsKLSAgICAgICAgICAgICAgICAvLyBpc19kZWZhdWx0IGlzIG1lYW5pbmdsZXNzIHVubGVzcyBjYXB0aW9uIGxhbmd1YWdlIGlzICdkZWZhdWx0JwotICAgICAgICAgICAgICAgIGludCBzY29yZSA9IChmb3JjZWQgPyAwIDogOCkgKwotICAgICAgICAgICAgICAgICAgICAoKChzZWxlY3RlZExvY2FsZSA9PSBudWxsKSAmJiBpc19kZWZhdWx0KSA/IDQgOiAwKSArCi0gICAgICAgICAgICAgICAgICAgIChhdXRvc2VsZWN0ID8gMCA6IDIpICsgKGxhbmd1YWdlTWF0Y2hlcyA/IDEgOiAwKTsKLQotICAgICAgICAgICAgICAgIGlmIChzZWxlY3RGb3JjZWQgJiYgIWZvcmNlZCkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyB3ZSB0cmVhdCBudWxsIGxvY2FsZS9sYW5ndWFnZSBhcyBtYXRjaGluZyBhbnkgbGFuZ3VhZ2UKLSAgICAgICAgICAgICAgICBpZiAoKHNlbGVjdGVkTG9jYWxlID09IG51bGwgJiYgaXNfZGVmYXVsdCkgfHwKLSAgICAgICAgICAgICAgICAgICAgKGxhbmd1YWdlTWF0Y2hlcyAmJgotICAgICAgICAgICAgICAgICAgICAgKGF1dG9zZWxlY3QgfHwgZm9yY2VkIHx8IHNlbGVjdGVkTG9jYWxlICE9IG51bGwpKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoc2NvcmUgPiBiZXN0U2NvcmUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RTY29yZSA9IHNjb3JlOwotICAgICAgICAgICAgICAgICAgICAgICAgYmVzdFRyYWNrID0gdHJhY2s7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJlc3RUcmFjazsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gbVRyYWNrSXNFeHBsaWNpdCA9IGZhbHNlOwotICAgIHByaXZhdGUgYm9vbGVhbiBtVmlzaWJpbGl0eUlzRXhwbGljaXQgPSBmYWxzZTsKLQotICAgIC8qKiBzaG91bGQgYmUgY2FsbGVkIGZyb20gYW5jaG9yIHRocmVhZCAqLwotICAgIHB1YmxpYyB2b2lkIHNlbGVjdERlZmF1bHRUcmFjaygpIHsKLSAgICAgICAgcHJvY2Vzc09uQW5jaG9yKG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoV0hBVF9TRUxFQ1RfREVGQVVMVF9UUkFDSykpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBkb1NlbGVjdERlZmF1bHRUcmFjaygpIHsKLSAgICAgICAgaWYgKG1UcmFja0lzRXhwbGljaXQpIHsKLSAgICAgICAgICAgIC8vIElmIHRyYWNrIHNlbGVjdGlvbiBpcyBleHBsaWNpdCwgYnV0IHZpc2liaWxpdHkKLSAgICAgICAgICAgIC8vIGlzIG5vdCwgaXQgZmFsbHMgYmFjayB0byB0aGUgY2FwdGlvbmluZyBzZXR0aW5nCi0gICAgICAgICAgICBpZiAoIW1WaXNpYmlsaXR5SXNFeHBsaWNpdCkgewotICAgICAgICAgICAgICAgIGlmIChtQ2FwdGlvbmluZ01hbmFnZXIuaXNFbmFibGVkKCkgfHwKLSAgICAgICAgICAgICAgICAgICAgKG1TZWxlY3RlZFRyYWNrICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAgICAgIG1TZWxlY3RlZFRyYWNrLmdldEZvcm1hdCgpLmdldEludGVnZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFGb3JtYXQuS0VZX0lTX0ZPUkNFRF9TVUJUSVRMRSwgMCkgIT0gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgc2hvdygpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobVNlbGVjdGVkVHJhY2sgIT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAgICAgJiYgbVNlbGVjdGVkVHJhY2suZ2V0VHJhY2tUeXBlKCkgPT0gVHJhY2tJbmZvLk1FRElBX1RSQUNLX1RZUEVfU1VCVElUTEUpIHsKLSAgICAgICAgICAgICAgICAgICAgaGlkZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtVmlzaWJpbGl0eUlzRXhwbGljaXQgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFdlIGNhbiBoYXZlIGEgZGVmYXVsdCAoZm9yY2VkKSB0cmFjayBldmVuIGlmIGNhcHRpb25pbmcKLSAgICAgICAgLy8gaXMgbm90IGVuYWJsZWQuICBUaGlzIGlzIGhhbmRsZWQgYnkgZ2V0RGVmYXVsdFRyYWNrKCkuCi0gICAgICAgIC8vIFNob3cgdGhpcyB0cmFjayB1bmxlc3Mgc3VidGl0bGVzIHdlcmUgZXhwbGljaXRseSBoaWRkZW4uCi0gICAgICAgIFN1YnRpdGxlVHJhY2sgdHJhY2sgPSBnZXREZWZhdWx0VHJhY2soKTsKLSAgICAgICAgaWYgKHRyYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNlbGVjdFRyYWNrKHRyYWNrKTsKLSAgICAgICAgICAgIG1UcmFja0lzRXhwbGljaXQgPSBmYWxzZTsKLSAgICAgICAgICAgIGlmICghbVZpc2liaWxpdHlJc0V4cGxpY2l0KSB7Ci0gICAgICAgICAgICAgICAgc2hvdygpOwotICAgICAgICAgICAgICAgIG1WaXNpYmlsaXR5SXNFeHBsaWNpdCA9IGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqIG11c3QgYmUgY2FsbGVkIGZyb20gYW5jaG9yIHRocmVhZCAqLwotICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgewotICAgICAgICBjaGVja0FuY2hvckxvb3BlcigpOwotICAgICAgICBoaWRlKCk7Ci0gICAgICAgIHNlbGVjdFRyYWNrKG51bGwpOwotICAgICAgICBtVHJhY2tzLmNsZWFyKCk7Ci0gICAgICAgIG1UcmFja0lzRXhwbGljaXQgPSBmYWxzZTsKLSAgICAgICAgbVZpc2liaWxpdHlJc0V4cGxpY2l0ID0gZmFsc2U7Ci0gICAgICAgIG1DYXB0aW9uaW5nTWFuYWdlci5yZW1vdmVDYXB0aW9uaW5nQ2hhbmdlTGlzdGVuZXIoCi0gICAgICAgICAgICAgICAgbUNhcHRpb25pbmdDaGFuZ2VMaXN0ZW5lcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIG5ldywgZXh0ZXJuYWwgc3VidGl0bGUgdHJhY2sgdG8gdGhlIG1hbmFnZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZm9ybWF0IHRoZSBmb3JtYXQgb2YgdGhlIHRyYWNrIHRoYXQgd2lsbCBpbmNsdWRlIGF0IGxlYXN0Ci0gICAgICogICAgICAgICAgICAgICB0aGUgTUlNRSB0eXBlIHtAbGluayBNZWRpYUZvcm1hdEBLRVlfTUlNRX0uCi0gICAgICogQHJldHVybiB0aGUgY3JlYXRlZCB7QGxpbmsgU3VidGl0bGVUcmFja30gb2JqZWN0Ci0gICAgICovCi0gICAgcHVibGljIFN1YnRpdGxlVHJhY2sgYWRkVHJhY2soTWVkaWFGb3JtYXQgZm9ybWF0KSB7Ci0gICAgICAgIHN5bmNocm9uaXplZChtUmVuZGVyZXJzKSB7Ci0gICAgICAgICAgICBmb3IgKFJlbmRlcmVyIHJlbmRlcmVyOiBtUmVuZGVyZXJzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHJlbmRlcmVyLnN1cHBvcnRzKGZvcm1hdCkpIHsKLSAgICAgICAgICAgICAgICAgICAgU3VidGl0bGVUcmFjayB0cmFjayA9IHJlbmRlcmVyLmNyZWF0ZVRyYWNrKGZvcm1hdCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0cmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQobVRyYWNrcykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtVHJhY2tzLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DYXB0aW9uaW5nTWFuYWdlci5hZGRDYXB0aW9uaW5nQ2hhbmdlTGlzdGVuZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNhcHRpb25pbmdDaGFuZ2VMaXN0ZW5lcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1UcmFja3MuYWRkKHRyYWNrKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cmFjazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTaG93IHRoZSBzZWxlY3RlZCAob3IgZGVmYXVsdCkgc3VidGl0bGUgdHJhY2suCi0gICAgICoKLSAgICAgKiBTaG91bGQgYmUgY2FsbGVkIGZyb20gdGhlIGFuY2hvcidzIChVSSkgdGhyZWFkLiB7QHNlZSAjQW5jaG9yLmdldFN1YnRpdGxlTG9vcGVyfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNob3coKSB7Ci0gICAgICAgIHByb2Nlc3NPbkFuY2hvcihtSGFuZGxlci5vYnRhaW5NZXNzYWdlKFdIQVRfU0hPVykpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBkb1Nob3coKSB7Ci0gICAgICAgIG1TaG93aW5nID0gdHJ1ZTsKLSAgICAgICAgbVZpc2liaWxpdHlJc0V4cGxpY2l0ID0gdHJ1ZTsKLSAgICAgICAgaWYgKG1TZWxlY3RlZFRyYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1TZWxlY3RlZFRyYWNrLnNob3coKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEhpZGUgdGhlIHNlbGVjdGVkIChvciBkZWZhdWx0KSBzdWJ0aXRsZSB0cmFjay4KLSAgICAgKgotICAgICAqIFNob3VsZCBiZSBjYWxsZWQgZnJvbSB0aGUgYW5jaG9yJ3MgKFVJKSB0aHJlYWQuIHtAc2VlICNBbmNob3IuZ2V0U3VidGl0bGVMb29wZXJ9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgaGlkZSgpIHsKLSAgICAgICAgcHJvY2Vzc09uQW5jaG9yKG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoV0hBVF9ISURFKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGRvSGlkZSgpIHsKLSAgICAgICAgbVZpc2liaWxpdHlJc0V4cGxpY2l0ID0gdHJ1ZTsKLSAgICAgICAgaWYgKG1TZWxlY3RlZFRyYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1TZWxlY3RlZFRyYWNrLmhpZGUoKTsKLSAgICAgICAgfQotICAgICAgICBtU2hvd2luZyA9IGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEludGVyZmFjZSBmb3Igc3VwcG9ydGluZyBhIHNpbmdsZSBvciBtdWx0aXBsZSBzdWJ0aXRsZSB0eXBlcyBpbiB7QGxpbmsKLSAgICAgKiBNZWRpYVBsYXllcn0uCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IHN0YXRpYyBjbGFzcyBSZW5kZXJlciB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgYnkge0BsaW5rIE1lZGlhUGxheWVyfSdzIHtAbGluayBTdWJ0aXRsZUNvbnRyb2xsZXJ9IHdoZW4gYSBuZXcKLSAgICAgICAgICogc3VidGl0bGUgdHJhY2sgaXMgZGV0ZWN0ZWQsIHRvIHNlZSBpZiBpdCBzaG91bGQgdXNlIHRoaXMgb2JqZWN0IHRvCi0gICAgICAgICAqIHBhcnNlIGFuZCBkaXNwbGF5IHRoaXMgc3VidGl0bGUgdHJhY2suCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBmb3JtYXQgdGhlIGZvcm1hdCBvZiB0aGUgdHJhY2sgdGhhdCB3aWxsIGluY2x1ZGUgYXQgbGVhc3QKLSAgICAgICAgICogICAgICAgICAgICAgICB0aGUgTUlNRSB0eXBlIHtAbGluayBNZWRpYUZvcm1hdEBLRVlfTUlNRX0uCi0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBhbmQgb25seSBpZiB0aGUgdHJhY2sgZm9ybWF0IGlzIHN1cHBvcnRlZCBieSB0aGlzCi0gICAgICAgICAqIHJlbmRlcmVyCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBzdXBwb3J0cyhNZWRpYUZvcm1hdCBmb3JtYXQpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgYnkge0BsaW5rIE1lZGlhUGxheWVyfSdzIHtAbGluayBTdWJ0aXRsZUNvbnRyb2xsZXJ9IGZvciBlYWNoCi0gICAgICAgICAqIHN1YnRpdGxlIHRyYWNrIHRoYXQgd2FzIGRldGVjdGVkIGFuZCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyBvYmplY3QgdG8KLSAgICAgICAgICogY3JlYXRlIGEge0BsaW5rIFN1YnRpdGxlVHJhY2t9IG9iamVjdC4gIFRoaXMgb2JqZWN0IHdpbGwgYmUgY3JlYXRlZAotICAgICAgICAgKiBmb3IgZWFjaCB0cmFjayB0aGF0IHdhcyBmb3VuZC4gIElmIHRoZSB0cmFjayBpcyBzZWxlY3RlZCBmb3IgZGlzcGxheSwKLSAgICAgICAgICogdGhpcyBvYmplY3Qgd2lsbCBiZSB1c2VkIHRvIHBhcnNlIGFuZCBkaXNwbGF5IHRoZSB0cmFjayBkYXRhLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gZm9ybWF0IHRoZSBmb3JtYXQgb2YgdGhlIHRyYWNrIHRoYXQgd2lsbCBpbmNsdWRlIGF0IGxlYXN0Ci0gICAgICAgICAqICAgICAgICAgICAgICAgdGhlIE1JTUUgdHlwZSB7QGxpbmsgTWVkaWFGb3JtYXRAS0VZX01JTUV9LgotICAgICAgICAgKiBAcmV0dXJuIGEge0BsaW5rIFN1YnRpdGxlVHJhY2t9IG9iamVjdCB0aGF0IHdpbGwgYmUgdXNlZCB0byBwYXJzZQotICAgICAgICAgKiBhbmQgcmVuZGVyIHRoZSBzdWJ0aXRsZSB0cmFjay4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBhYnN0cmFjdCBTdWJ0aXRsZVRyYWNrIGNyZWF0ZVRyYWNrKE1lZGlhRm9ybWF0IGZvcm1hdCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkIHN1cHBvcnQgZm9yIGEgc3VidGl0bGUgZm9ybWF0IGluIHtAbGluayBNZWRpYVBsYXllcn0uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcmVuZGVyZXIgYSB7QGxpbmsgU3VidGl0bGVDb250cm9sbGVyLlJlbmRlcmVyfSBvYmplY3QgdGhhdCBhZGRzCi0gICAgICogICAgICAgICAgICAgICAgIHN1cHBvcnQgZm9yIGEgc3VidGl0bGUgZm9ybWF0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyUmVuZGVyZXIoUmVuZGVyZXIgcmVuZGVyZXIpIHsKLSAgICAgICAgc3luY2hyb25pemVkKG1SZW5kZXJlcnMpIHsKLSAgICAgICAgICAgIC8vIFRPRE8gaG93IHRvIGdldCBhdmFpbGFibGUgcmVuZGVyZXJzIGluIHRoZSBzeXN0ZW0KLSAgICAgICAgICAgIGlmICghbVJlbmRlcmVycy5jb250YWlucyhyZW5kZXJlcikpIHsKLSAgICAgICAgICAgICAgICAvLyBUT0RPIHNob3VsZCBhZGRlZCByZW5kZXJlcnMgb3ZlcnJpZGUgZXhpc3Rpbmcgb25lcyAodG8gYWxsb3cgcmVwbGFjaW5nPykKLSAgICAgICAgICAgICAgICBtUmVuZGVyZXJzLmFkZChyZW5kZXJlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNSZW5kZXJlckZvcihNZWRpYUZvcm1hdCBmb3JtYXQpIHsKLSAgICAgICAgc3luY2hyb25pemVkKG1SZW5kZXJlcnMpIHsKLSAgICAgICAgICAgIC8vIFRPRE8gaG93IHRvIGdldCBhdmFpbGFibGUgcmVuZGVyZXJzIGluIHRoZSBzeXN0ZW0KLSAgICAgICAgICAgIGZvciAoUmVuZGVyZXIgcmVuZGVyZXI6IG1SZW5kZXJlcnMpIHsKLSAgICAgICAgICAgICAgICBpZiAocmVuZGVyZXIuc3VwcG9ydHMoZm9ybWF0KSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdWJ0aXRsZSBhbmNob3IsIGFuIG9iamVjdCB0aGF0IGlzIGFibGUgdG8gZGlzcGxheSBhIHN1YnRpdGxlIHJlbmRlcmVyLAotICAgICAqIGUuZy4gYSBWaWRlb1ZpZXcuCi0gICAgICovCi0gICAgcHVibGljIGludGVyZmFjZSBBbmNob3IgewotICAgICAgICAvKioKLSAgICAgICAgICogQW5jaG9yIHNob3VsZCB1c2UgdGhlIHN1cHBsaWVkIHN1YnRpdGxlIHJlbmRlcmluZyB3aWRnZXQsIG9yCi0gICAgICAgICAqIG5vbmUgaWYgaXQgaXMgbnVsbC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFN1YnRpdGxlV2lkZ2V0KFJlbmRlcmluZ1dpZGdldCBzdWJ0aXRsZVdpZGdldCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFuY2hvcnMgcHJvdmlkZSB0aGUgbG9vcGVyIG9uIHdoaWNoIGFsbCB0cmFjayB2aXNpYmlsaXR5IGNoYW5nZXMKLSAgICAgICAgICogKHRyYWNrLnNob3cvaGlkZSwgc2V0U3VidGl0bGVXaWRnZXQpIHdpbGwgdGFrZSBwbGFjZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBMb29wZXIgZ2V0U3VidGl0bGVMb29wZXIoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEFuY2hvciBtQW5jaG9yOwotCi0gICAgLyoqCi0gICAgICogIGNhbGxlZCBmcm9tIGFuY2hvcidzIGxvb3BlciAoaWYgYW55LCBib3RoIHdoZW4gdW5zZXR0aW5nIGFuZAotICAgICAqICBzZXR0aW5nKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEFuY2hvcihBbmNob3IgYW5jaG9yKSB7Ci0gICAgICAgIGlmIChtQW5jaG9yID09IGFuY2hvcikgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1BbmNob3IgIT0gbnVsbCkgewotICAgICAgICAgICAgY2hlY2tBbmNob3JMb29wZXIoKTsKLSAgICAgICAgICAgIG1BbmNob3Iuc2V0U3VidGl0bGVXaWRnZXQobnVsbCk7Ci0gICAgICAgIH0KLSAgICAgICAgbUFuY2hvciA9IGFuY2hvcjsKLSAgICAgICAgbUhhbmRsZXIgPSBudWxsOwotICAgICAgICBpZiAobUFuY2hvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtSGFuZGxlciA9IG5ldyBIYW5kbGVyKG1BbmNob3IuZ2V0U3VidGl0bGVMb29wZXIoKSwgbUNhbGxiYWNrKTsKLSAgICAgICAgICAgIGNoZWNrQW5jaG9yTG9vcGVyKCk7Ci0gICAgICAgICAgICBtQW5jaG9yLnNldFN1YnRpdGxlV2lkZ2V0KGdldFJlbmRlcmluZ1dpZGdldCgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjaGVja0FuY2hvckxvb3BlcigpIHsKLSAgICAgICAgYXNzZXJ0IG1IYW5kbGVyICE9IG51bGwgOiAiU2hvdWxkIGhhdmUgYSBsb29wZXIgYWxyZWFkeSI7Ci0gICAgICAgIGFzc2VydCBMb29wZXIubXlMb29wZXIoKSA9PSBtSGFuZGxlci5nZXRMb29wZXIoKQotICAgICAgICAgICAgICAgIDogIk11c3QgYmUgY2FsbGVkIGZyb20gdGhlIGFuY2hvcidzIGxvb3BlciI7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NPbkFuY2hvcihNZXNzYWdlIG0pIHsKLSAgICAgICAgYXNzZXJ0IG1IYW5kbGVyICE9IG51bGwgOiAiU2hvdWxkIGhhdmUgYSBsb29wZXIgYWxyZWFkeSI7Ci0gICAgICAgIGlmIChMb29wZXIubXlMb29wZXIoKSA9PSBtSGFuZGxlci5nZXRMb29wZXIoKSkgewotICAgICAgICAgICAgbUhhbmRsZXIuZGlzcGF0Y2hNZXNzYWdlKG0pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUhhbmRsZXIuc2VuZE1lc3NhZ2UobSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50ZXJmYWNlIExpc3RlbmVyIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxlZCB3aGVuIGEgc3VidGl0bGUgdHJhY2sgaGFzIGJlZW4gc2VsZWN0ZWQuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSB0cmFjayBzZWxlY3RlZCBzdWJ0aXRsZSB0cmFjayBvciBudWxsCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBvblN1YnRpdGxlVHJhY2tTZWxlY3RlZChTdWJ0aXRsZVRyYWNrIHRyYWNrKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIExpc3RlbmVyIG1MaXN0ZW5lcjsKLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvc3VidGl0bGUvU3VidGl0bGVUcmFjay5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9zdWJ0aXRsZS9TdWJ0aXRsZVRyYWNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiOTA2NGEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9zdWJ0aXRsZS9TdWJ0aXRsZVRyYWNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OTYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5tZWRpYS5zdWJ0aXRsZTsKLQotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFGb3JtYXQ7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllcjIuVHJhY2tJbmZvOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuU3VidGl0bGVEYXRhOwotaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb25nU3BhcnNlQXJyYXk7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLlBhaXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlNvcnRlZE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZU1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi0vLyBOb3RlOiBUaGlzIGlzIGZvcmtlZCBmcm9tIGFuZHJvaWQubWVkaWEuU3VidGl0bGVUcmFjayBzaW5jZSBQCi0vKioKLSAqIEEgc3VidGl0bGUgdHJhY2sgYWJzdHJhY3QgYmFzZSBjbGFzcyB0aGF0IGlzIHJlc3BvbnNpYmxlIGZvciBwYXJzaW5nIGFuZCBkaXNwbGF5aW5nCi0gKiBhbiBpbnN0YW5jZSBvZiBhIHBhcnRpY3VsYXIgdHlwZSBvZiBzdWJ0aXRsZS4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFN1YnRpdGxlVHJhY2sgaW1wbGVtZW50cyBNZWRpYVRpbWVQcm92aWRlci5Pbk1lZGlhVGltZUxpc3RlbmVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlN1YnRpdGxlVHJhY2siOwotICAgIHByaXZhdGUgbG9uZyBtTGFzdFVwZGF0ZVRpbWVNczsKLSAgICBwcml2YXRlIGxvbmcgbUxhc3RUaW1lTXM7Ci0KLSAgICBwcml2YXRlIFJ1bm5hYmxlIG1SdW5uYWJsZTsKLQotICAgIGZpbmFsIHByaXZhdGUgTG9uZ1NwYXJzZUFycmF5PFJ1bj4gbVJ1bnNCeUVuZFRpbWUgPSBuZXcgTG9uZ1NwYXJzZUFycmF5PFJ1bj4oKTsKLSAgICBmaW5hbCBwcml2YXRlIExvbmdTcGFyc2VBcnJheTxSdW4+IG1SdW5zQnlJRCA9IG5ldyBMb25nU3BhcnNlQXJyYXk8UnVuPigpOwotCi0gICAgcHJpdmF0ZSBDdWVMaXN0IG1DdWVzOwotICAgIGZpbmFsIHByaXZhdGUgVmVjdG9yPEN1ZT4gbUFjdGl2ZUN1ZXMgPSBuZXcgVmVjdG9yPEN1ZT4oKTsKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBtVmlzaWJsZTsKLQotICAgIHB1YmxpYyBib29sZWFuIERFQlVHID0gZmFsc2U7Ci0KLSAgICBwcm90ZWN0ZWQgSGFuZGxlciBtSGFuZGxlciA9IG5ldyBIYW5kbGVyKCk7Ci0KLSAgICBwcml2YXRlIE1lZGlhRm9ybWF0IG1Gb3JtYXQ7Ci0KLSAgICBwdWJsaWMgU3VidGl0bGVUcmFjayhNZWRpYUZvcm1hdCBmb3JtYXQpIHsKLSAgICAgICAgbUZvcm1hdCA9IGZvcm1hdDsKLSAgICAgICAgbUN1ZXMgPSBuZXcgQ3VlTGlzdCgpOwotICAgICAgICBjbGVhckFjdGl2ZUN1ZXMoKTsKLSAgICAgICAgbUxhc3RUaW1lTXMgPSAtMTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgTWVkaWFGb3JtYXQgZ2V0Rm9ybWF0KCkgewotICAgICAgICByZXR1cm4gbUZvcm1hdDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGxvbmcgbU5leHRTY2hlZHVsZWRUaW1lTXMgPSAtMTsKLQotICAgIHB1YmxpYyB2b2lkIG9uRGF0YShTdWJ0aXRsZURhdGEgZGF0YSkgewotICAgICAgICBsb25nIHJ1bklEID0gZGF0YS5nZXRTdGFydFRpbWVVcygpICsgMTsKLSAgICAgICAgb25EYXRhKGRhdGEuZ2V0RGF0YSgpLCB0cnVlIC8qIGVvcyAqLywgcnVuSUQpOwotICAgICAgICBzZXRSdW5EaXNjYXJkVGltZU1zKAotICAgICAgICAgICAgICAgIHJ1bklELAotICAgICAgICAgICAgICAgIChkYXRhLmdldFN0YXJ0VGltZVVzKCkgKyBkYXRhLmdldER1cmF0aW9uVXMoKSkgLyAxMDAwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgd2hlbiB0aGVyZSBpcyBpbnB1dCBkYXRhIGZvciB0aGUgc3VidGl0bGUgdHJhY2suICBUaGUKLSAgICAgKiBjb21wbGV0ZSBzdWJ0aXRsZSBmb3IgYSB0cmFjayBjYW4gaW5jbHVkZSBtdWx0aXBsZSB3aG9sZSB1bml0cwotICAgICAqIChydW5zKS4gIEVhY2ggb2YgdGhlc2UgdW5pdHMgY2FuIGhhdmUgbXVsdGlwbGUgc2VjdGlvbnMuICBUaGUKLSAgICAgKiBjb250ZW50cyBvZiBhIHJ1biBhcmUgc3VibWl0dGVkIGluIHNlcXVlbnRpYWwgb3JkZXIsIHdpdGggZW9zCi0gICAgICogaW5kaWNhdGluZyB0aGUgbGFzdCBzZWN0aW9uIG9mIHRoZSBydW4uICBDYWxscyBmcm9tIGRpZmZlcmVudAotICAgICAqIHJ1bnMgbXVzdCBub3QgYmUgaW50ZXJtaXhlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBkYXRhIHN1YnRpdGxlIGRhdGEgYnl0ZSBidWZmZXIKLSAgICAgKiBAcGFyYW0gZW9zIHRydWUgaWYgdGhpcyBpcyB0aGUgbGFzdCBzZWN0aW9uIG9mIHRoZSBydW4uCi0gICAgICogQHBhcmFtIHJ1bklEIG1vc3RseS11bmlxdWUgSUQgZm9yIHRoaXMgcnVuIG9mIGRhdGEuICBTdWJ0aXRsZSBjdWVzCi0gICAgICogICAgICAgICAgICAgIHdpdGggcnVuSUQgb2YgMCBhcmUgZGlzY2FyZGVkIGltbWVkaWF0ZWx5IGFmdGVyCi0gICAgICogICAgICAgICAgICAgIGRpc3BsYXkuICBDdWVzIHdpdGggcnVuSUQgb2YgfjAgYXJlIGRpc2NhcmRlZAotICAgICAqICAgICAgICAgICAgICBvbmx5IGF0IHRoZSBkZWxldGlvbiBvZiB0aGUgdHJhY2sgb2JqZWN0LiAgQ3VlcwotICAgICAqICAgICAgICAgICAgICB3aXRoIG90aGVyIHJ1bklELXMgYXJlIGRpc2NhcmRlZCBhdCB0aGUgZW5kIG9mIHRoZQotICAgICAqICAgICAgICAgICAgICBydW4sIHdoaWNoIGRlZmF1bHRzIHRvIHRoZSBsYXRlc3QgdGltZXN0YW1wIG9mCi0gICAgICogICAgICAgICAgICAgIGFueSBvZiBpdHMgY3VlcyAod2l0aCB0aGlzIHJ1bklEKS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBvbkRhdGEoYnl0ZVtdIGRhdGEsIGJvb2xlYW4gZW9zLCBsb25nIHJ1bklEKTsKLQotICAgIC8qKgotICAgICAqIENhbGxlZCB3aGVuIGFkZGluZyB0aGUgc3VidGl0bGUgcmVuZGVyaW5nIHdpZGdldCB0byB0aGUgdmlldyBoaWVyYXJjaHksCi0gICAgICogYXMgd2VsbCBhcyB3aGVuIHNob3dpbmcgb3IgaGlkaW5nIHRoZSBzdWJ0aXRsZSB0cmFjaywgb3Igd2hlbiB0aGUgdmlkZW8KLSAgICAgKiBzdXJmYWNlIHBvc2l0aW9uIGhhcyBjaGFuZ2VkLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgd2lkZ2V0IHRoYXQgcmVuZGVycyB0aGlzIHN1YnRpdGxlIHRyYWNrLiBGb3IgbW9zdCByZW5kZXJlcnMKLSAgICAgKiAgICAgICAgIHRoZXJlIHNob3VsZCBiZSBhIHNpbmdsZSBzaGFyZWQgaW5zdGFuY2UgdGhhdCBpcyB1c2VkIGZvciBhbGwKLSAgICAgKiAgICAgICAgIHRyYWNrcyBzdXBwb3J0ZWQgYnkgdGhhdCByZW5kZXJlciwgYXMgYXQgbW9zdCBvbmUgc3VidGl0bGUgdHJhY2sKLSAgICAgKiAgICAgICAgIGlzIHZpc2libGUgYXQgb25lIHRpbWUuCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IFJlbmRlcmluZ1dpZGdldCBnZXRSZW5kZXJpbmdXaWRnZXQoKTsKLQotICAgIC8qKgotICAgICAqIENhbGxlZCB3aGVuIHRoZSBhY3RpdmUgY3VlcyBoYXZlIGNoYW5nZWQsIGFuZCB0aGUgY29udGVudHMgb2YgdGhlIHN1YnRpdGxlCi0gICAgICogdmlldyBzaG91bGQgYmUgdXBkYXRlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCB1cGRhdGVWaWV3KFZlY3RvcjxDdWU+IGFjdGl2ZUN1ZXMpOwotCi0gICAgcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIHVwZGF0ZUFjdGl2ZUN1ZXMoYm9vbGVhbiByZWJ1aWxkLCBsb25nIHRpbWVNcykgewotICAgICAgICAvLyBvdXQtb2Ytb3JkZXIgdGltZXMgbWVhbiBzZWVraW5nIG9yIG5ldyBhY3RpdmUgY3VlcyBiZWluZyBhZGRlZAotICAgICAgICAvLyAoZHVyaW5nIHRoZWlyIG93biB0aW1lc3BhbikKLSAgICAgICAgaWYgKHJlYnVpbGQgfHwgbUxhc3RVcGRhdGVUaW1lTXMgPiB0aW1lTXMpIHsKLSAgICAgICAgICAgIGNsZWFyQWN0aXZlQ3VlcygpOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yKEl0ZXJhdG9yPFBhaXI8TG9uZywgQ3VlPiA+IGl0ID0KLSAgICAgICAgICAgICAgICBtQ3Vlcy5lbnRyaWVzQmV0d2VlbihtTGFzdFVwZGF0ZVRpbWVNcywgdGltZU1zKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotICAgICAgICAgICAgUGFpcjxMb25nLCBDdWU+IGV2ZW50ID0gaXQubmV4dCgpOwotICAgICAgICAgICAgQ3VlIGN1ZSA9IGV2ZW50LnNlY29uZDsKLQotICAgICAgICAgICAgaWYgKGN1ZS5tRW5kVGltZU1zID09IGV2ZW50LmZpcnN0KSB7Ci0gICAgICAgICAgICAgICAgLy8gcmVtb3ZlIHBhc3QgY3VlcwotICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAiUmVtb3ZpbmcgIiArIGN1ZSk7Ci0gICAgICAgICAgICAgICAgbUFjdGl2ZUN1ZXMucmVtb3ZlKGN1ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGN1ZS5tUnVuSUQgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBpdC5yZW1vdmUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGN1ZS5tU3RhcnRUaW1lTXMgPT0gZXZlbnQuZmlyc3QpIHsKLSAgICAgICAgICAgICAgICAvLyBhZGQgbmV3IGN1ZXMKLSAgICAgICAgICAgICAgICAvLyBUUklDS1k6IHRoaXMgd2lsbCBoYXBwZW4gaW4gc3RhcnQgb3JkZXIKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgIkFkZGluZyAiICsgY3VlKTsKLSAgICAgICAgICAgICAgICBpZiAoY3VlLm1Jbm5lclRpbWVzTXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBjdWUub25UaW1lKHRpbWVNcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1BY3RpdmVDdWVzLmFkZChjdWUpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChjdWUubUlubmVyVGltZXNNcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gY3VlIGlzIG1vZGlmaWVkCi0gICAgICAgICAgICAgICAgY3VlLm9uVGltZSh0aW1lTXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyogY29tcGxldGUgYW55IHJ1bnMgKi8KLSAgICAgICAgd2hpbGUgKG1SdW5zQnlFbmRUaW1lLnNpemUoKSA+IDAgJiYKLSAgICAgICAgICAgICAgIG1SdW5zQnlFbmRUaW1lLmtleUF0KDApIDw9IHRpbWVNcykgewotICAgICAgICAgICAgcmVtb3ZlUnVuc0J5RW5kVGltZUluZGV4KDApOyAvLyByZW1vdmVzIGVsZW1lbnQKLSAgICAgICAgfQotICAgICAgICBtTGFzdFVwZGF0ZVRpbWVNcyA9IHRpbWVNczsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcmVtb3ZlUnVuc0J5RW5kVGltZUluZGV4KGludCBpeCkgewotICAgICAgICBSdW4gcnVuID0gbVJ1bnNCeUVuZFRpbWUudmFsdWVBdChpeCk7Ci0gICAgICAgIHdoaWxlIChydW4gIT0gbnVsbCkgewotICAgICAgICAgICAgQ3VlIGN1ZSA9IHJ1bi5tRmlyc3RDdWU7Ci0gICAgICAgICAgICB3aGlsZSAoY3VlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtQ3Vlcy5yZW1vdmUoY3VlKTsKLSAgICAgICAgICAgICAgICBDdWUgbmV4dEN1ZSA9IGN1ZS5tTmV4dEluUnVuOwotICAgICAgICAgICAgICAgIGN1ZS5tTmV4dEluUnVuID0gbnVsbDsKLSAgICAgICAgICAgICAgICBjdWUgPSBuZXh0Q3VlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVJ1bnNCeUlELnJlbW92ZShydW4ubVJ1bklEKTsKLSAgICAgICAgICAgIFJ1biBuZXh0UnVuID0gcnVuLm1OZXh0UnVuQXRFbmRUaW1lTXM7Ci0gICAgICAgICAgICBydW4ubVByZXZSdW5BdEVuZFRpbWVNcyA9IG51bGw7Ci0gICAgICAgICAgICBydW4ubU5leHRSdW5BdEVuZFRpbWVNcyA9IG51bGw7Ci0gICAgICAgICAgICBydW4gPSBuZXh0UnVuOwotICAgICAgICB9Ci0gICAgICAgIG1SdW5zQnlFbmRUaW1lLnJlbW92ZUF0KGl4KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICAvKiByZW1vdmUgYWxsIGN1ZXMgKHVudGFuZ2xlIGFsbCBjcm9zcy1saW5rcykgKi8KLSAgICAgICAgaW50IHNpemUgPSBtUnVuc0J5RW5kVGltZS5zaXplKCk7Ci0gICAgICAgIGZvcihpbnQgaXggPSBzaXplIC0gMTsgaXggPj0gMDsgaXgtLSkgewotICAgICAgICAgICAgcmVtb3ZlUnVuc0J5RW5kVGltZUluZGV4KGl4KTsKLSAgICAgICAgfQotCi0gICAgICAgIHN1cGVyLmZpbmFsaXplKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCB0YWtlVGltZShsb25nIHRpbWVNcykgewotICAgICAgICBtTGFzdFRpbWVNcyA9IHRpbWVNczsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgY2xlYXJBY3RpdmVDdWVzKCkgewotICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgIkNsZWFyaW5nICIgKyBtQWN0aXZlQ3Vlcy5zaXplKCkgKyAiIGFjdGl2ZSBjdWVzIik7Ci0gICAgICAgIG1BY3RpdmVDdWVzLmNsZWFyKCk7Ci0gICAgICAgIG1MYXN0VXBkYXRlVGltZU1zID0gLTE7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2NoZWR1bGVUaW1lZEV2ZW50cygpIHsKLSAgICAgICAgLyogZ2V0IHRpbWVzIGZvciB0aGUgbmV4dCBldmVudCAqLwotICAgICAgICBpZiAobVRpbWVQcm92aWRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtTmV4dFNjaGVkdWxlZFRpbWVNcyA9IG1DdWVzLm5leHRUaW1lQWZ0ZXIobUxhc3RUaW1lTXMpOwotICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cuZChUQUcsICJzY2hlZCBAIiArIG1OZXh0U2NoZWR1bGVkVGltZU1zICsgIiBhZnRlciAiICsgbUxhc3RUaW1lTXMpOwotICAgICAgICAgICAgbVRpbWVQcm92aWRlci5ub3RpZnlBdCgKLSAgICAgICAgICAgICAgICAgICAgbU5leHRTY2hlZHVsZWRUaW1lTXMgPj0gMCA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAobU5leHRTY2hlZHVsZWRUaW1lTXMgKiAxMDAwKSA6IE1lZGlhVGltZVByb3ZpZGVyLk5PX1RJTUUsCi0gICAgICAgICAgICAgICAgICAgIHRoaXMpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25UaW1lZEV2ZW50KGxvbmcgdGltZVVzKSB7Ci0gICAgICAgIGlmIChERUJVRykgTG9nLmQoVEFHLCAib25UaW1lZEV2ZW50ICIgKyB0aW1lVXMpOwotICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLSAgICAgICAgICAgIGxvbmcgdGltZU1zID0gdGltZVVzIC8gMTAwMDsKLSAgICAgICAgICAgIHVwZGF0ZUFjdGl2ZUN1ZXMoZmFsc2UsIHRpbWVNcyk7Ci0gICAgICAgICAgICB0YWtlVGltZSh0aW1lTXMpOwotICAgICAgICB9Ci0gICAgICAgIHVwZGF0ZVZpZXcobUFjdGl2ZUN1ZXMpOwotICAgICAgICBzY2hlZHVsZVRpbWVkRXZlbnRzKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25TZWVrKGxvbmcgdGltZVVzKSB7Ci0gICAgICAgIGlmIChERUJVRykgTG9nLmQoVEFHLCAib25TZWVrICIgKyB0aW1lVXMpOwotICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLSAgICAgICAgICAgIGxvbmcgdGltZU1zID0gdGltZVVzIC8gMTAwMDsKLSAgICAgICAgICAgIHVwZGF0ZUFjdGl2ZUN1ZXModHJ1ZSwgdGltZU1zKTsKLSAgICAgICAgICAgIHRha2VUaW1lKHRpbWVNcyk7Ci0gICAgICAgIH0KLSAgICAgICAgdXBkYXRlVmlldyhtQWN0aXZlQ3Vlcyk7Ci0gICAgICAgIHNjaGVkdWxlVGltZWRFdmVudHMoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblN0b3AoKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewotICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cuZChUQUcsICJvblN0b3AiKTsKLSAgICAgICAgICAgIGNsZWFyQWN0aXZlQ3VlcygpOwotICAgICAgICAgICAgbUxhc3RUaW1lTXMgPSAtMTsKLSAgICAgICAgfQotICAgICAgICB1cGRhdGVWaWV3KG1BY3RpdmVDdWVzKTsKLSAgICAgICAgbU5leHRTY2hlZHVsZWRUaW1lTXMgPSAtMTsKLSAgICAgICAgbVRpbWVQcm92aWRlci5ub3RpZnlBdChNZWRpYVRpbWVQcm92aWRlci5OT19USU1FLCB0aGlzKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgTWVkaWFUaW1lUHJvdmlkZXIgbVRpbWVQcm92aWRlcjsKLQotICAgIHB1YmxpYyB2b2lkIHNob3coKSB7Ci0gICAgICAgIGlmIChtVmlzaWJsZSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgbVZpc2libGUgPSB0cnVlOwotICAgICAgICBSZW5kZXJpbmdXaWRnZXQgcmVuZGVyaW5nV2lkZ2V0ID0gZ2V0UmVuZGVyaW5nV2lkZ2V0KCk7Ci0gICAgICAgIGlmIChyZW5kZXJpbmdXaWRnZXQgIT0gbnVsbCkgewotICAgICAgICAgICAgcmVuZGVyaW5nV2lkZ2V0LnNldFZpc2libGUodHJ1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1UaW1lUHJvdmlkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbVRpbWVQcm92aWRlci5zY2hlZHVsZVVwZGF0ZSh0aGlzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGhpZGUoKSB7Ci0gICAgICAgIGlmICghbVZpc2libGUpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtVGltZVByb3ZpZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1UaW1lUHJvdmlkZXIuY2FuY2VsTm90aWZpY2F0aW9ucyh0aGlzKTsKLSAgICAgICAgfQotICAgICAgICBSZW5kZXJpbmdXaWRnZXQgcmVuZGVyaW5nV2lkZ2V0ID0gZ2V0UmVuZGVyaW5nV2lkZ2V0KCk7Ci0gICAgICAgIGlmIChyZW5kZXJpbmdXaWRnZXQgIT0gbnVsbCkgewotICAgICAgICAgICAgcmVuZGVyaW5nV2lkZ2V0LnNldFZpc2libGUoZmFsc2UpOwotICAgICAgICB9Ci0gICAgICAgIG1WaXNpYmxlID0gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHN5bmNocm9uaXplZCBib29sZWFuIGFkZEN1ZShDdWUgY3VlKSB7Ci0gICAgICAgIG1DdWVzLmFkZChjdWUpOwotCi0gICAgICAgIGlmIChjdWUubVJ1bklEICE9IDApIHsKLSAgICAgICAgICAgIFJ1biBydW4gPSBtUnVuc0J5SUQuZ2V0KGN1ZS5tUnVuSUQpOwotICAgICAgICAgICAgaWYgKHJ1biA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcnVuID0gbmV3IFJ1bigpOwotICAgICAgICAgICAgICAgIG1SdW5zQnlJRC5wdXQoY3VlLm1SdW5JRCwgcnVuKTsKLSAgICAgICAgICAgICAgICBydW4ubUVuZFRpbWVNcyA9IGN1ZS5tRW5kVGltZU1zOwotICAgICAgICAgICAgfSBlbHNlIGlmIChydW4ubUVuZFRpbWVNcyA8IGN1ZS5tRW5kVGltZU1zKSB7Ci0gICAgICAgICAgICAgICAgcnVuLm1FbmRUaW1lTXMgPSBjdWUubUVuZFRpbWVNczsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gbGluay11cCBjdWVzIGluIHRoZSBzYW1lIHJ1bgotICAgICAgICAgICAgY3VlLm1OZXh0SW5SdW4gPSBydW4ubUZpcnN0Q3VlOwotICAgICAgICAgICAgcnVuLm1GaXJzdEN1ZSA9IGN1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGlmIGEgY3VlIGlzIGFkZGVkIHRoYXQgc2hvdWxkIGJlIHZpc2libGUsIG5lZWQgdG8gcmVmcmVzaCB2aWV3Ci0gICAgICAgIGxvbmcgbm93TXMgPSAtMTsKLSAgICAgICAgaWYgKG1UaW1lUHJvdmlkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBub3dNcyA9IG1UaW1lUHJvdmlkZXIuZ2V0Q3VycmVudFRpbWVVcygKLSAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qIHByZWNpc2UgKi8sIHRydWUgLyogbW9ub3RvbmljICovKSAvIDEwMDA7Ci0gICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIGhhbmRsZSBhcyBpdCB3ZSBhcmUgbm90IHBsYXlpbmcKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAibVZpc2libGU9IiArIG1WaXNpYmxlICsgIiwgIiArCi0gICAgICAgICAgICAgICAgY3VlLm1TdGFydFRpbWVNcyArICIgPD0gIiArIG5vd01zICsgIiwgIiArCi0gICAgICAgICAgICAgICAgY3VlLm1FbmRUaW1lTXMgKyAiID49ICIgKyBtTGFzdFRpbWVNcyk7Ci0KLSAgICAgICAgaWYgKG1WaXNpYmxlICYmCi0gICAgICAgICAgICAgICAgY3VlLm1TdGFydFRpbWVNcyA8PSBub3dNcyAmJgotICAgICAgICAgICAgICAgIC8vIHdlIGRvbid0IHRydXN0IG5vd01zLCBzbyBjaGVjayBhbnkgY3VlIHNpbmNlIGxhc3QgY2FsbGJhY2sKLSAgICAgICAgICAgICAgICBjdWUubUVuZFRpbWVNcyA+PSBtTGFzdFRpbWVNcykgewotICAgICAgICAgICAgaWYgKG1SdW5uYWJsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUhhbmRsZXIucmVtb3ZlQ2FsbGJhY2tzKG1SdW5uYWJsZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbCBTdWJ0aXRsZVRyYWNrIHRyYWNrID0gdGhpczsKLSAgICAgICAgICAgIGZpbmFsIGxvbmcgdGhlbk1zID0gbm93TXM7Ci0gICAgICAgICAgICBtUnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICAvLyBldmVuIHdpdGggc3luY2hyb25pemVkLCBpdCBpcyBwb3NzaWJsZSB0aGF0IHdlIGFyZSBnb2luZwotICAgICAgICAgICAgICAgICAgICAvLyB0byBkbyBtdWx0aXBsZSB1cGRhdGVzIGFzIHRoZSBydW5uYWJsZSBjb3VsZCBiZSBhbHJlYWR5Ci0gICAgICAgICAgICAgICAgICAgIC8vIHJ1bm5pbmcuCi0gICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAodHJhY2spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1SdW5uYWJsZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVBY3RpdmVDdWVzKHRydWUsIHRoZW5Ncyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVWaWV3KG1BY3RpdmVDdWVzKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAvLyBkZWxheSB1cGRhdGUgc28gd2UgZG9uJ3QgdXBkYXRlIHZpZXcgb24gZXZlcnkgY3VlLiAgVE9ETyB3aHkgMTA/Ci0gICAgICAgICAgICBpZiAobUhhbmRsZXIucG9zdERlbGF5ZWQobVJ1bm5hYmxlLCAxMCAvKiBkZWxheSAqLykpIHsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgInNjaGVkdWxpbmcgdXBkYXRlIik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLncoVEFHLCAiZmFpbGVkIHRvIHNjaGVkdWxlIHN1YnRpdGxlIHZpZXcgdXBkYXRlIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtVmlzaWJsZSAmJgotICAgICAgICAgICAgICAgIGN1ZS5tRW5kVGltZU1zID49IG1MYXN0VGltZU1zICYmCi0gICAgICAgICAgICAgICAgKGN1ZS5tU3RhcnRUaW1lTXMgPCBtTmV4dFNjaGVkdWxlZFRpbWVNcyB8fAotICAgICAgICAgICAgICAgICBtTmV4dFNjaGVkdWxlZFRpbWVNcyA8IDApKSB7Ci0gICAgICAgICAgICBzY2hlZHVsZVRpbWVkRXZlbnRzKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldFRpbWVQcm92aWRlcihNZWRpYVRpbWVQcm92aWRlciB0aW1lUHJvdmlkZXIpIHsKLSAgICAgICAgaWYgKG1UaW1lUHJvdmlkZXIgPT0gdGltZVByb3ZpZGVyKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1UaW1lUHJvdmlkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbVRpbWVQcm92aWRlci5jYW5jZWxOb3RpZmljYXRpb25zKHRoaXMpOwotICAgICAgICB9Ci0gICAgICAgIG1UaW1lUHJvdmlkZXIgPSB0aW1lUHJvdmlkZXI7Ci0gICAgICAgIGlmIChtVGltZVByb3ZpZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1UaW1lUHJvdmlkZXIuc2NoZWR1bGVVcGRhdGUodGhpcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIHN0YXRpYyBjbGFzcyBDdWVMaXN0IHsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJDdWVMaXN0IjsKLSAgICAgICAgLy8gc2ltcGxpc3RpYywgaW5lZmZpY2llbnQgaW1wbGVtZW50YXRpb24KLSAgICAgICAgcHJpdmF0ZSBTb3J0ZWRNYXA8TG9uZywgVmVjdG9yPEN1ZT4gPiBtQ3VlczsKLSAgICAgICAgcHVibGljIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gYWRkRXZlbnQoQ3VlIGN1ZSwgbG9uZyB0aW1lTXMpIHsKLSAgICAgICAgICAgIFZlY3RvcjxDdWU+IGN1ZXMgPSBtQ3Vlcy5nZXQodGltZU1zKTsKLSAgICAgICAgICAgIGlmIChjdWVzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjdWVzID0gbmV3IFZlY3RvcjxDdWU+KDIpOwotICAgICAgICAgICAgICAgIG1DdWVzLnB1dCh0aW1lTXMsIGN1ZXMpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChjdWVzLmNvbnRhaW5zKGN1ZSkpIHsKLSAgICAgICAgICAgICAgICAvLyBkbyBub3QgZHVwbGljYXRlIGN1ZXMKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGN1ZXMuYWRkKGN1ZSk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCByZW1vdmVFdmVudChDdWUgY3VlLCBsb25nIHRpbWVNcykgewotICAgICAgICAgICAgVmVjdG9yPEN1ZT4gY3VlcyA9IG1DdWVzLmdldCh0aW1lTXMpOwotICAgICAgICAgICAgaWYgKGN1ZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGN1ZXMucmVtb3ZlKGN1ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGN1ZXMuc2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbUN1ZXMucmVtb3ZlKHRpbWVNcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgYWRkKEN1ZSBjdWUpIHsKLSAgICAgICAgICAgIC8vIGlnbm9yZSBub24tcG9zaXRpdmUtZHVyYXRpb24gY3VlcwotICAgICAgICAgICAgaWYgKGN1ZS5tU3RhcnRUaW1lTXMgPj0gY3VlLm1FbmRUaW1lTXMpCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgICAgICBpZiAoIWFkZEV2ZW50KGN1ZSwgY3VlLm1TdGFydFRpbWVNcykpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGxvbmcgbGFzdFRpbWVNcyA9IGN1ZS5tU3RhcnRUaW1lTXM7Ci0gICAgICAgICAgICBpZiAoY3VlLm1Jbm5lclRpbWVzTXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZvciAobG9uZyB0aW1lTXM6IGN1ZS5tSW5uZXJUaW1lc01zKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0aW1lTXMgPiBsYXN0VGltZU1zICYmIHRpbWVNcyA8IGN1ZS5tRW5kVGltZU1zKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhZGRFdmVudChjdWUsIHRpbWVNcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsYXN0VGltZU1zID0gdGltZU1zOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBhZGRFdmVudChjdWUsIGN1ZS5tRW5kVGltZU1zKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZShDdWUgY3VlKSB7Ci0gICAgICAgICAgICByZW1vdmVFdmVudChjdWUsIGN1ZS5tU3RhcnRUaW1lTXMpOwotICAgICAgICAgICAgaWYgKGN1ZS5tSW5uZXJUaW1lc01zICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmb3IgKGxvbmcgdGltZU1zOiBjdWUubUlubmVyVGltZXNNcykgewotICAgICAgICAgICAgICAgICAgICByZW1vdmVFdmVudChjdWUsIHRpbWVNcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmVtb3ZlRXZlbnQoY3VlLCBjdWUubUVuZFRpbWVNcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgSXRlcmFibGU8UGFpcjxMb25nLCBDdWU+PiBlbnRyaWVzQmV0d2VlbigKLSAgICAgICAgICAgICAgICBmaW5hbCBsb25nIGxhc3RUaW1lTXMsIGZpbmFsIGxvbmcgdGltZU1zKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEl0ZXJhYmxlPFBhaXI8TG9uZywgQ3VlPiA+KCkgewotICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgIHB1YmxpYyBJdGVyYXRvcjxQYWlyPExvbmcsIEN1ZT4gPiBpdGVyYXRvcigpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cuZChUQUcsICJzbGljZSAoIiArIGxhc3RUaW1lTXMgKyAiLCAiICsgdGltZU1zICsgIl09Iik7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEVudHJ5SXRlcmF0b3IoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DdWVzLnN1Yk1hcChsYXN0VGltZU1zICsgMSwgdGltZU1zICsgMSkpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEVudHJ5SXRlcmF0b3IobnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGxvbmcgbmV4dFRpbWVBZnRlcihsb25nIHRpbWVNcykgewotICAgICAgICAgICAgU29ydGVkTWFwPExvbmcsIFZlY3RvcjxDdWU+PiB0YWlsID0gbnVsbDsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgdGFpbCA9IG1DdWVzLnRhaWxNYXAodGltZU1zICsgMSk7Ci0gICAgICAgICAgICAgICAgaWYgKHRhaWwgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFpbC5maXJzdEtleSgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgfSBjYXRjaChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBjbGFzcyBFbnRyeUl0ZXJhdG9yIGltcGxlbWVudHMgSXRlcmF0b3I8UGFpcjxMb25nLCBDdWU+ID4gewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotICAgICAgICAgICAgICAgIHJldHVybiAhbURvbmU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIFBhaXI8TG9uZywgQ3VlPiBuZXh0KCkgewotICAgICAgICAgICAgICAgIGlmIChtRG9uZSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigiIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1MYXN0RW50cnkgPSBuZXcgUGFpcjxMb25nLCBDdWU+KAotICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRUaW1lTXMsIG1MaXN0SXRlcmF0b3IubmV4dCgpKTsKLSAgICAgICAgICAgICAgICBtTGFzdExpc3RJdGVyYXRvciA9IG1MaXN0SXRlcmF0b3I7Ci0gICAgICAgICAgICAgICAgaWYgKCFtTGlzdEl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICBuZXh0S2V5KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBtTGFzdEVudHJ5OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLSAgICAgICAgICAgICAgICAvLyBvbmx5IGFsbG93IHJlbW92aW5nIGVuZCB0YWdzCi0gICAgICAgICAgICAgICAgaWYgKG1MYXN0TGlzdEl0ZXJhdG9yID09IG51bGwgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0RW50cnkuc2Vjb25kLm1FbmRUaW1lTXMgIT0gbUxhc3RFbnRyeS5maXJzdCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCIiKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyByZW1vdmUgZW5kLWN1ZQotICAgICAgICAgICAgICAgIG1MYXN0TGlzdEl0ZXJhdG9yLnJlbW92ZSgpOwotICAgICAgICAgICAgICAgIG1MYXN0TGlzdEl0ZXJhdG9yID0gbnVsbDsKLSAgICAgICAgICAgICAgICBpZiAobUN1ZXMuZ2V0KG1MYXN0RW50cnkuZmlyc3QpLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1DdWVzLnJlbW92ZShtTGFzdEVudHJ5LmZpcnN0KTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyByZW1vdmUgcmVzdCBvZiB0aGUgY3VlcwotICAgICAgICAgICAgICAgIEN1ZSBjdWUgPSBtTGFzdEVudHJ5LnNlY29uZDsKLSAgICAgICAgICAgICAgICByZW1vdmVFdmVudChjdWUsIGN1ZS5tU3RhcnRUaW1lTXMpOwotICAgICAgICAgICAgICAgIGlmIChjdWUubUlubmVyVGltZXNNcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAobG9uZyB0aW1lTXM6IGN1ZS5tSW5uZXJUaW1lc01zKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVFdmVudChjdWUsIHRpbWVNcyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBFbnRyeUl0ZXJhdG9yKFNvcnRlZE1hcDxMb25nLCBWZWN0b3I8Q3VlPiA+IGN1ZXMpIHsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgY3VlcyArICIiKTsKLSAgICAgICAgICAgICAgICBtUmVtYWluaW5nQ3VlcyA9IGN1ZXM7Ci0gICAgICAgICAgICAgICAgbUxhc3RMaXN0SXRlcmF0b3IgPSBudWxsOwotICAgICAgICAgICAgICAgIG5leHRLZXkoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIG5leHRLZXkoKSB7Ci0gICAgICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1SZW1haW5pbmdDdWVzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigiIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFRpbWVNcyA9IG1SZW1haW5pbmdDdWVzLmZpcnN0S2V5KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtTGlzdEl0ZXJhdG9yID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUmVtYWluaW5nQ3Vlcy5nZXQobUN1cnJlbnRUaW1lTXMpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1SZW1haW5pbmdDdWVzID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJlbWFpbmluZ0N1ZXMudGFpbE1hcChtQ3VycmVudFRpbWVNcyArIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUmVtYWluaW5nQ3VlcyA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRG9uZSA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Eb25lID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1SZW1haW5pbmdDdWVzID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1MaXN0SXRlcmF0b3IgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSB3aGlsZSAoIW1MaXN0SXRlcmF0b3IuaGFzTmV4dCgpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHJpdmF0ZSBsb25nIG1DdXJyZW50VGltZU1zOwotICAgICAgICAgICAgcHJpdmF0ZSBJdGVyYXRvcjxDdWU+IG1MaXN0SXRlcmF0b3I7Ci0gICAgICAgICAgICBwcml2YXRlIGJvb2xlYW4gbURvbmU7Ci0gICAgICAgICAgICBwcml2YXRlIFNvcnRlZE1hcDxMb25nLCBWZWN0b3I8Q3VlPiA+IG1SZW1haW5pbmdDdWVzOwotICAgICAgICAgICAgcHJpdmF0ZSBJdGVyYXRvcjxDdWU+IG1MYXN0TGlzdEl0ZXJhdG9yOwotICAgICAgICAgICAgcHJpdmF0ZSBQYWlyPExvbmcsQ3VlPiBtTGFzdEVudHJ5OwotICAgICAgICB9Ci0KLSAgICAgICAgQ3VlTGlzdCgpIHsKLSAgICAgICAgICAgIG1DdWVzID0gbmV3IFRyZWVNYXA8TG9uZywgVmVjdG9yPEN1ZT4+KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEN1ZSB7Ci0gICAgICAgIHB1YmxpYyBsb25nIG1TdGFydFRpbWVNczsKLSAgICAgICAgcHVibGljIGxvbmcgbUVuZFRpbWVNczsKLSAgICAgICAgcHVibGljIGxvbmdbXSBtSW5uZXJUaW1lc01zOwotICAgICAgICBwdWJsaWMgbG9uZyBtUnVuSUQ7Ci0KLSAgICAgICAgcHVibGljIEN1ZSBtTmV4dEluUnVuOwotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uVGltZShsb25nIHRpbWVNcykgeyB9Ci0gICAgfQotCi0gICAgLyoqIHVwZGF0ZSBtUnVuc0J5RW5kVGltZSAod2l0aCBkZWZhdWx0IGVuZCB0aW1lKSAqLwotICAgIHByb3RlY3RlZCB2b2lkIGZpbmlzaGVkUnVuKGxvbmcgcnVuSUQpIHsKLSAgICAgICAgaWYgKHJ1bklEICE9IDAgJiYgcnVuSUQgIT0gfjApIHsKLSAgICAgICAgICAgIFJ1biBydW4gPSBtUnVuc0J5SUQuZ2V0KHJ1bklEKTsKLSAgICAgICAgICAgIGlmIChydW4gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJ1bi5zdG9yZUJ5RW5kVGltZU1zKG1SdW5zQnlFbmRUaW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKiB1cGRhdGUgbVJ1bnNCeUVuZFRpbWUgd2l0aCBnaXZlbiBlbmQgdGltZSAqLwotICAgIHB1YmxpYyB2b2lkIHNldFJ1bkRpc2NhcmRUaW1lTXMobG9uZyBydW5JRCwgbG9uZyB0aW1lTXMpIHsKLSAgICAgICAgaWYgKHJ1bklEICE9IDAgJiYgcnVuSUQgIT0gfjApIHsKLSAgICAgICAgICAgIFJ1biBydW4gPSBtUnVuc0J5SUQuZ2V0KHJ1bklEKTsKLSAgICAgICAgICAgIGlmIChydW4gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJ1bi5tRW5kVGltZU1zID0gdGltZU1zOwotICAgICAgICAgICAgICAgIHJ1bi5zdG9yZUJ5RW5kVGltZU1zKG1SdW5zQnlFbmRUaW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKiB3aGV0aGVyIHRoaXMgaXMgYSB0ZXh0IHRyYWNrIHdobyBmaXJlcyBldmVudHMgaW5zdGVhZCBnZXR0aW5nIHJlbmRlcmVkICovCi0gICAgcHVibGljIGludCBnZXRUcmFja1R5cGUoKSB7Ci0gICAgICAgIHJldHVybiBnZXRSZW5kZXJpbmdXaWRnZXQoKSA9PSBudWxsCi0gICAgICAgICAgICAgICAgPyBUcmFja0luZm8uTUVESUFfVFJBQ0tfVFlQRV9USU1FRFRFWFQKLSAgICAgICAgICAgICAgICA6IFRyYWNrSW5mby5NRURJQV9UUkFDS19UWVBFX1NVQlRJVExFOwotICAgIH0KLQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUnVuIHsKLSAgICAgICAgcHVibGljIEN1ZSBtRmlyc3RDdWU7Ci0gICAgICAgIHB1YmxpYyBSdW4gbU5leHRSdW5BdEVuZFRpbWVNczsKLSAgICAgICAgcHVibGljIFJ1biBtUHJldlJ1bkF0RW5kVGltZU1zOwotICAgICAgICBwdWJsaWMgbG9uZyBtRW5kVGltZU1zID0gLTE7Ci0gICAgICAgIHB1YmxpYyBsb25nIG1SdW5JRCA9IDA7Ci0gICAgICAgIHByaXZhdGUgbG9uZyBtU3RvcmVkRW5kVGltZU1zID0gLTE7Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc3RvcmVCeUVuZFRpbWVNcyhMb25nU3BhcnNlQXJyYXk8UnVuPiBydW5zQnlFbmRUaW1lKSB7Ci0gICAgICAgICAgICAvLyByZW1vdmUgb2xkIHZhbHVlIGlmIGFueQotICAgICAgICAgICAgaW50IGl4ID0gcnVuc0J5RW5kVGltZS5pbmRleE9mS2V5KG1TdG9yZWRFbmRUaW1lTXMpOwotICAgICAgICAgICAgaWYgKGl4ID49IDApIHsKLSAgICAgICAgICAgICAgICBpZiAobVByZXZSdW5BdEVuZFRpbWVNcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydCh0aGlzID09IHJ1bnNCeUVuZFRpbWUudmFsdWVBdChpeCkpOwotICAgICAgICAgICAgICAgICAgICBpZiAobU5leHRSdW5BdEVuZFRpbWVNcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBydW5zQnlFbmRUaW1lLnJlbW92ZUF0KGl4KTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnNCeUVuZFRpbWUuc2V0VmFsdWVBdChpeCwgbU5leHRSdW5BdEVuZFRpbWVNcyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmVtb3ZlQXRFbmRUaW1lTXMoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gYWRkIG5ldyB2YWx1ZQotICAgICAgICAgICAgaWYgKG1FbmRUaW1lTXMgPj0gMCkgewotICAgICAgICAgICAgICAgIG1QcmV2UnVuQXRFbmRUaW1lTXMgPSBudWxsOwotICAgICAgICAgICAgICAgIG1OZXh0UnVuQXRFbmRUaW1lTXMgPSBydW5zQnlFbmRUaW1lLmdldChtRW5kVGltZU1zKTsKLSAgICAgICAgICAgICAgICBpZiAobU5leHRSdW5BdEVuZFRpbWVNcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1OZXh0UnVuQXRFbmRUaW1lTXMubVByZXZSdW5BdEVuZFRpbWVNcyA9IHRoaXM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJ1bnNCeUVuZFRpbWUucHV0KG1FbmRUaW1lTXMsIHRoaXMpOwotICAgICAgICAgICAgICAgIG1TdG9yZWRFbmRUaW1lTXMgPSBtRW5kVGltZU1zOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgcmVtb3ZlQXRFbmRUaW1lTXMoKSB7Ci0gICAgICAgICAgICBSdW4gcHJldiA9IG1QcmV2UnVuQXRFbmRUaW1lTXM7Ci0KLSAgICAgICAgICAgIGlmIChtUHJldlJ1bkF0RW5kVGltZU1zICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtUHJldlJ1bkF0RW5kVGltZU1zLm1OZXh0UnVuQXRFbmRUaW1lTXMgPSBtTmV4dFJ1bkF0RW5kVGltZU1zOwotICAgICAgICAgICAgICAgIG1QcmV2UnVuQXRFbmRUaW1lTXMgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1OZXh0UnVuQXRFbmRUaW1lTXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1OZXh0UnVuQXRFbmRUaW1lTXMubVByZXZSdW5BdEVuZFRpbWVNcyA9IHByZXY7Ci0gICAgICAgICAgICAgICAgbU5leHRSdW5BdEVuZFRpbWVNcyA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbnRlcmZhY2UgZm9yIHJlbmRlcmluZyBzdWJ0aXRsZXMgb250byBhIENhbnZhcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50ZXJmYWNlIFJlbmRlcmluZ1dpZGdldCB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSB3aWRnZXQncyBjYWxsYmFjaywgd2hpY2ggaXMgdXNlZCB0byBzZW5kIHVwZGF0ZXMgd2hlbiB0aGUKLSAgICAgICAgICogcmVuZGVyZWQgZGF0YSBoYXMgY2hhbmdlZC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrIHVwZGF0ZSBjYWxsYmFjawotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgc2V0T25DaGFuZ2VkTGlzdGVuZXIoT25DaGFuZ2VkTGlzdGVuZXIgY2FsbGJhY2spOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSB3aWRnZXQncyBzaXplLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gd2lkdGggd2lkdGggaW4gcGl4ZWxzCi0gICAgICAgICAqIEBwYXJhbSBoZWlnaHQgaGVpZ2h0IGluIHBpeGVscwotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgc2V0U2l6ZShpbnQgd2lkdGgsIGludCBoZWlnaHQpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHdoZXRoZXIgdGhlIHdpZGdldCBzaG91bGQgZHJhdyBzdWJ0aXRsZXMuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSB2aXNpYmxlIHRydWUgaWYgc3VidGl0bGVzIHNob3VsZCBiZSBkcmF3biwgZmFsc2Ugb3RoZXJ3aXNlCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJlbmRlcnMgc3VidGl0bGVzIG9udG8gYSB7QGxpbmsgQ2FudmFzfS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGMgY2FudmFzIG9uIHdoaWNoIHRvIHJlbmRlciBzdWJ0aXRsZXMKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIGRyYXcoQ2FudmFzIGMpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgd2lkZ2V0IGlzIGF0dGFjaGVkIHRvIGEgd2luZG93LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25BdHRhY2hlZFRvV2luZG93KCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxlZCB3aGVuIHRoZSB3aWRnZXQgaXMgZGV0YWNoZWQgZnJvbSBhIHdpbmRvdy4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uRGV0YWNoZWRGcm9tV2luZG93KCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxiYWNrIHVzZWQgdG8gc2VuZCB1cGRhdGVzIGFib3V0IGNoYW5nZXMgdG8gcmVuZGVyaW5nIGRhdGEuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgaW50ZXJmYWNlIE9uQ2hhbmdlZExpc3RlbmVyIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogQ2FsbGVkIHdoZW4gdGhlIHJlbmRlcmluZyBkYXRhIGhhcyBjaGFuZ2VkLgotICAgICAgICAgICAgICoKLSAgICAgICAgICAgICAqIEBwYXJhbSByZW5kZXJpbmdXaWRnZXQgdGhlIHdpZGdldCB3aG9zZSBkYXRhIGhhcyBjaGFuZ2VkCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2hhbmdlZChSZW5kZXJpbmdXaWRnZXQgcmVuZGVyaW5nV2lkZ2V0KTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvdXBkYXRlL0FwaUZhY3RvcnkuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvdXBkYXRlL0FwaUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdiZTU0OS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL3VwZGF0ZS9BcGlGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQubWVkaWEudXBkYXRlOwotCi1pbXBvcnQgYW5kcm9pZC5hcHAuTm90aWZpY2F0aW9uOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5BcHBsaWNhdGlvbkluZm87Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUJyb3dzZXIyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFCcm93c2VyMi5Ccm93c2VyQ2FsbGJhY2s7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUNvbnRyb2xsZXIyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFDb250cm9sbGVyMi5Db250cm9sbGVyQ2FsbGJhY2s7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUl0ZW0yOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFMaWJyYXJ5U2VydmljZTI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUxpYnJhcnlTZXJ2aWNlMi5MaWJyYXJ5Um9vdDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTGlicmFyeVNlcnZpY2UyLk1lZGlhTGlicmFyeVNlc3Npb247Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUxpYnJhcnlTZXJ2aWNlMi5NZWRpYUxpYnJhcnlTZXNzaW9uLk1lZGlhTGlicmFyeVNlc3Npb25DYWxsYmFjazsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTWV0YWRhdGEyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5bGlzdEFnZW50OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kR3JvdXAyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uMi5Db250cm9sbGVySW5mbzsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvbjIuU2Vzc2lvbkNhbGxiYWNrOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uU2VydmljZTI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb25TZXJ2aWNlMi5NZWRpYU5vdGlmaWNhdGlvbjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlJhdGluZzI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5TZXNzaW9uVG9rZW4yOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuVm9sdW1lUHJvdmlkZXIyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLk1lZGlhQnJvd3NlcjJQcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5NZWRpYUNvbnRyb2xWaWV3MlByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLk1lZGlhQ29udHJvbGxlcjJQcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5NZWRpYUl0ZW0yUHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuTWVkaWFMaWJyYXJ5U2VydmljZTJQcm92aWRlci5MaWJyYXJ5Um9vdFByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLk1lZGlhTWV0YWRhdGEyUHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuTWVkaWFQbGF5bGlzdEFnZW50UHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuTWVkaWFTZXNzaW9uMlByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLk1lZGlhU2Vzc2lvbjJQcm92aWRlci5CdWlsZGVyQmFzZVByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLk1lZGlhU2Vzc2lvbjJQcm92aWRlci5Db21tYW5kQnV0dG9uUHJvdmlkZXIuQnVpbGRlclByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLk1lZGlhU2Vzc2lvblNlcnZpY2UyUHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuTWVkaWFTZXNzaW9uU2VydmljZTJQcm92aWRlci5NZWRpYU5vdGlmaWNhdGlvblByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLlNlc3Npb25Ub2tlbjJQcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5TdGF0aWNQcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5WaWRlb1ZpZXcyUHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuVmlld0dyb3VwUHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuVm9sdW1lUHJvdmlkZXIyUHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5JSW50ZXJmYWNlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLk51bGxhYmxlOwotaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuTWVkaWFDb250cm9sVmlldzI7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuVmlkZW9WaWV3MjsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLklNZWRpYUNvbnRyb2xsZXIyOwotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLk1lZGlhQnJvd3NlcjJJbXBsOwotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLk1lZGlhQ29udHJvbGxlcjJJbXBsOwotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLk1lZGlhSXRlbTJJbXBsOwotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLk1lZGlhTGlicmFyeVNlcnZpY2UySW1wbDsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5NZWRpYUxpYnJhcnlTZXJ2aWNlMkltcGwuTGlicmFyeVJvb3RJbXBsOwotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLk1lZGlhTWV0YWRhdGEySW1wbDsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXlsaXN0QWdlbnRJbXBsOwotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvbjJJbXBsOwotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvblNlcnZpY2UySW1wbDsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5SYXRpbmcySW1wbDsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5TZXNzaW9uVG9rZW4ySW1wbDsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5Wb2x1bWVQcm92aWRlcjJJbXBsOwotaW1wb3J0IGNvbS5hbmRyb2lkLndpZGdldC5NZWRpYUNvbnRyb2xWaWV3MkltcGw7Ci1pbXBvcnQgY29tLmFuZHJvaWQud2lkZ2V0LlZpZGVvVmlldzJJbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3I7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBBcGlGYWN0b3J5IGltcGxlbWVudHMgU3RhdGljUHJvdmlkZXIgewotICAgIHByaXZhdGUgQXBpRmFjdG9yeSgpIHsgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdGF0aWNQcm92aWRlciBpbml0aWFsaXplKEFwcGxpY2F0aW9uSW5mbyB1cGRhdGFibGVJbmZvKSB7Ci0gICAgICAgIEFwaUhlbHBlci5pbml0aWFsaXplKHVwZGF0YWJsZUluZm8pOwotICAgICAgICByZXR1cm4gbmV3IEFwaUZhY3RvcnkoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTWVkaWFDb250cm9sbGVyMlByb3ZpZGVyIGNyZWF0ZU1lZGlhQ29udHJvbGxlcjIoCi0gICAgICAgICAgICBDb250ZXh0IGNvbnRleHQsIE1lZGlhQ29udHJvbGxlcjIgaW5zdGFuY2UsIFNlc3Npb25Ub2tlbjIgdG9rZW4sCi0gICAgICAgICAgICBFeGVjdXRvciBleGVjdXRvciwgQ29udHJvbGxlckNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTWVkaWFDb250cm9sbGVyMkltcGwoY29udGV4dCwgaW5zdGFuY2UsIHRva2VuLCBleGVjdXRvciwgY2FsbGJhY2spOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNZWRpYUJyb3dzZXIyUHJvdmlkZXIgY3JlYXRlTWVkaWFCcm93c2VyMihDb250ZXh0IGNvbnRleHQsIE1lZGlhQnJvd3NlcjIgaW5zdGFuY2UsCi0gICAgICAgICAgICBTZXNzaW9uVG9rZW4yIHRva2VuLCBFeGVjdXRvciBleGVjdXRvciwgQnJvd3NlckNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTWVkaWFCcm93c2VyMkltcGwoY29udGV4dCwgaW5zdGFuY2UsIHRva2VuLCBleGVjdXRvciwgY2FsbGJhY2spOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNZWRpYVNlc3Npb24yUHJvdmlkZXIuQ29tbWFuZFByb3ZpZGVyIGNyZWF0ZU1lZGlhU2Vzc2lvbjJDb21tYW5kKAotICAgICAgICAgICAgU2Vzc2lvbkNvbW1hbmQyIGluc3RhbmNlLCBpbnQgY29tbWFuZENvZGUsIFN0cmluZyBhY3Rpb24sIEJ1bmRsZSBleHRyYSkgewotICAgICAgICBpZiAoYWN0aW9uID09IG51bGwgJiYgZXh0cmEgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBNZWRpYVNlc3Npb24ySW1wbC5Db21tYW5kSW1wbChpbnN0YW5jZSwgY29tbWFuZENvZGUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgTWVkaWFTZXNzaW9uMkltcGwuQ29tbWFuZEltcGwoaW5zdGFuY2UsIGFjdGlvbiwgZXh0cmEpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTZXNzaW9uQ29tbWFuZDIgZnJvbUJ1bmRsZV9NZWRpYVNlc3Npb24yQ29tbWFuZChCdW5kbGUgY29tbWFuZCkgewotICAgICAgICByZXR1cm4gTWVkaWFTZXNzaW9uMkltcGwuQ29tbWFuZEltcGwuZnJvbUJ1bmRsZV9pbXBsKGNvbW1hbmQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNZWRpYVNlc3Npb24yUHJvdmlkZXIuQ29tbWFuZEdyb3VwUHJvdmlkZXIgY3JlYXRlTWVkaWFTZXNzaW9uMkNvbW1hbmRHcm91cCgKLSAgICAgICAgICAgIFNlc3Npb25Db21tYW5kR3JvdXAyIGluc3RhbmNlLCBTZXNzaW9uQ29tbWFuZEdyb3VwMiBvdGhlcikgewotICAgICAgICByZXR1cm4gbmV3IE1lZGlhU2Vzc2lvbjJJbXBsLkNvbW1hbmRHcm91cEltcGwoaW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgKG90aGVyID09IG51bGwpID8gbnVsbCA6IG90aGVyLmdldFByb3ZpZGVyKCkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTZXNzaW9uQ29tbWFuZEdyb3VwMiBmcm9tQnVuZGxlX01lZGlhU2Vzc2lvbjJDb21tYW5kR3JvdXAoQnVuZGxlIGNvbW1hbmRzKSB7Ci0gICAgICAgIHJldHVybiBNZWRpYVNlc3Npb24ySW1wbC5Db21tYW5kR3JvdXBJbXBsLmZyb21CdW5kbGVfaW1wbChjb21tYW5kcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1lZGlhU2Vzc2lvbjJQcm92aWRlci5Db250cm9sbGVySW5mb1Byb3ZpZGVyIGNyZWF0ZU1lZGlhU2Vzc2lvbjJDb250cm9sbGVySW5mbygKLSAgICAgICAgICAgIENvbnRleHQgY29udGV4dCwgQ29udHJvbGxlckluZm8gaW5zdGFuY2UsIGludCB1aWQsIGludCBwaWQsIFN0cmluZyBwYWNrYWdlTmFtZSwKLSAgICAgICAgICAgIElJbnRlcmZhY2UgY2FsbGJhY2spIHsKLSAgICAgICAgcmV0dXJuIG5ldyBNZWRpYVNlc3Npb24ySW1wbC5Db250cm9sbGVySW5mb0ltcGwoY29udGV4dCwKLSAgICAgICAgICAgICAgICBpbnN0YW5jZSwgdWlkLCBwaWQsIHBhY2thZ2VOYW1lLCAoSU1lZGlhQ29udHJvbGxlcjIpIGNhbGxiYWNrKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQnVpbGRlclByb3ZpZGVyIGNyZWF0ZU1lZGlhU2Vzc2lvbjJDb21tYW5kQnV0dG9uQnVpbGRlcigKLSAgICAgICAgICAgIE1lZGlhU2Vzc2lvbjIuQ29tbWFuZEJ1dHRvbi5CdWlsZGVyIGluc3RhbmNlKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTWVkaWFTZXNzaW9uMkltcGwuQ29tbWFuZEJ1dHRvbkltcGwuQnVpbGRlckltcGwoaW5zdGFuY2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBCdWlsZGVyQmFzZVByb3ZpZGVyPE1lZGlhU2Vzc2lvbjIsIFNlc3Npb25DYWxsYmFjaz4gY3JlYXRlTWVkaWFTZXNzaW9uMkJ1aWxkZXIoCi0gICAgICAgICAgICBDb250ZXh0IGNvbnRleHQsIE1lZGlhU2Vzc2lvbjIuQnVpbGRlciBpbnN0YW5jZSkgewotICAgICAgICByZXR1cm4gbmV3IE1lZGlhU2Vzc2lvbjJJbXBsLkJ1aWxkZXJJbXBsKGNvbnRleHQsIGluc3RhbmNlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTWVkaWFTZXNzaW9uU2VydmljZTJQcm92aWRlciBjcmVhdGVNZWRpYVNlc3Npb25TZXJ2aWNlMihNZWRpYVNlc3Npb25TZXJ2aWNlMiBpbnN0YW5jZSkgewotICAgICAgICByZXR1cm4gbmV3IE1lZGlhU2Vzc2lvblNlcnZpY2UySW1wbChpbnN0YW5jZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1lZGlhTm90aWZpY2F0aW9uUHJvdmlkZXIgY3JlYXRlTWVkaWFTZXNzaW9uU2VydmljZTJNZWRpYU5vdGlmaWNhdGlvbigKLSAgICAgICAgICAgIE1lZGlhTm90aWZpY2F0aW9uIGluc3RhbmNlLCBpbnQgbm90aWZpY2F0aW9uSWQsIE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLSAgICAgICAgcmV0dXJuIG5ldyBNZWRpYVNlc3Npb25TZXJ2aWNlMkltcGwuTWVkaWFOb3RpZmljYXRpb25JbXBsKAotICAgICAgICAgICAgICAgIGluc3RhbmNlLCBub3RpZmljYXRpb25JZCwgbm90aWZpY2F0aW9uKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTWVkaWFTZXNzaW9uU2VydmljZTJQcm92aWRlciBjcmVhdGVNZWRpYUxpYnJhcnlTZXJ2aWNlMihNZWRpYUxpYnJhcnlTZXJ2aWNlMiBpbnN0YW5jZSkgewotICAgICAgICByZXR1cm4gbmV3IE1lZGlhTGlicmFyeVNlcnZpY2UySW1wbChpbnN0YW5jZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEJ1aWxkZXJCYXNlUHJvdmlkZXI8TWVkaWFMaWJyYXJ5U2Vzc2lvbiwgTWVkaWFMaWJyYXJ5U2Vzc2lvbkNhbGxiYWNrPgotICAgICAgICBjcmVhdGVNZWRpYUxpYnJhcnlTZXJ2aWNlMkJ1aWxkZXIoTWVkaWFMaWJyYXJ5U2VydmljZTIgc2VydmljZSwKLSAgICAgICAgICAgIE1lZGlhTGlicmFyeVNlc3Npb24uQnVpbGRlciBpbnN0YW5jZSwgRXhlY3V0b3IgY2FsbGJhY2tFeGVjdXRvciwKLSAgICAgICAgICAgIE1lZGlhTGlicmFyeVNlc3Npb25DYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICByZXR1cm4gbmV3IE1lZGlhTGlicmFyeVNlcnZpY2UySW1wbC5CdWlsZGVySW1wbChzZXJ2aWNlLCBpbnN0YW5jZSwgY2FsbGJhY2tFeGVjdXRvciwKLSAgICAgICAgICAgICAgICBjYWxsYmFjayk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIExpYnJhcnlSb290UHJvdmlkZXIgY3JlYXRlTWVkaWFMaWJyYXJ5U2VydmljZTJMaWJyYXJ5Um9vdCgKLSAgICAgICAgICAgIExpYnJhcnlSb290IGluc3RhbmNlLCBTdHJpbmcgcm9vdElkLCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTGlicmFyeVJvb3RJbXBsKGluc3RhbmNlLCByb290SWQsIGV4dHJhcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1lZGlhQ29udHJvbFZpZXcyUHJvdmlkZXIgY3JlYXRlTWVkaWFDb250cm9sVmlldzIoTWVkaWFDb250cm9sVmlldzIgaW5zdGFuY2UsCi0gICAgICAgICAgICBWaWV3R3JvdXBQcm92aWRlciBzdXBlclByb3ZpZGVyLCBWaWV3R3JvdXBQcm92aWRlciBwcml2YXRlUHJvdmlkZXIsCi0gICAgICAgICAgICBATnVsbGFibGUgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGVBdHRyLCBpbnQgZGVmU3R5bGVSZXMpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBNZWRpYUNvbnRyb2xWaWV3MkltcGwoaW5zdGFuY2UsIHN1cGVyUHJvdmlkZXIsIHByaXZhdGVQcm92aWRlcik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFZpZGVvVmlldzJQcm92aWRlciBjcmVhdGVWaWRlb1ZpZXcyKAotICAgICAgICAgICAgVmlkZW9WaWV3MiBpbnN0YW5jZSwgVmlld0dyb3VwUHJvdmlkZXIgc3VwZXJQcm92aWRlciwgVmlld0dyb3VwUHJvdmlkZXIgcHJpdmF0ZVByb3ZpZGVyLAotICAgICAgICAgICAgQE51bGxhYmxlIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlQXR0ciwgaW50IGRlZlN0eWxlUmVzKSB7Ci0gICAgICAgIHJldHVybiBuZXcgVmlkZW9WaWV3MkltcGwoaW5zdGFuY2UsIHN1cGVyUHJvdmlkZXIsIHByaXZhdGVQcm92aWRlcik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFNlc3Npb25Ub2tlbjJQcm92aWRlciBjcmVhdGVTZXNzaW9uVG9rZW4yKENvbnRleHQgY29udGV4dCwgU2Vzc2lvblRva2VuMiBpbnN0YW5jZSwKLSAgICAgICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIHNlcnZpY2VOYW1lLCBpbnQgdWlkKSB7Ci0gICAgICAgIHJldHVybiBuZXcgU2Vzc2lvblRva2VuMkltcGwoY29udGV4dCwgaW5zdGFuY2UsIHBhY2thZ2VOYW1lLCBzZXJ2aWNlTmFtZSwgdWlkKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU2Vzc2lvblRva2VuMiBmcm9tQnVuZGxlX1Nlc3Npb25Ub2tlbjIoQnVuZGxlIGJ1bmRsZSkgewotICAgICAgICByZXR1cm4gU2Vzc2lvblRva2VuMkltcGwuZnJvbUJ1bmRsZV9pbXBsKGJ1bmRsZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1lZGlhSXRlbTJQcm92aWRlci5CdWlsZGVyUHJvdmlkZXIgY3JlYXRlTWVkaWFJdGVtMkJ1aWxkZXIoTWVkaWFJdGVtMi5CdWlsZGVyIGluc3RhbmNlLAotICAgICAgICAgICAgaW50IGZsYWdzKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTWVkaWFJdGVtMkltcGwuQnVpbGRlckltcGwoaW5zdGFuY2UsIGZsYWdzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTWVkaWFJdGVtMiBmcm9tQnVuZGxlX01lZGlhSXRlbTIoQnVuZGxlIGJ1bmRsZSkgewotICAgICAgICByZXR1cm4gTWVkaWFJdGVtMkltcGwuZnJvbUJ1bmRsZV9pbXBsKGJ1bmRsZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFZvbHVtZVByb3ZpZGVyMlByb3ZpZGVyIGNyZWF0ZVZvbHVtZVByb3ZpZGVyMihWb2x1bWVQcm92aWRlcjIgaW5zdGFuY2UsIGludCBjb250cm9sVHlwZSwKLSAgICAgICAgICAgIGludCBtYXhWb2x1bWUsIGludCBjdXJyZW50Vm9sdW1lKSB7Ci0gICAgICAgIHJldHVybiBuZXcgVm9sdW1lUHJvdmlkZXIySW1wbChpbnN0YW5jZSwgY29udHJvbFR5cGUsIG1heFZvbHVtZSwgY3VycmVudFZvbHVtZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1lZGlhTWV0YWRhdGEyIGZyb21CdW5kbGVfTWVkaWFNZXRhZGF0YTIoQnVuZGxlIGJ1bmRsZSkgewotICAgICAgICByZXR1cm4gTWVkaWFNZXRhZGF0YTJJbXBsLmZyb21CdW5kbGVfaW1wbChidW5kbGUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNZWRpYU1ldGFkYXRhMlByb3ZpZGVyLkJ1aWxkZXJQcm92aWRlciBjcmVhdGVNZWRpYU1ldGFkYXRhMkJ1aWxkZXIoCi0gICAgICAgICAgICBNZWRpYU1ldGFkYXRhMi5CdWlsZGVyIGluc3RhbmNlKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTWVkaWFNZXRhZGF0YTJJbXBsLkJ1aWxkZXJJbXBsKGluc3RhbmNlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTWVkaWFNZXRhZGF0YTJQcm92aWRlci5CdWlsZGVyUHJvdmlkZXIgY3JlYXRlTWVkaWFNZXRhZGF0YTJCdWlsZGVyKAotICAgICAgICAgICAgTWVkaWFNZXRhZGF0YTIuQnVpbGRlciBpbnN0YW5jZSwgTWVkaWFNZXRhZGF0YTIgc291cmNlKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTWVkaWFNZXRhZGF0YTJJbXBsLkJ1aWxkZXJJbXBsKGluc3RhbmNlLCBzb3VyY2UpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBSYXRpbmcyIGZyb21CdW5kbGVfUmF0aW5nMihCdW5kbGUgYnVuZGxlKSB7Ci0gICAgICAgIHJldHVybiBSYXRpbmcySW1wbC5mcm9tQnVuZGxlX2ltcGwoYnVuZGxlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgUmF0aW5nMiBuZXdVbnJhdGVkUmF0aW5nX1JhdGluZzIoaW50IHJhdGluZ1N0eWxlKSB7Ci0gICAgICAgIHJldHVybiBSYXRpbmcySW1wbC5uZXdVbnJhdGVkUmF0aW5nX2ltcGwocmF0aW5nU3R5bGUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBSYXRpbmcyIG5ld0hlYXJ0UmF0aW5nX1JhdGluZzIoYm9vbGVhbiBoYXNIZWFydCkgewotICAgICAgICByZXR1cm4gUmF0aW5nMkltcGwubmV3SGVhcnRSYXRpbmdfaW1wbChoYXNIZWFydCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFJhdGluZzIgbmV3VGh1bWJSYXRpbmdfUmF0aW5nMihib29sZWFuIHRodW1iSXNVcCkgewotICAgICAgICByZXR1cm4gUmF0aW5nMkltcGwubmV3VGh1bWJSYXRpbmdfaW1wbCh0aHVtYklzVXApOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBSYXRpbmcyIG5ld1N0YXJSYXRpbmdfUmF0aW5nMihpbnQgc3RhclJhdGluZ1N0eWxlLCBmbG9hdCBzdGFyUmF0aW5nKSB7Ci0gICAgICAgIHJldHVybiBSYXRpbmcySW1wbC5uZXdTdGFyUmF0aW5nX2ltcGwoc3RhclJhdGluZ1N0eWxlLCBzdGFyUmF0aW5nKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgUmF0aW5nMiBuZXdQZXJjZW50YWdlUmF0aW5nX1JhdGluZzIoZmxvYXQgcGVyY2VudCkgewotICAgICAgICByZXR1cm4gUmF0aW5nMkltcGwubmV3UGVyY2VudGFnZVJhdGluZ19pbXBsKHBlcmNlbnQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNZWRpYVBsYXlsaXN0QWdlbnRQcm92aWRlciBjcmVhdGVNZWRpYVBsYXlsaXN0QWdlbnQoTWVkaWFQbGF5bGlzdEFnZW50IGluc3RhbmNlKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTWVkaWFQbGF5bGlzdEFnZW50SW1wbChpbnN0YW5jZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS91cGRhdGUvQXBpSGVscGVyLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL3VwZGF0ZS9BcGlIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ4YmI0OC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL3VwZGF0ZS9BcGlIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLm1lZGlhLnVwZGF0ZTsKLQotaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5OdWxsYWJsZTsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dFdyYXBwZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLkFwcGxpY2F0aW9uSW5mbzsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXIuTmFtZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzLlRoZW1lOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuWG1sUmVzb3VyY2VQYXJzZXI7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uR3VhcmRlZEJ5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC53aWRnZXQuU3BhY2U7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY3LndpZGdldC5CdXR0b25CYXJMYXlvdXQ7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuQ29udGV4dFRoZW1lV3JhcHBlcjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIuYXBwLk1lZGlhUm91dGVCdXR0b247Ci1pbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5hcHAuTWVkaWFSb3V0ZUV4cGFuZENvbGxhcHNlQnV0dG9uOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIuYXBwLk1lZGlhUm91dGVWb2x1bWVTbGlkZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5hcHAuT3ZlcmxheUxpc3RWaWV3OwotCi1wdWJsaWMgZmluYWwgY2xhc3MgQXBpSGVscGVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBBcHBsaWNhdGlvbkluZm8gc1VwZGF0YWJsZUluZm87Ci0KLSAgICBAR3VhcmRlZEJ5KCJ0aGlzIikKLSAgICBwcml2YXRlIHN0YXRpYyBUaGVtZSBzTGliVGhlbWU7Ci0KLSAgICBwcml2YXRlIEFwaUhlbHBlcigpIHsgfQotCi0gICAgc3RhdGljIHZvaWQgaW5pdGlhbGl6ZShBcHBsaWNhdGlvbkluZm8gdXBkYXRhYmxlSW5mbykgewotICAgICAgICBpZiAoc1VwZGF0YWJsZUluZm8gIT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiaW5pdGlhbGl6ZSBzaG91bGQgb25seSBiZSBjYWxsZWQgb25jZSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgc1VwZGF0YWJsZUluZm8gPSB1cGRhdGFibGVJbmZvOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgUmVzb3VyY2VzIGdldExpYlJlc291cmNlcyhDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgcmV0dXJuIGdldExpYlRoZW1lKGNvbnRleHQpLmdldFJlc291cmNlcygpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVGhlbWUgZ2V0TGliVGhlbWUoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIGlmIChzTGliVGhlbWUgIT0gbnVsbCkgcmV0dXJuIHNMaWJUaGVtZTsKLQotICAgICAgICByZXR1cm4gZ2V0TGliVGhlbWVTeW5jaHJvbml6ZWQoY29udGV4dCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBUaGVtZSBnZXRMaWJUaGVtZShDb250ZXh0IGNvbnRleHQsIGludCB0aGVtZUlkKSB7Ci0gICAgICAgIFRoZW1lIHRoZW1lID0gZ2V0TGliUmVzb3VyY2VzKGNvbnRleHQpLm5ld1RoZW1lKCk7Ci0gICAgICAgIHRoZW1lLmFwcGx5U3R5bGUodGhlbWVJZCwgdHJ1ZSk7Ci0gICAgICAgIHJldHVybiB0aGVtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIExheW91dEluZmxhdGVyIGdldExheW91dEluZmxhdGVyKENvbnRleHQgY29udGV4dCkgewotICAgICAgICByZXR1cm4gZ2V0TGF5b3V0SW5mbGF0ZXIoY29udGV4dCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBMYXlvdXRJbmZsYXRlciBnZXRMYXlvdXRJbmZsYXRlcihDb250ZXh0IGNvbnRleHQsIFRoZW1lIHRoZW1lKSB7Ci0gICAgICAgIGlmICh0aGVtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aGVtZSA9IGdldExpYlRoZW1lKGNvbnRleHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVE9ETyAoYi83Mjk3NTk3Nik6IEF2b2lkIHRvIHVzZSBDb250ZXh0VGhlbWVXcmFwcGVyIHdpdGggYXBwIGNvbnRleHQgYW5kIGxpYiB0aGVtZS4KLSAgICAgICAgTGF5b3V0SW5mbGF0ZXIgbGF5b3V0SW5mbGF0ZXIgPSBMYXlvdXRJbmZsYXRlci5mcm9tKGNvbnRleHQpLmNsb25lSW5Db250ZXh0KAotICAgICAgICAgICAgICAgIG5ldyBDb250ZXh0VGhlbWVXcmFwcGVyKGNvbnRleHQsIHRoZW1lKSk7Ci0gICAgICAgIGxheW91dEluZmxhdGVyLnNldEZhY3RvcnkyKG5ldyBMYXlvdXRJbmZsYXRlci5GYWN0b3J5MigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIFZpZXcgb25DcmVhdGVWaWV3KAotICAgICAgICAgICAgICAgICAgICBWaWV3IHBhcmVudCwgU3RyaW5nIG5hbWUsIENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKE1lZGlhUm91dGVCdXR0b24uY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpLmVxdWFscyhuYW1lKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE1lZGlhUm91dGVCdXR0b24oY29udGV4dCwgYXR0cnMpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoTWVkaWFSb3V0ZVZvbHVtZVNsaWRlci5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTWVkaWFSb3V0ZVZvbHVtZVNsaWRlcihjb250ZXh0LCBhdHRycyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChNZWRpYVJvdXRlRXhwYW5kQ29sbGFwc2VCdXR0b24uY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpLmVxdWFscyhuYW1lKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE1lZGlhUm91dGVFeHBhbmRDb2xsYXBzZUJ1dHRvbihjb250ZXh0LCBhdHRycyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChPdmVybGF5TGlzdFZpZXcuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpLmVxdWFscyhuYW1lKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE92ZXJsYXlMaXN0Vmlldyhjb250ZXh0LCBhdHRycyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChCdXR0b25CYXJMYXlvdXQuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpLmVxdWFscyhuYW1lKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEJ1dHRvbkJhckxheW91dChjb250ZXh0LCBhdHRycyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChTcGFjZS5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU3BhY2UoY29udGV4dCwgYXR0cnMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgVmlldyBvbkNyZWF0ZVZpZXcoU3RyaW5nIG5hbWUsIENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG9uQ3JlYXRlVmlldyhudWxsLCBuYW1lLCBjb250ZXh0LCBhdHRycyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICByZXR1cm4gbGF5b3V0SW5mbGF0ZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBWaWV3IGluZmxhdGVMaWJMYXlvdXQoQ29udGV4dCBjb250ZXh0LCBpbnQgbGliUmVzSWQpIHsKLSAgICAgICAgcmV0dXJuIGluZmxhdGVMaWJMYXlvdXQoY29udGV4dCwgZ2V0TGliVGhlbWUoY29udGV4dCksIGxpYlJlc0lkLCBudWxsLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBWaWV3IGluZmxhdGVMaWJMYXlvdXQoQ29udGV4dCBjb250ZXh0LCBUaGVtZSB0aGVtZSwgaW50IGxpYlJlc0lkKSB7Ci0gICAgICAgIHJldHVybiBpbmZsYXRlTGliTGF5b3V0KGNvbnRleHQsIHRoZW1lLCBsaWJSZXNJZCwgbnVsbCwgZmFsc2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVmlldyBpbmZsYXRlTGliTGF5b3V0KENvbnRleHQgY29udGV4dCwgVGhlbWUgdGhlbWUsIGludCBsaWJSZXNJZCwKLSAgICAgICAgICAgIEBOdWxsYWJsZSBWaWV3R3JvdXAgcm9vdCwgYm9vbGVhbiBhdHRhY2hUb1Jvb3QpIHsKLSAgICAgICAgdHJ5IChYbWxSZXNvdXJjZVBhcnNlciBwYXJzZXIgPSBnZXRMaWJSZXNvdXJjZXMoY29udGV4dCkuZ2V0TGF5b3V0KGxpYlJlc0lkKSkgewotICAgICAgICAgICAgcmV0dXJuIGdldExheW91dEluZmxhdGVyKGNvbnRleHQsIHRoZW1lKS5pbmZsYXRlKHBhcnNlciwgcm9vdCwgYXR0YWNoVG9Sb290KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHN5bmNocm9uaXplZCBUaGVtZSBnZXRMaWJUaGVtZVN5bmNocm9uaXplZChDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgaWYgKHNMaWJUaGVtZSAhPSBudWxsKSByZXR1cm4gc0xpYlRoZW1lOwotCi0gICAgICAgIGlmIChzVXBkYXRhYmxlSW5mbyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJpbml0aWFsaXplIGhhc24ndCBiZWVuIGNhbGxlZCB5ZXQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gc0xpYlRoZW1lID0gY29udGV4dC5nZXRQYWNrYWdlTWFuYWdlcigpCi0gICAgICAgICAgICAgICAgICAgIC5nZXRSZXNvdXJjZXNGb3JBcHBsaWNhdGlvbihzVXBkYXRhYmxlSW5mbykubmV3VGhlbWUoKTsKLSAgICAgICAgfSBjYXRjaCAoTmFtZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwaTI0L21lZGlhL01lZGlhUm91dGVyQXBpMjQuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcGkyNC9tZWRpYS9NZWRpYVJvdXRlckFwaTI0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExNDZhZjYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwaTI0L21lZGlhL01lZGlhUm91dGVyQXBpMjQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYTsKLQotLy8gQEBSZXF1aXJlc0FwaSgyNCkKLWZpbmFsIGNsYXNzIE1lZGlhUm91dGVyQXBpMjQgewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgUm91dGVJbmZvIHsKLSAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0RGV2aWNlVHlwZShPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgIHJldHVybiAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvKXJvdXRlT2JqKS5nZXREZXZpY2VUeXBlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVBY3Rpb25Qcm92aWRlci5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlQWN0aW9uUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNlOGQ0Ny4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVBY3Rpb25Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5hcHA7Ci0KLWltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTm9uTnVsbDsKLWltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTnVsbGFibGU7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY0LnZpZXcuQWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlU2VsZWN0b3I7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlcjsKLQotaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKLQotLyoqCi0gKiBUaGUgbWVkaWEgcm91dGUgYWN0aW9uIHByb3ZpZGVyIGRpc3BsYXlzIGEge0BsaW5rIE1lZGlhUm91dGVCdXR0b24gbWVkaWEgcm91dGUgYnV0dG9ufQotICogaW4gdGhlIGFwcGxpY2F0aW9uJ3Mge0BsaW5rIEFjdGlvbkJhcn0gdG8gYWxsb3cgdGhlIHVzZXIgdG8gc2VsZWN0IHJvdXRlcyBhbmQKLSAqIHRvIGNvbnRyb2wgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCByb3V0ZS4KLSAqIDxwPgotICogVGhlIGFwcGxpY2F0aW9uIG11c3Qgc3BlY2lmeSB0aGUga2luZHMgb2Ygcm91dGVzIHRoYXQgdGhlIHVzZXIgc2hvdWxkIGJlIGFsbG93ZWQKLSAqIHRvIHNlbGVjdCBieSBzcGVjaWZ5aW5nIGEge0BsaW5rIE1lZGlhUm91dGVTZWxlY3RvciBzZWxlY3Rvcn0gd2l0aCB0aGUKLSAqIHtAbGluayAjc2V0Um91dGVTZWxlY3Rvcn0gbWV0aG9kLgotICogPC9wPjxwPgotICogUmVmZXIgdG8ge0BsaW5rIE1lZGlhUm91dGVCdXR0b259IGZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSBidXR0b24gdGhhdCB3aWxsCi0gKiBhcHBlYXIgaW4gdGhlIGFjdGlvbiBiYXIgbWVudS4gIE5vdGUgdGhhdCBpbnN0ZWFkIG9mIGRpc2FibGluZyB0aGUgYnV0dG9uCi0gKiB3aGVuIG5vIHJvdXRlcyBhcmUgYXZhaWxhYmxlLCB0aGUgYWN0aW9uIHByb3ZpZGVyIHdpbGwgaW5zdGVhZCBtYWtlIHRoZQotICogbWVudSBpdGVtIGludmlzaWJsZS4gIEluIHRoaXMgd2F5LCB0aGUgYnV0dG9uIHdpbGwgb25seSBiZSB2aXNpYmxlIHdoZW4gaXQKLSAqIGlzIHBvc3NpYmxlIGZvciB0aGUgdXNlciB0byBkaXNjb3ZlciBhbmQgc2VsZWN0IGEgbWF0Y2hpbmcgcm91dGUuCi0gKiA8L3A+Ci0gKgotICogPGgzPlByZXJlcXVpc2l0ZXM8L2gzPgotICogPHA+Ci0gKiBUbyB1c2UgdGhlIG1lZGlhIHJvdXRlIGFjdGlvbiBwcm92aWRlciwgdGhlIGFjdGl2aXR5IG11c3QgYmUgYSBzdWJjbGFzcyBvZgotICoge0BsaW5rIEFwcENvbXBhdEFjdGl2aXR5fSBmcm9tIHRoZSA8Y29kZT5hbmRyb2lkLnN1cHBvcnQudjcuYXBwY29tcGF0PC9jb2RlPgotICogc3VwcG9ydCBsaWJyYXJ5LiAgUmVmZXIgdG8gc3VwcG9ydCBsaWJyYXJ5IGRvY3VtZW50YXRpb24gZm9yIGRldGFpbHMuCi0gKiA8L3A+Ci0gKgotICogPGgzPkV4YW1wbGU8L2gzPgotICogPHA+Ci0gKiA8L3A+PHA+Ci0gKiBUaGUgYXBwbGljYXRpb24gc2hvdWxkIGRlZmluZSBhIG1lbnUgcmVzb3VyY2UgdG8gaW5jbHVkZSB0aGUgcHJvdmlkZXIgaW4gdGhlCi0gKiBhY3Rpb24gYmFyIG9wdGlvbnMgbWVudS4gIE5vdGUgdGhhdCB0aGUgc3VwcG9ydCBsaWJyYXJ5IGFjdGlvbiBiYXIgdXNlcyBhdHRyaWJ1dGVzCi0gKiB0aGF0IGFyZSBkZWZpbmVkIGluIHRoZSBhcHBsaWNhdGlvbidzIHJlc291cmNlIG5hbWVzcGFjZSByYXRoZXIgdGhhbiB0aGUgZnJhbWV3b3JrJ3MKLSAqIHJlc291cmNlIG5hbWVzcGFjZSB0byBjb25maWd1cmUgZWFjaCBpdGVtLgotICogPC9wPjxwcmU+Ci0gKiAmbHQ7bWVudSB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gKiAgICAgICAgIHhtbG5zOmFwcD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy1hdXRvIj4KLSAqICAgICAmbHQ7aXRlbSBhbmRyb2lkOmlkPSJAK2lkL21lZGlhX3JvdXRlX21lbnVfaXRlbSIKLSAqICAgICAgICAgYW5kcm9pZDp0aXRsZT0iQHN0cmluZy9tZWRpYV9yb3V0ZV9tZW51X3RpdGxlIgotICogICAgICAgICBhcHA6c2hvd0FzQWN0aW9uPSJhbHdheXMiCi0gKiAgICAgICAgIGFwcDphY3Rpb25Qcm92aWRlckNsYXNzPSJhbmRyb2lkLnN1cHBvcnQudjcuYXBwLk1lZGlhUm91dGVBY3Rpb25Qcm92aWRlciIvPgotICogJmx0Oy9tZW51PgotICogPC9wcmU+PHA+Ci0gKiBUaGVuIGNvbmZpZ3VyZSB0aGUgbWVudSBhbmQgc2V0IHRoZSByb3V0ZSBzZWxlY3RvciBmb3IgdGhlIGNob29zZXIuCi0gKiA8L3A+PHByZT4KLSAqIHB1YmxpYyBjbGFzcyBNeUFjdGl2aXR5IGV4dGVuZHMgQXBwQ29tcGF0QWN0aXZpdHkgewotICogICAgIHByaXZhdGUgTWVkaWFSb3V0ZXIgbVJvdXRlcjsKLSAqICAgICBwcml2YXRlIE1lZGlhUm91dGVyLkNhbGxiYWNrIG1DYWxsYmFjazsKLSAqICAgICBwcml2YXRlIE1lZGlhUm91dGVTZWxlY3RvciBtU2VsZWN0b3I7Ci0gKgotICogICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKLSAqICAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKLSAqCi0gKiAgICAgICAgIG1Sb3V0ZXIgPSBNZWRpYXJvdXRlci5nZXRJbnN0YW5jZSh0aGlzKTsKLSAqICAgICAgICAgbVNlbGVjdG9yID0gbmV3IE1lZGlhUm91dGVTZWxlY3Rvci5CdWlsZGVyKCkKLSAqICAgICAgICAgICAgICAgICAuYWRkQ29udHJvbENhdGVnb3J5KE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9MSVZFX0FVRElPKQotICogICAgICAgICAgICAgICAgIC5hZGRDb250cm9sQ2F0ZWdvcnkoTWVkaWFDb250cm9sSW50ZW50LkNBVEVHT1JZX1JFTU9URV9QTEFZQkFDSykKLSAqICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKLSAqICAgICAgICAgbUNhbGxiYWNrID0gbmV3IE15Q2FsbGJhY2soKTsKLSAqICAgICB9Ci0gKgotICogICAgIC8vIEFkZCB0aGUgY2FsbGJhY2sgb24gc3RhcnQgdG8gdGVsbCB0aGUgbWVkaWEgcm91dGVyIHdoYXQga2luZHMgb2Ygcm91dGVzCi0gKiAgICAgLy8gdGhlIGFwcGxpY2F0aW9uIGlzIGludGVyZXN0ZWQgaW4gc28gdGhhdCBpdCBjYW4gdHJ5IHRvIGRpc2NvdmVyIHN1aXRhYmxlIG9uZXMuCi0gKiAgICAgcHVibGljIHZvaWQgb25TdGFydCgpIHsKLSAqICAgICAgICAgc3VwZXIub25TdGFydCgpOwotICoKLSAqICAgICAgICAgbWVkaWFSb3V0ZXIuYWRkQ2FsbGJhY2sobVNlbGVjdG9yLCBtQ2FsbGJhY2ssCi0gKiAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXIuQ0FMTEJBQ0tfRkxBR19SRVFVRVNUX0RJU0NPVkVSWSk7Ci0gKgotICogICAgICAgICBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUgPSBtZWRpYVJvdXRlci51cGRhdGVTZWxlY3RlZFJvdXRlKG1TZWxlY3Rvcik7Ci0gKiAgICAgICAgIC8vIGRvIHNvbWV0aGluZyB3aXRoIHRoZSByb3V0ZS4uLgotICogICAgIH0KLSAqCi0gKiAgICAgLy8gUmVtb3ZlIHRoZSBzZWxlY3RvciBvbiBzdG9wIHRvIHRlbGwgdGhlIG1lZGlhIHJvdXRlciB0aGF0IGl0IG5vIGxvbmdlcgotICogICAgIC8vIG5lZWRzIHRvIGludmVzdCBlZmZvcnQgdHJ5aW5nIHRvIGRpc2NvdmVyIHJvdXRlcyBvZiB0aGVzZSBraW5kcyBmb3Igbm93LgotICogICAgIHB1YmxpYyB2b2lkIG9uU3RvcCgpIHsKLSAqICAgICAgICAgc3VwZXIub25TdG9wKCk7Ci0gKgotICogICAgICAgICBtZWRpYVJvdXRlci5yZW1vdmVDYWxsYmFjayhtQ2FsbGJhY2spOwotICogICAgIH0KLSAqCi0gKiAgICAgcHVibGljIGJvb2xlYW4gb25DcmVhdGVPcHRpb25zTWVudShNZW51IG1lbnUpIHsKLSAqICAgICAgICAgc3VwZXIub25DcmVhdGVPcHRpb25zTWVudShtZW51KTsKLSAqCi0gKiAgICAgICAgIGdldE1lbnVJbmZsYXRlcigpLmluZmxhdGUoUi5tZW51LnNhbXBsZV9tZWRpYV9yb3V0ZXJfbWVudSwgbWVudSk7Ci0gKgotICogICAgICAgICBNZW51SXRlbSBtZWRpYVJvdXRlTWVudUl0ZW0gPSBtZW51LmZpbmRJdGVtKFIuaWQubWVkaWFfcm91dGVfbWVudV9pdGVtKTsKLSAqICAgICAgICAgTWVkaWFSb3V0ZUFjdGlvblByb3ZpZGVyIG1lZGlhUm91dGVBY3Rpb25Qcm92aWRlciA9Ci0gKiAgICAgICAgICAgICAgICAgKE1lZGlhUm91dGVBY3Rpb25Qcm92aWRlcilNZW51SXRlbUNvbXBhdC5nZXRBY3Rpb25Qcm92aWRlcihtZWRpYVJvdXRlTWVudUl0ZW0pOwotICogICAgICAgICBtZWRpYVJvdXRlQWN0aW9uUHJvdmlkZXIuc2V0Um91dGVTZWxlY3RvcihtU2VsZWN0b3IpOwotICogICAgICAgICByZXR1cm4gdHJ1ZTsKLSAqICAgICB9Ci0gKgotICogICAgIHByaXZhdGUgZmluYWwgY2xhc3MgTXlDYWxsYmFjayBleHRlbmRzIE1lZGlhUm91dGVyLkNhbGxiYWNrIHsKLSAqICAgICAgICAgLy8gSW1wbGVtZW50IGNhbGxiYWNrIG1ldGhvZHMgYXMgbmVlZGVkLgotICogICAgIH0KLSAqIH0KLSAqIDwvcHJlPgotICoKLSAqIEBzZWUgI3NldFJvdXRlU2VsZWN0b3IKLSAqLwotcHVibGljIGNsYXNzIE1lZGlhUm91dGVBY3Rpb25Qcm92aWRlciBleHRlbmRzIEFjdGlvblByb3ZpZGVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk1lZGlhUm91dGVBY3Rpb25Qcm92aWRlciI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIE1lZGlhUm91dGVyIG1Sb3V0ZXI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBNZWRpYVJvdXRlckNhbGxiYWNrIG1DYWxsYmFjazsKLQotICAgIHByaXZhdGUgTWVkaWFSb3V0ZVNlbGVjdG9yIG1TZWxlY3RvciA9IE1lZGlhUm91dGVTZWxlY3Rvci5FTVBUWTsKLSAgICBwcml2YXRlIE1lZGlhUm91dGVEaWFsb2dGYWN0b3J5IG1EaWFsb2dGYWN0b3J5ID0gTWVkaWFSb3V0ZURpYWxvZ0ZhY3RvcnkuZ2V0RGVmYXVsdCgpOwotICAgIHByaXZhdGUgTWVkaWFSb3V0ZUJ1dHRvbiBtQnV0dG9uOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgYWN0aW9uIHByb3ZpZGVyLgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQuCi0gICAgICovCi0gICAgcHVibGljIE1lZGlhUm91dGVBY3Rpb25Qcm92aWRlcihDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgc3VwZXIoY29udGV4dCk7Ci0KLSAgICAgICAgbVJvdXRlciA9IE1lZGlhUm91dGVyLmdldEluc3RhbmNlKGNvbnRleHQpOwotICAgICAgICBtQ2FsbGJhY2sgPSBuZXcgTWVkaWFSb3V0ZXJDYWxsYmFjayh0aGlzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBtZWRpYSByb3V0ZSBzZWxlY3RvciBmb3IgZmlsdGVyaW5nIHRoZSByb3V0ZXMgdGhhdCB0aGUgdXNlciBjYW4KLSAgICAgKiBzZWxlY3QgdXNpbmcgdGhlIG1lZGlhIHJvdXRlIGNob29zZXIgZGlhbG9nLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgc2VsZWN0b3IsIG5ldmVyIG51bGwuCi0gICAgICovCi0gICAgQE5vbk51bGwKLSAgICBwdWJsaWMgTWVkaWFSb3V0ZVNlbGVjdG9yIGdldFJvdXRlU2VsZWN0b3IoKSB7Ci0gICAgICAgIHJldHVybiBtU2VsZWN0b3I7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbWVkaWEgcm91dGUgc2VsZWN0b3IgZm9yIGZpbHRlcmluZyB0aGUgcm91dGVzIHRoYXQgdGhlIHVzZXIgY2FuCi0gICAgICogc2VsZWN0IHVzaW5nIHRoZSBtZWRpYSByb3V0ZSBjaG9vc2VyIGRpYWxvZy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzZWxlY3RvciBUaGUgc2VsZWN0b3IsIG11c3Qgbm90IGJlIG51bGwuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Um91dGVTZWxlY3RvcihATm9uTnVsbCBNZWRpYVJvdXRlU2VsZWN0b3Igc2VsZWN0b3IpIHsKLSAgICAgICAgaWYgKHNlbGVjdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInNlbGVjdG9yIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghbVNlbGVjdG9yLmVxdWFscyhzZWxlY3RvcikpIHsKLSAgICAgICAgICAgIC8vIEZJWE1FOiBXZSBjdXJyZW50bHkgaGF2ZSBubyB3YXkgb2Yga25vd2luZyB3aGV0aGVyIHRoZSBhY3Rpb24gcHJvdmlkZXIKLSAgICAgICAgICAgIC8vIGlzIHN0aWxsIG5lZWRlZCBieSB0aGUgVUkuICBVbmZvcnR1bmF0ZWx5IHRoaXMgbWVhbnMgdGhlIGFjdGlvbiBwcm92aWRlcgotICAgICAgICAgICAgLy8gbWF5IGxlYWsgY2FsbGJhY2tzIHVudGlsIGdhcmJhZ2UgY29sbGVjdGlvbiBvY2N1cnMuICBUaGlzIG1heSByZXN1bHQgaW4KLSAgICAgICAgICAgIC8vIG1lZGlhIHJvdXRlIHByb3ZpZGVycyBkb2luZyBtb3JlIHdvcmsgdGhhbiBuZWNlc3NhcnkgaW4gdGhlIHNob3J0IHRlcm0KLSAgICAgICAgICAgIC8vIHdoaWxlIHRyeWluZyB0byBkaXNjb3ZlciByb3V0ZXMgdGhhdCBhcmUgbm8gbG9uZ2VyIG9mIGludGVyZXN0IHRvIHRoZQotICAgICAgICAgICAgLy8gYXBwbGljYXRpb24uICBUbyBzb2x2ZSB0aGlzIHByb2JsZW0sIHRoZSBhY3Rpb24gcHJvdmlkZXIgd2lsbCBuZWVkIHNvbWUKLSAgICAgICAgICAgIC8vIGluZGljYXRpb24gZnJvbSB0aGUgZnJhbWV3b3JrIHRoYXQgaXQgaXMgYmVpbmcgZGVzdHJveWVkLgotICAgICAgICAgICAgaWYgKCFtU2VsZWN0b3IuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgbVJvdXRlci5yZW1vdmVDYWxsYmFjayhtQ2FsbGJhY2spOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFzZWxlY3Rvci5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBtUm91dGVyLmFkZENhbGxiYWNrKHNlbGVjdG9yLCBtQ2FsbGJhY2spOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVNlbGVjdG9yID0gc2VsZWN0b3I7Ci0gICAgICAgICAgICByZWZyZXNoUm91dGUoKTsKLQotICAgICAgICAgICAgaWYgKG1CdXR0b24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1CdXR0b24uc2V0Um91dGVTZWxlY3RvcihzZWxlY3Rvcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBtZWRpYSByb3V0ZSBkaWFsb2cgZmFjdG9yeSB0byB1c2Ugd2hlbiBzaG93aW5nIHRoZSByb3V0ZSBjaG9vc2VyCi0gICAgICogb3IgY29udHJvbGxlciBkaWFsb2cuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBkaWFsb2cgZmFjdG9yeSwgbmV2ZXIgbnVsbC4KLSAgICAgKi8KLSAgICBATm9uTnVsbAotICAgIHB1YmxpYyBNZWRpYVJvdXRlRGlhbG9nRmFjdG9yeSBnZXREaWFsb2dGYWN0b3J5KCkgewotICAgICAgICByZXR1cm4gbURpYWxvZ0ZhY3Rvcnk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbWVkaWEgcm91dGUgZGlhbG9nIGZhY3RvcnkgdG8gdXNlIHdoZW4gc2hvd2luZyB0aGUgcm91dGUgY2hvb3NlcgotICAgICAqIG9yIGNvbnRyb2xsZXIgZGlhbG9nLgotICAgICAqCi0gICAgICogQHBhcmFtIGZhY3RvcnkgVGhlIGRpYWxvZyBmYWN0b3J5LCBtdXN0IG5vdCBiZSBudWxsLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERpYWxvZ0ZhY3RvcnkoQE5vbk51bGwgTWVkaWFSb3V0ZURpYWxvZ0ZhY3RvcnkgZmFjdG9yeSkgewotICAgICAgICBpZiAoZmFjdG9yeSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJmYWN0b3J5IG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtRGlhbG9nRmFjdG9yeSAhPSBmYWN0b3J5KSB7Ci0gICAgICAgICAgICBtRGlhbG9nRmFjdG9yeSA9IGZhY3Rvcnk7Ci0KLSAgICAgICAgICAgIGlmIChtQnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtQnV0dG9uLnNldERpYWxvZ0ZhY3RvcnkoZmFjdG9yeSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBhc3NvY2lhdGVkIG1lZGlhIHJvdXRlIGJ1dHRvbiwgb3IgbnVsbCBpZiBpdCBoYXMgbm90IHlldCBiZWVuIGNyZWF0ZWQuCi0gICAgICovCi0gICAgQE51bGxhYmxlCi0gICAgcHVibGljIE1lZGlhUm91dGVCdXR0b24gZ2V0TWVkaWFSb3V0ZUJ1dHRvbigpIHsKLSAgICAgICAgcmV0dXJuIG1CdXR0b247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIHdoZW4gdGhlIG1lZGlhIHJvdXRlIGJ1dHRvbiBpcyBiZWluZyBjcmVhdGVkLgotICAgICAqIDxwPgotICAgICAqIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGN1c3RvbWl6ZSB0aGUgYnV0dG9uLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWVkaWFSb3V0ZUJ1dHRvbiBvbkNyZWF0ZU1lZGlhUm91dGVCdXR0b24oKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTWVkaWFSb3V0ZUJ1dHRvbihnZXRDb250ZXh0KCkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCi0gICAgcHVibGljIFZpZXcgb25DcmVhdGVBY3Rpb25WaWV3KCkgewotICAgICAgICBpZiAobUJ1dHRvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBMb2cuZShUQUcsICJvbkNyZWF0ZUFjdGlvblZpZXc6IHRoaXMgQWN0aW9uUHJvdmlkZXIgaXMgYWxyZWFkeSBhc3NvY2lhdGVkICIgKwotICAgICAgICAgICAgICAgICAgICAid2l0aCBhIG1lbnUgaXRlbS4gRG9uJ3QgcmV1c2UgTWVkaWFSb3V0ZUFjdGlvblByb3ZpZGVyIGluc3RhbmNlcyEgIiArCi0gICAgICAgICAgICAgICAgICAgICJBYmFuZG9uaW5nIHRoZSBvbGQgbWVudSBpdGVtLi4uIik7Ci0gICAgICAgIH0KLQotICAgICAgICBtQnV0dG9uID0gb25DcmVhdGVNZWRpYVJvdXRlQnV0dG9uKCk7Ci0gICAgICAgIG1CdXR0b24uc2V0Q2hlYXRTaGVldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgIG1CdXR0b24uc2V0Um91dGVTZWxlY3RvcihtU2VsZWN0b3IpOwotICAgICAgICBtQnV0dG9uLnNldERpYWxvZ0ZhY3RvcnkobURpYWxvZ0ZhY3RvcnkpOwotICAgICAgICBtQnV0dG9uLnNldExheW91dFBhcmFtcyhuZXcgVmlld0dyb3VwLkxheW91dFBhcmFtcygKLSAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCwKLSAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCkpOwotICAgICAgICByZXR1cm4gbUJ1dHRvbjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBvblBlcmZvcm1EZWZhdWx0QWN0aW9uKCkgewotICAgICAgICBpZiAobUJ1dHRvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUJ1dHRvbi5zaG93RGlhbG9nKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIG92ZXJyaWRlc0l0ZW1WaXNpYmlsaXR5KCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Zpc2libGUoKSB7Ci0gICAgICAgIHJldHVybiBtUm91dGVyLmlzUm91dGVBdmFpbGFibGUobVNlbGVjdG9yLAotICAgICAgICAgICAgICAgIE1lZGlhUm91dGVyLkFWQUlMQUJJTElUWV9GTEFHX0lHTk9SRV9ERUZBVUxUX1JPVVRFKTsKLSAgICB9Ci0KLSAgICB2b2lkIHJlZnJlc2hSb3V0ZSgpIHsKLSAgICAgICAgcmVmcmVzaFZpc2liaWxpdHkoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBNZWRpYVJvdXRlckNhbGxiYWNrIGV4dGVuZHMgTWVkaWFSb3V0ZXIuQ2FsbGJhY2sgewotICAgICAgICBwcml2YXRlIGZpbmFsIFdlYWtSZWZlcmVuY2U8TWVkaWFSb3V0ZUFjdGlvblByb3ZpZGVyPiBtUHJvdmlkZXJXZWFrOwotCi0gICAgICAgIHB1YmxpYyBNZWRpYVJvdXRlckNhbGxiYWNrKE1lZGlhUm91dGVBY3Rpb25Qcm92aWRlciBwcm92aWRlcikgewotICAgICAgICAgICAgbVByb3ZpZGVyV2VhayA9IG5ldyBXZWFrUmVmZXJlbmNlPE1lZGlhUm91dGVBY3Rpb25Qcm92aWRlcj4ocHJvdmlkZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVBZGRlZChNZWRpYVJvdXRlciByb3V0ZXIsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyBpbmZvKSB7Ci0gICAgICAgICAgICByZWZyZXNoUm91dGUocm91dGVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlUmVtb3ZlZChNZWRpYVJvdXRlciByb3V0ZXIsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyBpbmZvKSB7Ci0gICAgICAgICAgICByZWZyZXNoUm91dGUocm91dGVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlQ2hhbmdlZChNZWRpYVJvdXRlciByb3V0ZXIsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyBpbmZvKSB7Ci0gICAgICAgICAgICByZWZyZXNoUm91dGUocm91dGVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblByb3ZpZGVyQWRkZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBNZWRpYVJvdXRlci5Qcm92aWRlckluZm8gcHJvdmlkZXIpIHsKLSAgICAgICAgICAgIHJlZnJlc2hSb3V0ZShyb3V0ZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUHJvdmlkZXJSZW1vdmVkKE1lZGlhUm91dGVyIHJvdXRlciwgTWVkaWFSb3V0ZXIuUHJvdmlkZXJJbmZvIHByb3ZpZGVyKSB7Ci0gICAgICAgICAgICByZWZyZXNoUm91dGUocm91dGVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblByb3ZpZGVyQ2hhbmdlZChNZWRpYVJvdXRlciByb3V0ZXIsIE1lZGlhUm91dGVyLlByb3ZpZGVySW5mbyBwcm92aWRlcikgewotICAgICAgICAgICAgcmVmcmVzaFJvdXRlKHJvdXRlcik7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgcmVmcmVzaFJvdXRlKE1lZGlhUm91dGVyIHJvdXRlcikgewotICAgICAgICAgICAgTWVkaWFSb3V0ZUFjdGlvblByb3ZpZGVyIHByb3ZpZGVyID0gbVByb3ZpZGVyV2Vhay5nZXQoKTsKLSAgICAgICAgICAgIGlmIChwcm92aWRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcHJvdmlkZXIucmVmcmVzaFJvdXRlKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJvdXRlci5yZW1vdmVDYWxsYmFjayh0aGlzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZUJ1dHRvbi5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlQnV0dG9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkZThhNjMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlQnV0dG9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MjkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLmFwcDsKLQotaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5Ob25OdWxsOwotaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OwotaW1wb3J0IGFuZHJvaWQuYXBwLkZyYWdtZW50TWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dFdyYXBwZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db2xvclN0YXRlTGlzdDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5BbmltYXRpb25EcmF3YWJsZTsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOwotaW1wb3J0IGFuZHJvaWQub3MuQXN5bmNUYXNrOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZUNvbXBhdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjcud2lkZ2V0LlRvb2x0aXBDb21wYXQ7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGFuZHJvaWQudXRpbC5TcGFyc2VBcnJheTsKLWltcG9ydCBhbmRyb2lkLnZpZXcuU291bmRFZmZlY3RDb25zdGFudHM7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS51cGRhdGUuQXBpSGVscGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLnVwZGF0ZS5SOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVNlbGVjdG9yOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZXI7Ci0KLS8qKgotICogVGhlIG1lZGlhIHJvdXRlIGJ1dHRvbiBhbGxvd3MgdGhlIHVzZXIgdG8gc2VsZWN0IHJvdXRlcyBhbmQgdG8gY29udHJvbCB0aGUKLSAqIGN1cnJlbnRseSBzZWxlY3RlZCByb3V0ZS4KLSAqIDxwPgotICogVGhlIGFwcGxpY2F0aW9uIG11c3Qgc3BlY2lmeSB0aGUga2luZHMgb2Ygcm91dGVzIHRoYXQgdGhlIHVzZXIgc2hvdWxkIGJlIGFsbG93ZWQKLSAqIHRvIHNlbGVjdCBieSBzcGVjaWZ5aW5nIGEge0BsaW5rIE1lZGlhUm91dGVTZWxlY3RvciBzZWxlY3Rvcn0gd2l0aCB0aGUKLSAqIHtAbGluayAjc2V0Um91dGVTZWxlY3Rvcn0gbWV0aG9kLgotICogPC9wPjxwPgotICogV2hlbiB0aGUgZGVmYXVsdCByb3V0ZSBpcyBzZWxlY3RlZCBvciB3aGVuIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcm91dGUgZG9lcyBub3QKLSAqIG1hdGNoIHRoZSB7QGxpbmsgI2dldFJvdXRlU2VsZWN0b3IoKSBzZWxlY3Rvcn0sIHRoZSBidXR0b24gd2lsbCBhcHBlYXIgaW4KLSAqIGFuIGluYWN0aXZlIHN0YXRlIGluZGljYXRpbmcgdGhhdCB0aGUgYXBwbGljYXRpb24gaXMgbm90IGNvbm5lY3RlZCB0byBhCi0gKiByb3V0ZSBvZiB0aGUga2luZCB0aGF0IGl0IHdhbnRzIHRvIHVzZS4gIENsaWNraW5nIG9uIHRoZSBidXR0b24gb3BlbnMKLSAqIGEge0BsaW5rIE1lZGlhUm91dGVDaG9vc2VyRGlhbG9nfSB0byBhbGxvdyB0aGUgdXNlciB0byBzZWxlY3QgYSByb3V0ZS4KLSAqIElmIG5vIG5vbi1kZWZhdWx0IHJvdXRlcyBtYXRjaCB0aGUgc2VsZWN0b3IgYW5kIGl0IGlzIG5vdCBwb3NzaWJsZSBmb3IgYW4gYWN0aXZlCi0gKiBzY2FuIHRvIGRpc2NvdmVyIGFueSBtYXRjaGluZyByb3V0ZXMsIHRoZW4gdGhlIGJ1dHRvbiBpcyBkaXNhYmxlZCBhbmQgY2Fubm90Ci0gKiBiZSBjbGlja2VkLgotICogPC9wPjxwPgotICogV2hlbiBhIG5vbi1kZWZhdWx0IHJvdXRlIGlzIHNlbGVjdGVkIHRoYXQgbWF0Y2hlcyB0aGUgc2VsZWN0b3IsIHRoZSBidXR0b24gd2lsbAotICogYXBwZWFyIGluIGFuIGFjdGl2ZSBzdGF0ZSBpbmRpY2F0aW5nIHRoYXQgdGhlIGFwcGxpY2F0aW9uIGlzIGNvbm5lY3RlZAotICogdG8gYSByb3V0ZSBvZiB0aGUga2luZCB0aGF0IGl0IHdhbnRzIHRvIHVzZS4gIFRoZSBidXR0b24gbWF5IGFsc28gYXBwZWFyCi0gKiBpbiBhbiBpbnRlcm1lZGlhcnkgY29ubmVjdGluZyBzdGF0ZSBpZiB0aGUgcm91dGUgaXMgaW4gdGhlIHByb2Nlc3Mgb2YgY29ubmVjdGluZwotICogdG8gdGhlIGRlc3RpbmF0aW9uIGJ1dCBoYXMgbm90IHlldCBjb21wbGV0ZWQgZG9pbmcgc28uICBJbiBlaXRoZXIgY2FzZSwgY2xpY2tpbmcKLSAqIG9uIHRoZSBidXR0b24gb3BlbnMgYSB7QGxpbmsgTWVkaWFSb3V0ZUNvbnRyb2xsZXJEaWFsb2d9IHRvIGFsbG93IHRoZSB1c2VyCi0gKiB0byBjb250cm9sIG9yIGRpc2Nvbm5lY3QgZnJvbSB0aGUgY3VycmVudCByb3V0ZS4KLSAqIDwvcD4KLSAqCi0gKiA8aDM+UHJlcmVxdWlzaXRlczwvaDM+Ci0gKiA8cD4KLSAqIFRvIHVzZSB0aGUgbWVkaWEgcm91dGUgYnV0dG9uLCB0aGUgYWN0aXZpdHkgbXVzdCBiZSBhIHN1YmNsYXNzIG9mCi0gKiB7QGxpbmsgRnJhZ21lbnRBY3Rpdml0eX0gZnJvbSB0aGUgPGNvZGU+YW5kcm9pZC5zdXBwb3J0LnY0PC9jb2RlPgotICogc3VwcG9ydCBsaWJyYXJ5LiAgUmVmZXIgdG8gc3VwcG9ydCBsaWJyYXJ5IGRvY3VtZW50YXRpb24gZm9yIGRldGFpbHMuCi0gKiA8L3A+Ci0gKgotICogQHNlZSBNZWRpYVJvdXRlQWN0aW9uUHJvdmlkZXIKLSAqIEBzZWUgI3NldFJvdXRlU2VsZWN0b3IKLSAqLwotcHVibGljIGNsYXNzIE1lZGlhUm91dGVCdXR0b24gZXh0ZW5kcyBWaWV3IHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk1lZGlhUm91dGVCdXR0b24iOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENIT09TRVJfRlJBR01FTlRfVEFHID0KLSAgICAgICAgICAgICJhbmRyb2lkLnN1cHBvcnQudjcubWVkaWFyb3V0ZXI6TWVkaWFSb3V0ZUNob29zZXJEaWFsb2dGcmFnbWVudCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRST0xMRVJfRlJBR01FTlRfVEFHID0KLSAgICAgICAgICAgICJhbmRyb2lkLnN1cHBvcnQudjcubWVkaWFyb3V0ZXI6TWVkaWFSb3V0ZUNvbnRyb2xsZXJEaWFsb2dGcmFnbWVudCI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIE1lZGlhUm91dGVyIG1Sb3V0ZXI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBNZWRpYVJvdXRlckNhbGxiYWNrIG1DYWxsYmFjazsKLQotICAgIHByaXZhdGUgTWVkaWFSb3V0ZVNlbGVjdG9yIG1TZWxlY3RvciA9IE1lZGlhUm91dGVTZWxlY3Rvci5FTVBUWTsKLSAgICBwcml2YXRlIGludCBtUm91dGVDYWxsYmFja0ZsYWdzOwotICAgIHByaXZhdGUgTWVkaWFSb3V0ZURpYWxvZ0ZhY3RvcnkgbURpYWxvZ0ZhY3RvcnkgPSBNZWRpYVJvdXRlRGlhbG9nRmFjdG9yeS5nZXREZWZhdWx0KCk7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gbUF0dGFjaGVkVG9XaW5kb3c7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTcGFyc2VBcnJheTxEcmF3YWJsZS5Db25zdGFudFN0YXRlPiBzUmVtb3RlSW5kaWNhdG9yQ2FjaGUgPQotICAgICAgICAgICAgbmV3IFNwYXJzZUFycmF5PD4oMik7Ci0gICAgcHJpdmF0ZSBSZW1vdGVJbmRpY2F0b3JMb2FkZXIgbVJlbW90ZUluZGljYXRvckxvYWRlcjsKLSAgICBwcml2YXRlIERyYXdhYmxlIG1SZW1vdGVJbmRpY2F0b3I7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1SZW1vdGVBY3RpdmU7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1Jc0Nvbm5lY3Rpbmc7Ci0KLSAgICBwcml2YXRlIENvbG9yU3RhdGVMaXN0IG1CdXR0b25UaW50OwotICAgIHByaXZhdGUgaW50IG1NaW5XaWR0aDsKLSAgICBwcml2YXRlIGludCBtTWluSGVpZ2h0OwotCi0gICAgLy8gVGhlIGNoZWNrZWQgc3RhdGUgaXMgdXNlZCB3aGVuIGNvbm5lY3RlZCB0byBhIHJlbW90ZSByb3V0ZS4KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSBDSEVDS0VEX1NUQVRFX1NFVCA9IHsKLSAgICAgICAgYW5kcm9pZC5SLmF0dHIuc3RhdGVfY2hlY2tlZAotICAgIH07Ci0KLSAgICAvLyBUaGUgY2hlY2thYmxlIHN0YXRlIGlzIHVzZWQgd2hpbGUgY29ubmVjdGluZyB0byBhIHJlbW90ZSByb3V0ZS4KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSBDSEVDS0FCTEVfU1RBVEVfU0VUID0gewotICAgICAgICBhbmRyb2lkLlIuYXR0ci5zdGF0ZV9jaGVja2FibGUKLSAgICB9OwotCi0gICAgcHVibGljIE1lZGlhUm91dGVCdXR0b24oQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIE1lZGlhUm91dGVCdXR0b24oQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKLSAgICAgICAgdGhpcyhjb250ZXh0LCBhdHRycywgUi5hdHRyLm1lZGlhUm91dGVCdXR0b25TdHlsZSk7Ci0gICAgfQotCi0gICAgcHVibGljIE1lZGlhUm91dGVCdXR0b24oQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZUF0dHIpIHsKLSAgICAgICAgc3VwZXIoTWVkaWFSb3V0ZXJUaGVtZUhlbHBlci5jcmVhdGVUaGVtZWRCdXR0b25Db250ZXh0KGNvbnRleHQpLCBhdHRycywgZGVmU3R5bGVBdHRyKTsKLSAgICAgICAgY29udGV4dCA9IGdldENvbnRleHQoKTsKLQotICAgICAgICBtUm91dGVyID0gTWVkaWFSb3V0ZXIuZ2V0SW5zdGFuY2UoY29udGV4dCk7Ci0gICAgICAgIG1DYWxsYmFjayA9IG5ldyBNZWRpYVJvdXRlckNhbGxiYWNrKCk7Ci0KLSAgICAgICAgUmVzb3VyY2VzLlRoZW1lIHRoZW1lID0gQXBpSGVscGVyLmdldExpYlJlc291cmNlcyhjb250ZXh0KS5uZXdUaGVtZSgpOwotICAgICAgICB0aGVtZS5hcHBseVN0eWxlKE1lZGlhUm91dGVyVGhlbWVIZWxwZXIuZ2V0Um91dGVyVGhlbWVJZChjb250ZXh0KSwgdHJ1ZSk7Ci0gICAgICAgIFR5cGVkQXJyYXkgYSA9IHRoZW1lLm9idGFpblN0eWxlZEF0dHJpYnV0ZXMoYXR0cnMsCi0gICAgICAgICAgICAgICAgUi5zdHlsZWFibGUuTWVkaWFSb3V0ZUJ1dHRvbiwgZGVmU3R5bGVBdHRyLCAwKTsKLQotICAgICAgICBtQnV0dG9uVGludCA9IGEuZ2V0Q29sb3JTdGF0ZUxpc3QoUi5zdHlsZWFibGUuTWVkaWFSb3V0ZUJ1dHRvbl9tZWRpYVJvdXRlQnV0dG9uVGludCk7Ci0gICAgICAgIG1NaW5XaWR0aCA9IGEuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKAotICAgICAgICAgICAgICAgIFIuc3R5bGVhYmxlLk1lZGlhUm91dGVCdXR0b25fYW5kcm9pZF9taW5XaWR0aCwgMCk7Ci0gICAgICAgIG1NaW5IZWlnaHQgPSBhLmdldERpbWVuc2lvblBpeGVsU2l6ZSgKLSAgICAgICAgICAgICAgICBSLnN0eWxlYWJsZS5NZWRpYVJvdXRlQnV0dG9uX2FuZHJvaWRfbWluSGVpZ2h0LCAwKTsKLSAgICAgICAgaW50IHJlbW90ZUluZGljYXRvclJlc0lkID0gYS5nZXRSZXNvdXJjZUlkKAotICAgICAgICAgICAgICAgIFIuc3R5bGVhYmxlLk1lZGlhUm91dGVCdXR0b25fZXh0ZXJuYWxSb3V0ZUVuYWJsZWREcmF3YWJsZSwgMCk7Ci0gICAgICAgIGEucmVjeWNsZSgpOwotCi0gICAgICAgIGlmIChyZW1vdGVJbmRpY2F0b3JSZXNJZCAhPSAwKSB7Ci0gICAgICAgICAgICBEcmF3YWJsZS5Db25zdGFudFN0YXRlIHJlbW90ZUluZGljYXRvclN0YXRlID0KLSAgICAgICAgICAgICAgICAgICAgc1JlbW90ZUluZGljYXRvckNhY2hlLmdldChyZW1vdGVJbmRpY2F0b3JSZXNJZCk7Ci0gICAgICAgICAgICBpZiAocmVtb3RlSW5kaWNhdG9yU3RhdGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHNldFJlbW90ZUluZGljYXRvckRyYXdhYmxlKHJlbW90ZUluZGljYXRvclN0YXRlLm5ld0RyYXdhYmxlKCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtUmVtb3RlSW5kaWNhdG9yTG9hZGVyID0gbmV3IFJlbW90ZUluZGljYXRvckxvYWRlcihyZW1vdGVJbmRpY2F0b3JSZXNJZCk7Ci0gICAgICAgICAgICAgICAgbVJlbW90ZUluZGljYXRvckxvYWRlci5leGVjdXRlT25FeGVjdXRvcihBc3luY1Rhc2suVEhSRUFEX1BPT0xfRVhFQ1VUT1IpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdXBkYXRlQ29udGVudERlc2NyaXB0aW9uKCk7Ci0gICAgICAgIHNldENsaWNrYWJsZSh0cnVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBtZWRpYSByb3V0ZSBzZWxlY3RvciBmb3IgZmlsdGVyaW5nIHRoZSByb3V0ZXMgdGhhdCB0aGUgdXNlciBjYW4KLSAgICAgKiBzZWxlY3QgdXNpbmcgdGhlIG1lZGlhIHJvdXRlIGNob29zZXIgZGlhbG9nLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgc2VsZWN0b3IsIG5ldmVyIG51bGwuCi0gICAgICovCi0gICAgQE5vbk51bGwKLSAgICBwdWJsaWMgTWVkaWFSb3V0ZVNlbGVjdG9yIGdldFJvdXRlU2VsZWN0b3IoKSB7Ci0gICAgICAgIHJldHVybiBtU2VsZWN0b3I7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbWVkaWEgcm91dGUgc2VsZWN0b3IgZm9yIGZpbHRlcmluZyB0aGUgcm91dGVzIHRoYXQgdGhlIHVzZXIgY2FuCi0gICAgICogc2VsZWN0IHVzaW5nIHRoZSBtZWRpYSByb3V0ZSBjaG9vc2VyIGRpYWxvZy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzZWxlY3RvciBUaGUgc2VsZWN0b3IuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Um91dGVTZWxlY3RvcihNZWRpYVJvdXRlU2VsZWN0b3Igc2VsZWN0b3IpIHsKLSAgICAgICAgc2V0Um91dGVTZWxlY3RvcihzZWxlY3RvciwgMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbWVkaWEgcm91dGUgc2VsZWN0b3IgZm9yIGZpbHRlcmluZyB0aGUgcm91dGVzIHRoYXQgdGhlIHVzZXIgY2FuCi0gICAgICogc2VsZWN0IHVzaW5nIHRoZSBtZWRpYSByb3V0ZSBjaG9vc2VyIGRpYWxvZy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzZWxlY3RvciBUaGUgc2VsZWN0b3IuCi0gICAgICogQHBhcmFtIGZsYWdzIEZsYWdzIHRvIGNvbnRyb2wgdGhlIGJlaGF2aW9yIG9mIHRoZSBjYWxsYmFjay4gTWF5IGJlIHplcm8gb3IgYSBjb21iaW5hdGlvbiBvZgotICAgICAqICAgICAgICAgICAgICB7QGxpbmsgI01lZGlhUm91dGVyLkNBTExCQUNLX0ZMQUdfUEVSRk9STV9BQ1RJVkVfU0NBTn0gYW5kCi0gICAgICogICAgICAgICAgICAgIHtAbGluayAjTWVkaWFSb3V0ZXIuQ0FMTEJBQ0tfRkxBR19VTkZJTFRFUkVEX0VWRU5UU30uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Um91dGVTZWxlY3RvcihNZWRpYVJvdXRlU2VsZWN0b3Igc2VsZWN0b3IsIGludCBmbGFncykgewotICAgICAgICBpZiAobVNlbGVjdG9yLmVxdWFscyhzZWxlY3RvcikgJiYgbVJvdXRlQ2FsbGJhY2tGbGFncyA9PSBmbGFncykgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmICghbVNlbGVjdG9yLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgbVJvdXRlci5yZW1vdmVDYWxsYmFjayhtQ2FsbGJhY2spOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzZWxlY3RvciA9PSBudWxsIHx8IHNlbGVjdG9yLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgbVNlbGVjdG9yID0gTWVkaWFSb3V0ZVNlbGVjdG9yLkVNUFRZOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgbVNlbGVjdG9yID0gc2VsZWN0b3I7Ci0gICAgICAgIG1Sb3V0ZUNhbGxiYWNrRmxhZ3MgPSBmbGFnczsKLQotICAgICAgICBpZiAobUF0dGFjaGVkVG9XaW5kb3cpIHsKLSAgICAgICAgICAgIG1Sb3V0ZXIuYWRkQ2FsbGJhY2soc2VsZWN0b3IsIG1DYWxsYmFjaywgZmxhZ3MpOwotICAgICAgICAgICAgcmVmcmVzaFJvdXRlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBtZWRpYSByb3V0ZSBkaWFsb2cgZmFjdG9yeSB0byB1c2Ugd2hlbiBzaG93aW5nIHRoZSByb3V0ZSBjaG9vc2VyCi0gICAgICogb3IgY29udHJvbGxlciBkaWFsb2cuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBkaWFsb2cgZmFjdG9yeSwgbmV2ZXIgbnVsbC4KLSAgICAgKi8KLSAgICBATm9uTnVsbAotICAgIHB1YmxpYyBNZWRpYVJvdXRlRGlhbG9nRmFjdG9yeSBnZXREaWFsb2dGYWN0b3J5KCkgewotICAgICAgICByZXR1cm4gbURpYWxvZ0ZhY3Rvcnk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbWVkaWEgcm91dGUgZGlhbG9nIGZhY3RvcnkgdG8gdXNlIHdoZW4gc2hvd2luZyB0aGUgcm91dGUgY2hvb3NlcgotICAgICAqIG9yIGNvbnRyb2xsZXIgZGlhbG9nLgotICAgICAqCi0gICAgICogQHBhcmFtIGZhY3RvcnkgVGhlIGRpYWxvZyBmYWN0b3J5LCBtdXN0IG5vdCBiZSBudWxsLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERpYWxvZ0ZhY3RvcnkoQE5vbk51bGwgTWVkaWFSb3V0ZURpYWxvZ0ZhY3RvcnkgZmFjdG9yeSkgewotICAgICAgICBpZiAoZmFjdG9yeSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJmYWN0b3J5IG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1EaWFsb2dGYWN0b3J5ID0gZmFjdG9yeTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTaG93IHRoZSByb3V0ZSBjaG9vc2VyIG9yIGNvbnRyb2xsZXIgZGlhbG9nLgotICAgICAqIDxwPgotICAgICAqIElmIHRoZSBkZWZhdWx0IHJvdXRlIGlzIHNlbGVjdGVkIG9yIGlmIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcm91dGUgZG9lcwotICAgICAqIG5vdCBtYXRjaCB0aGUge0BsaW5rICNnZXRSb3V0ZVNlbGVjdG9yIHNlbGVjdG9yfSwgdGhlbiBzaG93cyB0aGUgcm91dGUgY2hvb3NlciBkaWFsb2cuCi0gICAgICogT3RoZXJ3aXNlLCBzaG93cyB0aGUgcm91dGUgY29udHJvbGxlciBkaWFsb2cgdG8gb2ZmZXIgdGhlIHVzZXIKLSAgICAgKiBhIGNob2ljZSB0byBkaXNjb25uZWN0IGZyb20gdGhlIHJvdXRlIG9yIHBlcmZvcm0gb3RoZXIgY29udHJvbCBhY3Rpb25zCi0gICAgICogc3VjaCBhcyBzZXR0aW5nIHRoZSByb3V0ZSdzIHZvbHVtZS4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhlIGFwcGxpY2F0aW9uIGNhbiBjdXN0b21pemUgdGhlIGRpYWxvZ3MgYnkgY2FsbGluZyB7QGxpbmsgI3NldERpYWxvZ0ZhY3Rvcnl9Ci0gICAgICogdG8gcHJvdmlkZSBhIGN1c3RvbWl6ZWQgZGlhbG9nIGZhY3RvcnkuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBkaWFsb2cgd2FzIGFjdHVhbGx5IHNob3duLgotICAgICAqCi0gICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlIGFjdGl2aXR5IGlzIG5vdCBhIHN1YmNsYXNzIG9mCi0gICAgICoge0BsaW5rIEZyYWdtZW50QWN0aXZpdHl9LgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHNob3dEaWFsb2coKSB7Ci0gICAgICAgIGlmICghbUF0dGFjaGVkVG9XaW5kb3cpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIEZyYWdtZW50TWFuYWdlciBmbSA9IGdldEFjdGl2aXR5KCkuZ2V0RnJhZ21lbnRNYW5hZ2VyKCk7Ci0gICAgICAgIGlmIChmbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUaGUgYWN0aXZpdHkgbXVzdCBiZSBhIHN1YmNsYXNzIG9mIEZyYWdtZW50QWN0aXZpdHkiKTsKLSAgICAgICAgfQotCi0gICAgICAgIE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSA9IG1Sb3V0ZXIuZ2V0U2VsZWN0ZWRSb3V0ZSgpOwotICAgICAgICBpZiAocm91dGUuaXNEZWZhdWx0T3JCbHVldG9vdGgoKSB8fCAhcm91dGUubWF0Y2hlc1NlbGVjdG9yKG1TZWxlY3RvcikpIHsKLSAgICAgICAgICAgIGlmIChmbS5maW5kRnJhZ21lbnRCeVRhZyhDSE9PU0VSX0ZSQUdNRU5UX1RBRykgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgInNob3dEaWFsb2coKTogUm91dGUgY2hvb3NlciBkaWFsb2cgYWxyZWFkeSBzaG93aW5nISIpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIE1lZGlhUm91dGVDaG9vc2VyRGlhbG9nRnJhZ21lbnQgZiA9Ci0gICAgICAgICAgICAgICAgICAgIG1EaWFsb2dGYWN0b3J5Lm9uQ3JlYXRlQ2hvb3NlckRpYWxvZ0ZyYWdtZW50KCk7Ci0gICAgICAgICAgICBmLnNldFJvdXRlU2VsZWN0b3IobVNlbGVjdG9yKTsKLSAgICAgICAgICAgIGYuc2hvdyhmbSwgQ0hPT1NFUl9GUkFHTUVOVF9UQUcpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKGZtLmZpbmRGcmFnbWVudEJ5VGFnKENPTlRST0xMRVJfRlJBR01FTlRfVEFHKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAic2hvd0RpYWxvZygpOiBSb3V0ZSBjb250cm9sbGVyIGRpYWxvZyBhbHJlYWR5IHNob3dpbmchIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTWVkaWFSb3V0ZUNvbnRyb2xsZXJEaWFsb2dGcmFnbWVudCBmID0KLSAgICAgICAgICAgICAgICAgICAgbURpYWxvZ0ZhY3Rvcnkub25DcmVhdGVDb250cm9sbGVyRGlhbG9nRnJhZ21lbnQoKTsKLSAgICAgICAgICAgIGYuc2hvdyhmbSwgQ09OVFJPTExFUl9GUkFHTUVOVF9UQUcpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotCi0gICAgcHJpdmF0ZSBBY3Rpdml0eSBnZXRBY3Rpdml0eSgpIHsKLSAgICAgICAgLy8gR3Jvc3Mgd2F5IG9mIHVud3JhcHBpbmcgdGhlIEFjdGl2aXR5IHNvIHdlIGNhbiBnZXQgdGhlIEZyYWdtZW50TWFuYWdlcgotICAgICAgICBDb250ZXh0IGNvbnRleHQgPSBnZXRDb250ZXh0KCk7Ci0gICAgICAgIHdoaWxlIChjb250ZXh0IGluc3RhbmNlb2YgQ29udGV4dFdyYXBwZXIpIHsKLSAgICAgICAgICAgIGlmIChjb250ZXh0IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKEFjdGl2aXR5KWNvbnRleHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjb250ZXh0ID0gKChDb250ZXh0V3JhcHBlciljb250ZXh0KS5nZXRCYXNlQ29udGV4dCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgd2hldGhlciB0byBlbmFibGUgc2hvd2luZyBhIHRvYXN0IHdpdGggdGhlIGNvbnRlbnQgZGVzY3JpcHRvciBvZiB0aGUKLSAgICAgKiBidXR0b24gd2hlbiB0aGUgYnV0dG9uIGlzIGxvbmcgcHJlc3NlZC4KLSAgICAgKi8KLSAgICB2b2lkIHNldENoZWF0U2hlZXRFbmFibGVkKGJvb2xlYW4gZW5hYmxlKSB7Ci0gICAgICAgIFRvb2x0aXBDb21wYXQuc2V0VG9vbHRpcFRleHQodGhpcywgZW5hYmxlCi0gICAgICAgICAgICAgICAgPyBBcGlIZWxwZXIuZ2V0TGliUmVzb3VyY2VzKGdldENvbnRleHQoKSkKLSAgICAgICAgICAgICAgICAgICAgLmdldFN0cmluZyhSLnN0cmluZy5tcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbikKLSAgICAgICAgICAgICAgICA6IG51bGwpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIHBlcmZvcm1DbGljaygpIHsKLSAgICAgICAgLy8gU2VuZCB0aGUgYXBwcm9wcmlhdGUgYWNjZXNzaWJpbGl0eSBldmVudHMgYW5kIGNhbGwgbGlzdGVuZXJzCi0gICAgICAgIGJvb2xlYW4gaGFuZGxlZCA9IHN1cGVyLnBlcmZvcm1DbGljaygpOwotICAgICAgICBpZiAoIWhhbmRsZWQpIHsKLSAgICAgICAgICAgIHBsYXlTb3VuZEVmZmVjdChTb3VuZEVmZmVjdENvbnN0YW50cy5DTElDSyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNob3dEaWFsb2coKSB8fCBoYW5kbGVkOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBpbnRbXSBvbkNyZWF0ZURyYXdhYmxlU3RhdGUoaW50IGV4dHJhU3BhY2UpIHsKLSAgICAgICAgZmluYWwgaW50W10gZHJhd2FibGVTdGF0ZSA9IHN1cGVyLm9uQ3JlYXRlRHJhd2FibGVTdGF0ZShleHRyYVNwYWNlICsgMSk7Ci0KLSAgICAgICAgLy8gVGVjaG5pY2FsbHkgd2Ugc2hvdWxkIGJlIGhhbmRsaW5nIHRoaXMgbW9yZSBjb21wbGV0ZWx5LCBidXQgdGhlc2UKLSAgICAgICAgLy8gYXJlIGltcGxlbWVudGF0aW9uIGRldGFpbHMgaGVyZS4gQ2hlY2thYmxlIGlzIHVzZWQgdG8gZXhwcmVzcyB0aGUgY29ubmVjdGluZwotICAgICAgICAvLyBkcmF3YWJsZSBzdGF0ZSBhbmQgaXQncyBtdXR1YWxseSBleGNsdXNpdmUgd2l0aCBjaGVjayBmb3IgdGhlIHB1cnBvc2VzCi0gICAgICAgIC8vIG9mIHN0YXRlIHNlbGVjdGlvbiBoZXJlLgotICAgICAgICBpZiAobUlzQ29ubmVjdGluZykgewotICAgICAgICAgICAgbWVyZ2VEcmF3YWJsZVN0YXRlcyhkcmF3YWJsZVN0YXRlLCBDSEVDS0FCTEVfU1RBVEVfU0VUKTsKLSAgICAgICAgfSBlbHNlIGlmIChtUmVtb3RlQWN0aXZlKSB7Ci0gICAgICAgICAgICBtZXJnZURyYXdhYmxlU3RhdGVzKGRyYXdhYmxlU3RhdGUsIENIRUNLRURfU1RBVEVfU0VUKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZHJhd2FibGVTdGF0ZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBkcmF3YWJsZVN0YXRlQ2hhbmdlZCgpIHsKLSAgICAgICAgc3VwZXIuZHJhd2FibGVTdGF0ZUNoYW5nZWQoKTsKLQotICAgICAgICBpZiAobVJlbW90ZUluZGljYXRvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbnRbXSBteURyYXdhYmxlU3RhdGUgPSBnZXREcmF3YWJsZVN0YXRlKCk7Ci0gICAgICAgICAgICBtUmVtb3RlSW5kaWNhdG9yLnNldFN0YXRlKG15RHJhd2FibGVTdGF0ZSk7Ci0gICAgICAgICAgICBpbnZhbGlkYXRlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIGEgZHJhd2FibGUgdG8gdXNlIGFzIHRoZSByZW1vdGUgcm91dGUgaW5kaWNhdG9yLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFJlbW90ZUluZGljYXRvckRyYXdhYmxlKERyYXdhYmxlIGQpIHsKLSAgICAgICAgaWYgKG1SZW1vdGVJbmRpY2F0b3JMb2FkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbVJlbW90ZUluZGljYXRvckxvYWRlci5jYW5jZWwoZmFsc2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1SZW1vdGVJbmRpY2F0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgbVJlbW90ZUluZGljYXRvci5zZXRDYWxsYmFjayhudWxsKTsKLSAgICAgICAgICAgIHVuc2NoZWR1bGVEcmF3YWJsZShtUmVtb3RlSW5kaWNhdG9yKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAobUJ1dHRvblRpbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGQgPSBEcmF3YWJsZUNvbXBhdC53cmFwKGQubXV0YXRlKCkpOwotICAgICAgICAgICAgICAgIERyYXdhYmxlQ29tcGF0LnNldFRpbnRMaXN0KGQsIG1CdXR0b25UaW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGQuc2V0Q2FsbGJhY2sodGhpcyk7Ci0gICAgICAgICAgICBkLnNldFN0YXRlKGdldERyYXdhYmxlU3RhdGUoKSk7Ci0gICAgICAgICAgICBkLnNldFZpc2libGUoZ2V0VmlzaWJpbGl0eSgpID09IFZJU0lCTEUsIGZhbHNlKTsKLSAgICAgICAgfQotICAgICAgICBtUmVtb3RlSW5kaWNhdG9yID0gZDsKLQotICAgICAgICByZWZyZXNoRHJhd2FibGVTdGF0ZSgpOwotICAgICAgICBpZiAobUF0dGFjaGVkVG9XaW5kb3cgJiYgbVJlbW90ZUluZGljYXRvciAhPSBudWxsCi0gICAgICAgICAgICAgICAgJiYgbVJlbW90ZUluZGljYXRvci5nZXRDdXJyZW50KCkgaW5zdGFuY2VvZiBBbmltYXRpb25EcmF3YWJsZSkgewotICAgICAgICAgICAgQW5pbWF0aW9uRHJhd2FibGUgY3VyRHJhd2FibGUgPSAoQW5pbWF0aW9uRHJhd2FibGUpIG1SZW1vdGVJbmRpY2F0b3IuZ2V0Q3VycmVudCgpOwotICAgICAgICAgICAgaWYgKG1Jc0Nvbm5lY3RpbmcpIHsKLSAgICAgICAgICAgICAgICBpZiAoIWN1ckRyYXdhYmxlLmlzUnVubmluZygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGN1ckRyYXdhYmxlLnN0YXJ0KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChtUmVtb3RlQWN0aXZlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGN1ckRyYXdhYmxlLmlzUnVubmluZygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGN1ckRyYXdhYmxlLnN0b3AoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY3VyRHJhd2FibGUuc2VsZWN0RHJhd2FibGUoY3VyRHJhd2FibGUuZ2V0TnVtYmVyT2ZGcmFtZXMoKSAtIDEpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gdmVyaWZ5RHJhd2FibGUoRHJhd2FibGUgd2hvKSB7Ci0gICAgICAgIHJldHVybiBzdXBlci52ZXJpZnlEcmF3YWJsZSh3aG8pIHx8IHdobyA9PSBtUmVtb3RlSW5kaWNhdG9yOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGp1bXBEcmF3YWJsZXNUb0N1cnJlbnRTdGF0ZSgpIHsKLSAgICAgICAgLy8gV2UgY2FuJ3QgY2FsbCBzdXBlciB0byBoYW5kbGUgdGhlIGJhY2tncm91bmQgc28gd2UgZG8gaXQgb3Vyc2VsdmVzLgotICAgICAgICAvL3N1cGVyLmp1bXBEcmF3YWJsZXNUb0N1cnJlbnRTdGF0ZSgpOwotICAgICAgICBpZiAoZ2V0QmFja2dyb3VuZCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIERyYXdhYmxlQ29tcGF0Lmp1bXBUb0N1cnJlbnRTdGF0ZShnZXRCYWNrZ3JvdW5kKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSGFuZGxlIG91ciBvd24gcmVtb3RlIGluZGljYXRvci4KLSAgICAgICAgaWYgKG1SZW1vdGVJbmRpY2F0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgRHJhd2FibGVDb21wYXQuanVtcFRvQ3VycmVudFN0YXRlKG1SZW1vdGVJbmRpY2F0b3IpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0VmlzaWJpbGl0eShpbnQgdmlzaWJpbGl0eSkgewotICAgICAgICBzdXBlci5zZXRWaXNpYmlsaXR5KHZpc2liaWxpdHkpOwotCi0gICAgICAgIGlmIChtUmVtb3RlSW5kaWNhdG9yICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1SZW1vdGVJbmRpY2F0b3Iuc2V0VmlzaWJsZShnZXRWaXNpYmlsaXR5KCkgPT0gVklTSUJMRSwgZmFsc2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25BdHRhY2hlZFRvV2luZG93KCkgewotICAgICAgICBzdXBlci5vbkF0dGFjaGVkVG9XaW5kb3coKTsKLQotICAgICAgICBtQXR0YWNoZWRUb1dpbmRvdyA9IHRydWU7Ci0gICAgICAgIGlmICghbVNlbGVjdG9yLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgbVJvdXRlci5hZGRDYWxsYmFjayhtU2VsZWN0b3IsIG1DYWxsYmFjaywgbVJvdXRlQ2FsbGJhY2tGbGFncyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmVmcmVzaFJvdXRlKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25EZXRhY2hlZEZyb21XaW5kb3coKSB7Ci0gICAgICAgIG1BdHRhY2hlZFRvV2luZG93ID0gZmFsc2U7Ci0gICAgICAgIGlmICghbVNlbGVjdG9yLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgbVJvdXRlci5yZW1vdmVDYWxsYmFjayhtQ2FsbGJhY2spOwotICAgICAgICB9Ci0KLSAgICAgICAgc3VwZXIub25EZXRhY2hlZEZyb21XaW5kb3coKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBvbk1lYXN1cmUoaW50IHdpZHRoTWVhc3VyZVNwZWMsIGludCBoZWlnaHRNZWFzdXJlU3BlYykgewotICAgICAgICBmaW5hbCBpbnQgd2lkdGhTaXplID0gTWVhc3VyZVNwZWMuZ2V0U2l6ZSh3aWR0aE1lYXN1cmVTcGVjKTsKLSAgICAgICAgZmluYWwgaW50IGhlaWdodFNpemUgPSBNZWFzdXJlU3BlYy5nZXRTaXplKGhlaWdodE1lYXN1cmVTcGVjKTsKLSAgICAgICAgZmluYWwgaW50IHdpZHRoTW9kZSA9IE1lYXN1cmVTcGVjLmdldE1vZGUod2lkdGhNZWFzdXJlU3BlYyk7Ci0gICAgICAgIGZpbmFsIGludCBoZWlnaHRNb2RlID0gTWVhc3VyZVNwZWMuZ2V0TW9kZShoZWlnaHRNZWFzdXJlU3BlYyk7Ci0KLSAgICAgICAgZmluYWwgaW50IHdpZHRoID0gTWF0aC5tYXgobU1pbldpZHRoLCBtUmVtb3RlSW5kaWNhdG9yICE9IG51bGwgPwotICAgICAgICAgICAgICAgIG1SZW1vdGVJbmRpY2F0b3IuZ2V0SW50cmluc2ljV2lkdGgoKSArIGdldFBhZGRpbmdMZWZ0KCkgKyBnZXRQYWRkaW5nUmlnaHQoKSA6IDApOwotICAgICAgICBmaW5hbCBpbnQgaGVpZ2h0ID0gTWF0aC5tYXgobU1pbkhlaWdodCwgbVJlbW90ZUluZGljYXRvciAhPSBudWxsID8KLSAgICAgICAgICAgICAgICBtUmVtb3RlSW5kaWNhdG9yLmdldEludHJpbnNpY0hlaWdodCgpICsgZ2V0UGFkZGluZ1RvcCgpICsgZ2V0UGFkZGluZ0JvdHRvbSgpIDogMCk7Ci0KLSAgICAgICAgaW50IG1lYXN1cmVkV2lkdGg7Ci0gICAgICAgIHN3aXRjaCAod2lkdGhNb2RlKSB7Ci0gICAgICAgICAgICBjYXNlIE1lYXN1cmVTcGVjLkVYQUNUTFk6Ci0gICAgICAgICAgICAgICAgbWVhc3VyZWRXaWR0aCA9IHdpZHRoU2l6ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgTWVhc3VyZVNwZWMuQVRfTU9TVDoKLSAgICAgICAgICAgICAgICBtZWFzdXJlZFdpZHRoID0gTWF0aC5taW4od2lkdGhTaXplLCB3aWR0aCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgY2FzZSBNZWFzdXJlU3BlYy5VTlNQRUNJRklFRDoKLSAgICAgICAgICAgICAgICBtZWFzdXJlZFdpZHRoID0gd2lkdGg7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgbWVhc3VyZWRIZWlnaHQ7Ci0gICAgICAgIHN3aXRjaCAoaGVpZ2h0TW9kZSkgewotICAgICAgICAgICAgY2FzZSBNZWFzdXJlU3BlYy5FWEFDVExZOgotICAgICAgICAgICAgICAgIG1lYXN1cmVkSGVpZ2h0ID0gaGVpZ2h0U2l6ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgTWVhc3VyZVNwZWMuQVRfTU9TVDoKLSAgICAgICAgICAgICAgICBtZWFzdXJlZEhlaWdodCA9IE1hdGgubWluKGhlaWdodFNpemUsIGhlaWdodCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgY2FzZSBNZWFzdXJlU3BlYy5VTlNQRUNJRklFRDoKLSAgICAgICAgICAgICAgICBtZWFzdXJlZEhlaWdodCA9IGhlaWdodDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIHNldE1lYXN1cmVkRGltZW5zaW9uKG1lYXN1cmVkV2lkdGgsIG1lYXN1cmVkSGVpZ2h0KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBvbkRyYXcoQ2FudmFzIGNhbnZhcykgewotICAgICAgICBzdXBlci5vbkRyYXcoY2FudmFzKTsKLQotICAgICAgICBpZiAobVJlbW90ZUluZGljYXRvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgbGVmdCA9IGdldFBhZGRpbmdMZWZ0KCk7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgcmlnaHQgPSBnZXRXaWR0aCgpIC0gZ2V0UGFkZGluZ1JpZ2h0KCk7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgdG9wID0gZ2V0UGFkZGluZ1RvcCgpOwotICAgICAgICAgICAgZmluYWwgaW50IGJvdHRvbSA9IGdldEhlaWdodCgpIC0gZ2V0UGFkZGluZ0JvdHRvbSgpOwotCi0gICAgICAgICAgICBmaW5hbCBpbnQgZHJhd1dpZHRoID0gbVJlbW90ZUluZGljYXRvci5nZXRJbnRyaW5zaWNXaWR0aCgpOwotICAgICAgICAgICAgZmluYWwgaW50IGRyYXdIZWlnaHQgPSBtUmVtb3RlSW5kaWNhdG9yLmdldEludHJpbnNpY0hlaWdodCgpOwotICAgICAgICAgICAgZmluYWwgaW50IGRyYXdMZWZ0ID0gbGVmdCArIChyaWdodCAtIGxlZnQgLSBkcmF3V2lkdGgpIC8gMjsKLSAgICAgICAgICAgIGZpbmFsIGludCBkcmF3VG9wID0gdG9wICsgKGJvdHRvbSAtIHRvcCAtIGRyYXdIZWlnaHQpIC8gMjsKLQotICAgICAgICAgICAgbVJlbW90ZUluZGljYXRvci5zZXRCb3VuZHMoZHJhd0xlZnQsIGRyYXdUb3AsCi0gICAgICAgICAgICAgICAgICAgIGRyYXdMZWZ0ICsgZHJhd1dpZHRoLCBkcmF3VG9wICsgZHJhd0hlaWdodCk7Ci0gICAgICAgICAgICBtUmVtb3RlSW5kaWNhdG9yLmRyYXcoY2FudmFzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgcmVmcmVzaFJvdXRlKCkgewotICAgICAgICBmaW5hbCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUgPSBtUm91dGVyLmdldFNlbGVjdGVkUm91dGUoKTsKLSAgICAgICAgZmluYWwgYm9vbGVhbiBpc1JlbW90ZSA9ICFyb3V0ZS5pc0RlZmF1bHRPckJsdWV0b290aCgpICYmIHJvdXRlLm1hdGNoZXNTZWxlY3RvcihtU2VsZWN0b3IpOwotICAgICAgICBmaW5hbCBib29sZWFuIGlzQ29ubmVjdGluZyA9IGlzUmVtb3RlICYmIHJvdXRlLmlzQ29ubmVjdGluZygpOwotICAgICAgICBib29sZWFuIG5lZWRzUmVmcmVzaCA9IGZhbHNlOwotICAgICAgICBpZiAobVJlbW90ZUFjdGl2ZSAhPSBpc1JlbW90ZSkgewotICAgICAgICAgICAgbVJlbW90ZUFjdGl2ZSA9IGlzUmVtb3RlOwotICAgICAgICAgICAgbmVlZHNSZWZyZXNoID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAobUlzQ29ubmVjdGluZyAhPSBpc0Nvbm5lY3RpbmcpIHsKLSAgICAgICAgICAgIG1Jc0Nvbm5lY3RpbmcgPSBpc0Nvbm5lY3Rpbmc7Ci0gICAgICAgICAgICBuZWVkc1JlZnJlc2ggPSB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG5lZWRzUmVmcmVzaCkgewotICAgICAgICAgICAgdXBkYXRlQ29udGVudERlc2NyaXB0aW9uKCk7Ci0gICAgICAgICAgICByZWZyZXNoRHJhd2FibGVTdGF0ZSgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtQXR0YWNoZWRUb1dpbmRvdykgewotICAgICAgICAgICAgc2V0RW5hYmxlZChtUm91dGVyLmlzUm91dGVBdmFpbGFibGUobVNlbGVjdG9yLAotICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlci5BVkFJTEFCSUxJVFlfRkxBR19JR05PUkVfREVGQVVMVF9ST1VURSkpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtUmVtb3RlSW5kaWNhdG9yICE9IG51bGwKLSAgICAgICAgICAgICAgICAmJiBtUmVtb3RlSW5kaWNhdG9yLmdldEN1cnJlbnQoKSBpbnN0YW5jZW9mIEFuaW1hdGlvbkRyYXdhYmxlKSB7Ci0gICAgICAgICAgICBBbmltYXRpb25EcmF3YWJsZSBjdXJEcmF3YWJsZSA9IChBbmltYXRpb25EcmF3YWJsZSkgbVJlbW90ZUluZGljYXRvci5nZXRDdXJyZW50KCk7Ci0gICAgICAgICAgICBpZiAobUF0dGFjaGVkVG9XaW5kb3cpIHsKLSAgICAgICAgICAgICAgICBpZiAoKG5lZWRzUmVmcmVzaCB8fCBpc0Nvbm5lY3RpbmcpICYmICFjdXJEcmF3YWJsZS5pc1J1bm5pbmcoKSkgewotICAgICAgICAgICAgICAgICAgICBjdXJEcmF3YWJsZS5zdGFydCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNSZW1vdGUgJiYgIWlzQ29ubmVjdGluZykgewotICAgICAgICAgICAgICAgIC8vIFdoZW4gdGhlIHJvdXRlIGlzIGFscmVhZHkgY29ubmVjdGVkIGJlZm9yZSB0aGUgdmlldyBpcyBhdHRhY2hlZCwgc2hvdyB0aGUgbGFzdAotICAgICAgICAgICAgICAgIC8vIGZyYW1lIG9mIHRoZSBjb25uZWN0ZWQgYW5pbWF0aW9uIGltbWVkaWF0ZWx5LgotICAgICAgICAgICAgICAgIGlmIChjdXJEcmF3YWJsZS5pc1J1bm5pbmcoKSkgewotICAgICAgICAgICAgICAgICAgICBjdXJEcmF3YWJsZS5zdG9wKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGN1ckRyYXdhYmxlLnNlbGVjdERyYXdhYmxlKGN1ckRyYXdhYmxlLmdldE51bWJlck9mRnJhbWVzKCkgLSAxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVDb250ZW50RGVzY3JpcHRpb24oKSB7Ci0gICAgICAgIGludCByZXNJZDsKLSAgICAgICAgaWYgKG1Jc0Nvbm5lY3RpbmcpIHsKLSAgICAgICAgICAgIHJlc0lkID0gUi5zdHJpbmcubXJfY2FzdF9idXR0b25fY29ubmVjdGluZzsKLSAgICAgICAgfSBlbHNlIGlmIChtUmVtb3RlQWN0aXZlKSB7Ci0gICAgICAgICAgICByZXNJZCA9IFIuc3RyaW5nLm1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJlc0lkID0gUi5zdHJpbmcubXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkOwotICAgICAgICB9Ci0gICAgICAgIHNldENvbnRlbnREZXNjcmlwdGlvbihBcGlIZWxwZXIuZ2V0TGliUmVzb3VyY2VzKGdldENvbnRleHQoKSkuZ2V0U3RyaW5nKHJlc0lkKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBNZWRpYVJvdXRlckNhbGxiYWNrIGV4dGVuZHMgTWVkaWFSb3V0ZXIuQ2FsbGJhY2sgewotICAgICAgICBNZWRpYVJvdXRlckNhbGxiYWNrKCkgewotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVBZGRlZChNZWRpYVJvdXRlciByb3V0ZXIsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyBpbmZvKSB7Ci0gICAgICAgICAgICByZWZyZXNoUm91dGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlUmVtb3ZlZChNZWRpYVJvdXRlciByb3V0ZXIsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyBpbmZvKSB7Ci0gICAgICAgICAgICByZWZyZXNoUm91dGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlQ2hhbmdlZChNZWRpYVJvdXRlciByb3V0ZXIsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyBpbmZvKSB7Ci0gICAgICAgICAgICByZWZyZXNoUm91dGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlU2VsZWN0ZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gaW5mbykgewotICAgICAgICAgICAgcmVmcmVzaFJvdXRlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVVuc2VsZWN0ZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gaW5mbykgewotICAgICAgICAgICAgcmVmcmVzaFJvdXRlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Qcm92aWRlckFkZGVkKE1lZGlhUm91dGVyIHJvdXRlciwgTWVkaWFSb3V0ZXIuUHJvdmlkZXJJbmZvIHByb3ZpZGVyKSB7Ci0gICAgICAgICAgICByZWZyZXNoUm91dGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblByb3ZpZGVyUmVtb3ZlZChNZWRpYVJvdXRlciByb3V0ZXIsIE1lZGlhUm91dGVyLlByb3ZpZGVySW5mbyBwcm92aWRlcikgewotICAgICAgICAgICAgcmVmcmVzaFJvdXRlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Qcm92aWRlckNoYW5nZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBNZWRpYVJvdXRlci5Qcm92aWRlckluZm8gcHJvdmlkZXIpIHsKLSAgICAgICAgICAgIHJlZnJlc2hSb3V0ZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBSZW1vdGVJbmRpY2F0b3JMb2FkZXIgZXh0ZW5kcyBBc3luY1Rhc2s8Vm9pZCwgVm9pZCwgRHJhd2FibGU+IHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbVJlc0lkOwotCi0gICAgICAgIFJlbW90ZUluZGljYXRvckxvYWRlcihpbnQgcmVzSWQpIHsKLSAgICAgICAgICAgIG1SZXNJZCA9IHJlc0lkOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCBEcmF3YWJsZSBkb0luQmFja2dyb3VuZChWb2lkLi4uIHBhcmFtcykgewotICAgICAgICAgICAgcmV0dXJuIEFwaUhlbHBlci5nZXRMaWJSZXNvdXJjZXMoZ2V0Q29udGV4dCgpKS5nZXREcmF3YWJsZShtUmVzSWQpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIG9uUG9zdEV4ZWN1dGUoRHJhd2FibGUgcmVtb3RlSW5kaWNhdG9yKSB7Ci0gICAgICAgICAgICBjYWNoZUFuZFJlc2V0KHJlbW90ZUluZGljYXRvcik7Ci0gICAgICAgICAgICBzZXRSZW1vdGVJbmRpY2F0b3JEcmF3YWJsZShyZW1vdGVJbmRpY2F0b3IpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIG9uQ2FuY2VsbGVkKERyYXdhYmxlIHJlbW90ZUluZGljYXRvcikgewotICAgICAgICAgICAgY2FjaGVBbmRSZXNldChyZW1vdGVJbmRpY2F0b3IpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGNhY2hlQW5kUmVzZXQoRHJhd2FibGUgcmVtb3RlSW5kaWNhdG9yKSB7Ci0gICAgICAgICAgICBpZiAocmVtb3RlSW5kaWNhdG9yICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzUmVtb3RlSW5kaWNhdG9yQ2FjaGUucHV0KG1SZXNJZCwgcmVtb3RlSW5kaWNhdG9yLmdldENvbnN0YW50U3RhdGUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtUmVtb3RlSW5kaWNhdG9yTG9hZGVyID0gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZUNob29zZXJEaWFsb2cuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZUNob29zZXJEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FjNjRkOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVDaG9vc2VyRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MDUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLmFwcDsKLQotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mby5DT05ORUNUSU9OX1NUQVRFX0NPTk5FQ1RFRDsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8uQ09OTkVDVElPTl9TVEFURV9DT05ORUNUSU5HOwotCi1pbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLk5vbk51bGw7Ci1pbXBvcnQgYW5kcm9pZC5hcHAuRGlhbG9nOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOwotaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwotaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY3LmFwcC5BcHBDb21wYXREaWFsb2c7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGFuZHJvaWQudmlldy5Db250ZXh0VGhlbWVXcmFwcGVyOwotaW1wb3J0IGFuZHJvaWQudmlldy5HcmF2aXR5OwotaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFycmF5QWRhcHRlcjsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXc7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdFZpZXc7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS51cGRhdGUuQXBpSGVscGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLnVwZGF0ZS5SOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVNlbGVjdG9yOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZXI7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHRoZSByb3V0ZSBjaG9vc2VyIGRpYWxvZyBmb3Ige0BsaW5rIE1lZGlhUm91dGVyfS4KLSAqIDxwPgotICogVGhpcyBkaWFsb2cgYWxsb3dzIHRoZSB1c2VyIHRvIGNob29zZSBhIHJvdXRlIHRoYXQgbWF0Y2hlcyBhIGdpdmVuIHNlbGVjdG9yLgotICogPC9wPgotICoKLSAqIEBzZWUgTWVkaWFSb3V0ZUJ1dHRvbgotICogQHNlZSBNZWRpYVJvdXRlQWN0aW9uUHJvdmlkZXIKLSAqLwotcHVibGljIGNsYXNzIE1lZGlhUm91dGVDaG9vc2VyRGlhbG9nIGV4dGVuZHMgRGlhbG9nIHsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNZWRpYVJvdXRlQ2hvb3NlckRpYWxvZyI7Ci0KLSAgICAvLyBEbyBub3QgdXBkYXRlIHRoZSByb3V0ZSBsaXN0IGltbWVkaWF0ZWx5IHRvIGF2b2lkIHVubmF0dXJhbCBkaWFsb2cgY2hhbmdlLgotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgVVBEQVRFX1JPVVRFU19ERUxBWV9NUyA9IDMwMEw7Ci0gICAgc3RhdGljIGZpbmFsIGludCBNU0dfVVBEQVRFX1JPVVRFUyA9IDE7Ci0KLSAgICBwcml2YXRlIGZpbmFsIE1lZGlhUm91dGVyIG1Sb3V0ZXI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBNZWRpYVJvdXRlckNhbGxiYWNrIG1DYWxsYmFjazsKLQotICAgIHByaXZhdGUgVGV4dFZpZXcgbVRpdGxlVmlldzsKLSAgICBwcml2YXRlIE1lZGlhUm91dGVTZWxlY3RvciBtU2VsZWN0b3IgPSBNZWRpYVJvdXRlU2VsZWN0b3IuRU1QVFk7Ci0gICAgcHJpdmF0ZSBBcnJheUxpc3Q8TWVkaWFSb3V0ZXIuUm91dGVJbmZvPiBtUm91dGVzOwotICAgIHByaXZhdGUgUm91dGVBZGFwdGVyIG1BZGFwdGVyOwotICAgIHByaXZhdGUgTGlzdFZpZXcgbUxpc3RWaWV3OwotICAgIHByaXZhdGUgYm9vbGVhbiBtQXR0YWNoZWRUb1dpbmRvdzsKLSAgICBwcml2YXRlIGxvbmcgbUxhc3RVcGRhdGVUaW1lOwotICAgIHByaXZhdGUgZmluYWwgSGFuZGxlciBtSGFuZGxlciA9IG5ldyBIYW5kbGVyKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKLSAgICAgICAgICAgIHN3aXRjaCAobWVzc2FnZS53aGF0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBNU0dfVVBEQVRFX1JPVVRFUzoKLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlUm91dGVzKChMaXN0PE1lZGlhUm91dGVyLlJvdXRlSW5mbz4pIG1lc3NhZ2Uub2JqKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHVibGljIE1lZGlhUm91dGVDaG9vc2VyRGlhbG9nKENvbnRleHQgY29udGV4dCkgewotICAgICAgICB0aGlzKGNvbnRleHQsIDApOwotICAgIH0KLQotICAgIHB1YmxpYyBNZWRpYVJvdXRlQ2hvb3NlckRpYWxvZyhDb250ZXh0IGNvbnRleHQsIGludCB0aGVtZSkgewotICAgICAgICAvLyBUT0RPIChiLzcyOTc1OTc2KTogQXZvaWQgdG8gdXNlIENvbnRleHRUaGVtZVdyYXBwZXIgd2l0aCBhcHAgY29udGV4dCBhbmQgbGliIHRoZW1lLgotICAgICAgICBzdXBlcihuZXcgQ29udGV4dFRoZW1lV3JhcHBlcihjb250ZXh0LCBBcGlIZWxwZXIuZ2V0TGliVGhlbWUoY29udGV4dCwKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlclRoZW1lSGVscGVyLmdldFJvdXRlclRoZW1lSWQoY29udGV4dCkpKSwgdGhlbWUpOwotICAgICAgICBjb250ZXh0ID0gZ2V0Q29udGV4dCgpOwotCi0gICAgICAgIG1Sb3V0ZXIgPSBNZWRpYVJvdXRlci5nZXRJbnN0YW5jZShjb250ZXh0KTsKLSAgICAgICAgbUNhbGxiYWNrID0gbmV3IE1lZGlhUm91dGVyQ2FsbGJhY2soKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBtZWRpYSByb3V0ZSBzZWxlY3RvciBmb3IgZmlsdGVyaW5nIHRoZSByb3V0ZXMgdGhhdCB0aGUgdXNlciBjYW4gc2VsZWN0LgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgc2VsZWN0b3IsIG5ldmVyIG51bGwuCi0gICAgICovCi0gICAgQE5vbk51bGwKLSAgICBwdWJsaWMgTWVkaWFSb3V0ZVNlbGVjdG9yIGdldFJvdXRlU2VsZWN0b3IoKSB7Ci0gICAgICAgIHJldHVybiBtU2VsZWN0b3I7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbWVkaWEgcm91dGUgc2VsZWN0b3IgZm9yIGZpbHRlcmluZyB0aGUgcm91dGVzIHRoYXQgdGhlIHVzZXIgY2FuIHNlbGVjdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzZWxlY3RvciBUaGUgc2VsZWN0b3IsIG11c3Qgbm90IGJlIG51bGwuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Um91dGVTZWxlY3RvcihATm9uTnVsbCBNZWRpYVJvdXRlU2VsZWN0b3Igc2VsZWN0b3IpIHsKLSAgICAgICAgaWYgKHNlbGVjdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInNlbGVjdG9yIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghbVNlbGVjdG9yLmVxdWFscyhzZWxlY3RvcikpIHsKLSAgICAgICAgICAgIG1TZWxlY3RvciA9IHNlbGVjdG9yOwotCi0gICAgICAgICAgICBpZiAobUF0dGFjaGVkVG9XaW5kb3cpIHsKLSAgICAgICAgICAgICAgICBtUm91dGVyLnJlbW92ZUNhbGxiYWNrKG1DYWxsYmFjayk7Ci0gICAgICAgICAgICAgICAgbVJvdXRlci5hZGRDYWxsYmFjayhzZWxlY3RvciwgbUNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXIuQ0FMTEJBQ0tfRkxBR19QRVJGT1JNX0FDVElWRV9TQ0FOKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmVmcmVzaFJvdXRlcygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIHRvIGZpbHRlciB0aGUgc2V0IG9mIHJvdXRlcyB0aGF0IHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgbGlzdC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBpdGVyYXRlcyBvdmVyIGFsbCByb3V0ZXMgaW4gdGhlIHByb3ZpZGVkIGxpc3QgYW5kCi0gICAgICogcmVtb3ZlcyB0aG9zZSBmb3Igd2hpY2gge0BsaW5rICNvbkZpbHRlclJvdXRlfSByZXR1cm5zIGZhbHNlLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSByb3V0ZXMgVGhlIGxpc3Qgb2Ygcm91dGVzIHRvIGZpbHRlciBpbi1wbGFjZSwgbmV2ZXIgbnVsbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBvbkZpbHRlclJvdXRlcyhATm9uTnVsbCBMaXN0PE1lZGlhUm91dGVyLlJvdXRlSW5mbz4gcm91dGVzKSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSByb3V0ZXMuc2l6ZSgpOyBpLS0gPiAwOyApIHsKLSAgICAgICAgICAgIGlmICghb25GaWx0ZXJSb3V0ZShyb3V0ZXMuZ2V0KGkpKSkgewotICAgICAgICAgICAgICAgIHJvdXRlcy5yZW1vdmUoaSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHJvdXRlIHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgbGlzdC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIHRydWUgZm9yIGVuYWJsZWQgbm9uLWRlZmF1bHQgcm91dGVzIHRoYXQKLSAgICAgKiBtYXRjaCB0aGUgc2VsZWN0b3IuICBTdWJjbGFzc2VzIGNhbiBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBmaWx0ZXIgcm91dGVzCi0gICAgICogZGlmZmVyZW50bHkuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIHJvdXRlIFRoZSByb3V0ZSB0byBjb25zaWRlciwgbmV2ZXIgbnVsbC4KLSAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHJvdXRlIHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgY2hvb3NlciBkaWFsb2cuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gb25GaWx0ZXJSb3V0ZShATm9uTnVsbCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgcmV0dXJuICFyb3V0ZS5pc0RlZmF1bHRPckJsdWV0b290aCgpICYmIHJvdXRlLmlzRW5hYmxlZCgpCi0gICAgICAgICAgICAgICAgJiYgcm91dGUubWF0Y2hlc1NlbGVjdG9yKG1TZWxlY3Rvcik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0VGl0bGUoQ2hhclNlcXVlbmNlIHRpdGxlKSB7Ci0gICAgICAgIG1UaXRsZVZpZXcuc2V0VGV4dCh0aXRsZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0VGl0bGUoaW50IHRpdGxlSWQpIHsKLSAgICAgICAgbVRpdGxlVmlldy5zZXRUZXh0KHRpdGxlSWQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKLSAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKLQotICAgICAgICBzZXRDb250ZW50VmlldyhBcGlIZWxwZXIuaW5mbGF0ZUxpYkxheW91dChnZXRDb250ZXh0KCksIEFwaUhlbHBlci5nZXRMaWJUaGVtZShnZXRDb250ZXh0KCksCi0gICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJUaGVtZUhlbHBlci5nZXRSb3V0ZXJUaGVtZUlkKGdldENvbnRleHQoKSkpLAotICAgICAgICAgICAgICAgIFIubGF5b3V0Lm1yX2Nob29zZXJfZGlhbG9nKSk7Ci0KLSAgICAgICAgbVJvdXRlcyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICBtQWRhcHRlciA9IG5ldyBSb3V0ZUFkYXB0ZXIoZ2V0Q29udGV4dCgpLCBtUm91dGVzKTsKLSAgICAgICAgbUxpc3RWaWV3ID0gKExpc3RWaWV3KWZpbmRWaWV3QnlJZChSLmlkLm1yX2Nob29zZXJfbGlzdCk7Ci0gICAgICAgIG1MaXN0Vmlldy5zZXRBZGFwdGVyKG1BZGFwdGVyKTsKLSAgICAgICAgbUxpc3RWaWV3LnNldE9uSXRlbUNsaWNrTGlzdGVuZXIobUFkYXB0ZXIpOwotICAgICAgICBtTGlzdFZpZXcuc2V0RW1wdHlWaWV3KGZpbmRWaWV3QnlJZChhbmRyb2lkLlIuaWQuZW1wdHkpKTsKLSAgICAgICAgbVRpdGxlVmlldyA9IGZpbmRWaWV3QnlJZChSLmlkLm1yX2Nob29zZXJfdGl0bGUpOwotCi0gICAgICAgIHVwZGF0ZUxheW91dCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHdpZHRoIG9mIHRoZSBkaWFsb2cuIEFsc28gY2FsbGVkIHdoZW4gY29uZmlndXJhdGlvbiBjaGFuZ2VzLgotICAgICAqLwotICAgIHZvaWQgdXBkYXRlTGF5b3V0KCkgewotICAgICAgICBnZXRXaW5kb3coKS5zZXRMYXlvdXQoTWVkaWFSb3V0ZURpYWxvZ0hlbHBlci5nZXREaWFsb2dXaWR0aChnZXRDb250ZXh0KCkpLAotICAgICAgICAgICAgICAgIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkF0dGFjaGVkVG9XaW5kb3coKSB7Ci0gICAgICAgIHN1cGVyLm9uQXR0YWNoZWRUb1dpbmRvdygpOwotCi0gICAgICAgIG1BdHRhY2hlZFRvV2luZG93ID0gdHJ1ZTsKLSAgICAgICAgbVJvdXRlci5hZGRDYWxsYmFjayhtU2VsZWN0b3IsIG1DYWxsYmFjaywgTWVkaWFSb3V0ZXIuQ0FMTEJBQ0tfRkxBR19QRVJGT1JNX0FDVElWRV9TQ0FOKTsKLSAgICAgICAgcmVmcmVzaFJvdXRlcygpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uRGV0YWNoZWRGcm9tV2luZG93KCkgewotICAgICAgICBtQXR0YWNoZWRUb1dpbmRvdyA9IGZhbHNlOwotICAgICAgICBtUm91dGVyLnJlbW92ZUNhbGxiYWNrKG1DYWxsYmFjayk7Ci0gICAgICAgIG1IYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKE1TR19VUERBVEVfUk9VVEVTKTsKLQotICAgICAgICBzdXBlci5vbkRldGFjaGVkRnJvbVdpbmRvdygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlZnJlc2hlcyB0aGUgbGlzdCBvZiByb3V0ZXMgdGhhdCBhcmUgc2hvd24gaW4gdGhlIGNob29zZXIgZGlhbG9nLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlZnJlc2hSb3V0ZXMoKSB7Ci0gICAgICAgIGlmIChtQXR0YWNoZWRUb1dpbmRvdykgewotICAgICAgICAgICAgQXJyYXlMaXN0PE1lZGlhUm91dGVyLlJvdXRlSW5mbz4gcm91dGVzID0gbmV3IEFycmF5TGlzdDw+KG1Sb3V0ZXIuZ2V0Um91dGVzKCkpOwotICAgICAgICAgICAgb25GaWx0ZXJSb3V0ZXMocm91dGVzKTsKLSAgICAgICAgICAgIENvbGxlY3Rpb25zLnNvcnQocm91dGVzLCBSb3V0ZUNvbXBhcmF0b3Iuc0luc3RhbmNlKTsKLSAgICAgICAgICAgIGlmIChTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKSAtIG1MYXN0VXBkYXRlVGltZSA+PSBVUERBVEVfUk9VVEVTX0RFTEFZX01TKSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlUm91dGVzKHJvdXRlcyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1IYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKE1TR19VUERBVEVfUk9VVEVTKTsKLSAgICAgICAgICAgICAgICBtSGFuZGxlci5zZW5kTWVzc2FnZUF0VGltZShtSGFuZGxlci5vYnRhaW5NZXNzYWdlKE1TR19VUERBVEVfUk9VVEVTLCByb3V0ZXMpLAotICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RVcGRhdGVUaW1lICsgVVBEQVRFX1JPVVRFU19ERUxBWV9NUyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIHVwZGF0ZVJvdXRlcyhMaXN0PE1lZGlhUm91dGVyLlJvdXRlSW5mbz4gcm91dGVzKSB7Ci0gICAgICAgIG1MYXN0VXBkYXRlVGltZSA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOwotICAgICAgICBtUm91dGVzLmNsZWFyKCk7Ci0gICAgICAgIG1Sb3V0ZXMuYWRkQWxsKHJvdXRlcyk7Ci0gICAgICAgIG1BZGFwdGVyLm5vdGlmeURhdGFTZXRDaGFuZ2VkKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBSb3V0ZUFkYXB0ZXIgZXh0ZW5kcyBBcnJheUFkYXB0ZXI8TWVkaWFSb3V0ZXIuUm91dGVJbmZvPgotICAgICAgICAgICAgaW1wbGVtZW50cyBMaXN0Vmlldy5Pbkl0ZW1DbGlja0xpc3RlbmVyIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBEcmF3YWJsZSBtRGVmYXVsdEljb247Ci0gICAgICAgIHByaXZhdGUgZmluYWwgRHJhd2FibGUgbVR2SWNvbjsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBEcmF3YWJsZSBtU3BlYWtlckljb247Ci0gICAgICAgIHByaXZhdGUgZmluYWwgRHJhd2FibGUgbVNwZWFrZXJHcm91cEljb247Ci0KLSAgICAgICAgcHVibGljIFJvdXRlQWRhcHRlcihDb250ZXh0IGNvbnRleHQsIExpc3Q8TWVkaWFSb3V0ZXIuUm91dGVJbmZvPiByb3V0ZXMpIHsKLSAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIDAsIHJvdXRlcyk7Ci0KLSAgICAgICAgICAgIFR5cGVkQXJyYXkgc3R5bGVkQXR0cmlidXRlcyA9IEFwaUhlbHBlci5nZXRMaWJUaGVtZShjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlclRoZW1lSGVscGVyLmdldFJvdXRlclRoZW1lSWQoY29udGV4dCkpLm9idGFpblN0eWxlZEF0dHJpYnV0ZXMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IGludFtdIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5hdHRyLm1lZGlhUm91dGVEZWZhdWx0SWNvbkRyYXdhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSLmF0dHIubWVkaWFSb3V0ZVR2SWNvbkRyYXdhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSLmF0dHIubWVkaWFSb3V0ZVNwZWFrZXJJY29uRHJhd2FibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFIuYXR0ci5tZWRpYVJvdXRlU3BlYWtlckdyb3VwSWNvbkRyYXdhYmxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7Ci0KLSAgICAgICAgICAgIG1EZWZhdWx0SWNvbiA9IHN0eWxlZEF0dHJpYnV0ZXMuZ2V0RHJhd2FibGUoMCk7Ci0gICAgICAgICAgICBtVHZJY29uID0gc3R5bGVkQXR0cmlidXRlcy5nZXREcmF3YWJsZSgxKTsKLSAgICAgICAgICAgIG1TcGVha2VySWNvbiA9IHN0eWxlZEF0dHJpYnV0ZXMuZ2V0RHJhd2FibGUoMik7Ci0gICAgICAgICAgICBtU3BlYWtlckdyb3VwSWNvbiA9IHN0eWxlZEF0dHJpYnV0ZXMuZ2V0RHJhd2FibGUoMyk7Ci0gICAgICAgICAgICBzdHlsZWRBdHRyaWJ1dGVzLnJlY3ljbGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBhcmVBbGxJdGVtc0VuYWJsZWQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKGludCBwb3NpdGlvbikgewotICAgICAgICAgICAgcmV0dXJuIGdldEl0ZW0ocG9zaXRpb24pLmlzRW5hYmxlZCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBWaWV3IGdldFZpZXcoaW50IHBvc2l0aW9uLCBWaWV3IGNvbnZlcnRWaWV3LCBWaWV3R3JvdXAgcGFyZW50KSB7Ci0gICAgICAgICAgICBWaWV3IHZpZXcgPSBjb252ZXJ0VmlldzsKLSAgICAgICAgICAgIGlmICh2aWV3ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB2aWV3ID0gQXBpSGVscGVyLmluZmxhdGVMaWJMYXlvdXQoZ2V0Q29udGV4dCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgQXBpSGVscGVyLmdldExpYlRoZW1lKGdldENvbnRleHQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJUaGVtZUhlbHBlci5nZXRSb3V0ZXJUaGVtZUlkKGdldENvbnRleHQoKSkpLAotICAgICAgICAgICAgICAgICAgICAgICAgUi5sYXlvdXQubXJfY2hvb3Nlcl9saXN0X2l0ZW0sIHBhcmVudCwgZmFsc2UpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUgPSBnZXRJdGVtKHBvc2l0aW9uKTsKLSAgICAgICAgICAgIFRleHRWaWV3IHRleHQxID0gKFRleHRWaWV3KSB2aWV3LmZpbmRWaWV3QnlJZChSLmlkLm1yX2Nob29zZXJfcm91dGVfbmFtZSk7Ci0gICAgICAgICAgICBUZXh0VmlldyB0ZXh0MiA9IChUZXh0Vmlldykgdmlldy5maW5kVmlld0J5SWQoUi5pZC5tcl9jaG9vc2VyX3JvdXRlX2Rlc2MpOwotICAgICAgICAgICAgdGV4dDEuc2V0VGV4dChyb3V0ZS5nZXROYW1lKCkpOwotICAgICAgICAgICAgU3RyaW5nIGRlc2NyaXB0aW9uID0gcm91dGUuZ2V0RGVzY3JpcHRpb24oKTsKLSAgICAgICAgICAgIGJvb2xlYW4gaXNDb25uZWN0ZWRPckNvbm5lY3RpbmcgPQotICAgICAgICAgICAgICAgICAgICByb3V0ZS5nZXRDb25uZWN0aW9uU3RhdGUoKSA9PSBDT05ORUNUSU9OX1NUQVRFX0NPTk5FQ1RFRAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHJvdXRlLmdldENvbm5lY3Rpb25TdGF0ZSgpID09IENPTk5FQ1RJT05fU1RBVEVfQ09OTkVDVElORzsKLSAgICAgICAgICAgIGlmIChpc0Nvbm5lY3RlZE9yQ29ubmVjdGluZyAmJiAhVGV4dFV0aWxzLmlzRW1wdHkoZGVzY3JpcHRpb24pKSB7Ci0gICAgICAgICAgICAgICAgdGV4dDEuc2V0R3Jhdml0eShHcmF2aXR5LkJPVFRPTSk7Ci0gICAgICAgICAgICAgICAgdGV4dDIuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgICAgIHRleHQyLnNldFRleHQoZGVzY3JpcHRpb24pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0ZXh0MS5zZXRHcmF2aXR5KEdyYXZpdHkuQ0VOVEVSX1ZFUlRJQ0FMKTsKLSAgICAgICAgICAgICAgICB0ZXh0Mi5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICAgICAgdGV4dDIuc2V0VGV4dCgiIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB2aWV3LnNldEVuYWJsZWQocm91dGUuaXNFbmFibGVkKCkpOwotCi0gICAgICAgICAgICBJbWFnZVZpZXcgaWNvblZpZXcgPSAoSW1hZ2VWaWV3KSB2aWV3LmZpbmRWaWV3QnlJZChSLmlkLm1yX2Nob29zZXJfcm91dGVfaWNvbik7Ci0gICAgICAgICAgICBpZiAoaWNvblZpZXcgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGljb25WaWV3LnNldEltYWdlRHJhd2FibGUoZ2V0SWNvbkRyYXdhYmxlKHJvdXRlKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdmlldzsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbkl0ZW1DbGljayhBZGFwdGVyVmlldzw/PiBwYXJlbnQsIFZpZXcgdmlldywgaW50IHBvc2l0aW9uLCBsb25nIGlkKSB7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUgPSBnZXRJdGVtKHBvc2l0aW9uKTsKLSAgICAgICAgICAgIGlmIChyb3V0ZS5pc0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIHJvdXRlLnNlbGVjdCgpOwotICAgICAgICAgICAgICAgIGRpc21pc3MoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgRHJhd2FibGUgZ2V0SWNvbkRyYXdhYmxlKE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICAgICAgVXJpIGljb25VcmkgPSByb3V0ZS5nZXRJY29uVXJpKCk7Ci0gICAgICAgICAgICBpZiAoaWNvblVyaSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBnZXRDb250ZXh0KCkuZ2V0Q29udGVudFJlc29sdmVyKCkub3BlbklucHV0U3RyZWFtKGljb25VcmkpOwotICAgICAgICAgICAgICAgICAgICBEcmF3YWJsZSBkcmF3YWJsZSA9IERyYXdhYmxlLmNyZWF0ZUZyb21TdHJlYW0oaXMsIG51bGwpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZHJhd2FibGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRyYXdhYmxlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJGYWlsZWQgdG8gbG9hZCAiICsgaWNvblVyaSwgZSk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEZhbGxzIGJhY2suCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGdldERlZmF1bHRJY29uRHJhd2FibGUocm91dGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBEcmF3YWJsZSBnZXREZWZhdWx0SWNvbkRyYXdhYmxlKE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICAgICAgLy8gSWYgdGhlIHR5cGUgb2YgdGhlIHJlY2VpdmVyIGRldmljZSBpcyBzcGVjaWZpZWQsIHVzZSBpdC4KLSAgICAgICAgICAgIHN3aXRjaCAocm91dGUuZ2V0RGV2aWNlVHlwZSgpKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAgTWVkaWFSb3V0ZXIuUm91dGVJbmZvLkRFVklDRV9UWVBFX1RWOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbVR2SWNvbjsKLSAgICAgICAgICAgICAgICBjYXNlIE1lZGlhUm91dGVyLlJvdXRlSW5mby5ERVZJQ0VfVFlQRV9TUEVBS0VSOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbVNwZWFrZXJJY29uOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBPdGhlcndpc2UsIG1ha2UgdGhlIGJlc3QgZ3Vlc3MgYmFzZWQgb24gb3RoZXIgcm91dGUgaW5mb3JtYXRpb24uCi0gICAgICAgICAgICBpZiAocm91dGUgaW5zdGFuY2VvZiBNZWRpYVJvdXRlci5Sb3V0ZUdyb3VwKSB7Ci0gICAgICAgICAgICAgICAgLy8gT25seSBzcGVha2VycyBjYW4gYmUgZ3JvdXBlZCBmb3Igbm93LgotICAgICAgICAgICAgICAgIHJldHVybiBtU3BlYWtlckdyb3VwSWNvbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBtRGVmYXVsdEljb247Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIGNsYXNzIE1lZGlhUm91dGVyQ2FsbGJhY2sgZXh0ZW5kcyBNZWRpYVJvdXRlci5DYWxsYmFjayB7Ci0gICAgICAgIE1lZGlhUm91dGVyQ2FsbGJhY2soKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZUFkZGVkKE1lZGlhUm91dGVyIHJvdXRlciwgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIGluZm8pIHsKLSAgICAgICAgICAgIHJlZnJlc2hSb3V0ZXMoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlUmVtb3ZlZChNZWRpYVJvdXRlciByb3V0ZXIsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyBpbmZvKSB7Ci0gICAgICAgICAgICByZWZyZXNoUm91dGVzKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZUNoYW5nZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gaW5mbykgewotICAgICAgICAgICAgcmVmcmVzaFJvdXRlcygpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVTZWxlY3RlZChNZWRpYVJvdXRlciByb3V0ZXIsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICAgICAgZGlzbWlzcygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdGljIGZpbmFsIGNsYXNzIFJvdXRlQ29tcGFyYXRvciBpbXBsZW1lbnRzIENvbXBhcmF0b3I8TWVkaWFSb3V0ZXIuUm91dGVJbmZvPiB7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUm91dGVDb21wYXJhdG9yIHNJbnN0YW5jZSA9IG5ldyBSb3V0ZUNvbXBhcmF0b3IoKTsKLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGludCBjb21wYXJlKE1lZGlhUm91dGVyLlJvdXRlSW5mbyBsaHMsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyByaHMpIHsKLSAgICAgICAgICAgIHJldHVybiBsaHMuZ2V0TmFtZSgpLmNvbXBhcmVUb0lnbm9yZUNhc2UocmhzLmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVDaG9vc2VyRGlhbG9nRnJhZ21lbnQuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZUNob29zZXJEaWFsb2dGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWU2YjI5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZUNob29zZXJEaWFsb2dGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5hcHA7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5EaWFsb2c7Ci1pbXBvcnQgYW5kcm9pZC5hcHAuRGlhbG9nRnJhZ21lbnQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlU2VsZWN0b3I7Ci0KLS8qKgotICogTWVkaWEgcm91dGUgY2hvb3NlciBkaWFsb2cgZnJhZ21lbnQuCi0gKiA8cD4KLSAqIENyZWF0ZXMgYSB7QGxpbmsgTWVkaWFSb3V0ZUNob29zZXJEaWFsb2d9LiAgVGhlIGFwcGxpY2F0aW9uIG1heSBzdWJjbGFzcwotICogdGhpcyBkaWFsb2cgZnJhZ21lbnQgdG8gY3VzdG9taXplIHRoZSBtZWRpYSByb3V0ZSBjaG9vc2VyIGRpYWxvZy4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIE1lZGlhUm91dGVDaG9vc2VyRGlhbG9nRnJhZ21lbnQgZXh0ZW5kcyBEaWFsb2dGcmFnbWVudCB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgQVJHVU1FTlRfU0VMRUNUT1IgPSAic2VsZWN0b3IiOwotCi0gICAgcHJpdmF0ZSBNZWRpYVJvdXRlQ2hvb3NlckRpYWxvZyBtRGlhbG9nOwotICAgIHByaXZhdGUgTWVkaWFSb3V0ZVNlbGVjdG9yIG1TZWxlY3RvcjsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBtZWRpYSByb3V0ZSBjaG9vc2VyIGRpYWxvZyBmcmFnbWVudC4KLSAgICAgKiA8cD4KLSAgICAgKiBBbGwgc3ViY2xhc3NlcyBvZiB0aGlzIGNsYXNzIG11c3QgYWxzbyBwb3NzZXNzIGEgZGVmYXVsdCBjb25zdHJ1Y3Rvci4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIE1lZGlhUm91dGVDaG9vc2VyRGlhbG9nRnJhZ21lbnQoKSB7Ci0gICAgICAgIHNldENhbmNlbGFibGUodHJ1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbWVkaWEgcm91dGUgc2VsZWN0b3IgZm9yIGZpbHRlcmluZyB0aGUgcm91dGVzIHRoYXQgdGhlIHVzZXIgY2FuIHNlbGVjdC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIHNlbGVjdG9yLCBuZXZlciBudWxsLgotICAgICAqLwotICAgIHB1YmxpYyBNZWRpYVJvdXRlU2VsZWN0b3IgZ2V0Um91dGVTZWxlY3RvcigpIHsKLSAgICAgICAgZW5zdXJlUm91dGVTZWxlY3RvcigpOwotICAgICAgICByZXR1cm4gbVNlbGVjdG9yOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBlbnN1cmVSb3V0ZVNlbGVjdG9yKCkgewotICAgICAgICBpZiAobVNlbGVjdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgIEJ1bmRsZSBhcmdzID0gZ2V0QXJndW1lbnRzKCk7Ci0gICAgICAgICAgICBpZiAoYXJncyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVNlbGVjdG9yID0gTWVkaWFSb3V0ZVNlbGVjdG9yLmZyb21CdW5kbGUoYXJncy5nZXRCdW5kbGUoQVJHVU1FTlRfU0VMRUNUT1IpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtU2VsZWN0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1TZWxlY3RvciA9IE1lZGlhUm91dGVTZWxlY3Rvci5FTVBUWTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG1lZGlhIHJvdXRlIHNlbGVjdG9yIGZvciBmaWx0ZXJpbmcgdGhlIHJvdXRlcyB0aGF0IHRoZSB1c2VyIGNhbiBzZWxlY3QuCi0gICAgICogVGhpcyBtZXRob2QgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIHRoZSBmcmFnbWVudCBpcyBhZGRlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzZWxlY3RvciBUaGUgc2VsZWN0b3IgdG8gc2V0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFJvdXRlU2VsZWN0b3IoTWVkaWFSb3V0ZVNlbGVjdG9yIHNlbGVjdG9yKSB7Ci0gICAgICAgIGlmIChzZWxlY3RvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzZWxlY3RvciBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLQotICAgICAgICBlbnN1cmVSb3V0ZVNlbGVjdG9yKCk7Ci0gICAgICAgIGlmICghbVNlbGVjdG9yLmVxdWFscyhzZWxlY3RvcikpIHsKLSAgICAgICAgICAgIG1TZWxlY3RvciA9IHNlbGVjdG9yOwotCi0gICAgICAgICAgICBCdW5kbGUgYXJncyA9IGdldEFyZ3VtZW50cygpOwotICAgICAgICAgICAgaWYgKGFyZ3MgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGFyZ3MgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhcmdzLnB1dEJ1bmRsZShBUkdVTUVOVF9TRUxFQ1RPUiwgc2VsZWN0b3IuYXNCdW5kbGUoKSk7Ci0gICAgICAgICAgICBzZXRBcmd1bWVudHMoYXJncyk7Ci0KLSAgICAgICAgICAgIE1lZGlhUm91dGVDaG9vc2VyRGlhbG9nIGRpYWxvZyA9IChNZWRpYVJvdXRlQ2hvb3NlckRpYWxvZylnZXREaWFsb2coKTsKLSAgICAgICAgICAgIGlmIChkaWFsb2cgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGRpYWxvZy5zZXRSb3V0ZVNlbGVjdG9yKHNlbGVjdG9yKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxlZCB3aGVuIHRoZSBjaG9vc2VyIGRpYWxvZyBpcyBiZWluZyBjcmVhdGVkLgotICAgICAqIDxwPgotICAgICAqIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGN1c3RvbWl6ZSB0aGUgZGlhbG9nLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWVkaWFSb3V0ZUNob29zZXJEaWFsb2cgb25DcmVhdGVDaG9vc2VyRGlhbG9nKAotICAgICAgICAgICAgQ29udGV4dCBjb250ZXh0LCBCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTWVkaWFSb3V0ZUNob29zZXJEaWFsb2coY29udGV4dCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIERpYWxvZyBvbkNyZWF0ZURpYWxvZyhCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7Ci0gICAgICAgIG1EaWFsb2cgPSBvbkNyZWF0ZUNob29zZXJEaWFsb2coZ2V0Q29udGV4dCgpLCBzYXZlZEluc3RhbmNlU3RhdGUpOwotICAgICAgICBtRGlhbG9nLnNldFJvdXRlU2VsZWN0b3IoZ2V0Um91dGVTZWxlY3RvcigpKTsKLSAgICAgICAgcmV0dXJuIG1EaWFsb2c7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25Db25maWd1cmF0aW9uQ2hhbmdlZChDb25maWd1cmF0aW9uIG5ld0NvbmZpZykgewotICAgICAgICBzdXBlci5vbkNvbmZpZ3VyYXRpb25DaGFuZ2VkKG5ld0NvbmZpZyk7Ci0gICAgICAgIGlmIChtRGlhbG9nICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1EaWFsb2cudXBkYXRlTGF5b3V0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVDb250cm9sbGVyRGlhbG9nLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVDb250cm9sbGVyRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2MGNmY2EuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlQ29udHJvbGxlckRpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIuYXBwOwotCi1pbXBvcnQgc3RhdGljIGFuZHJvaWQuc3VwcG9ydC52NC5tZWRpYS5zZXNzaW9uLlBsYXliYWNrU3RhdGVDb21wYXQuQUNUSU9OX1BBVVNFOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnN1cHBvcnQudjQubWVkaWEuc2Vzc2lvbi5QbGF5YmFja1N0YXRlQ29tcGF0LkFDVElPTl9QTEFZOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnN1cHBvcnQudjQubWVkaWEuc2Vzc2lvbi5QbGF5YmFja1N0YXRlQ29tcGF0LkFDVElPTl9QTEFZX1BBVVNFOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnN1cHBvcnQudjQubWVkaWEuc2Vzc2lvbi5QbGF5YmFja1N0YXRlQ29tcGF0LkFDVElPTl9TVE9QOwotCi1pbXBvcnQgYW5kcm9pZC5hcHAuQWxlcnREaWFsb2c7Ci1pbXBvcnQgYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwRmFjdG9yeTsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5CaXRtYXBEcmF3YWJsZTsKLWltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7Ci1pbXBvcnQgYW5kcm9pZC5vcy5Bc3luY1Rhc2s7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQubWVkaWEuTWVkaWFEZXNjcmlwdGlvbkNvbXBhdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQubWVkaWEuTWVkaWFNZXRhZGF0YUNvbXBhdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQubWVkaWEuc2Vzc2lvbi5NZWRpYUNvbnRyb2xsZXJDb21wYXQ7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY0Lm1lZGlhLnNlc3Npb24uTWVkaWFTZXNzaW9uQ29tcGF0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC5tZWRpYS5zZXNzaW9uLlBsYXliYWNrU3RhdGVDb21wYXQ7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY0LnV0aWwuT2JqZWN0c0NvbXBhdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlFdmVudENvbXBhdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjcuZ3JhcGhpY3MuUGFsZXR0ZTsKLWltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LkNvbnRleHRUaGVtZVdyYXBwZXI7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OwotaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldy5NZWFzdXJlU3BlYzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3VHJlZU9ic2VydmVyOwotaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlFdmVudDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5TWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFjY2VsZXJhdGVEZWNlbGVyYXRlSW50ZXJwb2xhdG9yOwotaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uQWxwaGFBbmltYXRpb247Ci1pbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb247Ci1pbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb25TZXQ7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb25VdGlsczsKLWltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkludGVycG9sYXRvcjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLlRyYW5zZm9ybWF0aW9uOwotaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uVHJhbnNsYXRlQW5pbWF0aW9uOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFycmF5QWRhcHRlcjsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5CdXR0b247Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuRnJhbWVMYXlvdXQ7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuSW1hZ2VCdXR0b247Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkxpbmVhckxheW91dDsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5SZWxhdGl2ZUxheW91dDsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5TZWVrQmFyOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OwotCi1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEudXBkYXRlLkFwaUhlbHBlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS51cGRhdGUuUjsKLWltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVTZWxlY3RvcjsKLWltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIuYXBwLk92ZXJsYXlMaXN0Vmlldy5PdmVybGF5T2JqZWN0OwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5uZXQuVVJMQ29ubmVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgdGhlIHJvdXRlIGNvbnRyb2xsZXIgZGlhbG9nIGZvciB7QGxpbmsgTWVkaWFSb3V0ZXJ9LgotICogPHA+Ci0gKiBUaGlzIGRpYWxvZyBhbGxvd3MgdGhlIHVzZXIgdG8gY29udHJvbCBvciBkaXNjb25uZWN0IGZyb20gdGhlIGN1cnJlbnRseSBzZWxlY3RlZCByb3V0ZS4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIE1lZGlhUm91dGVCdXR0b24KLSAqIEBzZWUgTWVkaWFSb3V0ZUFjdGlvblByb3ZpZGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBNZWRpYVJvdXRlQ29udHJvbGxlckRpYWxvZyBleHRlbmRzIEFsZXJ0RGlhbG9nIHsKLSAgICAvLyBUYWdzIHNob3VsZCBiZSBsZXNzIHRoYW4gMjQgY2hhcmFjdGVycyBsb25nIChzZWUgZG9jcyBmb3IgYW5kcm9pZC51dGlsLkxvZy5pc0xvZ2dhYmxlKCkpCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTWVkaWFSb3V0ZUN0cmxEaWFsb2ciOwotICAgIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpOwotCi0gICAgLy8gVGltZSB0byB3YWl0IGJlZm9yZSB1cGRhdGluZyB0aGUgdm9sdW1lIHdoZW4gdGhlIHVzZXIgbGV0cyBnbyBvZiB0aGUgc2VlayBiYXIKLSAgICAvLyB0byBhbGxvdyB0aGUgcm91dGUgcHJvdmlkZXIgdGltZSB0byBwcm9wYWdhdGUgdGhlIGNoYW5nZSBhbmQgcHVibGlzaCBhIG5ldwotICAgIC8vIHJvdXRlIGRlc2NyaXB0b3IuCi0gICAgc3RhdGljIGZpbmFsIGludCBWT0xVTUVfVVBEQVRFX0RFTEFZX01JTExJUyA9IDUwMDsKLSAgICBzdGF0aWMgZmluYWwgaW50IENPTk5FQ1RJT05fVElNRU9VVF9NSUxMSVMgPSAoaW50KSBUaW1lVW5pdC5TRUNPTkRTLnRvTWlsbGlzKDMwTCk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQlVUVE9OX05FVVRSQUxfUkVTX0lEID0gYW5kcm9pZC5SLmlkLmJ1dHRvbjM7Ci0gICAgc3RhdGljIGZpbmFsIGludCBCVVRUT05fRElTQ09OTkVDVF9SRVNfSUQgPSBhbmRyb2lkLlIuaWQuYnV0dG9uMjsKLSAgICBzdGF0aWMgZmluYWwgaW50IEJVVFRPTl9TVE9QX1JFU19JRCA9IGFuZHJvaWQuUi5pZC5idXR0b24xOwotCi0gICAgZmluYWwgTWVkaWFSb3V0ZXIgbVJvdXRlcjsKLSAgICBwcml2YXRlIGZpbmFsIE1lZGlhUm91dGVyQ2FsbGJhY2sgbUNhbGxiYWNrOwotICAgIGZpbmFsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyBtUm91dGU7Ci0KLSAgICBDb250ZXh0IG1Db250ZXh0OwotICAgIHByaXZhdGUgYm9vbGVhbiBtQ3JlYXRlZDsKLSAgICBwcml2YXRlIGJvb2xlYW4gbUF0dGFjaGVkVG9XaW5kb3c7Ci0KLSAgICBwcml2YXRlIGludCBtRGlhbG9nQ29udGVudFdpZHRoOwotCi0gICAgcHJpdmF0ZSBWaWV3IG1DdXN0b21Db250cm9sVmlldzsKLQotICAgIHByaXZhdGUgQnV0dG9uIG1EaXNjb25uZWN0QnV0dG9uOwotICAgIHByaXZhdGUgQnV0dG9uIG1TdG9wQ2FzdGluZ0J1dHRvbjsKLSAgICBwcml2YXRlIEltYWdlQnV0dG9uIG1QbGF5YmFja0NvbnRyb2xCdXR0b247Ci0gICAgcHJpdmF0ZSBJbWFnZUJ1dHRvbiBtQ2xvc2VCdXR0b247Ci0gICAgcHJpdmF0ZSBNZWRpYVJvdXRlRXhwYW5kQ29sbGFwc2VCdXR0b24gbUdyb3VwRXhwYW5kQ29sbGFwc2VCdXR0b247Ci0KLSAgICBwcml2YXRlIEZyYW1lTGF5b3V0IG1FeHBhbmRhYmxlQXJlYUxheW91dDsKLSAgICBwcml2YXRlIExpbmVhckxheW91dCBtRGlhbG9nQXJlYUxheW91dDsKLSAgICBGcmFtZUxheW91dCBtRGVmYXVsdENvbnRyb2xMYXlvdXQ7Ci0gICAgcHJpdmF0ZSBGcmFtZUxheW91dCBtQ3VzdG9tQ29udHJvbExheW91dDsKLSAgICBwcml2YXRlIEltYWdlVmlldyBtQXJ0VmlldzsKLSAgICBwcml2YXRlIFRleHRWaWV3IG1UaXRsZVZpZXc7Ci0gICAgcHJpdmF0ZSBUZXh0VmlldyBtU3VidGl0bGVWaWV3OwotICAgIHByaXZhdGUgVGV4dFZpZXcgbVJvdXRlTmFtZVRleHRWaWV3OwotCi0gICAgcHJpdmF0ZSBib29sZWFuIG1Wb2x1bWVDb250cm9sRW5hYmxlZCA9IHRydWU7Ci0gICAgLy8gTGF5b3V0IGZvciBtZWRpYSBjb250cm9sbGVycyBpbmNsdWRpbmcgcGxheS9wYXVzZSBidXR0b24gYW5kIHRoZSBtYWluIHZvbHVtZSBzbGlkZXIuCi0gICAgcHJpdmF0ZSBMaW5lYXJMYXlvdXQgbU1lZGlhTWFpbkNvbnRyb2xMYXlvdXQ7Ci0gICAgcHJpdmF0ZSBSZWxhdGl2ZUxheW91dCBtUGxheWJhY2tDb250cm9sTGF5b3V0OwotICAgIHByaXZhdGUgTGluZWFyTGF5b3V0IG1Wb2x1bWVDb250cm9sTGF5b3V0OwotICAgIHByaXZhdGUgVmlldyBtRGl2aWRlclZpZXc7Ci0KLSAgICBPdmVybGF5TGlzdFZpZXcgbVZvbHVtZUdyb3VwTGlzdDsKLSAgICBWb2x1bWVHcm91cEFkYXB0ZXIgbVZvbHVtZUdyb3VwQWRhcHRlcjsKLSAgICBwcml2YXRlIExpc3Q8TWVkaWFSb3V0ZXIuUm91dGVJbmZvPiBtR3JvdXBNZW1iZXJSb3V0ZXM7Ci0gICAgU2V0PE1lZGlhUm91dGVyLlJvdXRlSW5mbz4gbUdyb3VwTWVtYmVyUm91dGVzQWRkZWQ7Ci0gICAgcHJpdmF0ZSBTZXQ8TWVkaWFSb3V0ZXIuUm91dGVJbmZvPiBtR3JvdXBNZW1iZXJSb3V0ZXNSZW1vdmVkOwotICAgIFNldDxNZWRpYVJvdXRlci5Sb3V0ZUluZm8+IG1Hcm91cE1lbWJlclJvdXRlc0FuaW1hdGluZ1dpdGhCaXRtYXA7Ci0gICAgU2Vla0JhciBtVm9sdW1lU2xpZGVyOwotICAgIFZvbHVtZUNoYW5nZUxpc3RlbmVyIG1Wb2x1bWVDaGFuZ2VMaXN0ZW5lcjsKLSAgICBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gbVJvdXRlSW5Wb2x1bWVTbGlkZXJUb3VjaGVkOwotICAgIHByaXZhdGUgaW50IG1Wb2x1bWVHcm91cExpc3RJdGVtSWNvblNpemU7Ci0gICAgcHJpdmF0ZSBpbnQgbVZvbHVtZUdyb3VwTGlzdEl0ZW1IZWlnaHQ7Ci0gICAgcHJpdmF0ZSBpbnQgbVZvbHVtZUdyb3VwTGlzdE1heEhlaWdodDsKLSAgICBwcml2YXRlIGZpbmFsIGludCBtVm9sdW1lR3JvdXBMaXN0UGFkZGluZ1RvcDsKLSAgICBNYXA8TWVkaWFSb3V0ZXIuUm91dGVJbmZvLCBTZWVrQmFyPiBtVm9sdW1lU2xpZGVyTWFwOwotCi0gICAgTWVkaWFDb250cm9sbGVyQ29tcGF0IG1NZWRpYUNvbnRyb2xsZXI7Ci0gICAgTWVkaWFDb250cm9sbGVyQ2FsbGJhY2sgbUNvbnRyb2xsZXJDYWxsYmFjazsKLSAgICBQbGF5YmFja1N0YXRlQ29tcGF0IG1TdGF0ZTsKLSAgICBNZWRpYURlc2NyaXB0aW9uQ29tcGF0IG1EZXNjcmlwdGlvbjsKLQotICAgIEZldGNoQXJ0VGFzayBtRmV0Y2hBcnRUYXNrOwotICAgIEJpdG1hcCBtQXJ0SWNvbkJpdG1hcDsKLSAgICBVcmkgbUFydEljb25Vcmk7Ci0gICAgYm9vbGVhbiBtQXJ0SWNvbklzTG9hZGVkOwotICAgIEJpdG1hcCBtQXJ0SWNvbkxvYWRlZEJpdG1hcDsKLSAgICBpbnQgbUFydEljb25CYWNrZ3JvdW5kQ29sb3I7Ci0KLSAgICBib29sZWFuIG1IYXNQZW5kaW5nVXBkYXRlOwotICAgIGJvb2xlYW4gbVBlbmRpbmdVcGRhdGVBbmltYXRpb25OZWVkZWQ7Ci0KLSAgICBib29sZWFuIG1Jc0dyb3VwRXhwYW5kZWQ7Ci0gICAgYm9vbGVhbiBtSXNHcm91cExpc3RBbmltYXRpbmc7Ci0gICAgYm9vbGVhbiBtSXNHcm91cExpc3RBbmltYXRpb25QZW5kaW5nOwotICAgIGludCBtR3JvdXBMaXN0QW5pbWF0aW9uRHVyYXRpb25NczsKLSAgICBwcml2YXRlIGludCBtR3JvdXBMaXN0RmFkZUluRHVyYXRpb25NczsKLSAgICBwcml2YXRlIGludCBtR3JvdXBMaXN0RmFkZU91dER1cmF0aW9uTXM7Ci0KLSAgICBwcml2YXRlIEludGVycG9sYXRvciBtSW50ZXJwb2xhdG9yOwotICAgIHByaXZhdGUgSW50ZXJwb2xhdG9yIG1MaW5lYXJPdXRTbG93SW5JbnRlcnBvbGF0b3I7Ci0gICAgcHJpdmF0ZSBJbnRlcnBvbGF0b3IgbUZhc3RPdXRTbG93SW5JbnRlcnBvbGF0b3I7Ci0gICAgcHJpdmF0ZSBJbnRlcnBvbGF0b3IgbUFjY2VsZXJhdGVEZWNlbGVyYXRlSW50ZXJwb2xhdG9yOwotCi0gICAgZmluYWwgQWNjZXNzaWJpbGl0eU1hbmFnZXIgbUFjY2Vzc2liaWxpdHlNYW5hZ2VyOwotCi0gICAgUnVubmFibGUgbUdyb3VwTGlzdEZhZGVJbkFuaW1hdGlvbiA9IG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgIHN0YXJ0R3JvdXBMaXN0RmFkZUluQW5pbWF0aW9uKCk7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHVibGljIE1lZGlhUm91dGVDb250cm9sbGVyRGlhbG9nKENvbnRleHQgY29udGV4dCkgewotICAgICAgICB0aGlzKGNvbnRleHQsIDApOwotICAgIH0KLQotICAgIHB1YmxpYyBNZWRpYVJvdXRlQ29udHJvbGxlckRpYWxvZyhDb250ZXh0IGNvbnRleHQsIGludCB0aGVtZSkgewotICAgICAgICAvLyBUT0RPIChiLzcyOTc1OTc2KTogQXZvaWQgdG8gdXNlIENvbnRleHRUaGVtZVdyYXBwZXIgd2l0aCBhcHAgY29udGV4dCBhbmQgbGliIHRoZW1lLgotICAgICAgICBzdXBlcihuZXcgQ29udGV4dFRoZW1lV3JhcHBlcihjb250ZXh0LCBBcGlIZWxwZXIuZ2V0TGliVGhlbWUoY29udGV4dCwKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlclRoZW1lSGVscGVyLmdldFJvdXRlclRoZW1lSWQoY29udGV4dCkpKSwgdGhlbWUpOwotICAgICAgICBtQ29udGV4dCA9IGdldENvbnRleHQoKTsKLQotICAgICAgICBtQ29udHJvbGxlckNhbGxiYWNrID0gbmV3IE1lZGlhQ29udHJvbGxlckNhbGxiYWNrKCk7Ci0gICAgICAgIG1Sb3V0ZXIgPSBNZWRpYVJvdXRlci5nZXRJbnN0YW5jZShtQ29udGV4dCk7Ci0gICAgICAgIG1DYWxsYmFjayA9IG5ldyBNZWRpYVJvdXRlckNhbGxiYWNrKCk7Ci0gICAgICAgIG1Sb3V0ZSA9IG1Sb3V0ZXIuZ2V0U2VsZWN0ZWRSb3V0ZSgpOwotICAgICAgICBzZXRNZWRpYVNlc3Npb24obVJvdXRlci5nZXRNZWRpYVNlc3Npb25Ub2tlbigpKTsKLSAgICAgICAgbVZvbHVtZUdyb3VwTGlzdFBhZGRpbmdUb3AgPSBBcGlIZWxwZXIuZ2V0TGliUmVzb3VyY2VzKGNvbnRleHQpLmdldERpbWVuc2lvblBpeGVsU2l6ZSgKLSAgICAgICAgICAgICAgICBSLmRpbWVuLm1yX2NvbnRyb2xsZXJfdm9sdW1lX2dyb3VwX2xpc3RfcGFkZGluZ190b3ApOwotICAgICAgICBtQWNjZXNzaWJpbGl0eU1hbmFnZXIgPQotICAgICAgICAgICAgICAgIChBY2Nlc3NpYmlsaXR5TWFuYWdlcikgbUNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkFDQ0VTU0lCSUxJVFlfU0VSVklDRSk7Ci0gICAgICAgIG1MaW5lYXJPdXRTbG93SW5JbnRlcnBvbGF0b3IgPSBBbmltYXRpb25VdGlscy5sb2FkSW50ZXJwb2xhdG9yKAotICAgICAgICAgICAgICAgIG1Db250ZXh0LCBhbmRyb2lkLlIuaW50ZXJwb2xhdG9yLmxpbmVhcl9vdXRfc2xvd19pbik7Ci0gICAgICAgIG1GYXN0T3V0U2xvd0luSW50ZXJwb2xhdG9yID0gQW5pbWF0aW9uVXRpbHMubG9hZEludGVycG9sYXRvcigKLSAgICAgICAgICAgICAgICBtQ29udGV4dCwgYW5kcm9pZC5SLmludGVycG9sYXRvci5mYXN0X291dF9zbG93X2luKTsKLSAgICAgICAgbUFjY2VsZXJhdGVEZWNlbGVyYXRlSW50ZXJwb2xhdG9yID0gbmV3IEFjY2VsZXJhdGVEZWNlbGVyYXRlSW50ZXJwb2xhdG9yKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgcm91dGUgdGhhdCB0aGlzIGRpYWxvZyBpcyBjb250cm9sbGluZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIGdldFJvdXRlKCkgewotICAgICAgICByZXR1cm4gbVJvdXRlOwotICAgIH0KLQotICAgIHByaXZhdGUgTWVkaWFSb3V0ZXIuUm91dGVHcm91cCBnZXRHcm91cCgpIHsKLSAgICAgICAgaWYgKG1Sb3V0ZSBpbnN0YW5jZW9mIE1lZGlhUm91dGVyLlJvdXRlR3JvdXApIHsKLSAgICAgICAgICAgIHJldHVybiAoTWVkaWFSb3V0ZXIuUm91dGVHcm91cCkgbVJvdXRlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByb3ZpZGVzIHRoZSBzdWJjbGFzcyBhbiBvcHBvcnR1bml0eSB0byBjcmVhdGUgYSB2aWV3IHRoYXQgd2lsbCByZXBsYWNlIHRoZSBkZWZhdWx0IG1lZGlhCi0gICAgICogY29udHJvbHMgZm9yIHRoZSBjdXJyZW50bHkgcGxheWluZyBjb250ZW50LgotICAgICAqCi0gICAgICogQHBhcmFtIHNhdmVkSW5zdGFuY2VTdGF0ZSBUaGUgZGlhbG9nJ3Mgc2F2ZWQgaW5zdGFuY2Ugc3RhdGUuCi0gICAgICogQHJldHVybiBUaGUgbWVkaWEgY29udHJvbCB2aWV3LCBvciBudWxsIGlmIG5vbmUuCi0gICAgICovCi0gICAgcHVibGljIFZpZXcgb25DcmVhdGVNZWRpYUNvbnRyb2xWaWV3KEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbWVkaWEgY29udHJvbCB2aWV3IHRoYXQgd2FzIGNyZWF0ZWQgYnkge0BsaW5rICNvbkNyZWF0ZU1lZGlhQ29udHJvbFZpZXcoQnVuZGxlKX0uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBtZWRpYSBjb250cm9sIHZpZXcsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgVmlldyBnZXRNZWRpYUNvbnRyb2xWaWV3KCkgewotICAgICAgICByZXR1cm4gbUN1c3RvbUNvbnRyb2xWaWV3OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgd2hldGhlciB0byBlbmFibGUgdGhlIHZvbHVtZSBzbGlkZXIgYW5kIHZvbHVtZSBjb250cm9sIHVzaW5nIHRoZSB2b2x1bWUga2V5cwotICAgICAqIHdoZW4gdGhlIHJvdXRlIHN1cHBvcnRzIGl0LgotICAgICAqIDxwPgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIHRydWUuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZvbHVtZUNvbnRyb2xFbmFibGVkKGJvb2xlYW4gZW5hYmxlKSB7Ci0gICAgICAgIGlmIChtVm9sdW1lQ29udHJvbEVuYWJsZWQgIT0gZW5hYmxlKSB7Ci0gICAgICAgICAgICBtVm9sdW1lQ29udHJvbEVuYWJsZWQgPSBlbmFibGU7Ci0gICAgICAgICAgICBpZiAobUNyZWF0ZWQpIHsKLSAgICAgICAgICAgICAgICB1cGRhdGUoZmFsc2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRvIGVuYWJsZSB0aGUgdm9sdW1lIHNsaWRlciBhbmQgdm9sdW1lIGNvbnRyb2wgdXNpbmcgdGhlIHZvbHVtZSBrZXlzCi0gICAgICogd2hlbiB0aGUgcm91dGUgc3VwcG9ydHMgaXQuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNWb2x1bWVDb250cm9sRW5hYmxlZCgpIHsKLSAgICAgICAgcmV0dXJuIG1Wb2x1bWVDb250cm9sRW5hYmxlZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIHNlc3Npb24gdG8gdXNlIGZvciBtZXRhZGF0YSBhbmQgdHJhbnNwb3J0IGNvbnRyb2xzLiBUaGUgZGlhbG9nCi0gICAgICogd2lsbCBsaXN0ZW4gdG8gY2hhbmdlcyBvbiB0aGlzIHNlc3Npb24gYW5kIHVwZGF0ZSB0aGUgVUkgYXV0b21hdGljYWxseSBpbgotICAgICAqIHJlc3BvbnNlIHRvIGNoYW5nZXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2Vzc2lvblRva2VuIFRoZSB0b2tlbiBmb3IgdGhlIHNlc3Npb24gdG8gdXNlLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzZXRNZWRpYVNlc3Npb24oTWVkaWFTZXNzaW9uQ29tcGF0LlRva2VuIHNlc3Npb25Ub2tlbikgewotICAgICAgICBpZiAobU1lZGlhQ29udHJvbGxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtTWVkaWFDb250cm9sbGVyLnVucmVnaXN0ZXJDYWxsYmFjayhtQ29udHJvbGxlckNhbGxiYWNrKTsKLSAgICAgICAgICAgIG1NZWRpYUNvbnRyb2xsZXIgPSBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzZXNzaW9uVG9rZW4gPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmICghbUF0dGFjaGVkVG9XaW5kb3cpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgbU1lZGlhQ29udHJvbGxlciA9IG5ldyBNZWRpYUNvbnRyb2xsZXJDb21wYXQobUNvbnRleHQsIHNlc3Npb25Ub2tlbik7Ci0gICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cuZShUQUcsICJFcnJvciBjcmVhdGluZyBtZWRpYSBjb250cm9sbGVyIGluIHNldE1lZGlhU2Vzc2lvbi4iLCBlKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobU1lZGlhQ29udHJvbGxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtTWVkaWFDb250cm9sbGVyLnJlZ2lzdGVyQ2FsbGJhY2sobUNvbnRyb2xsZXJDYWxsYmFjayk7Ci0gICAgICAgIH0KLSAgICAgICAgTWVkaWFNZXRhZGF0YUNvbXBhdCBtZXRhZGF0YSA9IG1NZWRpYUNvbnRyb2xsZXIgPT0gbnVsbCA/IG51bGwKLSAgICAgICAgICAgICAgICA6IG1NZWRpYUNvbnRyb2xsZXIuZ2V0TWV0YWRhdGEoKTsKLSAgICAgICAgbURlc2NyaXB0aW9uID0gbWV0YWRhdGEgPT0gbnVsbCA/IG51bGwgOiBtZXRhZGF0YS5nZXREZXNjcmlwdGlvbigpOwotICAgICAgICBtU3RhdGUgPSBtTWVkaWFDb250cm9sbGVyID09IG51bGwgPyBudWxsIDogbU1lZGlhQ29udHJvbGxlci5nZXRQbGF5YmFja1N0YXRlKCk7Ci0gICAgICAgIHVwZGF0ZUFydEljb25JZk5lZWRlZCgpOwotICAgICAgICB1cGRhdGUoZmFsc2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHNlc3Npb24gdG8gdXNlIGZvciBtZXRhZGF0YSBhbmQgdHJhbnNwb3J0IGNvbnRyb2xzLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgdG9rZW4gZm9yIHRoZSBzZXNzaW9uIHRvIHVzZSBvciBudWxsIGlmIG5vbmUuCi0gICAgICovCi0gICAgcHVibGljIE1lZGlhU2Vzc2lvbkNvbXBhdC5Ub2tlbiBnZXRNZWRpYVNlc3Npb24oKSB7Ci0gICAgICAgIHJldHVybiBtTWVkaWFDb250cm9sbGVyID09IG51bGwgPyBudWxsIDogbU1lZGlhQ29udHJvbGxlci5nZXRTZXNzaW9uVG9rZW4oKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7Ci0gICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7Ci0KLSAgICAgICAgZ2V0V2luZG93KCkuc2V0QmFja2dyb3VuZERyYXdhYmxlUmVzb3VyY2UoYW5kcm9pZC5SLmNvbG9yLnRyYW5zcGFyZW50KTsKLQotICAgICAgICBzZXRDb250ZW50VmlldyhBcGlIZWxwZXIuaW5mbGF0ZUxpYkxheW91dChtQ29udGV4dCwKLSAgICAgICAgICAgICAgICBBcGlIZWxwZXIuZ2V0TGliVGhlbWUobUNvbnRleHQsIE1lZGlhUm91dGVyVGhlbWVIZWxwZXIuZ2V0Um91dGVyVGhlbWVJZChtQ29udGV4dCkpLAotICAgICAgICAgICAgICAgIFIubGF5b3V0Lm1yX2NvbnRyb2xsZXJfbWF0ZXJpYWxfZGlhbG9nX2IpKTsKLQotICAgICAgICAvLyBSZW1vdmUgdGhlIG5ldXRyYWwgYnV0dG9uLgotICAgICAgICBmaW5kVmlld0J5SWQoQlVUVE9OX05FVVRSQUxfUkVTX0lEKS5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0KLSAgICAgICAgQ2xpY2tMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBDbGlja0xpc3RlbmVyKCk7Ci0KLSAgICAgICAgbUV4cGFuZGFibGVBcmVhTGF5b3V0ID0gZmluZFZpZXdCeUlkKFIuaWQubXJfZXhwYW5kYWJsZV9hcmVhKTsKLSAgICAgICAgbUV4cGFuZGFibGVBcmVhTGF5b3V0LnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7Ci0gICAgICAgICAgICAgICAgZGlzbWlzcygpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgbURpYWxvZ0FyZWFMYXlvdXQgPSBmaW5kVmlld0J5SWQoUi5pZC5tcl9kaWFsb2dfYXJlYSk7Ci0gICAgICAgIG1EaWFsb2dBcmVhTGF5b3V0LnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7Ci0gICAgICAgICAgICAgICAgLy8gRWF0IHVuaGFuZGxlZCB0b3VjaCBldmVudHMuCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBpbnQgY29sb3IgPSBNZWRpYVJvdXRlclRoZW1lSGVscGVyLmdldEJ1dHRvblRleHRDb2xvcihtQ29udGV4dCk7Ci0gICAgICAgIG1EaXNjb25uZWN0QnV0dG9uID0gZmluZFZpZXdCeUlkKEJVVFRPTl9ESVNDT05ORUNUX1JFU19JRCk7Ci0gICAgICAgIG1EaXNjb25uZWN0QnV0dG9uLnNldFRleHQoCi0gICAgICAgICAgICAgICAgQXBpSGVscGVyLmdldExpYlJlc291cmNlcyhtQ29udGV4dCkuZ2V0U3RyaW5nKFIuc3RyaW5nLm1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCkpOwotICAgICAgICBtRGlzY29ubmVjdEJ1dHRvbi5zZXRUZXh0Q29sb3IoY29sb3IpOwotICAgICAgICBtRGlzY29ubmVjdEJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobGlzdGVuZXIpOwotCi0gICAgICAgIG1TdG9wQ2FzdGluZ0J1dHRvbiA9IGZpbmRWaWV3QnlJZChCVVRUT05fU1RPUF9SRVNfSUQpOwotICAgICAgICBtU3RvcENhc3RpbmdCdXR0b24uc2V0VGV4dCgKLSAgICAgICAgICAgICAgICBBcGlIZWxwZXIuZ2V0TGliUmVzb3VyY2VzKG1Db250ZXh0KS5nZXRTdHJpbmcoUi5zdHJpbmcubXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmcpKTsKLSAgICAgICAgbVN0b3BDYXN0aW5nQnV0dG9uLnNldFRleHRDb2xvcihjb2xvcik7Ci0gICAgICAgIG1TdG9wQ2FzdGluZ0J1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobGlzdGVuZXIpOwotCi0gICAgICAgIG1Sb3V0ZU5hbWVUZXh0VmlldyA9IGZpbmRWaWV3QnlJZChSLmlkLm1yX25hbWUpOwotICAgICAgICBtQ2xvc2VCdXR0b24gPSBmaW5kVmlld0J5SWQoUi5pZC5tcl9jbG9zZSk7Ci0gICAgICAgIG1DbG9zZUJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobGlzdGVuZXIpOwotICAgICAgICBtQ3VzdG9tQ29udHJvbExheW91dCA9IGZpbmRWaWV3QnlJZChSLmlkLm1yX2N1c3RvbV9jb250cm9sKTsKLSAgICAgICAgbURlZmF1bHRDb250cm9sTGF5b3V0ID0gZmluZFZpZXdCeUlkKFIuaWQubXJfZGVmYXVsdF9jb250cm9sKTsKLQotICAgICAgICAvLyBTdGFydCB0aGUgc2Vzc2lvbiBhY3Rpdml0eSB3aGVuIGEgY29udGVudCBpdGVtIChhbGJ1bSBhcnQsIHRpdGxlIG9yIHN1YnRpdGxlKSBpcyBjbGlja2VkLgotICAgICAgICBWaWV3Lk9uQ2xpY2tMaXN0ZW5lciBvbkNsaWNrTGlzdGVuZXIgPSBuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1NZWRpYUNvbnRyb2xsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBQZW5kaW5nSW50ZW50IHBpID0gbU1lZGlhQ29udHJvbGxlci5nZXRTZXNzaW9uQWN0aXZpdHkoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGkuc2VuZCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc21pc3MoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFBlbmRpbmdJbnRlbnQuQ2FuY2VsZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgcGkgKyAiIHdhcyBub3Qgc2VudCwgaXQgaGFkIGJlZW4gY2FuY2VsZWQuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIG1BcnRWaWV3ID0gZmluZFZpZXdCeUlkKFIuaWQubXJfYXJ0KTsKLSAgICAgICAgbUFydFZpZXcuc2V0T25DbGlja0xpc3RlbmVyKG9uQ2xpY2tMaXN0ZW5lcik7Ci0gICAgICAgIGZpbmRWaWV3QnlJZChSLmlkLm1yX2NvbnRyb2xfdGl0bGVfY29udGFpbmVyKS5zZXRPbkNsaWNrTGlzdGVuZXIob25DbGlja0xpc3RlbmVyKTsKLQotICAgICAgICBtTWVkaWFNYWluQ29udHJvbExheW91dCA9IGZpbmRWaWV3QnlJZChSLmlkLm1yX21lZGlhX21haW5fY29udHJvbCk7Ci0gICAgICAgIG1EaXZpZGVyVmlldyA9IGZpbmRWaWV3QnlJZChSLmlkLm1yX2NvbnRyb2xfZGl2aWRlcik7Ci0KLSAgICAgICAgbVBsYXliYWNrQ29udHJvbExheW91dCA9IGZpbmRWaWV3QnlJZChSLmlkLm1yX3BsYXliYWNrX2NvbnRyb2wpOwotICAgICAgICBtVGl0bGVWaWV3ID0gZmluZFZpZXdCeUlkKFIuaWQubXJfY29udHJvbF90aXRsZSk7Ci0gICAgICAgIG1TdWJ0aXRsZVZpZXcgPSBmaW5kVmlld0J5SWQoUi5pZC5tcl9jb250cm9sX3N1YnRpdGxlKTsKLSAgICAgICAgbVBsYXliYWNrQ29udHJvbEJ1dHRvbiA9IGZpbmRWaWV3QnlJZChSLmlkLm1yX2NvbnRyb2xfcGxheWJhY2tfY3RybCk7Ci0gICAgICAgIG1QbGF5YmFja0NvbnRyb2xCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKGxpc3RlbmVyKTsKLQotICAgICAgICBtVm9sdW1lQ29udHJvbExheW91dCA9IGZpbmRWaWV3QnlJZChSLmlkLm1yX3ZvbHVtZV9jb250cm9sKTsKLSAgICAgICAgbVZvbHVtZUNvbnRyb2xMYXlvdXQuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICBtVm9sdW1lU2xpZGVyID0gZmluZFZpZXdCeUlkKFIuaWQubXJfdm9sdW1lX3NsaWRlcik7Ci0gICAgICAgIG1Wb2x1bWVTbGlkZXIuc2V0VGFnKG1Sb3V0ZSk7Ci0gICAgICAgIG1Wb2x1bWVDaGFuZ2VMaXN0ZW5lciA9IG5ldyBWb2x1bWVDaGFuZ2VMaXN0ZW5lcigpOwotICAgICAgICBtVm9sdW1lU2xpZGVyLnNldE9uU2Vla0JhckNoYW5nZUxpc3RlbmVyKG1Wb2x1bWVDaGFuZ2VMaXN0ZW5lcik7Ci0KLSAgICAgICAgbVZvbHVtZUdyb3VwTGlzdCA9IGZpbmRWaWV3QnlJZChSLmlkLm1yX3ZvbHVtZV9ncm91cF9saXN0KTsKLSAgICAgICAgbUdyb3VwTWVtYmVyUm91dGVzID0gbmV3IEFycmF5TGlzdDxNZWRpYVJvdXRlci5Sb3V0ZUluZm8+KCk7Ci0gICAgICAgIG1Wb2x1bWVHcm91cEFkYXB0ZXIgPSBuZXcgVm9sdW1lR3JvdXBBZGFwdGVyKG1Wb2x1bWVHcm91cExpc3QuZ2V0Q29udGV4dCgpLAotICAgICAgICAgICAgICAgIG1Hcm91cE1lbWJlclJvdXRlcyk7Ci0gICAgICAgIG1Wb2x1bWVHcm91cExpc3Quc2V0QWRhcHRlcihtVm9sdW1lR3JvdXBBZGFwdGVyKTsKLSAgICAgICAgbUdyb3VwTWVtYmVyUm91dGVzQW5pbWF0aW5nV2l0aEJpdG1hcCA9IG5ldyBIYXNoU2V0PD4oKTsKLQotICAgICAgICBNZWRpYVJvdXRlclRoZW1lSGVscGVyLnNldE1lZGlhQ29udHJvbHNCYWNrZ3JvdW5kQ29sb3IobUNvbnRleHQsCi0gICAgICAgICAgICAgICAgbU1lZGlhTWFpbkNvbnRyb2xMYXlvdXQsIG1Wb2x1bWVHcm91cExpc3QsIGdldEdyb3VwKCkgIT0gbnVsbCk7Ci0gICAgICAgIE1lZGlhUm91dGVyVGhlbWVIZWxwZXIuc2V0Vm9sdW1lU2xpZGVyQ29sb3IobUNvbnRleHQsCi0gICAgICAgICAgICAgICAgKE1lZGlhUm91dGVWb2x1bWVTbGlkZXIpIG1Wb2x1bWVTbGlkZXIsIG1NZWRpYU1haW5Db250cm9sTGF5b3V0KTsKLSAgICAgICAgbVZvbHVtZVNsaWRlck1hcCA9IG5ldyBIYXNoTWFwPD4oKTsKLSAgICAgICAgbVZvbHVtZVNsaWRlck1hcC5wdXQobVJvdXRlLCBtVm9sdW1lU2xpZGVyKTsKLQotICAgICAgICBtR3JvdXBFeHBhbmRDb2xsYXBzZUJ1dHRvbiA9Ci0gICAgICAgICAgICAgICAgZmluZFZpZXdCeUlkKFIuaWQubXJfZ3JvdXBfZXhwYW5kX2NvbGxhcHNlKTsKLSAgICAgICAgbUdyb3VwRXhwYW5kQ29sbGFwc2VCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKLSAgICAgICAgICAgICAgICBtSXNHcm91cEV4cGFuZGVkID0gIW1Jc0dyb3VwRXhwYW5kZWQ7Ci0gICAgICAgICAgICAgICAgaWYgKG1Jc0dyb3VwRXhwYW5kZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgbVZvbHVtZUdyb3VwTGlzdC5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGxvYWRJbnRlcnBvbGF0b3IoKTsKLSAgICAgICAgICAgICAgICB1cGRhdGVMYXlvdXRIZWlnaHQodHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBsb2FkSW50ZXJwb2xhdG9yKCk7Ci0gICAgICAgIG1Hcm91cExpc3RBbmltYXRpb25EdXJhdGlvbk1zID0gQXBpSGVscGVyLmdldExpYlJlc291cmNlcyhtQ29udGV4dCkuZ2V0SW50ZWdlcigKLSAgICAgICAgICAgICAgICBSLmludGVnZXIubXJfY29udHJvbGxlcl92b2x1bWVfZ3JvdXBfbGlzdF9hbmltYXRpb25fZHVyYXRpb25fbXMpOwotICAgICAgICBtR3JvdXBMaXN0RmFkZUluRHVyYXRpb25NcyA9IEFwaUhlbHBlci5nZXRMaWJSZXNvdXJjZXMobUNvbnRleHQpLmdldEludGVnZXIoCi0gICAgICAgICAgICAgICAgUi5pbnRlZ2VyLm1yX2NvbnRyb2xsZXJfdm9sdW1lX2dyb3VwX2xpc3RfZmFkZV9pbl9kdXJhdGlvbl9tcyk7Ci0gICAgICAgIG1Hcm91cExpc3RGYWRlT3V0RHVyYXRpb25NcyA9IEFwaUhlbHBlci5nZXRMaWJSZXNvdXJjZXMobUNvbnRleHQpLmdldEludGVnZXIoCi0gICAgICAgICAgICAgICAgUi5pbnRlZ2VyLm1yX2NvbnRyb2xsZXJfdm9sdW1lX2dyb3VwX2xpc3RfZmFkZV9vdXRfZHVyYXRpb25fbXMpOwotCi0gICAgICAgIG1DdXN0b21Db250cm9sVmlldyA9IG9uQ3JlYXRlTWVkaWFDb250cm9sVmlldyhzYXZlZEluc3RhbmNlU3RhdGUpOwotICAgICAgICBpZiAobUN1c3RvbUNvbnRyb2xWaWV3ICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1DdXN0b21Db250cm9sTGF5b3V0LmFkZFZpZXcobUN1c3RvbUNvbnRyb2xWaWV3KTsKLSAgICAgICAgICAgIG1DdXN0b21Db250cm9sTGF5b3V0LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgfQotICAgICAgICBtQ3JlYXRlZCA9IHRydWU7Ci0gICAgICAgIHVwZGF0ZUxheW91dCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHdpZHRoIG9mIHRoZSBkaWFsb2cuIEFsc28gY2FsbGVkIHdoZW4gY29uZmlndXJhdGlvbiBjaGFuZ2VzLgotICAgICAqLwotICAgIHZvaWQgdXBkYXRlTGF5b3V0KCkgewotICAgICAgICBpbnQgd2lkdGggPSBNZWRpYVJvdXRlRGlhbG9nSGVscGVyLmdldERpYWxvZ1dpZHRoKG1Db250ZXh0KTsKLSAgICAgICAgZ2V0V2luZG93KCkuc2V0TGF5b3V0KHdpZHRoLCBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCk7Ci0KLSAgICAgICAgVmlldyBkZWNvclZpZXcgPSBnZXRXaW5kb3coKS5nZXREZWNvclZpZXcoKTsKLSAgICAgICAgbURpYWxvZ0NvbnRlbnRXaWR0aCA9IHdpZHRoIC0gZGVjb3JWaWV3LmdldFBhZGRpbmdMZWZ0KCkgLSBkZWNvclZpZXcuZ2V0UGFkZGluZ1JpZ2h0KCk7Ci0KLSAgICAgICAgUmVzb3VyY2VzIHJlcyA9IEFwaUhlbHBlci5nZXRMaWJSZXNvdXJjZXMobUNvbnRleHQpOwotICAgICAgICBtVm9sdW1lR3JvdXBMaXN0SXRlbUljb25TaXplID0gcmVzLmdldERpbWVuc2lvblBpeGVsU2l6ZSgKLSAgICAgICAgICAgICAgICBSLmRpbWVuLm1yX2NvbnRyb2xsZXJfdm9sdW1lX2dyb3VwX2xpc3RfaXRlbV9pY29uX3NpemUpOwotICAgICAgICBtVm9sdW1lR3JvdXBMaXN0SXRlbUhlaWdodCA9IHJlcy5nZXREaW1lbnNpb25QaXhlbFNpemUoCi0gICAgICAgICAgICAgICAgUi5kaW1lbi5tcl9jb250cm9sbGVyX3ZvbHVtZV9ncm91cF9saXN0X2l0ZW1faGVpZ2h0KTsKLSAgICAgICAgbVZvbHVtZUdyb3VwTGlzdE1heEhlaWdodCA9IHJlcy5nZXREaW1lbnNpb25QaXhlbFNpemUoCi0gICAgICAgICAgICAgICAgUi5kaW1lbi5tcl9jb250cm9sbGVyX3ZvbHVtZV9ncm91cF9saXN0X21heF9oZWlnaHQpOwotCi0gICAgICAgIC8vIEZldGNoIGFydCBpY29ucyBhZ2FpbiBmb3IgbGF5b3V0IGNoYW5nZXMgdG8gcmVzaXplIGl0IGFjY29yZGluZ2x5Ci0gICAgICAgIG1BcnRJY29uQml0bWFwID0gbnVsbDsKLSAgICAgICAgbUFydEljb25VcmkgPSBudWxsOwotICAgICAgICB1cGRhdGVBcnRJY29uSWZOZWVkZWQoKTsKLSAgICAgICAgdXBkYXRlKGZhbHNlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkF0dGFjaGVkVG9XaW5kb3coKSB7Ci0gICAgICAgIHN1cGVyLm9uQXR0YWNoZWRUb1dpbmRvdygpOwotICAgICAgICBtQXR0YWNoZWRUb1dpbmRvdyA9IHRydWU7Ci0KLSAgICAgICAgbVJvdXRlci5hZGRDYWxsYmFjayhNZWRpYVJvdXRlU2VsZWN0b3IuRU1QVFksIG1DYWxsYmFjaywKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlci5DQUxMQkFDS19GTEFHX1VORklMVEVSRURfRVZFTlRTKTsKLSAgICAgICAgc2V0TWVkaWFTZXNzaW9uKG1Sb3V0ZXIuZ2V0TWVkaWFTZXNzaW9uVG9rZW4oKSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25EZXRhY2hlZEZyb21XaW5kb3coKSB7Ci0gICAgICAgIG1Sb3V0ZXIucmVtb3ZlQ2FsbGJhY2sobUNhbGxiYWNrKTsKLSAgICAgICAgc2V0TWVkaWFTZXNzaW9uKG51bGwpOwotICAgICAgICBtQXR0YWNoZWRUb1dpbmRvdyA9IGZhbHNlOwotICAgICAgICBzdXBlci5vbkRldGFjaGVkRnJvbVdpbmRvdygpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIG9uS2V5RG93bihpbnQga2V5Q29kZSwgS2V5RXZlbnQgZXZlbnQpIHsKLSAgICAgICAgaWYgKGtleUNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9WT0xVTUVfRE9XTgotICAgICAgICAgICAgICAgIHx8IGtleUNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9WT0xVTUVfVVApIHsKLSAgICAgICAgICAgIG1Sb3V0ZS5yZXF1ZXN0VXBkYXRlVm9sdW1lKGtleUNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9WT0xVTUVfRE9XTiA/IC0xIDogMSk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3VwZXIub25LZXlEb3duKGtleUNvZGUsIGV2ZW50KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBvbktleVVwKGludCBrZXlDb2RlLCBLZXlFdmVudCBldmVudCkgewotICAgICAgICBpZiAoa2V5Q29kZSA9PSBLZXlFdmVudC5LRVlDT0RFX1ZPTFVNRV9ET1dOCi0gICAgICAgICAgICAgICAgfHwga2V5Q29kZSA9PSBLZXlFdmVudC5LRVlDT0RFX1ZPTFVNRV9VUCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN1cGVyLm9uS2V5VXAoa2V5Q29kZSwgZXZlbnQpOwotICAgIH0KLQotICAgIHZvaWQgdXBkYXRlKGJvb2xlYW4gYW5pbWF0ZSkgewotICAgICAgICAvLyBEZWZlciBkaWFsb2cgdXBkYXRlcyBpZiBhIHVzZXIgaXMgYWRqdXN0aW5nIGEgdm9sdW1lIGluIHRoZSBsaXN0Ci0gICAgICAgIGlmIChtUm91dGVJblZvbHVtZVNsaWRlclRvdWNoZWQgIT0gbnVsbCkgewotICAgICAgICAgICAgbUhhc1BlbmRpbmdVcGRhdGUgPSB0cnVlOwotICAgICAgICAgICAgbVBlbmRpbmdVcGRhdGVBbmltYXRpb25OZWVkZWQgfD0gYW5pbWF0ZTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBtSGFzUGVuZGluZ1VwZGF0ZSA9IGZhbHNlOwotICAgICAgICBtUGVuZGluZ1VwZGF0ZUFuaW1hdGlvbk5lZWRlZCA9IGZhbHNlOwotICAgICAgICBpZiAoIW1Sb3V0ZS5pc1NlbGVjdGVkKCkgfHwgbVJvdXRlLmlzRGVmYXVsdE9yQmx1ZXRvb3RoKCkpIHsKLSAgICAgICAgICAgIGRpc21pc3MoKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoIW1DcmVhdGVkKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBtUm91dGVOYW1lVGV4dFZpZXcuc2V0VGV4dChtUm91dGUuZ2V0TmFtZSgpKTsKLSAgICAgICAgbURpc2Nvbm5lY3RCdXR0b24uc2V0VmlzaWJpbGl0eShtUm91dGUuY2FuRGlzY29ubmVjdCgpID8gVmlldy5WSVNJQkxFIDogVmlldy5HT05FKTsKLSAgICAgICAgaWYgKG1DdXN0b21Db250cm9sVmlldyA9PSBudWxsICYmIG1BcnRJY29uSXNMb2FkZWQpIHsKLSAgICAgICAgICAgIGlmIChpc0JpdG1hcFJlY3ljbGVkKG1BcnRJY29uTG9hZGVkQml0bWFwKSkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbid0IHNldCBhcnR3b3JrIGltYWdlIHdpdGggcmVjeWNsZWQgYml0bWFwOiAiICsgbUFydEljb25Mb2FkZWRCaXRtYXApOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtQXJ0Vmlldy5zZXRJbWFnZUJpdG1hcChtQXJ0SWNvbkxvYWRlZEJpdG1hcCk7Ci0gICAgICAgICAgICAgICAgbUFydFZpZXcuc2V0QmFja2dyb3VuZENvbG9yKG1BcnRJY29uQmFja2dyb3VuZENvbG9yKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNsZWFyTG9hZGVkQml0bWFwKCk7Ci0gICAgICAgIH0KLSAgICAgICAgdXBkYXRlVm9sdW1lQ29udHJvbExheW91dCgpOwotICAgICAgICB1cGRhdGVQbGF5YmFja0NvbnRyb2xMYXlvdXQoKTsKLSAgICAgICAgdXBkYXRlTGF5b3V0SGVpZ2h0KGFuaW1hdGUpOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0JpdG1hcFJlY3ljbGVkKEJpdG1hcCBiaXRtYXApIHsKLSAgICAgICAgcmV0dXJuIGJpdG1hcCAhPSBudWxsICYmIGJpdG1hcC5pc1JlY3ljbGVkKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGNhblNob3dQbGF5YmFja0NvbnRyb2xMYXlvdXQoKSB7Ci0gICAgICAgIHJldHVybiBtQ3VzdG9tQ29udHJvbFZpZXcgPT0gbnVsbCAmJiAobURlc2NyaXB0aW9uICE9IG51bGwgfHwgbVN0YXRlICE9IG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGhlaWdodCBvZiBtYWluIG1lZGlhIGNvbnRyb2xsZXIgd2hpY2ggaW5jbHVkZXMgcGxheWJhY2sgY29udHJvbCBhbmQgbWFzdGVyCi0gICAgICogdm9sdW1lIGNvbnRyb2wuCi0gICAgICovCi0gICAgcHJpdmF0ZSBpbnQgZ2V0TWFpbkNvbnRyb2xsZXJIZWlnaHQoYm9vbGVhbiBzaG93UGxheWJhY2tDb250cm9sKSB7Ci0gICAgICAgIGludCBoZWlnaHQgPSAwOwotICAgICAgICBpZiAoc2hvd1BsYXliYWNrQ29udHJvbCB8fCBtVm9sdW1lQ29udHJvbExheW91dC5nZXRWaXNpYmlsaXR5KCkgPT0gVmlldy5WSVNJQkxFKSB7Ci0gICAgICAgICAgICBoZWlnaHQgKz0gbU1lZGlhTWFpbkNvbnRyb2xMYXlvdXQuZ2V0UGFkZGluZ1RvcCgpCi0gICAgICAgICAgICAgICAgICAgICsgbU1lZGlhTWFpbkNvbnRyb2xMYXlvdXQuZ2V0UGFkZGluZ0JvdHRvbSgpOwotICAgICAgICAgICAgaWYgKHNob3dQbGF5YmFja0NvbnRyb2wpIHsKLSAgICAgICAgICAgICAgICBoZWlnaHQgKz0gIG1QbGF5YmFja0NvbnRyb2xMYXlvdXQuZ2V0TWVhc3VyZWRIZWlnaHQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtVm9sdW1lQ29udHJvbExheW91dC5nZXRWaXNpYmlsaXR5KCkgPT0gVmlldy5WSVNJQkxFKSB7Ci0gICAgICAgICAgICAgICAgaGVpZ2h0ICs9IG1Wb2x1bWVDb250cm9sTGF5b3V0LmdldE1lYXN1cmVkSGVpZ2h0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc2hvd1BsYXliYWNrQ29udHJvbCAmJiBtVm9sdW1lQ29udHJvbExheW91dC5nZXRWaXNpYmlsaXR5KCkgPT0gVmlldy5WSVNJQkxFKSB7Ci0gICAgICAgICAgICAgICAgaGVpZ2h0ICs9IG1EaXZpZGVyVmlldy5nZXRNZWFzdXJlZEhlaWdodCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBoZWlnaHQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZU1lZGlhQ29udHJvbFZpc2liaWxpdHkoYm9vbGVhbiBjYW5TaG93UGxheWJhY2tDb250cm9sTGF5b3V0KSB7Ci0gICAgICAgIC8vIFRPRE86IFVwZGF0ZSB0aGUgdG9wIGFuZCBib3R0b20gcGFkZGluZyBvZiB0aGUgY29udHJvbCBsYXlvdXQgYWNjb3JkaW5nIHRvIHRoZSBkaXNwbGF5Ci0gICAgICAgIC8vIGhlaWdodC4KLSAgICAgICAgbURpdmlkZXJWaWV3LnNldFZpc2liaWxpdHkoKG1Wb2x1bWVDb250cm9sTGF5b3V0LmdldFZpc2liaWxpdHkoKSA9PSBWaWV3LlZJU0lCTEUKLSAgICAgICAgICAgICAgICAmJiBjYW5TaG93UGxheWJhY2tDb250cm9sTGF5b3V0KSA/IFZpZXcuVklTSUJMRSA6IFZpZXcuR09ORSk7Ci0gICAgICAgIG1NZWRpYU1haW5Db250cm9sTGF5b3V0LnNldFZpc2liaWxpdHkoKG1Wb2x1bWVDb250cm9sTGF5b3V0LmdldFZpc2liaWxpdHkoKSA9PSBWaWV3LkdPTkUKLSAgICAgICAgICAgICAgICAmJiAhY2FuU2hvd1BsYXliYWNrQ29udHJvbExheW91dCkgPyBWaWV3LkdPTkUgOiBWaWV3LlZJU0lCTEUpOwotICAgIH0KLQotICAgIHZvaWQgdXBkYXRlTGF5b3V0SGVpZ2h0KGZpbmFsIGJvb2xlYW4gYW5pbWF0ZSkgewotICAgICAgICAvLyBXZSBuZWVkIHRvIGRlZmVyIHRoZSB1cGRhdGUgdW50aWwgdGhlIGZpcnN0IGxheW91dCBoYXMgb2NjdXJyZWQsIGFzIHdlIGRvbid0IHlldCBrbm93IHRoZQotICAgICAgICAvLyBvdmVyYWxsIHZpc2libGUgZGlzcGxheSBzaXplIGluIHdoaWNoIHRoZSB3aW5kb3cgdGhpcyB2aWV3IGlzIGF0dGFjaGVkIHRvIGhhcyBiZWVuCi0gICAgICAgIC8vIHBvc2l0aW9uZWQgaW4uCi0gICAgICAgIG1EZWZhdWx0Q29udHJvbExheW91dC5yZXF1ZXN0TGF5b3V0KCk7Ci0gICAgICAgIFZpZXdUcmVlT2JzZXJ2ZXIgb2JzZXJ2ZXIgPSBtRGVmYXVsdENvbnRyb2xMYXlvdXQuZ2V0Vmlld1RyZWVPYnNlcnZlcigpOwotICAgICAgICBvYnNlcnZlci5hZGRPbkdsb2JhbExheW91dExpc3RlbmVyKG5ldyBWaWV3VHJlZU9ic2VydmVyLk9uR2xvYmFsTGF5b3V0TGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uR2xvYmFsTGF5b3V0KCkgewotICAgICAgICAgICAgICAgIG1EZWZhdWx0Q29udHJvbExheW91dC5nZXRWaWV3VHJlZU9ic2VydmVyKCkucmVtb3ZlR2xvYmFsT25MYXlvdXRMaXN0ZW5lcih0aGlzKTsKLSAgICAgICAgICAgICAgICBpZiAobUlzR3JvdXBMaXN0QW5pbWF0aW5nKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Jc0dyb3VwTGlzdEFuaW1hdGlvblBlbmRpbmcgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZUxheW91dEhlaWdodEludGVybmFsKGFuaW1hdGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXBkYXRlcyB0aGUgaGVpZ2h0IG9mIHZpZXdzIGFuZCBoaWRlIGFydHdvcmsgb3IgbWV0YWRhdGEgaWYgc3BhY2UgaXMgbGltaXRlZC4KLSAgICAgKi8KLSAgICB2b2lkIHVwZGF0ZUxheW91dEhlaWdodEludGVybmFsKGJvb2xlYW4gYW5pbWF0ZSkgewotICAgICAgICAvLyBNZWFzdXJlIHRoZSBzaXplIG9mIHdpZGdldHMgYW5kIGdldCB0aGUgaGVpZ2h0IG9mIG1haW4gY29tcG9uZW50cy4KLSAgICAgICAgaW50IG9sZEhlaWdodCA9IGdldExheW91dEhlaWdodChtTWVkaWFNYWluQ29udHJvbExheW91dCk7Ci0gICAgICAgIHNldExheW91dEhlaWdodChtTWVkaWFNYWluQ29udHJvbExheW91dCwgVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQpOwotICAgICAgICB1cGRhdGVNZWRpYUNvbnRyb2xWaXNpYmlsaXR5KGNhblNob3dQbGF5YmFja0NvbnRyb2xMYXlvdXQoKSk7Ci0gICAgICAgIFZpZXcgZGVjb3JWaWV3ID0gZ2V0V2luZG93KCkuZ2V0RGVjb3JWaWV3KCk7Ci0gICAgICAgIGRlY29yVmlldy5tZWFzdXJlKAotICAgICAgICAgICAgICAgIE1lYXN1cmVTcGVjLm1ha2VNZWFzdXJlU3BlYyhnZXRXaW5kb3coKS5nZXRBdHRyaWJ1dGVzKCkud2lkdGgsIE1lYXN1cmVTcGVjLkVYQUNUTFkpLAotICAgICAgICAgICAgICAgIE1lYXN1cmVTcGVjLlVOU1BFQ0lGSUVEKTsKLSAgICAgICAgc2V0TGF5b3V0SGVpZ2h0KG1NZWRpYU1haW5Db250cm9sTGF5b3V0LCBvbGRIZWlnaHQpOwotICAgICAgICBpbnQgYXJ0Vmlld0hlaWdodCA9IDA7Ci0gICAgICAgIGlmIChtQ3VzdG9tQ29udHJvbFZpZXcgPT0gbnVsbCAmJiBtQXJ0Vmlldy5nZXREcmF3YWJsZSgpIGluc3RhbmNlb2YgQml0bWFwRHJhd2FibGUpIHsKLSAgICAgICAgICAgIEJpdG1hcCBhcnQgPSAoKEJpdG1hcERyYXdhYmxlKSBtQXJ0Vmlldy5nZXREcmF3YWJsZSgpKS5nZXRCaXRtYXAoKTsKLSAgICAgICAgICAgIGlmIChhcnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGFydFZpZXdIZWlnaHQgPSBnZXREZXNpcmVkQXJ0SGVpZ2h0KGFydC5nZXRXaWR0aCgpLCBhcnQuZ2V0SGVpZ2h0KCkpOwotICAgICAgICAgICAgICAgIG1BcnRWaWV3LnNldFNjYWxlVHlwZShhcnQuZ2V0V2lkdGgoKSA+PSBhcnQuZ2V0SGVpZ2h0KCkKLSAgICAgICAgICAgICAgICAgICAgICAgID8gSW1hZ2VWaWV3LlNjYWxlVHlwZS5GSVRfWFkgOiBJbWFnZVZpZXcuU2NhbGVUeXBlLkZJVF9DRU5URVIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGludCBtYWluQ29udHJvbGxlckhlaWdodCA9IGdldE1haW5Db250cm9sbGVySGVpZ2h0KGNhblNob3dQbGF5YmFja0NvbnRyb2xMYXlvdXQoKSk7Ci0gICAgICAgIGludCB2b2x1bWVHcm91cExpc3RDb3VudCA9IG1Hcm91cE1lbWJlclJvdXRlcy5zaXplKCk7Ci0gICAgICAgIC8vIFNjYWxlIGRvd24gdm9sdW1lIGdyb3VwIGxpc3QgaXRlbXMgaW4gbGFuZHNjYXBlIG1vZGUuCi0gICAgICAgIGludCBleHBhbmRlZEdyb3VwTGlzdEhlaWdodCA9IGdldEdyb3VwKCkgPT0gbnVsbCA/IDAgOgotICAgICAgICAgICAgICAgIG1Wb2x1bWVHcm91cExpc3RJdGVtSGVpZ2h0ICogZ2V0R3JvdXAoKS5nZXRSb3V0ZXMoKS5zaXplKCk7Ci0gICAgICAgIGlmICh2b2x1bWVHcm91cExpc3RDb3VudCA+IDApIHsKLSAgICAgICAgICAgIGV4cGFuZGVkR3JvdXBMaXN0SGVpZ2h0ICs9IG1Wb2x1bWVHcm91cExpc3RQYWRkaW5nVG9wOwotICAgICAgICB9Ci0gICAgICAgIGV4cGFuZGVkR3JvdXBMaXN0SGVpZ2h0ID0gTWF0aC5taW4oZXhwYW5kZWRHcm91cExpc3RIZWlnaHQsIG1Wb2x1bWVHcm91cExpc3RNYXhIZWlnaHQpOwotICAgICAgICBpbnQgdmlzaWJsZUdyb3VwTGlzdEhlaWdodCA9IG1Jc0dyb3VwRXhwYW5kZWQgPyBleHBhbmRlZEdyb3VwTGlzdEhlaWdodCA6IDA7Ci0KLSAgICAgICAgaW50IGRlc2lyZWRDb250cm9sTGF5b3V0SGVpZ2h0ID0KLSAgICAgICAgICAgICAgICBNYXRoLm1heChhcnRWaWV3SGVpZ2h0LCB2aXNpYmxlR3JvdXBMaXN0SGVpZ2h0KSArIG1haW5Db250cm9sbGVySGVpZ2h0OwotICAgICAgICBSZWN0IHZpc2libGVSZWN0ID0gbmV3IFJlY3QoKTsKLSAgICAgICAgZGVjb3JWaWV3LmdldFdpbmRvd1Zpc2libGVEaXNwbGF5RnJhbWUodmlzaWJsZVJlY3QpOwotICAgICAgICAvLyBIZWlnaHQgb2Ygbm9uLWNvbnRyb2wgdmlld3MgaW4gZGVjb3Igdmlldy4KLSAgICAgICAgLy8gVGhpcyBpbmNsdWRlcyB0aXRsZSBiYXIsIGJ1dHRvbiBiYXIsIGFuZCBkaWFsb2cncyB2ZXJ0aWNhbCBwYWRkaW5nIHdoaWNoIHNob3VsZCBiZQotICAgICAgICAvLyBhbHdheXMgc2hvd24uCi0gICAgICAgIGludCBub25Db250cm9sVmlld0hlaWdodCA9IG1EaWFsb2dBcmVhTGF5b3V0LmdldE1lYXN1cmVkSGVpZ2h0KCkKLSAgICAgICAgICAgICAgICAtIG1EZWZhdWx0Q29udHJvbExheW91dC5nZXRNZWFzdXJlZEhlaWdodCgpOwotICAgICAgICAvLyBNYXhpbXVtIGFsbG93ZWQgaGVpZ2h0IGZvciBjb250cm9scyB0byBmaXQgc2NyZWVuLgotICAgICAgICBpbnQgbWF4aW11bUNvbnRyb2xWaWV3SGVpZ2h0ID0gdmlzaWJsZVJlY3QuaGVpZ2h0KCkgLSBub25Db250cm9sVmlld0hlaWdodDsKLQotICAgICAgICAvLyBTaG93IGFydHdvcmsgaWYgaXQgZml0cyB0aGUgc2NyZWVuLgotICAgICAgICBpZiAobUN1c3RvbUNvbnRyb2xWaWV3ID09IG51bGwgJiYgYXJ0Vmlld0hlaWdodCA+IDAKLSAgICAgICAgICAgICAgICAmJiBkZXNpcmVkQ29udHJvbExheW91dEhlaWdodCA8PSBtYXhpbXVtQ29udHJvbFZpZXdIZWlnaHQpIHsKLSAgICAgICAgICAgIG1BcnRWaWV3LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgIHNldExheW91dEhlaWdodChtQXJ0VmlldywgYXJ0Vmlld0hlaWdodCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoZ2V0TGF5b3V0SGVpZ2h0KG1Wb2x1bWVHcm91cExpc3QpICsgbU1lZGlhTWFpbkNvbnRyb2xMYXlvdXQuZ2V0TWVhc3VyZWRIZWlnaHQoKQotICAgICAgICAgICAgICAgICAgICA+PSBtRGVmYXVsdENvbnRyb2xMYXlvdXQuZ2V0TWVhc3VyZWRIZWlnaHQoKSkgewotICAgICAgICAgICAgICAgIG1BcnRWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFydFZpZXdIZWlnaHQgPSAwOwotICAgICAgICAgICAgZGVzaXJlZENvbnRyb2xMYXlvdXRIZWlnaHQgPSB2aXNpYmxlR3JvdXBMaXN0SGVpZ2h0ICsgbWFpbkNvbnRyb2xsZXJIZWlnaHQ7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gU2hvdyB0aGUgcGxheWJhY2sgY29udHJvbCBpZiBpdCBmaXRzIHRoZSBzY3JlZW4uCi0gICAgICAgIGlmIChjYW5TaG93UGxheWJhY2tDb250cm9sTGF5b3V0KCkKLSAgICAgICAgICAgICAgICAmJiBkZXNpcmVkQ29udHJvbExheW91dEhlaWdodCA8PSBtYXhpbXVtQ29udHJvbFZpZXdIZWlnaHQpIHsKLSAgICAgICAgICAgIG1QbGF5YmFja0NvbnRyb2xMYXlvdXQuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbVBsYXliYWNrQ29udHJvbExheW91dC5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgIH0KLSAgICAgICAgdXBkYXRlTWVkaWFDb250cm9sVmlzaWJpbGl0eShtUGxheWJhY2tDb250cm9sTGF5b3V0LmdldFZpc2liaWxpdHkoKSA9PSBWaWV3LlZJU0lCTEUpOwotICAgICAgICBtYWluQ29udHJvbGxlckhlaWdodCA9IGdldE1haW5Db250cm9sbGVySGVpZ2h0KAotICAgICAgICAgICAgICAgIG1QbGF5YmFja0NvbnRyb2xMYXlvdXQuZ2V0VmlzaWJpbGl0eSgpID09IFZpZXcuVklTSUJMRSk7Ci0gICAgICAgIGRlc2lyZWRDb250cm9sTGF5b3V0SGVpZ2h0ID0KLSAgICAgICAgICAgICAgICBNYXRoLm1heChhcnRWaWV3SGVpZ2h0LCB2aXNpYmxlR3JvdXBMaXN0SGVpZ2h0KSArIG1haW5Db250cm9sbGVySGVpZ2h0OwotCi0gICAgICAgIC8vIExpbWl0IHRoZSB2b2x1bWUgZ3JvdXAgbGlzdCBoZWlnaHQgdG8gZml0IHRoZSBzY3JlZW4uCi0gICAgICAgIGlmIChkZXNpcmVkQ29udHJvbExheW91dEhlaWdodCA+IG1heGltdW1Db250cm9sVmlld0hlaWdodCkgewotICAgICAgICAgICAgdmlzaWJsZUdyb3VwTGlzdEhlaWdodCAtPSAoZGVzaXJlZENvbnRyb2xMYXlvdXRIZWlnaHQgLSBtYXhpbXVtQ29udHJvbFZpZXdIZWlnaHQpOwotICAgICAgICAgICAgZGVzaXJlZENvbnRyb2xMYXlvdXRIZWlnaHQgPSBtYXhpbXVtQ29udHJvbFZpZXdIZWlnaHQ7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gVXBkYXRlIHRoZSBsYXlvdXRzIHdpdGggdGhlIGNvbXB1dGVkIGhlaWdodHMuCi0gICAgICAgIG1NZWRpYU1haW5Db250cm9sTGF5b3V0LmNsZWFyQW5pbWF0aW9uKCk7Ci0gICAgICAgIG1Wb2x1bWVHcm91cExpc3QuY2xlYXJBbmltYXRpb24oKTsKLSAgICAgICAgbURlZmF1bHRDb250cm9sTGF5b3V0LmNsZWFyQW5pbWF0aW9uKCk7Ci0gICAgICAgIGlmIChhbmltYXRlKSB7Ci0gICAgICAgICAgICBhbmltYXRlTGF5b3V0SGVpZ2h0KG1NZWRpYU1haW5Db250cm9sTGF5b3V0LCBtYWluQ29udHJvbGxlckhlaWdodCk7Ci0gICAgICAgICAgICBhbmltYXRlTGF5b3V0SGVpZ2h0KG1Wb2x1bWVHcm91cExpc3QsIHZpc2libGVHcm91cExpc3RIZWlnaHQpOwotICAgICAgICAgICAgYW5pbWF0ZUxheW91dEhlaWdodChtRGVmYXVsdENvbnRyb2xMYXlvdXQsIGRlc2lyZWRDb250cm9sTGF5b3V0SGVpZ2h0KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNldExheW91dEhlaWdodChtTWVkaWFNYWluQ29udHJvbExheW91dCwgbWFpbkNvbnRyb2xsZXJIZWlnaHQpOwotICAgICAgICAgICAgc2V0TGF5b3V0SGVpZ2h0KG1Wb2x1bWVHcm91cExpc3QsIHZpc2libGVHcm91cExpc3RIZWlnaHQpOwotICAgICAgICAgICAgc2V0TGF5b3V0SGVpZ2h0KG1EZWZhdWx0Q29udHJvbExheW91dCwgZGVzaXJlZENvbnRyb2xMYXlvdXRIZWlnaHQpOwotICAgICAgICB9Ci0gICAgICAgIC8vIE1heGltaXplIHRoZSB3aW5kb3cgc2l6ZSB3aXRoIGEgdHJhbnNwYXJlbnQgbGF5b3V0IGluIGFkdmFuY2UgZm9yIHNtb290aCBhbmltYXRpb24uCi0gICAgICAgIHNldExheW91dEhlaWdodChtRXhwYW5kYWJsZUFyZWFMYXlvdXQsIHZpc2libGVSZWN0LmhlaWdodCgpKTsKLSAgICAgICAgcmVidWlsZFZvbHVtZUdyb3VwTGlzdChhbmltYXRlKTsKLSAgICB9Ci0KLSAgICB2b2lkIHVwZGF0ZVZvbHVtZUdyb3VwSXRlbUhlaWdodChWaWV3IGl0ZW0pIHsKLSAgICAgICAgTGluZWFyTGF5b3V0IGNvbnRhaW5lciA9IChMaW5lYXJMYXlvdXQpIGl0ZW0uZmluZFZpZXdCeUlkKFIuaWQudm9sdW1lX2l0ZW1fY29udGFpbmVyKTsKLSAgICAgICAgc2V0TGF5b3V0SGVpZ2h0KGNvbnRhaW5lciwgbVZvbHVtZUdyb3VwTGlzdEl0ZW1IZWlnaHQpOwotICAgICAgICBWaWV3IGljb24gPSBpdGVtLmZpbmRWaWV3QnlJZChSLmlkLm1yX3ZvbHVtZV9pdGVtX2ljb24pOwotICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zIGxwID0gaWNvbi5nZXRMYXlvdXRQYXJhbXMoKTsKLSAgICAgICAgbHAud2lkdGggPSBtVm9sdW1lR3JvdXBMaXN0SXRlbUljb25TaXplOwotICAgICAgICBscC5oZWlnaHQgPSBtVm9sdW1lR3JvdXBMaXN0SXRlbUljb25TaXplOwotICAgICAgICBpY29uLnNldExheW91dFBhcmFtcyhscCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFuaW1hdGVMYXlvdXRIZWlnaHQoZmluYWwgVmlldyB2aWV3LCBpbnQgdGFyZ2V0SGVpZ2h0KSB7Ci0gICAgICAgIGZpbmFsIGludCBzdGFydFZhbHVlID0gZ2V0TGF5b3V0SGVpZ2h0KHZpZXcpOwotICAgICAgICBmaW5hbCBpbnQgZW5kVmFsdWUgPSB0YXJnZXRIZWlnaHQ7Ci0gICAgICAgIEFuaW1hdGlvbiBhbmltID0gbmV3IEFuaW1hdGlvbigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgYXBwbHlUcmFuc2Zvcm1hdGlvbihmbG9hdCBpbnRlcnBvbGF0ZWRUaW1lLCBUcmFuc2Zvcm1hdGlvbiB0KSB7Ci0gICAgICAgICAgICAgICAgaW50IGhlaWdodCA9IHN0YXJ0VmFsdWUgLSAoaW50KSAoKHN0YXJ0VmFsdWUgLSBlbmRWYWx1ZSkgKiBpbnRlcnBvbGF0ZWRUaW1lKTsKLSAgICAgICAgICAgICAgICBzZXRMYXlvdXRIZWlnaHQodmlldywgaGVpZ2h0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAgICAgYW5pbS5zZXREdXJhdGlvbihtR3JvdXBMaXN0QW5pbWF0aW9uRHVyYXRpb25Ncyk7Ci0gICAgICAgIGlmIChhbmRyb2lkLm9zLkJ1aWxkLlZFUlNJT04uU0RLX0lOVCA+PSAyMSkgewotICAgICAgICAgICAgYW5pbS5zZXRJbnRlcnBvbGF0b3IobUludGVycG9sYXRvcik7Ci0gICAgICAgIH0KLSAgICAgICAgdmlldy5zdGFydEFuaW1hdGlvbihhbmltKTsKLSAgICB9Ci0KLSAgICB2b2lkIGxvYWRJbnRlcnBvbGF0b3IoKSB7Ci0gICAgICAgIG1JbnRlcnBvbGF0b3IgPQotICAgICAgICAgICAgICAgIG1Jc0dyb3VwRXhwYW5kZWQgPyBtTGluZWFyT3V0U2xvd0luSW50ZXJwb2xhdG9yIDogbUZhc3RPdXRTbG93SW5JbnRlcnBvbGF0b3I7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVZvbHVtZUNvbnRyb2xMYXlvdXQoKSB7Ci0gICAgICAgIGlmIChpc1ZvbHVtZUNvbnRyb2xBdmFpbGFibGUobVJvdXRlKSkgewotICAgICAgICAgICAgaWYgKG1Wb2x1bWVDb250cm9sTGF5b3V0LmdldFZpc2liaWxpdHkoKSA9PSBWaWV3LkdPTkUpIHsKLSAgICAgICAgICAgICAgICBtVm9sdW1lQ29udHJvbExheW91dC5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICAgICAgbVZvbHVtZVNsaWRlci5zZXRNYXgobVJvdXRlLmdldFZvbHVtZU1heCgpKTsKLSAgICAgICAgICAgICAgICBtVm9sdW1lU2xpZGVyLnNldFByb2dyZXNzKG1Sb3V0ZS5nZXRWb2x1bWUoKSk7Ci0gICAgICAgICAgICAgICAgbUdyb3VwRXhwYW5kQ29sbGFwc2VCdXR0b24uc2V0VmlzaWJpbGl0eShnZXRHcm91cCgpID09IG51bGwgPyBWaWV3LkdPTkUKLSAgICAgICAgICAgICAgICAgICAgICAgIDogVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1Wb2x1bWVDb250cm9sTGF5b3V0LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCByZWJ1aWxkVm9sdW1lR3JvdXBMaXN0KGJvb2xlYW4gYW5pbWF0ZSkgewotICAgICAgICBMaXN0PE1lZGlhUm91dGVyLlJvdXRlSW5mbz4gcm91dGVzID0gZ2V0R3JvdXAoKSA9PSBudWxsID8gbnVsbCA6IGdldEdyb3VwKCkuZ2V0Um91dGVzKCk7Ci0gICAgICAgIGlmIChyb3V0ZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgbUdyb3VwTWVtYmVyUm91dGVzLmNsZWFyKCk7Ci0gICAgICAgICAgICBtVm9sdW1lR3JvdXBBZGFwdGVyLm5vdGlmeURhdGFTZXRDaGFuZ2VkKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoTWVkaWFSb3V0ZURpYWxvZ0hlbHBlci5saXN0VW5vcmRlcmVkRXF1YWxzKG1Hcm91cE1lbWJlclJvdXRlcywgcm91dGVzKSkgewotICAgICAgICAgICAgbVZvbHVtZUdyb3VwQWRhcHRlci5ub3RpZnlEYXRhU2V0Q2hhbmdlZCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgSGFzaE1hcDxNZWRpYVJvdXRlci5Sb3V0ZUluZm8sIFJlY3Q+IHByZXZpb3VzUm91dGVCb3VuZE1hcCA9IGFuaW1hdGUKLSAgICAgICAgICAgICAgICAgICAgPyBNZWRpYVJvdXRlRGlhbG9nSGVscGVyLmdldEl0ZW1Cb3VuZE1hcChtVm9sdW1lR3JvdXBMaXN0LCBtVm9sdW1lR3JvdXBBZGFwdGVyKQotICAgICAgICAgICAgICAgICAgICA6IG51bGw7Ci0gICAgICAgICAgICBIYXNoTWFwPE1lZGlhUm91dGVyLlJvdXRlSW5mbywgQml0bWFwRHJhd2FibGU+IHByZXZpb3VzUm91dGVCaXRtYXBNYXAgPSBhbmltYXRlCi0gICAgICAgICAgICAgICAgICAgID8gTWVkaWFSb3V0ZURpYWxvZ0hlbHBlci5nZXRJdGVtQml0bWFwTWFwKG1Db250ZXh0LCBtVm9sdW1lR3JvdXBMaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Wb2x1bWVHcm91cEFkYXB0ZXIpIDogbnVsbDsKLSAgICAgICAgICAgIG1Hcm91cE1lbWJlclJvdXRlc0FkZGVkID0KLSAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZURpYWxvZ0hlbHBlci5nZXRJdGVtc0FkZGVkKG1Hcm91cE1lbWJlclJvdXRlcywgcm91dGVzKTsKLSAgICAgICAgICAgIG1Hcm91cE1lbWJlclJvdXRlc1JlbW92ZWQgPSBNZWRpYVJvdXRlRGlhbG9nSGVscGVyLmdldEl0ZW1zUmVtb3ZlZChtR3JvdXBNZW1iZXJSb3V0ZXMsCi0gICAgICAgICAgICAgICAgICAgIHJvdXRlcyk7Ci0gICAgICAgICAgICBtR3JvdXBNZW1iZXJSb3V0ZXMuYWRkQWxsKDAsIG1Hcm91cE1lbWJlclJvdXRlc0FkZGVkKTsKLSAgICAgICAgICAgIG1Hcm91cE1lbWJlclJvdXRlcy5yZW1vdmVBbGwobUdyb3VwTWVtYmVyUm91dGVzUmVtb3ZlZCk7Ci0gICAgICAgICAgICBtVm9sdW1lR3JvdXBBZGFwdGVyLm5vdGlmeURhdGFTZXRDaGFuZ2VkKCk7Ci0gICAgICAgICAgICBpZiAoYW5pbWF0ZSAmJiBtSXNHcm91cEV4cGFuZGVkCi0gICAgICAgICAgICAgICAgICAgICYmIG1Hcm91cE1lbWJlclJvdXRlc0FkZGVkLnNpemUoKSArIG1Hcm91cE1lbWJlclJvdXRlc1JlbW92ZWQuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgICAgIGFuaW1hdGVHcm91cExpc3RJdGVtcyhwcmV2aW91c1JvdXRlQm91bmRNYXAsIHByZXZpb3VzUm91dGVCaXRtYXBNYXApOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtR3JvdXBNZW1iZXJSb3V0ZXNBZGRlZCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgbUdyb3VwTWVtYmVyUm91dGVzUmVtb3ZlZCA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYW5pbWF0ZUdyb3VwTGlzdEl0ZW1zKGZpbmFsIE1hcDxNZWRpYVJvdXRlci5Sb3V0ZUluZm8sIFJlY3Q+IHByZXZpb3VzUm91dGVCb3VuZE1hcCwKLSAgICAgICAgICAgIGZpbmFsIE1hcDxNZWRpYVJvdXRlci5Sb3V0ZUluZm8sIEJpdG1hcERyYXdhYmxlPiBwcmV2aW91c1JvdXRlQml0bWFwTWFwKSB7Ci0gICAgICAgIG1Wb2x1bWVHcm91cExpc3Quc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIG1Wb2x1bWVHcm91cExpc3QucmVxdWVzdExheW91dCgpOwotICAgICAgICBtSXNHcm91cExpc3RBbmltYXRpbmcgPSB0cnVlOwotICAgICAgICBWaWV3VHJlZU9ic2VydmVyIG9ic2VydmVyID0gbVZvbHVtZUdyb3VwTGlzdC5nZXRWaWV3VHJlZU9ic2VydmVyKCk7Ci0gICAgICAgIG9ic2VydmVyLmFkZE9uR2xvYmFsTGF5b3V0TGlzdGVuZXIobmV3IFZpZXdUcmVlT2JzZXJ2ZXIuT25HbG9iYWxMYXlvdXRMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25HbG9iYWxMYXlvdXQoKSB7Ci0gICAgICAgICAgICAgICAgbVZvbHVtZUdyb3VwTGlzdC5nZXRWaWV3VHJlZU9ic2VydmVyKCkucmVtb3ZlR2xvYmFsT25MYXlvdXRMaXN0ZW5lcih0aGlzKTsKLSAgICAgICAgICAgICAgICBhbmltYXRlR3JvdXBMaXN0SXRlbXNJbnRlcm5hbChwcmV2aW91c1JvdXRlQm91bmRNYXAsIHByZXZpb3VzUm91dGVCaXRtYXBNYXApOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICB2b2lkIGFuaW1hdGVHcm91cExpc3RJdGVtc0ludGVybmFsKAotICAgICAgICAgICAgTWFwPE1lZGlhUm91dGVyLlJvdXRlSW5mbywgUmVjdD4gcHJldmlvdXNSb3V0ZUJvdW5kTWFwLAotICAgICAgICAgICAgTWFwPE1lZGlhUm91dGVyLlJvdXRlSW5mbywgQml0bWFwRHJhd2FibGU+IHByZXZpb3VzUm91dGVCaXRtYXBNYXApIHsKLSAgICAgICAgaWYgKG1Hcm91cE1lbWJlclJvdXRlc0FkZGVkID09IG51bGwgfHwgbUdyb3VwTWVtYmVyUm91dGVzUmVtb3ZlZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaW50IGdyb3VwU2l6ZURlbHRhID0gbUdyb3VwTWVtYmVyUm91dGVzQWRkZWQuc2l6ZSgpIC0gbUdyb3VwTWVtYmVyUm91dGVzUmVtb3ZlZC5zaXplKCk7Ci0gICAgICAgIGJvb2xlYW4gbGlzdGVuZXJSZWdpc3RlcmVkID0gZmFsc2U7Ci0gICAgICAgIEFuaW1hdGlvbi5BbmltYXRpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBBbmltYXRpb24uQW5pbWF0aW9uTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQW5pbWF0aW9uU3RhcnQoQW5pbWF0aW9uIGFuaW1hdGlvbikgewotICAgICAgICAgICAgICAgIG1Wb2x1bWVHcm91cExpc3Quc3RhcnRBbmltYXRpb25BbGwoKTsKLSAgICAgICAgICAgICAgICBtVm9sdW1lR3JvdXBMaXN0LnBvc3REZWxheWVkKG1Hcm91cExpc3RGYWRlSW5BbmltYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICBtR3JvdXBMaXN0QW5pbWF0aW9uRHVyYXRpb25Ncyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25FbmQoQW5pbWF0aW9uIGFuaW1hdGlvbikgeyB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25SZXBlYXQoQW5pbWF0aW9uIGFuaW1hdGlvbikgeyB9Ci0gICAgICAgIH07Ci0KLSAgICAgICAgLy8gQW5pbWF0ZSB2aXNpYmxlIGl0ZW1zIGZyb20gcHJldmlvdXMgcG9zaXRpb25zIHRvIGN1cnJlbnQgcG9zaXRpb25zIGV4Y2VwdCByb3V0ZXMgYWRkZWQKLSAgICAgICAgLy8ganVzdCBiZWZvcmUuIEFkZGVkIHJvdXRlcyB3aWxsIHJlbWFpbiBoaWRkZW4gdW50aWwgdHJhbnNsYXRlIGFuaW1hdGlvbiBmaW5pc2hlcy4KLSAgICAgICAgaW50IGZpcnN0ID0gbVZvbHVtZUdyb3VwTGlzdC5nZXRGaXJzdFZpc2libGVQb3NpdGlvbigpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1Wb2x1bWVHcm91cExpc3QuZ2V0Q2hpbGRDb3VudCgpOyArK2kpIHsKLSAgICAgICAgICAgIFZpZXcgdmlldyA9IG1Wb2x1bWVHcm91cExpc3QuZ2V0Q2hpbGRBdChpKTsKLSAgICAgICAgICAgIGludCBwb3NpdGlvbiA9IGZpcnN0ICsgaTsKLSAgICAgICAgICAgIE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSA9IG1Wb2x1bWVHcm91cEFkYXB0ZXIuZ2V0SXRlbShwb3NpdGlvbik7Ci0gICAgICAgICAgICBSZWN0IHByZXZpb3VzQm91bmRzID0gcHJldmlvdXNSb3V0ZUJvdW5kTWFwLmdldChyb3V0ZSk7Ci0gICAgICAgICAgICBpbnQgY3VycmVudFRvcCA9IHZpZXcuZ2V0VG9wKCk7Ci0gICAgICAgICAgICBpbnQgcHJldmlvdXNUb3AgPSBwcmV2aW91c0JvdW5kcyAhPSBudWxsID8gcHJldmlvdXNCb3VuZHMudG9wCi0gICAgICAgICAgICAgICAgICAgIDogKGN1cnJlbnRUb3AgKyBtVm9sdW1lR3JvdXBMaXN0SXRlbUhlaWdodCAqIGdyb3VwU2l6ZURlbHRhKTsKLSAgICAgICAgICAgIEFuaW1hdGlvblNldCBhbmltU2V0ID0gbmV3IEFuaW1hdGlvblNldCh0cnVlKTsKLSAgICAgICAgICAgIGlmIChtR3JvdXBNZW1iZXJSb3V0ZXNBZGRlZCAhPSBudWxsICYmIG1Hcm91cE1lbWJlclJvdXRlc0FkZGVkLmNvbnRhaW5zKHJvdXRlKSkgewotICAgICAgICAgICAgICAgIHByZXZpb3VzVG9wID0gY3VycmVudFRvcDsKLSAgICAgICAgICAgICAgICBBbmltYXRpb24gYWxwaGFBbmltID0gbmV3IEFscGhhQW5pbWF0aW9uKDAuMGYsIDAuMGYpOwotICAgICAgICAgICAgICAgIGFscGhhQW5pbS5zZXREdXJhdGlvbihtR3JvdXBMaXN0RmFkZUluRHVyYXRpb25Ncyk7Ci0gICAgICAgICAgICAgICAgYW5pbVNldC5hZGRBbmltYXRpb24oYWxwaGFBbmltKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFuaW1hdGlvbiB0cmFuc2xhdGlvbkFuaW0gPSBuZXcgVHJhbnNsYXRlQW5pbWF0aW9uKDAsIDAsIHByZXZpb3VzVG9wIC0gY3VycmVudFRvcCwgMCk7Ci0gICAgICAgICAgICB0cmFuc2xhdGlvbkFuaW0uc2V0RHVyYXRpb24obUdyb3VwTGlzdEFuaW1hdGlvbkR1cmF0aW9uTXMpOwotICAgICAgICAgICAgYW5pbVNldC5hZGRBbmltYXRpb24odHJhbnNsYXRpb25BbmltKTsKLSAgICAgICAgICAgIGFuaW1TZXQuc2V0RmlsbEFmdGVyKHRydWUpOwotICAgICAgICAgICAgYW5pbVNldC5zZXRGaWxsRW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgIGFuaW1TZXQuc2V0SW50ZXJwb2xhdG9yKG1JbnRlcnBvbGF0b3IpOwotICAgICAgICAgICAgaWYgKCFsaXN0ZW5lclJlZ2lzdGVyZWQpIHsKLSAgICAgICAgICAgICAgICBsaXN0ZW5lclJlZ2lzdGVyZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIGFuaW1TZXQuc2V0QW5pbWF0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdmlldy5jbGVhckFuaW1hdGlvbigpOwotICAgICAgICAgICAgdmlldy5zdGFydEFuaW1hdGlvbihhbmltU2V0KTsKLSAgICAgICAgICAgIHByZXZpb3VzUm91dGVCb3VuZE1hcC5yZW1vdmUocm91dGUpOwotICAgICAgICAgICAgcHJldmlvdXNSb3V0ZUJpdG1hcE1hcC5yZW1vdmUocm91dGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSWYgYSBtZW1iZXIgcm91dGUgZG9lc24ndCBleGlzdCBhbnkgbG9uZ2VyLCBpdCBjYW4gYmUgZWl0aGVyIHJlbW92ZWQgb3IgbW92ZWQgb3V0IG9mIHRoZQotICAgICAgICAvLyBMaXN0VmlldyBsYXlvdXQgYm91bmRhcnkuIEluIHRoaXMgY2FzZSwgdXNlIHRoZSBwcmV2aW91c2x5IGNhcHR1cmVkIGJpdG1hcHMgZm9yCi0gICAgICAgIC8vIGFuaW1hdGlvbi4KLSAgICAgICAgZm9yIChNYXAuRW50cnk8TWVkaWFSb3V0ZXIuUm91dGVJbmZvLCBCaXRtYXBEcmF3YWJsZT4gaXRlbQotICAgICAgICAgICAgICAgIDogcHJldmlvdXNSb3V0ZUJpdG1hcE1hcC5lbnRyeVNldCgpKSB7Ci0gICAgICAgICAgICBmaW5hbCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUgPSBpdGVtLmdldEtleSgpOwotICAgICAgICAgICAgZmluYWwgQml0bWFwRHJhd2FibGUgYml0bWFwID0gaXRlbS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgZmluYWwgUmVjdCBib3VuZHMgPSBwcmV2aW91c1JvdXRlQm91bmRNYXAuZ2V0KHJvdXRlKTsKLSAgICAgICAgICAgIE92ZXJsYXlPYmplY3Qgb2JqZWN0ID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChtR3JvdXBNZW1iZXJSb3V0ZXNSZW1vdmVkLmNvbnRhaW5zKHJvdXRlKSkgewotICAgICAgICAgICAgICAgIG9iamVjdCA9IG5ldyBPdmVybGF5T2JqZWN0KGJpdG1hcCwgYm91bmRzKS5zZXRBbHBoYUFuaW1hdGlvbigxLjBmLCAwLjBmKQotICAgICAgICAgICAgICAgICAgICAgICAgLnNldER1cmF0aW9uKG1Hcm91cExpc3RGYWRlT3V0RHVyYXRpb25NcykKLSAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRJbnRlcnBvbGF0b3IobUludGVycG9sYXRvcik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGludCBkZWx0YVkgPSBncm91cFNpemVEZWx0YSAqIG1Wb2x1bWVHcm91cExpc3RJdGVtSGVpZ2h0OwotICAgICAgICAgICAgICAgIG9iamVjdCA9IG5ldyBPdmVybGF5T2JqZWN0KGJpdG1hcCwgYm91bmRzKS5zZXRUcmFuc2xhdGVZQW5pbWF0aW9uKGRlbHRhWSkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5zZXREdXJhdGlvbihtR3JvdXBMaXN0QW5pbWF0aW9uRHVyYXRpb25NcykKLSAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRJbnRlcnBvbGF0b3IobUludGVycG9sYXRvcikKLSAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRBbmltYXRpb25FbmRMaXN0ZW5lcihuZXcgT3ZlcmxheU9iamVjdC5PbkFuaW1hdGlvbkVuZExpc3RlbmVyKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQW5pbWF0aW9uRW5kKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtR3JvdXBNZW1iZXJSb3V0ZXNBbmltYXRpbmdXaXRoQml0bWFwLnJlbW92ZShyb3V0ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Wb2x1bWVHcm91cEFkYXB0ZXIubm90aWZ5RGF0YVNldENoYW5nZWQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgICAgICBtR3JvdXBNZW1iZXJSb3V0ZXNBbmltYXRpbmdXaXRoQml0bWFwLmFkZChyb3V0ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtVm9sdW1lR3JvdXBMaXN0LmFkZE92ZXJsYXlPYmplY3Qob2JqZWN0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgc3RhcnRHcm91cExpc3RGYWRlSW5BbmltYXRpb24oKSB7Ci0gICAgICAgIGNsZWFyR3JvdXBMaXN0QW5pbWF0aW9uKHRydWUpOwotICAgICAgICBtVm9sdW1lR3JvdXBMaXN0LnJlcXVlc3RMYXlvdXQoKTsKLSAgICAgICAgVmlld1RyZWVPYnNlcnZlciBvYnNlcnZlciA9IG1Wb2x1bWVHcm91cExpc3QuZ2V0Vmlld1RyZWVPYnNlcnZlcigpOwotICAgICAgICBvYnNlcnZlci5hZGRPbkdsb2JhbExheW91dExpc3RlbmVyKG5ldyBWaWV3VHJlZU9ic2VydmVyLk9uR2xvYmFsTGF5b3V0TGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uR2xvYmFsTGF5b3V0KCkgewotICAgICAgICAgICAgICAgIG1Wb2x1bWVHcm91cExpc3QuZ2V0Vmlld1RyZWVPYnNlcnZlcigpLnJlbW92ZUdsb2JhbE9uTGF5b3V0TGlzdGVuZXIodGhpcyk7Ci0gICAgICAgICAgICAgICAgc3RhcnRHcm91cExpc3RGYWRlSW5BbmltYXRpb25JbnRlcm5hbCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICB2b2lkIHN0YXJ0R3JvdXBMaXN0RmFkZUluQW5pbWF0aW9uSW50ZXJuYWwoKSB7Ci0gICAgICAgIGlmIChtR3JvdXBNZW1iZXJSb3V0ZXNBZGRlZCAhPSBudWxsICYmIG1Hcm91cE1lbWJlclJvdXRlc0FkZGVkLnNpemUoKSAhPSAwKSB7Ci0gICAgICAgICAgICBmYWRlSW5BZGRlZFJvdXRlcygpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZmluaXNoQW5pbWF0aW9uKHRydWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBmaW5pc2hBbmltYXRpb24oYm9vbGVhbiBhbmltYXRlKSB7Ci0gICAgICAgIG1Hcm91cE1lbWJlclJvdXRlc0FkZGVkID0gbnVsbDsKLSAgICAgICAgbUdyb3VwTWVtYmVyUm91dGVzUmVtb3ZlZCA9IG51bGw7Ci0gICAgICAgIG1Jc0dyb3VwTGlzdEFuaW1hdGluZyA9IGZhbHNlOwotICAgICAgICBpZiAobUlzR3JvdXBMaXN0QW5pbWF0aW9uUGVuZGluZykgewotICAgICAgICAgICAgbUlzR3JvdXBMaXN0QW5pbWF0aW9uUGVuZGluZyA9IGZhbHNlOwotICAgICAgICAgICAgdXBkYXRlTGF5b3V0SGVpZ2h0KGFuaW1hdGUpOwotICAgICAgICB9Ci0gICAgICAgIG1Wb2x1bWVHcm91cExpc3Quc2V0RW5hYmxlZCh0cnVlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZmFkZUluQWRkZWRSb3V0ZXMoKSB7Ci0gICAgICAgIEFuaW1hdGlvbi5BbmltYXRpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBBbmltYXRpb24uQW5pbWF0aW9uTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQW5pbWF0aW9uU3RhcnQoQW5pbWF0aW9uIGFuaW1hdGlvbikgeyB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25FbmQoQW5pbWF0aW9uIGFuaW1hdGlvbikgewotICAgICAgICAgICAgICAgIGZpbmlzaEFuaW1hdGlvbih0cnVlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvblJlcGVhdChBbmltYXRpb24gYW5pbWF0aW9uKSB7IH0KLSAgICAgICAgfTsKLSAgICAgICAgYm9vbGVhbiBsaXN0ZW5lclJlZ2lzdGVyZWQgPSBmYWxzZTsKLSAgICAgICAgaW50IGZpcnN0ID0gbVZvbHVtZUdyb3VwTGlzdC5nZXRGaXJzdFZpc2libGVQb3NpdGlvbigpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1Wb2x1bWVHcm91cExpc3QuZ2V0Q2hpbGRDb3VudCgpOyArK2kpIHsKLSAgICAgICAgICAgIFZpZXcgdmlldyA9IG1Wb2x1bWVHcm91cExpc3QuZ2V0Q2hpbGRBdChpKTsKLSAgICAgICAgICAgIGludCBwb3NpdGlvbiA9IGZpcnN0ICsgaTsKLSAgICAgICAgICAgIE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSA9IG1Wb2x1bWVHcm91cEFkYXB0ZXIuZ2V0SXRlbShwb3NpdGlvbik7Ci0gICAgICAgICAgICBpZiAobUdyb3VwTWVtYmVyUm91dGVzQWRkZWQuY29udGFpbnMocm91dGUpKSB7Ci0gICAgICAgICAgICAgICAgQW5pbWF0aW9uIGFscGhhQW5pbSA9IG5ldyBBbHBoYUFuaW1hdGlvbigwLjBmLCAxLjBmKTsKLSAgICAgICAgICAgICAgICBhbHBoYUFuaW0uc2V0RHVyYXRpb24obUdyb3VwTGlzdEZhZGVJbkR1cmF0aW9uTXMpOwotICAgICAgICAgICAgICAgIGFscGhhQW5pbS5zZXRGaWxsRW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICBhbHBoYUFuaW0uc2V0RmlsbEFmdGVyKHRydWUpOwotICAgICAgICAgICAgICAgIGlmICghbGlzdGVuZXJSZWdpc3RlcmVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyUmVnaXN0ZXJlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGFscGhhQW5pbS5zZXRBbmltYXRpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHZpZXcuY2xlYXJBbmltYXRpb24oKTsKLSAgICAgICAgICAgICAgICB2aWV3LnN0YXJ0QW5pbWF0aW9uKGFscGhhQW5pbSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIGNsZWFyR3JvdXBMaXN0QW5pbWF0aW9uKGJvb2xlYW4gZXhjZXB0QWRkZWRSb3V0ZXMpIHsKLSAgICAgICAgaW50IGZpcnN0ID0gbVZvbHVtZUdyb3VwTGlzdC5nZXRGaXJzdFZpc2libGVQb3NpdGlvbigpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1Wb2x1bWVHcm91cExpc3QuZ2V0Q2hpbGRDb3VudCgpOyArK2kpIHsKLSAgICAgICAgICAgIFZpZXcgdmlldyA9IG1Wb2x1bWVHcm91cExpc3QuZ2V0Q2hpbGRBdChpKTsKLSAgICAgICAgICAgIGludCBwb3NpdGlvbiA9IGZpcnN0ICsgaTsKLSAgICAgICAgICAgIE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSA9IG1Wb2x1bWVHcm91cEFkYXB0ZXIuZ2V0SXRlbShwb3NpdGlvbik7Ci0gICAgICAgICAgICBpZiAoZXhjZXB0QWRkZWRSb3V0ZXMgJiYgbUdyb3VwTWVtYmVyUm91dGVzQWRkZWQgIT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAmJiBtR3JvdXBNZW1iZXJSb3V0ZXNBZGRlZC5jb250YWlucyhyb3V0ZSkpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIExpbmVhckxheW91dCBjb250YWluZXIgPSAoTGluZWFyTGF5b3V0KSB2aWV3LmZpbmRWaWV3QnlJZChSLmlkLnZvbHVtZV9pdGVtX2NvbnRhaW5lcik7Ci0gICAgICAgICAgICBjb250YWluZXIuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgQW5pbWF0aW9uU2V0IGFuaW1TZXQgPSBuZXcgQW5pbWF0aW9uU2V0KHRydWUpOwotICAgICAgICAgICAgQW5pbWF0aW9uIGFscGhhQW5pbSA9IG5ldyBBbHBoYUFuaW1hdGlvbigxLjBmLCAxLjBmKTsKLSAgICAgICAgICAgIGFscGhhQW5pbS5zZXREdXJhdGlvbigwKTsKLSAgICAgICAgICAgIGFuaW1TZXQuYWRkQW5pbWF0aW9uKGFscGhhQW5pbSk7Ci0gICAgICAgICAgICBBbmltYXRpb24gdHJhbnNsYXRpb25BbmltID0gbmV3IFRyYW5zbGF0ZUFuaW1hdGlvbigwLCAwLCAwLCAwKTsKLSAgICAgICAgICAgIHRyYW5zbGF0aW9uQW5pbS5zZXREdXJhdGlvbigwKTsKLSAgICAgICAgICAgIGFuaW1TZXQuc2V0RmlsbEFmdGVyKHRydWUpOwotICAgICAgICAgICAgYW5pbVNldC5zZXRGaWxsRW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgIHZpZXcuY2xlYXJBbmltYXRpb24oKTsKLSAgICAgICAgICAgIHZpZXcuc3RhcnRBbmltYXRpb24oYW5pbVNldCk7Ci0gICAgICAgIH0KLSAgICAgICAgbVZvbHVtZUdyb3VwTGlzdC5zdG9wQW5pbWF0aW9uQWxsKCk7Ci0gICAgICAgIGlmICghZXhjZXB0QWRkZWRSb3V0ZXMpIHsKLSAgICAgICAgICAgIGZpbmlzaEFuaW1hdGlvbihmYWxzZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlUGxheWJhY2tDb250cm9sTGF5b3V0KCkgewotICAgICAgICBpZiAoY2FuU2hvd1BsYXliYWNrQ29udHJvbExheW91dCgpKSB7Ci0gICAgICAgICAgICBDaGFyU2VxdWVuY2UgdGl0bGUgPSBtRGVzY3JpcHRpb24gPT0gbnVsbCA/IG51bGwgOiBtRGVzY3JpcHRpb24uZ2V0VGl0bGUoKTsKLSAgICAgICAgICAgIGJvb2xlYW4gaGFzVGl0bGUgPSAhVGV4dFV0aWxzLmlzRW1wdHkodGl0bGUpOwotCi0gICAgICAgICAgICBDaGFyU2VxdWVuY2Ugc3VidGl0bGUgPSBtRGVzY3JpcHRpb24gPT0gbnVsbCA/IG51bGwgOiBtRGVzY3JpcHRpb24uZ2V0U3VidGl0bGUoKTsKLSAgICAgICAgICAgIGJvb2xlYW4gaGFzU3VidGl0bGUgPSAhVGV4dFV0aWxzLmlzRW1wdHkoc3VidGl0bGUpOwotCi0gICAgICAgICAgICBib29sZWFuIHNob3dUaXRsZSA9IGZhbHNlOwotICAgICAgICAgICAgYm9vbGVhbiBzaG93U3VidGl0bGUgPSBmYWxzZTsKLSAgICAgICAgICAgIGlmIChtUm91dGUuZ2V0UHJlc2VudGF0aW9uRGlzcGxheUlkKCkKLSAgICAgICAgICAgICAgICAgICAgIT0gTWVkaWFSb3V0ZXIuUm91dGVJbmZvLlBSRVNFTlRBVElPTl9ESVNQTEFZX0lEX05PTkUpIHsKLSAgICAgICAgICAgICAgICAvLyBUaGUgdXNlciBpcyBjdXJyZW50bHkgY2FzdGluZyBzY3JlZW4uCi0gICAgICAgICAgICAgICAgbVRpdGxlVmlldy5zZXRUZXh0KEFwaUhlbHBlci5nZXRMaWJSZXNvdXJjZXMobUNvbnRleHQpLmdldFN0cmluZygKLSAgICAgICAgICAgICAgICAgICAgICAgIFIuc3RyaW5nLm1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4pKTsKLSAgICAgICAgICAgICAgICBzaG93VGl0bGUgPSB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIGlmIChtU3RhdGUgPT0gbnVsbCB8fCBtU3RhdGUuZ2V0U3RhdGUoKSA9PSBQbGF5YmFja1N0YXRlQ29tcGF0LlNUQVRFX05PTkUpIHsKLSAgICAgICAgICAgICAgICAvLyBTaG93ICJObyBtZWRpYSBzZWxlY3RlZCIgYXMgd2UgZG9uJ3QgeWV0IGtub3cgdGhlIHBsYXliYWNrIHN0YXRlLgotICAgICAgICAgICAgICAgIG1UaXRsZVZpZXcuc2V0VGV4dChBcGlIZWxwZXIuZ2V0TGliUmVzb3VyY2VzKG1Db250ZXh0KS5nZXRTdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICBSLnN0cmluZy5tcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkKSk7Ci0gICAgICAgICAgICAgICAgc2hvd1RpdGxlID0gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIWhhc1RpdGxlICYmICFoYXNTdWJ0aXRsZSkgewotICAgICAgICAgICAgICAgIG1UaXRsZVZpZXcuc2V0VGV4dChBcGlIZWxwZXIuZ2V0TGliUmVzb3VyY2VzKG1Db250ZXh0KS5nZXRTdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICBSLnN0cmluZy5tcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlKSk7Ci0gICAgICAgICAgICAgICAgc2hvd1RpdGxlID0gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKGhhc1RpdGxlKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1UaXRsZVZpZXcuc2V0VGV4dCh0aXRsZSk7Ci0gICAgICAgICAgICAgICAgICAgIHNob3dUaXRsZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChoYXNTdWJ0aXRsZSkgewotICAgICAgICAgICAgICAgICAgICBtU3VidGl0bGVWaWV3LnNldFRleHQoc3VidGl0bGUpOwotICAgICAgICAgICAgICAgICAgICBzaG93U3VidGl0bGUgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1UaXRsZVZpZXcuc2V0VmlzaWJpbGl0eShzaG93VGl0bGUgPyBWaWV3LlZJU0lCTEUgOiBWaWV3LkdPTkUpOwotICAgICAgICAgICAgbVN1YnRpdGxlVmlldy5zZXRWaXNpYmlsaXR5KHNob3dTdWJ0aXRsZSA/IFZpZXcuVklTSUJMRSA6IFZpZXcuR09ORSk7Ci0KLSAgICAgICAgICAgIGlmIChtU3RhdGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNQbGF5aW5nID0gbVN0YXRlLmdldFN0YXRlKCkgPT0gUGxheWJhY2tTdGF0ZUNvbXBhdC5TVEFURV9CVUZGRVJJTkcKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1TdGF0ZS5nZXRTdGF0ZSgpID09IFBsYXliYWNrU3RhdGVDb21wYXQuU1RBVEVfUExBWUlORzsKLSAgICAgICAgICAgICAgICBDb250ZXh0IHBsYXliYWNrQ29udHJvbEJ1dHRvbkNvbnRleHQgPSBtUGxheWJhY2tDb250cm9sQnV0dG9uLmdldENvbnRleHQoKTsKLSAgICAgICAgICAgICAgICBib29sZWFuIHZpc2libGUgPSB0cnVlOwotICAgICAgICAgICAgICAgIGludCBpY29uRHJhd2FibGVBdHRyID0gMDsKLSAgICAgICAgICAgICAgICBpbnQgaWNvbkRlc2NSZXNJZCA9IDA7Ci0gICAgICAgICAgICAgICAgaWYgKGlzUGxheWluZyAmJiBpc1BhdXNlQWN0aW9uU3VwcG9ydGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWNvbkRyYXdhYmxlQXR0ciA9IFIuYXR0ci5tZWRpYVJvdXRlUGF1c2VEcmF3YWJsZTsKLSAgICAgICAgICAgICAgICAgICAgaWNvbkRlc2NSZXNJZCA9IFIuc3RyaW5nLm1yX2NvbnRyb2xsZXJfcGF1c2U7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpc1BsYXlpbmcgJiYgaXNTdG9wQWN0aW9uU3VwcG9ydGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWNvbkRyYXdhYmxlQXR0ciA9IFIuYXR0ci5tZWRpYVJvdXRlU3RvcERyYXdhYmxlOwotICAgICAgICAgICAgICAgICAgICBpY29uRGVzY1Jlc0lkID0gUi5zdHJpbmcubXJfY29udHJvbGxlcl9zdG9wOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWlzUGxheWluZyAmJiBpc1BsYXlBY3Rpb25TdXBwb3J0ZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBpY29uRHJhd2FibGVBdHRyID0gUi5hdHRyLm1lZGlhUm91dGVQbGF5RHJhd2FibGU7Ci0gICAgICAgICAgICAgICAgICAgIGljb25EZXNjUmVzSWQgPSBSLnN0cmluZy5tcl9jb250cm9sbGVyX3BsYXk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdmlzaWJsZSA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtUGxheWJhY2tDb250cm9sQnV0dG9uLnNldFZpc2liaWxpdHkodmlzaWJsZSA/IFZpZXcuVklTSUJMRSA6IFZpZXcuR09ORSk7Ci0gICAgICAgICAgICAgICAgaWYgKHZpc2libGUpIHsKLSAgICAgICAgICAgICAgICAgICAgbVBsYXliYWNrQ29udHJvbEJ1dHRvbi5zZXRJbWFnZVJlc291cmNlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVyVGhlbWVIZWxwZXIuZ2V0VGhlbWVSZXNvdXJjZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXliYWNrQ29udHJvbEJ1dHRvbkNvbnRleHQsIGljb25EcmF3YWJsZUF0dHIpKTsKLSAgICAgICAgICAgICAgICAgICAgbVBsYXliYWNrQ29udHJvbEJ1dHRvbi5zZXRDb250ZW50RGVzY3JpcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWJhY2tDb250cm9sQnV0dG9uQ29udGV4dC5nZXRSZXNvdXJjZXMoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFRleHQoaWNvbkRlc2NSZXNJZCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc1BsYXlBY3Rpb25TdXBwb3J0ZWQoKSB7Ci0gICAgICAgIHJldHVybiAobVN0YXRlLmdldEFjdGlvbnMoKSAmIChBQ1RJT05fUExBWSB8IEFDVElPTl9QTEFZX1BBVVNFKSkgIT0gMDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNQYXVzZUFjdGlvblN1cHBvcnRlZCgpIHsKLSAgICAgICAgcmV0dXJuIChtU3RhdGUuZ2V0QWN0aW9ucygpICYgKEFDVElPTl9QQVVTRSB8IEFDVElPTl9QTEFZX1BBVVNFKSkgIT0gMDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNTdG9wQWN0aW9uU3VwcG9ydGVkKCkgewotICAgICAgICByZXR1cm4gKG1TdGF0ZS5nZXRBY3Rpb25zKCkgJiBBQ1RJT05fU1RPUCkgIT0gMDsKLSAgICB9Ci0KLSAgICBib29sZWFuIGlzVm9sdW1lQ29udHJvbEF2YWlsYWJsZShNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgcmV0dXJuIG1Wb2x1bWVDb250cm9sRW5hYmxlZCAmJiByb3V0ZS5nZXRWb2x1bWVIYW5kbGluZygpCi0gICAgICAgICAgICAgICAgPT0gTWVkaWFSb3V0ZXIuUm91dGVJbmZvLlBMQVlCQUNLX1ZPTFVNRV9WQVJJQUJMRTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgZ2V0TGF5b3V0SGVpZ2h0KFZpZXcgdmlldykgewotICAgICAgICByZXR1cm4gdmlldy5nZXRMYXlvdXRQYXJhbXMoKS5oZWlnaHQ7Ci0gICAgfQotCi0gICAgc3RhdGljIHZvaWQgc2V0TGF5b3V0SGVpZ2h0KFZpZXcgdmlldywgaW50IGhlaWdodCkgewotICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zIGxwID0gdmlldy5nZXRMYXlvdXRQYXJhbXMoKTsKLSAgICAgICAgbHAuaGVpZ2h0ID0gaGVpZ2h0OwotICAgICAgICB2aWV3LnNldExheW91dFBhcmFtcyhscCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiB1cmlFcXVhbHMoVXJpIHVyaTEsIFVyaSB1cmkyKSB7Ci0gICAgICAgIGlmICh1cmkxICE9IG51bGwgJiYgdXJpMS5lcXVhbHModXJpMikpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9IGVsc2UgaWYgKHVyaTEgPT0gbnVsbCAmJiB1cmkyID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGRlc2lyZWQgYXJ0IGhlaWdodCB0byBmaXQgaW50byBjb250cm9sbGVyIGRpYWxvZy4KLSAgICAgKi8KLSAgICBpbnQgZ2V0RGVzaXJlZEFydEhlaWdodChpbnQgb3JpZ2luYWxXaWR0aCwgaW50IG9yaWdpbmFsSGVpZ2h0KSB7Ci0gICAgICAgIGlmIChvcmlnaW5hbFdpZHRoID49IG9yaWdpbmFsSGVpZ2h0KSB7Ci0gICAgICAgICAgICAvLyBGb3IgbGFuZHNjYXBlIGFydCwgZml0IHdpZHRoIHRvIGRpYWxvZyB3aWR0aC4KLSAgICAgICAgICAgIHJldHVybiAoaW50KSAoKGZsb2F0KSBtRGlhbG9nQ29udGVudFdpZHRoICogb3JpZ2luYWxIZWlnaHQgLyBvcmlnaW5hbFdpZHRoICsgMC41Zik7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gRm9yIHBvcnRyYWl0IGFydCwgZml0IGhlaWdodCB0byAxNjo5IHJhdGlvIGNhc2UncyBoZWlnaHQuCi0gICAgICAgIHJldHVybiAoaW50KSAoKGZsb2F0KSBtRGlhbG9nQ29udGVudFdpZHRoICogOSAvIDE2ICsgMC41Zik7Ci0gICAgfQotCi0gICAgdm9pZCB1cGRhdGVBcnRJY29uSWZOZWVkZWQoKSB7Ci0gICAgICAgIGlmIChtQ3VzdG9tQ29udHJvbFZpZXcgIT0gbnVsbCB8fCAhaXNJY29uQ2hhbmdlZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1GZXRjaEFydFRhc2sgIT0gbnVsbCkgewotICAgICAgICAgICAgbUZldGNoQXJ0VGFzay5jYW5jZWwodHJ1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgbUZldGNoQXJ0VGFzayA9IG5ldyBGZXRjaEFydFRhc2soKTsKLSAgICAgICAgbUZldGNoQXJ0VGFzay5leGVjdXRlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2xlYXIgdGhlIGJpdG1hcCBsb2FkZWQgYnkgRmV0Y2hBcnRUYXNrLiBXaWxsIGJlIGNhbGxlZCBhZnRlciB0aGUgbG9hZGVkIGJpdG1hcHMgYXJlIGFwcGxpZWQKLSAgICAgKiB0byBhcnR3b3JrLCBvciBubyBsb25nZXIgdmFsaWQuCi0gICAgICovCi0gICAgdm9pZCBjbGVhckxvYWRlZEJpdG1hcCgpIHsKLSAgICAgICAgbUFydEljb25Jc0xvYWRlZCA9IGZhbHNlOwotICAgICAgICBtQXJ0SWNvbkxvYWRlZEJpdG1hcCA9IG51bGw7Ci0gICAgICAgIG1BcnRJY29uQmFja2dyb3VuZENvbG9yID0gMDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgYSBuZXcgYXJ0IGltYWdlIGlzIGRpZmZlcmVudCBmcm9tIGFuIG9yaWdpbmFsIGFydCBpbWFnZS4gQ29tcGFyZXMKLSAgICAgKiBCaXRtYXAgb2JqZWN0cyBmaXJzdCwgYW5kIHRoZW4gY29tcGFyZXMgVVJJcyBvbmx5IGlmIGJpdG1hcCBpcyB1bmNoYW5nZWQgd2l0aAotICAgICAqIGEgbnVsbCB2YWx1ZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNJY29uQ2hhbmdlZCgpIHsKLSAgICAgICAgQml0bWFwIG5ld0JpdG1hcCA9IG1EZXNjcmlwdGlvbiA9PSBudWxsID8gbnVsbCA6IG1EZXNjcmlwdGlvbi5nZXRJY29uQml0bWFwKCk7Ci0gICAgICAgIFVyaSBuZXdVcmkgPSBtRGVzY3JpcHRpb24gPT0gbnVsbCA/IG51bGwgOiBtRGVzY3JpcHRpb24uZ2V0SWNvblVyaSgpOwotICAgICAgICBCaXRtYXAgb2xkQml0bWFwID0gbUZldGNoQXJ0VGFzayA9PSBudWxsID8gbUFydEljb25CaXRtYXAgOiBtRmV0Y2hBcnRUYXNrLmdldEljb25CaXRtYXAoKTsKLSAgICAgICAgVXJpIG9sZFVyaSA9IG1GZXRjaEFydFRhc2sgPT0gbnVsbCA/IG1BcnRJY29uVXJpIDogbUZldGNoQXJ0VGFzay5nZXRJY29uVXJpKCk7Ci0gICAgICAgIGlmIChvbGRCaXRtYXAgIT0gbmV3Qml0bWFwKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIGlmIChvbGRCaXRtYXAgPT0gbnVsbCAmJiAhdXJpRXF1YWxzKG9sZFVyaSwgbmV3VXJpKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgY2xhc3MgTWVkaWFSb3V0ZXJDYWxsYmFjayBleHRlbmRzIE1lZGlhUm91dGVyLkNhbGxiYWNrIHsKLSAgICAgICAgTWVkaWFSb3V0ZXJDYWxsYmFjaygpIHsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlVW5zZWxlY3RlZChNZWRpYVJvdXRlciByb3V0ZXIsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICAgICAgdXBkYXRlKGZhbHNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlQ2hhbmdlZChNZWRpYVJvdXRlciByb3V0ZXIsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICAgICAgdXBkYXRlKHRydWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVWb2x1bWVDaGFuZ2VkKE1lZGlhUm91dGVyIHJvdXRlciwgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgICAgICBTZWVrQmFyIHZvbHVtZVNsaWRlciA9IG1Wb2x1bWVTbGlkZXJNYXAuZ2V0KHJvdXRlKTsKLSAgICAgICAgICAgIGludCB2b2x1bWUgPSByb3V0ZS5nZXRWb2x1bWUoKTsKLSAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIm9uUm91dGVWb2x1bWVDaGFuZ2VkKCksIHJvdXRlLmdldFZvbHVtZToiICsgdm9sdW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh2b2x1bWVTbGlkZXIgIT0gbnVsbCAmJiBtUm91dGVJblZvbHVtZVNsaWRlclRvdWNoZWQgIT0gcm91dGUpIHsKLSAgICAgICAgICAgICAgICB2b2x1bWVTbGlkZXIuc2V0UHJvZ3Jlc3Modm9sdW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgY2xhc3MgTWVkaWFDb250cm9sbGVyQ2FsbGJhY2sgZXh0ZW5kcyBNZWRpYUNvbnRyb2xsZXJDb21wYXQuQ2FsbGJhY2sgewotICAgICAgICBNZWRpYUNvbnRyb2xsZXJDYWxsYmFjaygpIHsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblNlc3Npb25EZXN0cm95ZWQoKSB7Ci0gICAgICAgICAgICBpZiAobU1lZGlhQ29udHJvbGxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbU1lZGlhQ29udHJvbGxlci51bnJlZ2lzdGVyQ2FsbGJhY2sobUNvbnRyb2xsZXJDYWxsYmFjayk7Ci0gICAgICAgICAgICAgICAgbU1lZGlhQ29udHJvbGxlciA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25QbGF5YmFja1N0YXRlQ2hhbmdlZChQbGF5YmFja1N0YXRlQ29tcGF0IHN0YXRlKSB7Ci0gICAgICAgICAgICBtU3RhdGUgPSBzdGF0ZTsKLSAgICAgICAgICAgIHVwZGF0ZShmYWxzZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25NZXRhZGF0YUNoYW5nZWQoTWVkaWFNZXRhZGF0YUNvbXBhdCBtZXRhZGF0YSkgewotICAgICAgICAgICAgbURlc2NyaXB0aW9uID0gbWV0YWRhdGEgPT0gbnVsbCA/IG51bGwgOiBtZXRhZGF0YS5nZXREZXNjcmlwdGlvbigpOwotICAgICAgICAgICAgdXBkYXRlQXJ0SWNvbklmTmVlZGVkKCk7Ci0gICAgICAgICAgICB1cGRhdGUoZmFsc2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBDbGlja0xpc3RlbmVyIGltcGxlbWVudHMgVmlldy5PbkNsaWNrTGlzdGVuZXIgewotICAgICAgICBDbGlja0xpc3RlbmVyKCkgewotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7Ci0gICAgICAgICAgICBpbnQgaWQgPSB2LmdldElkKCk7Ci0gICAgICAgICAgICBpZiAoaWQgPT0gQlVUVE9OX1NUT1BfUkVTX0lEIHx8IGlkID09IEJVVFRPTl9ESVNDT05ORUNUX1JFU19JRCkgewotICAgICAgICAgICAgICAgIGlmIChtUm91dGUuaXNTZWxlY3RlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Sb3V0ZXIudW5zZWxlY3QoaWQgPT0gQlVUVE9OX1NUT1BfUkVTX0lEID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlci5VTlNFTEVDVF9SRUFTT05fU1RPUFBFRCA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXIuVU5TRUxFQ1RfUkVBU09OX0RJU0NPTk5FQ1RFRCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGRpc21pc3MoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoaWQgPT0gUi5pZC5tcl9jb250cm9sX3BsYXliYWNrX2N0cmwpIHsKLSAgICAgICAgICAgICAgICBpZiAobU1lZGlhQ29udHJvbGxlciAhPSBudWxsICYmIG1TdGF0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNQbGF5aW5nID0gbVN0YXRlLmdldFN0YXRlKCkgPT0gUGxheWJhY2tTdGF0ZUNvbXBhdC5TVEFURV9QTEFZSU5HOwotICAgICAgICAgICAgICAgICAgICBpbnQgYWN0aW9uRGVzY1Jlc0lkID0gMDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzUGxheWluZyAmJiBpc1BhdXNlQWN0aW9uU3VwcG9ydGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NZWRpYUNvbnRyb2xsZXIuZ2V0VHJhbnNwb3J0Q29udHJvbHMoKS5wYXVzZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uRGVzY1Jlc0lkID0gUi5zdHJpbmcubXJfY29udHJvbGxlcl9wYXVzZTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpc1BsYXlpbmcgJiYgaXNTdG9wQWN0aW9uU3VwcG9ydGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NZWRpYUNvbnRyb2xsZXIuZ2V0VHJhbnNwb3J0Q29udHJvbHMoKS5zdG9wKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25EZXNjUmVzSWQgPSBSLnN0cmluZy5tcl9jb250cm9sbGVyX3N0b3A7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWlzUGxheWluZyAmJiBpc1BsYXlBY3Rpb25TdXBwb3J0ZWQoKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtTWVkaWFDb250cm9sbGVyLmdldFRyYW5zcG9ydENvbnRyb2xzKCkucGxheSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uRGVzY1Jlc0lkID0gUi5zdHJpbmcubXJfY29udHJvbGxlcl9wbGF5OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIEFubm91bmNlIHRoZSBhY3Rpb24gZm9yIGFjY2Vzc2liaWxpdHkuCi0gICAgICAgICAgICAgICAgICAgIGlmIChtQWNjZXNzaWJpbGl0eU1hbmFnZXIgIT0gbnVsbCAmJiBtQWNjZXNzaWJpbGl0eU1hbmFnZXIuaXNFbmFibGVkKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBhY3Rpb25EZXNjUmVzSWQgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgQWNjZXNzaWJpbGl0eUV2ZW50IGV2ZW50ID0gQWNjZXNzaWJpbGl0eUV2ZW50Lm9idGFpbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWNjZXNzaWJpbGl0eUV2ZW50Q29tcGF0LlRZUEVfQU5OT1VOQ0VNRU5UKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LnNldFBhY2thZ2VOYW1lKG1Db250ZXh0LmdldFBhY2thZ2VOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuc2V0Q2xhc3NOYW1lKGdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LmdldFRleHQoKS5hZGQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwaUhlbHBlci5nZXRMaWJSZXNvdXJjZXMobUNvbnRleHQpLmdldFN0cmluZyhhY3Rpb25EZXNjUmVzSWQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1BY2Nlc3NpYmlsaXR5TWFuYWdlci5zZW5kQWNjZXNzaWJpbGl0eUV2ZW50KGV2ZW50KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoaWQgPT0gUi5pZC5tcl9jbG9zZSkgewotICAgICAgICAgICAgICAgIGRpc21pc3MoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgVm9sdW1lQ2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cyBTZWVrQmFyLk9uU2Vla0JhckNoYW5nZUxpc3RlbmVyIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBSdW5uYWJsZSBtU3RvcFRyYWNraW5nVG91Y2ggPSBuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICBpZiAobVJvdXRlSW5Wb2x1bWVTbGlkZXJUb3VjaGVkICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbVJvdXRlSW5Wb2x1bWVTbGlkZXJUb3VjaGVkID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1IYXNQZW5kaW5nVXBkYXRlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGUobVBlbmRpbmdVcGRhdGVBbmltYXRpb25OZWVkZWQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9OwotCi0gICAgICAgIFZvbHVtZUNoYW5nZUxpc3RlbmVyKCkgewotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU3RhcnRUcmFja2luZ1RvdWNoKFNlZWtCYXIgc2Vla0JhcikgewotICAgICAgICAgICAgaWYgKG1Sb3V0ZUluVm9sdW1lU2xpZGVyVG91Y2hlZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVZvbHVtZVNsaWRlci5yZW1vdmVDYWxsYmFja3MobVN0b3BUcmFja2luZ1RvdWNoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1Sb3V0ZUluVm9sdW1lU2xpZGVyVG91Y2hlZCA9IChNZWRpYVJvdXRlci5Sb3V0ZUluZm8pIHNlZWtCYXIuZ2V0VGFnKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25TdG9wVHJhY2tpbmdUb3VjaChTZWVrQmFyIHNlZWtCYXIpIHsKLSAgICAgICAgICAgIC8vIERlZmVyIHJlc2V0dGluZyBtVm9sdW1lU2xpZGVyVG91Y2hlZCB0byBhbGxvdyB0aGUgbWVkaWEgcm91dGUgcHJvdmlkZXIKLSAgICAgICAgICAgIC8vIGEgbGl0dGxlIHRpbWUgdG8gc2V0dGxlIGludG8gaXRzIG5ldyBzdGF0ZSBhbmQgcHVibGlzaCB0aGUgZmluYWwKLSAgICAgICAgICAgIC8vIHZvbHVtZSB1cGRhdGUuCi0gICAgICAgICAgICBtVm9sdW1lU2xpZGVyLnBvc3REZWxheWVkKG1TdG9wVHJhY2tpbmdUb3VjaCwgVk9MVU1FX1VQREFURV9ERUxBWV9NSUxMSVMpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUHJvZ3Jlc3NDaGFuZ2VkKFNlZWtCYXIgc2Vla0JhciwgaW50IHByb2dyZXNzLCBib29sZWFuIGZyb21Vc2VyKSB7Ci0gICAgICAgICAgICBpZiAoZnJvbVVzZXIpIHsKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUgPSAoTWVkaWFSb3V0ZXIuUm91dGVJbmZvKSBzZWVrQmFyLmdldFRhZygpOwotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJvblByb2dyZXNzQ2hhbmdlZCgpOiBjYWxsaW5nICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJNZWRpYVJvdXRlci5Sb3V0ZUluZm8ucmVxdWVzdFNldFZvbHVtZSgiICsgcHJvZ3Jlc3MgKyAiKSIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByb3V0ZS5yZXF1ZXN0U2V0Vm9sdW1lKHByb2dyZXNzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgVm9sdW1lR3JvdXBBZGFwdGVyIGV4dGVuZHMgQXJyYXlBZGFwdGVyPE1lZGlhUm91dGVyLlJvdXRlSW5mbz4gewotICAgICAgICBmaW5hbCBmbG9hdCBtRGlzYWJsZWRBbHBoYTsKLQotICAgICAgICBwdWJsaWMgVm9sdW1lR3JvdXBBZGFwdGVyKENvbnRleHQgY29udGV4dCwgTGlzdDxNZWRpYVJvdXRlci5Sb3V0ZUluZm8+IG9iamVjdHMpIHsKLSAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIDAsIG9iamVjdHMpOwotICAgICAgICAgICAgbURpc2FibGVkQWxwaGEgPSBNZWRpYVJvdXRlclRoZW1lSGVscGVyLmdldERpc2FibGVkQWxwaGEoY29udGV4dCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKGludCBwb3NpdGlvbikgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBWaWV3IGdldFZpZXcoZmluYWwgaW50IHBvc2l0aW9uLCBWaWV3IGNvbnZlcnRWaWV3LCBWaWV3R3JvdXAgcGFyZW50KSB7Ci0gICAgICAgICAgICBWaWV3IHYgPSBjb252ZXJ0VmlldzsKLSAgICAgICAgICAgIGlmICh2ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB2ID0gTGF5b3V0SW5mbGF0ZXIuZnJvbShwYXJlbnQuZ2V0Q29udGV4dCgpKS5pbmZsYXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgUi5sYXlvdXQubXJfY29udHJvbGxlcl92b2x1bWVfaXRlbSwgcGFyZW50LCBmYWxzZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHVwZGF0ZVZvbHVtZUdyb3VwSXRlbUhlaWdodCh2KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlID0gZ2V0SXRlbShwb3NpdGlvbik7Ci0gICAgICAgICAgICBpZiAocm91dGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNFbmFibGVkID0gcm91dGUuaXNFbmFibGVkKCk7Ci0KLSAgICAgICAgICAgICAgICBUZXh0VmlldyByb3V0ZU5hbWUgPSAoVGV4dFZpZXcpIHYuZmluZFZpZXdCeUlkKFIuaWQubXJfbmFtZSk7Ci0gICAgICAgICAgICAgICAgcm91dGVOYW1lLnNldEVuYWJsZWQoaXNFbmFibGVkKTsKLSAgICAgICAgICAgICAgICByb3V0ZU5hbWUuc2V0VGV4dChyb3V0ZS5nZXROYW1lKCkpOwotCi0gICAgICAgICAgICAgICAgTWVkaWFSb3V0ZVZvbHVtZVNsaWRlciB2b2x1bWVTbGlkZXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgKE1lZGlhUm91dGVWb2x1bWVTbGlkZXIpIHYuZmluZFZpZXdCeUlkKFIuaWQubXJfdm9sdW1lX3NsaWRlcik7Ci0gICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJUaGVtZUhlbHBlci5zZXRWb2x1bWVTbGlkZXJDb2xvcigKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudC5nZXRDb250ZXh0KCksIHZvbHVtZVNsaWRlciwgbVZvbHVtZUdyb3VwTGlzdCk7Ci0gICAgICAgICAgICAgICAgdm9sdW1lU2xpZGVyLnNldFRhZyhyb3V0ZSk7Ci0gICAgICAgICAgICAgICAgbVZvbHVtZVNsaWRlck1hcC5wdXQocm91dGUsIHZvbHVtZVNsaWRlcik7Ci0gICAgICAgICAgICAgICAgdm9sdW1lU2xpZGVyLnNldEhpZGVUaHVtYighaXNFbmFibGVkKTsKLSAgICAgICAgICAgICAgICB2b2x1bWVTbGlkZXIuc2V0RW5hYmxlZChpc0VuYWJsZWQpOwotICAgICAgICAgICAgICAgIGlmIChpc0VuYWJsZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzVm9sdW1lQ29udHJvbEF2YWlsYWJsZShyb3V0ZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZVNsaWRlci5zZXRNYXgocm91dGUuZ2V0Vm9sdW1lTWF4KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lU2xpZGVyLnNldFByb2dyZXNzKHJvdXRlLmdldFZvbHVtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZVNsaWRlci5zZXRPblNlZWtCYXJDaGFuZ2VMaXN0ZW5lcihtVm9sdW1lQ2hhbmdlTGlzdGVuZXIpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lU2xpZGVyLnNldE1heCgxMDApOwotICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lU2xpZGVyLnNldFByb2dyZXNzKDEwMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWVTbGlkZXIuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBJbWFnZVZpZXcgdm9sdW1lSXRlbUljb24gPQotICAgICAgICAgICAgICAgICAgICAgICAgKEltYWdlVmlldykgdi5maW5kVmlld0J5SWQoUi5pZC5tcl92b2x1bWVfaXRlbV9pY29uKTsKLSAgICAgICAgICAgICAgICB2b2x1bWVJdGVtSWNvbi5zZXRBbHBoYShpc0VuYWJsZWQgPyAweEZGIDogKGludCkgKDB4RkYgKiBtRGlzYWJsZWRBbHBoYSkpOwotCi0gICAgICAgICAgICAgICAgLy8gSWYgb3ZlcmxheSBiaXRtYXAgZXhpc3RzLCByZWFsIHZpZXcgc2hvdWxkIHJlbWFpbiBoaWRkZW4gdW50aWwKLSAgICAgICAgICAgICAgICAvLyB0aGUgYW5pbWF0aW9uIGVuZHMuCi0gICAgICAgICAgICAgICAgTGluZWFyTGF5b3V0IGNvbnRhaW5lciA9IChMaW5lYXJMYXlvdXQpIHYuZmluZFZpZXdCeUlkKFIuaWQudm9sdW1lX2l0ZW1fY29udGFpbmVyKTsKLSAgICAgICAgICAgICAgICBjb250YWluZXIuc2V0VmlzaWJpbGl0eShtR3JvdXBNZW1iZXJSb3V0ZXNBbmltYXRpbmdXaXRoQml0bWFwLmNvbnRhaW5zKHJvdXRlKQotICAgICAgICAgICAgICAgICAgICAgICAgPyBWaWV3LklOVklTSUJMRSA6IFZpZXcuVklTSUJMRSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBSb3V0ZXMgd2hpY2ggYXJlIGJlaW5nIGFkZGVkIHdpbGwgYmUgaW52aXNpYmxlIHVudGlsIGFuaW1hdGlvbiBlbmRzLgotICAgICAgICAgICAgICAgIGlmIChtR3JvdXBNZW1iZXJSb3V0ZXNBZGRlZCAhPSBudWxsICYmIG1Hcm91cE1lbWJlclJvdXRlc0FkZGVkLmNvbnRhaW5zKHJvdXRlKSkgewotICAgICAgICAgICAgICAgICAgICBBbmltYXRpb24gYWxwaGFBbmltID0gbmV3IEFscGhhQW5pbWF0aW9uKDAuMGYsIDAuMGYpOwotICAgICAgICAgICAgICAgICAgICBhbHBoYUFuaW0uc2V0RHVyYXRpb24oMCk7Ci0gICAgICAgICAgICAgICAgICAgIGFscGhhQW5pbS5zZXRGaWxsRW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgYWxwaGFBbmltLnNldEZpbGxBZnRlcih0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgdi5jbGVhckFuaW1hdGlvbigpOwotICAgICAgICAgICAgICAgICAgICB2LnN0YXJ0QW5pbWF0aW9uKGFscGhhQW5pbSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHY7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIEZldGNoQXJ0VGFzayBleHRlbmRzIEFzeW5jVGFzazxWb2lkLCBWb2lkLCBCaXRtYXA+IHsKLSAgICAgICAgLy8gU2hvdyBhbmltYXRpb24gb25seSB3aGVuIGZldGNoaW5nIHRha2VzIGEgbG9uZyB0aW1lLgotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFNIT1dfQU5JTV9USU1FX1RIUkVTSE9MRF9NSUxMSVMgPSAxMjBMOwotCi0gICAgICAgIHByaXZhdGUgZmluYWwgQml0bWFwIG1JY29uQml0bWFwOwotICAgICAgICBwcml2YXRlIGZpbmFsIFVyaSBtSWNvblVyaTsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbUJhY2tncm91bmRDb2xvcjsKLSAgICAgICAgcHJpdmF0ZSBsb25nIG1TdGFydFRpbWVNaWxsaXM7Ci0KLSAgICAgICAgRmV0Y2hBcnRUYXNrKCkgewotICAgICAgICAgICAgQml0bWFwIGJpdG1hcCA9IG1EZXNjcmlwdGlvbiA9PSBudWxsID8gbnVsbCA6IG1EZXNjcmlwdGlvbi5nZXRJY29uQml0bWFwKCk7Ci0gICAgICAgICAgICBpZiAoaXNCaXRtYXBSZWN5Y2xlZChiaXRtYXApKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2FuJ3QgZmV0Y2ggdGhlIGdpdmVuIGFydCBiaXRtYXAgYmVjYXVzZSBpdCdzIGFscmVhZHkgcmVjeWNsZWQuIik7Ci0gICAgICAgICAgICAgICAgYml0bWFwID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1JY29uQml0bWFwID0gYml0bWFwOwotICAgICAgICAgICAgbUljb25VcmkgPSBtRGVzY3JpcHRpb24gPT0gbnVsbCA/IG51bGwgOiBtRGVzY3JpcHRpb24uZ2V0SWNvblVyaSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEJpdG1hcCBnZXRJY29uQml0bWFwKCkgewotICAgICAgICAgICAgcmV0dXJuIG1JY29uQml0bWFwOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFVyaSBnZXRJY29uVXJpKCkgewotICAgICAgICAgICAgcmV0dXJuIG1JY29uVXJpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIG9uUHJlRXhlY3V0ZSgpIHsKLSAgICAgICAgICAgIG1TdGFydFRpbWVNaWxsaXMgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgIGNsZWFyTG9hZGVkQml0bWFwKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIEJpdG1hcCBkb0luQmFja2dyb3VuZChWb2lkLi4uIGFyZykgewotICAgICAgICAgICAgQml0bWFwIGFydCA9IG51bGw7Ci0gICAgICAgICAgICBpZiAobUljb25CaXRtYXAgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGFydCA9IG1JY29uQml0bWFwOwotICAgICAgICAgICAgfSBlbHNlIGlmIChtSWNvblVyaSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gc3RyZWFtID0gbnVsbDsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBpZiAoKHN0cmVhbSA9IG9wZW5JbnB1dFN0cmVhbUJ5U2NoZW1lKG1JY29uVXJpKSkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiVW5hYmxlIHRvIG9wZW46ICIgKyBtSWNvblVyaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBRdWVyeSBhcnQgc2l6ZS4KLSAgICAgICAgICAgICAgICAgICAgQml0bWFwRmFjdG9yeS5PcHRpb25zIG9wdGlvbnMgPSBuZXcgQml0bWFwRmFjdG9yeS5PcHRpb25zKCk7Ci0gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuaW5KdXN0RGVjb2RlQm91bmRzID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgQml0bWFwRmFjdG9yeS5kZWNvZGVTdHJlYW0oc3RyZWFtLCBudWxsLCBvcHRpb25zKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMub3V0V2lkdGggPT0gMCB8fCBvcHRpb25zLm91dEhlaWdodCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBSZXdpbmQgdGhlIHN0cmVhbSBpbiBvcmRlciB0byByZXN0YXJ0IGFydCBkZWNvZGluZy4KLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5yZXNldCgpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBGYWlsZWQgdG8gcmV3aW5kIHRoZSBzdHJlYW0sIHRyeSB0byByZW9wZW4gaXQuCi0gICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoc3RyZWFtID0gb3BlbklucHV0U3RyZWFtQnlTY2hlbWUobUljb25VcmkpKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiVW5hYmxlIHRvIG9wZW46ICIgKyBtSWNvblVyaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIHJlcXVpcmVkIHNpemUgdG8gZGVjb2RlIHRoZSBhcnQgYW5kIHBvc3NpYmx5IHJlc2l6ZSBpdC4KLSAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5pbkp1c3REZWNvZGVCb3VuZHMgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgaW50IHJlcUhlaWdodCA9IGdldERlc2lyZWRBcnRIZWlnaHQob3B0aW9ucy5vdXRXaWR0aCwgb3B0aW9ucy5vdXRIZWlnaHQpOwotICAgICAgICAgICAgICAgICAgICBpbnQgcmF0aW8gPSBvcHRpb25zLm91dEhlaWdodCAvIHJlcUhlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5pblNhbXBsZVNpemUgPSBNYXRoLm1heCgxLCBJbnRlZ2VyLmhpZ2hlc3RPbmVCaXQocmF0aW8pKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzQ2FuY2VsbGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGFydCA9IEJpdG1hcEZhY3RvcnkuZGVjb2RlU3RyZWFtKHN0cmVhbSwgbnVsbCwgb3B0aW9ucyk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSl7Ci0gICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIlVuYWJsZSB0byBvcGVuOiAiICsgbUljb25VcmksIGUpOwotICAgICAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzdHJlYW0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChpc0JpdG1hcFJlY3ljbGVkKGFydCkpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW4ndCB1c2UgcmVjeWNsZWQgYml0bWFwOiAiICsgYXJ0KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChhcnQgIT0gbnVsbCAmJiBhcnQuZ2V0V2lkdGgoKSA8IGFydC5nZXRIZWlnaHQoKSkgewotICAgICAgICAgICAgICAgIC8vIFBvcnRyYWl0IGFydCByZXF1aXJlcyBkb21pbmFudCBjb2xvciBhcyBiYWNrZ3JvdW5kIGNvbG9yLgotICAgICAgICAgICAgICAgIFBhbGV0dGUgcGFsZXR0ZSA9IG5ldyBQYWxldHRlLkJ1aWxkZXIoYXJ0KS5tYXhpbXVtQ29sb3JDb3VudCgxKS5nZW5lcmF0ZSgpOwotICAgICAgICAgICAgICAgIG1CYWNrZ3JvdW5kQ29sb3IgPSBwYWxldHRlLmdldFN3YXRjaGVzKCkuaXNFbXB0eSgpCi0gICAgICAgICAgICAgICAgICAgICAgICA/IDAgOiBwYWxldHRlLmdldFN3YXRjaGVzKCkuZ2V0KDApLmdldFJnYigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGFydDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvblBvc3RFeGVjdXRlKEJpdG1hcCBhcnQpIHsKLSAgICAgICAgICAgIG1GZXRjaEFydFRhc2sgPSBudWxsOwotICAgICAgICAgICAgaWYgKCFPYmplY3RzQ29tcGF0LmVxdWFscyhtQXJ0SWNvbkJpdG1hcCwgbUljb25CaXRtYXApCi0gICAgICAgICAgICAgICAgICAgIHx8ICFPYmplY3RzQ29tcGF0LmVxdWFscyhtQXJ0SWNvblVyaSwgbUljb25VcmkpKSB7Ci0gICAgICAgICAgICAgICAgbUFydEljb25CaXRtYXAgPSBtSWNvbkJpdG1hcDsKLSAgICAgICAgICAgICAgICBtQXJ0SWNvbkxvYWRlZEJpdG1hcCA9IGFydDsKLSAgICAgICAgICAgICAgICBtQXJ0SWNvblVyaSA9IG1JY29uVXJpOwotICAgICAgICAgICAgICAgIG1BcnRJY29uQmFja2dyb3VuZENvbG9yID0gbUJhY2tncm91bmRDb2xvcjsKLSAgICAgICAgICAgICAgICBtQXJ0SWNvbklzTG9hZGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBsb25nIGVsYXBzZWRUaW1lTWlsbGlzID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCkgLSBtU3RhcnRUaW1lTWlsbGlzOwotICAgICAgICAgICAgICAgIC8vIExvYWRlZCBiaXRtYXAgd2lsbCBiZSBhcHBsaWVkIG9uIHRoZSBuZXh0IHVwZGF0ZQotICAgICAgICAgICAgICAgIHVwZGF0ZShlbGFwc2VkVGltZU1pbGxpcyA+IFNIT1dfQU5JTV9USU1FX1RIUkVTSE9MRF9NSUxMSVMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBJbnB1dFN0cmVhbSBvcGVuSW5wdXRTdHJlYW1CeVNjaGVtZShVcmkgdXJpKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgU3RyaW5nIHNjaGVtZSA9IHVyaS5nZXRTY2hlbWUoKS50b0xvd2VyQ2FzZSgpOwotICAgICAgICAgICAgSW5wdXRTdHJlYW0gc3RyZWFtID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChDb250ZW50UmVzb2x2ZXIuU0NIRU1FX0FORFJPSURfUkVTT1VSQ0UuZXF1YWxzKHNjaGVtZSkKLSAgICAgICAgICAgICAgICAgICAgfHwgQ29udGVudFJlc29sdmVyLlNDSEVNRV9DT05URU5ULmVxdWFscyhzY2hlbWUpCi0gICAgICAgICAgICAgICAgICAgIHx8IENvbnRlbnRSZXNvbHZlci5TQ0hFTUVfRklMRS5lcXVhbHMoc2NoZW1lKSkgewotICAgICAgICAgICAgICAgIHN0cmVhbSA9IG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLm9wZW5JbnB1dFN0cmVhbSh1cmkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBVUkwgdXJsID0gbmV3IFVSTCh1cmkudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgVVJMQ29ubmVjdGlvbiBjb25uID0gdXJsLm9wZW5Db25uZWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgY29ubi5zZXRDb25uZWN0VGltZW91dChDT05ORUNUSU9OX1RJTUVPVVRfTUlMTElTKTsKLSAgICAgICAgICAgICAgICBjb25uLnNldFJlYWRUaW1lb3V0KENPTk5FQ1RJT05fVElNRU9VVF9NSUxMSVMpOwotICAgICAgICAgICAgICAgIHN0cmVhbSA9IGNvbm4uZ2V0SW5wdXRTdHJlYW0oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiAoc3RyZWFtID09IG51bGwpID8gbnVsbCA6IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKHN0cmVhbSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVDb250cm9sbGVyRGlhbG9nRnJhZ21lbnQuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZUNvbnRyb2xsZXJEaWFsb2dGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTVkNzRmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZUNvbnRyb2xsZXJEaWFsb2dGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLmFwcDsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLkRpYWxvZzsKLWltcG9ydCBhbmRyb2lkLmFwcC5EaWFsb2dGcmFnbWVudDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci0KLS8qKgotICogTWVkaWEgcm91dGUgY29udHJvbGxlciBkaWFsb2cgZnJhZ21lbnQuCi0gKiA8cD4KLSAqIENyZWF0ZXMgYSB7QGxpbmsgTWVkaWFSb3V0ZUNvbnRyb2xsZXJEaWFsb2d9LiAgVGhlIGFwcGxpY2F0aW9uIG1heSBzdWJjbGFzcwotICogdGhpcyBkaWFsb2cgZnJhZ21lbnQgdG8gY3VzdG9taXplIHRoZSBtZWRpYSByb3V0ZSBjb250cm9sbGVyIGRpYWxvZy4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIE1lZGlhUm91dGVDb250cm9sbGVyRGlhbG9nRnJhZ21lbnQgZXh0ZW5kcyBEaWFsb2dGcmFnbWVudCB7Ci0gICAgcHJpdmF0ZSBNZWRpYVJvdXRlQ29udHJvbGxlckRpYWxvZyBtRGlhbG9nOwotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBtZWRpYSByb3V0ZSBjb250cm9sbGVyIGRpYWxvZyBmcmFnbWVudC4KLSAgICAgKiA8cD4KLSAgICAgKiBBbGwgc3ViY2xhc3NlcyBvZiB0aGlzIGNsYXNzIG11c3QgYWxzbyBwb3NzZXNzIGEgZGVmYXVsdCBjb25zdHJ1Y3Rvci4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIE1lZGlhUm91dGVDb250cm9sbGVyRGlhbG9nRnJhZ21lbnQoKSB7Ci0gICAgICAgIHNldENhbmNlbGFibGUodHJ1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIHdoZW4gdGhlIGNvbnRyb2xsZXIgZGlhbG9nIGlzIGJlaW5nIGNyZWF0ZWQuCi0gICAgICogPHA+Ci0gICAgICogU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gY3VzdG9taXplIHRoZSBkaWFsb2cuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBNZWRpYVJvdXRlQ29udHJvbGxlckRpYWxvZyBvbkNyZWF0ZUNvbnRyb2xsZXJEaWFsb2coCi0gICAgICAgICAgICBDb250ZXh0IGNvbnRleHQsIEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBNZWRpYVJvdXRlQ29udHJvbGxlckRpYWxvZyhjb250ZXh0KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgRGlhbG9nIG9uQ3JlYXRlRGlhbG9nKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKLSAgICAgICAgbURpYWxvZyA9IG9uQ3JlYXRlQ29udHJvbGxlckRpYWxvZyhnZXRDb250ZXh0KCksIHNhdmVkSW5zdGFuY2VTdGF0ZSk7Ci0gICAgICAgIHJldHVybiBtRGlhbG9nOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uU3RvcCgpIHsKLSAgICAgICAgc3VwZXIub25TdG9wKCk7Ci0gICAgICAgIGlmIChtRGlhbG9nICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1EaWFsb2cuY2xlYXJHcm91cExpc3RBbmltYXRpb24oZmFsc2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25Db25maWd1cmF0aW9uQ2hhbmdlZChDb25maWd1cmF0aW9uIG5ld0NvbmZpZykgewotICAgICAgICBzdXBlci5vbkNvbmZpZ3VyYXRpb25DaGFuZ2VkKG5ld0NvbmZpZyk7Ci0gICAgICAgIGlmIChtRGlhbG9nICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1EaWFsb2cudXBkYXRlTGF5b3V0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVEaWFsb2dGYWN0b3J5LmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVEaWFsb2dGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5ZWFmMzkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlRGlhbG9nRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLmFwcDsKLQotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLk5vbk51bGw7Ci0KLS8qKgotICogVGhlIG1lZGlhIHJvdXRlIGRpYWxvZyBmYWN0b3J5IGlzIHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyB0aGUgbWVkaWEgcm91dGUKLSAqIGNob29zZXIgYW5kIGNvbnRyb2xsZXIgZGlhbG9ncyBhcyBuZWVkZWQuCi0gKiA8cD4KLSAqIFRoZSBhcHBsaWNhdGlvbiBjYW4gY3VzdG9taXplIHRoZSBkaWFsb2dzIGJ5IHByb3ZpZGluZyBhIHN1YmNsYXNzIG9mIHRoZQotICogZGlhbG9nIGZhY3RvcnkgdG8gdGhlIHtAbGluayBNZWRpYVJvdXRlQnV0dG9ufSB1c2luZyB0aGUKLSAqIHtAbGluayBNZWRpYVJvdXRlQnV0dG9uI3NldERpYWxvZ0ZhY3Rvcnkgc2V0RGlhbG9nRmFjdG9yeX0gbWV0aG9kLgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgTWVkaWFSb3V0ZURpYWxvZ0ZhY3RvcnkgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1lZGlhUm91dGVEaWFsb2dGYWN0b3J5IHNEZWZhdWx0ID0gbmV3IE1lZGlhUm91dGVEaWFsb2dGYWN0b3J5KCk7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgZGVmYXVsdCBtZWRpYSByb3V0ZSBkaWFsb2cgZmFjdG9yeS4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWVkaWFSb3V0ZURpYWxvZ0ZhY3RvcnkoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgZGVmYXVsdCBmYWN0b3J5IGluc3RhbmNlLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgZGVmYXVsdCBtZWRpYSByb3V0ZSBkaWFsb2cgZmFjdG9yeSwgbmV2ZXIgbnVsbC4KLSAgICAgKi8KLSAgICBATm9uTnVsbAotICAgIHB1YmxpYyBzdGF0aWMgTWVkaWFSb3V0ZURpYWxvZ0ZhY3RvcnkgZ2V0RGVmYXVsdCgpIHsKLSAgICAgICAgcmV0dXJuIHNEZWZhdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxlZCB3aGVuIHRoZSBjaG9vc2VyIGRpYWxvZyBpcyBiZWluZyBvcGVuZWQgYW5kIGl0IGlzIHRpbWUgdG8gY3JlYXRlIHRoZSBmcmFnbWVudC4KLSAgICAgKiA8cD4KLSAgICAgKiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBjcmVhdGUgYSBjdXN0b21pemVkIGZyYWdtZW50LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIG1lZGlhIHJvdXRlIGNob29zZXIgZGlhbG9nIGZyYWdtZW50LCBtdXN0IG5vdCBiZSBudWxsLgotICAgICAqLwotICAgIEBOb25OdWxsCi0gICAgcHVibGljIE1lZGlhUm91dGVDaG9vc2VyRGlhbG9nRnJhZ21lbnQgb25DcmVhdGVDaG9vc2VyRGlhbG9nRnJhZ21lbnQoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTWVkaWFSb3V0ZUNob29zZXJEaWFsb2dGcmFnbWVudCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxlZCB3aGVuIHRoZSBjb250cm9sbGVyIGRpYWxvZyBpcyBiZWluZyBvcGVuZWQgYW5kIGl0IGlzIHRpbWUgdG8gY3JlYXRlIHRoZSBmcmFnbWVudC4KLSAgICAgKiA8cD4KLSAgICAgKiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBjcmVhdGUgYSBjdXN0b21pemVkIGZyYWdtZW50LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIG1lZGlhIHJvdXRlIGNvbnRyb2xsZXIgZGlhbG9nIGZyYWdtZW50LCBtdXN0IG5vdCBiZSBudWxsLgotICAgICAqLwotICAgIEBOb25OdWxsCi0gICAgcHVibGljIE1lZGlhUm91dGVDb250cm9sbGVyRGlhbG9nRnJhZ21lbnQgb25DcmVhdGVDb250cm9sbGVyRGlhbG9nRnJhZ21lbnQoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTWVkaWFSb3V0ZUNvbnRyb2xsZXJEaWFsb2dGcmFnbWVudCgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZURpYWxvZ0hlbHBlci5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlRGlhbG9nSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhYWJmN2IuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlRGlhbG9nSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLmFwcDsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkJpdG1hcERyYXdhYmxlOwotaW1wb3J0IGFuZHJvaWQudXRpbC5EaXNwbGF5TWV0cmljczsKLWltcG9ydCBhbmRyb2lkLnV0aWwuVHlwZWRWYWx1ZTsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFycmF5QWRhcHRlcjsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0VmlldzsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLnVwZGF0ZS5BcGlIZWxwZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEudXBkYXRlLlI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1maW5hbCBjbGFzcyBNZWRpYVJvdXRlRGlhbG9nSGVscGVyIHsKLSAgICAvKioKLSAgICAgKiBUaGUgZnJhbWV3b3JrIHNob3VsZCBzZXQgdGhlIGRpYWxvZyB3aWR0aCBwcm9wZXJseSwgYnV0IHNvbWVob3cgaXQgZG9lc24ndCB3b3JrLCBoZW5jZQotICAgICAqIGR1cGxpY2F0aW5nIGEgc2ltaWxhciBsb2dpYyBoZXJlIHRvIGRldGVybWluZSB0aGUgYXBwcm9wcmlhdGUgZGlhbG9nIHdpZHRoLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldERpYWxvZ1dpZHRoKENvbnRleHQgY29udGV4dCkgewotICAgICAgICBEaXNwbGF5TWV0cmljcyBtZXRyaWNzID0gQXBpSGVscGVyLmdldExpYlJlc291cmNlcyhjb250ZXh0KS5nZXREaXNwbGF5TWV0cmljcygpOwotICAgICAgICBib29sZWFuIGlzUG9ydHJhaXQgPSBtZXRyaWNzLndpZHRoUGl4ZWxzIDwgbWV0cmljcy5oZWlnaHRQaXhlbHM7Ci0KLSAgICAgICAgVHlwZWRWYWx1ZSB2YWx1ZSA9IG5ldyBUeXBlZFZhbHVlKCk7Ci0gICAgICAgIEFwaUhlbHBlci5nZXRMaWJSZXNvdXJjZXMoY29udGV4dCkuZ2V0VmFsdWUoaXNQb3J0cmFpdAotICAgICAgICAgICAgICAgID8gUi5kaW1lbi5tcl9kaWFsb2dfZml4ZWRfd2lkdGhfbWlub3IKLSAgICAgICAgICAgICAgICA6IFIuZGltZW4ubXJfZGlhbG9nX2ZpeGVkX3dpZHRoX21ham9yLCB2YWx1ZSwgdHJ1ZSk7Ci0gICAgICAgIGlmICh2YWx1ZS50eXBlID09IFR5cGVkVmFsdWUuVFlQRV9ESU1FTlNJT04pIHsKLSAgICAgICAgICAgIHJldHVybiAoaW50KSB2YWx1ZS5nZXREaW1lbnNpb24obWV0cmljcyk7Ci0gICAgICAgIH0gZWxzZSBpZiAodmFsdWUudHlwZSA9PSBUeXBlZFZhbHVlLlRZUEVfRlJBQ1RJT04pIHsKLSAgICAgICAgICAgIHJldHVybiAoaW50KSB2YWx1ZS5nZXRGcmFjdGlvbihtZXRyaWNzLndpZHRoUGl4ZWxzLCBtZXRyaWNzLndpZHRoUGl4ZWxzKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gVmlld0dyb3VwLkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29tcGFyZXMgdHdvIGxpc3RzIHJlZ2FyZGxlc3Mgb2Ygb3JkZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbGlzdDEgQSBsaXN0Ci0gICAgICogQHBhcmFtIGxpc3QyIEEgbGlzdCB0byBiZSBjb21wYXJlZCB3aXRoIHtAY29kZSBsaXN0MX0KLSAgICAgKiBAcmV0dXJuIFRydWUgaWYgdHdvIGxpc3RzIGhhdmUgZXhhY3RseSBzYW1lIGl0ZW1zIHJlZ2FyZGxlc3Mgb2Ygb3JkZXIsIGZhbHNlIG90aGVyd2lzZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIDxFPiBib29sZWFuIGxpc3RVbm9yZGVyZWRFcXVhbHMoTGlzdDxFPiBsaXN0MSwgTGlzdDxFPiBsaXN0MikgewotICAgICAgICBIYXNoU2V0PEU+IHNldDEgPSBuZXcgSGFzaFNldDw+KGxpc3QxKTsKLSAgICAgICAgSGFzaFNldDxFPiBzZXQyID0gbmV3IEhhc2hTZXQ8PihsaXN0Mik7Ci0gICAgICAgIHJldHVybiBzZXQxLmVxdWFscyhzZXQyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb21wYXJlcyB0d28gbGlzdHMgYW5kIHJldHVybnMgYSBzZXQgb2YgaXRlbXMgd2hpY2ggZXhpc3QKLSAgICAgKiBhZnRlci1saXN0IGJ1dCBiZWZvcmUtbGlzdCwgd2hpY2ggbWVhbnMgbmV3bHkgYWRkZWQgaXRlbXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYmVmb3JlIEEgbGlzdAotICAgICAqIEBwYXJhbSBhZnRlciBBIGxpc3QgdG8gYmUgY29tcGFyZWQgd2l0aCB7QGNvZGUgYmVmb3JlfQotICAgICAqIEByZXR1cm4gQSBzZXQgb2YgaXRlbXMgd2hpY2ggY29udGFpbnMgbmV3bHkgYWRkZWQgaXRlbXMgd2hpbGUKLSAgICAgKiBjb21wYXJpbmcge0Bjb2RlIGFmdGVyfSB0byB7QGNvZGUgYmVmb3JlfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIDxFPiBTZXQ8RT4gZ2V0SXRlbXNBZGRlZChMaXN0PEU+IGJlZm9yZSwgTGlzdDxFPiBhZnRlcikgewotICAgICAgICBIYXNoU2V0PEU+IHNldCA9IG5ldyBIYXNoU2V0PD4oYWZ0ZXIpOwotICAgICAgICBzZXQucmVtb3ZlQWxsKGJlZm9yZSk7Ci0gICAgICAgIHJldHVybiBzZXQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29tcGFyZXMgdHdvIGxpc3RzIGFuZCByZXR1cm5zIGEgc2V0IG9mIGl0ZW1zIHdoaWNoIGV4aXN0Ci0gICAgICogYmVmb3JlLWxpc3QgYnV0IGFmdGVyLWxpc3QsIHdoaWNoIG1lYW5zIHJlbW92ZWQgaXRlbXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYmVmb3JlIEEgbGlzdAotICAgICAqIEBwYXJhbSBhZnRlciBBIGxpc3QgdG8gYmUgY29tcGFyZWQgd2l0aCB7QGNvZGUgYmVmb3JlfQotICAgICAqIEByZXR1cm4gQSBzZXQgb2YgaXRlbXMgd2hpY2ggY29udGFpbnMgcmVtb3ZlZCBpdGVtcyB3aGlsZQotICAgICAqIGNvbXBhcmluZyB7QGNvZGUgYWZ0ZXJ9IHRvIHtAY29kZSBiZWZvcmV9LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgPEU+IFNldDxFPiBnZXRJdGVtc1JlbW92ZWQoTGlzdDxFPiBiZWZvcmUsIExpc3Q8RT4gYWZ0ZXIpIHsKLSAgICAgICAgSGFzaFNldDxFPiBzZXQgPSBuZXcgSGFzaFNldDw+KGJlZm9yZSk7Ci0gICAgICAgIHNldC5yZW1vdmVBbGwoYWZ0ZXIpOwotICAgICAgICByZXR1cm4gc2V0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdlbmVyYXRlcyBhbiBpdGVtLVJlY3QgbWFwIHdoaWNoIGluZGljYXRlcyB3aGVyZSBtZW1iZXIKLSAgICAgKiBpdGVtcyBhcmUgbG9jYXRlZCBpbiB0aGUgZ2l2ZW4gTGlzdFZpZXcuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbGlzdFZpZXcgQSBsaXN0IHZpZXcKLSAgICAgKiBAcGFyYW0gYWRhcHRlciBBbiBhcnJheSBhZGFwdGVyIHdoaWNoIGNvbnRhaW5zIGFuIGFycmF5IG9mIGl0ZW1zLgotICAgICAqIEByZXR1cm4gQSBtYXAgb2YgaXRlbXMgYW5kIGJvdW5kcyBvZiB0aGVpciB2aWV3cyBsb2NhdGVkIGluIHRoZSBnaXZlbiBsaXN0IHZpZXcuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyA8RT4gSGFzaE1hcDxFLCBSZWN0PiBnZXRJdGVtQm91bmRNYXAoTGlzdFZpZXcgbGlzdFZpZXcsCi0gICAgICAgICAgICBBcnJheUFkYXB0ZXI8RT4gYWRhcHRlcikgewotICAgICAgICBIYXNoTWFwPEUsIFJlY3Q+IGl0ZW1Cb3VuZE1hcCA9IG5ldyBIYXNoTWFwPD4oKTsKLSAgICAgICAgaW50IGZpcnN0VmlzaWJsZVBvc2l0aW9uID0gbGlzdFZpZXcuZ2V0Rmlyc3RWaXNpYmxlUG9zaXRpb24oKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0Vmlldy5nZXRDaGlsZENvdW50KCk7ICsraSkgewotICAgICAgICAgICAgaW50IHBvc2l0aW9uID0gZmlyc3RWaXNpYmxlUG9zaXRpb24gKyBpOwotICAgICAgICAgICAgRSBpdGVtID0gYWRhcHRlci5nZXRJdGVtKHBvc2l0aW9uKTsKLSAgICAgICAgICAgIFZpZXcgdmlldyA9IGxpc3RWaWV3LmdldENoaWxkQXQoaSk7Ci0gICAgICAgICAgICBpdGVtQm91bmRNYXAucHV0KGl0ZW0sCi0gICAgICAgICAgICAgICAgICAgIG5ldyBSZWN0KHZpZXcuZ2V0TGVmdCgpLCB2aWV3LmdldFRvcCgpLCB2aWV3LmdldFJpZ2h0KCksIHZpZXcuZ2V0Qm90dG9tKCkpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXRlbUJvdW5kTWFwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdlbmVyYXRlcyBhbiBpdGVtLUJpdG1hcERyYXdhYmxlIG1hcCB3aGljaCBzdG9yZXMgc25hcHNob3RzCi0gICAgICogb2YgbWVtYmVyIGl0ZW1zIGluIHRoZSBnaXZlbiBMaXN0Vmlldy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb250ZXh0IEEgY29udGV4dAotICAgICAqIEBwYXJhbSBsaXN0VmlldyBBIGxpc3QgdmlldwotICAgICAqIEBwYXJhbSBhZGFwdGVyIEFuIGFycmF5IGFkYXB0ZXIgd2hpY2ggY29udGFpbnMgYW4gYXJyYXkgb2YgaXRlbXMuCi0gICAgICogQHJldHVybiBBIG1hcCBvZiBpdGVtcyBhbmQgc25hcHNob3RzIG9mIHRoZWlyIHZpZXdzIGluIHRoZSBnaXZlbiBsaXN0IHZpZXcuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyA8RT4gSGFzaE1hcDxFLCBCaXRtYXBEcmF3YWJsZT4gZ2V0SXRlbUJpdG1hcE1hcChDb250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgICBMaXN0VmlldyBsaXN0VmlldywgQXJyYXlBZGFwdGVyPEU+IGFkYXB0ZXIpIHsKLSAgICAgICAgSGFzaE1hcDxFLCBCaXRtYXBEcmF3YWJsZT4gaXRlbUJpdG1hcE1hcCA9IG5ldyBIYXNoTWFwPD4oKTsKLSAgICAgICAgaW50IGZpcnN0VmlzaWJsZVBvc2l0aW9uID0gbGlzdFZpZXcuZ2V0Rmlyc3RWaXNpYmxlUG9zaXRpb24oKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0Vmlldy5nZXRDaGlsZENvdW50KCk7ICsraSkgewotICAgICAgICAgICAgaW50IHBvc2l0aW9uID0gZmlyc3RWaXNpYmxlUG9zaXRpb24gKyBpOwotICAgICAgICAgICAgRSBpdGVtID0gYWRhcHRlci5nZXRJdGVtKHBvc2l0aW9uKTsKLSAgICAgICAgICAgIFZpZXcgdmlldyA9IGxpc3RWaWV3LmdldENoaWxkQXQoaSk7Ci0gICAgICAgICAgICBpdGVtQml0bWFwTWFwLnB1dChpdGVtLCBnZXRWaWV3Qml0bWFwKGNvbnRleHQsIHZpZXcpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXRlbUJpdG1hcE1hcDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBCaXRtYXBEcmF3YWJsZSBnZXRWaWV3Qml0bWFwKENvbnRleHQgY29udGV4dCwgVmlldyB2aWV3KSB7Ci0gICAgICAgIEJpdG1hcCBiaXRtYXAgPSBCaXRtYXAuY3JlYXRlQml0bWFwKHZpZXcuZ2V0V2lkdGgoKSwgdmlldy5nZXRIZWlnaHQoKSwKLSAgICAgICAgICAgICAgICBCaXRtYXAuQ29uZmlnLkFSR0JfODg4OCk7Ci0gICAgICAgIENhbnZhcyBjYW52YXMgPSBuZXcgQ2FudmFzKGJpdG1hcCk7Ci0gICAgICAgIHZpZXcuZHJhdyhjYW52YXMpOwotICAgICAgICByZXR1cm4gbmV3IEJpdG1hcERyYXdhYmxlKGNvbnRleHQuZ2V0UmVzb3VyY2VzKCksIGJpdG1hcCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlRGlzY292ZXJ5RnJhZ21lbnQuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZURpc2NvdmVyeUZyYWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyZWUxMTguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlRGlzY292ZXJ5RnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIuYXBwOwotCi1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY0LmFwcC5GcmFnbWVudDsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlU2VsZWN0b3I7Ci0KLS8qKgotICogTWVkaWEgcm91dGUgZGlzY292ZXJ5IGZyYWdtZW50LgotICogPHA+Ci0gKiBUaGlzIGZyYWdtZW50IHRha2VzIGNhcmUgb2YgcmVnaXN0ZXJpbmcgYSBjYWxsYmFjayBmb3IgbWVkaWEgcm91dGUgZGlzY292ZXJ5Ci0gKiBkdXJpbmcgdGhlIHtAbGluayBGcmFnbWVudCNvblN0YXJ0IG9uU3RhcnQoKX0gcGhhc2UKLSAqIGFuZCByZW1vdmluZyBpdCBkdXJpbmcgdGhlIHtAbGluayBGcmFnbWVudCNvblN0b3Agb25TdG9wKCl9IHBoYXNlLgotICogPC9wPjxwPgotICogVGhlIGFwcGxpY2F0aW9uIG11c3Qgc3VwcGx5IGEgcm91dGUgc2VsZWN0b3IgdG8gc3BlY2lmeSB0aGUga2luZHMgb2Ygcm91dGVzCi0gKiB0byBkaXNjb3Zlci4gIFRoZSBhcHBsaWNhdGlvbiBtYXkgYWxzbyBvdmVycmlkZSB7QGxpbmsgI29uQ3JlYXRlQ2FsbGJhY2t9IHRvCi0gKiBwcm92aWRlIHRoZSB7QGxpbmsgTWVkaWFSb3V0ZXJ9IGNhbGxiYWNrIHRvIHJlZ2lzdGVyLgotICogPC9wPjxwPgotICogTm90ZSB0aGF0IHRoZSBkaXNjb3ZlcnkgY2FsbGJhY2sgbWFrZXMgdGhlIGFwcGxpY2F0aW9uIGJlIGNvbm5lY3RlZCB3aXRoIGFsbCB0aGUKLSAqIHtAbGluayBhbmRyb2lkLnN1cHBvcnQudjcubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyU2VydmljZSBtZWRpYSByb3V0ZSBwcm92aWRlciBzZXJ2aWNlc30KLSAqIHdoaWxlIGl0IGlzIHJlZ2lzdGVyZWQuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBNZWRpYVJvdXRlRGlzY292ZXJ5RnJhZ21lbnQgZXh0ZW5kcyBGcmFnbWVudCB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgQVJHVU1FTlRfU0VMRUNUT1IgPSAic2VsZWN0b3IiOwotCi0gICAgcHJpdmF0ZSBNZWRpYVJvdXRlciBtUm91dGVyOwotICAgIHByaXZhdGUgTWVkaWFSb3V0ZVNlbGVjdG9yIG1TZWxlY3RvcjsKLSAgICBwcml2YXRlIE1lZGlhUm91dGVyLkNhbGxiYWNrIG1DYWxsYmFjazsKLQotICAgIHB1YmxpYyBNZWRpYVJvdXRlRGlzY292ZXJ5RnJhZ21lbnQoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbWVkaWEgcm91dGVyIGluc3RhbmNlLgotICAgICAqLwotICAgIHB1YmxpYyBNZWRpYVJvdXRlciBnZXRNZWRpYVJvdXRlcigpIHsKLSAgICAgICAgZW5zdXJlUm91dGVyKCk7Ci0gICAgICAgIHJldHVybiBtUm91dGVyOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBlbnN1cmVSb3V0ZXIoKSB7Ci0gICAgICAgIGlmIChtUm91dGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIG1Sb3V0ZXIgPSBNZWRpYVJvdXRlci5nZXRJbnN0YW5jZShnZXRDb250ZXh0KCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbWVkaWEgcm91dGUgc2VsZWN0b3IgZm9yIGZpbHRlcmluZyB0aGUgcm91dGVzIHRvIGJlIGRpc2NvdmVyZWQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBzZWxlY3RvciwgbmV2ZXIgbnVsbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWVkaWFSb3V0ZVNlbGVjdG9yIGdldFJvdXRlU2VsZWN0b3IoKSB7Ci0gICAgICAgIGVuc3VyZVJvdXRlU2VsZWN0b3IoKTsKLSAgICAgICAgcmV0dXJuIG1TZWxlY3RvcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBtZWRpYSByb3V0ZSBzZWxlY3RvciBmb3IgZmlsdGVyaW5nIHRoZSByb3V0ZXMgdG8gYmUgZGlzY292ZXJlZC4KLSAgICAgKiBUaGlzIG1ldGhvZCBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgdGhlIGZyYWdtZW50IGlzIGFkZGVkLgotICAgICAqCi0gICAgICogQHBhcmFtIHNlbGVjdG9yIFRoZSBzZWxlY3RvciB0byBzZXQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Um91dGVTZWxlY3RvcihNZWRpYVJvdXRlU2VsZWN0b3Igc2VsZWN0b3IpIHsKLSAgICAgICAgaWYgKHNlbGVjdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInNlbGVjdG9yIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGVuc3VyZVJvdXRlU2VsZWN0b3IoKTsKLSAgICAgICAgaWYgKCFtU2VsZWN0b3IuZXF1YWxzKHNlbGVjdG9yKSkgewotICAgICAgICAgICAgbVNlbGVjdG9yID0gc2VsZWN0b3I7Ci0KLSAgICAgICAgICAgIEJ1bmRsZSBhcmdzID0gZ2V0QXJndW1lbnRzKCk7Ci0gICAgICAgICAgICBpZiAoYXJncyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYXJncyA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFyZ3MucHV0QnVuZGxlKEFSR1VNRU5UX1NFTEVDVE9SLCBzZWxlY3Rvci5hc0J1bmRsZSgpKTsKLSAgICAgICAgICAgIHNldEFyZ3VtZW50cyhhcmdzKTsKLQotICAgICAgICAgICAgaWYgKG1DYWxsYmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVJvdXRlci5yZW1vdmVDYWxsYmFjayhtQ2FsbGJhY2spOwotICAgICAgICAgICAgICAgIG1Sb3V0ZXIuYWRkQ2FsbGJhY2sobVNlbGVjdG9yLCBtQ2FsbGJhY2ssIG9uUHJlcGFyZUNhbGxiYWNrRmxhZ3MoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZW5zdXJlUm91dGVTZWxlY3RvcigpIHsKLSAgICAgICAgaWYgKG1TZWxlY3RvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBCdW5kbGUgYXJncyA9IGdldEFyZ3VtZW50cygpOwotICAgICAgICAgICAgaWYgKGFyZ3MgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1TZWxlY3RvciA9IE1lZGlhUm91dGVTZWxlY3Rvci5mcm9tQnVuZGxlKGFyZ3MuZ2V0QnVuZGxlKEFSR1VNRU5UX1NFTEVDVE9SKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobVNlbGVjdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtU2VsZWN0b3IgPSBNZWRpYVJvdXRlU2VsZWN0b3IuRU1QVFk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgdG8gY3JlYXRlIHRoZSB7QGxpbmsgYW5kcm9pZC5zdXBwb3J0LnY3Lm1lZGlhLk1lZGlhUm91dGVyLkNhbGxiYWNrIGNhbGxiYWNrfQotICAgICAqIHRoYXQgd2lsbCBiZSByZWdpc3RlcmVkLgotICAgICAqIDxwPgotICAgICAqIFRoZSBkZWZhdWx0IGNhbGxiYWNrIGRvZXMgbm90aGluZy4gIFRoZSBhcHBsaWNhdGlvbiBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8KLSAgICAgKiBzdXBwbHkgaXRzIG93biBjYWxsYmFjay4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBuZXcgY2FsbGJhY2ssIG9yIG51bGwgaWYgbm8gY2FsbGJhY2sgc2hvdWxkIGJlIHJlZ2lzdGVyZWQuCi0gICAgICovCi0gICAgcHVibGljIE1lZGlhUm91dGVyLkNhbGxiYWNrIG9uQ3JlYXRlQ2FsbGJhY2soKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTWVkaWFSb3V0ZXIuQ2FsbGJhY2soKSB7IH07Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIHRvIHByZXBhcmUgdGhlIGNhbGxiYWNrIGZsYWdzIHRoYXQgd2lsbCBiZSB1c2VkIHdoZW4gdGhlCi0gICAgICoge0BsaW5rIGFuZHJvaWQuc3VwcG9ydC52Ny5tZWRpYS5NZWRpYVJvdXRlci5DYWxsYmFjayBjYWxsYmFja30gaXMgcmVnaXN0ZXJlZC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIHtAbGluayBNZWRpYVJvdXRlciNDQUxMQkFDS19GTEFHX1JFUVVFU1RfRElTQ09WRVJZfS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBkZXNpcmVkIGNhbGxiYWNrIGZsYWdzLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgb25QcmVwYXJlQ2FsbGJhY2tGbGFncygpIHsKLSAgICAgICAgcmV0dXJuIE1lZGlhUm91dGVyLkNBTExCQUNLX0ZMQUdfUkVRVUVTVF9ESVNDT1ZFUlk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25TdGFydCgpIHsKLSAgICAgICAgc3VwZXIub25TdGFydCgpOwotCi0gICAgICAgIGVuc3VyZVJvdXRlU2VsZWN0b3IoKTsKLSAgICAgICAgZW5zdXJlUm91dGVyKCk7Ci0gICAgICAgIG1DYWxsYmFjayA9IG9uQ3JlYXRlQ2FsbGJhY2soKTsKLSAgICAgICAgaWYgKG1DYWxsYmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtUm91dGVyLmFkZENhbGxiYWNrKG1TZWxlY3RvciwgbUNhbGxiYWNrLCBvblByZXBhcmVDYWxsYmFja0ZsYWdzKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25TdG9wKCkgewotICAgICAgICBpZiAobUNhbGxiYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1Sb3V0ZXIucmVtb3ZlQ2FsbGJhY2sobUNhbGxiYWNrKTsKLSAgICAgICAgICAgIG1DYWxsYmFjayA9IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBzdXBlci5vblN0b3AoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVFeHBhbmRDb2xsYXBzZUJ1dHRvbi5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlRXhwYW5kQ29sbGFwc2VCdXR0b24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmEwYTk1YS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVFeHBhbmRDb2xsYXBzZUJ1dHRvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLmFwcDsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ29sb3JGaWx0ZXI7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZkNvbG9yRmlsdGVyOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuQW5pbWF0aW9uRHJhd2FibGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY0LmNvbnRlbnQuQ29udGV4dENvbXBhdDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkltYWdlQnV0dG9uOwotCi1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEudXBkYXRlLkFwaUhlbHBlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS51cGRhdGUuUjsKLQotLyoqCi0gKiBDaGV2cm9uL0NhcmV0IGJ1dHRvbiB0byBleHBhbmQvY29sbGFwc2UgZ3JvdXAgdm9sdW1lIGxpc3Qgd2l0aCBhbmltYXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBNZWRpYVJvdXRlRXhwYW5kQ29sbGFwc2VCdXR0b24gZXh0ZW5kcyBJbWFnZUJ1dHRvbiB7Ci0gICAgZmluYWwgQW5pbWF0aW9uRHJhd2FibGUgbUV4cGFuZEFuaW1hdGlvbkRyYXdhYmxlOwotICAgIGZpbmFsIEFuaW1hdGlvbkRyYXdhYmxlIG1Db2xsYXBzZUFuaW1hdGlvbkRyYXdhYmxlOwotICAgIGZpbmFsIFN0cmluZyBtRXhwYW5kR3JvdXBEZXNjcmlwdGlvbjsKLSAgICBmaW5hbCBTdHJpbmcgbUNvbGxhcHNlR3JvdXBEZXNjcmlwdGlvbjsKLSAgICBib29sZWFuIG1Jc0dyb3VwRXhwYW5kZWQ7Ci0gICAgT25DbGlja0xpc3RlbmVyIG1MaXN0ZW5lcjsKLQotICAgIHB1YmxpYyBNZWRpYVJvdXRlRXhwYW5kQ29sbGFwc2VCdXR0b24oQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIE1lZGlhUm91dGVFeHBhbmRDb2xsYXBzZUJ1dHRvbihDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgewotICAgICAgICB0aGlzKGNvbnRleHQsIGF0dHJzLCAwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWVkaWFSb3V0ZUV4cGFuZENvbGxhcHNlQnV0dG9uKENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGVBdHRyKSB7Ci0gICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzLCBkZWZTdHlsZUF0dHIpOwotICAgICAgICBtRXhwYW5kQW5pbWF0aW9uRHJhd2FibGUgPSAoQW5pbWF0aW9uRHJhd2FibGUpCi0gICAgICAgICAgICAgICAgQXBpSGVscGVyLmdldExpYlJlc291cmNlcyhjb250ZXh0KS5nZXREcmF3YWJsZShSLmRyYXdhYmxlLm1yX2dyb3VwX2V4cGFuZCk7Ci0gICAgICAgIG1Db2xsYXBzZUFuaW1hdGlvbkRyYXdhYmxlID0gKEFuaW1hdGlvbkRyYXdhYmxlKQotICAgICAgICAgICAgICAgIEFwaUhlbHBlci5nZXRMaWJSZXNvdXJjZXMoY29udGV4dCkuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5tcl9ncm91cF9jb2xsYXBzZSk7Ci0KLSAgICAgICAgQ29sb3JGaWx0ZXIgZmlsdGVyID0gbmV3IFBvcnRlckR1ZmZDb2xvckZpbHRlcigKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlclRoZW1lSGVscGVyLmdldENvbnRyb2xsZXJDb2xvcihjb250ZXh0LCBkZWZTdHlsZUF0dHIpLAotICAgICAgICAgICAgICAgIFBvcnRlckR1ZmYuTW9kZS5TUkNfSU4pOwotICAgICAgICBtRXhwYW5kQW5pbWF0aW9uRHJhd2FibGUuc2V0Q29sb3JGaWx0ZXIoZmlsdGVyKTsKLSAgICAgICAgbUNvbGxhcHNlQW5pbWF0aW9uRHJhd2FibGUuc2V0Q29sb3JGaWx0ZXIoZmlsdGVyKTsKLQotICAgICAgICBtRXhwYW5kR3JvdXBEZXNjcmlwdGlvbiA9Ci0gICAgICAgICAgICAgICAgQXBpSGVscGVyLmdldExpYlJlc291cmNlcyhjb250ZXh0KS5nZXRTdHJpbmcoUi5zdHJpbmcubXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXApOwotICAgICAgICBtQ29sbGFwc2VHcm91cERlc2NyaXB0aW9uID0KLSAgICAgICAgICAgICAgICBBcGlIZWxwZXIuZ2V0TGliUmVzb3VyY2VzKGNvbnRleHQpLmdldFN0cmluZyhSLnN0cmluZy5tcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwKTsKLQotICAgICAgICBzZXRJbWFnZURyYXdhYmxlKG1FeHBhbmRBbmltYXRpb25EcmF3YWJsZS5nZXRGcmFtZSgwKSk7Ci0gICAgICAgIHNldENvbnRlbnREZXNjcmlwdGlvbihtRXhwYW5kR3JvdXBEZXNjcmlwdGlvbik7Ci0KLSAgICAgICAgc3VwZXIuc2V0T25DbGlja0xpc3RlbmVyKG5ldyBPbkNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2aWV3KSB7Ci0gICAgICAgICAgICAgICAgbUlzR3JvdXBFeHBhbmRlZCA9ICFtSXNHcm91cEV4cGFuZGVkOwotICAgICAgICAgICAgICAgIGlmIChtSXNHcm91cEV4cGFuZGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldEltYWdlRHJhd2FibGUobUV4cGFuZEFuaW1hdGlvbkRyYXdhYmxlKTsKLSAgICAgICAgICAgICAgICAgICAgbUV4cGFuZEFuaW1hdGlvbkRyYXdhYmxlLnN0YXJ0KCk7Ci0gICAgICAgICAgICAgICAgICAgIHNldENvbnRlbnREZXNjcmlwdGlvbihtQ29sbGFwc2VHcm91cERlc2NyaXB0aW9uKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBzZXRJbWFnZURyYXdhYmxlKG1Db2xsYXBzZUFuaW1hdGlvbkRyYXdhYmxlKTsKLSAgICAgICAgICAgICAgICAgICAgbUNvbGxhcHNlQW5pbWF0aW9uRHJhd2FibGUuc3RhcnQoKTsKLSAgICAgICAgICAgICAgICAgICAgc2V0Q29udGVudERlc2NyaXB0aW9uKG1FeHBhbmRHcm91cERlc2NyaXB0aW9uKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1MaXN0ZW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1MaXN0ZW5lci5vbkNsaWNrKHZpZXcpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0T25DbGlja0xpc3RlbmVyKE9uQ2xpY2tMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICBtTGlzdGVuZXIgPSBsaXN0ZW5lcjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVWb2x1bWVTbGlkZXIuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZVZvbHVtZVNsaWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDVkMjBlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZVZvbHVtZVNsaWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5hcHA7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZjsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOwotaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5TZWVrQmFyOwotCi0vKioKLSAqIFZvbHVtZSBzbGlkZXIgd2l0aCBzaG93aW5nLCBoaWRpbmcsIGFuZCBhcHBseWluZyBhbHBoYSBzdXBwb3J0cyB0byB0aGUgdGh1bWIuCi0gKi8KLXB1YmxpYyBjbGFzcyBNZWRpYVJvdXRlVm9sdW1lU2xpZGVyIGV4dGVuZHMgU2Vla0JhciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNZWRpYVJvdXRlVm9sdW1lU2xpZGVyIjsKLQotICAgIHByaXZhdGUgZmluYWwgZmxvYXQgbURpc2FibGVkQWxwaGE7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gbUhpZGVUaHVtYjsKLSAgICBwcml2YXRlIERyYXdhYmxlIG1UaHVtYjsKLSAgICBwcml2YXRlIGludCBtQ29sb3I7Ci0KLSAgICBwdWJsaWMgTWVkaWFSb3V0ZVZvbHVtZVNsaWRlcihDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgdGhpcyhjb250ZXh0LCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWVkaWFSb3V0ZVZvbHVtZVNsaWRlcihDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgewotICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycyk7Ci0gICAgICAgIG1EaXNhYmxlZEFscGhhID0gTWVkaWFSb3V0ZXJUaGVtZUhlbHBlci5nZXREaXNhYmxlZEFscGhhKGNvbnRleHQpOwotICAgIH0KLQotICAgIHB1YmxpYyBNZWRpYVJvdXRlVm9sdW1lU2xpZGVyKENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGVBdHRyKSB7Ci0gICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzLCBkZWZTdHlsZUF0dHIpOwotICAgICAgICBtRGlzYWJsZWRBbHBoYSA9IE1lZGlhUm91dGVyVGhlbWVIZWxwZXIuZ2V0RGlzYWJsZWRBbHBoYShjb250ZXh0KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBkcmF3YWJsZVN0YXRlQ2hhbmdlZCgpIHsKLSAgICAgICAgc3VwZXIuZHJhd2FibGVTdGF0ZUNoYW5nZWQoKTsKLSAgICAgICAgaW50IGFscGhhID0gaXNFbmFibGVkKCkgPyAweEZGIDogKGludCkgKDB4RkYgKiBtRGlzYWJsZWRBbHBoYSk7Ci0KLSAgICAgICAgLy8gVGhlIHRodW1iIGRyYXdhYmxlIGlzIGEgY29sbGVjdGlvbiBvZiBkcmF3YWJsZXMgYW5kIGl0cyBjdXJyZW50IGRyYXdhYmxlcyBhcmUgY2hhbmdlZCBwZXIKLSAgICAgICAgLy8gc3RhdGUuIEFwcGx5IHRoZSBjb2xvciBmaWx0ZXIgYW5kIGFscGhhIG9uIGV2ZXJ5IHN0YXRlIGNoYW5nZS4KLSAgICAgICAgaWYgKG1UaHVtYiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtVGh1bWIuc2V0Q29sb3JGaWx0ZXIobUNvbG9yLCBQb3J0ZXJEdWZmLk1vZGUuU1JDX0lOKTsKLSAgICAgICAgICAgIG1UaHVtYi5zZXRBbHBoYShhbHBoYSk7Ci0gICAgICAgIH0KLQotICAgICAgICBnZXRQcm9ncmVzc0RyYXdhYmxlKCkuc2V0Q29sb3JGaWx0ZXIobUNvbG9yLCBQb3J0ZXJEdWZmLk1vZGUuU1JDX0lOKTsKLSAgICAgICAgZ2V0UHJvZ3Jlc3NEcmF3YWJsZSgpLnNldEFscGhhKGFscGhhKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRUaHVtYihEcmF3YWJsZSB0aHVtYikgewotICAgICAgICBtVGh1bWIgPSB0aHVtYjsKLSAgICAgICAgc3VwZXIuc2V0VGh1bWIobUhpZGVUaHVtYiA/IG51bGwgOiBtVGh1bWIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgd2hldGhlciB0byBzaG93IG9yIGhpZGUgdGh1bWIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SGlkZVRodW1iKGJvb2xlYW4gaGlkZVRodW1iKSB7Ci0gICAgICAgIGlmIChtSGlkZVRodW1iID09IGhpZGVUaHVtYikgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIG1IaWRlVGh1bWIgPSBoaWRlVGh1bWI7Ci0gICAgICAgIHN1cGVyLnNldFRodW1iKG1IaWRlVGh1bWIgPyBudWxsIDogbVRodW1iKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2b2x1bWUgc2xpZGVyIGNvbG9yLiBUaGUgY2hhbmdlIHRha2VzIGVmZmVjdCBuZXh0IHRpbWUgZHJhd2FibGUgc3RhdGUgaXMgY2hhbmdlZC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgY29sb3IgY2Fubm90IGJlIHRyYW5zbHVjZW50LCBvdGhlcndpc2UgdGhlIHVuZGVybHlpbmcgcHJvZ3Jlc3MgYmFyIHdpbGwgYmUgc2VlbiB0aHJvdWdoCi0gICAgICogdGhlIHRodW1iLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDb2xvcihpbnQgY29sb3IpIHsKLSAgICAgICAgaWYgKG1Db2xvciA9PSBjb2xvcikgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChDb2xvci5hbHBoYShjb2xvcikgIT0gMHhGRikgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAiVm9sdW1lIHNsaWRlciBjb2xvciBjYW5ub3QgYmUgdHJhbnNsdWNlbnQ6ICMiICsgSW50ZWdlci50b0hleFN0cmluZyhjb2xvcikpOwotICAgICAgICB9Ci0gICAgICAgIG1Db2xvciA9IGNvbG9yOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZXJUaGVtZUhlbHBlci5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlclRoZW1lSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzZjA0MmYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlclRoZW1lSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLmFwcDsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLkludERlZjsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQuZ3JhcGhpY3MuQ29sb3JVdGlsczsKLWltcG9ydCBhbmRyb2lkLnV0aWwuVHlwZWRWYWx1ZTsKLWltcG9ydCBhbmRyb2lkLnZpZXcuQ29udGV4dFRoZW1lV3JhcHBlcjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLnVwZGF0ZS5SOwotCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKLQotZmluYWwgY2xhc3MgTWVkaWFSb3V0ZXJUaGVtZUhlbHBlciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgTUlOX0NPTlRSQVNUID0gMy4wZjsKLQotICAgIEBJbnREZWYoe0NPTE9SX0RBUktfT05fTElHSFRfQkFDS0dST1VORCwgQ09MT1JfV0hJVEVfT05fREFSS19CQUNLR1JPVU5EfSkKLSAgICBAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5TT1VSQ0UpCi0gICAgcHJpdmF0ZSBAaW50ZXJmYWNlIENvbnRyb2xsZXJDb2xvclR5cGUge30KLQotICAgIHN0YXRpYyBmaW5hbCBpbnQgQ09MT1JfREFSS19PTl9MSUdIVF9CQUNLR1JPVU5EID0gMHhERTAwMDAwMDsgLyogT3BhY2l0eSBvZiA4NyUgKi8KLSAgICBzdGF0aWMgZmluYWwgaW50IENPTE9SX1dISVRFX09OX0RBUktfQkFDS0dST1VORCA9IENvbG9yLldISVRFOwotCi0gICAgcHJpdmF0ZSBNZWRpYVJvdXRlclRoZW1lSGVscGVyKCkgewotICAgIH0KLQotICAgIHN0YXRpYyBDb250ZXh0IGNyZWF0ZVRoZW1lZEJ1dHRvbkNvbnRleHQoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIC8vIEFwcGx5IGJhc2UgTWVkaWEgUm91dGVyIHRoZW1lLgotICAgICAgICBjb250ZXh0ID0gbmV3IENvbnRleHRUaGVtZVdyYXBwZXIoY29udGV4dCwgZ2V0Um91dGVyVGhlbWVJZChjb250ZXh0KSk7Ci0KLSAgICAgICAgLy8gQXBwbHkgY3VzdG9tIE1lZGlhIFJvdXRlciB0aGVtZS4KLSAgICAgICAgaW50IHN0eWxlID0gZ2V0VGhlbWVSZXNvdXJjZShjb250ZXh0LCBSLmF0dHIubWVkaWFSb3V0ZVRoZW1lKTsKLSAgICAgICAgaWYgKHN0eWxlICE9IDApIHsKLSAgICAgICAgICAgIGNvbnRleHQgPSBuZXcgQ29udGV4dFRoZW1lV3JhcHBlcihjb250ZXh0LCBzdHlsZSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gY29udGV4dDsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFRoZSBmb2xsb3dpbmcgdHdvIG1ldGhvZHMgYXJlIHRvIGJlIHVzZWQgaW4gY29uanVuY3Rpb24uIFRoZXkgc2hvdWxkIGJlIHVzZWQgdG8gcHJlcGFyZQotICAgICAqIHRoZSBjb250ZXh0IGFuZCB0aGVtZSBmb3IgYSBzdXBlciBjbGFzcyBjb25zdHJ1Y3RvciAodGhlIGxhdHRlciBtZXRob2QgcmVsaWVzIG9uIHRoZQotICAgICAqIGZvcm1lciBtZXRob2QgdG8gcHJvcGVybHkgcHJlcGFyZSB0aGUgY29udGV4dCk6Ci0gICAgICogICBzdXBlcihjb250ZXh0ID0gY3JlYXRlVGhlbWVkRGlhbG9nQ29udGV4dChjb250ZXh0LCB0aGVtZSksCi0gICAgICogICAgICAgICAgIGNyZWF0ZVRoZW1lZERpYWxvZ1N0eWxlKGNvbnRleHQpKTsKLSAgICAgKgotICAgICAqIEl0IHdpbGwgYXBwbHkgdGhlbWUgaW4gdGhlIGZvbGxvd2luZyBvcmRlciAoc3R5bGUgbG9va3VwcyB3aWxsIGJlIGRvbmUgaW4gcmV2ZXJzZSk6Ci0gICAgICogICAxKSBDdXJyZW50IHRoZW1lCi0gICAgICogICAyKSBTdXBwbGllZCB0aGVtZQotICAgICAqICAgMykgQmFzZSBNZWRpYSBSb3V0ZXIgdGhlbWUKLSAgICAgKiAgIDQpIEN1c3RvbSBNZWRpYSBSb3V0ZXIgdGhlbWUsIGlmIHByb3ZpZGVkCi0gICAgICovCi0gICAgc3RhdGljIENvbnRleHQgY3JlYXRlVGhlbWVkRGlhbG9nQ29udGV4dChDb250ZXh0IGNvbnRleHQsIGludCB0aGVtZSwgYm9vbGVhbiBhbGVydERpYWxvZykgewotICAgICAgICAvLyAxKSBDdXJyZW50IHRoZW1lIGlzIGFscmVhZHkgYXBwbGllZCB0byB0aGUgY29udGV4dAotCi0gICAgICAgIC8vIDIpIElmIG5vIHRoZW1lIGlzIHN1cHBsaWVkLCBsb29rIGl0IHVwIGZyb20gdGhlIGNvbnRleHQgKGRpYWxvZ1RoZW1lL2FsZXJ0RGlhbG9nVGhlbWUpCi0gICAgICAgIGlmICh0aGVtZSA9PSAwKSB7Ci0gICAgICAgICAgICB0aGVtZSA9IGdldFRoZW1lUmVzb3VyY2UoY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgIWFsZXJ0RGlhbG9nID8gYW5kcm9pZC5SLmF0dHIuZGlhbG9nVGhlbWUgOiBhbmRyb2lkLlIuYXR0ci5hbGVydERpYWxvZ1RoZW1lKTsKLSAgICAgICAgfQotICAgICAgICAvLyAgICBBcHBseSBpdAotICAgICAgICBjb250ZXh0ID0gbmV3IENvbnRleHRUaGVtZVdyYXBwZXIoY29udGV4dCwgdGhlbWUpOwotCi0gICAgICAgIC8vIDMpIElmIGEgY3VzdG9tIE1lZGlhIFJvdXRlciB0aGVtZSBpcyBwcm92aWRlZCB0aGVuIGFwcGx5IHRoZSBiYXNlIHRoZW1lCi0gICAgICAgIGlmIChnZXRUaGVtZVJlc291cmNlKGNvbnRleHQsIFIuYXR0ci5tZWRpYVJvdXRlVGhlbWUpICE9IDApIHsKLSAgICAgICAgICAgIGNvbnRleHQgPSBuZXcgQ29udGV4dFRoZW1lV3JhcHBlcihjb250ZXh0LCBnZXRSb3V0ZXJUaGVtZUlkKGNvbnRleHQpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBjb250ZXh0OwotICAgIH0KLSAgICAvLyBUaGlzIG1ldGhvZCBzaG91bGQgYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBwcmV2aW91cyBtZXRob2QuCi0gICAgc3RhdGljIGludCBjcmVhdGVUaGVtZWREaWFsb2dTdHlsZShDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgLy8gNCkgQXBwbHkgdGhlIGN1c3RvbSBNZWRpYSBSb3V0ZXIgdGhlbWUKLSAgICAgICAgaW50IHRoZW1lID0gZ2V0VGhlbWVSZXNvdXJjZShjb250ZXh0LCBSLmF0dHIubWVkaWFSb3V0ZVRoZW1lKTsKLSAgICAgICAgaWYgKHRoZW1lID09IDApIHsKLSAgICAgICAgICAgIC8vIDMpIE5vIGN1c3RvbSBNZWRpYVJvdXRlciB0aGVtZSB3YXMgcHJvdmlkZWQgc28gYXBwbHkgdGhlIGJhc2UgdGhlbWUgaW5zdGVhZAotICAgICAgICAgICAgdGhlbWUgPSBnZXRSb3V0ZXJUaGVtZUlkKGNvbnRleHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRoZW1lOwotICAgIH0KLSAgICAvLyBFTkQuIFByZXZpb3VzIHR3byBtZXRob2RzIHNob3VsZCBiZSB1c2VkIGluIGNvbmp1bmN0aW9uLgotCi0gICAgc3RhdGljIGludCBnZXRUaGVtZVJlc291cmNlKENvbnRleHQgY29udGV4dCwgaW50IGF0dHIpIHsKLSAgICAgICAgVHlwZWRWYWx1ZSB2YWx1ZSA9IG5ldyBUeXBlZFZhbHVlKCk7Ci0gICAgICAgIHJldHVybiBjb250ZXh0LmdldFRoZW1lKCkucmVzb2x2ZUF0dHJpYnV0ZShhdHRyLCB2YWx1ZSwgdHJ1ZSkgPyB2YWx1ZS5yZXNvdXJjZUlkIDogMDsKLSAgICB9Ci0KLSAgICBzdGF0aWMgZmxvYXQgZ2V0RGlzYWJsZWRBbHBoYShDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgVHlwZWRWYWx1ZSB2YWx1ZSA9IG5ldyBUeXBlZFZhbHVlKCk7Ci0gICAgICAgIHJldHVybiBjb250ZXh0LmdldFRoZW1lKCkucmVzb2x2ZUF0dHJpYnV0ZShhbmRyb2lkLlIuYXR0ci5kaXNhYmxlZEFscGhhLCB2YWx1ZSwgdHJ1ZSkKLSAgICAgICAgICAgICAgICA/IHZhbHVlLmdldEZsb2F0KCkgOiAwLjVmOwotICAgIH0KLQotICAgIHN0YXRpYyBAQ29udHJvbGxlckNvbG9yVHlwZSBpbnQgZ2V0Q29udHJvbGxlckNvbG9yKENvbnRleHQgY29udGV4dCwgaW50IHN0eWxlKSB7Ci0gICAgICAgIGludCBwcmltYXJ5Q29sb3IgPSBnZXRUaGVtZUNvbG9yKGNvbnRleHQsIHN0eWxlLCBhbmRyb2lkLlIuYXR0ci5jb2xvclByaW1hcnkpOwotICAgICAgICBpZiAocHJpbWFyeUNvbG9yID09IDApIHsKLSAgICAgICAgICAgIHByaW1hcnlDb2xvciA9IGdldFRoZW1lQ29sb3IoY29udGV4dCwgc3R5bGUsIGFuZHJvaWQuUi5hdHRyLmNvbG9yUHJpbWFyeSk7Ci0gICAgICAgICAgICBpZiAocHJpbWFyeUNvbG9yID09IDApIHsKLSAgICAgICAgICAgICAgICBwcmltYXJ5Q29sb3IgPSAweEZGMDAwMDAwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChDb2xvclV0aWxzLmNhbGN1bGF0ZUNvbnRyYXN0KENPTE9SX1dISVRFX09OX0RBUktfQkFDS0dST1VORCwgcHJpbWFyeUNvbG9yKQotICAgICAgICAgICAgICAgID49IE1JTl9DT05UUkFTVCkgewotICAgICAgICAgICAgcmV0dXJuIENPTE9SX1dISVRFX09OX0RBUktfQkFDS0dST1VORDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gQ09MT1JfREFSS19PTl9MSUdIVF9CQUNLR1JPVU5EOwotICAgIH0KLQotICAgIHN0YXRpYyBpbnQgZ2V0QnV0dG9uVGV4dENvbG9yKENvbnRleHQgY29udGV4dCkgewotICAgICAgICBpbnQgcHJpbWFyeUNvbG9yID0gZ2V0VGhlbWVDb2xvcihjb250ZXh0LCAwLCBhbmRyb2lkLlIuYXR0ci5jb2xvclByaW1hcnkpOwotICAgICAgICBpbnQgYmFja2dyb3VuZENvbG9yID0gZ2V0VGhlbWVDb2xvcihjb250ZXh0LCAwLCBhbmRyb2lkLlIuYXR0ci5jb2xvckJhY2tncm91bmQpOwotCi0gICAgICAgIGlmIChDb2xvclV0aWxzLmNhbGN1bGF0ZUNvbnRyYXN0KHByaW1hcnlDb2xvciwgYmFja2dyb3VuZENvbG9yKSA8IE1JTl9DT05UUkFTVCkgewotICAgICAgICAgICAgLy8gRGVmYXVsdCB0byBjb2xvckFjY2VudCBpZiB0aGUgY29udHJhc3QgcmF0aW8gaXMgbG93LgotICAgICAgICAgICAgcmV0dXJuIGdldFRoZW1lQ29sb3IoY29udGV4dCwgMCwgYW5kcm9pZC5SLmF0dHIuY29sb3JBY2NlbnQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwcmltYXJ5Q29sb3I7Ci0gICAgfQotCi0gICAgc3RhdGljIHZvaWQgc2V0TWVkaWFDb250cm9sc0JhY2tncm91bmRDb2xvcigKLSAgICAgICAgICAgIENvbnRleHQgY29udGV4dCwgVmlldyBtYWluQ29udHJvbHMsIFZpZXcgZ3JvdXBDb250cm9scywgYm9vbGVhbiBoYXNHcm91cCkgewotICAgICAgICBpbnQgcHJpbWFyeUNvbG9yID0gZ2V0VGhlbWVDb2xvcihjb250ZXh0LCAwLCBhbmRyb2lkLlIuYXR0ci5jb2xvclByaW1hcnkpOwotICAgICAgICBpbnQgcHJpbWFyeURhcmtDb2xvciA9IGdldFRoZW1lQ29sb3IoY29udGV4dCwgMCwgYW5kcm9pZC5SLmF0dHIuY29sb3JQcmltYXJ5RGFyayk7Ci0gICAgICAgIGlmIChoYXNHcm91cCAmJiBnZXRDb250cm9sbGVyQ29sb3IoY29udGV4dCwgMCkgPT0gQ09MT1JfREFSS19PTl9MSUdIVF9CQUNLR1JPVU5EKSB7Ci0gICAgICAgICAgICAvLyBJbnN0ZWFkIG9mIHNob3dpbmcgZGFyayBjb250cm9scyBpbiBhIHBvc3NpYmx5IGRhcmsgKGkuZS4gdGhlIHByaW1hcnkgZGFyayksIG1vZGVsCi0gICAgICAgICAgICAvLyB0aGUgd2hpdGUgZGlhbG9nIGFuZCB1c2UgdGhlIHByaW1hcnkgY29sb3IgZm9yIHRoZSBncm91cCBjb250cm9scy4KLSAgICAgICAgICAgIHByaW1hcnlEYXJrQ29sb3IgPSBwcmltYXJ5Q29sb3I7Ci0gICAgICAgICAgICBwcmltYXJ5Q29sb3IgPSBDb2xvci5XSElURTsKLSAgICAgICAgfQotICAgICAgICBtYWluQ29udHJvbHMuc2V0QmFja2dyb3VuZENvbG9yKHByaW1hcnlDb2xvcik7Ci0gICAgICAgIGdyb3VwQ29udHJvbHMuc2V0QmFja2dyb3VuZENvbG9yKHByaW1hcnlEYXJrQ29sb3IpOwotICAgICAgICAvLyBBbHNvIHN0b3JlIHRoZSBiYWNrZ3JvdW5kIGNvbG9ycyB0byB0aGUgdmlldyB0YWdzLiBUaGV5IGFyZSB1c2VkIGluCi0gICAgICAgIC8vIHNldFZvbHVtZVNsaWRlckNvbG9yKCkgYmVsb3cuCi0gICAgICAgIG1haW5Db250cm9scy5zZXRUYWcocHJpbWFyeUNvbG9yKTsKLSAgICAgICAgZ3JvdXBDb250cm9scy5zZXRUYWcocHJpbWFyeURhcmtDb2xvcik7Ci0gICAgfQotCi0gICAgc3RhdGljIHZvaWQgc2V0Vm9sdW1lU2xpZGVyQ29sb3IoCi0gICAgICAgICAgICBDb250ZXh0IGNvbnRleHQsIE1lZGlhUm91dGVWb2x1bWVTbGlkZXIgdm9sdW1lU2xpZGVyLCBWaWV3IGJhY2tncm91bmRWaWV3KSB7Ci0gICAgICAgIGludCBjb250cm9sbGVyQ29sb3IgPSBnZXRDb250cm9sbGVyQ29sb3IoY29udGV4dCwgMCk7Ci0gICAgICAgIGlmIChDb2xvci5hbHBoYShjb250cm9sbGVyQ29sb3IpICE9IDB4RkYpIHsKLSAgICAgICAgICAgIC8vIENvbXBvc2l0ZSB3aXRoIHRoZSBiYWNrZ3JvdW5kIGluIG9yZGVyIG5vdCB0byBzaG93IHRoZSB1bmRlcmx5aW5nIHByb2dyZXNzIGJhcgotICAgICAgICAgICAgLy8gdGhyb3VnaCB0aGUgdGh1bWIuCi0gICAgICAgICAgICBpbnQgYmFja2dyb3VuZENvbG9yID0gKGludCkgYmFja2dyb3VuZFZpZXcuZ2V0VGFnKCk7Ci0gICAgICAgICAgICBjb250cm9sbGVyQ29sb3IgPSBDb2xvclV0aWxzLmNvbXBvc2l0ZUNvbG9ycyhjb250cm9sbGVyQ29sb3IsIGJhY2tncm91bmRDb2xvcik7Ci0gICAgICAgIH0KLSAgICAgICAgdm9sdW1lU2xpZGVyLnNldENvbG9yKGNvbnRyb2xsZXJDb2xvcik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0xpZ2h0VGhlbWUoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIFR5cGVkVmFsdWUgdmFsdWUgPSBuZXcgVHlwZWRWYWx1ZSgpOwotICAgICAgICAvLyBUT0RPKHN1bmdzb28pOiBTd2l0Y2ggdG8gY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hdHRyLmlzTGlnaHRUaGVtZQotICAgICAgICByZXR1cm4gY29udGV4dC5nZXRUaGVtZSgpLnJlc29sdmVBdHRyaWJ1dGUoYW5kcm9pZC5zdXBwb3J0LnY3LmFwcGNvbXBhdC5SLmF0dHIuaXNMaWdodFRoZW1lLAotICAgICAgICAgICAgICAgIHZhbHVlLCB0cnVlKSAmJiB2YWx1ZS5kYXRhICE9IDA7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IGdldFRoZW1lQ29sb3IoQ29udGV4dCBjb250ZXh0LCBpbnQgc3R5bGUsIGludCBhdHRyKSB7Ci0gICAgICAgIGlmIChzdHlsZSAhPSAwKSB7Ci0gICAgICAgICAgICBpbnRbXSBhdHRycyA9IHsgYXR0ciB9OwotICAgICAgICAgICAgVHlwZWRBcnJheSB0YSA9IGNvbnRleHQub2J0YWluU3R5bGVkQXR0cmlidXRlcyhzdHlsZSwgYXR0cnMpOwotICAgICAgICAgICAgaW50IGNvbG9yID0gdGEuZ2V0Q29sb3IoMCwgMCk7Ci0gICAgICAgICAgICB0YS5yZWN5Y2xlKCk7Ci0gICAgICAgICAgICBpZiAoY29sb3IgIT0gMCkgewotICAgICAgICAgICAgICAgIHJldHVybiBjb2xvcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBUeXBlZFZhbHVlIHZhbHVlID0gbmV3IFR5cGVkVmFsdWUoKTsKLSAgICAgICAgY29udGV4dC5nZXRUaGVtZSgpLnJlc29sdmVBdHRyaWJ1dGUoYXR0ciwgdmFsdWUsIHRydWUpOwotICAgICAgICBpZiAodmFsdWUucmVzb3VyY2VJZCAhPSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gY29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRDb2xvcih2YWx1ZS5yZXNvdXJjZUlkKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdmFsdWUuZGF0YTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgaW50IGdldFJvdXRlclRoZW1lSWQoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIGludCB0aGVtZUlkOwotICAgICAgICBpZiAoaXNMaWdodFRoZW1lKGNvbnRleHQpKSB7Ci0gICAgICAgICAgICBpZiAoZ2V0Q29udHJvbGxlckNvbG9yKGNvbnRleHQsIDApID09IENPTE9SX0RBUktfT05fTElHSFRfQkFDS0dST1VORCkgewotICAgICAgICAgICAgICAgIHRoZW1lSWQgPSBSLnN0eWxlLlRoZW1lX01lZGlhUm91dGVyX0xpZ2h0OwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aGVtZUlkID0gUi5zdHlsZS5UaGVtZV9NZWRpYVJvdXRlcl9MaWdodF9EYXJrQ29udHJvbFBhbmVsOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKGdldENvbnRyb2xsZXJDb2xvcihjb250ZXh0LCAwKSA9PSBDT0xPUl9EQVJLX09OX0xJR0hUX0JBQ0tHUk9VTkQpIHsKLSAgICAgICAgICAgICAgICB0aGVtZUlkID0gUi5zdHlsZS5UaGVtZV9NZWRpYVJvdXRlcl9MaWdodENvbnRyb2xQYW5lbDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhlbWVJZCA9IFIuc3R5bGUuVGhlbWVfTWVkaWFSb3V0ZXI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoZW1lSWQ7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9PdmVybGF5TGlzdFZpZXcuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvT3ZlcmxheUxpc3RWaWV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwMGRlZTIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9PdmVybGF5TGlzdFZpZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIuYXBwOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuQml0bWFwRHJhd2FibGU7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkludGVycG9sYXRvcjsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0VmlldzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEEgTGlzdFZpZXcgd2hpY2ggaGFzIGFuIGFkZGl0aW9uYWwgb3ZlcmxheSBsYXllci4ge0BsaW5rIEJpdG1hcERyYXdhYmxlfQotICogY2FuIGJlIGFkZGVkIHRvIHRoZSBsYXllciBhbmQgY2FuIGJlIGFuaW1hdGVkLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgT3ZlcmxheUxpc3RWaWV3IGV4dGVuZHMgTGlzdFZpZXcgewotICAgIHByaXZhdGUgZmluYWwgTGlzdDxPdmVybGF5T2JqZWN0PiBtT3ZlcmxheU9iamVjdHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLQotICAgIHB1YmxpYyBPdmVybGF5TGlzdFZpZXcoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHN1cGVyKGNvbnRleHQpOwotICAgIH0KLQotICAgIHB1YmxpYyBPdmVybGF5TGlzdFZpZXcoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKLSAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMpOwotICAgIH0KLQotICAgIHB1YmxpYyBPdmVybGF5TGlzdFZpZXcoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZUF0dHIpIHsKLSAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlQXR0cik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhbiBvYmplY3QgdG8gdGhlIG92ZXJsYXkgbGF5ZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gb2JqZWN0IEFuIG9iamVjdCB0byBiZSBhZGRlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRPdmVybGF5T2JqZWN0KE92ZXJsYXlPYmplY3Qgb2JqZWN0KSB7Ci0gICAgICAgIG1PdmVybGF5T2JqZWN0cy5hZGQob2JqZWN0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdGFydHMgYWxsIGFuaW1hdGlvbnMgb2Ygb2JqZWN0cyBpbiB0aGUgb3ZlcmxheSBsYXllci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdGFydEFuaW1hdGlvbkFsbCgpIHsKLSAgICAgICAgZm9yIChPdmVybGF5T2JqZWN0IG9iamVjdCA6IG1PdmVybGF5T2JqZWN0cykgewotICAgICAgICAgICAgaWYgKCFvYmplY3QuaXNBbmltYXRpb25TdGFydGVkKCkpIHsKLSAgICAgICAgICAgICAgICBvYmplY3Quc3RhcnRBbmltYXRpb24oZ2V0RHJhd2luZ1RpbWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdG9wcyBhbGwgYW5pbWF0aW9ucyBvZiBvYmplY3RzIGluIHRoZSBvdmVybGF5IGxheWVyLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHN0b3BBbmltYXRpb25BbGwoKSB7Ci0gICAgICAgIGZvciAoT3ZlcmxheU9iamVjdCBvYmplY3QgOiBtT3ZlcmxheU9iamVjdHMpIHsKLSAgICAgICAgICAgIG9iamVjdC5zdG9wQW5pbWF0aW9uKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkRyYXcoQ2FudmFzIGNhbnZhcykgewotICAgICAgICBzdXBlci5vbkRyYXcoY2FudmFzKTsKLSAgICAgICAgaWYgKG1PdmVybGF5T2JqZWN0cy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICBJdGVyYXRvcjxPdmVybGF5T2JqZWN0PiBpdCA9IG1PdmVybGF5T2JqZWN0cy5pdGVyYXRvcigpOwotICAgICAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIE92ZXJsYXlPYmplY3Qgb2JqZWN0ID0gaXQubmV4dCgpOwotICAgICAgICAgICAgICAgIEJpdG1hcERyYXdhYmxlIGJpdG1hcCA9IG9iamVjdC5nZXRCaXRtYXBEcmF3YWJsZSgpOwotICAgICAgICAgICAgICAgIGlmIChiaXRtYXAgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBiaXRtYXAuZHJhdyhjYW52YXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoIW9iamVjdC51cGRhdGUoZ2V0RHJhd2luZ1RpbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaXQucmVtb3ZlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQSBjbGFzcyB0aGF0IHJlcHJlc2VudHMgYW4gb2JqZWN0IHRvIGJlIHNob3duIGluIHRoZSBvdmVybGF5IGxheWVyLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgT3ZlcmxheU9iamVjdCB7Ci0gICAgICAgIHByaXZhdGUgQml0bWFwRHJhd2FibGUgbUJpdG1hcDsKLSAgICAgICAgcHJpdmF0ZSBmbG9hdCBtQ3VycmVudEFscGhhID0gMS4wZjsKLSAgICAgICAgcHJpdmF0ZSBSZWN0IG1DdXJyZW50Qm91bmRzOwotICAgICAgICBwcml2YXRlIEludGVycG9sYXRvciBtSW50ZXJwb2xhdG9yOwotICAgICAgICBwcml2YXRlIGxvbmcgbUR1cmF0aW9uOwotICAgICAgICBwcml2YXRlIFJlY3QgbVN0YXJ0UmVjdDsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbURlbHRhWTsKLSAgICAgICAgcHJpdmF0ZSBmbG9hdCBtU3RhcnRBbHBoYSA9IDEuMGY7Ci0gICAgICAgIHByaXZhdGUgZmxvYXQgbUVuZEFscGhhID0gMS4wZjsKLSAgICAgICAgcHJpdmF0ZSBsb25nIG1TdGFydFRpbWU7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBtSXNBbmltYXRpb25TdGFydGVkOwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUlzQW5pbWF0aW9uRW5kZWQ7Ci0gICAgICAgIHByaXZhdGUgT25BbmltYXRpb25FbmRMaXN0ZW5lciBtTGlzdGVuZXI7Ci0KLSAgICAgICAgcHVibGljIE92ZXJsYXlPYmplY3QoQml0bWFwRHJhd2FibGUgYml0bWFwLCBSZWN0IHN0YXJ0UmVjdCkgewotICAgICAgICAgICAgbUJpdG1hcCA9IGJpdG1hcDsKLSAgICAgICAgICAgIG1TdGFydFJlY3QgPSBzdGFydFJlY3Q7Ci0gICAgICAgICAgICBtQ3VycmVudEJvdW5kcyA9IG5ldyBSZWN0KHN0YXJ0UmVjdCk7Ci0gICAgICAgICAgICBpZiAobUJpdG1hcCAhPSBudWxsICYmIG1DdXJyZW50Qm91bmRzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtQml0bWFwLnNldEFscGhhKChpbnQpIChtQ3VycmVudEFscGhhICogMjU1KSk7Ci0gICAgICAgICAgICAgICAgbUJpdG1hcC5zZXRCb3VuZHMobUN1cnJlbnRCb3VuZHMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMgdGhlIGJpdG1hcCB0aGF0IHRoaXMgb2JqZWN0IHJlcHJlc2VudHMuCi0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gQml0bWFwRHJhd2FibGUgdGhhdCB0aGlzIG9iamVjdCBoYXMuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQml0bWFwRHJhd2FibGUgZ2V0Qml0bWFwRHJhd2FibGUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUJpdG1hcDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIHRoZSBzdGFydGVkIHN0YXR1cyBvZiB0aGUgYW5pbWF0aW9uLgotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGFuaW1hdGlvbiBoYXMgc3RhcnRlZCwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNBbmltYXRpb25TdGFydGVkKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Jc0FuaW1hdGlvblN0YXJ0ZWQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyBhbmltYXRpb24gZm9yIHZhcnlpbmcgYWxwaGEuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBzdGFydEFscGhhIFN0YXJ0aW5nIGFscGhhIHZhbHVlIGZvciB0aGUgYW5pbWF0aW9uLCB3aGVyZSAxLjAgbWVhbnMKLSAgICAgICAgICogZnVsbHkgb3BhcXVlIGFuZCAwLjAgbWVhbnMgZnVsbHkgdHJhbnNwYXJlbnQuCi0gICAgICAgICAqIEBwYXJhbSBlbmRBbHBoYSBFbmRpbmcgYWxwaGEgdmFsdWUgZm9yIHRoZSBhbmltYXRpb24uCi0gICAgICAgICAqIEByZXR1cm4gVGhpcyBPdmVybGF5T2JqZWN0IHRvIGFsbG93IGZvciBjaGFpbmluZyBvZiBjYWxscy4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBPdmVybGF5T2JqZWN0IHNldEFscGhhQW5pbWF0aW9uKGZsb2F0IHN0YXJ0QWxwaGEsIGZsb2F0IGVuZEFscGhhKSB7Ci0gICAgICAgICAgICBtU3RhcnRBbHBoYSA9IHN0YXJ0QWxwaGE7Ci0gICAgICAgICAgICBtRW5kQWxwaGEgPSBlbmRBbHBoYTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgYW5pbWF0aW9uIGZvciBtb3Zpbmcgb2JqZWN0cyB2ZXJ0aWNhbGx5LgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gZGVsdGFZIERpc3RhbmNlIHRvIG1vdmUgaW4gcGl4ZWxzLgotICAgICAgICAgKiBAcmV0dXJuIFRoaXMgT3ZlcmxheU9iamVjdCB0byBhbGxvdyBmb3IgY2hhaW5pbmcgb2YgY2FsbHMuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgT3ZlcmxheU9iamVjdCBzZXRUcmFuc2xhdGVZQW5pbWF0aW9uKGludCBkZWx0YVkpIHsKLSAgICAgICAgICAgIG1EZWx0YVkgPSBkZWx0YVk7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIGhvdyBsb25nIHRoZSBhbmltYXRpb24gd2lsbCBsYXN0LgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gZHVyYXRpb24gRHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzCi0gICAgICAgICAqIEByZXR1cm4gVGhpcyBPdmVybGF5T2JqZWN0IHRvIGFsbG93IGZvciBjaGFpbmluZyBvZiBjYWxscy4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBPdmVybGF5T2JqZWN0IHNldER1cmF0aW9uKGxvbmcgZHVyYXRpb24pIHsKLSAgICAgICAgICAgIG1EdXJhdGlvbiA9IGR1cmF0aW9uOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgYWNjZWxlcmF0aW9uIGN1cnZlIGZvciB0aGlzIGFuaW1hdGlvbi4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGludGVycG9sYXRvciBUaGUgaW50ZXJwb2xhdG9yIHdoaWNoIGRlZmluZXMgdGhlIGFjY2VsZXJhdGlvbiBjdXJ2ZQotICAgICAgICAgKiBAcmV0dXJuIFRoaXMgT3ZlcmxheU9iamVjdCB0byBhbGxvdyBmb3IgY2hhaW5pbmcgb2YgY2FsbHMuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgT3ZlcmxheU9iamVjdCBzZXRJbnRlcnBvbGF0b3IoSW50ZXJwb2xhdG9yIGludGVycG9sYXRvcikgewotICAgICAgICAgICAgbUludGVycG9sYXRvciA9IGludGVycG9sYXRvcjsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEJpbmRzIGFuIGFuaW1hdGlvbiBlbmQgbGlzdGVuZXIgdG8gdGhlIGFuaW1hdGlvbi4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGxpc3RlbmVyIHRoZSBhbmltYXRpb24gZW5kIGxpc3RlbmVyIHRvIGJlIG5vdGlmaWVkLgotICAgICAgICAgKiBAcmV0dXJuIFRoaXMgT3ZlcmxheU9iamVjdCB0byBhbGxvdyBmb3IgY2hhaW5pbmcgb2YgY2FsbHMuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgT3ZlcmxheU9iamVjdCBzZXRBbmltYXRpb25FbmRMaXN0ZW5lcihPbkFuaW1hdGlvbkVuZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgICAgICBtTGlzdGVuZXIgPSBsaXN0ZW5lcjsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFN0YXJ0cyB0aGUgYW5pbWF0aW9uIGFuZCBzZXRzIHRoZSBzdGFydCB0aW1lLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gc3RhcnRUaW1lIFN0YXJ0IHRpbWUgdG8gYmUgc2V0IGluIE1pbGxpcwotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgc3RhcnRBbmltYXRpb24obG9uZyBzdGFydFRpbWUpIHsKLSAgICAgICAgICAgIG1TdGFydFRpbWUgPSBzdGFydFRpbWU7Ci0gICAgICAgICAgICBtSXNBbmltYXRpb25TdGFydGVkID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTdG9wcyB0aGUgYW5pbWF0aW9uLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgc3RvcEFuaW1hdGlvbigpIHsKLSAgICAgICAgICAgIG1Jc0FuaW1hdGlvblN0YXJ0ZWQgPSB0cnVlOwotICAgICAgICAgICAgbUlzQW5pbWF0aW9uRW5kZWQgPSB0cnVlOwotICAgICAgICAgICAgaWYgKG1MaXN0ZW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUxpc3RlbmVyLm9uQW5pbWF0aW9uRW5kKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsY3VsYXRlcyBhbmQgdXBkYXRlcyBjdXJyZW50IGJvdW5kcyBhbmQgYWxwaGEgdmFsdWUuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBjdXJyZW50VGltZSBDdXJyZW50IHRpbWUuaW4gbWlsbGlzCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgYm9vbGVhbiB1cGRhdGUobG9uZyBjdXJyZW50VGltZSkgewotICAgICAgICAgICAgaWYgKG1Jc0FuaW1hdGlvbkVuZGVkKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmxvYXQgbm9ybWFsaXplZFRpbWUgPSAoY3VycmVudFRpbWUgLSBtU3RhcnRUaW1lKSAvIChmbG9hdCkgbUR1cmF0aW9uOwotICAgICAgICAgICAgbm9ybWFsaXplZFRpbWUgPSBNYXRoLm1heCgwLjBmLCBNYXRoLm1pbigxLjBmLCBub3JtYWxpemVkVGltZSkpOwotICAgICAgICAgICAgaWYgKCFtSXNBbmltYXRpb25TdGFydGVkKSB7Ci0gICAgICAgICAgICAgICAgbm9ybWFsaXplZFRpbWUgPSAwLjBmOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmxvYXQgaW50ZXJwb2xhdGVkVGltZSA9IChtSW50ZXJwb2xhdG9yID09IG51bGwpID8gbm9ybWFsaXplZFRpbWUKLSAgICAgICAgICAgICAgICAgICAgOiBtSW50ZXJwb2xhdG9yLmdldEludGVycG9sYXRpb24obm9ybWFsaXplZFRpbWUpOwotICAgICAgICAgICAgaW50IGRlbHRhWSA9IChpbnQpIChtRGVsdGFZICogaW50ZXJwb2xhdGVkVGltZSk7Ci0gICAgICAgICAgICBtQ3VycmVudEJvdW5kcy50b3AgPSBtU3RhcnRSZWN0LnRvcCArIGRlbHRhWTsKLSAgICAgICAgICAgIG1DdXJyZW50Qm91bmRzLmJvdHRvbSA9IG1TdGFydFJlY3QuYm90dG9tICsgZGVsdGFZOwotICAgICAgICAgICAgbUN1cnJlbnRBbHBoYSA9IG1TdGFydEFscGhhICsgKG1FbmRBbHBoYSAtIG1TdGFydEFscGhhKSAqIGludGVycG9sYXRlZFRpbWU7Ci0gICAgICAgICAgICBpZiAobUJpdG1hcCAhPSBudWxsICYmIG1DdXJyZW50Qm91bmRzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtQml0bWFwLnNldEFscGhhKChpbnQpIChtQ3VycmVudEFscGhhICogMjU1KSk7Ci0gICAgICAgICAgICAgICAgbUJpdG1hcC5zZXRCb3VuZHMobUN1cnJlbnRCb3VuZHMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1Jc0FuaW1hdGlvblN0YXJ0ZWQgJiYgbm9ybWFsaXplZFRpbWUgPj0gMS4wZikgewotICAgICAgICAgICAgICAgIG1Jc0FuaW1hdGlvbkVuZGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBpZiAobUxpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbUxpc3RlbmVyLm9uQW5pbWF0aW9uRW5kKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuICFtSXNBbmltYXRpb25FbmRlZDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBbiBhbmltYXRpb24gbGlzdGVuZXIgdGhhdCByZWNlaXZlcyBub3RpZmljYXRpb25zIHdoZW4gdGhlIGFuaW1hdGlvbiBlbmRzLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGludGVyZmFjZSBPbkFuaW1hdGlvbkVuZExpc3RlbmVyIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogTm90aWZpZXMgdGhlIGVuZCBvZiB0aGUgYW5pbWF0aW9uLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvbkVuZCgpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2plbGx5YmVhbi1tcjEvTWVkaWFSb3V0ZXJKZWxseWJlYW5NcjEuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9qZWxseWJlYW4tbXIxL01lZGlhUm91dGVySmVsbHliZWFuTXIxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4NTM5YmQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2plbGx5YmVhbi1tcjEvTWVkaWFSb3V0ZXJKZWxseWJlYW5NcjEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWE7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmRpc3BsYXkuRGlzcGxheU1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdWlsZDsKLWltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uUmVxdWlyZXNBcGk7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuRGlzcGxheTsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotCi0vLyBAQFJlcXVpcmVzQXBpKDE3KQotZmluYWwgY2xhc3MgTWVkaWFSb3V0ZXJKZWxseWJlYW5NcjEgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTWVkaWFSb3V0ZXJKZWxseWJlYW5NcjEiOwotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgY3JlYXRlQ2FsbGJhY2soQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgcmV0dXJuIG5ldyBDYWxsYmFja1Byb3h5PENhbGxiYWNrPihjYWxsYmFjayk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBSb3V0ZUluZm8gewotICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNFbmFibGVkKE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgcmV0dXJuICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8pcm91dGVPYmopLmlzRW5hYmxlZCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBEaXNwbGF5IGdldFByZXNlbnRhdGlvbkRpc3BsYXkoT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICAvLyBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mby5nZXRQcmVzZW50YXRpb25EaXNwbGF5KCkgd2FzCi0gICAgICAgICAgICAvLyBhZGRlZCBpbiBBUEkgMTcuIEhvd2V2ZXIsIHNvbWUgZmFjdG9yeSByZWxlYXNlcyBvZiBKQiBNUjEgbWlzc2VkIGl0LgotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbylyb3V0ZU9iaikuZ2V0UHJlc2VudGF0aW9uRGlzcGxheSgpOwotICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXJyb3IgZXgpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgZ2V0IHByZXNlbnRhdGlvbiBkaXNwbGF5IGZvciB0aGUgcm91dGUuIiwgZXgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGludGVyZmFjZSBDYWxsYmFjayBleHRlbmRzIE1lZGlhUm91dGVySmVsbHliZWFuLkNhbGxiYWNrIHsKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVByZXNlbnRhdGlvbkRpc3BsYXlDaGFuZ2VkKE9iamVjdCByb3V0ZU9iaik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV29ya2Fyb3VuZCB0aGUgZmFjdCB0aGF0IHRoZSB2ZXJzaW9uIG9mIE1lZGlhUm91dGVyLmFkZENhbGxiYWNrKCkgdGhhdCBhY2NlcHRzIGEKLSAgICAgKiBmbGFnIHRvIHBlcmZvcm0gYW4gYWN0aXZlIHNjYW4gZG9lcyBub3QgZXhpc3QgaW4gSkIgTVIxIHNvIHdlIG5lZWQgdG8gZm9yY2UKLSAgICAgKiB3aWZpIGRpc3BsYXkgc2NhbnMgZGlyZWN0bHkgdGhyb3VnaCB0aGUgRGlzcGxheU1hbmFnZXIuCi0gICAgICogRG8gbm90IHVzZSBvbiBKQiBNUjIgYW5kIGFib3ZlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQWN0aXZlU2Nhbldvcmthcm91bmQgaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0gICAgICAgIC8vIFRpbWUgYmV0d2VlbiB3aWZpIGRpc3BsYXkgc2NhbnMgd2hlbiBhY3RpdmVseSBzY2FubmluZyBpbiBtaWxsaXNlY29uZHMuCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBXSUZJX0RJU1BMQVlfU0NBTl9JTlRFUlZBTCA9IDE1MDAwOwotCi0gICAgICAgIHByaXZhdGUgZmluYWwgRGlzcGxheU1hbmFnZXIgbURpc3BsYXlNYW5hZ2VyOwotICAgICAgICBwcml2YXRlIGZpbmFsIEhhbmRsZXIgbUhhbmRsZXI7Ci0gICAgICAgIHByaXZhdGUgTWV0aG9kIG1TY2FuV2lmaURpc3BsYXlzTWV0aG9kOwotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBtQWN0aXZlbHlTY2FubmluZ1dpZmlEaXNwbGF5czsKLQotICAgICAgICBwdWJsaWMgQWN0aXZlU2Nhbldvcmthcm91bmQoQ29udGV4dCBjb250ZXh0LCBIYW5kbGVyIGhhbmRsZXIpIHsKLSAgICAgICAgICAgIGlmIChCdWlsZC5WRVJTSU9OLlNES19JTlQgIT0gMTcpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbURpc3BsYXlNYW5hZ2VyID0gKERpc3BsYXlNYW5hZ2VyKSBjb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5ESVNQTEFZX1NFUlZJQ0UpOwotICAgICAgICAgICAgbUhhbmRsZXIgPSBoYW5kbGVyOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtU2NhbldpZmlEaXNwbGF5c01ldGhvZCA9IERpc3BsYXlNYW5hZ2VyLmNsYXNzLmdldE1ldGhvZCgic2NhbldpZmlEaXNwbGF5cyIpOwotICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRBY3RpdmVTY2FuUm91dGVUeXBlcyhpbnQgcm91dGVUeXBlcykgewotICAgICAgICAgICAgLy8gT24gSkIgTVIxLCB0aGVyZSBpcyBubyBBUEkgdG8gc2NhbiB3aWZpIGRpc3BsYXkgcm91dGVzLgotICAgICAgICAgICAgLy8gSW5zdGVhZCB3ZSBtdXN0IG1ha2UgYSBkaXJlY3QgY2FsbCBpbnRvIHRoZSBEaXNwbGF5TWFuYWdlciB0byBzY2FuCi0gICAgICAgICAgICAvLyB3aWZpIGRpc3BsYXlzIG9uIHRoaXMgdmVyc2lvbiBidXQgb25seSB3aGVuIGxpdmUgdmlkZW8gcm91dGVzIGFyZSByZXF1ZXN0ZWQuCi0gICAgICAgICAgICAvLyBTZWUgYWxzbyB0aGUgSmVsbHliZWFuTXIySW1wbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZC4KLSAgICAgICAgICAgIC8vIFRoaXMgd2FzIGZpeGVkIGluIEpCIE1SMiBieSBhZGRpbmcgYSBuZXcgb3ZlcmxvYWQgb2YgYWRkQ2FsbGJhY2soKSB0bwotICAgICAgICAgICAgLy8gZW5hYmxlIGFjdGl2ZSBzY2FubmluZyBvbiByZXF1ZXN0LgotICAgICAgICAgICAgaWYgKChyb3V0ZVR5cGVzICYgTWVkaWFSb3V0ZXJKZWxseWJlYW4uUk9VVEVfVFlQRV9MSVZFX1ZJREVPKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFtQWN0aXZlbHlTY2FubmluZ1dpZmlEaXNwbGF5cykgewotICAgICAgICAgICAgICAgICAgICBpZiAobVNjYW5XaWZpRGlzcGxheXNNZXRob2QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZWx5U2Nhbm5pbmdXaWZpRGlzcGxheXMgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgbUhhbmRsZXIucG9zdCh0aGlzKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBzY2FuIGZvciB3aWZpIGRpc3BsYXlzIGJlY2F1c2UgdGhlICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiRGlzcGxheU1hbmFnZXIuc2NhbldpZmlEaXNwbGF5cygpIG1ldGhvZCBpcyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIm5vdCBhdmFpbGFibGUgb24gdGhpcyBkZXZpY2UuIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChtQWN0aXZlbHlTY2FubmluZ1dpZmlEaXNwbGF5cykgewotICAgICAgICAgICAgICAgICAgICBtQWN0aXZlbHlTY2FubmluZ1dpZmlEaXNwbGF5cyA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBtSGFuZGxlci5yZW1vdmVDYWxsYmFja3ModGhpcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgIGlmIChtQWN0aXZlbHlTY2FubmluZ1dpZmlEaXNwbGF5cykgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TY2FuV2lmaURpc3BsYXlzTWV0aG9kLmludm9rZShtRGlzcGxheU1hbmFnZXIpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IHNjYW4gZm9yIHdpZmkgZGlzcGxheXMuIiwgZXgpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IHNjYW4gZm9yIHdpZmkgZGlzcGxheXMuIiwgZXgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtSGFuZGxlci5wb3N0RGVsYXllZCh0aGlzLCBXSUZJX0RJU1BMQVlfU0NBTl9JTlRFUlZBTCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXb3JrYXJvdW5kIHRoZSBmYWN0IHRoYXQgdGhlIGlzQ29ubmVjdGluZygpIG1ldGhvZCBkb2VzIG5vdCBleGlzdCBpbiBKQiBNUjEuCi0gICAgICogRG8gbm90IHVzZSBvbiBKQiBNUjIgYW5kIGFib3ZlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgSXNDb25uZWN0aW5nV29ya2Fyb3VuZCB7Ci0gICAgICAgIHByaXZhdGUgTWV0aG9kIG1HZXRTdGF0dXNDb2RlTWV0aG9kOwotICAgICAgICBwcml2YXRlIGludCBtU3RhdHVzQ29ubmVjdGluZzsKLQotICAgICAgICBwdWJsaWMgSXNDb25uZWN0aW5nV29ya2Fyb3VuZCgpIHsKLSAgICAgICAgICAgIGlmIChCdWlsZC5WRVJTSU9OLlNES19JTlQgIT0gMTcpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBGaWVsZCBzdGF0dXNDb25uZWN0aW5nRmllbGQgPQotICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8uY2xhc3MuZ2V0RmllbGQoIlNUQVRVU19DT05ORUNUSU5HIik7Ci0gICAgICAgICAgICAgICAgbVN0YXR1c0Nvbm5lY3RpbmcgPSBzdGF0dXNDb25uZWN0aW5nRmllbGQuZ2V0SW50KG51bGwpOwotICAgICAgICAgICAgICAgIG1HZXRTdGF0dXNDb2RlTWV0aG9kID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvLmNsYXNzLmdldE1ldGhvZCgiZ2V0U3RhdHVzQ29kZSIpOwotICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoRmllbGRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNDb25uZWN0aW5nKE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUgPQotICAgICAgICAgICAgICAgICAgICAoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8pcm91dGVPYmo7Ci0KLSAgICAgICAgICAgIGlmIChtR2V0U3RhdHVzQ29kZU1ldGhvZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgaW50IHN0YXR1c0NvZGUgPSAoSW50ZWdlciltR2V0U3RhdHVzQ29kZU1ldGhvZC5pbnZva2Uocm91dGUpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzQ29kZSA9PSBtU3RhdHVzQ29ubmVjdGluZzsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gQXNzdW1lIG5vdCBjb25uZWN0aW5nLgotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdGljIGNsYXNzIENhbGxiYWNrUHJveHk8VCBleHRlbmRzIENhbGxiYWNrPgotICAgICAgICAgICAgZXh0ZW5kcyBNZWRpYVJvdXRlckplbGx5YmVhbi5DYWxsYmFja1Byb3h5PFQ+IHsKLSAgICAgICAgcHVibGljIENhbGxiYWNrUHJveHkoVCBjYWxsYmFjaykgewotICAgICAgICAgICAgc3VwZXIoY2FsbGJhY2spOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVQcmVzZW50YXRpb25EaXNwbGF5Q2hhbmdlZChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyIHJvdXRlciwKLSAgICAgICAgICAgICAgICBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICAgICAgbUNhbGxiYWNrLm9uUm91dGVQcmVzZW50YXRpb25EaXNwbGF5Q2hhbmdlZChyb3V0ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvamVsbHliZWFuLW1yMi9NZWRpYVJvdXRlckplbGx5YmVhbk1yMi5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2plbGx5YmVhbi1tcjIvTWVkaWFSb3V0ZXJKZWxseWJlYW5NcjIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTEwMzU0OS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvamVsbHliZWFuLW1yMi9NZWRpYVJvdXRlckplbGx5YmVhbk1yMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhOwotCi0vLyBAQFJlcXVpcmVzQXBpKDE4KQotZmluYWwgY2xhc3MgTWVkaWFSb3V0ZXJKZWxseWJlYW5NcjIgewotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldERlZmF1bHRSb3V0ZShPYmplY3Qgcm91dGVyT2JqKSB7Ci0gICAgICAgIHJldHVybiAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIpcm91dGVyT2JqKS5nZXREZWZhdWx0Um91dGUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkQ2FsbGJhY2soT2JqZWN0IHJvdXRlck9iaiwgaW50IHR5cGVzLCBPYmplY3QgY2FsbGJhY2tPYmosIGludCBmbGFncykgewotICAgICAgICAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIpcm91dGVyT2JqKS5hZGRDYWxsYmFjayh0eXBlcywKLSAgICAgICAgICAgICAgICAoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5DYWxsYmFjayljYWxsYmFja09iaiwgZmxhZ3MpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgUm91dGVJbmZvIHsKLSAgICAgICAgcHVibGljIHN0YXRpYyBDaGFyU2VxdWVuY2UgZ2V0RGVzY3JpcHRpb24oT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbylyb3V0ZU9iaikuZ2V0RGVzY3JpcHRpb24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0Nvbm5lY3RpbmcoT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbylyb3V0ZU9iaikuaXNDb25uZWN0aW5nKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFVzZXJSb3V0ZUluZm8gewotICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0RGVzY3JpcHRpb24oT2JqZWN0IHJvdXRlT2JqLCBDaGFyU2VxdWVuY2UgZGVzY3JpcHRpb24pIHsKLSAgICAgICAgICAgICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Vc2VyUm91dGVJbmZvKXJvdXRlT2JqKS5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbik7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvamVsbHliZWFuL01lZGlhUm91dGVySmVsbHliZWFuLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvamVsbHliZWFuL01lZGlhUm91dGVySmVsbHliZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiYjU5YjguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2plbGx5YmVhbi9NZWRpYVJvdXRlckplbGx5YmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYTsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb01hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdWlsZDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLy8gQEBSZXF1aXJlc0FwaSgxNikKLWZpbmFsIGNsYXNzIE1lZGlhUm91dGVySmVsbHliZWFuIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk1lZGlhUm91dGVySmVsbHliZWFuIjsKLQotICAgIC8vIGFuZHJvaWQubWVkaWEuQXVkaW9TeXN0ZW0uREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUCA9IDB4ODA7Ci0gICAgLy8gYW5kcm9pZC5tZWRpYS5BdWRpb1N5c3RlbS5ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX0hFQURQSE9ORVMgPSAweDEwMDsKLSAgICAvLyBhbmRyb2lkLm1lZGlhLkF1ZGlvU3lzdGVtLkRFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfU1BFQUtFUiA9IDB4MjAwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFVklDRV9PVVRfQkxVRVRPT1RIID0gMHg4MCB8IDB4MTAwIHwgMHgyMDA7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBST1VURV9UWVBFX0xJVkVfQVVESU8gPSAweDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUk9VVEVfVFlQRV9MSVZFX1ZJREVPID0gMHgyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJPVVRFX1RZUEVfVVNFUiA9IDB4MDA4MDAwMDA7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBTExfUk9VVEVfVFlQRVMgPQotICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uUk9VVEVfVFlQRV9MSVZFX0FVRElPCi0gICAgICAgICAgICB8IE1lZGlhUm91dGVySmVsbHliZWFuLlJPVVRFX1RZUEVfTElWRV9WSURFTwotICAgICAgICAgICAgfCBNZWRpYVJvdXRlckplbGx5YmVhbi5ST1VURV9UWVBFX1VTRVI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRNZWRpYVJvdXRlcihDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgcmV0dXJuIGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0Lk1FRElBX1JPVVRFUl9TRVJWSUNFKTsKLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7ICJyYXd0eXBlcyIsICJ1bmNoZWNrZWQiIH0pCi0gICAgcHVibGljIHN0YXRpYyBMaXN0IGdldFJvdXRlcyhPYmplY3Qgcm91dGVyT2JqKSB7Ci0gICAgICAgIGZpbmFsIGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIgcm91dGVyID0gKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIpcm91dGVyT2JqOwotICAgICAgICBmaW5hbCBpbnQgY291bnQgPSByb3V0ZXIuZ2V0Um91dGVDb3VudCgpOwotICAgICAgICBMaXN0IG91dCA9IG5ldyBBcnJheUxpc3QoY291bnQpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgIG91dC5hZGQocm91dGVyLmdldFJvdXRlQXQoaSkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBvdXQ7Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoeyAicmF3dHlwZXMiLCAidW5jaGVja2VkIiB9KQotICAgIHB1YmxpYyBzdGF0aWMgTGlzdCBnZXRDYXRlZ29yaWVzKE9iamVjdCByb3V0ZXJPYmopIHsKLSAgICAgICAgZmluYWwgYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlciByb3V0ZXIgPSAoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlcilyb3V0ZXJPYmo7Ci0gICAgICAgIGZpbmFsIGludCBjb3VudCA9IHJvdXRlci5nZXRDYXRlZ29yeUNvdW50KCk7Ci0gICAgICAgIExpc3Qgb3V0ID0gbmV3IEFycmF5TGlzdChjb3VudCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgb3V0LmFkZChyb3V0ZXIuZ2V0Q2F0ZWdvcnlBdChpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG91dDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRTZWxlY3RlZFJvdXRlKE9iamVjdCByb3V0ZXJPYmosIGludCB0eXBlKSB7Ci0gICAgICAgIHJldHVybiAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIpcm91dGVyT2JqKS5nZXRTZWxlY3RlZFJvdXRlKHR5cGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZWxlY3RSb3V0ZShPYmplY3Qgcm91dGVyT2JqLCBpbnQgdHlwZXMsIE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIpcm91dGVyT2JqKS5zZWxlY3RSb3V0ZSh0eXBlcywKLSAgICAgICAgICAgICAgICAoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8pcm91dGVPYmopOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRDYWxsYmFjayhPYmplY3Qgcm91dGVyT2JqLCBpbnQgdHlwZXMsIE9iamVjdCBjYWxsYmFja09iaikgewotICAgICAgICAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIpcm91dGVyT2JqKS5hZGRDYWxsYmFjayh0eXBlcywKLSAgICAgICAgICAgICAgICAoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5DYWxsYmFjayljYWxsYmFja09iaik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUNhbGxiYWNrKE9iamVjdCByb3V0ZXJPYmosIE9iamVjdCBjYWxsYmFja09iaikgewotICAgICAgICAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIpcm91dGVyT2JqKS5yZW1vdmVDYWxsYmFjaygKLSAgICAgICAgICAgICAgICAoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5DYWxsYmFjayljYWxsYmFja09iaik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgY3JlYXRlUm91dGVDYXRlZ29yeShPYmplY3Qgcm91dGVyT2JqLAotICAgICAgICAgICAgU3RyaW5nIG5hbWUsIGJvb2xlYW4gaXNHcm91cGFibGUpIHsKLSAgICAgICAgcmV0dXJuICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlcilyb3V0ZXJPYmopLmNyZWF0ZVJvdXRlQ2F0ZWdvcnkobmFtZSwgaXNHcm91cGFibGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGNyZWF0ZVVzZXJSb3V0ZShPYmplY3Qgcm91dGVyT2JqLCBPYmplY3QgY2F0ZWdvcnlPYmopIHsKLSAgICAgICAgcmV0dXJuICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlcilyb3V0ZXJPYmopLmNyZWF0ZVVzZXJSb3V0ZSgKLSAgICAgICAgICAgICAgICAoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUNhdGVnb3J5KWNhdGVnb3J5T2JqKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkVXNlclJvdXRlKE9iamVjdCByb3V0ZXJPYmosIE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIpcm91dGVyT2JqKS5hZGRVc2VyUm91dGUoCi0gICAgICAgICAgICAgICAgKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuVXNlclJvdXRlSW5mbylyb3V0ZU9iaik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZVVzZXJSb3V0ZShPYmplY3Qgcm91dGVyT2JqLCBPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyKXJvdXRlck9iaikucmVtb3ZlVXNlclJvdXRlKAotICAgICAgICAgICAgICAgIChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlVzZXJSb3V0ZUluZm8pcm91dGVPYmopOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGNyZWF0ZUNhbGxiYWNrKENhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIHJldHVybiBuZXcgQ2FsbGJhY2tQcm94eTxDYWxsYmFjaz4oY2FsbGJhY2spOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGNyZWF0ZVZvbHVtZUNhbGxiYWNrKFZvbHVtZUNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIHJldHVybiBuZXcgVm9sdW1lQ2FsbGJhY2tQcm94eTxWb2x1bWVDYWxsYmFjaz4oY2FsbGJhY2spOwotICAgIH0KLQotICAgIHN0YXRpYyBib29sZWFuIGNoZWNrUm91dGVkVG9CbHVldG9vdGgoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBBdWRpb01hbmFnZXIgYXVkaW9NYW5hZ2VyID0gKEF1ZGlvTWFuYWdlcikgY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKAotICAgICAgICAgICAgICAgICAgICBDb250ZXh0LkFVRElPX1NFUlZJQ0UpOwotICAgICAgICAgICAgTWV0aG9kIG1ldGhvZCA9IGF1ZGlvTWFuYWdlci5nZXRDbGFzcygpLmdldERlY2xhcmVkTWV0aG9kKAotICAgICAgICAgICAgICAgICAgICAiZ2V0RGV2aWNlc0ZvclN0cmVhbSIsIGludC5jbGFzcyk7Ci0gICAgICAgICAgICBpbnQgZGV2aWNlID0gKEludGVnZXIpIG1ldGhvZC5pbnZva2UoYXVkaW9NYW5hZ2VyLCBBdWRpb01hbmFnZXIuU1RSRUFNX01VU0lDKTsKLSAgICAgICAgICAgIHJldHVybiAoZGV2aWNlICYgREVWSUNFX09VVF9CTFVFVE9PVEgpICE9IDA7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFJvdXRlSW5mbyB7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgQ2hhclNlcXVlbmNlIGdldE5hbWUoT2JqZWN0IHJvdXRlT2JqLCBDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgICAgIHJldHVybiAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvKXJvdXRlT2JqKS5nZXROYW1lKGNvbnRleHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBDaGFyU2VxdWVuY2UgZ2V0U3RhdHVzKE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgcmV0dXJuICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8pcm91dGVPYmopLmdldFN0YXR1cygpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0U3VwcG9ydGVkVHlwZXMoT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbylyb3V0ZU9iaikuZ2V0U3VwcG9ydGVkVHlwZXMoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldENhdGVnb3J5KE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgcmV0dXJuICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8pcm91dGVPYmopLmdldENhdGVnb3J5KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIERyYXdhYmxlIGdldEljb25EcmF3YWJsZShPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgIHJldHVybiAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvKXJvdXRlT2JqKS5nZXRJY29uRHJhd2FibGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldFBsYXliYWNrVHlwZShPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgIHJldHVybiAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvKXJvdXRlT2JqKS5nZXRQbGF5YmFja1R5cGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldFBsYXliYWNrU3RyZWFtKE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgcmV0dXJuICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8pcm91dGVPYmopLmdldFBsYXliYWNrU3RyZWFtKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIGludCBnZXRWb2x1bWUoT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbylyb3V0ZU9iaikuZ2V0Vm9sdW1lKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIGludCBnZXRWb2x1bWVNYXgoT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbylyb3V0ZU9iaikuZ2V0Vm9sdW1lTWF4KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIGludCBnZXRWb2x1bWVIYW5kbGluZyhPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgIHJldHVybiAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvKXJvdXRlT2JqKS5nZXRWb2x1bWVIYW5kbGluZygpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0VGFnKE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgcmV0dXJuICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8pcm91dGVPYmopLmdldFRhZygpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldFRhZyhPYmplY3Qgcm91dGVPYmosIE9iamVjdCB0YWcpIHsKLSAgICAgICAgICAgICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8pcm91dGVPYmopLnNldFRhZyh0YWcpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHJlcXVlc3RTZXRWb2x1bWUoT2JqZWN0IHJvdXRlT2JqLCBpbnQgdm9sdW1lKSB7Ci0gICAgICAgICAgICAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvKXJvdXRlT2JqKS5yZXF1ZXN0U2V0Vm9sdW1lKHZvbHVtZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVxdWVzdFVwZGF0ZVZvbHVtZShPYmplY3Qgcm91dGVPYmosIGludCBkaXJlY3Rpb24pIHsKLSAgICAgICAgICAgICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8pcm91dGVPYmopLnJlcXVlc3RVcGRhdGVWb2x1bWUoZGlyZWN0aW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldEdyb3VwKE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgcmV0dXJuICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8pcm91dGVPYmopLmdldEdyb3VwKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNHcm91cChPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgIHJldHVybiByb3V0ZU9iaiBpbnN0YW5jZW9mIGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVHcm91cDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgUm91dGVHcm91cCB7Ci0gICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsgInJhd3R5cGVzIiwgInVuY2hlY2tlZCIgfSkKLSAgICAgICAgcHVibGljIHN0YXRpYyBMaXN0IGdldEdyb3VwZWRSb3V0ZXMoT2JqZWN0IGdyb3VwT2JqKSB7Ci0gICAgICAgICAgICBmaW5hbCBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlR3JvdXAgZ3JvdXAgPQotICAgICAgICAgICAgICAgICAgICAoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUdyb3VwKWdyb3VwT2JqOwotICAgICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gZ3JvdXAuZ2V0Um91dGVDb3VudCgpOwotICAgICAgICAgICAgTGlzdCBvdXQgPSBuZXcgQXJyYXlMaXN0KGNvdW50KTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgIG91dC5hZGQoZ3JvdXAuZ2V0Um91dGVBdChpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gb3V0OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBVc2VyUm91dGVJbmZvIHsKLSAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldE5hbWUoT2JqZWN0IHJvdXRlT2JqLCBDaGFyU2VxdWVuY2UgbmFtZSkgewotICAgICAgICAgICAgKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlVzZXJSb3V0ZUluZm8pcm91dGVPYmopLnNldE5hbWUobmFtZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0U3RhdHVzKE9iamVjdCByb3V0ZU9iaiwgQ2hhclNlcXVlbmNlIHN0YXR1cykgewotICAgICAgICAgICAgKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlVzZXJSb3V0ZUluZm8pcm91dGVPYmopLnNldFN0YXR1cyhzdGF0dXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldEljb25EcmF3YWJsZShPYmplY3Qgcm91dGVPYmosIERyYXdhYmxlIGljb24pIHsKLSAgICAgICAgICAgICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Vc2VyUm91dGVJbmZvKXJvdXRlT2JqKS5zZXRJY29uRHJhd2FibGUoaWNvbik7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0UGxheWJhY2tUeXBlKE9iamVjdCByb3V0ZU9iaiwgaW50IHR5cGUpIHsKLSAgICAgICAgICAgICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Vc2VyUm91dGVJbmZvKXJvdXRlT2JqKS5zZXRQbGF5YmFja1R5cGUodHlwZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0UGxheWJhY2tTdHJlYW0oT2JqZWN0IHJvdXRlT2JqLCBpbnQgc3RyZWFtKSB7Ci0gICAgICAgICAgICAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuVXNlclJvdXRlSW5mbylyb3V0ZU9iaikuc2V0UGxheWJhY2tTdHJlYW0oc3RyZWFtKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRWb2x1bWUoT2JqZWN0IHJvdXRlT2JqLCBpbnQgdm9sdW1lKSB7Ci0gICAgICAgICAgICAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuVXNlclJvdXRlSW5mbylyb3V0ZU9iaikuc2V0Vm9sdW1lKHZvbHVtZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0Vm9sdW1lTWF4KE9iamVjdCByb3V0ZU9iaiwgaW50IHZvbHVtZU1heCkgewotICAgICAgICAgICAgKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlVzZXJSb3V0ZUluZm8pcm91dGVPYmopLnNldFZvbHVtZU1heCh2b2x1bWVNYXgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldFZvbHVtZUhhbmRsaW5nKE9iamVjdCByb3V0ZU9iaiwgaW50IHZvbHVtZUhhbmRsaW5nKSB7Ci0gICAgICAgICAgICAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuVXNlclJvdXRlSW5mbylyb3V0ZU9iaikuc2V0Vm9sdW1lSGFuZGxpbmcodm9sdW1lSGFuZGxpbmcpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldFZvbHVtZUNhbGxiYWNrKE9iamVjdCByb3V0ZU9iaiwgT2JqZWN0IHZvbHVtZUNhbGxiYWNrT2JqKSB7Ci0gICAgICAgICAgICAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuVXNlclJvdXRlSW5mbylyb3V0ZU9iaikuc2V0Vm9sdW1lQ2FsbGJhY2soCi0gICAgICAgICAgICAgICAgICAgIChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlZvbHVtZUNhbGxiYWNrKXZvbHVtZUNhbGxiYWNrT2JqKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRSZW1vdGVDb250cm9sQ2xpZW50KE9iamVjdCByb3V0ZU9iaiwgT2JqZWN0IHJjY09iaikgewotICAgICAgICAgICAgKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlVzZXJSb3V0ZUluZm8pcm91dGVPYmopLnNldFJlbW90ZUNvbnRyb2xDbGllbnQoCi0gICAgICAgICAgICAgICAgICAgIChhbmRyb2lkLm1lZGlhLlJlbW90ZUNvbnRyb2xDbGllbnQpcmNjT2JqKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgUm91dGVDYXRlZ29yeSB7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgQ2hhclNlcXVlbmNlIGdldE5hbWUoT2JqZWN0IGNhdGVnb3J5T2JqLCBDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgICAgIHJldHVybiAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVDYXRlZ29yeSljYXRlZ29yeU9iaikuZ2V0TmFtZShjb250ZXh0KTsKLSAgICAgICAgfQotCi0gICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsgInJhd3R5cGVzIiwgInVuY2hlY2tlZCIgfSkKLSAgICAgICAgcHVibGljIHN0YXRpYyBMaXN0IGdldFJvdXRlcyhPYmplY3QgY2F0ZWdvcnlPYmopIHsKLSAgICAgICAgICAgIEFycmF5TGlzdCBvdXQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVDYXRlZ29yeSljYXRlZ29yeU9iaikuZ2V0Um91dGVzKG91dCk7Ci0gICAgICAgICAgICByZXR1cm4gb3V0OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0U3VwcG9ydGVkVHlwZXMoT2JqZWN0IGNhdGVnb3J5T2JqKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlQ2F0ZWdvcnkpY2F0ZWdvcnlPYmopLmdldFN1cHBvcnRlZFR5cGVzKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNHcm91cGFibGUoT2JqZWN0IGNhdGVnb3J5T2JqKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlQ2F0ZWdvcnkpY2F0ZWdvcnlPYmopLmlzR3JvdXBhYmxlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGludGVyZmFjZSBDYWxsYmFjayB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVTZWxlY3RlZChpbnQgdHlwZSwgT2JqZWN0IHJvdXRlT2JqKTsKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVVuc2VsZWN0ZWQoaW50IHR5cGUsIE9iamVjdCByb3V0ZU9iaik7Ci0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVBZGRlZChPYmplY3Qgcm91dGVPYmopOwotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlUmVtb3ZlZChPYmplY3Qgcm91dGVPYmopOwotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlQ2hhbmdlZChPYmplY3Qgcm91dGVPYmopOwotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlR3JvdXBlZChPYmplY3Qgcm91dGVPYmosIE9iamVjdCBncm91cE9iaiwgaW50IGluZGV4KTsKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVVuZ3JvdXBlZChPYmplY3Qgcm91dGVPYmosIE9iamVjdCBncm91cE9iaik7Ci0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVWb2x1bWVDaGFuZ2VkKE9iamVjdCByb3V0ZU9iaik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgVm9sdW1lQ2FsbGJhY2sgewotICAgICAgICBwdWJsaWMgdm9pZCBvblZvbHVtZVNldFJlcXVlc3QoT2JqZWN0IHJvdXRlT2JqLCBpbnQgdm9sdW1lKTsKLSAgICAgICAgcHVibGljIHZvaWQgb25Wb2x1bWVVcGRhdGVSZXF1ZXN0KE9iamVjdCByb3V0ZU9iaiwgaW50IGRpcmVjdGlvbik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV29ya2Fyb3VuZCBmb3IgbGltaXRhdGlvbnMgb2Ygc2VsZWN0Um91dGUoKSBvbiBKQiBhbmQgSkIgTVIxLgotICAgICAqIERvIG5vdCB1c2Ugb24gSkIgTVIyIGFuZCBhYm92ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFNlbGVjdFJvdXRlV29ya2Fyb3VuZCB7Ci0gICAgICAgIHByaXZhdGUgTWV0aG9kIG1TZWxlY3RSb3V0ZUludE1ldGhvZDsKLQotICAgICAgICBwdWJsaWMgU2VsZWN0Um91dGVXb3JrYXJvdW5kKCkgewotICAgICAgICAgICAgaWYgKEJ1aWxkLlZFUlNJT04uU0RLX0lOVCA8IDE2IHx8IEJ1aWxkLlZFUlNJT04uU0RLX0lOVCA+IDE3KSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG1TZWxlY3RSb3V0ZUludE1ldGhvZCA9IGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuY2xhc3MuZ2V0TWV0aG9kKAotICAgICAgICAgICAgICAgICAgICAgICAgInNlbGVjdFJvdXRlSW50IiwgaW50LmNsYXNzLCBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mby5jbGFzcyk7Ci0gICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNlbGVjdFJvdXRlKE9iamVjdCByb3V0ZXJPYmosIGludCB0eXBlcywgT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyIHJvdXRlciA9IChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyKXJvdXRlck9iajsKLSAgICAgICAgICAgIGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlID0KLSAgICAgICAgICAgICAgICAgICAgKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvKXJvdXRlT2JqOwotCi0gICAgICAgICAgICBpbnQgcm91dGVUeXBlcyA9IHJvdXRlLmdldFN1cHBvcnRlZFR5cGVzKCk7Ci0gICAgICAgICAgICBpZiAoKHJvdXRlVHlwZXMgJiBST1VURV9UWVBFX1VTRVIpID09IDApIHsKLSAgICAgICAgICAgICAgICAvLyBIYW5kbGUgbm9uLXVzZXIgcm91dGVzLgotICAgICAgICAgICAgICAgIC8vIE9uIEpCIGFuZCBKQiBNUjEsIHRoZSBzZWxlY3RSb3V0ZSgpIEFQSSBvbmx5IHN1cHBvcnRzIHByb2dyYW1tYXRpY2FsbHkKLSAgICAgICAgICAgICAgICAvLyBzZWxlY3RpbmcgdXNlciByb3V0ZXMuICBTbyBpbnN0ZWFkIHdlIHJlbHkgb24gdGhlIGhpZGRlbiBzZWxlY3RSb3V0ZUludCgpCi0gICAgICAgICAgICAgICAgLy8gbWV0aG9kIG9uIHRoZXNlIHZlcnNpb25zIG9mIHRoZSBwbGF0Zm9ybS4KLSAgICAgICAgICAgICAgICAvLyBUaGlzIGxpbWl0YXRpb24gd2FzIHJlbW92ZWQgaW4gSkIgTVIyLgotICAgICAgICAgICAgICAgIGlmIChtU2VsZWN0Um91dGVJbnRNZXRob2QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgbVNlbGVjdFJvdXRlSW50TWV0aG9kLmludm9rZShyb3V0ZXIsIHR5cGVzLCByb3V0ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47IC8vIHN1Y2Nlc3MhCi0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBwcm9ncmFtbWF0aWNhbGx5IHNlbGVjdCBub24tdXNlciByb3V0ZS4gICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiTWVkaWEgcm91dGluZyBtYXkgbm90IHdvcmsuIiwgZXgpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgcHJvZ3JhbW1hdGljYWxseSBzZWxlY3Qgbm9uLXVzZXIgcm91dGUuICAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIk1lZGlhIHJvdXRpbmcgbWF5IG5vdCB3b3JrLiIsIGV4KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBwcm9ncmFtbWF0aWNhbGx5IHNlbGVjdCBub24tdXNlciByb3V0ZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiYmVjYXVzZSB0aGUgcGxhdGZvcm0gaXMgbWlzc2luZyB0aGUgc2VsZWN0Um91dGVJbnQoKSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAibWV0aG9kLiAgTWVkaWEgcm91dGluZyBtYXkgbm90IHdvcmsuIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBEZWZhdWx0IGhhbmRsaW5nLgotICAgICAgICAgICAgcm91dGVyLnNlbGVjdFJvdXRlKHR5cGVzLCByb3V0ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXb3JrYXJvdW5kIHRoZSBmYWN0IHRoYXQgdGhlIGdldERlZmF1bHRSb3V0ZSgpIG1ldGhvZCBkb2VzIG5vdCBleGlzdCBpbiBKQiBhbmQgSkIgTVIxLgotICAgICAqIERvIG5vdCB1c2Ugb24gSkIgTVIyIGFuZCBhYm92ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEdldERlZmF1bHRSb3V0ZVdvcmthcm91bmQgewotICAgICAgICBwcml2YXRlIE1ldGhvZCBtR2V0U3lzdGVtQXVkaW9Sb3V0ZU1ldGhvZDsKLQotICAgICAgICBwdWJsaWMgR2V0RGVmYXVsdFJvdXRlV29ya2Fyb3VuZCgpIHsKLSAgICAgICAgICAgIGlmIChCdWlsZC5WRVJTSU9OLlNES19JTlQgPCAxNiB8fCBCdWlsZC5WRVJTSU9OLlNES19JTlQgPiAxNykgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtR2V0U3lzdGVtQXVkaW9Sb3V0ZU1ldGhvZCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLmNsYXNzLmdldE1ldGhvZCgiZ2V0U3lzdGVtQXVkaW9Sb3V0ZSIpOwotICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgT2JqZWN0IGdldERlZmF1bHRSb3V0ZShPYmplY3Qgcm91dGVyT2JqKSB7Ci0gICAgICAgICAgICBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyIHJvdXRlciA9IChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyKXJvdXRlck9iajsKLQotICAgICAgICAgICAgaWYgKG1HZXRTeXN0ZW1BdWRpb1JvdXRlTWV0aG9kICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbUdldFN5c3RlbUF1ZGlvUm91dGVNZXRob2QuaW52b2tlKHJvdXRlcik7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIENvdWxkIG5vdCBmaW5kIHRoZSBtZXRob2Qgb3IgaXQgZG9lcyBub3Qgd29yay4KLSAgICAgICAgICAgIC8vIFJldHVybiB0aGUgZmlyc3Qgcm91dGUgYW5kIGhvcGUgZm9yIHRoZSBiZXN0LgotICAgICAgICAgICAgcmV0dXJuIHJvdXRlci5nZXRSb3V0ZUF0KDApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdGljIGNsYXNzIENhbGxiYWNrUHJveHk8VCBleHRlbmRzIENhbGxiYWNrPgotICAgICAgICAgICAgZXh0ZW5kcyBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLkNhbGxiYWNrIHsKLSAgICAgICAgcHJvdGVjdGVkIGZpbmFsIFQgbUNhbGxiYWNrOwotCi0gICAgICAgIHB1YmxpYyBDYWxsYmFja1Byb3h5KFQgY2FsbGJhY2spIHsKLSAgICAgICAgICAgIG1DYWxsYmFjayA9IGNhbGxiYWNrOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVTZWxlY3RlZChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyIHJvdXRlciwKLSAgICAgICAgICAgICAgICBpbnQgdHlwZSwgYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgICAgIG1DYWxsYmFjay5vblJvdXRlU2VsZWN0ZWQodHlwZSwgcm91dGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVVbnNlbGVjdGVkKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIgcm91dGVyLAotICAgICAgICAgICAgICAgIGludCB0eXBlLCBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICAgICAgbUNhbGxiYWNrLm9uUm91dGVVbnNlbGVjdGVkKHR5cGUsIHJvdXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlQWRkZWQoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlciByb3V0ZXIsCi0gICAgICAgICAgICAgICAgYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgICAgIG1DYWxsYmFjay5vblJvdXRlQWRkZWQocm91dGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVSZW1vdmVkKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIgcm91dGVyLAotICAgICAgICAgICAgICAgIGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgICAgICBtQ2FsbGJhY2sub25Sb3V0ZVJlbW92ZWQocm91dGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVDaGFuZ2VkKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIgcm91dGVyLAotICAgICAgICAgICAgICAgIGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgICAgICBtQ2FsbGJhY2sub25Sb3V0ZUNoYW5nZWQocm91dGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVHcm91cGVkKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIgcm91dGVyLAotICAgICAgICAgICAgICAgIGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlLAotICAgICAgICAgICAgICAgIGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVHcm91cCBncm91cCwgaW50IGluZGV4KSB7Ci0gICAgICAgICAgICBtQ2FsbGJhY2sub25Sb3V0ZUdyb3VwZWQocm91dGUsIGdyb3VwLCBpbmRleCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVVuZ3JvdXBlZChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyIHJvdXRlciwKLSAgICAgICAgICAgICAgICBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSwKLSAgICAgICAgICAgICAgICBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlR3JvdXAgZ3JvdXApIHsKLSAgICAgICAgICAgIG1DYWxsYmFjay5vblJvdXRlVW5ncm91cGVkKHJvdXRlLCBncm91cCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVZvbHVtZUNoYW5nZWQoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlciByb3V0ZXIsCi0gICAgICAgICAgICAgICAgYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgICAgIG1DYWxsYmFjay5vblJvdXRlVm9sdW1lQ2hhbmdlZChyb3V0ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGF0aWMgY2xhc3MgVm9sdW1lQ2FsbGJhY2tQcm94eTxUIGV4dGVuZHMgVm9sdW1lQ2FsbGJhY2s+Ci0gICAgICAgICAgICBleHRlbmRzIGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuVm9sdW1lQ2FsbGJhY2sgewotICAgICAgICBwcm90ZWN0ZWQgZmluYWwgVCBtQ2FsbGJhY2s7Ci0KLSAgICAgICAgcHVibGljIFZvbHVtZUNhbGxiYWNrUHJveHkoVCBjYWxsYmFjaykgewotICAgICAgICAgICAgbUNhbGxiYWNrID0gY2FsbGJhY2s7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Wb2x1bWVTZXRSZXF1ZXN0KGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlLAotICAgICAgICAgICAgICAgIGludCB2b2x1bWUpIHsKLSAgICAgICAgICAgIG1DYWxsYmFjay5vblZvbHVtZVNldFJlcXVlc3Qocm91dGUsIHZvbHVtZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Wb2x1bWVVcGRhdGVSZXF1ZXN0KGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlLAotICAgICAgICAgICAgICAgIGludCBkaXJlY3Rpb24pIHsKLSAgICAgICAgICAgIG1DYWxsYmFjay5vblZvbHVtZVVwZGF0ZVJlcXVlc3Qocm91dGUsIGRpcmVjdGlvbik7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFDb250cm9sSW50ZW50LmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFDb250cm9sSW50ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkOWU3NzcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhQ29udHJvbEludGVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIyOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWE7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwotCi0vKioKLSAqIENvbnN0YW50cyBmb3IgbWVkaWEgY29udHJvbCBpbnRlbnRzLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIGRlY2xhcmVzIGEgc2V0IG9mIHN0YW5kYXJkIG1lZGlhIGNvbnRyb2wgaW50ZW50IGNhdGVnb3JpZXMgYW5kIGFjdGlvbnMgdGhhdAotICogYXBwbGljYXRpb25zIGNhbiB1c2UgdG8gaWRlbnRpZnkgdGhlIGNhcGFiaWxpdGllcyBvZiBtZWRpYSByb3V0ZXMgYW5kIGNvbnRyb2wgdGhlbS4KLSAqIDwvcD4KLSAqCi0gKiA8aDM+TWVkaWEgY29udHJvbCBpbnRlbnQgY2F0ZWdvcmllczwvaDM+Ci0gKiA8cD4KLSAqIE1lZGlhIGNvbnRyb2wgaW50ZW50IGNhdGVnb3JpZXMgc3BlY2lmeSBtZWFucyBieSB3aGljaCBhcHBsaWNhdGlvbnMgY2FuCi0gKiBzZW5kIG1lZGlhIHRvIHRoZSBkZXN0aW5hdGlvbiBvZiBhIG1lZGlhIHJvdXRlLiAgQ2F0ZWdvcmllcyBhcmUgc29tZXRpbWVzIHJlZmVycmVkCi0gKiB0byBhcyBkZXNjcmliaW5nICJ0eXBlcyIgb3IgImtpbmRzIiBvZiByb3V0ZXMuCi0gKiA8L3A+PHA+Ci0gKiBGb3IgZXhhbXBsZSwgaWYgYSByb3V0ZSBzdXBwb3J0cyB0aGUge0BsaW5rICNDQVRFR09SWV9SRU1PVEVfUExBWUJBQ0sgcmVtb3RlIHBsYXliYWNrIGNhdGVnb3J5fSwKLSAqIHRoZW4gYW4gYXBwbGljYXRpb24gY2FuIGFzayBpdCB0byBwbGF5IG1lZGlhIHJlbW90ZWx5IGJ5IHNlbmRpbmcgYQotICoge0BsaW5rICNBQ1RJT05fUExBWSBwbGF5fSBvciB7QGxpbmsgI0FDVElPTl9FTlFVRVVFIGVucXVldWV9IGludGVudCB3aXRoIHRoZSBVcmkgb2YgdGhlCi0gKiBtZWRpYSBjb250ZW50IHRvIHBsYXkuICBTdWNoIGEgcm91dGUgbWF5IHRoZW4gYmUgcmVmZXJyZWQgdG8gYXMKLSAqIGEgInJlbW90ZSBwbGF5YmFjayByb3V0ZSIgYmVjYXVzZSBpdCBzdXBwb3J0cyByZW1vdGUgcGxheWJhY2sgcmVxdWVzdHMuICBJdCBpcyBjb21tb24KLSAqIGZvciBhIHJvdXRlIHRvIHN1cHBvcnQgbXVsdGlwbGUgY2F0ZWdvcmllcyBvZiByZXF1ZXN0cyBhdCB0aGUgc2FtZSB0aW1lLCBzdWNoIGFzCi0gKiBsaXZlIGF1ZGlvIGFuZCBsaXZlIHZpZGVvLgotICogPC9wPjxwPgotICogVGhlIGZvbGxvd2luZyBzdGFuZGFyZCByb3V0ZSBjYXRlZ29yaWVzIGFyZSBkZWZpbmVkLgotICogPC9wPjx1bD4KLSAqIDxsaT57QGxpbmsgI0NBVEVHT1JZX0xJVkVfQVVESU8gTGl2ZSBhdWRpb306IFRoZSByb3V0ZSBzdXBwb3J0cyBzdHJlYW1pbmcgbGl2ZSBhdWRpbwotICogZnJvbSB0aGUgZGV2aWNlIHRvIHRoZSBkZXN0aW5hdGlvbi4gIExpdmUgYXVkaW8gcm91dGVzIGluY2x1ZGUgbG9jYWwgc3BlYWtlcnMKLSAqIGFuZCBCbHVldG9vdGggaGVhZHNldHMuCi0gKiA8bGk+e0BsaW5rICNDQVRFR09SWV9MSVZFX1ZJREVPIExpdmUgdmlkZW99OiBUaGUgcm91dGUgc3VwcG9ydHMgc3RyZWFtaW5nIGxpdmUgdmlkZW8KLSAqIGZyb20gdGhlIGRldmljZSB0byB0aGUgZGVzdGluYXRpb24uICBMaXZlIHZpZGVvIHJvdXRlcyBpbmNsdWRlIGxvY2FsIGRpc3BsYXlzCi0gKiBhbmQgd2lyZWxlc3MgZGlzcGxheXMgdGhhdCBzdXBwb3J0IG1pcnJvcmluZyBhbmQKLSAqIHtAbGluayBhbmRyb2lkLmFwcC5QcmVzZW50YXRpb24gcHJlc2VudGF0aW9uc30uICBMaXZlIHZpZGVvIHJvdXRlcyB0eXBpY2FsbHkgYWxzbwotICogc3VwcG9ydCBsaXZlIGF1ZGlvIGNhcGFiaWxpdGllcy4KLSAqIDxsaT57QGxpbmsgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSyBSZW1vdGUgcGxheWJhY2t9OiBUaGUgcm91dGUgc3VwcG9ydHMgc2VuZGluZwotICogcmVtb3RlIHBsYXliYWNrIHJlcXVlc3RzIGZvciBtZWRpYSBjb250ZW50IHRvIHRoZSBkZXN0aW5hdGlvbi4gIFRoZSBjb250ZW50IHRvIGJlCi0gKiBwbGF5ZWQgaXMgaWRlbnRpZmllZCBieSBhIFVyaSBhbmQgbWltZS10eXBlLgotICogPC91bD48cD4KLSAqIE1lZGlhIHJvdXRlIHByb3ZpZGVycyBtYXkgZGVmaW5lIGN1c3RvbSBtZWRpYSBjb250cm9sIGludGVudCBjYXRlZ29yaWVzIG9mIHRoZWlyIG93biBpbgotICogYWRkaXRpb24gdG8gdGhlIHN0YW5kYXJkIG9uZXMuICBDdXN0b20gY2F0ZWdvcmllcyBjYW4gYmUgdXNlZCB0byBwcm92aWRlIGEgdmFyaWV0eQotICogb2YgZmVhdHVyZXMgdG8gYXBwbGljYXRpb25zIHRoYXQgcmVjb2duaXplIGFuZCBrbm93IGhvdyB0byB1c2UgdGhlbS4gIEZvciBleGFtcGxlLAotICogYSBtZWRpYSByb3V0ZSBwcm92aWRlciBtaWdodCBkZWZpbmUgYSBjdXN0b20gY2F0ZWdvcnkgdG8gaW5kaWNhdGUgdGhhdCBpdHMgcm91dGVzCi0gKiBzdXBwb3J0IGEgc3BlY2lhbCBkZXZpY2Utc3BlY2lmaWMgY29udHJvbCBpbnRlcmZhY2UgaW4gYWRkaXRpb24gdG8gb3RoZXIKLSAqIHN0YW5kYXJkIGZlYXR1cmVzLgotICogPC9wPjxwPgotICogQXBwbGljYXRpb25zIGNhbiBkZXRlcm1pbmUgd2hpY2ggY2F0ZWdvcmllcyBhIHJvdXRlIHN1cHBvcnRzIGJ5IHVzaW5nIHRoZQotICoge0BsaW5rIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNzdXBwb3J0c0NvbnRyb2xDYXRlZ29yeSBNZWRpYVJvdXRlci5Sb3V0ZUluZm8uc3VwcG9ydHNDb250cm9sQ2F0ZWdvcnl9Ci0gKiBvciB7QGxpbmsgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI2dldENvbnRyb2xGaWx0ZXJzIE1lZGlhUm91dGVyLlJvdXRlSW5mby5nZXRDb250cm9sRmlsdGVyc30KLSAqIG1ldGhvZHMuICBBcHBsaWNhdGlvbnMgY2FuIGFsc28gc3BlY2lmeSB0aGUgdHlwZXMgb2Ygcm91dGVzIHRoYXQgdGhleSB3YW50IHRvIHVzZSBieQotICogY3JlYXRpbmcge0BsaW5rIE1lZGlhUm91dGVTZWxlY3RvciBtZWRpYSByb3V0ZSBzZWxlY3RvcnN9IHRoYXQgY29udGFpbiB0aGUgZGVzaXJlZAotICogY2F0ZWdvcmllcyBhbmQgYXJlIHVzZWQgdG8gZmlsdGVyIHJvdXRlcyBpbiBzZXZlcmFsIHBhcnRzIG9mIHRoZSBtZWRpYSByb3V0ZXIgQVBJLgotICogPC9wPgotICoKLSAqIDxoMz5NZWRpYSBjb250cm9sIGludGVudCBhY3Rpb25zPC9oMz4KLSAqIDxwPgotICogTWVkaWEgY29udHJvbCBpbnRlbnQgYWN0aW9ucyBzcGVjaWZ5IHBhcnRpY3VsYXIgZnVuY3Rpb25zIHRoYXQgYXBwbGljYXRpb25zCi0gKiBjYW4gYXNrIHRoZSBkZXN0aW5hdGlvbiBvZiBhIG1lZGlhIHJvdXRlIHRvIHBlcmZvcm0uICBNZWRpYSByb3V0ZSBjb250cm9sIHJlcXVlc3RzCi0gKiB0YWtlIHRoZSBmb3JtIG9mIGludGVudHMgaW4gYSBzaW1pbGFyIG1hbm5lciB0byBvdGhlciBpbnRlbnRzIHVzZWQgdG8gc3RhcnQgYWN0aXZpdGllcwotICogb3Igc2VuZCBicm9hZGNhc3RzLiAgVGhlIGRpZmZlcmVuY2UgaXMgdGhhdCBtZWRpYSBjb250cm9sIGludGVudHMgYXJlIGRpcmVjdGVkIHRvCi0gKiByb3V0ZXMgcmF0aGVyIHRoYW4gYWN0aXZpdHkgb3IgYnJvYWRjYXN0IHJlY2VpdmVyIGNvbXBvbmVudHMuCi0gKiA8L3A+PHA+Ci0gKiBFYWNoIG1lZGlhIHJvdXRlIGNvbnRyb2wgaW50ZW50IHNwZWNpZmllcyBhbiBhY3Rpb24sIGEgY2F0ZWdvcnkgYW5kIHNvbWUgbnVtYmVyIG9mIHBhcmFtZXRlcnMKLSAqIHRoYXQgYXJlIHN1cHBsaWVkIGFzIGV4dHJhcy4gIEFwcGxpY2F0aW9ucyBzZW5kIG1lZGlhIGNvbnRyb2wgcmVxdWVzdHMgdG8gcm91dGVzIHVzaW5nIHRoZQotICoge0BsaW5rIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNzZW5kQ29udHJvbFJlcXVlc3QgTWVkaWFSb3V0ZXIuUm91dGVJbmZvLnNlbmRDb250cm9sUmVxdWVzdH0KLSAqIG1ldGhvZCBhbmQgcmVjZWl2ZSByZXN1bHRzIHZpYSBhIGNhbGxiYWNrLgotICogPC9wPjxwPgotICogQWxsIG1lZGlhIGNvbnRyb2wgaW50ZW50IGFjdGlvbnMgYXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbWVkaWEgY29udHJvbCBpbnRlbnQgY2F0ZWdvcmllcwotICogdGhhdCBzdXBwb3J0IHRoZW0uICBUaHVzIG9ubHkgcmVtb3RlIHBsYXliYWNrIHJvdXRlcyBtYXkgcGVyZm9ybSByZW1vdGUgcGxheWJhY2sgYWN0aW9ucy4KLSAqIFRoZSBkb2N1bWVudGF0aW9uIG9mIGVhY2ggYWN0aW9uIHNwZWNpZmllcyB0aGUgY2F0ZWdvcnkgdG8gd2hpY2ggdGhlIGFjdGlvbiBiZWxvbmdzLAotICogdGhlIHBhcmFtZXRlcnMgaXQgcmVxdWlyZXMsIGFuZCB0aGUgcmVzdWx0cyBpdCByZXR1cm5zLgotICogPC9wPgotICoKLSAqIDxoMz5MaXZlIGF1ZGlvIGFuZCBsaXZlIHZpZGVvIHJvdXRlczwvaDM+Ci0gKiA8cD4KLSAqIHtAbGluayAjQ0FURUdPUllfTElWRV9BVURJTyBMaXZlIGF1ZGlvfSBhbmQge0BsaW5rICNDQVRFR09SWV9MSVZFX1ZJREVPIGxpdmUgdmlkZW99Ci0gKiByb3V0ZXMgcHJlc2VudCBtZWRpYSB1c2luZyBzdGFuZGFyZCBzeXN0ZW0gaW50ZXJmYWNlcyBzdWNoIGFzIGF1ZGlvIHN0cmVhbXMsCi0gKiB7QGxpbmsgYW5kcm9pZC5hcHAuUHJlc2VudGF0aW9uIHByZXNlbnRhdGlvbnN9IG9yIGRpc3BsYXkgbWlycm9yaW5nLiAgVGhlc2Ugcm91dGVzIGFyZQotICogdGhlIGVhc2llc3QgdG8gdXNlIGJlY2F1c2UgYXBwbGljYXRpb25zIHNpbXBseSByZW5kZXIgY29udGVudCBsb2NhbGx5IG9uIHRoZSBkZXZpY2UKLSAqIGFuZCB0aGUgc3lzdGVtIHN0cmVhbXMgaXQgdG8gdGhlIHJvdXRlIGRlc3RpbmF0aW9uIGF1dG9tYXRpY2FsbHkuCi0gKiA8L3A+PHA+Ci0gKiBJbiBtb3N0IGNhc2VzLCBhcHBsaWNhdGlvbnMgY2FuIHN0cmVhbSBjb250ZW50IHRvIGxpdmUgYXVkaW8gYW5kIGxpdmUgdmlkZW8gcm91dGVzIGluCi0gKiB0aGUgc2FtZSB3YXkgdGhleSB3b3VsZCBwbGF5IHRoZSBjb250ZW50IGxvY2FsbHkgd2l0aG91dCBhbnkgbW9kaWZpY2F0aW9uLiAgSG93ZXZlciwKLSAqIGFwcGxpY2F0aW9ucyBtYXkgYWxzbyBiZSBhYmxlIHRvIHRha2UgYWR2YW50YWdlIG9mIG1vcmUgc29waGlzdGljYXRlZCBmZWF0dXJlcyBzdWNoCi0gKiBhcyBzZWNvbmQtc2NyZWVuIHByZXNlbnRhdGlvbiBBUElzIHRoYXQgYXJlIHBhcnRpY3VsYXIgdG8gdGhlc2Ugcm91dGVzLgotICogPC9wPgotICoKLSAqIDxoMz5SZW1vdGUgcGxheWJhY2sgcm91dGVzPC9oMz4KLSAqIDxwPgotICoge0BsaW5rICNDQVRFR09SWV9SRU1PVEVfUExBWUJBQ0sgUmVtb3RlIHBsYXliYWNrfSByb3V0ZXMgcHJlc2VudCBtZWRpYSByZW1vdGVseQotICogYnkgcGxheWluZyBjb250ZW50IGZyb20gYSBVcmkuCi0gKiBUaGVzZSByb3V0ZXMgZGVzdGluYXRpb25zIHRha2UgcmVzcG9uc2liaWxpdHkgZm9yIGZldGNoaW5nIGFuZCByZW5kZXJpbmcgY29udGVudAotICogb24gdGhlaXIgb3duLiAgQXBwbGljYXRpb25zIGRvIG5vdCByZW5kZXIgdGhlIGNvbnRlbnQgdGhlbXNlbHZlczsgaW5zdGVhZCwgYXBwbGljYXRpb25zCi0gKiBzZW5kIGNvbnRyb2wgcmVxdWVzdHMgdG8gaW5pdGlhdGUgcGxheSwgcGF1c2UsIHJlc3VtZSwgb3Igc3RvcCBtZWRpYSBpdGVtcyBhbmQgcmVjZWl2ZQotICogc3RhdHVzIHVwZGF0ZXMgYXMgdGhleSBjaGFuZ2Ugc3RhdGUuCi0gKiA8L3A+Ci0gKgotICogPGg0PlNlc3Npb25zPC9oND4KLSAqIDxwPgotICogRWFjaCByZW1vdGUgbWVkaWEgcGxheWJhY2sgYWN0aW9uIGlzIGNvbmR1Y3RlZCB3aXRoaW4gdGhlIHNjb3BlIG9mIGEgc2Vzc2lvbi4KLSAqIFNlc3Npb25zIGFyZSB1c2VkIHRvIHByZXZlbnQgYXBwbGljYXRpb25zIGZyb20gYWNjaWRlbnRhbGx5IGludGVyZmVyaW5nIHdpdGggb25lCi0gKiBhbm90aGVyIGJlY2F1c2UgYXQgbW9zdCBvbmUgc2Vzc2lvbiBjYW4gYmUgdmFsaWQgYXQgYSB0aW1lLgotICogPC9wPjxwPgotICogQSBzZXNzaW9uIGNhbiBiZSBjcmVhdGVkIHVzaW5nIHRoZSB7QGxpbmsgI0FDVElPTl9TVEFSVF9TRVNTSU9OIHN0YXJ0IHNlc3Npb24gYWN0aW9ufQotICogYW5kIHRlcm1pbmF0ZWQgdXNpbmcgdGhlIHtAbGluayAjQUNUSU9OX0VORF9TRVNTSU9OIGVuZCBzZXNzaW9uIGFjdGlvbn0gd2hlbiB0aGUKLSAqIHJvdXRlIHByb3ZpZGVzIGV4cGxpY2l0IHNlc3Npb24gbWFuYWdlbWVudCBmZWF0dXJlcy4KLSAqIDwvcD48cD4KLSAqIEV4cGxpY2l0IHNlc3Npb24gbWFuYWdlbWVudCB3YXMgYWRkZWQgaW4gYSBsYXRlciByZXZpc2lvbiBvZiB0aGUgcHJvdG9jb2wgc28gbm90Ci0gKiBhbGwgcm91dGVzIHN1cHBvcnQgaXQuICBJZiB0aGUgcm91dGUgZG9lcyBub3Qgc3VwcG9ydCBleHBsaWNpdCBzZXNzaW9uIG1hbmFnZW1lbnQKLSAqIHRoZW4gaW1wbGljaXQgc2Vzc2lvbiBtYW5hZ2VtZW50IG1heSBzdGlsbCBiZSB1c2VkLiAgSW1wbGljaXQgc2Vzc2lvbiBtYW5hZ2VtZW50Ci0gKiByZWxpZXMgb24gdGhlIHVzZSBvZiB0aGUge0BsaW5rICNBQ1RJT05fUExBWSBwbGF5fSBhbmQge0BsaW5rICNBQ1RJT05fRU5RVUVVRSBlbnF1ZXVlfQotICogYWN0aW9ucyB3aGljaCBoYXZlIHRoZSBzaWRlLWVmZmVjdCBvZiBjcmVhdGluZyBhIG5ldyBzZXNzaW9uIGlmIG5vbmUgaXMgcHJvdmlkZWQKLSAqIGFzIGFyZ3VtZW50LgotICogPC9wPjxwPgotICogV2hlbiBhIG5ldyBzZXNzaW9uIGlzIGNyZWF0ZWQsIHRoZSBwcmV2aW91cyBzZXNzaW9uIGlzIGludmFsaWRhdGVkIGFuZCBhbnkgb25nb2luZwotICogbWVkaWEgcGxheWJhY2sgaXMgc3RvcHBlZCBiZWZvcmUgdGhlIHJlcXVlc3RlZCBhY3Rpb24gaXMgcGVyZm9ybWVkLiAgQW55IGF0dGVtcHQKLSAqIHRvIHVzZSBhbiBpbnZhbGlkYXRlZCBzZXNzaW9uIHdpbGwgcmVzdWx0IGluIGFuIGVycm9yLiAgKFByb3RvY29sIGltcGxlbWVudGF0aW9ucwotICogYXJlIGVuY291cmFnZWQgdG8gYWdncmVzc2l2ZWx5IGRpc2NhcmQgaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIGludmFsaWRhdGVkIHNlc3Npb25zCi0gKiBzaW5jZSBpdCBpcyBubyBsb25nZXIgb2YgdXNlLikKLSAqIDwvcD48cD4KLSAqIEVhY2ggc2Vzc2lvbiBpcyBpZGVudGlmaWVkIGJ5IGEgdW5pcXVlIHNlc3Npb24gaWQgdGhhdCBtYXkgYmUgdXNlZCB0byBjb250cm9sCi0gKiB0aGUgc2Vzc2lvbiB1c2luZyBhY3Rpb25zIHN1Y2ggYXMgcGF1c2UsIHJlc3VtZSwgc3RvcCBhbmQgZW5kIHNlc3Npb24uCi0gKiA8L3A+Ci0gKgotICogPGg0Pk1lZGlhIGl0ZW1zPC9oND4KLSAqIDxwPgotICogRWFjaCBzdWNjZXNzZnVsIHtAbGluayAjQUNUSU9OX1BMQVkgcGxheX0gb3Ige0BsaW5rICNBQ1RJT05fRU5RVUVVRSBlbnF1ZXVlfSBhY3Rpb24KLSAqIHJldHVybnMgYSB1bmlxdWUgbWVkaWEgaXRlbSBpZCB0aGF0IGFuIGFwcGxpY2F0aW9uIGNhbiB1c2UgdG8gbW9uaXRvciBhbmQgY29udHJvbAotICogcGxheWJhY2suICBUaGUgbWVkaWEgaXRlbSBpZCBtYXkgYmUgcGFzc2VkIHRvIG90aGVyIGFjdGlvbnMgc3VjaCBhcwotICoge0BsaW5rICNBQ1RJT05fU0VFSyBzZWVrfSBvciB7QGxpbmsgI0FDVElPTl9HRVRfU1RBVFVTIGdldCBzdGF0dXN9LiAgSXQgd2lsbCBhbHNvIGFwcGVhcgotICogYXMgYSBwYXJhbWV0ZXIgaW4gc3RhdHVzIHVwZGF0ZSBicm9hZGNhc3RzIHRvIGlkZW50aWZ5IHRoZSBhc3NvY2lhdGVkIHBsYXliYWNrIHJlcXVlc3QuCi0gKiA8L3A+PHA+Ci0gKiBFYWNoIG1lZGlhIGl0ZW0gaXMgc2NvcGVkIHRvIHRoZSBzZXNzaW9uIGluIHdoaWNoIGl0IHdhcyBjcmVhdGVkLiAgVGhlcmVmb3JlIG1lZGlhIGl0ZW0KLSAqIGlkcyBhcmUgb25seSBldmVyIHVzZWQgdG9nZXRoZXIgd2l0aCBzZXNzaW9uIGlkcy4gIE1lZGlhIGl0ZW0gaWRzIGFyZSBtZWFuaW5nbGVzcwotICogb24gdGhlaXIgb3duLiAgV2hlbiB0aGUgc2Vzc2lvbiBpcyBpbnZhbGlkYXRlZCwgYWxsIG9mIGl0cyBtZWRpYSBpdGVtcyBhcmUgYWxzbwotICogaW52YWxpZGF0ZWQuCi0gKiA8L3A+Ci0gKgotICogPGg0PlRoZSBwbGF5YmFjayBxdWV1ZTwvaDQ+Ci0gKiA8cD4KLSAqIEVhY2ggc2Vzc2lvbiBoYXMgaXRzIG93biBwbGF5YmFjayBxdWV1ZSB0aGF0IGNvbnNpc3RzIG9mIHRoZSBtZWRpYSBpdGVtcyB0aGF0Ci0gKiBhcmUgcGVuZGluZywgcGxheWluZywgYnVmZmVyaW5nIG9yIHBhdXNlZC4gIEl0ZW1zIGFyZSBhZGRlZCB0byB0aGUgcXVldWUgd2hlbgotICogYSBwbGF5YmFjayByZXF1ZXN0IGlzIGlzc3VlZC4gIEl0ZW1zIGFyZSByZW1vdmVkIGZyb20gdGhlIHF1ZXVlIHdoZW4gdGhleSBhcmUgbm8KLSAqIGxvbmdlciBlbGlnaWJsZSBmb3IgcGxheWJhY2sgKGVudGVyIHRlcm1pbmFsIHN0YXRlcykuCi0gKiA8L3A+PHA+Ci0gKiBBcyBkZXNjcmliZWQgaW4gdGhlIHtAbGluayBNZWRpYUl0ZW1TdGF0dXN9IGNsYXNzLCBtZWRpYSBpdGVtcyBpbml0aWFsbHkKLSAqIHN0YXJ0IGluIGEgcGVuZGluZyBzdGF0ZSwgdHJhbnNpdGlvbiB0byB0aGUgcGxheWluZyAob3IgYnVmZmVyaW5nIG9yIHBhdXNlZCkgc3RhdGUKLSAqIGR1cmluZyBwbGF5YmFjaywgYW5kIGVuZCBpbiBhIGZpbmlzaGVkLCBjYW5jZWxlZCwgaW52YWxpZGF0ZWQgb3IgZXJyb3Igc3RhdGUuCi0gKiBPbmNlIHRoZSBjdXJyZW50IGl0ZW0gZW50ZXJzIGEgdGVybWluYWwgc3RhdGUsIHBsYXliYWNrIHByb2NlZWRzIG9uIHRvIHRoZQotICogbmV4dCBpdGVtLgotICogPC9wPjxwPgotICogVGhlIGFwcGxpY2F0aW9uIHNob3VsZCBkZXRlcm1pbmUgd2hldGhlciB0aGUgcm91dGUgc3VwcG9ydHMgcXVldWluZyBieSBjaGVja2luZwotICogd2hldGhlciB0aGUge0BsaW5rICNBQ1RJT05fRU5RVUVVRX0gYWN0aW9uIGlzIGRlY2xhcmVkIGluIHRoZSByb3V0ZSdzIGNvbnRyb2wgZmlsdGVyCi0gKiB1c2luZyB7QGxpbmsgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI3N1cHBvcnRzQ29udHJvbFJlcXVlc3QgUm91dGVJbmZvLnN1cHBvcnRzQ29udHJvbFJlcXVlc3R9LgotICogPC9wPjxwPgotICogSWYgdGhlIHtAbGluayAjQUNUSU9OX0VOUVVFVUV9IGFjdGlvbiBpcyBzdXBwb3J0ZWQgYnkgdGhlIHJvdXRlLCB0aGVuIHRoZSByb3V0ZSBwcm9taXNlcwotICogdG8gYWxsb3cgYXQgbGVhc3QgdHdvIGl0ZW1zIChwb3NzaWJseSBtb3JlKSB0byBiZSBlbnF1ZXVlZCBhdCBhIHRpbWUuICBFbnF1ZXVlZCBpdGVtcyBwbGF5Ci0gKiBiYWNrIHRvIGJhY2sgb25lIGFmdGVyIHRoZSBvdGhlciBhcyB0aGUgcHJldmlvdXMgaXRlbSBjb21wbGV0ZXMuICBJZGVhbGx5IHRoZXJlIHNob3VsZAotICogYmUgbm8gYXVkaWJsZSBwYXVzZSBiZXR3ZWVuIGl0ZW1zIGZvciBzdGFuZGFyZCBhdWRpbyBjb250ZW50IHR5cGVzLgotICogPC9wPjxwPgotICogSWYgdGhlIHtAbGluayAjQUNUSU9OX0VOUVVFVUV9IGFjdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSByb3V0ZSwgdGhlbiB0aGUgcXVldWUKLSAqIGVmZmVjdGl2ZWx5IGNvbnRhaW5zIGF0IG1vc3Qgb25lIGl0ZW0gYXQgYSB0aW1lLiAgRWFjaCBwbGF5IGFjdGlvbiBoYXMgdGhlIGVmZmVjdCBvZgotICogY2xlYXJpbmcgdGhlIHF1ZXVlIGFuZCByZXNldHRpbmcgaXRzIHN0YXRlIGJlZm9yZSB0aGUgbmV4dCBpdGVtIGlzIHBsYXllZC4KLSAqIDwvcD4KLSAqCi0gKiA8aDQ+SW1wYWN0IG9mIHBhdXNlLCByZXN1bWUsIHN0b3AgYW5kIHBsYXkgYWN0aW9ucyBvbiB0aGUgcGxheWJhY2sgcXVldWU8L2g0PgotICogPHA+Ci0gKiBUaGUgcGF1c2UsIHJlc3VtZSBhbmQgc3RvcCBhY3Rpb25zIGFmZmVjdCB0aGUgc2Vzc2lvbidzIHdob2xlIHF1ZXVlLiAgUGF1c2UgY2F1c2VzCi0gKiB0aGUgcGxheWJhY2sgcXVldWUgdG8gYmUgc3VzcGVuZGVkIG5vIG1hdHRlciB3aGljaCBpdGVtIGlzIGN1cnJlbnRseSBwbGF5aW5nLgotICogUmVzdW1lIHJldmVyc2VzIHRoZSBlZmZlY3RzIG9mIHBhdXNlLiAgU3RvcCBjbGVhcnMgdGhlIHF1ZXVlIGFuZCBhbHNvIHJlc2V0cwotICogdGhlIHBhdXNlIGZsYWcganVzdCBsaWtlIHJlc3VtZS4KLSAqIDwvcD48cD4KLSAqIEFzIGRlc2NyaWJlZCBlYXJsaWVyLCB0aGUgcGxheSBhY3Rpb24gaGFzIHRoZSBlZmZlY3Qgb2YgY2xlYXJpbmcgdGhlIHF1ZXVlCi0gKiBhbmQgY29tcGxldGVseSByZXNldHRpbmcgaXRzIHN0YXRlIChsaWtlIHRoZSBzdG9wIGFjdGlvbikgdGhlbiBlbnF1ZXVpbmcgYQotICogbmV3IG1lZGlhIGl0ZW0gdG8gYmUgcGxheWVkIGltbWVkaWF0ZWx5LiAgUGxheSBpcyB0aGVyZWZvcmUgZXF1aXZhbGVudAotICogdG8gc3RvcCBmb2xsb3dlZCBieSBhbiBhY3Rpb24gdG8gZW5xdWV1ZSBhbiBpdGVtLgotICogPC9wPjxwPgotICogVGhlIHBsYXkgYWN0aW9uIGlzIGFsc28gc3BlY2lhbCBpbiB0aGF0IGl0IGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBuZXcgc2Vzc2lvbnMuCi0gKiBBbiBhcHBsaWNhdGlvbiB3aXRoIHNpbXBsZSBuZWVkcyBtYXkgZmluZCB0aGF0IGl0IG9ubHkgbmVlZHMgdG8gdXNlIHBsYXkKLSAqIChhbmQgb2NjYXNpb25hbGx5IHN0b3ApIHRvIGNvbnRyb2wgcGxheWJhY2suCi0gKiA8L3A+Ci0gKgotICogPGg0PlJlc29sdmluZyBjb25mbGljdHMgYmV0d2VlbiBhcHBsaWNhdGlvbnM8L2g0PgotICogPHA+Ci0gKiBXaGVuIGFuIGFwcGxpY2F0aW9uIGhhcyBhIHZhbGlkIHNlc3Npb24sIGl0IGlzIGVzc2VudGlhbGx5IGluIGNvbnRyb2wgb2YgcmVtb3RlIHBsYXliYWNrCi0gKiBvbiB0aGUgcm91dGUuICBObyBvdGhlciBhcHBsaWNhdGlvbiBjYW4gdmlldyBvciBtb2RpZnkgdGhlIHJlbW90ZSBwbGF5YmFjayBzdGF0ZQotICogb2YgdGhhdCBhcHBsaWNhdGlvbidzIHNlc3Npb24gd2l0aG91dCBrbm93aW5nIGl0cyBpZC4KLSAqIDwvcD48cD4KLSAqIEhvd2V2ZXIsIG90aGVyIGFwcGxpY2F0aW9ucyBjYW4gcGVyZm9ybSBhY3Rpb25zIHRoYXQgaGF2ZSB0aGUgZWZmZWN0IG9mIHN0b3BwaW5nCi0gKiBwbGF5YmFjayBhbmQgaW52YWxpZGF0aW5nIHRoZSBjdXJyZW50IHNlc3Npb24uICBXaGVuIHRoaXMgb2NjdXJzLCB0aGUgZm9ybWVyIGFwcGxpY2F0aW9uCi0gKiB3aWxsIGJlIGluZm9ybWVkIHRoYXQgaXQgaGFzIGxvc3QgY29udHJvbCBieSB3YXkgb2YgaW5kaXZpZHVhbCBtZWRpYSBpdGVtIHN0YXR1cwotICogdXBkYXRlIGJyb2FkY2FzdHMgdGhhdCBpbmRpY2F0ZSB0aGF0IGl0cyBxdWV1ZWQgbWVkaWEgaXRlbXMgaGF2ZSBiZWNvbWUKLSAqIHtAbGluayBNZWRpYUl0ZW1TdGF0dXMjUExBWUJBQ0tfU1RBVEVfSU5WQUxJREFURUQgaW52YWxpZGF0ZWR9LiAgVGhpcyBicm9hZGNhc3QKLSAqIGltcGxpZXMgdGhhdCBwbGF5YmFjayB3YXMgdGVybWluYXRlZCBhYm5vcm1hbGx5IGJ5IGFuIGV4dGVybmFsIGNhdXNlLgotICogPC9wPjxwPgotICogQXBwbGljYXRpb25zIHNob3VsZCBoYW5kbGUgY29uZmxpY3RzIGNvbnNlcnZhdGl2ZWx5IHRvIGFsbG93IG90aGVyIGFwcGxpY2F0aW9ucyB0bwotICogc21vb3RobHkgYXNzdW1lIGNvbnRyb2wgb3ZlciB0aGUgcm91dGUuICBXaGVuIGEgY29uZmxpY3Qgb2NjdXJzLCB0aGUgY3VycmVudGx5IHBsYXlpbmcKLSAqIGFwcGxpY2F0aW9uIHNob3VsZCByZWxlYXNlIGl0cyBzZXNzaW9uIGFuZCBhbGxvdyB0aGUgbmV3IGFwcGxpY2F0aW9uIHRvIHVzZSB0aGUKLSAqIHJvdXRlIHVudGlsIHN1Y2ggdGltZSBhcyB0aGUgdXNlciBpbnRlcnZlbmVzIHRvIHRha2Ugb3ZlciB0aGUgcm91dGUgYWdhaW4gYW5kIGJlZ2luCi0gKiBhIG5ldyBwbGF5YmFjayBzZXNzaW9uLgotICogPC9wPgotICoKLSAqIDxoND5CYXNpYyBhY3Rpb25zPC9oND4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBiYXNpYyBhY3Rpb25zIG11c3QgYmUgc3VwcG9ydGVkIChhbGwgb3Igbm90aGluZykgYnkgYWxsIHJlbW90ZQotICogcGxheWJhY2sgcm91dGVzLiAgVGhlc2UgYWN0aW9ucyBmb3JtIHRoZSBiYXNpcyBvZiB0aGUgcmVtb3RlIHBsYXliYWNrIHByb3RvY29sCi0gKiBhbmQgYXJlIHJlcXVpcmVkIGluIGFsbCBpbXBsZW1lbnRhdGlvbnMuCi0gKiA8L3A+PHVsPgotICogPGxpPntAbGluayAjQUNUSU9OX1BMQVkgUGxheX06IFN0YXJ0cyBwbGF5aW5nIGNvbnRlbnQgc3BlY2lmaWVkIGJ5IGEgZ2l2ZW4gVXJpCi0gKiBhbmQgcmV0dXJucyBhIG5ldyBtZWRpYSBpdGVtIGlkIHRvIGRlc2NyaWJlIHRoZSByZXF1ZXN0LiAgSW1wbGljaXRseSBjcmVhdGVzIGEgbmV3Ci0gKiBzZXNzaW9uIGlmIG5vIHNlc3Npb24gaWQgd2FzIHNwZWNpZmllZCBhcyBhIHBhcmFtZXRlci4KLSAqIDxsaT57QGxpbmsgI0FDVElPTl9TRUVLIFNlZWt9OiBTZXRzIHRoZSBjb250ZW50IHBsYXliYWNrIHBvc2l0aW9uIG9mIGEgc3BlY2lmaWMgbWVkaWEgaXRlbS4KLSAqIDxsaT57QGxpbmsgI0FDVElPTl9HRVRfU1RBVFVTIEdldCBzdGF0dXN9OiBHZXRzIHRoZSBzdGF0dXMgb2YgYSBtZWRpYSBpdGVtCi0gKiBpbmNsdWRpbmcgdGhlIGl0ZW0ncyBjdXJyZW50IHBsYXliYWNrIHBvc2l0aW9uIGFuZCBwcm9ncmVzcy4KLSAqIDxsaT57QGxpbmsgI0FDVElPTl9QQVVTRSBQYXVzZX06IFBhdXNlcyBwbGF5YmFjayBvZiB0aGUgcXVldWUuCi0gKiA8bGk+e0BsaW5rICNBQ1RJT05fUkVTVU1FIFJlc3VtZX06IFJlc3VtZXMgcGxheWJhY2sgb2YgdGhlIHF1ZXVlLgotICogPGxpPntAbGluayAjQUNUSU9OX1NUT1AgU3RvcH06IFN0b3BzIHBsYXliYWNrLCBjbGVhcnMgdGhlIHF1ZXVlLCBhbmQgcmVzZXRzIHRoZQotICogcGF1c2Ugc3RhdGUuCi0gKiA8L3VsPgotICoKLSAqIDxoND5RdWV1ZSBhY3Rpb25zPC9oND4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBxdWV1ZSBhY3Rpb25zIG11c3QgYmUgc3VwcG9ydGVkIChhbGwgb3Igbm90aGluZykgYnkgcmVtb3RlCi0gKiBwbGF5YmFjayByb3V0ZXMgdGhhdCBvZmZlciBvcHRpb25hbCBxdWV1aW5nIGNhcGFiaWxpdGllcy4KLSAqIDwvcD48dWw+Ci0gKiA8bGk+e0BsaW5rICNBQ1RJT05fRU5RVUVVRSBFbnF1ZXVlfTogRW5xdWV1ZXMgY29udGVudCBzcGVjaWZpZWQgYnkgYSBnaXZlbiBVcmkKLSAqIGFuZCByZXR1cm5zIGEgbmV3IG1lZGlhIGl0ZW0gaWQgdG8gZGVzY3JpYmUgdGhlIHJlcXVlc3QuICBJbXBsaWNpdGx5IGNyZWF0ZXMgYSBuZXcKLSAqIHNlc3Npb24gaWYgbm8gc2Vzc2lvbiBpZCB3YXMgc3BlY2lmaWVkIGFzIGEgcGFyYW1ldGVyLgotICogPGxpPntAbGluayAjQUNUSU9OX1JFTU9WRSBSZW1vdmV9OiBSZW1vdmVzIGEgc3BlY2lmaWVkIG1lZGlhIGl0ZW0gZnJvbSB0aGUgcXVldWUuCi0gKiA8L3VsPgotICoKLSAqIDxoND5TZXNzaW9uIGFjdGlvbnM8L2g0PgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIHNlc3Npb24gYWN0aW9ucyBtdXN0IGJlIHN1cHBvcnRlZCAoYWxsIG9yIG5vdGhpbmcpIGJ5IHJlbW90ZQotICogcGxheWJhY2sgcm91dGVzIHRoYXQgb2ZmZXIgb3B0aW9uYWwgc2Vzc2lvbiBtYW5hZ2VtZW50IGNhcGFiaWxpdGllcy4KLSAqIDwvcD48dWw+Ci0gKiA8bGk+e0BsaW5rICNBQ1RJT05fU1RBUlRfU0VTU0lPTiBTdGFydCBzZXNzaW9ufTogU3RhcnRzIGEgbmV3IHNlc3Npb24gZXhwbGljaXRseS4KLSAqIDxsaT57QGxpbmsgI0FDVElPTl9HRVRfU0VTU0lPTl9TVEFUVVMgR2V0IHNlc3Npb24gc3RhdHVzfTogR2V0cyB0aGUgc3RhdHVzIG9mIGEgc2Vzc2lvbi4KLSAqIDxsaT57QGxpbmsgI0FDVElPTl9FTkRfU0VTU0lPTiBFbmQgc2Vzc2lvbn06IEVuZHMgYSBzZXNzaW9uIGV4cGxpY2l0bHkuCi0gKiA8L3VsPgotICoKLSAqIDxoND5JbXBsZW1lbnRhdGlvbiBub3RlPC9oND4KLSAqIDxwPgotICogSW1wbGVtZW50YXRpb25zIG9mIHRoZSByZW1vdGUgcGxheWJhY2sgcHJvdG9jb2wgbXVzdCBpbXBsZW1lbnQgPGVtPmFsbDwvZW0+IG9mIHRoZQotICogZG9jdW1lbnRlZCBhY3Rpb25zLCBwYXJhbWV0ZXJzIGFuZCByZXN1bHRzLiAgTm90ZSB0aGF0IHRoZSBkb2N1bWVudGF0aW9uIGlzIHdyaXR0ZW4gZnJvbQotICogdGhlIHBlcnNwZWN0aXZlIG9mIGEgY2xpZW50IG9mIHRoZSBwcm90b2NvbC4gIEluIHBhcnRpY3VsYXIsIHdoZW5ldmVyIGEgcGFyYW1ldGVyCi0gKiBpcyBkZXNjcmliZWQgYXMgYmVpbmcgIm9wdGlvbmFsIiwgaXQgaXMgb25seSBmcm9tIHRoZSBwZXJzcGVjdGl2ZSBvZiB0aGUgY2xpZW50LgotICogQ29tcGxpYW50IG1lZGlhIHJvdXRlIHByb3ZpZGVyIGltcGxlbWVudGF0aW9ucyBvZiB0aGlzIHByb3RvY29sIG11c3Qgc3VwcG9ydCBhbGwKLSAqIG9mIHRoZSBmZWF0dXJlcyBkZXNjcmliZWQgaGVyZWluLgotICogPC9wPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTWVkaWFDb250cm9sSW50ZW50IHsKLSAgICAvKiBSb3V0ZSBjYXRlZ29yaWVzLiAqLwotCi0gICAgLyoqCi0gICAgICogTWVkaWEgY29udHJvbCBjYXRlZ29yeTogTGl2ZSBhdWRpby4KLSAgICAgKiA8cD4KLSAgICAgKiBBIHJvdXRlIHRoYXQgc3VwcG9ydHMgbGl2ZSBhdWRpbyByb3V0aW5nIHdpbGwgYWxsb3cgdGhlIG1lZGlhIGF1ZGlvIHN0cmVhbQotICAgICAqIHRvIGJlIHNlbnQgdG8gc3VwcG9ydGVkIGRlc3RpbmF0aW9ucy4gIFRoaXMgY2FuIGluY2x1ZGUgaW50ZXJuYWwgc3BlYWtlcnMgb3IKLSAgICAgKiBhdWRpbyBqYWNrcyBvbiB0aGUgZGV2aWNlIGl0c2VsZiwgQTJEUCBkZXZpY2VzLCBhbmQgbW9yZS4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogV2hlbiBhIGxpdmUgYXVkaW8gcm91dGUgaXMgc2VsZWN0ZWQsIGF1ZGlvIHJvdXRpbmcgaXMgdHJhbnNwYXJlbnQgdG8gdGhlIGFwcGxpY2F0aW9uLgotICAgICAqIEFsbCBhdWRpbyBwbGF5ZWQgb24gdGhlIG1lZGlhIHN0cmVhbSB3aWxsIGJlIHJvdXRlZCB0byB0aGUgc2VsZWN0ZWQgZGVzdGluYXRpb24uCi0gICAgICogPC9wPjxwPgotICAgICAqIFJlZmVyIHRvIHRoZSBjbGFzcyBkb2N1bWVudGF0aW9uIGZvciBkZXRhaWxzIGFib3V0IGxpdmUgYXVkaW8gcm91dGVzLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQVRFR09SWV9MSVZFX0FVRElPID0gImFuZHJvaWQubWVkaWEuaW50ZW50LmNhdGVnb3J5LkxJVkVfQVVESU8iOwotCi0gICAgLyoqCi0gICAgICogTWVkaWEgY29udHJvbCBjYXRlZ29yeTogTGl2ZSB2aWRlby4KLSAgICAgKiA8cD4KLSAgICAgKiBBIHJvdXRlIHRoYXQgc3VwcG9ydHMgbGl2ZSB2aWRlbyByb3V0aW5nIHdpbGwgYWxsb3cgYSBtaXJyb3JlZCB2ZXJzaW9uCi0gICAgICogb2YgdGhlIGRldmljZSdzIHByaW1hcnkgZGlzcGxheSBvciBhIGN1c3RvbWl6ZWQKLSAgICAgKiB7QGxpbmsgYW5kcm9pZC5hcHAuUHJlc2VudGF0aW9uIFByZXNlbnRhdGlvbn0gdG8gYmUgc2VudCB0byBzdXBwb3J0ZWQKLSAgICAgKiBkZXN0aW5hdGlvbnMuCi0gICAgICogPC9wPjxwPgotICAgICAqIFdoZW4gYSBsaXZlIHZpZGVvIHJvdXRlIGlzIHNlbGVjdGVkLCBhdWRpbyBhbmQgdmlkZW8gcm91dGluZyBpcyB0cmFuc3BhcmVudAotICAgICAqIHRvIHRoZSBhcHBsaWNhdGlvbi4gIEJ5IGRlZmF1bHQsIGF1ZGlvIGFuZCB2aWRlbyBpcyByb3V0ZWQgdG8gdGhlIHNlbGVjdGVkCi0gICAgICogZGVzdGluYXRpb24uICBGb3IgY2VydGFpbiBsaXZlIHZpZGVvIHJvdXRlcywgdGhlIGFwcGxpY2F0aW9uIG1heSBhbHNvIHVzZSBhCi0gICAgICoge0BsaW5rIGFuZHJvaWQuYXBwLlByZXNlbnRhdGlvbiBQcmVzZW50YXRpb259IHRvIHJlcGxhY2UgdGhlIG1pcnJvcmVkIHZpZXcKLSAgICAgKiBvbiB0aGUgZXh0ZXJuYWwgZGlzcGxheSB3aXRoIGRpZmZlcmVudCBjb250ZW50LgotICAgICAqIDwvcD48cD4KLSAgICAgKiBSZWZlciB0byB0aGUgY2xhc3MgZG9jdW1lbnRhdGlvbiBmb3IgZGV0YWlscyBhYm91dCBsaXZlIHZpZGVvIHJvdXRlcy4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAc2VlIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNnZXRQcmVzZW50YXRpb25EaXNwbGF5KCkKLSAgICAgKiBAc2VlIGFuZHJvaWQuYXBwLlByZXNlbnRhdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBVEVHT1JZX0xJVkVfVklERU8gPSAiYW5kcm9pZC5tZWRpYS5pbnRlbnQuY2F0ZWdvcnkuTElWRV9WSURFTyI7Ci0KLSAgICAvKioKLSAgICAgKiBNZWRpYSBjb250cm9sIGNhdGVnb3J5OiBSZW1vdGUgcGxheWJhY2suCi0gICAgICogPHA+Ci0gICAgICogQSByb3V0ZSB0aGF0IHN1cHBvcnRzIHJlbW90ZSBwbGF5YmFjayByb3V0aW5nIHdpbGwgYWxsb3cgYW4gYXBwbGljYXRpb24gdG8gc2VuZAotICAgICAqIHJlcXVlc3RzIHRvIHBsYXkgY29udGVudCByZW1vdGVseSB0byBzdXBwb3J0ZWQgZGVzdGluYXRpb25zLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBSZW1vdGUgcGxheWJhY2sgcm91dGVzIGRlc3RpbmF0aW9ucyBvcGVyYXRlIGluZGVwZW5kZW50bHkgb2YgdGhlIGxvY2FsIGRldmljZS4KLSAgICAgKiBXaGVuIGEgcmVtb3RlIHBsYXliYWNrIHJvdXRlIGlzIHNlbGVjdGVkLCB0aGUgYXBwbGljYXRpb24gY2FuIGNvbnRyb2wgdGhlIGNvbnRlbnQKLSAgICAgKiBwbGF5aW5nIG9uIHRoZSBkZXN0aW5hdGlvbiBieSBzZW5kaW5nIG1lZGlhIGNvbnRyb2wgYWN0aW9ucyB0byB0aGUgcm91dGUuCi0gICAgICogVGhlIGFwcGxpY2F0aW9uIG1heSBhbHNvIHJlY2VpdmUgc3RhdHVzIHVwZGF0ZXMgZnJvbSB0aGUgcm91dGUgcmVnYXJkaW5nCi0gICAgICogcmVtb3RlIHBsYXliYWNrLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBSZWZlciB0byB0aGUgY2xhc3MgZG9jdW1lbnRhdGlvbiBmb3IgZGV0YWlscyBhYm91dCByZW1vdGUgcGxheWJhY2sgcm91dGVzLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI3NlbmRDb250cm9sUmVxdWVzdAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBVEVHT1JZX1JFTU9URV9QTEFZQkFDSyA9Ci0gICAgICAgICAgICAiYW5kcm9pZC5tZWRpYS5pbnRlbnQuY2F0ZWdvcnkuUkVNT1RFX1BMQVlCQUNLIjsKLQotICAgIC8qIFJlbW90ZSBwbGF5YmFjayBhY3Rpb25zIHRoYXQgYWZmZWN0IGluZGl2aWR1YWwgaXRlbXMuICovCi0KLSAgICAvKioKLSAgICAgKiBSZW1vdGUgcGxheWJhY2sgbWVkaWEgY29udHJvbCBhY3Rpb246IFBsYXkgbWVkaWEgaXRlbS4KLSAgICAgKiA8cD4KLSAgICAgKiBVc2VkIHdpdGggcm91dGVzIHRoYXQgc3VwcG9ydCB7QGxpbmsgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSyByZW1vdGUgcGxheWJhY2t9Ci0gICAgICogbWVkaWEgY29udHJvbC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhpcyBhY3Rpb24gY2F1c2VzIGEgcmVtb3RlIHBsYXliYWNrIHJvdXRlIHRvIHN0YXJ0IHBsYXlpbmcgY29udGVudCB3aXRoCi0gICAgICogdGhlIHtAbGluayBVcml9IHNwZWNpZmllZCBpbiB0aGUge0BsaW5rIEludGVudH0ncyB7QGxpbmsgSW50ZW50I2dldERhdGEoKSBkYXRhIHVyaX0uCi0gICAgICogVGhlIGFjdGlvbiByZXR1cm5zIGEgbWVkaWEgc2Vzc2lvbiBpZCBhbmQgbWVkaWEgaXRlbSBpZCB3aGljaCBjYW4gYmUgdXNlZAotICAgICAqIHRvIGNvbnRyb2wgcGxheWJhY2sgdXNpbmcgb3RoZXIgcmVtb3RlIHBsYXliYWNrIGFjdGlvbnMuCi0gICAgICogPC9wPjxwPgotICAgICAqIE9uY2UgaW5pdGlhdGVkLCBwbGF5YmFjayBvZiB0aGUgc3BlY2lmaWVkIGNvbnRlbnQgd2lsbCBiZSBtYW5hZ2VkIGluZGVwZW5kZW50bHkKLSAgICAgKiBieSB0aGUgZGVzdGluYXRpb24uICBUaGUgYXBwbGljYXRpb24gd2lsbCByZWNlaXZlIHN0YXR1cyB1cGRhdGVzIGFzIHRoZSBzdGF0ZQotICAgICAqIG9mIHRoZSBtZWRpYSBpdGVtIGNoYW5nZXMuCi0gICAgICogPC9wPjxwPgotICAgICAqIElmIHRoZSBkYXRhIHVyaSBzcGVjaWZpZXMgYW4gSFRUUCBvciBIVFRQUyBzY2hlbWUsIHRoZW4gdGhlIGRlc3RpbmF0aW9uIGlzCi0gICAgICogcmVzcG9uc2libGUgZm9yIGZvbGxvd2luZyBIVFRQIHJlZGlyZWN0cyB0byBhIHJlYXNvbmFibGUgZGVwdGggb2YgYXQgbGVhc3QgMwotICAgICAqIGxldmVscyBhcyBtaWdodCB0eXBpY2FsbHkgYmUgaGFuZGxlZCBieSBhIHdlYiBicm93c2VyLiAgSWYgYW4gSFRUUCBlcnJvcgotICAgICAqIG9jY3VycywgdGhlbiB0aGUgZGVzdGluYXRpb24gc2hvdWxkIHNlbmQgYSB7QGxpbmsgTWVkaWFJdGVtU3RhdHVzIHN0YXR1cyB1cGRhdGV9Ci0gICAgICogYmFjayB0byB0aGUgY2xpZW50IGluZGljYXRpbmcgdGhlIHtAbGluayBNZWRpYUl0ZW1TdGF0dXMjUExBWUJBQ0tfU1RBVEVfRVJST1IgZXJyb3J9Ci0gICAgICoge0BsaW5rIE1lZGlhSXRlbVN0YXR1cyNnZXRQbGF5YmFja1N0YXRlKCkgcGxheWJhY2sgc3RhdGV9LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIDxoMz5PbmUgaXRlbSBhdCBhIHRpbWU8L2gzPgotICAgICAqIDxwPgotICAgICAqIEVhY2ggc3VjY2Vzc2Z1bCBwbGF5IGFjdGlvbiA8ZW0+cmVwbGFjZXM8L2VtPiB0aGUgcHJldmlvdXMgcGxheSBhY3Rpb24uCi0gICAgICogSWYgYW4gaXRlbSBpcyBhbHJlYWR5IHBsYXlpbmcsIHRoZW4gaXQgaXMgY2FuY2VsZWQsIHRoZSBzZXNzaW9uJ3MgcGxheWJhY2sgcXVldWUKLSAgICAgKiBpcyBjbGVhcmVkIGFuZCB0aGUgbmV3IGl0ZW0gYmVnaW5zIHBsYXlpbmcgaW1tZWRpYXRlbHkgKHJlZ2FyZGxlc3Mgb2YKLSAgICAgKiB3aGV0aGVyIHRoZSBwcmV2aW91c2x5IHBsYXlpbmcgaXRlbSBoYWQgYmVlbiBwYXVzZWQpLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBQbGF5IGlzIHRoZXJlZm9yZSBlcXVpdmFsZW50IHRvIHtAbGluayAjQUNUSU9OX1NUT1Agc3RvcH0gZm9sbG93ZWQgYnkgYW4gYWN0aW9uCi0gICAgICogdG8gZW5xdWV1ZSBhIG5ldyBtZWRpYSBpdGVtIHRvIGJlIHBsYXllZCBpbW1lZGlhdGVseS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiA8aDM+U2Vzc2lvbnM8L2gzPgotICAgICAqIDxwPgotICAgICAqIFRoaXMgcmVxdWVzdCBoYXMgdGhlIGVmZmVjdCBvZiBpbXBsaWNpdGx5IGNyZWF0aW5nIGEgbWVkaWEgc2Vzc2lvbiB3aGVuZXZlciB0aGUKLSAgICAgKiBhcHBsaWNhdGlvbiBkb2VzIG5vdCBzcGVjaWZ5IHRoZSB7QGxpbmsgI0VYVFJBX1NFU1NJT05fSUQgc2Vzc2lvbiBpZH0gcGFyYW1ldGVyLgotICAgICAqIEJlY2F1c2UgdGhlcmUgY2FuIG9ubHkgYmUgYXQgbW9zdCBvbmUgdmFsaWQgc2Vzc2lvbiBhdCBhIHRpbWUsIGNyZWF0aW5nIGEgbmV3IHNlc3Npb24KLSAgICAgKiBoYXMgdGhlIHNpZGUtZWZmZWN0IG9mIGludmFsaWRhdGluZyBhbnkgZXhpc3Rpbmcgc2Vzc2lvbnMgYW5kIHRoZWlyIG1lZGlhIGl0ZW1zLAotICAgICAqIHRoZW4gaGFuZGxpbmcgdGhlIHBsYXliYWNrIHJlcXVlc3Qgd2l0aCBhIG5ldyBzZXNzaW9uLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBJZiB0aGUgYXBwbGljYXRpb24gc3BlY2lmaWVzIGFuIGludmFsaWQgc2Vzc2lvbiBpZCwgdGhlbiBhbiBlcnJvciBpcyByZXR1cm5lZC4KLSAgICAgKiBXaGVuIHRoaXMgaGFwcGVucywgdGhlIGFwcGxpY2F0aW9uIHNob3VsZCBhc3N1bWUgdGhhdCBpdHMgc2Vzc2lvbgotICAgICAqIGlzIG5vIGxvbmdlciB2YWxpZC4gIFRvIG9idGFpbiBhIG5ldyBzZXNzaW9uLCB0aGUgYXBwbGljYXRpb24gbWF5IHRyeSBhZ2FpbgotICAgICAqIGFuZCBvbWl0IHRoZSBzZXNzaW9uIGlkIHBhcmFtZXRlci4gIEhvd2V2ZXIsIHRoZSBhcHBsaWNhdGlvbiBzaG91bGQKLSAgICAgKiBvbmx5IHJldHJ5IHJlcXVlc3RzIGR1ZSB0byBhbiBleHBsaWNpdCBhY3Rpb24gcGVyZm9ybWVkIGJ5IHRoZSB1c2VyLAotICAgICAqIHN1Y2ggYXMgdGhlIHVzZXIgY2xpY2tpbmcgb24gYSAicGxheSIgYnV0dG9uIGluIHRoZSBVSSwgc2luY2UgYW5vdGhlcgotICAgICAqIGFwcGxpY2F0aW9uIG1heSBiZSB0cnlpbmcgdG8gdGFrZSBjb250cm9sIG9mIHRoZSByb3V0ZSBhbmQgdGhlIGZvcm1lcgotICAgICAqIGFwcGxpY2F0aW9uIHNob3VsZCB0cnkgdG8gc3RheSBvdXQgb2YgaXRzIHdheS4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gc2Vzc2lvbnMsIHF1ZXVlcyBhbmQgbWVkaWEgaXRlbXMsIHBsZWFzZSByZWZlciB0byB0aGUKLSAgICAgKiBjbGFzcyBkb2N1bWVudGF0aW9uLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIDxoMz5SZXF1ZXN0IHBhcmFtZXRlcnM8L2gzPgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9TRVNTSU9OX0lEfSA8ZW0+KG9wdGlvbmFsKTwvZW0+OiBTcGVjaWZpZXMgdGhlIHNlc3Npb24gaWQgb2YgdGhlCi0gICAgICogc2Vzc2lvbiB0byB3aGljaCB0aGUgcGxheWJhY2sgcmVxdWVzdCBiZWxvbmdzLiAgSWYgb21pdHRlZCwgYSBuZXcgc2Vzc2lvbgotICAgICAqIGlzIGNyZWF0ZWQgaW1wbGljaXRseS4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9JVEVNX0NPTlRFTlRfUE9TSVRJT059IDxlbT4ob3B0aW9uYWwpPC9lbT46IFNwZWNpZmllcyB0aGUgaW5pdGlhbAotICAgICAqIGNvbnRlbnQgcGxheWJhY2sgcG9zaXRpb24gYXMgYSBsb25nIGludGVnZXIgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBmcm9tCi0gICAgICogdGhlIGJlZ2lubmluZyBvZiB0aGUgY29udGVudC4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9JVEVNX01FVEFEQVRBfSA8ZW0+KG9wdGlvbmFsKTwvZW0+OiBTcGVjaWZpZXMgbWV0YWRhdGEgYXNzb2NpYXRlZAotICAgICAqIHdpdGggdGhlIGNvbnRlbnQgc3VjaCBhcyB0aGUgdGl0bGUgb2YgYSBzb25nLgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX0lURU1fU1RBVFVTX1VQREFURV9SRUNFSVZFUn0gPGVtPihvcHRpb25hbCk8L2VtPjogU3BlY2lmaWVzIGEKLSAgICAgKiB7QGxpbmsgUGVuZGluZ0ludGVudH0gZm9yIGEgYnJvYWRjYXN0IHJlY2VpdmVyIHRoYXQgd2lsbCByZWNlaXZlIHN0YXR1cyB1cGRhdGVzCi0gICAgICogYWJvdXQgdGhlIG1lZGlhIGl0ZW0uCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIDxoMz5SZXN1bHQgZGF0YTwvaDM+Ci0gICAgICogPHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fSUR9IDxlbT4oYWx3YXlzIHJldHVybmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlIHNlc3Npb24gaWQgb2YgdGhlCi0gICAgICogc2Vzc2lvbiB0aGF0IHdhcyBhZmZlY3RlZCBieSB0aGUgcmVxdWVzdC4gIFRoaXMgd2lsbCBiZSBhIG5ldyBzZXNzaW9uIGluCi0gICAgICogdGhlIGNhc2Ugd2hlcmUgbm8gc2Vzc2lvbiBpZCB3YXMgc3VwcGxpZWQgYXMgYSBwYXJhbWV0ZXIuCi0gICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9TVEFUVVN9IDxlbT4ob3B0aW9uYWwsIG9sZCBpbXBsZW1lbnRhdGlvbnMgbWF5Ci0gICAgICogb21pdCB0aGlzIGtleSk8L2VtPjogU3BlY2lmaWVzIHRoZSBzdGF0dXMgb2YgdGhlIG1lZGlhIHNlc3Npb24uCi0gICAgICogPGxpPntAbGluayAjRVhUUkFfSVRFTV9JRH0gPGVtPihhbHdheXMgcmV0dXJuZWQpPC9lbT46IFNwZWNpZmllcyBhbiBvcGFxdWUgc3RyaW5nIGlkZW50aWZpZXIKLSAgICAgKiB0byB1c2UgdG8gcmVmZXIgdG8gdGhlIG1lZGlhIGl0ZW0gaW4gc3Vic2VxdWVudCByZXF1ZXN0cyBzdWNoIGFzCi0gICAgICoge0BsaW5rICNBQ1RJT05fR0VUX1NUQVRVU30uCi0gICAgICogPGxpPntAbGluayAjRVhUUkFfSVRFTV9TVEFUVVN9IDxlbT4oYWx3YXlzIHJldHVybmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlIGluaXRpYWwgc3RhdHVzIG9mCi0gICAgICogdGhlIG5ldyBtZWRpYSBpdGVtLgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiA8aDM+U3RhdHVzIHVwZGF0ZXM8L2gzPgotICAgICAqIDxwPgotICAgICAqIElmIHRoZSBjbGllbnQgc3VwcGxpZXMgYW4KLSAgICAgKiB7QGxpbmsgI0VYVFJBX0lURU1fU1RBVFVTX1VQREFURV9SRUNFSVZFUiBpdGVtIHN0YXR1cyB1cGRhdGUgcmVjZWl2ZXJ9Ci0gICAgICogdGhlbiB0aGUgbWVkaWEgcm91dGUgcHJvdmlkZXIgaXMgcmVzcG9uc2libGUgZm9yIHNlbmRpbmcgc3RhdHVzIHVwZGF0ZXMgdG8gdGhlIHJlY2VpdmVyCi0gICAgICogd2hlbiBzaWduaWZpY2FudCBtZWRpYSBpdGVtIHN0YXRlIGNoYW5nZXMgb2NjdXIgc3VjaCBhcyB3aGVuIHBsYXliYWNrIHN0YXJ0cyBvcgotICAgICAqIHN0b3BzLiAgVGhlIHJlY2VpdmVyIHdpbGwgbm90IGJlIGludm9rZWQgZm9yIGNvbnRlbnQgcGxheWJhY2sgcG9zaXRpb24gY2hhbmdlcy4KLSAgICAgKiBUaGUgYXBwbGljYXRpb24gbWF5IHJldHJpZXZlIHRoZSBjdXJyZW50IHBsYXliYWNrIHBvc2l0aW9uIHdoZW4gbmVjZXNzYXJ5Ci0gICAgICogdXNpbmcgdGhlIHtAbGluayAjQUNUSU9OX0dFVF9TVEFUVVN9IHJlcXVlc3QuCi0gICAgICogPC9wPjxwPgotICAgICAqIFJlZmVyIHRvIHtAbGluayBNZWRpYUl0ZW1TdGF0dXN9IGZvciBkZXRhaWxzLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIDxoMz5FcnJvcnM8L2gzPgotICAgICAqIDxwPgotICAgICAqIFRoaXMgYWN0aW9uIHJldHVybnMgYW4gZXJyb3IgaWYgYSBzZXNzaW9uIGlkIHdhcyBwcm92aWRlZCBidXQgaXMgdW5rbm93biBvcgotICAgICAqIG5vIGxvbmdlciB2YWxpZCwgaWYgdGhlIGl0ZW0gVXJpIG9yIGNvbnRlbnQgdHlwZSBpcyBub3Qgc3VwcG9ydGVkLCBvciBpZgotICAgICAqIGFueSBvdGhlciBhcmd1bWVudHMgYXJlIGludmFsaWQuCi0gICAgICogPC9wPjx1bD4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9FUlJPUl9DT0RFfSA8ZW0+KG9wdGlvbmFsKTwvZW0+OiBTcGVjaWZpZXMgdGhlIGNhdXNlIG9mIHRoZSBlcnJvci4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogPGgzPkV4YW1wbGU8L2gzPgotICAgICAqIDxwcmU+Ci0gICAgICogTWVkaWFSb3V0ZXIgbWVkaWFSb3V0ZXIgPSBNZWRpYVJvdXRlci5nZXRJbnN0YW5jZShjb250ZXh0KTsKLSAgICAgKiBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUgPSBtZWRpYVJvdXRlci5nZXRTZWxlY3RlZFJvdXRlKCk7Ci0gICAgICogSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9QTEFZKTsKLSAgICAgKiBpbnRlbnQuYWRkQ2F0ZWdvcnkoTWVkaWFDb250cm9sSW50ZW50LkNBVEVHT1JZX1JFTU9URV9QTEFZQkFDSyk7Ci0gICAgICogaW50ZW50LnNldERhdGFBbmRUeXBlKCJodHRwOi8vZXhhbXBsZS5jb20vdmlkZW9zL21vdmllLm1wNCIsICJ2aWRlby9tcDQiKTsKLSAgICAgKiBpZiAocm91dGUuc3VwcG9ydHNDb250cm9sUmVxdWVzdChpbnRlbnQpKSB7Ci0gICAgICogICAgIE1lZGlhUm91dGVyLkNvbnRyb2xSZXF1ZXN0Q2FsbGJhY2sgY2FsbGJhY2sgPSBuZXcgTWVkaWFSb3V0ZXIuQ29udHJvbFJlcXVlc3RDYWxsYmFjaygpIHsKLSAgICAgKiAgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVzdWx0KEJ1bmRsZSBkYXRhKSB7Ci0gICAgICogICAgICAgICAgICAgLy8gVGhlIHJlcXVlc3Qgc3VjY2VlZGVkLgotICAgICAqICAgICAgICAgICAgIC8vIFBsYXliYWNrIG1heSBiZSBjb250cm9sbGVkIHVzaW5nIHRoZSByZXR1cm5lZCBzZXNzaW9uIGFuZCBpdGVtIGlkLgotICAgICAqICAgICAgICAgICAgIFN0cmluZyBzZXNzaW9uSWQgPSBkYXRhLmdldFN0cmluZyhNZWRpYUNvbnRyb2xJbnRlbnQuRVhUUkFfU0VTU0lPTl9JRCk7Ci0gICAgICogICAgICAgICAgICAgU3RyaW5nIGl0ZW1JZCA9IGRhdGEuZ2V0U3RyaW5nKE1lZGlhQ29udHJvbEludGVudC5FWFRSQV9JVEVNX0lEKTsKLSAgICAgKiAgICAgICAgICAgICBNZWRpYUl0ZW1TdGF0dXMgc3RhdHVzID0gTWVkaWFJdGVtU3RhdHVzLmZyb21CdW5kbGUoZGF0YS5nZXRCdW5kbGUoCi0gICAgICogICAgICAgICAgICAgICAgICAgICBNZWRpYUNvbnRyb2xJbnRlbnQuRVhUUkFfSVRFTV9TVEFUVVMpKTsKLSAgICAgKiAgICAgICAgICAgICAvLyAuLi4KLSAgICAgKiAgICAgICAgIH0KLSAgICAgKgotICAgICAqICAgICAgICAgcHVibGljIHZvaWQgb25FcnJvcihTdHJpbmcgbWVzc2FnZSwgQnVuZGxlIGRhdGEpIHsKLSAgICAgKiAgICAgICAgICAgICAvLyBBbiBlcnJvciBvY2N1cnJlZCEKLSAgICAgKiAgICAgICAgIH0KLSAgICAgKiAgICAgfTsKLSAgICAgKiAgICAgcm91dGUuc2VuZENvbnRyb2xSZXF1ZXN0KGludGVudCwgY2FsbGJhY2spOwotICAgICAqIH08L3ByZT4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI3NlbmRDb250cm9sUmVxdWVzdAotICAgICAqIEBzZWUgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSwotICAgICAqIEBzZWUgI0FDVElPTl9TRUVLCi0gICAgICogQHNlZSAjQUNUSU9OX0dFVF9TVEFUVVMKLSAgICAgKiBAc2VlICNBQ1RJT05fUEFVU0UKLSAgICAgKiBAc2VlICNBQ1RJT05fUkVTVU1FCi0gICAgICogQHNlZSAjQUNUSU9OX1NUT1AKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fUExBWSA9ICJhbmRyb2lkLm1lZGlhLmludGVudC5hY3Rpb24uUExBWSI7Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdGUgcGxheWJhY2sgbWVkaWEgY29udHJvbCBhY3Rpb246IEVucXVldWUgbWVkaWEgaXRlbS4KLSAgICAgKiA8cD4KLSAgICAgKiBVc2VkIHdpdGggcm91dGVzIHRoYXQgc3VwcG9ydCB7QGxpbmsgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSyByZW1vdGUgcGxheWJhY2t9Ci0gICAgICogbWVkaWEgY29udHJvbC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhpcyBhY3Rpb24gd29ya3MganVzdCBsaWtlIHtAbGluayAjQUNUSU9OX1BMQVkgcGxheX0gZXhjZXB0IHRoYXQgaXQgZG9lcwotICAgICAqIG5vdCBjbGVhciB0aGUgcXVldWUgb3IgcmVzZXQgdGhlIHBhdXNlIHN0YXRlIHdoZW4gaXQgZW5xdWV1ZXMgdGhlCi0gICAgICogbmV3IG1lZGlhIGl0ZW0gaW50byB0aGUgc2Vzc2lvbidzIHBsYXliYWNrIHF1ZXVlLiAgVGhpcyBhY3Rpb24gb25seQotICAgICAqIGVucXVldWVzIGEgbWVkaWEgaXRlbSB3aXRoIG5vIG90aGVyIHNpZGUtZWZmZWN0cyBvbiB0aGUgcXVldWUuCi0gICAgICogPC9wPjxwPgotICAgICAqIElmIHRoZSBxdWV1ZSBpcyBjdXJyZW50bHkgZW1wdHkgYW5kIHRoZW4gdGhlIGl0ZW0gd2lsbCBwbGF5IGltbWVkaWF0ZWx5Ci0gICAgICogKGFzc3VtaW5nIHRoZSBxdWV1ZSBpcyBub3QgcGF1c2VkKS4gIE90aGVyd2lzZSwgdGhlIGl0ZW0gd2lsbCBwbGF5Ci0gICAgICogYWZ0ZXIgYWxsIGVhcmxpZXIgaXRlbXMgaW4gdGhlIHF1ZXVlIGhhdmUgZmluaXNoZWQgb3IgYmVlbiByZW1vdmVkLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGUgZW5xdWV1ZSBhY3Rpb24gY2FuIGJlIHVzZWQgdG8gY3JlYXRlIG5ldyBzZXNzaW9ucyBqdXN0IGxpa2UgcGxheS4KLSAgICAgKiBJdHMgcGFyYW1ldGVycyBhbmQgcmVzdWx0cyBhcmUgYWxzbyB0aGUgc2FtZS4gIE9ubHkgdGhlIHF1ZXVpbmcgYmVoYXZpb3IKLSAgICAgKiBpcyBkaWZmZXJlbnQuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHNlZSAjQUNUSU9OX1BMQVkKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fRU5RVUVVRSA9ICJhbmRyb2lkLm1lZGlhLmludGVudC5hY3Rpb24uRU5RVUVVRSI7Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdGUgcGxheWJhY2sgbWVkaWEgY29udHJvbCBhY3Rpb246IFNlZWsgbWVkaWEgaXRlbSB0byBhIG5ldyBwbGF5YmFjayBwb3NpdGlvbi4KLSAgICAgKiA8cD4KLSAgICAgKiBVc2VkIHdpdGggcm91dGVzIHRoYXQgc3VwcG9ydCB7QGxpbmsgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSyByZW1vdGUgcGxheWJhY2t9Ci0gICAgICogbWVkaWEgY29udHJvbC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhpcyBhY3Rpb24gY2F1c2VzIGEgcmVtb3RlIHBsYXliYWNrIHJvdXRlIHRvIG1vZGlmeSB0aGUgY3VycmVudCBwbGF5YmFjayBwb3NpdGlvbgotICAgICAqIG9mIHRoZSBzcGVjaWZpZWQgbWVkaWEgaXRlbS4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhpcyBhY3Rpb24gb25seSBhZmZlY3RzIHRoZSBwbGF5YmFjayBwb3NpdGlvbiBvZiB0aGUgbWVkaWEgaXRlbTsgbm90IGl0cyBwbGF5YmFjayBzdGF0ZS4KLSAgICAgKiBJZiB0aGUgcGxheWJhY2sgcXVldWUgaXMgcGF1c2VkLCB0aGVuIHNlZWtpbmcgc2V0cyB0aGUgcG9zaXRpb24gYnV0IHRoZSBpdGVtCi0gICAgICogcmVtYWlucyBwYXVzZWQuICBMaWtld2lzZSBpZiB0aGUgaXRlbSBpcyBwbGF5aW5nLCB0aGVuIHNlZWtpbmcgd2lsbCBjYXVzZSBwbGF5YmFjawotICAgICAqIHRvIGp1bXAgdG8gdGhlIG5ldyBwb3NpdGlvbiBhbmQgY29udGludWUgcGxheWluZyBmcm9tIHRoYXQgcG9pbnQuICBJZiB0aGUgaXRlbSBoYXMKLSAgICAgKiBub3QgeWV0IHN0YXJ0ZWQgcGxheWluZywgdGhlbiB0aGUgbmV3IHBsYXliYWNrIHBvc2l0aW9uIGlzIHJlbWVtYmVyZWQgYnkgdGhlCi0gICAgICogcXVldWUgYW5kIHVzZWQgYXMgdGhlIGl0ZW0ncyBpbml0aWFsIGNvbnRlbnQgcG9zaXRpb24gd2hlbiBwbGF5YmFjayBldmVudHVhbGx5IGJlZ2lucy4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogSWYgc3VjY2Vzc2Z1bCwgdGhlIG1lZGlhIGl0ZW0ncyBwbGF5YmFjayBwb3NpdGlvbiBpcyBjaGFuZ2VkLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIDxoMz5SZXF1ZXN0IHBhcmFtZXRlcnM8L2gzPgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9TRVNTSU9OX0lEfSA8ZW0+KHJlcXVpcmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlIHNlc3Npb24gaWQgb2YgdGhlIHNlc3Npb24KLSAgICAgKiB0byB3aGljaCB0aGUgbWVkaWEgaXRlbSBiZWxvbmdzLgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX0lURU1fSUR9IDxlbT4ocmVxdWlyZWQpPC9lbT46IFNwZWNpZmllcyB0aGUgbWVkaWEgaXRlbSBpZCBvZgotICAgICAqIHRoZSBtZWRpYSBpdGVtIHRvIHNlZWsuCi0gICAgICogPGxpPntAbGluayAjRVhUUkFfSVRFTV9DT05URU5UX1BPU0lUSU9OfSA8ZW0+KHJlcXVpcmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlIG5ldwotICAgICAqIGNvbnRlbnQgcG9zaXRpb24gZm9yIHBsYXliYWNrIGFzIGEgbG9uZyBpbnRlZ2VyIG51bWJlciBvZiBtaWxsaXNlY29uZHMgZnJvbQotICAgICAqIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGNvbnRlbnQuCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIDxoMz5SZXN1bHQgZGF0YTwvaDM+Ci0gICAgICogPHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fU1RBVFVTfSA8ZW0+KG9wdGlvbmFsLCBvbGQgaW1wbGVtZW50YXRpb25zIG1heQotICAgICAqIG9taXQgdGhpcyBrZXkpPC9lbT46IFNwZWNpZmllcyB0aGUgc3RhdHVzIG9mIHRoZSBtZWRpYSBzZXNzaW9uLgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX0lURU1fU1RBVFVTfSA8ZW0+KGFsd2F5cyByZXR1cm5lZCk8L2VtPjogU3BlY2lmaWVzIHRoZSBuZXcgc3RhdHVzIG9mCi0gICAgICogdGhlIG1lZGlhIGl0ZW0uCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIDxoMz5FcnJvcnM8L2gzPgotICAgICAqIDxwPgotICAgICAqIFRoaXMgYWN0aW9uIHJldHVybnMgYW4gZXJyb3IgaWYgdGhlIHNlc3Npb24gaWQgb3IgbWVkaWEgaXRlbSBpZCBhcmUgdW5rbm93bgotICAgICAqIG9yIG5vIGxvbmdlciB2YWxpZCwgaWYgdGhlIGNvbnRlbnQgcG9zaXRpb24gaXMgaW52YWxpZCwgb3IgaWYgdGhlIG1lZGlhIGl0ZW0KLSAgICAgKiBpcyBpbiBhIHRlcm1pbmFsIHN0YXRlLgotICAgICAqIDwvcD48dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfRVJST1JfQ09ERX0gPGVtPihvcHRpb25hbCk8L2VtPjogU3BlY2lmaWVzIHRoZSBjYXVzZSBvZiB0aGUgZXJyb3IuCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI3NlbmRDb250cm9sUmVxdWVzdAotICAgICAqIEBzZWUgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9TRUVLID0gImFuZHJvaWQubWVkaWEuaW50ZW50LmFjdGlvbi5TRUVLIjsKLQotICAgIC8qKgotICAgICAqIFJlbW90ZSBwbGF5YmFjayBtZWRpYSBjb250cm9sIGFjdGlvbjogR2V0IG1lZGlhIGl0ZW0gcGxheWJhY2sgc3RhdHVzCi0gICAgICogYW5kIHByb2dyZXNzIGluZm9ybWF0aW9uLgotICAgICAqIDxwPgotICAgICAqIFVzZWQgd2l0aCByb3V0ZXMgdGhhdCBzdXBwb3J0IHtAbGluayAjQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLIHJlbW90ZSBwbGF5YmFja30KLSAgICAgKiBtZWRpYSBjb250cm9sLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGlzIGFjdGlvbiBhc2tzIGEgcmVtb3RlIHBsYXliYWNrIHJvdXRlIHRvIHByb3ZpZGUgdXBkYXRlZCBwbGF5YmFjayBzdGF0dXMgYW5kIHByb2dyZXNzCi0gICAgICogaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNwZWNpZmllZCBtZWRpYSBpdGVtLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIDxoMz5SZXF1ZXN0IHBhcmFtZXRlcnM8L2gzPgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9TRVNTSU9OX0lEfSA8ZW0+KHJlcXVpcmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlIHNlc3Npb24gaWQgb2YgdGhlIHNlc3Npb24KLSAgICAgKiB0byB3aGljaCB0aGUgbWVkaWEgaXRlbSBiZWxvbmdzLgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX0lURU1fSUR9IDxlbT4ocmVxdWlyZWQpPC9lbT46IFNwZWNpZmllcyB0aGUgbWVkaWEgaXRlbSBpZCBvZgotICAgICAqIHRoZSBtZWRpYSBpdGVtIHRvIHF1ZXJ5LgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiA8aDM+UmVzdWx0IGRhdGE8L2gzPgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9TRVNTSU9OX1NUQVRVU30gPGVtPihvcHRpb25hbCwgb2xkIGltcGxlbWVudGF0aW9ucyBtYXkKLSAgICAgKiBvbWl0IHRoaXMga2V5KTwvZW0+OiBTcGVjaWZpZXMgdGhlIHN0YXR1cyBvZiB0aGUgbWVkaWEgc2Vzc2lvbi4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9JVEVNX1NUQVRVU30gPGVtPihhbHdheXMgcmV0dXJuZWQpPC9lbT46IFNwZWNpZmllcyB0aGUgY3VycmVudCBzdGF0dXMgb2YKLSAgICAgKiB0aGUgbWVkaWEgaXRlbS4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogPGgzPkVycm9yczwvaDM+Ci0gICAgICogPHA+Ci0gICAgICogVGhpcyBhY3Rpb24gcmV0dXJucyBhbiBlcnJvciBpZiB0aGUgc2Vzc2lvbiBpZCBvciBtZWRpYSBpdGVtIGlkIGFyZSB1bmtub3duCi0gICAgICogb3Igbm8gbG9uZ2VyIHZhbGlkLgotICAgICAqIDwvcD48dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfRVJST1JfQ09ERX0gPGVtPihvcHRpb25hbCk8L2VtPjogU3BlY2lmaWVzIHRoZSBjYXVzZSBvZiB0aGUgZXJyb3IuCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI3NlbmRDb250cm9sUmVxdWVzdAotICAgICAqIEBzZWUgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSwotICAgICAqIEBzZWUgI0VYVFJBX0lURU1fU1RBVFVTX1VQREFURV9SRUNFSVZFUgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9HRVRfU1RBVFVTID0gImFuZHJvaWQubWVkaWEuaW50ZW50LmFjdGlvbi5HRVRfU1RBVFVTIjsKLQotICAgIC8qKgotICAgICAqIFJlbW90ZSBwbGF5YmFjayBtZWRpYSBjb250cm9sIGFjdGlvbjogUmVtb3ZlIG1lZGlhIGl0ZW0gZnJvbSBzZXNzaW9uJ3MgcXVldWUuCi0gICAgICogPHA+Ci0gICAgICogVXNlZCB3aXRoIHJvdXRlcyB0aGF0IHN1cHBvcnQge0BsaW5rICNDQVRFR09SWV9SRU1PVEVfUExBWUJBQ0sgcmVtb3RlIHBsYXliYWNrfQotICAgICAqIG1lZGlhIGNvbnRyb2wuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoaXMgYWN0aW9uIGFza3MgYSByZW1vdGUgcGxheWJhY2sgcm91dGUgdG8gcmVtb3ZlIHRoZSBzcGVjaWZpZWQgbWVkaWEgaXRlbQotICAgICAqIGZyb20gdGhlIHNlc3Npb24ncyBwbGF5YmFjayBxdWV1ZS4gIElmIHRoZSBjdXJyZW50IGl0ZW0gaXMgcmVtb3ZlZCwgdGhlbgotICAgICAqIHBsYXliYWNrIHdpbGwgcHJvY2VlZCB0byB0aGUgbmV4dCBtZWRpYSBpdGVtIChhc3N1bWluZyB0aGUgcXVldWUgaGFzIG5vdCBiZWVuCi0gICAgICogcGF1c2VkKS4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhpcyBhY3Rpb24gZG9lcyBub3QgYWZmZWN0IHRoZSBwYXVzZSBzdGF0ZSBvZiB0aGUgcXVldWUuICBJZiB0aGUgcXVldWUgd2FzIHBhdXNlZAotICAgICAqIHRoZW4gaXQgcmVtYWlucyBwYXVzZWQgKGV2ZW4gaWYgaXQgaXMgbm93IGVtcHR5KSB1bnRpbCBhIHJlc3VtZSwgc3RvcCBvciBwbGF5Ci0gICAgICogYWN0aW9uIGlzIGlzc3VlZCB0aGF0IGNhdXNlcyB0aGUgcGF1c2Ugc3RhdGUgdG8gYmUgY2xlYXJlZC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiA8aDM+UmVxdWVzdCBwYXJhbWV0ZXJzPC9oMz4KLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9JRH0gPGVtPihyZXF1aXJlZCk8L2VtPjogU3BlY2lmaWVzIHRoZSBzZXNzaW9uIGlkIG9mIHRoZSBzZXNzaW9uCi0gICAgICogdG8gd2hpY2ggdGhlIG1lZGlhIGl0ZW0gYmVsb25ncy4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9JVEVNX0lEfSA8ZW0+KHJlcXVpcmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlIG1lZGlhIGl0ZW0gaWQgb2YKLSAgICAgKiB0aGUgbWVkaWEgaXRlbSB0byByZW1vdmUuCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIDxoMz5SZXN1bHQgZGF0YTwvaDM+Ci0gICAgICogPHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fU1RBVFVTfSA8ZW0+KG9wdGlvbmFsLCBvbGQgaW1wbGVtZW50YXRpb25zIG1heQotICAgICAqIG9taXQgdGhpcyBrZXkpPC9lbT46IFNwZWNpZmllcyB0aGUgc3RhdHVzIG9mIHRoZSBtZWRpYSBzZXNzaW9uLgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX0lURU1fU1RBVFVTfSA8ZW0+KGFsd2F5cyByZXR1cm5lZCk8L2VtPjogU3BlY2lmaWVzIHRoZSBuZXcgc3RhdHVzIG9mCi0gICAgICogdGhlIG1lZGlhIGl0ZW0uCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIDxoMz5FcnJvcnM8L2gzPgotICAgICAqIDxwPgotICAgICAqIFRoaXMgYWN0aW9uIHJldHVybnMgYW4gZXJyb3IgaWYgdGhlIHNlc3Npb24gaWQgb3IgbWVkaWEgaXRlbSBpZCBhcmUgdW5rbm93bgotICAgICAqIG9yIG5vIGxvbmdlciB2YWxpZCwgb3IgaWYgdGhlIG1lZGlhIGl0ZW0gaXMgaW4gYSB0ZXJtaW5hbCBzdGF0ZSAoYW5kIHRoZXJlZm9yZQotICAgICAqIG5vIGxvbmdlciBpbiB0aGUgcXVldWUpLgotICAgICAqIDwvcD48dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfRVJST1JfQ09ERX0gPGVtPihvcHRpb25hbCk8L2VtPjogU3BlY2lmaWVzIHRoZSBjYXVzZSBvZiB0aGUgZXJyb3IuCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI3NlbmRDb250cm9sUmVxdWVzdAotICAgICAqIEBzZWUgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9SRU1PVkUgPSAiYW5kcm9pZC5tZWRpYS5pbnRlbnQuYWN0aW9uLlJFTU9WRSI7Ci0KLSAgICAvKiBSZW1vdGUgcGxheWJhY2sgYWN0aW9ucyB0aGF0IGFmZmVjdCB0aGUgd2hvbGUgcGxheWJhY2sgcXVldWUuICovCi0KLSAgICAvKioKLSAgICAgKiBSZW1vdGUgcGxheWJhY2sgbWVkaWEgY29udHJvbCBhY3Rpb246IFBhdXNlIG1lZGlhIHBsYXliYWNrLgotICAgICAqIDxwPgotICAgICAqIFVzZWQgd2l0aCByb3V0ZXMgdGhhdCBzdXBwb3J0IHtAbGluayAjQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLIHJlbW90ZSBwbGF5YmFja30KLSAgICAgKiBtZWRpYSBjb250cm9sLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGlzIGFjdGlvbiBjYXVzZXMgdGhlIHBsYXliYWNrIHF1ZXVlIG9mIHRoZSBzcGVjaWZpZWQgc2Vzc2lvbiB0byBiZSBwYXVzZWQuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogPGgzPlJlcXVlc3QgcGFyYW1ldGVyczwvaDM+Ci0gICAgICogPHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fSUR9IDxlbT4ocmVxdWlyZWQpPC9lbT46IFNwZWNpZmllcyB0aGUgc2Vzc2lvbiBpZCBvZiB0aGUgc2Vzc2lvbgotICAgICAqIHdob3NlIHBsYXliYWNrIHF1ZXVlIGlzIHRvIGJlIHBhdXNlZC4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogPGgzPlJlc3VsdCBkYXRhPC9oMz4KLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9TVEFUVVN9IDxlbT4ob3B0aW9uYWwsIG9sZCBpbXBsZW1lbnRhdGlvbnMgbWF5Ci0gICAgICogb21pdCB0aGlzIGtleSk8L2VtPjogU3BlY2lmaWVzIHRoZSBzdGF0dXMgb2YgdGhlIG1lZGlhIHNlc3Npb24uCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIDxoMz5FcnJvcnM8L2gzPgotICAgICAqIDxwPgotICAgICAqIFRoaXMgYWN0aW9uIHJldHVybnMgYW4gZXJyb3IgaWYgdGhlIHNlc3Npb24gaWQgaXMgdW5rbm93biBvciBubyBsb25nZXIgdmFsaWQuCi0gICAgICogPC9wPjx1bD4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9FUlJPUl9DT0RFfSA8ZW0+KG9wdGlvbmFsKTwvZW0+OiBTcGVjaWZpZXMgdGhlIGNhdXNlIG9mIHRoZSBlcnJvci4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogQHNlZSBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jc2VuZENvbnRyb2xSZXF1ZXN0Ci0gICAgICogQHNlZSAjQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLCi0gICAgICogQHNlZSAjQUNUSU9OX1JFU1VNRQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9QQVVTRSA9ICJhbmRyb2lkLm1lZGlhLmludGVudC5hY3Rpb24uUEFVU0UiOwotCi0gICAgLyoqCi0gICAgICogUmVtb3RlIHBsYXliYWNrIG1lZGlhIGNvbnRyb2wgYWN0aW9uOiBSZXN1bWUgbWVkaWEgcGxheWJhY2sgKHVucGF1c2UpLgotICAgICAqIDxwPgotICAgICAqIFVzZWQgd2l0aCByb3V0ZXMgdGhhdCBzdXBwb3J0IHtAbGluayAjQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLIHJlbW90ZSBwbGF5YmFja30KLSAgICAgKiBtZWRpYSBjb250cm9sLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGlzIGFjdGlvbiBjYXVzZXMgdGhlIHBsYXliYWNrIHF1ZXVlIG9mIHRoZSBzcGVjaWZpZWQgc2Vzc2lvbiB0byBiZSByZXN1bWVkLgotICAgICAqIFJldmVyc2VzIHRoZSBlZmZlY3RzIG9mIHtAbGluayAjQUNUSU9OX1BBVVNFfS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiA8aDM+UmVxdWVzdCBwYXJhbWV0ZXJzPC9oMz4KLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9JRH0gPGVtPihyZXF1aXJlZCk8L2VtPjogU3BlY2lmaWVzIHRoZSBzZXNzaW9uIGlkIG9mIHRoZSBzZXNzaW9uCi0gICAgICogd2hvc2UgcGxheWJhY2sgcXVldWUgaXMgdG8gYmUgcmVzdW1lZC4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogPGgzPlJlc3VsdCBkYXRhPC9oMz4KLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9TVEFUVVN9IDxlbT4ob3B0aW9uYWwsIG9sZCBpbXBsZW1lbnRhdGlvbnMgbWF5Ci0gICAgICogb21pdCB0aGlzIGtleSk8L2VtPjogU3BlY2lmaWVzIHRoZSBzdGF0dXMgb2YgdGhlIG1lZGlhIHNlc3Npb24uCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIDxoMz5FcnJvcnM8L2gzPgotICAgICAqIDxwPgotICAgICAqIFRoaXMgYWN0aW9uIHJldHVybnMgYW4gZXJyb3IgaWYgdGhlIHNlc3Npb24gaWQgaXMgdW5rbm93biBvciBubyBsb25nZXIgdmFsaWQuCi0gICAgICogPC9wPjx1bD4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9FUlJPUl9DT0RFfSA8ZW0+KG9wdGlvbmFsKTwvZW0+OiBTcGVjaWZpZXMgdGhlIGNhdXNlIG9mIHRoZSBlcnJvci4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogQHNlZSBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jc2VuZENvbnRyb2xSZXF1ZXN0Ci0gICAgICogQHNlZSAjQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLCi0gICAgICogQHNlZSAjQUNUSU9OX1BBVVNFCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX1JFU1VNRSA9ICJhbmRyb2lkLm1lZGlhLmludGVudC5hY3Rpb24uUkVTVU1FIjsKLQotICAgIC8qKgotICAgICAqIFJlbW90ZSBwbGF5YmFjayBtZWRpYSBjb250cm9sIGFjdGlvbjogU3RvcCBtZWRpYSBwbGF5YmFjayAoY2xlYXIgcXVldWUgYW5kIHVucGF1c2UpLgotICAgICAqIDxwPgotICAgICAqIFVzZWQgd2l0aCByb3V0ZXMgdGhhdCBzdXBwb3J0IHtAbGluayAjQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLIHJlbW90ZSBwbGF5YmFja30KLSAgICAgKiBtZWRpYSBjb250cm9sLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGlzIGFjdGlvbiBjYXVzZXMgYSByZW1vdGUgcGxheWJhY2sgcm91dGUgdG8gc3RvcCBwbGF5YmFjaywgY2FuY2VsIGFuZCByZW1vdmUKLSAgICAgKiBhbGwgbWVkaWEgaXRlbXMgZnJvbSB0aGUgc2Vzc2lvbidzIG1lZGlhIGl0ZW0gcXVldWUgYW5kLCByZXNldCB0aGUgcXVldWUncwotICAgICAqIHBhdXNlIHN0YXRlLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBJZiBzdWNjZXNzZnVsLCB0aGUgc3RhdHVzIG9mIGFsbCBtZWRpYSBpdGVtcyBpbiB0aGUgcXVldWUgaXMgc2V0IHRvCi0gICAgICoge0BsaW5rIE1lZGlhSXRlbVN0YXR1cyNQTEFZQkFDS19TVEFURV9DQU5DRUxFRCBjYW5jZWxlZH0gYW5kIGEgc3RhdHVzIHVwZGF0ZSBpcyBzZW50Ci0gICAgICogdG8gdGhlIGFwcHJvcHJpYXRlIHN0YXR1cyB1cGRhdGUgcmVjZWl2ZXJzIGluZGljYXRpbmcgdGhlIG5ldyBzdGF0dXMgb2YgZWFjaCBpdGVtLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIDxoMz5SZXF1ZXN0IHBhcmFtZXRlcnM8L2gzPgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9TRVNTSU9OX0lEfSA8ZW0+KHJlcXVpcmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlIHNlc3Npb24gaWQgb2YKLSAgICAgKiB0aGUgc2Vzc2lvbiB3aG9zZSBwbGF5YmFjayBxdWV1ZSBpcyB0byBiZSBzdG9wcGVkIChjbGVhcmVkIGFuZCB1bnBhdXNlZCkuCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIDxoMz5SZXN1bHQgZGF0YTwvaDM+Ci0gICAgICogPHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fU1RBVFVTfSA8ZW0+KG9wdGlvbmFsLCBvbGQgaW1wbGVtZW50YXRpb25zIG1heQotICAgICAqIG9taXQgdGhpcyBrZXkpPC9lbT46IFNwZWNpZmllcyB0aGUgc3RhdHVzIG9mIHRoZSBtZWRpYSBzZXNzaW9uLgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiA8aDM+RXJyb3JzPC9oMz4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGFjdGlvbiByZXR1cm5zIGFuIGVycm9yIGlmIHRoZSBzZXNzaW9uIGlkIGlzIHVua25vd24gb3Igbm8gbG9uZ2VyIHZhbGlkLgotICAgICAqIDwvcD48dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfRVJST1JfQ09ERX0gPGVtPihvcHRpb25hbCk8L2VtPjogU3BlY2lmaWVzIHRoZSBjYXVzZSBvZiB0aGUgZXJyb3IuCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI3NlbmRDb250cm9sUmVxdWVzdAotICAgICAqIEBzZWUgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9TVE9QID0gImFuZHJvaWQubWVkaWEuaW50ZW50LmFjdGlvbi5TVE9QIjsKLQotICAgIC8qKgotICAgICAqIFJlbW90ZSBwbGF5YmFjayBtZWRpYSBjb250cm9sIGFjdGlvbjogU3RhcnQgc2Vzc2lvbi4KLSAgICAgKiA8cD4KLSAgICAgKiBVc2VkIHdpdGggcm91dGVzIHRoYXQgc3VwcG9ydCB7QGxpbmsgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSyByZW1vdGUgcGxheWJhY2t9Ci0gICAgICogbWVkaWEgY29udHJvbC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhpcyBhY3Rpb24gY2F1c2VzIGEgcmVtb3RlIHBsYXliYWNrIHJvdXRlIHRvIGludmFsaWRhdGUgdGhlIGN1cnJlbnQgc2Vzc2lvbgotICAgICAqIGFuZCBzdGFydCBhIG5ldyBzZXNzaW9uLiAgVGhlIG5ldyBzZXNzaW9uIGluaXRpYWxseSBoYXMgYW4gZW1wdHkgcXVldWUuCi0gICAgICogPC9wPjxwPgotICAgICAqIElmIHN1Y2Nlc3NmdWwsIHRoZSBzdGF0dXMgb2YgYWxsIG1lZGlhIGl0ZW1zIGluIHRoZSBwcmV2aW91cyBzZXNzaW9uJ3MgcXVldWUgaXMgc2V0IHRvCi0gICAgICoge0BsaW5rIE1lZGlhSXRlbVN0YXR1cyNQTEFZQkFDS19TVEFURV9JTlZBTElEQVRFRCBpbnZhbGlkYXRlZH0gYW5kIGEgc3RhdHVzIHVwZGF0ZQotICAgICAqIGlzIHNlbnQgdG8gdGhlIGFwcHJvcHJpYXRlIHN0YXR1cyB1cGRhdGUgcmVjZWl2ZXJzIGluZGljYXRpbmcgdGhlIG5ldyBzdGF0dXMKLSAgICAgKiBvZiBlYWNoIGl0ZW0uICBUaGUgcHJldmlvdXMgc2Vzc2lvbiBiZWNvbWVzIG5vIGxvbmdlciB2YWxpZCBhbmQgdGhlIG5ldyBzZXNzaW9uCi0gICAgICogdGFrZXMgY29udHJvbCBvZiB0aGUgcm91dGUuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogPGgzPlJlcXVlc3QgcGFyYW1ldGVyczwvaDM+Ci0gICAgICogPHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fU1RBVFVTX1VQREFURV9SRUNFSVZFUn0gPGVtPihvcHRpb25hbCk8L2VtPjogU3BlY2lmaWVzIGEKLSAgICAgKiB7QGxpbmsgUGVuZGluZ0ludGVudH0gZm9yIGEgYnJvYWRjYXN0IHJlY2VpdmVyIHRoYXQgd2lsbCByZWNlaXZlIHN0YXR1cyB1cGRhdGVzCi0gICAgICogYWJvdXQgdGhlIG1lZGlhIHNlc3Npb24uCi0gICAgICogPGxpPntAbGluayAjRVhUUkFfTUVTU0FHRV9SRUNFSVZFUn0gPGVtPihvcHRpb25hbCk8L2VtPjogU3BlY2lmaWVzIGEKLSAgICAgKiB7QGxpbmsgUGVuZGluZ0ludGVudH0gZm9yIGEgYnJvYWRjYXN0IHJlY2VpdmVyIHRoYXQgd2lsbCByZWNlaXZlIG1lc3NhZ2VzIGZyb20KLSAgICAgKiB0aGUgbWVkaWEgc2Vzc2lvbi4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogPGgzPlJlc3VsdCBkYXRhPC9oMz4KLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9JRH0gPGVtPihhbHdheXMgcmV0dXJuZWQpPC9lbT46IFNwZWNpZmllcyB0aGUgc2Vzc2lvbiBpZCBvZiB0aGUKLSAgICAgKiBzZXNzaW9uIHRoYXQgd2FzIHN0YXJ0ZWQgYnkgdGhlIHJlcXVlc3QuICBUaGlzIHdpbGwgYWx3YXlzIGJlIGEgYnJhbmQgbmV3IHNlc3Npb24KLSAgICAgKiBkaXN0aW5jdCBmcm9tIGFueSBvdGhlciBwcmV2aW91c2x5IGNyZWF0ZWQgc2Vzc2lvbnMuCi0gICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9TVEFUVVN9IDxlbT4oYWx3YXlzIHJldHVybmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlCi0gICAgICogc3RhdHVzIG9mIHRoZSBtZWRpYSBzZXNzaW9uLgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiA8aDM+U3RhdHVzIHVwZGF0ZXM8L2gzPgotICAgICAqIDxwPgotICAgICAqIElmIHRoZSBjbGllbnQgc3VwcGxpZXMgYQotICAgICAqIHtAbGluayAjRVhUUkFfU0VTU0lPTl9TVEFUVVNfVVBEQVRFX1JFQ0VJVkVSIHN0YXR1cyB1cGRhdGUgcmVjZWl2ZXJ9Ci0gICAgICogdGhlbiB0aGUgbWVkaWEgcm91dGUgcHJvdmlkZXIgaXMgcmVzcG9uc2libGUgZm9yIHNlbmRpbmcgc3RhdHVzIHVwZGF0ZXMgdG8gdGhlIHJlY2VpdmVyCi0gICAgICogd2hlbiBzaWduaWZpY2FudCBtZWRpYSBzZXNzaW9uIHN0YXRlIGNoYW5nZXMgb2NjdXIgc3VjaCBhcyB3aGVuIHRoZSBzZXNzaW9uJ3MKLSAgICAgKiBxdWV1ZSBpcyBwYXVzZWQgb3IgcmVzdW1lZCBvciB3aGVuIHRoZSBzZXNzaW9uIGlzIHRlcm1pbmF0ZWQgb3IgaW52YWxpZGF0ZWQuCi0gICAgICogPC9wPjxwPgotICAgICAqIFJlZmVyIHRvIHtAbGluayBNZWRpYVNlc3Npb25TdGF0dXN9IGZvciBkZXRhaWxzLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIDxoMz5DdXN0b20gbWVzc2FnZXM8L2gzPgotICAgICAqIDxwPgotICAgICAqIElmIHRoZSBjbGllbnQgc3VwcGxpZXMgYSB7QGxpbmsgI0VYVFJBX01FU1NBR0VfUkVDRUlWRVIgbWVzc2FnZSByZWNlaXZlcn0KLSAgICAgKiB0aGVuIHRoZSBtZWRpYSByb3V0ZSBwcm92aWRlciBpcyByZXNwb25zaWJsZSBmb3Igc2VuZGluZyBtZXNzYWdlcyB0byB0aGUgcmVjZWl2ZXIKLSAgICAgKiB3aGVuIHRoZSBzZXNzaW9uIGhhcyBhbnkgbWVzc2FnZXMgdG8gc2VuZC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogUmVmZXIgdG8ge0BsaW5rICNFWFRSQV9NRVNTQUdFfSBmb3IgZGV0YWlscy4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiA8aDM+RXJyb3JzPC9oMz4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGFjdGlvbiByZXR1cm5zIGFuIGVycm9yIGlmIHRoZSBzZXNzaW9uIGNvdWxkIG5vdCBiZSBjcmVhdGVkLgotICAgICAqIDwvcD48dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfRVJST1JfQ09ERX0gPGVtPihvcHRpb25hbCk8L2VtPjogU3BlY2lmaWVzIHRoZSBjYXVzZSBvZiB0aGUgZXJyb3IuCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI3NlbmRDb250cm9sUmVxdWVzdAotICAgICAqIEBzZWUgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9TVEFSVF9TRVNTSU9OID0gImFuZHJvaWQubWVkaWEuaW50ZW50LmFjdGlvbi5TVEFSVF9TRVNTSU9OIjsKLQotICAgIC8qKgotICAgICAqIFJlbW90ZSBwbGF5YmFjayBtZWRpYSBjb250cm9sIGFjdGlvbjogR2V0IG1lZGlhIHNlc3Npb24gc3RhdHVzIGluZm9ybWF0aW9uLgotICAgICAqIDxwPgotICAgICAqIFVzZWQgd2l0aCByb3V0ZXMgdGhhdCBzdXBwb3J0IHtAbGluayAjQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLIHJlbW90ZSBwbGF5YmFja30KLSAgICAgKiBtZWRpYSBjb250cm9sLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGlzIGFjdGlvbiBhc2tzIGEgcmVtb3RlIHBsYXliYWNrIHJvdXRlIHRvIHByb3ZpZGUgdXBkYXRlZCBzdGF0dXMgaW5mb3JtYXRpb24KLSAgICAgKiBhYm91dCB0aGUgc3BlY2lmaWVkIG1lZGlhIHNlc3Npb24uCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogPGgzPlJlcXVlc3QgcGFyYW1ldGVyczwvaDM+Ci0gICAgICogPHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fSUR9IDxlbT4ocmVxdWlyZWQpPC9lbT46IFNwZWNpZmllcyB0aGUgc2Vzc2lvbiBpZCBvZiB0aGUKLSAgICAgKiBzZXNzaW9uIHdob3NlIHN0YXR1cyBpcyB0byBiZSByZXRyaWV2ZWQuCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIDxoMz5SZXN1bHQgZGF0YTwvaDM+Ci0gICAgICogPHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fU1RBVFVTfSA8ZW0+KGFsd2F5cyByZXR1cm5lZCk8L2VtPjogU3BlY2lmaWVzIHRoZQotICAgICAqIGN1cnJlbnQgc3RhdHVzIG9mIHRoZSBtZWRpYSBzZXNzaW9uLgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiA8aDM+RXJyb3JzPC9oMz4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGFjdGlvbiByZXR1cm5zIGFuIGVycm9yIGlmIHRoZSBzZXNzaW9uIGlkIGlzIHVua25vd24gb3Igbm8gbG9uZ2VyIHZhbGlkLgotICAgICAqIDwvcD48dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfRVJST1JfQ09ERX0gPGVtPihvcHRpb25hbCk8L2VtPjogU3BlY2lmaWVzIHRoZSBjYXVzZSBvZiB0aGUgZXJyb3IuCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI3NlbmRDb250cm9sUmVxdWVzdAotICAgICAqIEBzZWUgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSwotICAgICAqIEBzZWUgI0VYVFJBX1NFU1NJT05fU1RBVFVTX1VQREFURV9SRUNFSVZFUgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9HRVRfU0VTU0lPTl9TVEFUVVMgPQotICAgICAgICAgICAgImFuZHJvaWQubWVkaWEuaW50ZW50LmFjdGlvbi5HRVRfU0VTU0lPTl9TVEFUVVMiOwotCi0gICAgLyoqCi0gICAgICogUmVtb3RlIHBsYXliYWNrIG1lZGlhIGNvbnRyb2wgYWN0aW9uOiBFbmQgc2Vzc2lvbi4KLSAgICAgKiA8cD4KLSAgICAgKiBVc2VkIHdpdGggcm91dGVzIHRoYXQgc3VwcG9ydCB7QGxpbmsgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSyByZW1vdGUgcGxheWJhY2t9Ci0gICAgICogbWVkaWEgY29udHJvbC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhpcyBhY3Rpb24gY2F1c2VzIGEgcmVtb3RlIHBsYXliYWNrIHJvdXRlIHRvIGVuZCB0aGUgc3BlY2lmaWVkIHNlc3Npb24uCi0gICAgICogVGhlIHNlc3Npb24gYmVjb21lcyBubyBsb25nZXIgdmFsaWQgYW5kIHRoZSByb3V0ZSBjZWFzZXMgdG8gYmUgdW5kZXIgY29udHJvbAotICAgICAqIG9mIHRoZSBzZXNzaW9uLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBJZiBzdWNjZXNzZnVsLCB0aGUgc3RhdHVzIG9mIHRoZSBzZXNzaW9uIGlzIHNldCB0bwotICAgICAqIHtAbGluayBNZWRpYVNlc3Npb25TdGF0dXMjU0VTU0lPTl9TVEFURV9FTkRFRH0gYW5kIGEgc3RhdHVzIHVwZGF0ZSBpcyBzZW50IHRvCi0gICAgICogdGhlIHNlc3Npb24ncyBzdGF0dXMgdXBkYXRlIHJlY2VpdmVyLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBBZGRpdGlvbmFsbHksIHRoZSBzdGF0dXMgb2YgYWxsIG1lZGlhIGl0ZW1zIGluIHRoZSBxdWV1ZSBpcyBzZXQgdG8KLSAgICAgKiB7QGxpbmsgTWVkaWFJdGVtU3RhdHVzI1BMQVlCQUNLX1NUQVRFX0NBTkNFTEVEIGNhbmNlbGVkfSBhbmQgYSBzdGF0dXMgdXBkYXRlIGlzIHNlbnQKLSAgICAgKiB0byB0aGUgYXBwcm9wcmlhdGUgc3RhdHVzIHVwZGF0ZSByZWNlaXZlcnMgaW5kaWNhdGluZyB0aGUgbmV3IHN0YXR1cyBvZiBlYWNoIGl0ZW0uCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogPGgzPlJlcXVlc3QgcGFyYW1ldGVyczwvaDM+Ci0gICAgICogPHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fSUR9IDxlbT4ocmVxdWlyZWQpPC9lbT46IFNwZWNpZmllcyB0aGUgc2Vzc2lvbiBpZCBvZgotICAgICAqIHRoZSBzZXNzaW9uIHRvIGVuZC4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogPGgzPlJlc3VsdCBkYXRhPC9oMz4KLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9TVEFUVVN9IDxlbT4oYWx3YXlzIHJldHVybmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlCi0gICAgICogc3RhdHVzIG9mIHRoZSBtZWRpYSBzZXNzaW9uLgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiA8aDM+RXJyb3JzPC9oMz4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGFjdGlvbiByZXR1cm5zIGFuIGVycm9yIGlmIHRoZSBzZXNzaW9uIGlkIGlzIHVua25vd24gb3Igbm8gbG9uZ2VyIHZhbGlkLgotICAgICAqIEluIG90aGVyIHdvcmRzLCBpdCBpcyBhbiBlcnJvciB0byBhdHRlbXB0IHRvIGVuZCBhIHNlc3Npb24gb3RoZXIgdGhhbiB0aGUKLSAgICAgKiBjdXJyZW50IHNlc3Npb24uCi0gICAgICogPC9wPjx1bD4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9FUlJPUl9DT0RFfSA8ZW0+KG9wdGlvbmFsKTwvZW0+OiBTcGVjaWZpZXMgdGhlIGNhdXNlIG9mIHRoZSBlcnJvci4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogQHNlZSBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jc2VuZENvbnRyb2xSZXF1ZXN0Ci0gICAgICogQHNlZSAjQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX0VORF9TRVNTSU9OID0gImFuZHJvaWQubWVkaWEuaW50ZW50LmFjdGlvbi5FTkRfU0VTU0lPTiI7Ci0KLSAgICAvKioKLSAgICAgKiBDdXN0b20gbWVkaWEgY29udHJvbCBhY3Rpb246IFNlbmQge0BsaW5rICNFWFRSQV9NRVNTQUdFfS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGFjdGlvbiBhc2tzIGEgcm91dGUgdG8gaGFuZGxlIGEgbWVzc2FnZSBkZXNjcmliZWQgYnkgRVhUUkFfTUVTU0FHRS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiA8aDM+UmVxdWVzdCBwYXJhbWV0ZXJzPC9oMz4KLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9JRH0gPGVtPihyZXF1aXJlZCk8L2VtPjogU3BlY2lmaWVzIHRoZSBzZXNzaW9uIGlkIG9mIHRoZSBzZXNzaW9uCi0gICAgICogdG8gd2hpY2ggd2lsbCBoYW5kbGUgdGhpcyBtZXNzYWdlLgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX01FU1NBR0V9IDxlbT4ocmVxdWlyZWQpPC9lbT46IFNwZWNpZmllcyB0aGUgbWVzc2FnZSB0byBzZW5kLgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiA8aDM+UmVzdWx0IGRhdGE8L2gzPgotICAgICAqIEFueSBtZXNzYWdlcyBkZWZpbmVkIGJ5IGVhY2ggbWVkaWEgcm91dGUgcHJvdmlkZXIuCi0gICAgICoKLSAgICAgKiA8aDM+RXJyb3JzPC9oMz4KLSAgICAgKiBBbnkgZXJyb3IgbWVzc2FnZXMgZGVmaW5lZCBieSBlYWNoIG1lZGlhIHJvdXRlIHByb3ZpZGVyLgotICAgICAqCi0gICAgICogQHNlZSBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jc2VuZENvbnRyb2xSZXF1ZXN0Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX1NFTkRfTUVTU0FHRSA9ICJhbmRyb2lkLm1lZGlhLmludGVudC5hY3Rpb24uU0VORF9NRVNTQUdFIjsKLQotICAgIC8qIEV4dHJhcyBhbmQgcmVsYXRlZCBjb25zdGFudHMuICovCi0KLSAgICAvKioKLSAgICAgKiBCdW5kbGUgZXh0cmE6IE1lZGlhIHNlc3Npb24gaWQuCi0gICAgICogPHA+Ci0gICAgICogQW4gb3BhcXVlIHVuaXF1ZSBpZGVudGlmaWVyIHRoYXQgaWRlbnRpZmllcyB0aGUgcmVtb3RlIHBsYXliYWNrIG1lZGlhIHNlc3Npb24uCi0gICAgICogPC9wPjxwPgotICAgICAqIFVzZWQgd2l0aCB2YXJpb3VzIGFjdGlvbnMgdG8gc3BlY2lmeSB0aGUgaWQgb2YgdGhlIG1lZGlhIHNlc3Npb24gdG8gYmUgY29udHJvbGxlZC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogSW5jbHVkZWQgaW4gYnJvYWRjYXN0IGludGVudHMgc2VudCB0bwotICAgICAqIHtAbGluayAjRVhUUkFfSVRFTV9TVEFUVVNfVVBEQVRFX1JFQ0VJVkVSIGl0ZW0gc3RhdHVzIHVwZGF0ZSByZWNlaXZlcnN9IHRvIGlkZW50aWZ5Ci0gICAgICogdGhlIHNlc3Npb24gdG8gd2hpY2ggdGhlIGl0ZW0gaW4gcXVlc3Rpb24gYmVsb25ncy4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogSW5jbHVkZWQgaW4gYnJvYWRjYXN0IGludGVudHMgc2VudCB0bwotICAgICAqIHtAbGluayAjRVhUUkFfU0VTU0lPTl9TVEFUVVNfVVBEQVRFX1JFQ0VJVkVSIHNlc3Npb24gc3RhdHVzIHVwZGF0ZSByZWNlaXZlcnN9IHRvIGlkZW50aWZ5Ci0gICAgICogdGhlIHNlc3Npb24uCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoZSB2YWx1ZSBpcyBhIHVuaXF1ZSBzdHJpbmcgdmFsdWUgZ2VuZXJhdGVkIGJ5IHRoZSBtZWRpYSByb3V0ZSBwcm92aWRlcgotICAgICAqIHRvIHJlcHJlc2VudCBvbmUgcGFydGljdWxhciBtZWRpYSBzZXNzaW9uLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBzZWUgI0FDVElPTl9QTEFZCi0gICAgICogQHNlZSAjQUNUSU9OX1NFRUsKLSAgICAgKiBAc2VlICNBQ1RJT05fR0VUX1NUQVRVUwotICAgICAqIEBzZWUgI0FDVElPTl9QQVVTRQotICAgICAqIEBzZWUgI0FDVElPTl9SRVNVTUUKLSAgICAgKiBAc2VlICNBQ1RJT05fU1RPUAotICAgICAqIEBzZWUgI0FDVElPTl9TVEFSVF9TRVNTSU9OCi0gICAgICogQHNlZSAjQUNUSU9OX0dFVF9TRVNTSU9OX1NUQVRVUwotICAgICAqIEBzZWUgI0FDVElPTl9FTkRfU0VTU0lPTgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1NFU1NJT05fSUQgPQotICAgICAgICAgICAgImFuZHJvaWQubWVkaWEuaW50ZW50LmV4dHJhLlNFU1NJT05fSUQiOwotCi0gICAgLyoqCi0gICAgICogQnVuZGxlIGV4dHJhOiBNZWRpYSBzZXNzaW9uIHN0YXR1cy4KLSAgICAgKiA8cD4KLSAgICAgKiBSZXR1cm5lZCBhcyBhIHJlc3VsdCBmcm9tIG1lZGlhIHNlc3Npb24gYWN0aW9ucyBzdWNoIGFzIHtAbGluayAjQUNUSU9OX1NUQVJUX1NFU1NJT059LAotICAgICAqIHtAbGluayAjQUNUSU9OX1BBVVNFfSwgYW5kIHtAbGluayAjQUNUSU9OX0dFVF9TRVNTSU9OX1NUQVRVU30KLSAgICAgKiB0byBkZXNjcmliZSB0aGUgc3RhdHVzIG9mIHRoZSBzcGVjaWZpZWQgbWVkaWEgc2Vzc2lvbi4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogSW5jbHVkZWQgaW4gYnJvYWRjYXN0IGludGVudHMgc2VudCB0bwotICAgICAqIHtAbGluayAjRVhUUkFfU0VTU0lPTl9TVEFUVVNfVVBEQVRFX1JFQ0VJVkVSIHNlc3Npb24gc3RhdHVzIHVwZGF0ZSByZWNlaXZlcnN9IHRvIHByb3ZpZGUKLSAgICAgKiB1cGRhdGVkIHN0YXR1cyBpbmZvcm1hdGlvbi4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhlIHZhbHVlIGlzIGEge0BsaW5rIGFuZHJvaWQub3MuQnVuZGxlfSBvZiBkYXRhIHRoYXQgY2FuIGJlIGNvbnZlcnRlZCBpbnRvCi0gICAgICogYSB7QGxpbmsgTWVkaWFTZXNzaW9uU3RhdHVzfSBvYmplY3QgdXNpbmcKLSAgICAgKiB7QGxpbmsgTWVkaWFTZXNzaW9uU3RhdHVzI2Zyb21CdW5kbGUgTWVkaWFTZXNzaW9uU3RhdHVzLmZyb21CdW5kbGV9LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBzZWUgI0FDVElPTl9QTEFZCi0gICAgICogQHNlZSAjQUNUSU9OX1NFRUsKLSAgICAgKiBAc2VlICNBQ1RJT05fR0VUX1NUQVRVUwotICAgICAqIEBzZWUgI0FDVElPTl9QQVVTRQotICAgICAqIEBzZWUgI0FDVElPTl9SRVNVTUUKLSAgICAgKiBAc2VlICNBQ1RJT05fU1RPUAotICAgICAqIEBzZWUgI0FDVElPTl9TVEFSVF9TRVNTSU9OCi0gICAgICogQHNlZSAjQUNUSU9OX0dFVF9TRVNTSU9OX1NUQVRVUwotICAgICAqIEBzZWUgI0FDVElPTl9FTkRfU0VTU0lPTgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1NFU1NJT05fU1RBVFVTID0KLSAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhLmludGVudC5leHRyYS5TRVNTSU9OX1NUQVRVUyI7Ci0KLSAgICAvKioKLSAgICAgKiBCdW5kbGUgZXh0cmE6IE1lZGlhIHNlc3Npb24gc3RhdHVzIHVwZGF0ZSByZWNlaXZlci4KLSAgICAgKiA8cD4KLSAgICAgKiBVc2VkIHdpdGgge0BsaW5rICNBQ1RJT05fU1RBUlRfU0VTU0lPTn0gdG8gc3BlY2lmeSBhIHtAbGluayBQZW5kaW5nSW50ZW50fSBmb3IgYQotICAgICAqIGJyb2FkY2FzdCByZWNlaXZlciB0aGF0IHdpbGwgcmVjZWl2ZSBzdGF0dXMgdXBkYXRlcyBhYm91dCB0aGUgbWVkaWEgc2Vzc2lvbi4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogV2hlbmV2ZXIgdGhlIHN0YXR1cyBvZiB0aGUgbWVkaWEgc2Vzc2lvbiBjaGFuZ2VzLCB0aGUgbWVkaWEgcm91dGUgcHJvdmlkZXIgd2lsbAotICAgICAqIHNlbmQgYSBicm9hZGNhc3QgdG8gdGhlIHBlbmRpbmcgaW50ZW50IHdpdGggZXh0cmFzIHRoYXQgaWRlbnRpZnkgdGhlIHNlc3Npb24KLSAgICAgKiBpZCBhbmQgaXRzIHVwZGF0ZWQgc3RhdHVzLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGUgdmFsdWUgaXMgYSB7QGxpbmsgUGVuZGluZ0ludGVudH0uCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogPGgzPkJyb2FkY2FzdCBleHRyYXM8L2gzPgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9TRVNTSU9OX0lEfSA8ZW0+KHJlcXVpcmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlIHNlc3Npb24gaWQgb2YKLSAgICAgKiB0aGUgc2Vzc2lvbi4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9TRVNTSU9OX1NUQVRVU30gPGVtPihyZXF1aXJlZCk8L2VtPjogU3BlY2lmaWVzIHRoZSBzdGF0dXMgb2YgdGhlCi0gICAgICogc2Vzc2lvbiBhcyBhIGJ1bmRsZSB0aGF0IGNhbiBiZSBkZWNvZGVkIGludG8gYSB7QGxpbmsgTWVkaWFTZXNzaW9uU3RhdHVzfSBvYmplY3QuCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIEBzZWUgI0FDVElPTl9TVEFSVF9TRVNTSU9OCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfU0VTU0lPTl9TVEFUVVNfVVBEQVRFX1JFQ0VJVkVSID0KLSAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhLmludGVudC5leHRyYS5TRVNTSU9OX1NUQVRVU19VUERBVEVfUkVDRUlWRVIiOwotCi0gICAgLyoqCi0gICAgICogQnVuZGxlIGV4dHJhOiBNZWRpYSBtZXNzYWdlIHJlY2VpdmVyLgotICAgICAqIDxwPgotICAgICAqIFVzZWQgd2l0aCB7QGxpbmsgI0FDVElPTl9TVEFSVF9TRVNTSU9OfSB0byBzcGVjaWZ5IGEge0BsaW5rIFBlbmRpbmdJbnRlbnR9IGZvciBhCi0gICAgICogYnJvYWRjYXN0IHJlY2VpdmVyIHRoYXQgd2lsbCByZWNlaXZlIG1lc3NhZ2VzIGZyb20gdGhlIG1lZGlhIHNlc3Npb24uCi0gICAgICogPC9wPjxwPgotICAgICAqIFdoZW4gdGhlIG1lZGlhIHNlc3Npb24gaGFzIGEgbWVzc2FnZSB0byBzZW5kLCB0aGUgbWVkaWEgcm91dGUgcHJvdmlkZXIgd2lsbAotICAgICAqIHNlbmQgYSBicm9hZGNhc3QgdG8gdGhlIHBlbmRpbmcgaW50ZW50IHdpdGggZXh0cmFzIHRoYXQgaWRlbnRpZnkgdGhlIHNlc3Npb24KLSAgICAgKiBpZCBhbmQgaXRzIG1lc3NhZ2UuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoZSB2YWx1ZSBpcyBhIHtAbGluayBQZW5kaW5nSW50ZW50fS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiA8aDM+QnJvYWRjYXN0IGV4dHJhczwvaDM+Ci0gICAgICogPHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fSUR9IDxlbT4ocmVxdWlyZWQpPC9lbT46IFNwZWNpZmllcyB0aGUgc2Vzc2lvbiBpZCBvZgotICAgICAqIHRoZSBzZXNzaW9uLgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX01FU1NBR0V9IDxlbT4ocmVxdWlyZWQpPC9lbT46IFNwZWNpZmllcyB0aGUgbWVzc2FnZSBmcm9tCi0gICAgICogdGhlIHNlc3Npb24gYXMgYSBidW5kbGUgb2JqZWN0LgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiBAc2VlICNBQ1RJT05fU1RBUlRfU0VTU0lPTgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX01FU1NBR0VfUkVDRUlWRVIgPQotICAgICAgICAgICAgImFuZHJvaWQubWVkaWEuaW50ZW50LmV4dHJhLk1FU1NBR0VfUkVDRUlWRVIiOwotCi0gICAgLyoqCi0gICAgICogQnVuZGxlIGV4dHJhOiBNZWRpYSBpdGVtIGlkLgotICAgICAqIDxwPgotICAgICAqIEFuIG9wYXF1ZSB1bmlxdWUgaWRlbnRpZmllciByZXR1cm5lZCBhcyBhIHJlc3VsdCBmcm9tIHtAbGluayAjQUNUSU9OX1BMQVl9IG9yCi0gICAgICoge0BsaW5rICNBQ1RJT05fRU5RVUVVRX0gdGhhdCByZXByZXNlbnRzIHRoZSBtZWRpYSBpdGVtIHRoYXQgd2FzIGNyZWF0ZWQgYnkgdGhlCi0gICAgICogcGxheWJhY2sgcmVxdWVzdC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVXNlZCB3aXRoIHZhcmlvdXMgYWN0aW9ucyB0byBzcGVjaWZ5IHRoZSBpZCBvZiB0aGUgbWVkaWEgaXRlbSB0byBiZSBjb250cm9sbGVkLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBJbmNsdWRlZCBpbiBicm9hZGNhc3QgaW50ZW50cyBzZW50IHRvCi0gICAgICoge0BsaW5rICNFWFRSQV9JVEVNX1NUQVRVU19VUERBVEVfUkVDRUlWRVIgc3RhdHVzIHVwZGF0ZSByZWNlaXZlcnN9IHRvIGlkZW50aWZ5Ci0gICAgICogdGhlIGl0ZW0gaW4gcXVlc3Rpb24uCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoZSB2YWx1ZSBpcyBhIHVuaXF1ZSBzdHJpbmcgdmFsdWUgZ2VuZXJhdGVkIGJ5IHRoZSBtZWRpYSByb3V0ZSBwcm92aWRlcgotICAgICAqIHRvIHJlcHJlc2VudCBvbmUgcGFydGljdWxhciBtZWRpYSBpdGVtLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBzZWUgI0FDVElPTl9QTEFZCi0gICAgICogQHNlZSAjQUNUSU9OX0VOUVVFVUUKLSAgICAgKiBAc2VlICNBQ1RJT05fU0VFSwotICAgICAqIEBzZWUgI0FDVElPTl9HRVRfU1RBVFVTCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfSVRFTV9JRCA9Ci0gICAgICAgICAgICAiYW5kcm9pZC5tZWRpYS5pbnRlbnQuZXh0cmEuSVRFTV9JRCI7Ci0KLSAgICAvKioKLSAgICAgKiBCdW5kbGUgZXh0cmE6IE1lZGlhIGl0ZW0gc3RhdHVzLgotICAgICAqIDxwPgotICAgICAqIFJldHVybmVkIGFzIGEgcmVzdWx0IGZyb20gbWVkaWEgaXRlbSBhY3Rpb25zIHN1Y2ggYXMge0BsaW5rICNBQ1RJT05fUExBWX0sCi0gICAgICoge0BsaW5rICNBQ1RJT05fRU5RVUVVRX0sIHtAbGluayAjQUNUSU9OX1NFRUt9LCBhbmQge0BsaW5rICNBQ1RJT05fR0VUX1NUQVRVU30KLSAgICAgKiB0byBkZXNjcmliZSB0aGUgc3RhdHVzIG9mIHRoZSBzcGVjaWZpZWQgbWVkaWEgaXRlbS4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogSW5jbHVkZWQgaW4gYnJvYWRjYXN0IGludGVudHMgc2VudCB0bwotICAgICAqIHtAbGluayAjRVhUUkFfSVRFTV9TVEFUVVNfVVBEQVRFX1JFQ0VJVkVSIGl0ZW0gc3RhdHVzIHVwZGF0ZSByZWNlaXZlcnN9IHRvIHByb3ZpZGUKLSAgICAgKiB1cGRhdGVkIHN0YXR1cyBpbmZvcm1hdGlvbi4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhlIHZhbHVlIGlzIGEge0BsaW5rIGFuZHJvaWQub3MuQnVuZGxlfSBvZiBkYXRhIHRoYXQgY2FuIGJlIGNvbnZlcnRlZCBpbnRvCi0gICAgICogYSB7QGxpbmsgTWVkaWFJdGVtU3RhdHVzfSBvYmplY3QgdXNpbmcKLSAgICAgKiB7QGxpbmsgTWVkaWFJdGVtU3RhdHVzI2Zyb21CdW5kbGUgTWVkaWFJdGVtU3RhdHVzLmZyb21CdW5kbGV9LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBzZWUgI0FDVElPTl9QTEFZCi0gICAgICogQHNlZSAjQUNUSU9OX0VOUVVFVUUKLSAgICAgKiBAc2VlICNBQ1RJT05fU0VFSwotICAgICAqIEBzZWUgI0FDVElPTl9HRVRfU1RBVFVTCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfSVRFTV9TVEFUVVMgPQotICAgICAgICAgICAgImFuZHJvaWQubWVkaWEuaW50ZW50LmV4dHJhLklURU1fU1RBVFVTIjsKLQotICAgIC8qKgotICAgICAqIExvbmcgZXh0cmE6IE1lZGlhIGl0ZW0gY29udGVudCBwb3NpdGlvbi4KLSAgICAgKiA8cD4KLSAgICAgKiBVc2VkIHdpdGgge0BsaW5rICNBQ1RJT05fUExBWX0gb3Ige0BsaW5rICNBQ1RJT05fRU5RVUVVRX0gdG8gc3BlY2lmeSB0aGUKLSAgICAgKiBzdGFydGluZyBwbGF5YmFjayBwb3NpdGlvbi4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVXNlZCB3aXRoIHtAbGluayAjQUNUSU9OX1NFRUt9IHRvIHNldCBhIG5ldyBwbGF5YmFjayBwb3NpdGlvbi4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhlIHZhbHVlIGlzIGEgbG9uZyBpbnRlZ2VyIG51bWJlciBvZiBtaWxsaXNlY29uZHMgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjb250ZW50LgotICAgICAqIDxwPgotICAgICAqCi0gICAgICogQHNlZSAjQUNUSU9OX1BMQVkKLSAgICAgKiBAc2VlICNBQ1RJT05fRU5RVUVVRQotICAgICAqIEBzZWUgI0FDVElPTl9TRUVLCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfSVRFTV9DT05URU5UX1BPU0lUSU9OID0KLSAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhLmludGVudC5leHRyYS5JVEVNX1BPU0lUSU9OIjsKLQotICAgIC8qKgotICAgICAqIEJ1bmRsZSBleHRyYTogTWVkaWEgaXRlbSBtZXRhZGF0YS4KLSAgICAgKiA8cD4KLSAgICAgKiBVc2VkIHdpdGgge0BsaW5rICNBQ1RJT05fUExBWX0gb3Ige0BsaW5rICNBQ1RJT05fRU5RVUVVRX0gdG8gc3BlY2lmeSBtZXRhZGF0YQotICAgICAqIGFzc29jaWF0ZWQgd2l0aCB0aGUgY29udGVudCBvZiBhIG1lZGlhIGl0ZW0uCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoZSB2YWx1ZSBpcyBhIHtAbGluayBhbmRyb2lkLm9zLkJ1bmRsZX0gb2YgbWV0YWRhdGEga2V5LXZhbHVlIHBhaXJzIGFzIGRlZmluZWQKLSAgICAgKiBpbiB7QGxpbmsgTWVkaWFJdGVtTWV0YWRhdGF9LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBzZWUgI0FDVElPTl9QTEFZCi0gICAgICogQHNlZSAjQUNUSU9OX0VOUVVFVUUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9JVEVNX01FVEFEQVRBID0KLSAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhLmludGVudC5leHRyYS5JVEVNX01FVEFEQVRBIjsKLQotICAgIC8qKgotICAgICAqIEJ1bmRsZSBleHRyYTogSFRUUCByZXF1ZXN0IGhlYWRlcnMuCi0gICAgICogPHA+Ci0gICAgICogVXNlZCB3aXRoIHtAbGluayAjQUNUSU9OX1BMQVl9IG9yIHtAbGluayAjQUNUSU9OX0VOUVVFVUV9IHRvIHNwZWNpZnkgSFRUUCByZXF1ZXN0Ci0gICAgICogaGVhZGVycyB0byBiZSBpbmNsdWRlZCB3aGVuIGZldGNoaW5nIHRvIHRoZSBjb250ZW50IGluZGljYXRlZCBieSB0aGUgbWVkaWEKLSAgICAgKiBpdGVtJ3MgZGF0YSBVcmkuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoaXMgZXh0cmEgbWF5IGJlIHVzZWQgdG8gcHJvdmlkZSBhdXRoZW50aWNhdGlvbiB0b2tlbnMgYW5kIG90aGVyCi0gICAgICogcGFyYW1ldGVycyB0byB0aGUgc2VydmVyIHNlcGFyYXRlbHkgZnJvbSB0aGUgbWVkaWEgaXRlbSdzIGRhdGEgVXJpLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGUgdmFsdWUgaXMgYSB7QGxpbmsgYW5kcm9pZC5vcy5CdW5kbGV9IG9mIHN0cmluZyBiYXNlZCBrZXktdmFsdWUgcGFpcnMKLSAgICAgKiB0aGF0IGRlc2NyaWJlIHRoZSBIVFRQIHJlcXVlc3QgaGVhZGVycy4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAc2VlICNBQ1RJT05fUExBWQotICAgICAqIEBzZWUgI0FDVElPTl9FTlFVRVVFCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfSVRFTV9IVFRQX0hFQURFUlMgPQotICAgICAgICAgICAgImFuZHJvaWQubWVkaWEuaW50ZW50LmV4dHJhLkhUVFBfSEVBREVSUyI7Ci0KLSAgICAvKioKLSAgICAgKiBCdW5kbGUgZXh0cmE6IE1lZGlhIGl0ZW0gc3RhdHVzIHVwZGF0ZSByZWNlaXZlci4KLSAgICAgKiA8cD4KLSAgICAgKiBVc2VkIHdpdGgge0BsaW5rICNBQ1RJT05fUExBWX0gb3Ige0BsaW5rICNBQ1RJT05fRU5RVUVVRX0gdG8gc3BlY2lmeQotICAgICAqIGEge0BsaW5rIFBlbmRpbmdJbnRlbnR9IGZvciBhCi0gICAgICogYnJvYWRjYXN0IHJlY2VpdmVyIHRoYXQgd2lsbCByZWNlaXZlIHN0YXR1cyB1cGRhdGVzIGFib3V0IGEgcGFydGljdWxhcgotICAgICAqIG1lZGlhIGl0ZW0uCi0gICAgICogPC9wPjxwPgotICAgICAqIFdoZW5ldmVyIHRoZSBzdGF0dXMgb2YgdGhlIG1lZGlhIGl0ZW0gY2hhbmdlcywgdGhlIG1lZGlhIHJvdXRlIHByb3ZpZGVyIHdpbGwKLSAgICAgKiBzZW5kIGEgYnJvYWRjYXN0IHRvIHRoZSBwZW5kaW5nIGludGVudCB3aXRoIGV4dHJhcyB0aGF0IGlkZW50aWZ5IHRoZSBzZXNzaW9uCi0gICAgICogdG8gd2hpY2ggdGhlIGl0ZW0gYmVsb25ncywgdGhlIHNlc3Npb24gc3RhdHVzLCB0aGUgaXRlbSdzIGlkCi0gICAgICogYW5kIHRoZSBpdGVtJ3MgdXBkYXRlZCBzdGF0dXMuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoZSBzYW1lIHBlbmRpbmcgaW50ZW50IGFuZCBicm9hZGNhc3QgcmVjZWl2ZXIgbWF5IGJlIHNoYXJlZCBieSBhbnkgbnVtYmVyIG9mCi0gICAgICogbWVkaWEgaXRlbXMgc2luY2UgdGhlIGJyb2FkY2FzdCBpbnRlbnQgaW5jbHVkZXMgdGhlIG1lZGlhIHNlc3Npb24gaWQKLSAgICAgKiBhbmQgbWVkaWEgaXRlbSBpZC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhlIHZhbHVlIGlzIGEge0BsaW5rIFBlbmRpbmdJbnRlbnR9LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIDxoMz5Ccm9hZGNhc3QgZXh0cmFzPC9oMz4KLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9JRH0gPGVtPihyZXF1aXJlZCk8L2VtPjogU3BlY2lmaWVzIHRoZSBzZXNzaW9uIGlkIG9mCi0gICAgICogdGhlIHNlc3Npb24gdG8gd2hpY2ggdGhlIGl0ZW0gaW4gcXVlc3Rpb24gYmVsb25ncy4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9TRVNTSU9OX1NUQVRVU30gPGVtPihvcHRpb25hbCwgb2xkIGltcGxlbWVudGF0aW9ucyBtYXkKLSAgICAgKiBvbWl0IHRoaXMga2V5KTwvZW0+OiBTcGVjaWZpZXMgdGhlIHN0YXR1cyBvZiB0aGUgbWVkaWEgc2Vzc2lvbi4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9JVEVNX0lEfSA8ZW0+KHJlcXVpcmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlIG1lZGlhIGl0ZW0gaWQgb2YgdGhlCi0gICAgICogbWVkaWEgaXRlbSBpbiBxdWVzdGlvbi4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9JVEVNX1NUQVRVU30gPGVtPihyZXF1aXJlZCk8L2VtPjogU3BlY2lmaWVzIHRoZSBzdGF0dXMgb2YgdGhlCi0gICAgICogaXRlbSBhcyBhIGJ1bmRsZSB0aGF0IGNhbiBiZSBkZWNvZGVkIGludG8gYSB7QGxpbmsgTWVkaWFJdGVtU3RhdHVzfSBvYmplY3QuCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIEBzZWUgI0FDVElPTl9QTEFZCi0gICAgICogQHNlZSAjQUNUSU9OX0VOUVVFVUUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9JVEVNX1NUQVRVU19VUERBVEVfUkVDRUlWRVIgPQotICAgICAgICAgICAgImFuZHJvaWQubWVkaWEuaW50ZW50LmV4dHJhLklURU1fU1RBVFVTX1VQREFURV9SRUNFSVZFUiI7Ci0KLSAgICAvKioKLSAgICAgKiBCdW5kbGUgZXh0cmE6IE1lc3NhZ2UuCi0gICAgICogPHA+Ci0gICAgICogVXNlZCB3aXRoIHtAbGluayAjQUNUSU9OX1NFTkRfTUVTU0FHRX0sIGFuZCBpbmNsdWRlZCBpbiBicm9hZGNhc3QgaW50ZW50cyBzZW50IHRvCi0gICAgICoge0BsaW5rICNFWFRSQV9NRVNTQUdFX1JFQ0VJVkVSIG1lc3NhZ2UgcmVjZWl2ZXJzfSB0byBkZXNjcmliZSBhIG1lc3NhZ2UgYmV0d2VlbiBhCi0gICAgICogc2Vzc2lvbiBhbmQgYSBtZWRpYSByb3V0ZSBwcm92aWRlci4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhlIHZhbHVlIGlzIGEge0BsaW5rIGFuZHJvaWQub3MuQnVuZGxlfS4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfTUVTU0FHRSA9ICJhbmRyb2lkLm1lZGlhLmludGVudC5leHRyYS5NRVNTQUdFIjsKLQotICAgIC8qKgotICAgICAqIEludGVnZXIgZXh0cmE6IEVycm9yIGNvZGUuCi0gICAgICogPHA+Ci0gICAgICogVXNlZCB3aXRoIGFsbCBtZWRpYSBjb250cm9sIHJlcXVlc3RzIHRvIGRlc2NyaWJlIHRoZSBjYXVzZSBvZiBhbiBlcnJvci4KLSAgICAgKiBUaGlzIGV4dHJhIG1heSBiZSBvbWl0dGVkIHdoZW4gdGhlIGVycm9yIGlzIHVua25vd24uCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoZSB2YWx1ZSBpcyBvbmUgb2Y6IHtAbGluayAjRVJST1JfVU5LTk9XTn0sIHtAbGluayAjRVJST1JfVU5TVVBQT1JURURfT1BFUkFUSU9OfSwKLSAgICAgKiB7QGxpbmsgI0VSUk9SX0lOVkFMSURfU0VTU0lPTl9JRH0sIHtAbGluayAjRVJST1JfSU5WQUxJRF9JVEVNX0lEfS4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfRVJST1JfQ09ERSA9ICJhbmRyb2lkLm1lZGlhLmludGVudC5leHRyYS5FUlJPUl9DT0RFIjsKLQotICAgIC8qKgotICAgICAqIEVycm9yIGNvZGU6IEFuIHVua25vd24gZXJyb3Igb2NjdXJyZWQuCi0gICAgICoKLSAgICAgKiBAc2VlICNFWFRSQV9FUlJPUl9DT0RFCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1JfVU5LTk9XTiA9IDA7Ci0KLSAgICAvKioKLSAgICAgKiBFcnJvciBjb2RlOiBUaGUgb3BlcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQuCi0gICAgICoKLSAgICAgKiBAc2VlICNFWFRSQV9FUlJPUl9DT0RFCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1JfVU5TVVBQT1JURURfT1BFUkFUSU9OID0gMTsKLQotICAgIC8qKgotICAgICAqIEVycm9yIGNvZGU6IFRoZSBzZXNzaW9uIGlkIHNwZWNpZmllZCBpbiB0aGUgcmVxdWVzdCB3YXMgaW52YWxpZC4KLSAgICAgKgotICAgICAqIEBzZWUgI0VYVFJBX0VSUk9SX0NPREUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUl9JTlZBTElEX1NFU1NJT05fSUQgPSAyOwotCi0gICAgLyoqCi0gICAgICogRXJyb3IgY29kZTogVGhlIGl0ZW0gaWQgc3BlY2lmaWVkIGluIHRoZSByZXF1ZXN0IHdhcyBpbnZhbGlkLgotICAgICAqCi0gICAgICogQHNlZSAjRVhUUkFfRVJST1JfQ09ERQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SX0lOVkFMSURfSVRFTV9JRCA9IDM7Ci0KLSAgICBwcml2YXRlIE1lZGlhQ29udHJvbEludGVudCgpIHsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFJdGVtTWV0YWRhdGEuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYUl0ZW1NZXRhZGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTJkZGI2Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYUl0ZW1NZXRhZGF0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYTsKLQotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotCi0vKioKLSAqIENvbnN0YW50cyBmb3Igc3BlY2lmeWluZyBtZXRhZGF0YSBhYm91dCBhIG1lZGlhIGl0ZW0gYXMgYSB7QGxpbmsgQnVuZGxlfS4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBpcyBwYXJ0IG9mIHRoZSByZW1vdGUgcGxheWJhY2sgcHJvdG9jb2wgZGVzY3JpYmVkIGJ5IHRoZQotICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBNZWRpYUNvbnRyb2xJbnRlbnR9IGNsYXNzLgotICogPC9wPjxwPgotICogTWVkaWEgaXRlbSBtZXRhZGF0YSBpcyBkZXNjcmliZWQgYXMgYSBidW5kbGUgb2Yga2V5L3ZhbHVlIHBhaXJzIGFzIGRlZmluZWQKLSAqIGluIHRoaXMgY2xhc3MuICBUaGUgZG9jdW1lbnRhdGlvbiBzcGVjaWZpZXMgdGhlIHR5cGUgb2YgdmFsdWUgYXNzb2NpYXRlZAotICogd2l0aCBlYWNoIGtleS4KLSAqIDwvcD48cD4KLSAqIEFuIGFwcGxpY2F0aW9uIG1heSBzcGVjaWZ5IGFkZGl0aW9uYWwgY3VzdG9tIG1ldGFkYXRhIGtleXMgYnV0IHRoZXJlIGlzIG5vIGd1YXJhbnRlZQotICogdGhhdCB0aGV5IHdpbGwgYmUgcmVjb2duaXplZCBieSB0aGUgZGVzdGluYXRpb24uCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBNZWRpYUl0ZW1NZXRhZGF0YSB7Ci0gICAgLyoKLSAgICAgKiBOb3RlOiBNZWRpYU1ldGFkYXRhUmV0cmlldmVyIGFsc28gZGVmaW5lcyBhIGNvbGxlY3Rpb24gb2YgbWV0YWRhdGEga2V5cyB0aGF0IGNhbiBiZQotICAgICAqIHJldHJpZXZlZCBmcm9tIGEgY29udGVudCBzdHJlYW0gYWx0aG91Z2ggdGhlIHJlcHJlc2VudGF0aW9uIGlzIHNvbWV3aGF0IGRpZmZlcmVudCBoZXJlCi0gICAgICogc2luY2Ugd2UgYXJlIHNlbmRpbmcgdGhlIGRhdGEgdG8gYSByZW1vdGUgZW5kcG9pbnQuCi0gICAgICovCi0KLSAgICBwcml2YXRlIE1lZGlhSXRlbU1ldGFkYXRhKCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIFN0cmluZyBrZXk6IEFsYnVtIGFydGlzdCBuYW1lLgotICAgICAqIDxwPgotICAgICAqIFRoZSB2YWx1ZSBpcyBhIHN0cmluZyBzdWl0YWJsZSBmb3IgZGlzcGxheS4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0FMQlVNX0FSVElTVCA9ICJhbmRyb2lkLm1lZGlhLm1ldGFkYXRhLkFMQlVNX0FSVElTVCI7Ci0KLSAgICAvKioKLSAgICAgKiBTdHJpbmcga2V5OiBBbGJ1bSB0aXRsZS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgdmFsdWUgaXMgYSBzdHJpbmcgc3VpdGFibGUgZm9yIGRpc3BsYXkuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9BTEJVTV9USVRMRSA9ICJhbmRyb2lkLm1lZGlhLm1ldGFkYXRhLkFMQlVNX1RJVExFIjsKLQotICAgIC8qKgotICAgICAqIFN0cmluZyBrZXk6IEFydHdvcmsgVXJpLgotICAgICAqIDxwPgotICAgICAqIFRoZSB2YWx1ZSBpcyBhIHN0cmluZyBVUkkgZm9yIGFuIGltYWdlIGZpbGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBtZWRpYSBpdGVtLAotICAgICAqIHN1Y2ggYXMgYWxidW0gb3IgY292ZXIgYXJ0LgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQVJUV09SS19VUkkgPSAiYW5kcm9pZC5tZWRpYS5tZXRhZGF0YS5BUlRXT1JLX1VSSSI7Ci0KLSAgICAvKioKLSAgICAgKiBTdHJpbmcga2V5OiBBcnRpc3QgbmFtZS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgdmFsdWUgaXMgYSBzdHJpbmcgc3VpdGFibGUgZm9yIGRpc3BsYXkuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9BUlRJU1QgPSAiYW5kcm9pZC5tZWRpYS5tZXRhZGF0YS5BUlRJU1QiOwotCi0gICAgLyoqCi0gICAgICogU3RyaW5nIGtleTogQXV0aG9yIG5hbWUuCi0gICAgICogPHA+Ci0gICAgICogVGhlIHZhbHVlIGlzIGEgc3RyaW5nIHN1aXRhYmxlIGZvciBkaXNwbGF5LgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQVVUSE9SID0gImFuZHJvaWQubWVkaWEubWV0YWRhdGEuQVVUSE9SIjsKLQotICAgIC8qKgotICAgICAqIFN0cmluZyBrZXk6IENvbXBvc2VyIG5hbWUuCi0gICAgICogPHA+Ci0gICAgICogVGhlIHZhbHVlIGlzIGEgc3RyaW5nIHN1aXRhYmxlIGZvciBkaXNwbGF5LgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQ09NUE9TRVIgPSAiYW5kcm9pZC5tZWRpYS5tZXRhZGF0YS5DT01QT1NFUiI7Ci0KLSAgICAvKioKLSAgICAgKiBTdHJpbmcga2V5OiBUcmFjayB0aXRsZS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgdmFsdWUgaXMgYSBzdHJpbmcgc3VpdGFibGUgZm9yIGRpc3BsYXkuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9USVRMRSA9ICJhbmRyb2lkLm1lZGlhLm1ldGFkYXRhLlRJVExFIjsKLQotICAgIC8qKgotICAgICAqIEludGVnZXIga2V5OiBZZWFyIG9mIHB1YmxpY2F0aW9uLgotICAgICAqIDxwPgotICAgICAqIFRoZSB2YWx1ZSBpcyBhbiBpbnRlZ2VyIHllYXIgbnVtYmVyLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfWUVBUiA9ICJhbmRyb2lkLm1lZGlhLm1ldGFkYXRhLllFQVIiOwotCi0gICAgLyoqCi0gICAgICogSW50ZWdlciBrZXk6IFRyYWNrIG51bWJlciAoc3VjaCBhcyBhIHRyYWNrIG9uIGEgQ0QpLgotICAgICAqIDxwPgotICAgICAqIFRoZSB2YWx1ZSBpcyBhIG9uZS1iYXNlZCBpbnRlZ2VyIHRyYWNrIG51bWJlci4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1RSQUNLX05VTUJFUiA9ICJhbmRyb2lkLm1lZGlhLm1ldGFkYXRhLlRSQUNLX05VTUJFUiI7Ci0KLSAgICAvKioKLSAgICAgKiBJbnRlZ2VyIGtleTogRGlzYyBudW1iZXIgd2l0aGluIGEgY29sbGVjdGlvbi4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgdmFsdWUgaXMgYSBvbmUtYmFzZWQgaW50ZWdlciBkaXNjIG51bWJlci4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0RJU0NfTlVNQkVSID0gImFuZHJvaWQubWVkaWEubWV0YWRhdGEuRElTQ19OVU1CRVIiOwotCi0gICAgLyoqCi0gICAgICogTG9uZyBrZXk6IEl0ZW0gcGxheWJhY2sgZHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzLgotICAgICAqIDxwPgotICAgICAqIFRoZSB2YWx1ZSBpcyBhIDxjb2RlPmxvbmc8L2NvZGU+IG51bWJlciBvZiBtaWxsaXNlY29uZHMuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoZSBkdXJhdGlvbiBtZXRhZGF0YSBpcyBvbmx5IGEgaGludCB0byBlbmFibGUgYSByZW1vdGUgbWVkaWEgcGxheWVyIHRvCi0gICAgICogZ3Vlc3MgdGhlIGR1cmF0aW9uIG9mIHRoZSBjb250ZW50IGJlZm9yZSBpdCBhY3R1YWxseSBvcGVucyB0aGUgbWVkaWEgc3RyZWFtLgotICAgICAqIFRoZSByZW1vdGUgbWVkaWEgcGxheWVyIHNob3VsZCBzdGlsbCBkZXRlcm1pbmUgdGhlIGFjdHVhbCBjb250ZW50IGR1cmF0aW9uIGZyb20KLSAgICAgKiB0aGUgbWVkaWEgc3RyZWFtIGl0c2VsZiBpbmRlcGVuZGVudCBvZiB0aGUgdmFsdWUgdGhhdCBtYXkgYmUgc3BlY2lmaWVkIGJ5IHRoaXMga2V5LgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfRFVSQVRJT04gPSAiYW5kcm9pZC5tZWRpYS5tZXRhZGF0YS5EVVJBVElPTiI7Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFJdGVtU3RhdHVzLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFJdGVtU3RhdHVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwZWEyZDUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhSXRlbVN0YXR1cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYTsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQudXRpbC5UaW1lVXRpbHM7Ci0KLS8qKgotICogRGVzY3JpYmVzIHRoZSBwbGF5YmFjayBzdGF0dXMgb2YgYSBtZWRpYSBpdGVtLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIGlzIHBhcnQgb2YgdGhlIHJlbW90ZSBwbGF5YmFjayBwcm90b2NvbCBkZXNjcmliZWQgYnkgdGhlCi0gKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50IE1lZGlhQ29udHJvbEludGVudH0gY2xhc3MuCi0gKiA8L3A+PHA+Ci0gKiBBcyBhIG1lZGlhIGl0ZW0gaXMgcGxheWVkLCBpdCB0cmFuc2l0aW9ucyB0aHJvdWdoIGEgc2VxdWVuY2Ugb2Ygc3RhdGVzIGluY2x1ZGluZzoKLSAqIHtAbGluayAjUExBWUJBQ0tfU1RBVEVfUEVORElORyBwZW5kaW5nfSwge0BsaW5rICNQTEFZQkFDS19TVEFURV9CVUZGRVJJTkcgYnVmZmVyaW5nfSwKLSAqIHtAbGluayAjUExBWUJBQ0tfU1RBVEVfUExBWUlORyBwbGF5aW5nfSwge0BsaW5rICNQTEFZQkFDS19TVEFURV9QQVVTRUQgcGF1c2VkfSwKLSAqIHtAbGluayAjUExBWUJBQ0tfU1RBVEVfRklOSVNIRUQgZmluaXNoZWR9LCB7QGxpbmsgI1BMQVlCQUNLX1NUQVRFX0NBTkNFTEVEIGNhbmNlbGVkfSwKLSAqIHtAbGluayAjUExBWUJBQ0tfU1RBVEVfSU5WQUxJREFURUQgaW52YWxpZGF0ZWR9LCBhbmQKLSAqIHtAbGluayAjUExBWUJBQ0tfU1RBVEVfRVJST1IgZXJyb3J9LiAgUmVmZXIgdG8gdGhlIGRvY3VtZW50YXRpb24gb2YgZWFjaCBzdGF0ZQotICogZm9yIGFuIGV4cGxhbmF0aW9uIG9mIGl0cyBtZWFuaW5nLgotICogPC9wPjxwPgotICogV2hpbGUgdGhlIGl0ZW0gaXMgcGxheWluZywgdGhlIHBsYXliYWNrIHN0YXR1cyBtYXkgYWxzbyBpbmNsdWRlIHByb2dyZXNzIGluZm9ybWF0aW9uCi0gKiBhYm91dCB0aGUge0BsaW5rICNnZXRDb250ZW50UG9zaXRpb24gY29udGVudCBwb3NpdGlvbn0gYW5kCi0gKiB7QGxpbmsgI2dldENvbnRlbnREdXJhdGlvbiBjb250ZW50IGR1cmF0aW9ufSBhbHRob3VnaCBub3QgYWxsIHJvdXRlIGRlc3RpbmF0aW9ucwotICogd2lsbCByZXBvcnQgaXQuCi0gKiA8L3A+PHA+Ci0gKiBUbyBtb25pdG9yIHBsYXliYWNrIHN0YXR1cywgdGhlIGFwcGxpY2F0aW9uIHNob3VsZCBzdXBwbHkgYSB7QGxpbmsgUGVuZGluZ0ludGVudH0gdG8gdXNlIGFzIHRoZQotICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNFWFRSQV9JVEVNX1NUQVRVU19VUERBVEVfUkVDRUlWRVIgaXRlbSBzdGF0dXMgdXBkYXRlIHJlY2VpdmVyfQotICogZm9yIGEgZ2l2ZW4ge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fUExBWSBwbGF5YmFjayByZXF1ZXN0fS4gIE5vdGUgdGhhdAotICogdGhlIHN0YXR1cyB1cGRhdGUgcmVjZWl2ZXIgd2lsbCBvbmx5IGJlIGludm9rZWQgZm9yIG1ham9yIHN0YXR1cyBjaGFuZ2VzIHN1Y2ggYXMgYQotICogdHJhbnNpdGlvbiBmcm9tIHBsYXlpbmcgdG8gZmluaXNoZWQuCi0gKiA8L3A+PHAgY2xhc3M9Im5vdGUiPgotICogVGhlIHN0YXR1cyB1cGRhdGUgcmVjZWl2ZXIgd2lsbCBub3QgYmUgaW52b2tlZCBmb3IgbWlub3IgcHJvZ3Jlc3MgdXBkYXRlcyBzdWNoIGFzCi0gKiBjaGFuZ2VzIHRvIHBsYXliYWNrIHBvc2l0aW9uIG9yIGR1cmF0aW9uLiAgSWYgdGhlIGFwcGxpY2F0aW9uIHdhbnRzIHRvIG1vbml0b3IKLSAqIHBsYXliYWNrIHByb2dyZXNzLCB0aGVuIGl0IG11c3QgdXNlIHRoZQotICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fR0VUX1NUQVRVUyBnZXQgc3RhdHVzIHJlcXVlc3R9IHRvIHBvbGwgZm9yIGNoYW5nZXMKLSAqIHBlcmlvZGljYWxseSBhbmQgZXN0aW1hdGUgdGhlIHBsYXliYWNrIHBvc2l0aW9uIHdoaWxlIHBsYXlpbmcuICBOb3RlIHRoYXQgdGhlcmUgbWF5Ci0gKiBiZSBhIHNpZ25pZmljYW50IHBvd2VyIGltcGFjdCB0byBwb2xsaW5nIHNvIHRoZSBhcHBsaWNhdGlvbiBpcyBhZHZpc2VkIG9ubHkKLSAqIHRvIHBvbGwgd2hlbiB0aGUgc2NyZWVuIGlzIG9uIGFuZCBuZXZlciBtb3JlIHRoYW4gYWJvdXQgb25jZSBldmVyeSA1IHNlY29uZHMgb3Igc28uCi0gKiA8L3A+PHA+Ci0gKiBUaGlzIG9iamVjdCBpcyBpbW11dGFibGUgb25jZSBjcmVhdGVkIHVzaW5nIGEge0BsaW5rIEJ1aWxkZXJ9IGluc3RhbmNlLgotICogPC9wPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTWVkaWFJdGVtU3RhdHVzIHsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9USU1FU1RBTVAgPSAidGltZXN0YW1wIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9QTEFZQkFDS19TVEFURSA9ICJwbGF5YmFja1N0YXRlIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9DT05URU5UX1BPU0lUSU9OID0gImNvbnRlbnRQb3NpdGlvbiI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQ09OVEVOVF9EVVJBVElPTiA9ICJjb250ZW50RHVyYXRpb24iOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0VYVFJBUyA9ICJleHRyYXMiOwotCi0gICAgZmluYWwgQnVuZGxlIG1CdW5kbGU7Ci0KLSAgICAvKioKLSAgICAgKiBQbGF5YmFjayBzdGF0ZTogUGVuZGluZy4KLSAgICAgKiA8cD4KLSAgICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgbWVkaWEgaXRlbSBoYXMgbm90IHlldCBzdGFydGVkIHBsYXliYWNrIGJ1dCB3aWxsIGJlIHBsYXllZCBldmVudHVhbGx5LgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQTEFZQkFDS19TVEFURV9QRU5ESU5HID0gMDsKLQotICAgIC8qKgotICAgICAqIFBsYXliYWNrIHN0YXRlOiBQbGF5aW5nLgotICAgICAqIDxwPgotICAgICAqIEluZGljYXRlcyB0aGF0IHRoZSBtZWRpYSBpdGVtIGlzIGN1cnJlbnRseSBwbGF5aW5nLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQTEFZQkFDS19TVEFURV9QTEFZSU5HID0gMTsKLQotICAgIC8qKgotICAgICAqIFBsYXliYWNrIHN0YXRlOiBQYXVzZWQuCi0gICAgICogPHA+Ci0gICAgICogSW5kaWNhdGVzIHRoYXQgcGxheWJhY2sgb2YgdGhlIG1lZGlhIGl0ZW0gaGFzIGJlZW4gcGF1c2VkLiAgUGxheWJhY2sgY2FuIGJlCi0gICAgICogcmVzdW1lZCB1c2luZyB0aGUge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fUkVTVU1FIHJlc3VtZX0gYWN0aW9uLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQTEFZQkFDS19TVEFURV9QQVVTRUQgPSAyOwotCi0gICAgLyoqCi0gICAgICogUGxheWJhY2sgc3RhdGU6IEJ1ZmZlcmluZyBvciBzZWVraW5nIHRvIGEgbmV3IHBvc2l0aW9uLgotICAgICAqIDxwPgotICAgICAqIEluZGljYXRlcyB0aGF0IHRoZSBtZWRpYSBpdGVtIGhhcyBiZWVuIHRlbXBvcmFyaWx5IGludGVycnVwdGVkCi0gICAgICogdG8gZmV0Y2ggbW9yZSBjb250ZW50LiAgUGxheWJhY2sgd2lsbCBjb250aW51ZSBhdXRvbWF0aWNhbGx5Ci0gICAgICogd2hlbiBlbm91Z2ggY29udGVudCBoYXMgYmVlbiBidWZmZXJlZC4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUExBWUJBQ0tfU1RBVEVfQlVGRkVSSU5HID0gMzsKLQotICAgIC8qKgotICAgICAqIFBsYXliYWNrIHN0YXRlOiBGaW5pc2hlZC4KLSAgICAgKiA8cD4KLSAgICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgbWVkaWEgaXRlbSBwbGF5ZWQgdG8gdGhlIGVuZCBvZiB0aGUgY29udGVudCBhbmQgZmluaXNoZWQgbm9ybWFsbHkuCi0gICAgICogPC9wPjxwPgotICAgICAqIEEgZmluaXNoZWQgbWVkaWEgaXRlbSBjYW5ub3QgYmUgcmVzdW1lZC4gIFRvIHBsYXkgdGhlIGNvbnRlbnQgYWdhaW4sIHRoZSBhcHBsaWNhdGlvbgotICAgICAqIG11c3Qgc2VuZCBhIG5ldyB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9QTEFZIHBsYXl9IG9yCi0gICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fRU5RVUVVRSBlbnF1ZXVlfSBhY3Rpb24uCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBMQVlCQUNLX1NUQVRFX0ZJTklTSEVEID0gNDsKLQotICAgIC8qKgotICAgICAqIFBsYXliYWNrIHN0YXRlOiBDYW5jZWxlZC4KLSAgICAgKiA8cD4KLSAgICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgbWVkaWEgaXRlbSB3YXMgZXhwbGljaXRseSByZW1vdmVkIGZyb20gdGhlIHF1ZXVlIGJ5IHRoZQotICAgICAqIGFwcGxpY2F0aW9uLiAgSXRlbXMgbWF5IGJlIGNhbmNlbGVkIGFuZCByZW1vdmVkIGZyb20gdGhlIHF1ZXVlIHVzaW5nCi0gICAgICogdGhlIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1JFTU9WRSByZW1vdmV9IG9yCi0gICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fU1RPUCBzdG9wfSBhY3Rpb24gb3IgYnkgaXNzdWluZwotICAgICAqIGFub3RoZXIge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fUExBWSBwbGF5fSBhY3Rpb24gdGhhdCBoYXMgdGhlCi0gICAgICogc2lkZS1lZmZlY3Qgb2YgY2xlYXJpbmcgdGhlIHF1ZXVlLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBBIGNhbmNlbGVkIG1lZGlhIGl0ZW0gY2Fubm90IGJlIHJlc3VtZWQuICBUbyBwbGF5IHRoZSBjb250ZW50IGFnYWluLCB0aGUKLSAgICAgKiBhcHBsaWNhdGlvbiBtdXN0IHNlbmQgYSBuZXcge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fUExBWSBwbGF5fSBvcgotICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX0VOUVVFVUUgZW5xdWV1ZX0gYWN0aW9uLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQTEFZQkFDS19TVEFURV9DQU5DRUxFRCA9IDU7Ci0KLSAgICAvKioKLSAgICAgKiBQbGF5YmFjayBzdGF0ZTogSW52YWxpZGF0ZWQuCi0gICAgICogPHA+Ci0gICAgICogSW5kaWNhdGVzIHRoYXQgdGhlIG1lZGlhIGl0ZW0gd2FzIGludmFsaWRhdGVkIHBlcm1hbmVudGx5IGFuZCBpbnZvbHVudGFyaWx5LgotICAgICAqIFRoaXMgc3RhdGUgaXMgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IHRoZSBtZWRpYSBpdGVtIHdhcyBpbnZhbGlkYXRlZCBhbmQgcmVtb3ZlZAotICAgICAqIGZyb20gdGhlIHF1ZXVlIGJlY2F1c2UgdGhlIHNlc3Npb24gdG8gd2hpY2ggaXQgYmVsb25ncyB3YXMgaW52YWxpZGF0ZWQKLSAgICAgKiAodHlwaWNhbGx5IGJ5IGFub3RoZXIgYXBwbGljYXRpb24gdGFraW5nIGNvbnRyb2wgb2YgdGhlIHJvdXRlKS4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogV2hlbiBpbnZhbGlkYXRpb24gb2NjdXJzLCB0aGUgYXBwbGljYXRpb24gc2hvdWxkIGdlbmVyYWxseSB3YWl0IGZvciB0aGUgdXNlcgotICAgICAqIHRvIHBlcmZvcm0gYW4gZXhwbGljaXQgYWN0aW9uLCBzdWNoIGFzIGNsaWNraW5nIG9uIGEgcGxheSBidXR0b24gaW4gdGhlIFVJLAotICAgICAqIGJlZm9yZSBjcmVhdGluZyBhIG5ldyBtZWRpYSBzZXNzaW9uIHRvIGF2b2lkIHVubmVjZXNzYXJpbHkgaW50ZXJydXB0aW5nCi0gICAgICogYW5vdGhlciBhcHBsaWNhdGlvbiB0aGF0IG1heSBoYXZlIGp1c3Qgc3RhcnRlZCB1c2luZyB0aGUgcm91dGUuCi0gICAgICogPC9wPjxwPgotICAgICAqIEFuIGludmFsaWRhdGVkIG1lZGlhIGl0ZW0gY2Fubm90IGJlIHJlc3VtZWQuICBUbyBwbGF5IHRoZSBjb250ZW50IGFnYWluLCB0aGUgYXBwbGljYXRpb24KLSAgICAgKiBtdXN0IHNlbmQgYSBuZXcge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fUExBWSBwbGF5fSBvcgotICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX0VOUVVFVUUgZW5xdWV1ZX0gYWN0aW9uLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQTEFZQkFDS19TVEFURV9JTlZBTElEQVRFRCA9IDY7Ci0KLSAgICAvKioKLSAgICAgKiBQbGF5YmFjayBzdGF0ZTogUGxheWJhY2sgaGFsdGVkIG9yIGFib3J0ZWQgZHVlIHRvIGFuIGVycm9yLgotICAgICAqIDxwPgotICAgICAqIEV4YW1wbGVzIG9mIGVycm9ycyBhcmUgbm8gbmV0d29yayBjb25uZWN0aXZpdHkgd2hlbiBhdHRlbXB0aW5nIHRvIHJldHJpZXZlIGNvbnRlbnQKLSAgICAgKiBmcm9tIGEgc2VydmVyLCBvciBleHBpcmVkIHVzZXIgY3JlZGVudGlhbHMgd2hlbiB0cnlpbmcgdG8gcGxheSBzdWJzY3JpcHRpb24tYmFzZWQKLSAgICAgKiBjb250ZW50LgotICAgICAqIDwvcD48cD4KLSAgICAgKiBBIG1lZGlhIGl0ZW0gaW4gdGhlIGVycm9yIHN0YXRlIGNhbm5vdCBiZSByZXN1bWVkLiAgVG8gcGxheSB0aGUgY29udGVudCBhZ2FpbiwKLSAgICAgKiB0aGUgYXBwbGljYXRpb24gbXVzdCBzZW5kIGEgbmV3IHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1BMQVkgcGxheX0gb3IKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9FTlFVRVVFIGVucXVldWV9IGFjdGlvbi4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUExBWUJBQ0tfU1RBVEVfRVJST1IgPSA3OwotCi0gICAgLyoqCi0gICAgICogSW50ZWdlciBleHRyYTogSFRUUCBzdGF0dXMgY29kZS4KLSAgICAgKiA8cD4KLSAgICAgKiBTcGVjaWZpZXMgdGhlIEhUVFAgc3RhdHVzIGNvZGUgdGhhdCB3YXMgZW5jb3VudGVyZWQgd2hlbiB0aGUgY29udGVudAotICAgICAqIHdhcyByZXF1ZXN0ZWQgYWZ0ZXIgYWxsIHJlZGlyZWN0cyB3ZXJlIGZvbGxvd2VkLiAgVGhpcyBrZXkgb25seSBuZWVkcyB0bwotICAgICAqIHNwZWNpZmllZCB3aGVuIHRoZSBjb250ZW50IHVyaSB1c2VzIHRoZSBIVFRQIG9yIEhUVFBTIHNjaGVtZSBhbmQgYW4gZXJyb3IKLSAgICAgKiBvY2N1cnJlZC4gIFRoaXMga2V5IG1heSBiZSBvbWl0dGVkIGlmIHRoZSBjb250ZW50IHdhcyBhYmxlIHRvIGJlIHBsYXllZAotICAgICAqIHN1Y2Nlc3NmdWxseTsgdGhlcmUgaXMgbm8gbmVlZCB0byByZXBvcnQgYSAyMDAgKE9LKSBzdGF0dXMgY29kZS4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhlIHZhbHVlIGlzIGFuIGludGVnZXIgSFRUUCBzdGF0dXMgY29kZSwgc3VjaCBhcyA0MDEgKFVuYXV0aG9yaXplZCksCi0gICAgICogNDA0IChOb3QgRm91bmQpLCBvciA1MDAgKFNlcnZlciBFcnJvciksIG9yIDAgaWYgbm9uZS4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfSFRUUF9TVEFUVVNfQ09ERSA9Ci0gICAgICAgICAgICAiYW5kcm9pZC5tZWRpYS5zdGF0dXMuZXh0cmEuSFRUUF9TVEFUVVNfQ09ERSI7Ci0KLSAgICAvKioKLSAgICAgKiBCdW5kbGUgZXh0cmE6IEhUVFAgcmVzcG9uc2UgaGVhZGVycy4KLSAgICAgKiA8cD4KLSAgICAgKiBTcGVjaWZpZXMgdGhlIEhUVFAgcmVzcG9uc2UgaGVhZGVycyB0aGF0IHdlcmUgcmV0dXJuZWQgd2hlbiB0aGUgY29udGVudCB3YXMKLSAgICAgKiByZXF1ZXN0ZWQgZnJvbSB0aGUgbmV0d29yay4gIFRoZSBoZWFkZXJzIG1heSBpbmNsdWRlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgICAgKiBhYm91dCB0aGUgY29udGVudCBvciBhbnkgZXJyb3JzIGNvbmRpdGlvbnMgdGhhdCB3ZXJlIGVuY291bnRlcmVkIHdoaWxlCi0gICAgICogdHJ5aW5nIHRvIGZldGNoIHRoZSBjb250ZW50LgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGUgdmFsdWUgaXMgYSB7QGxpbmsgYW5kcm9pZC5vcy5CdW5kbGV9IG9mIHN0cmluZyBiYXNlZCBrZXktdmFsdWUgcGFpcnMKLSAgICAgKiB0aGF0IGRlc2NyaWJlIHRoZSBIVFRQIHJlc3BvbnNlIGhlYWRlcnMuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX0hUVFBfUkVTUE9OU0VfSEVBREVSUyA9Ci0gICAgICAgICAgICAiYW5kcm9pZC5tZWRpYS5zdGF0dXMuZXh0cmEuSFRUUF9SRVNQT05TRV9IRUFERVJTIjsKLQotICAgIE1lZGlhSXRlbVN0YXR1cyhCdW5kbGUgYnVuZGxlKSB7Ci0gICAgICAgIG1CdW5kbGUgPSBidW5kbGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdGltZXN0YW1wIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3RhdHVzIGluZm9ybWF0aW9uIGluCi0gICAgICogbWlsbGlzZWNvbmRzIHNpbmNlIGJvb3QgaW4gdGhlIHtAbGluayBTeXN0ZW1DbG9jayNlbGFwc2VkUmVhbHRpbWV9IHRpbWUgYmFzZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIHN0YXR1cyB0aW1lc3RhbXAgaW4gdGhlIHtAbGluayBTeXN0ZW1DbG9jayNlbGFwc2VkUmVhbHRpbWUoKX0gdGltZSBiYXNlLgotICAgICAqLwotICAgIHB1YmxpYyBsb25nIGdldFRpbWVzdGFtcCgpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0TG9uZyhLRVlfVElNRVNUQU1QKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBwbGF5YmFjayBzdGF0ZSBvZiB0aGUgbWVkaWEgaXRlbS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIHBsYXliYWNrIHN0YXRlLiAgT25lIG9mIHtAbGluayAjUExBWUJBQ0tfU1RBVEVfUEVORElOR30sCi0gICAgICoge0BsaW5rICNQTEFZQkFDS19TVEFURV9QTEFZSU5HfSwge0BsaW5rICNQTEFZQkFDS19TVEFURV9QQVVTRUR9LAotICAgICAqIHtAbGluayAjUExBWUJBQ0tfU1RBVEVfQlVGRkVSSU5HfSwge0BsaW5rICNQTEFZQkFDS19TVEFURV9GSU5JU0hFRH0sCi0gICAgICoge0BsaW5rICNQTEFZQkFDS19TVEFURV9DQU5DRUxFRH0sIHtAbGluayAjUExBWUJBQ0tfU1RBVEVfSU5WQUxJREFURUR9LAotICAgICAqIG9yIHtAbGluayAjUExBWUJBQ0tfU1RBVEVfRVJST1J9LgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0UGxheWJhY2tTdGF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0SW50KEtFWV9QTEFZQkFDS19TVEFURSwgUExBWUJBQ0tfU1RBVEVfRVJST1IpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGNvbnRlbnQgcGxheWJhY2sgcG9zaXRpb24gYXMgYSBsb25nIGludGVnZXIgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcwotICAgICAqIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgY29udGVudC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIGNvbnRlbnQgcGxheWJhY2sgcG9zaXRpb24gaW4gbWlsbGlzZWNvbmRzLCBvciAtMSBpZiB1bmtub3duLgotICAgICAqLwotICAgIHB1YmxpYyBsb25nIGdldENvbnRlbnRQb3NpdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0TG9uZyhLRVlfQ09OVEVOVF9QT1NJVElPTiwgLTEpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHRvdGFsIGR1cmF0aW9uIG9mIHRoZSBjb250ZW50IHRvIGJlIHBsYXllZCBhcyBhIGxvbmcgaW50ZWdlciBudW1iZXIgb2YKLSAgICAgKiBtaWxsaXNlY29uZHMuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBjb250ZW50IGR1cmF0aW9uIGluIG1pbGxpc2Vjb25kcywgb3IgLTEgaWYgdW5rbm93bi4KLSAgICAgKi8KLSAgICBwdWJsaWMgbG9uZyBnZXRDb250ZW50RHVyYXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldExvbmcoS0VZX0NPTlRFTlRfRFVSQVRJT04sIC0xKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGEgYnVuZGxlIG9mIGV4dHJhcyBmb3IgdGhpcyBzdGF0dXMgb2JqZWN0LgotICAgICAqIFRoZSBleHRyYXMgd2lsbCBiZSBpZ25vcmVkIGJ5IHRoZSBtZWRpYSByb3V0ZXIgYnV0IHRoZXkgbWF5IGJlIHVzZWQKLSAgICAgKiBieSBhcHBsaWNhdGlvbnMuCi0gICAgICovCi0gICAgcHVibGljIEJ1bmRsZSBnZXRFeHRyYXMoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldEJ1bmRsZShLRVlfRVhUUkFTKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIk1lZGlhSXRlbVN0YXR1c3sgIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoInRpbWVzdGFtcD0iKTsKLSAgICAgICAgVGltZVV0aWxzLmZvcm1hdER1cmF0aW9uKFN5c3RlbUNsb2NrLmVsYXBzZWRSZWFsdGltZSgpIC0gZ2V0VGltZXN0YW1wKCksIHJlc3VsdCk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiBtcyBhZ28iKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBwbGF5YmFja1N0YXRlPSIpLmFwcGVuZChwbGF5YmFja1N0YXRlVG9TdHJpbmcoZ2V0UGxheWJhY2tTdGF0ZSgpKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgY29udGVudFBvc2l0aW9uPSIpLmFwcGVuZChnZXRDb250ZW50UG9zaXRpb24oKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgY29udGVudER1cmF0aW9uPSIpLmFwcGVuZChnZXRDb250ZW50RHVyYXRpb24oKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgZXh0cmFzPSIpLmFwcGVuZChnZXRFeHRyYXMoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiB9Iik7Ci0gICAgICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgcGxheWJhY2tTdGF0ZVRvU3RyaW5nKGludCBwbGF5YmFja1N0YXRlKSB7Ci0gICAgICAgIHN3aXRjaCAocGxheWJhY2tTdGF0ZSkgewotICAgICAgICAgICAgY2FzZSBQTEFZQkFDS19TVEFURV9QRU5ESU5HOgotICAgICAgICAgICAgICAgIHJldHVybiAicGVuZGluZyI7Ci0gICAgICAgICAgICBjYXNlIFBMQVlCQUNLX1NUQVRFX0JVRkZFUklORzoKLSAgICAgICAgICAgICAgICByZXR1cm4gImJ1ZmZlcmluZyI7Ci0gICAgICAgICAgICBjYXNlIFBMQVlCQUNLX1NUQVRFX1BMQVlJTkc6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJwbGF5aW5nIjsKLSAgICAgICAgICAgIGNhc2UgUExBWUJBQ0tfU1RBVEVfUEFVU0VEOgotICAgICAgICAgICAgICAgIHJldHVybiAicGF1c2VkIjsKLSAgICAgICAgICAgIGNhc2UgUExBWUJBQ0tfU1RBVEVfRklOSVNIRUQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJmaW5pc2hlZCI7Ci0gICAgICAgICAgICBjYXNlIFBMQVlCQUNLX1NUQVRFX0NBTkNFTEVEOgotICAgICAgICAgICAgICAgIHJldHVybiAiY2FuY2VsZWQiOwotICAgICAgICAgICAgY2FzZSBQTEFZQkFDS19TVEFURV9JTlZBTElEQVRFRDoKLSAgICAgICAgICAgICAgICByZXR1cm4gImludmFsaWRhdGVkIjsKLSAgICAgICAgICAgIGNhc2UgUExBWUJBQ0tfU1RBVEVfRVJST1I6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJlcnJvciI7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEludGVnZXIudG9TdHJpbmcocGxheWJhY2tTdGF0ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydHMgdGhpcyBvYmplY3QgdG8gYSBidW5kbGUgZm9yIHNlcmlhbGl6YXRpb24uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBjb250ZW50cyBvZiB0aGUgb2JqZWN0IHJlcHJlc2VudGVkIGFzIGEgYnVuZGxlLgotICAgICAqLwotICAgIHB1YmxpYyBCdW5kbGUgYXNCdW5kbGUoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2UgZnJvbSBhIGJ1bmRsZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBidW5kbGUgVGhlIGJ1bmRsZSwgb3IgbnVsbCBpZiBub25lLgotICAgICAqIEByZXR1cm4gVGhlIG5ldyBpbnN0YW5jZSwgb3IgbnVsbCBpZiB0aGUgYnVuZGxlIHdhcyBudWxsLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTWVkaWFJdGVtU3RhdHVzIGZyb21CdW5kbGUoQnVuZGxlIGJ1bmRsZSkgewotICAgICAgICByZXR1cm4gYnVuZGxlICE9IG51bGwgPyBuZXcgTWVkaWFJdGVtU3RhdHVzKGJ1bmRsZSkgOiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEJ1aWxkZXIgZm9yIHtAbGluayBNZWRpYUl0ZW1TdGF0dXMgbWVkaWEgaXRlbSBzdGF0dXMgb2JqZWN0c30uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBCdWlsZGVyIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBCdW5kbGUgbUJ1bmRsZTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQ3JlYXRlcyBhIG1lZGlhIGl0ZW0gc3RhdHVzIGJ1aWxkZXIgdXNpbmcgdGhlIGN1cnJlbnQgdGltZSBhcyB0aGUKLSAgICAgICAgICogcmVmZXJlbmNlIHRpbWVzdGFtcC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHBsYXliYWNrU3RhdGUgVGhlIGl0ZW0gcGxheWJhY2sgc3RhdGUuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlcihpbnQgcGxheWJhY2tTdGF0ZSkgewotICAgICAgICAgICAgbUJ1bmRsZSA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgICAgIHNldFRpbWVzdGFtcChTeXN0ZW1DbG9jay5lbGFwc2VkUmVhbHRpbWUoKSk7Ci0gICAgICAgICAgICBzZXRQbGF5YmFja1N0YXRlKHBsYXliYWNrU3RhdGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENyZWF0ZXMgYSBtZWRpYSBpdGVtIHN0YXR1cyBidWlsZGVyIHdob3NlIGluaXRpYWwgY29udGVudHMgYXJlCi0gICAgICAgICAqIGNvcGllZCBmcm9tIGFuIGV4aXN0aW5nIHN0YXR1cy4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyKE1lZGlhSXRlbVN0YXR1cyBzdGF0dXMpIHsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInN0YXR1cyBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1CdW5kbGUgPSBuZXcgQnVuZGxlKHN0YXR1cy5tQnVuZGxlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSB0aW1lc3RhbXAgYXNzb2NpYXRlZCB3aXRoIHRoZSBzdGF0dXMgaW5mb3JtYXRpb24gaW4KLSAgICAgICAgICogbWlsbGlzZWNvbmRzIHNpbmNlIGJvb3QgaW4gdGhlIHtAbGluayBTeXN0ZW1DbG9jayNlbGFwc2VkUmVhbHRpbWV9IHRpbWUgYmFzZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldFRpbWVzdGFtcChsb25nIGVsYXBzZWRSZWFsdGltZVRpbWVzdGFtcCkgewotICAgICAgICAgICAgbUJ1bmRsZS5wdXRMb25nKEtFWV9USU1FU1RBTVAsIGVsYXBzZWRSZWFsdGltZVRpbWVzdGFtcCk7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSBwbGF5YmFjayBzdGF0ZSBvZiB0aGUgbWVkaWEgaXRlbS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldFBsYXliYWNrU3RhdGUoaW50IHBsYXliYWNrU3RhdGUpIHsKLSAgICAgICAgICAgIG1CdW5kbGUucHV0SW50KEtFWV9QTEFZQkFDS19TVEFURSwgcGxheWJhY2tTdGF0ZSk7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSBjb250ZW50IHBsYXliYWNrIHBvc2l0aW9uIGFzIGEgbG9uZyBpbnRlZ2VyIG51bWJlciBvZiBtaWxsaXNlY29uZHMKLSAgICAgICAgICogZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjb250ZW50LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0Q29udGVudFBvc2l0aW9uKGxvbmcgcG9zaXRpb25NaWxsaXNlY29uZHMpIHsKLSAgICAgICAgICAgIG1CdW5kbGUucHV0TG9uZyhLRVlfQ09OVEVOVF9QT1NJVElPTiwgcG9zaXRpb25NaWxsaXNlY29uZHMpOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgdG90YWwgZHVyYXRpb24gb2YgdGhlIGNvbnRlbnQgdG8gYmUgcGxheWVkIGFzIGEgbG9uZyBpbnRlZ2VyIG51bWJlcgotICAgICAgICAgKiBvZiBtaWxsaXNlY29uZHMuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRDb250ZW50RHVyYXRpb24obG9uZyBkdXJhdGlvbk1pbGxpc2Vjb25kcykgewotICAgICAgICAgICAgbUJ1bmRsZS5wdXRMb25nKEtFWV9DT05URU5UX0RVUkFUSU9OLCBkdXJhdGlvbk1pbGxpc2Vjb25kcyk7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIGEgYnVuZGxlIG9mIGV4dHJhcyBmb3IgdGhpcyBzdGF0dXMgb2JqZWN0LgotICAgICAgICAgKiBUaGUgZXh0cmFzIHdpbGwgYmUgaWdub3JlZCBieSB0aGUgbWVkaWEgcm91dGVyIGJ1dCB0aGV5IG1heSBiZSB1c2VkCi0gICAgICAgICAqIGJ5IGFwcGxpY2F0aW9ucy4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldEV4dHJhcyhCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgICAgICBtQnVuZGxlLnB1dEJ1bmRsZShLRVlfRVhUUkFTLCBleHRyYXMpOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQnVpbGRzIHRoZSB7QGxpbmsgTWVkaWFJdGVtU3RhdHVzIG1lZGlhIGl0ZW0gc3RhdHVzIG9iamVjdH0uCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgTWVkaWFJdGVtU3RhdHVzIGJ1aWxkKCkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBNZWRpYUl0ZW1TdGF0dXMobUJ1bmRsZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFSb3V0ZURlc2NyaXB0b3IuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYVJvdXRlRGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YmM4NGZjLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYVJvdXRlRGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWE7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRTZW5kZXI7Ci1pbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIERlc2NyaWJlcyB0aGUgcHJvcGVydGllcyBvZiBhIHJvdXRlLgotICogPHA+Ci0gKiBFYWNoIHJvdXRlIGlzIHVuaXF1ZWx5IGlkZW50aWZpZWQgYnkgYW4gb3BhcXVlIGlkIHN0cmluZy4gIFRoaXMgdG9rZW4KLSAqIG1heSB0YWtlIGFueSBmb3JtIGFzIGxvbmcgYXMgaXQgaXMgdW5pcXVlIHdpdGhpbiB0aGUgbWVkaWEgcm91dGUgcHJvdmlkZXIuCi0gKiA8L3A+PHA+Ci0gKiBUaGlzIG9iamVjdCBpcyBpbW11dGFibGUgb25jZSBjcmVhdGVkIHVzaW5nIGEge0BsaW5rIEJ1aWxkZXJ9IGluc3RhbmNlLgotICogPC9wPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTWVkaWFSb3V0ZURlc2NyaXB0b3IgewotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0lEID0gImlkIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9HUk9VUF9NRU1CRVJfSURTID0gImdyb3VwTWVtYmVySWRzIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9OQU1FID0gIm5hbWUiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0RFU0NSSVBUSU9OID0gInN0YXR1cyI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfSUNPTl9VUkkgPSAiaWNvblVyaSI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfRU5BQkxFRCA9ICJlbmFibGVkIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9DT05ORUNUSU5HID0gImNvbm5lY3RpbmciOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0NPTk5FQ1RJT05fU1RBVEUgPSAiY29ubmVjdGlvblN0YXRlIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9DT05UUk9MX0ZJTFRFUlMgPSAiY29udHJvbEZpbHRlcnMiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1BMQVlCQUNLX1RZUEUgPSAicGxheWJhY2tUeXBlIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9QTEFZQkFDS19TVFJFQU0gPSAicGxheWJhY2tTdHJlYW0iOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0RFVklDRV9UWVBFID0gImRldmljZVR5cGUiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1ZPTFVNRSA9ICJ2b2x1bWUiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1ZPTFVNRV9NQVggPSAidm9sdW1lTWF4IjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9WT0xVTUVfSEFORExJTkcgPSAidm9sdW1lSGFuZGxpbmciOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1BSRVNFTlRBVElPTl9ESVNQTEFZX0lEID0gInByZXNlbnRhdGlvbkRpc3BsYXlJZCI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfRVhUUkFTID0gImV4dHJhcyI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQ0FOX0RJU0NPTk5FQ1QgPSAiY2FuRGlzY29ubmVjdCI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfU0VUVElOR1NfSU5URU5UID0gInNldHRpbmdzSW50ZW50IjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9NSU5fQ0xJRU5UX1ZFUlNJT04gPSAibWluQ2xpZW50VmVyc2lvbiI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfTUFYX0NMSUVOVF9WRVJTSU9OID0gIm1heENsaWVudFZlcnNpb24iOwotCi0gICAgZmluYWwgQnVuZGxlIG1CdW5kbGU7Ci0gICAgTGlzdDxJbnRlbnRGaWx0ZXI+IG1Db250cm9sRmlsdGVyczsKLQotICAgIE1lZGlhUm91dGVEZXNjcmlwdG9yKEJ1bmRsZSBidW5kbGUsIExpc3Q8SW50ZW50RmlsdGVyPiBjb250cm9sRmlsdGVycykgewotICAgICAgICBtQnVuZGxlID0gYnVuZGxlOwotICAgICAgICBtQ29udHJvbEZpbHRlcnMgPSBjb250cm9sRmlsdGVyczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB1bmlxdWUgaWQgb2YgdGhlIHJvdXRlLgotICAgICAqIDxwPgotICAgICAqIFRoZSByb3V0ZSBpZCBhc3NvY2lhdGVkIHdpdGggYSByb3V0ZSBkZXNjcmlwdG9yIGZ1bmN0aW9ucyBhcyBhIHN0YWJsZQotICAgICAqIGlkZW50aWZpZXIgZm9yIHRoZSByb3V0ZSBhbmQgbXVzdCBiZSB1bmlxdWUgYW1vbmcgYWxsIHJvdXRlcyBvZmZlcmVkCi0gICAgICogYnkgdGhlIHByb3ZpZGVyLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldElkKCkgewotICAgICAgICByZXR1cm4gbUJ1bmRsZS5nZXRTdHJpbmcoS0VZX0lEKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBncm91cCBtZW1iZXIgaWRzIG9mIHRoZSByb3V0ZS4KLSAgICAgKiA8cD4KLSAgICAgKiBBIHJvdXRlIGRlc2NyaXB0b3IgdGhhdCBoYXMgb25lIG9yIG1vcmUgZ3JvdXAgbWVtYmVyIHJvdXRlIGlkcwotICAgICAqIHJlcHJlc2VudHMgYSByb3V0ZSBncm91cC4gQSBtZW1iZXIgcm91dGUgbWF5IGJlbG9uZyB0byBhbm90aGVyIGdyb3VwLgotICAgICAqIDwvcD4KLSAgICAgKiBAaGlkZQotICAgICAqLwotICAgIC8vIEBSZXN0cmljdFRvKExJQlJBUllfR1JPVVApCi0gICAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRHcm91cE1lbWJlcklkcygpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0U3RyaW5nQXJyYXlMaXN0KEtFWV9HUk9VUF9NRU1CRVJfSURTKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB1c2VyLXZpc2libGUgbmFtZSBvZiB0aGUgcm91dGUuCi0gICAgICogPHA+Ci0gICAgICogVGhlIHJvdXRlIG5hbWUgaWRlbnRpZmllcyB0aGUgZGVzdGluYXRpb24gcmVwcmVzZW50ZWQgYnkgdGhlIHJvdXRlLgotICAgICAqIEl0IG1heSBiZSBhIHVzZXItc3VwcGxpZWQgbmFtZSwgYW4gYWxpYXMsIG9yIGRldmljZSBzZXJpYWwgbnVtYmVyLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldFN0cmluZyhLRVlfTkFNRSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdXNlci12aXNpYmxlIGRlc2NyaXB0aW9uIG9mIHRoZSByb3V0ZS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgcm91dGUgZGVzY3JpcHRpb24gZGVzY3JpYmVzIHRoZSBraW5kIG9mIGRlc3RpbmF0aW9uIHJlcHJlc2VudGVkIGJ5IHRoZSByb3V0ZS4KLSAgICAgKiBJdCBtYXkgYmUgYSB1c2VyLXN1cHBsaWVkIHN0cmluZywgYSBtb2RlbCBudW1iZXIgb3IgYnJhbmQgb2YgZGV2aWNlLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotICAgICAgICByZXR1cm4gbUJ1bmRsZS5nZXRTdHJpbmcoS0VZX0RFU0NSSVBUSU9OKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBVUkkgb2YgdGhlIGljb24gcmVwcmVzZW50aW5nIHRoaXMgcm91dGUuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBpY29uIHdpbGwgYmUgdXNlZCBpbiBwaWNrZXIgVUlzIGlmIGF2YWlsYWJsZS4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIFVyaSBnZXRJY29uVXJpKCkgewotICAgICAgICBTdHJpbmcgaWNvblVyaSA9IG1CdW5kbGUuZ2V0U3RyaW5nKEtFWV9JQ09OX1VSSSk7Ci0gICAgICAgIHJldHVybiBpY29uVXJpID09IG51bGwgPyBudWxsIDogVXJpLnBhcnNlKGljb25VcmkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgd2hldGhlciB0aGUgcm91dGUgaXMgZW5hYmxlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldEJvb2xlYW4oS0VZX0VOQUJMRUQsIHRydWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgd2hldGhlciB0aGUgcm91dGUgaXMgY29ubmVjdGluZy4KLSAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICNnZXRDb25uZWN0aW9uU3RhdGV9IGluc3RlYWQKLSAgICAgKi8KLSAgICBARGVwcmVjYXRlZAotICAgIHB1YmxpYyBib29sZWFuIGlzQ29ubmVjdGluZygpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0Qm9vbGVhbihLRVlfQ09OTkVDVElORywgZmFsc2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGNvbm5lY3Rpb24gc3RhdGUgb2YgdGhlIHJvdXRlLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgY29ubmVjdGlvbiBzdGF0ZSBvZiB0aGlzIHJvdXRlOgotICAgICAqIHtAbGluayBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jQ09OTkVDVElPTl9TVEFURV9ESVNDT05ORUNURUR9LAotICAgICAqIHtAbGluayBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jQ09OTkVDVElPTl9TVEFURV9DT05ORUNUSU5HfSwgb3IKLSAgICAgKiB7QGxpbmsgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI0NPTk5FQ1RJT05fU1RBVEVfQ09OTkVDVEVEfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldENvbm5lY3Rpb25TdGF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0SW50KEtFWV9DT05ORUNUSU9OX1NUQVRFLAotICAgICAgICAgICAgICAgIE1lZGlhUm91dGVyLlJvdXRlSW5mby5DT05ORUNUSU9OX1NUQVRFX0RJU0NPTk5FQ1RFRCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB3aGV0aGVyIHRoZSByb3V0ZSBjYW4gYmUgZGlzY29ubmVjdGVkIHdpdGhvdXQgc3RvcHBpbmcgcGxheWJhY2suCi0gICAgICogPHA+Ci0gICAgICogVGhlIHJvdXRlIGNhbiBub3JtYWxseSBiZSBkaXNjb25uZWN0ZWQgd2l0aG91dCBzdG9wcGluZyBwbGF5YmFjayB3aGVuCi0gICAgICogdGhlIGRlc3RpbmF0aW9uIGRldmljZSBvbiB0aGUgcm91dGUgaXMgY29ubmVjdGVkIHRvIHR3byBvciBtb3JlIHNvdXJjZQotICAgICAqIGRldmljZXMuIFRoZSByb3V0ZSBwcm92aWRlciBzaG91bGQgdXBkYXRlIHRoZSByb3V0ZSBpbW1lZGlhdGVseSB3aGVuIHRoZQotICAgICAqIG51bWJlciBvZiBjb25uZWN0ZWQgZGV2aWNlcyBjaGFuZ2VzLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUbyBzcGVjaWZ5IHRoYXQgdGhlIHJvdXRlIHNob3VsZCBkaXNjb25uZWN0IHdpdGhvdXQgc3RvcHBpbmcgdXNlCi0gICAgICoge0BsaW5rIE1lZGlhUm91dGVyI3Vuc2VsZWN0KGludCl9IHdpdGgKLSAgICAgKiB7QGxpbmsgTWVkaWFSb3V0ZXIjVU5TRUxFQ1RfUkVBU09OX0RJU0NPTk5FQ1RFRH0uCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGNhbkRpc2Nvbm5lY3RBbmRLZWVwUGxheWluZygpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0Qm9vbGVhbihLRVlfQ0FOX0RJU0NPTk5FQ1QsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGFuIHtAbGluayBJbnRlbnRTZW5kZXJ9IGZvciBzdGFydGluZyBhIHNldHRpbmdzIGFjdGl2aXR5IGZvciB0aGlzCi0gICAgICogcm91dGUuIFRoZSBhY3Rpdml0eSBtYXkgaGF2ZSBzcGVjaWZpYyByb3V0ZSBzZXR0aW5ncyBvciBnZW5lcmFsIHNldHRpbmdzCi0gICAgICogZm9yIHRoZSBjb25uZWN0ZWQgZGV2aWNlIG9yIHJvdXRlIHByb3ZpZGVyLgotICAgICAqCi0gICAgICogQHJldHVybiBBbiB7QGxpbmsgSW50ZW50U2VuZGVyfSB0byBzdGFydCBhIHNldHRpbmdzIGFjdGl2aXR5LgotICAgICAqLwotICAgIHB1YmxpYyBJbnRlbnRTZW5kZXIgZ2V0U2V0dGluZ3NBY3Rpdml0eSgpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0UGFyY2VsYWJsZShLRVlfU0VUVElOR1NfSU5URU5UKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSByb3V0ZSdzIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQgbWVkaWEgY29udHJvbCBpbnRlbnR9IGZpbHRlcnMuCi0gICAgICovCi0gICAgcHVibGljIExpc3Q8SW50ZW50RmlsdGVyPiBnZXRDb250cm9sRmlsdGVycygpIHsKLSAgICAgICAgZW5zdXJlQ29udHJvbEZpbHRlcnMoKTsKLSAgICAgICAgcmV0dXJuIG1Db250cm9sRmlsdGVyczsKLSAgICB9Ci0KLSAgICB2b2lkIGVuc3VyZUNvbnRyb2xGaWx0ZXJzKCkgewotICAgICAgICBpZiAobUNvbnRyb2xGaWx0ZXJzID09IG51bGwpIHsKLSAgICAgICAgICAgIG1Db250cm9sRmlsdGVycyA9IG1CdW5kbGUuPEludGVudEZpbHRlcj5nZXRQYXJjZWxhYmxlQXJyYXlMaXN0KEtFWV9DT05UUk9MX0ZJTFRFUlMpOwotICAgICAgICAgICAgaWYgKG1Db250cm9sRmlsdGVycyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUNvbnRyb2xGaWx0ZXJzID0gQ29sbGVjdGlvbnMuPEludGVudEZpbHRlcj5lbXB0eUxpc3QoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHR5cGUgb2YgcGxheWJhY2sgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcm91dGUuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSB0eXBlIG9mIHBsYXliYWNrIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJvdXRlOgotICAgICAqIHtAbGluayBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jUExBWUJBQ0tfVFlQRV9MT0NBTH0gb3IKLSAgICAgKiB7QGxpbmsgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI1BMQVlCQUNLX1RZUEVfUkVNT1RFfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFBsYXliYWNrVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0SW50KEtFWV9QTEFZQkFDS19UWVBFLCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8uUExBWUJBQ0tfVFlQRV9SRU1PVEUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHJvdXRlJ3MgcGxheWJhY2sgc3RyZWFtLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0UGxheWJhY2tTdHJlYW0oKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldEludChLRVlfUExBWUJBQ0tfU1RSRUFNLCAtMSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdHlwZSBvZiB0aGUgcmVjZWl2ZXIgZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJvdXRlLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgdHlwZSBvZiB0aGUgcmVjZWl2ZXIgZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJvdXRlOgotICAgICAqIHtAbGluayBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jREVWSUNFX1RZUEVfVFZ9IG9yCi0gICAgICoge0BsaW5rIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNERVZJQ0VfVFlQRV9TUEVBS0VSfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldERldmljZVR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldEludChLRVlfREVWSUNFX1RZUEUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHJvdXRlJ3MgY3VycmVudCB2b2x1bWUsIG9yIDAgaWYgdW5rbm93bi4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFZvbHVtZSgpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0SW50KEtFWV9WT0xVTUUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHJvdXRlJ3MgbWF4aW11bSB2b2x1bWUsIG9yIDAgaWYgdW5rbm93bi4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFZvbHVtZU1heCgpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0SW50KEtFWV9WT0xVTUVfTUFYKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGluZm9ybWF0aW9uIGFib3V0IGhvdyB2b2x1bWUgaXMgaGFuZGxlZCBvbiB0aGUgcm91dGUuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIEhvdyB2b2x1bWUgaXMgaGFuZGxlZCBvbiB0aGUgcm91dGU6Ci0gICAgICoge0BsaW5rIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNQTEFZQkFDS19WT0xVTUVfRklYRUR9IG9yCi0gICAgICoge0BsaW5rIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNQTEFZQkFDS19WT0xVTUVfVkFSSUFCTEV9LgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0Vm9sdW1lSGFuZGxpbmcoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldEludChLRVlfVk9MVU1FX0hBTkRMSU5HLAotICAgICAgICAgICAgICAgIE1lZGlhUm91dGVyLlJvdXRlSW5mby5QTEFZQkFDS19WT0xVTUVfRklYRUQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHJvdXRlJ3MgcHJlc2VudGF0aW9uIGRpc3BsYXkgaWQsIG9yIC0xIGlmIG5vbmUuCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRQcmVzZW50YXRpb25EaXNwbGF5SWQoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldEludCgKLSAgICAgICAgICAgICAgICBLRVlfUFJFU0VOVEFUSU9OX0RJU1BMQVlfSUQsIE1lZGlhUm91dGVyLlJvdXRlSW5mby5QUkVTRU5UQVRJT05fRElTUExBWV9JRF9OT05FKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGEgYnVuZGxlIG9mIGV4dHJhcyBmb3IgdGhpcyByb3V0ZSBkZXNjcmlwdG9yLgotICAgICAqIFRoZSBleHRyYXMgd2lsbCBiZSBpZ25vcmVkIGJ5IHRoZSBtZWRpYSByb3V0ZXIgYnV0IHRoZXkgbWF5IGJlIHVzZWQKLSAgICAgKiBieSBhcHBsaWNhdGlvbnMuCi0gICAgICovCi0gICAgcHVibGljIEJ1bmRsZSBnZXRFeHRyYXMoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldEJ1bmRsZShLRVlfRVhUUkFTKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBtaW5pbXVtIGNsaWVudCB2ZXJzaW9uIHJlcXVpcmVkIGZvciB0aGlzIHJvdXRlLgotICAgICAqIEBoaWRlCi0gICAgICovCi0gICAgLy8gQFJlc3RyaWN0VG8oTElCUkFSWV9HUk9VUCkKLSAgICBwdWJsaWMgaW50IGdldE1pbkNsaWVudFZlcnNpb24oKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldEludChLRVlfTUlOX0NMSUVOVF9WRVJTSU9OLAotICAgICAgICAgICAgICAgIE1lZGlhUm91dGVQcm92aWRlclByb3RvY29sLkNMSUVOVF9WRVJTSU9OX1NUQVJUKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBtYXhpbXVtIGNsaWVudCB2ZXJzaW9uIHJlcXVpcmVkIGZvciB0aGlzIHJvdXRlLgotICAgICAqIEBoaWRlCi0gICAgICovCi0gICAgLy8gQFJlc3RyaWN0VG8oTElCUkFSWV9HUk9VUCkKLSAgICBwdWJsaWMgaW50IGdldE1heENsaWVudFZlcnNpb24oKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldEludChLRVlfTUFYX0NMSUVOVF9WRVJTSU9OLCBJbnRlZ2VyLk1BWF9WQUxVRSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSByb3V0ZSBkZXNjcmlwdG9yIGhhcyBhbGwgb2YgdGhlIHJlcXVpcmVkIGZpZWxkcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCkgewotICAgICAgICBlbnN1cmVDb250cm9sRmlsdGVycygpOwotICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkoZ2V0SWQoKSkKLSAgICAgICAgICAgICAgICB8fCBUZXh0VXRpbHMuaXNFbXB0eShnZXROYW1lKCkpCi0gICAgICAgICAgICAgICAgfHwgbUNvbnRyb2xGaWx0ZXJzLmNvbnRhaW5zKG51bGwpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCJNZWRpYVJvdXRlRGVzY3JpcHRvcnsgIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoImlkPSIpLmFwcGVuZChnZXRJZCgpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBncm91cE1lbWJlcklkcz0iKS5hcHBlbmQoZ2V0R3JvdXBNZW1iZXJJZHMoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgbmFtZT0iKS5hcHBlbmQoZ2V0TmFtZSgpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBkZXNjcmlwdGlvbj0iKS5hcHBlbmQoZ2V0RGVzY3JpcHRpb24oKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgaWNvblVyaT0iKS5hcHBlbmQoZ2V0SWNvblVyaSgpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBpc0VuYWJsZWQ9IikuYXBwZW5kKGlzRW5hYmxlZCgpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBpc0Nvbm5lY3Rpbmc9IikuYXBwZW5kKGlzQ29ubmVjdGluZygpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBjb25uZWN0aW9uU3RhdGU9IikuYXBwZW5kKGdldENvbm5lY3Rpb25TdGF0ZSgpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBjb250cm9sRmlsdGVycz0iKS5hcHBlbmQoQXJyYXlzLnRvU3RyaW5nKGdldENvbnRyb2xGaWx0ZXJzKCkudG9BcnJheSgpKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgcGxheWJhY2tUeXBlPSIpLmFwcGVuZChnZXRQbGF5YmFja1R5cGUoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgcGxheWJhY2tTdHJlYW09IikuYXBwZW5kKGdldFBsYXliYWNrU3RyZWFtKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGRldmljZVR5cGU9IikuYXBwZW5kKGdldERldmljZVR5cGUoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgdm9sdW1lPSIpLmFwcGVuZChnZXRWb2x1bWUoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgdm9sdW1lTWF4PSIpLmFwcGVuZChnZXRWb2x1bWVNYXgoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgdm9sdW1lSGFuZGxpbmc9IikuYXBwZW5kKGdldFZvbHVtZUhhbmRsaW5nKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIHByZXNlbnRhdGlvbkRpc3BsYXlJZD0iKS5hcHBlbmQoZ2V0UHJlc2VudGF0aW9uRGlzcGxheUlkKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGV4dHJhcz0iKS5hcHBlbmQoZ2V0RXh0cmFzKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGlzVmFsaWQ9IikuYXBwZW5kKGlzVmFsaWQoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgbWluQ2xpZW50VmVyc2lvbj0iKS5hcHBlbmQoZ2V0TWluQ2xpZW50VmVyc2lvbigpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBtYXhDbGllbnRWZXJzaW9uPSIpLmFwcGVuZChnZXRNYXhDbGllbnRWZXJzaW9uKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIgfSIpOwotICAgICAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydHMgdGhpcyBvYmplY3QgdG8gYSBidW5kbGUgZm9yIHNlcmlhbGl6YXRpb24uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBjb250ZW50cyBvZiB0aGUgb2JqZWN0IHJlcHJlc2VudGVkIGFzIGEgYnVuZGxlLgotICAgICAqLwotICAgIHB1YmxpYyBCdW5kbGUgYXNCdW5kbGUoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2UgZnJvbSBhIGJ1bmRsZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBidW5kbGUgVGhlIGJ1bmRsZSwgb3IgbnVsbCBpZiBub25lLgotICAgICAqIEByZXR1cm4gVGhlIG5ldyBpbnN0YW5jZSwgb3IgbnVsbCBpZiB0aGUgYnVuZGxlIHdhcyBudWxsLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTWVkaWFSb3V0ZURlc2NyaXB0b3IgZnJvbUJ1bmRsZShCdW5kbGUgYnVuZGxlKSB7Ci0gICAgICAgIHJldHVybiBidW5kbGUgIT0gbnVsbCA/IG5ldyBNZWRpYVJvdXRlRGVzY3JpcHRvcihidW5kbGUsIG51bGwpIDogbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBCdWlsZGVyIGZvciB7QGxpbmsgTWVkaWFSb3V0ZURlc2NyaXB0b3IgbWVkaWEgcm91dGUgZGVzY3JpcHRvcnN9LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQnVpbGRlciB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgQnVuZGxlIG1CdW5kbGU7Ci0gICAgICAgIHByaXZhdGUgQXJyYXlMaXN0PFN0cmluZz4gbUdyb3VwTWVtYmVySWRzOwotICAgICAgICBwcml2YXRlIEFycmF5TGlzdDxJbnRlbnRGaWx0ZXI+IG1Db250cm9sRmlsdGVyczsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQ3JlYXRlcyBhIG1lZGlhIHJvdXRlIGRlc2NyaXB0b3IgYnVpbGRlci4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGlkIFRoZSB1bmlxdWUgaWQgb2YgdGhlIHJvdXRlLgotICAgICAgICAgKiBAcGFyYW0gbmFtZSBUaGUgdXNlci12aXNpYmxlIG5hbWUgb2YgdGhlIHJvdXRlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIoU3RyaW5nIGlkLCBTdHJpbmcgbmFtZSkgewotICAgICAgICAgICAgbUJ1bmRsZSA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgICAgIHNldElkKGlkKTsKLSAgICAgICAgICAgIHNldE5hbWUobmFtZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQ3JlYXRlcyBhIG1lZGlhIHJvdXRlIGRlc2NyaXB0b3IgYnVpbGRlciB3aG9zZSBpbml0aWFsIGNvbnRlbnRzIGFyZQotICAgICAgICAgKiBjb3BpZWQgZnJvbSBhbiBleGlzdGluZyBkZXNjcmlwdG9yLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIoTWVkaWFSb3V0ZURlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotICAgICAgICAgICAgaWYgKGRlc2NyaXB0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImRlc2NyaXB0b3IgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtQnVuZGxlID0gbmV3IEJ1bmRsZShkZXNjcmlwdG9yLm1CdW5kbGUpOwotCi0gICAgICAgICAgICBkZXNjcmlwdG9yLmVuc3VyZUNvbnRyb2xGaWx0ZXJzKCk7Ci0gICAgICAgICAgICBpZiAoIWRlc2NyaXB0b3IubUNvbnRyb2xGaWx0ZXJzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIG1Db250cm9sRmlsdGVycyA9IG5ldyBBcnJheUxpc3Q8SW50ZW50RmlsdGVyPihkZXNjcmlwdG9yLm1Db250cm9sRmlsdGVycyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgdW5pcXVlIGlkIG9mIHRoZSByb3V0ZS4KLSAgICAgICAgICogPHA+Ci0gICAgICAgICAqIFRoZSByb3V0ZSBpZCBhc3NvY2lhdGVkIHdpdGggYSByb3V0ZSBkZXNjcmlwdG9yIGZ1bmN0aW9ucyBhcyBhIHN0YWJsZQotICAgICAgICAgKiBpZGVudGlmaWVyIGZvciB0aGUgcm91dGUgYW5kIG11c3QgYmUgdW5pcXVlIGFtb25nIGFsbCByb3V0ZXMgb2ZmZXJlZAotICAgICAgICAgKiBieSB0aGUgcHJvdmlkZXIuCi0gICAgICAgICAqIDwvcD4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldElkKFN0cmluZyBpZCkgewotICAgICAgICAgICAgbUJ1bmRsZS5wdXRTdHJpbmcoS0VZX0lELCBpZCk7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBZGRzIGEgZ3JvdXAgbWVtYmVyIGlkIG9mIHRoZSByb3V0ZS4KLSAgICAgICAgICogPHA+Ci0gICAgICAgICAqIEEgcm91dGUgZGVzY3JpcHRvciB0aGF0IGhhcyBvbmUgb3IgbW9yZSBncm91cCBtZW1iZXIgcm91dGUgaWRzCi0gICAgICAgICAqIHJlcHJlc2VudHMgYSByb3V0ZSBncm91cC4gQSBtZW1iZXIgcm91dGUgbWF5IGJlbG9uZyB0byBhbm90aGVyIGdyb3VwLgotICAgICAgICAgKiA8L3A+Ci0gICAgICAgICAqIEBoaWRlCi0gICAgICAgICAqLwotICAgICAgICAvLyBAUmVzdHJpY3RUbyhMSUJSQVJZX0dST1VQKQotICAgICAgICBwdWJsaWMgQnVpbGRlciBhZGRHcm91cE1lbWJlcklkKFN0cmluZyBncm91cE1lbWJlcklkKSB7Ci0gICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkoZ3JvdXBNZW1iZXJJZCkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJncm91cE1lbWJlcklkIG11c3Qgbm90IGJlIGVtcHR5Iik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtR3JvdXBNZW1iZXJJZHMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1Hcm91cE1lbWJlcklkcyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFtR3JvdXBNZW1iZXJJZHMuY29udGFpbnMoZ3JvdXBNZW1iZXJJZCkpIHsKLSAgICAgICAgICAgICAgICBtR3JvdXBNZW1iZXJJZHMuYWRkKGdyb3VwTWVtYmVySWQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQWRkcyBhIGxpc3Qgb2YgZ3JvdXAgbWVtYmVyIGlkcyBvZiB0aGUgcm91dGUuCi0gICAgICAgICAqIDxwPgotICAgICAgICAgKiBBIHJvdXRlIGRlc2NyaXB0b3IgdGhhdCBoYXMgb25lIG9yIG1vcmUgZ3JvdXAgbWVtYmVyIHJvdXRlIGlkcwotICAgICAgICAgKiByZXByZXNlbnRzIGEgcm91dGUgZ3JvdXAuIEEgbWVtYmVyIHJvdXRlIG1heSBiZWxvbmcgdG8gYW5vdGhlciBncm91cC4KLSAgICAgICAgICogPC9wPgotICAgICAgICAgKiBAaGlkZQotICAgICAgICAgKi8KLSAgICAgICAgLy8gQFJlc3RyaWN0VG8oTElCUkFSWV9HUk9VUCkKLSAgICAgICAgcHVibGljIEJ1aWxkZXIgYWRkR3JvdXBNZW1iZXJJZHMoQ29sbGVjdGlvbjxTdHJpbmc+IGdyb3VwTWVtYmVySWRzKSB7Ci0gICAgICAgICAgICBpZiAoZ3JvdXBNZW1iZXJJZHMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImdyb3VwTWVtYmVySWRzIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCFncm91cE1lbWJlcklkcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBncm91cE1lbWJlcklkIDogZ3JvdXBNZW1iZXJJZHMpIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkR3JvdXBNZW1iZXJJZChncm91cE1lbWJlcklkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSB1c2VyLXZpc2libGUgbmFtZSBvZiB0aGUgcm91dGUuCi0gICAgICAgICAqIDxwPgotICAgICAgICAgKiBUaGUgcm91dGUgbmFtZSBpZGVudGlmaWVzIHRoZSBkZXN0aW5hdGlvbiByZXByZXNlbnRlZCBieSB0aGUgcm91dGUuCi0gICAgICAgICAqIEl0IG1heSBiZSBhIHVzZXItc3VwcGxpZWQgbmFtZSwgYW4gYWxpYXMsIG9yIGRldmljZSBzZXJpYWwgbnVtYmVyLgotICAgICAgICAgKiA8L3A+Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgICAgICBtQnVuZGxlLnB1dFN0cmluZyhLRVlfTkFNRSwgbmFtZSk7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSB1c2VyLXZpc2libGUgZGVzY3JpcHRpb24gb2YgdGhlIHJvdXRlLgotICAgICAgICAgKiA8cD4KLSAgICAgICAgICogVGhlIHJvdXRlIGRlc2NyaXB0aW9uIGRlc2NyaWJlcyB0aGUga2luZCBvZiBkZXN0aW5hdGlvbiByZXByZXNlbnRlZCBieSB0aGUgcm91dGUuCi0gICAgICAgICAqIEl0IG1heSBiZSBhIHVzZXItc3VwcGxpZWQgc3RyaW5nLCBhIG1vZGVsIG51bWJlciBvciBicmFuZCBvZiBkZXZpY2UuCi0gICAgICAgICAqIDwvcD4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbikgewotICAgICAgICAgICAgbUJ1bmRsZS5wdXRTdHJpbmcoS0VZX0RFU0NSSVBUSU9OLCBkZXNjcmlwdGlvbik7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSBVUkkgb2YgdGhlIGljb24gcmVwcmVzZW50aW5nIHRoaXMgcm91dGUuCi0gICAgICAgICAqIDxwPgotICAgICAgICAgKiBUaGlzIGljb24gd2lsbCBiZSB1c2VkIGluIHBpY2tlciBVSXMgaWYgYXZhaWxhYmxlLgotICAgICAgICAgKiA8L3A+PHA+Ci0gICAgICAgICAqIFRoZSBVUkkgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyBmb3JtYXRzOgotICAgICAgICAgKiA8dWw+Ci0gICAgICAgICAqIDxsaT5jb250ZW50ICh7QGxpbmsgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlciNTQ0hFTUVfQ09OVEVOVH0pPC9saT4KLSAgICAgICAgICogPGxpPmFuZHJvaWQucmVzb3VyY2UgKHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyI1NDSEVNRV9BTkRST0lEX1JFU09VUkNFfSkKLSAgICAgICAgICogPC9saT4KLSAgICAgICAgICogPGxpPmZpbGUgKHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyI1NDSEVNRV9GSUxFfSk8L2xpPgotICAgICAgICAgKiA8L3VsPgotICAgICAgICAgKiA8L3A+Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRJY29uVXJpKFVyaSBpY29uVXJpKSB7Ci0gICAgICAgICAgICBpZiAoaWNvblVyaSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaWNvblVyaSBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQnVuZGxlLnB1dFN0cmluZyhLRVlfSUNPTl9VUkksIGljb25VcmkudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHdoZXRoZXIgdGhlIHJvdXRlIGlzIGVuYWJsZWQuCi0gICAgICAgICAqIDxwPgotICAgICAgICAgKiBEaXNhYmxlZCByb3V0ZXMgcmVwcmVzZW50IHJvdXRlcyB0aGF0IGEgcm91dGUgcHJvdmlkZXIga25vd3MgYWJvdXQsIHN1Y2ggYXMgcGFpcmVkCi0gICAgICAgICAqIFdpZmkgRGlzcGxheSByZWNlaXZlcnMsIGJ1dCB0aGF0IGFyZSBub3QgY3VycmVudGx5IGF2YWlsYWJsZSBmb3IgdXNlLgotICAgICAgICAgKiA8L3A+Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCkgewotICAgICAgICAgICAgbUJ1bmRsZS5wdXRCb29sZWFuKEtFWV9FTkFCTEVELCBlbmFibGVkKTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgd2hldGhlciB0aGUgcm91dGUgaXMgaW4gdGhlIHByb2Nlc3Mgb2YgY29ubmVjdGluZyBhbmQgaXMgbm90IHlldAotICAgICAgICAgKiByZWFkeSBmb3IgdXNlLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICNzZXRDb25uZWN0aW9uU3RhdGV9IGluc3RlYWQuCi0gICAgICAgICAqLwotICAgICAgICBARGVwcmVjYXRlZAotICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRDb25uZWN0aW5nKGJvb2xlYW4gY29ubmVjdGluZykgewotICAgICAgICAgICAgbUJ1bmRsZS5wdXRCb29sZWFuKEtFWV9DT05ORUNUSU5HLCBjb25uZWN0aW5nKTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgdGhlIHJvdXRlJ3MgY29ubmVjdGlvbiBzdGF0ZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGNvbm5lY3Rpb25TdGF0ZSBUaGUgY29ubmVjdGlvbiBzdGF0ZSBvZiB0aGUgcm91dGU6Ci0gICAgICAgICAqIHtAbGluayBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jQ09OTkVDVElPTl9TVEFURV9ESVNDT05ORUNURUR9LAotICAgICAgICAgKiB7QGxpbmsgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI0NPTk5FQ1RJT05fU1RBVEVfQ09OTkVDVElOR30sIG9yCi0gICAgICAgICAqIHtAbGluayBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jQ09OTkVDVElPTl9TVEFURV9DT05ORUNURUR9LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0Q29ubmVjdGlvblN0YXRlKGludCBjb25uZWN0aW9uU3RhdGUpIHsKLSAgICAgICAgICAgIG1CdW5kbGUucHV0SW50KEtFWV9DT05ORUNUSU9OX1NUQVRFLCBjb25uZWN0aW9uU3RhdGUpOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB3aGV0aGVyIHRoZSByb3V0ZSBjYW4gYmUgZGlzY29ubmVjdGVkIHdpdGhvdXQgc3RvcHBpbmcgcGxheWJhY2suCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRDYW5EaXNjb25uZWN0KGJvb2xlYW4gY2FuRGlzY29ubmVjdCkgewotICAgICAgICAgICAgbUJ1bmRsZS5wdXRCb29sZWFuKEtFWV9DQU5fRElTQ09OTkVDVCwgY2FuRGlzY29ubmVjdCk7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIGFuIGludGVudCBzZW5kZXIgZm9yIGxhdW5jaGluZyB0aGUgc2V0dGluZ3MgYWN0aXZpdHkgZm9yIHRoaXMKLSAgICAgICAgICogcm91dGUuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRTZXR0aW5nc0FjdGl2aXR5KEludGVudFNlbmRlciBpcykgewotICAgICAgICAgICAgbUJ1bmRsZS5wdXRQYXJjZWxhYmxlKEtFWV9TRVRUSU5HU19JTlRFTlQsIGlzKTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFkZHMgYSB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50IG1lZGlhIGNvbnRyb2wgaW50ZW50fSBmaWx0ZXIgZm9yIHRoZSByb3V0ZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIGFkZENvbnRyb2xGaWx0ZXIoSW50ZW50RmlsdGVyIGZpbHRlcikgewotICAgICAgICAgICAgaWYgKGZpbHRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZmlsdGVyIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1Db250cm9sRmlsdGVycyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUNvbnRyb2xGaWx0ZXJzID0gbmV3IEFycmF5TGlzdDxJbnRlbnRGaWx0ZXI+KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIW1Db250cm9sRmlsdGVycy5jb250YWlucyhmaWx0ZXIpKSB7Ci0gICAgICAgICAgICAgICAgbUNvbnRyb2xGaWx0ZXJzLmFkZChmaWx0ZXIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQWRkcyBhIGxpc3Qgb2Yge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBtZWRpYSBjb250cm9sIGludGVudH0gZmlsdGVycyBmb3IgdGhlIHJvdXRlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIgYWRkQ29udHJvbEZpbHRlcnMoQ29sbGVjdGlvbjxJbnRlbnRGaWx0ZXI+IGZpbHRlcnMpIHsKLSAgICAgICAgICAgIGlmIChmaWx0ZXJzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJmaWx0ZXJzIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCFmaWx0ZXJzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIGZvciAoSW50ZW50RmlsdGVyIGZpbHRlciA6IGZpbHRlcnMpIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkQ29udHJvbEZpbHRlcihmaWx0ZXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgdGhlIHJvdXRlJ3MgcGxheWJhY2sgdHlwZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHBsYXliYWNrVHlwZSBUaGUgcGxheWJhY2sgdHlwZSBvZiB0aGUgcm91dGU6Ci0gICAgICAgICAqIHtAbGluayBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jUExBWUJBQ0tfVFlQRV9MT0NBTH0gb3IKLSAgICAgICAgICoge0BsaW5rIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNQTEFZQkFDS19UWVBFX1JFTU9URX0uCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRQbGF5YmFja1R5cGUoaW50IHBsYXliYWNrVHlwZSkgewotICAgICAgICAgICAgbUJ1bmRsZS5wdXRJbnQoS0VZX1BMQVlCQUNLX1RZUEUsIHBsYXliYWNrVHlwZSk7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSByb3V0ZSdzIHBsYXliYWNrIHN0cmVhbS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldFBsYXliYWNrU3RyZWFtKGludCBwbGF5YmFja1N0cmVhbSkgewotICAgICAgICAgICAgbUJ1bmRsZS5wdXRJbnQoS0VZX1BMQVlCQUNLX1NUUkVBTSwgcGxheWJhY2tTdHJlYW0pOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgcm91dGUncyByZWNlaXZlciBkZXZpY2UgdHlwZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGRldmljZVR5cGUgVGhlIHJlY2VpdmUgZGV2aWNlIHR5cGUgb2YgdGhlIHJvdXRlOgotICAgICAgICAgKiB7QGxpbmsgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI0RFVklDRV9UWVBFX1RWfSBvcgotICAgICAgICAgKiB7QGxpbmsgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI0RFVklDRV9UWVBFX1NQRUFLRVJ9LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0RGV2aWNlVHlwZShpbnQgZGV2aWNlVHlwZSkgewotICAgICAgICAgICAgbUJ1bmRsZS5wdXRJbnQoS0VZX0RFVklDRV9UWVBFLCBkZXZpY2VUeXBlKTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgdGhlIHJvdXRlJ3MgY3VycmVudCB2b2x1bWUsIG9yIDAgaWYgdW5rbm93bi4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldFZvbHVtZShpbnQgdm9sdW1lKSB7Ci0gICAgICAgICAgICBtQnVuZGxlLnB1dEludChLRVlfVk9MVU1FLCB2b2x1bWUpOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgcm91dGUncyBtYXhpbXVtIHZvbHVtZSwgb3IgMCBpZiB1bmtub3duLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0Vm9sdW1lTWF4KGludCB2b2x1bWVNYXgpIHsKLSAgICAgICAgICAgIG1CdW5kbGUucHV0SW50KEtFWV9WT0xVTUVfTUFYLCB2b2x1bWVNYXgpOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgcm91dGUncyB2b2x1bWUgaGFuZGxpbmcuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSB2b2x1bWVIYW5kbGluZyBob3cgdm9sdW1lIGlzIGhhbmRsZWQgb24gdGhlIHJvdXRlOgotICAgICAgICAgKiB7QGxpbmsgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI1BMQVlCQUNLX1ZPTFVNRV9GSVhFRH0gb3IKLSAgICAgICAgICoge0BsaW5rIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNQTEFZQkFDS19WT0xVTUVfVkFSSUFCTEV9LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0Vm9sdW1lSGFuZGxpbmcoaW50IHZvbHVtZUhhbmRsaW5nKSB7Ci0gICAgICAgICAgICBtQnVuZGxlLnB1dEludChLRVlfVk9MVU1FX0hBTkRMSU5HLCB2b2x1bWVIYW5kbGluZyk7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSByb3V0ZSdzIHByZXNlbnRhdGlvbiBkaXNwbGF5IGlkLCBvciAtMSBpZiBub25lLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0UHJlc2VudGF0aW9uRGlzcGxheUlkKGludCBwcmVzZW50YXRpb25EaXNwbGF5SWQpIHsKLSAgICAgICAgICAgIG1CdW5kbGUucHV0SW50KEtFWV9QUkVTRU5UQVRJT05fRElTUExBWV9JRCwgcHJlc2VudGF0aW9uRGlzcGxheUlkKTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgYSBidW5kbGUgb2YgZXh0cmFzIGZvciB0aGlzIHJvdXRlIGRlc2NyaXB0b3IuCi0gICAgICAgICAqIFRoZSBleHRyYXMgd2lsbCBiZSBpZ25vcmVkIGJ5IHRoZSBtZWRpYSByb3V0ZXIgYnV0IHRoZXkgbWF5IGJlIHVzZWQKLSAgICAgICAgICogYnkgYXBwbGljYXRpb25zLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0RXh0cmFzKEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgICAgIG1CdW5kbGUucHV0QnVuZGxlKEtFWV9FWFRSQVMsIGV4dHJhcyk7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSByb3V0ZSdzIG1pbmltdW0gY2xpZW50IHZlcnNpb24uCi0gICAgICAgICAqIEEgcm91dGVyIHdob3NlIHZlcnNpb24gaXMgbG93ZXIgdGhhbiB0aGlzIHdpbGwgbm90IGJlIGFibGUgdG8gY29ubmVjdCB0byB0aGlzIHJvdXRlLgotICAgICAgICAgKiBAaGlkZQotICAgICAgICAgKi8KLSAgICAgICAgLy8gQFJlc3RyaWN0VG8oTElCUkFSWV9HUk9VUCkKLSAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0TWluQ2xpZW50VmVyc2lvbihpbnQgbWluVmVyc2lvbikgewotICAgICAgICAgICAgbUJ1bmRsZS5wdXRJbnQoS0VZX01JTl9DTElFTlRfVkVSU0lPTiwgbWluVmVyc2lvbik7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSByb3V0ZSdzIG1heGltdW0gY2xpZW50IHZlcnNpb24uCi0gICAgICAgICAqIEEgcm91dGVyIHdob3NlIHZlcnNpb24gaXMgaGlnaGVyIHRoYW4gdGhpcyB3aWxsIG5vdCBiZSBhYmxlIHRvIGNvbm5lY3QgdG8gdGhpcyByb3V0ZS4KLSAgICAgICAgICogQGhpZGUKLSAgICAgICAgICovCi0gICAgICAgIC8vIEBSZXN0cmljdFRvKExJQlJBUllfR1JPVVApCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldE1heENsaWVudFZlcnNpb24oaW50IG1heFZlcnNpb24pIHsKLSAgICAgICAgICAgIG1CdW5kbGUucHV0SW50KEtFWV9NQVhfQ0xJRU5UX1ZFUlNJT04sIG1heFZlcnNpb24pOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQnVpbGRzIHRoZSB7QGxpbmsgTWVkaWFSb3V0ZURlc2NyaXB0b3IgbWVkaWEgcm91dGUgZGVzY3JpcHRvcn0uCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgTWVkaWFSb3V0ZURlc2NyaXB0b3IgYnVpbGQoKSB7Ci0gICAgICAgICAgICBpZiAobUNvbnRyb2xGaWx0ZXJzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtQnVuZGxlLnB1dFBhcmNlbGFibGVBcnJheUxpc3QoS0VZX0NPTlRST0xfRklMVEVSUywgbUNvbnRyb2xGaWx0ZXJzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtR3JvdXBNZW1iZXJJZHMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1CdW5kbGUucHV0U3RyaW5nQXJyYXlMaXN0KEtFWV9HUk9VUF9NRU1CRVJfSURTLCBtR3JvdXBNZW1iZXJJZHMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG5ldyBNZWRpYVJvdXRlRGVzY3JpcHRvcihtQnVuZGxlLCBtQ29udHJvbEZpbHRlcnMpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0LmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDM5NjI3Zi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhOwotCi1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci0KLS8qKgotICogRGVzY3JpYmVzIHRoZSBraW5kcyBvZiByb3V0ZXMgdGhhdCB0aGUgbWVkaWEgcm91dGVyIHdvdWxkIGxpa2UgdG8gZGlzY292ZXIKLSAqIGFuZCB3aGV0aGVyIHRvIHBlcmZvcm0gYWN0aXZlIHNjYW5uaW5nLgotICogPHA+Ci0gKiBUaGlzIG9iamVjdCBpcyBpbW11dGFibGUgb25jZSBjcmVhdGVkLgotICogPC9wPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3QgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfU0VMRUNUT1IgPSAic2VsZWN0b3IiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQUNUSVZFX1NDQU4gPSAiYWN0aXZlU2NhbiI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIEJ1bmRsZSBtQnVuZGxlOwotICAgIHByaXZhdGUgTWVkaWFSb3V0ZVNlbGVjdG9yIG1TZWxlY3RvcjsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBtZWRpYSByb3V0ZSBkaXNjb3ZlcnkgcmVxdWVzdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzZWxlY3RvciBUaGUgcm91dGUgc2VsZWN0b3IgdGhhdCBzcGVjaWZpZXMgdGhlIGtpbmRzIG9mIHJvdXRlcyB0byBkaXNjb3Zlci4KLSAgICAgKiBAcGFyYW0gYWN0aXZlU2NhbiBUcnVlIGlmIGFjdGl2ZSBzY2FubmluZyBzaG91bGQgYmUgcGVyZm9ybWVkLgotICAgICAqLwotICAgIHB1YmxpYyBNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdChNZWRpYVJvdXRlU2VsZWN0b3Igc2VsZWN0b3IsIGJvb2xlYW4gYWN0aXZlU2NhbikgewotICAgICAgICBpZiAoc2VsZWN0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigic2VsZWN0b3IgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgbUJ1bmRsZSA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgbVNlbGVjdG9yID0gc2VsZWN0b3I7Ci0gICAgICAgIG1CdW5kbGUucHV0QnVuZGxlKEtFWV9TRUxFQ1RPUiwgc2VsZWN0b3IuYXNCdW5kbGUoKSk7Ci0gICAgICAgIG1CdW5kbGUucHV0Qm9vbGVhbihLRVlfQUNUSVZFX1NDQU4sIGFjdGl2ZVNjYW4pOwotICAgIH0KLQotICAgIHByaXZhdGUgTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3QoQnVuZGxlIGJ1bmRsZSkgewotICAgICAgICBtQnVuZGxlID0gYnVuZGxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHJvdXRlIHNlbGVjdG9yIHRoYXQgc3BlY2lmaWVzIHRoZSBraW5kcyBvZiByb3V0ZXMgdG8gZGlzY292ZXIuCi0gICAgICovCi0gICAgcHVibGljIE1lZGlhUm91dGVTZWxlY3RvciBnZXRTZWxlY3RvcigpIHsKLSAgICAgICAgZW5zdXJlU2VsZWN0b3IoKTsKLSAgICAgICAgcmV0dXJuIG1TZWxlY3RvcjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZW5zdXJlU2VsZWN0b3IoKSB7Ci0gICAgICAgIGlmIChtU2VsZWN0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgbVNlbGVjdG9yID0gTWVkaWFSb3V0ZVNlbGVjdG9yLmZyb21CdW5kbGUobUJ1bmRsZS5nZXRCdW5kbGUoS0VZX1NFTEVDVE9SKSk7Ci0gICAgICAgICAgICBpZiAobVNlbGVjdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtU2VsZWN0b3IgPSBNZWRpYVJvdXRlU2VsZWN0b3IuRU1QVFk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgYWN0aXZlIHNjYW5uaW5nIHNob3VsZCBiZSBwZXJmb3JtZWQuCi0gICAgICoKLSAgICAgKiBAc2VlIE1lZGlhUm91dGVyI0NBTExCQUNLX0ZMQUdfUEVSRk9STV9BQ1RJVkVfU0NBTgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzQWN0aXZlU2NhbigpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0Qm9vbGVhbihLRVlfQUNUSVZFX1NDQU4pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZGlzY292ZXJ5IHJlcXVlc3QgaGFzIGFsbCBvZiB0aGUgcmVxdWlyZWQgZmllbGRzLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzVmFsaWQoKSB7Ci0gICAgICAgIGVuc3VyZVNlbGVjdG9yKCk7Ci0gICAgICAgIHJldHVybiBtU2VsZWN0b3IuaXNWYWxpZCgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotICAgICAgICBpZiAobyBpbnN0YW5jZW9mIE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0KSB7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdCBvdGhlciA9IChNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdClvOwotICAgICAgICAgICAgcmV0dXJuIGdldFNlbGVjdG9yKCkuZXF1YWxzKG90aGVyLmdldFNlbGVjdG9yKCkpCi0gICAgICAgICAgICAgICAgICAgICYmIGlzQWN0aXZlU2NhbigpID09IG90aGVyLmlzQWN0aXZlU2NhbigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgICByZXR1cm4gZ2V0U2VsZWN0b3IoKS5oYXNoQ29kZSgpIF4gKGlzQWN0aXZlU2NhbigpID8gMSA6IDApOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiRGlzY292ZXJ5UmVxdWVzdHsgc2VsZWN0b3I9IikuYXBwZW5kKGdldFNlbGVjdG9yKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGFjdGl2ZVNjYW49IikuYXBwZW5kKGlzQWN0aXZlU2NhbigpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBpc1ZhbGlkPSIpLmFwcGVuZChpc1ZhbGlkKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIgfSIpOwotICAgICAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydHMgdGhpcyBvYmplY3QgdG8gYSBidW5kbGUgZm9yIHNlcmlhbGl6YXRpb24uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBjb250ZW50cyBvZiB0aGUgb2JqZWN0IHJlcHJlc2VudGVkIGFzIGEgYnVuZGxlLgotICAgICAqLwotICAgIHB1YmxpYyBCdW5kbGUgYXNCdW5kbGUoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2UgZnJvbSBhIGJ1bmRsZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBidW5kbGUgVGhlIGJ1bmRsZSwgb3IgbnVsbCBpZiBub25lLgotICAgICAqIEByZXR1cm4gVGhlIG5ldyBpbnN0YW5jZSwgb3IgbnVsbCBpZiB0aGUgYnVuZGxlIHdhcyBudWxsLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3QgZnJvbUJ1bmRsZShCdW5kbGUgYnVuZGxlKSB7Ci0gICAgICAgIHJldHVybiBidW5kbGUgIT0gbnVsbCA/IG5ldyBNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdChidW5kbGUpIDogbnVsbDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFSb3V0ZVByb3ZpZGVyLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFSb3V0ZVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxYTJlMWEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhUm91dGVQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQ3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYTsKLQotaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5Ob25OdWxsOwotaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5OdWxsYWJsZTsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKLWltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY0LnV0aWwuT2JqZWN0c0NvbXBhdDsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZXIuQ29udHJvbFJlcXVlc3RDYWxsYmFjazsKLQotLyoqCi0gKiBNZWRpYSByb3V0ZSBwcm92aWRlcnMgYXJlIHVzZWQgdG8gcHVibGlzaCBhZGRpdGlvbmFsIG1lZGlhIHJvdXRlcyBmb3IKLSAqIHVzZSB3aXRoaW4gYW4gYXBwbGljYXRpb24uICBNZWRpYSByb3V0ZSBwcm92aWRlcnMgbWF5IGFsc28gYmUgZGVjbGFyZWQKLSAqIGFzIGEgc2VydmljZSB0byBwdWJsaXNoIGFkZGl0aW9uYWwgbWVkaWEgcm91dGVzIHRvIGFsbCBhcHBsaWNhdGlvbnMKLSAqIGluIHRoZSBzeXN0ZW0uCi0gKiA8cD4KLSAqIFRoZSBwdXJwb3NlIG9mIGEgbWVkaWEgcm91dGUgcHJvdmlkZXIgaXMgdG8gZGlzY292ZXIgbWVkaWEgcm91dGVzIHRoYXQgc2F0aXNmeQotICogdGhlIGNyaXRlcmlhIHNwZWNpZmllZCBieSB0aGUgY3VycmVudCB7QGxpbmsgTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3R9IGFuZCBwdWJsaXNoIGEKLSAqIHtAbGluayBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yfSB3aXRoIGluZm9ybWF0aW9uIGFib3V0IGVhY2ggcm91dGUgYnkgY2FsbGluZwotICoge0BsaW5rICNzZXREZXNjcmlwdG9yfSB0byBub3RpZnkgdGhlIGN1cnJlbnRseSByZWdpc3RlcmVkIHtAbGluayBDYWxsYmFja30uCi0gKiA8L3A+PHA+Ci0gKiBUaGUgcHJvdmlkZXIgc2hvdWxkIHdhdGNoIGZvciBjaGFuZ2VzIHRvIHRoZSBkaXNjb3ZlcnkgcmVxdWVzdCBieSBpbXBsZW1lbnRpbmcKLSAqIHtAbGluayAjb25EaXNjb3ZlcnlSZXF1ZXN0Q2hhbmdlZH0gYW5kIHVwZGF0aW5nIHRoZSBzZXQgb2Ygcm91dGVzIHRoYXQgaXQgaXMKLSAqIGF0dGVtcHRpbmcgdG8gZGlzY292ZXIuICBJdCBzaG91bGQgYWxzbyBoYW5kbGUgcm91dGUgY29udHJvbCByZXF1ZXN0cyBzdWNoCi0gKiBhcyB2b2x1bWUgY2hhbmdlcyBvciB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50IG1lZGlhIGNvbnRyb2wgaW50ZW50c30KLSAqIGJ5IGltcGxlbWVudGluZyB7QGxpbmsgI29uQ3JlYXRlUm91dGVDb250cm9sbGVyfSB0byByZXR1cm4gYSB7QGxpbmsgUm91dGVDb250cm9sbGVyfQotICogZm9yIGEgcGFydGljdWxhciByb3V0ZS4KLSAqIDwvcD48cD4KLSAqIEEgbWVkaWEgcm91dGUgcHJvdmlkZXIgbWF5IGJlIHVzZWQgcHJpdmF0ZWx5IHdpdGhpbiB0aGUgc2NvcGUgb2YgYSBzaW5nbGUKLSAqIGFwcGxpY2F0aW9uIHByb2Nlc3MgYnkgY2FsbGluZyB7QGxpbmsgTWVkaWFSb3V0ZXIjYWRkUHJvdmlkZXIgTWVkaWFSb3V0ZXIuYWRkUHJvdmlkZXJ9Ci0gKiB0byBhZGQgaXQgdG8gdGhlIGxvY2FsIHtAbGluayBNZWRpYVJvdXRlcn0uICBBIG1lZGlhIHJvdXRlIHByb3ZpZGVyIG1heSBhbHNvIGJlIG1hZGUKLSAqIGF2YWlsYWJsZSBnbG9iYWxseSB0byBhbGwgYXBwbGljYXRpb25zIGJ5IHJlZ2lzdGVyaW5nIGEge0BsaW5rIE1lZGlhUm91dGVQcm92aWRlclNlcnZpY2V9Ci0gKiBpbiB0aGUgcHJvdmlkZXIncyBtYW5pZmVzdC4gIFdoZW4gdGhlIG1lZGlhIHJvdXRlIHByb3ZpZGVyIGlzIHJlZ2lzdGVyZWQKLSAqIGFzIGEgc2VydmljZSwgYWxsIGFwcGxpY2F0aW9ucyB0aGF0IHVzZSB0aGUgbWVkaWEgcm91dGVyIEFQSSB3aWxsIGJlIGFibGUgdG8KLSAqIGRpc2NvdmVyIGFuZCB1c2VkIHRoZSBwcm92aWRlcidzIHJvdXRlcyB3aXRob3V0IGhhdmluZyB0byBpbnN0YWxsIGFueXRoaW5nIGVsc2UuCi0gKiA8L3A+PHA+Ci0gKiBUaGlzIG9iamVjdCBtdXN0IG9ubHkgYmUgYWNjZXNzZWQgb24gdGhlIG1haW4gdGhyZWFkLgotICogPC9wPgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTWVkaWFSb3V0ZVByb3ZpZGVyIHsKLSAgICBzdGF0aWMgZmluYWwgaW50IE1TR19ERUxJVkVSX0RFU0NSSVBUT1JfQ0hBTkdFRCA9IDE7Ci0gICAgc3RhdGljIGZpbmFsIGludCBNU0dfREVMSVZFUl9ESVNDT1ZFUllfUkVRVUVTVF9DSEFOR0VEID0gMjsKLQotICAgIHByaXZhdGUgZmluYWwgQ29udGV4dCBtQ29udGV4dDsKLSAgICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyTWV0YWRhdGEgbU1ldGFkYXRhOwotICAgIHByaXZhdGUgZmluYWwgUHJvdmlkZXJIYW5kbGVyIG1IYW5kbGVyID0gbmV3IFByb3ZpZGVySGFuZGxlcigpOwotCi0gICAgcHJpdmF0ZSBDYWxsYmFjayBtQ2FsbGJhY2s7Ci0KLSAgICBwcml2YXRlIE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0IG1EaXNjb3ZlcnlSZXF1ZXN0OwotICAgIHByaXZhdGUgYm9vbGVhbiBtUGVuZGluZ0Rpc2NvdmVyeVJlcXVlc3RDaGFuZ2U7Ci0KLSAgICBwcml2YXRlIE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IgbURlc2NyaXB0b3I7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1QZW5kaW5nRGVzY3JpcHRvckNoYW5nZTsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBtZWRpYSByb3V0ZSBwcm92aWRlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0LgotICAgICAqLwotICAgIHB1YmxpYyBNZWRpYVJvdXRlUHJvdmlkZXIoQE5vbk51bGwgQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgbnVsbCk7Ci0gICAgfQotCi0gICAgTWVkaWFSb3V0ZVByb3ZpZGVyKENvbnRleHQgY29udGV4dCwgUHJvdmlkZXJNZXRhZGF0YSBtZXRhZGF0YSkgewotICAgICAgICBpZiAoY29udGV4dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb250ZXh0IG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKLSAgICAgICAgaWYgKG1ldGFkYXRhID09IG51bGwpIHsKLSAgICAgICAgICAgIG1NZXRhZGF0YSA9IG5ldyBQcm92aWRlck1ldGFkYXRhKG5ldyBDb21wb25lbnROYW1lKGNvbnRleHQsIGdldENsYXNzKCkpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1NZXRhZGF0YSA9IG1ldGFkYXRhOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgY29udGV4dCBvZiB0aGUgbWVkaWEgcm91dGUgcHJvdmlkZXIuCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIENvbnRleHQgZ2V0Q29udGV4dCgpIHsKLSAgICAgICAgcmV0dXJuIG1Db250ZXh0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHByb3ZpZGVyJ3MgaGFuZGxlciB3aGljaCBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIG1haW4gdGhyZWFkLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBIYW5kbGVyIGdldEhhbmRsZXIoKSB7Ci0gICAgICAgIHJldHVybiBtSGFuZGxlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHNvbWUgbWV0YWRhdGEgYWJvdXQgdGhlIHByb3ZpZGVyJ3MgaW1wbGVtZW50YXRpb24uCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIFByb3ZpZGVyTWV0YWRhdGEgZ2V0TWV0YWRhdGEoKSB7Ci0gICAgICAgIHJldHVybiBtTWV0YWRhdGE7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyBhIGNhbGxiYWNrIHRvIGludm9rZSB3aGVuIHRoZSBwcm92aWRlcidzIGRlc2NyaXB0b3IgY2hhbmdlcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgdG8gdXNlLCBvciBudWxsIGlmIG5vbmUuCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIHZvaWQgc2V0Q2FsbGJhY2soQE51bGxhYmxlIENhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIE1lZGlhUm91dGVyLmNoZWNrQ2FsbGluZ1RocmVhZCgpOwotICAgICAgICBtQ2FsbGJhY2sgPSBjYWxsYmFjazsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBjdXJyZW50IGRpc2NvdmVyeSByZXF1ZXN0IHdoaWNoIGluZm9ybXMgdGhlIHByb3ZpZGVyIGFib3V0IHRoZQotICAgICAqIGtpbmRzIG9mIHJvdXRlcyB0byBkaXNjb3ZlciBhbmQgd2hldGhlciB0byBwZXJmb3JtIGFjdGl2ZSBzY2FubmluZy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIGN1cnJlbnQgZGlzY292ZXJ5IHJlcXVlc3QsIG9yIG51bGwgaWYgbm8gZGlzY292ZXJ5IGlzIG5lZWRlZCBhdCB0aGlzIHRpbWUuCi0gICAgICoKLSAgICAgKiBAc2VlICNvbkRpc2NvdmVyeVJlcXVlc3RDaGFuZ2VkCi0gICAgICovCi0gICAgQE51bGxhYmxlCi0gICAgcHVibGljIGZpbmFsIE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0IGdldERpc2NvdmVyeVJlcXVlc3QoKSB7Ci0gICAgICAgIHJldHVybiBtRGlzY292ZXJ5UmVxdWVzdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIGEgZGlzY292ZXJ5IHJlcXVlc3QgdG8gaW5mb3JtIHRoZSBwcm92aWRlciBhYm91dCB0aGUga2luZHMgb2YKLSAgICAgKiByb3V0ZXMgdGhhdCBpdHMgY2xpZW50cyB3b3VsZCBsaWtlIHRvIGRpc2NvdmVyIGFuZCB3aGV0aGVyIHRvIHBlcmZvcm0gYWN0aXZlIHNjYW5uaW5nLgotICAgICAqCi0gICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIGRpc2NvdmVyeSByZXF1ZXN0LCBvciBudWxsIGlmIG5vIGRpc2NvdmVyeSBpcyBuZWVkZWQgYXQgdGhpcyB0aW1lLgotICAgICAqCi0gICAgICogQHNlZSAjb25EaXNjb3ZlcnlSZXF1ZXN0Q2hhbmdlZAotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldERpc2NvdmVyeVJlcXVlc3QoTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3QgcmVxdWVzdCkgewotICAgICAgICBNZWRpYVJvdXRlci5jaGVja0NhbGxpbmdUaHJlYWQoKTsKLQotICAgICAgICBpZiAoT2JqZWN0c0NvbXBhdC5lcXVhbHMobURpc2NvdmVyeVJlcXVlc3QsIHJlcXVlc3QpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBtRGlzY292ZXJ5UmVxdWVzdCA9IHJlcXVlc3Q7Ci0gICAgICAgIGlmICghbVBlbmRpbmdEaXNjb3ZlcnlSZXF1ZXN0Q2hhbmdlKSB7Ci0gICAgICAgICAgICBtUGVuZGluZ0Rpc2NvdmVyeVJlcXVlc3RDaGFuZ2UgPSB0cnVlOwotICAgICAgICAgICAgbUhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZShNU0dfREVMSVZFUl9ESVNDT1ZFUllfUkVRVUVTVF9DSEFOR0VEKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgZGVsaXZlckRpc2NvdmVyeVJlcXVlc3RDaGFuZ2VkKCkgewotICAgICAgICBtUGVuZGluZ0Rpc2NvdmVyeVJlcXVlc3RDaGFuZ2UgPSBmYWxzZTsKLSAgICAgICAgb25EaXNjb3ZlcnlSZXF1ZXN0Q2hhbmdlZChtRGlzY292ZXJ5UmVxdWVzdCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIGJ5IHRoZSBtZWRpYSByb3V0ZXIgd2hlbiB0aGUge0BsaW5rIE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0IGRpc2NvdmVyeSByZXF1ZXN0fQotICAgICAqIGhhcyBjaGFuZ2VkLgotICAgICAqIDxwPgotICAgICAqIFdoZW5ldmVyIGFuIGFwcGxpY2F0aW9ucyBjYWxscyB7QGxpbmsgTWVkaWFSb3V0ZXIjYWRkQ2FsbGJhY2t9IHRvIHJlZ2lzdGVyCi0gICAgICogYSBjYWxsYmFjaywgaXQgYWxzbyBwcm92aWRlcyBhIHNlbGVjdG9yIHRvIHNwZWNpZnkgdGhlIGtpbmRzIG9mIHJvdXRlcyB0aGF0Ci0gICAgICogaXQgaXMgaW50ZXJlc3RlZCBpbi4gIFRoZSBtZWRpYSByb3V0ZXIgY29tYmluZXMgYWxsIG9mIHRoZXNlIHNlbGVjdG9ycyB0b2dldGhlcgotICAgICAqIHRvIGdlbmVyYXRlIGEge0BsaW5rIE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0fSBhbmQgbm90aWZpZXMgZWFjaCBwcm92aWRlciB3aGVuIGEgY2hhbmdlCi0gICAgICogb2NjdXJzIGJ5IGNhbGxpbmcge0BsaW5rICNzZXREaXNjb3ZlcnlSZXF1ZXN0fSB3aGljaCBwb3N0cyBhIG1lc3NhZ2UgdG8gaW52b2tlCi0gICAgICogdGhpcyBtZXRob2QgYXN5bmNocm9ub3VzbHkuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoZSBwcm92aWRlciBzaG91bGQgZXhhbWluZSB0aGUge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBtZWRpYSBjb250cm9sIGNhdGVnb3JpZXN9Ci0gICAgICogaW4gdGhlIGRpc2NvdmVyeSByZXF1ZXN0J3Mge0BsaW5rIE1lZGlhUm91dGVTZWxlY3RvciBzZWxlY3Rvcn0gdG8gZGV0ZXJtaW5lIHdoYXQKLSAgICAgKiBraW5kcyBvZiByb3V0ZXMgaXQgc2hvdWxkIHRyeSB0byBkaXNjb3ZlciBhbmQgd2hldGhlciBpdCBzaG91bGQgcGVyZm9ybSBhY3RpdmUKLSAgICAgKiBvciBwYXNzaXZlIHNjYW5zLiAgSW4gbWFueSBjYXNlcywgdGhlIHByb3ZpZGVyIG1heSBiZSBhYmxlIHRvIHNhdmUgcG93ZXIgYnkKLSAgICAgKiBkZXRlcm1pbmluZyB0aGF0IHRoZSBzZWxlY3RvciBkb2VzIG5vdCBjb250YWluIGFueSBjYXRlZ29yaWVzIHRoYXQgaXQgc3VwcG9ydHMKLSAgICAgKiBhbmQgaXQgY2FuIHRoZXJlZm9yZSBhdm9pZCBwZXJmb3JtaW5nIGFueSBzY2FucyBhdCBhbGwuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIG5ldyBkaXNjb3ZlcnkgcmVxdWVzdCwgb3IgbnVsbCBpZiBubyBkaXNjb3ZlcnkgaXMgbmVlZGVkIGF0IHRoaXMgdGltZS4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFSb3V0ZXIjYWRkQ2FsbGJhY2sKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBvbkRpc2NvdmVyeVJlcXVlc3RDaGFuZ2VkKEBOdWxsYWJsZSBNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdCByZXF1ZXN0KSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgcHJvdmlkZXIncyBkZXNjcmlwdG9yLgotICAgICAqIDxwPgotICAgICAqIFRoZSBkZXNjcmlwdG9yIGRlc2NyaWJlcyB0aGUgc3RhdGUgb2YgdGhlIG1lZGlhIHJvdXRlIHByb3ZpZGVyIGFuZAotICAgICAqIHRoZSByb3V0ZXMgdGhhdCBpdCBwdWJsaXNoZXMuICBXYXRjaCBmb3IgY2hhbmdlcyB0byB0aGUgZGVzY3JpcHRvcgotICAgICAqIGJ5IHJlZ2lzdGVyaW5nIGEge0BsaW5rIENhbGxiYWNrIGNhbGxiYWNrfSB3aXRoIHtAbGluayAjc2V0Q2FsbGJhY2t9LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIG1lZGlhIHJvdXRlIHByb3ZpZGVyIGRlc2NyaXB0b3IsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKgotICAgICAqIEBzZWUgQ2FsbGJhY2sjb25EZXNjcmlwdG9yQ2hhbmdlZAotICAgICAqLwotICAgIEBOdWxsYWJsZQotICAgIHB1YmxpYyBmaW5hbCBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yIGdldERlc2NyaXB0b3IoKSB7Ci0gICAgICAgIHJldHVybiBtRGVzY3JpcHRvcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBwcm92aWRlcidzIGRlc2NyaXB0b3IuCi0gICAgICogPHA+Ci0gICAgICogVGhlIHByb3ZpZGVyIG11c3QgY2FsbCB0aGlzIG1ldGhvZCB0byBub3RpZnkgdGhlIGN1cnJlbnRseSByZWdpc3RlcmVkCi0gICAgICoge0BsaW5rIENhbGxiYWNrIGNhbGxiYWNrfSBhYm91dCB0aGUgY2hhbmdlIHRvIHRoZSBwcm92aWRlcidzIGRlc2NyaXB0b3IuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIGRlc2NyaXB0b3IgVGhlIHVwZGF0ZWQgcm91dGUgcHJvdmlkZXIgZGVzY3JpcHRvciwgb3IgbnVsbCBpZiBub25lLgotICAgICAqCi0gICAgICogQHNlZSBDYWxsYmFjayNvbkRlc2NyaXB0b3JDaGFuZ2VkCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIHZvaWQgc2V0RGVzY3JpcHRvcihATnVsbGFibGUgTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0gICAgICAgIE1lZGlhUm91dGVyLmNoZWNrQ2FsbGluZ1RocmVhZCgpOwotCi0gICAgICAgIGlmIChtRGVzY3JpcHRvciAhPSBkZXNjcmlwdG9yKSB7Ci0gICAgICAgICAgICBtRGVzY3JpcHRvciA9IGRlc2NyaXB0b3I7Ci0gICAgICAgICAgICBpZiAoIW1QZW5kaW5nRGVzY3JpcHRvckNoYW5nZSkgewotICAgICAgICAgICAgICAgIG1QZW5kaW5nRGVzY3JpcHRvckNoYW5nZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgbUhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZShNU0dfREVMSVZFUl9ERVNDUklQVE9SX0NIQU5HRUQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBkZWxpdmVyRGVzY3JpcHRvckNoYW5nZWQoKSB7Ci0gICAgICAgIG1QZW5kaW5nRGVzY3JpcHRvckNoYW5nZSA9IGZhbHNlOwotCi0gICAgICAgIGlmIChtQ2FsbGJhY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgbUNhbGxiYWNrLm9uRGVzY3JpcHRvckNoYW5nZWQodGhpcywgbURlc2NyaXB0b3IpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIGJ5IHRoZSBtZWRpYSByb3V0ZXIgdG8gb2J0YWluIGEgcm91dGUgY29udHJvbGxlciBmb3IgYSBwYXJ0aWN1bGFyIHJvdXRlLgotICAgICAqIDxwPgotICAgICAqIFRoZSBtZWRpYSByb3V0ZXIgd2lsbCBpbnZva2UgdGhlIHtAbGluayBSb3V0ZUNvbnRyb2xsZXIjb25SZWxlYXNlfSBtZXRob2Qgb2YgdGhlIHJvdXRlCi0gICAgICogY29udHJvbGxlciB3aGVuIGl0IGlzIG5vIGxvbmdlciBuZWVkZWQgdG8gYWxsb3cgaXQgdG8gZnJlZSBpdHMgcmVzb3VyY2VzLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSByb3V0ZUlkIFRoZSB1bmlxdWUgaWQgb2YgdGhlIHJvdXRlLgotICAgICAqIEByZXR1cm4gVGhlIHJvdXRlIGNvbnRyb2xsZXIuICBSZXR1cm5zIG51bGwgaWYgdGhlcmUgaXMgbm8gc3VjaCByb3V0ZSBvciBpZiB0aGUgcm91dGUKLSAgICAgKiBjYW5ub3QgYmUgY29udHJvbGxlZCB1c2luZyB0aGUgcm91dGUgY29udHJvbGxlciBpbnRlcmZhY2UuCi0gICAgICovCi0gICAgQE51bGxhYmxlCi0gICAgcHVibGljIFJvdXRlQ29udHJvbGxlciBvbkNyZWF0ZVJvdXRlQ29udHJvbGxlcihATm9uTnVsbCBTdHJpbmcgcm91dGVJZCkgewotICAgICAgICBpZiAocm91dGVJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJyb3V0ZUlkIGNhbm5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIGJ5IHRoZSBtZWRpYSByb3V0ZXIgdG8gb2J0YWluIGEgcm91dGUgY29udHJvbGxlciBmb3IgYSBwYXJ0aWN1bGFyIHJvdXRlIHdoaWNoIGlzIGEKLSAgICAgKiBtZW1iZXIgb2Yge0BsaW5rIE1lZGlhUm91dGVyLlJvdXRlR3JvdXB9LgotICAgICAqIDxwPgotICAgICAqIFRoZSBtZWRpYSByb3V0ZXIgd2lsbCBpbnZva2UgdGhlIHtAbGluayBSb3V0ZUNvbnRyb2xsZXIjb25SZWxlYXNlfSBtZXRob2Qgb2YgdGhlIHJvdXRlCi0gICAgICogY29udHJvbGxlciB3aGVuIGl0IGlzIG5vIGxvbmdlciBuZWVkZWQgdG8gYWxsb3cgaXQgdG8gZnJlZSBpdHMgcmVzb3VyY2VzLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSByb3V0ZUlkIFRoZSB1bmlxdWUgaWQgb2YgdGhlIG1lbWJlciByb3V0ZS4KLSAgICAgKiBAcGFyYW0gcm91dGVHcm91cElkIFRoZSB1bmlxdWUgaWQgb2YgdGhlIHJvdXRlIGdyb3VwLgotICAgICAqIEByZXR1cm4gVGhlIHJvdXRlIGNvbnRyb2xsZXIuICBSZXR1cm5zIG51bGwgaWYgdGhlcmUgaXMgbm8gc3VjaCByb3V0ZSBvciBpZiB0aGUgcm91dGUKLSAgICAgKiBjYW5ub3QgYmUgY29udHJvbGxlZCB1c2luZyB0aGUgcm91dGUgY29udHJvbGxlciBpbnRlcmZhY2UuCi0gICAgICogQGhpZGUKLSAgICAgKi8KLSAgICAvLyBAUmVzdHJpY3RUbyhMSUJSQVJZX0dST1VQKQotICAgIEBOdWxsYWJsZQotICAgIHB1YmxpYyBSb3V0ZUNvbnRyb2xsZXIgb25DcmVhdGVSb3V0ZUNvbnRyb2xsZXIoQE5vbk51bGwgU3RyaW5nIHJvdXRlSWQsCi0gICAgICAgICAgICBATm9uTnVsbCBTdHJpbmcgcm91dGVHcm91cElkKSB7Ci0gICAgICAgIGlmIChyb3V0ZUlkID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInJvdXRlSWQgY2Fubm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocm91dGVHcm91cElkID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInJvdXRlR3JvdXBJZCBjYW5ub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBvbkNyZWF0ZVJvdXRlQ29udHJvbGxlcihyb3V0ZUlkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEZXNjcmliZXMgcHJvcGVydGllcyBvZiB0aGUgcm91dGUgcHJvdmlkZXIncyBpbXBsZW1lbnRhdGlvbi4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIG9iamVjdCBpcyBpbW11dGFibGUgb25jZSBjcmVhdGVkLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFByb3ZpZGVyTWV0YWRhdGEgewotICAgICAgICBwcml2YXRlIGZpbmFsIENvbXBvbmVudE5hbWUgbUNvbXBvbmVudE5hbWU7Ci0KLSAgICAgICAgUHJvdmlkZXJNZXRhZGF0YShDb21wb25lbnROYW1lIGNvbXBvbmVudE5hbWUpIHsKLSAgICAgICAgICAgIGlmIChjb21wb25lbnROYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb21wb25lbnROYW1lIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1Db21wb25lbnROYW1lID0gY29tcG9uZW50TmFtZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXRzIHRoZSBwcm92aWRlcidzIHBhY2thZ2UgbmFtZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUNvbXBvbmVudE5hbWUuZ2V0UGFja2FnZU5hbWUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXRzIHRoZSBwcm92aWRlcidzIGNvbXBvbmVudCBuYW1lLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIENvbXBvbmVudE5hbWUgZ2V0Q29tcG9uZW50TmFtZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBtQ29tcG9uZW50TmFtZTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAgICAgcmV0dXJuICJQcm92aWRlck1ldGFkYXRheyBjb21wb25lbnROYW1lPSIKLSAgICAgICAgICAgICAgICAgICAgKyBtQ29tcG9uZW50TmFtZS5mbGF0dGVuVG9TaG9ydFN0cmluZygpICsgIiB9IjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByb3ZpZGVzIGNvbnRyb2wgb3ZlciBhIHBhcnRpY3VsYXIgcm91dGUuCi0gICAgICogPHA+Ci0gICAgICogVGhlIG1lZGlhIHJvdXRlciBvYnRhaW5zIGEgcm91dGUgY29udHJvbGxlciBmb3IgYSByb3V0ZSB3aGVuZXZlciBpdCBuZWVkcwotICAgICAqIHRvIGNvbnRyb2wgYSByb3V0ZS4gIFdoZW4gYSByb3V0ZSBpcyBzZWxlY3RlZCwgdGhlIG1lZGlhIHJvdXRlciBpbnZva2VzCi0gICAgICogdGhlIHtAbGluayAjb25TZWxlY3R9IG1ldGhvZCBvZiBpdHMgcm91dGUgY29udHJvbGxlci4gIFdoaWxlIHNlbGVjdGVkLAotICAgICAqIHRoZSBtZWRpYSByb3V0ZXIgbWF5IGNhbGwgb3RoZXIgbWV0aG9kcyBvZiB0aGUgcm91dGUgY29udHJvbGxlciB0bwotICAgICAqIHJlcXVlc3QgdGhhdCBpdCBwZXJmb3JtIGNlcnRhaW4gYWN0aW9ucyB0byB0aGUgcm91dGUuICBXaGVuIGEgcm91dGUgaXMKLSAgICAgKiB1bnNlbGVjdGVkLCB0aGUgbWVkaWEgcm91dGVyIGludm9rZXMgdGhlIHtAbGluayAjb25VbnNlbGVjdH0gbWV0aG9kIG9mIGl0cwotICAgICAqIHJvdXRlIGNvbnRyb2xsZXIuICBXaGVuIHRoZSBtZWRpYSByb3V0ZSBubyBsb25nZXIgbmVlZHMgdGhlIHJvdXRlIGNvbnRyb2xsZXIKLSAgICAgKiBpdCB3aWxsIGludm9rZSB0aGUge0BsaW5rICNvblJlbGVhc2V9IG1ldGhvZCB0byBhbGxvdyB0aGUgcm91dGUgY29udHJvbGxlcgotICAgICAqIHRvIGZyZWUgaXRzIHJlc291cmNlcy4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhlcmUgbWF5IGJlIG11bHRpcGxlIHJvdXRlIGNvbnRyb2xsZXJzIHNpbXVsdGFuZW91c2x5IGFjdGl2ZSBmb3IgdGhlCi0gICAgICogc2FtZSByb3V0ZS4gIEVhY2ggcm91dGUgY29udHJvbGxlciB3aWxsIGJlIHJlbGVhc2VkIHNlcGFyYXRlbHkuCi0gICAgICogPC9wPjxwPgotICAgICAqIEFsbCBvcGVyYXRpb25zIG9uIHRoZSByb3V0ZSBjb250cm9sbGVyIGFyZSBhc3luY2hyb25vdXMgYW5kCi0gICAgICogcmVzdWx0cyBhcmUgY29tbXVuaWNhdGVkIHZpYSBjYWxsYmFja3MuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgUm91dGVDb250cm9sbGVyIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJlbGVhc2VzIHRoZSByb3V0ZSBjb250cm9sbGVyLCBhbGxvd2luZyBpdCB0byBmcmVlIGl0cyByZXNvdXJjZXMuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBvblJlbGVhc2UoKSB7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2VsZWN0cyB0aGUgcm91dGUuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBvblNlbGVjdCgpIHsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBVbnNlbGVjdHMgdGhlIHJvdXRlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25VbnNlbGVjdCgpIHsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBVbnNlbGVjdHMgdGhlIHJvdXRlIGFuZCBwcm92aWRlcyBhIHJlYXNvbi4gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24KLSAgICAgICAgICogY2FsbHMge0BsaW5rICNvblVuc2VsZWN0KCl9LgotICAgICAgICAgKiA8cD4KLSAgICAgICAgICogVGhlIHJlYXNvbiBwcm92aWRlZCB3aWxsIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotICAgICAgICAgKiA8dWw+Ci0gICAgICAgICAqIDxsaT57QGxpbmsgTWVkaWFSb3V0ZXIjVU5TRUxFQ1RfUkVBU09OX1VOS05PV059PC9saT4KLSAgICAgICAgICogPGxpPntAbGluayBNZWRpYVJvdXRlciNVTlNFTEVDVF9SRUFTT05fRElTQ09OTkVDVEVEfTwvbGk+Ci0gICAgICAgICAqIDxsaT57QGxpbmsgTWVkaWFSb3V0ZXIjVU5TRUxFQ1RfUkVBU09OX1NUT1BQRUR9PC9saT4KLSAgICAgICAgICogPGxpPntAbGluayBNZWRpYVJvdXRlciNVTlNFTEVDVF9SRUFTT05fUk9VVEVfQ0hBTkdFRH08L2xpPgotICAgICAgICAgKiA8L3VsPgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gcmVhc29uIFRoZSByZWFzb24gZm9yIHVuc2VsZWN0aW5nIHRoZSByb3V0ZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uVW5zZWxlY3QoaW50IHJlYXNvbikgewotICAgICAgICAgICAgb25VbnNlbGVjdCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJlcXVlc3RzIHRvIHNldCB0aGUgdm9sdW1lIG9mIHRoZSByb3V0ZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHZvbHVtZSBUaGUgbmV3IHZvbHVtZSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIHtAbGluayBNZWRpYVJvdXRlRGVzY3JpcHRvciNnZXRWb2x1bWVNYXh9LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25TZXRWb2x1bWUoaW50IHZvbHVtZSkgewotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJlcXVlc3RzIGFuIGluY3JlbWVudGFsIHZvbHVtZSB1cGRhdGUgZm9yIHRoZSByb3V0ZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGRlbHRhIFRoZSBkZWx0YSB0byBhZGQgdG8gdGhlIGN1cnJlbnQgdm9sdW1lLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25VcGRhdGVWb2x1bWUoaW50IGRlbHRhKSB7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUGVyZm9ybXMgYSB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50IG1lZGlhIGNvbnRyb2x9IHJlcXVlc3QKLSAgICAgICAgICogYXN5bmNocm9ub3VzbHkgb24gYmVoYWxmIG9mIHRoZSByb3V0ZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGludGVudCBBIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQgbWVkaWEgY29udHJvbCBpbnRlbnR9LgotICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sgQSB7QGxpbmsgQ29udHJvbFJlcXVlc3RDYWxsYmFja30gdG8gaW52b2tlIHdpdGggdGhlIHJlc3VsdAotICAgICAgICAgKiBvZiB0aGUgcmVxdWVzdCwgb3IgbnVsbCBpZiBubyByZXN1bHQgaXMgcmVxdWlyZWQuCi0gICAgICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgY29udHJvbGxlciBpbnRlbmRzIHRvIGhhbmRsZSB0aGUgcmVxdWVzdCBhbmQgd2lsbAotICAgICAgICAgKiBpbnZva2UgdGhlIGNhbGxiYWNrIHdoZW4gZmluaXNoZWQuICBGYWxzZSBpZiB0aGUgY29udHJvbGxlciB3aWxsIG5vdAotICAgICAgICAgKiBoYW5kbGUgdGhlIHJlcXVlc3QgYW5kIHdpbGwgbm90IGludm9rZSB0aGUgY2FsbGJhY2suCi0gICAgICAgICAqCi0gICAgICAgICAqIEBzZWUgTWVkaWFDb250cm9sSW50ZW50Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbkNvbnRyb2xSZXF1ZXN0KEludGVudCBpbnRlbnQsIEBOdWxsYWJsZSBDb250cm9sUmVxdWVzdENhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsYmFjayB3aGljaCBpcyBpbnZva2VkIHdoZW4gcm91dGUgaW5mb3JtYXRpb24gYmVjb21lcyBhdmFpbGFibGUgb3IgY2hhbmdlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIENhbGxiYWNrIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxlZCB3aGVuIGluZm9ybWF0aW9uIGFib3V0IGEgcm91dGUgcHJvdmlkZXIgYW5kIGl0cyByb3V0ZXMgY2hhbmdlcy4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHByb3ZpZGVyIFRoZSBtZWRpYSByb3V0ZSBwcm92aWRlciB0aGF0IGNoYW5nZWQsIG5ldmVyIG51bGwuCi0gICAgICAgICAqIEBwYXJhbSBkZXNjcmlwdG9yIFRoZSBuZXcgbWVkaWEgcm91dGUgcHJvdmlkZXIgZGVzY3JpcHRvciwgb3IgbnVsbCBpZiBub25lLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25EZXNjcmlwdG9yQ2hhbmdlZChATm9uTnVsbCBNZWRpYVJvdXRlUHJvdmlkZXIgcHJvdmlkZXIsCi0gICAgICAgICAgICAgICAgQE51bGxhYmxlIE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBQcm92aWRlckhhbmRsZXIgZXh0ZW5kcyBIYW5kbGVyIHsKLSAgICAgICAgUHJvdmlkZXJIYW5kbGVyKCkgewotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKLSAgICAgICAgICAgIHN3aXRjaCAobXNnLndoYXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIE1TR19ERUxJVkVSX0RFU0NSSVBUT1JfQ0hBTkdFRDoKLSAgICAgICAgICAgICAgICAgICAgZGVsaXZlckRlc2NyaXB0b3JDaGFuZ2VkKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgTVNHX0RFTElWRVJfRElTQ09WRVJZX1JFUVVFU1RfQ0hBTkdFRDoKLSAgICAgICAgICAgICAgICAgICAgZGVsaXZlckRpc2NvdmVyeVJlcXVlc3RDaGFuZ2VkKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViMWNlMDkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhOwotCi1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIERlc2NyaWJlcyB0aGUgc3RhdGUgb2YgYSBtZWRpYSByb3V0ZSBwcm92aWRlciBhbmQgdGhlIHJvdXRlcyB0aGF0IGl0IHB1Ymxpc2hlcy4KLSAqIDxwPgotICogVGhpcyBvYmplY3QgaXMgaW1tdXRhYmxlIG9uY2UgY3JlYXRlZCB1c2luZyBhIHtAbGluayBCdWlsZGVyfSBpbnN0YW5jZS4KLSAqIDwvcD4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfUk9VVEVTID0gInJvdXRlcyI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIEJ1bmRsZSBtQnVuZGxlOwotICAgIHByaXZhdGUgTGlzdDxNZWRpYVJvdXRlRGVzY3JpcHRvcj4gbVJvdXRlczsKLQotICAgIHByaXZhdGUgTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvcihCdW5kbGUgYnVuZGxlLCBMaXN0PE1lZGlhUm91dGVEZXNjcmlwdG9yPiByb3V0ZXMpIHsKLSAgICAgICAgbUJ1bmRsZSA9IGJ1bmRsZTsKLSAgICAgICAgbVJvdXRlcyA9IHJvdXRlczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBsaXN0IG9mIGFsbCByb3V0ZXMgdGhhdCB0aGlzIHByb3ZpZGVyIGhhcyBwdWJsaXNoZWQuCi0gICAgICovCi0gICAgcHVibGljIExpc3Q8TWVkaWFSb3V0ZURlc2NyaXB0b3I+IGdldFJvdXRlcygpIHsKLSAgICAgICAgZW5zdXJlUm91dGVzKCk7Ci0gICAgICAgIHJldHVybiBtUm91dGVzOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBlbnN1cmVSb3V0ZXMoKSB7Ci0gICAgICAgIGlmIChtUm91dGVzID09IG51bGwpIHsKLSAgICAgICAgICAgIEFycmF5TGlzdDxCdW5kbGU+IHJvdXRlQnVuZGxlcyA9IG1CdW5kbGUuPEJ1bmRsZT5nZXRQYXJjZWxhYmxlQXJyYXlMaXN0KEtFWV9ST1VURVMpOwotICAgICAgICAgICAgaWYgKHJvdXRlQnVuZGxlcyA9PSBudWxsIHx8IHJvdXRlQnVuZGxlcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBtUm91dGVzID0gQ29sbGVjdGlvbnMuPE1lZGlhUm91dGVEZXNjcmlwdG9yPmVtcHR5TGlzdCgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgY291bnQgPSByb3V0ZUJ1bmRsZXMuc2l6ZSgpOwotICAgICAgICAgICAgICAgIG1Sb3V0ZXMgPSBuZXcgQXJyYXlMaXN0PE1lZGlhUm91dGVEZXNjcmlwdG9yPihjb3VudCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Sb3V0ZXMuYWRkKE1lZGlhUm91dGVEZXNjcmlwdG9yLmZyb21CdW5kbGUocm91dGVCdW5kbGVzLmdldChpKSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcm91dGUgcHJvdmlkZXIgZGVzY3JpcHRvciBhbmQgYWxsIG9mIHRoZSByb3V0ZXMgdGhhdAotICAgICAqIGl0IGNvbnRhaW5zIGhhdmUgYWxsIG9mIHRoZSByZXF1aXJlZCBmaWVsZHMuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyB2ZXJpZmljYXRpb24gaXMgZGVlcC4gIElmIHRoZSBwcm92aWRlciBkZXNjcmlwdG9yIGlzIGtub3duIHRvIGJlCi0gICAgICogdmFsaWQgdGhlbiBpdCBpcyBub3QgbmVjZXNzYXJ5IHRvIGNhbGwge0BsaW5rICNpc1ZhbGlkfSBvbiBlYWNoIG9mIGl0cyByb3V0ZXMuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzVmFsaWQoKSB7Ci0gICAgICAgIGVuc3VyZVJvdXRlcygpOwotICAgICAgICBmaW5hbCBpbnQgcm91dGVDb3VudCA9IG1Sb3V0ZXMuc2l6ZSgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJvdXRlQ291bnQ7IGkrKykgewotICAgICAgICAgICAgTWVkaWFSb3V0ZURlc2NyaXB0b3Igcm91dGUgPSBtUm91dGVzLmdldChpKTsKLSAgICAgICAgICAgIGlmIChyb3V0ZSA9PSBudWxsIHx8ICFyb3V0ZS5pc1ZhbGlkKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCJNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yeyAiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgicm91dGVzPSIpLmFwcGVuZCgKLSAgICAgICAgICAgICAgICBBcnJheXMudG9TdHJpbmcoZ2V0Um91dGVzKCkudG9BcnJheSgpKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgaXNWYWxpZD0iKS5hcHBlbmQoaXNWYWxpZCgpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiIH0iKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIHRoaXMgb2JqZWN0IHRvIGEgYnVuZGxlIGZvciBzZXJpYWxpemF0aW9uLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgY29udGVudHMgb2YgdGhlIG9iamVjdCByZXByZXNlbnRlZCBhcyBhIGJ1bmRsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgQnVuZGxlIGFzQnVuZGxlKCkgewotICAgICAgICByZXR1cm4gbUJ1bmRsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIGZyb20gYSBidW5kbGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYnVuZGxlIFRoZSBidW5kbGUsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKiBAcmV0dXJuIFRoZSBuZXcgaW5zdGFuY2UsIG9yIG51bGwgaWYgdGhlIGJ1bmRsZSB3YXMgbnVsbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IgZnJvbUJ1bmRsZShCdW5kbGUgYnVuZGxlKSB7Ci0gICAgICAgIHJldHVybiBidW5kbGUgIT0gbnVsbCA/IG5ldyBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yKGJ1bmRsZSwgbnVsbCkgOiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEJ1aWxkZXIgZm9yIHtAbGluayBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yIG1lZGlhIHJvdXRlIHByb3ZpZGVyIGRlc2NyaXB0b3JzfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEJ1aWxkZXIgewotICAgICAgICBwcml2YXRlIGZpbmFsIEJ1bmRsZSBtQnVuZGxlOwotICAgICAgICBwcml2YXRlIEFycmF5TGlzdDxNZWRpYVJvdXRlRGVzY3JpcHRvcj4gbVJvdXRlczsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQ3JlYXRlcyBhbiBlbXB0eSBtZWRpYSByb3V0ZSBwcm92aWRlciBkZXNjcmlwdG9yIGJ1aWxkZXIuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlcigpIHsKLSAgICAgICAgICAgIG1CdW5kbGUgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQ3JlYXRlcyBhIG1lZGlhIHJvdXRlIHByb3ZpZGVyIGRlc2NyaXB0b3IgYnVpbGRlciB3aG9zZSBpbml0aWFsIGNvbnRlbnRzIGFyZQotICAgICAgICAgKiBjb3BpZWQgZnJvbSBhbiBleGlzdGluZyBkZXNjcmlwdG9yLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIoTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0gICAgICAgICAgICBpZiAoZGVzY3JpcHRvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZGVzY3JpcHRvciBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1CdW5kbGUgPSBuZXcgQnVuZGxlKGRlc2NyaXB0b3IubUJ1bmRsZSk7Ci0KLSAgICAgICAgICAgIGRlc2NyaXB0b3IuZW5zdXJlUm91dGVzKCk7Ci0gICAgICAgICAgICBpZiAoIWRlc2NyaXB0b3IubVJvdXRlcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBtUm91dGVzID0gbmV3IEFycmF5TGlzdDxNZWRpYVJvdXRlRGVzY3JpcHRvcj4oZGVzY3JpcHRvci5tUm91dGVzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBZGRzIGEgcm91dGUuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlciBhZGRSb3V0ZShNZWRpYVJvdXRlRGVzY3JpcHRvciByb3V0ZSkgewotICAgICAgICAgICAgaWYgKHJvdXRlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJyb3V0ZSBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtUm91dGVzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtUm91dGVzID0gbmV3IEFycmF5TGlzdDxNZWRpYVJvdXRlRGVzY3JpcHRvcj4oKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobVJvdXRlcy5jb250YWlucyhyb3V0ZSkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJyb3V0ZSBkZXNjcmlwdG9yIGFscmVhZHkgYWRkZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1Sb3V0ZXMuYWRkKHJvdXRlKTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFkZHMgYSBsaXN0IG9mIHJvdXRlcy4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIGFkZFJvdXRlcyhDb2xsZWN0aW9uPE1lZGlhUm91dGVEZXNjcmlwdG9yPiByb3V0ZXMpIHsKLSAgICAgICAgICAgIGlmIChyb3V0ZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInJvdXRlcyBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghcm91dGVzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIGZvciAoTWVkaWFSb3V0ZURlc2NyaXB0b3Igcm91dGUgOiByb3V0ZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkUm91dGUocm91dGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgdGhlIGxpc3Qgb2Ygcm91dGVzLgotICAgICAgICAgKi8KLSAgICAgICAgQnVpbGRlciBzZXRSb3V0ZXMoQ29sbGVjdGlvbjxNZWRpYVJvdXRlRGVzY3JpcHRvcj4gcm91dGVzKSB7Ci0gICAgICAgICAgICBpZiAocm91dGVzID09IG51bGwgfHwgcm91dGVzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIG1Sb3V0ZXMgPSBudWxsOwotICAgICAgICAgICAgICAgIG1CdW5kbGUucmVtb3ZlKEtFWV9ST1VURVMpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtUm91dGVzID0gbmV3IEFycmF5TGlzdDw+KHJvdXRlcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBCdWlsZHMgdGhlIHtAbGluayBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yIG1lZGlhIHJvdXRlIHByb3ZpZGVyIGRlc2NyaXB0b3J9LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IgYnVpbGQoKSB7Ci0gICAgICAgICAgICBpZiAobVJvdXRlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gbVJvdXRlcy5zaXplKCk7Ci0gICAgICAgICAgICAgICAgQXJyYXlMaXN0PEJ1bmRsZT4gcm91dGVCdW5kbGVzID0gbmV3IEFycmF5TGlzdDxCdW5kbGU+KGNvdW50KTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgcm91dGVCdW5kbGVzLmFkZChtUm91dGVzLmdldChpKS5hc0J1bmRsZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUJ1bmRsZS5wdXRQYXJjZWxhYmxlQXJyYXlMaXN0KEtFWV9ST1VURVMsIHJvdXRlQnVuZGxlcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbmV3IE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IobUJ1bmRsZSwgbVJvdXRlcyk7Ci0gICAgICAgIH0KLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhUm91dGVQcm92aWRlclByb3RvY29sLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJlOTM0My4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWE7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotaW1wb3J0IGFuZHJvaWQub3MuTWVzc2VuZ2VyOwotCi0vKioKLSAqIERlZmluZXMgdGhlIGNvbW11bmljYXRpb24gcHJvdG9jb2wgZm9yIG1lZGlhIHJvdXRlIHByb3ZpZGVyIHNlcnZpY2VzLgotICovCi1hYnN0cmFjdCBjbGFzcyBNZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbCB7Ci0gICAgLyoqCi0gICAgICogVGhlIHtAbGluayBJbnRlbnR9IHRoYXQgbXVzdCBiZSBkZWNsYXJlZCBhcyBoYW5kbGVkIGJ5IHRoZSBzZXJ2aWNlLgotICAgICAqIFB1dCB0aGlzIGluIHlvdXIgbWFuaWZlc3QuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVklDRV9JTlRFUkZBQ0UgPQotICAgICAgICAgICAgImFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyU2VydmljZSI7Ci0KLSAgICAvKgotICAgICAqIE1lc3NhZ2VzIHNlbnQgZnJvbSB0aGUgY2xpZW50IHRvIHRoZSBzZXJ2aWNlLgotICAgICAqIERPIE5PVCBSRU5VTUJFUiBUSEVTRSEKLSAgICAgKi8KLQotICAgIC8qKiAoY2xpZW50IHYxKQotICAgICAqIFJlZ2lzdGVyIGNsaWVudC4KLSAgICAgKiAtIHJlcGx5VG8gOiBjbGllbnQgbWVzc2VuZ2VyCi0gICAgICogLSBhcmcxICAgIDogcmVxdWVzdCBpZAotICAgICAqIC0gYXJnMiAgICA6IGNsaWVudCB2ZXJzaW9uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0xJRU5UX01TR19SRUdJU1RFUiA9IDE7Ci0KLSAgICAvKiogKGNsaWVudCB2MSkKLSAgICAgKiBVbnJlZ2lzdGVyIGNsaWVudC4KLSAgICAgKiAtIHJlcGx5VG8gOiBjbGllbnQgbWVzc2VuZ2VyCi0gICAgICogLSBhcmcxICAgIDogcmVxdWVzdCBpZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMSUVOVF9NU0dfVU5SRUdJU1RFUiA9IDI7Ci0KLSAgICAvKiogKGNsaWVudCB2MSkKLSAgICAgKiBDcmVhdGUgcm91dGUgY29udHJvbGxlci4KLSAgICAgKiAtIHJlcGx5VG8gOiBjbGllbnQgbWVzc2VuZ2VyCi0gICAgICogLSBhcmcxICAgIDogcmVxdWVzdCBpZAotICAgICAqIC0gYXJnMiAgICA6IHJvdXRlIGNvbnRyb2xsZXIgaWQKLSAgICAgKiAtIENMSUVOVF9EQVRBX1JPVVRFX0lEIDogcm91dGUgaWQgc3RyaW5nCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0xJRU5UX01TR19DUkVBVEVfUk9VVEVfQ09OVFJPTExFUiA9IDM7Ci0KLSAgICAvKiogKGNsaWVudCB2MSkKLSAgICAgKiBSZWxlYXNlIHJvdXRlIGNvbnRyb2xsZXIuCi0gICAgICogLSByZXBseVRvIDogY2xpZW50IG1lc3NlbmdlcgotICAgICAqIC0gYXJnMSAgICA6IHJlcXVlc3QgaWQKLSAgICAgKiAtIGFyZzIgICAgOiByb3V0ZSBjb250cm9sbGVyIGlkCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0xJRU5UX01TR19SRUxFQVNFX1JPVVRFX0NPTlRST0xMRVIgPSA0OwotCi0gICAgLyoqIChjbGllbnQgdjEpCi0gICAgICogU2VsZWN0IHJvdXRlLgotICAgICAqIC0gcmVwbHlUbyA6IGNsaWVudCBtZXNzZW5nZXIKLSAgICAgKiAtIGFyZzEgICAgOiByZXF1ZXN0IGlkCi0gICAgICogLSBhcmcyICAgIDogcm91dGUgY29udHJvbGxlciBpZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMSUVOVF9NU0dfU0VMRUNUX1JPVVRFID0gNTsKLQotICAgIC8qKiAoY2xpZW50IHYxKQotICAgICAqIFVuc2VsZWN0IHJvdXRlLgotICAgICAqIC0gcmVwbHlUbyA6IGNsaWVudCBtZXNzZW5nZXIKLSAgICAgKiAtIGFyZzEgICAgOiByZXF1ZXN0IGlkCi0gICAgICogLSBhcmcyICAgIDogcm91dGUgY29udHJvbGxlciBpZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMSUVOVF9NU0dfVU5TRUxFQ1RfUk9VVEUgPSA2OwotCi0gICAgLyoqIChjbGllbnQgdjEpCi0gICAgICogU2V0IHJvdXRlIHZvbHVtZS4KLSAgICAgKiAtIHJlcGx5VG8gOiBjbGllbnQgbWVzc2VuZ2VyCi0gICAgICogLSBhcmcxICAgIDogcmVxdWVzdCBpZAotICAgICAqIC0gYXJnMiAgICA6IHJvdXRlIGNvbnRyb2xsZXIgaWQKLSAgICAgKiAtIENMSUVOVF9EQVRBX1ZPTFVNRSA6IHZvbHVtZSBpbnRlZ2VyCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0xJRU5UX01TR19TRVRfUk9VVEVfVk9MVU1FID0gNzsKLQotICAgIC8qKiAoY2xpZW50IHYxKQotICAgICAqIFVwZGF0ZSByb3V0ZSB2b2x1bWUuCi0gICAgICogLSByZXBseVRvIDogY2xpZW50IG1lc3NlbmdlcgotICAgICAqIC0gYXJnMSAgICA6IHJlcXVlc3QgaWQKLSAgICAgKiAtIGFyZzIgICAgOiByb3V0ZSBjb250cm9sbGVyIGlkCi0gICAgICogLSBDTElFTlRfREFUQV9WT0xVTUUgOiB2b2x1bWUgZGVsdGEgaW50ZWdlcgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMSUVOVF9NU0dfVVBEQVRFX1JPVVRFX1ZPTFVNRSA9IDg7Ci0KLSAgICAvKiogKGNsaWVudCB2MSkKLSAgICAgKiBSb3V0ZSBjb250cm9sIHJlcXVlc3QuCi0gICAgICogLSByZXBseVRvIDogY2xpZW50IG1lc3NlbmdlcgotICAgICAqIC0gYXJnMSAgICA6IHJlcXVlc3QgaWQKLSAgICAgKiAtIGFyZzIgICAgOiByb3V0ZSBjb250cm9sbGVyIGlkCi0gICAgICogLSBvYmogICAgIDogbWVkaWEgY29udHJvbCBpbnRlbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTElFTlRfTVNHX1JPVVRFX0NPTlRST0xfUkVRVUVTVCA9IDk7Ci0KLSAgICAvKiogKGNsaWVudCB2MSkKLSAgICAgKiBTZXRzIHRoZSBkaXNjb3ZlcnkgcmVxdWVzdC4KLSAgICAgKiAtIHJlcGx5VG8gOiBjbGllbnQgbWVzc2VuZ2VyCi0gICAgICogLSBhcmcxICAgIDogcmVxdWVzdCBpZAotICAgICAqIC0gb2JqICAgICA6IGRpc2NvdmVyeSByZXF1ZXN0IGJ1bmRsZSwgb3IgbnVsbCBpZiBub25lCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0xJRU5UX01TR19TRVRfRElTQ09WRVJZX1JFUVVFU1QgPSAxMDsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENMSUVOVF9EQVRBX1JPVVRFX0lEID0gInJvdXRlSWQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENMSUVOVF9EQVRBX1JPVVRFX0xJQlJBUllfR1JPVVAgPSAicm91dGVHcm91cElkIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTElFTlRfREFUQV9WT0xVTUUgPSAidm9sdW1lIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTElFTlRfREFUQV9VTlNFTEVDVF9SRUFTT04gPSAidW5zZWxlY3RSZWFzb24iOwotCi0gICAgLyoKLSAgICAgKiBNZXNzYWdlcyBzZW50IGZyb20gdGhlIHNlcnZpY2UgdG8gdGhlIGNsaWVudC4KLSAgICAgKiBETyBOT1QgUkVOVU1CRVIgVEhFU0UhCi0gICAgICovCi0KLSAgICAvKiogKHNlcnZpY2UgdjEpCi0gICAgICogR2VuZXJpYyBmYWlsdXJlIHNlbnQgaW4gcmVzcG9uc2UgdG8gYW55IHVucmVjb2duaXplZCBvciBtYWxmb3JtZWQgcmVxdWVzdC4KLSAgICAgKiAtIGFyZzEgICAgOiByZXF1ZXN0IGlkCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VSVklDRV9NU0dfR0VORVJJQ19GQUlMVVJFID0gMDsKLQotICAgIC8qKiAoc2VydmljZSB2MSkKLSAgICAgKiBHZW5lcmljIGZhaWx1cmUgc2VudCBpbiByZXNwb25zZSB0byBhIHN1Y2Nlc3NmdWwgbWVzc2FnZS4KLSAgICAgKiAtIGFyZzEgICAgOiByZXF1ZXN0IGlkCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VSVklDRV9NU0dfR0VORVJJQ19TVUNDRVNTID0gMTsKLQotICAgIC8qKiAoc2VydmljZSB2MSkKLSAgICAgKiBSZWdpc3RyYXRpb24gc3VjY2VlZGVkLgotICAgICAqIC0gYXJnMSAgICA6IHJlcXVlc3QgaWQKLSAgICAgKiAtIGFyZzIgICAgOiBzZXJ2ZXIgdmVyc2lvbgotICAgICAqIC0gb2JqICAgICA6IHJvdXRlIHByb3ZpZGVyIGRlc2NyaXB0b3IgYnVuZGxlLCBvciBudWxsCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VSVklDRV9NU0dfUkVHSVNURVJFRCA9IDI7Ci0KLSAgICAvKiogKHNlcnZpY2UgdjEpCi0gICAgICogUm91dGUgY29udHJvbCByZXF1ZXN0IHN1Y2Nlc3MgcmVzdWx0LgotICAgICAqIC0gYXJnMSAgICA6IHJlcXVlc3QgaWQKLSAgICAgKiAtIG9iaiAgICAgOiByZXN1bHQgZGF0YSBidW5kbGUsIG9yIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRVJWSUNFX01TR19DT05UUk9MX1JFUVVFU1RfU1VDQ0VFREVEID0gMzsKLQotICAgIC8qKiAoc2VydmljZSB2MSkKLSAgICAgKiBSb3V0ZSBjb250cm9sIHJlcXVlc3QgZmFpbHVyZSByZXN1bHQuCi0gICAgICogLSBhcmcxICAgIDogcmVxdWVzdCBpZAotICAgICAqIC0gb2JqICAgICA6IHJlc3VsdCBkYXRhIGJ1bmRsZSwgb3IgbnVsbAotICAgICAqIC0gU0VSVklDRV9EQVRBX0VSUk9SOiBlcnJvciBtZXNzYWdlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VSVklDRV9NU0dfQ09OVFJPTF9SRVFVRVNUX0ZBSUxFRCA9IDQ7Ci0KLSAgICAvKiogKHNlcnZpY2UgdjEpCi0gICAgICogUm91dGUgcHJvdmlkZXIgZGVzY3JpcHRvciBjaGFuZ2VkLiAgKHVuc29saWNpdGVkIGV2ZW50KQotICAgICAqIC0gYXJnMSAgICA6IHJlc2VydmVkICgwKQotICAgICAqIC0gb2JqICAgICA6IHJvdXRlIHByb3ZpZGVyIGRlc2NyaXB0b3IgYnVuZGxlLCBvciBudWxsCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VSVklDRV9NU0dfREVTQ1JJUFRPUl9DSEFOR0VEID0gNTsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZJQ0VfREFUQV9FUlJPUiA9ICJlcnJvciI7Ci0KLSAgICAvKgotICAgICAqIFJlY29nbml6ZWQgY2xpZW50IHZlcnNpb24gbnVtYmVycy4gIChSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZS4pCi0gICAgICogRE8gTk9UIFJFTlVNQkVSIFRIRVNFIQotICAgICAqLwotCi0gICAgLyoqCi0gICAgICogVGhlIGNsaWVudCB2ZXJzaW9uIHVzZWQgZnJvbSB0aGUgYmVnaW5uaW5nLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMSUVOVF9WRVJTSU9OXzEgPSAxOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNsaWVudCB2ZXJzaW9uIHVzZWQgZnJvbSBzdXBwb3J0IGxpYnJhcnkgdjI0LjEuMC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTElFTlRfVkVSU0lPTl8yID0gMjsKLQotICAgIC8qKgotICAgICAqIFRoZSBjdXJyZW50IGNsaWVudCB2ZXJzaW9uLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMSUVOVF9WRVJTSU9OX0NVUlJFTlQgPSBDTElFTlRfVkVSU0lPTl8yOwotCi0gICAgLyoKLSAgICAgKiBSZWNvZ25pemVkIHNlcnZlciB2ZXJzaW9uIG51bWJlcnMuICAoUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuKQotICAgICAqIERPIE5PVCBSRU5VTUJFUiBUSEVTRSEKLSAgICAgKi8KLQotICAgIC8qKgotICAgICAqIFRoZSBzZXJ2aWNlIHZlcnNpb24gdXNlZCBmcm9tIHRoZSBiZWdpbm5pbmcuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VSVklDRV9WRVJTSU9OXzEgPSAxOwotCi0gICAgLyoqCi0gICAgICogVGhlIGN1cnJlbnQgc2VydmljZSB2ZXJzaW9uLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFUlZJQ0VfVkVSU0lPTl9DVVJSRU5UID0gU0VSVklDRV9WRVJTSU9OXzE7Ci0KLSAgICBzdGF0aWMgZmluYWwgaW50IENMSUVOVF9WRVJTSU9OX1NUQVJUID0gQ0xJRU5UX1ZFUlNJT05fMTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgbWVzc2VuZ2VyIG9iamVjdCBpcyB2YWxpZC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgbWVzc2VuZ2VyIGNvbnN0cnVjdG9yIGFuZCB1bnBhcmNlbGluZyBjb2RlIGRvZXMgbm90IGNoZWNrIHdoZXRoZXIgdGhlCi0gICAgICogcHJvdmlkZWQgSUJpbmRlciBpcyBhIHZhbGlkIElNZXNzZW5nZXIgb2JqZWN0LiAgQXMgYSByZXN1bHQsIGl0J3MgcG9zc2libGUKLSAgICAgKiBmb3IgYSBwZWVyIHRvIHNlbmQgYW4gaW52YWxpZCBJQmluZGVyIHRoYXQgd2lsbCByZXN1bHQgaW4gY3Jhc2hlcyBkb3duc3RyZWFtLgotICAgICAqIFRoaXMgbWV0aG9kIGNoZWNrcyB0aGF0IHRoZSBtZXNzZW5nZXIgaXMgaW4gYSB2YWxpZCBzdGF0ZS4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWRSZW1vdGVNZXNzZW5nZXIoTWVzc2VuZ2VyIG1lc3NlbmdlcikgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIG1lc3NlbmdlciAhPSBudWxsICYmIG1lc3Nlbmdlci5nZXRCaW5kZXIoKSAhPSBudWxsOwotICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgLy8gSWYgdGhlIG1lc3NlbmdlciB3YXMgY29uc3RydWN0ZWQgd2l0aCBhIGJpbmRlciBpbnRlcmZhY2Ugb3RoZXIgdGhhbgotICAgICAgICAgICAgLy8gSU1lc3NlbmdlciB0aGVuIHRoZSBjYWxsIHRvIGdldEJpbmRlcigpIHdpbGwgY3Jhc2ggd2l0aCBhbiBOUEUuCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFSb3V0ZVByb3ZpZGVyU2VydmljZS5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhUm91dGVQcm92aWRlclNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNjZGUxMC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFSb3V0ZVByb3ZpZGVyU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzU5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYTsKLQotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sLkNMSUVOVF9EQVRBX1JPVVRFX0lEOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCi0gICAgICAgIC5DTElFTlRfREFUQV9ST1VURV9MSUJSQVJZX0dST1VQOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCi0gICAgICAgIC5DTElFTlRfREFUQV9VTlNFTEVDVF9SRUFTT047Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wuQ0xJRU5UX0RBVEFfVk9MVU1FOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCi0gICAgICAgIC5DTElFTlRfTVNHX0NSRUFURV9ST1VURV9DT05UUk9MTEVSOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sLkNMSUVOVF9NU0dfUkVHSVNURVI7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wKLSAgICAgICAgLkNMSUVOVF9NU0dfUkVMRUFTRV9ST1VURV9DT05UUk9MTEVSOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCi0gICAgICAgIC5DTElFTlRfTVNHX1JPVVRFX0NPTlRST0xfUkVRVUVTVDsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5DTElFTlRfTVNHX1NFTEVDVF9ST1VURTsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAotICAgICAgICAuQ0xJRU5UX01TR19TRVRfRElTQ09WRVJZX1JFUVVFU1Q7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wKLSAgICAgICAgLkNMSUVOVF9NU0dfU0VUX1JPVVRFX1ZPTFVNRTsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5DTElFTlRfTVNHX1VOUkVHSVNURVI7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wKLSAgICAgICAgLkNMSUVOVF9NU0dfVU5TRUxFQ1RfUk9VVEU7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wKLSAgICAgICAgLkNMSUVOVF9NU0dfVVBEQVRFX1JPVVRFX1ZPTFVNRTsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5DTElFTlRfVkVSU0lPTl8xOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sLlNFUlZJQ0VfREFUQV9FUlJPUjsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAotICAgICAgICAuU0VSVklDRV9NU0dfQ09OVFJPTF9SRVFVRVNUX0ZBSUxFRDsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAotICAgICAgICAuU0VSVklDRV9NU0dfQ09OVFJPTF9SRVFVRVNUX1NVQ0NFRURFRDsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAotICAgICAgICAuU0VSVklDRV9NU0dfREVTQ1JJUFRPUl9DSEFOR0VEOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCi0gICAgICAgIC5TRVJWSUNFX01TR19HRU5FUklDX0ZBSUxVUkU7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wKLSAgICAgICAgLlNFUlZJQ0VfTVNHX0dFTkVSSUNfU1VDQ0VTUzsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5TRVJWSUNFX01TR19SRUdJU1RFUkVEOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sLlNFUlZJQ0VfVkVSU0lPTl9DVVJSRU5UOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sLmlzVmFsaWRSZW1vdGVNZXNzZW5nZXI7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5TZXJ2aWNlOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5EZWFkT2JqZWN0RXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKLWltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyLkRlYXRoUmVjaXBpZW50OwotaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKLWltcG9ydCBhbmRyb2lkLm9zLk1lc3NlbmdlcjsKLWltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5WaXNpYmxlRm9yVGVzdGluZzsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQudXRpbC5PYmplY3RzQ29tcGF0OwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLlNwYXJzZUFycmF5OwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLS8qKgotICogQmFzZSBjbGFzcyBmb3IgbWVkaWEgcm91dGUgcHJvdmlkZXIgc2VydmljZXMuCi0gKiA8cD4KLSAqIEEgbWVkaWEgcm91dGVyIHdpbGwgYmluZCB0byBtZWRpYSByb3V0ZSBwcm92aWRlciBzZXJ2aWNlcyB3aGVuIGEgY2FsbGJhY2sgaXMgYWRkZWQgdmlhCi0gKiB7QGxpbmsgTWVkaWFSb3V0ZXIjYWRkQ2FsbGJhY2soTWVkaWFSb3V0ZVNlbGVjdG9yLCBNZWRpYVJvdXRlci5DYWxsYmFjaywgaW50KX0gd2l0aCBhIGRpc2NvdmVyeQotICogZmxhZzoge0BsaW5rIE1lZGlhUm91dGVyI0NBTExCQUNLX0ZMQUdfUkVRVUVTVF9ESVNDT1ZFUll9LAotICoge0BsaW5rIE1lZGlhUm91dGVyI0NBTExCQUNLX0ZMQUdfRk9SQ0VfRElTQ09WRVJZfSwgb3IKLSAqIHtAbGluayBNZWRpYVJvdXRlciNDQUxMQkFDS19GTEFHX1BFUkZPUk1fQUNUSVZFX1NDQU59LCBhbmQgd2lsbCB1bmJpbmQgd2hlbiB0aGUgY2FsbGJhY2sKLSAqIGlzIHJlbW92ZWQgdmlhIHtAbGluayBNZWRpYVJvdXRlciNyZW1vdmVDYWxsYmFjayhNZWRpYVJvdXRlci5DYWxsYmFjayl9LgotICogPC9wPjxwPgotICogVG8gaW1wbGVtZW50IHlvdXIgb3duIG1lZGlhIHJvdXRlIHByb3ZpZGVyIHNlcnZpY2UsIGV4dGVuZCB0aGlzIGNsYXNzIGFuZAotICogb3ZlcnJpZGUgdGhlIHtAbGluayAjb25DcmVhdGVNZWRpYVJvdXRlUHJvdmlkZXJ9IG1ldGhvZCB0byByZXR1cm4gYW4KLSAqIGluc3RhbmNlIG9mIHlvdXIge0BsaW5rIE1lZGlhUm91dGVQcm92aWRlcn0uCi0gKiA8L3A+PHA+Ci0gKiBEZWNsYXJlIHlvdXIgbWVkaWEgcm91dGUgcHJvdmlkZXIgc2VydmljZSBpbiB5b3VyIGFwcGxpY2F0aW9uIG1hbmlmZXN0Ci0gKiBsaWtlIHRoaXM6Ci0gKiA8L3A+Ci0gKiA8cHJlPgotICogICAmbHQ7c2VydmljZSBhbmRyb2lkOm5hbWU9Ii5NeU1lZGlhUm91dGVQcm92aWRlclNlcnZpY2UiCi0gKiAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9teV9tZWRpYV9yb3V0ZV9wcm92aWRlcl9zZXJ2aWNlIj4KLSAqICAgICAgICZsdDtpbnRlbnQtZmlsdGVyPgotICogICAgICAgICAgICZsdDthY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclNlcnZpY2UiIC8+Ci0gKiAgICAgICAmbHQ7L2ludGVudC1maWx0ZXI+Ci0gKiAgICZsdDsvc2VydmljZT4KLSAqIDwvcHJlPgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTWVkaWFSb3V0ZVByb3ZpZGVyU2VydmljZSBleHRlbmRzIFNlcnZpY2UgewotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk1lZGlhUm91dGVQcm92aWRlclNydiI7IC8vIG1heC4gMjMgY2hhcnMKLSAgICBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKTsKLQotICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PENsaWVudFJlY29yZD4gbUNsaWVudHMgPSBuZXcgQXJyYXlMaXN0PENsaWVudFJlY29yZD4oKTsKLSAgICBwcml2YXRlIGZpbmFsIFJlY2VpdmVIYW5kbGVyIG1SZWNlaXZlSGFuZGxlcjsKLSAgICBwcml2YXRlIGZpbmFsIE1lc3NlbmdlciBtUmVjZWl2ZU1lc3NlbmdlcjsKLSAgICBmaW5hbCBQcml2YXRlSGFuZGxlciBtUHJpdmF0ZUhhbmRsZXI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlckNhbGxiYWNrIG1Qcm92aWRlckNhbGxiYWNrOwotCi0gICAgTWVkaWFSb3V0ZVByb3ZpZGVyIG1Qcm92aWRlcjsKLSAgICBwcml2YXRlIE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0IG1Db21wb3NpdGVEaXNjb3ZlcnlSZXF1ZXN0OwotCi0gICAgLyoqCi0gICAgICogVGhlIHtAbGluayBJbnRlbnR9IHRoYXQgbXVzdCBiZSBkZWNsYXJlZCBhcyBoYW5kbGVkIGJ5IHRoZSBzZXJ2aWNlLgotICAgICAqIFB1dCB0aGlzIGluIHlvdXIgbWFuaWZlc3QuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVklDRV9JTlRFUkZBQ0UgPSBNZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5TRVJWSUNFX0lOVEVSRkFDRTsKLQotICAgIC8qCi0gICAgICogUHJpdmF0ZSBtZXNzYWdlcyB1c2VkIGludGVybmFsbHkuICAoWWVzLCB5b3UgY2FuIHJlbnVtYmVyIHRoZXNlLikKLSAgICAgKi8KLQotICAgIHN0YXRpYyBmaW5hbCBpbnQgUFJJVkFURV9NU0dfQ0xJRU5UX0RJRUQgPSAxOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG1lZGlhIHJvdXRlIHByb3ZpZGVyIHNlcnZpY2UuCi0gICAgICovCi0gICAgcHVibGljIE1lZGlhUm91dGVQcm92aWRlclNlcnZpY2UoKSB7Ci0gICAgICAgIG1SZWNlaXZlSGFuZGxlciA9IG5ldyBSZWNlaXZlSGFuZGxlcih0aGlzKTsKLSAgICAgICAgbVJlY2VpdmVNZXNzZW5nZXIgPSBuZXcgTWVzc2VuZ2VyKG1SZWNlaXZlSGFuZGxlcik7Ci0gICAgICAgIG1Qcml2YXRlSGFuZGxlciA9IG5ldyBQcml2YXRlSGFuZGxlcigpOwotICAgICAgICBtUHJvdmlkZXJDYWxsYmFjayA9IG5ldyBQcm92aWRlckNhbGxiYWNrKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIGJ5IHRoZSBzeXN0ZW0gd2hlbiBpdCBpcyB0aW1lIHRvIGNyZWF0ZSB0aGUgbWVkaWEgcm91dGUgcHJvdmlkZXIuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBtZWRpYSByb3V0ZSBwcm92aWRlciBvZmZlcmVkIGJ5IHRoaXMgc2VydmljZSwgb3IgbnVsbCBpZgotICAgICAqIHRoaXMgc2VydmljZSBoYXMgZGVjaWRlZCBub3QgdG8gb2ZmZXIgYSBtZWRpYSByb3V0ZSBwcm92aWRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgTWVkaWFSb3V0ZVByb3ZpZGVyIG9uQ3JlYXRlTWVkaWFSb3V0ZVByb3ZpZGVyKCk7Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBtZWRpYSByb3V0ZSBwcm92aWRlciBvZmZlcmVkIGJ5IHRoaXMgc2VydmljZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIG1lZGlhIHJvdXRlIHByb3ZpZGVyIG9mZmVyZWQgYnkgdGhpcyBzZXJ2aWNlLCBvciBudWxsIGlmCi0gICAgICogaXQgaGFzIG5vdCB5ZXQgYmVlbiBjcmVhdGVkLgotICAgICAqCi0gICAgICogQHNlZSAjb25DcmVhdGVNZWRpYVJvdXRlUHJvdmlkZXIoKQotICAgICAqLwotICAgIHB1YmxpYyBNZWRpYVJvdXRlUHJvdmlkZXIgZ2V0TWVkaWFSb3V0ZVByb3ZpZGVyKCkgewotICAgICAgICByZXR1cm4gbVByb3ZpZGVyOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJQmluZGVyIG9uQmluZChJbnRlbnQgaW50ZW50KSB7Ci0gICAgICAgIGlmIChpbnRlbnQuZ2V0QWN0aW9uKCkuZXF1YWxzKFNFUlZJQ0VfSU5URVJGQUNFKSkgewotICAgICAgICAgICAgaWYgKG1Qcm92aWRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTWVkaWFSb3V0ZVByb3ZpZGVyIHByb3ZpZGVyID0gb25DcmVhdGVNZWRpYVJvdXRlUHJvdmlkZXIoKTsKLSAgICAgICAgICAgICAgICBpZiAocHJvdmlkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcHJvdmlkZXJQYWNrYWdlID0gcHJvdmlkZXIuZ2V0TWV0YWRhdGEoKS5nZXRQYWNrYWdlTmFtZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoIXByb3ZpZGVyUGFja2FnZS5lcXVhbHMoZ2V0UGFja2FnZU5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIm9uQ3JlYXRlTWVkaWFSb3V0ZVByb3ZpZGVyKCkgcmV0dXJuZWQgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJhIHByb3ZpZGVyIHdob3NlIHBhY2thZ2UgbmFtZSBkb2VzIG5vdCBtYXRjaCB0aGUgcGFja2FnZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIm5hbWUgb2YgdGhlIHNlcnZpY2UuICBBIG1lZGlhIHJvdXRlIHByb3ZpZGVyIHNlcnZpY2UgY2FuICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAib25seSBleHBvcnQgaXRzIG93biBtZWRpYSByb3V0ZSBwcm92aWRlcnMuICAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlByb3ZpZGVyIHBhY2thZ2UgbmFtZTogIiArIHByb3ZpZGVyUGFja2FnZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIuICBTZXJ2aWNlIHBhY2thZ2UgbmFtZTogIiArIGdldFBhY2thZ2VOYW1lKCkgKyAiLiIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1Qcm92aWRlciA9IHByb3ZpZGVyOwotICAgICAgICAgICAgICAgICAgICBtUHJvdmlkZXIuc2V0Q2FsbGJhY2sobVByb3ZpZGVyQ2FsbGJhY2spOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtUHJvdmlkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBtUmVjZWl2ZU1lc3Nlbmdlci5nZXRCaW5kZXIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBvblVuYmluZChJbnRlbnQgaW50ZW50KSB7Ci0gICAgICAgIGlmIChtUHJvdmlkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbVByb3ZpZGVyLnNldENhbGxiYWNrKG51bGwpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdXBlci5vblVuYmluZChpbnRlbnQpOwotICAgIH0KLQotICAgIGJvb2xlYW4gb25SZWdpc3RlckNsaWVudChNZXNzZW5nZXIgbWVzc2VuZ2VyLCBpbnQgcmVxdWVzdElkLCBpbnQgdmVyc2lvbikgewotICAgICAgICBpZiAodmVyc2lvbiA+PSBDTElFTlRfVkVSU0lPTl8xKSB7Ci0gICAgICAgICAgICBpbnQgaW5kZXggPSBmaW5kQ2xpZW50KG1lc3Nlbmdlcik7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgICAgICAgICAgQ2xpZW50UmVjb3JkIGNsaWVudCA9IG5ldyBDbGllbnRSZWNvcmQobWVzc2VuZ2VyLCB2ZXJzaW9uKTsKLSAgICAgICAgICAgICAgICBpZiAoY2xpZW50LnJlZ2lzdGVyKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbUNsaWVudHMuYWRkKGNsaWVudCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCBjbGllbnQgKyAiOiBSZWdpc3RlcmVkLCB2ZXJzaW9uPSIgKyB2ZXJzaW9uKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAocmVxdWVzdElkICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG1Qcm92aWRlci5nZXREZXNjcmlwdG9yKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZW5kUmVwbHkobWVzc2VuZ2VyLCBTRVJWSUNFX01TR19SRUdJU1RFUkVELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQsIFNFUlZJQ0VfVkVSU0lPTl9DVVJSRU5ULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVEZXNjcmlwdG9yQnVuZGxlRm9yQ2xpZW50VmVyc2lvbihkZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudC5tVmVyc2lvbiksIG51bGwpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgYm9vbGVhbiBvblVucmVnaXN0ZXJDbGllbnQoTWVzc2VuZ2VyIG1lc3NlbmdlciwgaW50IHJlcXVlc3RJZCkgewotICAgICAgICBpbnQgaW5kZXggPSBmaW5kQ2xpZW50KG1lc3Nlbmdlcik7Ci0gICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICBDbGllbnRSZWNvcmQgY2xpZW50ID0gbUNsaWVudHMucmVtb3ZlKGluZGV4KTsKLSAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgY2xpZW50ICsgIjogVW5yZWdpc3RlcmVkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjbGllbnQuZGlzcG9zZSgpOwotICAgICAgICAgICAgc2VuZEdlbmVyaWNTdWNjZXNzKG1lc3NlbmdlciwgcmVxdWVzdElkKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICB2b2lkIG9uQmluZGVyRGllZChNZXNzZW5nZXIgbWVzc2VuZ2VyKSB7Ci0gICAgICAgIGludCBpbmRleCA9IGZpbmRDbGllbnQobWVzc2VuZ2VyKTsKLSAgICAgICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgICAgIENsaWVudFJlY29yZCBjbGllbnQgPSBtQ2xpZW50cy5yZW1vdmUoaW5kZXgpOwotICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCBjbGllbnQgKyAiOiBCaW5kZXIgZGllZCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2xpZW50LmRpc3Bvc2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGJvb2xlYW4gb25DcmVhdGVSb3V0ZUNvbnRyb2xsZXIoTWVzc2VuZ2VyIG1lc3NlbmdlciwgaW50IHJlcXVlc3RJZCwKLSAgICAgICAgICAgIGludCBjb250cm9sbGVySWQsIFN0cmluZyByb3V0ZUlkLCBTdHJpbmcgcm91dGVHcm91cElkKSB7Ci0gICAgICAgIENsaWVudFJlY29yZCBjbGllbnQgPSBnZXRDbGllbnQobWVzc2VuZ2VyKTsKLSAgICAgICAgaWYgKGNsaWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoY2xpZW50LmNyZWF0ZVJvdXRlQ29udHJvbGxlcihyb3V0ZUlkLCByb3V0ZUdyb3VwSWQsIGNvbnRyb2xsZXJJZCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCBjbGllbnQgKyAiOiBSb3V0ZSBjb250cm9sbGVyIGNyZWF0ZWQsIGNvbnRyb2xsZXJJZD0iICsgY29udHJvbGxlcklkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCByb3V0ZUlkPSIgKyByb3V0ZUlkICsgIiwgcm91dGVHcm91cElkPSIgKyByb3V0ZUdyb3VwSWQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzZW5kR2VuZXJpY1N1Y2Nlc3MobWVzc2VuZ2VyLCByZXF1ZXN0SWQpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBib29sZWFuIG9uUmVsZWFzZVJvdXRlQ29udHJvbGxlcihNZXNzZW5nZXIgbWVzc2VuZ2VyLCBpbnQgcmVxdWVzdElkLAotICAgICAgICAgICAgaW50IGNvbnRyb2xsZXJJZCkgewotICAgICAgICBDbGllbnRSZWNvcmQgY2xpZW50ID0gZ2V0Q2xpZW50KG1lc3Nlbmdlcik7Ci0gICAgICAgIGlmIChjbGllbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGNsaWVudC5yZWxlYXNlUm91dGVDb250cm9sbGVyKGNvbnRyb2xsZXJJZCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCBjbGllbnQgKyAiOiBSb3V0ZSBjb250cm9sbGVyIHJlbGVhc2VkIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgY29udHJvbGxlcklkPSIgKyBjb250cm9sbGVySWQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzZW5kR2VuZXJpY1N1Y2Nlc3MobWVzc2VuZ2VyLCByZXF1ZXN0SWQpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBib29sZWFuIG9uU2VsZWN0Um91dGUoTWVzc2VuZ2VyIG1lc3NlbmdlciwgaW50IHJlcXVlc3RJZCwKLSAgICAgICAgICAgIGludCBjb250cm9sbGVySWQpIHsKLSAgICAgICAgQ2xpZW50UmVjb3JkIGNsaWVudCA9IGdldENsaWVudChtZXNzZW5nZXIpOwotICAgICAgICBpZiAoY2xpZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIE1lZGlhUm91dGVQcm92aWRlci5Sb3V0ZUNvbnRyb2xsZXIgY29udHJvbGxlciA9Ci0gICAgICAgICAgICAgICAgICAgIGNsaWVudC5nZXRSb3V0ZUNvbnRyb2xsZXIoY29udHJvbGxlcklkKTsKLSAgICAgICAgICAgIGlmIChjb250cm9sbGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjb250cm9sbGVyLm9uU2VsZWN0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgY2xpZW50ICsgIjogUm91dGUgc2VsZWN0ZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBjb250cm9sbGVySWQ9IiArIGNvbnRyb2xsZXJJZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNlbmRHZW5lcmljU3VjY2VzcyhtZXNzZW5nZXIsIHJlcXVlc3RJZCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGJvb2xlYW4gb25VbnNlbGVjdFJvdXRlKE1lc3NlbmdlciBtZXNzZW5nZXIsIGludCByZXF1ZXN0SWQsCi0gICAgICAgICAgICBpbnQgY29udHJvbGxlcklkLCBpbnQgcmVhc29uKSB7Ci0gICAgICAgIENsaWVudFJlY29yZCBjbGllbnQgPSBnZXRDbGllbnQobWVzc2VuZ2VyKTsKLSAgICAgICAgaWYgKGNsaWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlUHJvdmlkZXIuUm91dGVDb250cm9sbGVyIGNvbnRyb2xsZXIgPQotICAgICAgICAgICAgICAgICAgICBjbGllbnQuZ2V0Um91dGVDb250cm9sbGVyKGNvbnRyb2xsZXJJZCk7Ci0gICAgICAgICAgICBpZiAoY29udHJvbGxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY29udHJvbGxlci5vblVuc2VsZWN0KHJlYXNvbik7Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgY2xpZW50ICsgIjogUm91dGUgdW5zZWxlY3RlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIGNvbnRyb2xsZXJJZD0iICsgY29udHJvbGxlcklkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc2VuZEdlbmVyaWNTdWNjZXNzKG1lc3NlbmdlciwgcmVxdWVzdElkKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgYm9vbGVhbiBvblNldFJvdXRlVm9sdW1lKE1lc3NlbmdlciBtZXNzZW5nZXIsIGludCByZXF1ZXN0SWQsCi0gICAgICAgICAgICBpbnQgY29udHJvbGxlcklkLCBpbnQgdm9sdW1lKSB7Ci0gICAgICAgIENsaWVudFJlY29yZCBjbGllbnQgPSBnZXRDbGllbnQobWVzc2VuZ2VyKTsKLSAgICAgICAgaWYgKGNsaWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlUHJvdmlkZXIuUm91dGVDb250cm9sbGVyIGNvbnRyb2xsZXIgPQotICAgICAgICAgICAgICAgICAgICBjbGllbnQuZ2V0Um91dGVDb250cm9sbGVyKGNvbnRyb2xsZXJJZCk7Ci0gICAgICAgICAgICBpZiAoY29udHJvbGxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY29udHJvbGxlci5vblNldFZvbHVtZSh2b2x1bWUpOwotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsIGNsaWVudCArICI6IFJvdXRlIHZvbHVtZSBjaGFuZ2VkIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgY29udHJvbGxlcklkPSIgKyBjb250cm9sbGVySWQgKyAiLCB2b2x1bWU9IiArIHZvbHVtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNlbmRHZW5lcmljU3VjY2VzcyhtZXNzZW5nZXIsIHJlcXVlc3RJZCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGJvb2xlYW4gb25VcGRhdGVSb3V0ZVZvbHVtZShNZXNzZW5nZXIgbWVzc2VuZ2VyLCBpbnQgcmVxdWVzdElkLAotICAgICAgICAgICAgaW50IGNvbnRyb2xsZXJJZCwgaW50IGRlbHRhKSB7Ci0gICAgICAgIENsaWVudFJlY29yZCBjbGllbnQgPSBnZXRDbGllbnQobWVzc2VuZ2VyKTsKLSAgICAgICAgaWYgKGNsaWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlUHJvdmlkZXIuUm91dGVDb250cm9sbGVyIGNvbnRyb2xsZXIgPQotICAgICAgICAgICAgICAgICAgICBjbGllbnQuZ2V0Um91dGVDb250cm9sbGVyKGNvbnRyb2xsZXJJZCk7Ci0gICAgICAgICAgICBpZiAoY29udHJvbGxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY29udHJvbGxlci5vblVwZGF0ZVZvbHVtZShkZWx0YSk7Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgY2xpZW50ICsgIjogUm91dGUgdm9sdW1lIHVwZGF0ZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBjb250cm9sbGVySWQ9IiArIGNvbnRyb2xsZXJJZCArICIsIGRlbHRhPSIgKyBkZWx0YSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNlbmRHZW5lcmljU3VjY2VzcyhtZXNzZW5nZXIsIHJlcXVlc3RJZCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGJvb2xlYW4gb25Sb3V0ZUNvbnRyb2xSZXF1ZXN0KGZpbmFsIE1lc3NlbmdlciBtZXNzZW5nZXIsIGZpbmFsIGludCByZXF1ZXN0SWQsCi0gICAgICAgICAgICBmaW5hbCBpbnQgY29udHJvbGxlcklkLCBmaW5hbCBJbnRlbnQgaW50ZW50KSB7Ci0gICAgICAgIGZpbmFsIENsaWVudFJlY29yZCBjbGllbnQgPSBnZXRDbGllbnQobWVzc2VuZ2VyKTsKLSAgICAgICAgaWYgKGNsaWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlUHJvdmlkZXIuUm91dGVDb250cm9sbGVyIGNvbnRyb2xsZXIgPQotICAgICAgICAgICAgICAgICAgICBjbGllbnQuZ2V0Um91dGVDb250cm9sbGVyKGNvbnRyb2xsZXJJZCk7Ci0gICAgICAgICAgICBpZiAoY29udHJvbGxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXIuQ29udHJvbFJlcXVlc3RDYWxsYmFjayBjYWxsYmFjayA9IG51bGw7Ci0gICAgICAgICAgICAgICAgaWYgKHJlcXVlc3RJZCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gbmV3IE1lZGlhUm91dGVyLkNvbnRyb2xSZXF1ZXN0Q2FsbGJhY2soKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVzdWx0KEJ1bmRsZSBkYXRhKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgY2xpZW50ICsgIjogUm91dGUgY29udHJvbCByZXF1ZXN0IHN1Y2NlZWRlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIGNvbnRyb2xsZXJJZD0iICsgY29udHJvbGxlcklkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBpbnRlbnQ9IiArIGludGVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgZGF0YT0iICsgZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaW5kQ2xpZW50KG1lc3NlbmdlcikgPj0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kUmVwbHkobWVzc2VuZ2VyLCBTRVJWSUNFX01TR19DT05UUk9MX1JFUVVFU1RfU1VDQ0VFREVELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RJZCwgMCwgZGF0YSwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uRXJyb3IoU3RyaW5nIGVycm9yLCBCdW5kbGUgZGF0YSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsIGNsaWVudCArICI6IFJvdXRlIGNvbnRyb2wgcmVxdWVzdCBmYWlsZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBjb250cm9sbGVySWQ9IiArIGNvbnRyb2xsZXJJZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgaW50ZW50PSIgKyBpbnRlbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIGVycm9yPSIgKyBlcnJvciArICIsIGRhdGE9IiArIGRhdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmluZENsaWVudChtZXNzZW5nZXIpID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1bmRsZSBidW5kbGUgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidW5kbGUucHV0U3RyaW5nKFNFUlZJQ0VfREFUQV9FUlJPUiwgZXJyb3IpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZFJlcGx5KG1lc3NlbmdlciwgU0VSVklDRV9NU0dfQ09OVFJPTF9SRVFVRVNUX0ZBSUxFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkLCAwLCBkYXRhLCBidW5kbGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZFJlcGx5KG1lc3NlbmdlciwgU0VSVklDRV9NU0dfQ09OVFJPTF9SRVFVRVNUX0ZBSUxFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkLCAwLCBkYXRhLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGNvbnRyb2xsZXIub25Db250cm9sUmVxdWVzdChpbnRlbnQsIGNhbGxiYWNrKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgY2xpZW50ICsgIjogUm91dGUgY29udHJvbCByZXF1ZXN0IGRlbGl2ZXJlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBjb250cm9sbGVySWQ9IiArIGNvbnRyb2xsZXJJZCArICIsIGludGVudD0iICsgaW50ZW50KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGJvb2xlYW4gb25TZXREaXNjb3ZlcnlSZXF1ZXN0KE1lc3NlbmdlciBtZXNzZW5nZXIsIGludCByZXF1ZXN0SWQsCi0gICAgICAgICAgICBNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdCByZXF1ZXN0KSB7Ci0gICAgICAgIENsaWVudFJlY29yZCBjbGllbnQgPSBnZXRDbGllbnQobWVzc2VuZ2VyKTsKLSAgICAgICAgaWYgKGNsaWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBib29sZWFuIGFjdHVhbGx5Q2hhbmdlZCA9IGNsaWVudC5zZXREaXNjb3ZlcnlSZXF1ZXN0KHJlcXVlc3QpOwotICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCBjbGllbnQgKyAiOiBTZXQgZGlzY292ZXJ5IHJlcXVlc3QsIHJlcXVlc3Q9IiArIHJlcXVlc3QKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgYWN0dWFsbHlDaGFuZ2VkPSIgKyBhY3R1YWxseUNoYW5nZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgY29tcG9zaXRlRGlzY292ZXJ5UmVxdWVzdD0iICsgbUNvbXBvc2l0ZURpc2NvdmVyeVJlcXVlc3QpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2VuZEdlbmVyaWNTdWNjZXNzKG1lc3NlbmdlciwgcmVxdWVzdElkKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICB2b2lkIHNlbmREZXNjcmlwdG9yQ2hhbmdlZChNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLSAgICAgICAgZmluYWwgaW50IGNvdW50ID0gbUNsaWVudHMuc2l6ZSgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgIENsaWVudFJlY29yZCBjbGllbnQgPSBtQ2xpZW50cy5nZXQoaSk7Ci0gICAgICAgICAgICBzZW5kUmVwbHkoY2xpZW50Lm1NZXNzZW5nZXIsIFNFUlZJQ0VfTVNHX0RFU0NSSVBUT1JfQ0hBTkdFRCwgMCwgMCwKLSAgICAgICAgICAgICAgICAgICAgY3JlYXRlRGVzY3JpcHRvckJ1bmRsZUZvckNsaWVudFZlcnNpb24oZGVzY3JpcHRvciwgY2xpZW50Lm1WZXJzaW9uKSwgbnVsbCk7Ci0gICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsIGNsaWVudCArICI6IFNlbnQgZGVzY3JpcHRvciBjaGFuZ2UgZXZlbnQsIGRlc2NyaXB0b3I9IiArIGRlc2NyaXB0b3IpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgQFZpc2libGVGb3JUZXN0aW5nCi0gICAgc3RhdGljIEJ1bmRsZSBjcmVhdGVEZXNjcmlwdG9yQnVuZGxlRm9yQ2xpZW50VmVyc2lvbihNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yIGRlc2NyaXB0b3IsCi0gICAgICAgICAgICBpbnQgY2xpZW50VmVyc2lvbikgewotICAgICAgICBpZiAoZGVzY3JpcHRvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yLkJ1aWxkZXIgYnVpbGRlciA9Ci0gICAgICAgICAgICAgICAgbmV3IE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IuQnVpbGRlcihkZXNjcmlwdG9yKTsKLSAgICAgICAgYnVpbGRlci5zZXRSb3V0ZXMobnVsbCk7Ci0gICAgICAgIGZvciAoTWVkaWFSb3V0ZURlc2NyaXB0b3Igcm91dGUgOiBkZXNjcmlwdG9yLmdldFJvdXRlcygpKSB7Ci0gICAgICAgICAgICBpZiAoY2xpZW50VmVyc2lvbiA+PSByb3V0ZS5nZXRNaW5DbGllbnRWZXJzaW9uKCkKLSAgICAgICAgICAgICAgICAgICAgJiYgY2xpZW50VmVyc2lvbiA8PSByb3V0ZS5nZXRNYXhDbGllbnRWZXJzaW9uKCkpIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyLmFkZFJvdXRlKHJvdXRlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYnVpbGRlci5idWlsZCgpLmFzQnVuZGxlKCk7Ci0gICAgfQotCi0gICAgYm9vbGVhbiB1cGRhdGVDb21wb3NpdGVEaXNjb3ZlcnlSZXF1ZXN0KCkgewotICAgICAgICBNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdCBjb21wb3NpdGUgPSBudWxsOwotICAgICAgICBNZWRpYVJvdXRlU2VsZWN0b3IuQnVpbGRlciBzZWxlY3RvckJ1aWxkZXIgPSBudWxsOwotICAgICAgICBib29sZWFuIGFjdGl2ZVNjYW4gPSBmYWxzZTsKLSAgICAgICAgZmluYWwgaW50IGNvdW50ID0gbUNsaWVudHMuc2l6ZSgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgIE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0IHJlcXVlc3QgPSBtQ2xpZW50cy5nZXQoaSkubURpc2NvdmVyeVJlcXVlc3Q7Ci0gICAgICAgICAgICBpZiAocmVxdWVzdCAhPSBudWxsCi0gICAgICAgICAgICAgICAgICAgICYmICghcmVxdWVzdC5nZXRTZWxlY3RvcigpLmlzRW1wdHkoKSB8fCByZXF1ZXN0LmlzQWN0aXZlU2NhbigpKSkgewotICAgICAgICAgICAgICAgIGFjdGl2ZVNjYW4gfD0gcmVxdWVzdC5pc0FjdGl2ZVNjYW4oKTsKLSAgICAgICAgICAgICAgICBpZiAoY29tcG9zaXRlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY29tcG9zaXRlID0gcmVxdWVzdDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0b3JCdWlsZGVyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yQnVpbGRlciA9IG5ldyBNZWRpYVJvdXRlU2VsZWN0b3IuQnVpbGRlcihjb21wb3NpdGUuZ2V0U2VsZWN0b3IoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3JCdWlsZGVyLmFkZFNlbGVjdG9yKHJlcXVlc3QuZ2V0U2VsZWN0b3IoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChzZWxlY3RvckJ1aWxkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgY29tcG9zaXRlID0gbmV3IE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0KHNlbGVjdG9yQnVpbGRlci5idWlsZCgpLCBhY3RpdmVTY2FuKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIU9iamVjdHNDb21wYXQuZXF1YWxzKG1Db21wb3NpdGVEaXNjb3ZlcnlSZXF1ZXN0LCBjb21wb3NpdGUpKSB7Ci0gICAgICAgICAgICBtQ29tcG9zaXRlRGlzY292ZXJ5UmVxdWVzdCA9IGNvbXBvc2l0ZTsKLSAgICAgICAgICAgIG1Qcm92aWRlci5zZXREaXNjb3ZlcnlSZXF1ZXN0KGNvbXBvc2l0ZSk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBDbGllbnRSZWNvcmQgZ2V0Q2xpZW50KE1lc3NlbmdlciBtZXNzZW5nZXIpIHsKLSAgICAgICAgaW50IGluZGV4ID0gZmluZENsaWVudChtZXNzZW5nZXIpOwotICAgICAgICByZXR1cm4gaW5kZXggPj0gMCA/IG1DbGllbnRzLmdldChpbmRleCkgOiBudWxsOwotICAgIH0KLQotICAgIGludCBmaW5kQ2xpZW50KE1lc3NlbmdlciBtZXNzZW5nZXIpIHsKLSAgICAgICAgZmluYWwgaW50IGNvdW50ID0gbUNsaWVudHMuc2l6ZSgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgIENsaWVudFJlY29yZCBjbGllbnQgPSBtQ2xpZW50cy5nZXQoaSk7Ci0gICAgICAgICAgICBpZiAoY2xpZW50Lmhhc01lc3NlbmdlcihtZXNzZW5nZXIpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIHN0YXRpYyB2b2lkIHNlbmRHZW5lcmljRmFpbHVyZShNZXNzZW5nZXIgbWVzc2VuZ2VyLCBpbnQgcmVxdWVzdElkKSB7Ci0gICAgICAgIGlmIChyZXF1ZXN0SWQgIT0gMCkgewotICAgICAgICAgICAgc2VuZFJlcGx5KG1lc3NlbmdlciwgU0VSVklDRV9NU0dfR0VORVJJQ19GQUlMVVJFLCByZXF1ZXN0SWQsIDAsIG51bGwsIG51bGwpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZW5kR2VuZXJpY1N1Y2Nlc3MoTWVzc2VuZ2VyIG1lc3NlbmdlciwgaW50IHJlcXVlc3RJZCkgewotICAgICAgICBpZiAocmVxdWVzdElkICE9IDApIHsKLSAgICAgICAgICAgIHNlbmRSZXBseShtZXNzZW5nZXIsIFNFUlZJQ0VfTVNHX0dFTkVSSUNfU1VDQ0VTUywgcmVxdWVzdElkLCAwLCBudWxsLCBudWxsKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0YXRpYyB2b2lkIHNlbmRSZXBseShNZXNzZW5nZXIgbWVzc2VuZ2VyLCBpbnQgd2hhdCwKLSAgICAgICAgICAgIGludCByZXF1ZXN0SWQsIGludCBhcmcsIE9iamVjdCBvYmosIEJ1bmRsZSBkYXRhKSB7Ci0gICAgICAgIE1lc3NhZ2UgbXNnID0gTWVzc2FnZS5vYnRhaW4oKTsKLSAgICAgICAgbXNnLndoYXQgPSB3aGF0OwotICAgICAgICBtc2cuYXJnMSA9IHJlcXVlc3RJZDsKLSAgICAgICAgbXNnLmFyZzIgPSBhcmc7Ci0gICAgICAgIG1zZy5vYmogPSBvYmo7Ci0gICAgICAgIG1zZy5zZXREYXRhKGRhdGEpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbWVzc2VuZ2VyLnNlbmQobXNnKTsKLSAgICAgICAgfSBjYXRjaCAoRGVhZE9iamVjdEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgLy8gVGhlIGNsaWVudCBkaWVkLgotICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgIkNvdWxkIG5vdCBzZW5kIG1lc3NhZ2UgdG8gIiArIGdldENsaWVudElkKG1lc3NlbmdlciksIGV4KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0YXRpYyBTdHJpbmcgZ2V0Q2xpZW50SWQoTWVzc2VuZ2VyIG1lc3NlbmdlcikgewotICAgICAgICByZXR1cm4gIkNsaWVudCBjb25uZWN0aW9uICIgKyBtZXNzZW5nZXIuZ2V0QmluZGVyKCkudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIGNsYXNzIFByaXZhdGVIYW5kbGVyIGV4dGVuZHMgSGFuZGxlciB7Ci0gICAgICAgIFByaXZhdGVIYW5kbGVyKCkgewotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKLSAgICAgICAgICAgIHN3aXRjaCAobXNnLndoYXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIFBSSVZBVEVfTVNHX0NMSUVOVF9ESUVEOgotICAgICAgICAgICAgICAgICAgICBvbkJpbmRlckRpZWQoKE1lc3Nlbmdlciltc2cub2JqKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIGNsYXNzIFByb3ZpZGVyQ2FsbGJhY2sgZXh0ZW5kcyBNZWRpYVJvdXRlUHJvdmlkZXIuQ2FsbGJhY2sgewotICAgICAgICBQcm92aWRlckNhbGxiYWNrKCkgewotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uRGVzY3JpcHRvckNoYW5nZWQoTWVkaWFSb3V0ZVByb3ZpZGVyIHByb3ZpZGVyLAotICAgICAgICAgICAgICAgIE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotICAgICAgICAgICAgc2VuZERlc2NyaXB0b3JDaGFuZ2VkKGRlc2NyaXB0b3IpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBDbGllbnRSZWNvcmQgaW1wbGVtZW50cyBEZWF0aFJlY2lwaWVudCB7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBNZXNzZW5nZXIgbU1lc3NlbmdlcjsKLSAgICAgICAgcHVibGljIGZpbmFsIGludCBtVmVyc2lvbjsKLSAgICAgICAgcHVibGljIE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0IG1EaXNjb3ZlcnlSZXF1ZXN0OwotCi0gICAgICAgIHByaXZhdGUgZmluYWwgU3BhcnNlQXJyYXk8TWVkaWFSb3V0ZVByb3ZpZGVyLlJvdXRlQ29udHJvbGxlcj4gbUNvbnRyb2xsZXJzID0KLSAgICAgICAgICAgICAgICBuZXcgU3BhcnNlQXJyYXk8TWVkaWFSb3V0ZVByb3ZpZGVyLlJvdXRlQ29udHJvbGxlcj4oKTsKLQotICAgICAgICBwdWJsaWMgQ2xpZW50UmVjb3JkKE1lc3NlbmdlciBtZXNzZW5nZXIsIGludCB2ZXJzaW9uKSB7Ci0gICAgICAgICAgICBtTWVzc2VuZ2VyID0gbWVzc2VuZ2VyOwotICAgICAgICAgICAgbVZlcnNpb24gPSB2ZXJzaW9uOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gcmVnaXN0ZXIoKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG1NZXNzZW5nZXIuZ2V0QmluZGVyKCkubGlua1RvRGVhdGgodGhpcywgMCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICBiaW5kZXJEaWVkKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgICAgICAgICAgaW50IGNvdW50ID0gbUNvbnRyb2xsZXJzLnNpemUoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgIG1Db250cm9sbGVycy52YWx1ZUF0KGkpLm9uUmVsZWFzZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUNvbnRyb2xsZXJzLmNsZWFyKCk7Ci0KLSAgICAgICAgICAgIG1NZXNzZW5nZXIuZ2V0QmluZGVyKCkudW5saW5rVG9EZWF0aCh0aGlzLCAwKTsKLQotICAgICAgICAgICAgc2V0RGlzY292ZXJ5UmVxdWVzdChudWxsKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGhhc01lc3NlbmdlcihNZXNzZW5nZXIgb3RoZXIpIHsKLSAgICAgICAgICAgIHJldHVybiBtTWVzc2VuZ2VyLmdldEJpbmRlcigpID09IG90aGVyLmdldEJpbmRlcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gY3JlYXRlUm91dGVDb250cm9sbGVyKFN0cmluZyByb3V0ZUlkLCBTdHJpbmcgcm91dGVHcm91cElkLAotICAgICAgICAgICAgICAgIGludCBjb250cm9sbGVySWQpIHsKLSAgICAgICAgICAgIGlmIChtQ29udHJvbGxlcnMuaW5kZXhPZktleShjb250cm9sbGVySWQpIDwgMCkgewotICAgICAgICAgICAgICAgIE1lZGlhUm91dGVQcm92aWRlci5Sb3V0ZUNvbnRyb2xsZXIgY29udHJvbGxlciA9IHJvdXRlR3JvdXBJZCA9PSBudWxsCi0gICAgICAgICAgICAgICAgICAgICAgICA/IG1Qcm92aWRlci5vbkNyZWF0ZVJvdXRlQ29udHJvbGxlcihyb3V0ZUlkKQotICAgICAgICAgICAgICAgICAgICAgICAgOiBtUHJvdmlkZXIub25DcmVhdGVSb3V0ZUNvbnRyb2xsZXIocm91dGVJZCwgcm91dGVHcm91cElkKTsKLSAgICAgICAgICAgICAgICBpZiAoY29udHJvbGxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Db250cm9sbGVycy5wdXQoY29udHJvbGxlcklkLCBjb250cm9sbGVyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gcmVsZWFzZVJvdXRlQ29udHJvbGxlcihpbnQgY29udHJvbGxlcklkKSB7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlUHJvdmlkZXIuUm91dGVDb250cm9sbGVyIGNvbnRyb2xsZXIgPSBtQ29udHJvbGxlcnMuZ2V0KGNvbnRyb2xsZXJJZCk7Ci0gICAgICAgICAgICBpZiAoY29udHJvbGxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUNvbnRyb2xsZXJzLnJlbW92ZShjb250cm9sbGVySWQpOwotICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIub25SZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgTWVkaWFSb3V0ZVByb3ZpZGVyLlJvdXRlQ29udHJvbGxlciBnZXRSb3V0ZUNvbnRyb2xsZXIoaW50IGNvbnRyb2xsZXJJZCkgewotICAgICAgICAgICAgcmV0dXJuIG1Db250cm9sbGVycy5nZXQoY29udHJvbGxlcklkKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIHNldERpc2NvdmVyeVJlcXVlc3QoTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3QgcmVxdWVzdCkgewotICAgICAgICAgICAgaWYgKCFPYmplY3RzQ29tcGF0LmVxdWFscyhtRGlzY292ZXJ5UmVxdWVzdCwgcmVxdWVzdCkpIHsKLSAgICAgICAgICAgICAgICBtRGlzY292ZXJ5UmVxdWVzdCA9IHJlcXVlc3Q7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHVwZGF0ZUNvbXBvc2l0ZURpc2NvdmVyeVJlcXVlc3QoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFJ1bnMgb24gYSBiaW5kZXIgdGhyZWFkLgotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgYmluZGVyRGllZCgpIHsKLSAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5vYnRhaW5NZXNzYWdlKFBSSVZBVEVfTVNHX0NMSUVOVF9ESUVELCBtTWVzc2VuZ2VyKS5zZW5kVG9UYXJnZXQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAgICAgcmV0dXJuIGdldENsaWVudElkKG1NZXNzZW5nZXIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSGFuZGxlciB0aGF0IHJlY2VpdmVzIG1lc3NhZ2VzIGZyb20gY2xpZW50cy4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGlubmVyIGNsYXNzIGlzIHN0YXRpYyBhbmQgb25seSByZXRhaW5zIGEgd2VhayByZWZlcmVuY2UgdG8gdGhlIHNlcnZpY2UKLSAgICAgKiB0byBwcmV2ZW50IHRoZSBzZXJ2aWNlIGZyb20gYmVpbmcgbGVha2VkIGluIGNhc2Ugb25lIG9mIHRoZSBjbGllbnRzIGlzIGhvbGRpbmcgYW4KLSAgICAgKiBhY3RpdmUgcmVmZXJlbmNlIHRvIHRoZSBzZXJ2ZXIncyBtZXNzZW5nZXIuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoaXMgaGFuZGxlciBzaG91bGQgbm90IGJlIHVzZWQgdG8gaGFuZGxlIGFueSBtZXNzYWdlcyBvdGhlciB0aGFuIHRob3NlCi0gICAgICogdGhhdCBjb21lIGZyb20gdGhlIGNsaWVudC4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgUmVjZWl2ZUhhbmRsZXIgZXh0ZW5kcyBIYW5kbGVyIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBXZWFrUmVmZXJlbmNlPE1lZGlhUm91dGVQcm92aWRlclNlcnZpY2U+IG1TZXJ2aWNlUmVmOwotCi0gICAgICAgIHB1YmxpYyBSZWNlaXZlSGFuZGxlcihNZWRpYVJvdXRlUHJvdmlkZXJTZXJ2aWNlIHNlcnZpY2UpIHsKLSAgICAgICAgICAgIG1TZXJ2aWNlUmVmID0gbmV3IFdlYWtSZWZlcmVuY2U8TWVkaWFSb3V0ZVByb3ZpZGVyU2VydmljZT4oc2VydmljZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1zZykgewotICAgICAgICAgICAgZmluYWwgTWVzc2VuZ2VyIG1lc3NlbmdlciA9IG1zZy5yZXBseVRvOwotICAgICAgICAgICAgaWYgKGlzVmFsaWRSZW1vdGVNZXNzZW5nZXIobWVzc2VuZ2VyKSkgewotICAgICAgICAgICAgICAgIGZpbmFsIGludCB3aGF0ID0gbXNnLndoYXQ7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IHJlcXVlc3RJZCA9IG1zZy5hcmcxOwotICAgICAgICAgICAgICAgIGZpbmFsIGludCBhcmcgPSBtc2cuYXJnMjsKLSAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3Qgb2JqID0gbXNnLm9iajsKLSAgICAgICAgICAgICAgICBmaW5hbCBCdW5kbGUgZGF0YSA9IG1zZy5wZWVrRGF0YSgpOwotICAgICAgICAgICAgICAgIGlmICghcHJvY2Vzc01lc3NhZ2Uod2hhdCwgbWVzc2VuZ2VyLCByZXF1ZXN0SWQsIGFyZywgb2JqLCBkYXRhKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgZ2V0Q2xpZW50SWQobWVzc2VuZ2VyKSArICI6IE1lc3NhZ2UgZmFpbGVkLCB3aGF0PSIgKyB3aGF0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgcmVxdWVzdElkPSIgKyByZXF1ZXN0SWQgKyAiLCBhcmc9IiArIGFyZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIG9iaj0iICsgb2JqICsgIiwgZGF0YT0iICsgZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc2VuZEdlbmVyaWNGYWlsdXJlKG1lc3NlbmdlciwgcmVxdWVzdElkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJJZ25vcmluZyBtZXNzYWdlIHdpdGhvdXQgdmFsaWQgcmVwbHkgbWVzc2VuZ2VyLiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShpbnQgd2hhdCwKLSAgICAgICAgICAgICAgICBNZXNzZW5nZXIgbWVzc2VuZ2VyLCBpbnQgcmVxdWVzdElkLCBpbnQgYXJnLCBPYmplY3Qgb2JqLCBCdW5kbGUgZGF0YSkgewotICAgICAgICAgICAgTWVkaWFSb3V0ZVByb3ZpZGVyU2VydmljZSBzZXJ2aWNlID0gbVNlcnZpY2VSZWYuZ2V0KCk7Ci0gICAgICAgICAgICBpZiAoc2VydmljZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc3dpdGNoICh3aGF0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQ0xJRU5UX01TR19SRUdJU1RFUjoKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZXJ2aWNlLm9uUmVnaXN0ZXJDbGllbnQobWVzc2VuZ2VyLCByZXF1ZXN0SWQsIGFyZyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBDTElFTlRfTVNHX1VOUkVHSVNURVI6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VydmljZS5vblVucmVnaXN0ZXJDbGllbnQobWVzc2VuZ2VyLCByZXF1ZXN0SWQpOwotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgQ0xJRU5UX01TR19DUkVBVEVfUk9VVEVfQ09OVFJPTExFUjogewotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJvdXRlSWQgPSBkYXRhLmdldFN0cmluZyhDTElFTlRfREFUQV9ST1VURV9JRCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcm91dGVHcm91cElkID0gZGF0YS5nZXRTdHJpbmcoQ0xJRU5UX0RBVEFfUk9VVEVfTElCUkFSWV9HUk9VUCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocm91dGVJZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2Uub25DcmVhdGVSb3V0ZUNvbnRyb2xsZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzZW5nZXIsIHJlcXVlc3RJZCwgYXJnLCByb3V0ZUlkLCByb3V0ZUdyb3VwSWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBjYXNlIENMSUVOVF9NU0dfUkVMRUFTRV9ST1VURV9DT05UUk9MTEVSOgotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2Uub25SZWxlYXNlUm91dGVDb250cm9sbGVyKG1lc3NlbmdlciwgcmVxdWVzdElkLCBhcmcpOwotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgQ0xJRU5UX01TR19TRUxFQ1RfUk9VVEU6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VydmljZS5vblNlbGVjdFJvdXRlKG1lc3NlbmdlciwgcmVxdWVzdElkLCBhcmcpOwotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgQ0xJRU5UX01TR19VTlNFTEVDVF9ST1VURToKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCByZWFzb24gPSBkYXRhID09IG51bGwgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlci5VTlNFTEVDVF9SRUFTT05fVU5LTk9XTgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGRhdGEuZ2V0SW50KENMSUVOVF9EQVRBX1VOU0VMRUNUX1JFQVNPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlci5VTlNFTEVDVF9SRUFTT05fVU5LTk9XTik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VydmljZS5vblVuc2VsZWN0Um91dGUobWVzc2VuZ2VyLCByZXF1ZXN0SWQsIGFyZywgcmVhc29uKTsKLQotICAgICAgICAgICAgICAgICAgICBjYXNlIENMSUVOVF9NU0dfU0VUX1JPVVRFX1ZPTFVNRTogewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHZvbHVtZSA9IGRhdGEuZ2V0SW50KENMSUVOVF9EQVRBX1ZPTFVNRSwgLTEpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZvbHVtZSA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2Uub25TZXRSb3V0ZVZvbHVtZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NlbmdlciwgcmVxdWVzdElkLCBhcmcsIHZvbHVtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgQ0xJRU5UX01TR19VUERBVEVfUk9VVEVfVk9MVU1FOiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsdGEgPSBkYXRhLmdldEludChDTElFTlRfREFUQV9WT0xVTUUsIDApOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlbHRhICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VydmljZS5vblVwZGF0ZVJvdXRlVm9sdW1lKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2VuZ2VyLCByZXF1ZXN0SWQsIGFyZywgZGVsdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBjYXNlIENMSUVOVF9NU0dfUk9VVEVfQ09OVFJPTF9SRVFVRVNUOgotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIEludGVudCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZXJ2aWNlLm9uUm91dGVDb250cm9sUmVxdWVzdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NlbmdlciwgcmVxdWVzdElkLCBhcmcsIChJbnRlbnQpb2JqKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgQ0xJRU5UX01TR19TRVRfRElTQ09WRVJZX1JFUVVFU1Q6IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvYmogPT0gbnVsbCB8fCBvYmogaW5zdGFuY2VvZiBCdW5kbGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdCByZXF1ZXN0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0LmZyb21CdW5kbGUoKEJ1bmRsZSlvYmopOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZXJ2aWNlLm9uU2V0RGlzY292ZXJ5UmVxdWVzdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NlbmdlciwgcmVxdWVzdElkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdCAhPSBudWxsICYmIHJlcXVlc3QuaXNWYWxpZCgpID8gcmVxdWVzdCA6IG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhUm91dGVTZWxlY3Rvci5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhUm91dGVTZWxlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjY5YjE5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYVJvdXRlU2VsZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlcjsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5Ob25OdWxsOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLk51bGxhYmxlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBEZXNjcmliZXMgdGhlIGNhcGFiaWxpdGllcyBvZiByb3V0ZXMgdGhhdCBhcHBsaWNhdGlvbnMgd291bGQgbGlrZSB0byBkaXNjb3ZlciBhbmQgdXNlLgotICogPHA+Ci0gKiBUaGlzIG9iamVjdCBpcyBpbW11dGFibGUgb25jZSBjcmVhdGVkIHVzaW5nIGEge0BsaW5rIEJ1aWxkZXJ9IGluc3RhbmNlLgotICogPC9wPgotICoKLSAqIDxoMz5FeGFtcGxlPC9oMz4KLSAqIDxwcmU+Ci0gKiBNZWRpYVJvdXRlU2VsZWN0b3Igc2VsZWN0b3JCdWlsZGVyID0gbmV3IE1lZGlhUm91dGVTZWxlY3Rvci5CdWlsZGVyKCkKLSAqICAgICAgICAgLmFkZENvbnRyb2xDYXRlZ29yeShNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfTElWRV9WSURFTykKLSAqICAgICAgICAgLmFkZENvbnRyb2xDYXRlZ29yeShNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLKQotICogICAgICAgICAuYnVpbGQoKTsKLSAqCi0gKiBNZWRpYVJvdXRlciByb3V0ZXIgPSBNZWRpYVJvdXRlci5nZXRJbnN0YW5jZShjb250ZXh0KTsKLSAqIHJvdXRlci5hZGRDYWxsYmFjayhzZWxlY3RvciwgY2FsbGJhY2ssIE1lZGlhUm91dGVyLkNBTExCQUNLX0ZMQUdfUkVRVUVTVF9ESVNDT1ZFUlkpOwotICogPC9wcmU+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBNZWRpYVJvdXRlU2VsZWN0b3IgewotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0NPTlRST0xfQ0FURUdPUklFUyA9ICJjb250cm9sQ2F0ZWdvcmllcyI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIEJ1bmRsZSBtQnVuZGxlOwotICAgIExpc3Q8U3RyaW5nPiBtQ29udHJvbENhdGVnb3JpZXM7Ci0KLSAgICAvKioKLSAgICAgKiBBbiBlbXB0eSBtZWRpYSByb3V0ZSBzZWxlY3RvciB0aGF0IHdpbGwgbm90IG1hdGNoIGFueSByb3V0ZXMuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBNZWRpYVJvdXRlU2VsZWN0b3IgRU1QVFkgPSBuZXcgTWVkaWFSb3V0ZVNlbGVjdG9yKG5ldyBCdW5kbGUoKSwgbnVsbCk7Ci0KLSAgICBNZWRpYVJvdXRlU2VsZWN0b3IoQnVuZGxlIGJ1bmRsZSwgTGlzdDxTdHJpbmc+IGNvbnRyb2xDYXRlZ29yaWVzKSB7Ci0gICAgICAgIG1CdW5kbGUgPSBidW5kbGU7Ci0gICAgICAgIG1Db250cm9sQ2F0ZWdvcmllcyA9IGNvbnRyb2xDYXRlZ29yaWVzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGxpc3Qgb2Yge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBtZWRpYSBjb250cm9sIGNhdGVnb3JpZXN9IGluIHRoZSBzZWxlY3Rvci4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgY2F0ZWdvcmllcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IGdldENvbnRyb2xDYXRlZ29yaWVzKCkgewotICAgICAgICBlbnN1cmVDb250cm9sQ2F0ZWdvcmllcygpOwotICAgICAgICByZXR1cm4gbUNvbnRyb2xDYXRlZ29yaWVzOwotICAgIH0KLQotICAgIHZvaWQgZW5zdXJlQ29udHJvbENhdGVnb3JpZXMoKSB7Ci0gICAgICAgIGlmIChtQ29udHJvbENhdGVnb3JpZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgbUNvbnRyb2xDYXRlZ29yaWVzID0gbUJ1bmRsZS5nZXRTdHJpbmdBcnJheUxpc3QoS0VZX0NPTlRST0xfQ0FURUdPUklFUyk7Ci0gICAgICAgICAgICBpZiAobUNvbnRyb2xDYXRlZ29yaWVzID09IG51bGwgfHwgbUNvbnRyb2xDYXRlZ29yaWVzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIG1Db250cm9sQ2F0ZWdvcmllcyA9IENvbGxlY3Rpb25zLjxTdHJpbmc+ZW1wdHlMaXN0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNlbGVjdG9yIGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgY2F0ZWdvcnkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2F0ZWdvcnkgVGhlIGNhdGVnb3J5IHRvIGNoZWNrLgotICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgY2F0ZWdvcnkgaXMgcHJlc2VudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNDb250cm9sQ2F0ZWdvcnkoU3RyaW5nIGNhdGVnb3J5KSB7Ci0gICAgICAgIGlmIChjYXRlZ29yeSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBlbnN1cmVDb250cm9sQ2F0ZWdvcmllcygpOwotICAgICAgICAgICAgZmluYWwgaW50IGNhdGVnb3J5Q291bnQgPSBtQ29udHJvbENhdGVnb3JpZXMuc2l6ZSgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjYXRlZ29yeUNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAobUNvbnRyb2xDYXRlZ29yaWVzLmdldChpKS5lcXVhbHMoY2F0ZWdvcnkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzZWxlY3RvciBtYXRjaGVzIGF0IGxlYXN0IG9uZSBvZiB0aGUgc3BlY2lmaWVkIGNvbnRyb2wgZmlsdGVycy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBmaWx0ZXJzIFRoZSBsaXN0IG9mIGNvbnRyb2wgZmlsdGVycyB0byBjb25zaWRlci4KLSAgICAgKiBAcmV0dXJuIFRydWUgaWYgYSBtYXRjaCBpcyBmb3VuZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBtYXRjaGVzQ29udHJvbEZpbHRlcnMoTGlzdDxJbnRlbnRGaWx0ZXI+IGZpbHRlcnMpIHsKLSAgICAgICAgaWYgKGZpbHRlcnMgIT0gbnVsbCkgewotICAgICAgICAgICAgZW5zdXJlQ29udHJvbENhdGVnb3JpZXMoKTsKLSAgICAgICAgICAgIGZpbmFsIGludCBjYXRlZ29yeUNvdW50ID0gbUNvbnRyb2xDYXRlZ29yaWVzLnNpemUoKTsKLSAgICAgICAgICAgIGlmIChjYXRlZ29yeUNvdW50ICE9IDApIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgZmlsdGVyQ291bnQgPSBmaWx0ZXJzLnNpemUoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbHRlckNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgSW50ZW50RmlsdGVyIGZpbHRlciA9IGZpbHRlcnMuZ2V0KGkpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZmlsdGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgY2F0ZWdvcnlDb3VudDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbHRlci5oYXNDYXRlZ29yeShtQ29udHJvbENhdGVnb3JpZXMuZ2V0KGopKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHNlbGVjdG9yIGNvbnRhaW5zIGFsbCBvZiB0aGUgY2FwYWJpbGl0aWVzIGRlc2NyaWJlZAotICAgICAqIGJ5IHRoZSBzcGVjaWZpZWQgc2VsZWN0b3IuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2VsZWN0b3IgVGhlIHNlbGVjdG9yIHRvIGJlIGV4YW1pbmVkLgotICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGlzIHNlbGVjdG9yIGNvbnRhaW5zIGFsbCBvZiB0aGUgY2FwYWJpbGl0aWVzIGRlc2NyaWJlZAotICAgICAqIGJ5IHRoZSBzcGVjaWZpZWQgc2VsZWN0b3IuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gY29udGFpbnMoTWVkaWFSb3V0ZVNlbGVjdG9yIHNlbGVjdG9yKSB7Ci0gICAgICAgIGlmIChzZWxlY3RvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBlbnN1cmVDb250cm9sQ2F0ZWdvcmllcygpOwotICAgICAgICAgICAgc2VsZWN0b3IuZW5zdXJlQ29udHJvbENhdGVnb3JpZXMoKTsKLSAgICAgICAgICAgIHJldHVybiBtQ29udHJvbENhdGVnb3JpZXMuY29udGFpbnNBbGwoc2VsZWN0b3IubUNvbnRyb2xDYXRlZ29yaWVzKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzZWxlY3RvciBkb2VzIG5vdCBzcGVjaWZ5IGFueSBjYXBhYmlsaXRpZXMuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKLSAgICAgICAgZW5zdXJlQ29udHJvbENhdGVnb3JpZXMoKTsKLSAgICAgICAgcmV0dXJuIG1Db250cm9sQ2F0ZWdvcmllcy5pc0VtcHR5KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzZWxlY3RvciBoYXMgYWxsIG9mIHRoZSByZXF1aXJlZCBmaWVsZHMuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNWYWxpZCgpIHsKLSAgICAgICAgZW5zdXJlQ29udHJvbENhdGVnb3JpZXMoKTsKLSAgICAgICAgaWYgKG1Db250cm9sQ2F0ZWdvcmllcy5jb250YWlucyhudWxsKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotICAgICAgICBpZiAobyBpbnN0YW5jZW9mIE1lZGlhUm91dGVTZWxlY3RvcikgewotICAgICAgICAgICAgTWVkaWFSb3V0ZVNlbGVjdG9yIG90aGVyID0gKE1lZGlhUm91dGVTZWxlY3RvcilvOwotICAgICAgICAgICAgZW5zdXJlQ29udHJvbENhdGVnb3JpZXMoKTsKLSAgICAgICAgICAgIG90aGVyLmVuc3VyZUNvbnRyb2xDYXRlZ29yaWVzKCk7Ci0gICAgICAgICAgICByZXR1cm4gbUNvbnRyb2xDYXRlZ29yaWVzLmVxdWFscyhvdGhlci5tQ29udHJvbENhdGVnb3JpZXMpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgICBlbnN1cmVDb250cm9sQ2F0ZWdvcmllcygpOwotICAgICAgICByZXR1cm4gbUNvbnRyb2xDYXRlZ29yaWVzLmhhc2hDb2RlKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCJNZWRpYVJvdXRlU2VsZWN0b3J7ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCJjb250cm9sQ2F0ZWdvcmllcz0iKS5hcHBlbmQoCi0gICAgICAgICAgICAgICAgQXJyYXlzLnRvU3RyaW5nKGdldENvbnRyb2xDYXRlZ29yaWVzKCkudG9BcnJheSgpKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiB9Iik7Ci0gICAgICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0cyB0aGlzIG9iamVjdCB0byBhIGJ1bmRsZSBmb3Igc2VyaWFsaXphdGlvbi4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIGNvbnRlbnRzIG9mIHRoZSBvYmplY3QgcmVwcmVzZW50ZWQgYXMgYSBidW5kbGUuCi0gICAgICovCi0gICAgcHVibGljIEJ1bmRsZSBhc0J1bmRsZSgpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBmcm9tIGEgYnVuZGxlLgotICAgICAqCi0gICAgICogQHBhcmFtIGJ1bmRsZSBUaGUgYnVuZGxlLCBvciBudWxsIGlmIG5vbmUuCi0gICAgICogQHJldHVybiBUaGUgbmV3IGluc3RhbmNlLCBvciBudWxsIGlmIHRoZSBidW5kbGUgd2FzIG51bGwuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBNZWRpYVJvdXRlU2VsZWN0b3IgZnJvbUJ1bmRsZShATnVsbGFibGUgQnVuZGxlIGJ1bmRsZSkgewotICAgICAgICByZXR1cm4gYnVuZGxlICE9IG51bGwgPyBuZXcgTWVkaWFSb3V0ZVNlbGVjdG9yKGJ1bmRsZSwgbnVsbCkgOiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEJ1aWxkZXIgZm9yIHtAbGluayBNZWRpYVJvdXRlU2VsZWN0b3IgbWVkaWEgcm91dGUgc2VsZWN0b3JzfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEJ1aWxkZXIgewotICAgICAgICBwcml2YXRlIEFycmF5TGlzdDxTdHJpbmc+IG1Db250cm9sQ2F0ZWdvcmllczsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQ3JlYXRlcyBhbiBlbXB0eSBtZWRpYSByb3V0ZSBzZWxlY3RvciBidWlsZGVyLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIoKSB7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQ3JlYXRlcyBhIG1lZGlhIHJvdXRlIHNlbGVjdG9yIGRlc2NyaXB0b3IgYnVpbGRlciB3aG9zZSBpbml0aWFsIGNvbnRlbnRzIGFyZQotICAgICAgICAgKiBjb3BpZWQgZnJvbSBhbiBleGlzdGluZyBzZWxlY3Rvci4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyKEBOb25OdWxsIE1lZGlhUm91dGVTZWxlY3RvciBzZWxlY3RvcikgewotICAgICAgICAgICAgaWYgKHNlbGVjdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzZWxlY3RvciBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNlbGVjdG9yLmVuc3VyZUNvbnRyb2xDYXRlZ29yaWVzKCk7Ci0gICAgICAgICAgICBpZiAoIXNlbGVjdG9yLm1Db250cm9sQ2F0ZWdvcmllcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBtQ29udHJvbENhdGVnb3JpZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oc2VsZWN0b3IubUNvbnRyb2xDYXRlZ29yaWVzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBZGRzIGEge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBtZWRpYSBjb250cm9sIGNhdGVnb3J5fSB0byB0aGUgYnVpbGRlci4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGNhdGVnb3J5IFRoZSBjYXRlZ29yeSB0byBhZGQgdG8gdGhlIHNldCBvZiBkZXNpcmVkIGNhcGFiaWxpdGllcywgc3VjaCBhcwotICAgICAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0NBVEVHT1JZX0xJVkVfQVVESU99LgotICAgICAgICAgKiBAcmV0dXJuIFRoZSBidWlsZGVyIGluc3RhbmNlIGZvciBjaGFpbmluZy4KLSAgICAgICAgICovCi0gICAgICAgIEBOb25OdWxsCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIGFkZENvbnRyb2xDYXRlZ29yeShATm9uTnVsbCBTdHJpbmcgY2F0ZWdvcnkpIHsKLSAgICAgICAgICAgIGlmIChjYXRlZ29yeSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY2F0ZWdvcnkgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobUNvbnRyb2xDYXRlZ29yaWVzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtQ29udHJvbENhdGVnb3JpZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghbUNvbnRyb2xDYXRlZ29yaWVzLmNvbnRhaW5zKGNhdGVnb3J5KSkgewotICAgICAgICAgICAgICAgIG1Db250cm9sQ2F0ZWdvcmllcy5hZGQoY2F0ZWdvcnkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQWRkcyBhIGxpc3Qgb2Yge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBtZWRpYSBjb250cm9sIGNhdGVnb3JpZXN9IHRvIHRoZSBidWlsZGVyLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gY2F0ZWdvcmllcyBUaGUgbGlzdCBjYXRlZ29yaWVzIHRvIGFkZCB0byB0aGUgc2V0IG9mIGRlc2lyZWQgY2FwYWJpbGl0aWVzLAotICAgICAgICAgKiBzdWNoIGFzIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQ0FURUdPUllfTElWRV9BVURJT30uCi0gICAgICAgICAqIEByZXR1cm4gVGhlIGJ1aWxkZXIgaW5zdGFuY2UgZm9yIGNoYWluaW5nLgotICAgICAgICAgKi8KLSAgICAgICAgQE5vbk51bGwKLSAgICAgICAgcHVibGljIEJ1aWxkZXIgYWRkQ29udHJvbENhdGVnb3JpZXMoQE5vbk51bGwgQ29sbGVjdGlvbjxTdHJpbmc+IGNhdGVnb3JpZXMpIHsKLSAgICAgICAgICAgIGlmIChjYXRlZ29yaWVzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjYXRlZ29yaWVzIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCFjYXRlZ29yaWVzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIGNhdGVnb3J5IDogY2F0ZWdvcmllcykgewotICAgICAgICAgICAgICAgICAgICBhZGRDb250cm9sQ2F0ZWdvcnkoY2F0ZWdvcnkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFkZHMgdGhlIGNvbnRlbnRzIG9mIGFuIGV4aXN0aW5nIG1lZGlhIHJvdXRlIHNlbGVjdG9yIHRvIHRoZSBidWlsZGVyLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gc2VsZWN0b3IgVGhlIG1lZGlhIHJvdXRlIHNlbGVjdG9yIHdob3NlIGNvbnRlbnRzIGFyZSB0byBiZSBhZGRlZC4KLSAgICAgICAgICogQHJldHVybiBUaGUgYnVpbGRlciBpbnN0YW5jZSBmb3IgY2hhaW5pbmcuCi0gICAgICAgICAqLwotICAgICAgICBATm9uTnVsbAotICAgICAgICBwdWJsaWMgQnVpbGRlciBhZGRTZWxlY3RvcihATm9uTnVsbCBNZWRpYVJvdXRlU2VsZWN0b3Igc2VsZWN0b3IpIHsKLSAgICAgICAgICAgIGlmIChzZWxlY3RvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigic2VsZWN0b3IgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBhZGRDb250cm9sQ2F0ZWdvcmllcyhzZWxlY3Rvci5nZXRDb250cm9sQ2F0ZWdvcmllcygpKTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEJ1aWxkcyB0aGUge0BsaW5rIE1lZGlhUm91dGVTZWxlY3RvciBtZWRpYSByb3V0ZSBzZWxlY3Rvcn0uCi0gICAgICAgICAqLwotICAgICAgICBATm9uTnVsbAotICAgICAgICBwdWJsaWMgTWVkaWFSb3V0ZVNlbGVjdG9yIGJ1aWxkKCkgewotICAgICAgICAgICAgaWYgKG1Db250cm9sQ2F0ZWdvcmllcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVNUFRZOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQnVuZGxlIGJ1bmRsZSA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgICAgIGJ1bmRsZS5wdXRTdHJpbmdBcnJheUxpc3QoS0VZX0NPTlRST0xfQ0FURUdPUklFUywgbUNvbnRyb2xDYXRlZ29yaWVzKTsKLSAgICAgICAgICAgIHJldHVybiBuZXcgTWVkaWFSb3V0ZVNlbGVjdG9yKGJ1bmRsZSwgbUNvbnRyb2xDYXRlZ29yaWVzKTsKLSAgICAgICAgfQotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFSb3V0ZXIuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYVJvdXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjAwNTJlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYVJvdXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk5OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWE7Ci0KLWltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uSW50RGVmOwotaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5Ob25OdWxsOwotaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5OdWxsYWJsZTsKLWltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eU1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudFNlbmRlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXIuTmFtZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwotaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5Mb29wZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC5hcHAuQWN0aXZpdHlNYW5hZ2VyQ29tcGF0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC5oYXJkd2FyZS5kaXNwbGF5LkRpc3BsYXlNYW5hZ2VyQ29tcGF0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC5tZWRpYS5Wb2x1bWVQcm92aWRlckNvbXBhdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQubWVkaWEuc2Vzc2lvbi5NZWRpYVNlc3Npb25Db21wYXQ7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY0LnV0aWwuUGFpcjsKLWltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LkRpc3BsYXk7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlci5Qcm92aWRlck1ldGFkYXRhOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyLlJvdXRlQ29udHJvbGxlcjsKLQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiBNZWRpYVJvdXRlciBhbGxvd3MgYXBwbGljYXRpb25zIHRvIGNvbnRyb2wgdGhlIHJvdXRpbmcgb2YgbWVkaWEgY2hhbm5lbHMKLSAqIGFuZCBzdHJlYW1zIGZyb20gdGhlIGN1cnJlbnQgZGV2aWNlIHRvIGV4dGVybmFsIHNwZWFrZXJzIGFuZCBkZXN0aW5hdGlvbiBkZXZpY2VzLgotICogPHA+Ci0gKiBBIE1lZGlhUm91dGVyIGluc3RhbmNlIGlzIHJldHJpZXZlZCB0aHJvdWdoIHtAbGluayAjZ2V0SW5zdGFuY2V9LiAgQXBwbGljYXRpb25zCi0gKiBjYW4gcXVlcnkgdGhlIG1lZGlhIHJvdXRlciBhYm91dCB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHJvdXRlIGFuZCBpdHMgY2FwYWJpbGl0aWVzCi0gKiB0byBkZXRlcm1pbmUgaG93IHRvIHNlbmQgY29udGVudCB0byB0aGUgcm91dGUncyBkZXN0aW5hdGlvbi4gIEFwcGxpY2F0aW9ucyBjYW4KLSAqIGFsc28ge0BsaW5rIFJvdXRlSW5mbyNzZW5kQ29udHJvbFJlcXVlc3Qgc2VuZCBjb250cm9sIHJlcXVlc3RzfSB0byB0aGUgcm91dGUKLSAqIHRvIGFzayB0aGUgcm91dGUncyBkZXN0aW5hdGlvbiB0byBwZXJmb3JtIGNlcnRhaW4gcmVtb3RlIGNvbnRyb2wgZnVuY3Rpb25zCi0gKiBzdWNoIGFzIHBsYXlpbmcgbWVkaWEuCi0gKiA8L3A+PHA+Ci0gKiBTZWUgYWxzbyB7QGxpbmsgTWVkaWFSb3V0ZVByb3ZpZGVyfSBmb3IgaW5mb3JtYXRpb24gb24gaG93IGFuIGFwcGxpY2F0aW9uCi0gKiBjYW4gcHVibGlzaCBuZXcgbWVkaWEgcm91dGVzIHRvIHRoZSBtZWRpYSByb3V0ZXIuCi0gKiA8L3A+PHA+Ci0gKiBUaGUgbWVkaWEgcm91dGVyIEFQSSBpcyBub3QgdGhyZWFkLXNhZmU7IGFsbCBpbnRlcmFjdGlvbnMgd2l0aCBpdCBtdXN0IGJlCi0gKiBkb25lIGZyb20gdGhlIG1haW4gdGhyZWFkIG9mIHRoZSBwcm9jZXNzLgotICogPC9wPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTWVkaWFSb3V0ZXIgewotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk1lZGlhUm91dGVyIjsKLSAgICBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKTsKLQotICAgIC8qKgotICAgICAqIFBhc3NlZCB0byB7QGxpbmsgYW5kcm9pZC5zdXBwb3J0LnY3Lm1lZGlhLk1lZGlhUm91dGVQcm92aWRlci5Sb3V0ZUNvbnRyb2xsZXIjb25VbnNlbGVjdChpbnQpfQotICAgICAqIGFuZCB7QGxpbmsgQ2FsbGJhY2sjb25Sb3V0ZVVuc2VsZWN0ZWQoTWVkaWFSb3V0ZXIsIFJvdXRlSW5mbywgaW50KX0gd2hlbiB0aGUgcmVhc29uIHRoZSByb3V0ZQotICAgICAqIHdhcyB1bnNlbGVjdGVkIGlzIHVua25vd24uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5TRUxFQ1RfUkVBU09OX1VOS05PV04gPSAwOwotICAgIC8qKgotICAgICAqIFBhc3NlZCB0byB7QGxpbmsgYW5kcm9pZC5zdXBwb3J0LnY3Lm1lZGlhLk1lZGlhUm91dGVQcm92aWRlci5Sb3V0ZUNvbnRyb2xsZXIjb25VbnNlbGVjdChpbnQpfQotICAgICAqIGFuZCB7QGxpbmsgQ2FsbGJhY2sjb25Sb3V0ZVVuc2VsZWN0ZWQoTWVkaWFSb3V0ZXIsIFJvdXRlSW5mbywgaW50KX0gd2hlbiB0aGUgdXNlciBwcmVzc2VkCi0gICAgICogdGhlIGRpc2Nvbm5lY3QgYnV0dG9uIHRvIGRpc2Nvbm5lY3QgYW5kIGtlZXAgcGxheWluZy4KLSAgICAgKiA8cD4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFSb3V0ZURlc2NyaXB0b3IjY2FuRGlzY29ubmVjdEFuZEtlZXBQbGF5aW5nKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTlNFTEVDVF9SRUFTT05fRElTQ09OTkVDVEVEID0gMTsKLSAgICAvKioKLSAgICAgKiBQYXNzZWQgdG8ge0BsaW5rIGFuZHJvaWQuc3VwcG9ydC52Ny5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXIuUm91dGVDb250cm9sbGVyI29uVW5zZWxlY3QoaW50KX0KLSAgICAgKiBhbmQge0BsaW5rIENhbGxiYWNrI29uUm91dGVVbnNlbGVjdGVkKE1lZGlhUm91dGVyLCBSb3V0ZUluZm8sIGludCl9IHdoZW4gdGhlIHVzZXIgcHJlc3NlZAotICAgICAqIHRoZSBzdG9wIGNhc3RpbmcgYnV0dG9uLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVOU0VMRUNUX1JFQVNPTl9TVE9QUEVEID0gMjsKLSAgICAvKioKLSAgICAgKiBQYXNzZWQgdG8ge0BsaW5rIGFuZHJvaWQuc3VwcG9ydC52Ny5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXIuUm91dGVDb250cm9sbGVyI29uVW5zZWxlY3QoaW50KX0KLSAgICAgKiBhbmQge0BsaW5rIENhbGxiYWNrI29uUm91dGVVbnNlbGVjdGVkKE1lZGlhUm91dGVyLCBSb3V0ZUluZm8sIGludCl9IHdoZW4gdGhlIHVzZXIgc2VsZWN0ZWQKLSAgICAgKiBhIGRpZmZlcmVudCByb3V0ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTlNFTEVDVF9SRUFTT05fUk9VVEVfQ0hBTkdFRCA9IDM7Ci0KLSAgICAvLyBNYWludGFpbnMgZ2xvYmFsIG1lZGlhIHJvdXRlciBzdGF0ZSBmb3IgdGhlIHByb2Nlc3MuCi0gICAgLy8gVGhpcyBmaWVsZCBpcyBpbml0aWFsaXplZCBpbiBNZWRpYVJvdXRlci5nZXRJbnN0YW5jZSgpIGJlZm9yZSBhbnkKLSAgICAvLyBNZWRpYVJvdXRlciBvYmplY3RzIGFyZSBpbnN0YW50aWF0ZWQgc28gaXQgaXMgZ3VhcmFudGVlZCB0byBiZQotICAgIC8vIHZhbGlkIHdoZW5ldmVyIGFueSBpbnN0YW5jZSBtZXRob2QgaXMgaW52b2tlZC4KLSAgICBzdGF0aWMgR2xvYmFsTWVkaWFSb3V0ZXIgc0dsb2JhbDsKLQotICAgIC8vIENvbnRleHQtYm91bmQgc3RhdGUgb2YgdGhlIG1lZGlhIHJvdXRlci4KLSAgICBmaW5hbCBDb250ZXh0IG1Db250ZXh0OwotICAgIGZpbmFsIEFycmF5TGlzdDxDYWxsYmFja1JlY29yZD4gbUNhbGxiYWNrUmVjb3JkcyA9IG5ldyBBcnJheUxpc3Q8Q2FsbGJhY2tSZWNvcmQ+KCk7Ci0KLSAgICBASW50RGVmKGZsYWcgPSB0cnVlLAotICAgICAgICAgICAgdmFsdWUgPSB7Ci0gICAgICAgICAgICAgICAgICAgIENBTExCQUNLX0ZMQUdfUEVSRk9STV9BQ1RJVkVfU0NBTiwKLSAgICAgICAgICAgICAgICAgICAgQ0FMTEJBQ0tfRkxBR19SRVFVRVNUX0RJU0NPVkVSWSwKLSAgICAgICAgICAgICAgICAgICAgQ0FMTEJBQ0tfRkxBR19VTkZJTFRFUkVEX0VWRU5UUwotICAgICAgICAgICAgfQotICAgICkKLSAgICBAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5TT1VSQ0UpCi0gICAgcHJpdmF0ZSBAaW50ZXJmYWNlIENhbGxiYWNrRmxhZ3Mge30KLQotICAgIC8qKgotICAgICAqIEZsYWcgZm9yIHtAbGluayAjYWRkQ2FsbGJhY2t9OiBBY3RpdmVseSBzY2FuIGZvciByb3V0ZXMgd2hpbGUgdGhpcyBjYWxsYmFjawotICAgICAqIGlzIHJlZ2lzdGVyZWQuCi0gICAgICogPHA+Ci0gICAgICogV2hlbiB0aGlzIGZsYWcgaXMgc3BlY2lmaWVkLCB0aGUgbWVkaWEgcm91dGVyIHdpbGwgYWN0aXZlbHkgc2NhbiBmb3IgbmV3Ci0gICAgICogcm91dGVzLiAgQ2VydGFpbiByb3V0ZXMsIHN1Y2ggYXMgd2lmaSBkaXNwbGF5IHJvdXRlcywgbWF5IG5vdCBiZSBkaXNjb3ZlcmFibGUKLSAgICAgKiBleGNlcHQgd2hlbiBhY3RpdmVseSBzY2FubmluZy4gIFRoaXMgZmxhZyBpcyB0eXBpY2FsbHkgdXNlZCB3aGVuIHRoZSByb3V0ZSBwaWNrZXIKLSAgICAgKiBkaWFsb2cgaGFzIGJlZW4gb3BlbmVkIGJ5IHRoZSB1c2VyIHRvIGVuc3VyZSB0aGF0IHRoZSByb3V0ZSBpbmZvcm1hdGlvbiBpcwotICAgICAqIHVwIHRvIGRhdGUuCi0gICAgICogPC9wPjxwPgotICAgICAqIEFjdGl2ZSBzY2FubmluZyBtYXkgY29uc3VtZSBhIHNpZ25pZmljYW50IGFtb3VudCBvZiBwb3dlciBhbmQgbWF5IGhhdmUgaW50cnVzaXZlCi0gICAgICogZWZmZWN0cyBvbiB3aXJlbGVzcyBjb25uZWN0aXZpdHkuICBUaGVyZWZvcmUgaXQgaXMgaW1wb3J0YW50IHRoYXQgYWN0aXZlIHNjYW5uaW5nCi0gICAgICogb25seSBiZSByZXF1ZXN0ZWQgd2hlbiBpdCBpcyBhY3R1YWxseSBuZWVkZWQgdG8gc2F0aXNmeSBhIHVzZXIgcmVxdWVzdCB0bwotICAgICAqIGRpc2NvdmVyIGFuZCBzZWxlY3QgYSBuZXcgcm91dGUuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoaXMgZmxhZyBpbXBsaWVzIHtAbGluayAjQ0FMTEJBQ0tfRkxBR19SRVFVRVNUX0RJU0NPVkVSWX0gYnV0IHBlcmZvcm1pbmcKLSAgICAgKiBhY3RpdmUgc2NhbnMgaXMgbXVjaCBtb3JlIGV4cGVuc2l2ZSB0aGFuIGEgbm9ybWFsIGRpc2NvdmVyeSByZXF1ZXN0LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBzZWUgI0NBTExCQUNLX0ZMQUdfUkVRVUVTVF9ESVNDT1ZFUlkKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQUxMQkFDS19GTEFHX1BFUkZPUk1fQUNUSVZFX1NDQU4gPSAxIDw8IDA7Ci0KLSAgICAvKioKLSAgICAgKiBGbGFnIGZvciB7QGxpbmsgI2FkZENhbGxiYWNrfTogRG8gbm90IGZpbHRlciByb3V0ZSBldmVudHMuCi0gICAgICogPHA+Ci0gICAgICogV2hlbiB0aGlzIGZsYWcgaXMgc3BlY2lmaWVkLCB0aGUgY2FsbGJhY2sgd2lsbCBiZSBpbnZva2VkIGZvciBldmVudHMgdGhhdCBhZmZlY3QgYW55Ci0gICAgICogcm91dGUgZXZlbiBpZiB0aGV5IGRvIG5vdCBtYXRjaCB0aGUgY2FsbGJhY2sncyBmaWx0ZXIuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENBTExCQUNLX0ZMQUdfVU5GSUxURVJFRF9FVkVOVFMgPSAxIDw8IDE7Ci0KLSAgICAvKioKLSAgICAgKiBGbGFnIGZvciB7QGxpbmsgI2FkZENhbGxiYWNrfTogUmVxdWVzdCBwYXNzaXZlIHJvdXRlIGRpc2NvdmVyeSB3aGlsZSB0aGlzCi0gICAgICogY2FsbGJhY2sgaXMgcmVnaXN0ZXJlZCwgZXhjZXB0IG9uIHtAbGluayBBY3Rpdml0eU1hbmFnZXIjaXNMb3dSYW1EZXZpY2UgbG93LVJBTSBkZXZpY2VzfS4KLSAgICAgKiA8cD4KLSAgICAgKiBXaGVuIHRoaXMgZmxhZyBpcyBzcGVjaWZpZWQsIHRoZSBtZWRpYSByb3V0ZXIgd2lsbCB0cnkgdG8gZGlzY292ZXIgcm91dGVzLgotICAgICAqIEFsdGhvdWdoIHJvdXRlIGRpc2NvdmVyeSBpcyBpbnRlbmRlZCB0byBiZSBlZmZpY2llbnQsIGNoZWNraW5nIGZvciBuZXcgcm91dGVzIG1heQotICAgICAqIHJlc3VsdCBpbiBzb21lIG5ldHdvcmsgYWN0aXZpdHkgYW5kIGNvdWxkIHNsb3dseSBkcmFpbiB0aGUgYmF0dGVyeS4gIFRoZXJlZm9yZQotICAgICAqIGFwcGxpY2F0aW9ucyBzaG91bGQgb25seSBzcGVjaWZ5IHtAbGluayAjQ0FMTEJBQ0tfRkxBR19SRVFVRVNUX0RJU0NPVkVSWX0gd2hlbgotICAgICAqIHRoZXkgYXJlIHJ1bm5pbmcgaW4gdGhlIGZvcmVncm91bmQgYW5kIHdvdWxkIGxpa2UgdG8gcHJvdmlkZSB0aGUgdXNlciB3aXRoIHRoZQotICAgICAqIG9wdGlvbiBvZiBjb25uZWN0aW5nIHRvIG5ldyByb3V0ZXMuCi0gICAgICogPC9wPjxwPgotICAgICAqIEFwcGxpY2F0aW9ucyBzaG91bGQgdHlwaWNhbGx5IGFkZCBhIGNhbGxiYWNrIHVzaW5nIHRoaXMgZmxhZyBpbiB0aGUKLSAgICAgKiB7QGxpbmsgYW5kcm9pZC5hcHAuQWN0aXZpdHkgYWN0aXZpdHknc30ge0BsaW5rIGFuZHJvaWQuYXBwLkFjdGl2aXR5I29uU3RhcnQgb25TdGFydH0KLSAgICAgKiBtZXRob2QgYW5kIHJlbW92ZSBpdCBpbiB0aGUge0BsaW5rIGFuZHJvaWQuYXBwLkFjdGl2aXR5I29uU3RvcCBvblN0b3B9IG1ldGhvZC4KLSAgICAgKiBUaGUge0BsaW5rIGFuZHJvaWQuc3VwcG9ydC52Ny5hcHAuTWVkaWFSb3V0ZURpc2NvdmVyeUZyYWdtZW50fSBmcmFnbWVudCBtYXkKLSAgICAgKiBhbHNvIGJlIHVzZWQgZm9yIHRoaXMgcHVycG9zZS4KLSAgICAgKiA8L3A+PHAgY2xhc3M9Im5vdGUiPgotICAgICAqIE9uIHtAbGluayBBY3Rpdml0eU1hbmFnZXIjaXNMb3dSYW1EZXZpY2UgbG93LVJBTSBkZXZpY2VzfSB0aGlzIGZsYWcKLSAgICAgKiB3aWxsIGJlIGlnbm9yZWQuICBSZWZlciB0bwotICAgICAqIHtAbGluayAjYWRkQ2FsbGJhY2soTWVkaWFSb3V0ZVNlbGVjdG9yLCBDYWxsYmFjaywgaW50KSBhZGRDYWxsYmFja30gZm9yIGRldGFpbHMuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHNlZSBhbmRyb2lkLnN1cHBvcnQudjcuYXBwLk1lZGlhUm91dGVEaXNjb3ZlcnlGcmFnbWVudAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENBTExCQUNLX0ZMQUdfUkVRVUVTVF9ESVNDT1ZFUlkgPSAxIDw8IDI7Ci0KLSAgICAvKioKLSAgICAgKiBGbGFnIGZvciB7QGxpbmsgI2FkZENhbGxiYWNrfTogUmVxdWVzdCBwYXNzaXZlIHJvdXRlIGRpc2NvdmVyeSB3aGlsZSB0aGlzCi0gICAgICogY2FsbGJhY2sgaXMgcmVnaXN0ZXJlZCwgZXZlbiBvbiB7QGxpbmsgQWN0aXZpdHlNYW5hZ2VyI2lzTG93UmFtRGV2aWNlIGxvdy1SQU0gZGV2aWNlc30uCi0gICAgICogPHAgY2xhc3M9Im5vdGUiPgotICAgICAqIFRoaXMgZmxhZyBoYXMgYSBzaWduaWZpY2FudCBwZXJmb3JtYW5jZSBpbXBhY3Qgb24gbG93LVJBTSBkZXZpY2VzCi0gICAgICogc2luY2UgaXQgbWF5IGNhdXNlIG1hbnkgbWVkaWEgcm91dGUgcHJvdmlkZXJzIHRvIGJlIHN0YXJ0ZWQgc2ltdWx0YW5lb3VzbHkuCi0gICAgICogSXQgaXMgbXVjaCBiZXR0ZXIgdG8gdXNlIHtAbGluayAjQ0FMTEJBQ0tfRkxBR19SRVFVRVNUX0RJU0NPVkVSWX0gaW5zdGVhZCB0byBhdm9pZAotICAgICAqIHBlcmZvcm1pbmcgcGFzc2l2ZSBkaXNjb3Zlcnkgb24gdGhlc2UgZGV2aWNlcyBhbHRvZ2V0aGVyLiAgUmVmZXIgdG8KLSAgICAgKiB7QGxpbmsgI2FkZENhbGxiYWNrKE1lZGlhUm91dGVTZWxlY3RvciwgQ2FsbGJhY2ssIGludCkgYWRkQ2FsbGJhY2t9IGZvciBkZXRhaWxzLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBzZWUgYW5kcm9pZC5zdXBwb3J0LnY3LmFwcC5NZWRpYVJvdXRlRGlzY292ZXJ5RnJhZ21lbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQUxMQkFDS19GTEFHX0ZPUkNFX0RJU0NPVkVSWSA9IDEgPDwgMzsKLQotICAgIC8qKgotICAgICAqIEZsYWcgZm9yIHtAbGluayAjaXNSb3V0ZUF2YWlsYWJsZX06IElnbm9yZSB0aGUgZGVmYXVsdCByb3V0ZS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGZsYWcgaXMgdXNlZCB0byBkZXRlcm1pbmUgd2hldGhlciBhIG1hdGNoaW5nIG5vbi1kZWZhdWx0IHJvdXRlIGlzIGF2YWlsYWJsZS4KLSAgICAgKiBUaGlzIGNvbnN0cmFpbnQgbWF5IGJlIHVzZWQgdG8gZGVjaWRlIHdoZXRoZXIgdG8gb2ZmZXIgdGhlIHJvdXRlIGNob29zZXIgZGlhbG9nCi0gICAgICogdG8gdGhlIHVzZXIuICBUaGVyZSBpcyBubyBwb2ludCBvZmZlcmluZyB0aGUgY2hvb3NlciBpZiB0aGVyZSBhcmUgbm8KLSAgICAgKiBub24tZGVmYXVsdCBjaG9pY2VzLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBVkFJTEFCSUxJVFlfRkxBR19JR05PUkVfREVGQVVMVF9ST1VURSA9IDEgPDwgMDsKLQotICAgIC8qKgotICAgICAqIEZsYWcgZm9yIHtAbGluayAjaXNSb3V0ZUF2YWlsYWJsZX06IFJlcXVpcmUgYW4gYWN0dWFsIHJvdXRlIHRvIGJlIG1hdGNoZWQuCi0gICAgICogPHA+Ci0gICAgICogSWYgdGhpcyBmbGFnIGlzIG5vdCBzZXQsIHRoZW4ge0BsaW5rICNpc1JvdXRlQXZhaWxhYmxlfSB3aWxsIHJldHVybiB0cnVlCi0gICAgICogaWYgaXQgaXMgcG9zc2libGUgdG8gZGlzY292ZXIgYSBtYXRjaGluZyByb3V0ZSBldmVuIGlmIGRpc2NvdmVyeSBpcyBub3QgaW4KLSAgICAgKiBwcm9ncmVzcyBvciBpZiBubyBtYXRjaGluZyByb3V0ZSBoYXMgeWV0IGJlZW4gZm91bmQuICBUaGlzIGZlYXR1cmUgaXMgdXNlZCB0bwotICAgICAqIHNhdmUgcmVzb3VyY2VzIGJ5IHJlbW92aW5nIHRoZSBuZWVkIHRvIHBlcmZvcm0gcGFzc2l2ZSByb3V0ZSBkaXNjb3Zlcnkgb24KLSAgICAgKiB7QGxpbmsgQWN0aXZpdHlNYW5hZ2VyI2lzTG93UmFtRGV2aWNlIGxvdy1SQU0gZGV2aWNlc30uCi0gICAgICogPC9wPjxwPgotICAgICAqIElmIHRoaXMgZmxhZyBpcyBzZXQsIHRoZW4ge0BsaW5rICNpc1JvdXRlQXZhaWxhYmxlfSB3aWxsIG9ubHkgcmV0dXJuIHRydWUgaWYKLSAgICAgKiBhIG1hdGNoaW5nIHJvdXRlIGhhcyBhY3R1YWxseSBiZWVuIGRpc2NvdmVyZWQuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFWQUlMQUJJTElUWV9GTEFHX1JFUVVJUkVfTUFUQ0ggPSAxIDw8IDE7Ci0KLSAgICBwcml2YXRlIE1lZGlhUm91dGVyKENvbnRleHQgY29udGV4dCkgewotICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBhbiBpbnN0YW5jZSBvZiB0aGUgbWVkaWEgcm91dGVyIHNlcnZpY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb250ZXh0LgotICAgICAqIDxwPgotICAgICAqIFRoZSBhcHBsaWNhdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgaG9sZGluZyBhIHN0cm9uZyByZWZlcmVuY2UgdG8gdGhlIHJldHVybmVkCi0gICAgICoge0BsaW5rIE1lZGlhUm91dGVyfSBpbnN0YW5jZSwgc3VjaCBhcyBieSBzdG9yaW5nIHRoZSBpbnN0YW5jZSBpbiBhIGZpZWxkIG9mCi0gICAgICogdGhlIHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eX0sIHRvIGVuc3VyZSB0aGF0IHRoZSBtZWRpYSByb3V0ZXIgcmVtYWlucyBhbGl2ZQotICAgICAqIGFzIGxvbmcgYXMgdGhlIGFwcGxpY2F0aW9uIGlzIHVzaW5nIGl0cyBmZWF0dXJlcy4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogSW4gb3RoZXIgd29yZHMsIHRoZSBzdXBwb3J0IGxpYnJhcnkgb25seSBob2xkcyBhIHtAbGluayBXZWFrUmVmZXJlbmNlIHdlYWsgcmVmZXJlbmNlfQotICAgICAqIHRvIGVhY2ggbWVkaWEgcm91dGVyIGluc3RhbmNlLiAgV2hlbiB0aGVyZSBhcmUgbm8gcmVtYWluaW5nIHN0cm9uZyByZWZlcmVuY2VzIHRvIHRoZQotICAgICAqIG1lZGlhIHJvdXRlciBpbnN0YW5jZSwgYWxsIG9mIGl0cyBjYWxsYmFja3Mgd2lsbCBiZSByZW1vdmVkIGFuZCByb3V0ZSBkaXNjb3ZlcnkKLSAgICAgKiB3aWxsIG5vIGxvbmdlciBiZSBwZXJmb3JtZWQgb24gaXRzIGJlaGFsZi4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBtZWRpYSByb3V0ZXIgaW5zdGFuY2UgZm9yIHRoZSBjb250ZXh0LiAgVGhlIGFwcGxpY2F0aW9uIG11c3QgaG9sZAotICAgICAqIGEgc3Ryb25nIHJlZmVyZW5jZSB0byB0aGlzIG9iamVjdCBhcyBsb25nIGFzIGl0IGlzIGluIHVzZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE1lZGlhUm91dGVyIGdldEluc3RhbmNlKEBOb25OdWxsIENvbnRleHQgY29udGV4dCkgewotICAgICAgICBpZiAoY29udGV4dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb250ZXh0IG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKLQotICAgICAgICBpZiAoc0dsb2JhbCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBzR2xvYmFsID0gbmV3IEdsb2JhbE1lZGlhUm91dGVyKGNvbnRleHQuZ2V0QXBwbGljYXRpb25Db250ZXh0KCkpOwotICAgICAgICAgICAgc0dsb2JhbC5zdGFydCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzR2xvYmFsLmdldFJvdXRlcihjb250ZXh0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGluZm9ybWF0aW9uIGFib3V0IHRoZSB7QGxpbmsgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlc30gY3VycmVudGx5IGtub3duIHRvCi0gICAgICogdGhpcyBtZWRpYSByb3V0ZXIuCi0gICAgICovCi0gICAgcHVibGljIExpc3Q8Um91dGVJbmZvPiBnZXRSb3V0ZXMoKSB7Ci0gICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOwotICAgICAgICByZXR1cm4gc0dsb2JhbC5nZXRSb3V0ZXMoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGluZm9ybWF0aW9uIGFib3V0IHRoZSB7QGxpbmsgTWVkaWFSb3V0ZXIuUHJvdmlkZXJJbmZvIHJvdXRlIHByb3ZpZGVyc30KLSAgICAgKiBjdXJyZW50bHkga25vd24gdG8gdGhpcyBtZWRpYSByb3V0ZXIuCi0gICAgICovCi0gICAgcHVibGljIExpc3Q8UHJvdmlkZXJJbmZvPiBnZXRQcm92aWRlcnMoKSB7Ci0gICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOwotICAgICAgICByZXR1cm4gc0dsb2JhbC5nZXRQcm92aWRlcnMoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBkZWZhdWx0IHJvdXRlIGZvciBwbGF5aW5nIG1lZGlhIGNvbnRlbnQgb24gdGhlIHN5c3RlbS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgc3lzdGVtIGFsd2F5cyBwcm92aWRlcyBhIGRlZmF1bHQgcm91dGUuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgZGVmYXVsdCByb3V0ZSwgd2hpY2ggaXMgZ3VhcmFudGVlZCB0byBuZXZlciBiZSBudWxsLgotICAgICAqLwotICAgIEBOb25OdWxsCi0gICAgcHVibGljIFJvdXRlSW5mbyBnZXREZWZhdWx0Um91dGUoKSB7Ci0gICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOwotICAgICAgICByZXR1cm4gc0dsb2JhbC5nZXREZWZhdWx0Um91dGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGEgYmx1ZXRvb3RoIHJvdXRlIGZvciBwbGF5aW5nIG1lZGlhIGNvbnRlbnQgb24gdGhlIHN5c3RlbS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gQSBibHVldG9vdGggcm91dGUsIGlmIGV4aXN0LCBvdGhlcndpc2UgbnVsbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgUm91dGVJbmZvIGdldEJsdWV0b290aFJvdXRlKCkgewotICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKLSAgICAgICAgcmV0dXJuIHNHbG9iYWwuZ2V0Qmx1ZXRvb3RoUm91dGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcm91dGUuCi0gICAgICogPHA+Ci0gICAgICogVGhlIGFwcGxpY2F0aW9uIHNob3VsZCBleGFtaW5lIHRoZSByb3V0ZSdzCi0gICAgICoge0BsaW5rIFJvdXRlSW5mbyNnZXRDb250cm9sRmlsdGVycyBtZWRpYSBjb250cm9sIGludGVudCBmaWx0ZXJzfSB0byBhc3Nlc3MgdGhlCi0gICAgICogY2FwYWJpbGl0aWVzIG9mIHRoZSByb3V0ZSBiZWZvcmUgYXR0ZW1wdGluZyB0byB1c2UgaXQuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogPGgzPkV4YW1wbGU8L2gzPgotICAgICAqIDxwcmU+Ci0gICAgICogcHVibGljIGJvb2xlYW4gcGxheU1vdmllKCkgewotICAgICAqICAgICBNZWRpYVJvdXRlciBtZWRpYVJvdXRlciA9IE1lZGlhUm91dGVyLmdldEluc3RhbmNlKGNvbnRleHQpOwotICAgICAqICAgICBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUgPSBtZWRpYVJvdXRlci5nZXRTZWxlY3RlZFJvdXRlKCk7Ci0gICAgICoKLSAgICAgKiAgICAgLy8gRmlyc3QgdHJ5IHVzaW5nIHRoZSByZW1vdGUgcGxheWJhY2sgaW50ZXJmYWNlLCBpZiBzdXBwb3J0ZWQuCi0gICAgICogICAgIGlmIChyb3V0ZS5zdXBwb3J0c0NvbnRyb2xDYXRlZ29yeShNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLKSkgewotICAgICAqICAgICAgICAgLy8gVGhlIHJvdXRlIHN1cHBvcnRzIHJlbW90ZSBwbGF5YmFjay4KLSAgICAgKiAgICAgICAgIC8vIFRyeSB0byBzZW5kIGl0IHRoZSBVcmkgb2YgdGhlIG1vdmllIHRvIHBsYXkuCi0gICAgICogICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChNZWRpYUNvbnRyb2xJbnRlbnQuQUNUSU9OX1BMQVkpOwotICAgICAqICAgICAgICAgaW50ZW50LmFkZENhdGVnb3J5KE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9SRU1PVEVfUExBWUJBQ0spOwotICAgICAqICAgICAgICAgaW50ZW50LnNldERhdGFBbmRUeXBlKCJodHRwOi8vZXhhbXBsZS5jb20vdmlkZW9zL21vdmllLm1wNCIsICJ2aWRlby9tcDQiKTsKLSAgICAgKiAgICAgICAgIGlmIChyb3V0ZS5zdXBwb3J0c0NvbnRyb2xSZXF1ZXN0KGludGVudCkpIHsKLSAgICAgKiAgICAgICAgICAgICByb3V0ZS5zZW5kQ29udHJvbFJlcXVlc3QoaW50ZW50LCBudWxsKTsKLSAgICAgKiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gc2VudCB0aGUgcmVxdWVzdCB0byBwbGF5IHRoZSBtb3ZpZQotICAgICAqICAgICAgICAgfQotICAgICAqICAgICB9Ci0gICAgICoKLSAgICAgKiAgICAgLy8gSWYgcmVtb3RlIHBsYXliYWNrIHdhcyBub3QgcG9zc2libGUsIHRoZW4gcGxheSBsb2NhbGx5LgotICAgICAqICAgICBpZiAocm91dGUuc3VwcG9ydHNDb250cm9sQ2F0ZWdvcnkoTWVkaWFDb250cm9sSW50ZW50LkNBVEVHT1JZX0xJVkVfVklERU8pKSB7Ci0gICAgICogICAgICAgICAvLyBUaGUgcm91dGUgc3VwcG9ydHMgbGl2ZSB2aWRlbyBzdHJlYW1pbmcuCi0gICAgICogICAgICAgICAvLyBQcmVwYXJlIHRvIHBsYXkgY29udGVudCBsb2NhbGx5IGluIGEgd2luZG93IG9yIGluIGEgcHJlc2VudGF0aW9uLgotICAgICAqICAgICAgICAgcmV0dXJuIHBsYXlNb3ZpZUluV2luZG93KCk7Ci0gICAgICogICAgIH0KLSAgICAgKgotICAgICAqICAgICAvLyBOZWl0aGVyIGludGVyZmFjZSBpcyBzdXBwb3J0ZWQsIHNvIHdlIGNhbid0IHBsYXkgdGhlIG1vdmllIHRvIHRoaXMgcm91dGUuCi0gICAgICogICAgIHJldHVybiBmYWxzZTsKLSAgICAgKiB9Ci0gICAgICogPC9wcmU+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBzZWxlY3RlZCByb3V0ZSwgd2hpY2ggaXMgZ3VhcmFudGVlZCB0byBuZXZlciBiZSBudWxsLgotICAgICAqCi0gICAgICogQHNlZSBSb3V0ZUluZm8jZ2V0Q29udHJvbEZpbHRlcnMKLSAgICAgKiBAc2VlIFJvdXRlSW5mbyNzdXBwb3J0c0NvbnRyb2xDYXRlZ29yeQotICAgICAqIEBzZWUgUm91dGVJbmZvI3N1cHBvcnRzQ29udHJvbFJlcXVlc3QKLSAgICAgKi8KLSAgICBATm9uTnVsbAotICAgIHB1YmxpYyBSb3V0ZUluZm8gZ2V0U2VsZWN0ZWRSb3V0ZSgpIHsKLSAgICAgICAgY2hlY2tDYWxsaW5nVGhyZWFkKCk7Ci0gICAgICAgIHJldHVybiBzR2xvYmFsLmdldFNlbGVjdGVkUm91dGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzZWxlY3RlZCByb3V0ZSBpZiBpdCBtYXRjaGVzIHRoZSBzcGVjaWZpZWQgc2VsZWN0b3IsIG90aGVyd2lzZQotICAgICAqIHNlbGVjdHMgdGhlIGRlZmF1bHQgcm91dGUgYW5kIHJldHVybnMgaXQuIElmIHRoZXJlIGlzIG9uZSBsaXZlIGF1ZGlvIHJvdXRlCi0gICAgICogKHVzdWFsbHkgQmx1ZXRvb3RoIEEyRFApLCBpdCB3aWxsIGJlIHNlbGVjdGVkIGluc3RlYWQgb2YgZGVmYXVsdCByb3V0ZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzZWxlY3RvciBUaGUgc2VsZWN0b3IgdG8gbWF0Y2guCi0gICAgICogQHJldHVybiBUaGUgcHJldmlvdXNseSBzZWxlY3RlZCByb3V0ZSBpZiBpdCBtYXRjaGVkIHRoZSBzZWxlY3Rvciwgb3RoZXJ3aXNlIHRoZQotICAgICAqIG5ld2x5IHNlbGVjdGVkIGRlZmF1bHQgcm91dGUgd2hpY2ggaXMgZ3VhcmFudGVlZCB0byBuZXZlciBiZSBudWxsLgotICAgICAqCi0gICAgICogQHNlZSBNZWRpYVJvdXRlU2VsZWN0b3IKLSAgICAgKiBAc2VlIFJvdXRlSW5mbyNtYXRjaGVzU2VsZWN0b3IKLSAgICAgKi8KLSAgICBATm9uTnVsbAotICAgIHB1YmxpYyBSb3V0ZUluZm8gdXBkYXRlU2VsZWN0ZWRSb3V0ZShATm9uTnVsbCBNZWRpYVJvdXRlU2VsZWN0b3Igc2VsZWN0b3IpIHsKLSAgICAgICAgaWYgKHNlbGVjdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInNlbGVjdG9yIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKLQotICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgInVwZGF0ZVNlbGVjdGVkUm91dGU6ICIgKyBzZWxlY3Rvcik7Ci0gICAgICAgIH0KLSAgICAgICAgUm91dGVJbmZvIHJvdXRlID0gc0dsb2JhbC5nZXRTZWxlY3RlZFJvdXRlKCk7Ci0gICAgICAgIGlmICghcm91dGUuaXNEZWZhdWx0T3JCbHVldG9vdGgoKSAmJiAhcm91dGUubWF0Y2hlc1NlbGVjdG9yKHNlbGVjdG9yKSkgewotICAgICAgICAgICAgcm91dGUgPSBzR2xvYmFsLmNob29zZUZhbGxiYWNrUm91dGUoKTsKLSAgICAgICAgICAgIHNHbG9iYWwuc2VsZWN0Um91dGUocm91dGUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByb3V0ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZWxlY3RzIHRoZSBzcGVjaWZpZWQgcm91dGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcm91dGUgVGhlIHJvdXRlIHRvIHNlbGVjdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZWxlY3RSb3V0ZShATm9uTnVsbCBSb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgaWYgKHJvdXRlID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInJvdXRlIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKLQotICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgInNlbGVjdFJvdXRlOiAiICsgcm91dGUpOwotICAgICAgICB9Ci0gICAgICAgIHNHbG9iYWwuc2VsZWN0Um91dGUocm91dGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVuc2VsZWN0cyB0aGUgY3VycmVudCByb3VuZCBhbmQgc2VsZWN0cyB0aGUgZGVmYXVsdCByb3V0ZSBpbnN0ZWFkLgotICAgICAqIDxwPgotICAgICAqIFRoZSByZWFzb24gZ2l2ZW4gbXVzdCBiZSBvbmUgb2Y6Ci0gICAgICogPHVsPgotICAgICAqIDxsaT57QGxpbmsgTWVkaWFSb3V0ZXIjVU5TRUxFQ1RfUkVBU09OX1VOS05PV059PC9saT4KLSAgICAgKiA8bGk+e0BsaW5rIE1lZGlhUm91dGVyI1VOU0VMRUNUX1JFQVNPTl9ESVNDT05ORUNURUR9PC9saT4KLSAgICAgKiA8bGk+e0BsaW5rIE1lZGlhUm91dGVyI1VOU0VMRUNUX1JFQVNPTl9TVE9QUEVEfTwvbGk+Ci0gICAgICogPGxpPntAbGluayBNZWRpYVJvdXRlciNVTlNFTEVDVF9SRUFTT05fUk9VVEVfQ0hBTkdFRH08L2xpPgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gcmVhc29uIFRoZSByZWFzb24gZm9yIGRpc2Nvbm5lY3RpbmcgdGhlIGN1cnJlbnQgcm91dGUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdW5zZWxlY3QoaW50IHJlYXNvbikgewotICAgICAgICBpZiAocmVhc29uIDwgTWVkaWFSb3V0ZXIuVU5TRUxFQ1RfUkVBU09OX1VOS05PV04gfHwKLSAgICAgICAgICAgICAgICByZWFzb24gPiBNZWRpYVJvdXRlci5VTlNFTEVDVF9SRUFTT05fUk9VVEVfQ0hBTkdFRCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5zdXBwb3J0ZWQgcmVhc29uIHRvIHVuc2VsZWN0IHJvdXRlIik7Ci0gICAgICAgIH0KLSAgICAgICAgY2hlY2tDYWxsaW5nVGhyZWFkKCk7Ci0KLSAgICAgICAgLy8gQ2hvb3NlIHRoZSBmYWxsYmFjayByb3V0ZSBpZiBpdCdzIG5vdCBhbHJlYWR5IHNlbGVjdGVkLgotICAgICAgICAvLyBPdGhlcndpc2UsIHNlbGVjdCB0aGUgZGVmYXVsdCByb3V0ZS4KLSAgICAgICAgUm91dGVJbmZvIGZhbGxiYWNrUm91dGUgPSBzR2xvYmFsLmNob29zZUZhbGxiYWNrUm91dGUoKTsKLSAgICAgICAgaWYgKHNHbG9iYWwuZ2V0U2VsZWN0ZWRSb3V0ZSgpICE9IGZhbGxiYWNrUm91dGUpIHsKLSAgICAgICAgICAgIHNHbG9iYWwuc2VsZWN0Um91dGUoZmFsbGJhY2tSb3V0ZSwgcmVhc29uKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNHbG9iYWwuc2VsZWN0Um91dGUoc0dsb2JhbC5nZXREZWZhdWx0Um91dGUoKSwgcmVhc29uKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGVyZSBpcyBhIHJvdXRlIHRoYXQgbWF0Y2hlcyB0aGUgc3BlY2lmaWVkIHNlbGVjdG9yLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdHJ1ZSBpZiB0aGVyZSBhcmUgYW55IGF2YWlsYWJsZSByb3V0ZXMgdGhhdCBtYXRjaCB0aGUKLSAgICAgKiBzZWxlY3RvciByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhleSBhcmUgZW5hYmxlZCBvciBkaXNhYmxlZC4gSWYgdGhlCi0gICAgICoge0BsaW5rICNBVkFJTEFCSUxJVFlfRkxBR19JR05PUkVfREVGQVVMVF9ST1VURX0gZmxhZyBpcyBzcGVjaWZpZWQsIHRoZW4KLSAgICAgKiB0aGUgbWV0aG9kIHdpbGwgb25seSBjb25zaWRlciBub24tZGVmYXVsdCByb3V0ZXMuCi0gICAgICogPC9wPgotICAgICAqIDxwIGNsYXNzPSJub3RlIj4KLSAgICAgKiBPbiB7QGxpbmsgQWN0aXZpdHlNYW5hZ2VyI2lzTG93UmFtRGV2aWNlIGxvdy1SQU0gZGV2aWNlc30gdGhpcyBtZXRob2QKLSAgICAgKiB3aWxsIHJldHVybiB0cnVlIGlmIGl0IGlzIHBvc3NpYmxlIHRvIGRpc2NvdmVyIGEgbWF0Y2hpbmcgcm91dGUgZXZlbiBpZgotICAgICAqIGRpc2NvdmVyeSBpcyBub3QgaW4gcHJvZ3Jlc3Mgb3IgaWYgbm8gbWF0Y2hpbmcgcm91dGUgaGFzIHlldCBiZWVuIGZvdW5kLgotICAgICAqIFVzZSB7QGxpbmsgI0FWQUlMQUJJTElUWV9GTEFHX1JFUVVJUkVfTUFUQ0h9IHRvIHJlcXVpcmUgYW4gYWN0dWFsIG1hdGNoLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzZWxlY3RvciBUaGUgc2VsZWN0b3IgdG8gbWF0Y2guCi0gICAgICogQHBhcmFtIGZsYWdzIEZsYWdzIHRvIGNvbnRyb2wgdGhlIGRldGVybWluYXRpb24gb2Ygd2hldGhlciBhIHJvdXRlIG1heSBiZQotICAgICAqICAgICAgICAgICAgYXZhaWxhYmxlLiBNYXkgYmUgemVybyBvciBzb21lIGNvbWJpbmF0aW9uIG9mCi0gICAgICogICAgICAgICAgICB7QGxpbmsgI0FWQUlMQUJJTElUWV9GTEFHX0lHTk9SRV9ERUZBVUxUX1JPVVRFfSBhbmQKLSAgICAgKiAgICAgICAgICAgIHtAbGluayAjQVZBSUxBQklMSVRZX0ZMQUdfUkVRVUlSRV9NQVRDSH0uCi0gICAgICogQHJldHVybiBUcnVlIGlmIGEgbWF0Y2hpbmcgcm91dGUgbWF5IGJlIGF2YWlsYWJsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1JvdXRlQXZhaWxhYmxlKEBOb25OdWxsIE1lZGlhUm91dGVTZWxlY3RvciBzZWxlY3RvciwgaW50IGZsYWdzKSB7Ci0gICAgICAgIGlmIChzZWxlY3RvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzZWxlY3RvciBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgY2hlY2tDYWxsaW5nVGhyZWFkKCk7Ci0KLSAgICAgICAgcmV0dXJuIHNHbG9iYWwuaXNSb3V0ZUF2YWlsYWJsZShzZWxlY3RvciwgZmxhZ3MpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlZ2lzdGVycyBhIGNhbGxiYWNrIHRvIGRpc2NvdmVyIHJvdXRlcyB0aGF0IG1hdGNoIHRoZSBzZWxlY3RvciBhbmQgdG8gcmVjZWl2ZQotICAgICAqIGV2ZW50cyB3aGVuIHRoZXkgY2hhbmdlLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgdGhhdCBoYXMgdGhlIHNhbWUgZWZmZWN0IGFzIGNhbGxpbmcKLSAgICAgKiB7QGxpbmsgI2FkZENhbGxiYWNrKE1lZGlhUm91dGVTZWxlY3RvciwgQ2FsbGJhY2ssIGludCl9IHdpdGhvdXQgZmxhZ3MuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIHNlbGVjdG9yIEEgcm91dGUgc2VsZWN0b3IgdGhhdCBpbmRpY2F0ZXMgdGhlIGtpbmRzIG9mIHJvdXRlcyB0aGF0IHRoZQotICAgICAqIGNhbGxiYWNrIHdvdWxkIGxpa2UgdG8gZGlzY292ZXIuCi0gICAgICogQHBhcmFtIGNhbGxiYWNrIFRoZSBjYWxsYmFjayB0byBhZGQuCi0gICAgICogQHNlZSAjcmVtb3ZlQ2FsbGJhY2sKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRDYWxsYmFjayhNZWRpYVJvdXRlU2VsZWN0b3Igc2VsZWN0b3IsIENhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIGFkZENhbGxiYWNrKHNlbGVjdG9yLCBjYWxsYmFjaywgMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVnaXN0ZXJzIGEgY2FsbGJhY2sgdG8gZGlzY292ZXIgcm91dGVzIHRoYXQgbWF0Y2ggdGhlIHNlbGVjdG9yIGFuZCB0byByZWNlaXZlCi0gICAgICogZXZlbnRzIHdoZW4gdGhleSBjaGFuZ2UuCi0gICAgICogPHA+Ci0gICAgICogVGhlIHNlbGVjdG9yIGRlc2NyaWJlcyB0aGUga2luZHMgb2Ygcm91dGVzIHRoYXQgdGhlIGFwcGxpY2F0aW9uIHdhbnRzIHRvCi0gICAgICogZGlzY292ZXIuICBGb3IgZXhhbXBsZSwgaWYgdGhlIGFwcGxpY2F0aW9uIHdhbnRzIHRvIHVzZQotICAgICAqIGxpdmUgYXVkaW8gcm91dGVzIHRoZW4gaXQgc2hvdWxkIGluY2x1ZGUgdGhlCi0gICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNDQVRFR09SWV9MSVZFX0FVRElPIGxpdmUgYXVkaW8gbWVkaWEgY29udHJvbCBpbnRlbnQgY2F0ZWdvcnl9Ci0gICAgICogaW4gaXRzIHNlbGVjdG9yIHdoZW4gaXQgYWRkcyBhIGNhbGxiYWNrIHRvIHRoZSBtZWRpYSByb3V0ZXIuCi0gICAgICogVGhlIHNlbGVjdG9yIG1heSBpbmNsdWRlIGFueSBudW1iZXIgb2YgY2F0ZWdvcmllcy4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogSWYgdGhlIGNhbGxiYWNrIGhhcyBhbHJlYWR5IGJlZW4gcmVnaXN0ZXJlZCwgdGhlbiB0aGUgc2VsZWN0b3IgaXMgYWRkZWQgdG8KLSAgICAgKiB0aGUgc2V0IG9mIHNlbGVjdG9ycyBiZWluZyBtb25pdG9yZWQgYnkgdGhlIGNhbGxiYWNrLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBCeSBkZWZhdWx0LCB0aGUgY2FsbGJhY2sgd2lsbCBvbmx5IGJlIGludm9rZWQgZm9yIGV2ZW50cyB0aGF0IGFmZmVjdCByb3V0ZXMKLSAgICAgKiB0aGF0IG1hdGNoIHRoZSBzcGVjaWZpZWQgc2VsZWN0b3IuICBFdmVudCBmaWx0ZXJpbmcgbWF5IGJlIGRpc2FibGVkIGJ5IHNwZWNpZnlpbmcKLSAgICAgKiB0aGUge0BsaW5rICNDQUxMQkFDS19GTEFHX1VORklMVEVSRURfRVZFTlRTfSBmbGFnIHdoZW4gdGhlIGNhbGxiYWNrIGlzIHJlZ2lzdGVyZWQuCi0gICAgICogPC9wPjxwPgotICAgICAqIEFwcGxpY2F0aW9ucyBzaG91bGQgdXNlIHRoZSB7QGxpbmsgI2lzUm91dGVBdmFpbGFibGV9IG1ldGhvZCB0byBkZXRlcm1pbmUKLSAgICAgKiB3aGV0aGVyIGlzIGl0IHBvc3NpYmxlIHRvIGRpc2NvdmVyIGEgcm91dGUgd2l0aCB0aGUgZGVzaXJlZCBjYXBhYmlsaXRpZXMKLSAgICAgKiBhbmQgdGhlcmVmb3JlIHdoZXRoZXIgdGhlIG1lZGlhIHJvdXRlIGJ1dHRvbiBzaG91bGQgYmUgc2hvd24gdG8gdGhlIHVzZXIuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoZSB7QGxpbmsgI0NBTExCQUNLX0ZMQUdfUkVRVUVTVF9ESVNDT1ZFUll9IGZsYWcgc2hvdWxkIGJlIHVzZWQgd2hpbGUgdGhlIGFwcGxpY2F0aW9uCi0gICAgICogaXMgaW4gdGhlIGZvcmVncm91bmQgdG8gcmVxdWVzdCB0aGF0IHBhc3NpdmUgZGlzY292ZXJ5IGJlIHBlcmZvcm1lZCBpZiB0aGVyZSBhcmUKLSAgICAgKiBzdWZmaWNpZW50IHJlc291cmNlcyB0byBhbGxvdyBjb250aW51b3VzIHBhc3NpdmUgZGlzY292ZXJ5LgotICAgICAqIE9uIHtAbGluayBBY3Rpdml0eU1hbmFnZXIjaXNMb3dSYW1EZXZpY2UgbG93LVJBTSBkZXZpY2VzfSB0aGlzIGZsYWcgd2lsbCBiZQotICAgICAqIGlnbm9yZWQgdG8gY29uc2VydmUgcmVzb3VyY2VzLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGUge0BsaW5rICNDQUxMQkFDS19GTEFHX0ZPUkNFX0RJU0NPVkVSWX0gZmxhZyBzaG91bGQgYmUgdXNlZCB3aGVuCi0gICAgICogcGFzc2l2ZSBkaXNjb3ZlcnkgYWJzb2x1dGVseSBtdXN0IGJlIHBlcmZvcm1lZCwgZXZlbiBvbiBsb3ctUkFNIGRldmljZXMuCi0gICAgICogVGhpcyBmbGFnIGhhcyBhIHNpZ25pZmljYW50IHBlcmZvcm1hbmNlIGltcGFjdCBvbiBsb3ctUkFNIGRldmljZXMKLSAgICAgKiBzaW5jZSBpdCBtYXkgY2F1c2UgbWFueSBtZWRpYSByb3V0ZSBwcm92aWRlcnMgdG8gYmUgc3RhcnRlZCBzaW11bHRhbmVvdXNseS4KLSAgICAgKiBJdCBpcyBtdWNoIGJldHRlciB0byB1c2Uge0BsaW5rICNDQUxMQkFDS19GTEFHX1JFUVVFU1RfRElTQ09WRVJZfSBpbnN0ZWFkIHRvIGF2b2lkCi0gICAgICogcGVyZm9ybWluZyBwYXNzaXZlIGRpc2NvdmVyeSBvbiB0aGVzZSBkZXZpY2VzIGFsdG9nZXRoZXIuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoZSB7QGxpbmsgI0NBTExCQUNLX0ZMQUdfUEVSRk9STV9BQ1RJVkVfU0NBTn0gZmxhZyBzaG91bGQgYmUgdXNlZCB3aGVuIHRoZQotICAgICAqIG1lZGlhIHJvdXRlIGNob29zZXIgZGlhbG9nIGlzIHNob3dpbmcgdG8gY29uZmlybSB0aGUgcHJlc2VuY2Ugb2YgYXZhaWxhYmxlCi0gICAgICogcm91dGVzIHRoYXQgdGhlIHVzZXIgbWF5IGNvbm5lY3QgdG8uICBUaGlzIGZsYWcgbWF5IHVzZSBzdWJzdGFudGlhbGx5IG1vcmUKLSAgICAgKiBwb3dlci4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiA8aDM+RXhhbXBsZTwvaDM+Ci0gICAgICogPHByZT4KLSAgICAgKiBwdWJsaWMgY2xhc3MgTXlBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKLSAgICAgKiAgICAgcHJpdmF0ZSBNZWRpYVJvdXRlciBtUm91dGVyOwotICAgICAqICAgICBwcml2YXRlIE1lZGlhUm91dGVyLkNhbGxiYWNrIG1DYWxsYmFjazsKLSAgICAgKiAgICAgcHJpdmF0ZSBNZWRpYVJvdXRlU2VsZWN0b3IgbVNlbGVjdG9yOwotICAgICAqCi0gICAgICogICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKLSAgICAgKiAgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7Ci0gICAgICoKLSAgICAgKiAgICAgICAgIG1Sb3V0ZXIgPSBNZWRpYXJvdXRlci5nZXRJbnN0YW5jZSh0aGlzKTsKLSAgICAgKiAgICAgICAgIG1DYWxsYmFjayA9IG5ldyBNeUNhbGxiYWNrKCk7Ci0gICAgICogICAgICAgICBtU2VsZWN0b3IgPSBuZXcgTWVkaWFSb3V0ZVNlbGVjdG9yLkJ1aWxkZXIoKQotICAgICAqICAgICAgICAgICAgICAgICAuYWRkQ29udHJvbENhdGVnb3J5KE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9MSVZFX0FVRElPKQotICAgICAqICAgICAgICAgICAgICAgICAuYWRkQ29udHJvbENhdGVnb3J5KE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9SRU1PVEVfUExBWUJBQ0spCi0gICAgICogICAgICAgICAgICAgICAgIC5idWlsZCgpOwotICAgICAqICAgICB9Ci0gICAgICoKLSAgICAgKiAgICAgLy8gQWRkIHRoZSBjYWxsYmFjayBvbiBzdGFydCB0byB0ZWxsIHRoZSBtZWRpYSByb3V0ZXIgd2hhdCBraW5kcyBvZiByb3V0ZXMKLSAgICAgKiAgICAgLy8gdGhlIGFwcGxpY2F0aW9uIGlzIGludGVyZXN0ZWQgaW4gc28gdGhhdCBpdCBjYW4gdHJ5IHRvIGRpc2NvdmVyIHN1aXRhYmxlIG9uZXMuCi0gICAgICogICAgIHB1YmxpYyB2b2lkIG9uU3RhcnQoKSB7Ci0gICAgICogICAgICAgICBzdXBlci5vblN0YXJ0KCk7Ci0gICAgICoKLSAgICAgKiAgICAgICAgIG1lZGlhUm91dGVyLmFkZENhbGxiYWNrKG1TZWxlY3RvciwgbUNhbGxiYWNrLAotICAgICAqICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlci5DQUxMQkFDS19GTEFHX1JFUVVFU1RfRElTQ09WRVJZKTsKLSAgICAgKgotICAgICAqICAgICAgICAgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlID0gbWVkaWFSb3V0ZXIudXBkYXRlU2VsZWN0ZWRSb3V0ZShtU2VsZWN0b3IpOwotICAgICAqICAgICAgICAgLy8gZG8gc29tZXRoaW5nIHdpdGggdGhlIHJvdXRlLi4uCi0gICAgICogICAgIH0KLSAgICAgKgotICAgICAqICAgICAvLyBSZW1vdmUgdGhlIHNlbGVjdG9yIG9uIHN0b3AgdG8gdGVsbCB0aGUgbWVkaWEgcm91dGVyIHRoYXQgaXQgbm8gbG9uZ2VyCi0gICAgICogICAgIC8vIG5lZWRzIHRvIGludmVzdCBlZmZvcnQgdHJ5aW5nIHRvIGRpc2NvdmVyIHJvdXRlcyBvZiB0aGVzZSBraW5kcyBmb3Igbm93LgotICAgICAqICAgICBwdWJsaWMgdm9pZCBvblN0b3AoKSB7Ci0gICAgICogICAgICAgICBzdXBlci5vblN0b3AoKTsKLSAgICAgKgotICAgICAqICAgICAgICAgbWVkaWFSb3V0ZXIucmVtb3ZlQ2FsbGJhY2sobUNhbGxiYWNrKTsKLSAgICAgKiAgICAgfQotICAgICAqCi0gICAgICogICAgIHByaXZhdGUgZmluYWwgY2xhc3MgTXlDYWxsYmFjayBleHRlbmRzIE1lZGlhUm91dGVyLkNhbGxiYWNrIHsKLSAgICAgKiAgICAgICAgIC8vIEltcGxlbWVudCBjYWxsYmFjayBtZXRob2RzIGFzIG5lZWRlZC4KLSAgICAgKiAgICAgfQotICAgICAqIH0KLSAgICAgKiA8L3ByZT4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzZWxlY3RvciBBIHJvdXRlIHNlbGVjdG9yIHRoYXQgaW5kaWNhdGVzIHRoZSBraW5kcyBvZiByb3V0ZXMgdGhhdCB0aGUKLSAgICAgKiBjYWxsYmFjayB3b3VsZCBsaWtlIHRvIGRpc2NvdmVyLgotICAgICAqIEBwYXJhbSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgdG8gYWRkLgotICAgICAqIEBwYXJhbSBmbGFncyBGbGFncyB0byBjb250cm9sIHRoZSBiZWhhdmlvciBvZiB0aGUgY2FsbGJhY2suCi0gICAgICogTWF5IGJlIHplcm8gb3IgYSBjb21iaW5hdGlvbiBvZiB7QGxpbmsgI0NBTExCQUNLX0ZMQUdfUEVSRk9STV9BQ1RJVkVfU0NBTn0gYW5kCi0gICAgICoge0BsaW5rICNDQUxMQkFDS19GTEFHX1VORklMVEVSRURfRVZFTlRTfS4KLSAgICAgKiBAc2VlICNyZW1vdmVDYWxsYmFjawotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZENhbGxiYWNrKEBOb25OdWxsIE1lZGlhUm91dGVTZWxlY3RvciBzZWxlY3RvciwgQE5vbk51bGwgQ2FsbGJhY2sgY2FsbGJhY2ssCi0gICAgICAgICAgICBAQ2FsbGJhY2tGbGFncyBpbnQgZmxhZ3MpIHsKLSAgICAgICAgaWYgKHNlbGVjdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInNlbGVjdG9yIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoY2FsbGJhY2sgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY2FsbGJhY2sgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOwotCi0gICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiYWRkQ2FsbGJhY2s6IHNlbGVjdG9yPSIgKyBzZWxlY3RvcgotICAgICAgICAgICAgICAgICAgICArICIsIGNhbGxiYWNrPSIgKyBjYWxsYmFjayArICIsIGZsYWdzPSIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKGZsYWdzKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBDYWxsYmFja1JlY29yZCByZWNvcmQ7Ci0gICAgICAgIGludCBpbmRleCA9IGZpbmRDYWxsYmFja1JlY29yZChjYWxsYmFjayk7Ci0gICAgICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgICAgIHJlY29yZCA9IG5ldyBDYWxsYmFja1JlY29yZCh0aGlzLCBjYWxsYmFjayk7Ci0gICAgICAgICAgICBtQ2FsbGJhY2tSZWNvcmRzLmFkZChyZWNvcmQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmVjb3JkID0gbUNhbGxiYWNrUmVjb3Jkcy5nZXQoaW5kZXgpOwotICAgICAgICB9Ci0gICAgICAgIGJvb2xlYW4gdXBkYXRlTmVlZGVkID0gZmFsc2U7Ci0gICAgICAgIGlmICgoZmxhZ3MgJiB+cmVjb3JkLm1GbGFncykgIT0gMCkgewotICAgICAgICAgICAgcmVjb3JkLm1GbGFncyB8PSBmbGFnczsKLSAgICAgICAgICAgIHVwZGF0ZU5lZWRlZCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFyZWNvcmQubVNlbGVjdG9yLmNvbnRhaW5zKHNlbGVjdG9yKSkgewotICAgICAgICAgICAgcmVjb3JkLm1TZWxlY3RvciA9IG5ldyBNZWRpYVJvdXRlU2VsZWN0b3IuQnVpbGRlcihyZWNvcmQubVNlbGVjdG9yKQotICAgICAgICAgICAgICAgICAgICAuYWRkU2VsZWN0b3Ioc2VsZWN0b3IpCi0gICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOwotICAgICAgICAgICAgdXBkYXRlTmVlZGVkID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAodXBkYXRlTmVlZGVkKSB7Ci0gICAgICAgICAgICBzR2xvYmFsLnVwZGF0ZURpc2NvdmVyeVJlcXVlc3QoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgdGhlIHNwZWNpZmllZCBjYWxsYmFjay4gIEl0IHdpbGwgbm8gbG9uZ2VyIHJlY2VpdmUgZXZlbnRzIGFib3V0Ci0gICAgICogY2hhbmdlcyB0byBtZWRpYSByb3V0ZXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2FsbGJhY2sgVGhlIGNhbGxiYWNrIHRvIHJlbW92ZS4KLSAgICAgKiBAc2VlICNhZGRDYWxsYmFjawotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZUNhbGxiYWNrKEBOb25OdWxsIENhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIGlmIChjYWxsYmFjayA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjYWxsYmFjayBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgY2hlY2tDYWxsaW5nVGhyZWFkKCk7Ci0KLSAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJyZW1vdmVDYWxsYmFjazogY2FsbGJhY2s9IiArIGNhbGxiYWNrKTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBpbmRleCA9IGZpbmRDYWxsYmFja1JlY29yZChjYWxsYmFjayk7Ci0gICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICBtQ2FsbGJhY2tSZWNvcmRzLnJlbW92ZShpbmRleCk7Ci0gICAgICAgICAgICBzR2xvYmFsLnVwZGF0ZURpc2NvdmVyeVJlcXVlc3QoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgaW50IGZpbmRDYWxsYmFja1JlY29yZChDYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBtQ2FsbGJhY2tSZWNvcmRzLnNpemUoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAobUNhbGxiYWNrUmVjb3Jkcy5nZXQoaSkubUNhbGxiYWNrID09IGNhbGxiYWNrKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlZ2lzdGVycyBhIG1lZGlhIHJvdXRlIHByb3ZpZGVyIHdpdGhpbiB0aGlzIGFwcGxpY2F0aW9uIHByb2Nlc3MuCi0gICAgICogPHA+Ci0gICAgICogVGhlIHByb3ZpZGVyIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGxpc3Qgb2YgcHJvdmlkZXJzIHRoYXQgYWxsIHtAbGluayBNZWRpYVJvdXRlcn0KLSAgICAgKiBpbnN0YW5jZXMgd2l0aGluIHRoaXMgcHJvY2VzcyBjYW4gdXNlIHRvIGRpc2NvdmVyIHJvdXRlcy4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gcHJvdmlkZXJJbnN0YW5jZSBUaGUgbWVkaWEgcm91dGUgcHJvdmlkZXIgaW5zdGFuY2UgdG8gYWRkLgotICAgICAqCi0gICAgICogQHNlZSBNZWRpYVJvdXRlUHJvdmlkZXIKLSAgICAgKiBAc2VlICNyZW1vdmVDYWxsYmFjawotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZFByb3ZpZGVyKEBOb25OdWxsIE1lZGlhUm91dGVQcm92aWRlciBwcm92aWRlckluc3RhbmNlKSB7Ci0gICAgICAgIGlmIChwcm92aWRlckluc3RhbmNlID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInByb3ZpZGVySW5zdGFuY2UgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOwotCi0gICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiYWRkUHJvdmlkZXI6ICIgKyBwcm92aWRlckluc3RhbmNlKTsKLSAgICAgICAgfQotICAgICAgICBzR2xvYmFsLmFkZFByb3ZpZGVyKHByb3ZpZGVySW5zdGFuY2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVucmVnaXN0ZXJzIGEgbWVkaWEgcm91dGUgcHJvdmlkZXIgd2l0aGluIHRoaXMgYXBwbGljYXRpb24gcHJvY2Vzcy4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgcHJvdmlkZXIgd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlIGxpc3Qgb2YgcHJvdmlkZXJzIHRoYXQgYWxsIHtAbGluayBNZWRpYVJvdXRlcn0KLSAgICAgKiBpbnN0YW5jZXMgd2l0aGluIHRoaXMgcHJvY2VzcyBjYW4gdXNlIHRvIGRpc2NvdmVyIHJvdXRlcy4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gcHJvdmlkZXJJbnN0YW5jZSBUaGUgbWVkaWEgcm91dGUgcHJvdmlkZXIgaW5zdGFuY2UgdG8gcmVtb3ZlLgotICAgICAqCi0gICAgICogQHNlZSBNZWRpYVJvdXRlUHJvdmlkZXIKLSAgICAgKiBAc2VlICNhZGRDYWxsYmFjawotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZVByb3ZpZGVyKEBOb25OdWxsIE1lZGlhUm91dGVQcm92aWRlciBwcm92aWRlckluc3RhbmNlKSB7Ci0gICAgICAgIGlmIChwcm92aWRlckluc3RhbmNlID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInByb3ZpZGVySW5zdGFuY2UgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOwotCi0gICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAicmVtb3ZlUHJvdmlkZXI6ICIgKyBwcm92aWRlckluc3RhbmNlKTsKLSAgICAgICAgfQotICAgICAgICBzR2xvYmFsLnJlbW92ZVByb3ZpZGVyKHByb3ZpZGVySW5zdGFuY2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYSByZW1vdGUgY29udHJvbCBjbGllbnQgdG8gZW5hYmxlIHJlbW90ZSBjb250cm9sIG9mIHRoZSB2b2x1bWUKLSAgICAgKiBvZiB0aGUgc2VsZWN0ZWQgcm91dGUuCi0gICAgICogPHA+Ci0gICAgICogVGhlIHJlbW90ZSBjb250cm9sIGNsaWVudCBtdXN0IGhhdmUgcHJldmlvdXNseSBiZWVuIHJlZ2lzdGVyZWQgd2l0aAotICAgICAqIHRoZSBhdWRpbyBtYW5hZ2VyIHVzaW5nIHRoZSB7QGxpbmsgYW5kcm9pZC5tZWRpYS5BdWRpb01hbmFnZXIjcmVnaXN0ZXJSZW1vdGVDb250cm9sQ2xpZW50Ci0gICAgICogQXVkaW9NYW5hZ2VyLnJlZ2lzdGVyUmVtb3RlQ29udHJvbENsaWVudH0gbWV0aG9kLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSByZW1vdGVDb250cm9sQ2xpZW50IFRoZSB7QGxpbmsgYW5kcm9pZC5tZWRpYS5SZW1vdGVDb250cm9sQ2xpZW50fSB0byByZWdpc3Rlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRSZW1vdGVDb250cm9sQ2xpZW50KEBOb25OdWxsIE9iamVjdCByZW1vdGVDb250cm9sQ2xpZW50KSB7Ci0gICAgICAgIGlmIChyZW1vdGVDb250cm9sQ2xpZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInJlbW90ZUNvbnRyb2xDbGllbnQgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOwotCi0gICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiYWRkUmVtb3RlQ29udHJvbENsaWVudDogIiArIHJlbW90ZUNvbnRyb2xDbGllbnQpOwotICAgICAgICB9Ci0gICAgICAgIHNHbG9iYWwuYWRkUmVtb3RlQ29udHJvbENsaWVudChyZW1vdGVDb250cm9sQ2xpZW50KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIGEgcmVtb3RlIGNvbnRyb2wgY2xpZW50LgotICAgICAqCi0gICAgICogQHBhcmFtIHJlbW90ZUNvbnRyb2xDbGllbnQgVGhlIHtAbGluayBhbmRyb2lkLm1lZGlhLlJlbW90ZUNvbnRyb2xDbGllbnR9Ci0gICAgICogICAgICAgICAgICB0byB1bnJlZ2lzdGVyLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZVJlbW90ZUNvbnRyb2xDbGllbnQoQE5vbk51bGwgT2JqZWN0IHJlbW90ZUNvbnRyb2xDbGllbnQpIHsKLSAgICAgICAgaWYgKHJlbW90ZUNvbnRyb2xDbGllbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicmVtb3RlQ29udHJvbENsaWVudCBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgInJlbW92ZVJlbW90ZUNvbnRyb2xDbGllbnQ6ICIgKyByZW1vdGVDb250cm9sQ2xpZW50KTsKLSAgICAgICAgfQotICAgICAgICBzR2xvYmFsLnJlbW92ZVJlbW90ZUNvbnRyb2xDbGllbnQocmVtb3RlQ29udHJvbENsaWVudCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbWVkaWEgc2Vzc2lvbiB0byBlbmFibGUgcmVtb3RlIGNvbnRyb2wgb2YgdGhlIHZvbHVtZSBvZiB0aGUKLSAgICAgKiBzZWxlY3RlZCByb3V0ZS4gVGhpcyBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkIG9mCi0gICAgICoge0BsaW5rICNhZGRSZW1vdGVDb250cm9sQ2xpZW50fSB3aGVuIHVzaW5nIG1lZGlhIHNlc3Npb25zLiBTZXQgdGhlCi0gICAgICogc2Vzc2lvbiB0byBudWxsIHRvIGNsZWFyIGl0LgotICAgICAqCi0gICAgICogQHBhcmFtIG1lZGlhU2Vzc2lvbiBUaGUge0BsaW5rIGFuZHJvaWQubWVkaWEuc2Vzc2lvbi5NZWRpYVNlc3Npb259IHRvCi0gICAgICogICAgICAgICAgICB1c2UuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TWVkaWFTZXNzaW9uKE9iamVjdCBtZWRpYVNlc3Npb24pIHsKLSAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJhZGRNZWRpYVNlc3Npb246ICIgKyBtZWRpYVNlc3Npb24pOwotICAgICAgICB9Ci0gICAgICAgIHNHbG9iYWwuc2V0TWVkaWFTZXNzaW9uKG1lZGlhU2Vzc2lvbik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyBhIGNvbXBhdCBtZWRpYSBzZXNzaW9uIHRvIGVuYWJsZSByZW1vdGUgY29udHJvbCBvZiB0aGUgdm9sdW1lIG9mIHRoZQotICAgICAqIHNlbGVjdGVkIHJvdXRlLiBUaGlzIHNob3VsZCBiZSB1c2VkIGluc3RlYWQgb2YKLSAgICAgKiB7QGxpbmsgI2FkZFJlbW90ZUNvbnRyb2xDbGllbnR9IHdoZW4gdXNpbmcge0BsaW5rIE1lZGlhU2Vzc2lvbkNvbXBhdH0uCi0gICAgICogU2V0IHRoZSBzZXNzaW9uIHRvIG51bGwgdG8gY2xlYXIgaXQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWVkaWFTZXNzaW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TWVkaWFTZXNzaW9uQ29tcGF0KE1lZGlhU2Vzc2lvbkNvbXBhdCBtZWRpYVNlc3Npb24pIHsKLSAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJhZGRNZWRpYVNlc3Npb25Db21wYXQ6ICIgKyBtZWRpYVNlc3Npb24pOwotICAgICAgICB9Ci0gICAgICAgIHNHbG9iYWwuc2V0TWVkaWFTZXNzaW9uQ29tcGF0KG1lZGlhU2Vzc2lvbik7Ci0gICAgfQotCi0gICAgcHVibGljIE1lZGlhU2Vzc2lvbkNvbXBhdC5Ub2tlbiBnZXRNZWRpYVNlc3Npb25Ub2tlbigpIHsKLSAgICAgICAgcmV0dXJuIHNHbG9iYWwuZ2V0TWVkaWFTZXNzaW9uVG9rZW4oKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFbnN1cmVzIHRoYXQgY2FsbHMgaW50byB0aGUgbWVkaWEgcm91dGVyIGFyZSBvbiB0aGUgY29ycmVjdCB0aHJlYWQuCi0gICAgICogSXQgcGF5cyB0byBiZSBhIGxpdHRsZSBwYXJhbm9pZCB3aGVuIGdsb2JhbCBzdGF0ZSBpbnZhcmlhbnRzIGFyZSBhdCByaXNrLgotICAgICAqLwotICAgIHN0YXRpYyB2b2lkIGNoZWNrQ2FsbGluZ1RocmVhZCgpIHsKLSAgICAgICAgaWYgKExvb3Blci5teUxvb3BlcigpICE9IExvb3Blci5nZXRNYWluTG9vcGVyKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlRoZSBtZWRpYSByb3V0ZXIgc2VydmljZSBtdXN0IG9ubHkgYmUgIgotICAgICAgICAgICAgICAgICAgICArICJhY2Nlc3NlZCBvbiB0aGUgYXBwbGljYXRpb24ncyBtYWluIHRocmVhZC4iKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0YXRpYyA8VD4gYm9vbGVhbiBlcXVhbChUIGEsIFQgYikgewotICAgICAgICByZXR1cm4gYSA9PSBiIHx8IChhICE9IG51bGwgJiYgYiAhPSBudWxsICYmIGEuZXF1YWxzKGIpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcm92aWRlcyBpbmZvcm1hdGlvbiBhYm91dCBhIG1lZGlhIHJvdXRlLgotICAgICAqIDxwPgotICAgICAqIEVhY2ggbWVkaWEgcm91dGUgaGFzIGEgbGlzdCBvZiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50IG1lZGlhIGNvbnRyb2x9Ci0gICAgICoge0BsaW5rICNnZXRDb250cm9sRmlsdGVycyBpbnRlbnQgZmlsdGVyc30gdGhhdCBkZXNjcmliZSB0aGUgY2FwYWJpbGl0aWVzIG9mIHRoZQotICAgICAqIHJvdXRlIGFuZCB0aGUgbWFubmVyIGluIHdoaWNoIGl0IGlzIHVzZWQgYW5kIGNvbnRyb2xsZWQuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUm91dGVJbmZvIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlckluZm8gbVByb3ZpZGVyOwotICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtRGVzY3JpcHRvcklkOwotICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtVW5pcXVlSWQ7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIG1OYW1lOwotICAgICAgICBwcml2YXRlIFN0cmluZyBtRGVzY3JpcHRpb247Ci0gICAgICAgIHByaXZhdGUgVXJpIG1JY29uVXJpOwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUVuYWJsZWQ7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBtQ29ubmVjdGluZzsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbUNvbm5lY3Rpb25TdGF0ZTsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1DYW5EaXNjb25uZWN0OwotICAgICAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxJbnRlbnRGaWx0ZXI+IG1Db250cm9sRmlsdGVycyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICBwcml2YXRlIGludCBtUGxheWJhY2tUeXBlOwotICAgICAgICBwcml2YXRlIGludCBtUGxheWJhY2tTdHJlYW07Ci0gICAgICAgIHByaXZhdGUgaW50IG1EZXZpY2VUeXBlOwotICAgICAgICBwcml2YXRlIGludCBtVm9sdW1lSGFuZGxpbmc7Ci0gICAgICAgIHByaXZhdGUgaW50IG1Wb2x1bWU7Ci0gICAgICAgIHByaXZhdGUgaW50IG1Wb2x1bWVNYXg7Ci0gICAgICAgIHByaXZhdGUgRGlzcGxheSBtUHJlc2VudGF0aW9uRGlzcGxheTsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbVByZXNlbnRhdGlvbkRpc3BsYXlJZCA9IFBSRVNFTlRBVElPTl9ESVNQTEFZX0lEX05PTkU7Ci0gICAgICAgIHByaXZhdGUgQnVuZGxlIG1FeHRyYXM7Ci0gICAgICAgIHByaXZhdGUgSW50ZW50U2VuZGVyIG1TZXR0aW5nc0ludGVudDsKLSAgICAgICAgTWVkaWFSb3V0ZURlc2NyaXB0b3IgbURlc2NyaXB0b3I7Ci0KLSAgICAgICAgQEludERlZih7Q09OTkVDVElPTl9TVEFURV9ESVNDT05ORUNURUQsIENPTk5FQ1RJT05fU1RBVEVfQ09OTkVDVElORywKLSAgICAgICAgICAgICAgICBDT05ORUNUSU9OX1NUQVRFX0NPTk5FQ1RFRH0pCi0gICAgICAgIEBSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlNPVVJDRSkKLSAgICAgICAgcHJpdmF0ZSBAaW50ZXJmYWNlIENvbm5lY3Rpb25TdGF0ZSB7fQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgZGVmYXVsdCBjb25uZWN0aW9uIHN0YXRlIGluZGljYXRpbmcgdGhlIHJvdXRlIGlzIGRpc2Nvbm5lY3RlZC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHNlZSAjZ2V0Q29ubmVjdGlvblN0YXRlCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05ORUNUSU9OX1NUQVRFX0RJU0NPTk5FQ1RFRCA9IDA7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEEgY29ubmVjdGlvbiBzdGF0ZSBpbmRpY2F0aW5nIHRoZSByb3V0ZSBpcyBpbiB0aGUgcHJvY2VzcyBvZiBjb25uZWN0aW5nIGFuZCBpcyBub3QgeWV0Ci0gICAgICAgICAqIHJlYWR5IGZvciB1c2UuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBzZWUgI2dldENvbm5lY3Rpb25TdGF0ZQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OTkVDVElPTl9TVEFURV9DT05ORUNUSU5HID0gMTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQSBjb25uZWN0aW9uIHN0YXRlIGluZGljYXRpbmcgdGhlIHJvdXRlIGlzIGNvbm5lY3RlZC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHNlZSAjZ2V0Q29ubmVjdGlvblN0YXRlCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05ORUNUSU9OX1NUQVRFX0NPTk5FQ1RFRCA9IDI7Ci0KLSAgICAgICAgQEludERlZih7UExBWUJBQ0tfVFlQRV9MT0NBTCxQTEFZQkFDS19UWVBFX1JFTU9URX0pCi0gICAgICAgIEBSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlNPVVJDRSkKLSAgICAgICAgcHJpdmF0ZSBAaW50ZXJmYWNlIFBsYXliYWNrVHlwZSB7fQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgZGVmYXVsdCBwbGF5YmFjayB0eXBlLCAibG9jYWwiLCBpbmRpY2F0aW5nIHRoZSBwcmVzZW50YXRpb24gb2YgdGhlIG1lZGlhCi0gICAgICAgICAqIGlzIGhhcHBlbmluZyBvbiB0aGUgc2FtZSBkZXZpY2UgKGUuZy4gYSBwaG9uZSwgYSB0YWJsZXQpIGFzIHdoZXJlIGl0IGlzCi0gICAgICAgICAqIGNvbnRyb2xsZWQgZnJvbS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHNlZSAjZ2V0UGxheWJhY2tUeXBlCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQTEFZQkFDS19UWVBFX0xPQ0FMID0gMDsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQSBwbGF5YmFjayB0eXBlIGluZGljYXRpbmcgdGhlIHByZXNlbnRhdGlvbiBvZiB0aGUgbWVkaWEgaXMgaGFwcGVuaW5nIG9uCi0gICAgICAgICAqIGEgZGlmZmVyZW50IGRldmljZSAoaS5lLiB0aGUgcmVtb3RlIGRldmljZSkgdGhhbiB3aGVyZSBpdCBpcyBjb250cm9sbGVkIGZyb20uCi0gICAgICAgICAqCi0gICAgICAgICAqIEBzZWUgI2dldFBsYXliYWNrVHlwZQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUExBWUJBQ0tfVFlQRV9SRU1PVEUgPSAxOwotCi0gICAgICAgIEBJbnREZWYoe0RFVklDRV9UWVBFX1VOS05PV04sIERFVklDRV9UWVBFX1RWLCBERVZJQ0VfVFlQRV9TUEVBS0VSLCBERVZJQ0VfVFlQRV9CTFVFVE9PVEh9KQotICAgICAgICBAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5TT1VSQ0UpCi0gICAgICAgIHByaXZhdGUgQGludGVyZmFjZSBEZXZpY2VUeXBlIHt9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBkZWZhdWx0IHJlY2VpdmVyIGRldmljZSB0eXBlIG9mIHRoZSByb3V0ZSBpbmRpY2F0aW5nIHRoZSB0eXBlIGlzIHVua25vd24uCi0gICAgICAgICAqCi0gICAgICAgICAqIEBzZWUgI2dldERldmljZVR5cGUKLSAgICAgICAgICogQGhpZGUKLSAgICAgICAgICovCi0gICAgICAgIC8vIEBSZXN0cmljdFRvKExJQlJBUllfR1JPVVApCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFVklDRV9UWVBFX1VOS05PV04gPSAwOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBIHJlY2VpdmVyIGRldmljZSB0eXBlIG9mIHRoZSByb3V0ZSBpbmRpY2F0aW5nIHRoZSBwcmVzZW50YXRpb24gb2YgdGhlIG1lZGlhIGlzIGhhcHBlbmluZwotICAgICAgICAgKiBvbiBhIFRWLgotICAgICAgICAgKgotICAgICAgICAgKiBAc2VlICNnZXREZXZpY2VUeXBlCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfVFlQRV9UViA9IDE7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEEgcmVjZWl2ZXIgZGV2aWNlIHR5cGUgb2YgdGhlIHJvdXRlIGluZGljYXRpbmcgdGhlIHByZXNlbnRhdGlvbiBvZiB0aGUgbWVkaWEgaXMgaGFwcGVuaW5nCi0gICAgICAgICAqIG9uIGEgc3BlYWtlci4KLSAgICAgICAgICoKLSAgICAgICAgICogQHNlZSAjZ2V0RGV2aWNlVHlwZQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVWSUNFX1RZUEVfU1BFQUtFUiA9IDI7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEEgcmVjZWl2ZXIgZGV2aWNlIHR5cGUgb2YgdGhlIHJvdXRlIGluZGljYXRpbmcgdGhlIHByZXNlbnRhdGlvbiBvZiB0aGUgbWVkaWEgaXMgaGFwcGVuaW5nCi0gICAgICAgICAqIG9uIGEgYmx1ZXRvb3RoIGRldmljZSBzdWNoIGFzIGEgYmx1ZXRvb3RoIHNwZWFrZXIuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBzZWUgI2dldERldmljZVR5cGUKLSAgICAgICAgICogQGhpZGUKLSAgICAgICAgICovCi0gICAgICAgIC8vIEBSZXN0cmljdFRvKExJQlJBUllfR1JPVVApCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFVklDRV9UWVBFX0JMVUVUT09USCA9IDM7Ci0KLSAgICAgICAgQEludERlZih7UExBWUJBQ0tfVk9MVU1FX0ZJWEVELFBMQVlCQUNLX1ZPTFVNRV9WQVJJQUJMRX0pCi0gICAgICAgIEBSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlNPVVJDRSkKLSAgICAgICAgcHJpdmF0ZSBAaW50ZXJmYWNlIFBsYXliYWNrVm9sdW1lIHt9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFBsYXliYWNrIGluZm9ybWF0aW9uIGluZGljYXRpbmcgdGhlIHBsYXliYWNrIHZvbHVtZSBpcyBmaXhlZCwgaS5lLiBpdCBjYW5ub3QgYmUKLSAgICAgICAgICogY29udHJvbGxlZCBmcm9tIHRoaXMgb2JqZWN0LiBBbiBleGFtcGxlIG9mIGZpeGVkIHBsYXliYWNrIHZvbHVtZSBpcyBhIHJlbW90ZSBwbGF5ZXIsCi0gICAgICAgICAqIHBsYXlpbmcgb3ZlciBIRE1JIHdoZXJlIHRoZSB1c2VyIHByZWZlcnMgdG8gY29udHJvbCB0aGUgdm9sdW1lIG9uIHRoZSBIRE1JIHNpbmssIHJhdGhlcgotICAgICAgICAgKiB0aGFuIGF0dGVudWF0ZSBhdCB0aGUgc291cmNlLgotICAgICAgICAgKgotICAgICAgICAgKiBAc2VlICNnZXRWb2x1bWVIYW5kbGluZwotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUExBWUJBQ0tfVk9MVU1FX0ZJWEVEID0gMDsKLQotICAgICAgICAvKioKLSAgICAgICAgICogUGxheWJhY2sgaW5mb3JtYXRpb24gaW5kaWNhdGluZyB0aGUgcGxheWJhY2sgdm9sdW1lIGlzIHZhcmlhYmxlIGFuZCBjYW4gYmUgY29udHJvbGxlZAotICAgICAgICAgKiBmcm9tIHRoaXMgb2JqZWN0LgotICAgICAgICAgKgotICAgICAgICAgKiBAc2VlICNnZXRWb2x1bWVIYW5kbGluZwotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUExBWUJBQ0tfVk9MVU1FX1ZBUklBQkxFID0gMTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIGRlZmF1bHQgcHJlc2VudGF0aW9uIGRpc3BsYXkgaWQgaW5kaWNhdGluZyBubyBwcmVzZW50YXRpb24gZGlzcGxheSBpcyBhc3NvY2lhdGVkCi0gICAgICAgICAqIHdpdGggdGhlIHJvdXRlLgotICAgICAgICAgKiBAaGlkZQotICAgICAgICAgKi8KLSAgICAgICAgLy8gQFJlc3RyaWN0VG8oTElCUkFSWV9HUk9VUCkKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJFU0VOVEFUSU9OX0RJU1BMQVlfSURfTk9ORSA9IC0xOwotCi0gICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgQ0hBTkdFX0dFTkVSQUwgPSAxIDw8IDA7Ci0gICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgQ0hBTkdFX1ZPTFVNRSA9IDEgPDwgMTsKLSAgICAgICAgc3RhdGljIGZpbmFsIGludCBDSEFOR0VfUFJFU0VOVEFUSU9OX0RJU1BMQVkgPSAxIDw8IDI7Ci0KLSAgICAgICAgLy8gU2hvdWxkIG1hdGNoIHRvIFN5c3RlbU1lZGlhUm91dGVQcm92aWRlci5QQUNLQUdFX05BTUUuCi0gICAgICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1lTVEVNX01FRElBX1JPVVRFX1BST1ZJREVSX1BBQ0tBR0VfTkFNRSA9ICJhbmRyb2lkIjsKLQotICAgICAgICBSb3V0ZUluZm8oUHJvdmlkZXJJbmZvIHByb3ZpZGVyLCBTdHJpbmcgZGVzY3JpcHRvcklkLCBTdHJpbmcgdW5pcXVlSWQpIHsKLSAgICAgICAgICAgIG1Qcm92aWRlciA9IHByb3ZpZGVyOwotICAgICAgICAgICAgbURlc2NyaXB0b3JJZCA9IGRlc2NyaXB0b3JJZDsKLSAgICAgICAgICAgIG1VbmlxdWVJZCA9IHVuaXF1ZUlkOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldHMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHByb3ZpZGVyIG9mIHRoaXMgbWVkaWEgcm91dGUuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgUHJvdmlkZXJJbmZvIGdldFByb3ZpZGVyKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Qcm92aWRlcjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXRzIHRoZSB1bmlxdWUgaWQgb2YgdGhlIHJvdXRlLgotICAgICAgICAgKiA8cD4KLSAgICAgICAgICogVGhlIHJvdXRlIHVuaXF1ZSBpZCBmdW5jdGlvbnMgYXMgYSBzdGFibGUgaWRlbnRpZmllciBieSB3aGljaCB0aGUgcm91dGUgaXMga25vd24uCi0gICAgICAgICAqIEZvciBleGFtcGxlLCBhbiBhcHBsaWNhdGlvbiBjYW4gdXNlIHRoaXMgaWQgYXMgYSB0b2tlbiB0byByZW1lbWJlciB0aGUKLSAgICAgICAgICogc2VsZWN0ZWQgcm91dGUgYWNyb3NzIHJlc3RhcnRzIG9yIHRvIGNvbW11bmljYXRlIGl0cyBpZGVudGl0eSB0byBhIHNlcnZpY2UuCi0gICAgICAgICAqIDwvcD4KLSAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiBUaGUgdW5pcXVlIGlkIG9mIHRoZSByb3V0ZSwgbmV2ZXIgbnVsbC4KLSAgICAgICAgICovCi0gICAgICAgIEBOb25OdWxsCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVVuaXF1ZUlkOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldHMgdGhlIHVzZXItdmlzaWJsZSBuYW1lIG9mIHRoZSByb3V0ZS4KLSAgICAgICAgICogPHA+Ci0gICAgICAgICAqIFRoZSByb3V0ZSBuYW1lIGlkZW50aWZpZXMgdGhlIGRlc3RpbmF0aW9uIHJlcHJlc2VudGVkIGJ5IHRoZSByb3V0ZS4KLSAgICAgICAgICogSXQgbWF5IGJlIGEgdXNlci1zdXBwbGllZCBuYW1lLCBhbiBhbGlhcywgb3IgZGV2aWNlIHNlcmlhbCBudW1iZXIuCi0gICAgICAgICAqIDwvcD4KLSAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiBUaGUgdXNlci12aXNpYmxlIG5hbWUgb2YgYSBtZWRpYSByb3V0ZS4gIFRoaXMgaXMgdGhlIHN0cmluZyBwcmVzZW50ZWQKLSAgICAgICAgICogdG8gdXNlcnMgd2hvIG1heSBzZWxlY3QgdGhpcyBhcyB0aGUgYWN0aXZlIHJvdXRlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICAgICAgcmV0dXJuIG1OYW1lOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldHMgdGhlIHVzZXItdmlzaWJsZSBkZXNjcmlwdGlvbiBvZiB0aGUgcm91dGUuCi0gICAgICAgICAqIDxwPgotICAgICAgICAgKiBUaGUgcm91dGUgZGVzY3JpcHRpb24gZGVzY3JpYmVzIHRoZSBraW5kIG9mIGRlc3RpbmF0aW9uIHJlcHJlc2VudGVkIGJ5IHRoZSByb3V0ZS4KLSAgICAgICAgICogSXQgbWF5IGJlIGEgdXNlci1zdXBwbGllZCBzdHJpbmcsIGEgbW9kZWwgbnVtYmVyIG9yIGJyYW5kIG9mIGRldmljZS4KLSAgICAgICAgICogPC9wPgotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgcm91dGUsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgICAgICovCi0gICAgICAgIEBOdWxsYWJsZQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotICAgICAgICAgICAgcmV0dXJuIG1EZXNjcmlwdGlvbjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXRzIHRoZSBVUkkgb2YgdGhlIGljb24gcmVwcmVzZW50aW5nIHRoaXMgcm91dGUuCi0gICAgICAgICAqIDxwPgotICAgICAgICAgKiBUaGlzIGljb24gd2lsbCBiZSB1c2VkIGluIHBpY2tlciBVSXMgaWYgYXZhaWxhYmxlLgotICAgICAgICAgKiA8L3A+Ci0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gVGhlIFVSSSBvZiB0aGUgaWNvbiByZXByZXNlbnRpbmcgdGhpcyByb3V0ZSwgb3IgbnVsbCBpZiBub25lLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFVyaSBnZXRJY29uVXJpKCkgewotICAgICAgICAgICAgcmV0dXJuIG1JY29uVXJpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHJvdXRlIGlzIGVuYWJsZWQgYW5kIG1heSBiZSBzZWxlY3RlZC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiBUcnVlIGlmIHRoaXMgcm91dGUgaXMgZW5hYmxlZC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtRW5hYmxlZDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHJvdXRlIGlzIGluIHRoZSBwcm9jZXNzIG9mIGNvbm5lY3RpbmcgYW5kIGlzIG5vdAotICAgICAgICAgKiB5ZXQgcmVhZHkgZm9yIHVzZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiBUcnVlIGlmIHRoaXMgcm91dGUgaXMgaW4gdGhlIHByb2Nlc3Mgb2YgY29ubmVjdGluZy4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzQ29ubmVjdGluZygpIHsKLSAgICAgICAgICAgIHJldHVybiBtQ29ubmVjdGluZzsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXRzIHRoZSBjb25uZWN0aW9uIHN0YXRlIG9mIHRoZSByb3V0ZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiBUaGUgY29ubmVjdGlvbiBzdGF0ZSBvZiB0aGlzIHJvdXRlOiB7QGxpbmsgI0NPTk5FQ1RJT05fU1RBVEVfRElTQ09OTkVDVEVEfSwKLSAgICAgICAgICoge0BsaW5rICNDT05ORUNUSU9OX1NUQVRFX0NPTk5FQ1RJTkd9LCBvciB7QGxpbmsgI0NPTk5FQ1RJT05fU1RBVEVfQ09OTkVDVEVEfS4KLSAgICAgICAgICovCi0gICAgICAgIEBDb25uZWN0aW9uU3RhdGUKLSAgICAgICAgcHVibGljIGludCBnZXRDb25uZWN0aW9uU3RhdGUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUNvbm5lY3Rpb25TdGF0ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyByb3V0ZSBpcyBjdXJyZW50bHkgc2VsZWN0ZWQuCi0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGlzIHJvdXRlIGlzIGN1cnJlbnRseSBzZWxlY3RlZC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHNlZSBNZWRpYVJvdXRlciNnZXRTZWxlY3RlZFJvdXRlCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1NlbGVjdGVkKCkgewotICAgICAgICAgICAgY2hlY2tDYWxsaW5nVGhyZWFkKCk7Ci0gICAgICAgICAgICByZXR1cm4gc0dsb2JhbC5nZXRTZWxlY3RlZFJvdXRlKCkgPT0gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyByb3V0ZSBpcyB0aGUgZGVmYXVsdCByb3V0ZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiBUcnVlIGlmIHRoaXMgcm91dGUgaXMgdGhlIGRlZmF1bHQgcm91dGUuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBzZWUgTWVkaWFSb3V0ZXIjZ2V0RGVmYXVsdFJvdXRlCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHQoKSB7Ci0gICAgICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKLSAgICAgICAgICAgIHJldHVybiBzR2xvYmFsLmdldERlZmF1bHRSb3V0ZSgpID09IHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgcm91dGUgaXMgYSBibHVldG9vdGggcm91dGUuCi0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGlzIHJvdXRlIGlzIGEgYmx1ZXRvb3RoIHJvdXRlLgotICAgICAgICAgKgotICAgICAgICAgKiBAc2VlIE1lZGlhUm91dGVyI2dldEJsdWV0b290aFJvdXRlCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0JsdWV0b290aCgpIHsKLSAgICAgICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOwotICAgICAgICAgICAgcmV0dXJuIHNHbG9iYWwuZ2V0Qmx1ZXRvb3RoUm91dGUoKSA9PSB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHJvdXRlIGlzIHRoZSBkZWZhdWx0IHJvdXRlIGFuZCB0aGUgZGV2aWNlIHNwZWFrZXIuCi0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGlzIHJvdXRlIGlzIHRoZSBkZWZhdWx0IHJvdXRlIGFuZCB0aGUgZGV2aWNlIHNwZWFrZXIuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0RldmljZVNwZWFrZXIoKSB7Ci0gICAgICAgICAgICBpbnQgZGVmYXVsdEF1ZGlvUm91dGVOYW1lUmVzb3VyY2VJZCA9IFJlc291cmNlcy5nZXRTeXN0ZW0oKS5nZXRJZGVudGlmaWVyKAotICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdF9hdWRpb19yb3V0ZV9uYW1lIiwgInN0cmluZyIsICJhbmRyb2lkIik7Ci0gICAgICAgICAgICByZXR1cm4gaXNEZWZhdWx0KCkKLSAgICAgICAgICAgICAgICAgICAgJiYgUmVzb3VyY2VzLmdldFN5c3RlbSgpLmdldFRleHQoZGVmYXVsdEF1ZGlvUm91dGVOYW1lUmVzb3VyY2VJZCkuZXF1YWxzKG1OYW1lKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXRzIGEgbGlzdCBvZiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50IG1lZGlhIGNvbnRyb2wgaW50ZW50fSBmaWx0ZXJzIHRoYXQKLSAgICAgICAgICogZGVzY3JpYmUgdGhlIGNhcGFiaWxpdGllcyBvZiB0aGlzIHJvdXRlIGFuZCB0aGUgbWVkaWEgY29udHJvbCBhY3Rpb25zIHRoYXQKLSAgICAgICAgICogaXQgc3VwcG9ydHMuCi0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gQSBsaXN0IG9mIGludGVudCBmaWx0ZXJzIHRoYXQgc3BlY2lmaWVzIHRoZSBtZWRpYSBjb250cm9sIGludGVudHMgdGhhdAotICAgICAgICAgKiB0aGlzIHJvdXRlIHN1cHBvcnRzLgotICAgICAgICAgKgotICAgICAgICAgKiBAc2VlIE1lZGlhQ29udHJvbEludGVudAotICAgICAgICAgKiBAc2VlICNzdXBwb3J0c0NvbnRyb2xDYXRlZ29yeQotICAgICAgICAgKiBAc2VlICNzdXBwb3J0c0NvbnRyb2xSZXF1ZXN0Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgTGlzdDxJbnRlbnRGaWx0ZXI+IGdldENvbnRyb2xGaWx0ZXJzKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Db250cm9sRmlsdGVyczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHJvdXRlIHN1cHBvcnRzIGF0IGxlYXN0IG9uZSBvZiB0aGUgY2FwYWJpbGl0aWVzCi0gICAgICAgICAqIGRlc2NyaWJlZCBieSBhIG1lZGlhIHJvdXRlIHNlbGVjdG9yLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gc2VsZWN0b3IgVGhlIHNlbGVjdG9yIHRoYXQgc3BlY2lmaWVzIHRoZSBjYXBhYmlsaXRpZXMgdG8gY2hlY2suCi0gICAgICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgcm91dGUgc3VwcG9ydHMgYXQgbGVhc3Qgb25lIG9mIHRoZSBjYXBhYmlsaXRpZXMKLSAgICAgICAgICogZGVzY3JpYmVkIGluIHRoZSBtZWRpYSByb3V0ZSBzZWxlY3Rvci4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBib29sZWFuIG1hdGNoZXNTZWxlY3RvcihATm9uTnVsbCBNZWRpYVJvdXRlU2VsZWN0b3Igc2VsZWN0b3IpIHsKLSAgICAgICAgICAgIGlmIChzZWxlY3RvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigic2VsZWN0b3IgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2hlY2tDYWxsaW5nVGhyZWFkKCk7Ci0gICAgICAgICAgICByZXR1cm4gc2VsZWN0b3IubWF0Y2hlc0NvbnRyb2xGaWx0ZXJzKG1Db250cm9sRmlsdGVycyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSByb3V0ZSBzdXBwb3J0cyB0aGUgc3BlY2lmaWVkCi0gICAgICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQgbWVkaWEgY29udHJvbH0gY2F0ZWdvcnkuCi0gICAgICAgICAqIDxwPgotICAgICAgICAgKiBNZWRpYSBjb250cm9sIGNhdGVnb3JpZXMgZGVzY3JpYmUgdGhlIGNhcGFiaWxpdGllcyBvZiB0aGlzIHJvdXRlCi0gICAgICAgICAqIHN1Y2ggYXMgd2hldGhlciBpdCBzdXBwb3J0cyBsaXZlIGF1ZGlvIHN0cmVhbWluZyBvciByZW1vdGUgcGxheWJhY2suCi0gICAgICAgICAqIDwvcD4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGNhdGVnb3J5IEEge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBtZWRpYSBjb250cm9sfSBjYXRlZ29yeQotICAgICAgICAgKiBzdWNoIGFzIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQ0FURUdPUllfTElWRV9BVURJT30sCi0gICAgICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQ0FURUdPUllfTElWRV9WSURFT30sCi0gICAgICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLfSwgb3IgYSBwcm92aWRlci1kZWZpbmVkCi0gICAgICAgICAqIG1lZGlhIGNvbnRyb2wgY2F0ZWdvcnkuCi0gICAgICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgcm91dGUgc3VwcG9ydHMgdGhlIHNwZWNpZmllZCBpbnRlbnQgY2F0ZWdvcnkuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBzZWUgTWVkaWFDb250cm9sSW50ZW50Ci0gICAgICAgICAqIEBzZWUgI2dldENvbnRyb2xGaWx0ZXJzCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c0NvbnRyb2xDYXRlZ29yeShATm9uTnVsbCBTdHJpbmcgY2F0ZWdvcnkpIHsKLSAgICAgICAgICAgIGlmIChjYXRlZ29yeSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY2F0ZWdvcnkgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2hlY2tDYWxsaW5nVGhyZWFkKCk7Ci0KLSAgICAgICAgICAgIGludCBjb3VudCA9IG1Db250cm9sRmlsdGVycy5zaXplKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAobUNvbnRyb2xGaWx0ZXJzLmdldChpKS5oYXNDYXRlZ29yeShjYXRlZ29yeSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcm91dGUgc3VwcG9ydHMgdGhlIHNwZWNpZmllZAotICAgICAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50IG1lZGlhIGNvbnRyb2x9IGNhdGVnb3J5IGFuZCBhY3Rpb24uCi0gICAgICAgICAqIDxwPgotICAgICAgICAgKiBNZWRpYSBjb250cm9sIGFjdGlvbnMgZGVzY3JpYmUgc3BlY2lmaWMgcmVxdWVzdHMgdGhhdCBhbiBhcHBsaWNhdGlvbgotICAgICAgICAgKiBjYW4gYXNrIGEgcm91dGUgdG8gcGVyZm9ybS4KLSAgICAgICAgICogPC9wPgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gY2F0ZWdvcnkgQSB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50IG1lZGlhIGNvbnRyb2x9IGNhdGVnb3J5Ci0gICAgICAgICAqIHN1Y2ggYXMge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNDQVRFR09SWV9MSVZFX0FVRElPfSwKLSAgICAgICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNDQVRFR09SWV9MSVZFX1ZJREVPfSwKLSAgICAgICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNDQVRFR09SWV9SRU1PVEVfUExBWUJBQ0t9LCBvciBhIHByb3ZpZGVyLWRlZmluZWQKLSAgICAgICAgICogbWVkaWEgY29udHJvbCBjYXRlZ29yeS4KLSAgICAgICAgICogQHBhcmFtIGFjdGlvbiBBIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQgbWVkaWEgY29udHJvbH0gYWN0aW9uCi0gICAgICAgICAqIHN1Y2ggYXMge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fUExBWX0uCi0gICAgICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgcm91dGUgc3VwcG9ydHMgdGhlIHNwZWNpZmllZCBpbnRlbnQgYWN0aW9uLgotICAgICAgICAgKgotICAgICAgICAgKiBAc2VlIE1lZGlhQ29udHJvbEludGVudAotICAgICAgICAgKiBAc2VlICNnZXRDb250cm9sRmlsdGVycwotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNDb250cm9sQWN0aW9uKEBOb25OdWxsIFN0cmluZyBjYXRlZ29yeSwgQE5vbk51bGwgU3RyaW5nIGFjdGlvbikgewotICAgICAgICAgICAgaWYgKGNhdGVnb3J5ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjYXRlZ29yeSBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoYWN0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJhY3Rpb24gbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2hlY2tDYWxsaW5nVGhyZWFkKCk7Ci0KLSAgICAgICAgICAgIGludCBjb3VudCA9IG1Db250cm9sRmlsdGVycy5zaXplKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICBJbnRlbnRGaWx0ZXIgZmlsdGVyID0gbUNvbnRyb2xGaWx0ZXJzLmdldChpKTsKLSAgICAgICAgICAgICAgICBpZiAoZmlsdGVyLmhhc0NhdGVnb3J5KGNhdGVnb3J5KSAmJiBmaWx0ZXIuaGFzQWN0aW9uKGFjdGlvbikpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcm91dGUgc3VwcG9ydHMgdGhlIHNwZWNpZmllZAotICAgICAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50IG1lZGlhIGNvbnRyb2x9IHJlcXVlc3QuCi0gICAgICAgICAqIDxwPgotICAgICAgICAgKiBNZWRpYSBjb250cm9sIHJlcXVlc3RzIGFyZSB1c2VkIHRvIHJlcXVlc3QgdGhlIHJvdXRlIHRvIHBlcmZvcm0KLSAgICAgICAgICogYWN0aW9ucyBzdWNoIGFzIHN0YXJ0aW5nIHJlbW90ZSBwbGF5YmFjayBvZiBhIG1lZGlhIGl0ZW0uCi0gICAgICAgICAqIDwvcD4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGludGVudCBBIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQgbWVkaWEgY29udHJvbCBpbnRlbnR9LgotICAgICAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHJvdXRlIGNhbiBoYW5kbGUgdGhlIHNwZWNpZmllZCBpbnRlbnQuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBzZWUgTWVkaWFDb250cm9sSW50ZW50Ci0gICAgICAgICAqIEBzZWUgI2dldENvbnRyb2xGaWx0ZXJzCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c0NvbnRyb2xSZXF1ZXN0KEBOb25OdWxsIEludGVudCBpbnRlbnQpIHsKLSAgICAgICAgICAgIGlmIChpbnRlbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludGVudCBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKLQotICAgICAgICAgICAgQ29udGVudFJlc29sdmVyIGNvbnRlbnRSZXNvbHZlciA9IHNHbG9iYWwuZ2V0Q29udGVudFJlc29sdmVyKCk7Ci0gICAgICAgICAgICBpbnQgY291bnQgPSBtQ29udHJvbEZpbHRlcnMuc2l6ZSgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1Db250cm9sRmlsdGVycy5nZXQoaSkubWF0Y2goY29udGVudFJlc29sdmVyLCBpbnRlbnQsIHRydWUsIFRBRykgPj0gMCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2VuZHMgYSB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50IG1lZGlhIGNvbnRyb2x9IHJlcXVlc3QgdG8gYmUgcGVyZm9ybWVkCi0gICAgICAgICAqIGFzeW5jaHJvbm91c2x5IGJ5IHRoZSByb3V0ZSdzIGRlc3RpbmF0aW9uLgotICAgICAgICAgKiA8cD4KLSAgICAgICAgICogTWVkaWEgY29udHJvbCByZXF1ZXN0cyBhcmUgdXNlZCB0byByZXF1ZXN0IHRoZSByb3V0ZSB0byBwZXJmb3JtCi0gICAgICAgICAqIGFjdGlvbnMgc3VjaCBhcyBzdGFydGluZyByZW1vdGUgcGxheWJhY2sgb2YgYSBtZWRpYSBpdGVtLgotICAgICAgICAgKiA8L3A+PHA+Ci0gICAgICAgICAqIFRoaXMgZnVuY3Rpb24gbWF5IG9ubHkgYmUgY2FsbGVkIG9uIGEgc2VsZWN0ZWQgcm91dGUuICBDb250cm9sIHJlcXVlc3RzCi0gICAgICAgICAqIHNlbnQgdG8gdW5zZWxlY3RlZCByb3V0ZXMgd2lsbCBmYWlsLgotICAgICAgICAgKiA8L3A+Ci0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBpbnRlbnQgQSB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50IG1lZGlhIGNvbnRyb2wgaW50ZW50fS4KLSAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrIEEge0BsaW5rIENvbnRyb2xSZXF1ZXN0Q2FsbGJhY2t9IHRvIGludm9rZSB3aXRoIHRoZSByZXN1bHQKLSAgICAgICAgICogb2YgdGhlIHJlcXVlc3QsIG9yIG51bGwgaWYgbm8gcmVzdWx0IGlzIHJlcXVpcmVkLgotICAgICAgICAgKgotICAgICAgICAgKiBAc2VlIE1lZGlhQ29udHJvbEludGVudAotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgc2VuZENvbnRyb2xSZXF1ZXN0KEBOb25OdWxsIEludGVudCBpbnRlbnQsCi0gICAgICAgICAgICAgICAgQE51bGxhYmxlIENvbnRyb2xSZXF1ZXN0Q2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgICAgIGlmIChpbnRlbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludGVudCBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKLQotICAgICAgICAgICAgc0dsb2JhbC5zZW5kQ29udHJvbFJlcXVlc3QodGhpcywgaW50ZW50LCBjYWxsYmFjayk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogR2V0cyB0aGUgdHlwZSBvZiBwbGF5YmFjayBhc3NvY2lhdGVkIHdpdGggdGhpcyByb3V0ZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiBUaGUgdHlwZSBvZiBwbGF5YmFjayBhc3NvY2lhdGVkIHdpdGggdGhpcyByb3V0ZToge0BsaW5rICNQTEFZQkFDS19UWVBFX0xPQ0FMfQotICAgICAgICAgKiBvciB7QGxpbmsgI1BMQVlCQUNLX1RZUEVfUkVNT1RFfS4KLSAgICAgICAgICovCi0gICAgICAgIEBQbGF5YmFja1R5cGUKLSAgICAgICAgcHVibGljIGludCBnZXRQbGF5YmFja1R5cGUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVBsYXliYWNrVHlwZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXRzIHRoZSBhdWRpbyBzdHJlYW0gb3ZlciB3aGljaCB0aGUgcGxheWJhY2sgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcm91dGUgaXMgcGVyZm9ybWVkLgotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIFRoZSBzdHJlYW0gb3ZlciB3aGljaCB0aGUgcGxheWJhY2sgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcm91dGUgaXMgcGVyZm9ybWVkLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGludCBnZXRQbGF5YmFja1N0cmVhbSgpIHsKLSAgICAgICAgICAgIHJldHVybiBtUGxheWJhY2tTdHJlYW07Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogR2V0cyB0aGUgdHlwZSBvZiB0aGUgcmVjZWl2ZXIgZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJvdXRlLgotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIFRoZSB0eXBlIG9mIHRoZSByZWNlaXZlciBkZXZpY2UgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcm91dGU6Ci0gICAgICAgICAqIHtAbGluayAjREVWSUNFX1RZUEVfVFZ9IG9yIHtAbGluayAjREVWSUNFX1RZUEVfU1BFQUtFUn0uCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgaW50IGdldERldmljZVR5cGUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbURldmljZVR5cGU7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBAaGlkZQotICAgICAgICAgKi8KLSAgICAgICAgLy8gQFJlc3RyaWN0VG8oTElCUkFSWV9HUk9VUCkKLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0T3JCbHVldG9vdGgoKSB7Ci0gICAgICAgICAgICBpZiAoaXNEZWZhdWx0KCkgfHwgbURldmljZVR5cGUgPT0gREVWSUNFX1RZUEVfQkxVRVRPT1RIKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBUaGlzIGlzIGEgd29ya2Fyb3VuZCBmb3IgcGxhdGZvcm0gdmVyc2lvbiAyMyBvciBiZWxvdyB3aGVyZSB0aGUgc3lzdGVtIHJvdXRlCi0gICAgICAgICAgICAvLyBwcm92aWRlciBkb2Vzbid0IHNwZWNpZnkgZGV2aWNlIHR5cGUgZm9yIGJsdWV0b290aCBtZWRpYSByb3V0ZXMuCi0gICAgICAgICAgICByZXR1cm4gaXNTeXN0ZW1NZWRpYVJvdXRlUHJvdmlkZXIodGhpcykKLSAgICAgICAgICAgICAgICAgICAgJiYgc3VwcG9ydHNDb250cm9sQ2F0ZWdvcnkoTWVkaWFDb250cm9sSW50ZW50LkNBVEVHT1JZX0xJVkVfQVVESU8pCi0gICAgICAgICAgICAgICAgICAgICYmICFzdXBwb3J0c0NvbnRyb2xDYXRlZ29yeShNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfTElWRV9WSURFTyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHJvdXRlIGlzIHNlbGVjdGFibGUuCi0gICAgICAgICAqLwotICAgICAgICBib29sZWFuIGlzU2VsZWN0YWJsZSgpIHsKLSAgICAgICAgICAgIC8vIFRoaXMgdGVzdHMgd2hldGhlciB0aGUgcm91dGUgaXMgc3RpbGwgdmFsaWQgYW5kIGVuYWJsZWQuCi0gICAgICAgICAgICAvLyBUaGUgcm91dGUgZGVzY3JpcHRvciBmaWVsZCBpcyBzZXQgdG8gbnVsbCB3aGVuIHRoZSByb3V0ZSBpcyByZW1vdmVkLgotICAgICAgICAgICAgcmV0dXJuIG1EZXNjcmlwdG9yICE9IG51bGwgJiYgbUVuYWJsZWQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzU3lzdGVtTWVkaWFSb3V0ZVByb3ZpZGVyKE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICAgICAgcmV0dXJuIFRleHRVdGlscy5lcXVhbHMocm91dGUuZ2V0UHJvdmlkZXJJbnN0YW5jZSgpLmdldE1ldGFkYXRhKCkuZ2V0UGFja2FnZU5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgU1lTVEVNX01FRElBX1JPVVRFX1BST1ZJREVSX1BBQ0tBR0VfTkFNRSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogR2V0cyBpbmZvcm1hdGlvbiBhYm91dCBob3cgdm9sdW1lIGlzIGhhbmRsZWQgb24gdGhlIHJvdXRlLgotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIEhvdyB2b2x1bWUgaXMgaGFuZGxlZCBvbiB0aGUgcm91dGU6IHtAbGluayAjUExBWUJBQ0tfVk9MVU1FX0ZJWEVEfQotICAgICAgICAgKiBvciB7QGxpbmsgI1BMQVlCQUNLX1ZPTFVNRV9WQVJJQUJMRX0uCi0gICAgICAgICAqLwotICAgICAgICBAUGxheWJhY2tWb2x1bWUKLSAgICAgICAgcHVibGljIGludCBnZXRWb2x1bWVIYW5kbGluZygpIHsKLSAgICAgICAgICAgIHJldHVybiBtVm9sdW1lSGFuZGxpbmc7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogR2V0cyB0aGUgY3VycmVudCB2b2x1bWUgZm9yIHRoaXMgcm91dGUuIERlcGVuZGluZyBvbiB0aGUgcm91dGUsIHRoaXMgbWF5IG9ubHkKLSAgICAgICAgICogYmUgdmFsaWQgaWYgdGhlIHJvdXRlIGlzIGN1cnJlbnRseSBzZWxlY3RlZC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiBUaGUgdm9sdW1lIGF0IHdoaWNoIHRoZSBwbGF5YmFjayBhc3NvY2lhdGVkIHdpdGggdGhpcyByb3V0ZSBpcyBwZXJmb3JtZWQuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgaW50IGdldFZvbHVtZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBtVm9sdW1lOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldHMgdGhlIG1heGltdW0gdm9sdW1lIGF0IHdoaWNoIHRoZSBwbGF5YmFjayBhc3NvY2lhdGVkIHdpdGggdGhpcyByb3V0ZSBpcyBwZXJmb3JtZWQuCi0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gVGhlIG1heGltdW0gdm9sdW1lIGF0IHdoaWNoIHRoZSBwbGF5YmFjayBhc3NvY2lhdGVkIHdpdGgKLSAgICAgICAgICogdGhpcyByb3V0ZSBpcyBwZXJmb3JtZWQuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgaW50IGdldFZvbHVtZU1heCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtVm9sdW1lTWF4OwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldHMgd2hldGhlciB0aGlzIHJvdXRlIHN1cHBvcnRzIGRpc2Nvbm5lY3Rpbmcgd2l0aG91dCBpbnRlcnJ1cHRpbmcKLSAgICAgICAgICogcGxheWJhY2suCi0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGlzIHJvdXRlIGNhbiBkaXNjb25uZWN0IHdpdGhvdXQgc3RvcHBpbmcgcGxheWJhY2ssCi0gICAgICAgICAqICAgICAgICAgZmFsc2Ugb3RoZXJ3aXNlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGJvb2xlYW4gY2FuRGlzY29ubmVjdCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtQ2FuRGlzY29ubmVjdDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXF1ZXN0cyBhIHZvbHVtZSBjaGFuZ2UgZm9yIHRoaXMgcm91dGUgYXN5bmNocm9ub3VzbHkuCi0gICAgICAgICAqIDxwPgotICAgICAgICAgKiBUaGlzIGZ1bmN0aW9uIG1heSBvbmx5IGJlIGNhbGxlZCBvbiBhIHNlbGVjdGVkIHJvdXRlLiAgSXQgd2lsbCBoYXZlCi0gICAgICAgICAqIG5vIGVmZmVjdCBpZiB0aGUgcm91dGUgaXMgY3VycmVudGx5IHVuc2VsZWN0ZWQuCi0gICAgICAgICAqIDwvcD4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHZvbHVtZSBUaGUgbmV3IHZvbHVtZSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIHtAbGluayAjZ2V0Vm9sdW1lTWF4fS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHJlcXVlc3RTZXRWb2x1bWUoaW50IHZvbHVtZSkgewotICAgICAgICAgICAgY2hlY2tDYWxsaW5nVGhyZWFkKCk7Ci0gICAgICAgICAgICBzR2xvYmFsLnJlcXVlc3RTZXRWb2x1bWUodGhpcywgTWF0aC5taW4obVZvbHVtZU1heCwgTWF0aC5tYXgoMCwgdm9sdW1lKSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJlcXVlc3RzIGFuIGluY3JlbWVudGFsIHZvbHVtZSB1cGRhdGUgZm9yIHRoaXMgcm91dGUgYXN5bmNocm9ub3VzbHkuCi0gICAgICAgICAqIDxwPgotICAgICAgICAgKiBUaGlzIGZ1bmN0aW9uIG1heSBvbmx5IGJlIGNhbGxlZCBvbiBhIHNlbGVjdGVkIHJvdXRlLiAgSXQgd2lsbCBoYXZlCi0gICAgICAgICAqIG5vIGVmZmVjdCBpZiB0aGUgcm91dGUgaXMgY3VycmVudGx5IHVuc2VsZWN0ZWQuCi0gICAgICAgICAqIDwvcD4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGRlbHRhIFRoZSBkZWx0YSB0byBhZGQgdG8gdGhlIGN1cnJlbnQgdm9sdW1lLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgcmVxdWVzdFVwZGF0ZVZvbHVtZShpbnQgZGVsdGEpIHsKLSAgICAgICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOwotICAgICAgICAgICAgaWYgKGRlbHRhICE9IDApIHsKLSAgICAgICAgICAgICAgICBzR2xvYmFsLnJlcXVlc3RVcGRhdGVWb2x1bWUodGhpcywgZGVsdGEpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldHMgdGhlIHtAbGluayBEaXNwbGF5fSB0aGF0IHNob3VsZCBiZSB1c2VkIGJ5IHRoZSBhcHBsaWNhdGlvbiB0byBzaG93Ci0gICAgICAgICAqIGEge0BsaW5rIGFuZHJvaWQuYXBwLlByZXNlbnRhdGlvbn0gb24gYW4gZXh0ZXJuYWwgZGlzcGxheSB3aGVuIHRoaXMgcm91dGUgaXMgc2VsZWN0ZWQuCi0gICAgICAgICAqIERlcGVuZGluZyBvbiB0aGUgcm91dGUsIHRoaXMgbWF5IG9ubHkgYmUgdmFsaWQgaWYgdGhlIHJvdXRlIGlzIGN1cnJlbnRseQotICAgICAgICAgKiBzZWxlY3RlZC4KLSAgICAgICAgICogPHA+Ci0gICAgICAgICAqIFRoZSBwcmVmZXJyZWQgcHJlc2VudGF0aW9uIGRpc3BsYXkgbWF5IGNoYW5nZSBpbmRlcGVuZGVudGx5IG9mIHRoZSByb3V0ZQotICAgICAgICAgKiBiZWluZyBzZWxlY3RlZCBvciB1bnNlbGVjdGVkLiAgRm9yIGV4YW1wbGUsIHRoZSBwcmVzZW50YXRpb24gZGlzcGxheQotICAgICAgICAgKiBvZiB0aGUgZGVmYXVsdCBzeXN0ZW0gcm91dGUgbWF5IGNoYW5nZSB3aGVuIGFuIGV4dGVybmFsIEhETUkgZGlzcGxheSBpcyBjb25uZWN0ZWQKLSAgICAgICAgICogb3IgZGlzY29ubmVjdGVkIGV2ZW4gdGhvdWdoIHRoZSByb3V0ZSBpdHNlbGYgaGFzIG5vdCBjaGFuZ2VkLgotICAgICAgICAgKiA8L3A+PHA+Ci0gICAgICAgICAqIFRoaXMgbWV0aG9kIG1heSByZXR1cm4gbnVsbCBpZiB0aGVyZSBpcyBubyBleHRlcm5hbCBkaXNwbGF5IGFzc29jaWF0ZWQgd2l0aAotICAgICAgICAgKiB0aGUgcm91dGUgb3IgaWYgdGhlIGRpc3BsYXkgaXMgbm90IHJlYWR5IHRvIHNob3cgVUkgeWV0LgotICAgICAgICAgKiA8L3A+PHA+Ci0gICAgICAgICAqIFRoZSBhcHBsaWNhdGlvbiBzaG91bGQgbGlzdGVuIGZvciBjaGFuZ2VzIHRvIHRoZSBwcmVzZW50YXRpb24gZGlzcGxheQotICAgICAgICAgKiB1c2luZyB0aGUge0BsaW5rIENhbGxiYWNrI29uUm91dGVQcmVzZW50YXRpb25EaXNwbGF5Q2hhbmdlZH0gY2FsbGJhY2sgYW5kCi0gICAgICAgICAqIHNob3cgb3IgZGlzbWlzcyBpdHMge0BsaW5rIGFuZHJvaWQuYXBwLlByZXNlbnRhdGlvbn0gYWNjb3JkaW5nbHkgd2hlbiB0aGUgZGlzcGxheQotICAgICAgICAgKiBiZWNvbWVzIGF2YWlsYWJsZSBvciBpcyByZW1vdmVkLgotICAgICAgICAgKiA8L3A+PHA+Ci0gICAgICAgICAqIFRoaXMgbWV0aG9kIG9ubHkgbWFrZXMgc2Vuc2UgZm9yCi0gICAgICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQ0FURUdPUllfTElWRV9WSURFTyBsaXZlIHZpZGVvfSByb3V0ZXMuCi0gICAgICAgICAqIDwvcD4KLSAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiBUaGUgcHJlZmVycmVkIHByZXNlbnRhdGlvbiBkaXNwbGF5IHRvIHVzZSB3aGVuIHRoaXMgcm91dGUgaXMKLSAgICAgICAgICogc2VsZWN0ZWQgb3IgbnVsbCBpZiBub25lLgotICAgICAgICAgKgotICAgICAgICAgKiBAc2VlIE1lZGlhQ29udHJvbEludGVudCNDQVRFR09SWV9MSVZFX1ZJREVPCi0gICAgICAgICAqIEBzZWUgYW5kcm9pZC5hcHAuUHJlc2VudGF0aW9uCi0gICAgICAgICAqLwotICAgICAgICBATnVsbGFibGUKLSAgICAgICAgcHVibGljIERpc3BsYXkgZ2V0UHJlc2VudGF0aW9uRGlzcGxheSgpIHsKLSAgICAgICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOwotICAgICAgICAgICAgaWYgKG1QcmVzZW50YXRpb25EaXNwbGF5SWQgPj0gMCAmJiBtUHJlc2VudGF0aW9uRGlzcGxheSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVByZXNlbnRhdGlvbkRpc3BsYXkgPSBzR2xvYmFsLmdldERpc3BsYXkobVByZXNlbnRhdGlvbkRpc3BsYXlJZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbVByZXNlbnRhdGlvbkRpc3BsYXk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogR2V0cyB0aGUgcm91dGUncyBwcmVzZW50YXRpb24gZGlzcGxheSBpZCwgb3IgLTEgaWYgbm9uZS4KLSAgICAgICAgICogQGhpZGUKLSAgICAgICAgICovCi0gICAgICAgIC8vIEBSZXN0cmljdFRvKExJQlJBUllfR1JPVVApCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0UHJlc2VudGF0aW9uRGlzcGxheUlkKCkgewotICAgICAgICAgICAgcmV0dXJuIG1QcmVzZW50YXRpb25EaXNwbGF5SWQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogR2V0cyBhIGNvbGxlY3Rpb24gb2YgZXh0cmEgcHJvcGVydGllcyBhYm91dCB0aGlzIHJvdXRlIHRoYXQgd2VyZSBzdXBwbGllZAotICAgICAgICAgKiBieSBpdHMgbWVkaWEgcm91dGUgcHJvdmlkZXIsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgICAgICovCi0gICAgICAgIEBOdWxsYWJsZQotICAgICAgICBwdWJsaWMgQnVuZGxlIGdldEV4dHJhcygpIHsKLSAgICAgICAgICAgIHJldHVybiBtRXh0cmFzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldHMgYW4gaW50ZW50IHNlbmRlciBmb3IgbGF1bmNoaW5nIGEgc2V0dGluZ3MgYWN0aXZpdHkgZm9yIHRoaXMKLSAgICAgICAgICogcm91dGUuCi0gICAgICAgICAqLwotICAgICAgICBATnVsbGFibGUKLSAgICAgICAgcHVibGljIEludGVudFNlbmRlciBnZXRTZXR0aW5nc0ludGVudCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtU2V0dGluZ3NJbnRlbnQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2VsZWN0cyB0aGlzIG1lZGlhIHJvdXRlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgc2VsZWN0KCkgewotICAgICAgICAgICAgY2hlY2tDYWxsaW5nVGhyZWFkKCk7Ci0gICAgICAgICAgICBzR2xvYmFsLnNlbGVjdFJvdXRlKHRoaXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgICAgICByZXR1cm4gIk1lZGlhUm91dGVyLlJvdXRlSW5mb3sgdW5pcXVlSWQ9IiArIG1VbmlxdWVJZAotICAgICAgICAgICAgICAgICAgICArICIsIG5hbWU9IiArIG1OYW1lCi0gICAgICAgICAgICAgICAgICAgICsgIiwgZGVzY3JpcHRpb249IiArIG1EZXNjcmlwdGlvbgotICAgICAgICAgICAgICAgICAgICArICIsIGljb25Vcmk9IiArIG1JY29uVXJpCi0gICAgICAgICAgICAgICAgICAgICsgIiwgZW5hYmxlZD0iICsgbUVuYWJsZWQKLSAgICAgICAgICAgICAgICAgICAgKyAiLCBjb25uZWN0aW5nPSIgKyBtQ29ubmVjdGluZwotICAgICAgICAgICAgICAgICAgICArICIsIGNvbm5lY3Rpb25TdGF0ZT0iICsgbUNvbm5lY3Rpb25TdGF0ZQotICAgICAgICAgICAgICAgICAgICArICIsIGNhbkRpc2Nvbm5lY3Q9IiArIG1DYW5EaXNjb25uZWN0Ci0gICAgICAgICAgICAgICAgICAgICsgIiwgcGxheWJhY2tUeXBlPSIgKyBtUGxheWJhY2tUeXBlCi0gICAgICAgICAgICAgICAgICAgICsgIiwgcGxheWJhY2tTdHJlYW09IiArIG1QbGF5YmFja1N0cmVhbQotICAgICAgICAgICAgICAgICAgICArICIsIGRldmljZVR5cGU9IiArIG1EZXZpY2VUeXBlCi0gICAgICAgICAgICAgICAgICAgICsgIiwgdm9sdW1lSGFuZGxpbmc9IiArIG1Wb2x1bWVIYW5kbGluZwotICAgICAgICAgICAgICAgICAgICArICIsIHZvbHVtZT0iICsgbVZvbHVtZQotICAgICAgICAgICAgICAgICAgICArICIsIHZvbHVtZU1heD0iICsgbVZvbHVtZU1heAotICAgICAgICAgICAgICAgICAgICArICIsIHByZXNlbnRhdGlvbkRpc3BsYXlJZD0iICsgbVByZXNlbnRhdGlvbkRpc3BsYXlJZAotICAgICAgICAgICAgICAgICAgICArICIsIGV4dHJhcz0iICsgbUV4dHJhcwotICAgICAgICAgICAgICAgICAgICArICIsIHNldHRpbmdzSW50ZW50PSIgKyBtU2V0dGluZ3NJbnRlbnQKLSAgICAgICAgICAgICAgICAgICAgKyAiLCBwcm92aWRlclBhY2thZ2VOYW1lPSIgKyBtUHJvdmlkZXIuZ2V0UGFja2FnZU5hbWUoKQotICAgICAgICAgICAgICAgICAgICArICIgfSI7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgbWF5YmVVcGRhdGVEZXNjcmlwdG9yKE1lZGlhUm91dGVEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLSAgICAgICAgICAgIGludCBjaGFuZ2VzID0gMDsKLSAgICAgICAgICAgIGlmIChtRGVzY3JpcHRvciAhPSBkZXNjcmlwdG9yKSB7Ci0gICAgICAgICAgICAgICAgY2hhbmdlcyA9IHVwZGF0ZURlc2NyaXB0b3IoZGVzY3JpcHRvcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gY2hhbmdlczsKLSAgICAgICAgfQotCi0gICAgICAgIGludCB1cGRhdGVEZXNjcmlwdG9yKE1lZGlhUm91dGVEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLSAgICAgICAgICAgIGludCBjaGFuZ2VzID0gMDsKLSAgICAgICAgICAgIG1EZXNjcmlwdG9yID0gZGVzY3JpcHRvcjsKLSAgICAgICAgICAgIGlmIChkZXNjcmlwdG9yICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoIWVxdWFsKG1OYW1lLCBkZXNjcmlwdG9yLmdldE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgbU5hbWUgPSBkZXNjcmlwdG9yLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgY2hhbmdlcyB8PSBDSEFOR0VfR0VORVJBTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCFlcXVhbChtRGVzY3JpcHRpb24sIGRlc2NyaXB0b3IuZ2V0RGVzY3JpcHRpb24oKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgbURlc2NyaXB0aW9uID0gZGVzY3JpcHRvci5nZXREZXNjcmlwdGlvbigpOwotICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzIHw9IENIQU5HRV9HRU5FUkFMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoIWVxdWFsKG1JY29uVXJpLCBkZXNjcmlwdG9yLmdldEljb25VcmkoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgbUljb25VcmkgPSBkZXNjcmlwdG9yLmdldEljb25VcmkoKTsKLSAgICAgICAgICAgICAgICAgICAgY2hhbmdlcyB8PSBDSEFOR0VfR0VORVJBTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1FbmFibGVkICE9IGRlc2NyaXB0b3IuaXNFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbUVuYWJsZWQgPSBkZXNjcmlwdG9yLmlzRW5hYmxlZCgpOwotICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzIHw9IENIQU5HRV9HRU5FUkFMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobUNvbm5lY3RpbmcgIT0gZGVzY3JpcHRvci5pc0Nvbm5lY3RpbmcoKSkgewotICAgICAgICAgICAgICAgICAgICBtQ29ubmVjdGluZyA9IGRlc2NyaXB0b3IuaXNDb25uZWN0aW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgIGNoYW5nZXMgfD0gQ0hBTkdFX0dFTkVSQUw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtQ29ubmVjdGlvblN0YXRlICE9IGRlc2NyaXB0b3IuZ2V0Q29ubmVjdGlvblN0YXRlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbUNvbm5lY3Rpb25TdGF0ZSA9IGRlc2NyaXB0b3IuZ2V0Q29ubmVjdGlvblN0YXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGNoYW5nZXMgfD0gQ0hBTkdFX0dFTkVSQUw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICghbUNvbnRyb2xGaWx0ZXJzLmVxdWFscyhkZXNjcmlwdG9yLmdldENvbnRyb2xGaWx0ZXJzKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Db250cm9sRmlsdGVycy5jbGVhcigpOwotICAgICAgICAgICAgICAgICAgICBtQ29udHJvbEZpbHRlcnMuYWRkQWxsKGRlc2NyaXB0b3IuZ2V0Q29udHJvbEZpbHRlcnMoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGNoYW5nZXMgfD0gQ0hBTkdFX0dFTkVSQUw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtUGxheWJhY2tUeXBlICE9IGRlc2NyaXB0b3IuZ2V0UGxheWJhY2tUeXBlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbVBsYXliYWNrVHlwZSA9IGRlc2NyaXB0b3IuZ2V0UGxheWJhY2tUeXBlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGNoYW5nZXMgfD0gQ0hBTkdFX0dFTkVSQUw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtUGxheWJhY2tTdHJlYW0gIT0gZGVzY3JpcHRvci5nZXRQbGF5YmFja1N0cmVhbSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1QbGF5YmFja1N0cmVhbSA9IGRlc2NyaXB0b3IuZ2V0UGxheWJhY2tTdHJlYW0oKTsKLSAgICAgICAgICAgICAgICAgICAgY2hhbmdlcyB8PSBDSEFOR0VfR0VORVJBTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1EZXZpY2VUeXBlICE9IGRlc2NyaXB0b3IuZ2V0RGV2aWNlVHlwZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1EZXZpY2VUeXBlID0gZGVzY3JpcHRvci5nZXREZXZpY2VUeXBlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGNoYW5nZXMgfD0gQ0hBTkdFX0dFTkVSQUw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtVm9sdW1lSGFuZGxpbmcgIT0gZGVzY3JpcHRvci5nZXRWb2x1bWVIYW5kbGluZygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Wb2x1bWVIYW5kbGluZyA9IGRlc2NyaXB0b3IuZ2V0Vm9sdW1lSGFuZGxpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgY2hhbmdlcyB8PSBDSEFOR0VfR0VORVJBTCB8IENIQU5HRV9WT0xVTUU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtVm9sdW1lICE9IGRlc2NyaXB0b3IuZ2V0Vm9sdW1lKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbVZvbHVtZSA9IGRlc2NyaXB0b3IuZ2V0Vm9sdW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIGNoYW5nZXMgfD0gQ0hBTkdFX0dFTkVSQUwgfCBDSEFOR0VfVk9MVU1FOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobVZvbHVtZU1heCAhPSBkZXNjcmlwdG9yLmdldFZvbHVtZU1heCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Wb2x1bWVNYXggPSBkZXNjcmlwdG9yLmdldFZvbHVtZU1heCgpOwotICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzIHw9IENIQU5HRV9HRU5FUkFMIHwgQ0hBTkdFX1ZPTFVNRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1QcmVzZW50YXRpb25EaXNwbGF5SWQgIT0gZGVzY3JpcHRvci5nZXRQcmVzZW50YXRpb25EaXNwbGF5SWQoKSkgewotICAgICAgICAgICAgICAgICAgICBtUHJlc2VudGF0aW9uRGlzcGxheUlkID0gZGVzY3JpcHRvci5nZXRQcmVzZW50YXRpb25EaXNwbGF5SWQoKTsKLSAgICAgICAgICAgICAgICAgICAgbVByZXNlbnRhdGlvbkRpc3BsYXkgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzIHw9IENIQU5HRV9HRU5FUkFMIHwgQ0hBTkdFX1BSRVNFTlRBVElPTl9ESVNQTEFZOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoIWVxdWFsKG1FeHRyYXMsIGRlc2NyaXB0b3IuZ2V0RXh0cmFzKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1FeHRyYXMgPSBkZXNjcmlwdG9yLmdldEV4dHJhcygpOwotICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzIHw9IENIQU5HRV9HRU5FUkFMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoIWVxdWFsKG1TZXR0aW5nc0ludGVudCwgZGVzY3JpcHRvci5nZXRTZXR0aW5nc0FjdGl2aXR5KCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TZXR0aW5nc0ludGVudCA9IGRlc2NyaXB0b3IuZ2V0U2V0dGluZ3NBY3Rpdml0eSgpOwotICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzIHw9IENIQU5HRV9HRU5FUkFMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobUNhbkRpc2Nvbm5lY3QgIT0gZGVzY3JpcHRvci5jYW5EaXNjb25uZWN0QW5kS2VlcFBsYXlpbmcoKSkgewotICAgICAgICAgICAgICAgICAgICBtQ2FuRGlzY29ubmVjdCA9IGRlc2NyaXB0b3IuY2FuRGlzY29ubmVjdEFuZEtlZXBQbGF5aW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgIGNoYW5nZXMgfD0gQ0hBTkdFX0dFTkVSQUwgfCBDSEFOR0VfUFJFU0VOVEFUSU9OX0RJU1BMQVk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGNoYW5nZXM7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgZ2V0RGVzY3JpcHRvcklkKCkgewotICAgICAgICAgICAgcmV0dXJuIG1EZXNjcmlwdG9ySWQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiogQGhpZGUgKi8KLSAgICAgICAgLy8gQFJlc3RyaWN0VG8oTElCUkFSWV9HUk9VUCkKLSAgICAgICAgcHVibGljIE1lZGlhUm91dGVQcm92aWRlciBnZXRQcm92aWRlckluc3RhbmNlKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Qcm92aWRlci5nZXRQcm92aWRlckluc3RhbmNlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbmZvcm1hdGlvbiBhYm91dCBhIHJvdXRlIHRoYXQgY29uc2lzdHMgb2YgbXVsdGlwbGUgb3RoZXIgcm91dGVzIGluIGEgZ3JvdXAuCi0gICAgICogQGhpZGUKLSAgICAgKi8KLSAgICAvLyBAUmVzdHJpY3RUbyhMSUJSQVJZX0dST1VQKQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUm91dGVHcm91cCBleHRlbmRzIFJvdXRlSW5mbyB7Ci0gICAgICAgIHByaXZhdGUgTGlzdDxSb3V0ZUluZm8+IG1Sb3V0ZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLQotICAgICAgICBSb3V0ZUdyb3VwKFByb3ZpZGVySW5mbyBwcm92aWRlciwgU3RyaW5nIGRlc2NyaXB0b3JJZCwgU3RyaW5nIHVuaXF1ZUlkKSB7Ci0gICAgICAgICAgICBzdXBlcihwcm92aWRlciwgZGVzY3JpcHRvcklkLCB1bmlxdWVJZCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQHJldHVybiBUaGUgbnVtYmVyIG9mIHJvdXRlcyBpbiB0aGlzIGdyb3VwCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgaW50IGdldFJvdXRlQ291bnQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVJvdXRlcy5zaXplKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyB0aGUgcm91dGUgaW4gdGhpcyBncm91cCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4Ci0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBpbmRleCBJbmRleCB0byBmZXRjaAotICAgICAgICAgKiBAcmV0dXJuIFRoZSByb3V0ZSBhdCBpbmRleAotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFJvdXRlSW5mbyBnZXRSb3V0ZUF0KGludCBpbmRleCkgewotICAgICAgICAgICAgcmV0dXJuIG1Sb3V0ZXMuZ2V0KGluZGV4KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIHRoZSByb3V0ZXMgaW4gdGhpcyBncm91cAotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIHRoZSByb3V0ZXMgaW4gdGhpcyBncm91cAotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIExpc3Q8Um91dGVJbmZvPiBnZXRSb3V0ZXMoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVJvdXRlczsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKHN1cGVyLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgc2IuYXBwZW5kKCdbJyk7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBtUm91dGVzLnNpemUoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgIGlmIChpID4gMCkgc2IuYXBwZW5kKCIsICIpOwotICAgICAgICAgICAgICAgIHNiLmFwcGVuZChtUm91dGVzLmdldChpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzYi5hcHBlbmQoJ10nKTsKLSAgICAgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIGludCBtYXliZVVwZGF0ZURlc2NyaXB0b3IoTWVkaWFSb3V0ZURlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotICAgICAgICAgICAgYm9vbGVhbiBjaGFuZ2VkID0gZmFsc2U7Ci0gICAgICAgICAgICBpZiAobURlc2NyaXB0b3IgIT0gZGVzY3JpcHRvcikgewotICAgICAgICAgICAgICAgIG1EZXNjcmlwdG9yID0gZGVzY3JpcHRvcjsKLSAgICAgICAgICAgICAgICBpZiAoZGVzY3JpcHRvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBncm91cE1lbWJlcklkcyA9IGRlc2NyaXB0b3IuZ2V0R3JvdXBNZW1iZXJJZHMoKTsKLSAgICAgICAgICAgICAgICAgICAgTGlzdDxSb3V0ZUluZm8+IHJvdXRlcyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkID0gZ3JvdXBNZW1iZXJJZHMuc2l6ZSgpICE9IG1Sb3V0ZXMuc2l6ZSgpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBncm91cE1lbWJlcklkIDogZ3JvdXBNZW1iZXJJZHMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB1bmlxdWVJZCA9IHNHbG9iYWwuZ2V0VW5pcXVlSWQoZ2V0UHJvdmlkZXIoKSwgZ3JvdXBNZW1iZXJJZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBSb3V0ZUluZm8gZ3JvdXBNZW1iZXIgPSBzR2xvYmFsLmdldFJvdXRlKHVuaXF1ZUlkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChncm91cE1lbWJlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91dGVzLmFkZChncm91cE1lbWJlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjaGFuZ2VkICYmICFtUm91dGVzLmNvbnRhaW5zKGdyb3VwTWVtYmVyKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGNoYW5nZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Sb3V0ZXMgPSByb3V0ZXM7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gKGNoYW5nZWQgPyBDSEFOR0VfR0VORVJBTCA6IDApIHwgc3VwZXIudXBkYXRlRGVzY3JpcHRvcihkZXNjcmlwdG9yKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByb3ZpZGVzIGluZm9ybWF0aW9uIGFib3V0IGEgbWVkaWEgcm91dGUgcHJvdmlkZXIuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBvYmplY3QgbWF5IGJlIHVzZWQgdG8gZGV0ZXJtaW5lIHdoaWNoIG1lZGlhIHJvdXRlIHByb3ZpZGVyIGhhcwotICAgICAqIHB1Ymxpc2hlZCBhIHBhcnRpY3VsYXIgcm91dGUuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgUHJvdmlkZXJJbmZvIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBNZWRpYVJvdXRlUHJvdmlkZXIgbVByb3ZpZGVySW5zdGFuY2U7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgTGlzdDxSb3V0ZUluZm8+IG1Sb3V0ZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLQotICAgICAgICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyTWV0YWRhdGEgbU1ldGFkYXRhOwotICAgICAgICBwcml2YXRlIE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IgbURlc2NyaXB0b3I7Ci0gICAgICAgIHByaXZhdGUgUmVzb3VyY2VzIG1SZXNvdXJjZXM7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBtUmVzb3VyY2VzTm90QXZhaWxhYmxlOwotCi0gICAgICAgIFByb3ZpZGVySW5mbyhNZWRpYVJvdXRlUHJvdmlkZXIgcHJvdmlkZXIpIHsKLSAgICAgICAgICAgIG1Qcm92aWRlckluc3RhbmNlID0gcHJvdmlkZXI7Ci0gICAgICAgICAgICBtTWV0YWRhdGEgPSBwcm92aWRlci5nZXRNZXRhZGF0YSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldHMgdGhlIHByb3ZpZGVyJ3MgdW5kZXJseWluZyB7QGxpbmsgTWVkaWFSb3V0ZVByb3ZpZGVyfSBpbnN0YW5jZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBNZWRpYVJvdXRlUHJvdmlkZXIgZ2V0UHJvdmlkZXJJbnN0YW5jZSgpIHsKLSAgICAgICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOwotICAgICAgICAgICAgcmV0dXJuIG1Qcm92aWRlckluc3RhbmNlOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldHMgdGhlIHBhY2thZ2UgbmFtZSBvZiB0aGUgbWVkaWEgcm91dGUgcHJvdmlkZXIuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2VOYW1lKCkgewotICAgICAgICAgICAgcmV0dXJuIG1NZXRhZGF0YS5nZXRQYWNrYWdlTmFtZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldHMgdGhlIGNvbXBvbmVudCBuYW1lIG9mIHRoZSBtZWRpYSByb3V0ZSBwcm92aWRlci4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBDb21wb25lbnROYW1lIGdldENvbXBvbmVudE5hbWUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbU1ldGFkYXRhLmdldENvbXBvbmVudE5hbWUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXRzIHRoZSB7QGxpbmsgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlc30gcHVibGlzaGVkIGJ5IHRoaXMgcm91dGUgcHJvdmlkZXIuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgTGlzdDxSb3V0ZUluZm8+IGdldFJvdXRlcygpIHsKLSAgICAgICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOwotICAgICAgICAgICAgcmV0dXJuIG1Sb3V0ZXM7Ci0gICAgICAgIH0KLQotICAgICAgICBSZXNvdXJjZXMgZ2V0UmVzb3VyY2VzKCkgewotICAgICAgICAgICAgaWYgKG1SZXNvdXJjZXMgPT0gbnVsbCAmJiAhbVJlc291cmNlc05vdEF2YWlsYWJsZSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSA9IGdldFBhY2thZ2VOYW1lKCk7Ci0gICAgICAgICAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gc0dsb2JhbC5nZXRQcm92aWRlckNvbnRleHQocGFja2FnZU5hbWUpOwotICAgICAgICAgICAgICAgIGlmIChjb250ZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcyA9IGNvbnRleHQuZ2V0UmVzb3VyY2VzKCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiVW5hYmxlIHRvIG9idGFpbiByZXNvdXJjZXMgZm9yIHJvdXRlIHByb3ZpZGVyIHBhY2thZ2U6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHBhY2thZ2VOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlc05vdEF2YWlsYWJsZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG1SZXNvdXJjZXM7Ci0gICAgICAgIH0KLQotICAgICAgICBib29sZWFuIHVwZGF0ZURlc2NyaXB0b3IoTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0gICAgICAgICAgICBpZiAobURlc2NyaXB0b3IgIT0gZGVzY3JpcHRvcikgewotICAgICAgICAgICAgICAgIG1EZXNjcmlwdG9yID0gZGVzY3JpcHRvcjsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBmaW5kUm91dGVCeURlc2NyaXB0b3JJZChTdHJpbmcgaWQpIHsKLSAgICAgICAgICAgIGZpbmFsIGludCBjb3VudCA9IG1Sb3V0ZXMuc2l6ZSgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1Sb3V0ZXMuZ2V0KGkpLm1EZXNjcmlwdG9ySWQuZXF1YWxzKGlkKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgICAgIHJldHVybiAiTWVkaWFSb3V0ZXIuUm91dGVQcm92aWRlckluZm97IHBhY2thZ2VOYW1lPSIgKyBnZXRQYWNrYWdlTmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICsgIiB9IjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEludGVyZmFjZSBmb3IgcmVjZWl2aW5nIGV2ZW50cyBhYm91dCBtZWRpYSByb3V0aW5nIGNoYW5nZXMuCi0gICAgICogQWxsIG1ldGhvZHMgb2YgdGhpcyBpbnRlcmZhY2Ugd2lsbCBiZSBjYWxsZWQgZnJvbSB0aGUgYXBwbGljYXRpb24ncyBtYWluIHRocmVhZC4KLSAgICAgKiA8cD4KLSAgICAgKiBBIENhbGxiYWNrIHdpbGwgb25seSByZWNlaXZlIGV2ZW50cyByZWxldmFudCB0byByb3V0ZXMgdGhhdCB0aGUgY2FsbGJhY2sKLSAgICAgKiB3YXMgcmVnaXN0ZXJlZCBmb3IgdW5sZXNzIHRoZSB7QGxpbmsgTWVkaWFSb3V0ZXIjQ0FMTEJBQ0tfRkxBR19VTkZJTFRFUkVEX0VWRU5UU30KLSAgICAgKiBmbGFnIHdhcyBzcGVjaWZpZWQgaW4ge0BsaW5rIE1lZGlhUm91dGVyI2FkZENhbGxiYWNrKE1lZGlhUm91dGVTZWxlY3RvciwgQ2FsbGJhY2ssIGludCl9LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFSb3V0ZXIjYWRkQ2FsbGJhY2soTWVkaWFSb3V0ZVNlbGVjdG9yLCBDYWxsYmFjaywgaW50KQotICAgICAqIEBzZWUgTWVkaWFSb3V0ZXIjcmVtb3ZlQ2FsbGJhY2soQ2FsbGJhY2spCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBDYWxsYmFjayB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgc3VwcGxpZWQgbWVkaWEgcm91dGUgYmVjb21lcyBzZWxlY3RlZCBhcyB0aGUgYWN0aXZlIHJvdXRlLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gcm91dGVyIFRoZSBtZWRpYSByb3V0ZXIgcmVwb3J0aW5nIHRoZSBldmVudC4KLSAgICAgICAgICogQHBhcmFtIHJvdXRlIFRoZSByb3V0ZSB0aGF0IGhhcyBiZWVuIHNlbGVjdGVkLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVNlbGVjdGVkKE1lZGlhUm91dGVyIHJvdXRlciwgUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIHdoZW4gdGhlIHN1cHBsaWVkIG1lZGlhIHJvdXRlIGJlY29tZXMgdW5zZWxlY3RlZCBhcyB0aGUgYWN0aXZlIHJvdXRlLgotICAgICAgICAgKiBGb3IgZGV0YWlsZWQgcmVhc29uLCBvdmVycmlkZSB7QGxpbmsgI29uUm91dGVVbnNlbGVjdGVkKE1lZGlhUm91dGVyLCBSb3V0ZUluZm8sIGludCl9Ci0gICAgICAgICAqIGluc3RlYWQuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSByb3V0ZXIgVGhlIG1lZGlhIHJvdXRlciByZXBvcnRpbmcgdGhlIGV2ZW50LgotICAgICAgICAgKiBAcGFyYW0gcm91dGUgVGhlIHJvdXRlIHRoYXQgaGFzIGJlZW4gdW5zZWxlY3RlZC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVVbnNlbGVjdGVkKE1lZGlhUm91dGVyIHJvdXRlciwgUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIHdoZW4gdGhlIHN1cHBsaWVkIG1lZGlhIHJvdXRlIGJlY29tZXMgdW5zZWxlY3RlZCBhcyB0aGUgYWN0aXZlIHJvdXRlLgotICAgICAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBjYWxscyB7QGxpbmsgI29uUm91dGVVbnNlbGVjdGVkfS4KLSAgICAgICAgICogPHA+Ci0gICAgICAgICAqIFRoZSByZWFzb24gcHJvdmlkZWQgd2lsbCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLSAgICAgICAgICogPHVsPgotICAgICAgICAgKiA8bGk+e0BsaW5rIE1lZGlhUm91dGVyI1VOU0VMRUNUX1JFQVNPTl9VTktOT1dOfTwvbGk+Ci0gICAgICAgICAqIDxsaT57QGxpbmsgTWVkaWFSb3V0ZXIjVU5TRUxFQ1RfUkVBU09OX0RJU0NPTk5FQ1RFRH08L2xpPgotICAgICAgICAgKiA8bGk+e0BsaW5rIE1lZGlhUm91dGVyI1VOU0VMRUNUX1JFQVNPTl9TVE9QUEVEfTwvbGk+Ci0gICAgICAgICAqIDxsaT57QGxpbmsgTWVkaWFSb3V0ZXIjVU5TRUxFQ1RfUkVBU09OX1JPVVRFX0NIQU5HRUR9PC9saT4KLSAgICAgICAgICogPC91bD4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHJvdXRlciBUaGUgbWVkaWEgcm91dGVyIHJlcG9ydGluZyB0aGUgZXZlbnQuCi0gICAgICAgICAqIEBwYXJhbSByb3V0ZSBUaGUgcm91dGUgdGhhdCBoYXMgYmVlbiB1bnNlbGVjdGVkLgotICAgICAgICAgKiBAcGFyYW0gcmVhc29uIFRoZSByZWFzb24gZm9yIHVuc2VsZWN0aW5nIHRoZSByb3V0ZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVVbnNlbGVjdGVkKE1lZGlhUm91dGVyIHJvdXRlciwgUm91dGVJbmZvIHJvdXRlLCBpbnQgcmVhc29uKSB7Ci0gICAgICAgICAgICBvblJvdXRlVW5zZWxlY3RlZChyb3V0ZXIsIHJvdXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgd2hlbiBhIG1lZGlhIHJvdXRlIGhhcyBiZWVuIGFkZGVkLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gcm91dGVyIFRoZSBtZWRpYSByb3V0ZXIgcmVwb3J0aW5nIHRoZSBldmVudC4KLSAgICAgICAgICogQHBhcmFtIHJvdXRlIFRoZSByb3V0ZSB0aGF0IGhhcyBiZWNvbWUgYXZhaWxhYmxlIGZvciB1c2UuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlQWRkZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBSb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgd2hlbiBhIG1lZGlhIHJvdXRlIGhhcyBiZWVuIHJlbW92ZWQuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSByb3V0ZXIgVGhlIG1lZGlhIHJvdXRlciByZXBvcnRpbmcgdGhlIGV2ZW50LgotICAgICAgICAgKiBAcGFyYW0gcm91dGUgVGhlIHJvdXRlIHRoYXQgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIGF2YWlsYWJpbGl0eS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVSZW1vdmVkKE1lZGlhUm91dGVyIHJvdXRlciwgUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIHdoZW4gYSBwcm9wZXJ0eSBvZiB0aGUgaW5kaWNhdGVkIG1lZGlhIHJvdXRlIGhhcyBjaGFuZ2VkLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gcm91dGVyIFRoZSBtZWRpYSByb3V0ZXIgcmVwb3J0aW5nIHRoZSBldmVudC4KLSAgICAgICAgICogQHBhcmFtIHJvdXRlIFRoZSByb3V0ZSB0aGF0IHdhcyBjaGFuZ2VkLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZUNoYW5nZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBSb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgd2hlbiBhIG1lZGlhIHJvdXRlJ3Mgdm9sdW1lIGNoYW5nZXMuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSByb3V0ZXIgVGhlIG1lZGlhIHJvdXRlciByZXBvcnRpbmcgdGhlIGV2ZW50LgotICAgICAgICAgKiBAcGFyYW0gcm91dGUgVGhlIHJvdXRlIHdob3NlIHZvbHVtZSBjaGFuZ2VkLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVZvbHVtZUNoYW5nZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBSb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgd2hlbiBhIG1lZGlhIHJvdXRlJ3MgcHJlc2VudGF0aW9uIGRpc3BsYXkgY2hhbmdlcy4KLSAgICAgICAgICogPHA+Ci0gICAgICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuZXZlciB0aGUgcm91dGUncyBwcmVzZW50YXRpb24gZGlzcGxheSBiZWNvbWVzCi0gICAgICAgICAqIGF2YWlsYWJsZSwgaXMgcmVtb3ZlZCBvciBoYXMgY2hhbmdlcyB0byBzb21lIG9mIGl0cyBwcm9wZXJ0aWVzIChzdWNoIGFzIGl0cyBzaXplKS4KLSAgICAgICAgICogPC9wPgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gcm91dGVyIFRoZSBtZWRpYSByb3V0ZXIgcmVwb3J0aW5nIHRoZSBldmVudC4KLSAgICAgICAgICogQHBhcmFtIHJvdXRlIFRoZSByb3V0ZSB3aG9zZSBwcmVzZW50YXRpb24gZGlzcGxheSBjaGFuZ2VkLgotICAgICAgICAgKgotICAgICAgICAgKiBAc2VlIFJvdXRlSW5mbyNnZXRQcmVzZW50YXRpb25EaXNwbGF5KCkKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVQcmVzZW50YXRpb25EaXNwbGF5Q2hhbmdlZChNZWRpYVJvdXRlciByb3V0ZXIsIFJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxlZCB3aGVuIGEgbWVkaWEgcm91dGUgcHJvdmlkZXIgaGFzIGJlZW4gYWRkZWQuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSByb3V0ZXIgVGhlIG1lZGlhIHJvdXRlciByZXBvcnRpbmcgdGhlIGV2ZW50LgotICAgICAgICAgKiBAcGFyYW0gcHJvdmlkZXIgVGhlIHByb3ZpZGVyIHRoYXQgaGFzIGJlY29tZSBhdmFpbGFibGUgZm9yIHVzZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUHJvdmlkZXJBZGRlZChNZWRpYVJvdXRlciByb3V0ZXIsIFByb3ZpZGVySW5mbyBwcm92aWRlcikgewotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxlZCB3aGVuIGEgbWVkaWEgcm91dGUgcHJvdmlkZXIgaGFzIGJlZW4gcmVtb3ZlZC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHJvdXRlciBUaGUgbWVkaWEgcm91dGVyIHJlcG9ydGluZyB0aGUgZXZlbnQuCi0gICAgICAgICAqIEBwYXJhbSBwcm92aWRlciBUaGUgcHJvdmlkZXIgdGhhdCBoYXMgYmVlbiByZW1vdmVkIGZyb20gYXZhaWxhYmlsaXR5LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25Qcm92aWRlclJlbW92ZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBQcm92aWRlckluZm8gcHJvdmlkZXIpIHsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgd2hlbiBhIHByb3BlcnR5IG9mIHRoZSBpbmRpY2F0ZWQgbWVkaWEgcm91dGUgcHJvdmlkZXIgaGFzIGNoYW5nZWQuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSByb3V0ZXIgVGhlIG1lZGlhIHJvdXRlciByZXBvcnRpbmcgdGhlIGV2ZW50LgotICAgICAgICAgKiBAcGFyYW0gcHJvdmlkZXIgVGhlIHByb3ZpZGVyIHRoYXQgd2FzIGNoYW5nZWQuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBvblByb3ZpZGVyQ2hhbmdlZChNZWRpYVJvdXRlciByb3V0ZXIsIFByb3ZpZGVySW5mbyBwcm92aWRlcikgewotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGJhY2sgd2hpY2ggaXMgaW52b2tlZCB3aXRoIHRoZSByZXN1bHQgb2YgYSBtZWRpYSBjb250cm9sIHJlcXVlc3QuCi0gICAgICoKLSAgICAgKiBAc2VlIFJvdXRlSW5mbyNzZW5kQ29udHJvbFJlcXVlc3QKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIENvbnRyb2xSZXF1ZXN0Q2FsbGJhY2sgewotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIHdoZW4gYSBtZWRpYSBjb250cm9sIHJlcXVlc3Qgc3VjY2VlZHMuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBkYXRhIFJlc3VsdCBkYXRhLCBvciBudWxsIGlmIG5vbmUuCi0gICAgICAgICAqIENvbnRlbnRzIGRlcGVuZCBvbiB0aGUge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBtZWRpYSBjb250cm9sIGFjdGlvbn0uCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBvblJlc3VsdChCdW5kbGUgZGF0YSkgewotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxlZCB3aGVuIGEgbWVkaWEgY29udHJvbCByZXF1ZXN0IGZhaWxzLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gZXJyb3IgQSBsb2NhbGl6ZWQgZXJyb3IgbWVzc2FnZSB3aGljaCBtYXkgYmUgc2hvd24gdG8gdGhlIHVzZXIsIG9yIG51bGwKLSAgICAgICAgICogaWYgdGhlIGNhdXNlIG9mIHRoZSBlcnJvciBpcyB1bmNsZWFyLgotICAgICAgICAgKiBAcGFyYW0gZGF0YSBFcnJvciBkYXRhLCBvciBudWxsIGlmIG5vbmUuCi0gICAgICAgICAqIENvbnRlbnRzIGRlcGVuZCBvbiB0aGUge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBtZWRpYSBjb250cm9sIGFjdGlvbn0uCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBvbkVycm9yKFN0cmluZyBlcnJvciwgQnVuZGxlIGRhdGEpIHsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIENhbGxiYWNrUmVjb3JkIHsKLSAgICAgICAgcHVibGljIGZpbmFsIE1lZGlhUm91dGVyIG1Sb3V0ZXI7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBDYWxsYmFjayBtQ2FsbGJhY2s7Ci0gICAgICAgIHB1YmxpYyBNZWRpYVJvdXRlU2VsZWN0b3IgbVNlbGVjdG9yOwotICAgICAgICBwdWJsaWMgaW50IG1GbGFnczsKLQotICAgICAgICBwdWJsaWMgQ2FsbGJhY2tSZWNvcmQoTWVkaWFSb3V0ZXIgcm91dGVyLCBDYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICAgICAgbVJvdXRlciA9IHJvdXRlcjsKLSAgICAgICAgICAgIG1DYWxsYmFjayA9IGNhbGxiYWNrOwotICAgICAgICAgICAgbVNlbGVjdG9yID0gTWVkaWFSb3V0ZVNlbGVjdG9yLkVNUFRZOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gZmlsdGVyUm91dGVFdmVudChSb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgICAgIHJldHVybiAobUZsYWdzICYgQ0FMTEJBQ0tfRkxBR19VTkZJTFRFUkVEX0VWRU5UUykgIT0gMAotICAgICAgICAgICAgICAgICAgICB8fCByb3V0ZS5tYXRjaGVzU2VsZWN0b3IobVNlbGVjdG9yKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdsb2JhbCBzdGF0ZSBmb3IgdGhlIG1lZGlhIHJvdXRlci4KLSAgICAgKiA8cD4KLSAgICAgKiBNZWRpYSByb3V0ZXMgYW5kIG1lZGlhIHJvdXRlIHByb3ZpZGVycyBhcmUgZ2xvYmFsIHRvIHRoZSBwcm9jZXNzOyB0aGVpcgotICAgICAqIHN0YXRlIGFuZCB0aGUgYnVsayBvZiB0aGUgbWVkaWEgcm91dGVyIGltcGxlbWVudGF0aW9uIGxpdmVzIGhlcmUuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIEdsb2JhbE1lZGlhUm91dGVyCi0gICAgICAgICAgICBpbXBsZW1lbnRzIFN5c3RlbU1lZGlhUm91dGVQcm92aWRlci5TeW5jQ2FsbGJhY2ssCi0gICAgICAgICAgICBSZWdpc3RlcmVkTWVkaWFSb3V0ZVByb3ZpZGVyV2F0Y2hlci5DYWxsYmFjayB7Ci0gICAgICAgIGZpbmFsIENvbnRleHQgbUFwcGxpY2F0aW9uQ29udGV4dDsKLSAgICAgICAgZmluYWwgQXJyYXlMaXN0PFdlYWtSZWZlcmVuY2U8TWVkaWFSb3V0ZXI+PiBtUm91dGVycyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxSb3V0ZUluZm8+IG1Sb3V0ZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBNYXA8UGFpcjxTdHJpbmcsIFN0cmluZz4sIFN0cmluZz4gbVVuaXF1ZUlkTWFwID0gbmV3IEhhc2hNYXA8PigpOwotICAgICAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxQcm92aWRlckluZm8+IG1Qcm92aWRlcnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8UmVtb3RlQ29udHJvbENsaWVudFJlY29yZD4gbVJlbW90ZUNvbnRyb2xDbGllbnRzID0KLSAgICAgICAgICAgICAgICBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgZmluYWwgUmVtb3RlQ29udHJvbENsaWVudENvbXBhdC5QbGF5YmFja0luZm8gbVBsYXliYWNrSW5mbyA9Ci0gICAgICAgICAgICAgICAgbmV3IFJlbW90ZUNvbnRyb2xDbGllbnRDb21wYXQuUGxheWJhY2tJbmZvKCk7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgUHJvdmlkZXJDYWxsYmFjayBtUHJvdmlkZXJDYWxsYmFjayA9IG5ldyBQcm92aWRlckNhbGxiYWNrKCk7Ci0gICAgICAgIGZpbmFsIENhbGxiYWNrSGFuZGxlciBtQ2FsbGJhY2tIYW5kbGVyID0gbmV3IENhbGxiYWNrSGFuZGxlcigpOwotICAgICAgICBwcml2YXRlIGZpbmFsIERpc3BsYXlNYW5hZ2VyQ29tcGF0IG1EaXNwbGF5TWFuYWdlcjsKLSAgICAgICAgZmluYWwgU3lzdGVtTWVkaWFSb3V0ZVByb3ZpZGVyIG1TeXN0ZW1Qcm92aWRlcjsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1Mb3dSYW07Ci0KLSAgICAgICAgcHJpdmF0ZSBSZWdpc3RlcmVkTWVkaWFSb3V0ZVByb3ZpZGVyV2F0Y2hlciBtUmVnaXN0ZXJlZFByb3ZpZGVyV2F0Y2hlcjsKLSAgICAgICAgcHJpdmF0ZSBSb3V0ZUluZm8gbURlZmF1bHRSb3V0ZTsKLSAgICAgICAgcHJpdmF0ZSBSb3V0ZUluZm8gbUJsdWV0b290aFJvdXRlOwotICAgICAgICBSb3V0ZUluZm8gbVNlbGVjdGVkUm91dGU7Ci0gICAgICAgIHByaXZhdGUgUm91dGVDb250cm9sbGVyIG1TZWxlY3RlZFJvdXRlQ29udHJvbGxlcjsKLSAgICAgICAgLy8gQSBtYXAgZnJvbSByb3V0ZSBkZXNjcmlwdG9yIElEIHRvIFJvdXRlQ29udHJvbGxlciBmb3IgdGhlIG1lbWJlciByb3V0ZXMgaW4gdGhlIGN1cnJlbnRseQotICAgICAgICAvLyBzZWxlY3RlZCByb3V0ZSBncm91cC4KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBSb3V0ZUNvbnRyb2xsZXI+IG1Sb3V0ZUNvbnRyb2xsZXJNYXAgPSBuZXcgSGFzaE1hcDw+KCk7Ci0gICAgICAgIHByaXZhdGUgTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3QgbURpc2NvdmVyeVJlcXVlc3Q7Ci0gICAgICAgIHByaXZhdGUgTWVkaWFTZXNzaW9uUmVjb3JkIG1NZWRpYVNlc3Npb247Ci0gICAgICAgIE1lZGlhU2Vzc2lvbkNvbXBhdCBtUmNjTWVkaWFTZXNzaW9uOwotICAgICAgICBwcml2YXRlIE1lZGlhU2Vzc2lvbkNvbXBhdCBtQ29tcGF0U2Vzc2lvbjsKLSAgICAgICAgcHJpdmF0ZSBNZWRpYVNlc3Npb25Db21wYXQuT25BY3RpdmVDaGFuZ2VMaXN0ZW5lciBtU2Vzc2lvbkFjdGl2ZUxpc3RlbmVyID0KLSAgICAgICAgICAgICAgICBuZXcgTWVkaWFTZXNzaW9uQ29tcGF0Lk9uQWN0aXZlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQWN0aXZlQ2hhbmdlZCgpIHsKLSAgICAgICAgICAgICAgICBpZihtUmNjTWVkaWFTZXNzaW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1SY2NNZWRpYVNlc3Npb24uaXNBY3RpdmUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYWRkUmVtb3RlQ29udHJvbENsaWVudChtUmNjTWVkaWFTZXNzaW9uLmdldFJlbW90ZUNvbnRyb2xDbGllbnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVSZW1vdGVDb250cm9sQ2xpZW50KG1SY2NNZWRpYVNlc3Npb24uZ2V0UmVtb3RlQ29udHJvbENsaWVudCgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLQotICAgICAgICBHbG9iYWxNZWRpYVJvdXRlcihDb250ZXh0IGFwcGxpY2F0aW9uQ29udGV4dCkgewotICAgICAgICAgICAgbUFwcGxpY2F0aW9uQ29udGV4dCA9IGFwcGxpY2F0aW9uQ29udGV4dDsKLSAgICAgICAgICAgIG1EaXNwbGF5TWFuYWdlciA9IERpc3BsYXlNYW5hZ2VyQ29tcGF0LmdldEluc3RhbmNlKGFwcGxpY2F0aW9uQ29udGV4dCk7Ci0gICAgICAgICAgICBtTG93UmFtID0gQWN0aXZpdHlNYW5hZ2VyQ29tcGF0LmlzTG93UmFtRGV2aWNlKAotICAgICAgICAgICAgICAgICAgICAoQWN0aXZpdHlNYW5hZ2VyKWFwcGxpY2F0aW9uQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRleHQuQUNUSVZJVFlfU0VSVklDRSkpOwotCi0gICAgICAgICAgICAvLyBBZGQgdGhlIHN5c3RlbSBtZWRpYSByb3V0ZSBwcm92aWRlciBmb3IgaW50ZXJvcGVyYXRpbmcgd2l0aAotICAgICAgICAgICAgLy8gdGhlIGZyYW1ld29yayBtZWRpYSByb3V0ZXIuICBUaGlzIG9uZSBpcyBzcGVjaWFsIGFuZCByZWNlaXZlcwotICAgICAgICAgICAgLy8gc3luY2hyb25pemF0aW9uIG1lc3NhZ2VzIGZyb20gdGhlIG1lZGlhIHJvdXRlci4KLSAgICAgICAgICAgIG1TeXN0ZW1Qcm92aWRlciA9IFN5c3RlbU1lZGlhUm91dGVQcm92aWRlci5vYnRhaW4oYXBwbGljYXRpb25Db250ZXh0LCB0aGlzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgewotICAgICAgICAgICAgYWRkUHJvdmlkZXIobVN5c3RlbVByb3ZpZGVyKTsKLQotICAgICAgICAgICAgLy8gU3RhcnQgd2F0Y2hpbmcgZm9yIHJvdXRlcyBwdWJsaXNoZWQgYnkgcmVnaXN0ZXJlZCBtZWRpYSByb3V0ZQotICAgICAgICAgICAgLy8gcHJvdmlkZXIgc2VydmljZXMuCi0gICAgICAgICAgICBtUmVnaXN0ZXJlZFByb3ZpZGVyV2F0Y2hlciA9IG5ldyBSZWdpc3RlcmVkTWVkaWFSb3V0ZVByb3ZpZGVyV2F0Y2hlcigKLSAgICAgICAgICAgICAgICAgICAgbUFwcGxpY2F0aW9uQ29udGV4dCwgdGhpcyk7Ci0gICAgICAgICAgICBtUmVnaXN0ZXJlZFByb3ZpZGVyV2F0Y2hlci5zdGFydCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE1lZGlhUm91dGVyIGdldFJvdXRlcihDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgICAgIE1lZGlhUm91dGVyIHJvdXRlcjsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSBtUm91dGVycy5zaXplKCk7IC0taSA+PSAwOyApIHsKLSAgICAgICAgICAgICAgICByb3V0ZXIgPSBtUm91dGVycy5nZXQoaSkuZ2V0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJvdXRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Sb3V0ZXJzLnJlbW92ZShpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJvdXRlci5tQ29udGV4dCA9PSBjb250ZXh0KSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiByb3V0ZXI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcm91dGVyID0gbmV3IE1lZGlhUm91dGVyKGNvbnRleHQpOwotICAgICAgICAgICAgbVJvdXRlcnMuYWRkKG5ldyBXZWFrUmVmZXJlbmNlPE1lZGlhUm91dGVyPihyb3V0ZXIpKTsKLSAgICAgICAgICAgIHJldHVybiByb3V0ZXI7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgQ29udGVudFJlc29sdmVyIGdldENvbnRlbnRSZXNvbHZlcigpIHsKLSAgICAgICAgICAgIHJldHVybiBtQXBwbGljYXRpb25Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIENvbnRleHQgZ2V0UHJvdmlkZXJDb250ZXh0KFN0cmluZyBwYWNrYWdlTmFtZSkgewotICAgICAgICAgICAgaWYgKHBhY2thZ2VOYW1lLmVxdWFscyhTeXN0ZW1NZWRpYVJvdXRlUHJvdmlkZXIuUEFDS0FHRV9OQU1FKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBtQXBwbGljYXRpb25Db250ZXh0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbUFwcGxpY2F0aW9uQ29udGV4dC5jcmVhdGVQYWNrYWdlQ29udGV4dCgKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhY2thZ2VOYW1lLCBDb250ZXh0LkNPTlRFWFRfUkVTVFJJQ1RFRCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChOYW1lTm90Rm91bmRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBEaXNwbGF5IGdldERpc3BsYXkoaW50IGRpc3BsYXlJZCkgewotICAgICAgICAgICAgcmV0dXJuIG1EaXNwbGF5TWFuYWdlci5nZXREaXNwbGF5KGRpc3BsYXlJZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZW5kQ29udHJvbFJlcXVlc3QoUm91dGVJbmZvIHJvdXRlLAotICAgICAgICAgICAgICAgIEludGVudCBpbnRlbnQsIENvbnRyb2xSZXF1ZXN0Q2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgICAgIGlmIChyb3V0ZSA9PSBtU2VsZWN0ZWRSb3V0ZSAmJiBtU2VsZWN0ZWRSb3V0ZUNvbnRyb2xsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChtU2VsZWN0ZWRSb3V0ZUNvbnRyb2xsZXIub25Db250cm9sUmVxdWVzdChpbnRlbnQsIGNhbGxiYWNrKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGNhbGxiYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjYWxsYmFjay5vbkVycm9yKG51bGwsIG51bGwpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgcmVxdWVzdFNldFZvbHVtZShSb3V0ZUluZm8gcm91dGUsIGludCB2b2x1bWUpIHsKLSAgICAgICAgICAgIGlmIChyb3V0ZSA9PSBtU2VsZWN0ZWRSb3V0ZSAmJiBtU2VsZWN0ZWRSb3V0ZUNvbnRyb2xsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1TZWxlY3RlZFJvdXRlQ29udHJvbGxlci5vblNldFZvbHVtZSh2b2x1bWUpOwotICAgICAgICAgICAgfSBlbHNlIGlmICghbVJvdXRlQ29udHJvbGxlck1hcC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBSb3V0ZUNvbnRyb2xsZXIgY29udHJvbGxlciA9IG1Sb3V0ZUNvbnRyb2xsZXJNYXAuZ2V0KHJvdXRlLm1EZXNjcmlwdG9ySWQpOwotICAgICAgICAgICAgICAgIGlmIChjb250cm9sbGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5vblNldFZvbHVtZSh2b2x1bWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHJlcXVlc3RVcGRhdGVWb2x1bWUoUm91dGVJbmZvIHJvdXRlLCBpbnQgZGVsdGEpIHsKLSAgICAgICAgICAgIGlmIChyb3V0ZSA9PSBtU2VsZWN0ZWRSb3V0ZSAmJiBtU2VsZWN0ZWRSb3V0ZUNvbnRyb2xsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1TZWxlY3RlZFJvdXRlQ29udHJvbGxlci5vblVwZGF0ZVZvbHVtZShkZWx0YSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgUm91dGVJbmZvIGdldFJvdXRlKFN0cmluZyB1bmlxdWVJZCkgewotICAgICAgICAgICAgZm9yIChSb3V0ZUluZm8gaW5mbyA6IG1Sb3V0ZXMpIHsKLSAgICAgICAgICAgICAgICBpZiAoaW5mby5tVW5pcXVlSWQuZXF1YWxzKHVuaXF1ZUlkKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5mbzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBMaXN0PFJvdXRlSW5mbz4gZ2V0Um91dGVzKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Sb3V0ZXM7Ci0gICAgICAgIH0KLQotICAgICAgICBMaXN0PFByb3ZpZGVySW5mbz4gZ2V0UHJvdmlkZXJzKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Qcm92aWRlcnM7Ci0gICAgICAgIH0KLQotICAgICAgICBATm9uTnVsbCBSb3V0ZUluZm8gZ2V0RGVmYXVsdFJvdXRlKCkgewotICAgICAgICAgICAgaWYgKG1EZWZhdWx0Um91dGUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiBvbmNlIHRoZSBtZWRpYSByb3V0ZXIgaGFzIGJlZW4gZnVsbHkKLSAgICAgICAgICAgICAgICAvLyBpbml0aWFsaXplZCBidXQgaXQgaXMgZ29vZCB0byBjaGVjayBmb3IgdGhlIGVycm9yIGluIGNhc2UgdGhlcmUKLSAgICAgICAgICAgICAgICAvLyBpcyBhIGJ1ZyBpbiBwcm92aWRlciBpbml0aWFsaXphdGlvbi4KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUaGVyZSBpcyBubyBkZWZhdWx0IHJvdXRlLiAgIgotICAgICAgICAgICAgICAgICAgICAgICAgKyAiVGhlIG1lZGlhIHJvdXRlciBoYXMgbm90IHlldCBiZWVuIGZ1bGx5IGluaXRpYWxpemVkLiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG1EZWZhdWx0Um91dGU7Ci0gICAgICAgIH0KLQotICAgICAgICBSb3V0ZUluZm8gZ2V0Qmx1ZXRvb3RoUm91dGUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUJsdWV0b290aFJvdXRlOwotICAgICAgICB9Ci0KLSAgICAgICAgQE5vbk51bGwgUm91dGVJbmZvIGdldFNlbGVjdGVkUm91dGUoKSB7Ci0gICAgICAgICAgICBpZiAobVNlbGVjdGVkUm91dGUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiBvbmNlIHRoZSBtZWRpYSByb3V0ZXIgaGFzIGJlZW4gZnVsbHkKLSAgICAgICAgICAgICAgICAvLyBpbml0aWFsaXplZCBidXQgaXQgaXMgZ29vZCB0byBjaGVjayBmb3IgdGhlIGVycm9yIGluIGNhc2UgdGhlcmUKLSAgICAgICAgICAgICAgICAvLyBpcyBhIGJ1ZyBpbiBwcm92aWRlciBpbml0aWFsaXphdGlvbi4KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUaGVyZSBpcyBubyBjdXJyZW50bHkgc2VsZWN0ZWQgcm91dGUuICAiCi0gICAgICAgICAgICAgICAgICAgICAgICArICJUaGUgbWVkaWEgcm91dGVyIGhhcyBub3QgeWV0IGJlZW4gZnVsbHkgaW5pdGlhbGl6ZWQuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbVNlbGVjdGVkUm91dGU7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHNlbGVjdFJvdXRlKEBOb25OdWxsIFJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICAgICAgc2VsZWN0Um91dGUocm91dGUsIE1lZGlhUm91dGVyLlVOU0VMRUNUX1JFQVNPTl9ST1VURV9DSEFOR0VEKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgc2VsZWN0Um91dGUoQE5vbk51bGwgUm91dGVJbmZvIHJvdXRlLCBpbnQgdW5zZWxlY3RSZWFzb24pIHsKLSAgICAgICAgICAgIGlmICghbVJvdXRlcy5jb250YWlucyhyb3V0ZSkpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJJZ25vcmluZyBhdHRlbXB0IHRvIHNlbGVjdCByZW1vdmVkIHJvdXRlOiAiICsgcm91dGUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghcm91dGUubUVuYWJsZWQpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJJZ25vcmluZyBhdHRlbXB0IHRvIHNlbGVjdCBkaXNhYmxlZCByb3V0ZTogIiArIHJvdXRlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXRTZWxlY3RlZFJvdXRlSW50ZXJuYWwocm91dGUsIHVuc2VsZWN0UmVhc29uKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzUm91dGVBdmFpbGFibGUoTWVkaWFSb3V0ZVNlbGVjdG9yIHNlbGVjdG9yLCBpbnQgZmxhZ3MpIHsKLSAgICAgICAgICAgIGlmIChzZWxlY3Rvci5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIE9uIGxvdy1SQU0gZGV2aWNlcywgZG8gbm90IHJlbHkgb24gYWN0dWFsIGRpc2NvdmVyeSByZXN1bHRzIHVubGVzcyBhc2tlZCB0by4KLSAgICAgICAgICAgIGlmICgoZmxhZ3MgJiBBVkFJTEFCSUxJVFlfRkxBR19SRVFVSVJFX01BVENIKSA9PSAwICYmIG1Mb3dSYW0pIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gQ2hlY2sgd2hldGhlciBhbnkgZXhpc3Rpbmcgcm91dGVzIG1hdGNoIHRoZSBzZWxlY3Rvci4KLSAgICAgICAgICAgIGZpbmFsIGludCByb3V0ZUNvdW50ID0gbVJvdXRlcy5zaXplKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJvdXRlQ291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgIFJvdXRlSW5mbyByb3V0ZSA9IG1Sb3V0ZXMuZ2V0KGkpOwotICAgICAgICAgICAgICAgIGlmICgoZmxhZ3MgJiBBVkFJTEFCSUxJVFlfRkxBR19JR05PUkVfREVGQVVMVF9ST1VURSkgIT0gMAotICAgICAgICAgICAgICAgICAgICAgICAgJiYgcm91dGUuaXNEZWZhdWx0T3JCbHVldG9vdGgoKSkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHJvdXRlLm1hdGNoZXNTZWxlY3RvcihzZWxlY3RvcikpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBJdCBkb2Vzbid0IGxvb2sgbGlrZSB3ZSBjYW4gZmluZCBhIG1hdGNoaW5nIHJvdXRlIHJpZ2h0IG5vdy4KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHVwZGF0ZURpc2NvdmVyeVJlcXVlc3QoKSB7Ci0gICAgICAgICAgICAvLyBDb21iaW5lIGFsbCBvZiB0aGUgY2FsbGJhY2sgc2VsZWN0b3JzIGFuZCBhY3RpdmUgc2NhbiBmbGFncy4KLSAgICAgICAgICAgIGJvb2xlYW4gZGlzY292ZXIgPSBmYWxzZTsKLSAgICAgICAgICAgIGJvb2xlYW4gYWN0aXZlU2NhbiA9IGZhbHNlOwotICAgICAgICAgICAgTWVkaWFSb3V0ZVNlbGVjdG9yLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBNZWRpYVJvdXRlU2VsZWN0b3IuQnVpbGRlcigpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IG1Sb3V0ZXJzLnNpemUoKTsgLS1pID49IDA7ICkgewotICAgICAgICAgICAgICAgIE1lZGlhUm91dGVyIHJvdXRlciA9IG1Sb3V0ZXJzLmdldChpKS5nZXQoKTsKLSAgICAgICAgICAgICAgICBpZiAocm91dGVyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbVJvdXRlcnMucmVtb3ZlKGkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBjb3VudCA9IHJvdXRlci5tQ2FsbGJhY2tSZWNvcmRzLnNpemUoKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBjb3VudDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDYWxsYmFja1JlY29yZCBjYWxsYmFjayA9IHJvdXRlci5tQ2FsbGJhY2tSZWNvcmRzLmdldChqKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYWRkU2VsZWN0b3IoY2FsbGJhY2subVNlbGVjdG9yKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoY2FsbGJhY2subUZsYWdzICYgQ0FMTEJBQ0tfRkxBR19QRVJGT1JNX0FDVElWRV9TQ0FOKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlU2NhbiA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzY292ZXIgPSB0cnVlOyAvLyBwZXJmb3JtIGFjdGl2ZSBzY2FuIGltcGxpZXMgcmVxdWVzdCBkaXNjb3ZlcnkKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoY2FsbGJhY2subUZsYWdzICYgQ0FMTEJBQ0tfRkxBR19SRVFVRVNUX0RJU0NPVkVSWSkgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbUxvd1JhbSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNjb3ZlciA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChjYWxsYmFjay5tRmxhZ3MgJiBDQUxMQkFDS19GTEFHX0ZPUkNFX0RJU0NPVkVSWSkgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2NvdmVyID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIE1lZGlhUm91dGVTZWxlY3RvciBzZWxlY3RvciA9IGRpc2NvdmVyID8gYnVpbGRlci5idWlsZCgpIDogTWVkaWFSb3V0ZVNlbGVjdG9yLkVNUFRZOwotCi0gICAgICAgICAgICAvLyBDcmVhdGUgYSBuZXcgZGlzY292ZXJ5IHJlcXVlc3QuCi0gICAgICAgICAgICBpZiAobURpc2NvdmVyeVJlcXVlc3QgIT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAmJiBtRGlzY292ZXJ5UmVxdWVzdC5nZXRTZWxlY3RvcigpLmVxdWFscyhzZWxlY3RvcikKLSAgICAgICAgICAgICAgICAgICAgJiYgbURpc2NvdmVyeVJlcXVlc3QuaXNBY3RpdmVTY2FuKCkgPT0gYWN0aXZlU2NhbikgewotICAgICAgICAgICAgICAgIHJldHVybjsgLy8gbm8gY2hhbmdlCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc2VsZWN0b3IuaXNFbXB0eSgpICYmICFhY3RpdmVTY2FuKSB7Ci0gICAgICAgICAgICAgICAgLy8gRGlzY292ZXJ5IGlzIG5vdCBuZWVkZWQuCi0gICAgICAgICAgICAgICAgaWYgKG1EaXNjb3ZlcnlSZXF1ZXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOyAvLyBubyBjaGFuZ2UKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbURpc2NvdmVyeVJlcXVlc3QgPSBudWxsOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBEaXNjb3ZlcnkgaXMgbmVlZGVkLgotICAgICAgICAgICAgICAgIG1EaXNjb3ZlcnlSZXF1ZXN0ID0gbmV3IE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0KHNlbGVjdG9yLCBhY3RpdmVTY2FuKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlVwZGF0ZWQgZGlzY292ZXJ5IHJlcXVlc3Q6ICIgKyBtRGlzY292ZXJ5UmVxdWVzdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZGlzY292ZXIgJiYgIWFjdGl2ZVNjYW4gJiYgbUxvd1JhbSkgewotICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIkZvcmNpbmcgcGFzc2l2ZSByb3V0ZSBkaXNjb3Zlcnkgb24gYSBsb3ctUkFNIGRldmljZSwgIgotICAgICAgICAgICAgICAgICAgICAgICAgKyAic3lzdGVtIHBlcmZvcm1hbmNlIG1heSBiZSBhZmZlY3RlZC4gIFBsZWFzZSBjb25zaWRlciB1c2luZyAiCi0gICAgICAgICAgICAgICAgICAgICAgICArICJDQUxMQkFDS19GTEFHX1JFUVVFU1RfRElTQ09WRVJZIGluc3RlYWQgb2YgIgotICAgICAgICAgICAgICAgICAgICAgICAgKyAiQ0FMTEJBQ0tfRkxBR19GT1JDRV9ESVNDT1ZFUlkuIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIE5vdGlmeSBwcm92aWRlcnMuCi0gICAgICAgICAgICBmaW5hbCBpbnQgcHJvdmlkZXJDb3VudCA9IG1Qcm92aWRlcnMuc2l6ZSgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm92aWRlckNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICBtUHJvdmlkZXJzLmdldChpKS5tUHJvdmlkZXJJbnN0YW5jZS5zZXREaXNjb3ZlcnlSZXF1ZXN0KG1EaXNjb3ZlcnlSZXF1ZXN0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBhZGRQcm92aWRlcihNZWRpYVJvdXRlUHJvdmlkZXIgcHJvdmlkZXJJbnN0YW5jZSkgewotICAgICAgICAgICAgaW50IGluZGV4ID0gZmluZFByb3ZpZGVySW5mbyhwcm92aWRlckluc3RhbmNlKTsKLSAgICAgICAgICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgICAgICAgICAvLyAxLiBBZGQgdGhlIHByb3ZpZGVyIHRvIHRoZSBsaXN0LgotICAgICAgICAgICAgICAgIFByb3ZpZGVySW5mbyBwcm92aWRlciA9IG5ldyBQcm92aWRlckluZm8ocHJvdmlkZXJJbnN0YW5jZSk7Ci0gICAgICAgICAgICAgICAgbVByb3ZpZGVycy5hZGQocHJvdmlkZXIpOwotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJQcm92aWRlciBhZGRlZDogIiArIHByb3ZpZGVyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUNhbGxiYWNrSGFuZGxlci5wb3N0KENhbGxiYWNrSGFuZGxlci5NU0dfUFJPVklERVJfQURERUQsIHByb3ZpZGVyKTsKLSAgICAgICAgICAgICAgICAvLyAyLiBDcmVhdGUgdGhlIHByb3ZpZGVyJ3MgY29udGVudHMuCi0gICAgICAgICAgICAgICAgdXBkYXRlUHJvdmlkZXJDb250ZW50cyhwcm92aWRlciwgcHJvdmlkZXJJbnN0YW5jZS5nZXREZXNjcmlwdG9yKCkpOwotICAgICAgICAgICAgICAgIC8vIDMuIFJlZ2lzdGVyIHRoZSBwcm92aWRlciBjYWxsYmFjay4KLSAgICAgICAgICAgICAgICBwcm92aWRlckluc3RhbmNlLnNldENhbGxiYWNrKG1Qcm92aWRlckNhbGxiYWNrKTsKLSAgICAgICAgICAgICAgICAvLyA0LiBTZXQgdGhlIGRpc2NvdmVyeSByZXF1ZXN0LgotICAgICAgICAgICAgICAgIHByb3ZpZGVySW5zdGFuY2Uuc2V0RGlzY292ZXJ5UmVxdWVzdChtRGlzY292ZXJ5UmVxdWVzdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgcmVtb3ZlUHJvdmlkZXIoTWVkaWFSb3V0ZVByb3ZpZGVyIHByb3ZpZGVySW5zdGFuY2UpIHsKLSAgICAgICAgICAgIGludCBpbmRleCA9IGZpbmRQcm92aWRlckluZm8ocHJvdmlkZXJJbnN0YW5jZSk7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgIC8vIDEuIFVucmVnaXN0ZXIgdGhlIHByb3ZpZGVyIGNhbGxiYWNrLgotICAgICAgICAgICAgICAgIHByb3ZpZGVySW5zdGFuY2Uuc2V0Q2FsbGJhY2sobnVsbCk7Ci0gICAgICAgICAgICAgICAgLy8gMi4gQ2xlYXIgdGhlIGRpc2NvdmVyeSByZXF1ZXN0LgotICAgICAgICAgICAgICAgIHByb3ZpZGVySW5zdGFuY2Uuc2V0RGlzY292ZXJ5UmVxdWVzdChudWxsKTsKLSAgICAgICAgICAgICAgICAvLyAzLiBEZWxldGUgdGhlIHByb3ZpZGVyJ3MgY29udGVudHMuCi0gICAgICAgICAgICAgICAgUHJvdmlkZXJJbmZvIHByb3ZpZGVyID0gbVByb3ZpZGVycy5nZXQoaW5kZXgpOwotICAgICAgICAgICAgICAgIHVwZGF0ZVByb3ZpZGVyQ29udGVudHMocHJvdmlkZXIsIG51bGwpOwotICAgICAgICAgICAgICAgIC8vIDQuIFJlbW92ZSB0aGUgcHJvdmlkZXIgZnJvbSB0aGUgbGlzdC4KLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiUHJvdmlkZXIgcmVtb3ZlZDogIiArIHByb3ZpZGVyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUNhbGxiYWNrSGFuZGxlci5wb3N0KENhbGxiYWNrSGFuZGxlci5NU0dfUFJPVklERVJfUkVNT1ZFRCwgcHJvdmlkZXIpOwotICAgICAgICAgICAgICAgIG1Qcm92aWRlcnMucmVtb3ZlKGluZGV4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgdXBkYXRlUHJvdmlkZXJEZXNjcmlwdG9yKE1lZGlhUm91dGVQcm92aWRlciBwcm92aWRlckluc3RhbmNlLAotICAgICAgICAgICAgICAgIE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotICAgICAgICAgICAgaW50IGluZGV4ID0gZmluZFByb3ZpZGVySW5mbyhwcm92aWRlckluc3RhbmNlKTsKLSAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBwcm92aWRlcidzIGNvbnRlbnRzLgotICAgICAgICAgICAgICAgIFByb3ZpZGVySW5mbyBwcm92aWRlciA9IG1Qcm92aWRlcnMuZ2V0KGluZGV4KTsKLSAgICAgICAgICAgICAgICB1cGRhdGVQcm92aWRlckNvbnRlbnRzKHByb3ZpZGVyLCBkZXNjcmlwdG9yKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgaW50IGZpbmRQcm92aWRlckluZm8oTWVkaWFSb3V0ZVByb3ZpZGVyIHByb3ZpZGVySW5zdGFuY2UpIHsKLSAgICAgICAgICAgIGZpbmFsIGludCBjb3VudCA9IG1Qcm92aWRlcnMuc2l6ZSgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1Qcm92aWRlcnMuZ2V0KGkpLm1Qcm92aWRlckluc3RhbmNlID09IHByb3ZpZGVySW5zdGFuY2UpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVByb3ZpZGVyQ29udGVudHMoUHJvdmlkZXJJbmZvIHByb3ZpZGVyLAotICAgICAgICAgICAgICAgIE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IgcHJvdmlkZXJEZXNjcmlwdG9yKSB7Ci0gICAgICAgICAgICBpZiAocHJvdmlkZXIudXBkYXRlRGVzY3JpcHRvcihwcm92aWRlckRlc2NyaXB0b3IpKSB7Ci0gICAgICAgICAgICAgICAgLy8gVXBkYXRlIGFsbCBleGlzdGluZyByb3V0ZXMgYW5kIHJlb3JkZXIgdGhlbSB0byBtYXRjaAotICAgICAgICAgICAgICAgIC8vIHRoZSBvcmRlciBvZiB0aGVpciBkZXNjcmlwdG9ycy4KLSAgICAgICAgICAgICAgICBpbnQgdGFyZ2V0SW5kZXggPSAwOwotICAgICAgICAgICAgICAgIGJvb2xlYW4gc2VsZWN0ZWRSb3V0ZURlc2NyaXB0b3JDaGFuZ2VkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgaWYgKHByb3ZpZGVyRGVzY3JpcHRvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwcm92aWRlckRlc2NyaXB0b3IuaXNWYWxpZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBMaXN0PE1lZGlhUm91dGVEZXNjcmlwdG9yPiByb3V0ZURlc2NyaXB0b3JzID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXJEZXNjcmlwdG9yLmdldFJvdXRlcygpOwotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHJvdXRlQ291bnQgPSByb3V0ZURlc2NyaXB0b3JzLnNpemUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0aW5nIHJvdXRlIGdyb3VwJ3MgY29udGVudHMgcmVxdWlyZXMgYWxsIG1lbWJlciByb3V0ZXMnIGluZm9ybWF0aW9uLgotICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWRkIHRoZSBncm91cHMgdG8gdGhlIGxpc3RzIGFuZCB1cGRhdGUgdGhlbSBsYXRlci4KLSAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8UGFpcjxSb3V0ZUluZm8sIE1lZGlhUm91dGVEZXNjcmlwdG9yPj4gYWRkZWRHcm91cHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8UGFpcjxSb3V0ZUluZm8sIE1lZGlhUm91dGVEZXNjcmlwdG9yPj4gdXBkYXRlZEdyb3VwcyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByb3V0ZUNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVJvdXRlRGVzY3JpcHRvciByb3V0ZURlc2NyaXB0b3IgPSByb3V0ZURlc2NyaXB0b3JzLmdldChpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgaWQgPSByb3V0ZURlc2NyaXB0b3IuZ2V0SWQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgc291cmNlSW5kZXggPSBwcm92aWRlci5maW5kUm91dGVCeURlc2NyaXB0b3JJZChpZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNvdXJjZUluZGV4IDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAxLiBBZGQgdGhlIHJvdXRlIHRvIHRoZSBsaXN0LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdW5pcXVlSWQgPSBhc3NpZ25Sb3V0ZVVuaXF1ZUlkKHByb3ZpZGVyLCBpZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNHcm91cCA9IHJvdXRlRGVzY3JpcHRvci5nZXRHcm91cE1lbWJlcklkcygpICE9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJvdXRlSW5mbyByb3V0ZSA9IGlzR3JvdXAgPyBuZXcgUm91dGVHcm91cChwcm92aWRlciwgaWQsIHVuaXF1ZUlkKSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFJvdXRlSW5mbyhwcm92aWRlciwgaWQsIHVuaXF1ZUlkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXIubVJvdXRlcy5hZGQodGFyZ2V0SW5kZXgrKywgcm91dGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUm91dGVzLmFkZChyb3V0ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDIuIENyZWF0ZSB0aGUgcm91dGUncyBjb250ZW50cy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzR3JvdXApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZGVkR3JvdXBzLmFkZChuZXcgUGFpcjw+KHJvdXRlLCByb3V0ZURlc2NyaXB0b3IpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRlLm1heWJlVXBkYXRlRGVzY3JpcHRvcihyb3V0ZURlc2NyaXB0b3IpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMy4gTm90aWZ5IGNsaWVudHMgYWJvdXQgYWRkaXRpb24uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJSb3V0ZSBhZGRlZDogIiArIHJvdXRlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DYWxsYmFja0hhbmRsZXIucG9zdChDYWxsYmFja0hhbmRsZXIuTVNHX1JPVVRFX0FEREVELCByb3V0ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc291cmNlSW5kZXggPCB0YXJnZXRJbmRleCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJJZ25vcmluZyByb3V0ZSBkZXNjcmlwdG9yIHdpdGggZHVwbGljYXRlIGlkOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyByb3V0ZURlc2NyaXB0b3IpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDEuIFJlb3JkZXIgdGhlIHJvdXRlIHdpdGhpbiB0aGUgbGlzdC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUm91dGVJbmZvIHJvdXRlID0gcHJvdmlkZXIubVJvdXRlcy5nZXQoc291cmNlSW5kZXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9ucy5zd2FwKHByb3ZpZGVyLm1Sb3V0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlSW5kZXgsIHRhcmdldEluZGV4KyspOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAyLiBVcGRhdGUgdGhlIHJvdXRlJ3MgY29udGVudHMuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyb3V0ZSBpbnN0YW5jZW9mIFJvdXRlR3JvdXApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZWRHcm91cHMuYWRkKG5ldyBQYWlyPD4ocm91dGUsIHJvdXRlRGVzY3JpcHRvcikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMy4gTm90aWZ5IGNsaWVudHMgYWJvdXQgY2hhbmdlcy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1cGRhdGVSb3V0ZURlc2NyaXB0b3JBbmROb3RpZnkocm91dGUsIHJvdXRlRGVzY3JpcHRvcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyb3V0ZSA9PSBtU2VsZWN0ZWRSb3V0ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFJvdXRlRGVzY3JpcHRvckNoYW5nZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgbmV3IGFuZC9vciBleGlzdGluZyBncm91cHMuCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKFBhaXI8Um91dGVJbmZvLCBNZWRpYVJvdXRlRGVzY3JpcHRvcj4gcGFpciA6IGFkZGVkR3JvdXBzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUm91dGVJbmZvIHJvdXRlID0gcGFpci5maXJzdDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3V0ZS5tYXliZVVwZGF0ZURlc2NyaXB0b3IocGFpci5zZWNvbmQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJSb3V0ZSBhZGRlZDogIiArIHJvdXRlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrSGFuZGxlci5wb3N0KENhbGxiYWNrSGFuZGxlci5NU0dfUk9VVEVfQURERUQsIHJvdXRlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoUGFpcjxSb3V0ZUluZm8sIE1lZGlhUm91dGVEZXNjcmlwdG9yPiBwYWlyIDogdXBkYXRlZEdyb3VwcykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJvdXRlSW5mbyByb3V0ZSA9IHBhaXIuZmlyc3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVwZGF0ZVJvdXRlRGVzY3JpcHRvckFuZE5vdGlmeShyb3V0ZSwgcGFpci5zZWNvbmQpICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJvdXRlID09IG1TZWxlY3RlZFJvdXRlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFJvdXRlRGVzY3JpcHRvckNoYW5nZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiSWdub3JpbmcgaW52YWxpZCBwcm92aWRlciBkZXNjcmlwdG9yOiAiICsgcHJvdmlkZXJEZXNjcmlwdG9yKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIERpc3Bvc2UgYWxsIHJlbWFpbmluZyByb3V0ZXMgdGhhdCBkbyBub3QgaGF2ZSBtYXRjaGluZyBkZXNjcmlwdG9ycy4KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gcHJvdmlkZXIubVJvdXRlcy5zaXplKCkgLSAxOyBpID49IHRhcmdldEluZGV4OyBpLS0pIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gMS4gRGVsZXRlIHRoZSByb3V0ZSdzIGNvbnRlbnRzLgotICAgICAgICAgICAgICAgICAgICBSb3V0ZUluZm8gcm91dGUgPSBwcm92aWRlci5tUm91dGVzLmdldChpKTsKLSAgICAgICAgICAgICAgICAgICAgcm91dGUubWF5YmVVcGRhdGVEZXNjcmlwdG9yKG51bGwpOwotICAgICAgICAgICAgICAgICAgICAvLyAyLiBSZW1vdmUgdGhlIHJvdXRlIGZyb20gdGhlIGxpc3QuCi0gICAgICAgICAgICAgICAgICAgIG1Sb3V0ZXMucmVtb3ZlKHJvdXRlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBVcGRhdGUgdGhlIHNlbGVjdGVkIHJvdXRlIGlmIG5lZWRlZC4KLSAgICAgICAgICAgICAgICB1cGRhdGVTZWxlY3RlZFJvdXRlSWZOZWVkZWQoc2VsZWN0ZWRSb3V0ZURlc2NyaXB0b3JDaGFuZ2VkKTsKLQotICAgICAgICAgICAgICAgIC8vIE5vdyBub3RpZnkgY2xpZW50cyBhYm91dCByb3V0ZXMgdGhhdCB3ZXJlIHJlbW92ZWQuCi0gICAgICAgICAgICAgICAgLy8gV2UgZG8gdGhpcyBhZnRlciB1cGRhdGluZyB0aGUgc2VsZWN0ZWQgcm91dGUgdG8gZW5zdXJlCi0gICAgICAgICAgICAgICAgLy8gdGhhdCB0aGUgZnJhbWV3b3JrIG1lZGlhIHJvdXRlciBvYnNlcnZlcyB0aGUgbmV3IHJvdXRlCi0gICAgICAgICAgICAgICAgLy8gc2VsZWN0aW9uIGJlZm9yZSB0aGUgcmVtb3ZhbCBzaW5jZSByZW1vdmluZyB0aGUgY3VycmVudGx5Ci0gICAgICAgICAgICAgICAgLy8gc2VsZWN0ZWQgcm91dGUgbWF5IGhhdmUgc2lkZS1lZmZlY3RzLgotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSBwcm92aWRlci5tUm91dGVzLnNpemUoKSAtIDE7IGkgPj0gdGFyZ2V0SW5kZXg7IGktLSkgewotICAgICAgICAgICAgICAgICAgICBSb3V0ZUluZm8gcm91dGUgPSBwcm92aWRlci5tUm91dGVzLnJlbW92ZShpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJSb3V0ZSByZW1vdmVkOiAiICsgcm91dGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1DYWxsYmFja0hhbmRsZXIucG9zdChDYWxsYmFja0hhbmRsZXIuTVNHX1JPVVRFX1JFTU9WRUQsIHJvdXRlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBOb3RpZnkgcHJvdmlkZXIgY2hhbmdlZC4KLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiUHJvdmlkZXIgY2hhbmdlZDogIiArIHByb3ZpZGVyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUNhbGxiYWNrSGFuZGxlci5wb3N0KENhbGxiYWNrSGFuZGxlci5NU0dfUFJPVklERVJfQ0hBTkdFRCwgcHJvdmlkZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBpbnQgdXBkYXRlUm91dGVEZXNjcmlwdG9yQW5kTm90aWZ5KFJvdXRlSW5mbyByb3V0ZSwKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlRGVzY3JpcHRvciByb3V0ZURlc2NyaXB0b3IpIHsKLSAgICAgICAgICAgIGludCBjaGFuZ2VzID0gcm91dGUubWF5YmVVcGRhdGVEZXNjcmlwdG9yKHJvdXRlRGVzY3JpcHRvcik7Ci0gICAgICAgICAgICBpZiAoY2hhbmdlcyAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKChjaGFuZ2VzICYgUm91dGVJbmZvLkNIQU5HRV9HRU5FUkFMKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiUm91dGUgY2hhbmdlZDogIiArIHJvdXRlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2tIYW5kbGVyLnBvc3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbGJhY2tIYW5kbGVyLk1TR19ST1VURV9DSEFOR0VELCByb3V0ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICgoY2hhbmdlcyAmIFJvdXRlSW5mby5DSEFOR0VfVk9MVU1FKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiUm91dGUgdm9sdW1lIGNoYW5nZWQ6ICIgKyByb3V0ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrSGFuZGxlci5wb3N0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbGxiYWNrSGFuZGxlci5NU0dfUk9VVEVfVk9MVU1FX0NIQU5HRUQsIHJvdXRlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKChjaGFuZ2VzICYgUm91dGVJbmZvLkNIQU5HRV9QUkVTRU5UQVRJT05fRElTUExBWSkgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlJvdXRlIHByZXNlbnRhdGlvbiBkaXNwbGF5IGNoYW5nZWQ6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyByb3V0ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrSGFuZGxlci5wb3N0KENhbGxiYWNrSGFuZGxlci4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNU0dfUk9VVEVfUFJFU0VOVEFUSU9OX0RJU1BMQVlfQ0hBTkdFRCwgcm91dGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBjaGFuZ2VzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgYXNzaWduUm91dGVVbmlxdWVJZChQcm92aWRlckluZm8gcHJvdmlkZXIsIFN0cmluZyByb3V0ZURlc2NyaXB0b3JJZCkgewotICAgICAgICAgICAgLy8gQWx0aG91Z2ggcm91dGUgZGVzY3JpcHRvciBpZHMgYXJlIHVuaXF1ZSB3aXRoaW4gYSBwcm92aWRlciwgaXQncwotICAgICAgICAgICAgLy8gcG9zc2libGUgZm9yIHRoZXJlIHRvIGJlIHR3byBwcm92aWRlcnMgd2l0aCB0aGUgc2FtZSBwYWNrYWdlIG5hbWUuCi0gICAgICAgICAgICAvLyBUaGVyZWZvcmUgd2UgbXVzdCBkZWR1cGUgdGhlIGNvbXBvc2l0ZSBpZC4KLSAgICAgICAgICAgIFN0cmluZyBjb21wb25lbnROYW1lID0gcHJvdmlkZXIuZ2V0Q29tcG9uZW50TmFtZSgpLmZsYXR0ZW5Ub1Nob3J0U3RyaW5nKCk7Ci0gICAgICAgICAgICBTdHJpbmcgdW5pcXVlSWQgPSBjb21wb25lbnROYW1lICsgIjoiICsgcm91dGVEZXNjcmlwdG9ySWQ7Ci0gICAgICAgICAgICBpZiAoZmluZFJvdXRlQnlVbmlxdWVJZCh1bmlxdWVJZCkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgbVVuaXF1ZUlkTWFwLnB1dChuZXcgUGFpcjw+KGNvbXBvbmVudE5hbWUsIHJvdXRlRGVzY3JpcHRvcklkKSwgdW5pcXVlSWQpOwotICAgICAgICAgICAgICAgIHJldHVybiB1bmlxdWVJZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIExvZy53KFRBRywgIkVpdGhlciAiICsgcm91dGVEZXNjcmlwdG9ySWQgKyAiIGlzbid0IHVuaXF1ZSBpbiAiICsgY29tcG9uZW50TmFtZQotICAgICAgICAgICAgICAgICAgICArICIgb3Igd2UncmUgdHJ5aW5nIHRvIGFzc2lnbiBhIHVuaXF1ZSBJRCBmb3IgYW4gYWxyZWFkeSBhZGRlZCByb3V0ZSIpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDI7IDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG5ld1VuaXF1ZUlkID0gU3RyaW5nLmZvcm1hdChMb2NhbGUuVVMsICIlc18lZCIsIHVuaXF1ZUlkLCBpKTsKLSAgICAgICAgICAgICAgICBpZiAoZmluZFJvdXRlQnlVbmlxdWVJZChuZXdVbmlxdWVJZCkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1VbmlxdWVJZE1hcC5wdXQobmV3IFBhaXI8Pihjb21wb25lbnROYW1lLCByb3V0ZURlc2NyaXB0b3JJZCksIG5ld1VuaXF1ZUlkKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ld1VuaXF1ZUlkOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgaW50IGZpbmRSb3V0ZUJ5VW5pcXVlSWQoU3RyaW5nIHVuaXF1ZUlkKSB7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBtUm91dGVzLnNpemUoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgIGlmIChtUm91dGVzLmdldChpKS5tVW5pcXVlSWQuZXF1YWxzKHVuaXF1ZUlkKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIFN0cmluZyBnZXRVbmlxdWVJZChQcm92aWRlckluZm8gcHJvdmlkZXIsIFN0cmluZyByb3V0ZURlc2NyaXB0b3JJZCkgewotICAgICAgICAgICAgU3RyaW5nIGNvbXBvbmVudE5hbWUgPSBwcm92aWRlci5nZXRDb21wb25lbnROYW1lKCkuZmxhdHRlblRvU2hvcnRTdHJpbmcoKTsKLSAgICAgICAgICAgIHJldHVybiBtVW5pcXVlSWRNYXAuZ2V0KG5ldyBQYWlyPD4oY29tcG9uZW50TmFtZSwgcm91dGVEZXNjcmlwdG9ySWQpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCB1cGRhdGVTZWxlY3RlZFJvdXRlSWZOZWVkZWQoYm9vbGVhbiBzZWxlY3RlZFJvdXRlRGVzY3JpcHRvckNoYW5nZWQpIHsKLSAgICAgICAgICAgIC8vIFVwZGF0ZSBkZWZhdWx0IHJvdXRlLgotICAgICAgICAgICAgaWYgKG1EZWZhdWx0Um91dGUgIT0gbnVsbCAmJiAhbURlZmF1bHRSb3V0ZS5pc1NlbGVjdGFibGUoKSkgewotICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIkNsZWFyaW5nIHRoZSBkZWZhdWx0IHJvdXRlIGJlY2F1c2UgaXQgIgotICAgICAgICAgICAgICAgICAgICAgICAgKyAiaXMgbm8gbG9uZ2VyIHNlbGVjdGFibGU6ICIgKyBtRGVmYXVsdFJvdXRlKTsKLSAgICAgICAgICAgICAgICBtRGVmYXVsdFJvdXRlID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtRGVmYXVsdFJvdXRlID09IG51bGwgJiYgIW1Sb3V0ZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChSb3V0ZUluZm8gcm91dGUgOiBtUm91dGVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpc1N5c3RlbURlZmF1bHRSb3V0ZShyb3V0ZSkgJiYgcm91dGUuaXNTZWxlY3RhYmxlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1EZWZhdWx0Um91dGUgPSByb3V0ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIkZvdW5kIGRlZmF1bHQgcm91dGU6ICIgKyBtRGVmYXVsdFJvdXRlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBVcGRhdGUgYmx1ZXRvb3RoIHJvdXRlLgotICAgICAgICAgICAgaWYgKG1CbHVldG9vdGhSb3V0ZSAhPSBudWxsICYmICFtQmx1ZXRvb3RoUm91dGUuaXNTZWxlY3RhYmxlKCkpIHsKLSAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJDbGVhcmluZyB0aGUgYmx1ZXRvb3RoIHJvdXRlIGJlY2F1c2UgaXQgIgotICAgICAgICAgICAgICAgICAgICAgICAgKyAiaXMgbm8gbG9uZ2VyIHNlbGVjdGFibGU6ICIgKyBtQmx1ZXRvb3RoUm91dGUpOwotICAgICAgICAgICAgICAgIG1CbHVldG9vdGhSb3V0ZSA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobUJsdWV0b290aFJvdXRlID09IG51bGwgJiYgIW1Sb3V0ZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChSb3V0ZUluZm8gcm91dGUgOiBtUm91dGVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpc1N5c3RlbUxpdmVBdWRpb09ubHlSb3V0ZShyb3V0ZSkgJiYgcm91dGUuaXNTZWxlY3RhYmxlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1CbHVldG9vdGhSb3V0ZSA9IHJvdXRlOwotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiRm91bmQgYmx1ZXRvb3RoIHJvdXRlOiAiICsgbUJsdWV0b290aFJvdXRlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBVcGRhdGUgc2VsZWN0ZWQgcm91dGUuCi0gICAgICAgICAgICBpZiAobVNlbGVjdGVkUm91dGUgPT0gbnVsbCB8fCAhbVNlbGVjdGVkUm91dGUuaXNTZWxlY3RhYmxlKCkpIHsKLSAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJVbnNlbGVjdGluZyB0aGUgY3VycmVudCByb3V0ZSBiZWNhdXNlIGl0ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgImlzIG5vIGxvbmdlciBzZWxlY3RhYmxlOiAiICsgbVNlbGVjdGVkUm91dGUpOwotICAgICAgICAgICAgICAgIHNldFNlbGVjdGVkUm91dGVJbnRlcm5hbChjaG9vc2VGYWxsYmFja1JvdXRlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlci5VTlNFTEVDVF9SRUFTT05fVU5LTk9XTik7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHNlbGVjdGVkUm91dGVEZXNjcmlwdG9yQ2hhbmdlZCkgewotICAgICAgICAgICAgICAgIC8vIEluIGNhc2UgdGhlIHNlbGVjdGVkIHJvdXRlIGlzIGEgcm91dGUgZ3JvdXAsIHNlbGVjdC91bnNlbGVjdCByb3V0ZSBjb250cm9sbGVycwotICAgICAgICAgICAgICAgIC8vIGZvciB0aGUgYWRkZWQvcmVtb3ZlZCByb3V0ZSBtZW1iZXJzLgotICAgICAgICAgICAgICAgIGlmIChtU2VsZWN0ZWRSb3V0ZSBpbnN0YW5jZW9mIFJvdXRlR3JvdXApIHsKLSAgICAgICAgICAgICAgICAgICAgTGlzdDxSb3V0ZUluZm8+IHJvdXRlcyA9ICgoUm91dGVHcm91cCkgbVNlbGVjdGVkUm91dGUpLmdldFJvdXRlcygpOwotICAgICAgICAgICAgICAgICAgICAvLyBCdWlsZCBhIHNldCBvZiBkZXNjcmlwdG9yIElEcyBmb3IgdGhlIG5ldyByb3V0ZSBncm91cC4KLSAgICAgICAgICAgICAgICAgICAgU2V0PFN0cmluZz4gaWRTZXQgPSBuZXcgSGFzaFNldDw+KCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoUm91dGVJbmZvIHJvdXRlIDogcm91dGVzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZFNldC5hZGQocm91dGUubURlc2NyaXB0b3JJZCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gVW5zZWxlY3Qgcm91dGUgY29udHJvbGxlcnMgZm9yIHRoZSByZW1vdmVkIHJvdXRlcy4KLSAgICAgICAgICAgICAgICAgICAgSXRlcmF0b3I8TWFwLkVudHJ5PFN0cmluZywgUm91dGVDb250cm9sbGVyPj4gaXRlciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJvdXRlQ29udHJvbGxlck1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgTWFwLkVudHJ5PFN0cmluZywgUm91dGVDb250cm9sbGVyPiBlbnRyeSA9IGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpZFNldC5jb250YWlucyhlbnRyeS5nZXRLZXkoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBSb3V0ZUNvbnRyb2xsZXIgY29udHJvbGxlciA9IGVudHJ5LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5vblVuc2VsZWN0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5vblJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyLnJlbW92ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIFNlbGVjdCByb3V0ZSBjb250cm9sbGVycyBmb3IgdGhlIGFkZGVkIHJvdXRlcy4KLSAgICAgICAgICAgICAgICAgICAgZm9yIChSb3V0ZUluZm8gcm91dGUgOiByb3V0ZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbVJvdXRlQ29udHJvbGxlck1hcC5jb250YWluc0tleShyb3V0ZS5tRGVzY3JpcHRvcklkKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJvdXRlQ29udHJvbGxlciBjb250cm9sbGVyID0gcm91dGUuZ2V0UHJvdmlkZXJJbnN0YW5jZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAub25DcmVhdGVSb3V0ZUNvbnRyb2xsZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRlLm1EZXNjcmlwdG9ySWQsIG1TZWxlY3RlZFJvdXRlLm1EZXNjcmlwdG9ySWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIub25TZWxlY3QoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUm91dGVDb250cm9sbGVyTWFwLnB1dChyb3V0ZS5tRGVzY3JpcHRvcklkLCBjb250cm9sbGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBVcGRhdGUgdGhlIHBsYXliYWNrIGluZm8gYmVjYXVzZSB0aGUgcHJvcGVydGllcyBvZiB0aGUgcm91dGUgaGF2ZSBjaGFuZ2VkLgotICAgICAgICAgICAgICAgIHVwZGF0ZVBsYXliYWNrSW5mb0Zyb21TZWxlY3RlZFJvdXRlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBSb3V0ZUluZm8gY2hvb3NlRmFsbGJhY2tSb3V0ZSgpIHsKLSAgICAgICAgICAgIC8vIFdoZW4gdGhlIGN1cnJlbnQgcm91dGUgaXMgcmVtb3ZlZCBvciBubyBsb25nZXIgc2VsZWN0YWJsZSwKLSAgICAgICAgICAgIC8vIHdlIHdhbnQgdG8gcmV2ZXJ0IHRvIGEgbGl2ZSBhdWRpbyByb3V0ZSBpZiB0aGVyZSBpcwotICAgICAgICAgICAgLy8gb25lICh1c3VhbGx5IEJsdWV0b290aCBBMkRQKS4gIEZhaWxpbmcgdGhhdCwgdXNlCi0gICAgICAgICAgICAvLyB0aGUgZGVmYXVsdCByb3V0ZS4KLSAgICAgICAgICAgIGZvciAoUm91dGVJbmZvIHJvdXRlIDogbVJvdXRlcykgewotICAgICAgICAgICAgICAgIGlmIChyb3V0ZSAhPSBtRGVmYXVsdFJvdXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBpc1N5c3RlbUxpdmVBdWRpb09ubHlSb3V0ZShyb3V0ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIHJvdXRlLmlzU2VsZWN0YWJsZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiByb3V0ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbURlZmF1bHRSb3V0ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBpc1N5c3RlbUxpdmVBdWRpb09ubHlSb3V0ZShSb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgICAgIHJldHVybiByb3V0ZS5nZXRQcm92aWRlckluc3RhbmNlKCkgPT0gbVN5c3RlbVByb3ZpZGVyCi0gICAgICAgICAgICAgICAgICAgICYmIHJvdXRlLnN1cHBvcnRzQ29udHJvbENhdGVnb3J5KE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9MSVZFX0FVRElPKQotICAgICAgICAgICAgICAgICAgICAmJiAhcm91dGUuc3VwcG9ydHNDb250cm9sQ2F0ZWdvcnkoTWVkaWFDb250cm9sSW50ZW50LkNBVEVHT1JZX0xJVkVfVklERU8pOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGlzU3lzdGVtRGVmYXVsdFJvdXRlKFJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICAgICAgcmV0dXJuIHJvdXRlLmdldFByb3ZpZGVySW5zdGFuY2UoKSA9PSBtU3lzdGVtUHJvdmlkZXIKLSAgICAgICAgICAgICAgICAgICAgJiYgcm91dGUubURlc2NyaXB0b3JJZC5lcXVhbHMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtTWVkaWFSb3V0ZVByb3ZpZGVyLkRFRkFVTFRfUk9VVEVfSUQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHNldFNlbGVjdGVkUm91dGVJbnRlcm5hbChATm9uTnVsbCBSb3V0ZUluZm8gcm91dGUsIGludCB1bnNlbGVjdFJlYXNvbikgewotICAgICAgICAgICAgLy8gVE9ETzogUmVtb3ZlIHRoZSBmb2xsb3dpbmcgbG9nZ2luZyB3aGVuIG5vIGxvbmdlciBuZWVkZWQuCi0gICAgICAgICAgICBpZiAoc0dsb2JhbCA9PSBudWxsIHx8IChtQmx1ZXRvb3RoUm91dGUgIT0gbnVsbCAmJiByb3V0ZS5pc0RlZmF1bHQoKSkpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdGFja1RyYWNlRWxlbWVudFtdIGNhbGxTdGFjayA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgICAgIC8vIGNhbGxTdGFja1szXSBpcyB0aGUgY2FsbGVyIG9mIHRoaXMgbWV0aG9kLgotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAzOyBpIDwgY2FsbFN0YWNrLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0YWNrVHJhY2VFbGVtZW50IGNhbGxlciA9IGNhbGxTdGFja1tpXTsKLSAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGNhbGxlci5nZXRDbGFzc05hbWUoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCIuIikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKGNhbGxlci5nZXRNZXRob2ROYW1lKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgiOiIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChjYWxsZXIuZ2V0TGluZU51bWJlcigpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoIiAgIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChzR2xvYmFsID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAic2V0U2VsZWN0ZWRSb3V0ZUludGVybmFsIGlzIGNhbGxlZCB3aGlsZSBzR2xvYmFsIGlzIG51bGw6IHBrZ05hbWU9IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbUFwcGxpY2F0aW9uQ29udGV4dC5nZXRQYWNrYWdlTmFtZSgpICsgIiwgY2FsbGVycz0iICsgc2IudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiRGVmYXVsdCByb3V0ZSBpcyBzZWxlY3RlZCB3aGlsZSBhIEJUIHJvdXRlIGlzIGF2YWlsYWJsZTogcGtnTmFtZT0iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtQXBwbGljYXRpb25Db250ZXh0LmdldFBhY2thZ2VOYW1lKCkgKyAiLCBjYWxsZXJzPSIgKyBzYi50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtU2VsZWN0ZWRSb3V0ZSAhPSByb3V0ZSkgewotICAgICAgICAgICAgICAgIGlmIChtU2VsZWN0ZWRSb3V0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiUm91dGUgdW5zZWxlY3RlZDogIiArIG1TZWxlY3RlZFJvdXRlICsgIiByZWFzb246ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB1bnNlbGVjdFJlYXNvbik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrSGFuZGxlci5wb3N0KENhbGxiYWNrSGFuZGxlci5NU0dfUk9VVEVfVU5TRUxFQ1RFRCwgbVNlbGVjdGVkUm91dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zZWxlY3RSZWFzb24pOwotICAgICAgICAgICAgICAgICAgICBpZiAobVNlbGVjdGVkUm91dGVDb250cm9sbGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TZWxlY3RlZFJvdXRlQ29udHJvbGxlci5vblVuc2VsZWN0KHVuc2VsZWN0UmVhc29uKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TZWxlY3RlZFJvdXRlQ29udHJvbGxlci5vblJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TZWxlY3RlZFJvdXRlQ29udHJvbGxlciA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFtUm91dGVDb250cm9sbGVyTWFwLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChSb3V0ZUNvbnRyb2xsZXIgY29udHJvbGxlciA6IG1Sb3V0ZUNvbnRyb2xsZXJNYXAudmFsdWVzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLm9uVW5zZWxlY3QodW5zZWxlY3RSZWFzb24pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIub25SZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtUm91dGVDb250cm9sbGVyTWFwLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBtU2VsZWN0ZWRSb3V0ZSA9IHJvdXRlOwotICAgICAgICAgICAgICAgIG1TZWxlY3RlZFJvdXRlQ29udHJvbGxlciA9IHJvdXRlLmdldFByb3ZpZGVySW5zdGFuY2UoKS5vbkNyZWF0ZVJvdXRlQ29udHJvbGxlcigKLSAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRlLm1EZXNjcmlwdG9ySWQpOwotICAgICAgICAgICAgICAgIGlmIChtU2VsZWN0ZWRSb3V0ZUNvbnRyb2xsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtU2VsZWN0ZWRSb3V0ZUNvbnRyb2xsZXIub25TZWxlY3QoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlJvdXRlIHNlbGVjdGVkOiAiICsgbVNlbGVjdGVkUm91dGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtQ2FsbGJhY2tIYW5kbGVyLnBvc3QoQ2FsbGJhY2tIYW5kbGVyLk1TR19ST1VURV9TRUxFQ1RFRCwgbVNlbGVjdGVkUm91dGUpOwotCi0gICAgICAgICAgICAgICAgaWYgKG1TZWxlY3RlZFJvdXRlIGluc3RhbmNlb2YgUm91dGVHcm91cCkgewotICAgICAgICAgICAgICAgICAgICBMaXN0PFJvdXRlSW5mbz4gcm91dGVzID0gKChSb3V0ZUdyb3VwKSBtU2VsZWN0ZWRSb3V0ZSkuZ2V0Um91dGVzKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1Sb3V0ZUNvbnRyb2xsZXJNYXAuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChSb3V0ZUluZm8gciA6IHJvdXRlcykgewotICAgICAgICAgICAgICAgICAgICAgICAgUm91dGVDb250cm9sbGVyIGNvbnRyb2xsZXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLmdldFByb3ZpZGVySW5zdGFuY2UoKS5vbkNyZWF0ZVJvdXRlQ29udHJvbGxlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLm1EZXNjcmlwdG9ySWQsIG1TZWxlY3RlZFJvdXRlLm1EZXNjcmlwdG9ySWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5vblNlbGVjdCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgbVJvdXRlQ29udHJvbGxlck1hcC5wdXQoci5tRGVzY3JpcHRvcklkLCBjb250cm9sbGVyKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHVwZGF0ZVBsYXliYWNrSW5mb0Zyb21TZWxlY3RlZFJvdXRlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25TeXN0ZW1Sb3V0ZVNlbGVjdGVkQnlEZXNjcmlwdG9ySWQoU3RyaW5nIGlkKSB7Ci0gICAgICAgICAgICAvLyBTeXN0ZW0gcm91dGUgaXMgc2VsZWN0ZWQsIGRvIG5vdCBzeW5jIHRoZSByb3V0ZSB3ZSBzZWxlY3RlZCBiZWZvcmUuCi0gICAgICAgICAgICBtQ2FsbGJhY2tIYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKENhbGxiYWNrSGFuZGxlci5NU0dfUk9VVEVfU0VMRUNURUQpOwotICAgICAgICAgICAgaW50IHByb3ZpZGVySW5kZXggPSBmaW5kUHJvdmlkZXJJbmZvKG1TeXN0ZW1Qcm92aWRlcik7Ci0gICAgICAgICAgICBpZiAocHJvdmlkZXJJbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgUHJvdmlkZXJJbmZvIHByb3ZpZGVyID0gbVByb3ZpZGVycy5nZXQocHJvdmlkZXJJbmRleCk7Ci0gICAgICAgICAgICAgICAgaW50IHJvdXRlSW5kZXggPSBwcm92aWRlci5maW5kUm91dGVCeURlc2NyaXB0b3JJZChpZCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJvdXRlSW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgICAgICBwcm92aWRlci5tUm91dGVzLmdldChyb3V0ZUluZGV4KS5zZWxlY3QoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBhZGRSZW1vdGVDb250cm9sQ2xpZW50KE9iamVjdCByY2MpIHsKLSAgICAgICAgICAgIGludCBpbmRleCA9IGZpbmRSZW1vdGVDb250cm9sQ2xpZW50UmVjb3JkKHJjYyk7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgICAgICAgICAgUmVtb3RlQ29udHJvbENsaWVudFJlY29yZCByZWNvcmQgPSBuZXcgUmVtb3RlQ29udHJvbENsaWVudFJlY29yZChyY2MpOwotICAgICAgICAgICAgICAgIG1SZW1vdGVDb250cm9sQ2xpZW50cy5hZGQocmVjb3JkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZVJlbW90ZUNvbnRyb2xDbGllbnQoT2JqZWN0IHJjYykgewotICAgICAgICAgICAgaW50IGluZGV4ID0gZmluZFJlbW90ZUNvbnRyb2xDbGllbnRSZWNvcmQocmNjKTsKLSAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgUmVtb3RlQ29udHJvbENsaWVudFJlY29yZCByZWNvcmQgPSBtUmVtb3RlQ29udHJvbENsaWVudHMucmVtb3ZlKGluZGV4KTsKLSAgICAgICAgICAgICAgICByZWNvcmQuZGlzY29ubmVjdCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0TWVkaWFTZXNzaW9uKE9iamVjdCBzZXNzaW9uKSB7Ci0gICAgICAgICAgICBzZXRNZWRpYVNlc3Npb25SZWNvcmQoc2Vzc2lvbiAhPSBudWxsID8gbmV3IE1lZGlhU2Vzc2lvblJlY29yZChzZXNzaW9uKSA6IG51bGwpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0TWVkaWFTZXNzaW9uQ29tcGF0KGZpbmFsIE1lZGlhU2Vzc2lvbkNvbXBhdCBzZXNzaW9uKSB7Ci0gICAgICAgICAgICBtQ29tcGF0U2Vzc2lvbiA9IHNlc3Npb247Ci0gICAgICAgICAgICBpZiAoYW5kcm9pZC5vcy5CdWlsZC5WRVJTSU9OLlNES19JTlQgPj0gMjEpIHsKLSAgICAgICAgICAgICAgICBzZXRNZWRpYVNlc3Npb25SZWNvcmQoc2Vzc2lvbiAhPSBudWxsID8gbmV3IE1lZGlhU2Vzc2lvblJlY29yZChzZXNzaW9uKSA6IG51bGwpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChhbmRyb2lkLm9zLkJ1aWxkLlZFUlNJT04uU0RLX0lOVCA+PSAxNCkgewotICAgICAgICAgICAgICAgIGlmIChtUmNjTWVkaWFTZXNzaW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVtb3ZlUmVtb3RlQ29udHJvbENsaWVudChtUmNjTWVkaWFTZXNzaW9uLmdldFJlbW90ZUNvbnRyb2xDbGllbnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIG1SY2NNZWRpYVNlc3Npb24ucmVtb3ZlT25BY3RpdmVDaGFuZ2VMaXN0ZW5lcihtU2Vzc2lvbkFjdGl2ZUxpc3RlbmVyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbVJjY01lZGlhU2Vzc2lvbiA9IHNlc3Npb247Ci0gICAgICAgICAgICAgICAgaWYgKHNlc3Npb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmFkZE9uQWN0aXZlQ2hhbmdlTGlzdGVuZXIobVNlc3Npb25BY3RpdmVMaXN0ZW5lcik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzZXNzaW9uLmlzQWN0aXZlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZFJlbW90ZUNvbnRyb2xDbGllbnQoc2Vzc2lvbi5nZXRSZW1vdGVDb250cm9sQ2xpZW50KCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHNldE1lZGlhU2Vzc2lvblJlY29yZChNZWRpYVNlc3Npb25SZWNvcmQgbWVkaWFTZXNzaW9uUmVjb3JkKSB7Ci0gICAgICAgICAgICBpZiAobU1lZGlhU2Vzc2lvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbU1lZGlhU2Vzc2lvbi5jbGVhclZvbHVtZUhhbmRsaW5nKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtTWVkaWFTZXNzaW9uID0gbWVkaWFTZXNzaW9uUmVjb3JkOwotICAgICAgICAgICAgaWYgKG1lZGlhU2Vzc2lvblJlY29yZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlUGxheWJhY2tJbmZvRnJvbVNlbGVjdGVkUm91dGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBNZWRpYVNlc3Npb25Db21wYXQuVG9rZW4gZ2V0TWVkaWFTZXNzaW9uVG9rZW4oKSB7Ci0gICAgICAgICAgICBpZiAobU1lZGlhU2Vzc2lvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1NZWRpYVNlc3Npb24uZ2V0VG9rZW4oKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobUNvbXBhdFNlc3Npb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBtQ29tcGF0U2Vzc2lvbi5nZXRTZXNzaW9uVG9rZW4oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBpbnQgZmluZFJlbW90ZUNvbnRyb2xDbGllbnRSZWNvcmQoT2JqZWN0IHJjYykgewotICAgICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gbVJlbW90ZUNvbnRyb2xDbGllbnRzLnNpemUoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgIFJlbW90ZUNvbnRyb2xDbGllbnRSZWNvcmQgcmVjb3JkID0gbVJlbW90ZUNvbnRyb2xDbGllbnRzLmdldChpKTsKLSAgICAgICAgICAgICAgICBpZiAocmVjb3JkLmdldFJlbW90ZUNvbnRyb2xDbGllbnQoKSA9PSByY2MpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVBsYXliYWNrSW5mb0Zyb21TZWxlY3RlZFJvdXRlKCkgewotICAgICAgICAgICAgaWYgKG1TZWxlY3RlZFJvdXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtUGxheWJhY2tJbmZvLnZvbHVtZSA9IG1TZWxlY3RlZFJvdXRlLmdldFZvbHVtZSgpOwotICAgICAgICAgICAgICAgIG1QbGF5YmFja0luZm8udm9sdW1lTWF4ID0gbVNlbGVjdGVkUm91dGUuZ2V0Vm9sdW1lTWF4KCk7Ci0gICAgICAgICAgICAgICAgbVBsYXliYWNrSW5mby52b2x1bWVIYW5kbGluZyA9IG1TZWxlY3RlZFJvdXRlLmdldFZvbHVtZUhhbmRsaW5nKCk7Ci0gICAgICAgICAgICAgICAgbVBsYXliYWNrSW5mby5wbGF5YmFja1N0cmVhbSA9IG1TZWxlY3RlZFJvdXRlLmdldFBsYXliYWNrU3RyZWFtKCk7Ci0gICAgICAgICAgICAgICAgbVBsYXliYWNrSW5mby5wbGF5YmFja1R5cGUgPSBtU2VsZWN0ZWRSb3V0ZS5nZXRQbGF5YmFja1R5cGUoKTsKLQotICAgICAgICAgICAgICAgIGZpbmFsIGludCBjb3VudCA9IG1SZW1vdGVDb250cm9sQ2xpZW50cy5zaXplKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIFJlbW90ZUNvbnRyb2xDbGllbnRSZWNvcmQgcmVjb3JkID0gbVJlbW90ZUNvbnRyb2xDbGllbnRzLmdldChpKTsKLSAgICAgICAgICAgICAgICAgICAgcmVjb3JkLnVwZGF0ZVBsYXliYWNrSW5mbygpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobU1lZGlhU2Vzc2lvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtU2VsZWN0ZWRSb3V0ZSA9PSBnZXREZWZhdWx0Um91dGUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1TZWxlY3RlZFJvdXRlID09IGdldEJsdWV0b290aFJvdXRlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIExvY2FsIHJvdXRlCi0gICAgICAgICAgICAgICAgICAgICAgICBtTWVkaWFTZXNzaW9uLmNsZWFyVm9sdW1lSGFuZGxpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEBWb2x1bWVQcm92aWRlckNvbXBhdC5Db250cm9sVHlwZSBpbnQgY29udHJvbFR5cGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWb2x1bWVQcm92aWRlckNvbXBhdC5WT0xVTUVfQ09OVFJPTF9GSVhFRDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtUGxheWJhY2tJbmZvLnZvbHVtZUhhbmRsaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IE1lZGlhUm91dGVyLlJvdXRlSW5mby5QTEFZQkFDS19WT0xVTUVfVkFSSUFCTEUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sVHlwZSA9IFZvbHVtZVByb3ZpZGVyQ29tcGF0LlZPTFVNRV9DT05UUk9MX0FCU09MVVRFOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgbU1lZGlhU2Vzc2lvbi5jb25maWd1cmVWb2x1bWUoY29udHJvbFR5cGUsIG1QbGF5YmFja0luZm8udm9sdW1lTWF4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUGxheWJhY2tJbmZvLnZvbHVtZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChtTWVkaWFTZXNzaW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbU1lZGlhU2Vzc2lvbi5jbGVhclZvbHVtZUhhbmRsaW5nKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBQcm92aWRlckNhbGxiYWNrIGV4dGVuZHMgTWVkaWFSb3V0ZVByb3ZpZGVyLkNhbGxiYWNrIHsKLSAgICAgICAgICAgIFByb3ZpZGVyQ2FsbGJhY2soKSB7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25EZXNjcmlwdG9yQ2hhbmdlZChNZWRpYVJvdXRlUHJvdmlkZXIgcHJvdmlkZXIsCi0gICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotICAgICAgICAgICAgICAgIHVwZGF0ZVByb3ZpZGVyRGVzY3JpcHRvcihwcm92aWRlciwgZGVzY3JpcHRvcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGZpbmFsIGNsYXNzIE1lZGlhU2Vzc2lvblJlY29yZCB7Ci0gICAgICAgICAgICBwcml2YXRlIGZpbmFsIE1lZGlhU2Vzc2lvbkNvbXBhdCBtTXNDb21wYXQ7Ci0KLSAgICAgICAgICAgIHByaXZhdGUgQFZvbHVtZVByb3ZpZGVyQ29tcGF0LkNvbnRyb2xUeXBlIGludCBtQ29udHJvbFR5cGU7Ci0gICAgICAgICAgICBwcml2YXRlIGludCBtTWF4Vm9sdW1lOwotICAgICAgICAgICAgcHJpdmF0ZSBWb2x1bWVQcm92aWRlckNvbXBhdCBtVnBDb21wYXQ7Ci0KLSAgICAgICAgICAgIHB1YmxpYyBNZWRpYVNlc3Npb25SZWNvcmQoT2JqZWN0IG1lZGlhU2Vzc2lvbikgewotICAgICAgICAgICAgICAgIG1Nc0NvbXBhdCA9IE1lZGlhU2Vzc2lvbkNvbXBhdC5mcm9tTWVkaWFTZXNzaW9uKG1BcHBsaWNhdGlvbkNvbnRleHQsIG1lZGlhU2Vzc2lvbik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBNZWRpYVNlc3Npb25SZWNvcmQoTWVkaWFTZXNzaW9uQ29tcGF0IG1lZGlhU2Vzc2lvbkNvbXBhdCkgewotICAgICAgICAgICAgICAgIG1Nc0NvbXBhdCA9IG1lZGlhU2Vzc2lvbkNvbXBhdDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgY29uZmlndXJlVm9sdW1lKEBWb2x1bWVQcm92aWRlckNvbXBhdC5Db250cm9sVHlwZSBpbnQgY29udHJvbFR5cGUsCi0gICAgICAgICAgICAgICAgICAgIGludCBtYXgsIGludCBjdXJyZW50KSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1WcENvbXBhdCAhPSBudWxsICYmIGNvbnRyb2xUeXBlID09IG1Db250cm9sVHlwZSAmJiBtYXggPT0gbU1heFZvbHVtZSkgewotICAgICAgICAgICAgICAgICAgICAvLyBJZiB3ZSBoYXZlbid0IGNoYW5nZWQgY29udHJvbCB0eXBlIG9yIG1heCBqdXN0IHNldCB0aGUKLSAgICAgICAgICAgICAgICAgICAgLy8gbmV3IGN1cnJlbnQgdm9sdW1lCi0gICAgICAgICAgICAgICAgICAgIG1WcENvbXBhdC5zZXRDdXJyZW50Vm9sdW1lKGN1cnJlbnQpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSBjcmVhdGUgYSBuZXcgcHJvdmlkZXIgYW5kIHVwZGF0ZQotICAgICAgICAgICAgICAgICAgICBtVnBDb21wYXQgPSBuZXcgVm9sdW1lUHJvdmlkZXJDb21wYXQoY29udHJvbFR5cGUsIG1heCwgY3VycmVudCkgewotICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblNldFZvbHVtZVRvKGZpbmFsIGludCB2b2x1bWUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2tIYW5kbGVyLnBvc3QobmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1TZWxlY3RlZFJvdXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2VsZWN0ZWRSb3V0ZS5yZXF1ZXN0U2V0Vm9sdW1lKHZvbHVtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkFkanVzdFZvbHVtZShmaW5hbCBpbnQgZGlyZWN0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrSGFuZGxlci5wb3N0KG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtU2VsZWN0ZWRSb3V0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNlbGVjdGVkUm91dGUucmVxdWVzdFVwZGF0ZVZvbHVtZShkaXJlY3Rpb24pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICAgICAgIG1Nc0NvbXBhdC5zZXRQbGF5YmFja1RvUmVtb3RlKG1WcENvbXBhdCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBjbGVhclZvbHVtZUhhbmRsaW5nKCkgewotICAgICAgICAgICAgICAgIG1Nc0NvbXBhdC5zZXRQbGF5YmFja1RvTG9jYWwobVBsYXliYWNrSW5mby5wbGF5YmFja1N0cmVhbSk7Ci0gICAgICAgICAgICAgICAgbVZwQ29tcGF0ID0gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIE1lZGlhU2Vzc2lvbkNvbXBhdC5Ub2tlbiBnZXRUb2tlbigpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbU1zQ29tcGF0LmdldFNlc3Npb25Ub2tlbigpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBSZW1vdGVDb250cm9sQ2xpZW50UmVjb3JkCi0gICAgICAgICAgICAgICAgaW1wbGVtZW50cyBSZW1vdGVDb250cm9sQ2xpZW50Q29tcGF0LlZvbHVtZUNhbGxiYWNrIHsKLSAgICAgICAgICAgIHByaXZhdGUgZmluYWwgUmVtb3RlQ29udHJvbENsaWVudENvbXBhdCBtUmNjQ29tcGF0OwotICAgICAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1EaXNjb25uZWN0ZWQ7Ci0KLSAgICAgICAgICAgIHB1YmxpYyBSZW1vdGVDb250cm9sQ2xpZW50UmVjb3JkKE9iamVjdCByY2MpIHsKLSAgICAgICAgICAgICAgICBtUmNjQ29tcGF0ID0gUmVtb3RlQ29udHJvbENsaWVudENvbXBhdC5vYnRhaW4obUFwcGxpY2F0aW9uQ29udGV4dCwgcmNjKTsKLSAgICAgICAgICAgICAgICBtUmNjQ29tcGF0LnNldFZvbHVtZUNhbGxiYWNrKHRoaXMpOwotICAgICAgICAgICAgICAgIHVwZGF0ZVBsYXliYWNrSW5mbygpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgT2JqZWN0IGdldFJlbW90ZUNvbnRyb2xDbGllbnQoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1SY2NDb21wYXQuZ2V0UmVtb3RlQ29udHJvbENsaWVudCgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBkaXNjb25uZWN0KCkgewotICAgICAgICAgICAgICAgIG1EaXNjb25uZWN0ZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIG1SY2NDb21wYXQuc2V0Vm9sdW1lQ2FsbGJhY2sobnVsbCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHVwZGF0ZVBsYXliYWNrSW5mbygpIHsKLSAgICAgICAgICAgICAgICBtUmNjQ29tcGF0LnNldFBsYXliYWNrSW5mbyhtUGxheWJhY2tJbmZvKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvblZvbHVtZVNldFJlcXVlc3QoaW50IHZvbHVtZSkgewotICAgICAgICAgICAgICAgIGlmICghbURpc2Nvbm5lY3RlZCAmJiBtU2VsZWN0ZWRSb3V0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TZWxlY3RlZFJvdXRlLnJlcXVlc3RTZXRWb2x1bWUodm9sdW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25Wb2x1bWVVcGRhdGVSZXF1ZXN0KGludCBkaXJlY3Rpb24pIHsKLSAgICAgICAgICAgICAgICBpZiAoIW1EaXNjb25uZWN0ZWQgJiYgbVNlbGVjdGVkUm91dGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtU2VsZWN0ZWRSb3V0ZS5yZXF1ZXN0VXBkYXRlVm9sdW1lKGRpcmVjdGlvbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBDYWxsYmFja0hhbmRsZXIgZXh0ZW5kcyBIYW5kbGVyIHsKLSAgICAgICAgICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PENhbGxiYWNrUmVjb3JkPiBtVGVtcENhbGxiYWNrUmVjb3JkcyA9Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8Q2FsbGJhY2tSZWNvcmQ+KCk7Ci0KLSAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfVFlQRV9NQVNLID0gMHhmZjAwOwotICAgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19UWVBFX1JPVVRFID0gMHgwMTAwOwotICAgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19UWVBFX1BST1ZJREVSID0gMHgwMjAwOwotCi0gICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNU0dfUk9VVEVfQURERUQgPSBNU0dfVFlQRV9ST1VURSB8IDE7Ci0gICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNU0dfUk9VVEVfUkVNT1ZFRCA9IE1TR19UWVBFX1JPVVRFIHwgMjsKLSAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1TR19ST1VURV9DSEFOR0VEID0gTVNHX1RZUEVfUk9VVEUgfCAzOwotICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1JPVVRFX1ZPTFVNRV9DSEFOR0VEID0gTVNHX1RZUEVfUk9VVEUgfCA0OwotICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1JPVVRFX1BSRVNFTlRBVElPTl9ESVNQTEFZX0NIQU5HRUQgPSBNU0dfVFlQRV9ST1VURSB8IDU7Ci0gICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNU0dfUk9VVEVfU0VMRUNURUQgPSBNU0dfVFlQRV9ST1VURSB8IDY7Ci0gICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNU0dfUk9VVEVfVU5TRUxFQ1RFRCA9IE1TR19UWVBFX1JPVVRFIHwgNzsKLQotICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1BST1ZJREVSX0FEREVEID0gTVNHX1RZUEVfUFJPVklERVIgfCAxOwotICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1BST1ZJREVSX1JFTU9WRUQgPSBNU0dfVFlQRV9QUk9WSURFUiB8IDI7Ci0gICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNU0dfUFJPVklERVJfQ0hBTkdFRCA9IE1TR19UWVBFX1BST1ZJREVSIHwgMzsKLQotICAgICAgICAgICAgQ2FsbGJhY2tIYW5kbGVyKCkgewotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBwb3N0KGludCBtc2csIE9iamVjdCBvYmopIHsKLSAgICAgICAgICAgICAgICBvYnRhaW5NZXNzYWdlKG1zZywgb2JqKS5zZW5kVG9UYXJnZXQoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgcG9zdChpbnQgbXNnLCBPYmplY3Qgb2JqLCBpbnQgYXJnKSB7Ci0gICAgICAgICAgICAgICAgTWVzc2FnZSBtZXNzYWdlID0gb2J0YWluTWVzc2FnZShtc2csIG9iaik7Ci0gICAgICAgICAgICAgICAgbWVzc2FnZS5hcmcxID0gYXJnOwotICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc2VuZFRvVGFyZ2V0KCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1zZykgewotICAgICAgICAgICAgICAgIGZpbmFsIGludCB3aGF0ID0gbXNnLndoYXQ7Ci0gICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IG9iaiA9IG1zZy5vYmo7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IGFyZyA9IG1zZy5hcmcxOwotCi0gICAgICAgICAgICAgICAgaWYgKHdoYXQgPT0gTVNHX1JPVVRFX0NIQU5HRUQKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIGdldFNlbGVjdGVkUm91dGUoKS5nZXRJZCgpLmVxdWFscygoKFJvdXRlSW5mbykgb2JqKS5nZXRJZCgpKSkgewotICAgICAgICAgICAgICAgICAgICB1cGRhdGVTZWxlY3RlZFJvdXRlSWZOZWVkZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gU3luY2hyb25pemUgc3RhdGUgd2l0aCB0aGUgc3lzdGVtIG1lZGlhIHJvdXRlci4KLSAgICAgICAgICAgICAgICBzeW5jV2l0aFN5c3RlbVByb3ZpZGVyKHdoYXQsIG9iaik7Ci0KLSAgICAgICAgICAgICAgICAvLyBJbnZva2UgYWxsIHJlZ2lzdGVyZWQgY2FsbGJhY2tzLgotICAgICAgICAgICAgICAgIC8vIEJ1aWxkIGEgbGlzdCBvZiBjYWxsYmFja3MgYmVmb3JlIGludm9raW5nIHRoZW0gaW4gY2FzZSBjYWxsYmFja3MKLSAgICAgICAgICAgICAgICAvLyBhcmUgYWRkZWQgb3IgcmVtb3ZlZCBkdXJpbmcgZGlzcGF0Y2guCi0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IG1Sb3V0ZXJzLnNpemUoKTsgLS1pID49IDA7ICkgewotICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXIgcm91dGVyID0gbVJvdXRlcnMuZ2V0KGkpLmdldCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJvdXRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJvdXRlcnMucmVtb3ZlKGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVGVtcENhbGxiYWNrUmVjb3Jkcy5hZGRBbGwocm91dGVyLm1DYWxsYmFja1JlY29yZHMpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGNhbGxiYWNrQ291bnQgPSBtVGVtcENhbGxiYWNrUmVjb3Jkcy5zaXplKCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2FsbGJhY2tDb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnZva2VDYWxsYmFjayhtVGVtcENhbGxiYWNrUmVjb3Jkcy5nZXQoaSksIHdoYXQsIG9iaiwgYXJnKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgICAgIG1UZW1wQ2FsbGJhY2tSZWNvcmRzLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwcml2YXRlIHZvaWQgc3luY1dpdGhTeXN0ZW1Qcm92aWRlcihpbnQgd2hhdCwgT2JqZWN0IG9iaikgewotICAgICAgICAgICAgICAgIHN3aXRjaCAod2hhdCkgewotICAgICAgICAgICAgICAgICAgICBjYXNlIE1TR19ST1VURV9BRERFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TeXN0ZW1Qcm92aWRlci5vblN5bmNSb3V0ZUFkZGVkKChSb3V0ZUluZm8pIG9iaik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNU0dfUk9VVEVfUkVNT1ZFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TeXN0ZW1Qcm92aWRlci5vblN5bmNSb3V0ZVJlbW92ZWQoKFJvdXRlSW5mbykgb2JqKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIE1TR19ST1VURV9DSEFOR0VEOgotICAgICAgICAgICAgICAgICAgICAgICAgbVN5c3RlbVByb3ZpZGVyLm9uU3luY1JvdXRlQ2hhbmdlZCgoUm91dGVJbmZvKSBvYmopOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgTVNHX1JPVVRFX1NFTEVDVEVEOgotICAgICAgICAgICAgICAgICAgICAgICAgbVN5c3RlbVByb3ZpZGVyLm9uU3luY1JvdXRlU2VsZWN0ZWQoKFJvdXRlSW5mbykgb2JqKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIGludm9rZUNhbGxiYWNrKENhbGxiYWNrUmVjb3JkIHJlY29yZCwgaW50IHdoYXQsIE9iamVjdCBvYmosIGludCBhcmcpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVJvdXRlciByb3V0ZXIgPSByZWNvcmQubVJvdXRlcjsKLSAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVJvdXRlci5DYWxsYmFjayBjYWxsYmFjayA9IHJlY29yZC5tQ2FsbGJhY2s7Ci0gICAgICAgICAgICAgICAgc3dpdGNoICh3aGF0ICYgTVNHX1RZUEVfTUFTSykgewotICAgICAgICAgICAgICAgICAgICBjYXNlIE1TR19UWVBFX1JPVVRFOiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBSb3V0ZUluZm8gcm91dGUgPSAoUm91dGVJbmZvKW9iajsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVjb3JkLmZpbHRlclJvdXRlRXZlbnQocm91dGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHdoYXQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE1TR19ST1VURV9BRERFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sub25Sb3V0ZUFkZGVkKHJvdXRlciwgcm91dGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE1TR19ST1VURV9SRU1PVkVEOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5vblJvdXRlUmVtb3ZlZChyb3V0ZXIsIHJvdXRlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNU0dfUk9VVEVfQ0hBTkdFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sub25Sb3V0ZUNoYW5nZWQocm91dGVyLCByb3V0ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTVNHX1JPVVRFX1ZPTFVNRV9DSEFOR0VEOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5vblJvdXRlVm9sdW1lQ2hhbmdlZChyb3V0ZXIsIHJvdXRlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNU0dfUk9VVEVfUFJFU0VOVEFUSU9OX0RJU1BMQVlfQ0hBTkdFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sub25Sb3V0ZVByZXNlbnRhdGlvbkRpc3BsYXlDaGFuZ2VkKHJvdXRlciwgcm91dGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE1TR19ST1VURV9TRUxFQ1RFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sub25Sb3V0ZVNlbGVjdGVkKHJvdXRlciwgcm91dGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE1TR19ST1VURV9VTlNFTEVDVEVEOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5vblJvdXRlVW5zZWxlY3RlZChyb3V0ZXIsIHJvdXRlLCBhcmcpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgTVNHX1RZUEVfUFJPVklERVI6IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFByb3ZpZGVySW5mbyBwcm92aWRlciA9IChQcm92aWRlckluZm8pb2JqOwotICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh3aGF0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNU0dfUFJPVklERVJfQURERUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLm9uUHJvdmlkZXJBZGRlZChyb3V0ZXIsIHByb3ZpZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNU0dfUFJPVklERVJfUkVNT1ZFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sub25Qcm92aWRlclJlbW92ZWQocm91dGVyLCBwcm92aWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTVNHX1BST1ZJREVSX0NIQU5HRUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLm9uUHJvdmlkZXJDaGFuZ2VkKHJvdXRlciwgcHJvdmlkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYVNlc3Npb25TdGF0dXMuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYVNlc3Npb25TdGF0dXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzIwNjU5Ni4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFTZXNzaW9uU3RhdHVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhOwotCi1pbXBvcnQgYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudDsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC51dGlsLlRpbWVVdGlsczsKLQotLyoqCi0gKiBEZXNjcmliZXMgdGhlIHBsYXliYWNrIHN0YXR1cyBvZiBhIG1lZGlhIHNlc3Npb24uCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgaXMgcGFydCBvZiB0aGUgcmVtb3RlIHBsYXliYWNrIHByb3RvY29sIGRlc2NyaWJlZCBieSB0aGUKLSAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQgTWVkaWFDb250cm9sSW50ZW50fSBjbGFzcy4KLSAqIDwvcD48cD4KLSAqIFdoZW4gYSBtZWRpYSBzZXNzaW9uIGlzIGNyZWF0ZWQsIGl0IGlzIGluaXRpYWxseSBpbiB0aGUKLSAqIHtAbGluayAjU0VTU0lPTl9TVEFURV9BQ1RJVkUgYWN0aXZlfSBzdGF0ZS4gIFdoZW4gdGhlIG1lZGlhIHNlc3Npb24gZW5kcwotICogbm9ybWFsbHksIGl0IHRyYW5zaXRpb25zIHRvIHRoZSB7QGxpbmsgI1NFU1NJT05fU1RBVEVfRU5ERUQgZW5kZWR9IHN0YXRlLgotICogSWYgdGhlIG1lZGlhIHNlc3Npb24gaXMgaW52YWxpZGF0ZWQgZHVlIHRvIGFub3RoZXIgc2Vzc2lvbiBmb3JjaWJseSB0YWtpbmcKLSAqIGNvbnRyb2wgb2YgdGhlIHJvdXRlLCB0aGVuIGl0IHRyYW5zaXRpb25zIHRvIHRoZQotICoge0BsaW5rICNTRVNTSU9OX1NUQVRFX0lOVkFMSURBVEVEIGludmFsaWRhdGVkfSBzdGF0ZS4KLSAqIFJlZmVyIHRvIHRoZSBkb2N1bWVudGF0aW9uIG9mIGVhY2ggc3RhdGUgZm9yIGFuIGV4cGxhbmF0aW9uIG9mIGl0cyBtZWFuaW5nLgotICogPC9wPjxwPgotICogVG8gbW9uaXRvciBzZXNzaW9uIHN0YXR1cywgdGhlIGFwcGxpY2F0aW9uIHNob3VsZCBzdXBwbHkgYSB7QGxpbmsgUGVuZGluZ0ludGVudH0gdG8gdXNlIGFzIHRoZQotICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNFWFRSQV9TRVNTSU9OX1NUQVRVU19VUERBVEVfUkVDRUlWRVIgc2Vzc2lvbiBzdGF0dXMgdXBkYXRlIHJlY2VpdmVyfQotICogZm9yIGEgZ2l2ZW4ge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fU1RBUlRfU0VTU0lPTiBzZXNzaW9uIHN0YXJ0IHJlcXVlc3R9LgotICogPC9wPjxwPgotICogVGhpcyBvYmplY3QgaXMgaW1tdXRhYmxlIG9uY2UgY3JlYXRlZCB1c2luZyBhIHtAbGluayBCdWlsZGVyfSBpbnN0YW5jZS4KLSAqIDwvcD4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE1lZGlhU2Vzc2lvblN0YXR1cyB7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfVElNRVNUQU1QID0gInRpbWVzdGFtcCI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfU0VTU0lPTl9TVEFURSA9ICJzZXNzaW9uU3RhdGUiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1FVRVVFX1BBVVNFRCA9ICJxdWV1ZVBhdXNlZCI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfRVhUUkFTID0gImV4dHJhcyI7Ci0KLSAgICBmaW5hbCBCdW5kbGUgbUJ1bmRsZTsKLQotICAgIC8qKgotICAgICAqIFNlc3Npb24gc3RhdGU6IEFjdGl2ZS4KLSAgICAgKiA8cD4KLSAgICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgbWVkaWEgc2Vzc2lvbiBpcyBhY3RpdmUgYW5kIGluIGNvbnRyb2wgb2YgdGhlIHJvdXRlLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRVNTSU9OX1NUQVRFX0FDVElWRSA9IDA7Ci0KLSAgICAvKioKLSAgICAgKiBTZXNzaW9uIHN0YXRlOiBFbmRlZC4KLSAgICAgKiA8cD4KLSAgICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgbWVkaWEgc2Vzc2lvbiB3YXMgZW5kZWQgbm9ybWFsbHkgdXNpbmcgdGhlCi0gICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fRU5EX1NFU1NJT04gZW5kIHNlc3Npb259IGFjdGlvbi4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogQSB0ZXJtaW5hdGVkIG1lZGlhIHNlc3Npb24gY2Fubm90IGJlIHVzZWQgYW55bW9yZS4gIFRvIHBsYXkgbW9yZSBtZWRpYSwgdGhlCi0gICAgICogYXBwbGljYXRpb24gbXVzdCBzdGFydCBhIG5ldyBzZXNzaW9uLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRVNTSU9OX1NUQVRFX0VOREVEID0gMTsKLQotICAgIC8qKgotICAgICAqIFNlc3Npb24gc3RhdGU6IEludmFsaWRhdGVkLgotICAgICAqIDxwPgotICAgICAqIEluZGljYXRlcyB0aGF0IHRoZSBtZWRpYSBzZXNzaW9uIHdhcyBpbnZhbGlkYXRlZCBpbnZvbHVudGFyaWx5IGR1ZSB0bwotICAgICAqIGFub3RoZXIgc2Vzc2lvbiB0YWtpbmcgY29udHJvbCBvZiB0aGUgcm91dGUuCi0gICAgICogPC9wPjxwPgotICAgICAqIEFuIGludmFsaWRhdGVkIG1lZGlhIHNlc3Npb24gY2Fubm90IGJlIHVzZWQgYW55bW9yZS4gIFRvIHBsYXkgbW9yZSBtZWRpYSwgdGhlCi0gICAgICogYXBwbGljYXRpb24gbXVzdCBzdGFydCBhIG5ldyBzZXNzaW9uLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRVNTSU9OX1NUQVRFX0lOVkFMSURBVEVEID0gMjsKLQotICAgIE1lZGlhU2Vzc2lvblN0YXR1cyhCdW5kbGUgYnVuZGxlKSB7Ci0gICAgICAgIG1CdW5kbGUgPSBidW5kbGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdGltZXN0YW1wIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3RhdHVzIGluZm9ybWF0aW9uIGluCi0gICAgICogbWlsbGlzZWNvbmRzIHNpbmNlIGJvb3QgaW4gdGhlIHtAbGluayBTeXN0ZW1DbG9jayNlbGFwc2VkUmVhbHRpbWV9IHRpbWUgYmFzZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIHN0YXR1cyB0aW1lc3RhbXAgaW4gdGhlIHtAbGluayBTeXN0ZW1DbG9jayNlbGFwc2VkUmVhbHRpbWUoKX0gdGltZSBiYXNlLgotICAgICAqLwotICAgIHB1YmxpYyBsb25nIGdldFRpbWVzdGFtcCgpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0TG9uZyhLRVlfVElNRVNUQU1QKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBzZXNzaW9uIHN0YXRlLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgc2Vzc2lvbiBzdGF0ZS4gIE9uZSBvZiB7QGxpbmsgI1NFU1NJT05fU1RBVEVfQUNUSVZFfSwKLSAgICAgKiB7QGxpbmsgI1NFU1NJT05fU1RBVEVfRU5ERUR9LCBvciB7QGxpbmsgI1NFU1NJT05fU1RBVEVfSU5WQUxJREFURUR9LgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0U2Vzc2lvblN0YXRlKCkgewotICAgICAgICByZXR1cm4gbUJ1bmRsZS5nZXRJbnQoS0VZX1NFU1NJT05fU1RBVEUsIFNFU1NJT05fU1RBVEVfSU5WQUxJREFURUQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc2Vzc2lvbidzIHF1ZXVlIGlzIHBhdXNlZC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgc2Vzc2lvbidzIHF1ZXVlIGlzIHBhdXNlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1F1ZXVlUGF1c2VkKCkgewotICAgICAgICByZXR1cm4gbUJ1bmRsZS5nZXRCb29sZWFuKEtFWV9RVUVVRV9QQVVTRUQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgYSBidW5kbGUgb2YgZXh0cmFzIGZvciB0aGlzIHN0YXR1cyBvYmplY3QuCi0gICAgICogVGhlIGV4dHJhcyB3aWxsIGJlIGlnbm9yZWQgYnkgdGhlIG1lZGlhIHJvdXRlciBidXQgdGhleSBtYXkgYmUgdXNlZAotICAgICAqIGJ5IGFwcGxpY2F0aW9ucy4KLSAgICAgKi8KLSAgICBwdWJsaWMgQnVuZGxlIGdldEV4dHJhcygpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0QnVuZGxlKEtFWV9FWFRSQVMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiTWVkaWFTZXNzaW9uU3RhdHVzeyAiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgidGltZXN0YW1wPSIpOwotICAgICAgICBUaW1lVXRpbHMuZm9ybWF0RHVyYXRpb24oU3lzdGVtQ2xvY2suZWxhcHNlZFJlYWx0aW1lKCkgLSBnZXRUaW1lc3RhbXAoKSwgcmVzdWx0KTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiIG1zIGFnbyIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIHNlc3Npb25TdGF0ZT0iKS5hcHBlbmQoc2Vzc2lvblN0YXRlVG9TdHJpbmcoZ2V0U2Vzc2lvblN0YXRlKCkpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBxdWV1ZVBhdXNlZD0iKS5hcHBlbmQoaXNRdWV1ZVBhdXNlZCgpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBleHRyYXM9IikuYXBwZW5kKGdldEV4dHJhcygpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiIH0iKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBzZXNzaW9uU3RhdGVUb1N0cmluZyhpbnQgc2Vzc2lvblN0YXRlKSB7Ci0gICAgICAgIHN3aXRjaCAoc2Vzc2lvblN0YXRlKSB7Ci0gICAgICAgICAgICBjYXNlIFNFU1NJT05fU1RBVEVfQUNUSVZFOgotICAgICAgICAgICAgICAgIHJldHVybiAiYWN0aXZlIjsKLSAgICAgICAgICAgIGNhc2UgU0VTU0lPTl9TVEFURV9FTkRFRDoKLSAgICAgICAgICAgICAgICByZXR1cm4gImVuZGVkIjsKLSAgICAgICAgICAgIGNhc2UgU0VTU0lPTl9TVEFURV9JTlZBTElEQVRFRDoKLSAgICAgICAgICAgICAgICByZXR1cm4gImludmFsaWRhdGVkIjsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gSW50ZWdlci50b1N0cmluZyhzZXNzaW9uU3RhdGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIHRoaXMgb2JqZWN0IHRvIGEgYnVuZGxlIGZvciBzZXJpYWxpemF0aW9uLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgY29udGVudHMgb2YgdGhlIG9iamVjdCByZXByZXNlbnRlZCBhcyBhIGJ1bmRsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgQnVuZGxlIGFzQnVuZGxlKCkgewotICAgICAgICByZXR1cm4gbUJ1bmRsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIGZyb20gYSBidW5kbGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYnVuZGxlIFRoZSBidW5kbGUsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKiBAcmV0dXJuIFRoZSBuZXcgaW5zdGFuY2UsIG9yIG51bGwgaWYgdGhlIGJ1bmRsZSB3YXMgbnVsbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE1lZGlhU2Vzc2lvblN0YXR1cyBmcm9tQnVuZGxlKEJ1bmRsZSBidW5kbGUpIHsKLSAgICAgICAgcmV0dXJuIGJ1bmRsZSAhPSBudWxsID8gbmV3IE1lZGlhU2Vzc2lvblN0YXR1cyhidW5kbGUpIDogbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBCdWlsZGVyIGZvciB7QGxpbmsgTWVkaWFTZXNzaW9uU3RhdHVzIG1lZGlhIHNlc3Npb24gc3RhdHVzIG9iamVjdHN9LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQnVpbGRlciB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgQnVuZGxlIG1CdW5kbGU7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENyZWF0ZXMgYSBtZWRpYSBzZXNzaW9uIHN0YXR1cyBidWlsZGVyIHVzaW5nIHRoZSBjdXJyZW50IHRpbWUgYXMgdGhlCi0gICAgICAgICAqIHJlZmVyZW5jZSB0aW1lc3RhbXAuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBzZXNzaW9uU3RhdGUgVGhlIHNlc3Npb24gc3RhdGUuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlcihpbnQgc2Vzc2lvblN0YXRlKSB7Ci0gICAgICAgICAgICBtQnVuZGxlID0gbmV3IEJ1bmRsZSgpOwotICAgICAgICAgICAgc2V0VGltZXN0YW1wKFN5c3RlbUNsb2NrLmVsYXBzZWRSZWFsdGltZSgpKTsKLSAgICAgICAgICAgIHNldFNlc3Npb25TdGF0ZShzZXNzaW9uU3RhdGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENyZWF0ZXMgYSBtZWRpYSBzZXNzaW9uIHN0YXR1cyBidWlsZGVyIHdob3NlIGluaXRpYWwgY29udGVudHMgYXJlCi0gICAgICAgICAqIGNvcGllZCBmcm9tIGFuIGV4aXN0aW5nIHN0YXR1cy4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyKE1lZGlhU2Vzc2lvblN0YXR1cyBzdGF0dXMpIHsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInN0YXR1cyBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1CdW5kbGUgPSBuZXcgQnVuZGxlKHN0YXR1cy5tQnVuZGxlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSB0aW1lc3RhbXAgYXNzb2NpYXRlZCB3aXRoIHRoZSBzdGF0dXMgaW5mb3JtYXRpb24gaW4KLSAgICAgICAgICogbWlsbGlzZWNvbmRzIHNpbmNlIGJvb3QgaW4gdGhlIHtAbGluayBTeXN0ZW1DbG9jayNlbGFwc2VkUmVhbHRpbWV9IHRpbWUgYmFzZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldFRpbWVzdGFtcChsb25nIGVsYXBzZWRSZWFsdGltZVRpbWVzdGFtcCkgewotICAgICAgICAgICAgbUJ1bmRsZS5wdXRMb25nKEtFWV9USU1FU1RBTVAsIGVsYXBzZWRSZWFsdGltZVRpbWVzdGFtcCk7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSBzZXNzaW9uIHN0YXRlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0U2Vzc2lvblN0YXRlKGludCBzZXNzaW9uU3RhdGUpIHsKLSAgICAgICAgICAgIG1CdW5kbGUucHV0SW50KEtFWV9TRVNTSU9OX1NUQVRFLCBzZXNzaW9uU3RhdGUpOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB3aGV0aGVyIHRoZSBxdWV1ZSBpcyBwYXVzZWQuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRRdWV1ZVBhdXNlZChib29sZWFuIHF1ZXVlUGF1c2VkKSB7Ci0gICAgICAgICAgICBtQnVuZGxlLnB1dEJvb2xlYW4oS0VZX1FVRVVFX1BBVVNFRCwgcXVldWVQYXVzZWQpOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyBhIGJ1bmRsZSBvZiBleHRyYXMgZm9yIHRoaXMgc3RhdHVzIG9iamVjdC4KLSAgICAgICAgICogVGhlIGV4dHJhcyB3aWxsIGJlIGlnbm9yZWQgYnkgdGhlIG1lZGlhIHJvdXRlciBidXQgdGhleSBtYXkgYmUgdXNlZAotICAgICAgICAgKiBieSBhcHBsaWNhdGlvbnMuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRFeHRyYXMoQnVuZGxlIGV4dHJhcykgewotICAgICAgICAgICAgbUJ1bmRsZS5wdXRCdW5kbGUoS0VZX0VYVFJBUywgZXh0cmFzKTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEJ1aWxkcyB0aGUge0BsaW5rIE1lZGlhU2Vzc2lvblN0YXR1cyBtZWRpYSBzZXNzaW9uIHN0YXR1cyBvYmplY3R9LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIE1lZGlhU2Vzc2lvblN0YXR1cyBidWlsZCgpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgTWVkaWFTZXNzaW9uU3RhdHVzKG1CdW5kbGUpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL1JlZ2lzdGVyZWRNZWRpYVJvdXRlUHJvdmlkZXIuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9SZWdpc3RlcmVkTWVkaWFSb3V0ZVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4ZTRlMjguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL1JlZ2lzdGVyZWRNZWRpYVJvdXRlUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWE7Ci0KLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5DTElFTlRfREFUQV9ST1VURV9JRDsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAotICAgICAgICAuQ0xJRU5UX0RBVEFfUk9VVEVfTElCUkFSWV9HUk9VUDsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAotICAgICAgICAuQ0xJRU5UX0RBVEFfVU5TRUxFQ1RfUkVBU09OOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sLkNMSUVOVF9EQVRBX1ZPTFVNRTsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAotICAgICAgICAuQ0xJRU5UX01TR19DUkVBVEVfUk9VVEVfQ09OVFJPTExFUjsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5DTElFTlRfTVNHX1JFR0lTVEVSOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCi0gICAgICAgIC5DTElFTlRfTVNHX1JFTEVBU0VfUk9VVEVfQ09OVFJPTExFUjsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAotICAgICAgICAuQ0xJRU5UX01TR19ST1VURV9DT05UUk9MX1JFUVVFU1Q7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wuQ0xJRU5UX01TR19TRUxFQ1RfUk9VVEU7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wKLSAgICAgICAgLkNMSUVOVF9NU0dfU0VUX0RJU0NPVkVSWV9SRVFVRVNUOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCi0gICAgICAgIC5DTElFTlRfTVNHX1NFVF9ST1VURV9WT0xVTUU7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wuQ0xJRU5UX01TR19VTlJFR0lTVEVSOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCi0gICAgICAgIC5DTElFTlRfTVNHX1VOU0VMRUNUX1JPVVRFOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCi0gICAgICAgIC5DTElFTlRfTVNHX1VQREFURV9ST1VURV9WT0xVTUU7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wuQ0xJRU5UX1ZFUlNJT05fQ1VSUkVOVDsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5TRVJWSUNFX0RBVEFfRVJST1I7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wKLSAgICAgICAgLlNFUlZJQ0VfTVNHX0NPTlRST0xfUkVRVUVTVF9GQUlMRUQ7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wKLSAgICAgICAgLlNFUlZJQ0VfTVNHX0NPTlRST0xfUkVRVUVTVF9TVUNDRUVERUQ7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wKLSAgICAgICAgLlNFUlZJQ0VfTVNHX0RFU0NSSVBUT1JfQ0hBTkdFRDsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAotICAgICAgICAuU0VSVklDRV9NU0dfR0VORVJJQ19GQUlMVVJFOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCi0gICAgICAgIC5TRVJWSUNFX01TR19HRU5FUklDX1NVQ0NFU1M7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wuU0VSVklDRV9NU0dfUkVHSVNURVJFRDsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5TRVJWSUNFX1ZFUlNJT05fMTsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5pc1ZhbGlkUmVtb3RlTWVzc2VuZ2VyOwotCi1pbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLk5vbk51bGw7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuU2VydmljZUNvbm5lY3Rpb247Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5EZWFkT2JqZWN0RXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKLWltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyLkRlYXRoUmVjaXBpZW50OwotaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKLWltcG9ydCBhbmRyb2lkLm9zLk1lc3NlbmdlcjsKLWltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGFuZHJvaWQudXRpbC5TcGFyc2VBcnJheTsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZXIuQ29udHJvbFJlcXVlc3RDYWxsYmFjazsKLQotaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIE1haW50YWlucyBhIGNvbm5lY3Rpb24gdG8gYSBwYXJ0aWN1bGFyIG1lZGlhIHJvdXRlIHByb3ZpZGVyIHNlcnZpY2UuCi0gKi8KLWZpbmFsIGNsYXNzIFJlZ2lzdGVyZWRNZWRpYVJvdXRlUHJvdmlkZXIgZXh0ZW5kcyBNZWRpYVJvdXRlUHJvdmlkZXIKLSAgICAgICAgaW1wbGVtZW50cyBTZXJ2aWNlQ29ubmVjdGlvbiB7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTWVkaWFSb3V0ZVByb3ZpZGVyUHJveHkiOyAgLy8gbWF4LiAyMyBjaGFycwotICAgIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBDb21wb25lbnROYW1lIG1Db21wb25lbnROYW1lOwotICAgIGZpbmFsIFByaXZhdGVIYW5kbGVyIG1Qcml2YXRlSGFuZGxlcjsKLSAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxDb250cm9sbGVyPiBtQ29udHJvbGxlcnMgPSBuZXcgQXJyYXlMaXN0PENvbnRyb2xsZXI+KCk7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gbVN0YXJ0ZWQ7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1Cb3VuZDsKLSAgICBwcml2YXRlIENvbm5lY3Rpb24gbUFjdGl2ZUNvbm5lY3Rpb247Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1Db25uZWN0aW9uUmVhZHk7Ci0KLSAgICBwdWJsaWMgUmVnaXN0ZXJlZE1lZGlhUm91dGVQcm92aWRlcihDb250ZXh0IGNvbnRleHQsIENvbXBvbmVudE5hbWUgY29tcG9uZW50TmFtZSkgewotICAgICAgICBzdXBlcihjb250ZXh0LCBuZXcgUHJvdmlkZXJNZXRhZGF0YShjb21wb25lbnROYW1lKSk7Ci0KLSAgICAgICAgbUNvbXBvbmVudE5hbWUgPSBjb21wb25lbnROYW1lOwotICAgICAgICBtUHJpdmF0ZUhhbmRsZXIgPSBuZXcgUHJpdmF0ZUhhbmRsZXIoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgUm91dGVDb250cm9sbGVyIG9uQ3JlYXRlUm91dGVDb250cm9sbGVyKEBOb25OdWxsIFN0cmluZyByb3V0ZUlkKSB7Ci0gICAgICAgIGlmIChyb3V0ZUlkID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInJvdXRlSWQgY2Fubm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY3JlYXRlUm91dGVDb250cm9sbGVyKHJvdXRlSWQsIG51bGwpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBSb3V0ZUNvbnRyb2xsZXIgb25DcmVhdGVSb3V0ZUNvbnRyb2xsZXIoCi0gICAgICAgICAgICBATm9uTnVsbCBTdHJpbmcgcm91dGVJZCwgQE5vbk51bGwgU3RyaW5nIHJvdXRlR3JvdXBJZCkgewotICAgICAgICBpZiAocm91dGVJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJyb3V0ZUlkIGNhbm5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJvdXRlR3JvdXBJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJyb3V0ZUdyb3VwSWQgY2Fubm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY3JlYXRlUm91dGVDb250cm9sbGVyKHJvdXRlSWQsIHJvdXRlR3JvdXBJZCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25EaXNjb3ZlcnlSZXF1ZXN0Q2hhbmdlZChNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdCByZXF1ZXN0KSB7Ci0gICAgICAgIGlmIChtQ29ubmVjdGlvblJlYWR5KSB7Ci0gICAgICAgICAgICBtQWN0aXZlQ29ubmVjdGlvbi5zZXREaXNjb3ZlcnlSZXF1ZXN0KHJlcXVlc3QpOwotICAgICAgICB9Ci0gICAgICAgIHVwZGF0ZUJpbmRpbmcoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblNlcnZpY2VDb25uZWN0ZWQoQ29tcG9uZW50TmFtZSBuYW1lLCBJQmluZGVyIHNlcnZpY2UpIHsKLSAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsIHRoaXMgKyAiOiBDb25uZWN0ZWQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtQm91bmQpIHsKLSAgICAgICAgICAgIGRpc2Nvbm5lY3QoKTsKLQotICAgICAgICAgICAgTWVzc2VuZ2VyIG1lc3NlbmdlciA9IChzZXJ2aWNlICE9IG51bGwgPyBuZXcgTWVzc2VuZ2VyKHNlcnZpY2UpIDogbnVsbCk7Ci0gICAgICAgICAgICBpZiAoaXNWYWxpZFJlbW90ZU1lc3NlbmdlcihtZXNzZW5nZXIpKSB7Ci0gICAgICAgICAgICAgICAgQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gbmV3IENvbm5lY3Rpb24obWVzc2VuZ2VyKTsKLSAgICAgICAgICAgICAgICBpZiAoY29ubmVjdGlvbi5yZWdpc3RlcigpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1BY3RpdmVDb25uZWN0aW9uID0gY29ubmVjdGlvbjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgdGhpcyArICI6IFJlZ2lzdHJhdGlvbiBmYWlsZWQiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoVEFHLCB0aGlzICsgIjogU2VydmljZSByZXR1cm5lZCBpbnZhbGlkIG1lc3NlbmdlciBiaW5kZXIiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uU2VydmljZURpc2Nvbm5lY3RlZChDb21wb25lbnROYW1lIG5hbWUpIHsKLSAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsIHRoaXMgKyAiOiBTZXJ2aWNlIGRpc2Nvbm5lY3RlZCIpOwotICAgICAgICB9Ci0gICAgICAgIGRpc2Nvbm5lY3QoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gIlNlcnZpY2UgY29ubmVjdGlvbiAiICsgbUNvbXBvbmVudE5hbWUuZmxhdHRlblRvU2hvcnRTdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNDb21wb25lbnROYW1lKFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIGNsYXNzTmFtZSkgewotICAgICAgICByZXR1cm4gbUNvbXBvbmVudE5hbWUuZ2V0UGFja2FnZU5hbWUoKS5lcXVhbHMocGFja2FnZU5hbWUpCi0gICAgICAgICAgICAgICAgJiYgbUNvbXBvbmVudE5hbWUuZ2V0Q2xhc3NOYW1lKCkuZXF1YWxzKGNsYXNzTmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc3RhcnQoKSB7Ci0gICAgICAgIGlmICghbVN0YXJ0ZWQpIHsKLSAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgdGhpcyArICI6IFN0YXJ0aW5nIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1TdGFydGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIHVwZGF0ZUJpbmRpbmcoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHN0b3AoKSB7Ci0gICAgICAgIGlmIChtU3RhcnRlZCkgewotICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCB0aGlzICsgIjogU3RvcHBpbmciKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIHVwZGF0ZUJpbmRpbmcoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlYmluZElmRGlzY29ubmVjdGVkKCkgewotICAgICAgICBpZiAobUFjdGl2ZUNvbm5lY3Rpb24gPT0gbnVsbCAmJiBzaG91bGRCaW5kKCkpIHsKLSAgICAgICAgICAgIHVuYmluZCgpOwotICAgICAgICAgICAgYmluZCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUJpbmRpbmcoKSB7Ci0gICAgICAgIGlmIChzaG91bGRCaW5kKCkpIHsKLSAgICAgICAgICAgIGJpbmQoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHVuYmluZCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIHNob3VsZEJpbmQoKSB7Ci0gICAgICAgIGlmIChtU3RhcnRlZCkgewotICAgICAgICAgICAgLy8gQmluZCB3aGVuZXZlciB0aGVyZSBpcyBhIGRpc2NvdmVyeSByZXF1ZXN0LgotICAgICAgICAgICAgaWYgKGdldERpc2NvdmVyeVJlcXVlc3QoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIEJpbmQgd2hlbmV2ZXIgdGhlIGFwcGxpY2F0aW9uIGhhcyBhbiBhY3RpdmUgcm91dGUgY29udHJvbGxlci4KLSAgICAgICAgICAgIC8vIFRoaXMgbWVhbnMgdGhhdCBvbmUgb2YgdGhpcyBwcm92aWRlcidzIHJvdXRlcyBpcyBzZWxlY3RlZC4KLSAgICAgICAgICAgIGlmICghbUNvbnRyb2xsZXJzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYmluZCgpIHsKLSAgICAgICAgaWYgKCFtQm91bmQpIHsKLSAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgdGhpcyArICI6IEJpbmRpbmciKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgSW50ZW50IHNlcnZpY2UgPSBuZXcgSW50ZW50KE1lZGlhUm91dGVQcm92aWRlclByb3RvY29sLlNFUlZJQ0VfSU5URVJGQUNFKTsKLSAgICAgICAgICAgIHNlcnZpY2Uuc2V0Q29tcG9uZW50KG1Db21wb25lbnROYW1lKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbUJvdW5kID0gZ2V0Q29udGV4dCgpLmJpbmRTZXJ2aWNlKHNlcnZpY2UsIHRoaXMsIENvbnRleHQuQklORF9BVVRPX0NSRUFURSk7Ci0gICAgICAgICAgICAgICAgaWYgKCFtQm91bmQgJiYgREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCB0aGlzICsgIjogQmluZCBmYWlsZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsIHRoaXMgKyAiOiBCaW5kIGZhaWxlZCIsIGV4KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdW5iaW5kKCkgewotICAgICAgICBpZiAobUJvdW5kKSB7Ci0gICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsIHRoaXMgKyAiOiBVbmJpbmRpbmciKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbUJvdW5kID0gZmFsc2U7Ci0gICAgICAgICAgICBkaXNjb25uZWN0KCk7Ci0gICAgICAgICAgICBnZXRDb250ZXh0KCkudW5iaW5kU2VydmljZSh0aGlzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgUm91dGVDb250cm9sbGVyIGNyZWF0ZVJvdXRlQ29udHJvbGxlcihTdHJpbmcgcm91dGVJZCwgU3RyaW5nIHJvdXRlR3JvdXBJZCkgewotICAgICAgICBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBnZXREZXNjcmlwdG9yKCk7Ci0gICAgICAgIGlmIChkZXNjcmlwdG9yICE9IG51bGwpIHsKLSAgICAgICAgICAgIExpc3Q8TWVkaWFSb3V0ZURlc2NyaXB0b3I+IHJvdXRlcyA9IGRlc2NyaXB0b3IuZ2V0Um91dGVzKCk7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgY291bnQgPSByb3V0ZXMuc2l6ZSgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgTWVkaWFSb3V0ZURlc2NyaXB0b3Igcm91dGUgPSByb3V0ZXMuZ2V0KGkpOwotICAgICAgICAgICAgICAgIGlmIChyb3V0ZS5nZXRJZCgpLmVxdWFscyhyb3V0ZUlkKSkgewotICAgICAgICAgICAgICAgICAgICBDb250cm9sbGVyIGNvbnRyb2xsZXIgPSBuZXcgQ29udHJvbGxlcihyb3V0ZUlkLCByb3V0ZUdyb3VwSWQpOwotICAgICAgICAgICAgICAgICAgICBtQ29udHJvbGxlcnMuYWRkKGNvbnRyb2xsZXIpOwotICAgICAgICAgICAgICAgICAgICBpZiAobUNvbm5lY3Rpb25SZWFkeSkgewotICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5hdHRhY2hDb25uZWN0aW9uKG1BY3RpdmVDb25uZWN0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB1cGRhdGVCaW5kaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBjb250cm9sbGVyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICB2b2lkIG9uQ29ubmVjdGlvblJlYWR5KENvbm5lY3Rpb24gY29ubmVjdGlvbikgewotICAgICAgICBpZiAobUFjdGl2ZUNvbm5lY3Rpb24gPT0gY29ubmVjdGlvbikgewotICAgICAgICAgICAgbUNvbm5lY3Rpb25SZWFkeSA9IHRydWU7Ci0gICAgICAgICAgICBhdHRhY2hDb250cm9sbGVyc1RvQ29ubmVjdGlvbigpOwotCi0gICAgICAgICAgICBNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdCByZXF1ZXN0ID0gZ2V0RGlzY292ZXJ5UmVxdWVzdCgpOwotICAgICAgICAgICAgaWYgKHJlcXVlc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1BY3RpdmVDb25uZWN0aW9uLnNldERpc2NvdmVyeVJlcXVlc3QocmVxdWVzdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIG9uQ29ubmVjdGlvbkRpZWQoQ29ubmVjdGlvbiBjb25uZWN0aW9uKSB7Ci0gICAgICAgIGlmIChtQWN0aXZlQ29ubmVjdGlvbiA9PSBjb25uZWN0aW9uKSB7Ci0gICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsIHRoaXMgKyAiOiBTZXJ2aWNlIGNvbm5lY3Rpb24gZGllZCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGlzY29ubmVjdCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBvbkNvbm5lY3Rpb25FcnJvcihDb25uZWN0aW9uIGNvbm5lY3Rpb24sIFN0cmluZyBlcnJvcikgewotICAgICAgICBpZiAobUFjdGl2ZUNvbm5lY3Rpb24gPT0gY29ubmVjdGlvbikgewotICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCB0aGlzICsgIjogU2VydmljZSBjb25uZWN0aW9uIGVycm9yIC0gIiArIGVycm9yKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHVuYmluZCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBvbkNvbm5lY3Rpb25EZXNjcmlwdG9yQ2hhbmdlZChDb25uZWN0aW9uIGNvbm5lY3Rpb24sCi0gICAgICAgICAgICBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLSAgICAgICAgaWYgKG1BY3RpdmVDb25uZWN0aW9uID09IGNvbm5lY3Rpb24pIHsKLSAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgdGhpcyArICI6IERlc2NyaXB0b3IgY2hhbmdlZCwgZGVzY3JpcHRvcj0iICsgZGVzY3JpcHRvcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXREZXNjcmlwdG9yKGRlc2NyaXB0b3IpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGRpc2Nvbm5lY3QoKSB7Ci0gICAgICAgIGlmIChtQWN0aXZlQ29ubmVjdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzZXREZXNjcmlwdG9yKG51bGwpOwotICAgICAgICAgICAgbUNvbm5lY3Rpb25SZWFkeSA9IGZhbHNlOwotICAgICAgICAgICAgZGV0YWNoQ29udHJvbGxlcnNGcm9tQ29ubmVjdGlvbigpOwotICAgICAgICAgICAgbUFjdGl2ZUNvbm5lY3Rpb24uZGlzcG9zZSgpOwotICAgICAgICAgICAgbUFjdGl2ZUNvbm5lY3Rpb24gPSBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBvbkNvbnRyb2xsZXJSZWxlYXNlZChDb250cm9sbGVyIGNvbnRyb2xsZXIpIHsKLSAgICAgICAgbUNvbnRyb2xsZXJzLnJlbW92ZShjb250cm9sbGVyKTsKLSAgICAgICAgY29udHJvbGxlci5kZXRhY2hDb25uZWN0aW9uKCk7Ci0gICAgICAgIHVwZGF0ZUJpbmRpbmcoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYXR0YWNoQ29udHJvbGxlcnNUb0Nvbm5lY3Rpb24oKSB7Ci0gICAgICAgIGludCBjb3VudCA9IG1Db250cm9sbGVycy5zaXplKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgbUNvbnRyb2xsZXJzLmdldChpKS5hdHRhY2hDb25uZWN0aW9uKG1BY3RpdmVDb25uZWN0aW9uKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBkZXRhY2hDb250cm9sbGVyc0Zyb21Db25uZWN0aW9uKCkgewotICAgICAgICBpbnQgY291bnQgPSBtQ29udHJvbGxlcnMuc2l6ZSgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgIG1Db250cm9sbGVycy5nZXQoaSkuZGV0YWNoQ29ubmVjdGlvbigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBDb250cm9sbGVyIGV4dGVuZHMgUm91dGVDb250cm9sbGVyIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbVJvdXRlSWQ7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1Sb3V0ZUdyb3VwSWQ7Ci0KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1TZWxlY3RlZDsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbVBlbmRpbmdTZXRWb2x1bWUgPSAtMTsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbVBlbmRpbmdVcGRhdGVWb2x1bWVEZWx0YTsKLQotICAgICAgICBwcml2YXRlIENvbm5lY3Rpb24gbUNvbm5lY3Rpb247Ci0gICAgICAgIHByaXZhdGUgaW50IG1Db250cm9sbGVySWQ7Ci0KLSAgICAgICAgcHVibGljIENvbnRyb2xsZXIoU3RyaW5nIHJvdXRlSWQsIFN0cmluZyByb3V0ZUdyb3VwSWQpIHsKLSAgICAgICAgICAgIG1Sb3V0ZUlkID0gcm91dGVJZDsKLSAgICAgICAgICAgIG1Sb3V0ZUdyb3VwSWQgPSByb3V0ZUdyb3VwSWQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBhdHRhY2hDb25uZWN0aW9uKENvbm5lY3Rpb24gY29ubmVjdGlvbikgewotICAgICAgICAgICAgbUNvbm5lY3Rpb24gPSBjb25uZWN0aW9uOwotICAgICAgICAgICAgbUNvbnRyb2xsZXJJZCA9IGNvbm5lY3Rpb24uY3JlYXRlUm91dGVDb250cm9sbGVyKG1Sb3V0ZUlkLCBtUm91dGVHcm91cElkKTsKLSAgICAgICAgICAgIGlmIChtU2VsZWN0ZWQpIHsKLSAgICAgICAgICAgICAgICBjb25uZWN0aW9uLnNlbGVjdFJvdXRlKG1Db250cm9sbGVySWQpOwotICAgICAgICAgICAgICAgIGlmIChtUGVuZGluZ1NldFZvbHVtZSA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24uc2V0Vm9sdW1lKG1Db250cm9sbGVySWQsIG1QZW5kaW5nU2V0Vm9sdW1lKTsKLSAgICAgICAgICAgICAgICAgICAgbVBlbmRpbmdTZXRWb2x1bWUgPSAtMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1QZW5kaW5nVXBkYXRlVm9sdW1lRGVsdGEgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLnVwZGF0ZVZvbHVtZShtQ29udHJvbGxlcklkLCBtUGVuZGluZ1VwZGF0ZVZvbHVtZURlbHRhKTsKLSAgICAgICAgICAgICAgICAgICAgbVBlbmRpbmdVcGRhdGVWb2x1bWVEZWx0YSA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgZGV0YWNoQ29ubmVjdGlvbigpIHsKLSAgICAgICAgICAgIGlmIChtQ29ubmVjdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUNvbm5lY3Rpb24ucmVsZWFzZVJvdXRlQ29udHJvbGxlcihtQ29udHJvbGxlcklkKTsKLSAgICAgICAgICAgICAgICBtQ29ubmVjdGlvbiA9IG51bGw7Ci0gICAgICAgICAgICAgICAgbUNvbnRyb2xsZXJJZCA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25SZWxlYXNlKCkgewotICAgICAgICAgICAgb25Db250cm9sbGVyUmVsZWFzZWQodGhpcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25TZWxlY3QoKSB7Ci0gICAgICAgICAgICBtU2VsZWN0ZWQgPSB0cnVlOwotICAgICAgICAgICAgaWYgKG1Db25uZWN0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtQ29ubmVjdGlvbi5zZWxlY3RSb3V0ZShtQ29udHJvbGxlcklkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblVuc2VsZWN0KCkgewotICAgICAgICAgICAgb25VbnNlbGVjdChNZWRpYVJvdXRlci5VTlNFTEVDVF9SRUFTT05fVU5LTk9XTik7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25VbnNlbGVjdChpbnQgcmVhc29uKSB7Ci0gICAgICAgICAgICBtU2VsZWN0ZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIGlmIChtQ29ubmVjdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUNvbm5lY3Rpb24udW5zZWxlY3RSb3V0ZShtQ29udHJvbGxlcklkLCByZWFzb24pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU2V0Vm9sdW1lKGludCB2b2x1bWUpIHsKLSAgICAgICAgICAgIGlmIChtQ29ubmVjdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUNvbm5lY3Rpb24uc2V0Vm9sdW1lKG1Db250cm9sbGVySWQsIHZvbHVtZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1QZW5kaW5nU2V0Vm9sdW1lID0gdm9sdW1lOwotICAgICAgICAgICAgICAgIG1QZW5kaW5nVXBkYXRlVm9sdW1lRGVsdGEgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uVXBkYXRlVm9sdW1lKGludCBkZWx0YSkgewotICAgICAgICAgICAgaWYgKG1Db25uZWN0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtQ29ubmVjdGlvbi51cGRhdGVWb2x1bWUobUNvbnRyb2xsZXJJZCwgZGVsdGEpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtUGVuZGluZ1VwZGF0ZVZvbHVtZURlbHRhICs9IGRlbHRhOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIG9uQ29udHJvbFJlcXVlc3QoSW50ZW50IGludGVudCwgQ29udHJvbFJlcXVlc3RDYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICAgICAgaWYgKG1Db25uZWN0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbUNvbm5lY3Rpb24uc2VuZENvbnRyb2xSZXF1ZXN0KG1Db250cm9sbGVySWQsIGludGVudCwgY2FsbGJhY2spOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBDb25uZWN0aW9uIGltcGxlbWVudHMgRGVhdGhSZWNpcGllbnQgewotICAgICAgICBwcml2YXRlIGZpbmFsIE1lc3NlbmdlciBtU2VydmljZU1lc3NlbmdlcjsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBSZWNlaXZlSGFuZGxlciBtUmVjZWl2ZUhhbmRsZXI7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgTWVzc2VuZ2VyIG1SZWNlaXZlTWVzc2VuZ2VyOwotCi0gICAgICAgIHByaXZhdGUgaW50IG1OZXh0UmVxdWVzdElkID0gMTsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbU5leHRDb250cm9sbGVySWQgPSAxOwotICAgICAgICBwcml2YXRlIGludCBtU2VydmljZVZlcnNpb247IC8vIG5vbi16ZXJvIHdoZW4gcmVnaXN0cmF0aW9uIGNvbXBsZXRlCi0KLSAgICAgICAgcHJpdmF0ZSBpbnQgbVBlbmRpbmdSZWdpc3RlclJlcXVlc3RJZDsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTcGFyc2VBcnJheTxDb250cm9sUmVxdWVzdENhbGxiYWNrPiBtUGVuZGluZ0NhbGxiYWNrcyA9Ci0gICAgICAgICAgICAgICAgbmV3IFNwYXJzZUFycmF5PENvbnRyb2xSZXF1ZXN0Q2FsbGJhY2s+KCk7Ci0KLSAgICAgICAgcHVibGljIENvbm5lY3Rpb24oTWVzc2VuZ2VyIHNlcnZpY2VNZXNzZW5nZXIpIHsKLSAgICAgICAgICAgIG1TZXJ2aWNlTWVzc2VuZ2VyID0gc2VydmljZU1lc3NlbmdlcjsKLSAgICAgICAgICAgIG1SZWNlaXZlSGFuZGxlciA9IG5ldyBSZWNlaXZlSGFuZGxlcih0aGlzKTsKLSAgICAgICAgICAgIG1SZWNlaXZlTWVzc2VuZ2VyID0gbmV3IE1lc3NlbmdlcihtUmVjZWl2ZUhhbmRsZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gcmVnaXN0ZXIoKSB7Ci0gICAgICAgICAgICBtUGVuZGluZ1JlZ2lzdGVyUmVxdWVzdElkID0gbU5leHRSZXF1ZXN0SWQrKzsKLSAgICAgICAgICAgIGlmICghc2VuZFJlcXVlc3QoQ0xJRU5UX01TR19SRUdJU1RFUiwKLSAgICAgICAgICAgICAgICAgICAgbVBlbmRpbmdSZWdpc3RlclJlcXVlc3RJZCwKLSAgICAgICAgICAgICAgICAgICAgQ0xJRU5UX1ZFUlNJT05fQ1VSUkVOVCwgbnVsbCwgbnVsbCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbVNlcnZpY2VNZXNzZW5nZXIuZ2V0QmluZGVyKCkubGlua1RvRGVhdGgodGhpcywgMCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICBiaW5kZXJEaWVkKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgICAgICAgICAgc2VuZFJlcXVlc3QoQ0xJRU5UX01TR19VTlJFR0lTVEVSLCAwLCAwLCBudWxsLCBudWxsKTsKLSAgICAgICAgICAgIG1SZWNlaXZlSGFuZGxlci5kaXNwb3NlKCk7Ci0gICAgICAgICAgICBtU2VydmljZU1lc3Nlbmdlci5nZXRCaW5kZXIoKS51bmxpbmtUb0RlYXRoKHRoaXMsIDApOwotCi0gICAgICAgICAgICBtUHJpdmF0ZUhhbmRsZXIucG9zdChuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICBmYWlsUGVuZGluZ0NhbGxiYWNrcygpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBmYWlsUGVuZGluZ0NhbGxiYWNrcygpIHsKLSAgICAgICAgICAgIGludCBjb3VudCA9IDA7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1QZW5kaW5nQ2FsbGJhY2tzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbVBlbmRpbmdDYWxsYmFja3MudmFsdWVBdChpKS5vbkVycm9yKG51bGwsIG51bGwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVBlbmRpbmdDYWxsYmFja3MuY2xlYXIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIG9uR2VuZXJpY0ZhaWx1cmUoaW50IHJlcXVlc3RJZCkgewotICAgICAgICAgICAgaWYgKHJlcXVlc3RJZCA9PSBtUGVuZGluZ1JlZ2lzdGVyUmVxdWVzdElkKSB7Ci0gICAgICAgICAgICAgICAgbVBlbmRpbmdSZWdpc3RlclJlcXVlc3RJZCA9IDA7Ci0gICAgICAgICAgICAgICAgb25Db25uZWN0aW9uRXJyb3IodGhpcywgIlJlZ2lzdHJhdGlvbiBmYWlsZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIENvbnRyb2xSZXF1ZXN0Q2FsbGJhY2sgY2FsbGJhY2sgPSBtUGVuZGluZ0NhbGxiYWNrcy5nZXQocmVxdWVzdElkKTsKLSAgICAgICAgICAgIGlmIChjYWxsYmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVBlbmRpbmdDYWxsYmFja3MucmVtb3ZlKHJlcXVlc3RJZCk7Ci0gICAgICAgICAgICAgICAgY2FsbGJhY2sub25FcnJvcihudWxsLCBudWxsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gb25HZW5lcmljU3VjY2VzcyhpbnQgcmVxdWVzdElkKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIG9uUmVnaXN0ZXJlZChpbnQgcmVxdWVzdElkLCBpbnQgc2VydmljZVZlcnNpb24sCi0gICAgICAgICAgICAgICAgQnVuZGxlIGRlc2NyaXB0b3JCdW5kbGUpIHsKLSAgICAgICAgICAgIGlmIChtU2VydmljZVZlcnNpb24gPT0gMAotICAgICAgICAgICAgICAgICAgICAmJiByZXF1ZXN0SWQgPT0gbVBlbmRpbmdSZWdpc3RlclJlcXVlc3RJZAotICAgICAgICAgICAgICAgICAgICAmJiBzZXJ2aWNlVmVyc2lvbiA+PSBTRVJWSUNFX1ZFUlNJT05fMSkgewotICAgICAgICAgICAgICAgIG1QZW5kaW5nUmVnaXN0ZXJSZXF1ZXN0SWQgPSAwOwotICAgICAgICAgICAgICAgIG1TZXJ2aWNlVmVyc2lvbiA9IHNlcnZpY2VWZXJzaW9uOwotICAgICAgICAgICAgICAgIG9uQ29ubmVjdGlvbkRlc2NyaXB0b3JDaGFuZ2VkKHRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yLmZyb21CdW5kbGUoZGVzY3JpcHRvckJ1bmRsZSkpOwotICAgICAgICAgICAgICAgIG9uQ29ubmVjdGlvblJlYWR5KHRoaXMpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gb25EZXNjcmlwdG9yQ2hhbmdlZChCdW5kbGUgZGVzY3JpcHRvckJ1bmRsZSkgewotICAgICAgICAgICAgaWYgKG1TZXJ2aWNlVmVyc2lvbiAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgb25Db25uZWN0aW9uRGVzY3JpcHRvckNoYW5nZWQodGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IuZnJvbUJ1bmRsZShkZXNjcmlwdG9yQnVuZGxlKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbkNvbnRyb2xSZXF1ZXN0U3VjY2VlZGVkKGludCByZXF1ZXN0SWQsIEJ1bmRsZSBkYXRhKSB7Ci0gICAgICAgICAgICBDb250cm9sUmVxdWVzdENhbGxiYWNrIGNhbGxiYWNrID0gbVBlbmRpbmdDYWxsYmFja3MuZ2V0KHJlcXVlc3RJZCk7Ci0gICAgICAgICAgICBpZiAoY2FsbGJhY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1QZW5kaW5nQ2FsbGJhY2tzLnJlbW92ZShyZXF1ZXN0SWQpOwotICAgICAgICAgICAgICAgIGNhbGxiYWNrLm9uUmVzdWx0KGRhdGEpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gb25Db250cm9sUmVxdWVzdEZhaWxlZChpbnQgcmVxdWVzdElkLCBTdHJpbmcgZXJyb3IsIEJ1bmRsZSBkYXRhKSB7Ci0gICAgICAgICAgICBDb250cm9sUmVxdWVzdENhbGxiYWNrIGNhbGxiYWNrID0gbVBlbmRpbmdDYWxsYmFja3MuZ2V0KHJlcXVlc3RJZCk7Ci0gICAgICAgICAgICBpZiAoY2FsbGJhY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1QZW5kaW5nQ2FsbGJhY2tzLnJlbW92ZShyZXF1ZXN0SWQpOwotICAgICAgICAgICAgICAgIGNhbGxiYWNrLm9uRXJyb3IoZXJyb3IsIGRhdGEpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIGJpbmRlckRpZWQoKSB7Ci0gICAgICAgICAgICBtUHJpdmF0ZUhhbmRsZXIucG9zdChuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICBvbkNvbm5lY3Rpb25EaWVkKENvbm5lY3Rpb24udGhpcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgaW50IGNyZWF0ZVJvdXRlQ29udHJvbGxlcihTdHJpbmcgcm91dGVJZCwgU3RyaW5nIHJvdXRlR3JvdXBJZCkgewotICAgICAgICAgICAgaW50IGNvbnRyb2xsZXJJZCA9IG1OZXh0Q29udHJvbGxlcklkKys7Ci0gICAgICAgICAgICBCdW5kbGUgZGF0YSA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgICAgIGRhdGEucHV0U3RyaW5nKENMSUVOVF9EQVRBX1JPVVRFX0lELCByb3V0ZUlkKTsKLSAgICAgICAgICAgIGRhdGEucHV0U3RyaW5nKENMSUVOVF9EQVRBX1JPVVRFX0xJQlJBUllfR1JPVVAsIHJvdXRlR3JvdXBJZCk7Ci0gICAgICAgICAgICBzZW5kUmVxdWVzdChDTElFTlRfTVNHX0NSRUFURV9ST1VURV9DT05UUk9MTEVSLAotICAgICAgICAgICAgICAgICAgICBtTmV4dFJlcXVlc3RJZCsrLCBjb250cm9sbGVySWQsIG51bGwsIGRhdGEpOwotICAgICAgICAgICAgcmV0dXJuIGNvbnRyb2xsZXJJZDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHJlbGVhc2VSb3V0ZUNvbnRyb2xsZXIoaW50IGNvbnRyb2xsZXJJZCkgewotICAgICAgICAgICAgc2VuZFJlcXVlc3QoQ0xJRU5UX01TR19SRUxFQVNFX1JPVVRFX0NPTlRST0xMRVIsCi0gICAgICAgICAgICAgICAgICAgIG1OZXh0UmVxdWVzdElkKyssIGNvbnRyb2xsZXJJZCwgbnVsbCwgbnVsbCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZWxlY3RSb3V0ZShpbnQgY29udHJvbGxlcklkKSB7Ci0gICAgICAgICAgICBzZW5kUmVxdWVzdChDTElFTlRfTVNHX1NFTEVDVF9ST1VURSwKLSAgICAgICAgICAgICAgICAgICAgbU5leHRSZXF1ZXN0SWQrKywgY29udHJvbGxlcklkLCBudWxsLCBudWxsKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHVuc2VsZWN0Um91dGUoaW50IGNvbnRyb2xsZXJJZCwgaW50IHJlYXNvbikgewotICAgICAgICAgICAgQnVuZGxlIGV4dHJhcyA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgICAgIGV4dHJhcy5wdXRJbnQoQ0xJRU5UX0RBVEFfVU5TRUxFQ1RfUkVBU09OLCByZWFzb24pOwotICAgICAgICAgICAgc2VuZFJlcXVlc3QoQ0xJRU5UX01TR19VTlNFTEVDVF9ST1VURSwKLSAgICAgICAgICAgICAgICAgICAgbU5leHRSZXF1ZXN0SWQrKywgY29udHJvbGxlcklkLCBudWxsLCBleHRyYXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0Vm9sdW1lKGludCBjb250cm9sbGVySWQsIGludCB2b2x1bWUpIHsKLSAgICAgICAgICAgIEJ1bmRsZSBkYXRhID0gbmV3IEJ1bmRsZSgpOwotICAgICAgICAgICAgZGF0YS5wdXRJbnQoQ0xJRU5UX0RBVEFfVk9MVU1FLCB2b2x1bWUpOwotICAgICAgICAgICAgc2VuZFJlcXVlc3QoQ0xJRU5UX01TR19TRVRfUk9VVEVfVk9MVU1FLAotICAgICAgICAgICAgICAgICAgICBtTmV4dFJlcXVlc3RJZCsrLCBjb250cm9sbGVySWQsIG51bGwsIGRhdGEpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgdXBkYXRlVm9sdW1lKGludCBjb250cm9sbGVySWQsIGludCBkZWx0YSkgewotICAgICAgICAgICAgQnVuZGxlIGRhdGEgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgICAgICBkYXRhLnB1dEludChDTElFTlRfREFUQV9WT0xVTUUsIGRlbHRhKTsKLSAgICAgICAgICAgIHNlbmRSZXF1ZXN0KENMSUVOVF9NU0dfVVBEQVRFX1JPVVRFX1ZPTFVNRSwKLSAgICAgICAgICAgICAgICAgICAgbU5leHRSZXF1ZXN0SWQrKywgY29udHJvbGxlcklkLCBudWxsLCBkYXRhKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIHNlbmRDb250cm9sUmVxdWVzdChpbnQgY29udHJvbGxlcklkLCBJbnRlbnQgaW50ZW50LAotICAgICAgICAgICAgICAgIENvbnRyb2xSZXF1ZXN0Q2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgICAgIGludCByZXF1ZXN0SWQgPSBtTmV4dFJlcXVlc3RJZCsrOwotICAgICAgICAgICAgaWYgKHNlbmRSZXF1ZXN0KENMSUVOVF9NU0dfUk9VVEVfQ09OVFJPTF9SRVFVRVNULAotICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQsIGNvbnRyb2xsZXJJZCwgaW50ZW50LCBudWxsKSkgewotICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1QZW5kaW5nQ2FsbGJhY2tzLnB1dChyZXF1ZXN0SWQsIGNhbGxiYWNrKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXREaXNjb3ZlcnlSZXF1ZXN0KE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0IHJlcXVlc3QpIHsKLSAgICAgICAgICAgIHNlbmRSZXF1ZXN0KENMSUVOVF9NU0dfU0VUX0RJU0NPVkVSWV9SRVFVRVNULAotICAgICAgICAgICAgICAgICAgICBtTmV4dFJlcXVlc3RJZCsrLCAwLCByZXF1ZXN0ICE9IG51bGwgPyByZXF1ZXN0LmFzQnVuZGxlKCkgOiBudWxsLCBudWxsKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBzZW5kUmVxdWVzdChpbnQgd2hhdCwgaW50IHJlcXVlc3RJZCwgaW50IGFyZywgT2JqZWN0IG9iaiwgQnVuZGxlIGRhdGEpIHsKLSAgICAgICAgICAgIE1lc3NhZ2UgbXNnID0gTWVzc2FnZS5vYnRhaW4oKTsKLSAgICAgICAgICAgIG1zZy53aGF0ID0gd2hhdDsKLSAgICAgICAgICAgIG1zZy5hcmcxID0gcmVxdWVzdElkOwotICAgICAgICAgICAgbXNnLmFyZzIgPSBhcmc7Ci0gICAgICAgICAgICBtc2cub2JqID0gb2JqOwotICAgICAgICAgICAgbXNnLnNldERhdGEoZGF0YSk7Ci0gICAgICAgICAgICBtc2cucmVwbHlUbyA9IG1SZWNlaXZlTWVzc2VuZ2VyOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtU2VydmljZU1lc3Nlbmdlci5zZW5kKG1zZyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9IGNhdGNoIChEZWFkT2JqZWN0RXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhlIHNlcnZpY2UgZGllZC4KLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgIGlmICh3aGF0ICE9IENMSUVOVF9NU0dfVU5SRUdJU1RFUikgewotICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJDb3VsZCBub3Qgc2VuZCBtZXNzYWdlIHRvIHNlcnZpY2UuIiwgZXgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFByaXZhdGVIYW5kbGVyIGV4dGVuZHMgSGFuZGxlciB7Ci0gICAgICAgIFByaXZhdGVIYW5kbGVyKCkgewotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSGFuZGxlciB0aGF0IHJlY2VpdmVzIG1lc3NhZ2VzIGZyb20gdGhlIHNlcnZlci4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGlubmVyIGNsYXNzIGlzIHN0YXRpYyBhbmQgb25seSByZXRhaW5zIGEgd2VhayByZWZlcmVuY2UgdG8gdGhlIGNvbm5lY3Rpb24KLSAgICAgKiB0byBwcmV2ZW50IHRoZSBjbGllbnQgZnJvbSBiZWluZyBsZWFrZWQgaW4gY2FzZSB0aGUgc2VydmljZSBpcyBob2xkaW5nIGFuCi0gICAgICogYWN0aXZlIHJlZmVyZW5jZSB0byB0aGUgY2xpZW50J3MgbWVzc2VuZ2VyLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGlzIGhhbmRsZXIgc2hvdWxkIG5vdCBiZSB1c2VkIHRvIGhhbmRsZSBhbnkgbWVzc2FnZXMgb3RoZXIgdGhhbiB0aG9zZQotICAgICAqIHRoYXQgY29tZSBmcm9tIHRoZSBzZXJ2aWNlLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBSZWNlaXZlSGFuZGxlciBleHRlbmRzIEhhbmRsZXIgewotICAgICAgICBwcml2YXRlIGZpbmFsIFdlYWtSZWZlcmVuY2U8Q29ubmVjdGlvbj4gbUNvbm5lY3Rpb25SZWY7Ci0KLSAgICAgICAgcHVibGljIFJlY2VpdmVIYW5kbGVyKENvbm5lY3Rpb24gY29ubmVjdGlvbikgewotICAgICAgICAgICAgbUNvbm5lY3Rpb25SZWYgPSBuZXcgV2Vha1JlZmVyZW5jZTxDb25uZWN0aW9uPihjb25uZWN0aW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0gICAgICAgICAgICBtQ29ubmVjdGlvblJlZi5jbGVhcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKLSAgICAgICAgICAgIENvbm5lY3Rpb24gY29ubmVjdGlvbiA9IG1Db25uZWN0aW9uUmVmLmdldCgpOwotICAgICAgICAgICAgaWYgKGNvbm5lY3Rpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZpbmFsIGludCB3aGF0ID0gbXNnLndoYXQ7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IHJlcXVlc3RJZCA9IG1zZy5hcmcxOwotICAgICAgICAgICAgICAgIGZpbmFsIGludCBhcmcgPSBtc2cuYXJnMjsKLSAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3Qgb2JqID0gbXNnLm9iajsKLSAgICAgICAgICAgICAgICBmaW5hbCBCdW5kbGUgZGF0YSA9IG1zZy5wZWVrRGF0YSgpOwotICAgICAgICAgICAgICAgIGlmICghcHJvY2Vzc01lc3NhZ2UoY29ubmVjdGlvbiwgd2hhdCwgcmVxdWVzdElkLCBhcmcsIG9iaiwgZGF0YSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJVbmhhbmRsZWQgbWVzc2FnZSBmcm9tIHNlcnZlcjogIiArIG1zZyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoQ29ubmVjdGlvbiBjb25uZWN0aW9uLAotICAgICAgICAgICAgICAgIGludCB3aGF0LCBpbnQgcmVxdWVzdElkLCBpbnQgYXJnLCBPYmplY3Qgb2JqLCBCdW5kbGUgZGF0YSkgewotICAgICAgICAgICAgc3dpdGNoICh3aGF0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBTRVJWSUNFX01TR19HRU5FUklDX0ZBSUxVUkU6Ci0gICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24ub25HZW5lcmljRmFpbHVyZShyZXF1ZXN0SWQpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgICAgICAgICAgICAgIGNhc2UgU0VSVklDRV9NU0dfR0VORVJJQ19TVUNDRVNTOgotICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLm9uR2VuZXJpY1N1Y2Nlc3MocmVxdWVzdElkKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIFNFUlZJQ0VfTVNHX1JFR0lTVEVSRUQ6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChvYmogPT0gbnVsbCB8fCBvYmogaW5zdGFuY2VvZiBCdW5kbGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb25uZWN0aW9uLm9uUmVnaXN0ZXJlZChyZXF1ZXN0SWQsIGFyZywgKEJ1bmRsZSlvYmopOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBTRVJWSUNFX01TR19ERVNDUklQVE9SX0NIQU5HRUQ6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChvYmogPT0gbnVsbCB8fCBvYmogaW5zdGFuY2VvZiBCdW5kbGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb25uZWN0aW9uLm9uRGVzY3JpcHRvckNoYW5nZWQoKEJ1bmRsZSlvYmopOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBTRVJWSUNFX01TR19DT05UUk9MX1JFUVVFU1RfU1VDQ0VFREVEOgotICAgICAgICAgICAgICAgICAgICBpZiAob2JqID09IG51bGwgfHwgb2JqIGluc3RhbmNlb2YgQnVuZGxlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29ubmVjdGlvbi5vbkNvbnRyb2xSZXF1ZXN0U3VjY2VlZGVkKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQsIChCdW5kbGUpb2JqKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgU0VSVklDRV9NU0dfQ09OVFJPTF9SRVFVRVNUX0ZBSUxFRDoKLSAgICAgICAgICAgICAgICAgICAgaWYgKG9iaiA9PSBudWxsIHx8IG9iaiBpbnN0YW5jZW9mIEJ1bmRsZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGVycm9yID0gKGRhdGEgPT0gbnVsbCA/IG51bGwgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmdldFN0cmluZyhTRVJWSUNFX0RBVEFfRVJST1IpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb25uZWN0aW9uLm9uQ29udHJvbFJlcXVlc3RGYWlsZWQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RJZCwgZXJyb3IsIChCdW5kbGUpb2JqKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9SZWdpc3RlcmVkTWVkaWFSb3V0ZVByb3ZpZGVyV2F0Y2hlci5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL1JlZ2lzdGVyZWRNZWRpYVJvdXRlUHJvdmlkZXJXYXRjaGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMWY2NDcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL1JlZ2lzdGVyZWRNZWRpYVJvdXRlUHJvdmlkZXJXYXRjaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlJlc29sdmVJbmZvOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5TZXJ2aWNlSW5mbzsKLWltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLQotLyoqCi0gKiBXYXRjaGVzIGZvciBtZWRpYSByb3V0ZSBwcm92aWRlciBzZXJ2aWNlcyB0byBiZSBpbnN0YWxsZWQuCi0gKiBBZGRzIGEgcHJvdmlkZXIgdG8gdGhlIG1lZGlhIHJvdXRlciBmb3IgZWFjaCByZWdpc3RlcmVkIHNlcnZpY2UuCi0gKgotICogQHNlZSBSZWdpc3RlcmVkTWVkaWFSb3V0ZVByb3ZpZGVyCi0gKi8KLWZpbmFsIGNsYXNzIFJlZ2lzdGVyZWRNZWRpYVJvdXRlUHJvdmlkZXJXYXRjaGVyIHsKLSAgICBwcml2YXRlIGZpbmFsIENvbnRleHQgbUNvbnRleHQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBDYWxsYmFjayBtQ2FsbGJhY2s7Ci0gICAgcHJpdmF0ZSBmaW5hbCBIYW5kbGVyIG1IYW5kbGVyOwotICAgIHByaXZhdGUgZmluYWwgUGFja2FnZU1hbmFnZXIgbVBhY2thZ2VNYW5hZ2VyOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8UmVnaXN0ZXJlZE1lZGlhUm91dGVQcm92aWRlcj4gbVByb3ZpZGVycyA9Ci0gICAgICAgICAgICBuZXcgQXJyYXlMaXN0PFJlZ2lzdGVyZWRNZWRpYVJvdXRlUHJvdmlkZXI+KCk7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1SdW5uaW5nOwotCi0gICAgcHVibGljIFJlZ2lzdGVyZWRNZWRpYVJvdXRlUHJvdmlkZXJXYXRjaGVyKENvbnRleHQgY29udGV4dCwgQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OwotICAgICAgICBtQ2FsbGJhY2sgPSBjYWxsYmFjazsKLSAgICAgICAgbUhhbmRsZXIgPSBuZXcgSGFuZGxlcigpOwotICAgICAgICBtUGFja2FnZU1hbmFnZXIgPSBjb250ZXh0LmdldFBhY2thZ2VNYW5hZ2VyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc3RhcnQoKSB7Ci0gICAgICAgIGlmICghbVJ1bm5pbmcpIHsKLSAgICAgICAgICAgIG1SdW5uaW5nID0gdHJ1ZTsKLQotICAgICAgICAgICAgSW50ZW50RmlsdGVyIGZpbHRlciA9IG5ldyBJbnRlbnRGaWx0ZXIoKTsKLSAgICAgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oSW50ZW50LkFDVElPTl9QQUNLQUdFX0FEREVEKTsKLSAgICAgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oSW50ZW50LkFDVElPTl9QQUNLQUdFX1JFTU9WRUQpOwotICAgICAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihJbnRlbnQuQUNUSU9OX1BBQ0tBR0VfQ0hBTkdFRCk7Ci0gICAgICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKEludGVudC5BQ1RJT05fUEFDS0FHRV9SRVBMQUNFRCk7Ci0gICAgICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKEludGVudC5BQ1RJT05fUEFDS0FHRV9SRVNUQVJURUQpOwotICAgICAgICAgICAgZmlsdGVyLmFkZERhdGFTY2hlbWUoInBhY2thZ2UiKTsKLSAgICAgICAgICAgIG1Db250ZXh0LnJlZ2lzdGVyUmVjZWl2ZXIobVNjYW5QYWNrYWdlc1JlY2VpdmVyLCBmaWx0ZXIsIG51bGwsIG1IYW5kbGVyKTsKLQotICAgICAgICAgICAgLy8gU2NhbiBwYWNrYWdlcy4KLSAgICAgICAgICAgIC8vIEFsc28gaGFzIHRoZSBzaWRlLWVmZmVjdCBvZiByZXN0YXJ0aW5nIHByb3ZpZGVycyBpZiBuZWVkZWQuCi0gICAgICAgICAgICBtSGFuZGxlci5wb3N0KG1TY2FuUGFja2FnZXNSdW5uYWJsZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzdG9wKCkgewotICAgICAgICBpZiAobVJ1bm5pbmcpIHsKLSAgICAgICAgICAgIG1SdW5uaW5nID0gZmFsc2U7Ci0KLSAgICAgICAgICAgIG1Db250ZXh0LnVucmVnaXN0ZXJSZWNlaXZlcihtU2NhblBhY2thZ2VzUmVjZWl2ZXIpOwotICAgICAgICAgICAgbUhhbmRsZXIucmVtb3ZlQ2FsbGJhY2tzKG1TY2FuUGFja2FnZXNSdW5uYWJsZSk7Ci0KLSAgICAgICAgICAgIC8vIFN0b3AgYWxsIHByb3ZpZGVycy4KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSBtUHJvdmlkZXJzLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0gICAgICAgICAgICAgICAgbVByb3ZpZGVycy5nZXQoaSkuc3RvcCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBzY2FuUGFja2FnZXMoKSB7Ci0gICAgICAgIGlmICghbVJ1bm5pbmcpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEFkZCBwcm92aWRlcnMgZm9yIGFsbCBuZXcgc2VydmljZXMuCi0gICAgICAgIC8vIFJlb3JkZXIgdGhlIGxpc3Qgc28gdGhhdCBwcm92aWRlcnMgbGVmdCBhdCB0aGUgZW5kIHdpbGwgYmUgdGhlIG9uZXMgdG8gcmVtb3ZlLgotICAgICAgICBpbnQgdGFyZ2V0SW5kZXggPSAwOwotICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChNZWRpYVJvdXRlUHJvdmlkZXJTZXJ2aWNlLlNFUlZJQ0VfSU5URVJGQUNFKTsKLSAgICAgICAgZm9yIChSZXNvbHZlSW5mbyByZXNvbHZlSW5mbyA6IG1QYWNrYWdlTWFuYWdlci5xdWVyeUludGVudFNlcnZpY2VzKGludGVudCwgMCkpIHsKLSAgICAgICAgICAgIFNlcnZpY2VJbmZvIHNlcnZpY2VJbmZvID0gcmVzb2x2ZUluZm8uc2VydmljZUluZm87Ci0gICAgICAgICAgICBpZiAoc2VydmljZUluZm8gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGludCBzb3VyY2VJbmRleCA9IGZpbmRQcm92aWRlcihzZXJ2aWNlSW5mby5wYWNrYWdlTmFtZSwgc2VydmljZUluZm8ubmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHNvdXJjZUluZGV4IDwgMCkgewotICAgICAgICAgICAgICAgICAgICBSZWdpc3RlcmVkTWVkaWFSb3V0ZVByb3ZpZGVyIHByb3ZpZGVyID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUmVnaXN0ZXJlZE1lZGlhUm91dGVQcm92aWRlcihtQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ29tcG9uZW50TmFtZShzZXJ2aWNlSW5mby5wYWNrYWdlTmFtZSwgc2VydmljZUluZm8ubmFtZSkpOwotICAgICAgICAgICAgICAgICAgICBwcm92aWRlci5zdGFydCgpOwotICAgICAgICAgICAgICAgICAgICBtUHJvdmlkZXJzLmFkZCh0YXJnZXRJbmRleCsrLCBwcm92aWRlcik7Ci0gICAgICAgICAgICAgICAgICAgIG1DYWxsYmFjay5hZGRQcm92aWRlcihwcm92aWRlcik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzb3VyY2VJbmRleCA+PSB0YXJnZXRJbmRleCkgewotICAgICAgICAgICAgICAgICAgICBSZWdpc3RlcmVkTWVkaWFSb3V0ZVByb3ZpZGVyIHByb3ZpZGVyID0gbVByb3ZpZGVycy5nZXQoc291cmNlSW5kZXgpOwotICAgICAgICAgICAgICAgICAgICBwcm92aWRlci5zdGFydCgpOyAvLyByZXN0YXJ0IHRoZSBwcm92aWRlciBpZiBuZWVkZWQKLSAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXIucmViaW5kSWZEaXNjb25uZWN0ZWQoKTsKLSAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbnMuc3dhcChtUHJvdmlkZXJzLCBzb3VyY2VJbmRleCwgdGFyZ2V0SW5kZXgrKyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gUmVtb3ZlIHByb3ZpZGVycyBmb3IgbWlzc2luZyBzZXJ2aWNlcy4KLSAgICAgICAgaWYgKHRhcmdldEluZGV4IDwgbVByb3ZpZGVycy5zaXplKCkpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSBtUHJvdmlkZXJzLnNpemUoKSAtIDE7IGkgPj0gdGFyZ2V0SW5kZXg7IGktLSkgewotICAgICAgICAgICAgICAgIFJlZ2lzdGVyZWRNZWRpYVJvdXRlUHJvdmlkZXIgcHJvdmlkZXIgPSBtUHJvdmlkZXJzLmdldChpKTsKLSAgICAgICAgICAgICAgICBtQ2FsbGJhY2sucmVtb3ZlUHJvdmlkZXIocHJvdmlkZXIpOwotICAgICAgICAgICAgICAgIG1Qcm92aWRlcnMucmVtb3ZlKHByb3ZpZGVyKTsKLSAgICAgICAgICAgICAgICBwcm92aWRlci5zdG9wKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGludCBmaW5kUHJvdmlkZXIoU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgY2xhc3NOYW1lKSB7Ci0gICAgICAgIGludCBjb3VudCA9IG1Qcm92aWRlcnMuc2l6ZSgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgIFJlZ2lzdGVyZWRNZWRpYVJvdXRlUHJvdmlkZXIgcHJvdmlkZXIgPSBtUHJvdmlkZXJzLmdldChpKTsKLSAgICAgICAgICAgIGlmIChwcm92aWRlci5oYXNDb21wb25lbnROYW1lKHBhY2thZ2VOYW1lLCBjbGFzc05hbWUpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgQnJvYWRjYXN0UmVjZWl2ZXIgbVNjYW5QYWNrYWdlc1JlY2VpdmVyID0gbmV3IEJyb2FkY2FzdFJlY2VpdmVyKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25SZWNlaXZlKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCkgewotICAgICAgICAgICAgc2NhblBhY2thZ2VzKCk7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHJpdmF0ZSBmaW5hbCBSdW5uYWJsZSBtU2NhblBhY2thZ2VzUnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICBzY2FuUGFja2FnZXMoKTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBwdWJsaWMgaW50ZXJmYWNlIENhbGxiYWNrIHsKLSAgICAgICAgdm9pZCBhZGRQcm92aWRlcihNZWRpYVJvdXRlUHJvdmlkZXIgcHJvdmlkZXIpOwotICAgICAgICB2b2lkIHJlbW92ZVByb3ZpZGVyKE1lZGlhUm91dGVQcm92aWRlciBwcm92aWRlcik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL1JlbW90ZUNvbnRyb2xDbGllbnRDb21wYXQuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9SZW1vdGVDb250cm9sQ2xpZW50Q29tcGF0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyNjQ0OWIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL1JlbW90ZUNvbnRyb2xDbGllbnRDb21wYXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb01hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdWlsZDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5SZXF1aXJlc0FwaTsKLQotaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKLQotLyoqCi0gKiBQcm92aWRlcyBhY2Nlc3MgdG8gZmVhdHVyZXMgb2YgdGhlIHJlbW90ZSBjb250cm9sIGNsaWVudC4KLSAqCi0gKiBIaWRkZW4gZm9yIG5vdyBidXQgd2UgbWlnaHQgd2FudCB0byBtYWtlIHRoaXMgYXZhaWxhYmxlIHRvIGFwcGxpY2F0aW9ucwotICogaW4gdGhlIGZ1dHVyZS4KLSAqLwotYWJzdHJhY3QgY2xhc3MgUmVtb3RlQ29udHJvbENsaWVudENvbXBhdCB7Ci0gICAgcHJvdGVjdGVkIGZpbmFsIENvbnRleHQgbUNvbnRleHQ7Ci0gICAgcHJvdGVjdGVkIGZpbmFsIE9iamVjdCBtUmNjOwotICAgIHByb3RlY3RlZCBWb2x1bWVDYWxsYmFjayBtVm9sdW1lQ2FsbGJhY2s7Ci0KLSAgICBwcm90ZWN0ZWQgUmVtb3RlQ29udHJvbENsaWVudENvbXBhdChDb250ZXh0IGNvbnRleHQsIE9iamVjdCByY2MpIHsKLSAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OwotICAgICAgICBtUmNjID0gcmNjOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgUmVtb3RlQ29udHJvbENsaWVudENvbXBhdCBvYnRhaW4oQ29udGV4dCBjb250ZXh0LCBPYmplY3QgcmNjKSB7Ci0gICAgICAgIGlmIChCdWlsZC5WRVJTSU9OLlNES19JTlQgPj0gMTYpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgSmVsbHliZWFuSW1wbChjb250ZXh0LCByY2MpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgTGVnYWN5SW1wbChjb250ZXh0LCByY2MpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0UmVtb3RlQ29udHJvbENsaWVudCgpIHsKLSAgICAgICAgcmV0dXJuIG1SY2M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgY3VycmVudCBwbGF5YmFjayBpbmZvcm1hdGlvbi4KLSAgICAgKiBNdXN0IGJlIGNhbGxlZCBhdCBsZWFzdCBvbmNlIHRvIGF0dGFjaCB0byB0aGUgcmVtb3RlIGNvbnRyb2wgY2xpZW50LgotICAgICAqCi0gICAgICogQHBhcmFtIGluZm8gVGhlIHBsYXliYWNrIGluZm9ybWF0aW9uLiAgTXVzdCBub3QgYmUgbnVsbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQbGF5YmFja0luZm8oUGxheWJhY2tJbmZvIGluZm8pIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIGEgY2FsbGJhY2sgdG8gcmVjZWl2ZSB2b2x1bWUgY2hhbmdlIHJlcXVlc3RzIGZyb20gdGhlIHJlbW90ZSBjb250cm9sIGNsaWVudC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjYWxsYmFjayBUaGUgdm9sdW1lIGNhbGxiYWNrIHRvIHVzZSBvciBudWxsIGlmIG5vbmUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Vm9sdW1lQ2FsbGJhY2soVm9sdW1lQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgbVZvbHVtZUNhbGxiYWNrID0gY2FsbGJhY2s7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3BlY2lmaWVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBwbGF5YmFjay4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFBsYXliYWNrSW5mbyB7Ci0gICAgICAgIHB1YmxpYyBpbnQgdm9sdW1lOwotICAgICAgICBwdWJsaWMgaW50IHZvbHVtZU1heDsKLSAgICAgICAgcHVibGljIGludCB2b2x1bWVIYW5kbGluZyA9IE1lZGlhUm91dGVyLlJvdXRlSW5mby5QTEFZQkFDS19WT0xVTUVfRklYRUQ7Ci0gICAgICAgIHB1YmxpYyBpbnQgcGxheWJhY2tTdHJlYW0gPSBBdWRpb01hbmFnZXIuU1RSRUFNX01VU0lDOwotICAgICAgICBwdWJsaWMgaW50IHBsYXliYWNrVHlwZSA9IE1lZGlhUm91dGVyLlJvdXRlSW5mby5QTEFZQkFDS19UWVBFX1JFTU9URTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgd2hlbiB2b2x1bWUgdXBkYXRlcyBhcmUgcmVxdWVzdGVkIGJ5IHRoZSByZW1vdGUgY29udHJvbCBjbGllbnQuCi0gICAgICovCi0gICAgcHVibGljIGludGVyZmFjZSBWb2x1bWVDYWxsYmFjayB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgdm9sdW1lIHNob3VsZCBiZSBpbmNyZWFzZWQgb3IgZGVjcmVhc2VkLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gZGlyZWN0aW9uIEFuIGludGVnZXIgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSB2b2x1bWUgaXMgdG8gYmUgaW5jcmVhc2VkCi0gICAgICAgICAqIChwb3NpdGl2ZSB2YWx1ZSkgb3IgZGVjcmVhc2VkIChuZWdhdGl2ZSB2YWx1ZSkuCi0gICAgICAgICAqIEZvciBidW5kbGVkIGNoYW5nZXMsIHRoZSBhYnNvbHV0ZSB2YWx1ZSBpbmRpY2F0ZXMgdGhlIG51bWJlciBvZiBjaGFuZ2VzCi0gICAgICAgICAqIGluIHRoZSBzYW1lIGRpcmVjdGlvbiwgZS5nLiArMyBjb3JyZXNwb25kcyB0byB0aHJlZSAidm9sdW1lIHVwIiBjaGFuZ2VzLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25Wb2x1bWVVcGRhdGVSZXF1ZXN0KGludCBkaXJlY3Rpb24pOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgdm9sdW1lIGZvciB0aGUgcm91dGUgc2hvdWxkIGJlIHNldCB0byB0aGUgZ2l2ZW4gdmFsdWUuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSB2b2x1bWUgQW4gaW50ZWdlciBpbmRpY2F0aW5nIHRoZSBuZXcgdm9sdW1lIHZhbHVlIHRoYXQgc2hvdWxkIGJlIHVzZWQsCi0gICAgICAgICAqIGFsd2F5cyBiZXR3ZWVuIDAgYW5kIHRoZSB2YWx1ZSBzZXQgYnkge0BsaW5rIFBsYXliYWNrSW5mbyN2b2x1bWVNYXh9LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25Wb2x1bWVTZXRSZXF1ZXN0KGludCB2b2x1bWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIExlZ2FjeSBpbXBsZW1lbnRhdGlvbiBmb3IgcGxhdGZvcm0gdmVyc2lvbnMgcHJpb3IgdG8gSmVsbHliZWFuLgotICAgICAqIERvZXMgbm90aGluZy4KLSAgICAgKi8KLSAgICBzdGF0aWMgY2xhc3MgTGVnYWN5SW1wbCBleHRlbmRzIFJlbW90ZUNvbnRyb2xDbGllbnRDb21wYXQgewotICAgICAgICBwdWJsaWMgTGVnYWN5SW1wbChDb250ZXh0IGNvbnRleHQsIE9iamVjdCByY2MpIHsKLSAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIHJjYyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbXBsZW1lbnRhdGlvbiBmb3IgSmVsbHliZWFuLgotICAgICAqCi0gICAgICogVGhlIGJhc2ljIGlkZWEgb2YgdGhpcyBpbXBsZW1lbnRhdGlvbiBpcyB0byBhdHRhY2ggdGhlIFJDQyB0byBhIFVzZXJSb3V0ZUluZm8KLSAgICAgKiBpbiBvcmRlciB0byBob29rIHVwIHN0cmVhbSBtZXRhZGF0YSBhbmQgdm9sdW1lIGNhbGxiYWNrcyBiZWNhdXNlIHRoZXJlIGlzIG5vCi0gICAgICogb3RoZXIgQVBJIGF2YWlsYWJsZSB0byBkbyBzbyBpbiB0aGlzIHBsYXRmb3JtIHZlcnNpb24uICBUaGUgVXNlclJvdXRlSW5mbyBpdHNlbGYKLSAgICAgKiBpcyBub3QgYXR0YWNoZWQgdG8gdGhlIE1lZGlhUm91dGVyIHNvIGl0IGlzIHRyYW5zcGFyZW50IHRvIHRoZSB1c2VyLgotICAgICAqLwotICAgIC8vIEBAUmVxdWlyZXNBcGkoMTYpCi0gICAgc3RhdGljIGNsYXNzIEplbGx5YmVhbkltcGwgZXh0ZW5kcyBSZW1vdGVDb250cm9sQ2xpZW50Q29tcGF0IHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBPYmplY3QgbVJvdXRlck9iajsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBPYmplY3QgbVVzZXJSb3V0ZUNhdGVnb3J5T2JqOwotICAgICAgICBwcml2YXRlIGZpbmFsIE9iamVjdCBtVXNlclJvdXRlT2JqOwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gbVJlZ2lzdGVyZWQ7Ci0KLSAgICAgICAgcHVibGljIEplbGx5YmVhbkltcGwoQ29udGV4dCBjb250ZXh0LCBPYmplY3QgcmNjKSB7Ci0gICAgICAgICAgICBzdXBlcihjb250ZXh0LCByY2MpOwotCi0gICAgICAgICAgICBtUm91dGVyT2JqID0gTWVkaWFSb3V0ZXJKZWxseWJlYW4uZ2V0TWVkaWFSb3V0ZXIoY29udGV4dCk7Ci0gICAgICAgICAgICBtVXNlclJvdXRlQ2F0ZWdvcnlPYmogPSBNZWRpYVJvdXRlckplbGx5YmVhbi5jcmVhdGVSb3V0ZUNhdGVnb3J5KAotICAgICAgICAgICAgICAgICAgICBtUm91dGVyT2JqLCAiIiwgZmFsc2UpOwotICAgICAgICAgICAgbVVzZXJSb3V0ZU9iaiA9IE1lZGlhUm91dGVySmVsbHliZWFuLmNyZWF0ZVVzZXJSb3V0ZSgKLSAgICAgICAgICAgICAgICAgICAgbVJvdXRlck9iaiwgbVVzZXJSb3V0ZUNhdGVnb3J5T2JqKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRQbGF5YmFja0luZm8oUGxheWJhY2tJbmZvIGluZm8pIHsKLSAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLlVzZXJSb3V0ZUluZm8uc2V0Vm9sdW1lKAotICAgICAgICAgICAgICAgICAgICBtVXNlclJvdXRlT2JqLCBpbmZvLnZvbHVtZSk7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5Vc2VyUm91dGVJbmZvLnNldFZvbHVtZU1heCgKLSAgICAgICAgICAgICAgICAgICAgbVVzZXJSb3V0ZU9iaiwgaW5mby52b2x1bWVNYXgpOwotICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uVXNlclJvdXRlSW5mby5zZXRWb2x1bWVIYW5kbGluZygKLSAgICAgICAgICAgICAgICAgICAgbVVzZXJSb3V0ZU9iaiwgaW5mby52b2x1bWVIYW5kbGluZyk7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5Vc2VyUm91dGVJbmZvLnNldFBsYXliYWNrU3RyZWFtKAotICAgICAgICAgICAgICAgICAgICBtVXNlclJvdXRlT2JqLCBpbmZvLnBsYXliYWNrU3RyZWFtKTsKLSAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLlVzZXJSb3V0ZUluZm8uc2V0UGxheWJhY2tUeXBlKAotICAgICAgICAgICAgICAgICAgICBtVXNlclJvdXRlT2JqLCBpbmZvLnBsYXliYWNrVHlwZSk7Ci0KLSAgICAgICAgICAgIGlmICghbVJlZ2lzdGVyZWQpIHsKLSAgICAgICAgICAgICAgICBtUmVnaXN0ZXJlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uVXNlclJvdXRlSW5mby5zZXRWb2x1bWVDYWxsYmFjayhtVXNlclJvdXRlT2JqLAotICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uY3JlYXRlVm9sdW1lQ2FsbGJhY2soCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBWb2x1bWVDYWxsYmFja1dyYXBwZXIodGhpcykpKTsKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5Vc2VyUm91dGVJbmZvLnNldFJlbW90ZUNvbnRyb2xDbGllbnQobVVzZXJSb3V0ZU9iaiwgbVJjYyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBWb2x1bWVDYWxsYmFja1dyYXBwZXIKLSAgICAgICAgICAgICAgICBpbXBsZW1lbnRzIE1lZGlhUm91dGVySmVsbHliZWFuLlZvbHVtZUNhbGxiYWNrIHsKLSAgICAgICAgICAgIC8vIFVuZm9ydHVuYXRlbHksIHRoZSBmcmFtZXdvcmsgbmV2ZXIgdW5yZWdpc3RlcnMgaXRzIHZvbHVtZSBvYnNlcnZlciBmcm9tCi0gICAgICAgICAgICAvLyB0aGUgYXVkaW8gc2VydmljZSBzbyB0aGUgVXNlclJvdXRlSW5mbyBvYmplY3QgbWF5IGxlYWsgYWxvbmcgd2l0aAotICAgICAgICAgICAgLy8gYW55IGNhbGxiYWNrcyB0aGF0IHdlIGF0dGFjaCB0byBpdC4gIFVzZSBhIHdlYWsgcmVmZXJlbmNlIHRvIHByZXZlbnQKLSAgICAgICAgICAgIC8vIHRoZSB2b2x1bWUgY2FsbGJhY2sgZnJvbSBob2xkaW5nIHN0cm9uZyByZWZlcmVuY2VzIHRvIGFueXRoaW5nIGltcG9ydGFudC4KLSAgICAgICAgICAgIHByaXZhdGUgZmluYWwgV2Vha1JlZmVyZW5jZTxKZWxseWJlYW5JbXBsPiBtSW1wbFdlYWs7Ci0KLSAgICAgICAgICAgIHB1YmxpYyBWb2x1bWVDYWxsYmFja1dyYXBwZXIoSmVsbHliZWFuSW1wbCBpbXBsKSB7Ci0gICAgICAgICAgICAgICAgbUltcGxXZWFrID0gbmV3IFdlYWtSZWZlcmVuY2U8SmVsbHliZWFuSW1wbD4oaW1wbCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25Wb2x1bWVVcGRhdGVSZXF1ZXN0KE9iamVjdCByb3V0ZU9iaiwgaW50IGRpcmVjdGlvbikgewotICAgICAgICAgICAgICAgIEplbGx5YmVhbkltcGwgaW1wbCA9IG1JbXBsV2Vhay5nZXQoKTsKLSAgICAgICAgICAgICAgICBpZiAoaW1wbCAhPSBudWxsICYmIGltcGwubVZvbHVtZUNhbGxiYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaW1wbC5tVm9sdW1lQ2FsbGJhY2sub25Wb2x1bWVVcGRhdGVSZXF1ZXN0KGRpcmVjdGlvbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uVm9sdW1lU2V0UmVxdWVzdChPYmplY3Qgcm91dGVPYmosIGludCB2b2x1bWUpIHsKLSAgICAgICAgICAgICAgICBKZWxseWJlYW5JbXBsIGltcGwgPSBtSW1wbFdlYWsuZ2V0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKGltcGwgIT0gbnVsbCAmJiBpbXBsLm1Wb2x1bWVDYWxsYmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGltcGwubVZvbHVtZUNhbGxiYWNrLm9uVm9sdW1lU2V0UmVxdWVzdCh2b2x1bWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9SZW1vdGVQbGF5YmFja0NsaWVudC5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL1JlbW90ZVBsYXliYWNrQ2xpZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2ZTE0OTcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL1JlbW90ZVBsYXliYWNrQ2xpZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQ0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWE7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7Ci1pbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC51dGlsLk9iamVjdHNDb21wYXQ7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotLyoqCi0gKiBBIGhlbHBlciBjbGFzcyBmb3IgcGxheWluZyBtZWRpYSBvbiByZW1vdGUgcm91dGVzIHVzaW5nIHRoZSByZW1vdGUgcGxheWJhY2sgcHJvdG9jb2wKLSAqIGRlZmluZWQgYnkge0BsaW5rIE1lZGlhQ29udHJvbEludGVudH0uCi0gKiA8cD4KLSAqIFRoZSBjbGllbnQgbWFpbnRhaW5zIHNlc3Npb24gc3RhdGUgYW5kIG9mZmVycyBhIHNpbXBsaWZpZWQgaW50ZXJmYWNlIGZvciBpc3N1aW5nCi0gKiByZW1vdGUgcGxheWJhY2sgbWVkaWEgY29udHJvbCBpbnRlbnRzIHRvIGEgc2luZ2xlIHJvdXRlLgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgUmVtb3RlUGxheWJhY2tDbGllbnQgewotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlJlbW90ZVBsYXliYWNrQ2xpZW50IjsKLSAgICBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKTsKLQotICAgIHByaXZhdGUgZmluYWwgQ29udGV4dCBtQ29udGV4dDsKLSAgICBwcml2YXRlIGZpbmFsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyBtUm91dGU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBBY3Rpb25SZWNlaXZlciBtQWN0aW9uUmVjZWl2ZXI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBQZW5kaW5nSW50ZW50IG1JdGVtU3RhdHVzUGVuZGluZ0ludGVudDsKLSAgICBwcml2YXRlIGZpbmFsIFBlbmRpbmdJbnRlbnQgbVNlc3Npb25TdGF0dXNQZW5kaW5nSW50ZW50OwotICAgIHByaXZhdGUgZmluYWwgUGVuZGluZ0ludGVudCBtTWVzc2FnZVBlbmRpbmdJbnRlbnQ7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gbVJvdXRlU3VwcG9ydHNSZW1vdGVQbGF5YmFjazsKLSAgICBwcml2YXRlIGJvb2xlYW4gbVJvdXRlU3VwcG9ydHNRdWV1aW5nOwotICAgIHByaXZhdGUgYm9vbGVhbiBtUm91dGVTdXBwb3J0c1Nlc3Npb25NYW5hZ2VtZW50OwotICAgIHByaXZhdGUgYm9vbGVhbiBtUm91dGVTdXBwb3J0c01lc3NhZ2luZzsKLQotICAgIFN0cmluZyBtU2Vzc2lvbklkOwotICAgIFN0YXR1c0NhbGxiYWNrIG1TdGF0dXNDYWxsYmFjazsKLSAgICBPbk1lc3NhZ2VSZWNlaXZlZExpc3RlbmVyIG1Pbk1lc3NhZ2VSZWNlaXZlZExpc3RlbmVyOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIHJlbW90ZSBwbGF5YmFjayBjbGllbnQgZm9yIGEgcm91dGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcm91dGUgVGhlIG1lZGlhIHJvdXRlLgotICAgICAqLwotICAgIHB1YmxpYyBSZW1vdGVQbGF5YmFja0NsaWVudChDb250ZXh0IGNvbnRleHQsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICBpZiAoY29udGV4dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb250ZXh0IG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocm91dGUgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicm91dGUgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OwotICAgICAgICBtUm91dGUgPSByb3V0ZTsKLQotICAgICAgICBJbnRlbnRGaWx0ZXIgYWN0aW9uRmlsdGVyID0gbmV3IEludGVudEZpbHRlcigpOwotICAgICAgICBhY3Rpb25GaWx0ZXIuYWRkQWN0aW9uKEFjdGlvblJlY2VpdmVyLkFDVElPTl9JVEVNX1NUQVRVU19DSEFOR0VEKTsKLSAgICAgICAgYWN0aW9uRmlsdGVyLmFkZEFjdGlvbihBY3Rpb25SZWNlaXZlci5BQ1RJT05fU0VTU0lPTl9TVEFUVVNfQ0hBTkdFRCk7Ci0gICAgICAgIGFjdGlvbkZpbHRlci5hZGRBY3Rpb24oQWN0aW9uUmVjZWl2ZXIuQUNUSU9OX01FU1NBR0VfUkVDRUlWRUQpOwotICAgICAgICBtQWN0aW9uUmVjZWl2ZXIgPSBuZXcgQWN0aW9uUmVjZWl2ZXIoKTsKLSAgICAgICAgY29udGV4dC5yZWdpc3RlclJlY2VpdmVyKG1BY3Rpb25SZWNlaXZlciwgYWN0aW9uRmlsdGVyKTsKLQotICAgICAgICBJbnRlbnQgaXRlbVN0YXR1c0ludGVudCA9IG5ldyBJbnRlbnQoQWN0aW9uUmVjZWl2ZXIuQUNUSU9OX0lURU1fU1RBVFVTX0NIQU5HRUQpOwotICAgICAgICBpdGVtU3RhdHVzSW50ZW50LnNldFBhY2thZ2UoY29udGV4dC5nZXRQYWNrYWdlTmFtZSgpKTsKLSAgICAgICAgbUl0ZW1TdGF0dXNQZW5kaW5nSW50ZW50ID0gUGVuZGluZ0ludGVudC5nZXRCcm9hZGNhc3QoCi0gICAgICAgICAgICAgICAgY29udGV4dCwgMCwgaXRlbVN0YXR1c0ludGVudCwgMCk7Ci0KLSAgICAgICAgSW50ZW50IHNlc3Npb25TdGF0dXNJbnRlbnQgPSBuZXcgSW50ZW50KEFjdGlvblJlY2VpdmVyLkFDVElPTl9TRVNTSU9OX1NUQVRVU19DSEFOR0VEKTsKLSAgICAgICAgc2Vzc2lvblN0YXR1c0ludGVudC5zZXRQYWNrYWdlKGNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKSk7Ci0gICAgICAgIG1TZXNzaW9uU3RhdHVzUGVuZGluZ0ludGVudCA9IFBlbmRpbmdJbnRlbnQuZ2V0QnJvYWRjYXN0KAotICAgICAgICAgICAgICAgIGNvbnRleHQsIDAsIHNlc3Npb25TdGF0dXNJbnRlbnQsIDApOwotCi0gICAgICAgIEludGVudCBtZXNzYWdlSW50ZW50ID0gbmV3IEludGVudChBY3Rpb25SZWNlaXZlci5BQ1RJT05fTUVTU0FHRV9SRUNFSVZFRCk7Ci0gICAgICAgIG1lc3NhZ2VJbnRlbnQuc2V0UGFja2FnZShjb250ZXh0LmdldFBhY2thZ2VOYW1lKCkpOwotICAgICAgICBtTWVzc2FnZVBlbmRpbmdJbnRlbnQgPSBQZW5kaW5nSW50ZW50LmdldEJyb2FkY2FzdCgKLSAgICAgICAgICAgICAgICBjb250ZXh0LCAwLCBtZXNzYWdlSW50ZW50LCAwKTsKLSAgICAgICAgZGV0ZWN0RmVhdHVyZXMoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWxlYXNlcyByZXNvdXJjZXMgb3duZWQgYnkgdGhlIGNsaWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotICAgICAgICBtQ29udGV4dC51bnJlZ2lzdGVyUmVjZWl2ZXIobUFjdGlvblJlY2VpdmVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHJvdXRlIHN1cHBvcnRzIHJlbW90ZSBwbGF5YmFjay4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgcm91dGUgZG9lcyBub3Qgc3VwcG9ydCByZW1vdGUgcGxheWJhY2ssIHRoZW4gbm9uZSBvZiB0aGUgZnVuY3Rpb25hbGl0eQotICAgICAqIG9mZmVyZWQgYnkgdGhlIGNsaWVudCB3aWxsIGJlIGF2YWlsYWJsZS4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhpcyBtZXRob2QgcmV0dXJucyB0cnVlIGlmIHRoZSByb3V0ZSBzdXBwb3J0cyBhbGwgb2YgdGhlIGZvbGxvd2luZwotICAgICAqIGFjdGlvbnM6IHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1BMQVkgcGxheX0sCi0gICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fU0VFSyBzZWVrfSwKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9HRVRfU1RBVFVTIGdldCBzdGF0dXN9LAotICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1BBVVNFIHBhdXNlfSwKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9SRVNVTUUgcmVzdW1lfSwKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9TVE9QIHN0b3B9LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVHJ1ZSBpZiByZW1vdGUgcGxheWJhY2sgaXMgc3VwcG9ydGVkLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzUmVtb3RlUGxheWJhY2tTdXBwb3J0ZWQoKSB7Ci0gICAgICAgIHJldHVybiBtUm91dGVTdXBwb3J0c1JlbW90ZVBsYXliYWNrOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcm91dGUgc3VwcG9ydHMgcXVldWluZyBmZWF0dXJlcy4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgcm91dGUgZG9lcyBub3Qgc3VwcG9ydCBxdWV1aW5nLCB0aGVuIGF0IG1vc3Qgb25lIG1lZGlhIGl0ZW0gY2FuIGJlIHBsYXllZAotICAgICAqIGF0IGEgdGltZSBhbmQgdGhlIHtAbGluayAjZW5xdWV1ZX0gbWV0aG9kIHdpbGwgbm90IGJlIGF2YWlsYWJsZS4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhpcyBtZXRob2QgcmV0dXJucyB0cnVlIGlmIHRoZSByb3V0ZSBzdXBwb3J0cyBhbGwgb2YgdGhlIGJhc2ljIHJlbW90ZSBwbGF5YmFjawotICAgICAqIGFjdGlvbnMgYW5kIGFsbCBvZiB0aGUgZm9sbG93aW5nIGFjdGlvbnM6Ci0gICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fRU5RVUVVRSBlbnF1ZXVlfSwKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9SRU1PVkUgcmVtb3ZlfS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRydWUgaWYgcXVldWluZyBpcyBzdXBwb3J0ZWQuICBJbXBsaWVzIHtAbGluayAjaXNSZW1vdGVQbGF5YmFja1N1cHBvcnRlZH0KLSAgICAgKiBpcyBhbHNvIHRydWUuCi0gICAgICoKLSAgICAgKiBAc2VlICNpc1JlbW90ZVBsYXliYWNrU3VwcG9ydGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNRdWV1aW5nU3VwcG9ydGVkKCkgewotICAgICAgICByZXR1cm4gbVJvdXRlU3VwcG9ydHNRdWV1aW5nOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcm91dGUgc3VwcG9ydHMgc2Vzc2lvbiBtYW5hZ2VtZW50IGZlYXR1cmVzLgotICAgICAqIDxwPgotICAgICAqIElmIHRoZSByb3V0ZSBkb2VzIG5vdCBzdXBwb3J0IHNlc3Npb24gbWFuYWdlbWVudCwgdGhlbiB0aGUgc2Vzc2lvbiB3aWxsCi0gICAgICogbm90IGJlIGNyZWF0ZWQgdW50aWwgdGhlIGZpcnN0IG1lZGlhIGl0ZW0gaXMgcGxheWVkLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRydWUgaWYgdGhlIHJvdXRlIHN1cHBvcnRzIGFsbCBvZiB0aGUgYmFzaWMgcmVtb3RlIHBsYXliYWNrCi0gICAgICogYWN0aW9ucyBhbmQgYWxsIG9mIHRoZSBmb2xsb3dpbmcgYWN0aW9uczoKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9TVEFSVF9TRVNTSU9OIHN0YXJ0IHNlc3Npb259LAotICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX0dFVF9TRVNTSU9OX1NUQVRVUyBnZXQgc2Vzc2lvbiBzdGF0dXN9LAotICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX0VORF9TRVNTSU9OIGVuZCBzZXNzaW9ufS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRydWUgaWYgc2Vzc2lvbiBtYW5hZ2VtZW50IGlzIHN1cHBvcnRlZC4KLSAgICAgKiBJbXBsaWVzIHtAbGluayAjaXNSZW1vdGVQbGF5YmFja1N1cHBvcnRlZH0gaXMgYWxzbyB0cnVlLgotICAgICAqCi0gICAgICogQHNlZSAjaXNSZW1vdGVQbGF5YmFja1N1cHBvcnRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzU2Vzc2lvbk1hbmFnZW1lbnRTdXBwb3J0ZWQoKSB7Ci0gICAgICAgIHJldHVybiBtUm91dGVTdXBwb3J0c1Nlc3Npb25NYW5hZ2VtZW50OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcm91dGUgc3VwcG9ydHMgbWVzc2FnZXMuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBtZXRob2QgcmV0dXJucyB0cnVlIGlmIHRoZSByb3V0ZSBzdXBwb3J0cyBhbGwgb2YgdGhlIGJhc2ljIHJlbW90ZSBwbGF5YmFjawotICAgICAqIGFjdGlvbnMgYW5kIGFsbCBvZiB0aGUgZm9sbG93aW5nIGFjdGlvbnM6Ci0gICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fU1RBUlRfU0VTU0lPTiBzdGFydCBzZXNzaW9ufSwKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9TRU5EX01FU1NBR0Ugc2VuZCBtZXNzYWdlfSwKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9FTkRfU0VTU0lPTiBlbmQgc2Vzc2lvbn0uCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiBUcnVlIGlmIHNlc3Npb24gbWFuYWdlbWVudCBpcyBzdXBwb3J0ZWQuCi0gICAgICogSW1wbGllcyB7QGxpbmsgI2lzUmVtb3RlUGxheWJhY2tTdXBwb3J0ZWR9IGlzIGFsc28gdHJ1ZS4KLSAgICAgKgotICAgICAqIEBzZWUgI2lzUmVtb3RlUGxheWJhY2tTdXBwb3J0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc01lc3NhZ2luZ1N1cHBvcnRlZCgpIHsKLSAgICAgICAgcmV0dXJuIG1Sb3V0ZVN1cHBvcnRzTWVzc2FnaW5nOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGN1cnJlbnQgc2Vzc2lvbiBpZCBpZiB0aGVyZSBpcyBvbmUuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBjdXJyZW50IHNlc3Npb24gaWQsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNlc3Npb25JZCgpIHsKLSAgICAgICAgcmV0dXJuIG1TZXNzaW9uSWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgY3VycmVudCBzZXNzaW9uIGlkLgotICAgICAqIDxwPgotICAgICAqIEl0IGlzIHVzdWFsbHkgbm90IG5lY2Vzc2FyeSB0byBzZXQgdGhlIHNlc3Npb24gaWQgZXhwbGljaXRseSBzaW5jZQotICAgICAqIGl0IGlzIGNyZWF0ZWQgYXMgYSBzaWRlLWVmZmVjdCBvZiBvdGhlciByZXF1ZXN0cyBzdWNoIGFzCi0gICAgICoge0BsaW5rICNwbGF5fSwge0BsaW5rICNlbnF1ZXVlfSwgYW5kIHtAbGluayAjc3RhcnRTZXNzaW9ufS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gc2Vzc2lvbklkIFRoZSBuZXcgc2Vzc2lvbiBpZCwgb3IgbnVsbCBpZiBub25lLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNlc3Npb25JZChTdHJpbmcgc2Vzc2lvbklkKSB7Ci0gICAgICAgIGlmICghT2JqZWN0c0NvbXBhdC5lcXVhbHMobVNlc3Npb25JZCwgc2Vzc2lvbklkKSkgewotICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiU2Vzc2lvbiBpZCBpcyBub3c6ICIgKyBzZXNzaW9uSWQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVNlc3Npb25JZCA9IHNlc3Npb25JZDsKLSAgICAgICAgICAgIGlmIChtU3RhdHVzQ2FsbGJhY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1TdGF0dXNDYWxsYmFjay5vblNlc3Npb25DaGFuZ2VkKHNlc3Npb25JZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGNsaWVudCBjdXJyZW50bHkgaGFzIGEgc2Vzc2lvbi4KLSAgICAgKiA8cD4KLSAgICAgKiBFcXVpdmFsZW50IHRvIGNoZWNraW5nIHdoZXRoZXIge0BsaW5rICNnZXRTZXNzaW9uSWR9IHJldHVybnMgYSBub24tbnVsbCByZXN1bHQuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiBUcnVlIGlmIHRoZXJlIGlzIGEgY3VycmVudCBzZXNzaW9uLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGhhc1Nlc3Npb24oKSB7Ci0gICAgICAgIHJldHVybiBtU2Vzc2lvbklkICE9IG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyBhIGNhbGxiYWNrIHRoYXQgc2hvdWxkIHJlY2VpdmUgc3RhdHVzIHVwZGF0ZXMgd2hlbiB0aGUgc3RhdGUgb2YKLSAgICAgKiBtZWRpYSBzZXNzaW9ucyBvciBtZWRpYSBpdGVtcyBjcmVhdGVkIGJ5IHRoaXMgaW5zdGFuY2Ugb2YgdGhlIHJlbW90ZQotICAgICAqIHBsYXliYWNrIGNsaWVudCBjaGFuZ2VzLgotICAgICAqIDxwPgotICAgICAqIFRoZSBjYWxsYmFjayBzaG91bGQgYmUgc2V0IGJlZm9yZSB0aGUgc2Vzc2lvbiBpcyBjcmVhdGVkIG9yIGFueSBwbGF5Ci0gICAgICogY29tbWFuZHMgYXJlIGlzc3VlZC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gY2FsbGJhY2sgVGhlIGNhbGxiYWNrIHRvIHNldC4gIE1heSBiZSBudWxsIHRvIHJlbW92ZSB0aGUgcHJldmlvdXMgY2FsbGJhY2suCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U3RhdHVzQ2FsbGJhY2soU3RhdHVzQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgbVN0YXR1c0NhbGxiYWNrID0gY2FsbGJhY2s7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyBhIGNhbGxiYWNrIHRoYXQgc2hvdWxkIHJlY2VpdmUgbWVzc2FnZXMgd2hlbiBhIG1lc3NhZ2UgaXMgc2VudCBmcm9tCi0gICAgICogbWVkaWEgc2Vzc2lvbnMgY3JlYXRlZCBieSB0aGlzIGluc3RhbmNlIG9mIHRoZSByZW1vdGUgcGxheWJhY2sgY2xpZW50IGNoYW5nZXMuCi0gICAgICogPHA+Ci0gICAgICogVGhlIGNhbGxiYWNrIHNob3VsZCBiZSBzZXQgYmVmb3JlIHRoZSBzZXNzaW9uIGlzIGNyZWF0ZWQuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIGxpc3RlbmVyIFRoZSBjYWxsYmFjayB0byBzZXQuICBNYXkgYmUgbnVsbCB0byByZW1vdmUgdGhlIHByZXZpb3VzIGNhbGxiYWNrLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE9uTWVzc2FnZVJlY2VpdmVkTGlzdGVuZXIoT25NZXNzYWdlUmVjZWl2ZWRMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICBtT25NZXNzYWdlUmVjZWl2ZWRMaXN0ZW5lciA9IGxpc3RlbmVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlbmRzIGEgcmVxdWVzdCB0byBwbGF5IGEgbWVkaWEgaXRlbS4KLSAgICAgKiA8cD4KLSAgICAgKiBDbGVhcnMgdGhlIHF1ZXVlIGFuZCBzdGFydHMgcGxheWluZyB0aGUgbmV3IGl0ZW0gaW1tZWRpYXRlbHkuICBJZiB0aGUgcXVldWUKLSAgICAgKiB3YXMgcHJldmlvdXNseSBwYXVzZWQsIHRoZW4gaXQgaXMgcmVzdW1lZCBhcyBhIHNpZGUtZWZmZWN0IG9mIHRoaXMgcmVxdWVzdC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhlIHJlcXVlc3QgaXMgaXNzdWVkIGluIHRoZSBjdXJyZW50IHNlc3Npb24uICBJZiBubyBzZXNzaW9uIGlzIGF2YWlsYWJsZSwgdGhlbgotICAgICAqIG9uZSBpcyBjcmVhdGVkIGltcGxpY2l0bHkuCi0gICAgICogPC9wPjxwPgotICAgICAqIFBsZWFzZSByZWZlciB0byB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9QTEFZIEFDVElPTl9QTEFZfSBmb3IKLSAgICAgKiBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzZW1hbnRpY3Mgb2YgdGhpcyByZXF1ZXN0LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb250ZW50VXJpIFRoZSBjb250ZW50IFVyaSB0byBwbGF5LgotICAgICAqIEBwYXJhbSBtaW1lVHlwZSBUaGUgbWltZSB0eXBlIG9mIHRoZSBjb250ZW50LCBvciBudWxsIGlmIHVua25vd24uCi0gICAgICogQHBhcmFtIHBvc2l0aW9uTWlsbGlzIFRoZSBpbml0aWFsIGNvbnRlbnQgcG9zaXRpb24gZm9yIHRoZSBpdGVtIGluIG1pbGxpc2Vjb25kcywKLSAgICAgKiBvciA8Y29kZT4wPC9jb2RlPiB0byBzdGFydCBhdCB0aGUgYmVnaW5uaW5nLgotICAgICAqIEBwYXJhbSBtZXRhZGF0YSBUaGUgbWVkaWEgaXRlbSBtZXRhZGF0YSBidW5kbGUsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKiBAcGFyYW0gZXh0cmFzIEEgYnVuZGxlIG9mIGV4dHJhIGFyZ3VtZW50cyB0byBiZSBhZGRlZCB0byB0aGUKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9QTEFZfSBpbnRlbnQsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKiBAcGFyYW0gY2FsbGJhY2sgQSBjYWxsYmFjayB0byBpbnZva2Ugd2hlbiB0aGUgcmVxdWVzdCBoYXMgYmVlbgotICAgICAqIHByb2Nlc3NlZCwgb3IgbnVsbCBpZiBub25lLgotICAgICAqCi0gICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpZiB0aGUgcm91dGUgZG9lcyBub3Qgc3VwcG9ydCByZW1vdGUgcGxheWJhY2suCi0gICAgICoKLSAgICAgKiBAc2VlIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fUExBWQotICAgICAqIEBzZWUgI2lzUmVtb3RlUGxheWJhY2tTdXBwb3J0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwbGF5KFVyaSBjb250ZW50VXJpLCBTdHJpbmcgbWltZVR5cGUsIEJ1bmRsZSBtZXRhZGF0YSwKLSAgICAgICAgICAgIGxvbmcgcG9zaXRpb25NaWxsaXMsIEJ1bmRsZSBleHRyYXMsIEl0ZW1BY3Rpb25DYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICBwbGF5T3JFbnF1ZXVlKGNvbnRlbnRVcmksIG1pbWVUeXBlLCBtZXRhZGF0YSwgcG9zaXRpb25NaWxsaXMsCi0gICAgICAgICAgICAgICAgZXh0cmFzLCBjYWxsYmFjaywgTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9QTEFZKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZW5kcyBhIHJlcXVlc3QgdG8gZW5xdWV1ZSBhIG1lZGlhIGl0ZW0uCi0gICAgICogPHA+Ci0gICAgICogRW5xdWV1ZXMgYSBuZXcgaXRlbSB0byBwbGF5LiAgSWYgdGhlIHF1ZXVlIHdhcyBwcmV2aW91c2x5IHBhdXNlZCwgdGhlbiB3aWxsCi0gICAgICogcmVtYWluIHBhdXNlZC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhlIHJlcXVlc3QgaXMgaXNzdWVkIGluIHRoZSBjdXJyZW50IHNlc3Npb24uICBJZiBubyBzZXNzaW9uIGlzIGF2YWlsYWJsZSwgdGhlbgotICAgICAqIG9uZSBpcyBjcmVhdGVkIGltcGxpY2l0bHkuCi0gICAgICogPC9wPjxwPgotICAgICAqIFBsZWFzZSByZWZlciB0byB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9FTlFVRVVFIEFDVElPTl9FTlFVRVVFfSBmb3IKLSAgICAgKiBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzZW1hbnRpY3Mgb2YgdGhpcyByZXF1ZXN0LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb250ZW50VXJpIFRoZSBjb250ZW50IFVyaSB0byBlbnF1ZXVlLgotICAgICAqIEBwYXJhbSBtaW1lVHlwZSBUaGUgbWltZSB0eXBlIG9mIHRoZSBjb250ZW50LCBvciBudWxsIGlmIHVua25vd24uCi0gICAgICogQHBhcmFtIHBvc2l0aW9uTWlsbGlzIFRoZSBpbml0aWFsIGNvbnRlbnQgcG9zaXRpb24gZm9yIHRoZSBpdGVtIGluIG1pbGxpc2Vjb25kcywKLSAgICAgKiBvciA8Y29kZT4wPC9jb2RlPiB0byBzdGFydCBhdCB0aGUgYmVnaW5uaW5nLgotICAgICAqIEBwYXJhbSBtZXRhZGF0YSBUaGUgbWVkaWEgaXRlbSBtZXRhZGF0YSBidW5kbGUsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKiBAcGFyYW0gZXh0cmFzIEEgYnVuZGxlIG9mIGV4dHJhIGFyZ3VtZW50cyB0byBiZSBhZGRlZCB0byB0aGUKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9FTlFVRVVFfSBpbnRlbnQsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKiBAcGFyYW0gY2FsbGJhY2sgQSBjYWxsYmFjayB0byBpbnZva2Ugd2hlbiB0aGUgcmVxdWVzdCBoYXMgYmVlbgotICAgICAqIHByb2Nlc3NlZCwgb3IgbnVsbCBpZiBub25lLgotICAgICAqCi0gICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpZiB0aGUgcm91dGUgZG9lcyBub3Qgc3VwcG9ydCBxdWV1aW5nLgotICAgICAqCi0gICAgICogQHNlZSBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX0VOUVVFVUUKLSAgICAgKiBAc2VlICNpc1JlbW90ZVBsYXliYWNrU3VwcG9ydGVkCi0gICAgICogQHNlZSAjaXNRdWV1aW5nU3VwcG9ydGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZW5xdWV1ZShVcmkgY29udGVudFVyaSwgU3RyaW5nIG1pbWVUeXBlLCBCdW5kbGUgbWV0YWRhdGEsCi0gICAgICAgICAgICBsb25nIHBvc2l0aW9uTWlsbGlzLCBCdW5kbGUgZXh0cmFzLCBJdGVtQWN0aW9uQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgcGxheU9yRW5xdWV1ZShjb250ZW50VXJpLCBtaW1lVHlwZSwgbWV0YWRhdGEsIHBvc2l0aW9uTWlsbGlzLAotICAgICAgICAgICAgICAgIGV4dHJhcywgY2FsbGJhY2ssIE1lZGlhQ29udHJvbEludGVudC5BQ1RJT05fRU5RVUVVRSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHBsYXlPckVucXVldWUoVXJpIGNvbnRlbnRVcmksIFN0cmluZyBtaW1lVHlwZSwgQnVuZGxlIG1ldGFkYXRhLAotICAgICAgICAgICAgbG9uZyBwb3NpdGlvbk1pbGxpcywgQnVuZGxlIGV4dHJhcywKLSAgICAgICAgICAgIGZpbmFsIEl0ZW1BY3Rpb25DYWxsYmFjayBjYWxsYmFjaywgU3RyaW5nIGFjdGlvbikgewotICAgICAgICBpZiAoY29udGVudFVyaSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb250ZW50VXJpIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICB0aHJvd0lmUmVtb3RlUGxheWJhY2tOb3RTdXBwb3J0ZWQoKTsKLSAgICAgICAgaWYgKGFjdGlvbi5lcXVhbHMoTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9FTlFVRVVFKSkgewotICAgICAgICAgICAgdGhyb3dJZlF1ZXVpbmdOb3RTdXBwb3J0ZWQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KGFjdGlvbik7Ci0gICAgICAgIGludGVudC5zZXREYXRhQW5kVHlwZShjb250ZW50VXJpLCBtaW1lVHlwZSk7Ci0gICAgICAgIGludGVudC5wdXRFeHRyYShNZWRpYUNvbnRyb2xJbnRlbnQuRVhUUkFfSVRFTV9TVEFUVVNfVVBEQVRFX1JFQ0VJVkVSLAotICAgICAgICAgICAgICAgIG1JdGVtU3RhdHVzUGVuZGluZ0ludGVudCk7Ci0gICAgICAgIGlmIChtZXRhZGF0YSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoTWVkaWFDb250cm9sSW50ZW50LkVYVFJBX0lURU1fTUVUQURBVEEsIG1ldGFkYXRhKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocG9zaXRpb25NaWxsaXMgIT0gMCkgewotICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKE1lZGlhQ29udHJvbEludGVudC5FWFRSQV9JVEVNX0NPTlRFTlRfUE9TSVRJT04sIHBvc2l0aW9uTWlsbGlzKTsKLSAgICAgICAgfQotICAgICAgICBwZXJmb3JtSXRlbUFjdGlvbihpbnRlbnQsIG1TZXNzaW9uSWQsIG51bGwsIGV4dHJhcywgY2FsbGJhY2spOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlbmRzIGEgcmVxdWVzdCB0byBzZWVrIHRvIGEgbmV3IHBvc2l0aW9uIGluIGEgbWVkaWEgaXRlbS4KLSAgICAgKiA8cD4KLSAgICAgKiBTZWVrcyB0byBhIG5ldyBwb3NpdGlvbi4gIElmIHRoZSBxdWV1ZSB3YXMgcHJldmlvdXNseSBwYXVzZWQgdGhlbiBpdAotICAgICAqIHJlbWFpbnMgcGF1c2VkIGJ1dCB0aGUgaXRlbSdzIG5ldyBwb3NpdGlvbiBpcyBzdGlsbCByZW1lbWJlcmVkLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGUgcmVxdWVzdCBpcyBpc3N1ZWQgaW4gdGhlIGN1cnJlbnQgc2Vzc2lvbi4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogUGxlYXNlIHJlZmVyIHRvIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1NFRUsgQUNUSU9OX1NFRUt9IGZvcgotICAgICAqIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNlbWFudGljcyBvZiB0aGlzIHJlcXVlc3QuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIGl0ZW1JZCBUaGUgaXRlbSBpZC4KLSAgICAgKiBAcGFyYW0gcG9zaXRpb25NaWxsaXMgVGhlIG5ldyBjb250ZW50IHBvc2l0aW9uIGZvciB0aGUgaXRlbSBpbiBtaWxsaXNlY29uZHMsCi0gICAgICogb3IgPGNvZGU+MDwvY29kZT4gdG8gc3RhcnQgYXQgdGhlIGJlZ2lubmluZy4KLSAgICAgKiBAcGFyYW0gZXh0cmFzIEEgYnVuZGxlIG9mIGV4dHJhIGFyZ3VtZW50cyB0byBiZSBhZGRlZCB0byB0aGUKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9TRUVLfSBpbnRlbnQsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKiBAcGFyYW0gY2FsbGJhY2sgQSBjYWxsYmFjayB0byBpbnZva2Ugd2hlbiB0aGUgcmVxdWVzdCBoYXMgYmVlbgotICAgICAqIHByb2Nlc3NlZCwgb3IgbnVsbCBpZiBub25lLgotICAgICAqCi0gICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlcmUgaXMgbm8gY3VycmVudCBzZXNzaW9uLgotICAgICAqCi0gICAgICogQHNlZSBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1NFRUsKLSAgICAgKiBAc2VlICNpc1JlbW90ZVBsYXliYWNrU3VwcG9ydGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2VlayhTdHJpbmcgaXRlbUlkLCBsb25nIHBvc2l0aW9uTWlsbGlzLCBCdW5kbGUgZXh0cmFzLAotICAgICAgICAgICAgSXRlbUFjdGlvbkNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIGlmIChpdGVtSWQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaXRlbUlkIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICB0aHJvd0lmTm9DdXJyZW50U2Vzc2lvbigpOwotCi0gICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KE1lZGlhQ29udHJvbEludGVudC5BQ1RJT05fU0VFSyk7Ci0gICAgICAgIGludGVudC5wdXRFeHRyYShNZWRpYUNvbnRyb2xJbnRlbnQuRVhUUkFfSVRFTV9DT05URU5UX1BPU0lUSU9OLCBwb3NpdGlvbk1pbGxpcyk7Ci0gICAgICAgIHBlcmZvcm1JdGVtQWN0aW9uKGludGVudCwgbVNlc3Npb25JZCwgaXRlbUlkLCBleHRyYXMsIGNhbGxiYWNrKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZW5kcyBhIHJlcXVlc3QgdG8gZ2V0IHRoZSBzdGF0dXMgb2YgYSBtZWRpYSBpdGVtLgotICAgICAqIDxwPgotICAgICAqIFRoZSByZXF1ZXN0IGlzIGlzc3VlZCBpbiB0aGUgY3VycmVudCBzZXNzaW9uLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBQbGVhc2UgcmVmZXIgdG8ge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fR0VUX1NUQVRVUyBBQ1RJT05fR0VUX1NUQVRVU30gZm9yCi0gICAgICogbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2VtYW50aWNzIG9mIHRoaXMgcmVxdWVzdC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gaXRlbUlkIFRoZSBpdGVtIGlkLgotICAgICAqIEBwYXJhbSBleHRyYXMgQSBidW5kbGUgb2YgZXh0cmEgYXJndW1lbnRzIHRvIGJlIGFkZGVkIHRvIHRoZQotICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX0dFVF9TVEFUVVN9IGludGVudCwgb3IgbnVsbCBpZiBub25lLgotICAgICAqIEBwYXJhbSBjYWxsYmFjayBBIGNhbGxiYWNrIHRvIGludm9rZSB3aGVuIHRoZSByZXF1ZXN0IGhhcyBiZWVuCi0gICAgICogcHJvY2Vzc2VkLCBvciBudWxsIGlmIG5vbmUuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBubyBjdXJyZW50IHNlc3Npb24uCi0gICAgICoKLSAgICAgKiBAc2VlIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fR0VUX1NUQVRVUwotICAgICAqIEBzZWUgI2lzUmVtb3RlUGxheWJhY2tTdXBwb3J0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBnZXRTdGF0dXMoU3RyaW5nIGl0ZW1JZCwgQnVuZGxlIGV4dHJhcywgSXRlbUFjdGlvbkNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIGlmIChpdGVtSWQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaXRlbUlkIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICB0aHJvd0lmTm9DdXJyZW50U2Vzc2lvbigpOwotCi0gICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KE1lZGlhQ29udHJvbEludGVudC5BQ1RJT05fR0VUX1NUQVRVUyk7Ci0gICAgICAgIHBlcmZvcm1JdGVtQWN0aW9uKGludGVudCwgbVNlc3Npb25JZCwgaXRlbUlkLCBleHRyYXMsIGNhbGxiYWNrKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZW5kcyBhIHJlcXVlc3QgdG8gcmVtb3ZlIGEgbWVkaWEgaXRlbSBmcm9tIHRoZSBxdWV1ZS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgcmVxdWVzdCBpcyBpc3N1ZWQgaW4gdGhlIGN1cnJlbnQgc2Vzc2lvbi4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogUGxlYXNlIHJlZmVyIHRvIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1JFTU9WRSBBQ1RJT05fUkVNT1ZFfSBmb3IKLSAgICAgKiBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzZW1hbnRpY3Mgb2YgdGhpcyByZXF1ZXN0LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpdGVtSWQgVGhlIGl0ZW0gaWQuCi0gICAgICogQHBhcmFtIGV4dHJhcyBBIGJ1bmRsZSBvZiBleHRyYSBhcmd1bWVudHMgdG8gYmUgYWRkZWQgdG8gdGhlCi0gICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fUkVNT1ZFfSBpbnRlbnQsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKiBAcGFyYW0gY2FsbGJhY2sgQSBjYWxsYmFjayB0byBpbnZva2Ugd2hlbiB0aGUgcmVxdWVzdCBoYXMgYmVlbgotICAgICAqIHByb2Nlc3NlZCwgb3IgbnVsbCBpZiBub25lLgotICAgICAqCi0gICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlcmUgaXMgbm8gY3VycmVudCBzZXNzaW9uLgotICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgdGhlIHJvdXRlIGRvZXMgbm90IHN1cHBvcnQgcXVldWluZy4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9SRU1PVkUKLSAgICAgKiBAc2VlICNpc1JlbW90ZVBsYXliYWNrU3VwcG9ydGVkCi0gICAgICogQHNlZSAjaXNRdWV1aW5nU3VwcG9ydGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlKFN0cmluZyBpdGVtSWQsIEJ1bmRsZSBleHRyYXMsIEl0ZW1BY3Rpb25DYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICBpZiAoaXRlbUlkID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIml0ZW1JZCBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgdGhyb3dJZlF1ZXVpbmdOb3RTdXBwb3J0ZWQoKTsKLSAgICAgICAgdGhyb3dJZk5vQ3VycmVudFNlc3Npb24oKTsKLQotICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChNZWRpYUNvbnRyb2xJbnRlbnQuQUNUSU9OX1JFTU9WRSk7Ci0gICAgICAgIHBlcmZvcm1JdGVtQWN0aW9uKGludGVudCwgbVNlc3Npb25JZCwgaXRlbUlkLCBleHRyYXMsIGNhbGxiYWNrKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZW5kcyBhIHJlcXVlc3QgdG8gcGF1c2UgbWVkaWEgcGxheWJhY2suCi0gICAgICogPHA+Ci0gICAgICogVGhlIHJlcXVlc3QgaXMgaXNzdWVkIGluIHRoZSBjdXJyZW50IHNlc3Npb24uICBJZiBwbGF5YmFjayBpcyBhbHJlYWR5IHBhdXNlZAotICAgICAqIHRoZW4gdGhlIHJlcXVlc3QgaGFzIG5vIGVmZmVjdC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogUGxlYXNlIHJlZmVyIHRvIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1BBVVNFIEFDVElPTl9QQVVTRX0gZm9yCi0gICAgICogbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2VtYW50aWNzIG9mIHRoaXMgcmVxdWVzdC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gZXh0cmFzIEEgYnVuZGxlIG9mIGV4dHJhIGFyZ3VtZW50cyB0byBiZSBhZGRlZCB0byB0aGUKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9QQVVTRX0gaW50ZW50LCBvciBudWxsIGlmIG5vbmUuCi0gICAgICogQHBhcmFtIGNhbGxiYWNrIEEgY2FsbGJhY2sgdG8gaW52b2tlIHdoZW4gdGhlIHJlcXVlc3QgaGFzIGJlZW4KLSAgICAgKiBwcm9jZXNzZWQsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZXJlIGlzIG5vIGN1cnJlbnQgc2Vzc2lvbi4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9QQVVTRQotICAgICAqIEBzZWUgI2lzUmVtb3RlUGxheWJhY2tTdXBwb3J0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwYXVzZShCdW5kbGUgZXh0cmFzLCBTZXNzaW9uQWN0aW9uQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgdGhyb3dJZk5vQ3VycmVudFNlc3Npb24oKTsKLQotICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChNZWRpYUNvbnRyb2xJbnRlbnQuQUNUSU9OX1BBVVNFKTsKLSAgICAgICAgcGVyZm9ybVNlc3Npb25BY3Rpb24oaW50ZW50LCBtU2Vzc2lvbklkLCBleHRyYXMsIGNhbGxiYWNrKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZW5kcyBhIHJlcXVlc3QgdG8gcmVzdW1lICh1bnBhdXNlKSBtZWRpYSBwbGF5YmFjay4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgcmVxdWVzdCBpcyBpc3N1ZWQgaW4gdGhlIGN1cnJlbnQgc2Vzc2lvbi4gIElmIHBsYXliYWNrIGlzIG5vdCBwYXVzZWQKLSAgICAgKiB0aGVuIHRoZSByZXF1ZXN0IGhhcyBubyBlZmZlY3QuCi0gICAgICogPC9wPjxwPgotICAgICAqIFBsZWFzZSByZWZlciB0byB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9SRVNVTUUgQUNUSU9OX1JFU1VNRX0gZm9yCi0gICAgICogbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2VtYW50aWNzIG9mIHRoaXMgcmVxdWVzdC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gZXh0cmFzIEEgYnVuZGxlIG9mIGV4dHJhIGFyZ3VtZW50cyB0byBiZSBhZGRlZCB0byB0aGUKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9SRVNVTUV9IGludGVudCwgb3IgbnVsbCBpZiBub25lLgotICAgICAqIEBwYXJhbSBjYWxsYmFjayBBIGNhbGxiYWNrIHRvIGludm9rZSB3aGVuIHRoZSByZXF1ZXN0IGhhcyBiZWVuCi0gICAgICogcHJvY2Vzc2VkLCBvciBudWxsIGlmIG5vbmUuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBubyBjdXJyZW50IHNlc3Npb24uCi0gICAgICoKLSAgICAgKiBAc2VlIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fUkVTVU1FCi0gICAgICogQHNlZSAjaXNSZW1vdGVQbGF5YmFja1N1cHBvcnRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlc3VtZShCdW5kbGUgZXh0cmFzLCBTZXNzaW9uQWN0aW9uQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgdGhyb3dJZk5vQ3VycmVudFNlc3Npb24oKTsKLQotICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChNZWRpYUNvbnRyb2xJbnRlbnQuQUNUSU9OX1JFU1VNRSk7Ci0gICAgICAgIHBlcmZvcm1TZXNzaW9uQWN0aW9uKGludGVudCwgbVNlc3Npb25JZCwgZXh0cmFzLCBjYWxsYmFjayk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VuZHMgYSByZXF1ZXN0IHRvIHN0b3AgbWVkaWEgcGxheWJhY2sgYW5kIGNsZWFyIHRoZSBtZWRpYSBwbGF5YmFjayBxdWV1ZS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgcmVxdWVzdCBpcyBpc3N1ZWQgaW4gdGhlIGN1cnJlbnQgc2Vzc2lvbi4gIElmIHRoZSBxdWV1ZSBpcyBhbHJlYWR5Ci0gICAgICogZW1wdHkgdGhlbiB0aGUgcmVxdWVzdCBoYXMgbm8gZWZmZWN0LgotICAgICAqIDwvcD48cD4KLSAgICAgKiBQbGVhc2UgcmVmZXIgdG8ge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fU1RPUCBBQ1RJT05fU1RPUH0gZm9yCi0gICAgICogbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2VtYW50aWNzIG9mIHRoaXMgcmVxdWVzdC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gZXh0cmFzIEEgYnVuZGxlIG9mIGV4dHJhIGFyZ3VtZW50cyB0byBiZSBhZGRlZCB0byB0aGUKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9TVE9QfSBpbnRlbnQsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKiBAcGFyYW0gY2FsbGJhY2sgQSBjYWxsYmFjayB0byBpbnZva2Ugd2hlbiB0aGUgcmVxdWVzdCBoYXMgYmVlbgotICAgICAqIHByb2Nlc3NlZCwgb3IgbnVsbCBpZiBub25lLgotICAgICAqCi0gICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlcmUgaXMgbm8gY3VycmVudCBzZXNzaW9uLgotICAgICAqCi0gICAgICogQHNlZSBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1NUT1AKLSAgICAgKiBAc2VlICNpc1JlbW90ZVBsYXliYWNrU3VwcG9ydGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc3RvcChCdW5kbGUgZXh0cmFzLCBTZXNzaW9uQWN0aW9uQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgdGhyb3dJZk5vQ3VycmVudFNlc3Npb24oKTsKLQotICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChNZWRpYUNvbnRyb2xJbnRlbnQuQUNUSU9OX1NUT1ApOwotICAgICAgICBwZXJmb3JtU2Vzc2lvbkFjdGlvbihpbnRlbnQsIG1TZXNzaW9uSWQsIGV4dHJhcywgY2FsbGJhY2spOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlbmRzIGEgcmVxdWVzdCB0byBzdGFydCBhIG5ldyBtZWRpYSBwbGF5YmFjayBzZXNzaW9uLgotICAgICAqIDxwPgotICAgICAqIFRoZSBhcHBsaWNhdGlvbiBtdXN0IHdhaXQgZm9yIHRoZSBjYWxsYmFjayB0byBpbmRpY2F0ZSB0aGF0IHRoaXMgcmVxdWVzdAotICAgICAqIGlzIGNvbXBsZXRlIGJlZm9yZSBpc3N1aW5nIG90aGVyIHJlcXVlc3RzIHRoYXQgYWZmZWN0IHRoZSBzZXNzaW9uLiAgSWYgdGhpcwotICAgICAqIHJlcXVlc3QgaXMgc3VjY2Vzc2Z1bCB0aGVuIHRoZSBwcmV2aW91cyBzZXNzaW9uIHdpbGwgYmUgaW52YWxpZGF0ZWQuCi0gICAgICogPC9wPjxwPgotICAgICAqIFBsZWFzZSByZWZlciB0byB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9TVEFSVF9TRVNTSU9OIEFDVElPTl9TVEFSVF9TRVNTSU9OfQotICAgICAqIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzZW1hbnRpY3Mgb2YgdGhpcyByZXF1ZXN0LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBleHRyYXMgQSBidW5kbGUgb2YgZXh0cmEgYXJndW1lbnRzIHRvIGJlIGFkZGVkIHRvIHRoZQotICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1NUQVJUX1NFU1NJT059IGludGVudCwgb3IgbnVsbCBpZiBub25lLgotICAgICAqIEBwYXJhbSBjYWxsYmFjayBBIGNhbGxiYWNrIHRvIGludm9rZSB3aGVuIHRoZSByZXF1ZXN0IGhhcyBiZWVuCi0gICAgICogcHJvY2Vzc2VkLCBvciBudWxsIGlmIG5vbmUuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIHRoZSByb3V0ZSBkb2VzIG5vdCBzdXBwb3J0IHNlc3Npb24gbWFuYWdlbWVudC4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9TVEFSVF9TRVNTSU9OCi0gICAgICogQHNlZSAjaXNSZW1vdGVQbGF5YmFja1N1cHBvcnRlZAotICAgICAqIEBzZWUgI2lzU2Vzc2lvbk1hbmFnZW1lbnRTdXBwb3J0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdGFydFNlc3Npb24oQnVuZGxlIGV4dHJhcywgU2Vzc2lvbkFjdGlvbkNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIHRocm93SWZTZXNzaW9uTWFuYWdlbWVudE5vdFN1cHBvcnRlZCgpOwotCi0gICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KE1lZGlhQ29udHJvbEludGVudC5BQ1RJT05fU1RBUlRfU0VTU0lPTik7Ci0gICAgICAgIGludGVudC5wdXRFeHRyYShNZWRpYUNvbnRyb2xJbnRlbnQuRVhUUkFfU0VTU0lPTl9TVEFUVVNfVVBEQVRFX1JFQ0VJVkVSLAotICAgICAgICAgICAgICAgIG1TZXNzaW9uU3RhdHVzUGVuZGluZ0ludGVudCk7Ci0gICAgICAgIGlmIChtUm91dGVTdXBwb3J0c01lc3NhZ2luZykgewotICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKE1lZGlhQ29udHJvbEludGVudC5FWFRSQV9NRVNTQUdFX1JFQ0VJVkVSLCBtTWVzc2FnZVBlbmRpbmdJbnRlbnQpOwotICAgICAgICB9Ci0gICAgICAgIHBlcmZvcm1TZXNzaW9uQWN0aW9uKGludGVudCwgbnVsbCwgZXh0cmFzLCBjYWxsYmFjayk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VuZHMgYSBtZXNzYWdlLgotICAgICAqIDxwPgotICAgICAqIFRoZSByZXF1ZXN0IGlzIGlzc3VlZCBpbiB0aGUgY3VycmVudCBzZXNzaW9uLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBQbGVhc2UgcmVmZXIgdG8ge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fU0VORF9NRVNTQUdFfSBmb3IKLSAgICAgKiBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzZW1hbnRpY3Mgb2YgdGhpcyByZXF1ZXN0LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtZXNzYWdlIEEgYnVuZGxlIG1lc3NhZ2UgZGVub3Rpbmcge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNFWFRSQV9NRVNTQUdFfS4KLSAgICAgKiBAcGFyYW0gY2FsbGJhY2sgQSBjYWxsYmFjayB0byBpbnZva2Ugd2hlbiB0aGUgcmVxdWVzdCBoYXMgYmVlbiBwcm9jZXNzZWQsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZXJlIGlzIG5vIGN1cnJlbnQgc2Vzc2lvbi4KLSAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIHRoZSByb3V0ZSBkb2VzIG5vdCBzdXBwb3J0IG1lc3NhZ2VzLgotICAgICAqCi0gICAgICogQHNlZSBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1NFTkRfTUVTU0FHRQotICAgICAqIEBzZWUgI2lzTWVzc2FnaW5nU3VwcG9ydGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2VuZE1lc3NhZ2UoQnVuZGxlIG1lc3NhZ2UsIFNlc3Npb25BY3Rpb25DYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICB0aHJvd0lmTm9DdXJyZW50U2Vzc2lvbigpOwotICAgICAgICB0aHJvd0lmTWVzc2FnZU5vdFN1cHBvcnRlZCgpOwotCi0gICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KE1lZGlhQ29udHJvbEludGVudC5BQ1RJT05fU0VORF9NRVNTQUdFKTsKLSAgICAgICAgcGVyZm9ybVNlc3Npb25BY3Rpb24oaW50ZW50LCBtU2Vzc2lvbklkLCBtZXNzYWdlLCBjYWxsYmFjayk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VuZHMgYSByZXF1ZXN0IHRvIGdldCB0aGUgc3RhdHVzIG9mIHRoZSBtZWRpYSBwbGF5YmFjayBzZXNzaW9uLgotICAgICAqIDxwPgotICAgICAqIFRoZSByZXF1ZXN0IGlzIGlzc3VlZCBpbiB0aGUgY3VycmVudCBzZXNzaW9uLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBQbGVhc2UgcmVmZXIgdG8ge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fR0VUX1NFU1NJT05fU1RBVFVTCi0gICAgICogQUNUSU9OX0dFVF9TRVNTSU9OX1NUQVRVU30gZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNlbWFudGljcyBvZiB0aGlzIHJlcXVlc3QuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIGV4dHJhcyBBIGJ1bmRsZSBvZiBleHRyYSBhcmd1bWVudHMgdG8gYmUgYWRkZWQgdG8gdGhlCi0gICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fR0VUX1NFU1NJT05fU1RBVFVTfSBpbnRlbnQsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKiBAcGFyYW0gY2FsbGJhY2sgQSBjYWxsYmFjayB0byBpbnZva2Ugd2hlbiB0aGUgcmVxdWVzdCBoYXMgYmVlbgotICAgICAqIHByb2Nlc3NlZCwgb3IgbnVsbCBpZiBub25lLgotICAgICAqCi0gICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlcmUgaXMgbm8gY3VycmVudCBzZXNzaW9uLgotICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgdGhlIHJvdXRlIGRvZXMgbm90IHN1cHBvcnQgc2Vzc2lvbiBtYW5hZ2VtZW50LgotICAgICAqCi0gICAgICogQHNlZSBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX0dFVF9TRVNTSU9OX1NUQVRVUwotICAgICAqIEBzZWUgI2lzUmVtb3RlUGxheWJhY2tTdXBwb3J0ZWQKLSAgICAgKiBAc2VlICNpc1Nlc3Npb25NYW5hZ2VtZW50U3VwcG9ydGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZ2V0U2Vzc2lvblN0YXR1cyhCdW5kbGUgZXh0cmFzLCBTZXNzaW9uQWN0aW9uQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgdGhyb3dJZlNlc3Npb25NYW5hZ2VtZW50Tm90U3VwcG9ydGVkKCk7Ci0gICAgICAgIHRocm93SWZOb0N1cnJlbnRTZXNzaW9uKCk7Ci0KLSAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9HRVRfU0VTU0lPTl9TVEFUVVMpOwotICAgICAgICBwZXJmb3JtU2Vzc2lvbkFjdGlvbihpbnRlbnQsIG1TZXNzaW9uSWQsIGV4dHJhcywgY2FsbGJhY2spOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlbmRzIGEgcmVxdWVzdCB0byBlbmQgdGhlIG1lZGlhIHBsYXliYWNrIHNlc3Npb24uCi0gICAgICogPHA+Ci0gICAgICogVGhlIHJlcXVlc3QgaXMgaXNzdWVkIGluIHRoZSBjdXJyZW50IHNlc3Npb24uICBJZiB0aGlzIHJlcXVlc3QgaXMgc3VjY2Vzc2Z1bCwKLSAgICAgKiB0aGUge0BsaW5rICNnZXRTZXNzaW9uSWQgc2Vzc2lvbiBpZCBwcm9wZXJ0eX0gd2lsbCBiZSBzZXQgdG8gbnVsbCBhZnRlcgotICAgICAqIHRoZSBjYWxsYmFjayBpcyBpbnZva2VkLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBQbGVhc2UgcmVmZXIgdG8ge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fRU5EX1NFU1NJT04gQUNUSU9OX0VORF9TRVNTSU9OfQotICAgICAqIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzZW1hbnRpY3Mgb2YgdGhpcyByZXF1ZXN0LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBleHRyYXMgQSBidW5kbGUgb2YgZXh0cmEgYXJndW1lbnRzIHRvIGJlIGFkZGVkIHRvIHRoZQotICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX0VORF9TRVNTSU9OfSBpbnRlbnQsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKiBAcGFyYW0gY2FsbGJhY2sgQSBjYWxsYmFjayB0byBpbnZva2Ugd2hlbiB0aGUgcmVxdWVzdCBoYXMgYmVlbgotICAgICAqIHByb2Nlc3NlZCwgb3IgbnVsbCBpZiBub25lLgotICAgICAqCi0gICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlcmUgaXMgbm8gY3VycmVudCBzZXNzaW9uLgotICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgdGhlIHJvdXRlIGRvZXMgbm90IHN1cHBvcnQgc2Vzc2lvbiBtYW5hZ2VtZW50LgotICAgICAqCi0gICAgICogQHNlZSBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX0VORF9TRVNTSU9OCi0gICAgICogQHNlZSAjaXNSZW1vdGVQbGF5YmFja1N1cHBvcnRlZAotICAgICAqIEBzZWUgI2lzU2Vzc2lvbk1hbmFnZW1lbnRTdXBwb3J0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBlbmRTZXNzaW9uKEJ1bmRsZSBleHRyYXMsIFNlc3Npb25BY3Rpb25DYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICB0aHJvd0lmU2Vzc2lvbk1hbmFnZW1lbnROb3RTdXBwb3J0ZWQoKTsKLSAgICAgICAgdGhyb3dJZk5vQ3VycmVudFNlc3Npb24oKTsKLQotICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChNZWRpYUNvbnRyb2xJbnRlbnQuQUNUSU9OX0VORF9TRVNTSU9OKTsKLSAgICAgICAgcGVyZm9ybVNlc3Npb25BY3Rpb24oaW50ZW50LCBtU2Vzc2lvbklkLCBleHRyYXMsIGNhbGxiYWNrKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcGVyZm9ybUl0ZW1BY3Rpb24oZmluYWwgSW50ZW50IGludGVudCwKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBzZXNzaW9uSWQsIGZpbmFsIFN0cmluZyBpdGVtSWQsCi0gICAgICAgICAgICBCdW5kbGUgZXh0cmFzLCBmaW5hbCBJdGVtQWN0aW9uQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgaW50ZW50LmFkZENhdGVnb3J5KE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9SRU1PVEVfUExBWUJBQ0spOwotICAgICAgICBpZiAoc2Vzc2lvbklkICE9IG51bGwpIHsKLSAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShNZWRpYUNvbnRyb2xJbnRlbnQuRVhUUkFfU0VTU0lPTl9JRCwgc2Vzc2lvbklkKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaXRlbUlkICE9IG51bGwpIHsKLSAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShNZWRpYUNvbnRyb2xJbnRlbnQuRVhUUkFfSVRFTV9JRCwgaXRlbUlkKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZXh0cmFzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGludGVudC5wdXRFeHRyYXMoZXh0cmFzKTsKLSAgICAgICAgfQotICAgICAgICBsb2dSZXF1ZXN0KGludGVudCk7Ci0gICAgICAgIG1Sb3V0ZS5zZW5kQ29udHJvbFJlcXVlc3QoaW50ZW50LCBuZXcgTWVkaWFSb3V0ZXIuQ29udHJvbFJlcXVlc3RDYWxsYmFjaygpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25SZXN1bHQoQnVuZGxlIGRhdGEpIHsKLSAgICAgICAgICAgICAgICBpZiAoZGF0YSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZXNzaW9uSWRSZXN1bHQgPSBpbmZlck1pc3NpbmdSZXN1bHQoc2Vzc2lvbklkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuZ2V0U3RyaW5nKE1lZGlhQ29udHJvbEludGVudC5FWFRSQV9TRVNTSU9OX0lEKSk7Ci0gICAgICAgICAgICAgICAgICAgIE1lZGlhU2Vzc2lvblN0YXR1cyBzZXNzaW9uU3RhdHVzID0gTWVkaWFTZXNzaW9uU3RhdHVzLmZyb21CdW5kbGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5nZXRCdW5kbGUoTWVkaWFDb250cm9sSW50ZW50LkVYVFJBX1NFU1NJT05fU1RBVFVTKSk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBpdGVtSWRSZXN1bHQgPSBpbmZlck1pc3NpbmdSZXN1bHQoaXRlbUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuZ2V0U3RyaW5nKE1lZGlhQ29udHJvbEludGVudC5FWFRSQV9JVEVNX0lEKSk7Ci0gICAgICAgICAgICAgICAgICAgIE1lZGlhSXRlbVN0YXR1cyBpdGVtU3RhdHVzID0gTWVkaWFJdGVtU3RhdHVzLmZyb21CdW5kbGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5nZXRCdW5kbGUoTWVkaWFDb250cm9sSW50ZW50LkVYVFJBX0lURU1fU1RBVFVTKSk7Ci0gICAgICAgICAgICAgICAgICAgIGFkb3B0U2Vzc2lvbihzZXNzaW9uSWRSZXN1bHQpOwotICAgICAgICAgICAgICAgICAgICBpZiAoc2Vzc2lvbklkUmVzdWx0ICE9IG51bGwgJiYgaXRlbUlkUmVzdWx0ICE9IG51bGwgJiYgaXRlbVN0YXR1cyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJSZWNlaXZlZCByZXN1bHQgZnJvbSAiICsgaW50ZW50LmdldEFjdGlvbigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICI6IGRhdGE9IiArIGJ1bmRsZVRvU3RyaW5nKGRhdGEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIHNlc3Npb25JZD0iICsgc2Vzc2lvbklkUmVzdWx0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIHNlc3Npb25TdGF0dXM9IiArIHNlc3Npb25TdGF0dXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgaXRlbUlkPSIgKyBpdGVtSWRSZXN1bHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgaXRlbVN0YXR1cz0iICsgaXRlbVN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5vblJlc3VsdChkYXRhLCBzZXNzaW9uSWRSZXN1bHQsIHNlc3Npb25TdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1JZFJlc3VsdCwgaXRlbVN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaGFuZGxlSW52YWxpZFJlc3VsdChpbnRlbnQsIGNhbGxiYWNrLCBkYXRhKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkVycm9yKFN0cmluZyBlcnJvciwgQnVuZGxlIGRhdGEpIHsKLSAgICAgICAgICAgICAgICBoYW5kbGVFcnJvcihpbnRlbnQsIGNhbGxiYWNrLCBlcnJvciwgZGF0YSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBwZXJmb3JtU2Vzc2lvbkFjdGlvbihmaW5hbCBJbnRlbnQgaW50ZW50LCBmaW5hbCBTdHJpbmcgc2Vzc2lvbklkLAotICAgICAgICAgICAgQnVuZGxlIGV4dHJhcywgZmluYWwgU2Vzc2lvbkFjdGlvbkNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIGludGVudC5hZGRDYXRlZ29yeShNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLKTsKLSAgICAgICAgaWYgKHNlc3Npb25JZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoTWVkaWFDb250cm9sSW50ZW50LkVYVFJBX1NFU1NJT05fSUQsIHNlc3Npb25JZCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGV4dHJhcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbnRlbnQucHV0RXh0cmFzKGV4dHJhcyk7Ci0gICAgICAgIH0KLSAgICAgICAgbG9nUmVxdWVzdChpbnRlbnQpOwotICAgICAgICBtUm91dGUuc2VuZENvbnRyb2xSZXF1ZXN0KGludGVudCwgbmV3IE1lZGlhUm91dGVyLkNvbnRyb2xSZXF1ZXN0Q2FsbGJhY2soKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVzdWx0KEJ1bmRsZSBkYXRhKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGRhdGEgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2Vzc2lvbklkUmVzdWx0ID0gaW5mZXJNaXNzaW5nUmVzdWx0KHNlc3Npb25JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmdldFN0cmluZyhNZWRpYUNvbnRyb2xJbnRlbnQuRVhUUkFfU0VTU0lPTl9JRCkpOwotICAgICAgICAgICAgICAgICAgICBNZWRpYVNlc3Npb25TdGF0dXMgc2Vzc2lvblN0YXR1cyA9IE1lZGlhU2Vzc2lvblN0YXR1cy5mcm9tQnVuZGxlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuZ2V0QnVuZGxlKE1lZGlhQ29udHJvbEludGVudC5FWFRSQV9TRVNTSU9OX1NUQVRVUykpOwotICAgICAgICAgICAgICAgICAgICBhZG9wdFNlc3Npb24oc2Vzc2lvbklkUmVzdWx0KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNlc3Npb25JZFJlc3VsdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJSZWNlaXZlZCByZXN1bHQgZnJvbSAiICsgaW50ZW50LmdldEFjdGlvbigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICI6IGRhdGE9IiArIGJ1bmRsZVRvU3RyaW5nKGRhdGEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIHNlc3Npb25JZD0iICsgc2Vzc2lvbklkUmVzdWx0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIHNlc3Npb25TdGF0dXM9IiArIHNlc3Npb25TdGF0dXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5vblJlc3VsdChkYXRhLCBzZXNzaW9uSWRSZXN1bHQsIHNlc3Npb25TdGF0dXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW50ZW50LmdldEFjdGlvbigpLmVxdWFscyhNZWRpYUNvbnRyb2xJbnRlbnQuQUNUSU9OX0VORF9TRVNTSU9OKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgc2Vzc2lvbklkUmVzdWx0LmVxdWFscyhtU2Vzc2lvbklkKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTZXNzaW9uSWQobnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGhhbmRsZUludmFsaWRSZXN1bHQoaW50ZW50LCBjYWxsYmFjaywgZGF0YSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25FcnJvcihTdHJpbmcgZXJyb3IsIEJ1bmRsZSBkYXRhKSB7Ci0gICAgICAgICAgICAgICAgaGFuZGxlRXJyb3IoaW50ZW50LCBjYWxsYmFjaywgZXJyb3IsIGRhdGEpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICB2b2lkIGFkb3B0U2Vzc2lvbihTdHJpbmcgc2Vzc2lvbklkKSB7Ci0gICAgICAgIGlmIChzZXNzaW9uSWQgIT0gbnVsbCkgewotICAgICAgICAgICAgc2V0U2Vzc2lvbklkKHNlc3Npb25JZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIGhhbmRsZUludmFsaWRSZXN1bHQoSW50ZW50IGludGVudCwgQWN0aW9uQ2FsbGJhY2sgY2FsbGJhY2ssCi0gICAgICAgICAgICBCdW5kbGUgZGF0YSkgewotICAgICAgICBMb2cudyhUQUcsICJSZWNlaXZlZCBpbnZhbGlkIHJlc3VsdCBkYXRhIGZyb20gIiArIGludGVudC5nZXRBY3Rpb24oKQotICAgICAgICAgICAgICAgICsgIjogZGF0YT0iICsgYnVuZGxlVG9TdHJpbmcoZGF0YSkpOwotICAgICAgICBjYWxsYmFjay5vbkVycm9yKG51bGwsIE1lZGlhQ29udHJvbEludGVudC5FUlJPUl9VTktOT1dOLCBkYXRhKTsKLSAgICB9Ci0KLSAgICB2b2lkIGhhbmRsZUVycm9yKEludGVudCBpbnRlbnQsIEFjdGlvbkNhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgICAgICAgU3RyaW5nIGVycm9yLCBCdW5kbGUgZGF0YSkgewotICAgICAgICBmaW5hbCBpbnQgY29kZTsKLSAgICAgICAgaWYgKGRhdGEgIT0gbnVsbCkgewotICAgICAgICAgICAgY29kZSA9IGRhdGEuZ2V0SW50KE1lZGlhQ29udHJvbEludGVudC5FWFRSQV9FUlJPUl9DT0RFLAotICAgICAgICAgICAgICAgICAgICBNZWRpYUNvbnRyb2xJbnRlbnQuRVJST1JfVU5LTk9XTik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjb2RlID0gTWVkaWFDb250cm9sSW50ZW50LkVSUk9SX1VOS05PV047Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJSZWNlaXZlZCBlcnJvciBmcm9tICIgKyBpbnRlbnQuZ2V0QWN0aW9uKCkKLSAgICAgICAgICAgICAgICAgICAgKyAiOiBlcnJvcj0iICsgZXJyb3IKLSAgICAgICAgICAgICAgICAgICAgKyAiLCBjb2RlPSIgKyBjb2RlCi0gICAgICAgICAgICAgICAgICAgICsgIiwgZGF0YT0iICsgYnVuZGxlVG9TdHJpbmcoZGF0YSkpOwotICAgICAgICB9Ci0gICAgICAgIGNhbGxiYWNrLm9uRXJyb3IoZXJyb3IsIGNvZGUsIGRhdGEpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBkZXRlY3RGZWF0dXJlcygpIHsKLSAgICAgICAgbVJvdXRlU3VwcG9ydHNSZW1vdGVQbGF5YmFjayA9IHJvdXRlU3VwcG9ydHNBY3Rpb24oTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9QTEFZKQotICAgICAgICAgICAgICAgICYmIHJvdXRlU3VwcG9ydHNBY3Rpb24oTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9TRUVLKQotICAgICAgICAgICAgICAgICYmIHJvdXRlU3VwcG9ydHNBY3Rpb24oTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9HRVRfU1RBVFVTKQotICAgICAgICAgICAgICAgICYmIHJvdXRlU3VwcG9ydHNBY3Rpb24oTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9QQVVTRSkKLSAgICAgICAgICAgICAgICAmJiByb3V0ZVN1cHBvcnRzQWN0aW9uKE1lZGlhQ29udHJvbEludGVudC5BQ1RJT05fUkVTVU1FKQotICAgICAgICAgICAgICAgICYmIHJvdXRlU3VwcG9ydHNBY3Rpb24oTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9TVE9QKTsKLSAgICAgICAgbVJvdXRlU3VwcG9ydHNRdWV1aW5nID0gbVJvdXRlU3VwcG9ydHNSZW1vdGVQbGF5YmFjawotICAgICAgICAgICAgICAgICYmIHJvdXRlU3VwcG9ydHNBY3Rpb24oTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9FTlFVRVVFKQotICAgICAgICAgICAgICAgICYmIHJvdXRlU3VwcG9ydHNBY3Rpb24oTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9SRU1PVkUpOwotICAgICAgICBtUm91dGVTdXBwb3J0c1Nlc3Npb25NYW5hZ2VtZW50ID0gbVJvdXRlU3VwcG9ydHNSZW1vdGVQbGF5YmFjawotICAgICAgICAgICAgICAgICYmIHJvdXRlU3VwcG9ydHNBY3Rpb24oTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9TVEFSVF9TRVNTSU9OKQotICAgICAgICAgICAgICAgICYmIHJvdXRlU3VwcG9ydHNBY3Rpb24oTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9HRVRfU0VTU0lPTl9TVEFUVVMpCi0gICAgICAgICAgICAgICAgJiYgcm91dGVTdXBwb3J0c0FjdGlvbihNZWRpYUNvbnRyb2xJbnRlbnQuQUNUSU9OX0VORF9TRVNTSU9OKTsKLSAgICAgICAgbVJvdXRlU3VwcG9ydHNNZXNzYWdpbmcgPSBkb2VzUm91dGVTdXBwb3J0TWVzc2FnaW5nKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIHJvdXRlU3VwcG9ydHNBY3Rpb24oU3RyaW5nIGFjdGlvbikgewotICAgICAgICByZXR1cm4gbVJvdXRlLnN1cHBvcnRzQ29udHJvbEFjdGlvbihNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLLCBhY3Rpb24pOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBkb2VzUm91dGVTdXBwb3J0TWVzc2FnaW5nKCkgewotICAgICAgICBmb3IgKEludGVudEZpbHRlciBmaWx0ZXIgOiBtUm91dGUuZ2V0Q29udHJvbEZpbHRlcnMoKSkgewotICAgICAgICAgICAgaWYgKGZpbHRlci5oYXNBY3Rpb24oTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9TRU5EX01FU1NBR0UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0aHJvd0lmUmVtb3RlUGxheWJhY2tOb3RTdXBwb3J0ZWQoKSB7Ci0gICAgICAgIGlmICghbVJvdXRlU3VwcG9ydHNSZW1vdGVQbGF5YmFjaykgewotICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJUaGUgcm91dGUgZG9lcyBub3Qgc3VwcG9ydCByZW1vdGUgcGxheWJhY2suIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGhyb3dJZlF1ZXVpbmdOb3RTdXBwb3J0ZWQoKSB7Ci0gICAgICAgIGlmICghbVJvdXRlU3VwcG9ydHNRdWV1aW5nKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlRoZSByb3V0ZSBkb2VzIG5vdCBzdXBwb3J0IHF1ZXVpbmcuIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGhyb3dJZlNlc3Npb25NYW5hZ2VtZW50Tm90U3VwcG9ydGVkKCkgewotICAgICAgICBpZiAoIW1Sb3V0ZVN1cHBvcnRzU2Vzc2lvbk1hbmFnZW1lbnQpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiVGhlIHJvdXRlIGRvZXMgbm90IHN1cHBvcnQgIgotICAgICAgICAgICAgICAgICAgICArICJzZXNzaW9uIG1hbmFnZW1lbnQuIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGhyb3dJZk1lc3NhZ2VOb3RTdXBwb3J0ZWQoKSB7Ci0gICAgICAgIGlmICghbVJvdXRlU3VwcG9ydHNNZXNzYWdpbmcpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiVGhlIHJvdXRlIGRvZXMgbm90IHN1cHBvcnQgbWVzc2FnZS4iKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0aHJvd0lmTm9DdXJyZW50U2Vzc2lvbigpIHsKLSAgICAgICAgaWYgKG1TZXNzaW9uSWQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVGhlcmUgaXMgbm8gY3VycmVudCBzZXNzaW9uLiIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdGljIFN0cmluZyBpbmZlck1pc3NpbmdSZXN1bHQoU3RyaW5nIHJlcXVlc3QsIFN0cmluZyByZXN1bHQpIHsKLSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBSZXN1bHQgaXMgbWlzc2luZy4KLSAgICAgICAgICAgIHJldHVybiByZXF1ZXN0OwotICAgICAgICB9Ci0gICAgICAgIGlmIChyZXF1ZXN0ID09IG51bGwgfHwgcmVxdWVzdC5lcXVhbHMocmVzdWx0KSkgewotICAgICAgICAgICAgLy8gUmVxdWVzdCBkaWRuJ3Qgc3BlY2lmeSBhIHZhbHVlIG9yIHJlc3VsdCBtYXRjaGVzIHJlcXVlc3QuCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0gICAgICAgIC8vIFJlc3VsdCBjb25mbGljdHMgd2l0aCByZXF1ZXN0LgotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGxvZ1JlcXVlc3QoSW50ZW50IGludGVudCkgewotICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIlNlbmRpbmcgcmVxdWVzdDogIiArIGludGVudCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGF0aWMgU3RyaW5nIGJ1bmRsZVRvU3RyaW5nKEJ1bmRsZSBidW5kbGUpIHsKLSAgICAgICAgaWYgKGJ1bmRsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBidW5kbGUuc2l6ZSgpOyAvLyBmb3JjZSBidW5kbGUgdG8gYmUgdW5wYXJjZWxsZWQKLSAgICAgICAgICAgIHJldHVybiBidW5kbGUudG9TdHJpbmcoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gIm51bGwiOwotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgY2xhc3MgQWN0aW9uUmVjZWl2ZXIgZXh0ZW5kcyBCcm9hZGNhc3RSZWNlaXZlciB7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9JVEVNX1NUQVRVU19DSEFOR0VEID0KLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5zdXBwb3J0LnY3Lm1lZGlhLmFjdGlvbnMuQUNUSU9OX0lURU1fU1RBVFVTX0NIQU5HRUQiOwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fU0VTU0lPTl9TVEFUVVNfQ0hBTkdFRCA9Ci0gICAgICAgICAgICAgICAgImFuZHJvaWQuc3VwcG9ydC52Ny5tZWRpYS5hY3Rpb25zLkFDVElPTl9TRVNTSU9OX1NUQVRVU19DSEFOR0VEIjsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX01FU1NBR0VfUkVDRUlWRUQgPQotICAgICAgICAgICAgICAgICJhbmRyb2lkLnN1cHBvcnQudjcubWVkaWEuYWN0aW9ucy5BQ1RJT05fTUVTU0FHRV9SRUNFSVZFRCI7Ci0KLSAgICAgICAgQWN0aW9uUmVjZWl2ZXIoKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25SZWNlaXZlKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCkgewotICAgICAgICAgICAgU3RyaW5nIHNlc3Npb25JZCA9IGludGVudC5nZXRTdHJpbmdFeHRyYShNZWRpYUNvbnRyb2xJbnRlbnQuRVhUUkFfU0VTU0lPTl9JRCk7Ci0gICAgICAgICAgICBpZiAoc2Vzc2lvbklkID09IG51bGwgfHwgIXNlc3Npb25JZC5lcXVhbHMobVNlc3Npb25JZCkpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJEaXNjYXJkaW5nIHNwdXJpb3VzIHN0YXR1cyBjYWxsYmFjayAiCi0gICAgICAgICAgICAgICAgICAgICAgICArICJ3aXRoIG1pc3Npbmcgb3IgaW52YWxpZCBzZXNzaW9uIGlkOiBzZXNzaW9uSWQ9IiArIHNlc3Npb25JZCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBNZWRpYVNlc3Npb25TdGF0dXMgc2Vzc2lvblN0YXR1cyA9IE1lZGlhU2Vzc2lvblN0YXR1cy5mcm9tQnVuZGxlKAotICAgICAgICAgICAgICAgICAgICBpbnRlbnQuZ2V0QnVuZGxlRXh0cmEoTWVkaWFDb250cm9sSW50ZW50LkVYVFJBX1NFU1NJT05fU1RBVFVTKSk7Ci0gICAgICAgICAgICBTdHJpbmcgYWN0aW9uID0gaW50ZW50LmdldEFjdGlvbigpOwotICAgICAgICAgICAgaWYgKGFjdGlvbi5lcXVhbHMoQUNUSU9OX0lURU1fU1RBVFVTX0NIQU5HRUQpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGl0ZW1JZCA9IGludGVudC5nZXRTdHJpbmdFeHRyYShNZWRpYUNvbnRyb2xJbnRlbnQuRVhUUkFfSVRFTV9JRCk7Ci0gICAgICAgICAgICAgICAgaWYgKGl0ZW1JZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkRpc2NhcmRpbmcgc3B1cmlvdXMgc3RhdHVzIGNhbGxiYWNrIHdpdGggbWlzc2luZyBpdGVtIGlkLiIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgTWVkaWFJdGVtU3RhdHVzIGl0ZW1TdGF0dXMgPSBNZWRpYUl0ZW1TdGF0dXMuZnJvbUJ1bmRsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIGludGVudC5nZXRCdW5kbGVFeHRyYShNZWRpYUNvbnRyb2xJbnRlbnQuRVhUUkFfSVRFTV9TVEFUVVMpKTsKLSAgICAgICAgICAgICAgICBpZiAoaXRlbVN0YXR1cyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkRpc2NhcmRpbmcgc3B1cmlvdXMgc3RhdHVzIGNhbGxiYWNrIHdpdGggbWlzc2luZyBpdGVtIHN0YXR1cy4iKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJSZWNlaXZlZCBpdGVtIHN0YXR1cyBjYWxsYmFjazogc2Vzc2lvbklkPSIgKyBzZXNzaW9uSWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIHNlc3Npb25TdGF0dXM9IiArIHNlc3Npb25TdGF0dXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIGl0ZW1JZD0iICsgaXRlbUlkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBpdGVtU3RhdHVzPSIgKyBpdGVtU3RhdHVzKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobVN0YXR1c0NhbGxiYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbVN0YXR1c0NhbGxiYWNrLm9uSXRlbVN0YXR1c0NoYW5nZWQoaW50ZW50LmdldEV4dHJhcygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCwgc2Vzc2lvblN0YXR1cywgaXRlbUlkLCBpdGVtU3RhdHVzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbi5lcXVhbHMoQUNUSU9OX1NFU1NJT05fU1RBVFVTX0NIQU5HRUQpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNlc3Npb25TdGF0dXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJEaXNjYXJkaW5nIHNwdXJpb3VzIG1lZGlhIHN0YXR1cyBjYWxsYmFjayB3aXRoICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIm1pc3Npbmcgc2Vzc2lvbiBzdGF0dXMuIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiUmVjZWl2ZWQgc2Vzc2lvbiBzdGF0dXMgY2FsbGJhY2s6IHNlc3Npb25JZD0iICsgc2Vzc2lvbklkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBzZXNzaW9uU3RhdHVzPSIgKyBzZXNzaW9uU3RhdHVzKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobVN0YXR1c0NhbGxiYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbVN0YXR1c0NhbGxiYWNrLm9uU2Vzc2lvblN0YXR1c0NoYW5nZWQoaW50ZW50LmdldEV4dHJhcygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCwgc2Vzc2lvblN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24uZXF1YWxzKEFDVElPTl9NRVNTQUdFX1JFQ0VJVkVEKSkgewotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJSZWNlaXZlZCBtZXNzYWdlIGNhbGxiYWNrOiBzZXNzaW9uSWQ9IiArIHNlc3Npb25JZCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG1Pbk1lc3NhZ2VSZWNlaXZlZExpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbU9uTWVzc2FnZVJlY2VpdmVkTGlzdGVuZXIub25NZXNzYWdlUmVjZWl2ZWQoc2Vzc2lvbklkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVudC5nZXRCdW5kbGVFeHRyYShNZWRpYUNvbnRyb2xJbnRlbnQuRVhUUkFfTUVTU0FHRSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEEgY2FsbGJhY2sgdGhhdCB3aWxsIHJlY2VpdmUgbWVkaWEgc3RhdHVzIHVwZGF0ZXMuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBTdGF0dXNDYWxsYmFjayB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgc3RhdHVzIG9mIGEgbWVkaWEgaXRlbSBjaGFuZ2VzLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gZGF0YSBUaGUgcmVzdWx0IGRhdGEgYnVuZGxlLgotICAgICAgICAgKiBAcGFyYW0gc2Vzc2lvbklkIFRoZSBzZXNzaW9uIGlkLgotICAgICAgICAgKiBAcGFyYW0gc2Vzc2lvblN0YXR1cyBUaGUgc2Vzc2lvbiBzdGF0dXMsIG9yIG51bGwgaWYgdW5rbm93bi4KLSAgICAgICAgICogQHBhcmFtIGl0ZW1JZCBUaGUgaXRlbSBpZC4KLSAgICAgICAgICogQHBhcmFtIGl0ZW1TdGF0dXMgVGhlIGl0ZW0gc3RhdHVzLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25JdGVtU3RhdHVzQ2hhbmdlZChCdW5kbGUgZGF0YSwKLSAgICAgICAgICAgICAgICBTdHJpbmcgc2Vzc2lvbklkLCBNZWRpYVNlc3Npb25TdGF0dXMgc2Vzc2lvblN0YXR1cywKLSAgICAgICAgICAgICAgICBTdHJpbmcgaXRlbUlkLCBNZWRpYUl0ZW1TdGF0dXMgaXRlbVN0YXR1cykgewotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxlZCB3aGVuIHRoZSBzdGF0dXMgb2YgYSBtZWRpYSBzZXNzaW9uIGNoYW5nZXMuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBkYXRhIFRoZSByZXN1bHQgZGF0YSBidW5kbGUuCi0gICAgICAgICAqIEBwYXJhbSBzZXNzaW9uSWQgVGhlIHNlc3Npb24gaWQuCi0gICAgICAgICAqIEBwYXJhbSBzZXNzaW9uU3RhdHVzIFRoZSBzZXNzaW9uIHN0YXR1cywgb3IgbnVsbCBpZiB1bmtub3duLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25TZXNzaW9uU3RhdHVzQ2hhbmdlZChCdW5kbGUgZGF0YSwKLSAgICAgICAgICAgICAgICBTdHJpbmcgc2Vzc2lvbklkLCBNZWRpYVNlc3Npb25TdGF0dXMgc2Vzc2lvblN0YXR1cykgewotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxlZCB3aGVuIHRoZSBzZXNzaW9uIG9mIHRoZSByZW1vdGUgcGxheWJhY2sgY2xpZW50IGNoYW5nZXMuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBzZXNzaW9uSWQgVGhlIG5ldyBzZXNzaW9uIGlkLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25TZXNzaW9uQ2hhbmdlZChTdHJpbmcgc2Vzc2lvbklkKSB7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBCYXNlIGNhbGxiYWNrIHR5cGUgZm9yIHJlbW90ZSBwbGF5YmFjayByZXF1ZXN0cy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIEFjdGlvbkNhbGxiYWNrIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxlZCB3aGVuIGEgbWVkaWEgY29udHJvbCByZXF1ZXN0IGZhaWxzLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gZXJyb3IgQSBsb2NhbGl6ZWQgZXJyb3IgbWVzc2FnZSB3aGljaCBtYXkgYmUgc2hvd24gdG8gdGhlIHVzZXIsIG9yIG51bGwKLSAgICAgICAgICogaWYgdGhlIGNhdXNlIG9mIHRoZSBlcnJvciBpcyB1bmNsZWFyLgotICAgICAgICAgKiBAcGFyYW0gY29kZSBUaGUgZXJyb3IgY29kZSwgb3Ige0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNFUlJPUl9VTktOT1dOfSBpZiB1bmtub3duLgotICAgICAgICAgKiBAcGFyYW0gZGF0YSBUaGUgZXJyb3IgZGF0YSBidW5kbGUsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uRXJyb3IoU3RyaW5nIGVycm9yLCBpbnQgY29kZSwgQnVuZGxlIGRhdGEpIHsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxiYWNrIGZvciByZW1vdGUgcGxheWJhY2sgcmVxdWVzdHMgdGhhdCBvcGVyYXRlIG9uIGl0ZW1zLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgSXRlbUFjdGlvbkNhbGxiYWNrIGV4dGVuZHMgQWN0aW9uQ2FsbGJhY2sgewotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIHdoZW4gdGhlIHJlcXVlc3Qgc3VjY2VlZHMuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBkYXRhIFRoZSByZXN1bHQgZGF0YSBidW5kbGUuCi0gICAgICAgICAqIEBwYXJhbSBzZXNzaW9uSWQgVGhlIHNlc3Npb24gaWQuCi0gICAgICAgICAqIEBwYXJhbSBzZXNzaW9uU3RhdHVzIFRoZSBzZXNzaW9uIHN0YXR1cywgb3IgbnVsbCBpZiB1bmtub3duLgotICAgICAgICAgKiBAcGFyYW0gaXRlbUlkIFRoZSBpdGVtIGlkLgotICAgICAgICAgKiBAcGFyYW0gaXRlbVN0YXR1cyBUaGUgaXRlbSBzdGF0dXMuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBvblJlc3VsdChCdW5kbGUgZGF0YSwgU3RyaW5nIHNlc3Npb25JZCwgTWVkaWFTZXNzaW9uU3RhdHVzIHNlc3Npb25TdGF0dXMsCi0gICAgICAgICAgICAgICAgU3RyaW5nIGl0ZW1JZCwgTWVkaWFJdGVtU3RhdHVzIGl0ZW1TdGF0dXMpIHsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxiYWNrIGZvciByZW1vdGUgcGxheWJhY2sgcmVxdWVzdHMgdGhhdCBvcGVyYXRlIG9uIHNlc3Npb25zLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgU2Vzc2lvbkFjdGlvbkNhbGxiYWNrIGV4dGVuZHMgQWN0aW9uQ2FsbGJhY2sgewotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIHdoZW4gdGhlIHJlcXVlc3Qgc3VjY2VlZHMuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBkYXRhIFRoZSByZXN1bHQgZGF0YSBidW5kbGUuCi0gICAgICAgICAqIEBwYXJhbSBzZXNzaW9uSWQgVGhlIHNlc3Npb24gaWQuCi0gICAgICAgICAqIEBwYXJhbSBzZXNzaW9uU3RhdHVzIFRoZSBzZXNzaW9uIHN0YXR1cywgb3IgbnVsbCBpZiB1bmtub3duLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25SZXN1bHQoQnVuZGxlIGRhdGEsIFN0cmluZyBzZXNzaW9uSWQsIE1lZGlhU2Vzc2lvblN0YXR1cyBzZXNzaW9uU3RhdHVzKSB7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBIGNhbGxiYWNrIHRoYXQgd2lsbCByZWNlaXZlIG1lc3NhZ2VzIGZyb20gbWVkaWEgc2Vzc2lvbnMuCi0gICAgICovCi0gICAgcHVibGljIGludGVyZmFjZSBPbk1lc3NhZ2VSZWNlaXZlZExpc3RlbmVyIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxlZCB3aGVuIGEgbWVzc2FnZSByZWNlaXZlZC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHNlc3Npb25JZCBUaGUgc2Vzc2lvbiBpZC4KLSAgICAgICAgICogQHBhcmFtIG1lc3NhZ2UgQSBidW5kbGUgbWVzc2FnZSBkZW5vdGluZyB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0VYVFJBX01FU1NBR0V9LgotICAgICAgICAgKi8KLSAgICAgICAgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChTdHJpbmcgc2Vzc2lvbklkLCBCdW5kbGUgbWVzc2FnZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL1N5c3RlbU1lZGlhUm91dGVQcm92aWRlci5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL1N5c3RlbU1lZGlhUm91dGVQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzg0OTFmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9TeXN0ZW1NZWRpYVJvdXRlUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWE7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9NYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQub3MuQnVpbGQ7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uUmVxdWlyZXNBcGk7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LkRpc3BsYXk7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS51cGRhdGUuQXBpSGVscGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLnVwZGF0ZS5SOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotCi0vKioKLSAqIFByb3ZpZGVzIHJvdXRlcyBmb3IgYnVpbHQtaW4gc3lzdGVtIGRlc3RpbmF0aW9ucyBzdWNoIGFzIHRoZSBsb2NhbCBkaXNwbGF5Ci0gKiBhbmQgc3BlYWtlci4gIE9uIEplbGx5YmVhbiBhbmQgbmV3ZXIgcGxhdGZvcm0gcmVsZWFzZXMsIHF1ZXJpZXMgdGhlIGZyYW1ld29yawotICogTWVkaWFSb3V0ZXIgZm9yIGZyYW1ld29yay1wcm92aWRlZCByb3V0ZXMgYW5kIHJlZ2lzdGVycyBub24tZnJhbWV3b3JrLXByb3ZpZGVkCi0gKiByb3V0ZXMgYXMgdXNlciByb3V0ZXMuCi0gKi8KLWFic3RyYWN0IGNsYXNzIFN5c3RlbU1lZGlhUm91dGVQcm92aWRlciBleHRlbmRzIE1lZGlhUm91dGVQcm92aWRlciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJTeXN0ZW1NZWRpYVJvdXRlUHJvdmlkZXIiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFDS0FHRV9OQU1FID0gImFuZHJvaWQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfUk9VVEVfSUQgPSAiREVGQVVMVF9ST1VURSI7Ci0KLSAgICBwcm90ZWN0ZWQgU3lzdGVtTWVkaWFSb3V0ZVByb3ZpZGVyKENvbnRleHQgY29udGV4dCkgewotICAgICAgICBzdXBlcihjb250ZXh0LCBuZXcgUHJvdmlkZXJNZXRhZGF0YShuZXcgQ29tcG9uZW50TmFtZShQQUNLQUdFX05BTUUsCi0gICAgICAgICAgICAgICAgU3lzdGVtTWVkaWFSb3V0ZVByb3ZpZGVyLmNsYXNzLmdldE5hbWUoKSkpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN5c3RlbU1lZGlhUm91dGVQcm92aWRlciBvYnRhaW4oQ29udGV4dCBjb250ZXh0LCBTeW5jQ2FsbGJhY2sgc3luY0NhbGxiYWNrKSB7Ci0gICAgICAgIGlmIChCdWlsZC5WRVJTSU9OLlNES19JTlQgPj0gMjQpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgQXBpMjRJbXBsKGNvbnRleHQsIHN5bmNDYWxsYmFjayk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKEJ1aWxkLlZFUlNJT04uU0RLX0lOVCA+PSAxOCkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBKZWxseWJlYW5NcjJJbXBsKGNvbnRleHQsIHN5bmNDYWxsYmFjayk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKEJ1aWxkLlZFUlNJT04uU0RLX0lOVCA+PSAxNykgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBKZWxseWJlYW5NcjFJbXBsKGNvbnRleHQsIHN5bmNDYWxsYmFjayk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKEJ1aWxkLlZFUlNJT04uU0RLX0lOVCA+PSAxNikgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBKZWxseWJlYW5JbXBsKGNvbnRleHQsIHN5bmNDYWxsYmFjayk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBMZWdhY3lJbXBsKGNvbnRleHQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxlZCBieSB0aGUgbWVkaWEgcm91dGVyIHdoZW4gYSByb3V0ZSBpcyBhZGRlZCB0byBzeW5jaHJvbml6ZSBzdGF0ZSB3aXRoCi0gICAgICogdGhlIGZyYW1ld29yayBtZWRpYSByb3V0ZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgb25TeW5jUm91dGVBZGRlZChNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgYnkgdGhlIG1lZGlhIHJvdXRlciB3aGVuIGEgcm91dGUgaXMgcmVtb3ZlZCB0byBzeW5jaHJvbml6ZSBzdGF0ZSB3aXRoCi0gICAgICogdGhlIGZyYW1ld29yayBtZWRpYSByb3V0ZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgb25TeW5jUm91dGVSZW1vdmVkKE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxlZCBieSB0aGUgbWVkaWEgcm91dGVyIHdoZW4gYSByb3V0ZSBpcyBjaGFuZ2VkIHRvIHN5bmNocm9uaXplIHN0YXRlIHdpdGgKLSAgICAgKiB0aGUgZnJhbWV3b3JrIG1lZGlhIHJvdXRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBvblN5bmNSb3V0ZUNoYW5nZWQoTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIGJ5IHRoZSBtZWRpYSByb3V0ZXIgd2hlbiBhIHJvdXRlIGlzIHNlbGVjdGVkIHRvIHN5bmNocm9uaXplIHN0YXRlIHdpdGgKLSAgICAgKiB0aGUgZnJhbWV3b3JrIG1lZGlhIHJvdXRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBvblN5bmNSb3V0ZVNlbGVjdGVkKE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxiYWNrcyBpbnRvIHRoZSBtZWRpYSByb3V0ZXIgdG8gc3luY2hyb25pemUgc3RhdGUgd2l0aCB0aGUgZnJhbWV3b3JrIG1lZGlhIHJvdXRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50ZXJmYWNlIFN5bmNDYWxsYmFjayB7Ci0gICAgICAgIHZvaWQgb25TeXN0ZW1Sb3V0ZVNlbGVjdGVkQnlEZXNjcmlwdG9ySWQoU3RyaW5nIGlkKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGdldERlZmF1bHRSb3V0ZSgpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIE9iamVjdCBnZXRTeXN0ZW1Sb3V0ZShNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTGVnYWN5IGltcGxlbWVudGF0aW9uIGZvciBwbGF0Zm9ybSB2ZXJzaW9ucyBwcmlvciB0byBKZWxseWJlYW4uCi0gICAgICovCi0gICAgc3RhdGljIGNsYXNzIExlZ2FjeUltcGwgZXh0ZW5kcyBTeXN0ZW1NZWRpYVJvdXRlUHJvdmlkZXIgewotICAgICAgICBzdGF0aWMgZmluYWwgaW50IFBMQVlCQUNLX1NUUkVBTSA9IEF1ZGlvTWFuYWdlci5TVFJFQU1fTVVTSUM7Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQXJyYXlMaXN0PEludGVudEZpbHRlcj4gQ09OVFJPTF9GSUxURVJTOwotICAgICAgICBzdGF0aWMgewotICAgICAgICAgICAgSW50ZW50RmlsdGVyIGYgPSBuZXcgSW50ZW50RmlsdGVyKCk7Ci0gICAgICAgICAgICBmLmFkZENhdGVnb3J5KE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9MSVZFX0FVRElPKTsKLSAgICAgICAgICAgIGYuYWRkQ2F0ZWdvcnkoTWVkaWFDb250cm9sSW50ZW50LkNBVEVHT1JZX0xJVkVfVklERU8pOwotCi0gICAgICAgICAgICBDT05UUk9MX0ZJTFRFUlMgPSBuZXcgQXJyYXlMaXN0PEludGVudEZpbHRlcj4oKTsKLSAgICAgICAgICAgIENPTlRST0xfRklMVEVSUy5hZGQoZik7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBBdWRpb01hbmFnZXIgbUF1ZGlvTWFuYWdlcjsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBWb2x1bWVDaGFuZ2VSZWNlaXZlciBtVm9sdW1lQ2hhbmdlUmVjZWl2ZXI7Ci0gICAgICAgIGludCBtTGFzdFJlcG9ydGVkVm9sdW1lID0gLTE7Ci0KLSAgICAgICAgcHVibGljIExlZ2FjeUltcGwoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgICAgICBzdXBlcihjb250ZXh0KTsKLSAgICAgICAgICAgIG1BdWRpb01hbmFnZXIgPSAoQXVkaW9NYW5hZ2VyKWNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkFVRElPX1NFUlZJQ0UpOwotICAgICAgICAgICAgbVZvbHVtZUNoYW5nZVJlY2VpdmVyID0gbmV3IFZvbHVtZUNoYW5nZVJlY2VpdmVyKCk7Ci0KLSAgICAgICAgICAgIGNvbnRleHQucmVnaXN0ZXJSZWNlaXZlcihtVm9sdW1lQ2hhbmdlUmVjZWl2ZXIsCi0gICAgICAgICAgICAgICAgICAgIG5ldyBJbnRlbnRGaWx0ZXIoVm9sdW1lQ2hhbmdlUmVjZWl2ZXIuVk9MVU1FX0NIQU5HRURfQUNUSU9OKSk7Ci0gICAgICAgICAgICBwdWJsaXNoUm91dGVzKCk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHB1Ymxpc2hSb3V0ZXMoKSB7Ci0gICAgICAgICAgICBSZXNvdXJjZXMgciA9IGdldENvbnRleHQoKS5nZXRSZXNvdXJjZXMoKTsKLSAgICAgICAgICAgIGludCBtYXhWb2x1bWUgPSBtQXVkaW9NYW5hZ2VyLmdldFN0cmVhbU1heFZvbHVtZShQTEFZQkFDS19TVFJFQU0pOwotICAgICAgICAgICAgbUxhc3RSZXBvcnRlZFZvbHVtZSA9IG1BdWRpb01hbmFnZXIuZ2V0U3RyZWFtVm9sdW1lKFBMQVlCQUNLX1NUUkVBTSk7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlRGVzY3JpcHRvciBkZWZhdWx0Um91dGUgPSBuZXcgTWVkaWFSb3V0ZURlc2NyaXB0b3IuQnVpbGRlcigKLSAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9ST1VURV9JRCwgci5nZXRTdHJpbmcoUi5zdHJpbmcubXJfc3lzdGVtX3JvdXRlX25hbWUpKQotICAgICAgICAgICAgICAgICAgICAuYWRkQ29udHJvbEZpbHRlcnMoQ09OVFJPTF9GSUxURVJTKQotICAgICAgICAgICAgICAgICAgICAuc2V0UGxheWJhY2tTdHJlYW0oUExBWUJBQ0tfU1RSRUFNKQotICAgICAgICAgICAgICAgICAgICAuc2V0UGxheWJhY2tUeXBlKE1lZGlhUm91dGVyLlJvdXRlSW5mby5QTEFZQkFDS19UWVBFX0xPQ0FMKQotICAgICAgICAgICAgICAgICAgICAuc2V0Vm9sdW1lSGFuZGxpbmcoTWVkaWFSb3V0ZXIuUm91dGVJbmZvLlBMQVlCQUNLX1ZPTFVNRV9WQVJJQUJMRSkKLSAgICAgICAgICAgICAgICAgICAgLnNldFZvbHVtZU1heChtYXhWb2x1bWUpCi0gICAgICAgICAgICAgICAgICAgIC5zZXRWb2x1bWUobUxhc3RSZXBvcnRlZFZvbHVtZSkKLSAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7Ci0KLSAgICAgICAgICAgIE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IgcHJvdmlkZXJEZXNjcmlwdG9yID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IuQnVpbGRlcigpCi0gICAgICAgICAgICAgICAgICAgIC5hZGRSb3V0ZShkZWZhdWx0Um91dGUpCi0gICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOwotICAgICAgICAgICAgc2V0RGVzY3JpcHRvcihwcm92aWRlckRlc2NyaXB0b3IpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBSb3V0ZUNvbnRyb2xsZXIgb25DcmVhdGVSb3V0ZUNvbnRyb2xsZXIoU3RyaW5nIHJvdXRlSWQpIHsKLSAgICAgICAgICAgIGlmIChyb3V0ZUlkLmVxdWFscyhERUZBVUxUX1JPVVRFX0lEKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRGVmYXVsdFJvdXRlQ29udHJvbGxlcigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBjbGFzcyBEZWZhdWx0Um91dGVDb250cm9sbGVyIGV4dGVuZHMgUm91dGVDb250cm9sbGVyIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25TZXRWb2x1bWUoaW50IHZvbHVtZSkgewotICAgICAgICAgICAgICAgIG1BdWRpb01hbmFnZXIuc2V0U3RyZWFtVm9sdW1lKFBMQVlCQUNLX1NUUkVBTSwgdm9sdW1lLCAwKTsKLSAgICAgICAgICAgICAgICBwdWJsaXNoUm91dGVzKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25VcGRhdGVWb2x1bWUoaW50IGRlbHRhKSB7Ci0gICAgICAgICAgICAgICAgaW50IHZvbHVtZSA9IG1BdWRpb01hbmFnZXIuZ2V0U3RyZWFtVm9sdW1lKFBMQVlCQUNLX1NUUkVBTSk7Ci0gICAgICAgICAgICAgICAgaW50IG1heFZvbHVtZSA9IG1BdWRpb01hbmFnZXIuZ2V0U3RyZWFtTWF4Vm9sdW1lKFBMQVlCQUNLX1NUUkVBTSk7Ci0gICAgICAgICAgICAgICAgaW50IG5ld1ZvbHVtZSA9IE1hdGgubWluKG1heFZvbHVtZSwgTWF0aC5tYXgoMCwgdm9sdW1lICsgZGVsdGEpKTsKLSAgICAgICAgICAgICAgICBpZiAobmV3Vm9sdW1lICE9IHZvbHVtZSkgewotICAgICAgICAgICAgICAgICAgICBtQXVkaW9NYW5hZ2VyLnNldFN0cmVhbVZvbHVtZShQTEFZQkFDS19TVFJFQU0sIHZvbHVtZSwgMCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHB1Ymxpc2hSb3V0ZXMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIGNsYXNzIFZvbHVtZUNoYW5nZVJlY2VpdmVyIGV4dGVuZHMgQnJvYWRjYXN0UmVjZWl2ZXIgewotICAgICAgICAgICAgLy8gVGhlc2UgY29uc3RhbnRzIGNvbWUgZnJvbSBBdWRpb01hbmFnZXIuCi0gICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWT0xVTUVfQ0hBTkdFRF9BQ1RJT04gPQotICAgICAgICAgICAgICAgICAgICAiYW5kcm9pZC5tZWRpYS5WT0xVTUVfQ0hBTkdFRF9BQ1RJT04iOwotICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfVk9MVU1FX1NUUkVBTV9UWVBFID0KLSAgICAgICAgICAgICAgICAgICAgImFuZHJvaWQubWVkaWEuRVhUUkFfVk9MVU1FX1NUUkVBTV9UWVBFIjsKLSAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1ZPTFVNRV9TVFJFQU1fVkFMVUUgPQotICAgICAgICAgICAgICAgICAgICAiYW5kcm9pZC5tZWRpYS5FWFRSQV9WT0xVTUVfU1RSRUFNX1ZBTFVFIjsKLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvblJlY2VpdmUoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7Ci0gICAgICAgICAgICAgICAgaWYgKGludGVudC5nZXRBY3Rpb24oKS5lcXVhbHMoVk9MVU1FX0NIQU5HRURfQUNUSU9OKSkgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgc3RyZWFtVHlwZSA9IGludGVudC5nZXRJbnRFeHRyYShFWFRSQV9WT0xVTUVfU1RSRUFNX1RZUEUsIC0xKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmVhbVR5cGUgPT0gUExBWUJBQ0tfU1RSRUFNKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgdm9sdW1lID0gaW50ZW50LmdldEludEV4dHJhKEVYVFJBX1ZPTFVNRV9TVFJFQU1fVkFMVUUsIC0xKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2b2x1bWUgPj0gMCAmJiB2b2x1bWUgIT0gbUxhc3RSZXBvcnRlZFZvbHVtZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1Ymxpc2hSb3V0ZXMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEplbGx5YmVhbiBpbXBsZW1lbnRhdGlvbi4KLSAgICAgKi8KLSAgICAvLyBAQFJlcXVpcmVzQXBpKDE2KQotICAgIHN0YXRpYyBjbGFzcyBKZWxseWJlYW5JbXBsIGV4dGVuZHMgU3lzdGVtTWVkaWFSb3V0ZVByb3ZpZGVyCi0gICAgICAgICAgICBpbXBsZW1lbnRzIE1lZGlhUm91dGVySmVsbHliZWFuLkNhbGxiYWNrLCBNZWRpYVJvdXRlckplbGx5YmVhbi5Wb2x1bWVDYWxsYmFjayB7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEFycmF5TGlzdDxJbnRlbnRGaWx0ZXI+IExJVkVfQVVESU9fQ09OVFJPTF9GSUxURVJTOwotICAgICAgICBzdGF0aWMgewotICAgICAgICAgICAgSW50ZW50RmlsdGVyIGYgPSBuZXcgSW50ZW50RmlsdGVyKCk7Ci0gICAgICAgICAgICBmLmFkZENhdGVnb3J5KE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9MSVZFX0FVRElPKTsKLQotICAgICAgICAgICAgTElWRV9BVURJT19DT05UUk9MX0ZJTFRFUlMgPSBuZXcgQXJyYXlMaXN0PEludGVudEZpbHRlcj4oKTsKLSAgICAgICAgICAgIExJVkVfQVVESU9fQ09OVFJPTF9GSUxURVJTLmFkZChmKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEFycmF5TGlzdDxJbnRlbnRGaWx0ZXI+IExJVkVfVklERU9fQ09OVFJPTF9GSUxURVJTOwotICAgICAgICBzdGF0aWMgewotICAgICAgICAgICAgSW50ZW50RmlsdGVyIGYgPSBuZXcgSW50ZW50RmlsdGVyKCk7Ci0gICAgICAgICAgICBmLmFkZENhdGVnb3J5KE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9MSVZFX1ZJREVPKTsKLQotICAgICAgICAgICAgTElWRV9WSURFT19DT05UUk9MX0ZJTFRFUlMgPSBuZXcgQXJyYXlMaXN0PEludGVudEZpbHRlcj4oKTsKLSAgICAgICAgICAgIExJVkVfVklERU9fQ09OVFJPTF9GSUxURVJTLmFkZChmKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgZmluYWwgU3luY0NhbGxiYWNrIG1TeW5jQ2FsbGJhY2s7Ci0KLSAgICAgICAgcHJvdGVjdGVkIGZpbmFsIE9iamVjdCBtUm91dGVyT2JqOwotICAgICAgICBwcm90ZWN0ZWQgZmluYWwgT2JqZWN0IG1DYWxsYmFja09iajsKLSAgICAgICAgcHJvdGVjdGVkIGZpbmFsIE9iamVjdCBtVm9sdW1lQ2FsbGJhY2tPYmo7Ci0gICAgICAgIHByb3RlY3RlZCBmaW5hbCBPYmplY3QgbVVzZXJSb3V0ZUNhdGVnb3J5T2JqOwotICAgICAgICBwcm90ZWN0ZWQgaW50IG1Sb3V0ZVR5cGVzOwotICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBtQWN0aXZlU2NhbjsKLSAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gbUNhbGxiYWNrUmVnaXN0ZXJlZDsKLQotICAgICAgICAvLyBNYWludGFpbnMgYW4gYXNzb2NpYXRpb24gZnJvbSBmcmFtZXdvcmsgcm91dGVzIHRvIHN1cHBvcnQgbGlicmFyeSByb3V0ZXMuCi0gICAgICAgIC8vIE5vdGUgdGhhdCB3ZSBjYW5ub3QgdXNlIHRoZSB0YWcgZmllbGQgZm9yIHRoaXMgYmVjYXVzZSBhbiBhcHBsaWNhdGlvbiBtYXkKLSAgICAgICAgLy8gaGF2ZSBwdWJsaXNoZWQgaXRzIG93biB1c2VyIHJvdXRlcyB0byB0aGUgZnJhbWV3b3JrIG1lZGlhIHJvdXRlciBhbmQgYWxyZWFkeQotICAgICAgICAvLyB1c2VkIHRoZSB0YWcgZm9yIGl0cyBvd24gcHVycG9zZXMuCi0gICAgICAgIHByb3RlY3RlZCBmaW5hbCBBcnJheUxpc3Q8U3lzdGVtUm91dGVSZWNvcmQ+IG1TeXN0ZW1Sb3V0ZVJlY29yZHMgPQotICAgICAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8U3lzdGVtUm91dGVSZWNvcmQ+KCk7Ci0KLSAgICAgICAgLy8gTWFpbnRhaW5zIGFuIGFzc29jaWF0aW9uIGZyb20gc3VwcG9ydCBsaWJyYXJ5IHJvdXRlcyB0byBmcmFtZXdvcmsgcm91dGVzLgotICAgICAgICBwcm90ZWN0ZWQgZmluYWwgQXJyYXlMaXN0PFVzZXJSb3V0ZVJlY29yZD4gbVVzZXJSb3V0ZVJlY29yZHMgPQotICAgICAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8VXNlclJvdXRlUmVjb3JkPigpOwotCi0gICAgICAgIHByaXZhdGUgTWVkaWFSb3V0ZXJKZWxseWJlYW4uU2VsZWN0Um91dGVXb3JrYXJvdW5kIG1TZWxlY3RSb3V0ZVdvcmthcm91bmQ7Ci0gICAgICAgIHByaXZhdGUgTWVkaWFSb3V0ZXJKZWxseWJlYW4uR2V0RGVmYXVsdFJvdXRlV29ya2Fyb3VuZCBtR2V0RGVmYXVsdFJvdXRlV29ya2Fyb3VuZDsKLQotICAgICAgICBwdWJsaWMgSmVsbHliZWFuSW1wbChDb250ZXh0IGNvbnRleHQsIFN5bmNDYWxsYmFjayBzeW5jQ2FsbGJhY2spIHsKLSAgICAgICAgICAgIHN1cGVyKGNvbnRleHQpOwotICAgICAgICAgICAgbVN5bmNDYWxsYmFjayA9IHN5bmNDYWxsYmFjazsKLSAgICAgICAgICAgIG1Sb3V0ZXJPYmogPSBNZWRpYVJvdXRlckplbGx5YmVhbi5nZXRNZWRpYVJvdXRlcihjb250ZXh0KTsKLSAgICAgICAgICAgIG1DYWxsYmFja09iaiA9IGNyZWF0ZUNhbGxiYWNrT2JqKCk7Ci0gICAgICAgICAgICBtVm9sdW1lQ2FsbGJhY2tPYmogPSBjcmVhdGVWb2x1bWVDYWxsYmFja09iaigpOwotCi0gICAgICAgICAgICBSZXNvdXJjZXMgciA9IEFwaUhlbHBlci5nZXRMaWJSZXNvdXJjZXMoY29udGV4dCk7Ci0gICAgICAgICAgICBtVXNlclJvdXRlQ2F0ZWdvcnlPYmogPSBNZWRpYVJvdXRlckplbGx5YmVhbi5jcmVhdGVSb3V0ZUNhdGVnb3J5KAotICAgICAgICAgICAgICAgICAgICBtUm91dGVyT2JqLCByLmdldFN0cmluZyhSLnN0cmluZy5tcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUpLCBmYWxzZSk7Ci0KLSAgICAgICAgICAgIHVwZGF0ZVN5c3RlbVJvdXRlcygpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBSb3V0ZUNvbnRyb2xsZXIgb25DcmVhdGVSb3V0ZUNvbnRyb2xsZXIoU3RyaW5nIHJvdXRlSWQpIHsKLSAgICAgICAgICAgIGludCBpbmRleCA9IGZpbmRTeXN0ZW1Sb3V0ZVJlY29yZEJ5RGVzY3JpcHRvcklkKHJvdXRlSWQpOwotICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW1Sb3V0ZVJlY29yZCByZWNvcmQgPSBtU3lzdGVtUm91dGVSZWNvcmRzLmdldChpbmRleCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTeXN0ZW1Sb3V0ZUNvbnRyb2xsZXIocmVjb3JkLm1Sb3V0ZU9iaik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbkRpc2NvdmVyeVJlcXVlc3RDaGFuZ2VkKE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0IHJlcXVlc3QpIHsKLSAgICAgICAgICAgIGludCBuZXdSb3V0ZVR5cGVzID0gMDsKLSAgICAgICAgICAgIGJvb2xlYW4gbmV3QWN0aXZlU2NhbiA9IGZhbHNlOwotICAgICAgICAgICAgaWYgKHJlcXVlc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZpbmFsIE1lZGlhUm91dGVTZWxlY3RvciBzZWxlY3RvciA9IHJlcXVlc3QuZ2V0U2VsZWN0b3IoKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gY2F0ZWdvcmllcyA9IHNlbGVjdG9yLmdldENvbnRyb2xDYXRlZ29yaWVzKCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gY2F0ZWdvcmllcy5zaXplKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBjYXRlZ29yeSA9IGNhdGVnb3JpZXMuZ2V0KGkpOwotICAgICAgICAgICAgICAgICAgICBpZiAoY2F0ZWdvcnkuZXF1YWxzKE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9MSVZFX0FVRElPKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbmV3Um91dGVUeXBlcyB8PSBNZWRpYVJvdXRlckplbGx5YmVhbi5ST1VURV9UWVBFX0xJVkVfQVVESU87Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2F0ZWdvcnkuZXF1YWxzKE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9MSVZFX1ZJREVPKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbmV3Um91dGVUeXBlcyB8PSBNZWRpYVJvdXRlckplbGx5YmVhbi5ST1VURV9UWVBFX0xJVkVfVklERU87Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuZXdSb3V0ZVR5cGVzIHw9IE1lZGlhUm91dGVySmVsbHliZWFuLlJPVVRFX1RZUEVfVVNFUjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBuZXdBY3RpdmVTY2FuID0gcmVxdWVzdC5pc0FjdGl2ZVNjYW4oKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1Sb3V0ZVR5cGVzICE9IG5ld1JvdXRlVHlwZXMgfHwgbUFjdGl2ZVNjYW4gIT0gbmV3QWN0aXZlU2NhbikgewotICAgICAgICAgICAgICAgIG1Sb3V0ZVR5cGVzID0gbmV3Um91dGVUeXBlczsKLSAgICAgICAgICAgICAgICBtQWN0aXZlU2NhbiA9IG5ld0FjdGl2ZVNjYW47Ci0gICAgICAgICAgICAgICAgdXBkYXRlU3lzdGVtUm91dGVzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZUFkZGVkKE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgaWYgKGFkZFN5c3RlbVJvdXRlTm9QdWJsaXNoKHJvdXRlT2JqKSkgewotICAgICAgICAgICAgICAgIHB1Ymxpc2hSb3V0ZXMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCB1cGRhdGVTeXN0ZW1Sb3V0ZXMoKSB7Ci0gICAgICAgICAgICB1cGRhdGVDYWxsYmFjaygpOwotICAgICAgICAgICAgYm9vbGVhbiBjaGFuZ2VkID0gZmFsc2U7Ci0gICAgICAgICAgICBmb3IgKE9iamVjdCByb3V0ZU9iaiA6IE1lZGlhUm91dGVySmVsbHliZWFuLmdldFJvdXRlcyhtUm91dGVyT2JqKSkgewotICAgICAgICAgICAgICAgIGNoYW5nZWQgfD0gYWRkU3lzdGVtUm91dGVOb1B1Ymxpc2gocm91dGVPYmopOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGNoYW5nZWQpIHsKLSAgICAgICAgICAgICAgICBwdWJsaXNoUm91dGVzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gYWRkU3lzdGVtUm91dGVOb1B1Ymxpc2goT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICBpZiAoZ2V0VXNlclJvdXRlUmVjb3JkKHJvdXRlT2JqKSA9PSBudWxsCi0gICAgICAgICAgICAgICAgICAgICYmIGZpbmRTeXN0ZW1Sb3V0ZVJlY29yZChyb3V0ZU9iaikgPCAwKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGlkID0gYXNzaWduUm91dGVJZChyb3V0ZU9iaik7Ci0gICAgICAgICAgICAgICAgU3lzdGVtUm91dGVSZWNvcmQgcmVjb3JkID0gbmV3IFN5c3RlbVJvdXRlUmVjb3JkKHJvdXRlT2JqLCBpZCk7Ci0gICAgICAgICAgICAgICAgdXBkYXRlU3lzdGVtUm91dGVEZXNjcmlwdG9yKHJlY29yZCk7Ci0gICAgICAgICAgICAgICAgbVN5c3RlbVJvdXRlUmVjb3Jkcy5hZGQocmVjb3JkKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgU3RyaW5nIGFzc2lnblJvdXRlSWQoT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICAvLyBUT0RPOiBUaGUgZnJhbWV3b3JrIG1lZGlhIHJvdXRlciBzaG91bGQgc3VwcGx5IGEgdW5pcXVlIHJvdXRlIGlkIHRoYXQKLSAgICAgICAgICAgIC8vIHdlIGNhbiB1c2UgaGVyZS4gIEZvciBub3cgd2UgdXNlIGEgaGFzaCBvZiB0aGUgcm91dGUgbmFtZSBhbmQgdGFrZSBjYXJlCi0gICAgICAgICAgICAvLyB0byBkZWR1cGUgaXQuCi0gICAgICAgICAgICBib29sZWFuIGlzRGVmYXVsdCA9IChnZXREZWZhdWx0Um91dGUoKSA9PSByb3V0ZU9iaik7Ci0gICAgICAgICAgICBTdHJpbmcgaWQgPSBpc0RlZmF1bHQgPyBERUZBVUxUX1JPVVRFX0lEIDoKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmZvcm1hdChMb2NhbGUuVVMsICJST1VURV8lMDh4IiwgZ2V0Um91dGVOYW1lKHJvdXRlT2JqKS5oYXNoQ29kZSgpKTsKLSAgICAgICAgICAgIGlmIChmaW5kU3lzdGVtUm91dGVSZWNvcmRCeURlc2NyaXB0b3JJZChpZCkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGlkOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDI7IDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG5ld0lkID0gU3RyaW5nLmZvcm1hdChMb2NhbGUuVVMsICIlc18lZCIsIGlkLCBpKTsKLSAgICAgICAgICAgICAgICBpZiAoZmluZFN5c3RlbVJvdXRlUmVjb3JkQnlEZXNjcmlwdG9ySWQobmV3SWQpIDwgMCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3SWQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVSZW1vdmVkKE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgaWYgKGdldFVzZXJSb3V0ZVJlY29yZChyb3V0ZU9iaikgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGludCBpbmRleCA9IGZpbmRTeXN0ZW1Sb3V0ZVJlY29yZChyb3V0ZU9iaik7Ci0gICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbVN5c3RlbVJvdXRlUmVjb3Jkcy5yZW1vdmUoaW5kZXgpOwotICAgICAgICAgICAgICAgICAgICBwdWJsaXNoUm91dGVzKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVDaGFuZ2VkKE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgaWYgKGdldFVzZXJSb3V0ZVJlY29yZChyb3V0ZU9iaikgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGludCBpbmRleCA9IGZpbmRTeXN0ZW1Sb3V0ZVJlY29yZChyb3V0ZU9iaik7Ci0gICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtUm91dGVSZWNvcmQgcmVjb3JkID0gbVN5c3RlbVJvdXRlUmVjb3Jkcy5nZXQoaW5kZXgpOwotICAgICAgICAgICAgICAgICAgICB1cGRhdGVTeXN0ZW1Sb3V0ZURlc2NyaXB0b3IocmVjb3JkKTsKLSAgICAgICAgICAgICAgICAgICAgcHVibGlzaFJvdXRlcygpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlVm9sdW1lQ2hhbmdlZChPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgIGlmIChnZXRVc2VyUm91dGVSZWNvcmQocm91dGVPYmopID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSBmaW5kU3lzdGVtUm91dGVSZWNvcmQocm91dGVPYmopOwotICAgICAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbVJvdXRlUmVjb3JkIHJlY29yZCA9IG1TeXN0ZW1Sb3V0ZVJlY29yZHMuZ2V0KGluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgaW50IG5ld1ZvbHVtZSA9IE1lZGlhUm91dGVySmVsbHliZWFuLlJvdXRlSW5mby5nZXRWb2x1bWUocm91dGVPYmopOwotICAgICAgICAgICAgICAgICAgICBpZiAobmV3Vm9sdW1lICE9IHJlY29yZC5tUm91dGVEZXNjcmlwdG9yLmdldFZvbHVtZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZWNvcmQubVJvdXRlRGVzY3JpcHRvciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBNZWRpYVJvdXRlRGVzY3JpcHRvci5CdWlsZGVyKHJlY29yZC5tUm91dGVEZXNjcmlwdG9yKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0Vm9sdW1lKG5ld1ZvbHVtZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaXNoUm91dGVzKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVNlbGVjdGVkKGludCB0eXBlLCBPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgIGlmIChyb3V0ZU9iaiAhPSBNZWRpYVJvdXRlckplbGx5YmVhbi5nZXRTZWxlY3RlZFJvdXRlKG1Sb3V0ZXJPYmosCi0gICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLkFMTF9ST1VURV9UWVBFUykpIHsKLSAgICAgICAgICAgICAgICAvLyBUaGUgY3VycmVudGx5IHNlbGVjdGVkIHJvdXRlIGhhcyBhbHJlYWR5IGNoYW5nZWQgc28gdGhpcyBjYWxsYmFjawotICAgICAgICAgICAgICAgIC8vIGlzIHN0YWxlLiAgRHJvcCBpdCB0byBwcmV2ZW50IGdldHRpbmcgaW50byBzeW5jIGxvb3BzLgotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgVXNlclJvdXRlUmVjb3JkIHVzZXJSb3V0ZVJlY29yZCA9IGdldFVzZXJSb3V0ZVJlY29yZChyb3V0ZU9iaik7Ci0gICAgICAgICAgICBpZiAodXNlclJvdXRlUmVjb3JkICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB1c2VyUm91dGVSZWNvcmQubVJvdXRlLnNlbGVjdCgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBTZWxlY3QgdGhlIHJvdXRlIGlmIGl0IGFscmVhZHkgZXhpc3RzIGluIHRoZSBjb21wYXQgbWVkaWEgcm91dGVyLgotICAgICAgICAgICAgICAgIC8vIElmIG5vdCwgd2Ugd2lsbCBzZWxlY3QgaXQgaW5zdGVhZCB3aGVuIHRoZSByb3V0ZSBpcyBhZGRlZC4KLSAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSBmaW5kU3lzdGVtUm91dGVSZWNvcmQocm91dGVPYmopOwotICAgICAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbVJvdXRlUmVjb3JkIHJlY29yZCA9IG1TeXN0ZW1Sb3V0ZVJlY29yZHMuZ2V0KGluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgbVN5bmNDYWxsYmFjay5vblN5c3RlbVJvdXRlU2VsZWN0ZWRCeURlc2NyaXB0b3JJZChyZWNvcmQubVJvdXRlRGVzY3JpcHRvcklkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVVuc2VsZWN0ZWQoaW50IHR5cGUsIE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgLy8gTm90aGluZyB0byBkbyB3aGVuIGEgcm91dGUgaXMgdW5zZWxlY3RlZC4KLSAgICAgICAgICAgIC8vIFdlIG9ubHkgbmVlZCB0byBoYW5kbGUgd2hlbiBhIHJvdXRlIGlzIHNlbGVjdGVkLgotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVHcm91cGVkKE9iamVjdCByb3V0ZU9iaiwgT2JqZWN0IGdyb3VwT2JqLCBpbnQgaW5kZXgpIHsKLSAgICAgICAgICAgIC8vIFJvdXRlIGdyb3VwaW5nIGlzIGRlcHJlY2F0ZWQgYW5kIG5vIGxvbmdlciBzdXBwb3J0ZWQuCi0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVVuZ3JvdXBlZChPYmplY3Qgcm91dGVPYmosIE9iamVjdCBncm91cE9iaikgewotICAgICAgICAgICAgLy8gUm91dGUgZ3JvdXBpbmcgaXMgZGVwcmVjYXRlZCBhbmQgbm8gbG9uZ2VyIHN1cHBvcnRlZC4KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblZvbHVtZVNldFJlcXVlc3QoT2JqZWN0IHJvdXRlT2JqLCBpbnQgdm9sdW1lKSB7Ci0gICAgICAgICAgICBVc2VyUm91dGVSZWNvcmQgcmVjb3JkID0gZ2V0VXNlclJvdXRlUmVjb3JkKHJvdXRlT2JqKTsKLSAgICAgICAgICAgIGlmIChyZWNvcmQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJlY29yZC5tUm91dGUucmVxdWVzdFNldFZvbHVtZSh2b2x1bWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uVm9sdW1lVXBkYXRlUmVxdWVzdChPYmplY3Qgcm91dGVPYmosIGludCBkaXJlY3Rpb24pIHsKLSAgICAgICAgICAgIFVzZXJSb3V0ZVJlY29yZCByZWNvcmQgPSBnZXRVc2VyUm91dGVSZWNvcmQocm91dGVPYmopOwotICAgICAgICAgICAgaWYgKHJlY29yZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmVjb3JkLm1Sb3V0ZS5yZXF1ZXN0VXBkYXRlVm9sdW1lKGRpcmVjdGlvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25TeW5jUm91dGVBZGRlZChNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgICAgIGlmIChyb3V0ZS5nZXRQcm92aWRlckluc3RhbmNlKCkgIT0gdGhpcykgewotICAgICAgICAgICAgICAgIE9iamVjdCByb3V0ZU9iaiA9IE1lZGlhUm91dGVySmVsbHliZWFuLmNyZWF0ZVVzZXJSb3V0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Sb3V0ZXJPYmosIG1Vc2VyUm91dGVDYXRlZ29yeU9iaik7Ci0gICAgICAgICAgICAgICAgVXNlclJvdXRlUmVjb3JkIHJlY29yZCA9IG5ldyBVc2VyUm91dGVSZWNvcmQocm91dGUsIHJvdXRlT2JqKTsKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5Sb3V0ZUluZm8uc2V0VGFnKHJvdXRlT2JqLCByZWNvcmQpOwotICAgICAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLlVzZXJSb3V0ZUluZm8uc2V0Vm9sdW1lQ2FsbGJhY2socm91dGVPYmosIG1Wb2x1bWVDYWxsYmFja09iaik7Ci0gICAgICAgICAgICAgICAgdXBkYXRlVXNlclJvdXRlUHJvcGVydGllcyhyZWNvcmQpOwotICAgICAgICAgICAgICAgIG1Vc2VyUm91dGVSZWNvcmRzLmFkZChyZWNvcmQpOwotICAgICAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLmFkZFVzZXJSb3V0ZShtUm91dGVyT2JqLCByb3V0ZU9iaik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIElmIHRoZSBuZXdseSBhZGRlZCByb3V0ZSBpcyB0aGUgY291bnRlcnBhcnQgb2YgdGhlIGN1cnJlbnRseSBzZWxlY3RlZAotICAgICAgICAgICAgICAgIC8vIHJvdXRlIGluIHRoZSBmcmFtZXdvcmsgbWVkaWEgcm91dGVyIHRoZW4gZW5zdXJlIGl0IGlzIHNlbGVjdGVkIGluCi0gICAgICAgICAgICAgICAgLy8gdGhlIGNvbXBhdCBtZWRpYSByb3V0ZXIuCi0gICAgICAgICAgICAgICAgT2JqZWN0IHJvdXRlT2JqID0gTWVkaWFSb3V0ZXJKZWxseWJlYW4uZ2V0U2VsZWN0ZWRSb3V0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Sb3V0ZXJPYmosIE1lZGlhUm91dGVySmVsbHliZWFuLkFMTF9ST1VURV9UWVBFUyk7Ci0gICAgICAgICAgICAgICAgaW50IGluZGV4ID0gZmluZFN5c3RlbVJvdXRlUmVjb3JkKHJvdXRlT2JqKTsKLSAgICAgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW1Sb3V0ZVJlY29yZCByZWNvcmQgPSBtU3lzdGVtUm91dGVSZWNvcmRzLmdldChpbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZWNvcmQubVJvdXRlRGVzY3JpcHRvcklkLmVxdWFscyhyb3V0ZS5nZXREZXNjcmlwdG9ySWQoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRlLnNlbGVjdCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU3luY1JvdXRlUmVtb3ZlZChNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgICAgIGlmIChyb3V0ZS5nZXRQcm92aWRlckluc3RhbmNlKCkgIT0gdGhpcykgewotICAgICAgICAgICAgICAgIGludCBpbmRleCA9IGZpbmRVc2VyUm91dGVSZWNvcmQocm91dGUpOwotICAgICAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIFVzZXJSb3V0ZVJlY29yZCByZWNvcmQgPSBtVXNlclJvdXRlUmVjb3Jkcy5yZW1vdmUoaW5kZXgpOwotICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5Sb3V0ZUluZm8uc2V0VGFnKHJlY29yZC5tUm91dGVPYmosIG51bGwpOwotICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5Vc2VyUm91dGVJbmZvLnNldFZvbHVtZUNhbGxiYWNrKHJlY29yZC5tUm91dGVPYmosIG51bGwpOwotICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5yZW1vdmVVc2VyUm91dGUobVJvdXRlck9iaiwgcmVjb3JkLm1Sb3V0ZU9iaik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU3luY1JvdXRlQ2hhbmdlZChNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgICAgIGlmIChyb3V0ZS5nZXRQcm92aWRlckluc3RhbmNlKCkgIT0gdGhpcykgewotICAgICAgICAgICAgICAgIGludCBpbmRleCA9IGZpbmRVc2VyUm91dGVSZWNvcmQocm91dGUpOwotICAgICAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIFVzZXJSb3V0ZVJlY29yZCByZWNvcmQgPSBtVXNlclJvdXRlUmVjb3Jkcy5nZXQoaW5kZXgpOwotICAgICAgICAgICAgICAgICAgICB1cGRhdGVVc2VyUm91dGVQcm9wZXJ0aWVzKHJlY29yZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU3luY1JvdXRlU2VsZWN0ZWQoTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgICAgICBpZiAoIXJvdXRlLmlzU2VsZWN0ZWQoKSkgewotICAgICAgICAgICAgICAgIC8vIFRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcm91dGUgaGFzIGFscmVhZHkgY2hhbmdlZCBzbyB0aGlzIGNhbGxiYWNrCi0gICAgICAgICAgICAgICAgLy8gaXMgc3RhbGUuICBEcm9wIGl0IHRvIHByZXZlbnQgZ2V0dGluZyBpbnRvIHN5bmMgbG9vcHMuCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocm91dGUuZ2V0UHJvdmlkZXJJbnN0YW5jZSgpICE9IHRoaXMpIHsKLSAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSBmaW5kVXNlclJvdXRlUmVjb3JkKHJvdXRlKTsKLSAgICAgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgICAgICBVc2VyUm91dGVSZWNvcmQgcmVjb3JkID0gbVVzZXJSb3V0ZVJlY29yZHMuZ2V0KGluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgc2VsZWN0Um91dGUocmVjb3JkLm1Sb3V0ZU9iaik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSBmaW5kU3lzdGVtUm91dGVSZWNvcmRCeURlc2NyaXB0b3JJZChyb3V0ZS5nZXREZXNjcmlwdG9ySWQoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtUm91dGVSZWNvcmQgcmVjb3JkID0gbVN5c3RlbVJvdXRlUmVjb3Jkcy5nZXQoaW5kZXgpOwotICAgICAgICAgICAgICAgICAgICBzZWxlY3RSb3V0ZShyZWNvcmQubVJvdXRlT2JqKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBwdWJsaXNoUm91dGVzKCkgewotICAgICAgICAgICAgTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvci5CdWlsZGVyIGJ1aWxkZXIgPQotICAgICAgICAgICAgICAgICAgICBuZXcgTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvci5CdWlsZGVyKCk7Ci0gICAgICAgICAgICBpbnQgY291bnQgPSBtU3lzdGVtUm91dGVSZWNvcmRzLnNpemUoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIuYWRkUm91dGUobVN5c3RlbVJvdXRlUmVjb3Jkcy5nZXQoaSkubVJvdXRlRGVzY3JpcHRvcik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNldERlc2NyaXB0b3IoYnVpbGRlci5idWlsZCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCBpbnQgZmluZFN5c3RlbVJvdXRlUmVjb3JkKE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gbVN5c3RlbVJvdXRlUmVjb3Jkcy5zaXplKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAobVN5c3RlbVJvdXRlUmVjb3Jkcy5nZXQoaSkubVJvdXRlT2JqID09IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCBpbnQgZmluZFN5c3RlbVJvdXRlUmVjb3JkQnlEZXNjcmlwdG9ySWQoU3RyaW5nIGlkKSB7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBtU3lzdGVtUm91dGVSZWNvcmRzLnNpemUoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgIGlmIChtU3lzdGVtUm91dGVSZWNvcmRzLmdldChpKS5tUm91dGVEZXNjcmlwdG9ySWQuZXF1YWxzKGlkKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgaW50IGZpbmRVc2VyUm91dGVSZWNvcmQoTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBtVXNlclJvdXRlUmVjb3Jkcy5zaXplKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAobVVzZXJSb3V0ZVJlY29yZHMuZ2V0KGkpLm1Sb3V0ZSA9PSByb3V0ZSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgVXNlclJvdXRlUmVjb3JkIGdldFVzZXJSb3V0ZVJlY29yZChPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgIE9iamVjdCB0YWcgPSBNZWRpYVJvdXRlckplbGx5YmVhbi5Sb3V0ZUluZm8uZ2V0VGFnKHJvdXRlT2JqKTsKLSAgICAgICAgICAgIHJldHVybiB0YWcgaW5zdGFuY2VvZiBVc2VyUm91dGVSZWNvcmQgPyAoVXNlclJvdXRlUmVjb3JkKXRhZyA6IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVTeXN0ZW1Sb3V0ZURlc2NyaXB0b3IoU3lzdGVtUm91dGVSZWNvcmQgcmVjb3JkKSB7Ci0gICAgICAgICAgICAvLyBXZSBtdXN0IGFsd2F5cyByZWNyZWF0ZSB0aGUgcm91dGUgZGVzY3JpcHRvciB3aGVuIG1ha2luZyBhbnkgY2hhbmdlcwotICAgICAgICAgICAgLy8gYmVjYXVzZSB0aGV5IGFyZSBpbnRlbmRlZCB0byBiZSBpbW11dGFibGUgb25jZSBwdWJsaXNoZWQuCi0gICAgICAgICAgICBNZWRpYVJvdXRlRGVzY3JpcHRvci5CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgTWVkaWFSb3V0ZURlc2NyaXB0b3IuQnVpbGRlcigKLSAgICAgICAgICAgICAgICAgICAgcmVjb3JkLm1Sb3V0ZURlc2NyaXB0b3JJZCwgZ2V0Um91dGVOYW1lKHJlY29yZC5tUm91dGVPYmopKTsKLSAgICAgICAgICAgIG9uQnVpbGRTeXN0ZW1Sb3V0ZURlc2NyaXB0b3IocmVjb3JkLCBidWlsZGVyKTsKLSAgICAgICAgICAgIHJlY29yZC5tUm91dGVEZXNjcmlwdG9yID0gYnVpbGRlci5idWlsZCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRSb3V0ZU5hbWUoT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICAvLyBSb3V0ZXMgc2hvdWxkIG5vdCBoYXZlIG51bGwgbmFtZXMgYnV0IGl0IG1heSBoYXBwZW4gZm9yIGJhZGx5IGNvbmZpZ3VyZWQKLSAgICAgICAgICAgIC8vIHVzZXIgcm91dGVzLiAgV2UgdG9sZXJhdGUgdGhpcyBieSB1c2luZyBhbiBlbXB0eSBuYW1lIHN0cmluZyBoZXJlIGJ1dAotICAgICAgICAgICAgLy8gc3VjaCB1bm5hbWVkIHJvdXRlcyB3aWxsIGJlIGRpc2NhcmRlZCBieSB0aGUgbWVkaWEgcm91dGVyIHVwc3RyZWFtCi0gICAgICAgICAgICAvLyAod2l0aCBhIGxvZyBtZXNzYWdlIHNvIHdlIGNhbiB0cmFjayBkb3duIHRoZSBwcm9ibGVtKS4KLSAgICAgICAgICAgIENoYXJTZXF1ZW5jZSBuYW1lID0gTWVkaWFSb3V0ZXJKZWxseWJlYW4uUm91dGVJbmZvLmdldE5hbWUocm91dGVPYmosIGdldENvbnRleHQoKSk7Ci0gICAgICAgICAgICByZXR1cm4gbmFtZSAhPSBudWxsID8gbmFtZS50b1N0cmluZygpIDogIiI7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvbkJ1aWxkU3lzdGVtUm91dGVEZXNjcmlwdG9yKFN5c3RlbVJvdXRlUmVjb3JkIHJlY29yZCwKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlRGVzY3JpcHRvci5CdWlsZGVyIGJ1aWxkZXIpIHsKLSAgICAgICAgICAgIGludCBzdXBwb3J0ZWRUeXBlcyA9IE1lZGlhUm91dGVySmVsbHliZWFuLlJvdXRlSW5mby5nZXRTdXBwb3J0ZWRUeXBlcygKLSAgICAgICAgICAgICAgICAgICAgcmVjb3JkLm1Sb3V0ZU9iaik7Ci0gICAgICAgICAgICBpZiAoKHN1cHBvcnRlZFR5cGVzICYgTWVkaWFSb3V0ZXJKZWxseWJlYW4uUk9VVEVfVFlQRV9MSVZFX0FVRElPKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5hZGRDb250cm9sRmlsdGVycyhMSVZFX0FVRElPX0NPTlRST0xfRklMVEVSUyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoKHN1cHBvcnRlZFR5cGVzICYgTWVkaWFSb3V0ZXJKZWxseWJlYW4uUk9VVEVfVFlQRV9MSVZFX1ZJREVPKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5hZGRDb250cm9sRmlsdGVycyhMSVZFX1ZJREVPX0NPTlRST0xfRklMVEVSUyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJ1aWxkZXIuc2V0UGxheWJhY2tUeXBlKAotICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5Sb3V0ZUluZm8uZ2V0UGxheWJhY2tUeXBlKHJlY29yZC5tUm91dGVPYmopKTsKLSAgICAgICAgICAgIGJ1aWxkZXIuc2V0UGxheWJhY2tTdHJlYW0oCi0gICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLlJvdXRlSW5mby5nZXRQbGF5YmFja1N0cmVhbShyZWNvcmQubVJvdXRlT2JqKSk7Ci0gICAgICAgICAgICBidWlsZGVyLnNldFZvbHVtZSgKLSAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uUm91dGVJbmZvLmdldFZvbHVtZShyZWNvcmQubVJvdXRlT2JqKSk7Ci0gICAgICAgICAgICBidWlsZGVyLnNldFZvbHVtZU1heCgKLSAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uUm91dGVJbmZvLmdldFZvbHVtZU1heChyZWNvcmQubVJvdXRlT2JqKSk7Ci0gICAgICAgICAgICBidWlsZGVyLnNldFZvbHVtZUhhbmRsaW5nKAotICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5Sb3V0ZUluZm8uZ2V0Vm9sdW1lSGFuZGxpbmcocmVjb3JkLm1Sb3V0ZU9iaikpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlVXNlclJvdXRlUHJvcGVydGllcyhVc2VyUm91dGVSZWNvcmQgcmVjb3JkKSB7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5Vc2VyUm91dGVJbmZvLnNldE5hbWUoCi0gICAgICAgICAgICAgICAgICAgIHJlY29yZC5tUm91dGVPYmosIHJlY29yZC5tUm91dGUuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLlVzZXJSb3V0ZUluZm8uc2V0UGxheWJhY2tUeXBlKAotICAgICAgICAgICAgICAgICAgICByZWNvcmQubVJvdXRlT2JqLCByZWNvcmQubVJvdXRlLmdldFBsYXliYWNrVHlwZSgpKTsKLSAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLlVzZXJSb3V0ZUluZm8uc2V0UGxheWJhY2tTdHJlYW0oCi0gICAgICAgICAgICAgICAgICAgIHJlY29yZC5tUm91dGVPYmosIHJlY29yZC5tUm91dGUuZ2V0UGxheWJhY2tTdHJlYW0oKSk7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5Vc2VyUm91dGVJbmZvLnNldFZvbHVtZSgKLSAgICAgICAgICAgICAgICAgICAgcmVjb3JkLm1Sb3V0ZU9iaiwgcmVjb3JkLm1Sb3V0ZS5nZXRWb2x1bWUoKSk7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5Vc2VyUm91dGVJbmZvLnNldFZvbHVtZU1heCgKLSAgICAgICAgICAgICAgICAgICAgcmVjb3JkLm1Sb3V0ZU9iaiwgcmVjb3JkLm1Sb3V0ZS5nZXRWb2x1bWVNYXgoKSk7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5Vc2VyUm91dGVJbmZvLnNldFZvbHVtZUhhbmRsaW5nKAotICAgICAgICAgICAgICAgICAgICByZWNvcmQubVJvdXRlT2JqLCByZWNvcmQubVJvdXRlLmdldFZvbHVtZUhhbmRsaW5nKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlQ2FsbGJhY2soKSB7Ci0gICAgICAgICAgICBpZiAobUNhbGxiYWNrUmVnaXN0ZXJlZCkgewotICAgICAgICAgICAgICAgIG1DYWxsYmFja1JlZ2lzdGVyZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5yZW1vdmVDYWxsYmFjayhtUm91dGVyT2JqLCBtQ2FsbGJhY2tPYmopOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobVJvdXRlVHlwZXMgIT0gMCkgewotICAgICAgICAgICAgICAgIG1DYWxsYmFja1JlZ2lzdGVyZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLmFkZENhbGxiYWNrKG1Sb3V0ZXJPYmosIG1Sb3V0ZVR5cGVzLCBtQ2FsbGJhY2tPYmopOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVDYWxsYmFja09iaigpIHsKLSAgICAgICAgICAgIHJldHVybiBNZWRpYVJvdXRlckplbGx5YmVhbi5jcmVhdGVDYWxsYmFjayh0aGlzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCBPYmplY3QgY3JlYXRlVm9sdW1lQ2FsbGJhY2tPYmooKSB7Ci0gICAgICAgICAgICByZXR1cm4gTWVkaWFSb3V0ZXJKZWxseWJlYW4uY3JlYXRlVm9sdW1lQ2FsbGJhY2sodGhpcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBzZWxlY3RSb3V0ZShPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgIGlmIChtU2VsZWN0Um91dGVXb3JrYXJvdW5kID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtU2VsZWN0Um91dGVXb3JrYXJvdW5kID0gbmV3IE1lZGlhUm91dGVySmVsbHliZWFuLlNlbGVjdFJvdXRlV29ya2Fyb3VuZCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVNlbGVjdFJvdXRlV29ya2Fyb3VuZC5zZWxlY3RSb3V0ZShtUm91dGVyT2JqLAotICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5BTExfUk9VVEVfVFlQRVMsIHJvdXRlT2JqKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgT2JqZWN0IGdldERlZmF1bHRSb3V0ZSgpIHsKLSAgICAgICAgICAgIGlmIChtR2V0RGVmYXVsdFJvdXRlV29ya2Fyb3VuZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUdldERlZmF1bHRSb3V0ZVdvcmthcm91bmQgPSBuZXcgTWVkaWFSb3V0ZXJKZWxseWJlYW4uR2V0RGVmYXVsdFJvdXRlV29ya2Fyb3VuZCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG1HZXREZWZhdWx0Um91dGVXb3JrYXJvdW5kLmdldERlZmF1bHRSb3V0ZShtUm91dGVyT2JqKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgT2JqZWN0IGdldFN5c3RlbVJvdXRlKE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICAgICAgaWYgKHJvdXRlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludCBpbmRleCA9IGZpbmRTeXN0ZW1Sb3V0ZVJlY29yZEJ5RGVzY3JpcHRvcklkKHJvdXRlLmdldERlc2NyaXB0b3JJZCgpKTsKLSAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1TeXN0ZW1Sb3V0ZVJlY29yZHMuZ2V0KGluZGV4KS5tUm91dGVPYmo7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXByZXNlbnRzIGEgcm91dGUgdGhhdCBpcyBwcm92aWRlZCBieSB0aGUgZnJhbWV3b3JrIG1lZGlhIHJvdXRlcgotICAgICAgICAgKiBhbmQgcHVibGlzaGVkIGJ5IHRoaXMgcm91dGUgcHJvdmlkZXIgdG8gdGhlIHN1cHBvcnQgbGlicmFyeSBtZWRpYSByb3V0ZXIuCi0gICAgICAgICAqLwotICAgICAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGNsYXNzIFN5c3RlbVJvdXRlUmVjb3JkIHsKLSAgICAgICAgICAgIHB1YmxpYyBmaW5hbCBPYmplY3QgbVJvdXRlT2JqOwotICAgICAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZyBtUm91dGVEZXNjcmlwdG9ySWQ7Ci0gICAgICAgICAgICBwdWJsaWMgTWVkaWFSb3V0ZURlc2NyaXB0b3IgbVJvdXRlRGVzY3JpcHRvcjsgLy8gYXNzaWduZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgY3JlYXRpb24KLQotICAgICAgICAgICAgcHVibGljIFN5c3RlbVJvdXRlUmVjb3JkKE9iamVjdCByb3V0ZU9iaiwgU3RyaW5nIGlkKSB7Ci0gICAgICAgICAgICAgICAgbVJvdXRlT2JqID0gcm91dGVPYmo7Ci0gICAgICAgICAgICAgICAgbVJvdXRlRGVzY3JpcHRvcklkID0gaWQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmVwcmVzZW50cyBhIHJvdXRlIHRoYXQgaXMgcHJvdmlkZWQgYnkgdGhlIHN1cHBvcnQgbGlicmFyeSBtZWRpYSByb3V0ZXIKLSAgICAgICAgICogYW5kIHB1Ymxpc2hlZCBieSB0aGlzIHJvdXRlIHByb3ZpZGVyIHRvIHRoZSBmcmFtZXdvcmsgbWVkaWEgcm91dGVyLgotICAgICAgICAgKi8KLSAgICAgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBjbGFzcyBVc2VyUm91dGVSZWNvcmQgewotICAgICAgICAgICAgcHVibGljIGZpbmFsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyBtUm91dGU7Ci0gICAgICAgICAgICBwdWJsaWMgZmluYWwgT2JqZWN0IG1Sb3V0ZU9iajsKLQotICAgICAgICAgICAgcHVibGljIFVzZXJSb3V0ZVJlY29yZChNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUsIE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgICAgIG1Sb3V0ZSA9IHJvdXRlOwotICAgICAgICAgICAgICAgIG1Sb3V0ZU9iaiA9IHJvdXRlT2JqOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBjbGFzcyBTeXN0ZW1Sb3V0ZUNvbnRyb2xsZXIgZXh0ZW5kcyBSb3V0ZUNvbnRyb2xsZXIgewotICAgICAgICAgICAgcHJpdmF0ZSBmaW5hbCBPYmplY3QgbVJvdXRlT2JqOwotCi0gICAgICAgICAgICBwdWJsaWMgU3lzdGVtUm91dGVDb250cm9sbGVyKE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgICAgIG1Sb3V0ZU9iaiA9IHJvdXRlT2JqOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uU2V0Vm9sdW1lKGludCB2b2x1bWUpIHsKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5Sb3V0ZUluZm8ucmVxdWVzdFNldFZvbHVtZShtUm91dGVPYmosIHZvbHVtZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25VcGRhdGVWb2x1bWUoaW50IGRlbHRhKSB7Ci0gICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uUm91dGVJbmZvLnJlcXVlc3RVcGRhdGVWb2x1bWUobVJvdXRlT2JqLCBkZWx0YSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBKZWxseWJlYW4gTVIxIGltcGxlbWVudGF0aW9uLgotICAgICAqLwotICAgIC8vIEBAUmVxdWlyZXNBcGkoMTcpCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSmVsbHliZWFuTXIxSW1wbCBleHRlbmRzIEplbGx5YmVhbkltcGwKLSAgICAgICAgICAgIGltcGxlbWVudHMgTWVkaWFSb3V0ZXJKZWxseWJlYW5NcjEuQ2FsbGJhY2sgewotICAgICAgICBwcml2YXRlIE1lZGlhUm91dGVySmVsbHliZWFuTXIxLkFjdGl2ZVNjYW5Xb3JrYXJvdW5kIG1BY3RpdmVTY2FuV29ya2Fyb3VuZDsKLSAgICAgICAgcHJpdmF0ZSBNZWRpYVJvdXRlckplbGx5YmVhbk1yMS5Jc0Nvbm5lY3RpbmdXb3JrYXJvdW5kIG1Jc0Nvbm5lY3RpbmdXb3JrYXJvdW5kOwotCi0gICAgICAgIHB1YmxpYyBKZWxseWJlYW5NcjFJbXBsKENvbnRleHQgY29udGV4dCwgU3luY0NhbGxiYWNrIHN5bmNDYWxsYmFjaykgewotICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgc3luY0NhbGxiYWNrKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlUHJlc2VudGF0aW9uRGlzcGxheUNoYW5nZWQoT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICBpbnQgaW5kZXggPSBmaW5kU3lzdGVtUm91dGVSZWNvcmQocm91dGVPYmopOwotICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW1Sb3V0ZVJlY29yZCByZWNvcmQgPSBtU3lzdGVtUm91dGVSZWNvcmRzLmdldChpbmRleCk7Ci0gICAgICAgICAgICAgICAgRGlzcGxheSBuZXdQcmVzZW50YXRpb25EaXNwbGF5ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuTXIxLlJvdXRlSW5mby5nZXRQcmVzZW50YXRpb25EaXNwbGF5KHJvdXRlT2JqKTsKLSAgICAgICAgICAgICAgICBpbnQgbmV3UHJlc2VudGF0aW9uRGlzcGxheUlkID0gKG5ld1ByZXNlbnRhdGlvbkRpc3BsYXkgIT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAgICAgPyBuZXdQcmVzZW50YXRpb25EaXNwbGF5LmdldERpc3BsYXlJZCgpIDogLTEpOwotICAgICAgICAgICAgICAgIGlmIChuZXdQcmVzZW50YXRpb25EaXNwbGF5SWQKLSAgICAgICAgICAgICAgICAgICAgICAgICE9IHJlY29yZC5tUm91dGVEZXNjcmlwdG9yLmdldFByZXNlbnRhdGlvbkRpc3BsYXlJZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlY29yZC5tUm91dGVEZXNjcmlwdG9yID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTWVkaWFSb3V0ZURlc2NyaXB0b3IuQnVpbGRlcihyZWNvcmQubVJvdXRlRGVzY3JpcHRvcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0UHJlc2VudGF0aW9uRGlzcGxheUlkKG5ld1ByZXNlbnRhdGlvbkRpc3BsYXlJZCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKLSAgICAgICAgICAgICAgICAgICAgcHVibGlzaFJvdXRlcygpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvbkJ1aWxkU3lzdGVtUm91dGVEZXNjcmlwdG9yKFN5c3RlbVJvdXRlUmVjb3JkIHJlY29yZCwKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlRGVzY3JpcHRvci5CdWlsZGVyIGJ1aWxkZXIpIHsKLSAgICAgICAgICAgIHN1cGVyLm9uQnVpbGRTeXN0ZW1Sb3V0ZURlc2NyaXB0b3IocmVjb3JkLCBidWlsZGVyKTsKLQotICAgICAgICAgICAgaWYgKCFNZWRpYVJvdXRlckplbGx5YmVhbk1yMS5Sb3V0ZUluZm8uaXNFbmFibGVkKHJlY29yZC5tUm91dGVPYmopKSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGlzQ29ubmVjdGluZyhyZWNvcmQpKSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5zZXRDb25uZWN0aW5nKHRydWUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBEaXNwbGF5IHByZXNlbnRhdGlvbkRpc3BsYXkgPQotICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbk1yMS5Sb3V0ZUluZm8uZ2V0UHJlc2VudGF0aW9uRGlzcGxheShyZWNvcmQubVJvdXRlT2JqKTsKLSAgICAgICAgICAgIGlmIChwcmVzZW50YXRpb25EaXNwbGF5ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyLnNldFByZXNlbnRhdGlvbkRpc3BsYXlJZChwcmVzZW50YXRpb25EaXNwbGF5LmdldERpc3BsYXlJZCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVDYWxsYmFjaygpIHsKLSAgICAgICAgICAgIHN1cGVyLnVwZGF0ZUNhbGxiYWNrKCk7Ci0KLSAgICAgICAgICAgIGlmIChtQWN0aXZlU2Nhbldvcmthcm91bmQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1BY3RpdmVTY2FuV29ya2Fyb3VuZCA9IG5ldyBNZWRpYVJvdXRlckplbGx5YmVhbk1yMS5BY3RpdmVTY2FuV29ya2Fyb3VuZCgKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldENvbnRleHQoKSwgZ2V0SGFuZGxlcigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1BY3RpdmVTY2FuV29ya2Fyb3VuZC5zZXRBY3RpdmVTY2FuUm91dGVUeXBlcyhtQWN0aXZlU2NhbiA/IG1Sb3V0ZVR5cGVzIDogMCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVDYWxsYmFja09iaigpIHsKLSAgICAgICAgICAgIHJldHVybiBNZWRpYVJvdXRlckplbGx5YmVhbk1yMS5jcmVhdGVDYWxsYmFjayh0aGlzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCBib29sZWFuIGlzQ29ubmVjdGluZyhTeXN0ZW1Sb3V0ZVJlY29yZCByZWNvcmQpIHsKLSAgICAgICAgICAgIGlmIChtSXNDb25uZWN0aW5nV29ya2Fyb3VuZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUlzQ29ubmVjdGluZ1dvcmthcm91bmQgPSBuZXcgTWVkaWFSb3V0ZXJKZWxseWJlYW5NcjEuSXNDb25uZWN0aW5nV29ya2Fyb3VuZCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG1Jc0Nvbm5lY3RpbmdXb3JrYXJvdW5kLmlzQ29ubmVjdGluZyhyZWNvcmQubVJvdXRlT2JqKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEplbGx5YmVhbiBNUjIgaW1wbGVtZW50YXRpb24uCi0gICAgICovCi0gICAgLy8gQEBSZXF1aXJlc0FwaSgxOCkKLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBKZWxseWJlYW5NcjJJbXBsIGV4dGVuZHMgSmVsbHliZWFuTXIxSW1wbCB7Ci0gICAgICAgIHB1YmxpYyBKZWxseWJlYW5NcjJJbXBsKENvbnRleHQgY29udGV4dCwgU3luY0NhbGxiYWNrIHN5bmNDYWxsYmFjaykgewotICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgc3luY0NhbGxiYWNrKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvbkJ1aWxkU3lzdGVtUm91dGVEZXNjcmlwdG9yKFN5c3RlbVJvdXRlUmVjb3JkIHJlY29yZCwKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlRGVzY3JpcHRvci5CdWlsZGVyIGJ1aWxkZXIpIHsKLSAgICAgICAgICAgIHN1cGVyLm9uQnVpbGRTeXN0ZW1Sb3V0ZURlc2NyaXB0b3IocmVjb3JkLCBidWlsZGVyKTsKLQotICAgICAgICAgICAgQ2hhclNlcXVlbmNlIGRlc2NyaXB0aW9uID0KLSAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW5NcjIuUm91dGVJbmZvLmdldERlc2NyaXB0aW9uKHJlY29yZC5tUm91dGVPYmopOwotICAgICAgICAgICAgaWYgKGRlc2NyaXB0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyLnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIHNlbGVjdFJvdXRlKE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uc2VsZWN0Um91dGUobVJvdXRlck9iaiwKLSAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uQUxMX1JPVVRFX1RZUEVTLCByb3V0ZU9iaik7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIE9iamVjdCBnZXREZWZhdWx0Um91dGUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gTWVkaWFSb3V0ZXJKZWxseWJlYW5NcjIuZ2V0RGVmYXVsdFJvdXRlKG1Sb3V0ZXJPYmopOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIHVwZGF0ZVVzZXJSb3V0ZVByb3BlcnRpZXMoVXNlclJvdXRlUmVjb3JkIHJlY29yZCkgewotICAgICAgICAgICAgc3VwZXIudXBkYXRlVXNlclJvdXRlUHJvcGVydGllcyhyZWNvcmQpOwotCi0gICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbk1yMi5Vc2VyUm91dGVJbmZvLnNldERlc2NyaXB0aW9uKAotICAgICAgICAgICAgICAgICAgICByZWNvcmQubVJvdXRlT2JqLCByZWNvcmQubVJvdXRlLmdldERlc2NyaXB0aW9uKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIHVwZGF0ZUNhbGxiYWNrKCkgewotICAgICAgICAgICAgaWYgKG1DYWxsYmFja1JlZ2lzdGVyZWQpIHsKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5yZW1vdmVDYWxsYmFjayhtUm91dGVyT2JqLCBtQ2FsbGJhY2tPYmopOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtQ2FsbGJhY2tSZWdpc3RlcmVkID0gdHJ1ZTsKLSAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuTXIyLmFkZENhbGxiYWNrKG1Sb3V0ZXJPYmosIG1Sb3V0ZVR5cGVzLCBtQ2FsbGJhY2tPYmosCi0gICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVyLkNBTExCQUNLX0ZMQUdfVU5GSUxURVJFRF9FVkVOVFMKLSAgICAgICAgICAgICAgICAgICAgfCAobUFjdGl2ZVNjYW4gPyBNZWRpYVJvdXRlci5DQUxMQkFDS19GTEFHX1BFUkZPUk1fQUNUSVZFX1NDQU4gOiAwKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNDb25uZWN0aW5nKFN5c3RlbVJvdXRlUmVjb3JkIHJlY29yZCkgewotICAgICAgICAgICAgcmV0dXJuIE1lZGlhUm91dGVySmVsbHliZWFuTXIyLlJvdXRlSW5mby5pc0Nvbm5lY3RpbmcocmVjb3JkLm1Sb3V0ZU9iaik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBcGkyNCBpbXBsZW1lbnRhdGlvbi4KLSAgICAgKi8KLSAgICAvLyBAQFJlcXVpcmVzQXBpKDI0KQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEFwaTI0SW1wbCBleHRlbmRzIEplbGx5YmVhbk1yMkltcGwgewotICAgICAgICBwdWJsaWMgQXBpMjRJbXBsKENvbnRleHQgY29udGV4dCwgU3luY0NhbGxiYWNrIHN5bmNDYWxsYmFjaykgewotICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgc3luY0NhbGxiYWNrKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvbkJ1aWxkU3lzdGVtUm91dGVEZXNjcmlwdG9yKFN5c3RlbVJvdXRlUmVjb3JkIHJlY29yZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlRGVzY3JpcHRvci5CdWlsZGVyIGJ1aWxkZXIpIHsKLSAgICAgICAgICAgIHN1cGVyLm9uQnVpbGRTeXN0ZW1Sb3V0ZURlc2NyaXB0b3IocmVjb3JkLCBidWlsZGVyKTsKLQotICAgICAgICAgICAgYnVpbGRlci5zZXREZXZpY2VUeXBlKE1lZGlhUm91dGVyQXBpMjQuUm91dGVJbmZvLmdldERldmljZVR5cGUocmVjb3JkLm1Sb3V0ZU9iaikpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL3BhY2thZ2UuaHRtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlMmFhZjIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPGh0bWw+Ci0KLTxib2R5PgotCi08cD5Db250YWlucyBBUElzIHRoYXQgY29udHJvbCB0aGUgcm91dGluZyBvZiBtZWRpYSBjaGFubmVscyBhbmQgc3RyZWFtcyBmcm9tIHRoZSBjdXJyZW50IGRldmljZQotICB0byBleHRlcm5hbCBzcGVha2VycyBhbmQgZGVzdGluYXRpb24gZGV2aWNlcy48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvd2lkZ2V0L0Jhc2VMYXlvdXQuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvd2lkZ2V0L0Jhc2VMYXlvdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmI2NDcxZC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3dpZGdldC9CYXNlTGF5b3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC53aWRnZXQ7Ci0KLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLlZpZXdHcm91cFByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwLkxheW91dFBhcmFtczsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwLk1hcmdpbkxheW91dFBhcmFtczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBCYXNlTGF5b3V0IGV4dGVuZHMgVmlld0dyb3VwSW1wbCB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBWaWV3R3JvdXAgbUluc3RhbmNlOwotICAgIHByaXZhdGUgZmluYWwgVmlld0dyb3VwUHJvdmlkZXIgbVN1cGVyUHJvdmlkZXI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBWaWV3R3JvdXBQcm92aWRlciBtUHJpdmF0ZVByb3ZpZGVyOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8Vmlldz4gbU1hdGNoUGFyZW50Q2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0PD4oMSk7Ci0KLSAgICBwdWJsaWMgQmFzZUxheW91dChWaWV3R3JvdXAgaW5zdGFuY2UsCi0gICAgICAgICAgICBWaWV3R3JvdXBQcm92aWRlciBzdXBlclByb3ZpZGVyLCBWaWV3R3JvdXBQcm92aWRlciBwcml2YXRlUHJvdmlkZXIpIHsKLSAgICAgICAgc3VwZXIoaW5zdGFuY2UsIHN1cGVyUHJvdmlkZXIsIHByaXZhdGVQcm92aWRlcik7Ci0gICAgICAgIG1JbnN0YW5jZSA9IGluc3RhbmNlOwotICAgICAgICBtU3VwZXJQcm92aWRlciA9IHN1cGVyUHJvdmlkZXI7Ci0gICAgICAgIG1Qcml2YXRlUHJvdmlkZXIgPSBwcml2YXRlUHJvdmlkZXI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gY2hlY2tMYXlvdXRQYXJhbXNfaW1wbChMYXlvdXRQYXJhbXMgcCkgewotICAgICAgICByZXR1cm4gcCBpbnN0YW5jZW9mIE1hcmdpbkxheW91dFBhcmFtczsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTGF5b3V0UGFyYW1zIGdlbmVyYXRlRGVmYXVsdExheW91dFBhcmFtc19pbXBsKCkgewotICAgICAgICByZXR1cm4gbmV3IE1hcmdpbkxheW91dFBhcmFtcyhMYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5ULCBMYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTGF5b3V0UGFyYW1zIGdlbmVyYXRlTGF5b3V0UGFyYW1zX2ltcGwoQXR0cmlidXRlU2V0IGF0dHJzKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTWFyZ2luTGF5b3V0UGFyYW1zKG1JbnN0YW5jZS5nZXRDb250ZXh0KCksIGF0dHJzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTGF5b3V0UGFyYW1zIGdlbmVyYXRlTGF5b3V0UGFyYW1zX2ltcGwoTGF5b3V0UGFyYW1zIGxwKSB7Ci0gICAgICAgIGlmIChscCBpbnN0YW5jZW9mIE1hcmdpbkxheW91dFBhcmFtcykgewotICAgICAgICAgICAgcmV0dXJuIGxwOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgTWFyZ2luTGF5b3V0UGFyYW1zKGxwKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbk1lYXN1cmVfaW1wbChpbnQgd2lkdGhNZWFzdXJlU3BlYywgaW50IGhlaWdodE1lYXN1cmVTcGVjKSB7Ci0gICAgICAgIGludCBjb3VudCA9IG1JbnN0YW5jZS5nZXRDaGlsZENvdW50KCk7Ci0KLSAgICAgICAgZmluYWwgYm9vbGVhbiBtZWFzdXJlTWF0Y2hQYXJlbnRDaGlsZHJlbiA9Ci0gICAgICAgICAgICAgICAgVmlldy5NZWFzdXJlU3BlYy5nZXRNb2RlKHdpZHRoTWVhc3VyZVNwZWMpICE9IFZpZXcuTWVhc3VyZVNwZWMuRVhBQ1RMWSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgVmlldy5NZWFzdXJlU3BlYy5nZXRNb2RlKGhlaWdodE1lYXN1cmVTcGVjKSAhPSBWaWV3Lk1lYXN1cmVTcGVjLkVYQUNUTFk7Ci0gICAgICAgIG1NYXRjaFBhcmVudENoaWxkcmVuLmNsZWFyKCk7Ci0KLSAgICAgICAgaW50IG1heEhlaWdodCA9IDA7Ci0gICAgICAgIGludCBtYXhXaWR0aCA9IDA7Ci0gICAgICAgIGludCBjaGlsZFN0YXRlID0gMDsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgIGZpbmFsIFZpZXcgY2hpbGQgPSBtSW5zdGFuY2UuZ2V0Q2hpbGRBdChpKTsKLSAgICAgICAgICAgIGlmIChjaGlsZC5nZXRWaXNpYmlsaXR5KCkgIT0gVmlldy5HT05FKSB7Ci0gICAgICAgICAgICAgICAgbVByaXZhdGVQcm92aWRlci5tZWFzdXJlQ2hpbGRXaXRoTWFyZ2luc19pbXBsKAotICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQsIHdpZHRoTWVhc3VyZVNwZWMsIDAsIGhlaWdodE1lYXN1cmVTcGVjLCAwKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBNYXJnaW5MYXlvdXRQYXJhbXMgbHAgPSAoTWFyZ2luTGF5b3V0UGFyYW1zKSBjaGlsZC5nZXRMYXlvdXRQYXJhbXMoKTsKLSAgICAgICAgICAgICAgICBtYXhXaWR0aCA9IE1hdGgubWF4KG1heFdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuZ2V0TWVhc3VyZWRXaWR0aCgpICsgbHAubGVmdE1hcmdpbiArIGxwLnJpZ2h0TWFyZ2luKTsKLSAgICAgICAgICAgICAgICBtYXhIZWlnaHQgPSBNYXRoLm1heChtYXhIZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5nZXRNZWFzdXJlZEhlaWdodCgpICsgbHAudG9wTWFyZ2luICsgbHAuYm90dG9tTWFyZ2luKTsKLSAgICAgICAgICAgICAgICBjaGlsZFN0YXRlID0gY2hpbGRTdGF0ZSB8IGNoaWxkLmdldE1lYXN1cmVkU3RhdGUoKTsKLSAgICAgICAgICAgICAgICBpZiAobWVhc3VyZU1hdGNoUGFyZW50Q2hpbGRyZW4pIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxwLndpZHRoID09IExheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBscC5oZWlnaHQgPT0gTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbU1hdGNoUGFyZW50Q2hpbGRyZW4uYWRkKGNoaWxkKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIEFjY291bnQgZm9yIHBhZGRpbmcgdG9vCi0gICAgICAgIG1heFdpZHRoICs9IGdldFBhZGRpbmdMZWZ0V2l0aEZvcmVncm91bmQoKSArIGdldFBhZGRpbmdSaWdodFdpdGhGb3JlZ3JvdW5kKCk7Ci0gICAgICAgIG1heEhlaWdodCArPSBnZXRQYWRkaW5nVG9wV2l0aEZvcmVncm91bmQoKSArIGdldFBhZGRpbmdCb3R0b21XaXRoRm9yZWdyb3VuZCgpOwotCi0gICAgICAgIC8vIENoZWNrIGFnYWluc3Qgb3VyIG1pbmltdW0gaGVpZ2h0IGFuZCB3aWR0aAotICAgICAgICBtYXhIZWlnaHQgPSBNYXRoLm1heChtYXhIZWlnaHQsIG1Qcml2YXRlUHJvdmlkZXIuZ2V0U3VnZ2VzdGVkTWluaW11bUhlaWdodF9pbXBsKCkpOwotICAgICAgICBtYXhXaWR0aCA9IE1hdGgubWF4KG1heFdpZHRoLCBtUHJpdmF0ZVByb3ZpZGVyLmdldFN1Z2dlc3RlZE1pbmltdW1XaWR0aF9pbXBsKCkpOwotCi0gICAgICAgIC8vIENoZWNrIGFnYWluc3Qgb3VyIGZvcmVncm91bmQncyBtaW5pbXVtIGhlaWdodCBhbmQgd2lkdGgKLSAgICAgICAgZmluYWwgRHJhd2FibGUgZHJhd2FibGUgPSBtSW5zdGFuY2UuZ2V0Rm9yZWdyb3VuZCgpOwotICAgICAgICBpZiAoZHJhd2FibGUgIT0gbnVsbCkgewotICAgICAgICAgICAgbWF4SGVpZ2h0ID0gTWF0aC5tYXgobWF4SGVpZ2h0LCBkcmF3YWJsZS5nZXRNaW5pbXVtSGVpZ2h0KCkpOwotICAgICAgICAgICAgbWF4V2lkdGggPSBNYXRoLm1heChtYXhXaWR0aCwgZHJhd2FibGUuZ2V0TWluaW11bVdpZHRoKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgbVByaXZhdGVQcm92aWRlci5zZXRNZWFzdXJlZERpbWVuc2lvbl9pbXBsKAotICAgICAgICAgICAgICAgIG1JbnN0YW5jZS5yZXNvbHZlU2l6ZUFuZFN0YXRlKG1heFdpZHRoLCB3aWR0aE1lYXN1cmVTcGVjLCBjaGlsZFN0YXRlKSwKLSAgICAgICAgICAgICAgICBtSW5zdGFuY2UucmVzb2x2ZVNpemVBbmRTdGF0ZShtYXhIZWlnaHQsIGhlaWdodE1lYXN1cmVTcGVjLAotICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRTdGF0ZSA8PCBWaWV3Lk1FQVNVUkVEX0hFSUdIVF9TVEFURV9TSElGVCkpOwotCi0gICAgICAgIGNvdW50ID0gbU1hdGNoUGFyZW50Q2hpbGRyZW4uc2l6ZSgpOwotICAgICAgICBpZiAoY291bnQgPiAxKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBWaWV3IGNoaWxkID0gbU1hdGNoUGFyZW50Q2hpbGRyZW4uZ2V0KGkpOwotICAgICAgICAgICAgICAgIGZpbmFsIE1hcmdpbkxheW91dFBhcmFtcyBscCA9IChNYXJnaW5MYXlvdXRQYXJhbXMpIGNoaWxkLmdldExheW91dFBhcmFtcygpOwotCi0gICAgICAgICAgICAgICAgZmluYWwgaW50IGNoaWxkV2lkdGhNZWFzdXJlU3BlYzsKLSAgICAgICAgICAgICAgICBpZiAobHAud2lkdGggPT0gTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCkgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgd2lkdGggPSBNYXRoLm1heCgwLCBtSW5zdGFuY2UuZ2V0TWVhc3VyZWRXaWR0aCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBnZXRQYWRkaW5nTGVmdFdpdGhGb3JlZ3JvdW5kKCkgLSBnZXRQYWRkaW5nUmlnaHRXaXRoRm9yZWdyb3VuZCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBscC5sZWZ0TWFyZ2luIC0gbHAucmlnaHRNYXJnaW4pOwotICAgICAgICAgICAgICAgICAgICBjaGlsZFdpZHRoTWVhc3VyZVNwZWMgPSBWaWV3Lk1lYXN1cmVTcGVjLm1ha2VNZWFzdXJlU3BlYygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwgVmlldy5NZWFzdXJlU3BlYy5FWEFDVExZKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBjaGlsZFdpZHRoTWVhc3VyZVNwZWMgPSBtSW5zdGFuY2UuZ2V0Q2hpbGRNZWFzdXJlU3BlYyh3aWR0aE1lYXN1cmVTcGVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFBhZGRpbmdMZWZ0V2l0aEZvcmVncm91bmQoKSArIGdldFBhZGRpbmdSaWdodFdpdGhGb3JlZ3JvdW5kKCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHAubGVmdE1hcmdpbiArIGxwLnJpZ2h0TWFyZ2luLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwLndpZHRoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgY2hpbGRIZWlnaHRNZWFzdXJlU3BlYzsKLSAgICAgICAgICAgICAgICBpZiAobHAuaGVpZ2h0ID09IExheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQpIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGhlaWdodCA9IE1hdGgubWF4KDAsIG1JbnN0YW5jZS5nZXRNZWFzdXJlZEhlaWdodCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBnZXRQYWRkaW5nVG9wV2l0aEZvcmVncm91bmQoKSAtIGdldFBhZGRpbmdCb3R0b21XaXRoRm9yZWdyb3VuZCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBscC50b3BNYXJnaW4gLSBscC5ib3R0b21NYXJnaW4pOwotICAgICAgICAgICAgICAgICAgICBjaGlsZEhlaWdodE1lYXN1cmVTcGVjID0gVmlldy5NZWFzdXJlU3BlYy5tYWtlTWVhc3VyZVNwZWMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0LCBWaWV3Lk1lYXN1cmVTcGVjLkVYQUNUTFkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGNoaWxkSGVpZ2h0TWVhc3VyZVNwZWMgPSBtSW5zdGFuY2UuZ2V0Q2hpbGRNZWFzdXJlU3BlYyhoZWlnaHRNZWFzdXJlU3BlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRQYWRkaW5nVG9wV2l0aEZvcmVncm91bmQoKSArIGdldFBhZGRpbmdCb3R0b21XaXRoRm9yZWdyb3VuZCgpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwLnRvcE1hcmdpbiArIGxwLmJvdHRvbU1hcmdpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBscC5oZWlnaHQpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGNoaWxkLm1lYXN1cmUoY2hpbGRXaWR0aE1lYXN1cmVTcGVjLCBjaGlsZEhlaWdodE1lYXN1cmVTcGVjKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uTGF5b3V0X2ltcGwoYm9vbGVhbiBjaGFuZ2VkLCBpbnQgbGVmdCwgaW50IHRvcCwgaW50IHJpZ2h0LCBpbnQgYm90dG9tKSB7Ci0gICAgICAgIGZpbmFsIGludCBjb3VudCA9IG1JbnN0YW5jZS5nZXRDaGlsZENvdW50KCk7Ci0KLSAgICAgICAgZmluYWwgaW50IHBhcmVudExlZnQgPSBnZXRQYWRkaW5nTGVmdFdpdGhGb3JlZ3JvdW5kKCk7Ci0gICAgICAgIGZpbmFsIGludCBwYXJlbnRSaWdodCA9IHJpZ2h0IC0gbGVmdCAtIGdldFBhZGRpbmdSaWdodFdpdGhGb3JlZ3JvdW5kKCk7Ci0KLSAgICAgICAgZmluYWwgaW50IHBhcmVudFRvcCA9IGdldFBhZGRpbmdUb3BXaXRoRm9yZWdyb3VuZCgpOwotICAgICAgICBmaW5hbCBpbnQgcGFyZW50Qm90dG9tID0gYm90dG9tIC0gdG9wIC0gZ2V0UGFkZGluZ0JvdHRvbVdpdGhGb3JlZ3JvdW5kKCk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBmaW5hbCBWaWV3IGNoaWxkID0gbUluc3RhbmNlLmdldENoaWxkQXQoaSk7Ci0gICAgICAgICAgICBpZiAoY2hpbGQuZ2V0VmlzaWJpbGl0eSgpICE9IFZpZXcuR09ORSkgewotICAgICAgICAgICAgICAgIGZpbmFsIE1hcmdpbkxheW91dFBhcmFtcyBscCA9IChNYXJnaW5MYXlvdXRQYXJhbXMpIGNoaWxkLmdldExheW91dFBhcmFtcygpOwotCi0gICAgICAgICAgICAgICAgZmluYWwgaW50IHdpZHRoID0gY2hpbGQuZ2V0TWVhc3VyZWRXaWR0aCgpOwotICAgICAgICAgICAgICAgIGZpbmFsIGludCBoZWlnaHQgPSBjaGlsZC5nZXRNZWFzdXJlZEhlaWdodCgpOwotCi0gICAgICAgICAgICAgICAgaW50IGNoaWxkTGVmdDsKLSAgICAgICAgICAgICAgICBpbnQgY2hpbGRUb3A7Ci0KLSAgICAgICAgICAgICAgICBjaGlsZExlZnQgPSBwYXJlbnRMZWZ0ICsgKHBhcmVudFJpZ2h0IC0gcGFyZW50TGVmdCAtIHdpZHRoKSAvIDIgKwotICAgICAgICAgICAgICAgICAgICAgICAgbHAubGVmdE1hcmdpbiAtIGxwLnJpZ2h0TWFyZ2luOwotCi0gICAgICAgICAgICAgICAgY2hpbGRUb3AgPSBwYXJlbnRUb3AgKyAocGFyZW50Qm90dG9tIC0gcGFyZW50VG9wIC0gaGVpZ2h0KSAvIDIgKwotICAgICAgICAgICAgICAgICAgICAgICAgbHAudG9wTWFyZ2luIC0gbHAuYm90dG9tTWFyZ2luOwotCi0gICAgICAgICAgICAgICAgY2hpbGQubGF5b3V0KGNoaWxkTGVmdCwgY2hpbGRUb3AsIGNoaWxkTGVmdCArIHdpZHRoLCBjaGlsZFRvcCArIGhlaWdodCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBzaG91bGREZWxheUNoaWxkUHJlc3NlZFN0YXRlX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGludCBnZXRQYWRkaW5nTGVmdFdpdGhGb3JlZ3JvdW5kKCkgewotICAgICAgICByZXR1cm4gbUluc3RhbmNlLmlzRm9yZWdyb3VuZEluc2lkZVBhZGRpbmcoKSA/IE1hdGgubWF4KG1JbnN0YW5jZS5nZXRQYWRkaW5nTGVmdCgpLCAwKSA6Ci0gICAgICAgICAgICAgICAgbUluc3RhbmNlLmdldFBhZGRpbmdMZWZ0KCkgKyAwOwotICAgIH0KLQotICAgIHByaXZhdGUgaW50IGdldFBhZGRpbmdSaWdodFdpdGhGb3JlZ3JvdW5kKCkgewotICAgICAgICByZXR1cm4gbUluc3RhbmNlLmlzRm9yZWdyb3VuZEluc2lkZVBhZGRpbmcoKSA/IE1hdGgubWF4KG1JbnN0YW5jZS5nZXRQYWRkaW5nUmlnaHQoKSwgMCkgOgotICAgICAgICAgICAgICAgIG1JbnN0YW5jZS5nZXRQYWRkaW5nUmlnaHQoKSArIDA7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgZ2V0UGFkZGluZ1RvcFdpdGhGb3JlZ3JvdW5kKCkgewotICAgICAgICByZXR1cm4gbUluc3RhbmNlLmlzRm9yZWdyb3VuZEluc2lkZVBhZGRpbmcoKSA/IE1hdGgubWF4KG1JbnN0YW5jZS5nZXRQYWRkaW5nVG9wKCksIDApIDoKLSAgICAgICAgICAgICAgICBtSW5zdGFuY2UuZ2V0UGFkZGluZ1RvcCgpICsgMDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGludCBnZXRQYWRkaW5nQm90dG9tV2l0aEZvcmVncm91bmQoKSB7Ci0gICAgICAgIHJldHVybiBtSW5zdGFuY2UuaXNGb3JlZ3JvdW5kSW5zaWRlUGFkZGluZygpID8gTWF0aC5tYXgobUluc3RhbmNlLmdldFBhZGRpbmdCb3R0b20oKSwgMCkgOgotICAgICAgICAgICAgICAgIG1JbnN0YW5jZS5nZXRQYWRkaW5nQm90dG9tKCkgKyAwOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvd2lkZ2V0L01lZGlhQ29udHJvbFZpZXcySW1wbC5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC93aWRnZXQvTWVkaWFDb250cm9sVmlldzJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhZmYxNTAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC93aWRnZXQvTWVkaWFDb250cm9sVmlldzJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQud2lkZ2V0OwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTWV0YWRhdGE7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5zZXNzaW9uLk1lZGlhQ29udHJvbGxlcjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnNlc3Npb24uUGxheWJhY2tTdGF0ZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlNlc3Npb25Ub2tlbjI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuTWVkaWFDb250cm9sVmlldzJQcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5WaWV3R3JvdXBQcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5OdWxsYWJsZTsKLWltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LkdyYXZpdHk7Ci1pbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXc7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuQmFzZUFkYXB0ZXI7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuQnV0dG9uOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkltYWdlQnV0dG9uOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldzsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5MaW5lYXJMYXlvdXQ7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdFZpZXc7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuTWVkaWFDb250cm9sVmlldzI7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuUHJvZ3Jlc3NCYXI7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuUG9wdXBXaW5kb3c7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuUmVsYXRpdmVMYXlvdXQ7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuU2Vla0JhcjsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5TZWVrQmFyLk9uU2Vla0JhckNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OwotCi1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEudXBkYXRlLkFwaUhlbHBlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS51cGRhdGUuUjsKLWltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLmFwcC5NZWRpYVJvdXRlQnV0dG9uOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlU2VsZWN0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkZvcm1hdHRlcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotCi1wdWJsaWMgY2xhc3MgTWVkaWFDb250cm9sVmlldzJJbXBsIGV4dGVuZHMgQmFzZUxheW91dCBpbXBsZW1lbnRzIE1lZGlhQ29udHJvbFZpZXcyUHJvdmlkZXIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTWVkaWFDb250cm9sVmlldzIiOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBNZWRpYUNvbnRyb2xWaWV3MiBtSW5zdGFuY2U7Ci0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEFSR1VNRU5UX0tFWV9GVUxMU0NSRUVOID0gImZ1bGxTY3JlZW4iOwotCi0gICAgLy8gVE9ETzogTW92ZSB0aGVzZSBjb25zdGFudHMgdG8gcHVibGljIGFwaSB0byBzdXBwb3J0IGN1c3RvbSB2aWRlbyB2aWV3LgotICAgIC8vIFRPRE86IENvbWJpbmUgdGhlc2UgY29uc3RhbnRzIGludG8gb25lIHJlZ2FyZGluZyBUcmFja0luZm8uCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfVklERU9fVFJBQ0tfQ09VTlQgPSAiVmlkZW9UcmFja0NvdW50IjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9BVURJT19UUkFDS19DT1VOVCA9ICJBdWRpb1RyYWNrQ291bnQiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1NVQlRJVExFX1RSQUNLX0NPVU5UID0gIlN1YnRpdGxlVHJhY2tDb3VudCI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfUExBWUJBQ0tfU1BFRUQgPSAiUGxheWJhY2tTcGVlZCI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfU0VMRUNURURfQVVESU9fSU5ERVggPSAiU2VsZWN0ZWRBdWRpb0luZGV4IjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9TRUxFQ1RFRF9TVUJUSVRMRV9JTkRFWCA9ICJTZWxlY3RlZFN1YnRpdGxlSW5kZXgiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVZFTlRfVVBEQVRFX1RSQUNLX1NUQVRVUyA9ICJVcGRhdGVUcmFja1N0YXR1cyI7Ci0KLSAgICAvLyBUT0RPOiBSZW1vdmUgdGhpcyBvbmNlIGludGVncmF0aW5nIHdpdGggTWVkaWFTZXNzaW9uMiAmIE1lZGlhTWV0YWRhdGEyCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfU1RBVEVfSVNfQURWRVJUSVNFTUVOVCA9ICJNZWRpYVR5cGVBZHZlcnRpc2VtZW50IjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEVWRU5UX1VQREFURV9NRURJQV9UWVBFX1NUQVRVUyA9ICJVcGRhdGVNZWRpYVR5cGVTdGF0dXMiOwotCi0gICAgLy8gU3RyaW5nIGZvciBzZW5kaW5nIGNvbW1hbmQgdG8gc2hvdyBzdWJ0aXRsZSB0byBNZWRpYVNlc3Npb24uCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NQU5EX1NIT1dfU1VCVElUTEUgPSAic2hvd1N1YnRpdGxlIjsKLSAgICAvLyBTdHJpbmcgZm9yIHNlbmRpbmcgY29tbWFuZCB0byBoaWRlIHN1YnRpdGxlIHRvIE1lZGlhU2Vzc2lvbi4KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1BTkRfSElERV9TVUJUSVRMRSA9ICJoaWRlU3VidGl0bGUiOwotICAgIC8vIFRPRE86IHJlbW92ZSBvbmNlIHRoZSBpbXBsZW1lbnRhdGlvbiBpcyByZXZpc2VkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUFORF9TRVRfRlVMTFNDUkVFTiA9ICJzZXRGdWxsc2NyZWVuIjsKLSAgICAvLyBTdHJpbmcgZm9yIHNlbmRpbmcgY29tbWFuZCB0byBzZWxlY3QgYXVkaW8gdHJhY2sgdG8gTWVkaWFTZXNzaW9uLgotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUFORF9TRUxFQ1RfQVVESU9fVFJBQ0sgPSAiU2VsZWN0VHJhY2siOwotICAgIC8vIFN0cmluZyBmb3Igc2VuZGluZyBjb21tYW5kIHRvIHNldCBwbGF5YmFjayBzcGVlZCB0byBNZWRpYVNlc3Npb24uCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NQU5EX1NFVF9QTEFZQkFDS19TUEVFRCA9ICJTZXRQbGF5YmFja1NwZWVkIjsKLSAgICAvLyBTdHJpbmcgZm9yIHNlbmRpbmcgY29tbWFuZCB0byBtdXRlIGF1ZGlvIHRvIE1lZGlhU2Vzc2lvbi4KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1BTkRfTVVURT0gIk11dGUiOwotICAgIC8vIFN0cmluZyBmb3Igc2VuZGluZyBjb21tYW5kIHRvIHVubXV0ZSBhdWRpbyB0byBNZWRpYVNlc3Npb24uCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NQU5EX1VOTVVURSA9ICJVbm11dGUiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNFVFRJTkdTX01PREVfQVVESU9fVFJBQ0sgPSAwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTRVRUSU5HU19NT0RFX1BMQVlCQUNLX1NQRUVEID0gMTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0VUVElOR1NfTU9ERV9IRUxQID0gMjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0VUVElOR1NfTU9ERV9TVUJUSVRMRV9UUkFDSyA9IDM7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNFVFRJTkdTX01PREVfVklERU9fUVVBTElUWSA9IDQ7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNFVFRJTkdTX01PREVfTUFJTiA9IDU7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBMQVlCQUNLX1NQRUVEXzF4X0lOREVYID0gMzsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNRURJQV9UWVBFX0RFRkFVTFQgPSAwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNRURJQV9UWVBFX01VU0lDID0gMTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUVESUFfVFlQRV9BRFZFUlRJU0VNRU5UID0gMjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTSVpFX1RZUEVfRU1CRURERUQgPSAwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTSVpFX1RZUEVfRlVMTCA9IDE7Ci0gICAgLy8gVE9ETzogYWRkIHN1cHBvcnQgZm9yIE1pbmltYWwgc2l6ZSB0eXBlLgotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTSVpFX1RZUEVfTUlOSU1BTCA9IDI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1BST0dSRVNTID0gMTAwMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9QUk9HUkVTU19VUERBVEVfVElNRV9NUyA9IDEwMDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJFV0lORF9USU1FX01TID0gMTAwMDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZPUldBUkRfVElNRV9NUyA9IDMwMDAwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBRF9TS0lQX1dBSVRfVElNRV9NUyA9IDUwMDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJFU09VUkNFX05PTl9FWElTVEVOVCA9IC0xOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNPVVJDRV9FTVBUWSA9ICIiOwotCi0gICAgcHJpdmF0ZSBSZXNvdXJjZXMgbVJlc291cmNlczsKLSAgICBwcml2YXRlIE1lZGlhQ29udHJvbGxlciBtQ29udHJvbGxlcjsKLSAgICBwcml2YXRlIE1lZGlhQ29udHJvbGxlci5UcmFuc3BvcnRDb250cm9scyBtQ29udHJvbHM7Ci0gICAgcHJpdmF0ZSBQbGF5YmFja1N0YXRlIG1QbGF5YmFja1N0YXRlOwotICAgIHByaXZhdGUgTWVkaWFNZXRhZGF0YSBtTWV0YWRhdGE7Ci0gICAgcHJpdmF0ZSBpbnQgbUR1cmF0aW9uOwotICAgIHByaXZhdGUgaW50IG1QcmV2U3RhdGU7Ci0gICAgcHJpdmF0ZSBpbnQgbVByZXZXaWR0aDsKLSAgICBwcml2YXRlIGludCBtUHJldkhlaWdodDsKLSAgICBwcml2YXRlIGludCBtT3JpZ2luYWxMZWZ0QmFyV2lkdGg7Ci0gICAgcHJpdmF0ZSBpbnQgbVZpZGVvVHJhY2tDb3VudDsKLSAgICBwcml2YXRlIGludCBtQXVkaW9UcmFja0NvdW50OwotICAgIHByaXZhdGUgaW50IG1TdWJ0aXRsZVRyYWNrQ291bnQ7Ci0gICAgcHJpdmF0ZSBpbnQgbVNldHRpbmdzTW9kZTsKLSAgICBwcml2YXRlIGludCBtU2VsZWN0ZWRTdWJ0aXRsZVRyYWNrSW5kZXg7Ci0gICAgcHJpdmF0ZSBpbnQgbVNlbGVjdGVkQXVkaW9UcmFja0luZGV4OwotICAgIHByaXZhdGUgaW50IG1TZWxlY3RlZFZpZGVvUXVhbGl0eUluZGV4OwotICAgIHByaXZhdGUgaW50IG1TZWxlY3RlZFNwZWVkSW5kZXg7Ci0gICAgcHJpdmF0ZSBpbnQgbUVtYmVkZGVkU2V0dGluZ3NJdGVtV2lkdGg7Ci0gICAgcHJpdmF0ZSBpbnQgbUZ1bGxTZXR0aW5nc0l0ZW1XaWR0aDsKLSAgICBwcml2YXRlIGludCBtRW1iZWRkZWRTZXR0aW5nc0l0ZW1IZWlnaHQ7Ci0gICAgcHJpdmF0ZSBpbnQgbUZ1bGxTZXR0aW5nc0l0ZW1IZWlnaHQ7Ci0gICAgcHJpdmF0ZSBpbnQgbVNldHRpbmdzV2luZG93TWFyZ2luOwotICAgIHByaXZhdGUgaW50IG1NZWRpYVR5cGU7Ci0gICAgcHJpdmF0ZSBpbnQgbVNpemVUeXBlOwotICAgIHByaXZhdGUgbG9uZyBtUGxheWJhY2tBY3Rpb25zOwotICAgIHByaXZhdGUgYm9vbGVhbiBtRHJhZ2dpbmc7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1Jc0Z1bGxTY3JlZW47Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1PdmVyZmxvd0V4cGFuZGVkOwotICAgIHByaXZhdGUgYm9vbGVhbiBtSXNTdG9wcGVkOwotICAgIHByaXZhdGUgYm9vbGVhbiBtU3VidGl0bGVJc0VuYWJsZWQ7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1TZWVrQXZhaWxhYmxlOwotICAgIHByaXZhdGUgYm9vbGVhbiBtSXNBZHZlcnRpc2VtZW50OwotICAgIHByaXZhdGUgYm9vbGVhbiBtSXNNdXRlOwotICAgIHByaXZhdGUgYm9vbGVhbiBtTmVlZFVYVXBkYXRlOwotCi0gICAgLy8gUmVsYXRpbmcgdG8gVGl0bGUgQmFyIFZpZXcKLSAgICBwcml2YXRlIFZpZXdHcm91cCBtUm9vdDsKLSAgICBwcml2YXRlIFZpZXcgbVRpdGxlQmFyOwotICAgIHByaXZhdGUgVGV4dFZpZXcgbVRpdGxlVmlldzsKLSAgICBwcml2YXRlIFZpZXcgbUFkRXh0ZXJuYWxMaW5rOwotICAgIHByaXZhdGUgSW1hZ2VCdXR0b24gbUJhY2tCdXR0b247Ci0gICAgcHJpdmF0ZSBNZWRpYVJvdXRlQnV0dG9uIG1Sb3V0ZUJ1dHRvbjsKLSAgICBwcml2YXRlIE1lZGlhUm91dGVTZWxlY3RvciBtUm91dGVTZWxlY3RvcjsKLQotICAgIC8vIFJlbGF0aW5nIHRvIENlbnRlciBWaWV3Ci0gICAgcHJpdmF0ZSBWaWV3R3JvdXAgbUNlbnRlclZpZXc7Ci0gICAgcHJpdmF0ZSBWaWV3IG1UcmFuc3BvcnRDb250cm9sczsKLSAgICBwcml2YXRlIEltYWdlQnV0dG9uIG1QbGF5UGF1c2VCdXR0b247Ci0gICAgcHJpdmF0ZSBJbWFnZUJ1dHRvbiBtRmZ3ZEJ1dHRvbjsKLSAgICBwcml2YXRlIEltYWdlQnV0dG9uIG1SZXdCdXR0b247Ci0gICAgcHJpdmF0ZSBJbWFnZUJ1dHRvbiBtTmV4dEJ1dHRvbjsKLSAgICBwcml2YXRlIEltYWdlQnV0dG9uIG1QcmV2QnV0dG9uOwotCi0gICAgLy8gUmVsYXRpbmcgdG8gTWluaW1hbCBFeHRyYSBWaWV3Ci0gICAgcHJpdmF0ZSBMaW5lYXJMYXlvdXQgbU1pbmltYWxFeHRyYVZpZXc7Ci0KLSAgICAvLyBSZWxhdGluZyB0byBQcm9ncmVzcyBCYXIgVmlldwotICAgIHByaXZhdGUgUHJvZ3Jlc3NCYXIgbVByb2dyZXNzOwotICAgIHByaXZhdGUgVmlldyBtUHJvZ3Jlc3NCdWZmZXI7Ci0KLSAgICAvLyBSZWxhdGluZyB0byBCb3R0b20gQmFyIFZpZXcKLSAgICBwcml2YXRlIFZpZXdHcm91cCBtQm90dG9tQmFyOwotCi0gICAgLy8gUmVsYXRpbmcgdG8gQm90dG9tIEJhciBMZWZ0IFZpZXcKLSAgICBwcml2YXRlIFZpZXdHcm91cCBtQm90dG9tQmFyTGVmdFZpZXc7Ci0gICAgcHJpdmF0ZSBWaWV3R3JvdXAgbVRpbWVWaWV3OwotICAgIHByaXZhdGUgVGV4dFZpZXcgbUVuZFRpbWU7Ci0gICAgcHJpdmF0ZSBUZXh0VmlldyBtQ3VycmVudFRpbWU7Ci0gICAgcHJpdmF0ZSBUZXh0VmlldyBtQWRTa2lwVmlldzsKLSAgICBwcml2YXRlIFN0cmluZ0J1aWxkZXIgbUZvcm1hdEJ1aWxkZXI7Ci0gICAgcHJpdmF0ZSBGb3JtYXR0ZXIgbUZvcm1hdHRlcjsKLQotICAgIC8vIFJlbGF0aW5nIHRvIEJvdHRvbSBCYXIgUmlnaHQgVmlldwotICAgIHByaXZhdGUgVmlld0dyb3VwIG1Cb3R0b21CYXJSaWdodFZpZXc7Ci0gICAgcHJpdmF0ZSBWaWV3R3JvdXAgbUJhc2ljQ29udHJvbHM7Ci0gICAgcHJpdmF0ZSBWaWV3R3JvdXAgbUV4dHJhQ29udHJvbHM7Ci0gICAgcHJpdmF0ZSBWaWV3R3JvdXAgbUN1c3RvbUJ1dHRvbnM7Ci0gICAgcHJpdmF0ZSBJbWFnZUJ1dHRvbiBtU3VidGl0bGVCdXR0b247Ci0gICAgcHJpdmF0ZSBJbWFnZUJ1dHRvbiBtRnVsbFNjcmVlbkJ1dHRvbjsKLSAgICBwcml2YXRlIEltYWdlQnV0dG9uIG1PdmVyZmxvd0J1dHRvblJpZ2h0OwotICAgIHByaXZhdGUgSW1hZ2VCdXR0b24gbU92ZXJmbG93QnV0dG9uTGVmdDsKLSAgICBwcml2YXRlIEltYWdlQnV0dG9uIG1NdXRlQnV0dG9uOwotICAgIHByaXZhdGUgSW1hZ2VCdXR0b24gbVZpZGVvUXVhbGl0eUJ1dHRvbjsKLSAgICBwcml2YXRlIEltYWdlQnV0dG9uIG1TZXR0aW5nc0J1dHRvbjsKLSAgICBwcml2YXRlIFRleHRWaWV3IG1BZFJlbWFpbmluZ1ZpZXc7Ci0KLSAgICAvLyBSZWxhdGluZyB0byBTZXR0aW5ncyBMaXN0IFZpZXcKLSAgICBwcml2YXRlIExpc3RWaWV3IG1TZXR0aW5nc0xpc3RWaWV3OwotICAgIHByaXZhdGUgUG9wdXBXaW5kb3cgbVNldHRpbmdzV2luZG93OwotICAgIHByaXZhdGUgU2V0dGluZ3NBZGFwdGVyIG1TZXR0aW5nc0FkYXB0ZXI7Ci0gICAgcHJpdmF0ZSBTdWJTZXR0aW5nc0FkYXB0ZXIgbVN1YlNldHRpbmdzQWRhcHRlcjsKLSAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBtU2V0dGluZ3NNYWluVGV4dHNMaXN0OwotICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IG1TZXR0aW5nc1N1YlRleHRzTGlzdDsKLSAgICBwcml2YXRlIExpc3Q8SW50ZWdlcj4gbVNldHRpbmdzSWNvbklkc0xpc3Q7Ci0gICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gbVN1YnRpdGxlRGVzY3JpcHRpb25zTGlzdDsKLSAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBtQXVkaW9UcmFja0xpc3Q7Ci0gICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gbVZpZGVvUXVhbGl0eUxpc3Q7Ci0gICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gbVBsYXliYWNrU3BlZWRUZXh0TGlzdDsKLSAgICBwcml2YXRlIExpc3Q8RmxvYXQ+IG1QbGF5YmFja1NwZWVkTGlzdDsKLQotICAgIHB1YmxpYyBNZWRpYUNvbnRyb2xWaWV3MkltcGwoTWVkaWFDb250cm9sVmlldzIgaW5zdGFuY2UsCi0gICAgICAgICAgICBWaWV3R3JvdXBQcm92aWRlciBzdXBlclByb3ZpZGVyLCBWaWV3R3JvdXBQcm92aWRlciBwcml2YXRlUHJvdmlkZXIpIHsKLSAgICAgICAgc3VwZXIoaW5zdGFuY2UsIHN1cGVyUHJvdmlkZXIsIHByaXZhdGVQcm92aWRlcik7Ci0gICAgICAgIG1JbnN0YW5jZSA9IGluc3RhbmNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGluaXRpYWxpemUoQE51bGxhYmxlIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlQXR0ciwgaW50IGRlZlN0eWxlUmVzKSB7Ci0gICAgICAgIG1SZXNvdXJjZXMgPSBBcGlIZWxwZXIuZ2V0TGliUmVzb3VyY2VzKG1JbnN0YW5jZS5nZXRDb250ZXh0KCkpOwotICAgICAgICAvLyBJbmZsYXRlIE1lZGlhQ29udHJvbFZpZXcyIGZyb20gWE1MCi0gICAgICAgIG1Sb290ID0gbWFrZUNvbnRyb2xsZXJWaWV3KCk7Ci0gICAgICAgIG1JbnN0YW5jZS5hZGRWaWV3KG1Sb290KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRNZWRpYVNlc3Npb25Ub2tlbl9pbXBsKFNlc3Npb25Ub2tlbjIgdG9rZW4pIHsKLSAgICAgICAgLy8gVE9ETzogaW1wbGVtZW50IHRoaXMKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRPbkZ1bGxTY3JlZW5MaXN0ZW5lcl9pbXBsKE1lZGlhQ29udHJvbFZpZXcyLk9uRnVsbFNjcmVlbkxpc3RlbmVyIGwpIHsKLSAgICAgICAgLy8gVE9ETzogaW1wbGVtZW50IHRoaXMKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRDb250cm9sbGVyX2ltcGwoTWVkaWFDb250cm9sbGVyIGNvbnRyb2xsZXIpIHsKLSAgICAgICAgbUNvbnRyb2xsZXIgPSBjb250cm9sbGVyOwotICAgICAgICBpZiAoY29udHJvbGxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtQ29udHJvbHMgPSBjb250cm9sbGVyLmdldFRyYW5zcG9ydENvbnRyb2xzKCk7Ci0gICAgICAgICAgICAvLyBTZXQgbU1ldGFkYXRhIGFuZCBtUGxheWJhY2tTdGF0ZSB0byBleGlzdGluZyBNZWRpYVNlc3Npb24gdmFyaWFibGVzIHNpbmNlIHRoZXkgbWF5Ci0gICAgICAgICAgICAvLyBiZSBjYWxsZWQgYmVmb3JlIHRoZSBjYWxsYmFjayBpcyBjYWxsZWQKLSAgICAgICAgICAgIG1QbGF5YmFja1N0YXRlID0gbUNvbnRyb2xsZXIuZ2V0UGxheWJhY2tTdGF0ZSgpOwotICAgICAgICAgICAgbU1ldGFkYXRhID0gbUNvbnRyb2xsZXIuZ2V0TWV0YWRhdGEoKTsKLSAgICAgICAgICAgIHVwZGF0ZUR1cmF0aW9uKCk7Ci0gICAgICAgICAgICB1cGRhdGVUaXRsZSgpOwotCi0gICAgICAgICAgICBtQ29udHJvbGxlci5yZWdpc3RlckNhbGxiYWNrKG5ldyBNZWRpYUNvbnRyb2xsZXJDYWxsYmFjaygpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldEJ1dHRvblZpc2liaWxpdHlfaW1wbChpbnQgYnV0dG9uLCBpbnQgdmlzaWJpbGl0eSkgewotICAgICAgICAvLyBUT0RPOiBhZGQgbWVtYmVyIHZhcmlhYmxlcyBmb3IgRmFzdC1Gb3J3YXJkL1BydmlvdXMvUmV3aW5kIGJ1dHRvbnMgdG8gc2F2ZSB2aXNpYmlsaXR5IGluCi0gICAgICAgIC8vIG9yZGVyIHRvIHByZXZlbnQgYmVpbmcgb3ZlcnJpZGVuIGluc2lkZSB1cGRhdGVMYXlvdXQoKS4KLSAgICAgICAgc3dpdGNoIChidXR0b24pIHsKLSAgICAgICAgICAgIGNhc2UgTWVkaWFDb250cm9sVmlldzIuQlVUVE9OX1BMQVlfUEFVU0U6Ci0gICAgICAgICAgICAgICAgaWYgKG1QbGF5UGF1c2VCdXR0b24gIT0gbnVsbCAmJiBjYW5QYXVzZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1QbGF5UGF1c2VCdXR0b24uc2V0VmlzaWJpbGl0eSh2aXNpYmlsaXR5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIE1lZGlhQ29udHJvbFZpZXcyLkJVVFRPTl9GRldEOgotICAgICAgICAgICAgICAgIGlmIChtRmZ3ZEJ1dHRvbiAhPSBudWxsICYmIGNhblNlZWtGb3J3YXJkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbUZmd2RCdXR0b24uc2V0VmlzaWJpbGl0eSh2aXNpYmlsaXR5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIE1lZGlhQ29udHJvbFZpZXcyLkJVVFRPTl9SRVc6Ci0gICAgICAgICAgICAgICAgaWYgKG1SZXdCdXR0b24gIT0gbnVsbCAmJiBjYW5TZWVrQmFja3dhcmQoKSkgewotICAgICAgICAgICAgICAgICAgICBtUmV3QnV0dG9uLnNldFZpc2liaWxpdHkodmlzaWJpbGl0eSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBNZWRpYUNvbnRyb2xWaWV3Mi5CVVRUT05fTkVYVDoKLSAgICAgICAgICAgICAgICBpZiAobU5leHRCdXR0b24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtTmV4dEJ1dHRvbi5zZXRWaXNpYmlsaXR5KHZpc2liaWxpdHkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgTWVkaWFDb250cm9sVmlldzIuQlVUVE9OX1BSRVY6Ci0gICAgICAgICAgICAgICAgaWYgKG1QcmV2QnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbVByZXZCdXR0b24uc2V0VmlzaWJpbGl0eSh2aXNpYmlsaXR5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIE1lZGlhQ29udHJvbFZpZXcyLkJVVFRPTl9TVUJUSVRMRToKLSAgICAgICAgICAgICAgICBpZiAobVN1YnRpdGxlQnV0dG9uICE9IG51bGwgJiYgbVN1YnRpdGxlVHJhY2tDb3VudCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbVN1YnRpdGxlQnV0dG9uLnNldFZpc2liaWxpdHkodmlzaWJpbGl0eSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBNZWRpYUNvbnRyb2xWaWV3Mi5CVVRUT05fRlVMTF9TQ1JFRU46Ci0gICAgICAgICAgICAgICAgaWYgKG1GdWxsU2NyZWVuQnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbUZ1bGxTY3JlZW5CdXR0b24uc2V0VmlzaWJpbGl0eSh2aXNpYmlsaXR5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIE1lZGlhQ29udHJvbFZpZXcyLkJVVFRPTl9PVkVSRkxPVzoKLSAgICAgICAgICAgICAgICBpZiAobU92ZXJmbG93QnV0dG9uUmlnaHQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtT3ZlcmZsb3dCdXR0b25SaWdodC5zZXRWaXNpYmlsaXR5KHZpc2liaWxpdHkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgTWVkaWFDb250cm9sVmlldzIuQlVUVE9OX01VVEU6Ci0gICAgICAgICAgICAgICAgaWYgKG1NdXRlQnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbU11dGVCdXR0b24uc2V0VmlzaWJpbGl0eSh2aXNpYmlsaXR5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIE1lZGlhQ29udHJvbFZpZXcyLkJVVFRPTl9TRVRUSU5HUzoKLSAgICAgICAgICAgICAgICBpZiAobVNldHRpbmdzQnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbVNldHRpbmdzQnV0dG9uLnNldFZpc2liaWxpdHkodmlzaWJpbGl0eSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHJlcXVlc3RQbGF5QnV0dG9uRm9jdXNfaW1wbCgpIHsKLSAgICAgICAgaWYgKG1QbGF5UGF1c2VCdXR0b24gIT0gbnVsbCkgewotICAgICAgICAgICAgbVBsYXlQYXVzZUJ1dHRvbi5yZXF1ZXN0Rm9jdXMoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgZ2V0QWNjZXNzaWJpbGl0eUNsYXNzTmFtZV9pbXBsKCkgewotICAgICAgICByZXR1cm4gTWVkaWFDb250cm9sVmlldzIuY2xhc3MuZ2V0TmFtZSgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIG9uVG91Y2hFdmVudF9pbXBsKE1vdGlvbkV2ZW50IGV2KSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvLyBUT0RPOiBTaG91bGQgdGhpcyBmdW5jdGlvbiBiZSByZW1vdmVkPwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIG9uVHJhY2tiYWxsRXZlbnRfaW1wbChNb3Rpb25FdmVudCBldikgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25NZWFzdXJlX2ltcGwoaW50IHdpZHRoTWVhc3VyZVNwZWMsIGludCBoZWlnaHRNZWFzdXJlU3BlYykgewotICAgICAgICBzdXBlci5vbk1lYXN1cmVfaW1wbCh3aWR0aE1lYXN1cmVTcGVjLCBoZWlnaHRNZWFzdXJlU3BlYyk7Ci0KLSAgICAgICAgLy8gVXBkYXRlIGxheW91dCB3aGVuIHRoaXMgdmlldydzIHdpZHRoIGNoYW5nZXMgaW4gb3JkZXIgdG8gYXZvaWQgYW55IFVJIG92ZXJsYXAgYmV0d2VlbgotICAgICAgICAvLyB0cmFuc3BvcnQgY29udHJvbHMuCi0gICAgICAgIGlmIChtUHJldldpZHRoICE9IG1JbnN0YW5jZS5nZXRNZWFzdXJlZFdpZHRoKCkKLSAgICAgICAgICAgICAgICB8fCBtUHJldkhlaWdodCAhPSBtSW5zdGFuY2UuZ2V0TWVhc3VyZWRIZWlnaHQoKSB8fCBtTmVlZFVYVXBkYXRlKSB7Ci0gICAgICAgICAgICAvLyBEaXNtaXNzIFNldHRpbmdzV2luZG93IGlmIGl0IGlzIHNob3dpbmcuCi0gICAgICAgICAgICBtU2V0dGluZ3NXaW5kb3cuZGlzbWlzcygpOwotCi0gICAgICAgICAgICAvLyBUaGVzZSB2aWV3cyBtYXkgbm90IGhhdmUgYmVlbiBpbml0aWFsaXplZCB5ZXQuCi0gICAgICAgICAgICBpZiAobVRyYW5zcG9ydENvbnRyb2xzLmdldFdpZHRoKCkgPT0gMCB8fCBtVGltZVZpZXcuZ2V0V2lkdGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnQgY3VycldpZHRoID0gbUluc3RhbmNlLmdldE1lYXN1cmVkV2lkdGgoKTsKLSAgICAgICAgICAgIGludCBjdXJySGVpZ2h0ID0gbUluc3RhbmNlLmdldE1lYXN1cmVkSGVpZ2h0KCk7Ci0gICAgICAgICAgICBXaW5kb3dNYW5hZ2VyIG1hbmFnZXIgPSAoV2luZG93TWFuYWdlcikgbUluc3RhbmNlLmdldENvbnRleHQoKS5nZXRBcHBsaWNhdGlvbkNvbnRleHQoKQotICAgICAgICAgICAgICAgICAgICAuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LldJTkRPV19TRVJWSUNFKTsKLSAgICAgICAgICAgIFBvaW50IHNjcmVlblNpemUgPSBuZXcgUG9pbnQoKTsKLSAgICAgICAgICAgIG1hbmFnZXIuZ2V0RGVmYXVsdERpc3BsYXkoKS5nZXRTaXplKHNjcmVlblNpemUpOwotICAgICAgICAgICAgaW50IHNjcmVlbldpZHRoID0gc2NyZWVuU2l6ZS54OwotICAgICAgICAgICAgaW50IHNjcmVlbkhlaWdodCA9IHNjcmVlblNpemUueTsKLSAgICAgICAgICAgIGludCBmdWxsSWNvblNpemUgPSBtUmVzb3VyY2VzLmdldERpbWVuc2lvblBpeGVsU2l6ZShSLmRpbWVuLm1jdjJfZnVsbF9pY29uX3NpemUpOwotICAgICAgICAgICAgaW50IGVtYmVkZGVkSWNvblNpemUgPSBtUmVzb3VyY2VzLmdldERpbWVuc2lvblBpeGVsU2l6ZSgKLSAgICAgICAgICAgICAgICAgICAgUi5kaW1lbi5tY3YyX2VtYmVkZGVkX2ljb25fc2l6ZSk7Ci0gICAgICAgICAgICBpbnQgbWFyZ2luU2l6ZSA9IG1SZXNvdXJjZXMuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKFIuZGltZW4ubWN2Ml9pY29uX21hcmdpbik7Ci0KLSAgICAgICAgICAgIC8vIFRPRE86IGFkZCBzdXBwb3J0IGZvciBBZHZlcnRpc2VtZW50IE1vZGUuCi0gICAgICAgICAgICBpZiAobU1lZGlhVHlwZSA9PSBNRURJQV9UWVBFX0RFRkFVTFQpIHsKLSAgICAgICAgICAgICAgICAvLyBNYXggbnVtYmVyIG9mIGljb25zIGluc2lkZSBCb3R0b21CYXJSaWdodFZpZXcgZm9yIE11c2ljIG1vZGUgaXMgNC4KLSAgICAgICAgICAgICAgICBpbnQgbWF4SWNvbkNvdW50ID0gNDsKLSAgICAgICAgICAgICAgICB1cGRhdGVMYXlvdXQobWF4SWNvbkNvdW50LCBmdWxsSWNvblNpemUsIGVtYmVkZGVkSWNvblNpemUsIG1hcmdpblNpemUsIGN1cnJXaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJIZWlnaHQsIHNjcmVlbldpZHRoLCBzY3JlZW5IZWlnaHQpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChtTWVkaWFUeXBlID09IE1FRElBX1RZUEVfTVVTSUMpIHsKLSAgICAgICAgICAgICAgICBpZiAobU5lZWRVWFVwZGF0ZSkgewotICAgICAgICAgICAgICAgICAgICAvLyBPbmUtdGltZSBvcGVyYXRpb24gZm9yIE11c2ljIG1lZGlhIHR5cGUKLSAgICAgICAgICAgICAgICAgICAgbUJhc2ljQ29udHJvbHMucmVtb3ZlVmlldyhtTXV0ZUJ1dHRvbik7Ci0gICAgICAgICAgICAgICAgICAgIG1FeHRyYUNvbnRyb2xzLmFkZFZpZXcobU11dGVCdXR0b24sIDApOwotICAgICAgICAgICAgICAgICAgICBtVmlkZW9RdWFsaXR5QnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1GZndkQnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1GZndkQnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAobVJld0J1dHRvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtUmV3QnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtTmVlZFVYVXBkYXRlID0gZmFsc2U7Ci0KLSAgICAgICAgICAgICAgICAvLyBNYXggbnVtYmVyIG9mIGljb25zIGluc2lkZSBCb3R0b21CYXJSaWdodFZpZXcgZm9yIE11c2ljIG1vZGUgaXMgMy4KLSAgICAgICAgICAgICAgICBpbnQgbWF4SWNvbkNvdW50ID0gMzsKLSAgICAgICAgICAgICAgICB1cGRhdGVMYXlvdXQobWF4SWNvbkNvdW50LCBmdWxsSWNvblNpemUsIGVtYmVkZGVkSWNvblNpemUsIG1hcmdpblNpemUsIGN1cnJXaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJIZWlnaHQsIHNjcmVlbldpZHRoLCBzY3JlZW5IZWlnaHQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVByZXZXaWR0aCA9IGN1cnJXaWR0aDsKLSAgICAgICAgICAgIG1QcmV2SGVpZ2h0ID0gY3VyckhlaWdodDsKLSAgICAgICAgfQotICAgICAgICAvLyBUT0RPOiBtb3ZlIHRoaXMgdG8gYSBkaWZmZXJlbnQgbG9jYXRpb24uCi0gICAgICAgIC8vIFVwZGF0ZSB0aXRsZSBiYXIgcGFyYW1ldGVycyBpbiBvcmRlciB0byBhdm9pZCBvdmVybGFwIGJldHdlZW4gdGl0bGUgdmlldyBhbmQgdGhlIHJpZ2h0Ci0gICAgICAgIC8vIHNpZGUgb2YgdGhlIHRpdGxlIGJhci4KLSAgICAgICAgdXBkYXRlVGl0bGVCYXJMYXlvdXQoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRFbmFibGVkX2ltcGwoYm9vbGVhbiBlbmFibGVkKSB7Ci0gICAgICAgIHN1cGVyLnNldEVuYWJsZWRfaW1wbChlbmFibGVkKTsKLQotICAgICAgICAvLyBUT0RPOiBNZXJnZSB0aGUgYmVsb3cgY29kZSB3aXRoIGRpc2FibGVVbnN1cHBvcnRlZEJ1dHRvbnMoKS4KLSAgICAgICAgaWYgKG1QbGF5UGF1c2VCdXR0b24gIT0gbnVsbCkgewotICAgICAgICAgICAgbVBsYXlQYXVzZUJ1dHRvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtRmZ3ZEJ1dHRvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtRmZ3ZEJ1dHRvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtUmV3QnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1SZXdCdXR0b24uc2V0RW5hYmxlZChlbmFibGVkKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobU5leHRCdXR0b24gIT0gbnVsbCkgewotICAgICAgICAgICAgbU5leHRCdXR0b24uc2V0RW5hYmxlZChlbmFibGVkKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobVByZXZCdXR0b24gIT0gbnVsbCkgewotICAgICAgICAgICAgbVByZXZCdXR0b24uc2V0RW5hYmxlZChlbmFibGVkKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobVByb2dyZXNzICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1Qcm9ncmVzcy5zZXRFbmFibGVkKGVuYWJsZWQpOwotICAgICAgICB9Ci0gICAgICAgIGRpc2FibGVVbnN1cHBvcnRlZEJ1dHRvbnMoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblZpc2liaWxpdHlBZ2dyZWdhdGVkX2ltcGwoYm9vbGVhbiBpc1Zpc2libGUpIHsKLSAgICAgICAgc3VwZXIub25WaXNpYmlsaXR5QWdncmVnYXRlZF9pbXBsKGlzVmlzaWJsZSk7Ci0KLSAgICAgICAgaWYgKGlzVmlzaWJsZSkgewotICAgICAgICAgICAgZGlzYWJsZVVuc3VwcG9ydGVkQnV0dG9ucygpOwotICAgICAgICAgICAgbUluc3RhbmNlLnJlbW92ZUNhbGxiYWNrcyhtVXBkYXRlUHJvZ3Jlc3MpOwotICAgICAgICAgICAgbUluc3RhbmNlLnBvc3QobVVwZGF0ZVByb2dyZXNzKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1JbnN0YW5jZS5yZW1vdmVDYWxsYmFja3MobVVwZGF0ZVByb2dyZXNzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFJvdXRlU2VsZWN0b3IoTWVkaWFSb3V0ZVNlbGVjdG9yIHNlbGVjdG9yKSB7Ci0gICAgICAgIG1Sb3V0ZVNlbGVjdG9yID0gc2VsZWN0b3I7Ci0gICAgICAgIGlmIChtUm91dGVTZWxlY3RvciAhPSBudWxsICYmICFtUm91dGVTZWxlY3Rvci5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIG1Sb3V0ZUJ1dHRvbi5zZXRSb3V0ZVNlbGVjdG9yKHNlbGVjdG9yLCBNZWRpYVJvdXRlci5DQUxMQkFDS19GTEFHX1BFUkZPUk1fQUNUSVZFX1NDQU4pOwotICAgICAgICAgICAgbVJvdXRlQnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1Sb3V0ZUJ1dHRvbi5zZXRSb3V0ZVNlbGVjdG9yKE1lZGlhUm91dGVTZWxlY3Rvci5FTVBUWSk7Ci0gICAgICAgICAgICBtUm91dGVCdXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgLy8gUHJvdGVjdGVkIG9yIHByaXZhdGUgbWV0aG9kcwotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzUGxheWluZygpIHsKLSAgICAgICAgaWYgKG1QbGF5YmFja1N0YXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBtUGxheWJhY2tTdGF0ZS5nZXRTdGF0ZSgpID09IFBsYXliYWNrU3RhdGUuU1RBVEVfUExBWUlORzsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgZ2V0Q3VycmVudFBvc2l0aW9uKCkgewotICAgICAgICBtUGxheWJhY2tTdGF0ZSA9IG1Db250cm9sbGVyLmdldFBsYXliYWNrU3RhdGUoKTsKLSAgICAgICAgaWYgKG1QbGF5YmFja1N0YXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiAoaW50KSBtUGxheWJhY2tTdGF0ZS5nZXRQb3NpdGlvbigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIHByaXZhdGUgaW50IGdldEJ1ZmZlclBlcmNlbnRhZ2UoKSB7Ci0gICAgICAgIGlmIChtRHVyYXRpb24gPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgbVBsYXliYWNrU3RhdGUgPSBtQ29udHJvbGxlci5nZXRQbGF5YmFja1N0YXRlKCk7Ci0gICAgICAgIGlmIChtUGxheWJhY2tTdGF0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBsb25nIGJ1ZmZlcmVkUG9zID0gbVBsYXliYWNrU3RhdGUuZ2V0QnVmZmVyZWRQb3NpdGlvbigpOwotICAgICAgICAgICAgcmV0dXJuIChidWZmZXJlZFBvcyA9PSAtMSkgPyAtMSA6IChpbnQpIChidWZmZXJlZFBvcyAqIDEwMCAvIG1EdXJhdGlvbik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGNhblBhdXNlKCkgewotICAgICAgICBpZiAobVBsYXliYWNrU3RhdGUgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIChtUGxheWJhY2tTdGF0ZS5nZXRBY3Rpb25zKCkgJiBQbGF5YmFja1N0YXRlLkFDVElPTl9QQVVTRSkgIT0gMDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gY2FuU2Vla0JhY2t3YXJkKCkgewotICAgICAgICBpZiAobVBsYXliYWNrU3RhdGUgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIChtUGxheWJhY2tTdGF0ZS5nZXRBY3Rpb25zKCkgJiBQbGF5YmFja1N0YXRlLkFDVElPTl9SRVdJTkQpICE9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGNhblNlZWtGb3J3YXJkKCkgewotICAgICAgICBpZiAobVBsYXliYWNrU3RhdGUgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIChtUGxheWJhY2tTdGF0ZS5nZXRBY3Rpb25zKCkgJiBQbGF5YmFja1N0YXRlLkFDVElPTl9GQVNUX0ZPUldBUkQpICE9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIHRoZSB2aWV3IHRoYXQgaG9sZHMgdGhlIHdpZGdldHMgdGhhdCBjb250cm9sIHBsYXliYWNrLgotICAgICAqIERlcml2ZWQgY2xhc3NlcyBjYW4gb3ZlcnJpZGUgdGhpcyB0byBjcmVhdGUgdGhlaXIgb3duLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgY29udHJvbGxlciB2aWV3LgotICAgICAqIEBoaWRlIFRoaXMgZG9lc24ndCB3b3JrIGFzIGFkdmVydGlzZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgVmlld0dyb3VwIG1ha2VDb250cm9sbGVyVmlldygpIHsKLSAgICAgICAgVmlld0dyb3VwIHJvb3QgPSAoVmlld0dyb3VwKSBBcGlIZWxwZXIuaW5mbGF0ZUxpYkxheW91dChtSW5zdGFuY2UuZ2V0Q29udGV4dCgpLAotICAgICAgICAgICAgICAgIFIubGF5b3V0Lm1lZGlhX2NvbnRyb2xsZXIpOwotICAgICAgICBpbml0Q29udHJvbGxlclZpZXcocm9vdCk7Ci0gICAgICAgIHJldHVybiByb290OwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBpbml0Q29udHJvbGxlclZpZXcoVmlld0dyb3VwIHYpIHsKLSAgICAgICAgLy8gUmVsYXRpbmcgdG8gVGl0bGUgQmFyIFZpZXcKLSAgICAgICAgbVRpdGxlQmFyID0gdi5maW5kVmlld0J5SWQoUi5pZC50aXRsZV9iYXIpOwotICAgICAgICBtVGl0bGVWaWV3ID0gdi5maW5kVmlld0J5SWQoUi5pZC50aXRsZV90ZXh0KTsKLSAgICAgICAgbUFkRXh0ZXJuYWxMaW5rID0gdi5maW5kVmlld0J5SWQoUi5pZC5hZF9leHRlcm5hbF9saW5rKTsKLSAgICAgICAgbUJhY2tCdXR0b24gPSB2LmZpbmRWaWV3QnlJZChSLmlkLmJhY2spOwotICAgICAgICBpZiAobUJhY2tCdXR0b24gIT0gbnVsbCkgewotICAgICAgICAgICAgbUJhY2tCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG1CYWNrTGlzdGVuZXIpOwotICAgICAgICAgICAgbUJhY2tCdXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICB9Ci0gICAgICAgIG1Sb3V0ZUJ1dHRvbiA9IHYuZmluZFZpZXdCeUlkKFIuaWQuY2FzdCk7Ci0KLSAgICAgICAgLy8gUmVsYXRpbmcgdG8gQ2VudGVyIFZpZXcKLSAgICAgICAgbUNlbnRlclZpZXcgPSB2LmZpbmRWaWV3QnlJZChSLmlkLmNlbnRlcl92aWV3KTsKLSAgICAgICAgbVRyYW5zcG9ydENvbnRyb2xzID0gaW5mbGF0ZVRyYW5zcG9ydENvbnRyb2xzKFIubGF5b3V0LmVtYmVkZGVkX3RyYW5zcG9ydF9jb250cm9scyk7Ci0gICAgICAgIG1DZW50ZXJWaWV3LmFkZFZpZXcobVRyYW5zcG9ydENvbnRyb2xzKTsKLQotICAgICAgICAvLyBSZWxhdGluZyB0byBNaW5pbWFsIEV4dHJhIFZpZXcKLSAgICAgICAgbU1pbmltYWxFeHRyYVZpZXcgPSAoTGluZWFyTGF5b3V0KSB2LmZpbmRWaWV3QnlJZChSLmlkLm1pbmltYWxfZXh0cmFfdmlldyk7Ci0gICAgICAgIExpbmVhckxheW91dC5MYXlvdXRQYXJhbXMgcGFyYW1zID0KLSAgICAgICAgICAgICAgICAoTGluZWFyTGF5b3V0LkxheW91dFBhcmFtcykgbU1pbmltYWxFeHRyYVZpZXcuZ2V0TGF5b3V0UGFyYW1zKCk7Ci0gICAgICAgIGludCBpY29uU2l6ZSA9IG1SZXNvdXJjZXMuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKFIuZGltZW4ubWN2Ml9lbWJlZGRlZF9pY29uX3NpemUpOwotICAgICAgICBpbnQgbWFyZ2luU2l6ZSA9IG1SZXNvdXJjZXMuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKFIuZGltZW4ubWN2Ml9pY29uX21hcmdpbik7Ci0gICAgICAgIHBhcmFtcy5zZXRNYXJnaW5zKDAsIChpY29uU2l6ZSArIG1hcmdpblNpemUgKiAyKSAqICgtMSksIDAsIDApOwotICAgICAgICBtTWluaW1hbEV4dHJhVmlldy5zZXRMYXlvdXRQYXJhbXMocGFyYW1zKTsKLSAgICAgICAgbU1pbmltYWxFeHRyYVZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotCi0gICAgICAgIC8vIFJlbGF0aW5nIHRvIFByb2dyZXNzIEJhciBWaWV3Ci0gICAgICAgIG1Qcm9ncmVzcyA9IHYuZmluZFZpZXdCeUlkKFIuaWQucHJvZ3Jlc3MpOwotICAgICAgICBpZiAobVByb2dyZXNzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChtUHJvZ3Jlc3MgaW5zdGFuY2VvZiBTZWVrQmFyKSB7Ci0gICAgICAgICAgICAgICAgU2Vla0JhciBzZWVrZXIgPSAoU2Vla0JhcikgbVByb2dyZXNzOwotICAgICAgICAgICAgICAgIHNlZWtlci5zZXRPblNlZWtCYXJDaGFuZ2VMaXN0ZW5lcihtU2Vla0xpc3RlbmVyKTsKLSAgICAgICAgICAgICAgICBzZWVrZXIuc2V0UHJvZ3Jlc3NEcmF3YWJsZShtUmVzb3VyY2VzLmdldERyYXdhYmxlKFIuZHJhd2FibGUuY3VzdG9tX3Byb2dyZXNzKSk7Ci0gICAgICAgICAgICAgICAgc2Vla2VyLnNldFRodW1iKG1SZXNvdXJjZXMuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5jdXN0b21fcHJvZ3Jlc3NfdGh1bWIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1Qcm9ncmVzcy5zZXRNYXgoTUFYX1BST0dSRVNTKTsKLSAgICAgICAgfQotICAgICAgICBtUHJvZ3Jlc3NCdWZmZXIgPSB2LmZpbmRWaWV3QnlJZChSLmlkLnByb2dyZXNzX2J1ZmZlcik7Ci0KLSAgICAgICAgLy8gUmVsYXRpbmcgdG8gQm90dG9tIEJhciBWaWV3Ci0gICAgICAgIG1Cb3R0b21CYXIgPSB2LmZpbmRWaWV3QnlJZChSLmlkLmJvdHRvbV9iYXIpOwotCi0gICAgICAgIC8vIFJlbGF0aW5nIHRvIEJvdHRvbSBCYXIgTGVmdCBWaWV3Ci0gICAgICAgIG1Cb3R0b21CYXJMZWZ0VmlldyA9IHYuZmluZFZpZXdCeUlkKFIuaWQuYm90dG9tX2Jhcl9sZWZ0KTsKLSAgICAgICAgbVRpbWVWaWV3ID0gdi5maW5kVmlld0J5SWQoUi5pZC50aW1lKTsKLSAgICAgICAgbUVuZFRpbWUgPSB2LmZpbmRWaWV3QnlJZChSLmlkLnRpbWVfZW5kKTsKLSAgICAgICAgbUN1cnJlbnRUaW1lID0gdi5maW5kVmlld0J5SWQoUi5pZC50aW1lX2N1cnJlbnQpOwotICAgICAgICBtQWRTa2lwVmlldyA9IHYuZmluZFZpZXdCeUlkKFIuaWQuYWRfc2tpcF90aW1lKTsKLSAgICAgICAgbUZvcm1hdEJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICBtRm9ybWF0dGVyID0gbmV3IEZvcm1hdHRlcihtRm9ybWF0QnVpbGRlciwgTG9jYWxlLmdldERlZmF1bHQoKSk7Ci0KLSAgICAgICAgLy8gUmVsYXRpbmcgdG8gQm90dG9tIEJhciBSaWdodCBWaWV3Ci0gICAgICAgIG1Cb3R0b21CYXJSaWdodFZpZXcgPSB2LmZpbmRWaWV3QnlJZChSLmlkLmJvdHRvbV9iYXJfcmlnaHQpOwotICAgICAgICBtQmFzaWNDb250cm9scyA9IHYuZmluZFZpZXdCeUlkKFIuaWQuYmFzaWNfY29udHJvbHMpOwotICAgICAgICBtRXh0cmFDb250cm9scyA9IHYuZmluZFZpZXdCeUlkKFIuaWQuZXh0cmFfY29udHJvbHMpOwotICAgICAgICBtQ3VzdG9tQnV0dG9ucyA9IHYuZmluZFZpZXdCeUlkKFIuaWQuY3VzdG9tX2J1dHRvbnMpOwotICAgICAgICBtU3VidGl0bGVCdXR0b24gPSB2LmZpbmRWaWV3QnlJZChSLmlkLnN1YnRpdGxlKTsKLSAgICAgICAgaWYgKG1TdWJ0aXRsZUJ1dHRvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtU3VidGl0bGVCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG1TdWJ0aXRsZUxpc3RlbmVyKTsKLSAgICAgICAgfQotICAgICAgICBtRnVsbFNjcmVlbkJ1dHRvbiA9IHYuZmluZFZpZXdCeUlkKFIuaWQuZnVsbHNjcmVlbik7Ci0gICAgICAgIGlmIChtRnVsbFNjcmVlbkJ1dHRvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtRnVsbFNjcmVlbkJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobUZ1bGxTY3JlZW5MaXN0ZW5lcik7Ci0gICAgICAgICAgICAvLyBUT0RPOiBTaG93IEZ1bGxzY3JlZW4gYnV0dG9uIHdoZW4gb25seSBpdCBpcyBwb3NzaWJsZS4KLSAgICAgICAgfQotICAgICAgICBtT3ZlcmZsb3dCdXR0b25SaWdodCA9IHYuZmluZFZpZXdCeUlkKFIuaWQub3ZlcmZsb3dfcmlnaHQpOwotICAgICAgICBpZiAobU92ZXJmbG93QnV0dG9uUmlnaHQgIT0gbnVsbCkgewotICAgICAgICAgICAgbU92ZXJmbG93QnV0dG9uUmlnaHQuc2V0T25DbGlja0xpc3RlbmVyKG1PdmVyZmxvd1JpZ2h0TGlzdGVuZXIpOwotICAgICAgICB9Ci0gICAgICAgIG1PdmVyZmxvd0J1dHRvbkxlZnQgPSB2LmZpbmRWaWV3QnlJZChSLmlkLm92ZXJmbG93X2xlZnQpOwotICAgICAgICBpZiAobU92ZXJmbG93QnV0dG9uTGVmdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtT3ZlcmZsb3dCdXR0b25MZWZ0LnNldE9uQ2xpY2tMaXN0ZW5lcihtT3ZlcmZsb3dMZWZ0TGlzdGVuZXIpOwotICAgICAgICB9Ci0gICAgICAgIG1NdXRlQnV0dG9uID0gdi5maW5kVmlld0J5SWQoUi5pZC5tdXRlKTsKLSAgICAgICAgaWYgKG1NdXRlQnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1NdXRlQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihtTXV0ZUJ1dHRvbkxpc3RlbmVyKTsKLSAgICAgICAgfQotICAgICAgICBtU2V0dGluZ3NCdXR0b24gPSB2LmZpbmRWaWV3QnlJZChSLmlkLnNldHRpbmdzKTsKLSAgICAgICAgaWYgKG1TZXR0aW5nc0J1dHRvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtU2V0dGluZ3NCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG1TZXR0aW5nc0J1dHRvbkxpc3RlbmVyKTsKLSAgICAgICAgfQotICAgICAgICBtVmlkZW9RdWFsaXR5QnV0dG9uID0gdi5maW5kVmlld0J5SWQoUi5pZC52aWRlb19xdWFsaXR5KTsKLSAgICAgICAgaWYgKG1WaWRlb1F1YWxpdHlCdXR0b24gIT0gbnVsbCkgewotICAgICAgICAgICAgbVZpZGVvUXVhbGl0eUJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobVZpZGVvUXVhbGl0eUxpc3RlbmVyKTsKLSAgICAgICAgfQotICAgICAgICBtQWRSZW1haW5pbmdWaWV3ID0gdi5maW5kVmlld0J5SWQoUi5pZC5hZF9yZW1haW5pbmcpOwotCi0gICAgICAgIC8vIFJlbGF0aW5nIHRvIFNldHRpbmdzIExpc3QgVmlldwotICAgICAgICBpbml0aWFsaXplU2V0dGluZ3NMaXN0cygpOwotICAgICAgICBtU2V0dGluZ3NMaXN0VmlldyA9IChMaXN0VmlldykgQXBpSGVscGVyLmluZmxhdGVMaWJMYXlvdXQobUluc3RhbmNlLmdldENvbnRleHQoKSwKLSAgICAgICAgICAgICAgICBSLmxheW91dC5zZXR0aW5nc19saXN0KTsKLSAgICAgICAgbVNldHRpbmdzQWRhcHRlciA9IG5ldyBTZXR0aW5nc0FkYXB0ZXIobVNldHRpbmdzTWFpblRleHRzTGlzdCwgbVNldHRpbmdzU3ViVGV4dHNMaXN0LAotICAgICAgICAgICAgICAgIG1TZXR0aW5nc0ljb25JZHNMaXN0KTsKLSAgICAgICAgbVN1YlNldHRpbmdzQWRhcHRlciA9IG5ldyBTdWJTZXR0aW5nc0FkYXB0ZXIobnVsbCwgMCk7Ci0gICAgICAgIG1TZXR0aW5nc0xpc3RWaWV3LnNldEFkYXB0ZXIobVNldHRpbmdzQWRhcHRlcik7Ci0gICAgICAgIG1TZXR0aW5nc0xpc3RWaWV3LnNldENob2ljZU1vZGUoTGlzdFZpZXcuQ0hPSUNFX01PREVfU0lOR0xFKTsKLSAgICAgICAgbVNldHRpbmdzTGlzdFZpZXcuc2V0T25JdGVtQ2xpY2tMaXN0ZW5lcihtU2V0dGluZ3NJdGVtQ2xpY2tMaXN0ZW5lcik7Ci0KLSAgICAgICAgbUVtYmVkZGVkU2V0dGluZ3NJdGVtV2lkdGggPSBtUmVzb3VyY2VzLmdldERpbWVuc2lvblBpeGVsU2l6ZSgKLSAgICAgICAgICAgICAgICBSLmRpbWVuLm1jdjJfZW1iZWRkZWRfc2V0dGluZ3Nfd2lkdGgpOwotICAgICAgICBtRnVsbFNldHRpbmdzSXRlbVdpZHRoID0gbVJlc291cmNlcy5nZXREaW1lbnNpb25QaXhlbFNpemUoUi5kaW1lbi5tY3YyX2Z1bGxfc2V0dGluZ3Nfd2lkdGgpOwotICAgICAgICBtRW1iZWRkZWRTZXR0aW5nc0l0ZW1IZWlnaHQgPSBtUmVzb3VyY2VzLmdldERpbWVuc2lvblBpeGVsU2l6ZSgKLSAgICAgICAgICAgICAgICBSLmRpbWVuLm1jdjJfZW1iZWRkZWRfc2V0dGluZ3NfaGVpZ2h0KTsKLSAgICAgICAgbUZ1bGxTZXR0aW5nc0l0ZW1IZWlnaHQgPSBtUmVzb3VyY2VzLmdldERpbWVuc2lvblBpeGVsU2l6ZSgKLSAgICAgICAgICAgICAgICBSLmRpbWVuLm1jdjJfZnVsbF9zZXR0aW5nc19oZWlnaHQpOwotICAgICAgICBtU2V0dGluZ3NXaW5kb3dNYXJnaW4gPSAoLTEpICogbVJlc291cmNlcy5nZXREaW1lbnNpb25QaXhlbFNpemUoCi0gICAgICAgICAgICAgICAgUi5kaW1lbi5tY3YyX3NldHRpbmdzX29mZnNldCk7Ci0gICAgICAgIG1TZXR0aW5nc1dpbmRvdyA9IG5ldyBQb3B1cFdpbmRvdyhtU2V0dGluZ3NMaXN0VmlldywgbUVtYmVkZGVkU2V0dGluZ3NJdGVtV2lkdGgsCi0gICAgICAgICAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQsIHRydWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERpc2FibGUgcGF1c2Ugb3Igc2VlayBidXR0b25zIGlmIHRoZSBzdHJlYW0gY2Fubm90IGJlIHBhdXNlZCBvciBzZWVrZWQuCi0gICAgICogVGhpcyByZXF1aXJlcyB0aGUgY29udHJvbCBpbnRlcmZhY2UgdG8gYmUgYSBNZWRpYVBsYXllckNvbnRyb2xFeHQKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgZGlzYWJsZVVuc3VwcG9ydGVkQnV0dG9ucygpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChtUGxheVBhdXNlQnV0dG9uICE9IG51bGwgJiYgIWNhblBhdXNlKCkpIHsKLSAgICAgICAgICAgICAgICBtUGxheVBhdXNlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1SZXdCdXR0b24gIT0gbnVsbCAmJiAhY2FuU2Vla0JhY2t3YXJkKCkpIHsKLSAgICAgICAgICAgICAgICBtUmV3QnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1GZndkQnV0dG9uICE9IG51bGwgJiYgIWNhblNlZWtGb3J3YXJkKCkpIHsKLSAgICAgICAgICAgICAgICBtRmZ3ZEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIFRPRE8gV2hhdCB3ZSByZWFsbHkgc2hvdWxkIGRvIGlzIGFkZCBhIGNhblNlZWsgdG8gdGhlIE1lZGlhUGxheWVyQ29udHJvbCBpbnRlcmZhY2U7Ci0gICAgICAgICAgICAvLyB0aGlzIHNjaGVtZSBjYW4gYnJlYWsgdGhlIGNhc2Ugd2hlbiBhcHBsaWNhdGlvbnMgd2FudCB0byBhbGxvdyBzZWVrIHRocm91Z2ggdGhlCi0gICAgICAgICAgICAvLyBwcm9ncmVzcyBiYXIgYnV0IGRpc2FibGUgZm9yd2FyZC9iYWNrd2FyZCBidXR0b25zLgotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIC8vIEhvd2V2ZXIsIGN1cnJlbnRseSB0aGUgZmxhZ3MgU0VFS19CQUNLV0FSRF9BVkFJTEFCTEUsIFNFRUtfRk9SV0FSRF9BVkFJTEFCTEUsCi0gICAgICAgICAgICAvLyBhbmQgU0VFS19BVkFJTEFCTEUgYXJlIGFsbCAodW4pc2V0IHRvZ2V0aGVyOyBhcyBzdWNoIHRoZSBhZm9yZW1lbnRpb25lZCBpc3N1ZQotICAgICAgICAgICAgLy8gc2hvdWxkbid0IGFyaXNlIGluIGV4aXN0aW5nIGFwcGxpY2F0aW9ucy4KLSAgICAgICAgICAgIGlmIChtUHJvZ3Jlc3MgIT0gbnVsbCAmJiAhY2FuU2Vla0JhY2t3YXJkKCkgJiYgIWNhblNlZWtGb3J3YXJkKCkpIHsKLSAgICAgICAgICAgICAgICBtUHJvZ3Jlc3Muc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEluY29tcGF0aWJsZUNsYXNzQ2hhbmdlRXJyb3IgZXgpIHsKLSAgICAgICAgICAgIC8vIFdlIHdlcmUgZ2l2ZW4gYW4gb2xkIHZlcnNpb24gb2YgdGhlIGludGVyZmFjZSwgdGhhdCBkb2Vzbid0IGhhdmUKLSAgICAgICAgICAgIC8vIHRoZSBjYW5QYXVzZS9jYW5TZWVrWFlaIG1ldGhvZHMuIFRoaXMgaXMgT0ssIGl0IGp1c3QgbWVhbnMgd2UKLSAgICAgICAgICAgIC8vIGFzc3VtZSB0aGUgbWVkaWEgY2FuIGJlIHBhdXNlZCBhbmQgc2Vla2VkLCBhbmQgc28gd2UgZG9uJ3QgZGlzYWJsZQotICAgICAgICAgICAgLy8gdGhlIGJ1dHRvbnMuCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIFJ1bm5hYmxlIG1VcGRhdGVQcm9ncmVzcyA9IG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgIGludCBwb3MgPSBzZXRQcm9ncmVzcygpOwotICAgICAgICAgICAgYm9vbGVhbiBpc1Nob3dpbmcgPSBtSW5zdGFuY2UuZ2V0VmlzaWJpbGl0eSgpID09IFZpZXcuVklTSUJMRTsKLSAgICAgICAgICAgIGlmICghbURyYWdnaW5nICYmIGlzU2hvd2luZyAmJiBpc1BsYXlpbmcoKSkgewotICAgICAgICAgICAgICAgIG1JbnN0YW5jZS5wb3N0RGVsYXllZChtVXBkYXRlUHJvZ3Jlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX1BST0dSRVNTX1VQREFURV9USU1FX01TIC0gKHBvcyAlIERFRkFVTFRfUFJPR1JFU1NfVVBEQVRFX1RJTUVfTVMpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBwcml2YXRlIFN0cmluZyBzdHJpbmdGb3JUaW1lKGludCB0aW1lTXMpIHsKLSAgICAgICAgaW50IHRvdGFsU2Vjb25kcyA9IHRpbWVNcyAvIDEwMDA7Ci0KLSAgICAgICAgaW50IHNlY29uZHMgPSB0b3RhbFNlY29uZHMgJSA2MDsKLSAgICAgICAgaW50IG1pbnV0ZXMgPSAodG90YWxTZWNvbmRzIC8gNjApICUgNjA7Ci0gICAgICAgIGludCBob3VycyA9IHRvdGFsU2Vjb25kcyAvIDM2MDA7Ci0KLSAgICAgICAgbUZvcm1hdEJ1aWxkZXIuc2V0TGVuZ3RoKDApOwotICAgICAgICBpZiAoaG91cnMgPiAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUZvcm1hdHRlci5mb3JtYXQoIiVkOiUwMmQ6JTAyZCIsIGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzKS50b1N0cmluZygpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG1Gb3JtYXR0ZXIuZm9ybWF0KCIlMDJkOiUwMmQiLCBtaW51dGVzLCBzZWNvbmRzKS50b1N0cmluZygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgc2V0UHJvZ3Jlc3MoKSB7Ci0gICAgICAgIGlmIChtQ29udHJvbGxlciA9PSBudWxsIHx8IG1EcmFnZ2luZykgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IHBvc2l0aW9uT25Qcm9ncmVzc0JhciA9IDA7Ci0gICAgICAgIGludCBjdXJyZW50UG9zaXRpb24gPSBnZXRDdXJyZW50UG9zaXRpb24oKTsKLSAgICAgICAgaWYgKG1EdXJhdGlvbiA+IDApIHsKLSAgICAgICAgICAgIHBvc2l0aW9uT25Qcm9ncmVzc0JhciA9IChpbnQpIChNQVhfUFJPR1JFU1MgKiAobG9uZykgY3VycmVudFBvc2l0aW9uIC8gbUR1cmF0aW9uKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobVByb2dyZXNzICE9IG51bGwgJiYgY3VycmVudFBvc2l0aW9uICE9IG1EdXJhdGlvbikgewotICAgICAgICAgICAgbVByb2dyZXNzLnNldFByb2dyZXNzKHBvc2l0aW9uT25Qcm9ncmVzc0Jhcik7Ci0gICAgICAgICAgICAvLyBJZiB0aGUgbWVkaWEgaXMgYSBsb2NhbCBmaWxlLCB0aGVyZSBpcyBubyBuZWVkIHRvIHNldCBhIGJ1ZmZlciwgc28gc2V0IHNlY29uZGFyeQotICAgICAgICAgICAgLy8gcHJvZ3Jlc3MgdG8gbWF4aW11bS4KLSAgICAgICAgICAgIGlmIChnZXRCdWZmZXJQZXJjZW50YWdlKCkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgbVByb2dyZXNzLnNldFNlY29uZGFyeVByb2dyZXNzKE1BWF9QUk9HUkVTUyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1Qcm9ncmVzcy5zZXRTZWNvbmRhcnlQcm9ncmVzcyhnZXRCdWZmZXJQZXJjZW50YWdlKCkgKiAxMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobUVuZFRpbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgbUVuZFRpbWUuc2V0VGV4dChzdHJpbmdGb3JUaW1lKG1EdXJhdGlvbikpOwotCi0gICAgICAgIH0KLSAgICAgICAgaWYgKG1DdXJyZW50VGltZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtQ3VycmVudFRpbWUuc2V0VGV4dChzdHJpbmdGb3JUaW1lKGN1cnJlbnRQb3NpdGlvbikpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1Jc0FkdmVydGlzZW1lbnQpIHsKLSAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgcmVtYWluaW5nIG51bWJlciBvZiBzZWNvbmRzIHVudGlsIHRoZSBmaXJzdCA1IHNlY29uZHMgb2YgdGhlCi0gICAgICAgICAgICAvLyBhZHZlcnRpc2VtZW50LgotICAgICAgICAgICAgaWYgKG1BZFNraXBWaWV3ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoY3VycmVudFBvc2l0aW9uIDw9IEFEX1NLSVBfV0FJVF9USU1FX01TKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtQWRTa2lwVmlldy5nZXRWaXNpYmlsaXR5KCkgPT0gVmlldy5HT05FKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQWRTa2lwVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNraXBUaW1lVGV4dCA9IG1SZXNvdXJjZXMuZ2V0U3RyaW5nKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFIuc3RyaW5nLk1lZGlhQ29udHJvbFZpZXcyX2FkX3NraXBfd2FpdF90aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQURfU0tJUF9XQUlUX1RJTUVfTVMgLSBjdXJyZW50UG9zaXRpb24pIC8gMTAwMCArIDEpKTsKLSAgICAgICAgICAgICAgICAgICAgbUFkU2tpcFZpZXcuc2V0VGV4dChza2lwVGltZVRleHQpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtQWRTa2lwVmlldy5nZXRWaXNpYmlsaXR5KCkgPT0gVmlldy5WSVNJQkxFKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQWRTa2lwVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtTmV4dEJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgbU5leHRCdXR0b24uY2xlYXJDb2xvckZpbHRlcigpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSByZW1haW5pbmcgbnVtYmVyIG9mIHNlY29uZHMgb2YgdGhlIGFkdmVydGlzZW1lbnQuCi0gICAgICAgICAgICBpZiAobUFkUmVtYWluaW5nVmlldyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaW50IHJlbWFpbmluZ1RpbWUgPQotICAgICAgICAgICAgICAgICAgICAgICAgKG1EdXJhdGlvbiAtIGN1cnJlbnRQb3NpdGlvbiA8IDApID8gMCA6IChtRHVyYXRpb24gLSBjdXJyZW50UG9zaXRpb24pOwotICAgICAgICAgICAgICAgIFN0cmluZyByZW1haW5pbmdUaW1lVGV4dCA9IG1SZXNvdXJjZXMuZ2V0U3RyaW5nKAotICAgICAgICAgICAgICAgICAgICAgICAgUi5zdHJpbmcuTWVkaWFDb250cm9sVmlldzJfYWRfcmVtYWluaW5nX3RpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdGb3JUaW1lKHJlbWFpbmluZ1RpbWUpKTsKLSAgICAgICAgICAgICAgICBtQWRSZW1haW5pbmdWaWV3LnNldFRleHQocmVtYWluaW5nVGltZVRleHQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjdXJyZW50UG9zaXRpb247Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRvZ2dsZVBhdXNlUGxheVN0YXRlKCkgewotICAgICAgICBpZiAoaXNQbGF5aW5nKCkpIHsKLSAgICAgICAgICAgIG1Db250cm9scy5wYXVzZSgpOwotICAgICAgICAgICAgbVBsYXlQYXVzZUJ1dHRvbi5zZXRJbWFnZURyYXdhYmxlKAotICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldERyYXdhYmxlKFIuZHJhd2FibGUuaWNfcGxheV9jaXJjbGVfZmlsbGVkLCBudWxsKSk7Ci0gICAgICAgICAgICBtUGxheVBhdXNlQnV0dG9uLnNldENvbnRlbnREZXNjcmlwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXRTdHJpbmcoUi5zdHJpbmcubWN2Ml9wbGF5X2J1dHRvbl9kZXNjKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtQ29udHJvbHMucGxheSgpOwotICAgICAgICAgICAgbVBsYXlQYXVzZUJ1dHRvbi5zZXRJbWFnZURyYXdhYmxlKAotICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldERyYXdhYmxlKFIuZHJhd2FibGUuaWNfcGF1c2VfY2lyY2xlX2ZpbGxlZCwgbnVsbCkpOwotICAgICAgICAgICAgbVBsYXlQYXVzZUJ1dHRvbi5zZXRDb250ZW50RGVzY3JpcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0U3RyaW5nKFIuc3RyaW5nLm1jdjJfcGF1c2VfYnV0dG9uX2Rlc2MpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIFRoZXJlIGFyZSB0d28gc2NlbmFyaW9zIHRoYXQgY2FuIHRyaWdnZXIgdGhlIHNlZWtiYXIgbGlzdGVuZXIgdG8gdHJpZ2dlcjoKLSAgICAvLwotICAgIC8vIFRoZSBmaXJzdCBpcyB0aGUgdXNlciB1c2luZyB0aGUgdG91Y2hwYWQgdG8gYWRqdXN0IHRoZSBwb3NpdGl0b24gb2YgdGhlCi0gICAgLy8gc2Vla2JhcidzIHRodW1iLiBJbiB0aGlzIGNhc2Ugb25TdGFydFRyYWNraW5nVG91Y2ggaXMgY2FsbGVkIGZvbGxvd2VkIGJ5Ci0gICAgLy8gYSBudW1iZXIgb2Ygb25Qcm9ncmVzc0NoYW5nZWQgbm90aWZpY2F0aW9ucywgY29uY2x1ZGVkIGJ5IG9uU3RvcFRyYWNraW5nVG91Y2guCi0gICAgLy8gV2UncmUgc2V0dGluZyB0aGUgZmllbGQgIm1EcmFnZ2luZyIgdG8gdHJ1ZSBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSBkcmFnZ2luZwotICAgIC8vIHNlc3Npb24gdG8gYXZvaWQganVtcHMgaW4gdGhlIHBvc2l0aW9uIGluIGNhc2Ugb2Ygb25nb2luZyBwbGF5YmFjay4KLSAgICAvLwotICAgIC8vIFRoZSBzZWNvbmQgc2NlbmFyaW8gaW52b2x2ZXMgdGhlIHVzZXIgb3BlcmF0aW5nIHRoZSBzY3JvbGwgYmFsbCwgaW4gdGhpcwotICAgIC8vIGNhc2UgdGhlcmUgV09OJ1QgQkUgb25TdGFydFRyYWNraW5nVG91Y2gvb25TdG9wVHJhY2tpbmdUb3VjaCBub3RpZmljYXRpb25zLAotICAgIC8vIHdlIHdpbGwgc2ltcGx5IGFwcGx5IHRoZSB1cGRhdGVkIHBvc2l0aW9uIHdpdGhvdXQgc3VzcGVuZGluZyByZWd1bGFyIHVwZGF0ZXMuCi0gICAgcHJpdmF0ZSBmaW5hbCBPblNlZWtCYXJDaGFuZ2VMaXN0ZW5lciBtU2Vla0xpc3RlbmVyID0gbmV3IE9uU2Vla0JhckNoYW5nZUxpc3RlbmVyKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25TdGFydFRyYWNraW5nVG91Y2goU2Vla0JhciBiYXIpIHsKLSAgICAgICAgICAgIGlmICghbVNlZWtBdmFpbGFibGUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1EcmFnZ2luZyA9IHRydWU7Ci0KLSAgICAgICAgICAgIC8vIEJ5IHJlbW92aW5nIHRoZXNlIHBlbmRpbmcgcHJvZ3Jlc3MgbWVzc2FnZXMgd2UgbWFrZSBzdXJlCi0gICAgICAgICAgICAvLyB0aGF0IGEpIHdlIHdvbid0IHVwZGF0ZSB0aGUgcHJvZ3Jlc3Mgd2hpbGUgdGhlIHVzZXIgYWRqdXN0cwotICAgICAgICAgICAgLy8gdGhlIHNlZWtiYXIgYW5kIGIpIG9uY2UgdGhlIHVzZXIgaXMgZG9uZSBkcmFnZ2luZyB0aGUgdGh1bWIKLSAgICAgICAgICAgIC8vIHdlIHdpbGwgcG9zdCBvbmUgb2YgdGhlc2UgbWVzc2FnZXMgdG8gdGhlIHF1ZXVlIGFnYWluIGFuZAotICAgICAgICAgICAgLy8gdGhpcyBlbnN1cmVzIHRoYXQgdGhlcmUgd2lsbCBiZSBleGFjdGx5IG9uZSBtZXNzYWdlIHF1ZXVlZCB1cC4KLSAgICAgICAgICAgIG1JbnN0YW5jZS5yZW1vdmVDYWxsYmFja3MobVVwZGF0ZVByb2dyZXNzKTsKLQotICAgICAgICAgICAgLy8gQ2hlY2sgaWYgcGxheWJhY2sgaXMgY3VycmVudGx5IHN0b3BwZWQuIEluIHRoaXMgY2FzZSwgdXBkYXRlIHRoZSBwYXVzZSBidXR0b24gdG8KLSAgICAgICAgICAgIC8vIHNob3cgdGhlIHBsYXkgaW1hZ2UgaW5zdGVhZCBvZiB0aGUgcmVwbGF5IGltYWdlLgotICAgICAgICAgICAgaWYgKG1Jc1N0b3BwZWQpIHsKLSAgICAgICAgICAgICAgICBtUGxheVBhdXNlQnV0dG9uLnNldEltYWdlRHJhd2FibGUoCi0gICAgICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldERyYXdhYmxlKFIuZHJhd2FibGUuaWNfcGxheV9jaXJjbGVfZmlsbGVkLCBudWxsKSk7Ci0gICAgICAgICAgICAgICAgbVBsYXlQYXVzZUJ1dHRvbi5zZXRDb250ZW50RGVzY3JpcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldFN0cmluZyhSLnN0cmluZy5tY3YyX3BsYXlfYnV0dG9uX2Rlc2MpKTsKLSAgICAgICAgICAgICAgICBtSXNTdG9wcGVkID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Qcm9ncmVzc0NoYW5nZWQoU2Vla0JhciBiYXIsIGludCBwcm9ncmVzcywgYm9vbGVhbiBmcm9tVXNlcikgewotICAgICAgICAgICAgaWYgKCFtU2Vla0F2YWlsYWJsZSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghZnJvbVVzZXIpIHsKLSAgICAgICAgICAgICAgICAvLyBXZSdyZSBub3QgaW50ZXJlc3RlZCBpbiBwcm9ncmFtbWF0aWNhbGx5IGdlbmVyYXRlZCBjaGFuZ2VzIHRvCi0gICAgICAgICAgICAgICAgLy8gdGhlIHByb2dyZXNzIGJhcidzIHBvc2l0aW9uLgotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtRHVyYXRpb24gPiAwKSB7Ci0gICAgICAgICAgICAgICAgaW50IHBvc2l0aW9uID0gKGludCkgKCgobG9uZykgbUR1cmF0aW9uICogcHJvZ3Jlc3MpIC8gTUFYX1BST0dSRVNTKTsKLSAgICAgICAgICAgICAgICBtQ29udHJvbHMuc2Vla1RvKHBvc2l0aW9uKTsKLQotICAgICAgICAgICAgICAgIGlmIChtQ3VycmVudFRpbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFRpbWUuc2V0VGV4dChzdHJpbmdGb3JUaW1lKHBvc2l0aW9uKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU3RvcFRyYWNraW5nVG91Y2goU2Vla0JhciBiYXIpIHsKLSAgICAgICAgICAgIGlmICghbVNlZWtBdmFpbGFibGUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtRHJhZ2dpbmcgPSBmYWxzZTsKLQotICAgICAgICAgICAgc2V0UHJvZ3Jlc3MoKTsKLQotICAgICAgICAgICAgLy8gRW5zdXJlIHRoYXQgcHJvZ3Jlc3MgaXMgcHJvcGVybHkgdXBkYXRlZCBpbiB0aGUgZnV0dXJlLAotICAgICAgICAgICAgLy8gdGhlIGNhbGwgdG8gc2hvdygpIGRvZXMgbm90IGd1YXJhbnRlZSB0aGlzIGJlY2F1c2UgaXQgaXMgYQotICAgICAgICAgICAgLy8gbm8tb3AgaWYgd2UgYXJlIGFscmVhZHkgc2hvd2luZy4KLSAgICAgICAgICAgIG1JbnN0YW5jZS5wb3N0KG1VcGRhdGVQcm9ncmVzcyk7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHJpdmF0ZSBmaW5hbCBWaWV3Lk9uQ2xpY2tMaXN0ZW5lciBtUGxheVBhdXNlTGlzdGVuZXIgPSBuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgewotICAgICAgICAgICAgdG9nZ2xlUGF1c2VQbGF5U3RhdGUoKTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBwcml2YXRlIGZpbmFsIFZpZXcuT25DbGlja0xpc3RlbmVyIG1SZXdMaXN0ZW5lciA9IG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7Ci0gICAgICAgICAgICBpbnQgcG9zID0gZ2V0Q3VycmVudFBvc2l0aW9uKCkgLSBSRVdJTkRfVElNRV9NUzsKLSAgICAgICAgICAgIG1Db250cm9scy5zZWVrVG8ocG9zKTsKLSAgICAgICAgICAgIHNldFByb2dyZXNzKCk7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHJpdmF0ZSBmaW5hbCBWaWV3Lk9uQ2xpY2tMaXN0ZW5lciBtRmZ3ZExpc3RlbmVyID0gbmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKLSAgICAgICAgICAgIGludCBwb3MgPSBnZXRDdXJyZW50UG9zaXRpb24oKSArIEZPUldBUkRfVElNRV9NUzsKLSAgICAgICAgICAgIG1Db250cm9scy5zZWVrVG8ocG9zKTsKLSAgICAgICAgICAgIHNldFByb2dyZXNzKCk7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHJpdmF0ZSBmaW5hbCBWaWV3Lk9uQ2xpY2tMaXN0ZW5lciBtTmV4dExpc3RlbmVyID0gbmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKLSAgICAgICAgICAgIG1Db250cm9scy5za2lwVG9OZXh0KCk7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHJpdmF0ZSBmaW5hbCBWaWV3Lk9uQ2xpY2tMaXN0ZW5lciBtUHJldkxpc3RlbmVyID0gbmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKLSAgICAgICAgICAgIG1Db250cm9scy5za2lwVG9QcmV2aW91cygpOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHByaXZhdGUgZmluYWwgVmlldy5PbkNsaWNrTGlzdGVuZXIgbUJhY2tMaXN0ZW5lciA9IG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7Ci0gICAgICAgICAgICAvLyBUT0RPOiBpbXBsZW1lbnQKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBwcml2YXRlIGZpbmFsIFZpZXcuT25DbGlja0xpc3RlbmVyIG1TdWJ0aXRsZUxpc3RlbmVyID0gbmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKLSAgICAgICAgICAgIG1TZXR0aW5nc01vZGUgPSBTRVRUSU5HU19NT0RFX1NVQlRJVExFX1RSQUNLOwotICAgICAgICAgICAgbVN1YlNldHRpbmdzQWRhcHRlci5zZXRUZXh0cyhtU3VidGl0bGVEZXNjcmlwdGlvbnNMaXN0KTsKLSAgICAgICAgICAgIG1TdWJTZXR0aW5nc0FkYXB0ZXIuc2V0Q2hlY2tQb3NpdGlvbihtU2VsZWN0ZWRTdWJ0aXRsZVRyYWNrSW5kZXgpOwotICAgICAgICAgICAgZGlzcGxheVNldHRpbmdzV2luZG93KG1TdWJTZXR0aW5nc0FkYXB0ZXIpOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHByaXZhdGUgZmluYWwgVmlldy5PbkNsaWNrTGlzdGVuZXIgbVZpZGVvUXVhbGl0eUxpc3RlbmVyID0gbmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKLSAgICAgICAgICAgIG1TZXR0aW5nc01vZGUgPSBTRVRUSU5HU19NT0RFX1ZJREVPX1FVQUxJVFk7Ci0gICAgICAgICAgICBtU3ViU2V0dGluZ3NBZGFwdGVyLnNldFRleHRzKG1WaWRlb1F1YWxpdHlMaXN0KTsKLSAgICAgICAgICAgIG1TdWJTZXR0aW5nc0FkYXB0ZXIuc2V0Q2hlY2tQb3NpdGlvbihtU2VsZWN0ZWRWaWRlb1F1YWxpdHlJbmRleCk7Ci0gICAgICAgICAgICBkaXNwbGF5U2V0dGluZ3NXaW5kb3cobVN1YlNldHRpbmdzQWRhcHRlcik7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHJpdmF0ZSBmaW5hbCBWaWV3Lk9uQ2xpY2tMaXN0ZW5lciBtRnVsbFNjcmVlbkxpc3RlbmVyID0gbmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKLSAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNFbnRlcmluZ0Z1bGxTY3JlZW4gPSAhbUlzRnVsbFNjcmVlbjsKLSAgICAgICAgICAgIC8vIFRPRE86IFJlLWFycmFuZ2UgdGhlIGJ1dHRvbiBsYXlvdXRzIGFjY29yZGluZyB0byB0aGUgVVguCi0gICAgICAgICAgICBpZiAoaXNFbnRlcmluZ0Z1bGxTY3JlZW4pIHsKLSAgICAgICAgICAgICAgICBtRnVsbFNjcmVlbkJ1dHRvbi5zZXRJbWFnZURyYXdhYmxlKAotICAgICAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmljX2Z1bGxzY3JlZW5fZXhpdCwgbnVsbCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtRnVsbFNjcmVlbkJ1dHRvbi5zZXRJbWFnZURyYXdhYmxlKAotICAgICAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmljX2Z1bGxzY3JlZW4sIG51bGwpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEJ1bmRsZSBhcmdzID0gbmV3IEJ1bmRsZSgpOwotICAgICAgICAgICAgYXJncy5wdXRCb29sZWFuKEFSR1VNRU5UX0tFWV9GVUxMU0NSRUVOLCBpc0VudGVyaW5nRnVsbFNjcmVlbik7Ci0gICAgICAgICAgICBtQ29udHJvbGxlci5zZW5kQ29tbWFuZChDT01NQU5EX1NFVF9GVUxMU0NSRUVOLCBhcmdzLCBudWxsKTsKLQotICAgICAgICAgICAgbUlzRnVsbFNjcmVlbiA9IGlzRW50ZXJpbmdGdWxsU2NyZWVuOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHByaXZhdGUgZmluYWwgVmlldy5PbkNsaWNrTGlzdGVuZXIgbU92ZXJmbG93UmlnaHRMaXN0ZW5lciA9IG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7Ci0gICAgICAgICAgICBtQmFzaWNDb250cm9scy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICBtRXh0cmFDb250cm9scy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHJpdmF0ZSBmaW5hbCBWaWV3Lk9uQ2xpY2tMaXN0ZW5lciBtT3ZlcmZsb3dMZWZ0TGlzdGVuZXIgPSBuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgewotICAgICAgICAgICAgbUJhc2ljQ29udHJvbHMuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgbUV4dHJhQ29udHJvbHMuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHByaXZhdGUgZmluYWwgVmlldy5PbkNsaWNrTGlzdGVuZXIgbU11dGVCdXR0b25MaXN0ZW5lciA9IG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7Ci0gICAgICAgICAgICBpZiAoIW1Jc011dGUpIHsKLSAgICAgICAgICAgICAgICBtTXV0ZUJ1dHRvbi5zZXRJbWFnZURyYXdhYmxlKAotICAgICAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmljX211dGUsIG51bGwpKTsKLSAgICAgICAgICAgICAgICBtTXV0ZUJ1dHRvbi5zZXRDb250ZW50RGVzY3JpcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldFN0cmluZyhSLnN0cmluZy5tY3YyX211dGVkX2J1dHRvbl9kZXNjKSk7Ci0gICAgICAgICAgICAgICAgbUlzTXV0ZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgbUNvbnRyb2xsZXIuc2VuZENvbW1hbmQoQ09NTUFORF9NVVRFLCBudWxsLCBudWxsKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbU11dGVCdXR0b24uc2V0SW1hZ2VEcmF3YWJsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5pY191bm11dGUsIG51bGwpKTsKLSAgICAgICAgICAgICAgICBtTXV0ZUJ1dHRvbi5zZXRDb250ZW50RGVzY3JpcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldFN0cmluZyhSLnN0cmluZy5tY3YyX3VubXV0ZWRfYnV0dG9uX2Rlc2MpKTsKLSAgICAgICAgICAgICAgICBtSXNNdXRlID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgbUNvbnRyb2xsZXIuc2VuZENvbW1hbmQoQ09NTUFORF9VTk1VVEUsIG51bGwsIG51bGwpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHByaXZhdGUgZmluYWwgVmlldy5PbkNsaWNrTGlzdGVuZXIgbVNldHRpbmdzQnV0dG9uTGlzdGVuZXIgPSBuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgewotICAgICAgICAgICAgbVNldHRpbmdzTW9kZSA9IFNFVFRJTkdTX01PREVfTUFJTjsKLSAgICAgICAgICAgIG1TZXR0aW5nc0FkYXB0ZXIuc2V0U3ViVGV4dHMobVNldHRpbmdzU3ViVGV4dHNMaXN0KTsKLSAgICAgICAgICAgIGRpc3BsYXlTZXR0aW5nc1dpbmRvdyhtU2V0dGluZ3NBZGFwdGVyKTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBwcml2YXRlIGZpbmFsIEFkYXB0ZXJWaWV3Lk9uSXRlbUNsaWNrTGlzdGVuZXIgbVNldHRpbmdzSXRlbUNsaWNrTGlzdGVuZXIKLSAgICAgICAgICAgID0gbmV3IEFkYXB0ZXJWaWV3Lk9uSXRlbUNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbkl0ZW1DbGljayhBZGFwdGVyVmlldzw/PiBwYXJlbnQsIFZpZXcgdmlldywgaW50IHBvc2l0aW9uLCBsb25nIGlkKSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKG1TZXR0aW5nc01vZGUpIHsKLSAgICAgICAgICAgICAgICBjYXNlIFNFVFRJTkdTX01PREVfTUFJTjoKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uID09IFNFVFRJTkdTX01PREVfQVVESU9fVFJBQ0spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TdWJTZXR0aW5nc0FkYXB0ZXIuc2V0VGV4dHMobUF1ZGlvVHJhY2tMaXN0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TdWJTZXR0aW5nc0FkYXB0ZXIuc2V0Q2hlY2tQb3NpdGlvbihtU2VsZWN0ZWRBdWRpb1RyYWNrSW5kZXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgbVNldHRpbmdzTW9kZSA9IFNFVFRJTkdTX01PREVfQVVESU9fVFJBQ0s7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocG9zaXRpb24gPT0gU0VUVElOR1NfTU9ERV9QTEFZQkFDS19TUEVFRCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbVN1YlNldHRpbmdzQWRhcHRlci5zZXRUZXh0cyhtUGxheWJhY2tTcGVlZFRleHRMaXN0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TdWJTZXR0aW5nc0FkYXB0ZXIuc2V0Q2hlY2tQb3NpdGlvbihtU2VsZWN0ZWRTcGVlZEluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TZXR0aW5nc01vZGUgPSBTRVRUSU5HU19NT0RFX1BMQVlCQUNLX1NQRUVEOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBvc2l0aW9uID09IFNFVFRJTkdTX01PREVfSEVMUCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogaW1wbGVtZW50IHRoaXMuCi0gICAgICAgICAgICAgICAgICAgICAgICBtU2V0dGluZ3NXaW5kb3cuZGlzbWlzcygpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGRpc3BsYXlTZXR0aW5nc1dpbmRvdyhtU3ViU2V0dGluZ3NBZGFwdGVyKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBTRVRUSU5HU19NT0RFX0FVRElPX1RSQUNLOgotICAgICAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24gIT0gbVNlbGVjdGVkQXVkaW9UcmFja0luZGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU2VsZWN0ZWRBdWRpb1RyYWNrSW5kZXggPSBwb3NpdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQXVkaW9UcmFja0NvdW50ID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1bmRsZSBleHRyYSA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYS5wdXRJbnQoS0VZX1NFTEVDVEVEX0FVRElPX0lOREVYLCBwb3NpdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRyb2xsZXIuc2VuZENvbW1hbmQoQ09NTUFORF9TRUxFQ1RfQVVESU9fVFJBQ0ssIGV4dHJhLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1TZXR0aW5nc1N1YlRleHRzTGlzdC5zZXQoU0VUVElOR1NfTU9ERV9BVURJT19UUkFDSywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN1YlNldHRpbmdzQWRhcHRlci5nZXRNYWluVGV4dChwb3NpdGlvbikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1TZXR0aW5nc1dpbmRvdy5kaXNtaXNzKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgU0VUVElOR1NfTU9ERV9QTEFZQkFDS19TUEVFRDoKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uICE9IG1TZWxlY3RlZFNwZWVkSW5kZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TZWxlY3RlZFNwZWVkSW5kZXggPSBwb3NpdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgICAgIEJ1bmRsZSBleHRyYSA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhLnB1dEZsb2F0KEtFWV9QTEFZQkFDS19TUEVFRCwgbVBsYXliYWNrU3BlZWRMaXN0LmdldChwb3NpdGlvbikpOwotICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRyb2xsZXIuc2VuZENvbW1hbmQoQ09NTUFORF9TRVRfUExBWUJBQ0tfU1BFRUQsIGV4dHJhLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TZXR0aW5nc1N1YlRleHRzTGlzdC5zZXQoU0VUVElOR1NfTU9ERV9QTEFZQkFDS19TUEVFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN1YlNldHRpbmdzQWRhcHRlci5nZXRNYWluVGV4dChwb3NpdGlvbikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1TZXR0aW5nc1dpbmRvdy5kaXNtaXNzKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgU0VUVElOR1NfTU9ERV9IRUxQOgotICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcy4KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBTRVRUSU5HU19NT0RFX1NVQlRJVExFX1RSQUNLOgotICAgICAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24gIT0gbVNlbGVjdGVkU3VidGl0bGVUcmFja0luZGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU2VsZWN0ZWRTdWJ0aXRsZVRyYWNrSW5kZXggPSBwb3NpdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbiA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdW5kbGUgZXh0cmEgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmEucHV0SW50KEtFWV9TRUxFQ1RFRF9TVUJUSVRMRV9JTkRFWCwgcG9zaXRpb24gLSAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29udHJvbGxlci5zZW5kQ29tbWFuZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhQ29udHJvbFZpZXcySW1wbC5DT01NQU5EX1NIT1dfU1VCVElUTEUsIGV4dHJhLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3VidGl0bGVCdXR0b24uc2V0SW1hZ2VEcmF3YWJsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5pY19zdWJ0aXRsZV9vbiwgbnVsbCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdWJ0aXRsZUJ1dHRvbi5zZXRDb250ZW50RGVzY3JpcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldFN0cmluZyhSLnN0cmluZy5tY3YyX2NjX2lzX29uKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN1YnRpdGxlSXNFbmFibGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRyb2xsZXIuc2VuZENvbW1hbmQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYUNvbnRyb2xWaWV3MkltcGwuQ09NTUFORF9ISURFX1NVQlRJVExFLCBudWxsLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3VidGl0bGVCdXR0b24uc2V0SW1hZ2VEcmF3YWJsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5pY19zdWJ0aXRsZV9vZmYsIG51bGwpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3VidGl0bGVCdXR0b24uc2V0Q29udGVudERlc2NyaXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXRTdHJpbmcoUi5zdHJpbmcubWN2Ml9jY19pc19vZmYpKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdWJ0aXRsZUlzRW5hYmxlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1TZXR0aW5nc1dpbmRvdy5kaXNtaXNzKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgU0VUVElOR1NfTU9ERV9WSURFT19RVUFMSVRZOgotICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBhZGQgc3VwcG9ydCBmb3IgdmlkZW8gcXVhbGl0eQotICAgICAgICAgICAgICAgICAgICBtU2VsZWN0ZWRWaWRlb1F1YWxpdHlJbmRleCA9IHBvc2l0aW9uOwotICAgICAgICAgICAgICAgICAgICBtU2V0dGluZ3NXaW5kb3cuZGlzbWlzcygpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlRHVyYXRpb24oKSB7Ci0gICAgICAgIGlmIChtTWV0YWRhdGEgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKG1NZXRhZGF0YS5jb250YWluc0tleShNZWRpYU1ldGFkYXRhLk1FVEFEQVRBX0tFWV9EVVJBVElPTikpIHsKLSAgICAgICAgICAgICAgICBtRHVyYXRpb24gPSAoaW50KSBtTWV0YWRhdGEuZ2V0TG9uZyhNZWRpYU1ldGFkYXRhLk1FVEFEQVRBX0tFWV9EVVJBVElPTik7Ci0gICAgICAgICAgICAgICAgLy8gdXBkYXRlIHByb2dyZXNzIGJhcgotICAgICAgICAgICAgICAgIHNldFByb2dyZXNzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlVGl0bGUoKSB7Ci0gICAgICAgIGlmIChtTWV0YWRhdGEgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKG1NZXRhZGF0YS5jb250YWluc0tleShNZWRpYU1ldGFkYXRhLk1FVEFEQVRBX0tFWV9USVRMRSkpIHsKLSAgICAgICAgICAgICAgICBtVGl0bGVWaWV3LnNldFRleHQobU1ldGFkYXRhLmdldFN0cmluZyhNZWRpYU1ldGFkYXRhLk1FVEFEQVRBX0tFWV9USVRMRSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gVGhlIHRpdGxlIGJhciBpcyBtYWRlIHVwIG9mIHR3byBzZXBhcmF0ZSBMaW5lYXJMYXlvdXRzLiBJZiB0aGUgc3VtIG9mIHRoZSB0d28gYmFycyBhcmUKLSAgICAvLyBncmVhdGVyIHRoYW4gdGhlIGxlbmd0aCBvZiB0aGUgdGl0bGUgYmFyLCByZWR1Y2UgdGhlIHNpemUgb2YgdGhlIGxlZnQgYmFyICh3aGljaCBtYWtlcyB0aGUKLSAgICAvLyBUZXh0VmlldyB0aGF0IGNvbnRhaW5zIHRoZSB0aXRsZSBvZiB0aGUgbWVkaWEgZmlsZSBzaHJpbmspLgotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVUaXRsZUJhckxheW91dCgpIHsKLSAgICAgICAgaWYgKG1UaXRsZUJhciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbnQgdGl0bGVCYXJXaWR0aCA9IG1UaXRsZUJhci5nZXRXaWR0aCgpOwotCi0gICAgICAgICAgICBWaWV3IGxlZnRCYXIgPSBtVGl0bGVCYXIuZmluZFZpZXdCeUlkKFIuaWQudGl0bGVfYmFyX2xlZnQpOwotICAgICAgICAgICAgVmlldyByaWdodEJhciA9IG1UaXRsZUJhci5maW5kVmlld0J5SWQoUi5pZC50aXRsZV9iYXJfcmlnaHQpOwotICAgICAgICAgICAgaW50IGxlZnRCYXJXaWR0aCA9IGxlZnRCYXIuZ2V0V2lkdGgoKTsKLSAgICAgICAgICAgIGludCByaWdodEJhcldpZHRoID0gcmlnaHRCYXIuZ2V0V2lkdGgoKTsKLQotICAgICAgICAgICAgUmVsYXRpdmVMYXlvdXQuTGF5b3V0UGFyYW1zIHBhcmFtcyA9Ci0gICAgICAgICAgICAgICAgICAgIChSZWxhdGl2ZUxheW91dC5MYXlvdXRQYXJhbXMpIGxlZnRCYXIuZ2V0TGF5b3V0UGFyYW1zKCk7Ci0gICAgICAgICAgICBpZiAobGVmdEJhcldpZHRoICsgcmlnaHRCYXJXaWR0aCA+IHRpdGxlQmFyV2lkdGgpIHsKLSAgICAgICAgICAgICAgICBwYXJhbXMud2lkdGggPSB0aXRsZUJhcldpZHRoIC0gcmlnaHRCYXJXaWR0aDsKLSAgICAgICAgICAgICAgICBtT3JpZ2luYWxMZWZ0QmFyV2lkdGggPSBsZWZ0QmFyV2lkdGg7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGxlZnRCYXJXaWR0aCArIHJpZ2h0QmFyV2lkdGggPCB0aXRsZUJhcldpZHRoICYmIG1PcmlnaW5hbExlZnRCYXJXaWR0aCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgcGFyYW1zLndpZHRoID0gbU9yaWdpbmFsTGVmdEJhcldpZHRoOwotICAgICAgICAgICAgICAgIG1PcmlnaW5hbExlZnRCYXJXaWR0aCA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBsZWZ0QmFyLnNldExheW91dFBhcmFtcyhwYXJhbXMpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUF1ZGlvTWV0YWRhdGEoKSB7Ci0gICAgICAgIGlmIChtTWVkaWFUeXBlICE9IE1FRElBX1RZUEVfTVVTSUMpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtTWV0YWRhdGEgIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIHRpdGxlVGV4dCA9ICIiOwotICAgICAgICAgICAgU3RyaW5nIGFydGlzdFRleHQgPSAiIjsKLSAgICAgICAgICAgIGlmIChtTWV0YWRhdGEuY29udGFpbnNLZXkoTWVkaWFNZXRhZGF0YS5NRVRBREFUQV9LRVlfVElUTEUpKSB7Ci0gICAgICAgICAgICAgICAgdGl0bGVUZXh0ID0gbU1ldGFkYXRhLmdldFN0cmluZyhNZWRpYU1ldGFkYXRhLk1FVEFEQVRBX0tFWV9USVRMRSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRpdGxlVGV4dCA9IG1SZXNvdXJjZXMuZ2V0U3RyaW5nKFIuc3RyaW5nLm1jdjJfbXVzaWNfdGl0bGVfdW5rbm93bl90ZXh0KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1NZXRhZGF0YS5jb250YWluc0tleShNZWRpYU1ldGFkYXRhLk1FVEFEQVRBX0tFWV9BUlRJU1QpKSB7Ci0gICAgICAgICAgICAgICAgYXJ0aXN0VGV4dCA9IG1NZXRhZGF0YS5nZXRTdHJpbmcoTWVkaWFNZXRhZGF0YS5NRVRBREFUQV9LRVlfQVJUSVNUKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYXJ0aXN0VGV4dCA9IG1SZXNvdXJjZXMuZ2V0U3RyaW5nKFIuc3RyaW5nLm1jdjJfbXVzaWNfYXJ0aXN0X3Vua25vd25fdGV4dCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFVwZGF0ZSB0aXRsZSBmb3IgRW1iZWRkZWQgc2l6ZSB0eXBlCi0gICAgICAgICAgICBtVGl0bGVWaWV3LnNldFRleHQodGl0bGVUZXh0ICsgIiAtICIgKyBhcnRpc3RUZXh0KTsKLQotICAgICAgICAgICAgLy8gU2V0IHRvIHRydWUgdG8gdXBkYXRlIGxheW91dCBpbnNpZGUgb25NZWFzdXJlKCkKLSAgICAgICAgICAgIG1OZWVkVVhVcGRhdGUgPSB0cnVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUxheW91dCgpIHsKLSAgICAgICAgaWYgKG1Jc0FkdmVydGlzZW1lbnQpIHsKLSAgICAgICAgICAgIG1SZXdCdXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgbUZmd2RCdXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgbVByZXZCdXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgbVRpbWVWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLQotICAgICAgICAgICAgbUFkU2tpcFZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgbUFkUmVtYWluaW5nVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICBtQWRFeHRlcm5hbExpbmsuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotCi0gICAgICAgICAgICBtUHJvZ3Jlc3Muc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICBtTmV4dEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgIG1OZXh0QnV0dG9uLnNldENvbG9yRmlsdGVyKFIuY29sb3IuZ3JheSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtUmV3QnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgIG1GZndkQnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgIG1QcmV2QnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgIG1UaW1lVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0KLSAgICAgICAgICAgIG1BZFNraXBWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgIG1BZFJlbWFpbmluZ1ZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgbUFkRXh0ZXJuYWxMaW5rLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLQotICAgICAgICAgICAgbVByb2dyZXNzLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICBtTmV4dEJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgbU5leHRCdXR0b24uY2xlYXJDb2xvckZpbHRlcigpOwotICAgICAgICAgICAgZGlzYWJsZVVuc3VwcG9ydGVkQnV0dG9ucygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUxheW91dChpbnQgbWF4SWNvbkNvdW50LCBpbnQgZnVsbEljb25TaXplLCBpbnQgZW1iZWRkZWRJY29uU2l6ZSwKLSAgICAgICAgICAgICBpbnQgbWFyZ2luU2l6ZSwgaW50IGN1cnJXaWR0aCwgaW50IGN1cnJIZWlnaHQsIGludCBzY3JlZW5XaWR0aCwgaW50IHNjcmVlbkhlaWdodCkgewotICAgICAgICBpbnQgZnVsbEJvdHRvbUJhclJpZ2h0V2lkdGhNYXggPSBmdWxsSWNvblNpemUgKiBtYXhJY29uQ291bnQKLSAgICAgICAgICAgICAgICArIG1hcmdpblNpemUgKiAobWF4SWNvbkNvdW50ICogMik7Ci0gICAgICAgIGludCBlbWJlZGRlZEJvdHRvbUJhclJpZ2h0V2lkdGhNYXggPSBlbWJlZGRlZEljb25TaXplICogbWF4SWNvbkNvdW50Ci0gICAgICAgICAgICAgICAgKyBtYXJnaW5TaXplICogKG1heEljb25Db3VudCAqIDIpOwotICAgICAgICBpbnQgZnVsbFdpZHRoID0gbVRyYW5zcG9ydENvbnRyb2xzLmdldFdpZHRoKCkgKyBtVGltZVZpZXcuZ2V0V2lkdGgoKQotICAgICAgICAgICAgICAgICsgZnVsbEJvdHRvbUJhclJpZ2h0V2lkdGhNYXg7Ci0gICAgICAgIGludCBlbWJlZGRlZFdpZHRoID0gbVRpbWVWaWV3LmdldFdpZHRoKCkgKyBlbWJlZGRlZEJvdHRvbUJhclJpZ2h0V2lkdGhNYXg7Ci0gICAgICAgIGludCBzY3JlZW5NYXhMZW5ndGggPSBNYXRoLm1heChzY3JlZW5XaWR0aCwgc2NyZWVuSGVpZ2h0KTsKLQotICAgICAgICBpZiAoZnVsbFdpZHRoID4gc2NyZWVuTWF4TGVuZ3RoKSB7Ci0gICAgICAgICAgICAvLyBUT0RPOiBzY3JlZW4gbWF5IGJlIHNtYWxsZXIgdGhhbiB0aGUgbGVuZ3RoIG5lZWRlZCBmb3IgRnVsbCBzaXplLgotICAgICAgICB9Ci0KLSAgICAgICAgYm9vbGVhbiBpc0Z1bGxTaXplID0gKG1NZWRpYVR5cGUgPT0gTUVESUFfVFlQRV9ERUZBVUxUKSA/IChjdXJyV2lkdGggPT0gc2NyZWVuTWF4TGVuZ3RoKSA6Ci0gICAgICAgICAgICAgICAgKGN1cnJXaWR0aCA9PSBzY3JlZW5XaWR0aCAmJiBjdXJySGVpZ2h0ID09IHNjcmVlbkhlaWdodCk7Ci0KLSAgICAgICAgaWYgKGlzRnVsbFNpemUpIHsKLSAgICAgICAgICAgIGlmIChtU2l6ZVR5cGUgIT0gU0laRV9UWVBFX0ZVTEwpIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVMYXlvdXRGb3JTaXplQ2hhbmdlKFNJWkVfVFlQRV9GVUxMKTsKLSAgICAgICAgICAgICAgICBpZiAobU1lZGlhVHlwZSA9PSBNRURJQV9UWVBFX01VU0lDKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1UaXRsZVZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChlbWJlZGRlZFdpZHRoIDw9IGN1cnJXaWR0aCkgewotICAgICAgICAgICAgaWYgKG1TaXplVHlwZSAhPSBTSVpFX1RZUEVfRU1CRURERUQpIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVMYXlvdXRGb3JTaXplQ2hhbmdlKFNJWkVfVFlQRV9FTUJFRERFRCk7Ci0gICAgICAgICAgICAgICAgaWYgKG1NZWRpYVR5cGUgPT0gTUVESUFfVFlQRV9NVVNJQykgewotICAgICAgICAgICAgICAgICAgICBtVGl0bGVWaWV3LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAobVNpemVUeXBlICE9IFNJWkVfVFlQRV9NSU5JTUFMKSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlTGF5b3V0Rm9yU2l6ZUNoYW5nZShTSVpFX1RZUEVfTUlOSU1BTCk7Ci0gICAgICAgICAgICAgICAgaWYgKG1NZWRpYVR5cGUgPT0gTUVESUFfVFlQRV9NVVNJQykgewotICAgICAgICAgICAgICAgICAgICBtVGl0bGVWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlTGF5b3V0Rm9yU2l6ZUNoYW5nZShpbnQgc2l6ZVR5cGUpIHsKLSAgICAgICAgbVNpemVUeXBlID0gc2l6ZVR5cGU7Ci0gICAgICAgIFJlbGF0aXZlTGF5b3V0LkxheW91dFBhcmFtcyB0aW1lVmlld1BhcmFtcyA9Ci0gICAgICAgICAgICAgICAgKFJlbGF0aXZlTGF5b3V0LkxheW91dFBhcmFtcykgbVRpbWVWaWV3LmdldExheW91dFBhcmFtcygpOwotICAgICAgICBTZWVrQmFyIHNlZWtlciA9IChTZWVrQmFyKSBtUHJvZ3Jlc3M7Ci0gICAgICAgIHN3aXRjaCAobVNpemVUeXBlKSB7Ci0gICAgICAgICAgICBjYXNlIFNJWkVfVFlQRV9FTUJFRERFRDoKLSAgICAgICAgICAgICAgICAvLyBSZWxhdGluZyB0byBUaXRsZSBCYXIKLSAgICAgICAgICAgICAgICBtVGl0bGVCYXIuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgICAgIG1CYWNrQnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLQotICAgICAgICAgICAgICAgIC8vIFJlbGF0aW5nIHRvIEZ1bGwgU2NyZWVuIEJ1dHRvbgotICAgICAgICAgICAgICAgIG1NaW5pbWFsRXh0cmFWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgICAgICBtRnVsbFNjcmVlbkJ1dHRvbiA9IG1Cb3R0b21CYXJSaWdodFZpZXcuZmluZFZpZXdCeUlkKFIuaWQuZnVsbHNjcmVlbik7Ci0gICAgICAgICAgICAgICAgbUZ1bGxTY3JlZW5CdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG1GdWxsU2NyZWVuTGlzdGVuZXIpOwotCi0gICAgICAgICAgICAgICAgLy8gUmVsYXRpbmcgdG8gQ2VudGVyIFZpZXcKLSAgICAgICAgICAgICAgICBtQ2VudGVyVmlldy5yZW1vdmVBbGxWaWV3cygpOwotICAgICAgICAgICAgICAgIG1Cb3R0b21CYXJMZWZ0Vmlldy5yZW1vdmVWaWV3KG1UcmFuc3BvcnRDb250cm9scyk7Ci0gICAgICAgICAgICAgICAgbUJvdHRvbUJhckxlZnRWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgICAgICBtVHJhbnNwb3J0Q29udHJvbHMgPSBpbmZsYXRlVHJhbnNwb3J0Q29udHJvbHMoUi5sYXlvdXQuZW1iZWRkZWRfdHJhbnNwb3J0X2NvbnRyb2xzKTsKLSAgICAgICAgICAgICAgICBtQ2VudGVyVmlldy5hZGRWaWV3KG1UcmFuc3BvcnRDb250cm9scyk7Ci0KLSAgICAgICAgICAgICAgICAvLyBSZWxhdGluZyB0byBQcm9ncmVzcyBCYXIKLSAgICAgICAgICAgICAgICBzZWVrZXIuc2V0VGh1bWIobVJlc291cmNlcy5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmN1c3RvbV9wcm9ncmVzc190aHVtYikpOwotICAgICAgICAgICAgICAgIG1Qcm9ncmVzc0J1ZmZlci5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBSZWxhdGluZyB0byBCb3R0b20gQmFyCi0gICAgICAgICAgICAgICAgbUJvdHRvbUJhci5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICAgICAgaWYgKHRpbWVWaWV3UGFyYW1zLmdldFJ1bGUoUmVsYXRpdmVMYXlvdXQuTEVGVF9PRikgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICB0aW1lVmlld1BhcmFtcy5yZW1vdmVSdWxlKFJlbGF0aXZlTGF5b3V0LkxFRlRfT0YpOwotICAgICAgICAgICAgICAgICAgICB0aW1lVmlld1BhcmFtcy5hZGRSdWxlKFJlbGF0aXZlTGF5b3V0LlJJR0hUX09GLCBSLmlkLmJvdHRvbV9iYXJfbGVmdCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBTSVpFX1RZUEVfRlVMTDoKLSAgICAgICAgICAgICAgICAvLyBSZWxhdGluZyB0byBUaXRsZSBCYXIKLSAgICAgICAgICAgICAgICBtVGl0bGVCYXIuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgICAgIG1CYWNrQnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLQotICAgICAgICAgICAgICAgIC8vIFJlbGF0aW5nIHRvIEZ1bGwgU2NyZWVuIEJ1dHRvbgotICAgICAgICAgICAgICAgIG1NaW5pbWFsRXh0cmFWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgICAgICBtRnVsbFNjcmVlbkJ1dHRvbiA9IG1Cb3R0b21CYXJSaWdodFZpZXcuZmluZFZpZXdCeUlkKFIuaWQuZnVsbHNjcmVlbik7Ci0gICAgICAgICAgICAgICAgbUZ1bGxTY3JlZW5CdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG1GdWxsU2NyZWVuTGlzdGVuZXIpOwotCi0gICAgICAgICAgICAgICAgLy8gUmVsYXRpbmcgdG8gQ2VudGVyIFZpZXcKLSAgICAgICAgICAgICAgICBtQ2VudGVyVmlldy5yZW1vdmVBbGxWaWV3cygpOwotICAgICAgICAgICAgICAgIG1Cb3R0b21CYXJMZWZ0Vmlldy5yZW1vdmVWaWV3KG1UcmFuc3BvcnRDb250cm9scyk7Ci0gICAgICAgICAgICAgICAgbVRyYW5zcG9ydENvbnRyb2xzID0gaW5mbGF0ZVRyYW5zcG9ydENvbnRyb2xzKFIubGF5b3V0LmZ1bGxfdHJhbnNwb3J0X2NvbnRyb2xzKTsKLSAgICAgICAgICAgICAgICBtQm90dG9tQmFyTGVmdFZpZXcuYWRkVmlldyhtVHJhbnNwb3J0Q29udHJvbHMsIDApOwotICAgICAgICAgICAgICAgIG1Cb3R0b21CYXJMZWZ0Vmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBSZWxhdGluZyB0byBQcm9ncmVzcyBCYXIKLSAgICAgICAgICAgICAgICBzZWVrZXIuc2V0VGh1bWIobVJlc291cmNlcy5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmN1c3RvbV9wcm9ncmVzc190aHVtYikpOwotICAgICAgICAgICAgICAgIG1Qcm9ncmVzc0J1ZmZlci5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBSZWxhdGluZyB0byBCb3R0b20gQmFyCi0gICAgICAgICAgICAgICAgbUJvdHRvbUJhci5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICAgICAgaWYgKHRpbWVWaWV3UGFyYW1zLmdldFJ1bGUoUmVsYXRpdmVMYXlvdXQuUklHSFRfT0YpICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgdGltZVZpZXdQYXJhbXMucmVtb3ZlUnVsZShSZWxhdGl2ZUxheW91dC5SSUdIVF9PRik7Ci0gICAgICAgICAgICAgICAgICAgIHRpbWVWaWV3UGFyYW1zLmFkZFJ1bGUoUmVsYXRpdmVMYXlvdXQuTEVGVF9PRiwgUi5pZC5ib3R0b21fYmFyX3JpZ2h0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFNJWkVfVFlQRV9NSU5JTUFMOgotICAgICAgICAgICAgICAgIC8vIFJlbGF0aW5nIHRvIFRpdGxlIEJhcgotICAgICAgICAgICAgICAgIG1UaXRsZUJhci5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICAgICAgbUJhY2tCdXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotCi0gICAgICAgICAgICAgICAgLy8gUmVsYXRpbmcgdG8gRnVsbCBTY3JlZW4gQnV0dG9uCi0gICAgICAgICAgICAgICAgbU1pbmltYWxFeHRyYVZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgICAgIG1GdWxsU2NyZWVuQnV0dG9uID0gbU1pbmltYWxFeHRyYVZpZXcuZmluZFZpZXdCeUlkKFIuaWQuZnVsbHNjcmVlbik7Ci0gICAgICAgICAgICAgICAgbUZ1bGxTY3JlZW5CdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG1GdWxsU2NyZWVuTGlzdGVuZXIpOwotCi0gICAgICAgICAgICAgICAgLy8gUmVsYXRpbmcgdG8gQ2VudGVyIFZpZXcKLSAgICAgICAgICAgICAgICBtQ2VudGVyVmlldy5yZW1vdmVBbGxWaWV3cygpOwotICAgICAgICAgICAgICAgIG1Cb3R0b21CYXJMZWZ0Vmlldy5yZW1vdmVWaWV3KG1UcmFuc3BvcnRDb250cm9scyk7Ci0gICAgICAgICAgICAgICAgbVRyYW5zcG9ydENvbnRyb2xzID0gaW5mbGF0ZVRyYW5zcG9ydENvbnRyb2xzKFIubGF5b3V0Lm1pbmltYWxfdHJhbnNwb3J0X2NvbnRyb2xzKTsKLSAgICAgICAgICAgICAgICBtQ2VudGVyVmlldy5hZGRWaWV3KG1UcmFuc3BvcnRDb250cm9scyk7Ci0KLSAgICAgICAgICAgICAgICAvLyBSZWxhdGluZyB0byBQcm9ncmVzcyBCYXIKLSAgICAgICAgICAgICAgICBzZWVrZXIuc2V0VGh1bWIobnVsbCk7Ci0gICAgICAgICAgICAgICAgbVByb2dyZXNzQnVmZmVyLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLQotICAgICAgICAgICAgICAgIC8vIFJlbGF0aW5nIHRvIEJvdHRvbSBCYXIKLSAgICAgICAgICAgICAgICBtQm90dG9tQmFyLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBtVGltZVZpZXcuc2V0TGF5b3V0UGFyYW1zKHRpbWVWaWV3UGFyYW1zKTsKLQotICAgICAgICBpZiAoaXNQbGF5aW5nKCkpIHsKLSAgICAgICAgICAgIG1QbGF5UGF1c2VCdXR0b24uc2V0SW1hZ2VEcmF3YWJsZSgKLSAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmljX3BhdXNlX2NpcmNsZV9maWxsZWQsIG51bGwpKTsKLSAgICAgICAgICAgIG1QbGF5UGF1c2VCdXR0b24uc2V0Q29udGVudERlc2NyaXB0aW9uKAotICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldFN0cmluZyhSLnN0cmluZy5tY3YyX3BhdXNlX2J1dHRvbl9kZXNjKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtUGxheVBhdXNlQnV0dG9uLnNldEltYWdlRHJhd2FibGUoCi0gICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5pY19wbGF5X2NpcmNsZV9maWxsZWQsIG51bGwpKTsKLSAgICAgICAgICAgIG1QbGF5UGF1c2VCdXR0b24uc2V0Q29udGVudERlc2NyaXB0aW9uKAotICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldFN0cmluZyhSLnN0cmluZy5tY3YyX3BsYXlfYnV0dG9uX2Rlc2MpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtSXNGdWxsU2NyZWVuKSB7Ci0gICAgICAgICAgICBtRnVsbFNjcmVlbkJ1dHRvbi5zZXRJbWFnZURyYXdhYmxlKAotICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldERyYXdhYmxlKFIuZHJhd2FibGUuaWNfZnVsbHNjcmVlbl9leGl0LCBudWxsKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtRnVsbFNjcmVlbkJ1dHRvbi5zZXRJbWFnZURyYXdhYmxlKAotICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldERyYXdhYmxlKFIuZHJhd2FibGUuaWNfZnVsbHNjcmVlbiwgbnVsbCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBWaWV3IGluZmxhdGVUcmFuc3BvcnRDb250cm9scyhpbnQgbGF5b3V0SWQpIHsKLSAgICAgICAgVmlldyB2ID0gQXBpSGVscGVyLmluZmxhdGVMaWJMYXlvdXQobUluc3RhbmNlLmdldENvbnRleHQoKSwgbGF5b3V0SWQpOwotICAgICAgICBtUGxheVBhdXNlQnV0dG9uID0gdi5maW5kVmlld0J5SWQoUi5pZC5wYXVzZSk7Ci0gICAgICAgIGlmIChtUGxheVBhdXNlQnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1QbGF5UGF1c2VCdXR0b24ucmVxdWVzdEZvY3VzKCk7Ci0gICAgICAgICAgICBtUGxheVBhdXNlQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihtUGxheVBhdXNlTGlzdGVuZXIpOwotICAgICAgICB9Ci0gICAgICAgIG1GZndkQnV0dG9uID0gdi5maW5kVmlld0J5SWQoUi5pZC5mZndkKTsKLSAgICAgICAgaWYgKG1GZndkQnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1GZndkQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihtRmZ3ZExpc3RlbmVyKTsKLSAgICAgICAgICAgIGlmIChtTWVkaWFUeXBlID09IE1FRElBX1RZUEVfTVVTSUMpIHsKLSAgICAgICAgICAgICAgICBtRmZ3ZEJ1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbVJld0J1dHRvbiA9IHYuZmluZFZpZXdCeUlkKFIuaWQucmV3KTsKLSAgICAgICAgaWYgKG1SZXdCdXR0b24gIT0gbnVsbCkgewotICAgICAgICAgICAgbVJld0J1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobVJld0xpc3RlbmVyKTsKLSAgICAgICAgICAgIGlmIChtTWVkaWFUeXBlID09IE1FRElBX1RZUEVfTVVTSUMpIHsKLSAgICAgICAgICAgICAgICBtUmV3QnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyBUT0RPOiBBZGQgc3VwcG9ydCBmb3IgTmV4dCBhbmQgUHJldmlvdXMgYnV0dG9ucwotICAgICAgICBtTmV4dEJ1dHRvbiA9IHYuZmluZFZpZXdCeUlkKFIuaWQubmV4dCk7Ci0gICAgICAgIGlmIChtTmV4dEJ1dHRvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtTmV4dEJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobU5leHRMaXN0ZW5lcik7Ci0gICAgICAgICAgICBtTmV4dEJ1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgIH0KLSAgICAgICAgbVByZXZCdXR0b24gPSB2LmZpbmRWaWV3QnlJZChSLmlkLnByZXYpOwotICAgICAgICBpZiAobVByZXZCdXR0b24gIT0gbnVsbCkgewotICAgICAgICAgICAgbVByZXZCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG1QcmV2TGlzdGVuZXIpOwotICAgICAgICAgICAgbVByZXZCdXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB2OwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBpbml0aWFsaXplU2V0dGluZ3NMaXN0cygpIHsKLSAgICAgICAgbVNldHRpbmdzTWFpblRleHRzTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICBtU2V0dGluZ3NNYWluVGV4dHNMaXN0LmFkZCgKLSAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldFN0cmluZyhSLnN0cmluZy5NZWRpYUNvbnRyb2xWaWV3Ml9hdWRpb190cmFja190ZXh0KSk7Ci0gICAgICAgIG1TZXR0aW5nc01haW5UZXh0c0xpc3QuYWRkKAotICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0U3RyaW5nKFIuc3RyaW5nLk1lZGlhQ29udHJvbFZpZXcyX3BsYXliYWNrX3NwZWVkX3RleHQpKTsKLSAgICAgICAgbVNldHRpbmdzTWFpblRleHRzTGlzdC5hZGQoCi0gICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXRTdHJpbmcoUi5zdHJpbmcuTWVkaWFDb250cm9sVmlldzJfaGVscF90ZXh0KSk7Ci0KLSAgICAgICAgbVNldHRpbmdzU3ViVGV4dHNMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgIG1TZXR0aW5nc1N1YlRleHRzTGlzdC5hZGQoCi0gICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXRTdHJpbmcoUi5zdHJpbmcuTWVkaWFDb250cm9sVmlldzJfYXVkaW9fdHJhY2tfbm9uZV90ZXh0KSk7Ci0gICAgICAgIG1TZXR0aW5nc1N1YlRleHRzTGlzdC5hZGQoCi0gICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXRTdHJpbmdBcnJheSgKLSAgICAgICAgICAgICAgICAgICAgICAgIFIuYXJyYXkuTWVkaWFDb250cm9sVmlldzJfcGxheWJhY2tfc3BlZWRzKVtQTEFZQkFDS19TUEVFRF8xeF9JTkRFWF0pOwotICAgICAgICBtU2V0dGluZ3NTdWJUZXh0c0xpc3QuYWRkKFJFU09VUkNFX0VNUFRZKTsKLQotICAgICAgICBtU2V0dGluZ3NJY29uSWRzTGlzdCA9IG5ldyBBcnJheUxpc3Q8SW50ZWdlcj4oKTsKLSAgICAgICAgbVNldHRpbmdzSWNvbklkc0xpc3QuYWRkKFIuZHJhd2FibGUuaWNfYXVkaW90cmFjayk7Ci0gICAgICAgIG1TZXR0aW5nc0ljb25JZHNMaXN0LmFkZChSLmRyYXdhYmxlLmljX3BsYXlfY2lyY2xlX2ZpbGxlZCk7Ci0gICAgICAgIG1TZXR0aW5nc0ljb25JZHNMaXN0LmFkZChSLmRyYXdhYmxlLmljX2hlbHApOwotCi0gICAgICAgIG1BdWRpb1RyYWNrTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICBtQXVkaW9UcmFja0xpc3QuYWRkKAotICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0U3RyaW5nKFIuc3RyaW5nLk1lZGlhQ29udHJvbFZpZXcyX2F1ZGlvX3RyYWNrX25vbmVfdGV4dCkpOwotCi0gICAgICAgIG1WaWRlb1F1YWxpdHlMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgIG1WaWRlb1F1YWxpdHlMaXN0LmFkZCgKLSAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldFN0cmluZyhSLnN0cmluZy5NZWRpYUNvbnRyb2xWaWV3Ml92aWRlb19xdWFsaXR5X2F1dG9fdGV4dCkpOwotCi0gICAgICAgIG1QbGF5YmFja1NwZWVkVGV4dExpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oQXJyYXlzLmFzTGlzdCgKLSAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldFN0cmluZ0FycmF5KFIuYXJyYXkuTWVkaWFDb250cm9sVmlldzJfcGxheWJhY2tfc3BlZWRzKSkpOwotICAgICAgICAvLyBTZWxlY3QgdGhlICIxeCIgc3BlZWQgYXMgdGhlIGRlZmF1bHQgdmFsdWUuCi0gICAgICAgIG1TZWxlY3RlZFNwZWVkSW5kZXggPSBQTEFZQkFDS19TUEVFRF8xeF9JTkRFWDsKLQotICAgICAgICBtUGxheWJhY2tTcGVlZExpc3QgPSBuZXcgQXJyYXlMaXN0PEZsb2F0PigpOwotICAgICAgICBpbnRbXSBzcGVlZHMgPSBtUmVzb3VyY2VzLmdldEludEFycmF5KFIuYXJyYXkuc3BlZWRfbXVsdGlwbGllZF9ieV8xMDApOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNwZWVkcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgZmxvYXQgc3BlZWQgPSAoZmxvYXQpIHNwZWVkc1tpXSAvIDEwMC4wZjsKLSAgICAgICAgICAgIG1QbGF5YmFja1NwZWVkTGlzdC5hZGQoc3BlZWQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGRpc3BsYXlTZXR0aW5nc1dpbmRvdyhCYXNlQWRhcHRlciBhZGFwdGVyKSB7Ci0gICAgICAgIC8vIFNldCBBZGFwdGVyCi0gICAgICAgIG1TZXR0aW5nc0xpc3RWaWV3LnNldEFkYXB0ZXIoYWRhcHRlcik7Ci0KLSAgICAgICAgLy8gU2V0IHdpZHRoIG9mIHdpbmRvdwotICAgICAgICBpbnQgaXRlbVdpZHRoID0gKG1TaXplVHlwZSA9PSBTSVpFX1RZUEVfRU1CRURERUQpCi0gICAgICAgICAgICAgICAgPyBtRW1iZWRkZWRTZXR0aW5nc0l0ZW1XaWR0aCA6IG1GdWxsU2V0dGluZ3NJdGVtV2lkdGg7Ci0gICAgICAgIG1TZXR0aW5nc1dpbmRvdy5zZXRXaWR0aChpdGVtV2lkdGgpOwotCi0gICAgICAgIC8vIENhbGN1bGF0ZSBoZWlnaHQgb2Ygd2luZG93IGFuZCBzaG93Ci0gICAgICAgIGludCBpdGVtSGVpZ2h0ID0gKG1TaXplVHlwZSA9PSBTSVpFX1RZUEVfRU1CRURERUQpCi0gICAgICAgICAgICAgICAgPyBtRW1iZWRkZWRTZXR0aW5nc0l0ZW1IZWlnaHQgOiBtRnVsbFNldHRpbmdzSXRlbUhlaWdodDsKLSAgICAgICAgaW50IHRvdGFsSGVpZ2h0ID0gYWRhcHRlci5nZXRDb3VudCgpICogaXRlbUhlaWdodDsKLSAgICAgICAgbVNldHRpbmdzV2luZG93LmRpc21pc3MoKTsKLSAgICAgICAgbVNldHRpbmdzV2luZG93LnNob3dBc0Ryb3BEb3duKG1JbnN0YW5jZSwgbVNldHRpbmdzV2luZG93TWFyZ2luLAotICAgICAgICAgICAgICAgIG1TZXR0aW5nc1dpbmRvd01hcmdpbiAtIHRvdGFsSGVpZ2h0LCBHcmF2aXR5LkJPVFRPTSB8IEdyYXZpdHkuUklHSFQpOwotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgTWVkaWFDb250cm9sbGVyQ2FsbGJhY2sgZXh0ZW5kcyBNZWRpYUNvbnRyb2xsZXIuQ2FsbGJhY2sgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25QbGF5YmFja1N0YXRlQ2hhbmdlZChQbGF5YmFja1N0YXRlIHN0YXRlKSB7Ci0gICAgICAgICAgICBtUGxheWJhY2tTdGF0ZSA9IHN0YXRlOwotCi0gICAgICAgICAgICAvLyBVcGRhdGUgcGF1c2UgYnV0dG9uIGRlcGVuZGluZyBvbiBwbGF5YmFjayBzdGF0ZSBmb3IgdGhlIGZvbGxvd2luZyB0d28gcmVhc29uczoKLSAgICAgICAgICAgIC8vICAgMSkgTmVlZCB0byBoYW5kbGUgY2FzZSB3aGVyZSBhcHAgY3VzdG9taXplcyBwbGF5YmFjayBzdGF0ZSBiZWhhdmlvciB3aGVuIGFwcAotICAgICAgICAgICAgLy8gICAgICBhY3Rpdml0eSBpcyByZXN1bWVkLgotICAgICAgICAgICAgLy8gICAyKSBOZWVkIHRvIGhhbmRsZSBjYXNlIHdoZXJlIHRoZSBtZWRpYSBmaWxlIHJlYWNoZXMgZW5kIG9mIGR1cmF0aW9uLgotICAgICAgICAgICAgaWYgKG1QbGF5YmFja1N0YXRlLmdldFN0YXRlKCkgIT0gbVByZXZTdGF0ZSkgewotICAgICAgICAgICAgICAgIHN3aXRjaCAobVBsYXliYWNrU3RhdGUuZ2V0U3RhdGUoKSkgewotICAgICAgICAgICAgICAgICAgICBjYXNlIFBsYXliYWNrU3RhdGUuU1RBVEVfUExBWUlORzoKLSAgICAgICAgICAgICAgICAgICAgICAgIG1QbGF5UGF1c2VCdXR0b24uc2V0SW1hZ2VEcmF3YWJsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmljX3BhdXNlX2NpcmNsZV9maWxsZWQsIG51bGwpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1QbGF5UGF1c2VCdXR0b24uc2V0Q29udGVudERlc2NyaXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldFN0cmluZyhSLnN0cmluZy5tY3YyX3BhdXNlX2J1dHRvbl9kZXNjKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtSW5zdGFuY2UucmVtb3ZlQ2FsbGJhY2tzKG1VcGRhdGVQcm9ncmVzcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtSW5zdGFuY2UucG9zdChtVXBkYXRlUHJvZ3Jlc3MpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgUGxheWJhY2tTdGF0ZS5TVEFURV9QQVVTRUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBtUGxheVBhdXNlQnV0dG9uLnNldEltYWdlRHJhd2FibGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5pY19wbGF5X2NpcmNsZV9maWxsZWQsIG51bGwpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1QbGF5UGF1c2VCdXR0b24uc2V0Q29udGVudERlc2NyaXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldFN0cmluZyhSLnN0cmluZy5tY3YyX3BsYXlfYnV0dG9uX2Rlc2MpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIFBsYXliYWNrU3RhdGUuU1RBVEVfU1RPUFBFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgIG1QbGF5UGF1c2VCdXR0b24uc2V0SW1hZ2VEcmF3YWJsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmljX3JlcGxheV9jaXJjbGVfZmlsbGVkLCBudWxsKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtUGxheVBhdXNlQnV0dG9uLnNldENvbnRlbnREZXNjcmlwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXRTdHJpbmcoUi5zdHJpbmcubWN2Ml9yZXBsYXlfYnV0dG9uX2Rlc2MpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Jc1N0b3BwZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbVByZXZTdGF0ZSA9IG1QbGF5YmFja1N0YXRlLmdldFN0YXRlKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtUGxheWJhY2tBY3Rpb25zICE9IG1QbGF5YmFja1N0YXRlLmdldEFjdGlvbnMoKSkgewotICAgICAgICAgICAgICAgIGxvbmcgbmV3QWN0aW9ucyA9IG1QbGF5YmFja1N0YXRlLmdldEFjdGlvbnMoKTsKLSAgICAgICAgICAgICAgICBpZiAoKG5ld0FjdGlvbnMgJiBQbGF5YmFja1N0YXRlLkFDVElPTl9QQVVTRSkgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBtUGxheVBhdXNlQnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKChuZXdBY3Rpb25zICYgUGxheWJhY2tTdGF0ZS5BQ1RJT05fUkVXSU5EKSAhPSAwCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBtTWVkaWFUeXBlICE9IE1FRElBX1RZUEVfTVVTSUMpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1SZXdCdXR0b24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbVJld0J1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKChuZXdBY3Rpb25zICYgUGxheWJhY2tTdGF0ZS5BQ1RJT05fRkFTVF9GT1JXQVJEKSAhPSAwCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBtTWVkaWFUeXBlICE9IE1FRElBX1RZUEVfTVVTSUMpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1GZndkQnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1GZndkQnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoKG5ld0FjdGlvbnMgJiBQbGF5YmFja1N0YXRlLkFDVElPTl9TRUVLX1RPKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TZWVrQXZhaWxhYmxlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtU2Vla0F2YWlsYWJsZSA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtUGxheWJhY2tBY3Rpb25zID0gbmV3QWN0aW9uczsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gQWRkIGJ1dHRvbnMgaWYgY3VzdG9tIGFjdGlvbnMgYXJlIHByZXNlbnQuCi0gICAgICAgICAgICBMaXN0PFBsYXliYWNrU3RhdGUuQ3VzdG9tQWN0aW9uPiBjdXN0b21BY3Rpb25zID0gbVBsYXliYWNrU3RhdGUuZ2V0Q3VzdG9tQWN0aW9ucygpOwotICAgICAgICAgICAgbUN1c3RvbUJ1dHRvbnMucmVtb3ZlQWxsVmlld3MoKTsKLSAgICAgICAgICAgIGlmIChjdXN0b21BY3Rpb25zLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgICAgICBmb3IgKFBsYXliYWNrU3RhdGUuQ3VzdG9tQWN0aW9uIGFjdGlvbiA6IGN1c3RvbUFjdGlvbnMpIHsKLSAgICAgICAgICAgICAgICAgICAgSW1hZ2VCdXR0b24gYnV0dG9uID0gbmV3IEltYWdlQnV0dG9uKG1JbnN0YW5jZS5nZXRDb250ZXh0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCAvKiBBdHRyaWJ1dGVTZXQgKi8sIDAgLyogU3R5bGUgKi8pOwotICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBBcHBseSBSLnN0eWxlLkJvdHRvbUJhckJ1dHRvbiB0byB0aGlzIGJ1dHRvbiB1c2luZyBsaWJyYXJ5IGNvbnRleHQuCi0gICAgICAgICAgICAgICAgICAgIC8vIFJlZmVyIENvbnN0cnVjdG9yIHdpdGggYXJndW1lbnQgKGludCBkZWZTdHlsZVJlcykgb2YgVmlldy5qYXZhCi0gICAgICAgICAgICAgICAgICAgIGJ1dHRvbi5zZXRJbWFnZVJlc291cmNlKGFjdGlvbi5nZXRJY29uKCkpOwotICAgICAgICAgICAgICAgICAgICBidXR0b24uc2V0VG9vbHRpcFRleHQoYWN0aW9uLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBhY3Rpb25TdHJpbmcgPSBhY3Rpb24uZ2V0QWN0aW9uKCkudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgYnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogQ3VycmVudGx5LCB3ZSBhcmUganVzdCBzZW5kaW5nIGV4dHJhcyB0aGF0IGNhbWUgZnJvbSBzZXNzaW9uLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElzIGl0IHRoZSByaWdodCBiZWhhdmlvcj8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29udHJvbHMuc2VuZEN1c3RvbUFjdGlvbihhY3Rpb25TdHJpbmcsIGFjdGlvbi5nZXRFeHRyYXMoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUluc3RhbmNlLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICAgICAgICAgIG1DdXN0b21CdXR0b25zLmFkZFZpZXcoYnV0dG9uKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25NZXRhZGF0YUNoYW5nZWQoTWVkaWFNZXRhZGF0YSBtZXRhZGF0YSkgewotICAgICAgICAgICAgbU1ldGFkYXRhID0gbWV0YWRhdGE7Ci0gICAgICAgICAgICB1cGRhdGVEdXJhdGlvbigpOwotICAgICAgICAgICAgdXBkYXRlVGl0bGUoKTsKLSAgICAgICAgICAgIHVwZGF0ZUF1ZGlvTWV0YWRhdGEoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblNlc3Npb25FdmVudChTdHJpbmcgZXZlbnQsIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgICAgIHN3aXRjaCAoZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIEVWRU5UX1VQREFURV9UUkFDS19TVEFUVVM6Ci0gICAgICAgICAgICAgICAgICAgIG1WaWRlb1RyYWNrQ291bnQgPSBleHRyYXMuZ2V0SW50KEtFWV9WSURFT19UUkFDS19DT1VOVCk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZXJlIGlzIG9uZSBvciBtb3JlIGF1ZGlvIHRyYWNrcywgYW5kIHRoaXMgaW5mb3JtYXRpb24gaGFzIG5vdCBiZWVuCi0gICAgICAgICAgICAgICAgICAgIC8vIHJlZmxlY3RlZCBpbnRvIHRoZSBTZXR0aW5ncyB3aW5kb3cgeWV0LCBhdXRvbWF0aWNhbGx5IGNoZWNrIHRoZSBmaXJzdCB0cmFjay4KLSAgICAgICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCB0aGUgQXVkaW8gVHJhY2sgc2VsZWN0aW9uIHdpbGwgYmUgZGVmYXVsdGVkIHRvICJOb25lIi4KLSAgICAgICAgICAgICAgICAgICAgbUF1ZGlvVHJhY2tDb3VudCA9IGV4dHJhcy5nZXRJbnQoS0VZX0FVRElPX1RSQUNLX0NPVU5UKTsKLSAgICAgICAgICAgICAgICAgICAgbUF1ZGlvVHJhY2tMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtQXVkaW9UcmFja0NvdW50ID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogYWRkIG1vcmUgdGV4dCBhYm91dCB0cmFjayBpbmZvLgotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtQXVkaW9UcmFja0NvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdHJhY2sgPSBtUmVzb3VyY2VzLmdldFN0cmluZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFIuc3RyaW5nLk1lZGlhQ29udHJvbFZpZXcyX2F1ZGlvX3RyYWNrX251bWJlcl90ZXh0LCBpICsgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvVHJhY2tMaXN0LmFkZCh0cmFjayk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGFuZ2Ugc3ViIHRleHQgaW5zaWRlIHRoZSBTZXR0aW5ncyB3aW5kb3cuCi0gICAgICAgICAgICAgICAgICAgICAgICBtU2V0dGluZ3NTdWJUZXh0c0xpc3Quc2V0KFNFVFRJTkdTX01PREVfQVVESU9fVFJBQ0ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BdWRpb1RyYWNrTGlzdC5nZXQoMCkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvVHJhY2tMaXN0LmFkZChtUmVzb3VyY2VzLmdldFN0cmluZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5zdHJpbmcuTWVkaWFDb250cm9sVmlldzJfYXVkaW9fdHJhY2tfbm9uZV90ZXh0KSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1WaWRlb1RyYWNrQ291bnQgPT0gMCAmJiBtQXVkaW9UcmFja0NvdW50ID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbU1lZGlhVHlwZSA9IE1FRElBX1RZUEVfTVVTSUM7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBtU3VidGl0bGVUcmFja0NvdW50ID0gZXh0cmFzLmdldEludChLRVlfU1VCVElUTEVfVFJBQ0tfQ09VTlQpOwotICAgICAgICAgICAgICAgICAgICBtU3VidGl0bGVEZXNjcmlwdGlvbnNMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtU3VidGl0bGVUcmFja0NvdW50ID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbVN1YnRpdGxlQnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TdWJ0aXRsZUJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgbVN1YnRpdGxlRGVzY3JpcHRpb25zTGlzdC5hZGQobVJlc291cmNlcy5nZXRTdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFIuc3RyaW5nLk1lZGlhQ29udHJvbFZpZXcyX3N1YnRpdGxlX29mZl90ZXh0KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1TdWJ0aXRsZVRyYWNrQ291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0cmFjayA9IG1SZXNvdXJjZXMuZ2V0U3RyaW5nKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5zdHJpbmcuTWVkaWFDb250cm9sVmlldzJfc3VidGl0bGVfdHJhY2tfbnVtYmVyX3RleHQsIGkgKyAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3VidGl0bGVEZXNjcmlwdGlvbnNMaXN0LmFkZCh0cmFjayk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU3VidGl0bGVCdXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgICAgICAgICAgICAgbVN1YnRpdGxlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgRVZFTlRfVVBEQVRFX01FRElBX1RZUEVfU1RBVFVTOgotICAgICAgICAgICAgICAgICAgICBib29sZWFuIG5ld1N0YXR1cyA9IGV4dHJhcy5nZXRCb29sZWFuKEtFWV9TVEFURV9JU19BRFZFUlRJU0VNRU5UKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1N0YXR1cyAhPSBtSXNBZHZlcnRpc2VtZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtSXNBZHZlcnRpc2VtZW50ID0gbmV3U3RhdHVzOwotICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlTGF5b3V0KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIFNldHRpbmdzQWRhcHRlciBleHRlbmRzIEJhc2VBZGFwdGVyIHsKLSAgICAgICAgcHJpdmF0ZSBMaXN0PEludGVnZXI+IG1JY29uSWRzOwotICAgICAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBtTWFpblRleHRzOwotICAgICAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBtU3ViVGV4dHM7Ci0KLSAgICAgICAgcHVibGljIFNldHRpbmdzQWRhcHRlcihMaXN0PFN0cmluZz4gbWFpblRleHRzLCBATnVsbGFibGUgTGlzdDxTdHJpbmc+IHN1YlRleHRzLAotICAgICAgICAgICAgICAgIEBOdWxsYWJsZSBMaXN0PEludGVnZXI+IGljb25JZHMpIHsKLSAgICAgICAgICAgIG1NYWluVGV4dHMgPSBtYWluVGV4dHM7Ci0gICAgICAgICAgICBtU3ViVGV4dHMgPSBzdWJUZXh0czsKLSAgICAgICAgICAgIG1JY29uSWRzID0gaWNvbklkczsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHVwZGF0ZVN1YlRleHRzKExpc3Q8U3RyaW5nPiBzdWJUZXh0cykgewotICAgICAgICAgICAgbVN1YlRleHRzID0gc3ViVGV4dHM7Ci0gICAgICAgICAgICBub3RpZnlEYXRhU2V0Q2hhbmdlZCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRNYWluVGV4dChpbnQgcG9zaXRpb24pIHsKLSAgICAgICAgICAgIGlmIChtTWFpblRleHRzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24gPCBtTWFpblRleHRzLnNpemUoKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbU1haW5UZXh0cy5nZXQocG9zaXRpb24pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBSRVNPVVJDRV9FTVBUWTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgaW50IGdldENvdW50KCkgewotICAgICAgICAgICAgcmV0dXJuIChtTWFpblRleHRzID09IG51bGwpID8gMCA6IG1NYWluVGV4dHMuc2l6ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBsb25nIGdldEl0ZW1JZChpbnQgcG9zaXRpb24pIHsKLSAgICAgICAgICAgIC8vIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViLS1kb2VzIG5vdCBoYXZlIGFueSBwdXJwb3NlIGhlcmUKLSAgICAgICAgICAgIC8vIFRPRE86IGltcGxlbWVudCB0aGlzLgotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIE9iamVjdCBnZXRJdGVtKGludCBwb3NpdGlvbikgewotICAgICAgICAgICAgLy8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWItLWRvZXMgbm90IGhhdmUgYW55IHB1cnBvc2UgaGVyZQotICAgICAgICAgICAgLy8gVE9ETzogaW1wbGVtZW50IHRoaXMuCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgVmlldyBnZXRWaWV3KGludCBwb3NpdGlvbiwgVmlldyBjb252ZXJ0VmlldywgVmlld0dyb3VwIGNvbnRhaW5lcikgewotICAgICAgICAgICAgVmlldyByb3c7Ci0gICAgICAgICAgICBpZiAobVNpemVUeXBlID09IFNJWkVfVFlQRV9GVUxMKSB7Ci0gICAgICAgICAgICAgICAgcm93ID0gQXBpSGVscGVyLmluZmxhdGVMaWJMYXlvdXQobUluc3RhbmNlLmdldENvbnRleHQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFIubGF5b3V0LmZ1bGxfc2V0dGluZ3NfbGlzdF9pdGVtKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcm93ID0gQXBpSGVscGVyLmluZmxhdGVMaWJMYXlvdXQobUluc3RhbmNlLmdldENvbnRleHQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFIubGF5b3V0LmVtYmVkZGVkX3NldHRpbmdzX2xpc3RfaXRlbSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBUZXh0VmlldyBtYWluVGV4dFZpZXcgPSAoVGV4dFZpZXcpIHJvdy5maW5kVmlld0J5SWQoUi5pZC5tYWluX3RleHQpOwotICAgICAgICAgICAgVGV4dFZpZXcgc3ViVGV4dFZpZXcgPSAoVGV4dFZpZXcpIHJvdy5maW5kVmlld0J5SWQoUi5pZC5zdWJfdGV4dCk7Ci0gICAgICAgICAgICBJbWFnZVZpZXcgaWNvblZpZXcgPSAoSW1hZ2VWaWV3KSByb3cuZmluZFZpZXdCeUlkKFIuaWQuaWNvbik7Ci0KLSAgICAgICAgICAgIC8vIFNldCBtYWluIHRleHQKLSAgICAgICAgICAgIG1haW5UZXh0Vmlldy5zZXRUZXh0KG1NYWluVGV4dHMuZ2V0KHBvc2l0aW9uKSk7Ci0KLSAgICAgICAgICAgIC8vIFJlbW92ZSBzdWIgdGV4dCBhbmQgY2VudGVyIHRoZSBtYWluIHRleHQgaWYgc3ViIHRleHRzIGRvIG5vdCBleGlzdCBhdCBhbGwgb3IgdGhlIHN1YgotICAgICAgICAgICAgLy8gdGV4dCBhdCB0aGlzIHBhcnRpY3VsYXIgcG9zaXRpb24gaXMgZW1wdHkuCi0gICAgICAgICAgICBpZiAobVN1YlRleHRzID09IG51bGwgfHwgbVN1YlRleHRzLmdldChwb3NpdGlvbikgPT0gUkVTT1VSQ0VfRU1QVFkpIHsKLSAgICAgICAgICAgICAgICBzdWJUZXh0Vmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgc2V0IHN1YiB0ZXh0LgotICAgICAgICAgICAgICAgIHN1YlRleHRWaWV3LnNldFRleHQobVN1YlRleHRzLmdldChwb3NpdGlvbikpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBSZW1vdmUgbWFpbiBpY29uIGFuZCBzZXQgdmlzaWJpbGl0eSB0byBnb25lIGlmIGljb25zIGFyZSBzZXQgdG8gbnVsbCBvciB0aGUgaWNvbiBhdAotICAgICAgICAgICAgLy8gdGhpcyBwYXJ0aWN1bGFyIHBvc2l0aW9uIGlzIHNldCB0byBSRVNPVVJDRV9OT05fRVhJU1RFTlQuCi0gICAgICAgICAgICBpZiAobUljb25JZHMgPT0gbnVsbCB8fCBtSWNvbklkcy5nZXQocG9zaXRpb24pID09IFJFU09VUkNFX05PTl9FWElTVEVOVCkgewotICAgICAgICAgICAgICAgIGljb25WaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCBzZXQgbWFpbiBpY29uLgotICAgICAgICAgICAgICAgIGljb25WaWV3LnNldEltYWdlRHJhd2FibGUobVJlc291cmNlcy5nZXREcmF3YWJsZShtSWNvbklkcy5nZXQocG9zaXRpb24pLCBudWxsKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcm93OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0U3ViVGV4dHMoTGlzdDxTdHJpbmc+IHN1YlRleHRzKSB7Ci0gICAgICAgICAgICBtU3ViVGV4dHMgPSBzdWJUZXh0czsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIFRPRE86IGV4dGVuZCB0aGlzIGNsYXNzIGZyb20gU2V0dGluZ3NBZGFwdGVyCi0gICAgcHJpdmF0ZSBjbGFzcyBTdWJTZXR0aW5nc0FkYXB0ZXIgZXh0ZW5kcyBCYXNlQWRhcHRlciB7Ci0gICAgICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IG1UZXh0czsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbUNoZWNrUG9zaXRpb247Ci0KLSAgICAgICAgcHVibGljIFN1YlNldHRpbmdzQWRhcHRlcihMaXN0PFN0cmluZz4gdGV4dHMsIGludCBjaGVja1Bvc2l0aW9uKSB7Ci0gICAgICAgICAgICBtVGV4dHMgPSB0ZXh0czsKLSAgICAgICAgICAgIG1DaGVja1Bvc2l0aW9uID0gY2hlY2tQb3NpdGlvbjsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWFpblRleHQoaW50IHBvc2l0aW9uKSB7Ci0gICAgICAgICAgICBpZiAobVRleHRzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24gPCBtVGV4dHMuc2l6ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBtVGV4dHMuZ2V0KHBvc2l0aW9uKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gUkVTT1VSQ0VfRU1QVFk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGludCBnZXRDb3VudCgpIHsKLSAgICAgICAgICAgIHJldHVybiAobVRleHRzID09IG51bGwpID8gMCA6IG1UZXh0cy5zaXplKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGxvbmcgZ2V0SXRlbUlkKGludCBwb3NpdGlvbikgewotICAgICAgICAgICAgLy8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWItLWRvZXMgbm90IGhhdmUgYW55IHB1cnBvc2UgaGVyZQotICAgICAgICAgICAgLy8gVE9ETzogaW1wbGVtZW50IHRoaXMuCi0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgT2JqZWN0IGdldEl0ZW0oaW50IHBvc2l0aW9uKSB7Ci0gICAgICAgICAgICAvLyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1Yi0tZG9lcyBub3QgaGF2ZSBhbnkgcHVycG9zZSBoZXJlCi0gICAgICAgICAgICAvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcy4KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBWaWV3IGdldFZpZXcoaW50IHBvc2l0aW9uLCBWaWV3IGNvbnZlcnRWaWV3LCBWaWV3R3JvdXAgY29udGFpbmVyKSB7Ci0gICAgICAgICAgICBWaWV3IHJvdzsKLSAgICAgICAgICAgIGlmIChtU2l6ZVR5cGUgPT0gU0laRV9UWVBFX0ZVTEwpIHsKLSAgICAgICAgICAgICAgICByb3cgPSBBcGlIZWxwZXIuaW5mbGF0ZUxpYkxheW91dChtSW5zdGFuY2UuZ2V0Q29udGV4dCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgUi5sYXlvdXQuZnVsbF9zdWJfc2V0dGluZ3NfbGlzdF9pdGVtKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcm93ID0gQXBpSGVscGVyLmluZmxhdGVMaWJMYXlvdXQobUluc3RhbmNlLmdldENvbnRleHQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFIubGF5b3V0LmVtYmVkZGVkX3N1Yl9zZXR0aW5nc19saXN0X2l0ZW0pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgVGV4dFZpZXcgdGV4dFZpZXcgPSAoVGV4dFZpZXcpIHJvdy5maW5kVmlld0J5SWQoUi5pZC50ZXh0KTsKLSAgICAgICAgICAgIEltYWdlVmlldyBjaGVja1ZpZXcgPSAoSW1hZ2VWaWV3KSByb3cuZmluZFZpZXdCeUlkKFIuaWQuY2hlY2spOwotCi0gICAgICAgICAgICB0ZXh0Vmlldy5zZXRUZXh0KG1UZXh0cy5nZXQocG9zaXRpb24pKTsKLSAgICAgICAgICAgIGlmIChwb3NpdGlvbiAhPSBtQ2hlY2tQb3NpdGlvbikgewotICAgICAgICAgICAgICAgIGNoZWNrVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuSU5WSVNJQkxFKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiByb3c7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRUZXh0cyhMaXN0PFN0cmluZz4gdGV4dHMpIHsKLSAgICAgICAgICAgIG1UZXh0cyA9IHRleHRzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0Q2hlY2tQb3NpdGlvbihpbnQgY2hlY2tQb3NpdGlvbikgewotICAgICAgICAgICAgbUNoZWNrUG9zaXRpb24gPSBjaGVja1Bvc2l0aW9uOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC93aWRnZXQvU3VidGl0bGVWaWV3LmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3dpZGdldC9TdWJ0aXRsZVZpZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjdiMmNkMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3dpZGdldC9TdWJ0aXRsZVZpZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLndpZGdldDsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOwotaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLk51bGxhYmxlOwotaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuRnJhbWVMYXlvdXQ7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5zdWJ0aXRsZS5TdWJ0aXRsZUNvbnRyb2xsZXIuQW5jaG9yOwotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLnN1YnRpdGxlLlN1YnRpdGxlVHJhY2suUmVuZGVyaW5nV2lkZ2V0OwotCi1jbGFzcyBTdWJ0aXRsZVZpZXcgZXh0ZW5kcyBGcmFtZUxheW91dCBpbXBsZW1lbnRzIEFuY2hvciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJTdWJ0aXRsZVZpZXciOwotCi0gICAgcHJpdmF0ZSBSZW5kZXJpbmdXaWRnZXQgbVN1YnRpdGxlV2lkZ2V0OwotICAgIHByaXZhdGUgUmVuZGVyaW5nV2lkZ2V0Lk9uQ2hhbmdlZExpc3RlbmVyIG1TdWJ0aXRsZXNDaGFuZ2VkTGlzdGVuZXI7Ci0KLSAgICBwdWJsaWMgU3VidGl0bGVWaWV3KENvbnRleHQgY29udGV4dCkgewotICAgICAgICB0aGlzKGNvbnRleHQsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdWJ0aXRsZVZpZXcoQ29udGV4dCBjb250ZXh0LCBATnVsbGFibGUgQXR0cmlidXRlU2V0IGF0dHJzKSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIDApOwotICAgIH0KLQotICAgIHB1YmxpYyBTdWJ0aXRsZVZpZXcoQ29udGV4dCBjb250ZXh0LCBATnVsbGFibGUgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGVBdHRyKSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlQXR0ciwgMCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN1YnRpdGxlVmlldygKLSAgICAgICAgICAgIENvbnRleHQgY29udGV4dCwgQE51bGxhYmxlIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlQXR0ciwgaW50IGRlZlN0eWxlUmVzKSB7Ci0gICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzLCBkZWZTdHlsZUF0dHIsIGRlZlN0eWxlUmVzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRTdWJ0aXRsZVdpZGdldChSZW5kZXJpbmdXaWRnZXQgc3VidGl0bGVXaWRnZXQpIHsKLSAgICAgICAgaWYgKG1TdWJ0aXRsZVdpZGdldCA9PSBzdWJ0aXRsZVdpZGdldCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgYm9vbGVhbiBhdHRhY2hlZFRvV2luZG93ID0gaXNBdHRhY2hlZFRvV2luZG93KCk7Ci0gICAgICAgIGlmIChtU3VidGl0bGVXaWRnZXQgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGF0dGFjaGVkVG9XaW5kb3cpIHsKLSAgICAgICAgICAgICAgICBtU3VidGl0bGVXaWRnZXQub25EZXRhY2hlZEZyb21XaW5kb3coKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbVN1YnRpdGxlV2lkZ2V0LnNldE9uQ2hhbmdlZExpc3RlbmVyKG51bGwpOwotICAgICAgICB9Ci0gICAgICAgIG1TdWJ0aXRsZVdpZGdldCA9IHN1YnRpdGxlV2lkZ2V0OwotCi0gICAgICAgIGlmIChzdWJ0aXRsZVdpZGdldCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAobVN1YnRpdGxlc0NoYW5nZWRMaXN0ZW5lciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVN1YnRpdGxlc0NoYW5nZWRMaXN0ZW5lciA9IG5ldyBSZW5kZXJpbmdXaWRnZXQuT25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNoYW5nZWQoUmVuZGVyaW5nV2lkZ2V0IHJlbmRlcmluZ1dpZGdldCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc2V0V2lsbE5vdERyYXcoZmFsc2UpOwotICAgICAgICAgICAgc3VidGl0bGVXaWRnZXQuc2V0T25DaGFuZ2VkTGlzdGVuZXIobVN1YnRpdGxlc0NoYW5nZWRMaXN0ZW5lcik7Ci0KLSAgICAgICAgICAgIGlmIChhdHRhY2hlZFRvV2luZG93KSB7Ci0gICAgICAgICAgICAgICAgc3VidGl0bGVXaWRnZXQub25BdHRhY2hlZFRvV2luZG93KCk7Ci0gICAgICAgICAgICAgICAgcmVxdWVzdExheW91dCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc2V0V2lsbE5vdERyYXcodHJ1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnZhbGlkYXRlKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIExvb3BlciBnZXRTdWJ0aXRsZUxvb3BlcigpIHsKLSAgICAgICAgcmV0dXJuIExvb3Blci5nZXRNYWluTG9vcGVyKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25BdHRhY2hlZFRvV2luZG93KCkgewotICAgICAgICBzdXBlci5vbkF0dGFjaGVkVG9XaW5kb3coKTsKLQotICAgICAgICBpZiAobVN1YnRpdGxlV2lkZ2V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1TdWJ0aXRsZVdpZGdldC5vbkF0dGFjaGVkVG9XaW5kb3coKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uRGV0YWNoZWRGcm9tV2luZG93KCkgewotICAgICAgICBzdXBlci5vbkRldGFjaGVkRnJvbVdpbmRvdygpOwotCi0gICAgICAgIGlmIChtU3VidGl0bGVXaWRnZXQgIT0gbnVsbCkgewotICAgICAgICAgICAgbVN1YnRpdGxlV2lkZ2V0Lm9uRGV0YWNoZWRGcm9tV2luZG93KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkxheW91dChib29sZWFuIGNoYW5nZWQsIGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgcmlnaHQsIGludCBib3R0b20pIHsKLSAgICAgICAgc3VwZXIub25MYXlvdXQoY2hhbmdlZCwgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tKTsKLQotICAgICAgICBpZiAobVN1YnRpdGxlV2lkZ2V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZpbmFsIGludCB3aWR0aCA9IGdldFdpZHRoKCkgLSBnZXRQYWRkaW5nTGVmdCgpIC0gZ2V0UGFkZGluZ1JpZ2h0KCk7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgaGVpZ2h0ID0gZ2V0SGVpZ2h0KCkgLSBnZXRQYWRkaW5nVG9wKCkgLSBnZXRQYWRkaW5nQm90dG9tKCk7Ci0KLSAgICAgICAgICAgIG1TdWJ0aXRsZVdpZGdldC5zZXRTaXplKHdpZHRoLCBoZWlnaHQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZHJhdyhDYW52YXMgY2FudmFzKSB7Ci0gICAgICAgIHN1cGVyLmRyYXcoY2FudmFzKTsKLQotICAgICAgICBpZiAobVN1YnRpdGxlV2lkZ2V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZpbmFsIGludCBzYXZlQ291bnQgPSBjYW52YXMuc2F2ZSgpOwotICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZShnZXRQYWRkaW5nTGVmdCgpLCBnZXRQYWRkaW5nVG9wKCkpOwotICAgICAgICAgICAgbVN1YnRpdGxlV2lkZ2V0LmRyYXcoY2FudmFzKTsKLSAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlVG9Db3VudChzYXZlQ291bnQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRBY2Nlc3NpYmlsaXR5Q2xhc3NOYW1lKCkgewotICAgICAgICByZXR1cm4gU3VidGl0bGVWaWV3LmNsYXNzLmdldE5hbWUoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3dpZGdldC9WaWRlb1N1cmZhY2VWaWV3LmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3dpZGdldC9WaWRlb1N1cmZhY2VWaWV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjOTJlODUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC93aWRnZXQvVmlkZW9TdXJmYWNlVmlldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQud2lkZ2V0OwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXIyOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLk5vbk51bGw7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlSG9sZGVyOwotaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlVmlldzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLQotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLndpZGdldC5WaWRlb1ZpZXcyLlZJRVdfVFlQRV9TVVJGQUNFVklFVzsKLQotY2xhc3MgVmlkZW9TdXJmYWNlVmlldyBleHRlbmRzIFN1cmZhY2VWaWV3IGltcGxlbWVudHMgVmlkZW9WaWV3SW50ZXJmYWNlLCBTdXJmYWNlSG9sZGVyLkNhbGxiYWNrIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlZpZGVvU3VyZmFjZVZpZXciOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSB0cnVlOyAvLyBTVE9QU0hJUDogTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpOwotICAgIHByaXZhdGUgU3VyZmFjZUhvbGRlciBtU3VyZmFjZUhvbGRlciA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTdXJmYWNlTGlzdGVuZXIgbVN1cmZhY2VMaXN0ZW5lciA9IG51bGw7Ci0gICAgcHJpdmF0ZSBNZWRpYVBsYXllcjIgbU1lZGlhUGxheWVyOwotICAgIC8vIEEgZmxhZyB0byBpbmRpY2F0ZSB0YWtpbmcgb3ZlciBvdGhlciB2aWV3IHNob3VsZCBiZSBwcm9jZWVkLgotICAgIHByaXZhdGUgYm9vbGVhbiBtSXNUYWtpbmdPdmVyT2xkVmlldzsKLSAgICBwcml2YXRlIFZpZGVvVmlld0ludGVyZmFjZSBtT2xkVmlldzsKLQotCi0gICAgcHVibGljIFZpZGVvU3VyZmFjZVZpZXcoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIFZpZGVvU3VyZmFjZVZpZXcoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKLSAgICAgICAgdGhpcyhjb250ZXh0LCBhdHRycywgMCk7Ci0gICAgfQotCi0gICAgcHVibGljIFZpZGVvU3VyZmFjZVZpZXcoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZUF0dHIpIHsKLSAgICAgICAgdGhpcyhjb250ZXh0LCBhdHRycywgZGVmU3R5bGVBdHRyLCAwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVmlkZW9TdXJmYWNlVmlldyhDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlQXR0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVmU3R5bGVSZXMpIHsKLSAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlQXR0ciwgZGVmU3R5bGVSZXMpOwotICAgICAgICBnZXRIb2xkZXIoKS5hZGRDYWxsYmFjayh0aGlzKTsKLSAgICB9Ci0KLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgLy8gaW1wbGVtZW50cyBWaWRlb1ZpZXdJbnRlcmZhY2UKLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBhc3NpZ25TdXJmYWNlVG9NZWRpYVBsYXllcihNZWRpYVBsYXllcjIgbXApIHsKLSAgICAgICAgTG9nLmQoVEFHLCAiYXNzaWduU3VyZmFjZVRvTWVkaWFQbGF5ZXIoKTogbVN1cmZhY2VIb2xkZXI6ICIgKyBtU3VyZmFjZUhvbGRlcik7Ci0gICAgICAgIGlmIChtcCA9PSBudWxsIHx8ICFoYXNBdmFpbGFibGVTdXJmYWNlKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBtcC5zZXREaXNwbGF5KG1TdXJmYWNlSG9sZGVyKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0U3VyZmFjZUxpc3RlbmVyKFN1cmZhY2VMaXN0ZW5lciBsKSB7Ci0gICAgICAgIG1TdXJmYWNlTGlzdGVuZXIgPSBsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgZ2V0Vmlld1R5cGUoKSB7Ci0gICAgICAgIHJldHVybiBWSUVXX1RZUEVfU1VSRkFDRVZJRVc7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0TWVkaWFQbGF5ZXIoTWVkaWFQbGF5ZXIyIG1wKSB7Ci0gICAgICAgIG1NZWRpYVBsYXllciA9IG1wOwotICAgICAgICBpZiAobUlzVGFraW5nT3Zlck9sZFZpZXcpIHsKLSAgICAgICAgICAgIHRha2VPdmVyKG1PbGRWaWV3KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHRha2VPdmVyKEBOb25OdWxsIFZpZGVvVmlld0ludGVyZmFjZSBvbGRWaWV3KSB7Ci0gICAgICAgIGlmIChhc3NpZ25TdXJmYWNlVG9NZWRpYVBsYXllcihtTWVkaWFQbGF5ZXIpKSB7Ci0gICAgICAgICAgICAoKFZpZXcpIG9sZFZpZXcpLnNldFZpc2liaWxpdHkoR09ORSk7Ci0gICAgICAgICAgICBtSXNUYWtpbmdPdmVyT2xkVmlldyA9IGZhbHNlOwotICAgICAgICAgICAgbU9sZFZpZXcgPSBudWxsOwotICAgICAgICAgICAgaWYgKG1TdXJmYWNlTGlzdGVuZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1TdXJmYWNlTGlzdGVuZXIub25TdXJmYWNlVGFrZU92ZXJEb25lKHRoaXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUlzVGFraW5nT3Zlck9sZFZpZXcgPSB0cnVlOwotICAgICAgICAgICAgbU9sZFZpZXcgPSBvbGRWaWV3OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaGFzQXZhaWxhYmxlU3VyZmFjZSgpIHsKLSAgICAgICAgcmV0dXJuIChtU3VyZmFjZUhvbGRlciAhPSBudWxsICYmIG1TdXJmYWNlSG9sZGVyLmdldFN1cmZhY2UoKSAhPSBudWxsKTsKLSAgICB9Ci0KLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgLy8gaW1wbGVtZW50cyBTdXJmYWNlSG9sZGVyLkNhbGxiYWNrCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc3VyZmFjZUNyZWF0ZWQoU3VyZmFjZUhvbGRlciBob2xkZXIpIHsKLSAgICAgICAgTG9nLmQoVEFHLCAic3VyZmFjZUNyZWF0ZWQ6IG1TdXJmYWNlSG9sZGVyOiAiICsgbVN1cmZhY2VIb2xkZXIgKyAiLCBuZXcgaG9sZGVyOiAiICsgaG9sZGVyKTsKLSAgICAgICAgbVN1cmZhY2VIb2xkZXIgPSBob2xkZXI7Ci0gICAgICAgIGlmIChtSXNUYWtpbmdPdmVyT2xkVmlldykgewotICAgICAgICAgICAgdGFrZU92ZXIobU9sZFZpZXcpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYXNzaWduU3VyZmFjZVRvTWVkaWFQbGF5ZXIobU1lZGlhUGxheWVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtU3VyZmFjZUxpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIFJlY3QgcmVjdCA9IG1TdXJmYWNlSG9sZGVyLmdldFN1cmZhY2VGcmFtZSgpOwotICAgICAgICAgICAgbVN1cmZhY2VMaXN0ZW5lci5vblN1cmZhY2VDcmVhdGVkKHRoaXMsIHJlY3Qud2lkdGgoKSwgcmVjdC5oZWlnaHQoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzdXJmYWNlQ2hhbmdlZChTdXJmYWNlSG9sZGVyIGhvbGRlciwgaW50IGZvcm1hdCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0gICAgICAgIGlmIChtU3VyZmFjZUxpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1TdXJmYWNlTGlzdGVuZXIub25TdXJmYWNlQ2hhbmdlZCh0aGlzLCB3aWR0aCwgaGVpZ2h0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHN1cmZhY2VEZXN0cm95ZWQoU3VyZmFjZUhvbGRlciBob2xkZXIpIHsKLSAgICAgICAgLy8gQWZ0ZXIgd2UgcmV0dXJuIGZyb20gdGhpcyB3ZSBjYW4ndCB1c2UgdGhlIHN1cmZhY2UgYW55IG1vcmUKLSAgICAgICAgbVN1cmZhY2VIb2xkZXIgPSBudWxsOwotICAgICAgICBpZiAobVN1cmZhY2VMaXN0ZW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtU3VyZmFjZUxpc3RlbmVyLm9uU3VyZmFjZURlc3Ryb3llZCh0aGlzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIFRPRE86IEludmVzdGlnYXRlIHRoZSB3YXkgdG8gbW92ZSBvbk1lYXN1cmUoKSBjb2RlIGludG8gRnJhbWVMYXlvdXQuCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25NZWFzdXJlKGludCB3aWR0aE1lYXN1cmVTcGVjLCBpbnQgaGVpZ2h0TWVhc3VyZVNwZWMpIHsKLSAgICAgICAgaW50IHZpZGVvV2lkdGggPSAobU1lZGlhUGxheWVyID09IG51bGwpID8gMCA6IG1NZWRpYVBsYXllci5nZXRWaWRlb1dpZHRoKCk7Ci0gICAgICAgIGludCB2aWRlb0hlaWdodCA9IChtTWVkaWFQbGF5ZXIgPT0gbnVsbCkgPyAwIDogbU1lZGlhUGxheWVyLmdldFZpZGVvSGVpZ2h0KCk7Ci0gICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAib25NZWFzdXJlKCIgKyBNZWFzdXJlU3BlYy50b1N0cmluZyh3aWR0aE1lYXN1cmVTcGVjKSArICIsICIKLSAgICAgICAgICAgICAgICAgICAgKyBNZWFzdXJlU3BlYy50b1N0cmluZyhoZWlnaHRNZWFzdXJlU3BlYykgKyAiKSIpOwotICAgICAgICAgICAgTG9nLmkoVEFHLCAiIG1lYXN1cmVkU2l6ZTogIiArIGdldE1lYXN1cmVkV2lkdGgoKSArICIvIiArIGdldE1lYXN1cmVkSGVpZ2h0KCkpOwotICAgICAgICAgICAgTG9nLmkoVEFHLCAiIHZpZXdTaXplOiAiICsgZ2V0V2lkdGgoKSArICIvIiArIGdldEhlaWdodCgpKTsKLSAgICAgICAgICAgIExvZy5pKFRBRywgIiBtVmlkZW9XaWR0aC9oZWlnaHQ6ICIgKyB2aWRlb1dpZHRoICsgIiwgIiArIHZpZGVvSGVpZ2h0KTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCB3aWR0aCA9IGdldERlZmF1bHRTaXplKHZpZGVvV2lkdGgsIHdpZHRoTWVhc3VyZVNwZWMpOwotICAgICAgICBpbnQgaGVpZ2h0ID0gZ2V0RGVmYXVsdFNpemUodmlkZW9IZWlnaHQsIGhlaWdodE1lYXN1cmVTcGVjKTsKLQotICAgICAgICBpZiAodmlkZW9XaWR0aCA+IDAgJiYgdmlkZW9IZWlnaHQgPiAwKSB7Ci0gICAgICAgICAgICBpbnQgd2lkdGhTcGVjU2l6ZSA9IE1lYXN1cmVTcGVjLmdldFNpemUod2lkdGhNZWFzdXJlU3BlYyk7Ci0gICAgICAgICAgICBpbnQgaGVpZ2h0U3BlY1NpemUgPSBNZWFzdXJlU3BlYy5nZXRTaXplKGhlaWdodE1lYXN1cmVTcGVjKTsKLQotICAgICAgICAgICAgd2lkdGggPSB3aWR0aFNwZWNTaXplOwotICAgICAgICAgICAgaGVpZ2h0ID0gaGVpZ2h0U3BlY1NpemU7Ci0KLSAgICAgICAgICAgIC8vIGZvciBjb21wYXRpYmlsaXR5LCB3ZSBhZGp1c3Qgc2l6ZSBiYXNlZCBvbiBhc3BlY3QgcmF0aW8KLSAgICAgICAgICAgIGlmICh2aWRlb1dpZHRoICogaGVpZ2h0IDwgd2lkdGggKiB2aWRlb0hlaWdodCkgewotICAgICAgICAgICAgICAgIHdpZHRoID0gaGVpZ2h0ICogdmlkZW9XaWR0aCAvIHZpZGVvSGVpZ2h0OwotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJpbWFnZSB0b28gd2lkZSwgY29ycmVjdGluZy4gd2lkdGg6ICIgKyB3aWR0aCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmICh2aWRlb1dpZHRoICogaGVpZ2h0ID4gd2lkdGggKiB2aWRlb0hlaWdodCkgewotICAgICAgICAgICAgICAgIGhlaWdodCA9IHdpZHRoICogdmlkZW9IZWlnaHQgLyB2aWRlb1dpZHRoOwotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJpbWFnZSB0b28gdGFsbCwgY29ycmVjdGluZy4gaGVpZ2h0OiAiICsgaGVpZ2h0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBubyBzaXplIHlldCwganVzdCBhZG9wdCB0aGUgZ2l2ZW4gc3BlYyBzaXplcwotICAgICAgICB9Ci0gICAgICAgIHNldE1lYXN1cmVkRGltZW5zaW9uKHdpZHRoLCBoZWlnaHQpOwotICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5pKFRBRywgImVuZCBvZiBvbk1lYXN1cmUoKSIpOwotICAgICAgICAgICAgTG9nLmkoVEFHLCAiIG1lYXN1cmVkU2l6ZTogIiArIGdldE1lYXN1cmVkV2lkdGgoKSArICIvIiArIGdldE1lYXN1cmVkSGVpZ2h0KCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuICJWaWV3VHlwZTogU3VyZmFjZVZpZXcgLyBWaXNpYmlsaXR5OiAiICsgZ2V0VmlzaWJpbGl0eSgpCi0gICAgICAgICAgICAgICAgKyAiIC8gc3VyZmFjZUhvbGRlcjogIiArIG1TdXJmYWNlSG9sZGVyOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvd2lkZ2V0L1ZpZGVvVGV4dHVyZVZpZXcuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvd2lkZ2V0L1ZpZGVvVGV4dHVyZVZpZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDI0YTNhYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3dpZGdldC9WaWRlb1RleHR1cmVWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC53aWRnZXQ7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlN1cmZhY2VUZXh0dXJlOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXIyOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLk5vbk51bGw7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uUmVxdWlyZXNBcGk7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlOwotaW1wb3J0IGFuZHJvaWQudmlldy5UZXh0dXJlVmlldzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLQotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLndpZGdldC5WaWRlb1ZpZXcyLlZJRVdfVFlQRV9URVhUVVJFVklFVzsKLQotQFJlcXVpcmVzQXBpKDI2KQotY2xhc3MgVmlkZW9UZXh0dXJlVmlldyBleHRlbmRzIFRleHR1cmVWaWV3Ci0gICAgICAgIGltcGxlbWVudHMgVmlkZW9WaWV3SW50ZXJmYWNlLCBUZXh0dXJlVmlldy5TdXJmYWNlVGV4dHVyZUxpc3RlbmVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlZpZGVvVGV4dHVyZVZpZXciOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSB0cnVlOyAvLyBTVE9QU0hJUDogTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpOwotCi0gICAgcHJpdmF0ZSBTdXJmYWNlVGV4dHVyZSBtU3VyZmFjZVRleHR1cmU7Ci0gICAgcHJpdmF0ZSBTdXJmYWNlIG1TdXJmYWNlOwotICAgIHByaXZhdGUgU3VyZmFjZUxpc3RlbmVyIG1TdXJmYWNlTGlzdGVuZXI7Ci0gICAgcHJpdmF0ZSBNZWRpYVBsYXllcjIgbU1lZGlhUGxheWVyOwotICAgIC8vIEEgZmxhZyB0byBpbmRpY2F0ZSB0YWtpbmcgb3ZlciBvdGhlciB2aWV3IHNob3VsZCBiZSBwcm9jZWVkLgotICAgIHByaXZhdGUgYm9vbGVhbiBtSXNUYWtpbmdPdmVyT2xkVmlldzsKLSAgICBwcml2YXRlIFZpZGVvVmlld0ludGVyZmFjZSBtT2xkVmlldzsKLQotICAgIHB1YmxpYyBWaWRlb1RleHR1cmVWaWV3KENvbnRleHQgY29udGV4dCkgewotICAgICAgICB0aGlzKGNvbnRleHQsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBWaWRlb1RleHR1cmVWaWV3KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIDApOwotICAgIH0KLQotICAgIHB1YmxpYyBWaWRlb1RleHR1cmVWaWV3KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGVBdHRyKSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlQXR0ciwgMCk7Ci0gICAgfQotCi0gICAgcHVibGljIFZpZGVvVGV4dHVyZVZpZXcoCi0gICAgICAgICAgICBDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlQXR0ciwgaW50IGRlZlN0eWxlUmVzKSB7Ci0gICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzLCBkZWZTdHlsZUF0dHIsIGRlZlN0eWxlUmVzKTsKLSAgICAgICAgc2V0U3VyZmFjZVRleHR1cmVMaXN0ZW5lcih0aGlzKTsKLSAgICB9Ci0KLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgLy8gaW1wbGVtZW50cyBWaWRlb1ZpZXdJbnRlcmZhY2UKLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBhc3NpZ25TdXJmYWNlVG9NZWRpYVBsYXllcihNZWRpYVBsYXllcjIgbXApIHsKLSAgICAgICAgTG9nLmQoVEFHLCAiYXNzaWduU3VyZmFjZVRvTWVkaWFQbGF5ZXIoKTogbVN1cmZhY2VUZXh0dXJlOiAiICsgbVN1cmZhY2VUZXh0dXJlKTsKLSAgICAgICAgaWYgKG1wID09IG51bGwgfHwgIWhhc0F2YWlsYWJsZVN1cmZhY2UoKSkgewotICAgICAgICAgICAgLy8gU3VyZmFjZSBpcyBub3QgcmVhZHkuCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgbXAuc2V0U3VyZmFjZShtU3VyZmFjZSk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFN1cmZhY2VMaXN0ZW5lcihTdXJmYWNlTGlzdGVuZXIgbCkgewotICAgICAgICBtU3VyZmFjZUxpc3RlbmVyID0gbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGdldFZpZXdUeXBlKCkgewotICAgICAgICByZXR1cm4gVklFV19UWVBFX1RFWFRVUkVWSUVXOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldE1lZGlhUGxheWVyKE1lZGlhUGxheWVyMiBtcCkgewotICAgICAgICBtTWVkaWFQbGF5ZXIgPSBtcDsKLSAgICAgICAgaWYgKG1Jc1Rha2luZ092ZXJPbGRWaWV3KSB7Ci0gICAgICAgICAgICB0YWtlT3ZlcihtT2xkVmlldyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB0YWtlT3ZlcihATm9uTnVsbCBWaWRlb1ZpZXdJbnRlcmZhY2Ugb2xkVmlldykgewotICAgICAgICBpZiAoYXNzaWduU3VyZmFjZVRvTWVkaWFQbGF5ZXIobU1lZGlhUGxheWVyKSkgewotICAgICAgICAgICAgKChWaWV3KSBvbGRWaWV3KS5zZXRWaXNpYmlsaXR5KEdPTkUpOwotICAgICAgICAgICAgbUlzVGFraW5nT3Zlck9sZFZpZXcgPSBmYWxzZTsKLSAgICAgICAgICAgIG1PbGRWaWV3ID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChtU3VyZmFjZUxpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtU3VyZmFjZUxpc3RlbmVyLm9uU3VyZmFjZVRha2VPdmVyRG9uZSh0aGlzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1Jc1Rha2luZ092ZXJPbGRWaWV3ID0gdHJ1ZTsKLSAgICAgICAgICAgIG1PbGRWaWV3ID0gb2xkVmlldzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGhhc0F2YWlsYWJsZVN1cmZhY2UoKSB7Ci0gICAgICAgIHJldHVybiAobVN1cmZhY2VUZXh0dXJlICE9IG51bGwgJiYgIW1TdXJmYWNlVGV4dHVyZS5pc1JlbGVhc2VkKCkgJiYgbVN1cmZhY2UgIT0gbnVsbCk7Ci0gICAgfQotCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIC8vIGltcGxlbWVudHMgVGV4dHVyZVZpZXcuU3VyZmFjZVRleHR1cmVMaXN0ZW5lcgotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uU3VyZmFjZVRleHR1cmVBdmFpbGFibGUoU3VyZmFjZVRleHR1cmUgc3VyZmFjZVRleHR1cmUsIGludCB3aWR0aCwgaW50IGhlaWdodCkgewotICAgICAgICBMb2cuZChUQUcsICJvblN1cmZhY2VUZXh0dXJlQXZhaWxhYmxlOiBtU3VyZmFjZVRleHR1cmU6ICIgKyBtU3VyZmFjZVRleHR1cmUKLSAgICAgICAgICAgICAgICArICIsIG5ldyBzdXJmYWNlOiAiICsgc3VyZmFjZVRleHR1cmUpOwotICAgICAgICBtU3VyZmFjZVRleHR1cmUgPSBzdXJmYWNlVGV4dHVyZTsKLSAgICAgICAgbVN1cmZhY2UgPSBuZXcgU3VyZmFjZShtU3VyZmFjZVRleHR1cmUpOwotICAgICAgICBpZiAobUlzVGFraW5nT3Zlck9sZFZpZXcpIHsKLSAgICAgICAgICAgIHRha2VPdmVyKG1PbGRWaWV3KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGFzc2lnblN1cmZhY2VUb01lZGlhUGxheWVyKG1NZWRpYVBsYXllcik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1TdXJmYWNlTGlzdGVuZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbVN1cmZhY2VMaXN0ZW5lci5vblN1cmZhY2VDcmVhdGVkKHRoaXMsIHdpZHRoLCBoZWlnaHQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25TdXJmYWNlVGV4dHVyZVNpemVDaGFuZ2VkKFN1cmZhY2VUZXh0dXJlIHN1cmZhY2VUZXh0dXJlLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLSAgICAgICAgaWYgKG1TdXJmYWNlTGlzdGVuZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbVN1cmZhY2VMaXN0ZW5lci5vblN1cmZhY2VDaGFuZ2VkKHRoaXMsIHdpZHRoLCBoZWlnaHQpOwotICAgICAgICB9Ci0gICAgICAgIC8vIHJlcXVlc3RMYXlvdXQoKTsgIC8vIFRPRE86IGZpZ3VyZSBvdXQgaWYgaXQgc2hvdWxkIGJlIGNhbGxlZCBoZXJlPwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uU3VyZmFjZVRleHR1cmVVcGRhdGVkKFN1cmZhY2VUZXh0dXJlIHN1cmZhY2UpIHsKLSAgICAgICAgLy8gbm8tb3AKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBvblN1cmZhY2VUZXh0dXJlRGVzdHJveWVkKFN1cmZhY2VUZXh0dXJlIHN1cmZhY2VUZXh0dXJlKSB7Ci0gICAgICAgIGlmIChtU3VyZmFjZUxpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1TdXJmYWNlTGlzdGVuZXIub25TdXJmYWNlRGVzdHJveWVkKHRoaXMpOwotICAgICAgICB9Ci0gICAgICAgIG1TdXJmYWNlVGV4dHVyZSA9IG51bGw7Ci0gICAgICAgIG1TdXJmYWNlID0gbnVsbDsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25NZWFzdXJlKGludCB3aWR0aE1lYXN1cmVTcGVjLCBpbnQgaGVpZ2h0TWVhc3VyZVNwZWMpIHsKLSAgICAgICAgaW50IHZpZGVvV2lkdGggPSAobU1lZGlhUGxheWVyID09IG51bGwpID8gMCA6IG1NZWRpYVBsYXllci5nZXRWaWRlb1dpZHRoKCk7Ci0gICAgICAgIGludCB2aWRlb0hlaWdodCA9IChtTWVkaWFQbGF5ZXIgPT0gbnVsbCkgPyAwIDogbU1lZGlhUGxheWVyLmdldFZpZGVvSGVpZ2h0KCk7Ci0gICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAib25NZWFzdXJlKCIgKyBNZWFzdXJlU3BlYy50b1N0cmluZyh3aWR0aE1lYXN1cmVTcGVjKSArICIsICIKLSAgICAgICAgICAgICAgICAgICAgKyBNZWFzdXJlU3BlYy50b1N0cmluZyhoZWlnaHRNZWFzdXJlU3BlYykgKyAiKSIpOwotICAgICAgICAgICAgTG9nLmkoVEFHLCAiIG1lYXN1cmVkU2l6ZTogIiArIGdldE1lYXN1cmVkV2lkdGgoKSArICIvIiArIGdldE1lYXN1cmVkSGVpZ2h0KCkpOwotICAgICAgICAgICAgTG9nLmkoVEFHLCAiIHZpZXdTaXplOiAiICsgZ2V0V2lkdGgoKSArICIvIiArIGdldEhlaWdodCgpKTsKLSAgICAgICAgICAgIExvZy5pKFRBRywgIiBtVmlkZW9XaWR0aC9oZWlnaHQ6ICIgKyB2aWRlb1dpZHRoICsgIiwgIiArIHZpZGVvSGVpZ2h0KTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCB3aWR0aCA9IGdldERlZmF1bHRTaXplKHZpZGVvV2lkdGgsIHdpZHRoTWVhc3VyZVNwZWMpOwotICAgICAgICBpbnQgaGVpZ2h0ID0gZ2V0RGVmYXVsdFNpemUodmlkZW9IZWlnaHQsIGhlaWdodE1lYXN1cmVTcGVjKTsKLQotICAgICAgICBpZiAodmlkZW9XaWR0aCA+IDAgJiYgdmlkZW9IZWlnaHQgPiAwKSB7Ci0gICAgICAgICAgICBpbnQgd2lkdGhTcGVjU2l6ZSA9IE1lYXN1cmVTcGVjLmdldFNpemUod2lkdGhNZWFzdXJlU3BlYyk7Ci0gICAgICAgICAgICBpbnQgaGVpZ2h0U3BlY1NpemUgPSBNZWFzdXJlU3BlYy5nZXRTaXplKGhlaWdodE1lYXN1cmVTcGVjKTsKLQotICAgICAgICAgICAgd2lkdGggPSB3aWR0aFNwZWNTaXplOwotICAgICAgICAgICAgaGVpZ2h0ID0gaGVpZ2h0U3BlY1NpemU7Ci0KLSAgICAgICAgICAgIC8vIGZvciBjb21wYXRpYmlsaXR5LCB3ZSBhZGp1c3Qgc2l6ZSBiYXNlZCBvbiBhc3BlY3QgcmF0aW8KLSAgICAgICAgICAgIGlmICh2aWRlb1dpZHRoICogaGVpZ2h0IDwgd2lkdGggKiB2aWRlb0hlaWdodCkgewotICAgICAgICAgICAgICAgIHdpZHRoID0gaGVpZ2h0ICogdmlkZW9XaWR0aCAvIHZpZGVvSGVpZ2h0OwotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJpbWFnZSB0b28gd2lkZSwgY29ycmVjdGluZy4gd2lkdGg6ICIgKyB3aWR0aCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmICh2aWRlb1dpZHRoICogaGVpZ2h0ID4gd2lkdGggKiB2aWRlb0hlaWdodCkgewotICAgICAgICAgICAgICAgIGhlaWdodCA9IHdpZHRoICogdmlkZW9IZWlnaHQgLyB2aWRlb1dpZHRoOwotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJpbWFnZSB0b28gdGFsbCwgY29ycmVjdGluZy4gaGVpZ2h0OiAiICsgaGVpZ2h0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBubyBzaXplIHlldCwganVzdCBhZG9wdCB0aGUgZ2l2ZW4gc3BlYyBzaXplcwotICAgICAgICB9Ci0gICAgICAgIHNldE1lYXN1cmVkRGltZW5zaW9uKHdpZHRoLCBoZWlnaHQpOwotICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5pKFRBRywgImVuZCBvZiBvbk1lYXN1cmUoKSIpOwotICAgICAgICAgICAgTG9nLmkoVEFHLCAiIG1lYXN1cmVkU2l6ZTogIiArIGdldE1lYXN1cmVkV2lkdGgoKSArICIvIiArIGdldE1lYXN1cmVkSGVpZ2h0KCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuICJWaWV3VHlwZTogVGV4dHVyZVZpZXcgLyBWaXNpYmlsaXR5OiAiICsgZ2V0VmlzaWJpbGl0eSgpCi0gICAgICAgICAgICAgICAgKyAiIC8gc3VyZmFjZVRleHR1cmU6ICIgKyBtU3VyZmFjZVRleHR1cmU7Ci0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3dpZGdldC9WaWRlb1ZpZXcySW1wbC5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC93aWRnZXQvVmlkZW9WaWV3MkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTcyNzlkNi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3dpZGdldC9WaWRlb1ZpZXcySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQwNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLndpZGdldDsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5BY3Rpdml0eUluZm87Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXBGYWN0b3J5OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5CaXRtYXBEcmF3YWJsZTsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9BdHRyaWJ1dGVzOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Gb2N1c1JlcXVlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb01hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5EYXRhU291cmNlRGVzYzsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTWV0YWRhdGE7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllcjI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllcjIuTWVkaWFQbGF5ZXIyRXZlbnRDYWxsYmFjazsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyMi5PblN1YnRpdGxlRGF0YUxpc3RlbmVyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXIySW1wbDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlN1YnRpdGxlRGF0YTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhSXRlbTI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYU1ldGFkYXRhMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTWV0YWRhdGFSZXRyaWV2ZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZXRhZGF0YTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlBsYXliYWNrUGFyYW1zOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuVGltZWRUZXh0OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuc2Vzc2lvbi5NZWRpYUNvbnRyb2xsZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5zZXNzaW9uLk1lZGlhQ29udHJvbGxlci5QbGF5YmFja0luZm87Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5zZXNzaW9uLk1lZGlhU2Vzc2lvbjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnNlc3Npb24uUGxheWJhY2tTdGF0ZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlNlc3Npb25Ub2tlbjI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuVmlkZW9WaWV3MlByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLlZpZXdHcm91cFByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKLWltcG9ydCBhbmRyb2lkLm9zLkFzeW5jVGFzazsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLm9zLlJlc3VsdFJlY2VpdmVyOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLk51bGxhYmxlOwotaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkRpc3BsYXlNZXRyaWNzOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLlBhaXI7Ci1pbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXAuTGF5b3V0UGFyYW1zOwotaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldzsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5NZWRpYUNvbnRyb2xWaWV3MjsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5WaWRlb1ZpZXcyOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuZ3JhcGhpY3MucGFsZXR0ZS5QYWxldHRlOwotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLlJvdXRlUGxheWVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLnN1YnRpdGxlLkNsb3NlZENhcHRpb25SZW5kZXJlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5zdWJ0aXRsZS5TdWJ0aXRsZUNvbnRyb2xsZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEuc3VidGl0bGUuU3VidGl0bGVUcmFjazsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS51cGRhdGUuQXBpSGVscGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLnVwZGF0ZS5SOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFJdGVtU3RhdHVzOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFDb250cm9sSW50ZW50OwotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlU2VsZWN0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3I7Ci0KLXB1YmxpYyBjbGFzcyBWaWRlb1ZpZXcySW1wbCBleHRlbmRzIEJhc2VMYXlvdXQKLSAgICAgICAgaW1wbGVtZW50cyBWaWRlb1ZpZXcyUHJvdmlkZXIsIFZpZGVvVmlld0ludGVyZmFjZS5TdXJmYWNlTGlzdGVuZXIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiVmlkZW9WaWV3MiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IHRydWU7IC8vIFNUT1BTSElQOiBMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5ERUJVRyk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBERUZBVUxUX1NIT1dfQ09OVFJPTExFUl9JTlRFUlZBTF9NUyA9IDIwMDA7Ci0KLSAgICBwcml2YXRlIGZpbmFsIFZpZGVvVmlldzIgbUluc3RhbmNlOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0VSUk9SID0gLTE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0lETEUgPSAwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9QUkVQQVJJTkcgPSAxOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9QUkVQQVJFRCA9IDI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX1BMQVlJTkcgPSAzOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9QQVVTRUQgPSA0OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9QTEFZQkFDS19DT01QTEVURUQgPSA1OwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElOVkFMSURfVFJBQ0tfSU5ERVggPSAtMTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdCBJTlZBTElEX1NQRUVEID0gMGY7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0laRV9UWVBFX0VNQkVEREVEID0gMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0laRV9UWVBFX0ZVTEwgPSAxOwotICAgIC8vIFRPRE86IGFkZCBzdXBwb3J0IGZvciBNaW5pbWFsIHNpemUgdHlwZS4KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0laRV9UWVBFX01JTklNQUwgPSAyOwotCi0gICAgcHJpdmF0ZSBBY2Nlc3NpYmlsaXR5TWFuYWdlciBtQWNjZXNzaWJpbGl0eU1hbmFnZXI7Ci0gICAgcHJpdmF0ZSBBdWRpb01hbmFnZXIgbUF1ZGlvTWFuYWdlcjsKLSAgICBwcml2YXRlIEF1ZGlvQXR0cmlidXRlcyBtQXVkaW9BdHRyaWJ1dGVzOwotICAgIHByaXZhdGUgaW50IG1BdWRpb0ZvY3VzVHlwZSA9IEF1ZGlvTWFuYWdlci5BVURJT0ZPQ1VTX0dBSU47IC8vIGxlZ2FjeSBmb2N1cyBnYWluCi0KLSAgICBwcml2YXRlIFBhaXI8RXhlY3V0b3IsIFZpZGVvVmlldzIuT25DdXN0b21BY3Rpb25MaXN0ZW5lcj4gbUN1c3RvbUFjdGlvbkxpc3RlbmVyUmVjb3JkOwotICAgIHByaXZhdGUgVmlkZW9WaWV3Mi5PblZpZXdUeXBlQ2hhbmdlZExpc3RlbmVyIG1WaWV3VHlwZUNoYW5nZWRMaXN0ZW5lcjsKLSAgICBwcml2YXRlIFZpZGVvVmlldzIuT25GdWxsU2NyZWVuUmVxdWVzdExpc3RlbmVyIG1GdWxsU2NyZWVuUmVxdWVzdExpc3RlbmVyOwotCi0gICAgcHJpdmF0ZSBWaWRlb1ZpZXdJbnRlcmZhY2UgbUN1cnJlbnRWaWV3OwotICAgIHByaXZhdGUgVmlkZW9UZXh0dXJlVmlldyBtVGV4dHVyZVZpZXc7Ci0gICAgcHJpdmF0ZSBWaWRlb1N1cmZhY2VWaWV3IG1TdXJmYWNlVmlldzsKLQotICAgIHByaXZhdGUgTWVkaWFQbGF5ZXIyIG1NZWRpYVBsYXllcjsKLSAgICBwcml2YXRlIERhdGFTb3VyY2VEZXNjIG1Ec2Q7Ci0gICAgcHJpdmF0ZSBNZWRpYUNvbnRyb2xWaWV3MiBtTWVkaWFDb250cm9sVmlldzsKLSAgICBwcml2YXRlIE1lZGlhU2Vzc2lvbiBtTWVkaWFTZXNzaW9uOwotICAgIHByaXZhdGUgTWVkaWFDb250cm9sbGVyIG1NZWRpYUNvbnRyb2xsZXI7Ci0gICAgcHJpdmF0ZSBNZXRhZGF0YSBtTWV0YWRhdGE7Ci0gICAgcHJpdmF0ZSBNZWRpYU1ldGFkYXRhMiBtTWVkaWFNZXRhZGF0YTsKLSAgICBwcml2YXRlIE1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIgbVJldHJpZXZlcjsKLSAgICBwcml2YXRlIGJvb2xlYW4gbU5lZWRVcGRhdGVNZWRpYVR5cGU7Ci0gICAgcHJpdmF0ZSBCdW5kbGUgbU1lZGlhVHlwZURhdGE7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbVRpdGxlOwotCi0gICAgLy8gVE9ETzogbW92ZSBtdXNpYyB2aWV3IGluc2lkZSBTdXJmYWNlVmlldy9UZXh0dXJlVmlldyBvciBpbXBsZW1lbnQgVmlkZW9WaWV3SW50ZXJmYWNlLgotICAgIHByaXZhdGUgV2luZG93TWFuYWdlciBtTWFuYWdlcjsKLSAgICBwcml2YXRlIFJlc291cmNlcyBtUmVzb3VyY2VzOwotICAgIHByaXZhdGUgVmlldyBtTXVzaWNWaWV3OwotICAgIHByaXZhdGUgRHJhd2FibGUgbU11c2ljQWxidW1EcmF3YWJsZTsKLSAgICBwcml2YXRlIFN0cmluZyBtTXVzaWNUaXRsZVRleHQ7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbU11c2ljQXJ0aXN0VGV4dDsKLSAgICBwcml2YXRlIGJvb2xlYW4gbUlzTXVzaWNNZWRpYVR5cGU7Ci0gICAgcHJpdmF0ZSBpbnQgbVByZXZXaWR0aDsKLSAgICBwcml2YXRlIGludCBtUHJldkhlaWdodDsKLSAgICBwcml2YXRlIGludCBtRG9taW5hbnRDb2xvcjsKLSAgICBwcml2YXRlIGludCBtU2l6ZVR5cGU7Ci0KLSAgICBwcml2YXRlIFBsYXliYWNrU3RhdGUuQnVpbGRlciBtU3RhdGVCdWlsZGVyOwotICAgIHByaXZhdGUgTGlzdDxQbGF5YmFja1N0YXRlLkN1c3RvbUFjdGlvbj4gbUN1c3RvbUFjdGlvbkxpc3Q7Ci0gICAgcHJpdmF0ZSBpbnQgbVRhcmdldFN0YXRlID0gU1RBVEVfSURMRTsKLSAgICBwcml2YXRlIGludCBtQ3VycmVudFN0YXRlID0gU1RBVEVfSURMRTsKLSAgICBwcml2YXRlIGludCBtQ3VycmVudEJ1ZmZlclBlcmNlbnRhZ2U7Ci0gICAgcHJpdmF0ZSBsb25nIG1TZWVrV2hlblByZXBhcmVkOyAgLy8gcmVjb3JkaW5nIHRoZSBzZWVrIHBvc2l0aW9uIHdoaWxlIHByZXBhcmluZwotCi0gICAgcHJpdmF0ZSBpbnQgbVZpZGVvV2lkdGg7Ci0gICAgcHJpdmF0ZSBpbnQgbVZpZGVvSGVpZ2h0OwotCi0gICAgcHJpdmF0ZSBBcnJheUxpc3Q8SW50ZWdlcj4gbVZpZGVvVHJhY2tJbmRpY2VzOwotICAgIHByaXZhdGUgQXJyYXlMaXN0PEludGVnZXI+IG1BdWRpb1RyYWNrSW5kaWNlczsKLSAgICBwcml2YXRlIEFycmF5TGlzdDxQYWlyPEludGVnZXIsIFN1YnRpdGxlVHJhY2s+PiBtU3VidGl0bGVUcmFja0luZGljZXM7Ci0gICAgcHJpdmF0ZSBTdWJ0aXRsZUNvbnRyb2xsZXIgbVN1YnRpdGxlQ29udHJvbGxlcjsKLQotICAgIC8vIHNlbGVjdGVkIHZpZGVvL2F1ZGlvL3N1YnRpdGxlIHRyYWNrIGluZGV4IGFzIE1lZGlhUGxheWVyMiByZXR1cm5zCi0gICAgcHJpdmF0ZSBpbnQgbVNlbGVjdGVkVmlkZW9UcmFja0luZGV4OwotICAgIHByaXZhdGUgaW50IG1TZWxlY3RlZEF1ZGlvVHJhY2tJbmRleDsKLSAgICBwcml2YXRlIGludCBtU2VsZWN0ZWRTdWJ0aXRsZVRyYWNrSW5kZXg7Ci0KLSAgICBwcml2YXRlIFN1YnRpdGxlVmlldyBtU3VidGl0bGVWaWV3OwotICAgIHByaXZhdGUgYm9vbGVhbiBtU3VidGl0bGVFbmFibGVkOwotCi0gICAgcHJpdmF0ZSBmbG9hdCBtU3BlZWQ7Ci0gICAgLy8gVE9ETzogUmVtb3ZlIG1GYWxsYmFja1NwZWVkIHdoZW4gaW50ZWdyYXRpb24gd2l0aCBNZWRpYVBsYXllcjIncyBuZXcgc2V0UGxheWJhY2tQYXJhbXMoKS4KLSAgICAvLyBSZWZlcjogaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vZG9jdW1lbnQvZC8xbnpBZm5zNmkyaEozUmthVXJlM1FNVDZ3c0RlZEo1T05MaUFfT09CRkZYOC9lZGl0Ci0gICAgcHJpdmF0ZSBmbG9hdCBtRmFsbGJhY2tTcGVlZDsgIC8vIGtlZXAgdGhlIG9yaWdpbmFsIHNwZWVkIGJlZm9yZSAncGF1c2UnIGlzIGNhbGxlZC4KLSAgICBwcml2YXRlIGZsb2F0IG1Wb2x1bWVMZXZlbEZsb2F0OwotICAgIHByaXZhdGUgaW50IG1Wb2x1bWVMZXZlbDsKLQotICAgIHByaXZhdGUgbG9uZyBtU2hvd0NvbnRyb2xsZXJJbnRlcnZhbE1zOwotCi0gICAgcHJpdmF0ZSBNZWRpYVJvdXRlciBtTWVkaWFSb3V0ZXI7Ci0gICAgcHJpdmF0ZSBNZWRpYVJvdXRlU2VsZWN0b3IgbVJvdXRlU2VsZWN0b3I7Ci0gICAgcHJpdmF0ZSBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gbVJvdXRlOwotICAgIHByaXZhdGUgUm91dGVQbGF5ZXIgbVJvdXRlUGxheWVyOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBNZWRpYVJvdXRlci5DYWxsYmFjayBtUm91dGVyQ2FsbGJhY2sgPSBuZXcgTWVkaWFSb3V0ZXIuQ2FsbGJhY2soKSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlU2VsZWN0ZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgICAgIGlmIChyb3V0ZS5zdXBwb3J0c0NvbnRyb2xDYXRlZ29yeShNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLKSkgewotICAgICAgICAgICAgICAgIC8vIFN0b3AgbG9jYWwgcGxheWJhY2sgKGlmIG5lY2Vzc2FyeSkKLSAgICAgICAgICAgICAgICByZXNldFBsYXllcigpOwotICAgICAgICAgICAgICAgIG1Sb3V0ZSA9IHJvdXRlOwotICAgICAgICAgICAgICAgIG1Sb3V0ZVBsYXllciA9IG5ldyBSb3V0ZVBsYXllcihtSW5zdGFuY2UuZ2V0Q29udGV4dCgpLCByb3V0ZSk7Ci0gICAgICAgICAgICAgICAgbVJvdXRlUGxheWVyLnNldFBsYXllckV2ZW50Q2FsbGJhY2sobmV3IFJvdXRlUGxheWVyLlBsYXllckV2ZW50Q2FsbGJhY2soKSB7Ci0gICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblBsYXllclN0YXRlQ2hhbmdlZChNZWRpYUl0ZW1TdGF0dXMgaXRlbVN0YXR1cykgewotICAgICAgICAgICAgICAgICAgICAgICAgUGxheWJhY2tTdGF0ZS5CdWlsZGVyIHBzQnVpbGRlciA9IG5ldyBQbGF5YmFja1N0YXRlLkJ1aWxkZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBzQnVpbGRlci5zZXRBY3Rpb25zKFJvdXRlUGxheWVyLlBMQVlCQUNLX0FDVElPTlMpOwotICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBwb3NpdGlvbiA9IGl0ZW1TdGF0dXMuZ2V0Q29udGVudFBvc2l0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGl0ZW1TdGF0dXMuZ2V0UGxheWJhY2tTdGF0ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNZWRpYUl0ZW1TdGF0dXMuUExBWUJBQ0tfU1RBVEVfUEVORElORzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNCdWlsZGVyLnNldFN0YXRlKFBsYXliYWNrU3RhdGUuU1RBVEVfTk9ORSwgcG9zaXRpb24sIDApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFN0YXRlID0gU1RBVEVfSURMRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNZWRpYUl0ZW1TdGF0dXMuUExBWUJBQ0tfU1RBVEVfUExBWUlORzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNCdWlsZGVyLnNldFN0YXRlKFBsYXliYWNrU3RhdGUuU1RBVEVfUExBWUlORywgcG9zaXRpb24sIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFN0YXRlID0gU1RBVEVfUExBWUlORzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNZWRpYUl0ZW1TdGF0dXMuUExBWUJBQ0tfU1RBVEVfUEFVU0VEOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc0J1aWxkZXIuc2V0U3RhdGUoUGxheWJhY2tTdGF0ZS5TVEFURV9QQVVTRUQsIHBvc2l0aW9uLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IFNUQVRFX1BBVVNFRDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNZWRpYUl0ZW1TdGF0dXMuUExBWUJBQ0tfU1RBVEVfQlVGRkVSSU5HOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc0J1aWxkZXIuc2V0U3RhdGUoUGxheWJhY2tTdGF0ZS5TVEFURV9CVUZGRVJJTkcsIHBvc2l0aW9uLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IFNUQVRFX1BBVVNFRDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNZWRpYUl0ZW1TdGF0dXMuUExBWUJBQ0tfU1RBVEVfRklOSVNIRUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzQnVpbGRlci5zZXRTdGF0ZShQbGF5YmFja1N0YXRlLlNUQVRFX1NUT1BQRUQsIHBvc2l0aW9uLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IFNUQVRFX1BMQVlCQUNLX0NPTVBMRVRFRDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIFBsYXliYWNrU3RhdGUgcGJTdGF0ZSA9IHBzQnVpbGRlci5idWlsZCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgbU1lZGlhU2Vzc2lvbi5zZXRQbGF5YmFja1N0YXRlKHBiU3RhdGUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBNZWRpYU1ldGFkYXRhLkJ1aWxkZXIgbW1CdWlsZGVyID0gbmV3IE1lZGlhTWV0YWRhdGEuQnVpbGRlcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgbW1CdWlsZGVyLnB1dExvbmcoTWVkaWFNZXRhZGF0YS5NRVRBREFUQV9LRVlfRFVSQVRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1TdGF0dXMuZ2V0Q29udGVudER1cmF0aW9uKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgbU1lZGlhU2Vzc2lvbi5zZXRNZXRhZGF0YShtbUJ1aWxkZXIuYnVpbGQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgICAgICAvLyBTdGFydCByZW1vdGUgcGxheWJhY2sgKGlmIG5lY2Vzc2FyeSkKLSAgICAgICAgICAgICAgICBtUm91dGVQbGF5ZXIub3BlblZpZGVvKG1Ec2QpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVVbnNlbGVjdGVkKE1lZGlhUm91dGVyIHJvdXRlciwgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlLCBpbnQgcmVhc29uKSB7Ci0gICAgICAgICAgICBpZiAobVJvdXRlICE9IG51bGwgJiYgbVJvdXRlUGxheWVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtUm91dGVQbGF5ZXIucmVsZWFzZSgpOwotICAgICAgICAgICAgICAgIG1Sb3V0ZVBsYXllciA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobVJvdXRlID09IHJvdXRlKSB7Ci0gICAgICAgICAgICAgICAgbVJvdXRlID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChyZWFzb24gIT0gTWVkaWFSb3V0ZXIuVU5TRUxFQ1RfUkVBU09OX1JPVVRFX0NIQU5HRUQpIHsKLSAgICAgICAgICAgICAgICAvLyBUT0RPOiBSZXN1bWUgbG9jYWwgcGxheWJhY2sgIChpZiBuZWNlc3NhcnkpCi0gICAgICAgICAgICAgICAgb3BlblZpZGVvKG1Ec2QpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHB1YmxpYyBWaWRlb1ZpZXcySW1wbChWaWRlb1ZpZXcyIGluc3RhbmNlLAotICAgICAgICAgICAgVmlld0dyb3VwUHJvdmlkZXIgc3VwZXJQcm92aWRlciwgVmlld0dyb3VwUHJvdmlkZXIgcHJpdmF0ZVByb3ZpZGVyKSB7Ci0gICAgICAgIHN1cGVyKGluc3RhbmNlLCBzdXBlclByb3ZpZGVyLCBwcml2YXRlUHJvdmlkZXIpOwotICAgICAgICBtSW5zdGFuY2UgPSBpbnN0YW5jZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKEBOdWxsYWJsZSBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZUF0dHIsIGludCBkZWZTdHlsZVJlcykgewotICAgICAgICBtVmlkZW9XaWR0aCA9IDA7Ci0gICAgICAgIG1WaWRlb0hlaWdodCA9IDA7Ci0gICAgICAgIG1TcGVlZCA9IDEuMGY7Ci0gICAgICAgIG1GYWxsYmFja1NwZWVkID0gbVNwZWVkOwotICAgICAgICBtU2VsZWN0ZWRTdWJ0aXRsZVRyYWNrSW5kZXggPSBJTlZBTElEX1RSQUNLX0lOREVYOwotICAgICAgICAvLyBUT0RPOiBhZGQgYXR0cmlidXRlcyB0byBnZXQgdGhpcyB2YWx1ZS4KLSAgICAgICAgbVNob3dDb250cm9sbGVySW50ZXJ2YWxNcyA9IERFRkFVTFRfU0hPV19DT05UUk9MTEVSX0lOVEVSVkFMX01TOwotCi0gICAgICAgIG1BY2Nlc3NpYmlsaXR5TWFuYWdlciA9IEFjY2Vzc2liaWxpdHlNYW5hZ2VyLmdldEluc3RhbmNlKG1JbnN0YW5jZS5nZXRDb250ZXh0KCkpOwotCi0gICAgICAgIG1BdWRpb01hbmFnZXIgPSAoQXVkaW9NYW5hZ2VyKSBtSW5zdGFuY2UuZ2V0Q29udGV4dCgpCi0gICAgICAgICAgICAgICAgLmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5BVURJT19TRVJWSUNFKTsKLSAgICAgICAgbUF1ZGlvQXR0cmlidXRlcyA9IG5ldyBBdWRpb0F0dHJpYnV0ZXMuQnVpbGRlcigpLnNldFVzYWdlKEF1ZGlvQXR0cmlidXRlcy5VU0FHRV9NRURJQSkKLSAgICAgICAgICAgICAgICAuc2V0Q29udGVudFR5cGUoQXVkaW9BdHRyaWJ1dGVzLkNPTlRFTlRfVFlQRV9NT1ZJRSkuYnVpbGQoKTsKLSAgICAgICAgbUluc3RhbmNlLnNldEZvY3VzYWJsZSh0cnVlKTsKLSAgICAgICAgbUluc3RhbmNlLnNldEZvY3VzYWJsZUluVG91Y2hNb2RlKHRydWUpOwotICAgICAgICBtSW5zdGFuY2UucmVxdWVzdEZvY3VzKCk7Ci0KLSAgICAgICAgLy8gVE9ETzogdHJ5IHRvIGtlZXAgYSBzaW5nbGUgY2hpbGQgYXQgYSB0aW1lIHJhdGhlciB0aGFuIGFsd2F5cyBoYXZpbmcgYm90aC4KLSAgICAgICAgbVRleHR1cmVWaWV3ID0gbmV3IFZpZGVvVGV4dHVyZVZpZXcobUluc3RhbmNlLmdldENvbnRleHQoKSk7Ci0gICAgICAgIG1TdXJmYWNlVmlldyA9IG5ldyBWaWRlb1N1cmZhY2VWaWV3KG1JbnN0YW5jZS5nZXRDb250ZXh0KCkpOwotICAgICAgICBMYXlvdXRQYXJhbXMgcGFyYW1zID0gbmV3IExheW91dFBhcmFtcyhMYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5ULAotICAgICAgICAgICAgICAgIExheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQpOwotICAgICAgICBtVGV4dHVyZVZpZXcuc2V0TGF5b3V0UGFyYW1zKHBhcmFtcyk7Ci0gICAgICAgIG1TdXJmYWNlVmlldy5zZXRMYXlvdXRQYXJhbXMocGFyYW1zKTsKLSAgICAgICAgbVRleHR1cmVWaWV3LnNldFN1cmZhY2VMaXN0ZW5lcih0aGlzKTsKLSAgICAgICAgbVN1cmZhY2VWaWV3LnNldFN1cmZhY2VMaXN0ZW5lcih0aGlzKTsKLSAgICAgICAgbUluc3RhbmNlLmFkZFZpZXcobVRleHR1cmVWaWV3KTsKLSAgICAgICAgbUluc3RhbmNlLmFkZFZpZXcobVN1cmZhY2VWaWV3KTsKLQotICAgICAgICBtU3VidGl0bGVWaWV3ID0gbmV3IFN1YnRpdGxlVmlldyhtSW5zdGFuY2UuZ2V0Q29udGV4dCgpKTsKLSAgICAgICAgbVN1YnRpdGxlVmlldy5zZXRMYXlvdXRQYXJhbXMocGFyYW1zKTsKLSAgICAgICAgbVN1YnRpdGxlVmlldy5zZXRCYWNrZ3JvdW5kQ29sb3IoMCk7Ci0gICAgICAgIG1JbnN0YW5jZS5hZGRWaWV3KG1TdWJ0aXRsZVZpZXcpOwotCi0gICAgICAgIGJvb2xlYW4gZW5hYmxlQ29udHJvbFZpZXcgPSAoYXR0cnMgPT0gbnVsbCkgfHwgYXR0cnMuZ2V0QXR0cmlidXRlQm9vbGVhblZhbHVlKAotICAgICAgICAgICAgICAgICJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiLAotICAgICAgICAgICAgICAgICJlbmFibGVDb250cm9sVmlldyIsIHRydWUpOwotICAgICAgICBpZiAoZW5hYmxlQ29udHJvbFZpZXcpIHsKLSAgICAgICAgICAgIG1NZWRpYUNvbnRyb2xWaWV3ID0gbmV3IE1lZGlhQ29udHJvbFZpZXcyKG1JbnN0YW5jZS5nZXRDb250ZXh0KCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgbVN1YnRpdGxlRW5hYmxlZCA9IChhdHRycyA9PSBudWxsKSB8fCBhdHRycy5nZXRBdHRyaWJ1dGVCb29sZWFuVmFsdWUoCi0gICAgICAgICAgICAgICAgImh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIsCi0gICAgICAgICAgICAgICAgImVuYWJsZVN1YnRpdGxlIiwgZmFsc2UpOwotCi0gICAgICAgIC8vIFRPRE86IENob29zZSBUZXh0dXJlVmlldyB3aGVuIFN1cmZhY2VWaWV3IGNhbm5vdCBiZSBjcmVhdGVkLgotICAgICAgICAvLyBDaG9vc2Ugc3VyZmFjZSB2aWV3IGJ5IGRlZmF1bHQKLSAgICAgICAgaW50IHZpZXdUeXBlID0gKGF0dHJzID09IG51bGwpID8gVmlkZW9WaWV3Mi5WSUVXX1RZUEVfU1VSRkFDRVZJRVcKLSAgICAgICAgICAgICAgICA6IGF0dHJzLmdldEF0dHJpYnV0ZUludFZhbHVlKAotICAgICAgICAgICAgICAgICJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiLAotICAgICAgICAgICAgICAgICJ2aWV3VHlwZSIsIFZpZGVvVmlldzIuVklFV19UWVBFX1NVUkZBQ0VWSUVXKTsKLSAgICAgICAgaWYgKHZpZXdUeXBlID09IFZpZGVvVmlldzIuVklFV19UWVBFX1NVUkZBQ0VWSUVXKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJ2aWV3VHlwZSBhdHRyaWJ1dGUgaXMgc3VyZmFjZVZpZXcuIik7Ci0gICAgICAgICAgICBtVGV4dHVyZVZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgbVN1cmZhY2VWaWV3LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgIG1DdXJyZW50VmlldyA9IG1TdXJmYWNlVmlldzsKLSAgICAgICAgfSBlbHNlIGlmICh2aWV3VHlwZSA9PSBWaWRlb1ZpZXcyLlZJRVdfVFlQRV9URVhUVVJFVklFVykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAidmlld1R5cGUgYXR0cmlidXRlIGlzIHRleHR1cmVWaWV3LiIpOwotICAgICAgICAgICAgbVRleHR1cmVWaWV3LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgIG1TdXJmYWNlVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICBtQ3VycmVudFZpZXcgPSBtVGV4dHVyZVZpZXc7Ci0gICAgICAgIH0KLQotICAgICAgICBNZWRpYVJvdXRlU2VsZWN0b3IuQnVpbGRlciBidWlsZGVyID0gbmV3IE1lZGlhUm91dGVTZWxlY3Rvci5CdWlsZGVyKCk7Ci0gICAgICAgIGJ1aWxkZXIuYWRkQ29udHJvbENhdGVnb3J5KE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9SRU1PVEVfUExBWUJBQ0spOwotICAgICAgICBidWlsZGVyLmFkZENvbnRyb2xDYXRlZ29yeShNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfTElWRV9BVURJTyk7Ci0gICAgICAgIGJ1aWxkZXIuYWRkQ29udHJvbENhdGVnb3J5KE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9MSVZFX1ZJREVPKTsKLSAgICAgICAgbVJvdXRlU2VsZWN0b3IgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0TWVkaWFDb250cm9sVmlldzJfaW1wbChNZWRpYUNvbnRyb2xWaWV3MiBtZWRpYUNvbnRyb2xWaWV3LCBsb25nIGludGVydmFsTXMpIHsKLSAgICAgICAgbU1lZGlhQ29udHJvbFZpZXcgPSBtZWRpYUNvbnRyb2xWaWV3OwotICAgICAgICBtU2hvd0NvbnRyb2xsZXJJbnRlcnZhbE1zID0gaW50ZXJ2YWxNczsKLSAgICAgICAgLy8gVE9ETzogQ2FsbCBNZWRpYUNvbnRyb2xWaWV3Mi5zZXRSb3V0ZVNlbGVjdG9yIG9ubHkgd2hlbiBjYXN0IGF2YWlsYWxiZS4KLSAgICAgICAgKChNZWRpYUNvbnRyb2xWaWV3MkltcGwpIG1NZWRpYUNvbnRyb2xWaWV3LmdldFByb3ZpZGVyKCkpLnNldFJvdXRlU2VsZWN0b3IobVJvdXRlU2VsZWN0b3IpOwotCi0gICAgICAgIGlmIChtSW5zdGFuY2UuaXNBdHRhY2hlZFRvV2luZG93KCkpIHsKLSAgICAgICAgICAgIGF0dGFjaE1lZGlhQ29udHJvbFZpZXcoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNZWRpYUNvbnRyb2xsZXIgZ2V0TWVkaWFDb250cm9sbGVyX2ltcGwoKSB7Ci0gICAgICAgIGlmIChtTWVkaWFTZXNzaW9uID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk1lZGlhU2Vzc2lvbiBpbnN0YW5jZSBpcyBub3QgYXZhaWxhYmxlLiIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtTWVkaWFDb250cm9sbGVyOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTZXNzaW9uVG9rZW4yIGdldE1lZGlhU2Vzc2lvblRva2VuX2ltcGwoKSB7Ci0gICAgICAgIC8vIFRPRE86IGltcGxlbWVudCB0aGlzCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNZWRpYUNvbnRyb2xWaWV3MiBnZXRNZWRpYUNvbnRyb2xWaWV3Ml9pbXBsKCkgewotICAgICAgICByZXR1cm4gbU1lZGlhQ29udHJvbFZpZXc7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1lZGlhTWV0YWRhdGEyIGdldE1lZGlhTWV0YWRhdGFfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG1NZWRpYU1ldGFkYXRhOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldE1lZGlhTWV0YWRhdGFfaW1wbChNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSkgewotICAgICAgICAvLyBUT0RPOiBpbnRlZ3JhdGUgdGhpcyB3aXRoIE1lZGlhU2Vzc2lvbjIjTWVkaWFJdGVtMgotICAgICAgICBtTWVkaWFNZXRhZGF0YSA9IG1ldGFkYXRhOwotCi0gICAgICAgIC8vIFRPRE86IGFkZCBzdXBwb3J0IGZvciBoYW5kbGluZyB3ZWJzaXRlIGxpbmsKLSAgICAgICAgbU1lZGlhVHlwZURhdGEgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgIGJvb2xlYW4gaXNBZCA9IG1ldGFkYXRhID09IG51bGwgPwotICAgICAgICAgICAgICAgIGZhbHNlIDogbWV0YWRhdGEuZ2V0TG9uZyhNZWRpYU1ldGFkYXRhMi5NRVRBREFUQV9LRVlfQURWRVJUSVNFTUVOVCkgIT0gMDsKLSAgICAgICAgbU1lZGlhVHlwZURhdGEucHV0Qm9vbGVhbigKLSAgICAgICAgICAgICAgICBNZWRpYUNvbnRyb2xWaWV3MkltcGwuS0VZX1NUQVRFX0lTX0FEVkVSVElTRU1FTlQsIGlzQWQpOwotCi0gICAgICAgIGlmIChtTWVkaWFTZXNzaW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1NZWRpYVNlc3Npb24uc2VuZFNlc3Npb25FdmVudCgKLSAgICAgICAgICAgICAgICAgICAgTWVkaWFDb250cm9sVmlldzJJbXBsLkVWRU5UX1VQREFURV9NRURJQV9UWVBFX1NUQVRVUywgbU1lZGlhVHlwZURhdGEpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gVXBkYXRlIGxhdGVyIGluc2lkZSBPblByZXBhcmVkTGlzdGVuZXIgYWZ0ZXIgTWVkaWFTZXNzaW9uIGlzIGluaXRpYWxpemVkLgotICAgICAgICAgICAgbU5lZWRVcGRhdGVNZWRpYVR5cGUgPSB0cnVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0U3VidGl0bGVFbmFibGVkX2ltcGwoYm9vbGVhbiBlbmFibGUpIHsKLSAgICAgICAgaWYgKGVuYWJsZSAhPSBtU3VidGl0bGVFbmFibGVkKSB7Ci0gICAgICAgICAgICBzZWxlY3RPckRlc2VsZWN0U3VidGl0bGUoZW5hYmxlKTsKLSAgICAgICAgfQotICAgICAgICBtU3VidGl0bGVFbmFibGVkID0gZW5hYmxlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzU3VidGl0bGVFbmFibGVkX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtU3VidGl0bGVFbmFibGVkOwotICAgIH0KLQotICAgIC8vIFRPRE86IHJlbW92ZSBzZXRTcGVlZF9pbXBsIG9uY2UgTWVkaWFDb250cm9sbGVyMiBpcyByZWFkeS4KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRTcGVlZF9pbXBsKGZsb2F0IHNwZWVkKSB7Ci0gICAgICAgIGlmIChzcGVlZCA8PSAwLjBmKSB7Ci0gICAgICAgICAgICBMb2cuZShUQUcsICJVbnN1cHBvcnRlZCBzcGVlZCAoIiArIHNwZWVkICsgIikgaXMgaWdub3JlZC4iKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBtU3BlZWQgPSBzcGVlZDsKLSAgICAgICAgaWYgKG1NZWRpYVBsYXllciAhPSBudWxsICYmIG1NZWRpYVBsYXllci5pc1BsYXlpbmcoKSkgewotICAgICAgICAgICAgYXBwbHlTcGVlZCgpOwotICAgICAgICB9Ci0gICAgICAgIHVwZGF0ZVBsYXliYWNrU3RhdGUoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRBdWRpb0ZvY3VzUmVxdWVzdF9pbXBsKGludCBmb2N1c0dhaW4pIHsKLSAgICAgICAgaWYgKGZvY3VzR2FpbiAhPSBBdWRpb01hbmFnZXIuQVVESU9GT0NVU19OT05FCi0gICAgICAgICAgICAgICAgJiYgZm9jdXNHYWluICE9IEF1ZGlvTWFuYWdlci5BVURJT0ZPQ1VTX0dBSU4KLSAgICAgICAgICAgICAgICAmJiBmb2N1c0dhaW4gIT0gQXVkaW9NYW5hZ2VyLkFVRElPRk9DVVNfR0FJTl9UUkFOU0lFTlQKLSAgICAgICAgICAgICAgICAmJiBmb2N1c0dhaW4gIT0gQXVkaW9NYW5hZ2VyLkFVRElPRk9DVVNfR0FJTl9UUkFOU0lFTlRfTUFZX0RVQ0sKLSAgICAgICAgICAgICAgICAmJiBmb2N1c0dhaW4gIT0gQXVkaW9NYW5hZ2VyLkFVRElPRk9DVVNfR0FJTl9UUkFOU0lFTlRfRVhDTFVTSVZFKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbGxlZ2FsIGF1ZGlvIGZvY3VzIHR5cGUgIiArIGZvY3VzR2Fpbik7Ci0gICAgICAgIH0KLSAgICAgICAgbUF1ZGlvRm9jdXNUeXBlID0gZm9jdXNHYWluOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldEF1ZGlvQXR0cmlidXRlc19pbXBsKEF1ZGlvQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7Ci0gICAgICAgIGlmIChhdHRyaWJ1dGVzID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIklsbGVnYWwgbnVsbCBBdWRpb0F0dHJpYnV0ZXMiKTsKLSAgICAgICAgfQotICAgICAgICBtQXVkaW9BdHRyaWJ1dGVzID0gYXR0cmlidXRlczsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRWaWRlb1BhdGhfaW1wbChTdHJpbmcgcGF0aCkgewotICAgICAgICBtSW5zdGFuY2Uuc2V0VmlkZW9VcmkoVXJpLnBhcnNlKHBhdGgpKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRWaWRlb1VyaV9pbXBsKFVyaSB1cmkpIHsKLSAgICAgICAgbUluc3RhbmNlLnNldFZpZGVvVXJpKHVyaSwgbnVsbCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0VmlkZW9VcmlfaW1wbChVcmkgdXJpLCBNYXA8U3RyaW5nLCBTdHJpbmc+IGhlYWRlcnMpIHsKLSAgICAgICAgRGF0YVNvdXJjZURlc2MuQnVpbGRlciBidWlsZGVyID0gbmV3IERhdGFTb3VyY2VEZXNjLkJ1aWxkZXIoKTsKLSAgICAgICAgYnVpbGRlci5zZXREYXRhU291cmNlKG1JbnN0YW5jZS5nZXRDb250ZXh0KCksIHVyaSwgaGVhZGVycywgbnVsbCk7Ci0gICAgICAgIG1JbnN0YW5jZS5zZXREYXRhU291cmNlKGJ1aWxkZXIuYnVpbGQoKSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0TWVkaWFJdGVtX2ltcGwoTWVkaWFJdGVtMiBtZWRpYUl0ZW0pIHsKLSAgICAgICAgLy8gVE9ETzogaW1wbGVtZW50IHRoaXMKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXREYXRhU291cmNlX2ltcGwoRGF0YVNvdXJjZURlc2MgZHNkKSB7Ci0gICAgICAgIG1Ec2QgPSBkc2Q7Ci0gICAgICAgIG1TZWVrV2hlblByZXBhcmVkID0gMDsKLSAgICAgICAgb3BlblZpZGVvKGRzZCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0Vmlld1R5cGVfaW1wbChpbnQgdmlld1R5cGUpIHsKLSAgICAgICAgaWYgKHZpZXdUeXBlID09IG1DdXJyZW50Vmlldy5nZXRWaWV3VHlwZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgVmlkZW9WaWV3SW50ZXJmYWNlIHRhcmdldFZpZXc7Ci0gICAgICAgIGlmICh2aWV3VHlwZSA9PSBWaWRlb1ZpZXcyLlZJRVdfVFlQRV9URVhUVVJFVklFVykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAic3dpdGNoaW5nIHRvIFRleHR1cmVWaWV3Iik7Ci0gICAgICAgICAgICB0YXJnZXRWaWV3ID0gbVRleHR1cmVWaWV3OwotICAgICAgICB9IGVsc2UgaWYgKHZpZXdUeXBlID09IFZpZGVvVmlldzIuVklFV19UWVBFX1NVUkZBQ0VWSUVXKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJzd2l0Y2hpbmcgdG8gU3VyZmFjZVZpZXciKTsKLSAgICAgICAgICAgIHRhcmdldFZpZXcgPSBtU3VyZmFjZVZpZXc7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmtub3duIHZpZXcgdHlwZTogIiArIHZpZXdUeXBlKTsKLSAgICAgICAgfQotICAgICAgICAoKFZpZXcpIHRhcmdldFZpZXcpLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgdGFyZ2V0Vmlldy50YWtlT3ZlcihtQ3VycmVudFZpZXcpOwotICAgICAgICBtSW5zdGFuY2UucmVxdWVzdExheW91dCgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgZ2V0Vmlld1R5cGVfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG1DdXJyZW50Vmlldy5nZXRWaWV3VHlwZSgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldEN1c3RvbUFjdGlvbnNfaW1wbCgKLSAgICAgICAgICAgIExpc3Q8UGxheWJhY2tTdGF0ZS5DdXN0b21BY3Rpb24+IGFjdGlvbkxpc3QsCi0gICAgICAgICAgICBFeGVjdXRvciBleGVjdXRvciwgVmlkZW9WaWV3Mi5PbkN1c3RvbUFjdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgIG1DdXN0b21BY3Rpb25MaXN0ID0gYWN0aW9uTGlzdDsKLSAgICAgICAgbUN1c3RvbUFjdGlvbkxpc3RlbmVyUmVjb3JkID0gbmV3IFBhaXI8PihleGVjdXRvciwgbGlzdGVuZXIpOwotCi0gICAgICAgIC8vIENyZWF0ZSBhIG5ldyBwbGF5YmFjayBidWlsZGVyIGluIG9yZGVyIHRvIGNsZWFyIGV4aXN0aW5nIHRoZSBjdXN0b20gYWN0aW9ucy4KLSAgICAgICAgbVN0YXRlQnVpbGRlciA9IG51bGw7Ci0gICAgICAgIHVwZGF0ZVBsYXliYWNrU3RhdGUoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRPblZpZXdUeXBlQ2hhbmdlZExpc3RlbmVyX2ltcGwoVmlkZW9WaWV3Mi5PblZpZXdUeXBlQ2hhbmdlZExpc3RlbmVyIGwpIHsKLSAgICAgICAgbVZpZXdUeXBlQ2hhbmdlZExpc3RlbmVyID0gbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRGdWxsU2NyZWVuUmVxdWVzdExpc3RlbmVyX2ltcGwoVmlkZW9WaWV3Mi5PbkZ1bGxTY3JlZW5SZXF1ZXN0TGlzdGVuZXIgbCkgewotICAgICAgICBtRnVsbFNjcmVlblJlcXVlc3RMaXN0ZW5lciA9IGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25BdHRhY2hlZFRvV2luZG93X2ltcGwoKSB7Ci0gICAgICAgIHN1cGVyLm9uQXR0YWNoZWRUb1dpbmRvd19pbXBsKCk7Ci0KLSAgICAgICAgLy8gQ3JlYXRlIE1lZGlhU2Vzc2lvbgotICAgICAgICBtTWVkaWFTZXNzaW9uID0gbmV3IE1lZGlhU2Vzc2lvbihtSW5zdGFuY2UuZ2V0Q29udGV4dCgpLCAiVmlkZW9WaWV3Mk1lZGlhU2Vzc2lvbiIpOwotICAgICAgICBtTWVkaWFTZXNzaW9uLnNldENhbGxiYWNrKG5ldyBNZWRpYVNlc3Npb25DYWxsYmFjaygpKTsKLSAgICAgICAgbU1lZGlhU2Vzc2lvbi5zZXRBY3RpdmUodHJ1ZSk7Ci0gICAgICAgIG1NZWRpYUNvbnRyb2xsZXIgPSBtTWVkaWFTZXNzaW9uLmdldENvbnRyb2xsZXIoKTsKLSAgICAgICAgbU1lZGlhUm91dGVyID0gTWVkaWFSb3V0ZXIuZ2V0SW5zdGFuY2UobUluc3RhbmNlLmdldENvbnRleHQoKSk7Ci0gICAgICAgIG1NZWRpYVJvdXRlci5zZXRNZWRpYVNlc3Npb24obU1lZGlhU2Vzc2lvbik7Ci0gICAgICAgIG1NZWRpYVJvdXRlci5hZGRDYWxsYmFjayhtUm91dGVTZWxlY3RvciwgbVJvdXRlckNhbGxiYWNrKTsKLSAgICAgICAgYXR0YWNoTWVkaWFDb250cm9sVmlldygpOwotICAgICAgICAvLyBUT0RPOiByZW1vdmUgdGhpcyBhZnRlciBtb3ZpbmcgTWVkaWFTZXNzaW9uIGNyZWF0aW5nIGNvZGUgaW5zaWRlIGluaXRpYWxpemluZyBWaWRlb1ZpZXcyCi0gICAgICAgIGlmIChtQ3VycmVudFN0YXRlID09IFNUQVRFX1BSRVBBUkVEKSB7Ci0gICAgICAgICAgICBleHRyYWN0VHJhY2tzKCk7Ci0gICAgICAgICAgICBleHRyYWN0TWV0YWRhdGEoKTsKLSAgICAgICAgICAgIGV4dHJhY3RBdWRpb01ldGFkYXRhKCk7Ci0gICAgICAgICAgICBpZiAobU5lZWRVcGRhdGVNZWRpYVR5cGUpIHsKLSAgICAgICAgICAgICAgICBtTWVkaWFTZXNzaW9uLnNlbmRTZXNzaW9uRXZlbnQoCi0gICAgICAgICAgICAgICAgICAgICAgICBNZWRpYUNvbnRyb2xWaWV3MkltcGwuRVZFTlRfVVBEQVRFX01FRElBX1RZUEVfU1RBVFVTLAotICAgICAgICAgICAgICAgICAgICAgICAgbU1lZGlhVHlwZURhdGEpOwotICAgICAgICAgICAgICAgIG1OZWVkVXBkYXRlTWVkaWFUeXBlID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkRldGFjaGVkRnJvbVdpbmRvd19pbXBsKCkgewotICAgICAgICBzdXBlci5vbkRldGFjaGVkRnJvbVdpbmRvd19pbXBsKCk7Ci0KLSAgICAgICAgbU1lZGlhU2Vzc2lvbi5yZWxlYXNlKCk7Ci0gICAgICAgIG1NZWRpYVNlc3Npb24gPSBudWxsOwotICAgICAgICBtTWVkaWFDb250cm9sbGVyID0gbnVsbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQ2hhclNlcXVlbmNlIGdldEFjY2Vzc2liaWxpdHlDbGFzc05hbWVfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIFZpZGVvVmlldzIuY2xhc3MuZ2V0TmFtZSgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIG9uVG91Y2hFdmVudF9pbXBsKE1vdGlvbkV2ZW50IGV2KSB7Ci0gICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAib25Ub3VjaEV2ZW50KCkuIG1DdXJyZW50U3RhdGU9IiArIG1DdXJyZW50U3RhdGUKLSAgICAgICAgICAgICAgICAgICAgKyAiLCBtVGFyZ2V0U3RhdGU9IiArIG1UYXJnZXRTdGF0ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGV2LmdldEFjdGlvbigpID09IE1vdGlvbkV2ZW50LkFDVElPTl9VUCAmJiBtTWVkaWFDb250cm9sVmlldyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoIW1Jc011c2ljTWVkaWFUeXBlIHx8IG1TaXplVHlwZSAhPSBTSVpFX1RZUEVfRlVMTCkgewotICAgICAgICAgICAgICAgIHRvZ2dsZU1lZGlhQ29udHJvbFZpZXdWaXNpYmlsaXR5KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc3VwZXIub25Ub3VjaEV2ZW50X2ltcGwoZXYpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIG9uVHJhY2tiYWxsRXZlbnRfaW1wbChNb3Rpb25FdmVudCBldikgewotICAgICAgICBpZiAoZXYuZ2V0QWN0aW9uKCkgPT0gTW90aW9uRXZlbnQuQUNUSU9OX1VQICYmIG1NZWRpYUNvbnRyb2xWaWV3ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmICghbUlzTXVzaWNNZWRpYVR5cGUgfHwgbVNpemVUeXBlICE9IFNJWkVfVFlQRV9GVUxMKSB7Ci0gICAgICAgICAgICAgICAgdG9nZ2xlTWVkaWFDb250cm9sVmlld1Zpc2liaWxpdHkoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzdXBlci5vblRyYWNrYmFsbEV2ZW50X2ltcGwoZXYpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGRpc3BhdGNoVG91Y2hFdmVudF9pbXBsKE1vdGlvbkV2ZW50IGV2KSB7Ci0gICAgICAgIC8vIFRPRE86IFRlc3QgdG91Y2ggZXZlbnQgaGFuZGxpbmcgbG9naWMgdGhvcm91Z2hseSBhbmQgc2ltcGxpZnkgdGhlIGxvZ2ljLgotICAgICAgICByZXR1cm4gc3VwZXIuZGlzcGF0Y2hUb3VjaEV2ZW50X2ltcGwoZXYpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uTWVhc3VyZV9pbXBsKGludCB3aWR0aE1lYXN1cmVTcGVjLCBpbnQgaGVpZ2h0TWVhc3VyZVNwZWMpIHsKLSAgICAgICAgc3VwZXIub25NZWFzdXJlX2ltcGwod2lkdGhNZWFzdXJlU3BlYywgaGVpZ2h0TWVhc3VyZVNwZWMpOwotCi0gICAgICAgIGlmIChtSXNNdXNpY01lZGlhVHlwZSkgewotICAgICAgICAgICAgaWYgKG1QcmV2V2lkdGggIT0gbUluc3RhbmNlLmdldE1lYXN1cmVkV2lkdGgoKQotICAgICAgICAgICAgICAgICAgICB8fCBtUHJldkhlaWdodCAhPSBtSW5zdGFuY2UuZ2V0TWVhc3VyZWRIZWlnaHQoKSkgewotICAgICAgICAgICAgICAgIGludCBjdXJyV2lkdGggPSBtSW5zdGFuY2UuZ2V0TWVhc3VyZWRXaWR0aCgpOwotICAgICAgICAgICAgICAgIGludCBjdXJySGVpZ2h0ID0gbUluc3RhbmNlLmdldE1lYXN1cmVkSGVpZ2h0KCk7Ci0gICAgICAgICAgICAgICAgUG9pbnQgc2NyZWVuU2l6ZSA9IG5ldyBQb2ludCgpOwotICAgICAgICAgICAgICAgIG1NYW5hZ2VyLmdldERlZmF1bHREaXNwbGF5KCkuZ2V0U2l6ZShzY3JlZW5TaXplKTsKLSAgICAgICAgICAgICAgICBpbnQgc2NyZWVuV2lkdGggPSBzY3JlZW5TaXplLng7Ci0gICAgICAgICAgICAgICAgaW50IHNjcmVlbkhlaWdodCA9IHNjcmVlblNpemUueTsKLQotICAgICAgICAgICAgICAgIGlmIChjdXJyV2lkdGggPT0gc2NyZWVuV2lkdGggJiYgY3VyckhlaWdodCA9PSBzY3JlZW5IZWlnaHQpIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IG9yaWVudGF0aW9uID0gcmV0cmlldmVPcmllbnRhdGlvbigpOwotICAgICAgICAgICAgICAgICAgICBpZiAob3JpZW50YXRpb24gPT0gQWN0aXZpdHlJbmZvLlNDUkVFTl9PUklFTlRBVElPTl9MQU5EU0NBUEUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGluZmxhdGVNdXNpY1ZpZXcoUi5sYXlvdXQuZnVsbF9sYW5kc2NhcGVfbXVzaWMpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaW5mbGF0ZU11c2ljVmlldyhSLmxheW91dC5mdWxsX3BvcnRyYWl0X211c2ljKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChtU2l6ZVR5cGUgIT0gU0laRV9UWVBFX0ZVTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TaXplVHlwZSA9IFNJWkVfVFlQRV9GVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVtb3ZlIGV4aXN0aW5nIG1GYWRlT3V0IGNhbGxiYWNrCi0gICAgICAgICAgICAgICAgICAgICAgICBtTWVkaWFDb250cm9sVmlldy5yZW1vdmVDYWxsYmFja3MobUZhZGVPdXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgbU1lZGlhQ29udHJvbFZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1TaXplVHlwZSAhPSBTSVpFX1RZUEVfRU1CRURERUQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TaXplVHlwZSA9IFNJWkVfVFlQRV9FTUJFRERFRDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGluZmxhdGVNdXNpY1ZpZXcoUi5sYXlvdXQuZW1iZWRkZWRfbXVzaWMpOwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWRkIG5ldyBtRmFkZU91dCBjYWxsYmFjawotICAgICAgICAgICAgICAgICAgICAgICAgbU1lZGlhQ29udHJvbFZpZXcucG9zdERlbGF5ZWQobUZhZGVPdXQsIG1TaG93Q29udHJvbGxlckludGVydmFsTXMpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1QcmV2V2lkdGggPSBjdXJyV2lkdGg7Ci0gICAgICAgICAgICAgICAgbVByZXZIZWlnaHQgPSBjdXJySGVpZ2h0OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgLy8gSW1wbGVtZW50cyBWaWRlb1ZpZXdJbnRlcmZhY2UuU3VyZmFjZUxpc3RlbmVyCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblN1cmZhY2VDcmVhdGVkKFZpZXcgdmlldywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0gICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAib25TdXJmYWNlQ3JlYXRlZCgpLiBtQ3VycmVudFN0YXRlPSIgKyBtQ3VycmVudFN0YXRlCi0gICAgICAgICAgICAgICAgICAgICsgIiwgbVRhcmdldFN0YXRlPSIgKyBtVGFyZ2V0U3RhdGUgKyAiLCB3aWR0aC9oZWlnaHQ6ICIgKyB3aWR0aCArICIvIiArIGhlaWdodAotICAgICAgICAgICAgICAgICAgICArICIsICIgKyB2aWV3LnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChuZWVkVG9TdGFydCgpKSB7Ci0gICAgICAgICAgICBtTWVkaWFDb250cm9sbGVyLmdldFRyYW5zcG9ydENvbnRyb2xzKCkucGxheSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25TdXJmYWNlRGVzdHJveWVkKFZpZXcgdmlldykgewotICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIm9uU3VyZmFjZURlc3Ryb3llZCgpLiBtQ3VycmVudFN0YXRlPSIgKyBtQ3VycmVudFN0YXRlCi0gICAgICAgICAgICAgICAgICAgICsgIiwgbVRhcmdldFN0YXRlPSIgKyBtVGFyZ2V0U3RhdGUgKyAiLCAiICsgdmlldy50b1N0cmluZygpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uU3VyZmFjZUNoYW5nZWQoVmlldyB2aWV3LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLSAgICAgICAgLy8gVE9ETzogRG8gd2UgbmVlZCB0byBjYWxsIHJlcXVlc3RMYXlvdXQgaGVyZT8KLSAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJvblN1cmZhY2VDaGFuZ2VkKCkuIHdpZHRoL2hlaWdodDogIiArIHdpZHRoICsgIi8iICsgaGVpZ2h0Ci0gICAgICAgICAgICAgICAgICAgICsgIiwgIiArIHZpZXcudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblN1cmZhY2VUYWtlT3ZlckRvbmUoVmlkZW9WaWV3SW50ZXJmYWNlIHZpZXcpIHsKLSAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJvblN1cmZhY2VUYWtlT3ZlckRvbmUoKS4gTm93IGN1cnJlbnQgdmlldyBpczogIiArIHZpZXcpOwotICAgICAgICB9Ci0gICAgICAgIG1DdXJyZW50VmlldyA9IHZpZXc7Ci0gICAgICAgIGlmIChtVmlld1R5cGVDaGFuZ2VkTGlzdGVuZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbVZpZXdUeXBlQ2hhbmdlZExpc3RlbmVyLm9uVmlld1R5cGVDaGFuZ2VkKG1JbnN0YW5jZSwgdmlldy5nZXRWaWV3VHlwZSgpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobmVlZFRvU3RhcnQoKSkgewotICAgICAgICAgICAgbU1lZGlhQ29udHJvbGxlci5nZXRUcmFuc3BvcnRDb250cm9scygpLnBsYXkoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIC8vIFByb3RlY3RlZCBvciBwcml2YXRlIG1ldGhvZHMKLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotICAgIHByaXZhdGUgdm9pZCBhdHRhY2hNZWRpYUNvbnRyb2xWaWV3KCkgewotICAgICAgICAvLyBHZXQgTWVkaWFDb250cm9sbGVyIGZyb20gTWVkaWFTZXNzaW9uIGFuZCBzZXQgaXQgaW5zaWRlIE1lZGlhQ29udHJvbFZpZXcKLSAgICAgICAgbU1lZGlhQ29udHJvbFZpZXcuc2V0Q29udHJvbGxlcihtTWVkaWFTZXNzaW9uLmdldENvbnRyb2xsZXIoKSk7Ci0KLSAgICAgICAgTGF5b3V0UGFyYW1zIHBhcmFtcyA9Ci0gICAgICAgICAgICAgICAgbmV3IExheW91dFBhcmFtcyhMYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5ULCBMYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UKTsKLSAgICAgICAgbUluc3RhbmNlLmFkZFZpZXcobU1lZGlhQ29udHJvbFZpZXcsIHBhcmFtcyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzSW5QbGF5YmFja1N0YXRlKCkgewotICAgICAgICByZXR1cm4gKG1NZWRpYVBsYXllciAhPSBudWxsIHx8IG1Sb3V0ZVBsYXllciAhPSBudWxsKQotICAgICAgICAgICAgICAgICYmIG1DdXJyZW50U3RhdGUgIT0gU1RBVEVfRVJST1IKLSAgICAgICAgICAgICAgICAmJiBtQ3VycmVudFN0YXRlICE9IFNUQVRFX0lETEUKLSAgICAgICAgICAgICAgICAmJiBtQ3VycmVudFN0YXRlICE9IFNUQVRFX1BSRVBBUklORzsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gbmVlZFRvU3RhcnQoKSB7Ci0gICAgICAgIHJldHVybiAobU1lZGlhUGxheWVyICE9IG51bGwgfHwgbVJvdXRlUGxheWVyICE9IG51bGwpCi0gICAgICAgICAgICAgICAgJiYgbUN1cnJlbnRTdGF0ZSAhPSBTVEFURV9QTEFZSU5HCi0gICAgICAgICAgICAgICAgJiYgbVRhcmdldFN0YXRlID09IFNUQVRFX1BMQVlJTkc7Ci0gICAgfQotCi0gICAgLy8gQ3JlYXRlcyBhIE1lZGlhUGxheWVyMiBpbnN0YW5jZSBhbmQgcHJlcGFyZSBwbGF5YmFjay4KLSAgICBwcml2YXRlIHZvaWQgb3BlblZpZGVvKERhdGFTb3VyY2VEZXNjIGRzZCkgewotICAgICAgICBVcmkgdXJpID0gZHNkLmdldFVyaSgpOwotICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IGhlYWRlcnMgPSBkc2QuZ2V0VXJpSGVhZGVycygpOwotICAgICAgICByZXNldFBsYXllcigpOwotICAgICAgICBpZiAoaXNSZW1vdGVQbGF5YmFjaygpKSB7Ci0gICAgICAgICAgICBtUm91dGVQbGF5ZXIub3BlblZpZGVvKGRzZCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1BdWRpb0ZvY3VzVHlwZSAhPSBBdWRpb01hbmFnZXIuQVVESU9GT0NVU19OT05FKSB7Ci0gICAgICAgICAgICAvLyBUT0RPIHRoaXMgc2hvdWxkIGhhdmUgYSBmb2N1cyBsaXN0ZW5lcgotICAgICAgICAgICAgQXVkaW9Gb2N1c1JlcXVlc3QgZm9jdXNSZXF1ZXN0OwotICAgICAgICAgICAgZm9jdXNSZXF1ZXN0ID0gbmV3IEF1ZGlvRm9jdXNSZXF1ZXN0LkJ1aWxkZXIobUF1ZGlvRm9jdXNUeXBlKQotICAgICAgICAgICAgICAgICAgICAuc2V0QXVkaW9BdHRyaWJ1dGVzKG1BdWRpb0F0dHJpYnV0ZXMpCi0gICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOwotICAgICAgICAgICAgbUF1ZGlvTWFuYWdlci5yZXF1ZXN0QXVkaW9Gb2N1cyhmb2N1c1JlcXVlc3QpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIm9wZW5WaWRlbygpOiBjcmVhdGluZyBuZXcgTWVkaWFQbGF5ZXIyIGluc3RhbmNlLiIpOwotICAgICAgICAgICAgbU1lZGlhUGxheWVyID0gbmV3IE1lZGlhUGxheWVyMkltcGwoKTsKLSAgICAgICAgICAgIG1TdXJmYWNlVmlldy5zZXRNZWRpYVBsYXllcihtTWVkaWFQbGF5ZXIpOwotICAgICAgICAgICAgbVRleHR1cmVWaWV3LnNldE1lZGlhUGxheWVyKG1NZWRpYVBsYXllcik7Ci0gICAgICAgICAgICBtQ3VycmVudFZpZXcuYXNzaWduU3VyZmFjZVRvTWVkaWFQbGF5ZXIobU1lZGlhUGxheWVyKTsKLQotICAgICAgICAgICAgZmluYWwgQ29udGV4dCBjb250ZXh0ID0gbUluc3RhbmNlLmdldENvbnRleHQoKTsKLSAgICAgICAgICAgIC8vIFRPRE86IEFkZCB0aW1lbHkgZmlyaW5nIGxvZ2ljIGZvciBtb3JlIGFjY3VyYXRlIHN5bmMgYmV0d2VlbiBDQyBhbmQgdmlkZW8gZnJhbWUKLSAgICAgICAgICAgIG1TdWJ0aXRsZUNvbnRyb2xsZXIgPSBuZXcgU3VidGl0bGVDb250cm9sbGVyKGNvbnRleHQpOwotICAgICAgICAgICAgbVN1YnRpdGxlQ29udHJvbGxlci5yZWdpc3RlclJlbmRlcmVyKG5ldyBDbG9zZWRDYXB0aW9uUmVuZGVyZXIoY29udGV4dCkpOwotICAgICAgICAgICAgbVN1YnRpdGxlQ29udHJvbGxlci5zZXRBbmNob3IoKFN1YnRpdGxlQ29udHJvbGxlci5BbmNob3IpIG1TdWJ0aXRsZVZpZXcpOwotICAgICAgICAgICAgRXhlY3V0b3IgZXhlY3V0b3IgPSBuZXcgRXhlY3V0b3IoKSB7Ci0gICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgZXhlY3V0ZShSdW5uYWJsZSBydW5uYWJsZSkgewotICAgICAgICAgICAgICAgICAgICBydW5uYWJsZS5ydW4oKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotICAgICAgICAgICAgbU1lZGlhUGxheWVyLnNldE1lZGlhUGxheWVyMkV2ZW50Q2FsbGJhY2soZXhlY3V0b3IsIG1NZWRpYVBsYXllcjJDYWxsYmFjayk7Ci0KLSAgICAgICAgICAgIG1DdXJyZW50QnVmZmVyUGVyY2VudGFnZSA9IC0xOwotICAgICAgICAgICAgbU1lZGlhUGxheWVyLnNldERhdGFTb3VyY2UoZHNkKTsKLSAgICAgICAgICAgIG1NZWRpYVBsYXllci5zZXRBdWRpb0F0dHJpYnV0ZXMobUF1ZGlvQXR0cmlidXRlcyk7Ci0gICAgICAgICAgICBtTWVkaWFQbGF5ZXIuc2V0T25TdWJ0aXRsZURhdGFMaXN0ZW5lcihtU3VidGl0bGVMaXN0ZW5lcik7Ci0gICAgICAgICAgICAvLyB3ZSBkb24ndCBzZXQgdGhlIHRhcmdldCBzdGF0ZSBoZXJlIGVpdGhlciwgYnV0IHByZXNlcnZlIHRoZQotICAgICAgICAgICAgLy8gdGFyZ2V0IHN0YXRlIHRoYXQgd2FzIHRoZXJlIGJlZm9yZS4KLSAgICAgICAgICAgIG1DdXJyZW50U3RhdGUgPSBTVEFURV9QUkVQQVJJTkc7Ci0gICAgICAgICAgICBtTWVkaWFQbGF5ZXIucHJlcGFyZSgpOwotCi0gICAgICAgICAgICAvLyBTYXZlIGZpbGUgbmFtZSBhcyB0aXRsZSBzaW5jZSB0aGUgZmlsZSBtYXkgbm90IGhhdmUgYSB0aXRsZSBNZXRhZGF0YS4KLSAgICAgICAgICAgIG1UaXRsZSA9IHVyaS5nZXRQYXRoKCk7Ci0gICAgICAgICAgICBTdHJpbmcgc2NoZW1lID0gdXJpLmdldFNjaGVtZSgpOwotICAgICAgICAgICAgaWYgKHNjaGVtZSAhPSBudWxsICYmIHNjaGVtZS5lcXVhbHMoImZpbGUiKSkgewotICAgICAgICAgICAgICAgIG1UaXRsZSA9IHVyaS5nZXRMYXN0UGF0aFNlZ21lbnQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1SZXRyaWV2ZXIgPSBuZXcgTWVkaWFNZXRhZGF0YVJldHJpZXZlcigpOwotICAgICAgICAgICAgbVJldHJpZXZlci5zZXREYXRhU291cmNlKG1JbnN0YW5jZS5nZXRDb250ZXh0KCksIHVyaSk7Ci0KLSAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIm9wZW5WaWRlbygpLiBtQ3VycmVudFN0YXRlPSIgKyBtQ3VycmVudFN0YXRlCi0gICAgICAgICAgICAgICAgICAgICAgICArICIsIG1UYXJnZXRTdGF0ZT0iICsgbVRhcmdldFN0YXRlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJVbmFibGUgdG8gb3BlbiBjb250ZW50OiAiICsgdXJpLCBleCk7Ci0gICAgICAgICAgICBtQ3VycmVudFN0YXRlID0gU1RBVEVfRVJST1I7Ci0gICAgICAgICAgICBtVGFyZ2V0U3RhdGUgPSBTVEFURV9FUlJPUjsKLSAgICAgICAgICAgIG1NZWRpYVBsYXllcjJDYWxsYmFjay5vbkVycm9yKG1NZWRpYVBsYXllciwgZHNkLAotICAgICAgICAgICAgICAgICAgICBNZWRpYVBsYXllcjIuTUVESUFfRVJST1JfVU5LTk9XTiwgTWVkaWFQbGF5ZXIyLk1FRElBX0VSUk9SX0lPKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogUmVzZXQgdGhlIG1lZGlhIHBsYXllciBpbiBhbnkgc3RhdGUKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcmVzZXRQbGF5ZXIoKSB7Ci0gICAgICAgIGlmIChtTWVkaWFQbGF5ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgZmluYWwgTWVkaWFQbGF5ZXIyIHBsYXllciA9IG1NZWRpYVBsYXllcjsKLSAgICAgICAgICAgIG5ldyBBc3luY1Rhc2s8TWVkaWFQbGF5ZXIyLCBWb2lkLCBWb2lkPigpIHsKLSAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgVm9pZCBkb0luQmFja2dyb3VuZChNZWRpYVBsYXllcjIuLi4gcGxheWVycykgewotICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBGaXggTlBFIHdoaWxlIE1lZGlhUGxheWVyMi5jbG9zZSgpCi0gICAgICAgICAgICAgICAgICAgIC8vcGxheWVyc1swXS5jbG9zZSgpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9LmV4ZWN1dGVPbkV4ZWN1dG9yKEFzeW5jVGFzay5TRVJJQUxfRVhFQ1VUT1IsIHBsYXllcik7Ci0gICAgICAgICAgICBtTWVkaWFQbGF5ZXIgPSBudWxsOwotICAgICAgICAgICAgbVRleHR1cmVWaWV3LnNldE1lZGlhUGxheWVyKG51bGwpOwotICAgICAgICAgICAgbVN1cmZhY2VWaWV3LnNldE1lZGlhUGxheWVyKG51bGwpOwotICAgICAgICAgICAgLy9tUGVuZGluZ1N1YnRpdGxlVHJhY2tzLmNsZWFyKCk7Ci0gICAgICAgICAgICBtQ3VycmVudFN0YXRlID0gU1RBVEVfSURMRTsKLSAgICAgICAgICAgIG1UYXJnZXRTdGF0ZSA9IFNUQVRFX0lETEU7Ci0gICAgICAgICAgICBpZiAobUF1ZGlvRm9jdXNUeXBlICE9IEF1ZGlvTWFuYWdlci5BVURJT0ZPQ1VTX05PTkUpIHsKLSAgICAgICAgICAgICAgICBtQXVkaW9NYW5hZ2VyLmFiYW5kb25BdWRpb0ZvY3VzKG51bGwpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG1WaWRlb1dpZHRoID0gMDsKLSAgICAgICAgbVZpZGVvSGVpZ2h0ID0gMDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlUGxheWJhY2tTdGF0ZSgpIHsKLSAgICAgICAgaWYgKG1TdGF0ZUJ1aWxkZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gR2V0IHRoZSBjYXBhYmlsaXRpZXMgb2YgdGhlIHBsYXllciBmb3IgdGhpcyBzdHJlYW0KLSAgICAgICAgICAgIG1NZXRhZGF0YSA9IG1NZWRpYVBsYXllci5nZXRNZXRhZGF0YShNZWRpYVBsYXllcjIuTUVUQURBVEFfQUxMLAotICAgICAgICAgICAgICAgICAgICBNZWRpYVBsYXllcjIuQllQQVNTX01FVEFEQVRBX0ZJTFRFUik7Ci0KLSAgICAgICAgICAgIC8vIEFkZCBQbGF5IGFjdGlvbiBhcyBkZWZhdWx0Ci0gICAgICAgICAgICBsb25nIHBsYXliYWNrQWN0aW9ucyA9IFBsYXliYWNrU3RhdGUuQUNUSU9OX1BMQVk7Ci0gICAgICAgICAgICBpZiAobU1ldGFkYXRhICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoIW1NZXRhZGF0YS5oYXMoTWV0YWRhdGEuUEFVU0VfQVZBSUxBQkxFKQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgbU1ldGFkYXRhLmdldEJvb2xlYW4oTWV0YWRhdGEuUEFVU0VfQVZBSUxBQkxFKSkgewotICAgICAgICAgICAgICAgICAgICBwbGF5YmFja0FjdGlvbnMgfD0gUGxheWJhY2tTdGF0ZS5BQ1RJT05fUEFVU0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICghbU1ldGFkYXRhLmhhcyhNZXRhZGF0YS5TRUVLX0JBQ0tXQVJEX0FWQUlMQUJMRSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1NZXRhZGF0YS5nZXRCb29sZWFuKE1ldGFkYXRhLlNFRUtfQkFDS1dBUkRfQVZBSUxBQkxFKSkgewotICAgICAgICAgICAgICAgICAgICBwbGF5YmFja0FjdGlvbnMgfD0gUGxheWJhY2tTdGF0ZS5BQ1RJT05fUkVXSU5EOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoIW1NZXRhZGF0YS5oYXMoTWV0YWRhdGEuU0VFS19GT1JXQVJEX0FWQUlMQUJMRSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1NZXRhZGF0YS5nZXRCb29sZWFuKE1ldGFkYXRhLlNFRUtfRk9SV0FSRF9BVkFJTEFCTEUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBsYXliYWNrQWN0aW9ucyB8PSBQbGF5YmFja1N0YXRlLkFDVElPTl9GQVNUX0ZPUldBUkQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICghbU1ldGFkYXRhLmhhcyhNZXRhZGF0YS5TRUVLX0FWQUlMQUJMRSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1NZXRhZGF0YS5nZXRCb29sZWFuKE1ldGFkYXRhLlNFRUtfQVZBSUxBQkxFKSkgewotICAgICAgICAgICAgICAgICAgICBwbGF5YmFja0FjdGlvbnMgfD0gUGxheWJhY2tTdGF0ZS5BQ1RJT05fU0VFS19UTzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHBsYXliYWNrQWN0aW9ucyB8PSAoUGxheWJhY2tTdGF0ZS5BQ1RJT05fUEFVU0UgfAotICAgICAgICAgICAgICAgICAgICAgICAgUGxheWJhY2tTdGF0ZS5BQ1RJT05fUkVXSU5EIHwgUGxheWJhY2tTdGF0ZS5BQ1RJT05fRkFTVF9GT1JXQVJEIHwKLSAgICAgICAgICAgICAgICAgICAgICAgIFBsYXliYWNrU3RhdGUuQUNUSU9OX1NFRUtfVE8pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVN0YXRlQnVpbGRlciA9IG5ldyBQbGF5YmFja1N0YXRlLkJ1aWxkZXIoKTsKLSAgICAgICAgICAgIG1TdGF0ZUJ1aWxkZXIuc2V0QWN0aW9ucyhwbGF5YmFja0FjdGlvbnMpOwotCi0gICAgICAgICAgICBpZiAobUN1c3RvbUFjdGlvbkxpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZvciAoUGxheWJhY2tTdGF0ZS5DdXN0b21BY3Rpb24gYWN0aW9uIDogbUN1c3RvbUFjdGlvbkxpc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgbVN0YXRlQnVpbGRlci5hZGRDdXN0b21BY3Rpb24oYWN0aW9uKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbVN0YXRlQnVpbGRlci5zZXRTdGF0ZShnZXRDb3JyZXNwb25kaW5nUGxheWJhY2tTdGF0ZSgpLAotICAgICAgICAgICAgICAgIG1NZWRpYVBsYXllci5nZXRDdXJyZW50UG9zaXRpb24oKSwgbVNwZWVkKTsKLSAgICAgICAgaWYgKG1DdXJyZW50U3RhdGUgIT0gU1RBVEVfRVJST1IKLSAgICAgICAgICAgICYmIG1DdXJyZW50U3RhdGUgIT0gU1RBVEVfSURMRQotICAgICAgICAgICAgJiYgbUN1cnJlbnRTdGF0ZSAhPSBTVEFURV9QUkVQQVJJTkcpIHsKLSAgICAgICAgICAgIC8vIFRPRE86IHRoaXMgc2hvdWxkIGJlIHJlcGxhY2VkIHdpdGggTWVkaWFQbGF5ZXIyLmdldEJ1ZmZlcmVkUG9zaXRpb24oKSBvbmNlIGl0IGlzCi0gICAgICAgICAgICAvLyBpbXBsZW1lbnRlZC4KLSAgICAgICAgICAgIGlmIChtQ3VycmVudEJ1ZmZlclBlcmNlbnRhZ2UgPT0gLTEpIHsKLSAgICAgICAgICAgICAgICBtU3RhdGVCdWlsZGVyLnNldEJ1ZmZlcmVkUG9zaXRpb24oLTEpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtU3RhdGVCdWlsZGVyLnNldEJ1ZmZlcmVkUG9zaXRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAobG9uZykgKG1DdXJyZW50QnVmZmVyUGVyY2VudGFnZSAvIDEwMC4wICogbU1lZGlhUGxheWVyLmdldER1cmF0aW9uKCkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIFNldCBQbGF5YmFja1N0YXRlIGZvciBNZWRpYVNlc3Npb24KLSAgICAgICAgaWYgKG1NZWRpYVNlc3Npb24gIT0gbnVsbCkgewotICAgICAgICAgICAgUGxheWJhY2tTdGF0ZSBzdGF0ZSA9IG1TdGF0ZUJ1aWxkZXIuYnVpbGQoKTsKLSAgICAgICAgICAgIG1NZWRpYVNlc3Npb24uc2V0UGxheWJhY2tTdGF0ZShzdGF0ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGludCBnZXRDb3JyZXNwb25kaW5nUGxheWJhY2tTdGF0ZSgpIHsKLSAgICAgICAgc3dpdGNoIChtQ3VycmVudFN0YXRlKSB7Ci0gICAgICAgICAgICBjYXNlIFNUQVRFX0VSUk9SOgotICAgICAgICAgICAgICAgIHJldHVybiBQbGF5YmFja1N0YXRlLlNUQVRFX0VSUk9SOwotICAgICAgICAgICAgY2FzZSBTVEFURV9JRExFOgotICAgICAgICAgICAgICAgIHJldHVybiBQbGF5YmFja1N0YXRlLlNUQVRFX05PTkU7Ci0gICAgICAgICAgICBjYXNlIFNUQVRFX1BSRVBBUklORzoKLSAgICAgICAgICAgICAgICByZXR1cm4gUGxheWJhY2tTdGF0ZS5TVEFURV9DT05ORUNUSU5HOwotICAgICAgICAgICAgY2FzZSBTVEFURV9QUkVQQVJFRDoKLSAgICAgICAgICAgICAgICByZXR1cm4gUGxheWJhY2tTdGF0ZS5TVEFURV9QQVVTRUQ7Ci0gICAgICAgICAgICBjYXNlIFNUQVRFX1BMQVlJTkc6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFBsYXliYWNrU3RhdGUuU1RBVEVfUExBWUlORzsKLSAgICAgICAgICAgIGNhc2UgU1RBVEVfUEFVU0VEOgotICAgICAgICAgICAgICAgIHJldHVybiBQbGF5YmFja1N0YXRlLlNUQVRFX1BBVVNFRDsKLSAgICAgICAgICAgIGNhc2UgU1RBVEVfUExBWUJBQ0tfQ09NUExFVEVEOgotICAgICAgICAgICAgICAgIHJldHVybiBQbGF5YmFja1N0YXRlLlNUQVRFX1NUT1BQRUQ7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgUnVubmFibGUgbUZhZGVPdXQgPSBuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICBpZiAobUN1cnJlbnRTdGF0ZSA9PSBTVEFURV9QTEFZSU5HKSB7Ci0gICAgICAgICAgICAgICAgbU1lZGlhQ29udHJvbFZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHByaXZhdGUgdm9pZCBzaG93Q29udHJvbGxlcigpIHsKLSAgICAgICAgLy8gVE9ETzogRGVjaWRlIHdoYXQgdG8gc2hvdyB3aGVuIHRoZSBzdGF0ZSBpcyBub3QgaW4gcGxheWJhY2sgc3RhdGUKLSAgICAgICAgaWYgKG1NZWRpYUNvbnRyb2xWaWV3ID09IG51bGwgfHwgIWlzSW5QbGF5YmFja1N0YXRlKCkKLSAgICAgICAgICAgICAgICB8fCAobUlzTXVzaWNNZWRpYVR5cGUgJiYgbVNpemVUeXBlID09IFNJWkVfVFlQRV9GVUxMKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIG1NZWRpYUNvbnRyb2xWaWV3LnJlbW92ZUNhbGxiYWNrcyhtRmFkZU91dCk7Ci0gICAgICAgIG1NZWRpYUNvbnRyb2xWaWV3LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgaWYgKG1TaG93Q29udHJvbGxlckludGVydmFsTXMgIT0gMAotICAgICAgICAgICAgJiYgIW1BY2Nlc3NpYmlsaXR5TWFuYWdlci5pc1RvdWNoRXhwbG9yYXRpb25FbmFibGVkKCkpIHsKLSAgICAgICAgICAgIG1NZWRpYUNvbnRyb2xWaWV3LnBvc3REZWxheWVkKG1GYWRlT3V0LCBtU2hvd0NvbnRyb2xsZXJJbnRlcnZhbE1zKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0b2dnbGVNZWRpYUNvbnRyb2xWaWV3VmlzaWJpbGl0eSgpIHsKLSAgICAgICAgaWYgKG1NZWRpYUNvbnRyb2xWaWV3LmdldFZpc2liaWxpdHkoKSA9PSBWaWV3LlZJU0lCTEUpIHsKLSAgICAgICAgICAgIG1NZWRpYUNvbnRyb2xWaWV3LnJlbW92ZUNhbGxiYWNrcyhtRmFkZU91dCk7Ci0gICAgICAgICAgICBtTWVkaWFDb250cm9sVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzaG93Q29udHJvbGxlcigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFwcGx5U3BlZWQoKSB7Ci0gICAgICAgIFBsYXliYWNrUGFyYW1zIHBhcmFtcyA9IG1NZWRpYVBsYXllci5nZXRQbGF5YmFja1BhcmFtcygpLmFsbG93RGVmYXVsdHMoKTsKLSAgICAgICAgaWYgKG1TcGVlZCAhPSBwYXJhbXMuZ2V0U3BlZWQoKSkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBwYXJhbXMuc2V0U3BlZWQobVNwZWVkKTsKLSAgICAgICAgICAgICAgICBtTWVkaWFQbGF5ZXIuc2V0UGxheWJhY2tQYXJhbXMocGFyYW1zKTsKLSAgICAgICAgICAgICAgICBtRmFsbGJhY2tTcGVlZCA9IG1TcGVlZDsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiUGxheWJhY2tQYXJhbXMgaGFzIHVuc3VwcG9ydGVkIHZhbHVlOiAiICsgZSk7Ci0gICAgICAgICAgICAgICAgLy8gVE9ETzogc2hvdWxkIHJldmlzZSB0aGlzIHBhcnQgYWZ0ZXIgaW50ZWdyYXRpbmcgd2l0aCBNUDIuCi0gICAgICAgICAgICAgICAgLy8gSWYgbVNwZWVkIGhhZCBhbiBpbGxlZ2FsIHZhbHVlIGZvciBzcGVlZCByYXRlLCBzeXN0ZW0gd2lsbCBkZXRlcm1pbmUgYmVzdAotICAgICAgICAgICAgICAgIC8vIGhhbmRsaW5nIChzZWUgUGxheWJhY2tQYXJhbXMuQVVESU9fRkFMTEJBQ0tfTU9ERV9ERUZBVUxUKS4KLSAgICAgICAgICAgICAgICAvLyBOb3RlOiBUaGUgcHJlLU1QMiByZXR1cm5zIDAuMGYgd2hlbiBpdCBpcyBwYXVzZWQuIEluIHRoaXMgY2FzZSwgVmlkZW9WaWV3MiB3aWxsCi0gICAgICAgICAgICAgICAgLy8gdXNlIG1GYWxsYmFja1NwZWVkIGluc3RlYWQuCi0gICAgICAgICAgICAgICAgZmxvYXQgZmFsbGJhY2tTcGVlZCA9IG1NZWRpYVBsYXllci5nZXRQbGF5YmFja1BhcmFtcygpLmFsbG93RGVmYXVsdHMoKS5nZXRTcGVlZCgpOwotICAgICAgICAgICAgICAgIGlmIChmYWxsYmFja1NwZWVkID4gMC4wZikgewotICAgICAgICAgICAgICAgICAgICBtRmFsbGJhY2tTcGVlZCA9IGZhbGxiYWNrU3BlZWQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1TcGVlZCA9IG1GYWxsYmFja1NwZWVkOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzUmVtb3RlUGxheWJhY2soKSB7Ci0gICAgICAgIGlmIChtTWVkaWFDb250cm9sbGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBQbGF5YmFja0luZm8gcGxheWJhY2tJbmZvID0gbU1lZGlhQ29udHJvbGxlci5nZXRQbGF5YmFja0luZm8oKTsKLSAgICAgICAgcmV0dXJuIHBsYXliYWNrSW5mbyAhPSBudWxsCi0gICAgICAgICAgICAgICAgJiYgcGxheWJhY2tJbmZvLmdldFBsYXliYWNrVHlwZSgpID09IFBsYXliYWNrSW5mby5QTEFZQkFDS19UWVBFX1JFTU9URTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2VsZWN0T3JEZXNlbGVjdFN1YnRpdGxlKGJvb2xlYW4gc2VsZWN0KSB7Ci0gICAgICAgIGlmICghaXNJblBsYXliYWNrU3RhdGUoKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzZWxlY3QpIHsKLSAgICAgICAgICAgIGlmIChtU3VidGl0bGVUcmFja0luZGljZXMuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgICAgIC8vIFRPRE86IG1ha2UgdGhpcyBzZWxlY3Rpb24gZHluYW1pYwotICAgICAgICAgICAgICAgIG1TZWxlY3RlZFN1YnRpdGxlVHJhY2tJbmRleCA9IG1TdWJ0aXRsZVRyYWNrSW5kaWNlcy5nZXQoMCkuZmlyc3Q7Ci0gICAgICAgICAgICAgICAgbVN1YnRpdGxlQ29udHJvbGxlci5zZWxlY3RUcmFjayhtU3VidGl0bGVUcmFja0luZGljZXMuZ2V0KDApLnNlY29uZCk7Ci0gICAgICAgICAgICAgICAgbU1lZGlhUGxheWVyLnNlbGVjdFRyYWNrKG1TZWxlY3RlZFN1YnRpdGxlVHJhY2tJbmRleCk7Ci0gICAgICAgICAgICAgICAgbVN1YnRpdGxlVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAobVNlbGVjdGVkU3VidGl0bGVUcmFja0luZGV4ICE9IElOVkFMSURfVFJBQ0tfSU5ERVgpIHsKLSAgICAgICAgICAgICAgICBtTWVkaWFQbGF5ZXIuZGVzZWxlY3RUcmFjayhtU2VsZWN0ZWRTdWJ0aXRsZVRyYWNrSW5kZXgpOwotICAgICAgICAgICAgICAgIG1TZWxlY3RlZFN1YnRpdGxlVHJhY2tJbmRleCA9IElOVkFMSURfVFJBQ0tfSU5ERVg7Ci0gICAgICAgICAgICAgICAgbVN1YnRpdGxlVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZXh0cmFjdFRyYWNrcygpIHsKLSAgICAgICAgTGlzdDxNZWRpYVBsYXllcjIuVHJhY2tJbmZvPiB0cmFja0luZm9zID0gbU1lZGlhUGxheWVyLmdldFRyYWNrSW5mbygpOwotICAgICAgICBtVmlkZW9UcmFja0luZGljZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgbUF1ZGlvVHJhY2tJbmRpY2VzID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgIG1TdWJ0aXRsZVRyYWNrSW5kaWNlcyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICBtU3VidGl0bGVDb250cm9sbGVyLnJlc2V0KCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHJhY2tJbmZvcy5zaXplKCk7ICsraSkgewotICAgICAgICAgICAgaW50IHRyYWNrVHlwZSA9IHRyYWNrSW5mb3MuZ2V0KGkpLmdldFRyYWNrVHlwZSgpOwotICAgICAgICAgICAgaWYgKHRyYWNrVHlwZSA9PSBNZWRpYVBsYXllcjIuVHJhY2tJbmZvLk1FRElBX1RSQUNLX1RZUEVfVklERU8pIHsKLSAgICAgICAgICAgICAgICBtVmlkZW9UcmFja0luZGljZXMuYWRkKGkpOwotICAgICAgICAgICAgfSBlbHNlIGlmICh0cmFja1R5cGUgPT0gTWVkaWFQbGF5ZXIyLlRyYWNrSW5mby5NRURJQV9UUkFDS19UWVBFX0FVRElPKSB7Ci0gICAgICAgICAgICAgICAgbUF1ZGlvVHJhY2tJbmRpY2VzLmFkZChpKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAodHJhY2tUeXBlID09IE1lZGlhUGxheWVyMi5UcmFja0luZm8uTUVESUFfVFJBQ0tfVFlQRV9TVUJUSVRMRQotICAgICAgICAgICAgICAgICAgICB8fCB0cmFja1R5cGUgPT0gTWVkaWFQbGF5ZXIyLlRyYWNrSW5mby5NRURJQV9UUkFDS19UWVBFX1RJTUVEVEVYVCkgewotICAgICAgICAgICAgICAgIFN1YnRpdGxlVHJhY2sgdHJhY2sgPSBtU3VidGl0bGVDb250cm9sbGVyLmFkZFRyYWNrKHRyYWNrSW5mb3MuZ2V0KGkpLmdldEZvcm1hdCgpKTsKLSAgICAgICAgICAgICAgICBpZiAodHJhY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtU3VidGl0bGVUcmFja0luZGljZXMuYWRkKG5ldyBQYWlyPD4oaSwgdHJhY2spKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gU2VsZWN0IGZpcnN0IHRyYWNrcyBhcyBkZWZhdWx0Ci0gICAgICAgIGlmIChtVmlkZW9UcmFja0luZGljZXMuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgbVNlbGVjdGVkVmlkZW9UcmFja0luZGV4ID0gMDsKLSAgICAgICAgfQotICAgICAgICBpZiAobUF1ZGlvVHJhY2tJbmRpY2VzLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIG1TZWxlY3RlZEF1ZGlvVHJhY2tJbmRleCA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1WaWRlb1RyYWNrSW5kaWNlcy5zaXplKCkgPT0gMCAmJiBtQXVkaW9UcmFja0luZGljZXMuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgbUlzTXVzaWNNZWRpYVR5cGUgPSB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgQnVuZGxlIGRhdGEgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgIGRhdGEucHV0SW50KE1lZGlhQ29udHJvbFZpZXcySW1wbC5LRVlfVklERU9fVFJBQ0tfQ09VTlQsIG1WaWRlb1RyYWNrSW5kaWNlcy5zaXplKCkpOwotICAgICAgICBkYXRhLnB1dEludChNZWRpYUNvbnRyb2xWaWV3MkltcGwuS0VZX0FVRElPX1RSQUNLX0NPVU5ULCBtQXVkaW9UcmFja0luZGljZXMuc2l6ZSgpKTsKLSAgICAgICAgZGF0YS5wdXRJbnQoTWVkaWFDb250cm9sVmlldzJJbXBsLktFWV9TVUJUSVRMRV9UUkFDS19DT1VOVCwgbVN1YnRpdGxlVHJhY2tJbmRpY2VzLnNpemUoKSk7Ci0gICAgICAgIGlmIChtU3VidGl0bGVUcmFja0luZGljZXMuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgc2VsZWN0T3JEZXNlbGVjdFN1YnRpdGxlKG1TdWJ0aXRsZUVuYWJsZWQpOwotICAgICAgICB9Ci0gICAgICAgIG1NZWRpYVNlc3Npb24uc2VuZFNlc3Npb25FdmVudChNZWRpYUNvbnRyb2xWaWV3MkltcGwuRVZFTlRfVVBEQVRFX1RSQUNLX1NUQVRVUywgZGF0YSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGV4dHJhY3RNZXRhZGF0YSgpIHsKLSAgICAgICAgLy8gR2V0IGFuZCBzZXQgZHVyYXRpb24gYW5kIHRpdGxlIHZhbHVlcyBhcyBNZWRpYU1ldGFkYXRhIGZvciBNZWRpYUNvbnRyb2xWaWV3MgotICAgICAgICBNZWRpYU1ldGFkYXRhLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBNZWRpYU1ldGFkYXRhLkJ1aWxkZXIoKTsKLSAgICAgICAgaWYgKG1NZXRhZGF0YSAhPSBudWxsICYmIG1NZXRhZGF0YS5oYXMoTWV0YWRhdGEuVElUTEUpKSB7Ci0gICAgICAgICAgICBtVGl0bGUgPSBtTWV0YWRhdGEuZ2V0U3RyaW5nKE1ldGFkYXRhLlRJVExFKTsKLSAgICAgICAgfQotICAgICAgICBidWlsZGVyLnB1dFN0cmluZyhNZWRpYU1ldGFkYXRhLk1FVEFEQVRBX0tFWV9USVRMRSwgbVRpdGxlKTsKLSAgICAgICAgYnVpbGRlci5wdXRMb25nKAotICAgICAgICAgICAgICAgIE1lZGlhTWV0YWRhdGEuTUVUQURBVEFfS0VZX0RVUkFUSU9OLCBtTWVkaWFQbGF5ZXIuZ2V0RHVyYXRpb24oKSk7Ci0KLSAgICAgICAgaWYgKG1NZWRpYVNlc3Npb24gIT0gbnVsbCkgewotICAgICAgICAgICAgbU1lZGlhU2Vzc2lvbi5zZXRNZXRhZGF0YShidWlsZGVyLmJ1aWxkKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGV4dHJhY3RBdWRpb01ldGFkYXRhKCkgewotICAgICAgICBpZiAoIW1Jc011c2ljTWVkaWFUeXBlKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBtUmVzb3VyY2VzID0gQXBpSGVscGVyLmdldExpYlJlc291cmNlcyhtSW5zdGFuY2UuZ2V0Q29udGV4dCgpKTsKLSAgICAgICAgbU1hbmFnZXIgPSAoV2luZG93TWFuYWdlcikgbUluc3RhbmNlLmdldENvbnRleHQoKS5nZXRBcHBsaWNhdGlvbkNvbnRleHQoKQotICAgICAgICAgICAgICAgIC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuV0lORE9XX1NFUlZJQ0UpOwotCi0gICAgICAgIGJ5dGVbXSBhbGJ1bSA9IG1SZXRyaWV2ZXIuZ2V0RW1iZWRkZWRQaWN0dXJlKCk7Ci0gICAgICAgIGlmIChhbGJ1bSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBCaXRtYXAgYml0bWFwID0gQml0bWFwRmFjdG9yeS5kZWNvZGVCeXRlQXJyYXkoYWxidW0sIDAsIGFsYnVtLmxlbmd0aCk7Ci0gICAgICAgICAgICBtTXVzaWNBbGJ1bURyYXdhYmxlID0gbmV3IEJpdG1hcERyYXdhYmxlKGJpdG1hcCk7Ci0KLSAgICAgICAgICAgIC8vIFRPRE86IHJlcGxhY2Ugd2l0aCB2aXN1YWxpemVyCi0gICAgICAgICAgICBQYWxldHRlLmdlbmVyYXRlQXN5bmMoYml0bWFwLCBuZXcgUGFsZXR0ZS5QYWxldHRlQXN5bmNMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkdlbmVyYXRlZChQYWxldHRlIHBhbGV0dGUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogYWRkIGRvbWluYW50IGNvbG9yIGZvciBkZWZhdWx0IGFsYnVtIGltYWdlLgotICAgICAgICAgICAgICAgICAgICBtRG9taW5hbnRDb2xvciA9IHBhbGV0dGUuZ2V0RG9taW5hbnRDb2xvcigwKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1NdXNpY1ZpZXcgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbU11c2ljVmlldy5zZXRCYWNrZ3JvdW5kQ29sb3IobURvbWluYW50Q29sb3IpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtTXVzaWNBbGJ1bURyYXdhYmxlID0gbVJlc291cmNlcy5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmljX2RlZmF1bHRfYWxidW1faW1hZ2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIHRpdGxlID0gbVJldHJpZXZlci5leHRyYWN0TWV0YWRhdGEoTWVkaWFNZXRhZGF0YVJldHJpZXZlci5NRVRBREFUQV9LRVlfVElUTEUpOwotICAgICAgICBpZiAodGl0bGUgIT0gbnVsbCkgewotICAgICAgICAgICAgbU11c2ljVGl0bGVUZXh0ID0gdGl0bGU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtTXVzaWNUaXRsZVRleHQgPSBtUmVzb3VyY2VzLmdldFN0cmluZyhSLnN0cmluZy5tY3YyX211c2ljX3RpdGxlX3Vua25vd25fdGV4dCk7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgYXJ0aXN0ID0gbVJldHJpZXZlci5leHRyYWN0TWV0YWRhdGEoTWVkaWFNZXRhZGF0YVJldHJpZXZlci5NRVRBREFUQV9LRVlfQVJUSVNUKTsKLSAgICAgICAgaWYgKGFydGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtTXVzaWNBcnRpc3RUZXh0ID0gYXJ0aXN0OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbU11c2ljQXJ0aXN0VGV4dCA9IG1SZXNvdXJjZXMuZ2V0U3RyaW5nKFIuc3RyaW5nLm1jdjJfbXVzaWNfYXJ0aXN0X3Vua25vd25fdGV4dCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTZW5kIHRpdGxlIGFuZCBhcnRpc3Qgc3RyaW5nIHRvIE1lZGlhQ29udHJvbFZpZXcyCi0gICAgICAgIE1lZGlhTWV0YWRhdGEuQnVpbGRlciBidWlsZGVyID0gbmV3IE1lZGlhTWV0YWRhdGEuQnVpbGRlcigpOwotICAgICAgICBidWlsZGVyLnB1dFN0cmluZyhNZWRpYU1ldGFkYXRhLk1FVEFEQVRBX0tFWV9USVRMRSwgbU11c2ljVGl0bGVUZXh0KTsKLSAgICAgICAgYnVpbGRlci5wdXRTdHJpbmcoTWVkaWFNZXRhZGF0YS5NRVRBREFUQV9LRVlfQVJUSVNULCBtTXVzaWNBcnRpc3RUZXh0KTsKLSAgICAgICAgbU1lZGlhU2Vzc2lvbi5zZXRNZXRhZGF0YShidWlsZGVyLmJ1aWxkKCkpOwotCi0gICAgICAgIC8vIERpc3BsYXkgRW1iZWRkZWQgbW9kZSBhcyBkZWZhdWx0Ci0gICAgICAgIG1JbnN0YW5jZS5yZW1vdmVWaWV3KG1TdXJmYWNlVmlldyk7Ci0gICAgICAgIG1JbnN0YW5jZS5yZW1vdmVWaWV3KG1UZXh0dXJlVmlldyk7Ci0gICAgICAgIGluZmxhdGVNdXNpY1ZpZXcoUi5sYXlvdXQuZW1iZWRkZWRfbXVzaWMpOwotICAgIH0KLQotICAgIHByaXZhdGUgaW50IHJldHJpZXZlT3JpZW50YXRpb24oKSB7Ci0gICAgICAgIERpc3BsYXlNZXRyaWNzIGRtID0gUmVzb3VyY2VzLmdldFN5c3RlbSgpLmdldERpc3BsYXlNZXRyaWNzKCk7Ci0gICAgICAgIGludCB3aWR0aCA9IGRtLndpZHRoUGl4ZWxzOwotICAgICAgICBpbnQgaGVpZ2h0ID0gZG0uaGVpZ2h0UGl4ZWxzOwotCi0gICAgICAgIHJldHVybiAoaGVpZ2h0ID4gd2lkdGgpID8KLSAgICAgICAgICAgICAgICBBY3Rpdml0eUluZm8uU0NSRUVOX09SSUVOVEFUSU9OX1BPUlRSQUlUIDoKLSAgICAgICAgICAgICAgICBBY3Rpdml0eUluZm8uU0NSRUVOX09SSUVOVEFUSU9OX0xBTkRTQ0FQRTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5mbGF0ZU11c2ljVmlldyhpbnQgbGF5b3V0SWQpIHsKLSAgICAgICAgbUluc3RhbmNlLnJlbW92ZVZpZXcobU11c2ljVmlldyk7Ci0KLSAgICAgICAgVmlldyB2ID0gQXBpSGVscGVyLmluZmxhdGVMaWJMYXlvdXQobUluc3RhbmNlLmdldENvbnRleHQoKSwgbGF5b3V0SWQpOwotICAgICAgICB2LnNldEJhY2tncm91bmRDb2xvcihtRG9taW5hbnRDb2xvcik7Ci0KLSAgICAgICAgSW1hZ2VWaWV3IGFsYnVtVmlldyA9IHYuZmluZFZpZXdCeUlkKFIuaWQuYWxidW0pOwotICAgICAgICBpZiAoYWxidW1WaWV3ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGFsYnVtVmlldy5zZXRJbWFnZURyYXdhYmxlKG1NdXNpY0FsYnVtRHJhd2FibGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgVGV4dFZpZXcgdGl0bGVWaWV3ID0gdi5maW5kVmlld0J5SWQoUi5pZC50aXRsZSk7Ci0gICAgICAgIGlmICh0aXRsZVZpZXcgIT0gbnVsbCkgewotICAgICAgICAgICAgdGl0bGVWaWV3LnNldFRleHQobU11c2ljVGl0bGVUZXh0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFRleHRWaWV3IGFydGlzdFZpZXcgPSB2LmZpbmRWaWV3QnlJZChSLmlkLmFydGlzdCk7Ci0gICAgICAgIGlmIChhcnRpc3RWaWV3ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGFydGlzdFZpZXcuc2V0VGV4dChtTXVzaWNBcnRpc3RUZXh0KTsKLSAgICAgICAgfQotCi0gICAgICAgIG1NdXNpY1ZpZXcgPSB2OwotICAgICAgICBtSW5zdGFuY2UuYWRkVmlldyhtTXVzaWNWaWV3LCAwKTsKLSAgICB9Ci0KLSAgICBPblN1YnRpdGxlRGF0YUxpc3RlbmVyIG1TdWJ0aXRsZUxpc3RlbmVyID0KLSAgICAgICAgICAgIG5ldyBPblN1YnRpdGxlRGF0YUxpc3RlbmVyKCkgewotICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uU3VidGl0bGVEYXRhKE1lZGlhUGxheWVyMiBtcCwgU3VidGl0bGVEYXRhIGRhdGEpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJvblN1YnRpdGxlRGF0YSgpOiBnZXRUcmFja0luZGV4OiAiICsgZGF0YS5nZXRUcmFja0luZGV4KCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBnZXRDdXJyZW50UG9zaXRpb246ICIgKyBtcC5nZXRDdXJyZW50UG9zaXRpb24oKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIGdldFN0YXJ0VGltZVVzKCk6ICIgKyBkYXRhLmdldFN0YXJ0VGltZVVzKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBkaWZmOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKGRhdGEuZ2V0U3RhcnRUaW1lVXMoKS8xMDAwIC0gbXAuZ2V0Q3VycmVudFBvc2l0aW9uKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIm1zLCBnZXREdXJhdGlvblVzKCk6ICIgKyBkYXRhLmdldER1cmF0aW9uVXMoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwotCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGluZGV4ID0gZGF0YS5nZXRUcmFja0luZGV4KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCAhPSBtU2VsZWN0ZWRTdWJ0aXRsZVRyYWNrSW5kZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIm9uU3VidGl0bGVEYXRhKCk6IGdldFRyYWNrSW5kZXg6ICIgKyBkYXRhLmdldFRyYWNrSW5kZXgoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIHNlbGVjdGVkIHRyYWNrIGluZGV4OiAiICsgbVNlbGVjdGVkU3VidGl0bGVUcmFja0luZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBmb3IgKFBhaXI8SW50ZWdlciwgU3VidGl0bGVUcmFjaz4gcCA6IG1TdWJ0aXRsZVRyYWNrSW5kaWNlcykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHAuZmlyc3QgPT0gaW5kZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdWJ0aXRsZVRyYWNrIHRyYWNrID0gcC5zZWNvbmQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2sub25EYXRhKGRhdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfTsKLQotICAgIE1lZGlhUGxheWVyMkV2ZW50Q2FsbGJhY2sgbU1lZGlhUGxheWVyMkNhbGxiYWNrID0KLSAgICAgICAgICAgIG5ldyBNZWRpYVBsYXllcjJFdmVudENhbGxiYWNrKCkgewotICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uVmlkZW9TaXplQ2hhbmdlZCgKLSAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUGxheWVyMiBtcCwgRGF0YVNvdXJjZURlc2MgZHNkLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJvblZpZGVvU2l6ZUNoYW5nZWQoKTogc2l6ZTogIiArIHdpZHRoICsgIi8iICsgaGVpZ2h0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtVmlkZW9XaWR0aCA9IG1wLmdldFZpZGVvV2lkdGgoKTsKLSAgICAgICAgICAgICAgICAgICAgbVZpZGVvSGVpZ2h0ID0gbXAuZ2V0VmlkZW9IZWlnaHQoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJvblZpZGVvU2l6ZUNoYW5nZWQoKTogbVZpZGVvU2l6ZToiICsgbVZpZGVvV2lkdGggKyAiLyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtVmlkZW9IZWlnaHQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtVmlkZW9XaWR0aCAhPSAwICYmIG1WaWRlb0hlaWdodCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtSW5zdGFuY2UucmVxdWVzdExheW91dCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gVE9ETzogUmVtb3ZlIHRpbWVkIHRleHQgcmVsYXRlZCBjb2RlIGxhdGVyIG9uY2UgcmVsZXZhbnQgUmVuZGVyZXIgaXMgZGVmaW5lZC4KLSAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGp1c3QgZm9yIGRlYnVnZ2luZyBwdXJwb3NlLgotICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uVGltZWRUZXh0KAotICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFQbGF5ZXIyIG1wLCBEYXRhU291cmNlRGVzYyBkc2QsIFRpbWVkVGV4dCB0ZXh0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJUaW1lZFRleHQ6ICIgKyB0ZXh0LmdldFRleHQoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25JbmZvKAotICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFQbGF5ZXIyIG1wLCBEYXRhU291cmNlRGVzYyBkc2QsIGludCB3aGF0LCBpbnQgZXh0cmEpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHdoYXQgPT0gTWVkaWFQbGF5ZXIyLk1FRElBX0lORk9fTUVUQURBVEFfVVBEQVRFKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBleHRyYWN0VHJhY2tzKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCA9PSBNZWRpYVBsYXllcjIuTUVESUFfSU5GT19QUkVQQVJFRCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vblByZXBhcmVkKG1wLCBkc2QpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHdoYXQgPT0gTWVkaWFQbGF5ZXIyLk1FRElBX0lORk9fUExBWUJBQ0tfQ09NUExFVEUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25Db21wbGV0aW9uKG1wLCBkc2QpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHdoYXQgPT0gTWVkaWFQbGF5ZXIyLk1FRElBX0lORk9fQlVGRkVSSU5HX1VQREFURSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkJ1ZmZlcmluZ1VwZGF0ZShtcCwgZHNkLCBleHRyYSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkVycm9yKAotICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFQbGF5ZXIyIG1wLCBEYXRhU291cmNlRGVzYyBkc2QsIGludCBmcmFtZXdvcmtFcnIsIGludCBpbXBsRXJyKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiRXJyb3I6ICIgKyBmcmFtZXdvcmtFcnIgKyAiLCIgKyBpbXBsRXJyKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFN0YXRlID0gU1RBVEVfRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgIG1UYXJnZXRTdGF0ZSA9IFNUQVRFX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICB1cGRhdGVQbGF5YmFja1N0YXRlKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1NZWRpYUNvbnRyb2xWaWV3ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NZWRpYUNvbnRyb2xWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2FsbENvbXBsZXRlZChNZWRpYVBsYXllcjIgbXAsIERhdGFTb3VyY2VEZXNjIGRzZCwgaW50IHdoYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhdHVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh3aGF0ID09IE1lZGlhUGxheWVyMi5DQUxMX0NPTVBMRVRFRF9TRUVLX1RPICYmIHN0YXR1cyA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVQbGF5YmFja1N0YXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwcml2YXRlIHZvaWQgb25QcmVwYXJlZChNZWRpYVBsYXllcjIgbXAsIERhdGFTb3VyY2VEZXNjIGRzZCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIk9uUHJlcGFyZWRMaXN0ZW5lcigpLiBtQ3VycmVudFN0YXRlPSIgKyBtQ3VycmVudFN0YXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgbVRhcmdldFN0YXRlPSIgKyBtVGFyZ2V0U3RhdGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1DdXJyZW50U3RhdGUgPSBTVEFURV9QUkVQQVJFRDsKLSAgICAgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGFuZCBzZXQgcGxheWJhY2sgc3RhdGUgZm9yIE1lZGlhQ29udHJvbFZpZXcyCi0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZVBsYXliYWNrU3RhdGUoKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBjaGFuZ2UgdGhpcyB0byBzZW5kIFRyYWNrSW5mb3MgdG8gTWVkaWFDb250cm9sVmlldzIKLSAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogY3JlYXRlIE1lZGlhU2Vzc2lvbiB3aGVuIGluaXRpYWxpemluZyBWaWRlb1ZpZXcyCi0gICAgICAgICAgICAgICAgICAgIGlmIChtTWVkaWFTZXNzaW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhY3RUcmFja3MoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhY3RNZXRhZGF0YSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFjdEF1ZGlvTWV0YWRhdGEoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChtTWVkaWFDb250cm9sVmlldyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtTWVkaWFDb250cm9sVmlldy5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGludCB2aWRlb1dpZHRoID0gbXAuZ2V0VmlkZW9XaWR0aCgpOwotICAgICAgICAgICAgICAgICAgICBpbnQgdmlkZW9IZWlnaHQgPSBtcC5nZXRWaWRlb0hlaWdodCgpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIG1TZWVrV2hlblByZXBhcmVkIG1heSBiZSBjaGFuZ2VkIGFmdGVyIHNlZWtUbygpIGNhbGwKLSAgICAgICAgICAgICAgICAgICAgbG9uZyBzZWVrVG9Qb3NpdGlvbiA9IG1TZWVrV2hlblByZXBhcmVkOwotICAgICAgICAgICAgICAgICAgICBpZiAoc2Vla1RvUG9zaXRpb24gIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbU1lZGlhQ29udHJvbGxlci5nZXRUcmFuc3BvcnRDb250cm9scygpLnNlZWtUbyhzZWVrVG9Qb3NpdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAodmlkZW9XaWR0aCAhPSAwICYmIHZpZGVvSGVpZ2h0ICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2aWRlb1dpZHRoICE9IG1WaWRlb1dpZHRoIHx8IHZpZGVvSGVpZ2h0ICE9IG1WaWRlb0hlaWdodCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJPblByZXBhcmVkTGlzdGVuZXIoKSA6ICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsICIgdmlkZW8gc2l6ZTogIiArIHZpZGVvV2lkdGggKyAiLyIgKyB2aWRlb0hlaWdodCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIiBtZWFzdXJlZFNpemU6ICIgKyBtSW5zdGFuY2UuZ2V0TWVhc3VyZWRXaWR0aCgpICsgIi8iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtSW5zdGFuY2UuZ2V0TWVhc3VyZWRIZWlnaHQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIiB2aWV3U2l6ZTogIiArIG1JbnN0YW5jZS5nZXRXaWR0aCgpICsgIi8iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtSW5zdGFuY2UuZ2V0SGVpZ2h0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVmlkZW9XaWR0aCA9IHZpZGVvV2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVZpZGVvSGVpZ2h0ID0gdmlkZW9IZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUluc3RhbmNlLnJlcXVlc3RMYXlvdXQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5lZWRUb1N0YXJ0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTWVkaWFDb250cm9sbGVyLmdldFRyYW5zcG9ydENvbnRyb2xzKCkucGxheSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgZG9uJ3Qga25vdyB0aGUgdmlkZW8gc2l6ZSB5ZXQsIGJ1dCBzaG91bGQgc3RhcnQgYW55d2F5LgotICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHZpZGVvIHNpemUgbWlnaHQgYmUgcmVwb3J0ZWQgdG8gdXMgbGF0ZXIuCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmVlZFRvU3RhcnQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1NZWRpYUNvbnRyb2xsZXIuZ2V0VHJhbnNwb3J0Q29udHJvbHMoKS5wbGF5KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwcml2YXRlIHZvaWQgb25Db21wbGV0aW9uKE1lZGlhUGxheWVyMiBtcCwgRGF0YVNvdXJjZURlc2MgZHNkKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1DdXJyZW50U3RhdGUgPSBTVEFURV9QTEFZQkFDS19DT01QTEVURUQ7Ci0gICAgICAgICAgICAgICAgICAgIG1UYXJnZXRTdGF0ZSA9IFNUQVRFX1BMQVlCQUNLX0NPTVBMRVRFRDsKLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlUGxheWJhY2tTdGF0ZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAobUF1ZGlvRm9jdXNUeXBlICE9IEF1ZGlvTWFuYWdlci5BVURJT0ZPQ1VTX05PTkUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1BdWRpb01hbmFnZXIuYWJhbmRvbkF1ZGlvRm9jdXMobnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwcml2YXRlIHZvaWQgb25CdWZmZXJpbmdVcGRhdGUoTWVkaWFQbGF5ZXIyIG1wLCBEYXRhU291cmNlRGVzYyBkc2QsIGludCBwZXJjZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIG1DdXJyZW50QnVmZmVyUGVyY2VudGFnZSA9IHBlcmNlbnQ7Ci0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZVBsYXliYWNrU3RhdGUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotCi0gICAgcHJpdmF0ZSBjbGFzcyBNZWRpYVNlc3Npb25DYWxsYmFjayBleHRlbmRzIE1lZGlhU2Vzc2lvbi5DYWxsYmFjayB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbkNvbW1hbmQoU3RyaW5nIGNvbW1hbmQsIEJ1bmRsZSBhcmdzLCBSZXN1bHRSZWNlaXZlciByZWNlaXZlcikgewotICAgICAgICAgICAgaWYgKGlzUmVtb3RlUGxheWJhY2soKSkgewotICAgICAgICAgICAgICAgIG1Sb3V0ZVBsYXllci5vbkNvbW1hbmQoY29tbWFuZCwgYXJncywgcmVjZWl2ZXIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKGNvbW1hbmQpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNZWRpYUNvbnRyb2xWaWV3MkltcGwuQ09NTUFORF9TSE9XX1NVQlRJVExFOgotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN1YnRpdGxlSW5kZXggPSBhcmdzLmdldEludCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFDb250cm9sVmlldzJJbXBsLktFWV9TRUxFQ1RFRF9TVUJUSVRMRV9JTkRFWCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5WQUxJRF9UUkFDS19JTkRFWCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VidGl0bGVJbmRleCAhPSBJTlZBTElEX1RSQUNLX0lOREVYKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN1YnRpdGxlVHJhY2tJbmRleCA9IG1TdWJ0aXRsZVRyYWNrSW5kaWNlcy5nZXQoc3VidGl0bGVJbmRleCkuZmlyc3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1YnRpdGxlVHJhY2tJbmRleCAhPSBtU2VsZWN0ZWRTdWJ0aXRsZVRyYWNrSW5kZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNlbGVjdGVkU3VidGl0bGVUcmFja0luZGV4ID0gc3VidGl0bGVUcmFja0luZGV4OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW5zdGFuY2Uuc2V0U3VidGl0bGVFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIE1lZGlhQ29udHJvbFZpZXcySW1wbC5DT01NQU5EX0hJREVfU1VCVElUTEU6Ci0gICAgICAgICAgICAgICAgICAgICAgICBtSW5zdGFuY2Uuc2V0U3VidGl0bGVFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIE1lZGlhQ29udHJvbFZpZXcySW1wbC5DT01NQU5EX1NFVF9GVUxMU0NSRUVOOgotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1GdWxsU2NyZWVuUmVxdWVzdExpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRnVsbFNjcmVlblJlcXVlc3RMaXN0ZW5lci5vbkZ1bGxTY3JlZW5SZXF1ZXN0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncy5nZXRCb29sZWFuKE1lZGlhQ29udHJvbFZpZXcySW1wbC5BUkdVTUVOVF9LRVlfRlVMTFNDUkVFTikpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgTWVkaWFDb250cm9sVmlldzJJbXBsLkNPTU1BTkRfU0VMRUNUX0FVRElPX1RSQUNLOgotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGF1ZGlvSW5kZXggPSBhcmdzLmdldEludChNZWRpYUNvbnRyb2xWaWV3MkltcGwuS0VZX1NFTEVDVEVEX0FVRElPX0lOREVYLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlZBTElEX1RSQUNLX0lOREVYKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhdWRpb0luZGV4ICE9IElOVkFMSURfVFJBQ0tfSU5ERVgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXVkaW9UcmFja0luZGV4ID0gbUF1ZGlvVHJhY2tJbmRpY2VzLmdldChhdWRpb0luZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXVkaW9UcmFja0luZGV4ICE9IG1TZWxlY3RlZEF1ZGlvVHJhY2tJbmRleCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2VsZWN0ZWRBdWRpb1RyYWNrSW5kZXggPSBhdWRpb1RyYWNrSW5kZXg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1NZWRpYVBsYXllci5zZWxlY3RUcmFjayhtU2VsZWN0ZWRBdWRpb1RyYWNrSW5kZXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIE1lZGlhQ29udHJvbFZpZXcySW1wbC5DT01NQU5EX1NFVF9QTEFZQkFDS19TUEVFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHNwZWVkID0gYXJncy5nZXRGbG9hdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFDb250cm9sVmlldzJJbXBsLktFWV9QTEFZQkFDS19TUEVFRCwgSU5WQUxJRF9TUEVFRCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3BlZWQgIT0gSU5WQUxJRF9TUEVFRCAmJiBzcGVlZCAhPSBtU3BlZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW5zdGFuY2Uuc2V0U3BlZWQoc3BlZWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TcGVlZCA9IHNwZWVkOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgTWVkaWFDb250cm9sVmlldzJJbXBsLkNPTU1BTkRfTVVURToKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Wb2x1bWVMZXZlbCA9IG1BdWRpb01hbmFnZXIuZ2V0U3RyZWFtVm9sdW1lKEF1ZGlvTWFuYWdlci5TVFJFQU1fTVVTSUMpOwotICAgICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvTWFuYWdlci5zZXRTdHJlYW1Wb2x1bWUoQXVkaW9NYW5hZ2VyLlNUUkVBTV9NVVNJQywgMCwgMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNZWRpYUNvbnRyb2xWaWV3MkltcGwuQ09NTUFORF9VTk1VVEU6Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQXVkaW9NYW5hZ2VyLnNldFN0cmVhbVZvbHVtZShBdWRpb01hbmFnZXIuU1RSRUFNX01VU0lDLCBtVm9sdW1lTGV2ZWwsIDApOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2hvd0NvbnRyb2xsZXIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbkN1c3RvbUFjdGlvbihTdHJpbmcgYWN0aW9uLCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgICAgICBtQ3VzdG9tQWN0aW9uTGlzdGVuZXJSZWNvcmQuZmlyc3QuZXhlY3V0ZSgoKSAtPgotICAgICAgICAgICAgICAgICAgICBtQ3VzdG9tQWN0aW9uTGlzdGVuZXJSZWNvcmQuc2Vjb25kLm9uQ3VzdG9tQWN0aW9uKGFjdGlvbiwgZXh0cmFzKSk7Ci0gICAgICAgICAgICBzaG93Q29udHJvbGxlcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUGxheSgpIHsKLSAgICAgICAgICAgIGlmIChpc0luUGxheWJhY2tTdGF0ZSgpICYmIChtQ3VycmVudFZpZXcuaGFzQXZhaWxhYmxlU3VyZmFjZSgpIHx8IG1Jc011c2ljTWVkaWFUeXBlKSkgewotICAgICAgICAgICAgICAgIGlmIChpc1JlbW90ZVBsYXliYWNrKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbVJvdXRlUGxheWVyLm9uUGxheSgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGFwcGx5U3BlZWQoKTsKLSAgICAgICAgICAgICAgICAgICAgbU1lZGlhUGxheWVyLnBsYXkoKTsKLSAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IFNUQVRFX1BMQVlJTkc7Ci0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZVBsYXliYWNrU3RhdGUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IFNUQVRFX1BMQVlJTkc7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtVGFyZ2V0U3RhdGUgPSBTVEFURV9QTEFZSU5HOwotICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAib25QbGF5KCkuIG1DdXJyZW50U3RhdGU9IiArIG1DdXJyZW50U3RhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgbVRhcmdldFN0YXRlPSIgKyBtVGFyZ2V0U3RhdGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2hvd0NvbnRyb2xsZXIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblBhdXNlKCkgewotICAgICAgICAgICAgaWYgKGlzSW5QbGF5YmFja1N0YXRlKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoaXNSZW1vdGVQbGF5YmFjaygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Sb3V0ZVBsYXllci5vblBhdXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1DdXJyZW50U3RhdGUgPSBTVEFURV9QQVVTRUQ7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtTWVkaWFQbGF5ZXIuaXNQbGF5aW5nKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbU1lZGlhUGxheWVyLnBhdXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1DdXJyZW50U3RhdGUgPSBTVEFURV9QQVVTRUQ7Ci0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZVBsYXliYWNrU3RhdGUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtVGFyZ2V0U3RhdGUgPSBTVEFURV9QQVVTRUQ7Ci0gICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJvblBhdXNlKCkuIG1DdXJyZW50U3RhdGU9IiArIG1DdXJyZW50U3RhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgbVRhcmdldFN0YXRlPSIgKyBtVGFyZ2V0U3RhdGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2hvd0NvbnRyb2xsZXIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblNlZWtUbyhsb25nIHBvcykgewotICAgICAgICAgICAgaWYgKGlzSW5QbGF5YmFja1N0YXRlKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoaXNSZW1vdGVQbGF5YmFjaygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Sb3V0ZVBsYXllci5vblNlZWtUbyhwb3MpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1NZWRpYVBsYXllci5zZWVrVG8ocG9zLCBNZWRpYVBsYXllcjIuU0VFS19QUkVWSU9VU19TWU5DKTsKLSAgICAgICAgICAgICAgICAgICAgbVNlZWtXaGVuUHJlcGFyZWQgPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbVNlZWtXaGVuUHJlcGFyZWQgPSBwb3M7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzaG93Q29udHJvbGxlcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU3RvcCgpIHsKLSAgICAgICAgICAgIGlmIChpc1JlbW90ZVBsYXliYWNrKCkpIHsKLSAgICAgICAgICAgICAgICBtUm91dGVQbGF5ZXIub25TdG9wKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJlc2V0UGxheWVyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzaG93Q29udHJvbGxlcigpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC93aWRnZXQvVmlkZW9WaWV3SW50ZXJmYWNlLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3dpZGdldC9WaWRlb1ZpZXdJbnRlcmZhY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODU0ZDQ3ZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3dpZGdldC9WaWRlb1ZpZXdJbnRlcmZhY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQud2lkZ2V0OwotCi1pbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLk5vbk51bGw7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllcjI7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7Ci0KLWludGVyZmFjZSBWaWRlb1ZpZXdJbnRlcmZhY2UgewotICAgIC8qKgotICAgICAqIEFzc2lnbnMgdGhlIHZpZXcncyBzdXJmYWNlIHRvIHRoZSBnaXZlbiBNZWRpYVBsYXllcjIgaW5zdGFuY2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbXAgTWVkaWFQbGF5ZXIyCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBzdXJmYWNlIGlzIHN1Y2Nlc3NmdWxseSBhc3NpZ25lZCwgZmFsc2UgaWYgbm90LiBJdCB3aWxsIGZhaWwgdG8gYXNzaWduCi0gICAgICogICAgICAgICBpZiBhbnkgb2YgTWVkaWFQbGF5ZXIyIG9yIHN1cmZhY2UgaXMgdW5hdmFpbGFibGUuCi0gICAgICovCi0gICAgYm9vbGVhbiBhc3NpZ25TdXJmYWNlVG9NZWRpYVBsYXllcihNZWRpYVBsYXllcjIgbXApOwotICAgIHZvaWQgc2V0U3VyZmFjZUxpc3RlbmVyKFN1cmZhY2VMaXN0ZW5lciBsKTsKLSAgICBpbnQgZ2V0Vmlld1R5cGUoKTsKLSAgICB2b2lkIHNldE1lZGlhUGxheWVyKE1lZGlhUGxheWVyMiBtcCk7Ci0KLSAgICAvKioKLSAgICAgKiBUYWtlcyBvdmVyIG9sZFZpZXcuIEl0IG1lYW5zIHRoYXQgdGhlIE1lZGlhUGxheWVyMiB3aWxsIHN0YXJ0IHJlbmRlcmluZyBvbiB0aGlzIHZpZXcuCi0gICAgICogVGhlIHZpc2liaWxpdHkgb2Ygb2xkVmlldyB3aWxsIGJlIHNldCBhcyB7QGxpbmsgVmlldy5HT05FfS4gSWYgdGhlIHZpZXcgZG9lc24ndCBoYXZlIGEKLSAgICAgKiBNZWRpYVBsYXllcjIgaW5zdGFuY2Ugb3IgaXRzIHN1cmZhY2UgaXMgbm90IGF2YWlsYWJsZSwgdGhlIGFjdHVhbCBleGVjdXRpb24gaXMgZGVmZXJyZWQgdW50aWwKLSAgICAgKiBhIE1lZGlhUGxheWVyMiBpbnN0YW5jZSBpcyBzZXQgYnkge0BsaW5rICNzZXRNZWRpYVBsYXllcn0gb3IgaXRzIHN1cmZhY2UgYmVjb21lcyBhdmFpbGFibGUuCi0gICAgICoge0BsaW5rIFN1cmZhY2VMaXN0ZW5lci5vblN1cmZhY2VUYWtlT3ZlckRvbmV9IHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIGFjdHVhbCBleGVjdXRpb24gaXMKLSAgICAgKiBkb25lLgotICAgICAqCi0gICAgICogQHBhcmFtIG9sZFZpZXcgVGhlIHZpZXcgdGhhdCBNZWRpYVBsYXllcjIgaXMgY3VycmVudGx5IHJlbmRlcmluZyBvbi4KLSAgICAgKi8KLSAgICB2b2lkIHRha2VPdmVyKEBOb25OdWxsIFZpZGVvVmlld0ludGVyZmFjZSBvbGRWaWV3KTsKLQotICAgIC8qKgotICAgICAqIEluZGljYXRlcyBpZiB0aGUgdmlldydzIHN1cmZhY2UgaXMgYXZhaWxhYmxlLgotICAgICAqCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBzdXJmYWNlIGlzIGF2YWlsYWJsZS4KLSAgICAgKi8KLSAgICBib29sZWFuIGhhc0F2YWlsYWJsZVN1cmZhY2UoKTsKLQotICAgIC8qKgotICAgICAqIEFuIGluc3RhbmNlIG9mIFZpZGVvVmlld0ludGVyZmFjZSBjYWxscyB0aGVzZSBzdXJmYWNlIG5vdGlmaWNhdGlvbiBtZXRob2RzIGFjY29yZGluZ2x5IGlmCi0gICAgICogYSBsaXN0ZW5lciBoYXMgYmVlbiByZWdpc3RlcmVkIHZpYSB7QGxpbmsgI3NldFN1cmZhY2VMaXN0ZW5lcihTdXJmYWNlTGlzdGVuZXIpfS4KLSAgICAgKi8KLSAgICBpbnRlcmZhY2UgU3VyZmFjZUxpc3RlbmVyIHsKLSAgICAgICAgdm9pZCBvblN1cmZhY2VDcmVhdGVkKFZpZXcgdmlldywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKLSAgICAgICAgdm9pZCBvblN1cmZhY2VEZXN0cm95ZWQoVmlldyB2aWV3KTsKLSAgICAgICAgdm9pZCBvblN1cmZhY2VDaGFuZ2VkKFZpZXcgdmlldywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKLSAgICAgICAgdm9pZCBvblN1cmZhY2VUYWtlT3ZlckRvbmUoVmlkZW9WaWV3SW50ZXJmYWNlIHZpZXcpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvd2lkZ2V0L1ZpZXdHcm91cEltcGwuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvd2lkZ2V0L1ZpZXdHcm91cEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWEwNjgyNi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3dpZGdldC9WaWV3R3JvdXBJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC53aWRnZXQ7Ci0KLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5WaWV3R3JvdXBQcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwotaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgVmlld0dyb3VwSW1wbCBpbXBsZW1lbnRzIFZpZXdHcm91cFByb3ZpZGVyIHsKLSAgICBwcml2YXRlIGZpbmFsIFZpZXdHcm91cFByb3ZpZGVyIG1TdXBlclByb3ZpZGVyOwotCi0gICAgcHVibGljIFZpZXdHcm91cEltcGwoVmlld0dyb3VwIGluc3RhbmNlLAotICAgICAgICAgICAgVmlld0dyb3VwUHJvdmlkZXIgc3VwZXJQcm92aWRlciwgVmlld0dyb3VwUHJvdmlkZXIgcHJpdmF0ZVByb3ZpZGVyKSB7Ci0gICAgICAgIG1TdXBlclByb3ZpZGVyID0gc3VwZXJQcm92aWRlcjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkF0dGFjaGVkVG9XaW5kb3dfaW1wbCgpIHsKLSAgICAgICAgbVN1cGVyUHJvdmlkZXIub25BdHRhY2hlZFRvV2luZG93X2ltcGwoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkRldGFjaGVkRnJvbVdpbmRvd19pbXBsKCkgewotICAgICAgICBtU3VwZXJQcm92aWRlci5vbkRldGFjaGVkRnJvbVdpbmRvd19pbXBsKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRBY2Nlc3NpYmlsaXR5Q2xhc3NOYW1lX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtU3VwZXJQcm92aWRlci5nZXRBY2Nlc3NpYmlsaXR5Q2xhc3NOYW1lX2ltcGwoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBvblRvdWNoRXZlbnRfaW1wbChNb3Rpb25FdmVudCBldikgewotICAgICAgICByZXR1cm4gbVN1cGVyUHJvdmlkZXIub25Ub3VjaEV2ZW50X2ltcGwoZXYpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIG9uVHJhY2tiYWxsRXZlbnRfaW1wbChNb3Rpb25FdmVudCBldikgewotICAgICAgICByZXR1cm4gbVN1cGVyUHJvdmlkZXIub25UcmFja2JhbGxFdmVudF9pbXBsKGV2KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkZpbmlzaEluZmxhdGVfaW1wbCgpIHsKLSAgICAgICAgbVN1cGVyUHJvdmlkZXIub25GaW5pc2hJbmZsYXRlX2ltcGwoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRFbmFibGVkX2ltcGwoYm9vbGVhbiBlbmFibGVkKSB7Ci0gICAgICAgIG1TdXBlclByb3ZpZGVyLnNldEVuYWJsZWRfaW1wbChlbmFibGVkKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblZpc2liaWxpdHlBZ2dyZWdhdGVkX2ltcGwoYm9vbGVhbiBpc1Zpc2libGUpIHsKLSAgICAgICAgbVN1cGVyUHJvdmlkZXIub25WaXNpYmlsaXR5QWdncmVnYXRlZF9pbXBsKGlzVmlzaWJsZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25MYXlvdXRfaW1wbChib29sZWFuIGNoYW5nZWQsIGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgcmlnaHQsIGludCBib3R0b20pIHsKLSAgICAgICAgbVN1cGVyUHJvdmlkZXIub25MYXlvdXRfaW1wbChjaGFuZ2VkLCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uTWVhc3VyZV9pbXBsKGludCB3aWR0aE1lYXN1cmVTcGVjLCBpbnQgaGVpZ2h0TWVhc3VyZVNwZWMpIHsKLSAgICAgICAgbVN1cGVyUHJvdmlkZXIub25NZWFzdXJlX2ltcGwod2lkdGhNZWFzdXJlU3BlYywgaGVpZ2h0TWVhc3VyZVNwZWMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgZ2V0U3VnZ2VzdGVkTWluaW11bVdpZHRoX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtU3VwZXJQcm92aWRlci5nZXRTdWdnZXN0ZWRNaW5pbXVtV2lkdGhfaW1wbCgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgZ2V0U3VnZ2VzdGVkTWluaW11bUhlaWdodF9pbXBsKCkgewotICAgICAgICByZXR1cm4gbVN1cGVyUHJvdmlkZXIuZ2V0U3VnZ2VzdGVkTWluaW11bUhlaWdodF9pbXBsKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0TWVhc3VyZWREaW1lbnNpb25faW1wbChpbnQgbWVhc3VyZWRXaWR0aCwgaW50IG1lYXN1cmVkSGVpZ2h0KSB7Ci0gICAgICAgIG1TdXBlclByb3ZpZGVyLnNldE1lYXN1cmVkRGltZW5zaW9uX2ltcGwobWVhc3VyZWRXaWR0aCwgbWVhc3VyZWRIZWlnaHQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGRpc3BhdGNoVG91Y2hFdmVudF9pbXBsKE1vdGlvbkV2ZW50IGV2KSB7Ci0gICAgICAgIHJldHVybiBtU3VwZXJQcm92aWRlci5kaXNwYXRjaFRvdWNoRXZlbnRfaW1wbChldik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gY2hlY2tMYXlvdXRQYXJhbXNfaW1wbChWaWV3R3JvdXAuTGF5b3V0UGFyYW1zIHApIHsKLSAgICAgICAgcmV0dXJuIG1TdXBlclByb3ZpZGVyLmNoZWNrTGF5b3V0UGFyYW1zX2ltcGwocCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMgZ2VuZXJhdGVEZWZhdWx0TGF5b3V0UGFyYW1zX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtU3VwZXJQcm92aWRlci5nZW5lcmF0ZURlZmF1bHRMYXlvdXRQYXJhbXNfaW1wbCgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zIGdlbmVyYXRlTGF5b3V0UGFyYW1zX2ltcGwoQXR0cmlidXRlU2V0IGF0dHJzKSB7Ci0gICAgICAgIHJldHVybiBtU3VwZXJQcm92aWRlci5nZW5lcmF0ZUxheW91dFBhcmFtc19pbXBsKGF0dHJzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgVmlld0dyb3VwLkxheW91dFBhcmFtcyBnZW5lcmF0ZUxheW91dFBhcmFtc19pbXBsKFZpZXdHcm91cC5MYXlvdXRQYXJhbXMgbHApIHsKLSAgICAgICAgcmV0dXJuIG1TdXBlclByb3ZpZGVyLmdlbmVyYXRlTGF5b3V0UGFyYW1zX2ltcGwobHApOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIHNob3VsZERlbGF5Q2hpbGRQcmVzc2VkU3RhdGVfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG1TdXBlclByb3ZpZGVyLnNob3VsZERlbGF5Q2hpbGRQcmVzc2VkU3RhdGVfaW1wbCgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG1lYXN1cmVDaGlsZFdpdGhNYXJnaW5zX2ltcGwoVmlldyBjaGlsZCwKLSAgICAgICAgaW50IHBhcmVudFdpZHRoTWVhc3VyZVNwZWMsIGludCB3aWR0aFVzZWQsIGludCBwYXJlbnRIZWlnaHRNZWFzdXJlU3BlYywgaW50IGhlaWdodFVzZWQpIHsKLSAgICAgICAgbVN1cGVyUHJvdmlkZXIubWVhc3VyZUNoaWxkV2l0aE1hcmdpbnNfaW1wbChjaGlsZCwKLSAgICAgICAgICAgICAgICBwYXJlbnRXaWR0aE1lYXN1cmVTcGVjLCB3aWR0aFVzZWQsIHBhcmVudEhlaWdodE1lYXN1cmVTcGVjLCBoZWlnaHRVc2VkKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvdGVzdHMvQW5kcm9pZC5tayBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy90ZXN0cy9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZGRmZDJhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy90ZXN0cy9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotIyBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cwotCi1MT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gXAotICAgIGFuZHJvaWQudGVzdC5ydW5uZXIuc3R1YnMgXAotICAgIGFuZHJvaWQudGVzdC5iYXNlLnN0dWJzIFwKLSAgICBtb2NraXRvLXRhcmdldC1taW51cy1qdW5pdDQgXAotICAgIGp1bml0Ci0KLUxPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKLQotTE9DQUxfUEFDS0FHRV9OQU1FIDo9IE1lZGlhQ29tcG9uZW50c1Rlc3QKLQotTE9DQUxfSU5TVFJVTUVOVEFUSU9OX0ZPUiA6PSBNZWRpYUNvbXBvbmVudHMKLQotTE9DQUxfUFJJVkFURV9QTEFURk9STV9BUElTIDo9IHRydWUKLQotTE9DQUxfQ0VSVElGSUNBVEUgOj0gcGxhdGZvcm0KLQotaW5jbHVkZSAkKEJVSUxEX1BBQ0tBR0UpCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvdGVzdHMvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy90ZXN0cy9BbmRyb2lkTWFuaWZlc3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjU1MjY1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy90ZXN0cy9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgICBwYWNrYWdlPSJjb20uYW5kcm9pZC5tZWRpYS50ZXN0cyI+Ci0KLSAgICA8YXBwbGljYXRpb24gYW5kcm9pZDpsYWJlbD0iTWVkaWEgQVBJIFRlc3QiPgotICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KLSAgICA8L2FwcGxpY2F0aW9uPgotCi0gICAgPCEtLQotICAgIFRvIHJ1biB0aGUgdGVzdHMgdXNlIHRoZSBjb21tYW5kOgotICAgICJhZGIgc2hlbGwgYW0gaW5zdHJ1bWVudCAtdyBjb20uYW5kcm9pZC5tZWRpYS50ZXN0cy9hbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lciIKLSAgICAtLT4KLSAgICA8aW5zdHJ1bWVudGF0aW9uCi0gICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXIiCi0gICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iY29tLmFuZHJvaWQubWVkaWEudXBkYXRlIgotICAgICAgICBhbmRyb2lkOmxhYmVsPSJNZWRpYSBBUEkgdGVzdCIgLz4KLQotPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy90ZXN0cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvU2Vzc2lvblBsYXlsaXN0QWdlbnRUZXN0LmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL1Nlc3Npb25QbGF5bGlzdEFnZW50VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWIwODQ4Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy90ZXN0cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvU2Vzc2lvblBsYXlsaXN0QWdlbnRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5tZWRpYTsKLQotaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLio7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvQXR0cmlidXRlczsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkRhdGFTb3VyY2VEZXNjOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFJdGVtMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTWV0YWRhdGEyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXJCYXNlOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXJCYXNlLlBsYXllckV2ZW50Q2FsbGJhY2s7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXlsaXN0QWdlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb24yOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uMi5PbkRhdGFTb3VyY2VNaXNzaW5nSGVscGVyOwotaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKLWltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyVGhyZWFkOwotaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7Ci1pbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLWltcG9ydCBvcmcubW9ja2l0by5NYXRjaGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3I7Ci0KLS8qKgotICogVGVzdHMge0BsaW5rIFNlc3Npb25QbGF5bGlzdEFnZW50fS4KLSAqLwotcHVibGljIGNsYXNzIFNlc3Npb25QbGF5bGlzdEFnZW50VGVzdCBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZSB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJTZXNzaW9uUGxheWxpc3RBZ2VudFRlc3QiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBXQUlUX1RJTUVfTVMgPSAxMDAwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJTlZBTElEX1JFUEVBVF9NT0RFID0gLTEwMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU5WQUxJRF9TSFVGRkxFX01PREUgPSAtMTAwOwotCi0gICAgcHJpdmF0ZSBIYW5kbGVyIG1IYW5kbGVyOwotICAgIHByaXZhdGUgRXhlY3V0b3IgbUhhbmRsZXJFeGVjdXRvcjsKLQotICAgIHByaXZhdGUgT2JqZWN0IG1XYWl0TG9jayA9IG5ldyBPYmplY3QoKTsKLSAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQ7Ci0gICAgcHJpdmF0ZSBNZWRpYVNlc3Npb24ySW1wbCBtU2Vzc2lvbkltcGw7Ci0gICAgcHJpdmF0ZSBNZWRpYVBsYXllckJhc2UgbVBsYXllcjsKLSAgICBwcml2YXRlIFBsYXllckV2ZW50Q2FsbGJhY2sgbVBsYXllckV2ZW50Q2FsbGJhY2s7Ci0gICAgcHJpdmF0ZSBTZXNzaW9uUGxheWxpc3RBZ2VudCBtQWdlbnQ7Ci0gICAgcHJpdmF0ZSBPbkRhdGFTb3VyY2VNaXNzaW5nSGVscGVyIG1EYXRhU291cmNlSGVscGVyOwotICAgIHByaXZhdGUgTXlQbGF5bGlzdEV2ZW50Q2FsbGJhY2sgbUV2ZW50Q2FsbGJhY2s7Ci0KLSAgICBwdWJsaWMgY2xhc3MgTXlQbGF5bGlzdEV2ZW50Q2FsbGJhY2sgZXh0ZW5kcyBNZWRpYVBsYXlsaXN0QWdlbnQuUGxheWxpc3RFdmVudENhbGxiYWNrIHsKLSAgICAgICAgYm9vbGVhbiBvblBsYXlsaXN0Q2hhbmdlZENhbGxlZDsKLSAgICAgICAgYm9vbGVhbiBvblBsYXlsaXN0TWV0YWRhdGFDaGFuZ2VkQ2FsbGVkOwotICAgICAgICBib29sZWFuIG9uUmVwZWF0TW9kZUNoYW5nZWRDYWxsZWQ7Ci0gICAgICAgIGJvb2xlYW4gb25TaHVmZmxlTW9kZUNoYW5nZWRDYWxsZWQ7Ci0KLSAgICAgICAgcHJpdmF0ZSBPYmplY3QgbVdhaXRMb2NrOwotCi0gICAgICAgIHB1YmxpYyBNeVBsYXlsaXN0RXZlbnRDYWxsYmFjayhPYmplY3Qgd2FpdExvY2spIHsKLSAgICAgICAgICAgIG1XYWl0TG9jayA9IHdhaXRMb2NrOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0gICAgICAgICAgICBvblBsYXlsaXN0Q2hhbmdlZENhbGxlZCA9IGZhbHNlOwotICAgICAgICAgICAgb25QbGF5bGlzdE1ldGFkYXRhQ2hhbmdlZENhbGxlZCA9IGZhbHNlOwotICAgICAgICAgICAgb25SZXBlYXRNb2RlQ2hhbmdlZENhbGxlZCA9IGZhbHNlOwotICAgICAgICAgICAgb25TaHVmZmxlTW9kZUNoYW5nZWRDYWxsZWQgPSBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUGxheWxpc3RDaGFuZ2VkKE1lZGlhUGxheWxpc3RBZ2VudCBwbGF5bGlzdEFnZW50LCBMaXN0PE1lZGlhSXRlbTI+IGxpc3QsCi0gICAgICAgICAgICAgICAgTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEpIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7Ci0gICAgICAgICAgICAgICAgb25QbGF5bGlzdENoYW5nZWRDYWxsZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIG1XYWl0TG9jay5ub3RpZnkoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUGxheWxpc3RNZXRhZGF0YUNoYW5nZWQoTWVkaWFQbGF5bGlzdEFnZW50IHBsYXlsaXN0QWdlbnQsCi0gICAgICAgICAgICAgICAgTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEpIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7Ci0gICAgICAgICAgICAgICAgb25QbGF5bGlzdE1ldGFkYXRhQ2hhbmdlZENhbGxlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgbVdhaXRMb2NrLm5vdGlmeSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgb25SZXBlYXRNb2RlQ2hhbmdlZChNZWRpYVBsYXlsaXN0QWdlbnQgcGxheWxpc3RBZ2VudCwgaW50IHJlcGVhdE1vZGUpIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7Ci0gICAgICAgICAgICAgICAgb25SZXBlYXRNb2RlQ2hhbmdlZENhbGxlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgbVdhaXRMb2NrLm5vdGlmeSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgb25TaHVmZmxlTW9kZUNoYW5nZWQoTWVkaWFQbGF5bGlzdEFnZW50IHBsYXlsaXN0QWdlbnQsIGludCBzaHVmZmxlTW9kZSkgewotICAgICAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKLSAgICAgICAgICAgICAgICBvblNodWZmbGVNb2RlQ2hhbmdlZENhbGxlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgbVdhaXRMb2NrLm5vdGlmeSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGNsYXNzIE15RGF0YVNvdXJjZUhlbHBlciBpbXBsZW1lbnRzIE9uRGF0YVNvdXJjZU1pc3NpbmdIZWxwZXIgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIERhdGFTb3VyY2VEZXNjIG9uRGF0YVNvdXJjZU1pc3NpbmcoTWVkaWFTZXNzaW9uMiBzZXNzaW9uLCBNZWRpYUl0ZW0yIGl0ZW0pIHsKLSAgICAgICAgICAgIGlmIChpdGVtLmdldE1lZGlhSWQoKS5jb250YWlucygiV0lUSE9VVF9EU0QiKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRhU291cmNlRGVzYy5CdWlsZGVyKCkKLSAgICAgICAgICAgICAgICAgICAgLnNldERhdGFTb3VyY2UoZ2V0Q29udGV4dCgpLCBVcmkucGFyc2UoImRzZDovL3Rlc3QiKSkKLSAgICAgICAgICAgICAgICAgICAgLnNldE1lZGlhSWQoaXRlbS5nZXRNZWRpYUlkKCkpCi0gICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGNsYXNzIE1vY2tQbGF5ZXIgZXh0ZW5kcyBNZWRpYVBsYXllckJhc2UgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgcGxheSgpIHsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBwcmVwYXJlKCkgewotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHBhdXNlKCkgewotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgewotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHNraXBUb05leHQoKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgc2Vla1RvKGxvbmcgcG9zKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGludCBnZXRQbGF5ZXJTdGF0ZSgpIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0QnVmZmVyaW5nU3RhdGUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRBdWRpb0F0dHJpYnV0ZXMoQXVkaW9BdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQXVkaW9BdHRyaWJ1dGVzIGdldEF1ZGlvQXR0cmlidXRlcygpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldERhdGFTb3VyY2UoRGF0YVNvdXJjZURlc2MgZHNkKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgc2V0TmV4dERhdGFTb3VyY2UoRGF0YVNvdXJjZURlc2MgZHNkKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgc2V0TmV4dERhdGFTb3VyY2VzKExpc3Q8RGF0YVNvdXJjZURlc2M+IGRzZHMpIHsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgRGF0YVNvdXJjZURlc2MgZ2V0Q3VycmVudERhdGFTb3VyY2UoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBsb29wQ3VycmVudChib29sZWFuIGxvb3ApIHsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRQbGF5YmFja1NwZWVkKGZsb2F0IHNwZWVkKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgc2V0UGxheWVyVm9sdW1lKGZsb2F0IHZvbHVtZSkgewotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBmbG9hdCBnZXRQbGF5ZXJWb2x1bWUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCByZWdpc3RlclBsYXllckV2ZW50Q2FsbGJhY2soRXhlY3V0b3IgZSwgUGxheWVyRXZlbnRDYWxsYmFjayBjYikgewotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHVucmVnaXN0ZXJQbGF5ZXJFdmVudENhbGxiYWNrKFBsYXllckV2ZW50Q2FsbGJhY2sgY2IpIHsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB9Ci0gICAgfQotCi0gICAgQEJlZm9yZQotICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIG1Db250ZXh0ID0gZ2V0Q29udGV4dCgpOwotICAgICAgICAvLyBXb3JrYXJvdW5kIGZvciBkZXhtYWtlciBidWc6IGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvZGV4bWFrZXIvaXNzdWVzL2RldGFpbD9pZD0yCi0gICAgICAgIC8vIERleG1ha2VyIGlzIHVzZWQgYnkgbW9ja2l0by4KLSAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJkZXhtYWtlci5kZXhjYWNoZSIsIG1Db250ZXh0LmdldENhY2hlRGlyKCkuZ2V0UGF0aCgpKTsKLQotICAgICAgICBIYW5kbGVyVGhyZWFkIGhhbmRsZXJUaHJlYWQgPSBuZXcgSGFuZGxlclRocmVhZCgiU2Vzc2lvblBsYXlsaXN0QWdlbnQiKTsKLSAgICAgICAgaGFuZGxlclRocmVhZC5zdGFydCgpOwotICAgICAgICBtSGFuZGxlciA9IG5ldyBIYW5kbGVyKGhhbmRsZXJUaHJlYWQuZ2V0TG9vcGVyKCkpOwotICAgICAgICBtSGFuZGxlckV4ZWN1dG9yID0gKHJ1bm5hYmxlKSAtPiB7Ci0gICAgICAgICAgICBtSGFuZGxlci5wb3N0KHJ1bm5hYmxlKTsKLSAgICAgICAgfTsKLQotICAgICAgICBtUGxheWVyID0gbW9jayhNb2NrUGxheWVyLmNsYXNzKTsKLSAgICAgICAgZG9BbnN3ZXIoaW52b2NhdGlvbiAtPiB7Ci0gICAgICAgICAgICBPYmplY3RbXSBhcmdzID0gaW52b2NhdGlvbi5nZXRBcmd1bWVudHMoKTsKLSAgICAgICAgICAgIG1QbGF5ZXJFdmVudENhbGxiYWNrID0gKFBsYXllckV2ZW50Q2FsbGJhY2spIGFyZ3NbMV07Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfSkud2hlbihtUGxheWVyKS5yZWdpc3RlclBsYXllckV2ZW50Q2FsbGJhY2soTWF0Y2hlcnMuYW55KCksIE1hdGNoZXJzLmFueSgpKTsKLQotICAgICAgICBtU2Vzc2lvbkltcGwgPSBtb2NrKE1lZGlhU2Vzc2lvbjJJbXBsLmNsYXNzKTsKLSAgICAgICAgbURhdGFTb3VyY2VIZWxwZXIgPSBuZXcgTXlEYXRhU291cmNlSGVscGVyKCk7Ci0gICAgICAgIG1BZ2VudCA9IG5ldyBTZXNzaW9uUGxheWxpc3RBZ2VudChtU2Vzc2lvbkltcGwsIG1QbGF5ZXIpOwotICAgICAgICBtQWdlbnQuc2V0T25EYXRhU291cmNlTWlzc2luZ0hlbHBlcihtRGF0YVNvdXJjZUhlbHBlcik7Ci0gICAgICAgIG1FdmVudENhbGxiYWNrID0gbmV3IE15UGxheWxpc3RFdmVudENhbGxiYWNrKG1XYWl0TG9jayk7Ci0gICAgICAgIG1BZ2VudC5yZWdpc3RlclBsYXlsaXN0RXZlbnRDYWxsYmFjayhtSGFuZGxlckV4ZWN1dG9yLCBtRXZlbnRDYWxsYmFjayk7Ci0gICAgfQotCi0gICAgQEFmdGVyCi0gICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgbUhhbmRsZXIuZ2V0TG9vcGVyKCkucXVpdFNhZmVseSgpOwotICAgICAgICBtSGFuZGxlciA9IG51bGw7Ci0gICAgICAgIG1IYW5kbGVyRXhlY3V0b3IgPSBudWxsOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFNldEFuZEdldFNodWZsbGVNb2RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGludCBzaHVmZmxlTW9kZSA9IG1BZ2VudC5nZXRTaHVmZmxlTW9kZSgpOwotICAgICAgICBpZiAoc2h1ZmZsZU1vZGUgIT0gTWVkaWFQbGF5bGlzdEFnZW50LlNIVUZGTEVfTU9ERV9OT05FKSB7Ci0gICAgICAgICAgICBtRXZlbnRDYWxsYmFjay5jbGVhcigpOwotICAgICAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKLSAgICAgICAgICAgICAgICBtQWdlbnQuc2V0U2h1ZmZsZU1vZGUoTWVkaWFQbGF5bGlzdEFnZW50LlNIVUZGTEVfTU9ERV9OT05FKTsKLSAgICAgICAgICAgICAgICBtV2FpdExvY2sud2FpdChXQUlUX1RJTUVfTVMpOwotICAgICAgICAgICAgICAgIGFzc2VydFRydWUobUV2ZW50Q2FsbGJhY2sub25TaHVmZmxlTW9kZUNoYW5nZWRDYWxsZWQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKE1lZGlhUGxheWxpc3RBZ2VudC5TSFVGRkxFX01PREVfTk9ORSwgbUFnZW50LmdldFNodWZmbGVNb2RlKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgbUV2ZW50Q2FsbGJhY2suY2xlYXIoKTsKLSAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKLSAgICAgICAgICAgIG1BZ2VudC5zZXRTaHVmZmxlTW9kZShNZWRpYVBsYXlsaXN0QWdlbnQuU0hVRkZMRV9NT0RFX0FMTCk7Ci0gICAgICAgICAgICBtV2FpdExvY2sud2FpdChXQUlUX1RJTUVfTVMpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtRXZlbnRDYWxsYmFjay5vblNodWZmbGVNb2RlQ2hhbmdlZENhbGxlZCk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKE1lZGlhUGxheWxpc3RBZ2VudC5TSFVGRkxFX01PREVfQUxMLCBtQWdlbnQuZ2V0U2h1ZmZsZU1vZGUoKSk7Ci0KLSAgICAgICAgbUV2ZW50Q2FsbGJhY2suY2xlYXIoKTsKLSAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKLSAgICAgICAgICAgIG1BZ2VudC5zZXRTaHVmZmxlTW9kZShNZWRpYVBsYXlsaXN0QWdlbnQuU0hVRkZMRV9NT0RFX0dST1VQKTsKLSAgICAgICAgICAgIG1XYWl0TG9jay53YWl0KFdBSVRfVElNRV9NUyk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKG1FdmVudENhbGxiYWNrLm9uU2h1ZmZsZU1vZGVDaGFuZ2VkQ2FsbGVkKTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRFcXVhbHMoTWVkaWFQbGF5bGlzdEFnZW50LlNIVUZGTEVfTU9ERV9HUk9VUCwgbUFnZW50LmdldFNodWZmbGVNb2RlKCkpOwotCi0gICAgICAgIC8vIElOVkFMSURfU0hVRkZMRV9NT0RFIHdpbGwgbm90IGNoYW5nZSB0aGUgc2h1ZmZsZSBtb2RlLgotICAgICAgICBtRXZlbnRDYWxsYmFjay5jbGVhcigpOwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0TG9jaykgewotICAgICAgICAgICAgbUFnZW50LnNldFNodWZmbGVNb2RlKElOVkFMSURfU0hVRkZMRV9NT0RFKTsKLSAgICAgICAgICAgIG1XYWl0TG9jay53YWl0KFdBSVRfVElNRV9NUyk7Ci0gICAgICAgICAgICBhc3NlcnRGYWxzZShtRXZlbnRDYWxsYmFjay5vblNodWZmbGVNb2RlQ2hhbmdlZENhbGxlZCk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKE1lZGlhUGxheWxpc3RBZ2VudC5TSFVGRkxFX01PREVfR1JPVVAsIG1BZ2VudC5nZXRTaHVmZmxlTW9kZSgpKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRBbmRHZXRSZXBlYXRNb2RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGludCByZXBlYXRNb2RlID0gbUFnZW50LmdldFJlcGVhdE1vZGUoKTsKLSAgICAgICAgaWYgKHJlcGVhdE1vZGUgIT0gTWVkaWFQbGF5bGlzdEFnZW50LlJFUEVBVF9NT0RFX05PTkUpIHsKLSAgICAgICAgICAgIG1FdmVudENhbGxiYWNrLmNsZWFyKCk7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0TG9jaykgewotICAgICAgICAgICAgICAgIG1BZ2VudC5zZXRSZXBlYXRNb2RlKE1lZGlhUGxheWxpc3RBZ2VudC5SRVBFQVRfTU9ERV9OT05FKTsKLSAgICAgICAgICAgICAgICBtV2FpdExvY2sud2FpdChXQUlUX1RJTUVfTVMpOwotICAgICAgICAgICAgICAgIGFzc2VydFRydWUobUV2ZW50Q2FsbGJhY2sub25SZXBlYXRNb2RlQ2hhbmdlZENhbGxlZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoTWVkaWFQbGF5bGlzdEFnZW50LlJFUEVBVF9NT0RFX05PTkUsIG1BZ2VudC5nZXRSZXBlYXRNb2RlKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgbUV2ZW50Q2FsbGJhY2suY2xlYXIoKTsKLSAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKLSAgICAgICAgICAgIG1BZ2VudC5zZXRSZXBlYXRNb2RlKE1lZGlhUGxheWxpc3RBZ2VudC5SRVBFQVRfTU9ERV9PTkUpOwotICAgICAgICAgICAgbVdhaXRMb2NrLndhaXQoV0FJVF9USU1FX01TKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUobUV2ZW50Q2FsbGJhY2sub25SZXBlYXRNb2RlQ2hhbmdlZENhbGxlZCk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKE1lZGlhUGxheWxpc3RBZ2VudC5SRVBFQVRfTU9ERV9PTkUsIG1BZ2VudC5nZXRSZXBlYXRNb2RlKCkpOwotCi0gICAgICAgIG1FdmVudENhbGxiYWNrLmNsZWFyKCk7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7Ci0gICAgICAgICAgICBtQWdlbnQuc2V0UmVwZWF0TW9kZShNZWRpYVBsYXlsaXN0QWdlbnQuUkVQRUFUX01PREVfQUxMKTsKLSAgICAgICAgICAgIG1XYWl0TG9jay53YWl0KFdBSVRfVElNRV9NUyk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKG1FdmVudENhbGxiYWNrLm9uUmVwZWF0TW9kZUNoYW5nZWRDYWxsZWQpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydEVxdWFscyhNZWRpYVBsYXlsaXN0QWdlbnQuUkVQRUFUX01PREVfQUxMLCBtQWdlbnQuZ2V0UmVwZWF0TW9kZSgpKTsKLQotICAgICAgICBtRXZlbnRDYWxsYmFjay5jbGVhcigpOwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0TG9jaykgewotICAgICAgICAgICAgbUFnZW50LnNldFJlcGVhdE1vZGUoTWVkaWFQbGF5bGlzdEFnZW50LlJFUEVBVF9NT0RFX0dST1VQKTsKLSAgICAgICAgICAgIG1XYWl0TG9jay53YWl0KFdBSVRfVElNRV9NUyk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKG1FdmVudENhbGxiYWNrLm9uUmVwZWF0TW9kZUNoYW5nZWRDYWxsZWQpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydEVxdWFscyhNZWRpYVBsYXlsaXN0QWdlbnQuUkVQRUFUX01PREVfR1JPVVAsIG1BZ2VudC5nZXRSZXBlYXRNb2RlKCkpOwotCi0gICAgICAgIC8vIElOVkFMSURfU0hVRkZMRV9NT0RFIHdpbGwgbm90IGNoYW5nZSB0aGUgc2h1ZmZsZSBtb2RlLgotICAgICAgICBtRXZlbnRDYWxsYmFjay5jbGVhcigpOwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0TG9jaykgewotICAgICAgICAgICAgbUFnZW50LnNldFJlcGVhdE1vZGUoSU5WQUxJRF9SRVBFQVRfTU9ERSk7Ci0gICAgICAgICAgICBtV2FpdExvY2sud2FpdChXQUlUX1RJTUVfTVMpOwotICAgICAgICAgICAgYXNzZXJ0RmFsc2UobUV2ZW50Q2FsbGJhY2sub25SZXBlYXRNb2RlQ2hhbmdlZENhbGxlZCk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKE1lZGlhUGxheWxpc3RBZ2VudC5SRVBFQVRfTU9ERV9HUk9VUCwgbUFnZW50LmdldFJlcGVhdE1vZGUoKSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0UGxheWxpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaW50IGxpc3RTaXplID0gMTA7Ci0gICAgICAgIGNyZWF0ZUFuZFNldFBsYXlsaXN0KDEwKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGxpc3RTaXplLCBtQWdlbnQuZ2V0UGxheWxpc3QoKS5zaXplKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2tpcEl0ZW1zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGludCBsaXN0U2l6ZSA9IDU7Ci0gICAgICAgIExpc3Q8TWVkaWFJdGVtMj4gcGxheWxpc3QgPSBjcmVhdGVBbmRTZXRQbGF5bGlzdChsaXN0U2l6ZSk7Ci0KLSAgICAgICAgbUFnZW50LnNldFJlcGVhdE1vZGUoTWVkaWFQbGF5bGlzdEFnZW50LlJFUEVBVF9NT0RFX05PTkUpOwotICAgICAgICAvLyBUZXN0IHNraXBUb1BsYXlsaXN0SXRlbQotICAgICAgICBmb3IgKGludCBpID0gbGlzdFNpemUgLSAxOyBpID49IDA7IC0taSkgewotICAgICAgICAgICAgbUFnZW50LnNraXBUb1BsYXlsaXN0SXRlbShwbGF5bGlzdC5nZXQoaSkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGksIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVGVzdCBza2lwVG9OZXh0SXRlbQotICAgICAgICAvLyBjdXJQbGF5UG9zID0gMAotICAgICAgICBmb3IgKGludCBjdXJQbGF5UG9zID0gMDsgY3VyUGxheVBvcyA8IGxpc3RTaXplIC0gMTsgKytjdXJQbGF5UG9zKSB7Ci0gICAgICAgICAgICBtQWdlbnQuc2tpcFRvTmV4dEl0ZW0oKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhjdXJQbGF5UG9zICsgMSwgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgbUFnZW50LnNraXBUb05leHRJdGVtKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhsaXN0U2l6ZSAtIDEsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOwotCi0gICAgICAgIC8vIFRlc3Qgc2tpcFRvUHJldmlvdXMKLSAgICAgICAgLy8gY3VyUGxheVBvcyA9IGxpc3RTaXplIC0gMQotICAgICAgICBmb3IgKGludCBjdXJQbGF5UG9zID0gbGlzdFNpemUgLSAxOyBjdXJQbGF5UG9zID4gMDsgLS1jdXJQbGF5UG9zKSB7Ci0gICAgICAgICAgICBtQWdlbnQuc2tpcFRvUHJldmlvdXNJdGVtKCk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoY3VyUGxheVBvcyAtIDEsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOwotICAgICAgICB9Ci0gICAgICAgIG1BZ2VudC5za2lwVG9QcmV2aW91c0l0ZW0oKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOwotCi0gICAgICAgIG1BZ2VudC5zZXRSZXBlYXRNb2RlKE1lZGlhUGxheWxpc3RBZ2VudC5SRVBFQVRfTU9ERV9BTEwpOwotICAgICAgICAvLyBUZXN0IHNraXBUb1ByZXZpb3VzIHdpdGggcmVwZWF0IG1vZGUgYWxsCi0gICAgICAgIC8vIGN1clBsYXlQb3MgPSAwCi0gICAgICAgIG1BZ2VudC5za2lwVG9QcmV2aW91c0l0ZW0oKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGxpc3RTaXplIC0gMSwgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7Ci0KLSAgICAgICAgLy8gVGVzdCBza2lwVG9OZXh0IHdpdGggcmVwZWF0IG1vZGUgYWxsCi0gICAgICAgIC8vIGN1clBsYXlQb3MgPSBsaXN0U2l6ZSAtIDEKLSAgICAgICAgbUFnZW50LnNraXBUb05leHRJdGVtKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKLQotICAgICAgICBtQWdlbnQuc2tpcFRvUHJldmlvdXNJdGVtKCk7Ci0gICAgICAgIC8vIGN1clBsYXlQb3MgPSBsaXN0U2l6ZSAtIDEsIG5leHRQbGF5UG9zID0gMAotICAgICAgICAvLyBUZXN0IG5leHQgcGxheSBwb3MgYWZ0ZXIgc2V0dGluZyByZXBlYXQgbW9kZSBub25lLgotICAgICAgICBtQWdlbnQuc2V0UmVwZWF0TW9kZShNZWRpYVBsYXlsaXN0QWdlbnQuUkVQRUFUX01PREVfTk9ORSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhsaXN0U2l6ZSAtIDEsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEVkaXRQbGF5bGlzdCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpbnQgbGlzdFNpemUgPSA1OwotICAgICAgICBMaXN0PE1lZGlhSXRlbTI+IHBsYXlsaXN0ID0gY3JlYXRlQW5kU2V0UGxheWxpc3QobGlzdFNpemUpOwotCi0gICAgICAgIC8vIFRlc3QgYWRkIGl0ZW06IFswIChjdXIpLCAxLCAyLCAzLCA0XSAtPiBbMCAoY3VyKSwgMSwgNSwgMiwgMywgNF0KLSAgICAgICAgbUV2ZW50Q2FsbGJhY2suY2xlYXIoKTsKLSAgICAgICAgTWVkaWFJdGVtMiBpdGVtXzUgPSBnZW5lcmF0ZU1lZGlhSXRlbSg1KTsKLSAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKLSAgICAgICAgICAgIHBsYXlsaXN0LmFkZCgyLCBpdGVtXzUpOwotICAgICAgICAgICAgbUFnZW50LmFkZFBsYXlsaXN0SXRlbSgyLCBpdGVtXzUpOwotICAgICAgICAgICAgbVdhaXRMb2NrLndhaXQoV0FJVF9USU1FX01TKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUobUV2ZW50Q2FsbGJhY2sub25QbGF5bGlzdENoYW5nZWRDYWxsZWQpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFBsYXlsaXN0RXF1YWxzKHBsYXlsaXN0LCBtQWdlbnQuZ2V0UGxheWxpc3QoKSk7Ci0KLSAgICAgICAgbUV2ZW50Q2FsbGJhY2suY2xlYXIoKTsKLSAgICAgICAgLy8gTW92ZSBjdXJyZW50OiBbMCAoY3VyKSwgMSwgNSwgMiwgMywgNF0gLT4gWzAsIDEsIDUgKGN1ciksIDIsIDMsIDRdCi0gICAgICAgIG1BZ2VudC5za2lwVG9QbGF5bGlzdEl0ZW0oaXRlbV81KTsKLSAgICAgICAgLy8gUmVtb3ZlIGN1cnJlbnQgaXRlbTogWzAsIDEsIDUgKGN1ciksIDIsIDMsIDRdIC0+IFswLCAxLCAyIChjdXIpLCAzLCA0XQotICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0TG9jaykgewotICAgICAgICAgICAgcGxheWxpc3QucmVtb3ZlKGl0ZW1fNSk7Ci0gICAgICAgICAgICBtQWdlbnQucmVtb3ZlUGxheWxpc3RJdGVtKGl0ZW1fNSk7Ci0gICAgICAgICAgICBtV2FpdExvY2sud2FpdChXQUlUX1RJTUVfTVMpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtRXZlbnRDYWxsYmFjay5vblBsYXlsaXN0Q2hhbmdlZENhbGxlZCk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0UGxheWxpc3RFcXVhbHMocGxheWxpc3QsIG1BZ2VudC5nZXRQbGF5bGlzdCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOwotCi0gICAgICAgIC8vIFJlbW92ZSBwcmV2aW91cyBpdGVtOiBbMCwgMSwgMiAoY3VyKSwgMywgNF0gLT4gWzAsIDIgKGN1ciksIDMsIDRdCi0gICAgICAgIG1FdmVudENhbGxiYWNrLmNsZWFyKCk7Ci0gICAgICAgIE1lZGlhSXRlbTIgcHJldmlvdXNJdGVtID0gcGxheWxpc3QuZ2V0KDEpOwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0TG9jaykgewotICAgICAgICAgICAgcGxheWxpc3QucmVtb3ZlKHByZXZpb3VzSXRlbSk7Ci0gICAgICAgICAgICBtQWdlbnQucmVtb3ZlUGxheWxpc3RJdGVtKHByZXZpb3VzSXRlbSk7Ci0gICAgICAgICAgICBtV2FpdExvY2sud2FpdChXQUlUX1RJTUVfTVMpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtRXZlbnRDYWxsYmFjay5vblBsYXlsaXN0Q2hhbmdlZENhbGxlZCk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0UGxheWxpc3RFcXVhbHMocGxheWxpc3QsIG1BZ2VudC5nZXRQbGF5bGlzdCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOwotCi0gICAgICAgIC8vIFJlbW92ZSBuZXh0IGl0ZW06IFswLCAyIChjdXIpLCAzLCA0XSAtPiBbMCwgMiAoY3VyKSwgNF0KLSAgICAgICAgbUV2ZW50Q2FsbGJhY2suY2xlYXIoKTsKLSAgICAgICAgTWVkaWFJdGVtMiBuZXh0SXRlbSA9IHBsYXlsaXN0LmdldCgyKTsKLSAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKLSAgICAgICAgICAgIHBsYXlsaXN0LnJlbW92ZShuZXh0SXRlbSk7Ci0gICAgICAgICAgICBtQWdlbnQucmVtb3ZlUGxheWxpc3RJdGVtKG5leHRJdGVtKTsKLSAgICAgICAgICAgIG1XYWl0TG9jay53YWl0KFdBSVRfVElNRV9NUyk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKG1FdmVudENhbGxiYWNrLm9uUGxheWxpc3RDaGFuZ2VkQ2FsbGVkKTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRQbGF5bGlzdEVxdWFscyhwbGF5bGlzdCwgbUFnZW50LmdldFBsYXlsaXN0KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7Ci0KLSAgICAgICAgLy8gUmVwbGFjZSBpdGVtOiBbMCwgMiAoY3VyKSwgNF0gLT4gWzAsIDIgKGN1ciksIDVdCi0gICAgICAgIG1FdmVudENhbGxiYWNrLmNsZWFyKCk7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7Ci0gICAgICAgICAgICBwbGF5bGlzdC5zZXQoMiwgaXRlbV81KTsKLSAgICAgICAgICAgIG1BZ2VudC5yZXBsYWNlUGxheWxpc3RJdGVtKDIsIGl0ZW1fNSk7Ci0gICAgICAgICAgICBtV2FpdExvY2sud2FpdChXQUlUX1RJTUVfTVMpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtRXZlbnRDYWxsYmFjay5vblBsYXlsaXN0Q2hhbmdlZENhbGxlZCk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0UGxheWxpc3RFcXVhbHMocGxheWxpc3QsIG1BZ2VudC5nZXRQbGF5bGlzdCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOwotCi0gICAgICAgIC8vIE1vdmUgbGFzdCBhbmQgcmVtb3ZlIHRoZSBsYXN0IGl0ZW06IFswLCAyIChjdXIpLCA1XSAtPiBbMCwgMiwgNSAoY3VyKV0gLT4gWzAsIDIgKGN1cildCi0gICAgICAgIE1lZGlhSXRlbTIgbGFzdEl0ZW0gPSBwbGF5bGlzdC5nZXQoMSk7Ci0gICAgICAgIG1BZ2VudC5za2lwVG9QbGF5bGlzdEl0ZW0obGFzdEl0ZW0pOwotICAgICAgICBtRXZlbnRDYWxsYmFjay5jbGVhcigpOwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0TG9jaykgewotICAgICAgICAgICAgcGxheWxpc3QucmVtb3ZlKGxhc3RJdGVtKTsKLSAgICAgICAgICAgIG1BZ2VudC5yZW1vdmVQbGF5bGlzdEl0ZW0obGFzdEl0ZW0pOwotICAgICAgICAgICAgbVdhaXRMb2NrLndhaXQoV0FJVF9USU1FX01TKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUobUV2ZW50Q2FsbGJhY2sub25QbGF5bGlzdENoYW5nZWRDYWxsZWQpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFBsYXlsaXN0RXF1YWxzKHBsYXlsaXN0LCBtQWdlbnQuZ2V0UGxheWxpc3QoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKLQotICAgICAgICAvLyBSZW1vdmUgYWxsIGl0ZW1zCi0gICAgICAgIGZvciAoaW50IGkgPSBwbGF5bGlzdC5zaXplKCkgLSAxOyBpID49IDA7IC0taSkgewotICAgICAgICAgICAgTWVkaWFJdGVtMiBpdGVtID0gcGxheWxpc3QuZ2V0KGkpOwotICAgICAgICAgICAgbUFnZW50LnNraXBUb1BsYXlsaXN0SXRlbShpdGVtKTsKLSAgICAgICAgICAgIG1FdmVudENhbGxiYWNrLmNsZWFyKCk7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0TG9jaykgewotICAgICAgICAgICAgICAgIHBsYXlsaXN0LnJlbW92ZShpdGVtKTsKLSAgICAgICAgICAgICAgICBtQWdlbnQucmVtb3ZlUGxheWxpc3RJdGVtKGl0ZW0pOwotICAgICAgICAgICAgICAgIG1XYWl0TG9jay53YWl0KFdBSVRfVElNRV9NUyk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtRXZlbnRDYWxsYmFjay5vblBsYXlsaXN0Q2hhbmdlZENhbGxlZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhc3NlcnRQbGF5bGlzdEVxdWFscyhwbGF5bGlzdCwgbUFnZW50LmdldFBsYXlsaXN0KCkpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydEVxdWFscyhTZXNzaW9uUGxheWxpc3RBZ2VudC5OT19WQUxJRF9JVEVNUywgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7Ci0gICAgfQotCi0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RQbGF5bGlzdFdpdGhJbnZhbGlkSXRlbSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpbnQgbGlzdFNpemUgPSAyOwotICAgICAgICBMaXN0PE1lZGlhSXRlbTI+IHBsYXlsaXN0ID0gY3JlYXRlQW5kU2V0UGxheWxpc3QobGlzdFNpemUpOwotCi0gICAgICAgIC8vIEFkZCBpdGVtOiBbMCAoY3VyKSwgMV0gLT4gWzAgKGN1ciksIDMgKG5vX2RzZCksIDFdCi0gICAgICAgIG1FdmVudENhbGxiYWNrLmNsZWFyKCk7Ci0gICAgICAgIE1lZGlhSXRlbTIgaW52YWxpZEl0ZW0yID0gZ2VuZXJhdGVNZWRpYUl0ZW1XaXRob3V0RGF0YVNvdXJjZURlc2MoMik7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7Ci0gICAgICAgICAgICBwbGF5bGlzdC5hZGQoMSwgaW52YWxpZEl0ZW0yKTsKLSAgICAgICAgICAgIG1BZ2VudC5hZGRQbGF5bGlzdEl0ZW0oMSwgaW52YWxpZEl0ZW0yKTsKLSAgICAgICAgICAgIG1XYWl0TG9jay53YWl0KFdBSVRfVElNRV9NUyk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKG1FdmVudENhbGxiYWNrLm9uUGxheWxpc3RDaGFuZ2VkQ2FsbGVkKTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRQbGF5bGlzdEVxdWFscyhwbGF5bGlzdCwgbUFnZW50LmdldFBsYXlsaXN0KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7Ci0KLSAgICAgICAgLy8gVGVzdCBza2lwIHRvIG5leHQgaXRlbTogIFswIChjdXIpLCAyIChub19kc2QpLCAxXSAtPiBbMCwgMiAobm9fZHNkKSwgMSAoY3VyKV0KLSAgICAgICAgbUFnZW50LnNraXBUb05leHRJdGVtKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygyLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKLQotICAgICAgICAvLyBUZXN0IHNraXAgdG8gcHJldmlvdXMgaXRlbTogWzAsIDIgKG5vX2RzZCksIDEgKGN1cildIC0+IFswIChjdXIpLCAyIChub19kc2QpLCAxXQotICAgICAgICBtQWdlbnQuc2tpcFRvUHJldmlvdXNJdGVtKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKLQotICAgICAgICAvLyBSZW1vdmUgY3VycmVudCBpdGVtOiBbMCAoY3VyKSwgMiAobm9fZHNkKSwgMV0gLT4gWzIgKG5vX2RzZCksIDEgKGN1cildCi0gICAgICAgIG1FdmVudENhbGxiYWNrLmNsZWFyKCk7Ci0gICAgICAgIE1lZGlhSXRlbTIgaXRlbSA9IHBsYXlsaXN0LmdldCgwKTsKLSAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKLSAgICAgICAgICAgIHBsYXlsaXN0LnJlbW92ZShpdGVtKTsKLSAgICAgICAgICAgIG1BZ2VudC5yZW1vdmVQbGF5bGlzdEl0ZW0oaXRlbSk7Ci0gICAgICAgICAgICBtV2FpdExvY2sud2FpdChXQUlUX1RJTUVfTVMpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtRXZlbnRDYWxsYmFjay5vblBsYXlsaXN0Q2hhbmdlZENhbGxlZCk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0UGxheWxpc3RFcXVhbHMocGxheWxpc3QsIG1BZ2VudC5nZXRQbGF5bGlzdCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOwotCi0gICAgICAgIC8vIFJlbW92ZSBjdXJyZW50IGl0ZW06IFsyIChub19kc2QpLCAxIChjdXIpXSAtPiBbMiAobm9fZHNkKV0KLSAgICAgICAgbUV2ZW50Q2FsbGJhY2suY2xlYXIoKTsKLSAgICAgICAgaXRlbSA9IHBsYXlsaXN0LmdldCgxKTsKLSAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKLSAgICAgICAgICAgIHBsYXlsaXN0LnJlbW92ZShpdGVtKTsKLSAgICAgICAgICAgIG1BZ2VudC5yZW1vdmVQbGF5bGlzdEl0ZW0oaXRlbSk7Ci0gICAgICAgICAgICBtV2FpdExvY2sud2FpdChXQUlUX1RJTUVfTVMpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtRXZlbnRDYWxsYmFjay5vblBsYXlsaXN0Q2hhbmdlZENhbGxlZCk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0UGxheWxpc3RFcXVhbHMocGxheWxpc3QsIG1BZ2VudC5nZXRQbGF5bGlzdCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFNlc3Npb25QbGF5bGlzdEFnZW50Lk5PX1ZBTElEX0lURU1TLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKLQotICAgICAgICAvLyBBZGQgaW52YWxpZCBpdGVtOiBbMiAobm9fZHNkKV0gLT4gWzAgKG5vX2RzZCksIDIgKG5vX2RzZCldCi0gICAgICAgIE1lZGlhSXRlbTIgaW52YWxpZEl0ZW0wID0gZ2VuZXJhdGVNZWRpYUl0ZW1XaXRob3V0RGF0YVNvdXJjZURlc2MoMCk7Ci0gICAgICAgIG1FdmVudENhbGxiYWNrLmNsZWFyKCk7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7Ci0gICAgICAgICAgICBwbGF5bGlzdC5hZGQoMCwgaW52YWxpZEl0ZW0wKTsKLSAgICAgICAgICAgIG1BZ2VudC5hZGRQbGF5bGlzdEl0ZW0oMCwgaW52YWxpZEl0ZW0wKTsKLSAgICAgICAgICAgIG1XYWl0TG9jay53YWl0KFdBSVRfVElNRV9NUyk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKG1FdmVudENhbGxiYWNrLm9uUGxheWxpc3RDaGFuZ2VkQ2FsbGVkKTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRQbGF5bGlzdEVxdWFscyhwbGF5bGlzdCwgbUFnZW50LmdldFBsYXlsaXN0KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoU2Vzc2lvblBsYXlsaXN0QWdlbnQuTk9fVkFMSURfSVRFTVMsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOwotCi0gICAgICAgIC8vIEFkZCB2YWxpZCBpdGVtOiBbMCAobm9fZHNkKSwgMiAobm9fZHNkKV0gLT4gWzAgKG5vX2RzZCksIDEsIDIgKG5vX2RzZCldCi0gICAgICAgIE1lZGlhSXRlbTIgaW52YWxpZEl0ZW0xID0gZ2VuZXJhdGVNZWRpYUl0ZW0oMSk7Ci0gICAgICAgIG1FdmVudENhbGxiYWNrLmNsZWFyKCk7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7Ci0gICAgICAgICAgICBwbGF5bGlzdC5hZGQoMSwgaW52YWxpZEl0ZW0xKTsKLSAgICAgICAgICAgIG1BZ2VudC5hZGRQbGF5bGlzdEl0ZW0oMSwgaW52YWxpZEl0ZW0xKTsKLSAgICAgICAgICAgIG1XYWl0TG9jay53YWl0KFdBSVRfVElNRV9NUyk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKG1FdmVudENhbGxiYWNrLm9uUGxheWxpc3RDaGFuZ2VkQ2FsbGVkKTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRQbGF5bGlzdEVxdWFscyhwbGF5bGlzdCwgbUFnZW50LmdldFBsYXlsaXN0KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7Ci0KLSAgICAgICAgLy8gUmVwbGFjZSB0aGUgdmFsaWQgaXRlbSB3aXRoIGFuIGludmFsaWQgaXRlbToKLSAgICAgICAgLy8gWzAgKG5vX2RzZCksIDEgKGN1ciksIDIgKG5vX2RzZCldIC0+IFswIChub19kc2QpLCAzIChub19kc2QpLCAyIChub19kc2QpXQotICAgICAgICBNZWRpYUl0ZW0yIGludmFsaWRJdGVtMyA9IGdlbmVyYXRlTWVkaWFJdGVtV2l0aG91dERhdGFTb3VyY2VEZXNjKDMpOwotICAgICAgICBtRXZlbnRDYWxsYmFjay5jbGVhcigpOwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0TG9jaykgewotICAgICAgICAgICAgcGxheWxpc3Quc2V0KDEsIGludmFsaWRJdGVtMyk7Ci0gICAgICAgICAgICBtQWdlbnQucmVwbGFjZVBsYXlsaXN0SXRlbSgxLCBpbnZhbGlkSXRlbTMpOwotICAgICAgICAgICAgbVdhaXRMb2NrLndhaXQoV0FJVF9USU1FX01TKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUobUV2ZW50Q2FsbGJhY2sub25QbGF5bGlzdENoYW5nZWRDYWxsZWQpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFBsYXlsaXN0RXF1YWxzKHBsYXlsaXN0LCBtQWdlbnQuZ2V0UGxheWxpc3QoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhTZXNzaW9uUGxheWxpc3RBZ2VudC5FTkRfT0ZfUExBWUxJU1QsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFBsYXlsaXN0QWZ0ZXJPbkN1cnJlbnREYXRhU291cmNlQ2hhbmdlZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpbnQgbGlzdFNpemUgPSAyOwotICAgICAgICB2ZXJpZnkobVBsYXllcikucmVnaXN0ZXJQbGF5ZXJFdmVudENhbGxiYWNrKE1hdGNoZXJzLmFueSgpLCBNYXRjaGVycy5hbnkoKSk7Ci0KLSAgICAgICAgY3JlYXRlQW5kU2V0UGxheWxpc3QobGlzdFNpemUpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7Ci0KLSAgICAgICAgbVBsYXllckV2ZW50Q2FsbGJhY2sub25DdXJyZW50RGF0YVNvdXJjZUNoYW5nZWQobVBsYXllciwgbnVsbCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKLSAgICAgICAgbVBsYXllckV2ZW50Q2FsbGJhY2sub25DdXJyZW50RGF0YVNvdXJjZUNoYW5nZWQobVBsYXllciwgbnVsbCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhTZXNzaW9uUGxheWxpc3RBZ2VudC5FTkRfT0ZfUExBWUxJU1QsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOwotCi0gICAgICAgIG1BZ2VudC5za2lwVG9OZXh0SXRlbSgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoU2Vzc2lvblBsYXlsaXN0QWdlbnQuRU5EX09GX1BMQVlMSVNULCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKLQotICAgICAgICBtQWdlbnQuc2V0UmVwZWF0TW9kZShNZWRpYVBsYXlsaXN0QWdlbnQuUkVQRUFUX01PREVfT05FKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFNlc3Npb25QbGF5bGlzdEFnZW50LkVORF9PRl9QTEFZTElTVCwgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7Ci0KLSAgICAgICAgbUFnZW50LnNldFJlcGVhdE1vZGUoTWVkaWFQbGF5bGlzdEFnZW50LlJFUEVBVF9NT0RFX0FMTCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKLSAgICAgICAgbVBsYXllckV2ZW50Q2FsbGJhY2sub25DdXJyZW50RGF0YVNvdXJjZUNoYW5nZWQobVBsYXllciwgbnVsbCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKLSAgICAgICAgbVBsYXllckV2ZW50Q2FsbGJhY2sub25DdXJyZW50RGF0YVNvdXJjZUNoYW5nZWQobVBsYXllciwgbnVsbCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIExpc3Q8TWVkaWFJdGVtMj4gY3JlYXRlQW5kU2V0UGxheWxpc3QoaW50IGxpc3RTaXplKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgTGlzdDxNZWRpYUl0ZW0yPiBpdGVtcyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3RTaXplOyArK2kpIHsKLSAgICAgICAgICAgIGl0ZW1zLmFkZChnZW5lcmF0ZU1lZGlhSXRlbShpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgbUV2ZW50Q2FsbGJhY2suY2xlYXIoKTsKLSAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKLSAgICAgICAgICAgIG1BZ2VudC5zZXRQbGF5bGlzdChpdGVtcywgbnVsbCk7Ci0gICAgICAgICAgICBtV2FpdExvY2sud2FpdChXQUlUX1RJTUVfTVMpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtRXZlbnRDYWxsYmFjay5vblBsYXlsaXN0Q2hhbmdlZENhbGxlZCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGl0ZW1zOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhc3NlcnRQbGF5bGlzdEVxdWFscyhMaXN0PE1lZGlhSXRlbTI+IGV4cGVjdGVkLCBMaXN0PE1lZGlhSXRlbTI+IGFjdHVhbCkgewotICAgICAgICBpZiAoZXhwZWN0ZWQgPT0gYWN0dWFsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0VHJ1ZShleHBlY3RlZCAhPSBudWxsICYmIGFjdHVhbCAhPSBudWxsKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLnNpemUoKSwgYWN0dWFsLnNpemUoKSk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXhwZWN0ZWQuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgICAgIGFzc2VydFRydWUoZXhwZWN0ZWQuZ2V0KGkpLmVxdWFscyhhY3R1YWwuZ2V0KGkpKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIE1lZGlhSXRlbTIgZ2VuZXJhdGVNZWRpYUl0ZW1XaXRob3V0RGF0YVNvdXJjZURlc2MoaW50IGtleSkgewotICAgICAgICByZXR1cm4gbmV3IE1lZGlhSXRlbTIuQnVpbGRlcigwKQotICAgICAgICAgICAgICAgIC5zZXRNZWRpYUlkKCJURVNUX01FRElBX0lEX1dJVEhPVVRfRFNEXyIgKyBrZXkpCi0gICAgICAgICAgICAgICAgLmJ1aWxkKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBNZWRpYUl0ZW0yIGdlbmVyYXRlTWVkaWFJdGVtKGludCBrZXkpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBNZWRpYUl0ZW0yLkJ1aWxkZXIoMCkKLSAgICAgICAgICAgICAgICAuc2V0TWVkaWFJZCgiVEVTVF9NRURJQV9JRF8iICsga2V5KQotICAgICAgICAgICAgICAgIC5idWlsZCgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL09XTkVSUyBiL3BhY2thZ2VzL09XTkVSUwppbmRleCBiYmM0Y2VmLi4zYjlmZDJiIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9PV05FUlMKKysrIGIvcGFja2FnZXMvT1dORVJTCkBAIC0xLDYgKzEsOSBAQAogYWtlcnN0ZW5AZ29vZ2xlLmNvbQogZHdrYW5nQGdvb2dsZS5jb20KK2hkbW9vbkBnb29nbGUuY29tCitpbnN1bkBnb29nbGUuY29tCiBqYWV3YW5AZ29vZ2xlLmNvbQoramlucGFya0Bnb29nbGUuY29tCiBtYXJjb25lQGdvb2dsZS5jb20KIHN1bmdzb29AZ29vZ2xlLmNvbQogd2ppYUBnb29nbGUuY29tCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQW5kcm9pZC5tayBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BbmRyb2lkLm1rCmluZGV4IDc0MTllNjQuLmMwYWE0NzcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BbmRyb2lkLm1rCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BbmRyb2lkLm1rCkBAIC0yLDI0ICsyLDYgQEAKIAogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCiAKLUxPQ0FMX1NSQ19GSUxFUyA6PSBcCi0gICAgU2VydmljZVV0aWxpdGllcy5jcHAKLQotIyBGSVhNRSBNb3ZlIHRoaXMgbGlicmFyeSB0byBmcmFtZXdvcmtzL25hdGl2ZQotTE9DQUxfTU9EVUxFIDo9IGxpYnNlcnZpY2V1dGlsaXR5Ci0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotICAgIGxpYmN1dGlscyBcCi0gICAgbGlidXRpbHMgXAotICAgIGxpYmxvZyBcCi0gICAgbGliYmluZGVyCi0KLUxPQ0FMX0NGTEFHUyA6PSAtV2FsbCAtV2Vycm9yCi0KLWluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KIExPQ0FMX1NSQ19GSUxFUzo9ICAgICAgICAgICAgICAgXAogICAgIEF1ZGlvRmxpbmdlci5jcHAgICAgICAgICAgICBcCiAgICAgVGhyZWFkcy5jcHAgICAgICAgICAgICAgICAgIFwKQEAgLTMxLDcgKzEzLDggQEAKICAgICBQYXRjaFBhbmVsLmNwcCAgICAgICAgICAgICAgXAogICAgIFN0YXRlUXVldWUuY3BwICAgICAgICAgICAgICBcCiAgICAgQnVmTG9nLmNwcCAgICAgICAgICAgICAgICAgIFwKLSAgICBUeXBlZExvZ2dlci5jcHAKKyAgICBUeXBlZExvZ2dlci5jcHAgICAgICAgICAgICAgXAorICAgIE5CQUlPX1RlZS5jcHAgICAgICAgICAgICAgICBcCiAKIExPQ0FMX0NfSU5DTFVERVMgOj0gXAogICAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kgXApAQCAtNTMsMTMgKzM2LDEzIEBACiAgICAgbGlibmJhaW8gXAogICAgIGxpYm5ibG9nIFwKICAgICBsaWJwb3dlcm1hbmFnZXIgXAotICAgIGxpYnNlcnZpY2V1dGlsaXR5IFwKICAgICBsaWJtZWRpYXV0aWxzIFwKICAgICBsaWJtZW11bnJlYWNoYWJsZSBcCiAgICAgbGlibWVkaWFfaGVscGVyCiAKIExPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gXAogICAgIGxpYmNwdXN0YXRzIFwKKyAgICBsaWJzbmRmaWxlIFwKIAogTE9DQUxfTVVMVElMSUIgOj0gJChBVURJT1NFUlZFUl9NVUxUSUxJQikKIApAQCAtODIsNiArNjUsNyBAQAogTE9DQUxfQ0ZMQUdTICs9IC1mdmlzaWJpbGl0eT1oaWRkZW4KIAogTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IgLVdhbGwKK0xPQ0FMX1NBTklUSVpFIDo9IGludGVnZXJfb3ZlcmZsb3cKIAogaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuY3BwCmluZGV4IGJkZDM5YzYuLjA2OTc1YWMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuY3BwCkBAIC0yMywxMiArMjMsMTIgQEAKICNpbmNsdWRlIDxkaXJlbnQuaD4KICNpbmNsdWRlIDxtYXRoLmg+CiAjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPHN5cy90aW1lLmg+CiAjaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+CiAKICNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+Ci0jaW5jbHVkZSA8Y3V0aWxzL211bHRpdXNlci5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CiAjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgpAQCAtNDcsNyArNDcsNyBAQAogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogCiAjaW5jbHVkZSAiQXVkaW9GbGluZ2VyLmgiCi0jaW5jbHVkZSAiU2VydmljZVV0aWxpdGllcy5oIgorI2luY2x1ZGUgIk5CQUlPX1RlZS5oIgogCiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9SZXNhbXBsZXJQdWJsaWMuaD4KIApAQCAtNTYsNyArNTYsNiBAQAogI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19lZmZlY3RzL2VmZmVjdF9hZWMuaD4KIAogI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3ByaW1pdGl2ZXMuaD4KLSNpbmNsdWRlIDxhdWRpb191dGlscy9zdHJpbmcuaD4KIAogI2luY2x1ZGUgPHBvd2VybWFuYWdlci9Qb3dlck1hbmFnZXIuaD4KIApAQCAtNjQsOCArNjMsOCBAQAogI2luY2x1ZGUgPG1lZGlhL01lbW9yeUxlYWtUcmFja1V0aWwuaD4KICNpbmNsdWRlIDxtZWRpYS9uYmFpby9QaXBlLmg+CiAjaW5jbHVkZSA8bWVkaWEvbmJhaW8vUGlwZVJlYWRlci5oPgotI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUGFyYW1ldGVyLmg+CiAjaW5jbHVkZSA8bWVkaWF1dGlscy9CYXR0ZXJ5Tm90aWZpZXIuaD4KKyNpbmNsdWRlIDxtZWRpYXV0aWxzL1NlcnZpY2VVdGlsaXRpZXMuaD4KICNpbmNsdWRlIDxwcml2YXRlL2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcuaD4KIAogLy8jZGVmaW5lIEJVRkxPR19OREVCVUcgMApAQCAtMTAwLDE3ICs5OSw2IEBACiAKIHVpbnQzMl90IEF1ZGlvRmxpbmdlcjo6bVNjcmVlblN0YXRlOwogCi0KLSNpZmRlZiBURUVfU0lOSwotYm9vbCBBdWRpb0ZsaW5nZXI6Om1UZWVTaW5rSW5wdXRFbmFibGVkID0gZmFsc2U7Ci1ib29sIEF1ZGlvRmxpbmdlcjo6bVRlZVNpbmtPdXRwdXRFbmFibGVkID0gZmFsc2U7Ci1ib29sIEF1ZGlvRmxpbmdlcjo6bVRlZVNpbmtUcmFja0VuYWJsZWQgPSBmYWxzZTsKLQotc2l6ZV90IEF1ZGlvRmxpbmdlcjo6bVRlZVNpbmtJbnB1dEZyYW1lcyA9IGtUZWVTaW5rSW5wdXRGcmFtZXNEZWZhdWx0Owotc2l6ZV90IEF1ZGlvRmxpbmdlcjo6bVRlZVNpbmtPdXRwdXRGcmFtZXMgPSBrVGVlU2lua091dHB1dEZyYW1lc0RlZmF1bHQ7Ci1zaXplX3QgQXVkaW9GbGluZ2VyOjptVGVlU2lua1RyYWNrRnJhbWVzID0ga1RlZVNpbmtUcmFja0ZyYW1lc0RlZmF1bHQ7Ci0jZW5kaWYKLQogLy8gSW4gb3JkZXIgdG8gYXZvaWQgaW52YWxpZGF0aW5nIG9mZmxvYWRlZCB0cmFja3MgZWFjaCB0aW1lIGEgVmlzdWFsaXplciBpcyB0dXJuZWQgb24gYW5kIG9mZgogLy8gd2UgZGVmaW5lIGEgbWluaW11bSB0aW1lIGR1cmluZyB3aGljaCBhIGdsb2JhbCBlZmZlY3QgaXMgY29uc2lkZXJlZCBlbmFibGVkLgogc3RhdGljIGNvbnN0IG5zZWNzX3Qga01pbkdsb2JhbEVmZmVjdEVuYWJsZXRpbWVOcyA9IHNlY29uZHMoNzIwMCk7CkBAIC0xNjAsNiArMTQ4LDcgQEAKICAgICAgIG1Ub3RhbE1lbW9yeSgwKSwKICAgICAgIG1DbGllbnRTaGFyZWRIZWFwU2l6ZShrTWluaW11bUNsaWVudFNoYXJlZEhlYXBTaXplQnl0ZXMpLAogICAgICAgbUdsb2JhbEVmZmVjdEVuYWJsZVRpbWUoMCksCisgICAgICBtUGF0Y2hQYW5lbCh0aGlzKSwKICAgICAgIG1TeXN0ZW1SZWFkeShmYWxzZSkKIHsKICAgICAvLyB1bnNpZ25lZCBpbnN0ZWFkIG9mIGF1ZGlvX3VuaXF1ZV9pZF91c2VfdCwgYmVjYXVzZSArKyBvcGVyYXRvciBpcyB1bmF2YWlsYWJsZSBmb3IgZW51bQpAQCAtMTY4LDcgKzE1Nyw2IEBACiAgICAgICAgIG1OZXh0VW5pcXVlSWRzW3VzZV0gPSBBVURJT19VTklRVUVfSURfVVNFX01BWDsKICAgICB9CiAKLSAgICBnZXRwaWRfY2FjaGVkID0gZ2V0cGlkKCk7CiAgICAgY29uc3QgYm9vbCBkb0xvZyA9IHByb3BlcnR5X2dldF9ib29sKCJyby50ZXN0X2hhcm5lc3MiLCBmYWxzZSk7CiAgICAgaWYgKGRvTG9nKSB7CiAgICAgICAgIG1Mb2dNZW1vcnlEZWFsZXIgPSBuZXcgTWVtb3J5RGVhbGVyKGtMb2dNZW1vcnlTaXplLCAiTG9nV3JpdGVycyIsCkBAIC0xODUsMjcgKzE3Myw2IEBACiAgICAgbUVmZmVjdHNGYWN0b3J5SGFsID0gRWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2U6OmNyZWF0ZSgpOwogCiAgICAgbU1lZGlhTG9nTm90aWZpZXItPnJ1bigiTWVkaWFMb2dOb3RpZmllciIpOwotCi0jaWZkZWYgVEVFX1NJTksKLSAgICBjaGFyIHZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07Ci0gICAgKHZvaWQpIHByb3BlcnR5X2dldCgicm8uZGVidWdnYWJsZSIsIHZhbHVlLCAiMCIpOwotICAgIGludCBkZWJ1Z2dhYmxlID0gYXRvaSh2YWx1ZSk7Ci0gICAgaW50IHRlZUVuYWJsZWQgPSAwOwotICAgIGlmIChkZWJ1Z2dhYmxlKSB7Ci0gICAgICAgICh2b2lkKSBwcm9wZXJ0eV9nZXQoImFmLnRlZSIsIHZhbHVlLCAiMCIpOwotICAgICAgICB0ZWVFbmFibGVkID0gYXRvaSh2YWx1ZSk7Ci0gICAgfQotICAgIC8vIEZJWE1FIHN5bWJvbGljIGNvbnN0YW50cyBoZXJlCi0gICAgaWYgKHRlZUVuYWJsZWQgJiAxKSB7Ci0gICAgICAgIG1UZWVTaW5rSW5wdXRFbmFibGVkID0gdHJ1ZTsKLSAgICB9Ci0gICAgaWYgKHRlZUVuYWJsZWQgJiAyKSB7Ci0gICAgICAgIG1UZWVTaW5rT3V0cHV0RW5hYmxlZCA9IHRydWU7Ci0gICAgfQotICAgIGlmICh0ZWVFbmFibGVkICYgNCkgewotICAgICAgICBtVGVlU2lua1RyYWNrRW5hYmxlZCA9IHRydWU7Ci0gICAgfQotI2VuZGlmCiB9CiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpvbkZpcnN0UmVmKCkKQEAgLTIyNiw4ICsxOTMsNiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgbVBhdGNoUGFuZWwgPSBuZXcgUGF0Y2hQYW5lbCh0aGlzKTsKLQogICAgIG1Nb2RlID0gQVVESU9fTU9ERV9OT1JNQUw7CiAKICAgICBnQXVkaW9GbGluZ2VyID0gdGhpczsKQEAgLTM0MSw3ICszMDYsNyBAQAogICAgICAgICAqc2Vzc2lvbklkID0gYWN0dWFsU2Vzc2lvbklkOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGlmIChkaXJlY3Rpb24gPT0gTW1hcFN0cmVhbUludGVyZmFjZTo6RElSRUNUSU9OX09VVFBVVCkgewotICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VPdXRwdXQoaW8sIHN0cmVhbVR5cGUsIGFjdHVhbFNlc3Npb25JZCk7CisgICAgICAgICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZU91dHB1dChwb3J0SWQpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VJbnB1dChwb3J0SWQpOwogICAgICAgICB9CkBAIC00NzgsNyArNDQzLDcgQEAKICAgICAgICAgICAgIG1IYXJkd2FyZUxvY2sudW5sb2NrKCk7CiAgICAgICAgIH0KIAotICAgICAgICBib29sIGxvY2tlZCA9IGR1bXBUcnlMb2NrKG1Mb2NrKTsKKyAgICAgICAgY29uc3QgYm9vbCBsb2NrZWQgPSBkdW1wVHJ5TG9jayhtTG9jayk7CiAKICAgICAgICAgLy8gZmFpbGVkIHRvIGxvY2sgLSBBdWRpb0ZsaW5nZXIgaXMgcHJvYmFibHkgZGVhZGxvY2tlZAogICAgICAgICBpZiAoIWxvY2tlZCkgewpAQCAtNTM0LDEyICs0OTksMjIgQEAKICAgICAgICAgICAgIGRldi0+ZHVtcChmZCk7CiAgICAgICAgIH0KIAotI2lmZGVmIFRFRV9TSU5LCi0gICAgICAgIC8vIGR1bXAgdGhlIHNlcmlhbGx5IHNoYXJlZCByZWNvcmQgdGVlIHNpbmsKLSAgICAgICAgaWYgKG1SZWNvcmRUZWVTb3VyY2UgIT0gMCkgewotICAgICAgICAgICAgZHVtcFRlZShmZCwgbVJlY29yZFRlZVNvdXJjZSwgQVVESU9fSU9fSEFORExFX05PTkUsICdDJyk7Ci0gICAgICAgIH0KLSNlbmRpZgorICAgICAgICBtUGF0Y2hQYW5lbC5kdW1wKGZkKTsKKworICAgICAgICAvLyBkdW1wIGV4dGVybmFsIHNldFBhcmFtZXRlcnMKKyAgICAgICAgYXV0byBkdW1wTG9nZ2VyID0gW2ZkXShTaW1wbGVMb2cmIGxvZ2dlciwgY29uc3QgY2hhciogbmFtZSkgeworICAgICAgICAgICAgZHByaW50ZihmZCwgIlxuJXMgc2V0UGFyYW1ldGVyczpcbiIsIG5hbWUpOworICAgICAgICAgICAgbG9nZ2VyLmR1bXAoZmQsICIgICAgIiAvKiBwcmVmaXggKi8pOworICAgICAgICB9OworICAgICAgICBkdW1wTG9nZ2VyKG1SZWplY3RlZFNldFBhcmFtZXRlckxvZywgIlJlamVjdGVkIik7CisgICAgICAgIGR1bXBMb2dnZXIobUFwcFNldFBhcmFtZXRlckxvZywgIkFwcCIpOworICAgICAgICBkdW1wTG9nZ2VyKG1TeXN0ZW1TZXRQYXJhbWV0ZXJMb2csICJTeXN0ZW0iKTsKKworICAgICAgICAvLyBkdW1wIGhpc3RvcmljYWwgdGhyZWFkcyBpbiB0aGUgbGFzdCAxMCBzZWNvbmRzCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHRocmVhZExvZyA9IG1UaHJlYWRMb2cuZHVtcFRvU3RyaW5nKAorICAgICAgICAgICAgICAgICJIaXN0b3JpY2FsIFRocmVhZCBMb2cgIiwgMCAvKiBsaW5lcyAqLywKKyAgICAgICAgICAgICAgICBhdWRpb191dGlsc19nZXRfcmVhbF90aW1lX25zKCkgLSAxMCAqIDYwICogTkFOT1NfUEVSX1NFQ09ORCk7CisgICAgICAgIHdyaXRlKGZkLCB0aHJlYWRMb2cuY19zdHIoKSwgdGhyZWFkTG9nLnNpemUoKSk7CiAKICAgICAgICAgQlVGTE9HX1JFU0VUOwogCkBAIC01NDcsNiArNTIyLDEwIEBACiAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKICAgICAgICAgfQogCisjaWZkZWYgVEVFX1NJTksKKyAgICAgICAgLy8gTkJBSU9fVGVlIGR1bXAgaXMgc2FmZSB0byBjYWxsIG91dHNpZGUgb2YgQUYgbG9jay4KKyAgICAgICAgTkJBSU9fVGVlOjpkdW1wQWxsKGZkLCAiX0RVTVAiKTsKKyNlbmRpZgogICAgICAgICAvLyBhcHBlbmQgYSBjb3B5IG9mIG1lZGlhLmxvZyBoZXJlIGJ5IGZvcndhcmRpbmcgZmQgdG8gaXQsIGJ1dCBkb24ndCBhdHRlbXB0CiAgICAgICAgIC8vIHRvIGxvb2t1cCB0aGUgc2VydmljZSBpZiBpdCdzIG5vdCBydW5uaW5nLCBhcyBpdCB3aWxsIGJsb2NrIGZvciBhIHNlY29uZAogICAgICAgICBpZiAoc01lZGlhTG9nU2VydmljZUFzQmluZGVyICE9IDApIHsKQEAgLTY2Niw3ICs2NDUsNyBAQAogICAgIGJvb2wgdXBkYXRlUGlkID0gKGlucHV0LmNsaWVudEluZm8uY2xpZW50UGlkID09IC0xKTsKICAgICBjb25zdCB1aWRfdCBjYWxsaW5nVWlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpOwogICAgIHVpZF90IGNsaWVudFVpZCA9IGlucHV0LmNsaWVudEluZm8uY2xpZW50VWlkOwotICAgIGlmICghaXNUcnVzdGVkQ2FsbGluZ1VpZChjYWxsaW5nVWlkKSkgeworICAgIGlmICghaXNBdWRpb1NlcnZlck9yTWVkaWFTZXJ2ZXJVaWQoY2FsbGluZ1VpZCkpIHsKICAgICAgICAgQUxPR1dfSUYoY2xpZW50VWlkICE9IGNhbGxpbmdVaWQsCiAgICAgICAgICAgICAgICAgIiVzIHVpZCAlZCB0cmllZCB0byBwYXNzIGl0c2VsZiBvZmYgYXMgJWQiLAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY2FsbGluZ1VpZCwgY2xpZW50VWlkKTsKQEAgLTc2Nyw2ICs3NDYsNyBAQAogICAgICAgICBvdXRwdXQuYWZGcmFtZUNvdW50ID0gdGhyZWFkLT5mcmFtZUNvdW50KCk7CiAgICAgICAgIG91dHB1dC5hZlNhbXBsZVJhdGUgPSB0aHJlYWQtPnNhbXBsZVJhdGUoKTsKICAgICAgICAgb3V0cHV0LmFmTGF0ZW5jeU1zID0gdGhyZWFkLT5sYXRlbmN5KCk7CisgICAgICAgIG91dHB1dC50cmFja0lkID0gdHJhY2sgPT0gbnVsbHB0ciA/IC0xIDogdHJhY2stPmlkKCk7CiAKICAgICAgICAgLy8gbW92ZSBlZmZlY3QgY2hhaW4gdG8gdGhpcyBvdXRwdXQgdGhyZWFkIGlmIGFuIGVmZmVjdCBvbiBzYW1lIHNlc3Npb24gd2FzIHdhaXRpbmcKICAgICAgICAgLy8gZm9yIGEgdHJhY2sgdG8gYmUgY3JlYXRlZApAQCAtODEzLDcgKzc5Myw3IEBACiAKIEV4aXQ6CiAgICAgaWYgKGxTdGF0dXMgIT0gTk9fRVJST1IgJiYgb3V0cHV0Lm91dHB1dElkICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlT3V0cHV0KG91dHB1dC5vdXRwdXRJZCwgc3RyZWFtVHlwZSwgc2Vzc2lvbklkKTsKKyAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VPdXRwdXQocG9ydElkKTsKICAgICB9CiAgICAgKnN0YXR1cyA9IGxTdGF0dXM7CiAgICAgcmV0dXJuIHRyYWNrSGFuZGxlOwpAQCAtMTA3OCw5ICsxMDU4LDkgQEAKICAgICAgICAgQUxPR1coImNoZWNrU3RyZWFtVHlwZSgpIGludmFsaWQgc3RyZWFtICVkIiwgc3RyZWFtKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9Ci0gICAgcGlkX3QgY2FsbGVyID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOwotICAgIGlmICh1aW50MzJfdChzdHJlYW0pID49IEFVRElPX1NUUkVBTV9QVUJMSUNfQ05UICYmIGNhbGxlciAhPSBnZXRwaWRfY2FjaGVkKSB7Ci0gICAgICAgIEFMT0dXKCJjaGVja1N0cmVhbVR5cGUoKSBwaWQgJWQgY2Fubm90IHVzZSBpbnRlcm5hbCBzdHJlYW0gdHlwZSAlZCIsIGNhbGxlciwgc3RyZWFtKTsKKyAgICBjb25zdCB1aWRfdCBjYWxsZXJVaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCk7CisgICAgaWYgKHVpbnQzMl90KHN0cmVhbSkgPj0gQVVESU9fU1RSRUFNX1BVQkxJQ19DTlQgJiYgIWlzQXVkaW9TZXJ2ZXJVaWQoY2FsbGVyVWlkKSkgeworICAgICAgICBBTE9HVygiY2hlY2tTdHJlYW1UeXBlKCkgdWlkICVkIGNhbm5vdCB1c2UgaW50ZXJuYWwgc3RyZWFtIHR5cGUgJWQiLCBjYWxsZXJVaWQsIHN0cmVhbSk7CiAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKICAgICB9CiAKQEAgLTExODAsNiArMTE2MCwyMyBAQAogICAgIH0KIH0KIAorLy8gZm9yd2FyZEF1ZGlvSHdTeW5jVG9Eb3duc3RyZWFtUGF0Y2hlc19sKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBBdWRpb0ZsaW5nZXI6Om1Mb2NrIGhlbGQKK3ZvaWQgQXVkaW9GbGluZ2VyOjpmb3J3YXJkUGFyYW1ldGVyc1RvRG93bnN0cmVhbVBhdGNoZXNfbCgKKyAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgdXBTdHJlYW0sIGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMsCisgICAgICAgIHN0ZDo6ZnVuY3Rpb248Ym9vbChjb25zdCBzcDxQbGF5YmFja1RocmVhZD4mKT4gdXNlVGhyZWFkKQoreworICAgIHN0ZDo6dmVjdG9yPFBhdGNoUGFuZWw6OlNvZnR3YXJlUGF0Y2g+IHN3UGF0Y2hlczsKKyAgICBpZiAobVBhdGNoUGFuZWwuZ2V0RG93bnN0cmVhbVNvZnR3YXJlUGF0Y2hlcyh1cFN0cmVhbSwgJnN3UGF0Y2hlcykgIT0gT0spIHJldHVybjsKKyAgICBBTE9HVl9JRighc3dQYXRjaGVzLmVtcHR5KCksICIlcyBmb3VuZCAlenUgZG93bnN0cmVhbSBwYXRjaGVzIGZvciBzdHJlYW0gSUQgJWQiLAorICAgICAgICAgICAgX19mdW5jX18sIHN3UGF0Y2hlcy5zaXplKCksIHVwU3RyZWFtKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIHN3UGF0Y2ggOiBzd1BhdGNoZXMpIHsKKyAgICAgICAgc3A8UGxheWJhY2tUaHJlYWQ+IGRvd25TdHJlYW0gPSBjaGVja1BsYXliYWNrVGhyZWFkX2woc3dQYXRjaC5nZXRQbGF5YmFja1RocmVhZEhhbmRsZSgpKTsKKyAgICAgICAgaWYgKGRvd25TdHJlYW0gIT0gTlVMTCAmJiAodXNlVGhyZWFkID09IG51bGxwdHIgfHwgdXNlVGhyZWFkKGRvd25TdHJlYW0pKSkgeworICAgICAgICAgICAgZG93blN0cmVhbS0+c2V0UGFyYW1ldGVycyhrZXlWYWx1ZVBhaXJzKTsKKyAgICAgICAgfQorICAgIH0KK30KKwogLy8gRmlsdGVyIHJlc2VydmVkIGtleXMgZnJvbSBzZXRQYXJhbWV0ZXJzKCkgYmVmb3JlIGZvcndhcmRpbmcgdG8gYXVkaW8gSEFMIG9yIGFjdGluZyB1cG9uLgogLy8gU29tZSBrZXlzIGFyZSB1c2VkIGZvciBhdWRpbyByb3V0aW5nIGFuZCBhdWRpbyBwYXRoIGNvbmZpZ3VyYXRpb24gYW5kIHNob3VsZCBiZSByZXNlcnZlZCBmb3IgdXNlCiAvLyBieSBhdWRpbyBwb2xpY3kgYW5kIGF1ZGlvIGZsaW5nZXIgZm9yIGZ1bmN0aW9uYWwsIHByaXZhY3kgYW5kIHNlY3VyaXR5IHJlYXNvbnMuCkBAIC0xMjAwLDIzICsxMTk3LDM5IEBACiAgICAgICAgIFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVN0cmVhbVN1cHBvcnRlZFNhbXBsaW5nUmF0ZXMpLAogICAgIH07CiAKLSAgICAvLyBtdWx0aXVzZXIgZnJpZW5kbHkgYXBwIElEIGNoZWNrIGZvciByZXF1ZXN0cyBjb21pbmcgZnJvbSBhdWRpb3NlcnZlcgotICAgIGlmIChtdWx0aXVzZXJfZ2V0X2FwcF9pZChjYWxsaW5nVWlkKSA9PSBBSURfQVVESU9TRVJWRVIpIHsKLSAgICAgICAgcmV0dXJuOworICAgIGlmIChpc0F1ZGlvU2VydmVyVWlkKGNhbGxpbmdVaWQpKSB7CisgICAgICAgIHJldHVybjsgLy8gbm8gbmVlZCB0byBmaWx0ZXIgaWYgYXVkaW9zZXJ2ZXIuCiAgICAgfQogCiAgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW0gPSBBdWRpb1BhcmFtZXRlcihrZXlWYWx1ZVBhaXJzKTsKICAgICBTdHJpbmc4IHZhbHVlOworICAgIEF1ZGlvUGFyYW1ldGVyIHJlamVjdGVkUGFyYW07CiAgICAgZm9yIChhdXRvJiBrZXkgOiBrUmVzZXJ2ZWRQYXJhbWV0ZXJzKSB7CiAgICAgICAgIGlmIChwYXJhbS5nZXQoa2V5LCB2YWx1ZSkgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIEFMT0dXKCIlczogZmlsdGVyaW5nIGtleSAlcyB2YWx1ZSAlcyBmcm9tIHVpZCAlZCIsCi0gICAgICAgICAgICAgICAgICBfX2Z1bmNfXywga2V5LnN0cmluZygpLCB2YWx1ZS5zdHJpbmcoKSwgY2FsbGluZ1VpZCk7CisgICAgICAgICAgICByZWplY3RlZFBhcmFtLmFkZChrZXksIHZhbHVlKTsKICAgICAgICAgICAgIHBhcmFtLnJlbW92ZShrZXkpOwogICAgICAgICB9CiAgICAgfQorICAgIGxvZ0ZpbHRlcmVkUGFyYW1ldGVycyhwYXJhbS5zaXplKCkgKyByZWplY3RlZFBhcmFtLnNpemUoKSwga2V5VmFsdWVQYWlycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0ZWRQYXJhbS5zaXplKCksIHJlamVjdGVkUGFyYW0udG9TdHJpbmcoKSwgY2FsbGluZ1VpZCk7CiAgICAga2V5VmFsdWVQYWlycyA9IHBhcmFtLnRvU3RyaW5nKCk7CiB9CiAKK3ZvaWQgQXVkaW9GbGluZ2VyOjpsb2dGaWx0ZXJlZFBhcmFtZXRlcnMoc2l6ZV90IG9yaWdpbmFsS1ZQU2l6ZSwgY29uc3QgU3RyaW5nOCYgb3JpZ2luYWxLVlBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgcmVqZWN0ZWRLVlBTaXplLCBjb25zdCBTdHJpbmc4JiByZWplY3RlZEtWUHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IGNhbGxpbmdVaWQpIHsKKyAgICBhdXRvIHByZWZpeCA9IFN0cmluZzg6OmZvcm1hdCgiVUlEICU1ZCIsIGNhbGxpbmdVaWQpOworICAgIGF1dG8gc3VmZml4ID0gU3RyaW5nODo6Zm9ybWF0KCIlenUgS1ZQIHJlY2VpdmVkOiAlcyIsIG9yaWdpbmFsS1ZQU2l6ZSwgb3JpZ2luYWxLVlBzLmNfc3RyKCkpOworICAgIGlmIChyZWplY3RlZEtWUFNpemUgIT0gMCkgeworICAgICAgICBhdXRvIGVycm9yID0gU3RyaW5nODo6Zm9ybWF0KCIlenUgS1ZQIHJlamVjdGVkOiAlcyIsIHJlamVjdGVkS1ZQU2l6ZSwgcmVqZWN0ZWRLVlBzLmNfc3RyKCkpOworICAgICAgICBBTE9HVygiJXM6ICVzLCAlcywgJXMiLCBfX2Z1bmNfXywgcHJlZml4LmNfc3RyKCksIGVycm9yLmNfc3RyKCksIHN1ZmZpeC5jX3N0cigpKTsKKyAgICAgICAgbVJlamVjdGVkU2V0UGFyYW1ldGVyTG9nLmxvZygiJXMsICVzLCAlcyIsIHByZWZpeC5jX3N0cigpLCBlcnJvci5jX3N0cigpLCBzdWZmaXguY19zdHIoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXV0byYgbG9nZ2VyID0gKGlzU2VydmljZVVpZChjYWxsaW5nVWlkKSA/IG1TeXN0ZW1TZXRQYXJhbWV0ZXJMb2cgOiBtQXBwU2V0UGFyYW1ldGVyTG9nKTsKKyAgICAgICAgbG9nZ2VyLmxvZygiJXMsICVzIiwgcHJlZml4LmNfc3RyKCksIHN1ZmZpeC5jX3N0cigpKTsKKyAgICB9Cit9CisKIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6c2V0UGFyYW1ldGVycyhhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwgY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlycykKIHsKICAgICBBTE9HVigic2V0UGFyYW1ldGVycygpOiBpbyAlZCwga2V5dmFsdWUgJXMsIGNhbGxpbmcgcGlkICVkIGNhbGxpbmcgdWlkICVkIiwKQEAgLTEyOTYsNyArMTMwOSw5IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKHRocmVhZCAhPSAwKSB7Ci0gICAgICAgIHJldHVybiB0aHJlYWQtPnNldFBhcmFtZXRlcnMoZmlsdGVyZWRLZXlWYWx1ZVBhaXJzKTsKKyAgICAgICAgc3RhdHVzX3QgcmVzdWx0ID0gdGhyZWFkLT5zZXRQYXJhbWV0ZXJzKGZpbHRlcmVkS2V5VmFsdWVQYWlycyk7CisgICAgICAgIGZvcndhcmRQYXJhbWV0ZXJzVG9Eb3duc3RyZWFtUGF0Y2hlc19sKHRocmVhZC0+aWQoKSwgZmlsdGVyZWRLZXlWYWx1ZVBhaXJzKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CiAgICAgcmV0dXJuIEJBRF9WQUxVRTsKIH0KQEAgLTE2MzYsNyArMTY1MSw3IEBACiAgICAgYm9vbCB1cGRhdGVQaWQgPSAoaW5wdXQuY2xpZW50SW5mby5jbGllbnRQaWQgPT0gLTEpOwogICAgIGNvbnN0IHVpZF90IGNhbGxpbmdVaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCk7CiAgICAgdWlkX3QgY2xpZW50VWlkID0gaW5wdXQuY2xpZW50SW5mby5jbGllbnRVaWQ7Ci0gICAgaWYgKCFpc1RydXN0ZWRDYWxsaW5nVWlkKGNhbGxpbmdVaWQpKSB7CisgICAgaWYgKCFpc0F1ZGlvU2VydmVyT3JNZWRpYVNlcnZlclVpZChjYWxsaW5nVWlkKSkgewogICAgICAgICBBTE9HV19JRihjbGllbnRVaWQgIT0gY2FsbGluZ1VpZCwKICAgICAgICAgICAgICAgICAiJXMgdWlkICVkIHRyaWVkIHRvIHBhc3MgaXRzZWxmIG9mZiBhcyAlZCIsCiAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBjYWxsaW5nVWlkLCBjbGllbnRVaWQpOwpAQCAtMTc1MSw2ICsxNzY2LDcgQEAKIAogICAgIG91dHB1dC5jYmxrID0gcmVjb3JkVHJhY2stPmdldENibGsoKTsKICAgICBvdXRwdXQuYnVmZmVycyA9IHJlY29yZFRyYWNrLT5nZXRCdWZmZXJzKCk7CisgICAgb3V0cHV0LnRyYWNrSWQgPSByZWNvcmRUcmFjay0+aWQoKTsKIAogICAgIC8vIHJldHVybiBoYW5kbGUgdG8gY2xpZW50CiAgICAgcmVjb3JkSGFuZGxlID0gbmV3IFJlY29yZEhhbmRsZShyZWNvcmRUcmFjayk7CkBAIC0xODU0LDYgKzE4NzAsMTAgQEAKIAogICAgICAgICBtSGFyZHdhcmVTdGF0dXMgPSBBVURJT19IV19JRExFOwogICAgIH0KKyAgICBpZiAoc3RyY21wKG5hbWUsIEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9NU0QpID09IDApIHsKKyAgICAgICAgLy8gQW4gTVNEIG1vZHVsZSBpcyBpbnNlcnRlZCBiZWZvcmUgaGFyZHdhcmUgbW9kdWxlcyBpbiBvcmRlciB0byBtaXggZW5jb2RlZCBzdHJlYW1zLgorICAgICAgICBmbGFncyA9IHN0YXRpY19jYXN0PEF1ZGlvSHdEZXZpY2U6OkZsYWdzPihmbGFncyB8IEF1ZGlvSHdEZXZpY2U6OkFIV0RfSVNfSU5TRVJUKTsKKyAgICB9CiAKICAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3QgaGFuZGxlID0gKGF1ZGlvX21vZHVsZV9oYW5kbGVfdCkgbmV4dFVuaXF1ZUlkKEFVRElPX1VOSVFVRV9JRF9VU0VfTU9EVUxFKTsKICAgICBtQXVkaW9Id0RldnMuYWRkKGhhbmRsZSwgbmV3IEF1ZGlvSHdEZXZpY2UoaGFuZGxlLCBuYW1lLCBkZXYsIGZsYWdzKSk7CkBAIC0xODg1LDcgKzE5MDUsNyBAQAogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpzZXRMb3dSYW1EZXZpY2UoYm9vbCBpc0xvd1JhbURldmljZSwgaW50NjRfdCB0b3RhbE1lbW9yeSkKIHsKICAgICB1aWRfdCB1aWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCk7Ci0gICAgaWYgKHVpZCAhPSBBSURfU1lTVEVNKSB7CisgICAgaWYgKCFpc0F1ZGlvU2VydmVyT3JTeXN0ZW1TZXJ2ZXJVaWQodWlkKSkgewogICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgfQogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CkBAIC0xOTMwLDYgKzE5NTAsMjggQEAKICAgICByZXR1cm4gbUNsaWVudFNoYXJlZEhlYXBTaXplOwogfQogCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OnNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZykKK3sKKyAgICBBTE9HVihfX2Z1bmNfXyk7CisKKyAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlOworICAgIGlmIChjb25maWctPnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSkgeworICAgICAgICBtb2R1bGUgPSBjb25maWctPmV4dC5kZXZpY2UuaHdfbW9kdWxlOworICAgIH0gZWxzZSB7CisgICAgICAgIG1vZHVsZSA9IGNvbmZpZy0+ZXh0Lm1peC5od19tb2R1bGU7CisgICAgfQorCisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBzc2l6ZV90IGluZGV4ID0gbUF1ZGlvSHdEZXZzLmluZGV4T2ZLZXkobW9kdWxlKTsKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIEFMT0dXKCIlcygpIGJhZCBodyBtb2R1bGUgJWQiLCBfX2Z1bmNfXywgbW9kdWxlKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBBdWRpb0h3RGV2aWNlICphdWRpb0h3RGV2aWNlID0gbUF1ZGlvSHdEZXZzLnZhbHVlQXQoaW5kZXgpOworICAgIHJldHVybiBhdWRpb0h3RGV2aWNlLT5od0RldmljZSgpLT5zZXRBdWRpb1BvcnRDb25maWcoY29uZmlnKTsKK30KKwogYXVkaW9faHdfc3luY190IEF1ZGlvRmxpbmdlcjo6Z2V0QXVkaW9Id1N5bmNGb3JTZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQpCiB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKQEAgLTE5NzUsNyArMjAxNywxMCBAQAogICAgICAgICBpZiAoc2Vzc2lvbnMgJiBUaHJlYWRCYXNlOjpUUkFDS19TRVNTSU9OKSB7CiAgICAgICAgICAgICBBdWRpb1BhcmFtZXRlciBwYXJhbSA9IEF1ZGlvUGFyYW1ldGVyKCk7CiAgICAgICAgICAgICBwYXJhbS5hZGRJbnQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5U3RyZWFtSHdBdlN5bmMpLCB2YWx1ZSk7Ci0gICAgICAgICAgICB0aHJlYWQtPnNldFBhcmFtZXRlcnMocGFyYW0udG9TdHJpbmcoKSk7CisgICAgICAgICAgICBTdHJpbmc4IGtleVZhbHVlUGFpcnMgPSBwYXJhbS50b1N0cmluZygpOworICAgICAgICAgICAgdGhyZWFkLT5zZXRQYXJhbWV0ZXJzKGtleVZhbHVlUGFpcnMpOworICAgICAgICAgICAgZm9yd2FyZFBhcmFtZXRlcnNUb0Rvd25zdHJlYW1QYXRjaGVzX2wodGhyZWFkLT5pZCgpLCBrZXlWYWx1ZVBhaXJzLAorICAgICAgICAgICAgICAgICAgICBbXShjb25zdCBzcDxQbGF5YmFja1RocmVhZD4mIHRocmVhZCkgeyByZXR1cm4gdGhyZWFkLT51c2VzSHdBdlN5bmMoKTsgfSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KQEAgLTIwMjEsNyArMjA2NiwxMCBAQAogICAgICAgICBBTE9HVigic2V0QXVkaW9Id1N5bmNGb3JTZXNzaW9uX2wgZm91bmQgSUQgJWQgZm9yIHNlc3Npb24gJWQiLCBzeW5jSWQsIHNlc3Npb25JZCk7CiAgICAgICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtID0gQXVkaW9QYXJhbWV0ZXIoKTsKICAgICAgICAgcGFyYW0uYWRkSW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVN0cmVhbUh3QXZTeW5jKSwgc3luY0lkKTsKLSAgICAgICAgdGhyZWFkLT5zZXRQYXJhbWV0ZXJzKHBhcmFtLnRvU3RyaW5nKCkpOworICAgICAgICBTdHJpbmc4IGtleVZhbHVlUGFpcnMgPSBwYXJhbS50b1N0cmluZygpOworICAgICAgICB0aHJlYWQtPnNldFBhcmFtZXRlcnMoa2V5VmFsdWVQYWlycyk7CisgICAgICAgIGZvcndhcmRQYXJhbWV0ZXJzVG9Eb3duc3RyZWFtUGF0Y2hlc19sKHRocmVhZC0+aWQoKSwga2V5VmFsdWVQYWlycywKKyAgICAgICAgICAgICAgICBbXShjb25zdCBzcDxQbGF5YmFja1RocmVhZD4mIHRocmVhZCkgeyByZXR1cm4gdGhyZWFkLT51c2VzSHdBdlN5bmMoKTsgfSk7CiAgICAgfQogfQogCkBAIC0yMTExLDYgKzIxNTksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICpvdXRwdXQsIHRocmVhZC5nZXQoKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtUGxheWJhY2tUaHJlYWRzLmFkZCgqb3V0cHV0LCB0aHJlYWQpOworICAgICAgICAgICAgbVBhdGNoUGFuZWwubm90aWZ5U3RyZWFtT3BlbmVkKG91dEh3RGV2LCAqb3V0cHV0KTsKICAgICAgICAgICAgIHJldHVybiB0aHJlYWQ7CiAgICAgICAgIH0KICAgICB9CkBAIC0yMjA5LDYgKzIyNTgsOCBAQAogICAgICAgICBpZiAocGxheWJhY2tUaHJlYWQgIT0gTlVMTCkgewogICAgICAgICAgICAgQUxPR1YoImNsb3NlT3V0cHV0KCkgJWQiLCBvdXRwdXQpOwogCisgICAgICAgICAgICBkdW1wVG9UaHJlYWRMb2dfbChwbGF5YmFja1RocmVhZCk7CisKICAgICAgICAgICAgIGlmIChwbGF5YmFja1RocmVhZC0+dHlwZSgpID09IFRocmVhZEJhc2U6Ok1JWEVSKSB7CiAgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUGxheWJhY2tUaHJlYWRzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChtUGxheWJhY2tUaHJlYWRzLnZhbHVlQXQoaSktPmlzRHVwbGljYXRpbmcoKSkgewpAQCAtMjI0MCwxMiArMjI5MSwxNCBAQAogICAgICAgICAgICAgaWYgKG1tYXBUaHJlYWQgPT0gMCkgewogICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBkdW1wVG9UaHJlYWRMb2dfbChtbWFwVGhyZWFkKTsKICAgICAgICAgICAgIG1NbWFwVGhyZWFkcy5yZW1vdmVJdGVtKG91dHB1dCk7CiAgICAgICAgICAgICBBTE9HRCgiY2xvc2luZyBtbWFwVGhyZWFkICVwIiwgbW1hcFRocmVhZC5nZXQoKSk7CiAgICAgICAgIH0KICAgICAgICAgY29uc3Qgc3A8QXVkaW9Jb0Rlc2NyaXB0b3I+IGlvRGVzYyA9IG5ldyBBdWRpb0lvRGVzY3JpcHRvcigpOwogICAgICAgICBpb0Rlc2MtPm1Jb0hhbmRsZSA9IG91dHB1dDsKICAgICAgICAgaW9Db25maWdDaGFuZ2VkKEFVRElPX09VVFBVVF9DTE9TRUQsIGlvRGVzYyk7CisgICAgICAgIG1QYXRjaFBhbmVsLm5vdGlmeVN0cmVhbUNsb3NlZChvdXRwdXQpOwogICAgIH0KICAgICAvLyBUaGUgdGhyZWFkIGVudGl0eSAoYWN0aXZlIHVuaXQgb2YgZXhlY3V0aW9uKSBpcyBubyBsb25nZXIgcnVubmluZyBoZXJlLAogICAgIC8vIGJ1dCB0aGUgVGhyZWFkQmFzZSBjb250YWluZXIgc3RpbGwgZXhpc3RzLgpAQCAtMjI3NCw3ICsyMzI3LDcgQEAKICAgICBkZWxldGUgb3V0OwogfQogCi12b2lkIEF1ZGlvRmxpbmdlcjo6Y2xvc2VPdXRwdXRJbnRlcm5hbF9sKGNvbnN0IHNwPFBsYXliYWNrVGhyZWFkPiYgdGhyZWFkKQordm9pZCBBdWRpb0ZsaW5nZXI6OmNsb3NlVGhyZWFkSW50ZXJuYWxfbChjb25zdCBzcDxQbGF5YmFja1RocmVhZD4mIHRocmVhZCkKIHsKICAgICBtUGxheWJhY2tUaHJlYWRzLnJlbW92ZUl0ZW0odGhyZWFkLT5tSWQpOwogICAgIHRocmVhZC0+ZXhpdCgpOwpAQCAtMjM1MCw2ICsyNDAzLDkgQEAKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogCisgICAgLy8gU29tZSBmbGFncyBhcmUgc3BlY2lmaWMgdG8gZnJhbWV3b3JrIGFuZCBtdXN0IG5vdCBsZWFrIHRvIHRoZSBIQUwuCisgICAgZmxhZ3MgPSBzdGF0aWNfY2FzdDxhdWRpb19pbnB1dF9mbGFnc190PihmbGFncyAmIH5BVURJT19JTlBVVF9GUkFNRVdPUktfRkxBR1MpOworCiAgICAgLy8gQXVkaW8gUG9saWN5IGNhbiByZXF1ZXN0IGEgc3BlY2lmaWMgaGFuZGxlIGZvciBoYXJkd2FyZSBob3R3b3JkLgogICAgIC8vIFRoZSBnb2FsIGhlcmUgaXMgbm90IHRvIHJlLW9wZW4gYW4gYWxyZWFkeSBvcGVuZWQgaW5wdXQuCiAgICAgLy8gSXQgaXMgdG8gdXNlIGEgcHJlLWFzc2lnbmVkIEkvTyBoYW5kbGUuCkBAIC0yNDA3LDU1ICsyNDYzLDYgQEAKICAgICAgICAgICAgICAgICAgICAgdGhyZWFkLmdldCgpKTsKICAgICAgICAgICAgIHJldHVybiB0aHJlYWQ7CiAgICAgICAgIH0gZWxzZSB7Ci0jaWZkZWYgVEVFX1NJTksKLSAgICAgICAgICAgIC8vIFRyeSB0byByZS11c2UgbW9zdCByZWNlbnRseSB1c2VkIFBpcGUgdG8gYXJjaGl2ZSBhIGNvcHkgb2YgaW5wdXQgZm9yIGR1bXBzeXMsCi0gICAgICAgICAgICAvLyBvciAocmUtKWNyZWF0ZSBpZiBjdXJyZW50IFBpcGUgaXMgaWRsZSBhbmQgZG9lcyBub3QgbWF0Y2ggdGhlIG5ldyBmb3JtYXQKLSAgICAgICAgICAgIHNwPE5CQUlPX1Npbms+IHRlZVNpbms7Ci0gICAgICAgICAgICBlbnVtIHsKLSAgICAgICAgICAgICAgICBURUVfU0lOS19OTywgICAgLy8gZG9uJ3QgY29weSBpbnB1dAotICAgICAgICAgICAgICAgIFRFRV9TSU5LX05FVywgICAvLyBjb3B5IGlucHV0IHVzaW5nIGEgbmV3IHBpcGUKLSAgICAgICAgICAgICAgICBURUVfU0lOS19PTEQsICAgLy8gY29weSBpbnB1dCB1c2luZyBhbiBleGlzdGluZyBwaXBlCi0gICAgICAgICAgICB9IGtpbmQ7Ci0gICAgICAgICAgICBOQkFJT19Gb3JtYXQgZm9ybWF0ID0gRm9ybWF0X2Zyb21fU1JfQyhoYWxjb25maWcuc2FtcGxlX3JhdGUsCi0gICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9pbl9tYXNrKGhhbGNvbmZpZy5jaGFubmVsX21hc2spLCBoYWxjb25maWcuZm9ybWF0KTsKLSAgICAgICAgICAgIGlmICghbVRlZVNpbmtJbnB1dEVuYWJsZWQpIHsKLSAgICAgICAgICAgICAgICBraW5kID0gVEVFX1NJTktfTk87Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCFGb3JtYXRfaXNWYWxpZChmb3JtYXQpKSB7Ci0gICAgICAgICAgICAgICAga2luZCA9IFRFRV9TSU5LX05POwotICAgICAgICAgICAgfSBlbHNlIGlmIChtUmVjb3JkVGVlU2luayA9PSAwKSB7Ci0gICAgICAgICAgICAgICAga2luZCA9IFRFRV9TSU5LX05FVzsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobVJlY29yZFRlZVNpbmstPmdldFN0cm9uZ0NvdW50KCkgIT0gMSkgewotICAgICAgICAgICAgICAgIGtpbmQgPSBURUVfU0lOS19OTzsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoRm9ybWF0X2lzRXF1YWwoZm9ybWF0LCBtUmVjb3JkVGVlU2luay0+Zm9ybWF0KCkpKSB7Ci0gICAgICAgICAgICAgICAga2luZCA9IFRFRV9TSU5LX09MRDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAga2luZCA9IFRFRV9TSU5LX05FVzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN3aXRjaCAoa2luZCkgewotICAgICAgICAgICAgY2FzZSBURUVfU0lOS19ORVc6IHsKLSAgICAgICAgICAgICAgICBQaXBlICpwaXBlID0gbmV3IFBpcGUobVRlZVNpbmtJbnB1dEZyYW1lcywgZm9ybWF0KTsKLSAgICAgICAgICAgICAgICBzaXplX3QgbnVtQ291bnRlck9mZmVycyA9IDA7Ci0gICAgICAgICAgICAgICAgY29uc3QgTkJBSU9fRm9ybWF0IG9mZmVyc1sxXSA9IHtmb3JtYXR9OwotICAgICAgICAgICAgICAgIHNzaXplX3QgaW5kZXggPSBwaXBlLT5uZWdvdGlhdGUob2ZmZXJzLCAxLCBOVUxMLCBudW1Db3VudGVyT2ZmZXJzKTsKLSAgICAgICAgICAgICAgICBBTE9HX0FTU0VSVChpbmRleCA9PSAwKTsKLSAgICAgICAgICAgICAgICBQaXBlUmVhZGVyICpwaXBlUmVhZGVyID0gbmV3IFBpcGVSZWFkZXIoKnBpcGUpOwotICAgICAgICAgICAgICAgIG51bUNvdW50ZXJPZmZlcnMgPSAwOwotICAgICAgICAgICAgICAgIGluZGV4ID0gcGlwZVJlYWRlci0+bmVnb3RpYXRlKG9mZmVycywgMSwgTlVMTCwgbnVtQ291bnRlck9mZmVycyk7Ci0gICAgICAgICAgICAgICAgQUxPR19BU1NFUlQoaW5kZXggPT0gMCk7Ci0gICAgICAgICAgICAgICAgbVJlY29yZFRlZVNpbmsgPSBwaXBlOwotICAgICAgICAgICAgICAgIG1SZWNvcmRUZWVTb3VyY2UgPSBwaXBlUmVhZGVyOwotICAgICAgICAgICAgICAgIHRlZVNpbmsgPSBwaXBlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgVEVFX1NJTktfT0xEOgotICAgICAgICAgICAgICAgIHRlZVNpbmsgPSBtUmVjb3JkVGVlU2luazsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgVEVFX1NJTktfTk86Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotI2VuZGlmCi0KICAgICAgICAgICAgIC8vIFN0YXJ0IHJlY29yZCB0aHJlYWQKICAgICAgICAgICAgIC8vIFJlY29yZFRocmVhZCByZXF1aXJlcyBib3RoIGlucHV0IGFuZCBvdXRwdXQgZGV2aWNlIGluZGljYXRpb24gdG8gZm9yd2FyZCB0byBhdWRpbwogICAgICAgICAgICAgLy8gcHJlIHByb2Nlc3NpbmcgbW9kdWxlcwpAQCAtMjQ2NSw5ICsyNDcyLDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbWFyeU91dHB1dERldmljZV9sKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TeXN0ZW1SZWFkeQotI2lmZGVmIFRFRV9TSU5LCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgdGVlU2luawotI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICBtUmVjb3JkVGhyZWFkcy5hZGQoKmlucHV0LCB0aHJlYWQpOwogICAgICAgICAgICAgQUxPR1YoIm9wZW5JbnB1dF9sKCkgY3JlYXRlZCByZWNvcmQgdGhyZWFkOiBJRCAlZCB0aHJlYWQgJXAiLCAqaW5wdXQsIHRocmVhZC5nZXQoKSk7CkBAIC0yNDk2LDYgKzI1MDAsOCBAQAogICAgICAgICBpZiAocmVjb3JkVGhyZWFkICE9IDApIHsKICAgICAgICAgICAgIEFMT0dWKCJjbG9zZUlucHV0KCkgJWQiLCBpbnB1dCk7CiAKKyAgICAgICAgICAgIGR1bXBUb1RocmVhZExvZ19sKHJlY29yZFRocmVhZCk7CisKICAgICAgICAgICAgIC8vIElmIHdlIHN0aWxsIGhhdmUgZWZmZWN0IGNoYWlucywgaXQgbWVhbnMgdGhhdCBhIGNsaWVudCBzdGlsbCBob2xkcyBhIGhhbmRsZQogICAgICAgICAgICAgLy8gb24gYXQgbGVhc3Qgb25lIGVmZmVjdC4gV2UgbXVzdCBlaXRoZXIgbW92ZSB0aGUgY2hhaW4gdG8gYW4gZXhpc3RpbmcgdGhyZWFkIHdpdGggdGhlCiAgICAgICAgICAgICAvLyBzYW1lIHNlc3Npb24gSUQgb3IgcHV0IGl0IGFzaWRlIGluIGNhc2UgYSBuZXcgcmVjb3JkIHRocmVhZCBpcyBvcGVuZWQgZm9yIGEKQEAgLTI1MzgsNiArMjU0NCw3IEBACiAgICAgICAgICAgICBpZiAobW1hcFRocmVhZCA9PSAwKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGR1bXBUb1RocmVhZExvZ19sKG1tYXBUaHJlYWQpOwogICAgICAgICAgICAgbU1tYXBUaHJlYWRzLnJlbW92ZUl0ZW0oaW5wdXQpOwogICAgICAgICB9CiAgICAgICAgIGNvbnN0IHNwPEF1ZGlvSW9EZXNjcmlwdG9yPiBpb0Rlc2MgPSBuZXcgQXVkaW9Jb0Rlc2NyaXB0b3IoKTsKQEAgLTI1NjcsNyArMjU3NCw3IEBACiAgICAgZGVsZXRlIGluOwogfQogCi12b2lkIEF1ZGlvRmxpbmdlcjo6Y2xvc2VJbnB1dEludGVybmFsX2woY29uc3Qgc3A8UmVjb3JkVGhyZWFkPiYgdGhyZWFkKQordm9pZCBBdWRpb0ZsaW5nZXI6OmNsb3NlVGhyZWFkSW50ZXJuYWxfbChjb25zdCBzcDxSZWNvcmRUaHJlYWQ+JiB0aHJlYWQpCiB7CiAgICAgbVJlY29yZFRocmVhZHMucmVtb3ZlSXRlbSh0aHJlYWQtPm1JZCk7CiAgICAgY2xvc2VJbnB1dEZpbmlzaCh0aHJlYWQpOwpAQCAtMjYwNSw3ICsyNjEyLDggQEAKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIHBpZF90IGNhbGxlciA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKTsKICAgICBBTE9HVigiYWNxdWlyaW5nICVkIGZyb20gJWQsIGZvciAlZCIsIGF1ZGlvU2Vzc2lvbiwgY2FsbGVyLCBwaWQpOwotICAgIGlmIChwaWQgIT0gLTEgJiYgKGNhbGxlciA9PSBnZXRwaWRfY2FjaGVkKSkgeworICAgIGNvbnN0IHVpZF90IGNhbGxlclVpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKTsKKyAgICBpZiAocGlkICE9IC0xICYmIGlzQXVkaW9TZXJ2ZXJVaWQoY2FsbGVyVWlkKSkgeyAvLyBjaGVjayBtdXN0IG1hdGNoIHJlbGVhc2VBdWRpb1Nlc3Npb25JZCgpCiAgICAgICAgIGNhbGxlciA9IHBpZDsKICAgICB9CiAKQEAgLTI2MzksNyArMjY0Nyw4IEBACiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBwaWRfdCBjYWxsZXIgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7CiAgICAgQUxPR1YoInJlbGVhc2luZyAlZCBmcm9tICVkIGZvciAlZCIsIGF1ZGlvU2Vzc2lvbiwgY2FsbGVyLCBwaWQpOwotICAgIGlmIChwaWQgIT0gLTEgJiYgKGNhbGxlciA9PSBnZXRwaWRfY2FjaGVkKSkgeworICAgIGNvbnN0IHVpZF90IGNhbGxlclVpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKTsKKyAgICBpZiAocGlkICE9IC0xICYmIGlzQXVkaW9TZXJ2ZXJVaWQoY2FsbGVyVWlkKSkgeyAvLyBjaGVjayBtdXN0IG1hdGNoIGFjcXVpcmVBdWRpb1Nlc3Npb25JZCgpCiAgICAgICAgIGNhbGxlciA9IHBpZDsKICAgICB9CiAgICAgc2l6ZV90IG51bSA9IG1BdWRpb1Nlc3Npb25SZWZzLnNpemUoKTsKQEAgLTI2NTYsOSArMjY2NSwxMCBAQAogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgfQotICAgIC8vIElmIHRoZSBjYWxsZXIgaXMgbWVkaWFzZXJ2ZXIgaXQgaXMgbGlrZWx5IHRoYXQgdGhlIHNlc3Npb24gYmVpbmcgcmVsZWFzZWQgd2FzIGFjcXVpcmVkCisgICAgLy8gSWYgdGhlIGNhbGxlciBpcyBhdWRpb3NlcnZlciBpdCBpcyBsaWtlbHkgdGhhdCB0aGUgc2Vzc2lvbiBiZWluZyByZWxlYXNlZCB3YXMgYWNxdWlyZWQKICAgICAvLyBvbiBiZWhhbGYgb2YgYSBwcm9jZXNzIG5vdCBpbiBub3RpZmljYXRpb24gY2xpZW50cyBhbmQgd2UgaWdub3JlIHRoZSB3YXJuaW5nLgotICAgIEFMT0dXX0lGKGNhbGxlciAhPSBnZXRwaWRfY2FjaGVkLCAic2Vzc2lvbiBpZCAlZCBub3QgZm91bmQgZm9yIHBpZCAlZCIsIGF1ZGlvU2Vzc2lvbiwgY2FsbGVyKTsKKyAgICBBTE9HV19JRighaXNBdWRpb1NlcnZlclVpZChjYWxsZXJVaWQpLAorICAgICAgICAgICAgInNlc3Npb24gaWQgJWQgbm90IGZvdW5kIGZvciBwaWQgJWQiLCBhdWRpb1Nlc3Npb24sIGNhbGxlcik7CiB9CiAKIGJvb2wgQXVkaW9GbGluZ2VyOjppc1Nlc3Npb25BY3F1aXJlZF9sKGF1ZGlvX3Nlc3Npb25fdCBhdWRpb1Nlc3Npb24pCkBAIC0yNzMzLDYgKzI3NDMsMTcgQEAKICAgICByZXR1cm47CiB9CiAKKy8vIGR1bXBUb1RocmVhZExvZ19sKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBBdWRpb0ZsaW5nZXI6Om1Mb2NrIGhlbGQKK3ZvaWQgQXVkaW9GbGluZ2VyOjpkdW1wVG9UaHJlYWRMb2dfbChjb25zdCBzcDxUaHJlYWRCYXNlPiAmdGhyZWFkKQoreworICAgIGF1ZGlvX3V0aWxzOjpGZFRvU3RyaW5nIGZkVG9TdHJpbmc7CisgICAgY29uc3QgaW50IGZkID0gZmRUb1N0cmluZy5mZCgpOworICAgIGlmIChmZCA+PSAwKSB7CisgICAgICAgIHRocmVhZC0+ZHVtcChmZCwge30gLyogYXJncyAqLyk7CisgICAgICAgIG1UaHJlYWRMb2cubG9ncygtMSAvKiB0aW1lICovLCBmZFRvU3RyaW5nLmdldFN0cmluZ0FuZENsb3NlKCkpOworICAgIH0KK30KKwogLy8gY2hlY2tUaHJlYWRfbCgpIG11c3QgYmUgY2FsbGVkIHdpdGggQXVkaW9GbGluZ2VyOjptTG9jayBoZWxkCiBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2UgKkF1ZGlvRmxpbmdlcjo6Y2hlY2tUaHJlYWRfbChhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSkgY29uc3QKIHsKQEAgLTI5MzgsMTYgKzI5NTksNzQgQEAKIH0KIAogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpnZXRFZmZlY3REZXNjcmlwdG9yKGNvbnN0IGVmZmVjdF91dWlkX3QgKnBVdWlkLAotICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjcmlwdG9yKSBjb25zdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnBUeXBlVXVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVmZXJyZWRUeXBlRmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjcmlwdG9yKSBjb25zdAogeworICAgIGlmIChwVXVpZCA9PSBOVUxMIHx8IHBUeXBlVXVpZCA9PSBOVUxMIHx8IGRlc2NyaXB0b3IgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgaWYgKG1FZmZlY3RzRmFjdG9yeUhhbC5nZXQoKSkgewotICAgICAgICByZXR1cm4gbUVmZmVjdHNGYWN0b3J5SGFsLT5nZXREZXNjcmlwdG9yKHBVdWlkLCBkZXNjcmlwdG9yKTsKLSAgICB9IGVsc2UgeworCisgICAgaWYgKCFtRWZmZWN0c0ZhY3RvcnlIYWwuZ2V0KCkpIHsKICAgICAgICAgcmV0dXJuIC1FTk9ERVY7CiAgICAgfQotfQogCisgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CisgICAgaWYgKCFFZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZTo6aXNOdWxsVXVpZChwVXVpZCkpIHsKKyAgICAgICAgLy8gSWYgdXVpZCBpcyBzcGVjaWZpZWQsIHJlcXVlc3QgZWZmZWN0IGRlc2NyaXB0b3IgZnJvbSB0aGF0LgorICAgICAgICBzdGF0dXMgPSBtRWZmZWN0c0ZhY3RvcnlIYWwtPmdldERlc2NyaXB0b3IocFV1aWQsIGRlc2NyaXB0b3IpOworICAgIH0gZWxzZSBpZiAoIUVmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlOjppc051bGxVdWlkKHBUeXBlVXVpZCkpIHsKKyAgICAgICAgLy8gSWYgdXVpZCBpcyBub3Qgc3BlY2lmaWVkLCBsb29rIGZvciBhbiBhdmFpbGFibGUgaW1wbGVtZW50YXRpb24KKyAgICAgICAgLy8gb2YgdGhlIHJlcXVpcmVkIHR5cGUgaW5zdGVhZC4KKworICAgICAgICAvLyBVc2UgYSB0ZW1wb3JhcnkgZGVzY3JpcHRvciB0byBhdm9pZCBtb2RpZnlpbmcgfGRlc2NyaXB0b3J8IGluIHRoZSBmYWlsdXJlIGNhc2UuCisgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgZGVzYzsKKyAgICAgICAgZGVzYy5mbGFncyA9IDA7IC8vIHByZXZlbnQgY29tcGlsZXIgd2FybmluZworCisgICAgICAgIHVpbnQzMl90IG51bUVmZmVjdHMgPSAwOworICAgICAgICBzdGF0dXMgPSBtRWZmZWN0c0ZhY3RvcnlIYWwtPnF1ZXJ5TnVtYmVyRWZmZWN0cygmbnVtRWZmZWN0cyk7CisgICAgICAgIGlmIChzdGF0dXMgPCAwKSB7CisgICAgICAgICAgICBBTE9HVygiZ2V0RWZmZWN0RGVzY3JpcHRvcigpIGVycm9yICVkIGZyb20gRmFjdG9yeUhhbCBxdWVyeU51bWJlckVmZmVjdHMiLCBzdGF0dXMpOworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG51bUVmZmVjdHM7IGkrKykgeworICAgICAgICAgICAgc3RhdHVzID0gbUVmZmVjdHNGYWN0b3J5SGFsLT5nZXREZXNjcmlwdG9yKGksICZkZXNjKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPCAwKSB7CisgICAgICAgICAgICAgICAgQUxPR1coImdldEVmZmVjdERlc2NyaXB0b3IoKSBlcnJvciAlZCBmcm9tIEZhY3RvcnlIYWwgZ2V0RGVzY3JpcHRvciIsIHN0YXR1cyk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobWVtY21wKCZkZXNjLnR5cGUsIHBUeXBlVXVpZCwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgLy8gSWYgbWF0Y2hpbmcgdHlwZSBmb3VuZCBzYXZlIGVmZmVjdCBkZXNjcmlwdG9yLgorICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAqZGVzY3JpcHRvciA9IGRlc2M7CisKKyAgICAgICAgICAgICAgICAvLyBJZiB0aGVyZSdzIG5vIHByZWZlcnJlZCBmbGFnIG9yIHRoaXMgZGVzY3JpcHRvciBtYXRjaGVzIHRoZSBwcmVmZXJyZWQKKyAgICAgICAgICAgICAgICAvLyBmbGFnLCBzdWNjZXNzISBJZiB0aGlzIGRlc2NyaXB0b3IgZG9lc24ndCBtYXRjaCB0aGUgcHJlZmVycmVkCisgICAgICAgICAgICAgICAgLy8gZmxhZywgY29udGludWUgZW51bWVyYXRpb24gaW4gY2FzZSBhIGJldHRlciBtYXRjaGluZyB2ZXJzaW9uIG9mIHRoaXMKKyAgICAgICAgICAgICAgICAvLyBlZmZlY3QgdHlwZSBpcyBhdmFpbGFibGUuIE5vdGUgdGhhdCB0aGlzIG1lYW5zIGlmIG5vIGVmZmVjdCB3aXRoIGEKKyAgICAgICAgICAgICAgICAvLyBjb3JyZWN0IGZsYWcgaXMgZm91bmQsIHRoZSBkZXNjcmlwdG9yIHJldHVybmVkIHdpbGwgY29ycmVzcG9uZCB0byB0aGUKKyAgICAgICAgICAgICAgICAvLyBsYXN0IGVmZmVjdCB0aGF0IGF0IGxlYXN0IGhhZCBhIG1hdGNoaW5nIHR5cGUgdXVpZCAoaWYgYW55KS4KKyAgICAgICAgICAgICAgICBpZiAocHJlZmVycmVkVHlwZUZsYWcgPT0gRUZGRUNUX0ZMQUdfVFlQRV9NQVNLIHx8CisgICAgICAgICAgICAgICAgICAgIChkZXNjLmZsYWdzICYgRUZGRUNUX0ZMQUdfVFlQRV9NQVNLKSA9PSBwcmVmZXJyZWRUeXBlRmxhZykgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBOQU1FX05PVF9GT1VORDsKKyAgICAgICAgICAgIEFMT0dXKCJnZXRFZmZlY3REZXNjcmlwdG9yKCk6IEVmZmVjdCBub3QgZm91bmQgYnkgdHlwZS4iKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICAgICAgQUxPR0UoImdldEVmZmVjdERlc2NyaXB0b3IoKTogRWl0aGVyIHV1aWQgb3IgdHlwZSB1dWlkIG11c3QgYmUgbm9uLW51bGwgVVVJRHMuIik7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CiAKIHNwPElFZmZlY3Q+IEF1ZGlvRmxpbmdlcjo6Y3JlYXRlRWZmZWN0KAogICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzYywKQEAgLTI5NjYsNyArMzA0NSw3IEBACiAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCBkZXNjOwogCiAgICAgY29uc3QgdWlkX3QgY2FsbGluZ1VpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKTsKLSAgICBpZiAocGlkID09IC0xIHx8ICFpc1RydXN0ZWRDYWxsaW5nVWlkKGNhbGxpbmdVaWQpKSB7CisgICAgaWYgKHBpZCA9PSAtMSB8fCAhaXNBdWRpb1NlcnZlck9yTWVkaWFTZXJ2ZXJVaWQoY2FsbGluZ1VpZCkpIHsKICAgICAgICAgY29uc3QgcGlkX3QgY2FsbGluZ1BpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKTsKICAgICAgICAgQUxPR1dfSUYocGlkICE9IC0xICYmIHBpZCAhPSBjYWxsaW5nUGlkLAogICAgICAgICAgICAgICAgICAiJXMgdWlkICVkIHBpZCAlZCB0cmllZCB0byBwYXNzIGl0c2VsZiBvZmYgYXMgcGlkICVkIiwKQEAgLTI5ODksOCArMzA2OCw4IEBACiAgICAgfQogCiAgICAgLy8gU2Vzc2lvbiBBVURJT19TRVNTSU9OX09VVFBVVF9TVEFHRSBpcyByZXNlcnZlZCBmb3Igb3V0cHV0IHN0YWdlIGVmZmVjdHMKLSAgICAvLyB0aGF0IGNhbiBvbmx5IGJlIGNyZWF0ZWQgYnkgYXVkaW8gcG9saWN5IG1hbmFnZXIgKHJ1bm5pbmcgaW4gc2FtZSBwcm9jZXNzKQotICAgIGlmIChzZXNzaW9uSWQgPT0gQVVESU9fU0VTU0lPTl9PVVRQVVRfU1RBR0UgJiYgZ2V0cGlkX2NhY2hlZCAhPSBwaWQpIHsKKyAgICAvLyB0aGF0IGNhbiBvbmx5IGJlIGNyZWF0ZWQgYnkgYXVkaW8gcG9saWN5IG1hbmFnZXIKKyAgICBpZiAoc2Vzc2lvbklkID09IEFVRElPX1NFU1NJT05fT1VUUFVUX1NUQUdFICYmICFpc0F1ZGlvU2VydmVyVWlkKGNhbGxpbmdVaWQpKSB7CiAgICAgICAgIGxTdGF0dXMgPSBQRVJNSVNTSU9OX0RFTklFRDsKICAgICAgICAgZ290byBFeGl0OwogICAgIH0KQEAgLTMwMDEsNjAgKzMwODAsMTUgQEAKICAgICB9CiAKICAgICB7Ci0gICAgICAgIGlmICghRWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2U6OmlzTnVsbFV1aWQoJnBEZXNjLT51dWlkKSkgewotICAgICAgICAgICAgLy8gaWYgdXVpZCBpcyBzcGVjaWZpZWQsIHJlcXVlc3QgZWZmZWN0IGRlc2NyaXB0b3IKLSAgICAgICAgICAgIGxTdGF0dXMgPSBtRWZmZWN0c0ZhY3RvcnlIYWwtPmdldERlc2NyaXB0b3IoJnBEZXNjLT51dWlkLCAmZGVzYyk7Ci0gICAgICAgICAgICBpZiAobFN0YXR1cyA8IDApIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiY3JlYXRlRWZmZWN0KCkgZXJyb3IgJWQgZnJvbSBFZmZlY3RHZXREZXNjcmlwdG9yIiwgbFN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgZ290byBFeGl0OwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gaWYgdXVpZCBpcyBub3Qgc3BlY2lmaWVkLCBsb29rIGZvciBhbiBhdmFpbGFibGUgaW1wbGVtZW50YXRpb24KLSAgICAgICAgICAgIC8vIG9mIHRoZSByZXF1aXJlZCB0eXBlIGluIGVmZmVjdCBmYWN0b3J5Ci0gICAgICAgICAgICBpZiAoRWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2U6OmlzTnVsbFV1aWQoJnBEZXNjLT50eXBlKSkgewotICAgICAgICAgICAgICAgIEFMT0dXKCJjcmVhdGVFZmZlY3QoKSBubyBlZmZlY3QgdHlwZSIpOwotICAgICAgICAgICAgICAgIGxTdGF0dXMgPSBCQURfVkFMVUU7Ci0gICAgICAgICAgICAgICAgZ290byBFeGl0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdWludDMyX3QgbnVtRWZmZWN0cyA9IDA7Ci0gICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90IGQ7Ci0gICAgICAgICAgICBkLmZsYWdzID0gMDsgLy8gcHJldmVudCBjb21waWxlciB3YXJuaW5nCi0gICAgICAgICAgICBib29sIGZvdW5kID0gZmFsc2U7Ci0KLSAgICAgICAgICAgIGxTdGF0dXMgPSBtRWZmZWN0c0ZhY3RvcnlIYWwtPnF1ZXJ5TnVtYmVyRWZmZWN0cygmbnVtRWZmZWN0cyk7Ci0gICAgICAgICAgICBpZiAobFN0YXR1cyA8IDApIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiY3JlYXRlRWZmZWN0KCkgZXJyb3IgJWQgZnJvbSBFZmZlY3RRdWVyeU51bWJlckVmZmVjdHMiLCBsU3RhdHVzKTsKLSAgICAgICAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbnVtRWZmZWN0czsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbFN0YXR1cyA9IG1FZmZlY3RzRmFjdG9yeUhhbC0+Z2V0RGVzY3JpcHRvcihpLCAmZGVzYyk7Ci0gICAgICAgICAgICAgICAgaWYgKGxTdGF0dXMgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dXKCJjcmVhdGVFZmZlY3QoKSBlcnJvciAlZCBmcm9tIEVmZmVjdFF1ZXJ5RWZmZWN0IiwgbFN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobWVtY21wKCZkZXNjLnR5cGUsICZwRGVzYy0+dHlwZSwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIElmIG1hdGNoaW5nIHR5cGUgZm91bmQgc2F2ZSBlZmZlY3QgZGVzY3JpcHRvci4gSWYgdGhlIHNlc3Npb24gaXMKLSAgICAgICAgICAgICAgICAgICAgLy8gMCBhbmQgdGhlIGVmZmVjdCBpcyBub3QgYXV4aWxpYXJ5LCBjb250aW51ZSBlbnVtZXJhdGlvbiBpbiBjYXNlCi0gICAgICAgICAgICAgICAgICAgIC8vIGFuIGF1eGlsaWFyeSB2ZXJzaW9uIG9mIHRoaXMgZWZmZWN0IHR5cGUgaXMgYXZhaWxhYmxlCi0gICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgZCA9IGRlc2M7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzZXNzaW9uSWQgIT0gQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlc2MuZmxhZ3MgJiBFRkZFQ1RfRkxBR19UWVBFX01BU0spID09IEVGRkVDVF9GTEFHX1RZUEVfQVVYSUxJQVJZKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghZm91bmQpIHsKLSAgICAgICAgICAgICAgICBsU3RhdHVzID0gQkFEX1ZBTFVFOwotICAgICAgICAgICAgICAgIEFMT0dXKCJjcmVhdGVFZmZlY3QoKSBlZmZlY3Qgbm90IGZvdW5kIik7Ci0gICAgICAgICAgICAgICAgZ290byBFeGl0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gRm9yIHNhbWUgZWZmZWN0IHR5cGUsIGNob3NlIGF1eGlsaWFyeSB2ZXJzaW9uIG92ZXIgaW5zZXJ0IHZlcnNpb24gaWYKLSAgICAgICAgICAgIC8vIGNvbm5lY3QgdG8gb3V0cHV0IG1peCAoQ29tcGxpYW5jZSB0byBPcGVuU0wgRVMpCi0gICAgICAgICAgICBpZiAoc2Vzc2lvbklkID09IEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCAmJgotICAgICAgICAgICAgICAgICAgICAoZC5mbGFncyAmIEVGRkVDVF9GTEFHX1RZUEVfTUFTSykgIT0gRUZGRUNUX0ZMQUdfVFlQRV9BVVhJTElBUlkpIHsKLSAgICAgICAgICAgICAgICBkZXNjID0gZDsKLSAgICAgICAgICAgIH0KKyAgICAgICAgLy8gR2V0IHRoZSBmdWxsIGVmZmVjdCBkZXNjcmlwdG9yIGZyb20gdGhlIHV1aWQvdHlwZS4KKyAgICAgICAgLy8gSWYgdGhlIHNlc3Npb24gaXMgdGhlIG91dHB1dCBtaXgsIHByZWZlciBhbiBhdXhpbGlhcnkgZWZmZWN0LAorICAgICAgICAvLyBvdGhlcndpc2Ugbm8gcHJlZmVyZW5jZS4KKyAgICAgICAgdWludDMyX3QgcHJlZmVycmVkVHlwZSA9IChzZXNzaW9uSWQgPT0gQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFRkZFQ1RfRkxBR19UWVBFX0FVWElMSUFSWSA6IEVGRkVDVF9GTEFHX1RZUEVfTUFTSyk7CisgICAgICAgIGxTdGF0dXMgPSBnZXRFZmZlY3REZXNjcmlwdG9yKCZwRGVzYy0+dXVpZCwgJnBEZXNjLT50eXBlLCBwcmVmZXJyZWRUeXBlLCAmZGVzYyk7CisgICAgICAgIGlmIChsU3RhdHVzIDwgMCkgeworICAgICAgICAgICAgQUxPR1coImNyZWF0ZUVmZmVjdCgpIGVycm9yICVkIGZyb20gZ2V0RWZmZWN0RGVzY3JpcHRvciIsIGxTdGF0dXMpOworICAgICAgICAgICAgZ290byBFeGl0OwogICAgICAgICB9CiAKICAgICAgICAgLy8gRG8gbm90IGFsbG93IGF1eGlsaWFyeSBlZmZlY3RzIG9uIGEgc2Vzc2lvbiBkaWZmZXJlbnQgZnJvbSAwIChvdXRwdXQgbWl4KQpAQCAtMzM3MCwxMzYgKzM0MDQsNiBAQAogfQogCiAKLXN0cnVjdCBFbnRyeSB7Ci0jZGVmaW5lIFRFRV9NQVhfRklMRU5BTUUgMzIgLy8gJVklbSVkJUglTSVTXyVkLndhdiA9IDQrMisyKzIrMisyKzErMSs0KzEgPSAyMQotICAgIGNoYXIgbUZpbGVOYW1lW1RFRV9NQVhfRklMRU5BTUVdOwotfTsKLQotaW50IGNvbXBhckVudHJ5KGNvbnN0IHZvaWQgKnAxLCBjb25zdCB2b2lkICpwMikKLXsKLSAgICByZXR1cm4gc3RyY21wKCgoY29uc3QgRW50cnkgKikgcDEpLT5tRmlsZU5hbWUsICgoY29uc3QgRW50cnkgKikgcDIpLT5tRmlsZU5hbWUpOwotfQotCi0jaWZkZWYgVEVFX1NJTksKLXZvaWQgQXVkaW9GbGluZ2VyOjpkdW1wVGVlKGludCBmZCwgY29uc3Qgc3A8TkJBSU9fU291cmNlPiYgc291cmNlLCBhdWRpb19pb19oYW5kbGVfdCBpZCwgY2hhciBzdWZmaXgpCi17Ci0gICAgTkJBSU9fU291cmNlICp0ZWVTb3VyY2UgPSBzb3VyY2UuZ2V0KCk7Ci0gICAgaWYgKHRlZVNvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgIC8vIC53YXYgcm90YXRpb24KLSAgICAgICAgLy8gVGhlcmUgaXMgYSBiZW5pZ24gcmFjZSBjb25kaXRpb24gaWYgMiB0aHJlYWRzIGNhbGwgdGhpcyBzaW11bHRhbmVvdXNseS4KLSAgICAgICAgLy8gVGhleSB3b3VsZCBib3RoIHRyYXZlcnNlIHRoZSBkaXJlY3RvcnksIGJ1dCB0aGUgcmVzdWx0IHdvdWxkIHNpbXBseSBiZQotICAgICAgICAvLyBmYWlsdXJlcyBhdCB1bmxpbmsoKSB3aGljaCBhcmUgaWdub3JlZC4gIEl0J3MgYWxzbyB1bmxpa2VseSBzaW5jZQotICAgICAgICAvLyBub3JtYWxseSBkdW1wc3lzIGlzIG9ubHkgZG9uZSBieSBidWdyZXBvcnQgb3IgZnJvbSB0aGUgY29tbWFuZCBsaW5lLgotICAgICAgICBjaGFyIHRlZVBhdGhbUEFUSF9NQVhdID0gIi9kYXRhL21pc2MvYXVkaW9zZXJ2ZXIiOwotICAgICAgICBzaXplX3QgdGVlUGF0aExlbiA9IHN0cmxlbih0ZWVQYXRoKTsKLSAgICAgICAgRElSICpkaXIgPSBvcGVuZGlyKHRlZVBhdGgpOwotICAgICAgICB0ZWVQYXRoW3RlZVBhdGhMZW4rK10gPSAnLyc7Ci0gICAgICAgIGlmIChkaXIgIT0gTlVMTCkgewotI2RlZmluZSBURUVfTUFYX1NPUlQgMjAgLy8gbnVtYmVyIG9mIGVudHJpZXMgdG8gc29ydAotI2RlZmluZSBURUVfTUFYX0tFRVAgMTAgLy8gbnVtYmVyIG9mIGVudHJpZXMgdG8ga2VlcAotICAgICAgICAgICAgc3RydWN0IEVudHJ5IGVudHJpZXNbVEVFX01BWF9TT1JUXTsKLSAgICAgICAgICAgIHNpemVfdCBlbnRyeUNvdW50ID0gMDsKLSAgICAgICAgICAgIHdoaWxlIChlbnRyeUNvdW50IDwgVEVFX01BWF9TT1JUKSB7Ci0gICAgICAgICAgICAgICAgZXJybm8gPSAwOyAvLyBjbGVhciBlcnJubyBiZWZvcmUgcmVhZGRpcigpIHRvIHRyYWNrIHBvdGVudGlhbCBlcnJvcnMuCi0gICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGRpcmVudCAqcmVzdWx0ID0gcmVhZGRpcihkaXIpOwotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgICAgICAgICBBTE9HV19JRihlcnJubyAhPSAwLCAidGVlIHJlYWRkaXIoKSBmYWlsdXJlICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBub24gLndhdiBmaWxlIGVudHJpZXMKLSAgICAgICAgICAgICAgICBjb25zdCBzaXplX3QgbmFtZUxlbiA9IHN0cmxlbihyZXN1bHQtPmRfbmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWVMZW4gPD0gNCB8fCBuYW1lTGVuID49IFRFRV9NQVhfRklMRU5BTUUgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmNtcCgmcmVzdWx0LT5kX25hbWVbbmFtZUxlbiAtIDRdLCAiLndhdiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAodm9pZClhdWRpb191dGlsc19zdHJsY3B5KGVudHJpZXNbZW50cnlDb3VudCsrXS5tRmlsZU5hbWUsIHJlc3VsdC0+ZF9uYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICh2b2lkKSBjbG9zZWRpcihkaXIpOwotICAgICAgICAgICAgaWYgKGVudHJ5Q291bnQgPiBURUVfTUFYX0tFRVApIHsKLSAgICAgICAgICAgICAgICBxc29ydChlbnRyaWVzLCBlbnRyeUNvdW50LCBzaXplb2YoRW50cnkpLCBjb21wYXJFbnRyeSk7Ci0gICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBlbnRyeUNvdW50IC0gVEVFX01BWF9LRUVQOyArK2kpIHsKLSAgICAgICAgICAgICAgICAgICAgc3RyY3B5KCZ0ZWVQYXRoW3RlZVBhdGhMZW5dLCBlbnRyaWVzW2ldLm1GaWxlTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICh2b2lkKSB1bmxpbmsodGVlUGF0aCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKGZkID49IDApIHsKLSAgICAgICAgICAgICAgICBkcHJpbnRmKGZkLCAidW5hYmxlIHRvIHJvdGF0ZSB0ZWVzIGluICUuKnM6ICVzXG4iLCAoaW50KSB0ZWVQYXRoTGVuLCB0ZWVQYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjaGFyIHRlZVRpbWVbMTZdOwotICAgICAgICBzdHJ1Y3QgdGltZXZhbCB0djsKLSAgICAgICAgZ2V0dGltZW9mZGF5KCZ0diwgTlVMTCk7Ci0gICAgICAgIHN0cnVjdCB0bSB0bTsKLSAgICAgICAgbG9jYWx0aW1lX3IoJnR2LnR2X3NlYywgJnRtKTsKLSAgICAgICAgc3RyZnRpbWUodGVlVGltZSwgc2l6ZW9mKHRlZVRpbWUpLCAiJVklbSVkJUglTSVTIiwgJnRtKTsKLSAgICAgICAgc25wcmludGYoJnRlZVBhdGhbdGVlUGF0aExlbl0sIHNpemVvZih0ZWVQYXRoKSAtIHRlZVBhdGhMZW4sICIlc18lZF8lYy53YXYiLCB0ZWVUaW1lLCBpZCwKLSAgICAgICAgICAgICAgICBzdWZmaXgpOwotICAgICAgICAvLyBpZiAyIGR1bXBzeXMgYXJlIGRvbmUgd2l0aGluIDEgc2Vjb25kLCBhbmQgcm90YXRpb24gZGlkbid0IHdvcmssIHRoZW4gZGlzY2FyZCAybmQKLSAgICAgICAgaW50IHRlZUZkID0gb3Blbih0ZWVQYXRoLCBPX1dST05MWSB8IE9fQ1JFQVQgfCBPX0VYQ0wgfCBPX05PRk9MTE9XLCBTX0lSVVNSIHwgU19JV1VTUik7Ci0gICAgICAgIGlmICh0ZWVGZCA+PSAwKSB7Ci0gICAgICAgICAgICAvLyBGSVhNRSB1c2UgbGlic25kZmlsZQotICAgICAgICAgICAgY2hhciB3YXZIZWFkZXJbNDRdOwotICAgICAgICAgICAgbWVtY3B5KHdhdkhlYWRlciwKLSAgICAgICAgICAgICAgICAiUklGRlwwXDBcMFwwV0FWRWZtdCBcMjBcMFwwXDBcMVwwXDJcMFwxMDRcMjU0XDBcMFwwXDBcMFwwXDRcMFwyMFwwZGF0YVwwXDBcMFwwIiwKLSAgICAgICAgICAgICAgICBzaXplb2Yod2F2SGVhZGVyKSk7Ci0gICAgICAgICAgICBOQkFJT19Gb3JtYXQgZm9ybWF0ID0gdGVlU291cmNlLT5mb3JtYXQoKTsKLSAgICAgICAgICAgIHVuc2lnbmVkIGNoYW5uZWxDb3VudCA9IEZvcm1hdF9jaGFubmVsQ291bnQoZm9ybWF0KTsKLSAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUgPSBGb3JtYXRfc2FtcGxlUmF0ZShmb3JtYXQpOwotICAgICAgICAgICAgc2l6ZV90IGZyYW1lU2l6ZSA9IEZvcm1hdF9mcmFtZVNpemUoZm9ybWF0KTsKLSAgICAgICAgICAgIHdhdkhlYWRlclsyMl0gPSBjaGFubmVsQ291bnQ7ICAgICAgIC8vIG51bWJlciBvZiBjaGFubmVscwotICAgICAgICAgICAgd2F2SGVhZGVyWzI0XSA9IHNhbXBsZVJhdGU7ICAgICAgICAgLy8gc2FtcGxlIHJhdGUKLSAgICAgICAgICAgIHdhdkhlYWRlclsyNV0gPSBzYW1wbGVSYXRlID4+IDg7Ci0gICAgICAgICAgICB3YXZIZWFkZXJbMzJdID0gZnJhbWVTaXplOyAgICAgICAgICAvLyBibG9jayBhbGlnbm1lbnQKLSAgICAgICAgICAgIHdhdkhlYWRlclszM10gPSBmcmFtZVNpemUgPj4gODsKLSAgICAgICAgICAgIHdyaXRlKHRlZUZkLCB3YXZIZWFkZXIsIHNpemVvZih3YXZIZWFkZXIpKTsKLSAgICAgICAgICAgIHNpemVfdCB0b3RhbCA9IDA7Ci0gICAgICAgICAgICBib29sIGZpcnN0UmVhZCA9IHRydWU7Ci0jZGVmaW5lIFRFRV9TSU5LX1JFQUQgMTAyNCAgICAgICAgICAgICAgICAgICAgICAvLyBmcmFtZXMgcGVyIEkvTyBvcGVyYXRpb24KLSAgICAgICAgICAgIHZvaWQgKmJ1ZmZlciA9IG1hbGxvYyhURUVfU0lOS19SRUFEICogZnJhbWVTaXplKTsKLSAgICAgICAgICAgIGZvciAoOzspIHsKLSAgICAgICAgICAgICAgICBzaXplX3QgY291bnQgPSBURUVfU0lOS19SRUFEOwotICAgICAgICAgICAgICAgIHNzaXplX3QgYWN0dWFsID0gdGVlU291cmNlLT5yZWFkKGJ1ZmZlciwgY291bnQpOwotICAgICAgICAgICAgICAgIGJvb2wgd2FzRmlyc3RSZWFkID0gZmlyc3RSZWFkOwotICAgICAgICAgICAgICAgIGZpcnN0UmVhZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGlmIChhY3R1YWwgPD0gMCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoYWN0dWFsID09IChzc2l6ZV90KSBPVkVSUlVOICYmIHdhc0ZpcnN0UmVhZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEFMT0dfQVNTRVJUKGFjdHVhbCA8PSAoc3NpemVfdCljb3VudCk7Ci0gICAgICAgICAgICAgICAgd3JpdGUodGVlRmQsIGJ1ZmZlciwgYWN0dWFsICogZnJhbWVTaXplKTsKLSAgICAgICAgICAgICAgICB0b3RhbCArPSBhY3R1YWw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmcmVlKGJ1ZmZlcik7Ci0gICAgICAgICAgICBsc2Vlayh0ZWVGZCwgKG9mZl90KSA0LCBTRUVLX1NFVCk7Ci0gICAgICAgICAgICB1aW50MzJfdCB0ZW1wID0gNDQgKyB0b3RhbCAqIGZyYW1lU2l6ZSAtIDg7Ci0gICAgICAgICAgICAvLyBGSVhNRSBub3QgYmlnLWVuZGlhbiBzYWZlCi0gICAgICAgICAgICB3cml0ZSh0ZWVGZCwgJnRlbXAsIHNpemVvZih0ZW1wKSk7Ci0gICAgICAgICAgICBsc2Vlayh0ZWVGZCwgKG9mZl90KSA0MCwgU0VFS19TRVQpOwotICAgICAgICAgICAgdGVtcCA9ICB0b3RhbCAqIGZyYW1lU2l6ZTsKLSAgICAgICAgICAgIC8vIEZJWE1FIG5vdCBiaWctZW5kaWFuIHNhZmUKLSAgICAgICAgICAgIHdyaXRlKHRlZUZkLCAmdGVtcCwgc2l6ZW9mKHRlbXApKTsKLSAgICAgICAgICAgIGNsb3NlKHRlZUZkKTsKLSAgICAgICAgICAgIC8vIFRPRE8gU2hvdWxkIGNyZWF0ZSBmaWxlIHdpdGggdGVtcG9yYXJ5IG5hbWUgYW5kIHRoZW4gcmVuYW1lIHRvIGZpbmFsIGlmIG5vbi1lbXB0eS4KLSAgICAgICAgICAgIGlmICh0b3RhbCA+IDApIHsKLSAgICAgICAgICAgICAgICBpZiAoZmQgPj0gMCkgewotICAgICAgICAgICAgICAgICAgICBkcHJpbnRmKGZkLCAidGVlIGNvcGllZCB0byAlc1xuIiwgdGVlUGF0aCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB1bmxpbmsodGVlUGF0aCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoZmQgPj0gMCkgewotICAgICAgICAgICAgICAgIGRwcmludGYoZmQsICJ1bmFibGUgdG8gY3JlYXRlIHRlZSAlczogJXNcbiIsIHRlZVBhdGgsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0jZW5kaWYKLQogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6Om9uVHJhbnNhY3QoCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmgKaW5kZXggOTYzYTg3ZC4uYjZiMzgxNSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuaApAQCAtMjMsNiArMjMsOCBAQAogI2luY2x1ZGUgPG11dGV4PgogI2luY2x1ZGUgPGRlcXVlPgogI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPHZlY3Rvcj4KICNpbmNsdWRlIDxzdGRpbnQuaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KQEAgLTYyLDcgKzY0LDEwIEBACiAjaW5jbHVkZSA8bWVkaWEvTGluZWFyTWFwLmg+CiAjaW5jbHVkZSA8bWVkaWEvVm9sdW1lU2hhcGVyLmg+CiAKKyNpbmNsdWRlIDxhdWRpb191dGlscy9jbG9jay5oPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL0ZkVG9TdHJpbmcuaD4KICNpbmNsdWRlIDxhdWRpb191dGlscy9TaW1wbGVMb2cuaD4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9UaW1lc3RhbXBWZXJpZmllci5oPgogCiAjaW5jbHVkZSAiRmFzdENhcHR1cmUuaCIKICNpbmNsdWRlICJGYXN0TWl4ZXIuaCIKQEAgLTcxLDYgKzc2LDcgQEAKICNpbmNsdWRlICJBdWRpb1N0cmVhbU91dC5oIgogI2luY2x1ZGUgIlNwZGlmU3RyZWFtT3V0LmgiCiAjaW5jbHVkZSAiQXVkaW9Id0RldmljZS5oIgorI2luY2x1ZGUgIk5CQUlPX1RlZS5oIgogCiAjaW5jbHVkZSA8cG93ZXJtYW5hZ2VyL0lQb3dlck1hbmFnZXIuaD4KIApAQCAtMjAyLDYgKzIwOCw4IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBxdWVyeUVmZmVjdCh1aW50MzJfdCBpbmRleCwgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzY3JpcHRvcikgY29uc3Q7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldEVmZmVjdERlc2NyaXB0b3IoY29uc3QgZWZmZWN0X3V1aWRfdCAqcFV1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnBUeXBlVXVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlZmVycmVkVHlwZUZsYWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2NyaXB0b3IpIGNvbnN0OwogCiAgICAgdmlydHVhbCBzcDxJRWZmZWN0PiBjcmVhdGVFZmZlY3QoCkBAIC00MTYsNiArNDI0LDExIEBACiAgICAgdm9pZCBkdW1wQ2xpZW50cyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwogICAgIHZvaWQgZHVtcEludGVybmFscyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwogCisgICAgU2ltcGxlTG9nIG1UaHJlYWRMb2d7MTZ9OyAvLyAxNiBUaHJlYWQgaGlzdG9yeSBsaW1pdAorCisgICAgY2xhc3MgVGhyZWFkQmFzZTsKKyAgICB2b2lkIGR1bXBUb1RocmVhZExvZ19sKGNvbnN0IHNwPFRocmVhZEJhc2U+ICZ0aHJlYWQpOworCiAgICAgLy8gLS0tIENsaWVudCAtLS0KICAgICBjbGFzcyBDbGllbnQgOiBwdWJsaWMgUmVmQmFzZSB7CiAgICAgcHVibGljOgpAQCAtNjc1LDYgKzY4OCw5IEBACiAgICAgICAgICAgICAgICAgYm9vbCAgICAgICAgICAgIHVwZGF0ZU9ycGhhbkVmZmVjdENoYWlucyhjb25zdCBzcDxFZmZlY3RNb2R1bGU+JiBlZmZlY3QpOwogCiAgICAgICAgICAgICAgICAgdm9pZCBicm9hY2FzdFBhcmFtZXRlcnNUb1JlY29yZFRocmVhZHNfbChjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXJzKTsKKyAgICAgICAgICAgICAgICB2b2lkIGZvcndhcmRQYXJhbWV0ZXJzVG9Eb3duc3RyZWFtUGF0Y2hlc19sKAorICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgdXBTdHJlYW0sIGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPGJvb2woY29uc3Qgc3A8UGxheWJhY2tUaHJlYWQ+Jik+IHVzZVRocmVhZCA9IG51bGxwdHIpOwogCiAgICAgLy8gQXVkaW9TdHJlYW1JbiBpcyBpbW11dGFibGUsIHNvIHRoZWlyIGZpZWxkcyBhcmUgY29uc3QuCiAgICAgLy8gRm9yIGVtcGhhc2lzLCB3ZSBjb3VsZCBhbHNvIG1ha2UgYWxsIHBvaW50ZXJzIHRvIHRoZW0gYmUgImNvbnN0ICoiLApAQCAtNzkxLDQ0ICs4MDcsMTkgQEAKIAogICAgIC8vIGZvciB1c2UgZnJvbSBkZXN0cnVjdG9yCiAgICAgc3RhdHVzX3QgICAgY2xvc2VPdXRwdXRfbm9udmlydHVhbChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpOwotICAgIHZvaWQgICAgICAgIGNsb3NlT3V0cHV0SW50ZXJuYWxfbChjb25zdCBzcDxQbGF5YmFja1RocmVhZD4mIHRocmVhZCk7CisgICAgdm9pZCAgICAgICAgY2xvc2VUaHJlYWRJbnRlcm5hbF9sKGNvbnN0IHNwPFBsYXliYWNrVGhyZWFkPiYgdGhyZWFkKTsKICAgICBzdGF0dXNfdCAgICBjbG9zZUlucHV0X25vbnZpcnR1YWwoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQpOwotICAgIHZvaWQgICAgICAgIGNsb3NlSW5wdXRJbnRlcm5hbF9sKGNvbnN0IHNwPFJlY29yZFRocmVhZD4mIHRocmVhZCk7CisgICAgdm9pZCAgICAgICAgY2xvc2VUaHJlYWRJbnRlcm5hbF9sKGNvbnN0IHNwPFJlY29yZFRocmVhZD4mIHRocmVhZCk7CiAgICAgdm9pZCAgICAgICAgc2V0QXVkaW9Id1N5bmNGb3JTZXNzaW9uX2woUGxheWJhY2tUaHJlYWQgKnRocmVhZCwgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCk7CiAKICAgICBzdGF0dXNfdCAgICBjaGVja1N0cmVhbVR5cGUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIGNvbnN0OwogCiAgICAgdm9pZCAgICAgICAgZmlsdGVyUmVzZXJ2ZWRQYXJhbWV0ZXJzKFN0cmluZzgmIGtleVZhbHVlUGFpcnMsIHVpZF90IGNhbGxpbmdVaWQpOwotCi0jaWZkZWYgVEVFX1NJTksKLSAgICAvLyBhbGwgcmVjb3JkIHRocmVhZHMgc2VyaWFsbHkgc2hhcmUgYSBjb21tb24gdGVlIHNpbmssIHdoaWNoIGlzIHJlLWNyZWF0ZWQgb24gZm9ybWF0IGNoYW5nZQotICAgIHNwPE5CQUlPX1Npbms+ICAgbVJlY29yZFRlZVNpbms7Ci0gICAgc3A8TkJBSU9fU291cmNlPiBtUmVjb3JkVGVlU291cmNlOwotI2VuZGlmCisgICAgdm9pZCAgICAgICAgbG9nRmlsdGVyZWRQYXJhbWV0ZXJzKHNpemVfdCBvcmlnaW5hbEtWUFNpemUsIGNvbnN0IFN0cmluZzgmIG9yaWdpbmFsS1ZQcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHJlamVjdGVkS1ZQU2l6ZSwgY29uc3QgU3RyaW5nOCYgcmVqZWN0ZWRLVlBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCBjYWxsaW5nVWlkKTsKIAogcHVibGljOgotCi0jaWZkZWYgVEVFX1NJTksKLSAgICAvLyB0ZWUgc2luaywgaWYgZW5hYmxlZCBieSBwcm9wZXJ0eSwgYWxsb3dzIGR1bXBzeXMgdG8gd3JpdGUgbW9zdCByZWNlbnQgYXVkaW8gdG8gLndhdiBmaWxlCi0gICAgc3RhdGljIHZvaWQgZHVtcFRlZShpbnQgZmQsIGNvbnN0IHNwPE5CQUlPX1NvdXJjZT4mIHNvdXJjZSwgYXVkaW9faW9faGFuZGxlX3QgaWQsIGNoYXIgc3VmZml4KTsKLQotICAgIC8vIHdoZXRoZXIgdGVlIHNpbmsgaXMgZW5hYmxlZCBieSBwcm9wZXJ0eQotICAgIHN0YXRpYyBib29sIG1UZWVTaW5rSW5wdXRFbmFibGVkOwotICAgIHN0YXRpYyBib29sIG1UZWVTaW5rT3V0cHV0RW5hYmxlZDsKLSAgICBzdGF0aWMgYm9vbCBtVGVlU2lua1RyYWNrRW5hYmxlZDsKLQotICAgIC8vIHJ1bnRpbWUgY29uZmlndXJlZCBzaXplIG9mIGVhY2ggdGVlIHNpbmsgcGlwZSwgaW4gZnJhbWVzCi0gICAgc3RhdGljIHNpemVfdCBtVGVlU2lua0lucHV0RnJhbWVzOwotICAgIHN0YXRpYyBzaXplX3QgbVRlZVNpbmtPdXRwdXRGcmFtZXM7Ci0gICAgc3RhdGljIHNpemVfdCBtVGVlU2lua1RyYWNrRnJhbWVzOwotCi0gICAgLy8gY29tcGlsZS10aW1lIGRlZmF1bHQgc2l6ZSBvZiB0ZWUgc2luayBwaXBlcywgaW4gZnJhbWVzCi0gICAgLy8gMHgyMDAwMDAgc3RlcmVvIDE2LWJpdCBQQ00gZnJhbWVzID0gNDcuNSBzZWNvbmRzIGF0IDQ0LjEga0h6LCA4IG1lZ2FieXRlcwotICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga1RlZVNpbmtJbnB1dEZyYW1lc0RlZmF1bHQgPSAweDIwMDAwMDsKLSAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtUZWVTaW5rT3V0cHV0RnJhbWVzRGVmYXVsdCA9IDB4MjAwMDAwOwotICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga1RlZVNpbmtUcmFja0ZyYW1lc0RlZmF1bHQgPSAweDIwMDAwMDsKLSNlbmRpZgotCiAgICAgLy8gVGhlc2UgbWV0aG9kcyByZWFkIHZhcmlhYmxlcyBhdG9taWNhbGx5IHdpdGhvdXQgbUxvY2ssCiAgICAgLy8gdGhvdWdoIHRoZSB2YXJpYWJsZXMgYXJlIHVwZGF0ZWQgd2l0aCBtTG9jay4KICAgICBib29sICAgIGlzTG93UmFtRGV2aWNlKCkgY29uc3QgeyByZXR1cm4gbUlzTG93UmFtRGV2aWNlOyB9CkBAIC04NDMsMTAgKzgzNCwxNSBAQAogCiAgICAgbnNlY3NfdCBtR2xvYmFsRWZmZWN0RW5hYmxlVGltZTsgIC8vIHdoZW4gYSBnbG9iYWwgZWZmZWN0IHdhcyBsYXN0IGVuYWJsZWQKIAotICAgIHNwPFBhdGNoUGFuZWw+IG1QYXRjaFBhbmVsOworICAgIC8vIHByb3RlY3RlZCBieSBtTG9jaworICAgIFBhdGNoUGFuZWwgbVBhdGNoUGFuZWw7CiAgICAgc3A8RWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2U+IG1FZmZlY3RzRmFjdG9yeUhhbDsKIAotICAgIGJvb2wgICAgICAgIG1TeXN0ZW1SZWFkeTsKKyAgICBib29sICAgICAgIG1TeXN0ZW1SZWFkeTsKKworICAgIFNpbXBsZUxvZyAgbVJlamVjdGVkU2V0UGFyYW1ldGVyTG9nOworICAgIFNpbXBsZUxvZyAgbUFwcFNldFBhcmFtZXRlckxvZzsKKyAgICBTaW1wbGVMb2cgIG1TeXN0ZW1TZXRQYXJhbWV0ZXJMb2c7CiB9OwogCiAjdW5kZWYgSU5DTFVESU5HX0ZST01fQVVESU9GTElOR0VSX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0h3RGV2aWNlLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9Id0RldmljZS5oCmluZGV4IGViODI2YzYuLmQ0Mjk5YjAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0h3RGV2aWNlLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvSHdEZXZpY2UuaApAQCAtMzUsNiArMzUsOSBAQAogICAgIGVudW0gRmxhZ3MgewogICAgICAgICBBSFdEX0NBTl9TRVRfTUFTVEVSX1ZPTFVNRSAgPSAweDEsCiAgICAgICAgIEFIV0RfQ0FOX1NFVF9NQVNURVJfTVVURSAgICA9IDB4MiwKKyAgICAgICAgLy8gTWVhbnMgdGhhdCB0aGlzIGlzbid0IGEgdGVybWluYWwgbW9kdWxlLCBhbmQgc29mdHdhcmUgcGF0Y2hlcworICAgICAgICAvLyBhcmUgdXNlZCB0byB0cmFuc3BvcnQgYXVkaW8gZGF0YSBmdXJ0aGVyLgorICAgICAgICBBSFdEX0lTX0lOU0VSVCAgICAgICAgICAgICAgPSAweDQsCiAgICAgfTsKIAogICAgIEF1ZGlvSHdEZXZpY2UoYXVkaW9fbW9kdWxlX2hhbmRsZV90IGhhbmRsZSwKQEAgLTU1LDYgKzU4LDEwIEBACiAgICAgICAgIHJldHVybiAoMCAhPSAobUZsYWdzICYgQUhXRF9DQU5fU0VUX01BU1RFUl9NVVRFKSk7CiAgICAgfQogCisgICAgYm9vbCBpc0luc2VydCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuICgwICE9IChtRmxhZ3MgJiBBSFdEX0lTX0lOU0VSVCkpOworICAgIH0KKwogICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBoYW5kbGUoKSBjb25zdCB7IHJldHVybiBtSGFuZGxlOyB9CiAgICAgY29uc3QgY2hhciAqbW9kdWxlTmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1Nb2R1bGVOYW1lOyB9CiAgICAgc3A8RGV2aWNlSGFsSW50ZXJmYWNlPiBod0RldmljZSgpIGNvbnN0IHsgcmV0dXJuIG1Id0RldmljZTsgfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0VmZmVjdHMuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0VmZmVjdHMuY3BwCmluZGV4IGIzZjVlZmQuLjZhYjYzNjkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9FZmZlY3RzLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRWZmZWN0cy5jcHAKQEAgLTMxLDkgKzMxLDkgQEAKICNpbmNsdWRlIDxtZWRpYS9BdWRpb0VmZmVjdC5oPgogI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0VmZmVjdEhhbEludGVyZmFjZS5oPgogI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0VmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8bWVkaWF1dGlscy9TZXJ2aWNlVXRpbGl0aWVzLmg+CiAKICNpbmNsdWRlICJBdWRpb0ZsaW5nZXIuaCIKLSNpbmNsdWRlICJTZXJ2aWNlVXRpbGl0aWVzLmgiCiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIApAQCAtMzA5LDggKzMwOSw4IEBACiAgICAgLy8gaW5wdXQgYW5kIG91dHB1dCBlZmZlY3QgYnVmZmVycyB3aXRob3V0IGFuIGludGVybWVkaWFyeSBlZmZlY3QgcHJvY2Vzcy4KICAgICAvLyBUT0RPOiBjb25zaWRlciBpbXBsZW1lbnRpbmcgY2hhbm5lbCBjb252ZXJzaW9uLgogICAgIGNvbnN0IHNpemVfdCBzYWZlSW5wdXRPdXRwdXRTYW1wbGVDb3VudCA9Ci0gICAgICAgICAgICBpbkNoYW5uZWxDb3VudCAhPSBvdXRDaGFubmVsQ291bnQgPyAwCi0gICAgICAgICAgICAgICAgICAgIDogb3V0Q2hhbm5lbENvdW50ICogc3RkOjptaW4oCisgICAgICAgICAgICBtSW5DaGFubmVsQ291bnRSZXF1ZXN0ZWQgIT0gbU91dENoYW5uZWxDb3VudFJlcXVlc3RlZCA/IDAKKyAgICAgICAgICAgICAgICAgICAgOiBtT3V0Q2hhbm5lbENvdW50UmVxdWVzdGVkICogc3RkOjptaW4oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbmZpZy5pbnB1dENmZy5idWZmZXIuZnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29uZmlnLm91dHB1dENmZy5idWZmZXIuZnJhbWVDb3VudCk7CiAgICAgY29uc3QgYXV0byBhY2N1bXVsYXRlSW5wdXRUb091dHB1dCA9IFt0aGlzLCBzYWZlSW5wdXRPdXRwdXRTYW1wbGVDb3VudF0oKSB7CkBAIC00ODAsNyArNDgwLDEyIEBACiAgICAgICAgIC8vIGFjY3VtdWxhdGUgaW5wdXQgb250byBvdXRwdXQKICAgICAgICAgc3A8RWZmZWN0Q2hhaW4+IGNoYWluID0gbUNoYWluLnByb21vdGUoKTsKICAgICAgICAgaWYgKGNoYWluLmdldCgpICE9IG51bGxwdHIgJiYgY2hhaW4tPmFjdGl2ZVRyYWNrQ250KCkgIT0gMCkgewotICAgICAgICAgICAgYWNjdW11bGF0ZUlucHV0VG9PdXRwdXQoKTsKKyAgICAgICAgICAgIC8vIHNpbWlsYXIgaGFuZGxpbmcgd2l0aCBkYXRhX2J5cGFzcyBhYm92ZS4KKyAgICAgICAgICAgIGlmIChtQ29uZmlnLm91dHB1dENmZy5hY2Nlc3NNb2RlID09IEVGRkVDVF9CVUZGRVJfQUNDRVNTX0FDQ1VNVUxBVEUpIHsKKyAgICAgICAgICAgICAgICBhY2N1bXVsYXRlSW5wdXRUb091dHB1dCgpOworICAgICAgICAgICAgfSBlbHNlIHsgLy8gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfV1JJVEUKKyAgICAgICAgICAgICAgICBjb3B5SW5wdXRUb091dHB1dCgpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogfQpAQCAtMTg1OSw3ICsxODY0LDcgQEAKICAgICBib29sIGxvY2tlZCA9IG1DYmxrICE9IE5VTEwgJiYgQXVkaW9GbGluZ2VyOjpkdW1wVHJ5TG9jayhtQ2Jsay0+bG9jayk7CiAKICAgICBzbnByaW50ZihidWZmZXIsIHNpemUsICJcdFx0XHQlNWQgICAgJTVkICAlM3MgICAgJTNzICAlNXUgICU1dVxuIiwKLSAgICAgICAgICAgIChtQ2xpZW50ID09IDApID8gZ2V0cGlkX2NhY2hlZCA6IG1DbGllbnQtPnBpZCgpLAorICAgICAgICAgICAgKG1DbGllbnQgPT0gMCkgPyBnZXRwaWQoKSA6IG1DbGllbnQtPnBpZCgpLAogICAgICAgICAgICAgbVByaW9yaXR5LAogICAgICAgICAgICAgbUhhc0NvbnRyb2wgPyAieWVzIiA6ICJubyIsCiAgICAgICAgICAgICBsb2NrZWQgPyAieWVzIiA6ICJubyIsCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdENhcHR1cmUuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RDYXB0dXJlLmNwcAppbmRleCBkMDYzNzcyLi5kZDg0YmYyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdENhcHR1cmUuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0Q2FwdHVyZS5jcHAKQEAgLTIwLDYgKzIwLDcgQEAKICNkZWZpbmUgQVRSQUNFX1RBRyBBVFJBQ0VfVEFHX0FVRElPCiAKICNpbmNsdWRlICJDb25maWd1cmF0aW9uLmgiCisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvZm9ybWF0Lmg+CiAjaW5jbHVkZSA8bGludXgvZnV0ZXguaD4KICNpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvQnVmZmVyUHJvdmlkZXIuaD4KQEAgLTE2MSw3ICsxNjIsMjEgQEAKICAgICBjb25zdCBGYXN0Q2FwdHVyZVN0YXRlICogY29uc3QgY3VycmVudCA9IChjb25zdCBGYXN0Q2FwdHVyZVN0YXRlICopIG1DdXJyZW50OwogICAgIEZhc3RDYXB0dXJlRHVtcFN0YXRlICogY29uc3QgZHVtcFN0YXRlID0gKEZhc3RDYXB0dXJlRHVtcFN0YXRlICopIG1EdW1wU3RhdGU7CiAgICAgY29uc3QgRmFzdENhcHR1cmVTdGF0ZTo6Q29tbWFuZCBjb21tYW5kID0gbUNvbW1hbmQ7Ci0gICAgY29uc3Qgc2l6ZV90IGZyYW1lQ291bnQgPSBjdXJyZW50LT5tRnJhbWVDb3VudDsKKyAgICBzaXplX3QgZnJhbWVDb3VudCA9IGN1cnJlbnQtPm1GcmFtZUNvdW50OworICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXIqIGZhc3RQYXRjaFJlY29yZEJ1ZmZlclByb3ZpZGVyID0gY3VycmVudC0+bUZhc3RQYXRjaFJlY29yZEJ1ZmZlclByb3ZpZGVyOworICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciBwYXRjaEJ1ZmZlcjsKKworICAgIGlmIChmYXN0UGF0Y2hSZWNvcmRCdWZmZXJQcm92aWRlciAhPSAwKSB7CisgICAgICAgIHBhdGNoQnVmZmVyLmZyYW1lQ291bnQgPSB+MDsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZmFzdFBhdGNoUmVjb3JkQnVmZmVyUHJvdmlkZXItPmdldE5leHRCdWZmZXIoJnBhdGNoQnVmZmVyKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgZnJhbWVDb3VudCA9IDA7CisgICAgICAgIH0gZWxzZSBpZiAocGF0Y2hCdWZmZXIuZnJhbWVDb3VudCA8IGZyYW1lQ291bnQpIHsKKyAgICAgICAgICAgIC8vIFRPRE86IE1ha2Ugc3VyZSB0aGF0IGl0IGRvZXNuJ3QgY2F1c2UgYW55IGlzc3VlcyBpZiB3ZSBqdXN0IGdldCBhIHNtYWxsIGF2YWlsYWJsZQorICAgICAgICAgICAgLy8gYnVmZmVyIGZyb20gdGhlIGJ1ZmZlciBwcm92aWRlci4KKyAgICAgICAgICAgIGZyYW1lQ291bnQgPSBwYXRjaEJ1ZmZlci5mcmFtZUNvdW50OworICAgICAgICB9CisgICAgfQogCiAgICAgaWYgKChjb21tYW5kICYgRmFzdENhcHR1cmVTdGF0ZTo6UkVBRCkgLyomJiBpc1dhcm0qLykgewogICAgICAgICBBTE9HX0FTU0VSVChtSW5wdXRTb3VyY2UgIT0gTlVMTCk7CkBAIC0xNzYsNiArMTkxLDcgQEAKICAgICAgICAgICAgIG1Ub3RhbE5hdGl2ZUZyYW1lc1JlYWQgKz0gZnJhbWVzUmVhZDsKICAgICAgICAgICAgIGR1bXBTdGF0ZS0+bUZyYW1lc1JlYWQgPSBtVG90YWxOYXRpdmVGcmFtZXNSZWFkOwogICAgICAgICAgICAgbVJlYWRCdWZmZXJTdGF0ZSA9IGZyYW1lc1JlYWQ7CisgICAgICAgICAgICBwYXRjaEJ1ZmZlci5mcmFtZUNvdW50ID0gZnJhbWVzUmVhZDsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGR1bXBTdGF0ZS0+bVJlYWRFcnJvcnMrKzsKICAgICAgICAgICAgIG1SZWFkQnVmZmVyU3RhdGUgPSAwOwpAQCAtMTkzLDExICsyMDksMTggQEAKICAgICAgICAgfQogICAgICAgICBpZiAobVJlYWRCdWZmZXJTdGF0ZSA+IDApIHsKICAgICAgICAgICAgIHNzaXplX3QgZnJhbWVzV3JpdHRlbiA9IG1QaXBlU2luay0+d3JpdGUobVJlYWRCdWZmZXIsIG1SZWFkQnVmZmVyU3RhdGUpOwotICAgICAgICAgICAgLy8gRklYTUUgVGhpcyBzdXBwb3J0cyBhdCBtb3N0IG9uZSBmYXN0IGNhcHR1cmUgY2xpZW50LgotICAgICAgICAgICAgLy8gICAgICAgVG8gaGFuZGxlIG11bHRpcGxlIGNsaWVudHMgdGhpcyBjb3VsZCBiZSBjb252ZXJ0ZWQgdG8gYW4gYXJyYXksCi0gICAgICAgICAgICAvLyAgICAgICBvciB3aXRoIGEgbG90IG1vcmUgd29yayB0aGUgY29udHJvbCBibG9jayBjb3VsZCBiZSBzaGFyZWQgYnkgYWxsIGNsaWVudHMuCiAgICAgICAgICAgICBhdWRpb190cmFja19jYmxrX3QqIGNibGsgPSBjdXJyZW50LT5tQ2JsazsKLSAgICAgICAgICAgIGlmIChjYmxrICE9IE5VTEwgJiYgZnJhbWVzV3JpdHRlbiA+IDApIHsKKyAgICAgICAgICAgIGlmIChmYXN0UGF0Y2hSZWNvcmRCdWZmZXJQcm92aWRlciAhPSAwKSB7CisgICAgICAgICAgICAgICAgLy8gVGhpcyBpbmRpY2F0ZXMgdGhlIGZhc3QgdHJhY2sgaXMgYSBwYXRjaCByZWNvcmQsIHVwZGF0ZSB0aGUgY2JsayBieQorICAgICAgICAgICAgICAgIC8vIGNhbGxpbmcgcmVsZWFzZUJ1ZmZlcigpLgorICAgICAgICAgICAgICAgIG1lbWNweV9ieV9hdWRpb19mb3JtYXQocGF0Y2hCdWZmZXIucmF3LCBjdXJyZW50LT5tRmFzdFBhdGNoUmVjb3JkRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgbVJlYWRCdWZmZXIsIG1Gb3JtYXQubUZvcm1hdCwgZnJhbWVzV3JpdHRlbiAqIG1Gb3JtYXQubUNoYW5uZWxDb3VudCk7CisgICAgICAgICAgICAgICAgcGF0Y2hCdWZmZXIuZnJhbWVDb3VudCA9IGZyYW1lc1dyaXR0ZW47CisgICAgICAgICAgICAgICAgZmFzdFBhdGNoUmVjb3JkQnVmZmVyUHJvdmlkZXItPnJlbGVhc2VCdWZmZXIoJnBhdGNoQnVmZmVyKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoY2JsayAhPSBOVUxMICYmIGZyYW1lc1dyaXR0ZW4gPiAwKSB7CisgICAgICAgICAgICAgICAgLy8gRklYTUUgVGhpcyBzdXBwb3J0cyBhdCBtb3N0IG9uZSBmYXN0IGNhcHR1cmUgY2xpZW50LgorICAgICAgICAgICAgICAgIC8vICAgICAgIFRvIGhhbmRsZSBtdWx0aXBsZSBjbGllbnRzIHRoaXMgY291bGQgYmUgY29udmVydGVkIHRvIGFuIGFycmF5LAorICAgICAgICAgICAgICAgIC8vICAgICAgIG9yIHdpdGggYSBsb3QgbW9yZSB3b3JrIHRoZSBjb250cm9sIGJsb2NrIGNvdWxkIGJlIHNoYXJlZCBieSBhbGwgY2xpZW50cy4KICAgICAgICAgICAgICAgICBpbnQzMl90IHJlYXIgPSBjYmxrLT51Lm1TdHJlYW1pbmcubVJlYXI7CiAgICAgICAgICAgICAgICAgYW5kcm9pZF9hdG9taWNfcmVsZWFzZV9zdG9yZShmcmFtZXNXcml0dGVuICsgcmVhciwgJmNibGstPnUubVN0cmVhbWluZy5tUmVhcik7CiAgICAgICAgICAgICAgICAgY2Jsay0+bVNlcnZlciArPSBmcmFtZXNXcml0dGVuOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RDYXB0dXJlU3RhdGUuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0Q2FwdHVyZVN0YXRlLmgKaW5kZXggOWJjYTJkNC4uZDI4NzIzMiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RDYXB0dXJlU3RhdGUuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdENhcHR1cmVTdGF0ZS5oCkBAIC0xOCw2ICsxOCw3IEBACiAjZGVmaW5lIEFORFJPSURfQVVESU9fRkFTVF9DQVBUVVJFX1NUQVRFX0gKIAogI2luY2x1ZGUgPG1lZGlhL25iYWlvL05CQUlPLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9CdWZmZXJQcm92aWRlci5oPgogI2luY2x1ZGUgIkZhc3RUaHJlYWRTdGF0ZS5oIgogI2luY2x1ZGUgPHByaXZhdGUvbWVkaWEvQXVkaW9UcmFja1NoYXJlZC5oPgogCkBAIC0zNyw2ICszOCwxMCBAQAogICAgIHNpemVfdCAgICAgICAgICBtRnJhbWVDb3VudDsgICAgICAgIC8vIG51bWJlciBvZiBmcmFtZXMgcGVyIGZhc3QgY2FwdHVyZSBidWZmZXIKICAgICBhdWRpb190cmFja19jYmxrX3QqIG1DYmxrOyAgICAgICAgICAvLyBjb250cm9sIGJsb2NrIGZvciB0aGUgc2luZ2xlIGZhc3QgY2xpZW50LCBvciBOVUxMCiAKKyAgICBhdWRpb19mb3JtYXRfdCAgbUZhc3RQYXRjaFJlY29yZEZvcm1hdCA9IEFVRElPX0ZPUk1BVF9JTlZBTElEOworICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXIqIG1GYXN0UGF0Y2hSZWNvcmRCdWZmZXJQcm92aWRlciA9IG51bGxwdHI7ICAgLy8gYSByZWZlcmVuY2UgdG8gYSBwYXRjaAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVjb3JkIGluIGZhc3QgbW9kZQorCiAgICAgLy8gRXh0ZW5kcyBGYXN0VGhyZWFkU3RhdGU6OkNvbW1hbmQKICAgICBzdGF0aWMgY29uc3QgQ29tbWFuZAogICAgICAgICAvLyBUaGUgZm9sbG93aW5nIGNvbW1hbmRzIGFsc28gcHJvY2VzcyBjb25maWd1cmF0aW9uIGNoYW5nZXMsIGFuZCBjYW4gYmUgIm9yImVkOgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlci5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyLmNwcAppbmRleCA3OWJiOWZlLi5kMTU4NDFmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyLmNwcApAQCAtMzIsNyArMzIsNyBAQAogI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAjaWZkZWYgRkFTVF9USFJFQURfU1RBVElTVElDUwotI2luY2x1ZGUgPGNwdXN0YXRzL0NlbnRyYWxUZW5kZW5jeVN0YXRpc3RpY3MuaD4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9TdGF0aXN0aWNzLmg+CiAjaWZkZWYgQ1BVX0ZSRVFVRU5DWV9TVEFUSVNUSUNTCiAjaW5jbHVkZSA8Y3B1c3RhdHMvVGhyZWFkQ3B1VXNhZ2UuaD4KICNlbmRpZgpAQCAtNDcsNyArNDcsOCBAQAogCiAvKnN0YXRpYyovIGNvbnN0IEZhc3RNaXhlclN0YXRlIEZhc3RNaXhlcjo6c0luaXRpYWw7CiAKLUZhc3RNaXhlcjo6RmFzdE1peGVyKCkgOiBGYXN0VGhyZWFkKCJjeWNsZV9tcyIsICJsb2FkX3VzIiksCitGYXN0TWl4ZXI6OkZhc3RNaXhlcihhdWRpb19pb19oYW5kbGVfdCBwYXJlbnRJb0hhbmRsZSkKKyAgICA6IEZhc3RUaHJlYWQoImN5Y2xlX21zIiwgImxvYWRfdXMiKSwKICAgICAvLyBtRmFzdFRyYWNrTmFtZXMKICAgICAvLyBtR2VuZXJhdGlvbnMKICAgICBtT3V0cHV0U2luayhOVUxMKSwKQEAgLTY2LDggKzY3LDExIEBACiAgICAgbVRvdGFsTmF0aXZlRnJhbWVzV3JpdHRlbigwKSwKICAgICAvLyB0aW1lc3RhbXAKICAgICBtTmF0aXZlRnJhbWVzV3JpdHRlbkJ1dE5vdFByZXNlbnRlZCgwKSwgICAvLyB0aGUgPSAwIGlzIHRvIHNpbGVuY2UgdGhlIGNvbXBpbGVyCi0gICAgbU1hc3Rlck1vbm8oZmFsc2UpCisgICAgbU1hc3Rlck1vbm8oZmFsc2UpLAorICAgIG1UaHJlYWRJb0hhbmRsZShwYXJlbnRJb0hhbmRsZSkKIHsKKyAgICAodm9pZCltVGhyZWFkSW9IYW5kbGU7IC8vIHByZXZlbnQgdW51c2VkIHdhcm5pbmcsIHNlZSBDKysxNyBbW21heWJlX3VudXNlZF1dCisKICAgICAvLyBGSVhNRSBwYXNzIHNJbml0aWFsIGFzIHBhcmFtZXRlciB0byBiYXNlIGNsYXNzIGNvbnN0cnVjdG9yLCBhbmQgbWFrZSBpdCBzdGF0aWMgbG9jYWwKICAgICBtUHJldmlvdXMgPSAmc0luaXRpYWw7CiAgICAgbUN1cnJlbnQgPSAmc0luaXRpYWw7CkBAIC0xOTEsNiArMTk1LDEwIEBACiAgICAgICAgICAgICAvLyAgICAgICB0byBhdm9pZCBibG9ja2luZyBoZXJlIGFuZCB0byBwcmV2ZW50IHBvc3NpYmxlIHByaW9yaXR5IGludmVyc2lvbgogICAgICAgICAgICAgbU1peGVyID0gbmV3IEF1ZGlvTWl4ZXIoZnJhbWVDb3VudCwgbVNhbXBsZVJhdGUpOwogICAgICAgICAgICAgLy8gRklYTUUgU2VlIHRoZSBvdGhlciBGSVhNRSBhdCBGYXN0TWl4ZXI6OnNldE5CTG9nV3JpdGVyKCkKKyAgICAgICAgICAgIE5CTG9nOjp0aHJlYWRfcGFyYW1zX3QgcGFyYW1zOworICAgICAgICAgICAgcGFyYW1zLmZyYW1lQ291bnQgPSBmcmFtZUNvdW50OworICAgICAgICAgICAgcGFyYW1zLnNhbXBsZVJhdGUgPSBtU2FtcGxlUmF0ZTsKKyAgICAgICAgICAgIExPR19USFJFQURfUEFSQU1TKHBhcmFtcyk7CiAgICAgICAgICAgICBjb25zdCBzaXplX3QgbWl4ZXJGcmFtZVNpemUgPSBtU2lua0NoYW5uZWxDb3VudAogICAgICAgICAgICAgICAgICAgICAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUobU1peGVyQnVmZmVyRm9ybWF0KTsKICAgICAgICAgICAgIG1NaXhlckJ1ZmZlclNpemUgPSBtaXhlckZyYW1lU2l6ZSAqIGZyYW1lQ291bnQ7CkBAIC0yMjAsNiArMjI4LDEwIEBACiAgICAgICAgIHByZXZpb3VzVHJhY2tNYXNrID0gMDsKICAgICAgICAgbUZhc3RUcmFja3NHZW4gPSBjdXJyZW50LT5tRmFzdFRyYWNrc0dlbiAtIDE7CiAgICAgICAgIGR1bXBTdGF0ZS0+bUZyYW1lQ291bnQgPSBmcmFtZUNvdW50OworI2lmZGVmIFRFRV9TSU5LCisgICAgICAgIG1UZWUuc2V0KG1Gb3JtYXQsIE5CQUlPX1RlZTo6VEVFX0ZMQUdfT1VUUFVUX1RIUkVBRCk7CisgICAgICAgIG1UZWUuc2V0SWQoc3RkOjpzdHJpbmcoIl8iKSArIHN0ZDo6dG9fc3RyaW5nKG1UaHJlYWRJb0hhbmRsZSkgKyAiX0YiKTsKKyNlbmRpZgogICAgIH0gZWxzZSB7CiAgICAgICAgIHByZXZpb3VzVHJhY2tNYXNrID0gcHJldmlvdXMtPm1UcmFja01hc2s7CiAgICAgfQpAQCAtMzI4LDEzICszNDAsMjQgQEAKIHsKICAgICAvLyBUT0RPOiBwYXNzIGFuIElEIHBhcmFtZXRlciB0byBpbmRpY2F0ZSB3aGljaCB0aW1lIHNlcmllcyB3ZSB3YW50IHRvIHdyaXRlIHRvIGluIE5CTG9nLmNwcAogICAgIC8vIE9yOiBwYXNzIGJvdGggb2YgdGhlc2UgaW50byBhIHNpbmdsZSBjYWxsIHdpdGggYSBib29sZWFuCi0gICAgaWYgKG1Jc1dhcm0pIHsKLSAgICAgICAgTE9HX0hJU1RfVFMoKTsKLSAgICB9IGVsc2UgewotICAgICAgICBMT0dfQVVESU9fU1RBVEUoKTsKLSAgICB9CiAgICAgY29uc3QgRmFzdE1peGVyU3RhdGUgKiBjb25zdCBjdXJyZW50ID0gKGNvbnN0IEZhc3RNaXhlclN0YXRlICopIG1DdXJyZW50OwogICAgIEZhc3RNaXhlckR1bXBTdGF0ZSAqIGNvbnN0IGR1bXBTdGF0ZSA9IChGYXN0TWl4ZXJEdW1wU3RhdGUgKikgbUR1bXBTdGF0ZTsKKworICAgIGlmIChtSXNXYXJtKSB7CisgICAgICAgIC8vIExvZ2dpbmcgdGltZXN0YW1wcyBmb3IgRmFzdE1peGVyIGlzIGN1cnJlbnRseSBkaXNhYmxlZCB0byBtYWtlIG1lbW9yeSByb29tIGZvciBsb2dnaW5nCisgICAgICAgIC8vIG90aGVyIHN0YXRpc3RpY3MgaW4gRmFzdE1peGVyLgorICAgICAgICAvLyBUbyByZS1lbmFibGUsIGRlbGV0ZSB0aGUgI2lmZGVmIEZBU1RNSVhFUl9MT0dfSElTVF9UUyBsaW5lcyAoYW5kIHRoZSAjZW5kaWYgbGluZXMpLgorI2lmZGVmIEZBU1RNSVhFUl9MT0dfSElTVF9UUworICAgICAgICBMT0dfSElTVF9UUygpOworI2VuZGlmCisgICAgICAgIC8vQUxPR0QoIkVyaWMgRmFzdE1peGVyOjpvbldvcmsoKSBtSXNXYXJtIik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZHVtcFN0YXRlLT5tVGltZXN0YW1wVmVyaWZpZXIuZGlzY29udGludWl0eSgpOworICAgICAgICAvLyBTZWUgY29tbWVudCBpbiBpZiBibG9jay4KKyNpZmRlZiBGQVNUTUlYRVJfTE9HX0hJU1RfVFMKKyAgICAgICAgTE9HX0FVRElPX1NUQVRFKCk7CisjZW5kaWYKKyAgICB9CiAgICAgY29uc3QgRmFzdE1peGVyU3RhdGU6OkNvbW1hbmQgY29tbWFuZCA9IG1Db21tYW5kOwogICAgIGNvbnN0IHNpemVfdCBmcmFtZUNvdW50ID0gY3VycmVudC0+bUZyYW1lQ291bnQ7CiAKQEAgLTQ0NiwxMCArNDY5LDkgQEAKICAgICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCAqIEZvcm1hdF9jaGFubmVsQ291bnQobUZvcm1hdCkpOwogICAgICAgICB9CiAgICAgICAgIC8vIGlmIG5vbi1OVUxMLCB0aGVuIGR1cGxpY2F0ZSB3cml0ZSgpIHRvIHRoaXMgbm9uLWJsb2NraW5nIHNpbmsKLSAgICAgICAgTkJBSU9fU2luayogdGVlU2luazsKLSAgICAgICAgaWYgKCh0ZWVTaW5rID0gY3VycmVudC0+bVRlZVNpbmspICE9IE5VTEwpIHsKLSAgICAgICAgICAgICh2b2lkKSB0ZWVTaW5rLT53cml0ZShidWZmZXIsIGZyYW1lQ291bnQpOwotICAgICAgICB9CisjaWZkZWYgVEVFX1NJTksKKyAgICAgICAgbVRlZS53cml0ZShidWZmZXIsIGZyYW1lQ291bnQpOworI2VuZGlmCiAgICAgICAgIC8vIEZJWE1FIHdyaXRlKCkgaXMgbm9uLWJsb2NraW5nIGFuZCBsb2NrLWZyZWUgZm9yIGEgcHJvcGVybHkgaW1wbGVtZW50ZWQgTkJBSU8gc2luaywKICAgICAgICAgLy8gICAgICAgYnV0IHRoaXMgY29kZSBzaG91bGQgYmUgbW9kaWZpZWQgdG8gaGFuZGxlIGJvdGggbm9uLWJsb2NraW5nIGFuZCBibG9ja2luZyBzaW5rcwogICAgICAgICBkdW1wU3RhdGUtPm1Xcml0ZVNlcXVlbmNlKys7CkBAIC00NzAsMzUgKzQ5Miw0OSBAQAogICAgICAgICBtQXR0ZW1wdGVkV3JpdGUgPSB0cnVlOwogICAgICAgICAvLyBGSVhNRSBjb3VudCAjIG9mIHdyaXRlcyBibG9ja2VkIGV4Y2Vzc2l2ZWx5LCBDUFUgdXNhZ2UsIGV0Yy4gZm9yIGR1bXAKIAotICAgICAgICBFeHRlbmRlZFRpbWVzdGFtcCB0aW1lc3RhbXA7IC8vIGxvY2FsCi0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1PdXRwdXRTaW5rLT5nZXRUaW1lc3RhbXAodGltZXN0YW1wKTsKLSAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgY29uc3QgaW50NjRfdCB0b3RhbE5hdGl2ZUZyYW1lc1ByZXNlbnRlZCA9Ci0gICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF07Ci0gICAgICAgICAgICBpZiAodG90YWxOYXRpdmVGcmFtZXNQcmVzZW50ZWQgPD0gbVRvdGFsTmF0aXZlRnJhbWVzV3JpdHRlbikgewotICAgICAgICAgICAgICAgIG1OYXRpdmVGcmFtZXNXcml0dGVuQnV0Tm90UHJlc2VudGVkID0KLSAgICAgICAgICAgICAgICAgICAgbVRvdGFsTmF0aXZlRnJhbWVzV3JpdHRlbiAtIHRvdGFsTmF0aXZlRnJhbWVzUHJlc2VudGVkOwotICAgICAgICAgICAgICAgIG1UaW1lc3RhbXAubVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdID0KKyAgICAgICAgaWYgKG1Jc1dhcm0pIHsKKyAgICAgICAgICAgIEV4dGVuZGVkVGltZXN0YW1wIHRpbWVzdGFtcDsgLy8gbG9jYWwKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1PdXRwdXRTaW5rLT5nZXRUaW1lc3RhbXAodGltZXN0YW1wKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBkdW1wU3RhdGUtPm1UaW1lc3RhbXBWZXJpZmllci5hZGQoCisgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAubVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdLAorICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0sCisgICAgICAgICAgICAgICAgICAgICAgICBtU2FtcGxlUmF0ZSk7CisgICAgICAgICAgICAgICAgY29uc3QgaW50NjRfdCB0b3RhbE5hdGl2ZUZyYW1lc1ByZXNlbnRlZCA9CiAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAubVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdOwotICAgICAgICAgICAgICAgIG1UaW1lc3RhbXAubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXTsKKyAgICAgICAgICAgICAgICBpZiAodG90YWxOYXRpdmVGcmFtZXNQcmVzZW50ZWQgPD0gbVRvdGFsTmF0aXZlRnJhbWVzV3JpdHRlbikgeworICAgICAgICAgICAgICAgICAgICBtTmF0aXZlRnJhbWVzV3JpdHRlbkJ1dE5vdFByZXNlbnRlZCA9CisgICAgICAgICAgICAgICAgICAgICAgICBtVG90YWxOYXRpdmVGcmFtZXNXcml0dGVuIC0gdG90YWxOYXRpdmVGcmFtZXNQcmVzZW50ZWQ7CisgICAgICAgICAgICAgICAgICAgIG1UaW1lc3RhbXAubVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAubVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdOworICAgICAgICAgICAgICAgICAgICBtVGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdOworICAgICAgICAgICAgICAgICAgICAvLyBXZSBkb24ndCBjb21wZW5zYXRlIGZvciBzZXJ2ZXIgLSBrZXJuZWwgdGltZSBkaWZmZXJlbmNlIGFuZAorICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IHVwZGF0ZSBsYXRlbmN5IGlmIHdlIGhhdmUgdmFsaWQgaW5mby4KKyAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlIGxhdGVuY3lNcyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRvdWJsZSltTmF0aXZlRnJhbWVzV3JpdHRlbkJ1dE5vdFByZXNlbnRlZCAqIDEwMDAgLyBtU2FtcGxlUmF0ZTsKKyAgICAgICAgICAgICAgICAgICAgZHVtcFN0YXRlLT5tTGF0ZW5jeU1zID0gbGF0ZW5jeU1zOworICAgICAgICAgICAgICAgICAgICBMT0dfTEFURU5DWShsYXRlbmN5TXMpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEhBTCByZXBvcnRlZCB0aGF0IG1vcmUgZnJhbWVzIHdlcmUgcHJlc2VudGVkIHRoYW4gd2VyZSB3cml0dGVuCisgICAgICAgICAgICAgICAgICAgIG1OYXRpdmVGcmFtZXNXcml0dGVuQnV0Tm90UHJlc2VudGVkID0gMDsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBIQUwgcmVwb3J0ZWQgdGhhdCBtb3JlIGZyYW1lcyB3ZXJlIHByZXNlbnRlZCB0aGFuIHdlcmUgd3JpdHRlbgotICAgICAgICAgICAgICAgIG1OYXRpdmVGcmFtZXNXcml0dGVuQnV0Tm90UHJlc2VudGVkID0gMDsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgICAgICBkdW1wU3RhdGUtPm1UaW1lc3RhbXBWZXJpZmllci5lcnJvcigpOwogICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIG1UaW1lc3RhbXAubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fU0VSVkVSXSA9Ci0gICAgICAgICAgICAgICAgICAgIG1UaW1lc3RhbXAubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIGZldGNoIHNlcnZlciB0aW1lIGlmIHdlIGNhbid0IGdldCB0aW1lc3RhbXAKLSAgICAgICAgICAgIG1UaW1lc3RhbXAubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fU0VSVkVSXSA9Ci0gICAgICAgICAgICAgICAgICAgIHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICAgICAgICAgIC8vIGNsZWFyIG91dCBrZXJuZWwgY2FjaGVkIHBvc2l0aW9uIGFzIHRoaXMgbWF5IGdldCByYXBpZGx5IHN0YWxlCi0gICAgICAgICAgICAvLyBpZiB3ZSBuZXZlciBnZXQgYSBuZXcgdmFsaWQgdGltZXN0YW1wCi0gICAgICAgICAgICBtVGltZXN0YW1wLm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSA9IDA7Ci0gICAgICAgICAgICBtVGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0gPSAtMTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBtVGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX1NFUlZFUl0gPQorICAgICAgICAgICAgICAgICAgICAgICAgbVRpbWVzdGFtcC5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBmZXRjaCBzZXJ2ZXIgdGltZSBpZiB3ZSBjYW4ndCBnZXQgdGltZXN0YW1wCisgICAgICAgICAgICAgICAgbVRpbWVzdGFtcC5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9TRVJWRVJdID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKKyAgICAgICAgICAgICAgICAvLyBjbGVhciBvdXQga2VybmVsIGNhY2hlZCBwb3NpdGlvbiBhcyB0aGlzIG1heSBnZXQgcmFwaWRseSBzdGFsZQorICAgICAgICAgICAgICAgIC8vIGlmIHdlIG5ldmVyIGdldCBhIG5ldyB2YWxpZCB0aW1lc3RhbXAKKyAgICAgICAgICAgICAgICBtVGltZXN0YW1wLm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSA9IDA7CisgICAgICAgICAgICAgICAgbVRpbWVzdGFtcC5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdID0gLTE7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyLmgKaW5kZXggMjM1ZDIzZi4uMWM4NmQ5YSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlci5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXIuaApAQCAtMjIsNiArMjIsNyBAQAogI2luY2x1ZGUgIlN0YXRlUXVldWUuaCIKICNpbmNsdWRlICJGYXN0TWl4ZXJTdGF0ZS5oIgogI2luY2x1ZGUgIkZhc3RNaXhlckR1bXBTdGF0ZS5oIgorI2luY2x1ZGUgIk5CQUlPX1RlZS5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTMyLDcgKzMzLDkgQEAKIGNsYXNzIEZhc3RNaXhlciA6IHB1YmxpYyBGYXN0VGhyZWFkIHsKIAogcHVibGljOgotICAgICAgICAgICAgRmFzdE1peGVyKCk7CisgICAgLyoqIEZhc3RNaXhlciBjb25zdHJ1Y3RvciB0YWtlcyBhcyBwYXJhbSB0aGUgcGFyZW50IE1peGVyVGhyZWFkJ3MgaW8gaGFuZGxlIChpZCkKKyAgICAgICAgZm9yIHB1cnBvc2VzIG9mIGlkZW50aWZpY2F0aW9uLiAqLworICAgIGV4cGxpY2l0IEZhc3RNaXhlcihhdWRpb19pb19oYW5kbGVfdCB0aHJlYWRJb0hhbmRsZSk7CiAgICAgdmlydHVhbCB+RmFzdE1peGVyKCk7CiAKICAgICAgICAgICAgIEZhc3RNaXhlclN0YXRlUXVldWUqIHNxKCk7CkBAIC04Nyw2ICs5MCwxMSBAQAogICAgIC8vIGFjY2Vzc2VkIHdpdGhvdXQgbG9jayBiZXR3ZWVuIG11bHRpcGxlIHRocmVhZHMuCiAgICAgc3RkOjphdG9taWNfYm9vbCBtTWFzdGVyTW9ubzsKICAgICBzdGQ6OmF0b21pY19pbnRfZmFzdDY0X3QgbUJvb3R0aW1lT2Zmc2V0OworCisgICAgY29uc3QgYXVkaW9faW9faGFuZGxlX3QgbVRocmVhZElvSGFuZGxlOyAvLyBwYXJlbnQgdGhyZWFkIGlkIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMKKyNpZmRlZiBURUVfU0lOSworICAgIE5CQUlPX1RlZSAgICAgICBtVGVlOworI2VuZGlmCiB9OyAgLy8gY2xhc3MgRmFzdE1peGVyCiAKIH0gICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlckR1bXBTdGF0ZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyRHVtcFN0YXRlLmNwcAppbmRleCAyZTRmYjhjLi5hNDJlMDljIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyRHVtcFN0YXRlLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyRHVtcFN0YXRlLmNwcApAQCAtMTksNyArMTksNyBAQAogCiAjaW5jbHVkZSAiQ29uZmlndXJhdGlvbi5oIgogI2lmZGVmIEZBU1RfVEhSRUFEX1NUQVRJU1RJQ1MKLSNpbmNsdWRlIDxjcHVzdGF0cy9DZW50cmFsVGVuZGVuY3lTdGF0aXN0aWNzLmg+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvU3RhdGlzdGljcy5oPgogI2lmZGVmIENQVV9GUkVRVUVOQ1lfU1RBVElTVElDUwogI2luY2x1ZGUgPGNwdXN0YXRzL1RocmVhZENwdVVzYWdlLmg+CiAjZW5kaWYKQEAgLTY4LDIxICs2OCwyMiBAQAogICAgIGRwcmludGYoZmQsICIgIEZhc3RNaXhlciBjb21tYW5kPSVzIHdyaXRlU2VxdWVuY2U9JXUgZnJhbWVzV3JpdHRlbj0ldVxuIgogICAgICAgICAgICAgICAgICIgICAgICAgICAgICBudW1UcmFja3M9JXUgd3JpdGVFcnJvcnM9JXUgdW5kZXJydW5zPSV1IG92ZXJydW5zPSV1XG4iCiAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgIHNhbXBsZVJhdGU9JXUgZnJhbWVDb3VudD0lenUgbWVhc3VyZWRXYXJtdXA9JS4zZyBtcywgd2FybXVwQ3ljbGVzPSV1XG4iCi0gICAgICAgICAgICAgICAgIiAgICAgICAgICAgIG1peFBlcmlvZD0lLjJmIG1zXG4iLAorICAgICAgICAgICAgICAgICIgICAgICAgICAgICBtaXhQZXJpb2Q9JS4yZiBtcyBsYXRlbmN5PSUuMmYgbXNcbiIsCiAgICAgICAgICAgICAgICAgRmFzdE1peGVyU3RhdGU6OmNvbW1hbmRUb1N0cmluZyhtQ29tbWFuZCksIG1Xcml0ZVNlcXVlbmNlLCBtRnJhbWVzV3JpdHRlbiwKICAgICAgICAgICAgICAgICBtTnVtVHJhY2tzLCBtV3JpdGVFcnJvcnMsIG1VbmRlcnJ1bnMsIG1PdmVycnVucywKICAgICAgICAgICAgICAgICBtU2FtcGxlUmF0ZSwgbUZyYW1lQ291bnQsIG1lYXN1cmVkV2FybXVwTXMsIG1XYXJtdXBDeWNsZXMsCi0gICAgICAgICAgICAgICAgbWl4UGVyaW9kU2VjICogMWUzKTsKKyAgICAgICAgICAgICAgICBtaXhQZXJpb2RTZWMgKiAxZTMsIG1MYXRlbmN5TXMpOworICAgIGRwcmludGYoZmQsICIgIEZhc3RNaXhlciBUaW1lc3RhbXAgc3RhdHM6ICVzXG4iLCBtVGltZXN0YW1wVmVyaWZpZXIudG9TdHJpbmcoKS5jX3N0cigpKTsKICNpZmRlZiBGQVNUX1RIUkVBRF9TVEFUSVNUSUNTCiAgICAgLy8gZmluZCB0aGUgaW50ZXJ2YWwgb2YgdmFsaWQgc2FtcGxlcwotICAgIHVpbnQzMl90IGJvdW5kcyA9IG1Cb3VuZHM7Ci0gICAgdWludDMyX3QgbmV3ZXN0T3BlbiA9IGJvdW5kcyAmIDB4RkZGRjsKKyAgICBjb25zdCB1aW50MzJfdCBib3VuZHMgPSBtQm91bmRzOworICAgIGNvbnN0IHVpbnQzMl90IG5ld2VzdE9wZW4gPSBib3VuZHMgJiAweEZGRkY7CiAgICAgdWludDMyX3Qgb2xkZXN0Q2xvc2VkID0gYm91bmRzID4+IDE2OwogCiAgICAgLy91aW50MzJfdCBuID0gKG5ld2VzdE9wZW4gLSBvbGRlc3RDbG9zZWQpICYgMHhGRkZGOwogICAgIHVpbnQzMl90IG47CiAgICAgX19idWlsdGluX3N1Yl9vdmVyZmxvdyhuZXdlc3RPcGVuLCBvbGRlc3RDbG9zZWQsICZuKTsKLSAgICBuID0gbiAmIDB4RkZGRjsKKyAgICBuICY9IDB4RkZGRjsKIAogICAgIGlmIChuID4gbVNhbXBsaW5nTikgewogICAgICAgICBBTE9HRSgidG9vIG1hbnkgc2FtcGxlcyAldSIsIG4pOwpAQCAtOTAsOSArOTEsOSBAQAogICAgIH0KICAgICAvLyBzdGF0aXN0aWNzIGZvciBtb25vdG9uaWMgKHdhbGwgY2xvY2spIHRpbWUsIHRocmVhZCByYXcgQ1BVIGxvYWQgaW4gdGltZSwgQ1BVIGNsb2NrIGZyZXF1ZW5jeSwKICAgICAvLyBhbmQgYWRqdXN0ZWQgQ1BVIGxvYWQgaW4gTUh6IG5vcm1hbGl6ZWQgZm9yIENQVSBjbG9jayBmcmVxdWVuY3kKLSAgICBDZW50cmFsVGVuZGVuY3lTdGF0aXN0aWNzIHdhbGwsIGxvYWROczsKKyAgICBhdWRpb191dGlsczo6U3RhdGlzdGljczxkb3VibGU+IHdhbGwsIGxvYWROczsKICNpZmRlZiBDUFVfRlJFUVVFTkNZX1NUQVRJU1RJQ1MKLSAgICBDZW50cmFsVGVuZGVuY3lTdGF0aXN0aWNzIGtIeiwgbG9hZE1IejsKKyAgICBhdWRpb191dGlsczo6U3RhdGlzdGljczxkb3VibGU+IGtIeiwgbG9hZE1IejsKICAgICB1aW50MzJfdCBwcmV2aW91c0NwdWtIeiA9IDA7CiAjZW5kaWYKICAgICAvLyBBc3N1bWluZyBhIG5vcm1hbCBkaXN0cmlidXRpb24gZm9yIGN5Y2xlIHRpbWVzLCB0aHJlZSBzdGFuZGFyZCBkZXZpYXRpb25zIG9uIGVpdGhlciBzaWRlIG9mCkBAIC0xMDcsMTggKzEwOCwxOCBAQAogICAgICAgICBpZiAodGFpbCAhPSBOVUxMKSB7CiAgICAgICAgICAgICB0YWlsW2pdID0gd2FsbE5zOwogICAgICAgICB9Ci0gICAgICAgIHdhbGwuc2FtcGxlKHdhbGxOcyk7CisgICAgICAgIHdhbGwuYWRkKHdhbGxOcyk7CiAgICAgICAgIHVpbnQzMl90IHNhbXBsZUxvYWROcyA9IG1Mb2FkTnNbaV07Ci0gICAgICAgIGxvYWROcy5zYW1wbGUoc2FtcGxlTG9hZE5zKTsKKyAgICAgICAgbG9hZE5zLmFkZChzYW1wbGVMb2FkTnMpOwogI2lmZGVmIENQVV9GUkVRVUVOQ1lfU1RBVElTVElDUwogICAgICAgICB1aW50MzJfdCBzYW1wbGVDcHVrSHogPSBtQ3B1a0h6W2ldOwogICAgICAgICAvLyBza2lwIGJhZCBrSHogc2FtcGxlcwogICAgICAgICBpZiAoKHNhbXBsZUNwdWtIeiAmIH4weEYpICE9IDApIHsKLSAgICAgICAgICAgIGtIei5zYW1wbGUoc2FtcGxlQ3B1a0h6ID4+IDQpOworICAgICAgICAgICAga0h6LmFkZChzYW1wbGVDcHVrSHogPj4gNCk7CiAgICAgICAgICAgICBpZiAoc2FtcGxlQ3B1a0h6ID09IHByZXZpb3VzQ3B1a0h6KSB7CiAgICAgICAgICAgICAgICAgZG91YmxlIG1lZ2FjeWNsZXMgPSAoZG91YmxlKSBzYW1wbGVMb2FkTnMgKiAoZG91YmxlKSAoc2FtcGxlQ3B1a0h6ID4+IDQpICogMWUtMTI7CiAgICAgICAgICAgICAgICAgZG91YmxlIGFkak1IeiA9IG1lZ2FjeWNsZXMgLyBtaXhQZXJpb2RTZWM7ICAvLyBfbm90XyB3YWxsTnMgKiAxZTkKLSAgICAgICAgICAgICAgICBsb2FkTUh6LnNhbXBsZShhZGpNSHopOworICAgICAgICAgICAgICAgIGxvYWRNSHouYWRkKGFkak1Ieik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgcHJldmlvdXNDcHVrSHogPSBzYW1wbGVDcHVrSHo7CkBAIC0xMjYsNDIgKzEyNyw0MiBAQAogICAgIH0KICAgICBpZiAobikgewogICAgICAgICBkcHJpbnRmKGZkLCAiICBTaW1wbGUgbW92aW5nIHN0YXRpc3RpY3Mgb3ZlciBsYXN0ICUuMWYgc2Vjb25kczpcbiIsCi0gICAgICAgICAgICAgICAgICAgIHdhbGwubigpICogbWl4UGVyaW9kU2VjKTsKKyAgICAgICAgICAgICAgICAgICAgd2FsbC5nZXROKCkgKiBtaXhQZXJpb2RTZWMpOwogICAgICAgICBkcHJpbnRmKGZkLCAiICAgIHdhbGwgY2xvY2sgdGltZSBpbiBtcyBwZXIgbWl4IGN5Y2xlOlxuIgogICAgICAgICAgICAgICAgICAgICAiICAgICAgbWVhbj0lLjJmIG1pbj0lLjJmIG1heD0lLjJmIHN0ZGRldj0lLjJmXG4iLAotICAgICAgICAgICAgICAgICAgICB3YWxsLm1lYW4oKSoxZS02LCB3YWxsLm1pbmltdW0oKSoxZS02LCB3YWxsLm1heGltdW0oKSoxZS02LAotICAgICAgICAgICAgICAgICAgICB3YWxsLnN0ZGRldigpKjFlLTYpOworICAgICAgICAgICAgICAgICAgICB3YWxsLmdldE1lYW4oKSoxZS02LCB3YWxsLmdldE1pbigpKjFlLTYsIHdhbGwuZ2V0TWF4KCkqMWUtNiwKKyAgICAgICAgICAgICAgICAgICAgd2FsbC5nZXRTdGREZXYoKSoxZS02KTsKICAgICAgICAgZHByaW50ZihmZCwgIiAgICByYXcgQ1BVIGxvYWQgaW4gdXMgcGVyIG1peCBjeWNsZTpcbiIKICAgICAgICAgICAgICAgICAgICAgIiAgICAgIG1lYW49JS4wZiBtaW49JS4wZiBtYXg9JS4wZiBzdGRkZXY9JS4wZlxuIiwKLSAgICAgICAgICAgICAgICAgICAgbG9hZE5zLm1lYW4oKSoxZS0zLCBsb2FkTnMubWluaW11bSgpKjFlLTMsIGxvYWROcy5tYXhpbXVtKCkqMWUtMywKLSAgICAgICAgICAgICAgICAgICAgbG9hZE5zLnN0ZGRldigpKjFlLTMpOworICAgICAgICAgICAgICAgICAgICBsb2FkTnMuZ2V0TWVhbigpKjFlLTMsIGxvYWROcy5nZXRNaW4oKSoxZS0zLCBsb2FkTnMuZ2V0TWF4KCkqMWUtMywKKyAgICAgICAgICAgICAgICAgICAgbG9hZE5zLmdldFN0ZERldigpKjFlLTMpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGRwcmludGYoZmQsICIgIE5vIEZhc3RNaXhlciBzdGF0aXN0aWNzIGF2YWlsYWJsZSBjdXJyZW50bHlcbiIpOwogICAgIH0KICNpZmRlZiBDUFVfRlJFUVVFTkNZX1NUQVRJU1RJQ1MKICAgICBkcHJpbnRmKGZkLCAiICBDUFUgY2xvY2sgZnJlcXVlbmN5IGluIE1IejpcbiIKICAgICAgICAgICAgICAgICAiICAgIG1lYW49JS4wZiBtaW49JS4wZiBtYXg9JS4wZiBzdGRkZXY9JS4wZlxuIiwKLSAgICAgICAgICAgICAgICBrSHoubWVhbigpKjFlLTMsIGtIei5taW5pbXVtKCkqMWUtMywga0h6Lm1heGltdW0oKSoxZS0zLCBrSHouc3RkZGV2KCkqMWUtMyk7CisgICAgICAgICAgICAgICAga0h6LmdldE1lYW4oKSoxZS0zLCBrSHouZ2V0TWluKCkqMWUtMywga0h6LmdldE1heCgpKjFlLTMsIGtIei5nZXRTdGREZXYoKSoxZS0zKTsKICAgICBkcHJpbnRmKGZkLCAiICBhZGp1c3RlZCBDUFUgbG9hZCBpbiBNSHogKGkuZS4gbm9ybWFsaXplZCBmb3IgQ1BVIGNsb2NrIGZyZXF1ZW5jeSk6XG4iCiAgICAgICAgICAgICAgICAgIiAgICBtZWFuPSUuMWYgbWluPSUuMWYgbWF4PSUuMWYgc3RkZGV2PSUuMWZcbiIsCi0gICAgICAgICAgICAgICAgbG9hZE1Iei5tZWFuKCksIGxvYWRNSHoubWluaW11bSgpLCBsb2FkTUh6Lm1heGltdW0oKSwgbG9hZE1Iei5zdGRkZXYoKSk7CisgICAgICAgICAgICAgICAgbG9hZE1Iei5nZXRNZWFuKCksIGxvYWRNSHouZ2V0TWluKCksIGxvYWRNSHouZ2V0TWF4KCksIGxvYWRNSHouZ2V0U3RkRGV2KCkpOwogI2VuZGlmCiAgICAgaWYgKHRhaWwgIT0gTlVMTCkgewogICAgICAgICBxc29ydCh0YWlsLCBuLCBzaXplb2YodWludDMyX3QpLCBjb21wYXJlX3VpbnQzMl90KTsKICAgICAgICAgLy8gYXNzdW1lIHNhbWUgbnVtYmVyIG9mIHRhaWwgc2FtcGxlcyBvbiBlYWNoIHNpZGUsIGxlZnQgYW5kIHJpZ2h0CiAgICAgICAgIHVpbnQzMl90IGNvdW50ID0gbiAvIGtUYWlsRGVub21pbmF0b3I7Ci0gICAgICAgIENlbnRyYWxUZW5kZW5jeVN0YXRpc3RpY3MgbGVmdCwgcmlnaHQ7CisgICAgICAgIGF1ZGlvX3V0aWxzOjpTdGF0aXN0aWNzPGRvdWJsZT4gbGVmdCwgcmlnaHQ7CiAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7Ci0gICAgICAgICAgICBsZWZ0LnNhbXBsZSh0YWlsW2ldKTsKLSAgICAgICAgICAgIHJpZ2h0LnNhbXBsZSh0YWlsW24gLSAoaSArIDEpXSk7CisgICAgICAgICAgICBsZWZ0LmFkZCh0YWlsW2ldKTsKKyAgICAgICAgICAgIHJpZ2h0LmFkZCh0YWlsW24gLSAoaSArIDEpXSk7CiAgICAgICAgIH0KICAgICAgICAgZHByaW50ZihmZCwgIiAgRGlzdHJpYnV0aW9uIG9mIG1peCBjeWNsZSB0aW1lcyBpbiBtcyBmb3IgdGhlIHRhaWxzICIKICAgICAgICAgICAgICAgICAgICAgIig+IH4zIHN0ZGRldiBvdXRsaWVycyk6XG4iCiAgICAgICAgICAgICAgICAgICAgICIgICAgbGVmdCB0YWlsOiBtZWFuPSUuMmYgbWluPSUuMmYgbWF4PSUuMmYgc3RkZGV2PSUuMmZcbiIKICAgICAgICAgICAgICAgICAgICAgIiAgICByaWdodCB0YWlsOiBtZWFuPSUuMmYgbWluPSUuMmYgbWF4PSUuMmYgc3RkZGV2PSUuMmZcbiIsCi0gICAgICAgICAgICAgICAgICAgIGxlZnQubWVhbigpKjFlLTYsIGxlZnQubWluaW11bSgpKjFlLTYsIGxlZnQubWF4aW11bSgpKjFlLTYsIGxlZnQuc3RkZGV2KCkqMWUtNiwKLSAgICAgICAgICAgICAgICAgICAgcmlnaHQubWVhbigpKjFlLTYsIHJpZ2h0Lm1pbmltdW0oKSoxZS02LCByaWdodC5tYXhpbXVtKCkqMWUtNiwKLSAgICAgICAgICAgICAgICAgICAgcmlnaHQuc3RkZGV2KCkqMWUtNik7CisgICAgICAgICAgICAgICAgICAgIGxlZnQuZ2V0TWVhbigpKjFlLTYsIGxlZnQuZ2V0TWluKCkqMWUtNiwgbGVmdC5nZXRNYXgoKSoxZS02LCBsZWZ0LmdldFN0ZERldigpKjFlLTYsCisgICAgICAgICAgICAgICAgICAgIHJpZ2h0LmdldE1lYW4oKSoxZS02LCByaWdodC5nZXRNaW4oKSoxZS02LCByaWdodC5nZXRNYXgoKSoxZS02LAorICAgICAgICAgICAgICAgICAgICByaWdodC5nZXRTdGREZXYoKSoxZS02KTsKICAgICAgICAgZGVsZXRlW10gdGFpbDsKICAgICB9CiAjZW5kaWYKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXJEdW1wU3RhdGUuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXJEdW1wU3RhdGUuaAppbmRleCA4ZWYzMWQxLi45YjkxY2JjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyRHVtcFN0YXRlLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlckR1bXBTdGF0ZS5oCkBAIC0xOCw2ICsxOCw3IEBACiAjZGVmaW5lIEFORFJPSURfQVVESU9fRkFTVF9NSVhFUl9EVU1QX1NUQVRFX0gKIAogI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL1RpbWVzdGFtcFZlcmlmaWVyLmg+CiAjaW5jbHVkZSAiQ29uZmlndXJhdGlvbi5oIgogI2luY2x1ZGUgIkZhc3RUaHJlYWREdW1wU3RhdGUuaCIKICNpbmNsdWRlICJGYXN0TWl4ZXJTdGF0ZS5oIgpAQCAtNjYsNiArNjcsNyBAQAogCiAgICAgdm9pZCBkdW1wKGludCBmZCkgY29uc3Q7ICAgIC8vIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBvbiBhIHN0YWJsZSBjb3B5LCBub3QgdGhlIG9yaWdpbmFsCiAKKyAgICBkb3VibGUgICBtTGF0ZW5jeU1zID0gMC47ICAgLy8gbWVhc3VyZWQgbGF0ZW5jeSwgZGVmYXVsdCBvZiAwIGlmIG5vIHZhbGlkIHRpbWVzdGFtcCByZWFkLgogICAgIHVpbnQzMl90IG1Xcml0ZVNlcXVlbmNlOyAgICAvLyBpbmNyZW1lbnRlZCBiZWZvcmUgYW5kIGFmdGVyIGVhY2ggd3JpdGUoKQogICAgIHVpbnQzMl90IG1GcmFtZXNXcml0dGVuOyAgICAvLyB0b3RhbCBudW1iZXIgb2YgZnJhbWVzIHdyaXR0ZW4gc3VjY2Vzc2Z1bGx5CiAgICAgdWludDMyX3QgbU51bVRyYWNrczsgICAgICAgIC8vIHRvdGFsIG51bWJlciBvZiBhY3RpdmUgZmFzdCB0cmFja3MKQEAgLTc0LDYgKzc2LDkgQEAKICAgICBzaXplX3QgICBtRnJhbWVDb3VudDsKICAgICB1aW50MzJfdCBtVHJhY2tNYXNrOyAgICAgICAgLy8gbWFzayBvZiBhY3RpdmUgdHJhY2tzCiAgICAgRmFzdFRyYWNrRHVtcCAgIG1UcmFja3NbRmFzdE1peGVyU3RhdGU6OmtNYXhGYXN0VHJhY2tzXTsKKworICAgIC8vIEZvciB0aW1lc3RhbXAgc3RhdGlzdGljcy4KKyAgICBUaW1lc3RhbXBWZXJpZmllcjxpbnQ2NF90IC8qIGZyYW1lIGNvdW50ICovLCBpbnQ2NF90IC8qIHRpbWUgbnMgKi8+IG1UaW1lc3RhbXBWZXJpZmllcjsKIH07CiAKIH0gICAvLyBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyU3RhdGUuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlclN0YXRlLmNwcAppbmRleCAzNmQ4ZWVmLi5iOTg4NDJkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyU3RhdGUuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXJTdGF0ZS5jcHAKQEAgLTM1LDcgKzM1LDcgQEAKIEZhc3RNaXhlclN0YXRlOjpGYXN0TWl4ZXJTdGF0ZSgpIDogRmFzdFRocmVhZFN0YXRlKCksCiAgICAgLy8gbUZhc3RUcmFja3MKICAgICBtRmFzdFRyYWNrc0dlbigwKSwgbVRyYWNrTWFzaygwKSwgbU91dHB1dFNpbmsoTlVMTCksIG1PdXRwdXRTaW5rR2VuKDApLAotICAgIG1GcmFtZUNvdW50KDApLCBtVGVlU2luayhOVUxMKQorICAgIG1GcmFtZUNvdW50KDApCiB7CiAgICAgaW50IG9rID0gcHRocmVhZF9vbmNlKCZzTWF4RmFzdFRyYWNrc09uY2UsIHNNYXhGYXN0VHJhY2tzSW5pdCk7CiAgICAgaWYgKG9rICE9IDApIHsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXJTdGF0ZS5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlclN0YXRlLmgKaW5kZXggMmJlMWU5MS4uYzdmY2JkOCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlclN0YXRlLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlclN0YXRlLmgKQEAgLTc3LDkgKzc3LDYgQEAKICAgICAgICAgV1JJVEUgPSAweDEwLCAgICAgICAgICAgLy8gd3JpdGUgdG8gb3V0cHV0IHNpbmsKICAgICAgICAgTUlYX1dSSVRFID0gMHgxODsgICAgICAgLy8gbWl4IHRyYWNrcyBhbmQgd3JpdGUgdG8gb3V0cHV0IHNpbmsKIAotICAgIC8vIFRoaXMgbWlnaHQgYmUgYSBvbmUtdGltZSBjb25maWd1cmF0aW9uIHJhdGhlciB0aGFuIHBlci1zdGF0ZQotICAgIE5CQUlPX1NpbmsqIG1UZWVTaW5rOyAgICAgICAvLyBpZiBub24tTlVMTCwgdGhlbiBkdXBsaWNhdGUgd3JpdGUoKXMgdG8gdGhpcyBub24tYmxvY2tpbmcgc2luawotCiAgICAgLy8gbmV2ZXIgcmV0dXJucyBOVUxMOyBhc3NlcnRzIGlmIGNvbW1hbmQgaXMgaW52YWxpZAogICAgIHN0YXRpYyBjb25zdCBjaGFyICpjb21tYW5kVG9TdHJpbmcoQ29tbWFuZCBjb21tYW5kKTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RUaHJlYWQuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RUaHJlYWQuY3BwCmluZGV4IGRjMTU0ODcuLjA0YjMyYzIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0VGhyZWFkLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdFRocmVhZC5jcHAKQEAgLTIyLDYgKzIyLDcgQEAKICNpbmNsdWRlICJDb25maWd1cmF0aW9uLmgiCiAjaW5jbHVkZSA8bGludXgvZnV0ZXguaD4KICNpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2Nsb2NrLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL2F0b21pYy5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CkBAIC02NSw4ICs2Niw2IEBACiAgICAgLyogbU1lYXN1cmVkV2FybXVwVHMoezAsIDB9KSwgKi8KICAgICBtV2FybXVwQ3ljbGVzKDApLAogICAgIG1XYXJtdXBDb25zZWN1dGl2ZUluUmFuZ2VDeWNsZXMoMCksCi0gICAgLy8gbUR1bW15TkJMb2dXcml0ZXIKLSAgICBtTkJMb2dXcml0ZXIoJm1EdW1teU5CTG9nV3JpdGVyKSwKICAgICBtVGltZXN0YW1wU3RhdHVzKElOVkFMSURfT1BFUkFUSU9OKSwKIAogICAgIG1Db21tYW5kKEZhc3RUaHJlYWRTdGF0ZTo6SU5JVElBTCksCkBAIC05Myw3ICs5Miw3IEBACiB7CiAgICAgLy8gTE9HVCBub3cgd29ya3MgZXZlbiBpZiB0bE5CTG9nV3JpdGVyIGlzIG51bGxwdHIsIGJ1dCB3ZSdyZSBjb25zaWRlcmluZyBjaGFuZ2luZyB0aGF0LAogICAgIC8vIHNvIHRoaXMgaW5pdGlhbGl6YXRpb24gcGVybWl0cyBhIGZ1dHVyZSBjaGFuZ2UgdG8gcmVtb3ZlIHRoZSBjaGVjayBmb3IgbnVsbHB0ci4KLSAgICB0bE5CTG9nV3JpdGVyID0gJm1EdW1teU5CTG9nV3JpdGVyOworICAgIHRsTkJMb2dXcml0ZXIgPSBtRHVtbXlOQkxvZ1dyaXRlci5nZXQoKTsKICAgICBmb3IgKDs7KSB7CiAKICAgICAgICAgLy8gZWl0aGVyIG5hbm9zbGVlcCwgc2NoZWRfeWllbGQsIG9yIGJ1c3kgd2FpdApAQCAtMTIzLDkgKzEyMiw5IEBACiAKICAgICAgICAgICAgIC8vIEFzIHNvb24gYXMgcG9zc2libGUgb2YgbGVhcm5pbmcgb2YgYSBuZXcgZHVtcCBhcmVhLCBzdGFydCB1c2luZyBpdAogICAgICAgICAgICAgbUR1bXBTdGF0ZSA9IG5leHQtPm1EdW1wU3RhdGUgIT0gTlVMTCA/IG5leHQtPm1EdW1wU3RhdGUgOiBtRHVtbXlEdW1wU3RhdGU7Ci0gICAgICAgICAgICBtTkJMb2dXcml0ZXIgPSBuZXh0LT5tTkJMb2dXcml0ZXIgIT0gTlVMTCA/IG5leHQtPm1OQkxvZ1dyaXRlciA6ICZtRHVtbXlOQkxvZ1dyaXRlcjsKLSAgICAgICAgICAgIHNldE5CTG9nV3JpdGVyKG1OQkxvZ1dyaXRlcik7ICAgLy8gRmFzdE1peGVyIGluZm9ybXMgaXRzIEF1ZGlvTWl4ZXIsIEZhc3RDYXB0dXJlIGlnbm9yZXMKLSAgICAgICAgICAgIHRsTkJMb2dXcml0ZXIgPSBtTkJMb2dXcml0ZXI7CisgICAgICAgICAgICB0bE5CTG9nV3JpdGVyID0gbmV4dC0+bU5CTG9nV3JpdGVyICE9IE5VTEwgPworICAgICAgICAgICAgICAgICAgICBuZXh0LT5tTkJMb2dXcml0ZXIgOiBtRHVtbXlOQkxvZ1dyaXRlci5nZXQoKTsKKyAgICAgICAgICAgIHNldE5CTG9nV3JpdGVyKHRsTkJMb2dXcml0ZXIpOyAvLyBGYXN0TWl4ZXIgaW5mb3JtcyBpdHMgQXVkaW9NaXhlciwgRmFzdENhcHR1cmUgaWdub3JlcwogCiAgICAgICAgICAgICAvLyBXZSB3YW50IHRvIGFsd2F5cyBoYXZlIGEgdmFsaWQgcmVmZXJlbmNlIHRvIHRoZSBwcmV2aW91cyAobm9uLWlkbGUpIHN0YXRlLgogICAgICAgICAgICAgLy8gSG93ZXZlciwgdGhlIHN0YXRlIHF1ZXVlIG9ubHkgZ3VhcmFudGVlcyBhY2Nlc3MgdG8gY3VycmVudCBhbmQgcHJldmlvdXMgc3RhdGVzLgpAQCAtMjYwLDYgKzI1OSw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBtSXNXYXJtID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgIG1EdW1wU3RhdGUtPm1NZWFzdXJlZFdhcm11cFRzID0gbU1lYXN1cmVkV2FybXVwVHM7CiAgICAgICAgICAgICAgICAgICAgICAgICBtRHVtcFN0YXRlLT5tV2FybXVwQ3ljbGVzID0gbVdhcm11cEN5Y2xlczsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSBtZWFzdXJlZFdhcm11cE1zID0gKG1NZWFzdXJlZFdhcm11cFRzLnR2X3NlYyAqIDFlMykgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobU1lYXN1cmVkV2FybXVwVHMudHZfbnNlYyAqIDFlLTYpOworICAgICAgICAgICAgICAgICAgICAgICAgTE9HX1dBUk1VUF9USU1FKG1lYXN1cmVkV2FybXVwTXMpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIG1TbGVlcE5zID0gLTE7CkBAIC0yNzAsNiArMjcyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJ1bmRlcnJ1bjogdGltZSBzaW5jZSBsYXN0IGN5Y2xlICVkLiUwM2xkIHNlYyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpIHNlYywgbnNlYyAvIDEwMDAwMDBMKTsKICAgICAgICAgICAgICAgICAgICAgICAgIG1EdW1wU3RhdGUtPm1VbmRlcnJ1bnMrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPR19VTkRFUlJVTihhdWRpb191dGlsc19uc19mcm9tX3RpbWVzcGVjKCZuZXdUcykpOwogICAgICAgICAgICAgICAgICAgICAgICAgbUlnbm9yZU5leHRPdmVycnVuID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuc2VjIDwgbU92ZXJydW5OcykgewogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1JZ25vcmVOZXh0T3ZlcnJ1bikgewpAQCAtMjc5LDYgKzI4Miw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIm92ZXJydW46IHRpbWUgc2luY2UgbGFzdCBjeWNsZSAlZC4lMDNsZCBzZWMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgc2VjLCBuc2VjIC8gMTAwMDAwMEwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1EdW1wU3RhdGUtPm1PdmVycnVucysrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPR19PVkVSUlVOKGF1ZGlvX3V0aWxzX25zX2Zyb21fdGltZXNwZWMoJm5ld1RzKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGZvcmNlcyBhIG1pbmltdW0gY3ljbGUgdGltZS4gSXQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgLSBjb21wZW5zYXRlcyBmb3IgYW4gYXVkaW8gSEFMIHdpdGggaml0dGVyIGR1ZSB0byBzYW1wbGUgcmF0ZSBjb252ZXJzaW9uCkBAIC0zMzksNiArMzQzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgLy8gdGhlc2Ugc3RvcmVzICMxLCAjMiwgIzMgYXJlIG5vdCBhdG9taWMgd2l0aCByZXNwZWN0IHRvIGVhY2ggb3RoZXIsCiAgICAgICAgICAgICAgICAgICAgIC8vIG9yIHdpdGggcmVzcGVjdCB0byBzdG9yZSAjNCBiZWxvdwogICAgICAgICAgICAgICAgICAgICBtRHVtcFN0YXRlLT5tTW9ub3RvbmljTnNbaV0gPSBtb25vdG9uaWNOczsKKyAgICAgICAgICAgICAgICAgICAgTE9HX1dPUktfVElNRShtb25vdG9uaWNOcyk7CiAgICAgICAgICAgICAgICAgICAgIG1EdW1wU3RhdGUtPm1Mb2FkTnNbaV0gPSBsb2FkTnM7CiAjaWZkZWYgQ1BVX0ZSRVFVRU5DWV9TVEFUSVNUSUNTCiAgICAgICAgICAgICAgICAgICAgIG1EdW1wU3RhdGUtPm1DcHVrSHpbaV0gPSBrSHo7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdFRocmVhZC5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RUaHJlYWQuaAppbmRleCAyYTcxNDE0Li4zZjZiMjA2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdFRocmVhZC5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0VGhyZWFkLmgKQEAgLTc4LDEyICs3OCwxMSBAQAogICAgIHVuc2lnbmVkICAgICAgICBtQ29sZEdlbjsgICAgICAgLy8gbGFzdCBvYnNlcnZlZCBtQ29sZEdlbgogICAgIGJvb2wgICAgICAgICAgICBtSXNXYXJtOyAgICAgICAgLy8gdHJ1ZSBtZWFucyByZWFkeSB0byBtaXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmYWxzZSBtZWFucyB3YWl0IGZvciB3YXJtdXAgYmVmb3JlIG1peGluZwotICAgIHN0cnVjdCB0aW1lc3BlYyBtTWVhc3VyZWRXYXJtdXBUczsgIC8vIGhvdyBsb25nIGRpZCBpdCB0YWtlIGZvciB3YXJtdXAgdG8gY29tcGxldGUKLSAgICB1aW50MzJfdCAgICAgICAgbVdhcm11cEN5Y2xlczsgIC8vIGNvdW50ZXIgb2YgbnVtYmVyIG9mIGxvb3AgY3ljbGVzIGR1cmluZyB3YXJtdXAgcGhhc2UKLSAgICB1aW50MzJfdCAgICAgICAgbVdhcm11cENvbnNlY3V0aXZlSW5SYW5nZUN5Y2xlczsgICAgLy8gbnVtYmVyIG9mIGNvbnNlY3V0aXZlIGN5Y2xlcyBpbiByYW5nZQotICAgIE5CTG9nOjpXcml0ZXIgICBtRHVtbXlOQkxvZ1dyaXRlcjsKLSAgICBOQkxvZzo6V3JpdGVyKiAgbU5CTG9nV3JpdGVyOyAgIC8vIGFsd2F5cyBub24tbnVsbHB0cjogcmVhbCBOQkxvZzo6V3JpdGVyKiBvciAmbUR1bW15TkJMb2dXcml0ZXIKLSAgICBzdGF0dXNfdCAgICAgICAgbVRpbWVzdGFtcFN0YXR1czsKKyAgICBzdHJ1Y3QgdGltZXNwZWMgICBtTWVhc3VyZWRXYXJtdXBUczsgIC8vIGhvdyBsb25nIGRpZCBpdCB0YWtlIGZvciB3YXJtdXAgdG8gY29tcGxldGUKKyAgICB1aW50MzJfdCAgICAgICAgICBtV2FybXVwQ3ljbGVzOyAgLy8gY291bnRlciBvZiBudW1iZXIgb2YgbG9vcCBjeWNsZXMgZHVyaW5nIHdhcm11cCBwaGFzZQorICAgIHVpbnQzMl90ICAgICAgICAgIG1XYXJtdXBDb25zZWN1dGl2ZUluUmFuZ2VDeWNsZXM7ICAgIC8vIG51bWJlciBvZiBjb25zZWN1dGl2ZSBjeWNsZXMgaW4gcmFuZ2UKKyAgICBjb25zdCBzcDxOQkxvZzo6V3JpdGVyPiBtRHVtbXlOQkxvZ1dyaXRlcntuZXcgTkJMb2c6OldyaXRlcigpfTsKKyAgICBzdGF0dXNfdCAgICAgICAgICBtVGltZXN0YW1wU3RhdHVzOwogCiAgICAgRmFzdFRocmVhZFN0YXRlOjpDb21tYW5kIG1Db21tYW5kOwogICAgIGJvb2wgICAgICAgICAgICBtQXR0ZW1wdGVkV3JpdGU7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvTW1hcFRyYWNrcy5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL01tYXBUcmFja3MuaAppbmRleCA2ZjU0NmMzLi45NjhkNWFhIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvTW1hcFRyYWNrcy5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9NbWFwVHJhY2tzLmgKQEAgLTI4LDYgKzI4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzT3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBwaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FKTsKQEAgLTM5LDggKzQwLDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCB0cmlnZ2VyU2Vzc2lvbik7CiAgICAgdmlydHVhbCB2b2lkICAgICAgICBzdG9wKCk7CiAgICAgdmlydHVhbCBib29sICAgICAgICBpc0Zhc3RUcmFjaygpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgICAgICAgICAgICBib29sICAgICAgICBpc0RpcmVjdCgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIHRydWU7IH0KIAotICAgICBzdGF0aWMgdm9pZCAgICAgICAgYXBwZW5kRHVtcEhlYWRlcihTdHJpbmc4JiByZXN1bHQpOworICAgICAgICAgICAgdm9pZCAgICAgICAgYXBwZW5kRHVtcEhlYWRlcihTdHJpbmc4JiByZXN1bHQpOwogICAgICAgICAgICAgdm9pZCAgICAgICAgYXBwZW5kRHVtcChTdHJpbmc4JiByZXN1bHQsIGJvb2wgYWN0aXZlKTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJvdGVjdGVkIGJ5IE1NYXBUaHJlYWQ6Om1Mb2NrCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvTkJBSU9fVGVlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9OQkFJT19UZWUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzMDgzZDUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvTkJBSU9fVGVlLmNwcApAQCAtMCwwICsxLDUxNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiTkJBSU9fVGVlIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxkZXF1ZT4KKyNpbmNsdWRlIDxkaXJlbnQuaD4KKyNpbmNsdWRlIDxmdXR1cmU+CisjaW5jbHVkZSA8bGlzdD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxhdWRpb191dGlscy9mb3JtYXQuaD4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9zbmRmaWxlLmg+CisjaW5jbHVkZSA8bWVkaWEvbmJhaW8vUGlwZVJlYWRlci5oPgorCisjaW5jbHVkZSAiQ29uZmlndXJhdGlvbi5oIgorI2luY2x1ZGUgIk5CQUlPX1RlZS5oIgorCisvLyBFbmFibGVkIHdpdGggVEVFX1NJTksgaW4gQ29uZmlndXJhdGlvbi5oCisjaWZkZWYgVEVFX1NJTksKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKgorIFRlZSBmaWxlbmFtZXMgZ2VuZXJhdGVkIGFzIGZvbGxvd3M6CisKKyAiYWZ0ZWVfRGF0ZV9UaHJlYWRJZF9DX3JlYXNvbi53YXYiIFJlY29yZFRocmVhZAorICJhZnRlZV9EYXRlX1RocmVhZElkX01fcmVhc29uLndhdiIgTWl4ZXJUaHJlYWQgKE5vcm1hbCkKKyAiYWZ0ZWVfRGF0ZV9UaHJlYWRJZF9GX3JlYXNvbi53YXYiIE1peGVyVGhyZWFkIChGYXN0KQorICJhZnRlZV9EYXRlX1RocmVhZElkX1RyYWNrSWRfUl9yZWFzb24ud2F2IiBSZWNvcmRUcmFjaworICJhZnRlZV9EYXRlX1RocmVhZElkX1RyYWNrSWRfVHJhY2tOYW1lX1RfcmVhc29uLndhdiIgUGxheWJhY2tUcmFjaworCisgd2hlcmUgRGF0ZSA9IFlZWVltbWRkX0hITU1TU19NU0VDCisKKyB3aGVyZSBSZWFzb24gPSBbIERUT1IgfCBEVU1QIHwgUkVNT1ZFIF0KKworIEV4YW1wbGVzOgorICBhZnRlZV8yMDE4MDQyNF8xNTM4MTFfMDM4XzEzXzU3XzJfVF9SRU1PVkUud2F2CisgIGFmdGVlXzIwMTgwNDI0XzE1MzgxMV8yMThfMTNfNTdfMl9UX1JFTU9WRS53YXYKKyAgYWZ0ZWVfMjAxODA0MjRfMTUzODExXzM3OF8xM181N18yX1RfUkVNT1ZFLndhdgorICBhZnRlZV8yMDE4MDQyNF8xNTM4MjVfMTQ3XzYyX0NfRFVNUC53YXYKKyAgYWZ0ZWVfMjAxODA0MjRfMTUzODI1XzE0OF82Ml81OV9SX0RVTVAud2F2CisgIGFmdGVlXzIwMTgwNDI0XzE1MzgyNV8xNDlfMTNfRl9EVU1QLndhdgorICBhZnRlZV8yMDE4MDQyNF8xNTM4NDJfMTI1XzYyXzU5X1JfUkVNT1ZFLndhdgorICBhZnRlZV8yMDE4MDQyNF8xNTM4NDJfMTY4XzYyX0NfRFRPUi53YXYKKyovCisKK3N0YXRpYyBjb25zdGV4cHIgY2hhciBERUZBVUxUX1BSRUZJWFtdID0gImFmdGVlXyI7CitzdGF0aWMgY29uc3RleHByIGNoYXIgREVGQVVMVF9ESVJFQ1RPUllbXSA9ICIvZGF0YS9taXNjL2F1ZGlvc2VydmVyIjsKK3N0YXRpYyBjb25zdGV4cHIgc2l6ZV90IERFRkFVTFRfVEhSRUFEUE9PTF9TSVpFID0gODsKKworLyoqIEF1ZGlvRmlsZUhhbmRsZXIgbWFuYWdlcyB0ZW1wb3JhcnkgYXVkaW8gd2F2IGZpbGVzIHdpdGggYSBsZWFzdCByZWNlbnRseSBjcmVhdGVkCisgICAgcmV0ZW50aW9uIHBvbGljeS4KKworICAgIFRoZSB0ZW1wb3JhcnkgZmlsZW5hbWVzIGFyZSBzeXN0ZW1hdGljYWxseSBnZW5lcmF0ZWQuIEEgY29tbW9uIGZpbGVuYW1lIHByZWZpeCwKKyAgICBzdG9yYWdlIGRpcmVjdG9yeSwgYW5kIGNvbmN1cnJlbmN5IHBvb2wgYXJlIHBhc3NlZCBpbiBvbiBjcmVhdGluZyB0aGUgb2JqZWN0LgorCisgICAgVGVtcG9yYXJ5IGZpbGVzIGFyZSBjcmVhdGVkIGJ5ICJjcmVhdGUiLCB3aGljaCByZXR1cm5zIGEgZmlsZW5hbWUgZ2VuZXJhdGVkIGJ5CisKKyAgICBwcmVmaXggKyAxNCBjaGFyIGRhdGUgKyBzdWZmaXgKKworICAgIFRPRE8gTW92ZSB0byBhdWRpb191dGlscy4KKyAgICBUT0RPIEF2b2lkIHBvaW50aW5nIHR3byBBdWRpb0ZpbGVIYW5kbGVycyB0byB0aGUgc2FtZSBkaXJlY3RvcnkgYW5kIHByZWZpeAorICAgIGFzIHdlIGRvbid0IGhhdmUgYSBwcmVmaXggc3BlY2lmaWMgbG9jayBmaWxlLiAqLworCitjbGFzcyBBdWRpb0ZpbGVIYW5kbGVyIHsKK3B1YmxpYzoKKworICAgIEF1ZGlvRmlsZUhhbmRsZXIoY29uc3Qgc3RkOjpzdHJpbmcgJnByZWZpeCwgY29uc3Qgc3RkOjpzdHJpbmcgJmRpcmVjdG9yeSwgc2l6ZV90IHBvb2wpCisgICAgICAgIDogbVRocmVhZFBvb2wocG9vbCkKKyAgICAgICAgLCBtUHJlZml4KHByZWZpeCkKKyAgICB7CisgICAgICAgICh2b2lkKXNldERpcmVjdG9yeShkaXJlY3RvcnkpOworICAgIH0KKworICAgIC8qKiByZXR1cm5zIGZpbGVuYW1lIG9mIGNyZWF0ZWQgYXVkaW8gZmlsZSwgZWxzZSBlbXB0eSBzdHJpbmcgb24gZmFpbHVyZS4gKi8KKyAgICBzdGQ6OnN0cmluZyBjcmVhdGUoCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHNzaXplX3QgLyogZnJhbWVzX3JlYWQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICogLyogYnVmZmVyICovLCBzaXplX3QgLyogc2l6ZV9pbl9mcmFtZXMgKi8pPiByZWFkZXIsCisgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAorICAgICAgICAgICAgdWludDMyX3QgY2hhbm5lbENvdW50LAorICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJnN1ZmZpeCk7CisKK3ByaXZhdGU6CisgICAgLyoqIHNldHMgdGhlIGN1cnJlbnQgZGlyZWN0b3J5LiB0aGlzIGlzIGN1cnJlbnRseSBwcml2YXRlIHRvIGF2b2lkIGNvbmZ1c2lvbgorICAgICAgICB3aGVuIGNoYW5naW5nIHdoaWxlIHBlbmRpbmcgb3BlcmF0aW9ucyBhcmUgb2NjdXJyaW5nIChpdCdzIG9rYXksIGJ1dAorICAgICAgICB3ZWFrbHkgc3luY2hyb25pemVkKS4gKi8KKyAgICBzdGF0dXNfdCBzZXREaXJlY3RvcnkoY29uc3Qgc3RkOjpzdHJpbmcgJmRpcmVjdG9yeSk7CisKKyAgICAvKiogY2xlYW5zIGN1cnJlbnQgZGlyZWN0b3J5IGFuZCByZXR1cm5zIHRoZSBkaXJlY3RvcnkgbmFtZSBkb25lLiAqLworICAgIHN0YXR1c190IGNsZWFuKHN0ZDo6c3RyaW5nICpkaXIgPSBudWxscHRyKTsKKworICAgIC8qKiBjcmVhdGVzIGFuIGF1ZGlvIGZpbGUgZnJvbSBhIHJlYWRlciBmdW5jdG9yIHBhc3NlZCBpbi4gKi8KKyAgICBzdGF0dXNfdCBjcmVhdGVJbnRlcm5hbCgKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248c3NpemVfdCAvKiBmcmFtZXNfcmVhZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiAvKiBidWZmZXIgKi8sIHNpemVfdCAvKiBzaXplX2luX2ZyYW1lcyAqLyk+IHJlYWRlciwKKyAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCisgICAgICAgICAgICB1aW50MzJfdCBjaGFubmVsQ291bnQsCisgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmZmlsZW5hbWUpOworCisgICAgc3RhdGljIGJvb2wgaXNEaXJlY3RvcnlWYWxpZChjb25zdCBzdGQ6OnN0cmluZyAmZGlyZWN0b3J5KSB7CisgICAgICAgIHJldHVybiBkaXJlY3Rvcnkuc2l6ZSgpID4gMCAmJiBkaXJlY3RvcnlbMF0gPT0gJy8nOworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIGdlbmVyYXRlRmlsZW5hbWUoY29uc3Qgc3RkOjpzdHJpbmcgJnN1ZmZpeCkgY29uc3QgeworICAgICAgICBjaGFyIGZpbGVUaW1lW3NpemVvZigiWVlZWW1tZGRfSEhNTVNTX1wwIildOworICAgICAgICBzdHJ1Y3QgdGltZXZhbCB0djsKKyAgICAgICAgZ2V0dGltZW9mZGF5KCZ0diwgTlVMTCk7CisgICAgICAgIHN0cnVjdCB0bSB0bTsKKyAgICAgICAgbG9jYWx0aW1lX3IoJnR2LnR2X3NlYywgJnRtKTsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihzdHJmdGltZShmaWxlVGltZSwgc2l6ZW9mKGZpbGVUaW1lKSwgIiVZJW0lZF8lSCVNJVNfIiwgJnRtKSA9PSAwLAorICAgICAgICAgICAgImluY29ycmVjdCBmaWxlVGltZSBidWZmZXIiKTsKKyAgICAgICAgY2hhciBtc2VjWzRdOworICAgICAgICAodm9pZClzbnByaW50Zihtc2VjLCBzaXplb2YobXNlYyksICIlMDNkIiwgKGludCkodHYudHZfdXNlYyAvIDEwMDApKTsKKyAgICAgICAgcmV0dXJuIG1QcmVmaXggKyBmaWxlVGltZSArIG1zZWMgKyBzdWZmaXggKyAiLndhdiI7CisgICAgfQorCisgICAgYm9vbCBpc01hbmFnZWRGaWxlbmFtZShjb25zdCBjaGFyICpuYW1lKSB7CisgICAgICAgIGNvbnN0ZXhwciBzaXplX3QgRklMRU5BTUVfTEVOX0RBVEUgPSA0ICsgMiArIDIgLy8gJVklbSVkJQorICAgICAgICAgICAgKyAxICsgMiArIDIgKyAyIC8vIF9IJU0lUworICAgICAgICAgICAgKyAxICsgMzsgLy9fTVNFQworICAgICAgICBjb25zdCBzaXplX3QgcHJlZml4TGVuID0gbVByZWZpeC5zaXplKCk7CisgICAgICAgIGNvbnN0IHNpemVfdCBuYW1lTGVuID0gc3RybGVuKG5hbWUpOworCisgICAgICAgIC8vIHJlamVjdCBvbiBzaXplLCBwcmVmaXgsIGFuZCAud2F2CisgICAgICAgIGlmIChuYW1lTGVuIDwgcHJlZml4TGVuICsgRklMRU5BTUVfTEVOX0RBVEUgKyA0IC8qIC53YXYgKi8KKyAgICAgICAgICAgICB8fCBzdHJuY21wKG5hbWUsIG1QcmVmaXguY19zdHIoKSwgcHJlZml4TGVuKSAhPSAwCisgICAgICAgICAgICAgfHwgc3RyY21wKG5hbWUgKyBuYW1lTGVuIC0gNCwgIi53YXYiKSAhPSAwKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyB2YWxpZGF0ZSBkYXRlIHBvcnRpb24KKyAgICAgICAgY29uc3QgY2hhciAqZGF0ZSA9IG5hbWUgKyBwcmVmaXhMZW47CisgICAgICAgIHJldHVybiBzdGQ6OmFsbF9vZihkYXRlLCBkYXRlICsgOCwgaXNkaWdpdCkKKyAgICAgICAgICAgICYmIGRhdGVbOF0gPT0gJ18nCisgICAgICAgICAgICAmJiBzdGQ6OmFsbF9vZihkYXRlICsgOSwgZGF0ZSArIDE1LCBpc2RpZ2l0KQorICAgICAgICAgICAgJiYgZGF0ZVsxNV0gPT0gJ18nCisgICAgICAgICAgICAmJiBzdGQ6OmFsbF9vZihkYXRlICsgMTYsIGRhdGUgKyAxOSwgaXNkaWdpdCk7CisgICAgfQorCisgICAgLy8geWV0IGFub3RoZXIgVGhyZWFkUG9vbCBpbXBsZW1lbnRhdGlvbi4KKyAgICBjbGFzcyBUaHJlYWRQb29sIHsKKyAgICBwdWJsaWM6CisgICAgICAgIFRocmVhZFBvb2woc2l6ZV90IHNpemUpCisgICAgICAgICAgICA6IG1UaHJlYWRQb29sU2l6ZShzaXplKQorICAgICAgICB7IH0KKworICAgICAgICAvKiogbGF1bmNoZXMgdGFzayAibmFtZSIgd2l0aCBhc3NvY2lhdGVkIGZ1bmN0aW9uICJmdW5jIi4KKyAgICAgICAgICAgIGlmIHRoZSB0aHJlYWRwb29sIGlzIGV4aGF1c3RlZCwgaXQgd2lsbCBsYXVuY2ggb24gY2FsbGluZyBmdW5jdGlvbiAqLworICAgICAgICBzdGF0dXNfdCBsYXVuY2goY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsIHN0ZDo6ZnVuY3Rpb248c3RhdHVzX3QoKT4gZnVuYyk7CisKKyAgICBwcml2YXRlOgorICAgICAgICBzdGQ6Om11dGV4IG1Mb2NrOworICAgICAgICBzdGQ6Omxpc3Q8c3RkOjpwYWlyPAorICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nLCBzdGQ6OmZ1dHVyZTxzdGF0dXNfdD4+PiBtRnV0dXJlczsgLy8gR1VBUkRFRF9CWShtTG9jaykKKworICAgICAgICBjb25zdCBzaXplX3QgbVRocmVhZFBvb2xTaXplOworICAgIH0gbVRocmVhZFBvb2w7CisKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBtUHJlZml4OworICAgIHN0ZDo6bXV0ZXggbUxvY2s7CisgICAgc3RkOjpzdHJpbmcgbURpcmVjdG9yeTsgICAgICAgICAvLyBHVUFSREVEX0JZKG1Mb2NrKQorICAgIHN0ZDo6ZGVxdWU8c3RkOjpzdHJpbmc+IG1GaWxlczsgLy8gR1VBUkRFRF9CWShtTG9jaykgIHNvcnRlZCBsaXN0IG9mIGZpbGVzIGJ5IGNyZWF0aW9uIHRpbWUKKworICAgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IEZSQU1FU19QRVJfUkVBRCA9IDEwMjQ7CisgICAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3QgTUFYX0ZJTEVTX1JFQUQgPSAxMDI0OworICAgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IE1BWF9GSUxFU19LRUVQID0gMzI7Cit9OworCisvKiBzdGF0aWMgKi8KK3ZvaWQgTkJBSU9fVGVlOjpOQkFJT19UZWVJbXBsOjpkdW1wVGVlKAorICAgICAgICBpbnQgZmQsIGNvbnN0IE5CQUlPX1NpbmtTb3VyY2UgJnNpbmtTb3VyY2UsIGNvbnN0IHN0ZDo6c3RyaW5nICZzdWZmaXgpCit7CisgICAgLy8gU2luZ2xldG9uLiBDb25zdHJ1Y3RlZCB0aHJlYWQtc2FmZSBvbiBmaXJzdCBjYWxsLCBuZXZlciBkZXN0cm95ZWQuCisgICAgc3RhdGljIEF1ZGlvRmlsZUhhbmRsZXIgYXVkaW9GaWxlSGFuZGxlcigKKyAgICAgICAgICAgIERFRkFVTFRfUFJFRklYLCBERUZBVUxUX0RJUkVDVE9SWSwgREVGQVVMVF9USFJFQURQT09MX1NJWkUpOworCisgICAgYXV0byAmc291cmNlID0gc2lua1NvdXJjZS5zZWNvbmQ7CisgICAgaWYgKHNvdXJjZS5nZXQoKSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCBOQkFJT19Gb3JtYXQgZm9ybWF0ID0gc291cmNlLT5mb3JtYXQoKTsKKyAgICBib29sIGZpcnN0UmVhZCA9IHRydWU7CisgICAgc3RkOjpzdHJpbmcgZmlsZW5hbWUgPSBhdWRpb0ZpbGVIYW5kbGVyLmNyZWF0ZSgKKyAgICAgICAgICAgIC8vIHRoaXMgZnVuY3RvciBtdXN0IG5vdCBob2xkIHJlZmVyZW5jZXMgdG8gc3RhY2sKKyAgICAgICAgICAgIFtmaXJzdFJlYWQsIHNpbmtTb3VyY2VdICh2b2lkICpidWZmZXIsIHNpemVfdCBmcmFtZXMpIG11dGFibGUgeworICAgICAgICAgICAgICAgICAgICBhdXRvICZzb3VyY2UgPSBzaW5rU291cmNlLnNlY29uZDsKKyAgICAgICAgICAgICAgICAgICAgc3NpemVfdCBhY3R1YWxSZWFkID0gc291cmNlLT5yZWFkKGJ1ZmZlciwgZnJhbWVzKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFjdHVhbFJlYWQgPT0gKHNzaXplX3QpT1ZFUlJVTiAmJiBmaXJzdFJlYWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlY2hlY2sgb25jZQorICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsUmVhZCA9IHNvdXJjZS0+cmVhZChidWZmZXIsIGZyYW1lcyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZmlyc3RSZWFkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBhY3R1YWxSZWFkOworICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICBGb3JtYXRfc2FtcGxlUmF0ZShmb3JtYXQpLAorICAgICAgICAgICAgRm9ybWF0X2NoYW5uZWxDb3VudChmb3JtYXQpLAorICAgICAgICAgICAgZm9ybWF0Lm1Gb3JtYXQsCisgICAgICAgICAgICBzdWZmaXgpOworCisgICAgaWYgKGZkID49IDAgJiYgZmlsZW5hbWUuc2l6ZSgpID4gMCkgeworICAgICAgICBkcHJpbnRmKGZkLCAidGVlIHdyb3RlIHRvICVzXG4iLCBmaWxlbmFtZS5jX3N0cigpKTsKKyAgICB9Cit9CisKKy8qIHN0YXRpYyAqLworTkJBSU9fVGVlOjpOQkFJT19UZWVJbXBsOjpOQkFJT19TaW5rU291cmNlIE5CQUlPX1RlZTo6TkJBSU9fVGVlSW1wbDo6bWFrZVNpbmtTb3VyY2UoCisgICAgICAgIGNvbnN0IE5CQUlPX0Zvcm1hdCAmZm9ybWF0LCBzaXplX3QgZnJhbWVzLCBib29sICplbmFibGVkKQoreworICAgIGlmIChGb3JtYXRfaXNWYWxpZChmb3JtYXQpICYmIGF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0Lm1Gb3JtYXQpKSB7CisgICAgICAgIFBpcGUgKnBpcGUgPSBuZXcgUGlwZShmcmFtZXMsIGZvcm1hdCk7CisgICAgICAgIHNpemVfdCBudW1Db3VudGVyT2ZmZXJzID0gMDsKKyAgICAgICAgY29uc3QgTkJBSU9fRm9ybWF0IG9mZmVyc1sxXSA9IHtmb3JtYXR9OworICAgICAgICBzc2l6ZV90IGluZGV4ID0gcGlwZS0+bmVnb3RpYXRlKG9mZmVycywgMSwgTlVMTCwgbnVtQ291bnRlck9mZmVycyk7CisgICAgICAgIGlmIChpbmRleCAhPSAwKSB7CisgICAgICAgICAgICBBTE9HVygicGlwZSBmYWlsdXJlIHRvIG5lZ290aWF0ZTogJXpkIiwgaW5kZXgpOworICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICB9CisgICAgICAgIFBpcGVSZWFkZXIgKnBpcGVSZWFkZXIgPSBuZXcgUGlwZVJlYWRlcigqcGlwZSk7CisgICAgICAgIG51bUNvdW50ZXJPZmZlcnMgPSAwOworICAgICAgICBpbmRleCA9IHBpcGVSZWFkZXItPm5lZ290aWF0ZShvZmZlcnMsIDEsIE5VTEwsIG51bUNvdW50ZXJPZmZlcnMpOworICAgICAgICBpZiAoaW5kZXggIT0gMCkgeworICAgICAgICAgICAgQUxPR1coInBpcGVSZWFkZXIgZmFpbHVyZSB0byBuZWdvdGlhdGU6ICV6ZCIsIGluZGV4KTsKKyAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgfQorICAgICAgICBpZiAoZW5hYmxlZCAhPSBudWxscHRyKSAqZW5hYmxlZCA9IHRydWU7CisgICAgICAgIHJldHVybiB7cGlwZSwgcGlwZVJlYWRlcn07CisgICAgfQorZXhpdDoKKyAgICBpZiAoZW5hYmxlZCAhPSBudWxscHRyKSAqZW5hYmxlZCA9IGZhbHNlOworICAgIHJldHVybiB7bnVsbHB0ciwgbnVsbHB0cn07Cit9CisKK3N0ZDo6c3RyaW5nIEF1ZGlvRmlsZUhhbmRsZXI6OmNyZWF0ZSgKKyAgICAgICAgc3RkOjpmdW5jdGlvbjxzc2l6ZV90IC8qIGZyYW1lc19yZWFkICovCisgICAgICAgICAgICAgICAgICAgICh2b2lkICogLyogYnVmZmVyICovLCBzaXplX3QgLyogc2l6ZV9pbl9mcmFtZXMgKi8pPiByZWFkZXIsCisgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCisgICAgICAgIHVpbnQzMl90IGNoYW5uZWxDb3VudCwKKyAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmc3VmZml4KQoreworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGZpbGVuYW1lID0gZ2VuZXJhdGVGaWxlbmFtZShzdWZmaXgpOworCisgICAgaWYgKG1UaHJlYWRQb29sLmxhdW5jaChzdGQ6OnN0cmluZygiY3JlYXRlICIpICsgZmlsZW5hbWUsCisgICAgICAgICAgICBbPV0oKSB7IHJldHVybiBjcmVhdGVJbnRlcm5hbChyZWFkZXIsIHNhbXBsZVJhdGUsIGNoYW5uZWxDb3VudCwgZm9ybWF0LCBmaWxlbmFtZSk7IH0pCisgICAgICAgICAgICA9PSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gZmlsZW5hbWU7CisgICAgfQorICAgIHJldHVybiAiIjsKK30KKworc3RhdHVzX3QgQXVkaW9GaWxlSGFuZGxlcjo6c2V0RGlyZWN0b3J5KGNvbnN0IHN0ZDo6c3RyaW5nICZkaXJlY3RvcnkpCit7CisgICAgaWYgKCFpc0RpcmVjdG9yeVZhbGlkKGRpcmVjdG9yeSkpIHJldHVybiBCQURfVkFMVUU7CisKKyAgICAvLyBUT0RPOiBjb25zaWRlciB1c2luZyBzdGQ6OmZpbGVzeXN0ZW0gaW4gQysrMTcKKyAgICBESVIgKmRpciA9IG9wZW5kaXIoZGlyZWN0b3J5LmNfc3RyKCkpOworCisgICAgaWYgKGRpciA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dXKCIlczogY2Fubm90IG9wZW4gZGlyZWN0b3J5ICVzIiwgX19mdW5jX18sIGRpcmVjdG9yeS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzaXplX3QgdG9SZW1vdmUgPSAwOworICAgIGRlY2x0eXBlKG1GaWxlcykgZmlsZXM7CisKKyAgICB3aGlsZSAoZmlsZXMuc2l6ZSgpIDwgTUFYX0ZJTEVTX1JFQUQpIHsKKyAgICAgICAgZXJybm8gPSAwOworICAgICAgICBjb25zdCBzdHJ1Y3QgZGlyZW50ICpyZXN1bHQgPSByZWFkZGlyKGRpcik7CisgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR1dfSUYoZXJybm8gIT0gMCwgIiVzOiByZWFkZGlyIGZhaWx1cmUgJXMiLCBfX2Z1bmNfXywgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIC8vIGlzIGl0IGEgbWFuYWdlZCBmaWxlbmFtZT8KKyAgICAgICAgaWYgKCFpc01hbmFnZWRGaWxlbmFtZShyZXN1bHQtPmRfbmFtZSkpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGZpbGVzLmVtcGxhY2VfYmFjayhyZXN1bHQtPmRfbmFtZSk7CisgICAgfQorICAgICh2b2lkKWNsb3NlZGlyKGRpcik7CisKKyAgICAvLyBPUFRJTUlaQVRJT046IHdlIGRvbid0IG5lZWQgdG8gc3RhdCBlYWNoIGZpbGUsIHRoZSBmaWxlbmFtZXMgbmFtZXMgYXJlCisgICAgLy8gYWxyZWFkeSAocm91Z2hseSkgb3JkZXJlZCBieSBjcmVhdGlvbiBkYXRlLiAgd2UgdXNlIHN0ZDo6ZGVxdWUgaW5zdGVhZAorICAgIC8vIG9mIHN0ZDo6c2V0IGZvciBmYXN0ZXIgaW5zZXJ0aW9uIGFuZCBzb3J0aW5nIHRpbWVzLgorCisgICAgaWYgKGZpbGVzLnNpemUoKSA+IE1BWF9GSUxFU19LRUVQKSB7CisgICAgICAgIC8vIHJlbW92ZWQgZmlsZXMgY2FuIHVzZSBhIHBhcnRpdGlvbiAobm8gbmVlZCB0byBkbyBhIGZ1bGwgc29ydCkuCisgICAgICAgIHRvUmVtb3ZlID0gZmlsZXMuc2l6ZSgpIC0gTUFYX0ZJTEVTX0tFRVA7CisgICAgICAgIHN0ZDo6bnRoX2VsZW1lbnQoZmlsZXMuYmVnaW4oKSwgZmlsZXMuYmVnaW4oKSArIHRvUmVtb3ZlIC0gMSwgZmlsZXMuZW5kKCkpOworICAgIH0KKworICAgIC8vIGtlcHQgZmlsZXMgbXVzdCBiZSBzb3J0ZWQuCisgICAgc3RkOjpzb3J0KGZpbGVzLmJlZ2luKCkgKyB0b1JlbW92ZSwgZmlsZXMuZW5kKCkpOworCisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gX2wobUxvY2spOworCisgICAgICAgIG1EaXJlY3RvcnkgPSBkaXJlY3Rvcnk7CisgICAgICAgIG1GaWxlcyA9IHN0ZDo6bW92ZShmaWxlcyk7CisgICAgfQorCisgICAgaWYgKHRvUmVtb3ZlID4gMCkgeyAvLyBsYXVuY2ggYSBjbGVhbiBpbiBiYWNrZ3JvdW5kLgorICAgICAgICAodm9pZCltVGhyZWFkUG9vbC5sYXVuY2goCisgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcoImNsZWFuaW5nICIpICsgZGlyZWN0b3J5LCBbdGhpc10oKSB7IHJldHVybiBjbGVhbigpOyB9KTsKKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBBdWRpb0ZpbGVIYW5kbGVyOjpjbGVhbihzdGQ6OnN0cmluZyAqZGlyZWN0b3J5KQoreworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBmaWxlc1RvUmVtb3ZlOworICAgIHN0ZDo6c3RyaW5nIGRpcjsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBfbChtTG9jayk7CisKKyAgICAgICAgaWYgKCFpc0RpcmVjdG9yeVZhbGlkKG1EaXJlY3RvcnkpKSByZXR1cm4gTk9fSU5JVDsKKworICAgICAgICBkaXIgPSBtRGlyZWN0b3J5OworICAgICAgICBpZiAobUZpbGVzLnNpemUoKSA+IE1BWF9GSUxFU19LRUVQKSB7CisgICAgICAgICAgICBzaXplX3QgdG9SZW1vdmUgPSBtRmlsZXMuc2l6ZSgpIC0gTUFYX0ZJTEVTX0tFRVA7CisKKyAgICAgICAgICAgIC8vIHVzZSBtb3ZlIGFuZCBlcmFzZSB0byBlZmZpY2llbnRseSB0cmFuc2ZlciBzdGQ6OnN0cmluZworICAgICAgICAgICAgc3RkOjptb3ZlKG1GaWxlcy5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICBtRmlsZXMuYmVnaW4oKSArIHRvUmVtb3ZlLAorICAgICAgICAgICAgICAgICAgICBzdGQ6OmJhY2tfaW5zZXJ0ZXIoZmlsZXNUb1JlbW92ZSkpOworICAgICAgICAgICAgbUZpbGVzLmVyYXNlKG1GaWxlcy5iZWdpbigpLCBtRmlsZXMuYmVnaW4oKSArIHRvUmVtb3ZlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIGRpcnAgPSBkaXIgKyAiLyI7CisgICAgLy8gcmVtb3ZlIGZpbGVzIG91dHNpZGUgb2YgbG9jayBmb3IgYmV0dGVyIGNvbmN1cnJlbmN5LgorICAgIGZvciAoY29uc3QgYXV0byAmZmlsZSA6IGZpbGVzVG9SZW1vdmUpIHsKKyAgICAgICAgKHZvaWQpdW5saW5rKChkaXJwICsgZmlsZSkuY19zdHIoKSk7CisgICAgfQorCisgICAgLy8gcmV0dXJuIHRoZSBkaXJlY3RvcnkgaWYgcmVxdWVzdGVkLgorICAgIGlmIChkaXJlY3RvcnkgIT0gbnVsbHB0cikgeworICAgICAgICAqZGlyZWN0b3J5ID0gZGlyOworICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEF1ZGlvRmlsZUhhbmRsZXI6OlRocmVhZFBvb2w6OmxhdW5jaCgKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsIHN0ZDo6ZnVuY3Rpb248c3RhdHVzX3QoKT4gZnVuYykKK3sKKyAgICBpZiAobVRocmVhZFBvb2xTaXplID4gMSkgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gX2wobUxvY2spOworICAgICAgICBpZiAobUZ1dHVyZXMuc2l6ZSgpID49IG1UaHJlYWRQb29sU2l6ZSkgeworICAgICAgICAgICAgZm9yIChhdXRvIGl0ID0gbUZ1dHVyZXMuYmVnaW4oKTsgaXQgIT0gbUZ1dHVyZXMuZW5kKCk7KSB7CisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmZpbGVuYW1lID0gaXQtPmZpcnN0OworICAgICAgICAgICAgICAgIHN0ZDo6ZnV0dXJlPHN0YXR1c190PiAmZnV0dXJlID0gaXQtPnNlY29uZDsKKyAgICAgICAgICAgICAgICBpZiAoIWZ1dHVyZS52YWxpZCgpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBmdXR1cmUud2FpdF9mb3Ioc3RkOjpjaHJvbm86OnNlY29uZHMoMCkpID09IHN0ZDo6ZnV0dXJlX3N0YXR1czo6cmVhZHkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIiVzOiBmdXR1cmUgJXMgcmVhZHkiLCBfX2Z1bmNfXywgZmlsZW5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgIGl0ID0gbUZ1dHVyZXMuZXJhc2UoaXQpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIlczogZnV0dXJlICVzIG5vdCByZWFkeSIsIF9fZnVuY19fLCBmaWxlbmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgKytpdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1GdXR1cmVzLnNpemUoKSA8IG1UaHJlYWRQb29sU2l6ZSkgeworICAgICAgICAgICAgQUxPR1YoIiVzOiBkZWZlcnJlZCBjYWxsaW5nICVzIiwgX19mdW5jX18sIG5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICBtRnV0dXJlcy5lbXBsYWNlX2JhY2sobmFtZSwgc3RkOjphc3luYyhzdGQ6OmxhdW5jaDo6YXN5bmMsIGZ1bmMpKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorICAgIH0KKyAgICBBTE9HVigiJXM6IGltbWVkaWF0ZSBjYWxsaW5nICVzIiwgX19mdW5jX18sIG5hbWUuY19zdHIoKSk7CisgICAgcmV0dXJuIGZ1bmMoKTsKK30KKworc3RhdHVzX3QgQXVkaW9GaWxlSGFuZGxlcjo6Y3JlYXRlSW50ZXJuYWwoCisgICAgICAgIHN0ZDo6ZnVuY3Rpb248c3NpemVfdCAvKiBmcmFtZXNfcmVhZCAqLworICAgICAgICAgICAgICAgICAgICAodm9pZCAqIC8qIGJ1ZmZlciAqLywgc2l6ZV90IC8qIHNpemVfaW5fZnJhbWVzICovKT4gcmVhZGVyLAorICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAorICAgICAgICB1aW50MzJfdCBjaGFubmVsQ291bnQsCisgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmZpbGVuYW1lKQoreworICAgIC8vIEF0dGVtcHQgdG8gY2hvb3NlIHRoZSBiZXN0IG1hdGNoaW5nIGZpbGUgZm9ybWF0LgorICAgIC8vIFdlIGNhbiBjaG9vc2UgYW55IHNmX2Zvcm1hdAorICAgIC8vIGJ1dCB3cml0ZUZvcm1hdCBtdXN0IGJlIG9uZSBvZiAxNiwgMzIsIGZsb2F0CisgICAgLy8gZHVlIHRvIHNmX3dyaXRlZiBjb21wYXRpYmlsaXR5LgorICAgIGludCBzZl9mb3JtYXQ7CisgICAgYXVkaW9fZm9ybWF0X3Qgd3JpdGVGb3JtYXQ7CisgICAgc3dpdGNoIChmb3JtYXQpIHsKKyAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fOF9CSVQ6CisgICAgY2FzZSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDoKKyAgICAgICAgc2ZfZm9ybWF0ID0gU0ZfRk9STUFUX1BDTV8xNjsKKyAgICAgICAgd3JpdGVGb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKKyAgICAgICAgQUxPR1YoIiVzOiAlcyB1c2luZyBQQ01fMTYgZm9yIGZvcm1hdCAlI3giLCBfX2Z1bmNfXywgZmlsZW5hbWUuY19zdHIoKSwgZm9ybWF0KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVURJT19GT1JNQVRfUENNXzhfMjRfQklUOgorICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV8yNF9CSVRfUEFDS0VEOgorICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV8zMl9CSVQ6CisgICAgICAgIHNmX2Zvcm1hdCA9IFNGX0ZPUk1BVF9QQ01fMzI7CisgICAgICAgIHdyaXRlRm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8zMl9CSVQ7CisgICAgICAgIEFMT0dWKCIlczogJXMgdXNpbmcgUENNXzMyIGZvciBmb3JtYXQgJSN4IiwgX19mdW5jX18sIGZpbGVuYW1lLmNfc3RyKCksIGZvcm1hdCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV9GTE9BVDoKKyAgICAgICAgc2ZfZm9ybWF0ID0gU0ZfRk9STUFUX0ZMT0FUOworICAgICAgICB3cml0ZUZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ7CisgICAgICAgIEFMT0dWKCIlczogJXMgdXNpbmcgUENNX0ZMT0FUIGZvciBmb3JtYXQgJSN4IiwgX19mdW5jX18sIGZpbGVuYW1lLmNfc3RyKCksIGZvcm1hdCk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIC8vIFRPRE86CisgICAgICAgIC8vIGhhbmRsZSBhdWRpb19oYXNfcHJvcG9ydGlvbmFsX2ZyYW1lcygpIGZvcm1hdHMuCisgICAgICAgIC8vIGhhbmRsZSBjb21wcmVzc2VkIGZvcm1hdHMgYXMgc2luZ2xlIGJ5dGUgZmlsZXMuCisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgc3RkOjpzdHJpbmcgZGlyZWN0b3J5OworICAgIHN0YXR1c190IHN0YXR1cyA9IGNsZWFuKCZkaXJlY3RvcnkpOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHJldHVybiBzdGF0dXM7CisgICAgc3RkOjpzdHJpbmcgZGlyUHJlZml4ID0gZGlyZWN0b3J5ICsgIi8iOworCisgICAgY29uc3Qgc3RkOjpzdHJpbmcgcGF0aCA9IGRpclByZWZpeCArIGZpbGVuYW1lOworCisgICAgLyogY29uc3QgKi8gU0ZfSU5GTyBpbmZvID0geworICAgICAgICAuZnJhbWVzID0gMCwKKyAgICAgICAgLnNhbXBsZXJhdGUgPSAoaW50KXNhbXBsZVJhdGUsCisgICAgICAgIC5jaGFubmVscyA9IChpbnQpY2hhbm5lbENvdW50LAorICAgICAgICAuZm9ybWF0ID0gU0ZfRk9STUFUX1dBViB8IHNmX2Zvcm1hdCwKKyAgICB9OworICAgIFNOREZJTEUgKnNmID0gc2Zfb3BlbihwYXRoLmNfc3RyKCksIFNGTV9XUklURSwgJmluZm8pOworICAgIGlmIChzZiA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBzaXplX3QgdG90YWwgPSAwOworICAgIHZvaWQgKmJ1ZmZlciA9IG1hbGxvYyhGUkFNRVNfUEVSX1JFQUQgKiBzdGQ6Om1heCgKKyAgICAgICAgICAgIGNoYW5uZWxDb3VudCAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUod3JpdGVGb3JtYXQpLCAvL291dHB1dCBmcmFtZXNpemUKKyAgICAgICAgICAgIGNoYW5uZWxDb3VudCAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUoZm9ybWF0KSkpOyAvLyBpbnB1dCBmcmFtZXNpemUKKyAgICBpZiAoYnVmZmVyID09IG51bGxwdHIpIHsKKyAgICAgICAgc2ZfY2xvc2Uoc2YpOworICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgIH0KKworICAgIGZvciAoOzspIHsKKyAgICAgICAgY29uc3Qgc3NpemVfdCBhY3R1YWxSZWFkID0gcmVhZGVyKGJ1ZmZlciwgRlJBTUVTX1BFUl9SRUFEKTsKKyAgICAgICAgaWYgKGFjdHVhbFJlYWQgPD0gMCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvLyBDb252ZXJ0IGlucHV0IGZvcm1hdCB0byB3cml0ZUZvcm1hdCBhcyBuZWVkZWQuCisgICAgICAgIGlmIChmb3JtYXQgIT0gd3JpdGVGb3JtYXQpIHsKKyAgICAgICAgICAgIG1lbWNweV9ieV9hdWRpb19mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwgd3JpdGVGb3JtYXQsIGJ1ZmZlciwgZm9ybWF0LCBhY3R1YWxSZWFkICogaW5mby5jaGFubmVscyk7CisgICAgICAgIH0KKworICAgICAgICBzc2l6ZV90IHJlYWxseVdyaXR0ZW47CisgICAgICAgIHN3aXRjaCAod3JpdGVGb3JtYXQpIHsKKyAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDoKKyAgICAgICAgICAgIHJlYWxseVdyaXR0ZW4gPSBzZl93cml0ZWZfc2hvcnQoc2YsIChjb25zdCBpbnQxNl90ICopYnVmZmVyLCBhY3R1YWxSZWFkKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fMzJfQklUOgorICAgICAgICAgICAgcmVhbGx5V3JpdHRlbiA9IHNmX3dyaXRlZl9pbnQoc2YsIChjb25zdCBpbnQzMl90ICopYnVmZmVyLCBhY3R1YWxSZWFkKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ6CisgICAgICAgICAgICByZWFsbHlXcml0dGVuID0gc2Zfd3JpdGVmX2Zsb2F0KHNmLCAoY29uc3QgZmxvYXQgKilidWZmZXIsIGFjdHVhbFJlYWQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCIlczogJXMgd3JpdGVGb3JtYXQ6ICUjeCIsIF9fZnVuY19fLCBmaWxlbmFtZS5jX3N0cigpLCB3cml0ZUZvcm1hdCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChyZWFsbHlXcml0dGVuIDwgMCkgeworICAgICAgICAgICAgQUxPR1coIiVzOiAlcyB3cml0ZSBlcnJvcjogJXpkIiwgX19mdW5jX18sIGZpbGVuYW1lLmNfc3RyKCksIHJlYWxseVdyaXR0ZW4pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgdG90YWwgKz0gcmVhbGx5V3JpdHRlbjsKKyAgICAgICAgaWYgKHJlYWxseVdyaXR0ZW4gPCBhY3R1YWxSZWFkKSB7CisgICAgICAgICAgICBBTE9HVygiJXM6ICVzIHdyaXRlIHNob3J0IGNvdW50OiAlemQgPCAlemQiLAorICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGZpbGVuYW1lLmNfc3RyKCksIHJlYWxseVdyaXR0ZW4sIGFjdHVhbFJlYWQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgc2ZfY2xvc2Uoc2YpOworICAgIGZyZWUoYnVmZmVyKTsKKyAgICBpZiAodG90YWwgPT0gMCkgeworICAgICAgICAodm9pZCl1bmxpbmsocGF0aC5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIE5PVF9FTk9VR0hfREFUQTsKKyAgICB9CisKKyAgICAvLyBTdWNjZXNzOiBhZGQgb3VyIG5hbWUgdG8gbWFuYWdlZCBmaWxlcy4KKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBfbChtTG9jayk7CisgICAgICAgIC8vIHdlYWsgc3luY2hyb25pemF0aW9uIC0gb25seSB1cGRhdGUgbUZpbGVzIGlmIHRoZSBkaXJlY3RvcnkgaGFzbid0IGNoYW5nZWQuCisgICAgICAgIGlmIChtRGlyZWN0b3J5ID09IGRpcmVjdG9yeSkgeworICAgICAgICAgICAgbUZpbGVzLmVtcGxhY2VfYmFjayhmaWxlbmFtZSk7ICAvLyBhZGQgdG8gdGhlIGVuZCB0byBwcmVzZXJ2ZSBzb3J0LgorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsgLy8gcmV0dXJuIGZ1bGwgcGF0aAorfQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBURUVfU0lOSwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL05CQUlPX1RlZS5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL05CQUlPX1RlZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlZDhjYzgKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvTkJBSU9fVGVlLmgKQEAgLTAsMCArMSwzMjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBFbmFibGVkIHdpdGggVEVFX1NJTksgaW4gQ29uZmlndXJhdGlvbi5oCisjaWZuZGVmIEFORFJPSURfTkJBSU9fVEVFX0gKKyNkZWZpbmUgQU5EUk9JRF9OQkFJT19URUVfSAorCisjaWZkZWYgVEVFX1NJTksKKworI2luY2x1ZGUgPGF0b21pYz4KKyNpbmNsdWRlIDxtdXRleD4KKyNpbmNsdWRlIDxzZXQ+CisKKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPG1lZGlhL25iYWlvL05CQUlPLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyoqCisgKiBUaGUgTkJBSU9fVGVlIHVzZXMgdGhlIE5CQUlPIFBpcGUgYW5kIFBpcGVSZWFkZXIgZm9yIG5vbmJsb2NraW5nCisgKiBkYXRhIGNvbGxlY3Rpb24sIGZvciBldmVudHVhbCBkdW1wIHRvIGxvZyBmaWxlcy4KKyAqIFNlZSBodHRwczovL3NvdXJjZS5hbmRyb2lkLmNvbS9kZXZpY2VzL2F1ZGlvL2RlYnVnZ2luZyBmb3IgaG93IHRvCisgKiBlbmFibGUgYnkgcm8uZGVidWdnYWJsZSBhbmQgYWYudGVlIHByb3BlcnRpZXMuCisgKgorICogVGhlIHdyaXRlKCkgaW50byB0aGUgTkJBSU9fVGVlIGlzIHRoZXJlZm9yZSBub25ibG9ja2luZywKKyAqIGJ1dCBjaGFuZ2luZyBOQkFJT19UZWUgZm9ybWF0cyB3aXRoIHNldCgpIGNhbm5vdCBiZSBkb25lIGR1cmluZyBhIHdyaXRlKCk7CisgKiB1c3VhbGx5IHRoZSBjYWxsZXIgYWxyZWFkeSBpbXBsZW1lbnRzIHRoaXMgbXV0dWFsIGV4Y2x1c2lvbi4KKyAqCisgKiBBbGwgb3RoZXIgY2FsbHMgZXhjZXB0IHNldCgpIHZzIHdyaXRlKCkgbWF5IG9jY3VyIGF0IGFueSB0aW1lLgorICoKKyAqIGR1bXAoKSBkaXNydXB0aW9uIGlzIG1pbmltaXplZCB0byB0aGUgY2FsbGVyIHNpbmNlIHN5c3RlbSBjYWxscyBhcmUgZXhlY3V0ZWQKKyAqIGluIGFuIGFzeW5jaHJvbm91cyB0aHJlYWQgKHdoZW4gcG9zc2libGUpLgorICoKKyAqIEN1cnJlbnRseSB0aGUgTkJBSU9fVGVlIGlzICJoYXJkd2lyZWQiIGZvciBBdWRpb0ZsaW5nZXIgc3VwcG9ydC4KKyAqCisgKiBTb21lIEF1ZGlvRmxpbmdlciBzcGVjaWZpYyBub3RlczoKKyAqCisgKiAxKSBUZWVzIGNhcHR1cmUgb25seSBsaW5lYXIgUENNIGRhdGEuCisgKiAyKSBUZWVzIHdpdGhvdXQgYW55IGRhdGEgd3JpdHRlbiBhcmUgY29uc2lkZXJlZCBlbXB0eSBhbmQgZG8gbm90IGdlbmVyYXRlCisgKiAgICBhbnkgb3V0cHV0IGZpbGVzLgorICogMikgT25jZSBhIFRlZSBkdW1wcyBkYXRhLCBpdCBpcyBjb25zaWRlcmVkICJlbXB0aWVkIiBhbmQgbmV3IGRhdGEKKyAqICAgIG5lZWRzIHRvIGJlIHdyaXR0ZW4gYmVmb3JlIGFub3RoZXIgVGVlIGZpbGUgaXMgZ2VuZXJhdGVkLgorICogMykgVGVlIGZpbGUgZm9ybWF0IGlzCisgKiAgICBXQVYgaW50ZWdlciBQQ00gMTYgYml0IGZvciBBVURJT19GT1JNQVRfUENNXzhfQklULCBBVURJT19GT1JNQVRfUENNXzE2X0JJVC4KKyAqICAgIFdBViBpbnRlZ2VyIFBDTSAzMiBiaXQgZm9yIEFVRElPX0ZPUk1BVF9QQ01fOF8yNF9CSVQsIEFVRElPX0ZPUk1BVF9QQ01fMjRfQklUX1BBQ0tFRAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX1BDTV8zMl9CSVQuCisgKiAgICBXQVYgZmxvYXQgUENNIDMyIGJpdCBmb3IgQVVESU9fRk9STUFUX1BDTV9GTE9BVC4KKyAqCisgKiBJbnB1dF9UaHJlYWQ6CisgKiAxKSBDYXB0dXJlIGJ1ZmZlciBpcyB0ZWVkIHdoZW4gcmVhZCBmcm9tIHRoZSBIQUwsIGJlZm9yZSByZXNhbXBsaW5nIGZvciB0aGUgQXVkaW9SZWNvcmQKKyAqICAgIGNsaWVudC4KKyAqCisgKiBPdXRwdXRfVGhyZWFkOgorICogMSkgTWl4ZXJUaHJlYWRzIHdpbGwgdGVlIGF0IHRoZSBGYXN0TWl4ZXIgb3V0cHV0IChpZiBpdCBoYXMgb25lKSBvciBhdCB0aGUKKyAqICAgIE5vcm1hbE1peGVyIG91dHB1dCAoaWYgbm8gRmFzdE1peGVyKS4KKyAqIDIpIER1cGxpY2F0aW5nVGhyZWFkcyBkbyBub3QgdGVlIGFueSBtaXhlZCBkYXRhLiBBcHBseSBhIHRlZSBvbiB0aGUgZG93bnN0cmVhbSBPdXRwdXRUcmFjaworICogICAgb3Igb24gdGhlIHVwc3RyZWFtIHBsYXliYWNrIFRyYWNrcy4KKyAqIDMpIERpcmVjdFRocmVhZHMgYW5kIE9mZmxvYWRUaHJlYWRzIGRvIG5vdCB0ZWUgYW55IGRhdGEuIFRoZSB1cHN0cmVhbSB0cmFjaworICogICAgKGlmIGxpbmVhciBQQ00gZm9ybWF0KSBtYXkgYmUgdGVlZCB0byBkaXNjb3ZlciBkYXRhLgorICogNCkgTW1hcFRocmVhZHMgYXJlIG5vdCBzdXBwb3J0ZWQuCisgKgorICogVHJhY2tzOgorICogMSkgUmVjb3JkVHJhY2tzIGFuZCBwbGF5YmFjayBUcmFja3MgdGVlIGFzIGRhdGEgaXMgYmVpbmcgd3JpdHRlbiB0byBvcgorICogICAgcmVhZCBmcm9tIHRoZSBzaGFyZWQgY2xpZW50LXNlcnZlciB0cmFjayBidWZmZXIgYnkgdGhlIGFzc29jaWF0ZWQgVGhyZWFkcy4KKyAqIDIpIFRoZSBtZWNoYW5pc20gaXMgb24gdGhlIEF1ZGlvQnVmZmVyUHJvdmlkZXIgcmVsZWFzZSgpIHNvIGxhcmdlIHN0YXRpYyBUcmFjaworICogICAgcGxheWJhY2sgbWF5IG5vdCBzaG93IGFueSBUZWUgZGF0YSBkZXBlbmRpbmcgb24gd2hlbiBpdCBpcyByZWxlYXNlZC4KKyAqIDMpIFdoZW4gYSB0cmFjayBiZWNvbWVzIGluYWN0aXZlLCB0aGUgVGhyZWFkIHdpbGwgdHJpZ2dlciBhIGR1bXAuCisgKi8KKworY2xhc3MgTkJBSU9fVGVlIHsKK3B1YmxpYzoKKyAgICAvKiBURUVfRkxBRyBpcyB1c2VkIGluIHNldCgpIGFuZCBtdXN0IG1hdGNoIHRoZSBmbGFncyBmb3IgdGhlIGFmLnRlZSBwcm9wZXJ0eQorICAgICAgIGdpdmVuIGluIGh0dHBzOi8vc291cmNlLmFuZHJvaWQuY29tL2RldmljZXMvYXVkaW8vZGVidWdnaW5nCisgICAgKi8KKyAgICBlbnVtIFRFRV9GTEFHIHsKKyAgICAgICAgVEVFX0ZMQUdfTk9ORSA9IDAsCisgICAgICAgIFRFRV9GTEFHX0lOUFVUX1RIUkVBRCA9ICgxIDw8IDApLCAgLy8gdHJlYXQgYXMgYSBUZWUgZm9yIGlucHV0IChDYXB0dXJlKSBUaHJlYWRzCisgICAgICAgIFRFRV9GTEFHX09VVFBVVF9USFJFQUQgPSAoMSA8PCAxKSwgLy8gdHJlYXQgYXMgYSBUZWUgZm9yIG91dHB1dCAoUGxheWJhY2spIFRocmVhZHMKKyAgICAgICAgVEVFX0ZMQUdfVFJBQ0sgPSAoMSA8PCAyKSwgICAgICAgICAvLyB0cmVhdCBhcyBhIFRlZSBmb3IgdHJhY2tzIChSZWNvcmQgYW5kIFBsYXliYWNrKQorICAgIH07CisKKyAgICBOQkFJT19UZWUoKQorICAgICAgICA6IG1UZWUoc3RkOjptYWtlX3NoYXJlZDxOQkFJT19UZWVJbXBsPigpKQorICAgIHsKKyAgICAgICAgZ2V0UnVubmluZ1RlZXMoKS5hZGQobVRlZSk7CisgICAgfQorCisgICAgfk5CQUlPX1RlZSgpIHsKKyAgICAgICAgZ2V0UnVubmluZ1RlZXMoKS5yZW1vdmUobVRlZSk7CisgICAgICAgIGR1bXAoLTEsICJfRFRPUiIpOyAvLyBsb2cgYW55IGRhdGEgcmVtYWluaW5nIGluIFRlZS4KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBcYnJpZWYgc2V0IGlzIHVzZWQgZm9yIGRlZmVycmVkIGNvbmZpZ3VyYXRpb24gb2YgVGVlLgorICAgICAqCisgICAgICogIE1heSBiZSBjYWxsZWQgYW55dGltZSBleGNlcHQgY29uY3VycmVudGx5IHdpdGggd3JpdGUoKS4KKyAgICAgKgorICAgICAqIFxwYXJhbSBmb3JtYXQgTkJBSU9fRm9ybWF0IHVzZWQgdG8gb3BlbiBOQkFJTyBwaXBlcworICAgICAqIFxwYXJhbSBmbGFncyAoaHR0cHM6Ly9zb3VyY2UuYW5kcm9pZC5jb20vZGV2aWNlcy9hdWRpby9kZWJ1Z2dpbmcpCisgICAgICogICAgICAgICAgICAgIC0gVEVFX0ZMQUdfTk9ORSB0byBieXBhc3MgYWYudGVlIHByb3BlcnR5IGNoZWNrcyAoZGVmYXVsdCk7CisgICAgICogICAgICAgICAgICAgIC0gVEVFX0ZMQUdfSU5QVVRfVEhSRUFEIHRvIGNoZWNrIGFmLnRlZSBpZiBpbnB1dCB0aHJlYWQgbG9nZ2luZyBzZXQ7CisgICAgICogICAgICAgICAgICAgIC0gVEVFX0ZMQUdfT1VUUFVUX1RIUkVBRCB0byBjaGVjayBhZi50ZWUgaWYgb3V0cHV0IHRocmVhZCBsb2dnaW5nIHNldDsKKyAgICAgKiAgICAgICAgICAgICAgLSBURUVfRkxBR19UUkFDSyB0byBjaGVjayBhZi50ZWUgaWYgdHJhY2sgbG9nZ2luZyBzZXQuCisgICAgICogXHBhcmFtIGZyYW1lcyBudW1iZXIgb2YgZnJhbWVzIHRvIG9wZW4gdGhlIE5CQUlPIHBpcGUgKHNldCB0byAwIHRvIHVzZSBkZWZhdWx0KS4KKyAgICAgKgorICAgICAqIFxyZXR1cm4KKyAgICAgKiAgICAgICAgIC0gTk9fRVJST1Igb24gc3VjY2VzcyAob3IgZm9ybWF0IHVuY2hhbmdlZCkKKyAgICAgKiAgICAgICAgIC0gQkFEX1ZBTFVFIGlmIGZvcm1hdCBvciBmbGFncyBpbnZhbGlkLgorICAgICAqICAgICAgICAgLSBQRVJNSVNTSU9OX0RFTklFRCBpZiBmbGFncyBub3QgYWxsb3dlZCBieSBhZi50ZWUKKyAgICAgKi8KKworICAgIHN0YXR1c190IHNldChjb25zdCBOQkFJT19Gb3JtYXQgJmZvcm1hdCwKKyAgICAgICAgICAgIFRFRV9GTEFHIGZsYWdzID0gVEVFX0ZMQUdfTk9ORSwgc2l6ZV90IGZyYW1lcyA9IDApIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1UZWUtPnNldChmb3JtYXQsIGZsYWdzLCBmcmFtZXMpOworICAgIH0KKworICAgIHN0YXR1c190IHNldCh1aW50MzJfdCBzYW1wbGVSYXRlLCB1aW50MzJfdCBjaGFubmVsQ291bnQsIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgIFRFRV9GTEFHIGZsYWdzID0gVEVFX0ZMQUdfTk9ORSwgc2l6ZV90IGZyYW1lcyA9IDApIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1UZWUtPnNldChGb3JtYXRfZnJvbV9TUl9DKHNhbXBsZVJhdGUsIGNoYW5uZWxDb3VudCwgZm9ybWF0KSwgZmxhZ3MsIGZyYW1lcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogXGJyaWVmIHdyaXRlIGRhdGEgdG8gdGhlIHRlZS4KKyAgICAgKgorICAgICAqIFRoaXMgY2FsbCBpcyBsb2NrIGZyZWUgKGFzIHNoYXJlZCBwb2ludGVyIGFuZCBOQkFJTyBpcyBsb2NrIGZyZWUpOworICAgICAqIG1heSBiZSBjYWxsZWQgc2ltdWx0YW5lb3VzIHRvIGFsbCBtZXRob2RzIGV4Y2VwdCBzZXQoKS4KKyAgICAgKgorICAgICAqIFxwYXJhbSBidWZmZXIgdG8gd3JpdGUgdG8gcGlwZS4KKyAgICAgKiBccGFyYW0gZnJhbWVDb3VudCBpbiBmcmFtZXMgYXMgc3BlY2lmaWVkIGJ5IHRoZSBmb3JtYXQgcGFzc2VkIHRvIHNldCgpCisgICAgICovCisKKyAgICB2b2lkIHdyaXRlKGNvbnN0IHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGZyYW1lQ291bnQpIGNvbnN0IHsKKyAgICAgICAgbVRlZS0+d3JpdGUoYnVmZmVyLCBmcmFtZUNvdW50KTsKKyAgICB9CisKKyAgICAvKiogc2V0cyBUZWUgaWQgc3RyaW5nIHdoaWNoIGlkZW50aWZpZXMgdGhlIGdlbmVyYXRlZCBmaWxlIChzaG91bGQgYmUgdW5pcXVlKS4gKi8KKyAgICB2b2lkIHNldElkKGNvbnN0IHN0ZDo6c3RyaW5nICZpZCkgY29uc3QgeworICAgICAgICBtVGVlLT5zZXRJZChpZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogXGJyaWVmIGR1bXAgdGhlIGF1ZGlvIGNvbnRlbnQgd3JpdHRlbiB0byB0aGUgVGVlLgorICAgICAqCisgICAgICogXHBhcmFtIGZkIGZpbGUgZGVzY3JpcHRvciB0byB3cml0ZSBkdW1wZWQgZmlsZW5hbWUgZm9yIGxvZ2dpbmcsIHVzZSAtMSB0byBpZ25vcmUuCisgICAgICogXHBhcmFtIHJlYXNvbiBzdHJpbmcgc3VmZml4IHRvIGFwcGVuZCB0byB0aGUgZ2VuZXJhdGVkIGZpbGUuCisgICAgICovCisgICAgdm9pZCBkdW1wKGludCBmZCwgY29uc3Qgc3RkOjpzdHJpbmcgJnJlYXNvbiA9ICIiKSBjb25zdCB7CisgICAgICAgIG1UZWUtPmR1bXAoZmQsIHJlYXNvbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogXGJyaWVmIGR1bXAgYWxsIFRlZXMgY3VycmVudGx5IGFsaXZlLgorICAgICAqCisgICAgICogXHBhcmFtIGZkIGZpbGUgZGVzY3JpcHRvciB0byB3cml0ZSBkdW1wZWQgZmlsZW5hbWUgZm9yIGxvZ2dpbmcsIHVzZSAtMSB0byBpZ25vcmUuCisgICAgICogXHBhcmFtIHJlYXNvbiBzdHJpbmcgc3VmZml4IHRvIGFwcGVuZCB0byB0aGUgZ2VuZXJhdGVkIGZpbGUuCisgICAgICovCisgICAgc3RhdGljIHZvaWQgZHVtcEFsbChpbnQgZmQsIGNvbnN0IHN0ZDo6c3RyaW5nICZyZWFzb24gPSAiIikgeworICAgICAgICBnZXRSdW5uaW5nVGVlcygpLmR1bXAoZmQsIHJlYXNvbik7CisgICAgfQorCitwcml2YXRlOgorCisgICAgLyoqIFRoZSB1bmRlcmx5aW5nIGltcGxlbWVudGF0aW9uIG9mIHRoZSBUZWUgLSB0aGUgbGlmZXRpbWUgaXMgdGhyb3VnaAorICAgICAgICBhIHNoYXJlZCBwb2ludGVyIHNvIGRlc3RydWN0aW9uIG9mIHRoZSBOQkFJT19UZWUgY29udGFpbmVyIG1heSBwcm9jZWVkCisgICAgICAgIGV2ZW4gdGhvdWdoIGR1bXBpbmcgaXMgb2NjdXJyaW5nLiAqLworICAgIGNsYXNzIE5CQUlPX1RlZUltcGwgeworICAgIHB1YmxpYzoKKyAgICAgICAgc3RhdHVzX3Qgc2V0KGNvbnN0IE5CQUlPX0Zvcm1hdCAmZm9ybWF0LCBURUVfRkxBRyBmbGFncywgc2l6ZV90IGZyYW1lcykgeworICAgICAgICAgICAgc3RhdGljIGNvbnN0IGludCB0ZWVDb25maWcgPSBwcm9wZXJ0eV9nZXRfYm9vbCgicm8uZGVidWdnYWJsZSIsIGZhbHNlKQorICAgICAgICAgICAgICAgICAgID8gcHJvcGVydHlfZ2V0X2ludDMyKCJhZi50ZWUiLCAwKSA6IDA7CisKKyAgICAgICAgICAgIC8vIGNoZWNrIHRoZSB0eXBlIG9mIFRlZQorICAgICAgICAgICAgY29uc3QgVEVFX0ZMQUcgdHlwZSA9IFRFRV9GTEFHKAorICAgICAgICAgICAgICAgICAgICBmbGFncyAmIChURUVfRkxBR19JTlBVVF9USFJFQUQgfCBURUVfRkxBR19PVVRQVVRfVEhSRUFEIHwgVEVFX0ZMQUdfVFJBQ0spKTsKKworICAgICAgICAgICAgLy8gcGFyYW1ldGVyIGZsYWdzIGNhbid0IHNlbGVjdCBtdWx0aXBsZSB0eXBlcy4KKyAgICAgICAgICAgIGlmIChfX2J1aWx0aW5fcG9wY291bnQodHlwZSkgPiAxKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gaWYgdHlwZSBpcyBzZXQsIHdlIGNoZWNrIHRvIHNlZSBpZiBpdCBpcyBwZXJtaXR0ZWQgYnkgY29uZmlndXJhdGlvbi4KKyAgICAgICAgICAgIGlmICh0eXBlICE9IDAgJiYgKHR5cGUgJiB0ZWVDb25maWcpID09IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGRldGVybWluZSBudW1iZXIgb2YgZnJhbWVzIGZvciBUZWUKKyAgICAgICAgICAgIGlmIChmcmFtZXMgPT0gMCkgeworICAgICAgICAgICAgICAgIC8vIFRPRE86IGNvbnNpZGVyIHZhcnlpbmcgZnJhbWUgY291bnQgYmFzZWQgb24gdHlwZS4KKyAgICAgICAgICAgICAgICBmcmFtZXMgPSBERUZBVUxUX1RFRV9GUkFNRVM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFRPRE86IHNob3VsZCB3ZSBjaGVjayBtaW5pbXVtIG51bWJlciBvZiBmcmFtZXM/CisKKyAgICAgICAgICAgIC8vIGRvbid0IGRvIGFueXRoaW5nIGlmIGZvcm1hdCBhbmQgZnJhbWVzIGFyZSB0aGUgc2FtZS4KKyAgICAgICAgICAgIGlmIChGb3JtYXRfaXNFcXVhbChmb3JtYXQsIG1Gb3JtYXQpICYmIGZyYW1lcyA9PSBtRnJhbWVzKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBib29sIGVuYWJsZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIGF1dG8gc2lua3NvdXJjZSA9IG1ha2VTaW5rU291cmNlKGZvcm1hdCwgZnJhbWVzLCAmZW5hYmxlZCk7CisKKyAgICAgICAgICAgIC8vIGVuYWJsZWQgaXMgc2V0IGlmIG1ha2VTaW5rU291cmNlIGlzIHN1Y2Nlc3NmdWwuCisgICAgICAgICAgICAvLyBOb3RlOiBhcyBtZW50aW9uZWQgaW4gTkJBSU9fVGVlOjpzZXQoKSwgZG9uJ3QgY2FsbCBzZXQoKSB3aGlsZSB3cml0ZSgpIGlzCisgICAgICAgICAgICAvLyBvbmdvaW5nLgorICAgICAgICAgICAgaWYgKGVuYWJsZWQpIHsKKyAgICAgICAgICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gX2wobUxvY2spOworICAgICAgICAgICAgICAgIG1GbGFncyA9IGZsYWdzOworICAgICAgICAgICAgICAgIG1Gb3JtYXQgPSBmb3JtYXQ7IC8vIGNvdWxkIGdldCB0aGlzIGZyb20gdGhlIFNpbmsuCisgICAgICAgICAgICAgICAgbUZyYW1lcyA9IGZyYW1lczsKKyAgICAgICAgICAgICAgICBtU2lua1NvdXJjZSA9IHN0ZDo6bW92ZShzaW5rc291cmNlKTsKKyAgICAgICAgICAgICAgICBtRW5hYmxlZC5zdG9yZSh0cnVlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBzZXRJZChjb25zdCBzdGQ6OnN0cmluZyAmaWQpIHsKKyAgICAgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBfbChtTG9jayk7CisgICAgICAgICAgICBtSWQgPSBpZDsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgZHVtcChpbnQgZmQsIGNvbnN0IHN0ZDo6c3RyaW5nICZyZWFzb24pIHsKKyAgICAgICAgICAgIGlmICghbURhdGFSZWFkeS5leGNoYW5nZShmYWxzZSkpIHJldHVybjsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHN1ZmZpeDsKKyAgICAgICAgICAgIE5CQUlPX1NpbmtTb3VyY2Ugc2lua1NvdXJjZTsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gX2wobUxvY2spOworICAgICAgICAgICAgICAgIHN1ZmZpeCA9IG1JZCArIHJlYXNvbjsKKyAgICAgICAgICAgICAgICBzaW5rU291cmNlID0gbVNpbmtTb3VyY2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkdW1wVGVlKGZkLCBzaW5rU291cmNlLCBzdWZmaXgpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCB3cml0ZShjb25zdCB2b2lkICpidWZmZXIsIHNpemVfdCBmcmFtZUNvdW50KSB7CisgICAgICAgICAgICBpZiAoIW1FbmFibGVkLmxvYWQoKSB8fCBmcmFtZUNvdW50ID09IDApIHJldHVybjsKKyAgICAgICAgICAgICh2b2lkKW1TaW5rU291cmNlLmZpcnN0LT53cml0ZShidWZmZXIsIGZyYW1lQ291bnQpOworICAgICAgICAgICAgbURhdGFSZWFkeS5zdG9yZSh0cnVlKTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgLy8gVFJJQ0tZOiBXZSBuZWVkIHRvIGtlZXAgdGhlIE5CQUlPX1NpbmsgYW5kIE5CQUlPX1NvdXJjZSBib3RoIGFsaXZlIGF0IHRoZSBzYW1lIHRpbWUKKyAgICAgICAgLy8gYmVjYXVzZSBQaXBlUmVhZGVyIGhvbGRzIGEgbmFrZWQgcmVmZXJlbmNlIChub3QgYSBzdHJvbmcgb3Igd2VhayBwb2ludGVyKSB0byBQaXBlLgorICAgICAgICB1c2luZyBOQkFJT19TaW5rU291cmNlID0gc3RkOjpwYWlyPHNwPE5CQUlPX1Npbms+LCBzcDxOQkFJT19Tb3VyY2U+PjsKKworICAgICAgICBzdGF0aWMgdm9pZCBkdW1wVGVlKGludCBmZCwgY29uc3QgTkJBSU9fU2lua1NvdXJjZSYgc2lua1NvdXJjZSwgY29uc3Qgc3RkOjpzdHJpbmcmIHN1ZmZpeCk7CisKKyAgICAgICAgc3RhdGljIE5CQUlPX1NpbmtTb3VyY2UgbWFrZVNpbmtTb3VyY2UoCisgICAgICAgICAgICAgICAgY29uc3QgTkJBSU9fRm9ybWF0ICZmb3JtYXQsIHNpemVfdCBmcmFtZXMsIGJvb2wgKmVuYWJsZWQpOworCisgICAgICAgIC8vIDB4MjAwMDAwIHN0ZXJlbyAxNi1iaXQgUENNIGZyYW1lcyA9IDQ3LjUgc2Vjb25kcyBhdCA0NC4xIGtIeiwgOCBtZWdhYnl0ZXMKKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3QgREVGQVVMVF9URUVfRlJBTUVTID0gMHgyMDAwMDA7CisKKyAgICAgICAgLy8gYXRvbWljIHN0YXR1cyBjaGVja2luZworICAgICAgICBzdGQ6OmF0b21pYzxib29sPiBtRW5hYmxlZHtmYWxzZX07CisgICAgICAgIHN0ZDo6YXRvbWljPGJvb2w+IG1EYXRhUmVhZHl7ZmFsc2V9OworCisgICAgICAgIC8vIGxvY2tlZCBkdW1wIGluZm9ybWF0aW9uCisgICAgICAgIG11dGFibGUgc3RkOjptdXRleCBtTG9jazsKKyAgICAgICAgc3RkOjpzdHJpbmcgbUlkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gR1VBUkRFRF9CWShtTG9jaykKKyAgICAgICAgVEVFX0ZMQUcgbUZsYWdzID0gVEVFX0ZMQUdfTk9ORTsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gR1VBUkRFRF9CWShtTG9jaykKKyAgICAgICAgTkJBSU9fRm9ybWF0IG1Gb3JtYXQgPSBGb3JtYXRfSW52YWxpZDsgICAgICAgICAgICAgICAgICAgLy8gR1VBUkRFRF9CWShtTG9jaykKKyAgICAgICAgc2l6ZV90IG1GcmFtZXMgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gR1VBUkRFRF9CWShtTG9jaykKKyAgICAgICAgTkJBSU9fU2lua1NvdXJjZSBtU2lua1NvdXJjZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gR1VBUkRFRF9CWShtTG9jaykKKyAgICB9OworCisgICAgLyoqIFJ1bm5pbmdUZWVzIHRyYWNrcyBjdXJyZW50IHJ1bm5pbmcgdGVlcyBmb3IgZHVtcCBwdXJwb3Nlcy4KKyAgICAgICAgSXQgaXMgaW1wbGVtZW50ZWQgdG8gaGF2ZSBtaW5pbWFsIGxvY2tlZCByZWdpb25zLCB0byBiZSB0cmFuc3BhcmVudCB0byB0aGUgY2FsbGVyLiAqLworICAgIGNsYXNzIFJ1bm5pbmdUZWVzIHsKKyAgICBwdWJsaWM6CisgICAgICAgIHZvaWQgYWRkKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxOQkFJT19UZWVJbXBsPiAmdGVlKSB7CisgICAgICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gX2wobUxvY2spOworICAgICAgICAgICAgQUxPR1dfSUYoIW1UZWVzLmVtcGxhY2UodGVlKS5zZWNvbmQsCisgICAgICAgICAgICAgICAgICAgICIlczogJXAgYWxyZWFkeSBleGlzdHMgaW4gbVRlZXMiLCBfX2Z1bmNfXywgdGVlLmdldCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgcmVtb3ZlKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxOQkFJT19UZWVJbXBsPiAmdGVlKSB7CisgICAgICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gX2wobUxvY2spOworICAgICAgICAgICAgQUxPR1dfSUYobVRlZXMuZXJhc2UodGVlKSAhPSAxLAorICAgICAgICAgICAgICAgICAgICAiJXM6ICVwIGRvZXNuJ3QgZXhpc3QgaW4gbVRlZXMiLCBfX2Z1bmNfXywgdGVlLmdldCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgZHVtcChpbnQgZmQsIGNvbnN0IHN0ZDo6c3RyaW5nICZyZWFzb24pIHsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxOQkFJT19UZWVJbXBsPj4gdGVlczsgLy8gc2FmZSBzbmFwc2hvdCBvZiB0ZWVzCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IF9sKG1Mb2NrKTsKKyAgICAgICAgICAgICAgICB0ZWVzLmluc2VydCh0ZWVzLmVuZCgpLCBtVGVlcy5iZWdpbigpLCBtVGVlcy5lbmQoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJnRlZSA6IHRlZXMpIHsKKyAgICAgICAgICAgICAgICB0ZWUtPmR1bXAoZmQsIHJlYXNvbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIHN0ZDo6bXV0ZXggbUxvY2s7CisgICAgICAgIHN0ZDo6c2V0PHN0ZDo6c2hhcmVkX3B0cjxOQkFJT19UZWVJbXBsPj4gbVRlZXM7IC8vIEdVQVJERURfQlkobUxvY2spCisgICAgfTsKKworICAgIC8vIHNpbmdsZXRvbgorICAgIHN0YXRpYyBSdW5uaW5nVGVlcyAmZ2V0UnVubmluZ1RlZXMoKSB7CisgICAgICAgIHN0YXRpYyBSdW5uaW5nVGVlcyBydW5uaW5nVGVlczsKKyAgICAgICAgcmV0dXJuIHJ1bm5pbmdUZWVzOworICAgIH0KKworICAgIC8vIFRoZSBOQkFJTyBUZWVJbXBsIG1heSBoYXZlIGxpZmV0aW1lIGxvbmdlciB0aGFuIE5CQUlPX1RlZSBpZgorICAgIC8vIFJ1bm5pbmdUZWVzOjpkdW1wKCkgaXMgYmVpbmcgY2FsbGVkIHNpbXVsdGFuZW91cyB0byB+TkJBSU9fVGVlKCkuCisgICAgLy8gVGhpcyBpcyBhbGxvd2VkIGZvciBtYXhpbXVtIGNvbmN1cnJlbmN5LgorICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxOQkFJT19UZWVJbXBsPiBtVGVlOworfTsgLy8gTkJBSU9fVGVlCisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIFRFRV9TSU5LCisjZW5kaWYgLy8gIUFORFJPSURfTkJBSU9fVEVFX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9QYXRjaFBhbmVsLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9QYXRjaFBhbmVsLmNwcAppbmRleCBlNWNiOGEyLi41MzhhMGViIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGF0Y2hQYW5lbC5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1BhdGNoUGFuZWwuY3BwCkBAIC0yNCw4ICsyNCw5IEBACiAjaW5jbHVkZSA8YXVkaW9fdXRpbHMvcHJpbWl0aXZlcy5oPgogCiAjaW5jbHVkZSAiQXVkaW9GbGluZ2VyLmgiCi0jaW5jbHVkZSAiU2VydmljZVV0aWxpdGllcy5oIgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUGFyYW1ldGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvUGF0Y2hCdWlsZGVyLmg+CisjaW5jbHVkZSA8bWVkaWF1dGlscy9TZXJ2aWNlVXRpbGl0aWVzLmg+CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIApAQCAtNDksMTExICs1MCw3NyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydHMpCiB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBpZiAobVBhdGNoUGFuZWwgIT0gMCkgewotICAgICAgICByZXR1cm4gbVBhdGNoUGFuZWwtPmxpc3RBdWRpb1BvcnRzKG51bV9wb3J0cywgcG9ydHMpOwotICAgIH0KLSAgICByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gbVBhdGNoUGFuZWwubGlzdEF1ZGlvUG9ydHMobnVtX3BvcnRzLCBwb3J0cyk7CiB9CiAKIC8qIEdldCBzdXBwb3J0ZWQgYXR0cmlidXRlcyBmb3IgYSBnaXZlbiBhdWRpbyBwb3J0ICovCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OmdldEF1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCkKIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGlmIChtUGF0Y2hQYW5lbCAhPSAwKSB7Ci0gICAgICAgIHJldHVybiBtUGF0Y2hQYW5lbC0+Z2V0QXVkaW9Qb3J0KHBvcnQpOwotICAgIH0KLSAgICByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gbVBhdGNoUGFuZWwuZ2V0QXVkaW9Qb3J0KHBvcnQpOwogfQogCi0KIC8qIENvbm5lY3QgYSBwYXRjaCBiZXR3ZWVuIHNldmVyYWwgc291cmNlIGFuZCBzaW5rIHBvcnRzICovCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OmNyZWF0ZUF1ZGlvUGF0Y2goY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSkKIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGlmIChtUGF0Y2hQYW5lbCAhPSAwKSB7Ci0gICAgICAgIHJldHVybiBtUGF0Y2hQYW5lbC0+Y3JlYXRlQXVkaW9QYXRjaChwYXRjaCwgaGFuZGxlKTsKLSAgICB9Ci0gICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIG1QYXRjaFBhbmVsLmNyZWF0ZUF1ZGlvUGF0Y2gocGF0Y2gsIGhhbmRsZSk7CiB9CiAKIC8qIERpc2Nvbm5lY3QgYSBwYXRjaCAqLwogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpyZWxlYXNlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpCiB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBpZiAobVBhdGNoUGFuZWwgIT0gMCkgewotICAgICAgICByZXR1cm4gbVBhdGNoUGFuZWwtPnJlbGVhc2VBdWRpb1BhdGNoKGhhbmRsZSk7Ci0gICAgfQotICAgIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBtUGF0Y2hQYW5lbC5yZWxlYXNlQXVkaW9QYXRjaChoYW5kbGUpOwogfQogCi0KIC8qIExpc3QgY29ubmVjdGVkIGF1ZGlvIHBvcnRzIGFuZCB0aGV5IGF0dHJpYnV0ZXMgKi8KIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6bGlzdEF1ZGlvUGF0Y2hlcyh1bnNpZ25lZCBpbnQgKm51bV9wYXRjaGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2hlcykKIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGlmIChtUGF0Y2hQYW5lbCAhPSAwKSB7Ci0gICAgICAgIHJldHVybiBtUGF0Y2hQYW5lbC0+bGlzdEF1ZGlvUGF0Y2hlcyhudW1fcGF0Y2hlcywgcGF0Y2hlcyk7CisgICAgcmV0dXJuIG1QYXRjaFBhbmVsLmxpc3RBdWRpb1BhdGNoZXMobnVtX3BhdGNoZXMsIHBhdGNoZXMpOworfQorCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlBhdGNoUGFuZWw6OlNvZnR3YXJlUGF0Y2g6OmdldExhdGVuY3lNc19sKGRvdWJsZSAqbGF0ZW5jeU1zKSBjb25zdAoreworICAgIGNvbnN0IGF1dG8mIGl0ZXIgPSBtUGF0Y2hQYW5lbC5tUGF0Y2hlcy5maW5kKG1QYXRjaEhhbmRsZSk7CisgICAgaWYgKGl0ZXIgIT0gbVBhdGNoUGFuZWwubVBhdGNoZXMuZW5kKCkpIHsKKyAgICAgICAgcmV0dXJuIGl0ZXItPnNlY29uZC5nZXRMYXRlbmN5TXMobGF0ZW5jeU1zKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KLSAgICByZXR1cm4gTk9fSU5JVDsKLX0KLQotLyogU2V0IGF1ZGlvIHBvcnQgY29uZmlndXJhdGlvbiAqLwotc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpzZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpCi17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBpZiAobVBhdGNoUGFuZWwgIT0gMCkgewotICAgICAgICByZXR1cm4gbVBhdGNoUGFuZWwtPnNldEF1ZGlvUG9ydENvbmZpZyhjb25maWcpOwotICAgIH0KLSAgICByZXR1cm4gTk9fSU5JVDsKLX0KLQotCi1BdWRpb0ZsaW5nZXI6OlBhdGNoUGFuZWw6OlBhdGNoUGFuZWwoY29uc3Qgc3A8QXVkaW9GbGluZ2VyPiYgYXVkaW9GbGluZ2VyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG1BdWRpb0ZsaW5nZXIoYXVkaW9GbGluZ2VyKQotewotfQotCi1BdWRpb0ZsaW5nZXI6OlBhdGNoUGFuZWw6On5QYXRjaFBhbmVsKCkKLXsKIH0KIAogLyogTGlzdCBjb25uZWN0ZWQgYXVkaW8gcG9ydHMgYW5kIHRoZWlyIGF0dHJpYnV0ZXMgKi8KIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6UGF0Y2hQYW5lbDo6bGlzdEF1ZGlvUG9ydHModW5zaWduZWQgaW50ICpudW1fcG9ydHMgX191bnVzZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0cyBfX3VudXNlZCkKIHsKLSAgICBBTE9HVigibGlzdEF1ZGlvUG9ydHMiKTsKKyAgICBBTE9HVihfX2Z1bmNfXyk7CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCiAvKiBHZXQgc3VwcG9ydGVkIGF0dHJpYnV0ZXMgZm9yIGEgZ2l2ZW4gYXVkaW8gcG9ydCAqLwogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQYXRjaFBhbmVsOjpnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQgX191bnVzZWQpCiB7Ci0gICAgQUxPR1YoImdldEF1ZGlvUG9ydCIpOworICAgIEFMT0dWKF9fZnVuY19fKTsKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLQogLyogQ29ubmVjdCBhIHBhdGNoIGJldHdlZW4gc2V2ZXJhbCBzb3VyY2UgYW5kIHNpbmsgcG9ydHMgKi8KIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6UGF0Y2hQYW5lbDo6Y3JlYXRlQXVkaW9QYXRjaChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlKQogewotICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOwotICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbEhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOwotICAgIHNwPEF1ZGlvRmxpbmdlcj4gYXVkaW9mbGluZ2VyID0gbUF1ZGlvRmxpbmdlci5wcm9tb3RlKCk7CiAgICAgaWYgKGhhbmRsZSA9PSBOVUxMIHx8IHBhdGNoID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9Ci0gICAgQUxPR1YoImNyZWF0ZUF1ZGlvUGF0Y2goKSBudW1fc291cmNlcyAlZCBudW1fc2lua3MgJWQgaGFuZGxlICVkIiwKLSAgICAgICAgICBwYXRjaC0+bnVtX3NvdXJjZXMsIHBhdGNoLT5udW1fc2lua3MsICpoYW5kbGUpOwotICAgIGlmIChhdWRpb2ZsaW5nZXIgPT0gMCkgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9CisgICAgQUxPR1YoIiVzKCkgbnVtX3NvdXJjZXMgJWQgbnVtX3NpbmtzICVkIGhhbmRsZSAlZCIsCisgICAgICAgICAgICBfX2Z1bmNfXywgcGF0Y2gtPm51bV9zb3VyY2VzLCBwYXRjaC0+bnVtX3NpbmtzLCAqaGFuZGxlKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKKyAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBoYWxIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKIAotICAgIGlmIChwYXRjaC0+bnVtX3NvdXJjZXMgPT0gMCB8fCBwYXRjaC0+bnVtX3NvdXJjZXMgPiBBVURJT19QQVRDSF9QT1JUU19NQVggfHwKLSAgICAgICAgICAgIChwYXRjaC0+bnVtX3NpbmtzID09IDAgJiYgcGF0Y2gtPm51bV9zb3VyY2VzICE9IDIpIHx8Ci0gICAgICAgICAgICBwYXRjaC0+bnVtX3NpbmtzID4gQVVESU9fUEFUQ0hfUE9SVFNfTUFYKSB7CisgICAgaWYgKCFhdWRpb19wYXRjaF9pc192YWxpZChwYXRjaCkgfHwgKHBhdGNoLT5udW1fc2lua3MgPT0gMCAmJiBwYXRjaC0+bnVtX3NvdXJjZXMgIT0gMikpIHsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAgICAgLy8gbGltaXQgbnVtYmVyIG9mIHNvdXJjZXMgdG8gMSBmb3Igbm93IG9yIDIgc291cmNlcyBmb3Igc3BlY2lhbCBjcm9zcyBodyBtb2R1bGUgY2FzZS4KQEAgLTE2Myw4MSArMTMwLDczIEBACiAgICAgfQogCiAgICAgaWYgKCpoYW5kbGUgIT0gQVVESU9fUEFUQ0hfSEFORExFX05PTkUpIHsKLSAgICAgICAgZm9yIChzaXplX3QgaW5kZXggPSAwOyAqaGFuZGxlICE9IDAgJiYgaW5kZXggPCBtUGF0Y2hlcy5zaXplKCk7IGluZGV4KyspIHsKLSAgICAgICAgICAgIGlmICgqaGFuZGxlID09IG1QYXRjaGVzW2luZGV4XS0+bUhhbmRsZSkgewotICAgICAgICAgICAgICAgIEFMT0dWKCJjcmVhdGVBdWRpb1BhdGNoKCkgcmVtb3ZpbmcgcGF0Y2ggaGFuZGxlICVkIiwgKmhhbmRsZSk7Ci0gICAgICAgICAgICAgICAgaGFsSGFuZGxlID0gbVBhdGNoZXNbaW5kZXhdLT5tSGFsSGFuZGxlOwotICAgICAgICAgICAgICAgIFBhdGNoICpyZW1vdmVkUGF0Y2ggPSBtUGF0Y2hlc1tpbmRleF07Ci0gICAgICAgICAgICAgICAgLy8gZnJlZSByZXNvdXJjZXMgb3duZWQgYnkgdGhlIHJlbW92ZWQgcGF0Y2ggaWYgYXBwbGljYWJsZQotICAgICAgICAgICAgICAgIC8vIDEpIGlmIGEgc29mdHdhcmUgcGF0Y2ggaXMgcHJlc2VudCwgcmVsZWFzZSB0aGUgcGxheWJhY2sgYW5kIGNhcHR1cmUgdGhyZWFkcyBhbmQKLSAgICAgICAgICAgICAgICAvLyB0cmFja3MgY3JlYXRlZC4gVGhpcyB3aWxsIGFsc28gcmVsZWFzZSB0aGUgY29ycmVzcG9uZGluZyBhdWRpbyBIQUwgcGF0Y2hlcwotICAgICAgICAgICAgICAgIGlmICgocmVtb3ZlZFBhdGNoLT5tUmVjb3JkUGF0Y2hIYW5kbGUKLSAgICAgICAgICAgICAgICAgICAgICAgICE9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgKHJlbW92ZWRQYXRjaC0+bVBsYXliYWNrUGF0Y2hIYW5kbGUgIT0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fUEFUQ0hfSEFORExFX05PTkUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNsZWFyUGF0Y2hDb25uZWN0aW9ucyhyZW1vdmVkUGF0Y2gpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyAyKSBpZiB0aGUgbmV3IHBhdGNoIGFuZCBvbGQgcGF0Y2ggc291cmNlIG9yIHNpbmsgYXJlIGRldmljZXMgZnJvbSBkaWZmZXJlbnQKLSAgICAgICAgICAgICAgICAvLyBodyBtb2R1bGVzLCAgY2xlYXIgdGhlIGF1ZGlvIEhBTCBwYXRjaGVzIG5vdyBiZWNhdXNlIHRoZXkgd2lsbCBub3QgYmUgdXBkYXRlZAotICAgICAgICAgICAgICAgIC8vIGJ5IGNhbGwgdG8gY3JlYXRlX2F1ZGlvX3BhdGNoKCkgYmVsb3cgd2hpY2ggd2lsbCBoYXBwZW4gb24gYSBkaWZmZXJlbnQgSFcgbW9kdWxlCi0gICAgICAgICAgICAgICAgaWYgKGhhbEhhbmRsZSAhPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORSkgewotICAgICAgICAgICAgICAgICAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3QgaHdNb2R1bGUgPSBBVURJT19NT0RVTEVfSEFORExFX05PTkU7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgocmVtb3ZlZFBhdGNoLT5tQXVkaW9QYXRjaC5zb3VyY2VzWzBdLnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICgocGF0Y2gtPnNvdXJjZXNbMF0udHlwZSAhPSBBVURJT19QT1JUX1RZUEVfREVWSUNFKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAocmVtb3ZlZFBhdGNoLT5tQXVkaW9QYXRjaC5zb3VyY2VzWzBdLmV4dC5kZXZpY2UuaHdfbW9kdWxlICE9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c291cmNlc1swXS5leHQuZGV2aWNlLmh3X21vZHVsZSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBod01vZHVsZSA9IHJlbW92ZWRQYXRjaC0+bUF1ZGlvUGF0Y2guc291cmNlc1swXS5leHQuZGV2aWNlLmh3X21vZHVsZTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgocGF0Y2gtPm51bV9zaW5rcyA9PSAwKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgocmVtb3ZlZFBhdGNoLT5tQXVkaW9QYXRjaC5zaW5rc1swXS50eXBlID09IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgocGF0Y2gtPnNpbmtzWzBdLnR5cGUgIT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZW1vdmVkUGF0Y2gtPm1BdWRpb1BhdGNoLnNpbmtzWzBdLmV4dC5kZXZpY2UuaHdfbW9kdWxlICE9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzWzBdLmV4dC5kZXZpY2UuaHdfbW9kdWxlKSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBOb3RlIG9uIChwYXRjaC0+bnVtX3NpbmtzID09IDApOiB0aGlzIHNpdHVhdGlvbiBzaG91bGQgbm90IGhhcHBlbiBhcwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlc2Ugc3BlY2lhbCBwYXRjaGVzIGFyZSBvbmx5IGNyZWF0ZWQgYnkgdGhlIHBvbGljeSBtYW5hZ2VyIGJ1dCBqdXN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbiBjYXNlLCBzeXN0ZW1hdGljYWxseSBjbGVhciB0aGUgSEFMIHBhdGNoLgotICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHJlbW92ZWRQYXRjaC0+bUF1ZGlvUGF0Y2gubnVtX3NpbmtzIGNhbm5vdCBiZSAwIGhlcmUgYmVjYXVzZQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGFsSGFuZGxlIHdvdWxkIGJlIEFVRElPX1BBVENIX0hBTkRMRV9OT05FIGluIHRoaXMgY2FzZS4KLSAgICAgICAgICAgICAgICAgICAgICAgIGh3TW9kdWxlID0gcmVtb3ZlZFBhdGNoLT5tQXVkaW9QYXRjaC5zaW5rc1swXS5leHQuZGV2aWNlLmh3X21vZHVsZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoaHdNb2R1bGUgIT0gQVVESU9fTU9EVUxFX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzc2l6ZV90IGluZGV4ID0gYXVkaW9mbGluZ2VyLT5tQXVkaW9Id0RldnMuaW5kZXhPZktleShod01vZHVsZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPERldmljZUhhbEludGVyZmFjZT4gaHdEZXZpY2UgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9mbGluZ2VyLT5tQXVkaW9Id0RldnMudmFsdWVBdChpbmRleCktPmh3RGV2aWNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaHdEZXZpY2UtPnJlbGVhc2VBdWRpb1BhdGNoKGhhbEhhbmRsZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbVBhdGNoZXMucmVtb3ZlQXQoaW5kZXgpOwotICAgICAgICAgICAgICAgIGRlbGV0ZSByZW1vdmVkUGF0Y2g7Ci0gICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGF1dG8gaXRlciA9IG1QYXRjaGVzLmZpbmQoKmhhbmRsZSk7CisgICAgICAgIGlmIChpdGVyICE9IG1QYXRjaGVzLmVuZCgpKSB7CisgICAgICAgICAgICBBTE9HVigiJXMoKSByZW1vdmluZyBwYXRjaCBoYW5kbGUgJWQiLCBfX2Z1bmNfXywgKmhhbmRsZSk7CisgICAgICAgICAgICBQYXRjaCAmcmVtb3ZlZFBhdGNoID0gaXRlci0+c2Vjb25kOworICAgICAgICAgICAgLy8gZnJlZSByZXNvdXJjZXMgb3duZWQgYnkgdGhlIHJlbW92ZWQgcGF0Y2ggaWYgYXBwbGljYWJsZQorICAgICAgICAgICAgLy8gMSkgaWYgYSBzb2Z0d2FyZSBwYXRjaCBpcyBwcmVzZW50LCByZWxlYXNlIHRoZSBwbGF5YmFjayBhbmQgY2FwdHVyZSB0aHJlYWRzIGFuZAorICAgICAgICAgICAgLy8gdHJhY2tzIGNyZWF0ZWQuIFRoaXMgd2lsbCBhbHNvIHJlbGVhc2UgdGhlIGNvcnJlc3BvbmRpbmcgYXVkaW8gSEFMIHBhdGNoZXMKKyAgICAgICAgICAgIGlmIChyZW1vdmVkUGF0Y2guaXNTb2Z0d2FyZSgpKSB7CisgICAgICAgICAgICAgICAgcmVtb3ZlZFBhdGNoLmNsZWFyQ29ubmVjdGlvbnModGhpcyk7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAyKSBpZiB0aGUgbmV3IHBhdGNoIGFuZCBvbGQgcGF0Y2ggc291cmNlIG9yIHNpbmsgYXJlIGRldmljZXMgZnJvbSBkaWZmZXJlbnQKKyAgICAgICAgICAgIC8vIGh3IG1vZHVsZXMsICBjbGVhciB0aGUgYXVkaW8gSEFMIHBhdGNoZXMgbm93IGJlY2F1c2UgdGhleSB3aWxsIG5vdCBiZSB1cGRhdGVkCisgICAgICAgICAgICAvLyBieSBjYWxsIHRvIGNyZWF0ZV9hdWRpb19wYXRjaCgpIGJlbG93IHdoaWNoIHdpbGwgaGFwcGVuIG9uIGEgZGlmZmVyZW50IEhXIG1vZHVsZQorICAgICAgICAgICAgaWYgKHJlbW92ZWRQYXRjaC5tSGFsSGFuZGxlICE9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FKSB7CisgICAgICAgICAgICAgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IGh3TW9kdWxlID0gQVVESU9fTU9EVUxFX0hBTkRMRV9OT05FOworICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAmb2xkUGF0Y2ggPSByZW1vdmVkUGF0Y2gubUF1ZGlvUGF0Y2g7CisgICAgICAgICAgICAgICAgaWYgKG9sZFBhdGNoLnNvdXJjZXNbMF0udHlwZSA9PSBBVURJT19QT1JUX1RZUEVfREVWSUNFICYmCisgICAgICAgICAgICAgICAgICAgICAgICAocGF0Y2gtPnNvdXJjZXNbMF0udHlwZSAhPSBBVURJT19QT1JUX1RZUEVfREVWSUNFIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZFBhdGNoLnNvdXJjZXNbMF0uZXh0LmRldmljZS5od19tb2R1bGUgIT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNvdXJjZXNbMF0uZXh0LmRldmljZS5od19tb2R1bGUpKSB7CisgICAgICAgICAgICAgICAgICAgIGh3TW9kdWxlID0gb2xkUGF0Y2guc291cmNlc1swXS5leHQuZGV2aWNlLmh3X21vZHVsZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBhdGNoLT5udW1fc2lua3MgPT0gMCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgKG9sZFBhdGNoLnNpbmtzWzBdLnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGF0Y2gtPnNpbmtzWzBdLnR5cGUgIT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZFBhdGNoLnNpbmtzWzBdLmV4dC5kZXZpY2UuaHdfbW9kdWxlICE9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzWzBdLmV4dC5kZXZpY2UuaHdfbW9kdWxlKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gTm90ZSBvbiAocGF0Y2gtPm51bV9zaW5rcyA9PSAwKTogdGhpcyBzaXR1YXRpb24gc2hvdWxkIG5vdCBoYXBwZW4gYXMKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlc2Ugc3BlY2lhbCBwYXRjaGVzIGFyZSBvbmx5IGNyZWF0ZWQgYnkgdGhlIHBvbGljeSBtYW5hZ2VyIGJ1dCBqdXN0CisgICAgICAgICAgICAgICAgICAgIC8vIGluIGNhc2UsIHN5c3RlbWF0aWNhbGx5IGNsZWFyIHRoZSBIQUwgcGF0Y2guCisgICAgICAgICAgICAgICAgICAgIC8vIE5vdGUgdGhhdCByZW1vdmVkUGF0Y2gubUF1ZGlvUGF0Y2gubnVtX3NpbmtzIGNhbm5vdCBiZSAwIGhlcmUgYmVjYXVzZQorICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmVkUGF0Y2gubUhhbEhhbmRsZSB3b3VsZCBiZSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORSBpbiB0aGlzIGNhc2UuCisgICAgICAgICAgICAgICAgICAgIGh3TW9kdWxlID0gb2xkUGF0Y2guc2lua3NbMF0uZXh0LmRldmljZS5od19tb2R1bGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNwPERldmljZUhhbEludGVyZmFjZT4gaHdEZXZpY2UgPSBmaW5kSHdEZXZpY2VCeU1vZHVsZShod01vZHVsZSk7CisgICAgICAgICAgICAgICAgaWYgKGh3RGV2aWNlICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaHdEZXZpY2UtPnJlbGVhc2VBdWRpb1BhdGNoKHJlbW92ZWRQYXRjaC5tSGFsSGFuZGxlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtUGF0Y2hlcy5lcmFzZShpdGVyKTsKKyAgICAgICAgICAgIHJlbW92ZVNvZnR3YXJlUGF0Y2hGcm9tSW5zZXJ0ZWRNb2R1bGVzKCpoYW5kbGUpOwogICAgICAgICB9CiAgICAgfQogCi0gICAgUGF0Y2ggKm5ld1BhdGNoID0gbmV3IFBhdGNoKHBhdGNoKTsKKyAgICBQYXRjaCBuZXdQYXRjaHsqcGF0Y2h9OworICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBpbnNlcnRlZE1vZHVsZSA9IEFVRElPX01PRFVMRV9IQU5ETEVfTk9ORTsKIAogICAgIHN3aXRjaCAocGF0Y2gtPnNvdXJjZXNbMF0udHlwZSkgewogICAgICAgICBjYXNlIEFVRElPX1BPUlRfVFlQRV9ERVZJQ0U6IHsKICAgICAgICAgICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBzcmNNb2R1bGUgPSBwYXRjaC0+c291cmNlc1swXS5leHQuZGV2aWNlLmh3X21vZHVsZTsKLSAgICAgICAgICAgIHNzaXplX3QgaW5kZXggPSBhdWRpb2ZsaW5nZXItPm1BdWRpb0h3RGV2cy5pbmRleE9mS2V5KHNyY01vZHVsZSk7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coImNyZWF0ZUF1ZGlvUGF0Y2goKSBiYWQgc3JjIGh3IG1vZHVsZSAlZCIsIHNyY01vZHVsZSk7CisgICAgICAgICAgICBBdWRpb0h3RGV2aWNlICphdWRpb0h3RGV2aWNlID0gZmluZEF1ZGlvSHdEZXZpY2VCeU1vZHVsZShzcmNNb2R1bGUpOworICAgICAgICAgICAgaWYgKCFhdWRpb0h3RGV2aWNlKSB7CiAgICAgICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEF1ZGlvSHdEZXZpY2UgKmF1ZGlvSHdEZXZpY2UgPSBhdWRpb2ZsaW5nZXItPm1BdWRpb0h3RGV2cy52YWx1ZUF0KGluZGV4KTsKICAgICAgICAgICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgcGF0Y2gtPm51bV9zaW5rczsgaSsrKSB7CiAgICAgICAgICAgICAgICAgLy8gc3VwcG9ydCBvbmx5IG9uZSBzaW5rIGlmIGNvbm5lY3Rpb24gdG8gYSBtaXggb3IgYWNyb3NzIEhXIG1vZHVsZXMKICAgICAgICAgICAgICAgICBpZiAoKHBhdGNoLT5zaW5rc1tpXS50eXBlID09IEFVRElPX1BPUlRfVFlQRV9NSVggfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rc1tpXS5leHQubWl4Lmh3X21vZHVsZSAhPSBzcmNNb2R1bGUpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwYXRjaC0+c2lua3NbaV0udHlwZSA9PSBBVURJT19QT1JUX1RZUEVfREVWSUNFICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzW2ldLmV4dC5kZXZpY2UuaHdfbW9kdWxlICE9IHNyY01vZHVsZSkpICYmCiAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+bnVtX3NpbmtzID4gMSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVygiJXMoKSBtdWx0aXBsZSBzaW5rcyBmb3IgbWl4IG9yIGFjcm9zcyBtb2R1bGVzIG5vdCBzdXBwb3J0ZWQiLCBfX2Z1bmNfXyk7CiAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIC8vIHJlamVjdCBjb25uZWN0aW9uIHRvIGRpZmZlcmVudCBzaW5rIHR5cGVzCiAgICAgICAgICAgICAgICAgaWYgKHBhdGNoLT5zaW5rc1tpXS50eXBlICE9IHBhdGNoLT5zaW5rc1swXS50eXBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dXKCJjcmVhdGVBdWRpb1BhdGNoKCkgZGlmZmVyZW50IHNpbmsgdHlwZXMgaW4gc2FtZSBwYXRjaCBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCIlcygpIGRpZmZlcmVudCBzaW5rIHR5cGVzIGluIHNhbWUgcGF0Y2ggbm90IHN1cHBvcnRlZCIsIF9fZnVuY19fKTsKICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CiAgICAgICAgICAgICAgICAgfQpAQCAtMjU2LDM4ICsyMTUsNTIgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKHBhdGNoLT5zb3VyY2VzWzFdLnR5cGUgIT0gQVVESU9fUE9SVF9UWVBFX01JWCB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwYXRjaC0+bnVtX3NpbmtzICE9IDAgJiYgcGF0Y2gtPnNpbmtzWzBdLmV4dC5kZXZpY2UuaHdfbW9kdWxlICE9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c291cmNlc1sxXS5leHQubWl4Lmh3X21vZHVsZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJjcmVhdGVBdWRpb1BhdGNoKCkgaW52YWxpZCBzb3VyY2UgY29tYmluYXRpb24iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCIlcygpIGludmFsaWQgc291cmNlIGNvbWJpbmF0aW9uIiwgX19mdW5jX18pOwogICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CiAgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvZmxpbmdlci0+Y2hlY2tQbGF5YmFja1RocmVhZF9sKHBhdGNoLT5zb3VyY2VzWzFdLmV4dC5taXguaGFuZGxlKTsKLSAgICAgICAgICAgICAgICAgICAgbmV3UGF0Y2gtPm1QbGF5YmFja1RocmVhZCA9IChNaXhlclRocmVhZCAqKXRocmVhZC5nZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQXVkaW9GbGluZ2VyLmNoZWNrUGxheWJhY2tUaHJlYWRfbChwYXRjaC0+c291cmNlc1sxXS5leHQubWl4LmhhbmRsZSk7CiAgICAgICAgICAgICAgICAgICAgIGlmICh0aHJlYWQgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coImNyZWF0ZUF1ZGlvUGF0Y2goKSBjYW5ub3QgZ2V0IHBsYXliYWNrIHRocmVhZCIpOworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coIiVzKCkgY2Fubm90IGdldCBwbGF5YmFjayB0aHJlYWQiLCBfX2Z1bmNfXyk7CiAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBleGlzdGluZyBwbGF5YmFjayB0aHJlYWQgaXMgcmV1c2VkLCBzbyBpdCBpcyBub3QgY2xvc2VkIHdoZW4gcGF0Y2ggaXMgY2xlYXJlZAorICAgICAgICAgICAgICAgICAgICBuZXdQYXRjaC5tUGxheWJhY2suc2V0VGhyZWFkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UGxheWJhY2tUaHJlYWQqPih0aHJlYWQuZ2V0KCkpLCBmYWxzZSAvKmNsb3NlVGhyZWFkKi8pOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ190IGNvbmZpZyA9IEFVRElPX0NPTkZJR19JTklUSUFMSVpFUjsKICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IHBhdGNoLT5zaW5rc1swXS5leHQuZGV2aWNlLnR5cGU7CiAgICAgICAgICAgICAgICAgICAgIFN0cmluZzggYWRkcmVzcyA9IFN0cmluZzgocGF0Y2gtPnNpbmtzWzBdLmV4dC5kZXZpY2UuYWRkcmVzcyk7CiAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOwotICAgICAgICAgICAgICAgICAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBhdWRpb2ZsaW5nZXItPm9wZW5PdXRwdXRfbCgKKyAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MgPSBBVURJT19PVVRQVVRfRkxBR19OT05FOworICAgICAgICAgICAgICAgICAgICBpZiAocGF0Y2gtPnNpbmtzWzBdLmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfU0FNUExFX1JBVEUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5zYW1wbGVfcmF0ZSA9IHBhdGNoLT5zaW5rc1swXS5zYW1wbGVfcmF0ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAocGF0Y2gtPnNpbmtzWzBdLmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfQ0hBTk5FTF9NQVNLKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcuY2hhbm5lbF9tYXNrID0gcGF0Y2gtPnNpbmtzWzBdLmNoYW5uZWxfbWFzazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAocGF0Y2gtPnNpbmtzWzBdLmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfRk9STUFUKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcuZm9ybWF0ID0gcGF0Y2gtPnNpbmtzWzBdLmZvcm1hdDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAocGF0Y2gtPnNpbmtzWzBdLmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfRkxBR1MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzID0gcGF0Y2gtPnNpbmtzWzBdLmZsYWdzLm91dHB1dDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBtQXVkaW9GbGluZ2VyLm9wZW5PdXRwdXRfbCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rc1swXS5leHQuZGV2aWNlLmh3X21vZHVsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX09VVFBVVF9GTEFHX05PTkUpOwotICAgICAgICAgICAgICAgICAgICBuZXdQYXRjaC0+bVBsYXliYWNrVGhyZWFkID0gKFBsYXliYWNrVGhyZWFkICopdGhyZWFkLmdldCgpOwotICAgICAgICAgICAgICAgICAgICBBTE9HVigiYXVkaW9mbGluZ2VyLT5vcGVuT3V0cHV0X2woKSByZXR1cm5lZCAlcCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdQYXRjaC0+bVBsYXliYWNrVGhyZWFkLmdldCgpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1BhdGNoLT5tUGxheWJhY2tUaHJlYWQgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOworICAgICAgICAgICAgICAgICAgICBBTE9HVigibUF1ZGlvRmxpbmdlci5vcGVuT3V0cHV0X2woKSByZXR1cm5lZCAlcCIsIHRocmVhZC5nZXQoKSk7CisgICAgICAgICAgICAgICAgICAgIGlmICh0aHJlYWQgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gTk9fTUVNT1JZOwogICAgICAgICAgICAgICAgICAgICAgICAgZ290byBleGl0OwogICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG5ld1BhdGNoLm1QbGF5YmFjay5zZXRUaHJlYWQocmVpbnRlcnByZXRfY2FzdDxQbGF5YmFja1RocmVhZCo+KHRocmVhZC5nZXQoKSkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gcGF0Y2gtPnNvdXJjZXNbMF0uZXh0LmRldmljZS50eXBlOwogICAgICAgICAgICAgICAgIFN0cmluZzggYWRkcmVzcyA9IFN0cmluZzgocGF0Y2gtPnNvdXJjZXNbMF0uZXh0LmRldmljZS5hZGRyZXNzKTsKQEAgLTI5Nyw0NyArMjcwLDUzIEBACiAgICAgICAgICAgICAgICAgaWYgKHBhdGNoLT5zb3VyY2VzWzBdLmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfU0FNUExFX1JBVEUpIHsKICAgICAgICAgICAgICAgICAgICAgY29uZmlnLnNhbXBsZV9yYXRlID0gcGF0Y2gtPnNvdXJjZXNbMF0uc2FtcGxlX3JhdGU7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgY29uZmlnLnNhbXBsZV9yYXRlID0gbmV3UGF0Y2gtPm1QbGF5YmFja1RocmVhZC0+c2FtcGxlUmF0ZSgpOworICAgICAgICAgICAgICAgICAgICBjb25maWcuc2FtcGxlX3JhdGUgPSBuZXdQYXRjaC5tUGxheWJhY2sudGhyZWFkKCktPnNhbXBsZVJhdGUoKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYgKHBhdGNoLT5zb3VyY2VzWzBdLmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfQ0hBTk5FTF9NQVNLKSB7CiAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5jaGFubmVsX21hc2sgPSBwYXRjaC0+c291cmNlc1swXS5jaGFubmVsX21hc2s7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgY29uZmlnLmNoYW5uZWxfbWFzayA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX2luX21hc2tfZnJvbV9jb3VudChuZXdQYXRjaC0+bVBsYXliYWNrVGhyZWFkLT5jaGFubmVsQ291bnQoKSk7CisgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5jaGFubmVsX21hc2sgPSBhdWRpb19jaGFubmVsX2luX21hc2tfZnJvbV9jb3VudCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdQYXRjaC5tUGxheWJhY2sudGhyZWFkKCktPmNoYW5uZWxDb3VudCgpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYgKHBhdGNoLT5zb3VyY2VzWzBdLmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfRk9STUFUKSB7CiAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5mb3JtYXQgPSBwYXRjaC0+c291cmNlc1swXS5mb3JtYXQ7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgY29uZmlnLmZvcm1hdCA9IG5ld1BhdGNoLT5tUGxheWJhY2tUaHJlYWQtPmZvcm1hdCgpOworICAgICAgICAgICAgICAgICAgICBjb25maWcuZm9ybWF0ID0gbmV3UGF0Y2gubVBsYXliYWNrLnRocmVhZCgpLT5mb3JtYXQoKTsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncyA9CisgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c291cmNlc1swXS5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX0ZMQUdTID8KKyAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zb3VyY2VzWzBdLmZsYWdzLmlucHV0IDogQVVESU9fSU5QVVRfRkxBR19OT05FOwogICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7Ci0gICAgICAgICAgICAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gYXVkaW9mbGluZ2VyLT5vcGVuSW5wdXRfbChzcmNNb2R1bGUsCisgICAgICAgICAgICAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gbUF1ZGlvRmxpbmdlci5vcGVuSW5wdXRfbChzcmNNb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfTUlDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19JTlBVVF9GTEFHX05PTkUpOwotICAgICAgICAgICAgICAgIG5ld1BhdGNoLT5tUmVjb3JkVGhyZWFkID0gKFJlY29yZFRocmVhZCAqKXRocmVhZC5nZXQoKTsKLSAgICAgICAgICAgICAgICBBTE9HVigiYXVkaW9mbGluZ2VyLT5vcGVuSW5wdXRfbCgpIHJldHVybmVkICVwIGluQ2hhbm5lbE1hc2sgJTA4eCIsCi0gICAgICAgICAgICAgICAgICAgICAgbmV3UGF0Y2gtPm1SZWNvcmRUaHJlYWQuZ2V0KCksIGNvbmZpZy5jaGFubmVsX21hc2spOwotICAgICAgICAgICAgICAgIGlmIChuZXdQYXRjaC0+bVJlY29yZFRocmVhZCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKyAgICAgICAgICAgICAgICBBTE9HVigibUF1ZGlvRmxpbmdlci5vcGVuSW5wdXRfbCgpIHJldHVybmVkICVwIGluQ2hhbm5lbE1hc2sgJTA4eCIsCisgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkLmdldCgpLCBjb25maWcuY2hhbm5lbF9tYXNrKTsKKyAgICAgICAgICAgICAgICBpZiAodGhyZWFkID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gTk9fTUVNT1JZOwogICAgICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHN0YXR1cyA9IGNyZWF0ZVBhdGNoQ29ubmVjdGlvbnMobmV3UGF0Y2gsIHBhdGNoKTsKKyAgICAgICAgICAgICAgICBuZXdQYXRjaC5tUmVjb3JkLnNldFRocmVhZChyZWludGVycHJldF9jYXN0PFJlY29yZFRocmVhZCo+KHRocmVhZC5nZXQoKSkpOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IG5ld1BhdGNoLmNyZWF0ZUNvbm5lY3Rpb25zKHRoaXMpOwogICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgICAgICAgICAgZ290byBleGl0OwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoYXVkaW9Id0RldmljZS0+aXNJbnNlcnQoKSkgeworICAgICAgICAgICAgICAgICAgICBpbnNlcnRlZE1vZHVsZSA9IGF1ZGlvSHdEZXZpY2UtPmhhbmRsZSgpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgaWYgKHBhdGNoLT5zaW5rc1swXS50eXBlID09IEFVRElPX1BPUlRfVFlQRV9NSVgpIHsKLSAgICAgICAgICAgICAgICAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gYXVkaW9mbGluZ2VyLT5jaGVja1JlY29yZFRocmVhZF9sKAorICAgICAgICAgICAgICAgICAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBtQXVkaW9GbGluZ2VyLmNoZWNrUmVjb3JkVGhyZWFkX2woCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rc1swXS5leHQubWl4LmhhbmRsZSk7CiAgICAgICAgICAgICAgICAgICAgIGlmICh0aHJlYWQgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkID0gYXVkaW9mbGluZ2VyLT5jaGVja01tYXBUaHJlYWRfbChwYXRjaC0+c2lua3NbMF0uZXh0Lm1peC5oYW5kbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkID0gbUF1ZGlvRmxpbmdlci5jaGVja01tYXBUaHJlYWRfbChwYXRjaC0+c2lua3NbMF0uZXh0Lm1peC5oYW5kbGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRocmVhZCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coImNyZWF0ZUF1ZGlvUGF0Y2goKSBiYWQgY2FwdHVyZSBJL08gaGFuZGxlICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rc1swXS5leHQubWl4LmhhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coIiVzKCkgYmFkIGNhcHR1cmUgSS9PIGhhbmRsZSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgcGF0Y2gtPnNpbmtzWzBdLmV4dC5taXguaGFuZGxlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBleGl0OwogICAgICAgICAgICAgICAgICAgICAgICAgfQpAQCAtMzU2LDkgKzMzNSw5IEBACiAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgQVVESU9fUE9SVF9UWVBFX01JWDogewogICAgICAgICAgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IHNyY01vZHVsZSA9ICBwYXRjaC0+c291cmNlc1swXS5leHQubWl4Lmh3X21vZHVsZTsKLSAgICAgICAgICAgIHNzaXplX3QgaW5kZXggPSBhdWRpb2ZsaW5nZXItPm1BdWRpb0h3RGV2cy5pbmRleE9mS2V5KHNyY01vZHVsZSk7CisgICAgICAgICAgICBzc2l6ZV90IGluZGV4ID0gbUF1ZGlvRmxpbmdlci5tQXVkaW9Id0RldnMuaW5kZXhPZktleShzcmNNb2R1bGUpOwogICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICAgICAgICAgIEFMT0dXKCJjcmVhdGVBdWRpb1BhdGNoKCkgYmFkIHNyYyBodyBtb2R1bGUgJWQiLCBzcmNNb2R1bGUpOworICAgICAgICAgICAgICAgIEFMT0dXKCIlcygpIGJhZCBzcmMgaHcgbW9kdWxlICVkIiwgX19mdW5jX18sIHNyY01vZHVsZSk7CiAgICAgICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKICAgICAgICAgICAgIH0KQEAgLTM2Niw4ICszNDUsOCBAQAogICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IHR5cGUgPSBBVURJT19ERVZJQ0VfTk9ORTsKICAgICAgICAgICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgcGF0Y2gtPm51bV9zaW5rczsgaSsrKSB7CiAgICAgICAgICAgICAgICAgaWYgKHBhdGNoLT5zaW5rc1tpXS50eXBlICE9IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1coImNyZWF0ZUF1ZGlvUGF0Y2goKSBpbnZhbGlkIHNpbmsgdHlwZSAlZCBmb3IgbWl4IHNvdXJjZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rc1tpXS50eXBlKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coIiVzKCkgaW52YWxpZCBzaW5rIHR5cGUgJWQgZm9yIG1peCBzb3VyY2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBwYXRjaC0+c2lua3NbaV0udHlwZSk7CiAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgICAgICAgICAgICAgZ290byBleGl0OwogICAgICAgICAgICAgICAgIH0KQEAgLTM3OSwyMSArMzU4LDIxIEBACiAgICAgICAgICAgICAgICAgdHlwZSB8PSBwYXRjaC0+c2lua3NbaV0uZXh0LmRldmljZS50eXBlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb2ZsaW5nZXItPmNoZWNrUGxheWJhY2tUaHJlYWRfbChwYXRjaC0+c291cmNlc1swXS5leHQubWl4LmhhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvRmxpbmdlci5jaGVja1BsYXliYWNrVGhyZWFkX2wocGF0Y2gtPnNvdXJjZXNbMF0uZXh0Lm1peC5oYW5kbGUpOwogICAgICAgICAgICAgaWYgKHRocmVhZCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgdGhyZWFkID0gYXVkaW9mbGluZ2VyLT5jaGVja01tYXBUaHJlYWRfbChwYXRjaC0+c291cmNlc1swXS5leHQubWl4LmhhbmRsZSk7CisgICAgICAgICAgICAgICAgdGhyZWFkID0gbUF1ZGlvRmxpbmdlci5jaGVja01tYXBUaHJlYWRfbChwYXRjaC0+c291cmNlc1swXS5leHQubWl4LmhhbmRsZSk7CiAgICAgICAgICAgICAgICAgaWYgKHRocmVhZCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dXKCJjcmVhdGVBdWRpb1BhdGNoKCkgYmFkIHBsYXliYWNrIEkvTyBoYW5kbGUgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNvdXJjZXNbMF0uZXh0Lm1peC5oYW5kbGUpOworICAgICAgICAgICAgICAgICAgICBBTE9HVygiJXMoKSBiYWQgcGxheWJhY2sgSS9PIGhhbmRsZSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHBhdGNoLT5zb3VyY2VzWzBdLmV4dC5taXguaGFuZGxlKTsKICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHRocmVhZCA9PSBhdWRpb2ZsaW5nZXItPnByaW1hcnlQbGF5YmFja1RocmVhZF9sKCkpIHsKKyAgICAgICAgICAgIGlmICh0aHJlYWQgPT0gbUF1ZGlvRmxpbmdlci5wcmltYXJ5UGxheWJhY2tUaHJlYWRfbCgpKSB7CiAgICAgICAgICAgICAgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW0gPSBBdWRpb1BhcmFtZXRlcigpOwogICAgICAgICAgICAgICAgIHBhcmFtLmFkZEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlSb3V0aW5nKSwgKGludCl0eXBlKTsKIAotICAgICAgICAgICAgICAgIGF1ZGlvZmxpbmdlci0+YnJvYWNhc3RQYXJhbWV0ZXJzVG9SZWNvcmRUaHJlYWRzX2wocGFyYW0udG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgbUF1ZGlvRmxpbmdlci5icm9hY2FzdFBhcmFtZXRlcnNUb1JlY29yZFRocmVhZHNfbChwYXJhbS50b1N0cmluZygpKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgc3RhdHVzID0gdGhyZWFkLT5zZW5kQ3JlYXRlQXVkaW9QYXRjaENvbmZpZ0V2ZW50KHBhdGNoLCAmaGFsSGFuZGxlKTsKQEAgLTQwMywyOTUgKzM4Miw0MTUgQEAKICAgICAgICAgICAgIGdvdG8gZXhpdDsKICAgICB9CiBleGl0OgotICAgIEFMT0dWKCJjcmVhdGVBdWRpb1BhdGNoKCkgc3RhdHVzICVkIiwgc3RhdHVzKTsKKyAgICBBTE9HVigiJXMoKSBzdGF0dXMgJWQiLCBfX2Z1bmNfXywgc3RhdHVzKTsKICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICpoYW5kbGUgPSAoYXVkaW9fcGF0Y2hfaGFuZGxlX3QpIGF1ZGlvZmxpbmdlci0+bmV4dFVuaXF1ZUlkKEFVRElPX1VOSVFVRV9JRF9VU0VfUEFUQ0gpOwotICAgICAgICBuZXdQYXRjaC0+bUhhbmRsZSA9ICpoYW5kbGU7Ci0gICAgICAgIG5ld1BhdGNoLT5tSGFsSGFuZGxlID0gaGFsSGFuZGxlOwotICAgICAgICBtUGF0Y2hlcy5hZGQobmV3UGF0Y2gpOwotICAgICAgICBBTE9HVigiY3JlYXRlQXVkaW9QYXRjaCgpIGFkZGVkIG5ldyBwYXRjaCBoYW5kbGUgJWQgaGFsSGFuZGxlICVkIiwgKmhhbmRsZSwgaGFsSGFuZGxlKTsKKyAgICAgICAgKmhhbmRsZSA9IChhdWRpb19wYXRjaF9oYW5kbGVfdCkgbUF1ZGlvRmxpbmdlci5uZXh0VW5pcXVlSWQoQVVESU9fVU5JUVVFX0lEX1VTRV9QQVRDSCk7CisgICAgICAgIG5ld1BhdGNoLm1IYWxIYW5kbGUgPSBoYWxIYW5kbGU7CisgICAgICAgIG1QYXRjaGVzLmluc2VydChzdGQ6Om1ha2VfcGFpcigqaGFuZGxlLCBzdGQ6Om1vdmUobmV3UGF0Y2gpKSk7CisgICAgICAgIGlmIChpbnNlcnRlZE1vZHVsZSAhPSBBVURJT19NT0RVTEVfSEFORExFX05PTkUpIHsKKyAgICAgICAgICAgIGFkZFNvZnR3YXJlUGF0Y2hUb0luc2VydGVkTW9kdWxlcyhpbnNlcnRlZE1vZHVsZSwgKmhhbmRsZSk7CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoIiVzKCkgYWRkZWQgbmV3IHBhdGNoIGhhbmRsZSAlZCBoYWxIYW5kbGUgJWQiLCBfX2Z1bmNfXywgKmhhbmRsZSwgaGFsSGFuZGxlKTsKICAgICB9IGVsc2UgewotICAgICAgICBjbGVhclBhdGNoQ29ubmVjdGlvbnMobmV3UGF0Y2gpOwotICAgICAgICBkZWxldGUgbmV3UGF0Y2g7CisgICAgICAgIG5ld1BhdGNoLmNsZWFyQ29ubmVjdGlvbnModGhpcyk7CiAgICAgfQogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKLXN0YXR1c190IEF1ZGlvRmxpbmdlcjo6UGF0Y2hQYW5lbDo6Y3JlYXRlUGF0Y2hDb25uZWN0aW9ucyhQYXRjaCAqcGF0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICphdWRpb1BhdGNoKQorQXVkaW9GbGluZ2VyOjpQYXRjaFBhbmVsOjpQYXRjaDo6flBhdGNoKCkKK3sKKyAgICBBTE9HRV9JRihpc1NvZnR3YXJlKCksICJTb2Z0d2FyZSBwYXRjaCBjb25uZWN0aW9ucyBsZWFrZWQgJWQgJWQiLAorICAgICAgICAgICAgbVJlY29yZC5oYW5kbGUoKSwgbVBsYXliYWNrLmhhbmRsZSgpKTsKK30KKworc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQYXRjaFBhbmVsOjpQYXRjaDo6Y3JlYXRlQ29ubmVjdGlvbnMoUGF0Y2hQYW5lbCAqcGFuZWwpCiB7CiAgICAgLy8gY3JlYXRlIHBhdGNoIGZyb20gc291cmNlIGRldmljZSB0byByZWNvcmQgdGhyZWFkIGlucHV0Ci0gICAgc3RydWN0IGF1ZGlvX3BhdGNoIHN1YlBhdGNoOwotICAgIHN1YlBhdGNoLm51bV9zb3VyY2VzID0gMTsKLSAgICBzdWJQYXRjaC5zb3VyY2VzWzBdID0gYXVkaW9QYXRjaC0+c291cmNlc1swXTsKLSAgICBzdWJQYXRjaC5udW1fc2lua3MgPSAxOwotCi0gICAgcGF0Y2gtPm1SZWNvcmRUaHJlYWQtPmdldEF1ZGlvUG9ydENvbmZpZygmc3ViUGF0Y2guc2lua3NbMF0pOwotICAgIHN1YlBhdGNoLnNpbmtzWzBdLmV4dC5taXgudXNlY2FzZS5zb3VyY2UgPSBBVURJT19TT1VSQ0VfTUlDOwotCi0gICAgc3RhdHVzX3Qgc3RhdHVzID0gY3JlYXRlQXVkaW9QYXRjaCgmc3ViUGF0Y2gsICZwYXRjaC0+bVJlY29yZFBhdGNoSGFuZGxlKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBwYW5lbC0+Y3JlYXRlQXVkaW9QYXRjaCgKKyAgICAgICAgICAgIFBhdGNoQnVpbGRlcigpLmFkZFNvdXJjZShtQXVkaW9QYXRjaC5zb3VyY2VzWzBdKS4KKyAgICAgICAgICAgICAgICBhZGRTaW5rKG1SZWNvcmQudGhyZWFkKCksIHsgLnNvdXJjZSA9IEFVRElPX1NPVVJDRV9NSUMgfSkucGF0Y2goKSwKKyAgICAgICAgICAgIG1SZWNvcmQuaGFuZGxlUHRyKCkpOwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgcGF0Y2gtPm1SZWNvcmRQYXRjaEhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOworICAgICAgICAqbVJlY29yZC5oYW5kbGVQdHIoKSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOwogICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KIAogICAgIC8vIGNyZWF0ZSBwYXRjaCBmcm9tIHBsYXliYWNrIHRocmVhZCBvdXRwdXQgdG8gc2luayBkZXZpY2UKLSAgICBpZiAoYXVkaW9QYXRjaC0+bnVtX3NpbmtzICE9IDApIHsKLSAgICAgICAgcGF0Y2gtPm1QbGF5YmFja1RocmVhZC0+Z2V0QXVkaW9Qb3J0Q29uZmlnKCZzdWJQYXRjaC5zb3VyY2VzWzBdKTsKLSAgICAgICAgc3ViUGF0Y2guc2lua3NbMF0gPSBhdWRpb1BhdGNoLT5zaW5rc1swXTsKLSAgICAgICAgc3RhdHVzID0gY3JlYXRlQXVkaW9QYXRjaCgmc3ViUGF0Y2gsICZwYXRjaC0+bVBsYXliYWNrUGF0Y2hIYW5kbGUpOworICAgIGlmIChtQXVkaW9QYXRjaC5udW1fc2lua3MgIT0gMCkgeworICAgICAgICBzdGF0dXMgPSBwYW5lbC0+Y3JlYXRlQXVkaW9QYXRjaCgKKyAgICAgICAgICAgICAgICBQYXRjaEJ1aWxkZXIoKS5hZGRTb3VyY2UobVBsYXliYWNrLnRocmVhZCgpKS5hZGRTaW5rKG1BdWRpb1BhdGNoLnNpbmtzWzBdKS5wYXRjaCgpLAorICAgICAgICAgICAgICAgIG1QbGF5YmFjay5oYW5kbGVQdHIoKSk7CiAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHBhdGNoLT5tUGxheWJhY2tQYXRjaEhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOworICAgICAgICAgICAgKm1QbGF5YmFjay5oYW5kbGVQdHIoKSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOwogICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICAgICAgfQogICAgIH0gZWxzZSB7Ci0gICAgICAgIHBhdGNoLT5tUGxheWJhY2tQYXRjaEhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOworICAgICAgICAqbVBsYXliYWNrLmhhbmRsZVB0cigpID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7CiAgICAgfQogCiAgICAgLy8gdXNlIGEgcHNldWRvIExDTSBiZXR3ZWVuIGlucHV0IGFuZCBvdXRwdXQgZnJhbWVjb3VudAotICAgIHNpemVfdCBwbGF5YmFja0ZyYW1lQ291bnQgPSBwYXRjaC0+bVBsYXliYWNrVGhyZWFkLT5mcmFtZUNvdW50KCk7CisgICAgc2l6ZV90IHBsYXliYWNrRnJhbWVDb3VudCA9IG1QbGF5YmFjay50aHJlYWQoKS0+ZnJhbWVDb3VudCgpOwogICAgIGludCBwbGF5YmFja1NoaWZ0ID0gX19idWlsdGluX2N0eihwbGF5YmFja0ZyYW1lQ291bnQpOwotICAgIHNpemVfdCByZWNvcmRGcmFtZWNvdW50ID0gcGF0Y2gtPm1SZWNvcmRUaHJlYWQtPmZyYW1lQ291bnQoKTsKLSAgICBpbnQgc2hpZnQgPSBfX2J1aWx0aW5fY3R6KHJlY29yZEZyYW1lY291bnQpOworICAgIHNpemVfdCByZWNvcmRGcmFtZUNvdW50ID0gbVJlY29yZC50aHJlYWQoKS0+ZnJhbWVDb3VudCgpOworICAgIGludCBzaGlmdCA9IF9fYnVpbHRpbl9jdHoocmVjb3JkRnJhbWVDb3VudCk7CiAgICAgaWYgKHBsYXliYWNrU2hpZnQgPCBzaGlmdCkgewogICAgICAgICBzaGlmdCA9IHBsYXliYWNrU2hpZnQ7CiAgICAgfQotICAgIHNpemVfdCBmcmFtZUNvdW50ID0gKHBsYXliYWNrRnJhbWVDb3VudCAqIHJlY29yZEZyYW1lY291bnQpID4+IHNoaWZ0OwotICAgIEFMT0dWKCJjcmVhdGVQYXRjaENvbm5lY3Rpb25zKCkgcGxheWZyYW1lQ291bnQgJXp1IHJlY29yZEZyYW1lY291bnQgJXp1IGZyYW1lQ291bnQgJXp1IiwKLSAgICAgICAgICBwbGF5YmFja0ZyYW1lQ291bnQsIHJlY29yZEZyYW1lY291bnQsIGZyYW1lQ291bnQpOworICAgIHNpemVfdCBmcmFtZUNvdW50ID0gKHBsYXliYWNrRnJhbWVDb3VudCAqIHJlY29yZEZyYW1lQ291bnQpID4+IHNoaWZ0OworICAgIEFMT0dWKCIlcygpIHBsYXlmcmFtZUNvdW50ICV6dSByZWNvcmRGcmFtZUNvdW50ICV6dSBmcmFtZUNvdW50ICV6dSIsCisgICAgICAgICAgICBfX2Z1bmNfXywgcGxheWJhY2tGcmFtZUNvdW50LCByZWNvcmRGcmFtZUNvdW50LCBmcmFtZUNvdW50KTsKIAogICAgIC8vIGNyZWF0ZSBhIHNwZWNpYWwgcmVjb3JkIHRyYWNrIHRvIGNhcHR1cmUgZnJvbSByZWNvcmQgdGhyZWFkCi0gICAgdWludDMyX3QgY2hhbm5lbENvdW50ID0gcGF0Y2gtPm1QbGF5YmFja1RocmVhZC0+Y2hhbm5lbENvdW50KCk7CisgICAgdWludDMyX3QgY2hhbm5lbENvdW50ID0gbVBsYXliYWNrLnRocmVhZCgpLT5jaGFubmVsQ291bnQoKTsKICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBpbkNoYW5uZWxNYXNrID0gYXVkaW9fY2hhbm5lbF9pbl9tYXNrX2Zyb21fY291bnQoY2hhbm5lbENvdW50KTsKLSAgICBhdWRpb19jaGFubmVsX21hc2tfdCBvdXRDaGFubmVsTWFzayA9IHBhdGNoLT5tUGxheWJhY2tUaHJlYWQtPmNoYW5uZWxNYXNrKCk7Ci0gICAgdWludDMyX3Qgc2FtcGxlUmF0ZSA9IHBhdGNoLT5tUGxheWJhY2tUaHJlYWQtPnNhbXBsZVJhdGUoKTsKLSAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQgPSBwYXRjaC0+bVBsYXliYWNrVGhyZWFkLT5mb3JtYXQoKTsKKyAgICBhdWRpb19jaGFubmVsX21hc2tfdCBvdXRDaGFubmVsTWFzayA9IG1QbGF5YmFjay50aHJlYWQoKS0+Y2hhbm5lbE1hc2soKTsKKyAgICB1aW50MzJfdCBzYW1wbGVSYXRlID0gbVBsYXliYWNrLnRocmVhZCgpLT5zYW1wbGVSYXRlKCk7CisgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0ID0gbVBsYXliYWNrLnRocmVhZCgpLT5mb3JtYXQoKTsKIAotICAgIHBhdGNoLT5tUGF0Y2hSZWNvcmQgPSBuZXcgUmVjb3JkVGhyZWFkOjpQYXRjaFJlY29yZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5tUmVjb3JkVGhyZWFkLmdldCgpLAorICAgIGF1ZGlvX2Zvcm1hdF90IGlucHV0Rm9ybWF0ID0gbVJlY29yZC50aHJlYWQoKS0+Zm9ybWF0KCk7CisgICAgaWYgKCFhdWRpb19pc19saW5lYXJfcGNtKGlucHV0Rm9ybWF0KSkgeworICAgICAgICAvLyBUaGUgcGxheWJhY2tUaHJlYWQgZm9ybWF0IHdpbGwgc2F5IFBDTSBmb3IgSUVDNjE5MzcgcGFja2V0aXplZCBzdHJlYW0uCisgICAgICAgIC8vIFVzZSByZWNvcmRUaHJlYWQgZm9ybWF0LgorICAgICAgICBmb3JtYXQgPSBpbnB1dEZvcm1hdDsKKyAgICB9CisgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBpbnB1dEZsYWdzID0gbUF1ZGlvUGF0Y2guc291cmNlc1swXS5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX0ZMQUdTID8KKyAgICAgICAgICAgIG1BdWRpb1BhdGNoLnNvdXJjZXNbMF0uZmxhZ3MuaW5wdXQgOiBBVURJT19JTlBVVF9GTEFHX05PTkU7CisgICAgaWYgKHNhbXBsZVJhdGUgPT0gbVJlY29yZC50aHJlYWQoKS0+c2FtcGxlUmF0ZSgpICYmCisgICAgICAgICAgICBpbkNoYW5uZWxNYXNrID09IG1SZWNvcmQudGhyZWFkKCktPmNoYW5uZWxNYXNrKCkgJiYKKyAgICAgICAgICAgIG1SZWNvcmQudGhyZWFkKCktPmZhc3RUcmFja0F2YWlsYWJsZSgpICYmCisgICAgICAgICAgICBtUmVjb3JkLnRocmVhZCgpLT5oYXNGYXN0Q2FwdHVyZSgpKSB7CisgICAgICAgIC8vIENyZWF0ZSBhIGZhc3QgdHJhY2sgaWYgdGhlIHJlY29yZCB0aHJlYWQgaGFzIGZhc3QgY2FwdHVyZSB0byBnZXQgYmV0dGVyIHBlcmZvcm1hbmNlLgorICAgICAgICAvLyBPbmx5IGVuYWJsZSBmYXN0IG1vZGUgd2hlbiB0aGVyZSBpcyBubyByZXNhbXBsZSBuZWVkZWQuCisgICAgICAgIGlucHV0RmxhZ3MgPSAoYXVkaW9faW5wdXRfZmxhZ3NfdCkgKGlucHV0RmxhZ3MgfCBBVURJT19JTlBVVF9GTEFHX0ZBU1QpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIEZhc3QgbW9kZSBpcyBub3QgYXZhaWxhYmxlIGluIHRoaXMgY2FzZS4KKyAgICAgICAgaW5wdXRGbGFncyA9IChhdWRpb19pbnB1dF9mbGFnc190KSAoaW5wdXRGbGFncyAmIH5BVURJT19JTlBVVF9GTEFHX0ZBU1QpOworICAgIH0KKyAgICBzcDxSZWNvcmRUaHJlYWQ6OlBhdGNoUmVjb3JkPiB0ZW1wUmVjb3JkVHJhY2sgPSBuZXcgKHN0ZDo6bm90aHJvdykgUmVjb3JkVGhyZWFkOjpQYXRjaFJlY29yZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1SZWNvcmQudGhyZWFkKCkuZ2V0KCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5DaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNpemVfdCkwIC8qIGJ1ZmZlclNpemUgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19JTlBVVF9GTEFHX05PTkUpOwotICAgIGlmIChwYXRjaC0+bVBhdGNoUmVjb3JkID09IDApIHsKLSAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKLSAgICB9Ci0gICAgc3RhdHVzID0gcGF0Y2gtPm1QYXRjaFJlY29yZC0+aW5pdENoZWNrKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dEZsYWdzKTsKKyAgICBzdGF0dXMgPSBtUmVjb3JkLmNoZWNrVHJhY2sodGVtcFJlY29yZFRyYWNrLmdldCgpKTsKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQotICAgIHBhdGNoLT5tUmVjb3JkVGhyZWFkLT5hZGRQYXRjaFJlY29yZChwYXRjaC0+bVBhdGNoUmVjb3JkKTsKKworICAgIGF1ZGlvX291dHB1dF9mbGFnc190IG91dHB1dEZsYWdzID0gbUF1ZGlvUGF0Y2guc2lua3NbMF0uY29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19GTEFHUyA/CisgICAgICAgICAgICBtQXVkaW9QYXRjaC5zaW5rc1swXS5mbGFncy5vdXRwdXQgOiBBVURJT19PVVRQVVRfRkxBR19OT05FOworICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSA9IEFVRElPX1NUUkVBTV9QQVRDSDsKKyAgICBpZiAobUF1ZGlvUGF0Y2gubnVtX3NvdXJjZXMgPT0gMiAmJiBtQXVkaW9QYXRjaC5zb3VyY2VzWzFdLnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX01JWCkgeworICAgICAgICAvLyAicmV1c2Ugb25lIGV4aXN0aW5nIG91dHB1dCBtaXgiIGNhc2UKKyAgICAgICAgc3RyZWFtVHlwZSA9IG1BdWRpb1BhdGNoLnNvdXJjZXNbMV0uZXh0Lm1peC51c2VjYXNlLnN0cmVhbTsKKyAgICB9CisgICAgaWYgKG1QbGF5YmFjay50aHJlYWQoKS0+aGFzRmFzdE1peGVyKCkpIHsKKyAgICAgICAgLy8gQ3JlYXRlIGEgZmFzdCB0cmFjayBpZiB0aGUgcGxheWJhY2sgdGhyZWFkIGhhcyBmYXN0IG1peGVyIHRvIGdldCBiZXR0ZXIgcGVyZm9ybWFuY2UuCisgICAgICAgIG91dHB1dEZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KSAob3V0cHV0RmxhZ3MgfCBBVURJT19PVVRQVVRfRkxBR19GQVNUKTsKKyAgICB9CiAKICAgICAvLyBjcmVhdGUgYSBzcGVjaWFsIHBsYXliYWNrIHRyYWNrIHRvIHJlbmRlciB0byBwbGF5YmFjayB0aHJlYWQuCiAgICAgLy8gdGhpcyB0cmFjayBpcyBnaXZlbiB0aGUgc2FtZSBidWZmZXIgYXMgdGhlIFBhdGNoUmVjb3JkIGJ1ZmZlcgotICAgIHBhdGNoLT5tUGF0Y2hUcmFjayA9IG5ldyBQbGF5YmFja1RocmVhZDo6UGF0Y2hUcmFjaygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+bVBsYXliYWNrVGhyZWFkLmdldCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvUGF0Y2gtPnNvdXJjZXNbMV0uZXh0Lm1peC51c2VjYXNlLnN0cmVhbSwKKyAgICBzcDxQbGF5YmFja1RocmVhZDo6UGF0Y2hUcmFjaz4gdGVtcFBhdGNoVHJhY2sgPSBuZXcgKHN0ZDo6bm90aHJvdykgUGxheWJhY2tUaHJlYWQ6OlBhdGNoVHJhY2soCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBsYXliYWNrLnRocmVhZCgpLmdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRDaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+bVBhdGNoUmVjb3JkLT5idWZmZXIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+bVBhdGNoUmVjb3JkLT5idWZmZXJTaXplKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSk7Ci0gICAgc3RhdHVzID0gcGF0Y2gtPm1QYXRjaFRyYWNrLT5pbml0Q2hlY2soKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wUmVjb3JkVHJhY2stPmJ1ZmZlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBSZWNvcmRUcmFjay0+YnVmZmVyU2l6ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dEZsYWdzKTsKKyAgICBzdGF0dXMgPSBtUGxheWJhY2suY2hlY2tUcmFjayh0ZW1wUGF0Y2hUcmFjay5nZXQoKSk7CiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KLSAgICBwYXRjaC0+bVBsYXliYWNrVGhyZWFkLT5hZGRQYXRjaFRyYWNrKHBhdGNoLT5tUGF0Y2hUcmFjayk7CiAKICAgICAvLyB0aWUgcGxheWJhY2sgYW5kIHJlY29yZCB0cmFja3MgdG9nZXRoZXIKLSAgICBwYXRjaC0+bVBhdGNoUmVjb3JkLT5zZXRQZWVyUHJveHkocGF0Y2gtPm1QYXRjaFRyYWNrLmdldCgpKTsKLSAgICBwYXRjaC0+bVBhdGNoVHJhY2stPnNldFBlZXJQcm94eShwYXRjaC0+bVBhdGNoUmVjb3JkLmdldCgpKTsKKyAgICBtUmVjb3JkLnNldFRyYWNrQW5kUGVlcih0ZW1wUmVjb3JkVHJhY2ssIHRlbXBQYXRjaFRyYWNrLmdldCgpKTsKKyAgICBtUGxheWJhY2suc2V0VHJhY2tBbmRQZWVyKHRlbXBQYXRjaFRyYWNrLCB0ZW1wUmVjb3JkVHJhY2suZ2V0KCkpOwogCiAgICAgLy8gc3RhcnQgY2FwdHVyZSBhbmQgcGxheWJhY2sKLSAgICBwYXRjaC0+bVBhdGNoUmVjb3JkLT5zdGFydChBdWRpb1N5c3RlbTo6U1lOQ19FVkVOVF9OT05FLCBBVURJT19TRVNTSU9OX05PTkUpOwotICAgIHBhdGNoLT5tUGF0Y2hUcmFjay0+c3RhcnQoKTsKKyAgICBtUmVjb3JkLnRyYWNrKCktPnN0YXJ0KEF1ZGlvU3lzdGVtOjpTWU5DX0VWRU5UX05PTkUsIEFVRElPX1NFU1NJT05fTk9ORSk7CisgICAgbVBsYXliYWNrLnRyYWNrKCktPnN0YXJ0KCk7CiAKICAgICByZXR1cm4gc3RhdHVzOwogfQogCi12b2lkIEF1ZGlvRmxpbmdlcjo6UGF0Y2hQYW5lbDo6Y2xlYXJQYXRjaENvbm5lY3Rpb25zKFBhdGNoICpwYXRjaCkKK3ZvaWQgQXVkaW9GbGluZ2VyOjpQYXRjaFBhbmVsOjpQYXRjaDo6Y2xlYXJDb25uZWN0aW9ucyhQYXRjaFBhbmVsICpwYW5lbCkKIHsKLSAgICBzcDxBdWRpb0ZsaW5nZXI+IGF1ZGlvZmxpbmdlciA9IG1BdWRpb0ZsaW5nZXIucHJvbW90ZSgpOwotICAgIGlmIChhdWRpb2ZsaW5nZXIgPT0gMCkgewotICAgICAgICByZXR1cm47CisgICAgQUxPR1YoIiVzKCkgbVJlY29yZC5oYW5kbGUgJWQgbVBsYXliYWNrLmhhbmRsZSAlZCIsCisgICAgICAgICAgICBfX2Z1bmNfXywgbVJlY29yZC5oYW5kbGUoKSwgbVBsYXliYWNrLmhhbmRsZSgpKTsKKyAgICBtUmVjb3JkLnN0b3BUcmFjaygpOworICAgIG1QbGF5YmFjay5zdG9wVHJhY2soKTsKKyAgICBtUmVjb3JkLmNsb3NlQ29ubmVjdGlvbnMocGFuZWwpOworICAgIG1QbGF5YmFjay5jbG9zZUNvbm5lY3Rpb25zKHBhbmVsKTsKK30KKworc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQYXRjaFBhbmVsOjpQYXRjaDo6Z2V0TGF0ZW5jeU1zKGRvdWJsZSAqbGF0ZW5jeU1zKSBjb25zdAoreworICAgIGlmICghaXNTb2Z0d2FyZSgpKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisKKyAgICBhdXRvIHJlY29yZFRyYWNrID0gbVJlY29yZC5jb25zdF90cmFjaygpOworICAgIGlmIChyZWNvcmRUcmFjay5nZXQoKSA9PSBudWxscHRyKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisKKyAgICBhdXRvIHBsYXliYWNrVHJhY2sgPSBtUGxheWJhY2suY29uc3RfdHJhY2soKTsKKyAgICBpZiAocGxheWJhY2tUcmFjay5nZXQoKSA9PSBudWxscHRyKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisKKyAgICAvLyBMYXRlbmN5IGluZm9ybWF0aW9uIGZvciB0cmFja3MgbWF5IGJlIGNhbGxlZCB3aXRob3V0IG9idGFpbmluZworICAgIC8vIHRoZSB1bmRlcmx5aW5nIHRocmVhZCBsb2NrLgorICAgIC8vCisgICAgLy8gV2UgdXNlIHJlY29yZCBzZXJ2ZXIgbGF0ZW5jeSArIHBsYXliYWNrIHRyYWNrIGxhdGVuY3kgKGdlbmVyYWxseSBzbWFsbGVyIHRoYW4gdGhlCisgICAgLy8gcmV2ZXJzZSBkdWUgdG8gaW50ZXJuYWwgYmlhc2VzKS4KKyAgICAvLworICAgIC8vIFRPRE86IGlzIHRoaXMgc3RhYmxlIGVub3VnaD8gQ29uc2lkZXIgYSBQYXRjaFRyYWNrIHN5bmNocm9uaXplZCB2ZXJzaW9uIG9mIHRoaXMuCisKKyAgICAvLyBGb3IgUENNIHRyYWNrcyBnZXQgc2VydmVyIGxhdGVuY3kuCisgICAgaWYgKGF1ZGlvX2lzX2xpbmVhcl9wY20ocmVjb3JkVHJhY2stPmZvcm1hdCgpKSkgeworICAgICAgICBkb3VibGUgcmVjb3JkU2VydmVyTGF0ZW5jeU1zLCBwbGF5YmFja1RyYWNrTGF0ZW5jeU1zOworICAgICAgICBpZiAocmVjb3JkVHJhY2stPmdldFNlcnZlckxhdGVuY3lNcygmcmVjb3JkU2VydmVyTGF0ZW5jeU1zKSA9PSBPSworICAgICAgICAgICAgICAgICYmIHBsYXliYWNrVHJhY2stPmdldFRyYWNrTGF0ZW5jeU1zKCZwbGF5YmFja1RyYWNrTGF0ZW5jeU1zKSA9PSBPSykgeworICAgICAgICAgICAgKmxhdGVuY3lNcyA9IHJlY29yZFNlcnZlckxhdGVuY3lNcyArIHBsYXliYWNrVHJhY2tMYXRlbmN5TXM7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KICAgICB9CiAKLSAgICBBTE9HVigiY2xlYXJQYXRjaENvbm5lY3Rpb25zKCkgcGF0Y2gtPm1SZWNvcmRQYXRjaEhhbmRsZSAlZCBwYXRjaC0+bVBsYXliYWNrUGF0Y2hIYW5kbGUgJWQiLAotICAgICAgICAgIHBhdGNoLT5tUmVjb3JkUGF0Y2hIYW5kbGUsIHBhdGNoLT5tUGxheWJhY2tQYXRjaEhhbmRsZSk7CisgICAgLy8gU2VlIGlmIGtlcm5lbCBsYXRlbmNpZXMgYXJlIGF2YWlsYWJsZS4KKyAgICAvLyBJZiBzbywgZG8gYSBmcmFtZSBkaWZmIGFuZCB0aW1lIGRpZmZlcmVuY2UgY29tcHV0YXRpb24gdG8gZXN0aW1hdGUKKyAgICAvLyB0aGUgdG90YWwgcGF0Y2ggbGF0ZW5jeS4gVGhpcyByZXF1aXJlcyB0aGF0IGZyYW1lIGNvdW50cyBhcmUgcmVwb3J0ZWQgYnkgdGhlCisgICAgLy8gSEFMIGFyZSBtYXRjaGVkIHByb3Blcmx5IGluIHRoZSBjYXNlIG9mIHJlY29yZCBvdmVycnVucyBhbmQgcGxheWJhY2sgdW5kZXJydW5zLgorICAgIFRocmVhZEJhc2U6OlRyYWNrQmFzZTo6RnJhbWVUaW1lIHJlY29yZEZUe30sIHBsYXlGVHt9OworICAgIHJlY29yZFRyYWNrLT5nZXRLZXJuZWxGcmFtZVRpbWUoJnJlY29yZEZUKTsKKyAgICBwbGF5YmFja1RyYWNrLT5nZXRLZXJuZWxGcmFtZVRpbWUoJnBsYXlGVCk7CisgICAgaWYgKHJlY29yZEZULnRpbWVOcyA+IDAgJiYgcGxheUZULnRpbWVOcyA+IDApIHsKKyAgICAgICAgY29uc3QgaW50NjRfdCBmcmFtZURpZmYgPSByZWNvcmRGVC5mcmFtZXMgLSBwbGF5RlQuZnJhbWVzOworICAgICAgICBjb25zdCBpbnQ2NF90IHRpbWVEaWZmTnMgPSByZWNvcmRGVC50aW1lTnMgLSBwbGF5RlQudGltZU5zOwogCi0gICAgaWYgKHBhdGNoLT5tUGF0Y2hSZWNvcmQgIT0gMCkgewotICAgICAgICBwYXRjaC0+bVBhdGNoUmVjb3JkLT5zdG9wKCk7Ci0gICAgfQotICAgIGlmIChwYXRjaC0+bVBhdGNoVHJhY2sgIT0gMCkgewotICAgICAgICBwYXRjaC0+bVBhdGNoVHJhY2stPnN0b3AoKTsKLSAgICB9Ci0gICAgaWYgKHBhdGNoLT5tUmVjb3JkUGF0Y2hIYW5kbGUgIT0gQVVESU9fUEFUQ0hfSEFORExFX05PTkUpIHsKLSAgICAgICAgcmVsZWFzZUF1ZGlvUGF0Y2gocGF0Y2gtPm1SZWNvcmRQYXRjaEhhbmRsZSk7Ci0gICAgICAgIHBhdGNoLT5tUmVjb3JkUGF0Y2hIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKLSAgICB9Ci0gICAgaWYgKHBhdGNoLT5tUGxheWJhY2tQYXRjaEhhbmRsZSAhPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORSkgewotICAgICAgICByZWxlYXNlQXVkaW9QYXRjaChwYXRjaC0+bVBsYXliYWNrUGF0Y2hIYW5kbGUpOwotICAgICAgICBwYXRjaC0+bVBsYXliYWNrUGF0Y2hIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKLSAgICB9Ci0gICAgaWYgKHBhdGNoLT5tUmVjb3JkVGhyZWFkICE9IDApIHsKLSAgICAgICAgaWYgKHBhdGNoLT5tUGF0Y2hSZWNvcmQgIT0gMCkgewotICAgICAgICAgICAgcGF0Y2gtPm1SZWNvcmRUaHJlYWQtPmRlbGV0ZVBhdGNoUmVjb3JkKHBhdGNoLT5tUGF0Y2hSZWNvcmQpOworICAgICAgICAvLyBJdCBpcyBwb3NzaWJsZSB0aGF0IHRoZSBwYXRjaCB0cmFjayBhbmQgcGF0Y2ggcmVjb3JkIGhhdmUgYSBsYXJnZSB0aW1lIGRpc3Bhcml0eSBiZWNhdXNlCisgICAgICAgIC8vIG9uZSB0aHJlYWQgcnVucyBidXQgYW5vdGhlciBpcyBzdG9wcGVkLiAgV2UgYXJiaXRyYXJpbHkgY2hvb3NlIHRoZSBtYXhpbXVtIHRpbWVzdGFtcAorICAgICAgICAvLyB0aW1lIGRpZmZlcmVuY2UgYmFzZWQgb24gaG93IG9mdGVuIHdlIGV4cGVjdCB0aGUgdGltZXN0YW1wcyB0byB1cGRhdGUgaW4gbm9ybWFsIG9wZXJhdGlvbgorICAgICAgICAvLyAodHlwaWNhbCBzaG91bGQgYmUgbm8gbW9yZSB0aGFuIDUwIG1zKS4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gSWYgdGhlIHRpbWVzdGFtcHMgYXJlbid0IHNhbXBsZWQgY2xvc2UgZW5vdWdoLCB0aGUgcGF0Y2ggbGF0ZW5jeSBpcyBub3QKKyAgICAgICAgLy8gY29uc2lkZXJlZCB2YWxpZC4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gVE9ETzogY2hhbmdlIHRoaXMgYmFzZWQgb24gbW9yZSBleHBlcmltZW50cy4KKyAgICAgICAgY29uc3RleHByIGludDY0X3QgbWF4VmFsaWRUaW1lRGlmZk5zID0gMjAwICogTkFOT1NfUEVSX01JTExJU0VDT05EOworICAgICAgICBpZiAoc3RkOjphYnModGltZURpZmZOcykgPCBtYXhWYWxpZFRpbWVEaWZmTnMpIHsKKyAgICAgICAgICAgICpsYXRlbmN5TXMgPSBmcmFtZURpZmYgKiAxZTMgLyByZWNvcmRUcmFjay0+c2FtcGxlUmF0ZSgpCisgICAgICAgICAgICAgICAgICAgLSB0aW1lRGlmZk5zICogMWUtNjsKKyAgICAgICAgICAgIHJldHVybiBPSzsKICAgICAgICAgfQotICAgICAgICBhdWRpb2ZsaW5nZXItPmNsb3NlSW5wdXRJbnRlcm5hbF9sKHBhdGNoLT5tUmVjb3JkVGhyZWFkKTsKLSAgICB9Ci0gICAgaWYgKHBhdGNoLT5tUGxheWJhY2tUaHJlYWQgIT0gMCkgewotICAgICAgICBpZiAocGF0Y2gtPm1QYXRjaFRyYWNrICE9IDApIHsKLSAgICAgICAgICAgIHBhdGNoLT5tUGxheWJhY2tUaHJlYWQtPmRlbGV0ZVBhdGNoVHJhY2socGF0Y2gtPm1QYXRjaFRyYWNrKTsKLSAgICAgICAgfQotICAgICAgICAvLyBpZiBudW0gc291cmNlcyA9PSAyIHdlIGFyZSByZXVzaW5nIGFuIGV4aXN0aW5nIHBsYXliYWNrIHRocmVhZCBzbyB3ZSBkbyBub3QgY2xvc2UgaXQKLSAgICAgICAgaWYgKHBhdGNoLT5tQXVkaW9QYXRjaC5udW1fc291cmNlcyAhPSAyKSB7Ci0gICAgICAgICAgICBhdWRpb2ZsaW5nZXItPmNsb3NlT3V0cHV0SW50ZXJuYWxfbChwYXRjaC0+bVBsYXliYWNrVGhyZWFkKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAocGF0Y2gtPm1SZWNvcmRUaHJlYWQgIT0gMCkgewotICAgICAgICBpZiAocGF0Y2gtPm1QYXRjaFJlY29yZCAhPSAwKSB7Ci0gICAgICAgICAgICBwYXRjaC0+bVBhdGNoUmVjb3JkLmNsZWFyKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcGF0Y2gtPm1SZWNvcmRUaHJlYWQuY2xlYXIoKTsKLSAgICB9Ci0gICAgaWYgKHBhdGNoLT5tUGxheWJhY2tUaHJlYWQgIT0gMCkgewotICAgICAgICBpZiAocGF0Y2gtPm1QYXRjaFRyYWNrICE9IDApIHsKLSAgICAgICAgICAgIHBhdGNoLT5tUGF0Y2hUcmFjay5jbGVhcigpOwotICAgICAgICB9Ci0gICAgICAgIHBhdGNoLT5tUGxheWJhY2tUaHJlYWQuY2xlYXIoKTsKICAgICB9CiAKKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisKK1N0cmluZzggQXVkaW9GbGluZ2VyOjpQYXRjaFBhbmVsOjpQYXRjaDo6ZHVtcChhdWRpb19wYXRjaF9oYW5kbGVfdCBteUhhbmRsZSkgY29uc3QKK3sKKyAgICAvLyBUT0RPOiBDb25zaWRlciB0YWJsZSBkdW1wIGZvcm0gZm9yIHBhdGNoZXMsIGp1c3QgbGlrZSB0cmFja3MuCisgICAgU3RyaW5nOCByZXN1bHQgPSBTdHJpbmc4Ojpmb3JtYXQoIlBhdGNoICVkOiB0aHJlYWQgJXAgPT4gdGhyZWFkICVwIiwKKyAgICAgICAgICAgIG15SGFuZGxlLCBtUmVjb3JkLmNvbnN0X3RocmVhZCgpLmdldCgpLCBtUGxheWJhY2suY29uc3RfdGhyZWFkKCkuZ2V0KCkpOworCisgICAgLy8gYWRkIGxhdGVuY3kgaWYgaXQgZXhpc3RzCisgICAgZG91YmxlIGxhdGVuY3lNczsKKyAgICBpZiAoZ2V0TGF0ZW5jeU1zKCZsYXRlbmN5TXMpID09IE9LKSB7CisgICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAgbGF0ZW5jeTogJS4ybGYgbXMiLCBsYXRlbmN5TXMpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiAvKiBEaXNjb25uZWN0IGEgcGF0Y2ggKi8KIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6UGF0Y2hQYW5lbDo6cmVsZWFzZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKQogewotICAgIEFMT0dWKCJyZWxlYXNlQXVkaW9QYXRjaCBoYW5kbGUgJWQiLCBoYW5kbGUpOworICAgIEFMT0dWKCIlcyBoYW5kbGUgJWQiLCBfX2Z1bmNfXywgaGFuZGxlKTsKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKLSAgICBzaXplX3QgaW5kZXg7CiAKLSAgICBzcDxBdWRpb0ZsaW5nZXI+IGF1ZGlvZmxpbmdlciA9IG1BdWRpb0ZsaW5nZXIucHJvbW90ZSgpOwotICAgIGlmIChhdWRpb2ZsaW5nZXIgPT0gMCkgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0KLSAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBtUGF0Y2hlcy5zaXplKCk7IGluZGV4KyspIHsKLSAgICAgICAgaWYgKGhhbmRsZSA9PSBtUGF0Y2hlc1tpbmRleF0tPm1IYW5kbGUpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChpbmRleCA9PSBtUGF0Y2hlcy5zaXplKCkpIHsKKyAgICBhdXRvIGl0ZXIgPSBtUGF0Y2hlcy5maW5kKGhhbmRsZSk7CisgICAgaWYgKGl0ZXIgPT0gbVBhdGNoZXMuZW5kKCkpIHsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9Ci0gICAgUGF0Y2ggKnJlbW92ZWRQYXRjaCA9IG1QYXRjaGVzW2luZGV4XTsKLSAgICBtUGF0Y2hlcy5yZW1vdmVBdChpbmRleCk7CisgICAgUGF0Y2ggJnJlbW92ZWRQYXRjaCA9IGl0ZXItPnNlY29uZDsKKyAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggJnBhdGNoID0gcmVtb3ZlZFBhdGNoLm1BdWRpb1BhdGNoOwogCi0gICAgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCA9ICZyZW1vdmVkUGF0Y2gtPm1BdWRpb1BhdGNoOwotCi0gICAgc3dpdGNoIChwYXRjaC0+c291cmNlc1swXS50eXBlKSB7CisgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICZzcmMgPSBwYXRjaC5zb3VyY2VzWzBdOworICAgIHN3aXRjaCAoc3JjLnR5cGUpIHsKICAgICAgICAgY2FzZSBBVURJT19QT1JUX1RZUEVfREVWSUNFOiB7Ci0gICAgICAgICAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3Qgc3JjTW9kdWxlID0gcGF0Y2gtPnNvdXJjZXNbMF0uZXh0LmRldmljZS5od19tb2R1bGU7Ci0gICAgICAgICAgICBzc2l6ZV90IGluZGV4ID0gYXVkaW9mbGluZ2VyLT5tQXVkaW9Id0RldnMuaW5kZXhPZktleShzcmNNb2R1bGUpOwotICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICAgICAgICAgIEFMT0dXKCJyZWxlYXNlQXVkaW9QYXRjaCgpIGJhZCBzcmMgaHcgbW9kdWxlICVkIiwgc3JjTW9kdWxlKTsKKyAgICAgICAgICAgIHNwPERldmljZUhhbEludGVyZmFjZT4gaHdEZXZpY2UgPSBmaW5kSHdEZXZpY2VCeU1vZHVsZShzcmMuZXh0LmRldmljZS5od19tb2R1bGUpOworICAgICAgICAgICAgaWYgKGh3RGV2aWNlID09IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiJXMoKSBiYWQgc3JjIGh3IG1vZHVsZSAlZCIsIF9fZnVuY19fLCBzcmMuZXh0LmRldmljZS5od19tb2R1bGUpOwogICAgICAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKHJlbW92ZWRQYXRjaC0+bVJlY29yZFBhdGNoSGFuZGxlICE9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FIHx8Ci0gICAgICAgICAgICAgICAgICAgIHJlbW92ZWRQYXRjaC0+bVBsYXliYWNrUGF0Y2hIYW5kbGUgIT0gQVVESU9fUEFUQ0hfSEFORExFX05PTkUpIHsKLSAgICAgICAgICAgICAgICBjbGVhclBhdGNoQ29ubmVjdGlvbnMocmVtb3ZlZFBhdGNoKTsKKyAgICAgICAgICAgIGlmIChyZW1vdmVkUGF0Y2guaXNTb2Z0d2FyZSgpKSB7CisgICAgICAgICAgICAgICAgcmVtb3ZlZFBhdGNoLmNsZWFyQ29ubmVjdGlvbnModGhpcyk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmIChwYXRjaC0+c2lua3NbMF0udHlwZSA9PSBBVURJT19QT1JUX1RZUEVfTUlYKSB7Ci0gICAgICAgICAgICAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gYXVkaW9mbGluZ2VyLT5jaGVja1JlY29yZFRocmVhZF9sKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rc1swXS5leHQubWl4LmhhbmRsZSk7CisgICAgICAgICAgICBpZiAocGF0Y2guc2lua3NbMF0udHlwZSA9PSBBVURJT19QT1JUX1RZUEVfTUlYKSB7CisgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUgPSBwYXRjaC5zaW5rc1swXS5leHQubWl4LmhhbmRsZTsKKyAgICAgICAgICAgICAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBtQXVkaW9GbGluZ2VyLmNoZWNrUmVjb3JkVGhyZWFkX2woaW9IYW5kbGUpOwogICAgICAgICAgICAgICAgIGlmICh0aHJlYWQgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICB0aHJlYWQgPSBhdWRpb2ZsaW5nZXItPmNoZWNrTW1hcFRocmVhZF9sKHBhdGNoLT5zaW5rc1swXS5leHQubWl4LmhhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgIHRocmVhZCA9IG1BdWRpb0ZsaW5nZXIuY2hlY2tNbWFwVGhyZWFkX2woaW9IYW5kbGUpOwogICAgICAgICAgICAgICAgICAgICBpZiAodGhyZWFkID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJyZWxlYXNlQXVkaW9QYXRjaCgpIGJhZCBjYXB0dXJlIEkvTyBoYW5kbGUgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzWzBdLmV4dC5taXguaGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCIlcygpIGJhZCBjYXB0dXJlIEkvTyBoYW5kbGUgJWQiLCBfX2Z1bmNfXywgaW9IYW5kbGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gdGhyZWFkLT5zZW5kUmVsZWFzZUF1ZGlvUGF0Y2hDb25maWdFdmVudChyZW1vdmVkUGF0Y2gtPm1IYWxIYW5kbGUpOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHRocmVhZC0+c2VuZFJlbGVhc2VBdWRpb1BhdGNoQ29uZmlnRXZlbnQocmVtb3ZlZFBhdGNoLm1IYWxIYW5kbGUpOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBBdWRpb0h3RGV2aWNlICphdWRpb0h3RGV2aWNlID0gYXVkaW9mbGluZ2VyLT5tQXVkaW9Id0RldnMudmFsdWVBdChpbmRleCk7Ci0gICAgICAgICAgICAgICAgc3A8RGV2aWNlSGFsSW50ZXJmYWNlPiBod0RldmljZSA9IGF1ZGlvSHdEZXZpY2UtPmh3RGV2aWNlKCk7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gaHdEZXZpY2UtPnJlbGVhc2VBdWRpb1BhdGNoKHJlbW92ZWRQYXRjaC0+bUhhbEhhbmRsZSk7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gaHdEZXZpY2UtPnJlbGVhc2VBdWRpb1BhdGNoKHJlbW92ZWRQYXRjaC5tSGFsSGFuZGxlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBBVURJT19QT1JUX1RZUEVfTUlYOiB7Ci0gICAgICAgICAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3Qgc3JjTW9kdWxlID0gIHBhdGNoLT5zb3VyY2VzWzBdLmV4dC5taXguaHdfbW9kdWxlOwotICAgICAgICAgICAgc3NpemVfdCBpbmRleCA9IGF1ZGlvZmxpbmdlci0+bUF1ZGlvSHdEZXZzLmluZGV4T2ZLZXkoc3JjTW9kdWxlKTsKLSAgICAgICAgICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgICAgICAgICBBTE9HVygicmVsZWFzZUF1ZGlvUGF0Y2goKSBiYWQgc3JjIGh3IG1vZHVsZSAlZCIsIHNyY01vZHVsZSk7CisgICAgICAgICAgICBpZiAoZmluZEh3RGV2aWNlQnlNb2R1bGUoc3JjLmV4dC5taXguaHdfbW9kdWxlKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgQUxPR1coIiVzKCkgYmFkIHNyYyBodyBtb2R1bGUgJWQiLCBfX2Z1bmNfXywgc3JjLmV4dC5taXguaHdfbW9kdWxlKTsKICAgICAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvZmxpbmdlci0+Y2hlY2tQbGF5YmFja1RocmVhZF9sKHBhdGNoLT5zb3VyY2VzWzBdLmV4dC5taXguaGFuZGxlKTsKKyAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlID0gc3JjLmV4dC5taXguaGFuZGxlOworICAgICAgICAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gbUF1ZGlvRmxpbmdlci5jaGVja1BsYXliYWNrVGhyZWFkX2woaW9IYW5kbGUpOwogICAgICAgICAgICAgaWYgKHRocmVhZCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgdGhyZWFkID0gYXVkaW9mbGluZ2VyLT5jaGVja01tYXBUaHJlYWRfbChwYXRjaC0+c291cmNlc1swXS5leHQubWl4LmhhbmRsZSk7CisgICAgICAgICAgICAgICAgdGhyZWFkID0gbUF1ZGlvRmxpbmdlci5jaGVja01tYXBUaHJlYWRfbChpb0hhbmRsZSk7CiAgICAgICAgICAgICAgICAgaWYgKHRocmVhZCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dXKCJyZWxlYXNlQXVkaW9QYXRjaCgpIGJhZCBwbGF5YmFjayBJL08gaGFuZGxlICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zb3VyY2VzWzBdLmV4dC5taXguaGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coIiVzKCkgYmFkIHBsYXliYWNrIEkvTyBoYW5kbGUgJWQiLCBfX2Z1bmNfXywgaW9IYW5kbGUpOwogICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN0YXR1cyA9IHRocmVhZC0+c2VuZFJlbGVhc2VBdWRpb1BhdGNoQ29uZmlnRXZlbnQocmVtb3ZlZFBhdGNoLT5tSGFsSGFuZGxlKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IHRocmVhZC0+c2VuZFJlbGVhc2VBdWRpb1BhdGNoQ29uZmlnRXZlbnQocmVtb3ZlZFBhdGNoLm1IYWxIYW5kbGUpOwogICAgICAgICB9IGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwotICAgICAgICAgICAgYnJlYWs7CiAgICAgfQogCi0gICAgZGVsZXRlIHJlbW92ZWRQYXRjaDsKKyAgICBtUGF0Y2hlcy5lcmFzZShpdGVyKTsKKyAgICByZW1vdmVTb2Z0d2FyZVBhdGNoRnJvbUluc2VydGVkTW9kdWxlcyhoYW5kbGUpOwogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKLQogLyogTGlzdCBjb25uZWN0ZWQgYXVkaW8gcG9ydHMgYW5kIHRoZXkgYXR0cmlidXRlcyAqLwogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQYXRjaFBhbmVsOjpsaXN0QXVkaW9QYXRjaGVzKHVuc2lnbmVkIGludCAqbnVtX3BhdGNoZXMgX191bnVzZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaGVzIF9fdW51c2VkKQogewotICAgIEFMT0dWKCJsaXN0QXVkaW9QYXRjaGVzIik7CisgICAgQUxPR1YoX19mdW5jX18pOwogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotLyogU2V0IGF1ZGlvIHBvcnQgY29uZmlndXJhdGlvbiAqLwotc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQYXRjaFBhbmVsOjpzZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlBhdGNoUGFuZWw6OmdldERvd25zdHJlYW1Tb2Z0d2FyZVBhdGNoZXMoCisgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IHN0cmVhbSwKKyAgICAgICAgc3RkOjp2ZWN0b3I8QXVkaW9GbGluZ2VyOjpQYXRjaFBhbmVsOjpTb2Z0d2FyZVBhdGNoPiAqcGF0Y2hlcykgY29uc3QKIHsKLSAgICBBTE9HVigic2V0QXVkaW9Qb3J0Q29uZmlnIik7Ci0KLSAgICBzcDxBdWRpb0ZsaW5nZXI+IGF1ZGlvZmxpbmdlciA9IG1BdWRpb0ZsaW5nZXIucHJvbW90ZSgpOwotICAgIGlmIChhdWRpb2ZsaW5nZXIgPT0gMCkgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIG1vZHVsZSA6IG1JbnNlcnRlZE1vZHVsZXMpIHsKKyAgICAgICAgaWYgKG1vZHVsZS5zZWNvbmQuc3RyZWFtcy5jb3VudChzdHJlYW0pKSB7CisgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHBhdGNoSGFuZGxlIDogbW9kdWxlLnNlY29uZC5zd19wYXRjaGVzKSB7CisgICAgICAgICAgICAgICAgY29uc3QgYXV0byYgcGF0Y2hfaXRlciA9IG1QYXRjaGVzLmZpbmQocGF0Y2hIYW5kbGUpOworICAgICAgICAgICAgICAgIGlmIChwYXRjaF9pdGVyICE9IG1QYXRjaGVzLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhdGNoICZwYXRjaCA9IHBhdGNoX2l0ZXItPnNlY29uZDsKKyAgICAgICAgICAgICAgICAgICAgcGF0Y2hlcy0+ZW1wbGFjZV9iYWNrKCp0aGlzLCBwYXRjaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC5tUGxheWJhY2suY29uc3RfdGhyZWFkKCktPmlkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gubVJlY29yZC5jb25zdF90aHJlYWQoKS0+aWQoKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIlN0YWxlIHBhdGNoIGhhbmRsZSBpbiB0aGUgY2FjaGU6ICVkIiwgcGF0Y2hIYW5kbGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfQogICAgIH0KKyAgICAvLyBUaGUgc3RyZWFtIGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggYW55IG9mIGluc2VydGVkIG1vZHVsZXMuCisgICAgcmV0dXJuIEJBRF9WQUxVRTsKK30KIAotICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGU7Ci0gICAgaWYgKGNvbmZpZy0+dHlwZSA9PSBBVURJT19QT1JUX1RZUEVfREVWSUNFKSB7Ci0gICAgICAgIG1vZHVsZSA9IGNvbmZpZy0+ZXh0LmRldmljZS5od19tb2R1bGU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbW9kdWxlID0gY29uZmlnLT5leHQubWl4Lmh3X21vZHVsZTsKK3ZvaWQgQXVkaW9GbGluZ2VyOjpQYXRjaFBhbmVsOjpub3RpZnlTdHJlYW1PcGVuZWQoCisgICAgICAgIEF1ZGlvSHdEZXZpY2UgKmF1ZGlvSHdEZXZpY2UsIGF1ZGlvX2lvX2hhbmRsZV90IHN0cmVhbSkKK3sKKyAgICBpZiAoYXVkaW9Id0RldmljZS0+aXNJbnNlcnQoKSkgeworICAgICAgICBtSW5zZXJ0ZWRNb2R1bGVzW2F1ZGlvSHdEZXZpY2UtPmhhbmRsZSgpXS5zdHJlYW1zLmluc2VydChzdHJlYW0pOwogICAgIH0KK30KIAotICAgIHNzaXplX3QgaW5kZXggPSBhdWRpb2ZsaW5nZXItPm1BdWRpb0h3RGV2cy5pbmRleE9mS2V5KG1vZHVsZSk7Cit2b2lkIEF1ZGlvRmxpbmdlcjo6UGF0Y2hQYW5lbDo6bm90aWZ5U3RyZWFtQ2xvc2VkKGF1ZGlvX2lvX2hhbmRsZV90IHN0cmVhbSkKK3sKKyAgICBmb3IgKGF1dG8mIG1vZHVsZSA6IG1JbnNlcnRlZE1vZHVsZXMpIHsKKyAgICAgICAgbW9kdWxlLnNlY29uZC5zdHJlYW1zLmVyYXNlKHN0cmVhbSk7CisgICAgfQorfQorCitBdWRpb0h3RGV2aWNlKiBBdWRpb0ZsaW5nZXI6OlBhdGNoUGFuZWw6OmZpbmRBdWRpb0h3RGV2aWNlQnlNb2R1bGUoYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSkKK3sKKyAgICBpZiAobW9kdWxlID09IEFVRElPX01PRFVMRV9IQU5ETEVfTk9ORSkgcmV0dXJuIG51bGxwdHI7CisgICAgc3NpemVfdCBpbmRleCA9IG1BdWRpb0ZsaW5nZXIubUF1ZGlvSHdEZXZzLmluZGV4T2ZLZXkobW9kdWxlKTsKICAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIEFMT0dXKCJzZXRBdWRpb1BvcnRDb25maWcoKSBiYWQgaHcgbW9kdWxlICVkIiwgbW9kdWxlKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgQUxPR1coIiVzKCkgYmFkIGh3IG1vZHVsZSAlZCIsIF9fZnVuY19fLCBtb2R1bGUpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgcmV0dXJuIG1BdWRpb0ZsaW5nZXIubUF1ZGlvSHdEZXZzLnZhbHVlQXQoaW5kZXgpOworfQorCitzcDxEZXZpY2VIYWxJbnRlcmZhY2U+IEF1ZGlvRmxpbmdlcjo6UGF0Y2hQYW5lbDo6ZmluZEh3RGV2aWNlQnlNb2R1bGUoYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSkKK3sKKyAgICBBdWRpb0h3RGV2aWNlICphdWRpb0h3RGV2aWNlID0gZmluZEF1ZGlvSHdEZXZpY2VCeU1vZHVsZShtb2R1bGUpOworICAgIHJldHVybiBhdWRpb0h3RGV2aWNlID8gYXVkaW9Id0RldmljZS0+aHdEZXZpY2UoKSA6IG51bGxwdHI7Cit9CisKK3ZvaWQgQXVkaW9GbGluZ2VyOjpQYXRjaFBhbmVsOjphZGRTb2Z0d2FyZVBhdGNoVG9JbnNlcnRlZE1vZHVsZXMoCisgICAgICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUsIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSkKK3sKKyAgICBtSW5zZXJ0ZWRNb2R1bGVzW21vZHVsZV0uc3dfcGF0Y2hlcy5pbnNlcnQoaGFuZGxlKTsKK30KKwordm9pZCBBdWRpb0ZsaW5nZXI6OlBhdGNoUGFuZWw6OnJlbW92ZVNvZnR3YXJlUGF0Y2hGcm9tSW5zZXJ0ZWRNb2R1bGVzKAorICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpCit7CisgICAgZm9yIChhdXRvJiBtb2R1bGUgOiBtSW5zZXJ0ZWRNb2R1bGVzKSB7CisgICAgICAgIG1vZHVsZS5zZWNvbmQuc3dfcGF0Y2hlcy5lcmFzZShoYW5kbGUpOworICAgIH0KK30KKwordm9pZCBBdWRpb0ZsaW5nZXI6OlBhdGNoUGFuZWw6OmR1bXAoaW50IGZkKSBjb25zdAoreworICAgIFN0cmluZzggcGF0Y2hQYW5lbER1bXA7CisgICAgY29uc3QgY2hhciAqaW5kZW50ID0gIiAgIjsKKworICAgIC8vIE9ubHkgZHVtcCBzb2Z0d2FyZSBwYXRjaGVzLgorICAgIGJvb2wgaGVhZGVyUHJpbnRlZCA9IGZhbHNlOworICAgIGZvciAoY29uc3QgYXV0byYgaXRlciA6IG1QYXRjaGVzKSB7CisgICAgICAgIGlmIChpdGVyLnNlY29uZC5pc1NvZnR3YXJlKCkpIHsKKyAgICAgICAgICAgIGlmICghaGVhZGVyUHJpbnRlZCkgeworICAgICAgICAgICAgICAgIHBhdGNoUGFuZWxEdW1wICs9ICJcblNvZnR3YXJlIHBhdGNoZXM6XG4iOworICAgICAgICAgICAgICAgIGhlYWRlclByaW50ZWQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcGF0Y2hQYW5lbER1bXAuYXBwZW5kRm9ybWF0KCIlcyVzXG4iLCBpbmRlbnQsIGl0ZXIuc2Vjb25kLmR1bXAoaXRlci5maXJzdCkuc3RyaW5nKCkpOworICAgICAgICB9CiAgICAgfQogCi0gICAgQXVkaW9Id0RldmljZSAqYXVkaW9Id0RldmljZSA9IGF1ZGlvZmxpbmdlci0+bUF1ZGlvSHdEZXZzLnZhbHVlQXQoaW5kZXgpOwotICAgIHJldHVybiBhdWRpb0h3RGV2aWNlLT5od0RldmljZSgpLT5zZXRBdWRpb1BvcnRDb25maWcoY29uZmlnKTsKKyAgICBoZWFkZXJQcmludGVkID0gZmFsc2U7CisgICAgZm9yIChjb25zdCBhdXRvJiBtb2R1bGUgOiBtSW5zZXJ0ZWRNb2R1bGVzKSB7CisgICAgICAgIGlmICghbW9kdWxlLnNlY29uZC5zdHJlYW1zLmVtcHR5KCkgfHwgIW1vZHVsZS5zZWNvbmQuc3dfcGF0Y2hlcy5lbXB0eSgpKSB7CisgICAgICAgICAgICBpZiAoIWhlYWRlclByaW50ZWQpIHsKKyAgICAgICAgICAgICAgICBwYXRjaFBhbmVsRHVtcCArPSAiXG5UcmFja2VkIGluc2VydGVkIG1vZHVsZXM6XG4iOworICAgICAgICAgICAgICAgIGhlYWRlclByaW50ZWQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RyaW5nOCBtb2R1bGVEdW1wID0gU3RyaW5nODo6Zm9ybWF0KCJNb2R1bGUgJWQ6IEkvTyBoYW5kbGVzOiAiLCBtb2R1bGUuZmlyc3QpOworICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBzdHJlYW0gOiBtb2R1bGUuc2Vjb25kLnN0cmVhbXMpIHsKKyAgICAgICAgICAgICAgICBtb2R1bGVEdW1wLmFwcGVuZEZvcm1hdCgiJWQgIiwgc3RyZWFtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1vZHVsZUR1bXAuYXBwZW5kKCI7IFNXIFBhdGNoZXM6ICIpOworICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBwYXRjaCA6IG1vZHVsZS5zZWNvbmQuc3dfcGF0Y2hlcykgeworICAgICAgICAgICAgICAgIG1vZHVsZUR1bXAuYXBwZW5kRm9ybWF0KCIlZCAiLCBwYXRjaCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwYXRjaFBhbmVsRHVtcC5hcHBlbmRGb3JtYXQoIiVzJXNcbiIsIGluZGVudCwgbW9kdWxlRHVtcC5zdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIXBhdGNoUGFuZWxEdW1wLmlzRW1wdHkoKSkgeworICAgICAgICB3cml0ZShmZCwgcGF0Y2hQYW5lbER1bXAuc3RyaW5nKCksIHBhdGNoUGFuZWxEdW1wLnNpemUoKSk7CisgICAgfQogfQogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGF0Y2hQYW5lbC5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1BhdGNoUGFuZWwuaAppbmRleCBkMzdjMGQzLi4yZDliZDhlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGF0Y2hQYW5lbC5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9QYXRjaFBhbmVsLmgKQEAgLTE5LDEzICsxOSwzMyBAQAogICAgICNlcnJvciBUaGlzIGhlYWRlciBmaWxlIHNob3VsZCBvbmx5IGJlIGluY2x1ZGVkIGZyb20gQXVkaW9GbGluZ2VyLmgKICNlbmRpZgogCi1jbGFzcyBQYXRjaFBhbmVsIDogcHVibGljIFJlZkJhc2UgeworCisvLyBQYXRjaFBhbmVsIGlzIGNvbmNlYWxlZCB3aXRoaW4gQXVkaW9GbGluZ2VyLCB0aGVpciBsaWZldGltZXMgYXJlIHRoZSBzYW1lLgorY2xhc3MgUGF0Y2hQYW5lbCB7CiBwdWJsaWM6CisgICAgY2xhc3MgU29mdHdhcmVQYXRjaCB7CisgICAgICBwdWJsaWM6CisgICAgICAgIFNvZnR3YXJlUGF0Y2goY29uc3QgUGF0Y2hQYW5lbCAmcGF0Y2hQYW5lbCwgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUsCisgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgcGxheWJhY2tUaHJlYWRIYW5kbGUsIGF1ZGlvX2lvX2hhbmRsZV90IHJlY29yZFRocmVhZEhhbmRsZSkKKyAgICAgICAgICAgICAgICA6IG1QYXRjaFBhbmVsKHBhdGNoUGFuZWwpLCBtUGF0Y2hIYW5kbGUocGF0Y2hIYW5kbGUpLAorICAgICAgICAgICAgICAgICAgbVBsYXliYWNrVGhyZWFkSGFuZGxlKHBsYXliYWNrVGhyZWFkSGFuZGxlKSwKKyAgICAgICAgICAgICAgICAgIG1SZWNvcmRUaHJlYWRIYW5kbGUocmVjb3JkVGhyZWFkSGFuZGxlKSB7fQorICAgICAgICBTb2Z0d2FyZVBhdGNoKGNvbnN0IFNvZnR3YXJlUGF0Y2gmKSA9IGRlZmF1bHQ7CisgICAgICAgIFNvZnR3YXJlUGF0Y2gmIG9wZXJhdG9yPShjb25zdCBTb2Z0d2FyZVBhdGNoJikgPSBkZWZhdWx0OwogCi0gICAgY2xhc3MgUGF0Y2g7CisgICAgICAgIC8vIE11c3QgYmUgY2FsbGVkIHVuZGVyIEF1ZGlvRmxpbmdlcjo6bUxvY2sKKyAgICAgICAgc3RhdHVzX3QgZ2V0TGF0ZW5jeU1zX2woZG91YmxlICpsYXRlbmN5TXMpIGNvbnN0OworICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBnZXRQYXRjaEhhbmRsZSgpIGNvbnN0IHsgcmV0dXJuIG1QYXRjaEhhbmRsZTsgfTsKKyAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgZ2V0UGxheWJhY2tUaHJlYWRIYW5kbGUoKSBjb25zdCB7IHJldHVybiBtUGxheWJhY2tUaHJlYWRIYW5kbGU7IH07CisgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGdldFJlY29yZFRocmVhZEhhbmRsZSgpIGNvbnN0IHsgcmV0dXJuIG1SZWNvcmRUaHJlYWRIYW5kbGU7IH07CisgICAgICBwcml2YXRlOgorICAgICAgICBjb25zdCBQYXRjaFBhbmVsICZtUGF0Y2hQYW5lbDsKKyAgICAgICAgY29uc3QgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgbVBhdGNoSGFuZGxlOworICAgICAgICBjb25zdCBhdWRpb19pb19oYW5kbGVfdCBtUGxheWJhY2tUaHJlYWRIYW5kbGU7CisgICAgICAgIGNvbnN0IGF1ZGlvX2lvX2hhbmRsZV90IG1SZWNvcmRUaHJlYWRIYW5kbGU7CisgICAgfTsKIAotICAgIGV4cGxpY2l0IFBhdGNoUGFuZWwoY29uc3Qgc3A8QXVkaW9GbGluZ2VyPiYgYXVkaW9GbGluZ2VyKTsKLSAgICB2aXJ0dWFsIH5QYXRjaFBhbmVsKCk7CisgICAgZXhwbGljaXQgUGF0Y2hQYW5lbChBdWRpb0ZsaW5nZXIqIGF1ZGlvRmxpbmdlcikgOiBtQXVkaW9GbGluZ2VyKCphdWRpb0ZsaW5nZXIpIHt9CiAKICAgICAvKiBMaXN0IGNvbm5lY3RlZCBhdWRpbyBwb3J0cyBhbmQgdGhlaXIgYXR0cmlidXRlcyAqLwogICAgIHN0YXR1c190IGxpc3RBdWRpb1BvcnRzKHVuc2lnbmVkIGludCAqbnVtX3BvcnRzLApAQCAtNDUsNDYgKzY1LDE0NCBAQAogICAgIHN0YXR1c190IGxpc3RBdWRpb1BhdGNoZXModW5zaWduZWQgaW50ICpudW1fcGF0Y2hlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaGVzKTsKIAotICAgIC8qIFNldCBhdWRpbyBwb3J0IGNvbmZpZ3VyYXRpb24gKi8KLSAgICBzdGF0dXNfdCBzZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpOworICAgIC8vIFJldHJpZXZlcyBhbGwgY3VycmVudGx5IGVzdHJhYmxpc2hlZCBzb2Z0d2FyZSBwYXRjaGVzIGZvciBhIHN0cmVhbQorICAgIC8vIG9wZW5lZCBvbiBhbiBpbnRlcm1lZGlhdGUgbW9kdWxlLgorICAgIHN0YXR1c190IGdldERvd25zdHJlYW1Tb2Z0d2FyZVBhdGNoZXMoYXVkaW9faW9faGFuZGxlX3Qgc3RyZWFtLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8U29mdHdhcmVQYXRjaD4gKnBhdGNoZXMpIGNvbnN0OwogCi0gICAgc3RhdHVzX3QgY3JlYXRlUGF0Y2hDb25uZWN0aW9ucyhQYXRjaCAqcGF0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKmF1ZGlvUGF0Y2gpOwotICAgIHZvaWQgY2xlYXJQYXRjaENvbm5lY3Rpb25zKFBhdGNoICpwYXRjaCk7CisgICAgLy8gTm90aWZpZXMgcGF0Y2ggcGFuZWwgYWJvdXQgYWxsIG9wZW5lZCBhbmQgY2xvc2VkIHN0cmVhbXMuCisgICAgdm9pZCBub3RpZnlTdHJlYW1PcGVuZWQoQXVkaW9Id0RldmljZSAqYXVkaW9Id0RldmljZSwgYXVkaW9faW9faGFuZGxlX3Qgc3RyZWFtKTsKKyAgICB2b2lkIG5vdGlmeVN0cmVhbUNsb3NlZChhdWRpb19pb19oYW5kbGVfdCBzdHJlYW0pOworCisgICAgdm9pZCBkdW1wKGludCBmZCkgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVGhyZWFkVHlwZSwgdHlwZW5hbWUgVHJhY2tUeXBlPgorICAgIGNsYXNzIEVuZHBvaW50IHsKKyAgICBwdWJsaWM6CisgICAgICAgIEVuZHBvaW50KCkgPSBkZWZhdWx0OworICAgICAgICBFbmRwb2ludChFbmRwb2ludCYmIG90aGVyKSB7ICp0aGlzID0gc3RkOjptb3ZlKG90aGVyKTsgfQorICAgICAgICBFbmRwb2ludCYgb3BlcmF0b3I9KEVuZHBvaW50JiYgb3RoZXIpIHsKKyAgICAgICAgICAgIEFMT0dFX0lGKG1IYW5kbGUgIT0gQVVESU9fUEFUQ0hfSEFORExFX05PTkUsCisgICAgICAgICAgICAgICAgICAgICJBIG5vbiBlbXB0eSBQYXRjaCBFbmRwb2ludCBsZWFrZWQsIGhhbmRsZSAlZCIsIG1IYW5kbGUpOworICAgICAgICAgICAgKnRoaXMgPSBvdGhlcjsKKyAgICAgICAgICAgIG90aGVyLm1IYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXR1c190IGNoZWNrVHJhY2soVHJhY2tUeXBlICp0cmFja09yTnVsbCkgY29uc3QgeworICAgICAgICAgICAgaWYgKHRyYWNrT3JOdWxsID09IG51bGxwdHIpIHJldHVybiBOT19NRU1PUlk7CisgICAgICAgICAgICByZXR1cm4gdHJhY2tPck51bGwtPmluaXRDaGVjaygpOworICAgICAgICB9CisgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSgpIGNvbnN0IHsgcmV0dXJuIG1IYW5kbGU7IH0KKyAgICAgICAgc3A8VGhyZWFkVHlwZT4gdGhyZWFkKCkgeyByZXR1cm4gbVRocmVhZDsgfQorICAgICAgICBzcDxUcmFja1R5cGU+IHRyYWNrKCkgeyByZXR1cm4gbVRyYWNrOyB9CisgICAgICAgIHNwPGNvbnN0IFRocmVhZFR5cGU+IGNvbnN0X3RocmVhZCgpIGNvbnN0IHsgcmV0dXJuIG1UaHJlYWQ7IH0KKyAgICAgICAgc3A8Y29uc3QgVHJhY2tUeXBlPiBjb25zdF90cmFjaygpIGNvbnN0IHsgcmV0dXJuIG1UcmFjazsgfQorCisgICAgICAgIHZvaWQgY2xvc2VDb25uZWN0aW9ucyhQYXRjaFBhbmVsICpwYW5lbCkgeworICAgICAgICAgICAgaWYgKG1IYW5kbGUgIT0gQVVESU9fUEFUQ0hfSEFORExFX05PTkUpIHsKKyAgICAgICAgICAgICAgICBwYW5lbC0+cmVsZWFzZUF1ZGlvUGF0Y2gobUhhbmRsZSk7CisgICAgICAgICAgICAgICAgbUhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1UaHJlYWQgIT0gMCkgeworICAgICAgICAgICAgICAgIGlmIChtVHJhY2sgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBtVGhyZWFkLT5kZWxldGVQYXRjaFRyYWNrKG1UcmFjayk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChtQ2xvc2VUaHJlYWQpIHsKKyAgICAgICAgICAgICAgICAgICAgcGFuZWwtPm1BdWRpb0ZsaW5nZXIuY2xvc2VUaHJlYWRJbnRlcm5hbF9sKG1UaHJlYWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCogaGFuZGxlUHRyKCkgeyByZXR1cm4gJm1IYW5kbGU7IH0KKyAgICAgICAgdm9pZCBzZXRUaHJlYWQoY29uc3Qgc3A8VGhyZWFkVHlwZT4mIHRocmVhZCwgYm9vbCBjbG9zZVRocmVhZCA9IHRydWUpIHsKKyAgICAgICAgICAgIG1UaHJlYWQgPSB0aHJlYWQ7CisgICAgICAgICAgICBtQ2xvc2VUaHJlYWQgPSBjbG9zZVRocmVhZDsKKyAgICAgICAgfQorICAgICAgICB2b2lkIHNldFRyYWNrQW5kUGVlcihjb25zdCBzcDxUcmFja1R5cGU+JiB0cmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyZWFkQmFzZTo6UGF0Y2hQcm94eUJ1ZmZlclByb3ZpZGVyICpwZWVyKSB7CisgICAgICAgICAgICBtVHJhY2sgPSB0cmFjazsKKyAgICAgICAgICAgIG1UaHJlYWQtPmFkZFBhdGNoVHJhY2sobVRyYWNrKTsKKyAgICAgICAgICAgIG1UcmFjay0+c2V0UGVlclByb3h5KHBlZXIpOworICAgICAgICB9CisgICAgICAgIHZvaWQgc3RvcFRyYWNrKCkgeyBpZiAobVRyYWNrKSBtVHJhY2stPnN0b3AoKTsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgRW5kcG9pbnQoY29uc3QgRW5kcG9pbnQmKSA9IGRlZmF1bHQ7CisgICAgICAgIEVuZHBvaW50JiBvcGVyYXRvcj0oY29uc3QgRW5kcG9pbnQmKSA9IGRlZmF1bHQ7CisKKyAgICAgICAgc3A8VGhyZWFkVHlwZT4gbVRocmVhZDsKKyAgICAgICAgYm9vbCBtQ2xvc2VUaHJlYWQgPSB0cnVlOworICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBtSGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7CisgICAgICAgIHNwPFRyYWNrVHlwZT4gbVRyYWNrOworICAgIH07CiAKICAgICBjbGFzcyBQYXRjaCB7CiAgICAgcHVibGljOgotICAgICAgICBleHBsaWNpdCBQYXRjaChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoKSA6Ci0gICAgICAgICAgICBtQXVkaW9QYXRjaCgqcGF0Y2gpLCBtSGFuZGxlKEFVRElPX1BBVENIX0hBTkRMRV9OT05FKSwKLSAgICAgICAgICAgIG1IYWxIYW5kbGUoQVVESU9fUEFUQ0hfSEFORExFX05PTkUpLCBtUmVjb3JkUGF0Y2hIYW5kbGUoQVVESU9fUEFUQ0hfSEFORExFX05PTkUpLAotICAgICAgICAgICAgbVBsYXliYWNrUGF0Y2hIYW5kbGUoQVVESU9fUEFUQ0hfSEFORExFX05PTkUpIHt9Ci0gICAgICAgIH5QYXRjaCgpIHt9CisgICAgICAgIGV4cGxpY2l0IFBhdGNoKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAmcGF0Y2gpIDogbUF1ZGlvUGF0Y2gocGF0Y2gpIHt9CisgICAgICAgIH5QYXRjaCgpOworICAgICAgICBQYXRjaChjb25zdCBQYXRjaCYpID0gZGVsZXRlOworICAgICAgICBQYXRjaChQYXRjaCYmKSA9IGRlZmF1bHQ7CisgICAgICAgIFBhdGNoJiBvcGVyYXRvcj0oY29uc3QgUGF0Y2gmKSA9IGRlbGV0ZTsKKyAgICAgICAgUGF0Y2gmIG9wZXJhdG9yPShQYXRjaCYmKSA9IGRlZmF1bHQ7CiAKKyAgICAgICAgc3RhdHVzX3QgY3JlYXRlQ29ubmVjdGlvbnMoUGF0Y2hQYW5lbCAqcGFuZWwpOworICAgICAgICB2b2lkIGNsZWFyQ29ubmVjdGlvbnMoUGF0Y2hQYW5lbCAqcGFuZWwpOworICAgICAgICBib29sIGlzU29mdHdhcmUoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gbVJlY29yZC5oYW5kbGUoKSAhPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORSB8fAorICAgICAgICAgICAgICAgICAgICBtUGxheWJhY2suaGFuZGxlKCkgIT0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7IH0KKworICAgICAgICAvLyByZXR1cm5zIHRoZSBsYXRlbmN5IG9mIHRoZSBwYXRjaCAoZnJvbSByZWNvcmQgdG8gcGxheWJhY2spLgorICAgICAgICBzdGF0dXNfdCBnZXRMYXRlbmN5TXMoZG91YmxlICpsYXRlbmN5TXMpIGNvbnN0OworCisgICAgICAgIFN0cmluZzggZHVtcChhdWRpb19wYXRjaF9oYW5kbGVfdCBteUhhbmRsZSkgY29uc3Q7CisKKyAgICAgICAgLy8gTm90ZSB0aGF0IGF1ZGlvX3BhdGNoOjppZCBpcyBvbmx5IHVuaXF1ZSB3aXRoaW4gYSBIQUwgbW9kdWxlCiAgICAgICAgIHN0cnVjdCBhdWRpb19wYXRjaCAgICAgICAgICAgICAgbUF1ZGlvUGF0Y2g7Ci0gICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICAgICAgICAgICAgbUhhbmRsZTsKICAgICAgICAgLy8gaGFuZGxlIGZvciBhdWRpbyBIQUwgcGF0Y2ggaGFuZGxlIHByZXNlbnQgb25seSB3aGVuIHRoZSBhdWRpbyBIQUwgdmVyc2lvbiBpcyA+PSAzLjAKLSAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgICAgICAgICAgICBtSGFsSGFuZGxlOworICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAgICAgICAgICAgIG1IYWxIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKICAgICAgICAgLy8gYmVsb3cgbWVtYmVycyBhcmUgdXNlZCBieSBhIHNvZnR3YXJlIGF1ZGlvIHBhdGNoIGNvbm5lY3RpbmcgYSBzb3VyY2UgZGV2aWNlIGZyb20gYQogICAgICAgICAvLyBnaXZlbiBhdWRpbyBIVyBtb2R1bGUgdG8gYSBzaW5rIGRldmljZSBvbiBhbiBvdGhlciBhdWRpbyBIVyBtb2R1bGUuCi0gICAgICAgIC8vIHBsYXliYWNrIHRocmVhZCBjcmVhdGVkIGJ5IGNyZWF0ZUF1ZGlvUGF0Y2goKSBhbmQgcmVsZWFzZWQgYnkgY2xlYXJQYXRjaENvbm5lY3Rpb25zKCkgaWYKLSAgICAgICAgLy8gbm8gZXhpc3RpbmcgcGxheWJhY2sgdGhyZWFkIGNhbiBiZSB1c2VkIGJ5IHRoZSBzb2Z0d2FyZSBwYXRjaAotICAgICAgICBzcDxQbGF5YmFja1RocmVhZD4gICAgICAgICAgICAgIG1QbGF5YmFja1RocmVhZDsKLSAgICAgICAgLy8gYXVkaW8gdHJhY2sgY3JlYXRlZCBieSBjcmVhdGVQYXRjaENvbm5lY3Rpb25zKCkgYW5kIHJlbGVhc2VkIGJ5IGNsZWFyUGF0Y2hDb25uZWN0aW9ucygpCi0gICAgICAgIHNwPFBsYXliYWNrVGhyZWFkOjpQYXRjaFRyYWNrPiAgbVBhdGNoVHJhY2s7Ci0gICAgICAgIC8vIHJlY29yZCB0aHJlYWQgY3JlYXRlZCBieSBjcmVhdGVBdWRpb1BhdGNoKCkgYW5kIHJlbGVhc2VkIGJ5IGNsZWFyUGF0Y2hDb25uZWN0aW9ucygpCi0gICAgICAgIHNwPFJlY29yZFRocmVhZD4gICAgICAgICAgICAgICAgbVJlY29yZFRocmVhZDsKLSAgICAgICAgLy8gYXVkaW8gcmVjb3JkIGNyZWF0ZWQgYnkgY3JlYXRlUGF0Y2hDb25uZWN0aW9ucygpIGFuZCByZWxlYXNlZCBieSBjbGVhclBhdGNoQ29ubmVjdGlvbnMoKQotICAgICAgICBzcDxSZWNvcmRUaHJlYWQ6OlBhdGNoUmVjb3JkPiAgIG1QYXRjaFJlY29yZDsKLSAgICAgICAgLy8gaGFuZGxlIGZvciBhdWRpbyBwYXRjaCBjb25uZWN0aW5nIHNvdXJjZSBkZXZpY2UgdG8gcmVjb3JkIHRocmVhZCBpbnB1dC4KLSAgICAgICAgLy8gY3JlYXRlZCBieSBjcmVhdGVQYXRjaENvbm5lY3Rpb25zKCkgYW5kIHJlbGVhc2VkIGJ5IGNsZWFyUGF0Y2hDb25uZWN0aW9ucygpCi0gICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICAgICAgICAgICAgbVJlY29yZFBhdGNoSGFuZGxlOwotICAgICAgICAvLyBoYW5kbGUgZm9yIGF1ZGlvIHBhdGNoIGNvbm5lY3RpbmcgcGxheWJhY2sgdGhyZWFkIG91dHB1dCB0byBzaW5rIGRldmljZQotICAgICAgICAvLyBjcmVhdGVkIGJ5IGNyZWF0ZVBhdGNoQ29ubmVjdGlvbnMoKSBhbmQgcmVsZWFzZWQgYnkgY2xlYXJQYXRjaENvbm5lY3Rpb25zKCkKLSAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgICAgICAgICAgICBtUGxheWJhY2tQYXRjaEhhbmRsZTsKLQorICAgICAgICAvLyB0aGUgb2JqZWN0cyBhcmUgY3JlYXRlZCBieSBjcmVhdGVDb25uZWN0aW9ucygpIGFuZCByZWxlYXNlZCBieSBjbGVhckNvbm5lY3Rpb25zKCkKKyAgICAgICAgLy8gcGxheWJhY2sgdGhyZWFkIGlzIGNyZWF0ZWQgaWYgbm8gZXhpc3RpbmcgcGxheWJhY2sgdGhyZWFkIGNhbiBiZSB1c2VkCisgICAgICAgIC8vIGNvbm5lY3RzIHBsYXliYWNrIHRocmVhZCBvdXRwdXQgdG8gc2luayBkZXZpY2UKKyAgICAgICAgRW5kcG9pbnQ8UGxheWJhY2tUaHJlYWQsIFBsYXliYWNrVGhyZWFkOjpQYXRjaFRyYWNrPiBtUGxheWJhY2s7CisgICAgICAgIC8vIGNvbm5lY3RzIHNvdXJjZSBkZXZpY2UgdG8gcmVjb3JkIHRocmVhZCBpbnB1dAorICAgICAgICBFbmRwb2ludDxSZWNvcmRUaHJlYWQsIFJlY29yZFRocmVhZDo6UGF0Y2hSZWNvcmQ+IG1SZWNvcmQ7CiAgICAgfTsKIAotcHJpdmF0ZToKLSAgICBjb25zdCB3cDxBdWRpb0ZsaW5nZXI+ICAgICAgbUF1ZGlvRmxpbmdlcjsKLSAgICBTb3J0ZWRWZWN0b3IgPFBhdGNoICo+ICAgICAgbVBhdGNoZXM7CisgICAgQXVkaW9Id0RldmljZSogZmluZEF1ZGlvSHdEZXZpY2VCeU1vZHVsZShhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlKTsKKyAgICBzcDxEZXZpY2VIYWxJbnRlcmZhY2U+IGZpbmRId0RldmljZUJ5TW9kdWxlKGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUpOworICAgIHZvaWQgYWRkU29mdHdhcmVQYXRjaFRvSW5zZXJ0ZWRNb2R1bGVzKAorICAgICAgICAgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKTsKKyAgICB2b2lkIHJlbW92ZVNvZnR3YXJlUGF0Y2hGcm9tSW5zZXJ0ZWRNb2R1bGVzKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSk7CisKKyAgICBBdWRpb0ZsaW5nZXIgJm1BdWRpb0ZsaW5nZXI7CisgICAgc3RkOjptYXA8YXVkaW9fcGF0Y2hfaGFuZGxlX3QsIFBhdGNoPiBtUGF0Y2hlczsKKworICAgIC8vIFRoaXMgbWFwIGFsbG93cyBnb2luZyBmcm9tIGEgdGhyZWFkIHRvICJkb3duc3RyZWFtIiBzb2Z0d2FyZSBwYXRjaGVzCisgICAgLy8gd2hlbiBhIHByb2Nlc3NpbmcgbW9kdWxlIGluc2VydGVkIGluIGJldHdlZW4uIEV4YW1wbGU6CisgICAgLy8KKyAgICAvLyAgZnJvbSBtYXAgdmFsdWUuc3RyZWFtcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXAga2V5CisgICAgLy8gIFtNaXhlciB0aHJlYWRdIC0tPiBbVmlydHVhbCBvdXRwdXQgZGV2aWNlXSAtLT4gW1Byb2Nlc3NpbmcgbW9kdWxlXSAtLS1cCisgICAgLy8gICAgICAgW0hhcndhcmUgbW9kdWxlXSA8LS0gW1BoeXNpY2FsIG91dHB1dCBkZXZpY2VdIDwtLSBbUy9XIFBhdGNoXSA8LS0vCisgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBtYXAgdmFsdWUuc3dfcGF0Y2hlcworICAgIC8vCisgICAgLy8gVGhpcyBhbGxvd3MgdGhlIG1peGVyIHRocmVhZCB0byBsb29rIHVwIHRoZSB0aHJlYWRzIG9mIHRoZSBzb2Z0d2FyZSBwYXRjaAorICAgIC8vIGZvciBwcm9wYWdhdGluZyB0aW1pbmcgaW5mbywgcGFyYW1ldGVycywgZXRjLgorICAgIC8vCisgICAgLy8gVGhlIGN1cnJlbnQgYXNzdW1wdGlvbnMgYXJlOgorICAgIC8vICAgMSkgVGhlIHByb2Nlc3NpbmcgbW9kdWxlIGFjdHMgYXMgYSBtaXhlciB3aXRoIHNldmVyYWwgb3V0cHV0cyB3aGljaAorICAgIC8vICAgICAgcmVwcmVzZW50IGRpZmZlcmVudGx5IGRvd25taXhlZCBhbmQgLyBvciBlbmNvZGVkIHZlcnNpb25zIG9mIHRoZSBzYW1lCisgICAgLy8gICAgICBtaXhlZCBzdHJlYW0uIFRoZXJlIGlzIG5vIDE6MSBjb3JyZXNwb25kZW5jZSBiZXR3ZWVuIHRoZSBpbnB1dCBzdHJlYW1zCisgICAgLy8gICAgICBhbmQgdGhlIHNvZnR3YXJlIHBhdGNoZXMsIGJ1dCByYXRoZXIgYSBOOk4gY29ycmVzcG9uZGVuY2UgYmV0d2VlbgorICAgIC8vICAgICAgYSBncm91cCBvZiBzdHJlYW1zIGFuZCBhIGdyb3VwIG9mIHBhdGNoZXMuCisgICAgLy8gICAyKSBUaGVyZSBhcmUgb25seSBhIGNvdXBsZSBvZiBpbnNlcnRlZCBwcm9jZXNzaW5nIG1vZHVsZXMgaW4gdGhlIHN5c3RlbSwKKyAgICAvLyAgICAgIHNvIHdoZW4gbG9va2luZyBmb3IgYSBzdHJlYW0gb3IgcGF0Y2ggaGFuZGxlIHdlIGNhbiBpdGVyYXRlIG92ZXIKKyAgICAvLyAgICAgIGFsbCBtb2R1bGVzLgorICAgIHN0cnVjdCBNb2R1bGVDb25uZWN0aW9ucyB7CisgICAgICAgIHN0ZDo6c2V0PGF1ZGlvX2lvX2hhbmRsZV90PiBzdHJlYW1zOworICAgICAgICBzdGQ6OnNldDxhdWRpb19wYXRjaF9oYW5kbGVfdD4gc3dfcGF0Y2hlczsKKyAgICB9OworICAgIHN0ZDo6bWFwPGF1ZGlvX21vZHVsZV9oYW5kbGVfdCwgTW9kdWxlQ29ubmVjdGlvbnM+IG1JbnNlcnRlZE1vZHVsZXM7CiB9OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1BsYXliYWNrVHJhY2tzLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGxheWJhY2tUcmFja3MuaAppbmRleCBhNzhiZTk5Li41M2VhOWE0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGxheWJhY2tUcmFja3MuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGxheWJhY2tUcmFja3MuaApAQCAtNDEsNyArNDEsNyBAQAogICAgIHZpcnR1YWwgICAgICAgICAgICAgflRyYWNrKCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBpbml0Q2hlY2soKSBjb25zdDsKIAotICAgIHN0YXRpYyAgdm9pZCAgICAgICAgYXBwZW5kRHVtcEhlYWRlcihTdHJpbmc4JiByZXN1bHQpOworICAgICAgICAgICAgdm9pZCAgICAgICAgYXBwZW5kRHVtcEhlYWRlcihTdHJpbmc4JiByZXN1bHQpOwogICAgICAgICAgICAgdm9pZCAgICAgICAgYXBwZW5kRHVtcChTdHJpbmc4JiByZXN1bHQsIGJvb2wgYWN0aXZlKTsKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHN0YXJ0KEF1ZGlvU3lzdGVtOjpzeW5jX2V2ZW50X3QgZXZlbnQgPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OlNZTkNfRVZFTlRfTk9ORSwKQEAgLTUxLDEyICs1MSw2IEBACiAKICAgICAgICAgICAgIHZvaWQgICAgICAgIGZsdXNoKCk7CiAgICAgICAgICAgICB2b2lkICAgICAgICBkZXN0cm95KCk7Ci0gICAgICAgICAgICBpbnQgICAgICAgICBuYW1lKCkgY29uc3QgeyByZXR1cm4gbU5hbWU7IH0KLSAgICAgICAgICAgIHZvaWQgICAgICAgIHNldE5hbWUoaW50IG5hbWUpIHsKLSAgICAgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG1OYW1lID49IDAgJiYgbmFtZSA+PSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgIiVzIGJvdGggb2xkIG5hbWUgJWQgYW5kIG5ldyBuYW1lICVkIGFyZSB2YWxpZCIsIF9fZnVuY19fLCBtTmFtZSwgbmFtZSk7Ci0gICAgICAgICAgICAgICAgbU5hbWUgPSBuYW1lOwotICAgICAgICAgICAgfQogCiAgICAgdmlydHVhbCB1aW50MzJfdCAgICBzYW1wbGVSYXRlKCkgY29uc3Q7CiAKQEAgLTY1LDEwICs1OSwxMiBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgYm9vbCAgICAgICAgaXNPZmZsb2FkZWQoKSBjb25zdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiAobUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCkgIT0gMDsgfQotICAgICAgICAgICAgYm9vbCAgICAgICAgaXNEaXJlY3QoKSBjb25zdCB7IHJldHVybiAobUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKSAhPSAwOyB9CisgICAgICAgICAgICBib29sICAgICAgICBpc0RpcmVjdCgpIGNvbnN0IG92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIChtRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpICE9IDA7IH0KICAgICAgICAgICAgIGJvb2wgICAgICAgIGlzT2ZmbG9hZGVkT3JEaXJlY3QoKSBjb25zdCB7IHJldHVybiAobUZsYWdzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiAoQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpKSAhPSAwOyB9CisgICAgICAgICAgICBib29sICAgICAgICBpc1N0YXRpYygpIGNvbnN0IHsgcmV0dXJuICBtU2hhcmVkQnVmZmVyLmdldCgpICE9IG51bGxwdHI7IH0KIAogICAgICAgICAgICAgc3RhdHVzX3QgICAgc2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXJzKTsKICAgICAgICAgICAgIHN0YXR1c190ICAgIGF0dGFjaEF1eEVmZmVjdChpbnQgRWZmZWN0SWQpOwpAQCAtODcsNiArODMsMTAgQEAKIAogICAgIHZpcnR1YWwgYm9vbCAgICAgICAgaXNGYXN0VHJhY2soKSBjb25zdCB7IHJldHVybiAobUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCkgIT0gMDsgfQogCisgICAgICAgICAgICBkb3VibGUgICAgICBidWZmZXJMYXRlbmN5TXMoKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlzU3RhdGljKCkgPyAwLiA6IFRyYWNrQmFzZTo6YnVmZmVyTGF0ZW5jeU1zKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKIC8vIGltcGxlbWVudCB2b2x1bWUgaGFuZGxpbmcuCiAgICAgbWVkaWE6OlZvbHVtZVNoYXBlcjo6U3RhdHVzIGFwcGx5Vm9sdW1lU2hhcGVyKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxtZWRpYTo6Vm9sdW1lU2hhcGVyOjpDb25maWd1cmF0aW9uPiYgY29uZmlndXJhdGlvbiwKQEAgLTE0MCw3ICsxNDAsNyBAQAogICAgIGJvb2wgaXNSZXN1bWVQZW5kaW5nKCk7CiAgICAgdm9pZCByZXN1bWVBY2soKTsKICAgICB2b2lkIHVwZGF0ZVRyYWNrRnJhbWVJbmZvKGludDY0X3QgdHJhY2tGcmFtZXNSZWxlYXNlZCwgaW50NjRfdCBzaW5rRnJhbWVzV3JpdHRlbiwKLSAgICAgICAgICAgIGNvbnN0IEV4dGVuZGVkVGltZXN0YW1wICZ0aW1lU3RhbXApOworICAgICAgICAgICAgdWludDMyX3QgaGFsU2FtcGxlUmF0ZSwgY29uc3QgRXh0ZW5kZWRUaW1lc3RhbXAgJnRpbWVTdGFtcCk7CiAKICAgICBzcDxJTWVtb3J5PiBzaGFyZWRCdWZmZXIoKSBjb25zdCB7IHJldHVybiBtU2hhcmVkQnVmZmVyOyB9CiAKQEAgLTE3MSw3ICsxNzEsNiBAQAogCiAgICAgYm9vbCAgICAgICAgICAgICAgICBtUmVzZXREb25lOwogICAgIGNvbnN0IGF1ZGlvX3N0cmVhbV90eXBlX3QgbVN0cmVhbVR5cGU7Ci0gICAgaW50ICAgICAgICAgICAgICAgICBtTmFtZTsKICAgICBlZmZlY3RfYnVmZmVyX3QgICAgICptTWFpbkJ1ZmZlcjsKIAogICAgIGludDMyX3QgICAgICAgICAgICAgKm1BdXhCdWZmZXI7CkBAIC0yMzMsNyArMjMyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpTWU5DX0VWRU5UX05PTkUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCB0cmlnZ2VyU2Vzc2lvbiA9IEFVRElPX1NFU1NJT05fTk9ORSk7CiAgICAgdmlydHVhbCB2b2lkICAgICAgICBzdG9wKCk7Ci0gICAgICAgICAgICBib29sICAgICAgICB3cml0ZSh2b2lkKiBkYXRhLCB1aW50MzJfdCBmcmFtZXMpOworICAgICAgICAgICAgc3NpemVfdCAgICAgd3JpdGUodm9pZCogZGF0YSwgdWludDMyX3QgZnJhbWVzKTsKICAgICAgICAgICAgIGJvb2wgICAgICAgIGJ1ZmZlclF1ZXVlRW1wdHkoKSBjb25zdCB7IHJldHVybiBtQnVmZmVyUXVldWUuc2l6ZSgpID09IDA7IH0KICAgICAgICAgICAgIGJvb2wgICAgICAgIGlzQWN0aXZlKCkgY29uc3QgeyByZXR1cm4gbUFjdGl2ZTsgfQogICAgIGNvbnN0IHdwPFRocmVhZEJhc2U+JiB0aHJlYWQoKSBjb25zdCB7IHJldHVybiBtVGhyZWFkOyB9CkBAIC0yNDEsNiArMjQwLDE4IEBACiAgICAgICAgICAgICB2b2lkICAgICAgICBjb3B5TWV0YWRhdGFUbyhNZXRhZGF0YUluc2VydGVyJiBiYWNrSW5zZXJ0ZXIpIGNvbnN0IG92ZXJyaWRlOwogICAgIC8qKiBTZXQgdGhlIG1ldGFkYXRhcyBvZiB0aGUgdXBzdHJlYW0gdHJhY2tzLiBUaHJlYWQgc2FmZS4gKi8KICAgICAgICAgICAgIHZvaWQgICAgICAgIHNldE1ldGFkYXRhcyhjb25zdCBTb3VyY2VNZXRhZGF0YXMmIG1ldGFkYXRhcyk7CisgICAgLyoqIHJldHVybnMgY2xpZW50IHRpbWVzdGFtcCB0byB0aGUgdXBzdHJlYW0gZHVwbGljYXRpbmcgdGhyZWFkLiAqLworICAgIEV4dGVuZGVkVGltZXN0YW1wICAgZ2V0Q2xpZW50UHJveHlUaW1lc3RhbXAoKSBjb25zdCB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VydmVyIC0ga2VybmVsIGRpZmZlcmVuY2UgaXMgbm90IHRydWUgbGF0ZW5jeSB3aGVuIGRyYWluZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpLmUuIG1TZXJ2ZXJQcm94eS0+aXNEcmFpbmVkKCkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0ZW5kZWRUaW1lc3RhbXAgdGltZXN0YW1wOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKSBtQ2xpZW50UHJveHktPmdldFRpbWVzdGFtcCgmdGltZXN0YW1wKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPbiBzdWNjZXNzLCB0aGUgdGltZXN0YW1wIExPQ0FUSU9OX1NFUlZFUiBhbmQgTE9DQVRJT05fS0VSTkVMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZW50cmllcyB3aWxsIGJlIHByb3Blcmx5IGZpbGxlZC4gSWYgZ2V0VGltZXN0YW1wKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyB1bnN1Y2Nlc3NmdWwsIHRoZW4gYSBkZWZhdWx0IGluaXRpYWxpemVkIHRpbWVzdGFtcAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICh3aXRoIG1UaW1lTnNbXSBmaWxsZWQgd2l0aCAtMSdzKSBpcyByZXR1cm5lZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGltZXN0YW1wOworICAgICAgICAgICAgICAgICAgICAgICAgfQogCiBwcml2YXRlOgogICAgIHN0YXR1c190ICAgICAgICAgICAgb2J0YWluQnVmZmVyKEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciogYnVmZmVyLApAQCAtMjU3LDYgKzI2OCw3IEBACiAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgIG1BY3RpdmU7CiAgICAgRHVwbGljYXRpbmdUaHJlYWQqIGNvbnN0ICAgIG1Tb3VyY2VUaHJlYWQ7IC8vIGZvciB3YWl0VGltZU1zKCkgaW4gd3JpdGUoKQogICAgIHNwPEF1ZGlvVHJhY2tDbGllbnRQcm94eT4gICBtQ2xpZW50UHJveHk7CisKICAgICAvKiogQXR0cmlidXRlcyBvZiB0aGUgc291cmNlIHRyYWNrcy4KICAgICAgKgogICAgICAqIFRoaXMgbWVtYmVyIG11c3QgYmUgYWNjZXNzZWQgd2l0aCBtVHJhY2tNZXRhZGF0YXNNdXRleCB0YWtlbi4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9SZWNvcmRUcmFja3MuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9SZWNvcmRUcmFja3MuaAppbmRleCBmYzJkYmJiLi5iMGM5ZmRhIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUmVjb3JkVHJhY2tzLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1JlY29yZFRyYWNrcy5oCkBAIC01MSw3ICs1MSw3IEBACiAgICAgICAgICAgICBib29sICAgICAgICBzZXRPdmVyZmxvdygpIHsgYm9vbCB0bXAgPSBtT3ZlcmZsb3c7IG1PdmVyZmxvdyA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG1wOyB9CiAKLSAgICBzdGF0aWMgIHZvaWQgICAgICAgIGFwcGVuZER1bXBIZWFkZXIoU3RyaW5nOCYgcmVzdWx0KTsKKyAgICAgICAgICAgIHZvaWQgICAgICAgIGFwcGVuZER1bXBIZWFkZXIoU3RyaW5nOCYgcmVzdWx0KTsKICAgICAgICAgICAgIHZvaWQgICAgICAgIGFwcGVuZER1bXAoU3RyaW5nOCYgcmVzdWx0LCBib29sIGFjdGl2ZSk7CiAKICAgICAgICAgICAgIHZvaWQgICAgICAgIGhhbmRsZVN5bmNTdGFydEV2ZW50KGNvbnN0IHNwPFN5bmNFdmVudD4mIGV2ZW50KTsKQEAgLTYzLDYgKzYzLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEV4dGVuZGVkVGltZXN0YW1wICZ0aW1lc3RhbXApOwogCiAgICAgdmlydHVhbCBib29sICAgICAgICBpc0Zhc3RUcmFjaygpIGNvbnN0IHsgcmV0dXJuIChtRmxhZ3MgJiBBVURJT19JTlBVVF9GTEFHX0ZBU1QpICE9IDA7IH0KKyAgICAgICAgICAgIGJvb2wgICAgICAgIGlzRGlyZWN0KCkgY29uc3Qgb3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gKG1GbGFncyAmIEFVRElPX0lOUFVUX0ZMQUdfRElSRUNUKSAhPSAwOyB9CiAKICAgICAgICAgICAgIHZvaWQgICAgICAgIHNldFNpbGVuY2VkKGJvb2wgc2lsZW5jZWQpIHsgaWYgKCFpc1BhdGNoVHJhY2soKSkgbVNpbGVuY2VkID0gc2lsZW5jZWQ7IH0KICAgICAgICAgICAgIGJvb2wgICAgICAgIGlzU2lsZW5jZWQoKSBjb25zdCB7IHJldHVybiBtU2lsZW5jZWQ7IH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9TZXJ2aWNlVXRpbGl0aWVzLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9TZXJ2aWNlVXRpbGl0aWVzLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWEyNjdlYS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvU2VydmljZVV0aWxpdGllcy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxOTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxiaW5kZXIvQXBwT3BzTWFuYWdlci5oPgotI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgotI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KLSNpbmNsdWRlIDxiaW5kZXIvUGVybWlzc2lvbkNhY2hlLmg+Ci0jaW5jbHVkZSA8cHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmg+Ci0jaW5jbHVkZSAiU2VydmljZVV0aWxpdGllcy5oIgotCi0vKiBXaGVuIHBlcmZvcm1pbmcgcGVybWlzc2lvbiBjaGVja3Mgd2UgZG8gbm90IHVzZSBwZXJtaXNzaW9uIGNhY2hlIGZvcgotICogcnVudGltZSBwZXJtaXNzaW9ucyAocHJvdGVjdGlvbiBsZXZlbCBkYW5nZXJvdXMpIGFzIHRoZXkgbWF5IGNoYW5nZSBhdAotICogcnVudGltZS4gQWxsIG90aGVyIHBlcm1pc3Npb25zIChwcm90ZWN0aW9uIGxldmVsIG5vcm1hbCBhbmQgZGFuZ2Vyb3VzKQotICogY2FuIGJlIGNhY2hlZCBhcyB0aGV5IG5ldmVyIGNoYW5nZS4gT2YgY291cnNlIGFsbCBwZXJtaXNzaW9uIGNoZWNrZWQKLSAqIGhlcmUgYXJlIHBsYXRmb3JtIGRlZmluZWQuCi0gKi8KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdGF0aWMgY29uc3QgU3RyaW5nMTYgc0FuZHJvaWRQZXJtaXNzaW9uUmVjb3JkQXVkaW8oImFuZHJvaWQucGVybWlzc2lvbi5SRUNPUkRfQVVESU8iKTsKLQotLy8gTm90IHZhbGlkIHVudGlsIGluaXRpYWxpemVkIGJ5IEF1ZGlvRmxpbmdlciBjb25zdHJ1Y3Rvci4gIEl0IHdvdWxkIGhhdmUgdG8gYmUKLS8vIHJlLWluaXRpYWxpemVkIGlmIHRoZSBwcm9jZXNzIGNvbnRhaW5pbmcgQXVkaW9GbGluZ2VyIHNlcnZpY2UgZm9ya3MgKHdoaWNoIGl0IGRvZXNuJ3QpLgotLy8gVGhpcyBpcyBvZnRlbiB1c2VkIHRvIHZhbGlkYXRlIGJpbmRlciBpbnRlcmZhY2UgY2FsbHMgd2l0aGluIGF1ZGlvc2VydmVyCi0vLyAoZS5nLiBBdWRpb1BvbGljeU1hbmFnZXIgdG8gQXVkaW9GbGluZ2VyKS4KLXBpZF90IGdldHBpZF9jYWNoZWQ7Ci0KLS8vIEEgdHJ1c3RlZCBjYWxsaW5nIFVJRCBtYXkgc3BlY2lmeSB0aGUgY2xpZW50IFVJRCBhcyBwYXJ0IG9mIGEgYmluZGVyIGludGVyZmFjZSBjYWxsLgotLy8gb3RoZXJ3aXNlIHRoZSBjYWxsaW5nIFVJRCBtdXN0IGJlIGVxdWFsIHRvIHRoZSBjbGllbnQgVUlELgotYm9vbCBpc1RydXN0ZWRDYWxsaW5nVWlkKHVpZF90IHVpZCkgewotICAgIHN3aXRjaCAodWlkKSB7Ci0gICAgY2FzZSBBSURfTUVESUE6Ci0gICAgY2FzZSBBSURfQVVESU9TRVJWRVI6Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19Ci0KLXN0YXRpYyBTdHJpbmcxNiByZXNvbHZlQ2FsbGluZ1BhY2thZ2UoUGVybWlzc2lvbkNvbnRyb2xsZXImIHBlcm1pc3Npb25Db250cm9sbGVyLAotICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwgdWlkX3QgdWlkKSB7Ci0gICAgaWYgKG9wUGFja2FnZU5hbWUuc2l6ZSgpID4gMCkgewotICAgICAgICByZXR1cm4gb3BQYWNrYWdlTmFtZTsKLSAgICB9Ci0gICAgLy8gSW4gc29tZSBjYXNlcyB0aGUgY2FsbGluZyBjb2RlIGhhcyBubyBhY2Nlc3MgdG8gdGhlIHBhY2thZ2UgaXQgcnVucyB1bmRlci4KLSAgICAvLyBGb3IgZXhhbXBsZSwgY29kZSB1c2luZyB0aGUgd2lsaGVsbSBmcmFtZXdvcmsncyBPcGVuU0wtRVMgQVBJcy4gSW4gdGhpcwotICAgIC8vIGNhc2Ugd2Ugd2lsbCBnZXQgdGhlIHBhY2thZ2VzIGZvciB0aGUgY2FsbGluZyBVSUQgYW5kIHBpY2sgdGhlIGZpcnN0IG9uZQotICAgIC8vIGZvciBhdHRyaWJ1dGluZyB0aGUgYXBwIG9wLiBUaGlzIHdpbGwgd29yayBjb3JyZWN0bHkgZm9yIHJ1bnRpbWUgcGVybWlzc2lvbnMKLSAgICAvLyBhcyBmb3IgbGVnYWN5IGFwcHMgd2Ugd2lsbCB0b2dnbGUgdGhlIGFwcCBvcCBmb3IgYWxsIHBhY2thZ2VzIGluIHRoZSBVSUQuCi0gICAgLy8gVGhlIGNhdmVhdCBpcyB0aGF0IHRoZSBvcGVyYXRpb24gbWF5IGJlIGF0dHJpYnV0ZWQgdG8gdGhlIHdyb25nIHBhY2thZ2UgYW5kCi0gICAgLy8gc3RhdHMgYmFzZWQgb24gYXBwIG9wcyBtYXkgYmUgc2xpZ2h0bHkgb2ZmLgotICAgIFZlY3RvcjxTdHJpbmcxNj4gcGFja2FnZXM7Ci0gICAgcGVybWlzc2lvbkNvbnRyb2xsZXIuZ2V0UGFja2FnZXNGb3JVaWQodWlkLCBwYWNrYWdlcyk7Ci0gICAgaWYgKHBhY2thZ2VzLmlzRW1wdHkoKSkgewotICAgICAgICBBTE9HRSgiTm8gcGFja2FnZXMgZm9yIHVpZCAlZCIsIHVpZCk7Ci0gICAgICAgIHJldHVybiBvcFBhY2thZ2VOYW1lOyAvLyBlbXB0eSBzdHJpbmcKLSAgICB9Ci0gICAgcmV0dXJuIHBhY2thZ2VzWzBdOwotfQotCi1zdGF0aWMgaW5saW5lIGJvb2wgaXNBdWRpb1NlcnZlck9yUm9vdCh1aWRfdCB1aWQpIHsKLSAgICAvLyBBSURfUk9PVCBpcyBPSyBmb3IgY29tbWFuZC1saW5lIHRlc3RzLiAgTmF0aXZlIHVuZm9ya2VkIGF1ZGlvc2VydmVyIGFsd2F5cyBPSy4KLSAgICByZXR1cm4gdWlkID09IEFJRF9ST09UIHx8IHVpZCA9PSBBSURfQVVESU9TRVJWRVIgOwotfQotCi1zdGF0aWMgYm9vbCBjaGVja1JlY29yZGluZ0ludGVybmFsKGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLCBwaWRfdCBwaWQsCi0gICAgICAgIHVpZF90IHVpZCwgYm9vbCBzdGFydCkgewotICAgIC8vIE9rYXkgdG8gbm90IHRyYWNrIGluIGFwcCBvcHMgYXMgYXVkaW8gc2VydmVyIGlzIHVzIGFuZCBpZgotICAgIC8vIGRldmljZSBpcyByb290ZWQgc2VjdXJpdHkgbW9kZWwgaXMgY29uc2lkZXJlZCBjb21wcm9taXNlZC4KLSAgICBpZiAoaXNBdWRpb1NlcnZlck9yUm9vdCh1aWQpKSByZXR1cm4gdHJ1ZTsKLQotICAgIC8vIFdlIHNwZWNpZnkgYSBwaWQgYW5kIHVpZCBoZXJlIGFzIG1lZGlhc2VydmVyIChha2EgTWVkaWFSZWNvcmRlciBvciBTdGFnZUZyaWdodFJlY29yZGVyKQotICAgIC8vIG1heSBvcGVuIGEgcmVjb3JkIHRyYWNrIG9uIGJlaGFsZiBvZiBhIGNsaWVudC4gIE5vdGUgdGhhdCBwaWQgbWF5IGJlIGEgdGlkLgotICAgIC8vIElNUE9SVEFOVDogRE9OJ1QgVVNFIFBlcm1pc3Npb25DYWNoZSAtIFJVTlRJTUUgUEVSTUlTU0lPTlMgQ0hBTkdFLgotICAgIFBlcm1pc3Npb25Db250cm9sbGVyIHBlcm1pc3Npb25Db250cm9sbGVyOwotICAgIGNvbnN0IGJvb2wgb2sgPSBwZXJtaXNzaW9uQ29udHJvbGxlci5jaGVja1Blcm1pc3Npb24oc0FuZHJvaWRQZXJtaXNzaW9uUmVjb3JkQXVkaW8sIHBpZCwgdWlkKTsKLSAgICBpZiAoIW9rKSB7Ci0gICAgICAgIEFMT0dFKCJSZXF1ZXN0IHJlcXVpcmVzICVzIiwgU3RyaW5nOChzQW5kcm9pZFBlcm1pc3Npb25SZWNvcmRBdWRpbykuY19zdHIoKSk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBTdHJpbmcxNiByZXNvbHZlZE9wUGFja2FnZU5hbWUgPSByZXNvbHZlQ2FsbGluZ1BhY2thZ2UoCi0gICAgICAgICAgICBwZXJtaXNzaW9uQ29udHJvbGxlciwgb3BQYWNrYWdlTmFtZSwgdWlkKTsKLSAgICBpZiAocmVzb2x2ZWRPcFBhY2thZ2VOYW1lLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBBcHBPcHNNYW5hZ2VyIGFwcE9wczsKLSAgICBjb25zdCBpbnQzMl90IG9wID0gYXBwT3BzLnBlcm1pc3Npb25Ub09wQ29kZShzQW5kcm9pZFBlcm1pc3Npb25SZWNvcmRBdWRpbyk7Ci0gICAgaWYgKHN0YXJ0KSB7Ci0gICAgICAgIGlmIChhcHBPcHMuc3RhcnRPcE5vVGhyb3cob3AsIHVpZCwgcmVzb2x2ZWRPcFBhY2thZ2VOYW1lLCAvKnN0YXJ0SWZNb2RlRGVmYXVsdCovIGZhbHNlKQotICAgICAgICAgICAgICAgICE9IEFwcE9wc01hbmFnZXI6Ok1PREVfQUxMT1dFRCkgewotICAgICAgICAgICAgQUxPR0UoIlJlcXVlc3QgZGVuaWVkIGJ5IGFwcCBvcDogJWQiLCBvcCk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBpZiAoYXBwT3BzLm5vdGVPcChvcCwgdWlkLCByZXNvbHZlZE9wUGFja2FnZU5hbWUpICE9IEFwcE9wc01hbmFnZXI6Ok1PREVfQUxMT1dFRCkgewotICAgICAgICAgICAgQUxPR0UoIlJlcXVlc3QgZGVuaWVkIGJ5IGFwcCBvcDogJWQiLCBvcCk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCByZWNvcmRpbmdBbGxvd2VkKGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLCBwaWRfdCBwaWQsIHVpZF90IHVpZCkgewotICAgIHJldHVybiBjaGVja1JlY29yZGluZ0ludGVybmFsKG9wUGFja2FnZU5hbWUsIHBpZCwgdWlkLCAvKnN0YXJ0Ki8gZmFsc2UpOwotfQotCi1ib29sIHN0YXJ0UmVjb3JkaW5nKGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLCBwaWRfdCBwaWQsIHVpZF90IHVpZCkgewotICAgICByZXR1cm4gY2hlY2tSZWNvcmRpbmdJbnRlcm5hbChvcFBhY2thZ2VOYW1lLCBwaWQsIHVpZCwgLypzdGFydCovIHRydWUpOwotfQotCi12b2lkIGZpbmlzaFJlY29yZGluZyhjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwgdWlkX3QgdWlkKSB7Ci0gICAgLy8gT2theSB0byBub3QgdHJhY2sgaW4gYXBwIG9wcyBhcyBhdWRpbyBzZXJ2ZXIgaXMgdXMgYW5kIGlmCi0gICAgLy8gZGV2aWNlIGlzIHJvb3RlZCBzZWN1cml0eSBtb2RlbCBpcyBjb25zaWRlcmVkIGNvbXByb21pc2VkLgotICAgIGlmIChpc0F1ZGlvU2VydmVyT3JSb290KHVpZCkpIHJldHVybjsKLQotICAgIFBlcm1pc3Npb25Db250cm9sbGVyIHBlcm1pc3Npb25Db250cm9sbGVyOwotICAgIFN0cmluZzE2IHJlc29sdmVkT3BQYWNrYWdlTmFtZSA9IHJlc29sdmVDYWxsaW5nUGFja2FnZSgKLSAgICAgICAgICAgIHBlcm1pc3Npb25Db250cm9sbGVyLCBvcFBhY2thZ2VOYW1lLCB1aWQpOwotICAgIGlmIChyZXNvbHZlZE9wUGFja2FnZU5hbWUuc2l6ZSgpID09IDApIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIEFwcE9wc01hbmFnZXIgYXBwT3BzOwotICAgIGNvbnN0IGludDMyX3Qgb3AgPSBhcHBPcHMucGVybWlzc2lvblRvT3BDb2RlKHNBbmRyb2lkUGVybWlzc2lvblJlY29yZEF1ZGlvKTsKLSAgICBhcHBPcHMuZmluaXNoT3Aob3AsIHVpZCwgcmVzb2x2ZWRPcFBhY2thZ2VOYW1lKTsKLX0KLQotYm9vbCBjYXB0dXJlQXVkaW9PdXRwdXRBbGxvd2VkKHBpZF90IHBpZCwgdWlkX3QgdWlkKSB7Ci0gICAgaWYgKGdldHBpZF9jYWNoZWQgPT0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpKSByZXR1cm4gdHJ1ZTsKLSAgICBzdGF0aWMgY29uc3QgU3RyaW5nMTYgc0NhcHR1cmVBdWRpb091dHB1dCgiYW5kcm9pZC5wZXJtaXNzaW9uLkNBUFRVUkVfQVVESU9fT1VUUFVUIik7Ci0gICAgYm9vbCBvayA9IFBlcm1pc3Npb25DYWNoZTo6Y2hlY2tQZXJtaXNzaW9uKHNDYXB0dXJlQXVkaW9PdXRwdXQsIHBpZCwgdWlkKTsKLSAgICBpZiAoIW9rKSBBTE9HRSgiUmVxdWVzdCByZXF1aXJlcyBhbmRyb2lkLnBlcm1pc3Npb24uQ0FQVFVSRV9BVURJT19PVVRQVVQiKTsKLSAgICByZXR1cm4gb2s7Ci19Ci0KLWJvb2wgY2FwdHVyZUhvdHdvcmRBbGxvd2VkKHBpZF90IHBpZCwgdWlkX3QgdWlkKSB7Ci0gICAgLy8gQ0FQVFVSRV9BVURJT19IT1RXT1JEIHBlcm1pc3Npb24gaW1wbGllcyBSRUNPUkRfQVVESU8gcGVybWlzc2lvbgotICAgIGJvb2wgb2sgPSByZWNvcmRpbmdBbGxvd2VkKFN0cmluZzE2KCIiKSwgcGlkLCB1aWQpOwotCi0gICAgaWYgKG9rKSB7Ci0gICAgICAgIHN0YXRpYyBjb25zdCBTdHJpbmcxNiBzQ2FwdHVyZUhvdHdvcmRBbGxvd2VkKCJhbmRyb2lkLnBlcm1pc3Npb24uQ0FQVFVSRV9BVURJT19IT1RXT1JEIik7Ci0gICAgICAgIC8vIElNUE9SVEFOVDogVXNlIFBlcm1pc3Npb25DYWNoZSAtIG5vdCBhIHJ1bnRpbWUgcGVybWlzc2lvbiBhbmQgbWF5IG5vdCBjaGFuZ2UuCi0gICAgICAgIG9rID0gUGVybWlzc2lvbkNhY2hlOjpjaGVja0NhbGxpbmdQZXJtaXNzaW9uKHNDYXB0dXJlSG90d29yZEFsbG93ZWQpOwotICAgIH0KLSAgICBpZiAoIW9rKSBBTE9HRSgiYW5kcm9pZC5wZXJtaXNzaW9uLkNBUFRVUkVfQVVESU9fSE9UV09SRCIpOwotICAgIHJldHVybiBvazsKLX0KLQotYm9vbCBzZXR0aW5nc0FsbG93ZWQoKSB7Ci0gICAgaWYgKGdldHBpZF9jYWNoZWQgPT0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpKSByZXR1cm4gdHJ1ZTsKLSAgICBzdGF0aWMgY29uc3QgU3RyaW5nMTYgc0F1ZGlvU2V0dGluZ3MoImFuZHJvaWQucGVybWlzc2lvbi5NT0RJRllfQVVESU9fU0VUVElOR1MiKTsKLSAgICAvLyBJTVBPUlRBTlQ6IFVzZSBQZXJtaXNzaW9uQ2FjaGUgLSBub3QgYSBydW50aW1lIHBlcm1pc3Npb24gYW5kIG1heSBub3QgY2hhbmdlLgotICAgIGJvb2wgb2sgPSBQZXJtaXNzaW9uQ2FjaGU6OmNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oc0F1ZGlvU2V0dGluZ3MpOwotICAgIGlmICghb2spIEFMT0dFKCJSZXF1ZXN0IHJlcXVpcmVzIGFuZHJvaWQucGVybWlzc2lvbi5NT0RJRllfQVVESU9fU0VUVElOR1MiKTsKLSAgICByZXR1cm4gb2s7Ci19Ci0KLWJvb2wgbW9kaWZ5QXVkaW9Sb3V0aW5nQWxsb3dlZCgpIHsKLSAgICBzdGF0aWMgY29uc3QgU3RyaW5nMTYgc01vZGlmeUF1ZGlvUm91dGluZ0FsbG93ZWQoImFuZHJvaWQucGVybWlzc2lvbi5NT0RJRllfQVVESU9fUk9VVElORyIpOwotICAgIC8vIElNUE9SVEFOVDogVXNlIFBlcm1pc3Npb25DYWNoZSAtIG5vdCBhIHJ1bnRpbWUgcGVybWlzc2lvbiBhbmQgbWF5IG5vdCBjaGFuZ2UuCi0gICAgYm9vbCBvayA9IFBlcm1pc3Npb25DYWNoZTo6Y2hlY2tDYWxsaW5nUGVybWlzc2lvbihzTW9kaWZ5QXVkaW9Sb3V0aW5nQWxsb3dlZCk7Ci0gICAgaWYgKCFvaykgQUxPR0UoImFuZHJvaWQucGVybWlzc2lvbi5NT0RJRllfQVVESU9fUk9VVElORyIpOwotICAgIHJldHVybiBvazsKLX0KLQotYm9vbCBkdW1wQWxsb3dlZCgpIHsKLSAgICAvLyBkb24ndCBvcHRpbWl6ZSBmb3Igc2FtZSBwaWQsIHNpbmNlIG1lZGlhc2VydmVyIG5ldmVyIGR1bXBzIGl0c2VsZgotICAgIHN0YXRpYyBjb25zdCBTdHJpbmcxNiBzRHVtcCgiYW5kcm9pZC5wZXJtaXNzaW9uLkRVTVAiKTsKLSAgICAvLyBJTVBPUlRBTlQ6IFVzZSBQZXJtaXNzaW9uQ2FjaGUgLSBub3QgYSBydW50aW1lIHBlcm1pc3Npb24gYW5kIG1heSBub3QgY2hhbmdlLgotICAgIGJvb2wgb2sgPSBQZXJtaXNzaW9uQ2FjaGU6OmNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oc0R1bXApOwotICAgIC8vIGNvbnZlbnRpb24gaXMgZm9yIGNhbGxlciB0byBkdW1wIGFuIGVycm9yIG1lc3NhZ2UgdG8gZmQgaW5zdGVhZCBvZiBsb2dnaW5nIGhlcmUKLSAgICAvL2lmICghb2spIEFMT0dFKCJSZXF1ZXN0IHJlcXVpcmVzIGFuZHJvaWQucGVybWlzc2lvbi5EVU1QIik7Ci0gICAgcmV0dXJuIG9rOwotfQotCi1ib29sIG1vZGlmeVBob25lU3RhdGVBbGxvd2VkKHBpZF90IHBpZCwgdWlkX3QgdWlkKSB7Ci0gICAgc3RhdGljIGNvbnN0IFN0cmluZzE2IHNNb2RpZnlQaG9uZVN0YXRlKCJhbmRyb2lkLnBlcm1pc3Npb24uTU9ESUZZX1BIT05FX1NUQVRFIik7Ci0gICAgYm9vbCBvayA9IFBlcm1pc3Npb25DYWNoZTo6Y2hlY2tQZXJtaXNzaW9uKHNNb2RpZnlQaG9uZVN0YXRlLCBwaWQsIHVpZCk7Ci0gICAgaWYgKCFvaykgQUxPR0UoIlJlcXVlc3QgcmVxdWlyZXMgYW5kcm9pZC5wZXJtaXNzaW9uLk1PRElGWV9QSE9ORV9TVEFURSIpOwotICAgIHJldHVybiBvazsKLX0KLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1NlcnZpY2VVdGlsaXRpZXMuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9TZXJ2aWNlVXRpbGl0aWVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0NWFkYTEuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1NlcnZpY2VVdGlsaXRpZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLSNpbmNsdWRlIDxiaW5kZXIvUGVybWlzc2lvbkNvbnRyb2xsZXIuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1leHRlcm4gcGlkX3QgZ2V0cGlkX2NhY2hlZDsKLWJvb2wgaXNUcnVzdGVkQ2FsbGluZ1VpZCh1aWRfdCB1aWQpOwotYm9vbCByZWNvcmRpbmdBbGxvd2VkKGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLCBwaWRfdCBwaWQsIHVpZF90IHVpZCk7Ci1ib29sIHN0YXJ0UmVjb3JkaW5nKGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLCBwaWRfdCBwaWQsIHVpZF90IHVpZCk7Ci12b2lkIGZpbmlzaFJlY29yZGluZyhjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwgdWlkX3QgdWlkKTsKLWJvb2wgY2FwdHVyZUF1ZGlvT3V0cHV0QWxsb3dlZChwaWRfdCBwaWQsIHVpZF90IHVpZCk7Ci1ib29sIGNhcHR1cmVIb3R3b3JkQWxsb3dlZChwaWRfdCBwaWQsIHVpZF90IHVpZCk7Ci1ib29sIHNldHRpbmdzQWxsb3dlZCgpOwotYm9vbCBtb2RpZnlBdWRpb1JvdXRpbmdBbGxvd2VkKCk7Ci1ib29sIGR1bXBBbGxvd2VkKCk7Ci1ib29sIG1vZGlmeVBob25lU3RhdGVBbGxvd2VkKHBpZF90IHBpZCwgdWlkX3QgdWlkKTsKLX0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UaHJlYWRzLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UaHJlYWRzLmNwcAppbmRleCBjMjMyMGJjLi5mODMzY2Y3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVGhyZWFkcy5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RocmVhZHMuY3BwCkBAIC0yMyw2ICsyMyw4IEBACiAjaW5jbHVkZSAiQ29uZmlndXJhdGlvbi5oIgogI2luY2x1ZGUgPG1hdGguaD4KICNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8bGludXgvZnV0ZXguaD4KICNpbmNsdWRlIDxzeXMvc3RhdC5oPgogI2luY2x1ZGUgPHN5cy9zeXNjYWxsLmg+CkBAIC02Miw4ICs2NCw4IEBACiAjaW5jbHVkZSAiQXVkaW9GbGluZ2VyLmgiCiAjaW5jbHVkZSAiRmFzdE1peGVyLmgiCiAjaW5jbHVkZSAiRmFzdENhcHR1cmUuaCIKLSNpbmNsdWRlICJTZXJ2aWNlVXRpbGl0aWVzLmgiCi0jaW5jbHVkZSAibWVkaWF1dGlscy9TY2hlZHVsaW5nUG9saWN5U2VydmljZS5oIgorI2luY2x1ZGUgPG1lZGlhdXRpbHMvU2NoZWR1bGluZ1BvbGljeVNlcnZpY2UuaD4KKyNpbmNsdWRlIDxtZWRpYXV0aWxzL1NlcnZpY2VVdGlsaXRpZXMuaD4KIAogI2lmZGVmIEFERF9CQVRURVJZX0RBVEEKICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFQbGF5ZXJTZXJ2aWNlLmg+CkBAIC03MSw3ICs3Myw3IEBACiAjZW5kaWYKIAogI2lmZGVmIERFQlVHX0NQVV9VU0FHRQotI2luY2x1ZGUgPGNwdXN0YXRzL0NlbnRyYWxUZW5kZW5jeVN0YXRpc3RpY3MuaD4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9TdGF0aXN0aWNzLmg+CiAjaW5jbHVkZSA8Y3B1c3RhdHMvVGhyZWFkQ3B1VXNhZ2UuaD4KICNlbmRpZgogCkBAIC0yMDAsNyArMjAyLDcgQEAKIC8vIEluaXRpYWxseSB0aGlzIGhlYXAgaXMgdXNlZCB0byBhbGxvY2F0ZSBjbGllbnQgYnVmZmVycyBmb3IgImZhc3QiIEF1ZGlvUmVjb3JkLgogLy8gRXZlbnR1YWxseSBpdCB3aWxsIGJlIHRoZSBzaW5nbGUgYnVmZmVyIHRoYXQgRmFzdENhcHR1cmUgd3JpdGVzIGludG8gdmlhIEhBTCByZWFkKCksCiAvLyBhbmQgdGhhdCBhbGwgImZhc3QiIEF1ZGlvUmVjb3JkIGNsaWVudHMgcmVhZCBmcm9tLiAgSW4gZWl0aGVyIGNhc2UsIHRoZSBzaXplIGNhbiBiZSBzbWFsbC4KLXN0YXRpYyBjb25zdCBzaXplX3Qga1JlY29yZFRocmVhZFJlYWRPbmx5SGVhcFNpemUgPSAweDQwMDA7CitzdGF0aWMgY29uc3Qgc2l6ZV90IGtSZWNvcmRUaHJlYWRSZWFkT25seUhlYXBTaXplID0gMHhEMDAwOwogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKQEAgLTMzMyw5ICszMzUsOSBAQAogI2lmZGVmIERFQlVHX0NQVV9VU0FHRQogcHJpdmF0ZToKICAgICBUaHJlYWRDcHVVc2FnZSBtQ3B1VXNhZ2U7ICAgICAgICAgICAvLyBpbnN0YW50YW5lb3VzIHRocmVhZCBDUFUgdXNhZ2UgaW4gd2FsbCBjbG9jayBucwotICAgIENlbnRyYWxUZW5kZW5jeVN0YXRpc3RpY3MgbVdjU3RhdHM7IC8vIHN0YXRpc3RpY3Mgb24gdGhyZWFkIENQVSB1c2FnZSBpbiB3YWxsIGNsb2NrIG5zCisgICAgYXVkaW9fdXRpbHM6OlN0YXRpc3RpY3M8ZG91YmxlPiBtV2NTdGF0czsgLy8gc3RhdGlzdGljcyBvbiB0aHJlYWQgQ1BVIHVzYWdlIGluIHdhbGwgY2xvY2sgbnMKIAotICAgIENlbnRyYWxUZW5kZW5jeVN0YXRpc3RpY3MgbUh6U3RhdHM7IC8vIHN0YXRpc3RpY3Mgb24gdGhyZWFkIENQVSB1c2FnZSBpbiBjeWNsZXMKKyAgICBhdWRpb191dGlsczo6U3RhdGlzdGljczxkb3VibGU+IG1IelN0YXRzOyAvLyBzdGF0aXN0aWNzIG9uIHRocmVhZCBDUFUgdXNhZ2UgaW4gY3ljbGVzCiAKICAgICBpbnQgbUNwdU51bTsgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aHJlYWQncyBjdXJyZW50IENQVSBudW1iZXIKICAgICBpbnQgbUNwdWtIejsgICAgICAgICAgICAgICAgICAgICAgICAvLyBmcmVxdWVuY3kgb2YgdGhyZWFkJ3MgY3VycmVudCBDUFUgaW4ga0h6CkBAIC0zNjEsNyArMzYzLDcgQEAKIAogICAgIC8vIHJlY29yZCBzYW1wbGUgZm9yIHdhbGwgY2xvY2sgc3RhdGlzdGljcwogICAgIGlmICh2YWxpZCkgewotICAgICAgICBtV2NTdGF0cy5zYW1wbGUod2NOcyk7CisgICAgICAgIG1XY1N0YXRzLmFkZCh3Y05zKTsKICAgICB9CiAKICAgICAvLyBnZXQgdGhlIGN1cnJlbnQgQ1BVIG51bWJlcgpAQCAtMzgwLDI2ICszODIsMjYgQEAKIAogICAgIC8vIGlmIG5vIGNoYW5nZSBpbiBDUFUgbnVtYmVyIG9yIGZyZXF1ZW5jeSwgdGhlbiByZWNvcmQgc2FtcGxlIGZvciBjeWNsZSBzdGF0aXN0aWNzCiAgICAgaWYgKHZhbGlkICYmIG1DcHVrSHogPiAwKSB7Ci0gICAgICAgIGRvdWJsZSBjeWNsZXMgPSB3Y05zICogY3B1a0h6ICogMC4wMDAwMDE7Ci0gICAgICAgIG1IelN0YXRzLnNhbXBsZShjeWNsZXMpOworICAgICAgICBjb25zdCBkb3VibGUgY3ljbGVzID0gd2NOcyAqIGNwdWtIeiAqIDAuMDAwMDAxOworICAgICAgICBtSHpTdGF0cy5hZGQoY3ljbGVzKTsKICAgICB9CiAKLSAgICB1bnNpZ25lZCBuID0gbVdjU3RhdHMubigpOworICAgIGNvbnN0IHVuc2lnbmVkIG4gPSBtV2NTdGF0cy5nZXROKCk7CiAgICAgLy8gbUNwdVVzYWdlLmVsYXBzZWQoKSBpcyBleHBlbnNpdmUsIHNvIGRvbid0IGNhbGwgaXQgZXZlcnkgbG9vcAogICAgIGlmICgobiAmIDEyNykgPT0gMSkgewotICAgICAgICBsb25nIGxvbmcgZWxhcHNlZCA9IG1DcHVVc2FnZS5lbGFwc2VkKCk7CisgICAgICAgIGNvbnN0IGxvbmcgbG9uZyBlbGFwc2VkID0gbUNwdVVzYWdlLmVsYXBzZWQoKTsKICAgICAgICAgaWYgKGVsYXBzZWQgPj0gREVCVUdfQ1BVX1VTQUdFICogMTAwMDAwMDAwMExMKSB7Ci0gICAgICAgICAgICBkb3VibGUgcGVyTG9vcCA9IGVsYXBzZWQgLyAoZG91YmxlKSBuOwotICAgICAgICAgICAgZG91YmxlIHBlckxvb3AxMDAgPSBwZXJMb29wICogMC4wMTsKLSAgICAgICAgICAgIGRvdWJsZSBwZXJMb29wMWsgPSBwZXJMb29wICogMC4wMDE7Ci0gICAgICAgICAgICBkb3VibGUgbWVhbiA9IG1XY1N0YXRzLm1lYW4oKTsKLSAgICAgICAgICAgIGRvdWJsZSBzdGRkZXYgPSBtV2NTdGF0cy5zdGRkZXYoKTsKLSAgICAgICAgICAgIGRvdWJsZSBtaW5pbXVtID0gbVdjU3RhdHMubWluaW11bSgpOwotICAgICAgICAgICAgZG91YmxlIG1heGltdW0gPSBtV2NTdGF0cy5tYXhpbXVtKCk7Ci0gICAgICAgICAgICBkb3VibGUgbWVhbkN5Y2xlcyA9IG1IelN0YXRzLm1lYW4oKTsKLSAgICAgICAgICAgIGRvdWJsZSBzdGRkZXZDeWNsZXMgPSBtSHpTdGF0cy5zdGRkZXYoKTsKLSAgICAgICAgICAgIGRvdWJsZSBtaW5DeWNsZXMgPSBtSHpTdGF0cy5taW5pbXVtKCk7Ci0gICAgICAgICAgICBkb3VibGUgbWF4Q3ljbGVzID0gbUh6U3RhdHMubWF4aW11bSgpOworICAgICAgICAgICAgY29uc3QgZG91YmxlIHBlckxvb3AgPSBlbGFwc2VkIC8gKGRvdWJsZSkgbjsKKyAgICAgICAgICAgIGNvbnN0IGRvdWJsZSBwZXJMb29wMTAwID0gcGVyTG9vcCAqIDAuMDE7CisgICAgICAgICAgICBjb25zdCBkb3VibGUgcGVyTG9vcDFrID0gcGVyTG9vcCAqIDAuMDAxOworICAgICAgICAgICAgY29uc3QgZG91YmxlIG1lYW4gPSBtV2NTdGF0cy5nZXRNZWFuKCk7CisgICAgICAgICAgICBjb25zdCBkb3VibGUgc3RkZGV2ID0gbVdjU3RhdHMuZ2V0U3RkRGV2KCk7CisgICAgICAgICAgICBjb25zdCBkb3VibGUgbWluaW11bSA9IG1XY1N0YXRzLmdldE1pbigpOworICAgICAgICAgICAgY29uc3QgZG91YmxlIG1heGltdW0gPSBtV2NTdGF0cy5nZXRNYXgoKTsKKyAgICAgICAgICAgIGNvbnN0IGRvdWJsZSBtZWFuQ3ljbGVzID0gbUh6U3RhdHMuZ2V0TWVhbigpOworICAgICAgICAgICAgY29uc3QgZG91YmxlIHN0ZGRldkN5Y2xlcyA9IG1IelN0YXRzLmdldFN0ZERldigpOworICAgICAgICAgICAgY29uc3QgZG91YmxlIG1pbkN5Y2xlcyA9IG1IelN0YXRzLmdldE1pbigpOworICAgICAgICAgICAgY29uc3QgZG91YmxlIG1heEN5Y2xlcyA9IG1IelN0YXRzLmdldE1heCgpOwogICAgICAgICAgICAgbUNwdVVzYWdlLnJlc2V0RWxhcHNlZCgpOwogICAgICAgICAgICAgbVdjU3RhdHMucmVzZXQoKTsKICAgICAgICAgICAgIG1IelN0YXRzLnJlc2V0KCk7CkBAIC03NjksNiArNzcxLDggQEAKICAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfVE9QX0JBQ0tfTEVGVCkgcy5hcHBlbmQoInRvcC1iYWNrLWxlZnQsICIpOwogICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9UT1BfQkFDS19DRU5URVIpIHMuYXBwZW5kKCJ0b3AtYmFjay1jZW50ZXIsICIgKTsKICAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfVE9QX0JBQ0tfUklHSFQpIHMuYXBwZW5kKCJ0b3AtYmFjay1yaWdodCwgIiApOworICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9UT1BfU0lERV9MRUZUKSBzLmFwcGVuZCgidG9wLXNpZGUtbGVmdCwgIiApOworICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9UT1BfU0lERV9SSUdIVCkgcy5hcHBlbmQoInRvcC1zaWRlLXJpZ2h0LCAiICk7CiAgICAgICAgICAgICBpZiAobWFzayAmIH5BVURJT19DSEFOTkVMX09VVF9BTEwpIHMuYXBwZW5kKCJ1bmtub3duLCAgIik7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfSU5fTEVGVCkgcy5hcHBlbmQoImxlZnQsICIpOwpAQCAtNzgzLDYgKzc4NywxMiBAQAogICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX0lOX1hfQVhJUykgcy5hcHBlbmQoIlgsICIpOwogICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX0lOX1lfQVhJUykgcy5hcHBlbmQoIlksICIpOwogICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX0lOX1pfQVhJUykgcy5hcHBlbmQoIlosICIpOworICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX0lOX0JBQ0tfTEVGVCkgcy5hcHBlbmQoImJhY2stbGVmdCwgIik7CisgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfSU5fQkFDS19SSUdIVCkgcy5hcHBlbmQoImJhY2stcmlnaHQsICIpOworICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX0lOX0NFTlRFUikgcy5hcHBlbmQoImNlbnRlciwgIik7CisgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfSU5fTE9XX0ZSRVFVRU5DWSkgcy5hcHBlbmQoImxvdyBmcmVxLCAiKTsKKyAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9JTl9UT1BfTEVGVCkgcy5hcHBlbmQoInRvcC1sZWZ0LCAiICk7CisgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfSU5fVE9QX1JJR0hUKSBzLmFwcGVuZCgidG9wLXJpZ2h0LCAiICk7CiAgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfSU5fVk9JQ0VfVVBMSU5LKSBzLmFwcGVuZCgidm9pY2UtdXBsaW5rLCAiKTsKICAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9JTl9WT0lDRV9ETkxJTkspIHMuYXBwZW5kKCJ2b2ljZS1kbmxpbmssICIpOwogICAgICAgICAgICAgaWYgKG1hc2sgJiB+QVVESU9fQ0hBTk5FTF9JTl9BTEwpIHMuYXBwZW5kKCJ1bmtub3duLCAgIik7CkBAIC04NDUsNiArODU1LDE2IEBACiAgICAgZHByaW50ZihmZCwgIiAgSW5wdXQgZGV2aWNlOiAlI3ggKCVzKVxuIiwgbUluRGV2aWNlLCBkZXZpY2VzVG9TdHJpbmcobUluRGV2aWNlKS5jX3N0cigpKTsKICAgICBkcHJpbnRmKGZkLCAiICBBdWRpbyBzb3VyY2U6ICVkICglcylcbiIsIG1BdWRpb1NvdXJjZSwgc291cmNlVG9TdHJpbmcobUF1ZGlvU291cmNlKSk7CiAKKyAgICAvLyBEdW1wIHRpbWVzdGFtcCBzdGF0aXN0aWNzIGZvciB0aGUgVGhyZWFkIHR5cGVzIHRoYXQgc3VwcG9ydCBpdC4KKyAgICBpZiAobVR5cGUgPT0gUkVDT1JECisgICAgICAgICAgICB8fCBtVHlwZSA9PSBNSVhFUgorICAgICAgICAgICAgfHwgbVR5cGUgPT0gRFVQTElDQVRJTkcKKyAgICAgICAgICAgIHx8IG1UeXBlID09IERJUkVDVAorICAgICAgICAgICAgfHwgbVR5cGUgPT0gT0ZGTE9BRCkgeworICAgICAgICBkcHJpbnRmKGZkLCAiICBUaW1lc3RhbXAgc3RhdHM6ICVzXG4iLCBtVGltZXN0YW1wVmVyaWZpZXIudG9TdHJpbmcoKS5jX3N0cigpKTsKKyAgICAgICAgZHByaW50ZihmZCwgIiAgVGltZXN0YW1wIGNvcnJlY3RlZDogJXNcbiIsIGlzVGltZXN0YW1wQ29ycmVjdGlvbkVuYWJsZWQoKSA/ICJ5ZXMiIDogIm5vIik7CisgICAgfQorCiAgICAgaWYgKGxvY2tlZCkgewogICAgICAgICBtTG9jay51bmxvY2soKTsKICAgICB9CkBAIC0xNTE5LDcgKzE1MzksNyBAQAogICAgIH0KIH0KIAotdm9pZCBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OmdldEF1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZykKK3ZvaWQgQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjp0b0F1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZykKIHsKICAgICBjb25maWctPnR5cGUgPSBBVURJT19QT1JUX1RZUEVfTUlYOwogICAgIGNvbmZpZy0+ZXh0Lm1peC5oYW5kbGUgPSBtSWQ7CkBAIC0xNTcxLDYgKzE1OTEsOSBAQAogICAgIC0tbUJhdHRlcnlDb3VudGVyW3RyYWNrLT51aWQoKV0uc2Vjb25kOwogICAgIC8vIG1MYXRlc3RBY3RpdmVUcmFjayBpcyBub3QgY2xlYXJlZCBldmVuIGlmIGlzIHRoZSBzYW1lIGFzIHRyYWNrLgogICAgIG1IYXNDaGFuZ2VkID0gdHJ1ZTsKKyNpZmRlZiBURUVfU0lOSworICAgIHRyYWNrLT5kdW1wVGVlKC0xIC8qIGZkICovLCAiX1JFTU9WRSIpOworI2VuZGlmCiAgICAgcmV0dXJuIGluZGV4OwogfQogCkBAIC0xNzA5LDEwICsxNzMyLDIxIEBACiAgICAgICAgIGlmIChtT3V0cHV0LT5hdWRpb0h3RGV2LT5jYW5TZXRNYXN0ZXJNdXRlKCkpIHsKICAgICAgICAgICAgIG1NYXN0ZXJNdXRlID0gZmFsc2U7CiAgICAgICAgIH0KKyAgICAgICAgbUlzTXNkRGV2aWNlID0gc3RyY21wKAorICAgICAgICAgICAgICAgIG1PdXRwdXQtPmF1ZGlvSHdEZXYtPm1vZHVsZU5hbWUoKSwgQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX01TRCkgPT0gMDsKICAgICB9CiAKICAgICByZWFkT3V0cHV0UGFyYW1ldGVyc19sKCk7CiAKKyAgICAvLyBUT0RPOiBXZSBtYXkgYWxzbyBtYXRjaCBvbiBhZGRyZXNzIGFzIHdlbGwgYXMgZGV2aWNlIHR5cGUgZm9yCisgICAgLy8gQVVESU9fREVWSUNFX09VVF9CVVMsIEFVRElPX0RFVklDRV9PVVRfQUxMX0EyRFAsIEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWAorICAgIGlmICh0eXBlID09IE1JWEVSIHx8IHR5cGUgPT0gRElSRUNUKSB7CisgICAgICAgIG1UaW1lc3RhbXBDb3JyZWN0ZWREZXZpY2VzID0gKGF1ZGlvX2RldmljZXNfdClwcm9wZXJ0eV9nZXRfaW50NjQoCisgICAgICAgICAgICAgICAgImF1ZGlvLnRpbWVzdGFtcC5jb3JyZWN0ZWRfb3V0cHV0X2RldmljZXMiLAorICAgICAgICAgICAgICAgIChpbnQ2NF90KShtSXNNc2REZXZpY2UgPyBBVURJT19ERVZJQ0VfT1VUX0JVUyAvLyB0dXJuIG9uIGJ5IGRlZmF1bHQgZm9yIE1TRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBBVURJT19ERVZJQ0VfTk9ORSkpOworICAgIH0KKwogICAgIC8vICsrIG9wZXJhdG9yIGRvZXMgbm90IGNvbXBpbGUKICAgICBmb3IgKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0gQVVESU9fU1RSRUFNX01JTjsgc3RyZWFtIDwgQVVESU9fU1RSRUFNX0ZPUl9QT0xJQ1lfQ05UOwogICAgICAgICAgICAgc3RyZWFtID0gKGF1ZGlvX3N0cmVhbV90eXBlX3QpIChzdHJlYW0gKyAxKSkgewpAQCAtMTc3Myw3ICsxODA3LDcgQEAKICAgICBpZiAobnVtdHJhY2tzKSB7CiAgICAgICAgIGRwcmludGYoZmQsICIgb2Ygd2hpY2ggJXp1IGFyZSBhY3RpdmVcbiIsIG51bWFjdGl2ZSk7CiAgICAgICAgIHJlc3VsdC5hcHBlbmQocHJlZml4KTsKLSAgICAgICAgVHJhY2s6OmFwcGVuZER1bXBIZWFkZXIocmVzdWx0KTsKKyAgICAgICAgbVRyYWNrc1swXS0+YXBwZW5kRHVtcEhlYWRlcihyZXN1bHQpOwogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bXRyYWNrczsgKytpKSB7CiAgICAgICAgICAgICBzcDxUcmFjaz4gdHJhY2sgPSBtVHJhY2tzW2ldOwogICAgICAgICAgICAgaWYgKHRyYWNrICE9IDApIHsKQEAgLTE3OTMsNyArMTgyNyw3IEBACiAgICAgICAgIHJlc3VsdC5hcHBlbmQoIiAgVGhlIGZvbGxvd2luZyB0cmFja3MgYXJlIGluIHRoZSBhY3RpdmUgbGlzdCBidXQiCiAgICAgICAgICAgICAgICAgIiBub3QgaW4gdGhlIHRyYWNrIGxpc3RcbiIpOwogICAgICAgICByZXN1bHQuYXBwZW5kKHByZWZpeCk7Ci0gICAgICAgIFRyYWNrOjphcHBlbmREdW1wSGVhZGVyKHJlc3VsdCk7CisgICAgICAgIG1BY3RpdmVUcmFja3NbMF0tPmFwcGVuZER1bXBIZWFkZXIocmVzdWx0KTsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1hY3RpdmU7ICsraSkgewogICAgICAgICAgICAgc3A8VHJhY2s+IHRyYWNrID0gbUFjdGl2ZVRyYWNrc1tpXTsKICAgICAgICAgICAgIGlmIChtVHJhY2tzLmluZGV4T2YodHJhY2spIDwgMCkgewpAQCAtMTgxMCw2ICsxODQ0LDcgQEAKIHsKICAgICBkdW1wQmFzZShmZCwgYXJncyk7CiAKKyAgICBkcHJpbnRmKGZkLCAiICBNYXN0ZXIgbXV0ZTogJXNcbiIsIG1NYXN0ZXJNdXRlID8gIm9uIiA6ICJvZmYiKTsKICAgICBkcHJpbnRmKGZkLCAiICBOb3JtYWwgZnJhbWUgY291bnQ6ICV6dVxuIiwgbU5vcm1hbEZyYW1lQ291bnQpOwogICAgIGRwcmludGYoZmQsICIgIExhc3Qgd3JpdGUgb2NjdXJyZWQgKG1zZWNzKTogJWxsdVxuIiwKICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIG5zMm1zKHN5c3RlbVRpbWUoKSAtIG1MYXN0V3JpdGVUaW1lKSk7CkBAIC0xODgwLDExICsxOTE1LDE3IEBACiAgICAgc3RhdHVzX3QgbFN0YXR1czsKICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBvdXRwdXRGbGFncyA9IG1PdXRwdXQtPmZsYWdzOwogICAgIGF1ZGlvX291dHB1dF9mbGFnc190IHJlcXVlc3RlZEZsYWdzID0gKmZsYWdzOworICAgIHVpbnQzMl90IHNhbXBsZVJhdGU7CisKKyAgICBpZiAoc2hhcmVkQnVmZmVyICE9IDAgJiYgY2hlY2tJTWVtb3J5KHNoYXJlZEJ1ZmZlcikgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgbFN0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICAgICAgZ290byBFeGl0OworICAgIH0KIAogICAgIGlmICgqcFNhbXBsZVJhdGUgPT0gMCkgewogICAgICAgICAqcFNhbXBsZVJhdGUgPSBtU2FtcGxlUmF0ZTsKICAgICB9Ci0gICAgdWludDMyX3Qgc2FtcGxlUmF0ZSA9ICpwU2FtcGxlUmF0ZTsKKyAgICBzYW1wbGVSYXRlID0gKnBTYW1wbGVSYXRlOwogCiAgICAgLy8gc3BlY2lhbCBjYXNlIGZvciBGQVNUIGZsYWcgY29uc2lkZXJlZCBPSyBpZiBmYXN0IG1peGVyIGlzIHByZXNlbnQKICAgICBpZiAoaGFzRmFzdE1peGVyKCkpIHsKQEAgLTIxNzQsNDggKzIyMTUsMTcgQEAKIH0KIAogdGVtcGxhdGU8dHlwZW5hbWUgVD4KLXNzaXplX3QgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2tzPFQ+OjphZGQoY29uc3Qgc3A8VD4gJnRyYWNrKQotewotICAgIGNvbnN0IHNzaXplX3QgaW5kZXggPSBtVHJhY2tzLmFkZCh0cmFjayk7Ci0gICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgLy8gc2V0IG5hbWUgZm9yIHRyYWNrIHdoZW4gYWRkaW5nLgotICAgICAgICBpbnQgbmFtZTsKLSAgICAgICAgaWYgKG1VbnVzZWRUcmFja05hbWVzLmVtcHR5KCkpIHsKLSAgICAgICAgICAgIG5hbWUgPSBtVHJhY2tzLnNpemUoKSAtIDE7IC8vIG5ldyBuYW1lIHswIC4uLiBzaXplLTF9LgotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gcmV1c2Ugc21hbGxlc3QgbmFtZSBmb3IgZGVsZXRlZCB0cmFjay4KLSAgICAgICAgICAgIGF1dG8gaXQgPSBtVW51c2VkVHJhY2tOYW1lcy5iZWdpbigpOwotICAgICAgICAgICAgbmFtZSA9ICppdDsKLSAgICAgICAgICAgICh2b2lkKW1VbnVzZWRUcmFja05hbWVzLmVyYXNlKGl0KTsKLSAgICAgICAgfQotICAgICAgICB0cmFjay0+c2V0TmFtZShuYW1lKTsKLSAgICB9IGVsc2UgewotICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJjYW5ub3QgYWRkIHRyYWNrIik7Ci0gICAgfQotICAgIHJldHVybiBpbmRleDsKLX0KLQotdGVtcGxhdGU8dHlwZW5hbWUgVD4KIHNzaXplX3QgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2tzPFQ+OjpyZW1vdmUoY29uc3Qgc3A8VD4gJnRyYWNrKQogewotICAgIGNvbnN0IGludCBuYW1lID0gdHJhY2stPm5hbWUoKTsKKyAgICBjb25zdCBpbnQgdHJhY2tJZCA9IHRyYWNrLT5pZCgpOwogICAgIGNvbnN0IHNzaXplX3QgaW5kZXggPSBtVHJhY2tzLnJlbW92ZSh0cmFjayk7CiAgICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgLy8gaW52YWxpZGF0ZSBuYW1lIHdoZW4gcmVtb3ZpbmcgZnJvbSBtVHJhY2tzLgotICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG5hbWUgPCAwLCAiaW52YWxpZCBuYW1lICVkIGZvciB0cmFjayBvbiBtVHJhY2tzIiwgbmFtZSk7Ci0KLSAgICAgICAgaWYgKG1TYXZlRGVsZXRlZFRyYWNrTmFtZXMpIHsKKyAgICAgICAgaWYgKG1TYXZlRGVsZXRlZFRyYWNrSWRzKSB7CiAgICAgICAgICAgICAvLyBXZSBjYW4ndCBkaXJlY3RseSBhY2Nlc3MgbUF1ZGlvTWl4ZXIgc2luY2UgdGhlIGNhbGxlciBtYXkgYmUgb3V0c2lkZSBvZiB0aHJlYWRMb29wLgotICAgICAgICAgICAgLy8gSW5zdGVhZCwgd2UgYWRkIHRvIG1EZWxldGVkVHJhY2tOYW1lcyB3aGljaCBpcyBzb2xlbHkgdXNlZCBmb3IgbUF1ZGlvTWl4ZXIgdXBkYXRlLAorICAgICAgICAgICAgLy8gSW5zdGVhZCwgd2UgYWRkIHRvIG1EZWxldGVkVHJhY2tJZHMgd2hpY2ggaXMgc29sZWx5IHVzZWQgZm9yIG1BdWRpb01peGVyIHVwZGF0ZSwKICAgICAgICAgICAgIC8vIHRvIGJlIGhhbmRsZWQgd2hlbiBNaXhlclRocmVhZDo6cHJlcGFyZVRyYWNrc19sKCkgbmV4dCBjaGFuZ2VzIG1BdWRpb01peGVyLgotICAgICAgICAgICAgbURlbGV0ZWRUcmFja05hbWVzLmVtcGxhY2UobmFtZSk7CisgICAgICAgICAgICBtRGVsZXRlZFRyYWNrSWRzLmVtcGxhY2UodHJhY2tJZCk7CiAgICAgICAgIH0KLQotICAgICAgICBtVW51c2VkVHJhY2tOYW1lcy5lbXBsYWNlKG5hbWUpOwotICAgICAgICB0cmFjay0+c2V0TmFtZShUOjpUUkFDS19OQU1FX1BFTkRJTkcpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYobmFtZSA+PSAwLAotICAgICAgICAgICAgICAgICJ2YWxpZCBuYW1lICVkIGZvciB0cmFjayBub3QgaW4gbVRyYWNrcyAocmV0dXJuZWQgJXpkKSIsIG5hbWUsIGluZGV4KTsKICAgICB9CiAgICAgcmV0dXJuIGluZGV4OwogfQpAQCAtMjMwMywxNSArMjMxMywxMyBAQAogICAgICAgICBpZiAodHJhY2stPmlzRXh0ZXJuYWxUcmFjaygpKSB7CiAgICAgICAgICAgICBUcmFja0Jhc2U6OnRyYWNrX3N0YXRlIHN0YXRlID0gdHJhY2stPm1TdGF0ZTsKICAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOwotICAgICAgICAgICAgc3RhdHVzID0gQXVkaW9TeXN0ZW06OnN0YXJ0T3V0cHV0KG1JZCwgdHJhY2stPnN0cmVhbVR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+c2Vzc2lvbklkKCkpOworICAgICAgICAgICAgc3RhdHVzID0gQXVkaW9TeXN0ZW06OnN0YXJ0T3V0cHV0KHRyYWNrLT5wb3J0SWQoKSk7CiAgICAgICAgICAgICBtTG9jay5sb2NrKCk7CiAgICAgICAgICAgICAvLyBhYm9ydCB0cmFjayB3YXMgc3RvcHBlZC9wYXVzZWQgd2hpbGUgd2UgcmVsZWFzZWQgdGhlIGxvY2sKICAgICAgICAgICAgIGlmIChzdGF0ZSAhPSB0cmFjay0+bVN0YXRlKSB7CiAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewogICAgICAgICAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKLSAgICAgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnN0b3BPdXRwdXQobUlkLCB0cmFjay0+c3RyZWFtVHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+c2Vzc2lvbklkKCkpOworICAgICAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6c3RvcE91dHB1dCh0cmFjay0+cG9ydElkKCkpOwogICAgICAgICAgICAgICAgICAgICBtTG9jay5sb2NrKCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKQEAgLTI0NjIsNiArMjQ3MCwxMSBAQAogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgLy8gcmVqZWN0IG91dCBvZiBzZXF1ZW5jZSByZXF1ZXN0cwogICAgIGlmICgobURyYWluU2VxdWVuY2UgJiAxKSAmJiAoc2VxdWVuY2UgPT0gbURyYWluU2VxdWVuY2UpKSB7CisgICAgICAgIC8vIFJlZ2lzdGVyIGRpc2NvbnRpbnVpdHkgd2hlbiBIVyBkcmFpbiBpcyBjb21wbGV0ZWQgYmVjYXVzZSB0aGF0IGNhbiBjYXVzZQorICAgICAgICAvLyB0aGUgdGltZXN0YW1wIGZyYW1lIHBvc2l0aW9uIHRvIHJlc2V0IHRvIDAgZm9yIGRpcmVjdCBhbmQgb2ZmbG9hZCB0aHJlYWRzLgorICAgICAgICAvLyAoT3V0IG9mIHNlcXVlbmNlIHJlcXVlc3RzIGFyZSBpZ25vcmVkLCBzaW5jZSB0aGUgZGlzY29udGludWl0eSB3b3VsZCBiZSBoYW5kbGVkCisgICAgICAgIC8vIGVsc2V3aGVyZSwgZS5nLiBpbiBmbHVzaCkuCisgICAgICAgIG1UaW1lc3RhbXBWZXJpZmllci5kaXNjb250aW51aXR5KCk7CiAgICAgICAgIG1EcmFpblNlcXVlbmNlICY9IH4xOwogICAgICAgICBtV2FpdFdvcmtDVi5zaWduYWwoKTsKICAgICB9CkBAIC0yNzgxLDI0ICsyNzk0LDE4IEBACiB2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OnRocmVhZExvb3BfcmVtb3ZlVHJhY2tzKAogICAgICAgICBjb25zdCBWZWN0b3I8IHNwPFRyYWNrPiA+JiB0cmFja3NUb1JlbW92ZSkKIHsKLSAgICBzaXplX3QgY291bnQgPSB0cmFja3NUb1JlbW92ZS5zaXplKCk7Ci0gICAgaWYgKGNvdW50ID4gMCkgewotICAgICAgICBmb3IgKHNpemVfdCBpID0gMCA7IGkgPCBjb3VudCA7IGkrKykgewotICAgICAgICAgICAgY29uc3Qgc3A8VHJhY2s+JiB0cmFjayA9IHRyYWNrc1RvUmVtb3ZlLml0ZW1BdChpKTsKLSAgICAgICAgICAgIGlmICh0cmFjay0+aXNFeHRlcm5hbFRyYWNrKCkpIHsKLSAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6c3RvcE91dHB1dChtSWQsIHRyYWNrLT5zdHJlYW1UeXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2stPnNlc3Npb25JZCgpKTsKKyAgICAvLyBNaXNjZWxsYW5lb3VzIHRyYWNrIGNsZWFudXAgd2hlbiByZW1vdmVkIGZyb20gdGhlIGFjdGl2ZSBsaXN0LAorICAgIC8vIGNhbGxlZCB3aXRob3V0IFRocmVhZCBsb2NrIGJ1dCBzeW5jaHJvbml6ZWQgd2l0aCB0aHJlYWRMb29wIHByb2Nlc3NpbmcuCiAjaWZkZWYgQUREX0JBVFRFUllfREFUQQotICAgICAgICAgICAgICAgIC8vIHRvIHRyYWNrIHRoZSBzcGVha2VyIHVzYWdlCi0gICAgICAgICAgICAgICAgYWRkQmF0dGVyeURhdGEoSU1lZGlhUGxheWVyU2VydmljZTo6a0JhdHRlcnlEYXRhQXVkaW9GbGluZ2VyU3RvcCk7Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICBpZiAodHJhY2stPmlzVGVybWluYXRlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlT3V0cHV0KG1JZCwgdHJhY2stPnN0cmVhbVR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2stPnNlc3Npb25JZCgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9CisgICAgZm9yIChjb25zdCBhdXRvJiB0cmFjayA6IHRyYWNrc1RvUmVtb3ZlKSB7CisgICAgICAgIGlmICh0cmFjay0+aXNFeHRlcm5hbFRyYWNrKCkpIHsKKyAgICAgICAgICAgIC8vIHRvIHRyYWNrIHRoZSBzcGVha2VyIHVzYWdlCisgICAgICAgICAgICBhZGRCYXR0ZXJ5RGF0YShJTWVkaWFQbGF5ZXJTZXJ2aWNlOjprQmF0dGVyeURhdGFBdWRpb0ZsaW5nZXJTdG9wKTsKICAgICAgICAgfQogICAgIH0KKyNlbHNlCisgICAgKHZvaWQpdHJhY2tzVG9SZW1vdmU7IC8vIHN1cHByZXNzIHVudXNlZCB3YXJuaW5nCisjZW5kaWYKIH0KIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpjaGVja1NpbGVudE1vZGVfbCgpCkBAIC0yODUwLDYgKzI4NTcsOSBAQAogICAgICAgICBBVFJBQ0VfRU5EKCk7CiAgICAgICAgIGlmIChmcmFtZXNXcml0dGVuID4gMCkgewogICAgICAgICAgICAgYnl0ZXNXcml0dGVuID0gZnJhbWVzV3JpdHRlbiAqIG1GcmFtZVNpemU7CisjaWZkZWYgVEVFX1NJTksKKyAgICAgICAgICAgIG1UZWUud3JpdGUoKGNoYXIgKiltU2lua0J1ZmZlciArIG9mZnNldCwgZnJhbWVzV3JpdHRlbik7CisjZW5kaWYKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGJ5dGVzV3JpdHRlbiA9IGZyYW1lc1dyaXR0ZW47CiAgICAgICAgIH0KQEAgLTMxNjcsNiArMzE3NywxNiBAQAogCiAgICAgY2hlY2tTaWxlbnRNb2RlX2woKTsKIAorICAgIC8vIERJUkVDVCBhbmQgT0ZGTE9BRCB0aHJlYWRzIHNob3VsZCByZXNldCBmcmFtZSBjb3VudCB0byB6ZXJvIG9uIHN0b3AvZmx1c2gKKyAgICAvLyBUT0RPOiBhZGQgY29uZmlybWF0aW9uIGNoZWNrczoKKyAgICAvLyAxKSBESVJFQ1QgdGhyZWFkcyBhbmQgbGluZWFyIFBDTSBmb3JtYXQgcmVhbGx5IHJlc2V0cyB0byAwPworICAgIC8vIDIpIElzIGZyYW1lIGNvdW50IHJlYWxseSB2YWxpZCBpZiBub3QgbGluZWFyIHBjbT8KKyAgICAvLyAzKSBBcmUgYWxsIDY0IGJpdHMgb2YgcG9zaXRpb24gcmV0dXJuZWQsIG5vdCBqdXN0IGxvd2VzdCAzMiBiaXRzPworICAgIGlmIChtVHlwZSA9PSBPRkZMT0FEIHx8IG1UeXBlID09IERJUkVDVCkgeworICAgICAgICBtVGltZXN0YW1wVmVyaWZpZXIuc2V0RGlzY29udGludWl0eU1vZGUobVRpbWVzdGFtcFZlcmlmaWVyLkRJU0NPTlRJTlVJVFlfTU9ERV9aRVJPKTsKKyAgICB9CisgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgbGFzdERvd25zdHJlYW1QYXRjaEhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOworCiAgICAgd2hpbGUgKCFleGl0UGVuZGluZygpKQogICAgIHsKICAgICAgICAgLy8gTG9nIG1lcmdlIHJlcXVlc3RzIGFyZSBwZXJmb3JtZWQgZHVyaW5nIEF1ZGlvRmxpbmdlciBiaW5kZXIgdHJhbnNhY3Rpb25zLCBidXQKQEAgLTMxNzcsNiArMzE5Nyw0OSBAQAogCiAgICAgICAgIFZlY3Rvcjwgc3A8RWZmZWN0Q2hhaW4+ID4gZWZmZWN0Q2hhaW5zOwogCisgICAgICAgIC8vIElmIHRoZSBkZXZpY2UgaXMgQVVESU9fREVWSUNFX09VVF9CVVMsIGNoZWNrIGZvciBkb3duc3RyZWFtIGxhdGVuY3kuCisgICAgICAgIC8vCisgICAgICAgIC8vIE5vdGU6IHdlIGFjY2VzcyBvdXREZXZpY2UoKSBvdXRzaWRlIG9mIG1Mb2NrLgorICAgICAgICBpZiAoaXNNc2REZXZpY2UoKSAmJiAob3V0RGV2aWNlKCkgJiBBVURJT19ERVZJQ0VfT1VUX0JVUykgIT0gMCkgeworICAgICAgICAgICAgLy8gSGVyZSwgd2UgdHJ5IGZvciB0aGUgQUYgbG9jaywgYnV0IGRvIG5vdCBibG9jayBvbiBpdCBhcyB0aGUgbGF0ZW5jeQorICAgICAgICAgICAgLy8gaXMgbW9yZSBpbmZvcm1hdGlvbmFsLgorICAgICAgICAgICAgaWYgKG1BdWRpb0ZsaW5nZXItPm1Mb2NrLnRyeUxvY2soKSA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFBhdGNoUGFuZWw6OlNvZnR3YXJlUGF0Y2g+IHN3UGF0Y2hlczsKKyAgICAgICAgICAgICAgICBkb3VibGUgbGF0ZW5jeU1zOworICAgICAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGRvd25zdHJlYW1QYXRjaEhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOworICAgICAgICAgICAgICAgIGlmIChtQXVkaW9GbGluZ2VyLT5tUGF0Y2hQYW5lbC5nZXREb3duc3RyZWFtU29mdHdhcmVQYXRjaGVzKGlkKCksICZzd1BhdGNoZXMpID09IE9LCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBzd1BhdGNoZXMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gc3dQYXRjaGVzWzBdLmdldExhdGVuY3lNc19sKCZsYXRlbmN5TXMpOworICAgICAgICAgICAgICAgICAgICAgICAgZG93bnN0cmVhbVBhdGNoSGFuZGxlID0gc3dQYXRjaGVzWzBdLmdldFBhdGNoSGFuZGxlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChkb3duc3RyZWFtUGF0Y2hIYW5kbGUgIT0gbGFzdERvd25zdHJlYW1QYXRjaEhhbmRsZSkgeworICAgICAgICAgICAgICAgICAgICBtRG93bnN0cmVhbUxhdGVuY3lTdGF0TXMucmVzZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgbGFzdERvd25zdHJlYW1QYXRjaEhhbmRsZSA9IGRvd25zdHJlYW1QYXRjaEhhbmRsZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBPSykgeworICAgICAgICAgICAgICAgICAgICAvLyB2ZXJpZnkgZG93bnN0cmVhbSBsYXRlbmN5ICh3ZSBhc3N1bWUgYSBtYXggcmVhc29uYWJsZQorICAgICAgICAgICAgICAgICAgICAvLyBsYXRlbmN5IG9mIDUgc2Vjb25kcykuCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSBtaW5MYXRlbmN5ID0gMC4sIG1heExhdGVuY3kgPSA1MDAwLjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxhdGVuY3lNcyA+PSBtaW5MYXRlbmN5ICYmIGxhdGVuY3lNcyA8PSBtYXhMYXRlbmN5KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigibmV3IGRvd25zdHJlYW0gbGF0ZW5jeSAlbGYgbXMiLCBsYXRlbmN5TXMpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0QoIm91dCBvZiByYW5nZSBkb3duc3RyZWFtIGxhdGVuY3kgJWxmIG1zIiwgbGF0ZW5jeU1zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsYXRlbmN5TXMgPCBtaW5MYXRlbmN5KSBsYXRlbmN5TXMgPSBtaW5MYXRlbmN5OworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobGF0ZW5jeU1zID4gbWF4TGF0ZW5jeSkgbGF0ZW5jeU1zID0gbWF4TGF0ZW5jeTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtRG93bnN0cmVhbUxhdGVuY3lTdGF0TXMuYWRkKGxhdGVuY3lNcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1BdWRpb0ZsaW5nZXItPm1Mb2NrLnVubG9jaygpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGxhc3REb3duc3RyZWFtUGF0Y2hIYW5kbGUgIT0gQVVESU9fUEFUQ0hfSEFORExFX05PTkUpIHsKKyAgICAgICAgICAgICAgICAvLyBvdXIgZGV2aWNlIGlzIG5vIGxvbmdlciBBVURJT19ERVZJQ0VfT1VUX0JVUywgcmVzZXQgcGF0Y2ggaGFuZGxlIGFuZCBzdGF0cy4KKyAgICAgICAgICAgICAgICBtRG93bnN0cmVhbUxhdGVuY3lTdGF0TXMucmVzZXQoKTsKKyAgICAgICAgICAgICAgICBsYXN0RG93bnN0cmVhbVBhdGNoSGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKwogICAgICAgICB7IC8vIHNjb3BlIGZvciBtTG9jawogCiAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwpAQCAtMzE5MCwxNiArMzI1Myw1MSBAQAogICAgICAgICAgICAgICAgIGxvZ1N0cmluZyA9IE5VTEw7CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIC8vIENvbGxlY3QgdGltZXN0YW1wIHN0YXRpc3RpY3MgZm9yIHRoZSBQbGF5YmFjayBUaHJlYWQgdHlwZXMgdGhhdCBzdXBwb3J0IGl0LgorICAgICAgICAgICAgaWYgKG1UeXBlID09IE1JWEVSCisgICAgICAgICAgICAgICAgICAgIHx8IG1UeXBlID09IERVUExJQ0FUSU5HCisgICAgICAgICAgICAgICAgICAgIHx8IG1UeXBlID09IERJUkVDVAorICAgICAgICAgICAgICAgICAgICB8fCBtVHlwZSA9PSBPRkZMT0FEKSB7IC8vIG5vIGluZGVudGF0aW9uCiAgICAgICAgICAgICAvLyBHYXRoZXIgdGhlIGZyYW1lc1JlbGVhc2VkIGNvdW50ZXJzIGZvciBhbGwgYWN0aXZlIHRyYWNrcywKICAgICAgICAgICAgIC8vIGFuZCBhc3NvY2lhdGUgd2l0aCB0aGUgc2luayBmcmFtZXMgd3JpdHRlbiBvdXQuICBXZSBuZWVkCiAgICAgICAgICAgICAvLyB0aGlzIHRvIGNvbnZlcnQgdGhlIHNpbmsgdGltZXN0YW1wIHRvIHRoZSB0cmFjayB0aW1lc3RhbXAuCiAgICAgICAgICAgICBib29sIGtlcm5lbExvY2F0aW9uVXBkYXRlID0gZmFsc2U7Ci0gICAgICAgICAgICBpZiAobU5vcm1hbFNpbmsgIT0gMCkgewotICAgICAgICAgICAgICAgIC8vIE5vdGU6IFRoZSBEdXBsaWNhdGluZ1RocmVhZCBtYXkgbm90IGhhdmUgYSBtTm9ybWFsU2luay4KKyAgICAgICAgICAgIEV4dGVuZGVkVGltZXN0YW1wIHRpbWVzdGFtcDsgLy8gdXNlIHByaXZhdGUgY29weSB0byBmZXRjaAorICAgICAgICAgICAgaWYgKG1TdGFuZGJ5KSB7CisgICAgICAgICAgICAgICAgbVRpbWVzdGFtcFZlcmlmaWVyLmRpc2NvbnRpbnVpdHkoKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodGhyZWFkbG9vcF9nZXRIYWxUaW1lc3RhbXBfbCgmdGltZXN0YW1wKSA9PSBPSykgeworICAgICAgICAgICAgICAgIG1UaW1lc3RhbXBWZXJpZmllci5hZGQodGltZXN0YW1wLm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdLAorICAgICAgICAgICAgICAgICAgICAgICAgbVNhbXBsZVJhdGUpOworCisgICAgICAgICAgICAgICAgaWYgKGlzVGltZXN0YW1wQ29ycmVjdGlvbkVuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiVFNfQkVGT1JFOiAlZCAlbGxkICVsbGQiLCBpZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpdGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyl0aW1lc3RhbXAubVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdKTsKKyAgICAgICAgICAgICAgICAgICAgYXV0byBjb3JyZWN0ZWRUaW1lc3RhbXAgPSBtVGltZXN0YW1wVmVyaWZpZXIuZ2V0TGFzdENvcnJlY3RlZFRpbWVzdGFtcCgpOworICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAubVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBjb3JyZWN0ZWRUaW1lc3RhbXAubUZyYW1lczsKKyAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGNvcnJlY3RlZFRpbWVzdGFtcC5tVGltZU5zOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiVFNfQUZURVI6ICVkICVsbGQgJWxsZCIsIGlkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyl0aW1lc3RhbXAubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKXRpbWVzdGFtcC5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0pOworCisgICAgICAgICAgICAgICAgICAgIC8vIE5vdGU6IERvd25zdHJlYW0gbGF0ZW5jeSBvbmx5IGFkZGVkIGlmIHRpbWVzdGFtcCBjb3JyZWN0aW9uIGVuYWJsZWQuCisgICAgICAgICAgICAgICAgICAgIGlmIChtRG93bnN0cmVhbUxhdGVuY3lTdGF0TXMuZ2V0TigpID4gMCkgeyAvLyB3ZSBoYXZlIGxhdGVuY3kgaW5mby4KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDY0X3QgbmV3UG9zaXRpb24gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAubVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gaW50NjRfdChtRG93bnN0cmVhbUxhdGVuY3lTdGF0TXMuZ2V0TWVhbigpICogbVNhbXBsZVJhdGUgKiAxZS0zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByZXZlbnQgcmV0cm9ncmFkZQorICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSA9IG1heCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3UG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtVGltZXN0YW1wLm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gbVN1c3BlbmRlZEZyYW1lcykpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgLy8gV2UgYWx3YXlzIGZldGNoIHRoZSB0aW1lc3RhbXAgaGVyZSBiZWNhdXNlIG9mdGVuIHRoZSBkb3duc3RyZWFtCiAgICAgICAgICAgICAgICAgLy8gc2luayB3aWxsIGJsb2NrIHdoaWxlIHdyaXRpbmcuCi0gICAgICAgICAgICAgICAgRXh0ZW5kZWRUaW1lc3RhbXAgdGltZXN0YW1wOyAvLyB1c2UgcHJpdmF0ZSBjb3B5IHRvIGZldGNoCi0gICAgICAgICAgICAgICAgKHZvaWQpIG1Ob3JtYWxTaW5rLT5nZXRUaW1lc3RhbXAodGltZXN0YW1wKTsKIAogICAgICAgICAgICAgICAgIC8vIFdlIGtlZXAgdHJhY2sgb2YgdGhlIGxhc3QgdmFsaWQga2VybmVsIHBvc2l0aW9uIGluIGNhc2Ugd2UgYXJlIGluIHVuZGVycnVuCiAgICAgICAgICAgICAgICAgLy8gYW5kIHRoZSBub3JtYWwgbWl4ZXIgcGVyaW9kIGlzIHRoZSBzYW1lIGFzIHRoZSBmYXN0IG1peGVyIHBlcmlvZCwgb3IgdGhlcmUKQEAgLTMyMjgsNyArMzMyNiwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgKyBtU3VzcGVuZGVkRnJhbWVzOyAvLyBhZGQgZnJhbWVzIGRpc2NhcmRlZCB3aGVuIHN1c3BlbmRlZAogICAgICAgICAgICAgICAgIG1UaW1lc3RhbXAubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSA9CiAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbVRpbWVzdGFtcFZlcmlmaWVyLmVycm9yKCk7CiAgICAgICAgICAgICB9CisKICAgICAgICAgICAgIC8vIG1GcmFtZXNXcml0dGVuIGZvciBub24tb2ZmbG9hZGVkIHRyYWNrcyBhcmUgY29udGlndW91cwogICAgICAgICAgICAgLy8gZXZlbiBhZnRlciBzdGFuZGJ5KCkgaXMgY2FsbGVkLiBUaGlzIGlzIHVzZWZ1bCBmb3IgdGhlIHRyYWNrIGZyYW1lCiAgICAgICAgICAgICAvLyB0byBzaW5rIGZyYW1lIG1hcHBpbmcuCkBAIC0zMjU2LDEwICszMzU3LDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICB0LT51cGRhdGVUcmFja0ZyYW1lSW5mbygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC0+bUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+ZnJhbWVzUmVsZWFzZWQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZyYW1lc1dyaXR0ZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TYW1wbGVSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVGltZXN0YW1wKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gLy8gaWYgKG1UeXBlIC4uLiApIHsgLy8gbm8gaW5kZW50YXRpb24KICNpZiAwCiAgICAgICAgICAgICAvLyBsb2dGb3JtYXQgZXhhbXBsZQogICAgICAgICAgICAgaWYgKHogJSAxMDAgPT0gMCkgewpAQCAtMzMwMCw3ICszNDAzLDcgQEAKIAogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCghbUFjdGl2ZVRyYWNrcy5zaXplKCkgJiYgc3lzdGVtVGltZSgpID4gbVN0YW5kYnlUaW1lTnMpIHx8CisgICAgICAgICAgICBpZiAoKG1BY3RpdmVUcmFja3MuaXNFbXB0eSgpICYmIHN5c3RlbVRpbWUoKSA+IG1TdGFuZGJ5VGltZU5zKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1N1c3BlbmRlZCgpKSB7CiAgICAgICAgICAgICAgICAgLy8gcHV0IGF1ZGlvIGhhcmR3YXJlIGludG8gc3RhbmRieSBhZnRlciBzaG9ydCBkZWxheQogICAgICAgICAgICAgICAgIGlmIChzaG91bGRTdGFuZGJ5X2woKSkgewpAQCAtMzMxNCw3ICszNDE3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgbVN0YW5kYnkgPSB0cnVlOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGlmICghbUFjdGl2ZVRyYWNrcy5zaXplKCkgJiYgbUNvbmZpZ0V2ZW50cy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBpZiAobUFjdGl2ZVRyYWNrcy5pc0VtcHR5KCkgJiYgbUNvbmZpZ0V2ZW50cy5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gd2UncmUgYWJvdXQgdG8gd2FpdCwgZmx1c2ggdGhlIGJpbmRlciBjb21tYW5kIGJ1ZmZlcgogICAgICAgICAgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5mbHVzaENvbW1hbmRzKCk7CiAKQEAgLTM2MDUsMjQgKzM3MDgsMjggQEAKIC8vIHJlbW92ZVRyYWNrc19sKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBUaHJlYWRCYXNlOjptTG9jayBoZWxkCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OnJlbW92ZVRyYWNrc19sKGNvbnN0IFZlY3Rvcjwgc3A8VHJhY2s+ID4mIHRyYWNrc1RvUmVtb3ZlKQogewotICAgIHNpemVfdCBjb3VudCA9IHRyYWNrc1RvUmVtb3ZlLnNpemUoKTsKLSAgICBpZiAoY291bnQgPiAwKSB7Ci0gICAgICAgIGZvciAoc2l6ZV90IGk9MCA7IGk8Y291bnQgOyBpKyspIHsKLSAgICAgICAgICAgIGNvbnN0IHNwPFRyYWNrPiYgdHJhY2sgPSB0cmFja3NUb1JlbW92ZS5pdGVtQXQoaSk7Ci0gICAgICAgICAgICBtQWN0aXZlVHJhY2tzLnJlbW92ZSh0cmFjayk7Ci0gICAgICAgICAgICBBTE9HVigicmVtb3ZlVHJhY2tzX2wgcmVtb3ZpbmcgdHJhY2sgb24gc2Vzc2lvbiAlZCIsIHRyYWNrLT5zZXNzaW9uSWQoKSk7Ci0gICAgICAgICAgICBzcDxFZmZlY3RDaGFpbj4gY2hhaW4gPSBnZXRFZmZlY3RDaGFpbl9sKHRyYWNrLT5zZXNzaW9uSWQoKSk7Ci0gICAgICAgICAgICBpZiAoY2hhaW4gIT0gMCkgewotICAgICAgICAgICAgICAgIEFMT0dWKCJzdG9wcGluZyB0cmFjayBvbiBjaGFpbiAlcCBmb3Igc2Vzc2lvbiBJZDogJWQiLCBjaGFpbi5nZXQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5zZXNzaW9uSWQoKSk7Ci0gICAgICAgICAgICAgICAgY2hhaW4tPmRlY0FjdGl2ZVRyYWNrQ250KCk7Ci0gICAgICAgICAgICB9CisgICAgZm9yIChjb25zdCBhdXRvJiB0cmFjayA6IHRyYWNrc1RvUmVtb3ZlKSB7CisgICAgICAgIG1BY3RpdmVUcmFja3MucmVtb3ZlKHRyYWNrKTsKKyAgICAgICAgQUxPR1YoIiVzKCVkKTogcmVtb3ZpbmcgdHJhY2sgb24gc2Vzc2lvbiAlZCIsIF9fZnVuY19fLCB0cmFjay0+aWQoKSwgdHJhY2stPnNlc3Npb25JZCgpKTsKKyAgICAgICAgc3A8RWZmZWN0Q2hhaW4+IGNoYWluID0gZ2V0RWZmZWN0Q2hhaW5fbCh0cmFjay0+c2Vzc2lvbklkKCkpOworICAgICAgICBpZiAoY2hhaW4gIT0gMCkgeworICAgICAgICAgICAgQUxPR1YoIiVzKCVkKTogc3RvcHBpbmcgdHJhY2sgb24gY2hhaW4gJXAgZm9yIHNlc3Npb24gSWQ6ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHRyYWNrLT5pZCgpLCBjaGFpbi5nZXQoKSwgdHJhY2stPnNlc3Npb25JZCgpKTsKKyAgICAgICAgICAgIGNoYWluLT5kZWNBY3RpdmVUcmFja0NudCgpOworICAgICAgICB9CisgICAgICAgIC8vIElmIGFuIGV4dGVybmFsIGNsaWVudCB0cmFjaywgaW5mb3JtIEFQTSB3ZSdyZSBubyBsb25nZXIgYWN0aXZlLCBhbmQgcmVtb3ZlIGlmIG5lZWRlZC4KKyAgICAgICAgLy8gV2UgZG8gdGhpcyB1bmRlciBsb2NrIHNvIHRoYXQgdGhlIHN0YXRlIGlzIGNvbnNpc3RlbnQgaWYgdGhlIFRyYWNrIGlzIGRlc3Ryb3llZC4KKyAgICAgICAgaWYgKHRyYWNrLT5pc0V4dGVybmFsVHJhY2soKSkgeworICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnN0b3BPdXRwdXQodHJhY2stPnBvcnRJZCgpKTsKICAgICAgICAgICAgIGlmICh0cmFjay0+aXNUZXJtaW5hdGVkKCkpIHsKLSAgICAgICAgICAgICAgICByZW1vdmVUcmFja19sKHRyYWNrKTsKKyAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZU91dHB1dCh0cmFjay0+cG9ydElkKCkpOwogICAgICAgICAgICAgfQogICAgICAgICB9CisgICAgICAgIGlmICh0cmFjay0+aXNUZXJtaW5hdGVkKCkpIHsKKyAgICAgICAgICAgIC8vIHJlbW92ZSBmcm9tIG91ciB0cmFja3MgdmVjdG9yCisgICAgICAgICAgICByZW1vdmVUcmFja19sKHRyYWNrKTsKKyAgICAgICAgfQogICAgIH0KLQogfQogCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpnZXRUaW1lc3RhbXBfbChBdWRpb1RpbWVzdGFtcCYgdGltZXN0YW1wKQpAQCAtMzYzOSw2ICszNzQ2LDE1IEBACiAgICAgICAgIHVpbnQ2NF90IHBvc2l0aW9uNjQ7CiAgICAgICAgIGlmIChtT3V0cHV0LT5nZXRQcmVzZW50YXRpb25Qb3NpdGlvbigmcG9zaXRpb242NCwgJnRpbWVzdGFtcC5tVGltZSkgPT0gT0spIHsKICAgICAgICAgICAgIHRpbWVzdGFtcC5tUG9zaXRpb24gPSAodWludDMyX3QpcG9zaXRpb242NDsKKyAgICAgICAgICAgIGlmIChtRG93bnN0cmVhbUxhdGVuY3lTdGF0TXMuZ2V0TigpID4gMCkgeworICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHBvc2l0aW9uT2Zmc2V0ID0KKyAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KShtRG93bnN0cmVhbUxhdGVuY3lTdGF0TXMuZ2V0TWVhbigpICogbVNhbXBsZVJhdGUgKiAxZS0zKTsKKyAgICAgICAgICAgICAgICBpZiAocG9zaXRpb25PZmZzZXQgPiB0aW1lc3RhbXAubVBvc2l0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC5tUG9zaXRpb24gPSAwOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC5tUG9zaXRpb24gLT0gcG9zaXRpb25PZmZzZXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9CiAgICAgfQpAQCAtMzc3NywxMiArMzg5MywxNiBAQAogICAgIGRlc3Ryb3lUcmFja19sKHRyYWNrKTsKIH0KIAotdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpnZXRBdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpCit2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OnRvQXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKQogewotICAgIFRocmVhZEJhc2U6OmdldEF1ZGlvUG9ydENvbmZpZyhjb25maWcpOworICAgIFRocmVhZEJhc2U6OnRvQXVkaW9Qb3J0Q29uZmlnKGNvbmZpZyk7CiAgICAgY29uZmlnLT5yb2xlID0gQVVESU9fUE9SVF9ST0xFX1NPVVJDRTsKICAgICBjb25maWctPmV4dC5taXguaHdfbW9kdWxlID0gbU91dHB1dC0+YXVkaW9Id0Rldi0+aGFuZGxlKCk7CiAgICAgY29uZmlnLT5leHQubWl4LnVzZWNhc2Uuc3RyZWFtID0gQVVESU9fU1RSRUFNX0RFRkFVTFQ7CisgICAgaWYgKG1PdXRwdXQgJiYgbU91dHB1dC0+ZmxhZ3MgIT0gQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSkgeworICAgICAgICBjb25maWctPmNvbmZpZ19tYXNrIHw9IEFVRElPX1BPUlRfQ09ORklHX0ZMQUdTOworICAgICAgICBjb25maWctPmZsYWdzLm91dHB1dCA9IG1PdXRwdXQtPmZsYWdzOworICAgIH0KIH0KIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMzg2Myw5ICszOTgzLDcgQEAKIAogICAgICAgICAvLyBjcmVhdGUgYSBNb25vUGlwZSB0byBjb25uZWN0IG91ciBzdWJtaXggdG8gRmFzdE1peGVyCiAgICAgICAgIE5CQUlPX0Zvcm1hdCBmb3JtYXQgPSBtT3V0cHV0U2luay0+Zm9ybWF0KCk7Ci0jaWZkZWYgVEVFX1NJTksKLSAgICAgICAgTkJBSU9fRm9ybWF0IG9yaWdmb3JtYXQgPSBmb3JtYXQ7Ci0jZW5kaWYKKwogICAgICAgICAvLyBhZGp1c3QgZm9ybWF0IHRvIG1hdGNoIHRoYXQgb2YgdGhlIEZhc3QgTWl4ZXIKICAgICAgICAgQUxPR1YoImZvcm1hdCBjaGFuZ2VkIGZyb20gJSN4IHRvICUjeCIsIGZvcm1hdC5tRm9ybWF0LCBmYXN0TWl4ZXJGb3JtYXQpOwogICAgICAgICBmb3JtYXQubUZvcm1hdCA9IGZhc3RNaXhlckZvcm1hdDsKQEAgLTM4NzcsNyArMzk5NSw3IEBACiAgICAgICAgIE1vbm9QaXBlICptb25vUGlwZSA9IG5ldyBNb25vUGlwZShtTm9ybWFsRnJhbWVDb3VudCAqIDQsIGZvcm1hdCwgdHJ1ZSAvKndyaXRlQ2FuQmxvY2sqLyk7CiAgICAgICAgIGNvbnN0IE5CQUlPX0Zvcm1hdCBvZmZlcnNbMV0gPSB7Zm9ybWF0fTsKICAgICAgICAgc2l6ZV90IG51bUNvdW50ZXJPZmZlcnMgPSAwOwotI2lmICFMT0dfTkRFQlVHIHx8IGRlZmluZWQoVEVFX1NJTkspCisjaWYgIUxPR19OREVCVUcKICAgICAgICAgc3NpemVfdCBpbmRleCA9CiAjZWxzZQogICAgICAgICAodm9pZCkKQEAgLTM4ODgsMjUgKzQwMDYsOCBAQAogICAgICAgICAgICAgICAgIChtb25vUGlwZS0+bWF4RnJhbWVzKCkgKiA3KSAvIDggOiBtTm9ybWFsRnJhbWVDb3VudCAqIDIpOwogICAgICAgICBtUGlwZVNpbmsgPSBtb25vUGlwZTsKIAotI2lmZGVmIFRFRV9TSU5LCi0gICAgICAgIGlmIChtVGVlU2lua091dHB1dEVuYWJsZWQpIHsKLSAgICAgICAgICAgIC8vIGNyZWF0ZSBhIFBpcGUgdG8gYXJjaGl2ZSBhIGNvcHkgb2YgRmFzdE1peGVyJ3Mgb3V0cHV0IGZvciBkdW1wc3lzCi0gICAgICAgICAgICBQaXBlICp0ZWVTaW5rID0gbmV3IFBpcGUobVRlZVNpbmtPdXRwdXRGcmFtZXMsIG9yaWdmb3JtYXQpOwotICAgICAgICAgICAgY29uc3QgTkJBSU9fRm9ybWF0IG9mZmVyczJbMV0gPSB7b3JpZ2Zvcm1hdH07Ci0gICAgICAgICAgICBudW1Db3VudGVyT2ZmZXJzID0gMDsKLSAgICAgICAgICAgIGluZGV4ID0gdGVlU2luay0+bmVnb3RpYXRlKG9mZmVyczIsIDEsIE5VTEwsIG51bUNvdW50ZXJPZmZlcnMpOwotICAgICAgICAgICAgQUxPR19BU1NFUlQoaW5kZXggPT0gMCk7Ci0gICAgICAgICAgICBtVGVlU2luayA9IHRlZVNpbms7Ci0gICAgICAgICAgICBQaXBlUmVhZGVyICp0ZWVTb3VyY2UgPSBuZXcgUGlwZVJlYWRlcigqdGVlU2luayk7Ci0gICAgICAgICAgICBudW1Db3VudGVyT2ZmZXJzID0gMDsKLSAgICAgICAgICAgIGluZGV4ID0gdGVlU291cmNlLT5uZWdvdGlhdGUob2ZmZXJzMiwgMSwgTlVMTCwgbnVtQ291bnRlck9mZmVycyk7Ci0gICAgICAgICAgICBBTE9HX0FTU0VSVChpbmRleCA9PSAwKTsKLSAgICAgICAgICAgIG1UZWVTb3VyY2UgPSB0ZWVTb3VyY2U7Ci0gICAgICAgIH0KLSNlbmRpZgotCiAgICAgICAgIC8vIGNyZWF0ZSBmYXN0IG1peGVyIGFuZCBjb25maWd1cmUgaXQgaW5pdGlhbGx5IHdpdGgganVzdCBvbmUgZmFzdCB0cmFjayBmb3Igb3VyIHN1Ym1peAotICAgICAgICBtRmFzdE1peGVyID0gbmV3IEZhc3RNaXhlcigpOworICAgICAgICBtRmFzdE1peGVyID0gbmV3IEZhc3RNaXhlcihtSWQpOwogICAgICAgICBGYXN0TWl4ZXJTdGF0ZVF1ZXVlICpzcSA9IG1GYXN0TWl4ZXItPnNxKCk7CiAjaWZkZWYgU1RBVEVfUVVFVUVfRFVNUAogICAgICAgICBzcS0+c2V0T2JzZXJ2ZXJEdW1wKCZtU3RhdGVRdWV1ZU9ic2VydmVyRHVtcCk7CkBAIC0zOTMyLDE4ICs0MDMzLDIwIEBACiAgICAgICAgIHN0YXRlLT5tQ29sZEZ1dGV4QWRkciA9ICZtRmFzdE1peGVyRnV0ZXg7CiAgICAgICAgIHN0YXRlLT5tQ29sZEdlbisrOwogICAgICAgICBzdGF0ZS0+bUR1bXBTdGF0ZSA9ICZtRmFzdE1peGVyRHVtcFN0YXRlOwotI2lmZGVmIFRFRV9TSU5LCi0gICAgICAgIHN0YXRlLT5tVGVlU2luayA9IG1UZWVTaW5rLmdldCgpOwotI2VuZGlmCiAgICAgICAgIG1GYXN0TWl4ZXJOQkxvZ1dyaXRlciA9IGF1ZGlvRmxpbmdlci0+bmV3V3JpdGVyX2woa0Zhc3RNaXhlckxvZ1NpemUsICJGYXN0TWl4ZXIiKTsKICAgICAgICAgc3RhdGUtPm1OQkxvZ1dyaXRlciA9IG1GYXN0TWl4ZXJOQkxvZ1dyaXRlci5nZXQoKTsKICAgICAgICAgc3EtPmVuZCgpOwogICAgICAgICBzcS0+cHVzaChGYXN0TWl4ZXJTdGF0ZVF1ZXVlOjpCTE9DS19VTlRJTF9QVVNIRUQpOwogCisgICAgICAgIE5CTG9nOjp0aHJlYWRfaW5mb190IGluZm87CisgICAgICAgIGluZm8uaWQgPSBtSWQ7CisgICAgICAgIGluZm8udHlwZSA9IE5CTG9nOjpGQVNUTUlYRVI7CisgICAgICAgIG1GYXN0TWl4ZXJOQkxvZ1dyaXRlci0+bG9nPE5CTG9nOjpFVkVOVF9USFJFQURfSU5GTz4oaW5mbyk7CisKICAgICAgICAgLy8gc3RhcnQgdGhlIGZhc3QgbWl4ZXIKICAgICAgICAgbUZhc3RNaXhlci0+cnVuKCJGYXN0TWl4ZXIiLCBQUklPUklUWV9VUkdFTlRfQVVESU8pOwogICAgICAgICBwaWRfdCB0aWQgPSBtRmFzdE1peGVyLT5nZXRUaWQoKTsKLSAgICAgICAgc2VuZFByaW9Db25maWdFdmVudChnZXRwaWRfY2FjaGVkLCB0aWQsIGtQcmlvcml0eUZhc3RNaXhlciwgZmFsc2UgLypmb3JBcHAqLyk7CisgICAgICAgIHNlbmRQcmlvQ29uZmlnRXZlbnQoZ2V0cGlkKCksIHRpZCwga1ByaW9yaXR5RmFzdE1peGVyLCBmYWxzZSAvKmZvckFwcCovKTsKICAgICAgICAgc3RyZWFtKCktPnNldEhhbFRocmVhZFByaW9yaXR5KGtQcmlvcml0eUZhc3RNaXhlcik7CiAKICNpZmRlZiBBVURJT19XQVRDSERPRwpAQCAtMzk1Miw5ICs0MDU1LDE0IEBACiAgICAgICAgIG1BdWRpb1dhdGNoZG9nLT5zZXREdW1wKCZtQXVkaW9XYXRjaGRvZ0R1bXApOwogICAgICAgICBtQXVkaW9XYXRjaGRvZy0+cnVuKCJBdWRpb1dhdGNoZG9nIiwgUFJJT1JJVFlfVVJHRU5UX0FVRElPKTsKICAgICAgICAgdGlkID0gbUF1ZGlvV2F0Y2hkb2ctPmdldFRpZCgpOwotICAgICAgICBzZW5kUHJpb0NvbmZpZ0V2ZW50KGdldHBpZF9jYWNoZWQsIHRpZCwga1ByaW9yaXR5RmFzdE1peGVyLCBmYWxzZSAvKmZvckFwcCovKTsKKyAgICAgICAgc2VuZFByaW9Db25maWdFdmVudChnZXRwaWQoKSwgdGlkLCBrUHJpb3JpdHlGYXN0TWl4ZXIsIGZhbHNlIC8qZm9yQXBwKi8pOwogI2VuZGlmCi0KKyAgICB9IGVsc2UgeworI2lmZGVmIFRFRV9TSU5LCisgICAgICAgIC8vIE9ubHkgdXNlIHRoZSBNaXhlclRocmVhZCB0ZWUgaWYgdGhlcmUgaXMgbm8gRmFzdE1peGVyLgorICAgICAgICBtVGVlLnNldChtT3V0cHV0U2luay0+Zm9ybWF0KCksIE5CQUlPX1RlZTo6VEVFX0ZMQUdfT1VUUFVUX1RIUkVBRCk7CisgICAgICAgIG1UZWUuc2V0SWQoc3RkOjpzdHJpbmcoIl8iKSArIHN0ZDo6dG9fc3RyaW5nKG1JZCkgKyAiX00iKTsKKyNlbmRpZgogICAgIH0KIAogICAgIHN3aXRjaCAoa1VzZUZhc3RNaXhlcikgewpAQCAtNDAxOCwxMiArNDEyNiw2IEBACiAgICAgcmV0dXJuIGxhdGVuY3k7CiB9CiAKLQotdm9pZCBBdWRpb0ZsaW5nZXI6Ok1peGVyVGhyZWFkOjp0aHJlYWRMb29wX3JlbW92ZVRyYWNrcyhjb25zdCBWZWN0b3I8IHNwPFRyYWNrPiA+JiB0cmFja3NUb1JlbW92ZSkKLXsKLSAgICBQbGF5YmFja1RocmVhZDo6dGhyZWFkTG9vcF9yZW1vdmVUcmFja3ModHJhY2tzVG9SZW1vdmUpOwotfQotCiBzc2l6ZV90IEF1ZGlvRmxpbmdlcjo6TWl4ZXJUaHJlYWQ6OnRocmVhZExvb3Bfd3JpdGUoKQogewogICAgIC8vIEZJWE1FIHdlIHNob3VsZCBvbmx5IGRvIG9uZSBwdXNoIHBlciBjeWNsZTsgY29uZmlybSB0aGlzIGlzIHRydWUKQEAgLTQyMjIsMTQgKzQzMjQsMTQgQEAKIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6Om1peGVyX3N0YXRlIEF1ZGlvRmxpbmdlcjo6TWl4ZXJUaHJlYWQ6OnByZXBhcmVUcmFja3NfbCgKICAgICAgICAgVmVjdG9yPCBzcDxUcmFjaz4gPiAqdHJhY2tzVG9SZW1vdmUpCiB7Ci0gICAgLy8gY2xlYW4gdXAgZGVsZXRlZCB0cmFjayBuYW1lcyBpbiBBdWRpb01peGVyIGJlZm9yZSBhbGxvY2F0aW5nIG5ldyB0cmFja3MKLSAgICAodm9pZCltVHJhY2tzLnByb2Nlc3NEZWxldGVkVHJhY2tOYW1lcyhbdGhpc10oaW50IG5hbWUpIHsKLSAgICAgICAgLy8gZm9yIGVhY2ggbmFtZSwgZGVzdHJveSBpdCBpbiB0aGUgQXVkaW9NaXhlcgotICAgICAgICBpZiAobUF1ZGlvTWl4ZXItPmV4aXN0cyhuYW1lKSkgewotICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPmRlc3Ryb3kobmFtZSk7CisgICAgLy8gY2xlYW4gdXAgZGVsZXRlZCB0cmFjayBpZHMgaW4gQXVkaW9NaXhlciBiZWZvcmUgYWxsb2NhdGluZyBuZXcgdHJhY2tzCisgICAgKHZvaWQpbVRyYWNrcy5wcm9jZXNzRGVsZXRlZFRyYWNrSWRzKFt0aGlzXShpbnQgdHJhY2tJZCkgeworICAgICAgICAvLyBmb3IgZWFjaCB0cmFja0lkLCBkZXN0cm95IGl0IGluIHRoZSBBdWRpb01peGVyCisgICAgICAgIGlmIChtQXVkaW9NaXhlci0+ZXhpc3RzKHRyYWNrSWQpKSB7CisgICAgICAgICAgICBtQXVkaW9NaXhlci0+ZGVzdHJveSh0cmFja0lkKTsKICAgICAgICAgfQogICAgIH0pOwotICAgIG1UcmFja3MuY2xlYXJEZWxldGVkVHJhY2tOYW1lcygpOworICAgIG1UcmFja3MuY2xlYXJEZWxldGVkVHJhY2tJZHMoKTsKIAogICAgIG1peGVyX3N0YXRlIG1peGVyU3RhdHVzID0gTUlYRVJfSURMRTsKICAgICAvLyBmaW5kIG91dCB3aGljaCB0cmFja3MgbmVlZCB0byBiZSBwcm9jZXNzZWQKQEAgLTQyNzAsNiArNDM3MiwzNyBAQAogICAgIG1NaXhlckJ1ZmZlclZhbGlkID0gZmFsc2U7ICAvLyBtTWl4ZXJCdWZmZXIgaGFzIG5vIHZhbGlkIGRhdGEgdW50aWwgYXBwcm9wcmlhdGUgdHJhY2tzIGZvdW5kLgogICAgIG1FZmZlY3RCdWZmZXJWYWxpZCA9IGZhbHNlOyAvLyBtRWZmZWN0QnVmZmVyIGhhcyBubyB2YWxpZCBkYXRhIHVudGlsIHRyYWNrcyBmb3VuZC4KIAorICAgIC8vIERlZmVycmVkT3BlcmF0aW9ucyBoYW5kbGVzIHN0YXRpc3RpY3MgYWZ0ZXIgc2V0dGluZyBtaXhlclN0YXR1cy4KKyAgICBjbGFzcyBEZWZlcnJlZE9wZXJhdGlvbnMgeworICAgIHB1YmxpYzoKKyAgICAgICAgRGVmZXJyZWRPcGVyYXRpb25zKG1peGVyX3N0YXRlICptaXhlclN0YXR1cykKKyAgICAgICAgICAgIDogbU1peGVyU3RhdHVzKG1peGVyU3RhdHVzKSB7IH0KKworICAgICAgICAvLyB3aGVuIGxlYXZpbmcgc2NvcGUsIHRhbGx5IGZyYW1lcyBwcm9wZXJseS4KKyAgICAgICAgfkRlZmVycmVkT3BlcmF0aW9ucygpIHsKKyAgICAgICAgICAgIC8vIFRhbGx5IHVuZGVycnVuIGZyYW1lcyBvbmx5IGlmIHdlIGFyZSBhY3R1YWxseSBtaXhpbmcgKE1JWEVSX1RSQUNLU19SRUFEWSkKKyAgICAgICAgICAgIC8vIGJlY2F1c2UgdGhhdCBpcyB3aGVuIHRoZSB1bmRlcnJ1biBvY2N1cnMuCisgICAgICAgICAgICAvLyBXZSBkbyBub3QgZGlzdGluZ3Vpc2ggYmV0d2VlbiBGYXN0VHJhY2tzIGFuZCBOb3JtYWxUcmFja3MgaGVyZS4KKyAgICAgICAgICAgIGlmICgqbU1peGVyU3RhdHVzID09IE1JWEVSX1RSQUNLU19SRUFEWSkgeworICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byAmdW5kZXJydW4gOiBtVW5kZXJydW5GcmFtZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgdW5kZXJydW4uZmlyc3QtPm1BdWRpb1RyYWNrU2VydmVyUHJveHktPnRhbGx5VW5kZXJydW5GcmFtZXMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZXJydW4uc2Vjb25kKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyB0YWxseVVuZGVycnVuRnJhbWVzKCkgaXMgY2FsbGVkIHRvIHVwZGF0ZSB0aGUgdHJhY2sgY291bnRlcnMKKyAgICAgICAgLy8gd2l0aCB0aGUgbnVtYmVyIG9mIHVuZGVycnVuIGZyYW1lcyBmb3IgYSBwYXJ0aWN1bGFyIG1peGVyIHBlcmlvZC4KKyAgICAgICAgLy8gV2UgZGVmZXIgdGFsbHlpbmcgdW50aWwgd2Uga25vdyB0aGUgZmluYWwgbWl4ZXIgc3RhdHVzLgorICAgICAgICB2b2lkIHRhbGx5VW5kZXJydW5GcmFtZXMoc3A8VHJhY2s+IHRyYWNrLCBzaXplX3QgdW5kZXJydW5GcmFtZXMpIHsKKyAgICAgICAgICAgIG1VbmRlcnJ1bkZyYW1lcy5lbXBsYWNlX2JhY2sodHJhY2ssIHVuZGVycnVuRnJhbWVzKTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgY29uc3QgbWl4ZXJfc3RhdGUgKiBjb25zdCBtTWl4ZXJTdGF0dXM7CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxzcDxUcmFjaz4sIHNpemVfdD4+IG1VbmRlcnJ1bkZyYW1lczsKKyAgICB9IGRlZmVycmVkT3BlcmF0aW9ucygmbWl4ZXJTdGF0dXMpOyAvLyBpbXBsaWNpdCBuZXN0ZWQgc2NvcGUgZm9yIHZhcmlhYmxlIGNhcHR1cmUKKwogICAgIGZvciAoc2l6ZV90IGk9MCA7IGk8Y291bnQgOyBpKyspIHsKICAgICAgICAgY29uc3Qgc3A8VHJhY2s+IHQgPSBtQWN0aXZlVHJhY2tzW2ldOwogCkBAIC00MzA0LDEzICs0NDM3LDE0IEBACiAgICAgICAgICAgICB0cmFjay0+bU9ic2VydmVkVW5kZXJydW5zID0gdW5kZXJydW5zOwogICAgICAgICAgICAgLy8gZG9uJ3QgY291bnQgdW5kZXJydW5zIHRoYXQgb2NjdXIgd2hpbGUgc3RvcHBpbmcgb3IgcGF1c2luZwogICAgICAgICAgICAgLy8gb3Igc3RvcHBlZCB3aGljaCBjYW4gb2NjdXIgd2hlbiBmbHVzaCgpIGlzIGNhbGxlZCB3aGlsZSBhY3RpdmUKKyAgICAgICAgICAgIHNpemVfdCB1bmRlcnJ1bkZyYW1lcyA9IDA7CiAgICAgICAgICAgICBpZiAoISh0cmFjay0+aXNTdG9wcGluZygpIHx8IHRyYWNrLT5pc1BhdXNpbmcoKSB8fCB0cmFjay0+aXNTdG9wcGVkKCkpICYmCiAgICAgICAgICAgICAgICAgICAgIHJlY2VudFVuZGVycnVucyA+IDApIHsKICAgICAgICAgICAgICAgICAvLyBGSVhNRSBmYXN0IG1peGVyIHdpbGwgcHVsbCAmIG1peCBwYXJ0aWFsIGJ1ZmZlcnMsIGJ1dCB3ZSBjb3VudCBhcyBhIGZ1bGwgdW5kZXJydW4KLSAgICAgICAgICAgICAgICB0cmFjay0+bUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+dGFsbHlVbmRlcnJ1bkZyYW1lcyhyZWNlbnRVbmRlcnJ1bnMgKiBtRnJhbWVDb3VudCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRyYWNrLT5tQXVkaW9UcmFja1NlcnZlclByb3h5LT50YWxseVVuZGVycnVuRnJhbWVzKDApOworICAgICAgICAgICAgICAgIHVuZGVycnVuRnJhbWVzID0gcmVjZW50VW5kZXJydW5zICogbUZyYW1lQ291bnQ7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBJbW1lZGlhdGVseSBhY2NvdW50IGZvciBGYXN0VHJhY2sgdW5kZXJydW5zLgorICAgICAgICAgICAgdHJhY2stPm1BdWRpb1RyYWNrU2VydmVyUHJveHktPnRhbGx5VW5kZXJydW5GcmFtZXModW5kZXJydW5GcmFtZXMpOwogCiAgICAgICAgICAgICAvLyBUaGlzIGlzIHNpbWlsYXIgdG8gdGhlIHN0YXRlIG1hY2hpbmUgZm9yIG5vcm1hbCB0cmFja3MsCiAgICAgICAgICAgICAvLyB3aXRoIGEgZmV3IG1vZGlmaWNhdGlvbnMgZm9yIGZhc3QgdHJhY2tzLgpAQCAtNDQ1NiwxOSArNDU5MCwyMSBAQAogCiAgICAgICAgIC8vIFRoZSBmaXJzdCB0aW1lIGEgdHJhY2sgaXMgYWRkZWQgd2Ugd2FpdAogICAgICAgICAvLyBmb3IgYWxsIGl0cyBidWZmZXJzIHRvIGJlIGZpbGxlZCBiZWZvcmUgcHJvY2Vzc2luZyBpdAotICAgICAgICBpbnQgbmFtZSA9IHRyYWNrLT5uYW1lKCk7CisgICAgICAgIGNvbnN0IGludCB0cmFja0lkID0gdHJhY2stPmlkKCk7CiAKICAgICAgICAgLy8gaWYgYW4gYWN0aXZlIHRyYWNrIGRvZXNuJ3QgZXhpc3QgaW4gdGhlIEF1ZGlvTWl4ZXIsIGNyZWF0ZSBpdC4KLSAgICAgICAgaWYgKCFtQXVkaW9NaXhlci0+ZXhpc3RzKG5hbWUpKSB7CisgICAgICAgIC8vIHVzZSB0aGUgdHJhY2tJZCBhcyB0aGUgQXVkaW9NaXhlciBuYW1lLgorICAgICAgICBpZiAoIW1BdWRpb01peGVyLT5leGlzdHModHJhY2tJZCkpIHsKICAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1BdWRpb01peGVyLT5jcmVhdGUoCi0gICAgICAgICAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICAgICAgICAgIHRyYWNrSWQsCiAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5tQ2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5tRm9ybWF0LAogICAgICAgICAgICAgICAgICAgICB0cmFjay0+bVNlc3Npb25JZCk7CiAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coIiVzOiBjYW5ub3QgY3JlYXRlIHRyYWNrIG5hbWUiCi0gICAgICAgICAgICAgICAgICAgICAgICAiICVkLCBtYXNrICUjeCwgZm9ybWF0ICUjeCwgc2Vzc2lvbklkICVkIGluIEF1ZGlvTWl4ZXIiLAotICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG5hbWUsIHRyYWNrLT5tQ2hhbm5lbE1hc2ssIHRyYWNrLT5tRm9ybWF0LCB0cmFjay0+bVNlc3Npb25JZCk7CisgICAgICAgICAgICAgICAgQUxPR1coIiVzKCk6IEF1ZGlvTWl4ZXIgY2Fubm90IGNyZWF0ZSB0cmFjayglZCkiCisgICAgICAgICAgICAgICAgICAgICAgICAiIG1hc2sgJSN4LCBmb3JtYXQgJSN4LCBzZXNzaW9uSWQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHRyYWNrSWQsCisgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+bUNoYW5uZWxNYXNrLCB0cmFjay0+bUZvcm1hdCwgdHJhY2stPm1TZXNzaW9uSWQpOwogICAgICAgICAgICAgICAgIHRyYWNrc1RvUmVtb3ZlLT5hZGQodHJhY2spOwogICAgICAgICAgICAgICAgIHRyYWNrLT5pbnZhbGlkYXRlKCk7IC8vIGNvbnNpZGVyIGl0IGRlYWQuCiAgICAgICAgICAgICAgICAgY29udGludWU7CkBAIC00NDg5LDcgKzQ2MjUsNyBAQAogICAgICAgICAvLyBUT0RPOiBPTkxZIFVTRUQgRk9SIExFR0FDWSBSRVNBTVBMRVJTLCByZW1vdmUgd2hlbiB0aGV5IGFyZSByZW1vdmVkLgogICAgICAgICAvLyBhZGQgZnJhbWVzIGFscmVhZHkgY29uc3VtZWQgYnV0IG5vdCB5ZXQgcmVsZWFzZWQgYnkgdGhlIHJlc2FtcGxlcgogICAgICAgICAvLyBiZWNhdXNlIG1BdWRpb1RyYWNrU2VydmVyUHJveHktPmZyYW1lc1JlYWR5KCkgd2lsbCBpbmNsdWRlIHRoZXNlIGZyYW1lcwotICAgICAgICBkZXNpcmVkRnJhbWVzICs9IG1BdWRpb01peGVyLT5nZXRVbnJlbGVhc2VkRnJhbWVzKHRyYWNrLT5uYW1lKCkpOworICAgICAgICBkZXNpcmVkRnJhbWVzICs9IG1BdWRpb01peGVyLT5nZXRVbnJlbGVhc2VkRnJhbWVzKHRyYWNrSWQpOwogCiAgICAgICAgIHVpbnQzMl90IG1pbkZyYW1lcyA9IDE7CiAgICAgICAgIGlmICgodHJhY2stPnNoYXJlZEJ1ZmZlcigpID09IDApICYmICF0cmFjay0+aXNTdG9wcGVkKCkgJiYgIXRyYWNrLT5pc1BhdXNpbmcoKSAmJgpAQCAtNDUwMSwxMyArNDYzNywxMyBAQAogICAgICAgICBpZiAoQVRSQUNFX0VOQUJMRUQoKSkgewogICAgICAgICAgICAgLy8gSSB3aXNoIHdlIGhhZCBmb3JtYXR0ZWQgdHJhY2UgbmFtZXMKICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHRyYWNlTmFtZSgiblJkeSIpOwotICAgICAgICAgICAgdHJhY2VOYW1lICs9IHN0ZDo6dG9fc3RyaW5nKHRyYWNrLT5uYW1lKCkpOworICAgICAgICAgICAgdHJhY2VOYW1lICs9IHN0ZDo6dG9fc3RyaW5nKHRyYWNrSWQpOwogICAgICAgICAgICAgQVRSQUNFX0lOVCh0cmFjZU5hbWUuY19zdHIoKSwgZnJhbWVzUmVhZHkpOwogICAgICAgICB9CiAgICAgICAgIGlmICgoZnJhbWVzUmVhZHkgPj0gbWluRnJhbWVzKSAmJiB0cmFjay0+aXNSZWFkeSgpICYmCiAgICAgICAgICAgICAgICAgIXRyYWNrLT5pc1BhdXNlZCgpICYmICF0cmFjay0+aXNUZXJtaW5hdGVkKCkpCiAgICAgICAgIHsKLSAgICAgICAgICAgIEFMT0dWVigidHJhY2sgJWQgcz0lMDh4IFtPS10gb24gdGhyZWFkICVwIiwgbmFtZSwgY2Jsay0+bVNlcnZlciwgdGhpcyk7CisgICAgICAgICAgICBBTE9HVlYoInRyYWNrKCVkKSBzPSUwOHggW09LXSBvbiB0aHJlYWQgJXAiLCB0cmFja0lkLCBjYmxrLT5tU2VydmVyLCB0aGlzKTsKIAogICAgICAgICAgICAgbWl4ZWRUcmFja3MrKzsKIApAQCAtNDUyNCw5ICs0NjYwLDkgQEAKICAgICAgICAgICAgICAgICBpZiAoY2hhaW4gIT0gMCkgewogICAgICAgICAgICAgICAgICAgICB0cmFja3NXaXRoRWZmZWN0Kys7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1coInByZXBhcmVUcmFja3NfbCgpOiB0cmFjayAlZCBhdHRhY2hlZCB0byBlZmZlY3QgYnV0IG5vIGNoYWluIGZvdW5kIG9uICIKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coInByZXBhcmVUcmFja3NfbCgpOiB0cmFjayglZCkgYXR0YWNoZWQgdG8gZWZmZWN0IGJ1dCBubyBjaGFpbiBmb3VuZCBvbiAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNlc3Npb24gJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIHRyYWNrLT5zZXNzaW9uSWQoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tJZCwgdHJhY2stPnNlc3Npb25JZCgpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKQEAgLTQ1MzksNyArNDY3NSw3IEBACiAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5tU3RhdGUgPSBUcmFja0Jhc2U6OkFDVElWRTsKICAgICAgICAgICAgICAgICAgICAgcGFyYW0gPSBBdWRpb01peGVyOjpSQU1QX1ZPTFVNRTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpSRVNBTVBMRSwgQXVkaW9NaXhlcjo6UkVTRVQsIE5VTEwpOworICAgICAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRQYXJhbWV0ZXIodHJhY2tJZCwgQXVkaW9NaXhlcjo6UkVTQU1QTEUsIEF1ZGlvTWl4ZXI6OlJFU0VULCBOVUxMKTsKICAgICAgICAgICAgICAgICBtTGVmdFZvbEZsb2F0ID0gLTEuMDsKICAgICAgICAgICAgIC8vIEZJWE1FIHNob3VsZCBub3QgbWFrZSBhIGRlY2lzaW9uIGJhc2VkIG9uIG1TZXJ2ZXIKICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2Jsay0+bVNlcnZlciAhPSAwKSB7CkBAIC00NjM1LDIyICs0NzcxLDIyIEBACiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBYWFg6IHRoZXNlIHRoaW5ncyBET04nVCBuZWVkIHRvIGJlIGRvbmUgZWFjaCB0aW1lCi0gICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0QnVmZmVyUHJvdmlkZXIobmFtZSwgdHJhY2spOwotICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPmVuYWJsZShuYW1lKTsKKyAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRCdWZmZXJQcm92aWRlcih0cmFja0lkLCB0cmFjayk7CisgICAgICAgICAgICBtQXVkaW9NaXhlci0+ZW5hYmxlKHRyYWNrSWQpOwogCi0gICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIHBhcmFtLCBBdWRpb01peGVyOjpWT0xVTUUwLCAmdmxmKTsKLSAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgcGFyYW0sIEF1ZGlvTWl4ZXI6OlZPTFVNRTEsICZ2cmYpOwotICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBwYXJhbSwgQXVkaW9NaXhlcjo6QVVYTEVWRUwsICZ2YWYpOworICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcih0cmFja0lkLCBwYXJhbSwgQXVkaW9NaXhlcjo6Vk9MVU1FMCwgJnZsZik7CisgICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKHRyYWNrSWQsIHBhcmFtLCBBdWRpb01peGVyOjpWT0xVTUUxLCAmdnJmKTsKKyAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRQYXJhbWV0ZXIodHJhY2tJZCwgcGFyYW0sIEF1ZGlvTWl4ZXI6OkFVWExFVkVMLCAmdmFmKTsKICAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRQYXJhbWV0ZXIoCi0gICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICB0cmFja0lkLAogICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OlRSQUNLLAogICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OkZPUk1BVCwgKHZvaWQgKil0cmFjay0+Zm9ybWF0KCkpOwogICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcigKLSAgICAgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgICAgIHRyYWNrSWQsCiAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6VFJBQ0ssCiAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6Q0hBTk5FTF9NQVNLLCAodm9pZCAqKSh1aW50cHRyX3QpdHJhY2stPmNoYW5uZWxNYXNrKCkpOwogICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcigKLSAgICAgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgICAgIHRyYWNrSWQsCiAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6VFJBQ0ssCiAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6TUlYRVJfQ0hBTk5FTF9NQVNLLCAodm9pZCAqKSh1aW50cHRyX3QpbUNoYW5uZWxNYXNrKTsKICAgICAgICAgICAgIC8vIGxpbWl0IHRyYWNrIHNhbXBsZSByYXRlIHRvIDIgeCBvdXRwdXQgc2FtcGxlIHJhdGUsIHdoaWNoIGNoYW5nZXMgYXQgcmUtY29uZmlndXJhdGlvbgpAQCAtNDY2MiwxNCArNDc5OCwxNCBAQAogICAgICAgICAgICAgICAgIHJlcVNhbXBsZVJhdGUgPSBtYXhTYW1wbGVSYXRlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcigKLSAgICAgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgICAgIHRyYWNrSWQsCiAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6UkVTQU1QTEUsCiAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6U0FNUExFX1JBVEUsCiAgICAgICAgICAgICAgICAgKHZvaWQgKikodWludHB0cl90KXJlcVNhbXBsZVJhdGUpOwogCiAgICAgICAgICAgICBBdWRpb1BsYXliYWNrUmF0ZSBwbGF5YmFja1JhdGUgPSB0cmFjay0+bUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+Z2V0UGxheWJhY2tSYXRlKCk7CiAgICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKAotICAgICAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICAgICAgdHJhY2tJZCwKICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpUSU1FU1RSRVRDSCwKICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpQTEFZQkFDS19SQVRFLAogICAgICAgICAgICAgICAgICZwbGF5YmFja1JhdGUpOwpAQCAtNDY5MCwyNyArNDgyNiwyNyBAQAogICAgICAgICAgICAgICAgICAgICAmJiAodHJhY2stPm1haW5CdWZmZXIoKSA9PSBtU2lua0J1ZmZlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHRyYWNrLT5tYWluQnVmZmVyKCkgPT0gbU1peGVyQnVmZmVyKSkgewogICAgICAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRQYXJhbWV0ZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tJZCwKICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OlRSQUNLLAogICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6TUlYRVJfRk9STUFULCAodm9pZCAqKW1NaXhlckJ1ZmZlckZvcm1hdCk7CiAgICAgICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcigKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICB0cmFja0lkLAogICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6VFJBQ0ssCiAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpNQUlOX0JVRkZFUiwgKHZvaWQgKiltTWl4ZXJCdWZmZXIpOwogICAgICAgICAgICAgICAgIC8vIFRPRE86IG92ZXJyaWRlIHRyYWNrLT5tYWluQnVmZmVyKCk/CiAgICAgICAgICAgICAgICAgbU1peGVyQnVmZmVyVmFsaWQgPSB0cnVlOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpUUkFDSywKICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6Ok1JWEVSX0ZPUk1BVCwgKHZvaWQgKilFRkZFQ1RfQlVGRkVSX0ZPUk1BVCk7CiAgICAgICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcigKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICB0cmFja0lkLAogICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6VFJBQ0ssCiAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpNQUlOX0JVRkZFUiwgKHZvaWQgKil0cmFjay0+bWFpbkJ1ZmZlcigpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRQYXJhbWV0ZXIoCi0gICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICB0cmFja0lkLAogICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OlRSQUNLLAogICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OkFVWF9CVUZGRVIsICh2b2lkICopdHJhY2stPmF1eEJ1ZmZlcigpKTsKIApAQCAtNDcyNSwxMyArNDg2MSwxMyBAQAogICAgICAgICAgICAgICAgIG1peGVyU3RhdHVzID0gTUlYRVJfVFJBQ0tTX1JFQURZOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2l6ZV90IHVuZGVycnVuRnJhbWVzID0gMDsKICAgICAgICAgICAgIGlmIChmcmFtZXNSZWFkeSA8IGRlc2lyZWRGcmFtZXMgJiYgIXRyYWNrLT5pc1N0b3BwZWQoKSAmJiAhdHJhY2stPmlzUGF1c2VkKCkpIHsKLSAgICAgICAgICAgICAgICBBTE9HVigidHJhY2soJXApIHVuZGVycnVuLCAgZnJhbWVzUmVhZHkoJXp1KSA8IGZyYW1lc0Rlc2lyZWQoJXpkKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICB0cmFjaywgZnJhbWVzUmVhZHksIGRlc2lyZWRGcmFtZXMpOwotICAgICAgICAgICAgICAgIHRyYWNrLT5tQXVkaW9UcmFja1NlcnZlclByb3h5LT50YWxseVVuZGVycnVuRnJhbWVzKGRlc2lyZWRGcmFtZXMpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0cmFjay0+bUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+dGFsbHlVbmRlcnJ1bkZyYW1lcygwKTsKKyAgICAgICAgICAgICAgICBBTE9HVigidHJhY2soJWQpIHVuZGVycnVuLCAgZnJhbWVzUmVhZHkoJXp1KSA8IGZyYW1lc0Rlc2lyZWQoJXpkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICB0cmFja0lkLCBmcmFtZXNSZWFkeSwgZGVzaXJlZEZyYW1lcyk7CisgICAgICAgICAgICAgICAgdW5kZXJydW5GcmFtZXMgPSBkZXNpcmVkRnJhbWVzOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVmZXJyZWRPcGVyYXRpb25zLnRhbGx5VW5kZXJydW5GcmFtZXModHJhY2ssIHVuZGVycnVuRnJhbWVzKTsKIAogICAgICAgICAgICAgLy8gY2xlYXIgZWZmZWN0IGNoYWluIGlucHV0IGJ1ZmZlciBpZiBhbiBhY3RpdmUgdHJhY2sgdW5kZXJydW5zIHRvIGF2b2lkIHNlbmRpbmcKICAgICAgICAgICAgIC8vIHByZXZpb3VzIGF1ZGlvIGJ1ZmZlciBhZ2FpbiB0byBlZmZlY3RzCkBAIC00NzQwLDcgKzQ4NzYsNyBAQAogICAgICAgICAgICAgICAgIGNoYWluLT5jbGVhcklucHV0QnVmZmVyKCk7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIEFMT0dWVigidHJhY2sgJWQgcz0lMDh4IFtOT1QgUkVBRFldIG9uIHRocmVhZCAlcCIsIG5hbWUsIGNibGstPm1TZXJ2ZXIsIHRoaXMpOworICAgICAgICAgICAgQUxPR1ZWKCJ0cmFjayglZCkgcz0lMDh4IFtOT1QgUkVBRFldIG9uIHRocmVhZCAlcCIsIHRyYWNrSWQsIGNibGstPm1TZXJ2ZXIsIHRoaXMpOwogICAgICAgICAgICAgaWYgKCh0cmFjay0+c2hhcmVkQnVmZmVyKCkgIT0gMCkgfHwgdHJhY2stPmlzVGVybWluYXRlZCgpIHx8CiAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5pc1N0b3BwZWQoKSB8fCB0cmFjay0+aXNQYXVzZWQoKSkgewogICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgY29uc3VtZWQgYWxsIHRoZSBidWZmZXJzIG9mIHRoaXMgdHJhY2suCkBAIC00NzU5LDcgKzQ4OTUsOCBAQAogICAgICAgICAgICAgICAgIC8vIE5vIGJ1ZmZlcnMgZm9yIHRoaXMgdHJhY2suIEdpdmUgaXQgYSBmZXcgY2hhbmNlcyB0bwogICAgICAgICAgICAgICAgIC8vIGZpbGwgYSBidWZmZXIsIHRoZW4gcmVtb3ZlIGl0IGZyb20gYWN0aXZlIGxpc3QuCiAgICAgICAgICAgICAgICAgaWYgKC0tKHRyYWNrLT5tUmV0cnlDb3VudCkgPD0gMCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HSSgiQlVGRkVSIFRJTUVPVVQ6IHJlbW92ZSglZCkgZnJvbSBhY3RpdmUgbGlzdCBvbiB0aHJlYWQgJXAiLCBuYW1lLCB0aGlzKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0koIkJVRkZFUiBUSU1FT1VUOiByZW1vdmUoJWQpIGZyb20gYWN0aXZlIGxpc3Qgb24gdGhyZWFkICVwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja0lkLCB0aGlzKTsKICAgICAgICAgICAgICAgICAgICAgdHJhY2tzVG9SZW1vdmUtPmFkZCh0cmFjayk7CiAgICAgICAgICAgICAgICAgICAgIC8vIGluZGljYXRlIHRvIGNsaWVudCBwcm9jZXNzIHRoYXQgdGhlIHRyYWNrIHdhcyBkaXNhYmxlZCBiZWNhdXNlIG9mIHVuZGVycnVuOwogICAgICAgICAgICAgICAgICAgICAvLyBpdCB3aWxsIHRoZW4gYXV0b21hdGljYWxseSBjYWxsIHN0YXJ0KCkgd2hlbiBkYXRhIGlzIGF2YWlsYWJsZQpAQCAtNDc3Miw3ICs0OTA5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgbWl4ZXJTdGF0dXMgPSBNSVhFUl9UUkFDS1NfRU5BQkxFRDsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQXVkaW9NaXhlci0+ZGlzYWJsZShuYW1lKTsKKyAgICAgICAgICAgIG1BdWRpb01peGVyLT5kaXNhYmxlKHRyYWNrSWQpOwogICAgICAgICB9CiAKICAgICAgICAgfSAgIC8vIGxvY2FsIHZhcmlhYmxlIHNjb3BlIHRvIGF2b2lkIGdvdG8gd2FybmluZwpAQCAtNDgzMyw5ICs0OTcwLDkgQEAKICAgICAvLyBvZiBwcmVwYXJlVHJhY2tzX2woKTsgdGhpcyByZWxlYXNlcyBhbnkgb3V0c3RhbmRpbmcgYnVmZmVyIGJhY2sgdG8gdGhlIHRyYWNrLgogICAgIC8vIFNlZSBhbHNvIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBkZXN0cm95VHJhY2tfbCgpLgogICAgIGZvciAoY29uc3QgYXV0byAmdHJhY2sgOiAqdHJhY2tzVG9SZW1vdmUpIHsKLSAgICAgICAgY29uc3QgaW50IG5hbWUgPSB0cmFjay0+bmFtZSgpOwotICAgICAgICBpZiAobUF1ZGlvTWl4ZXItPmV4aXN0cyhuYW1lKSkgeyAvLyBOb3JtYWwgdHJhY2tzIGhlcmUsIGZhc3QgdHJhY2tzIGluIEZhc3RNaXhlci4KLSAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRCdWZmZXJQcm92aWRlcihuYW1lLCBudWxscHRyIC8qIGJ1ZmZlclByb3ZpZGVyICovKTsKKyAgICAgICAgY29uc3QgaW50IHRyYWNrSWQgPSB0cmFjay0+aWQoKTsKKyAgICAgICAgaWYgKG1BdWRpb01peGVyLT5leGlzdHModHJhY2tJZCkpIHsgLy8gTm9ybWFsIHRyYWNrcyBoZXJlLCBmYXN0IHRyYWNrcyBpbiBGYXN0TWl4ZXIuCisgICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0QnVmZmVyUHJvdmlkZXIodHJhY2tJZCwgbnVsbHB0ciAvKiBidWZmZXJQcm92aWRlciAqLyk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTUwMDQsMTcgKzUxNDEsMTcgQEAKICAgICAgICAgICAgIGRlbGV0ZSBtQXVkaW9NaXhlcjsKICAgICAgICAgICAgIG1BdWRpb01peGVyID0gbmV3IEF1ZGlvTWl4ZXIobU5vcm1hbEZyYW1lQ291bnQsIG1TYW1wbGVSYXRlKTsKICAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byAmdHJhY2sgOiBtVHJhY2tzKSB7Ci0gICAgICAgICAgICAgICAgY29uc3QgaW50IG5hbWUgPSB0cmFjay0+bmFtZSgpOworICAgICAgICAgICAgICAgIGNvbnN0IGludCB0cmFja0lkID0gdHJhY2stPmlkKCk7CiAgICAgICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbUF1ZGlvTWl4ZXItPmNyZWF0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICB0cmFja0lkLAogICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2stPm1DaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5tRm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2stPm1TZXNzaW9uSWQpOwogICAgICAgICAgICAgICAgIEFMT0dXX0lGKHN0YXR1cyAhPSBOT19FUlJPUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICIlczogY2Fubm90IGNyZWF0ZSB0cmFjayBuYW1lIgotICAgICAgICAgICAgICAgICAgICAgICAgIiAlZCwgbWFzayAlI3gsIGZvcm1hdCAlI3gsIHNlc3Npb25JZCAlZCBpbiBBdWRpb01peGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICIlcygpOiBBdWRpb01peGVyIGNhbm5vdCBjcmVhdGUgdHJhY2soJWQpIgorICAgICAgICAgICAgICAgICAgICAgICAgIiBtYXNrICUjeCwgZm9ybWF0ICUjeCwgc2Vzc2lvbklkICVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgdHJhY2stPm1DaGFubmVsTWFzaywgdHJhY2stPm1Gb3JtYXQsIHRyYWNrLT5tU2Vzc2lvbklkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrSWQsIHRyYWNrLT5tQ2hhbm5lbE1hc2ssIHRyYWNrLT5tRm9ybWF0LCB0cmFjay0+bVNlc3Npb25JZCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzZW5kSW9Db25maWdFdmVudF9sKEFVRElPX09VVFBVVF9DT05GSUdfQ0hBTkdFRCk7CiAgICAgICAgIH0KQEAgLTUwMzAsNiArNTE2NywxMiBAQAogICAgIGRwcmludGYoZmQsICIgIFRocmVhZCB0aHJvdHRsZSB0aW1lIChtc2Vjcyk6ICV1XG4iLCBtVGhyZWFkVGhyb3R0bGVUaW1lTXMpOwogICAgIGRwcmludGYoZmQsICIgIEF1ZGlvTWl4ZXIgdHJhY2tzOiAlc1xuIiwgbUF1ZGlvTWl4ZXItPnRyYWNrTmFtZXMoKS5jX3N0cigpKTsKICAgICBkcHJpbnRmKGZkLCAiICBNYXN0ZXIgbW9ubzogJXNcbiIsIG1NYXN0ZXJNb25vID8gIm9uIiA6ICJvZmYiKTsKKyAgICBjb25zdCBkb3VibGUgbGF0ZW5jeU1zID0gbVRpbWVzdGFtcC5nZXRPdXRwdXRTZXJ2ZXJMYXRlbmN5TXMobVNhbXBsZVJhdGUpOworICAgIGlmIChsYXRlbmN5TXMgIT0gMC4pIHsKKyAgICAgICAgZHByaW50ZihmZCwgIiAgTm9ybWFsTWl4ZXIgbGF0ZW5jeSBtczogJS4ybGZcbiIsIGxhdGVuY3lNcyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZHByaW50ZihmZCwgIiAgTm9ybWFsTWl4ZXIgbGF0ZW5jeSBtczogdW5hdmFpbFxuIik7CisgICAgfQogCiAgICAgaWYgKGhhc0Zhc3RNaXhlcigpKSB7CiAgICAgICAgIGRwcmludGYoZmQsICIgIEZhc3RNaXhlciB0aHJlYWQgJXAgdGlkPSVkIiwgbUZhc3RNaXhlci5nZXQoKSwgbUZhc3RNaXhlci0+Z2V0VGlkKCkpOwpAQCAtNTAzOCw5ICs1MTgxLDkgQEAKICAgICAgICAgLy8gd2hpbGUgd2UgYXJlIGR1bXBpbmcgaXQuICBJdCBtYXkgYmUgaW5jb25zaXN0ZW50LCBidXQgaXQgd29uJ3QgbXV0YXRlIQogICAgICAgICAvLyBUaGlzIGlzIGEgbGFyZ2Ugb2JqZWN0IHNvIHdlIHBsYWNlIGl0IG9uIHRoZSBoZWFwLgogICAgICAgICAvLyBGSVhNRSAyNTk3Mjk1ODogTmVlZCBhbiBpbnRlbGxpZ2VudCBjb3B5IGNvbnN0cnVjdG9yIHRoYXQgZG9lcyBub3QgdG91Y2ggdW51c2VkIHBhZ2VzLgotICAgICAgICBjb25zdCBGYXN0TWl4ZXJEdW1wU3RhdGUgKmNvcHkgPSBuZXcgRmFzdE1peGVyRHVtcFN0YXRlKG1GYXN0TWl4ZXJEdW1wU3RhdGUpOworICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8RmFzdE1peGVyRHVtcFN0YXRlPiBjb3B5ID0KKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPEZhc3RNaXhlckR1bXBTdGF0ZT4obUZhc3RNaXhlckR1bXBTdGF0ZSk7CiAgICAgICAgIGNvcHktPmR1bXAoZmQpOwotICAgICAgICBkZWxldGUgY29weTsKIAogI2lmZGVmIFNUQVRFX1FVRVVFX0RVTVAKICAgICAgICAgLy8gU2ltaWxhciBmb3Igc3RhdGUgcXVldWUKQEAgLTUwNjEsMTIgKzUyMDQsNiBAQAogICAgIH0gZWxzZSB7CiAgICAgICAgIGRwcmludGYoZmQsICIgIE5vIEZhc3RNaXhlclxuIik7CiAgICAgfQotCi0jaWZkZWYgVEVFX1NJTksKLSAgICAvLyBXcml0ZSB0aGUgdGVlIG91dHB1dCB0byBhIC53YXYgZmlsZQotICAgIGR1bXBUZWUoZmQsIG1UZWVTb3VyY2UsIG1JZCwgJ00nKTsKLSNlbmRpZgotCiB9CiAKIHVpbnQzMl90IEF1ZGlvRmxpbmdlcjo6TWl4ZXJUaHJlYWQ6OmlkbGVTbGVlcFRpbWVVcygpIGNvbnN0CkBAIC01MjUzLDcgKzUzOTAsNyBAQAogICAgICAgICBpZiAoKHRyYWNrLT5mcmFtZXNSZWFkeSgpID49IG1pbkZyYW1lcykgJiYgdHJhY2stPmlzUmVhZHkoKSAmJiAhdHJhY2stPmlzUGF1c2VkKCkgJiYKICAgICAgICAgICAgICAgICAhdHJhY2stPmlzU3RvcHBpbmdfMigpICYmICF0cmFjay0+aXNTdG9wcGVkKCkpCiAgICAgICAgIHsKLSAgICAgICAgICAgIEFMT0dWVigidHJhY2sgJWQgcz0lMDh4IFtPS10iLCB0cmFjay0+bmFtZSgpLCBjYmxrLT5tU2VydmVyKTsKKyAgICAgICAgICAgIEFMT0dWVigidHJhY2soJWQpIHM9JTA4eCBbT0tdIiwgdHJhY2stPmlkKCksIGNibGstPm1TZXJ2ZXIpOwogCiAgICAgICAgICAgICBpZiAodHJhY2stPm1GaWxsaW5nVXBTdGF0dXMgPT0gVHJhY2s6OkZTX0ZJTExFRCkgewogICAgICAgICAgICAgICAgIHRyYWNrLT5tRmlsbGluZ1VwU3RhdHVzID0gVHJhY2s6OkZTX0FDVElWRTsKQEAgLTUzMjksNyArNTQ2Niw3IEBACiAgICAgICAgICAgICAgICAgLy8gZmlsbCBhIGJ1ZmZlciwgdGhlbiByZW1vdmUgaXQgZnJvbSBhY3RpdmUgbGlzdC4KICAgICAgICAgICAgICAgICAvLyBPbmx5IGNvbnNpZGVyIGxhc3QgdHJhY2sgc3RhcnRlZCBmb3IgbWl4ZXIgc3RhdGUgY29udHJvbAogICAgICAgICAgICAgICAgIGlmICgtLSh0cmFjay0+bVJldHJ5Q291bnQpIDw9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkJVRkZFUiBUSU1FT1VUOiByZW1vdmUoJWQpIGZyb20gYWN0aXZlIGxpc3QiLCB0cmFjay0+bmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkJVRkZFUiBUSU1FT1VUOiByZW1vdmUgdHJhY2soJWQpIGZyb20gYWN0aXZlIGxpc3QiLCB0cmFjay0+aWQoKSk7CiAgICAgICAgICAgICAgICAgICAgIHRyYWNrc1RvUmVtb3ZlLT5hZGQodHJhY2spOwogICAgICAgICAgICAgICAgICAgICAvLyBpbmRpY2F0ZSB0byBjbGllbnQgcHJvY2VzcyB0aGF0IHRoZSB0cmFjayB3YXMgZGlzYWJsZWQgYmVjYXVzZSBvZiB1bmRlcnJ1bjsKICAgICAgICAgICAgICAgICAgICAgLy8gaXQgd2lsbCB0aGVuIGF1dG9tYXRpY2FsbHkgY2FsbCBzdGFydCgpIHdoZW4gZGF0YSBpcyBhdmFpbGFibGUKQEAgLTU1NjgsNiArNTcwNSw3IEBACiAgICAgbU91dHB1dC0+Zmx1c2goKTsKICAgICBtSHdQYXVzZWQgPSBmYWxzZTsKICAgICBtRmx1c2hQZW5kaW5nID0gZmFsc2U7CisgICAgbVRpbWVzdGFtcFZlcmlmaWVyLmRpc2NvbnRpbnVpdHkoKTsgLy8gRElSRUNUIGFuZCBPRkZMT0FERUQgZmx1c2ggcmVzZXRzIGZyYW1lIGNvdW50LgogfQogCiBpbnQ2NF90IEF1ZGlvRmxpbmdlcjo6RGlyZWN0T3V0cHV0VGhyZWFkOjpjb21wdXRlV2FpdFRpbWVOc19sKCkgY29uc3QgewpAQCAtNTgxMSw3ICs1OTQ5LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfSAgZWxzZSBpZiAodHJhY2stPmZyYW1lc1JlYWR5KCkgJiYgdHJhY2stPmlzUmVhZHkoKSAmJgogICAgICAgICAgICAgICAgICF0cmFjay0+aXNQYXVzZWQoKSAmJiAhdHJhY2stPmlzVGVybWluYXRlZCgpICYmICF0cmFjay0+aXNTdG9wcGluZ18yKCkpIHsKLSAgICAgICAgICAgIEFMT0dWVigiT2ZmbG9hZFRocmVhZDogdHJhY2sgJWQgcz0lMDh4IFtPS10iLCB0cmFjay0+bmFtZSgpLCBjYmxrLT5tU2VydmVyKTsKKyAgICAgICAgICAgIEFMT0dWVigiT2ZmbG9hZFRocmVhZDogdHJhY2soJWQpIHM9JTA4eCBbT0tdIiwgdHJhY2stPmlkKCksIGNibGstPm1TZXJ2ZXIpOwogICAgICAgICAgICAgaWYgKHRyYWNrLT5tRmlsbGluZ1VwU3RhdHVzID09IFRyYWNrOjpGU19GSUxMRUQpIHsKICAgICAgICAgICAgICAgICB0cmFjay0+bUZpbGxpbmdVcFN0YXR1cyA9IFRyYWNrOjpGU19BQ1RJVkU7CiAgICAgICAgICAgICAgICAgaWYgKGxhc3QpIHsKQEAgLTU4NTUsNyArNTk5Myw3IEBACiAgICAgICAgICAgICAgICAgbWl4ZXJTdGF0dXMgPSBNSVhFUl9UUkFDS1NfUkVBRFk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HVlYoIk9mZmxvYWRUaHJlYWQ6IHRyYWNrICVkIHM9JTA4eCBbTk9UIFJFQURZXSIsIHRyYWNrLT5uYW1lKCksIGNibGstPm1TZXJ2ZXIpOworICAgICAgICAgICAgQUxPR1ZWKCJPZmZsb2FkVGhyZWFkOiB0cmFjayglZCkgcz0lMDh4IFtOT1QgUkVBRFldIiwgdHJhY2stPmlkKCksIGNibGstPm1TZXJ2ZXIpOwogICAgICAgICAgICAgaWYgKHRyYWNrLT5pc1N0b3BwaW5nXzEoKSkgewogICAgICAgICAgICAgICAgIGlmICgtLSh0cmFjay0+bVJldHJ5Q291bnQpIDw9IDApIHsKICAgICAgICAgICAgICAgICAgICAgLy8gSGFyZHdhcmUgYnVmZmVyIGNhbiBob2xkIGEgbGFyZ2UgYW1vdW50IG9mIGF1ZGlvIHNvIHdlIG11c3QKQEAgLTU5MDIsNiArNjA0MCwxNCBAQAogICAgICAgICAgICAgICAgICAgICB0cmFjay0+cHJlc2VudGF0aW9uQ29tcGxldGUoZnJhbWVzV3JpdHRlbiwgYXVkaW9IQUxGcmFtZXMpOwogICAgICAgICAgICAgICAgICAgICB0cmFjay0+cmVzZXQoKTsKICAgICAgICAgICAgICAgICAgICAgdHJhY2tzVG9SZW1vdmUtPmFkZCh0cmFjayk7CisgICAgICAgICAgICAgICAgICAgIC8vIERJUkVDVCBhbmQgT0ZGTE9BREVEIHN0b3AgcmVzZXRzIGZyYW1lIGNvdW50cy4KKyAgICAgICAgICAgICAgICAgICAgaWYgKCFtVXNlQXN5bmNXcml0ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgd2UgZG9uJ3QgZ2V0IGV4cGxpY2l0IGRyYWluIG5vdGlmaWNhdGlvbiB3ZSBtdXN0CisgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWdpc3RlciBkaXNjb250aW51aXR5IHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGlzIGlzCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcHJldmlvdXMgKCFsYXN0KSBvciB0aGUgdXBjb21pbmcgKGxhc3QpIHRyYWNrCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0byBhdm9pZCBza2lwcGluZyB0aGUgZGlzY29udGludWl0eS4KKyAgICAgICAgICAgICAgICAgICAgICAgIG1UaW1lc3RhbXBWZXJpZmllci5kaXNjb250aW51aXR5KCk7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIC8vIE5vIGJ1ZmZlcnMgZm9yIHRoaXMgdHJhY2suIEdpdmUgaXQgYSBmZXcgY2hhbmNlcyB0bwpAQCAtNTkyMyw4ICs2MDY5LDggQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bm5pbmcpIHsgLy8gc3RpbGwgcnVubmluZywgZ2l2ZSB1cyBtb3JlIHRpbWUuCiAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+bVJldHJ5Q291bnQgPSBrTWF4VHJhY2tSZXRyaWVzT2ZmbG9hZDsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJPZmZsb2FkVGhyZWFkOiBCVUZGRVIgVElNRU9VVDogcmVtb3ZlKCVkKSBmcm9tIGFjdGl2ZSBsaXN0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2stPm5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiT2ZmbG9hZFRocmVhZDogQlVGRkVSIFRJTUVPVVQ6IHJlbW92ZSB0cmFjayglZCkgZnJvbSBhY3RpdmUgbGlzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5pZCgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrc1RvUmVtb3ZlLT5hZGQodHJhY2spOwogICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGVsbCBjbGllbnQgcHJvY2VzcyB0aGF0IHRoZSB0cmFjayB3YXMgZGlzYWJsZWQgYmVjYXVzZSBvZiB1bmRlcnJ1bjsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGl0IHdpbGwgdGhlbiBhdXRvbWF0aWNhbGx5IGNhbGwgc3RhcnQoKSB3aGVuIGRhdGEgaXMgYXZhaWxhYmxlCkBAIC02MDY3LDcgKzYyMTMsMjIgQEAKIHNzaXplX3QgQXVkaW9GbGluZ2VyOjpEdXBsaWNhdGluZ1RocmVhZDo6dGhyZWFkTG9vcF93cml0ZSgpCiB7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvdXRwdXRUcmFja3Muc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgb3V0cHV0VHJhY2tzW2ldLT53cml0ZShtU2lua0J1ZmZlciwgd3JpdGVGcmFtZXMpOworICAgICAgICBjb25zdCBzc2l6ZV90IGFjdHVhbFdyaXR0ZW4gPSBvdXRwdXRUcmFja3NbaV0tPndyaXRlKG1TaW5rQnVmZmVyLCB3cml0ZUZyYW1lcyk7CisKKyAgICAgICAgLy8gQ29uc2lkZXIgdGhlIGZpcnN0IE91dHB1dFRyYWNrIGZvciB0aW1lc3RhbXAgYW5kIGZyYW1lIGNvdW50aW5nLgorCisgICAgICAgIC8vIFRoZSB0aHJlYWRMb29wKCkgZ2VuZXJhbGx5IGFzc3VtZXMgd3JpdGluZyBhIGZ1bGwgc2luayBidWZmZXIgc2l6ZSBhdCBhIHRpbWUuCisgICAgICAgIC8vIEhlcmUsIHdlIGNvcnJlY3QgZm9yIHdyaXRlRnJhbWVzIG9mIDAgKGEgc3RvcCkgb3IgdW5kZXJydW5zIGJlY2F1c2UKKyAgICAgICAgLy8gd2UgYWx3YXlzIGNsYWltIHN1Y2Nlc3MuCisgICAgICAgIGlmIChpID09IDApIHsKKyAgICAgICAgICAgIGNvbnN0IHNzaXplX3QgY29ycmVjdGlvbiA9IG1TaW5rQnVmZmVyU2l6ZSAvIG1GcmFtZVNpemUgLSBhY3R1YWxXcml0dGVuOworICAgICAgICAgICAgQUxPR0RfSUYoY29ycmVjdGlvbiAhPSAwICYmIHdyaXRlRnJhbWVzICE9IDAsCisgICAgICAgICAgICAgICAgICAgICIlczogd3JpdGVGcmFtZXM6JXUgIGFjdHVhbFdyaXR0ZW46JXpkICBjb3JyZWN0aW9uOiV6ZCAgbUZyYW1lc1dyaXR0ZW46JWxsZCIsCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCB3cml0ZUZyYW1lcywgYWN0dWFsV3JpdHRlbiwgY29ycmVjdGlvbiwgKGxvbmcgbG9uZyltRnJhbWVzV3JpdHRlbik7CisgICAgICAgICAgICBtRnJhbWVzV3JpdHRlbiAtPSBjb3JyZWN0aW9uOworICAgICAgICB9CisKKyAgICAgICAgLy8gVE9ETzogUmVwb3J0IGNvcnJlY3Rpb24gZm9yIHRoZSBvdGhlciBvdXRwdXQgdHJhY2tzIGFuZCBzaG93IGluIHRoZSBkdW1wLgogICAgIH0KICAgICBtU3RhbmRieSA9IGZhbHNlOwogICAgIHJldHVybiAoc3NpemVfdCltU2lua0J1ZmZlclNpemU7CkBAIC02MDkyLDcgKzYyNTMsNyBAQAogICAgICAgICBzcyA8PCAiOiI7CiAgICAgICAgIGZvciAoY29uc3QgYXV0byAmdHJhY2sgOiBtT3V0cHV0VHJhY2tzKSB7CiAgICAgICAgICAgICBjb25zdCBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSB0cmFjay0+dGhyZWFkKCkucHJvbW90ZSgpOwotICAgICAgICAgICAgc3MgPDwgIiAoIiA8PCB0cmFjay0+bmFtZSgpIDw8ICIgOiAiOworICAgICAgICAgICAgc3MgPDwgIiAoIiA8PCB0cmFjay0+aWQoKSA8PCAiIDogIjsKICAgICAgICAgICAgIGlmICh0aHJlYWQuZ2V0KCkgIT0gbnVsbHB0cikgewogICAgICAgICAgICAgICAgIHNzIDw8IHRocmVhZC5nZXQoKSA8PCAiLCAiIDw8IHRocmVhZC0+aWQoKTsKICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC02MjMyLDkgKzYzOTMsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3Qgb3V0RGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgaW5EZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3lzdGVtUmVhZHkKLSNpZmRlZiBURUVfU0lOSwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIGNvbnN0IHNwPE5CQUlPX1Npbms+JiB0ZWVTaW5rCi0jZW5kaWYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSA6CiAgICAgVGhyZWFkQmFzZShhdWRpb0ZsaW5nZXIsIGlkLCBvdXREZXZpY2UsIGluRGV2aWNlLCBSRUNPUkQsIHN5c3RlbVJlYWR5KSwKICAgICBtSW5wdXQoaW5wdXQpLApAQCAtNjI0Miw5ICs2NDAwLDYgQEAKICAgICBtUnNtcEluQnVmZmVyKE5VTEwpLAogICAgIC8vIG1Sc21wSW5GcmFtZXMsIG1Sc21wSW5GcmFtZXNQMiwgYW5kIG1Sc21wSW5GcmFtZXNPQSBhcmUgc2V0IGJ5IHJlYWRJbnB1dFBhcmFtZXRlcnNfbCgpCiAgICAgbVJzbXBJblJlYXIoMCkKLSNpZmRlZiBURUVfU0lOSwotICAgICwgbVRlZVNpbmsodGVlU2luaykKLSNlbmRpZgogICAgICwgbVJlYWRPbmx5SGVhcChuZXcgTWVtb3J5RGVhbGVyKGtSZWNvcmRUaHJlYWRSZWFkT25seUhlYXBTaXplLAogICAgICAgICAgICAgIlJlY29yZFRocmVhZFJPIiwgTWVtb3J5SGVhcEJhc2U6OlJFQURfT05MWSkpCiAgICAgLy8gbUZhc3RDYXB0dXJlIGJlbG93CkBAIC02MjYxLDggKzY0MTYsMjAgQEAKICAgICBzbnByaW50ZihtVGhyZWFkTmFtZSwga1RocmVhZE5hbWVMZW5ndGgsICJBdWRpb0luXyVYIiwgaWQpOwogICAgIG1OQkxvZ1dyaXRlciA9IGF1ZGlvRmxpbmdlci0+bmV3V3JpdGVyX2woa0xvZ1NpemUsIG1UaHJlYWROYW1lKTsKIAorICAgIGlmIChtSW5wdXQgIT0gbnVsbHB0ciAmJiBtSW5wdXQtPmF1ZGlvSHdEZXYgIT0gbnVsbHB0cikgeworICAgICAgICBtSXNNc2REZXZpY2UgPSBzdHJjbXAoCisgICAgICAgICAgICAgICAgbUlucHV0LT5hdWRpb0h3RGV2LT5tb2R1bGVOYW1lKCksIEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9NU0QpID09IDA7CisgICAgfQorCiAgICAgcmVhZElucHV0UGFyYW1ldGVyc19sKCk7CiAKKyAgICAvLyBUT0RPOiBXZSBtYXkgYWxzbyBtYXRjaCBvbiBhZGRyZXNzIGFzIHdlbGwgYXMgZGV2aWNlIHR5cGUgZm9yCisgICAgLy8gQVVESU9fREVWSUNFX0lOX0JVUywgQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9BMkRQLCBBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWAorICAgIG1UaW1lc3RhbXBDb3JyZWN0ZWREZXZpY2VzID0gKGF1ZGlvX2RldmljZXNfdClwcm9wZXJ0eV9nZXRfaW50NjQoCisgICAgICAgICAgICAiYXVkaW8udGltZXN0YW1wLmNvcnJlY3RlZF9pbnB1dF9kZXZpY2VzIiwKKyAgICAgICAgICAgIChpbnQ2NF90KShtSXNNc2REZXZpY2UgPyBBVURJT19ERVZJQ0VfSU5fQlVTIC8vIHR1cm4gb24gYnkgZGVmYXVsdCBmb3IgTVNECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQVVESU9fREVWSUNFX05PTkUpKTsKKwogICAgIC8vIGNyZWF0ZSBhbiBOQkFJTyBzb3VyY2UgZm9yIHRoZSBIQUwgaW5wdXQgc3RyZWFtLCBhbmQgbmVnb3RpYXRlCiAgICAgbUlucHV0U291cmNlID0gbmV3IEF1ZGlvU3RyZWFtSW5Tb3VyY2UoaW5wdXQtPnN0cmVhbSk7CiAgICAgc2l6ZV90IG51bUNvdW50ZXJPZmZlcnMgPSAwOwpAQCAtNjM1OSw3ICs2NTI2LDcgQEAKICAgICAgICAgLy8gc3RhcnQgdGhlIGZhc3QgY2FwdHVyZQogICAgICAgICBtRmFzdENhcHR1cmUtPnJ1bigiRmFzdENhcHR1cmUiLCBBTkRST0lEX1BSSU9SSVRZX1VSR0VOVF9BVURJTyk7CiAgICAgICAgIHBpZF90IHRpZCA9IG1GYXN0Q2FwdHVyZS0+Z2V0VGlkKCk7Ci0gICAgICAgIHNlbmRQcmlvQ29uZmlnRXZlbnQoZ2V0cGlkX2NhY2hlZCwgdGlkLCBrUHJpb3JpdHlGYXN0Q2FwdHVyZSwgZmFsc2UgLypmb3JBcHAqLyk7CisgICAgICAgIHNlbmRQcmlvQ29uZmlnRXZlbnQoZ2V0cGlkKCksIHRpZCwga1ByaW9yaXR5RmFzdENhcHR1cmUsIGZhbHNlIC8qZm9yQXBwKi8pOwogICAgICAgICBzdHJlYW0oKS0+c2V0SGFsVGhyZWFkUHJpb3JpdHkoa1ByaW9yaXR5RmFzdENhcHR1cmUpOwogI2lmZGVmIEFVRElPX1dBVENIRE9HCiAgICAgICAgIC8vIEZJWE1FCkBAIC02MzY3LDYgKzY1MzQsMTAgQEAKIAogICAgICAgICBtRmFzdFRyYWNrQXZhaWwgPSB0cnVlOwogICAgIH0KKyNpZmRlZiBURUVfU0lOSworICAgIG1UZWUuc2V0KG1JbnB1dFNvdXJjZS0+Zm9ybWF0KCksIE5CQUlPX1RlZTo6VEVFX0ZMQUdfSU5QVVRfVEhSRUFEKTsKKyAgICBtVGVlLnNldElkKHN0ZDo6c3RyaW5nKCJfIikgKyBzdGQ6OnRvX3N0cmluZyhtSWQpICsgIl9DIik7CisjZW5kaWYKIGZhaWxlZDogOwogCiAgICAgLy8gRklYTUUgbU5vcm1hbFNvdXJjZQpAQCAtNjQ5NCw2ICs2NjY1LDcgQEAKIAogICAgICAgICAgICAgICAgIGNhc2UgVHJhY2tCYXNlOjpQQVVTSU5HOgogICAgICAgICAgICAgICAgICAgICBtQWN0aXZlVHJhY2tzLnJlbW92ZShhY3RpdmVUcmFjayk7CisgICAgICAgICAgICAgICAgICAgIGFjdGl2ZVRyYWNrLT5tU3RhdGUgPSBUcmFja0Jhc2U6OlBBVVNFRDsKICAgICAgICAgICAgICAgICAgICAgZG9Ccm9hZGNhc3QgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICBzaXplLS07CiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwpAQCAtNjUxNSwxMiArNjY4NywxMiBAQAogICAgICAgICAgICAgICAgICAgICBhbGxTdG9wcGVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogCi0gICAgICAgICAgICAgICAgY2FzZSBUcmFja0Jhc2U6OklETEU6Ci0gICAgICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0KKyAgICAgICAgICAgICAgICBjYXNlIFRyYWNrQmFzZTo6SURMRTogICAgLy8gY2Fubm90IGJlIG9uIEFjdGl2ZVRyYWNrcyBpZiBpZGxlCisgICAgICAgICAgICAgICAgY2FzZSBUcmFja0Jhc2U6OlBBVVNFRDogIC8vIGNhbm5vdCBiZSBvbiBBY3RpdmVUcmFja3MgaWYgcGF1c2VkCisgICAgICAgICAgICAgICAgY2FzZSBUcmFja0Jhc2U6OlNUT1BQRUQ6IC8vIGNhbm5vdCBiZSBvbiBBY3RpdmVUcmFja3MgaWYgZGVzdHJveWVkL3Rlcm1pbmF0ZWQKICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJVbmV4cGVjdGVkIGFjdGl2ZVRyYWNrU3RhdGUgJWQiLCBhY3RpdmVUcmFja1N0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiJXM6IFVuZXhwZWN0ZWQgYWN0aXZlIHRyYWNrIHN0YXRlOiVkLCBpZDolZCwgdHJhY2tzOiV6dSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGFjdGl2ZVRyYWNrU3RhdGUsIGFjdGl2ZVRyYWNrLT5pZCgpLCBzaXplKTsKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBhY3RpdmVUcmFja3MuYWRkKGFjdGl2ZVRyYWNrKTsKQEAgLTY1NDUsNyArNjcxNyw3IEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8vIHNsZWVwIGlmIHRoZXJlIGFyZSBubyBhY3RpdmUgdHJhY2tzIHRvIHByb2Nlc3MKLSAgICAgICAgICAgIGlmIChhY3RpdmVUcmFja3Muc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgIGlmIChhY3RpdmVUcmFja3MuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgaWYgKHNsZWVwVXMgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICBzbGVlcFVzID0ga1JlY29yZFRocmVhZFNsZWVwVXM7CiAgICAgICAgICAgICAgICAgfQpAQCAtNjU5Niw2ICs2NzY4LDE0IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGRpZE1vZGlmeSA9IHRydWU7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyKiBhYnAgPSAoZmFzdFRyYWNrICE9IDAgJiYgZmFzdFRyYWNrLT5pc1BhdGNoVHJhY2soKSkgPworICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PEF1ZGlvQnVmZmVyUHJvdmlkZXIqPihmYXN0VHJhY2suZ2V0KCkpIDogbnVsbHB0cjsKKyAgICAgICAgICAgIGlmIChzdGF0ZS0+bUZhc3RQYXRjaFJlY29yZEJ1ZmZlclByb3ZpZGVyICE9IGFicCkgeworICAgICAgICAgICAgICAgIHN0YXRlLT5tRmFzdFBhdGNoUmVjb3JkQnVmZmVyUHJvdmlkZXIgPSBhYnA7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1GYXN0UGF0Y2hSZWNvcmRGb3JtYXQgPSBmYXN0VHJhY2sgPT0gMCA/CisgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfSU5WQUxJRCA6IGZhc3RUcmFjay0+Zm9ybWF0KCk7CisgICAgICAgICAgICAgICAgZGlkTW9kaWZ5ID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIHNxLT5lbmQoZGlkTW9kaWZ5KTsKICAgICAgICAgICAgIGlmIChkaWRNb2RpZnkpIHsKICAgICAgICAgICAgICAgICBzcS0+cHVzaChibG9jayk7CkBAIC02NjIxLDggKzY4MDEsNyBAQAogCiAgICAgICAgIC8vIElmIGFuIE5CQUlPIHNvdXJjZSBpcyBwcmVzZW50LCB1c2UgaXQgdG8gcmVhZCB0aGUgbm9ybWFsIGNhcHR1cmUncyBkYXRhCiAgICAgICAgIGlmIChtUGlwZVNvdXJjZSAhPSAwKSB7Ci0gICAgICAgICAgICBzaXplX3QgZnJhbWVzVG9SZWFkID0gbUJ1ZmZlclNpemUgLyBtRnJhbWVTaXplOwotICAgICAgICAgICAgZnJhbWVzVG9SZWFkID0gbWluKG1Sc21wSW5GcmFtZXNPQSAtIHJlYXIsIG1Sc21wSW5GcmFtZXNQMiAvIDIpOworICAgICAgICAgICAgc2l6ZV90IGZyYW1lc1RvUmVhZCA9IG1pbihtUnNtcEluRnJhbWVzT0EgLSByZWFyLCBtUnNtcEluRnJhbWVzUDIgLyAyKTsKIAogICAgICAgICAgICAgLy8gVGhlIGF1ZGlvIGZpZm8gcmVhZCgpIHJldHVybnMgT1ZFUlJVTiBvbiBvdmVyZmxvdywgYW5kIGFkdmFuY2VzIHRoZSByZWFkIHBvaW50ZXIKICAgICAgICAgICAgIC8vIHRvIHRoZSBmdWxsIGJ1ZmZlciBwb2ludCAoY2xlYXJpbmcgdGhlIG92ZXJmbG93IGNvbmRpdGlvbikuICBVcG9uIE9WRVJSVU4gZXJyb3IsCkBAIC02Njg0LDggKzY4NjMsMjQgQEAKICAgICAgICAgLy8gVXBkYXRlIHNlcnZlciB0aW1lc3RhbXAgd2l0aCBrZXJuZWwgc3RhdHMKICAgICAgICAgaWYgKG1QaXBlU291cmNlLmdldCgpID09IG51bGxwdHIgLyogZG9uJ3Qgb2J0YWluIGZvciBGYXN0Q2FwdHVyZSwgY291bGQgYmxvY2sgKi8pIHsKICAgICAgICAgICAgIGludDY0X3QgcG9zaXRpb24sIHRpbWU7Ci0gICAgICAgICAgICBpbnQgcmV0ID0gbUlucHV0LT5zdHJlYW0tPmdldENhcHR1cmVQb3NpdGlvbigmcG9zaXRpb24sICZ0aW1lKTsKLSAgICAgICAgICAgIGlmIChyZXQgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIGlmIChtU3RhbmRieSkgeworICAgICAgICAgICAgICAgIG1UaW1lc3RhbXBWZXJpZmllci5kaXNjb250aW51aXR5KCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1JbnB1dC0+c3RyZWFtLT5nZXRDYXB0dXJlUG9zaXRpb24oJnBvc2l0aW9uLCAmdGltZSkgPT0gTk9fRVJST1IKKyAgICAgICAgICAgICAgICAgICAgJiYgdGltZSA+IG1UaW1lc3RhbXAubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSkgeworCisgICAgICAgICAgICAgICAgbVRpbWVzdGFtcFZlcmlmaWVyLmFkZChwb3NpdGlvbiwgdGltZSwgbVNhbXBsZVJhdGUpOworCisgICAgICAgICAgICAgICAgLy8gQ29ycmVjdCB0aW1lc3RhbXBzCisgICAgICAgICAgICAgICAgaWYgKGlzVGltZXN0YW1wQ29ycmVjdGlvbkVuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiVFNfQkVGT1JFOiAlZCAlbGxkICVsbGQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkKCksIChsb25nIGxvbmcpdGltZSwgKGxvbmcgbG9uZylwb3NpdGlvbik7CisgICAgICAgICAgICAgICAgICAgIGF1dG8gY29ycmVjdGVkVGltZXN0YW1wID0gbVRpbWVzdGFtcFZlcmlmaWVyLmdldExhc3RDb3JyZWN0ZWRUaW1lc3RhbXAoKTsKKyAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBjb3JyZWN0ZWRUaW1lc3RhbXAubUZyYW1lczsKKyAgICAgICAgICAgICAgICAgICAgdGltZSA9IGNvcnJlY3RlZFRpbWVzdGFtcC5tVGltZU5zOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiVFNfQUZURVI6ICVkICVsbGQgJWxsZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQoKSwgKGxvbmcgbG9uZyl0aW1lLCAobG9uZyBsb25nKXBvc2l0aW9uKTsKKyAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICBtVGltZXN0YW1wLm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSA9IHBvc2l0aW9uOwogICAgICAgICAgICAgICAgIG1UaW1lc3RhbXAubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSA9IHRpbWU7CiAgICAgICAgICAgICAgICAgLy8gTm90ZTogSW4gZ2VuZXJhbCByZWNvcmQgYnVmZmVycyBzaG91bGQgdGVuZCB0byBiZSBlbXB0eSBpbgpAQCAtNjY5Myw2ICs2ODg4LDggQEAKICAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgIC8vIEFsc28sIGl0IGlzIG5vdCBhZHZhbnRhZ2VvdXMgdG8gY2FsbCBnZXRfcHJlc2VudGF0aW9uX3Bvc2l0aW9uIGR1cmluZyB0aGUgcmVhZAogICAgICAgICAgICAgICAgIC8vIGFzIHRoZSByZWFkIG9idGFpbnMgYSBsb2NrLCBwcmV2ZW50aW5nIHRoZSB0aW1lc3RhbXAgY2FsbCBmcm9tIGV4ZWN1dGluZy4KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbVRpbWVzdGFtcFZlcmlmaWVyLmVycm9yKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgLy8gVXNlIHRoaXMgdG8gdHJhY2sgdGltZXN0YW1wIGluZm9ybWF0aW9uCkBAIC02NzA4LDEwICs2OTA1LDExIEBACiAgICAgICAgICAgICBnb3RvIHVubG9jazsKICAgICAgICAgfQogICAgICAgICBBTE9HX0FTU0VSVChmcmFtZXNSZWFkID4gMCk7CisgICAgICAgIG1GcmFtZXNSZWFkICs9IGZyYW1lc1JlYWQ7CiAKLSAgICAgICAgaWYgKG1UZWVTaW5rICE9IDApIHsKLSAgICAgICAgICAgICh2b2lkKSBtVGVlU2luay0+d3JpdGUoKHVpbnQ4X3QqKW1Sc21wSW5CdWZmZXIgKyByZWFyICogbUZyYW1lU2l6ZSwgZnJhbWVzUmVhZCk7Ci0gICAgICAgIH0KKyNpZmRlZiBURUVfU0lOSworICAgICAgICAodm9pZCltVGVlLndyaXRlKCh1aW50OF90KiltUnNtcEluQnVmZmVyICsgcmVhciAqIG1GcmFtZVNpemUsIGZyYW1lc1JlYWQpOworI2VuZGlmCiAgICAgICAgIC8vIElmIGRlc3RpbmF0aW9uIGlzIG5vbi1jb250aWd1b3VzLCB3ZSBub3cgY29ycmVjdCBmb3IgcmVhZGluZyBwYXN0IGVuZCBvZiBidWZmZXIuCiAgICAgICAgIHsKICAgICAgICAgICAgIHNpemVfdCBwYXJ0MSA9IG1Sc21wSW5GcmFtZXNQMiAtIHJlYXI7CkBAIC02NzY5LDkgKzY5NjcsMzMgQEAKICAgICAgICAgICAgICAgICBmcmFtZXNPdXQgPSBtaW4oZnJhbWVzT3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb25GcmFtZXNQb3NzaWJsZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzSW4sIG1TYW1wbGVSYXRlLCBhY3RpdmVUcmFjay0+bVNhbXBsZVJhdGUpKTsKLSAgICAgICAgICAgICAgICAvLyBwcm9jZXNzIGZyYW1lcyBmcm9tIHRoZSBSZWNvcmRUaHJlYWQgYnVmZmVyIHByb3ZpZGVyIHRvIHRoZSBSZWNvcmRUcmFjayBidWZmZXIKLSAgICAgICAgICAgICAgICBmcmFtZXNPdXQgPSBhY3RpdmVUcmFjay0+bVJlY29yZEJ1ZmZlckNvbnZlcnRlci0+Y29udmVydCgKLSAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZVRyYWNrLT5tU2luay5yYXcsIGFjdGl2ZVRyYWNrLT5tUmVzYW1wbGVyQnVmZmVyUHJvdmlkZXIsIGZyYW1lc091dCk7CisKKyAgICAgICAgICAgICAgICBpZiAoYWN0aXZlVHJhY2stPmlzRGlyZWN0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gTm8gUmVjb3JkQnVmZmVyQ29udmVydGVyIHVzZWQgZm9yIGRpcmVjdCBzdHJlYW1zLiBQYXNzCisgICAgICAgICAgICAgICAgICAgIC8vIHN0cmFpZ2h0IGZyb20gUmVjb3JkVGhyZWFkIGJ1ZmZlciB0byBSZWNvcmRUcmFjayBidWZmZXIuCisgICAgICAgICAgICAgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciBidWZmZXI7CisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5mcmFtZUNvdW50ID0gZnJhbWVzT3V0OworICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBhY3RpdmVUcmFjay0+bVJlc2FtcGxlckJ1ZmZlclByb3ZpZGVyLT5nZXROZXh0QnVmZmVyKCZidWZmZXIpOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IE9LICYmIGJ1ZmZlci5mcmFtZUNvdW50ICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWX0lGKGJ1ZmZlci5mcmFtZUNvdW50ICE9IGZyYW1lc091dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzKCkgcmVhZCBsZXNzIHRoYW4gZXhwZWN0ZWQgKCV6dSB2cyAlenUpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGJ1ZmZlci5mcmFtZUNvdW50LCBmcmFtZXNPdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzT3V0ID0gYnVmZmVyLmZyYW1lQ291bnQ7CisgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoYWN0aXZlVHJhY2stPm1TaW5rLnJhdywgYnVmZmVyLnJhdywgYnVmZmVyLmZyYW1lQ291bnQgKiBtRnJhbWVTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZVRyYWNrLT5tUmVzYW1wbGVyQnVmZmVyUHJvdmlkZXItPnJlbGVhc2VCdWZmZXIoJmJ1ZmZlcik7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXNPdXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzKCkgY2Fubm90IGZpbGwgcmVxdWVzdCwgc3RhdHVzOiAlZCwgZnJhbWVDb3VudDogJXp1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgc3RhdHVzLCBidWZmZXIuZnJhbWVDb3VudCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBwcm9jZXNzIGZyYW1lcyBmcm9tIHRoZSBSZWNvcmRUaHJlYWQgYnVmZmVyIHByb3ZpZGVyIHRvIHRoZSBSZWNvcmRUcmFjaworICAgICAgICAgICAgICAgICAgICAvLyBidWZmZXIKKyAgICAgICAgICAgICAgICAgICAgZnJhbWVzT3V0ID0gYWN0aXZlVHJhY2stPm1SZWNvcmRCdWZmZXJDb252ZXJ0ZXItPmNvbnZlcnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlVHJhY2stPm1TaW5rLnJhdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVUcmFjay0+bVJlc2FtcGxlckJ1ZmZlclByb3ZpZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lc091dCk7CisgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgaWYgKGZyYW1lc091dCA+IDAgJiYgKG92ZXJydW4gPT0gT1ZFUlJVTl9VTktOT1dOKSkgewogICAgICAgICAgICAgICAgICAgICBvdmVycnVuID0gT1ZFUlJVTl9GQUxTRTsKQEAgLTY5NDIsNiArNzE2NCwxMiBAQAogICAgICAgICBnb3RvIEV4aXQ7CiAgICAgfQogCisgICAgaWYgKCFhdWRpb19pc19saW5lYXJfcGNtKG1Gb3JtYXQpICYmICgqZmxhZ3MgJiBBVURJT19JTlBVVF9GTEFHX0RJUkVDVCkgPT0gMCkgeworICAgICAgICBBTE9HRSgiY3JlYXRlUmVjb3JkVHJhY2tfbCgpIG9uIGFuIGVuY29kZWQgc3RyZWFtIHJlcXVpcmVzIEFVRElPX0lOUFVUX0ZMQUdfRElSRUNUIik7CisgICAgICAgIGxTdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgIGdvdG8gRXhpdDsKKyAgICB9CisKICAgICBpZiAoKnBTYW1wbGVSYXRlID09IDApIHsKICAgICAgICAgKnBTYW1wbGVSYXRlID0gbVNhbXBsZVJhdGU7CiAgICAgfQpAQCAtNzEwNyw4ICs3MzM1LDE0IEBACiAgICAgewogICAgICAgICAvLyBUaGlzIHNlY3Rpb24gaXMgYSByZW5kZXp2b3VzIGJldHdlZW4gYmluZGVyIHRocmVhZCBleGVjdXRpbmcgc3RhcnQoKSBhbmQgUmVjb3JkVGhyZWFkCiAgICAgICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKKyAgICAgICAgaWYgKHJlY29yZFRyYWNrLT5pc0ludmFsaWQoKSkgeworICAgICAgICAgICAgcmVjb3JkVHJhY2stPmNsZWFyU3luY1N0YXJ0RXZlbnQoKTsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQogICAgICAgICBpZiAobUFjdGl2ZVRyYWNrcy5pbmRleE9mKHJlY29yZFRyYWNrKSA+PSAwKSB7CiAgICAgICAgICAgICBpZiAocmVjb3JkVHJhY2stPm1TdGF0ZSA9PSBUcmFja0Jhc2U6OlBBVVNJTkcpIHsKKyAgICAgICAgICAgICAgICAvLyBXZSBoYXZlbid0IHN0b3BwZWQgeWV0IChtb3ZlZCB0byBQQVVTRUQgYW5kIG5vdCBpbiBtQWN0aXZlVHJhY2tzKQorICAgICAgICAgICAgICAgIC8vIHNvIG5vIG5lZWQgdG8gc3RhcnRJbnB1dCgpLgogICAgICAgICAgICAgICAgIEFMT0dWKCJhY3RpdmUgcmVjb3JkIHRyYWNrIFBBVVNJTkcgLT4gQUNUSVZFIik7CiAgICAgICAgICAgICAgICAgcmVjb3JkVHJhY2stPm1TdGF0ZSA9IFRyYWNrQmFzZTo6QUNUSVZFOwogICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTcxMjgsMTEgKzczNjIsMzAgQEAKICAgICAgICAgICAgIGJvb2wgc2lsZW5jZWQ7CiAgICAgICAgICAgICBzdGF0dXMgPSBBdWRpb1N5c3RlbTo6c3RhcnRJbnB1dChyZWNvcmRUcmFjay0+cG9ydElkKCksICZzaWxlbmNlZCk7CiAgICAgICAgICAgICBtTG9jay5sb2NrKCk7Ci0gICAgICAgICAgICAvLyBGSVhNRSBzaG91bGQgdmVyaWZ5IHRoYXQgcmVjb3JkVHJhY2sgaXMgc3RpbGwgaW4gbUFjdGl2ZVRyYWNrcworICAgICAgICAgICAgaWYgKHJlY29yZFRyYWNrLT5pc0ludmFsaWQoKSkgeworICAgICAgICAgICAgICAgIHJlY29yZFRyYWNrLT5jbGVhclN5bmNTdGFydEV2ZW50KCk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUiAmJiByZWNvcmRUcmFjay0+bVN0YXRlID09IFRyYWNrQmFzZTo6U1RBUlRJTkdfMSkgeworICAgICAgICAgICAgICAgICAgICByZWNvcmRUcmFjay0+bVN0YXRlID0gVHJhY2tCYXNlOjpTVEFSVElOR18yOworICAgICAgICAgICAgICAgICAgICAvLyBTVEFSVElOR18yIGZvcmNlcyBkZXN0cm95IHRvIGNhbGwgc3RvcElucHV0LgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocmVjb3JkVHJhY2stPm1TdGF0ZSAhPSBUcmFja0Jhc2U6OlNUQVJUSU5HXzEpIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiJXMoJWQpOiB1bnN5bmNocm9uaXplZCBtU3RhdGU6JWQgY2hhbmdlIiwKKyAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHJlY29yZFRyYWNrLT5pZCgpLCByZWNvcmRUcmFjay0+bVN0YXRlKTsKKyAgICAgICAgICAgICAgICAvLyBTb21lb25lIGVsc2UgaGFzIGNoYW5nZWQgc3RhdGUsIGxldCB0aGVtIHRha2Ugb3ZlciwKKyAgICAgICAgICAgICAgICAvLyBsZWF2ZSBtU3RhdGUgaW4gdGhlIG5ldyBzdGF0ZS4KKyAgICAgICAgICAgICAgICByZWNvcmRUcmFjay0+Y2xlYXJTeW5jU3RhcnRFdmVudCgpOworICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIHdlJ3JlIG9rLCBidXQgcGVyaGFwcyBzdGFydElucHV0IGhhcyBmYWlsZWQKICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiJXMoJWQpOiBzdGFydElucHV0IGZhaWxlZCwgc3RhdHVzICVkIiwKKyAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHJlY29yZFRyYWNrLT5pZCgpLCBzdGF0dXMpOworICAgICAgICAgICAgICAgIC8vIFdlIGFyZSBpbiBBY3RpdmVUcmFja3MgaWYgU1RBUlRJTkdfMSBhbmQgdmFsaWQsIHNvIHJlbW92ZSBmcm9tIEFjdGl2ZVRyYWNrcywKKyAgICAgICAgICAgICAgICAvLyBsZWF2ZSBpbiBTVEFSVElOR18xLCBzbyBkZXN0cm95KCkgd2lsbCBub3QgY2FsbCBzdG9wSW5wdXQuCiAgICAgICAgICAgICAgICAgbUFjdGl2ZVRyYWNrcy5yZW1vdmUocmVjb3JkVHJhY2spOwogICAgICAgICAgICAgICAgIHJlY29yZFRyYWNrLT5jbGVhclN5bmNTdGFydEV2ZW50KCk7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIlJlY29yZFRocmVhZDo6c3RhcnQgZXJyb3IgJWQiLCBzdGF0dXMpOwogICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZWNvcmRUcmFjay0+c2V0U2lsZW5jZWQoc2lsZW5jZWQpOwpAQCAtNzE0MywyNiArNzM5NiwxNSBAQAogICAgICAgICAvLyBzZWUgcHJldmlvdXNseSBidWZmZXJlZCBkYXRhIGJlZm9yZSBpdCBjYWxsZWQgc3RhcnQoKSwgYnV0IHdpdGggZ3JlYXRlciByaXNrIG9mIG92ZXJydW4uCiAKICAgICAgICAgcmVjb3JkVHJhY2stPm1SZXNhbXBsZXJCdWZmZXJQcm92aWRlci0+cmVzZXQoKTsKLSAgICAgICAgLy8gY2xlYXIgYW55IGNvbnZlcnRlciBzdGF0ZSBhcyBuZXcgZGF0YSB3aWxsIGJlIGRpc2NvbnRpbnVvdXMKLSAgICAgICAgcmVjb3JkVHJhY2stPm1SZWNvcmRCdWZmZXJDb252ZXJ0ZXItPnJlc2V0KCk7CisgICAgICAgIGlmICghcmVjb3JkVHJhY2stPmlzRGlyZWN0KCkpIHsKKyAgICAgICAgICAgIC8vIGNsZWFyIGFueSBjb252ZXJ0ZXIgc3RhdGUgYXMgbmV3IGRhdGEgd2lsbCBiZSBkaXNjb250aW51b3VzCisgICAgICAgICAgICByZWNvcmRUcmFjay0+bVJlY29yZEJ1ZmZlckNvbnZlcnRlci0+cmVzZXQoKTsKKyAgICAgICAgfQogICAgICAgICByZWNvcmRUcmFjay0+bVN0YXRlID0gVHJhY2tCYXNlOjpTVEFSVElOR18yOwogICAgICAgICAvLyBzaWduYWwgdGhyZWFkIHRvIHN0YXJ0CiAgICAgICAgIG1XYWl0V29ya0NWLmJyb2FkY2FzdCgpOwotICAgICAgICBpZiAobUFjdGl2ZVRyYWNrcy5pbmRleE9mKHJlY29yZFRyYWNrKSA8IDApIHsKLSAgICAgICAgICAgIEFMT0dWKCJSZWNvcmQgZmFpbGVkIHRvIHN0YXJ0Iik7Ci0gICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7Ci0gICAgICAgICAgICBnb3RvIHN0YXJ0RXJyb3I7Ci0gICAgICAgIH0KICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9Ci0KLXN0YXJ0RXJyb3I6Ci0gICAgaWYgKHJlY29yZFRyYWNrLT5pc0V4dGVybmFsVHJhY2soKSkgewotICAgICAgICBBdWRpb1N5c3RlbTo6c3RvcElucHV0KHJlY29yZFRyYWNrLT5wb3J0SWQoKSk7Ci0gICAgfQotICAgIHJlY29yZFRyYWNrLT5jbGVhclN5bmNTdGFydEV2ZW50KCk7Ci0gICAgLy8gRklYTUUgSSB3b25kZXIgd2h5IHdlIGRvIG5vdCByZXNldCB0aGUgc3RhdGUgaGVyZT8KLSAgICByZXR1cm4gc3RhdHVzOwogfQogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpzeW5jU3RhcnRFdmVudENhbGxiYWNrKGNvbnN0IHdwPFN5bmNFdmVudD4mIGV2ZW50KQpAQCAtNzE4MSwyNCArNzQyMywyNiBAQAogYm9vbCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6c3RvcChSZWNvcmRUaHJlYWQ6OlJlY29yZFRyYWNrKiByZWNvcmRUcmFjaykgewogICAgIEFMT0dWKCJSZWNvcmRUaHJlYWQ6OnN0b3AiKTsKICAgICBBdXRvTXV0ZXggX2wobUxvY2spOworICAgIC8vIGlmIHdlJ3JlIGludmFsaWQsIHdlIGNhbid0IGJlIG9uIHRoZSBBY3RpdmVUcmFja3MuCiAgICAgaWYgKG1BY3RpdmVUcmFja3MuaW5kZXhPZihyZWNvcmRUcmFjaykgPCAwIHx8IHJlY29yZFRyYWNrLT5tU3RhdGUgPT0gVHJhY2tCYXNlOjpQQVVTSU5HKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgLy8gbm90ZSB0aGF0IHRocmVhZExvb3AgbWF5IHN0aWxsIGJlIHByb2Nlc3NpbmcgdGhlIHRyYWNrIGF0IHRoaXMgcG9pbnQgW3dpdGhvdXQgbG9ja10KICAgICByZWNvcmRUcmFjay0+bVN0YXRlID0gVHJhY2tCYXNlOjpQQVVTSU5HOwotICAgIC8vIHNpZ25hbCB0aHJlYWQgdG8gc3RvcAotICAgIG1XYWl0V29ya0NWLmJyb2FkY2FzdCgpOwotICAgIC8vIGRvIG5vdCB3YWl0IGZvciBtU3RhcnRTdG9wQ29uZCBpZiBleGl0aW5nCi0gICAgaWYgKGV4aXRQZW5kaW5nKCkpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICB3aGlsZSAocmVjb3JkVHJhY2stPm1TdGF0ZSA9PSBUcmFja0Jhc2U6OlBBVVNJTkcgJiYgIXJlY29yZFRyYWNrLT5pc0ludmFsaWQoKSkgeworICAgICAgICBtV2FpdFdvcmtDVi5icm9hZGNhc3QoKTsgLy8gc2lnbmFsIHRocmVhZCB0byBzdG9wCisgICAgICAgIG1TdGFydFN0b3BDb25kLndhaXQobUxvY2spOwogICAgIH0KLSAgICAvLyBGSVhNRSBpbmNvcnJlY3QgdXNhZ2Ugb2Ygd2FpdDogbm8gZXhwbGljaXQgcHJlZGljYXRlIG9yIGxvb3AKLSAgICBtU3RhcnRTdG9wQ29uZC53YWl0KG1Mb2NrKTsKLSAgICAvLyBpZiB3ZSBoYXZlIGJlZW4gcmVzdGFydGVkLCByZWNvcmRUcmFjayBpcyBpbiBtQWN0aXZlVHJhY2tzIGhlcmUKLSAgICBpZiAoZXhpdFBlbmRpbmcoKSB8fCBtQWN0aXZlVHJhY2tzLmluZGV4T2YocmVjb3JkVHJhY2spIDwgMCkgeworCisgICAgaWYgKHJlY29yZFRyYWNrLT5tU3RhdGUgPT0gVHJhY2tCYXNlOjpQQVVTRUQpIHsgLy8gc3VjY2Vzc2Z1bCBzdG9wCiAgICAgICAgIEFMT0dWKCJSZWNvcmQgc3RvcHBlZCBPSyIpOwogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CisKKyAgICAvLyBkb24ndCBoYW5kbGUgYW55dGhpbmcgLSB3ZSd2ZSBiZWVuIGludmFsaWRhdGVkIG9yIHJlc3RhcnRlZCBhbmQgaW4gYSBkaWZmZXJlbnQgc3RhdGUKKyAgICBBTE9HV19JRigiJXMoJWQpOiB1bnN5bmNocm9uaXplZCBzdG9wLCBzdGF0ZTogJWQiLAorICAgICAgICAgICAgX19mdW5jX18sIHJlY29yZFRyYWNrLT5pZCgpLCByZWNvcmRUcmFjay0+bVN0YXRlKTsKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKQEAgLTczMDAsNyArNzU0NCw4IEBACiAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncyA9IGlucHV0ICE9IE5VTEwgPyBpbnB1dC0+ZmxhZ3MgOiBBVURJT19JTlBVVF9GTEFHX05PTkU7CiAgICAgZHByaW50ZihmZCwgIiAgQXVkaW9TdHJlYW1JbjogJXAgZmxhZ3MgJSN4ICglcylcbiIsCiAgICAgICAgICAgICBpbnB1dCwgZmxhZ3MsIGlucHV0RmxhZ3NUb1N0cmluZyhmbGFncykuY19zdHIoKSk7Ci0gICAgaWYgKG1BY3RpdmVUcmFja3Muc2l6ZSgpID09IDApIHsKKyAgICBkcHJpbnRmKGZkLCAiICBGcmFtZXMgcmVhZDogJWxsZFxuIiwgKGxvbmcgbG9uZyltRnJhbWVzUmVhZCk7CisgICAgaWYgKG1BY3RpdmVUcmFja3MuaXNFbXB0eSgpKSB7CiAgICAgICAgIGRwcmludGYoZmQsICIgIE5vIGFjdGl2ZSByZWNvcmQgY2xpZW50c1xuIik7CiAgICAgfQogCkBAIC03MzA5LDYgKzc1NTQsMTQgQEAKICAgICAgICAgKHZvaWQpaW5wdXQtPnN0cmVhbS0+ZHVtcChmZCk7CiAgICAgfQogCisgICAgY29uc3QgZG91YmxlIGxhdGVuY3lNcyA9IGF1ZGlvX2lzX2xpbmVhcl9wY20obUZvcm1hdCkKKyAgICAgICAgICAgID8gLSBtVGltZXN0YW1wLmdldE91dHB1dFNlcnZlckxhdGVuY3lNcyhtU2FtcGxlUmF0ZSkgOiAwLjsKKyAgICBpZiAobGF0ZW5jeU1zICE9IDAuKSB7CisgICAgICAgIGRwcmludGYoZmQsICIgIE5vcm1hbFJlY29yZCBsYXRlbmN5IG1zOiAlLjJsZlxuIiwgbGF0ZW5jeU1zKTsKKyAgICB9IGVsc2UgeworICAgICAgICBkcHJpbnRmKGZkLCAiICBOb3JtYWxSZWNvcmQgbGF0ZW5jeSBtczogdW5hdmFpbFxuIik7CisgICAgfQorCiAgICAgZHByaW50ZihmZCwgIiAgRmFzdCBjYXB0dXJlIHRocmVhZDogJXNcbiIsIGhhc0Zhc3RDYXB0dXJlKCkgPyAieWVzIiA6ICJubyIpOwogICAgIGRwcmludGYoZmQsICIgIEZhc3QgdHJhY2sgYXZhaWxhYmxlOiAlc1xuIiwgbUZhc3RUcmFja0F2YWlsID8gInllcyIgOiAibm8iKTsKIApAQCAtNzMxNiw5ICs3NTY5LDkgQEAKICAgICAvLyB3aGlsZSB3ZSBhcmUgZHVtcGluZyBpdC4gIEl0IG1heSBiZSBpbmNvbnNpc3RlbnQsIGJ1dCBpdCB3b24ndCBtdXRhdGUhCiAgICAgLy8gVGhpcyBpcyBhIGxhcmdlIG9iamVjdCBzbyB3ZSBwbGFjZSBpdCBvbiB0aGUgaGVhcC4KICAgICAvLyBGSVhNRSAyNTk3Mjk1ODogTmVlZCBhbiBpbnRlbGxpZ2VudCBjb3B5IGNvbnN0cnVjdG9yIHRoYXQgZG9lcyBub3QgdG91Y2ggdW51c2VkIHBhZ2VzLgotICAgIGNvbnN0IEZhc3RDYXB0dXJlRHVtcFN0YXRlICpjb3B5ID0gbmV3IEZhc3RDYXB0dXJlRHVtcFN0YXRlKG1GYXN0Q2FwdHVyZUR1bXBTdGF0ZSk7CisgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEZhc3RDYXB0dXJlRHVtcFN0YXRlPiBjb3B5ID0KKyAgICAgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8RmFzdENhcHR1cmVEdW1wU3RhdGU+KG1GYXN0Q2FwdHVyZUR1bXBTdGF0ZSk7CiAgICAgY29weS0+ZHVtcChmZCk7Ci0gICAgZGVsZXRlIGNvcHk7CiB9CiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OmR1bXBUcmFja3MoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzIF9fdW51c2VkKQpAQCAtNzMzMiw3ICs3NTg1LDcgQEAKICAgICBpZiAobnVtdHJhY2tzKSB7CiAgICAgICAgIGRwcmludGYoZmQsICIgb2Ygd2hpY2ggJXp1IGFyZSBhY3RpdmVcbiIsIG51bWFjdGl2ZSk7CiAgICAgICAgIHJlc3VsdC5hcHBlbmQocHJlZml4KTsKLSAgICAgICAgUmVjb3JkVHJhY2s6OmFwcGVuZER1bXBIZWFkZXIocmVzdWx0KTsKKyAgICAgICAgbVRyYWNrc1swXS0+YXBwZW5kRHVtcEhlYWRlcihyZXN1bHQpOwogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bXRyYWNrcyA7ICsraSkgewogICAgICAgICAgICAgc3A8UmVjb3JkVHJhY2s+IHRyYWNrID0gbVRyYWNrc1tpXTsKICAgICAgICAgICAgIGlmICh0cmFjayAhPSAwKSB7CkBAIC03MzUyLDcgKzc2MDUsNyBAQAogICAgICAgICByZXN1bHQuYXBwZW5kKCIgIFRoZSBmb2xsb3dpbmcgdHJhY2tzIGFyZSBpbiB0aGUgYWN0aXZlIGxpc3QgYnV0IgogICAgICAgICAgICAgICAgICIgbm90IGluIHRoZSB0cmFjayBsaXN0XG4iKTsKICAgICAgICAgcmVzdWx0LmFwcGVuZChwcmVmaXgpOwotICAgICAgICBSZWNvcmRUcmFjazo6YXBwZW5kRHVtcEhlYWRlcihyZXN1bHQpOworICAgICAgICBtQWN0aXZlVHJhY2tzWzBdLT5hcHBlbmREdW1wSGVhZGVyKHJlc3VsdCk7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtYWN0aXZlOyArK2kpIHsKICAgICAgICAgICAgIHNwPFJlY29yZFRyYWNrPiB0cmFjayA9IG1BY3RpdmVUcmFja3NbaV07CiAgICAgICAgICAgICBpZiAobVRyYWNrcy5pbmRleE9mKHRyYWNrKSA8IDApIHsKQEAgLTc2NDcsMTAgKzc5MDAsMTUgQEAKIHsKICAgICBzdGF0dXNfdCByZXN1bHQgPSBtSW5wdXQtPnN0cmVhbS0+Z2V0QXVkaW9Qcm9wZXJ0aWVzKCZtU2FtcGxlUmF0ZSwgJm1DaGFubmVsTWFzaywgJm1IQUxGb3JtYXQpOwogICAgIExPR19BTFdBWVNfRkFUQUxfSUYocmVzdWx0ICE9IE9LLCAiRXJyb3IgcmV0cmlldmluZyBhdWRpbyBwcm9wZXJ0aWVzIGZyb20gSEFMOiAlZCIsIHJlc3VsdCk7Ci0gICAgbUNoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9pbl9tYXNrKG1DaGFubmVsTWFzayk7Ci0gICAgTE9HX0FMV0FZU19GQVRBTF9JRihtQ2hhbm5lbENvdW50ID4gRkNDXzgsICJIQUwgY2hhbm5lbCBjb3VudCAlZCA+ICVkIiwgbUNoYW5uZWxDb3VudCwgRkNDXzgpOwogICAgIG1Gb3JtYXQgPSBtSEFMRm9ybWF0OwotICAgIExPR19BTFdBWVNfRkFUQUxfSUYoIWF1ZGlvX2lzX2xpbmVhcl9wY20obUZvcm1hdCksICJIQUwgZm9ybWF0ICUjeCBpcyBub3QgbGluZWFyIHBjbSIsIG1Gb3JtYXQpOworICAgIG1DaGFubmVsQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21faW5fbWFzayhtQ2hhbm5lbE1hc2spOworICAgIGlmIChhdWRpb19pc19saW5lYXJfcGNtKG1Gb3JtYXQpKSB7CisgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYobUNoYW5uZWxDb3VudCA+IEZDQ184LCAiSEFMIGNoYW5uZWwgY291bnQgJWQgPiAlZCIsCisgICAgICAgICAgICAgICAgbUNoYW5uZWxDb3VudCwgRkNDXzgpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIENhbiBoYXZlIG1vcmUgdGhhdCBGQ0NfOCBjaGFubmVscyBpbiBlbmNvZGVkIHN0cmVhbXMuCisgICAgICAgIEFMT0dJKCJIQUwgZm9ybWF0ICUjeCBpcyBub3QgbGluZWFyIHBjbSIsIG1Gb3JtYXQpOworICAgIH0KICAgICByZXN1bHQgPSBtSW5wdXQtPnN0cmVhbS0+Z2V0RnJhbWVTaXplKCZtRnJhbWVTaXplKTsKICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKHJlc3VsdCAhPSBPSywgIkVycm9yIHJldHJpZXZpbmcgZnJhbWUgc2l6ZSBmcm9tIEhBTDogJWQiLCByZXN1bHQpOwogICAgIHJlc3VsdCA9IG1JbnB1dC0+c3RyZWFtLT5nZXRCdWZmZXJTaXplKCZtQnVmZmVyU2l6ZSk7CkBAIC03NzU1LDcgKzgwMTMsNyBAQAogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OmFkZEVmZmVjdENoYWluX2woY29uc3Qgc3A8RWZmZWN0Q2hhaW4+JiBjaGFpbikKIHsKICAgICAvLyBvbmx5IG9uZSBjaGFpbiBwZXIgaW5wdXQgdGhyZWFkCi0gICAgaWYgKG1FZmZlY3RDaGFpbnMuc2l6ZSgpICE9IDApIHsKKyAgICBpZiAoIW1FZmZlY3RDaGFpbnMuaXNFbXB0eSgpKSB7CiAgICAgICAgIEFMT0dXKCJhZGRFZmZlY3RDaGFpbl9sKCkgYWxyZWFkeSBvbmUgY2hhaW4gJXAgb24gdGhyZWFkICVwIiwgY2hhaW4uZ2V0KCksIHRoaXMpOwogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQpAQCAtNzg2MCwyNCArODExOCwyOCBAQAogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OmFkZFBhdGNoUmVjb3JkKGNvbnN0IHNwPFBhdGNoUmVjb3JkPiYgcmVjb3JkKQordm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6YWRkUGF0Y2hUcmFjayhjb25zdCBzcDxQYXRjaFJlY29yZD4mIHJlY29yZCkKIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIG1UcmFja3MuYWRkKHJlY29yZCk7CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OmRlbGV0ZVBhdGNoUmVjb3JkKGNvbnN0IHNwPFBhdGNoUmVjb3JkPiYgcmVjb3JkKQordm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6ZGVsZXRlUGF0Y2hUcmFjayhjb25zdCBzcDxQYXRjaFJlY29yZD4mIHJlY29yZCkKIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIGRlc3Ryb3lUcmFja19sKHJlY29yZCk7CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OmdldEF1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZykKK3ZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OnRvQXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKQogewotICAgIFRocmVhZEJhc2U6OmdldEF1ZGlvUG9ydENvbmZpZyhjb25maWcpOworICAgIFRocmVhZEJhc2U6OnRvQXVkaW9Qb3J0Q29uZmlnKGNvbmZpZyk7CiAgICAgY29uZmlnLT5yb2xlID0gQVVESU9fUE9SVF9ST0xFX1NJTks7CiAgICAgY29uZmlnLT5leHQubWl4Lmh3X21vZHVsZSA9IG1JbnB1dC0+YXVkaW9Id0Rldi0+aGFuZGxlKCk7CiAgICAgY29uZmlnLT5leHQubWl4LnVzZWNhc2Uuc291cmNlID0gbUF1ZGlvU291cmNlOworICAgIGlmIChtSW5wdXQgJiYgbUlucHV0LT5mbGFncyAhPSBBVURJT19JTlBVVF9GTEFHX05PTkUpIHsKKyAgICAgICAgY29uZmlnLT5jb25maWdfbWFzayB8PSBBVURJT19QT1JUX0NPTkZJR19GTEFHUzsKKyAgICAgICAgY29uZmlnLT5mbGFncy5pbnB1dCA9IG1JbnB1dC0+ZmxhZ3M7CisgICAgfQogfQogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC03OTY0LDcgKzgyMjYsNyBAQAogICAgIH0KICAgICAvLyBUaGlzIHdpbGwgZGVjcmVtZW50IHJlZmVyZW5jZXMgYW5kIG1heSBjYXVzZSB0aGUgZGVzdHJ1Y3Rpb24gb2YgdGhpcyB0aHJlYWQuCiAgICAgaWYgKGlzT3V0cHV0KCkpIHsKLSAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VPdXRwdXQobUlkLCBzdHJlYW1UeXBlKCksIG1TZXNzaW9uSWQpOworICAgICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZU91dHB1dChtUG9ydElkKTsKICAgICB9IGVsc2UgewogICAgICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZUlucHV0KG1Qb3J0SWQpOwogICAgIH0KQEAgLTgwNzgsNyArODM0MCw3IEBACiAKICAgICBib29sIHNpbGVuY2VkID0gZmFsc2U7CiAgICAgaWYgKGlzT3V0cHV0KCkpIHsKLSAgICAgICAgcmV0ID0gQXVkaW9TeXN0ZW06OnN0YXJ0T3V0cHV0KG1JZCwgc3RyZWFtVHlwZSgpLCBtU2Vzc2lvbklkKTsKKyAgICAgICAgcmV0ID0gQXVkaW9TeXN0ZW06OnN0YXJ0T3V0cHV0KHBvcnRJZCk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgcmV0ID0gQXVkaW9TeXN0ZW06OnN0YXJ0SW5wdXQocG9ydElkLCAmc2lsZW5jZWQpOwogICAgIH0KQEAgLTgwODcsMTAgKzgzNDksMTAgQEAKICAgICAvLyBhYm9ydCBpZiBzdGFydCBpcyByZWplY3RlZCBieSBhdWRpbyBwb2xpY3kgbWFuYWdlcgogICAgIGlmIChyZXQgIT0gTk9fRVJST1IpIHsKICAgICAgICAgQUxPR0UoIiVzOiBlcnJvciBzdGFydCByZWplY3RlZCBieSBBdWRpb1BvbGljeU1hbmFnZXIgPSAlZCIsIF9fRlVOQ1RJT05fXywgcmV0KTsKLSAgICAgICAgaWYgKG1BY3RpdmVUcmFja3Muc2l6ZSgpICE9IDApIHsKKyAgICAgICAgaWYgKCFtQWN0aXZlVHJhY2tzLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7CiAgICAgICAgICAgICBpZiAoaXNPdXRwdXQoKSkgewotICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlT3V0cHV0KG1JZCwgc3RyZWFtVHlwZSgpLCBtU2Vzc2lvbklkKTsKKyAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZU91dHB1dChwb3J0SWQpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZUlucHV0KHBvcnRJZCk7CiAgICAgICAgICAgICB9CkBAIC04MTEzLDcgKzgzNzUsNyBAQAogCiAgICAgLy8gR2l2ZW4gdGhhdCBNbWFwVGhyZWFkOjptQXR0ciBpcyBtdXRhYmxlLCBzaG91bGQgYSBNbWFwVHJhY2sgaGF2ZSBhdHRyaWJ1dGVzID8KICAgICBzcDxNbWFwVHJhY2s+IHRyYWNrID0gbmV3IE1tYXBUcmFjayh0aGlzLCBtQXR0ciwgbVNhbXBsZVJhdGUsIG1Gb3JtYXQsIG1DaGFubmVsTWFzaywgbVNlc3Npb25JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQuY2xpZW50VWlkLCBjbGllbnQuY2xpZW50UGlkLCBwb3J0SWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzT3V0cHV0KCksIGNsaWVudC5jbGllbnRVaWQsIGNsaWVudC5jbGllbnRQaWQsIHBvcnRJZCk7CiAKICAgICB0cmFjay0+c2V0U2lsZW5jZWRfbChzaWxlbmNlZCk7CiAgICAgbUFjdGl2ZVRyYWNrcy5hZGQodHJhY2spOwpAQCAtODE2Miw4ICs4NDI0LDggQEAKIAogICAgIG1Mb2NrLnVubG9jaygpOwogICAgIGlmIChpc091dHB1dCgpKSB7Ci0gICAgICAgIEF1ZGlvU3lzdGVtOjpzdG9wT3V0cHV0KG1JZCwgc3RyZWFtVHlwZSgpLCB0cmFjay0+c2Vzc2lvbklkKCkpOwotICAgICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZU91dHB1dChtSWQsIHN0cmVhbVR5cGUoKSwgdHJhY2stPnNlc3Npb25JZCgpKTsKKyAgICAgICAgQXVkaW9TeXN0ZW06OnN0b3BPdXRwdXQodHJhY2stPnBvcnRJZCgpKTsKKyAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VPdXRwdXQodHJhY2stPnBvcnRJZCgpKTsKICAgICB9IGVsc2UgewogICAgICAgICBBdWRpb1N5c3RlbTo6c3RvcElucHV0KHRyYWNrLT5wb3J0SWQoKSk7CiAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlSW5wdXQodHJhY2stPnBvcnRJZCgpKTsKQEAgLTgxODgsNyArODQ1MCw3IEBACiAgICAgaWYgKG1IYWxTdHJlYW0gPT0gMCkgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9Ci0gICAgaWYgKG1BY3RpdmVUcmFja3Muc2l6ZSgpICE9IDApIHsKKyAgICBpZiAoIW1BY3RpdmVUcmFja3MuaXNFbXB0eSgpKSB7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAgICAgbUhhbFN0cmVhbS0+c3RhbmRieSgpOwpAQCAtODQ1OSw5ICs4NzIxLDkgQEAKICAgICByZXR1cm4gc3RhdHVzOwogfQogCi12b2lkIEF1ZGlvRmxpbmdlcjo6TW1hcFRocmVhZDo6Z2V0QXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKQordm9pZCBBdWRpb0ZsaW5nZXI6Ok1tYXBUaHJlYWQ6OnRvQXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKQogewotICAgIFRocmVhZEJhc2U6OmdldEF1ZGlvUG9ydENvbmZpZyhjb25maWcpOworICAgIFRocmVhZEJhc2U6OnRvQXVkaW9Qb3J0Q29uZmlnKGNvbmZpZyk7CiAgICAgaWYgKGlzT3V0cHV0KCkpIHsKICAgICAgICAgY29uZmlnLT5yb2xlID0gQVVESU9fUE9SVF9ST0xFX1NPVVJDRTsKICAgICAgICAgY29uZmlnLT5leHQubWl4Lmh3X21vZHVsZSA9IG1BdWRpb0h3RGV2LT5oYW5kbGUoKTsKQEAgLTg2MjYsNyArODg4OCw3IEBACiAgICAgZHByaW50ZihmZCwgIiAgQXR0cmlidXRlczogY29udGVudCB0eXBlICVkIHVzYWdlICVkIHNvdXJjZSAlZFxuIiwKICAgICAgICAgICAgIG1BdHRyLmNvbnRlbnRfdHlwZSwgbUF0dHIudXNhZ2UsIG1BdHRyLnNvdXJjZSk7CiAgICAgZHByaW50ZihmZCwgIiAgU2Vzc2lvbjogJWQgcG9ydCBJZDogJWRcbiIsIG1TZXNzaW9uSWQsIG1Qb3J0SWQpOwotICAgIGlmIChtQWN0aXZlVHJhY2tzLnNpemUoKSA9PSAwKSB7CisgICAgaWYgKG1BY3RpdmVUcmFja3MuaXNFbXB0eSgpKSB7CiAgICAgICAgIGRwcmludGYoZmQsICIgIE5vIGFjdGl2ZSBjbGllbnRzXG4iKTsKICAgICB9CiB9CkBAIC04NjM5LDcgKzg5MDEsNyBAQAogICAgIGNvbnN0IGNoYXIgKnByZWZpeCA9ICIgICAgIjsKICAgICBpZiAobnVtdHJhY2tzKSB7CiAgICAgICAgIHJlc3VsdC5hcHBlbmQocHJlZml4KTsKLSAgICAgICAgTW1hcFRyYWNrOjphcHBlbmREdW1wSGVhZGVyKHJlc3VsdCk7CisgICAgICAgIG1BY3RpdmVUcmFja3NbMF0tPmFwcGVuZER1bXBIZWFkZXIocmVzdWx0KTsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW10cmFja3MgOyArK2kpIHsKICAgICAgICAgICAgIHNwPE1tYXBUcmFjaz4gdHJhY2sgPSBtQWN0aXZlVHJhY2tzW2ldOwogICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChwcmVmaXgpOwpAQCAtODg0NSw2ICs5MTA3LDE1IEBACiAgICAgfQogfQogCit2b2lkIEF1ZGlvRmxpbmdlcjo6TW1hcFBsYXliYWNrVGhyZWFkOjp0b0F1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZykKK3sKKyAgICBNbWFwVGhyZWFkOjp0b0F1ZGlvUG9ydENvbmZpZyhjb25maWcpOworICAgIGlmIChtT3V0cHV0ICYmIG1PdXRwdXQtPmZsYWdzICE9IEFVRElPX09VVFBVVF9GTEFHX05PTkUpIHsKKyAgICAgICAgY29uZmlnLT5jb25maWdfbWFzayB8PSBBVURJT19QT1JUX0NPTkZJR19GTEFHUzsKKyAgICAgICAgY29uZmlnLT5mbGFncy5vdXRwdXQgPSBtT3V0cHV0LT5mbGFnczsKKyAgICB9Cit9CisKIHZvaWQgQXVkaW9GbGluZ2VyOjpNbWFwUGxheWJhY2tUaHJlYWQ6OmR1bXBJbnRlcm5hbHMoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKQogewogICAgIE1tYXBUaHJlYWQ6OmR1bXBJbnRlcm5hbHMoZmQsIGFyZ3MpOwpAQCAtODkzNSw0ICs5MjA2LDEzIEBACiAgICAgfQogfQogCit2b2lkIEF1ZGlvRmxpbmdlcjo6TW1hcENhcHR1cmVUaHJlYWQ6OnRvQXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKQoreworICAgIE1tYXBUaHJlYWQ6OnRvQXVkaW9Qb3J0Q29uZmlnKGNvbmZpZyk7CisgICAgaWYgKG1JbnB1dCAmJiBtSW5wdXQtPmZsYWdzICE9IEFVRElPX0lOUFVUX0ZMQUdfTk9ORSkgeworICAgICAgICBjb25maWctPmNvbmZpZ19tYXNrIHw9IEFVRElPX1BPUlRfQ09ORklHX0ZMQUdTOworICAgICAgICBjb25maWctPmZsYWdzLmlucHV0ID0gbUlucHV0LT5mbGFnczsKKyAgICB9Cit9CisKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UaHJlYWRzLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVGhyZWFkcy5oCmluZGV4IGVhMjk0NTUuLjQ5ZmMyMzQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UaHJlYWRzLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RocmVhZHMuaApAQCAtMjgxLDcgKzI4MSw3IEBACiAgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgY3JlYXRlQXVkaW9QYXRjaF9sKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUpID0gMDsKICAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICByZWxlYXNlQXVkaW9QYXRjaF9sKGNvbnN0IGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSkgPSAwOwotICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIGdldEF1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZykgPSAwOworICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIHRvQXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKSA9IDA7CiAKIAogICAgICAgICAgICAgICAgIC8vIHNlZSBub3RlIGF0IGRlY2xhcmF0aW9uIG9mIG1TdGFuZGJ5LCBtT3V0RGV2aWNlIGFuZCBtSW5EZXZpY2UKQEAgLTM5Myw2ICszOTMsMTIgQEAKIAogICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgYnJvYWRjYXN0X2woKTsKIAorICAgICAgICAgICAgICAgIHZpcnR1YWwgYm9vbCAgICAgICAgaXNUaW1lc3RhbXBDb3JyZWN0aW9uRW5hYmxlZCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgICAgICAgICAgICAgICBib29sICAgICAgICAgICAgICAgIGlzTXNkRGV2aWNlKCkgY29uc3QgeyByZXR1cm4gbUlzTXNkRGV2aWNlOyB9CisKKyAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICAgICAgICAgIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSA9IDA7CisKICAgICBtdXRhYmxlICAgICBNdXRleCAgICAgICAgICAgICAgICAgICBtTG9jazsKIAogcHJvdGVjdGVkOgpAQCAtNDM0LDYgKzQ0MCwxMiBAQAogICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIHNldE1hc3Rlck1vbm9fbChib29sIG1vbm8gX191bnVzZWQpIHsgfQogICAgIHZpcnR1YWwgICAgIGJvb2wgICAgICAgIHJlcXVpcmVNb25vQmxlbmQoKSB7IHJldHVybiBmYWxzZTsgfQogCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FsbGVkIHdpdGhpbiB0aGUgdGhyZWFkTG9vcCB0byBvYnRhaW4gdGltZXN0YW1wIGZyb20gdGhlIEhBTC4KKyAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICB0aHJlYWRsb29wX2dldEhhbFRpbWVzdGFtcF9sKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0ZW5kZWRUaW1lc3RhbXAgKnRpbWVzdGFtcCBfX3VudXNlZCkgY29uc3QgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCiAgICAgZnJpZW5kIGNsYXNzIEF1ZGlvRmxpbmdlcjsgICAgICAvLyBmb3IgbUVmZmVjdENoYWlucwogCiAgICAgICAgICAgICAgICAgY29uc3QgdHlwZV90ICAgICAgICAgICAgbVR5cGU7CkBAIC00OTMsMTAgKzUwNSwxNyBAQAogICAgICAgICAgICAgICAgIHNwPE5CTG9nOjpXcml0ZXI+ICAgICAgIG1OQkxvZ1dyaXRlcjsKICAgICAgICAgICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICBtU3lzdGVtUmVhZHk7CiAgICAgICAgICAgICAgICAgRXh0ZW5kZWRUaW1lc3RhbXAgICAgICAgbVRpbWVzdGFtcDsKKyAgICAgICAgICAgICAgICBUaW1lc3RhbXBWZXJpZmllcjwgLy8gRm9yIHRpbWVzdGFtcCBzdGF0aXN0aWNzLgorICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAvKiBmcmFtZSBjb3VudCAqLywgaW50NjRfdCAvKiB0aW1lIG5zICovPiBtVGltZXN0YW1wVmVyaWZpZXI7CisgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICAgICAgICAgbVRpbWVzdGFtcENvcnJlY3RlZERldmljZXMgPSBBVURJT19ERVZJQ0VfTk9ORTsKKyAgICAgICAgICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICBtSXNNc2REZXZpY2UgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAvLyBBIGNvbmRpdGlvbiB0aGF0IG11c3QgYmUgZXZhbHVhdGVkIGJ5IHRoZSB0aHJlYWQgbG9vcCBoYXMgY2hhbmdlZCBhbmQKICAgICAgICAgICAgICAgICAvLyB3ZSBtdXN0IG5vdCB3YWl0IGZvciBhc3luYyB3cml0ZSBjYWxsYmFjayBpbiB0aGUgdGhyZWFkIGxvb3AgYmVmb3JlIGV2YWx1YXRpbmcgaXQKICAgICAgICAgICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICBtU2lnbmFsUGVuZGluZzsKIAorI2lmZGVmIFRFRV9TSU5LCisgICAgICAgICAgICAgICAgTkJBSU9fVGVlICAgICAgICAgICAgICAgbVRlZTsKKyNlbmRpZgogICAgICAgICAgICAgICAgIC8vIEFjdGl2ZVRyYWNrcyBpcyBhIHNvcnRlZCB2ZWN0b3Igb2YgdHJhY2sgdHlwZSBUIHJlcHJlc2VudGluZyB0aGUKICAgICAgICAgICAgICAgICAvLyBhY3RpdmUgdHJhY2tzIG9mIHRocmVhZExvb3AoKSB0byBiZSBjb25zaWRlcmVkIGJ5IHRoZSBsb2NrZWQgcHJlcGFyZSBwb3J0aW9uLgogICAgICAgICAgICAgICAgIC8vIEFjdGl2ZVRyYWNrcyBzaG91bGQgYmUgYWNjZXNzZWQgd2l0aCB0aGUgVGhyZWFkQmFzZSBsb2NrIGhlbGQuCkBAIC01NDMsNiArNTYyLDkgQEAKICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgIHNpemUoKSBjb25zdCB7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbUFjdGl2ZVRyYWNrcy5zaXplKCk7CiAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYm9vbCAgICAgICAgICAgIGlzRW1wdHkoKSBjb25zdCB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbUFjdGl2ZVRyYWNrcy5pc0VtcHR5KCk7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgc3NpemVfdCAgICAgICAgIGluZGV4T2YoY29uc3Qgc3A8VD4mIGl0ZW0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtQWN0aXZlVHJhY2tzLmluZGV4T2YoaXRlbSk7CiAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTY0NSw3ICs2NjcsNyBAQAogICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlkLCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCB0eXBlX3QgdHlwZSwgYm9vbCBzeXN0ZW1SZWFkeSk7CiAgICAgdmlydHVhbCAgICAgICAgICAgICB+UGxheWJhY2tUaHJlYWQoKTsKIAotICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKKyAgICAgICAgICAgICAgICB2b2lkICAgICAgICBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgb3ZlcnJpZGU7CiAKICAgICAvLyBUaHJlYWQgdmlydHVhbHMKICAgICB2aXJ0dWFsICAgICBib29sICAgICAgICB0aHJlYWRMb29wKCk7CkBAIC03ODQsNyArODA2LDcgQEAKICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBhZGRQYXRjaFRyYWNrKGNvbnN0IHNwPFBhdGNoVHJhY2s+JiB0cmFjayk7CiAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgZGVsZXRlUGF0Y2hUcmFjayhjb25zdCBzcDxQYXRjaFRyYWNrPiYgdHJhY2spOwogCi0gICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgZ2V0QXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKTsKKyAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICB0b0F1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZyk7CiAKICAgICAgICAgICAgICAgICAvLyBSZXR1cm4gdGhlIGFzeW5jaHJvbm91cyBzaWduYWwgd2FpdCB0aW1lLgogICAgIHZpcnR1YWwgICAgIGludDY0X3QgICAgIGNvbXB1dGVXYWl0VGltZU5zX2woKSBjb25zdCB7IHJldHVybiBJTlQ2NF9NQVg7IH0KQEAgLTgwMSw2ICs4MjMsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIG1UcmFja3Muc2l6ZSgpIDwgUGxheWJhY2tUaHJlYWQ6OmtNYXhUcmFja3M7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogCisgICAgICAgICAgICAgICAgYm9vbCAgICAgICAgaXNUaW1lc3RhbXBDb3JyZWN0aW9uRW5hYmxlZCgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fZGV2aWNlc190IGRldmljZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU91dERldmljZSAmIG1UaW1lc3RhbXBDb3JyZWN0ZWREZXZpY2VzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXVkaW9faXNfb3V0cHV0X2RldmljZXMoZGV2aWNlKSAmJiBwb3Bjb3VudChkZXZpY2UpID4gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiBwcm90ZWN0ZWQ6CiAgICAgLy8gdXBkYXRlZCBieSByZWFkT3V0cHV0UGFyYW1ldGVyc19sKCkKICAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ob3JtYWxGcmFtZUNvdW50OyAgLy8gbm9ybWFsIG1peGVyIGFuZCBlZmZlY3RzCkBAIC05MzUsMTYgKzk2MiwxOSBAQAogICAgIHZpcnR1YWwgdm9pZCBkdW1wSW50ZXJuYWxzKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CiAgICAgdm9pZCAgICAgICAgZHVtcFRyYWNrcyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwogCi0gICAgLy8gVGhlIFRyYWNrcyBjbGFzcyBtYW5hZ2VzIG5hbWVzIGZvciBhbGwgdHJhY2tzCi0gICAgLy8gYWRkZWQgYW5kIHJlbW92ZWQgZnJvbSB0aGUgVGhyZWFkLgorICAgIC8vIFRoZSBUcmFja3MgY2xhc3MgbWFuYWdlcyB0cmFja3MgYWRkZWQgYW5kIHJlbW92ZWQgZnJvbSB0aGUgVGhyZWFkLgogICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgogICAgIGNsYXNzIFRyYWNrcyB7CiAgICAgcHVibGljOgotICAgICAgICBUcmFja3MoYm9vbCBzYXZlRGVsZXRlZFRyYWNrTmFtZXMpIDoKLSAgICAgICAgICAgIG1TYXZlRGVsZXRlZFRyYWNrTmFtZXMoc2F2ZURlbGV0ZWRUcmFja05hbWVzKSB7IH0KKyAgICAgICAgVHJhY2tzKGJvb2wgc2F2ZURlbGV0ZWRUcmFja0lkcykgOgorICAgICAgICAgICAgbVNhdmVEZWxldGVkVHJhY2tJZHMoc2F2ZURlbGV0ZWRUcmFja0lkcykgeyB9CiAKICAgICAgICAgLy8gU29ydGVkVmVjdG9yIG1ldGhvZHMKLSAgICAgICAgc3NpemVfdCAgICAgICAgIGFkZChjb25zdCBzcDxUPiAmdHJhY2spOworICAgICAgICBzc2l6ZV90ICAgICAgICAgYWRkKGNvbnN0IHNwPFQ+ICZ0cmFjaykgeworICAgICAgICAgICAgY29uc3Qgc3NpemVfdCBpbmRleCA9IG1UcmFja3MuYWRkKHRyYWNrKTsKKyAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoaW5kZXggPCAwLCAiY2Fubm90IGFkZCB0cmFjayIpOworICAgICAgICAgICAgcmV0dXJuIGluZGV4OworICAgICAgICB9CiAgICAgICAgIHNzaXplX3QgICAgICAgICByZW1vdmUoY29uc3Qgc3A8VD4gJnRyYWNrKTsKICAgICAgICAgc2l6ZV90ICAgICAgICAgIHNpemUoKSBjb25zdCB7CiAgICAgICAgICAgICByZXR1cm4gbVRyYWNrcy5zaXplKCk7CkBAIC05NjUsMjggKzk5NSwxOSBAQAogICAgICAgICAgICAgcmV0dXJuIG1UcmFja3MuZW5kKCk7CiAgICAgICAgIH0KIAotICAgICAgICBzaXplX3QgICAgICAgICAgcHJvY2Vzc0RlbGV0ZWRUcmFja05hbWVzKHN0ZDo6ZnVuY3Rpb248dm9pZChpbnQpPiBmKSB7Ci0gICAgICAgICAgICBjb25zdCBzaXplX3Qgc2l6ZSA9IG1EZWxldGVkVHJhY2tOYW1lcy5zaXplKCk7Ci0gICAgICAgICAgICBpZiAoc2l6ZSA+IDApIHsKLSAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGludCBuYW1lIDogbURlbGV0ZWRUcmFja05hbWVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGYobmFtZSk7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICBzaXplX3QgICAgICAgICAgcHJvY2Vzc0RlbGV0ZWRUcmFja0lkcyhzdGQ6OmZ1bmN0aW9uPHZvaWQoaW50KT4gZikgeworICAgICAgICAgICAgZm9yIChjb25zdCBpbnQgdHJhY2tJZCA6IG1EZWxldGVkVHJhY2tJZHMpIHsKKyAgICAgICAgICAgICAgICBmKHRyYWNrSWQpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHNpemU7CisgICAgICAgICAgICByZXR1cm4gbURlbGV0ZWRUcmFja0lkcy5zaXplKCk7CiAgICAgICAgIH0KIAotICAgICAgICB2b2lkICAgICAgICAgICAgY2xlYXJEZWxldGVkVHJhY2tOYW1lcygpIHsgbURlbGV0ZWRUcmFja05hbWVzLmNsZWFyKCk7IH0KKyAgICAgICAgdm9pZCAgICAgICAgICAgIGNsZWFyRGVsZXRlZFRyYWNrSWRzKCkgeyBtRGVsZXRlZFRyYWNrSWRzLmNsZWFyKCk7IH0KIAogICAgIHByaXZhdGU6Ci0gICAgICAgIC8vIFRyYWNrIG5hbWVzIHBlbmRpbmcgZGVsZXRpb24gZm9yIE1JWEVSIHR5cGUgdGhyZWFkcwotICAgICAgICBjb25zdCBib29sIG1TYXZlRGVsZXRlZFRyYWNrTmFtZXM7IC8vIHRydWUgdG8gZW5hYmxlIHRyYWNraW5nCi0gICAgICAgIHN0ZDo6c2V0PGludD4gbURlbGV0ZWRUcmFja05hbWVzOwotCi0gICAgICAgIC8vIEZhc3QgbG9va3VwIG9mIHByZXZpb3VzbHkgZGVsZXRlZCB0cmFjayBuYW1lcyBmb3IgcmV1c2UuCi0gICAgICAgIC8vIFRoaXMgaXMgYW4gYXJiaXRyYXJ5IGRlY2lzaW9uIChhY3R1YWxseSBhbnkgbm9uLW5lZ2F0aXZlCi0gICAgICAgIC8vIGludGVnZXIgdGhhdCBpc24ndCBpbiBtVHJhY2tzWypdLT5uYW1lcygpIGNvdWxkIGJlIHVzZWQpIC0gd2UgYXR0ZW1wdAotICAgICAgICAvLyB0byB1c2UgdGhlIHNtYWxsZXN0IHBvc3NpYmxlIGF2YWlsYWJsZSBuYW1lLgotICAgICAgICBzdGQ6OnNldDxpbnQ+IG1VbnVzZWRUcmFja05hbWVzOworICAgICAgICAvLyBUcmFja3MgcGVuZGluZyBkZWxldGlvbiBmb3IgTUlYRVIgdHlwZSB0aHJlYWRzCisgICAgICAgIGNvbnN0IGJvb2wgbVNhdmVEZWxldGVkVHJhY2tJZHM7IC8vIHRydWUgdG8gZW5hYmxlIHRyYWNraW5nCisgICAgICAgIHN0ZDo6c2V0PGludD4gbURlbGV0ZWRUcmFja0lkczsKIAogICAgICAgICBTb3J0ZWRWZWN0b3I8c3A8VD4+IG1UcmFja3M7IC8vIHdyYXBwZWQgU29ydGVkVmVjdG9yLgogICAgIH07CkBAIC0xMDU2LDE2ICsxMDc3LDEzIEBACiAgICAgc3A8TkJBSU9fU2luaz4gICAgICAgICAgbVBpcGVTaW5rOwogICAgIC8vIFRoZSBjdXJyZW50IHNpbmsgZm9yIHRoZSBub3JtYWwgbWl4ZXIgdG8gd3JpdGUgaXQncyAoc3ViKW1peCwgbU91dHB1dFNpbmsgb3IgbVBpcGVTaW5rCiAgICAgc3A8TkJBSU9fU2luaz4gICAgICAgICAgbU5vcm1hbFNpbms7Ci0jaWZkZWYgVEVFX1NJTksKLSAgICAvLyBGb3IgZHVtcHN5cwotICAgIHNwPE5CQUlPX1Npbms+ICAgICAgICAgIG1UZWVTaW5rOwotICAgIHNwPE5CQUlPX1NvdXJjZT4gICAgICAgIG1UZWVTb3VyY2U7Ci0jZW5kaWYKICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtU2NyZWVuU3RhdGU7ICAgLy8gY2FjaGVkIGNvcHkgb2YgZ1NjcmVlblN0YXRlCiAgICAgLy8gVE9ETzogYWRkIGNvbW1lbnQgYW5kIGFkanVzdCBzaXplIGFzIG5lZWRlZAogICAgIHN0YXRpYyBjb25zdCBzaXplX3QgICAgIGtGYXN0TWl4ZXJMb2dTaXplID0gOCAqIDEwMjQ7CiAgICAgc3A8TkJMb2c6OldyaXRlcj4gICAgICAgbUZhc3RNaXhlck5CTG9nV3JpdGVyOwogCisgICAgLy8gRG93bnN0cmVhbSBwYXRjaCBsYXRlbmN5LCBhdmFpbGFibGUgaWYgbURvd25zdHJlYW1MYXRlbmN5U3RhdE1zLmdldE4oKSA+IDAuCisgICAgYXVkaW9fdXRpbHM6OlN0YXRpc3RpY3M8ZG91YmxlPiBtRG93bnN0cmVhbUxhdGVuY3lTdGF0TXN7MC45OTl9OwogCiBwdWJsaWM6CiAgICAgdmlydHVhbCAgICAgYm9vbCAgICAgICAgaGFzRmFzdE1peGVyKCkgY29uc3QgPSAwOwpAQCAtMTEyMSw3ICsxMTM5LDYgQEAKICAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICB0aHJlYWRMb29wX3N0YW5kYnkoKTsKICAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICB0aHJlYWRMb29wX21peCgpOwogICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIHRocmVhZExvb3Bfc2xlZXBUaW1lKCk7Ci0gICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgdGhyZWFkTG9vcF9yZW1vdmVUcmFja3MoY29uc3QgVmVjdG9yPCBzcDxUcmFjaz4gPiYgdHJhY2tzVG9SZW1vdmUpOwogICAgIHZpcnR1YWwgICAgIHVpbnQzMl90ICAgIGNvcnJlY3RMYXRlbmN5X2wodWludDMyX3QgbGF0ZW5jeSkgY29uc3Q7CiAKICAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICBjcmVhdGVBdWRpb1BhdGNoX2woY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKQEAgLTExNTQsNiArMTE3MSwxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1GYXN0TWl4ZXJEdW1wU3RhdGUubVRyYWNrc1tmYXN0SW5kZXhdLm1VbmRlcnJ1bnM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogCisgICAgICAgICAgICAgICAgc3RhdHVzX3QgICAgdGhyZWFkbG9vcF9nZXRIYWxUaW1lc3RhbXBfbCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dGVuZGVkVGltZXN0YW1wICp0aW1lc3RhbXApIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1Ob3JtYWxTaW5rLmdldCgpICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtTm9ybWFsU2luay0+Z2V0VGltZXN0YW1wKCp0aW1lc3RhbXApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgIHNldE1hc3Rlck1vbm9fbChib29sIG1vbm8pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTWFzdGVyTW9uby5zdG9yZShtb25vKTsKQEAgLTEyMTEsNiArMTIzNiwyMyBAQAogICAgIHZpcnR1YWwgICAgIGJvb2wgICAgICAgIGhhc0Zhc3RNaXhlcigpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CiAKICAgICB2aXJ0dWFsICAgICBpbnQ2NF90ICAgICBjb21wdXRlV2FpdFRpbWVOc19sKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICBzdGF0dXNfdCAgICB0aHJlYWRsb29wX2dldEhhbFRpbWVzdGFtcF9sKEV4dGVuZGVkVGltZXN0YW1wICp0aW1lc3RhbXApIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gRm9yIERJUkVDVCBhbmQgT0ZGTE9BRCB0aHJlYWRzLCBxdWVyeSB0aGUgb3V0cHV0IHNpbmsgZGlyZWN0bHkuCisgICAgICAgICAgICAgICAgICAgIGlmIChtT3V0cHV0ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHVwb3NpdGlvbjY0OworICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHRpbWVzcGVjIHRpbWU7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobU91dHB1dC0+Z2V0UHJlc2VudGF0aW9uUG9zaXRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1cG9zaXRpb242NCwgJnRpbWUpID09IE9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLT5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gKGludDY0X3QpdXBvc2l0aW9uNjQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLT5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGF1ZGlvX3V0aWxzX25zX2Zyb21fdGltZXNwZWMoJnRpbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICAgICAgfQogfTsKIAogY2xhc3MgT2ZmbG9hZFRocmVhZCA6IHB1YmxpYyBEaXJlY3RPdXRwdXRUaHJlYWQgewpAQCAtMTMxOCw2ICsxMzYwLDIyIEBACiAgICAgU29ydGVkVmVjdG9yIDwgc3A8T3V0cHV0VHJhY2s+ID4gIG1PdXRwdXRUcmFja3M7CiBwdWJsaWM6CiAgICAgdmlydHVhbCAgICAgYm9vbCAgICAgICAgaGFzRmFzdE1peGVyKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICB0aHJlYWRsb29wX2dldEhhbFRpbWVzdGFtcF9sKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0ZW5kZWRUaW1lc3RhbXAgKnRpbWVzdGFtcCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICBpZiAobU91dHB1dFRyYWNrcy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICAvLyBmb3J3YXJkIHRoZSBmaXJzdCBPdXRwdXRUcmFjaydzIGtlcm5lbCBpbmZvcm1hdGlvbiBmb3IgdGltZXN0YW1wLgorICAgICAgICAgICAgY29uc3QgRXh0ZW5kZWRUaW1lc3RhbXAgdHJhY2tUaW1lc3RhbXAgPQorICAgICAgICAgICAgICAgICAgICBtT3V0cHV0VHJhY2tzWzBdLT5nZXRDbGllbnRQcm94eVRpbWVzdGFtcCgpOworICAgICAgICAgICAgaWYgKHRyYWNrVGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0gPiAwKSB7CisgICAgICAgICAgICAgICAgdGltZXN0YW1wLT5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrVGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF07CisgICAgICAgICAgICAgICAgdGltZXN0YW1wLT5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0gPQorICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tUaW1lc3RhbXAubVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdOworICAgICAgICAgICAgICAgIHJldHVybiBPSzsgIC8vIGRpc2NhcmQgc2VydmVyIHRpbWVzdGFtcCAtIHRoYXQncyBpZ25vcmVkLgorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CiB9OwogCiAvLyByZWNvcmQgdGhyZWFkCkBAIC0xMzc2LDkgKzE0MzQsNiBAQAogICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3Qgb3V0RGV2aWNlLAogICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgaW5EZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3lzdGVtUmVhZHkKLSNpZmRlZiBURUVfU0lOSwotICAgICAgICAgICAgICAgICAgICAsIGNvbnN0IHNwPE5CQUlPX1Npbms+JiB0ZWVTaW5rCi0jZW5kaWYKICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgIHZpcnR1YWwgICAgIH5SZWNvcmRUaHJlYWQoKTsKIApAQCAtMTQyNSw3ICsxNDgwLDcgQEAKICAgICAgICAgICAgIC8vIHJldHVybiB0cnVlIGlmIHRoZSBjYWxsZXIgc2hvdWxkIHRoZW4gZG8gaXQncyBwYXJ0IG9mIHRoZSBzdG9wcGluZyBwcm9jZXNzCiAgICAgICAgICAgICBib29sICAgICAgICBzdG9wKFJlY29yZFRyYWNrKiByZWNvcmRUcmFjayk7CiAKLSAgICAgICAgICAgIHZvaWQgICAgICAgIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKKyAgICAgICAgICAgIHZvaWQgICAgICAgIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSBvdmVycmlkZTsKICAgICAgICAgICAgIEF1ZGlvU3RyZWFtSW4qIGNsZWFySW5wdXQoKTsKICAgICAgICAgICAgIHZpcnR1YWwgc3A8U3RyZWFtSGFsSW50ZXJmYWNlPiBzdHJlYW0oKSBjb25zdDsKIApAQCAtMTQzOSw4ICsxNDk0LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlKTsKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHJlbGVhc2VBdWRpb1BhdGNoX2woY29uc3QgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKTsKIAotICAgICAgICAgICAgdm9pZCAgICAgICAgYWRkUGF0Y2hSZWNvcmQoY29uc3Qgc3A8UGF0Y2hSZWNvcmQ+JiByZWNvcmQpOwotICAgICAgICAgICAgdm9pZCAgICAgICAgZGVsZXRlUGF0Y2hSZWNvcmQoY29uc3Qgc3A8UGF0Y2hSZWNvcmQ+JiByZWNvcmQpOworICAgICAgICAgICAgdm9pZCAgICAgICAgYWRkUGF0Y2hUcmFjayhjb25zdCBzcDxQYXRjaFJlY29yZD4mIHJlY29yZCk7CisgICAgICAgICAgICB2b2lkICAgICAgICBkZWxldGVQYXRjaFRyYWNrKGNvbnN0IHNwPFBhdGNoUmVjb3JkPiYgcmVjb3JkKTsKIAogICAgICAgICAgICAgdm9pZCAgICAgICAgcmVhZElucHV0UGFyYW1ldGVyc19sKCk7CiAgICAgdmlydHVhbCB1aW50MzJfdCAgICBnZXRJbnB1dEZyYW1lc0xvc3QoKTsKQEAgLTE0NjEsNyArMTUxNiw3IEBACiAKICAgICB2aXJ0dWFsIHNpemVfdCAgICAgIGZyYW1lQ291bnQoKSBjb25zdCB7IHJldHVybiBtRnJhbWVDb3VudDsgfQogICAgICAgICAgICAgYm9vbCAgICAgICAgaGFzRmFzdENhcHR1cmUoKSBjb25zdCB7IHJldHVybiBtRmFzdENhcHR1cmUgIT0gMDsgfQotICAgIHZpcnR1YWwgdm9pZCAgICAgICAgZ2V0QXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKTsKKyAgICB2aXJ0dWFsIHZvaWQgICAgICAgIHRvQXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgY2hlY2tFZmZlY3RDb21wYXRpYmlsaXR5X2woY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQpOwpAQCAtMTQ4MSw2ICsxNTM2LDEzIEBACiAKICAgICAgICAgICAgIHZvaWQgICAgICAgIHVwZGF0ZU1ldGFkYXRhX2woKSBvdmVycmlkZTsKIAorICAgICAgICAgICAgYm9vbCAgICAgICAgZmFzdFRyYWNrQXZhaWxhYmxlKCkgY29uc3QgeyByZXR1cm4gbUZhc3RUcmFja0F2YWlsOyB9CisKKyAgICAgICAgICAgIGJvb2wgICAgICAgIGlzVGltZXN0YW1wQ29ycmVjdGlvbkVuYWJsZWQoKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2tzIHBvcGNvdW50IGZvciBleGFjdGx5IG9uZSBkZXZpY2UuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF1ZGlvX2lzX2lucHV0X2RldmljZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1JbkRldmljZSAmIG1UaW1lc3RhbXBDb3JyZWN0ZWREZXZpY2VzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KIHByaXZhdGU6CiAgICAgICAgICAgICAvLyBFbnRlciBzdGFuZGJ5IGlmIG5vdCBhbHJlYWR5IGluIHN0YW5kYnksIGFuZCBzZXQgbVN0YW5kYnkgZmxhZwogICAgICAgICAgICAgdm9pZCAgICBzdGFuZGJ5SWZOb3RBbHJlYWR5SW5TdGFuZGJ5KCk7CkBAIC0xNTA4LDggKzE1NzAsNiBAQAogICAgICAgICAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJzbXBJblJlYXI7ICAgIC8vIGxhc3QgZmlsbGVkIGZyYW1lICsgMQogCiAgICAgICAgICAgICAvLyBGb3IgZHVtcHN5cwotICAgICAgICAgICAgY29uc3Qgc3A8TkJBSU9fU2luaz4gICAgICAgICAgICAgICAgbVRlZVNpbms7Ci0KICAgICAgICAgICAgIGNvbnN0IHNwPE1lbW9yeURlYWxlcj4gICAgICAgICAgICAgIG1SZWFkT25seUhlYXA7CiAKICAgICAgICAgICAgIC8vIG9uZS10aW1lIGluaXRpYWxpemF0aW9uLCBubyBsb2NrcyByZXF1aXJlZApAQCAtMTU1Miw2ICsxNjEyLDggQEAKICAgICAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GYXN0VHJhY2tBdmFpbDsgICAgLy8gdHJ1ZSBpZiBmYXN0IHRyYWNrIGF2YWlsYWJsZQogICAgICAgICAgICAgLy8gY29tbW9uIHN0YXRlIHRvIGFsbCByZWNvcmQgdGhyZWFkcwogICAgICAgICAgICAgc3RkOjphdG9taWNfYm9vbCAgICAgICAgICAgICAgICAgICAgbUJ0TnJlY1N1c3BlbmRlZDsKKworICAgICAgICAgICAgaW50NjRfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZyYW1lc1JlYWQgPSAwOyAgICAvLyBjb250aW51b3VzIHJ1bm5pbmcgY291bnRlci4KIH07CiAKIGNsYXNzIE1tYXBUaHJlYWQgOiBwdWJsaWMgVGhyZWFkQmFzZQpAQCAtMTYwNCw3ICsxNjY2LDcgQEAKICAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICBjcmVhdGVBdWRpb1BhdGNoX2woY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSk7CiAgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgcmVsZWFzZUF1ZGlvUGF0Y2hfbChjb25zdCBhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpOwotICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIGdldEF1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZyk7CisgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgdG9BdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpOwogCiAgICAgdmlydHVhbCAgICAgc3A8U3RyZWFtSGFsSW50ZXJmYWNlPiBzdHJlYW0oKSBjb25zdCB7IHJldHVybiBtSGFsU3RyZWFtOyB9CiAgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgYWRkRWZmZWN0Q2hhaW5fbChjb25zdCBzcDxFZmZlY3RDaGFpbj4mIGNoYWluKTsKQEAgLTE2MjcsNyArMTY4OSw3IEBACiAgICAgICAgICAgICAgICAgLy8gU2V0cyB0aGUgVUlEIHJlY29yZHMgc2lsZW5jZQogICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIHNldFJlY29yZFNpbGVuY2VkKHVpZF90IHVpZCBfX3VudXNlZCwgYm9vbCBzaWxlbmNlZCBfX3VudXNlZCkge30KIAotICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKKyAgICAgICAgICAgICAgICB2b2lkICAgICAgICBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgb3ZlcnJpZGU7CiAgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgZHVtcEludGVybmFscyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwogICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGR1bXBUcmFja3MoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKIApAQCAtMTY4OCw2ICsxNzUwLDggQEAKIAogICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHVwZGF0ZU1ldGFkYXRhX2woKSBvdmVycmlkZTsKIAorICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIHRvQXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKTsKKwogcHJvdGVjdGVkOgogCiAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCAgICAgICAgIG1TdHJlYW1UeXBlOwpAQCAtMTcxNiw2ICsxNzgwLDggQEAKICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICBwcm9jZXNzVm9sdW1lX2woKSBvdmVycmlkZTsKICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICBzZXRSZWNvcmRTaWxlbmNlZCh1aWRfdCB1aWQsIGJvb2wgc2lsZW5jZWQpIG92ZXJyaWRlOwogCisgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgICAgdG9BdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpOworCiBwcm90ZWN0ZWQ6CiAKICAgICAgICAgICAgICAgICBBdWRpb1N0cmVhbUluKiAgbUlucHV0OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RyYWNrQmFzZS5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RyYWNrQmFzZS5oCmluZGV4IGNjZmI2OWYuLmM5NDYzOWIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja0Jhc2UuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHJhY2tCYXNlLmgKQEAgLTI1LDEzICsyNSwxMyBAQAogcHVibGljOgogICAgIGVudW0gdHJhY2tfc3RhdGUgewogICAgICAgICBJRExFLAotICAgICAgICBGTFVTSEVELAorICAgICAgICBGTFVTSEVELCAgICAgICAgLy8gZm9yIFBsYXliYWNrVHJhY2tzIG9ubHkKICAgICAgICAgU1RPUFBFRCwKICAgICAgICAgLy8gbmV4dCAyIHN0YXRlcyBhcmUgY3VycmVudGx5IHVzZWQgZm9yIGZhc3QgdHJhY2tzCiAgICAgICAgIC8vIGFuZCBvZmZsb2FkZWQgdHJhY2tzIG9ubHkKICAgICAgICAgU1RPUFBJTkdfMSwgICAgIC8vIHdhaXRpbmcgZm9yIGZpcnN0IHVuZGVycnVuCiAgICAgICAgIFNUT1BQSU5HXzIsICAgICAvLyB3YWl0aW5nIGZvciBwcmVzZW50YXRpb24gY29tcGxldGUKLSAgICAgICAgUkVTVU1JTkcsCisgICAgICAgIFJFU1VNSU5HLCAgICAgICAvLyBmb3IgUGxheWJhY2tUcmFja3Mgb25seQogICAgICAgICBBQ1RJVkUsCiAgICAgICAgIFBBVVNJTkcsCiAgICAgICAgIFBBVVNFRCwKQEAgLTU0LDExICs1NCw2IEBACiAgICAgICAgIFRZUEVfUEFUQ0gsCiAgICAgfTsKIAotICAgIGVudW0gewotICAgICAgICBUUkFDS19OQU1FX1BFTkRJTkcgPSAtMSwKLSAgICAgICAgVFJBQ0tfTkFNRV9GQUlMVVJFID0gLTIsCi0gICAgfTsKLQogICAgICAgICAgICAgICAgICAgICAgICAgVHJhY2tCYXNlKFRocmVhZEJhc2UgKnRocmVhZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8Q2xpZW50PiYgY2xpZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QmIG1BdHRyLApAQCAtOTEsNiArODYsNyBAQAogICAgICAgICAgICAgdm9pZCogICAgICAgYnVmZmVyKCkgY29uc3QgeyByZXR1cm4gbUJ1ZmZlcjsgfQogICAgICAgICAgICAgc2l6ZV90ICAgICAgYnVmZmVyU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1CdWZmZXJTaXplOyB9CiAgICAgdmlydHVhbCBib29sICAgICAgICBpc0Zhc3RUcmFjaygpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wgICAgICAgIGlzRGlyZWN0KCkgY29uc3QgPSAwOwogICAgICAgICAgICAgYm9vbCAgICAgICAgaXNPdXRwdXRUcmFjaygpIGNvbnN0IHsgcmV0dXJuIChtVHlwZSA9PSBUWVBFX09VVFBVVCk7IH0KICAgICAgICAgICAgIGJvb2wgICAgICAgIGlzUGF0Y2hUcmFjaygpIGNvbnN0IHsgcmV0dXJuIChtVHlwZSA9PSBUWVBFX1BBVENIKTsgfQogICAgICAgICAgICAgYm9vbCAgICAgICAgaXNFeHRlcm5hbFRyYWNrKCkgY29uc3QgeyByZXR1cm4gIWlzT3V0cHV0VHJhY2soKSAmJiAhaXNQYXRjaFRyYWNrKCk7IH0KQEAgLTEwMCw2ICs5NiwxMDYgQEAKIAogICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCAgYXR0cmlidXRlcygpIGNvbnN0IHsgcmV0dXJuIG1BdHRyOyB9CiAKKyNpZmRlZiBURUVfU0lOSworICAgICAgICAgICB2b2lkICAgICAgICAgZHVtcFRlZShpbnQgZmQsIGNvbnN0IHN0ZDo6c3RyaW5nICZyZWFzb24pIGNvbnN0IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRlZS5kdW1wKGZkLCByZWFzb24pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgICAgIC8qKiByZXR1cm5zIHRoZSBidWZmZXIgY29udGVudHMgc2l6ZSBjb252ZXJ0ZWQgdG8gdGltZSBpbiBtaWxsaXNlY29uZHMKKyAgICAgICAgICAgICAqIGZvciBQQ00gUGxheWJhY2sgb3IgUmVjb3JkIHN0cmVhbWluZyB0cmFja3MuIFRoZSByZXR1cm4gdmFsdWUgaXMgemVybyBmb3IKKyAgICAgICAgICAgICAqIFBDTSBzdGF0aWMgdHJhY2tzIGFuZCBub3QgZGVmaW5lZCBmb3Igbm9uLVBDTSB0cmFja3MuCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogVGhpcyBtYXkgYmUgY2FsbGVkIHdpdGhvdXQgdGhlIHRocmVhZCBsb2NrLgorICAgICAgICAgICAgICovCisgICAgdmlydHVhbCBkb3VibGUgICAgICBidWZmZXJMYXRlbmN5TXMoKSBjb25zdCB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1TZXJ2ZXJQcm94eS0+ZnJhbWVzUmVhZHlTYWZlKCkgKiAxMDAwIC8gc2FtcGxlUmF0ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiogcmV0dXJucyB3aGV0aGVyIHRoZSB0cmFjayBzdXBwb3J0cyBzZXJ2ZXIgbGF0ZW5jeSBjb21wdXRhdGlvbi4KKyAgICAgICAgICAgICAqIFRoaXMgaXMgc2V0IGluIHRoZSBjb25zdHJ1Y3RvciBhbmQgY29uc3RhbnQgdGhyb3VnaG91dCB0aGUgdHJhY2sgbGlmZXRpbWUuCisgICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgYm9vbCAgICAgICAgaXNTZXJ2ZXJMYXRlbmN5U3VwcG9ydGVkKCkgY29uc3QgeyByZXR1cm4gbVNlcnZlckxhdGVuY3lTdXBwb3J0ZWQ7IH0KKworICAgICAgICAgICAgLyoqIGNvbXB1dGVzIHRoZSBzZXJ2ZXIgbGF0ZW5jeSBmb3IgUENNIFBsYXliYWNrIG9yIFJlY29yZCB0cmFjaworICAgICAgICAgICAgICogdG8gdGhlIGRldmljZSBzaW5rL3NvdXJjZS4gIFRoaXMgaXMgdGhlIHRpbWUgZm9yIHRoZSBuZXh0IGZyYW1lIGluIHRoZSB0cmFjayBidWZmZXIKKyAgICAgICAgICAgICAqIHdyaXR0ZW4gb3IgcmVhZCBmcm9tIHRoZSBzZXJ2ZXIgdGhyZWFkIHRvIHRoZSBkZXZpY2Ugc291cmNlIG9yIHNpbmsuCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogVGhpcyBtYXkgYmUgY2FsbGVkIHdpdGhvdXQgdGhlIHRocmVhZCBsb2NrLCBidXQgbGF0ZW5jeU1zIGFuZCBmcm9tVHJhY2sKKyAgICAgICAgICAgICAqIG1heSBiZSBub3QgYmUgc3luY2hyb25pemVkLiBGb3IgZXhhbXBsZSBQYXRjaFBhbmVsIG1heSBub3Qgb2J0YWluIHRoZQorICAgICAgICAgICAgICogdGhyZWFkIGxvY2sgYmVmb3JlIGNhbGxpbmcuCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogXHBhcmFtIGxhdGVuY3lNcyBvbiBzdWNjZXNzIGlzIHNldCB0byB0aGUgbGF0ZW5jeSBpbiBtaWxsaXNlY29uZHMgb2YgdGhlCisgICAgICAgICAgICAgKiAgICAgICAgbmV4dCBmcmFtZSB3cml0dGVuL3JlYWQgYnkgdGhlIHNlcnZlciB0aHJlYWQgdG8vZnJvbSB0aGUgdHJhY2sgYnVmZmVyCisgICAgICAgICAgICAgKiAgICAgICAgZnJvbSB0aGUgZGV2aWNlIHNvdXJjZS9zaW5rLgorICAgICAgICAgICAgICogXHBhcmFtIGZyb21UcmFjayBvbiBzdWNjZXNzIGlzIHNldCB0byB0cnVlIGlmIGxhdGVuY3kgd2FzIGNvbXB1dGVkIGRpcmVjdGx5CisgICAgICAgICAgICAgKiAgICAgICAgZnJvbSB0aGUgdHJhY2sgdGltZXN0YW1wOyBvdGhlcndpc2Ugc2V0IHRvIGZhbHNlIGlmIGxhdGVuY3kgd2FzCisgICAgICAgICAgICAgKiAgICAgICAgZXN0aW1hdGVkIGZyb20gdGhlIHNlcnZlciB0aW1lc3RhbXAuCisgICAgICAgICAgICAgKiAgICAgICAgZnJvbVRyYWNrIG1heSBiZSBudWxscHRyIG9yIG9taXR0ZWQgaWYgbm90IHJlcXVpcmVkLgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqIFxyZXR1cm5zIE9LIG9yIElOVkFMSURfT1BFUkFUSU9OIG9uIGZhaWx1cmUuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHN0YXR1c190ICAgIGdldFNlcnZlckxhdGVuY3lNcyhkb3VibGUgKmxhdGVuY3lNcywgYm9vbCAqZnJvbVRyYWNrID0gbnVsbHB0cikgY29uc3QgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNTZXJ2ZXJMYXRlbmN5U3VwcG9ydGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIG5vIHRocmVhZCBsb2NrIGlzIGFjcXVpcmVkLCB0aGVzZSBhdG9taWNzIGFyZSBub3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzeW5jaHJvbml6ZWQgd2l0aCBlYWNoIG90aGVyLCBjb25zaWRlcmVkIGEgYmVuaWduIHJhY2UuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUgc2VydmVyTGF0ZW5jeU1zID0gbVNlcnZlckxhdGVuY3lNcy5sb2FkKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlcnZlckxhdGVuY3lNcyA9PSAwLikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmcm9tVHJhY2sgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZnJvbVRyYWNrID0gbVNlcnZlckxhdGVuY3lGcm9tVHJhY2subG9hZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbGF0ZW5jeU1zID0gc2VydmVyTGF0ZW5jeU1zOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoqIGNvbXB1dGVzIHRoZSB0b3RhbCBjbGllbnQgbGF0ZW5jeSBmb3IgUENNIFBsYXliYWNrIG9yIFJlY29yZCB0cmFja3MKKyAgICAgICAgICAgICAqIGZvciB0aGUgbmV4dCBjbGllbnQgYXBwIGFjY2VzcyB0byB0aGUgZGV2aWNlIHNpbmsvc291cmNlOyBpLmUuIHRoZQorICAgICAgICAgICAgICogc2VydmVyIGxhdGVuY3kgcGx1cyB0aGUgYnVmZmVyIGxhdGVuY3kuCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogVGhpcyBtYXkgYmUgY2FsbGVkIHdpdGhvdXQgdGhlIHRocmVhZCBsb2NrLCBidXQgbGF0ZW5jeU1zIGFuZCBmcm9tVHJhY2sKKyAgICAgICAgICAgICAqIG1heSBiZSBub3QgYmUgc3luY2hyb25pemVkLiBGb3IgZXhhbXBsZSBQYXRjaFBhbmVsIG1heSBub3Qgb2J0YWluIHRoZQorICAgICAgICAgICAgICogdGhyZWFkIGxvY2sgYmVmb3JlIGNhbGxpbmcuCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogXHBhcmFtIGxhdGVuY3lNcyBvbiBzdWNjZXNzIGlzIHNldCB0byB0aGUgbGF0ZW5jeSBpbiBtaWxsaXNlY29uZHMgb2YgdGhlCisgICAgICAgICAgICAgKiAgICAgICAgbmV4dCBmcmFtZSB3cml0dGVuL3JlYWQgYnkgdGhlIGNsaWVudCBhcHAgdG8vZnJvbSB0aGUgdHJhY2sgYnVmZmVyCisgICAgICAgICAgICAgKiAgICAgICAgZnJvbSB0aGUgZGV2aWNlIHNpbmsvc291cmNlLgorICAgICAgICAgICAgICogXHBhcmFtIGZyb21UcmFjayBvbiBzdWNjZXNzIGlzIHNldCB0byB0cnVlIGlmIGxhdGVuY3kgd2FzIGNvbXB1dGVkIGRpcmVjdGx5CisgICAgICAgICAgICAgKiAgICAgICAgZnJvbSB0aGUgdHJhY2sgdGltZXN0YW1wOyBvdGhlcndpc2Ugc2V0IHRvIGZhbHNlIGlmIGxhdGVuY3kgd2FzCisgICAgICAgICAgICAgKiAgICAgICAgZXN0aW1hdGVkIGZyb20gdGhlIHNlcnZlciB0aW1lc3RhbXAuCisgICAgICAgICAgICAgKiAgICAgICAgZnJvbVRyYWNrIG1heSBiZSBudWxscHRyIG9yIG9taXR0ZWQgaWYgbm90IHJlcXVpcmVkLgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqIFxyZXR1cm5zIE9LIG9yIElOVkFMSURfT1BFUkFUSU9OIG9uIGZhaWx1cmUuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHN0YXR1c190ICAgIGdldFRyYWNrTGF0ZW5jeU1zKGRvdWJsZSAqbGF0ZW5jeU1zLCBib29sICpmcm9tVHJhY2sgPSBudWxscHRyKSBjb25zdCB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHNlcnZlckxhdGVuY3lNczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBnZXRTZXJ2ZXJMYXRlbmN5TXMoJnNlcnZlckxhdGVuY3lNcywgZnJvbVRyYWNrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IE9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpsYXRlbmN5TXMgPSBzZXJ2ZXJMYXRlbmN5TXMgKyBidWZmZXJMYXRlbmN5TXMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAvLyBUT0RPOiBDb25zaWRlciBtYWtpbmcgdGhpcyBleHRlcm5hbC4KKyAgICAgICAgICAgc3RydWN0IEZyYW1lVGltZSB7CisgICAgICAgICAgICAgICBpbnQ2NF90IGZyYW1lczsKKyAgICAgICAgICAgICAgIGludDY0X3QgdGltZU5zOworICAgICAgICAgICB9OworCisgICAgICAgICAgIC8vIEtlcm5lbEZyYW1lVGltZSBpcyB1cGRhdGVkIHBlciAibWl4IiBwZXJpb2QgZXZlbiBmb3Igbm9uLXBjbSB0cmFja3MuCisgICAgICAgICAgIHZvaWQgICAgICAgICBnZXRLZXJuZWxGcmFtZVRpbWUoRnJhbWVUaW1lICpmdCkgY29uc3QgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgKmZ0ID0gbUtlcm5lbEZyYW1lVGltZS5sb2FkKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0KCkgY29uc3QgeyByZXR1cm4gbUZvcm1hdDsgfQorICAgICAgICAgICBpbnQgaWQoKSBjb25zdCB7IHJldHVybiBtSWQ7IH0KKwogcHJvdGVjdGVkOgogICAgIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihUcmFja0Jhc2UpOwogCkBAIC0xMTEsOCArMjA3LDYgQEAKICAgICAvLyBidXQgcHV0dGluZyBpdCBpbiBUcmFja0Jhc2UgYXZvaWRzIHRoZSBjb21wbGV4aXR5IG9mIHZpcnR1YWwgaW5oZXJpdGFuY2UKICAgICB2aXJ0dWFsIHNpemVfdCAgZnJhbWVzUmVhZHkoKSBjb25zdCB7IHJldHVybiBTSVpFX01BWDsgfQogCi0gICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0KCkgY29uc3QgeyByZXR1cm4gbUZvcm1hdDsgfQotCiAgICAgdWludDMyX3QgY2hhbm5lbENvdW50KCkgY29uc3QgeyByZXR1cm4gbUNoYW5uZWxDb3VudDsgfQogCiAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2soKSBjb25zdCB7IHJldHVybiBtQ2hhbm5lbE1hc2s7IH0KQEAgLTIwOCwxMyArMzAyLDE5IEBACiAgICAgY29uc3QgYm9vbCAgICAgICAgICBtSXNPdXQ7CiAgICAgc3A8U2VydmVyUHJveHk+ICAgICBtU2VydmVyUHJveHk7CiAgICAgY29uc3QgaW50ICAgICAgICAgICBtSWQ7Ci0gICAgc3A8TkJBSU9fU2luaz4gICAgICBtVGVlU2luazsKLSAgICBzcDxOQkFJT19Tb3VyY2U+ICAgIG1UZWVTb3VyY2U7CisjaWZkZWYgVEVFX1NJTksKKyAgICBOQkFJT19UZWUgICAgICAgICAgIG1UZWU7CisjZW5kaWYKICAgICBib29sICAgICAgICAgICAgICAgIG1UZXJtaW5hdGVkOwogICAgIHRyYWNrX3R5cGUgICAgICAgICAgbVR5cGU7ICAgICAgLy8gbXVzdCBiZSBvbmUgb2YgVFlQRV9ERUZBVUxULCBUWVBFX09VVFBVVCwgVFlQRV9QQVRDSCAuLi4KICAgICBhdWRpb19pb19oYW5kbGVfdCAgIG1UaHJlYWRJb0hhbmRsZTsgLy8gSS9PIGhhbmRsZSBvZiB0aGUgdGhyZWFkIHRoZSB0cmFjayBpcyBhdHRhY2hlZCB0bwogICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgbVBvcnRJZDsgLy8gdW5pcXVlIElEIGZvciB0aGlzIHRyYWNrIHVzZWQgYnkgYXVkaW8gcG9saWN5CiAgICAgYm9vbCAgICAgICAgICAgICAgICBtSXNJbnZhbGlkOyAvLyBub24tcmVzZXR0YWJsZSBsYXRjaCwgc2V0IGJ5IGludmFsaWRhdGUoKQorCisgICAgYm9vbCAgICAgICAgICAgICAgICBtU2VydmVyTGF0ZW5jeVN1cHBvcnRlZCA9IGZhbHNlOworICAgIHN0ZDo6YXRvbWljPGJvb2w+ICAgbVNlcnZlckxhdGVuY3lGcm9tVHJhY2t7fTsgLy8gbGF0ZW5jeSBmcm9tIHRyYWNrIG9yIHNlcnZlciB0aW1lc3RhbXAuCisgICAgc3RkOjphdG9taWM8ZG91YmxlPiBtU2VydmVyTGF0ZW5jeU1ze307ICAgICAgICAvLyBsYXN0IGxhdGVuY3kgcHVzaGVkIGZyb20gc2VydmVyIHRocmVhZC4KKyAgICBzdGQ6OmF0b21pYzxGcmFtZVRpbWU+IG1LZXJuZWxGcmFtZVRpbWV7fTsgICAgIC8vIGxhc3QgZnJhbWUgdGltZSBvbiBrZXJuZWwgc2lkZS4KIH07CiAKIC8vIFBhdGNoUHJveHlCdWZmZXJQcm92aWRlciBpbnRlcmZhY2UgaXMgaW1wbGVtZW50ZWQgYnkgUGF0Y2hUcmFjayBhbmQgUGF0Y2hSZWNvcmQuCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHJhY2tzLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja3MuY3BwCmluZGV4IDZkMjVmYjkuLmYyNjE3YWUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja3MuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja3MuY3BwCkBAIC0yOCwxMSArMjgsMTEgQEAKICNpbmNsdWRlIDxwcml2YXRlL21lZGlhL0F1ZGlvVHJhY2tTaGFyZWQuaD4KIAogI2luY2x1ZGUgIkF1ZGlvRmxpbmdlci5oIgotI2luY2x1ZGUgIlNlcnZpY2VVdGlsaXRpZXMuaCIKIAogI2luY2x1ZGUgPG1lZGlhL25iYWlvL1BpcGUuaD4KICNpbmNsdWRlIDxtZWRpYS9uYmFpby9QaXBlUmVhZGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvUmVjb3JkQnVmZmVyQ29udmVydGVyLmg+CisjaW5jbHVkZSA8bWVkaWF1dGlscy9TZXJ2aWNlVXRpbGl0aWVzLmg+CiAjaW5jbHVkZSA8YXVkaW9fdXRpbHMvbWluaWZsb2F0Lmg+CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTU2LDYgKzU2LDggQEAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vICAgICAgVHJhY2tCYXNlCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjdW5kZWYgTE9HX1RBRworI2RlZmluZSBMT0dfVEFHICJBRjo6VHJhY2tCYXNlIgogCiBzdGF0aWMgdm9sYXRpbGUgaW50MzJfdCBuZXh0VHJhY2tJZCA9IDU1OwogCkBAIC0xMDIsOSArMTA0LDEwIEBACiAgICAgICAgIG1Jc0ludmFsaWQoZmFsc2UpCiB7CiAgICAgY29uc3QgdWlkX3QgY2FsbGluZ1VpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKTsKLSAgICBpZiAoIWlzVHJ1c3RlZENhbGxpbmdVaWQoY2FsbGluZ1VpZCkgfHwgY2xpZW50VWlkID09IEFVRElPX1VJRF9JTlZBTElEKSB7CisgICAgaWYgKCFpc0F1ZGlvU2VydmVyT3JNZWRpYVNlcnZlclVpZChjYWxsaW5nVWlkKSB8fCBjbGllbnRVaWQgPT0gQVVESU9fVUlEX0lOVkFMSUQpIHsKICAgICAgICAgQUxPR1dfSUYoY2xpZW50VWlkICE9IEFVRElPX1VJRF9JTlZBTElEICYmIGNsaWVudFVpZCAhPSBjYWxsaW5nVWlkLAotICAgICAgICAgICAgICAgICIlcyB1aWQgJWQgdHJpZWQgdG8gcGFzcyBpdHNlbGYgb2ZmIGFzICVkIiwgX19GVU5DVElPTl9fLCBjYWxsaW5nVWlkLCBjbGllbnRVaWQpOworICAgICAgICAgICAgICAgICIlcyglZCk6IHVpZCAlZCB0cmllZCB0byBwYXNzIGl0c2VsZiBvZmYgYXMgJWQiLAorICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbUlkLCBjYWxsaW5nVWlkLCBjbGllbnRVaWQpOwogICAgICAgICBjbGllbnRVaWQgPSBjYWxsaW5nVWlkOwogICAgIH0KICAgICAvLyBjbGllbnRVaWQgY29udGFpbnMgdGhlIHVpZCBvZiB0aGUgYXBwIHRoYXQgaXMgcmVzcG9uc2libGUgZm9yIHRoaXMgdHJhY2ssIHNvIHdlIGNhbiBibGFtZQpAQCAtMTQ0LDcgKzE0Nyw3IEBACiAgICAgICAgIG1DYmxrTWVtb3J5ID0gY2xpZW50LT5oZWFwKCktPmFsbG9jYXRlKHNpemUpOwogICAgICAgICBpZiAobUNibGtNZW1vcnkgPT0gMCB8fAogICAgICAgICAgICAgICAgIChtQ2JsayA9IHN0YXRpY19jYXN0PGF1ZGlvX3RyYWNrX2NibGtfdCAqPihtQ2Jsa01lbW9yeS0+cG9pbnRlcigpKSkgPT0gTlVMTCkgewotICAgICAgICAgICAgQUxPR0UoIm5vdCBlbm91Z2ggbWVtb3J5IGZvciBBdWRpb1RyYWNrIHNpemU9JXp1Iiwgc2l6ZSk7CisgICAgICAgICAgICBBTE9HRSgiJXMoJWQpOiBub3QgZW5vdWdoIG1lbW9yeSBmb3IgQXVkaW9UcmFjayBzaXplPSV6dSIsIF9fZnVuY19fLCBtSWQsIHNpemUpOwogICAgICAgICAgICAgY2xpZW50LT5oZWFwKCktPmR1bXAoIkF1ZGlvVHJhY2siKTsKICAgICAgICAgICAgIG1DYmxrTWVtb3J5LmNsZWFyKCk7CiAgICAgICAgICAgICByZXR1cm47CkBAIC0xNTIsNyArMTU1LDcgQEAKICAgICB9IGVsc2UgewogICAgICAgICBtQ2JsayA9IChhdWRpb190cmFja19jYmxrX3QgKikgbWFsbG9jKHNpemUpOwogICAgICAgICBpZiAobUNibGsgPT0gTlVMTCkgewotICAgICAgICAgICAgQUxPR0UoIm5vdCBlbm91Z2ggbWVtb3J5IGZvciBBdWRpb1RyYWNrIHNpemU9JXp1Iiwgc2l6ZSk7CisgICAgICAgICAgICBBTE9HRSgiJXMoJWQpOiBub3QgZW5vdWdoIG1lbW9yeSBmb3IgQXVkaW9UcmFjayBzaXplPSV6dSIsIF9fZnVuY19fLCBtSWQsIHNpemUpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgfQpAQCAtMTY2LDcgKzE2OSw4IEBACiAgICAgICAgICAgICBpZiAocm9IZWFwID09IDAgfHwKICAgICAgICAgICAgICAgICAgICAgKG1CdWZmZXJNZW1vcnkgPSByb0hlYXAtPmFsbG9jYXRlKGJ1ZmZlclNpemUpKSA9PSAwIHx8CiAgICAgICAgICAgICAgICAgICAgIChtQnVmZmVyID0gbUJ1ZmZlck1lbW9yeS0+cG9pbnRlcigpKSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIm5vdCBlbm91Z2ggbWVtb3J5IGZvciByZWFkLW9ubHkgYnVmZmVyIHNpemU9JXp1IiwgYnVmZmVyU2l6ZSk7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzKCVkKTogbm90IGVub3VnaCBtZW1vcnkgZm9yIHJlYWQtb25seSBidWZmZXIgc2l6ZT0lenUiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1JZCwgYnVmZmVyU2l6ZSk7CiAgICAgICAgICAgICAgICAgaWYgKHJvSGVhcCAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIHJvSGVhcC0+ZHVtcCgiYnVmZmVyIik7CiAgICAgICAgICAgICAgICAgfQpAQCAtMjA1LDI3ICsyMDksMTIgQEAKICAgICAgICAgICAgIG1CdWZmZXIgPSBidWZmZXI7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoImludmFsaWQgYWxsb2NhdGlvbiB0eXBlOiAlZCIsIChpbnQpYWxsb2MpOworICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiJXMoJWQpOiBpbnZhbGlkIGFsbG9jYXRpb24gdHlwZTogJWQiLCBfX2Z1bmNfXywgbUlkLCAoaW50KWFsbG9jKTsKICAgICAgICAgfQogICAgICAgICBtQnVmZmVyU2l6ZSA9IGJ1ZmZlclNpemU7CiAKICNpZmRlZiBURUVfU0lOSwotICAgICAgICBpZiAobVRlZVNpbmtUcmFja0VuYWJsZWQpIHsKLSAgICAgICAgICAgIE5CQUlPX0Zvcm1hdCBwaXBlRm9ybWF0ID0gRm9ybWF0X2Zyb21fU1JfQyhtU2FtcGxlUmF0ZSwgbUNoYW5uZWxDb3VudCwgbUZvcm1hdCk7Ci0gICAgICAgICAgICBpZiAoRm9ybWF0X2lzVmFsaWQocGlwZUZvcm1hdCkpIHsKLSAgICAgICAgICAgICAgICBQaXBlICpwaXBlID0gbmV3IFBpcGUobVRlZVNpbmtUcmFja0ZyYW1lcywgcGlwZUZvcm1hdCk7Ci0gICAgICAgICAgICAgICAgc2l6ZV90IG51bUNvdW50ZXJPZmZlcnMgPSAwOwotICAgICAgICAgICAgICAgIGNvbnN0IE5CQUlPX0Zvcm1hdCBvZmZlcnNbMV0gPSB7cGlwZUZvcm1hdH07Ci0gICAgICAgICAgICAgICAgc3NpemVfdCBpbmRleCA9IHBpcGUtPm5lZ290aWF0ZShvZmZlcnMsIDEsIE5VTEwsIG51bUNvdW50ZXJPZmZlcnMpOwotICAgICAgICAgICAgICAgIEFMT0dfQVNTRVJUKGluZGV4ID09IDApOwotICAgICAgICAgICAgICAgIFBpcGVSZWFkZXIgKnBpcGVSZWFkZXIgPSBuZXcgUGlwZVJlYWRlcigqcGlwZSk7Ci0gICAgICAgICAgICAgICAgbnVtQ291bnRlck9mZmVycyA9IDA7Ci0gICAgICAgICAgICAgICAgaW5kZXggPSBwaXBlUmVhZGVyLT5uZWdvdGlhdGUob2ZmZXJzLCAxLCBOVUxMLCBudW1Db3VudGVyT2ZmZXJzKTsKLSAgICAgICAgICAgICAgICBBTE9HX0FTU0VSVChpbmRleCA9PSAwKTsKLSAgICAgICAgICAgICAgICBtVGVlU2luayA9IHBpcGU7Ci0gICAgICAgICAgICAgICAgbVRlZVNvdXJjZSA9IHBpcGVSZWFkZXI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICAgICAgbVRlZS5zZXQoc2FtcGxlUmF0ZSwgbUNoYW5uZWxDb3VudCwgZm9ybWF0LCBOQkFJT19UZWU6OlRFRV9GTEFHX1RSQUNLKTsKICNlbmRpZgogCiAgICAgfQpAQCAtMjQ0LDkgKzIzMyw2IEBACiAKIEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6VHJhY2tCYXNlOjp+VHJhY2tCYXNlKCkKIHsKLSNpZmRlZiBURUVfU0lOSwotICAgIGR1bXBUZWUoLTEsIG1UZWVTb3VyY2UsIG1JZCwgJ1QnKTsKLSNlbmRpZgogICAgIC8vIGRlbGV0ZSB0aGUgcHJveHkgYmVmb3JlIGRlbGV0aW5nIHRoZSBzaGFyZWQgbWVtb3J5IGl0IHJlZmVycyB0bywgdG8gYXZvaWQgZGFuZ2xpbmcgcmVmZXJlbmNlCiAgICAgbVNlcnZlclByb3h5LmNsZWFyKCk7CiAgICAgaWYgKG1DYmxrICE9IE5VTEwpIHsKQEAgLTI3NCw5ICsyNjAsNyBAQAogdm9pZCBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OlRyYWNrQmFzZTo6cmVsZWFzZUJ1ZmZlcihBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIqIGJ1ZmZlcikKIHsKICNpZmRlZiBURUVfU0lOSwotICAgIGlmIChtVGVlU2luayAhPSAwKSB7Ci0gICAgICAgICh2b2lkKSBtVGVlU2luay0+d3JpdGUoYnVmZmVyLT5yYXcsIGJ1ZmZlci0+ZnJhbWVDb3VudCk7Ci0gICAgfQorICAgIG1UZWUud3JpdGUoYnVmZmVyLT5yYXcsIGJ1ZmZlci0+ZnJhbWVDb3VudCk7CiAjZW5kaWYKIAogICAgIFNlcnZlclByb3h5OjpCdWZmZXIgYnVmOwpAQCAtMjk2LDYgKzI4MCw4IEBACiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyAgICAgIFBsYXliYWNrCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjdW5kZWYgTE9HX1RBRworI2RlZmluZSBMT0dfVEFHICJBRjo6VHJhY2tIYW5kbGUiCiAKIEF1ZGlvRmxpbmdlcjo6VHJhY2tIYW5kbGU6OlRyYWNrSGFuZGxlKGNvbnN0IHNwPEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrPiYgdHJhY2spCiAgICAgOiBCbkF1ZGlvVHJhY2soKSwKQEAgLTM2OCw2ICszNTQsOCBAQAogfQogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjdW5kZWYgTE9HX1RBRworI2RlZmluZSBMT0dfVEFHICJBRjo6VHJhY2siCiAKIC8vIFRyYWNrIGNvbnN0cnVjdG9yIG11c3QgYmUgY2FsbGVkIHdpdGggQXVkaW9GbGluZ2VyOjptTG9jayBhbmQgVGhyZWFkQmFzZTo6bUxvY2sgaGVsZAogQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OlRyYWNrKApAQCAtMzk3LDcgKzM4NSw2IEBACiAgICAgLy8gbVJldHJ5Q291bnQgaW5pdGlhbGl6ZWQgbGF0ZXIgd2hlbiBuZWVkZWQKICAgICBtU2hhcmVkQnVmZmVyKHNoYXJlZEJ1ZmZlciksCiAgICAgbVN0cmVhbVR5cGUoc3RyZWFtVHlwZSksCi0gICAgbU5hbWUoVFJBQ0tfTkFNRV9GQUlMVVJFKSwgIC8vIHNldCB0byBUUkFDS19OQU1FX1BFTkRJTkcgb24gY29uc3RydWN0b3Igc3VjY2Vzcy4KICAgICBtTWFpbkJ1ZmZlcih0aHJlYWQtPnNpbmtCdWZmZXIoKSksCiAgICAgbUF1eEJ1ZmZlcihOVUxMKSwKICAgICBtQXV4RWZmZWN0SWQoMCksIG1IYXNWb2x1bWVDb250cm9sbGVyKGZhbHNlKSwKQEAgLTQxNyw4ICs0MDQsOCBAQAogICAgIC8vIGNsaWVudCA9PSAwIGltcGxpZXMgc2hhcmVkQnVmZmVyID09IDAKICAgICBBTE9HX0FTU0VSVCghKGNsaWVudCA9PSAwICYmIHNoYXJlZEJ1ZmZlciAhPSAwKSk7CiAKLSAgICBBTE9HVl9JRihzaGFyZWRCdWZmZXIgIT0gMCwgInNoYXJlZEJ1ZmZlcjogJXAsIHNpemU6ICV6dSIsIHNoYXJlZEJ1ZmZlci0+cG9pbnRlcigpLAotICAgICAgICAgICAgc2hhcmVkQnVmZmVyLT5zaXplKCkpOworICAgIEFMT0dWX0lGKHNoYXJlZEJ1ZmZlciAhPSAwLCAiJXMoJWQpOiBzaGFyZWRCdWZmZXI6ICVwLCBzaXplOiAlenUiLAorICAgICAgICAgICAgX19mdW5jX18sIG1JZCwgc2hhcmVkQnVmZmVyLT5wb2ludGVyKCksIHNoYXJlZEJ1ZmZlci0+c2l6ZSgpKTsKIAogICAgIGlmIChtQ2JsayA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybjsKQEAgLTQzNCw3ICs0MjEsNyBAQAogICAgIG1TZXJ2ZXJQcm94eSA9IG1BdWRpb1RyYWNrU2VydmVyUHJveHk7CiAKICAgICBpZiAoIXRocmVhZC0+aXNUcmFja0FsbG93ZWRfbChjaGFubmVsTWFzaywgZm9ybWF0LCBzZXNzaW9uSWQsIHVpZCkpIHsKLSAgICAgICAgQUxPR0UoIm5vIG1vcmUgdHJhY2tzIGF2YWlsYWJsZSIpOworICAgICAgICBBTE9HRSgiJXMoJWQpOiBubyBtb3JlIHRyYWNrcyBhdmFpbGFibGUiLCBfX2Z1bmNfXywgbUlkKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICAvLyBvbmx5IGFsbG9jYXRlIGEgZmFzdCB0cmFjayBpbmRleCBpZiB3ZSB3ZXJlIGFibGUgdG8gYWxsb2NhdGUgYSBub3JtYWwgdHJhY2sgbmFtZQpAQCAtNDUzLDEyICs0NDAsMTggQEAKICAgICAgICAgbUZhc3RJbmRleCA9IGk7CiAgICAgICAgIHRocmVhZC0+bUZhc3RUcmFja0F2YWlsTWFzayAmPSB+KDEgPDwgaSk7CiAgICAgfQotICAgIG1OYW1lID0gVFJBQ0tfTkFNRV9QRU5ESU5HOworCisgICAgbVNlcnZlckxhdGVuY3lTdXBwb3J0ZWQgPSB0aHJlYWQtPnR5cGUoKSA9PSBUaHJlYWRCYXNlOjpNSVhFUgorICAgICAgICAgICAgfHwgdGhyZWFkLT50eXBlKCkgPT0gVGhyZWFkQmFzZTo6RFVQTElDQVRJTkc7CisjaWZkZWYgVEVFX1NJTksKKyAgICBtVGVlLnNldElkKHN0ZDo6c3RyaW5nKCJfIikgKyBzdGQ6OnRvX3N0cmluZyhtVGhyZWFkSW9IYW5kbGUpCisgICAgICAgICAgICArICJfIiArIHN0ZDo6dG9fc3RyaW5nKG1JZCkpOworI2VuZGlmCiB9CiAKIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrOjp+VHJhY2soKQogewotICAgIEFMT0dWKCJQbGF5YmFja1RocmVhZDo6VHJhY2sgZGVzdHJ1Y3RvciIpOworICAgIEFMT0dWKCIlcyglZCkiLCBfX2Z1bmNfXywgbUlkKTsKIAogICAgIC8vIFRoZSBkZXN0cnVjdG9yIHdvdWxkIGNsZWFyIG1TaGFyZWRCdWZmZXIsCiAgICAgLy8gYnV0IGl0IHdpbGwgbm90IHB1c2ggdGhlIGRlY3JlbWVudGVkIHJlZmVyZW5jZSBjb3VudCwKQEAgLTQ3Miw3ICs0NjUsNyBAQAogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OmluaXRDaGVjaygpIGNvbnN0CiB7CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gVHJhY2tCYXNlOjppbml0Q2hlY2soKTsKLSAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SICYmIG1OYW1lID09IFRSQUNLX05BTUVfRkFJTFVSRSkgeworICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IgJiYgbUNibGsgPT0gbnVsbHB0cikgewogICAgICAgICBzdGF0dXMgPSBOT19NRU1PUlk7CiAgICAgfQogICAgIHJldHVybiBzdGF0dXM7CkBAIC00OTgsMTggKzQ5MSwyMCBAQAogICAgICAgICAgICAgd2FzQWN0aXZlID0gcGxheWJhY2tUaHJlYWQtPmRlc3Ryb3lUcmFja19sKHRoaXMpOwogICAgICAgICB9CiAgICAgICAgIGlmIChpc0V4dGVybmFsVHJhY2soKSAmJiAhd2FzQWN0aXZlKSB7Ci0gICAgICAgICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZU91dHB1dChtVGhyZWFkSW9IYW5kbGUsIG1TdHJlYW1UeXBlLCBtU2Vzc2lvbklkKTsKKyAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlT3V0cHV0KG1Qb3J0SWQpOwogICAgICAgICB9CiAgICAgfQogfQogCi0vKnN0YXRpYyovIHZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OmFwcGVuZER1bXBIZWFkZXIoU3RyaW5nOCYgcmVzdWx0KQordm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6YXBwZW5kRHVtcEhlYWRlcihTdHJpbmc4JiByZXN1bHQpCiB7Ci0gICAgcmVzdWx0LmFwcGVuZCgiVCBOYW1lIEFjdGl2ZSBDbGllbnQgU2Vzc2lvbiBTICBGbGFncyAiCi0gICAgICAgICAgICAgICAgICAiICBGb3JtYXQgQ2huIG1hc2sgIFNSYXRlICIKLSAgICAgICAgICAgICAgICAgICJTVCAgTCBkQiAgUiBkQiAgVlMgZEIgIgotICAgICAgICAgICAgICAgICAgIiAgU2VydmVyIEZybUNudCAgRnJtUmR5IEYgVW5kZXJydW5zICBGbHVzaGVkICIKLSAgICAgICAgICAgICAgICAgICJNYWluIEJ1ZiAgQXV4IEJ1ZlxuIik7CisgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiVHlwZSAgICAgSWQgQWN0aXZlIENsaWVudCBTZXNzaW9uIFMgIEZsYWdzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICIgIEZvcm1hdCBDaG4gbWFzayAgU1JhdGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgIlNUIFVzZyBDVCAiCisgICAgICAgICAgICAgICAgICAgICAgICAiIEcgZGIgIEwgZEIgIFIgZEIgIFZTIGRCICIKKyAgICAgICAgICAgICAgICAgICAgICAgICIgIFNlcnZlciBGcm1DbnQgIEZybVJkeSBGIFVuZGVycnVucyAgRmx1c2hlZCIKKyAgICAgICAgICAgICAgICAgICAgICAgICIlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGlzU2VydmVyTGF0ZW5jeVN1cHBvcnRlZCgpID8gIiAgIExhdGVuY3kiIDogIiIpOwogfQogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrOjphcHBlbmREdW1wKFN0cmluZzgmIHJlc3VsdCwgYm9vbCBhY3RpdmUpCkBAIC01MTgsNyArNTEzLDcgQEAKICAgICBzd2l0Y2ggKG1UeXBlKSB7CiAgICAgY2FzZSBUWVBFX0RFRkFVTFQ6CiAgICAgY2FzZSBUWVBFX09VVFBVVDoKLSAgICAgICAgaWYgKG1TaGFyZWRCdWZmZXIuZ2V0KCkgIT0gbnVsbHB0cikgeworICAgICAgICBpZiAoaXNTdGF0aWMoKSkgewogICAgICAgICAgICAgdHJhY2tUeXBlID0gJ1MnOyAvLyBzdGF0aWMKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHRyYWNrVHlwZSA9ICcgJzsgLy8gbm9ybWFsCkBAIC01MzIsMTMgKzUyNyw5IEBACiAgICAgfQogCiAgICAgaWYgKGlzRmFzdFRyYWNrKCkpIHsKLSAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiRiVjICUzZCIsIHRyYWNrVHlwZSwgbUZhc3RJbmRleCk7Ci0gICAgfSBlbHNlIGlmIChtTmFtZSA9PSBUUkFDS19OQU1FX1BFTkRJTkcpIHsKLSAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiJWMgcGVuZCIsIHRyYWNrVHlwZSk7Ci0gICAgfSBlbHNlIGlmIChtTmFtZSA9PSBUUkFDS19OQU1FX0ZBSUxVUkUpIHsKLSAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiJWMgZmFpbCIsIHRyYWNrVHlwZSk7CisgICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIkYlZCAlYyAlNmQiLCBtRmFzdEluZGV4LCB0cmFja1R5cGUsIG1JZCk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiJWMgJTRkIiwgdHJhY2tUeXBlLCBtTmFtZSk7CisgICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAgICVjICU2ZCIsIHRyYWNrVHlwZSwgbUlkKTsKICAgICB9CiAKICAgICBjaGFyIG5vd0luVW5kZXJydW47CkBAIC01OTQsMjEgKzU4NSwyNSBAQAogICAgICAgICAgICAgICAgICAgICA/ICdlJyAvKiBlcnJvciAqLyA6ICcgJyAvKiBpZGVudGljYWwgKi87CiAKICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIlN3MgJTZ1ICU3dSAlMnMgMHglMDNYICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICIlMDhYICUwOFggJTZ1ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICIlMnUgJTUuMmcgJTUuMmcgJTUuMmclYyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiJTA4WCAlNnp1JWMgJTZ6dSAlYyAlOXUlYyAlN3UgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIiUwOHpYICUwOHpYXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIiUwOFggJTA4WCAlNnUgIgorICAgICAgICAgICAgICAgICAgICAgICAgIiUydSAlM3ggJTJ4ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICIlNS4yZyAlNS4yZyAlNS4yZyAlNS4yZyVjICIKKyAgICAgICAgICAgICAgICAgICAgICAgICIlMDhYICU2enUlYyAlNnp1ICVjICU5dSVjICU3dSIsCiAgICAgICAgICAgICBhY3RpdmUgPyAieWVzIiA6ICJubyIsCi0gICAgICAgICAgICAobUNsaWVudCA9PSAwKSA/IGdldHBpZF9jYWNoZWQgOiBtQ2xpZW50LT5waWQoKSwKKyAgICAgICAgICAgIChtQ2xpZW50ID09IDApID8gZ2V0cGlkKCkgOiBtQ2xpZW50LT5waWQoKSwKICAgICAgICAgICAgIG1TZXNzaW9uSWQsCiAgICAgICAgICAgICBnZXRUcmFja1N0YXRlU3RyaW5nKCksCiAgICAgICAgICAgICBtQ2Jsay0+bUZsYWdzLAogCiAgICAgICAgICAgICBtRm9ybWF0LAogICAgICAgICAgICAgbUNoYW5uZWxNYXNrLAotICAgICAgICAgICAgbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+Z2V0U2FtcGxlUmF0ZSgpLAorICAgICAgICAgICAgc2FtcGxlUmF0ZSgpLAogCiAgICAgICAgICAgICBtU3RyZWFtVHlwZSwKKyAgICAgICAgICAgIG1BdHRyLnVzYWdlLAorICAgICAgICAgICAgbUF0dHIuY29udGVudF90eXBlLAorCisgICAgICAgICAgICAyMC4wICogbG9nMTAobUZpbmFsVm9sdW1lKSwKICAgICAgICAgICAgIDIwLjAgKiBsb2cxMChmbG9hdF9mcm9tX2dhaW4oZ2Fpbl9taW5pZmxvYXRfdW5wYWNrX2xlZnQodmxyKSkpLAogICAgICAgICAgICAgMjAuMCAqIGxvZzEwKGZsb2F0X2Zyb21fZ2FpbihnYWluX21pbmlmbG9hdF91bnBhY2tfcmlnaHQodmxyKSkpLAogICAgICAgICAgICAgMjAuMCAqIGxvZzEwKHZzVm9sdW1lLmZpcnN0KSwgLy8gVm9sdW1lU2hhcGVyKHMpIHRvdGFsIHZvbHVtZQpAQCAtNjIxLDExICs2MTYsMjEgQEAKICAgICAgICAgICAgIGZpbGxpbmdTdGF0dXMsCiAgICAgICAgICAgICBtQXVkaW9UcmFja1NlcnZlclByb3h5LT5nZXRVbmRlcnJ1bkZyYW1lcygpLAogICAgICAgICAgICAgbm93SW5VbmRlcnJ1biwKLSAgICAgICAgICAgICh1bnNpZ25lZCltQXVkaW9UcmFja1NlcnZlclByb3h5LT5mcmFtZXNGbHVzaGVkKCkgJSAxMDAwMDAwMCwKLQotICAgICAgICAgICAgKHNpemVfdCltTWFpbkJ1ZmZlciwgLy8gdXNlICV6WCBhcyAlcCBhcHBlbmRzIDB4Ci0gICAgICAgICAgICAoc2l6ZV90KW1BdXhCdWZmZXIgICAvLyB1c2UgJXpYIGFzICVwIGFwcGVuZHMgMHgKKyAgICAgICAgICAgICh1bnNpZ25lZCltQXVkaW9UcmFja1NlcnZlclByb3h5LT5mcmFtZXNGbHVzaGVkKCkgJSAxMDAwMDAwMAogICAgICAgICAgICAgKTsKKworICAgIGlmIChpc1NlcnZlckxhdGVuY3lTdXBwb3J0ZWQoKSkgeworICAgICAgICBkb3VibGUgbGF0ZW5jeU1zOworICAgICAgICBib29sIGZyb21UcmFjazsKKyAgICAgICAgaWYgKGdldFRyYWNrTGF0ZW5jeU1zKCZsYXRlbmN5TXMsICZmcm9tVHJhY2spID09IE9LKSB7CisgICAgICAgICAgICAvLyBTaG93IGxhdGVuY3kgaW4gbXNlYywgZm9sbG93ZWQgYnkgJ3QnIGlmIGZyb20gdHJhY2sgdGltZXN0YW1wICh0aGUgbW9zdCBhY2N1cmF0ZSkKKyAgICAgICAgICAgIC8vIG9yICdrJyBpZiBlc3RpbWF0ZWQgZnJvbSBrZXJuZWwgYmVjYXVzZSB0cmFjayBmcmFtZXMgaGF2ZW4ndCBiZWVuIHByZXNlbnRlZCB5ZXQuCisgICAgICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgJTcuMmxmICVjIiwgbGF0ZW5jeU1zLCBmcm9tVHJhY2sgPyAndCcgOiAnaycpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiJTEwcyIsIG1DYmxrLT5tU2VydmVyICE9IDAgPyAidW5hdmFpbCIgOiAibmV3Iik7CisgICAgICAgIH0KKyAgICB9CisgICAgcmVzdWx0LmFwcGVuZCgiXG4iKTsKIH0KIAogdWludDMyX3QgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OnNhbXBsZVJhdGUoKSBjb25zdCB7CkBAIC02NDMsOCArNjQ4LDggQEAKICAgICBidWZmZXItPmZyYW1lQ291bnQgPSBidWYubUZyYW1lQ291bnQ7CiAgICAgYnVmZmVyLT5yYXcgPSBidWYubVJhdzsKICAgICBpZiAoYnVmLm1GcmFtZUNvdW50ID09IDAgJiYgIWlzU3RvcHBpbmcoKSAmJiAhaXNTdG9wcGVkKCkgJiYgIWlzUGF1c2VkKCkpIHsKLSAgICAgICAgQUxPR1YoInVuZGVycnVuLCAgZnJhbWVzUmVhZHkoJXp1KSA8IGZyYW1lc0Rlc2lyZWQoJXpkKSwgc3RhdGU6ICVkIiwKLSAgICAgICAgICAgICAgICBidWYubUZyYW1lQ291bnQsIGRlc2lyZWRGcmFtZXMsIG1TdGF0ZSk7CisgICAgICAgIEFMT0dWKCIlcyglZCk6IHVuZGVycnVuLCAgZnJhbWVzUmVhZHkoJXp1KSA8IGZyYW1lc0Rlc2lyZWQoJXpkKSwgc3RhdGU6ICVkIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbUlkLCBidWYubUZyYW1lQ291bnQsIGRlc2lyZWRGcmFtZXMsIG1TdGF0ZSk7CiAgICAgICAgIG1BdWRpb1RyYWNrU2VydmVyUHJveHktPnRhbGx5VW5kZXJydW5GcmFtZXMoZGVzaXJlZEZyYW1lcyk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+dGFsbHlVbmRlcnJ1bkZyYW1lcygwKTsKQEAgLTY4Miw2ICs2ODcsMTMgQEAKICAgICBtQXVkaW9UcmFja1NlcnZlclByb3h5LT5zZXRUaW1lc3RhbXAodGltZXN0YW1wKTsKIAogICAgIC8vIFdlIGRvIG5vdCBzZXQgZHJhaW5lZCBoZXJlLCBhcyBGYXN0VHJhY2sgdGltZXN0YW1wIG1heSBub3QgZ28gdG8gdmVyeSBsYXN0IGZyYW1lLgorCisgICAgLy8gQ29tcHV0ZSBsYXRlbmN5LgorICAgIC8vIFRPRE86IENvbnNpZGVyIHdoZXRoZXIgdGhlIHNlcnZlciBsYXRlbmN5IG1heSBiZSBwYXNzZWQgaW4gYnkgRmFzdE1peGVyCisgICAgLy8gYXMgYSBjb25zdGFudCBmb3IgYWxsIGFjdGl2ZSBGYXN0VHJhY2tzLgorICAgIGNvbnN0IGRvdWJsZSBsYXRlbmN5TXMgPSB0aW1lc3RhbXAuZ2V0T3V0cHV0U2VydmVyTGF0ZW5jeU1zKHNhbXBsZVJhdGUoKSk7CisgICAgbVNlcnZlckxhdGVuY3lGcm9tVHJhY2suc3RvcmUodHJ1ZSk7CisgICAgbVNlcnZlckxhdGVuY3lNcy5zdG9yZShsYXRlbmN5TXMpOwogfQogCiAvLyBEb24ndCBjYWxsIGZvciBmYXN0IHRyYWNrczsgdGhlIGZyYW1lc1JlYWR5KCkgY291bGQgcmVzdWx0IGluIHByaW9yaXR5IGludmVyc2lvbgpAQCAtNzEwLDggKzcyMiw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHRyaWdnZXJTZXNzaW9uIF9fdW51c2VkKQogewogICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOwotICAgIEFMT0dWKCJzdGFydCglZCksIGNhbGxpbmcgcGlkICVkIHNlc3Npb24gJWQiLAotICAgICAgICAgICAgbU5hbWUsIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSwgbVNlc3Npb25JZCk7CisgICAgQUxPR1YoIiVzKCVkKTogY2FsbGluZyBwaWQgJWQgc2Vzc2lvbiAlZCIsCisgICAgICAgICAgICBfX2Z1bmNfXywgbUlkLCBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCksIG1TZXNzaW9uSWQpOwogCiAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gbVRocmVhZC5wcm9tb3RlKCk7CiAgICAgaWYgKHRocmVhZCAhPSAwKSB7CkBAIC03MzcsMTQgKzc0OSwxNyBAQAogICAgICAgICAgICAgaWYgKG1SZXN1bWVUb1N0b3BwaW5nKSB7CiAgICAgICAgICAgICAgICAgLy8gaGFwcGVuZWQgd2UgbmVlZCB0byByZXN1bWUgdG8gU1RPUFBJTkdfMQogICAgICAgICAgICAgICAgIG1TdGF0ZSA9IFRyYWNrQmFzZTo6U1RPUFBJTkdfMTsKLSAgICAgICAgICAgICAgICBBTE9HVigiUEFVU0VEID0+IFNUT1BQSU5HXzEgKCVkKSBvbiB0aHJlYWQgJXAiLCBtTmFtZSwgdGhpcyk7CisgICAgICAgICAgICAgICAgQUxPR1YoIiVzKCVkKTogUEFVU0VEID0+IFNUT1BQSU5HXzEgb24gdGhyZWFkICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtSWQsIChpbnQpbVRocmVhZElvSGFuZGxlKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgbVN0YXRlID0gVHJhY2tCYXNlOjpSRVNVTUlORzsKLSAgICAgICAgICAgICAgICBBTE9HVigiUEFVU0VEID0+IFJFU1VNSU5HICglZCkgb24gdGhyZWFkICVwIiwgbU5hbWUsIHRoaXMpOworICAgICAgICAgICAgICAgIEFMT0dWKCIlcyglZCk6IFBBVVNFRCA9PiBSRVNVTUlORyBvbiB0aHJlYWQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sICBtSWQsIChpbnQpbVRocmVhZElvSGFuZGxlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIG1TdGF0ZSA9IFRyYWNrQmFzZTo6QUNUSVZFOwotICAgICAgICAgICAgQUxPR1YoIj8gPT4gQUNUSVZFICglZCkgb24gdGhyZWFkICVwIiwgbU5hbWUsIHRoaXMpOworICAgICAgICAgICAgQUxPR1YoIiVzKCVkKTogPyA9PiBBQ1RJVkUgb24gdGhyZWFkICVkIiwKKyAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1JZCwgKGludCltVGhyZWFkSW9IYW5kbGUpOwogICAgICAgICB9CiAKICAgICAgICAgLy8gc3RhdGVzIHRvIHJlc2V0IHBvc2l0aW9uIGluZm8gZm9yIG5vbi1vZmZsb2FkZWQvZGlyZWN0IHRyYWNrcwpAQCAtNzk1LDcgKzgxMCw3IEBACiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OnN0b3AoKQogewotICAgIEFMT0dWKCJzdG9wKCVkKSwgY2FsbGluZyBwaWQgJWQiLCBtTmFtZSwgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpKTsKKyAgICBBTE9HVigiJXMoJWQpOiBjYWxsaW5nIHBpZCAlZCIsIF9fZnVuY19fLCBtSWQsIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSk7CiAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gbVRocmVhZC5wcm9tb3RlKCk7CiAgICAgaWYgKHRocmVhZCAhPSAwKSB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbCh0aHJlYWQtPm1Mb2NrKTsKQEAgLTgxOSwxNSArODM0LDE1IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgcGxheWJhY2tUaHJlYWQtPmJyb2FkY2FzdF9sKCk7Ci0gICAgICAgICAgICBBTE9HVigibm90IHN0b3BwaW5nL3N0b3BwZWQgPT4gc3RvcHBpbmcvc3RvcHBlZCAoJWQpIG9uIHRocmVhZCAlcCIsIG1OYW1lLAotICAgICAgICAgICAgICAgICAgICBwbGF5YmFja1RocmVhZCk7CisgICAgICAgICAgICBBTE9HVigiJXMoJWQpOiBub3Qgc3RvcHBpbmcvc3RvcHBlZCA9PiBzdG9wcGluZy9zdG9wcGVkIG9uIHRocmVhZCAlZCIsCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtSWQsIChpbnQpbVRocmVhZElvSGFuZGxlKTsKICAgICAgICAgfQogICAgIH0KIH0KIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6cGF1c2UoKQogewotICAgIEFMT0dWKCJwYXVzZSglZCksIGNhbGxpbmcgcGlkICVkIiwgbU5hbWUsIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSk7CisgICAgQUxPR1YoIiVzKCVkKTogY2FsbGluZyBwaWQgJWQiLCBfX2Z1bmNfXywgbUlkLCBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCkpOwogICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IG1UaHJlYWQucHJvbW90ZSgpOwogICAgIGlmICh0aHJlYWQgIT0gMCkgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wodGhyZWFkLT5tTG9jayk7CkBAIC04NDYsNyArODYxLDggQEAKICAgICAgICAgY2FzZSBBQ1RJVkU6CiAgICAgICAgIGNhc2UgUkVTVU1JTkc6CiAgICAgICAgICAgICBtU3RhdGUgPSBQQVVTSU5HOwotICAgICAgICAgICAgQUxPR1YoIkFDVElWRS9SRVNVTUlORyA9PiBQQVVTSU5HICglZCkgb24gdGhyZWFkICVwIiwgbU5hbWUsIHRocmVhZC5nZXQoKSk7CisgICAgICAgICAgICBBTE9HVigiJXMoJWQpOiBBQ1RJVkUvUkVTVU1JTkcgPT4gUEFVU0lORyBvbiB0aHJlYWQgJWQiLAorICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbUlkLCAoaW50KW1UaHJlYWRJb0hhbmRsZSk7CiAgICAgICAgICAgICBwbGF5YmFja1RocmVhZC0+YnJvYWRjYXN0X2woKTsKICAgICAgICAgICAgIGJyZWFrOwogCkBAIC04NTgsNyArODc0LDcgQEAKIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6Zmx1c2goKQogewotICAgIEFMT0dWKCJmbHVzaCglZCkiLCBtTmFtZSk7CisgICAgQUxPR1YoIiVzKCVkKSIsIF9fZnVuY19fLCBtSWQpOwogICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IG1UaHJlYWQucHJvbW90ZSgpOwogICAgIGlmICh0aHJlYWQgIT0gMCkgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wodGhyZWFkLT5tTG9jayk7CkBAIC04ODAsMTEgKzg5NiwxMiBAQAogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgQUxPR1YoImZsdXNoOiBvZmZsb2FkIGZsdXNoIik7CisgICAgICAgICAgICBBTE9HVigiJXMoJWQpOiBvZmZsb2FkIGZsdXNoIiwgX19mdW5jX18sIG1JZCk7CiAgICAgICAgICAgICByZXNldCgpOwogCiAgICAgICAgICAgICBpZiAobVN0YXRlID09IFNUT1BQSU5HXzEgfHwgbVN0YXRlID09IFNUT1BQSU5HXzIpIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiZmx1c2hlZCBpbiBTVE9QUElOR18xIG9yIDIgc3RhdGUsIGNoYW5nZSBzdGF0ZSB0byBBQ1RJVkUiKTsKKyAgICAgICAgICAgICAgICBBTE9HVigiJXMoJWQpOiBmbHVzaGVkIGluIFNUT1BQSU5HXzEgb3IgMiBzdGF0ZSwgY2hhbmdlIHN0YXRlIHRvIEFDVElWRSIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbUlkKTsKICAgICAgICAgICAgICAgICBtU3RhdGUgPSBBQ1RJVkU7CiAgICAgICAgICAgICB9CiAKQEAgLTk0OSw3ICs5NjYsNyBAQAogewogICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IG1UaHJlYWQucHJvbW90ZSgpOwogICAgIGlmICh0aHJlYWQgPT0gMCkgewotICAgICAgICBBTE9HRSgidGhyZWFkIGlzIGRlYWQiKTsKKyAgICAgICAgQUxPR0UoIiVzKCVkKTogdGhyZWFkIGlzIGRlYWQiLCBfX2Z1bmNfXywgbUlkKTsKICAgICAgICAgcmV0dXJuIEZBSUxFRF9UUkFOU0FDVElPTjsKICAgICB9IGVsc2UgaWYgKCh0aHJlYWQtPnR5cGUoKSA9PSBUaHJlYWRCYXNlOjpESVJFQ1QpIHx8CiAgICAgICAgICAgICAgICAgICAgICh0aHJlYWQtPnR5cGUoKSA9PSBUaHJlYWRCYXNlOjpPRkZMT0FEKSkgewpAQCAtOTY5LDggKzk4NiwxMCBAQAogICAgICAgICBjb25zdCBWb2x1bWVTaGFwZXI6OkNvbmZpZ3VyYXRpb246Ok9wdGlvbkZsYWcgb3B0aW9uRmxhZwogICAgICAgICAgICAgPSBjb25maWd1cmF0aW9uLT5nZXRPcHRpb25GbGFncygpOwogICAgICAgICBpZiAoKG9wdGlvbkZsYWcgJiBWb2x1bWVTaGFwZXI6OkNvbmZpZ3VyYXRpb246Ok9QVElPTl9GTEFHX0NMT0NLX1RJTUUpID09IDApIHsKLSAgICAgICAgICAgIEFMT0dXKCIlcyB0cmFja3MgZG8gbm90IHN1cHBvcnQgZnJhbWUgY291bnRlZCBWb2x1bWVTaGFwZXIsIgotICAgICAgICAgICAgICAgICAgICAiIHVzaW5nIGNsb2NrIHRpbWUgaW5zdGVhZCIsIGlzT2ZmbG9hZGVkKCkgPyAiT2ZmbG9hZCIgOiAiRGlyZWN0Iik7CisgICAgICAgICAgICBBTE9HVygiJXMoJWQpOiAlcyB0cmFja3MgZG8gbm90IHN1cHBvcnQgZnJhbWUgY291bnRlZCBWb2x1bWVTaGFwZXIsIgorICAgICAgICAgICAgICAgICAgICAiIHVzaW5nIGNsb2NrIHRpbWUgaW5zdGVhZCIsCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtSWQsCisgICAgICAgICAgICAgICAgICAgIGlzT2ZmbG9hZGVkKCkgPyAiT2ZmbG9hZCIgOiAiRGlyZWN0Iik7CiAgICAgICAgICAgICBuZXdDb25maWd1cmF0aW9uID0gbmV3IFZvbHVtZVNoYXBlcjo6Q29uZmlndXJhdGlvbigqY29uZmlndXJhdGlvbik7CiAgICAgICAgICAgICBuZXdDb25maWd1cmF0aW9uLT5zZXRPcHRpb25GbGFncygKICAgICAgICAgICAgICAgICBWb2x1bWVTaGFwZXI6OkNvbmZpZ3VyYXRpb246Ok9wdGlvbkZsYWcob3B0aW9uRmxhZwpAQCAtOTg1LDcgKzEwMDQsNyBAQAogICAgICAgICAvLyBTaWduYWwgdGhyZWFkIHRvIGZldGNoIG5ldyB2b2x1bWUuCiAgICAgICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IG1UaHJlYWQucHJvbW90ZSgpOwogICAgICAgICBpZiAodGhyZWFkICE9IDApIHsKLSAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wodGhyZWFkLT5tTG9jayk7CisgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wodGhyZWFkLT5tTG9jayk7CiAgICAgICAgICAgICB0aHJlYWQtPmJyb2FkY2FzdF9sKCk7CiAgICAgICAgIH0KICAgICB9CkBAIC0xMTA1LDExICsxMTI0LDE0IEBACiAgICAgLy8gdG8gZGV0ZWN0IHdoZW4gYWxsIGZyYW1lcyBoYXZlIGJlZW4gcGxheWVkLiBJbiB0aGlzIGNhc2UgZnJhbWVzV3JpdHRlbiBpc24ndAogICAgIC8vIHVzZWZ1bCBiZWNhdXNlIGl0IGRvZXNuJ3QgYWx3YXlzIHJlZmxlY3Qgd2hldGhlciB0aGVyZSBpcyBkYXRhIGluIHRoZSBoL3cKICAgICAvLyBidWZmZXJzLCBwYXJ0aWN1bGFybHkgaWYgYSB0cmFjayBoYXMgYmVlbiBwYXVzZWQgYW5kIHJlc3VtZWQgZHVyaW5nIGRyYWluaW5nCi0gICAgQUxPR1YoInByZXNlbnRhdGlvbkNvbXBsZXRlKCkgbVByZXNlbnRhdGlvbkNvbXBsZXRlRnJhbWVzICVsbGQgZnJhbWVzV3JpdHRlbiAlbGxkIiwKKyAgICBBTE9HVigiJXMoJWQpOiBwcmVzZW50YXRpb25Db21wbGV0ZSgpIG1QcmVzZW50YXRpb25Db21wbGV0ZUZyYW1lcyAlbGxkIGZyYW1lc1dyaXR0ZW4gJWxsZCIsCisgICAgICAgICAgICBfX2Z1bmNfXywgbUlkLAogICAgICAgICAgICAgKGxvbmcgbG9uZyltUHJlc2VudGF0aW9uQ29tcGxldGVGcmFtZXMsIChsb25nIGxvbmcpZnJhbWVzV3JpdHRlbik7CiAgICAgaWYgKG1QcmVzZW50YXRpb25Db21wbGV0ZUZyYW1lcyA9PSAwKSB7CiAgICAgICAgIG1QcmVzZW50YXRpb25Db21wbGV0ZUZyYW1lcyA9IGZyYW1lc1dyaXR0ZW4gKyBhdWRpb0hhbEZyYW1lczsKLSAgICAgICAgQUxPR1YoInByZXNlbnRhdGlvbkNvbXBsZXRlKCkgcmVzZXQ6IG1QcmVzZW50YXRpb25Db21wbGV0ZUZyYW1lcyAlbGxkIGF1ZGlvSGFsRnJhbWVzICV6dSIsCisgICAgICAgIEFMT0dWKCIlcyglZCk6IHByZXNlbnRhdGlvbkNvbXBsZXRlKCkgcmVzZXQ6IgorICAgICAgICAgICAgICAgICIgbVByZXNlbnRhdGlvbkNvbXBsZXRlRnJhbWVzICVsbGQgYXVkaW9IYWxGcmFtZXMgJXp1IiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbUlkLAogICAgICAgICAgICAgICAgIChsb25nIGxvbmcpbVByZXNlbnRhdGlvbkNvbXBsZXRlRnJhbWVzLCBhdWRpb0hhbEZyYW1lcyk7CiAgICAgfQogCkBAIC0xMTc1LDcgKzExOTcsOCBAQAogICAgIGlmIChpc1Rlcm1pbmF0ZWQoKSB8fCBtU3RhdGUgPT0gUEFVU0VEIHx8CiAgICAgICAgICAgICAoKGZyYW1lc1JlYWR5KCkgPT0gMCkgJiYgKChtU2hhcmVkQnVmZmVyICE9IDApIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtU3RhdGUgPT0gU1RPUFBFRCkpKSkgewotICAgICAgICBBTE9HVygiVHJhY2s6OnNldFN5bmNFdmVudCgpIGluIGludmFsaWQgc3RhdGUgJWQgb24gc2Vzc2lvbiAlZCAlcyBtb2RlLCBmcmFtZXNSZWFkeSAlenUiLAorICAgICAgICBBTE9HVygiJXMoJWQpOiBpbiBpbnZhbGlkIHN0YXRlICVkIG9uIHNlc3Npb24gJWQgJXMgbW9kZSwgZnJhbWVzUmVhZHkgJXp1IiwKKyAgICAgICAgICAgICAgX19mdW5jX18sIG1JZCwKICAgICAgICAgICAgICAgbVN0YXRlLCBtU2Vzc2lvbklkLCAobVNoYXJlZEJ1ZmZlciAhPSAwKSA/ICJzdGF0aWMiIDogInN0cmVhbSIsIGZyYW1lc1JlYWR5KCkpOwogICAgICAgICBldmVudC0+Y2FuY2VsKCk7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKQEAgLTEyNDYsNyArMTI2OSwxNyBAQAogLy9UbyBiZSBjYWxsZWQgd2l0aCB0aHJlYWQgbG9jayBoZWxkCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrOjp1cGRhdGVUcmFja0ZyYW1lSW5mbygKICAgICAgICAgaW50NjRfdCB0cmFja0ZyYW1lc1JlbGVhc2VkLCBpbnQ2NF90IHNpbmtGcmFtZXNXcml0dGVuLAotICAgICAgICBjb25zdCBFeHRlbmRlZFRpbWVzdGFtcCAmdGltZVN0YW1wKSB7CisgICAgICAgIHVpbnQzMl90IGhhbFNhbXBsZVJhdGUsIGNvbnN0IEV4dGVuZGVkVGltZXN0YW1wICZ0aW1lU3RhbXApIHsKKyAgIC8vIE1ha2UgdGhlIGtlcm5lbCBmcmFtZXRpbWUgYXZhaWxhYmxlLgorICAgIGNvbnN0IEZyYW1lVGltZSBmdHsKKyAgICAgICAgICAgIHRpbWVTdGFtcC5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0sCisgICAgICAgICAgICB0aW1lU3RhbXAubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXX07CisgICAgLy8gQUxPR0QoIkZyYW1lVGltZTogJWxsZCAlbGxkIiwgKGxvbmcgbG9uZylmdC5mcmFtZXMsIChsb25nIGxvbmcpZnQudGltZU5zKTsKKyAgICBtS2VybmVsRnJhbWVUaW1lLnN0b3JlKGZ0KTsKKyAgICBpZiAoIWF1ZGlvX2lzX2xpbmVhcl9wY20obUZvcm1hdCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKwogICAgIC8vdXBkYXRlIGZyYW1lIG1hcAogICAgIG1GcmFtZU1hcC5wdXNoKHRyYWNrRnJhbWVzUmVsZWFzZWQsIHNpbmtGcmFtZXNXcml0dGVuKTsKIApAQCAtMTI1NSw2ICsxMjg4LDcgQEAKICAgICAvLyBPdXIgdGltZXN0YW1wcyBhcmUgb25seSB1cGRhdGVkIHdoZW4gdGhlIHRyYWNrIGlzIG9uIHRoZSBUaHJlYWQgYWN0aXZlIGxpc3QuCiAgICAgLy8gV2UgbmVlZCB0byBlbnN1cmUgdGhhdCB0cmFja3MgYXJlIG5vdCByZW1vdmVkIGJlZm9yZSBmdWxsIGRyYWluLgogICAgIEV4dGVuZGVkVGltZXN0YW1wIGxvY2FsID0gdGltZVN0YW1wOworICAgIGJvb2wgZHJhaW5lZCA9IHRydWU7IC8vIGRlZmF1bHQgYXNzdW1lIGRyYWluZWQsIGlmIG5vIHNlcnZlciBpbmZvIGZvdW5kCiAgICAgYm9vbCBjaGVja2VkID0gZmFsc2U7CiAgICAgZm9yIChpbnQgaSA9IEV4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9NQVggLSAxOwogICAgICAgICAgICAgaSA+PSBFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fU0VSVkVSOyAtLWkpIHsKQEAgLTEyNjMsMjEgKzEyOTcsMzAgQEAKICAgICAgICAgICAgIGxvY2FsLm1Qb3NpdGlvbltpXSA9IG1GcmFtZU1hcC5maW5kWChsb2NhbC5tUG9zaXRpb25baV0pOwogICAgICAgICAgICAgLy8gY2hlY2sgZHJhaW4gc3RhdGUgZnJvbSB0aGUgbGF0ZXN0IHN0YWdlIGluIHRoZSBwaXBlbGluZS4KICAgICAgICAgICAgIGlmICghY2hlY2tlZCAmJiBpIDw9IEV4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUwpIHsKLSAgICAgICAgICAgICAgICBtQXVkaW9UcmFja1NlcnZlclByb3h5LT5zZXREcmFpbmVkKAotICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWwubVBvc2l0aW9uW2ldID49IG1BdWRpb1RyYWNrU2VydmVyUHJveHktPmZyYW1lc1JlbGVhc2VkKCkpOworICAgICAgICAgICAgICAgIGRyYWluZWQgPSBsb2NhbC5tUG9zaXRpb25baV0gPj0gbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+ZnJhbWVzUmVsZWFzZWQoKTsKICAgICAgICAgICAgICAgICBjaGVja2VkID0gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICBpZiAoIWNoZWNrZWQpIHsgLy8gbm8gc2VydmVyIGluZm8sIGFzc3VtZSBkcmFpbmVkLgotICAgICAgICBtQXVkaW9UcmFja1NlcnZlclByb3h5LT5zZXREcmFpbmVkKHRydWUpOwotICAgIH0KKworICAgIG1BdWRpb1RyYWNrU2VydmVyUHJveHktPnNldERyYWluZWQoZHJhaW5lZCk7CiAgICAgLy8gU2V0IGNvcnJlY3Rpb24gZm9yIGZsdXNoZWQgZnJhbWVzIHRoYXQgYXJlIG5vdCBhY2NvdW50ZWQgZm9yIGluIHJlbGVhc2VkLgogICAgIGxvY2FsLm1GbHVzaGVkID0gbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+ZnJhbWVzRmx1c2hlZCgpOwogICAgIG1TZXJ2ZXJQcm94eS0+c2V0VGltZXN0YW1wKGxvY2FsKTsKKworICAgIC8vIENvbXB1dGUgbGF0ZW5jeSBpbmZvLgorICAgIGNvbnN0IGJvb2wgdXNlVHJhY2tUaW1lc3RhbXAgPSAhZHJhaW5lZDsKKyAgICBjb25zdCBkb3VibGUgbGF0ZW5jeU1zID0gdXNlVHJhY2tUaW1lc3RhbXAKKyAgICAgICAgICAgID8gbG9jYWwuZ2V0T3V0cHV0U2VydmVyTGF0ZW5jeU1zKHNhbXBsZVJhdGUoKSkKKyAgICAgICAgICAgIDogdGltZVN0YW1wLmdldE91dHB1dFNlcnZlckxhdGVuY3lNcyhoYWxTYW1wbGVSYXRlKTsKKworICAgIG1TZXJ2ZXJMYXRlbmN5RnJvbVRyYWNrLnN0b3JlKHVzZVRyYWNrVGltZXN0YW1wKTsKKyAgICBtU2VydmVyTGF0ZW5jeU1zLnN0b3JlKGxhdGVuY3lNcyk7CiB9CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyN1bmRlZiBMT0dfVEFHCisjZGVmaW5lIExPR19UQUcgIkFGOjpPdXRwdXRUcmFjayIKIAogQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6T3V0cHV0VHJhY2s6Ok91dHB1dFRyYWNrKAogICAgICAgICAgICAgUGxheWJhY2tUaHJlYWQgKnBsYXliYWNrVGhyZWFkLApAQCAtMTI5OSw5ICsxMzQyLDkgQEAKICAgICBpZiAobUNibGsgIT0gTlVMTCkgewogICAgICAgICBtT3V0QnVmZmVyLmZyYW1lQ291bnQgPSAwOwogICAgICAgICBwbGF5YmFja1RocmVhZC0+bVRyYWNrcy5hZGQodGhpcyk7Ci0gICAgICAgIEFMT0dWKCJPdXRwdXRUcmFjayBjb25zdHJ1Y3RvciBtQ2JsayAlcCwgbUJ1ZmZlciAlcCwgIgorICAgICAgICBBTE9HVigiJXMoKTogbUNibGsgJXAsIG1CdWZmZXIgJXAsICIKICAgICAgICAgICAgICAgICAiZnJhbWVDb3VudCAlenUsIG1DaGFubmVsTWFzayAweCUwOHgiLAotICAgICAgICAgICAgICAgIG1DYmxrLCBtQnVmZmVyLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtQ2JsaywgbUJ1ZmZlciwKICAgICAgICAgICAgICAgICBmcmFtZUNvdW50LCBtQ2hhbm5lbE1hc2spOwogICAgICAgICAvLyBzaW5jZSBjbGllbnQgYW5kIHNlcnZlciBhcmUgaW4gdGhlIHNhbWUgcHJvY2VzcywKICAgICAgICAgLy8gdGhlIGJ1ZmZlciBoYXMgdGhlIHNhbWUgdmlydHVhbCBhZGRyZXNzIG9uIGJvdGggc2lkZXMKQEAgLTEzMTEsNyArMTM1NCw4IEBACiAgICAgICAgIG1DbGllbnRQcm94eS0+c2V0U2VuZExldmVsKDAuMCk7CiAgICAgICAgIG1DbGllbnRQcm94eS0+c2V0U2FtcGxlUmF0ZShzYW1wbGVSYXRlKTsKICAgICB9IGVsc2UgewotICAgICAgICBBTE9HVygiRXJyb3IgY3JlYXRpbmcgb3V0cHV0IHRyYWNrIG9uIHRocmVhZCAlcCIsIHBsYXliYWNrVGhyZWFkKTsKKyAgICAgICAgQUxPR1coIiVzKCVkKTogRXJyb3IgY3JlYXRpbmcgb3V0cHV0IHRyYWNrIG9uIHRocmVhZCAlZCIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIG1JZCwgKGludCltVGhyZWFkSW9IYW5kbGUpOwogICAgIH0KIH0KIApAQCAtMTM0Miw3ICsxMzg2LDcgQEAKICAgICBtQWN0aXZlID0gZmFsc2U7CiB9CiAKLWJvb2wgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6T3V0cHV0VHJhY2s6OndyaXRlKHZvaWQqIGRhdGEsIHVpbnQzMl90IGZyYW1lcykKK3NzaXplX3QgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6T3V0cHV0VHJhY2s6OndyaXRlKHZvaWQqIGRhdGEsIHVpbnQzMl90IGZyYW1lcykKIHsKICAgICBCdWZmZXIgKnBJbkJ1ZmZlcjsKICAgICBCdWZmZXIgaW5CdWZmZXI7CkBAIC0xMzczLDggKzE0MTcsOSBAQAogICAgICAgICAgICAgbnNlY3NfdCBzdGFydFRpbWUgPSBzeXN0ZW1UaW1lKCk7CiAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBvYnRhaW5CdWZmZXIoJm1PdXRCdWZmZXIsIHdhaXRUaW1lTGVmdE1zKTsKICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IgJiYgc3RhdHVzICE9IE5PVF9FTk9VR0hfREFUQSkgewotICAgICAgICAgICAgICAgIEFMT0dWKCJPdXRwdXRUcmFjazo6d3JpdGUoKSAlcCB0aHJlYWQgJXAgbm8gbW9yZSBvdXRwdXQgYnVmZmVyczsgc3RhdHVzICVkIiwgdGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgIG1UaHJlYWQudW5zYWZlX2dldCgpLCBzdGF0dXMpOworICAgICAgICAgICAgICAgIEFMT0dWKCIlcyglZCk6IHRocmVhZCAlZCBubyBtb3JlIG91dHB1dCBidWZmZXJzOyBzdGF0dXMgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpbVRocmVhZElvSGFuZGxlLCBzdGF0dXMpOwogICAgICAgICAgICAgICAgIG91dHB1dEJ1ZmZlckZ1bGwgPSB0cnVlOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQpAQCAtMTQxMCw4ICsxNDU1LDkgQEAKICAgICAgICAgICAgICAgICBpZiAocEluQnVmZmVyICE9ICZpbkJ1ZmZlcikgewogICAgICAgICAgICAgICAgICAgICBkZWxldGUgcEluQnVmZmVyOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBBTE9HVigiT3V0cHV0VHJhY2s6OndyaXRlKCkgJXAgdGhyZWFkICVwIHJlbGVhc2VkIG92ZXJmbG93IGJ1ZmZlciAlenUiLCB0aGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgbVRocmVhZC51bnNhZmVfZ2V0KCksIG1CdWZmZXJRdWV1ZS5zaXplKCkpOworICAgICAgICAgICAgICAgIEFMT0dWKCIlcyglZCk6IHRocmVhZCAlZCByZWxlYXNlZCBvdmVyZmxvdyBidWZmZXIgJXp1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAoaW50KW1UaHJlYWRJb0hhbmRsZSwgbUJ1ZmZlclF1ZXVlLnNpemUoKSk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQpAQCAtMTQyOSwxMSArMTQ3NSwxNCBAQAogICAgICAgICAgICAgICAgIHBJbkJ1ZmZlci0+cmF3ID0gcEluQnVmZmVyLT5tQnVmZmVyOwogICAgICAgICAgICAgICAgIG1lbWNweShwSW5CdWZmZXItPnJhdywgaW5CdWZmZXIucmF3LCBpbkJ1ZmZlci5mcmFtZUNvdW50ICogbUZyYW1lU2l6ZSk7CiAgICAgICAgICAgICAgICAgbUJ1ZmZlclF1ZXVlLmFkZChwSW5CdWZmZXIpOwotICAgICAgICAgICAgICAgIEFMT0dWKCJPdXRwdXRUcmFjazo6d3JpdGUoKSAlcCB0aHJlYWQgJXAgYWRkaW5nIG92ZXJmbG93IGJ1ZmZlciAlenUiLCB0aGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgbVRocmVhZC51bnNhZmVfZ2V0KCksIG1CdWZmZXJRdWV1ZS5zaXplKCkpOworICAgICAgICAgICAgICAgIEFMT0dWKCIlcyglZCk6IHRocmVhZCAlZCBhZGRpbmcgb3ZlcmZsb3cgYnVmZmVyICV6dSIsIF9fZnVuY19fLCBtSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAoaW50KW1UaHJlYWRJb0hhbmRsZSwgbUJ1ZmZlclF1ZXVlLnNpemUoKSk7CisgICAgICAgICAgICAgICAgLy8gYXVkaW8gZGF0YSBpcyBjb25zdW1lZCAoc3RvcmVkIGxvY2FsbHkpOyBzZXQgZnJhbWVDb3VudCB0byAwLgorICAgICAgICAgICAgICAgIGluQnVmZmVyLmZyYW1lQ291bnQgPSAwOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiT3V0cHV0VHJhY2s6OndyaXRlKCkgJXAgdGhyZWFkICVwIG5vIG1vcmUgb3ZlcmZsb3cgYnVmZmVycyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBtVGhyZWFkLnVuc2FmZV9nZXQoKSwgdGhpcyk7CisgICAgICAgICAgICAgICAgQUxPR1coIiVzKCVkKTogdGhyZWFkICVkIG5vIG1vcmUgb3ZlcmZsb3cgYnVmZmVycyIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbUlkLCAoaW50KW1UaHJlYWRJb0hhbmRsZSk7CisgICAgICAgICAgICAgICAgLy8gVE9ETzogcmV0dXJuIGVycm9yIGZvciB0aGlzLgogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtMTQ0NCw3ICsxNDkzLDcgQEAKICAgICAgICAgc3RvcCgpOwogICAgIH0KIAotICAgIHJldHVybiBvdXRwdXRCdWZmZXJGdWxsOworICAgIHJldHVybiBmcmFtZXMgLSBpbkJ1ZmZlci5mcmFtZUNvdW50OyAgLy8gbnVtYmVyIG9mIGZyYW1lcyBjb25zdW1lZC4KIH0KIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpPdXRwdXRUcmFjazo6Y29weU1ldGFkYXRhVG8oTWV0YWRhdGFJbnNlcnRlciYgYmFja0luc2VydGVyKSBjb25zdApAQCAtMTQ5Niw2ICsxNTQ1LDEwIEBACiAgICAgfQogfQogCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjdW5kZWYgTE9HX1RBRworI2RlZmluZSBMT0dfVEFHICJBRjo6UGF0Y2hUcmFjayIKKwogQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6UGF0Y2hUcmFjazo6UGF0Y2hUcmFjayhQbGF5YmFja1RocmVhZCAqcGxheWJhY2tUaHJlYWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKQEAgLTE1MDksNyArMTU2Miw3IEBACiAgICAgICAgICAgICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdHt9IC8qIGN1cnJlbnRseSB1bnVzZWQgZm9yIHBhdGNoIHRyYWNrICovLAogICAgICAgICAgICAgICBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LAogICAgICAgICAgICAgICBidWZmZXIsIGJ1ZmZlclNpemUsIG51bGxwdHIgLyogc2hhcmVkQnVmZmVyICovLAotICAgICAgICAgICAgICBBVURJT19TRVNTSU9OX05PTkUsIGdldHVpZCgpLCBmbGFncywgVFlQRV9QQVRDSCksCisgICAgICAgICAgICAgIEFVRElPX1NFU1NJT05fTk9ORSwgQUlEX0FVRElPU0VSVkVSLCBmbGFncywgVFlQRV9QQVRDSCksCiAgICAgICAgICAgICAgIG1Qcm94eShuZXcgQ2xpZW50UHJveHkobUNibGssIG1CdWZmZXIsIGZyYW1lQ291bnQsIG1GcmFtZVNpemUsIHRydWUsIHRydWUpKQogewogICAgIHVpbnQ2NF90IG1peEJ1ZmZlck5zID0gKCh1aW50NjRfdCkyICogcGxheWJhY2tUaHJlYWQtPmZyYW1lQ291bnQoKSAqIDEwMDAwMDAwMDApIC8KQEAgLTE1MTcsOCArMTU3MCw4IEBACiAgICAgbVBlZXJUaW1lb3V0LnR2X3NlYyA9IG1peEJ1ZmZlck5zIC8gMTAwMDAwMDAwMDsKICAgICBtUGVlclRpbWVvdXQudHZfbnNlYyA9IChpbnQpIChtaXhCdWZmZXJOcyAlIDEwMDAwMDAwMDApOwogCi0gICAgQUxPR1YoIlBhdGNoVHJhY2sgJXAgc2FtcGxlUmF0ZSAlZCBtUGVlclRpbWVvdXQgJWQuJTAzZCBzZWMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLCBzYW1wbGVSYXRlLAorICAgIEFMT0dWKCIlcyglZCk6IHNhbXBsZVJhdGUgJWQgbVBlZXJUaW1lb3V0ICVkLiUwM2Qgc2VjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1JZCwgc2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCltUGVlclRpbWVvdXQudHZfc2VjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KShtUGVlclRpbWVvdXQudHZfbnNlYyAvIDEwMDAwMDApKTsKIH0KQEAgLTE1MjgsNyArMTU4MSw3IEBACiB9CiAKIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlBhdGNoVHJhY2s6OnN0YXJ0KEF1ZGlvU3lzdGVtOjpzeW5jX2V2ZW50X3QgZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHRyaWdnZXJTZXNzaW9uKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHRyaWdnZXJTZXNzaW9uKQogewogICAgIHN0YXR1c190IHN0YXR1cyA9IFRyYWNrOjpzdGFydChldmVudCwgdHJpZ2dlclNlc3Npb24pOwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKQEAgLTE1NDIsMTEgKzE1OTUsMTEgQEAKIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlBhdGNoVHJhY2s6OmdldE5leHRCdWZmZXIoCiAgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciogYnVmZmVyKQogewotICAgIEFMT0dfQVNTRVJUKG1QZWVyUHJveHkgIT0gMCwgIlBhdGNoVHJhY2s6OmdldE5leHRCdWZmZXIoKSBjYWxsZWQgd2l0aG91dCBwZWVyIHByb3h5Iik7CisgICAgQUxPR19BU1NFUlQobVBlZXJQcm94eSAhPSAwLCAiJXMoJWQpOiBjYWxsZWQgd2l0aG91dCBwZWVyIHByb3h5IiwgX19mdW5jX18sIG1JZCk7CiAgICAgUHJveHk6OkJ1ZmZlciBidWY7CiAgICAgYnVmLm1GcmFtZUNvdW50ID0gYnVmZmVyLT5mcmFtZUNvdW50OwogICAgIHN0YXR1c190IHN0YXR1cyA9IG1QZWVyUHJveHktPm9idGFpbkJ1ZmZlcigmYnVmLCAmbVBlZXJUaW1lb3V0KTsKLSAgICBBTE9HVl9JRihzdGF0dXMgIT0gTk9fRVJST1IsICJQYXRjaFRyYWNrKCkgJXAgZ2V0TmV4dEJ1ZmZlciBzdGF0dXMgJWQiLCB0aGlzLCBzdGF0dXMpOworICAgIEFMT0dWX0lGKHN0YXR1cyAhPSBOT19FUlJPUiwgIiVzKCVkKTogZ2V0TmV4dEJ1ZmZlciBzdGF0dXMgJWQiLCBfX2Z1bmNfXywgbUlkLCBzdGF0dXMpOwogICAgIGJ1ZmZlci0+ZnJhbWVDb3VudCA9IGJ1Zi5tRnJhbWVDb3VudDsKICAgICBpZiAoYnVmLm1GcmFtZUNvdW50ID09IDApIHsKICAgICAgICAgcmV0dXJuIFdPVUxEX0JMT0NLOwpAQCAtMTU1Nyw3ICsxNjEwLDcgQEAKIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpQYXRjaFRyYWNrOjpyZWxlYXNlQnVmZmVyKEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciogYnVmZmVyKQogewotICAgIEFMT0dfQVNTRVJUKG1QZWVyUHJveHkgIT0gMCwgIlBhdGNoVHJhY2s6OnJlbGVhc2VCdWZmZXIoKSBjYWxsZWQgd2l0aG91dCBwZWVyIHByb3h5Iik7CisgICAgQUxPR19BU1NFUlQobVBlZXJQcm94eSAhPSAwLCAiJXMoJWQpOiBjYWxsZWQgd2l0aG91dCBwZWVyIHByb3h5IiwgX19mdW5jX18sIG1JZCk7CiAgICAgUHJveHk6OkJ1ZmZlciBidWY7CiAgICAgYnVmLm1GcmFtZUNvdW50ID0gYnVmZmVyLT5mcmFtZUNvdW50OwogICAgIGJ1Zi5tUmF3ID0gYnVmZmVyLT5yYXc7CkBAIC0xNTkyLDcgKzE2NDUsNyBAQAogdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpQYXRjaFRyYWNrOjpyZXN0YXJ0SWZEaXNhYmxlZCgpCiB7CiAgICAgaWYgKGFuZHJvaWRfYXRvbWljX2FuZCh+Q0JMS19ESVNBQkxFRCwgJm1DYmxrLT5tRmxhZ3MpICYgQ0JMS19ESVNBQkxFRCkgewotICAgICAgICBBTE9HVygiUGF0Y2hUcmFjazo6cmVsZWFzZUJ1ZmZlcigpIGRpc2FibGVkIGR1ZSB0byBwcmV2aW91cyB1bmRlcnJ1biwgcmVzdGFydGluZyIpOworICAgICAgICBBTE9HVygiJXMoJWQpOiBkaXNhYmxlZCBkdWUgdG8gcHJldmlvdXMgdW5kZXJydW4sIHJlc3RhcnRpbmciLCBfX2Z1bmNfXywgbUlkKTsKICAgICAgICAgc3RhcnQoKTsKICAgICB9CiB9CkBAIC0xNjAwLDYgKzE2NTMsOCBAQAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gICAgICBSZWNvcmQKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyN1bmRlZiBMT0dfVEFHCisjZGVmaW5lIExPR19UQUcgIkFGOjpSZWNvcmRIYW5kbGUiCiAKIEF1ZGlvRmxpbmdlcjo6UmVjb3JkSGFuZGxlOjpSZWNvcmRIYW5kbGUoCiAgICAgICAgIGNvbnN0IHNwPEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpSZWNvcmRUcmFjaz4mIHJlY29yZFRyYWNrKQpAQCAtMTYxNSw3ICsxNjcwLDcgQEAKIAogYmluZGVyOjpTdGF0dXMgQXVkaW9GbGluZ2VyOjpSZWNvcmRIYW5kbGU6OnN0YXJ0KGludCAvKkF1ZGlvU3lzdGVtOjpzeW5jX2V2ZW50X3QqLyBldmVudCwKICAgICAgICAgaW50IC8qYXVkaW9fc2Vzc2lvbl90Ki8gdHJpZ2dlclNlc3Npb24pIHsKLSAgICBBTE9HVigiUmVjb3JkSGFuZGxlOjpzdGFydCgpIik7CisgICAgQUxPR1YoIiVzKCkiLCBfX2Z1bmNfXyk7CiAgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpmcm9tU3RhdHVzVCgKICAgICAgICAgbVJlY29yZFRyYWNrLT5zdGFydCgoQXVkaW9TeXN0ZW06OnN5bmNfZXZlbnRfdClldmVudCwgKGF1ZGlvX3Nlc3Npb25fdCkgdHJpZ2dlclNlc3Npb24pKTsKIH0KQEAgLTE2MjYsMTggKzE2ODEsMjAgQEAKIH0KIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZEhhbmRsZTo6c3RvcF9ub252aXJ0dWFsKCkgewotICAgIEFMT0dWKCJSZWNvcmRIYW5kbGU6OnN0b3AoKSIpOworICAgIEFMT0dWKCIlcygpIiwgX19mdW5jX18pOwogICAgIG1SZWNvcmRUcmFjay0+c3RvcCgpOwogfQogCiBiaW5kZXI6OlN0YXR1cyBBdWRpb0ZsaW5nZXI6OlJlY29yZEhhbmRsZTo6Z2V0QWN0aXZlTWljcm9waG9uZXMoCiAgICAgICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4qIGFjdGl2ZU1pY3JvcGhvbmVzKSB7Ci0gICAgQUxPR1YoIlJlY29yZEhhbmRsZTo6Z2V0QWN0aXZlTWljcm9waG9uZXMoKSIpOworICAgIEFMT0dWKCIlcygpIiwgX19mdW5jX18pOwogICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6ZnJvbVN0YXR1c1QoCiAgICAgICAgICAgICBtUmVjb3JkVHJhY2stPmdldEFjdGl2ZU1pY3JvcGhvbmVzKGFjdGl2ZU1pY3JvcGhvbmVzKSk7CiB9CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyN1bmRlZiBMT0dfVEFHCisjZGVmaW5lIExPR19UQUcgIkFGOjpSZWNvcmRUcmFjayIKIAogLy8gUmVjb3JkVHJhY2sgY29uc3RydWN0b3IgbXVzdCBiZSBjYWxsZWQgd2l0aCBBdWRpb0ZsaW5nZXI6Om1Mb2NrIGFuZCBUaHJlYWRCYXNlOjptTG9jayBoZWxkCiBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UmVjb3JkVHJhY2s6OlJlY29yZFRyYWNrKApAQCAtMTY3MiwxOCArMTcyOSwyMCBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgbVJlY29yZEJ1ZmZlckNvbnZlcnRlciA9IG5ldyBSZWNvcmRCdWZmZXJDb252ZXJ0ZXIoCi0gICAgICAgICAgICB0aHJlYWQtPm1DaGFubmVsTWFzaywgdGhyZWFkLT5tRm9ybWF0LCB0aHJlYWQtPm1TYW1wbGVSYXRlLAotICAgICAgICAgICAgY2hhbm5lbE1hc2ssIGZvcm1hdCwgc2FtcGxlUmF0ZSk7Ci0gICAgLy8gQ2hlY2sgaWYgdGhlIFJlY29yZEJ1ZmZlckNvbnZlcnRlciBjb25zdHJ1Y3Rpb24gd2FzIHN1Y2Nlc3NmdWwuCi0gICAgLy8gSWYgbm90LCBkb24ndCBjb250aW51ZSB3aXRoIGNvbnN0cnVjdGlvbi4KLSAgICAvLwotICAgIC8vIE5PVEU6IEl0IHdvdWxkIGJlIGV4dHJlbWVseSByYXJlIHRoYXQgdGhlIHJlY29yZCB0cmFjayBjYW5ub3QgYmUgY3JlYXRlZAotICAgIC8vIGZvciB0aGUgY3VycmVudCBkZXZpY2UsIGJ1dCBhIHBlbmRpbmcgb3IgZnV0dXJlIGRldmljZSBjaGFuZ2Ugd291bGQgbWFrZQotICAgIC8vIHRoZSByZWNvcmQgdHJhY2sgY29uZmlndXJhdGlvbiB2YWxpZC4KLSAgICBpZiAobVJlY29yZEJ1ZmZlckNvbnZlcnRlci0+aW5pdENoZWNrKCkgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgQUxPR0UoIlJlY29yZFRyYWNrIHVuYWJsZSB0byBjcmVhdGUgcmVjb3JkIGJ1ZmZlciBjb252ZXJ0ZXIiKTsKLSAgICAgICAgcmV0dXJuOworICAgIGlmICghaXNEaXJlY3QoKSkgeworICAgICAgICBtUmVjb3JkQnVmZmVyQ29udmVydGVyID0gbmV3IFJlY29yZEJ1ZmZlckNvbnZlcnRlcigKKyAgICAgICAgICAgICAgICB0aHJlYWQtPm1DaGFubmVsTWFzaywgdGhyZWFkLT5tRm9ybWF0LCB0aHJlYWQtPm1TYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLCBmb3JtYXQsIHNhbXBsZVJhdGUpOworICAgICAgICAvLyBDaGVjayBpZiB0aGUgUmVjb3JkQnVmZmVyQ29udmVydGVyIGNvbnN0cnVjdGlvbiB3YXMgc3VjY2Vzc2Z1bC4KKyAgICAgICAgLy8gSWYgbm90LCBkb24ndCBjb250aW51ZSB3aXRoIGNvbnN0cnVjdGlvbi4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gTk9URTogSXQgd291bGQgYmUgZXh0cmVtZWx5IHJhcmUgdGhhdCB0aGUgcmVjb3JkIHRyYWNrIGNhbm5vdCBiZSBjcmVhdGVkCisgICAgICAgIC8vIGZvciB0aGUgY3VycmVudCBkZXZpY2UsIGJ1dCBhIHBlbmRpbmcgb3IgZnV0dXJlIGRldmljZSBjaGFuZ2Ugd291bGQgbWFrZQorICAgICAgICAvLyB0aGUgcmVjb3JkIHRyYWNrIGNvbmZpZ3VyYXRpb24gdmFsaWQuCisgICAgICAgIGlmIChtUmVjb3JkQnVmZmVyQ29udmVydGVyLT5pbml0Q2hlY2soKSAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgQUxPR0UoIiVzKCVkKTogUmVjb3JkVHJhY2sgdW5hYmxlIHRvIGNyZWF0ZSByZWNvcmQgYnVmZmVyIGNvbnZlcnRlciIsIF9fZnVuY19fLCBtSWQpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CiAgICAgfQogCiAgICAgbVNlcnZlclByb3h5ID0gbmV3IEF1ZGlvUmVjb3JkU2VydmVyUHJveHkobUNibGssIG1CdWZmZXIsIGZyYW1lQ291bnQsCkBAIC0xNjk0LDEyICsxNzUzLDIwIEBACiAgICAgaWYgKGZsYWdzICYgQVVESU9fSU5QVVRfRkxBR19GQVNUKSB7CiAgICAgICAgIEFMT0dfQVNTRVJUKHRocmVhZC0+bUZhc3RUcmFja0F2YWlsKTsKICAgICAgICAgdGhyZWFkLT5tRmFzdFRyYWNrQXZhaWwgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBUT0RPOiBvbmx5IE5vcm1hbCBSZWNvcmQgaGFzIHRpbWVzdGFtcHMgKEZhc3QgUmVjb3JkIGRvZXMgbm90KS4KKyAgICAgICAgbVNlcnZlckxhdGVuY3lTdXBwb3J0ZWQgPSBhdWRpb19pc19saW5lYXJfcGNtKG1Gb3JtYXQpOwogICAgIH0KKyNpZmRlZiBURUVfU0lOSworICAgIG1UZWUuc2V0SWQoc3RkOjpzdHJpbmcoIl8iKSArIHN0ZDo6dG9fc3RyaW5nKG1UaHJlYWRJb0hhbmRsZSkKKyAgICAgICAgICAgICsgIl8iICsgc3RkOjp0b19zdHJpbmcobUlkKQorICAgICAgICAgICAgKyAiX1IiKTsKKyNlbmRpZgogfQogCiBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UmVjb3JkVHJhY2s6On5SZWNvcmRUcmFjaygpCiB7Ci0gICAgQUxPR1YoIiVzIiwgX19mdW5jX18pOworICAgIEFMT0dWKCIlcygpIiwgX19mdW5jX18pOwogICAgIGRlbGV0ZSBtUmVjb3JkQnVmZmVyQ29udmVydGVyOwogICAgIGRlbGV0ZSBtUmVzYW1wbGVyQnVmZmVyUHJvdmlkZXI7CiB9CkBAIC0xNzU2LDE3ICsxODIzLDM0IEBACiAgICAgLy8gc2VlIGNvbW1lbnRzIGF0IEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrOjpkZXN0cm95KCkKICAgICBzcDxSZWNvcmRUcmFjaz4ga2VlcCh0aGlzKTsKICAgICB7Ci0gICAgICAgIGlmIChpc0V4dGVybmFsVHJhY2soKSkgewotICAgICAgICAgICAgaWYgKG1TdGF0ZSA9PSBBQ1RJVkUgfHwgbVN0YXRlID09IFJFU1VNSU5HKSB7Ci0gICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnN0b3BJbnB1dChtUG9ydElkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlSW5wdXQobVBvcnRJZCk7Ci0gICAgICAgIH0KKyAgICAgICAgdHJhY2tfc3RhdGUgcHJpb3JTdGF0ZSA9IG1TdGF0ZTsKICAgICAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gbVRocmVhZC5wcm9tb3RlKCk7CiAgICAgICAgIGlmICh0aHJlYWQgIT0gMCkgewogICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKHRocmVhZC0+bUxvY2spOwogICAgICAgICAgICAgUmVjb3JkVGhyZWFkICpyZWNvcmRUaHJlYWQgPSAoUmVjb3JkVGhyZWFkICopIHRocmVhZC5nZXQoKTsKLSAgICAgICAgICAgIHJlY29yZFRocmVhZC0+ZGVzdHJveVRyYWNrX2wodGhpcyk7CisgICAgICAgICAgICBwcmlvclN0YXRlID0gbVN0YXRlOworICAgICAgICAgICAgcmVjb3JkVGhyZWFkLT5kZXN0cm95VHJhY2tfbCh0aGlzKTsgLy8gbW92ZSBtU3RhdGUgdG8gU1RPUFBFRCwgdGVybWluYXRlCisgICAgICAgIH0KKyAgICAgICAgLy8gQVBNIHBvcnRpZC9jbGllbnQgbWFuYWdlbWVudCBkb25lIG91dHNpZGUgb2YgbG9jay4KKyAgICAgICAgLy8gTk9URTogaWYgdGhyZWFkIGRvZXNuJ3QgZXhpc3QsIHRoZSBpbnB1dCBkZXNjcmlwdG9yIHByb2JhYmx5IGRvZXNuJ3QgZWl0aGVyLgorICAgICAgICBpZiAoaXNFeHRlcm5hbFRyYWNrKCkpIHsKKyAgICAgICAgICAgIHN3aXRjaCAocHJpb3JTdGF0ZSkgeworICAgICAgICAgICAgY2FzZSBBQ1RJVkU6ICAgICAvLyBpbnZhbGlkYXRlZCB3aGlsZSBzdGlsbCBhY3RpdmUKKyAgICAgICAgICAgIGNhc2UgU1RBUlRJTkdfMjogLy8gaW52YWxpZGF0ZWQvc3RhcnQtYWJvcnRlZCBhZnRlciBzdGFydElucHV0IHN1Y2Nlc3NmdWxseSBjYWxsZWQKKyAgICAgICAgICAgIGNhc2UgUEFVU0lORzogICAgLy8gaW52YWxpZGF0ZWQgd2hpbGUgaW4gdGhlIG1pZGRsZSBvZiBzdG9wKCkgcGF1c2luZyAoc3RpbGwgYWN0aXZlKQorICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpzdG9wSW5wdXQobVBvcnRJZCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgU1RBUlRJTkdfMTogLy8gaW52YWxpZGF0ZWQvc3RhcnQtYWJvcnRlZCBhbmQgc3RhcnRJbnB1dCBub3Qgc3VjY2Vzc2Z1bAorICAgICAgICAgICAgY2FzZSBQQVVTRUQ6ICAgICAvLyBPSywgbm90IGFjdGl2ZQorICAgICAgICAgICAgY2FzZSBJRExFOiAgICAgICAvLyBPSywgbm90IGFjdGl2ZQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFNUT1BQRUQ6ICAgIC8vIHVuZXhwZWN0ZWQgKGRlc3Ryb3llZCkKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiJXMoJWQpOiBpbnZhbGlkIHByaW9yIHN0YXRlOiAlZCIsIF9fZnVuY19fLCBtSWQsIHByaW9yU3RhdGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VJbnB1dChtUG9ydElkKTsKICAgICAgICAgfQogICAgIH0KIH0KQEAgLTE3ODMsMTkgKzE4NjcsMjMgQEAKIH0KIAogCi0vKnN0YXRpYyovIHZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OlJlY29yZFRyYWNrOjphcHBlbmREdW1wSGVhZGVyKFN0cmluZzgmIHJlc3VsdCkKK3ZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OlJlY29yZFRyYWNrOjphcHBlbmREdW1wSGVhZGVyKFN0cmluZzgmIHJlc3VsdCkKIHsKLSAgICByZXN1bHQuYXBwZW5kKCJBY3RpdmUgQ2xpZW50IFNlc3Npb24gUyAgRmxhZ3MgICBGb3JtYXQgQ2huIG1hc2sgIFNSYXRlICAgU2VydmVyIEZybUNudCBTaWxcbiIpOworICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIkFjdGl2ZSAgICAgSWQgQ2xpZW50IFNlc3Npb24gUyAgRmxhZ3MgICIKKyAgICAgICAgICAgICAgICAgICAgICAgICIgRm9ybWF0IENobiBtYXNrICBTUmF0ZSBTb3VyY2UgICIKKyAgICAgICAgICAgICAgICAgICAgICAgICIgU2VydmVyIEZybUNudCBGcm1SZHkgU2lsJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBpc1NlcnZlckxhdGVuY3lTdXBwb3J0ZWQoKSA/ICIgICBMYXRlbmN5IiA6ICIiKTsKIH0KIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UmVjb3JkVHJhY2s6OmFwcGVuZER1bXAoU3RyaW5nOCYgcmVzdWx0LCBib29sIGFjdGl2ZSkKIHsKLSAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIlYyU1cyAlNnUgJTd1ICUycyAweCUwM1ggIgotICAgICAgICAgICAgIiUwOFggJTA4WCAlNnUgIgotICAgICAgICAgICAgIiUwOFggJTZ6dSAlM2NcbiIsCisgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiJWMlNXMgJTZkICU2dSAlN3UgJTJzIDB4JTAzWCAiCisgICAgICAgICAgICAiJTA4WCAlMDhYICU2dSAlNlggIgorICAgICAgICAgICAgIiUwOFggJTZ6dSAlNnp1ICUzYyIsCiAgICAgICAgICAgICBpc0Zhc3RUcmFjaygpID8gJ0YnIDogJyAnLAogICAgICAgICAgICAgYWN0aXZlID8gInllcyIgOiAibm8iLAotICAgICAgICAgICAgKG1DbGllbnQgPT0gMCkgPyBnZXRwaWRfY2FjaGVkIDogbUNsaWVudC0+cGlkKCksCisgICAgICAgICAgICBtSWQsCisgICAgICAgICAgICAobUNsaWVudCA9PSAwKSA/IGdldHBpZCgpIDogbUNsaWVudC0+cGlkKCksCiAgICAgICAgICAgICBtU2Vzc2lvbklkLAogICAgICAgICAgICAgZ2V0VHJhY2tTdGF0ZVN0cmluZygpLAogICAgICAgICAgICAgbUNibGstPm1GbGFncywKQEAgLTE4MDMsMTEgKzE4OTEsMjUgQEAKICAgICAgICAgICAgIG1Gb3JtYXQsCiAgICAgICAgICAgICBtQ2hhbm5lbE1hc2ssCiAgICAgICAgICAgICBtU2FtcGxlUmF0ZSwKKyAgICAgICAgICAgIG1BdHRyLnNvdXJjZSwKIAogICAgICAgICAgICAgbUNibGstPm1TZXJ2ZXIsCiAgICAgICAgICAgICBtRnJhbWVDb3VudCwKKyAgICAgICAgICAgIG1TZXJ2ZXJQcm94eS0+ZnJhbWVzUmVhZHlTYWZlKCksCiAgICAgICAgICAgICBpc1NpbGVuY2VkKCkgPyAncycgOiAnbicKICAgICAgICAgICAgICk7CisgICAgaWYgKGlzU2VydmVyTGF0ZW5jeVN1cHBvcnRlZCgpKSB7CisgICAgICAgIGRvdWJsZSBsYXRlbmN5TXM7CisgICAgICAgIGJvb2wgZnJvbVRyYWNrOworICAgICAgICBpZiAoZ2V0VHJhY2tMYXRlbmN5TXMoJmxhdGVuY3lNcywgJmZyb21UcmFjaykgPT0gT0spIHsKKyAgICAgICAgICAgIC8vIFNob3cgbGF0ZW5jeSBpbiBtc2VjLCBmb2xsb3dlZCBieSAndCcgaWYgZnJvbSB0cmFjayB0aW1lc3RhbXAgKHRoZSBtb3N0IGFjY3VyYXRlKQorICAgICAgICAgICAgLy8gb3IgJ2snIGlmIGVzdGltYXRlZCBmcm9tIGtlcm5lbCAodXN1YWxseSBmb3IgZGVidWdnaW5nKS4KKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAlNy4ybGYgJWMiLCBsYXRlbmN5TXMsIGZyb21UcmFjayA/ICd0JyA6ICdrJyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIlMTBzIiwgbUNibGstPm1TZXJ2ZXIgIT0gMCA/ICJ1bmF2YWlsIiA6ICJuZXciKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXN1bHQuYXBwZW5kKCJcbiIpOwogfQogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpSZWNvcmRUcmFjazo6aGFuZGxlU3luY1N0YXJ0RXZlbnQoY29uc3Qgc3A8U3luY0V2ZW50PiYgZXZlbnQpCkBAIC0xODM3LDYgKzE5MzksMTYgQEAKICAgICAgICAgaW50NjRfdCB0cmFja0ZyYW1lc1JlbGVhc2VkLCBpbnQ2NF90IHNvdXJjZUZyYW1lc1JlYWQsCiAgICAgICAgIHVpbnQzMl90IGhhbFNhbXBsZVJhdGUsIGNvbnN0IEV4dGVuZGVkVGltZXN0YW1wICZ0aW1lc3RhbXApCiB7CisgICAvLyBNYWtlIHRoZSBrZXJuZWwgZnJhbWV0aW1lIGF2YWlsYWJsZS4KKyAgICBjb25zdCBGcmFtZVRpbWUgZnR7CisgICAgICAgICAgICB0aW1lc3RhbXAubVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdLAorICAgICAgICAgICAgdGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF19OworICAgIC8vIEFMT0dEKCJGcmFtZVRpbWU6ICVsbGQgJWxsZCIsIChsb25nIGxvbmcpZnQuZnJhbWVzLCAobG9uZyBsb25nKWZ0LnRpbWVOcyk7CisgICAgbUtlcm5lbEZyYW1lVGltZS5zdG9yZShmdCk7CisgICAgaWYgKCFhdWRpb19pc19saW5lYXJfcGNtKG1Gb3JtYXQpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKICAgICBFeHRlbmRlZFRpbWVzdGFtcCBsb2NhbCA9IHRpbWVzdGFtcDsKIAogICAgIC8vIENvbnZlcnQgSEFMIGZyYW1lcyB0byBzZXJ2ZXItc2lkZSB0cmFjayBmcmFtZXMgYXQgdHJhY2sgc2FtcGxlIHJhdGUuCkBAIC0xODUwLDYgKzE5NjIsMTUgQEAKICAgICAgICAgfQogICAgIH0KICAgICBtU2VydmVyUHJveHktPnNldFRpbWVzdGFtcChsb2NhbCk7CisKKyAgICAvLyBDb21wdXRlIGxhdGVuY3kgaW5mby4KKyAgICBjb25zdCBib29sIHVzZVRyYWNrVGltZXN0YW1wID0gdHJ1ZTsgLy8gdXNlIHRyYWNrIHVubGVzcyBkZWJ1Z2dpbmcuCisgICAgY29uc3QgZG91YmxlIGxhdGVuY3lNcyA9IC0gKHVzZVRyYWNrVGltZXN0YW1wCisgICAgICAgICAgICA/IGxvY2FsLmdldE91dHB1dFNlcnZlckxhdGVuY3lNcyhzYW1wbGVSYXRlKCkpCisgICAgICAgICAgICA6IHRpbWVzdGFtcC5nZXRPdXRwdXRTZXJ2ZXJMYXRlbmN5TXMoaGFsU2FtcGxlUmF0ZSkpOworCisgICAgbVNlcnZlckxhdGVuY3lGcm9tVHJhY2suc3RvcmUodXNlVHJhY2tUaW1lc3RhbXApOworICAgIG1TZXJ2ZXJMYXRlbmN5TXMuc3RvcmUobGF0ZW5jeU1zKTsKIH0KIAogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OlJlY29yZFRyYWNrOjpnZXRBY3RpdmVNaWNyb3Bob25lcygKQEAgLTE4NjQsNiArMTk4NSwxMCBAQAogICAgIH0KIH0KIAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI3VuZGVmIExPR19UQUcKKyNkZWZpbmUgTE9HX1RBRyAiQUY6OlBhdGNoUmVjb3JkIgorCiBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UGF0Y2hSZWNvcmQ6OlBhdGNoUmVjb3JkKFJlY29yZFRocmVhZCAqcmVjb3JkVGhyZWFkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKQEAgLTE4NzUsNyArMjAwMCw4IEBACiAgICAgOiAgIFJlY29yZFRyYWNrKHJlY29yZFRocmVhZCwgTlVMTCwKICAgICAgICAgICAgICAgICBhdWRpb19hdHRyaWJ1dGVzX3R7fSAvKiBjdXJyZW50bHkgdW51c2VkIGZvciBwYXRjaCB0cmFjayAqLywKICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LAotICAgICAgICAgICAgICAgIGJ1ZmZlciwgYnVmZmVyU2l6ZSwgQVVESU9fU0VTU0lPTl9OT05FLCBnZXR1aWQoKSwgZmxhZ3MsIFRZUEVfUEFUQ0gpLAorICAgICAgICAgICAgICAgIGJ1ZmZlciwgYnVmZmVyU2l6ZSwgQVVESU9fU0VTU0lPTl9OT05FLCBBSURfQVVESU9TRVJWRVIsCisgICAgICAgICAgICAgICAgZmxhZ3MsIFRZUEVfUEFUQ0gpLAogICAgICAgICAgICAgICAgIG1Qcm94eShuZXcgQ2xpZW50UHJveHkobUNibGssIG1CdWZmZXIsIGZyYW1lQ291bnQsIG1GcmFtZVNpemUsIGZhbHNlLCB0cnVlKSkKIHsKICAgICB1aW50NjRfdCBtaXhCdWZmZXJOcyA9ICgodWludDY0X3QpMiAqIHJlY29yZFRocmVhZC0+ZnJhbWVDb3VudCgpICogMTAwMDAwMDAwMCkgLwpAQCAtMTg4Myw4ICsyMDA5LDggQEAKICAgICBtUGVlclRpbWVvdXQudHZfc2VjID0gbWl4QnVmZmVyTnMgLyAxMDAwMDAwMDAwOwogICAgIG1QZWVyVGltZW91dC50dl9uc2VjID0gKGludCkgKG1peEJ1ZmZlck5zICUgMTAwMDAwMDAwMCk7CiAKLSAgICBBTE9HVigiUGF0Y2hSZWNvcmQgJXAgc2FtcGxlUmF0ZSAlZCBtUGVlclRpbWVvdXQgJWQuJTAzZCBzZWMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLCBzYW1wbGVSYXRlLAorICAgIEFMT0dWKCIlcyglZCk6IHNhbXBsZVJhdGUgJWQgbVBlZXJUaW1lb3V0ICVkLiUwM2Qgc2VjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1JZCwgc2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCltUGVlclRpbWVvdXQudHZfc2VjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KShtUGVlclRpbWVvdXQudHZfbnNlYyAvIDEwMDAwMDApKTsKIH0KQEAgLTE4OTcsMTIgKzIwMjMsMTIgQEAKIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpQYXRjaFJlY29yZDo6Z2V0TmV4dEJ1ZmZlcigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyKiBidWZmZXIpCiB7Ci0gICAgQUxPR19BU1NFUlQobVBlZXJQcm94eSAhPSAwLCAiUGF0Y2hSZWNvcmQ6OmdldE5leHRCdWZmZXIoKSBjYWxsZWQgd2l0aG91dCBwZWVyIHByb3h5Iik7CisgICAgQUxPR19BU1NFUlQobVBlZXJQcm94eSAhPSAwLCAiJXMoJWQpOiBjYWxsZWQgd2l0aG91dCBwZWVyIHByb3h5IiwgX19mdW5jX18sIG1JZCk7CiAgICAgUHJveHk6OkJ1ZmZlciBidWY7CiAgICAgYnVmLm1GcmFtZUNvdW50ID0gYnVmZmVyLT5mcmFtZUNvdW50OwogICAgIHN0YXR1c190IHN0YXR1cyA9IG1QZWVyUHJveHktPm9idGFpbkJ1ZmZlcigmYnVmLCAmbVBlZXJUaW1lb3V0KTsKICAgICBBTE9HVl9JRihzdGF0dXMgIT0gTk9fRVJST1IsCi0gICAgICAgICAgICAgIlBhdGNoUmVjb3JkKCkgJXAgbVBlZXJQcm94eS0+b2J0YWluQnVmZmVyIHN0YXR1cyAlZCIsIHRoaXMsIHN0YXR1cyk7CisgICAgICAgICAgICAgIiVzKCVkKTogbVBlZXJQcm94eS0+b2J0YWluQnVmZmVyIHN0YXR1cyAlZCIsIF9fZnVuY19fLCBtSWQsIHN0YXR1cyk7CiAgICAgYnVmZmVyLT5mcmFtZUNvdW50ID0gYnVmLm1GcmFtZUNvdW50OwogICAgIGlmIChidWYubUZyYW1lQ291bnQgPT0gMCkgewogICAgICAgICByZXR1cm4gV09VTERfQkxPQ0s7CkBAIC0xOTEzLDcgKzIwMzksNyBAQAogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpQYXRjaFJlY29yZDo6cmVsZWFzZUJ1ZmZlcihBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIqIGJ1ZmZlcikKIHsKLSAgICBBTE9HX0FTU0VSVChtUGVlclByb3h5ICE9IDAsICJQYXRjaFJlY29yZDo6cmVsZWFzZUJ1ZmZlcigpIGNhbGxlZCB3aXRob3V0IHBlZXIgcHJveHkiKTsKKyAgICBBTE9HX0FTU0VSVChtUGVlclByb3h5ICE9IDAsICIlcyglZCk6IGNhbGxlZCB3aXRob3V0IHBlZXIgcHJveHkiLCBfX2Z1bmNfXywgbUlkKTsKICAgICBQcm94eTo6QnVmZmVyIGJ1ZjsKICAgICBidWYubUZyYW1lQ291bnQgPSBidWZmZXItPmZyYW1lQ291bnQ7CiAgICAgYnVmLm1SYXcgPSBidWZmZXItPnJhdzsKQEAgLTE5MzIsNyArMjA1OCw5IEBACiAgICAgbVByb3h5LT5yZWxlYXNlQnVmZmVyKGJ1ZmZlcik7CiB9CiAKLQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI3VuZGVmIExPR19UQUcKKyNkZWZpbmUgTE9HX1RBRyAiQUY6Ok1tYXBUcmFjayIKIAogQXVkaW9GbGluZ2VyOjpNbWFwVGhyZWFkOjpNbWFwVHJhY2s6Ok1tYXBUcmFjayhUaHJlYWRCYXNlICp0aHJlYWQsCiAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCYgYXR0ciwKQEAgLTE5NDAsMTMgKzIwNjgsMTQgQEAKICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwKKyAgICAgICAgYm9vbCBpc091dCwKICAgICAgICAgdWlkX3QgdWlkLAogICAgICAgICBwaWRfdCBwaWQsCiAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogICAgIDogICBUcmFja0Jhc2UodGhyZWFkLCBOVUxMLCBhdHRyLCBzYW1wbGVSYXRlLCBmb3JtYXQsCiAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywgKHNpemVfdCkwIC8qIGZyYW1lQ291bnQgKi8sCiAgICAgICAgICAgICAgICAgICBudWxscHRyIC8qIGJ1ZmZlciAqLywgKHNpemVfdCkwIC8qIGJ1ZmZlclNpemUgKi8sCi0gICAgICAgICAgICAgICAgICBzZXNzaW9uSWQsIHVpZCwgZmFsc2UgLyogaXNPdXQgKi8sCisgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQsIHVpZCwgaXNPdXQsCiAgICAgICAgICAgICAgICAgICBBTExPQ19OT05FLAogICAgICAgICAgICAgICAgICAgVFlQRV9ERUZBVUxULCBwb3J0SWQpLAogICAgICAgICBtUGlkKHBpZCksIG1TaWxlbmNlZChmYWxzZSksIG1TaWxlbmNlZE5vdGlmaWVkKGZhbHNlKQpAQCAtMTk2Myw3ICsyMDkyLDcgQEAKIH0KIAogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpNbWFwVGhyZWFkOjpNbWFwVHJhY2s6OnN0YXJ0KEF1ZGlvU3lzdGVtOjpzeW5jX2V2ZW50X3QgZXZlbnQgX191bnVzZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCB0cmlnZ2VyU2Vzc2lvbiBfX3VudXNlZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3QgdHJpZ2dlclNlc3Npb24gX191bnVzZWQpCiB7CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQpAQCAtMTk5NCwxOSArMjEyMywyNyBAQAogewogfQogCi0vKnN0YXRpYyovIHZvaWQgQXVkaW9GbGluZ2VyOjpNbWFwVGhyZWFkOjpNbWFwVHJhY2s6OmFwcGVuZER1bXBIZWFkZXIoU3RyaW5nOCYgcmVzdWx0KQordm9pZCBBdWRpb0ZsaW5nZXI6Ok1tYXBUaHJlYWQ6Ok1tYXBUcmFjazo6YXBwZW5kRHVtcEhlYWRlcihTdHJpbmc4JiByZXN1bHQpCiB7Ci0gICAgcmVzdWx0LmFwcGVuZCgiQ2xpZW50IFNlc3Npb24gICBGb3JtYXQgQ2huIG1hc2sgIFNSYXRlXG4iKTsKKyAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCJDbGllbnQgU2Vzc2lvbiAgIEZvcm1hdCBDaG4gbWFzayAgU1JhdGUgRmxhZ3MgJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBpc091dCgpID8gIlVzZyBDVCI6ICJTb3VyY2UiKTsKIH0KIAogdm9pZCBBdWRpb0ZsaW5nZXI6Ok1tYXBUaHJlYWQ6Ok1tYXBUcmFjazo6YXBwZW5kRHVtcChTdHJpbmc4JiByZXN1bHQsIGJvb2wgYWN0aXZlIF9fdW51c2VkKQogewotICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiU2dSAlN3UgJTA4WCAlMDhYICU2dVxuIiwKKyAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIlNnUgJTd1ICUwOFggJTA4WCAlNnUgMHglMDNYICIsCiAgICAgICAgICAgICBtUGlkLAogICAgICAgICAgICAgbVNlc3Npb25JZCwKICAgICAgICAgICAgIG1Gb3JtYXQsCiAgICAgICAgICAgICBtQ2hhbm5lbE1hc2ssCi0gICAgICAgICAgICBtU2FtcGxlUmF0ZSk7CisgICAgICAgICAgICBtU2FtcGxlUmF0ZSwKKyAgICAgICAgICAgIG1BdHRyLmZsYWdzKTsKKyAgICBpZiAoaXNPdXQoKSkgeworICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIlM3ggJTJ4IiwgbUF0dHIudXNhZ2UsIG1BdHRyLmNvbnRlbnRfdHlwZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiJTZ4IiwgbUF0dHIuc291cmNlKTsKKyAgICB9CisgICAgcmVzdWx0LmFwcGVuZCgiXG4iKTsKIH0KIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1R5cGVkTG9nZ2VyLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHlwZWRMb2dnZXIuaAppbmRleCAzOGMzYzAyLi42ZWYxOWJmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHlwZWRMb2dnZXIuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHlwZWRMb2dnZXIuaApAQCAtOTcsOCArOTcsNDIgQEAKICNkZWZpbmUgTE9HX0FVRElPX1NUQVRFKCkgZG8geyBOQkxvZzo6V3JpdGVyICp4ID0gdGxOQkxvZ1dyaXRlcjsgaWYgKHggIT0gbnVsbHB0cikgXAogICAgICAgICB4LT5sb2dFdmVudEhpc3RUcyhOQkxvZzo6RVZFTlRfQVVESU9fU1RBVEUsIGhhc2goX19GSUxFX18sIF9fTElORV9fKSk7IH0gd2hpbGUoMCkKIAorLy8gTG9nIHRoZSBkaWZmZXJlbmNlIGJld3RlZW4gZnJhbWVzIHByZXNlbnRlZCBieSBIQUwgYW5kIGZyYW1lcyB3cml0dGVuIHRvIEhBTCBvdXRwdXQgc2luaywKKy8vIGRpdmlkZWQgYnkgdGhlIHNhbXBsZSByYXRlLiBQYXJhbWV0ZXIgbXMgaXMgb2YgdHlwZSBkb3VibGUuCisjZGVmaW5lIExPR19MQVRFTkNZKG1zKSBkbyB7IE5CTG9nOjpXcml0ZXIgKnggPSB0bE5CTG9nV3JpdGVyOyBpZiAoeCAhPSBudWxscHRyKSBcCisgICAgICAgIHgtPmxvZzxOQkxvZzo6RVZFTlRfTEFURU5DWT4obXMpOyB9IHdoaWxlICgwKQorCisvLyBSZWNvcmQgdGhyZWFkIG92ZXJydW4gZXZlbnQgbmFub3NlY29uZCB0aW1lc3RhbXAuIFBhcmFtZXRlciBucyBpcyBhbiBpbnQ2NF90LgorI2RlZmluZSBMT0dfT1ZFUlJVTihucykgZG8geyBOQkxvZzo6V3JpdGVyICp4ID0gdGxOQkxvZ1dyaXRlcjsgaWYgKHggIT0gbnVsbHB0cikgXAorICAgICAgICB4LT5sb2c8TkJMb2c6OkVWRU5UX09WRVJSVU4+KG5zKTsgfSB3aGlsZSAoMCkKKworLy8gUmVjb3JkIHRocmVhZCBpbmZvLiBUaGlzIGN1cnJlbnRseSBpbmNsdWRlcyB0eXBlLCBmcmFtZUNvdW50LCBhbmQgc2FtcGxlUmF0ZS4KKy8vIFBhcmFtZXRlciB0eXBlIGlzIHRocmVhZF9pbmZvX3QgYXMgZGVmaW5lZCBpbiBOQkxvZy5oLgorI2RlZmluZSBMT0dfVEhSRUFEX0lORk8oaW5mbykgZG8geyBOQkxvZzo6V3JpdGVyICp4ID0gdGxOQkxvZ1dyaXRlcjsgXAorICAgICAgICBpZiAoeCAhPSBudWxscHRyKSB4LT5sb2c8TkJMb2c6OkVWRU5UX1RIUkVBRF9JTkZPPihpbmZvKTsgfSB3aGlsZSAoMCkKKworI2RlZmluZSBMT0dfVEhSRUFEX1BBUkFNUyhwYXJhbXMpIGRvIHtOQkxvZzo6V3JpdGVyICp4ID0gdGxOQkxvZ1dyaXRlcjsgXAorICAgICAgICBpZiAoeCAhPSBudWxscHRyKSB4LT5sb2c8TkJMb2c6OkVWRU5UX1RIUkVBRF9QQVJBTVM+KHBhcmFtcyk7IH0gd2hpbGUgKDApCisKKy8vIFJlY29yZCB0aHJlYWQgdW5kZXJydW4gZXZlbnQgbmFub3NlY29uZCB0aW1lc3RhbXAuIFBhcmFtZXRlciBucyBpcyBhbiBpbnQ2NF90LgorI2RlZmluZSBMT0dfVU5ERVJSVU4obnMpIGRvIHsgTkJMb2c6OldyaXRlciAqeCA9IHRsTkJMb2dXcml0ZXI7IGlmICh4ICE9IG51bGxwdHIpIFwKKyAgICAgICAgeC0+bG9nPE5CTG9nOjpFVkVOVF9VTkRFUlJVTj4obnMpOyB9IHdoaWxlICgwKQorCisvLyBSZWNvcmQgdGhyZWFkIHdhcm11cCB0aW1lIGluIG1pbGxpc2Vjb25kcy4gUGFyYW1ldGVyIG1zIGlzIG9mIHR5cGUgZG91YmxlLgorI2RlZmluZSBMT0dfV0FSTVVQX1RJTUUobXMpIGRvIHsgTkJMb2c6OldyaXRlciAqeCA9IHRsTkJMb2dXcml0ZXI7IGlmICh4ICE9IG51bGxwdHIpIFwKKyAgICAgICAgeC0+bG9nPE5CTG9nOjpFVkVOVF9XQVJNVVBfVElNRT4obXMpOyB9IHdoaWxlICgwKQorCisvLyBSZWNvcmQgYSB0eXBlZCBlbnRyeSB0aGF0IHJlcHJlc2VudHMgYSB0aHJlYWQncyB3b3JrIHRpbWUgaW4gbmFub3NlY29uZHMuCisvLyBQYXJhbWV0ZXIgbnMgc2hvdWxkIGJlIG9mIHR5cGUgdWludDMyX3QuCisjZGVmaW5lIExPR19XT1JLX1RJTUUobnMpIGRvIHsgTkJMb2c6OldyaXRlciAqeCA9IHRsTkJMb2dXcml0ZXI7IGlmICh4ICE9IG51bGxwdHIpIFwKKyAgICAgICAgeC0+bG9nPE5CTG9nOjpFVkVOVF9XT1JLX1RJTUU+KG5zKTsgfSB3aGlsZSAoMCkKKwogbmFtZXNwYWNlIGFuZHJvaWQgewogZXh0ZXJuICJDIiB7CisvLyBUT0RPIGNvbnNpZGVyIGFkZGluZyBhIHRocmVhZF9sb2NhbCBOQkxvZzo6V3JpdGVyIHRsRHVtbXlOQkxvZ1dyaXRlciBhbmQgdGhlbgorLy8gaW5pdGlhbGl6ZSBiZWxvdyB0bE5CTG9nV3JpdGVyIHRvICZ0bER1bW15TkJMb2dXcml0ZXIgdG8gcmVtb3ZlIHRoZSBuZWVkIHRvCisvLyBjaGVjayBmb3IgbnVsbHB0ciBldmVyeSB0aW1lLiBBbHNvIHJlZHVjZXMgdGhlIG5lZWQgdG8gYWRkIGEgbmV3IGxvZ2dpbmcgbWFjcm8gYWJvdmUKKy8vIGVhY2ggdGltZSB3ZSB3YW50IHRvIGxvZyBhIG5ldyB0eXBlLgogZXh0ZXJuIHRocmVhZF9sb2NhbCBOQkxvZzo6V3JpdGVyICp0bE5CTG9nV3JpdGVyOwogfQogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvQW5kcm9pZC5tayBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0FuZHJvaWQubWsKaW5kZXggZDI5Y2FlMS4uZjIzZTQyNiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvQW5kcm9pZC5taworKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BbmRyb2lkLm1rCkBAIC0xMyw3ICsxMyw2IEBACiAgICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLXV0aWxzKSBcCiAgICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZSBcCiAgICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvaW50ZXJmYWNlIFwKLSAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L3V0aWxpdGllcwogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKICAgICBsaWJjdXRpbHMgXApAQCAtMjIsMTAgKzIxLDEwIEBACiAgICAgbGliYmluZGVyIFwKICAgICBsaWJhdWRpb2NsaWVudCBcCiAgICAgbGliaGFyZHdhcmVfbGVnYWN5IFwKLSAgICBsaWJzZXJ2aWNldXRpbGl0eSBcCiAgICAgbGliYXVkaW9wb2xpY3ltYW5hZ2VyIFwKICAgICBsaWJtZWRpYV9oZWxwZXIgXAogICAgIGxpYm1lZGlhbWV0cmljcyBcCisgICAgbGlibWVkaWF1dGlscyBcCiAgICAgbGliZWZmZWN0c2NvbmZpZwogCiBMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKQEAgLTc0LDcgKzczLDcgQEAKIExPQ0FMX0NfSU5DTFVERVMgKz0gXAogICAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL2luY2x1ZGUgXAogICAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2ludGVyZmFjZSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS91dGlsaXRpZXMKKyAgICAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tdXRpbHMpIFwKIAogTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBcCiAgICAgbGliYXVkaW9wb2xpY3ljb21wb25lbnRzCkBAIC04Myw3ICs4Miw3IEBACiBMT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYm1lZGlhbWV0cmljcwogCiBpZmVxICgkKFVTRV9YTUxfQVVESU9fUE9MSUNZX0NPTkYpLCAxKQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBsaWJpY3V1YyBsaWJ4bWwyCitMT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYmhpZGxiYXNlIGxpYmljdXVjIGxpYnhtbDIKIAogTE9DQUxfQ0ZMQUdTICs9IC1EVVNFX1hNTF9BVURJT19QT0xJQ1lfQ09ORgogZW5kaWYgI2lmZXEgKCQoVVNFX1hNTF9BVURJT19QT0xJQ1lfQ09ORiksIDEpCkBAIC0xMTEsNyArMTEwLDggQEAKIAogTE9DQUxfQ19JTkNMVURFUyArPSBcCiAgICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvaW50ZXJmYWNlCisgICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvaW50ZXJmYWNlIFwKKyAgICAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tdXRpbHMpIFwKIAogTE9DQUxfQ0ZMQUdTIDo9IC1XYWxsIC1XZXJyb3IKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lJbnRlcmZhY2UuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5SW50ZXJmYWNlLmgKaW5kZXggNDgxMmIxZi4uZDRjNDlkOSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lJbnRlcmZhY2UuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeUludGVyZmFjZS5oCkBAIC0xMjQsMTcgKzEyNCwxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnNlbGVjdGVkRGV2aWNlSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkKSA9IDA7CiAgICAgLy8gaW5kaWNhdGVzIHRvIHRoZSBhdWRpbyBwb2xpY3kgbWFuYWdlciB0aGF0IHRoZSBvdXRwdXQgc3RhcnRzIGJlaW5nIHVzZWQgYnkgY29ycmVzcG9uZGluZyBzdHJlYW0uCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydE91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkgPSAwOwogICAgIC8vIGluZGljYXRlcyB0byB0aGUgYXVkaW8gcG9saWN5IG1hbmFnZXIgdGhhdCB0aGUgb3V0cHV0IHN0b3BzIGJlaW5nIHVzZWQgYnkgY29ycmVzcG9uZGluZyBzdHJlYW0uCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wT3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKSA9IDA7CiAgICAgLy8gcmVsZWFzZXMgdGhlIG91dHB1dC4KLSAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZU91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkgPSAwOwogCiAgICAgLy8gcmVxdWVzdCBhbiBpbnB1dCBhcHByb3ByaWF0ZSBmb3IgcmVjb3JkIGZyb20gdGhlIHN1cHBsaWVkIGRldmljZSB3aXRoIHN1cHBsaWVkIHBhcmFtZXRlcnMuCiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRJbnB1dEZvckF0dHIoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyLApAQCAtMTQ3LDE2ICsxNDEsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dF90eXBlX3QgKmlucHV0VHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQpID0gMDsKICAgICAvLyBpbmRpY2F0ZXMgdG8gdGhlIGF1ZGlvIHBvbGljeSBtYW5hZ2VyIHRoYXQgdGhlIGlucHV0IHN0YXJ0cyBiZWluZyB1c2VkLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydElucHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHNpbGVuY2VkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25jdXJyZW5jeV90eXBlX19tYXNrX3QgKmNvbmN1cnJlbmN5KSA9IDA7CiAgICAgLy8gaW5kaWNhdGVzIHRvIHRoZSBhdWRpbyBwb2xpY3kgbWFuYWdlciB0aGF0IHRoZSBpbnB1dCBzdG9wcyBiZWluZyB1c2VkLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wSW5wdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpID0gMDsKICAgICAvLyByZWxlYXNlcyB0aGUgaW5wdXQuCi0gICAgdmlydHVhbCB2b2lkIHJlbGVhc2VJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIHJlbGVhc2VJbnB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkgPSAwOwogCiAgICAgLy8KICAgICAvLyB2b2x1bWUgY29udHJvbCBmdW5jdGlvbnMKQEAgLTIzNSw5ICsyMjYsOSBAQAogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydEF1ZGlvU291cmNlKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHJpYnV0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkKSA9IDA7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wQXVkaW9Tb3VyY2UoYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wQXVkaW9Tb3VyY2UoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpID0gMDsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWFzdGVyTW9ubyhib29sIG1vbm8pID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1hc3Rlck1vbm8oYm9vbCAqbW9ubykgPSAwOwpAQCAtMzI0LDExICszMTUsNiBAQAogICAgIC8vIGZ1bmN0aW9uIGVuYWJsaW5nIHRvIHJlY2VpdmUgcHJvcHJpZXRhcnkgaW5mb3JtYXRpb25zIGRpcmVjdGx5IGZyb20gYXVkaW8gaGFyZHdhcmUgaW50ZXJmYWNlIHRvIGF1ZGlvIHBvbGljeSBtYW5hZ2VyLgogICAgIHZpcnR1YWwgU3RyaW5nOCBnZXRQYXJhbWV0ZXJzKGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlLCBjb25zdCBTdHJpbmc4JiBrZXlzKSA9IDA7CiAKLSAgICAvLyByZXF1ZXN0IHRoZSBwbGF5YmFjayBvZiBhIHRvbmUgb24gdGhlIHNwZWNpZmllZCBzdHJlYW06IHVzZWQgZm9yIGluc3RhbmNlIHRvIHJlcGxhY2Ugbm90aWZpY2F0aW9uIHNvdW5kcyB3aGVuIHBsYXlpbmcKLSAgICAvLyBvdmVyIGEgdGVsZXBob255IGRldmljZSBkdXJpbmcgYSBwaG9uZSBjYWxsLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRUb25lKGF1ZGlvX3BvbGljeV90b25lX3QgdG9uZSwgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pID0gMDsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BUb25lKCkgPSAwOwotCiAgICAgLy8gc2V0IGRvd24gbGluayBhdWRpbyB2b2x1bWUuCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUsIGludCBkZWxheU1zID0gMCkgPSAwOwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZS9Sb3V0aW5nU3RyYXRlZ3kuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9pbmNsdWRlL1JvdXRpbmdTdHJhdGVneS5oCmluZGV4IGQzODk2N2UuLmY4YTFjZDYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9pbmNsdWRlL1JvdXRpbmdTdHJhdGVneS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9pbmNsdWRlL1JvdXRpbmdTdHJhdGVneS5oCkBAIC0yMyw2ICsyMyw3IEBACiAjZGVmaW5lIFNPTklGSUNBVElPTl9SRVNQRUNURlVMX0FGVEVSX01VU0lDX0RFTEFZIDUwMDAKIAogZW51bSByb3V0aW5nX3N0cmF0ZWd5IHsKKyAgICBTVFJBVEVHWV9OT05FID0gLTEsCiAgICAgU1RSQVRFR1lfTUVESUEsCiAgICAgU1RSQVRFR1lfUEhPTkUsCiAgICAgU1RSQVRFR1lfU09OSUZJQ0FUSU9OLApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL2luY2x1ZGUvVm9sdW1lLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZS9Wb2x1bWUuaAppbmRleCBmYzAxMmEyLi41Y2NjOGZkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZS9Wb2x1bWUuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZS9Wb2x1bWUuaApAQCAtMTM0LDYgKzEzNCw3IEBACiAgICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9VU0JfREVWSUNFOgogICAgICAgICAgICAgcmV0dXJuIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUE7CiAgICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9TUEVBS0VSOgorICAgICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUl9TQUZFOgogICAgICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX1NDT19DQVJLSVQ6CiAgICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9TUEVBS0VSOgogICAgICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfVVNCX0FDQ0VTU09SWToKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvQW5kcm9pZC5tayBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvQW5kcm9pZC5tawppbmRleCBlNjllNjg3Li4zMzM2Yjc5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL0FuZHJvaWQubWsKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9BbmRyb2lkLm1rCkBAIC0xNywxMSArMTcsOSBAQAogICAgIHNyYy9BdWRpb0NvbGxlY3Rpb25zLmNwcCBcCiAgICAgc3JjL0VmZmVjdERlc2NyaXB0b3IuY3BwIFwKICAgICBzcmMvU291bmRUcmlnZ2VyU2Vzc2lvbi5jcHAgXAotICAgIHNyYy9TZXNzaW9uUm91dGUuY3BwIFwKLSAgICBzcmMvQXVkaW9Tb3VyY2VEZXNjcmlwdG9yLmNwcCBcCiAgICAgc3JjL1ZvbHVtZUN1cnZlLmNwcCBcCiAgICAgc3JjL1R5cGVDb252ZXJ0ZXIuY3BwIFwKLSAgICBzcmMvQXVkaW9TZXNzaW9uLmNwcAorICAgIHNyYy9DbGllbnREZXNjcmlwdG9yLmNwcAogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKICAgICBsaWJjdXRpbHMgXApAQCAtMzUsMTQgKzMzLDEzIEBACiAgICAgJChMT0NBTF9QQVRIKS9pbmNsdWRlIFwKICAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9pbmNsdWRlIFwKICAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5IFwKLSAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L3V0aWxpdGllcyBcCi0gICAgc3lzdGVtL21lZGlhL2F1ZGlvX3V0aWxzL2luY2x1ZGUgXAorICAgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby11dGlscykgXAogCiBpZmVxICgkKFVTRV9YTUxfQVVESU9fUE9MSUNZX0NPTkYpLCAxKQogCiBMT0NBTF9TUkNfRklMRVMgKz0gc3JjL1NlcmlhbGl6ZXIuY3BwCiAKLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGliaWN1dWMgbGlieG1sMgorTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBsaWJoaWRsYmFzZSBsaWJpY3V1YyBsaWJ4bWwyCiAKIExPQ0FMX0NfSU5DTFVERVMgKz0gXAogICAgIGV4dGVybmFsL2xpYnhtbDIvaW5jbHVkZSBcCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Db2xsZWN0aW9ucy5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvQ29sbGVjdGlvbnMuaAppbmRleCBmODZlNzVhLi5hOTQ4ZWE5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Db2xsZWN0aW9ucy5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb0NvbGxlY3Rpb25zLmgKQEAgLTM4LDcgKzM4LDcgQEAKIGNsYXNzIEF1ZGlvUm91dGVWZWN0b3IgOiBwdWJsaWMgVmVjdG9yPHNwPEF1ZGlvUm91dGU+ID4KIHsKIHB1YmxpYzoKLSAgICBzdGF0dXNfdCBkdW1wKGludCBmZCwgaW50IHNwYWNlcykgY29uc3Q7CisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcykgY29uc3Q7CiB9OwogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9HYWluLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9HYWluLmgKaW5kZXggNGFjNTA4Zi4uOTk2MzQ3YiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvR2Fpbi5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb0dhaW4uaApAQCAtMTgsNiArMTgsNyBAQAogCiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewpAQCAtNTMsNyArNTQsNyBAQAogICAgIGludCBnZXRNYXhSYW1wSW5NcygpIGNvbnN0IHsgcmV0dXJuIG1HYWluLm1heF9yYW1wX21zOyB9CiAKICAgICAvLyBUT0RPOiByZW1vdmUgZHVtcCBmcm9tIGhlcmUgKHNwbGl0IHNlcmlhbGl6YXRpb24pCi0gICAgdm9pZCBkdW1wKGludCBmZCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdDsKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgpIGNvbnN0OwogCiAgICAgdm9pZCBnZXREZWZhdWx0Q29uZmlnKHN0cnVjdCBhdWRpb19nYWluX2NvbmZpZyAqY29uZmlnKTsKICAgICBzdGF0dXNfdCBjaGVja0NvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fZ2Fpbl9jb25maWcgKmNvbmZpZyk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9JT0Rlc2NyaXB0b3JJbnRlcmZhY2UuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb0lPRGVzY3JpcHRvckludGVyZmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1NTQxMmUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9JT0Rlc2NyaXB0b3JJbnRlcmZhY2UuaApAQCAtMCwwICsxLDM3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyoqCisgKiBJbnRlcmZhY2UgZm9yIEkvTyBkZXNjcmlwdG9ycyB0byBpbXBsZW1lbnQgc28gaW5mb3JtYXRpb24gYWJvdXQgdGhlaXIgY29udGV4dAorICogY2FuIGJlIHF1ZXJpZWQgYW5kIHVwZGF0ZWQuCisgKi8KK2NsYXNzIEF1ZGlvSU9EZXNjcmlwdG9ySW50ZXJmYWNlCit7CitwdWJsaWM6CisgICAgdmlydHVhbCB+QXVkaW9JT0Rlc2NyaXB0b3JJbnRlcmZhY2UoKSB7fTsKKworICAgIHZpcnR1YWwgYXVkaW9fY29uZmlnX2Jhc2VfdCBnZXRDb25maWcoKSBjb25zdCA9IDA7CisKKyAgICB2aXJ0dWFsIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGdldFBhdGNoSGFuZGxlKCkgY29uc3QgPSAwOworCisgICAgdmlydHVhbCB2b2lkIHNldFBhdGNoSGFuZGxlKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSkgPSAwOworfTsKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvSW5wdXREZXNjcmlwdG9yLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9JbnB1dERlc2NyaXB0b3IuaAppbmRleCBiMjVkNmQ0Li42ZTRjMDQ0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9JbnB1dERlc2NyaXB0b3IuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9JbnB1dERlc2NyaXB0b3IuaApAQCAtMTYsMzYgKzE2LDM3IEBACiAKICNwcmFnbWEgb25jZQogCi0jaW5jbHVkZSAiQXVkaW9Qb3J0LmgiCi0jaW5jbHVkZSAiQXVkaW9TZXNzaW9uLmgiCi0jaW5jbHVkZSAiQXVkaW9TZXNzaW9uSW5mb1Byb3ZpZGVyLmgiCi0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CiAjaW5jbHVkZSA8dXRpbHMvU29ydGVkVmVjdG9yLmg+CiAjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KKyNpbmNsdWRlICJBdWRpb0lPRGVzY3JpcHRvckludGVyZmFjZS5oIgorI2luY2x1ZGUgIkF1ZGlvUG9ydC5oIgorI2luY2x1ZGUgIkNsaWVudERlc2NyaXB0b3IuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBjbGFzcyBJT1Byb2ZpbGU7CiBjbGFzcyBBdWRpb01peDsKK2NsYXNzIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlOwogCiAvLyBkZXNjcmlwdG9yIGZvciBhdWRpbyBpbnB1dHMuIFVzZWQgdG8gbWFpbnRhaW4gY3VycmVudCBjb25maWd1cmF0aW9uIG9mIGVhY2ggb3BlbmVkIGF1ZGlvIGlucHV0CiAvLyBhbmQga2VlcCB0cmFjayBvZiB0aGUgdXNhZ2Ugb2YgdGhpcyBpbnB1dC4KLWNsYXNzIEF1ZGlvSW5wdXREZXNjcmlwdG9yOiBwdWJsaWMgQXVkaW9Qb3J0Q29uZmlnLCBwdWJsaWMgQXVkaW9TZXNzaW9uSW5mb1Byb3ZpZGVyCitjbGFzcyBBdWRpb0lucHV0RGVzY3JpcHRvcjogcHVibGljIEF1ZGlvUG9ydENvbmZpZywgcHVibGljIEF1ZGlvSU9EZXNjcmlwdG9ySW50ZXJmYWNlCisgICAgLCBwdWJsaWMgQ2xpZW50TWFwSGFuZGxlcjxSZWNvcmRDbGllbnREZXNjcmlwdG9yPgogewogcHVibGljOgogICAgIGV4cGxpY2l0IEF1ZGlvSW5wdXREZXNjcmlwdG9yKGNvbnN0IHNwPElPUHJvZmlsZT4mIHByb2ZpbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgKmNsaWVudEludGVyZmFjZSk7CiAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBnZXRJZCgpIGNvbnN0OwogICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBnZXRNb2R1bGVIYW5kbGUoKSBjb25zdDsKLSAgICB1aW50MzJfdCBnZXRPcGVuUmVmQ291bnQoKSBjb25zdDsKIAotICAgIHN0YXR1c190ICAgIGR1bXAoaW50IGZkKTsKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdCBvdmVycmlkZTsKIAotICAgIGF1ZGlvX2lvX2hhbmRsZV90ICAgICAgICAgICAgIG1Jb0hhbmRsZTsgICAgICAgLy8gaW5wdXQgaGFuZGxlCi0gICAgYXVkaW9fZGV2aWNlc190ICAgICAgICAgICAgICAgbURldmljZTsgICAgICAgICAvLyBjdXJyZW50IGRldmljZSB0aGlzIGlucHV0IGlzIHJvdXRlZCB0bwotICAgIEF1ZGlvTWl4ICAgICAgICAgICAgICAgICAgICAgICptUG9saWN5TWl4OyAgICAgLy8gbm9uIE5VTEwgd2hlbiB1c2VkIGJ5IGEgZHluYW1pYyBwb2xpY3kKLSAgICBjb25zdCBzcDxJT1Byb2ZpbGU+ICAgICAgICAgICBtUHJvZmlsZTsgICAgICAgIC8vIEkvTyBwcm9maWxlIHRoaXMgb3V0cHV0IGRlcml2ZXMgZnJvbQorICAgIGF1ZGlvX2lvX2hhbmRsZV90ICAgbUlvSGFuZGxlID0gQVVESU9fSU9fSEFORExFX05PTkU7IC8vIGlucHV0IGhhbmRsZQorICAgIGF1ZGlvX2RldmljZXNfdCAgICAgbURldmljZSA9IEFVRElPX0RFVklDRV9OT05FOyAgLy8gY3VycmVudCBkZXZpY2UgdGhpcyBpbnB1dCBpcyByb3V0ZWQgdG8KKyAgICBBdWRpb01peCAgICAgICAgICAgICptUG9saWN5TWl4ID0gbnVsbHB0cjsgICAgICAgIC8vIG5vbiBOVUxMIHdoZW4gdXNlZCBieSBhIGR5bmFtaWMgcG9saWN5CisgICAgY29uc3Qgc3A8SU9Qcm9maWxlPiBtUHJvZmlsZTsgICAgICAgICAgICAgICAgICAgICAvLyBJL08gcHJvZmlsZSB0aGlzIG91dHB1dCBkZXJpdmVzIGZyb20KIAogICAgIHZpcnR1YWwgdm9pZCB0b0F1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmRzdENvbmZpZywKICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc3JjQ29uZmlnID0gTlVMTCkgY29uc3Q7CkBAIC01NSwyMyArNTYsMTggQEAKICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9fc2Vzc2lvbl90PiBnZXRQcmVlbXB0ZWRTZXNzaW9ucygpIGNvbnN0OwogICAgIGJvb2wgaGFzUHJlZW1wdGVkU2Vzc2lvbihhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikgY29uc3Q7CiAgICAgdm9pZCBjbGVhclByZWVtcHRlZFNlc3Npb25zKCk7Ci0gICAgYm9vbCBpc0FjdGl2ZSgpIGNvbnN0OworICAgIGJvb2wgaXNBY3RpdmUoKSBjb25zdCB7IHJldHVybiBtR2xvYmFsQWN0aXZlQ291bnQgPiAwOyB9CiAgICAgYm9vbCBpc1NvdXJjZUFjdGl2ZShhdWRpb19zb3VyY2VfdCBzb3VyY2UpIGNvbnN0OwogICAgIGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlKGJvb2wgYWN0aXZlT25seSA9IGZhbHNlKSBjb25zdDsKICAgICBib29sIGlzU291bmRUcmlnZ2VyKCkgY29uc3Q7Ci0gICAgc3RhdHVzX3QgYWRkQXVkaW9TZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxBdWRpb1Nlc3Npb24+JiBhdWRpb1Nlc3Npb24pOwotICAgIHN0YXR1c190IHJlbW92ZUF1ZGlvU2Vzc2lvbihhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7Ci0gICAgc3A8QXVkaW9TZXNzaW9uPiBnZXRBdWRpb1Nlc3Npb24oYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pIGNvbnN0OwotICAgIEF1ZGlvU2Vzc2lvbkNvbGxlY3Rpb24gZ2V0QXVkaW9TZXNzaW9ucyhib29sIGFjdGl2ZU9ubHkpIGNvbnN0OwotICAgIHNpemVfdCBnZXRBdWRpb1Nlc3Npb25Db3VudChib29sIGFjdGl2ZU9ubHkpIGNvbnN0OwogICAgIGF1ZGlvX3NvdXJjZV90IGdldEhpZ2hlc3RQcmlvcml0eVNvdXJjZShib29sIGFjdGl2ZU9ubHkpIGNvbnN0OworICAgIHZvaWQgc2V0Q2xpZW50QWN0aXZlKGNvbnN0IHNwPFJlY29yZENsaWVudERlc2NyaXB0b3I+JiBjbGllbnQsIGJvb2wgYWN0aXZlKTsKKyAgICBpbnQzMl90IGFjdGl2ZUNvdW50KCkgeyByZXR1cm4gbUdsb2JhbEFjdGl2ZUNvdW50OyB9CiAKLSAgICAvLyBpbXBsZW1lbnRhdGlvbiBvZiBBdWRpb1Nlc3Npb25JbmZvUHJvdmlkZXIKLSAgICB2aXJ0dWFsIGF1ZGlvX2NvbmZpZ19iYXNlX3QgZ2V0Q29uZmlnKCkgY29uc3Q7Ci0gICAgdmlydHVhbCBhdWRpb19wYXRjaF9oYW5kbGVfdCBnZXRQYXRjaEhhbmRsZSgpIGNvbnN0OwotCi0gICAgdm9pZCBzZXRQYXRjaEhhbmRsZShhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpOworICAgIC8vIGltcGxlbWVudGF0aW9uIG9mIEF1ZGlvSU9EZXNjcmlwdG9ySW50ZXJmYWNlCisgICAgYXVkaW9fY29uZmlnX2Jhc2VfdCBnZXRDb25maWcoKSBjb25zdCBvdmVycmlkZTsKKyAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBnZXRQYXRjaEhhbmRsZSgpIGNvbnN0IG92ZXJyaWRlOworICAgIHZvaWQgc2V0UGF0Y2hIYW5kbGUoYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKSBvdmVycmlkZTsKIAogICAgIHN0YXR1c190IG9wZW4oY29uc3QgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCkBAIC04MCwxOCArNzYsMjMgQEAKICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaW5wdXQpOwogICAgIC8vIENhbGxlZCB3aGVuIGEgc3RyZWFtIGlzIGFib3V0IHRvIGJlIHN0YXJ0ZWQuCi0gICAgLy8gTm90ZTogY2FsbGVkIGFmdGVyIEF1ZGlvU2Vzc2lvbjo6Y2hhbmdlQWN0aXZlQ291bnQoMSkKKyAgICAvLyBOb3RlOiBjYWxsZWQgYWZ0ZXIgc2V0Q2xpZW50QWN0aXZlKGNsaWVudCwgdHJ1ZSkKICAgICBzdGF0dXNfdCBzdGFydCgpOwogICAgIC8vIENhbGxlZCBhZnRlciBhIHN0cmVhbSBpcyBzdG9wcGVkCi0gICAgLy8gTm90ZTogY2FsbGVkIGFmdGVyIEF1ZGlvU2Vzc2lvbjo6Y2hhbmdlQWN0aXZlQ291bnQoLTEpCisgICAgLy8gTm90ZTogY2FsbGVkIGFmdGVyIHNldENsaWVudEFjdGl2ZShjbGllbnQsIGZhbHNlKQogICAgIHZvaWQgc3RvcCgpOwogICAgIHZvaWQgY2xvc2UoKTsKIAotcHJpdmF0ZToKLSAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAgICAgICAgICBtUGF0Y2hIYW5kbGU7Ci0gICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAgICAgICAgICAgbUlkOwotICAgIC8vIGF1ZGlvIHNlc3Npb25zIGF0dGFjaGVkIHRvIHRoaXMgaW5wdXQKLSAgICBBdWRpb1Nlc3Npb25Db2xsZWN0aW9uICAgICAgICBtU2Vzc2lvbnM7CisgICAgUmVjb3JkQ2xpZW50VmVjdG9yIGdldENsaWVudHNGb3JTZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKKyAgICBSZWNvcmRDbGllbnRWZWN0b3IgY2xpZW50c0xpc3QoYm9vbCBhY3RpdmVPbmx5ID0gZmFsc2UsCisgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSA9IEFVRElPX1NPVVJDRV9ERUZBVUxULCBib29sIHByZWZlcnJlZERldmljZU9ubHkgPSBmYWxzZSkgY29uc3Q7CisKKyBwcml2YXRlOgorCisgICAgdm9pZCB1cGRhdGVDbGllbnRSZWNvcmRpbmdDb25maWd1cmF0aW9uKGludCBldmVudCwgY29uc3Qgc3A8UmVjb3JkQ2xpZW50RGVzY3JpcHRvcj4mIGNsaWVudCk7CisKKyAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBtUGF0Y2hIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKKyAgICBhdWRpb19wb3J0X2hhbmRsZV90ICBtSWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FOwogICAgIC8vIEJlY2F1c2UgYSBwcmVlbXB0aWJsZSBjYXB0dXJlIHNlc3Npb24gY2FuIHByZWVtcHQgYW5vdGhlciBvbmUsIHdlIGVuZCB1cCBpbiBhbiBlbmRsZXNzIGxvb3AKICAgICAvLyBzaXR1YXRpb24gd2VyZSBlYWNoIHNlc3Npb24gaXMgYWxsb3dlZCB0byByZXN0YXJ0IGFmdGVyIGJlaW5nIHByZWVtcHRlZCwKICAgICAvLyB0aHVzIHByZWVtcHRpbmcgdGhlIG90aGVyIG9uZSB3aGljaCByZXN0YXJ0cyBhbmQgc28gb24uCkBAIC05OSw3ICsxMDAsOCBAQAogICAgIC8vIGEgcGFydGljdWxhciBpbnB1dCBzdGFydGVkIGFuZCBwcmV2ZW50IHByZWVtcHRpb24gb2YgdGhpcyBhY3RpdmUgaW5wdXQgYnkgdGhpcyBzZXNzaW9uLgogICAgIC8vIFdlIGFsc28gaW5oZXJpdCBzZXNzaW9ucyBmcm9tIHRoZSBwcmVlbXB0ZWQgaW5wdXQgdG8gYXZvaWQgYSAzIHdheSBwcmVlbXB0aW9uIGxvb3AgZXRjLi4uCiAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX3Nlc3Npb25fdD4gbVByZWVtcHRlZFNlc3Npb25zOwotICAgIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlICptQ2xpZW50SW50ZXJmYWNlOworICAgIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlICogY29uc3QgbUNsaWVudEludGVyZmFjZTsKKyAgICBpbnQzMl90IG1HbG9iYWxBY3RpdmVDb3VudCA9IDA7ICAvLyBub24tY2xpZW50LXNwZWNpZmljIGFjdGl2aXR5IHJlZiBjb3VudAogfTsKIAogY2xhc3MgQXVkaW9JbnB1dENvbGxlY3Rpb24gOgpAQCAtMTIzLDcgKzEyNSw5IEBACiAKICAgICBhdWRpb19kZXZpY2VzX3QgZ2V0U3VwcG9ydGVkRGV2aWNlcyhhdWRpb19pb19oYW5kbGVfdCBoYW5kbGUpIGNvbnN0OwogCi0gICAgc3RhdHVzX3QgZHVtcChpbnQgZmQpIGNvbnN0OworICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBnZXRJbnB1dEZvckNsaWVudChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCk7CisKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdDsKIH07CiAKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvT3V0cHV0RGVzY3JpcHRvci5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvT3V0cHV0RGVzY3JpcHRvci5oCmluZGV4IDVlNWQzOGIuLmVkOTk1ZTAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb091dHB1dERlc2NyaXB0b3IuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9PdXRwdXREZXNjcmlwdG9yLmgKQEAgLTE4LDEzICsxOCwxNCBAQAogCiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAKLSNpbmNsdWRlICJBdWRpb1BvcnQuaCIKLSNpbmNsdWRlIDxSb3V0aW5nU3RyYXRlZ3kuaD4KICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KICNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KICNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgotI2luY2x1ZGUgIkF1ZGlvU291cmNlRGVzY3JpcHRvci5oIgorI2luY2x1ZGUgPFJvdXRpbmdTdHJhdGVneS5oPgorI2luY2x1ZGUgIkF1ZGlvSU9EZXNjcmlwdG9ySW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiQXVkaW9Qb3J0LmgiCisjaW5jbHVkZSAiQ2xpZW50RGVzY3JpcHRvci5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTM1LDE0ICszNiwxNSBAQAogCiAvLyBkZXNjcmlwdG9yIGZvciBhdWRpbyBvdXRwdXRzLiBVc2VkIHRvIG1haW50YWluIGN1cnJlbnQgY29uZmlndXJhdGlvbiBvZiBlYWNoIG9wZW5lZCBhdWRpbyBvdXRwdXQKIC8vIGFuZCBrZWVwIHRyYWNrIG9mIHRoZSB1c2FnZSBvZiB0aGlzIG91dHB1dCBieSBlYWNoIGF1ZGlvIHN0cmVhbSB0eXBlLgotY2xhc3MgQXVkaW9PdXRwdXREZXNjcmlwdG9yOiBwdWJsaWMgQXVkaW9Qb3J0Q29uZmlnCitjbGFzcyBBdWRpb091dHB1dERlc2NyaXB0b3I6IHB1YmxpYyBBdWRpb1BvcnRDb25maWcsIHB1YmxpYyBBdWRpb0lPRGVzY3JpcHRvckludGVyZmFjZQorICAgICwgcHVibGljIENsaWVudE1hcEhhbmRsZXI8VHJhY2tDbGllbnREZXNjcmlwdG9yPgogewogcHVibGljOgogICAgIEF1ZGlvT3V0cHV0RGVzY3JpcHRvcihjb25zdCBzcDxBdWRpb1BvcnQ+JiBwb3J0LAogICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSAqY2xpZW50SW50ZXJmYWNlKTsKICAgICB2aXJ0dWFsIH5BdWRpb091dHB1dERlc2NyaXB0b3IoKSB7fQogCi0gICAgc3RhdHVzX3QgICAgZHVtcChpbnQgZmQpOworICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0IG92ZXJyaWRlOwogICAgIHZvaWQgICAgICAgIGxvZyhjb25zdCBjaGFyKiBpbmRlbnQpOwogCiAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBnZXRJZCgpIGNvbnN0OwpAQCAtNTksNyArNjEsMjIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkZWxheU1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JjZSk7Ci0gICAgdmlydHVhbCB2b2lkIGNoYW5nZVJlZkNvdW50KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBpbnQgZGVsdGEpOworCisgICAgLyoqCisgICAgICogQ2hhbmdlcyB0aGUgc3RyZWFtIGFjdGl2ZSBjb3VudCBhbmQgbUFjdGl2ZUNsaWVudHMgb25seS4KKyAgICAgKiBUaGlzIGRvZXMgbm90IGNoYW5nZSB0aGUgY2xpZW50LT5hY3RpdmUoKSBzdGF0ZSBvciB0aGUgb3V0cHV0IGRlc2NyaXB0b3IncworICAgICAqIGdsb2JhbCBhY3RpdmUgY291bnQuCisgICAgICovCisgICAgdmlydHVhbCB2b2lkIGNoYW5nZVN0cmVhbUFjdGl2ZUNvdW50KGNvbnN0IHNwPFRyYWNrQ2xpZW50RGVzY3JpcHRvcj4mIGNsaWVudCwgaW50IGRlbHRhKTsKKyAgICAgICAgICAgIHVpbnQzMl90IHN0cmVhbUFjdGl2ZUNvdW50KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSBjb25zdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIG1BY3RpdmVDb3VudFtzdHJlYW1dOyB9CisKKyAgICAvKioKKyAgICAgKiBDaGFuZ2VzIHRoZSBjbGllbnQtPmFjdGl2ZSgpIHN0YXRlIGFuZCB0aGUgb3V0cHV0IGRlc2NyaXB0b3IncyBnbG9iYWwgYWN0aXZlIGNvdW50LAorICAgICAqIGFsb25nIHdpdGggdGhlIHN0cmVhbSBhY3RpdmUgY291bnQgYW5kIG1BY3RpdmVDbGllbnRzLgorICAgICAqIFRoZSBjbGllbnQgbXVzdCBiZSBwcmV2aW91c2x5IGFkZGVkIGJ5IHRoZSBiYXNlIGNsYXNzIGFkZENsaWVudCgpLgorICAgICAqLworICAgICAgICAgICAgdm9pZCBzZXRDbGllbnRBY3RpdmUoY29uc3Qgc3A8VHJhY2tDbGllbnREZXNjcmlwdG9yPiYgY2xpZW50LCBib29sIGFjdGl2ZSk7CiAKICAgICBib29sIGlzQWN0aXZlKHVpbnQzMl90IGluUGFzdE1zID0gMCkgY29uc3Q7CiAgICAgYm9vbCBpc1N0cmVhbUFjdGl2ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKQEAgLTczLDIyICs5MCw1NiBAQAogCiAgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IGdldE1vZHVsZUhhbmRsZSgpIGNvbnN0OwogCi0gICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgZ2V0UGF0Y2hIYW5kbGUoKSBjb25zdCB7IHJldHVybiBtUGF0Y2hIYW5kbGU7IH07Ci0gICAgdm9pZCBzZXRQYXRjaEhhbmRsZShhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpIHsgbVBhdGNoSGFuZGxlID0gaGFuZGxlOyB9OworICAgIC8vIGltcGxlbWVudGF0aW9uIG9mIEF1ZGlvSU9EZXNjcmlwdG9ySW50ZXJmYWNlCisgICAgYXVkaW9fY29uZmlnX2Jhc2VfdCBnZXRDb25maWcoKSBjb25zdCBvdmVycmlkZTsKKyAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBnZXRQYXRjaEhhbmRsZSgpIGNvbnN0IG92ZXJyaWRlOworICAgIHZvaWQgc2V0UGF0Y2hIYW5kbGUoYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKSBvdmVycmlkZTsKIAotICAgIHNwPEF1ZGlvUG9ydD4gICAgICAgbVBvcnQ7Ci0gICAgYXVkaW9fZGV2aWNlc190IG1EZXZpY2U7ICAgICAgICAgICAgICAgICAgIC8vIGN1cnJlbnQgZGV2aWNlIHRoaXMgb3V0cHV0IGlzIHJvdXRlZCB0bwotICAgIHVpbnQzMl90IG1SZWZDb3VudFtBVURJT19TVFJFQU1fQ05UXTsgLy8gbnVtYmVyIG9mIHN0cmVhbXMgb2YgZWFjaCB0eXBlIHVzaW5nIHRoaXMgb3V0cHV0CisgICAgVHJhY2tDbGllbnRWZWN0b3IgY2xpZW50c0xpc3QoYm9vbCBhY3RpdmVPbmx5ID0gZmFsc2UsCisgICAgICAgIHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3kgPSBTVFJBVEVHWV9OT05FLCBib29sIHByZWZlcnJlZERldmljZU9ubHkgPSBmYWxzZSkgY29uc3Q7CisKKyAgICAvLyBvdmVycmlkZSBDbGllbnRNYXBIYW5kbGVyIHRvIGFib3J0IHdoZW4gcmVtb3ZpbmcgYSBjbGllbnQgd2hlbiBhY3RpdmUuCisgICAgdm9pZCByZW1vdmVDbGllbnQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpIG92ZXJyaWRlIHsKKyAgICAgICAgYXV0byBjbGllbnQgPSBnZXRDbGllbnQocG9ydElkKTsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihjbGllbnQuZ2V0KCkgPT0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAiJXMoJWQpOiBub25leGlzdGVudCBjbGllbnQgcG9ydElkICVkIiwgX19mdW5jX18sIG1JZCwgcG9ydElkKTsKKyAgICAgICAgLy8gaXQgaXMgcG9zc2libGUgdGhhdCB3aGVuIGEgY2xpZW50IGlzIHJlbW92ZWQsIHdlIGNvdWxkIHJlbW92ZSBpdHMKKyAgICAgICAgLy8gYXNzb2NpYXRlZCBhY3RpdmUgY291bnQgYnkgY2FsbGluZyBjaGFuZ2VTdHJlYW1BY3RpdmVDb3VudCgpLAorICAgICAgICAvLyBidXQgdGhhdCB3b3VsZCBiZSBoaWRpbmcgYSBwcm9ibGVtLCBzbyB3ZSBsb2cgZmF0YWwgaW5zdGVhZC4KKyAgICAgICAgYXV0byBpdDIgPSBtQWN0aXZlQ2xpZW50cy5maW5kKGNsaWVudCk7CisgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoaXQyICE9IG1BY3RpdmVDbGllbnRzLmVuZCgpLAorICAgICAgICAgICAgICAgICIlcyglZCkgcmVtb3ZpbmcgY2xpZW50IHBvcnRJZCAlZCB3aGljaCBpcyBhY3RpdmUgKGNvdW50ICV6dSkiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtSWQsIHBvcnRJZCwgaXQyLT5zZWNvbmQpOworICAgICAgICBDbGllbnRNYXBIYW5kbGVyPFRyYWNrQ2xpZW50RGVzY3JpcHRvcj46OnJlbW92ZUNsaWVudChwb3J0SWQpOworICAgIH0KKworICAgIHVzaW5nIEFjdGl2ZUNsaWVudE1hcCA9IHN0ZDo6bWFwPHNwPFRyYWNrQ2xpZW50RGVzY3JpcHRvcj4sIHNpemVfdCAvKiBjb3VudCAqLz47CisgICAgLy8gcmVxdWlyZWQgZm9yIGR1cGxpY2F0aW5nIHRocmVhZAorICAgIGNvbnN0IEFjdGl2ZUNsaWVudE1hcCYgZ2V0QWN0aXZlQ2xpZW50cygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1BY3RpdmVDbGllbnRzOworICAgIH0KKworICAgIGF1ZGlvX2RldmljZXNfdCBtRGV2aWNlID0gQVVESU9fREVWSUNFX05PTkU7IC8vIGN1cnJlbnQgZGV2aWNlIHRoaXMgb3V0cHV0IGlzIHJvdXRlZCB0bwogICAgIG5zZWNzX3QgbVN0b3BUaW1lW0FVRElPX1NUUkVBTV9DTlRdOwotICAgIGZsb2F0IG1DdXJWb2x1bWVbQVVESU9fU1RSRUFNX0NOVF07ICAgLy8gY3VycmVudCBzdHJlYW0gdm9sdW1lIGluIGRCCi0gICAgaW50IG1NdXRlQ291bnRbQVVESU9fU1RSRUFNX0NOVF07ICAgICAvLyBtdXRlIHJlcXVlc3QgY291bnRlcgorICAgIGludCBtTXV0ZUNvdW50W0FVRElPX1NUUkVBTV9DTlRdOyAgICAgICAgICAgIC8vIG11dGUgcmVxdWVzdCBjb3VudGVyCiAgICAgYm9vbCBtU3RyYXRlZ3lNdXRlZEJ5RGV2aWNlW05VTV9TVFJBVEVHSUVTXTsgLy8gc3RyYXRlZ2llcyBtdXRlZCBiZWNhdXNlIG9mIGluY29tcGF0aWJsZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRldmljZSBzZWxlY3Rpb24uIFNlZSBjaGVja0RldmljZU11dGVTdHJhdGVnaWVzKCkKLSAgICBBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSAqbUNsaWVudEludGVyZmFjZTsKKyAgICBBdWRpb01peCAqbVBvbGljeU1peCA9IG51bGxwdHI7ICAgICAgICAgICAgICAvLyBub24gTlVMTCB3aGVuIHVzZWQgYnkgYSBkeW5hbWljIHBvbGljeQogCiBwcm90ZWN0ZWQ6Ci0gICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgbVBhdGNoSGFuZGxlOwotICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgbUlkOworICAgIGNvbnN0IHNwPEF1ZGlvUG9ydD4gbVBvcnQ7CisgICAgQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgKiBjb25zdCBtQ2xpZW50SW50ZXJmYWNlOworICAgIGZsb2F0IG1DdXJWb2x1bWVbQVVESU9fU1RSRUFNX0NOVF07ICAgLy8gY3VycmVudCBzdHJlYW0gdm9sdW1lIGluIGRCCisgICAgdWludDMyX3QgbUFjdGl2ZUNvdW50W0FVRElPX1NUUkVBTV9DTlRdOyAvLyBudW1iZXIgb2Ygc3RyZWFtcyBvZiBlYWNoIHR5cGUgYWN0aXZlIG9uIHRoaXMgb3V0cHV0CisgICAgdWludDMyX3QgbUdsb2JhbEFjdGl2ZUNvdW50ID0gMDsgIC8vIG5vbi1jbGllbnQtc3BlY2lmaWMgYWN0aXZlIGNvdW50CisgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgbVBhdGNoSGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7CisgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBtSWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FOworCisgICAgLy8gVGhlIEFjdGl2ZUNsaWVudE1hcCBzaG93cyB0aGUgY2xpZW50cyB0aGF0IGNvbnRyaWJ1dGUgdG8gdGhlIHN0cmVhbXMgY291bnRzCisgICAgLy8gYW5kIG1heSBpbmNsdWRlIHVwc3RyZWFtIGNsaWVudHMgZnJvbSBhIGR1cGxpY2F0aW5nIHRocmVhZC4KKyAgICAvLyBDb21wYXJlIHdpdGggdGhlIENsaWVudE1hcCAobUNsaWVudHMpIHdoaWNoIGFyZSBleHRlcm5hbCBBdWRpb1RyYWNrIGNsaWVudHMgb2YgdGhlCisgICAgLy8gb3V0cHV0IGRlc2NyaXB0b3IgKGFuZCBkbyBub3QgY291bnQgaW50ZXJuYWwgUGF0Y2hUcmFja3MpLgorICAgIEFjdGl2ZUNsaWVudE1hcCBtQWN0aXZlQ2xpZW50czsKIH07CiAKIC8vIEF1ZGlvIG91dHB1dCBkcml2ZW4gYnkgYSBzb2Z0d2FyZSBtaXhlciBpbiBhdWRpbyBmbGluZ2VyLgpAQCAtOTksOCArMTUwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSAqY2xpZW50SW50ZXJmYWNlKTsKICAgICB2aXJ0dWFsIH5Td0F1ZGlvT3V0cHV0RGVzY3JpcHRvcigpIHt9CiAKLSAgICBzdGF0dXNfdCAgICBkdW1wKGludCBmZCk7Ci0KKyAgICAgICAgICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0IG92ZXJyaWRlOwogICAgIHZpcnR1YWwgYXVkaW9fZGV2aWNlc190IGRldmljZSgpIGNvbnN0OwogICAgIHZpcnR1YWwgYm9vbCBzaGFyZXNId01vZHVsZVdpdGgoY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYyk7CiAgICAgdmlydHVhbCBhdWRpb19kZXZpY2VzX3Qgc3VwcG9ydGVkRGV2aWNlcygpOwpAQCAtMTA5LDcgKzE1OSw4IEBACiAgICAgdmlydHVhbCBib29sIGlzRml4ZWRWb2x1bWUoYXVkaW9fZGV2aWNlc190IGRldmljZSk7CiAgICAgdmlydHVhbCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IHN1Yk91dHB1dDEoKSB7IHJldHVybiBtT3V0cHV0MTsgfQogICAgIHZpcnR1YWwgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBzdWJPdXRwdXQyKCkgeyByZXR1cm4gbU91dHB1dDI7IH0KLSAgICB2aXJ0dWFsIHZvaWQgY2hhbmdlUmVmQ291bnQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGludCBkZWx0YSk7CisgICAgICAgICAgICB2b2lkIGNoYW5nZVN0cmVhbUFjdGl2ZUNvdW50KAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxUcmFja0NsaWVudERlc2NyaXB0b3I+JiBjbGllbnQsIGludCBkZWx0YSkgb3ZlcnJpZGU7CiAgICAgdmlydHVhbCBib29sIHNldFZvbHVtZShmbG9hdCB2b2x1bWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCkBAIC0xMjcsMTAgKzE3OCwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKm91dHB1dCk7CiAgICAgICAgICAgICAvLyBDYWxsZWQgd2hlbiBhIHN0cmVhbSBpcyBhYm91dCB0byBiZSBzdGFydGVkCi0gICAgICAgICAgICAvLyBOb3RlOiBjYWxsZWQgYmVmb3JlIGNoYW5nZVJlZkNvdW50KDEpOworICAgICAgICAgICAgLy8gTm90ZTogY2FsbGVkIGJlZm9yZSBzZXRDbGllbnRBY3RpdmUodHJ1ZSk7CiAgICAgICAgICAgICBzdGF0dXNfdCBzdGFydCgpOwogICAgICAgICAgICAgLy8gQ2FsbGVkIGFmdGVyIGEgc3RyZWFtIGlzIHN0b3BwZWQuCi0gICAgICAgICAgICAvLyBOb3RlOiBjYWxsZWQgYWZ0ZXIgY2hhbmdlUmVmQ291bnQoLTEpOworICAgICAgICAgICAgLy8gTm90ZTogY2FsbGVkIGFmdGVyIHNldENsaWVudEFjdGl2ZShmYWxzZSk7CiAgICAgICAgICAgICB2b2lkIHN0b3AoKTsKICAgICAgICAgICAgIHZvaWQgY2xvc2UoKTsKICAgICAgICAgICAgIHN0YXR1c190IG9wZW5EdXBsaWNhdGluZyhjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dDEsCkBAIC0xNDEsMjMgKzE5MiwyMSBAQAogICAgIGF1ZGlvX2lvX2hhbmRsZV90IG1Jb0hhbmRsZTsgICAgICAgICAgIC8vIG91dHB1dCBoYW5kbGUKICAgICB1aW50MzJfdCBtTGF0ZW5jeTsgICAgICAgICAgICAgICAgICAvLwogICAgIGF1ZGlvX291dHB1dF9mbGFnc190IG1GbGFnczsgICAvLwotICAgIEF1ZGlvTWl4ICptUG9saWN5TWl4OyAgICAgICAgICAgICAvLyBub24gTlVMTCB3aGVuIHVzZWQgYnkgYSBkeW5hbWljIHBvbGljeQogICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBtT3V0cHV0MTsgICAgLy8gdXNlZCBieSBkdXBsaWNhdGVkIG91dHB1dHM6IGZpcnN0IG91dHB1dAogICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBtT3V0cHV0MjsgICAgLy8gdXNlZCBieSBkdXBsaWNhdGVkIG91dHB1dHM6IHNlY29uZCBvdXRwdXQKICAgICB1aW50MzJfdCBtRGlyZWN0T3BlbkNvdW50OyAvLyBudW1iZXIgb2YgY2xpZW50cyB1c2luZyB0aGlzIG91dHB1dCAoZGlyZWN0IG91dHB1dHMgb25seSkKICAgICBhdWRpb19zZXNzaW9uX3QgbURpcmVjdENsaWVudFNlc3Npb247IC8vIHNlc3Npb24gaWQgb2YgdGhlIGRpcmVjdCBvdXRwdXQgY2xpZW50Ci0gICAgdWludDMyX3QgbUdsb2JhbFJlZkNvdW50OyAgLy8gbm9uLXN0cmVhbS1zcGVjaWZpYyByZWYgY291bnQKIH07CiAKIC8vIEF1ZGlvIG91dHB1dCBkcml2ZW4gYnkgYW4gaW5wdXQgZGV2aWNlIGRpcmVjdGx5LgogY2xhc3MgSHdBdWRpb091dHB1dERlc2NyaXB0b3I6IHB1YmxpYyBBdWRpb091dHB1dERlc2NyaXB0b3IKIHsKIHB1YmxpYzoKLSAgICBId0F1ZGlvT3V0cHV0RGVzY3JpcHRvcihjb25zdCBzcDxBdWRpb1NvdXJjZURlc2NyaXB0b3I+JiBzb3VyY2UsCisgICAgSHdBdWRpb091dHB1dERlc2NyaXB0b3IoY29uc3Qgc3A8U291cmNlQ2xpZW50RGVzY3JpcHRvcj4mIHNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSAqY2xpZW50SW50ZXJmYWNlKTsKICAgICB2aXJ0dWFsIH5Id0F1ZGlvT3V0cHV0RGVzY3JpcHRvcigpIHt9CiAKLSAgICBzdGF0dXNfdCAgICBkdW1wKGludCBmZCk7CisgICAgICAgICAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdCBvdmVycmlkZTsKIAogICAgIHZpcnR1YWwgYXVkaW9fZGV2aWNlc190IHN1cHBvcnRlZERldmljZXMoKTsKICAgICB2aXJ0dWFsIGJvb2wgc2V0Vm9sdW1lKGZsb2F0IHZvbHVtZSwKQEAgLTE3MCw3ICsyMTksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzcmNDb25maWcgPSBOVUxMKSBjb25zdDsKICAgICB2aXJ0dWFsIHZvaWQgdG9BdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpIGNvbnN0OwogCi0gICAgY29uc3Qgc3A8QXVkaW9Tb3VyY2VEZXNjcmlwdG9yPiBtU291cmNlOworICAgIGNvbnN0IHNwPFNvdXJjZUNsaWVudERlc2NyaXB0b3I+IG1Tb3VyY2U7CiAKIH07CiAKQEAgLTIyNCw3ICsyNzMsOSBAQAogCiAgICAgYXVkaW9fZGV2aWNlc190IGdldFN1cHBvcnRlZERldmljZXMoYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlKSBjb25zdDsKIAotICAgIHN0YXR1c190IGR1bXAoaW50IGZkKSBjb25zdDsKKyAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZ2V0T3V0cHV0Rm9yQ2xpZW50KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKKworICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0OwogfTsKIAogY2xhc3MgSHdBdWRpb091dHB1dENvbGxlY3Rpb24gOgpAQCAtMjM4LDcgKzI4OSw3IEBACiAgICAgICovCiAgICAgYm9vbCBpc0FueU91dHB1dEFjdGl2ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVRvSWdub3JlKSBjb25zdDsKIAotICAgIHN0YXR1c190IGR1bXAoaW50IGZkKSBjb25zdDsKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdDsKIH07CiAKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUGF0Y2guaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1BhdGNoLmgKaW5kZXggYzFjM2YzYy4uMDg0M2ZlYSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUGF0Y2guaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9QYXRjaC5oCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgogI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTMwLDcgKzMxLDcgQEAKIHB1YmxpYzoKICAgICBBdWRpb1BhdGNoKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsIHVpZF90IHVpZCk7CiAKLSAgICBzdGF0dXNfdCBkdW1wKGludCBmZCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdDsKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgpIGNvbnN0OwogCiAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgbUhhbmRsZTsKICAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggbVBhdGNoOwpAQCAtNDcsNyArNDgsNyBAQAogCiAgICAgc3RhdHVzX3QgbGlzdEF1ZGlvUGF0Y2hlcyh1bnNpZ25lZCBpbnQgKm51bV9wYXRjaGVzLCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoZXMpIGNvbnN0OwogCi0gICAgc3RhdHVzX3QgZHVtcChpbnQgZmQpIGNvbnN0OworICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0OwogfTsKIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUG9saWN5Q29uZmlnLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Qb2xpY3lDb25maWcuaAppbmRleCA0M2Y2ZWQ2Li5kMWEwZjliIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Qb2xpY3lDb25maWcuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Qb2xpY3lDb25maWcuaApAQCAtMTYsNiArMTYsOSBAQAogCiAjcHJhZ21hIG9uY2UKIAorI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CisjaW5jbHVkZSA8dW5vcmRlcmVkX3NldD4KKwogI2luY2x1ZGUgPEF1ZGlvR2Fpbi5oPgogI2luY2x1ZGUgPFZvbHVtZUN1cnZlLmg+CiAjaW5jbHVkZSA8QXVkaW9Qb3J0Lmg+CkBAIC0yOCw3ICszMSw2IEBACiAjaW5jbHVkZSA8QXVkaW9Qb2xpY3lNaXguaD4KICNpbmNsdWRlIDxFZmZlY3REZXNjcmlwdG9yLmg+CiAjaW5jbHVkZSA8U291bmRUcmlnZ2VyU2Vzc2lvbi5oPgotI2luY2x1ZGUgPFNlc3Npb25Sb3V0ZS5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTM4LDE2ICs0MCwyNCBAQAogICAgIEF1ZGlvUG9saWN5Q29uZmlnKEh3TW9kdWxlQ29sbGVjdGlvbiAmaHdNb2R1bGVzLAogICAgICAgICAgICAgICAgICAgICAgIERldmljZVZlY3RvciAmYXZhaWxhYmxlT3V0cHV0RGV2aWNlcywKICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2VWZWN0b3IgJmF2YWlsYWJsZUlucHV0RGV2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZGVmYXVsdE91dHB1dERldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJmRlZmF1bHRPdXRwdXREZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgVm9sdW1lQ3VydmVzQ29sbGVjdGlvbiAqdm9sdW1lcyA9IG51bGxwdHIpCiAgICAgICAgIDogbUh3TW9kdWxlcyhod01vZHVsZXMpLAogICAgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzKGF2YWlsYWJsZU91dHB1dERldmljZXMpLAogICAgICAgICAgIG1BdmFpbGFibGVJbnB1dERldmljZXMoYXZhaWxhYmxlSW5wdXREZXZpY2VzKSwKLSAgICAgICAgICBtRGVmYXVsdE91dHB1dERldmljZXMoZGVmYXVsdE91dHB1dERldmljZXMpLAorICAgICAgICAgIG1EZWZhdWx0T3V0cHV0RGV2aWNlKGRlZmF1bHRPdXRwdXREZXZpY2UpLAogICAgICAgICAgIG1Wb2x1bWVDdXJ2ZXModm9sdW1lcyksCiAgICAgICAgICAgbUlzU3BlYWtlckRyY0VuYWJsZWQoZmFsc2UpCiAgICAge30KIAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBnZXRTb3VyY2UoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtU291cmNlOworICAgIH0KKworICAgIHZvaWQgc2V0U291cmNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlKSB7CisgICAgICAgIG1Tb3VyY2UgPSBmaWxlOworICAgIH0KKwogICAgIHZvaWQgc2V0Vm9sdW1lcyhjb25zdCBWb2x1bWVDdXJ2ZXNDb2xsZWN0aW9uICZ2b2x1bWVzKQogICAgIHsKICAgICAgICAgaWYgKG1Wb2x1bWVDdXJ2ZXMgIT0gbnVsbHB0cikgewpAQCAtMTAwLDUxICsxMTAsODcgQEAKIAogICAgIHZvaWQgc2V0RGVmYXVsdE91dHB1dERldmljZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZGVmYXVsdERldmljZSkKICAgICB7Ci0gICAgICAgIG1EZWZhdWx0T3V0cHV0RGV2aWNlcyA9IGRlZmF1bHREZXZpY2U7CisgICAgICAgIG1EZWZhdWx0T3V0cHV0RGV2aWNlID0gZGVmYXVsdERldmljZTsKICAgICB9CiAKLSAgICBjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZ2V0RGVmYXVsdE91dHB1dERldmljZSgpIGNvbnN0IHsgcmV0dXJuIG1EZWZhdWx0T3V0cHV0RGV2aWNlczsgfQorICAgIGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZnZXREZWZhdWx0T3V0cHV0RGV2aWNlKCkgY29uc3QgeyByZXR1cm4gbURlZmF1bHRPdXRwdXREZXZpY2U7IH0KIAogICAgIHZvaWQgc2V0RGVmYXVsdCh2b2lkKQogICAgIHsKLSAgICAgICAgbURlZmF1bHRPdXRwdXREZXZpY2VzID0gbmV3IERldmljZURlc2NyaXB0b3IoQVVESU9fREVWSUNFX09VVF9TUEVBS0VSKTsKLSAgICAgICAgc3A8SHdNb2R1bGU+IG1vZHVsZTsKKyAgICAgICAgbVNvdXJjZSA9ICJBdWRpb1BvbGljeUNvbmZpZzo6c2V0RGVmYXVsdCI7CisgICAgICAgIG1EZWZhdWx0T3V0cHV0RGV2aWNlID0gbmV3IERldmljZURlc2NyaXB0b3IoQVVESU9fREVWSUNFX09VVF9TUEVBS0VSKTsKKyAgICAgICAgbURlZmF1bHRPdXRwdXREZXZpY2UtPmFkZEF1ZGlvUHJvZmlsZShBdWRpb1Byb2ZpbGU6OmNyZWF0ZUZ1bGxEeW5hbWljKCkpOwogICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZWZhdWx0SW5wdXREZXZpY2UgPSBuZXcgRGV2aWNlRGVzY3JpcHRvcihBVURJT19ERVZJQ0VfSU5fQlVJTFRJTl9NSUMpOwotICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5hZGQobURlZmF1bHRPdXRwdXREZXZpY2VzKTsKKyAgICAgICAgZGVmYXVsdElucHV0RGV2aWNlLT5hZGRBdWRpb1Byb2ZpbGUoQXVkaW9Qcm9maWxlOjpjcmVhdGVGdWxsRHluYW1pYygpKTsKKyAgICAgICAgc3A8QXVkaW9Qcm9maWxlPiBtaWNQcm9maWxlID0gbmV3IEF1ZGlvUHJvZmlsZSgKKyAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfUENNXzE2X0JJVCwgQVVESU9fQ0hBTk5FTF9JTl9NT05PLCA4MDAwKTsKKyAgICAgICAgZGVmYXVsdElucHV0RGV2aWNlLT5hZGRBdWRpb1Byb2ZpbGUobWljUHJvZmlsZSk7CisgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmFkZChtRGVmYXVsdE91dHB1dERldmljZSk7CiAgICAgICAgIG1BdmFpbGFibGVJbnB1dERldmljZXMuYWRkKGRlZmF1bHRJbnB1dERldmljZSk7CiAKLSAgICAgICAgbW9kdWxlID0gbmV3IEh3TW9kdWxlKEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9QUklNQVJZKTsKKyAgICAgICAgc3A8SHdNb2R1bGU+IG1vZHVsZSA9IG5ldyBId01vZHVsZShBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfUFJJTUFSWSwgMiAvKmhhbFZlcnNpb25NYWpvciovKTsKKyAgICAgICAgbUh3TW9kdWxlcy5hZGQobW9kdWxlKTsKKyAgICAgICAgbURlZmF1bHRPdXRwdXREZXZpY2UtPmF0dGFjaChtb2R1bGUpOworICAgICAgICBkZWZhdWx0SW5wdXREZXZpY2UtPmF0dGFjaChtb2R1bGUpOwogCiAgICAgICAgIHNwPE91dHB1dFByb2ZpbGU+IG91dFByb2ZpbGU7CiAgICAgICAgIG91dFByb2ZpbGUgPSBuZXcgT3V0cHV0UHJvZmlsZShTdHJpbmc4KCJwcmltYXJ5IikpOwogICAgICAgICBvdXRQcm9maWxlLT5hdHRhY2gobW9kdWxlKTsKICAgICAgICAgb3V0UHJvZmlsZS0+YWRkQXVkaW9Qcm9maWxlKAogICAgICAgICAgICAgICAgIG5ldyBBdWRpb1Byb2ZpbGUoQVVESU9fRk9STUFUX1BDTV8xNl9CSVQsIEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTywgNDQxMDApKTsKLSAgICAgICAgb3V0UHJvZmlsZS0+YWRkU3VwcG9ydGVkRGV2aWNlKG1EZWZhdWx0T3V0cHV0RGV2aWNlcyk7CisgICAgICAgIG91dFByb2ZpbGUtPmFkZFN1cHBvcnRlZERldmljZShtRGVmYXVsdE91dHB1dERldmljZSk7CiAgICAgICAgIG91dFByb2ZpbGUtPnNldEZsYWdzKEFVRElPX09VVFBVVF9GTEFHX1BSSU1BUlkpOwogICAgICAgICBtb2R1bGUtPmFkZE91dHB1dFByb2ZpbGUob3V0UHJvZmlsZSk7CiAKICAgICAgICAgc3A8SW5wdXRQcm9maWxlPiBpblByb2ZpbGU7CiAgICAgICAgIGluUHJvZmlsZSA9IG5ldyBJbnB1dFByb2ZpbGUoU3RyaW5nOCgicHJpbWFyeSIpKTsKICAgICAgICAgaW5Qcm9maWxlLT5hdHRhY2gobW9kdWxlKTsKLSAgICAgICAgaW5Qcm9maWxlLT5hZGRBdWRpb1Byb2ZpbGUoCi0gICAgICAgICAgICAgICAgbmV3IEF1ZGlvUHJvZmlsZShBVURJT19GT1JNQVRfUENNXzE2X0JJVCwgQVVESU9fQ0hBTk5FTF9JTl9NT05PLCA4MDAwKSk7CisgICAgICAgIGluUHJvZmlsZS0+YWRkQXVkaW9Qcm9maWxlKG1pY1Byb2ZpbGUpOwogICAgICAgICBpblByb2ZpbGUtPmFkZFN1cHBvcnRlZERldmljZShkZWZhdWx0SW5wdXREZXZpY2UpOwogICAgICAgICBtb2R1bGUtPmFkZElucHV0UHJvZmlsZShpblByb2ZpbGUpOwogCi0gICAgICAgIG1Id01vZHVsZXMuYWRkKG1vZHVsZSk7CisgICAgICAgIHNldERlZmF1bHRTdXJyb3VuZEZvcm1hdHMoKTsKKyAgICB9CisKKyAgICAvLyBTdXJyb3VuZCBmb3JtYXRzLCB3aXRoIGFuIG9wdGlvbmFsIGxpc3Qgb2Ygc3ViZm9ybWF0cyB0aGF0IGFyZSBlcXVpdmFsZW50IGZyb20gdXNlcnMnIFBPVi4KKyAgICB1c2luZyBTdXJyb3VuZEZvcm1hdHMgPSBzdGQ6OnVub3JkZXJlZF9tYXA8YXVkaW9fZm9ybWF0X3QsIHN0ZDo6dW5vcmRlcmVkX3NldDxhdWRpb19mb3JtYXRfdD4+OworCisgICAgY29uc3QgU3Vycm91bmRGb3JtYXRzICZnZXRTdXJyb3VuZEZvcm1hdHMoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIG1TdXJyb3VuZEZvcm1hdHM7CisgICAgfQorCisgICAgdm9pZCBzZXRTdXJyb3VuZEZvcm1hdHMoY29uc3QgU3Vycm91bmRGb3JtYXRzICZzdXJyb3VuZEZvcm1hdHMpCisgICAgeworICAgICAgICBtU3Vycm91bmRGb3JtYXRzID0gc3Vycm91bmRGb3JtYXRzOworICAgIH0KKworICAgIHZvaWQgc2V0RGVmYXVsdFN1cnJvdW5kRm9ybWF0cygpCisgICAgeworICAgICAgICBtU3Vycm91bmRGb3JtYXRzID0geworICAgICAgICAgICAge0FVRElPX0ZPUk1BVF9BQzMsIHt9fSwKKyAgICAgICAgICAgIHtBVURJT19GT1JNQVRfRV9BQzMsIHt9fSwKKyAgICAgICAgICAgIHtBVURJT19GT1JNQVRfRFRTLCB7fX0sCisgICAgICAgICAgICB7QVVESU9fRk9STUFUX0RUU19IRCwge319LAorICAgICAgICAgICAge0FVRElPX0ZPUk1BVF9BQUNfTEMsIHsKKyAgICAgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX0FBQ19IRV9WMSwgQVVESU9fRk9STUFUX0FBQ19IRV9WMiwgQVVESU9fRk9STUFUX0FBQ19FTEQsCisgICAgICAgICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9BQUNfWEhFfX0sCisgICAgICAgICAgICB7QVVESU9fRk9STUFUX0RPTEJZX1RSVUVIRCwge319LAorICAgICAgICAgICAge0FVRElPX0ZPUk1BVF9FX0FDM19KT0MsIHt9fX07CiAgICAgfQogCiBwcml2YXRlOgorICAgIHN0ZDo6c3RyaW5nIG1Tb3VyY2U7CiAgICAgSHdNb2R1bGVDb2xsZWN0aW9uICZtSHdNb2R1bGVzOyAvKio8IENvbGxlY3Rpb24gb2YgTW9kdWxlLCB3aXRoIFByb2ZpbGVzLCBpLmUuIE1peCBQb3J0cy4gKi8KICAgICBEZXZpY2VWZWN0b3IgJm1BdmFpbGFibGVPdXRwdXREZXZpY2VzOwogICAgIERldmljZVZlY3RvciAmbUF2YWlsYWJsZUlucHV0RGV2aWNlczsKLSAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmbURlZmF1bHRPdXRwdXREZXZpY2VzOworICAgIHNwPERldmljZURlc2NyaXB0b3I+ICZtRGVmYXVsdE91dHB1dERldmljZTsKICAgICBWb2x1bWVDdXJ2ZXNDb2xsZWN0aW9uICptVm9sdW1lQ3VydmVzOwogICAgIC8vIFRPRE86IHJlbW92ZSB3aGVuIGxlZ2FjeSBjb25mIGZpbGUgaXMgcmVtb3ZlZC4gdHJ1ZSBvbiBkZXZpY2VzIHRoYXQgdXNlIERSQyBvbiB0aGUKICAgICAvLyBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiBwYXRoIHRvIGJvb3N0IHNvZnQgc291bmRzLCB1c2VkIHRvIGFkanVzdCB2b2x1bWUgY3VydmVzIGFjY29yZGluZ2x5LgogICAgIC8vIE5vdGU6IHJlbW92ZSBhbHNvIHNwZWFrZXJfZHJjX2VuYWJsZWQgZnJvbSBnbG9iYWwgY29uZmlndXJhdGlvbiBvZiBYTUwgY29uZmlnIGZpbGUuCiAgICAgYm9vbCBtSXNTcGVha2VyRHJjRW5hYmxlZDsKKyAgICBTdXJyb3VuZEZvcm1hdHMgbVN1cnJvdW5kRm9ybWF0czsKIH07CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1BvbGljeU1peC5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUG9saWN5TWl4LmgKaW5kZXggOGZjNmZlOS4uOTZjMDBlYSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUG9saWN5TWl4LmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUG9saWN5TWl4LmgKQEAgLTQzLDcgKzQzLDcgQEAKIAogICAgIHZvaWQgc2V0TWl4KEF1ZGlvTWl4ICZtaXgpOwogCi0gICAgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGludCBzcGFjZXMsIGludCBpbmRleCkgY29uc3Q7CisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdDsKIAogcHJpdmF0ZToKICAgICBBdWRpb01peCAgICBtTWl4OyAgICAgICAgICAgICAgICAgICAvLyBBdWRpbyBwb2xpY3kgbWl4IGRlc2NyaXB0b3IKQEAgLTgwLDcgKzgwLDcgQEAKIAogICAgIHN0YXR1c190IGdldElucHV0TWl4Rm9yQXR0cihhdWRpb19hdHRyaWJ1dGVzX3QgYXR0ciwgQXVkaW9NaXggKipwb2xpY3lNaXgpOwogCi0gICAgc3RhdHVzX3QgZHVtcChpbnQgZmQpIGNvbnN0OworICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0OwogfTsKIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUG9ydC5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUG9ydC5oCmluZGV4IDA5YTg2ZGQuLmViYjkzNTIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1BvcnQuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Qb3J0LmgKQEAgLTEzMiw3ICsxMzIsOCBAQAogICAgIHZvaWQgYWRkUm91dGUoY29uc3Qgc3A8QXVkaW9Sb3V0ZT4gJnJvdXRlKSB7IG1Sb3V0ZXMuYWRkKHJvdXRlKTsgfQogICAgIGNvbnN0IEF1ZGlvUm91dGVWZWN0b3IgJmdldFJvdXRlcygpIGNvbnN0IHsgcmV0dXJuIG1Sb3V0ZXM7IH0KIAotICAgIHZvaWQgZHVtcChpbnQgZmQsIGludCBzcGFjZXMsIGJvb2wgdmVyYm9zZSA9IHRydWUpIGNvbnN0OworICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMsIGJvb2wgdmVyYm9zZSA9IHRydWUpIGNvbnN0OworCiAgICAgdm9pZCBsb2coY29uc3QgY2hhciogaW5kZW50KSBjb25zdDsKIAogICAgIEF1ZGlvR2FpbkNvbGxlY3Rpb24gbUdhaW5zOyAvLyBnYWluIGNvbnRyb2xsZXJzCkBAIC0xNTMsOSArMTU0LDYgQEAKIGNsYXNzIEF1ZGlvUG9ydENvbmZpZyA6IHB1YmxpYyB2aXJ0dWFsIFJlZkJhc2UKIHsKIHB1YmxpYzoKLSAgICBBdWRpb1BvcnRDb25maWcoKTsKLSAgICB2aXJ0dWFsIH5BdWRpb1BvcnRDb25maWcoKSB7fQotCiAgICAgc3RhdHVzX3QgYXBwbHlBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpiYWNrdXBDb25maWcgPSBOVUxMKTsKICAgICB2aXJ0dWFsIHZvaWQgdG9BdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpkc3RDb25maWcsCkBAIC0xNjUsMTAgKzE2MywxMSBAQAogICAgICAgICByZXR1cm4gKG90aGVyICE9IDApICYmCiAgICAgICAgICAgICAgICAgKG90aGVyLT5nZXRBdWRpb1BvcnQoKS0+Z2V0TW9kdWxlSGFuZGxlKCkgPT0gZ2V0QXVkaW9Qb3J0KCktPmdldE1vZHVsZUhhbmRsZSgpKTsKICAgICB9Ci0gICAgdWludDMyX3QgbVNhbXBsaW5nUmF0ZTsKLSAgICBhdWRpb19mb3JtYXRfdCBtRm9ybWF0OwotICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IG1DaGFubmVsTWFzazsKLSAgICBzdHJ1Y3QgYXVkaW9fZ2Fpbl9jb25maWcgbUdhaW47CisgICAgdW5zaWduZWQgaW50IG1TYW1wbGluZ1JhdGUgPSAwdTsKKyAgICBhdWRpb19mb3JtYXRfdCBtRm9ybWF0ID0gQVVESU9fRk9STUFUX0lOVkFMSUQ7CisgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgbUNoYW5uZWxNYXNrID0gQVVESU9fQ0hBTk5FTF9OT05FOworICAgIHN0cnVjdCBhdWRpb19nYWluX2NvbmZpZyBtR2FpbiA9IHsgLmluZGV4ID0gLTEgfTsKKyAgICB1bmlvbiBhdWRpb19pb19mbGFncyBtRmxhZ3MgPSB7IEFVRElPX0lOUFVUX0ZMQUdfTk9ORSB9OwogfTsKIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUHJvZmlsZS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUHJvZmlsZS5oCmluZGV4IDg3NDFjNjYuLmI1ODhkNTcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1Byb2ZpbGUuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Qcm9maWxlLmgKQEAgLTE2LDkxICsxNiw4NCBAQAogCiAjcHJhZ21hIG9uY2UKIAotI2luY2x1ZGUgInBvbGljeS5oIgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLSNpbmNsdWRlIDx1dGlscy9Tb3J0ZWRWZWN0b3IuaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dmVjdG9yPgorCiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+Ci0jaW5jbHVkZSA8Y3V0aWxzL2NvbmZpZ191dGlscy5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDx1dGlscy9Tb3J0ZWRWZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisKKyNpbmNsdWRlICJwb2xpY3kuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiB0eXBlZGVmIFNvcnRlZFZlY3Rvcjx1aW50MzJfdD4gU2FtcGxlUmF0ZVZlY3RvcjsKLXR5cGVkZWYgU29ydGVkVmVjdG9yPGF1ZGlvX2NoYW5uZWxfbWFza190PiBDaGFubmVsc1ZlY3RvcjsKIHR5cGVkZWYgVmVjdG9yPGF1ZGlvX2Zvcm1hdF90PiBGb3JtYXRWZWN0b3I7CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotYm9vbCBvcGVyYXRvciA9PSAoY29uc3QgU29ydGVkVmVjdG9yPFQ+ICZsZWZ0LCBjb25zdCBTb3J0ZWRWZWN0b3I8VD4gJnJpZ2h0KTsKK2Jvb2wgb3BlcmF0b3I9PSAoY29uc3QgU29ydGVkVmVjdG9yPFQ+ICZsZWZ0LCBjb25zdCBTb3J0ZWRWZWN0b3I8VD4gJnJpZ2h0KQoreworICAgIGlmIChsZWZ0LnNpemUoKSAhPSByaWdodC5zaXplKCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBmb3IgKHNpemVfdCBpbmRleCA9IDA7IGluZGV4IDwgcmlnaHQuc2l6ZSgpOyBpbmRleCsrKSB7CisgICAgICAgIGlmIChsZWZ0W2luZGV4XSAhPSByaWdodFtpbmRleF0pIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Citib29sIG9wZXJhdG9yIT0gKGNvbnN0IFNvcnRlZFZlY3RvcjxUPiAmbGVmdCwgY29uc3QgU29ydGVkVmVjdG9yPFQ+ICZyaWdodCkKK3sKKyAgICByZXR1cm4gIShsZWZ0ID09IHJpZ2h0KTsKK30KKworY2xhc3MgQ2hhbm5lbHNWZWN0b3IgOiBwdWJsaWMgU29ydGVkVmVjdG9yPGF1ZGlvX2NoYW5uZWxfbWFza190PgoreworcHVibGljOgorICAgIENoYW5uZWxzVmVjdG9yKCkgPSBkZWZhdWx0OworICAgIENoYW5uZWxzVmVjdG9yKGNvbnN0IENoYW5uZWxzVmVjdG9yJikgPSBkZWZhdWx0OworICAgIENoYW5uZWxzVmVjdG9yKGNvbnN0IFNvcnRlZFZlY3RvcjxhdWRpb19jaGFubmVsX21hc2tfdD4mIHN2KSA6CisgICAgICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+KHN2KSB7fQorICAgIENoYW5uZWxzVmVjdG9yJiBvcGVyYXRvcj0oY29uc3QgQ2hhbm5lbHNWZWN0b3ImKSA9IGRlZmF1bHQ7CisKKyAgICAvLyBBcHBsaWVzIGF1ZGlvX2NoYW5uZWxfbWFza19vdXRfdG9faW4gdG8gYWxsIGVsZW1lbnRzIGFuZCByZXR1cm5zIHRoZSByZXN1bHQuCisgICAgQ2hhbm5lbHNWZWN0b3IgYXNJbk1hc2soKSBjb25zdDsKKyAgICAvLyBBcHBsaWVzIGF1ZGlvX2NoYW5uZWxfbWFza19pbl90b19vdXQgdG8gYWxsIGVsZW1lbnRzIGFuZCByZXR1cm5zIHRoZSByZXN1bHQuCisgICAgQ2hhbm5lbHNWZWN0b3IgYXNPdXRNYXNrKCkgY29uc3Q7Cit9OwogCiBjbGFzcyBBdWRpb1Byb2ZpbGUgOiBwdWJsaWMgdmlydHVhbCBSZWZCYXNlCiB7CiBwdWJsaWM6Ci0gICAgQXVkaW9Qcm9maWxlKGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2tzLAotICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUpIDoKLSAgICAgICAgbU5hbWUoU3RyaW5nOCgiIikpLAotICAgICAgICBtRm9ybWF0KGZvcm1hdCkKLSAgICB7Ci0gICAgICAgIG1DaGFubmVsTWFza3MuYWRkKGNoYW5uZWxNYXNrcyk7Ci0gICAgICAgIG1TYW1wbGluZ1JhdGVzLmFkZChzYW1wbGluZ1JhdGUpOwotICAgIH0KKyAgICBzdGF0aWMgc3A8QXVkaW9Qcm9maWxlPiBjcmVhdGVGdWxsRHluYW1pYygpOwogCisgICAgQXVkaW9Qcm9maWxlKGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2tzLCB1aW50MzJfdCBzYW1wbGluZ1JhdGUpOwogICAgIEF1ZGlvUHJvZmlsZShhdWRpb19mb3JtYXRfdCBmb3JtYXQsCiAgICAgICAgICAgICAgICAgIGNvbnN0IENoYW5uZWxzVmVjdG9yICZjaGFubmVsTWFza3MsCi0gICAgICAgICAgICAgICAgIGNvbnN0IFNhbXBsZVJhdGVWZWN0b3IgJnNhbXBsaW5nUmF0ZUNvbGxlY3Rpb24pIDoKLSAgICAgICAgbU5hbWUoU3RyaW5nOCgiIikpLAotICAgICAgICBtRm9ybWF0KGZvcm1hdCksCi0gICAgICAgIG1DaGFubmVsTWFza3MoY2hhbm5lbE1hc2tzKSwKLSAgICAgICAgbVNhbXBsaW5nUmF0ZXMoc2FtcGxpbmdSYXRlQ29sbGVjdGlvbikKLSAgICB7fQorICAgICAgICAgICAgICAgICBjb25zdCBTYW1wbGVSYXRlVmVjdG9yICZzYW1wbGluZ1JhdGVDb2xsZWN0aW9uKTsKIAogICAgIGF1ZGlvX2Zvcm1hdF90IGdldEZvcm1hdCgpIGNvbnN0IHsgcmV0dXJuIG1Gb3JtYXQ7IH0KLQotICAgIHZvaWQgc2V0Q2hhbm5lbHMoY29uc3QgQ2hhbm5lbHNWZWN0b3IgJmNoYW5uZWxNYXNrcykKLSAgICB7Ci0gICAgICAgIGlmIChtSXNEeW5hbWljQ2hhbm5lbHMpIHsKLSAgICAgICAgICAgIG1DaGFubmVsTWFza3MgPSBjaGFubmVsTWFza3M7Ci0gICAgICAgIH0KLSAgICB9CiAgICAgY29uc3QgQ2hhbm5lbHNWZWN0b3IgJmdldENoYW5uZWxzKCkgY29uc3QgeyByZXR1cm4gbUNoYW5uZWxNYXNrczsgfQotCi0gICAgdm9pZCBzZXRTYW1wbGVSYXRlcyhjb25zdCBTYW1wbGVSYXRlVmVjdG9yICZzYW1wbGVSYXRlcykKLSAgICB7Ci0gICAgICAgIGlmIChtSXNEeW5hbWljUmF0ZSkgewotICAgICAgICAgICAgbVNhbXBsaW5nUmF0ZXMgPSBzYW1wbGVSYXRlczsKLSAgICAgICAgfQotICAgIH0KICAgICBjb25zdCBTYW1wbGVSYXRlVmVjdG9yICZnZXRTYW1wbGVSYXRlcygpIGNvbnN0IHsgcmV0dXJuIG1TYW1wbGluZ1JhdGVzOyB9CisgICAgdm9pZCBzZXRDaGFubmVscyhjb25zdCBDaGFubmVsc1ZlY3RvciAmY2hhbm5lbE1hc2tzKTsKKyAgICB2b2lkIHNldFNhbXBsZVJhdGVzKGNvbnN0IFNhbXBsZVJhdGVWZWN0b3IgJnNhbXBsZVJhdGVzKTsKIAorICAgIHZvaWQgY2xlYXIoKTsKICAgICBib29sIGlzVmFsaWQoKSBjb25zdCB7IHJldHVybiBoYXNWYWxpZEZvcm1hdCgpICYmIGhhc1ZhbGlkUmF0ZXMoKSAmJiBoYXNWYWxpZENoYW5uZWxzKCk7IH0KLQotICAgIHZvaWQgY2xlYXIoKQotICAgIHsKLSAgICAgICAgaWYgKG1Jc0R5bmFtaWNDaGFubmVscykgewotICAgICAgICAgICAgbUNoYW5uZWxNYXNrcy5jbGVhcigpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtSXNEeW5hbWljUmF0ZSkgewotICAgICAgICAgICAgbVNhbXBsaW5nUmF0ZXMuY2xlYXIoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlubGluZSBib29sIHN1cHBvcnRzQ2hhbm5lbHMoYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbHMpIGNvbnN0CisgICAgYm9vbCBzdXBwb3J0c0NoYW5uZWxzKGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxzKSBjb25zdAogICAgIHsKICAgICAgICAgcmV0dXJuIG1DaGFubmVsTWFza3MuaW5kZXhPZihjaGFubmVscykgPj0gMDsKICAgICB9Ci0gICAgaW5saW5lIGJvb2wgc3VwcG9ydHNSYXRlKHVpbnQzMl90IHJhdGUpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbVNhbXBsaW5nUmF0ZXMuaW5kZXhPZihyYXRlKSA+PSAwOwotICAgIH0KKyAgICBib29sIHN1cHBvcnRzUmF0ZSh1aW50MzJfdCByYXRlKSBjb25zdCB7IHJldHVybiBtU2FtcGxpbmdSYXRlcy5pbmRleE9mKHJhdGUpID49IDA7IH0KIAogICAgIHN0YXR1c190IGNoZWNrRXhhY3QodWludDMyX3QgcmF0ZSwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbHMsIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgY29uc3Q7Ci0KICAgICBzdGF0dXNfdCBjaGVja0NvbXBhdGlibGVDaGFubmVsTWFzayhhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCAmdXBkYXRlZENoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfdHlwZV90IHBvcnRUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfcm9sZV90IHBvcnRSb2xlKSBjb25zdDsKLQogICAgIHN0YXR1c190IGNoZWNrQ29tcGF0aWJsZVNhbXBsaW5nUmF0ZSh1aW50MzJfdCBzYW1wbGluZ1JhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICZ1cGRhdGVkU2FtcGxpbmdSYXRlKSBjb25zdDsKIApAQCAtMTE5LDcgKzExMiw3IEBACiAKICAgICBib29sIGlzRHluYW1pYygpIHsgcmV0dXJuIG1Jc0R5bmFtaWNGb3JtYXQgfHwgbUlzRHluYW1pY0NoYW5uZWxzIHx8IG1Jc0R5bmFtaWNSYXRlOyB9CiAKLSAgICB2b2lkIGR1bXAoaW50IGZkLCBpbnQgc3BhY2VzKSBjb25zdDsKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzKSBjb25zdDsKIAogcHJpdmF0ZToKICAgICBTdHJpbmc4ICBtTmFtZTsKQEAgLTEzNiwyMTMgKzEyOSw0OCBAQAogY2xhc3MgQXVkaW9Qcm9maWxlVmVjdG9yIDogcHVibGljIFZlY3RvcjxzcDxBdWRpb1Byb2ZpbGU+ID4KIHsKIHB1YmxpYzoKLSAgICBzc2l6ZV90IGFkZChjb25zdCBzcDxBdWRpb1Byb2ZpbGU+ICZwcm9maWxlKQotICAgIHsKLSAgICAgICAgc3NpemVfdCBpbmRleCA9IFZlY3Rvcjo6YWRkKHByb2ZpbGUpOwotICAgICAgICAvLyB3ZSBzb3J0IGZyb20gd29yc3QgdG8gYmVzdCwgc28gdGhhdCBBVURJT19GT1JNQVRfREVGQVVMVCBpcyBhbHdheXMgdGhlIGZpcnN0IGVudHJ5LgotICAgICAgICAvLyBUT0RPOiBjb21wYXJlRm9ybWF0cyBjb3VsZCBiZSBhIGxhbWJkYSB0byBjb252ZXJ0IGJldHdlZW4gcG9pbnRlci10by1mb3JtYXQgdG8gZm9ybWF0OgotICAgICAgICAvLyBbXShjb25zdCBhdWRpb19mb3JtYXRfdCAqZm9ybWF0MSwgY29uc3QgYXVkaW9fZm9ybWF0X3QgKmZvcm1hdDIpIHsKLSAgICAgICAgLy8gICAgIHJldHVybiBjb21wYXJlRm9ybWF0cygqZm9ybWF0MSwgKmZvcm1hdDIpOwotICAgICAgICAvLyB9Ci0gICAgICAgIHNvcnQoY29tcGFyZUZvcm1hdHMpOwotICAgICAgICByZXR1cm4gaW5kZXg7Ci0gICAgfQotCisgICAgc3NpemVfdCBhZGQoY29uc3Qgc3A8QXVkaW9Qcm9maWxlPiAmcHJvZmlsZSk7CiAgICAgLy8gVGhpcyBBUEkgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBieSB0aGUgcG9saWN5IG1hbmFnZXIgb25jZSByZXRyaWV2aW5nIGNhcGFiaWxpdGllcwogICAgIC8vIGZvciBhIHByb2ZpbGUgd2l0aCBkeW5hbWljIGZvcm1hdCwgcmF0ZSBhbmQgY2hhbm5lbHMgYXR0cmlidXRlcwotICAgIHNzaXplX3QgYWRkUHJvZmlsZUZyb21IYWwoY29uc3Qgc3A8QXVkaW9Qcm9maWxlPiAmcHJvZmlsZVRvQWRkKQotICAgIHsKLSAgICAgICAgLy8gQ2hlY2sgdmFsaWQgcHJvZmlsZSB0byBhZGQ6Ci0gICAgICAgIGlmICghcHJvZmlsZVRvQWRkLT5oYXNWYWxpZEZvcm1hdCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFwcm9maWxlVG9BZGQtPmhhc1ZhbGlkQ2hhbm5lbHMoKSAmJiAhcHJvZmlsZVRvQWRkLT5oYXNWYWxpZFJhdGVzKCkpIHsKLSAgICAgICAgICAgIEZvcm1hdFZlY3RvciBmb3JtYXRzOwotICAgICAgICAgICAgZm9ybWF0cy5hZGQocHJvZmlsZVRvQWRkLT5nZXRGb3JtYXQoKSk7Ci0gICAgICAgICAgICBzZXRGb3JtYXRzKEZvcm1hdFZlY3Rvcihmb3JtYXRzKSk7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICBpZiAoIXByb2ZpbGVUb0FkZC0+aGFzVmFsaWRDaGFubmVscygpICYmIHByb2ZpbGVUb0FkZC0+aGFzVmFsaWRSYXRlcygpKSB7Ci0gICAgICAgICAgICBzZXRTYW1wbGVSYXRlc0Zvcihwcm9maWxlVG9BZGQtPmdldFNhbXBsZVJhdGVzKCksIHByb2ZpbGVUb0FkZC0+Z2V0Rm9ybWF0KCkpOwotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHByb2ZpbGVUb0FkZC0+aGFzVmFsaWRDaGFubmVscygpICYmICFwcm9maWxlVG9BZGQtPmhhc1ZhbGlkUmF0ZXMoKSkgewotICAgICAgICAgICAgc2V0Q2hhbm5lbHNGb3IocHJvZmlsZVRvQWRkLT5nZXRDaGFubmVscygpLCBwcm9maWxlVG9BZGQtPmdldEZvcm1hdCgpKTsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIC8vIEdvIHRocm91Z2ggdGhlIGxpc3Qgb2YgcHJvZmlsZSB0byBhdm9pZCBkdXBsaWNhdGVzCi0gICAgICAgIGZvciAoc2l6ZV90IHByb2ZpbGVJbmRleCA9IDA7IHByb2ZpbGVJbmRleCA8IHNpemUoKTsgcHJvZmlsZUluZGV4KyspIHsKLSAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvUHJvZmlsZT4gJnByb2ZpbGUgPSBpdGVtQXQocHJvZmlsZUluZGV4KTsKLSAgICAgICAgICAgIGlmIChwcm9maWxlLT5pc1ZhbGlkKCkgJiYgcHJvZmlsZSA9PSBwcm9maWxlVG9BZGQpIHsKLSAgICAgICAgICAgICAgICAvLyBOb3RoaW5nIHRvIGRvCi0gICAgICAgICAgICAgICAgcmV0dXJuIHByb2ZpbGVJbmRleDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwcm9maWxlVG9BZGQtPnNldER5bmFtaWNGb3JtYXQodHJ1ZSk7IC8vIHNldCB0aGUgZm9ybWF0IGFzIGR5bmFtaWMgdG8gYWxsb3cgcmVtb3ZhbAotICAgICAgICByZXR1cm4gYWRkKHByb2ZpbGVUb0FkZCk7Ci0gICAgfQotCi0gICAgc3A8QXVkaW9Qcm9maWxlPiBnZXRGaXJzdFZhbGlkUHJvZmlsZSgpIGNvbnN0Ci0gICAgewotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoaXRlbUF0KGkpLT5pc1ZhbGlkKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gaXRlbUF0KGkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIGJvb2wgaGFzVmFsaWRQcm9maWxlKCkgY29uc3QgeyByZXR1cm4gZ2V0Rmlyc3RWYWxpZFByb2ZpbGUoKSAhPSAwOyB9CisgICAgc3NpemVfdCBhZGRQcm9maWxlRnJvbUhhbChjb25zdCBzcDxBdWRpb1Byb2ZpbGU+ICZwcm9maWxlVG9BZGQpOwogCiAgICAgc3RhdHVzX3QgY2hlY2tFeGFjdFByb2ZpbGUodWludDMyX3Qgc2FtcGxpbmdSYXRlLCBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQpIGNvbnN0OwotCiAgICAgc3RhdHVzX3QgY2hlY2tDb21wYXRpYmxlUHJvZmlsZSh1aW50MzJfdCAmc2FtcGxpbmdSYXRlLCBhdWRpb19jaGFubmVsX21hc2tfdCAmY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCAmZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF90eXBlX3QgcG9ydFR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X3JvbGVfdCBwb3J0Um9sZSkgY29uc3Q7CisgICAgdm9pZCBjbGVhclByb2ZpbGVzKCk7CisgICAgLy8gQXNzdW1pbmcgdGhhdCB0aGlzIHByb2ZpbGUgdmVjdG9yIGNvbnRhaW5zIGlucHV0IHByb2ZpbGVzLAorICAgIC8vIGZpbmQgdGhlIGJlc3QgbWF0Y2hpbmcgY29uZmlnIGZyb20gJ291dHB1dFByb2ZpbGVzJywgYWNjb3JkaW5nIHRvCisgICAgLy8gdGhlIGdpdmVuIHByZWZlcmVuY2VzIGZvciBhdWRpbyBmb3JtYXRzIGFuZCBjaGFubmVsIG1hc2tzLgorICAgIC8vIE5vdGU6IHN0ZDo6dmVjdG9ycyBhcmUgdXNlZCBiZWNhdXNlIHNwZWNpYWxpemVkIGNvbnRhaW5lcnMgZm9yIGZvcm1hdHMKKyAgICAvLyAgICAgICBhbmQgY2hhbm5lbHMgY2FuIGJlIHNvcnRlZCBhbmQgdXNlIHRoZWlyIG93biBvcmRlcmluZy4KKyAgICBzdGF0dXNfdCBmaW5kQmVzdE1hdGNoaW5nT3V0cHV0Q29uZmlnKGNvbnN0IEF1ZGlvUHJvZmlsZVZlY3RvciYgb3V0cHV0UHJvZmlsZXMsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxhdWRpb19mb3JtYXRfdD4mIHByZWZlcnJlZEZvcm1hdHMsIC8vIG9yZGVyOiBtb3N0IHByZWYgLT4gbGVhc3QgcHJlZgorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+JiBwcmVmZXJyZWRPdXRwdXRDaGFubmVscywKKyAgICAgICAgICAgIGJvb2wgcHJlZmVySGlnaGVyU2FtcGxpbmdSYXRlcywKKyAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ19iYXNlICpiZXN0T3V0cHV0Q29uZmlnKSBjb25zdDsKIAotICAgIEZvcm1hdFZlY3RvciBnZXRTdXBwb3J0ZWRGb3JtYXRzKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIEZvcm1hdFZlY3RvciBzdXBwb3J0ZWRGb3JtYXRzOwotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoaXRlbUF0KGkpLT5oYXNWYWxpZEZvcm1hdCgpKSB7Ci0gICAgICAgICAgICAgICAgc3VwcG9ydGVkRm9ybWF0cy5hZGQoaXRlbUF0KGkpLT5nZXRGb3JtYXQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN1cHBvcnRlZEZvcm1hdHM7Ci0gICAgfQorICAgIHNwPEF1ZGlvUHJvZmlsZT4gZ2V0Rmlyc3RWYWxpZFByb2ZpbGUoKSBjb25zdDsKKyAgICBzcDxBdWRpb1Byb2ZpbGU+IGdldEZpcnN0VmFsaWRQcm9maWxlRm9yKGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgY29uc3Q7CisgICAgYm9vbCBoYXNWYWxpZFByb2ZpbGUoKSBjb25zdCB7IHJldHVybiBnZXRGaXJzdFZhbGlkUHJvZmlsZSgpICE9IDA7IH0KIAotICAgIGJvb2wgaGFzRHluYW1pY1Byb2ZpbGUoKSBjb25zdAotICAgIHsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICAgICAgaWYgKGl0ZW1BdChpKS0+aXNEeW5hbWljKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgYm9vbCBoYXNEeW5hbWljRm9ybWF0KCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRQcm9maWxlRm9yKGdEeW5hbWljRm9ybWF0KSAhPSAwOwotICAgIH0KLQotICAgIGJvb2wgaGFzRHluYW1pY0NoYW5uZWxzRm9yKGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgY29uc3QKLSAgICB7Ci0gICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICAgICBzcDxBdWRpb1Byb2ZpbGU+IHByb2ZpbGUgPSBpdGVtQXQoaSk7Ci0gICAgICAgICAgIGlmIChwcm9maWxlLT5nZXRGb3JtYXQoKSA9PSBmb3JtYXQgJiYgcHJvZmlsZS0+aXNEeW5hbWljQ2hhbm5lbHMoKSkgewotICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgIH0KLSAgICAgICB9Ci0gICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGJvb2wgaGFzRHluYW1pY1JhdGVGb3IoYXVkaW9fZm9ybWF0X3QgZm9ybWF0KSBjb25zdAotICAgIHsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICAgICAgc3A8QXVkaW9Qcm9maWxlPiBwcm9maWxlID0gaXRlbUF0KGkpOwotICAgICAgICAgICAgaWYgKHByb2ZpbGUtPmdldEZvcm1hdCgpID09IGZvcm1hdCAmJiBwcm9maWxlLT5pc0R5bmFtaWNSYXRlKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQorICAgIEZvcm1hdFZlY3RvciBnZXRTdXBwb3J0ZWRGb3JtYXRzKCkgY29uc3Q7CisgICAgYm9vbCBoYXNEeW5hbWljQ2hhbm5lbHNGb3IoYXVkaW9fZm9ybWF0X3QgZm9ybWF0KSBjb25zdDsKKyAgICBib29sIGhhc0R5bmFtaWNGb3JtYXQoKSBjb25zdCB7IHJldHVybiBnZXRQcm9maWxlRm9yKGdEeW5hbWljRm9ybWF0KSAhPSAwOyB9CisgICAgYm9vbCBoYXNEeW5hbWljUHJvZmlsZSgpIGNvbnN0OworICAgIGJvb2wgaGFzRHluYW1pY1JhdGVGb3IoYXVkaW9fZm9ybWF0X3QgZm9ybWF0KSBjb25zdDsKIAogICAgIC8vIE9uZSBhdWRpbyBwcm9maWxlIHdpbGwgYmUgYWRkZWQgZm9yIGVhY2ggZm9ybWF0IHN1cHBvcnRlZCBieSBBdWRpbyBIQUwKLSAgICB2b2lkIHNldEZvcm1hdHMoY29uc3QgRm9ybWF0VmVjdG9yICZmb3JtYXRzKQotICAgIHsKLSAgICAgICAgLy8gT25seSBhbGxvdyB0byBjaGFuZ2UgdGhlIGZvcm1hdCBvZiBkeW5hbWljIHByb2ZpbGUKLSAgICAgICAgc3A8QXVkaW9Qcm9maWxlPiBkeW5hbWljRm9ybWF0UHJvZmlsZSA9IGdldFByb2ZpbGVGb3IoZ0R5bmFtaWNGb3JtYXQpOwotICAgICAgICBpZiAoZHluYW1pY0Zvcm1hdFByb2ZpbGUgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZm9ybWF0cy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgc3A8QXVkaW9Qcm9maWxlPiBwcm9maWxlID0gbmV3IEF1ZGlvUHJvZmlsZShmb3JtYXRzW2ldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkeW5hbWljRm9ybWF0UHJvZmlsZS0+Z2V0Q2hhbm5lbHMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHluYW1pY0Zvcm1hdFByb2ZpbGUtPmdldFNhbXBsZVJhdGVzKCkpOwotICAgICAgICAgICAgcHJvZmlsZS0+c2V0RHluYW1pY0Zvcm1hdCh0cnVlKTsKLSAgICAgICAgICAgIHByb2ZpbGUtPnNldER5bmFtaWNDaGFubmVscyhkeW5hbWljRm9ybWF0UHJvZmlsZS0+aXNEeW5hbWljQ2hhbm5lbHMoKSk7Ci0gICAgICAgICAgICBwcm9maWxlLT5zZXREeW5hbWljUmF0ZShkeW5hbWljRm9ybWF0UHJvZmlsZS0+aXNEeW5hbWljUmF0ZSgpKTsKLSAgICAgICAgICAgIGFkZChwcm9maWxlKTsKLSAgICAgICAgfQotICAgIH0KKyAgICB2b2lkIHNldEZvcm1hdHMoY29uc3QgRm9ybWF0VmVjdG9yICZmb3JtYXRzKTsKIAotICAgIHZvaWQgY2xlYXJQcm9maWxlcygpCi0gICAgewotICAgICAgICBmb3IgKHNpemVfdCBpID0gc2l6ZSgpOyBpICE9IDA7ICkgewotICAgICAgICAgICAgc3A8QXVkaW9Qcm9maWxlPiBwcm9maWxlID0gaXRlbUF0KC0taSk7Ci0gICAgICAgICAgICBpZiAocHJvZmlsZS0+aXNEeW5hbWljRm9ybWF0KCkgJiYgcHJvZmlsZS0+aGFzVmFsaWRGb3JtYXQoKSkgewotICAgICAgICAgICAgICAgIHJlbW92ZUF0KGkpOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHJvZmlsZS0+Y2xlYXIoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgZHVtcChpbnQgZmQsIGludCBzcGFjZXMpIGNvbnN0Ci0gICAgewotICAgICAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICAgICAgY2hhciBidWZmZXJbU0laRV07Ci0KLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBQcm9maWxlczpcbiIsIHNwYWNlcywgIiIpOwotICAgICAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqc1Byb2ZpbGUgJXp1OiIsIHNwYWNlcyArIDQsICIiLCBpKTsKLSAgICAgICAgICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKLSAgICAgICAgICAgIGl0ZW1BdChpKS0+ZHVtcChmZCwgc3BhY2VzICsgOCk7Ci0gICAgICAgIH0KLSAgICB9CisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcykgY29uc3Q7CiAKIHByaXZhdGU6Ci0gICAgdm9pZCBzZXRTYW1wbGVSYXRlc0Zvcihjb25zdCBTYW1wbGVSYXRlVmVjdG9yICZzYW1wbGVSYXRlcywgYXVkaW9fZm9ybWF0X3QgZm9ybWF0KQotICAgIHsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICAgICAgc3A8QXVkaW9Qcm9maWxlPiBwcm9maWxlID0gaXRlbUF0KGkpOwotICAgICAgICAgICAgaWYgKHByb2ZpbGUtPmdldEZvcm1hdCgpID09IGZvcm1hdCAmJiBwcm9maWxlLT5pc0R5bmFtaWNSYXRlKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAocHJvZmlsZS0+aGFzVmFsaWRSYXRlcygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIE5lZWQgdG8gY3JlYXRlIGEgbmV3IHByb2ZpbGUgd2l0aCBzYW1lIGZvcm1hdAotICAgICAgICAgICAgICAgICAgICBzcDxBdWRpb1Byb2ZpbGU+IHByb2ZpbGVUb0FkZCA9IG5ldyBBdWRpb1Byb2ZpbGUoZm9ybWF0LCBwcm9maWxlLT5nZXRDaGFubmVscygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZXMpOwotICAgICAgICAgICAgICAgICAgICBwcm9maWxlVG9BZGQtPnNldER5bmFtaWNGb3JtYXQodHJ1ZSk7IC8vIG5lZWQgdG8gc2V0IHRvIGFsbG93IGNsZWFuaW5nCi0gICAgICAgICAgICAgICAgICAgIGFkZChwcm9maWxlVG9BZGQpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHByb2ZpbGUtPnNldFNhbXBsZVJhdGVzKHNhbXBsZVJhdGVzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBzZXRDaGFubmVsc0Zvcihjb25zdCBDaGFubmVsc1ZlY3RvciAmY2hhbm5lbE1hc2tzLCBhdWRpb19mb3JtYXRfdCBmb3JtYXQpCi0gICAgewotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBzcDxBdWRpb1Byb2ZpbGU+IHByb2ZpbGUgPSBpdGVtQXQoaSk7Ci0gICAgICAgICAgICBpZiAocHJvZmlsZS0+Z2V0Rm9ybWF0KCkgPT0gZm9ybWF0ICYmIHByb2ZpbGUtPmlzRHluYW1pY0NoYW5uZWxzKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAocHJvZmlsZS0+aGFzVmFsaWRDaGFubmVscygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIE5lZWQgdG8gY3JlYXRlIGEgbmV3IHByb2ZpbGUgd2l0aCBzYW1lIGZvcm1hdAotICAgICAgICAgICAgICAgICAgICBzcDxBdWRpb1Byb2ZpbGU+IHByb2ZpbGVUb0FkZCA9IG5ldyBBdWRpb1Byb2ZpbGUoZm9ybWF0LCBjaGFubmVsTWFza3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5nZXRTYW1wbGVSYXRlcygpKTsKLSAgICAgICAgICAgICAgICAgICAgcHJvZmlsZVRvQWRkLT5zZXREeW5hbWljRm9ybWF0KHRydWUpOyAvLyBuZWVkIHRvIHNldCB0byBhbGxvdyBjbGVhbmluZwotICAgICAgICAgICAgICAgICAgICBhZGQocHJvZmlsZVRvQWRkKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5zZXRDaGFubmVscyhjaGFubmVsTWFza3MpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzcDxBdWRpb1Byb2ZpbGU+IGdldFByb2ZpbGVGb3IoYXVkaW9fZm9ybWF0X3QgZm9ybWF0KSBjb25zdAotICAgIHsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICAgICAgaWYgKGl0ZW1BdChpKS0+Z2V0Rm9ybWF0KCkgPT0gZm9ybWF0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW1BdChpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gMDsKLSAgICB9CisgICAgc3A8QXVkaW9Qcm9maWxlPiBnZXRQcm9maWxlRm9yKGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgY29uc3Q7CisgICAgdm9pZCBzZXRTYW1wbGVSYXRlc0Zvcihjb25zdCBTYW1wbGVSYXRlVmVjdG9yICZzYW1wbGVSYXRlcywgYXVkaW9fZm9ybWF0X3QgZm9ybWF0KTsKKyAgICB2b2lkIHNldENoYW5uZWxzRm9yKGNvbnN0IENoYW5uZWxzVmVjdG9yICZjaGFubmVsTWFza3MsIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCk7CiAKICAgICBzdGF0aWMgaW50IGNvbXBhcmVGb3JtYXRzKGNvbnN0IHNwPEF1ZGlvUHJvZmlsZT4gKnByb2ZpbGUxLCBjb25zdCBzcDxBdWRpb1Byb2ZpbGU+ICpwcm9maWxlMik7CiB9OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUm91dGUuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1JvdXRlLmgKaW5kZXggNmIyNGZkZS4uMzMwZjFkNCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUm91dGUuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Sb3V0ZS5oCkBAIC00Niw3ICs0Niw3IEBACiAKICAgICBhdWRpb19yb3V0ZV90eXBlX3QgZ2V0VHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1UeXBlOyB9CiAKLSAgICB2b2lkIGR1bXAoaW50IGZkLCBpbnQgc3BhY2VzKSBjb25zdDsKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzKSBjb25zdDsKIAogcHJpdmF0ZToKICAgICBBdWRpb1BvcnRWZWN0b3IgbVNvdXJjZXM7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9TZXNzaW9uLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9TZXNzaW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkNTI0N2QuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvU2Vzc2lvbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgotI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUG9saWN5Lmg+Ci0jaW5jbHVkZSA8bWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC5oPgotI2luY2x1ZGUgIkF1ZGlvU2Vzc2lvbkluZm9Qcm92aWRlci5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlOwotCi1jbGFzcyBBdWRpb1Nlc3Npb24gOiBwdWJsaWMgUmVmQmFzZSwgcHVibGljIEF1ZGlvU2Vzc2lvbkluZm9VcGRhdGVMaXN0ZW5lcgotewotcHVibGljOgotICAgIEF1ZGlvU2Vzc2lvbihhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UsCi0gICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKLSAgICAgICAgICAgICAgICAgYm9vbCBpc1NvdW5kVHJpZ2dlciwKLSAgICAgICAgICAgICAgICAgQXVkaW9NaXgqIHBvbGljeU1peCwKLSAgICAgICAgICAgICAgICAgQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgKmNsaWVudEludGVyZmFjZSk7Ci0KLSAgICBzdGF0dXNfdCBkdW1wKGludCBmZCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdDsKLQotICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKCkgY29uc3QgeyByZXR1cm4gbVJlY29yZENsaWVudEluZm8uc2Vzc2lvbjsgfQotICAgIGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlKCljb25zdCB7IHJldHVybiBtUmVjb3JkQ2xpZW50SW5mby5zb3VyY2U7IH0KLSAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQoKSBjb25zdCB7IHJldHVybiBtQ29uZmlnLmZvcm1hdDsgfQotICAgIHVpbnQzMl90IHNhbXBsZVJhdGUoKSBjb25zdCB7IHJldHVybiBtQ29uZmlnLnNhbXBsZV9yYXRlOyB9Ci0gICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2soKSBjb25zdCB7IHJldHVybiBtQ29uZmlnLmNoYW5uZWxfbWFzazsgfQotICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MoKSBjb25zdCB7IHJldHVybiBtRmxhZ3M7IH0KLSAgICB1aWRfdCB1aWQoKSBjb25zdCB7IHJldHVybiBtUmVjb3JkQ2xpZW50SW5mby51aWQ7IH0KLSAgICB2b2lkIHNldFVpZCh1aWRfdCB1aWQpIHsgbVJlY29yZENsaWVudEluZm8udWlkID0gdWlkOyB9Ci0gICAgYm9vbCBtYXRjaGVzKGNvbnN0IHNwPEF1ZGlvU2Vzc2lvbj4gJm90aGVyKSBjb25zdDsKLSAgICBib29sIGlzU291bmRUcmlnZ2VyKCkgY29uc3QgeyByZXR1cm4gbUlzU291bmRUcmlnZ2VyOyB9Ci0gICAgdm9pZCBzZXRTaWxlbmNlZChib29sIHNpbGVuY2VkKSB7IG1TaWxlbmNlZCA9IHNpbGVuY2VkOyB9Ci0gICAgYm9vbCBpc1NpbGVuY2VkKCkgY29uc3QgeyByZXR1cm4gbVNpbGVuY2VkOyB9Ci0gICAgdWludDMyX3Qgb3BlbkNvdW50KCkgY29uc3QgeyByZXR1cm4gbU9wZW5Db3VudDsgfSA7Ci0gICAgdWludDMyX3QgYWN0aXZlQ291bnQoKSBjb25zdCB7IHJldHVybiBtQWN0aXZlQ291bnQ7IH0gOwotCi0gICAgdWludDMyX3QgY2hhbmdlT3BlbkNvdW50KGludCBkZWx0YSk7Ci0gICAgdWludDMyX3QgY2hhbmdlQWN0aXZlQ291bnQoaW50IGRlbHRhKTsKLQotICAgIHZvaWQgc2V0SW5mb1Byb3ZpZGVyKEF1ZGlvU2Vzc2lvbkluZm9Qcm92aWRlciAqcHJvdmlkZXIpOwotICAgIC8vIGltcGxlbWVudGF0aW9uIG9mIEF1ZGlvU2Vzc2lvbkluZm9VcGRhdGVMaXN0ZW5lcgotICAgIHZpcnR1YWwgdm9pZCBvblNlc3Npb25JbmZvVXBkYXRlKCkgY29uc3Q7Ci0KLXByaXZhdGU6Ci0gICAgcmVjb3JkX2NsaWVudF9pbmZvX3QgbVJlY29yZENsaWVudEluZm87Ci0gICAgY29uc3Qgc3RydWN0IGF1ZGlvX2NvbmZpZ19iYXNlIG1Db25maWc7Ci0gICAgY29uc3QgYXVkaW9faW5wdXRfZmxhZ3NfdCBtRmxhZ3M7Ci0gICAgYm9vbCAgbUlzU291bmRUcmlnZ2VyOwotICAgIGJvb2wgbVNpbGVuY2VkOwotICAgIHVpbnQzMl90ICBtT3BlbkNvdW50OwotICAgIHVpbnQzMl90ICBtQWN0aXZlQ291bnQ7Ci0gICAgQXVkaW9NaXgqIG1Qb2xpY3lNaXg7IC8vIG5vbiBOVUxMIHdoZW4gdXNlZCBieSBhIGR5bmFtaWMgcG9saWN5Ci0gICAgQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UqIG1DbGllbnRJbnRlcmZhY2U7Ci0gICAgY29uc3QgQXVkaW9TZXNzaW9uSW5mb1Byb3ZpZGVyKiBtSW5mb1Byb3ZpZGVyOwotfTsKLQotY2xhc3MgQXVkaW9TZXNzaW9uQ29sbGVjdGlvbiA6Ci0gICAgcHVibGljIERlZmF1bHRLZXllZFZlY3RvcjxhdWRpb19zZXNzaW9uX3QsIHNwPEF1ZGlvU2Vzc2lvbj4gPiwKLSAgICBwdWJsaWMgQXVkaW9TZXNzaW9uSW5mb1VwZGF0ZUxpc3RlbmVyCi17Ci1wdWJsaWM6Ci0gICAgc3RhdHVzX3QgYWRkU2Vzc2lvbihhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9TZXNzaW9uPiYgYXVkaW9TZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1Nlc3Npb25JbmZvUHJvdmlkZXIgKnByb3ZpZGVyKTsKLQotICAgIHN0YXR1c190IHJlbW92ZVNlc3Npb24oYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOwotCi0gICAgdWludDMyX3QgZ2V0T3BlbkNvdW50KCkgY29uc3Q7Ci0KLSAgICBBdWRpb1Nlc3Npb25Db2xsZWN0aW9uIGdldEFjdGl2ZVNlc3Npb25zKCkgY29uc3Q7Ci0gICAgc2l6ZV90IGdldEFjdGl2ZVNlc3Npb25Db3VudCgpIGNvbnN0OwotICAgIGJvb2wgaGFzQWN0aXZlU2Vzc2lvbigpIGNvbnN0OwotICAgIGJvb2wgaXNTb3VyY2VBY3RpdmUoYXVkaW9fc291cmNlX3Qgc291cmNlKSBjb25zdDsKLSAgICBhdWRpb19zb3VyY2VfdCBnZXRIaWdoZXN0UHJpb3JpdHlTb3VyY2UoYm9vbCBhY3RpdmVPbmx5KSBjb25zdDsKLQotICAgIC8vIGltcGxlbWVudGF0aW9uIG9mIEF1ZGlvU2Vzc2lvbkluZm9VcGRhdGVMaXN0ZW5lcgotICAgIHZpcnR1YWwgdm9pZCBvblNlc3Npb25JbmZvVXBkYXRlKCkgY29uc3Q7Ci0KLSAgICBzdGF0dXNfdCBkdW1wKGludCBmZCwgaW50IHNwYWNlcykgY29uc3Q7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9TZXNzaW9uSW5mb1Byb3ZpZGVyLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9TZXNzaW9uSW5mb1Byb3ZpZGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwMDM3ZmMuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvU2Vzc2lvbkluZm9Qcm92aWRlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciBpbnB1dCBkZXNjcmlwdG9ycyB0byBpbXBsZW1lbnQgc28gZGVwZW5kZW50IGF1ZGlvIHNlc3Npb25zIGNhbiBxdWVyeSBpbmZvcm1hdGlvbgotICogYWJvdXQgdGhlaXIgY29udGV4dAotICovCi1jbGFzcyBBdWRpb1Nlc3Npb25JbmZvUHJvdmlkZXIKLXsKLXB1YmxpYzoKLSAgICB2aXJ0dWFsIH5BdWRpb1Nlc3Npb25JbmZvUHJvdmlkZXIoKSB7fTsKLQotICAgIHZpcnR1YWwgYXVkaW9fY29uZmlnX2Jhc2VfdCBnZXRDb25maWcoKSBjb25zdCA9IDA7Ci0KLSAgICB2aXJ0dWFsIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGdldFBhdGNoSGFuZGxlKCkgY29uc3QgPSAwOwotCi19OwotCi1jbGFzcyBBdWRpb1Nlc3Npb25JbmZvVXBkYXRlTGlzdGVuZXIKLXsKLXB1YmxpYzoKLSAgICB2aXJ0dWFsIH5BdWRpb1Nlc3Npb25JbmZvVXBkYXRlTGlzdGVuZXIoKSB7fTsKLQotICAgIHZpcnR1YWwgdm9pZCBvblNlc3Npb25JbmZvVXBkYXRlKCkgY29uc3QgPSAwOzsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1NvdXJjZURlc2NyaXB0b3IuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1NvdXJjZURlc2NyaXB0b3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQ5MGY0Mi4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Tb3VyY2VEZXNjcmlwdG9yLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDxSb3V0aW5nU3RyYXRlZ3kuaD4KLSNpbmNsdWRlIDxBdWRpb1BhdGNoLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgU3dBdWRpb091dHB1dERlc2NyaXB0b3I7Ci1jbGFzcyBId0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjsKLWNsYXNzIERldmljZURlc2NyaXB0b3I7Ci0KLWNsYXNzIEF1ZGlvU291cmNlRGVzY3JpcHRvcjogcHVibGljIFJlZkJhc2UKLXsKLXB1YmxpYzoKLSAgICBBdWRpb1NvdXJjZURlc2NyaXB0b3IoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlLCBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHJpYnV0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCkgOgotICAgICAgICBtRGV2aWNlKGRldmljZSksIG1BdHRyaWJ1dGVzKCphdHRyaWJ1dGVzKSwgbVVpZCh1aWQpIHt9Ci0gICAgdmlydHVhbCB+QXVkaW9Tb3VyY2VEZXNjcmlwdG9yKCkge30KLQotICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGdldEhhbmRsZSgpIGNvbnN0IHsgcmV0dXJuIG1QYXRjaERlc2MtPm1IYW5kbGU7IH0KLQotICAgIHN0YXR1c190ICAgIGR1bXAoaW50IGZkKTsKLQotICAgIGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+IG1EZXZpY2U7Ci0gICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190IG1BdHRyaWJ1dGVzOwotICAgIHVpZF90IG1VaWQ7Ci0gICAgc3A8QXVkaW9QYXRjaD4gbVBhdGNoRGVzYzsKLSAgICB3cDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gbVN3T3V0cHV0OwotICAgIHdwPEh3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBtSHdPdXRwdXQ7Ci19OwotCi1jbGFzcyBBdWRpb1NvdXJjZUNvbGxlY3Rpb24gOgotICAgICAgICBwdWJsaWMgRGVmYXVsdEtleWVkVmVjdG9yPCBhdWRpb19wYXRjaF9oYW5kbGVfdCwgc3A8QXVkaW9Tb3VyY2VEZXNjcmlwdG9yPiA+Ci17Ci1wdWJsaWM6Ci0gICAgc3RhdHVzX3QgZHVtcChpbnQgZmQpIGNvbnN0OwotfTsKLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0NsaWVudERlc2NyaXB0b3IuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9DbGllbnREZXNjcmlwdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDMwYmY0YgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9DbGllbnREZXNjcmlwdG9yLmgKQEAgLTAsMCArMSwyNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisjaW5jbHVkZSAiQXVkaW9QYXRjaC5oIgorI2luY2x1ZGUgIlJvdXRpbmdTdHJhdGVneS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIERldmljZURlc2NyaXB0b3I7CitjbGFzcyBId0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjsKK2NsYXNzIFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yOworCitjbGFzcyBDbGllbnREZXNjcmlwdG9yOiBwdWJsaWMgUmVmQmFzZQoreworcHVibGljOgorICAgIENsaWVudERlc2NyaXB0b3IoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQsIHVpZF90IHVpZCwgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cmlidXRlcywgYXVkaW9fY29uZmlnX2Jhc2VfdCBjb25maWcsCisgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwcmVmZXJyZWREZXZpY2VJZCkgOgorICAgICAgICBtUG9ydElkKHBvcnRJZCksIG1VaWQodWlkKSwgbVNlc3Npb25JZChzZXNzaW9uSWQpLCBtQXR0cmlidXRlcyhhdHRyaWJ1dGVzKSwKKyAgICAgICAgbUNvbmZpZyhjb25maWcpLCBtUHJlZmVycmVkRGV2aWNlSWQocHJlZmVycmVkRGV2aWNlSWQpLCBtQWN0aXZlKGZhbHNlKSB7fQorICAgIH5DbGllbnREZXNjcmlwdG9yKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICAgdmlydHVhbCB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgpIGNvbnN0OworICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgdG9TaG9ydFN0cmluZygpIGNvbnN0OworCisgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQoKSBjb25zdCB7IHJldHVybiBtUG9ydElkOyB9CisgICAgdWlkX3QgdWlkKCkgY29uc3QgeyByZXR1cm4gbVVpZDsgfQorICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKCkgY29uc3QgeyByZXR1cm4gbVNlc3Npb25JZDsgfTsKKyAgICBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cmlidXRlcygpIGNvbnN0IHsgcmV0dXJuIG1BdHRyaWJ1dGVzOyB9CisgICAgYXVkaW9fY29uZmlnX2Jhc2VfdCBjb25maWcoKSBjb25zdCB7IHJldHVybiBtQ29uZmlnOyB9CisgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwcmVmZXJyZWREZXZpY2VJZCgpIGNvbnN0IHsgcmV0dXJuIG1QcmVmZXJyZWREZXZpY2VJZDsgfTsKKyAgICB2b2lkIHNldFByZWZlcnJlZERldmljZUlkKGF1ZGlvX3BvcnRfaGFuZGxlX3QgcHJlZmVycmVkRGV2aWNlSWQpIHsKKyAgICAgICAgbVByZWZlcnJlZERldmljZUlkID0gcHJlZmVycmVkRGV2aWNlSWQ7CisgICAgfTsKKyAgICB2b2lkIHNldEFjdGl2ZShib29sIGFjdGl2ZSkgeyBtQWN0aXZlID0gYWN0aXZlOyB9CisgICAgYm9vbCBhY3RpdmUoKSBjb25zdCB7IHJldHVybiBtQWN0aXZlOyB9CisgICAgYm9vbCBoYXNQcmVmZXJyZWREZXZpY2UoYm9vbCBhY3RpdmVPbmx5ID0gZmFsc2UpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1QcmVmZXJyZWREZXZpY2VJZCAhPSBBVURJT19QT1JUX0hBTkRMRV9OT05FICYmICghYWN0aXZlT25seSB8fCBtQWN0aXZlKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgY29uc3QgYXVkaW9fcG9ydF9oYW5kbGVfdCBtUG9ydElkOyAgLy8gdW5pcXVlIElkIGZvciB0aGlzIGNsaWVudAorICAgIGNvbnN0IHVpZF90IG1VaWQ7ICAgICAgICAgICAgICAgICAgICAgLy8gY2xpZW50IFVJRAorICAgIGNvbnN0IGF1ZGlvX3Nlc3Npb25fdCBtU2Vzc2lvbklkOyAgICAgICAvLyBhdWRpbyBzZXNzaW9uIElECisgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190IG1BdHRyaWJ1dGVzOyAvLyB1c2FnZS4uLgorICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgbUNvbmZpZzsKKyAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IG1QcmVmZXJyZWREZXZpY2VJZDsgIC8vIHNlbGVjdGVkIGlucHV0IGRldmljZSBwb3J0IElECisgICAgICAgICAgYm9vbCBtQWN0aXZlOworfTsKKworY2xhc3MgVHJhY2tDbGllbnREZXNjcmlwdG9yOiBwdWJsaWMgQ2xpZW50RGVzY3JpcHRvcgoreworcHVibGljOgorICAgIFRyYWNrQ2xpZW50RGVzY3JpcHRvcihhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCwgdWlkX3QgdWlkLCBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyaWJ1dGVzLCBhdWRpb19jb25maWdfYmFzZV90IGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHByZWZlcnJlZERldmljZUlkLCBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcm91dGluZ19zdHJhdGVneSBzdHJhdGVneSwgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MpIDoKKyAgICAgICAgQ2xpZW50RGVzY3JpcHRvcihwb3J0SWQsIHVpZCwgc2Vzc2lvbklkLCBhdHRyaWJ1dGVzLCBjb25maWcsIHByZWZlcnJlZERldmljZUlkKSwKKyAgICAgICAgbVN0cmVhbShzdHJlYW0pLCBtU3RyYXRlZ3koc3RyYXRlZ3kpLCBtRmxhZ3MoZmxhZ3MpIHt9CisgICAgflRyYWNrQ2xpZW50RGVzY3JpcHRvcigpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIHVzaW5nIENsaWVudERlc2NyaXB0b3I6OmR1bXA7CisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdCBvdmVycmlkZTsKKyAgICBzdGQ6OnN0cmluZyB0b1Nob3J0U3RyaW5nKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncygpIGNvbnN0IHsgcmV0dXJuIG1GbGFnczsgfQorICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKCkgY29uc3QgeyByZXR1cm4gbVN0cmVhbTsgfQorICAgIHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3koKSBjb25zdCB7IHJldHVybiBtU3RyYXRlZ3k7IH0KKworcHJpdmF0ZToKKyAgICBjb25zdCBhdWRpb19zdHJlYW1fdHlwZV90IG1TdHJlYW07CisgICAgY29uc3Qgcm91dGluZ19zdHJhdGVneSBtU3RyYXRlZ3k7CisgICAgY29uc3QgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgbUZsYWdzOworfTsKKworY2xhc3MgUmVjb3JkQ2xpZW50RGVzY3JpcHRvcjogcHVibGljIENsaWVudERlc2NyaXB0b3IKK3sKK3B1YmxpYzoKKyAgICBSZWNvcmRDbGllbnREZXNjcmlwdG9yKGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkLCB1aWRfdCB1aWQsIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cmlidXRlcywgYXVkaW9fY29uZmlnX2Jhc2VfdCBjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHByZWZlcnJlZERldmljZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLCBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLCBib29sIGlzU291bmRUcmlnZ2VyKSA6CisgICAgICAgIENsaWVudERlc2NyaXB0b3IocG9ydElkLCB1aWQsIHNlc3Npb25JZCwgYXR0cmlidXRlcywgY29uZmlnLCBwcmVmZXJyZWREZXZpY2VJZCksCisgICAgICAgIG1Tb3VyY2Uoc291cmNlKSwgbUZsYWdzKGZsYWdzKSwgbUlzU291bmRUcmlnZ2VyKGlzU291bmRUcmlnZ2VyKSwgbVNpbGVuY2VkKGZhbHNlKSB7fQorICAgIH5SZWNvcmRDbGllbnREZXNjcmlwdG9yKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICAgdXNpbmcgQ2xpZW50RGVzY3JpcHRvcjo6ZHVtcDsKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgpIGNvbnN0IG92ZXJyaWRlOworCisgICAgYXVkaW9fc291cmNlX3Qgc291cmNlKCkgY29uc3QgeyByZXR1cm4gbVNvdXJjZTsgfQorICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MoKSBjb25zdCB7IHJldHVybiBtRmxhZ3M7IH0KKyAgICBib29sIGlzU291bmRUcmlnZ2VyKCkgY29uc3QgeyByZXR1cm4gbUlzU291bmRUcmlnZ2VyOyB9CisgICAgdm9pZCBzZXRTaWxlbmNlZChib29sIHNpbGVuY2VkKSB7IG1TaWxlbmNlZCA9IHNpbGVuY2VkOyB9CisgICAgYm9vbCBpc1NpbGVuY2VkKCkgY29uc3QgeyByZXR1cm4gbVNpbGVuY2VkOyB9CisKK3ByaXZhdGU6CisgICAgY29uc3QgYXVkaW9fc291cmNlX3QgbVNvdXJjZTsKKyAgICBjb25zdCBhdWRpb19pbnB1dF9mbGFnc190IG1GbGFnczsKKyAgICBjb25zdCBib29sIG1Jc1NvdW5kVHJpZ2dlcjsKKyAgICAgICAgICBib29sIG1TaWxlbmNlZDsKK307CisKK2NsYXNzIFNvdXJjZUNsaWVudERlc2NyaXB0b3I6IHB1YmxpYyBUcmFja0NsaWVudERlc2NyaXB0b3IKK3sKK3B1YmxpYzoKKyAgICBTb3VyY2VDbGllbnREZXNjcmlwdG9yKGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkLCB1aWRfdCB1aWQsIGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9QYXRjaD4mIHBhdGNoRGVzYywgY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIHNyY0RldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCByb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5KTsKKyAgICB+U291cmNlQ2xpZW50RGVzY3JpcHRvcigpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIHNwPEF1ZGlvUGF0Y2g+IHBhdGNoRGVzYygpIGNvbnN0IHsgcmV0dXJuIG1QYXRjaERlc2M7IH0KKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBzcmNEZXZpY2UoKSBjb25zdCB7IHJldHVybiBtU3JjRGV2aWNlOyB9OworICAgIHdwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBzd091dHB1dCgpIGNvbnN0IHsgcmV0dXJuIG1Td091dHB1dDsgfQorICAgIHZvaWQgc2V0U3dPdXRwdXQoY29uc3Qgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+JiBzd091dHB1dCk7CisgICAgd3A8SHdBdWRpb091dHB1dERlc2NyaXB0b3I+IGh3T3V0cHV0KCkgY29uc3QgeyByZXR1cm4gbUh3T3V0cHV0OyB9CisgICAgdm9pZCBzZXRId091dHB1dChjb25zdCBzcDxId0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIGh3T3V0cHV0KTsKKworICAgIHVzaW5nIENsaWVudERlc2NyaXB0b3I6OmR1bXA7CisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdCBvdmVycmlkZTsKKworIHByaXZhdGU6CisgICAgY29uc3Qgc3A8QXVkaW9QYXRjaD4gbVBhdGNoRGVzYzsKKyAgICBjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiBtU3JjRGV2aWNlOworICAgIHdwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBtU3dPdXRwdXQ7CisgICAgd3A8SHdBdWRpb091dHB1dERlc2NyaXB0b3I+IG1Id091dHB1dDsKK307CisKK2NsYXNzIFNvdXJjZUNsaWVudENvbGxlY3Rpb24gOgorICAgIHB1YmxpYyBEZWZhdWx0S2V5ZWRWZWN0b3I8IGF1ZGlvX3BvcnRfaGFuZGxlX3QsIHNwPFNvdXJjZUNsaWVudERlc2NyaXB0b3I+ID4KK3sKK3B1YmxpYzoKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdDsKK307CisKK3R5cGVkZWYgc3RkOjp2ZWN0b3I8IHNwPFRyYWNrQ2xpZW50RGVzY3JpcHRvcj4gPiBUcmFja0NsaWVudFZlY3RvcjsKK3R5cGVkZWYgc3RkOjp2ZWN0b3I8IHNwPFJlY29yZENsaWVudERlc2NyaXB0b3I+ID4gUmVjb3JkQ2xpZW50VmVjdG9yOworCisvLyBBIE1hcCB0aGF0IGFzc29jaWF0ZXMgYSBwb3J0SWQgd2l0aCBhIGNsaWVudCAodHlwZSBUKQorLy8gd2hpY2ggaXMgZWl0aGVyIFRyYWNrQ2xpZW50RGVzY3JpcHRvciBvciBSZWNvcmRDbGllbnREZXNjcmlwdG9yLgorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorY2xhc3MgQ2xpZW50TWFwSGFuZGxlciB7CitwdWJsaWM6CisgICAgdmlydHVhbCB+Q2xpZW50TWFwSGFuZGxlcigpID0gZGVmYXVsdDsKKworICAgIC8vIFRyYWNrIGNsaWVudCBtYW5hZ2VtZW50CisgICAgdm9pZCBhZGRDbGllbnQoY29uc3Qgc3A8VD4gJmNsaWVudCkgeworICAgICAgICBjb25zdCBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCA9IGNsaWVudC0+cG9ydElkKCk7CisgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoIW1DbGllbnRzLmVtcGxhY2UocG9ydElkLCBjbGllbnQpLnNlY29uZCwKKyAgICAgICAgICAgICAgICAiJXMoJWQpOiBhdHRlbXB0aW5nIHRvIGFkZCBjbGllbnQgdGhhdCBhbHJlYWR5IGV4aXN0cyIsIF9fZnVuY19fLCBwb3J0SWQpOworICAgIH0KKyAgICBzcDxUPiBnZXRDbGllbnQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpIGNvbnN0IHsKKyAgICAgICAgYXV0byBpdCA9IG1DbGllbnRzLmZpbmQocG9ydElkKTsKKyAgICAgICAgaWYgKGl0ID09IG1DbGllbnRzLmVuZCgpKSByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgcmV0dXJuIGl0LT5zZWNvbmQ7CisgICAgfQorICAgIHZpcnR1YWwgdm9pZCByZW1vdmVDbGllbnQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpIHsKKyAgICAgICAgYXV0byBpdCA9IG1DbGllbnRzLmZpbmQocG9ydElkKTsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihpdCA9PSBtQ2xpZW50cy5lbmQoKSwKKyAgICAgICAgICAgICAgICAiJXMoJWQpOiBjbGllbnQgZG9lcyBub3QgZXhpc3QiLCBfX2Z1bmNfXywgcG9ydElkKTsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihpdC0+c2Vjb25kLT5hY3RpdmUoKSwKKyAgICAgICAgICAgICAgICAiJXMoJWQpOiByZW1vdmluZyBjbGllbnQgc3RpbGwgYWN0aXZlISIsIF9fZnVuY19fLCBwb3J0SWQpOworICAgICAgICAodm9pZCltQ2xpZW50cy5lcmFzZShpdCk7CisgICAgfQorICAgIHNpemVfdCBnZXRDbGllbnRDb3VudCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1DbGllbnRzLnNpemUoKTsKKyAgICB9CisgICAgdmlydHVhbCB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdCB7CisgICAgICAgIHNpemVfdCBpbmRleCA9IDA7CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgY2xpZW50OiBnZXRDbGllbnRJdGVyYWJsZSgpKSB7CisgICAgICAgICAgICBjbGllbnQtPmR1bXAoZHN0LCAyLCBpbmRleCsrKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIGhlbHBlciB0eXBlcworICAgIHVzaW5nIENsaWVudE1hcCA9IHN0ZDo6bWFwPGF1ZGlvX3BvcnRfaGFuZGxlX3QsIHNwPFQ+PjsKKyAgICB1c2luZyBDbGllbnRNYXBJdGVyYXRvciA9IHR5cGVuYW1lIENsaWVudE1hcDo6Y29uc3RfaXRlcmF0b3I7ICAvLyBDbGllbnRNYXAgaXMgY29uc3QgcXVhbGlmaWVkCisgICAgY2xhc3MgQ2xpZW50SXRlcmFibGUgeworICAgIHB1YmxpYzoKKyAgICAgICAgZXhwbGljaXQgQ2xpZW50SXRlcmFibGUoY29uc3QgQ2xpZW50TWFwSGFuZGxlcjxUPiAmcmVmKSA6IG1DbGllbnRNYXBIYW5kbGVyKHJlZikgeyB9CisKKyAgICAgICAgY2xhc3MgaXRlcmF0b3IgeworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICAvLyB0cmFpdHMKKyAgICAgICAgICAgIHVzaW5nIGl0ZXJhdG9yX2NhdGVnb3J5ID0gc3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZzsKKyAgICAgICAgICAgIHVzaW5nIHZhbHVlX3R5cGUgPSBzcDxUPjsKKyAgICAgICAgICAgIHVzaW5nIGRpZmZlcmVuY2VfdHlwZSA9IHB0cmRpZmZfdDsKKyAgICAgICAgICAgIHVzaW5nIHBvaW50ZXIgPSBjb25zdCBzcDxUPio7ICAgIC8vIE5vdGU6IGNvbnN0CisgICAgICAgICAgICB1c2luZyByZWZlcmVuY2UgPSBjb25zdCBzcDxUPiY7ICAvLyBOb3RlOiBjb25zdAorCisgICAgICAgICAgICAvLyBpbXBsZW1lbnRhdGlvbgorICAgICAgICAgICAgZXhwbGljaXQgaXRlcmF0b3IoY29uc3QgQ2xpZW50TWFwSXRlcmF0b3IgJml0KSA6IG1JdChpdCkgeyB9CisgICAgICAgICAgICBpdGVyYXRvciYgb3BlcmF0b3IrKygpICAgIC8qIHByZWZpeCAqLyAgICAgeyArK21JdDsgcmV0dXJuICp0aGlzOyB9CisgICAgICAgICAgICByZWZlcmVuY2Ugb3BlcmF0b3IqICgpIGNvbnN0ICAgICAgICAgICAgICAgeyByZXR1cm4gbUl0LT5zZWNvbmQ7IH0KKyAgICAgICAgICAgIHJlZmVyZW5jZSBvcGVyYXRvci0+KCkgY29uc3QgICAgICAgICAgICAgICB7IHJldHVybiBtSXQtPnNlY29uZDsgfSAvLyBhcyBpZiBzcDw+CisgICAgICAgICAgICBkaWZmZXJlbmNlX3R5cGUgb3BlcmF0b3ItKGNvbnN0IGl0ZXJhdG9yJiByaHMpIHtyZXR1cm4gbUl0IC0gcmhzLm1JdDsgfQorICAgICAgICAgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGl0ZXJhdG9yJiByaHMpIGNvbnN0IHsgcmV0dXJuIG1JdCA9PSByaHMubUl0OyB9CisgICAgICAgICAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgaXRlcmF0b3ImIHJocykgY29uc3QgeyByZXR1cm4gbUl0ICE9IHJocy5tSXQ7IH0KKyAgICAgICAgcHJpdmF0ZToKKyAgICAgICAgICAgIENsaWVudE1hcEl0ZXJhdG9yIG1JdDsKKyAgICAgICAgfTsKKworICAgICAgICBpdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIGl0ZXJhdG9ye21DbGllbnRNYXBIYW5kbGVyLm1DbGllbnRzLmJlZ2luKCl9OyB9CisgICAgICAgIGl0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIGl0ZXJhdG9ye21DbGllbnRNYXBIYW5kbGVyLm1DbGllbnRzLmVuZCgpfTsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgY29uc3QgQ2xpZW50TWFwSGFuZGxlcjxUPiYgbUNsaWVudE1hcEhhbmRsZXI7IC8vIGl0ZXJhdGluZyBkb2VzIG5vdCBtb2RpZnkgbWFwLgorICAgIH07CisKKyAgICAvLyByZXR1cm4gYW4gaXRlcmFibGUgb2JqZWN0IHRoYXQgY2FuIGJlIHVzZWQgaW4gYSByYW5nZS1iYXNlZC1mb3IgdG8gZW51bWVyYXRlIGNsaWVudHMuCisgICAgLy8gdGhpcyBpdGVyYWJsZSBkb2VzIG5vdCBhbGxvdyBtb2RpZmljYXRpb24sIGl0IHNob3VsZCBiZSB1c2VkIGFzIGEgdGVtcG9yYXJ5LgorICAgIENsaWVudEl0ZXJhYmxlIGdldENsaWVudEl0ZXJhYmxlKCkgY29uc3QgeworICAgICAgICByZXR1cm4gQ2xpZW50SXRlcmFibGV7KnRoaXN9OworICAgIH0KKworcHJpdmF0ZToKKyAgICAvLyBDbGllbnRNYXAgbWFwcyBhIHBvcnRJZCB0byBhIGNsaWVudCBkZXNjcmlwdG9yIChib3RoIHVuaXF1ZWx5IGlkZW50aWZ5IGVhY2ggb3RoZXIpLgorICAgIENsaWVudE1hcCBtQ2xpZW50czsKK307CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9EZXZpY2VEZXNjcmlwdG9yLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvRGV2aWNlRGVzY3JpcHRvci5oCmluZGV4IDkyYTRjM2UuLjgzZmIxMGMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9EZXZpY2VEZXNjcmlwdG9yLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0RldmljZURlc2NyaXB0b3IuaApAQCAtNTEsNyArNTEsNyBAQAogICAgIHZpcnR1YWwgdm9pZCBpbXBvcnRBdWRpb1BvcnQoY29uc3Qgc3A8QXVkaW9Qb3J0PiYgcG9ydCwgYm9vbCBmb3JjZSA9IGZhbHNlKTsKIAogICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgZ2V0SWQoKSBjb25zdDsKLSAgICBzdGF0dXNfdCBkdW1wKGludCBmZCwgaW50IHNwYWNlcywgaW50IGluZGV4LCBib29sIHZlcmJvc2UgPSB0cnVlKSBjb25zdDsKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgsIGJvb2wgdmVyYm9zZSA9IHRydWUpIGNvbnN0OwogICAgIHZvaWQgbG9nKCkgY29uc3Q7CiAKICAgICBTdHJpbmc4IG1BZGRyZXNzOwpAQCAtNzYsMTUgKzc2LDE2IEBACiAKICAgICBhdWRpb19kZXZpY2VzX3QgdHlwZXMoKSBjb25zdCB7IHJldHVybiBtRGV2aWNlVHlwZXM7IH0KIAotICAgIHNwPERldmljZURlc2NyaXB0b3I+IGdldERldmljZShhdWRpb19kZXZpY2VzX3QgdHlwZSwgY29uc3QgU3RyaW5nOCYgYWRkcmVzcykgY29uc3Q7Ci0gICAgRGV2aWNlVmVjdG9yIGdldERldmljZXNGcm9tVHlwZShhdWRpb19kZXZpY2VzX3QgdHlwZXMpIGNvbnN0OworICAgIC8vIElmICdhZGRyZXNzJyBpcyBlbXB0eSwgYSBkZXZpY2Ugd2l0aCBhIG5vbi1lbXB0eSBhZGRyZXNzIG1heSBiZSByZXR1cm5lZAorICAgIC8vIGlmIHRoZXJlIGlzIG5vIGRldmljZSB3aXRoIHRoZSBzcGVjaWZpZWQgJ3R5cGUnIGFuZCBlbXB0eSBhZGRyZXNzLgorICAgIHNwPERldmljZURlc2NyaXB0b3I+IGdldERldmljZShhdWRpb19kZXZpY2VzX3QgdHlwZSwgY29uc3QgU3RyaW5nOCAmYWRkcmVzcykgY29uc3Q7CisgICAgRGV2aWNlVmVjdG9yIGdldERldmljZXNGcm9tVHlwZU1hc2soYXVkaW9fZGV2aWNlc190IHR5cGVzKSBjb25zdDsKICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBnZXREZXZpY2VGcm9tSWQoYXVkaW9fcG9ydF9oYW5kbGVfdCBpZCkgY29uc3Q7CiAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZ2V0RGV2aWNlRnJvbVRhZ05hbWUoY29uc3QgU3RyaW5nOCAmdGFnTmFtZSkgY29uc3Q7Ci0gICAgRGV2aWNlVmVjdG9yIGdldERldmljZXNGcm9tVHlwZUFkZHIoYXVkaW9fZGV2aWNlc190IHR5cGUsIGNvbnN0IFN0cmluZzgmIGFkZHJlc3MpIGNvbnN0OworICAgIERldmljZVZlY3RvciBnZXREZXZpY2VzRnJvbUh3TW9kdWxlKGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGVIYW5kbGUpIGNvbnN0OworICAgIGF1ZGlvX2RldmljZXNfdCBnZXREZXZpY2VUeXBlc0Zyb21Id01vZHVsZShhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlSGFuZGxlKSBjb25zdDsKIAotICAgIGF1ZGlvX2RldmljZXNfdCBnZXREZXZpY2VzRnJvbUh3TW9kdWxlKGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGVIYW5kbGUpIGNvbnN0OwotCi0gICAgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGNvbnN0IFN0cmluZzggJnRhZywgaW50IHNwYWNlcyA9IDAsIGJvb2wgdmVyYm9zZSA9IHRydWUpIGNvbnN0OworICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QsIGNvbnN0IFN0cmluZzggJnRhZywgaW50IHNwYWNlcyA9IDAsIGJvb2wgdmVyYm9zZSA9IHRydWUpIGNvbnN0OwogCiBwcml2YXRlOgogICAgIHZvaWQgcmVmcmVzaFR5cGVzKCk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvRWZmZWN0RGVzY3JpcHRvci5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0VmZmVjdERlc2NyaXB0b3IuaAppbmRleCAwNDgzMWM2Li45ZmE3NDg2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvRWZmZWN0RGVzY3JpcHRvci5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9FZmZlY3REZXNjcmlwdG9yLmgKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtMjgsNyArMjksNyBAQAogY2xhc3MgRWZmZWN0RGVzY3JpcHRvciA6IHB1YmxpYyBSZWZCYXNlCiB7CiBwdWJsaWM6Ci0gICAgc3RhdHVzX3QgZHVtcChpbnQgZmQpOworICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0OwogCiAgICAgaW50IG1JbzsgICAgICAgICAgICAgICAgLy8gaW8gdGhlIGVmZmVjdCBpcyBhdHRhY2hlZCB0bwogICAgIHJvdXRpbmdfc3RyYXRlZ3kgbVN0cmF0ZWd5OyAvLyByb3V0aW5nIHN0cmF0ZWd5IHRoZSBlZmZlY3QgaXMgYXNzb2NpYXRlZCB0bwpAQCAtNTAsNyArNTEsNyBAQAogICAgIHVpbnQzMl90IGdldE1heEVmZmVjdHNNZW1vcnkoKSBjb25zdDsKICAgICBib29sIGlzTm9uT2ZmbG9hZGFibGVFZmZlY3RFbmFibGVkKCk7CiAKLSAgICBzdGF0dXNfdCBkdW1wKGludCBmZCk7CisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCkgY29uc3Q7CiAKIHByaXZhdGU6CiAgICAgc3RhdHVzX3Qgc2V0RWZmZWN0RW5hYmxlZChjb25zdCBzcDxFZmZlY3REZXNjcmlwdG9yPiAmZWZmZWN0RGVzYywgYm9vbCBlbmFibGVkKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9Id01vZHVsZS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0h3TW9kdWxlLmgKaW5kZXggY2I5ZjQ5ZS4uNjU2MDQzMSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0h3TW9kdWxlLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0h3TW9kdWxlLmgKQEAgLTgyLDcgKzgyLDcgQEAKICAgICB9CiAKICAgICAvLyBUT0RPIHJlbW92ZSBmcm9tIGhlcmUgKHNwbGl0IHNlcmlhbGl6YXRpb24pCi0gICAgdm9pZCBkdW1wKGludCBmZCk7CisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCkgY29uc3Q7CiAKIHByaXZhdGU6CiAgICAgdm9pZCByZWZyZXNoU3VwcG9ydGVkRGV2aWNlcygpOwpAQCAtMTA3LDkgKzEwNyw5IEBACiAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZ2V0RGV2aWNlRGVzY3JpcHRvcihjb25zdCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbWF0Y2hBZHJlc3MgPSB0cnVlKSBjb25zdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbWF0Y2hBZGRyZXNzID0gdHJ1ZSkgY29uc3Q7CiAKLSAgICBzdGF0dXNfdCBkdW1wKGludCBmZCkgY29uc3Q7CisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCkgY29uc3Q7CiB9OwogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvSU9Qcm9maWxlLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvSU9Qcm9maWxlLmgKaW5kZXggNjdhYzliYy4uZWIzMjk1OSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0lPUHJvZmlsZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9JT1Byb2ZpbGUuaApAQCAtNzMsNyArNzMsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBleGFjdE1hdGNoUmVxdWlyZWRGb3JJbnB1dEZsYWdzID0gZmFsc2UpIGNvbnN0OwogCi0gICAgdm9pZCBkdW1wKGludCBmZCk7CisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCkgY29uc3Q7CiAgICAgdm9pZCBsb2coKTsKIAogICAgIGJvb2wgaGFzU3VwcG9ydGVkRGV2aWNlcygpIGNvbnN0IHsgcmV0dXJuICFtU3VwcG9ydGVkRGV2aWNlcy5pc0VtcHR5KCk7IH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9JVm9sdW1lQ3VydmVzQ29sbGVjdGlvbi5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0lWb2x1bWVDdXJ2ZXNDb2xsZWN0aW9uLmgKaW5kZXggZTFmNmIwOC4uNzUwZGE1NSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0lWb2x1bWVDdXJ2ZXNDb2xsZWN0aW9uLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0lWb2x1bWVDdXJ2ZXNDb2xsZWN0aW9uLmgKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KICNpbmNsdWRlIDxWb2x1bWUuaD4KICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtNDcsNyArNDgsNyBAQAogICAgIHZpcnR1YWwgYm9vbCBoYXNWb2x1bWVJbmRleEZvckRldmljZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSkgY29uc3QgPSAwOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgdm9pZCBkdW1wKFN0cmluZzggKmRzdCkgY29uc3QgPSAwOwogfTsKIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL1NlcmlhbGl6ZXIuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9TZXJpYWxpemVyLmgKaW5kZXggMjlkZTg0OC4uNDhjNDE0NyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL1NlcmlhbGl6ZXIuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvU2VyaWFsaXplci5oCkBAIC0xNywyMjMgKzE3LDkgQEAKICNwcmFnbWEgb25jZQogCiAjaW5jbHVkZSAiQXVkaW9Qb2xpY3lDb25maWcuaCIKLSNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+Ci0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxzc3RyZWFtPgotI2luY2x1ZGUgPGZzdHJlYW0+Ci0KLXN0cnVjdCBfeG1sTm9kZTsKLXN0cnVjdCBfeG1sRG9jOwogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLXN0cnVjdCBBdWRpb0dhaW5UcmFpdHMKLXsKLSAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgdGFnOwotICAgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBjb2xsZWN0aW9uVGFnOwotCi0gICAgc3RydWN0IEF0dHJpYnV0ZXMKLSAgICB7Ci0gICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIG1vZGVbXTsgLyoqPCBnYWluIG1vZGVzIHN1cHBvcnRlZCwgZS5nLiBBVURJT19HQUlOX01PREVfQ0hBTk5FTFMuICovCi0gICAgICAgIC8qKiBjb250cm9sbGVkIGNoYW5uZWxzLCBuZWVkZWQgaWYgbW9kZSBBVURJT19HQUlOX01PREVfQ0hBTk5FTFMuICovCi0gICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIGNoYW5uZWxNYXNrW107Ci0gICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIG1pblZhbHVlTUJbXTsgLyoqPCBtaW4gdmFsdWUgaW4gbWlsbGliZWwuICovCi0gICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIG1heFZhbHVlTUJbXTsgLyoqPCBtYXggdmFsdWUgaW4gbWlsbGliZWwuICovCi0gICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIGRlZmF1bHRWYWx1ZU1CW107IC8qKjwgZGVmYXVsdCB2YWx1ZSBpbiBtaWxsaWJlbC4gKi8KLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgc3RlcFZhbHVlTUJbXTsgLyoqPCBzdGVwIHZhbHVlIGluIG1pbGxpYmVsLiAqLwotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBtaW5SYW1wTXNbXTsgLyoqPCBuZWVkZWQgaWYgbW9kZSBBVURJT19HQUlOX01PREVfUkFNUC4gKi8KLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgbWF4UmFtcE1zW107IC8qKjwgLm5lZWRlZCBpZiBtb2RlIEFVRElPX0dBSU5fTU9ERV9SQU1QICovCi0gICAgfTsKLQotICAgIHR5cGVkZWYgQXVkaW9HYWluIEVsZW1lbnQ7Ci0gICAgdHlwZWRlZiBzcDxFbGVtZW50PiBQdHJFbGVtZW50OwotICAgIHR5cGVkZWYgQXVkaW9HYWluQ29sbGVjdGlvbiBDb2xsZWN0aW9uOwotICAgIHR5cGVkZWYgdm9pZCAqUHRyU2VyaWFsaXppbmdDdHg7Ci0KLSAgICBzdGF0aWMgc3RhdHVzX3QgZGVzZXJpYWxpemUoX3htbERvYyAqZG9jLCBjb25zdCBfeG1sTm9kZSAqcm9vdCwgUHRyRWxlbWVudCAmZWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHRyU2VyaWFsaXppbmdDdHggc2VyaWFsaXppbmdDb250ZXh0KTsKLQotICAgIC8vIEdhaW4gaGFzIG5vIGNoaWxkCi19OwotCi0vLyBBIHByb2ZpbGUgc2VjdGlvbiBjb250YWlucyBhIG5hbWUsICBvbmUgYXVkaW8gZm9ybWF0IGFuZCB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQgc2FtcGxpbmcgcmF0ZXMKLS8vIGFuZCBjaGFubmVsIG1hc2tzIGZvciB0aGlzIGZvcm1hdAotc3RydWN0IEF1ZGlvUHJvZmlsZVRyYWl0cwotewotICAgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCB0YWc7Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGNvbGxlY3Rpb25UYWc7Ci0KLSAgICBzdHJ1Y3QgQXR0cmlidXRlcwotICAgIHsKLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgbmFtZVtdOwotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBzYW1wbGluZ1JhdGVzW107Ci0gICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIGZvcm1hdFtdOwotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBjaGFubmVsTWFza3NbXTsKLSAgICB9OwotCi0gICAgdHlwZWRlZiBBdWRpb1Byb2ZpbGUgRWxlbWVudDsKLSAgICB0eXBlZGVmIHNwPEF1ZGlvUHJvZmlsZT4gUHRyRWxlbWVudDsKLSAgICB0eXBlZGVmIEF1ZGlvUHJvZmlsZVZlY3RvciBDb2xsZWN0aW9uOwotICAgIHR5cGVkZWYgdm9pZCAqUHRyU2VyaWFsaXppbmdDdHg7Ci0KLSAgICBzdGF0aWMgc3RhdHVzX3QgZGVzZXJpYWxpemUoX3htbERvYyAqZG9jLCBjb25zdCBfeG1sTm9kZSAqcm9vdCwgUHRyRWxlbWVudCAmZWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHRyU2VyaWFsaXppbmdDdHggc2VyaWFsaXppbmdDb250ZXh0KTsKLX07Ci0KLXN0cnVjdCBNaXhQb3J0VHJhaXRzCi17Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHRhZzsKLSAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgY29sbGVjdGlvblRhZzsKLQotICAgIHN0cnVjdCBBdHRyaWJ1dGVzCi0gICAgewotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBuYW1lW107Ci0gICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIHJvbGVbXTsKLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgZmxhZ3NbXTsKLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgbWF4T3BlbkNvdW50W107Ci0gICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIG1heEFjdGl2ZUNvdW50W107Ci0gICAgfTsKLQotICAgIHR5cGVkZWYgSU9Qcm9maWxlIEVsZW1lbnQ7Ci0gICAgdHlwZWRlZiBzcDxFbGVtZW50PiBQdHJFbGVtZW50OwotICAgIHR5cGVkZWYgSU9Qcm9maWxlQ29sbGVjdGlvbiBDb2xsZWN0aW9uOwotICAgIHR5cGVkZWYgdm9pZCAqUHRyU2VyaWFsaXppbmdDdHg7Ci0KLSAgICBzdGF0aWMgc3RhdHVzX3QgZGVzZXJpYWxpemUoX3htbERvYyAqZG9jLCBjb25zdCBfeG1sTm9kZSAqcm9vdCwgUHRyRWxlbWVudCAmZWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHRyU2VyaWFsaXppbmdDdHggc2VyaWFsaXppbmdDb250ZXh0KTsKLQotICAgIC8vIENoaWxkcmVuIGFyZTogR2FpblRyYWl0cwotfTsKLQotc3RydWN0IERldmljZVBvcnRUcmFpdHMKLXsKLSAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgdGFnOwotICAgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBjb2xsZWN0aW9uVGFnOwotCi0gICAgc3RydWN0IEF0dHJpYnV0ZXMKLSAgICB7Ci0gICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIHRhZ05hbWVbXTsgLyoqPCAgPGRldmljZSB0YWcgbmFtZT46IGFueSBzdHJpbmcgd2l0aG91dCBzcGFjZS4gKi8KLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgdHlwZVtdOyAvKio8IDxkZXZpY2UgdHlwZT4uICovCi0gICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIHJvbGVbXTsgLyoqPCA8ZGV2aWNlIHJvbGU6IHNpbmsgb3Igc291cmNlPi4gKi8KLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgcm9sZVNvdXJjZVtdOyAvKio8IDxhdHRyaWJ1dGUgcm9sZSBzb3VyY2UgdmFsdWU+LiAqLwotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBhZGRyZXNzW107IC8qKjwgb3B0aW9uYWw6IGRldmljZSBhZGRyZXNzLCBjaGFyIHN0cmluZyBsZXNzIHRoYW4gNjQuICovCi0gICAgfTsKLSAgICB0eXBlZGVmIERldmljZURlc2NyaXB0b3IgRWxlbWVudDsKLSAgICB0eXBlZGVmIHNwPERldmljZURlc2NyaXB0b3I+IFB0ckVsZW1lbnQ7Ci0gICAgdHlwZWRlZiBEZXZpY2VWZWN0b3IgQ29sbGVjdGlvbjsKLSAgICB0eXBlZGVmIHZvaWQgKlB0clNlcmlhbGl6aW5nQ3R4OwotCi0gICAgc3RhdGljIHN0YXR1c190IGRlc2VyaWFsaXplKF94bWxEb2MgKmRvYywgY29uc3QgX3htbE5vZGUgKnJvb3QsIFB0ckVsZW1lbnQgJmVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB0clNlcmlhbGl6aW5nQ3R4IHNlcmlhbGl6aW5nQ29udGV4dCk7Ci0gICAgLy8gQ2hpbGRyZW4gYXJlOiBHYWluVHJhaXRzIChvcHRpb25uYWwpCi19OwotCi1zdHJ1Y3QgUm91dGVUcmFpdHMKLXsKLSAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgdGFnOwotICAgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBjb2xsZWN0aW9uVGFnOwotCi0gICAgc3RydWN0IEF0dHJpYnV0ZXMKLSAgICB7Ci0gICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIHR5cGVbXTsgLyoqPCA8cm91dGUgdHlwZT46IG1peCBvciBtdXguICovCi0gICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIHR5cGVNaXhbXTsgLyoqPCB0eXBlIGF0dHJpYnV0ZSBtaXggdmFsdWUuICovCi0gICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIHNpbmtbXTsgLyoqPCA8c2luazogaW52b2x2ZWQgaW4gdGhpcyByb3V0ZT4uICovCi0gICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIHNvdXJjZXNbXTsgLyoqPCBzb3VyY2VzOiBhbGwgc291cmNlIHRoYXQgY2FuIGJlIGludm9sdmVkIGluIHRoaXMgcm91dGUuICovCi0gICAgfTsKLSAgICB0eXBlZGVmIEF1ZGlvUm91dGUgRWxlbWVudDsKLSAgICB0eXBlZGVmIHNwPEF1ZGlvUm91dGU+IFB0ckVsZW1lbnQ7Ci0gICAgdHlwZWRlZiBBdWRpb1JvdXRlVmVjdG9yIENvbGxlY3Rpb247Ci0gICAgdHlwZWRlZiBId01vZHVsZSAqUHRyU2VyaWFsaXppbmdDdHg7Ci0KLSAgICBzdGF0aWMgc3RhdHVzX3QgZGVzZXJpYWxpemUoX3htbERvYyAqZG9jLCBjb25zdCBfeG1sTm9kZSAqcm9vdCwgUHRyRWxlbWVudCAmZWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHRyU2VyaWFsaXppbmdDdHggY3R4KTsKLX07Ci0KLXN0cnVjdCBNb2R1bGVUcmFpdHMKLXsKLSAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgdGFnOwotICAgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBjb2xsZWN0aW9uVGFnOwotCi0gICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGNoaWxkQXR0YWNoZWREZXZpY2VzVGFnOwotICAgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBjaGlsZEF0dGFjaGVkRGV2aWNlVGFnOwotICAgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBjaGlsZERlZmF1bHRPdXRwdXREZXZpY2VUYWc7Ci0KLSAgICBzdHJ1Y3QgQXR0cmlidXRlcwotICAgIHsKLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgbmFtZVtdOwotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciB2ZXJzaW9uW107Ci0gICAgfTsKLQotICAgIHR5cGVkZWYgSHdNb2R1bGUgRWxlbWVudDsKLSAgICB0eXBlZGVmIHNwPEVsZW1lbnQ+IFB0ckVsZW1lbnQ7Ci0gICAgdHlwZWRlZiBId01vZHVsZUNvbGxlY3Rpb24gQ29sbGVjdGlvbjsKLSAgICB0eXBlZGVmIEF1ZGlvUG9saWN5Q29uZmlnICpQdHJTZXJpYWxpemluZ0N0eDsKLQotICAgIHN0YXRpYyBzdGF0dXNfdCBkZXNlcmlhbGl6ZShfeG1sRG9jICpkb2MsIGNvbnN0IF94bWxOb2RlICpyb290LCBQdHJFbGVtZW50ICZlbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQdHJTZXJpYWxpemluZ0N0eCBzZXJpYWxpemluZ0NvbnRleHQpOwotCi0gICAgLy8gQ2hpbGRyZW4gYXJlOiBtaXhQb3J0VHJhaXRzLCBkZXZpY2VQb3J0VHJhaXRzIGFuZCByb3V0ZVRyYWl0cwotICAgIC8vIE5lZWQgdG8gY2FsbCBkZXNlcmlhbGl6ZSBvbiBlYWNoIGNoaWxkCi19OwotCi1zdHJ1Y3QgR2xvYmFsQ29uZmlnVHJhaXRzCi17Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHRhZzsKLQotICAgIHN0cnVjdCBBdHRyaWJ1dGVzCi0gICAgewotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBzcGVha2VyRHJjRW5hYmxlZFtdOwotICAgIH07Ci0KLSAgICBzdGF0aWMgc3RhdHVzX3QgZGVzZXJpYWxpemUoY29uc3QgX3htbE5vZGUgKnJvb3QsIEF1ZGlvUG9saWN5Q29uZmlnICZjb25maWcpOwotfTsKLQotc3RydWN0IFZvbHVtZVRyYWl0cwotewotICAgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCB0YWc7Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGNvbGxlY3Rpb25UYWc7Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHZvbHVtZVBvaW50VGFnOwotCi0gICAgc3RydWN0IEF0dHJpYnV0ZXMKLSAgICB7Ci0gICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIHN0cmVhbVtdOwotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBkZXZpY2VDYXRlZ29yeVtdOwotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciByZWZlcmVuY2VbXTsKLSAgICB9OwotCi0gICAgdHlwZWRlZiBWb2x1bWVDdXJ2ZSBFbGVtZW50OwotICAgIHR5cGVkZWYgc3A8Vm9sdW1lQ3VydmU+IFB0ckVsZW1lbnQ7Ci0gICAgdHlwZWRlZiBWb2x1bWVDdXJ2ZXNDb2xsZWN0aW9uIENvbGxlY3Rpb247Ci0gICAgdHlwZWRlZiB2b2lkICpQdHJTZXJpYWxpemluZ0N0eDsKLQotICAgIHN0YXRpYyBzdGF0dXNfdCBkZXNlcmlhbGl6ZShfeG1sRG9jICpkb2MsIGNvbnN0IF94bWxOb2RlICpyb290LCBQdHJFbGVtZW50ICZlbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQdHJTZXJpYWxpemluZ0N0eCBzZXJpYWxpemluZ0NvbnRleHQpOwotCi0gICAgLy8gTm8gQ2hpbGQKLX07Ci0KLWNsYXNzIFBvbGljeVNlcmlhbGl6ZXIKLXsKLXByaXZhdGU6Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHJvb3ROYW1lOwotCi0gICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHZlcnNpb25BdHRyaWJ1dGU7Ci0gICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGdNYWpvcjsgLyoqPCB0aGUgbWFqb3IgbnVtYmVyIG9mIHRoZSBwb2xpY3kgeG1sIGZvcm1hdCB2ZXJzaW9uLiAqLwotICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBnTWlub3I7IC8qKjwgdGhlIG1pbm9yIG51bWJlciBvZiB0aGUgcG9saWN5IHhtbCBmb3JtYXQgdmVyc2lvbi4gKi8KLQotcHVibGljOgotICAgIFBvbGljeVNlcmlhbGl6ZXIoKTsKLSAgICBzdGF0dXNfdCBkZXNlcmlhbGl6ZShjb25zdCBjaGFyICpzdHIsIEF1ZGlvUG9saWN5Q29uZmlnICZjb25maWcpOwotCi1wcml2YXRlOgotICAgIHR5cGVkZWYgQXVkaW9Qb2xpY3lDb25maWcgRWxlbWVudDsKLQotICAgIHN0ZDo6c3RyaW5nIG1Sb290RWxlbWVudE5hbWU7Ci0gICAgc3RkOjpzdHJpbmcgbVZlcnNpb247Ci0KLSAgICAvLyBDaGlsZHJlbiBhcmU6IE1vZHVsZXNUcmFpdHMsIFZvbHVtZVRyYWl0cwotfTsKK3N0YXR1c190IGRlc2VyaWFsaXplQXVkaW9Qb2xpY3lGaWxlKGNvbnN0IGNoYXIgKmZpbGVOYW1lLCBBdWRpb1BvbGljeUNvbmZpZyAqY29uZmlnKTsKIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL1Nlc3Npb25Sb3V0ZS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL1Nlc3Npb25Sb3V0ZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMmI0NDQwLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9TZXNzaW9uUm91dGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KLSNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBEZXZpY2VEZXNjcmlwdG9yOwotY2xhc3MgRGV2aWNlVmVjdG9yOwotCi1jbGFzcyBTZXNzaW9uUm91dGUgOiBwdWJsaWMgUmVmQmFzZQotewotcHVibGljOgotICAgIC8vIEZvciBJbnB1dCAoU291cmNlKSByb3V0ZXMsIHVzZSBTVFJFQU1fVFlQRV9OQSAoIk5BIiA9ICJub3QgYXBwbGljYWJsZSlmb3IgdGhlCi0gICAgLy8gc3RyZWFtVHlwZSBhcmd1bWVudAotICAgIHN0YXRpYyBjb25zdCBhdWRpb19zdHJlYW1fdHlwZV90IFNUUkVBTV9UWVBFX05BID0gQVVESU9fU1RSRUFNX0RFRkFVTFQ7Ci0KLSAgICAvLyBGb3IgT3V0cHV0IChTaW5rKSByb3V0ZXMsIHVzZSBTT1VSQ0VfVFlQRV9OQSAoIk5BIiA9ICJub3QgYXBwbGljYWJsZSIpIGZvciB0aGUKLSAgICAvLyBzb3VyY2UgYXJndW1lbnQKLQotICAgIHN0YXRpYyBjb25zdCBhdWRpb19zb3VyY2VfdCBTT1VSQ0VfVFlQRV9OQSA9IEFVRElPX1NPVVJDRV9ERUZBVUxUOwotCi0gICAgU2Vzc2lvblJvdXRlKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAotICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUsCi0gICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKLSAgICAgICAgICAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlRGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgdWlkX3QgdWlkKQotICAgICAgICA6IG1VaWQodWlkKSwKLSAgICAgICAgICBtU2Vzc2lvbihzZXNzaW9uKSwKLSAgICAgICAgICBtRGV2aWNlRGVzY3JpcHRvcihkZXZpY2VEZXNjcmlwdG9yKSwKLSAgICAgICAgICBtUmVmQ291bnQoMCksCi0gICAgICAgICAgbUFjdGl2aXR5Q291bnQoMCksCi0gICAgICAgICAgbUNoYW5nZWQoZmFsc2UpLAotICAgICAgICAgIG1TdHJlYW1UeXBlKHN0cmVhbVR5cGUpLAotICAgICAgICAgIG1Tb3VyY2Uoc291cmNlKQotICAgIHt9Ci0KLSAgICB2b2lkIGxvZyhjb25zdCBjaGFyKiBwcmVmaXgpOwotCi0gICAgYm9vbCBpc0FjdGl2ZU9yQ2hhbmdlZCgpIHsKLSAgICAgICAgcmV0dXJuIChtRGV2aWNlRGVzY3JpcHRvciAhPSAwKSAmJiAobUNoYW5nZWQgfHwgKG1BY3Rpdml0eUNvdW50ID4gMCkpOwotICAgIH0KLQotICAgIHVpZF90ICAgICAgICAgICAgICAgICAgICAgICBtVWlkOwotICAgIGF1ZGlvX3Nlc3Npb25fdCAgICAgICAgICAgICBtU2Vzc2lvbjsKLSAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiAgICAgICAgbURldmljZURlc2NyaXB0b3I7Ci0KLSAgICAvLyAicmVmZXJlbmNlIiBjb3VudGluZwotICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICBtUmVmQ291bnQ7ICAgICAgLy8gKy8tIG9uIHJlZmVyZW5jZXMKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgbUFjdGl2aXR5Q291bnQ7IC8vICsvLSBvbiBzdGFydC9zdG9wCi0gICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgIG1DaGFuZ2VkOwotICAgIC8vIGZvciBvdXRwdXRzCi0gICAgY29uc3QgYXVkaW9fc3RyZWFtX3R5cGVfdCAgIG1TdHJlYW1UeXBlOwotICAgIC8vIGZvciBpbnB1dHMKLSAgICBjb25zdCBhdWRpb19zb3VyY2VfdCAgICAgICAgbVNvdXJjZTsKLX07Ci0KLWNsYXNzIFNlc3Npb25Sb3V0ZU1hcDogcHVibGljIEtleWVkVmVjdG9yPGF1ZGlvX3Nlc3Npb25fdCwgc3A8U2Vzc2lvblJvdXRlPiA+Ci17Ci1wdWJsaWM6Ci0gICAgLy8gVGhlc2UgY29uc3RhbnRzIGlkZW50aWZ5IHRoZSBTZXNzaW9uUm91dE1hcCBhcyBob2xkaW5nIEVJVEhFUiBpbnB1dCByb3V0ZXMsCi0gICAgLy8gb3Igb3V0cHV0IHJvdXRlcy4gIEFuIGVycm9yIHdpbGwgb2NjdXIgaWYgYW4gYXR0ZW1wdCBpcyBtYWRlIHRvIGFkZCBhIFNlc3Npb25Sb3V0ZQotICAgIC8vIG9iamVjdCB3aXRoIG1TdHJlYW1UeXBlID09IFNUUkVBTV9UWVBFX05BIChpLmUuIGFuIGlucHV0IFNlc3Npb25Sb3V0ZSkgdG8gYQotICAgIC8vIFNlc3Npb25Sb3V0TWFwIHRoYXQgaXMgbWFya2VkIGZvciBvdXRwdXQgKGkuZS4gbU1hcFR5cGUgPT0gU0VTU0lPTl9ST1VURV9NQVBfT1VUUFVUKQotICAgIC8vIGFuZCBzaW1pbGFybHkgIGZvciBvdXRwdXQgU2Vzc2lvblJvdXRlcyBhbmQgSW5wdXQgU2Vzc2lvblJvdXRlTWFwcy4KLSAgICB0eXBlZGVmIGVudW0KLSAgICB7Ci0gICAgICAgIE1BUFRZUEVfSU5QVVQgPSAwLAotICAgICAgICBNQVBUWVBFX09VVFBVVCA9IDEKLSAgICB9IHNlc3Npb25fcm91dGVfbWFwX3R5cGVfdDsKLQotICAgIGV4cGxpY2l0IFNlc3Npb25Sb3V0ZU1hcChzZXNzaW9uX3JvdXRlX21hcF90eXBlX3QgbWFwVHlwZSkgOgotICAgICAgICBtTWFwVHlwZShtYXBUeXBlKQotICAgIHt9Ci0KLSAgICBib29sIGhhc1JvdXRlKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKLQotICAgIHZvaWQgcmVtb3ZlUm91dGUoYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOwotCi0gICAgaW50IGluY1JvdXRlQWN0aXZpdHkoYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOwotICAgIGludCBkZWNSb3V0ZUFjdGl2aXR5KGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKLSAgICBib29sIGdldEFuZENsZWFyUm91dGVDaGFuZ2VkKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsgLy8gYWxzbyBjbGVhcnMgdGhlIGNoYW5nZWQgZmxhZwotICAgIHZvaWQgbG9nKGNvbnN0IGNoYXIqIGNhcHRpb24pOwotICAgIGF1ZGlvX2RldmljZXNfdCBnZXRBY3RpdmVEZXZpY2VGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yJiBhdmFpbGFibGVEZXZpY2VzKTsKLSAgICAvLyBTcGVjaWZ5IGFuIE91dHB1dChTaW5rKSByb3V0ZSBieSBwYXNzaW5nIFNlc3Npb25Sb3V0ZTo6U09VUkNFX1RZUEVfTkEgaW4gdGhlCi0gICAgLy8gc291cmNlIGFyZ3VtZW50LgotICAgIC8vIFNwZWNpZnkgYW4gSW5wdXQoU291cmNlKSByb3V0IGJ5IHBhc3NpbmcgU2Vzc2lvblJvdXRlOjpBVURJT19TVFJFQU1fREVGQVVMVAotICAgIC8vIGluIHRoZSBzdHJlYW1UeXBlIGFyZ3VtZW50LgotICAgIHZvaWQgYWRkUm91dGUoYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUsCi0gICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCi0gICAgICAgICAgICAgICAgICBjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgZGV2aWNlRGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCk7Ci0KLXByaXZhdGU6Ci0gICAgLy8gVXNlZCB0byBtYXJrIGEgU2Vzc2lvblJvdXRlIGFzIGZvciBlaXRoZXIgaW5wdXRzIChtTWFwVHlwZSA9PSBrU2Vzc2lvblJvdXRlTWFwX0lucHV0KQotICAgIC8vIG9yIG91dHB1dHMgKG1NYXBUeXBlID09IGtTZXNzaW9uUm91dGVNYXBfT3V0cHV0KQotICAgIGNvbnN0IHNlc3Npb25fcm91dGVfbWFwX3R5cGVfdCBtTWFwVHlwZTsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9TdHJlYW1EZXNjcmlwdG9yLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvU3RyZWFtRGVzY3JpcHRvci5oCmluZGV4IDUwYjEwMzcuLjYyNjYzMTMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9TdHJlYW1EZXNjcmlwdG9yLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL1N0cmVhbURlc2NyaXB0b3IuaApAQCAtNDQsNyArNDQsNyBAQAogICAgICAgICByZXR1cm4gbUluZGV4Q3VyLmluZGV4T2ZLZXkoZGV2aWNlKSA+PSAwOwogICAgIH0KIAotICAgIHZvaWQgZHVtcChpbnQgZmQpIGNvbnN0OworICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0OwogCiAgICAgdm9pZCBzZXRWb2x1bWVDdXJ2ZVBvaW50KGRldmljZV9jYXRlZ29yeSBkZXZpY2VDYXRlZ29yeSwgY29uc3QgVm9sdW1lQ3VydmVQb2ludCAqcG9pbnQpOwogICAgIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgKmdldFZvbHVtZUN1cnZlUG9pbnQoZGV2aWNlX2NhdGVnb3J5IGRldmljZUNhdGVnb3J5KSBjb25zdApAQCAtOTYsNyArOTYsNyBAQAogICAgICAgICByZXR1cm4gdmFsdWVGb3Ioc3RyZWFtKS5oYXNWb2x1bWVJbmRleEZvckRldmljZShkZXZpY2UpOwogICAgIH0KIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQpIGNvbnN0OworICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0IG92ZXJyaWRlOwogCiBwcml2YXRlOgogICAgIHZvaWQgc2V0Vm9sdW1lQ3VydmVQb2ludChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgZGV2aWNlX2NhdGVnb3J5IGRldmljZUNhdGVnb3J5LApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL1ZvbHVtZUN1cnZlLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvVm9sdW1lQ3VydmUuaAppbmRleCAzZTZiMmI0Li43NmVjMTk4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvVm9sdW1lQ3VydmUuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvVm9sdW1lQ3VydmUuaApAQCAtNTksNyArNTksNyBAQAogCiAgICAgZmxvYXQgdm9sSW5kZXhUb0RiKGludCBpbmRleEluVWksIGludCB2b2xJbmRleE1pbiwgaW50IHZvbEluZGV4TWF4KSBjb25zdDsKIAotICAgIHZvaWQgZHVtcChpbnQgZmQpIGNvbnN0OworICAgIHZvaWQgZHVtcChTdHJpbmc4ICpyZXN1bHQpIGNvbnN0OwogCiBwcml2YXRlOgogICAgIFNvcnRlZFZlY3RvcjxDdXJ2ZVBvaW50PiBtQ3VydmVQb2ludHM7CkBAIC0xNDQsNyArMTQ0LDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHZvaWQgZHVtcChpbnQgZmQsIGludCBzcGFjZXMsIGJvb2wgY3VydmVQb2ludHMgPSBmYWxzZSkgY29uc3Q7CisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcywgYm9vbCBjdXJ2ZVBvaW50cyA9IGZhbHNlKSBjb25zdDsKIAogcHJpdmF0ZToKICAgICBLZXllZFZlY3RvcjxkZXZpY2VfY2F0ZWdvcnksIHNwPFZvbHVtZUN1cnZlPiA+IG1PcmlnaW5Wb2x1bWVDdXJ2ZXM7CkBAIC0yMTcsNyArMjE3LDcgQEAKICAgICAgICAgcmV0dXJuIGdldEN1cnZlc0ZvcihzdHJlYW0pLmhhc1ZvbHVtZUluZGV4Rm9yRGV2aWNlKGRldmljZSk7CiAgICAgfQogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCkgY29uc3Q7CisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCkgY29uc3Qgb3ZlcnJpZGU7CiAKICAgICBzc2l6ZV90IGFkZChjb25zdCBzcDxWb2x1bWVDdXJ2ZT4gJnZvbHVtZUN1cnZlKQogICAgIHsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvQ29sbGVjdGlvbnMuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9Db2xsZWN0aW9ucy5jcHAKaW5kZXggY2E2N2I4Ny4uYzkwYTU4MiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9Db2xsZWN0aW9ucy5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9Db2xsZWN0aW9ucy5jcHAKQEAgLTM1LDIyICszNSwxNiBAQAogICAgIHJldHVybiBudWxscHRyOwogfQogCi1zdGF0dXNfdCBBdWRpb1JvdXRlVmVjdG9yOjpkdW1wKGludCBmZCwgaW50IHNwYWNlcykgY29uc3QKK3ZvaWQgQXVkaW9Sb3V0ZVZlY3Rvcjo6ZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMpIGNvbnN0CiB7CiAgICAgaWYgKGlzRW1wdHkoKSkgewotICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcbiUqc0F1ZGlvIFJvdXRlcyAoJXp1KTpcbiIsIHNwYWNlcywgIiIsIHNpemUoKSk7Ci0gICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCJcbiUqc0F1ZGlvIFJvdXRlcyAoJXp1KTpcbiIsIHNwYWNlcywgIiIsIHNpemUoKSk7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIFJvdXRlICV6dTpcbiIsIHNwYWNlcywgIiIsIGkgKyAxKTsKLSAgICAgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwotICAgICAgICBpdGVtQXQoaSktPmR1bXAoZmQsIDQpOworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBSb3V0ZSAlenU6XG4iLCBzcGFjZXMsICIiLCBpICsgMSk7CisgICAgICAgIGl0ZW1BdChpKS0+ZHVtcChkc3QsIDQpOwogICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvR2Fpbi5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb0dhaW4uY3BwCmluZGV4IDE5M2Q0YTYuLjI3MjU4NzAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvR2Fpbi5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9HYWluLmNwcApAQCAtOTgsMzIgKzk4LDE3IEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi12b2lkIEF1ZGlvR2Fpbjo6ZHVtcChpbnQgZmQsIGludCBzcGFjZXMsIGludCBpbmRleCkgY29uc3QKK3ZvaWQgQXVkaW9HYWluOjpkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdAogewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotICAgIFN0cmluZzggcmVzdWx0OwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzR2FpbiAlZDpcbiIsIHNwYWNlcywgIiIsIGluZGV4KzEpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIG1vZGU6ICUwOHhcbiIsIHNwYWNlcywgIiIsIG1HYWluLm1vZGUpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIGNoYW5uZWxfbWFzazogJTA4eFxuIiwgc3BhY2VzLCAiIiwgbUdhaW4uY2hhbm5lbF9tYXNrKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBtaW5fdmFsdWU6ICVkIG1CXG4iLCBzcGFjZXMsICIiLCBtR2Fpbi5taW5fdmFsdWUpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIG1heF92YWx1ZTogJWQgbUJcbiIsIHNwYWNlcywgIiIsIG1HYWluLm1heF92YWx1ZSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gZGVmYXVsdF92YWx1ZTogJWQgbUJcbiIsIHNwYWNlcywgIiIsIG1HYWluLmRlZmF1bHRfdmFsdWUpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIHN0ZXBfdmFsdWU6ICVkIG1CXG4iLCBzcGFjZXMsICIiLCBtR2Fpbi5zdGVwX3ZhbHVlKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBtaW5fcmFtcF9tczogJWQgbXNcbiIsIHNwYWNlcywgIiIsIG1HYWluLm1pbl9yYW1wX21zKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBtYXhfcmFtcF9tczogJWQgbXNcbiIsIHNwYWNlcywgIiIsIG1HYWluLm1heF9yYW1wX21zKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0KLSAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzR2FpbiAlZDpcbiIsIHNwYWNlcywgIiIsIGluZGV4KzEpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIG1vZGU6ICUwOHhcbiIsIHNwYWNlcywgIiIsIG1HYWluLm1vZGUpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIGNoYW5uZWxfbWFzazogJTA4eFxuIiwgc3BhY2VzLCAiIiwgbUdhaW4uY2hhbm5lbF9tYXNrKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBtaW5fdmFsdWU6ICVkIG1CXG4iLCBzcGFjZXMsICIiLCBtR2Fpbi5taW5fdmFsdWUpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIG1heF92YWx1ZTogJWQgbUJcbiIsIHNwYWNlcywgIiIsIG1HYWluLm1heF92YWx1ZSk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gZGVmYXVsdF92YWx1ZTogJWQgbUJcbiIsIHNwYWNlcywgIiIsIG1HYWluLmRlZmF1bHRfdmFsdWUpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIHN0ZXBfdmFsdWU6ICVkIG1CXG4iLCBzcGFjZXMsICIiLCBtR2Fpbi5zdGVwX3ZhbHVlKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBtaW5fcmFtcF9tczogJWQgbXNcbiIsIHNwYWNlcywgIiIsIG1HYWluLm1pbl9yYW1wX21zKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBtYXhfcmFtcF9tczogJWQgbXNcbiIsIHNwYWNlcywgIiIsIG1HYWluLm1heF9yYW1wX21zKTsKIH0KIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9JbnB1dERlc2NyaXB0b3IuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9JbnB1dERlc2NyaXB0b3IuY3BwCmluZGV4IDFlMDY0MGMuLjFmMjk4NzQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvSW5wdXREZXNjcmlwdG9yLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb0lucHV0RGVzY3JpcHRvci5jcHAKQEAgLTE3LDIyICsxNywyMCBAQAogI2RlZmluZSBMT0dfVEFHICJBUE06OkF1ZGlvSW5wdXREZXNjcmlwdG9yIgogLy8jZGVmaW5lIExPR19OREVCVUcgMAogCisjaW5jbHVkZSA8bWVkaWEvQXVkaW9Qb2xpY3kuaD4KKyNpbmNsdWRlIDxwb2xpY3kuaD4KICNpbmNsdWRlIDxBdWRpb1BvbGljeUludGVyZmFjZS5oPgogI2luY2x1ZGUgIkF1ZGlvSW5wdXREZXNjcmlwdG9yLmgiCiAjaW5jbHVkZSAiSU9Qcm9maWxlLmgiCiAjaW5jbHVkZSAiQXVkaW9HYWluLmgiCiAjaW5jbHVkZSAiSHdNb2R1bGUuaCIKLSNpbmNsdWRlIDxtZWRpYS9BdWRpb1BvbGljeS5oPgotI2luY2x1ZGUgPHBvbGljeS5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIEF1ZGlvSW5wdXREZXNjcmlwdG9yOjpBdWRpb0lucHV0RGVzY3JpcHRvcihjb25zdCBzcDxJT1Byb2ZpbGU+JiBwcm9maWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlICpjbGllbnRJbnRlcmZhY2UpCi0gICAgOiBtSW9IYW5kbGUoMCksCi0gICAgICBtRGV2aWNlKEFVRElPX0RFVklDRV9OT05FKSwgbVBvbGljeU1peChOVUxMKSwKLSAgICAgIG1Qcm9maWxlKHByb2ZpbGUpLCBtUGF0Y2hIYW5kbGUoQVVESU9fUEFUQ0hfSEFORExFX05PTkUpLCBtSWQoMCksCi0gICAgICBtQ2xpZW50SW50ZXJmYWNlKGNsaWVudEludGVyZmFjZSkKKyAgICA6IG1Qcm9maWxlKHByb2ZpbGUpCisgICAgLCAgbUNsaWVudEludGVyZmFjZShjbGllbnRJbnRlcmZhY2UpCiB7CiAgICAgaWYgKHByb2ZpbGUgIT0gTlVMTCkgewogICAgICAgICBwcm9maWxlLT5waWNrQXVkaW9Qcm9maWxlKG1TYW1wbGluZ1JhdGUsIG1DaGFubmVsTWFzaywgbUZvcm1hdCk7CkBAIC01MCwxMSArNDgsNiBAQAogICAgIHJldHVybiBtUHJvZmlsZS0+Z2V0TW9kdWxlSGFuZGxlKCk7CiB9CiAKLXVpbnQzMl90IEF1ZGlvSW5wdXREZXNjcmlwdG9yOjpnZXRPcGVuUmVmQ291bnQoKSBjb25zdAotewotICAgIHJldHVybiBtU2Vzc2lvbnMuZ2V0T3BlbkNvdW50KCk7Ci19Ci0KIGF1ZGlvX3BvcnRfaGFuZGxlX3QgQXVkaW9JbnB1dERlc2NyaXB0b3I6OmdldElkKCkgY29uc3QKIHsKICAgICByZXR1cm4gbUlkOwpAQCAtMTE4LDU3ICsxMTEsNDUgQEAKICAgICBtUHJlZW1wdGVkU2Vzc2lvbnMuY2xlYXIoKTsKIH0KIAotYm9vbCBBdWRpb0lucHV0RGVzY3JpcHRvcjo6aXNBY3RpdmUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1TZXNzaW9ucy5oYXNBY3RpdmVTZXNzaW9uKCk7Ci19Ci0KIGJvb2wgQXVkaW9JbnB1dERlc2NyaXB0b3I6OmlzU291cmNlQWN0aXZlKGF1ZGlvX3NvdXJjZV90IHNvdXJjZSkgY29uc3QKIHsKLSAgICByZXR1cm4gbVNlc3Npb25zLmlzU291cmNlQWN0aXZlKHNvdXJjZSk7CisgICAgZm9yIChjb25zdCBhdXRvICZjbGllbnQgOiBnZXRDbGllbnRJdGVyYWJsZSgpKSB7CisgICAgICAgIGlmIChjbGllbnQtPmFjdGl2ZSgpICYmCisgICAgICAgICAgICAoKGNsaWVudC0+c291cmNlKCkgPT0gc291cmNlKSB8fAorICAgICAgICAgICAgICAgICgoc291cmNlID09IEFVRElPX1NPVVJDRV9WT0lDRV9SRUNPR05JVElPTikgJiYKKyAgICAgICAgICAgICAgICAgICAgKGNsaWVudC0+c291cmNlKCkgPT0gQVVESU9fU09VUkNFX0hPVFdPUkQpICYmCisgICAgICAgICAgICAgICAgICAgIGNsaWVudC0+aXNTb3VuZFRyaWdnZXIoKSkpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKIGF1ZGlvX3NvdXJjZV90IEF1ZGlvSW5wdXREZXNjcmlwdG9yOjpnZXRIaWdoZXN0UHJpb3JpdHlTb3VyY2UoYm9vbCBhY3RpdmVPbmx5KSBjb25zdAogeworICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSA9IEFVRElPX1NPVVJDRV9ERUZBVUxUOworICAgIGludDMyX3QgcHJpb3JpdHkgPSAtMTsKIAotICAgIHJldHVybiBtU2Vzc2lvbnMuZ2V0SGlnaGVzdFByaW9yaXR5U291cmNlKGFjdGl2ZU9ubHkpOworICAgIGZvciAoY29uc3QgYXV0byAmY2xpZW50IDogZ2V0Q2xpZW50SXRlcmFibGUoKSkgeworICAgICAgICBpZiAoYWN0aXZlT25seSAmJiAhY2xpZW50LT5hY3RpdmUoKSApIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGludDMyX3QgY3VyUHJpb3JpdHkgPSBzb3VyY2VfcHJpb3JpdHkoY2xpZW50LT5zb3VyY2UoKSk7CisgICAgICAgIGlmIChjdXJQcmlvcml0eSA+IHByaW9yaXR5KSB7CisgICAgICAgICAgICBwcmlvcml0eSA9IGN1clByaW9yaXR5OworICAgICAgICAgICAgc291cmNlID0gY2xpZW50LT5zb3VyY2UoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc291cmNlOwogfQogCiBib29sIEF1ZGlvSW5wdXREZXNjcmlwdG9yOjppc1NvdW5kVHJpZ2dlcigpIGNvbnN0IHsKLSAgICAvLyBzb3VuZCB0cmlnZ2VyIGFuZCBub24gc291bmQgdHJpZ2dlciBzZXNzaW9ucyBhcmUgbm90IG1peGVkCi0gICAgLy8gb24gYSBnaXZlbiBpbnB1dAotICAgIHJldHVybiBtU2Vzc2lvbnMudmFsdWVBdCgwKS0+aXNTb3VuZFRyaWdnZXIoKTsKLX0KLQotc3A8QXVkaW9TZXNzaW9uPiBBdWRpb0lucHV0RGVzY3JpcHRvcjo6Z2V0QXVkaW9TZXNzaW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1TZXNzaW9ucy52YWx1ZUZvcihzZXNzaW9uKTsKLX0KLQotQXVkaW9TZXNzaW9uQ29sbGVjdGlvbiBBdWRpb0lucHV0RGVzY3JpcHRvcjo6Z2V0QXVkaW9TZXNzaW9ucyhib29sIGFjdGl2ZU9ubHkpIGNvbnN0Ci17Ci0gICAgaWYgKGFjdGl2ZU9ubHkpIHsKLSAgICAgICAgcmV0dXJuIG1TZXNzaW9ucy5nZXRBY3RpdmVTZXNzaW9ucygpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBtU2Vzc2lvbnM7CisgICAgLy8gc291bmQgdHJpZ2dlciBhbmQgbm9uIHNvdW5kIHRyaWdnZXIgY2xpZW50cyBhcmUgbm90IG1peGVkIG9uIGEgZ2l2ZW4gaW5wdXQKKyAgICAvLyBzbyBjaGVjayBvbmx5IGZpcnN0IGNsaWVudAorICAgIGlmIChnZXRDbGllbnRDb3VudCgpID09IDApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLX0KLQotc2l6ZV90IEF1ZGlvSW5wdXREZXNjcmlwdG9yOjpnZXRBdWRpb1Nlc3Npb25Db3VudChib29sIGFjdGl2ZU9ubHkpIGNvbnN0Ci17Ci0gICAgaWYgKGFjdGl2ZU9ubHkpIHsKLSAgICAgICAgcmV0dXJuIG1TZXNzaW9ucy5nZXRBY3RpdmVTZXNzaW9uQ291bnQoKTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gbVNlc3Npb25zLnNpemUoKTsKLSAgICB9Ci19Ci0KLXN0YXR1c190IEF1ZGlvSW5wdXREZXNjcmlwdG9yOjphZGRBdWRpb1Nlc3Npb24oYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9TZXNzaW9uPiYgYXVkaW9TZXNzaW9uKSB7Ci0gICAgcmV0dXJuIG1TZXNzaW9ucy5hZGRTZXNzaW9uKHNlc3Npb24sIGF1ZGlvU2Vzc2lvbiwgLypBdWRpb1Nlc3Npb25JbmZvUHJvdmlkZXIqL3RoaXMpOwotfQotCi1zdGF0dXNfdCBBdWRpb0lucHV0RGVzY3JpcHRvcjo6cmVtb3ZlQXVkaW9TZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKSB7Ci0gICAgcmV0dXJuIG1TZXNzaW9ucy5yZW1vdmVTZXNzaW9uKHNlc3Npb24pOworICAgIHJldHVybiBnZXRDbGllbnRJdGVyYWJsZSgpLmJlZ2luKCktPmlzU291bmRUcmlnZ2VyKCk7CiB9CiAKIGF1ZGlvX3BhdGNoX2hhbmRsZV90IEF1ZGlvSW5wdXREZXNjcmlwdG9yOjpnZXRQYXRjaEhhbmRsZSgpIGNvbnN0CkBAIC0xNzksNyArMTYwLDExIEBACiB2b2lkIEF1ZGlvSW5wdXREZXNjcmlwdG9yOjpzZXRQYXRjaEhhbmRsZShhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpCiB7CiAgICAgbVBhdGNoSGFuZGxlID0gaGFuZGxlOwotICAgIG1TZXNzaW9ucy5vblNlc3Npb25JbmZvVXBkYXRlKCk7CisgICAgZm9yIChjb25zdCBhdXRvICZjbGllbnQgOiBnZXRDbGllbnRJdGVyYWJsZSgpKSB7CisgICAgICAgIGlmIChjbGllbnQtPmFjdGl2ZSgpKSB7CisgICAgICAgICAgICB1cGRhdGVDbGllbnRSZWNvcmRpbmdDb25maWd1cmF0aW9uKFJFQ09SRF9DT05GSUdfRVZFTlRfU1RBUlQsIGNsaWVudCk7CisgICAgICAgIH0KKyAgICB9CiB9CiAKIGF1ZGlvX2NvbmZpZ19iYXNlX3QgQXVkaW9JbnB1dERlc2NyaXB0b3I6OmdldENvbmZpZygpIGNvbnN0CkBAIC0yMzksNyArMjI0LDcgQEAKIAogc3RhdHVzX3QgQXVkaW9JbnB1dERlc2NyaXB0b3I6OnN0YXJ0KCkKIHsKLSAgICBpZiAoZ2V0QXVkaW9TZXNzaW9uQ291bnQodHJ1ZS8qYWN0aXZlT25seSovKSA9PSAxKSB7CisgICAgaWYgKG1HbG9iYWxBY3RpdmVDb3VudCA9PSAxKSB7CiAgICAgICAgIGlmICghbVByb2ZpbGUtPmNhblN0YXJ0TmV3SW8oKSkgewogICAgICAgICAgICAgQUxPR0koIiVzIG1Qcm9maWxlLT5jdXJBY3RpdmVDb3VudCAlZCIsIF9fZnVuY19fLCBtUHJvZmlsZS0+Y3VyQWN0aXZlQ291bnQpOwogICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwpAQCAtMjY2LDM4ICsyNTEsMTA1IEBACiAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYobVByb2ZpbGUtPmN1ck9wZW5Db3VudCA8IDEsICIlcyBwcm9maWxlIG9wZW4gY291bnQgJXUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbVByb2ZpbGUtPmN1ck9wZW5Db3VudCk7CiAgICAgICAgIC8vIGRvIG5vdCBjYWxsIHN0b3AoKSBoZXJlIGFzIHN0b3AoKSBpcyBzdXBwb3NlZCB0byBiZSBjYWxsZWQgYWZ0ZXIKLSAgICAgICAgLy8gQXVkaW9TZXNzaW9uOjpjaGFuZ2VBY3RpdmVDb3VudCgtMSkgYW5kIHdlIGRvbid0IGtub3cgaG93IG1hbnkgc2Vzc2lvbnMKKyAgICAgICAgLy8gIHNldENsaWVudEFjdGl2ZShjbGllbnQsIGZhbHNlKSBhbmQgd2UgZG9uJ3Qga25vdyBob3cgbWFueSBjbGllbnRzCiAgICAgICAgIC8vIGFyZSBzdGlsbCBhY3RpdmUgYXQgdGhpcyB0aW1lCiAgICAgICAgIGlmIChpc0FjdGl2ZSgpKSB7CiAgICAgICAgICAgICBtUHJvZmlsZS0+Y3VyQWN0aXZlQ291bnQtLTsKICAgICAgICAgfQogICAgICAgICBtUHJvZmlsZS0+Y3VyT3BlbkNvdW50LS07CisgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYobVByb2ZpbGUtPmN1ck9wZW5Db3VudCA8ICBtUHJvZmlsZS0+Y3VyQWN0aXZlQ291bnQsCisgICAgICAgICAgICAgICAgIiVzKCVkKTogbVByb2ZpbGUtPmN1ck9wZW5Db3VudCAlZCA8IG1Qcm9maWxlLT5jdXJBY3RpdmVDb3VudCAlZC4iLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtSWQsIG1Qcm9maWxlLT5jdXJPcGVuQ291bnQsIG1Qcm9maWxlLT5jdXJBY3RpdmVDb3VudCk7CiAgICAgICAgIG1Jb0hhbmRsZSA9IEFVRElPX0lPX0hBTkRMRV9OT05FOwogICAgIH0KIH0KIAotc3RhdHVzX3QgQXVkaW9JbnB1dERlc2NyaXB0b3I6OmR1bXAoaW50IGZkKQordm9pZCBBdWRpb0lucHV0RGVzY3JpcHRvcjo6c2V0Q2xpZW50QWN0aXZlKGNvbnN0IHNwPFJlY29yZENsaWVudERlc2NyaXB0b3I+JiBjbGllbnQsIGJvb2wgYWN0aXZlKQogewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotICAgIFN0cmluZzggcmVzdWx0OworICAgIExPR19BTFdBWVNfRkFUQUxfSUYoZ2V0Q2xpZW50KGNsaWVudC0+cG9ydElkKCkpID09IG51bGxwdHIsCisgICAgICAgICIlcyglZCkgZG9lcyBub3QgZXhpc3Qgb24gaW5wdXQgZGVzY3JpcHRvciIsIF9fZnVuY19fLCBjbGllbnQtPnBvcnRJZCgpKTsKKyAgICBpZiAoYWN0aXZlID09IGNsaWVudC0+YWN0aXZlKCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KIAotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBJRDogJWRcbiIsIGdldElkKCkpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgU2FtcGxpbmcgcmF0ZTogJWRcbiIsIG1TYW1wbGluZ1JhdGUpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgRm9ybWF0OiAlZFxuIiwgbUZvcm1hdCk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBDaGFubmVsczogJTA4eFxuIiwgbUNoYW5uZWxNYXNrKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIERldmljZXMgJTA4eFxuIiwgbURldmljZSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIC8vIEhhbmRsZSBub24tY2xpZW50LXNwZWNpZmljIGFjdGl2aXR5IHJlZiBjb3VudAorICAgIGludDMyX3Qgb2xkR2xvYmFsQWN0aXZlQ291bnQgPSBtR2xvYmFsQWN0aXZlQ291bnQ7CisgICAgaWYgKCFhY3RpdmUgJiYgbUdsb2JhbEFjdGl2ZUNvdW50IDwgMSkgeworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCIlcyglZCkgaW52YWxpZCBkZWFjdGl2YXRpb24gd2l0aCBnbG9iYWxBY3RpdmVDb3VudCAlZCIsCisgICAgICAgICAgICAgICBfX2Z1bmNfXywgY2xpZW50LT5wb3J0SWQoKSwgbUdsb2JhbEFjdGl2ZUNvdW50KTsKKyAgICAgICAgLy8gbUdsb2JhbEFjdGl2ZUNvdW50ID0gMTsKKyAgICB9CisgICAgY29uc3QgaW50IGRlbHRhID0gYWN0aXZlID8gMSA6IC0xOworICAgIG1HbG9iYWxBY3RpdmVDb3VudCArPSBkZWx0YTsKIAotICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOworICAgIGlmICgob2xkR2xvYmFsQWN0aXZlQ291bnQgPT0gMCkgJiYgKG1HbG9iYWxBY3RpdmVDb3VudCA+IDApKSB7CisgICAgICAgIGlmICgobVBvbGljeU1peCAhPSBOVUxMKSAmJiAoKG1Qb2xpY3lNaXgtPm1DYkZsYWdzICYgQXVkaW9NaXg6OmtDYkZsYWdOb3RpZnlBY3Rpdml0eSkgIT0gMCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1DbGllbnRJbnRlcmZhY2UtPm9uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKG1Qb2xpY3lNaXgtPm1EZXZpY2VBZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUlYX1NUQVRFX01JWElORyk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKChvbGRHbG9iYWxBY3RpdmVDb3VudCA+IDApICYmIChtR2xvYmFsQWN0aXZlQ291bnQgPT0gMCkpIHsKKyAgICAgICAgaWYgKChtUG9saWN5TWl4ICE9IE5VTEwpICYmICgobVBvbGljeU1peC0+bUNiRmxhZ3MgJiBBdWRpb01peDo6a0NiRmxhZ05vdGlmeUFjdGl2aXR5KSAhPSAwKSkKKyAgICAgICAgeworICAgICAgICAgICAgbUNsaWVudEludGVyZmFjZS0+b25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUobVBvbGljeU1peC0+bURldmljZUFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNSVhfU1RBVEVfSURMRSk7CisgICAgICAgIH0KKyAgICB9CiAKLSAgICBtU2Vzc2lvbnMuZHVtcChmZCwgMSk7CisgICAgY2xpZW50LT5zZXRBY3RpdmUoYWN0aXZlKTsKIAotICAgIHJldHVybiBOT19FUlJPUjsKKyAgICBpbnQgZXZlbnQgPSBhY3RpdmUgPyBSRUNPUkRfQ09ORklHX0VWRU5UX1NUQVJUIDogUkVDT1JEX0NPTkZJR19FVkVOVF9TVE9QOworICAgIHVwZGF0ZUNsaWVudFJlY29yZGluZ0NvbmZpZ3VyYXRpb24oZXZlbnQsIGNsaWVudCk7CisKK30KKwordm9pZCBBdWRpb0lucHV0RGVzY3JpcHRvcjo6dXBkYXRlQ2xpZW50UmVjb3JkaW5nQ29uZmlndXJhdGlvbigKKyAgICBpbnQgZXZlbnQsIGNvbnN0IHNwPFJlY29yZENsaWVudERlc2NyaXB0b3I+JiBjbGllbnQpCit7CisgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCBzZXNzaW9uQ29uZmlnID0gY2xpZW50LT5jb25maWcoKTsKKyAgICBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCByZWNvcmRDbGllbnRJbmZve2NsaWVudC0+dWlkKCksIGNsaWVudC0+c2Vzc2lvbigpLCBjbGllbnQtPnNvdXJjZSgpfTsKKyAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90IGNvbmZpZyA9IGdldENvbmZpZygpOworICAgIG1DbGllbnRJbnRlcmZhY2UtPm9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShldmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlY29yZENsaWVudEluZm8sICZzZXNzaW9uQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29uZmlnLCBtUGF0Y2hIYW5kbGUpOworfQorCitSZWNvcmRDbGllbnRWZWN0b3IgQXVkaW9JbnB1dERlc2NyaXB0b3I6OmdldENsaWVudHNGb3JTZXNzaW9uKAorICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQoreworICAgIFJlY29yZENsaWVudFZlY3RvciBjbGllbnRzOworICAgIGZvciAoY29uc3QgYXV0byAmY2xpZW50IDogZ2V0Q2xpZW50SXRlcmFibGUoKSkgeworICAgICAgICBpZiAoY2xpZW50LT5zZXNzaW9uKCkgPT0gc2Vzc2lvbikgeworICAgICAgICAgICAgY2xpZW50cy5wdXNoX2JhY2soY2xpZW50KTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gY2xpZW50czsKK30KKworUmVjb3JkQ2xpZW50VmVjdG9yIEF1ZGlvSW5wdXREZXNjcmlwdG9yOjpjbGllbnRzTGlzdChib29sIGFjdGl2ZU9ubHksIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwcmVmZXJyZWREZXZpY2VPbmx5KSBjb25zdAoreworICAgIFJlY29yZENsaWVudFZlY3RvciBjbGllbnRzOworICAgIGZvciAoY29uc3QgYXV0byAmY2xpZW50IDogZ2V0Q2xpZW50SXRlcmFibGUoKSkgeworICAgICAgICBpZiAoKCFhY3RpdmVPbmx5IHx8IGNsaWVudC0+YWN0aXZlKCkpCisgICAgICAgICAgICAmJiAoc291cmNlID09IEFVRElPX1NPVVJDRV9ERUZBVUxUIHx8IHNvdXJjZSA9PSBjbGllbnQtPnNvdXJjZSgpKQorICAgICAgICAgICAgJiYgKCFwcmVmZXJyZWREZXZpY2VPbmx5IHx8IGNsaWVudC0+aGFzUHJlZmVycmVkRGV2aWNlKCkpKSB7CisgICAgICAgICAgICBjbGllbnRzLnB1c2hfYmFjayhjbGllbnQpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBjbGllbnRzOworfQorCit2b2lkIEF1ZGlvSW5wdXREZXNjcmlwdG9yOjpkdW1wKFN0cmluZzggKmRzdCkgY29uc3QKK3sKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIElEOiAlZFxuIiwgZ2V0SWQoKSk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBTYW1wbGluZyByYXRlOiAlZFxuIiwgbVNhbXBsaW5nUmF0ZSk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBGb3JtYXQ6ICVkXG4iLCBtRm9ybWF0KTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIENoYW5uZWxzOiAlMDh4XG4iLCBtQ2hhbm5lbE1hc2spOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgRGV2aWNlcyAlMDh4XG4iLCBtRGV2aWNlKTsKKyAgICBkc3QtPmFwcGVuZCgiIEF1ZGlvUmVjb3JkIENsaWVudHM6XG4iKTsKKyAgICBDbGllbnRNYXBIYW5kbGVyPFJlY29yZENsaWVudERlc2NyaXB0b3I+OjpkdW1wKGRzdCk7CisgICAgZHN0LT5hcHBlbmQoIlxuIik7CiB9CiAKIGJvb2wgQXVkaW9JbnB1dENvbGxlY3Rpb246OmlzU291cmNlQWN0aXZlKGF1ZGlvX3NvdXJjZV90IHNvdXJjZSkgY29uc3QKQEAgLTM1OCwyMCArNDEwLDI0IEBACiAgICAgcmV0dXJuIGRldmljZXM7CiB9CiAKLXN0YXR1c190IEF1ZGlvSW5wdXRDb2xsZWN0aW9uOjpkdW1wKGludCBmZCkgY29uc3QKK3NwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBBdWRpb0lucHV0Q29sbGVjdGlvbjo6Z2V0SW5wdXRGb3JDbGllbnQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiB7Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcbklucHV0cyBkdW1wOlxuIik7Ci0gICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiLSBJbnB1dCAlZCBkdW1wOlxuIiwga2V5QXQoaSkpOwotICAgICAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7Ci0gICAgICAgIHZhbHVlQXQoaSktPmR1bXAoZmQpOworICAgICAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gdmFsdWVBdChpKTsKKyAgICAgICAgaWYgKGlucHV0RGVzYy0+Z2V0Q2xpZW50KHBvcnRJZCkgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgcmV0dXJuIGlucHV0RGVzYzsKKyAgICAgICAgfQogICAgIH0KKyAgICByZXR1cm4gMDsKK30KIAotICAgIHJldHVybiBOT19FUlJPUjsKK3ZvaWQgQXVkaW9JbnB1dENvbGxlY3Rpb246OmR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdAoreworICAgIGRzdC0+YXBwZW5kKCJcbklucHV0cyBkdW1wOlxuIik7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiLSBJbnB1dCAlZCBkdW1wOlxuIiwga2V5QXQoaSkpOworICAgICAgICB2YWx1ZUF0KGkpLT5kdW1wKGRzdCk7CisgICAgfQogfQogCiB9OyAvL25hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb091dHB1dERlc2NyaXB0b3IuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9PdXRwdXREZXNjcmlwdG9yLmNwcAppbmRleCA5OWI0NWM4Li40Y2U2YjA4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb091dHB1dERlc2NyaXB0b3IuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvT3V0cHV0RGVzY3JpcHRvci5jcHAKQEAgLTM0LDEyICszNCwxMiBAQAogCiBBdWRpb091dHB1dERlc2NyaXB0b3I6OkF1ZGlvT3V0cHV0RGVzY3JpcHRvcihjb25zdCBzcDxBdWRpb1BvcnQ+JiBwb3J0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgKmNsaWVudEludGVyZmFjZSkKLSAgICA6IG1Qb3J0KHBvcnQpLCBtRGV2aWNlKEFVRElPX0RFVklDRV9OT05FKSwKLSAgICAgIG1DbGllbnRJbnRlcmZhY2UoY2xpZW50SW50ZXJmYWNlKSwgbVBhdGNoSGFuZGxlKEFVRElPX1BBVENIX0hBTkRMRV9OT05FKSwgbUlkKDApCisgICAgOiBtUG9ydChwb3J0KQorICAgICwgbUNsaWVudEludGVyZmFjZShjbGllbnRJbnRlcmZhY2UpCiB7CiAgICAgLy8gY2xlYXIgdXNhZ2UgY291bnQgZm9yIGFsbCBzdHJlYW0gdHlwZXMKICAgICBmb3IgKGludCBpID0gMDsgaSA8IEFVRElPX1NUUkVBTV9DTlQ7IGkrKykgewotICAgICAgICBtUmVmQ291bnRbaV0gPSAwOworICAgICAgICBtQWN0aXZlQ291bnRbaV0gPSAwOwogICAgICAgICBtQ3VyVm9sdW1lW2ldID0gLTEuMDsKICAgICAgICAgbU11dGVDb3VudFtpXSA9IDA7CiAgICAgICAgIG1TdG9wVGltZVtpXSA9IDA7CkBAIC01NSwxMSArNTUsMjggQEAKICAgICB9CiB9CiAKK2F1ZGlvX2NvbmZpZ19iYXNlX3QgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjpnZXRDb25maWcoKSBjb25zdAoreworICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgY29uZmlnID0geyAuc2FtcGxlX3JhdGUgPSBtU2FtcGxpbmdSYXRlLCAuY2hhbm5lbF9tYXNrID0gbUNoYW5uZWxNYXNrLAorICAgICAgICAgICAgLmZvcm1hdCA9IG1Gb3JtYXQgfTsKKyAgICByZXR1cm4gY29uZmlnOworfQorCiBhdWRpb19tb2R1bGVfaGFuZGxlX3QgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjpnZXRNb2R1bGVIYW5kbGUoKSBjb25zdAogewogICAgIHJldHVybiBtUG9ydC5nZXQoKSAhPSBudWxscHRyID8gbVBvcnQtPmdldE1vZHVsZUhhbmRsZSgpIDogQVVESU9fTU9EVUxFX0hBTkRMRV9OT05FOwogfQogCithdWRpb19wYXRjaF9oYW5kbGVfdCBBdWRpb091dHB1dERlc2NyaXB0b3I6OmdldFBhdGNoSGFuZGxlKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbVBhdGNoSGFuZGxlOworfQorCit2b2lkIEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6c2V0UGF0Y2hIYW5kbGUoYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKQoreworICAgIG1QYXRjaEhhbmRsZSA9IGhhbmRsZTsKK30KKwogYXVkaW9fcG9ydF9oYW5kbGVfdCBBdWRpb091dHB1dERlc2NyaXB0b3I6OmdldElkKCkgY29uc3QKIHsKICAgICByZXR1cm4gbUlkOwpAQCAtODYsMTcgKzEwMyw3OCBAQAogICAgIH0KIH0KIAotdm9pZCBBdWRpb091dHB1dERlc2NyaXB0b3I6OmNoYW5nZVJlZkNvdW50KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWx0YSkKK3ZvaWQgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjpjaGFuZ2VTdHJlYW1BY3RpdmVDb3VudChjb25zdCBzcDxUcmFja0NsaWVudERlc2NyaXB0b3I+JiBjbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbHRhKQogewotICAgIGlmICgoZGVsdGEgKyAoaW50KW1SZWZDb3VudFtzdHJlYW1dKSA8IDApIHsKLSAgICAgICAgQUxPR1coImNoYW5nZVJlZkNvdW50KCkgaW52YWxpZCBkZWx0YSAlZCBmb3Igc3RyZWFtICVkLCByZWZDb3VudCAlZCIsCi0gICAgICAgICAgICAgIGRlbHRhLCBzdHJlYW0sIG1SZWZDb3VudFtzdHJlYW1dKTsKLSAgICAgICAgbVJlZkNvdW50W3N0cmVhbV0gPSAwOworICAgIGlmIChkZWx0YSA9PSAwKSByZXR1cm47CisgICAgY29uc3QgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0gPSBjbGllbnQtPnN0cmVhbSgpOworICAgIGlmICgoZGVsdGEgKyAoaW50KW1BY3RpdmVDb3VudFtzdHJlYW1dKSA8IDApIHsKKyAgICAgICAgLy8gYW55IG1pc21hdGNoZWQgYWN0aXZlIGNvdW50IHdpbGwgYWJvcnQuCisgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIiVzKCVzKSBpbnZhbGlkIGRlbHRhICVkLCBhY3RpdmUgc3RyZWFtIGNvdW50ICVkIiwKKyAgICAgICAgICAgICAgX19mdW5jX18sIGNsaWVudC0+dG9TaG9ydFN0cmluZygpLmNfc3RyKCksIGRlbHRhLCBtQWN0aXZlQ291bnRbc3RyZWFtXSk7CisgICAgICAgIC8vIG1BY3RpdmVDb3VudFtzdHJlYW1dID0gMDsKKyAgICAgICAgLy8gcmV0dXJuOworICAgIH0KKyAgICBtQWN0aXZlQ291bnRbc3RyZWFtXSArPSBkZWx0YTsKKworICAgIGlmIChkZWx0YSA+IDApIHsKKyAgICAgICAgbUFjdGl2ZUNsaWVudHNbY2xpZW50XSArPSBkZWx0YTsKKyAgICB9IGVsc2UgeworICAgICAgICBhdXRvIGl0ID0gbUFjdGl2ZUNsaWVudHMuZmluZChjbGllbnQpOworICAgICAgICBpZiAoaXQgPT0gbUFjdGl2ZUNsaWVudHMuZW5kKCkpIHsgLy8gY2xpZW50IG5vdCBmb3VuZCEKKyAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIiVzKCVzKSBpbnZhbGlkIGRlbHRhICVkLCBpbmFjdGl2ZSBjbGllbnQiLAorICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgY2xpZW50LT50b1Nob3J0U3RyaW5nKCkuY19zdHIoKSwgZGVsdGEpOworICAgICAgICB9IGVsc2UgaWYgKGl0LT5zZWNvbmQgPCAtZGVsdGEpIHsgLy8gaW52YWxpZCBkZWx0YSEKKyAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIiVzKCVzKSBpbnZhbGlkIGRlbHRhICVkLCBhY3RpdmUgY2xpZW50IGNvdW50ICV6dSIsCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBjbGllbnQtPnRvU2hvcnRTdHJpbmcoKS5jX3N0cigpLCBkZWx0YSwgaXQtPnNlY29uZCk7CisgICAgICAgIH0KKyAgICAgICAgaXQtPnNlY29uZCArPSBkZWx0YTsKKyAgICAgICAgaWYgKGl0LT5zZWNvbmQgPT0gMCkgeworICAgICAgICAgICAgKHZvaWQpbUFjdGl2ZUNsaWVudHMuZXJhc2UoaXQpOworICAgICAgICB9CisgICAgfQorCisgICAgQUxPR1YoIiVzIHN0cmVhbSAlZCwgY291bnQgJWQiLCBfX0ZVTkNUSU9OX18sIHN0cmVhbSwgbUFjdGl2ZUNvdW50W3N0cmVhbV0pOworfQorCit2b2lkIEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6c2V0Q2xpZW50QWN0aXZlKGNvbnN0IHNwPFRyYWNrQ2xpZW50RGVzY3JpcHRvcj4mIGNsaWVudCwgYm9vbCBhY3RpdmUpCit7CisgICAgTE9HX0FMV0FZU19GQVRBTF9JRihnZXRDbGllbnQoY2xpZW50LT5wb3J0SWQoKSkgPT0gbnVsbHB0ciwKKyAgICAgICAgIiVzKCVkKSBkb2VzIG5vdCBleGlzdCBvbiBvdXRwdXQgZGVzY3JpcHRvciIsIF9fZnVuY19fLCBjbGllbnQtPnBvcnRJZCgpKTsKKworICAgIGlmIChhY3RpdmUgPT0gY2xpZW50LT5hY3RpdmUoKSkgeworICAgICAgICBBTE9HVygiJXMoJXMpOiBpZ25vcmVkIGFjdGl2ZTogJWQsIGN1cnJlbnQgc3RyZWFtIGNvdW50ICVkIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgY2xpZW50LT50b1Nob3J0U3RyaW5nKCkuY19zdHIoKSwKKyAgICAgICAgICAgICAgICBhY3RpdmUsIG1BY3RpdmVDb3VudFtjbGllbnQtPnN0cmVhbSgpXSk7CiAgICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgbVJlZkNvdW50W3N0cmVhbV0gKz0gZGVsdGE7Ci0gICAgQUxPR1YoImNoYW5nZVJlZkNvdW50KCkgc3RyZWFtICVkLCBjb3VudCAlZCIsIHN0cmVhbSwgbVJlZkNvdW50W3N0cmVhbV0pOworICAgIGNvbnN0IGludCBkZWx0YSA9IGFjdGl2ZSA/IDEgOiAtMTsKKyAgICBjaGFuZ2VTdHJlYW1BY3RpdmVDb3VudChjbGllbnQsIGRlbHRhKTsKKworICAgIC8vIEhhbmRsZSBub24tY2xpZW50LXNwZWNpZmljIGFjdGl2aXR5IHJlZiBjb3VudAorICAgIGludDMyX3Qgb2xkR2xvYmFsQWN0aXZlQ291bnQgPSBtR2xvYmFsQWN0aXZlQ291bnQ7CisgICAgaWYgKCFhY3RpdmUgJiYgbUdsb2JhbEFjdGl2ZUNvdW50IDwgMSkgeworICAgICAgICBBTE9HVygiJXMoJXMpOiBpbnZhbGlkIGRlYWN0aXZhdGlvbiB3aXRoIGdsb2JhbFJlZkNvdW50ICVkIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgY2xpZW50LT50b1Nob3J0U3RyaW5nKCkuY19zdHIoKSwgbUdsb2JhbEFjdGl2ZUNvdW50KTsKKyAgICAgICAgbUdsb2JhbEFjdGl2ZUNvdW50ID0gMTsKKyAgICB9CisgICAgbUdsb2JhbEFjdGl2ZUNvdW50ICs9IGRlbHRhOworCisgICAgaWYgKChvbGRHbG9iYWxBY3RpdmVDb3VudCA9PSAwKSAmJiAobUdsb2JhbEFjdGl2ZUNvdW50ID4gMCkpIHsKKyAgICAgICAgaWYgKChtUG9saWN5TWl4ICE9IE5VTEwpICYmICgobVBvbGljeU1peC0+bUNiRmxhZ3MgJiBBdWRpb01peDo6a0NiRmxhZ05vdGlmeUFjdGl2aXR5KSAhPSAwKSkKKyAgICAgICAgeworICAgICAgICAgICAgbUNsaWVudEludGVyZmFjZS0+b25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUobVBvbGljeU1peC0+bURldmljZUFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNSVhfU1RBVEVfTUlYSU5HKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoKG9sZEdsb2JhbEFjdGl2ZUNvdW50ID4gMCkgJiYgKG1HbG9iYWxBY3RpdmVDb3VudCA9PSAwKSkgeworICAgICAgICBpZiAoKG1Qb2xpY3lNaXggIT0gTlVMTCkgJiYgKChtUG9saWN5TWl4LT5tQ2JGbGFncyAmIEF1ZGlvTWl4OjprQ2JGbGFnTm90aWZ5QWN0aXZpdHkpICE9IDApKQorICAgICAgICB7CisgICAgICAgICAgICBtQ2xpZW50SW50ZXJmYWNlLT5vbkR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZShtUG9saWN5TWl4LT5tRGV2aWNlQWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1JWF9TVEFURV9JRExFKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaWVudC0+c2V0QWN0aXZlKGFjdGl2ZSk7CiB9CiAKIGJvb2wgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjppc0FjdGl2ZSh1aW50MzJfdCBpblBhc3RNcykgY29uc3QKQEAgLTEyMCw3ICsxOTgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGluUGFzdE1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zZWNzX3Qgc3lzVGltZSkgY29uc3QKIHsKLSAgICBpZiAobVJlZkNvdW50W3N0cmVhbV0gIT0gMCkgeworICAgIGlmIChtQWN0aXZlQ291bnRbc3RyZWFtXSAhPSAwKSB7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICBpZiAoaW5QYXN0TXMgPT0gMCkgewpAQCAtMTg0LDMyICsyNjIsNDUgQEAKICAgICBwb3J0LT5leHQubWl4Lmh3X21vZHVsZSA9IGdldE1vZHVsZUhhbmRsZSgpOwogfQogCi1zdGF0dXNfdCBBdWRpb091dHB1dERlc2NyaXB0b3I6OmR1bXAoaW50IGZkKQorVHJhY2tDbGllbnRWZWN0b3IgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjpjbGllbnRzTGlzdChib29sIGFjdGl2ZU9ubHksIHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcHJlZmVycmVkRGV2aWNlT25seSkgY29uc3QKIHsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLSAgICBTdHJpbmc4IHJlc3VsdDsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBJRDogJWRcbiIsIG1JZCk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBTYW1wbGluZyByYXRlOiAlZFxuIiwgbVNhbXBsaW5nUmF0ZSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBGb3JtYXQ6ICUwOHhcbiIsIG1Gb3JtYXQpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgQ2hhbm5lbHM6ICUwOHhcbiIsIG1DaGFubmVsTWFzayk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBEZXZpY2VzICUwOHhcbiIsIGRldmljZSgpKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIFN0cmVhbSB2b2x1bWUgcmVmQ291bnQgbXV0ZUNvdW50XG4iKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCAoaW50KUFVRElPX1NUUkVBTV9DTlQ7IGkrKykgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgJTAyZCAgICAgJS4wM2YgICAgICUwMmQgICAgICAgJTAyZFxuIiwKLSAgICAgICAgICAgICAgICAgaSwgbUN1clZvbHVtZVtpXSwgbVJlZkNvdW50W2ldLCBtTXV0ZUNvdW50W2ldKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIFRyYWNrQ2xpZW50VmVjdG9yIGNsaWVudHM7CisgICAgZm9yIChjb25zdCBhdXRvICZjbGllbnQgOiBnZXRDbGllbnRJdGVyYWJsZSgpKSB7CisgICAgICAgIGlmICgoIWFjdGl2ZU9ubHkgfHwgY2xpZW50LT5hY3RpdmUoKSkKKyAgICAgICAgICAgICYmIChzdHJhdGVneSA9PSBTVFJBVEVHWV9OT05FIHx8IHN0cmF0ZWd5ID09IGNsaWVudC0+c3RyYXRlZ3koKSkKKyAgICAgICAgICAgICYmICghcHJlZmVycmVkRGV2aWNlT25seSB8fCBjbGllbnQtPmhhc1ByZWZlcnJlZERldmljZSgpKSkgeworICAgICAgICAgICAgY2xpZW50cy5wdXNoX2JhY2soY2xpZW50KTsKKyAgICAgICAgfQogICAgIH0KLSAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKKyAgICByZXR1cm4gY2xpZW50czsKK30KIAotICAgIHJldHVybiBOT19FUlJPUjsKK3ZvaWQgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjpkdW1wKFN0cmluZzggKmRzdCkgY29uc3QKK3sKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIElEOiAlZFxuIiwgbUlkKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIFNhbXBsaW5nIHJhdGU6ICVkXG4iLCBtU2FtcGxpbmdSYXRlKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIEZvcm1hdDogJTA4eFxuIiwgbUZvcm1hdCk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBDaGFubmVsczogJTA4eFxuIiwgbUNoYW5uZWxNYXNrKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIERldmljZXM6ICUwOHhcbiIsIGRldmljZSgpKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIEdsb2JhbCBhY3RpdmUgY291bnQ6ICV1XG4iLCBtR2xvYmFsQWN0aXZlQ291bnQpOworICAgIGRzdC0+YXBwZW5kKCIgU3RyZWFtIHZvbHVtZSBhY3RpdmVDb3VudCBtdXRlQ291bnRcbiIpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgKGludClBVURJT19TVFJFQU1fQ05UOyBpKyspIHsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiAlMDJkICAgICAlLjAzZiAgICAgJTAyZCAgICAgICAgICAlMDJkXG4iLAorICAgICAgICAgICAgICAgICBpLCBtQ3VyVm9sdW1lW2ldLCBzdHJlYW1BY3RpdmVDb3VudCgoYXVkaW9fc3RyZWFtX3R5cGVfdClpKSwgbU11dGVDb3VudFtpXSk7CisgICAgfQorICAgIGRzdC0+YXBwZW5kKCIgQXVkaW9UcmFjayBDbGllbnRzOlxuIik7CisgICAgQ2xpZW50TWFwSGFuZGxlcjxUcmFja0NsaWVudERlc2NyaXB0b3I+OjpkdW1wKGRzdCk7CisgICAgZHN0LT5hcHBlbmQoIlxuIik7CisgICAgaWYgKG1BY3RpdmVDbGllbnRzLnNpemUoKSA+IDApIHsKKyAgICAgICAgZHN0LT5hcHBlbmQoIiBBdWRpb1RyYWNrIGFjdGl2ZSAoc3RyZWFtKSBjbGllbnRzOlxuIik7CisgICAgICAgIHNpemVfdCBpbmRleCA9IDA7CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgY2xpZW50UGFpciA6IG1BY3RpdmVDbGllbnRzKSB7CisgICAgICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIFJlZmNvdW50OiAlenUiLCBjbGllbnRQYWlyLnNlY29uZCk7CisgICAgICAgICAgICBjbGllbnRQYWlyLmZpcnN0LT5kdW1wKGRzdCwgMiwgaW5kZXgrKyk7CisgICAgICAgIH0KKyAgICAgICAgZHN0LT5hcHBlbmQoIiBcbiIpOworICAgIH0KIH0KIAogdm9pZCBBdWRpb091dHB1dERlc2NyaXB0b3I6OmxvZyhjb25zdCBjaGFyKiBpbmRlbnQpCkBAIC0yMjMsMzAgKzMxNCwyMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlICpjbGllbnRJbnRlcmZhY2UpCiAgICAgOiBBdWRpb091dHB1dERlc2NyaXB0b3IocHJvZmlsZSwgY2xpZW50SW50ZXJmYWNlKSwKICAgICBtUHJvZmlsZShwcm9maWxlKSwgbUlvSGFuZGxlKEFVRElPX0lPX0hBTkRMRV9OT05FKSwgbUxhdGVuY3koMCksCi0gICAgbUZsYWdzKChhdWRpb19vdXRwdXRfZmxhZ3NfdCkwKSwgbVBvbGljeU1peChOVUxMKSwKKyAgICBtRmxhZ3MoKGF1ZGlvX291dHB1dF9mbGFnc190KTApLAogICAgIG1PdXRwdXQxKDApLCBtT3V0cHV0MigwKSwgbURpcmVjdE9wZW5Db3VudCgwKSwKLSAgICBtRGlyZWN0Q2xpZW50U2Vzc2lvbihBVURJT19TRVNTSU9OX05PTkUpLCBtR2xvYmFsUmVmQ291bnQoMCkKKyAgICBtRGlyZWN0Q2xpZW50U2Vzc2lvbihBVURJT19TRVNTSU9OX05PTkUpCiB7CiAgICAgaWYgKHByb2ZpbGUgIT0gTlVMTCkgewogICAgICAgICBtRmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpcHJvZmlsZS0+Z2V0RmxhZ3MoKTsKICAgICB9CiB9CiAKLXN0YXR1c190IFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpkdW1wKGludCBmZCkKK3ZvaWQgU3dBdWRpb091dHB1dERlc2NyaXB0b3I6OmR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdAogewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotICAgIFN0cmluZzggcmVzdWx0OwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIExhdGVuY3k6ICVkXG4iLCBtTGF0ZW5jeSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBGbGFncyAlMDh4XG4iLCBtRmxhZ3MpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKLQotICAgIEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6ZHVtcChmZCk7Ci0KLSAgICByZXR1cm4gTk9fRVJST1I7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBMYXRlbmN5OiAlZFxuIiwgbUxhdGVuY3kpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgRmxhZ3MgJTA4eFxuIiwgbUZsYWdzKTsKKyAgICBBdWRpb091dHB1dERlc2NyaXB0b3I6OmR1bXAoZHN0KTsKIH0KIAogYXVkaW9fZGV2aWNlc190IFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpkZXZpY2UoKSBjb25zdApAQCAtMjg5LDQxICszNzAsMTcgQEAKICAgICB9CiB9CiAKLXZvaWQgU3dBdWRpb091dHB1dERlc2NyaXB0b3I6OmNoYW5nZVJlZkNvdW50KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWx0YSkKK3ZvaWQgU3dBdWRpb091dHB1dERlc2NyaXB0b3I6OmNoYW5nZVN0cmVhbUFjdGl2ZUNvdW50KGNvbnN0IHNwPFRyYWNrQ2xpZW50RGVzY3JpcHRvcj4mIGNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsdGEpCiB7CiAgICAgLy8gZm9yd2FyZCB1c2FnZSBjb3VudCBjaGFuZ2UgdG8gYXR0YWNoZWQgb3V0cHV0cwogICAgIGlmIChpc0R1cGxpY2F0ZWQoKSkgewotICAgICAgICBtT3V0cHV0MS0+Y2hhbmdlUmVmQ291bnQoc3RyZWFtLCBkZWx0YSk7Ci0gICAgICAgIG1PdXRwdXQyLT5jaGFuZ2VSZWZDb3VudChzdHJlYW0sIGRlbHRhKTsKKyAgICAgICAgbU91dHB1dDEtPmNoYW5nZVN0cmVhbUFjdGl2ZUNvdW50KGNsaWVudCwgZGVsdGEpOworICAgICAgICBtT3V0cHV0Mi0+Y2hhbmdlU3RyZWFtQWN0aXZlQ291bnQoY2xpZW50LCBkZWx0YSk7CiAgICAgfQotICAgIEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6Y2hhbmdlUmVmQ291bnQoc3RyZWFtLCBkZWx0YSk7Ci0KLSAgICAvLyBoYW5kbGUgc3RyZWFtLWluZGVwZW5kZW50IHJlZiBjb3VudAotICAgIHVpbnQzMl90IG9sZEdsb2JhbFJlZkNvdW50ID0gbUdsb2JhbFJlZkNvdW50OwotICAgIGlmICgoZGVsdGEgKyAoaW50KW1HbG9iYWxSZWZDb3VudCkgPCAwKSB7Ci0gICAgICAgIEFMT0dXKCJjaGFuZ2VSZWZDb3VudCgpIGludmFsaWQgZGVsdGEgJWQgZ2xvYmFsUmVmQ291bnQgJWQiLCBkZWx0YSwgbUdsb2JhbFJlZkNvdW50KTsKLSAgICAgICAgbUdsb2JhbFJlZkNvdW50ID0gMDsKLSAgICB9IGVsc2UgewotICAgICAgICBtR2xvYmFsUmVmQ291bnQgKz0gZGVsdGE7Ci0gICAgfQotICAgIGlmICgob2xkR2xvYmFsUmVmQ291bnQgPT0gMCkgJiYgKG1HbG9iYWxSZWZDb3VudCA+IDApKSB7Ci0gICAgICAgIGlmICgobVBvbGljeU1peCAhPSBOVUxMKSAmJiAoKG1Qb2xpY3lNaXgtPm1DYkZsYWdzICYgQXVkaW9NaXg6OmtDYkZsYWdOb3RpZnlBY3Rpdml0eSkgIT0gMCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1DbGllbnRJbnRlcmZhY2UtPm9uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKG1Qb2xpY3lNaXgtPm1EZXZpY2VBZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICBNSVhfU1RBVEVfTUlYSU5HKTsKLSAgICAgICAgfQotCi0gICAgfSBlbHNlIGlmICgob2xkR2xvYmFsUmVmQ291bnQgPiAwKSAmJiAobUdsb2JhbFJlZkNvdW50ID09IDApKSB7Ci0gICAgICAgIGlmICgobVBvbGljeU1peCAhPSBOVUxMKSAmJiAoKG1Qb2xpY3lNaXgtPm1DYkZsYWdzICYgQXVkaW9NaXg6OmtDYkZsYWdOb3RpZnlBY3Rpdml0eSkgIT0gMCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1DbGllbnRJbnRlcmZhY2UtPm9uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKG1Qb2xpY3lNaXgtPm1EZXZpY2VBZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICBNSVhfU1RBVEVfSURMRSk7Ci0gICAgICAgIH0KLSAgICB9CisgICAgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjpjaGFuZ2VTdHJlYW1BY3RpdmVDb3VudChjbGllbnQsIGRlbHRhKTsKIH0KIAotCiBib29sIFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjppc0ZpeGVkVm9sdW1lKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpCiB7CiAgICAgLy8gdW5pdCBnYWluIGlmIHJlcm91dGluZyB0byBleHRlcm5hbCBwb2xpY3kKQEAgLTQ5OSw3ICs1NTYsNyBAQAogCiAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYobVByb2ZpbGUtPmN1ck9wZW5Db3VudCA8IDEsICIlcyBwcm9maWxlIG9wZW4gY291bnQgJXUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbVByb2ZpbGUtPmN1ck9wZW5Db3VudCk7Ci0gICAgICAgIC8vIGRvIG5vdCBjYWxsIHN0b3AoKSBoZXJlIGFzIHN0b3AoKSBpcyBzdXBwb3NlZCB0byBiZSBjYWxsZWQgYWZ0ZXIgY2hhbmdlUmVmQ291bnQoLTEpCisgICAgICAgIC8vIGRvIG5vdCBjYWxsIHN0b3AoKSBoZXJlIGFzIHN0b3AoKSBpcyBzdXBwb3NlZCB0byBiZSBjYWxsZWQgYWZ0ZXIgc2V0Q2xpZW50QWN0aXZlKGZhbHNlKQogICAgICAgICAvLyBhbmQgd2UgZG9uJ3Qga25vdyBob3cgbWFueSBzdHJlYW1zIGFyZSBzdGlsbCBhY3RpdmUgYXQgdGhpcyB0aW1lCiAgICAgICAgIGlmIChpc0FjdGl2ZSgpKSB7CiAgICAgICAgICAgICBtUHJvZmlsZS0+Y3VyQWN0aXZlQ291bnQtLTsKQEAgLTUzNCwyNyArNTkxLDE4IEBACiB9CiAKIC8vIEh3QXVkaW9PdXRwdXREZXNjcmlwdG9yIGltcGxlbWVudGF0aW9uCi1Id0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6SHdBdWRpb091dHB1dERlc2NyaXB0b3IoY29uc3Qgc3A8QXVkaW9Tb3VyY2VEZXNjcmlwdG9yPiYgc291cmNlLAorSHdBdWRpb091dHB1dERlc2NyaXB0b3I6Okh3QXVkaW9PdXRwdXREZXNjcmlwdG9yKGNvbnN0IHNwPFNvdXJjZUNsaWVudERlc2NyaXB0b3I+JiBzb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgKmNsaWVudEludGVyZmFjZSkKLSAgICA6IEF1ZGlvT3V0cHV0RGVzY3JpcHRvcihzb3VyY2UtPm1EZXZpY2UsIGNsaWVudEludGVyZmFjZSksCisgICAgOiBBdWRpb091dHB1dERlc2NyaXB0b3Ioc291cmNlLT5zcmNEZXZpY2UoKSwgY2xpZW50SW50ZXJmYWNlKSwKICAgICAgIG1Tb3VyY2Uoc291cmNlKQogewogfQogCi1zdGF0dXNfdCBId0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6ZHVtcChpbnQgZmQpCit2b2lkIEh3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpkdW1wKFN0cmluZzggKmRzdCkgY29uc3QKIHsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLSAgICBTdHJpbmc4IHJlc3VsdDsKLQotICAgIEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6ZHVtcChmZCk7Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJTb3VyY2U6XG4iKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7Ci0gICAgbVNvdXJjZS0+ZHVtcChmZCk7Ci0KLSAgICByZXR1cm4gTk9fRVJST1I7CisgICAgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjpkdW1wKGRzdCk7CisgICAgZHN0LT5hcHBlbmQoIlNvdXJjZTpcbiIpOworICAgIG1Tb3VyY2UtPmR1bXAoZHN0LCAwLCAwKTsKIH0KIAogYXVkaW9fZGV2aWNlc190IEh3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpzdXBwb3J0ZWREZXZpY2VzKCkKQEAgLTU2NiwxMyArNjE0LDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpkc3RDb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzcmNDb25maWcpIGNvbnN0CiB7Ci0gICAgbVNvdXJjZS0+bURldmljZS0+dG9BdWRpb1BvcnRDb25maWcoZHN0Q29uZmlnLCBzcmNDb25maWcpOworICAgIG1Tb3VyY2UtPnNyY0RldmljZSgpLT50b0F1ZGlvUG9ydENvbmZpZyhkc3RDb25maWcsIHNyY0NvbmZpZyk7CiB9CiAKIHZvaWQgSHdBdWRpb091dHB1dERlc2NyaXB0b3I6OnRvQXVkaW9Qb3J0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KSBjb25zdAogewotICAgIG1Tb3VyY2UtPm1EZXZpY2UtPnRvQXVkaW9Qb3J0KHBvcnQpOworICAgIG1Tb3VyY2UtPnNyY0RldmljZSgpLT50b0F1ZGlvUG9ydChwb3J0KTsKIH0KIAogCkBAIC02OTgsNyArNzQ2LDcgQEAKICAgICAgICAgfQogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CiAgICAgICAgICAgICBjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IHZhbHVlQXQoaSk7Ci0gICAgICAgICAgICBpZiAob3V0cHV0RGVzYy0+bVJlZkNvdW50W3NdICE9IDApIHsKKyAgICAgICAgICAgIGlmIChvdXRwdXREZXNjLT5zdHJlYW1BY3RpdmVDb3VudCgoYXVkaW9fc3RyZWFtX3R5cGVfdClzKSE9IDApIHsKICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNzEzLDIxICs3NjEsMjQgQEAKICAgICByZXR1cm4gZGV2aWNlczsKIH0KIAotCi1zdGF0dXNfdCBTd0F1ZGlvT3V0cHV0Q29sbGVjdGlvbjo6ZHVtcChpbnQgZmQpIGNvbnN0CitzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gU3dBdWRpb091dHB1dENvbGxlY3Rpb246OmdldE91dHB1dEZvckNsaWVudChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKIHsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlxuT3V0cHV0cyBkdW1wOlxuIik7Ci0gICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiLSBPdXRwdXQgJWQgZHVtcDpcbiIsIGtleUF0KGkpKTsKLSAgICAgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwotICAgICAgICB2YWx1ZUF0KGkpLT5kdW1wKGZkKTsKKyAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSB2YWx1ZUF0KGkpOworICAgICAgICBpZiAob3V0cHV0RGVzYy0+Z2V0Q2xpZW50KHBvcnRJZCkgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgcmV0dXJuIG91dHB1dERlc2M7CisgICAgICAgIH0KICAgICB9CisgICAgcmV0dXJuIDA7Cit9CiAKLSAgICByZXR1cm4gTk9fRVJST1I7Cit2b2lkIFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uOjpkdW1wKFN0cmluZzggKmRzdCkgY29uc3QKK3sKKyAgICBkc3QtPmFwcGVuZCgiXG5PdXRwdXRzIGR1bXA6XG4iKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCItIE91dHB1dCAlZCBkdW1wOlxuIiwga2V5QXQoaSkpOworICAgICAgICB2YWx1ZUF0KGkpLT5kdW1wKGRzdCk7CisgICAgfQogfQogCiAvLyBId0F1ZGlvT3V0cHV0Q29sbGVjdGlvbiBpbXBsZW1lbnRhdGlvbgpAQCAtNzUxLDcgKzgwMiw3IEBACiAgICAgICAgIH0KICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewogICAgICAgICAgICAgY29uc3Qgc3A8SHdBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSB2YWx1ZUF0KGkpOwotICAgICAgICAgICAgaWYgKG91dHB1dERlc2MtPm1SZWZDb3VudFtzXSAhPSAwKSB7CisgICAgICAgICAgICBpZiAob3V0cHV0RGVzYy0+c3RyZWFtQWN0aXZlQ291bnQoKGF1ZGlvX3N0cmVhbV90eXBlX3QpcykgIT0gMCkgewogICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC03NTksMjAgKzgxMCwxMyBAQAogICAgIHJldHVybiBmYWxzZTsKIH0KIAotc3RhdHVzX3QgSHdBdWRpb091dHB1dENvbGxlY3Rpb246OmR1bXAoaW50IGZkKSBjb25zdAordm9pZCBId0F1ZGlvT3V0cHV0Q29sbGVjdGlvbjo6ZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0CiB7Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcbk91dHB1dHMgZHVtcDpcbiIpOwotICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKKyAgICBkc3QtPmFwcGVuZCgiXG5PdXRwdXRzIGR1bXA6XG4iKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIi0gT3V0cHV0ICVkIGR1bXA6XG4iLCBrZXlBdChpKSk7Ci0gICAgICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKLSAgICAgICAgdmFsdWVBdChpKS0+ZHVtcChmZCk7CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCItIE91dHB1dCAlZCBkdW1wOlxuIiwga2V5QXQoaSkpOworICAgICAgICB2YWx1ZUF0KGkpLT5kdW1wKGRzdCk7CiAgICAgfQotCi0gICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCiB9OyAvL25hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1BhdGNoLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvUGF0Y2guY3BwCmluZGV4IGE5ZmU0OGQuLmNkMWMyZjIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvUGF0Y2guY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvUGF0Y2guY3BwCkBAIC0zNCw1MyArMzQsMjkgQEAKIHsKIH0KIAotc3RhdHVzX3QgQXVkaW9QYXRjaDo6ZHVtcChpbnQgZmQsIGludCBzcGFjZXMsIGludCBpbmRleCkgY29uc3QKK3N0YXRpYyB2b2lkIGR1bXBQYXRjaEVuZHBvaW50cygKKyAgICAgICAgU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzLCBjb25zdCBjaGFyICpwcmVmaXgsIGludCBjb3VudCwgY29uc3QgYXVkaW9fcG9ydF9jb25maWcgKmNmZ3MpCiB7Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0gICAgU3RyaW5nOCByZXN1bHQ7Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnNBdWRpbyBwYXRjaCAlZDpcbiIsIHNwYWNlcywgIiIsIGluZGV4KzEpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIGhhbmRsZTogJTJkXG4iLCBzcGFjZXMsICIiLCBtSGFuZGxlKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBhdWRpbyBmbGluZ2VyIGhhbmRsZTogJTJkXG4iLCBzcGFjZXMsICIiLCBtQWZQYXRjaEhhbmRsZSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gb3duZXIgdWlkOiAlMmRcbiIsIHNwYWNlcywgIiIsIG1VaWQpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtICVkIHNvdXJjZXM6XG4iLCBzcGFjZXMsICIiLCBtUGF0Y2gubnVtX3NvdXJjZXMpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1QYXRjaC5udW1fc291cmNlczsgaSsrKSB7Ci0gICAgICAgIGlmIChtUGF0Y2guc291cmNlc1tpXS50eXBlID09IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKKyAgICAgICAgY29uc3QgYXVkaW9fcG9ydF9jb25maWcgJmNmZyA9IGNmZ3NbaV07CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMgIFslcyAlZF0gIiwgc3BhY2VzLCAiIiwgcHJlZml4LCBpICsgMSk7CisgICAgICAgIGlmIChjZmcudHlwZSA9PSBBVURJT19QT1JUX1RZUEVfREVWSUNFKSB7CiAgICAgICAgICAgICBzdGQ6OnN0cmluZyBkZXZpY2U7Ci0gICAgICAgICAgICBkZXZpY2VUb1N0cmluZyhtUGF0Y2guc291cmNlc1tpXS5leHQuZGV2aWNlLnR5cGUsIGRldmljZSk7Ci0gICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIERldmljZSBJRCAlZCAlc1xuIiwgc3BhY2VzICsgMiwgIiIsCi0gICAgICAgICAgICAgICAgICAgICBtUGF0Y2guc291cmNlc1tpXS5pZCwKLSAgICAgICAgICAgICAgICAgICAgIGRldmljZS5jX3N0cigpKTsKKyAgICAgICAgICAgIGRldmljZVRvU3RyaW5nKGNmZy5leHQuZGV2aWNlLnR5cGUsIGRldmljZSk7CisgICAgICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiRGV2aWNlIElEICVkICVzIiwgY2ZnLmlkLCBkZXZpY2UuY19zdHIoKSk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIE1peCBJRCAlZCBJL08gaGFuZGxlICVkXG4iLCBzcGFjZXMgKyAyLCAiIiwKLSAgICAgICAgICAgICAgICAgICAgIG1QYXRjaC5zb3VyY2VzW2ldLmlkLCBtUGF0Y2guc291cmNlc1tpXS5leHQubWl4LmhhbmRsZSk7CisgICAgICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiTWl4IElEICVkIEkvTyBoYW5kbGUgJWQiLCBjZmcuaWQsIGNmZy5leHQubWl4LmhhbmRsZSk7CiAgICAgICAgIH0KLSAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICBkc3QtPmFwcGVuZCgiXG4iKTsKICAgICB9Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSAlZCBzaW5rczpcbiIsIHNwYWNlcywgIiIsIG1QYXRjaC5udW1fc2lua3MpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1QYXRjaC5udW1fc2lua3M7IGkrKykgewotICAgICAgICBpZiAobVBhdGNoLnNpbmtzW2ldLnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSkgewotICAgICAgICAgICAgc3RkOjpzdHJpbmcgZGV2aWNlOwotICAgICAgICAgICAgZGV2aWNlVG9TdHJpbmcobVBhdGNoLnNpbmtzW2ldLmV4dC5kZXZpY2UudHlwZSwgZGV2aWNlKTsKLSAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gRGV2aWNlIElEICVkICVzXG4iLCBzcGFjZXMgKyAyLCAiIiwKLSAgICAgICAgICAgICAgICAgICAgIG1QYXRjaC5zaW5rc1tpXS5pZCwKLSAgICAgICAgICAgICAgICAgICAgIGRldmljZS5jX3N0cigpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gTWl4IElEICVkIEkvTyBoYW5kbGUgJWRcbiIsIHNwYWNlcyArIDIsICIiLAotICAgICAgICAgICAgICAgICAgICAgbVBhdGNoLnNpbmtzW2ldLmlkLCBtUGF0Y2guc2lua3NbaV0uZXh0Lm1peC5oYW5kbGUpOwotICAgICAgICB9Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICB9Cit9CiAKLSAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKLSAgICByZXR1cm4gTk9fRVJST1I7Cit2b2lkIEF1ZGlvUGF0Y2g6OmR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgpIGNvbnN0Cit7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqc1BhdGNoICVkOiBvd25lciB1aWQgJTRkLCBoYW5kbGUgJTJkLCBhZiBoYW5kbGUgJTJkXG4iLAorICAgICAgICAgICAgc3BhY2VzLCAiIiwgaW5kZXggKyAxLCBtVWlkLCBtSGFuZGxlLCBtQWZQYXRjaEhhbmRsZSk7CisgICAgZHVtcFBhdGNoRW5kcG9pbnRzKGRzdCwgc3BhY2VzLCAic3JjICIsIG1QYXRjaC5udW1fc291cmNlcywgbVBhdGNoLnNvdXJjZXMpOworICAgIGR1bXBQYXRjaEVuZHBvaW50cyhkc3QsIHNwYWNlcywgInNpbmsiLCBtUGF0Y2gubnVtX3NpbmtzLCBtUGF0Y2guc2lua3MpOwogfQogCiBzdGF0dXNfdCBBdWRpb1BhdGNoQ29sbGVjdGlvbjo6YWRkQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUsCkBAIC0xNjEsMTYgKzEzNywxMiBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotc3RhdHVzX3QgQXVkaW9QYXRjaENvbGxlY3Rpb246OmR1bXAoaW50IGZkKSBjb25zdAordm9pZCBBdWRpb1BhdGNoQ29sbGVjdGlvbjo6ZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0CiB7Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXG5BdWRpbyBQYXRjaGVzOlxuIik7Ci0gICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOworICAgIGRzdC0+YXBwZW5kKCJcbkF1ZGlvIFBhdGNoZXM6XG4iKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgIHZhbHVlQXQoaSktPmR1bXAoZmQsIDIsIGkpOworICAgICAgICB2YWx1ZUF0KGkpLT5kdW1wKGRzdCwgMiwgaSk7CiAgICAgfQotICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9Qb2xpY3lNaXguY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9Qb2xpY3lNaXguY3BwCmluZGV4IDA4OTMwZjEuLjNjZjgwMTQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvUG9saWN5TWl4LmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1BvbGljeU1peC5jcHAKQEAgLTUyLDY0ICs1Miw1NSBAQAogICAgIHJldHVybiAmbU1peDsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNaXg6OmR1bXAoaW50IGZkLCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgpIGNvbnN0Cit2b2lkIEF1ZGlvUG9saWN5TWl4OjpkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdAogewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotICAgIFN0cmluZzggcmVzdWx0OwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzQXVkaW8gUG9saWN5IE1peCAlZDpcbiIsIHNwYWNlcywgIiIsIGluZGV4KzEpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzQXVkaW8gUG9saWN5IE1peCAlZDpcbiIsIHNwYWNlcywgIiIsIGluZGV4ICsgMSk7CiAgICAgc3RkOjpzdHJpbmcgbWl4VHlwZUxpdGVyYWw7CiAgICAgaWYgKCFNaXhUeXBlQ29udmVydGVyOjp0b1N0cmluZyhtTWl4Lm1NaXhUeXBlLCBtaXhUeXBlTGl0ZXJhbCkpIHsKICAgICAgICAgQUxPR0UoIiVzOiBmYWlsZWQgdG8gY29udmVydCBtaXggdHlwZSAlZCIsIF9fRlVOQ1RJT05fXywgbU1peC5tTWl4VHlwZSk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBtaXggdHlwZTogJXNcbiIsIHNwYWNlcywgIiIsIG1peFR5cGVMaXRlcmFsLmNfc3RyKCkpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBtaXggdHlwZTogJXNcbiIsIHNwYWNlcywgIiIsIG1peFR5cGVMaXRlcmFsLmNfc3RyKCkpOworCiAgICAgc3RkOjpzdHJpbmcgcm91dGVGbGFnTGl0ZXJhbDsKICAgICBSb3V0ZUZsYWdUeXBlQ29udmVydGVyOjptYXNrVG9TdHJpbmcobU1peC5tUm91dGVGbGFncywgcm91dGVGbGFnTGl0ZXJhbCk7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBSb3V0ZSBGbGFnczogJXNcbiIsIHNwYWNlcywgIiIsIHJvdXRlRmxhZ0xpdGVyYWwuY19zdHIoKSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIFJvdXRlIEZsYWdzOiAlc1xuIiwgc3BhY2VzLCAiIiwgcm91dGVGbGFnTGl0ZXJhbC5jX3N0cigpKTsKKwogICAgIHN0ZDo6c3RyaW5nIGRldmljZUxpdGVyYWw7CiAgICAgZGV2aWNlVG9TdHJpbmcobU1peC5tRGV2aWNlVHlwZSwgZGV2aWNlTGl0ZXJhbCk7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBkZXZpY2UgdHlwZTogJXNcbiIsIHNwYWNlcywgIiIsIGRldmljZUxpdGVyYWwuY19zdHIoKSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gZGV2aWNlIGFkZHJlc3M6ICVzXG4iLCBzcGFjZXMsICIiLCBtTWl4Lm1EZXZpY2VBZGRyZXNzLnN0cmluZygpKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gZGV2aWNlIHR5cGU6ICVzXG4iLCBzcGFjZXMsICIiLCBkZXZpY2VMaXRlcmFsLmNfc3RyKCkpOworCisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gZGV2aWNlIGFkZHJlc3M6ICVzXG4iLCBzcGFjZXMsICIiLCBtTWl4Lm1EZXZpY2VBZGRyZXNzLnN0cmluZygpKTsKIAogICAgIGludCBpbmRleENyaXRlcmlvbiA9IDA7CiAgICAgZm9yIChjb25zdCBhdXRvICZjcml0ZXJpb24gOiBtTWl4Lm1Dcml0ZXJpYSkgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIENyaXRlcmlvbiAlZDpcbiIsIHNwYWNlcyArIDIsICIiLCBpbmRleENyaXRlcmlvbisrKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBDcml0ZXJpb24gJWQ6XG4iLCBzcGFjZXMgKyAyLCAiIiwgaW5kZXhDcml0ZXJpb24rKyk7CisKICAgICAgICAgc3RkOjpzdHJpbmcgdXNhZ2VMaXRlcmFsOwogICAgICAgICBpZiAoIVVzYWdlVHlwZUNvbnZlcnRlcjo6dG9TdHJpbmcoY3JpdGVyaW9uLm1WYWx1ZS5tVXNhZ2UsIHVzYWdlTGl0ZXJhbCkpIHsKICAgICAgICAgICAgIEFMT0dFKCIlczogZmFpbGVkIHRvIGNvbnZlcnQgdXNhZ2UgJWQiLCBfX0ZVTkNUSU9OX18sIGNyaXRlcmlvbi5tVmFsdWUubVVzYWdlKTsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBVc2FnZTolc1xuIiwgc3BhY2VzICsgNCwgIiIsIHVzYWdlTGl0ZXJhbC5jX3N0cigpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBVc2FnZTolc1xuIiwgc3BhY2VzICsgNCwgIiIsIHVzYWdlTGl0ZXJhbC5jX3N0cigpKTsKKwogICAgICAgICBpZiAobU1peC5tTWl4VHlwZSA9PSBNSVhfVFlQRV9SRUNPUkRFUlMpIHsKICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHNvdXJjZUxpdGVyYWw7CiAgICAgICAgICAgICBpZiAoIVNvdXJjZVR5cGVDb252ZXJ0ZXI6OnRvU3RyaW5nKGNyaXRlcmlvbi5tVmFsdWUubVNvdXJjZSwgc291cmNlTGl0ZXJhbCkpIHsKICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IGZhaWxlZCB0byBjb252ZXJ0IHNvdXJjZSAlZCIsIF9fRlVOQ1RJT05fXywgY3JpdGVyaW9uLm1WYWx1ZS5tU291cmNlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gU291cmNlOiVzXG4iLCBzcGFjZXMgKyA0LCAiIiwgc291cmNlTGl0ZXJhbC5jX3N0cigpKTsKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIFNvdXJjZTolc1xuIiwgc3BhY2VzICsgNCwgIiIsIHNvdXJjZUxpdGVyYWwuY19zdHIoKSk7CisKICAgICAgICAgfQotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIFVpZDolZFxuIiwgc3BhY2VzICsgNCwgIiIsIGNyaXRlcmlvbi5tVmFsdWUubVVpZCk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gVWlkOiVkXG4iLCBzcGFjZXMgKyA0LCAiIiwgY3JpdGVyaW9uLm1WYWx1ZS5tVWlkKTsKKwogICAgICAgICBzdGQ6OnN0cmluZyBydWxlTGl0ZXJhbDsKICAgICAgICAgaWYgKCFSdWxlVHlwZUNvbnZlcnRlcjo6dG9TdHJpbmcoY3JpdGVyaW9uLm1SdWxlLCBydWxlTGl0ZXJhbCkpIHsKICAgICAgICAgICAgIEFMT0dFKCIlczogZmFpbGVkIHRvIGNvbnZlcnQgc291cmNlICVkIiwgX19GVU5DVElPTl9fLGNyaXRlcmlvbi5tUnVsZSk7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gUnVsZTolc1xuIiwgc3BhY2VzICsgNCwgIiIsIHJ1bGVMaXRlcmFsLmNfc3RyKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIFJ1bGU6JXNcbiIsIHNwYWNlcyArIDQsICIiLCBydWxlTGl0ZXJhbC5jX3N0cigpKTsKICAgICB9Ci0gICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCiBzdGF0dXNfdCBBdWRpb1BvbGljeU1peENvbGxlY3Rpb246OnJlZ2lzdGVyTWl4KGNvbnN0IFN0cmluZzgmIGFkZHJlc3MsIEF1ZGlvTWl4IG1peCwKQEAgLTM0OSwxNCArMzQwLDEyIEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1peENvbGxlY3Rpb246OmR1bXAoaW50IGZkKSBjb25zdAordm9pZCBBdWRpb1BvbGljeU1peENvbGxlY3Rpb246OmR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdAogewotICAgIHN0ZDo6c3RyaW5nIGxvZygiXG5BdWRpbyBQb2xpY3kgTWl4OlxuIik7Ci0gICAgd3JpdGUoZmQsIGxvZy5jX3N0cigpLCBsb2cuc2l6ZSgpKTsKKyAgICBkc3QtPmFwcGVuZCgiXG5BdWRpbyBQb2xpY3kgTWl4OlxuIik7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICB2YWx1ZUF0KGkpLT5kdW1wKGZkLCAyLCBpKTsKKyAgICAgICAgdmFsdWVBdChpKS0+ZHVtcChkc3QsIDIsIGkpOwogICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKIH07IC8vbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvUG9ydC5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1BvcnQuY3BwCmluZGV4IGQ4NTU2MmUuLjE5ZGRlNmEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvUG9ydC5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9Qb3J0LmNwcApAQCAtMzU0LDI2ICszNTQsMTggQEAKICAgICByZXR1cm4gbUdhaW5zW2luZGV4XS0+Y2hlY2tDb25maWcoZ2FpbkNvbmZpZyk7CiB9CiAKLXZvaWQgQXVkaW9Qb3J0OjpkdW1wKGludCBmZCwgaW50IHNwYWNlcywgYm9vbCB2ZXJib3NlKSBjb25zdAordm9pZCBBdWRpb1BvcnQ6OmR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzLCBib29sIHZlcmJvc2UpIGNvbnN0CiB7Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0gICAgU3RyaW5nOCByZXN1bHQ7Ci0KICAgICBpZiAoIW1OYW1lLmlzRW1wdHkoKSkgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIG5hbWU6ICVzXG4iLCBzcGFjZXMsICIiLCBtTmFtZS5zdHJpbmcoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICAgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIG5hbWU6ICVzXG4iLCBzcGFjZXMsICIiLCBtTmFtZS5zdHJpbmcoKSk7CiAgICAgfQogICAgIGlmICh2ZXJib3NlKSB7Ci0gICAgICAgIG1Qcm9maWxlcy5kdW1wKGZkLCBzcGFjZXMpOworICAgICAgICBtUHJvZmlsZXMuZHVtcChkc3QsIHNwYWNlcyk7CiAKICAgICAgICAgaWYgKG1HYWlucy5zaXplKCkgIT0gMCkgewotICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBnYWluczpcbiIsIHNwYWNlcywgIiIpOwotICAgICAgICAgICAgcmVzdWx0ID0gYnVmZmVyOwotICAgICAgICAgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CisgICAgICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBnYWluczpcbiIsIHNwYWNlcywgIiIpOwogICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtR2FpbnMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBtR2FpbnNbaV0tPmR1bXAoZmQsIHNwYWNlcyArIDIsIGkpOworICAgICAgICAgICAgICAgIG1HYWluc1tpXS0+ZHVtcChkc3QsIHNwYWNlcyArIDIsIGkpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtMzg2LDIyICszNzgsMTIgQEAKIAogLy8gLS0tIEF1ZGlvUG9ydENvbmZpZyBjbGFzcyBpbXBsZW1lbnRhdGlvbgogCi1BdWRpb1BvcnRDb25maWc6OkF1ZGlvUG9ydENvbmZpZygpCi17Ci0gICAgbVNhbXBsaW5nUmF0ZSA9IDA7Ci0gICAgbUNoYW5uZWxNYXNrID0gQVVESU9fQ0hBTk5FTF9OT05FOwotICAgIG1Gb3JtYXQgPSBBVURJT19GT1JNQVRfSU5WQUxJRDsKLSAgICBtZW1zZXQoJm1HYWluLCAwLCBzaXplb2Yoc3RydWN0IGF1ZGlvX2dhaW5fY29uZmlnKSk7Ci0gICAgbUdhaW4uaW5kZXggPSAtMTsKLX0KLQogc3RhdHVzX3QgQXVkaW9Qb3J0Q29uZmlnOjphcHBseUF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpiYWNrdXBDb25maWcpCiB7Ci0gICAgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnIGxvY2FsQmFja3VwQ29uZmlnOworICAgIHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyBsb2NhbEJhY2t1cENvbmZpZyA9IHsgLmNvbmZpZ19tYXNrID0gY29uZmlnLT5jb25maWdfbWFzayB9OwogICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOwogCi0gICAgbG9jYWxCYWNrdXBDb25maWcuY29uZmlnX21hc2sgPSBjb25maWctPmNvbmZpZ19tYXNrOwogICAgIHRvQXVkaW9Qb3J0Q29uZmlnKCZsb2NhbEJhY2t1cENvbmZpZyk7CiAKICAgICBzcDxBdWRpb1BvcnQ+IGF1ZGlvcG9ydCA9IGdldEF1ZGlvUG9ydCgpOwpAQCAtNDI1LDYgKzQwNyw5IEBACiAgICAgaWYgKGNvbmZpZy0+Y29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19HQUlOKSB7CiAgICAgICAgIG1HYWluID0gY29uZmlnLT5nYWluOwogICAgIH0KKyAgICBpZiAoY29uZmlnLT5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX0ZMQUdTKSB7CisgICAgICAgIG1GbGFncyA9IGNvbmZpZy0+ZmxhZ3M7CisgICAgfQogCiBleGl0OgogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKQEAgLTQzNiwzMyArNDIxLDM4IEBACiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIAorbmFtZXNwYWNlIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3ZvaWQgdXBkYXRlRmllbGQoCisgICAgICAgIGNvbnN0IFQmIHBvcnRDb25maWdGaWVsZCwgVCBhdWRpb19wb3J0X2NvbmZpZzo6KnBvcnRfY29uZmlnX2ZpZWxkLAorICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmRzdENvbmZpZywgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzcmNDb25maWcsCisgICAgICAgIHVuc2lnbmVkIGludCBjb25maWdNYXNrLCBUIGRlZmF1bHRWYWx1ZSkKK3sKKyAgICBpZiAoZHN0Q29uZmlnLT5jb25maWdfbWFzayAmIGNvbmZpZ01hc2spIHsKKyAgICAgICAgaWYgKChzcmNDb25maWcgIT0gbnVsbHB0cikgJiYgKHNyY0NvbmZpZy0+Y29uZmlnX21hc2sgJiBjb25maWdNYXNrKSkgeworICAgICAgICAgICAgZHN0Q29uZmlnLT4qcG9ydF9jb25maWdfZmllbGQgPSBzcmNDb25maWctPipwb3J0X2NvbmZpZ19maWVsZDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRzdENvbmZpZy0+KnBvcnRfY29uZmlnX2ZpZWxkID0gcG9ydENvbmZpZ0ZpZWxkOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZHN0Q29uZmlnLT4qcG9ydF9jb25maWdfZmllbGQgPSBkZWZhdWx0VmFsdWU7CisgICAgfQorfQorCit9IC8vIG5hbWVzcGFjZQorCiB2b2lkIEF1ZGlvUG9ydENvbmZpZzo6dG9BdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpkc3RDb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzcmNDb25maWcpIGNvbnN0CiB7Ci0gICAgaWYgKGRzdENvbmZpZy0+Y29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19TQU1QTEVfUkFURSkgewotICAgICAgICBkc3RDb25maWctPnNhbXBsZV9yYXRlID0gbVNhbXBsaW5nUmF0ZTsKLSAgICAgICAgaWYgKChzcmNDb25maWcgIT0gTlVMTCkgJiYgKHNyY0NvbmZpZy0+Y29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19TQU1QTEVfUkFURSkpIHsKLSAgICAgICAgICAgIGRzdENvbmZpZy0+c2FtcGxlX3JhdGUgPSBzcmNDb25maWctPnNhbXBsZV9yYXRlOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZHN0Q29uZmlnLT5zYW1wbGVfcmF0ZSA9IDA7Ci0gICAgfQotICAgIGlmIChkc3RDb25maWctPmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfQ0hBTk5FTF9NQVNLKSB7Ci0gICAgICAgIGRzdENvbmZpZy0+Y2hhbm5lbF9tYXNrID0gbUNoYW5uZWxNYXNrOwotICAgICAgICBpZiAoKHNyY0NvbmZpZyAhPSBOVUxMKSAmJiAoc3JjQ29uZmlnLT5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX0NIQU5ORUxfTUFTSykpIHsKLSAgICAgICAgICAgIGRzdENvbmZpZy0+Y2hhbm5lbF9tYXNrID0gc3JjQ29uZmlnLT5jaGFubmVsX21hc2s7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBkc3RDb25maWctPmNoYW5uZWxfbWFzayA9IEFVRElPX0NIQU5ORUxfTk9ORTsKLSAgICB9Ci0gICAgaWYgKGRzdENvbmZpZy0+Y29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19GT1JNQVQpIHsKLSAgICAgICAgZHN0Q29uZmlnLT5mb3JtYXQgPSBtRm9ybWF0OwotICAgICAgICBpZiAoKHNyY0NvbmZpZyAhPSBOVUxMKSAmJiAoc3JjQ29uZmlnLT5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX0ZPUk1BVCkpIHsKLSAgICAgICAgICAgIGRzdENvbmZpZy0+Zm9ybWF0ID0gc3JjQ29uZmlnLT5mb3JtYXQ7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBkc3RDb25maWctPmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9JTlZBTElEOwotICAgIH0KKyAgICB1cGRhdGVGaWVsZChtU2FtcGxpbmdSYXRlLCAmYXVkaW9fcG9ydF9jb25maWc6OnNhbXBsZV9yYXRlLAorICAgICAgICAgICAgZHN0Q29uZmlnLCBzcmNDb25maWcsIEFVRElPX1BPUlRfQ09ORklHX1NBTVBMRV9SQVRFLCAwdSk7CisgICAgdXBkYXRlRmllbGQobUNoYW5uZWxNYXNrLCAmYXVkaW9fcG9ydF9jb25maWc6OmNoYW5uZWxfbWFzaywKKyAgICAgICAgICAgIGRzdENvbmZpZywgc3JjQ29uZmlnLCBBVURJT19QT1JUX0NPTkZJR19DSEFOTkVMX01BU0ssCisgICAgICAgICAgICAoYXVkaW9fY2hhbm5lbF9tYXNrX3QpQVVESU9fQ0hBTk5FTF9OT05FKTsKKyAgICB1cGRhdGVGaWVsZChtRm9ybWF0LCAmYXVkaW9fcG9ydF9jb25maWc6OmZvcm1hdCwKKyAgICAgICAgICAgIGRzdENvbmZpZywgc3JjQ29uZmlnLCBBVURJT19QT1JUX0NPTkZJR19GT1JNQVQsIEFVRElPX0ZPUk1BVF9JTlZBTElEKTsKKwogICAgIHNwPEF1ZGlvUG9ydD4gYXVkaW9wb3J0ID0gZ2V0QXVkaW9Qb3J0KCk7CiAgICAgaWYgKChkc3RDb25maWctPmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfR0FJTikgJiYgYXVkaW9wb3J0ICE9IE5VTEwpIHsKICAgICAgICAgZHN0Q29uZmlnLT5nYWluID0gbUdhaW47CkBAIC00NzgsNiArNDY4LDkgQEAKICAgICB9IGVsc2UgewogICAgICAgICBkc3RDb25maWctPmNvbmZpZ19tYXNrICY9IH5BVURJT19QT1JUX0NPTkZJR19HQUlOOwogICAgIH0KKworICAgIHVwZGF0ZUZpZWxkKG1GbGFncywgJmF1ZGlvX3BvcnRfY29uZmlnOjpmbGFncywKKyAgICAgICAgICAgIGRzdENvbmZpZywgc3JjQ29uZmlnLCBBVURJT19QT1JUX0NPTkZJR19GTEFHUywgeyBBVURJT19JTlBVVF9GTEFHX05PTkUgfSk7CiB9CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvUHJvZmlsZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1Byb2ZpbGUuY3BwCmluZGV4IGZkNmZjMWMuLmE2NDVlMDIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvUHJvZmlsZS5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9Qcm9maWxlLmNwcApAQCAtMTQsMjAgKzE0LDExMiBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8c3RyaW5nPgorCiAjZGVmaW5lIExPR19UQUcgIkFQTTo6QXVkaW9Qcm9maWxlIgogLy8jZGVmaW5lIExPR19OREVCVUcgMAogCi0jaW5jbHVkZSAiQXVkaW9Qcm9maWxlLmgiCi0jaW5jbHVkZSAiQXVkaW9Qb3J0LmgiCi0jaW5jbHVkZSAiSHdNb2R1bGUuaCIKLSNpbmNsdWRlICJBdWRpb0dhaW4uaCIKLSNpbmNsdWRlIDx1dGlscy9Tb3J0ZWRWZWN0b3IuaD4KLSNpbmNsdWRlICJUeXBlQ29udmVydGVyLmgiCiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9SZXNhbXBsZXJQdWJsaWMuaD4KLSNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisKKyNpbmNsdWRlICJBdWRpb0dhaW4uaCIKKyNpbmNsdWRlICJBdWRpb1BvcnQuaCIKKyNpbmNsdWRlICJBdWRpb1Byb2ZpbGUuaCIKKyNpbmNsdWRlICJId01vZHVsZS5oIgorI2luY2x1ZGUgIlR5cGVDb252ZXJ0ZXIuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCitDaGFubmVsc1ZlY3RvciBDaGFubmVsc1ZlY3Rvcjo6YXNJbk1hc2soKSBjb25zdAoreworICAgIENoYW5uZWxzVmVjdG9yIGluTWFza1ZlY3RvcjsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGNoYW5uZWwgOiAqdGhpcykgeworICAgICAgICBpZiAoYXVkaW9fY2hhbm5lbF9tYXNrX291dF90b19pbihjaGFubmVsKSAhPSBBVURJT19DSEFOTkVMX0lOVkFMSUQpIHsKKyAgICAgICAgICAgIGluTWFza1ZlY3Rvci5hZGQoYXVkaW9fY2hhbm5lbF9tYXNrX291dF90b19pbihjaGFubmVsKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGluTWFza1ZlY3RvcjsKK30KKworQ2hhbm5lbHNWZWN0b3IgQ2hhbm5lbHNWZWN0b3I6OmFzT3V0TWFzaygpIGNvbnN0Cit7CisgICAgQ2hhbm5lbHNWZWN0b3Igb3V0TWFza1ZlY3RvcjsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGNoYW5uZWwgOiAqdGhpcykgeworICAgICAgICBpZiAoYXVkaW9fY2hhbm5lbF9tYXNrX2luX3RvX291dChjaGFubmVsKSAhPSBBVURJT19DSEFOTkVMX0lOVkFMSUQpIHsKKyAgICAgICAgICAgIG91dE1hc2tWZWN0b3IuYWRkKGF1ZGlvX2NoYW5uZWxfbWFza19pbl90b19vdXQoY2hhbm5lbCkpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBvdXRNYXNrVmVjdG9yOworfQorCitib29sIG9wZXJhdG9yID09IChjb25zdCBBdWRpb1Byb2ZpbGUgJmxlZnQsIGNvbnN0IEF1ZGlvUHJvZmlsZSAmY29tcGFyZVRvKQoreworICAgIHJldHVybiAobGVmdC5nZXRGb3JtYXQoKSA9PSBjb21wYXJlVG8uZ2V0Rm9ybWF0KCkpICYmCisgICAgICAgICAgICAobGVmdC5nZXRDaGFubmVscygpID09IGNvbXBhcmVUby5nZXRDaGFubmVscygpKSAmJgorICAgICAgICAgICAgKGxlZnQuZ2V0U2FtcGxlUmF0ZXMoKSA9PSBjb21wYXJlVG8uZ2V0U2FtcGxlUmF0ZXMoKSk7Cit9CisKK3N0YXRpYyBBdWRpb1Byb2ZpbGUqIGNyZWF0ZUZ1bGxEeW5hbWljSW1wbCgpCit7CisgICAgQXVkaW9Qcm9maWxlKiBkeW5hbWljUHJvZmlsZSA9IG5ldyBBdWRpb1Byb2ZpbGUoZ0R5bmFtaWNGb3JtYXQsCisgICAgICAgICAgICBDaGFubmVsc1ZlY3RvcigpLCBTYW1wbGVSYXRlVmVjdG9yKCkpOworICAgIGR5bmFtaWNQcm9maWxlLT5zZXREeW5hbWljRm9ybWF0KHRydWUpOworICAgIGR5bmFtaWNQcm9maWxlLT5zZXREeW5hbWljQ2hhbm5lbHModHJ1ZSk7CisgICAgZHluYW1pY1Byb2ZpbGUtPnNldER5bmFtaWNSYXRlKHRydWUpOworICAgIHJldHVybiBkeW5hbWljUHJvZmlsZTsKK30KKworLy8gc3RhdGljCitzcDxBdWRpb1Byb2ZpbGU+IEF1ZGlvUHJvZmlsZTo6Y3JlYXRlRnVsbER5bmFtaWMoKQoreworICAgIHN0YXRpYyBzcDxBdWRpb1Byb2ZpbGU+IGR5bmFtaWNQcm9maWxlID0gY3JlYXRlRnVsbER5bmFtaWNJbXBsKCk7CisgICAgcmV0dXJuIGR5bmFtaWNQcm9maWxlOworfQorCitBdWRpb1Byb2ZpbGU6OkF1ZGlvUHJvZmlsZShhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFza3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUpIDoKKyAgICAgICAgbU5hbWUoU3RyaW5nOCgiIikpLAorICAgICAgICBtRm9ybWF0KGZvcm1hdCkKK3sKKyAgICBtQ2hhbm5lbE1hc2tzLmFkZChjaGFubmVsTWFza3MpOworICAgIG1TYW1wbGluZ1JhdGVzLmFkZChzYW1wbGluZ1JhdGUpOworfQorCitBdWRpb1Byb2ZpbGU6OkF1ZGlvUHJvZmlsZShhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDaGFubmVsc1ZlY3RvciAmY2hhbm5lbE1hc2tzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2FtcGxlUmF0ZVZlY3RvciAmc2FtcGxpbmdSYXRlQ29sbGVjdGlvbikgOgorICAgICAgICBtTmFtZShTdHJpbmc4KCIiKSksCisgICAgICAgIG1Gb3JtYXQoZm9ybWF0KSwKKyAgICAgICAgbUNoYW5uZWxNYXNrcyhjaGFubmVsTWFza3MpLAorICAgICAgICBtU2FtcGxpbmdSYXRlcyhzYW1wbGluZ1JhdGVDb2xsZWN0aW9uKSB7fQorCit2b2lkIEF1ZGlvUHJvZmlsZTo6c2V0Q2hhbm5lbHMoY29uc3QgQ2hhbm5lbHNWZWN0b3IgJmNoYW5uZWxNYXNrcykKK3sKKyAgICBpZiAobUlzRHluYW1pY0NoYW5uZWxzKSB7CisgICAgICAgIG1DaGFubmVsTWFza3MgPSBjaGFubmVsTWFza3M7CisgICAgfQorfQorCit2b2lkIEF1ZGlvUHJvZmlsZTo6c2V0U2FtcGxlUmF0ZXMoY29uc3QgU2FtcGxlUmF0ZVZlY3RvciAmc2FtcGxlUmF0ZXMpCit7CisgICAgaWYgKG1Jc0R5bmFtaWNSYXRlKSB7CisgICAgICAgIG1TYW1wbGluZ1JhdGVzID0gc2FtcGxlUmF0ZXM7CisgICAgfQorfQorCit2b2lkIEF1ZGlvUHJvZmlsZTo6Y2xlYXIoKQoreworICAgIGlmIChtSXNEeW5hbWljQ2hhbm5lbHMpIHsKKyAgICAgICAgbUNoYW5uZWxNYXNrcy5jbGVhcigpOworICAgIH0KKyAgICBpZiAobUlzRHluYW1pY1JhdGUpIHsKKyAgICAgICAgbVNhbXBsaW5nUmF0ZXMuY2xlYXIoKTsKKyAgICB9Cit9CisKIHN0YXR1c190IEF1ZGlvUHJvZmlsZTo6Y2hlY2tFeGFjdCh1aW50MzJfdCBzYW1wbGluZ1JhdGUsIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgY29uc3QKIHsKQEAgLTM5LDI3ICsxMzEsNiBAQAogICAgIHJldHVybiBCQURfVkFMVUU7CiB9CiAKLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotYm9vbCBvcGVyYXRvciA9PSAoY29uc3QgU29ydGVkVmVjdG9yPFQ+ICZsZWZ0LCBjb25zdCBTb3J0ZWRWZWN0b3I8VD4gJnJpZ2h0KQotewotICAgIGlmIChsZWZ0LnNpemUoKSAhPSByaWdodC5zaXplKCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBmb3Ioc2l6ZV90IGluZGV4ID0gMDsgaW5kZXggPCByaWdodC5zaXplKCk7IGluZGV4KyspIHsKLSAgICAgICAgaWYgKGxlZnRbaW5kZXhdICE9IHJpZ2h0W2luZGV4XSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIG9wZXJhdG9yID09IChjb25zdCBBdWRpb1Byb2ZpbGUgJmxlZnQsIGNvbnN0IEF1ZGlvUHJvZmlsZSAmY29tcGFyZVRvKQotewotICAgIHJldHVybiAobGVmdC5nZXRGb3JtYXQoKSA9PSBjb21wYXJlVG8uZ2V0Rm9ybWF0KCkpICYmCi0gICAgICAgICAgICAobGVmdC5nZXRDaGFubmVscygpID09IGNvbXBhcmVUby5nZXRDaGFubmVscygpKSAmJgotICAgICAgICAgICAgKGxlZnQuZ2V0U2FtcGxlUmF0ZXMoKSA9PSBjb21wYXJlVG8uZ2V0U2FtcGxlUmF0ZXMoKSk7Ci19Ci0KIHN0YXR1c190IEF1ZGlvUHJvZmlsZTo6Y2hlY2tDb21wYXRpYmxlU2FtcGxpbmdSYXRlKHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICZ1cGRhdGVkU2FtcGxpbmdSYXRlKSBjb25zdAogewpAQCAtMTgyLDQ3ICsyNTMsNzkgQEAKICAgICByZXR1cm4gYmVzdE1hdGNoID4gMCA/IE5PX0VSUk9SIDogQkFEX1ZBTFVFOwogfQogCi12b2lkIEF1ZGlvUHJvZmlsZTo6ZHVtcChpbnQgZmQsIGludCBzcGFjZXMpIGNvbnN0Cit2b2lkIEF1ZGlvUHJvZmlsZTo6ZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMpIGNvbnN0CiB7Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0gICAgU3RyaW5nOCByZXN1bHQ7Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlcyVzJXNcbiIsIG1Jc0R5bmFtaWNGb3JtYXQgPyAiW2R5bmFtaWMgZm9ybWF0XSIgOiAiIiwKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJXMlcyVzXG4iLCBtSXNEeW5hbWljRm9ybWF0ID8gIltkeW5hbWljIGZvcm1hdF0iIDogIiIsCiAgICAgICAgICAgICAgbUlzRHluYW1pY0NoYW5uZWxzID8gIltkeW5hbWljIGNoYW5uZWxzXSIgOiAiIiwKICAgICAgICAgICAgICBtSXNEeW5hbWljUmF0ZSA/ICJbZHluYW1pYyByYXRlc10iIDogIiIpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKICAgICBpZiAobU5hbWUubGVuZ3RoKCkgIT0gMCkgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIG5hbWU6ICVzXG4iLCBzcGFjZXMsICIiLCBtTmFtZS5zdHJpbmcoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gbmFtZTogJXNcbiIsIHNwYWNlcywgIiIsIG1OYW1lLnN0cmluZygpKTsKICAgICB9CiAgICAgc3RkOjpzdHJpbmcgZm9ybWF0TGl0ZXJhbDsKICAgICBpZiAoRm9ybWF0Q29udmVydGVyOjp0b1N0cmluZyhtRm9ybWF0LCBmb3JtYXRMaXRlcmFsKSkgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIGZvcm1hdDogJXNcbiIsIHNwYWNlcywgIiIsIGZvcm1hdExpdGVyYWwuY19zdHIoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gZm9ybWF0OiAlc1xuIiwgc3BhY2VzLCAiIiwgZm9ybWF0TGl0ZXJhbC5jX3N0cigpKTsKICAgICB9CiAgICAgaWYgKCFtU2FtcGxpbmdSYXRlcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBzYW1wbGluZyByYXRlczoiLCBzcGFjZXMsICIiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBzYW1wbGluZyByYXRlczoiLCBzcGFjZXMsICIiKTsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU2FtcGxpbmdSYXRlcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJWQiLCBtU2FtcGxpbmdSYXRlc1tpXSk7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKGkgPT0gKG1TYW1wbGluZ1JhdGVzLnNpemUoKSAtIDEpID8gIiIgOiAiLCAiKTsKKyAgICAgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlZCIsIG1TYW1wbGluZ1JhdGVzW2ldKTsKKyAgICAgICAgICAgIGRzdC0+YXBwZW5kKGkgPT0gKG1TYW1wbGluZ1JhdGVzLnNpemUoKSAtIDEpID8gIiIgOiAiLCAiKTsKICAgICAgICAgfQotICAgICAgICByZXN1bHQuYXBwZW5kKCJcbiIpOworICAgICAgICBkc3QtPmFwcGVuZCgiXG4iKTsKICAgICB9CiAKICAgICBpZiAoIW1DaGFubmVsTWFza3MuaXNFbXB0eSgpKSB7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gY2hhbm5lbCBtYXNrczoiLCBzcGFjZXMsICIiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBjaGFubmVsIG1hc2tzOiIsIHNwYWNlcywgIiIpOwogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1DaGFubmVsTWFza3Muc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIjB4JTA0eCIsIG1DaGFubmVsTWFza3NbaV0pOwotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChpID09IChtQ2hhbm5lbE1hc2tzLnNpemUoKSAtIDEpID8gIiIgOiAiLCAiKTsKKyAgICAgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIweCUwNHgiLCBtQ2hhbm5lbE1hc2tzW2ldKTsKKyAgICAgICAgICAgIGRzdC0+YXBwZW5kKGkgPT0gKG1DaGFubmVsTWFza3Muc2l6ZSgpIC0gMSkgPyAiIiA6ICIsICIpOwogICAgICAgICB9Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIlxuIik7CisgICAgICAgIGRzdC0+YXBwZW5kKCJcbiIpOwogICAgIH0KLSAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKK30KKworc3NpemVfdCBBdWRpb1Byb2ZpbGVWZWN0b3I6OmFkZChjb25zdCBzcDxBdWRpb1Byb2ZpbGU+ICZwcm9maWxlKQoreworICAgIHNzaXplX3QgaW5kZXggPSBWZWN0b3I6OmFkZChwcm9maWxlKTsKKyAgICAvLyB3ZSBzb3J0IGZyb20gd29yc3QgdG8gYmVzdCwgc28gdGhhdCBBVURJT19GT1JNQVRfREVGQVVMVCBpcyBhbHdheXMgdGhlIGZpcnN0IGVudHJ5LgorICAgIC8vIFRPRE86IGNvbXBhcmVGb3JtYXRzIGNvdWxkIGJlIGEgbGFtYmRhIHRvIGNvbnZlcnQgYmV0d2VlbiBwb2ludGVyLXRvLWZvcm1hdCB0byBmb3JtYXQ6CisgICAgLy8gW10oY29uc3QgYXVkaW9fZm9ybWF0X3QgKmZvcm1hdDEsIGNvbnN0IGF1ZGlvX2Zvcm1hdF90ICpmb3JtYXQyKSB7CisgICAgLy8gICAgIHJldHVybiBjb21wYXJlRm9ybWF0cygqZm9ybWF0MSwgKmZvcm1hdDIpOworICAgIC8vIH0KKyAgICBzb3J0KGNvbXBhcmVGb3JtYXRzKTsKKyAgICByZXR1cm4gaW5kZXg7Cit9CisKK3NzaXplX3QgQXVkaW9Qcm9maWxlVmVjdG9yOjphZGRQcm9maWxlRnJvbUhhbChjb25zdCBzcDxBdWRpb1Byb2ZpbGU+ICZwcm9maWxlVG9BZGQpCit7CisgICAgLy8gQ2hlY2sgdmFsaWQgcHJvZmlsZSB0byBhZGQ6CisgICAgaWYgKCFwcm9maWxlVG9BZGQtPmhhc1ZhbGlkRm9ybWF0KCkpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoIXByb2ZpbGVUb0FkZC0+aGFzVmFsaWRDaGFubmVscygpICYmICFwcm9maWxlVG9BZGQtPmhhc1ZhbGlkUmF0ZXMoKSkgeworICAgICAgICBGb3JtYXRWZWN0b3IgZm9ybWF0czsKKyAgICAgICAgZm9ybWF0cy5hZGQocHJvZmlsZVRvQWRkLT5nZXRGb3JtYXQoKSk7CisgICAgICAgIHNldEZvcm1hdHMoRm9ybWF0VmVjdG9yKGZvcm1hdHMpKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmICghcHJvZmlsZVRvQWRkLT5oYXNWYWxpZENoYW5uZWxzKCkgJiYgcHJvZmlsZVRvQWRkLT5oYXNWYWxpZFJhdGVzKCkpIHsKKyAgICAgICAgc2V0U2FtcGxlUmF0ZXNGb3IocHJvZmlsZVRvQWRkLT5nZXRTYW1wbGVSYXRlcygpLCBwcm9maWxlVG9BZGQtPmdldEZvcm1hdCgpKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmIChwcm9maWxlVG9BZGQtPmhhc1ZhbGlkQ2hhbm5lbHMoKSAmJiAhcHJvZmlsZVRvQWRkLT5oYXNWYWxpZFJhdGVzKCkpIHsKKyAgICAgICAgc2V0Q2hhbm5lbHNGb3IocHJvZmlsZVRvQWRkLT5nZXRDaGFubmVscygpLCBwcm9maWxlVG9BZGQtPmdldEZvcm1hdCgpKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIC8vIEdvIHRocm91Z2ggdGhlIGxpc3Qgb2YgcHJvZmlsZSB0byBhdm9pZCBkdXBsaWNhdGVzCisgICAgZm9yIChzaXplX3QgcHJvZmlsZUluZGV4ID0gMDsgcHJvZmlsZUluZGV4IDwgc2l6ZSgpOyBwcm9maWxlSW5kZXgrKykgeworICAgICAgICBjb25zdCBzcDxBdWRpb1Byb2ZpbGU+ICZwcm9maWxlID0gaXRlbUF0KHByb2ZpbGVJbmRleCk7CisgICAgICAgIGlmIChwcm9maWxlLT5pc1ZhbGlkKCkgJiYgcHJvZmlsZSA9PSBwcm9maWxlVG9BZGQpIHsKKyAgICAgICAgICAgIC8vIE5vdGhpbmcgdG8gZG8KKyAgICAgICAgICAgIHJldHVybiBwcm9maWxlSW5kZXg7CisgICAgICAgIH0KKyAgICB9CisgICAgcHJvZmlsZVRvQWRkLT5zZXREeW5hbWljRm9ybWF0KHRydWUpOyAvLyBzZXQgdGhlIGZvcm1hdCBhcyBkeW5hbWljIHRvIGFsbG93IHJlbW92YWwKKyAgICByZXR1cm4gYWRkKHByb2ZpbGVUb0FkZCk7CiB9CiAKIHN0YXR1c190IEF1ZGlvUHJvZmlsZVZlY3Rvcjo6Y2hlY2tFeGFjdFByb2ZpbGUodWludDMyX3Qgc2FtcGxpbmdSYXRlLApAQCAtMjgxLDYgKzM4NCwyMjggQEAKICAgICByZXR1cm4gQkFEX1ZBTFVFOwogfQogCit2b2lkIEF1ZGlvUHJvZmlsZVZlY3Rvcjo6Y2xlYXJQcm9maWxlcygpCit7CisgICAgZm9yIChzaXplX3QgaSA9IHNpemUoKTsgaSAhPSAwOyApIHsKKyAgICAgICAgc3A8QXVkaW9Qcm9maWxlPiBwcm9maWxlID0gaXRlbUF0KC0taSk7CisgICAgICAgIGlmIChwcm9maWxlLT5pc0R5bmFtaWNGb3JtYXQoKSAmJiBwcm9maWxlLT5oYXNWYWxpZEZvcm1hdCgpKSB7CisgICAgICAgICAgICByZW1vdmVBdChpKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHByb2ZpbGUtPmNsZWFyKCk7CisgICAgfQorfQorCisvLyBSZXR1cm5zIGFuIGludGVyc2VjdGlvbiBiZXR3ZWVuIHR3byBwb3NzaWJseSB1bnNvcnRlZCB2ZWN0b3JzIGFuZCB0aGUgY29udGVudHMgb2YgJ29yZGVyJy4KKy8vIFRoZSByZXN1bHQgaXMgb3JkZXJlZCBhY2NvcmRpbmcgdG8gJ29yZGVyJy4KK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIE9yZGVyPgorc3RkOjp2ZWN0b3I8dHlwZW5hbWUgVDo6dmFsdWVfdHlwZT4gaW50ZXJzZWN0RmlsdGVyQW5kT3JkZXIoCisgICAgICAgIGNvbnN0IFQmIGlucHV0MSwgY29uc3QgVCYgaW5wdXQyLCBjb25zdCBPcmRlciYgb3JkZXIpCit7CisgICAgc3RkOjpzZXQ8dHlwZW5hbWUgVDo6dmFsdWVfdHlwZT4gc2V0MXtpbnB1dDEuYmVnaW4oKSwgaW5wdXQxLmVuZCgpfTsKKyAgICBzdGQ6OnNldDx0eXBlbmFtZSBUOjp2YWx1ZV90eXBlPiBzZXQye2lucHV0Mi5iZWdpbigpLCBpbnB1dDIuZW5kKCl9OworICAgIHN0ZDo6c2V0PHR5cGVuYW1lIFQ6OnZhbHVlX3R5cGU+IGNvbW1vbjsKKyAgICBzdGQ6OnNldF9pbnRlcnNlY3Rpb24oc2V0MS5iZWdpbigpLCBzZXQxLmVuZCgpLCBzZXQyLmJlZ2luKCksIHNldDIuZW5kKCksCisgICAgICAgICAgICBzdGQ6Omluc2VydGVyKGNvbW1vbiwgY29tbW9uLmJlZ2luKCkpKTsKKyAgICBzdGQ6OnZlY3Rvcjx0eXBlbmFtZSBUOjp2YWx1ZV90eXBlPiByZXN1bHQ7CisgICAgZm9yIChjb25zdCBhdXRvJiBlIDogb3JkZXIpIHsKKyAgICAgICAgaWYgKGNvbW1vbi5maW5kKGUpICE9IGNvbW1vbi5lbmQoKSkgcmVzdWx0LnB1c2hfYmFjayhlKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworLy8gSW50ZXJzZWN0IHR3byBwb3NzaWJseSB1bnNvcnRlZCB2ZWN0b3JzLCByZXR1cm4gY29tbW9uIGVsZW1lbnRzIGFjY29yZGluZyB0byAnY29tcCcgb3JkZXJpbmcuCisvLyAnY29tcCcgaXMgYSBjb21wYXJhdG9yIGZ1bmN0aW9uLgordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgQ29tcGFyZT4KK3N0ZDo6dmVjdG9yPHR5cGVuYW1lIFQ6OnZhbHVlX3R5cGU+IGludGVyc2VjdEFuZE9yZGVyKAorICAgICAgICBjb25zdCBUJiBpbnB1dDEsIGNvbnN0IFQmIGlucHV0MiwgQ29tcGFyZSBjb21wKQoreworICAgIHN0ZDo6c2V0PHR5cGVuYW1lIFQ6OnZhbHVlX3R5cGUsIENvbXBhcmU+IHNldDF7aW5wdXQxLmJlZ2luKCksIGlucHV0MS5lbmQoKSwgY29tcH07CisgICAgc3RkOjpzZXQ8dHlwZW5hbWUgVDo6dmFsdWVfdHlwZSwgQ29tcGFyZT4gc2V0MntpbnB1dDIuYmVnaW4oKSwgaW5wdXQyLmVuZCgpLCBjb21wfTsKKyAgICBzdGQ6OnZlY3Rvcjx0eXBlbmFtZSBUOjp2YWx1ZV90eXBlPiByZXN1bHQ7CisgICAgc3RkOjpzZXRfaW50ZXJzZWN0aW9uKHNldDEuYmVnaW4oKSwgc2V0MS5lbmQoKSwgc2V0Mi5iZWdpbigpLCBzZXQyLmVuZCgpLAorICAgICAgICAgICAgc3RkOjpiYWNrX2luc2VydGVyKHJlc3VsdCksIGNvbXApOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXR1c190IEF1ZGlvUHJvZmlsZVZlY3Rvcjo6ZmluZEJlc3RNYXRjaGluZ091dHB1dENvbmZpZyhjb25zdCBBdWRpb1Byb2ZpbGVWZWN0b3ImIG91dHB1dFByb2ZpbGVzLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8YXVkaW9fZm9ybWF0X3Q+JiBwcmVmZXJyZWRGb3JtYXRzLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+JiBwcmVmZXJyZWRPdXRwdXRDaGFubmVscywKKyAgICAgICAgICAgIGJvb2wgcHJlZmVySGlnaGVyU2FtcGxpbmdSYXRlcywKKyAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ19iYXNlICpiZXN0T3V0cHV0Q29uZmlnKSBjb25zdAoreworICAgIGF1dG8gZm9ybWF0cyA9IGludGVyc2VjdEZpbHRlckFuZE9yZGVyKGdldFN1cHBvcnRlZEZvcm1hdHMoKSwKKyAgICAgICAgICAgIG91dHB1dFByb2ZpbGVzLmdldFN1cHBvcnRlZEZvcm1hdHMoKSwgcHJlZmVycmVkRm9ybWF0cyk7CisgICAgLy8gUGljayB0aGUgYmVzdCBjb21wYXRpYmxlIHByb2ZpbGUuCisgICAgZm9yIChjb25zdCBhdXRvJiBmIDogZm9ybWF0cykgeworICAgICAgICBzcDxBdWRpb1Byb2ZpbGU+IGlucHV0UHJvZmlsZSA9IGdldEZpcnN0VmFsaWRQcm9maWxlRm9yKGYpOworICAgICAgICBzcDxBdWRpb1Byb2ZpbGU+IG91dHB1dFByb2ZpbGUgPSBvdXRwdXRQcm9maWxlcy5nZXRGaXJzdFZhbGlkUHJvZmlsZUZvcihmKTsKKyAgICAgICAgaWYgKGlucHV0UHJvZmlsZSA9PSBudWxscHRyIHx8IG91dHB1dFByb2ZpbGUgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgYXV0byBjaGFubmVscyA9IGludGVyc2VjdEZpbHRlckFuZE9yZGVyKGlucHV0UHJvZmlsZS0+Z2V0Q2hhbm5lbHMoKS5hc091dE1hc2soKSwKKyAgICAgICAgICAgICAgICBvdXRwdXRQcm9maWxlLT5nZXRDaGFubmVscygpLCBwcmVmZXJyZWRPdXRwdXRDaGFubmVscyk7CisgICAgICAgIGlmIChjaGFubmVscy5lbXB0eSgpKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBhdXRvIHNhbXBsZVJhdGVzID0gcHJlZmVySGlnaGVyU2FtcGxpbmdSYXRlcyA/CisgICAgICAgICAgICAgICAgaW50ZXJzZWN0QW5kT3JkZXIoaW5wdXRQcm9maWxlLT5nZXRTYW1wbGVSYXRlcygpLCBvdXRwdXRQcm9maWxlLT5nZXRTYW1wbGVSYXRlcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpncmVhdGVyPHR5cGVuYW1lIFNhbXBsZVJhdGVWZWN0b3I6OnZhbHVlX3R5cGU+KCkpIDoKKyAgICAgICAgICAgICAgICBpbnRlcnNlY3RBbmRPcmRlcihpbnB1dFByb2ZpbGUtPmdldFNhbXBsZVJhdGVzKCksIG91dHB1dFByb2ZpbGUtPmdldFNhbXBsZVJhdGVzKCksCisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Omxlc3M8dHlwZW5hbWUgU2FtcGxlUmF0ZVZlY3Rvcjo6dmFsdWVfdHlwZT4oKSk7CisgICAgICAgIGlmIChzYW1wbGVSYXRlcy5lbXB0eSgpKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBBTE9HRCgiJXMoKSBmb3VuZCBjaGFubmVsIG1hc2sgJSN4IGFuZCBzYW1wbGUgcmF0ZSAlZCBmb3IgZm9ybWF0ICUjeC4iLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCAqY2hhbm5lbHMuYmVnaW4oKSwgKnNhbXBsZVJhdGVzLmJlZ2luKCksIGYpOworICAgICAgICBiZXN0T3V0cHV0Q29uZmlnLT5mb3JtYXQgPSBmOworICAgICAgICBiZXN0T3V0cHV0Q29uZmlnLT5zYW1wbGVfcmF0ZSA9ICpzYW1wbGVSYXRlcy5iZWdpbigpOworICAgICAgICBiZXN0T3V0cHV0Q29uZmlnLT5jaGFubmVsX21hc2sgPSAqY2hhbm5lbHMuYmVnaW4oKTsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKyAgICByZXR1cm4gQkFEX1ZBTFVFOworfQorCitzcDxBdWRpb1Byb2ZpbGU+IEF1ZGlvUHJvZmlsZVZlY3Rvcjo6Z2V0Rmlyc3RWYWxpZFByb2ZpbGUoKSBjb25zdAoreworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKGl0ZW1BdChpKS0+aXNWYWxpZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gaXRlbUF0KGkpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzcDxBdWRpb1Byb2ZpbGU+IEF1ZGlvUHJvZmlsZVZlY3Rvcjo6Z2V0Rmlyc3RWYWxpZFByb2ZpbGVGb3IoYXVkaW9fZm9ybWF0X3QgZm9ybWF0KSBjb25zdAoreworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKGl0ZW1BdChpKS0+aXNWYWxpZCgpICYmIGl0ZW1BdChpKS0+Z2V0Rm9ybWF0KCkgPT0gZm9ybWF0KSB7CisgICAgICAgICAgICByZXR1cm4gaXRlbUF0KGkpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCitGb3JtYXRWZWN0b3IgQXVkaW9Qcm9maWxlVmVjdG9yOjpnZXRTdXBwb3J0ZWRGb3JtYXRzKCkgY29uc3QKK3sKKyAgICBGb3JtYXRWZWN0b3Igc3VwcG9ydGVkRm9ybWF0czsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChpdGVtQXQoaSktPmhhc1ZhbGlkRm9ybWF0KCkpIHsKKyAgICAgICAgICAgIHN1cHBvcnRlZEZvcm1hdHMuYWRkKGl0ZW1BdChpKS0+Z2V0Rm9ybWF0KCkpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBzdXBwb3J0ZWRGb3JtYXRzOworfQorCitib29sIEF1ZGlvUHJvZmlsZVZlY3Rvcjo6aGFzRHluYW1pY0NoYW5uZWxzRm9yKGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgY29uc3QKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgIHNwPEF1ZGlvUHJvZmlsZT4gcHJvZmlsZSA9IGl0ZW1BdChpKTsKKyAgICAgICAgaWYgKHByb2ZpbGUtPmdldEZvcm1hdCgpID09IGZvcm1hdCAmJiBwcm9maWxlLT5pc0R5bmFtaWNDaGFubmVscygpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgQXVkaW9Qcm9maWxlVmVjdG9yOjpoYXNEeW5hbWljUHJvZmlsZSgpIGNvbnN0Cit7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBpZiAoaXRlbUF0KGkpLT5pc0R5bmFtaWMoKSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIEF1ZGlvUHJvZmlsZVZlY3Rvcjo6aGFzRHluYW1pY1JhdGVGb3IoYXVkaW9fZm9ybWF0X3QgZm9ybWF0KSBjb25zdAoreworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc3A8QXVkaW9Qcm9maWxlPiBwcm9maWxlID0gaXRlbUF0KGkpOworICAgICAgICBpZiAocHJvZmlsZS0+Z2V0Rm9ybWF0KCkgPT0gZm9ybWF0ICYmIHByb2ZpbGUtPmlzRHluYW1pY1JhdGUoKSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIEF1ZGlvUHJvZmlsZVZlY3Rvcjo6c2V0Rm9ybWF0cyhjb25zdCBGb3JtYXRWZWN0b3IgJmZvcm1hdHMpCit7CisgICAgLy8gT25seSBhbGxvdyB0byBjaGFuZ2UgdGhlIGZvcm1hdCBvZiBkeW5hbWljIHByb2ZpbGUKKyAgICBzcDxBdWRpb1Byb2ZpbGU+IGR5bmFtaWNGb3JtYXRQcm9maWxlID0gZ2V0UHJvZmlsZUZvcihnRHluYW1pY0Zvcm1hdCk7CisgICAgaWYgKGR5bmFtaWNGb3JtYXRQcm9maWxlID09IDApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGZvcm1hdHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc3A8QXVkaW9Qcm9maWxlPiBwcm9maWxlID0gbmV3IEF1ZGlvUHJvZmlsZShmb3JtYXRzW2ldLAorICAgICAgICAgICAgICAgIGR5bmFtaWNGb3JtYXRQcm9maWxlLT5nZXRDaGFubmVscygpLAorICAgICAgICAgICAgICAgIGR5bmFtaWNGb3JtYXRQcm9maWxlLT5nZXRTYW1wbGVSYXRlcygpKTsKKyAgICAgICAgcHJvZmlsZS0+c2V0RHluYW1pY0Zvcm1hdCh0cnVlKTsKKyAgICAgICAgcHJvZmlsZS0+c2V0RHluYW1pY0NoYW5uZWxzKGR5bmFtaWNGb3JtYXRQcm9maWxlLT5pc0R5bmFtaWNDaGFubmVscygpKTsKKyAgICAgICAgcHJvZmlsZS0+c2V0RHluYW1pY1JhdGUoZHluYW1pY0Zvcm1hdFByb2ZpbGUtPmlzRHluYW1pY1JhdGUoKSk7CisgICAgICAgIGFkZChwcm9maWxlKTsKKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9Qcm9maWxlVmVjdG9yOjpkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcykgY29uc3QKK3sKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBQcm9maWxlczpcbiIsIHNwYWNlcywgIiIpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqc1Byb2ZpbGUgJXp1OiIsIHNwYWNlcyArIDQsICIiLCBpKTsKKyAgICAgICAgaXRlbUF0KGkpLT5kdW1wKGRzdCwgc3BhY2VzICsgOCk7CisgICAgfQorfQorCitzcDxBdWRpb1Byb2ZpbGU+IEF1ZGlvUHJvZmlsZVZlY3Rvcjo6Z2V0UHJvZmlsZUZvcihhdWRpb19mb3JtYXRfdCBmb3JtYXQpIGNvbnN0Cit7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBpZiAoaXRlbUF0KGkpLT5nZXRGb3JtYXQoKSA9PSBmb3JtYXQpIHsKKyAgICAgICAgICAgIHJldHVybiBpdGVtQXQoaSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgQXVkaW9Qcm9maWxlVmVjdG9yOjpzZXRTYW1wbGVSYXRlc0ZvcigKKyAgICAgICAgY29uc3QgU2FtcGxlUmF0ZVZlY3RvciAmc2FtcGxlUmF0ZXMsIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgIHNwPEF1ZGlvUHJvZmlsZT4gcHJvZmlsZSA9IGl0ZW1BdChpKTsKKyAgICAgICAgaWYgKHByb2ZpbGUtPmdldEZvcm1hdCgpID09IGZvcm1hdCAmJiBwcm9maWxlLT5pc0R5bmFtaWNSYXRlKCkpIHsKKyAgICAgICAgICAgIGlmIChwcm9maWxlLT5oYXNWYWxpZFJhdGVzKCkpIHsKKyAgICAgICAgICAgICAgICAvLyBOZWVkIHRvIGNyZWF0ZSBhIG5ldyBwcm9maWxlIHdpdGggc2FtZSBmb3JtYXQKKyAgICAgICAgICAgICAgICBzcDxBdWRpb1Byb2ZpbGU+IHByb2ZpbGVUb0FkZCA9IG5ldyBBdWRpb1Byb2ZpbGUoZm9ybWF0LCBwcm9maWxlLT5nZXRDaGFubmVscygpLAorICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZXMpOworICAgICAgICAgICAgICAgIHByb2ZpbGVUb0FkZC0+c2V0RHluYW1pY0Zvcm1hdCh0cnVlKTsgLy8gbmVlZCB0byBzZXQgdG8gYWxsb3cgY2xlYW5pbmcKKyAgICAgICAgICAgICAgICBhZGQocHJvZmlsZVRvQWRkKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcHJvZmlsZS0+c2V0U2FtcGxlUmF0ZXMoc2FtcGxlUmF0ZXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIEF1ZGlvUHJvZmlsZVZlY3Rvcjo6c2V0Q2hhbm5lbHNGb3IoY29uc3QgQ2hhbm5lbHNWZWN0b3IgJmNoYW5uZWxNYXNrcywgYXVkaW9fZm9ybWF0X3QgZm9ybWF0KQoreworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc3A8QXVkaW9Qcm9maWxlPiBwcm9maWxlID0gaXRlbUF0KGkpOworICAgICAgICBpZiAocHJvZmlsZS0+Z2V0Rm9ybWF0KCkgPT0gZm9ybWF0ICYmIHByb2ZpbGUtPmlzRHluYW1pY0NoYW5uZWxzKCkpIHsKKyAgICAgICAgICAgIGlmIChwcm9maWxlLT5oYXNWYWxpZENoYW5uZWxzKCkpIHsKKyAgICAgICAgICAgICAgICAvLyBOZWVkIHRvIGNyZWF0ZSBhIG5ldyBwcm9maWxlIHdpdGggc2FtZSBmb3JtYXQKKyAgICAgICAgICAgICAgICBzcDxBdWRpb1Byb2ZpbGU+IHByb2ZpbGVUb0FkZCA9IG5ldyBBdWRpb1Byb2ZpbGUoZm9ybWF0LCBjaGFubmVsTWFza3MsCisgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5nZXRTYW1wbGVSYXRlcygpKTsKKyAgICAgICAgICAgICAgICBwcm9maWxlVG9BZGQtPnNldER5bmFtaWNGb3JtYXQodHJ1ZSk7IC8vIG5lZWQgdG8gc2V0IHRvIGFsbG93IGNsZWFuaW5nCisgICAgICAgICAgICAgICAgYWRkKHByb2ZpbGVUb0FkZCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHByb2ZpbGUtPnNldENoYW5uZWxzKGNoYW5uZWxNYXNrcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIHN0YXRpYwogaW50IEF1ZGlvUHJvZmlsZVZlY3Rvcjo6Y29tcGFyZUZvcm1hdHMoY29uc3Qgc3A8QXVkaW9Qcm9maWxlPiAqcHJvZmlsZTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxBdWRpb1Byb2ZpbGU+ICpwcm9maWxlMikKIHsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvUm91dGUuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9Sb3V0ZS5jcHAKaW5kZXggNzlhZDFmNy4uYzFmZTViMCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9Sb3V0ZS5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9Sb3V0ZS5jcHAKQEAgLTI0LDI5ICsyNCwxNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQKIHsKIAotdm9pZCBBdWRpb1JvdXRlOjpkdW1wKGludCBmZCwgaW50IHNwYWNlcykgY29uc3QKK3ZvaWQgQXVkaW9Sb3V0ZTo6ZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMpIGNvbnN0CiB7Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0gICAgU3RyaW5nOCByZXN1bHQ7Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIFR5cGU6ICVzXG4iLCBzcGFjZXMsICIiLCBtVHlwZSA9PSBBVURJT19ST1VURV9NVVggPyAiTXV4IiA6ICJNaXgiKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIFNpbms6ICVzXG4iLCBzcGFjZXMsICIiLCBtU2luay0+Z2V0VGFnTmFtZSgpLnN0cmluZygpKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0KKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBUeXBlOiAlc1xuIiwgc3BhY2VzLCAiIiwgbVR5cGUgPT0gQVVESU9fUk9VVEVfTVVYID8gIk11eCIgOiAiTWl4Iik7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gU2luazogJXNcbiIsIHNwYWNlcywgIiIsIG1TaW5rLT5nZXRUYWdOYW1lKCkuc3RyaW5nKCkpOwogICAgIGlmIChtU291cmNlcy5zaXplKCkgIT0gMCkgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIFNvdXJjZXM6IFxuIiwgc3BhY2VzLCAiIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gU291cmNlczogXG4iLCBzcGFjZXMsICIiKTsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU291cmNlcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzJXMgXG4iLCBzcGFjZXMgKyA0LCAiIiwgbVNvdXJjZXNbaV0tPmdldFRhZ05hbWUoKS5zdHJpbmcoKSk7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzJXMgXG4iLCBzcGFjZXMgKyA0LCAiIiwgbVNvdXJjZXNbaV0tPmdldFRhZ05hbWUoKS5zdHJpbmcoKSk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmVzdWx0LmFwcGVuZCgiXG4iKTsKLQotICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOworICAgIGRzdC0+YXBwZW5kKCJcbiIpOwogfQogCiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1Nlc3Npb24uY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9TZXNzaW9uLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NkYTQ2Yi4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1Nlc3Npb24uY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjkzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIkFQTTo6QXVkaW9TZXNzaW9uIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8QXVkaW9Qb2xpY3lJbnRlcmZhY2UuaD4KLSNpbmNsdWRlICJwb2xpY3kuaCIKLSNpbmNsdWRlICJBdWRpb1Nlc3Npb24uaCIKLSNpbmNsdWRlICJBdWRpb0dhaW4uaCIKLSNpbmNsdWRlICJUeXBlQ29udmVydGVyLmgiCi0KLSNpbmNsdWRlIDxsb2cvbG9nLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLUF1ZGlvU2Vzc2lvbjo6QXVkaW9TZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1NvdW5kVHJpZ2dlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWl4KiBwb2xpY3lNaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSAqY2xpZW50SW50ZXJmYWNlKSA6Ci0gICAgbVJlY29yZENsaWVudEluZm8oeyAudWlkID0gdWlkLCAuc2Vzc2lvbiA9IHNlc3Npb24sIC5zb3VyY2UgPSBpbnB1dFNvdXJjZX0pLAotICAgIG1Db25maWcoeyAuZm9ybWF0ID0gZm9ybWF0LCAuc2FtcGxlX3JhdGUgPSBzYW1wbGVSYXRlLCAuY2hhbm5lbF9tYXNrID0gY2hhbm5lbE1hc2t9KSwKLSAgICBtRmxhZ3MoZmxhZ3MpLCBtSXNTb3VuZFRyaWdnZXIoaXNTb3VuZFRyaWdnZXIpLAotICAgIG1PcGVuQ291bnQoMSksIG1BY3RpdmVDb3VudCgwKSwgbVBvbGljeU1peChwb2xpY3lNaXgpLCBtQ2xpZW50SW50ZXJmYWNlKGNsaWVudEludGVyZmFjZSksCi0gICAgbUluZm9Qcm92aWRlcihOVUxMKQotewotfQotCi11aW50MzJfdCBBdWRpb1Nlc3Npb246OmNoYW5nZU9wZW5Db3VudChpbnQgZGVsdGEpCi17Ci0gICAgaWYgKChkZWx0YSArIChpbnQpbU9wZW5Db3VudCkgPCAwKSB7Ci0gICAgICAgIEFMT0dXKCIlcyBpbnZhbGlkIGRlbHRhICVkLCBvcGVuIGNvdW50ICVkIiwKLSAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBkZWx0YSwgbU9wZW5Db3VudCk7Ci0gICAgICAgIG1PcGVuQ291bnQgPSAodWludDMyX3QpKC1kZWx0YSk7Ci0gICAgfQotICAgIG1PcGVuQ291bnQgKz0gZGVsdGE7Ci0gICAgQUxPR1YoIiVzIG9wZW4gY291bnQgJWQiLCBfX0ZVTkNUSU9OX18sIG1PcGVuQ291bnQpOwotICAgIHJldHVybiBtT3BlbkNvdW50OwotfQotCi11aW50MzJfdCBBdWRpb1Nlc3Npb246OmNoYW5nZUFjdGl2ZUNvdW50KGludCBkZWx0YSkKLXsKLSAgICBjb25zdCB1aW50MzJfdCBvbGRBY3RpdmVDb3VudCA9IG1BY3RpdmVDb3VudDsKLSAgICBpZiAoKGRlbHRhICsgKGludCltQWN0aXZlQ291bnQpIDwgMCkgewotICAgICAgICBBTE9HVygiJXMgaW52YWxpZCBkZWx0YSAlZCwgYWN0aXZlIGNvdW50ICVkIiwKLSAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBkZWx0YSwgbUFjdGl2ZUNvdW50KTsKLSAgICAgICAgbUFjdGl2ZUNvdW50ID0gKHVpbnQzMl90KSgtZGVsdGEpOwotICAgIH0KLSAgICBtQWN0aXZlQ291bnQgKz0gZGVsdGE7Ci0gICAgQUxPR1YoIiVzIGFjdGl2ZSBjb3VudCAlZCIsIF9fRlVOQ1RJT05fXywgbUFjdGl2ZUNvdW50KTsKLSAgICBpbnQgZXZlbnQgPSBSRUNPUkRfQ09ORklHX0VWRU5UX05PTkU7Ci0KLSAgICBpZiAoKG9sZEFjdGl2ZUNvdW50ID09IDApICYmIChtQWN0aXZlQ291bnQgPiAwKSkgewotICAgICAgICBldmVudCA9IFJFQ09SRF9DT05GSUdfRVZFTlRfU1RBUlQ7Ci0gICAgfSBlbHNlIGlmICgob2xkQWN0aXZlQ291bnQgPiAwKSAmJiAobUFjdGl2ZUNvdW50ID09IDApKSB7Ci0gICAgICAgIGV2ZW50ID0gUkVDT1JEX0NPTkZJR19FVkVOVF9TVE9QOwotICAgIH0KLQotICAgIGlmIChldmVudCAhPSBSRUNPUkRfQ09ORklHX0VWRU5UX05PTkUpIHsKLSAgICAgICAgLy8gRHluYW1pYyBwb2xpY3kgY2FsbGJhY2s6Ci0gICAgICAgIC8vIGlmIGlucHV0IG1hcHMgdG8gYSBkeW5hbWljIHBvbGljeSB3aXRoIGFuIGFjdGl2aXR5IGxpc3RlbmVyLCBub3RpZnkgb2Ygc3RhdGUgY2hhbmdlCi0gICAgICAgIGlmICgobVBvbGljeU1peCAhPSBOVUxMKSAmJiAoKG1Qb2xpY3lNaXgtPm1DYkZsYWdzICYgQXVkaW9NaXg6OmtDYkZsYWdOb3RpZnlBY3Rpdml0eSkgIT0gMCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1DbGllbnRJbnRlcmZhY2UtPm9uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKG1Qb2xpY3lNaXgtPm1EZXZpY2VBZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAoZXZlbnQgPT0gUkVDT1JEX0NPTkZJR19FVkVOVF9TVEFSVCkgPyBNSVhfU1RBVEVfTUlYSU5HIDogTUlYX1NUQVRFX0lETEUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gUmVjb3JkaW5nIGNvbmZpZ3VyYXRpb24gY2FsbGJhY2s6Ci0gICAgICAgIGNvbnN0IEF1ZGlvU2Vzc2lvbkluZm9Qcm92aWRlciogcHJvdmlkZXIgPSBtSW5mb1Byb3ZpZGVyOwotICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90IGRldmljZUNvbmZpZyA9IChwcm92aWRlciAhPSBOVUxMKSA/IHByb3ZpZGVyLT5nZXRDb25maWcoKSA6Ci0gICAgICAgICAgICAgICAgQVVESU9fQ09ORklHX0JBU0VfSU5JVElBTElaRVI7Ci0gICAgICAgIGNvbnN0IGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlID0gKHByb3ZpZGVyICE9IE5VTEwpID8gcHJvdmlkZXItPmdldFBhdGNoSGFuZGxlKCkgOgotICAgICAgICAgICAgICAgIEFVRElPX1BBVENIX0hBTkRMRV9OT05FOwotICAgICAgICBpZiAocGF0Y2hIYW5kbGUgIT0gQVVESU9fUEFUQ0hfSEFORExFX05PTkUpIHsKLSAgICAgICAgICAgIG1DbGllbnRJbnRlcmZhY2UtPm9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShldmVudCwgJm1SZWNvcmRDbGllbnRJbmZvLAotICAgICAgICAgICAgICAgICAgICAmbUNvbmZpZywgJmRldmljZUNvbmZpZywgcGF0Y2hIYW5kbGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIG1BY3RpdmVDb3VudDsKLX0KLQotYm9vbCBBdWRpb1Nlc3Npb246Om1hdGNoZXMoY29uc3Qgc3A8QXVkaW9TZXNzaW9uPiAmb3RoZXIpIGNvbnN0Ci17Ci0gICAgaWYgKG90aGVyLT5zZXNzaW9uKCkgPT0gbVJlY29yZENsaWVudEluZm8uc2Vzc2lvbiAmJgotICAgICAgICBvdGhlci0+aW5wdXRTb3VyY2UoKSA9PSBtUmVjb3JkQ2xpZW50SW5mby5zb3VyY2UgJiYKLSAgICAgICAgb3RoZXItPmZvcm1hdCgpID09IG1Db25maWcuZm9ybWF0ICYmCi0gICAgICAgIG90aGVyLT5zYW1wbGVSYXRlKCkgPT0gbUNvbmZpZy5zYW1wbGVfcmF0ZSAmJgotICAgICAgICBvdGhlci0+Y2hhbm5lbE1hc2soKSA9PSBtQ29uZmlnLmNoYW5uZWxfbWFzayAmJgotICAgICAgICBvdGhlci0+ZmxhZ3MoKSA9PSBtRmxhZ3MgJiYKLSAgICAgICAgb3RoZXItPnVpZCgpID09IG1SZWNvcmRDbGllbnRJbmZvLnVpZCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi12b2lkIEF1ZGlvU2Vzc2lvbjo6c2V0SW5mb1Byb3ZpZGVyKEF1ZGlvU2Vzc2lvbkluZm9Qcm92aWRlciAqcHJvdmlkZXIpCi17Ci0gICAgbUluZm9Qcm92aWRlciA9IHByb3ZpZGVyOwotfQotCi12b2lkIEF1ZGlvU2Vzc2lvbjo6b25TZXNzaW9uSW5mb1VwZGF0ZSgpIGNvbnN0Ci17Ci0gICAgaWYgKG1BY3RpdmVDb3VudCA+IDApIHsKLSAgICAgICAgLy8gcmVzZW5kIHRoZSBjYWxsYmFjayBhZnRlciByZXF1ZXJ5aW5nIHRoZSBpbmZvcm1hdGlvbnMgZnJvbSB0aGUgaW5mbyBwcm92aWRlcgotICAgICAgICBjb25zdCBBdWRpb1Nlc3Npb25JbmZvUHJvdmlkZXIqIHByb3ZpZGVyID0gbUluZm9Qcm92aWRlcjsKLSAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCBkZXZpY2VDb25maWcgPSAocHJvdmlkZXIgIT0gTlVMTCkgPyBwcm92aWRlci0+Z2V0Q29uZmlnKCkgOgotICAgICAgICAgICAgICAgIEFVRElPX0NPTkZJR19CQVNFX0lOSVRJQUxJWkVSOwotICAgICAgICBjb25zdCBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSA9IChwcm92aWRlciAhPSBOVUxMKSA/IHByb3ZpZGVyLT5nZXRQYXRjaEhhbmRsZSgpIDoKLSAgICAgICAgICAgICAgICBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKLSAgICAgICAgaWYgKHBhdGNoSGFuZGxlICE9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgICAgICBtQ2xpZW50SW50ZXJmYWNlLT5vblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoUkVDT1JEX0NPTkZJR19FVkVOVF9TVEFSVCwKLSAgICAgICAgICAgICAgICAgICAgJm1SZWNvcmRDbGllbnRJbmZvLCAmbUNvbmZpZywgJmRldmljZUNvbmZpZywgcGF0Y2hIYW5kbGUpOwotICAgICAgICB9Ci0gICAgfQotfQotCi1zdGF0dXNfdCBBdWRpb1Nlc3Npb246OmR1bXAoaW50IGZkLCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgpIGNvbnN0Ci17Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0gICAgU3RyaW5nOCByZXN1bHQ7Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnNBdWRpbyBzZXNzaW9uICVkOlxuIiwgc3BhY2VzLCAiIiwgaW5kZXgrMSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gc2Vzc2lvbjogJTJkXG4iLCBzcGFjZXMsICIiLCBtUmVjb3JkQ2xpZW50SW5mby5zZXNzaW9uKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBvd25lciB1aWQ6ICUyZFxuIiwgc3BhY2VzLCAiIiwgbVJlY29yZENsaWVudEluZm8udWlkKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBpbnB1dCBzb3VyY2U6ICVkXG4iLCBzcGFjZXMsICIiLCBtUmVjb3JkQ2xpZW50SW5mby5zb3VyY2UpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIGZvcm1hdDogJTA4eFxuIiwgc3BhY2VzLCAiIiwgbUNvbmZpZy5mb3JtYXQpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIHNhbXBsZTogJWRcbiIsIHNwYWNlcywgIiIsIG1Db25maWcuc2FtcGxlX3JhdGUpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIGNoYW5uZWwgbWFzazogJTA4eFxuIiwKLSAgICAgICAgICAgICBzcGFjZXMsICIiLCBtQ29uZmlnLmNoYW5uZWxfbWFzayk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gaXMgc291bmR0cmlnZ2VyOiAlc1xuIiwKLSAgICAgICAgICAgICBzcGFjZXMsICIiLCBtSXNTb3VuZFRyaWdnZXIgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBvcGVuIGNvdW50OiAlZFxuIiwgc3BhY2VzLCAiIiwgbU9wZW5Db3VudCk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gYWN0aXZlIGNvdW50OiAlZFxuIiwgc3BhY2VzLCAiIiwgbUFjdGl2ZUNvdW50KTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0KLSAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IEF1ZGlvU2Vzc2lvbkNvbGxlY3Rpb246OmFkZFNlc3Npb24oYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvU2Vzc2lvbj4mIGF1ZGlvU2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9TZXNzaW9uSW5mb1Byb3ZpZGVyICpwcm92aWRlcikKLXsKLSAgICBzc2l6ZV90IGluZGV4ID0gaW5kZXhPZktleShzZXNzaW9uKTsKLQotICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgIEFMT0dXKCJhZGRTZXNzaW9uKCkgc2Vzc2lvbiAlZCBhbHJlYWR5IGluIiwgc2Vzc2lvbik7Ci0gICAgICAgIHJldHVybiBBTFJFQURZX0VYSVNUUzsKLSAgICB9Ci0gICAgYXVkaW9TZXNzaW9uLT5zZXRJbmZvUHJvdmlkZXIocHJvdmlkZXIpOwotICAgIGFkZChzZXNzaW9uLCBhdWRpb1Nlc3Npb24pOwotICAgIEFMT0dWKCJhZGRTZXNzaW9uKCkgc2Vzc2lvbiAlZCAgY2xpZW50ICVkIHNvdXJjZSAlZCIsCi0gICAgICAgICAgICBzZXNzaW9uLCBhdWRpb1Nlc3Npb24tPnVpZCgpLCBhdWRpb1Nlc3Npb24tPmlucHV0U291cmNlKCkpOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotc3RhdHVzX3QgQXVkaW9TZXNzaW9uQ29sbGVjdGlvbjo6cmVtb3ZlU2Vzc2lvbihhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKLXsKLSAgICBzc2l6ZV90IGluZGV4ID0gaW5kZXhPZktleShzZXNzaW9uKTsKLQotICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgQUxPR1coInJlbW92ZVNlc3Npb24oKSBzZXNzaW9uICVkIG5vdCBpbiIsIHNlc3Npb24pOwotICAgICAgICByZXR1cm4gQUxSRUFEWV9FWElTVFM7Ci0gICAgfQotICAgIEFMT0dWKCJyZW1vdmVTZXNzaW9uKCkgc2Vzc2lvbiAlZCIsIHNlc3Npb24pOwotICAgIHZhbHVlQXQoaW5kZXgpLT5zZXRJbmZvUHJvdmlkZXIoTlVMTCk7Ci0gICAgcmVtb3ZlSXRlbXNBdChpbmRleCk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi11aW50MzJfdCBBdWRpb1Nlc3Npb25Db2xsZWN0aW9uOjpnZXRPcGVuQ291bnQoKSBjb25zdAotewotICAgIHVpbnQzMl90IG9wZW5Db3VudCA9IDA7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICBvcGVuQ291bnQgKz0gdmFsdWVBdChpKS0+b3BlbkNvdW50KCk7Ci0gICAgfQotICAgIHJldHVybiBvcGVuQ291bnQ7Ci19Ci0KLUF1ZGlvU2Vzc2lvbkNvbGxlY3Rpb24gQXVkaW9TZXNzaW9uQ29sbGVjdGlvbjo6Z2V0QWN0aXZlU2Vzc2lvbnMoKSBjb25zdAotewotICAgIEF1ZGlvU2Vzc2lvbkNvbGxlY3Rpb24gYWN0aXZlU2Vzc2lvbnM7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICBpZiAodmFsdWVBdChpKS0+YWN0aXZlQ291bnQoKSAhPSAwKSB7Ci0gICAgICAgICAgICBhY3RpdmVTZXNzaW9ucy5hZGQodmFsdWVBdChpKS0+c2Vzc2lvbigpLCB2YWx1ZUF0KGkpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gYWN0aXZlU2Vzc2lvbnM7Ci19Ci0KLXNpemVfdCBBdWRpb1Nlc3Npb25Db2xsZWN0aW9uOjpnZXRBY3RpdmVTZXNzaW9uQ291bnQoKSBjb25zdAotewotICAgIHNpemVfdCBhY3RpdmVDb3VudCA9IDA7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICBpZiAodmFsdWVBdChpKS0+YWN0aXZlQ291bnQoKSAhPSAwKSB7Ci0gICAgICAgICAgICBhY3RpdmVDb3VudCsrOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBhY3RpdmVDb3VudDsKLX0KLQotYm9vbCBBdWRpb1Nlc3Npb25Db2xsZWN0aW9uOjpoYXNBY3RpdmVTZXNzaW9uKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QWN0aXZlU2Vzc2lvbkNvdW50KCkgIT0gMDsKLX0KLQotYm9vbCBBdWRpb1Nlc3Npb25Db2xsZWN0aW9uOjppc1NvdXJjZUFjdGl2ZShhdWRpb19zb3VyY2VfdCBzb3VyY2UpIGNvbnN0Ci17Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICBjb25zdCBzcDxBdWRpb1Nlc3Npb24+ICBhdWRpb1Nlc3Npb24gPSB2YWx1ZUF0KGkpOwotICAgICAgICAvLyBBVURJT19TT1VSQ0VfSE9UV09SRCBpcyBlcXVpdmFsZW50IHRvIEFVRElPX1NPVVJDRV9WT0lDRV9SRUNPR05JVElPTiBvbmx5IGlmIGl0Ci0gICAgICAgIC8vIGNvcnJlc3BvbmRzIHRvIGFuIGFjdGl2ZSBjYXB0dXJlIHRyaWdnZXJlZCBieSBhIGhhcmR3YXJlIGhvdHdvcmQgcmVjb2duaXRpb24KLSAgICAgICAgaWYgKGF1ZGlvU2Vzc2lvbi0+YWN0aXZlQ291bnQoKSA+IDAgJiYKLSAgICAgICAgICAgICAgICAoKGF1ZGlvU2Vzc2lvbi0+aW5wdXRTb3VyY2UoKSA9PSBzb3VyY2UpIHx8Ci0gICAgICAgICAgICAgICAgKChzb3VyY2UgPT0gQVVESU9fU09VUkNFX1ZPSUNFX1JFQ09HTklUSU9OKSAmJgotICAgICAgICAgICAgICAgICAoYXVkaW9TZXNzaW9uLT5pbnB1dFNvdXJjZSgpID09IEFVRElPX1NPVVJDRV9IT1RXT1JEKSAmJgotICAgICAgICAgICAgICAgICBhdWRpb1Nlc3Npb24tPmlzU291bmRUcmlnZ2VyKCkpKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1hdWRpb19zb3VyY2VfdCBBdWRpb1Nlc3Npb25Db2xsZWN0aW9uOjpnZXRIaWdoZXN0UHJpb3JpdHlTb3VyY2UoYm9vbCBhY3RpdmVPbmx5KSBjb25zdAotewotICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSA9IEFVRElPX1NPVVJDRV9ERUZBVUxUOwotICAgIGludDMyX3QgcHJpb3JpdHkgPSAtMTsKLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgY29uc3Qgc3A8QXVkaW9TZXNzaW9uPiAgYXVkaW9TZXNzaW9uID0gdmFsdWVBdChpKTsKLSAgICAgICAgaWYgKGFjdGl2ZU9ubHkgJiYgYXVkaW9TZXNzaW9uLT5hY3RpdmVDb3VudCgpID09IDApIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGludDMyX3QgY3VyUHJpb3JpdHkgPSBzb3VyY2VfcHJpb3JpdHkoYXVkaW9TZXNzaW9uLT5pbnB1dFNvdXJjZSgpKTsKLSAgICAgICAgaWYgKGN1clByaW9yaXR5ID4gcHJpb3JpdHkpIHsKLSAgICAgICAgICAgIHByaW9yaXR5ID0gY3VyUHJpb3JpdHk7Ci0gICAgICAgICAgICBzb3VyY2UgPSBhdWRpb1Nlc3Npb24tPmlucHV0U291cmNlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHNvdXJjZTsKLX0KLQotdm9pZCBBdWRpb1Nlc3Npb25Db2xsZWN0aW9uOjpvblNlc3Npb25JbmZvVXBkYXRlKCkgY29uc3QKLXsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgIHZhbHVlQXQoaSktPm9uU2Vzc2lvbkluZm9VcGRhdGUoKTsKLSAgICB9Ci19Ci0KLXN0YXR1c190IEF1ZGlvU2Vzc2lvbkNvbGxlY3Rpb246OmR1bXAoaW50IGZkLCBpbnQgc3BhY2VzKSBjb25zdAotewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqc0F1ZGlvIFNlc3Npb25zOlxuIiwgc3BhY2VzLCAiIik7Ci0gICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgdmFsdWVBdChpKS0+ZHVtcChmZCwgc3BhY2VzICsgMiwgaSk7Ci0gICAgfQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9Tb3VyY2VEZXNjcmlwdG9yLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvU291cmNlRGVzY3JpcHRvci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMzNlNTcuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9Tb3VyY2VEZXNjcmlwdG9yLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIkFQTTo6QXVkaW9Tb3VyY2VEZXNjcmlwdG9yIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgotI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUG9saWN5SGVscGVyLmg+Ci0jaW5jbHVkZSA8SHdNb2R1bGUuaD4KLSNpbmNsdWRlIDxBdWRpb0dhaW4uaD4KLSNpbmNsdWRlIDxBdWRpb1NvdXJjZURlc2NyaXB0b3IuaD4KLSNpbmNsdWRlIDxEZXZpY2VEZXNjcmlwdG9yLmg+Ci0jaW5jbHVkZSA8SU9Qcm9maWxlLmg+Ci0jaW5jbHVkZSA8QXVkaW9PdXRwdXREZXNjcmlwdG9yLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RhdHVzX3QgQXVkaW9Tb3VyY2VEZXNjcmlwdG9yOjpkdW1wKGludCBmZCkKLXsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLSAgICBTdHJpbmc4IHJlc3VsdDsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIm1TdHJlYW06ICVkXG4iLCBhdWRpb19hdHRyaWJ1dGVzX3RvX3N0cmVhbV90eXBlKCZtQXR0cmlidXRlcykpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJtRGV2aWNlOlxuIik7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwotICAgIG1EZXZpY2UtPmR1bXAoZmQsIDIgLCAwKTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLQotc3RhdHVzX3QgQXVkaW9Tb3VyY2VDb2xsZWN0aW9uOjpkdW1wKGludCBmZCkgY29uc3QKLXsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlxuQXVkaW8gc291cmNlcyBkdW1wOlxuIik7Ci0gICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiLSBTb3VyY2UgJWQgZHVtcDpcbiIsIGtleUF0KGkpKTsKLSAgICAgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwotICAgICAgICB2YWx1ZUF0KGkpLT5kdW1wKGZkKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLX07IC8vbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0NsaWVudERlc2NyaXB0b3IuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQ2xpZW50RGVzY3JpcHRvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODE1NjEyZAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0NsaWVudERlc2NyaXB0b3IuY3BwCkBAIC0wLDAgKzEsMTA4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJBUE1fQ2xpZW50RGVzY3JpcHRvciIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgIkF1ZGlvR2Fpbi5oIgorI2luY2x1ZGUgIkF1ZGlvT3V0cHV0RGVzY3JpcHRvci5oIgorI2luY2x1ZGUgIkF1ZGlvUGF0Y2guaCIKKyNpbmNsdWRlICJDbGllbnREZXNjcmlwdG9yLmgiCisjaW5jbHVkZSAiRGV2aWNlRGVzY3JpcHRvci5oIgorI2luY2x1ZGUgIkh3TW9kdWxlLmgiCisjaW5jbHVkZSAiSU9Qcm9maWxlLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RkOjpzdHJpbmcgQ2xpZW50RGVzY3JpcHRvcjo6dG9TaG9ydFN0cmluZygpIGNvbnN0Cit7CisgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CisKKyAgICBzcyA8PCAiUG9ydElkOiAiIDw8IG1Qb3J0SWQgPDwgIiBTZXNzaW9uSWQ6ICIgPDwgbVNlc3Npb25JZCA8PCAiIFVpZDogIiA8PCBtVWlkOworICAgIHJldHVybiBzcy5zdHIoKTsKK30KKwordm9pZCBDbGllbnREZXNjcmlwdG9yOjpkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdAoreworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnNDbGllbnQgJWQ6XG4iLCBzcGFjZXMsICIiLCBpbmRleCsxKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBQb3J0IElkOiAlZCBTZXNzaW9uIElkOiAlZCBVSUQ6ICVkXG4iLCBzcGFjZXMsICIiLAorICAgICAgICAgICAgIG1Qb3J0SWQsIG1TZXNzaW9uSWQsIG1VaWQpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIEZvcm1hdDogJTA4eCBTYW1wbGluZyByYXRlOiAlZCBDaGFubmVsczogJTA4eFxuIiwgc3BhY2VzLCAiIiwKKyAgICAgICAgICAgICBtQ29uZmlnLmZvcm1hdCwgbUNvbmZpZy5zYW1wbGVfcmF0ZSwgbUNvbmZpZy5jaGFubmVsX21hc2spOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIFByZWZlcnJlZCBEZXZpY2UgSWQ6ICUwOHhcbiIsIHNwYWNlcywgIiIsIG1QcmVmZXJyZWREZXZpY2VJZCk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gU3RhdGU6ICVzXG4iLCBzcGFjZXMsICIiLCBtQWN0aXZlID8gIkFjdGl2ZSIgOiAiSW5hY3RpdmUiKTsKK30KKwordm9pZCBUcmFja0NsaWVudERlc2NyaXB0b3I6OmR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgpIGNvbnN0Cit7CisgICAgQ2xpZW50RGVzY3JpcHRvcjo6ZHVtcChkc3QsIHNwYWNlcywgaW5kZXgpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIFN0cmVhbTogJWQgZmxhZ3M6ICUwOHhcbiIsIHNwYWNlcywgIiIsIG1TdHJlYW0sIG1GbGFncyk7Cit9CisKK3N0ZDo6c3RyaW5nIFRyYWNrQ2xpZW50RGVzY3JpcHRvcjo6dG9TaG9ydFN0cmluZygpIGNvbnN0Cit7CisgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CisKKyAgICBzcyA8PCBDbGllbnREZXNjcmlwdG9yOjp0b1Nob3J0U3RyaW5nKCkgPDwgIiBTdHJlYW06ICIgPDwgbVN0cmVhbTsKKyAgICByZXR1cm4gc3Muc3RyKCk7Cit9CisKK3ZvaWQgUmVjb3JkQ2xpZW50RGVzY3JpcHRvcjo6ZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMsIGludCBpbmRleCkgY29uc3QKK3sKKyAgICBDbGllbnREZXNjcmlwdG9yOjpkdW1wKGRzdCwgc3BhY2VzLCBpbmRleCk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gU291cmNlOiAlZCBmbGFnczogJTA4eFxuIiwgc3BhY2VzLCAiIiwgbVNvdXJjZSwgbUZsYWdzKTsKK30KKworU291cmNlQ2xpZW50RGVzY3JpcHRvcjo6U291cmNlQ2xpZW50RGVzY3JpcHRvcihhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCwgdWlkX3QgdWlkLAorICAgICAgICAgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXMsIGNvbnN0IHNwPEF1ZGlvUGF0Y2g+JiBwYXRjaERlc2MsCisgICAgICAgICBjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgc3JjRGV2aWNlLCBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgIHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3kpIDoKKyAgICBUcmFja0NsaWVudERlc2NyaXB0b3I6OlRyYWNrQ2xpZW50RGVzY3JpcHRvcihwb3J0SWQsIHVpZCwgQVVESU9fU0VTU0lPTl9OT05FLCBhdHRyaWJ1dGVzLAorICAgICAgICBBVURJT19DT05GSUdfQkFTRV9JTklUSUFMSVpFUiwgQVVESU9fUE9SVF9IQU5ETEVfTk9ORSwKKyAgICAgICAgc3RyZWFtLCBzdHJhdGVneSwgQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSksCisgICAgICAgIG1QYXRjaERlc2MocGF0Y2hEZXNjKSwgbVNyY0RldmljZShzcmNEZXZpY2UpCit7Cit9CisKK3ZvaWQgU291cmNlQ2xpZW50RGVzY3JpcHRvcjo6c2V0U3dPdXRwdXQoY29uc3Qgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+JiBzd091dHB1dCkKK3sKKyAgICBtU3dPdXRwdXQgPSBzd091dHB1dDsKK30KKwordm9pZCBTb3VyY2VDbGllbnREZXNjcmlwdG9yOjpzZXRId091dHB1dChjb25zdCBzcDxId0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIGh3T3V0cHV0KQoreworICAgIG1Id091dHB1dCA9IGh3T3V0cHV0OworfQorCit2b2lkIFNvdXJjZUNsaWVudERlc2NyaXB0b3I6OmR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgpIGNvbnN0Cit7CisgICAgVHJhY2tDbGllbnREZXNjcmlwdG9yOjpkdW1wKGRzdCwgc3BhY2VzLCBpbmRleCk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gRGV2aWNlOlxuIiwgc3BhY2VzLCAiIik7CisgICAgbVNyY0RldmljZS0+ZHVtcChkc3QsIDIsIDApOworfQorCit2b2lkIFNvdXJjZUNsaWVudENvbGxlY3Rpb246OmR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdAoreworICAgIGRzdC0+YXBwZW5kKCJcbkF1ZGlvIHNvdXJjZXM6XG4iKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgIHZhbHVlQXQoaSktPmR1bXAoZHN0LCAyLCBpKTsKKyAgICB9Cit9CisKK307IC8vbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0NvbmZpZ1BhcnNpbmdVdGlscy5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9Db25maWdQYXJzaW5nVXRpbHMuY3BwCmluZGV4IDFlMTA1ZjUuLjU5ZGI4MWMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0NvbmZpZ1BhcnNpbmdVdGlscy5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQ29uZmlnUGFyc2luZ1V0aWxzLmNwcApAQCAtNDA3LDExICs0MDcsMTQgQEAKIAogICAgIGNvbmZpZy5zZXRId01vZHVsZXMoaHdNb2R1bGVzKTsKIAorICAgIGNvbmZpZy5zZXREZWZhdWx0U3Vycm91bmRGb3JtYXRzKCk7CisKICAgICBjb25maWdfZnJlZShyb290KTsKICAgICBmcmVlKHJvb3QpOwogICAgIGZyZWUoZGF0YSk7CiAKICAgICBBTE9HSSgibG9hZEF1ZGlvUG9saWN5Q29uZmlnKCkgbG9hZGVkICVzXG4iLCBwYXRoKTsKKyAgICBjb25maWcuc2V0U291cmNlKHBhdGgpOwogCiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvRGV2aWNlRGVzY3JpcHRvci5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9EZXZpY2VEZXNjcmlwdG9yLmNwcAppbmRleCAxOWMyMDYyLi5hOWY3MjIwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9EZXZpY2VEZXNjcmlwdG9yLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9EZXZpY2VEZXNjcmlwdG9yLmNwcApAQCAtMTIxLDE3ICsxMjEsMjggQEAKICAgICByZXR1cm4gcmV0OwogfQogCi1hdWRpb19kZXZpY2VzX3QgRGV2aWNlVmVjdG9yOjpnZXREZXZpY2VzRnJvbUh3TW9kdWxlKGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGVIYW5kbGUpIGNvbnN0CitEZXZpY2VWZWN0b3IgRGV2aWNlVmVjdG9yOjpnZXREZXZpY2VzRnJvbUh3TW9kdWxlKGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGVIYW5kbGUpIGNvbnN0CiB7Ci0gICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMgPSBBVURJT19ERVZJQ0VfTk9ORTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGlmIChpdGVtQXQoaSktPmdldE1vZHVsZUhhbmRsZSgpID09IG1vZHVsZUhhbmRsZSkgewotICAgICAgICAgICAgZGV2aWNlcyB8PSBpdGVtQXQoaSktPnR5cGUoKTsKKyAgICBEZXZpY2VWZWN0b3IgZGV2aWNlczsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGRldmljZSA6ICp0aGlzKSB7CisgICAgICAgIGlmIChkZXZpY2UtPmdldE1vZHVsZUhhbmRsZSgpID09IG1vZHVsZUhhbmRsZSkgeworICAgICAgICAgICAgZGV2aWNlcy5hZGQoZGV2aWNlKTsKICAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gZGV2aWNlczsKIH0KIAorYXVkaW9fZGV2aWNlc190IERldmljZVZlY3Rvcjo6Z2V0RGV2aWNlVHlwZXNGcm9tSHdNb2R1bGUoYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZUhhbmRsZSkgY29uc3QKK3sKKyAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlVHlwZXMgPSBBVURJT19ERVZJQ0VfTk9ORTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGRldmljZSA6ICp0aGlzKSB7CisgICAgICAgIGlmIChkZXZpY2UtPmdldE1vZHVsZUhhbmRsZSgpID09IG1vZHVsZUhhbmRsZSkgeworICAgICAgICAgICAgZGV2aWNlVHlwZXMgfD0gZGV2aWNlLT50eXBlKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGRldmljZVR5cGVzOworfQorCiBzcDxEZXZpY2VEZXNjcmlwdG9yPiBEZXZpY2VWZWN0b3I6OmdldERldmljZShhdWRpb19kZXZpY2VzX3QgdHlwZSwgY29uc3QgU3RyaW5nOCYgYWRkcmVzcykgY29uc3QKIHsKICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2U7CkBAIC0xNDUsOCArMTU2LDggQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICBBTE9HVigiRGV2aWNlVmVjdG9yOjpnZXREZXZpY2UoKSBmb3IgdHlwZSAlMDh4IGFkZHJlc3MgJXMgZm91bmQgJXAiLAotICAgICAgICAgIHR5cGUsIGFkZHJlc3Muc3RyaW5nKCksIGRldmljZS5nZXQoKSk7CisgICAgQUxPR1YoIkRldmljZVZlY3Rvcjo6JXMoKSBmb3IgdHlwZSAlMDh4IGFkZHJlc3MgXCIlc1wiIGZvdW5kICVwIiwKKyAgICAgICAgICAgIF9fZnVuY19fLCB0eXBlLCBhZGRyZXNzLnN0cmluZygpLCBkZXZpY2UuZ2V0KCkpOwogICAgIHJldHVybiBkZXZpY2U7CiB9CiAKQEAgLTE2MCw3ICsxNzEsNyBAQAogICAgIHJldHVybiBudWxscHRyOwogfQogCi1EZXZpY2VWZWN0b3IgRGV2aWNlVmVjdG9yOjpnZXREZXZpY2VzRnJvbVR5cGUoYXVkaW9fZGV2aWNlc190IHR5cGUpIGNvbnN0CitEZXZpY2VWZWN0b3IgRGV2aWNlVmVjdG9yOjpnZXREZXZpY2VzRnJvbVR5cGVNYXNrKGF1ZGlvX2RldmljZXNfdCB0eXBlKSBjb25zdAogewogICAgIERldmljZVZlY3RvciBkZXZpY2VzOwogICAgIGJvb2wgaXNPdXRwdXQgPSBhdWRpb19pc19vdXRwdXRfZGV2aWNlcyh0eXBlKTsKQEAgLTE3MSwyMCArMTgyLDggQEAKICAgICAgICAgaWYgKChpc091dHB1dCA9PSBjdXJJc091dHB1dCkgJiYgKCh0eXBlICYgY3VyVHlwZSkgIT0gMCkpIHsKICAgICAgICAgICAgIGRldmljZXMuYWRkKGl0ZW1BdChpKSk7CiAgICAgICAgICAgICB0eXBlICY9IH5jdXJUeXBlOwotICAgICAgICAgICAgQUxPR1YoIkRldmljZVZlY3Rvcjo6Z2V0RGV2aWNlc0Zyb21UeXBlKCkgZm9yIHR5cGUgJXggZm91bmQgJXAiLAotICAgICAgICAgICAgICAgICAgaXRlbUF0KGkpLT50eXBlKCksIGl0ZW1BdChpKS5nZXQoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGRldmljZXM7Ci19Ci0KLURldmljZVZlY3RvciBEZXZpY2VWZWN0b3I6OmdldERldmljZXNGcm9tVHlwZUFkZHIoCi0gICAgICAgIGF1ZGlvX2RldmljZXNfdCB0eXBlLCBjb25zdCBTdHJpbmc4JiBhZGRyZXNzKSBjb25zdAotewotICAgIERldmljZVZlY3RvciBkZXZpY2VzOwotICAgIGZvciAoY29uc3QgYXV0byYgZGV2aWNlIDogKnRoaXMpIHsKLSAgICAgICAgaWYgKGRldmljZS0+dHlwZSgpID09IHR5cGUgJiYgZGV2aWNlLT5tQWRkcmVzcyA9PSBhZGRyZXNzKSB7Ci0gICAgICAgICAgICBkZXZpY2VzLmFkZChkZXZpY2UpOworICAgICAgICAgICAgQUxPR1YoIkRldmljZVZlY3Rvcjo6JXMoKSBmb3IgdHlwZSAlMDh4IGZvdW5kICVwIiwKKyAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGl0ZW1BdChpKS0+dHlwZSgpLCBpdGVtQXQoaSkuZ2V0KCkpOwogICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiBkZXZpY2VzOwpAQCAtMjAwLDIwICsxOTksMTUgQEAKICAgICByZXR1cm4gbnVsbHB0cjsKIH0KIAotc3RhdHVzX3QgRGV2aWNlVmVjdG9yOjpkdW1wKGludCBmZCwgY29uc3QgU3RyaW5nOCAmdGFnLCBpbnQgc3BhY2VzLCBib29sIHZlcmJvc2UpIGNvbnN0Cit2b2lkIERldmljZVZlY3Rvcjo6ZHVtcChTdHJpbmc4ICpkc3QsIGNvbnN0IFN0cmluZzggJnRhZywgaW50IHNwYWNlcywgYm9vbCB2ZXJib3NlKSBjb25zdAogewogICAgIGlmIChpc0VtcHR5KCkpIHsKLSAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICByZXR1cm47CiAgICAgfQotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSAlcyBkZXZpY2VzOlxuIiwgc3BhY2VzLCAiIiwgdGFnLnN0cmluZygpKTsKLSAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gJXMgZGV2aWNlczpcbiIsIHNwYWNlcywgIiIsIHRhZy5zdHJpbmcoKSk7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICBpdGVtQXQoaSktPmR1bXAoZmQsIHNwYWNlcyArIDIsIGksIHZlcmJvc2UpOworICAgICAgICBpdGVtQXQoaSktPmR1bXAoZHN0LCBzcGFjZXMgKyAyLCBpLCB2ZXJib3NlKTsKICAgICB9Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCiB2b2lkIERldmljZURlc2NyaXB0b3I6OnRvQXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqZHN0Q29uZmlnLApAQCAtMjUzLDcgKzI0Nyw3IEBACiAKIHZvaWQgRGV2aWNlRGVzY3JpcHRvcjo6dG9BdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpIGNvbnN0CiB7Ci0gICAgQUxPR1YoIkRldmljZURlc2NyaXB0b3I6OnRvQXVkaW9Qb3J0KCkgaGFuZGxlICVkIHR5cGUgJXgiLCBtSWQsIG1EZXZpY2VUeXBlKTsKKyAgICBBTE9HVigiRGV2aWNlRGVzY3JpcHRvcjo6dG9BdWRpb1BvcnQoKSBoYW5kbGUgJWQgdHlwZSAlMDh4IiwgbUlkLCBtRGV2aWNlVHlwZSk7CiAgICAgQXVkaW9Qb3J0Ojp0b0F1ZGlvUG9ydChwb3J0KTsKICAgICBwb3J0LT5pZCA9IG1JZDsKICAgICB0b0F1ZGlvUG9ydENvbmZpZygmcG9ydC0+YWN0aXZlX2NvbmZpZyk7CkBAIC0yNzAsNDIgKzI2NCwzMCBAQAogICAgIHBvcnQtPnBpY2tBdWRpb1Byb2ZpbGUobVNhbXBsaW5nUmF0ZSwgbUNoYW5uZWxNYXNrLCBtRm9ybWF0KTsKIH0KIAotc3RhdHVzX3QgRGV2aWNlRGVzY3JpcHRvcjo6ZHVtcChpbnQgZmQsIGludCBzcGFjZXMsIGludCBpbmRleCwgYm9vbCB2ZXJib3NlKSBjb25zdAordm9pZCBEZXZpY2VEZXNjcmlwdG9yOjpkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcywgaW50IGluZGV4LCBib29sIHZlcmJvc2UpIGNvbnN0CiB7Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0gICAgU3RyaW5nOCByZXN1bHQ7Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnNEZXZpY2UgJWQ6XG4iLCBzcGFjZXMsICIiLCBpbmRleCsxKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqc0RldmljZSAlZDpcbiIsIHNwYWNlcywgIiIsIGluZGV4ICsgMSk7CiAgICAgaWYgKG1JZCAhPSAwKSB7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gaWQ6ICUyZFxuIiwgc3BhY2VzLCAiIiwgbUlkKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBpZDogJTJkXG4iLCBzcGFjZXMsICIiLCBtSWQpOwogICAgIH0KICAgICBpZiAoIW1UYWdOYW1lLmlzRW1wdHkoKSkgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIHRhZyBuYW1lOiAlc1xuIiwgc3BhY2VzLCAiIiwgbVRhZ05hbWUuc3RyaW5nKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIHRhZyBuYW1lOiAlc1xuIiwgc3BhY2VzLCAiIiwgbVRhZ05hbWUuc3RyaW5nKCkpOwogICAgIH0KICAgICBzdGQ6OnN0cmluZyBkZXZpY2VMaXRlcmFsOwogICAgIGlmIChkZXZpY2VUb1N0cmluZyhtRGV2aWNlVHlwZSwgZGV2aWNlTGl0ZXJhbCkpIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSB0eXBlOiAlLTQ4c1xuIiwgc3BhY2VzLCAiIiwgZGV2aWNlTGl0ZXJhbC5jX3N0cigpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSB0eXBlOiAlLTQ4c1xuIiwgc3BhY2VzLCAiIiwgZGV2aWNlTGl0ZXJhbC5jX3N0cigpKTsKICAgICB9CiAgICAgaWYgKG1BZGRyZXNzLnNpemUoKSAhPSAwKSB7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gYWRkcmVzczogJS0zMnNcbiIsIHNwYWNlcywgIiIsIG1BZGRyZXNzLnN0cmluZygpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBhZGRyZXNzOiAlLTMyc1xuIiwgc3BhY2VzLCAiIiwgbUFkZHJlc3Muc3RyaW5nKCkpOwogICAgIH0KLSAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKLSAgICBBdWRpb1BvcnQ6OmR1bXAoZmQsIHNwYWNlcywgdmVyYm9zZSk7Ci0KLSAgICByZXR1cm4gTk9fRVJST1I7CisgICAgQXVkaW9Qb3J0OjpkdW1wKGRzdCwgc3BhY2VzLCB2ZXJib3NlKTsKIH0KIAogdm9pZCBEZXZpY2VEZXNjcmlwdG9yOjpsb2coKSBjb25zdAogewogICAgIHN0ZDo6c3RyaW5nIGRldmljZTsKICAgICBkZXZpY2VUb1N0cmluZyhtRGV2aWNlVHlwZSwgZGV2aWNlKTsKLSAgICBBTE9HSSgiRGV2aWNlIGlkOiVkIHR5cGU6MHglWDolcywgYWRkcjolcyIsIG1JZCwgIG1EZXZpY2VUeXBlLCBkZXZpY2UuY19zdHIoKSwKKyAgICBBTE9HSSgiRGV2aWNlIGlkOiVkIHR5cGU6MHglMDhYOiVzLCBhZGRyOiVzIiwgbUlkLCAgbURldmljZVR5cGUsIGRldmljZS5jX3N0cigpLAogICAgICAgICAgIG1BZGRyZXNzLnN0cmluZygpKTsKIAogICAgIEF1ZGlvUG9ydDo6bG9nKCIgICIpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvRWZmZWN0RGVzY3JpcHRvci5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9FZmZlY3REZXNjcmlwdG9yLmNwcAppbmRleCA3YjIzNDFlLi44YmJiNzk4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9FZmZlY3REZXNjcmlwdG9yLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9FZmZlY3REZXNjcmlwdG9yLmNwcApAQCAtMjIsMjUgKzIyLDEzIEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotc3RhdHVzX3QgRWZmZWN0RGVzY3JpcHRvcjo6ZHVtcChpbnQgZmQpCit2b2lkIEVmZmVjdERlc2NyaXB0b3I6OmR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdAogewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotICAgIFN0cmluZzggcmVzdWx0OwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIEkvTzogJWRcbiIsIG1Jbyk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBTdHJhdGVneTogJWRcbiIsIG1TdHJhdGVneSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBTZXNzaW9uOiAlZFxuIiwgbVNlc3Npb24pOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgTmFtZTogJXNcbiIsICBtRGVzYy5uYW1lKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICVzXG4iLCAgbUVuYWJsZWQgPyAiRW5hYmxlZCIgOiAiRGlzYWJsZWQiKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7Ci0KLSAgICByZXR1cm4gTk9fRVJST1I7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBJL086ICVkXG4iLCBtSW8pOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgU3RyYXRlZ3k6ICVkXG4iLCBtU3RyYXRlZ3kpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgU2Vzc2lvbjogJWRcbiIsIG1TZXNzaW9uKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIE5hbWU6ICVzXG4iLCAgbURlc2MubmFtZSk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiAlc1xuIiwgIG1FbmFibGVkID8gIkVuYWJsZWQiIDogIkRpc2FibGVkIik7CiB9CiAKIEVmZmVjdERlc2NyaXB0b3JDb2xsZWN0aW9uOjpFZmZlY3REZXNjcmlwdG9yQ29sbGVjdGlvbigpIDoKQEAgLTE3NCwyNCArMTYyLDE2IEBACiAgICAgcmV0dXJuIE1BWF9FRkZFQ1RTX01FTU9SWTsKIH0KIAotc3RhdHVzX3QgRWZmZWN0RGVzY3JpcHRvckNvbGxlY3Rpb246OmR1bXAoaW50IGZkKQordm9pZCBFZmZlY3REZXNjcmlwdG9yQ29sbGVjdGlvbjo6ZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0CiB7Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsCisgICAgZHN0LT5hcHBlbmRGb3JtYXQoCiAgICAgICAgICAgICAiXG5Ub3RhbCBFZmZlY3RzIENQVTogJWYgTUlQUywgVG90YWwgRWZmZWN0cyBtZW1vcnk6ICVkIEtCLCBNYXggbWVtb3J5IHVzZWQ6ICVkIEtCXG4iLAogICAgICAgICAgICAgIChmbG9hdCltVG90YWxFZmZlY3RzQ3B1TG9hZC8xMCwgbVRvdGFsRWZmZWN0c01lbW9yeSwgbVRvdGFsRWZmZWN0c01lbW9yeU1heFVzZWQpOwotICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlJlZ2lzdGVyZWQgZWZmZWN0czpcbiIpOwotICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKKyAgICBkc3QtPmFwcGVuZCgiUmVnaXN0ZXJlZCBlZmZlY3RzOlxuIik7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICItIEVmZmVjdCAlZCBkdW1wOlxuIiwga2V5QXQoaSkpOwotICAgICAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7Ci0gICAgICAgIHZhbHVlQXQoaSktPmR1bXAoZmQpOworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiLSBFZmZlY3QgJWQgZHVtcDpcbiIsIGtleUF0KGkpKTsKKyAgICAgICAgdmFsdWVBdChpKS0+ZHVtcChkc3QpOwogICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKIH07IC8vbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0h3TW9kdWxlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0h3TW9kdWxlLmNwcAppbmRleCBhZWY3ZGJlLi45MmJjNTk1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9Id01vZHVsZS5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvSHdNb2R1bGUuY3BwCkBAIC0yMTgsMzcgKzIxOCwyNyBAQAogICAgIG1IYW5kbGUgPSBoYW5kbGU7CiB9CiAKLXZvaWQgSHdNb2R1bGU6OmR1bXAoaW50IGZkKQordm9pZCBId01vZHVsZTo6ZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0CiB7Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0gICAgU3RyaW5nOCByZXN1bHQ7Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgIC0gbmFtZTogJXNcbiIsIGdldE5hbWUoKSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgLSBoYW5kbGU6ICVkXG4iLCBtSGFuZGxlKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAtIHZlcnNpb246ICV1LiV1XG4iLCBnZXRIYWxWZXJzaW9uTWFqb3IoKSwgZ2V0SGFsVmVyc2lvbk1pbm9yKCkpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiICAtIG5hbWU6ICVzXG4iLCBnZXROYW1lKCkpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgIC0gaGFuZGxlOiAlZFxuIiwgbUhhbmRsZSk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiAgLSB2ZXJzaW9uOiAldS4ldVxuIiwgZ2V0SGFsVmVyc2lvbk1ham9yKCksIGdldEhhbFZlcnNpb25NaW5vcigpKTsKICAgICBpZiAobU91dHB1dFByb2ZpbGVzLnNpemUoKSkgewotICAgICAgICB3cml0ZShmZCwgIiAgLSBvdXRwdXRzOlxuIiwgc3RybGVuKCIgIC0gb3V0cHV0czpcbiIpKTsKKyAgICAgICAgZHN0LT5hcHBlbmQoIiAgLSBvdXRwdXRzOlxuIik7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dFByb2ZpbGVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgb3V0cHV0ICV6dTpcbiIsIGkpOwotICAgICAgICAgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwotICAgICAgICAgICAgbU91dHB1dFByb2ZpbGVzW2ldLT5kdW1wKGZkKTsKKyAgICAgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgICAgb3V0cHV0ICV6dTpcbiIsIGkpOworICAgICAgICAgICAgbU91dHB1dFByb2ZpbGVzW2ldLT5kdW1wKGRzdCk7CiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKG1JbnB1dFByb2ZpbGVzLnNpemUoKSkgewotICAgICAgICB3cml0ZShmZCwgIiAgLSBpbnB1dHM6XG4iLCBzdHJsZW4oIiAgLSBpbnB1dHM6XG4iKSk7CisgICAgICAgIGRzdC0+YXBwZW5kKCIgIC0gaW5wdXRzOlxuIik7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUlucHV0UHJvZmlsZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgICBpbnB1dCAlenU6XG4iLCBpKTsKLSAgICAgICAgICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKLSAgICAgICAgICAgIG1JbnB1dFByb2ZpbGVzW2ldLT5kdW1wKGZkKTsKKyAgICAgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgICAgaW5wdXQgJXp1OlxuIiwgaSk7CisgICAgICAgICAgICBtSW5wdXRQcm9maWxlc1tpXS0+ZHVtcChkc3QpOwogICAgICAgICB9CiAgICAgfQotICAgIG1EZWNsYXJlZERldmljZXMuZHVtcChmZCwgU3RyaW5nOCgiRGVjbGFyZWQiKSwgIDIsIHRydWUpOwotICAgIG1Sb3V0ZXMuZHVtcChmZCwgMik7CisgICAgbURlY2xhcmVkRGV2aWNlcy5kdW1wKGRzdCwgU3RyaW5nOCgiRGVjbGFyZWQiKSwgMiwgdHJ1ZSk7CisgICAgbVJvdXRlcy5kdW1wKGRzdCwgMik7CiB9CiAKIHNwIDxId01vZHVsZT4gSHdNb2R1bGVDb2xsZWN0aW9uOjpnZXRNb2R1bGVGcm9tTmFtZShjb25zdCBjaGFyICpuYW1lKSBjb25zdApAQCAtMjc4LDkgKzI2OCwxMCBAQAogc3A8RGV2aWNlRGVzY3JpcHRvcj4gSHdNb2R1bGVDb2xsZWN0aW9uOjpnZXREZXZpY2VEZXNjcmlwdG9yKGNvbnN0IGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBtYXRjaEFkcmVzcykgY29uc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG1hdGNoQWRkcmVzcykgY29uc3QKIHsKLSAgICBTdHJpbmc4IGFkZHJlc3MgPSAoZGV2aWNlX2FkZHJlc3MgPT0gbnVsbHB0cikgPyBTdHJpbmc4KCIiKSA6IFN0cmluZzgoZGV2aWNlX2FkZHJlc3MpOworICAgIFN0cmluZzggYWRkcmVzcyA9IChkZXZpY2VfYWRkcmVzcyA9PSBudWxscHRyIHx8ICFtYXRjaEFkZHJlc3MpID8KKyAgICAgICAgICAgIFN0cmluZzgoIiIpIDogU3RyaW5nOChkZXZpY2VfYWRkcmVzcyk7CiAgICAgLy8gaGFuZGxlIGxlZ2FjeSByZW1vdGUgc3VibWl4IGNhc2Ugd2hlcmUgdGhlIGFkZHJlc3Mgd2FzIG5vdCBhbHdheXMgc3BlY2lmaWVkCiAgICAgaWYgKGRldmljZV9kaXN0aW5ndWlzaGVzX29uX2FkZHJlc3MoZGV2aWNlKSAmJiAoYWRkcmVzcy5sZW5ndGgoKSA9PSAwKSkgewogICAgICAgICBhZGRyZXNzID0gU3RyaW5nOCgiMCIpOwpAQCAtMjg4LDE1ICsyNzksOSBAQAogCiAgICAgZm9yIChjb25zdCBhdXRvJiBod01vZHVsZSA6ICp0aGlzKSB7CiAgICAgICAgIERldmljZVZlY3RvciBkZWNsYXJlZERldmljZXMgPSBod01vZHVsZS0+Z2V0RGVjbGFyZWREZXZpY2VzKCk7Ci0gICAgICAgIERldmljZVZlY3RvciBkZXZpY2VMaXN0ID0gZGVjbGFyZWREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZUFkZHIoZGV2aWNlLCBhZGRyZXNzKTsKLSAgICAgICAgaWYgKCFkZXZpY2VMaXN0LmlzRW1wdHkoKSkgewotICAgICAgICAgICAgcmV0dXJuIGRldmljZUxpc3QuaXRlbUF0KDApOwotICAgICAgICB9Ci0gICAgICAgIGlmICghbWF0Y2hBZHJlc3MpIHsKLSAgICAgICAgICAgIGRldmljZUxpc3QgPSBkZWNsYXJlZERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKGRldmljZSk7Ci0gICAgICAgICAgICBpZiAoIWRldmljZUxpc3QuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGRldmljZUxpc3QuaXRlbUF0KDApOwotICAgICAgICAgICAgfQorICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2VEZXNjID0gZGVjbGFyZWREZXZpY2VzLmdldERldmljZShkZXZpY2UsIGFkZHJlc3MpOworICAgICAgICBpZiAoZGV2aWNlRGVzYykgeworICAgICAgICAgICAgcmV0dXJuIGRldmljZURlc2M7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTMwNiwxOSArMjkxLDEzIEBACiAgICAgcmV0dXJuIGRldkRlc2M7CiB9CiAKLXN0YXR1c190IEh3TW9kdWxlQ29sbGVjdGlvbjo6ZHVtcChpbnQgZmQpIGNvbnN0Cit2b2lkIEh3TW9kdWxlQ29sbGVjdGlvbjo6ZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0CiB7Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcbkhXIE1vZHVsZXMgZHVtcDpcbiIpOwotICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKKyAgICBkc3QtPmFwcGVuZCgiXG5IVyBNb2R1bGVzIGR1bXA6XG4iKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIi0gSFcgTW9kdWxlICV6dTpcbiIsIGkgKyAxKTsKLSAgICAgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwotICAgICAgICBpdGVtQXQoaSktPmR1bXAoZmQpOworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiLSBIVyBNb2R1bGUgJXp1OlxuIiwgaSArIDEpOworICAgICAgICBpdGVtQXQoaSktPmR1bXAoZHN0KTsKICAgICB9Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0lPUHJvZmlsZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9JT1Byb2ZpbGUuY3BwCmluZGV4IGZiYzIzODQuLjg2NjA2MjQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0lPUHJvZmlsZS5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvSU9Qcm9maWxlLmNwcApAQCAtMTA4LDE2ICsxMDgsMTEgQEAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAotdm9pZCBJT1Byb2ZpbGU6OmR1bXAoaW50IGZkKQordm9pZCBJT1Byb2ZpbGU6OmR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdAogewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotICAgIFN0cmluZzggcmVzdWx0OworICAgIEF1ZGlvUG9ydDo6ZHVtcChkc3QsIDQpOwogCi0gICAgQXVkaW9Qb3J0OjpkdW1wKGZkLCA0KTsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgICAtIGZsYWdzOiAweCUwNHgiLCBnZXRGbGFncygpKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiAgICAtIGZsYWdzOiAweCUwNHgiLCBnZXRGbGFncygpKTsKICAgICBzdGQ6OnN0cmluZyBmbGFnc0xpdGVyYWw7CiAgICAgaWYgKGdldFJvbGUoKSA9PSBBVURJT19QT1JUX1JPTEVfU0lOSykgewogICAgICAgICBJbnB1dEZsYWdDb252ZXJ0ZXI6Om1hc2tUb1N0cmluZyhnZXRGbGFncygpLCBmbGFnc0xpdGVyYWwpOwpAQCAtMTI1LDIxICsxMjAsMTQgQEAKICAgICAgICAgT3V0cHV0RmxhZ0NvbnZlcnRlcjo6bWFza1RvU3RyaW5nKGdldEZsYWdzKCksIGZsYWdzTGl0ZXJhbCk7CiAgICAgfQogICAgIGlmICghZmxhZ3NMaXRlcmFsLmVtcHR5KCkpIHsKLSAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiICglcykiLCBmbGFnc0xpdGVyYWwuY19zdHIoKSk7CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgKCVzKSIsIGZsYWdzTGl0ZXJhbC5jX3N0cigpKTsKICAgICB9Ci0gICAgcmVzdWx0LmFwcGVuZCgiXG4iKTsKLSAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKLSAgICBtU3VwcG9ydGVkRGV2aWNlcy5kdW1wKGZkLCBTdHJpbmc4KCJTdXBwb3J0ZWQiKSwgNCwgZmFsc2UpOwotCi0gICAgcmVzdWx0LmNsZWFyKCk7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXG4gICAgLSBtYXhPcGVuQ291bnQ6ICV1IC0gY3VyT3BlbkNvdW50OiAldVxuIiwKKyAgICBkc3QtPmFwcGVuZCgiXG4iKTsKKyAgICBtU3VwcG9ydGVkRGV2aWNlcy5kdW1wKGRzdCwgU3RyaW5nOCgiU3VwcG9ydGVkIiksIDQsIGZhbHNlKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiXG4gICAgLSBtYXhPcGVuQ291bnQ6ICV1IC0gY3VyT3BlbkNvdW50OiAldVxuIiwKICAgICAgICAgICAgICBtYXhPcGVuQ291bnQsIGN1ck9wZW5Db3VudCk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgICAtIG1heEFjdGl2ZUNvdW50OiAldSAtIGN1ckFjdGl2ZUNvdW50OiAldVxuIiwKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiICAgIC0gbWF4QWN0aXZlQ291bnQ6ICV1IC0gY3VyQWN0aXZlQ291bnQ6ICV1XG4iLAogICAgICAgICAgICAgIG1heEFjdGl2ZUNvdW50LCBjdXJBY3RpdmVDb3VudCk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotCi0gICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CiB9CiAKIHZvaWQgSU9Qcm9maWxlOjpsb2coKQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvU2VyaWFsaXplci5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9TZXJpYWxpemVyLmNwcAppbmRleCBhMjUzMTEzLi4xNzlhNjc4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9TZXJpYWxpemVyLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9TZXJpYWxpemVyLmNwcApAQCAtMTcsMjQxICsxNyw0NDEgQEAKICNkZWZpbmUgTE9HX1RBRyAiQVBNOjpTZXJpYWxpemVyIgogLy8jZGVmaW5lIExPR19OREVCVUcgMAogCi0jaW5jbHVkZSAiU2VyaWFsaXplci5oIgotI2luY2x1ZGUgPG1lZGlhL2NvbnZlcnQuaD4KLSNpbmNsdWRlICJUeXBlQ29udmVydGVyLmgiCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCisjaW5jbHVkZSA8aGlkbC9TdGF0dXMuaD4KICNpbmNsdWRlIDxsaWJ4bWwvcGFyc2VyLmg+CiAjaW5jbHVkZSA8bGlieG1sL3hpbmNsdWRlLmg+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHNzdHJlYW0+Ci0jaW5jbHVkZSA8aXN0cmVhbT4KLQotdXNpbmcgc3RkOjpzdHJpbmc7CisjaW5jbHVkZSA8bWVkaWEvY29udmVydC5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSAiU2VyaWFsaXplci5oIgorI2luY2x1ZGUgIlR5cGVDb252ZXJ0ZXIuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1zdHJpbmcgZ2V0WG1sQXR0cmlidXRlKGNvbnN0IHhtbE5vZGUgKmN1ciwgY29uc3QgY2hhciAqYXR0cmlidXRlKQorbmFtZXNwYWNlIHsKKworLy8gVE9ETyhtbmFnYW5vdik6IENvbnNpZGVyIGZpbmRpbmcgYW4gYWx0ZXJuYXRpdmUgZm9yIHVzaW5nIEhJREwgY29kZS4KK3VzaW5nIGhhcmR3YXJlOjpSZXR1cm47Cit1c2luZyBoYXJkd2FyZTo6U3RhdHVzOwordXNpbmcgdXRpbGl0aWVzOjpjb252ZXJ0VG87CisKK3RlbXBsYXRlPHR5cGVuYW1lIEUsIHR5cGVuYW1lIEM+CitzdHJ1Y3QgQW5kcm9pZENvbGxlY3Rpb25UcmFpdHMgeworICAgIHR5cGVkZWYgc3A8RT4gRWxlbWVudDsKKyAgICB0eXBlZGVmIEMgQ29sbGVjdGlvbjsKKyAgICB0eXBlZGVmIHZvaWQqIFB0clNlcmlhbGl6aW5nQ3R4OworCisgICAgc3RhdGljIHN0YXR1c190IGFkZEVsZW1lbnRUb0NvbGxlY3Rpb24oY29uc3QgRWxlbWVudCAmZWxlbWVudCwgQ29sbGVjdGlvbiAqY29sbGVjdGlvbikgeworICAgICAgICByZXR1cm4gY29sbGVjdGlvbi0+YWRkKGVsZW1lbnQpID49IDAgPyBOT19FUlJPUiA6IEJBRF9WQUxVRTsKKyAgICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBDPgorc3RydWN0IFN0ZENvbGxlY3Rpb25UcmFpdHMgeworICAgIHR5cGVkZWYgQyBDb2xsZWN0aW9uOworICAgIHR5cGVkZWYgdHlwZW5hbWUgQzo6dmFsdWVfdHlwZSBFbGVtZW50OworICAgIHR5cGVkZWYgdm9pZCogUHRyU2VyaWFsaXppbmdDdHg7CisKKyAgICBzdGF0aWMgc3RhdHVzX3QgYWRkRWxlbWVudFRvQ29sbGVjdGlvbihjb25zdCBFbGVtZW50ICZlbGVtZW50LCBDb2xsZWN0aW9uICpjb2xsZWN0aW9uKSB7CisgICAgICAgIGF1dG8gcGFpciA9IGNvbGxlY3Rpb24tPmluc2VydChlbGVtZW50KTsKKyAgICAgICAgcmV0dXJuIHBhaXIuc2Vjb25kID8gTk9fRVJST1IgOiBCQURfVkFMVUU7CisgICAgfQorfTsKKworc3RydWN0IEF1ZGlvR2FpblRyYWl0cyA6IHB1YmxpYyBBbmRyb2lkQ29sbGVjdGlvblRyYWl0czxBdWRpb0dhaW4sIEF1ZGlvR2FpbkNvbGxlY3Rpb24+CiB7Ci0gICAgeG1sQ2hhciAqeG1sVmFsdWUgPSB4bWxHZXRQcm9wKGN1ciwgKGNvbnN0IHhtbENoYXIqKWF0dHJpYnV0ZSk7Ci0gICAgaWYgKHhtbFZhbHVlID09IE5VTEwpIHsKKyAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnRhZyA9ICJnYWluIjsKKyAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKmNvbGxlY3Rpb25UYWcgPSAiZ2FpbnMiOworCisgICAgc3RydWN0IEF0dHJpYnV0ZXMKKyAgICB7CisgICAgICAgIC8qKiBnYWluIG1vZGVzIHN1cHBvcnRlZCwgZS5nLiBBVURJT19HQUlOX01PREVfQ0hBTk5FTFMuICovCisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqbW9kZSA9ICJtb2RlIjsKKyAgICAgICAgLyoqIGNvbnRyb2xsZWQgY2hhbm5lbHMsIG5lZWRlZCBpZiBtb2RlIEFVRElPX0dBSU5fTU9ERV9DSEFOTkVMUy4gKi8KKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpjaGFubmVsTWFzayA9ICJjaGFubmVsX21hc2siOworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKm1pblZhbHVlTUIgPSAibWluVmFsdWVNQiI7IC8qKjwgbWluIHZhbHVlIGluIG1pbGxpYmVsLiAqLworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKm1heFZhbHVlTUIgPSAibWF4VmFsdWVNQiI7IC8qKjwgbWF4IHZhbHVlIGluIG1pbGxpYmVsLiAqLworICAgICAgICAvKiogZGVmYXVsdCB2YWx1ZSBpbiBtaWxsaWJlbC4gKi8KKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpkZWZhdWx0VmFsdWVNQiA9ICJkZWZhdWx0VmFsdWVNQiI7CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqc3RlcFZhbHVlTUIgPSAic3RlcFZhbHVlTUIiOyAvKio8IHN0ZXAgdmFsdWUgaW4gbWlsbGliZWwuICovCisgICAgICAgIC8qKiBuZWVkZWQgaWYgbW9kZSBBVURJT19HQUlOX01PREVfUkFNUC4gKi8KKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICptaW5SYW1wTXMgPSAibWluUmFtcE1zIjsKKyAgICAgICAgLyoqIG5lZWRlZCBpZiBtb2RlIEFVRElPX0dBSU5fTU9ERV9SQU1QLiAqLworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKm1heFJhbXBNcyA9ICJtYXhSYW1wTXMiOworICAgIH07CisKKyAgICBzdGF0aWMgUmV0dXJuPEVsZW1lbnQ+IGRlc2VyaWFsaXplKGNvbnN0IHhtbE5vZGUgKmN1ciwgUHRyU2VyaWFsaXppbmdDdHggc2VyaWFsaXppbmdDb250ZXh0KTsKKyAgICAvLyBObyBjaGlsZHJlbgorfTsKKworLy8gQSBwcm9maWxlIHNlY3Rpb24gY29udGFpbnMgYSBuYW1lLCAgb25lIGF1ZGlvIGZvcm1hdCBhbmQgdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIHNhbXBsaW5nIHJhdGVzCisvLyBhbmQgY2hhbm5lbCBtYXNrcyBmb3IgdGhpcyBmb3JtYXQKK3N0cnVjdCBBdWRpb1Byb2ZpbGVUcmFpdHMgOiBwdWJsaWMgQW5kcm9pZENvbGxlY3Rpb25UcmFpdHM8QXVkaW9Qcm9maWxlLCBBdWRpb1Byb2ZpbGVWZWN0b3I+Cit7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICp0YWcgPSAicHJvZmlsZSI7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpjb2xsZWN0aW9uVGFnID0gInByb2ZpbGVzIjsKKworICAgIHN0cnVjdCBBdHRyaWJ1dGVzCisgICAgeworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnNhbXBsaW5nUmF0ZXMgPSAic2FtcGxpbmdSYXRlcyI7CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqZm9ybWF0ID0gImZvcm1hdCI7CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqY2hhbm5lbE1hc2tzID0gImNoYW5uZWxNYXNrcyI7CisgICAgfTsKKworICAgIHN0YXRpYyBSZXR1cm48RWxlbWVudD4gZGVzZXJpYWxpemUoY29uc3QgeG1sTm9kZSAqY3VyLCBQdHJTZXJpYWxpemluZ0N0eCBzZXJpYWxpemluZ0NvbnRleHQpOworfTsKKworc3RydWN0IE1peFBvcnRUcmFpdHMgOiBwdWJsaWMgQW5kcm9pZENvbGxlY3Rpb25UcmFpdHM8SU9Qcm9maWxlLCBJT1Byb2ZpbGVDb2xsZWN0aW9uPgoreworICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqdGFnID0gIm1peFBvcnQiOworICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqY29sbGVjdGlvblRhZyA9ICJtaXhQb3J0cyI7CisKKyAgICBzdHJ1Y3QgQXR0cmlidXRlcworICAgIHsKKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpuYW1lID0gIm5hbWUiOworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnJvbGUgPSAicm9sZSI7CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqcm9sZVNvdXJjZSA9ICJzb3VyY2UiOyAvKio8IDxhdHRyaWJ1dGUgcm9sZSBzb3VyY2UgdmFsdWU+LiAqLworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKmZsYWdzID0gImZsYWdzIjsKKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICptYXhPcGVuQ291bnQgPSAibWF4T3BlbkNvdW50IjsKKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICptYXhBY3RpdmVDb3VudCA9ICJtYXhBY3RpdmVDb3VudCI7CisgICAgfTsKKworICAgIHN0YXRpYyBSZXR1cm48RWxlbWVudD4gZGVzZXJpYWxpemUoY29uc3QgeG1sTm9kZSAqY3VyLCBQdHJTZXJpYWxpemluZ0N0eCBzZXJpYWxpemluZ0NvbnRleHQpOworICAgIC8vIENoaWxkcmVuOiBHYWluVHJhaXRzCit9OworCitzdHJ1Y3QgRGV2aWNlUG9ydFRyYWl0cyA6IHB1YmxpYyBBbmRyb2lkQ29sbGVjdGlvblRyYWl0czxEZXZpY2VEZXNjcmlwdG9yLCBEZXZpY2VWZWN0b3I+Cit7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICp0YWcgPSAiZGV2aWNlUG9ydCI7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpjb2xsZWN0aW9uVGFnID0gImRldmljZVBvcnRzIjsKKworICAgIHN0cnVjdCBBdHRyaWJ1dGVzCisgICAgeworICAgICAgICAvKiogIDxkZXZpY2UgdGFnIG5hbWU+OiBhbnkgc3RyaW5nIHdpdGhvdXQgc3BhY2UuICovCisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqdGFnTmFtZSA9ICJ0YWdOYW1lIjsKKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICp0eXBlID0gInR5cGUiOyAvKio8IDxkZXZpY2UgdHlwZT4uICovCisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqcm9sZSA9ICJyb2xlIjsgLyoqPCA8ZGV2aWNlIHJvbGU6IHNpbmsgb3Igc291cmNlPi4gKi8KKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpyb2xlU291cmNlID0gInNvdXJjZSI7IC8qKjwgPGF0dHJpYnV0ZSByb2xlIHNvdXJjZSB2YWx1ZT4uICovCisgICAgICAgIC8qKiBvcHRpb25hbDogZGV2aWNlIGFkZHJlc3MsIGNoYXIgc3RyaW5nIGxlc3MgdGhhbiA2NC4gKi8KKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICphZGRyZXNzID0gImFkZHJlc3MiOworICAgIH07CisKKyAgICBzdGF0aWMgUmV0dXJuPEVsZW1lbnQ+IGRlc2VyaWFsaXplKGNvbnN0IHhtbE5vZGUgKmN1ciwgUHRyU2VyaWFsaXppbmdDdHggc2VyaWFsaXppbmdDb250ZXh0KTsKKyAgICAvLyBDaGlsZHJlbjogR2FpblRyYWl0cyAob3B0aW9uYWwpCit9OworCitzdHJ1Y3QgUm91dGVUcmFpdHMgOiBwdWJsaWMgQW5kcm9pZENvbGxlY3Rpb25UcmFpdHM8QXVkaW9Sb3V0ZSwgQXVkaW9Sb3V0ZVZlY3Rvcj4KK3sKKyAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnRhZyA9ICJyb3V0ZSI7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpjb2xsZWN0aW9uVGFnID0gInJvdXRlcyI7CisKKyAgICBzdHJ1Y3QgQXR0cmlidXRlcworICAgIHsKKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICp0eXBlID0gInR5cGUiOyAvKio8IDxyb3V0ZSB0eXBlPjogbWl4IG9yIG11eC4gKi8KKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICp0eXBlTWl4ID0gIm1peCI7IC8qKjwgdHlwZSBhdHRyaWJ1dGUgbWl4IHZhbHVlLiAqLworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnNpbmsgPSAic2luayI7IC8qKjwgPHNpbms6IGludm9sdmVkIGluIHRoaXMgcm91dGU+LiAqLworICAgICAgICAvKiogc291cmNlczogYWxsIHNvdXJjZSB0aGF0IGNhbiBiZSBpbnZvbHZlZCBpbiB0aGlzIHJvdXRlLiAqLworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnNvdXJjZXMgPSAic291cmNlcyI7CisgICAgfTsKKworICAgIHR5cGVkZWYgSHdNb2R1bGUgKlB0clNlcmlhbGl6aW5nQ3R4OworCisgICAgc3RhdGljIFJldHVybjxFbGVtZW50PiBkZXNlcmlhbGl6ZShjb25zdCB4bWxOb2RlICpjdXIsIFB0clNlcmlhbGl6aW5nQ3R4IHNlcmlhbGl6aW5nQ29udGV4dCk7Cit9OworCitzdHJ1Y3QgTW9kdWxlVHJhaXRzIDogcHVibGljIEFuZHJvaWRDb2xsZWN0aW9uVHJhaXRzPEh3TW9kdWxlLCBId01vZHVsZUNvbGxlY3Rpb24+Cit7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICp0YWcgPSAibW9kdWxlIjsKKyAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKmNvbGxlY3Rpb25UYWcgPSAibW9kdWxlcyI7CisKKyAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKmNoaWxkQXR0YWNoZWREZXZpY2VzVGFnID0gImF0dGFjaGVkRGV2aWNlcyI7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpjaGlsZEF0dGFjaGVkRGV2aWNlVGFnID0gIml0ZW0iOworICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqY2hpbGREZWZhdWx0T3V0cHV0RGV2aWNlVGFnID0gImRlZmF1bHRPdXRwdXREZXZpY2UiOworCisgICAgc3RydWN0IEF0dHJpYnV0ZXMKKyAgICB7CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqbmFtZSA9ICJuYW1lIjsKKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICp2ZXJzaW9uID0gImhhbFZlcnNpb24iOworICAgIH07CisKKyAgICB0eXBlZGVmIEF1ZGlvUG9saWN5Q29uZmlnICpQdHJTZXJpYWxpemluZ0N0eDsKKworICAgIHN0YXRpYyBSZXR1cm48RWxlbWVudD4gZGVzZXJpYWxpemUoY29uc3QgeG1sTm9kZSAqY3VyLCBQdHJTZXJpYWxpemluZ0N0eCBzZXJpYWxpemluZ0NvbnRleHQpOworICAgIC8vIENoaWxkcmVuOiBtaXhQb3J0VHJhaXRzLCBkZXZpY2VQb3J0VHJhaXRzLCBhbmQgcm91dGVUcmFpdHMKKyAgICAvLyBOZWVkIHRvIGNhbGwgZGVzZXJpYWxpemUgb24gZWFjaCBjaGlsZAorfTsKKworc3RydWN0IEdsb2JhbENvbmZpZ1RyYWl0cworeworICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqdGFnID0gImdsb2JhbENvbmZpZ3VyYXRpb24iOworCisgICAgc3RydWN0IEF0dHJpYnV0ZXMKKyAgICB7CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqc3BlYWtlckRyY0VuYWJsZWQgPSAic3BlYWtlcl9kcmNfZW5hYmxlZCI7CisgICAgfTsKKworICAgIHN0YXRpYyBzdGF0dXNfdCBkZXNlcmlhbGl6ZShjb25zdCB4bWxOb2RlICpyb290LCBBdWRpb1BvbGljeUNvbmZpZyAqY29uZmlnKTsKK307CisKK3N0cnVjdCBWb2x1bWVUcmFpdHMgOiBwdWJsaWMgQW5kcm9pZENvbGxlY3Rpb25UcmFpdHM8Vm9sdW1lQ3VydmUsIFZvbHVtZUN1cnZlc0NvbGxlY3Rpb24+Cit7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICp0YWcgPSAidm9sdW1lIjsKKyAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKmNvbGxlY3Rpb25UYWcgPSAidm9sdW1lcyI7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICp2b2x1bWVQb2ludFRhZyA9ICJwb2ludCI7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpyZWZlcmVuY2VUYWcgPSAicmVmZXJlbmNlIjsKKworICAgIHN0cnVjdCBBdHRyaWJ1dGVzCisgICAgeworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnN0cmVhbSA9ICJzdHJlYW0iOworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKmRldmljZUNhdGVnb3J5ID0gImRldmljZUNhdGVnb3J5IjsKKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpyZWZlcmVuY2UgPSAicmVmIjsKKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpyZWZlcmVuY2VOYW1lID0gIm5hbWUiOworICAgIH07CisKKyAgICBzdGF0aWMgUmV0dXJuPEVsZW1lbnQ+IGRlc2VyaWFsaXplKGNvbnN0IHhtbE5vZGUgKmN1ciwgUHRyU2VyaWFsaXppbmdDdHggc2VyaWFsaXppbmdDb250ZXh0KTsKKyAgICAvLyBObyBDaGlsZHJlbgorfTsKKworc3RydWN0IFN1cnJvdW5kU291bmRUcmFpdHMKK3sKKyAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnRhZyA9ICJzdXJyb3VuZFNvdW5kIjsKKworICAgIHN0YXRpYyBzdGF0dXNfdCBkZXNlcmlhbGl6ZShjb25zdCB4bWxOb2RlICpyb290LCBBdWRpb1BvbGljeUNvbmZpZyAqY29uZmlnKTsKKyAgICAvLyBDaGlsZHJlbjogU3Vycm91bmRTb3VuZEZvcm1hdFRyYWl0cworfTsKKworc3RydWN0IFN1cnJvdW5kU291bmRGb3JtYXRUcmFpdHMgOiBwdWJsaWMgU3RkQ29sbGVjdGlvblRyYWl0czxBdWRpb1BvbGljeUNvbmZpZzo6U3Vycm91bmRGb3JtYXRzPgoreworICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqdGFnID0gImZvcm1hdCI7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpjb2xsZWN0aW9uVGFnID0gImZvcm1hdHMiOworCisgICAgc3RydWN0IEF0dHJpYnV0ZXMKKyAgICB7CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqbmFtZSA9ICJuYW1lIjsKKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpzdWJmb3JtYXRzID0gInN1YmZvcm1hdHMiOworICAgIH07CisKKyAgICBzdGF0aWMgUmV0dXJuPEVsZW1lbnQ+IGRlc2VyaWFsaXplKGNvbnN0IHhtbE5vZGUgKmN1ciwgUHRyU2VyaWFsaXppbmdDdHggc2VyaWFsaXppbmdDb250ZXh0KTsKK307CisKK2NsYXNzIFBvbGljeVNlcmlhbGl6ZXIKK3sKK3B1YmxpYzoKKyAgICBQb2xpY3lTZXJpYWxpemVyKCkgOiBtVmVyc2lvbntzdGQ6OnRvX3N0cmluZyhnTWFqb3IpICsgIi4iICsgc3RkOjp0b19zdHJpbmcoZ01pbm9yKX0KKyAgICB7CisgICAgICAgIEFMT0dWKCIlczogVmVyc2lvbj0lcyBSb290PSVzIiwgX19mdW5jX18sIG1WZXJzaW9uLmNfc3RyKCksIHJvb3ROYW1lKTsKKyAgICB9CisgICAgc3RhdHVzX3QgZGVzZXJpYWxpemUoY29uc3QgY2hhciAqY29uZmlnRmlsZSwgQXVkaW9Qb2xpY3lDb25maWcgKmNvbmZpZyk7CisKK3ByaXZhdGU6CisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpyb290TmFtZSA9ICJhdWRpb1BvbGljeUNvbmZpZ3VyYXRpb24iOworICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqdmVyc2lvbkF0dHJpYnV0ZSA9ICJ2ZXJzaW9uIjsKKyAgICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IGdNYWpvciA9IDE7IC8qKjwgdGhlIG1ham9yIG51bWJlciBvZiB0aGUgcG9saWN5IHhtbCBmb3JtYXQgdmVyc2lvbi4gKi8KKyAgICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IGdNaW5vciA9IDA7IC8qKjwgdGhlIG1pbm9yIG51bWJlciBvZiB0aGUgcG9saWN5IHhtbCBmb3JtYXQgdmVyc2lvbi4gKi8KKworICAgIHR5cGVkZWYgQXVkaW9Qb2xpY3lDb25maWcgRWxlbWVudDsKKworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIG1WZXJzaW9uOworCisgICAgLy8gQ2hpbGRyZW46IE1vZHVsZXNUcmFpdHMsIFZvbHVtZVRyYWl0cywgU3Vycm91bmRTb3VuZFRyYWl0cyAob3B0aW9uYWwpCit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK2NvbnN0ZXhwciB2b2lkICgqeG1sRGVsZXRlcikoVCogdCk7Cit0ZW1wbGF0ZSA8PgorY29uc3RleHByIGF1dG8geG1sRGVsZXRlcjx4bWxEb2M+ID0geG1sRnJlZURvYzsKKy8vIGh0dHA6Ly9iLzExMTA2NzI3NyAtIEFkZCBiYWNrIGNvbnN0ZXhwciB3aGVuIHdlIHN3aXRjaCB0byBDKysxNy4KK3RlbXBsYXRlIDw+CithdXRvIHhtbERlbGV0ZXI8eG1sQ2hhcj4gPSBbXSh4bWxDaGFyICpzKSB7IHhtbEZyZWUocyk7IH07CisKKy8qKiBAcmV0dXJuIGEgdW5pcXVlX3B0ciB3aXRoIHRoZSBjb3JyZWN0IGRlbGV0ZXIgZm9yIHRoZSBsaWJ4bWwyIG9iamVjdC4gKi8KK3RlbXBsYXRlIDxjbGFzcyBUPgorY29uc3RleHByIGF1dG8gbWFrZV94bWxVbmlxdWUoVCAqdCkgeworICAgIC8vIFdyYXAgZGVsZXRlciBpbiBsYW1iZGEgdG8gZW5hYmxlIGVtcHR5IGJhc2Ugb3B0aW1pemF0aW9uCisgICAgYXV0byBkZWxldGVyID0gW10oVCAqdCkgeyB4bWxEZWxldGVyPFQ+KHQpOyB9OworICAgIHJldHVybiBzdGQ6OnVuaXF1ZV9wdHI8VCwgZGVjbHR5cGUoZGVsZXRlcik+e3QsIGRlbGV0ZXJ9OworfQorCitzdGQ6OnN0cmluZyBnZXRYbWxBdHRyaWJ1dGUoY29uc3QgeG1sTm9kZSAqY3VyLCBjb25zdCBjaGFyICphdHRyaWJ1dGUpCit7CisgICAgYXV0byB4bWxWYWx1ZSA9IG1ha2VfeG1sVW5pcXVlKHhtbEdldFByb3AoY3VyLCByZWludGVycHJldF9jYXN0PGNvbnN0IHhtbENoYXIqPihhdHRyaWJ1dGUpKSk7CisgICAgaWYgKHhtbFZhbHVlID09IG51bGxwdHIpIHsKICAgICAgICAgcmV0dXJuICIiOwogICAgIH0KLSAgICBzdHJpbmcgdmFsdWUoKGNvbnN0IGNoYXIqKXhtbFZhbHVlKTsKLSAgICB4bWxGcmVlKHhtbFZhbHVlKTsKKyAgICBzdGQ6OnN0cmluZyB2YWx1ZShyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih4bWxWYWx1ZS5nZXQoKSkpOwogICAgIHJldHVybiB2YWx1ZTsKIH0KIAotdXNpbmcgdXRpbGl0aWVzOjpjb252ZXJ0VG87Ci0KLWNvbnN0IGNoYXIgKmNvbnN0IFBvbGljeVNlcmlhbGl6ZXI6OnJvb3ROYW1lID0gImF1ZGlvUG9saWN5Q29uZmlndXJhdGlvbiI7Ci1jb25zdCBjaGFyICpjb25zdCBQb2xpY3lTZXJpYWxpemVyOjp2ZXJzaW9uQXR0cmlidXRlID0gInZlcnNpb24iOwotY29uc3QgdWludDMyX3QgUG9saWN5U2VyaWFsaXplcjo6Z01ham9yID0gMTsKLWNvbnN0IHVpbnQzMl90IFBvbGljeVNlcmlhbGl6ZXI6OmdNaW5vciA9IDA7Ci1zdGF0aWMgY29uc3QgY2hhciAqY29uc3QgZ1JlZmVyZW5jZUVsZW1lbnROYW1lID0gInJlZmVyZW5jZSI7Ci1zdGF0aWMgY29uc3QgY2hhciAqY29uc3QgZ1JlZmVyZW5jZUF0dHJpYnV0ZU5hbWUgPSAibmFtZSI7Ci0KIHRlbXBsYXRlIDxjbGFzcyBUcmFpdD4KLXN0YXRpYyB2b2lkIGdldFJlZmVyZW5jZShjb25zdCBfeG1sTm9kZSAqcm9vdCwgY29uc3QgX3htbE5vZGUgKiZyZWZOb2RlLCBjb25zdCBzdHJpbmcgJnJlZk5hbWUpCitjb25zdCB4bWxOb2RlKiBnZXRSZWZlcmVuY2UoY29uc3QgeG1sTm9kZSAqY3VyLCBjb25zdCBzdGQ6OnN0cmluZyAmcmVmTmFtZSkKIHsKLSAgICBjb25zdCBfeG1sTm9kZSAqY29sID0gcm9vdDsKLSAgICB3aGlsZSAoY29sICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKCF4bWxTdHJjbXAoY29sLT5uYW1lLCAoY29uc3QgeG1sQ2hhciAqKVRyYWl0Ojpjb2xsZWN0aW9uVGFnKSkgewotICAgICAgICAgICAgY29uc3QgeG1sTm9kZSAqY3VyID0gY29sLT5jaGlsZHJlbjsKLSAgICAgICAgICAgIHdoaWxlIChjdXIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGlmICgoIXhtbFN0cmNtcChjdXItPm5hbWUsIChjb25zdCB4bWxDaGFyICopZ1JlZmVyZW5jZUVsZW1lbnROYW1lKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCBnUmVmZXJlbmNlQXR0cmlidXRlTmFtZSk7CisgICAgZm9yICg7IGN1ciAhPSBOVUxMOyBjdXIgPSBjdXItPm5leHQpIHsKKyAgICAgICAgaWYgKCF4bWxTdHJjbXAoY3VyLT5uYW1lLCByZWludGVycHJldF9jYXN0PGNvbnN0IHhtbENoYXIqPihUcmFpdDo6Y29sbGVjdGlvblRhZykpKSB7CisgICAgICAgICAgICBmb3IgKGNvbnN0IHhtbE5vZGUgKmNoaWxkID0gY3VyLT5jaGlsZHJlbjsgY2hpbGQgIT0gTlVMTDsgY2hpbGQgPSBjaGlsZC0+bmV4dCkgeworICAgICAgICAgICAgICAgIGlmICgoIXhtbFN0cmNtcChjaGlsZC0+bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHhtbENoYXIqPihUcmFpdDo6cmVmZXJlbmNlVGFnKSkpKSB7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUgPSBnZXRYbWxBdHRyaWJ1dGUoY2hpbGQsIFRyYWl0OjpBdHRyaWJ1dGVzOjpyZWZlcmVuY2VOYW1lKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKHJlZk5hbWUgPT0gbmFtZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVmTm9kZSA9IGN1cjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjaGlsZDsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjdXIgPSBjdXItPm5leHQ7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgY29sID0gY29sLT5uZXh0OwogICAgIH0KLSAgICByZXR1cm47CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHRlbXBsYXRlIDxjbGFzcyBUcmFpdD4KLXN0YXRpYyBzdGF0dXNfdCBkZXNlcmlhbGl6ZUNvbGxlY3Rpb24oX3htbERvYyAqZG9jLCBjb25zdCBfeG1sTm9kZSAqY3VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBUcmFpdDo6Q29sbGVjdGlvbiAmY29sbGVjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgVHJhaXQ6OlB0clNlcmlhbGl6aW5nQ3R4IHNlcmlhbGl6aW5nQ29udGV4dCkKK3N0YXR1c190IGRlc2VyaWFsaXplQ29sbGVjdGlvbihjb25zdCB4bWxOb2RlICpjdXIsCisgICAgICAgIHR5cGVuYW1lIFRyYWl0OjpDb2xsZWN0aW9uICpjb2xsZWN0aW9uLAorICAgICAgICB0eXBlbmFtZSBUcmFpdDo6UHRyU2VyaWFsaXppbmdDdHggc2VyaWFsaXppbmdDb250ZXh0KQogewotICAgIGNvbnN0IHhtbE5vZGUgKnJvb3QgPSBjdXItPnhtbENoaWxkcmVuTm9kZTsKLSAgICB3aGlsZSAocm9vdCAhPSBOVUxMKSB7Ci0gICAgICAgIGlmICh4bWxTdHJjbXAocm9vdC0+bmFtZSwgKGNvbnN0IHhtbENoYXIgKilUcmFpdDo6Y29sbGVjdGlvblRhZykgJiYKLSAgICAgICAgICAgICAgICB4bWxTdHJjbXAocm9vdC0+bmFtZSwgKGNvbnN0IHhtbENoYXIgKilUcmFpdDo6dGFnKSkgewotICAgICAgICAgICAgcm9vdCA9IHJvb3QtPm5leHQ7Ci0gICAgICAgICAgICBjb250aW51ZTsKKyAgICBmb3IgKGN1ciA9IGN1ci0+eG1sQ2hpbGRyZW5Ob2RlOyBjdXIgIT0gTlVMTDsgY3VyID0gY3VyLT5uZXh0KSB7CisgICAgICAgIGNvbnN0IHhtbE5vZGUgKmNoaWxkID0gTlVMTDsKKyAgICAgICAgaWYgKCF4bWxTdHJjbXAoY3VyLT5uYW1lLCByZWludGVycHJldF9jYXN0PGNvbnN0IHhtbENoYXIqPihUcmFpdDo6Y29sbGVjdGlvblRhZykpKSB7CisgICAgICAgICAgICBjaGlsZCA9IGN1ci0+eG1sQ2hpbGRyZW5Ob2RlOworICAgICAgICB9IGVsc2UgaWYgKCF4bWxTdHJjbXAoY3VyLT5uYW1lLCByZWludGVycHJldF9jYXN0PGNvbnN0IHhtbENoYXIqPihUcmFpdDo6dGFnKSkpIHsKKyAgICAgICAgICAgIGNoaWxkID0gY3VyOwogICAgICAgICB9Ci0gICAgICAgIGNvbnN0IHhtbE5vZGUgKmNoaWxkID0gcm9vdDsKLSAgICAgICAgaWYgKCF4bWxTdHJjbXAoY2hpbGQtPm5hbWUsIChjb25zdCB4bWxDaGFyICopVHJhaXQ6OmNvbGxlY3Rpb25UYWcpKSB7Ci0gICAgICAgICAgICBjaGlsZCA9IGNoaWxkLT54bWxDaGlsZHJlbk5vZGU7Ci0gICAgICAgIH0KLSAgICAgICAgd2hpbGUgKGNoaWxkICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGlmICgheG1sU3RyY21wKGNoaWxkLT5uYW1lLCAoY29uc3QgeG1sQ2hhciAqKVRyYWl0Ojp0YWcpKSB7Ci0gICAgICAgICAgICAgICAgdHlwZW5hbWUgVHJhaXQ6OlB0ckVsZW1lbnQgZWxlbWVudDsKLSAgICAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBUcmFpdDo6ZGVzZXJpYWxpemUoZG9jLCBjaGlsZCwgZWxlbWVudCwgc2VyaWFsaXppbmdDb250ZXh0KTsKLSAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChjb2xsZWN0aW9uLmFkZChlbGVtZW50KSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBjb3VsZCBub3QgYWRkIGVsZW1lbnQgdG8gJXMgY29sbGVjdGlvbiIsIF9fRlVOQ1RJT05fXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhaXQ6OmNvbGxlY3Rpb25UYWcpOworICAgICAgICBmb3IgKDsgY2hpbGQgIT0gTlVMTDsgY2hpbGQgPSBjaGlsZC0+bmV4dCkgeworICAgICAgICAgICAgaWYgKCF4bWxTdHJjbXAoY2hpbGQtPm5hbWUsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgeG1sQ2hhcio+KFRyYWl0Ojp0YWcpKSkgeworICAgICAgICAgICAgICAgIGF1dG8gZWxlbWVudCA9IFRyYWl0OjpkZXNlcmlhbGl6ZShjaGlsZCwgc2VyaWFsaXppbmdDb250ZXh0KTsKKyAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5pc09rKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gVHJhaXQ6OmFkZEVsZW1lbnRUb0NvbGxlY3Rpb24oZWxlbWVudCwgY29sbGVjdGlvbik7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogY291bGQgbm90IGFkZCBlbGVtZW50IHRvICVzIGNvbGxlY3Rpb24iLCBfX2Z1bmNfXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFpdDo6Y29sbGVjdGlvblRhZyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBjaGlsZCA9IGNoaWxkLT5uZXh0OwogICAgICAgICB9Ci0gICAgICAgIGlmICgheG1sU3RyY21wKHJvb3QtPm5hbWUsIChjb25zdCB4bWxDaGFyICopVHJhaXQ6OnRhZykpIHsKKyAgICAgICAgaWYgKCF4bWxTdHJjbXAoY3VyLT5uYW1lLCByZWludGVycHJldF9jYXN0PGNvbnN0IHhtbENoYXIqPihUcmFpdDo6dGFnKSkpIHsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfQotICAgICAgICByb290ID0gcm9vdC0+bmV4dDsKICAgICB9CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi1jb25zdCBjaGFyICpjb25zdCBBdWRpb0dhaW5UcmFpdHM6OnRhZyA9ICJnYWluIjsKLWNvbnN0IGNoYXIgKmNvbnN0IEF1ZGlvR2FpblRyYWl0czo6Y29sbGVjdGlvblRhZyA9ICJnYWlucyI7Ci0KLWNvbnN0IGNoYXIgQXVkaW9HYWluVHJhaXRzOjpBdHRyaWJ1dGVzOjptb2RlW10gPSAibW9kZSI7Ci1jb25zdCBjaGFyIEF1ZGlvR2FpblRyYWl0czo6QXR0cmlidXRlczo6Y2hhbm5lbE1hc2tbXSA9ICJjaGFubmVsX21hc2siOwotY29uc3QgY2hhciBBdWRpb0dhaW5UcmFpdHM6OkF0dHJpYnV0ZXM6Om1pblZhbHVlTUJbXSA9ICJtaW5WYWx1ZU1CIjsKLWNvbnN0IGNoYXIgQXVkaW9HYWluVHJhaXRzOjpBdHRyaWJ1dGVzOjptYXhWYWx1ZU1CW10gPSAibWF4VmFsdWVNQiI7Ci1jb25zdCBjaGFyIEF1ZGlvR2FpblRyYWl0czo6QXR0cmlidXRlczo6ZGVmYXVsdFZhbHVlTUJbXSA9ICJkZWZhdWx0VmFsdWVNQiI7Ci1jb25zdCBjaGFyIEF1ZGlvR2FpblRyYWl0czo6QXR0cmlidXRlczo6c3RlcFZhbHVlTUJbXSA9ICJzdGVwVmFsdWVNQiI7Ci1jb25zdCBjaGFyIEF1ZGlvR2FpblRyYWl0czo6QXR0cmlidXRlczo6bWluUmFtcE1zW10gPSAibWluUmFtcE1zIjsKLWNvbnN0IGNoYXIgQXVkaW9HYWluVHJhaXRzOjpBdHRyaWJ1dGVzOjptYXhSYW1wTXNbXSA9ICJtYXhSYW1wTXMiOwotCi1zdGF0dXNfdCBBdWRpb0dhaW5UcmFpdHM6OmRlc2VyaWFsaXplKF94bWxEb2MgKi8qZG9jKi8sIGNvbnN0IF94bWxOb2RlICpyb290LCBQdHJFbGVtZW50ICZnYWluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQdHJTZXJpYWxpemluZ0N0eCAvKnNlcmlhbGl6aW5nQ29udGV4dCovKQorUmV0dXJuPEF1ZGlvR2FpblRyYWl0czo6RWxlbWVudD4gQXVkaW9HYWluVHJhaXRzOjpkZXNlcmlhbGl6ZShjb25zdCB4bWxOb2RlICpjdXIsCisgICAgICAgIFB0clNlcmlhbGl6aW5nQ3R4IC8qc2VyaWFsaXppbmdDb250ZXh0Ki8pCiB7CiAgICAgc3RhdGljIHVpbnQzMl90IGluZGV4ID0gMDsKLSAgICBnYWluID0gbmV3IEVsZW1lbnQoaW5kZXgrKywgdHJ1ZSk7CisgICAgRWxlbWVudCBnYWluID0gbmV3IEF1ZGlvR2FpbihpbmRleCsrLCB0cnVlKTsKIAotICAgIHN0cmluZyBtb2RlID0gZ2V0WG1sQXR0cmlidXRlKHJvb3QsIEF0dHJpYnV0ZXM6Om1vZGUpOworICAgIHN0ZDo6c3RyaW5nIG1vZGUgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCBBdHRyaWJ1dGVzOjptb2RlKTsKICAgICBpZiAoIW1vZGUuZW1wdHkoKSkgewogICAgICAgICBnYWluLT5zZXRNb2RlKEdhaW5Nb2RlQ29udmVydGVyOjptYXNrRnJvbVN0cmluZyhtb2RlKSk7CiAgICAgfQogCi0gICAgc3RyaW5nIGNoYW5uZWxzTGl0ZXJhbCA9IGdldFhtbEF0dHJpYnV0ZShyb290LCBBdHRyaWJ1dGVzOjpjaGFubmVsTWFzayk7CisgICAgc3RkOjpzdHJpbmcgY2hhbm5lbHNMaXRlcmFsID0gZ2V0WG1sQXR0cmlidXRlKGN1ciwgQXR0cmlidXRlczo6Y2hhbm5lbE1hc2spOwogICAgIGlmICghY2hhbm5lbHNMaXRlcmFsLmVtcHR5KCkpIHsKICAgICAgICAgZ2Fpbi0+c2V0Q2hhbm5lbE1hc2soY2hhbm5lbE1hc2tGcm9tU3RyaW5nKGNoYW5uZWxzTGl0ZXJhbCkpOwogICAgIH0KIAotICAgIHN0cmluZyBtaW5WYWx1ZU1CTGl0ZXJhbCA9IGdldFhtbEF0dHJpYnV0ZShyb290LCBBdHRyaWJ1dGVzOjptaW5WYWx1ZU1CKTsKKyAgICBzdGQ6OnN0cmluZyBtaW5WYWx1ZU1CTGl0ZXJhbCA9IGdldFhtbEF0dHJpYnV0ZShjdXIsIEF0dHJpYnV0ZXM6Om1pblZhbHVlTUIpOwogICAgIGludDMyX3QgbWluVmFsdWVNQjsKICAgICBpZiAoIW1pblZhbHVlTUJMaXRlcmFsLmVtcHR5KCkgJiYgY29udmVydFRvKG1pblZhbHVlTUJMaXRlcmFsLCBtaW5WYWx1ZU1CKSkgewogICAgICAgICBnYWluLT5zZXRNaW5WYWx1ZUluTWIobWluVmFsdWVNQik7CiAgICAgfQogCi0gICAgc3RyaW5nIG1heFZhbHVlTUJMaXRlcmFsID0gZ2V0WG1sQXR0cmlidXRlKHJvb3QsIEF0dHJpYnV0ZXM6Om1heFZhbHVlTUIpOworICAgIHN0ZDo6c3RyaW5nIG1heFZhbHVlTUJMaXRlcmFsID0gZ2V0WG1sQXR0cmlidXRlKGN1ciwgQXR0cmlidXRlczo6bWF4VmFsdWVNQik7CiAgICAgaW50MzJfdCBtYXhWYWx1ZU1COwogICAgIGlmICghbWF4VmFsdWVNQkxpdGVyYWwuZW1wdHkoKSAmJiBjb252ZXJ0VG8obWF4VmFsdWVNQkxpdGVyYWwsIG1heFZhbHVlTUIpKSB7CiAgICAgICAgIGdhaW4tPnNldE1heFZhbHVlSW5NYihtYXhWYWx1ZU1CKTsKICAgICB9CiAKLSAgICBzdHJpbmcgZGVmYXVsdFZhbHVlTUJMaXRlcmFsID0gZ2V0WG1sQXR0cmlidXRlKHJvb3QsIEF0dHJpYnV0ZXM6OmRlZmF1bHRWYWx1ZU1CKTsKKyAgICBzdGQ6OnN0cmluZyBkZWZhdWx0VmFsdWVNQkxpdGVyYWwgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCBBdHRyaWJ1dGVzOjpkZWZhdWx0VmFsdWVNQik7CiAgICAgaW50MzJfdCBkZWZhdWx0VmFsdWVNQjsKICAgICBpZiAoIWRlZmF1bHRWYWx1ZU1CTGl0ZXJhbC5lbXB0eSgpICYmIGNvbnZlcnRUbyhkZWZhdWx0VmFsdWVNQkxpdGVyYWwsIGRlZmF1bHRWYWx1ZU1CKSkgewogICAgICAgICBnYWluLT5zZXREZWZhdWx0VmFsdWVJbk1iKGRlZmF1bHRWYWx1ZU1CKTsKICAgICB9CiAKLSAgICBzdHJpbmcgc3RlcFZhbHVlTUJMaXRlcmFsID0gZ2V0WG1sQXR0cmlidXRlKHJvb3QsIEF0dHJpYnV0ZXM6OnN0ZXBWYWx1ZU1CKTsKKyAgICBzdGQ6OnN0cmluZyBzdGVwVmFsdWVNQkxpdGVyYWwgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCBBdHRyaWJ1dGVzOjpzdGVwVmFsdWVNQik7CiAgICAgdWludDMyX3Qgc3RlcFZhbHVlTUI7CiAgICAgaWYgKCFzdGVwVmFsdWVNQkxpdGVyYWwuZW1wdHkoKSAmJiBjb252ZXJ0VG8oc3RlcFZhbHVlTUJMaXRlcmFsLCBzdGVwVmFsdWVNQikpIHsKICAgICAgICAgZ2Fpbi0+c2V0U3RlcFZhbHVlSW5NYihzdGVwVmFsdWVNQik7CiAgICAgfQogCi0gICAgc3RyaW5nIG1pblJhbXBNc0xpdGVyYWwgPSBnZXRYbWxBdHRyaWJ1dGUocm9vdCwgQXR0cmlidXRlczo6bWluUmFtcE1zKTsKKyAgICBzdGQ6OnN0cmluZyBtaW5SYW1wTXNMaXRlcmFsID0gZ2V0WG1sQXR0cmlidXRlKGN1ciwgQXR0cmlidXRlczo6bWluUmFtcE1zKTsKICAgICB1aW50MzJfdCBtaW5SYW1wTXM7CiAgICAgaWYgKCFtaW5SYW1wTXNMaXRlcmFsLmVtcHR5KCkgJiYgY29udmVydFRvKG1pblJhbXBNc0xpdGVyYWwsIG1pblJhbXBNcykpIHsKICAgICAgICAgZ2Fpbi0+c2V0TWluUmFtcEluTXMobWluUmFtcE1zKTsKICAgICB9CiAKLSAgICBzdHJpbmcgbWF4UmFtcE1zTGl0ZXJhbCA9IGdldFhtbEF0dHJpYnV0ZShyb290LCBBdHRyaWJ1dGVzOjptYXhSYW1wTXMpOworICAgIHN0ZDo6c3RyaW5nIG1heFJhbXBNc0xpdGVyYWwgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCBBdHRyaWJ1dGVzOjptYXhSYW1wTXMpOwogICAgIHVpbnQzMl90IG1heFJhbXBNczsKICAgICBpZiAoIW1heFJhbXBNc0xpdGVyYWwuZW1wdHkoKSAmJiBjb252ZXJ0VG8obWF4UmFtcE1zTGl0ZXJhbCwgbWF4UmFtcE1zKSkgewogICAgICAgICBnYWluLT5zZXRNYXhSYW1wSW5NcyhtYXhSYW1wTXMpOwogICAgIH0KLSAgICBBTE9HVigiJXM6IGFkZGluZyBuZXcgZ2FpbiBtb2RlICUwOHggY2hhbm5lbCBtYXNrICUwOHggbWluIG1CICVkIG1heCBtQiAlZCIsIF9fRlVOQ1RJT05fXywKKyAgICBBTE9HVigiJXM6IGFkZGluZyBuZXcgZ2FpbiBtb2RlICUwOHggY2hhbm5lbCBtYXNrICUwOHggbWluIG1CICVkIG1heCBtQiAlZCIsIF9fZnVuY19fLAogICAgICAgICAgIGdhaW4tPmdldE1vZGUoKSwgZ2Fpbi0+Z2V0Q2hhbm5lbE1hc2soKSwgZ2Fpbi0+Z2V0TWluVmFsdWVJbk1iKCksCiAgICAgICAgICAgZ2Fpbi0+Z2V0TWF4VmFsdWVJbk1iKCkpOwogCi0gICAgaWYgKGdhaW4tPmdldE1vZGUoKSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgaWYgKGdhaW4tPmdldE1vZGUoKSAhPSAwKSB7CisgICAgICAgIHJldHVybiBnYWluOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKEJBRF9WQUxVRSk7CiAgICAgfQotICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotY29uc3QgY2hhciAqY29uc3QgQXVkaW9Qcm9maWxlVHJhaXRzOjpjb2xsZWN0aW9uVGFnID0gInByb2ZpbGVzIjsKLWNvbnN0IGNoYXIgKmNvbnN0IEF1ZGlvUHJvZmlsZVRyYWl0czo6dGFnID0gInByb2ZpbGUiOwotCi1jb25zdCBjaGFyIEF1ZGlvUHJvZmlsZVRyYWl0czo6QXR0cmlidXRlczo6bmFtZVtdID0gIm5hbWUiOwotY29uc3QgY2hhciBBdWRpb1Byb2ZpbGVUcmFpdHM6OkF0dHJpYnV0ZXM6OnNhbXBsaW5nUmF0ZXNbXSA9ICJzYW1wbGluZ1JhdGVzIjsKLWNvbnN0IGNoYXIgQXVkaW9Qcm9maWxlVHJhaXRzOjpBdHRyaWJ1dGVzOjpmb3JtYXRbXSA9ICJmb3JtYXQiOwotY29uc3QgY2hhciBBdWRpb1Byb2ZpbGVUcmFpdHM6OkF0dHJpYnV0ZXM6OmNoYW5uZWxNYXNrc1tdID0gImNoYW5uZWxNYXNrcyI7Ci0KLXN0YXR1c190IEF1ZGlvUHJvZmlsZVRyYWl0czo6ZGVzZXJpYWxpemUoX3htbERvYyAqLypkb2MqLywgY29uc3QgX3htbE5vZGUgKnJvb3QsIFB0ckVsZW1lbnQgJnByb2ZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB0clNlcmlhbGl6aW5nQ3R4IC8qc2VyaWFsaXppbmdDb250ZXh0Ki8pCitSZXR1cm48QXVkaW9Qcm9maWxlVHJhaXRzOjpFbGVtZW50PiBBdWRpb1Byb2ZpbGVUcmFpdHM6OmRlc2VyaWFsaXplKGNvbnN0IHhtbE5vZGUgKmN1ciwKKyAgICAgICAgUHRyU2VyaWFsaXppbmdDdHggLypzZXJpYWxpemluZ0NvbnRleHQqLykKIHsKLSAgICBzdHJpbmcgc2FtcGxpbmdSYXRlcyA9IGdldFhtbEF0dHJpYnV0ZShyb290LCBBdHRyaWJ1dGVzOjpzYW1wbGluZ1JhdGVzKTsKLSAgICBzdHJpbmcgZm9ybWF0ID0gZ2V0WG1sQXR0cmlidXRlKHJvb3QsIEF0dHJpYnV0ZXM6OmZvcm1hdCk7Ci0gICAgc3RyaW5nIGNoYW5uZWxzID0gZ2V0WG1sQXR0cmlidXRlKHJvb3QsIEF0dHJpYnV0ZXM6OmNoYW5uZWxNYXNrcyk7CisgICAgc3RkOjpzdHJpbmcgc2FtcGxpbmdSYXRlcyA9IGdldFhtbEF0dHJpYnV0ZShjdXIsIEF0dHJpYnV0ZXM6OnNhbXBsaW5nUmF0ZXMpOworICAgIHN0ZDo6c3RyaW5nIGZvcm1hdCA9IGdldFhtbEF0dHJpYnV0ZShjdXIsIEF0dHJpYnV0ZXM6OmZvcm1hdCk7CisgICAgc3RkOjpzdHJpbmcgY2hhbm5lbHMgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCBBdHRyaWJ1dGVzOjpjaGFubmVsTWFza3MpOwogCi0gICAgcHJvZmlsZSA9IG5ldyBFbGVtZW50KGZvcm1hdEZyb21TdHJpbmcoZm9ybWF0LCBnRHluYW1pY0Zvcm1hdCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrc0Zyb21TdHJpbmcoY2hhbm5lbHMsICIsIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXNGcm9tU3RyaW5nKHNhbXBsaW5nUmF0ZXMsICIsIikpOworICAgIEVsZW1lbnQgcHJvZmlsZSA9IG5ldyBBdWRpb1Byb2ZpbGUoZm9ybWF0RnJvbVN0cmluZyhmb3JtYXQsIGdEeW5hbWljRm9ybWF0KSwKKyAgICAgICAgICAgIGNoYW5uZWxNYXNrc0Zyb21TdHJpbmcoY2hhbm5lbHMsICIsIiksCisgICAgICAgICAgICBzYW1wbGluZ1JhdGVzRnJvbVN0cmluZyhzYW1wbGluZ1JhdGVzLCAiLCIpKTsKIAogICAgIHByb2ZpbGUtPnNldER5bmFtaWNGb3JtYXQocHJvZmlsZS0+Z2V0Rm9ybWF0KCkgPT0gZ0R5bmFtaWNGb3JtYXQpOwogICAgIHByb2ZpbGUtPnNldER5bmFtaWNDaGFubmVscyhwcm9maWxlLT5nZXRDaGFubmVscygpLmlzRW1wdHkoKSk7CiAgICAgcHJvZmlsZS0+c2V0RHluYW1pY1JhdGUocHJvZmlsZS0+Z2V0U2FtcGxlUmF0ZXMoKS5pc0VtcHR5KCkpOwogCi0gICAgcmV0dXJuIE5PX0VSUk9SOworICAgIHJldHVybiBwcm9maWxlOwogfQogCi0KLWNvbnN0IGNoYXIgKmNvbnN0IE1peFBvcnRUcmFpdHM6OmNvbGxlY3Rpb25UYWcgPSAibWl4UG9ydHMiOwotY29uc3QgY2hhciAqY29uc3QgTWl4UG9ydFRyYWl0czo6dGFnID0gIm1peFBvcnQiOwotCi1jb25zdCBjaGFyIE1peFBvcnRUcmFpdHM6OkF0dHJpYnV0ZXM6Om5hbWVbXSA9ICJuYW1lIjsKLWNvbnN0IGNoYXIgTWl4UG9ydFRyYWl0czo6QXR0cmlidXRlczo6cm9sZVtdID0gInJvbGUiOwotY29uc3QgY2hhciBNaXhQb3J0VHJhaXRzOjpBdHRyaWJ1dGVzOjpmbGFnc1tdID0gImZsYWdzIjsKLWNvbnN0IGNoYXIgTWl4UG9ydFRyYWl0czo6QXR0cmlidXRlczo6bWF4T3BlbkNvdW50W10gPSAibWF4T3BlbkNvdW50IjsKLWNvbnN0IGNoYXIgTWl4UG9ydFRyYWl0czo6QXR0cmlidXRlczo6bWF4QWN0aXZlQ291bnRbXSA9ICJtYXhBY3RpdmVDb3VudCI7Ci0KLXN0YXR1c190IE1peFBvcnRUcmFpdHM6OmRlc2VyaWFsaXplKF94bWxEb2MgKmRvYywgY29uc3QgX3htbE5vZGUgKmNoaWxkLCBQdHJFbGVtZW50ICZtaXhQb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHRyU2VyaWFsaXppbmdDdHggLypzZXJpYWxpemluZ0NvbnRleHQqLykKK1JldHVybjxNaXhQb3J0VHJhaXRzOjpFbGVtZW50PiBNaXhQb3J0VHJhaXRzOjpkZXNlcmlhbGl6ZShjb25zdCB4bWxOb2RlICpjaGlsZCwKKyAgICAgICAgUHRyU2VyaWFsaXppbmdDdHggLypzZXJpYWxpemluZ0NvbnRleHQqLykKIHsKLSAgICBzdHJpbmcgbmFtZSA9IGdldFhtbEF0dHJpYnV0ZShjaGlsZCwgQXR0cmlidXRlczo6bmFtZSk7CisgICAgc3RkOjpzdHJpbmcgbmFtZSA9IGdldFhtbEF0dHJpYnV0ZShjaGlsZCwgQXR0cmlidXRlczo6bmFtZSk7CiAgICAgaWYgKG5hbWUuZW1wdHkoKSkgewotICAgICAgICBBTE9HRSgiJXM6IE5vICVzIGZvdW5kIiwgX19GVU5DVElPTl9fLCBBdHRyaWJ1dGVzOjpuYW1lKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgQUxPR0UoIiVzOiBObyAlcyBmb3VuZCIsIF9fZnVuY19fLCBBdHRyaWJ1dGVzOjpuYW1lKTsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QoQkFEX1ZBTFVFKTsKICAgICB9Ci0gICAgQUxPR1YoIiVzOiAlcyAlcz0lcyIsIF9fRlVOQ1RJT05fXywgdGFnLCBBdHRyaWJ1dGVzOjpuYW1lLCBuYW1lLmNfc3RyKCkpOwotICAgIHN0cmluZyByb2xlID0gZ2V0WG1sQXR0cmlidXRlKGNoaWxkLCBBdHRyaWJ1dGVzOjpyb2xlKTsKKyAgICBBTE9HVigiJXM6ICVzICVzPSVzIiwgX19mdW5jX18sIHRhZywgQXR0cmlidXRlczo6bmFtZSwgbmFtZS5jX3N0cigpKTsKKyAgICBzdGQ6OnN0cmluZyByb2xlID0gZ2V0WG1sQXR0cmlidXRlKGNoaWxkLCBBdHRyaWJ1dGVzOjpyb2xlKTsKICAgICBpZiAocm9sZS5lbXB0eSgpKSB7Ci0gICAgICAgIEFMT0dFKCIlczogTm8gJXMgZm91bmQiLCBfX0ZVTkNUSU9OX18sIEF0dHJpYnV0ZXM6OnJvbGUpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICBBTE9HRSgiJXM6IE5vICVzIGZvdW5kIiwgX19mdW5jX18sIEF0dHJpYnV0ZXM6OnJvbGUpOworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChCQURfVkFMVUUpOwogICAgIH0KLSAgICBBTE9HVigiJXM6IFJvbGU9JXMiLCBfX0ZVTkNUSU9OX18sIHJvbGUuY19zdHIoKSk7Ci0gICAgYXVkaW9fcG9ydF9yb2xlX3QgcG9ydFJvbGUgPSByb2xlID09ICJzb3VyY2UiID8gQVVESU9fUE9SVF9ST0xFX1NPVVJDRSA6IEFVRElPX1BPUlRfUk9MRV9TSU5LOworICAgIEFMT0dWKCIlczogUm9sZT0lcyIsIF9fZnVuY19fLCByb2xlLmNfc3RyKCkpOworICAgIGF1ZGlvX3BvcnRfcm9sZV90IHBvcnRSb2xlID0gKHJvbGUgPT0gQXR0cmlidXRlczo6cm9sZVNvdXJjZSkgPworICAgICAgICAgICAgQVVESU9fUE9SVF9ST0xFX1NPVVJDRSA6IEFVRElPX1BPUlRfUk9MRV9TSU5LOwogCi0gICAgbWl4UG9ydCA9IG5ldyBFbGVtZW50KFN0cmluZzgobmFtZS5jX3N0cigpKSwgcG9ydFJvbGUpOworICAgIEVsZW1lbnQgbWl4UG9ydCA9IG5ldyBJT1Byb2ZpbGUoU3RyaW5nOChuYW1lLmNfc3RyKCkpLCBwb3J0Um9sZSk7CiAKICAgICBBdWRpb1Byb2ZpbGVUcmFpdHM6OkNvbGxlY3Rpb24gcHJvZmlsZXM7Ci0gICAgZGVzZXJpYWxpemVDb2xsZWN0aW9uPEF1ZGlvUHJvZmlsZVRyYWl0cz4oZG9jLCBjaGlsZCwgcHJvZmlsZXMsIE5VTEwpOworICAgIHN0YXR1c190IHN0YXR1cyA9IGRlc2VyaWFsaXplQ29sbGVjdGlvbjxBdWRpb1Byb2ZpbGVUcmFpdHM+KGNoaWxkLCAmcHJvZmlsZXMsIE5VTEwpOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1Qoc3RhdHVzKTsKKyAgICB9CiAgICAgaWYgKHByb2ZpbGVzLmlzRW1wdHkoKSkgewotICAgICAgICBzcCA8QXVkaW9Qcm9maWxlPiBkeW5hbWljUHJvZmlsZSA9IG5ldyBBdWRpb1Byb2ZpbGUoZ0R5bmFtaWNGb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFubmVsc1ZlY3RvcigpLCBTYW1wbGVSYXRlVmVjdG9yKCkpOwotICAgICAgICBkeW5hbWljUHJvZmlsZS0+c2V0RHluYW1pY0Zvcm1hdCh0cnVlKTsKLSAgICAgICAgZHluYW1pY1Byb2ZpbGUtPnNldER5bmFtaWNDaGFubmVscyh0cnVlKTsKLSAgICAgICAgZHluYW1pY1Byb2ZpbGUtPnNldER5bmFtaWNSYXRlKHRydWUpOwotICAgICAgICBwcm9maWxlcy5hZGQoZHluYW1pY1Byb2ZpbGUpOworICAgICAgICBwcm9maWxlcy5hZGQoQXVkaW9Qcm9maWxlOjpjcmVhdGVGdWxsRHluYW1pYygpKTsKICAgICB9CiAgICAgbWl4UG9ydC0+c2V0QXVkaW9Qcm9maWxlcyhwcm9maWxlcyk7CiAKLSAgICBzdHJpbmcgZmxhZ3MgPSBnZXRYbWxBdHRyaWJ1dGUoY2hpbGQsIEF0dHJpYnV0ZXM6OmZsYWdzKTsKKyAgICBzdGQ6OnN0cmluZyBmbGFncyA9IGdldFhtbEF0dHJpYnV0ZShjaGlsZCwgQXR0cmlidXRlczo6ZmxhZ3MpOwogICAgIGlmICghZmxhZ3MuZW1wdHkoKSkgewogICAgICAgICAvLyBTb3VyY2Ugcm9sZQogICAgICAgICBpZiAocG9ydFJvbGUgPT0gQVVESU9fUE9SVF9ST0xFX1NPVVJDRSkgewpAQCAtMjYxLDUyICs0NjEsNDYgQEAKICAgICAgICAgICAgIG1peFBvcnQtPnNldEZsYWdzKElucHV0RmxhZ0NvbnZlcnRlcjo6bWFza0Zyb21TdHJpbmcoZmxhZ3MpKTsKICAgICAgICAgfQogICAgIH0KLSAgICBzdHJpbmcgbWF4T3BlbkNvdW50ID0gZ2V0WG1sQXR0cmlidXRlKGNoaWxkLCBBdHRyaWJ1dGVzOjptYXhPcGVuQ291bnQpOworICAgIHN0ZDo6c3RyaW5nIG1heE9wZW5Db3VudCA9IGdldFhtbEF0dHJpYnV0ZShjaGlsZCwgQXR0cmlidXRlczo6bWF4T3BlbkNvdW50KTsKICAgICBpZiAoIW1heE9wZW5Db3VudC5lbXB0eSgpKSB7CiAgICAgICAgIGNvbnZlcnRUbyhtYXhPcGVuQ291bnQsIG1peFBvcnQtPm1heE9wZW5Db3VudCk7CiAgICAgfQotICAgIHN0cmluZyBtYXhBY3RpdmVDb3VudCA9IGdldFhtbEF0dHJpYnV0ZShjaGlsZCwgQXR0cmlidXRlczo6bWF4QWN0aXZlQ291bnQpOworICAgIHN0ZDo6c3RyaW5nIG1heEFjdGl2ZUNvdW50ID0gZ2V0WG1sQXR0cmlidXRlKGNoaWxkLCBBdHRyaWJ1dGVzOjptYXhBY3RpdmVDb3VudCk7CiAgICAgaWYgKCFtYXhBY3RpdmVDb3VudC5lbXB0eSgpKSB7CiAgICAgICAgIGNvbnZlcnRUbyhtYXhBY3RpdmVDb3VudCwgbWl4UG9ydC0+bWF4QWN0aXZlQ291bnQpOwogICAgIH0KICAgICAvLyBEZXNlcmlhbGl6ZSBjaGlsZHJlbgogICAgIEF1ZGlvR2FpblRyYWl0czo6Q29sbGVjdGlvbiBnYWluczsKLSAgICBkZXNlcmlhbGl6ZUNvbGxlY3Rpb248QXVkaW9HYWluVHJhaXRzPihkb2MsIGNoaWxkLCBnYWlucywgTlVMTCk7CisgICAgc3RhdHVzID0gZGVzZXJpYWxpemVDb2xsZWN0aW9uPEF1ZGlvR2FpblRyYWl0cz4oY2hpbGQsICZnYWlucywgTlVMTCk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChzdGF0dXMpOworICAgIH0KICAgICBtaXhQb3J0LT5zZXRHYWlucyhnYWlucyk7CiAKLSAgICByZXR1cm4gTk9fRVJST1I7CisgICAgcmV0dXJuIG1peFBvcnQ7CiB9CiAKLWNvbnN0IGNoYXIgKmNvbnN0IERldmljZVBvcnRUcmFpdHM6OnRhZyA9ICJkZXZpY2VQb3J0IjsKLWNvbnN0IGNoYXIgKmNvbnN0IERldmljZVBvcnRUcmFpdHM6OmNvbGxlY3Rpb25UYWcgPSAiZGV2aWNlUG9ydHMiOwotCi1jb25zdCBjaGFyIERldmljZVBvcnRUcmFpdHM6OkF0dHJpYnV0ZXM6OnRhZ05hbWVbXSA9ICJ0YWdOYW1lIjsKLWNvbnN0IGNoYXIgRGV2aWNlUG9ydFRyYWl0czo6QXR0cmlidXRlczo6dHlwZVtdID0gInR5cGUiOwotY29uc3QgY2hhciBEZXZpY2VQb3J0VHJhaXRzOjpBdHRyaWJ1dGVzOjpyb2xlW10gPSAicm9sZSI7Ci1jb25zdCBjaGFyIERldmljZVBvcnRUcmFpdHM6OkF0dHJpYnV0ZXM6OmFkZHJlc3NbXSA9ICJhZGRyZXNzIjsKLWNvbnN0IGNoYXIgRGV2aWNlUG9ydFRyYWl0czo6QXR0cmlidXRlczo6cm9sZVNvdXJjZVtdID0gInNvdXJjZSI7Ci0KLXN0YXR1c190IERldmljZVBvcnRUcmFpdHM6OmRlc2VyaWFsaXplKF94bWxEb2MgKmRvYywgY29uc3QgX3htbE5vZGUgKnJvb3QsIFB0ckVsZW1lbnQgJmRldmljZURlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQdHJTZXJpYWxpemluZ0N0eCAvKnNlcmlhbGl6aW5nQ29udGV4dCovKQorUmV0dXJuPERldmljZVBvcnRUcmFpdHM6OkVsZW1lbnQ+IERldmljZVBvcnRUcmFpdHM6OmRlc2VyaWFsaXplKGNvbnN0IHhtbE5vZGUgKmN1ciwKKyAgICAgICAgUHRyU2VyaWFsaXppbmdDdHggLypzZXJpYWxpemluZ0NvbnRleHQqLykKIHsKLSAgICBzdHJpbmcgbmFtZSA9IGdldFhtbEF0dHJpYnV0ZShyb290LCBBdHRyaWJ1dGVzOjp0YWdOYW1lKTsKKyAgICBzdGQ6OnN0cmluZyBuYW1lID0gZ2V0WG1sQXR0cmlidXRlKGN1ciwgQXR0cmlidXRlczo6dGFnTmFtZSk7CiAgICAgaWYgKG5hbWUuZW1wdHkoKSkgewotICAgICAgICBBTE9HRSgiJXM6IE5vICVzIGZvdW5kIiwgX19GVU5DVElPTl9fLCBBdHRyaWJ1dGVzOjp0YWdOYW1lKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgQUxPR0UoIiVzOiBObyAlcyBmb3VuZCIsIF9fZnVuY19fLCBBdHRyaWJ1dGVzOjp0YWdOYW1lKTsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QoQkFEX1ZBTFVFKTsKICAgICB9Ci0gICAgQUxPR1YoIiVzOiAlcyAlcz0lcyIsIF9fRlVOQ1RJT05fXywgdGFnLCBBdHRyaWJ1dGVzOjp0YWdOYW1lLCBuYW1lLmNfc3RyKCkpOwotICAgIHN0cmluZyB0eXBlTmFtZSA9IGdldFhtbEF0dHJpYnV0ZShyb290LCBBdHRyaWJ1dGVzOjp0eXBlKTsKKyAgICBBTE9HVigiJXM6ICVzICVzPSVzIiwgX19mdW5jX18sIHRhZywgQXR0cmlidXRlczo6dGFnTmFtZSwgbmFtZS5jX3N0cigpKTsKKyAgICBzdGQ6OnN0cmluZyB0eXBlTmFtZSA9IGdldFhtbEF0dHJpYnV0ZShjdXIsIEF0dHJpYnV0ZXM6OnR5cGUpOwogICAgIGlmICh0eXBlTmFtZS5lbXB0eSgpKSB7Ci0gICAgICAgIEFMT0dFKCIlczogbm8gdHlwZSBmb3IgJXMiLCBfX0ZVTkNUSU9OX18sIG5hbWUuY19zdHIoKSk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIEFMT0dFKCIlczogbm8gdHlwZSBmb3IgJXMiLCBfX2Z1bmNfXywgbmFtZS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QoQkFEX1ZBTFVFKTsKICAgICB9Ci0gICAgQUxPR1YoIiVzOiAlcyAlcz0lcyIsIF9fRlVOQ1RJT05fXywgdGFnLCBBdHRyaWJ1dGVzOjp0eXBlLCB0eXBlTmFtZS5jX3N0cigpKTsKLSAgICBzdHJpbmcgcm9sZSA9IGdldFhtbEF0dHJpYnV0ZShyb290LCBBdHRyaWJ1dGVzOjpyb2xlKTsKKyAgICBBTE9HVigiJXM6ICVzICVzPSVzIiwgX19mdW5jX18sIHRhZywgQXR0cmlidXRlczo6dHlwZSwgdHlwZU5hbWUuY19zdHIoKSk7CisgICAgc3RkOjpzdHJpbmcgcm9sZSA9IGdldFhtbEF0dHJpYnV0ZShjdXIsIEF0dHJpYnV0ZXM6OnJvbGUpOwogICAgIGlmIChyb2xlLmVtcHR5KCkpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBObyAlcyBmb3VuZCIsIF9fRlVOQ1RJT05fXywgQXR0cmlidXRlczo6cm9sZSk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIEFMT0dFKCIlczogTm8gJXMgZm91bmQiLCBfX2Z1bmNfXywgQXR0cmlidXRlczo6cm9sZSk7CisgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKEJBRF9WQUxVRSk7CiAgICAgfQotICAgIEFMT0dWKCIlczogJXMgJXM9JXMiLCBfX0ZVTkNUSU9OX18sIHRhZywgQXR0cmlidXRlczo6cm9sZSwgcm9sZS5jX3N0cigpKTsKKyAgICBBTE9HVigiJXM6ICVzICVzPSVzIiwgX19mdW5jX18sIHRhZywgQXR0cmlidXRlczo6cm9sZSwgcm9sZS5jX3N0cigpKTsKICAgICBhdWRpb19wb3J0X3JvbGVfdCBwb3J0Um9sZSA9IChyb2xlID09IEF0dHJpYnV0ZXM6OnJvbGVTb3VyY2UpID8KICAgICAgICAgICAgICAgICBBVURJT19QT1JUX1JPTEVfU09VUkNFIDogQVVESU9fUE9SVF9ST0xFX1NJTks7CiAKQEAgLTMxNCwzMzggKzUwOCwzNjQgQEAKICAgICBpZiAoIWRldmljZUZyb21TdHJpbmcodHlwZU5hbWUsIHR5cGUpIHx8CiAgICAgICAgICAgICAoIWF1ZGlvX2lzX2lucHV0X2RldmljZSh0eXBlKSAmJiBwb3J0Um9sZSA9PSBBVURJT19QT1JUX1JPTEVfU09VUkNFKSB8fAogICAgICAgICAgICAgKCFhdWRpb19pc19vdXRwdXRfZGV2aWNlcyh0eXBlKSAmJiBwb3J0Um9sZSA9PSBBVURJT19QT1JUX1JPTEVfU0lOSykpIHsKLSAgICAgICAgQUxPR1coIiVzOiBiYWQgdHlwZSAlMDh4IiwgX19GVU5DVElPTl9fLCB0eXBlKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgQUxPR1coIiVzOiBiYWQgdHlwZSAlMDh4IiwgX19mdW5jX18sIHR5cGUpOworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChCQURfVkFMVUUpOwogICAgIH0KLSAgICBkZXZpY2VEZXNjID0gbmV3IEVsZW1lbnQodHlwZSwgU3RyaW5nOChuYW1lLmNfc3RyKCkpKTsKKyAgICBFbGVtZW50IGRldmljZURlc2MgPSBuZXcgRGV2aWNlRGVzY3JpcHRvcih0eXBlLCBTdHJpbmc4KG5hbWUuY19zdHIoKSkpOwogCi0gICAgc3RyaW5nIGFkZHJlc3MgPSBnZXRYbWxBdHRyaWJ1dGUocm9vdCwgQXR0cmlidXRlczo6YWRkcmVzcyk7CisgICAgc3RkOjpzdHJpbmcgYWRkcmVzcyA9IGdldFhtbEF0dHJpYnV0ZShjdXIsIEF0dHJpYnV0ZXM6OmFkZHJlc3MpOwogICAgIGlmICghYWRkcmVzcy5lbXB0eSgpKSB7Ci0gICAgICAgIEFMT0dWKCIlczogYWRkcmVzcz0lcyBmb3IgJXMiLCBfX0ZVTkNUSU9OX18sIGFkZHJlc3MuY19zdHIoKSwgbmFtZS5jX3N0cigpKTsKKyAgICAgICAgQUxPR1YoIiVzOiBhZGRyZXNzPSVzIGZvciAlcyIsIF9fZnVuY19fLCBhZGRyZXNzLmNfc3RyKCksIG5hbWUuY19zdHIoKSk7CiAgICAgICAgIGRldmljZURlc2MtPm1BZGRyZXNzID0gU3RyaW5nOChhZGRyZXNzLmNfc3RyKCkpOwogICAgIH0KIAogICAgIEF1ZGlvUHJvZmlsZVRyYWl0czo6Q29sbGVjdGlvbiBwcm9maWxlczsKLSAgICBkZXNlcmlhbGl6ZUNvbGxlY3Rpb248QXVkaW9Qcm9maWxlVHJhaXRzPihkb2MsIHJvb3QsIHByb2ZpbGVzLCBOVUxMKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBkZXNlcmlhbGl6ZUNvbGxlY3Rpb248QXVkaW9Qcm9maWxlVHJhaXRzPihjdXIsICZwcm9maWxlcywgTlVMTCk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChzdGF0dXMpOworICAgIH0KICAgICBpZiAocHJvZmlsZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgIHNwIDxBdWRpb1Byb2ZpbGU+IGR5bmFtaWNQcm9maWxlID0gbmV3IEF1ZGlvUHJvZmlsZShnRHluYW1pY0Zvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYW5uZWxzVmVjdG9yKCksIFNhbXBsZVJhdGVWZWN0b3IoKSk7Ci0gICAgICAgIGR5bmFtaWNQcm9maWxlLT5zZXREeW5hbWljRm9ybWF0KHRydWUpOwotICAgICAgICBkeW5hbWljUHJvZmlsZS0+c2V0RHluYW1pY0NoYW5uZWxzKHRydWUpOwotICAgICAgICBkeW5hbWljUHJvZmlsZS0+c2V0RHluYW1pY1JhdGUodHJ1ZSk7Ci0gICAgICAgIHByb2ZpbGVzLmFkZChkeW5hbWljUHJvZmlsZSk7CisgICAgICAgIHByb2ZpbGVzLmFkZChBdWRpb1Byb2ZpbGU6OmNyZWF0ZUZ1bGxEeW5hbWljKCkpOwogICAgIH0KICAgICBkZXZpY2VEZXNjLT5zZXRBdWRpb1Byb2ZpbGVzKHByb2ZpbGVzKTsKIAogICAgIC8vIERlc2VyaWFsaXplIEF1ZGlvR2FpbiBjaGlsZHJlbgotICAgIGRlc2VyaWFsaXplQ29sbGVjdGlvbjxBdWRpb0dhaW5UcmFpdHM+KGRvYywgcm9vdCwgZGV2aWNlRGVzYy0+bUdhaW5zLCBOVUxMKTsKLSAgICBBTE9HVigiJXM6IGFkZGluZyBkZXZpY2UgdGFnICVzIHR5cGUgJTA4eCBhZGRyZXNzICVzIiwgX19GVU5DVElPTl9fLAorICAgIHN0YXR1cyA9IGRlc2VyaWFsaXplQ29sbGVjdGlvbjxBdWRpb0dhaW5UcmFpdHM+KGN1ciwgJmRldmljZURlc2MtPm1HYWlucywgTlVMTCk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChzdGF0dXMpOworICAgIH0KKyAgICBBTE9HVigiJXM6IGFkZGluZyBkZXZpY2UgdGFnICVzIHR5cGUgJTA4eCBhZGRyZXNzICVzIiwgX19mdW5jX18sCiAgICAgICAgICAgZGV2aWNlRGVzYy0+Z2V0TmFtZSgpLnN0cmluZygpLCB0eXBlLCBkZXZpY2VEZXNjLT5tQWRkcmVzcy5zdHJpbmcoKSk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOworICAgIHJldHVybiBkZXZpY2VEZXNjOwogfQogCi1jb25zdCBjaGFyICpjb25zdCBSb3V0ZVRyYWl0czo6dGFnID0gInJvdXRlIjsKLWNvbnN0IGNoYXIgKmNvbnN0IFJvdXRlVHJhaXRzOjpjb2xsZWN0aW9uVGFnID0gInJvdXRlcyI7Ci0KLWNvbnN0IGNoYXIgUm91dGVUcmFpdHM6OkF0dHJpYnV0ZXM6OnR5cGVbXSA9ICJ0eXBlIjsKLWNvbnN0IGNoYXIgUm91dGVUcmFpdHM6OkF0dHJpYnV0ZXM6OnR5cGVNaXhbXSA9ICJtaXgiOwotY29uc3QgY2hhciBSb3V0ZVRyYWl0czo6QXR0cmlidXRlczo6c2lua1tdID0gInNpbmsiOwotY29uc3QgY2hhciBSb3V0ZVRyYWl0czo6QXR0cmlidXRlczo6c291cmNlc1tdID0gInNvdXJjZXMiOwotCi0KLXN0YXR1c190IFJvdXRlVHJhaXRzOjpkZXNlcmlhbGl6ZShfeG1sRG9jICovKmRvYyovLCBjb25zdCBfeG1sTm9kZSAqcm9vdCwgUHRyRWxlbWVudCAmZWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQdHJTZXJpYWxpemluZ0N0eCBjdHgpCitSZXR1cm48Um91dGVUcmFpdHM6OkVsZW1lbnQ+IFJvdXRlVHJhaXRzOjpkZXNlcmlhbGl6ZShjb25zdCB4bWxOb2RlICpjdXIsIFB0clNlcmlhbGl6aW5nQ3R4IGN0eCkKIHsKLSAgICBzdHJpbmcgdHlwZSA9IGdldFhtbEF0dHJpYnV0ZShyb290LCBBdHRyaWJ1dGVzOjp0eXBlKTsKKyAgICBzdGQ6OnN0cmluZyB0eXBlID0gZ2V0WG1sQXR0cmlidXRlKGN1ciwgQXR0cmlidXRlczo6dHlwZSk7CiAgICAgaWYgKHR5cGUuZW1wdHkoKSkgewotICAgICAgICBBTE9HRSgiJXM6IE5vICVzIGZvdW5kIiwgX19GVU5DVElPTl9fLCBBdHRyaWJ1dGVzOjp0eXBlKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgQUxPR0UoIiVzOiBObyAlcyBmb3VuZCIsIF9fZnVuY19fLCBBdHRyaWJ1dGVzOjp0eXBlKTsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QoQkFEX1ZBTFVFKTsKICAgICB9CiAgICAgYXVkaW9fcm91dGVfdHlwZV90IHJvdXRlVHlwZSA9ICh0eXBlID09IEF0dHJpYnV0ZXM6OnR5cGVNaXgpID8KICAgICAgICAgICAgICAgICBBVURJT19ST1VURV9NSVggOiBBVURJT19ST1VURV9NVVg7CiAKLSAgICBBTE9HVigiJXM6ICVzICVzPSVzIiwgX19GVU5DVElPTl9fLCB0YWcsIEF0dHJpYnV0ZXM6OnR5cGUsIHR5cGUuY19zdHIoKSk7Ci0gICAgZWxlbWVudCA9IG5ldyBFbGVtZW50KHJvdXRlVHlwZSk7CisgICAgQUxPR1YoIiVzOiAlcyAlcz0lcyIsIF9fZnVuY19fLCB0YWcsIEF0dHJpYnV0ZXM6OnR5cGUsIHR5cGUuY19zdHIoKSk7CisgICAgRWxlbWVudCByb3V0ZSA9IG5ldyBBdWRpb1JvdXRlKHJvdXRlVHlwZSk7CiAKLSAgICBzdHJpbmcgc2lua0F0dHIgPSBnZXRYbWxBdHRyaWJ1dGUocm9vdCwgQXR0cmlidXRlczo6c2luayk7CisgICAgc3RkOjpzdHJpbmcgc2lua0F0dHIgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCBBdHRyaWJ1dGVzOjpzaW5rKTsKICAgICBpZiAoc2lua0F0dHIuZW1wdHkoKSkgewotICAgICAgICBBTE9HRSgiJXM6IE5vICVzIGZvdW5kIiwgX19GVU5DVElPTl9fLCBBdHRyaWJ1dGVzOjpzaW5rKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgQUxPR0UoIiVzOiBObyAlcyBmb3VuZCIsIF9fZnVuY19fLCBBdHRyaWJ1dGVzOjpzaW5rKTsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QoQkFEX1ZBTFVFKTsKICAgICB9CiAgICAgLy8gQ29udmVydCBTaW5rIG5hbWUgdG8gcG9ydCBwb2ludGVyCiAgICAgc3A8QXVkaW9Qb3J0PiBzaW5rID0gY3R4LT5maW5kUG9ydEJ5VGFnTmFtZShTdHJpbmc4KHNpbmtBdHRyLmNfc3RyKCkpKTsKICAgICBpZiAoc2luayA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCIlczogbm8gc2luayBmb3VuZCB3aXRoIG5hbWU9JXMiLCBfX0ZVTkNUSU9OX18sIHNpbmtBdHRyLmNfc3RyKCkpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICBBTE9HRSgiJXM6IG5vIHNpbmsgZm91bmQgd2l0aCBuYW1lPSVzIiwgX19mdW5jX18sIHNpbmtBdHRyLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChCQURfVkFMVUUpOwogICAgIH0KLSAgICBlbGVtZW50LT5zZXRTaW5rKHNpbmspOworICAgIHJvdXRlLT5zZXRTaW5rKHNpbmspOwogCi0gICAgc3RyaW5nIHNvdXJjZXNBdHRyID0gZ2V0WG1sQXR0cmlidXRlKHJvb3QsIEF0dHJpYnV0ZXM6OnNvdXJjZXMpOworICAgIHN0ZDo6c3RyaW5nIHNvdXJjZXNBdHRyID0gZ2V0WG1sQXR0cmlidXRlKGN1ciwgQXR0cmlidXRlczo6c291cmNlcyk7CiAgICAgaWYgKHNvdXJjZXNBdHRyLmVtcHR5KCkpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBObyAlcyBmb3VuZCIsIF9fRlVOQ1RJT05fXywgQXR0cmlidXRlczo6c291cmNlcyk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIEFMT0dFKCIlczogTm8gJXMgZm91bmQiLCBfX2Z1bmNfXywgQXR0cmlidXRlczo6c291cmNlcyk7CisgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKEJBRF9WQUxVRSk7CiAgICAgfQogICAgIC8vIFRva2VuaXplIGFuZCBDb252ZXJ0IFNvdXJjZXMgbmFtZSB0byBwb3J0IHBvaW50ZXIKICAgICBBdWRpb1BvcnRWZWN0b3Igc291cmNlczsKLSAgICBjaGFyICpzb3VyY2VzTGl0ZXJhbCA9IHN0cm5kdXAoc291cmNlc0F0dHIuY19zdHIoKSwgc3RybGVuKHNvdXJjZXNBdHRyLmNfc3RyKCkpKTsKLSAgICBjaGFyICpkZXZUYWcgPSBzdHJ0b2soc291cmNlc0xpdGVyYWwsICIsIik7CisgICAgc3RkOjp1bmlxdWVfcHRyPGNoYXJbXT4gc291cmNlc0xpdGVyYWx7c3RybmR1cCgKKyAgICAgICAgICAgICAgICBzb3VyY2VzQXR0ci5jX3N0cigpLCBzdHJsZW4oc291cmNlc0F0dHIuY19zdHIoKSkpfTsKKyAgICBjaGFyICpkZXZUYWcgPSBzdHJ0b2soc291cmNlc0xpdGVyYWwuZ2V0KCksICIsIik7CiAgICAgd2hpbGUgKGRldlRhZyAhPSBOVUxMKSB7CiAgICAgICAgIGlmIChzdHJsZW4oZGV2VGFnKSAhPSAwKSB7CiAgICAgICAgICAgICBzcDxBdWRpb1BvcnQ+IHNvdXJjZSA9IGN0eC0+ZmluZFBvcnRCeVRhZ05hbWUoU3RyaW5nOChkZXZUYWcpKTsKICAgICAgICAgICAgIGlmIChzb3VyY2UgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIEFMT0dFKCIlczogbm8gc291cmNlIGZvdW5kIHdpdGggbmFtZT0lcyIsIF9fRlVOQ1RJT05fXywgZGV2VGFnKTsKLSAgICAgICAgICAgICAgICBmcmVlKHNvdXJjZXNMaXRlcmFsKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogbm8gc291cmNlIGZvdW5kIHdpdGggbmFtZT0lcyIsIF9fZnVuY19fLCBkZXZUYWcpOworICAgICAgICAgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKEJBRF9WQUxVRSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzb3VyY2VzLmFkZChzb3VyY2UpOwogICAgICAgICB9CiAgICAgICAgIGRldlRhZyA9IHN0cnRvayhOVUxMLCAiLCIpOwogICAgIH0KLSAgICBmcmVlKHNvdXJjZXNMaXRlcmFsKTsKIAotICAgIHNpbmstPmFkZFJvdXRlKGVsZW1lbnQpOworICAgIHNpbmstPmFkZFJvdXRlKHJvdXRlKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNvdXJjZXMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgc3A8QXVkaW9Qb3J0PiBzb3VyY2UgPSBzb3VyY2VzLml0ZW1BdChpKTsKLSAgICAgICAgc291cmNlLT5hZGRSb3V0ZShlbGVtZW50KTsKKyAgICAgICAgc291cmNlLT5hZGRSb3V0ZShyb3V0ZSk7CiAgICAgfQotICAgIGVsZW1lbnQtPnNldFNvdXJjZXMoc291cmNlcyk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOworICAgIHJvdXRlLT5zZXRTb3VyY2VzKHNvdXJjZXMpOworICAgIHJldHVybiByb3V0ZTsKIH0KIAotY29uc3QgY2hhciAqY29uc3QgTW9kdWxlVHJhaXRzOjpjaGlsZEF0dGFjaGVkRGV2aWNlc1RhZyA9ICJhdHRhY2hlZERldmljZXMiOwotY29uc3QgY2hhciAqY29uc3QgTW9kdWxlVHJhaXRzOjpjaGlsZEF0dGFjaGVkRGV2aWNlVGFnID0gIml0ZW0iOwotY29uc3QgY2hhciAqY29uc3QgTW9kdWxlVHJhaXRzOjpjaGlsZERlZmF1bHRPdXRwdXREZXZpY2VUYWcgPSAiZGVmYXVsdE91dHB1dERldmljZSI7Ci0KLWNvbnN0IGNoYXIgKmNvbnN0IE1vZHVsZVRyYWl0czo6dGFnID0gIm1vZHVsZSI7Ci1jb25zdCBjaGFyICpjb25zdCBNb2R1bGVUcmFpdHM6OmNvbGxlY3Rpb25UYWcgPSAibW9kdWxlcyI7Ci0KLWNvbnN0IGNoYXIgTW9kdWxlVHJhaXRzOjpBdHRyaWJ1dGVzOjpuYW1lW10gPSAibmFtZSI7Ci1jb25zdCBjaGFyIE1vZHVsZVRyYWl0czo6QXR0cmlidXRlczo6dmVyc2lvbltdID0gImhhbFZlcnNpb24iOwotCi1zdGF0dXNfdCBNb2R1bGVUcmFpdHM6OmRlc2VyaWFsaXplKHhtbERvY1B0ciBkb2MsIGNvbnN0IHhtbE5vZGUgKnJvb3QsIFB0ckVsZW1lbnQgJm1vZHVsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHRyU2VyaWFsaXppbmdDdHggY3R4KQorUmV0dXJuPE1vZHVsZVRyYWl0czo6RWxlbWVudD4gTW9kdWxlVHJhaXRzOjpkZXNlcmlhbGl6ZShjb25zdCB4bWxOb2RlICpjdXIsIFB0clNlcmlhbGl6aW5nQ3R4IGN0eCkKIHsKLSAgICBzdHJpbmcgbmFtZSA9IGdldFhtbEF0dHJpYnV0ZShyb290LCBBdHRyaWJ1dGVzOjpuYW1lKTsKKyAgICBzdGQ6OnN0cmluZyBuYW1lID0gZ2V0WG1sQXR0cmlidXRlKGN1ciwgQXR0cmlidXRlczo6bmFtZSk7CiAgICAgaWYgKG5hbWUuZW1wdHkoKSkgewotICAgICAgICBBTE9HRSgiJXM6IE5vICVzIGZvdW5kIiwgX19GVU5DVElPTl9fLCBBdHRyaWJ1dGVzOjpuYW1lKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgQUxPR0UoIiVzOiBObyAlcyBmb3VuZCIsIF9fZnVuY19fLCBBdHRyaWJ1dGVzOjpuYW1lKTsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QoQkFEX1ZBTFVFKTsKICAgICB9CiAgICAgdWludDMyX3QgdmVyc2lvbk1ham9yID0gMCwgdmVyc2lvbk1pbm9yID0gMDsKLSAgICBzdHJpbmcgdmVyc2lvbkxpdGVyYWwgPSBnZXRYbWxBdHRyaWJ1dGUocm9vdCwgQXR0cmlidXRlczo6dmVyc2lvbik7CisgICAgc3RkOjpzdHJpbmcgdmVyc2lvbkxpdGVyYWwgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCBBdHRyaWJ1dGVzOjp2ZXJzaW9uKTsKICAgICBpZiAoIXZlcnNpb25MaXRlcmFsLmVtcHR5KCkpIHsKICAgICAgICAgc3NjYW5mKHZlcnNpb25MaXRlcmFsLmNfc3RyKCksICIldS4ldSIsICZ2ZXJzaW9uTWFqb3IsICZ2ZXJzaW9uTWlub3IpOwotICAgICAgICBBTE9HVigiJXM6IG1IYWxWZXJzaW9uID0gbWFqb3IgJXUgbWlub3IgJXUiLCAgX19GVU5DVElPTl9fLAorICAgICAgICBBTE9HVigiJXM6IG1IYWxWZXJzaW9uID0gbWFqb3IgJXUgbWlub3IgJXUiLCAgX19mdW5jX18sCiAgICAgICAgICAgICAgIHZlcnNpb25NYWpvciwgdmVyc2lvbk1ham9yKTsKICAgICB9CiAKLSAgICBBTE9HVigiJXM6ICVzICVzPSVzIiwgX19GVU5DVElPTl9fLCB0YWcsIEF0dHJpYnV0ZXM6Om5hbWUsIG5hbWUuY19zdHIoKSk7CisgICAgQUxPR1YoIiVzOiAlcyAlcz0lcyIsIF9fZnVuY19fLCB0YWcsIEF0dHJpYnV0ZXM6Om5hbWUsIG5hbWUuY19zdHIoKSk7CiAKLSAgICBtb2R1bGUgPSBuZXcgRWxlbWVudChuYW1lLmNfc3RyKCksIHZlcnNpb25NYWpvciwgdmVyc2lvbk1pbm9yKTsKKyAgICBFbGVtZW50IG1vZHVsZSA9IG5ldyBId01vZHVsZShuYW1lLmNfc3RyKCksIHZlcnNpb25NYWpvciwgdmVyc2lvbk1pbm9yKTsKIAogICAgIC8vIERlc2VyaWFsaXplIGNoaWxkcmVuczogQXVkaW8gTWl4IFBvcnQsIEF1ZGlvIERldmljZSBQb3J0cyAoU291cmNlL1NpbmspLCBBdWRpbyBSb3V0ZXMKICAgICBNaXhQb3J0VHJhaXRzOjpDb2xsZWN0aW9uIG1peFBvcnRzOwotICAgIGRlc2VyaWFsaXplQ29sbGVjdGlvbjxNaXhQb3J0VHJhaXRzPihkb2MsIHJvb3QsIG1peFBvcnRzLCBOVUxMKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBkZXNlcmlhbGl6ZUNvbGxlY3Rpb248TWl4UG9ydFRyYWl0cz4oY3VyLCAmbWl4UG9ydHMsIE5VTEwpOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1Qoc3RhdHVzKTsKKyAgICB9CiAgICAgbW9kdWxlLT5zZXRQcm9maWxlcyhtaXhQb3J0cyk7CiAKICAgICBEZXZpY2VQb3J0VHJhaXRzOjpDb2xsZWN0aW9uIGRldmljZVBvcnRzOwotICAgIGRlc2VyaWFsaXplQ29sbGVjdGlvbjxEZXZpY2VQb3J0VHJhaXRzPihkb2MsIHJvb3QsIGRldmljZVBvcnRzLCBOVUxMKTsKKyAgICBzdGF0dXMgPSBkZXNlcmlhbGl6ZUNvbGxlY3Rpb248RGV2aWNlUG9ydFRyYWl0cz4oY3VyLCAmZGV2aWNlUG9ydHMsIE5VTEwpOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1Qoc3RhdHVzKTsKKyAgICB9CiAgICAgbW9kdWxlLT5zZXREZWNsYXJlZERldmljZXMoZGV2aWNlUG9ydHMpOwogCiAgICAgUm91dGVUcmFpdHM6OkNvbGxlY3Rpb24gcm91dGVzOwotICAgIGRlc2VyaWFsaXplQ29sbGVjdGlvbjxSb3V0ZVRyYWl0cz4oZG9jLCByb290LCByb3V0ZXMsIG1vZHVsZS5nZXQoKSk7CisgICAgc3RhdHVzID0gZGVzZXJpYWxpemVDb2xsZWN0aW9uPFJvdXRlVHJhaXRzPihjdXIsICZyb3V0ZXMsIG1vZHVsZS5nZXQoKSk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChzdGF0dXMpOworICAgIH0KICAgICBtb2R1bGUtPnNldFJvdXRlcyhyb3V0ZXMpOwogCi0gICAgY29uc3QgeG1sTm9kZSAqY2hpbGRyZW4gPSByb290LT54bWxDaGlsZHJlbk5vZGU7Ci0gICAgd2hpbGUgKGNoaWxkcmVuICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKCF4bWxTdHJjbXAoY2hpbGRyZW4tPm5hbWUsIChjb25zdCB4bWxDaGFyICopY2hpbGRBdHRhY2hlZERldmljZXNUYWcpKSB7Ci0gICAgICAgICAgICBBTE9HVigiJXM6ICVzICVzIGZvdW5kIiwgX19GVU5DVElPTl9fLCB0YWcsIGNoaWxkQXR0YWNoZWREZXZpY2VzVGFnKTsKLSAgICAgICAgICAgIGNvbnN0IHhtbE5vZGUgKmNoaWxkID0gY2hpbGRyZW4tPnhtbENoaWxkcmVuTm9kZTsKLSAgICAgICAgICAgIHdoaWxlIChjaGlsZCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCF4bWxTdHJjbXAoY2hpbGQtPm5hbWUsIChjb25zdCB4bWxDaGFyICopY2hpbGRBdHRhY2hlZERldmljZVRhZykpIHsKLSAgICAgICAgICAgICAgICAgICAgeG1sQ2hhciAqYXR0YWNoZWREZXZpY2UgPSB4bWxOb2RlTGlzdEdldFN0cmluZyhkb2MsIGNoaWxkLT54bWxDaGlsZHJlbk5vZGUsIDEpOwotICAgICAgICAgICAgICAgICAgICBpZiAoYXR0YWNoZWREZXZpY2UgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIiVzOiAlcyAlcz0lcyIsIF9fRlVOQ1RJT05fXywgdGFnLCBjaGlsZEF0dGFjaGVkRGV2aWNlVGFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGNoYXIqKWF0dGFjaGVkRGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZS0+Z2V0RGVjbGFyZWREZXZpY2VzKCkuZ2V0RGV2aWNlRnJvbVRhZ05hbWUoU3RyaW5nOCgoY29uc3QgY2hhciopYXR0YWNoZWREZXZpY2UpKTsKKyAgICBmb3IgKGNvbnN0IHhtbE5vZGUgKmNoaWxkcmVuID0gY3VyLT54bWxDaGlsZHJlbk5vZGU7IGNoaWxkcmVuICE9IE5VTEw7CisgICAgICAgICBjaGlsZHJlbiA9IGNoaWxkcmVuLT5uZXh0KSB7CisgICAgICAgIGlmICgheG1sU3RyY21wKGNoaWxkcmVuLT5uYW1lLCByZWludGVycHJldF9jYXN0PGNvbnN0IHhtbENoYXIqPihjaGlsZEF0dGFjaGVkRGV2aWNlc1RhZykpKSB7CisgICAgICAgICAgICBBTE9HVigiJXM6ICVzICVzIGZvdW5kIiwgX19mdW5jX18sIHRhZywgY2hpbGRBdHRhY2hlZERldmljZXNUYWcpOworICAgICAgICAgICAgZm9yIChjb25zdCB4bWxOb2RlICpjaGlsZCA9IGNoaWxkcmVuLT54bWxDaGlsZHJlbk5vZGU7IGNoaWxkICE9IE5VTEw7CisgICAgICAgICAgICAgICAgIGNoaWxkID0gY2hpbGQtPm5leHQpIHsKKyAgICAgICAgICAgICAgICBpZiAoIXhtbFN0cmNtcChjaGlsZC0+bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB4bWxDaGFyKj4oY2hpbGRBdHRhY2hlZERldmljZVRhZykpKSB7CisgICAgICAgICAgICAgICAgICAgIGF1dG8gYXR0YWNoZWREZXZpY2UgPSBtYWtlX3htbFVuaXF1ZSh4bWxOb2RlTGlzdEdldFN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLT5kb2MsIGNoaWxkLT54bWxDaGlsZHJlbk5vZGUsIDEpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGF0dGFjaGVkRGV2aWNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIlczogJXMgJXM9JXMiLCBfX2Z1bmNfXywgdGFnLCBjaGlsZEF0dGFjaGVkRGV2aWNlVGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihhdHRhY2hlZERldmljZS5nZXQoKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlID0gbW9kdWxlLT5nZXREZWNsYXJlZERldmljZXMoKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RGV2aWNlRnJvbVRhZ05hbWUoU3RyaW5nOChyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0YWNoZWREZXZpY2UuZ2V0KCkpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPmFkZEF2YWlsYWJsZURldmljZShkZXZpY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgeG1sRnJlZShhdHRhY2hlZERldmljZSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2hpbGQgPSBjaGlsZC0+bmV4dDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBpZiAoIXhtbFN0cmNtcChjaGlsZHJlbi0+bmFtZSwgKGNvbnN0IHhtbENoYXIgKiljaGlsZERlZmF1bHRPdXRwdXREZXZpY2VUYWcpKSB7Ci0gICAgICAgICAgICB4bWxDaGFyICpkZWZhdWx0T3V0cHV0RGV2aWNlID0geG1sTm9kZUxpc3RHZXRTdHJpbmcoZG9jLCBjaGlsZHJlbi0+eG1sQ2hpbGRyZW5Ob2RlLCAxKTs7Ci0gICAgICAgICAgICBpZiAoZGVmYXVsdE91dHB1dERldmljZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIiVzOiAlcyAlcz0lcyIsIF9fRlVOQ1RJT05fXywgdGFnLCBjaGlsZERlZmF1bHRPdXRwdXREZXZpY2VUYWcsCi0gICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGNoYXIqKWRlZmF1bHRPdXRwdXREZXZpY2UpOwotICAgICAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGUtPmdldERlY2xhcmVkRGV2aWNlcygpLmdldERldmljZUZyb21UYWdOYW1lKFN0cmluZzgoKGNvbnN0IGNoYXIqKWRlZmF1bHRPdXRwdXREZXZpY2UpKTsKKyAgICAgICAgaWYgKCF4bWxTdHJjbXAoY2hpbGRyZW4tPm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHhtbENoYXIqPihjaGlsZERlZmF1bHRPdXRwdXREZXZpY2VUYWcpKSkgeworICAgICAgICAgICAgYXV0byBkZWZhdWx0T3V0cHV0RGV2aWNlID0gbWFrZV94bWxVbmlxdWUoeG1sTm9kZUxpc3RHZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4tPmRvYywgY2hpbGRyZW4tPnhtbENoaWxkcmVuTm9kZSwgMSkpOworICAgICAgICAgICAgaWYgKGRlZmF1bHRPdXRwdXREZXZpY2UgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIEFMT0dWKCIlczogJXMgJXM9JXMiLCBfX2Z1bmNfXywgdGFnLCBjaGlsZERlZmF1bHRPdXRwdXREZXZpY2VUYWcsCisgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihkZWZhdWx0T3V0cHV0RGV2aWNlLmdldCgpKSk7CisgICAgICAgICAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlID0gbW9kdWxlLT5nZXREZWNsYXJlZERldmljZXMoKS5nZXREZXZpY2VGcm9tVGFnTmFtZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oZGVmYXVsdE91dHB1dERldmljZS5nZXQoKSkpKTsKICAgICAgICAgICAgICAgICBpZiAoZGV2aWNlICE9IDAgJiYgY3R4LT5nZXREZWZhdWx0T3V0cHV0RGV2aWNlKCkgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICBjdHgtPnNldERlZmF1bHRPdXRwdXREZXZpY2UoZGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIiVzOiBkZWZhdWx0IGlzICUwOHgiLCBfX0ZVTkNUSU9OX18sIGN0eC0+Z2V0RGVmYXVsdE91dHB1dERldmljZSgpLT50eXBlKCkpOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiJXM6IGRlZmF1bHQgaXMgJTA4eCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGN0eC0+Z2V0RGVmYXVsdE91dHB1dERldmljZSgpLT50eXBlKCkpOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB4bWxGcmVlKGRlZmF1bHRPdXRwdXREZXZpY2UpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIGNoaWxkcmVuID0gY2hpbGRyZW4tPm5leHQ7CiAgICAgfQotICAgIHJldHVybiBOT19FUlJPUjsKKyAgICByZXR1cm4gbW9kdWxlOwogfQogCi1jb25zdCBjaGFyICpjb25zdCBHbG9iYWxDb25maWdUcmFpdHM6OnRhZyA9ICJnbG9iYWxDb25maWd1cmF0aW9uIjsKLQotY29uc3QgY2hhciBHbG9iYWxDb25maWdUcmFpdHM6OkF0dHJpYnV0ZXM6OnNwZWFrZXJEcmNFbmFibGVkW10gPSAic3BlYWtlcl9kcmNfZW5hYmxlZCI7Ci0KLQotc3RhdHVzX3QgR2xvYmFsQ29uZmlnVHJhaXRzOjpkZXNlcmlhbGl6ZShjb25zdCB4bWxOb2RlICpjdXIsIEF1ZGlvUG9saWN5Q29uZmlnICZjb25maWcpCitzdGF0dXNfdCBHbG9iYWxDb25maWdUcmFpdHM6OmRlc2VyaWFsaXplKGNvbnN0IHhtbE5vZGUgKnJvb3QsIEF1ZGlvUG9saWN5Q29uZmlnICpjb25maWcpCiB7Ci0gICAgY29uc3QgeG1sTm9kZSAqcm9vdCA9IGN1ci0+eG1sQ2hpbGRyZW5Ob2RlOwotICAgIHdoaWxlIChyb290ICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKCF4bWxTdHJjbXAocm9vdC0+bmFtZSwgKGNvbnN0IHhtbENoYXIgKil0YWcpKSB7Ci0gICAgICAgICAgICBzdHJpbmcgc3BlYWtlckRyY0VuYWJsZWQgPQotICAgICAgICAgICAgICAgICAgICBnZXRYbWxBdHRyaWJ1dGUocm9vdCwgQXR0cmlidXRlczo6c3BlYWtlckRyY0VuYWJsZWQpOworICAgIGZvciAoY29uc3QgeG1sTm9kZSAqY3VyID0gcm9vdC0+eG1sQ2hpbGRyZW5Ob2RlOyBjdXIgIT0gTlVMTDsgY3VyID0gY3VyLT5uZXh0KSB7CisgICAgICAgIGlmICgheG1sU3RyY21wKGN1ci0+bmFtZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB4bWxDaGFyKj4odGFnKSkpIHsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHNwZWFrZXJEcmNFbmFibGVkID0KKyAgICAgICAgICAgICAgICAgICAgZ2V0WG1sQXR0cmlidXRlKGN1ciwgQXR0cmlidXRlczo6c3BlYWtlckRyY0VuYWJsZWQpOwogICAgICAgICAgICAgYm9vbCBpc1NwZWFrZXJEcmNFbmFibGVkOwogICAgICAgICAgICAgaWYgKCFzcGVha2VyRHJjRW5hYmxlZC5lbXB0eSgpICYmCi0gICAgICAgICAgICAgICAgICAgIGNvbnZlcnRUbzxzdHJpbmcsIGJvb2w+KHNwZWFrZXJEcmNFbmFibGVkLCBpc1NwZWFrZXJEcmNFbmFibGVkKSkgewotICAgICAgICAgICAgICAgIGNvbmZpZy5zZXRTcGVha2VyRHJjRW5hYmxlZChpc1NwZWFrZXJEcmNFbmFibGVkKTsKKyAgICAgICAgICAgICAgICAgICAgY29udmVydFRvPHN0ZDo6c3RyaW5nLCBib29sPihzcGVha2VyRHJjRW5hYmxlZCwgaXNTcGVha2VyRHJjRW5hYmxlZCkpIHsKKyAgICAgICAgICAgICAgICBjb25maWctPnNldFNwZWFrZXJEcmNFbmFibGVkKGlzU3BlYWtlckRyY0VuYWJsZWQpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9Ci0gICAgICAgIHJvb3QgPSByb290LT5uZXh0OwogICAgIH0KICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLQotY29uc3QgY2hhciAqY29uc3QgVm9sdW1lVHJhaXRzOjp0YWcgPSAidm9sdW1lIjsKLWNvbnN0IGNoYXIgKmNvbnN0IFZvbHVtZVRyYWl0czo6Y29sbGVjdGlvblRhZyA9ICJ2b2x1bWVzIjsKLWNvbnN0IGNoYXIgKmNvbnN0IFZvbHVtZVRyYWl0czo6dm9sdW1lUG9pbnRUYWcgPSAicG9pbnQiOwotCi1jb25zdCBjaGFyIFZvbHVtZVRyYWl0czo6QXR0cmlidXRlczo6c3RyZWFtW10gPSAic3RyZWFtIjsKLWNvbnN0IGNoYXIgVm9sdW1lVHJhaXRzOjpBdHRyaWJ1dGVzOjpkZXZpY2VDYXRlZ29yeVtdID0gImRldmljZUNhdGVnb3J5IjsKLWNvbnN0IGNoYXIgVm9sdW1lVHJhaXRzOjpBdHRyaWJ1dGVzOjpyZWZlcmVuY2VbXSA9ICJyZWYiOwotCi1zdGF0dXNfdCBWb2x1bWVUcmFpdHM6OmRlc2VyaWFsaXplKF94bWxEb2MgKmRvYywgY29uc3QgX3htbE5vZGUgKnJvb3QsIFB0ckVsZW1lbnQgJmVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB0clNlcmlhbGl6aW5nQ3R4IC8qc2VyaWFsaXppbmdDb250ZXh0Ki8pCitSZXR1cm48Vm9sdW1lVHJhaXRzOjpFbGVtZW50PiBWb2x1bWVUcmFpdHM6OmRlc2VyaWFsaXplKGNvbnN0IHhtbE5vZGUgKmN1ciwKKyAgICAgICAgUHRyU2VyaWFsaXppbmdDdHggLypzZXJpYWxpemluZ0NvbnRleHQqLykKIHsKLSAgICBzdHJpbmcgc3RyZWFtVHlwZUxpdGVyYWwgPSBnZXRYbWxBdHRyaWJ1dGUocm9vdCwgQXR0cmlidXRlczo6c3RyZWFtKTsKKyAgICBzdGQ6OnN0cmluZyBzdHJlYW1UeXBlTGl0ZXJhbCA9IGdldFhtbEF0dHJpYnV0ZShjdXIsIEF0dHJpYnV0ZXM6OnN0cmVhbSk7CiAgICAgaWYgKHN0cmVhbVR5cGVMaXRlcmFsLmVtcHR5KCkpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBObyAlcyBmb3VuZCIsIF9fRlVOQ1RJT05fXywgQXR0cmlidXRlczo6c3RyZWFtKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgQUxPR0UoIiVzOiBObyAlcyBmb3VuZCIsIF9fZnVuY19fLCBBdHRyaWJ1dGVzOjpzdHJlYW0pOworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChCQURfVkFMVUUpOwogICAgIH0KICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGU7CiAgICAgaWYgKCFTdHJlYW1UeXBlQ29udmVydGVyOjpmcm9tU3RyaW5nKHN0cmVhbVR5cGVMaXRlcmFsLCBzdHJlYW1UeXBlKSkgewotICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgJXMiLCBfX0ZVTkNUSU9OX18sIEF0dHJpYnV0ZXM6OnN0cmVhbSk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCAlcyIsIF9fZnVuY19fLCBBdHRyaWJ1dGVzOjpzdHJlYW0pOworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChCQURfVkFMVUUpOwogICAgIH0KLSAgICBzdHJpbmcgZGV2aWNlQ2F0ZWdvcnlMaXRlcmFsID0gZ2V0WG1sQXR0cmlidXRlKHJvb3QsIEF0dHJpYnV0ZXM6OmRldmljZUNhdGVnb3J5KTsKKyAgICBzdGQ6OnN0cmluZyBkZXZpY2VDYXRlZ29yeUxpdGVyYWwgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCBBdHRyaWJ1dGVzOjpkZXZpY2VDYXRlZ29yeSk7CiAgICAgaWYgKGRldmljZUNhdGVnb3J5TGl0ZXJhbC5lbXB0eSgpKSB7Ci0gICAgICAgIEFMT0dFKCIlczogTm8gJXMgZm91bmQiLCBfX0ZVTkNUSU9OX18sIEF0dHJpYnV0ZXM6OmRldmljZUNhdGVnb3J5KTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgQUxPR0UoIiVzOiBObyAlcyBmb3VuZCIsIF9fZnVuY19fLCBBdHRyaWJ1dGVzOjpkZXZpY2VDYXRlZ29yeSk7CisgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKEJBRF9WQUxVRSk7CiAgICAgfQogICAgIGRldmljZV9jYXRlZ29yeSBkZXZpY2VDYXRlZ29yeTsKICAgICBpZiAoIURldmljZUNhdGVnb3J5Q29udmVydGVyOjpmcm9tU3RyaW5nKGRldmljZUNhdGVnb3J5TGl0ZXJhbCwgZGV2aWNlQ2F0ZWdvcnkpKSB7Ci0gICAgICAgIEFMT0dFKCIlczogSW52YWxpZCAlcz0lcyIsIF9fRlVOQ1RJT05fXywgQXR0cmlidXRlczo6ZGV2aWNlQ2F0ZWdvcnksCisgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCAlcz0lcyIsIF9fZnVuY19fLCBBdHRyaWJ1dGVzOjpkZXZpY2VDYXRlZ29yeSwKICAgICAgICAgICAgICAgZGV2aWNlQ2F0ZWdvcnlMaXRlcmFsLmNfc3RyKCkpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChCQURfVkFMVUUpOwogICAgIH0KIAotICAgIHN0cmluZyByZWZlcmVuY2VOYW1lID0gZ2V0WG1sQXR0cmlidXRlKHJvb3QsIEF0dHJpYnV0ZXM6OnJlZmVyZW5jZSk7Ci0gICAgY29uc3QgX3htbE5vZGUgKnJlZiA9IE5VTEw7CisgICAgc3RkOjpzdHJpbmcgcmVmZXJlbmNlTmFtZSA9IGdldFhtbEF0dHJpYnV0ZShjdXIsIEF0dHJpYnV0ZXM6OnJlZmVyZW5jZSk7CisgICAgY29uc3QgeG1sTm9kZSAqcmVmID0gTlVMTDsKICAgICBpZiAoIXJlZmVyZW5jZU5hbWUuZW1wdHkoKSkgewotICAgICAgICBnZXRSZWZlcmVuY2U8Vm9sdW1lVHJhaXRzPihyb290LT5wYXJlbnQsIHJlZiwgcmVmZXJlbmNlTmFtZSk7CisgICAgICAgIHJlZiA9IGdldFJlZmVyZW5jZTxWb2x1bWVUcmFpdHM+KGN1ci0+cGFyZW50LCByZWZlcmVuY2VOYW1lKTsKICAgICAgICAgaWYgKHJlZiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6IE5vIHJlZmVyZW5jZSBQdHIgZm91bmQgZm9yICVzIiwgX19GVU5DVElPTl9fLCByZWZlcmVuY2VOYW1lLmNfc3RyKCkpOwotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIEFMT0dFKCIlczogTm8gcmVmZXJlbmNlIFB0ciBmb3VuZCBmb3IgJXMiLCBfX2Z1bmNfXywgcmVmZXJlbmNlTmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKEJBRF9WQUxVRSk7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBlbGVtZW50ID0gbmV3IEVsZW1lbnQoZGV2aWNlQ2F0ZWdvcnksIHN0cmVhbVR5cGUpOworICAgIEVsZW1lbnQgdm9sQ3VydmUgPSBuZXcgVm9sdW1lQ3VydmUoZGV2aWNlQ2F0ZWdvcnksIHN0cmVhbVR5cGUpOwogCi0gICAgY29uc3QgeG1sTm9kZSAqY2hpbGQgPSByZWZlcmVuY2VOYW1lLmVtcHR5KCkgPyByb290LT54bWxDaGlsZHJlbk5vZGUgOiByZWYtPnhtbENoaWxkcmVuTm9kZTsKLSAgICB3aGlsZSAoY2hpbGQgIT0gTlVMTCkgewotICAgICAgICBpZiAoIXhtbFN0cmNtcChjaGlsZC0+bmFtZSwgKGNvbnN0IHhtbENoYXIgKil2b2x1bWVQb2ludFRhZykpIHsKLSAgICAgICAgICAgIHhtbENoYXIgKnBvaW50RGVmaW5pdGlvbiA9IHhtbE5vZGVMaXN0R2V0U3RyaW5nKGRvYywgY2hpbGQtPnhtbENoaWxkcmVuTm9kZSwgMSk7OwotICAgICAgICAgICAgaWYgKHBvaW50RGVmaW5pdGlvbiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICBmb3IgKGNvbnN0IHhtbE5vZGUgKmNoaWxkID0gcmVmZXJlbmNlTmFtZS5lbXB0eSgpID8gY3VyLT54bWxDaGlsZHJlbk5vZGUgOiByZWYtPnhtbENoaWxkcmVuTm9kZTsKKyAgICAgICAgIGNoaWxkICE9IE5VTEw7IGNoaWxkID0gY2hpbGQtPm5leHQpIHsKKyAgICAgICAgaWYgKCF4bWxTdHJjbXAoY2hpbGQtPm5hbWUsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgeG1sQ2hhcio+KHZvbHVtZVBvaW50VGFnKSkpIHsKKyAgICAgICAgICAgIGF1dG8gcG9pbnREZWZpbml0aW9uID0gbWFrZV94bWxVbmlxdWUoeG1sTm9kZUxpc3RHZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQtPmRvYywgY2hpbGQtPnhtbENoaWxkcmVuTm9kZSwgMSkpOworICAgICAgICAgICAgaWYgKHBvaW50RGVmaW5pdGlvbiA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QoQkFEX1ZBTFVFKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFMT0dWKCIlczogJXM9JXMiLCBfX0ZVTkNUSU9OX18sIHRhZywgKGNvbnN0IGNoYXIqKXBvaW50RGVmaW5pdGlvbik7CisgICAgICAgICAgICBBTE9HVigiJXM6ICVzPSVzIiwKKyAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHRhZywgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4ocG9pbnREZWZpbml0aW9uLmdldCgpKSk7CiAgICAgICAgICAgICBWZWN0b3I8aW50MzJfdD4gcG9pbnQ7Ci0gICAgICAgICAgICBjb2xsZWN0aW9uRnJvbVN0cmluZzxEZWZhdWx0VHJhaXRzPGludDMyX3Q+ID4oKGNvbnN0IGNoYXIqKXBvaW50RGVmaW5pdGlvbiwgcG9pbnQsICIsIik7CisgICAgICAgICAgICBjb2xsZWN0aW9uRnJvbVN0cmluZzxEZWZhdWx0VHJhaXRzPGludDMyX3Q+PigKKyAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4ocG9pbnREZWZpbml0aW9uLmdldCgpKSwgcG9pbnQsICIsIik7CiAgICAgICAgICAgICBpZiAocG9pbnQuc2l6ZSgpICE9IDIpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgJXM6ICVzIiwgX19GVU5DVElPTl9fLCB2b2x1bWVQb2ludFRhZywKLSAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgY2hhciopcG9pbnREZWZpbml0aW9uKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCAlczogJXMiLCBfX2Z1bmNfXywgdm9sdW1lUG9pbnRUYWcsCisgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihwb2ludERlZmluaXRpb24uZ2V0KCkpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChCQURfVkFMVUUpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxlbWVudC0+YWRkKEN1cnZlUG9pbnQocG9pbnRbMF0sIHBvaW50WzFdKSk7Ci0gICAgICAgICAgICB4bWxGcmVlKHBvaW50RGVmaW5pdGlvbik7CisgICAgICAgICAgICB2b2xDdXJ2ZS0+YWRkKEN1cnZlUG9pbnQocG9pbnRbMF0sIHBvaW50WzFdKSk7CiAgICAgICAgIH0KLSAgICAgICAgY2hpbGQgPSBjaGlsZC0+bmV4dDsKKyAgICB9CisgICAgcmV0dXJuIHZvbEN1cnZlOworfQorCitzdGF0dXNfdCBTdXJyb3VuZFNvdW5kVHJhaXRzOjpkZXNlcmlhbGl6ZShjb25zdCB4bWxOb2RlICpyb290LCBBdWRpb1BvbGljeUNvbmZpZyAqY29uZmlnKQoreworICAgIGNvbmZpZy0+c2V0RGVmYXVsdFN1cnJvdW5kRm9ybWF0cygpOworCisgICAgZm9yIChjb25zdCB4bWxOb2RlICpjdXIgPSByb290LT54bWxDaGlsZHJlbk5vZGU7IGN1ciAhPSBOVUxMOyBjdXIgPSBjdXItPm5leHQpIHsKKyAgICAgICAgaWYgKCF4bWxTdHJjbXAoY3VyLT5uYW1lLCByZWludGVycHJldF9jYXN0PGNvbnN0IHhtbENoYXIqPih0YWcpKSkgeworICAgICAgICAgICAgQXVkaW9Qb2xpY3lDb25maWc6OlN1cnJvdW5kRm9ybWF0cyBmb3JtYXRzOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGVzZXJpYWxpemVDb2xsZWN0aW9uPFN1cnJvdW5kU291bmRGb3JtYXRUcmFpdHM+KAorICAgICAgICAgICAgICAgICAgICBjdXIsICZmb3JtYXRzLCBudWxscHRyKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBjb25maWctPnNldFN1cnJvdW5kRm9ybWF0cyhmb3JtYXRzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLVBvbGljeVNlcmlhbGl6ZXI6OlBvbGljeVNlcmlhbGl6ZXIoKSA6IG1Sb290RWxlbWVudE5hbWUocm9vdE5hbWUpCitSZXR1cm48U3Vycm91bmRTb3VuZEZvcm1hdFRyYWl0czo6RWxlbWVudD4gU3Vycm91bmRTb3VuZEZvcm1hdFRyYWl0czo6ZGVzZXJpYWxpemUoCisgICAgICAgIGNvbnN0IHhtbE5vZGUgKmN1ciwgUHRyU2VyaWFsaXppbmdDdHggLypzZXJpYWxpemluZ0NvbnRleHQqLykKIHsKLSAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOwotICAgIG9zcyA8PCBnTWFqb3IgPDwgIi4iIDw8IGdNaW5vcjsKLSAgICBtVmVyc2lvbiA9IG9zcy5zdHIoKTsKLSAgICBBTE9HVigiJXM6IFZlcnNpb249JXMgUm9vdD0lcyIsIF9fRlVOQ1RJT05fXywgbVZlcnNpb24uY19zdHIoKSwgbVJvb3RFbGVtZW50TmFtZS5jX3N0cigpKTsKKyAgICBzdGQ6OnN0cmluZyBmb3JtYXRMaXRlcmFsID0gZ2V0WG1sQXR0cmlidXRlKGN1ciwgQXR0cmlidXRlczo6bmFtZSk7CisgICAgaWYgKGZvcm1hdExpdGVyYWwuZW1wdHkoKSkgeworICAgICAgICBBTE9HRSgiJXM6IE5vICVzIGZvdW5kIGZvciBhIHN1cnJvdW5kIGZvcm1hdCIsIF9fZnVuY19fLCBBdHRyaWJ1dGVzOjpuYW1lKTsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QoQkFEX1ZBTFVFKTsKKyAgICB9CisgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0ID0gZm9ybWF0RnJvbVN0cmluZyhmb3JtYXRMaXRlcmFsKTsKKyAgICBpZiAoZm9ybWF0ID09IEFVRElPX0ZPUk1BVF9ERUZBVUxUKSB7CisgICAgICAgIEFMT0dFKCIlczogVW5yZWNvZ25pemVkIGZvcm1hdCAlcyIsIF9fZnVuY19fLCBmb3JtYXRMaXRlcmFsLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChCQURfVkFMVUUpOworICAgIH0KKyAgICBFbGVtZW50IHBhaXIgPSBzdGQ6Om1ha2VfcGFpcihmb3JtYXQsIENvbGxlY3Rpb246Om1hcHBlZF90eXBle30pOworCisgICAgc3RkOjpzdHJpbmcgc3ViZm9ybWF0c0xpdGVyYWwgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCBBdHRyaWJ1dGVzOjpzdWJmb3JtYXRzKTsKKyAgICBpZiAoc3ViZm9ybWF0c0xpdGVyYWwuZW1wdHkoKSkgcmV0dXJuIHBhaXI7CisgICAgRm9ybWF0VmVjdG9yIHN1YmZvcm1hdHMgPSBmb3JtYXRzRnJvbVN0cmluZyhzdWJmb3JtYXRzTGl0ZXJhbCwgIiAiKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIHN1YmZvcm1hdCA6IHN1YmZvcm1hdHMpIHsKKyAgICAgICAgYXV0byByZXN1bHQgPSBwYWlyLnNlY29uZC5pbnNlcnQoc3ViZm9ybWF0KTsKKyAgICAgICAgaWYgKCFyZXN1bHQuc2Vjb25kKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IGNvdWxkIG5vdCBhZGQgc3ViZm9ybWF0ICV4IHRvIGNvbGxlY3Rpb24iLCBfX2Z1bmNfXywgc3ViZm9ybWF0KTsKKyAgICAgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKEJBRF9WQUxVRSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHBhaXI7CiB9CiAKLXN0YXR1c190IFBvbGljeVNlcmlhbGl6ZXI6OmRlc2VyaWFsaXplKGNvbnN0IGNoYXIgKmNvbmZpZ0ZpbGUsIEF1ZGlvUG9saWN5Q29uZmlnICZjb25maWcpCitzdGF0dXNfdCBQb2xpY3lTZXJpYWxpemVyOjpkZXNlcmlhbGl6ZShjb25zdCBjaGFyICpjb25maWdGaWxlLCBBdWRpb1BvbGljeUNvbmZpZyAqY29uZmlnKQogewotICAgIHhtbERvY1B0ciBkb2M7Ci0gICAgZG9jID0geG1sUGFyc2VGaWxlKGNvbmZpZ0ZpbGUpOwotICAgIGlmIChkb2MgPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgiJXM6IENvdWxkIG5vdCBwYXJzZSAlcyBkb2N1bWVudC4iLCBfX0ZVTkNUSU9OX18sIGNvbmZpZ0ZpbGUpOworICAgIGF1dG8gZG9jID0gbWFrZV94bWxVbmlxdWUoeG1sUGFyc2VGaWxlKGNvbmZpZ0ZpbGUpKTsKKyAgICBpZiAoZG9jID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDb3VsZCBub3QgcGFyc2UgJXMgZG9jdW1lbnQuIiwgX19mdW5jX18sIGNvbmZpZ0ZpbGUpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KLSAgICB4bWxOb2RlUHRyIGN1ciA9IHhtbERvY0dldFJvb3RFbGVtZW50KGRvYyk7Ci0gICAgaWYgKGN1ciA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCIlczogQ291bGQgbm90IHBhcnNlICVzIGRvY3VtZW50OiBlbXB0eS4iLCBfX0ZVTkNUSU9OX18sIGNvbmZpZ0ZpbGUpOwotICAgICAgICB4bWxGcmVlRG9jKGRvYyk7CisgICAgeG1sTm9kZVB0ciByb290ID0geG1sRG9jR2V0Um9vdEVsZW1lbnQoZG9jLmdldCgpKTsKKyAgICBpZiAocm9vdCA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIlczogQ291bGQgbm90IHBhcnNlICVzIGRvY3VtZW50OiBlbXB0eS4iLCBfX2Z1bmNfXywgY29uZmlnRmlsZSk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQotICAgIGlmICh4bWxYSW5jbHVkZVByb2Nlc3MoZG9jKSA8IDApIHsKLSAgICAgICAgIEFMT0dFKCIlczogbGlieG1sIGZhaWxlZCB0byByZXNvbHZlIFhJbmNsdWRlcyBvbiAlcyBkb2N1bWVudC4iLCBfX0ZVTkNUSU9OX18sIGNvbmZpZ0ZpbGUpOworICAgIGlmICh4bWxYSW5jbHVkZVByb2Nlc3MoZG9jLmdldCgpKSA8IDApIHsKKyAgICAgICAgQUxPR0UoIiVzOiBsaWJ4bWwgZmFpbGVkIHRvIHJlc29sdmUgWEluY2x1ZGVzIG9uICVzIGRvY3VtZW50LiIsIF9fZnVuY19fLCBjb25maWdGaWxlKTsKICAgICB9CiAKLSAgICBpZiAoeG1sU3RyY21wKGN1ci0+bmFtZSwgKGNvbnN0IHhtbENoYXIgKikgbVJvb3RFbGVtZW50TmFtZS5jX3N0cigpKSkgIHsKLSAgICAgICAgQUxPR0UoIiVzOiBObyAlcyByb290IGVsZW1lbnQgZm91bmQgaW4geG1sIGRhdGEgJXMuIiwgX19GVU5DVElPTl9fLCBtUm9vdEVsZW1lbnROYW1lLmNfc3RyKCksCi0gICAgICAgICAgICAgIChjb25zdCBjaGFyICopY3VyLT5uYW1lKTsKLSAgICAgICAgeG1sRnJlZURvYyhkb2MpOworICAgIGlmICh4bWxTdHJjbXAocm9vdC0+bmFtZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB4bWxDaGFyKj4ocm9vdE5hbWUpKSkgIHsKKyAgICAgICAgQUxPR0UoIiVzOiBObyAlcyByb290IGVsZW1lbnQgZm91bmQgaW4geG1sIGRhdGEgJXMuIiwgX19mdW5jX18sIHJvb3ROYW1lLAorICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHJvb3QtPm5hbWUpKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKLSAgICBzdHJpbmcgdmVyc2lvbiA9IGdldFhtbEF0dHJpYnV0ZShjdXIsIHZlcnNpb25BdHRyaWJ1dGUpOworICAgIHN0ZDo6c3RyaW5nIHZlcnNpb24gPSBnZXRYbWxBdHRyaWJ1dGUocm9vdCwgdmVyc2lvbkF0dHJpYnV0ZSk7CiAgICAgaWYgKHZlcnNpb24uZW1wdHkoKSkgewotICAgICAgICBBTE9HRSgiJXM6IE5vIHZlcnNpb24gZm91bmQgaW4gcm9vdCBub2RlICVzIiwgX19GVU5DVElPTl9fLCBtUm9vdEVsZW1lbnROYW1lLmNfc3RyKCkpOworICAgICAgICBBTE9HRSgiJXM6IE5vIHZlcnNpb24gZm91bmQgaW4gcm9vdCBub2RlICVzIiwgX19mdW5jX18sIHJvb3ROYW1lKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAgICAgaWYgKHZlcnNpb24gIT0gbVZlcnNpb24pIHsKLSAgICAgICAgQUxPR0UoIiVzOiBWZXJzaW9uIGRvZXMgbm90IG1hdGNoOyBleHBlY3QgJXMgZ290ICVzIiwgX19GVU5DVElPTl9fLCBtVmVyc2lvbi5jX3N0cigpLAorICAgICAgICBBTE9HRSgiJXM6IFZlcnNpb24gZG9lcyBub3QgbWF0Y2g7IGV4cGVjdCAlcyBnb3QgJXMiLCBfX2Z1bmNfXywgbVZlcnNpb24uY19zdHIoKSwKICAgICAgICAgICAgICAgdmVyc2lvbi5jX3N0cigpKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAgICAgLy8gTGV0cyBkZXNlcmlhbGl6ZSBjaGlsZHJlbgogICAgIC8vIE1vZHVsZXMKICAgICBNb2R1bGVUcmFpdHM6OkNvbGxlY3Rpb24gbW9kdWxlczsKLSAgICBkZXNlcmlhbGl6ZUNvbGxlY3Rpb248TW9kdWxlVHJhaXRzPihkb2MsIGN1ciwgbW9kdWxlcywgJmNvbmZpZyk7Ci0gICAgY29uZmlnLnNldEh3TW9kdWxlcyhtb2R1bGVzKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBkZXNlcmlhbGl6ZUNvbGxlY3Rpb248TW9kdWxlVHJhaXRzPihyb290LCAmbW9kdWxlcywgY29uZmlnKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIGNvbmZpZy0+c2V0SHdNb2R1bGVzKG1vZHVsZXMpOwogCiAgICAgLy8gZGVzZXJpYWxpemUgdm9sdW1lIHNlY3Rpb24KICAgICBWb2x1bWVUcmFpdHM6OkNvbGxlY3Rpb24gdm9sdW1lczsKLSAgICBkZXNlcmlhbGl6ZUNvbGxlY3Rpb248Vm9sdW1lVHJhaXRzPihkb2MsIGN1ciwgdm9sdW1lcywgJmNvbmZpZyk7Ci0gICAgY29uZmlnLnNldFZvbHVtZXModm9sdW1lcyk7CisgICAgc3RhdHVzID0gZGVzZXJpYWxpemVDb2xsZWN0aW9uPFZvbHVtZVRyYWl0cz4ocm9vdCwgJnZvbHVtZXMsIGNvbmZpZyk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICBjb25maWctPnNldFZvbHVtZXModm9sdW1lcyk7CiAKICAgICAvLyBHbG9iYWwgQ29uZmlndXJhdGlvbgotICAgIEdsb2JhbENvbmZpZ1RyYWl0czo6ZGVzZXJpYWxpemUoY3VyLCBjb25maWcpOworICAgIEdsb2JhbENvbmZpZ1RyYWl0czo6ZGVzZXJpYWxpemUocm9vdCwgY29uZmlnKTsKIAotICAgIHhtbEZyZWVEb2MoZG9jKTsKKyAgICAvLyBTdXJyb3VuZCBjb25maWd1cmF0aW9uCisgICAgU3Vycm91bmRTb3VuZFRyYWl0czo6ZGVzZXJpYWxpemUocm9vdCwgY29uZmlnKTsKKwogICAgIHJldHVybiBhbmRyb2lkOjpPSzsKIH0KIAorfSAgLy8gbmFtZXNwYWNlCisKK3N0YXR1c190IGRlc2VyaWFsaXplQXVkaW9Qb2xpY3lGaWxlKGNvbnN0IGNoYXIgKmZpbGVOYW1lLCBBdWRpb1BvbGljeUNvbmZpZyAqY29uZmlnKQoreworICAgIFBvbGljeVNlcmlhbGl6ZXIgc2VyaWFsaXplcjsKKyAgICByZXR1cm4gc2VyaWFsaXplci5kZXNlcmlhbGl6ZShmaWxlTmFtZSwgY29uZmlnKTsKK30KKwogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvU2Vzc2lvblJvdXRlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL1Nlc3Npb25Sb3V0ZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyMDY1MjYuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvU2Vzc2lvblJvdXRlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJBUE1fU2Vzc2lvblJvdXRlIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSAiU2Vzc2lvblJvdXRlLmgiCi0jaW5jbHVkZSAiSHdNb2R1bGUuaCIKLSNpbmNsdWRlICJBdWRpb0dhaW4uaCIKLSNpbmNsdWRlICJEZXZpY2VEZXNjcmlwdG9yLmgiCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gLS0tIFNlc3Npb25Sb3V0ZSBjbGFzcyBpbXBsZW1lbnRhdGlvbgotdm9pZCBTZXNzaW9uUm91dGU6OmxvZyhjb25zdCBjaGFyKiBwcmVmaXgpCi17Ci0gICAgQUxPR0koIiVzW1Nlc3Npb25Sb3V0ZSBzdHJtOjB4JVgsIHNyYzolZCwgc2VzczoweCVYLCBkZXY6MHglWCByZWZzOiVkIGFjdDolZCIsCi0gICAgICAgICAgcHJlZml4LCBtU3RyZWFtVHlwZSwgbVNvdXJjZSwgbVNlc3Npb24sCi0gICAgICAgICAgbURldmljZURlc2NyaXB0b3IgIT0gMCA/IG1EZXZpY2VEZXNjcmlwdG9yLT50eXBlKCkgOiBBVURJT19ERVZJQ0VfTk9ORSwKLSAgICAgICAgICBtUmVmQ291bnQsIG1BY3Rpdml0eUNvdW50KTsKLX0KLQotLy8gLS0tIFNlc3Npb25Sb3V0ZU1hcCBjbGFzcyBpbXBsZW1lbnRhdGlvbgotYm9vbCBTZXNzaW9uUm91dGVNYXA6Omhhc1JvdXRlKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQotewotICAgIHJldHVybiBpbmRleE9mS2V5KHNlc3Npb24pID49IDAgJiYgdmFsdWVGb3Ioc2Vzc2lvbiktPm1EZXZpY2VEZXNjcmlwdG9yICE9IDA7Ci19Ci0KLWJvb2wgU2Vzc2lvblJvdXRlTWFwOjpnZXRBbmRDbGVhclJvdXRlQ2hhbmdlZChhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKLXsKLSAgICBpZiAoaW5kZXhPZktleShzZXNzaW9uKSA+PSAwKSB7Ci0gICAgICAgIGlmICh2YWx1ZUZvcihzZXNzaW9uKS0+bUNoYW5nZWQpIHsKLSAgICAgICAgICAgIHZhbHVlRm9yKHNlc3Npb24pLT5tQ2hhbmdlZCA9IGZhbHNlOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi12b2lkIFNlc3Npb25Sb3V0ZU1hcDo6cmVtb3ZlUm91dGUoYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCi17Ci0gICAgc3A8U2Vzc2lvblJvdXRlPiByb3V0ZSA9IGluZGV4T2ZLZXkoc2Vzc2lvbikgPj0gMCA/IHZhbHVlRm9yKHNlc3Npb24pIDogMDsKLSAgICBpZiAocm91dGUgIT0gMCkgewotICAgICAgICBBTE9HX0FTU0VSVChyb3V0ZS0+bVJlZkNvdW50ID4gMCk7Ci0gICAgICAgIC0tcm91dGUtPm1SZWZDb3VudDsKLSAgICAgICAgaWYgKHJvdXRlLT5tUmVmQ291bnQgPD0gMCkgewotICAgICAgICAgICAgcmVtb3ZlSXRlbShzZXNzaW9uKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotaW50IFNlc3Npb25Sb3V0ZU1hcDo6aW5jUm91dGVBY3Rpdml0eShhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKLXsKLSAgICBzcDxTZXNzaW9uUm91dGU+IHJvdXRlID0gaW5kZXhPZktleShzZXNzaW9uKSA+PSAwID8gdmFsdWVGb3Ioc2Vzc2lvbikgOiAwOwotICAgIHJldHVybiByb3V0ZSAhPSAwID8gKysocm91dGUtPm1BY3Rpdml0eUNvdW50KSA6IC0xOwotfQotCi1pbnQgU2Vzc2lvblJvdXRlTWFwOjpkZWNSb3V0ZUFjdGl2aXR5KGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQotewotICAgIHNwPFNlc3Npb25Sb3V0ZT4gcm91dGUgPSBpbmRleE9mS2V5KHNlc3Npb24pID49IDAgPyB2YWx1ZUZvcihzZXNzaW9uKSA6IDA7Ci0gICAgaWYgKHJvdXRlICE9IDAgJiYgcm91dGUtPm1BY3Rpdml0eUNvdW50ID4gMCkgewotICAgICAgICByZXR1cm4gLS0ocm91dGUtPm1BY3Rpdml0eUNvdW50KTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotfQotCi12b2lkIFNlc3Npb25Sb3V0ZU1hcDo6bG9nKGNvbnN0IGNoYXIqIGNhcHRpb24pCi17Ci0gICAgQUxPR0koIiVzIC0tLS0iLCBjYXB0aW9uKTsKLSAgICBmb3IgKHNpemVfdCBpbmRleCA9IDA7IGluZGV4IDwgc2l6ZSgpOyBpbmRleCsrKSB7Ci0gICAgICAgIHZhbHVlQXQoaW5kZXgpLT5sb2coIiAgIik7Ci0gICAgfQotfQotCi12b2lkIFNlc3Npb25Sb3V0ZU1hcDo6YWRkUm91dGUoYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgZGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQpCi17Ci0gICAgaWYgKG1NYXBUeXBlID09IE1BUFRZUEVfSU5QVVQgJiYgc3RyZWFtVHlwZSAhPSBTZXNzaW9uUm91dGU6OlNUUkVBTV9UWVBFX05BKSB7Ci0gICAgICAgIEFMT0dFKCJBZGRpbmcgT3V0cHV0IFJvdXRlIHRvIElucHV0Um91dGVNYXAiKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0gZWxzZSBpZiAobU1hcFR5cGUgPT0gTUFQVFlQRV9PVVRQVVQgJiYgc291cmNlICE9IFNlc3Npb25Sb3V0ZTo6U09VUkNFX1RZUEVfTkEpIHsKLSAgICAgICAgQUxPR0UoIkFkZGluZyBJbnB1dCBSb3V0ZSB0byBPdXRwdXRSb3V0ZU1hcCIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgc3A8U2Vzc2lvblJvdXRlPiByb3V0ZSA9IGluZGV4T2ZLZXkoc2Vzc2lvbikgPj0gMCA/IHZhbHVlRm9yKHNlc3Npb24pIDogMDsKLQotICAgIGlmIChyb3V0ZSAhPSAwKSB7Ci0gICAgICAgIGlmIChkZXNjcmlwdG9yICE9IDAgfHwgcm91dGUtPm1EZXZpY2VEZXNjcmlwdG9yICE9IDApIHsKLSAgICAgICAgICAgIHJvdXRlLT5tQ2hhbmdlZCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcm91dGUtPm1SZWZDb3VudCsrOwotICAgICAgICByb3V0ZS0+bURldmljZURlc2NyaXB0b3IgPSBkZXNjcmlwdG9yOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJvdXRlID0gbmV3IFNlc3Npb25Sb3V0ZShzZXNzaW9uLCBzdHJlYW1UeXBlLCBzb3VyY2UsIGRlc2NyaXB0b3IsIHVpZCk7Ci0gICAgICAgIHJvdXRlLT5tUmVmQ291bnQrKzsKLSAgICAgICAgaWYgKGRlc2NyaXB0b3IgIT0gMCkgewotICAgICAgICAgICAgcm91dGUtPm1DaGFuZ2VkID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBhZGQoc2Vzc2lvbiwgcm91dGUpOwotICAgIH0KLX0KLQotYXVkaW9fZGV2aWNlc190IFNlc3Npb25Sb3V0ZU1hcDo6Z2V0QWN0aXZlRGV2aWNlRm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3ImIGF2YWlsYWJsZURldmljZXMpCi17Ci0gICAgZm9yIChzaXplX3QgaW5kZXggPSAwOyBpbmRleCA8IHNpemUoKTsgaW5kZXgrKykgewotICAgICAgICBzcDxTZXNzaW9uUm91dGU+IHJvdXRlID0gdmFsdWVBdChpbmRleCk7Ci0gICAgICAgIGlmIChzdHJlYW1UeXBlID09IHJvdXRlLT5tU3RyZWFtVHlwZSAmJiByb3V0ZS0+aXNBY3RpdmVPckNoYW5nZWQoKQotICAgICAgICAgICAgICAgICYmIHJvdXRlLT5tRGV2aWNlRGVzY3JpcHRvciAhPSAwKSB7Ci0gICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gcm91dGUtPm1EZXZpY2VEZXNjcmlwdG9yLT50eXBlKCk7Ci0gICAgICAgICAgICBpZiAoIWF2YWlsYWJsZURldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKGRldmljZSkuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGRldmljZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gQVVESU9fREVWSUNFX05PTkU7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL1N0cmVhbURlc2NyaXB0b3IuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvU3RyZWFtRGVzY3JpcHRvci5jcHAKaW5kZXggNjU2NDlmYi4uYzMxMWE0ZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvU3RyZWFtRGVzY3JpcHRvci5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvU3RyZWFtRGVzY3JpcHRvci5jcHAKQEAgLTc5LDI0ICs3OSwxNiBAQAogICAgIG1Wb2x1bWVDdXJ2ZVtkZXZpY2VDYXRlZ29yeV0gPSBwb2ludDsKIH0KIAotdm9pZCBTdHJlYW1EZXNjcmlwdG9yOjpkdW1wKGludCBmZCkgY29uc3QKK3ZvaWQgU3RyZWFtRGVzY3JpcHRvcjo6ZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0CiB7Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0gICAgU3RyaW5nOCByZXN1bHQ7Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlcyAgICAgICAgICUwMmQgICAgICAgICAlMDJkICAgICAgICAgIiwKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJXMgICAgICAgICAlMDJkICAgICAgICAgJTAyZCAgICAgICAgICIsCiAgICAgICAgICAgICAgbUNhbkJlTXV0ZWQgPyAidHJ1ZSAiIDogImZhbHNlIiwgbUluZGV4TWluLCBtSW5kZXhNYXgpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JbmRleEN1ci5zaXplKCk7IGkrKykgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlMDR4IDogJTAyZCwgIiwKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUwNHggOiAlMDJkLCAiLAogICAgICAgICAgICAgICAgICBtSW5kZXhDdXIua2V5QXQoaSksCiAgICAgICAgICAgICAgICAgIG1JbmRleEN1ci52YWx1ZUF0KGkpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwogICAgIH0KLSAgICByZXN1bHQuYXBwZW5kKCJcbiIpOwotCi0gICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CisgICAgZHN0LT5hcHBlbmQoIlxuIik7CiB9CiAKIFN0cmVhbURlc2NyaXB0b3JDb2xsZWN0aW9uOjpTdHJlYW1EZXNjcmlwdG9yQ29sbGVjdGlvbigpCkBAIC0yMDQsMjMgKzE5NiwxNSBAQAogICAgIH0KIH0KIAotc3RhdHVzX3QgU3RyZWFtRGVzY3JpcHRvckNvbGxlY3Rpb246OmR1bXAoaW50IGZkKSBjb25zdAordm9pZCBTdHJlYW1EZXNjcmlwdG9yQ29sbGVjdGlvbjo6ZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0CiB7Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcblN0cmVhbXMgZHVtcDpcbiIpOwotICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsCisgICAgZHN0LT5hcHBlbmQoIlxuU3RyZWFtcyBkdW1wOlxuIik7CisgICAgZHN0LT5hcHBlbmQoCiAgICAgICAgICAgICAgIiBTdHJlYW0gIENhbiBiZSBtdXRlZCAgSW5kZXggTWluICBJbmRleCBNYXggIEluZGV4IEN1ciBbZGV2aWNlIDogaW5kZXhdLi4uXG4iKTsKLSAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgJTAyenUgICAgICAiLCBpKTsKLSAgICAgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwotICAgICAgICB2YWx1ZUF0KGkpLmR1bXAoZmQpOworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiICUwMnp1ICAgICAgIiwgaSk7CisgICAgICAgIHZhbHVlQXQoaSkuZHVtcChkc3QpOwogICAgIH0KLQotICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvVm9sdW1lQ3VydmUuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvVm9sdW1lQ3VydmUuY3BwCmluZGV4IGFjM2YxYmMuLjYyMGYzNjEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL1ZvbHVtZUN1cnZlLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9Wb2x1bWVDdXJ2ZS5jcHAKQEAgLTY4LDgxICs2OCw1NiBAQAogICAgIHJldHVybiBkZWNpYmVsczsKIH0KIAotdm9pZCBWb2x1bWVDdXJ2ZTo6ZHVtcChpbnQgZmQpIGNvbnN0Cit2b2lkIFZvbHVtZUN1cnZlOjpkdW1wKFN0cmluZzggKmRzdCkgY29uc3QKIHsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLSAgICBTdHJpbmc4IHJlc3VsdDsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgeyIpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBkc3QtPmFwcGVuZCgiIHsiKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1DdXJ2ZVBvaW50cy5zaXplKCk7IGkrKykgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIoJTNkLCAlNWQpIiwKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiglM2QsICU1ZCkiLAogICAgICAgICAgICAgICAgICBtQ3VydmVQb2ludHNbaV0ubUluZGV4LCBtQ3VydmVQb2ludHNbaV0ubUF0dGVudWF0aW9uSW5NYik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChpID09IChtQ3VydmVQb2ludHMuc2l6ZSgpIC0gMSkgPyAiIH1cbiIgOiAiLCAiKTsKKyAgICAgICAgZHN0LT5hcHBlbmQoaSA9PSAobUN1cnZlUG9pbnRzLnNpemUoKSAtIDEpID8gIiB9XG4iIDogIiwgIik7CiAgICAgfQotICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwogfQogCi12b2lkIFZvbHVtZUN1cnZlc0ZvclN0cmVhbTo6ZHVtcChpbnQgZmQsIGludCBzcGFjZXMgPSAwLCBib29sIGN1cnZlUG9pbnRzKSBjb25zdAordm9pZCBWb2x1bWVDdXJ2ZXNGb3JTdHJlYW06OmR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzID0gMCwgYm9vbCBjdXJ2ZVBvaW50cykgY29uc3QKIHsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLSAgICBTdHJpbmc4IHJlc3VsdDsKLQogICAgIGlmICghY3VydmVQb2ludHMpIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJXMgICAgICAgICAlMDJkICAgICAgICAgJTAyZCAgICAgICAgICIsCisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlcyAgICAgICAgICUwMmQgICAgICAgICAlMDJkICAgICAgICAgIiwKICAgICAgICAgICAgICAgICAgbUNhbkJlTXV0ZWQgPyAidHJ1ZSAiIDogImZhbHNlIiwgbUluZGV4TWluLCBtSW5kZXhNYXgpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUluZGV4Q3VyLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlMDR4IDogJTAyZCwgIiwgbUluZGV4Q3VyLmtleUF0KGkpLCBtSW5kZXhDdXIudmFsdWVBdChpKSk7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJTA0eCA6ICUwMmQsICIsIG1JbmRleEN1ci5rZXlBdChpKSwgbUluZGV4Q3VyLnZhbHVlQXQoaSkpOwogICAgICAgICB9Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIlxuIik7Ci0gICAgICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOworICAgICAgICBkc3QtPmFwcGVuZCgiXG4iKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKICAgICAgICAgc3RkOjpzdHJpbmcgZGV2aWNlQ2F0TGl0ZXJhbDsKICAgICAgICAgRGV2aWNlQ2F0ZWdvcnlDb252ZXJ0ZXI6OnRvU3RyaW5nKGtleUF0KGkpLCBkZXZpY2VDYXRMaXRlcmFsKTsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzICVzIDoiLAorICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzICVzIDoiLAogICAgICAgICAgICAgICAgICBzcGFjZXMsICIiLCBkZXZpY2VDYXRMaXRlcmFsLmNfc3RyKCkpOwotICAgICAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7Ci0gICAgICAgIHZhbHVlQXQoaSktPmR1bXAoZmQpOworICAgICAgICB2YWx1ZUF0KGkpLT5kdW1wKGRzdCk7CiAgICAgfQotICAgIHJlc3VsdC5hcHBlbmQoIlxuIik7Ci0gICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CisgICAgZHN0LT5hcHBlbmQoIlxuIik7CiB9CiAKLXN0YXR1c190IFZvbHVtZUN1cnZlc0NvbGxlY3Rpb246OmR1bXAoaW50IGZkKSBjb25zdAordm9pZCBWb2x1bWVDdXJ2ZXNDb2xsZWN0aW9uOjpkdW1wKFN0cmluZzggKmRzdCkgY29uc3QKIHsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlxuU3RyZWFtcyBkdW1wOlxuIik7Ci0gICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwKKyAgICBkc3QtPmFwcGVuZCgiXG5TdHJlYW1zIGR1bXA6XG4iKTsKKyAgICBkc3QtPmFwcGVuZCgKICAgICAgICAgICAgICAiIFN0cmVhbSAgQ2FuIGJlIG11dGVkICBJbmRleCBNaW4gIEluZGV4IE1heCAgSW5kZXggQ3VyIFtkZXZpY2UgOiBpbmRleF0uLi5cbiIpOwotICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAlMDJ6dSAgICAgICIsIGkpOwotICAgICAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7Ci0gICAgICAgIHZhbHVlQXQoaSkuZHVtcChmZCk7CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgJTAyenUgICAgICAiLCBpKTsKKyAgICAgICAgdmFsdWVBdChpKS5kdW1wKGRzdCk7CiAgICAgfQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlxuVm9sdW1lIEN1cnZlcyBmb3IgVXNlIENhc2VzIChha2EgU3RyZWFtIHR5cGVzKSBkdW1wOlxuIik7Ci0gICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOworICAgIGRzdC0+YXBwZW5kKCJcblZvbHVtZSBDdXJ2ZXMgZm9yIFVzZSBDYXNlcyAoYWthIFN0cmVhbSB0eXBlcykgZHVtcDpcbiIpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKICAgICAgICAgc3RkOjpzdHJpbmcgc3RyZWFtVHlwZUxpdGVyYWw7CiAgICAgICAgIFN0cmVhbVR5cGVDb252ZXJ0ZXI6OnRvU3RyaW5nKGtleUF0KGkpLCBzdHJlYW1UeXBlTGl0ZXJhbCk7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoCiAgICAgICAgICAgICAgICAgICIgJXMgKCUwMnp1KTogQ3VydmUgcG9pbnRzIGZvciBkZXZpY2UgY2F0ZWdvcnkgKGluZGV4LCBhdHRlbnVhdGlvbiBpbiBtaWxsaWJlbClcbiIsCiAgICAgICAgICAgICAgICAgIHN0cmVhbVR5cGVMaXRlcmFsLmNfc3RyKCksIGkpOwotICAgICAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7Ci0gICAgICAgIHZhbHVlQXQoaSkuZHVtcChmZCwgMiwgdHJ1ZSk7CisgICAgICAgIHZhbHVlQXQoaSkuZHVtcChkc3QsIDIsIHRydWUpOwogICAgIH0KLQotICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwKaW5kZXggYTc1ZjFjYi4uMWQwMzdjMyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sCkBAIC0xODUsNiArMTg1LDkgQEAKICAgICAgICAgPCEtLSBIZWFyaW5nIGFpZCBBdWRpbyBIQUwgLS0+CiAgICAgICAgIDx4aTppbmNsdWRlIGhyZWY9ImhlYXJpbmdfYWlkX2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbCIvPgogCisgICAgICAgIDwhLS0gTVNEIEF1ZGlvIEhBTCAob3B0aW9uYWwpIC0tPgorICAgICAgICA8eGk6aW5jbHVkZSBocmVmPSJtc2RfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sIi8+CisKICAgICA8L21vZHVsZXM+CiAgICAgPCEtLSBFbmQgb2YgTW9kdWxlcyBzZWN0aW9uIC0tPgogCkBAIC0xOTUsNCArMTk4LDI2IEBACiAKICAgICA8IS0tIEVuZCBvZiBWb2x1bWUgc2VjdGlvbiAtLT4KIAorICAgIDw/ZGlzYWJsZWRVbnRpbEhhbFY0XzEKKyAgICA8IS0tIFN1cnJvdW5kIGNvbmZpZ3VyYXRpb24gLS0+CisKKyAgICA8c3Vycm91bmRTb3VuZD4KKyAgICAgIDwhLS0gRWFjaCBvZiB0aGUgbGlzdGVkIGZvcm1hdHMgZ2V0cyBhbiBlbnRyeSBpbiBTdXJyb3VuZCBTZXR0aW5ncyBkaWFsb2cuCisgICAgICAgICAgIFRoZXJlIG11c3QgYmUgYSBjb3JyZXNwb25kaW5nIEphdmEgRU5DT0RJTkdfLi4uIGNvbnRhbnQgZGVmaW5lZCBpbiBBdWRpb0Zvcm1hdC5qYXZhLAorICAgICAgICAgICBhbmQgYSBkaXNwbGF5IG5hbWUgZGVmaW5lZCBpbiBBdWRpb0Zvcm1hdC50b0Rpc3BsYXlOYW1lLiBGb3IgdGhlIGZvcm1hdHMgdGhhdCBkb24ndAorICAgICAgICAgICBuZWVkIGEgZGVkaWNhdGVkIFN1cnJvbmQgU2V0dGluZ3MgZGlhbG9nIGVudHJ5LCBhIHN1YmZvcm1hdHMgbGlzdCBzaG91bGQgYmUgdXNlZC4gLS0+CisgICAgICA8Zm9ybWF0cz4KKyAgICAgICAgPGZvcm1hdCBuYW1lPSJBVURJT19GT1JNQVRfQUMzIiAvPgorICAgICAgICA8Zm9ybWF0IG5hbWU9IkFVRElPX0ZPUk1BVF9FX0FDMyIgLz4KKyAgICAgICAgPGZvcm1hdCBuYW1lPSJBVURJT19GT1JNQVRfRV9BQzNfSk9DIiAvPgorICAgICAgICA8Zm9ybWF0IG5hbWU9IkFVRElPX0ZPUk1BVF9ET0xCWV9UUlVFSEQiIC8+CisgICAgICAgIDxmb3JtYXQgbmFtZT0iQVVESU9fRk9STUFUX0RUUyIgLz4KKyAgICAgICAgPGZvcm1hdCBuYW1lPSJBVURJT19GT1JNQVRfRFRTX0hEIiAvPgorICAgICAgICA8Zm9ybWF0IG5hbWU9IkFVRElPX0ZPUk1BVF9BQUNfTEMiIHN1YmZvcm1hdHM9IkFVRElPX0ZPUk1BVF9BQUNfSEVfVjEgQVVESU9fRk9STUFUX0FBQ19IRV9WMiBBVURJT19GT1JNQVRfQUFDX0VMRCBBVURJT19GT1JNQVRfQUFDX1hIRSIgLz4KKyAgICAgIDwvZm9ybWF0cz4KKyAgICA8L3N1cnJvdW5kU291bmQ+CisKKyAgICA8IS0tIEVuZCBvZiBTdXJyb3VuZCBjb25maWd1cmF0aW9uIC0tPgorICAgID8+CisKIDwvYXVkaW9Qb2xpY3lDb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL21zZF9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvbXNkX2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODExZjVlCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL21zZF9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwKQEAgLTAsMCArMSw2MyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE3LTIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPCEtLSBNdWx0aSBTdHJlYW0gRGVjb2RlciBBdWRpbyBQb2xpY3kgQ29uZmlndXJhdGlvbiBmaWxlIC0tPgorPG1vZHVsZSBuYW1lPSJtc2QiIGhhbFZlcnNpb249IjIuMCI+CisgICAgPGF0dGFjaGVkRGV2aWNlcz4KKyAgICAgICAgPGl0ZW0+TVMxMiBJbnB1dDwvaXRlbT4KKyAgICAgICAgPGl0ZW0+TVMxMiBPdXRwdXQ8L2l0ZW0+CisgICAgPC9hdHRhY2hlZERldmljZXM+CisgICAgPG1peFBvcnRzPgorICAgICAgICA8bWl4UG9ydCBuYW1lPSJtczEyIGlucHV0IiByb2xlPSJzb3VyY2UiPgorICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIgorICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iNDgwMDAiIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIi8+CisgICAgICAgIDwvbWl4UG9ydD4KKyAgICAgICAgPG1peFBvcnQgbmFtZT0ibXMxMiBjb21wcmVzc2VkIGlucHV0IiByb2xlPSJzb3VyY2UiCisgICAgICAgICAgICAgICAgZmxhZ3M9IkFVRElPX09VVFBVVF9GTEFHX0RJUkVDVHxBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEfEFVRElPX09VVFBVVF9GTEFHX05PTl9CTE9DS0lORyI+CisgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX0FDMyIKKyAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjMyMDAwLDQ0MTAwLDQ4MDAwIgorICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX09VVF9NT05PLEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyxBVURJT19DSEFOTkVMX09VVF81UE9JTlQxIi8+CisgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX0VfQUMzIgorICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iMzIwMDAsNDQxMDAsNDgwMDAiCisgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfT1VUX01PTk8sQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPLEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDEsQVVESU9fQ0hBTk5FTF9PVVRfN1BPSU5UMSIvPgorICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9BQzQiCisgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSIzMjAwMCw0NDEwMCw0ODAwMCIKKyAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfTU9OTyxBVURJT19DSEFOTkVMX09VVF9TVEVSRU8sQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMSxBVURJT19DSEFOTkVMX09VVF83UE9JTlQxIi8+CisgICAgICAgIDwvbWl4UG9ydD4KKyAgICAgICAgPCEtLSBUaGUgSFcgQVYgU3luYyBmbGFnIGlzIG5vdCByZXF1aXJlZCwgYnV0IGlzIHJlY29tbWVuZGVkIC0tPgorICAgICAgICA8bWl4UG9ydCBuYW1lPSJtczEyIG91dHB1dCIgcm9sZT0ic2luayIgZmxhZ3M9IkFVRElPX0lOUFVUX0ZMQUdfSFdfQVZfU1lOQyI+CisgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX1BDTV8xNl9CSVQiCisgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSI0ODAwMCIgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX0lOX1NURVJFTyIvPgorICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9BQzMiCisgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSI0ODAwMCIgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX0lOXzVQT0lOVDEiLz4KKyAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfRV9BQzMiCisgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSI0ODAwMCIgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX0lOXzVQT0lOVDEiLz4KKyAgICAgICAgPC9taXhQb3J0PgorICAgPC9taXhQb3J0cz4KKyAgIDxkZXZpY2VQb3J0cz4KKyAgICAgICA8ZGV2aWNlUG9ydCB0YWdOYW1lPSJNUzEyIElucHV0IiB0eXBlPSJBVURJT19ERVZJQ0VfT1VUX0JVUyIgIHJvbGU9InNpbmsiPgorICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX1BDTV8xNl9CSVQiCisgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjQ4MDAwIiBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyIvPgorICAgICAgIDwvZGV2aWNlUG9ydD4KKyAgICAgICA8ZGV2aWNlUG9ydCB0YWdOYW1lPSJNUzEyIE91dHB1dCIgdHlwZT0iQVVESU9fREVWSUNFX0lOX0JVUyIgIHJvbGU9InNvdXJjZSI+CisgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzE2X0JJVCIKKyAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iNDgwMDAiIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9JTl9TVEVSRU8iLz4KKyAgICAgICAgPC9kZXZpY2VQb3J0PgorICAgIDwvZGV2aWNlUG9ydHM+CisgICAgPHJvdXRlcz4KKyAgICAgICAgPHJvdXRlIHR5cGU9Im1peCIgc2luaz0iTVMxMiBJbnB1dCIgc291cmNlcz0ibXMxMiBpbnB1dCxtczEyIGNvbXByZXNzZWQgaW5wdXQiLz4KKyAgICAgICAgPHJvdXRlIHR5cGU9Im1peCIgc2luaz0ibXMxMiBvdXRwdXQiIHNvdXJjZXM9Ik1TMTIgT3V0cHV0Ii8+CisgICAgPC9yb3V0ZXM+Cis8L21vZHVsZT4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS93cmFwcGVyL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvd3JhcHBlci9BbmRyb2lkLm1rCmluZGV4IDM2ZTBmNDIuLmIxMjhhMzggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS93cmFwcGVyL0FuZHJvaWQubWsKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3dyYXBwZXIvQW5kcm9pZC5tawpAQCAtMTAsNyArMTAsNiBAQAogICAgICQoTE9DQUxfUEFUSCkvaW5jbHVkZSBcCiAgICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvaW5jbHVkZSBcCiAgICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvaW50ZXJmYWNlIFwKLSAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L3V0aWxpdGllcy9jb252ZXJ0IFwKIAogTE9DQUxfU1JDX0ZJTEVTOj0gUGFyYW1ldGVyTWFuYWdlcldyYXBwZXIuY3BwCiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvc3JjL0VuZ2luZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L3NyYy9FbmdpbmUuY3BwCmluZGV4IGU4NmFlNWYuLjY5Mzk1ZjMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvc3JjL0VuZ2luZS5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9zcmMvRW5naW5lLmNwcApAQCAtMzE1LDcgKzMxNSw3IEBACiAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgdHhEZXZpY2UgPSBnZXREZXZpY2VGb3JJbnB1dFNvdXJjZShBVURJT19TT1VSQ0VfVk9JQ0VfQ09NTVVOSUNBVElPTik7CiAgICAgICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IHByaW1hcnlPdXRwdXQgPSBvdXRwdXRzLmdldFByaW1hcnlPdXRwdXQoKTsKICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBhdmFpbFByaW1hcnlJbnB1dERldmljZXMgPQotICAgICAgICAgICAgICAgICBhdmFpbGFibGVJbnB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21Id01vZHVsZShwcmltYXJ5T3V0cHV0LT5nZXRNb2R1bGVIYW5kbGUoKSk7CisgICAgICAgICAgICAgICAgIGF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2VUeXBlc0Zyb21Id01vZHVsZShwcmltYXJ5T3V0cHV0LT5nZXRNb2R1bGVIYW5kbGUoKSk7CiAKICAgICAgICAgICAgIC8vIFRPRE86IGdldFByaW1hcnlPdXRwdXQgcmV0dXJuIG9ubHkgZGV2aWNlcyBmcm9tIGZpcnN0IG1vZHVsZSBpbgogICAgICAgICAgICAgLy8gYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sLCBoZWFyaW5nIGFpZCBpcyBub3QgdGhlcmUsIGJ1dCBpdCdzCkBAIC00MTAsOCArNDEwLDcgQEAKIAogICAgIGNhc2UgU1RSQVRFR1lfU09OSUZJQ0FUSU9OOgogCi0gICAgICAgIC8vIElmIGluY2FsbCwganVzdCBzZWxlY3QgdGhlIFNUUkFURUdZX1BIT05FIGRldmljZTogVGhlIHJlc3Qgb2YgdGhlIGJlaGF2aW9yIGlzIGhhbmRsZWQgYnkKLSAgICAgICAgLy8gaGFuZGxlSW5jYWxsU29uaWZpY2F0aW9uKCkuCisgICAgICAgIC8vIElmIGluY2FsbCwganVzdCBzZWxlY3QgdGhlIFNUUkFURUdZX1BIT05FIGRldmljZQogICAgICAgICBpZiAoaXNJbkNhbGwoKSB8fCBvdXRwdXRzLmlzU3RyZWFtQWN0aXZlTG9jYWxseShBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCkpIHsKICAgICAgICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5SW50KAogICAgICAgICAgICAgICAgICAgICBTVFJBVEVHWV9QSE9ORSwgYXZhaWxhYmxlT3V0cHV0RGV2aWNlcywgYXZhaWxhYmxlSW5wdXREZXZpY2VzLCBvdXRwdXRzLApAQCAtNDg0LDcgKzQ4Myw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgYXZhaWxhYmxlT3V0cHV0RGV2aWNlcyA9Ci0gICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKGF2YWlsYWJsZU91dHB1dERldmljZXNUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGVNYXNrKGF2YWlsYWJsZU91dHB1dERldmljZXNUeXBlKTsKICAgICAgICAgICAgIGlmIChvdXRwdXRzLmlzU3RyZWFtQWN0aXZlKEFVRElPX1NUUkVBTV9SSU5HKSB8fAogICAgICAgICAgICAgICAgICAgICBvdXRwdXRzLmlzU3RyZWFtQWN0aXZlKEFVRElPX1NUUkVBTV9BTEFSTSkpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0RGV2aWNlRm9yU3RyYXRlZ3lJbnQoCkBAIC02NzEsOSArNjcwLDggQEAKICAgICAgICAgaWYgKChnZXRQaG9uZVN0YXRlKCkgPT0gQVVESU9fTU9ERV9JTl9DQUxMKSAmJgogICAgICAgICAgICAgICAgIChhdmFpbGFibGVPdXRwdXREZXZpY2VzLnR5cGVzKCkgJiBBVURJT19ERVZJQ0VfT1VUX1RFTEVQSE9OWV9UWCkgPT0gMCkgewogICAgICAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBwcmltYXJ5T3V0cHV0ID0gb3V0cHV0cy5nZXRQcmltYXJ5T3V0cHV0KCk7Ci0gICAgICAgICAgICBhdmFpbGFibGVEZXZpY2VUeXBlcyA9Ci0gICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbUh3TW9kdWxlKHByaW1hcnlPdXRwdXQtPmdldE1vZHVsZUhhbmRsZSgpKQotICAgICAgICAgICAgICAgICAgICAmIH5BVURJT19ERVZJQ0VfQklUX0lOOworICAgICAgICAgICAgYXZhaWxhYmxlRGV2aWNlVHlwZXMgPSBhdmFpbGFibGVJbnB1dERldmljZXMuZ2V0RGV2aWNlVHlwZXNGcm9tSHdNb2R1bGUoCisgICAgICAgICAgICAgICAgICAgIHByaW1hcnlPdXRwdXQtPmdldE1vZHVsZUhhbmRsZSgpKSAmIH5BVURJT19ERVZJQ0VfQklUX0lOOwogICAgICAgICB9CiAKICAgICAgICAgc3dpdGNoIChtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9DT01NVU5JQ0FUSU9OXSkgewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvbWFuYWdlcmRlZmF1bHQvQXVkaW9Qb2xpY3lNYW5hZ2VyLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L21hbmFnZXJkZWZhdWx0L0F1ZGlvUG9saWN5TWFuYWdlci5jcHAKaW5kZXggYjVkOTk2My4uZDExODQ1OSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvbWFuYWdlcmRlZmF1bHQvQXVkaW9Qb2xpY3lNYW5hZ2VyLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9tYW5hZ2VyZGVmYXVsdC9BdWRpb1BvbGljeU1hbmFnZXIuY3BwCkBAIC0zMSw2ICszMSw3IEBACiAKICNpbmNsdWRlIDxpbnR0eXBlcy5oPgogI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDx2ZWN0b3I+CiAKICNpbmNsdWRlIDxBdWRpb1BvbGljeU1hbmFnZXJJbnRlcmZhY2UuaD4KICNpbmNsdWRlIDxBdWRpb1BvbGljeUVuZ2luZUluc3RhbmNlLmg+CkBAIC0zOCw2ICszOSw3IEBACiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9QYXJhbWV0ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1BvbGljeUhlbHBlci5oPgorI2luY2x1ZGUgPHByaXZhdGUvYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZy5oPgogI2luY2x1ZGUgPHNvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXIuaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KICNpbmNsdWRlIDxhdWRpb19wb2xpY3lfY29uZi5oPgpAQCAtNjAsMjUgKzYyLDE1IEBACiAvLyBtZWRpYSAvIG5vdGlmaWNhdGlvbiAvIHN5c3RlbSB2b2x1bWUuCiBjb25zdGV4cHIgZmxvYXQgSU5fQ0FMTF9FQVJQSUVDRV9IRUFEUk9PTV9EQiA9IDMuZjsKIAotI2RlZmluZSBBUlJBWV9TSVpFKGEpIChzaXplb2YoYSkgLyBzaXplb2YoKGEpWzBdKSkKLS8vIEFycmF5IG9mIGFsbCBzdXJyb3VuZCBmb3JtYXRzLgotc3RhdGljIGNvbnN0IGF1ZGlvX2Zvcm1hdF90IFNVUlJPVU5EX0ZPUk1BVFNbXSA9IHsKLSAgICBBVURJT19GT1JNQVRfQUMzLAotICAgIEFVRElPX0ZPUk1BVF9FX0FDMywKLSAgICBBVURJT19GT1JNQVRfRFRTLAotICAgIEFVRElPX0ZPUk1BVF9EVFNfSEQsCi0gICAgQVVESU9fRk9STUFUX0FBQ19MQywKLSAgICBBVURJT19GT1JNQVRfRE9MQllfVFJVRUhELAotICAgIEFVRElPX0ZPUk1BVF9FX0FDM19KT0MsCi19OwotLy8gQXJyYXkgb2YgYWxsIEFBQyBmb3JtYXRzLiBXaGVuIEFBQyBpcyBlbmFibGVkIGJ5IHVzZXJzLCBhbGwgQUFDIGZvcm1hdHMgc2hvdWxkIGJlIGVuYWJsZWQuCi1zdGF0aWMgY29uc3QgYXVkaW9fZm9ybWF0X3QgQUFDX0ZPUk1BVFNbXSA9IHsKLSAgICBBVURJT19GT1JNQVRfQUFDX0xDLAotICAgIEFVRElPX0ZPUk1BVF9BQUNfSEVfVjEsCi0gICAgQVVESU9fRk9STUFUX0FBQ19IRV9WMiwKLSAgICBBVURJT19GT1JNQVRfQUFDX0VMRCwKLSAgICBBVURJT19GT1JNQVRfQUFDX1hIRSwKLX07CisvLyBDb21wcmVzc2VkIGZvcm1hdHMgZm9yIE1TRCBtb2R1bGUsIG9yZGVyZWQgZnJvbSBtb3N0IHByZWZlcnJlZCB0byBsZWFzdCBwcmVmZXJyZWQuCitzdGF0aWMgY29uc3Qgc3RkOjp2ZWN0b3I8YXVkaW9fZm9ybWF0X3Q+IGNvbXByZXNzZWRGb3JtYXRzT3JkZXIgPSB7eworICAgICAgICBBVURJT19GT1JNQVRfTUFUXzJfMSwgQVVESU9fRk9STUFUX01BVF8yXzAsIEFVRElPX0ZPUk1BVF9FX0FDMywKKyAgICAgICAgQVVESU9fRk9STUFUX0FDMywgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQgfX07CisvLyBDaGFubmVsIG1hc2tzIGZvciBNU0QgbW9kdWxlLCAzRCA+IDJEID4gMUQgb3JkZXJpbmcgKG1vc3QgcHJlZmVycmVkIHRvIGxlYXN0IHByZWZlcnJlZCkuCitzdGF0aWMgY29uc3Qgc3RkOjp2ZWN0b3I8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+IHN1cnJvdW5kQ2hhbm5lbE1hc2tzT3JkZXIgPSB7eworICAgICAgICBBVURJT19DSEFOTkVMX09VVF8zUE9JTlQxUE9JTlQyLCBBVURJT19DSEFOTkVMX09VVF8zUE9JTlQwUE9JTlQyLAorICAgICAgICBBVURJT19DSEFOTkVMX09VVF8yUE9JTlQxUE9JTlQyLCBBVURJT19DSEFOTkVMX09VVF8yUE9JTlQwUE9JTlQyLAorICAgICAgICBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxLCBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8gfX07CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vIEF1ZGlvUG9saWN5SW50ZXJmYWNlIGltcGxlbWVudGF0aW9uCkBAIC0yMDAsMzEgKzE5MiwzMCBAQAogICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgfQogCi0gICAgICAgIC8vIGNoZWNrQTJkcFN1c3BlbmQgbXVzdCBydW4gYmVmb3JlIGNoZWNrT3V0cHV0Rm9yQWxsU3RyYXRlZ2llcyBzbyB0aGF0IEEyRFAKLSAgICAgICAgLy8gb3V0cHV0IGlzIHN1c3BlbmRlZCBiZWZvcmUgYW55IHRyYWNrcyBhcmUgbW92ZWQgdG8gaXQKLSAgICAgICAgY2hlY2tBMmRwU3VzcGVuZCgpOwotICAgICAgICBjaGVja091dHB1dEZvckFsbFN0cmF0ZWdpZXMoKTsKLSAgICAgICAgLy8gb3V0cHV0cyBtdXN0IGJlIGNsb3NlZCBhZnRlciBjaGVja091dHB1dEZvckFsbFN0cmF0ZWdpZXMoKSBpcyBleGVjdXRlZAotICAgICAgICBpZiAoIW91dHB1dHMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBmb3IgKGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA6IG91dHB1dHMpIHsKLSAgICAgICAgICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dCk7Ci0gICAgICAgICAgICAgICAgLy8gY2xvc2UgdW51c2VkIG91dHB1dHMgYWZ0ZXIgZGV2aWNlIGRpc2Nvbm5lY3Rpb24gb3IgZGlyZWN0IG91dHB1dHMgdGhhdCBoYXZlIGJlZW4KLSAgICAgICAgICAgICAgICAvLyBvcGVuZWQgYnkgY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCkgdG8gcXVlcnkgZHluYW1pYyBwYXJhbWV0ZXJzCi0gICAgICAgICAgICAgICAgaWYgKChzdGF0ZSA9PSBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgKCgoZGVzYy0+bUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKSAhPSAwKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgIChkZXNjLT5tRGlyZWN0T3BlbkNvdW50ID09IDApKSkgewotICAgICAgICAgICAgICAgICAgICBjbG9zZU91dHB1dChvdXRwdXQpOworICAgICAgICBjaGVja0ZvckRldmljZUFuZE91dHB1dENoYW5nZXMoWyZdKCkgeworICAgICAgICAgICAgLy8gb3V0cHV0cyBtdXN0IGJlIGNsb3NlZCBhZnRlciBjaGVja091dHB1dEZvckFsbFN0cmF0ZWdpZXMoKSBpcyBleGVjdXRlZAorICAgICAgICAgICAgaWYgKCFvdXRwdXRzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIGZvciAoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0IDogb3V0cHV0cykgeworICAgICAgICAgICAgICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dCk7CisgICAgICAgICAgICAgICAgICAgIC8vIGNsb3NlIHVudXNlZCBvdXRwdXRzIGFmdGVyIGRldmljZSBkaXNjb25uZWN0aW9uIG9yIGRpcmVjdCBvdXRwdXRzIHRoYXQgaGF2ZSBiZWVuCisgICAgICAgICAgICAgICAgICAgIC8vIG9wZW5lZCBieSBjaGVja091dHB1dHNGb3JEZXZpY2UoKSB0byBxdWVyeSBkeW5hbWljIHBhcmFtZXRlcnMKKyAgICAgICAgICAgICAgICAgICAgaWYgKChzdGF0ZSA9PSBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKGRlc2MtPm1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCkgIT0gMCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlc2MtPm1EaXJlY3RPcGVuQ291bnQgPT0gMCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjbG9zZU91dHB1dChvdXRwdXQpOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIGNoZWNrIEEyRFAgYWdhaW4gYWZ0ZXIgY2xvc2luZyBBMkRQIG91dHB1dCB0byByZXNldCBtQTJkcFN1c3BlbmRlZCBpZiBuZWVkZWQKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIGNoZWNrIGFnYWluIGFmdGVyIGNsb3NpbmcgQTJEUCBvdXRwdXQgdG8gcmVzZXQgbUEyZHBTdXNwZW5kZWQgaWYgbmVlZGVkCi0gICAgICAgICAgICBjaGVja0EyZHBTdXNwZW5kKCk7Ci0gICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfSk7CiAKLSAgICAgICAgdXBkYXRlRGV2aWNlc0FuZE91dHB1dHMoKTsKICAgICAgICAgaWYgKG1FbmdpbmUtPmdldFBob25lU3RhdGUoKSA9PSBBVURJT19NT0RFX0lOX0NBTEwgJiYgaGFzUHJpbWFyeU91dHB1dCgpKSB7CiAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgbmV3RGV2aWNlID0gZ2V0TmV3T3V0cHV0RGV2aWNlKG1QcmltYXJ5T3V0cHV0LCBmYWxzZSAvKmZyb21DYWNoZSovKTsKICAgICAgICAgICAgIHVwZGF0ZUNhbGxSb3V0aW5nKG5ld0RldmljZSk7CiAgICAgICAgIH0KKyAgICAgICAgY29uc3QgYXVkaW9fZGV2aWNlc190IG1zZE91dERldmljZSA9IGdldE1zZEF1ZGlvT3V0RGV2aWNlVHlwZXMoKTsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0cy5zaXplKCk7IGkrKykgewogICAgICAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGkpOwogICAgICAgICAgICAgaWYgKChtRW5naW5lLT5nZXRQaG9uZVN0YXRlKCkgIT0gQVVESU9fTU9ERV9JTl9DQUxMKSB8fCAoZGVzYyAhPSBtUHJpbWFyeU91dHB1dCkpIHsKQEAgLTIzMiw3ICsyMjMsOCBAQAogICAgICAgICAgICAgICAgIC8vIGRvIG5vdCBmb3JjZSBkZXZpY2UgY2hhbmdlIG9uIGR1cGxpY2F0ZWQgb3V0cHV0IGJlY2F1c2UgaWYgZGV2aWNlIGlzIDAsIGl0IHdpbGwKICAgICAgICAgICAgICAgICAvLyBhbHNvIGZvcmNlIGEgZGV2aWNlIDAgZm9yIHRoZSB0d28gb3V0cHV0cyBpdCBpcyBkdXBsaWNhdGVkIHRvIHdoaWNoIG1heSBvdmVycmlkZQogICAgICAgICAgICAgICAgIC8vIGEgdmFsaWQgZGV2aWNlIHNlbGVjdGlvbiBvbiB0aG9zZSBvdXRwdXRzLgotICAgICAgICAgICAgICAgIGJvb2wgZm9yY2UgPSAhZGVzYy0+aXNEdXBsaWNhdGVkKCkKKyAgICAgICAgICAgICAgICBib29sIGZvcmNlID0gKG1zZE91dERldmljZSA9PSBBVURJT19ERVZJQ0VfTk9ORSB8fCBtc2RPdXREZXZpY2UgIT0gZGVzYy0+ZGV2aWNlKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAhZGVzYy0+aXNEdXBsaWNhdGVkKCkKICAgICAgICAgICAgICAgICAgICAgICAgICYmICghZGV2aWNlX2Rpc3Rpbmd1aXNoZXNfb25fYWRkcmVzcyhkZXZpY2UpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsd2F5cyBmb3JjZSB3aGVuIGRpc2Nvbm5lY3RpbmcgKGEgbm9uLWR1cGxpY2F0ZWQgZGV2aWNlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoc3RhdGUgPT0gQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRSkpOwpAQCAtNDc2LDIwICs0NjgsMTUgQEAKIAogc3A8QXVkaW9QYXRjaD4gQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjcmVhdGVUZWxlcGhvbnlQYXRjaCgKICAgICAgICAgYm9vbCBpc1J4LCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCB1aW50MzJfdCBkZWxheU1zKSB7Ci0gICAgc3RydWN0IGF1ZGlvX3BhdGNoIHBhdGNoOwotICAgIHBhdGNoLm51bV9zb3VyY2VzID0gMTsKLSAgICBwYXRjaC5udW1fc2lua3MgPSAxOworICAgIFBhdGNoQnVpbGRlciBwYXRjaEJ1aWxkZXI7CiAKICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiB0eFNvdXJjZURldmljZURlc2M7CiAgICAgaWYgKGlzUngpIHsKLSAgICAgICAgZmlsbEF1ZGlvUG9ydENvbmZpZ0ZvckRldmljZShtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcywgZGV2aWNlLCAmcGF0Y2guc2lua3NbMF0pOwotICAgICAgICBmaWxsQXVkaW9Qb3J0Q29uZmlnRm9yRGV2aWNlKAotICAgICAgICAgICAgICAgIG1BdmFpbGFibGVJbnB1dERldmljZXMsIEFVRElPX0RFVklDRV9JTl9URUxFUEhPTllfUlgsICZwYXRjaC5zb3VyY2VzWzBdKTsKKyAgICAgICAgcGF0Y2hCdWlsZGVyLmFkZFNpbmsoZmluZERldmljZShtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcywgZGV2aWNlKSkuCisgICAgICAgICAgICAgICAgYWRkU291cmNlKGZpbmREZXZpY2UobUF2YWlsYWJsZUlucHV0RGV2aWNlcywgQVVESU9fREVWSUNFX0lOX1RFTEVQSE9OWV9SWCkpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIHR4U291cmNlRGV2aWNlRGVzYyA9IGZpbGxBdWRpb1BvcnRDb25maWdGb3JEZXZpY2UoCi0gICAgICAgICAgICAgICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlcywgZGV2aWNlLCAmcGF0Y2guc291cmNlc1swXSk7Ci0gICAgICAgIGZpbGxBdWRpb1BvcnRDb25maWdGb3JEZXZpY2UoCi0gICAgICAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMsIEFVRElPX0RFVklDRV9PVVRfVEVMRVBIT05ZX1RYLCAmcGF0Y2guc2lua3NbMF0pOworICAgICAgICBwYXRjaEJ1aWxkZXIuYWRkU291cmNlKHR4U291cmNlRGV2aWNlRGVzYyA9IGZpbmREZXZpY2UobUF2YWlsYWJsZUlucHV0RGV2aWNlcywgZGV2aWNlKSkuCisgICAgICAgICAgICAgICAgYWRkU2luayhmaW5kRGV2aWNlKG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLCBBVURJT19ERVZJQ0VfT1VUX1RFTEVQSE9OWV9UWCkpOwogICAgIH0KIAogICAgIGF1ZGlvX2RldmljZXNfdCBvdXRwdXREZXZpY2UgPSBpc1J4ID8gZGV2aWNlIDogQVVESU9fREVWSUNFX09VVF9URUxFUEhPTllfVFg7CkBAIC01MDAsOSArNDg3LDcgQEAKICAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0KTsKICAgICAgICAgQUxPR19BU1NFUlQoIW91dHB1dERlc2MtPmlzRHVwbGljYXRlZCgpLAogICAgICAgICAgICAgICAgICIlcygpICUjeCBkZXZpY2Ugb3V0cHV0ICVkIGlzIGR1cGxpY2F0ZWQiLCBfX2Z1bmNfXywgb3V0cHV0RGV2aWNlLCBvdXRwdXQpOwotICAgICAgICBvdXRwdXREZXNjLT50b0F1ZGlvUG9ydENvbmZpZygmcGF0Y2guc291cmNlc1sxXSk7Ci0gICAgICAgIHBhdGNoLnNvdXJjZXNbMV0uZXh0Lm1peC51c2VjYXNlLnN0cmVhbSA9IEFVRElPX1NUUkVBTV9QQVRDSDsKLSAgICAgICAgcGF0Y2gubnVtX3NvdXJjZXMgPSAyOworICAgICAgICBwYXRjaEJ1aWxkZXIuYWRkU291cmNlKG91dHB1dERlc2MsIHsgLnN0cmVhbSA9IEFVRElPX1NUUkVBTV9QQVRDSCB9KTsKICAgICB9CiAKICAgICBpZiAoIWlzUngpIHsKQEAgLTUxMiwzOCArNDk3LDMxIEBACiAgICAgICAgIC8vIHN5bW1ldHJpYyB0byB0aGUgb25lIGluIHN0YXJ0SW5wdXQoKQogICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGFjdGl2ZURlc2MgOiBtSW5wdXRzLmdldEFjdGl2ZUlucHV0cygpKSB7CiAgICAgICAgICAgICBpZiAoYWN0aXZlRGVzYy0+aGFzU2FtZUh3TW9kdWxlQXModHhTb3VyY2VEZXZpY2VEZXNjKSkgewotICAgICAgICAgICAgICAgIEF1ZGlvU2Vzc2lvbkNvbGxlY3Rpb24gYWN0aXZlU2Vzc2lvbnMgPQotICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlRGVzYy0+Z2V0QXVkaW9TZXNzaW9ucyh0cnVlIC8qYWN0aXZlT25seSovKTsKLSAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IGFjdGl2ZVNlc3Npb25zLnNpemUoKTsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBhY3RpdmVTZXNzaW9uID0gYWN0aXZlU2Vzc2lvbnMua2V5QXQoaik7Ci0gICAgICAgICAgICAgICAgICAgIHN0b3BJbnB1dChhY3RpdmVEZXNjLT5tSW9IYW5kbGUsIGFjdGl2ZVNlc3Npb24pOwotICAgICAgICAgICAgICAgICAgICByZWxlYXNlSW5wdXQoYWN0aXZlRGVzYy0+bUlvSGFuZGxlLCBhY3RpdmVTZXNzaW9uKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2xvc2VBY3RpdmVDbGllbnRzKGFjdGl2ZURlc2MpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCiAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgYWZQYXRjaEhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOwotICAgIHN0YXR1c190IHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5jcmVhdGVBdWRpb1BhdGNoKCZwYXRjaCwgJmFmUGF0Y2hIYW5kbGUsIGRlbGF5TXMpOworICAgIHN0YXR1c190IHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5jcmVhdGVBdWRpb1BhdGNoKAorICAgICAgICAgICAgcGF0Y2hCdWlsZGVyLnBhdGNoKCksICZhZlBhdGNoSGFuZGxlLCBkZWxheU1zKTsKICAgICBBTE9HV19JRihzdGF0dXMgIT0gTk9fRVJST1IsCiAgICAgICAgICAgICAiJXMoKSBlcnJvciAlZCBjcmVhdGluZyAlcyBhdWRpbyBwYXRjaCIsIF9fZnVuY19fLCBzdGF0dXMsIGlzUnggPyAiUlgiIDogIlRYIik7CiAgICAgc3A8QXVkaW9QYXRjaD4gYXVkaW9QYXRjaDsKICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgIGF1ZGlvUGF0Y2ggPSBuZXcgQXVkaW9QYXRjaCgmcGF0Y2gsIG1VaWRDYWNoZWQpOworICAgICAgICBhdWRpb1BhdGNoID0gbmV3IEF1ZGlvUGF0Y2gocGF0Y2hCdWlsZGVyLnBhdGNoKCksIG1VaWRDYWNoZWQpOwogICAgICAgICBhdWRpb1BhdGNoLT5tQWZQYXRjaEhhbmRsZSA9IGFmUGF0Y2hIYW5kbGU7CiAgICAgICAgIGF1ZGlvUGF0Y2gtPm1VaWQgPSBtVWlkQ2FjaGVkOwogICAgIH0KICAgICByZXR1cm4gYXVkaW9QYXRjaDsKIH0KIAotc3A8RGV2aWNlRGVzY3JpcHRvcj4gQXVkaW9Qb2xpY3lNYW5hZ2VyOjpmaWxsQXVkaW9Qb3J0Q29uZmlnRm9yRGV2aWNlKAotICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3ImIGRldmljZXMsIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpIHsKLSAgICBEZXZpY2VWZWN0b3IgZGV2aWNlTGlzdCA9IGRldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKGRldmljZSk7CitzcDxEZXZpY2VEZXNjcmlwdG9yPiBBdWRpb1BvbGljeU1hbmFnZXI6OmZpbmREZXZpY2UoCisgICAgICAgIGNvbnN0IERldmljZVZlY3RvciYgZGV2aWNlcywgYXVkaW9fZGV2aWNlc190IGRldmljZSkgY29uc3QgeworICAgIERldmljZVZlY3RvciBkZXZpY2VMaXN0ID0gZGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGVNYXNrKGRldmljZSk7CiAgICAgQUxPR19BU1NFUlQoIWRldmljZUxpc3QuaXNFbXB0eSgpLAogICAgICAgICAgICAgIiVzKCkgc2VsZWN0ZWQgZGV2aWNlIHR5cGUgJSN4IGlzIG5vdCBpbiBkZXZpY2VzIGxpc3QiLCBfX2Z1bmNfXywgZGV2aWNlKTsKLSAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2VEZXNjID0gZGV2aWNlTGlzdC5pdGVtQXQoMCk7Ci0gICAgZGV2aWNlRGVzYy0+dG9BdWRpb1BvcnRDb25maWcoY29uZmlnKTsKLSAgICByZXR1cm4gZGV2aWNlRGVzYzsKKyAgICByZXR1cm4gZGV2aWNlTGlzdC5pdGVtQXQoMCk7CiB9CiAKIHZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRQaG9uZVN0YXRlKGF1ZGlvX21vZGVfdCBzdGF0ZSkKQEAgLTU1NywxNCArNTM1LDggQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICAvLy8gT3BlbnM6IGNhbiB0aGVzZSBsaW5lIGJlIGV4ZWN1dGVkIGFmdGVyIHRoZSBzd2l0Y2ggb2Ygdm9sdW1lIGN1cnZlcz8/PwotICAgIC8vIGlmIGxlYXZpbmcgY2FsbCBzdGF0ZSwgaGFuZGxlIHNwZWNpYWwgY2FzZSBvZiBhY3RpdmUgc3RyZWFtcwotICAgIC8vIHBlcnRhaW5pbmcgdG8gc29uaWZpY2F0aW9uIHN0cmF0ZWd5IHNlZSBoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oKQogICAgIGlmIChpc1N0YXRlSW5DYWxsKG9sZFN0YXRlKSkgewogICAgICAgICBBTE9HVigic2V0UGhvbmVTdGF0ZSgpIGluIGNhbGwgc3RhdGUgbWFuYWdlbWVudDogbmV3IHN0YXRlIGlzICVkIiwgc3RhdGUpOwotICAgICAgICBmb3IgKGludCBzdHJlYW0gPSAwOyBzdHJlYW0gPCBBVURJT19TVFJFQU1fRk9SX1BPTElDWV9DTlQ7IHN0cmVhbSsrKSB7Ci0gICAgICAgICAgICBoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oKGF1ZGlvX3N0cmVhbV90eXBlX3Qpc3RyZWFtLCBmYWxzZSwgdHJ1ZSk7Ci0gICAgICAgIH0KLQogICAgICAgICAvLyBmb3JjZSByZWV2YWx1YXRpbmcgYWNjZXNzaWJpbGl0eSByb3V0aW5nIHdoZW4gY2FsbCBzdG9wcwogICAgICAgICBtcENsaWVudEludGVyZmFjZS0+aW52YWxpZGF0ZVN0cmVhbShBVURJT19TVFJFQU1fQUNDRVNTSUJJTElUWSk7CiAgICAgfQpAQCAtNTc3LDkgKzU0OSw3IEBACiAgICAgICAgICAgICAgICAgICB8fCAoaXNfc3RhdGVfaW5fY2FsbChzdGF0ZSkgJiYgKHN0YXRlICE9IG9sZFN0YXRlKSkpOwogCiAgICAgLy8gY2hlY2sgZm9yIGRldmljZSBhbmQgb3V0cHV0IGNoYW5nZXMgdHJpZ2dlcmVkIGJ5IG5ldyBwaG9uZSBzdGF0ZQotICAgIGNoZWNrQTJkcFN1c3BlbmQoKTsKLSAgICBjaGVja091dHB1dEZvckFsbFN0cmF0ZWdpZXMoKTsKLSAgICB1cGRhdGVEZXZpY2VzQW5kT3V0cHV0cygpOworICAgIGNoZWNrRm9yRGV2aWNlQW5kT3V0cHV0Q2hhbmdlcygpOwogCiAgICAgaW50IGRlbGF5TXMgPSAwOwogICAgIGlmIChpc1N0YXRlSW5DYWxsKHN0YXRlKSkgewpAQCAtNjQzLDE0ICs2MTMsOCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgLy8gaWYgZW50ZXJpbmcgaW4gY2FsbCBzdGF0ZSwgaGFuZGxlIHNwZWNpYWwgY2FzZSBvZiBhY3RpdmUgc3RyZWFtcwotICAgIC8vIHBlcnRhaW5pbmcgdG8gc29uaWZpY2F0aW9uIHN0cmF0ZWd5IHNlZSBoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oKQogICAgIGlmIChpc1N0YXRlSW5DYWxsKHN0YXRlKSkgewogICAgICAgICBBTE9HVigic2V0UGhvbmVTdGF0ZSgpIGluIGNhbGwgc3RhdGUgbWFuYWdlbWVudDogbmV3IHN0YXRlIGlzICVkIiwgc3RhdGUpOwotICAgICAgICBmb3IgKGludCBzdHJlYW0gPSAwOyBzdHJlYW0gPCBBVURJT19TVFJFQU1fRk9SX1BPTElDWV9DTlQ7IHN0cmVhbSsrKSB7Ci0gICAgICAgICAgICBoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oKGF1ZGlvX3N0cmVhbV90eXBlX3Qpc3RyZWFtLCB0cnVlLCB0cnVlKTsKLSAgICAgICAgfQotCiAgICAgICAgIC8vIGZvcmNlIHJlZXZhbHVhdGluZyBhY2Nlc3NpYmlsaXR5IHJvdXRpbmcgd2hlbiBjYWxsIHN0YXJ0cwogICAgICAgICBtcENsaWVudEludGVyZmFjZS0+aW52YWxpZGF0ZVN0cmVhbShBVURJT19TVFJFQU1fQUNDRVNTSUJJTElUWSk7CiAgICAgfQpAQCAtNjg1LDkgKzY0OSw3IEBACiAgICAgICAgICAgICAodXNhZ2UgPT0gQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9TWVNURU0pOwogCiAgICAgLy8gY2hlY2sgZm9yIGRldmljZSBhbmQgb3V0cHV0IGNoYW5nZXMgdHJpZ2dlcmVkIGJ5IG5ldyBmb3JjZSB1c2FnZQotICAgIGNoZWNrQTJkcFN1c3BlbmQoKTsKLSAgICBjaGVja091dHB1dEZvckFsbFN0cmF0ZWdpZXMoKTsKLSAgICB1cGRhdGVEZXZpY2VzQW5kT3V0cHV0cygpOworICAgIGNoZWNrRm9yRGV2aWNlQW5kT3V0cHV0Q2hhbmdlcygpOwogCiAgICAgLy9GSVhNRTogd29ya2Fyb3VuZCBmb3IgdHJ1bmNhdGVkIHRvdWNoIHNvdW5kcwogICAgIC8vIHRvIGJlIHJlbW92ZWQgd2hlbiB0aGUgcHJvYmxlbSBpcyBoYW5kbGVkIGJ5IHN5c3RlbSBVSQpAQCAtODAzLDYgKzc2NSwxNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCkKIHsKICAgICBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cmlidXRlczsKKyAgICBEZXZpY2VWZWN0b3Igb3V0cHV0RGV2aWNlczsKKyAgICByb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5OworICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2U7CisgICAgY29uc3QgYXVkaW9fcG9ydF9oYW5kbGVfdCByZXF1ZXN0ZWREZXZpY2VJZCA9ICpzZWxlY3RlZERldmljZUlkOworICAgIGF1ZGlvX2RldmljZXNfdCBtc2REZXZpY2UgPSBnZXRNc2RBdWRpb091dERldmljZVR5cGVzKCk7CisKKyAgICAvLyBUaGUgc3VwcGxpZWQgcG9ydElkIG11c3QgYmUgQVVESU9fUE9SVF9IQU5ETEVfTk9ORQorICAgIGlmICgqcG9ydElkICE9IEFVRElPX1BPUlRfSEFORExFX05PTkUpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKwogICAgIGlmIChhdHRyICE9IE5VTEwpIHsKICAgICAgICAgaWYgKCFpc1ZhbGlkQXR0cmlidXRlcyhhdHRyKSkgewogICAgICAgICAgICAgQUxPR0UoImdldE91dHB1dEZvckF0dHIoKSBpbnZhbGlkIGF0dHJpYnV0ZXM6IHVzYWdlPSVkIGNvbnRlbnQ9JWQgZmxhZ3M9MHgleCB0YWdzPVslc10iLApAQCAtODE5LDQzICs3OTIsNDUgQEAKICAgICAgICAgc3RyZWFtX3R5cGVfdG9fYXVkaW9fYXR0cmlidXRlcygqc3RyZWFtLCAmYXR0cmlidXRlcyk7CiAgICAgfQogCi0gICAgLy8gVE9ETzogY2hlY2sgZm9yIGV4aXN0aW5nIGNsaWVudCBmb3IgdGhpcyBwb3J0IElECi0gICAgaWYgKCpwb3J0SWQgPT0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSkgewotICAgICAgICAqcG9ydElkID0gQXVkaW9Qb3J0OjpnZXROZXh0VW5pcXVlSWQoKTsKLSAgICB9Ci0KLSAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYzsKLSAgICBpZiAobVBvbGljeU1peGVzLmdldE91dHB1dEZvckF0dHIoYXR0cmlidXRlcywgdWlkLCBkZXNjKSA9PSBOT19FUlJPUikgewotICAgICAgICBBTE9HX0FTU0VSVChkZXNjICE9IDAsICJJbnZhbGlkIGRlc2MgcmV0dXJuZWQgYnkgZ2V0T3V0cHV0Rm9yQXR0ciIpOwotICAgICAgICBpZiAoIWF1ZGlvX2hhc19wcm9wb3J0aW9uYWxfZnJhbWVzKGNvbmZpZy0+Zm9ybWF0KSkgewotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgfQotICAgICAgICAqc3RyZWFtID0gc3RyZWFtVHlwZWZyb21BdHRyaWJ1dGVzSW50KCZhdHRyaWJ1dGVzKTsKLSAgICAgICAgKm91dHB1dCA9IGRlc2MtPm1Jb0hhbmRsZTsKLSAgICAgICAgQUxPR1YoImdldE91dHB1dEZvckF0dHIoKSByZXR1cm5zIG91dHB1dCAlZCIsICpvdXRwdXQpOwotICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgfQotICAgIGlmIChhdHRyaWJ1dGVzLnVzYWdlID09IEFVRElPX1VTQUdFX1ZJUlRVQUxfU09VUkNFKSB7Ci0gICAgICAgIEFMT0dXKCJnZXRPdXRwdXRGb3JBdHRyKCkgbm8gcG9saWN5IG1peCBmb3VuZCBmb3IgdXNhZ2UgQVVESU9fVVNBR0VfVklSVFVBTF9TT1VSQ0UiKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0KICAgICBBTE9HVigiZ2V0T3V0cHV0Rm9yQXR0cigpIHVzYWdlPSVkLCBjb250ZW50PSVkLCB0YWc9JXMgZmxhZ3M9JTA4eCIKLSAgICAgICAgICAgICIgc2Vzc2lvbiAlZCBzZWxlY3RlZERldmljZUlkICVkIiwKLSAgICAgICAgICAgIGF0dHJpYnV0ZXMudXNhZ2UsIGF0dHJpYnV0ZXMuY29udGVudF90eXBlLCBhdHRyaWJ1dGVzLnRhZ3MsIGF0dHJpYnV0ZXMuZmxhZ3MsCi0gICAgICAgICAgICBzZXNzaW9uLCAqc2VsZWN0ZWREZXZpY2VJZCk7CisgICAgICAgICAgIiBzZXNzaW9uICVkIHNlbGVjdGVkRGV2aWNlSWQgJWQiLAorICAgICAgICAgIGF0dHJpYnV0ZXMudXNhZ2UsIGF0dHJpYnV0ZXMuY29udGVudF90eXBlLCBhdHRyaWJ1dGVzLnRhZ3MsIGF0dHJpYnV0ZXMuZmxhZ3MsCisgICAgICAgICAgc2Vzc2lvbiwgcmVxdWVzdGVkRGV2aWNlSWQpOwogCiAgICAgKnN0cmVhbSA9IHN0cmVhbVR5cGVmcm9tQXR0cmlidXRlc0ludCgmYXR0cmlidXRlcyk7CiAKLSAgICAvLyBFeHBsaWNpdCByb3V0aW5nPwotICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZURlc2M7Ci0gICAgaWYgKCpzZWxlY3RlZERldmljZUlkICE9IEFVRElPX1BPUlRfSEFORExFX05PTkUpIHsKLSAgICAgICAgZGV2aWNlRGVzYyA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZUZyb21JZCgqc2VsZWN0ZWREZXZpY2VJZCk7Ci0gICAgfQotICAgIG1PdXRwdXRSb3V0ZXMuYWRkUm91dGUoc2Vzc2lvbiwgKnN0cmVhbSwgU2Vzc2lvblJvdXRlOjpTT1VSQ0VfVFlQRV9OQSwgZGV2aWNlRGVzYywgdWlkKTsKKyAgICBzdHJhdGVneSA9IGdldFN0cmF0ZWd5Rm9yQXR0cigmYXR0cmlidXRlcyk7CiAKLSAgICByb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5ID0gKHJvdXRpbmdfc3RyYXRlZ3kpIGdldFN0cmF0ZWd5Rm9yQXR0cigmYXR0cmlidXRlcyk7Ci0gICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KHN0cmF0ZWd5LCBmYWxzZSAvKmZyb21DYWNoZSovKTsKKyAgICAvLyBGaXJzdCBjaGVjayBmb3IgZXhwbGljaXQgcm91dGluZyAoZWcuIHNldFByZWZlcnJlZERldmljZSkKKyAgICBpZiAocmVxdWVzdGVkRGV2aWNlSWQgIT0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSkgeworICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2VEZXNjID0KKyAgICAgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZUZyb21JZChyZXF1ZXN0ZWREZXZpY2VJZCk7CisgICAgICAgIGRldmljZSA9IGRldmljZURlc2MtPnR5cGUoKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBJZiBubyBleHBsaWN0IHJvdXRlLCBpcyB0aGVyZSBhIG1hdGNoaW5nIGR5bmFtaWMgcG9saWN5IHRoYXQgYXBwbGllcz8KKyAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2M7CisgICAgICAgIGlmIChtUG9saWN5TWl4ZXMuZ2V0T3V0cHV0Rm9yQXR0cihhdHRyaWJ1dGVzLCB1aWQsIGRlc2MpID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBBTE9HX0FTU0VSVChkZXNjICE9IDAsICJJbnZhbGlkIGRlc2MgcmV0dXJuZWQgYnkgZ2V0T3V0cHV0Rm9yQXR0ciIpOworICAgICAgICAgICAgaWYgKCFhdWRpb19oYXNfcHJvcG9ydGlvbmFsX2ZyYW1lcyhjb25maWctPmZvcm1hdCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKnN0cmVhbSA9IHN0cmVhbVR5cGVmcm9tQXR0cmlidXRlc0ludCgmYXR0cmlidXRlcyk7CisgICAgICAgICAgICAqb3V0cHV0ID0gZGVzYy0+bUlvSGFuZGxlOworICAgICAgICAgICAgQXVkaW9NaXggKm1peCA9IGRlc2MtPm1Qb2xpY3lNaXg7CisgICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2VEZXNjID0KKyAgICAgICAgICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2UobWl4LT5tRGV2aWNlVHlwZSwgbWl4LT5tRGV2aWNlQWRkcmVzcyk7CisgICAgICAgICAgICAqc2VsZWN0ZWREZXZpY2VJZCA9IGRldmljZURlc2MgIT0gMCA/IGRldmljZURlc2MtPmdldElkKCkgOiBBVURJT19QT1JUX0hBTkRMRV9OT05FOworICAgICAgICAgICAgQUxPR1YoImdldE91dHB1dEZvckF0dHIoKSByZXR1cm5zIG91dHB1dCAlZCIsICpvdXRwdXQpOworICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICB9CisKKyAgICAgICAgLy8gVmlydHVhbCBzb3VyY2VzIG11c3QgYWx3YXlzIGJlIGR5bmFtaWNhbHkgb3IgZXhwbGljaXRseSByb3V0ZWQKKyAgICAgICAgaWYgKGF0dHJpYnV0ZXMudXNhZ2UgPT0gQVVESU9fVVNBR0VfVklSVFVBTF9TT1VSQ0UpIHsKKyAgICAgICAgICAgIEFMT0dXKCJnZXRPdXRwdXRGb3JBdHRyKCkgbm8gcG9saWN5IG1peCBmb3VuZCBmb3IgdXNhZ2UgQVVESU9fVVNBR0VfVklSVFVBTF9TT1VSQ0UiKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koc3RyYXRlZ3ksIGZhbHNlIC8qZnJvbUNhY2hlKi8pOworICAgIH0KIAogICAgIGlmICgoYXR0cmlidXRlcy5mbGFncyAmIEFVRElPX0ZMQUdfSFdfQVZfU1lOQykgIT0gMCkgewogICAgICAgICAqZmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpKCpmbGFncyB8IEFVRElPX09VVFBVVF9GTEFHX0hXX0FWX1NZTkMpOwpAQCAtODY5LDkgKzg0NCwxMCBAQAogICAgICAgICAqc3RyZWFtID09IEFVRElPX1NUUkVBTV9NVVNJQyAmJgogICAgICAgICBhdWRpb19pc19saW5lYXJfcGNtKGNvbmZpZy0+Zm9ybWF0KSAmJgogICAgICAgICBpc0luQ2FsbCgpKSB7Ci0gICAgICAgIGlmICgqc2VsZWN0ZWREZXZpY2VJZCAhPSBBVURJT19QT1JUX0hBTkRMRV9OT05FKSB7CisgICAgICAgIGlmIChyZXF1ZXN0ZWREZXZpY2VJZCAhPSBBVURJT19QT1JUX0hBTkRMRV9OT05FKSB7CiAgICAgICAgICAgICAqZmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpQVVESU9fT1VUUFVUX0ZMQUdfSU5DQUxMX01VU0lDOwogICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gR2V0IHRoZSBkZXZjZSB0eXBlIGRpcmVjdGx5IGZyb20gdGhlIGVuZ2luZSB0byBieXBhc3MgcHJlZmVycmVkIHJvdXRlIGxvZ2ljCiAgICAgICAgICAgICBkZXZpY2UgPSBtRW5naW5lLT5nZXREZXZpY2VGb3JTdHJhdGVneShzdHJhdGVneSk7CiAgICAgICAgIH0KICAgICB9CkBAIC04ODAsMTcgKzg1Niw0NCBAQAogICAgICAgICAgICJmbGFncyAlI3giLAogICAgICAgICAgIGRldmljZSwgY29uZmlnLT5zYW1wbGVfcmF0ZSwgY29uZmlnLT5mb3JtYXQsIGNvbmZpZy0+Y2hhbm5lbF9tYXNrLCAqZmxhZ3MpOwogCi0gICAgKm91dHB1dCA9IGdldE91dHB1dEZvckRldmljZShkZXZpY2UsIHNlc3Npb24sICpzdHJlYW0sIGNvbmZpZywgZmxhZ3MpOworICAgICpvdXRwdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKKyAgICBpZiAobXNkRGV2aWNlICE9IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgICpvdXRwdXQgPSBnZXRPdXRwdXRGb3JEZXZpY2UobXNkRGV2aWNlLCBzZXNzaW9uLCAqc3RyZWFtLCBjb25maWcsIGZsYWdzKTsKKyAgICAgICAgaWYgKCpvdXRwdXQgIT0gQVVESU9fSU9fSEFORExFX05PTkUgJiYgc2V0TXNkUGF0Y2goZGV2aWNlKSA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgQUxPR1YoIiVzKCkgVXNpbmcgTVNEIGRldmljZSAweCV4IGluc3RlYWQgb2YgZGV2aWNlIDB4JXgiLAorICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbXNkRGV2aWNlLCBkZXZpY2UpOworICAgICAgICAgICAgZGV2aWNlID0gbXNkRGV2aWNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKm91dHB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOworICAgICAgICB9CisgICAgfQogICAgIGlmICgqb3V0cHV0ID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgIG1PdXRwdXRSb3V0ZXMucmVtb3ZlUm91dGUoc2Vzc2lvbik7CisgICAgICAgICpvdXRwdXQgPSBnZXRPdXRwdXRGb3JEZXZpY2UoZGV2aWNlLCBzZXNzaW9uLCAqc3RyZWFtLCBjb25maWcsIGZsYWdzKTsKKyAgICB9CisgICAgaWYgKCpvdXRwdXQgPT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIAotICAgIERldmljZVZlY3RvciBvdXRwdXREZXZpY2VzID0gbUF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKGRldmljZSk7CisgICAgb3V0cHV0RGV2aWNlcyA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZU1hc2soZGV2aWNlKTsKICAgICAqc2VsZWN0ZWREZXZpY2VJZCA9IG91dHB1dERldmljZXMuc2l6ZSgpID4gMCA/IG91dHB1dERldmljZXMuaXRlbUF0KDApLT5nZXRJZCgpCiAgICAgICAgICAgICA6IEFVRElPX1BPUlRfSEFORExFX05PTkU7CiAKLSAgICBBTE9HVigiICBnZXRPdXRwdXRGb3JBdHRyKCkgcmV0dXJucyBvdXRwdXQgJWQgc2VsZWN0ZWREZXZpY2VJZCAlZCIsICpvdXRwdXQsICpzZWxlY3RlZERldmljZUlkKTsKK2V4aXQ6CisgICAgYXVkaW9fY29uZmlnX2Jhc2VfdCBjbGllbnRDb25maWcgPSB7LnNhbXBsZV9yYXRlID0gY29uZmlnLT5zYW1wbGVfcmF0ZSwKKyAgICAgICAgLmZvcm1hdCA9IGNvbmZpZy0+Zm9ybWF0LAorICAgICAgICAuY2hhbm5lbF9tYXNrID0gY29uZmlnLT5jaGFubmVsX21hc2sgfTsKKyAgICAqcG9ydElkID0gQXVkaW9Qb3J0OjpnZXROZXh0VW5pcXVlSWQoKTsKKworICAgIHNwPFRyYWNrQ2xpZW50RGVzY3JpcHRvcj4gY2xpZW50RGVzYyA9CisgICAgICAgIG5ldyBUcmFja0NsaWVudERlc2NyaXB0b3IoKnBvcnRJZCwgdWlkLCBzZXNzaW9uLCBhdHRyaWJ1dGVzLCBjbGllbnRDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkRGV2aWNlSWQsICpzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U3RyYXRlZ3lGb3JBdHRyKCZhdHRyaWJ1dGVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZmxhZ3MpOworICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVGb3IoKm91dHB1dCk7CisgICAgb3V0cHV0RGVzYy0+YWRkQ2xpZW50KGNsaWVudERlc2MpOworCisgICAgQUxPR1YoIiAgZ2V0T3V0cHV0Rm9yQXR0cigpIHJldHVybnMgb3V0cHV0ICVkIHNlbGVjdGVkRGV2aWNlSWQgJWQgZm9yIHBvcnQgSUQgJWQiLAorICAgICAgICAgICpvdXRwdXQsICpzZWxlY3RlZERldmljZUlkLCAqcG9ydElkKTsKIAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KQEAgLTk4NiwxMCArOTg5LDI3IEBACiAgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0KICAgICAgICAgICAgICAgICBuZXcgU3dBdWRpb091dHB1dERlc2NyaXB0b3IocHJvZmlsZSwgbXBDbGllbnRJbnRlcmZhY2UpOwogCi0gICAgICAgIERldmljZVZlY3RvciBvdXRwdXREZXZpY2VzID0gbUF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKGRldmljZSk7CisgICAgICAgIERldmljZVZlY3RvciBvdXRwdXREZXZpY2VzID0gbUF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlTWFzayhkZXZpY2UpOwogICAgICAgICBTdHJpbmc4IGFkZHJlc3MgPSBvdXRwdXREZXZpY2VzLnNpemUoKSA+IDAgPyBvdXRwdXREZXZpY2VzLml0ZW1BdCgwKS0+bUFkZHJlc3MKICAgICAgICAgICAgICAgICA6IFN0cmluZzgoIiIpOwogCisgICAgICAgIC8vIE1TRCBwYXRjaCBtYXkgYmUgdXNpbmcgdGhlIG9ubHkgb3V0cHV0IHN0cmVhbSB0aGF0IGNhbiBzZXJ2aWNlIHRoaXMgcmVxdWVzdC4gUmVsZWFzZQorICAgICAgICAvLyBNU0QgcGF0Y2ggdG8gcHJpb3JpdGl6ZSB0aGlzIHJlcXVlc3Qgb3ZlciBhbnkgYWN0aXZlIG91dHB1dCBvbiBNU0QuCisgICAgICAgIEF1ZGlvUGF0Y2hDb2xsZWN0aW9uIG1zZFBhdGNoZXMgPSBnZXRNc2RQYXRjaGVzKCk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbXNkUGF0Y2hlcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgY29uc3QgYXV0byYgcGF0Y2ggPSBtc2RQYXRjaGVzW2ldOworICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBwYXRjaC0+bVBhdGNoLm51bV9zaW5rczsgKytqKSB7CisgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzaW5rID0gJnBhdGNoLT5tUGF0Y2guc2lua3Nbal07CisgICAgICAgICAgICAgICAgaWYgKHNpbmstPnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgKHNpbmstPmV4dC5kZXZpY2UudHlwZSAmIGRldmljZSkgIT0gQVVESU9fREVWSUNFX05PTkUgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIChhZGRyZXNzLmlzRW1wdHkoKSB8fCBzdHJuY21wKHNpbmstPmV4dC5kZXZpY2UuYWRkcmVzcywgYWRkcmVzcy5zdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX01BWF9BRERSRVNTX0xFTikgPT0gMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVsZWFzZUF1ZGlvUGF0Y2gocGF0Y2gtPm1IYW5kbGUsIG1VaWRDYWNoZWQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKwogICAgICAgICBzdGF0dXMgPSBvdXRwdXREZXNjLT5vcGVuKGNvbmZpZywgZGV2aWNlLCBhZGRyZXNzLCBzdHJlYW0sICpmbGFncywgJm91dHB1dCk7CiAKICAgICAgICAgLy8gb25seSBhY2NlcHQgYW4gb3V0cHV0IHdpdGggdGhlIHJlcXVlc3RlZCBwYXJhbWV0ZXJzCkBAIC0xMDExLDggKzEwMzEsNiBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIEFVRElPX0lPX0hBTkRMRV9OT05FOwogICAgICAgICB9Ci0gICAgICAgIG91dHB1dERlc2MtPm1SZWZDb3VudFtzdHJlYW1dID0gMDsKLSAgICAgICAgb3V0cHV0RGVzYy0+bVN0b3BUaW1lW3N0cmVhbV0gPSAwOwogICAgICAgICBvdXRwdXREZXNjLT5tRGlyZWN0T3BlbkNvdW50ID0gMTsKICAgICAgICAgb3V0cHV0RGVzYy0+bURpcmVjdENsaWVudFNlc3Npb24gPSBzZXNzaW9uOwogCkBAIC0xMDUyLDYgKzEwNzAsMTY0IEBACiAgICAgcmV0dXJuIG91dHB1dDsKIH0KIAorc3A8RGV2aWNlRGVzY3JpcHRvcj4gQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRNc2RBdWRpb0luRGV2aWNlKCkgY29uc3QgeworICAgIHNwPEh3TW9kdWxlPiBtc2RNb2R1bGUgPSBtSHdNb2R1bGVzLmdldE1vZHVsZUZyb21OYW1lKEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9NU0QpOworICAgIGlmIChtc2RNb2R1bGUgIT0gMCkgeworICAgICAgICBEZXZpY2VWZWN0b3IgbXNkSW5wdXREZXZpY2VzID0gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbUh3TW9kdWxlKAorICAgICAgICAgICAgICAgIG1zZE1vZHVsZS0+Z2V0SGFuZGxlKCkpOworICAgICAgICBpZiAoIW1zZElucHV0RGV2aWNlcy5pc0VtcHR5KCkpIHJldHVybiBtc2RJbnB1dERldmljZXMuaXRlbUF0KDApOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworYXVkaW9fZGV2aWNlc190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0TXNkQXVkaW9PdXREZXZpY2VUeXBlcygpIGNvbnN0IHsKKyAgICBzcDxId01vZHVsZT4gbXNkTW9kdWxlID0gbUh3TW9kdWxlcy5nZXRNb2R1bGVGcm9tTmFtZShBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfTVNEKTsKKyAgICBpZiAobXNkTW9kdWxlICE9IDApIHsKKyAgICAgICAgcmV0dXJuIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZVR5cGVzRnJvbUh3TW9kdWxlKG1zZE1vZHVsZS0+Z2V0SGFuZGxlKCkpOworICAgIH0KKyAgICByZXR1cm4gQVVESU9fREVWSUNFX05PTkU7Cit9CisKK2NvbnN0IEF1ZGlvUGF0Y2hDb2xsZWN0aW9uIEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0TXNkUGF0Y2hlcygpIGNvbnN0IHsKKyAgICBBdWRpb1BhdGNoQ29sbGVjdGlvbiBtc2RQYXRjaGVzOworICAgIHNwPEh3TW9kdWxlPiBtc2RNb2R1bGUgPSBtSHdNb2R1bGVzLmdldE1vZHVsZUZyb21OYW1lKEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9NU0QpOworICAgIGlmIChtc2RNb2R1bGUgIT0gMCkgeworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1BdWRpb1BhdGNoZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIHNwPEF1ZGlvUGF0Y2g+IHBhdGNoID0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUF0KGkpOworICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBwYXRjaC0+bVBhdGNoLm51bV9zb3VyY2VzOyArK2opIHsKKyAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNvdXJjZSA9ICZwYXRjaC0+bVBhdGNoLnNvdXJjZXNbal07CisgICAgICAgICAgICAgICAgaWYgKHNvdXJjZS0+dHlwZSA9PSBBVURJT19QT1JUX1RZUEVfREVWSUNFICYmCisgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UtPmV4dC5kZXZpY2UuaHdfbW9kdWxlID09IG1zZE1vZHVsZS0+Z2V0SGFuZGxlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbXNkUGF0Y2hlcy5hZGRBdWRpb1BhdGNoKHBhdGNoLT5tSGFuZGxlLCBwYXRjaCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBtc2RQYXRjaGVzOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldEJlc3RNc2RBdWRpb1Byb2ZpbGVGb3IoYXVkaW9fZGV2aWNlc190IG91dHB1dERldmljZSwKKyAgICAgICAgYm9vbCBod0F2U3luYywgYXVkaW9fcG9ydF9jb25maWcgKnNvdXJjZUNvbmZpZywgYXVkaW9fcG9ydF9jb25maWcgKnNpbmtDb25maWcpIGNvbnN0Cit7CisgICAgc3A8SHdNb2R1bGU+IG1zZE1vZHVsZSA9IG1Id01vZHVsZXMuZ2V0TW9kdWxlRnJvbU5hbWUoQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX01TRCk7CisgICAgaWYgKG1zZE1vZHVsZSA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlcygpIHVuYWJsZSB0byBnZXQgTVNEIG1vZHVsZSIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIHNwPEh3TW9kdWxlPiBkZXZpY2VNb2R1bGUgPSBtSHdNb2R1bGVzLmdldE1vZHVsZUZvckRldmljZShvdXRwdXREZXZpY2UpOworICAgIGlmIChkZXZpY2VNb2R1bGUgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXMoKSB1bmFibGUgdG8gZ2V0IG1vZHVsZSBmb3IgJSN4IiwgX19mdW5jX18sIG91dHB1dERldmljZSk7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBjb25zdCBJbnB1dFByb2ZpbGVDb2xsZWN0aW9uICZpbnB1dFByb2ZpbGVzID0gbXNkTW9kdWxlLT5nZXRJbnB1dFByb2ZpbGVzKCk7CisgICAgaWYgKGlucHV0UHJvZmlsZXMuaXNFbXB0eSgpKSB7CisgICAgICAgIEFMT0dFKCIlcygpIG5vIGlucHV0IHByb2ZpbGVzIGZvciBNU0QgbW9kdWxlIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgY29uc3QgT3V0cHV0UHJvZmlsZUNvbGxlY3Rpb24gJm91dHB1dFByb2ZpbGVzID0gZGV2aWNlTW9kdWxlLT5nZXRPdXRwdXRQcm9maWxlcygpOworICAgIGlmIChvdXRwdXRQcm9maWxlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgQUxPR0UoIiVzKCkgbm8gb3V0cHV0IHByb2ZpbGVzIGZvciBkZXZpY2UgJSN4IiwgX19mdW5jX18sIG91dHB1dERldmljZSk7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBBdWRpb1Byb2ZpbGVWZWN0b3IgbXNkUHJvZmlsZXM7CisgICAgLy8gRWFjaCBJT1Byb2ZpbGUgcmVwcmVzZW50cyBhIE1peFBvcnQgZnJvbSBhdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwKKyAgICBmb3IgKGNvbnN0IGF1dG8gJmluUHJvZmlsZSA6IGlucHV0UHJvZmlsZXMpIHsKKyAgICAgICAgaWYgKGh3QXZTeW5jID09ICgoaW5Qcm9maWxlLT5nZXRGbGFncygpICYgQVVESU9fSU5QVVRfRkxBR19IV19BVl9TWU5DKSAhPSAwKSkgeworICAgICAgICAgICAgbXNkUHJvZmlsZXMuYXBwZW5kVmVjdG9yKGluUHJvZmlsZS0+Z2V0QXVkaW9Qcm9maWxlcygpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBBdWRpb1Byb2ZpbGVWZWN0b3IgZGV2aWNlUHJvZmlsZXM7CisgICAgZm9yIChjb25zdCBhdXRvICZvdXRQcm9maWxlIDogb3V0cHV0UHJvZmlsZXMpIHsKKyAgICAgICAgaWYgKGh3QXZTeW5jID09ICgob3V0UHJvZmlsZS0+Z2V0RmxhZ3MoKSAmIEFVRElPX09VVFBVVF9GTEFHX0hXX0FWX1NZTkMpICE9IDApKSB7CisgICAgICAgICAgICBkZXZpY2VQcm9maWxlcy5hcHBlbmRWZWN0b3Iob3V0UHJvZmlsZS0+Z2V0QXVkaW9Qcm9maWxlcygpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnX2Jhc2UgYmVzdFNpbmtDb25maWc7CisgICAgc3RhdHVzX3QgcmVzdWx0ID0gbXNkUHJvZmlsZXMuZmluZEJlc3RNYXRjaGluZ091dHB1dENvbmZpZyhkZXZpY2VQcm9maWxlcywKKyAgICAgICAgICAgIGNvbXByZXNzZWRGb3JtYXRzT3JkZXIsIHN1cnJvdW5kQ2hhbm5lbE1hc2tzT3JkZXIsIHRydWUgLypwcmVmZXJIaWdoZXJTYW1wbGluZ1JhdGVzKi8sCisgICAgICAgICAgICAmYmVzdFNpbmtDb25maWcpOworICAgIGlmIChyZXN1bHQgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgQUxPR0QoIiVzKCkgbm8gbWF0Y2hpbmcgcHJvZmlsZXMgZm91bmQgZm9yIGRldmljZTogJSN4LCBod0F2U3luYzogJWQiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBvdXRwdXREZXZpY2UsIGh3QXZTeW5jKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgc2lua0NvbmZpZy0+c2FtcGxlX3JhdGUgPSBiZXN0U2lua0NvbmZpZy5zYW1wbGVfcmF0ZTsKKyAgICBzaW5rQ29uZmlnLT5jaGFubmVsX21hc2sgPSBiZXN0U2lua0NvbmZpZy5jaGFubmVsX21hc2s7CisgICAgc2lua0NvbmZpZy0+Zm9ybWF0ID0gYmVzdFNpbmtDb25maWcuZm9ybWF0OworICAgIC8vIEZvciBlbmNvZGVkIHN0cmVhbXMgZm9yY2UgZGlyZWN0IGZsYWcgdG8gcHJldmVudCBkb3duc3RyZWFtIG1peGluZy4KKyAgICBzaW5rQ29uZmlnLT5mbGFncy5vdXRwdXQgPSBzdGF0aWNfY2FzdDxhdWRpb19vdXRwdXRfZmxhZ3NfdD4oCisgICAgICAgICAgICBzaW5rQ29uZmlnLT5mbGFncy5vdXRwdXQgfCBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpOworICAgIHNvdXJjZUNvbmZpZy0+c2FtcGxlX3JhdGUgPSBiZXN0U2lua0NvbmZpZy5zYW1wbGVfcmF0ZTsKKyAgICAvLyBTcGVjaWZ5IGV4YWN0IGNoYW5uZWwgbWFzayB0byBwcmV2ZW50IGd1ZXNzaW5nIGJ5IGJpdCBjb3VudCBpbiBQYXRjaFBhbmVsLgorICAgIHNvdXJjZUNvbmZpZy0+Y2hhbm5lbF9tYXNrID0gYXVkaW9fY2hhbm5lbF9tYXNrX291dF90b19pbihiZXN0U2lua0NvbmZpZy5jaGFubmVsX21hc2spOworICAgIHNvdXJjZUNvbmZpZy0+Zm9ybWF0ID0gYmVzdFNpbmtDb25maWcuZm9ybWF0OworICAgIC8vIENvcHkgaW5wdXQgc3RyZWFtIGRpcmVjdGx5IHdpdGhvdXQgYW55IHByb2Nlc3NpbmcgKGUuZy4gcmVzYW1wbGluZykuCisgICAgc291cmNlQ29uZmlnLT5mbGFncy5pbnB1dCA9IHN0YXRpY19jYXN0PGF1ZGlvX2lucHV0X2ZsYWdzX3Q+KAorICAgICAgICAgICAgc291cmNlQ29uZmlnLT5mbGFncy5pbnB1dCB8IEFVRElPX0lOUFVUX0ZMQUdfRElSRUNUKTsKKyAgICBpZiAoaHdBdlN5bmMpIHsKKyAgICAgICAgc2lua0NvbmZpZy0+ZmxhZ3Mub3V0cHV0ID0gc3RhdGljX2Nhc3Q8YXVkaW9fb3V0cHV0X2ZsYWdzX3Q+KAorICAgICAgICAgICAgICAgIHNpbmtDb25maWctPmZsYWdzLm91dHB1dCB8IEFVRElPX09VVFBVVF9GTEFHX0hXX0FWX1NZTkMpOworICAgICAgICBzb3VyY2VDb25maWctPmZsYWdzLmlucHV0ID0gc3RhdGljX2Nhc3Q8YXVkaW9faW5wdXRfZmxhZ3NfdD4oCisgICAgICAgICAgICAgICAgc291cmNlQ29uZmlnLT5mbGFncy5pbnB1dCB8IEFVRElPX0lOUFVUX0ZMQUdfSFdfQVZfU1lOQyk7CisgICAgfQorICAgIGNvbnN0IHVuc2lnbmVkIGludCBjb25maWdfbWFzayA9IEFVRElPX1BPUlRfQ09ORklHX1NBTVBMRV9SQVRFIHwKKyAgICAgICAgICAgIEFVRElPX1BPUlRfQ09ORklHX0NIQU5ORUxfTUFTSyB8IEFVRElPX1BPUlRfQ09ORklHX0ZPUk1BVCB8IEFVRElPX1BPUlRfQ09ORklHX0ZMQUdTOworICAgIHNpbmtDb25maWctPmNvbmZpZ19tYXNrIHw9IGNvbmZpZ19tYXNrOworICAgIHNvdXJjZUNvbmZpZy0+Y29uZmlnX21hc2sgfD0gY29uZmlnX21hc2s7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitQYXRjaEJ1aWxkZXIgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpidWlsZE1zZFBhdGNoKGF1ZGlvX2RldmljZXNfdCBvdXRwdXREZXZpY2UpIGNvbnN0Cit7CisgICAgUGF0Y2hCdWlsZGVyIHBhdGNoQnVpbGRlcjsKKyAgICBwYXRjaEJ1aWxkZXIuYWRkU291cmNlKGdldE1zZEF1ZGlvSW5EZXZpY2UoKSkuCisgICAgICAgICAgICBhZGRTaW5rKGZpbmREZXZpY2UobUF2YWlsYWJsZU91dHB1dERldmljZXMsIG91dHB1dERldmljZSkpOworICAgIGF1ZGlvX3BvcnRfY29uZmlnIHNvdXJjZUNvbmZpZyA9IHBhdGNoQnVpbGRlci5wYXRjaCgpLT5zb3VyY2VzWzBdOworICAgIGF1ZGlvX3BvcnRfY29uZmlnIHNpbmtDb25maWcgPSBwYXRjaEJ1aWxkZXIucGF0Y2goKS0+c2lua3NbMF07CisgICAgLy8gVE9ETzogRmlndXJlIG91dCB3aGV0aGVyIE1TRCBtb2R1bGUgaGFzIEhXX0FWX1NZTkMgZmxhZyBzZXQgaW4gdGhlIEFQIGNvbmZpZyBmaWxlLgorICAgIC8vIEZvciBub3csIHdlIGp1c3QgZm9yY2VmdWxseSB0cnkgd2l0aCBId0F2U3luYyBmaXJzdC4KKyAgICBzdGF0dXNfdCByZXMgPSBnZXRCZXN0TXNkQXVkaW9Qcm9maWxlRm9yKG91dHB1dERldmljZSwgdHJ1ZSAvKmh3QXZTeW5jKi8sCisgICAgICAgICAgICAmc291cmNlQ29uZmlnLCAmc2lua0NvbmZpZykgPT0gTk9fRVJST1IgPyBOT19FUlJPUiA6CisgICAgICAgICAgICBnZXRCZXN0TXNkQXVkaW9Qcm9maWxlRm9yKAorICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXZpY2UsIGZhbHNlIC8qaHdBdlN5bmMqLywgJnNvdXJjZUNvbmZpZywgJnNpbmtDb25maWcpOworICAgIGlmIChyZXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgLy8gRm91bmQgYSBtYXRjaGluZyBwcm9maWxlIGZvciBlbmNvZGVkIGF1ZGlvLiBSZS1jcmVhdGUgUGF0Y2hCdWlsZGVyIHdpdGggdGhpcyBjb25maWcuCisgICAgICAgIHJldHVybiAoUGF0Y2hCdWlsZGVyKCkpLmFkZFNvdXJjZShzb3VyY2VDb25maWcpLmFkZFNpbmsoc2lua0NvbmZpZyk7CisgICAgfQorICAgIEFMT0dWKCIlcygpIG5vIG1hdGNoaW5nIHByb2ZpbGUgZm91bmQuIEZhbGwgdGhyb3VnaCB0byBkZWZhdWx0IFBDTSBwYXRjaCIKKyAgICAgICAgICAgICIgc3VwcG9ydGluZyBQQ00gZm9ybWF0IGNvbnZlcnNpb24uIiwgX19mdW5jX18pOworICAgIHJldHVybiBwYXRjaEJ1aWxkZXI7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c2V0TXNkUGF0Y2goYXVkaW9fZGV2aWNlc190IG91dHB1dERldmljZSkgeworICAgIEFMT0dWKCIlcygpIGZvciBvdXRwdXREZXZpY2UgJSN4IiwgX19mdW5jX18sIG91dHB1dERldmljZSk7CisgICAgaWYgKG91dHB1dERldmljZSA9PSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgICAgICAvLyBVc2UgbWVkaWEgc3RyYXRlZ3kgZm9yIHVuc3BlY2lmaWVkIG91dHB1dCBkZXZpY2UuIFRoaXMgc2hvdWxkIG9ubHkKKyAgICAgICAgLy8gb2NjdXIgb24gY2hlY2tGb3JEZXZpY2VBbmRPdXRwdXRDaGFuZ2VzKCkuIERldmljZSBjb25uZWN0aW9uIGV2ZW50cyBtYXkKKyAgICAgICAgLy8gdGhlcmVmb3JlIGludmFsaWRhdGUgZXhwbGljaXQgcm91dGluZyByZXF1ZXN0cy4KKyAgICAgICAgb3V0cHV0RGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfTUVESUEsIGZhbHNlIC8qZnJvbUNhY2hlKi8pOworICAgIH0KKyAgICBQYXRjaEJ1aWxkZXIgcGF0Y2hCdWlsZGVyID0gYnVpbGRNc2RQYXRjaChvdXRwdXREZXZpY2UpOworICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCogcGF0Y2ggPSBwYXRjaEJ1aWxkZXIucGF0Y2goKTsKKyAgICBjb25zdCBBdWRpb1BhdGNoQ29sbGVjdGlvbiBtc2RQYXRjaGVzID0gZ2V0TXNkUGF0Y2hlcygpOworICAgIGlmICghbXNkUGF0Y2hlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihtc2RQYXRjaGVzLnNpemUoKSA+IDEsCisgICAgICAgICAgICAgICAgIlRoZSBjdXJyZW50IE1TRCBwcm90b3R5cGUgb25seSBzdXBwb3J0cyBvbmUgb3V0cHV0IHBhdGNoIik7CisgICAgICAgIHNwPEF1ZGlvUGF0Y2g+IGN1cnJlbnRQYXRjaCA9IG1zZFBhdGNoZXMudmFsdWVBdCgwKTsKKyAgICAgICAgaWYgKGF1ZGlvX3BhdGNoZXNfYXJlX2VxdWFsKCZjdXJyZW50UGF0Y2gtPm1QYXRjaCwgcGF0Y2gpKSB7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgcmVsZWFzZUF1ZGlvUGF0Y2goY3VycmVudFBhdGNoLT5tSGFuZGxlLCBtVWlkQ2FjaGVkKTsKKyAgICB9CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gaW5zdGFsbFBhdGNoKF9fZnVuY19fLCAtMSAvKmluZGV4Ki8sIG51bGxwdHIgLypwYXRjaEhhbmRsZSovLAorICAgICAgICAgICAgcGF0Y2gsIDAgLypkZWxheU1zKi8sIG1VaWRDYWNoZWQsIG51bGxwdHIgLypwYXRjaERlc2NQdHIqLyk7CisgICAgQUxPR0VfSUYoc3RhdHVzICE9IE5PX0VSUk9SLCAiJXMoKSBlcnJvciAlZCBjcmVhdGluZyBNU0QgYXVkaW8gcGF0Y2giLCBfX2Z1bmNfXywgc3RhdHVzKTsKKyAgICBBTE9HSV9JRihzdGF0dXMgPT0gTk9fRVJST1IsICIlcygpIFBhdGNoIGNyZWF0ZWQgZnJvbSBNU0RfSU4gdG8gIgorICAgICAgICAgICAiZGV2aWNlOiUjeCAoZm9ybWF0OiUjeCBjaGFubmVsczolI3ggc2FtcGxlcmF0ZTolZCkiLCBfX2Z1bmNfXywgb3V0cHV0RGV2aWNlLAorICAgICAgICAgICBwYXRjaC0+c291cmNlc1swXS5mb3JtYXQsIHBhdGNoLT5zb3VyY2VzWzBdLmNoYW5uZWxfbWFzaywgcGF0Y2gtPnNvdXJjZXNbMF0uc2FtcGxlX3JhdGUpOworICAgIHJldHVybiBzdGF0dXM7Cit9CisKIGF1ZGlvX2lvX2hhbmRsZV90IEF1ZGlvUG9saWN5TWFuYWdlcjo6c2VsZWN0T3V0cHV0KGNvbnN0IFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4mIG91dHB1dHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0KQpAQCAtMTEzMSw2NyArMTMwNywzMiBAQAogICAgIHJldHVybiBvdXRwdXRzWzBdOwogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnN0YXJ0T3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnN0YXJ0T3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogewotICAgIEFMT0dWKCJzdGFydE91dHB1dCgpIG91dHB1dCAlZCwgc3RyZWFtICVkLCBzZXNzaW9uICVkIiwKLSAgICAgICAgICBvdXRwdXQsIHN0cmVhbSwgc2Vzc2lvbik7Ci0gICAgc3NpemVfdCBpbmRleCA9IG1PdXRwdXRzLmluZGV4T2ZLZXkob3V0cHV0KTsKLSAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIEFMT0dXKCJzdGFydE91dHB1dCgpIHVua25vd24gb3V0cHV0ICVkIiwgb3V0cHV0KTsKKyAgICBBTE9HVigiJXMgcG9ydElkICVkIiwgX19GVU5DVElPTl9fLCBwb3J0SWQpOworCisgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy5nZXRPdXRwdXRGb3JDbGllbnQocG9ydElkKTsKKyAgICBpZiAob3V0cHV0RGVzYyA9PSAwKSB7CisgICAgICAgIEFMT0dXKCJzdGFydE91dHB1dCgpIG5vIG91dHB1dCBmb3IgY2xpZW50ICVkIiwgcG9ydElkKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CisgICAgc3A8VHJhY2tDbGllbnREZXNjcmlwdG9yPiBjbGllbnQgPSBvdXRwdXREZXNjLT5nZXRDbGllbnQocG9ydElkKTsKIAotICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVBdChpbmRleCk7CisgICAgQUxPR1YoInN0YXJ0T3V0cHV0KCkgb3V0cHV0ICVkLCBzdHJlYW0gJWQsIHNlc3Npb24gJWQiLAorICAgICAgICAgIG91dHB1dERlc2MtPm1Jb0hhbmRsZSwgY2xpZW50LT5zdHJlYW0oKSwgY2xpZW50LT5zZXNzaW9uKCkpOwogCiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gb3V0cHV0RGVzYy0+c3RhcnQoKTsKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQogCi0gICAgLy8gUm91dGluZz8KLSAgICBtT3V0cHV0Um91dGVzLmluY1JvdXRlQWN0aXZpdHkoc2Vzc2lvbik7Ci0KLSAgICBhdWRpb19kZXZpY2VzX3QgbmV3RGV2aWNlOwotICAgIEF1ZGlvTWl4ICpwb2xpY3lNaXggPSBOVUxMOwotICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MgPSBOVUxMOwotICAgIGlmIChvdXRwdXREZXNjLT5tUG9saWN5TWl4ICE9IE5VTEwpIHsKLSAgICAgICAgcG9saWN5TWl4ID0gb3V0cHV0RGVzYy0+bVBvbGljeU1peDsKLSAgICAgICAgYWRkcmVzcyA9IHBvbGljeU1peC0+bURldmljZUFkZHJlc3Muc3RyaW5nKCk7Ci0gICAgICAgIGlmICgocG9saWN5TWl4LT5tUm91dGVGbGFncyAmIE1JWF9ST1VURV9GTEFHX1JFTkRFUikgPT0gTUlYX1JPVVRFX0ZMQUdfUkVOREVSKSB7Ci0gICAgICAgICAgICBuZXdEZXZpY2UgPSBwb2xpY3lNaXgtPm1EZXZpY2VUeXBlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbmV3RGV2aWNlID0gQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChtT3V0cHV0Um91dGVzLmdldEFuZENsZWFyUm91dGVDaGFuZ2VkKHNlc3Npb24pKSB7Ci0gICAgICAgIG5ld0RldmljZSA9IGdldE5ld091dHB1dERldmljZShvdXRwdXREZXNjLCBmYWxzZSAvKmZyb21DYWNoZSovKTsKLSAgICAgICAgaWYgKG5ld0RldmljZSAhPSBvdXRwdXREZXNjLT5kZXZpY2UoKSkgewotICAgICAgICAgICAgY2hlY2tTdHJhdGVneVJvdXRlKGdldFN0cmF0ZWd5KHN0cmVhbSksIG91dHB1dCk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBuZXdEZXZpY2UgPSBBVURJT19ERVZJQ0VfTk9ORTsKLSAgICB9Ci0KLSAgICB1aW50MzJfdCBkZWxheU1zID0gMDsKLQotICAgIHN0YXR1cyA9IHN0YXJ0U291cmNlKG91dHB1dERlc2MsIHN0cmVhbSwgbmV3RGV2aWNlLCBhZGRyZXNzLCAmZGVsYXlNcyk7CisgICAgdWludDMyX3QgZGVsYXlNczsKKyAgICBzdGF0dXMgPSBzdGFydFNvdXJjZShvdXRwdXREZXNjLCBjbGllbnQsICZkZWxheU1zKTsKIAogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgbU91dHB1dFJvdXRlcy5kZWNSb3V0ZUFjdGl2aXR5KHNlc3Npb24pOwogICAgICAgICBvdXRwdXREZXNjLT5zdG9wKCk7CiAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQotICAgIC8vIEF1dG9tYXRpY2FsbHkgZW5hYmxlIHRoZSByZW1vdGUgc3VibWl4IGlucHV0IHdoZW4gb3V0cHV0IGlzIHN0YXJ0ZWQgb24gYSByZSByb3V0aW5nIG1peAotICAgIC8vIG9mIHR5cGUgTUlYX1RZUEVfUkVDT1JERVJTCi0gICAgaWYgKGF1ZGlvX2lzX3JlbW90ZV9zdWJtaXhfZGV2aWNlKG5ld0RldmljZSkgJiYgcG9saWN5TWl4ICE9IE5VTEwgJiYKLSAgICAgICAgICAgIHBvbGljeU1peC0+bU1peFR5cGUgPT0gTUlYX1RZUEVfUkVDT1JERVJTKSB7Ci0gICAgICAgICAgICBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGVJbnQoQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVgsCi0gICAgICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFLAotICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAicmVtb3RlLXN1Ym1peCIpOwotICAgIH0KLQogICAgIGlmIChkZWxheU1zICE9IDApIHsKICAgICAgICAgdXNsZWVwKGRlbGF5TXMgKiAxMDAwKTsKICAgICB9CkBAIC0xMTk5LDE2ICsxMzQwLDE1IEBACiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzdGFydFNvdXJjZShjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpkZWxheU1zKQorc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzdGFydFNvdXJjZShjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPFRyYWNrQ2xpZW50RGVzY3JpcHRvcj4mIGNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmRlbGF5TXMpCiB7CiAgICAgLy8gY2Fubm90IHN0YXJ0IHBsYXliYWNrIG9mIFNUUkVBTV9UVFMgaWYgYW55IG90aGVyIG91dHB1dCBpcyBiZWluZyB1c2VkCiAgICAgdWludDMyX3QgYmVhY29uTXV0ZUxhdGVuY3kgPSAwOwogCiAgICAgKmRlbGF5TXMgPSAwOworICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0gY2xpZW50LT5zdHJlYW0oKTsKICAgICBpZiAoc3RyZWFtID09IEFVRElPX1NUUkVBTV9UVFMpIHsKICAgICAgICAgQUxPR1YoIlx0IGZvdW5kIEJFQUNPTiBzdHJlYW0iKTsKICAgICAgICAgaWYgKCFtVHRzT3V0cHV0QXZhaWxhYmxlICYmIG1PdXRwdXRzLmlzQW55T3V0cHV0QWN0aXZlKEFVRElPX1NUUkVBTV9UVFMgLypzdHJlYW1Ub0lnbm9yZSovKSkgewpAQCAtMTIyNiw2ICsxMzY2LDE5IEBACiAgICAgYm9vbCBmb3JjZSA9ICFvdXRwdXREZXNjLT5pc0FjdGl2ZSgpICYmCiAgICAgICAgICAgICAob3V0cHV0RGVzYy0+Z2V0UGF0Y2hIYW5kbGUoKSA9PSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORSk7CiAKKyAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gQVVESU9fREVWSUNFX05PTkU7CisgICAgQXVkaW9NaXggKnBvbGljeU1peCA9IE5VTEw7CisgICAgY29uc3QgY2hhciAqYWRkcmVzcyA9IE5VTEw7CisgICAgaWYgKG91dHB1dERlc2MtPm1Qb2xpY3lNaXggIT0gTlVMTCkgeworICAgICAgICBwb2xpY3lNaXggPSBvdXRwdXREZXNjLT5tUG9saWN5TWl4OworICAgICAgICBhZGRyZXNzID0gcG9saWN5TWl4LT5tRGV2aWNlQWRkcmVzcy5zdHJpbmcoKTsKKyAgICAgICAgaWYgKChwb2xpY3lNaXgtPm1Sb3V0ZUZsYWdzICYgTUlYX1JPVVRFX0ZMQUdfUkVOREVSKSA9PSBNSVhfUk9VVEVfRkxBR19SRU5ERVIpIHsKKyAgICAgICAgICAgIGRldmljZSA9IHBvbGljeU1peC0+bURldmljZVR5cGU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVg7CisgICAgICAgIH0KKyAgICB9CisKICAgICAvLyByZXF1aXJlc011dGVDaGVjayBpcyBmYWxzZSB3aGVuIHdlIGNhbiBieXBhc3MgbXV0ZSBzdHJhdGVneS4KICAgICAvLyBJdCBjb3ZlcnMgYSBjb21tb24gY2FzZSB3aGVuIHRoZXJlIGlzIG5vIG1hdGVyaWFsbHkgYWN0aXZlIGF1ZGlvCiAgICAgLy8gYW5kIG11dGluZyB3b3VsZCByZXN1bHQgaW4gdW5uZWNlc3NhcnkgZGVsYXkgYW5kIGRyb3BwZWQgYXVkaW8uCkBAIC0xMjM1LDEzICsxMzg4LDIwIEBACiAgICAgLy8gaW5jcmVtZW50IHVzYWdlIGNvdW50IGZvciB0aGlzIHN0cmVhbSBvbiB0aGUgcmVxdWVzdGVkIG91dHB1dDoKICAgICAvLyBOT1RFIHRoYXQgdGhlIHVzYWdlIGNvdW50IGlzIHRoZSBzYW1lIGZvciBkdXBsaWNhdGVkIG91dHB1dCBhbmQgaGFyZHdhcmUgb3V0cHV0IHdoaWNoIGlzCiAgICAgLy8gbmVjZXNzYXJ5IGZvciBhIGNvcnJlY3QgY29udHJvbCBvZiBoYXJkd2FyZSBvdXRwdXQgcm91dGluZyBieSBzdGFydE91dHB1dCgpIGFuZCBzdG9wT3V0cHV0KCkKLSAgICBvdXRwdXREZXNjLT5jaGFuZ2VSZWZDb3VudChzdHJlYW0sIDEpOworICAgIG91dHB1dERlc2MtPnNldENsaWVudEFjdGl2ZShjbGllbnQsIHRydWUpOworCisgICAgaWYgKGNsaWVudC0+aGFzUHJlZmVycmVkRGV2aWNlKHRydWUpKSB7CisgICAgICAgIGRldmljZSA9IGdldE5ld091dHB1dERldmljZShvdXRwdXREZXNjLCBmYWxzZSAvKmZyb21DYWNoZSovKTsKKyAgICAgICAgaWYgKGRldmljZSAhPSBvdXRwdXREZXNjLT5kZXZpY2UoKSkgeworICAgICAgICAgICAgY2hlY2tTdHJhdGVneVJvdXRlKGdldFN0cmF0ZWd5KHN0cmVhbSksIG91dHB1dERlc2MtPm1Jb0hhbmRsZSk7CisgICAgICAgIH0KKyAgICB9CiAKICAgICBpZiAoc3RyZWFtID09IEFVRElPX1NUUkVBTV9NVVNJQykgewogICAgICAgICBzZWxlY3RPdXRwdXRGb3JNdXNpY0VmZmVjdHMoKTsKICAgICB9CiAKLSAgICBpZiAob3V0cHV0RGVzYy0+bVJlZkNvdW50W3N0cmVhbV0gPT0gMSB8fCBkZXZpY2UgIT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICBpZiAob3V0cHV0RGVzYy0+c3RyZWFtQWN0aXZlQ291bnQoc3RyZWFtKSA9PSAxIHx8IGRldmljZSAhPSBBVURJT19ERVZJQ0VfTk9ORSkgewogICAgICAgICAvLyBzdGFydGluZyBhbiBvdXRwdXQgYmVpbmcgcmVyb3V0ZWQ/CiAgICAgICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKICAgICAgICAgICAgIGRldmljZSA9IGdldE5ld091dHB1dERldmljZShvdXRwdXREZXNjLCBmYWxzZSAvKmZyb21DYWNoZSovKTsKQEAgLTEyOTQsMTEgKzE0NTQsNiBAQAogICAgICAgICBjb25zdCB1aW50MzJfdCBtdXRlV2FpdE1zID0KICAgICAgICAgICAgICAgICBzZXRPdXRwdXREZXZpY2Uob3V0cHV0RGVzYywgZGV2aWNlLCBmb3JjZSwgMCwgTlVMTCwgYWRkcmVzcywgcmVxdWlyZXNNdXRlQ2hlY2spOwogCi0gICAgICAgIC8vIGhhbmRsZSBzcGVjaWFsIGNhc2UgZm9yIHNvbmlmaWNhdGlvbiB3aGlsZSBpbiBjYWxsCi0gICAgICAgIGlmIChpc0luQ2FsbCgpKSB7Ci0gICAgICAgICAgICBoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oc3RyZWFtLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIH0KLQogICAgICAgICAvLyBhcHBseSB2b2x1bWUgcnVsZXMgZm9yIGN1cnJlbnQgc3RyZWFtIGFuZCBkZXZpY2UgaWYgbmVjZXNzYXJ5CiAgICAgICAgIGNoZWNrQW5kU2V0Vm9sdW1lKHN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbVZvbHVtZUN1cnZlcy0+Z2V0Vm9sdW1lSW5kZXgoc3RyZWFtLCBvdXRwdXREZXNjLT5kZXZpY2UoKSksCkBAIC0xMzMyLDUzICsxNDg3LDM0IEBACiAgICAgICAgIHNldFN0cmF0ZWd5TXV0ZShTVFJBVEVHWV9TT05JRklDQVRJT04sIHRydWUsIG91dHB1dERlc2MpOwogICAgIH0KIAotICAgIGlmIChzdHJlYW0gPT0gQVVESU9fU1RSRUFNX0VORk9SQ0VEX0FVRElCTEUgJiYKLSAgICAgICAgICAgIG1FbmdpbmUtPmdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfU1lTVEVNKSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfU1lTVEVNX0VORk9SQ0VEKSB7Ci0gICAgICAgIHNldFN0cmF0ZWd5TXV0ZShTVFJBVEVHWV9TT05JRklDQVRJT04sIHRydWUsIG91dHB1dERlc2MpOworICAgIC8vIEF1dG9tYXRpY2FsbHkgZW5hYmxlIHRoZSByZW1vdGUgc3VibWl4IGlucHV0IHdoZW4gb3V0cHV0IGlzIHN0YXJ0ZWQgb24gYSByZSByb3V0aW5nIG1peAorICAgIC8vIG9mIHR5cGUgTUlYX1RZUEVfUkVDT1JERVJTCisgICAgaWYgKGF1ZGlvX2lzX3JlbW90ZV9zdWJtaXhfZGV2aWNlKGRldmljZSkgJiYgcG9saWN5TWl4ICE9IE5VTEwgJiYKKyAgICAgICAgcG9saWN5TWl4LT5tTWl4VHlwZSA9PSBNSVhfVFlQRV9SRUNPUkRFUlMpIHsKKyAgICAgICAgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlSW50KEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlbW90ZS1zdWJtaXgiKTsKICAgICB9CiAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzdG9wT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQorc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzdG9wT3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogewotICAgIEFMT0dWKCJzdG9wT3V0cHV0KCkgb3V0cHV0ICVkLCBzdHJlYW0gJWQsIHNlc3Npb24gJWQiLCBvdXRwdXQsIHN0cmVhbSwgc2Vzc2lvbik7Ci0gICAgc3NpemVfdCBpbmRleCA9IG1PdXRwdXRzLmluZGV4T2ZLZXkob3V0cHV0KTsKLSAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIEFMT0dXKCJzdG9wT3V0cHV0KCkgdW5rbm93biBvdXRwdXQgJWQiLCBvdXRwdXQpOworICAgIEFMT0dWKCIlcyBwb3J0SWQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnRJZCk7CisKKyAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLmdldE91dHB1dEZvckNsaWVudChwb3J0SWQpOworICAgIGlmIChvdXRwdXREZXNjID09IDApIHsKKyAgICAgICAgQUxPR1coInN0b3BPdXRwdXQoKSBubyBvdXRwdXQgZm9yIGNsaWVudCAlZCIsIHBvcnRJZCk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQorICAgIHNwPFRyYWNrQ2xpZW50RGVzY3JpcHRvcj4gY2xpZW50ID0gb3V0cHV0RGVzYy0+Z2V0Q2xpZW50KHBvcnRJZCk7CiAKLSAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaW5kZXgpOworICAgIEFMT0dWKCJzdG9wT3V0cHV0KCkgb3V0cHV0ICVkLCBzdHJlYW0gJWQsIHNlc3Npb24gJWQiLAorICAgICAgICAgIG91dHB1dERlc2MtPm1Jb0hhbmRsZSwgY2xpZW50LT5zdHJlYW0oKSwgY2xpZW50LT5zZXNzaW9uKCkpOwogCi0gICAgaWYgKG91dHB1dERlc2MtPm1SZWZDb3VudFtzdHJlYW1dID09IDEpIHsKLSAgICAgICAgLy8gQXV0b21hdGljYWxseSBkaXNhYmxlIHRoZSByZW1vdGUgc3VibWl4IGlucHV0IHdoZW4gb3V0cHV0IGlzIHN0b3BwZWQgb24gYQotICAgICAgICAvLyByZSByb3V0aW5nIG1peCBvZiB0eXBlIE1JWF9UWVBFX1JFQ09SREVSUwotICAgICAgICBpZiAoYXVkaW9faXNfcmVtb3RlX3N1Ym1peF9kZXZpY2Uob3V0cHV0RGVzYy0+bURldmljZSkgJiYKLSAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tUG9saWN5TWl4ICE9IE5VTEwgJiYKLSAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tUG9saWN5TWl4LT5tTWl4VHlwZSA9PSBNSVhfVFlQRV9SRUNPUkRFUlMpIHsKLSAgICAgICAgICAgIHNldERldmljZUNvbm5lY3Rpb25TdGF0ZUludChBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWCwKLSAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRSwKLSAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bVBvbGljeU1peC0+bURldmljZUFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICJyZW1vdGUtc3VibWl4Iik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBSb3V0aW5nPwotICAgIGJvb2wgZm9yY2VEZXZpY2VVcGRhdGUgPSBmYWxzZTsKLSAgICBpZiAob3V0cHV0RGVzYy0+bVJlZkNvdW50W3N0cmVhbV0gPiAwKSB7Ci0gICAgICAgIGludCBhY3Rpdml0eUNvdW50ID0gbU91dHB1dFJvdXRlcy5kZWNSb3V0ZUFjdGl2aXR5KHNlc3Npb24pOwotICAgICAgICBmb3JjZURldmljZVVwZGF0ZSA9IChtT3V0cHV0Um91dGVzLmhhc1JvdXRlKHNlc3Npb24pICYmIChhY3Rpdml0eUNvdW50ID09IDApKTsKLQotICAgICAgICBpZiAoZm9yY2VEZXZpY2VVcGRhdGUpIHsKLSAgICAgICAgICAgIGNoZWNrU3RyYXRlZ3lSb3V0ZShnZXRTdHJhdGVneShzdHJlYW0pLCBBVURJT19JT19IQU5ETEVfTk9ORSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBzdG9wU291cmNlKG91dHB1dERlc2MsIHN0cmVhbSwgZm9yY2VEZXZpY2VVcGRhdGUpOworICAgIHN0YXR1c190IHN0YXR1cyA9IHN0b3BTb3VyY2Uob3V0cHV0RGVzYywgY2xpZW50KTsKIAogICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IgKSB7CiAgICAgICAgIG91dHB1dERlc2MtPnN0b3AoKTsKQEAgLTEzODYsMjQgKzE1MjIsMzggQEAKICAgICByZXR1cm4gc3RhdHVzOwogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnN0b3BTb3VyY2UoY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9yY2VEZXZpY2VVcGRhdGUpCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnN0b3BTb3VyY2UoY29uc3Qgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPFRyYWNrQ2xpZW50RGVzY3JpcHRvcj4mIGNsaWVudCkKIHsKICAgICAvLyBhbHdheXMgaGFuZGxlIHN0cmVhbSBzdG9wLCBjaGVjayB3aGljaCBzdHJlYW0gdHlwZSBpcyBzdG9wcGluZworICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0gY2xpZW50LT5zdHJlYW0oKTsKKwogICAgIGhhbmRsZUV2ZW50Rm9yQmVhY29uKHN0cmVhbSA9PSBBVURJT19TVFJFQU1fVFRTID8gU1RPUFBJTkdfQkVBQ09OIDogU1RPUFBJTkdfT1VUUFVUKTsKIAotICAgIC8vIGhhbmRsZSBzcGVjaWFsIGNhc2UgZm9yIHNvbmlmaWNhdGlvbiB3aGlsZSBpbiBjYWxsCi0gICAgaWYgKGlzSW5DYWxsKCkpIHsKLSAgICAgICAgaGFuZGxlSW5jYWxsU29uaWZpY2F0aW9uKHN0cmVhbSwgZmFsc2UsIGZhbHNlKTsKLSAgICB9CisgICAgaWYgKG91dHB1dERlc2MtPnN0cmVhbUFjdGl2ZUNvdW50KHN0cmVhbSkgPiAwKSB7CisgICAgICAgIGlmIChvdXRwdXREZXNjLT5zdHJlYW1BY3RpdmVDb3VudChzdHJlYW0pID09IDEpIHsKKyAgICAgICAgICAgIC8vIEF1dG9tYXRpY2FsbHkgZGlzYWJsZSB0aGUgcmVtb3RlIHN1Ym1peCBpbnB1dCB3aGVuIG91dHB1dCBpcyBzdG9wcGVkIG9uIGEKKyAgICAgICAgICAgIC8vIHJlIHJvdXRpbmcgbWl4IG9mIHR5cGUgTUlYX1RZUEVfUkVDT1JERVJTCisgICAgICAgICAgICBpZiAoYXVkaW9faXNfcmVtb3RlX3N1Ym1peF9kZXZpY2Uob3V0cHV0RGVzYy0+bURldmljZSkgJiYKKyAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tUG9saWN5TWl4ICE9IE5VTEwgJiYKKyAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tUG9saWN5TWl4LT5tTWl4VHlwZSA9PSBNSVhfVFlQRV9SRUNPUkRFUlMpIHsKKyAgICAgICAgICAgICAgICBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGVJbnQoQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1Qb2xpY3lNaXgtPm1EZXZpY2VBZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVtb3RlLXN1Ym1peCIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJvb2wgZm9yY2VEZXZpY2VVcGRhdGUgPSBmYWxzZTsKKyAgICAgICAgaWYgKGNsaWVudC0+aGFzUHJlZmVycmVkRGV2aWNlKHRydWUpKSB7CisgICAgICAgICAgICBjaGVja1N0cmF0ZWd5Um91dGUoZ2V0U3RyYXRlZ3koc3RyZWFtKSwgQVVESU9fSU9fSEFORExFX05PTkUpOworICAgICAgICAgICAgZm9yY2VEZXZpY2VVcGRhdGUgPSB0cnVlOworICAgICAgICB9CiAKLSAgICBpZiAob3V0cHV0RGVzYy0+bVJlZkNvdW50W3N0cmVhbV0gPiAwKSB7CiAgICAgICAgIC8vIGRlY3JlbWVudCB1c2FnZSBjb3VudCBvZiB0aGlzIHN0cmVhbSBvbiB0aGUgb3V0cHV0Ci0gICAgICAgIG91dHB1dERlc2MtPmNoYW5nZVJlZkNvdW50KHN0cmVhbSwgLTEpOworICAgICAgICBvdXRwdXREZXNjLT5zZXRDbGllbnRBY3RpdmUoY2xpZW50LCBmYWxzZSk7CiAKICAgICAgICAgLy8gc3RvcmUgdGltZSBhdCB3aGljaCB0aGUgc3RyZWFtIHdhcyBzdG9wcGVkIC0gc2VlIGlzU3RyZWFtQWN0aXZlKCkKLSAgICAgICAgaWYgKG91dHB1dERlc2MtPm1SZWZDb3VudFtzdHJlYW1dID09IDAgfHwgZm9yY2VEZXZpY2VVcGRhdGUpIHsKKyAgICAgICAgaWYgKG91dHB1dERlc2MtPnN0cmVhbUFjdGl2ZUNvdW50KHN0cmVhbSkgPT0gMCB8fCBmb3JjZURldmljZVVwZGF0ZSkgewogICAgICAgICAgICAgb3V0cHV0RGVzYy0+bVN0b3BUaW1lW3N0cmVhbV0gPSBzeXN0ZW1UaW1lKCk7CiAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgbmV3RGV2aWNlID0gZ2V0TmV3T3V0cHV0RGV2aWNlKG91dHB1dERlc2MsIGZhbHNlIC8qZnJvbUNhY2hlKi8pOwogICAgICAgICAgICAgLy8gZGVsYXkgdGhlIGRldmljZSBzd2l0Y2ggYnkgdHdpY2UgdGhlIGxhdGVuY3kgYmVjYXVzZSBzdG9wT3V0cHV0KCkgaXMgZXhlY3V0ZWQgd2hlbgpAQCAtMTQ1NCwzNSArMTYwNCw0MSBAQAogICAgIH0KIH0KIAotdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OnJlbGVhc2VPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0gX191bnVzZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiBfX3VudXNlZCkKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpyZWxlYXNlT3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogewotICAgIEFMT0dWKCJyZWxlYXNlT3V0cHV0KCkgJWQiLCBvdXRwdXQpOwotICAgIHNzaXplX3QgaW5kZXggPSBtT3V0cHV0cy5pbmRleE9mS2V5KG91dHB1dCk7Ci0gICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICBBTE9HVygicmVsZWFzZU91dHB1dCgpIHJlbGVhc2luZyB1bmtub3duIG91dHB1dCAlZCIsIG91dHB1dCk7CisgICAgQUxPR1YoIiVzIHBvcnRJZCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydElkKTsKKworICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMuZ2V0T3V0cHV0Rm9yQ2xpZW50KHBvcnRJZCk7CisgICAgaWYgKG91dHB1dERlc2MgPT0gMCkgeworICAgICAgICAvLyBJZiBhbiBvdXRwdXQgZGVzY3JpcHRvciBpcyBjbG9zZWQgZHVlIHRvIGEgZGV2aWNlIHJvdXRpbmcgY2hhbmdlLAorICAgICAgICAvLyB0aGVuIHRoZXJlIGFyZSByYWNlIGNvbmRpdGlvbnMgd2l0aCByZWxlYXNlT3V0cHV0IGZyb20gdHJhY2tzCisgICAgICAgIC8vIHRoYXQgbWF5IGJlIGRlc3Ryb3llZCAod2l0aCBubyBQbGF5YmFja1RocmVhZCkgb3IgYSBQbGF5YmFja1RocmVhZAorICAgICAgICAvLyBkZXN0cm95ZWQgc2hvcnRseSB0aGVyZWFmdGVyLgorICAgICAgICAvLworICAgICAgICAvLyBIZXJlIHdlIGp1c3QgbG9nIGEgd2FybmluZywgaW5zdGVhZCBvZiBhIGZhdGFsIGVycm9yLgorICAgICAgICBBTE9HVygicmVsZWFzZU91dHB1dCgpIG5vIG91dHB1dCBmb3IgY2xpZW50ICVkIiwgcG9ydElkKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIC8vIFJvdXRpbmcKLSAgICBtT3V0cHV0Um91dGVzLnJlbW92ZVJvdXRlKHNlc3Npb24pOworICAgIEFMT0dWKCJyZWxlYXNlT3V0cHV0KCkgJWQiLCBvdXRwdXREZXNjLT5tSW9IYW5kbGUpOwogCi0gICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGluZGV4KTsKLSAgICBpZiAoZGVzYy0+bUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKSB7Ci0gICAgICAgIGlmIChkZXNjLT5tRGlyZWN0T3BlbkNvdW50IDw9IDApIHsKKyAgICBpZiAob3V0cHV0RGVzYy0+bUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKSB7CisgICAgICAgIGlmIChvdXRwdXREZXNjLT5tRGlyZWN0T3BlbkNvdW50IDw9IDApIHsKICAgICAgICAgICAgIEFMT0dXKCJyZWxlYXNlT3V0cHV0KCkgaW52YWxpZCBvcGVuIGNvdW50ICVkIGZvciBvdXRwdXQgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjLT5tRGlyZWN0T3BlbkNvdW50LCBvdXRwdXQpOworICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bURpcmVjdE9wZW5Db3VudCwgb3V0cHV0RGVzYy0+bUlvSGFuZGxlKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotICAgICAgICBpZiAoLS1kZXNjLT5tRGlyZWN0T3BlbkNvdW50ID09IDApIHsKLSAgICAgICAgICAgIGNsb3NlT3V0cHV0KG91dHB1dCk7CisgICAgICAgIGlmICgtLW91dHB1dERlc2MtPm1EaXJlY3RPcGVuQ291bnQgPT0gMCkgeworICAgICAgICAgICAgY2xvc2VPdXRwdXQob3V0cHV0RGVzYy0+bUlvSGFuZGxlKTsKICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vbkF1ZGlvUG9ydExpc3RVcGRhdGUoKTsKICAgICAgICAgfQogICAgIH0KKyAgICAvLyBzdG9wT3V0cHV0KCkgbmVlZHMgdG8gYmUgc3VjY2Vzc2Z1bGx5IGNhbGxlZCBiZWZvcmUgcmVsZWFzZU91dHB1dCgpCisgICAgLy8gb3RoZXJ3aXNlIHRoZXJlIG1heSBiZSBpbmFjY3VyYXRlIHN0cmVhbSByZWZlcmVuY2UgY291bnRzLgorICAgIC8vIFRoaXMgaXMgY2hlY2tlZCBpbiBvdXRwdXREZXNjLT5yZW1vdmVDbGllbnQgYmVsb3cuCisgICAgb3V0cHV0RGVzYy0+cmVtb3ZlQ2xpZW50KHBvcnRJZCk7CiB9CiAKLQogc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRJbnB1dEZvckF0dHIoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKmlucHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCkBAIC0xNTA0LDYgKzE2NjAsMTYgQEAKICAgICBhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSA9IGF0dHItPnNvdXJjZTsKICAgICBBdWRpb01peCAqcG9saWN5TWl4ID0gTlVMTDsKICAgICBEZXZpY2VWZWN0b3IgaW5wdXREZXZpY2VzOworICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2M7CisgICAgc3A8UmVjb3JkQ2xpZW50RGVzY3JpcHRvcj4gY2xpZW50RGVzYzsKKyAgICBhdWRpb19wb3J0X2hhbmRsZV90IHJlcXVlc3RlZERldmljZUlkID0gKnNlbGVjdGVkRGV2aWNlSWQ7CisgICAgYm9vbCBpc1NvdW5kVHJpZ2dlcjsKKyAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlOworCisgICAgLy8gVGhlIHN1cHBsaWVkIHBvcnRJZCBtdXN0IGJlIEFVRElPX1BPUlRfSEFORExFX05PTkUKKyAgICBpZiAoKnBvcnRJZCAhPSBBVURJT19QT1JUX0hBTkRMRV9OT05FKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CiAKICAgICBpZiAoaW5wdXRTb3VyY2UgPT0gQVVESU9fU09VUkNFX0RFRkFVTFQpIHsKICAgICAgICAgaW5wdXRTb3VyY2UgPSBBVURJT19TT1VSQ0VfTUlDOwpAQCAtMTUxNCw3ICsxNjgwLDYgQEAKICAgICBpZiAoKnNlbGVjdGVkRGV2aWNlSWQgIT0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSkgewogICAgICAgICBkZXZpY2VEZXNjID0gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2VGcm9tSWQoKnNlbGVjdGVkRGV2aWNlSWQpOwogICAgIH0KLSAgICBtSW5wdXRSb3V0ZXMuYWRkUm91dGUoc2Vzc2lvbiwgU2Vzc2lvblJvdXRlOjpTVFJFQU1fVFlQRV9OQSwgaW5wdXRTb3VyY2UsIGRldmljZURlc2MsIHVpZCk7CiAKICAgICAvLyBzcGVjaWFsIGNhc2UgZm9yIG1tYXAgY2FwdHVyZTogaWYgYW4gaW5wdXQgSU8gaGFuZGxlIGlzIHNwZWNpZmllZCwgd2UgcmV1c2UgdGhpcyBpbnB1dCBpZgogICAgIC8vIHBvc3NpYmxlCkBAIC0xNTI3LDggKzE2OTIsOCBAQAogICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICAgfQogICAgICAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gbUlucHV0cy52YWx1ZUF0KGluZGV4KTsKLSAgICAgICAgc3A8QXVkaW9TZXNzaW9uPiBhdWRpb1Nlc3Npb24gPSBpbnB1dERlc2MtPmdldEF1ZGlvU2Vzc2lvbihzZXNzaW9uKTsKLSAgICAgICAgaWYgKGF1ZGlvU2Vzc2lvbiA9PSAwKSB7CisgICAgICAgIFJlY29yZENsaWVudFZlY3RvciBjbGllbnRzID0gaW5wdXREZXNjLT5nZXRDbGllbnRzRm9yU2Vzc2lvbihzZXNzaW9uKTsKKyAgICAgICAgaWYgKGNsaWVudHMuc2l6ZSgpID09IDApIHsKICAgICAgICAgICAgIEFMT0dXKCJnZXRJbnB1dEZvckF0dHIoKSB1bmtub3duIHNlc3Npb24gJWQgb24gaW5wdXQgJWQiLCBzZXNzaW9uLCAqaW5wdXQpOwogICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICAgICAgZ290byBlcnJvcjsKQEAgLTE1MzcsMjkgKzE3MDIsMjggQEAKICAgICAgICAgLy8gVGhlIHNlY29uZCBjYWxsIGlzIGZvciB0aGUgZmlyc3QgYWN0aXZlIGNsaWVudCBhbmQgc2V0cyB0aGUgVUlELiBBbnkgZnVydGhlciBjYWxsCiAgICAgICAgIC8vIGNvcnJlc3BvbmRzIHRvIGEgbmV3IGNsaWVudCBhbmQgaXMgb25seSBwZXJtaXR0ZWQgZnJvbSB0aGUgc2FtZSBVSUQuCiAgICAgICAgIC8vIElmIHRoZSBmaXJzdCBVSUQgaXMgc2lsZW5jZWQsIGFsbG93IGEgbmV3IFVJRCBjb25uZWN0aW9uIGFuZCByZXBsYWNlIHdpdGggbmV3IFVJRAotICAgICAgICBpZiAoYXVkaW9TZXNzaW9uLT5vcGVuQ291bnQoKSA9PSAxKSB7Ci0gICAgICAgICAgICBhdWRpb1Nlc3Npb24tPnNldFVpZCh1aWQpOwotICAgICAgICB9IGVsc2UgaWYgKGF1ZGlvU2Vzc2lvbi0+dWlkKCkgIT0gdWlkKSB7Ci0gICAgICAgICAgICBpZiAoIWF1ZGlvU2Vzc2lvbi0+aXNTaWxlbmNlZCgpKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coImdldElucHV0Rm9yQXR0cigpIGJhZCB1aWQgJWQgZm9yIHNlc3Npb24gJWQgdWlkICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICB1aWQsIHNlc3Npb24sIGF1ZGlvU2Vzc2lvbi0+dWlkKCkpOwotICAgICAgICAgICAgICAgIHN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIGlmIChjbGllbnRzLnNpemUoKSA+IDEpIHsKKyAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgY2xpZW50IDogY2xpZW50cykgeworICAgICAgICAgICAgICAgIC8vIFRoZSBjbGllbnQgbWFwIGlzIG9yZGVyZWQgYnkga2V5IHZhbHVlcyAocG9ydElkKSBhbmQgcG9ydElkcyBhcmUgYWxsb2NhdGVkCisgICAgICAgICAgICAgICAgLy8gaW5jcmVtZW50YWx5LiBTbyB0aGUgZmlyc3QgY2xpZW50IGluIHRoaXMgbGlzdCBpcyB0aGUgb25lIG9wZW5lZCBieSBhdWRpbyBmbGluZ2VyCisgICAgICAgICAgICAgICAgLy8gd2hlbiB0aGUgbW1hcCBzdHJlYW0gaXMgY3JlYXRlZCBhbmQgc2hvdWxkIGJlIGlnbm9yZWQgYXMgaXQgZG9lcyBub3QgY29ycmVzcG9uZAorICAgICAgICAgICAgICAgIC8vIHRvIGFuIGFjdHVhbCBjbGllbnQKKyAgICAgICAgICAgICAgICBpZiAoY2xpZW50ID09ICpjbGllbnRzLmNiZWdpbigpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAodWlkICE9IGNsaWVudC0+dWlkKCkgJiYgIWNsaWVudC0+aXNTaWxlbmNlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJnZXRJbnB1dEZvckF0dHIoKSBiYWQgdWlkICVkIGZvciBjbGllbnQgJWQgdWlkICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkLCBjbGllbnQtPnBvcnRJZCgpLCBjbGllbnQtPnVpZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgICAgYXVkaW9TZXNzaW9uLT5zZXRVaWQodWlkKTsKLSAgICAgICAgICAgIGF1ZGlvU2Vzc2lvbi0+c2V0U2lsZW5jZWQoZmFsc2UpOwogICAgICAgICB9Ci0gICAgICAgIGF1ZGlvU2Vzc2lvbi0+Y2hhbmdlT3BlbkNvdW50KDEpOwogICAgICAgICAqaW5wdXRUeXBlID0gQVBJX0lOUFVUX0xFR0FDWTsKLSAgICAgICAgaWYgKCpwb3J0SWQgPT0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSkgewotICAgICAgICAgICAgKnBvcnRJZCA9IEF1ZGlvUG9ydDo6Z2V0TmV4dFVuaXF1ZUlkKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaW5wdXREZXZpY2VzID0gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUoaW5wdXREZXNjLT5tRGV2aWNlKTsKLSAgICAgICAgKnNlbGVjdGVkRGV2aWNlSWQgPSBpbnB1dERldmljZXMuc2l6ZSgpID4gMCA/IGlucHV0RGV2aWNlcy5pdGVtQXQoMCktPmdldElkKCkKLSAgICAgICAgICAgICAgICA6IEFVRElPX1BPUlRfSEFORExFX05PTkU7Ci0gICAgICAgIEFMT0dJKCIlcyByZXVzaW5nIE1NQVAgaW5wdXQgJWQgZm9yIHNlc3Npb24gJWQiLCBfX0ZVTkNUSU9OX18sICppbnB1dCwgc2Vzc2lvbik7CisgICAgICAgIGRldmljZSA9IGlucHV0RGVzYy0+bURldmljZTsKIAotICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIEFMT0dJKCIlcyByZXVzaW5nIE1NQVAgaW5wdXQgJWQgZm9yIHNlc3Npb24gJWQiLCBfX0ZVTkNUSU9OX18sICppbnB1dCwgc2Vzc2lvbik7CisgICAgICAgIGdvdG8gZXhpdDsKICAgICB9CiAKICAgICAqaW5wdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKQEAgLTE1NjcsMTMgKzE3MzEsNiBAQAogCiAgICAgaGFsSW5wdXRTb3VyY2UgPSBpbnB1dFNvdXJjZTsKIAotICAgIC8vIFRPRE86IGNoZWNrIGZvciBleGlzdGluZyBjbGllbnQgZm9yIHRoaXMgcG9ydCBJRAotICAgIGlmICgqcG9ydElkID09IEFVRElPX1BPUlRfSEFORExFX05PTkUpIHsKLSAgICAgICAgKnBvcnRJZCA9IEF1ZGlvUG9ydDo6Z2V0TmV4dFVuaXF1ZUlkKCk7Ci0gICAgfQotCi0gICAgYXVkaW9fZGV2aWNlc190IGRldmljZTsKLQogICAgIGlmIChpbnB1dFNvdXJjZSA9PSBBVURJT19TT1VSQ0VfUkVNT1RFX1NVQk1JWCAmJgogICAgICAgICAgICAgc3RybmNtcChhdHRyLT50YWdzLCAiYWRkcj0iLCBzdHJsZW4oImFkZHI9IikpID09IDApIHsKICAgICAgICAgc3RhdHVzID0gbVBvbGljeU1peGVzLmdldElucHV0TWl4Rm9yQXR0cigqYXR0ciwgJnBvbGljeU1peCk7CkBAIC0xNTg0LDcgKzE3NDEsMTEgQEAKICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVg7CiAgICAgICAgIGFkZHJlc3MgPSBTdHJpbmc4KGF0dHItPnRhZ3MgKyBzdHJsZW4oImFkZHI9IikpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGRldmljZSA9IGdldERldmljZUFuZE1peEZvcklucHV0U291cmNlKGlucHV0U291cmNlLCAmcG9saWN5TWl4KTsKKyAgICAgICAgaWYgKGRldmljZURlc2MgIT0gMCkgeworICAgICAgICAgICAgZGV2aWNlID0gZGV2aWNlRGVzYy0+dHlwZSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlQW5kTWl4Rm9ySW5wdXRTb3VyY2UoaW5wdXRTb3VyY2UsICZwb2xpY3lNaXgpOworICAgICAgICB9CiAgICAgICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKICAgICAgICAgICAgIEFMT0dXKCJnZXRJbnB1dEZvckF0dHIoKSBjb3VsZCBub3QgZmluZCBkZXZpY2UgZm9yIHNvdXJjZSAlZCIsIGlucHV0U291cmNlKTsKICAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKQEAgLTE2MTMsNyArMTc3NCw3IEBACiAKICAgICB9CiAKLSAgICAqaW5wdXQgPSBnZXRJbnB1dEZvckRldmljZShkZXZpY2UsIGFkZHJlc3MsIHNlc3Npb24sIHVpZCwgaW5wdXRTb3VyY2UsCisgICAgKmlucHV0ID0gZ2V0SW5wdXRGb3JEZXZpY2UoZGV2aWNlLCBhZGRyZXNzLCBzZXNzaW9uLCBpbnB1dFNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcsIGZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvbGljeU1peCk7CiAgICAgaWYgKCppbnB1dCA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgewpAQCAtMTYyMSwxNyArMTc4MiwyOCBAQAogICAgICAgICBnb3RvIGVycm9yOwogICAgIH0KIAotICAgIGlucHV0RGV2aWNlcyA9IG1BdmFpbGFibGVJbnB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKGRldmljZSk7Ci0gICAgKnNlbGVjdGVkRGV2aWNlSWQgPSBpbnB1dERldmljZXMuc2l6ZSgpID4gMCA/IGlucHV0RGV2aWNlcy5pdGVtQXQoMCktPmdldElkKCkKLSAgICAgICAgICAgIDogQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKK2V4aXQ6CiAKLSAgICBBTE9HVigiZ2V0SW5wdXRGb3JBdHRyKCkgcmV0dXJucyBpbnB1dCAlZCB0eXBlICVkIHNlbGVjdGVkRGV2aWNlSWQgJWQiLAotICAgICAgICAgICAgKmlucHV0LCAqaW5wdXRUeXBlLCAqc2VsZWN0ZWREZXZpY2VJZCk7CisgICAgaW5wdXREZXZpY2VzID0gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGVNYXNrKGRldmljZSk7CisgICAgKnNlbGVjdGVkRGV2aWNlSWQgPSBpbnB1dERldmljZXMuc2l6ZSgpID4gMCA/IGlucHV0RGV2aWNlcy5pdGVtQXQoMCktPmdldElkKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKKworICAgIGlzU291bmRUcmlnZ2VyID0gaW5wdXRTb3VyY2UgPT0gQVVESU9fU09VUkNFX0hPVFdPUkQgJiYKKyAgICAgICAgbVNvdW5kVHJpZ2dlclNlc3Npb25zLmluZGV4T2ZLZXkoc2Vzc2lvbikgPiAwOworICAgICpwb3J0SWQgPSBBdWRpb1BvcnQ6OmdldE5leHRVbmlxdWVJZCgpOworCisgICAgY2xpZW50RGVzYyA9IG5ldyBSZWNvcmRDbGllbnREZXNjcmlwdG9yKCpwb3J0SWQsIHVpZCwgc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYXR0ciwgKmNvbmZpZywgcmVxdWVzdGVkRGV2aWNlSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRTb3VyY2UsZmxhZ3MsIGlzU291bmRUcmlnZ2VyKTsKKyAgICBpbnB1dERlc2MgPSBtSW5wdXRzLnZhbHVlRm9yKCppbnB1dCk7CisgICAgaW5wdXREZXNjLT5hZGRDbGllbnQoY2xpZW50RGVzYyk7CisKKyAgICBBTE9HVigiZ2V0SW5wdXRGb3JBdHRyKCkgcmV0dXJucyBpbnB1dCAlZCB0eXBlICVkIHNlbGVjdGVkRGV2aWNlSWQgJWQgZm9yIHBvcnQgSUQgJWQiLAorICAgICAgICAgICAgKmlucHV0LCAqaW5wdXRUeXBlLCAqc2VsZWN0ZWREZXZpY2VJZCwgKnBvcnRJZCk7CiAKICAgICByZXR1cm4gTk9fRVJST1I7CiAKIGVycm9yOgotICAgIG1JbnB1dFJvdXRlcy5yZW1vdmVSb3V0ZShzZXNzaW9uKTsKICAgICByZXR1cm4gc3RhdHVzOwogfQogCkBAIC0xNjM5LDcgKzE4MTEsNiBAQAogYXVkaW9faW9faGFuZGxlX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRJbnB1dEZvckRldmljZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4IGFkZHJlc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCkBAIC0xNzAxLDgyICsxODcyLDYgQEAKICAgICAgICAgcmV0dXJuIGlucHV0OwogICAgIH0KIAotICAgIHNwPEF1ZGlvU2Vzc2lvbj4gYXVkaW9TZXNzaW9uID0gbmV3IEF1ZGlvU2Vzc2lvbihzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5mb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5jaGFubmVsX21hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzU291bmRUcmlnZ2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2xpY3lNaXgsIG1wQ2xpZW50SW50ZXJmYWNlKTsKLQotLy8gRklYTUU6IGRpc2FibGUgY29uY3VycmVudCBjYXB0dXJlIHVudGlsIFVJIGlzIHJlYWR5Ci0jaWYgMAotICAgIC8vIHJldXNlIGFuIG9wZW4gaW5wdXQgaWYgcG9zc2libGUKLSAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gcmV1c2VkSW5wdXREZXNjOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUlucHV0cy5zaXplKCk7IGkrKykgewotICAgICAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1JbnB1dHMudmFsdWVBdChpKTsKLSAgICAgICAgLy8gcmV1c2UgaW5wdXQgaWY6Ci0gICAgICAgIC8vIC0gaXQgc2hhcmVzIHRoZSBzYW1lIHByb2ZpbGUKLSAgICAgICAgLy8gICAgICBBTkQKLSAgICAgICAgLy8gLSBpdCBpcyBub3QgYSByZXJvdXRlIHN1Ym1peCBpbnB1dAotICAgICAgICAvLyAgICAgIEFORAotICAgICAgICAvLyAtIGl0IGlzOiBub3QgdXNlZCBmb3Igc291bmQgdHJpZ2dlcgotICAgICAgICAvLyAgICAgICAgICAgICAgICBPUgotICAgICAgICAvLyAgICAgICAgICB1c2VkIGZvciBzb3VuZCB0cmlnZ2VyIGFuZCBhbGwgY2xpZW50cyB1c2UgdGhlIHNhbWUgc2Vzc2lvbiBJRAotICAgICAgICAvLwotICAgICAgICBpZiAoKHByb2ZpbGUgPT0gZGVzYy0+bVByb2ZpbGUpICYmCi0gICAgICAgICAgICAoaXNTb3VuZFRyaWdnZXIgPT0gZGVzYy0+aXNTb3VuZFRyaWdnZXIoKSkgJiYKLSAgICAgICAgICAgICFpc192aXJ0dWFsX2lucHV0X2RldmljZShkZXZpY2UpKSB7Ci0KLSAgICAgICAgICAgIHNwPEF1ZGlvU2Vzc2lvbj4gYXMgPSBkZXNjLT5nZXRBdWRpb1Nlc3Npb24oc2Vzc2lvbik7Ci0gICAgICAgICAgICBpZiAoYXMgIT0gMCkgewotICAgICAgICAgICAgICAgIC8vIGRvIG5vdCBhbGxvdyB1bm1hdGNoaW5nIHByb3BlcnRpZXMgb24gc2FtZSBzZXNzaW9uCi0gICAgICAgICAgICAgICAgaWYgKGFzLT5tYXRjaGVzKGF1ZGlvU2Vzc2lvbikpIHsKLSAgICAgICAgICAgICAgICAgICAgYXMtPmNoYW5nZU9wZW5Db3VudCgxKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBBTE9HVygiZ2V0SW5wdXRGb3JEZXZpY2UoKSByZWNvcmQgd2l0aCBkaWZmZXJlbnQgYXR0cmlidXRlcyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIiBleGlzdHMgZm9yIHNlc3Npb24gJWQiLCBzZXNzaW9uKTsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChpc1NvdW5kVHJpZ2dlcikgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBSZXVzZSB0aGUgYWxyZWFkeSBvcGVuZWQgaW5wdXQgc3RyZWFtIG9uIHRoaXMgcHJvZmlsZSBpZjoKLSAgICAgICAgICAgIC8vIC0gdGhlIG5ldyBjYXB0dXJlIHNvdXJjZSBpcyBiYWNrZ3JvdW5kIE9SCi0gICAgICAgICAgICAvLyAtIHRoZSBwYXRoIHJlcXVlc3RlZCBjb25maWd1cmF0aW9ucyBtYXRjaCBPUgotICAgICAgICAgICAgLy8gLSB0aGUgbmV3IHNvdXJjZSBwcmlvcml0eSBpcyBsZXNzIHRoYW4gdGhlIGhpZ2hlc3Qgc291cmNlIHByaW9yaXR5IG9uIHRoaXMgaW5wdXQKLSAgICAgICAgICAgIC8vIElmIHRoZSBpbnB1dCBzdHJlYW0gY2Fubm90IGJlIHJldXNlZCwgY2xvc2UgaXQgYmVmb3JlIG9wZW5pbmcgYSBuZXcgc3RyZWFtCi0gICAgICAgICAgICAvLyBvbiB0aGUgc2FtZSBwcm9maWxlIGZvciB0aGUgbmV3IGNsaWVudCBzbyB0aGF0IHRoZSByZXF1ZXN0ZWQgcGF0aCBjb25maWd1cmF0aW9uCi0gICAgICAgICAgICAvLyBjYW4gYmUgc2VsZWN0ZWQuCi0gICAgICAgICAgICBpZiAoIWlzQ29uY3VycmVudFNvdXJjZShpbnB1dFNvdXJjZSkgJiYKLSAgICAgICAgICAgICAgICAgICAgKChkZXNjLT5tU2FtcGxpbmdSYXRlICE9IHNhbXBsaW5nUmF0ZSB8fAotICAgICAgICAgICAgICAgICAgICBkZXNjLT5tQ2hhbm5lbE1hc2sgIT0gY29uZmlnLT5jaGFubmVsX21hc2sgfHwKLSAgICAgICAgICAgICAgICAgICAgIWF1ZGlvX2Zvcm1hdHNfbWF0Y2goZGVzYy0+bUZvcm1hdCwgY29uZmlnLT5mb3JtYXQpKSAmJgotICAgICAgICAgICAgICAgICAgICAoc291cmNlX3ByaW9yaXR5KGRlc2MtPmdldEhpZ2hlc3RQcmlvcml0eVNvdXJjZShmYWxzZSAvKmFjdGl2ZU9ubHkqLykpIDwKLSAgICAgICAgICAgICAgICAgICAgIHNvdXJjZV9wcmlvcml0eShpbnB1dFNvdXJjZSkpKSkgewotICAgICAgICAgICAgICAgIHJldXNlZElucHV0RGVzYyA9IGRlc2M7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGRlc2MtPmFkZEF1ZGlvU2Vzc2lvbihzZXNzaW9uLCBhdWRpb1Nlc3Npb24pOwotICAgICAgICAgICAgICAgIEFMT0dWKCIlczogcmV1c2luZyBpbnB1dCAlZCIsIF9fRlVOQ1RJT05fXywgbUlucHV0cy5rZXlBdChpKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1JbnB1dHMua2V5QXQoaSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAocmV1c2VkSW5wdXREZXNjICE9IDApIHsKLSAgICAgICAgQXVkaW9TZXNzaW9uQ29sbGVjdGlvbiBzZXNzaW9ucyA9IHJldXNlZElucHV0RGVzYy0+Z2V0QXVkaW9TZXNzaW9ucyhmYWxzZSAvKmFjdGl2ZU9ubHkqLyk7Ci0gICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgc2Vzc2lvbnMuc2l6ZSgpOyBqKyspIHsKLSAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBjdXJyZW50U2Vzc2lvbiA9IHNlc3Npb25zLmtleUF0KGopOwotICAgICAgICAgICAgc3RvcElucHV0KHJldXNlZElucHV0RGVzYy0+bUlvSGFuZGxlLCBjdXJyZW50U2Vzc2lvbik7Ci0gICAgICAgICAgICByZWxlYXNlSW5wdXQocmV1c2VkSW5wdXREZXNjLT5tSW9IYW5kbGUsIGN1cnJlbnRTZXNzaW9uKTsKLSAgICAgICAgfQotICAgIH0KLSNlbmRpZgotCiAgICAgaWYgKCFwcm9maWxlLT5jYW5PcGVuTmV3SW8oKSkgewogICAgICAgICByZXR1cm4gQVVESU9fSU9fSEFORExFX05PTkU7CiAgICAgfQpAQCAtMTc4OSw3ICsxODg0LDcgQEAKICAgICBsQ29uZmlnLmZvcm1hdCA9IHByb2ZpbGVGb3JtYXQ7CiAKICAgICBpZiAoYWRkcmVzcyA9PSAiIikgewotICAgICAgICBEZXZpY2VWZWN0b3IgaW5wdXREZXZpY2VzID0gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUoZGV2aWNlKTsKKyAgICAgICAgRGV2aWNlVmVjdG9yIGlucHV0RGV2aWNlcyA9IG1BdmFpbGFibGVJbnB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlTWFzayhkZXZpY2UpOwogICAgICAgICAvLyB0aGUgaW5wdXRzIHZlY3RvciBtdXN0IGJlIG9mIHNpemUgPj0gMSwgYnV0IHdlIGRvbid0IHdhbnQgdG8gY3Jhc2ggaGVyZQogICAgICAgICBhZGRyZXNzID0gaW5wdXREZXZpY2VzLnNpemUoKSA+IDAgPyBpbnB1dERldmljZXMuaXRlbUF0KDApLT5tQWRkcmVzcyA6IFN0cmluZzgoIiIpOwogICAgIH0KQEAgLTE4MTIsNyArMTkwNyw2IEBACiAgICAgfQogCiAgICAgaW5wdXREZXNjLT5tUG9saWN5TWl4ID0gcG9saWN5TWl4OwotICAgIGlucHV0RGVzYy0+YWRkQXVkaW9TZXNzaW9uKHNlc3Npb24sIGF1ZGlvU2Vzc2lvbik7CiAKICAgICBhZGRJbnB1dChpbnB1dCwgaW5wdXREZXNjKTsKICAgICBtcENsaWVudEludGVyZmFjZS0+b25BdWRpb1BvcnRMaXN0VXBkYXRlKCk7CkBAIC0xODI4LDM5ICsxOTIyLDYgQEAKICAgICAgICAgICAgIChzb3VyY2UgPT0gQVVESU9fU09VUkNFX0ZNX1RVTkVSKTsKIH0KIAotYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OmlzQ29uY3VyZW50Q2FwdHVyZUFsbG93ZWQoY29uc3Qgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+JiBpbnB1dERlc2MsCi0gICAgICAgIGNvbnN0IHNwPEF1ZGlvU2Vzc2lvbj4mIGF1ZGlvU2Vzc2lvbikKLXsKLSAgICAvLyBEbyBub3QgYWxsb3cgY2FwdHVyZSBpZiBhbiBhY3RpdmUgdm9pY2UgY2FsbCBpcyB1c2luZyBhIHNvZnR3YXJlIHBhdGNoIGFuZAotICAgIC8vIHRoZSBjYWxsIFRYIHNvdXJjZSBkZXZpY2UgaXMgb24gdGhlIHNhbWUgSFcgbW9kdWxlLgotICAgIC8vIEZJWE1FOiB3b3VsZCBiZSBiZXR0ZXIgdG8gcmVmaW5lIHRvIG9ubHkgaW5wdXRzIHdob3NlIHByb2ZpbGUgY29ubmVjdHMgdG8gdGhlCi0gICAgLy8gY2FsbCBUWCBkZXZpY2UgYnV0IHRoaXMgaW5mb3JtYXRpb24gaXMgbm90IGluIHRoZSBhdWRpbyBwYXRjaAotICAgIGlmIChtQ2FsbFR4UGF0Y2ggIT0gMCAmJgotICAgICAgICBpbnB1dERlc2MtPmdldE1vZHVsZUhhbmRsZSgpID09IG1DYWxsVHhQYXRjaC0+bVBhdGNoLnNvdXJjZXNbMF0uZXh0LmRldmljZS5od19tb2R1bGUpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8vIHN0YXJ0aW5nIGNvbmN1cnJlbnQgY2FwdHVyZSBpcyBlbmFibGVkIGlmOgotICAgIC8vIDEpIGNhcHR1cmluZyBmb3IgcmUtcm91dGluZwotICAgIC8vIDIpIGNhcHR1cmluZyBmb3IgSE9UV09SRCBzb3VyY2UKLSAgICAvLyAzKSBjYXB0dXJpbmcgZm9yIEZNIFRVTkVSIHNvdXJjZQotICAgIC8vIDMpIEFsbCBvdGhlciBhY3RpdmUgY2FwdHVyZXMgYXJlIGVpdGhlciBmb3IgcmUtcm91dGluZyBvciBIT1RXT1JECi0KLSAgICBpZiAoaXNfdmlydHVhbF9pbnB1dF9kZXZpY2UoaW5wdXREZXNjLT5tRGV2aWNlKSB8fAotICAgICAgICAgICAgaXNDb25jdXJyZW50U291cmNlKGF1ZGlvU2Vzc2lvbi0+aW5wdXRTb3VyY2UoKSkpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgZm9yIChjb25zdCBhdXRvJiBhY3RpdmVJbnB1dCA6IG1JbnB1dHMuZ2V0QWN0aXZlSW5wdXRzKCkpIHsKLSAgICAgICAgaWYgKCFpc0NvbmN1cnJlbnRTb3VyY2UoYWN0aXZlSW5wdXQtPmlucHV0U291cmNlKHRydWUpKSAmJgotICAgICAgICAgICAgICAgICFpc192aXJ0dWFsX2lucHV0X2RldmljZShhY3RpdmVJbnB1dC0+bURldmljZSkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotfQotCiAvLyBGSVhNRTogcmVtb3ZlIHdoZW4gY29uY3VycmVudCBjYXB0dXJlIGlzIHJlYWR5LiBUaGlzIGlzIGEgaGFjayB0byB3b3JrIGFyb3VuZCBidWcgYi82MzA4MzUzNy4KIGJvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzb3VuZFRyaWdnZXJTdXBwb3J0c0NvbmN1cnJlbnRDYXB0dXJlKCkgewogICAgIGlmICghbUhhc0NvbXB1dGVkU291bmRUcmlnZ2VyU3VwcG9ydHNDb25jdXJyZW50Q2FwdHVyZSkgewpAQCAtMTg5Niw0NCArMTk1NywzMSBAQAogfQogCiAKLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c3RhcnRJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c3RhcnRJbnB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHNpbGVuY2VkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmN1cnJlbmN5X3R5cGVfX21hc2tfdCAqY29uY3VycmVuY3kpCiB7Ci0KLSAgICBBTE9HVigiQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzdGFydElucHV0KGlucHV0OiVkLCBzZXNzaW9uOiVkLCBzaWxlbmNlZDolZCwgY29uY3VycmVuY3k6JWQpIiwKLSAgICAgICAgICAgIGlucHV0LCBzZXNzaW9uLCBzaWxlbmNlZCwgKmNvbmN1cnJlbmN5KTsKLQogICAgICpjb25jdXJyZW5jeSA9IEFQSV9JTlBVVF9DT05DVVJSRU5DWV9OT05FOwogCi0gICAgc3NpemVfdCBpbmRleCA9IG1JbnB1dHMuaW5kZXhPZktleShpbnB1dCk7Ci0gICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICBBTE9HVygic3RhcnRJbnB1dCgpIHVua25vd24gaW5wdXQgJWQiLCBpbnB1dCk7CisgICAgQUxPR1YoIiVzIHBvcnRJZCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydElkKTsKKworICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSBtSW5wdXRzLmdldElucHV0Rm9yQ2xpZW50KHBvcnRJZCk7CisgICAgaWYgKGlucHV0RGVzYyA9PSAwKSB7CisgICAgICAgIEFMT0dXKCIlcyBubyBpbnB1dCBmb3IgY2xpZW50ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0SWQpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KLSAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gbUlucHV0cy52YWx1ZUF0KGluZGV4KTsKLQotICAgIHNwPEF1ZGlvU2Vzc2lvbj4gYXVkaW9TZXNzaW9uID0gaW5wdXREZXNjLT5nZXRBdWRpb1Nlc3Npb24oc2Vzc2lvbik7Ci0gICAgaWYgKGF1ZGlvU2Vzc2lvbiA9PSAwKSB7Ci0gICAgICAgIEFMT0dXKCJzdGFydElucHV0KCkgdW5rbm93biBzZXNzaW9uICVkIG9uIGlucHV0ICVkIiwgc2Vzc2lvbiwgaW5wdXQpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLQotLy8gRklYTUU6IGRpc2FibGUgY29uY3VycmVudCBjYXB0dXJlIHVudGlsIFVJIGlzIHJlYWR5Ci0jaWYgMAotICAgIGlmICghaXNDb25jdXJlbnRDYXB0dXJlQWxsb3dlZChpbnB1dERlc2MsIGF1ZGlvU2Vzc2lvbikpIHsKLSAgICAgICAgQUxPR1coInN0YXJ0SW5wdXQoJWQpIGZhaWxlZDogb3RoZXIgaW5wdXQgYWxyZWFkeSBzdGFydGVkIiwgaW5wdXQpOworICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0ID0gaW5wdXREZXNjLT5tSW9IYW5kbGU7CisgICAgc3A8UmVjb3JkQ2xpZW50RGVzY3JpcHRvcj4gY2xpZW50ID0gaW5wdXREZXNjLT5nZXRDbGllbnQocG9ydElkKTsKKyAgICBpZiAoY2xpZW50LT5hY3RpdmUoKSkgeworICAgICAgICBBTE9HVygiJXMgaW5wdXQgJWQgY2xpZW50ICVkIGFscmVhZHkgc3RhcnRlZCIsIF9fRlVOQ1RJT05fXywgaW5wdXQsIGNsaWVudC0+cG9ydElkKCkpOwogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCi0gICAgaWYgKGlzSW5DYWxsKCkpIHsKLSAgICAgICAgKmNvbmN1cnJlbmN5IHw9IEFQSV9JTlBVVF9DT05DVVJSRU5DWV9DQUxMOwotICAgIH0KLSAgICBpZiAobUlucHV0cy5hY3RpdmVJbnB1dHNDb3VudE9uRGV2aWNlcygpICE9IDApIHsKLSAgICAgICAgKmNvbmN1cnJlbmN5IHw9IEFQSV9JTlBVVF9DT05DVVJSRU5DWV9DQVBUVVJFOwotICAgIH0KLSNlbHNlCisgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24gPSBjbGllbnQtPnNlc3Npb24oKTsKKworICAgIEFMT0dWKCIlcyBpbnB1dDolZCwgc2Vzc2lvbjolZCwgc2lsZW5jZWQ6JWQsIGNvbmN1cnJlbmN5OiVkKSIsCisgICAgICAgIF9fRlVOQ1RJT05fXywgaW5wdXQsIHNlc3Npb24sIHNpbGVuY2VkLCAqY29uY3VycmVuY3kpOworCiAgICAgaWYgKCFpc192aXJ0dWFsX2lucHV0X2RldmljZShpbnB1dERlc2MtPm1EZXZpY2UpKSB7CiAgICAgICAgIGlmIChtQ2FsbFR4UGF0Y2ggIT0gMCAmJgogICAgICAgICAgICAgaW5wdXREZXNjLT5nZXRNb2R1bGVIYW5kbGUoKSA9PSBtQ2FsbFR4UGF0Y2gtPm1QYXRjaC5zb3VyY2VzWzBdLmV4dC5kZXZpY2UuaHdfbW9kdWxlKSB7CkBAIC0xOTQ5LDUwICsxOTk3LDQ4IEBACiAgICAgICAgIC8vIGZhdm9yIG9mIHRoZSBuZXcgb25lIC0gIlRoZXJlIGNhbiBiZSBvbmx5IG9uZSIgVE0KICAgICAgICAgaWYgKCFzaWxlbmNlZCkgewogICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBhY3RpdmVEZXNjIDogYWN0aXZlSW5wdXRzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKChhdWRpb1Nlc3Npb24tPmZsYWdzKCkgJiBBVURJT19JTlBVVF9GTEFHX01NQVBfTk9JUlEpICE9IDAgJiYKKyAgICAgICAgICAgICAgICBpZiAoKGFjdGl2ZURlc2MtPmdldEF1ZGlvUG9ydCgpLT5nZXRGbGFncygpICYgQVVESU9fSU5QVVRfRkxBR19NTUFQX05PSVJRKSAhPSAwICYmCiAgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVEZXNjLT5nZXRJZCgpID09IGlucHV0RGVzYy0+Z2V0SWQoKSkgewogICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgQXVkaW9TZXNzaW9uQ29sbGVjdGlvbiBhY3RpdmVTZXNzaW9ucyA9IGFjdGl2ZURlc2MtPmdldEF1ZGlvU2Vzc2lvbnMoCi0gICAgICAgICAgICAgICAgICAgICAgICB0cnVlIC8qYWN0aXZlT25seSovKTsKLSAgICAgICAgICAgICAgICBzcDxBdWRpb1Nlc3Npb24+IGFjdGl2ZVNlc3Npb24gPSBhY3RpdmVTZXNzaW9ucy52YWx1ZUF0KDApOwotICAgICAgICAgICAgICAgIGlmIChhY3RpdmVTZXNzaW9uLT5pc1NpbGVuY2VkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgYWN0aXZlSW5wdXQgPSBhY3RpdmVEZXNjLT5tSW9IYW5kbGU7Ci0gICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBhY3RpdmVTZXNzaW9uSWQgPSBhY3RpdmVTZXNzaW9uLT5zZXNzaW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIHN0b3BJbnB1dChhY3RpdmVJbnB1dCwgYWN0aXZlU2Vzc2lvbklkKTsKLSAgICAgICAgICAgICAgICAgICAgcmVsZWFzZUlucHV0KGFjdGl2ZUlucHV0LCBhY3RpdmVTZXNzaW9uSWQpOwotICAgICAgICAgICAgICAgICAgICBBTE9HVigic3RhcnRJbnB1dCglZCkgc3RvcHBpbmcgc2lsZW5jZWQgaW5wdXQgJWQiLCBpbnB1dCwgYWN0aXZlSW5wdXQpOwotICAgICAgICAgICAgICAgICAgICBhY3RpdmVJbnB1dHMgPSBtSW5wdXRzLmdldEFjdGl2ZUlucHV0cygpOworICAgICAgICAgICAgICAgIFJlY29yZENsaWVudFZlY3RvciBhY3RpdmVDbGllbnRzID0gYWN0aXZlRGVzYy0+Y2xpZW50c0xpc3QodHJ1ZSAvKmFjdGl2ZU9ubHkqLyk7CisgICAgICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBhY3RpdmVDbGllbnQgOiBhY3RpdmVDbGllbnRzKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChhY3RpdmVDbGllbnQtPmlzU2lsZW5jZWQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2VDbGllbnQoYWN0aXZlQ2xpZW50LT5wb3J0SWQoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiJXMgY2xpZW50ICVkIHN0b3BwaW5nIHNpbGVuY2VkIGNsaWVudCAlZCIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnRJZCwgYWN0aXZlQ2xpZW50LT5wb3J0SWQoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVJbnB1dHMgPSBtSW5wdXRzLmdldEFjdGl2ZUlucHV0cygpOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBhY3RpdmVEZXNjIDogYWN0aXZlSW5wdXRzKSB7Ci0gICAgICAgICAgICBpZiAoKGF1ZGlvU2Vzc2lvbi0+ZmxhZ3MoKSAmIEFVRElPX0lOUFVUX0ZMQUdfTU1BUF9OT0lSUSkgIT0gMCAmJgorICAgICAgICAgICAgaWYgKChjbGllbnQtPmZsYWdzKCkgJiBBVURJT19JTlBVVF9GTEFHX01NQVBfTk9JUlEpICE9IDAgJiYKICAgICAgICAgICAgICAgICAgICAgYWN0aXZlRGVzYy0+Z2V0SWQoKSA9PSBpbnB1dERlc2MtPmdldElkKCkpIHsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgYXVkaW9fc291cmNlX3QgYWN0aXZlU291cmNlID0gYWN0aXZlRGVzYy0+aW5wdXRTb3VyY2UodHJ1ZSk7Ci0gICAgICAgICAgICBpZiAoYXVkaW9TZXNzaW9uLT5pbnB1dFNvdXJjZSgpID09IEFVRElPX1NPVVJDRV9IT1RXT1JEKSB7CisgICAgICAgICAgICBpZiAoY2xpZW50LT5zb3VyY2UoKSA9PSBBVURJT19TT1VSQ0VfSE9UV09SRCkgewogICAgICAgICAgICAgICAgIGlmIChhY3RpdmVTb3VyY2UgPT0gQVVESU9fU09VUkNFX0hPVFdPUkQpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGl2ZURlc2MtPmhhc1ByZWVtcHRlZFNlc3Npb24oc2Vzc2lvbikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJzdGFydElucHV0KCVkKSBmYWlsZWQgZm9yIEhPVFdPUkQ6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm90aGVyIGlucHV0ICVkIGFscmVhZHkgc3RhcnRlZCBmb3IgSE9UV09SRCIsCisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygiJXMgaW5wdXQgJWQgZmFpbGVkIGZvciBIT1RXT1JEOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvdGhlciBpbnB1dCAlZCBhbHJlYWR5IHN0YXJ0ZWQgZm9yIEhPVFdPUkQiLCBfX0ZVTkNUSU9OX18sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dCwgYWN0aXZlRGVzYy0+bUlvSGFuZGxlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICpjb25jdXJyZW5jeSB8PSBBUElfSU5QVVRfQ09OQ1VSUkVOQ1lfSE9UV09SRDsKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJzdGFydElucHV0KCVkKSBmYWlsZWQgZm9yIEhPVFdPUkQ6IG90aGVyIGlucHV0ICVkIGFscmVhZHkgc3RhcnRlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LCBhY3RpdmVEZXNjLT5tSW9IYW5kbGUpOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiJXMgaW5wdXQgJWQgZmFpbGVkIGZvciBIT1RXT1JEOiBvdGhlciBpbnB1dCAlZCBhbHJlYWR5IHN0YXJ0ZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBpbnB1dCwgYWN0aXZlRGVzYy0+bUlvSGFuZGxlKTsKICAgICAgICAgICAgICAgICAgICAgKmNvbmN1cnJlbmN5IHw9IEFQSV9JTlBVVF9DT05DVVJSRU5DWV9DQVBUVVJFOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBpZiAoYWN0aXZlU291cmNlICE9IEFVRElPX1NPVVJDRV9IT1RXT1JEKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dXKCJzdGFydElucHV0KCVkKSBmYWlsZWQ6IG90aGVyIGlucHV0ICVkIGFscmVhZHkgc3RhcnRlZCIsCisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCIlcyBpbnB1dCAlZCBmYWlsZWQ6IG90aGVyIGlucHV0ICVkIGFscmVhZHkgc3RhcnRlZCIsIF9fRlVOQ1RJT05fXywKICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQsIGFjdGl2ZURlc2MtPm1Jb0hhbmRsZSk7CiAgICAgICAgICAgICAgICAgICAgICpjb25jdXJyZW5jeSB8PSBBUElfSU5QVVRfQ09OQ1VSUkVOQ1lfQ0FQVFVSRTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwpAQCAtMjAxMSwxOTggKzIwNTcsMTc4IEBACiAgICAgICAgICAgICBpZiAoYWxsb3dDb25jdXJyZW50V2l0aFNvdW5kVHJpZ2dlciAmJiBhY3RpdmVEZXNjLT5pc1NvdW5kVHJpZ2dlcigpKSB7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IGFjdGl2ZVNvdXJjZSA9IGFjdGl2ZURlc2MtPmlucHV0U291cmNlKHRydWUpOwotICAgICAgICAgICAgaWYgKGFjdGl2ZVNvdXJjZSA9PSBBVURJT19TT1VSQ0VfSE9UV09SRCkgewotICAgICAgICAgICAgICAgIEF1ZGlvU2Vzc2lvbkNvbGxlY3Rpb24gYWN0aXZlU2Vzc2lvbnMgPQotICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlRGVzYy0+Z2V0QXVkaW9TZXNzaW9ucyh0cnVlIC8qYWN0aXZlT25seSovKTsKLSAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3QgYWN0aXZlU2Vzc2lvbiA9IGFjdGl2ZVNlc3Npb25zLmtleUF0KDApOwotICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGFjdGl2ZUhhbmRsZSA9IGFjdGl2ZURlc2MtPm1Jb0hhbmRsZTsKKyAgICAgICAgICAgIFJlY29yZENsaWVudFZlY3RvciBhY3RpdmVIb3R3b3JkQ2xpZW50cyA9CisgICAgICAgICAgICAgICAgYWN0aXZlRGVzYy0+Y2xpZW50c0xpc3QodHJ1ZSwgQVVESU9fU09VUkNFX0hPVFdPUkQpOworICAgICAgICAgICAgaWYgKGFjdGl2ZUhvdHdvcmRDbGllbnRzLnNpemUoKSA+IDApIHsKICAgICAgICAgICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9fc2Vzc2lvbl90PiBzZXNzaW9ucyA9IGFjdGl2ZURlc2MtPmdldFByZWVtcHRlZFNlc3Npb25zKCk7Ci0gICAgICAgICAgICAgICAgKmNvbmN1cnJlbmN5IHw9IEFQSV9JTlBVVF9DT05DVVJSRU5DWV9QUkVFTVBUOwotICAgICAgICAgICAgICAgIHNlc3Npb25zLmFkZChhY3RpdmVTZXNzaW9uKTsKKworICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgYWN0aXZlQ2xpZW50IDogYWN0aXZlSG90d29yZENsaWVudHMpIHsKKyAgICAgICAgICAgICAgICAgICAgKmNvbmN1cnJlbmN5IHw9IEFQSV9JTlBVVF9DT05DVVJSRU5DWV9QUkVFTVBUOworICAgICAgICAgICAgICAgICAgICBzZXNzaW9ucy5hZGQoYWN0aXZlQ2xpZW50LT5zZXNzaW9uKCkpOworICAgICAgICAgICAgICAgICAgICBjbG9zZUNsaWVudChhY3RpdmVDbGllbnQtPnBvcnRJZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIiVzIGlucHV0ICVkIGZvciBIT1RXT1JEIHByZWVtcHRpbmcgSE9UV09SRCBpbnB1dCAlZCIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQsIGFjdGl2ZURlc2MtPm1Jb0hhbmRsZSk7CisgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgaW5wdXREZXNjLT5zZXRQcmVlbXB0ZWRTZXNzaW9ucyhzZXNzaW9ucyk7Ci0gICAgICAgICAgICAgICAgc3RvcElucHV0KGFjdGl2ZUhhbmRsZSwgYWN0aXZlU2Vzc2lvbik7Ci0gICAgICAgICAgICAgICAgcmVsZWFzZUlucHV0KGFjdGl2ZUhhbmRsZSwgYWN0aXZlU2Vzc2lvbik7Ci0gICAgICAgICAgICAgICAgQUxPR1YoInN0YXJ0SW5wdXQoJWQpIGZvciBIT1RXT1JEIHByZWVtcHRpbmcgSE9UV09SRCBpbnB1dCAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgaW5wdXQsIGFjdGl2ZURlc2MtPm1Jb0hhbmRsZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0jZW5kaWYKIAogICAgIC8vIE1ha2Ugc3VyZSB3ZSBzdGFydCB3aXRoIHRoZSBjb3JyZWN0IHNpbGVuY2Ugc3RhdGUKLSAgICBhdWRpb1Nlc3Npb24tPnNldFNpbGVuY2VkKHNpbGVuY2VkKTsKKyAgICBjbGllbnQtPnNldFNpbGVuY2VkKHNpbGVuY2VkKTsKIAogICAgIC8vIGluY3JlbWVudCBhY3Rpdml0eSBjb3VudCBiZWZvcmUgY2FsbGluZyBnZXROZXdJbnB1dERldmljZSgpIGJlbG93IGFzIG9ubHkgYWN0aXZlIHNlc3Npb25zCiAgICAgLy8gYXJlIGNvbnNpZGVyZWQgZm9yIGRldmljZSBzZWxlY3Rpb24KLSAgICBhdWRpb1Nlc3Npb24tPmNoYW5nZUFjdGl2ZUNvdW50KDEpOworICAgIGlucHV0RGVzYy0+c2V0Q2xpZW50QWN0aXZlKGNsaWVudCwgdHJ1ZSk7CiAKLSAgICAvLyBSb3V0aW5nPwotICAgIG1JbnB1dFJvdXRlcy5pbmNSb3V0ZUFjdGl2aXR5KHNlc3Npb24pOworICAgIC8vIGluZGljYXRlIGFjdGl2ZSBjYXB0dXJlIHRvIHNvdW5kIHRyaWdnZXIgc2VydmljZSBpZiBzdGFydGluZyBjYXB0dXJlIGZyb20gYSBtaWMgb24KKyAgICAvLyBwcmltYXJ5IEhXIG1vZHVsZQorICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBnZXROZXdJbnB1dERldmljZShpbnB1dERlc2MpOworICAgIHNldElucHV0RGV2aWNlKGlucHV0LCBkZXZpY2UsIHRydWUgLyogZm9yY2UgKi8pOwogCi0gICAgaWYgKGF1ZGlvU2Vzc2lvbi0+YWN0aXZlQ291bnQoKSA9PSAxIHx8IG1JbnB1dFJvdXRlcy5nZXRBbmRDbGVhclJvdXRlQ2hhbmdlZChzZXNzaW9uKSkgewotICAgICAgICAvLyBpbmRpY2F0ZSBhY3RpdmUgY2FwdHVyZSB0byBzb3VuZCB0cmlnZ2VyIHNlcnZpY2UgaWYgc3RhcnRpbmcgY2FwdHVyZSBmcm9tIGEgbWljIG9uCi0gICAgICAgIC8vIHByaW1hcnkgSFcgbW9kdWxlCi0gICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBnZXROZXdJbnB1dERldmljZShpbnB1dERlc2MpOwotICAgICAgICBzZXRJbnB1dERldmljZShpbnB1dCwgZGV2aWNlLCB0cnVlIC8qIGZvcmNlICovKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBpbnB1dERlc2MtPnN0YXJ0KCk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICBpbnB1dERlc2MtPnNldENsaWVudEFjdGl2ZShjbGllbnQsIGZhbHNlKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CiAKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gaW5wdXREZXNjLT5zdGFydCgpOwotICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBtSW5wdXRSb3V0ZXMuZGVjUm91dGVBY3Rpdml0eShzZXNzaW9uKTsKLSAgICAgICAgICAgIGF1ZGlvU2Vzc2lvbi0+Y2hhbmdlQWN0aXZlQ291bnQoLTEpOwotICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICBpZiAoaW5wdXREZXNjLT5hY3RpdmVDb3VudCgpICA9PSAxKSB7CisgICAgICAgIC8vIGlmIGlucHV0IG1hcHMgdG8gYSBkeW5hbWljIHBvbGljeSB3aXRoIGFuIGFjdGl2aXR5IGxpc3RlbmVyLCBub3RpZnkgb2Ygc3RhdGUgY2hhbmdlCisgICAgICAgIGlmICgoaW5wdXREZXNjLT5tUG9saWN5TWl4ICE9IE5VTEwpCisgICAgICAgICAgICAgICAgJiYgKChpbnB1dERlc2MtPm1Qb2xpY3lNaXgtPm1DYkZsYWdzICYgQXVkaW9NaXg6OmtDYkZsYWdOb3RpZnlBY3Rpdml0eSkgIT0gMCkpIHsKKyAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vbkR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZShpbnB1dERlc2MtPm1Qb2xpY3lNaXgtPm1EZXZpY2VBZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICBNSVhfU1RBVEVfTUlYSU5HKTsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChpbnB1dERlc2MtPmdldEF1ZGlvU2Vzc2lvbkNvdW50KHRydWUvKmFjdGl2ZU9ubHkqLykgPT0gMSkgewotICAgICAgICAgICAgLy8gaWYgaW5wdXQgbWFwcyB0byBhIGR5bmFtaWMgcG9saWN5IHdpdGggYW4gYWN0aXZpdHkgbGlzdGVuZXIsIG5vdGlmeSBvZiBzdGF0ZSBjaGFuZ2UKLSAgICAgICAgICAgIGlmICgoaW5wdXREZXNjLT5tUG9saWN5TWl4ICE9IE5VTEwpCi0gICAgICAgICAgICAgICAgICAgICYmICgoaW5wdXREZXNjLT5tUG9saWN5TWl4LT5tQ2JGbGFncyAmIEF1ZGlvTWl4OjprQ2JGbGFnTm90aWZ5QWN0aXZpdHkpICE9IDApKSB7Ci0gICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPm9uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKGlucHV0RGVzYy0+bVBvbGljeU1peC0+bURldmljZUFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICBNSVhfU1RBVEVfTUlYSU5HKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgYXVkaW9fZGV2aWNlc190IHByaW1hcnlJbnB1dERldmljZXMgPSBhdmFpbGFibGVQcmltYXJ5SW5wdXREZXZpY2VzKCk7CisgICAgICAgIGlmICgoKGRldmljZSAmIHByaW1hcnlJbnB1dERldmljZXMgJiB+QVVESU9fREVWSUNFX0JJVF9JTikgIT0gMCkgJiYKKyAgICAgICAgICAgICAgICBtSW5wdXRzLmFjdGl2ZUlucHV0c0NvdW50T25EZXZpY2VzKHByaW1hcnlJbnB1dERldmljZXMpID09IDEpIHsKKyAgICAgICAgICAgIFNvdW5kVHJpZ2dlcjo6c2V0Q2FwdHVyZVN0YXRlKHRydWUpOworICAgICAgICB9CiAKLSAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBwcmltYXJ5SW5wdXREZXZpY2VzID0gYXZhaWxhYmxlUHJpbWFyeUlucHV0RGV2aWNlcygpOwotICAgICAgICAgICAgaWYgKCgoZGV2aWNlICYgcHJpbWFyeUlucHV0RGV2aWNlcyAmIH5BVURJT19ERVZJQ0VfQklUX0lOKSAhPSAwKSAmJgotICAgICAgICAgICAgICAgICAgICBtSW5wdXRzLmFjdGl2ZUlucHV0c0NvdW50T25EZXZpY2VzKHByaW1hcnlJbnB1dERldmljZXMpID09IDEpIHsKLSAgICAgICAgICAgICAgICBTb3VuZFRyaWdnZXI6OnNldENhcHR1cmVTdGF0ZSh0cnVlKTsKKyAgICAgICAgLy8gYXV0b21hdGljYWxseSBlbmFibGUgdGhlIHJlbW90ZSBzdWJtaXggb3V0cHV0IHdoZW4gaW5wdXQgaXMgc3RhcnRlZCBpZiBub3QKKyAgICAgICAgLy8gdXNlZCBieSBhIHBvbGljeSBtaXggb2YgdHlwZSBNSVhfVFlQRV9SRUNPUkRFUlMKKyAgICAgICAgLy8gRm9yIHJlbW90ZSBzdWJtaXggKGEgdmlydHVhbCBkZXZpY2UpLCB3ZSBvcGVuIG9ubHkgb25lIGlucHV0IHBlciBjYXB0dXJlIHJlcXVlc3QuCisgICAgICAgIGlmIChhdWRpb19pc19yZW1vdGVfc3VibWl4X2RldmljZShpbnB1dERlc2MtPm1EZXZpY2UpKSB7CisgICAgICAgICAgICBTdHJpbmc4IGFkZHJlc3MgPSBTdHJpbmc4KCIiKTsKKyAgICAgICAgICAgIGlmIChpbnB1dERlc2MtPm1Qb2xpY3lNaXggPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGFkZHJlc3MgPSBTdHJpbmc4KCIwIik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGlucHV0RGVzYy0+bVBvbGljeU1peC0+bU1peFR5cGUgPT0gTUlYX1RZUEVfUExBWUVSUykgeworICAgICAgICAgICAgICAgIGFkZHJlc3MgPSBpbnB1dERlc2MtPm1Qb2xpY3lNaXgtPm1EZXZpY2VBZGRyZXNzOwogICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBhdXRvbWF0aWNhbGx5IGVuYWJsZSB0aGUgcmVtb3RlIHN1Ym1peCBvdXRwdXQgd2hlbiBpbnB1dCBpcyBzdGFydGVkIGlmIG5vdAotICAgICAgICAgICAgLy8gdXNlZCBieSBhIHBvbGljeSBtaXggb2YgdHlwZSBNSVhfVFlQRV9SRUNPUkRFUlMKLSAgICAgICAgICAgIC8vIEZvciByZW1vdGUgc3VibWl4IChhIHZpcnR1YWwgZGV2aWNlKSwgd2Ugb3BlbiBvbmx5IG9uZSBpbnB1dCBwZXIgY2FwdHVyZSByZXF1ZXN0LgotICAgICAgICAgICAgaWYgKGF1ZGlvX2lzX3JlbW90ZV9zdWJtaXhfZGV2aWNlKGlucHV0RGVzYy0+bURldmljZSkpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmc4IGFkZHJlc3MgPSBTdHJpbmc4KCIiKTsKLSAgICAgICAgICAgICAgICBpZiAoaW5wdXREZXNjLT5tUG9saWN5TWl4ID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkcmVzcyA9IFN0cmluZzgoIjAiKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlucHV0RGVzYy0+bVBvbGljeU1peC0+bU1peFR5cGUgPT0gTUlYX1RZUEVfUExBWUVSUykgewotICAgICAgICAgICAgICAgICAgICBhZGRyZXNzID0gaW5wdXREZXNjLT5tUG9saWN5TWl4LT5tRGV2aWNlQWRkcmVzczsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGFkZHJlc3MgIT0gIiIpIHsKLSAgICAgICAgICAgICAgICAgICAgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlSW50KEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLCAicmVtb3RlLXN1Ym1peCIpOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChhZGRyZXNzICE9ICIiKSB7CisgICAgICAgICAgICAgICAgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlSW50KEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcywgInJlbW90ZS1zdWJtaXgiKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIAotICAgIEFMT0dWKCJBdWRpb1BvbGljeU1hbmFnZXI6OnN0YXJ0SW5wdXQoKSBpbnB1dCBzb3VyY2UgPSAlZCIsIGF1ZGlvU2Vzc2lvbi0+aW5wdXRTb3VyY2UoKSk7CisgICAgQUxPR1YoIiVzIGlucHV0ICVkIHNvdXJjZSA9ICVkIGV4aXQiLCBfX0ZVTkNUSU9OX18sIGlucHV0LCBjbGllbnQtPnNvdXJjZSgpKTsKIAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzdG9wSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c3RvcElucHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogewotICAgIEFMT0dWKCJzdG9wSW5wdXQoKSBpbnB1dCAlZCIsIGlucHV0KTsKLSAgICBzc2l6ZV90IGluZGV4ID0gbUlucHV0cy5pbmRleE9mS2V5KGlucHV0KTsKLSAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIEFMT0dXKCJzdG9wSW5wdXQoKSB1bmtub3duIGlucHV0ICVkIiwgaW5wdXQpOworICAgIEFMT0dWKCIlcyBwb3J0SWQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnRJZCk7CisKKyAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gbUlucHV0cy5nZXRJbnB1dEZvckNsaWVudChwb3J0SWQpOworICAgIGlmIChpbnB1dERlc2MgPT0gMCkgeworICAgICAgICBBTE9HVygiJXMgbm8gaW5wdXQgZm9yIGNsaWVudCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydElkKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9Ci0gICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGlucHV0RGVzYyA9IG1JbnB1dHMudmFsdWVBdChpbmRleCk7Ci0KLSAgICBzcDxBdWRpb1Nlc3Npb24+IGF1ZGlvU2Vzc2lvbiA9IGlucHV0RGVzYy0+Z2V0QXVkaW9TZXNzaW9uKHNlc3Npb24pOwotICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgQUxPR1coInN0b3BJbnB1dCgpIHVua25vd24gc2Vzc2lvbiAlZCBvbiBpbnB1dCAlZCIsIHNlc3Npb24sIGlucHV0KTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0KLSAgICBpZiAoYXVkaW9TZXNzaW9uLT5hY3RpdmVDb3VudCgpID09IDApIHsKLSAgICAgICAgQUxPR1coInN0b3BJbnB1dCgpIGlucHV0ICVkIGFscmVhZHkgc3RvcHBlZCIsIGlucHV0KTsKKyAgICBhdWRpb19pb19oYW5kbGVfdCBpbnB1dCA9IGlucHV0RGVzYy0+bUlvSGFuZGxlOworICAgIHNwPFJlY29yZENsaWVudERlc2NyaXB0b3I+IGNsaWVudCA9IGlucHV0RGVzYy0+Z2V0Q2xpZW50KHBvcnRJZCk7CisgICAgaWYgKCFjbGllbnQtPmFjdGl2ZSgpKSB7CisgICAgICAgIEFMT0dXKCIlcyBpbnB1dCAlZCBjbGllbnQgJWQgYWxyZWFkeSBzdG9wcGVkIiwgX19GVU5DVElPTl9fLCBpbnB1dCwgY2xpZW50LT5wb3J0SWQoKSk7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKLSAgICBhdWRpb1Nlc3Npb24tPmNoYW5nZUFjdGl2ZUNvdW50KC0xKTsKKyAgICBpbnB1dERlc2MtPnNldENsaWVudEFjdGl2ZShjbGllbnQsIGZhbHNlKTsKIAotICAgIC8vIFJvdXRpbmc/Ci0gICAgbUlucHV0Um91dGVzLmRlY1JvdXRlQWN0aXZpdHkoc2Vzc2lvbik7Ci0KLSAgICBpZiAoYXVkaW9TZXNzaW9uLT5hY3RpdmVDb3VudCgpID09IDApIHsKLSAgICAgICAgaW5wdXREZXNjLT5zdG9wKCk7Ci0gICAgICAgIGlmIChpbnB1dERlc2MtPmlzQWN0aXZlKCkpIHsKLSAgICAgICAgICAgIHNldElucHV0RGV2aWNlKGlucHV0LCBnZXROZXdJbnB1dERldmljZShpbnB1dERlc2MpLCBmYWxzZSAvKiBmb3JjZSAqLyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBpZiBpbnB1dCBtYXBzIHRvIGEgZHluYW1pYyBwb2xpY3kgd2l0aCBhbiBhY3Rpdml0eSBsaXN0ZW5lciwgbm90aWZ5IG9mIHN0YXRlIGNoYW5nZQotICAgICAgICAgICAgaWYgKChpbnB1dERlc2MtPm1Qb2xpY3lNaXggIT0gTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgJiYgKChpbnB1dERlc2MtPm1Qb2xpY3lNaXgtPm1DYkZsYWdzICYgQXVkaW9NaXg6OmtDYkZsYWdOb3RpZnlBY3Rpdml0eSkgIT0gMCkpIHsKLSAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+b25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUoaW5wdXREZXNjLT5tUG9saWN5TWl4LT5tRGV2aWNlQWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgIE1JWF9TVEFURV9JRExFKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gYXV0b21hdGljYWxseSBkaXNhYmxlIHRoZSByZW1vdGUgc3VibWl4IG91dHB1dCB3aGVuIGlucHV0IGlzIHN0b3BwZWQgaWYgbm90Ci0gICAgICAgICAgICAvLyB1c2VkIGJ5IGEgcG9saWN5IG1peCBvZiB0eXBlIE1JWF9UWVBFX1JFQ09SREVSUwotICAgICAgICAgICAgaWYgKGF1ZGlvX2lzX3JlbW90ZV9zdWJtaXhfZGV2aWNlKGlucHV0RGVzYy0+bURldmljZSkpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmc4IGFkZHJlc3MgPSBTdHJpbmc4KCIiKTsKLSAgICAgICAgICAgICAgICBpZiAoaW5wdXREZXNjLT5tUG9saWN5TWl4ID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkcmVzcyA9IFN0cmluZzgoIjAiKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlucHV0RGVzYy0+bVBvbGljeU1peC0+bU1peFR5cGUgPT0gTUlYX1RZUEVfUExBWUVSUykgewotICAgICAgICAgICAgICAgICAgICBhZGRyZXNzID0gaW5wdXREZXNjLT5tUG9saWN5TWl4LT5tRGV2aWNlQWRkcmVzczsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGFkZHJlc3MgIT0gIiIpIHsKLSAgICAgICAgICAgICAgICAgICAgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlSW50KEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLCAicmVtb3RlLXN1Ym1peCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IGlucHV0RGVzYy0+bURldmljZTsKLSAgICAgICAgICAgIHJlc2V0SW5wdXREZXZpY2UoaW5wdXQpOwotCi0gICAgICAgICAgICAvLyBpbmRpY2F0ZSBpbmFjdGl2ZSBjYXB0dXJlIHRvIHNvdW5kIHRyaWdnZXIgc2VydmljZSBpZiBzdG9wcGluZyBjYXB0dXJlIGZyb20gYSBtaWMgb24KLSAgICAgICAgICAgIC8vIHByaW1hcnkgSFcgbW9kdWxlCi0gICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgcHJpbWFyeUlucHV0RGV2aWNlcyA9IGF2YWlsYWJsZVByaW1hcnlJbnB1dERldmljZXMoKTsKLSAgICAgICAgICAgIGlmICgoKGRldmljZSAmIHByaW1hcnlJbnB1dERldmljZXMgJiB+QVVESU9fREVWSUNFX0JJVF9JTikgIT0gMCkgJiYKLSAgICAgICAgICAgICAgICAgICAgbUlucHV0cy5hY3RpdmVJbnB1dHNDb3VudE9uRGV2aWNlcyhwcmltYXJ5SW5wdXREZXZpY2VzKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgU291bmRUcmlnZ2VyOjpzZXRDYXB0dXJlU3RhdGUoZmFsc2UpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW5wdXREZXNjLT5jbGVhclByZWVtcHRlZFNlc3Npb25zKCk7CisgICAgaW5wdXREZXNjLT5zdG9wKCk7CisgICAgaWYgKGlucHV0RGVzYy0+aXNBY3RpdmUoKSkgeworICAgICAgICBzZXRJbnB1dERldmljZShpbnB1dCwgZ2V0TmV3SW5wdXREZXZpY2UoaW5wdXREZXNjKSwgZmFsc2UgLyogZm9yY2UgKi8pOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIGlmIGlucHV0IG1hcHMgdG8gYSBkeW5hbWljIHBvbGljeSB3aXRoIGFuIGFjdGl2aXR5IGxpc3RlbmVyLCBub3RpZnkgb2Ygc3RhdGUgY2hhbmdlCisgICAgICAgIGlmICgoaW5wdXREZXNjLT5tUG9saWN5TWl4ICE9IE5VTEwpCisgICAgICAgICAgICAgICAgJiYgKChpbnB1dERlc2MtPm1Qb2xpY3lNaXgtPm1DYkZsYWdzICYgQXVkaW9NaXg6OmtDYkZsYWdOb3RpZnlBY3Rpdml0eSkgIT0gMCkpIHsKKyAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vbkR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZShpbnB1dERlc2MtPm1Qb2xpY3lNaXgtPm1EZXZpY2VBZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICBNSVhfU1RBVEVfSURMRSk7CiAgICAgICAgIH0KKworICAgICAgICAvLyBhdXRvbWF0aWNhbGx5IGRpc2FibGUgdGhlIHJlbW90ZSBzdWJtaXggb3V0cHV0IHdoZW4gaW5wdXQgaXMgc3RvcHBlZCBpZiBub3QKKyAgICAgICAgLy8gdXNlZCBieSBhIHBvbGljeSBtaXggb2YgdHlwZSBNSVhfVFlQRV9SRUNPUkRFUlMKKyAgICAgICAgaWYgKGF1ZGlvX2lzX3JlbW90ZV9zdWJtaXhfZGV2aWNlKGlucHV0RGVzYy0+bURldmljZSkpIHsKKyAgICAgICAgICAgIFN0cmluZzggYWRkcmVzcyA9IFN0cmluZzgoIiIpOworICAgICAgICAgICAgaWYgKGlucHV0RGVzYy0+bVBvbGljeU1peCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgYWRkcmVzcyA9IFN0cmluZzgoIjAiKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5wdXREZXNjLT5tUG9saWN5TWl4LT5tTWl4VHlwZSA9PSBNSVhfVFlQRV9QTEFZRVJTKSB7CisgICAgICAgICAgICAgICAgYWRkcmVzcyA9IGlucHV0RGVzYy0+bVBvbGljeU1peC0+bURldmljZUFkZHJlc3M7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYWRkcmVzcyAhPSAiIikgeworICAgICAgICAgICAgICAgIHNldERldmljZUNvbm5lY3Rpb25TdGF0ZUludChBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MsICJyZW1vdGUtc3VibWl4Iik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gaW5wdXREZXNjLT5tRGV2aWNlOworICAgICAgICByZXNldElucHV0RGV2aWNlKGlucHV0KTsKKworICAgICAgICAvLyBpbmRpY2F0ZSBpbmFjdGl2ZSBjYXB0dXJlIHRvIHNvdW5kIHRyaWdnZXIgc2VydmljZSBpZiBzdG9wcGluZyBjYXB0dXJlIGZyb20gYSBtaWMgb24KKyAgICAgICAgLy8gcHJpbWFyeSBIVyBtb2R1bGUKKyAgICAgICAgYXVkaW9fZGV2aWNlc190IHByaW1hcnlJbnB1dERldmljZXMgPSBhdmFpbGFibGVQcmltYXJ5SW5wdXREZXZpY2VzKCk7CisgICAgICAgIGlmICgoKGRldmljZSAmIHByaW1hcnlJbnB1dERldmljZXMgJiB+QVVESU9fREVWSUNFX0JJVF9JTikgIT0gMCkgJiYKKyAgICAgICAgICAgICAgICBtSW5wdXRzLmFjdGl2ZUlucHV0c0NvdW50T25EZXZpY2VzKHByaW1hcnlJbnB1dERldmljZXMpID09IDApIHsKKyAgICAgICAgICAgIFNvdW5kVHJpZ2dlcjo6c2V0Q2FwdHVyZVN0YXRlKGZhbHNlKTsKKyAgICAgICAgfQorICAgICAgICBpbnB1dERlc2MtPmNsZWFyUHJlZW1wdGVkU2Vzc2lvbnMoKTsKICAgICB9CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6cmVsZWFzZUlucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpyZWxlYXNlSW5wdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiB7Ci0gICAgQUxPR1YoInJlbGVhc2VJbnB1dCgpICVkIiwgaW5wdXQpOwotICAgIHNzaXplX3QgaW5kZXggPSBtSW5wdXRzLmluZGV4T2ZLZXkoaW5wdXQpOwotICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgQUxPR1coInJlbGVhc2VJbnB1dCgpIHJlbGVhc2luZyB1bmtub3duIGlucHV0ICVkIiwgaW5wdXQpOworICAgIEFMT0dWKCIlcyBwb3J0SWQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnRJZCk7CisKKyAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gbUlucHV0cy5nZXRJbnB1dEZvckNsaWVudChwb3J0SWQpOworICAgIGlmIChpbnB1dERlc2MgPT0gMCkgeworICAgICAgICBBTE9HVygiJXMgbm8gaW5wdXQgZm9yIGNsaWVudCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydElkKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KKyAgICBzcDxSZWNvcmRDbGllbnREZXNjcmlwdG9yPiBjbGllbnQgPSBpbnB1dERlc2MtPmdldENsaWVudChwb3J0SWQpOworICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0ID0gaW5wdXREZXNjLT5tSW9IYW5kbGU7CiAKLSAgICAvLyBSb3V0aW5nCi0gICAgbUlucHV0Um91dGVzLnJlbW92ZVJvdXRlKHNlc3Npb24pOworICAgIEFMT0dWKCIlcyAlZCIsIF9fRlVOQ1RJT05fXywgaW5wdXQpOwogCi0gICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGlucHV0RGVzYyA9IG1JbnB1dHMudmFsdWVBdChpbmRleCk7Ci0gICAgQUxPR19BU1NFUlQoaW5wdXREZXNjICE9IDApOworICAgIGlucHV0RGVzYy0+cmVtb3ZlQ2xpZW50KHBvcnRJZCk7CiAKLSAgICBzcDxBdWRpb1Nlc3Npb24+IGF1ZGlvU2Vzc2lvbiA9IGlucHV0RGVzYy0+Z2V0QXVkaW9TZXNzaW9uKHNlc3Npb24pOwotICAgIGlmIChhdWRpb1Nlc3Npb24gPT0gMCkgewotICAgICAgICBBTE9HVygicmVsZWFzZUlucHV0KCkgdW5rbm93biBzZXNzaW9uICVkIG9uIGlucHV0ICVkIiwgc2Vzc2lvbiwgaW5wdXQpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKGF1ZGlvU2Vzc2lvbi0+b3BlbkNvdW50KCkgPT0gMCkgewotICAgICAgICBBTE9HVygicmVsZWFzZUlucHV0KCkgaW52YWxpZCBvcGVuIGNvdW50ICVkIG9uIHNlc3Npb24gJWQiLAotICAgICAgICAgICAgICBhdWRpb1Nlc3Npb24tPm9wZW5Db3VudCgpLCBzZXNzaW9uKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChhdWRpb1Nlc3Npb24tPmNoYW5nZU9wZW5Db3VudCgtMSkgPT0gMCkgewotICAgICAgICBpbnB1dERlc2MtPnJlbW92ZUF1ZGlvU2Vzc2lvbihzZXNzaW9uKTsKLSAgICB9Ci0KLSAgICBpZiAoaW5wdXREZXNjLT5nZXRPcGVuUmVmQ291bnQoKSA+IDApIHsKLSAgICAgICAgQUxPR1YoInJlbGVhc2VJbnB1dCgpIGV4aXQgPiAwIik7CisgICAgaWYgKGlucHV0RGVzYy0+Z2V0Q2xpZW50Q291bnQoKSA+IDApIHsKKyAgICAgICAgQUxPR1YoIiVzKCVkKSAlenUgY2xpZW50cyByZW1haW5pbmciLCBfX2Z1bmNfXywgcG9ydElkLCBpbnB1dERlc2MtPmdldENsaWVudENvdW50KCkpOwogICAgICAgICByZXR1cm47CiAgICAgfQogCiAgICAgY2xvc2VJbnB1dChpbnB1dCk7CiAgICAgbXBDbGllbnRJbnRlcmZhY2UtPm9uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpOwotICAgIEFMT0dWKCJyZWxlYXNlSW5wdXQoKSBleGl0Iik7CisgICAgQUxPR1YoIiVzIGV4aXQiLCBfX0ZVTkNUSU9OX18pOworfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2xvc2VBY3RpdmVDbGllbnRzKGNvbnN0IHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiYgaW5wdXQpCit7CisgICAgUmVjb3JkQ2xpZW50VmVjdG9yIGNsaWVudHMgPSBpbnB1dC0+Y2xpZW50c0xpc3QodHJ1ZSk7CisKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGNsaWVudCA6IGNsaWVudHMpIHsKKyAgICAgICAgY2xvc2VDbGllbnQoY2xpZW50LT5wb3J0SWQoKSk7CisgICAgfQorfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2xvc2VDbGllbnQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCit7CisgICAgc3RvcElucHV0KHBvcnRJZCk7CisgICAgcmVsZWFzZUlucHV0KHBvcnRJZCk7CiB9CiAKIHZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjbG9zZUFsbElucHV0cygpIHsKQEAgLTIyMTksNyArMjI0NSw2IEBACiAgICAgICAgIH0KICAgICAgICAgaW5wdXREZXNjLT5jbG9zZSgpOwogICAgIH0KLSAgICBtSW5wdXRSb3V0ZXMuY2xlYXIoKTsKICAgICBtSW5wdXRzLmNsZWFyKCk7CiAgICAgU291bmRUcmlnZ2VyOjpzZXRDYXB0dXJlU3RhdGUoZmFsc2UpOwogICAgIG5leHRBdWRpb1BvcnRHZW5lcmF0aW9uKCk7CkBAIC0yMjg4LDExICsyMzEzLDEwIEBACiAgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbU91dHB1dHMudmFsdWVBdChpKTsKICAgICAgICAgYXVkaW9fZGV2aWNlc190IGN1ckRldmljZSA9IFZvbHVtZTo6Z2V0RGV2aWNlRm9yVm9sdW1lKGRlc2MtPmRldmljZSgpKTsKICAgICAgICAgZm9yIChpbnQgY3VyU3RyZWFtID0gMDsgY3VyU3RyZWFtIDwgQVVESU9fU1RSRUFNX0ZPUl9QT0xJQ1lfQ05UOyBjdXJTdHJlYW0rKykgewotICAgICAgICAgICAgaWYgKCFzdHJlYW1zTWF0Y2hGb3J2b2x1bWUoc3RyZWFtLCAoYXVkaW9fc3RyZWFtX3R5cGVfdCljdXJTdHJlYW0pKSB7CisgICAgICAgICAgICBpZiAoIShzdHJlYW1zTWF0Y2hGb3J2b2x1bWUoc3RyZWFtLCAoYXVkaW9fc3RyZWFtX3R5cGVfdCljdXJTdHJlYW0pKSkgewogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCEoZGVzYy0+aXNTdHJlYW1BY3RpdmUoKGF1ZGlvX3N0cmVhbV90eXBlX3QpY3VyU3RyZWFtKSB8fAotICAgICAgICAgICAgICAgICAgICAoaXNJbkNhbGwoKSAmJiAoY3VyU3RyZWFtID09IEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMKSkpKSB7CisgICAgICAgICAgICBpZiAoIShkZXNjLT5pc1N0cmVhbUFjdGl2ZSgoYXVkaW9fc3RyZWFtX3R5cGVfdCljdXJTdHJlYW0pIHx8IGlzSW5DYWxsKCkpKSB7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByb3V0aW5nX3N0cmF0ZWd5IGN1clN0cmF0ZWd5ID0gZ2V0U3RyYXRlZ3koKGF1ZGlvX3N0cmVhbV90eXBlX3QpY3VyU3RyZWFtKTsKQEAgLTIzMTAsMTMgKzIzMzQsMTUgQEAKICAgICAgICAgICAgICAgICBhcHBseVZvbHVtZSA9ICFtVm9sdW1lQ3VydmVzLT5oYXNWb2x1bWVJbmRleEZvckRldmljZSgKICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSwgY3VyU3RyZWFtRGV2aWNlKTsKICAgICAgICAgICAgIH0KLQorICAgICAgICAgICAgLy8gcmVzY2FsZSBpbmRleCBiZWZvcmUgYXBwbHlpbmcgdG8gY3VyU3RyZWFtIGFzIHJhbmdlcyBtYXkgYmUgZGlmZmVyZW50IGZvcgorICAgICAgICAgICAgLy8gc3RyZWFtIGFuZCBjdXJTdHJlYW0KKyAgICAgICAgICAgIGludCBpZHggPSByZXNjYWxlVm9sdW1lSW5kZXgoaW5kZXgsIHN0cmVhbSwgKGF1ZGlvX3N0cmVhbV90eXBlX3QpY3VyU3RyZWFtKTsKICAgICAgICAgICAgIGlmIChhcHBseVZvbHVtZSkgewogICAgICAgICAgICAgICAgIC8vRklYTUU6IHdvcmthcm91bmQgZm9yIHRydW5jYXRlZCB0b3VjaCBzb3VuZHMKICAgICAgICAgICAgICAgICAvLyBkZWxheWVkIHZvbHVtZSBjaGFuZ2UgZm9yIHN5c3RlbSBzdHJlYW0gdG8gYmUgcmVtb3ZlZCB3aGVuIHRoZSBwcm9ibGVtIGlzCiAgICAgICAgICAgICAgICAgLy8gaGFuZGxlZCBieSBzeXN0ZW0gVUkKICAgICAgICAgICAgICAgICBzdGF0dXNfdCB2b2xTdGF0dXMgPQotICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tBbmRTZXRWb2x1bWUoKGF1ZGlvX3N0cmVhbV90eXBlX3QpY3VyU3RyZWFtLCBpbmRleCwgZGVzYywgY3VyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tBbmRTZXRWb2x1bWUoKGF1ZGlvX3N0cmVhbV90eXBlX3QpY3VyU3RyZWFtLCBpZHgsIGRlc2MsIGN1ckRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RyZWFtID09IEFVRElPX1NUUkVBTV9TWVNURU0pID8gVE9VQ0hfU09VTkRfRklYRURfREVMQVlfTVMgOiAwKTsKICAgICAgICAgICAgICAgICBpZiAodm9sU3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHZvbFN0YXR1czsKQEAgLTI0OTUsMTIgKzI1MjEsMTMgQEAKICAgICBzcDxId01vZHVsZT4gclN1Ym1peE1vZHVsZTsKICAgICAvLyBleGFtaW5lIGVhY2ggbWl4J3Mgcm91dGUgdHlwZQogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbWl4ZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgQXVkaW9NaXggbWl4ID0gbWl4ZXNbaV07CiAgICAgICAgIC8vIHdlIG9ubHkgc3VwcG9ydCBNSVhfUk9VVEVfRkxBR19MT09QX0JBQ0sgb3IgTUlYX1JPVVRFX0ZMQUdfUkVOREVSLCBub3QgdGhlIGNvbWJpbmF0aW9uCi0gICAgICAgIGlmICgobWl4ZXNbaV0ubVJvdXRlRmxhZ3MgJiBNSVhfUk9VVEVfRkxBR19BTEwpID09IE1JWF9ST1VURV9GTEFHX0FMTCkgeworICAgICAgICBpZiAoKG1peC5tUm91dGVGbGFncyAmIE1JWF9ST1VURV9GTEFHX0FMTCkgPT0gTUlYX1JPVVRFX0ZMQUdfQUxMKSB7CiAgICAgICAgICAgICByZXMgPSBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIGlmICgobWl4ZXNbaV0ubVJvdXRlRmxhZ3MgJiBNSVhfUk9VVEVfRkxBR19MT09QX0JBQ0spID09IE1JWF9ST1VURV9GTEFHX0xPT1BfQkFDSykgeworICAgICAgICBpZiAoKG1peC5tUm91dGVGbGFncyAmIE1JWF9ST1VURV9GTEFHX0xPT1BfQkFDSykgPT0gTUlYX1JPVVRFX0ZMQUdfTE9PUF9CQUNLKSB7CiAgICAgICAgICAgICBBTE9HVigicmVnaXN0ZXJQb2xpY3lNaXhlcygpIG1peCAlenUgb2YgJXp1IGlzIExPT1BfQkFDSyIsIGksIG1peGVzLnNpemUoKSk7CiAgICAgICAgICAgICBpZiAoclN1Ym1peE1vZHVsZSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgclN1Ym1peE1vZHVsZSA9IG1Id01vZHVsZXMuZ2V0TW9kdWxlRnJvbU5hbWUoCkBAIC0yNTEzLDE1ICsyNTQwLDIwIEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBTdHJpbmc4IGFkZHJlc3MgPSBtaXhlc1tpXS5tRGV2aWNlQWRkcmVzczsKKyAgICAgICAgICAgIFN0cmluZzggYWRkcmVzcyA9IG1peC5tRGV2aWNlQWRkcmVzczsKKyAgICAgICAgICAgIGlmIChtaXgubU1peFR5cGUgPT0gTUlYX1RZUEVfUExBWUVSUykgeworICAgICAgICAgICAgICAgIG1peC5tRGV2aWNlVHlwZSA9IEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtaXgubURldmljZVR5cGUgPSBBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVg7CisgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmIChtUG9saWN5TWl4ZXMucmVnaXN0ZXJNaXgoYWRkcmVzcywgbWl4ZXNbaV0sIDAgLypvdXRwdXQgZGVzYyovKSAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgaWYgKG1Qb2xpY3lNaXhlcy5yZWdpc3Rlck1peChhZGRyZXNzLCBtaXgsIDAgLypvdXRwdXQgZGVzYyovKSAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgICAgIEFMT0dFKCIgRXJyb3IgcmVnaXN0ZXJpbmcgbWl4ICV6dSBmb3IgYWRkcmVzcyAlcyIsIGksIGFkZHJlc3Muc3RyaW5nKCkpOwogICAgICAgICAgICAgICAgIHJlcyA9IElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgYXVkaW9fY29uZmlnX3Qgb3V0cHV0Q29uZmlnID0gbWl4ZXNbaV0ubUZvcm1hdDsKLSAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ190IGlucHV0Q29uZmlnID0gbWl4ZXNbaV0ubUZvcm1hdDsKKyAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ190IG91dHB1dENvbmZpZyA9IG1peC5tRm9ybWF0OworICAgICAgICAgICAgYXVkaW9fY29uZmlnX3QgaW5wdXRDb25maWcgPSBtaXgubUZvcm1hdDsKICAgICAgICAgICAgIC8vIE5PVEU6IGF1ZGlvIGZsaW5nZXIgbWl4ZXIgZG9lcyBub3Qgc3VwcG9ydCBtb25vIG91dHB1dDogY29uZmlndXJlIHJlbW90ZSBzdWJtaXggSEFMIGluCiAgICAgICAgICAgICAvLyBzdGVyZW8gYW5kIGxldCBhdWRpbyBmbGluZ2VyIGRvIHRoZSBjaGFubmVsIGNvbnZlcnNpb24gaWYgbmVlZGVkLgogICAgICAgICAgICAgb3V0cHV0Q29uZmlnLmNoYW5uZWxfbWFzayA9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKQEAgLTI1MzEsNyArMjU2Myw3IEBACiAgICAgICAgICAgICByU3VibWl4TW9kdWxlLT5hZGRJbnB1dFByb2ZpbGUoYWRkcmVzcywgJmlucHV0Q29uZmlnLAogICAgICAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWCwgYWRkcmVzcyk7CiAKLSAgICAgICAgICAgIGlmIChtaXhlc1tpXS5tTWl4VHlwZSA9PSBNSVhfVFlQRV9QTEFZRVJTKSB7CisgICAgICAgICAgICBpZiAobWl4Lm1NaXhUeXBlID09IE1JWF9UWVBFX1BMQVlFUlMpIHsKICAgICAgICAgICAgICAgICBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGVJbnQoQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVgsCiAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRSwKICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3Muc3RyaW5nKCksICJyZW1vdGUtc3VibWl4Iik7CkBAIC0yNTQwLDkgKzI1NzIsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUsCiAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLnN0cmluZygpLCAicmVtb3RlLXN1Ym1peCIpOwogICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKChtaXhlc1tpXS5tUm91dGVGbGFncyAmIE1JWF9ST1VURV9GTEFHX1JFTkRFUikgPT0gTUlYX1JPVVRFX0ZMQUdfUkVOREVSKSB7Ci0gICAgICAgICAgICBTdHJpbmc4IGFkZHJlc3MgPSBtaXhlc1tpXS5tRGV2aWNlQWRkcmVzczsKLSAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBtaXhlc1tpXS5tRGV2aWNlVHlwZTsKKyAgICAgICAgfSBlbHNlIGlmICgobWl4Lm1Sb3V0ZUZsYWdzICYgTUlYX1JPVVRFX0ZMQUdfUkVOREVSKSA9PSBNSVhfUk9VVEVfRkxBR19SRU5ERVIpIHsKKyAgICAgICAgICAgIFN0cmluZzggYWRkcmVzcyA9IG1peC5tRGV2aWNlQWRkcmVzczsKKyAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBtaXgubURldmljZVR5cGU7CiAgICAgICAgICAgICBBTE9HVigiIHJlZ2lzdGVyUG9saWN5TWl4ZXMoKSBtaXggJXp1IG9mICV6dSBpcyBSRU5ERVIsIGRldj0weCVYIGFkZHI9JXMiLAogICAgICAgICAgICAgICAgICAgICBpLCBtaXhlcy5zaXplKCksIGRldmljZSwgYWRkcmVzcy5zdHJpbmcoKSk7CiAKQEAgLTI1NTUsNyArMjU4Nyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAmJiAocGF0Y2gtPm1QYXRjaC5zaW5rc1swXS5leHQuZGV2aWNlLnR5cGUgPT0gZGV2aWNlKQogICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHN0cm5jbXAocGF0Y2gtPm1QYXRjaC5zaW5rc1swXS5leHQuZGV2aWNlLmFkZHJlc3MsIGFkZHJlc3Muc3RyaW5nKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9NQVhfQUREUkVTU19MRU4pID09IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtUG9saWN5TWl4ZXMucmVnaXN0ZXJNaXgoYWRkcmVzcywgbWl4ZXNbaV0sIGRlc2MpICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtUG9saWN5TWl4ZXMucmVnaXN0ZXJNaXgoYWRkcmVzcywgbWl4LCBkZXNjKSAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZE91dHB1dCA9IHRydWU7CkBAIC0yNjMzLDU3ICsyNjY1LDUzIEBACiAgICAgcmV0dXJuIHJlczsKIH0KIAordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdAoreworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCJcbkF1ZGlvUG9saWN5TWFuYWdlciBEdW1wOiAlcFxuIiwgdGhpcyk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBQcmltYXJ5IE91dHB1dDogJWRcbiIsCisgICAgICAgICAgICAgaGFzUHJpbWFyeU91dHB1dCgpID8gbVByaW1hcnlPdXRwdXQtPm1Jb0hhbmRsZSA6IEFVRElPX0lPX0hBTkRMRV9OT05FKTsKKyAgICBzdGQ6OnN0cmluZyBzdGF0ZUxpdGVyYWw7CisgICAgQXVkaW9Nb2RlQ29udmVydGVyOjp0b1N0cmluZyhtRW5naW5lLT5nZXRQaG9uZVN0YXRlKCksIHN0YXRlTGl0ZXJhbCk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBQaG9uZSBzdGF0ZTogJXNcbiIsIHN0YXRlTGl0ZXJhbC5jX3N0cigpKTsKKyAgICBjb25zdCBjaGFyKiBmb3JjZVVzZXNbQVVESU9fUE9MSUNZX0ZPUkNFX1VTRV9DTlRdID0geworICAgICAgICAiY29tbXVuaWNhdGlvbnMiLCAibWVkaWEiLCAicmVjb3JkIiwgImRvY2siLCAic3lzdGVtIiwKKyAgICAgICAgIkhETUkgc3lzdGVtIGF1ZGlvIiwgImVuY29kZWQgc3Vycm91bmQgb3V0cHV0IiwgInZpYnJhdGUgcmluZ2luZyIgfTsKKyAgICBmb3IgKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCBpID0gQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9DT01NVU5JQ0FUSU9OOworICAgICAgICAgaSA8IEFVRElPX1BPTElDWV9GT1JDRV9VU0VfQ05UOyBpID0gKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCkoKGludClpICsgMSkpIHsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBGb3JjZSB1c2UgZm9yICVzOiAlZFxuIiwKKyAgICAgICAgICAgICAgICBmb3JjZVVzZXNbaV0sIG1FbmdpbmUtPmdldEZvcmNlVXNlKGkpKTsKKyAgICB9CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBUVFMgb3V0cHV0ICVzYXZhaWxhYmxlXG4iLCBtVHRzT3V0cHV0QXZhaWxhYmxlID8gIiIgOiAibm90ICIpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgTWFzdGVyIG1vbm86ICVzXG4iLCBtTWFzdGVyTW9ubyA/ICJvbiIgOiAib2ZmIik7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBDb25maWcgc291cmNlOiAlc1xuIiwgbUNvbmZpZy5nZXRTb3VyY2UoKS5jX3N0cigpKTsgLy8gZ2V0Q29uZmlnIG5vdCBjb25zdAorICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmR1bXAoZHN0LCBTdHJpbmc4KCJBdmFpbGFibGUgb3V0cHV0IikpOworICAgIG1BdmFpbGFibGVJbnB1dERldmljZXMuZHVtcChkc3QsIFN0cmluZzgoIkF2YWlsYWJsZSBpbnB1dCIpKTsKKyAgICBtSHdNb2R1bGVzQWxsLmR1bXAoZHN0KTsKKyAgICBtT3V0cHV0cy5kdW1wKGRzdCk7CisgICAgbUlucHV0cy5kdW1wKGRzdCk7CisgICAgbVZvbHVtZUN1cnZlcy0+ZHVtcChkc3QpOworICAgIG1FZmZlY3RzLmR1bXAoZHN0KTsKKyAgICBtQXVkaW9QYXRjaGVzLmR1bXAoZHN0KTsKKyAgICBtUG9saWN5TWl4ZXMuZHVtcChkc3QpOworICAgIG1BdWRpb1NvdXJjZXMuZHVtcChkc3QpOworICAgIGlmICghbVN1cnJvdW5kRm9ybWF0cy5lbXB0eSgpKSB7CisgICAgICAgIGRzdC0+YXBwZW5kKCJcbkVuYWJsZWQgU3Vycm91bmQgRm9ybWF0czpcbiIpOworICAgICAgICBzaXplX3QgaSA9IDA7CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgZm10IDogbVN1cnJvdW5kRm9ybWF0cykgeworICAgICAgICAgICAgZHN0LT5hcHBlbmQoaSsrID09IDAgPyAiICAiIDogIiwgIik7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBzZm10OworICAgICAgICAgICAgRm9ybWF0Q29udmVydGVyOjp0b1N0cmluZyhmbXQsIHNmbXQpOworICAgICAgICAgICAgZHN0LT5hcHBlbmQoc2ZtdC5jX3N0cigpKTsKKyAgICAgICAgfQorICAgICAgICBkc3QtPmFwcGVuZCgiXG4iKTsKKyAgICB9Cit9CiAKIHN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6ZHVtcChpbnQgZmQpCiB7Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07CiAgICAgU3RyaW5nOCByZXN1bHQ7Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcbkF1ZGlvUG9saWN5TWFuYWdlciBEdW1wOiAlcFxuIiwgdGhpcyk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIFByaW1hcnkgT3V0cHV0OiAlZFxuIiwKLSAgICAgICAgICAgICBoYXNQcmltYXJ5T3V0cHV0KCkgPyBtUHJpbWFyeU91dHB1dC0+bUlvSGFuZGxlIDogQVVESU9fSU9fSEFORExFX05PTkUpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzdGQ6OnN0cmluZyBzdGF0ZUxpdGVyYWw7Ci0gICAgQXVkaW9Nb2RlQ29udmVydGVyOjp0b1N0cmluZyhtRW5naW5lLT5nZXRQaG9uZVN0YXRlKCksIHN0YXRlTGl0ZXJhbCk7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIFBob25lIHN0YXRlOiAlc1xuIiwgc3RhdGVMaXRlcmFsLmNfc3RyKCkpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgRm9yY2UgdXNlIGZvciBjb21tdW5pY2F0aW9ucyAlZFxuIiwKLSAgICAgICAgICAgICBtRW5naW5lLT5nZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0NPTU1VTklDQVRJT04pKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIEZvcmNlIHVzZSBmb3IgbWVkaWEgJWRcbiIsIG1FbmdpbmUtPmdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfTUVESUEpKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIEZvcmNlIHVzZSBmb3IgcmVjb3JkICVkXG4iLCBtRW5naW5lLT5nZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1JFQ09SRCkpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgRm9yY2UgdXNlIGZvciBkb2NrICVkXG4iLCBtRW5naW5lLT5nZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0RPQ0spKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIEZvcmNlIHVzZSBmb3Igc3lzdGVtICVkXG4iLCBtRW5naW5lLT5nZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1NZU1RFTSkpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgRm9yY2UgdXNlIGZvciBoZG1pIHN5c3RlbSBhdWRpbyAlZFxuIiwKLSAgICAgICAgICAgIG1FbmdpbmUtPmdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfSERNSV9TWVNURU1fQVVESU8pKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIEZvcmNlIHVzZSBmb3IgZW5jb2RlZCBzdXJyb3VuZCBvdXRwdXQgJWRcbiIsCi0gICAgICAgICAgICBtRW5naW5lLT5nZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0VOQ09ERURfU1VSUk9VTkQpKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIFRUUyBvdXRwdXQgJXNcbiIsIG1UdHNPdXRwdXRBdmFpbGFibGUgPyAiYXZhaWxhYmxlIiA6ICJub3QgYXZhaWxhYmxlIik7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBNYXN0ZXIgbW9ubzogJXNcbiIsIG1NYXN0ZXJNb25vID8gIm9uIiA6ICJvZmYiKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0KKyAgICBkdW1wKCZyZXN1bHQpOwogICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwotCi0gICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMuZHVtcChmZCwgU3RyaW5nOCgiQXZhaWxhYmxlIG91dHB1dCIpKTsKLSAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmR1bXAoZmQsIFN0cmluZzgoIkF2YWlsYWJsZSBpbnB1dCIpKTsKLSAgICBtSHdNb2R1bGVzQWxsLmR1bXAoZmQpOwotICAgIG1PdXRwdXRzLmR1bXAoZmQpOwotICAgIG1JbnB1dHMuZHVtcChmZCk7Ci0gICAgbVZvbHVtZUN1cnZlcy0+ZHVtcChmZCk7Ci0gICAgbUVmZmVjdHMuZHVtcChmZCk7Ci0gICAgbUF1ZGlvUGF0Y2hlcy5kdW1wKGZkKTsKLSAgICBtUG9saWN5TWl4ZXMuZHVtcChmZCk7Ci0KICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKQEAgLTI3MDQsMTIgKzI3MzIsOSBAQAogICAgIH0KIAogICAgIC8vIENoZWNrIGlmIG9mZmxvYWQgaGFzIGJlZW4gZGlzYWJsZWQKLSAgICBjaGFyIHByb3BWYWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOwotICAgIGlmIChwcm9wZXJ0eV9nZXQoImF1ZGlvLm9mZmxvYWQuZGlzYWJsZSIsIHByb3BWYWx1ZSwgIjAiKSkgewotICAgICAgICBpZiAoYXRvaShwcm9wVmFsdWUpICE9IDApIHsKLSAgICAgICAgICAgIEFMT0dWKCJvZmZsb2FkIGRpc2FibGVkIGJ5IGF1ZGlvLm9mZmxvYWQuZGlzYWJsZT0lcyIsIHByb3BWYWx1ZSApOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9CisgICAgaWYgKHByb3BlcnR5X2dldF9ib29sKCJhdWRpby5vZmZsb2FkLmRpc2FibGUiLCBmYWxzZSAvKiBkZWZhdWx0X3ZhbHVlICovKSkgeworICAgICAgICBBTE9HVigib2ZmbG9hZCBkaXNhYmxlZCBieSBhdWRpby5vZmZsb2FkLmRpc2FibGUiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIC8vIENoZWNrIGlmIHN0cmVhbSB0eXBlIGlzIG11c2ljLCB0aGVuIG9ubHkgYWxsb3cgb2ZmbG9hZCBhcyBvZiBub3cuCkBAIC0yNzI4LDkgKzI3NTMsMTIgQEAKICAgICB9CiAKICAgICAvL0lmIGR1cmF0aW9uIGlzIGxlc3MgdGhhbiBtaW5pbXVtIHZhbHVlIGRlZmluZWQgaW4gcHJvcGVydHksIHJldHVybiBmYWxzZQotICAgIGlmIChwcm9wZXJ0eV9nZXQoImF1ZGlvLm9mZmxvYWQubWluLmR1cmF0aW9uLnNlY3MiLCBwcm9wVmFsdWUsIE5VTEwpKSB7Ci0gICAgICAgIGlmIChvZmZsb2FkSW5mby5kdXJhdGlvbl91cyA8IChhdG9pKHByb3BWYWx1ZSkgKiAxMDAwMDAwICkpIHsKLSAgICAgICAgICAgIEFMT0dWKCJPZmZsb2FkIGRlbmllZCBieSBkdXJhdGlvbiA8IGF1ZGlvLm9mZmxvYWQubWluLmR1cmF0aW9uLnNlY3MoPSVzKSIsIHByb3BWYWx1ZSk7CisgICAgY29uc3QgaW50IG1pbl9kdXJhdGlvbl9zZWNzID0gcHJvcGVydHlfZ2V0X2ludDMyKAorICAgICAgICAgICAgImF1ZGlvLm9mZmxvYWQubWluLmR1cmF0aW9uLnNlY3MiLCAtMSAvKiBkZWZhdWx0X3ZhbHVlICovKTsKKyAgICBpZiAobWluX2R1cmF0aW9uX3NlY3MgPj0gMCkgeworICAgICAgICBpZiAob2ZmbG9hZEluZm8uZHVyYXRpb25fdXMgPCBtaW5fZHVyYXRpb25fc2VjcyAqIDEwMDAwMDBMTCkgeworICAgICAgICAgICAgQUxPR1YoIk9mZmxvYWQgZGVuaWVkIGJ5IGR1cmF0aW9uIDwgYXVkaW8ub2ZmbG9hZC5taW4uZHVyYXRpb24uc2Vjcyg9JWQpIiwKKyAgICAgICAgICAgICAgICAgICAgbWluX2R1cmF0aW9uX3NlY3MpOwogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgfSBlbHNlIGlmIChvZmZsb2FkSW5mby5kdXJhdGlvbl91cyA8IE9GRkxPQURfREVGQVVMVF9NSU5fRFVSQVRJT05fU0VDUyAqIDEwMDAwMDApIHsKQEAgLTI4NjcsOCArMjg5NSw3IEBACiAgICAgfQogICAgIEFMT0dWKCJjcmVhdGVBdWRpb1BhdGNoKCkgbnVtIHNvdXJjZXMgJWQgbnVtIHNpbmtzICVkIiwgcGF0Y2gtPm51bV9zb3VyY2VzLCBwYXRjaC0+bnVtX3NpbmtzKTsKIAotICAgIGlmIChwYXRjaC0+bnVtX3NvdXJjZXMgPT0gMCB8fCBwYXRjaC0+bnVtX3NvdXJjZXMgPiBBVURJT19QQVRDSF9QT1JUU19NQVggfHwKLSAgICAgICAgICAgIHBhdGNoLT5udW1fc2lua3MgPT0gMCB8fCBwYXRjaC0+bnVtX3NpbmtzID4gQVVESU9fUEFUQ0hfUE9SVFNfTUFYKSB7CisgICAgaWYgKCFhdWRpb19wYXRjaF9pc192YWxpZChwYXRjaCkpIHsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAgICAgLy8gb25seSBvbmUgc291cmNlIHBlciBhdWRpbyBwYXRjaCBzdXBwb3J0ZWQgZm9yIG5vdwpAQCAtMzA4NywyOCArMzExNCw4IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBUT0RPOiBjaGVjayBmcm9tIHJvdXRpbmcgY2FwYWJpbGl0aWVzIGluIGNvbmZpZyBmaWxlIGFuZCBvdGhlciBjb25mbGljdGluZyBwYXRjaGVzCiAKLSAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGFmUGF0Y2hIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKLSAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgYWZQYXRjaEhhbmRsZSA9IHBhdGNoRGVzYy0+bUFmUGF0Y2hIYW5kbGU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5jcmVhdGVBdWRpb1BhdGNoKCZuZXdQYXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhZlBhdGNoSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7Ci0gICAgICAgICAgICBBTE9HVigiY3JlYXRlQXVkaW9QYXRjaCgpIHBhdGNoIHBhbmVsIHJldHVybmVkICVkIHBhdGNoSGFuZGxlICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cywgYWZQYXRjaEhhbmRsZSk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICAgICAgICAgICAgICBwYXRjaERlc2MgPSBuZXcgQXVkaW9QYXRjaCgmbmV3UGF0Y2gsIHVpZCk7Ci0gICAgICAgICAgICAgICAgICAgIGFkZEF1ZGlvUGF0Y2gocGF0Y2hEZXNjLT5tSGFuZGxlLCBwYXRjaERlc2MpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhdGNoRGVzYy0+bVBhdGNoID0gbmV3UGF0Y2g7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBhdGNoRGVzYy0+bUFmUGF0Y2hIYW5kbGUgPSBhZlBhdGNoSGFuZGxlOwotICAgICAgICAgICAgICAgICpoYW5kbGUgPSBwYXRjaERlc2MtPm1IYW5kbGU7Ci0gICAgICAgICAgICAgICAgbmV4dEF1ZGlvUG9ydEdlbmVyYXRpb24oKTsKLSAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+b25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOwotICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGluc3RhbGxQYXRjaChfX2Z1bmNfXywgaW5kZXgsIGhhbmRsZSwgJm5ld1BhdGNoLCAwLCB1aWQsICZwYXRjaERlc2MpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgICAgIEFMT0dXKCJjcmVhdGVBdWRpb1BhdGNoKCkgcGF0Y2ggcGFuZWwgY291bGQgbm90IGNvbm5lY3QgZGV2aWNlIHBhdGNoLCBlcnJvciAlZCIsCiAgICAgICAgICAgICAgICAgc3RhdHVzKTsKICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CkBAIC0zMjQxLDEwICszMjQ4LDEwIEBACiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCi0gICAgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnIGJhY2t1cENvbmZpZzsKKyAgICBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgYmFja3VwQ29uZmlnID0ge307CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gYXVkaW9Qb3J0Q29uZmlnLT5hcHBseUF1ZGlvUG9ydENvbmZpZyhjb25maWcsICZiYWNrdXBDb25maWcpOwogICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnIG5ld0NvbmZpZzsKKyAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnIG5ld0NvbmZpZyA9IHt9OwogICAgICAgICBhdWRpb1BvcnRDb25maWctPnRvQXVkaW9Qb3J0Q29uZmlnKCZuZXdDb25maWcsIGNvbmZpZyk7CiAgICAgICAgIHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRBdWRpb1BvcnRDb25maWcoJm5ld0NvbmZpZywgMCk7CiAgICAgfQpAQCAtMzMwNSwxMiArMzMxMiwxMiBAQAogewogICAgIC8vIHJlbW92ZSBvdXRwdXQgcm91dGVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHVpZAogICAgIFNvcnRlZFZlY3Rvcjxyb3V0aW5nX3N0cmF0ZWd5PiBhZmZlY3RlZFN0cmF0ZWdpZXM7Ci0gICAgZm9yIChzc2l6ZV90IGkgPSAoc3NpemVfdCltT3V0cHV0Um91dGVzLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSAgewotICAgICAgICBzcDxTZXNzaW9uUm91dGU+IHJvdXRlID0gbU91dHB1dFJvdXRlcy52YWx1ZUF0KGkpOwotICAgICAgICBpZiAocm91dGUtPm1VaWQgPT0gdWlkKSB7Ci0gICAgICAgICAgICBtT3V0cHV0Um91dGVzLnJlbW92ZUl0ZW1zQXQoaSk7Ci0gICAgICAgICAgICBpZiAocm91dGUtPm1EZXZpY2VEZXNjcmlwdG9yICE9IDApIHsKLSAgICAgICAgICAgICAgICBhZmZlY3RlZFN0cmF0ZWdpZXMuYWRkKGdldFN0cmF0ZWd5KHJvdXRlLT5tU3RyZWFtVHlwZSkpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVBdChpKTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBjbGllbnQgOiBvdXRwdXREZXNjLT5nZXRDbGllbnRJdGVyYWJsZSgpKSB7CisgICAgICAgICAgICBpZiAoY2xpZW50LT5oYXNQcmVmZXJyZWREZXZpY2UoKSAmJiBjbGllbnQtPnVpZCgpID09IHVpZCkgeworICAgICAgICAgICAgICAgIGNsaWVudC0+c2V0UHJlZmVycmVkRGV2aWNlSWQoQVVESU9fUE9SVF9IQU5ETEVfTk9ORSk7CisgICAgICAgICAgICAgICAgYWZmZWN0ZWRTdHJhdGVnaWVzLmFkZChnZXRTdHJhdGVneShjbGllbnQtPnN0cmVhbSgpKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC0zMzIxLDEyICszMzI4LDEyIEBACiAKICAgICAvLyByZW1vdmUgaW5wdXQgcm91dGVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHVpZAogICAgIFNvcnRlZFZlY3RvcjxhdWRpb19zb3VyY2VfdD4gYWZmZWN0ZWRTb3VyY2VzOwotICAgIGZvciAoc3NpemVfdCBpID0gKHNzaXplX3QpbUlucHV0Um91dGVzLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSAgewotICAgICAgICBzcDxTZXNzaW9uUm91dGU+IHJvdXRlID0gbUlucHV0Um91dGVzLnZhbHVlQXQoaSk7Ci0gICAgICAgIGlmIChyb3V0ZS0+bVVpZCA9PSB1aWQpIHsKLSAgICAgICAgICAgIG1JbnB1dFJvdXRlcy5yZW1vdmVJdGVtc0F0KGkpOwotICAgICAgICAgICAgaWYgKHJvdXRlLT5tRGV2aWNlRGVzY3JpcHRvciAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgYWZmZWN0ZWRTb3VyY2VzLmFkZChyb3V0ZS0+bVNvdXJjZSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSW5wdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSBtSW5wdXRzLnZhbHVlQXQoaSk7CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgY2xpZW50IDogaW5wdXREZXNjLT5nZXRDbGllbnRJdGVyYWJsZSgpKSB7CisgICAgICAgICAgICBpZiAoY2xpZW50LT5oYXNQcmVmZXJyZWREZXZpY2UoKSAmJiBjbGllbnQtPnVpZCgpID09IHVpZCkgeworICAgICAgICAgICAgICAgIGNsaWVudC0+c2V0UHJlZmVycmVkRGV2aWNlSWQoQVVESU9fUE9SVF9IQU5ETEVfTk9ORSk7CisgICAgICAgICAgICAgICAgYWZmZWN0ZWRTb3VyY2VzLmFkZChjbGllbnQtPnNvdXJjZSgpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTMzNDYsOCArMzM1Myw4IEBACiB2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2xlYXJBdWRpb1NvdXJjZXModWlkX3QgdWlkKQogewogICAgIGZvciAoc3NpemVfdCBpID0gKHNzaXplX3QpbUF1ZGlvU291cmNlcy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgIHsKLSAgICAgICAgc3A8QXVkaW9Tb3VyY2VEZXNjcmlwdG9yPiBzb3VyY2VEZXNjID0gbUF1ZGlvU291cmNlcy52YWx1ZUF0KGkpOwotICAgICAgICBpZiAoc291cmNlRGVzYy0+bVVpZCA9PSB1aWQpIHsKKyAgICAgICAgc3A8U291cmNlQ2xpZW50RGVzY3JpcHRvcj4gc291cmNlRGVzYyA9IG1BdWRpb1NvdXJjZXMudmFsdWVBdChpKTsKKyAgICAgICAgaWYgKHNvdXJjZURlc2MtPnVpZCgpID09IHVpZCkgewogICAgICAgICAgICAgc3RvcEF1ZGlvU291cmNlKG1BdWRpb1NvdXJjZXMua2V5QXQoaSkpOwogICAgICAgICB9CiAgICAgfQpAQCAtMzM2NSwyMCArMzM3MiwyMyBAQAogfQogCiBzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnN0YXJ0QXVkaW9Tb3VyY2UoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyaWJ1dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkKQogewotICAgIEFMT0dWKCIlcyBzb3VyY2UgJXAgYXR0cmlidXRlcyAlcCBoYW5kbGUgJXAiLCBfX0ZVTkNUSU9OX18sIHNvdXJjZSwgYXR0cmlidXRlcywgaGFuZGxlKTsKLSAgICBpZiAoc291cmNlID09IE5VTEwgfHwgYXR0cmlidXRlcyA9PSBOVUxMIHx8IGhhbmRsZSA9PSBOVUxMKSB7CisgICAgQUxPR1YoIiVzIiwgX19GVU5DVElPTl9fKTsKKyAgICAqcG9ydElkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKKworICAgIGlmIChzb3VyY2UgPT0gTlVMTCB8fCBhdHRyaWJ1dGVzID09IE5VTEwgfHwgcG9ydElkID09IE5VTEwpIHsKKyAgICAgICAgQUxPR1coIiVzIGludmFsaWQgYXJndW1lbnQ6IHNvdXJjZSAlcCBhdHRyaWJ1dGVzICVwIGhhbmRsZSAlcCIsCisgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc291cmNlLCBhdHRyaWJ1dGVzLCBwb3J0SWQpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAotICAgICpoYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKLQogICAgIGlmIChzb3VyY2UtPnJvbGUgIT0gQVVESU9fUE9SVF9ST0xFX1NPVVJDRSB8fAogICAgICAgICAgICAgc291cmNlLT50eXBlICE9IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpIHsKLSAgICAgICAgQUxPR1YoIiVzIElOVkFMSURfT1BFUkFUSU9OIHNvdXJjZS0+cm9sZSAlZCBzb3VyY2UtPnR5cGUgJWQiLCBfX0ZVTkNUSU9OX18sIHNvdXJjZS0+cm9sZSwgc291cmNlLT50eXBlKTsKKyAgICAgICAgQUxPR1coIiVzIElOVkFMSURfT1BFUkFUSU9OIHNvdXJjZS0+cm9sZSAlZCBzb3VyY2UtPnR5cGUgJWQiLAorICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHNvdXJjZS0+cm9sZSwgc291cmNlLT50eXBlKTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIApAQCAtMzM4Niw0MSArMzM5Niw0NCBAQAogICAgICAgICAgICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2Uoc291cmNlLT5leHQuZGV2aWNlLnR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOChzb3VyY2UtPmV4dC5kZXZpY2UuYWRkcmVzcykpOwogICAgIGlmIChzcmNEZXZpY2VEZXNjID09IDApIHsKLSAgICAgICAgQUxPR1YoIiVzIHNvdXJjZS0+ZXh0LmRldmljZS50eXBlICUwOHggbm90IGZvdW5kIiwgX19GVU5DVElPTl9fLCBzb3VyY2UtPmV4dC5kZXZpY2UudHlwZSk7CisgICAgICAgIEFMT0dXKCIlcyBzb3VyY2UtPmV4dC5kZXZpY2UudHlwZSAlMDh4IG5vdCBmb3VuZCIsIF9fRlVOQ1RJT05fXywgc291cmNlLT5leHQuZGV2aWNlLnR5cGUpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KLSAgICBzcDxBdWRpb1NvdXJjZURlc2NyaXB0b3I+IHNvdXJjZURlc2MgPQotICAgICAgICAgICAgbmV3IEF1ZGlvU291cmNlRGVzY3JpcHRvcihzcmNEZXZpY2VEZXNjLCBhdHRyaWJ1dGVzLCB1aWQpOwogCi0gICAgc3RydWN0IGF1ZGlvX3BhdGNoIGR1bW15UGF0Y2g7CisgICAgKnBvcnRJZCA9IEF1ZGlvUG9ydDo6Z2V0TmV4dFVuaXF1ZUlkKCk7CisKKyAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggZHVtbXlQYXRjaCA9IHt9OwogICAgIHNwPEF1ZGlvUGF0Y2g+IHBhdGNoRGVzYyA9IG5ldyBBdWRpb1BhdGNoKCZkdW1teVBhdGNoLCB1aWQpOwotICAgIHNvdXJjZURlc2MtPm1QYXRjaERlc2MgPSBwYXRjaERlc2M7CisKKyAgICBzcDxTb3VyY2VDbGllbnREZXNjcmlwdG9yPiBzb3VyY2VEZXNjID0KKyAgICAgICAgbmV3IFNvdXJjZUNsaWVudERlc2NyaXB0b3IoKnBvcnRJZCwgdWlkLCAqYXR0cmlidXRlcywgcGF0Y2hEZXNjLCBzcmNEZXZpY2VEZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1UeXBlZnJvbUF0dHJpYnV0ZXNJbnQoYXR0cmlidXRlcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFN0cmF0ZWd5Rm9yQXR0cihhdHRyaWJ1dGVzKSk7CiAKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBjb25uZWN0QXVkaW9Tb3VyY2Uoc291cmNlRGVzYyk7CiAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICBtQXVkaW9Tb3VyY2VzLmFkZChzb3VyY2VEZXNjLT5nZXRIYW5kbGUoKSwgc291cmNlRGVzYyk7Ci0gICAgICAgICpoYW5kbGUgPSBzb3VyY2VEZXNjLT5nZXRIYW5kbGUoKTsKKyAgICAgICAgbUF1ZGlvU291cmNlcy5hZGQoKnBvcnRJZCwgc291cmNlRGVzYyk7CiAgICAgfQogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Y29ubmVjdEF1ZGlvU291cmNlKGNvbnN0IHNwPEF1ZGlvU291cmNlRGVzY3JpcHRvcj4mIHNvdXJjZURlc2MpCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmNvbm5lY3RBdWRpb1NvdXJjZShjb25zdCBzcDxTb3VyY2VDbGllbnREZXNjcmlwdG9yPiYgc291cmNlRGVzYykKIHsKLSAgICBBTE9HVigiJXMgaGFuZGxlICVkIiwgX19GVU5DVElPTl9fLCBzb3VyY2VEZXNjLT5nZXRIYW5kbGUoKSk7CisgICAgQUxPR1YoIiVzIGhhbmRsZSAlZCIsIF9fRlVOQ1RJT05fXywgc291cmNlRGVzYy0+cG9ydElkKCkpOwogCiAgICAgLy8gbWFrZSBzdXJlIHdlIG9ubHkgaGF2ZSBvbmUgcGF0Y2ggcGVyIHNvdXJjZS4KICAgICBkaXNjb25uZWN0QXVkaW9Tb3VyY2Uoc291cmNlRGVzYyk7CiAKLSAgICByb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5ID0gKHJvdXRpbmdfc3RyYXRlZ3kpIGdldFN0cmF0ZWd5Rm9yQXR0cigmc291cmNlRGVzYy0+bUF0dHJpYnV0ZXMpOwotICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0gc3RyZWFtVHlwZWZyb21BdHRyaWJ1dGVzSW50KCZzb3VyY2VEZXNjLT5tQXR0cmlidXRlcyk7Ci0gICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gc3JjRGV2aWNlRGVzYyA9IHNvdXJjZURlc2MtPm1EZXZpY2U7CisgICAgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXMgPSBzb3VyY2VEZXNjLT5hdHRyaWJ1dGVzKCk7CisgICAgcm91dGluZ19zdHJhdGVneSBzdHJhdGVneSA9IGdldFN0cmF0ZWd5Rm9yQXR0cigmYXR0cmlidXRlcyk7CisgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0gPSBzb3VyY2VEZXNjLT5zdHJlYW0oKTsKKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBzcmNEZXZpY2VEZXNjID0gc291cmNlRGVzYy0+c3JjRGV2aWNlKCk7CiAKICAgICBhdWRpb19kZXZpY2VzX3Qgc2lua0RldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KHN0cmF0ZWd5LCB0cnVlKTsKICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBzaW5rRGV2aWNlRGVzYyA9CiAgICAgICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2Uoc2lua0RldmljZSwgU3RyaW5nOCgiIikpOwogCiAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgYWZQYXRjaEhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOwotICAgIHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2ggPSAmc291cmNlRGVzYy0+bVBhdGNoRGVzYy0+bVBhdGNoOwogCiAgICAgaWYgKHNyY0RldmljZURlc2MtPmdldEF1ZGlvUG9ydCgpLT5tTW9kdWxlLT5nZXRIYW5kbGUoKSA9PQogICAgICAgICAgICAgc2lua0RldmljZURlc2MtPmdldEF1ZGlvUG9ydCgpLT5tTW9kdWxlLT5nZXRIYW5kbGUoKSAmJgpAQCAtMzQ1Miw1MSArMzQ2NSw0OSBAQAogICAgICAgICAvLyBiZSBjb25uZWN0ZWQgYXMgd2VsbCBhcyB0aGUgc3RyZWFtIHR5cGUgZm9yIHZvbHVtZSBjb250cm9sCiAgICAgICAgIC8vIC0gdGhlIHNpbmsgaXMgZGVmaW5lZCBieSB3aGF0ZXZlciBvdXRwdXQgZGV2aWNlIGlzIGN1cnJlbnRseSBzZWxlY3RlZCBmb3IgdGhlIG91dHB1dAogICAgICAgICAvLyB0aG91Z2ggd2hpY2ggdGhpcyBwYXRjaCBpcyByb3V0ZWQuCi0gICAgICAgIHBhdGNoLT5udW1fc2lua3MgPSAwOwotICAgICAgICBwYXRjaC0+bnVtX3NvdXJjZXMgPSAyOwotICAgICAgICBzcmNEZXZpY2VEZXNjLT50b0F1ZGlvUG9ydENvbmZpZygmcGF0Y2gtPnNvdXJjZXNbMF0sIE5VTEwpOwotICAgICAgICBvdXRwdXREZXNjLT50b0F1ZGlvUG9ydENvbmZpZygmcGF0Y2gtPnNvdXJjZXNbMV0sIE5VTEwpOwotICAgICAgICBwYXRjaC0+c291cmNlc1sxXS5leHQubWl4LnVzZWNhc2Uuc3RyZWFtID0gc3RyZWFtOwotICAgICAgICBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+Y3JlYXRlQXVkaW9QYXRjaChwYXRjaCwKKyAgICAgICAgUGF0Y2hCdWlsZGVyIHBhdGNoQnVpbGRlcjsKKyAgICAgICAgcGF0Y2hCdWlsZGVyLmFkZFNvdXJjZShzcmNEZXZpY2VEZXNjKS5hZGRTb3VyY2Uob3V0cHV0RGVzYywgeyAuc3RyZWFtID0gc3RyZWFtIH0pOworICAgICAgICBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+Y3JlYXRlQXVkaW9QYXRjaChwYXRjaEJ1aWxkZXIucGF0Y2goKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFmUGF0Y2hIYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOwogICAgICAgICBBTE9HVigiJXMgcGF0Y2ggcGFuZWwgcmV0dXJuZWQgJWQgcGF0Y2hIYW5kbGUgJWQiLCBfX0ZVTkNUSU9OX18sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cywgYWZQYXRjaEhhbmRsZSk7CisgICAgICAgIHNvdXJjZURlc2MtPnBhdGNoRGVzYygpLT5tUGF0Y2ggPSAqcGF0Y2hCdWlsZGVyLnBhdGNoKCk7CiAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIEFMT0dXKCIlcyBwYXRjaCBwYW5lbCBjb3VsZCBub3QgY29ubmVjdCBkZXZpY2UgcGF0Y2gsIGVycm9yICVkIiwKICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgfQogICAgICAgICB1aW50MzJfdCBkZWxheU1zID0gMDsKLSAgICAgICAgc3RhdHVzID0gc3RhcnRTb3VyY2Uob3V0cHV0RGVzYywgc3RyZWFtLCBzaW5rRGV2aWNlLCBOVUxMLCAmZGVsYXlNcyk7CisgICAgICAgIHN0YXR1cyA9IHN0YXJ0U291cmNlKG91dHB1dERlc2MsIHNvdXJjZURlc2MsICZkZWxheU1zKTsKIAogICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+cmVsZWFzZUF1ZGlvUGF0Y2goc291cmNlRGVzYy0+bVBhdGNoRGVzYy0+bUFmUGF0Y2hIYW5kbGUsIDApOworICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnJlbGVhc2VBdWRpb1BhdGNoKHNvdXJjZURlc2MtPnBhdGNoRGVzYygpLT5tQWZQYXRjaEhhbmRsZSwgMCk7CiAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgICAgICB9Ci0gICAgICAgIHNvdXJjZURlc2MtPm1Td091dHB1dCA9IG91dHB1dERlc2M7CisgICAgICAgIHNvdXJjZURlc2MtPnNldFN3T3V0cHV0KG91dHB1dERlc2MpOwogICAgICAgICBpZiAoZGVsYXlNcyAhPSAwKSB7CiAgICAgICAgICAgICB1c2xlZXAoZGVsYXlNcyAqIDEwMDApOwogICAgICAgICB9CiAgICAgfQogCi0gICAgc291cmNlRGVzYy0+bVBhdGNoRGVzYy0+bUFmUGF0Y2hIYW5kbGUgPSBhZlBhdGNoSGFuZGxlOwotICAgIGFkZEF1ZGlvUGF0Y2goc291cmNlRGVzYy0+bVBhdGNoRGVzYy0+bUhhbmRsZSwgc291cmNlRGVzYy0+bVBhdGNoRGVzYyk7CisgICAgc291cmNlRGVzYy0+cGF0Y2hEZXNjKCktPm1BZlBhdGNoSGFuZGxlID0gYWZQYXRjaEhhbmRsZTsKKyAgICBhZGRBdWRpb1BhdGNoKHNvdXJjZURlc2MtPnBhdGNoRGVzYygpLT5tSGFuZGxlLCBzb3VyY2VEZXNjLT5wYXRjaERlc2MoKSk7CiAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c3RvcEF1ZGlvU291cmNlKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSBfX3VudXNlZCkKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c3RvcEF1ZGlvU291cmNlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogewotICAgIHNwPEF1ZGlvU291cmNlRGVzY3JpcHRvcj4gc291cmNlRGVzYyA9IG1BdWRpb1NvdXJjZXMudmFsdWVGb3IoaGFuZGxlKTsKLSAgICBBTE9HVigiJXMgaGFuZGxlICVkIiwgX19GVU5DVElPTl9fLCBoYW5kbGUpOworICAgIHNwPFNvdXJjZUNsaWVudERlc2NyaXB0b3I+IHNvdXJjZURlc2MgPSBtQXVkaW9Tb3VyY2VzLnZhbHVlRm9yKHBvcnRJZCk7CisgICAgQUxPR1YoIiVzIHBvcnQgSUQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnRJZCk7CiAgICAgaWYgKHNvdXJjZURlc2MgPT0gMCkgewotICAgICAgICBBTE9HVygiJXMgdW5rbm93biBzb3VyY2UgZm9yIGhhbmRsZSAlZCIsIF9fRlVOQ1RJT05fXywgaGFuZGxlKTsKKyAgICAgICAgQUxPR1coIiVzIHVua25vd24gc291cmNlIGZvciBwb3J0IElEICVkIiwgX19GVU5DVElPTl9fLCBwb3J0SWQpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KICAgICBzdGF0dXNfdCBzdGF0dXMgPSBkaXNjb25uZWN0QXVkaW9Tb3VyY2Uoc291cmNlRGVzYyk7CiAKLSAgICBtQXVkaW9Tb3VyY2VzLnJlbW92ZUl0ZW0oaGFuZGxlKTsKKyAgICBtQXVkaW9Tb3VyY2VzLnJlbW92ZUl0ZW0ocG9ydElkKTsKICAgICByZXR1cm4gc3RhdHVzOwogfQogCkBAIC0zNTQ0LDUwICszNTU1LDYgQEAKICAgICByZXR1cm4gY29tcHV0ZVZvbHVtZShzdHJlYW0sIGluZGV4LCBkZXZpY2UpOwogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldFN1cHBvcnRlZEZvcm1hdHMoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9ybWF0VmVjdG9yJiBmb3JtYXRzKSB7Ci0gICAgaWYgKGlvSGFuZGxlID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIFN0cmluZzggcmVwbHk7Ci0gICAgcmVwbHkgPSBtcENsaWVudEludGVyZmFjZS0+Z2V0UGFyYW1ldGVycygKLSAgICAgICAgICAgIGlvSGFuZGxlLCBTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlTdHJlYW1TdXBwb3J0ZWRGb3JtYXRzKSk7Ci0gICAgQUxPR1YoIiVzOiBzdXBwb3J0ZWQgZm9ybWF0cyAlcyIsIF9fRlVOQ1RJT05fXywgcmVwbHkuc3RyaW5nKCkpOwotICAgIEF1ZGlvUGFyYW1ldGVyIHJlcGxpZWRQYXJhbWV0ZXJzKHJlcGx5KTsKLSAgICBpZiAocmVwbGllZFBhcmFtZXRlcnMuZ2V0KAotICAgICAgICAgICAgU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5U3RyZWFtU3VwcG9ydGVkRm9ybWF0cyksIHJlcGx5KSAhPSBOT19FUlJPUikgewotICAgICAgICBBTE9HRSgiJXM6IGZhaWxlZCB0byByZXRyaWV2ZSBmb3JtYXQsIGJhaWxpbmcgb3V0IiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgZm9yIChhdXRvIGZvcm1hdCA6IGZvcm1hdHNGcm9tU3RyaW5nKHJlcGx5LnN0cmluZygpKSkgewotICAgICAgICAvLyBPbmx5IEFVRElPX0ZPUk1BVF9BQUNfTEMgd2lsbCBiZSB1c2VkIGluIFNldHRpbmdzIFVJIGZvciBhbGwgQUFDIGZvcm1hdHMuCi0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgQVJSQVlfU0laRShBQUNfRk9STUFUUyk7IGkrKykgewotICAgICAgICAgICAgaWYgKGZvcm1hdCA9PSBBQUNfRk9STUFUU1tpXSkgewotICAgICAgICAgICAgICAgIGZvcm1hdCA9IEFVRElPX0ZPUk1BVF9BQUNfTEM7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYm9vbCBleGlzdCA9IGZhbHNlOwotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGZvcm1hdHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChmb3JtYXQgPT0gZm9ybWF0c1tpXSkgewotICAgICAgICAgICAgICAgIGV4aXN0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBib29sIGlzU3Vycm91bmRGb3JtYXQgPSBmYWxzZTsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBBUlJBWV9TSVpFKFNVUlJPVU5EX0ZPUk1BVFMpOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChTVVJST1VORF9GT1JNQVRTW2ldID09IGZvcm1hdCkgewotICAgICAgICAgICAgICAgIGlzU3Vycm91bmRGb3JtYXQgPSB0cnVlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmICghZXhpc3QgJiYgaXNTdXJyb3VuZEZvcm1hdCkgewotICAgICAgICAgICAgZm9ybWF0cy5hZGQoZm9ybWF0KTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KIHN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0U3Vycm91bmRGb3JtYXRzKHVuc2lnbmVkIGludCAqbnVtU3Vycm91bmRGb3JtYXRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgKnN1cnJvdW5kRm9ybWF0cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKnN1cnJvdW5kRm9ybWF0c0VuYWJsZWQsCkBAIC0zNTk3LDggKzM1NjQsOCBAQAogICAgICAgICAgICAgKHN1cnJvdW5kRm9ybWF0cyA9PSBOVUxMIHx8IHN1cnJvdW5kRm9ybWF0c0VuYWJsZWQgPT0gTlVMTCkpKSB7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQotICAgIEFMT0dWKCJnZXRTdXJyb3VuZEZvcm1hdHMoKSBudW1TdXJyb3VuZEZvcm1hdHMgJWQgc3Vycm91bmRGb3JtYXRzICVwIHN1cnJvdW5kRm9ybWF0c0VuYWJsZWQgJXAiLAotICAgICAgICAgICAgKm51bVN1cnJvdW5kRm9ybWF0cywgc3Vycm91bmRGb3JtYXRzLCBzdXJyb3VuZEZvcm1hdHNFbmFibGVkKTsKKyAgICBBTE9HVigiZ2V0U3Vycm91bmRGb3JtYXRzKCkgbnVtU3Vycm91bmRGb3JtYXRzICVkIHN1cnJvdW5kRm9ybWF0cyAlcCBzdXJyb3VuZEZvcm1hdHNFbmFibGVkICVwIgorICAgICAgICAgICAgIiByZXBvcnRlZCAlZCIsICpudW1TdXJyb3VuZEZvcm1hdHMsIHN1cnJvdW5kRm9ybWF0cywgc3Vycm91bmRGb3JtYXRzRW5hYmxlZCwgcmVwb3J0ZWQpOwogCiAgICAgLy8gT25seSByZXR1cm4gdmFsdWUgaWYgdGhlcmUgaXMgSERNSSBvdXRwdXQuCiAgICAgaWYgKChtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy50eXBlcygpICYgQVVESU9fREVWSUNFX09VVF9IRE1JKSA9PSAwKSB7CkBAIC0zNjA4LDg5ICszNTc1LDQ4IEBACiAgICAgc2l6ZV90IGZvcm1hdHNXcml0dGVuID0gMDsKICAgICBzaXplX3QgZm9ybWF0c01heCA9ICpudW1TdXJyb3VuZEZvcm1hdHM7CiAgICAgKm51bVN1cnJvdW5kRm9ybWF0cyA9IDA7Ci0gICAgRm9ybWF0VmVjdG9yIGZvcm1hdHM7CisgICAgc3RkOjp1bm9yZGVyZWRfc2V0PGF1ZGlvX2Zvcm1hdF90PiBmb3JtYXRzOwogICAgIGlmIChyZXBvcnRlZCkgewotICAgICAgICAvLyBPbmx5IGdldCBzdXJyb3VuZCBmb3JtYXRzIHdoaWNoIGFyZSByZXBvcnRlZCBieSBkZXZpY2UuCi0gICAgICAgIC8vIEZpcnN0IGxpc3QgYWxyZWFkeSBvcGVuIG91dHB1dHMgdGhhdCBjYW4gYmUgcm91dGVkIHRvIHRoaXMgZGV2aWNlCi0gICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBBVURJT19ERVZJQ0VfT1VUX0hETUk7Ci0gICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gb3V0cHV0czsKLSAgICAgICAgYm9vbCByZXBvcnRlZEZvcm1hdEZvdW5kID0gZmFsc2U7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1czsKLSAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2M7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIGRlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGkpOwotICAgICAgICAgICAgaWYgKCFkZXNjLT5pc0R1cGxpY2F0ZWQoKSAmJiAoZGVzYy0+c3VwcG9ydGVkRGV2aWNlcygpICYgZGV2aWNlKSkgewotICAgICAgICAgICAgICAgIG91dHB1dHMuYWRkKG1PdXRwdXRzLmtleUF0KGkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyBPcGVuIGFuIG91dHB1dCB0byBxdWVyeSBkeW5hbWljIHBhcmFtZXRlcnMuCi0gICAgICAgIERldmljZVZlY3RvciBoZG1pT3V0cHV0RGV2aWNlcyA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZSgKLSAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX0hETUkpOwotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhkbWlPdXRwdXREZXZpY2VzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBTdHJpbmc4IGFkZHJlc3MgPSBoZG1pT3V0cHV0RGV2aWNlc1tpXS0+bUFkZHJlc3M7Ci0gICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGh3TW9kdWxlIDogbUh3TW9kdWxlcykgewotICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaHdNb2R1bGUtPmdldE91dHB1dFByb2ZpbGVzKCkuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgc3A8SU9Qcm9maWxlPiBwcm9maWxlID0gaHdNb2R1bGUtPmdldE91dHB1dFByb2ZpbGVzKClbaV07Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwcm9maWxlLT5zdXBwb3J0RGV2aWNlKEFVRElPX0RFVklDRV9PVVRfSERNSSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5zdXBwb3J0RGV2aWNlQWRkcmVzcyhhZGRyZXNzKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGo7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgb3V0cHV0cy5zaXplKCk7IGorKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXRzLml0ZW1BdChqKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFkZXNjLT5pc0R1cGxpY2F0ZWQoKSAmJiBkZXNjLT5tUHJvZmlsZSA9PSBwcm9maWxlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqICE9IG91dHB1dHMuc2l6ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gZ2V0U3VwcG9ydGVkRm9ybWF0cyhvdXRwdXRzLml0ZW1BdChqKSwgZm9ybWF0cyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0ZWRGb3JtYXRGb3VuZCB8PSAoc3RhdHVzID09IE5PX0VSUk9SKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwcm9maWxlLT5jYW5PcGVuTmV3SW8oKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJNYXggT3V0cHV0IG51bWJlciAldSBhbHJlYWR5IG9wZW5lZCBmb3IgdGhpcyBwcm9maWxlICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5tYXhPcGVuQ291bnQsIHByb2ZpbGUtPmdldFRhZ05hbWUoKS5jX3N0cigpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIm9wZW5pbmcgb3V0cHV0IGZvciBkZXZpY2UgJTA4eCB3aXRoIHBhcmFtcyAlcyBwcm9maWxlICVwIG5hbWUgJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLCBhZGRyZXNzLnN0cmluZygpLCBwcm9maWxlLmdldCgpLCBwcm9maWxlLT5nZXROYW1lKCkuc3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVzYyA9IG5ldyBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcihwcm9maWxlLCBtcENsaWVudEludGVyZmFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGRlc2MtPm9wZW4obnVsbHB0ciwgZGV2aWNlLCBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TVFJFQU1fREVGQVVMVCwgQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBnZXRTdXBwb3J0ZWRGb3JtYXRzKG91dHB1dCwgZm9ybWF0cyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0ZWRGb3JtYXRGb3VuZCB8PSAoc3RhdHVzID09IE5PX0VSUk9SKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjLT5jbG9zZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFyZXBvcnRlZEZvcm1hdEZvdW5kKSB7Ci0gICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgLy8gUmV0dXJuIGZvcm1hdHMgZnJvbSBIRE1JIHByb2ZpbGVzLCB0aGF0IGhhdmUgYWxyZWFkeSBiZWVuIHJlc29sdmVkIGJ5CisgICAgICAgIC8vIGNoZWNrT3V0cHV0c0ZvckRldmljZSgpLgorICAgICAgICBEZXZpY2VWZWN0b3IgaGRtaU91dHB1dERldnMgPSBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGVNYXNrKAorICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX0hETUkpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhkbWlPdXRwdXREZXZzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgRm9ybWF0VmVjdG9yIHN1cHBvcnRlZEZvcm1hdHMgPQorICAgICAgICAgICAgICAgICBoZG1pT3V0cHV0RGV2c1tpXS0+Z2V0QXVkaW9Qb3J0KCktPmdldEF1ZGlvUHJvZmlsZXMoKS5nZXRTdXBwb3J0ZWRGb3JtYXRzKCk7CisgICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBzdXBwb3J0ZWRGb3JtYXRzLnNpemUoKTsgaisrKSB7CisgICAgICAgICAgICAgICAgIGlmIChtQ29uZmlnLmdldFN1cnJvdW5kRm9ybWF0cygpLmNvdW50KHN1cHBvcnRlZEZvcm1hdHNbal0pICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgIGZvcm1hdHMuaW5zZXJ0KHN1cHBvcnRlZEZvcm1hdHNbal0pOworICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBwYWlyIDogbUNvbmZpZy5nZXRTdXJyb3VuZEZvcm1hdHMoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYWlyLnNlY29uZC5jb3VudChzdXBwb3J0ZWRGb3JtYXRzW2pdKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdHMuaW5zZXJ0KHBhaXIuZmlyc3QpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9IGVsc2UgewotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEFSUkFZX1NJWkUoU1VSUk9VTkRfRk9STUFUUyk7IGkrKykgewotICAgICAgICAgICAgZm9ybWF0cy5hZGQoU1VSUk9VTkRfRk9STUFUU1tpXSk7CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgcGFpciA6IG1Db25maWcuZ2V0U3Vycm91bmRGb3JtYXRzKCkpIHsKKyAgICAgICAgICAgIGZvcm1hdHMuaW5zZXJ0KHBhaXIuZmlyc3QpOwogICAgICAgICB9CiAgICAgfQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZm9ybWF0cy5zaXplKCk7IGkrKykgeworICAgIGZvciAoY29uc3QgYXV0byYgZm9ybWF0OiBmb3JtYXRzKSB7CiAgICAgICAgIGlmIChmb3JtYXRzV3JpdHRlbiA8IGZvcm1hdHNNYXgpIHsKLSAgICAgICAgICAgIHN1cnJvdW5kRm9ybWF0c1tmb3JtYXRzV3JpdHRlbl0gPSBmb3JtYXRzW2ldOworICAgICAgICAgICAgc3Vycm91bmRGb3JtYXRzW2Zvcm1hdHNXcml0dGVuXSA9IGZvcm1hdDsKICAgICAgICAgICAgIGJvb2wgZm9ybWF0RW5hYmxlZCA9IGZhbHNlOwotICAgICAgICAgICAgaWYgKGZvcm1hdHNbaV0gPT0gQVVESU9fRk9STUFUX0FBQ19MQykgewotICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgQVJSQVlfU0laRShBQUNfRk9STUFUUyk7IGorKykgewotICAgICAgICAgICAgICAgICAgICBmb3JtYXRFbmFibGVkID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3Vycm91bmRGb3JtYXRzLmZpbmQoQUFDX0ZPUk1BVFNbaV0pICE9IG1TdXJyb3VuZEZvcm1hdHMuZW5kKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgaWYgKG1Db25maWcuZ2V0U3Vycm91bmRGb3JtYXRzKCkuY291bnQoZm9ybWF0KSA9PSAwKSB7CisgICAgICAgICAgICAgICAgLy8gQ2hlY2sgc3ViLWZvcm1hdHMKKyAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHBhaXIgOiBtQ29uZmlnLmdldFN1cnJvdW5kRm9ybWF0cygpKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgc3ViZm9ybWF0IDogcGFpci5zZWNvbmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdEVuYWJsZWQgPSBtU3Vycm91bmRGb3JtYXRzLmNvdW50KHN1YmZvcm1hdCkgIT0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmb3JtYXRFbmFibGVkKSBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoZm9ybWF0RW5hYmxlZCkgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmb3JtYXRFbmFibGVkID0gbVN1cnJvdW5kRm9ybWF0cy5maW5kKGZvcm1hdHNbaV0pICE9IG1TdXJyb3VuZEZvcm1hdHMuZW5kKCk7CisgICAgICAgICAgICAgICAgZm9ybWF0RW5hYmxlZCA9IG1TdXJyb3VuZEZvcm1hdHMuY291bnQoZm9ybWF0KSAhPSAwOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgc3Vycm91bmRGb3JtYXRzRW5hYmxlZFtmb3JtYXRzV3JpdHRlbisrXSA9IGZvcm1hdEVuYWJsZWQ7CiAgICAgICAgIH0KQEAgLTM3MDEsMTUgKzM2MjcsMTEgQEAKIAogc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRTdXJyb3VuZEZvcm1hdEVuYWJsZWQoYXVkaW9fZm9ybWF0X3QgYXVkaW9Gb3JtYXQsIGJvb2wgZW5hYmxlZCkKIHsKKyAgICBBTE9HVigiJXMoKSBmb3JtYXQgMHglWCBlbmFibGVkICVkIiwgX19mdW5jX18sIGF1ZGlvRm9ybWF0LCBlbmFibGVkKTsKICAgICAvLyBDaGVjayBpZiBhdWRpbyBmb3JtYXQgaXMgYSBzdXJyb3VuZCBmb3JtYXRzLgotICAgIGJvb2wgaXNTdXJyb3VuZEZvcm1hdCA9IGZhbHNlOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgQVJSQVlfU0laRShTVVJST1VORF9GT1JNQVRTKTsgaSsrKSB7Ci0gICAgICAgIGlmIChhdWRpb0Zvcm1hdCA9PSBTVVJST1VORF9GT1JNQVRTW2ldKSB7Ci0gICAgICAgICAgICBpc1N1cnJvdW5kRm9ybWF0ID0gdHJ1ZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmICghaXNTdXJyb3VuZEZvcm1hdCkgeworICAgIGNvbnN0IGF1dG8mIGZvcm1hdEl0ZXIgPSBtQ29uZmlnLmdldFN1cnJvdW5kRm9ybWF0cygpLmZpbmQoYXVkaW9Gb3JtYXQpOworICAgIGlmIChmb3JtYXRJdGVyID09IG1Db25maWcuZ2V0U3Vycm91bmRGb3JtYXRzKCkuZW5kKCkpIHsKKyAgICAgICAgQUxPR1coIiVzKCkgZm9ybWF0IDB4JVggaXMgbm90IGEga25vd24gc3Vycm91bmQgZm9ybWF0IiwgX19mdW5jX18sIGF1ZGlvRm9ybWF0KTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKQEAgLTM3MTcsNDAgKzM2MzksMzYgQEAKICAgICBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGZvcmNlVXNlID0gbUVuZ2luZS0+Z2V0Rm9yY2VVc2UoCiAgICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9FTkNPREVEX1NVUlJPVU5EKTsKICAgICBpZiAoZm9yY2VVc2UgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX0VOQ09ERURfU1VSUk9VTkRfTUFOVUFMKSB7CisgICAgICAgIEFMT0dXKCIlcygpIG5vdCBpbiBtYW51YWwgbW9kZSBmb3Igc3Vycm91bmQgc291bmQgZm9ybWF0IHNlbGVjdGlvbiIsIF9fZnVuY19fKTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIAotICAgIGlmICgobVN1cnJvdW5kRm9ybWF0cy5maW5kKGF1ZGlvRm9ybWF0KSAhPSBtU3Vycm91bmRGb3JtYXRzLmVuZCgpICYmIGVuYWJsZWQpCi0gICAgICAgICAgICB8fCAobVN1cnJvdW5kRm9ybWF0cy5maW5kKGF1ZGlvRm9ybWF0KSA9PSBtU3Vycm91bmRGb3JtYXRzLmVuZCgpICYmICFlbmFibGVkKSkgeworICAgIGlmICgobVN1cnJvdW5kRm9ybWF0cy5jb3VudChhdWRpb0Zvcm1hdCkgIT0gMCkgPT0gZW5hYmxlZCkgewogICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgfQogCiAgICAgLy8gVGhlIG9wZXJhdGlvbiBpcyB2YWxpZCBvbmx5IHdoZW4gdGhlcmUgaXMgSERNSSBvdXRwdXQgYXZhaWxhYmxlLgogICAgIGlmICgobUF2YWlsYWJsZU91dHB1dERldmljZXMudHlwZXMoKSAmIEFVRElPX0RFVklDRV9PVVRfSERNSSkgPT0gMCkgeworICAgICAgICBBTE9HVygiJXMoKSBubyBIRE1JIG91dCBkZXZpY2VzIGZvdW5kIiwgX19mdW5jX18pOwogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCisgICAgc3RkOjp1bm9yZGVyZWRfc2V0PGF1ZGlvX2Zvcm1hdF90PiBzdXJyb3VuZEZvcm1hdHNCYWNrdXAobVN1cnJvdW5kRm9ybWF0cyk7CiAgICAgaWYgKGVuYWJsZWQpIHsKLSAgICAgICAgaWYgKGF1ZGlvRm9ybWF0ID09IEFVRElPX0ZPUk1BVF9BQUNfTEMpIHsKLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgQVJSQVlfU0laRShBQUNfRk9STUFUUyk7IGkrKykgewotICAgICAgICAgICAgICAgIG1TdXJyb3VuZEZvcm1hdHMuaW5zZXJ0KEFBQ19GT1JNQVRTW2ldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1TdXJyb3VuZEZvcm1hdHMuaW5zZXJ0KGF1ZGlvRm9ybWF0KTsKKyAgICAgICAgbVN1cnJvdW5kRm9ybWF0cy5pbnNlcnQoYXVkaW9Gb3JtYXQpOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHN1YkZvcm1hdCA6IGZvcm1hdEl0ZXItPnNlY29uZCkgeworICAgICAgICAgICAgbVN1cnJvdW5kRm9ybWF0cy5pbnNlcnQoc3ViRm9ybWF0KTsKICAgICAgICAgfQogICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChhdWRpb0Zvcm1hdCA9PSBBVURJT19GT1JNQVRfQUFDX0xDKSB7Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEFSUkFZX1NJWkUoQUFDX0ZPUk1BVFMpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBtU3Vycm91bmRGb3JtYXRzLmVyYXNlKEFBQ19GT1JNQVRTW2ldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1TdXJyb3VuZEZvcm1hdHMuZXJhc2UoYXVkaW9Gb3JtYXQpOworICAgICAgICBtU3Vycm91bmRGb3JtYXRzLmVyYXNlKGF1ZGlvRm9ybWF0KTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBzdWJGb3JtYXQgOiBmb3JtYXRJdGVyLT5zZWNvbmQpIHsKKyAgICAgICAgICAgIG1TdXJyb3VuZEZvcm1hdHMuZXJhc2Uoc3ViRm9ybWF0KTsKICAgICAgICAgfQogICAgIH0KIAogICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjOwogICAgIGJvb2wgcHJvZmlsZVVwZGF0ZWQgPSBmYWxzZTsKLSAgICBEZXZpY2VWZWN0b3IgaGRtaU91dHB1dERldmljZXMgPSBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUoCisgICAgRGV2aWNlVmVjdG9yIGhkbWlPdXRwdXREZXZpY2VzID0gbUF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlTWFzaygKICAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfSERNSSk7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoZG1pT3V0cHV0RGV2aWNlcy5zaXplKCk7IGkrKykgewogICAgICAgICAvLyBTaW11bGF0ZSByZWNvbm5lY3Rpb24gdG8gdXBkYXRlIGVuYWJsZWQgc3Vycm91bmQgc291bmQgZm9ybWF0cy4KQEAgLTM3NjksNyArMzY4Nyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLmNfc3RyKCkpOwogICAgICAgICBwcm9maWxlVXBkYXRlZCB8PSAoc3RhdHVzID09IE5PX0VSUk9SKTsKICAgICB9Ci0gICAgRGV2aWNlVmVjdG9yIGhkbWlJbnB1dERldmljZXMgPSBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZSgKKyAgICBEZXZpY2VWZWN0b3IgaGRtaUlucHV0RGV2aWNlcyA9IG1BdmFpbGFibGVJbnB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlTWFzaygKICAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfSU5fSERNSSk7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoZG1pSW5wdXREZXZpY2VzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgIC8vIFNpbXVsYXRlIHJlY29ubmVjdGlvbiB0byB1cGRhdGUgZW5hYmxlZCBzdXJyb3VuZCBzb3VuZCBmb3JtYXRzLgpAQCAtMzc4OSwyNSArMzcwNyw5IEBACiAgICAgICAgIHByb2ZpbGVVcGRhdGVkIHw9IChzdGF0dXMgPT0gTk9fRVJST1IpOwogICAgIH0KIAotICAgIC8vIFVuZG8gdGhlIHN1cnJvdW5kIGZvcm1hdHMgY2hhbmdlIGR1ZSB0byBubyBhdWRpbyBwcm9maWxlcyB1cGRhdGVkLgogICAgIGlmICghcHJvZmlsZVVwZGF0ZWQpIHsKLSAgICAgICAgaWYgKGVuYWJsZWQpIHsKLSAgICAgICAgICAgIGlmIChhdWRpb0Zvcm1hdCA9PSBBVURJT19GT1JNQVRfQUFDX0xDKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBBUlJBWV9TSVpFKEFBQ19GT1JNQVRTKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TdXJyb3VuZEZvcm1hdHMuZXJhc2UoQUFDX0ZPUk1BVFNbaV0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbVN1cnJvdW5kRm9ybWF0cy5lcmFzZShhdWRpb0Zvcm1hdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoYXVkaW9Gb3JtYXQgPT0gQVVESU9fRk9STUFUX0FBQ19MQykgewotICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgQVJSQVlfU0laRShBQUNfRk9STUFUUyk7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBtU3Vycm91bmRGb3JtYXRzLmluc2VydChBQUNfRk9STUFUU1tpXSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtU3Vycm91bmRGb3JtYXRzLmluc2VydChhdWRpb0Zvcm1hdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICAgICAgQUxPR1coIiVzKCkgbm8gYXVkaW8gcHJvZmlsZXMgdXBkYXRlZCwgdW5kb2luZyBzdXJyb3VuZCBmb3JtYXRzIGNoYW5nZSIsIF9fZnVuY19fKTsKKyAgICAgICAgbVN1cnJvdW5kRm9ybWF0cyA9IHN0ZDo6bW92ZShzdXJyb3VuZEZvcm1hdHNCYWNrdXApOwogICAgIH0KIAogICAgIHJldHVybiBwcm9maWxlVXBkYXRlZCA/IE5PX0VSUk9SIDogSU5WQUxJRF9PUEVSQVRJT047CkBAIC0zODIwLDM4ICszNzIyLDM2IEBACiAgICAgVmVjdG9yPHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiA+IGFjdGl2ZUlucHV0cyA9IG1JbnB1dHMuZ2V0QWN0aXZlSW5wdXRzKCk7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhY3RpdmVJbnB1dHMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGFjdGl2ZURlc2MgPSBhY3RpdmVJbnB1dHNbaV07Ci0gICAgICAgIEF1ZGlvU2Vzc2lvbkNvbGxlY3Rpb24gYWN0aXZlU2Vzc2lvbnMgPSBhY3RpdmVEZXNjLT5nZXRBdWRpb1Nlc3Npb25zKHRydWUpOwotICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IGFjdGl2ZVNlc3Npb25zLnNpemUoKTsgaisrKSB7Ci0gICAgICAgICAgICBzcDxBdWRpb1Nlc3Npb24+IGFjdGl2ZVNlc3Npb24gPSBhY3RpdmVTZXNzaW9ucy52YWx1ZUF0KGopOwotICAgICAgICAgICAgaWYgKGFjdGl2ZVNlc3Npb24tPnVpZCgpID09IHVpZCkgewotICAgICAgICAgICAgICAgIGFjdGl2ZVNlc3Npb24tPnNldFNpbGVuY2VkKHNpbGVuY2VkKTsKKyAgICAgICAgUmVjb3JkQ2xpZW50VmVjdG9yIGNsaWVudHMgPSBhY3RpdmVEZXNjLT5jbGllbnRzTGlzdCh0cnVlIC8qYWN0aXZlT25seSovKTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBjbGllbnQgOiBjbGllbnRzKSB7CisgICAgICAgICAgICBpZiAodWlkID09IGNsaWVudC0+dWlkKCkpIHsKKyAgICAgICAgICAgICAgICBjbGllbnQtPnNldFNpbGVuY2VkKHNpbGVuY2VkKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIH0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpkaXNjb25uZWN0QXVkaW9Tb3VyY2UoY29uc3Qgc3A8QXVkaW9Tb3VyY2VEZXNjcmlwdG9yPiYgc291cmNlRGVzYykKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6ZGlzY29ubmVjdEF1ZGlvU291cmNlKGNvbnN0IHNwPFNvdXJjZUNsaWVudERlc2NyaXB0b3I+JiBzb3VyY2VEZXNjKQogewotICAgIEFMT0dWKCIlcyBoYW5kbGUgJWQiLCBfX0ZVTkNUSU9OX18sIHNvdXJjZURlc2MtPmdldEhhbmRsZSgpKTsKKyAgICBBTE9HVigiJXMgcG9ydCBJZCAlZCIsIF9fRlVOQ1RJT05fXywgc291cmNlRGVzYy0+cG9ydElkKCkpOwogCi0gICAgc3A8QXVkaW9QYXRjaD4gcGF0Y2hEZXNjID0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUZvcihzb3VyY2VEZXNjLT5tUGF0Y2hEZXNjLT5tSGFuZGxlKTsKKyAgICBzcDxBdWRpb1BhdGNoPiBwYXRjaERlc2MgPSBtQXVkaW9QYXRjaGVzLnZhbHVlRm9yKHNvdXJjZURlc2MtPnBhdGNoRGVzYygpLT5tSGFuZGxlKTsKICAgICBpZiAocGF0Y2hEZXNjID09IDApIHsKICAgICAgICAgQUxPR1coIiVzIHNvdXJjZSBoYXMgbm8gcGF0Y2ggd2l0aCBoYW5kbGUgJWQiLCBfX0ZVTkNUSU9OX18sCi0gICAgICAgICAgICAgIHNvdXJjZURlc2MtPm1QYXRjaERlc2MtPm1IYW5kbGUpOworICAgICAgICAgICAgICBzb3VyY2VEZXNjLT5wYXRjaERlc2MoKS0+bUhhbmRsZSk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQotICAgIHJlbW92ZUF1ZGlvUGF0Y2goc291cmNlRGVzYy0+bVBhdGNoRGVzYy0+bUhhbmRsZSk7CisgICAgcmVtb3ZlQXVkaW9QYXRjaChzb3VyY2VEZXNjLT5wYXRjaERlc2MoKS0+bUhhbmRsZSk7CiAKLSAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSA9IHN0cmVhbVR5cGVmcm9tQXR0cmlidXRlc0ludCgmc291cmNlRGVzYy0+bUF0dHJpYnV0ZXMpOwotICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBzd091dHB1dERlc2MgPSBzb3VyY2VEZXNjLT5tU3dPdXRwdXQucHJvbW90ZSgpOworICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBzd091dHB1dERlc2MgPSBzb3VyY2VEZXNjLT5zd091dHB1dCgpLnByb21vdGUoKTsKICAgICBpZiAoc3dPdXRwdXREZXNjICE9IDApIHsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gc3RvcFNvdXJjZShzd091dHB1dERlc2MsIHN0cmVhbSwgZmFsc2UpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBzdG9wU291cmNlKHN3T3V0cHV0RGVzYywgc291cmNlRGVzYyk7CiAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIHN3T3V0cHV0RGVzYy0+c3RvcCgpOwogICAgICAgICB9CiAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5yZWxlYXNlQXVkaW9QYXRjaChwYXRjaERlc2MtPm1BZlBhdGNoSGFuZGxlLCAwKTsKICAgICB9IGVsc2UgewotICAgICAgICBzcDxId0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gaHdPdXRwdXREZXNjID0gc291cmNlRGVzYy0+bUh3T3V0cHV0LnByb21vdGUoKTsKKyAgICAgICAgc3A8SHdBdWRpb091dHB1dERlc2NyaXB0b3I+IGh3T3V0cHV0RGVzYyA9IHNvdXJjZURlc2MtPmh3T3V0cHV0KCkucHJvbW90ZSgpOwogICAgICAgICBpZiAoaHdPdXRwdXREZXNjICE9IDApIHsKICAgICAgICAgICAvLyAgIHJlbGVhc2UgcGF0Y2ggYmV0d2VlbiBzcmMgZGV2aWNlIGFuZCBvdXRwdXQgZGV2aWNlCiAgICAgICAgICAgLy8gICBjbG9zZSBId291dHB1dCBhbmQgcmVtb3ZlIGZyb20gbUh3T3V0cHV0cwpAQCAtMzg2MiwxNSArMzc2MiwxNSBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotc3A8QXVkaW9Tb3VyY2VEZXNjcmlwdG9yPiBBdWRpb1BvbGljeU1hbmFnZXI6OmdldFNvdXJjZUZvclN0cmF0ZWd5T25PdXRwdXQoCitzcDxTb3VyY2VDbGllbnREZXNjcmlwdG9yPiBBdWRpb1BvbGljeU1hbmFnZXI6OmdldFNvdXJjZUZvclN0cmF0ZWd5T25PdXRwdXQoCiAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwgcm91dGluZ19zdHJhdGVneSBzdHJhdGVneSkKIHsKLSAgICBzcDxBdWRpb1NvdXJjZURlc2NyaXB0b3I+IHNvdXJjZTsKKyAgICBzcDxTb3VyY2VDbGllbnREZXNjcmlwdG9yPiBzb3VyY2U7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQXVkaW9Tb3VyY2VzLnNpemUoKTsgaSsrKSAgewotICAgICAgICBzcDxBdWRpb1NvdXJjZURlc2NyaXB0b3I+IHNvdXJjZURlc2MgPSBtQXVkaW9Tb3VyY2VzLnZhbHVlQXQoaSk7Ci0gICAgICAgIHJvdXRpbmdfc3RyYXRlZ3kgc291cmNlU3RyYXRlZ3kgPQotICAgICAgICAgICAgICAgIChyb3V0aW5nX3N0cmF0ZWd5KSBnZXRTdHJhdGVneUZvckF0dHIoJnNvdXJjZURlc2MtPm1BdHRyaWJ1dGVzKTsKLSAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBzb3VyY2VEZXNjLT5tU3dPdXRwdXQucHJvbW90ZSgpOworICAgICAgICBzcDxTb3VyY2VDbGllbnREZXNjcmlwdG9yPiBzb3VyY2VEZXNjID0gbUF1ZGlvU291cmNlcy52YWx1ZUF0KGkpOworICAgICAgICBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cmlidXRlcyA9IHNvdXJjZURlc2MtPmF0dHJpYnV0ZXMoKTsKKyAgICAgICAgcm91dGluZ19zdHJhdGVneSBzb3VyY2VTdHJhdGVneSA9IGdldFN0cmF0ZWd5Rm9yQXR0cigmYXR0cmlidXRlcyk7CisgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gc291cmNlRGVzYy0+c3dPdXRwdXQoKS5wcm9tb3RlKCk7CiAgICAgICAgIGlmIChzb3VyY2VTdHJhdGVneSA9PSBzdHJhdGVneSAmJiBvdXRwdXREZXNjICE9IDAgJiYgb3V0cHV0RGVzYy0+bUlvSGFuZGxlID09IG91dHB1dCkgewogICAgICAgICAgICAgc291cmNlID0gc291cmNlRGVzYzsKICAgICAgICAgICAgIGJyZWFrOwpAQCAtMzkwOCwxMSArMzgwOCwxMSBAQAogCiAgICAgZm9yIChjb25zdCBjaGFyKiBmaWxlTmFtZSA6IGZpbGVOYW1lcykgewogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGtDb25maWdMb2NhdGlvbkxpc3RTaXplOyBpKyspIHsKLSAgICAgICAgICAgIFBvbGljeVNlcmlhbGl6ZXIgc2VyaWFsaXplcjsKICAgICAgICAgICAgIHNucHJpbnRmKGF1ZGlvUG9saWN5WG1sQ29uZmlnRmlsZSwgc2l6ZW9mKGF1ZGlvUG9saWN5WG1sQ29uZmlnRmlsZSksCiAgICAgICAgICAgICAgICAgICAgICAiJXMvJXMiLCBrQ29uZmlnTG9jYXRpb25MaXN0W2ldLCBmaWxlTmFtZSk7Ci0gICAgICAgICAgICByZXQgPSBzZXJpYWxpemVyLmRlc2VyaWFsaXplKGF1ZGlvUG9saWN5WG1sQ29uZmlnRmlsZSwgY29uZmlnKTsKKyAgICAgICAgICAgIHJldCA9IGRlc2VyaWFsaXplQXVkaW9Qb2xpY3lGaWxlKGF1ZGlvUG9saWN5WG1sQ29uZmlnRmlsZSwgJmNvbmZpZyk7CiAgICAgICAgICAgICBpZiAocmV0ID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgY29uZmlnLnNldFNvdXJjZShhdWRpb1BvbGljeVhtbENvbmZpZ0ZpbGUpOwogICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTM5MjQsNyArMzgyNCw3IEBACiBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvUG9saWN5TWFuYWdlcihBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSAqY2xpZW50SW50ZXJmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAvKmZvclRlc3RpbmcqLykKICAgICA6Ci0gICAgbVVpZENhY2hlZChnZXR1aWQoKSksCisgICAgbVVpZENhY2hlZChBSURfQVVESU9TRVJWRVIpLCAvLyBubyBuZWVkIHRvIGNhbGwgZ2V0dWlkKCksIHRoZXJlJ3Mgb25seSBvbmUgb2YgdXMgcnVubmluZy4KICAgICBtcENsaWVudEludGVyZmFjZShjbGllbnRJbnRlcmZhY2UpLAogICAgIG1MaW1pdFJpbmd0b25lVm9sdW1lKGZhbHNlKSwgbUxhc3RWb2ljZVZvbHVtZSgtMS4wZiksCiAgICAgbUEyZHBTdXNwZW5kZWQoZmFsc2UpLApAQCAtNDAzNSw3ICszOTM1LDggQEAKICAgICAgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbmV3IFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yKG91dFByb2ZpbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZSk7CiAgICAgICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3IgJnN1cHBvcnRlZERldmljZXMgPSBvdXRQcm9maWxlLT5nZXRTdXBwb3J0ZWREZXZpY2VzKCk7Ci0gICAgICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3IgJmRldmljZXNGb3JUeXBlID0gc3VwcG9ydGVkRGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUocHJvZmlsZVR5cGUpOworICAgICAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yICZkZXZpY2VzRm9yVHlwZSA9IHN1cHBvcnRlZERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlTWFzaygKKyAgICAgICAgICAgICAgICAgICAgcHJvZmlsZVR5cGUpOwogICAgICAgICAgICAgU3RyaW5nOCBhZGRyZXNzID0gZGV2aWNlc0ZvclR5cGUuc2l6ZSgpID4gMCA/IGRldmljZXNGb3JUeXBlLml0ZW1BdCgwKS0+bUFkZHJlc3MKICAgICAgICAgICAgICAgICAgICAgOiBTdHJpbmc4KCIiKTsKICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOwpAQCAtNDA4OSw3ICszOTkwLDcgQEAKICAgICAgICAgICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPQogICAgICAgICAgICAgICAgICAgICBuZXcgQXVkaW9JbnB1dERlc2NyaXB0b3IoaW5Qcm9maWxlLCBtcENsaWVudEludGVyZmFjZSk7CiAKLSAgICAgICAgICAgIERldmljZVZlY3RvciBpbnB1dERldmljZXMgPSBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZShwcm9maWxlVHlwZSk7CisgICAgICAgICAgICBEZXZpY2VWZWN0b3IgaW5wdXREZXZpY2VzID0gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGVNYXNrKHByb2ZpbGVUeXBlKTsKICAgICAgICAgICAgIC8vICAgdGhlIGlucHV0cyB2ZWN0b3IgbXVzdCBiZSBvZiBzaXplID49IDEsIGJ1dCB3ZSBkb24ndCB3YW50IHRvIGNyYXNoIGhlcmUKICAgICAgICAgICAgIFN0cmluZzggYWRkcmVzcyA9IGlucHV0RGV2aWNlcy5zaXplKCkgPiAwID8gaW5wdXREZXZpY2VzLml0ZW1BdCgwKS0+bUFkZHJlc3MKICAgICAgICAgICAgICAgICAgICAgOiBTdHJpbmc4KCIiKTsKQEAgLTQ2MTgsMTAgKzQ1MTksOSBAQAogICAgICAgICAgICAgLy8gYW5kIGFzIHRoZXkgd2VyZSBhbHNvIHJlZmVyZW5jZWQgb24gdGhlIG90aGVyIG91dHB1dCwgdGhlIHJlZmVyZW5jZQogICAgICAgICAgICAgLy8gY291bnQgZm9yIHRoZWlyIHN0cmVhbSB0eXBlIG11c3QgYmUgYWRqdXN0ZWQgYWNjb3JkaW5nbHkgb24KICAgICAgICAgICAgIC8vIHRoZSBvdGhlciBvdXRwdXQuCi0gICAgICAgICAgICBib29sIHdhc0FjdGl2ZSA9IG91dHB1dERlc2MyLT5pc0FjdGl2ZSgpOwotICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBBVURJT19TVFJFQU1fQ05UOyBqKyspIHsKLSAgICAgICAgICAgICAgICBpbnQgcmVmQ291bnQgPSBkdXBPdXRwdXREZXNjLT5tUmVmQ291bnRbal07Ci0gICAgICAgICAgICAgICAgb3V0cHV0RGVzYzItPmNoYW5nZVJlZkNvdW50KChhdWRpb19zdHJlYW1fdHlwZV90KWosLXJlZkNvdW50KTsKKyAgICAgICAgICAgIGNvbnN0IGJvb2wgd2FzQWN0aXZlID0gb3V0cHV0RGVzYzItPmlzQWN0aXZlKCk7CisgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJmNsaWVudFBhaXIgOiBkdXBPdXRwdXREZXNjLT5nZXRBY3RpdmVDbGllbnRzKCkpIHsKKyAgICAgICAgICAgICAgICBvdXRwdXREZXNjMi0+Y2hhbmdlU3RyZWFtQWN0aXZlQ291bnQoY2xpZW50UGFpci5maXJzdCwgLWNsaWVudFBhaXIuc2Vjb25kKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIHN0b3AoKSB3aWxsIGJlIGEgbm8gb3AgaWYgdGhlIG91dHB1dCBpcyBzdGlsbCBhY3RpdmUgYnV0IGlzIG5lZWRlZCBpbiBjYXNlIGFsbAogICAgICAgICAgICAgLy8gYWN0aXZlIHN0cmVhbXMgcmVmY291bnRzIHdoZXJlIGNsZWFyZWQgYWJvdmUKQEAgLTQ2NTAsNiArNDU1MCwyMiBAQAogCiAgICAgcmVtb3ZlT3V0cHV0KG91dHB1dCk7CiAgICAgbVByZXZpb3VzT3V0cHV0cyA9IG1PdXRwdXRzOworCisgICAgLy8gTVNEIHBhdGNoZXMgbWF5IGhhdmUgYmVlbiByZWxlYXNlZCB0byBzdXBwb3J0IGEgbm9uLU1TRCBkaXJlY3Qgb3V0cHV0LiBSZXNldCBNU0QgcGF0Y2ggaWYKKyAgICAvLyBubyBkaXJlY3Qgb3V0cHV0cyBhcmUgb3Blbi4KKyAgICBpZiAoZ2V0TXNkQXVkaW9PdXREZXZpY2VUeXBlcygpICE9IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgIGJvb2wgZGlyZWN0T3V0cHV0T3BlbiA9IGZhbHNlOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBpZiAobU91dHB1dHNbaV0tPm1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCkgeworICAgICAgICAgICAgICAgIGRpcmVjdE91dHB1dE9wZW4gPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghZGlyZWN0T3V0cHV0T3BlbikgeworICAgICAgICAgICAgQUxPR1YoIm5vIGRpcmVjdCBvdXRwdXRzIG9wZW4sIHJlc2V0IE1TRCBwYXRjaCIpOworICAgICAgICAgICAgc2V0TXNkUGF0Y2goKTsKKyAgICAgICAgfQorICAgIH0KIH0KIAogdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmNsb3NlSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQpCkBAIC00NjY0LDYgKzQ1ODAsNyBAQAogCiAgICAgbmV4dEF1ZGlvUG9ydEdlbmVyYXRpb24oKTsKIAorICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBpbnB1dERlc2MtPm1EZXZpY2U7CiAgICAgc3NpemVfdCBpbmRleCA9IG1BdWRpb1BhdGNoZXMuaW5kZXhPZktleShpbnB1dERlc2MtPmdldFBhdGNoSGFuZGxlKCkpOwogICAgIGlmIChpbmRleCA+PSAwKSB7CiAgICAgICAgIHNwPEF1ZGlvUGF0Y2g+IHBhdGNoRGVzYyA9IG1BdWRpb1BhdGNoZXMudmFsdWVBdChpbmRleCk7CkBAIC00Njc0LDYgKzQ1OTEsMTIgQEAKIAogICAgIGlucHV0RGVzYy0+Y2xvc2UoKTsKICAgICBtSW5wdXRzLnJlbW92ZUl0ZW0oaW5wdXQpOworCisgICAgYXVkaW9fZGV2aWNlc190IHByaW1hcnlJbnB1dERldmljZXMgPSBhdmFpbGFibGVQcmltYXJ5SW5wdXREZXZpY2VzKCk7CisgICAgaWYgKCgoZGV2aWNlICYgcHJpbWFyeUlucHV0RGV2aWNlcyAmIH5BVURJT19ERVZJQ0VfQklUX0lOKSAhPSAwKSAmJgorICAgICAgICAgICAgbUlucHV0cy5hY3RpdmVJbnB1dHNDb3VudE9uRGV2aWNlcyhwcmltYXJ5SW5wdXREZXZpY2VzKSA9PSAwKSB7CisgICAgICAgIFNvdW5kVHJpZ2dlcjo6c2V0Q2FwdHVyZVN0YXRlKGZhbHNlKTsKKyAgICB9CiB9CiAKIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRPdXRwdXRzRm9yRGV2aWNlKApAQCAtNDY5NSwxOCArNDYxOCwxNyBAQAogICAgIHJldHVybiBvdXRwdXRzOwogfQogCi1ib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6dmVjdG9yc0VxdWFsKFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4mIG91dHB1dHMxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+JiBvdXRwdXRzMikKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjaGVja0ZvckRldmljZUFuZE91dHB1dENoYW5nZXMoc3RkOjpmdW5jdGlvbjxib29sKCk+IG9uT3V0cHV0c0NoZWNrZWQpCiB7Ci0gICAgaWYgKG91dHB1dHMxLnNpemUoKSAhPSBvdXRwdXRzMi5zaXplKCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIC8vIGNoZWNrQTJkcFN1c3BlbmQgbXVzdCBydW4gYmVmb3JlIGNoZWNrT3V0cHV0Rm9yQWxsU3RyYXRlZ2llcyBzbyB0aGF0IEEyRFAKKyAgICAvLyBvdXRwdXQgaXMgc3VzcGVuZGVkIGJlZm9yZSBhbnkgdHJhY2tzIGFyZSBtb3ZlZCB0byBpdAorICAgIGNoZWNrQTJkcFN1c3BlbmQoKTsKKyAgICBjaGVja091dHB1dEZvckFsbFN0cmF0ZWdpZXMoKTsKKyAgICBpZiAob25PdXRwdXRzQ2hlY2tlZCAhPSBudWxscHRyICYmIG9uT3V0cHV0c0NoZWNrZWQoKSkgY2hlY2tBMmRwU3VzcGVuZCgpOworICAgIHVwZGF0ZURldmljZXNBbmRPdXRwdXRzKCk7CisgICAgaWYgKG1Id01vZHVsZXMuZ2V0TW9kdWxlRnJvbU5hbWUoQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX01TRCkgIT0gMCkgeworICAgICAgICBzZXRNc2RQYXRjaCgpOwogICAgIH0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG91dHB1dHMxLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGlmIChvdXRwdXRzMVtpXSAhPSBvdXRwdXRzMltpXSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwogfQogCiB2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2hlY2tPdXRwdXRGb3JTdHJhdGVneShyb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5KQpAQCAtNDczNCw3ICs0NjU2LDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIGlmICghdmVjdG9yc0VxdWFsKHNyY091dHB1dHMsZHN0T3V0cHV0cykpIHsKKyAgICBpZiAoc3JjT3V0cHV0cyAhPSBkc3RPdXRwdXRzKSB7CiAgICAgICAgIC8vIGdldCBtYXhpbXVtIGxhdGVuY3kgb2YgYWxsIHNvdXJjZSBvdXRwdXRzIHRvIGRldGVybWluZSB0aGUgbWluaW11bSBtdXRlIHRpbWUgZ3VhcmFudGVlaW5nCiAgICAgICAgIC8vIGF1ZGlvIGZyb20gaW52YWxpZGF0ZWQgdHJhY2tzIHdpbGwgYmUgcmVuZGVyZWQgd2hlbiB1bm11dGluZwogICAgICAgICB1aW50MzJfdCBtYXhMYXRlbmN5ID0gMDsKQEAgLTQ3NTMsNyArNDY3NSw3IEBACiAgICAgICAgICAgICAgICAgc2V0U3RyYXRlZ3lNdXRlKHN0cmF0ZWd5LCB0cnVlLCBkZXNjKTsKICAgICAgICAgICAgICAgICBzZXRTdHJhdGVneU11dGUoc3RyYXRlZ3ksIGZhbHNlLCBkZXNjLCBtYXhMYXRlbmN5ICogTEFURU5DWV9NVVRFX0ZBQ1RPUiwgbmV3RGV2aWNlKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNwPEF1ZGlvU291cmNlRGVzY3JpcHRvcj4gc291cmNlID0KKyAgICAgICAgICAgIHNwPFNvdXJjZUNsaWVudERlc2NyaXB0b3I+IHNvdXJjZSA9CiAgICAgICAgICAgICAgICAgICAgIGdldFNvdXJjZUZvclN0cmF0ZWd5T25PdXRwdXQoc3JjT3V0LCBzdHJhdGVneSk7CiAgICAgICAgICAgICBpZiAoc291cmNlICE9IDApewogICAgICAgICAgICAgICAgIGNvbm5lY3RBdWRpb1NvdXJjZShzb3VyY2UpOwpAQCAtNDgzOCwxMSArNDc2MCw0MSBAQAogICAgIH0KIH0KIAordGVtcGxhdGUgPGNsYXNzIElvRGVzY3JpcHRvciwgY2xhc3MgRmlsdGVyPgorc3A8RGV2aWNlRGVzY3JpcHRvcj4gQXVkaW9Qb2xpY3lNYW5hZ2VyOjpmaW5kUHJlZmVycmVkRGV2aWNlKAorICAgICAgICBJb0Rlc2NyaXB0b3ImIGRlc2MsIEZpbHRlciBmaWx0ZXIsIGJvb2wmIGFjdGl2ZSwgY29uc3QgRGV2aWNlVmVjdG9yJiBkZXZpY2VzKQoreworICAgIGF1dG8gYWN0aXZlQ2xpZW50cyA9IGRlc2MtPmNsaWVudHNMaXN0KHRydWUgLyphY3RpdmVPbmx5Ki8pOworICAgIGF1dG8gYWN0aXZlQ2xpZW50c1dpdGhSb3V0ZSA9CisgICAgICAgIGRlc2MtPmNsaWVudHNMaXN0KHRydWUgLyphY3RpdmVPbmx5Ki8sIGZpbHRlciwgdHJ1ZSAvKnByZWZlcnJlZERldmljZSovKTsKKyAgICBhY3RpdmUgPSBhY3RpdmVDbGllbnRzLnNpemUoKSA+IDA7CisgICAgaWYgKGFjdGl2ZSAmJiBhY3RpdmVDbGllbnRzLnNpemUoKSA9PSBhY3RpdmVDbGllbnRzV2l0aFJvdXRlLnNpemUoKSkgeworICAgICAgICByZXR1cm4gZGV2aWNlcy5nZXREZXZpY2VGcm9tSWQoYWN0aXZlQ2xpZW50c1dpdGhSb3V0ZVswXS0+cHJlZmVycmVkRGV2aWNlSWQoKSk7CisgICAgfQorICAgIHJldHVybiBudWxscHRyOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgSW9Db2xsZWN0aW9uLCBjbGFzcyBGaWx0ZXI+CitzcDxEZXZpY2VEZXNjcmlwdG9yPiBBdWRpb1BvbGljeU1hbmFnZXI6OmZpbmRQcmVmZXJyZWREZXZpY2UoCisgICAgICAgIElvQ29sbGVjdGlvbiYgaW9Db2xsZWN0aW9uLCBGaWx0ZXIgZmlsdGVyLCBjb25zdCBEZXZpY2VWZWN0b3ImIGRldmljZXMpCit7CisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW9Db2xsZWN0aW9uLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGF1dG8gZGVzYyA9IGlvQ29sbGVjdGlvbi52YWx1ZUF0KGkpOworICAgICAgICBib29sIGFjdGl2ZTsKKyAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gY3VyRGV2aWNlID0gZmluZFByZWZlcnJlZERldmljZShkZXNjLCBmaWx0ZXIsIGFjdGl2ZSwgZGV2aWNlcyk7CisgICAgICAgIGlmIChhY3RpdmUgJiYgY3VyRGV2aWNlID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICB9IGVsc2UgaWYgKGN1ckRldmljZSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBkZXZpY2UgPSBjdXJEZXZpY2U7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGRldmljZTsKK30KKwogYXVkaW9fZGV2aWNlc190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0TmV3T3V0cHV0RGV2aWNlKGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmcm9tQ2FjaGUpCiB7Ci0gICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IEFVRElPX0RFVklDRV9OT05FOwotCiAgICAgc3NpemVfdCBpbmRleCA9IG1BdWRpb1BhdGNoZXMuaW5kZXhPZktleShvdXRwdXREZXNjLT5nZXRQYXRjaEhhbmRsZSgpKTsKICAgICBpZiAoaW5kZXggPj0gMCkgewogICAgICAgICBzcDxBdWRpb1BhdGNoPiBwYXRjaERlc2MgPSBtQXVkaW9QYXRjaGVzLnZhbHVlQXQoaW5kZXgpOwpAQCAtNDg1MywxOCArNDgwNSwxMyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgLy8gQ2hlY2sgaWYgYW4gZXhwbGljaXQgcm91dGluZyByZXF1ZXN0IGV4aXN0cyBmb3IgYW4gYWN0aXZlIHN0cmVhbSBvbiB0aGlzIG91dHB1dCBhbmQKLSAgICAvLyB1c2UgaXQgaW4gcHJpb3JpdHkgYmVmb3JlIGFueSBvdGhlciBydWxlCi0gICAgZm9yIChpbnQgc3RyZWFtID0gMDsgc3RyZWFtIDwgQVVESU9fU1RSRUFNX0ZPUl9QT0xJQ1lfQ05UOyBzdHJlYW0rKykgewotICAgICAgICBpZiAob3V0cHV0RGVzYy0+aXNTdHJlYW1BY3RpdmUoKGF1ZGlvX3N0cmVhbV90eXBlX3Qpc3RyZWFtKSkgewotICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGZvcmNlZERldmljZSA9Ci0gICAgICAgICAgICAgICAgICAgIG1PdXRwdXRSb3V0ZXMuZ2V0QWN0aXZlRGV2aWNlRm9yU3RyZWFtKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhdWRpb19zdHJlYW1fdHlwZV90KXN0cmVhbSwgbUF2YWlsYWJsZU91dHB1dERldmljZXMpOwotCi0gICAgICAgICAgICBpZiAoZm9yY2VkRGV2aWNlICE9IEFVRElPX0RFVklDRV9OT05FKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZvcmNlZERldmljZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgIC8vIEhvbm9yIGV4cGxpY2l0IHJvdXRpbmcgcmVxdWVzdHMgb25seSBpZiBubyBjbGllbnQgdXNpbmcgZGVmYXVsdCByb3V0aW5nIGlzIGFjdGl2ZSBvbiB0aGlzCisgICAgLy8gaW5wdXQ6IGEgc3BlY2lmaWMgYXBwIGNhbiBub3QgZm9yY2Ugcm91dGluZyBmb3Igb3RoZXIgYXBwcyBieSBzZXR0aW5nIGEgcHJlZmVycmVkIGRldmljZS4KKyAgICBib29sIGFjdGl2ZTsgLy8gdW51c2VkCisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlRGVzYyA9CisgICAgICAgIGZpbmRQcmVmZXJyZWREZXZpY2Uob3V0cHV0RGVzYywgU1RSQVRFR1lfTk9ORSwgYWN0aXZlLCBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyk7CisgICAgaWYgKGRldmljZURlc2MgIT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gZGV2aWNlRGVzYy0+dHlwZSgpOwogICAgIH0KIAogICAgIC8vIGNoZWNrIHRoZSBmb2xsb3dpbmcgYnkgb3JkZXIgb2YgcHJpb3JpdHkgdG8gcmVxdWVzdCBhIHJvdXRpbmcgY2hhbmdlIGlmIG5lY2Vzc2FyeToKQEAgLTQ4OTAsMTMgKzQ4MzcsMTQgQEAKICAgICAvLyBGSVhNRTogZXh0ZW5kIHVzZSBvZiBpc1N0cmF0ZWd5QWN0aXZlT25TYW1lTW9kdWxlKCkgdG8gYWxsIHN0cmF0ZWdpZXMKICAgICAvLyB3aXRoIGEgcmVmaW5lZCBydWxlIGNvbnNpZGVyaW5nIG11dHVhbGx5IGV4Y2x1c2l2ZSBkZXZpY2VzICh1c2luZyBzYW1lIGJhY2tlbmQpCiAgICAgLy8gYXMgb3Bwb3NlZCB0byBhbGwgc3RyZWFtcyBvbiB0aGUgc2FtZSBhdWRpbyBIQUwgbW9kdWxlLgorICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBBVURJT19ERVZJQ0VfTk9ORTsKICAgICBpZiAoaXNTdHJhdGVneUFjdGl2ZShvdXRwdXREZXNjLCBTVFJBVEVHWV9FTkZPUkNFRF9BVURJQkxFKSAmJgogICAgICAgICBtRW5naW5lLT5nZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1NZU1RFTSkgPT0gQVVESU9fUE9MSUNZX0ZPUkNFX1NZU1RFTV9FTkZPUkNFRCkgewogICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9FTkZPUkNFRF9BVURJQkxFLCBmcm9tQ2FjaGUpOwogICAgIH0gZWxzZSBpZiAoaXNJbkNhbGwoKSB8fAogICAgICAgICAgICAgICAgaXNTdHJhdGVneUFjdGl2ZU9uU2FtZU1vZHVsZShvdXRwdXREZXNjLCBTVFJBVEVHWV9QSE9ORSkpIHsKICAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfUEhPTkUsIGZyb21DYWNoZSk7Ci0gICAgfSBlbHNlIGlmIChpc1N0cmF0ZWd5QWN0aXZlKG91dHB1dERlc2MsIFNUUkFURUdZX1NPTklGSUNBVElPTikpIHsKKyAgICB9IGVsc2UgaWYgKGlzU3RyYXRlZ3lBY3RpdmVPblNhbWVNb2R1bGUob3V0cHV0RGVzYywgU1RSQVRFR1lfU09OSUZJQ0FUSU9OKSkgewogICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9TT05JRklDQVRJT04sIGZyb21DYWNoZSk7CiAgICAgfSBlbHNlIGlmIChpc1N0cmF0ZWd5QWN0aXZlKG91dHB1dERlc2MsIFNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEUpKSB7CiAgICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEUsIGZyb21DYWNoZSk7CkBAIC00OTMyLDYgKzQ4ODAsMTUgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIC8vIEhvbm9yIGV4cGxpY2l0IHJvdXRpbmcgcmVxdWVzdHMgb25seSBpZiBubyBjbGllbnQgdXNpbmcgZGVmYXVsdCByb3V0aW5nIGlzIGFjdGl2ZSBvbiB0aGlzCisgICAgLy8gaW5wdXQ6IGEgc3BlY2lmaWMgYXBwIGNhbiBub3QgZm9yY2Ugcm91dGluZyBmb3Igb3RoZXIgYXBwcyBieSBzZXR0aW5nIGEgcHJlZmVycmVkIGRldmljZS4KKyAgICBib29sIGFjdGl2ZTsKKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2VEZXNjID0KKyAgICAgICAgZmluZFByZWZlcnJlZERldmljZShpbnB1dERlc2MsIEFVRElPX1NPVVJDRV9ERUZBVUxULCBhY3RpdmUsIG1BdmFpbGFibGVJbnB1dERldmljZXMpOworICAgIGlmIChkZXZpY2VEZXNjICE9IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIGRldmljZURlc2MtPnR5cGUoKTsKKyAgICB9CisKICAgICAvLyBJZiB3ZSBhcmUgbm90IGluIGNhbGwgYW5kIG5vIGNsaWVudCBpcyBhY3RpdmUgb24gdGhpcyBpbnB1dCwgdGhpcyBtZXRob2RzIHJldHVybnMKICAgICAvLyBBVURJT19ERVZJQ0VfTk9ORSwgY2F1c2luZyB0aGUgcGF0Y2ggb24gdGhlIGlucHV0IHN0cmVhbSB0byBiZSByZWxlYXNlZC4KICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UgPSBpbnB1dERlc2MtPmdldEhpZ2hlc3RQcmlvcml0eVNvdXJjZSh0cnVlIC8qYWN0aXZlT25seSovKTsKQEAgLTQ5NjEsNiArNDkxOCw3IEBACiAgICAgaWYgKHN0cmVhbSA8IChhdWRpb19zdHJlYW1fdHlwZV90KSAwIHx8IHN0cmVhbSA+PSBBVURJT19TVFJFQU1fUFVCTElDX0NOVCkgewogICAgICAgICByZXR1cm4gQVVESU9fREVWSUNFX05PTkU7CiAgICAgfQorICAgIGF1ZGlvX2RldmljZXNfdCBhY3RpdmVEZXZpY2VzID0gQVVESU9fREVWSUNFX05PTkU7CiAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMgPSBBVURJT19ERVZJQ0VfTk9ORTsKICAgICBmb3IgKGludCBjdXJTdHJlYW0gPSAwOyBjdXJTdHJlYW0gPCBBVURJT19TVFJFQU1fRk9SX1BPTElDWV9DTlQ7IGN1clN0cmVhbSsrKSB7CiAgICAgICAgIGlmICghc3RyZWFtc01hdGNoRm9ydm9sdW1lKHN0cmVhbSwgKGF1ZGlvX3N0cmVhbV90eXBlX3QpY3VyU3RyZWFtKSkgewpAQCAtNDk2OSwxNSArNDkyNywyMCBAQAogICAgICAgICByb3V0aW5nX3N0cmF0ZWd5IGN1clN0cmF0ZWd5ID0gZ2V0U3RyYXRlZ3koKGF1ZGlvX3N0cmVhbV90eXBlX3QpY3VyU3RyZWFtKTsKICAgICAgICAgYXVkaW9fZGV2aWNlc190IGN1ckRldmljZXMgPQogICAgICAgICAgICAgICAgIGdldERldmljZUZvclN0cmF0ZWd5KChyb3V0aW5nX3N0cmF0ZWd5KWN1clN0cmF0ZWd5LCBmYWxzZSAvKmZyb21DYWNoZSovKTsKKyAgICAgICAgZGV2aWNlcyB8PSBjdXJEZXZpY2VzOwogICAgICAgICBmb3IgKGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA6IGdldE91dHB1dHNGb3JEZXZpY2UoY3VyRGV2aWNlcywgbU91dHB1dHMpKSB7CiAgICAgICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXQpOwogICAgICAgICAgICAgaWYgKG91dHB1dERlc2MtPmlzU3RyZWFtQWN0aXZlKChhdWRpb19zdHJlYW1fdHlwZV90KWN1clN0cmVhbSkpIHsKLSAgICAgICAgICAgICAgICBjdXJEZXZpY2VzIHw9IG91dHB1dERlc2MtPmRldmljZSgpOworICAgICAgICAgICAgICAgIGFjdGl2ZURldmljZXMgfD0gb3V0cHV0RGVzYy0+ZGV2aWNlKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgZGV2aWNlcyB8PSBjdXJEZXZpY2VzOwogICAgIH0KIAorICAgIC8vIEZhdm9yIGRldmljZXMgc2VsZWN0ZWQgb24gYWN0aXZlIHN0cmVhbXMgaWYgYW55IHRvIHJlcG9ydCBjb3JyZWN0IGRldmljZSBpbiBjYXNlIG9mCisgICAgLy8gZXhwbGljaXQgZGV2aWNlIHNlbGVjdGlvbgorICAgIGlmIChhY3RpdmVEZXZpY2VzICE9IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgIGRldmljZXMgPSBhY3RpdmVEZXZpY2VzOworICAgIH0KICAgICAvKkZpbHRlciBTUEVBS0VSX1NBRkUgb3V0IG9mIHJlc3VsdHMsIGFzIEF1ZGlvU2VydmljZSBkb2Vzbid0IGtub3cgYWJvdXQgaXQKICAgICAgIGFuZCBkb2Vzbid0IHJlYWxseSBuZWVkIHRvLiovCiAgICAgaWYgKGRldmljZXMgJiBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVJfU0FGRSkgewpAQCAtNDk5MywxNiArNDk1NiwxNiBAQAogICAgIHJldHVybiBtRW5naW5lLT5nZXRTdHJhdGVneUZvclN0cmVhbShzdHJlYW0pOwogfQogCi11aW50MzJfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldFN0cmF0ZWd5Rm9yQXR0cihjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIpIHsKK3JvdXRpbmdfc3RyYXRlZ3kgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRTdHJhdGVneUZvckF0dHIoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyKSB7CiAgICAgLy8gZmxhZ3MgdG8gc3RyYXRlZ3kgbWFwcGluZwogICAgIGlmICgoYXR0ci0+ZmxhZ3MgJiBBVURJT19GTEFHX0JFQUNPTikgPT0gQVVESU9fRkxBR19CRUFDT04pIHsKLSAgICAgICAgcmV0dXJuICh1aW50MzJfdCkgU1RSQVRFR1lfVFJBTlNNSVRURURfVEhST1VHSF9TUEVBS0VSOworICAgICAgICByZXR1cm4gU1RSQVRFR1lfVFJBTlNNSVRURURfVEhST1VHSF9TUEVBS0VSOwogICAgIH0KICAgICBpZiAoKGF0dHItPmZsYWdzICYgQVVESU9fRkxBR19BVURJQklMSVRZX0VORk9SQ0VEKSA9PSBBVURJT19GTEFHX0FVRElCSUxJVFlfRU5GT1JDRUQpIHsKLSAgICAgICAgcmV0dXJuICh1aW50MzJfdCkgU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRTsKKyAgICAgICAgcmV0dXJuIFNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEU7CiAgICAgfQogICAgIC8vIHVzYWdlIHRvIHN0cmF0ZWd5IG1hcHBpbmcKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KG1FbmdpbmUtPmdldFN0cmF0ZWd5Rm9yVXNhZ2UoYXR0ci0+dXNhZ2UpKTsKKyAgICByZXR1cm4gbUVuZ2luZS0+Z2V0U3RyYXRlZ3lGb3JVc2FnZShhdHRyLT51c2FnZSk7CiB9CiAKIHZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpoYW5kbGVOb3RpZmljYXRpb25Sb3V0aW5nRm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSB7CkBAIC01MDc4LDE3ICs1MDQxLDExIEBACiBhdWRpb19kZXZpY2VzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXREZXZpY2VGb3JTdHJhdGVneShyb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmcm9tQ2FjaGUpCiB7Ci0gICAgLy8gQ2hlY2sgaWYgYW4gZXhwbGljaXQgcm91dGluZyByZXF1ZXN0IGV4aXN0cyBmb3IgYSBzdHJlYW0gdHlwZSBjb3JyZXNwb25kaW5nIHRvIHRoZQotICAgIC8vIHNwZWNpZmllZCBzdHJhdGVneSBhbmQgdXNlIGl0IGluIHByaW9yaXR5IG92ZXIgZGVmYXVsdCByb3V0aW5nIHJ1bGVzLgotICAgIGZvciAoaW50IHN0cmVhbSA9IDA7IHN0cmVhbSA8IEFVRElPX1NUUkVBTV9GT1JfUE9MSUNZX0NOVDsgc3RyZWFtKyspIHsKLSAgICAgICAgaWYgKGdldFN0cmF0ZWd5KChhdWRpb19zdHJlYW1fdHlwZV90KXN0cmVhbSkgPT0gc3RyYXRlZ3kpIHsKLSAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBmb3JjZWREZXZpY2UgPQotICAgICAgICAgICAgICAgICAgICBtT3V0cHV0Um91dGVzLmdldEFjdGl2ZURldmljZUZvclN0cmVhbSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXVkaW9fc3RyZWFtX3R5cGVfdClzdHJlYW0sIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzKTsKLSAgICAgICAgICAgIGlmIChmb3JjZWREZXZpY2UgIT0gQVVESU9fREVWSUNFX05PTkUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZm9yY2VkRGV2aWNlOwotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgLy8gSG9ub3IgZXhwbGljaXQgcm91dGluZyByZXF1ZXN0cyBvbmx5IGlmIGFsbCBhY3RpdmUgY2xpZW50cyBoYXZlIGEgcHJlZmVycmVkIHJvdXRlIGluIHdoaWNoCisgICAgLy8gY2FzZSB0aGUgbGFzdCBhY3RpdmUgY2xpZW50IHJvdXRlIGlzIHVzZWQKKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2VEZXNjID0gZmluZFByZWZlcnJlZERldmljZShtT3V0cHV0cywgc3RyYXRlZ3ksIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzKTsKKyAgICBpZiAoZGV2aWNlRGVzYyAhPSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBkZXZpY2VEZXNjLT50eXBlKCk7CiAgICAgfQogCiAgICAgaWYgKGZyb21DYWNoZSkgewpAQCAtNTI1OCw1NCArNTIxNSwyMCBAQAogICAgIH0gZWxzZSB7CiAgICAgICAgIERldmljZVZlY3RvciBkZXZpY2VMaXN0OwogICAgICAgICBpZiAoKGFkZHJlc3MgPT0gTlVMTCkgfHwgKHN0cmxlbihhZGRyZXNzKSA9PSAwKSkgewotICAgICAgICAgICAgZGV2aWNlTGlzdCA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZShkZXZpY2UpOworICAgICAgICAgICAgZGV2aWNlTGlzdCA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZU1hc2soZGV2aWNlKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGRldmljZUxpc3QgPSBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGVBZGRyKGRldmljZSwgU3RyaW5nOChhZGRyZXNzKSk7CisgICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2VEZXNjID0gbUF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlKAorICAgICAgICAgICAgICAgICAgICBkZXZpY2UsIFN0cmluZzgoYWRkcmVzcykpOworICAgICAgICAgICAgaWYgKGRldmljZURlc2MpIGRldmljZUxpc3QuYWRkKGRldmljZURlc2MpOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKCFkZXZpY2VMaXN0LmlzRW1wdHkoKSkgewotICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BhdGNoIHBhdGNoOwotICAgICAgICAgICAgb3V0cHV0RGVzYy0+dG9BdWRpb1BvcnRDb25maWcoJnBhdGNoLnNvdXJjZXNbMF0pOwotICAgICAgICAgICAgcGF0Y2gubnVtX3NvdXJjZXMgPSAxOwotICAgICAgICAgICAgcGF0Y2gubnVtX3NpbmtzID0gMDsKKyAgICAgICAgICAgIFBhdGNoQnVpbGRlciBwYXRjaEJ1aWxkZXI7CisgICAgICAgICAgICBwYXRjaEJ1aWxkZXIuYWRkU291cmNlKG91dHB1dERlc2MpOwogICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBkZXZpY2VMaXN0LnNpemUoKSAmJiBpIDwgQVVESU9fUEFUQ0hfUE9SVFNfTUFYOyBpKyspIHsKLSAgICAgICAgICAgICAgICBkZXZpY2VMaXN0Lml0ZW1BdChpKS0+dG9BdWRpb1BvcnRDb25maWcoJnBhdGNoLnNpbmtzW2ldKTsKLSAgICAgICAgICAgICAgICBwYXRjaC5udW1fc2lua3MrKzsKKyAgICAgICAgICAgICAgICBwYXRjaEJ1aWxkZXIuYWRkU2luayhkZXZpY2VMaXN0Lml0ZW1BdChpKSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzc2l6ZV90IGluZGV4OwotICAgICAgICAgICAgaWYgKHBhdGNoSGFuZGxlICYmICpwYXRjaEhhbmRsZSAhPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORSkgewotICAgICAgICAgICAgICAgIGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KCpwYXRjaEhhbmRsZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KG91dHB1dERlc2MtPmdldFBhdGNoSGFuZGxlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3A8IEF1ZGlvUGF0Y2g+IHBhdGNoRGVzYzsKLSAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGFmUGF0Y2hIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKLSAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgcGF0Y2hEZXNjID0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUF0KGluZGV4KTsKLSAgICAgICAgICAgICAgICBhZlBhdGNoSGFuZGxlID0gcGF0Y2hEZXNjLT5tQWZQYXRjaEhhbmRsZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPmNyZWF0ZUF1ZGlvUGF0Y2goJnBhdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhZlBhdGNoSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5TXMpOwotICAgICAgICAgICAgQUxPR1YoInNldE91dHB1dERldmljZSgpIGNyZWF0ZUF1ZGlvUGF0Y2ggcmV0dXJuZWQgJWQgcGF0Y2hIYW5kbGUgJWQiCi0gICAgICAgICAgICAgICAgICAgICJudW1fc291cmNlcyAlZCBudW1fc2lua3MgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLCBhZlBhdGNoSGFuZGxlLCBwYXRjaC5udW1fc291cmNlcywgcGF0Y2gubnVtX3NpbmtzKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhdGNoRGVzYyA9IG5ldyBBdWRpb1BhdGNoKCZwYXRjaCwgbVVpZENhY2hlZCk7Ci0gICAgICAgICAgICAgICAgICAgIGFkZEF1ZGlvUGF0Y2gocGF0Y2hEZXNjLT5tSGFuZGxlLCBwYXRjaERlc2MpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhdGNoRGVzYy0+bVBhdGNoID0gcGF0Y2g7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBhdGNoRGVzYy0+bUFmUGF0Y2hIYW5kbGUgPSBhZlBhdGNoSGFuZGxlOwotICAgICAgICAgICAgICAgIGlmIChwYXRjaEhhbmRsZSkgewotICAgICAgICAgICAgICAgICAgICAqcGF0Y2hIYW5kbGUgPSBwYXRjaERlc2MtPm1IYW5kbGU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPnNldFBhdGNoSGFuZGxlKHBhdGNoRGVzYy0+bUhhbmRsZSk7Ci0gICAgICAgICAgICAgICAgbmV4dEF1ZGlvUG9ydEdlbmVyYXRpb24oKTsKLSAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+b25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgaW5zdGFsbFBhdGNoKF9fZnVuY19fLCBwYXRjaEhhbmRsZSwgb3V0cHV0RGVzYy5nZXQoKSwgcGF0Y2hCdWlsZGVyLnBhdGNoKCksIGRlbGF5TXMpOwogICAgICAgICB9CiAKICAgICAgICAgLy8gaW5mb3JtIGFsbCBpbnB1dCBhcyB3ZWxsCkBAIC01MzYzLDUzICs1Mjg2LDIxIEBACiAgICAgaWYgKChkZXZpY2UgIT0gQVVESU9fREVWSUNFX05PTkUpICYmICgoZGV2aWNlICE9IGlucHV0RGVzYy0+bURldmljZSkgfHwgZm9yY2UpKSB7CiAgICAgICAgIGlucHV0RGVzYy0+bURldmljZSA9IGRldmljZTsKIAotICAgICAgICBEZXZpY2VWZWN0b3IgZGV2aWNlTGlzdCA9IG1BdmFpbGFibGVJbnB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKGRldmljZSk7CisgICAgICAgIERldmljZVZlY3RvciBkZXZpY2VMaXN0ID0gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGVNYXNrKGRldmljZSk7CiAgICAgICAgIGlmICghZGV2aWNlTGlzdC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wYXRjaCBwYXRjaDsKLSAgICAgICAgICAgIGlucHV0RGVzYy0+dG9BdWRpb1BvcnRDb25maWcoJnBhdGNoLnNpbmtzWzBdKTsKKyAgICAgICAgICAgIFBhdGNoQnVpbGRlciBwYXRjaEJ1aWxkZXI7CisgICAgICAgICAgICBwYXRjaEJ1aWxkZXIuYWRkU2luayhpbnB1dERlc2MsCiAgICAgICAgICAgICAvLyBBVURJT19TT1VSQ0VfSE9UV09SRCBpcyBmb3IgaW50ZXJuYWwgdXNlIG9ubHk6CiAgICAgICAgICAgICAvLyBoYW5kbGVkIGFzIEFVRElPX1NPVVJDRV9WT0lDRV9SRUNPR05JVElPTiBieSB0aGUgYXVkaW8gSEFMCi0gICAgICAgICAgICBpZiAocGF0Y2guc2lua3NbMF0uZXh0Lm1peC51c2VjYXNlLnNvdXJjZSA9PSBBVURJT19TT1VSQ0VfSE9UV09SRCAmJgotICAgICAgICAgICAgICAgICAgICAhaW5wdXREZXNjLT5pc1NvdW5kVHJpZ2dlcigpKSB7Ci0gICAgICAgICAgICAgICAgcGF0Y2guc2lua3NbMF0uZXh0Lm1peC51c2VjYXNlLnNvdXJjZSA9IEFVRElPX1NPVVJDRV9WT0lDRV9SRUNPR05JVElPTjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBhdGNoLm51bV9zaW5rcyA9IDE7CisgICAgICAgICAgICAgICAgICAgIFtpbnB1dERlc2NdKGNvbnN0IFBhdGNoQnVpbGRlcjo6bWl4X3VzZWNhc2VfdCYgdXNlY2FzZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYXV0byByZXN1bHQgPSB1c2VjYXNlOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5zb3VyY2UgPT0gQVVESU9fU09VUkNFX0hPVFdPUkQgJiYgIWlucHV0RGVzYy0+aXNTb3VuZFRyaWdnZXIoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5zb3VyY2UgPSBBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT047CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OyB9KS4KICAgICAgICAgICAgIC8vb25seSBvbmUgaW5wdXQgZGV2aWNlIGZvciBub3cKLSAgICAgICAgICAgIGRldmljZUxpc3QuaXRlbUF0KDApLT50b0F1ZGlvUG9ydENvbmZpZygmcGF0Y2guc291cmNlc1swXSk7Ci0gICAgICAgICAgICBwYXRjaC5udW1fc291cmNlcyA9IDE7Ci0gICAgICAgICAgICBzc2l6ZV90IGluZGV4OwotICAgICAgICAgICAgaWYgKHBhdGNoSGFuZGxlICYmICpwYXRjaEhhbmRsZSAhPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORSkgewotICAgICAgICAgICAgICAgIGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KCpwYXRjaEhhbmRsZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KGlucHV0RGVzYy0+Z2V0UGF0Y2hIYW5kbGUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzcDwgQXVkaW9QYXRjaD4gcGF0Y2hEZXNjOwotICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgYWZQYXRjaEhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOwotICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgICAgICAgICBwYXRjaERlc2MgPSBtQXVkaW9QYXRjaGVzLnZhbHVlQXQoaW5kZXgpOwotICAgICAgICAgICAgICAgIGFmUGF0Y2hIYW5kbGUgPSBwYXRjaERlc2MtPm1BZlBhdGNoSGFuZGxlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+Y3JlYXRlQXVkaW9QYXRjaCgmcGF0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYWZQYXRjaEhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOwotICAgICAgICAgICAgQUxPR1YoInNldElucHV0RGV2aWNlKCkgY3JlYXRlQXVkaW9QYXRjaCByZXR1cm5lZCAlZCBwYXRjaEhhbmRsZSAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cywgYWZQYXRjaEhhbmRsZSk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICAgICAgICAgICAgICBwYXRjaERlc2MgPSBuZXcgQXVkaW9QYXRjaCgmcGF0Y2gsIG1VaWRDYWNoZWQpOwotICAgICAgICAgICAgICAgICAgICBhZGRBdWRpb1BhdGNoKHBhdGNoRGVzYy0+bUhhbmRsZSwgcGF0Y2hEZXNjKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBwYXRjaERlc2MtPm1QYXRjaCA9IHBhdGNoOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwYXRjaERlc2MtPm1BZlBhdGNoSGFuZGxlID0gYWZQYXRjaEhhbmRsZTsKLSAgICAgICAgICAgICAgICBpZiAocGF0Y2hIYW5kbGUpIHsKLSAgICAgICAgICAgICAgICAgICAgKnBhdGNoSGFuZGxlID0gcGF0Y2hEZXNjLT5tSGFuZGxlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpbnB1dERlc2MtPnNldFBhdGNoSGFuZGxlKHBhdGNoRGVzYy0+bUhhbmRsZSk7Ci0gICAgICAgICAgICAgICAgbmV4dEF1ZGlvUG9ydEdlbmVyYXRpb24oKTsKLSAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+b25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBhZGRTb3VyY2UoZGV2aWNlTGlzdC5pdGVtQXQoMCkpOworICAgICAgICAgICAgc3RhdHVzID0gaW5zdGFsbFBhdGNoKF9fZnVuY19fLCBwYXRjaEhhbmRsZSwgaW5wdXREZXNjLmdldCgpLCBwYXRjaEJ1aWxkZXIucGF0Y2goKSwgMCk7CiAgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIHN0YXR1czsKQEAgLTU0OTgsNiArNTM4OSwxNSBAQAogYXVkaW9fZGV2aWNlc190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0RGV2aWNlQW5kTWl4Rm9ySW5wdXRTb3VyY2UoYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01peCAqKnBvbGljeU1peCkKIHsKKyAgICAvLyBIb25vciBleHBsaWNpdCByb3V0aW5nIHJlcXVlc3RzIG9ubHkgaWYgYWxsIGFjdGl2ZSBjbGllbnRzIGhhdmUgYSBwcmVmZXJyZWQgcm91dGUgaW4gd2hpY2gKKyAgICAvLyBjYXNlIHRoZSBsYXN0IGFjdGl2ZSBjbGllbnQgcm91dGUgaXMgdXNlZAorICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZURlc2MgPQorICAgICAgICBmaW5kUHJlZmVycmVkRGV2aWNlKG1JbnB1dHMsIGlucHV0U291cmNlLCBtQXZhaWxhYmxlSW5wdXREZXZpY2VzKTsKKyAgICBpZiAoZGV2aWNlRGVzYyAhPSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBkZXZpY2VEZXNjLT50eXBlKCk7CisgICAgfQorCisKICAgICBhdWRpb19kZXZpY2VzX3QgYXZhaWxhYmxlRGV2aWNlVHlwZXMgPSBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLnR5cGVzKCkgJiB+QVVESU9fREVWSUNFX0JJVF9JTjsKICAgICBhdWRpb19kZXZpY2VzX3Qgc2VsZWN0ZWREZXZpY2VGcm9tTWl4ID0KICAgICAgICAgICAgbVBvbGljeU1peGVzLmdldERldmljZUFuZE1peEZvcklucHV0U291cmNlKGlucHV0U291cmNlLCBhdmFpbGFibGVEZXZpY2VUeXBlcywgcG9saWN5TWl4KTsKQEAgLTU1MTAsMjAgKzU0MTAsNyBAQAogCiBhdWRpb19kZXZpY2VzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXREZXZpY2VGb3JJbnB1dFNvdXJjZShhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSkKIHsKLSAgICAvLyBSb3V0aW5nCi0gICAgLy8gU2NhbiB0aGUgd2hvbGUgUm91dGVNYXAgdG8gc2VlIGlmIHdlIGhhdmUgYW4gZXhwbGljaXQgcm91dGU6Ci0gICAgLy8gaWYgdGhlIGlucHV0IHNvdXJjZSBpbiB0aGUgUm91dGVNYXAgaXMgdGhlIHNhbWUgYXMgdGhlIGFyZ3VtZW50IGFib3ZlLAotICAgIC8vIGFuZCBhY3Rpdml0eSBjb3VudCBpcyBub24temVybyBhbmQgdGhlIGRldmljZSBpbiB0aGUgcm91dGUgZGVzY3JpcHRvciBpcyBhdmFpbGFibGUKLSAgICAvLyB0aGVuIHNlbGVjdCB0aGlzIGRldmljZS4KLSAgICBmb3IgKHNpemVfdCByb3V0ZUluZGV4ID0gMDsgcm91dGVJbmRleCA8IG1JbnB1dFJvdXRlcy5zaXplKCk7IHJvdXRlSW5kZXgrKykgewotICAgICAgICAgc3A8U2Vzc2lvblJvdXRlPiByb3V0ZSA9IG1JbnB1dFJvdXRlcy52YWx1ZUF0KHJvdXRlSW5kZXgpOwotICAgICAgICAgaWYgKChpbnB1dFNvdXJjZSA9PSByb3V0ZS0+bVNvdXJjZSkgJiYgcm91dGUtPmlzQWN0aXZlT3JDaGFuZ2VkKCkgJiYKLSAgICAgICAgICAgICAgICAgKG1BdmFpbGFibGVJbnB1dERldmljZXMuaW5kZXhPZihyb3V0ZS0+bURldmljZURlc2NyaXB0b3IpID49IDApKSB7Ci0gICAgICAgICAgICAgcmV0dXJuIHJvdXRlLT5tRGV2aWNlRGVzY3JpcHRvci0+dHlwZSgpOwotICAgICAgICAgfQotICAgICB9Ci0KLSAgICAgcmV0dXJuIG1FbmdpbmUtPmdldERldmljZUZvcklucHV0U291cmNlKGlucHV0U291cmNlKTsKKyAgICByZXR1cm4gbUVuZ2luZS0+Z2V0RGV2aWNlRm9ySW5wdXRTb3VyY2UoaW5wdXRTb3VyY2UpOwogfQogCiBmbG9hdCBBdWRpb1BvbGljeU1hbmFnZXI6OmNvbXB1dGVWb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCkBAIC01NTQzLDggKzU0MzAsOCBAQAogICAgICAgICByZXR1cm4gcmluZ1ZvbHVtZURCIC0gNCA+IHZvbHVtZURCID8gcmluZ1ZvbHVtZURCIC0gNCA6IHZvbHVtZURCOwogICAgIH0KIAotICAgIC8vIGluLWNhbGw6IGFsd2F5cyBjYXAgZWFycGllY2Ugdm9sdW1lIGJ5IHZvaWNlIHZvbHVtZSArIHNvbWUgbG93IGhlYWRyb29tCi0gICAgaWYgKChzdHJlYW0gIT0gQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwpICYmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX0VBUlBJRUNFKSAmJgorICAgIC8vIGluLWNhbGw6IGFsd2F5cyBjYXAgdm9sdW1lIGJ5IHZvaWNlIHZvbHVtZSArIHNvbWUgbG93IGhlYWRyb29tCisgICAgaWYgKChzdHJlYW0gIT0gQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwpICYmCiAgICAgICAgICAgICAoaXNJbkNhbGwoKSB8fCBtT3V0cHV0cy5pc1N0cmVhbUFjdGl2ZUxvY2FsbHkoQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwpKSkgewogICAgICAgICBzd2l0Y2ggKHN0cmVhbSkgewogICAgICAgICBjYXNlIEFVRElPX1NUUkVBTV9TWVNURU06CkBAIC01NTU2LDkgKzU0NDMsOSBAQAogICAgICAgICBjYXNlIEFVRElPX1NUUkVBTV9EVE1GOgogICAgICAgICBjYXNlIEFVRElPX1NUUkVBTV9BQ0NFU1NJQklMSVRZOiB7CiAgICAgICAgICAgICBpbnQgdm9pY2VWb2x1bWVJbmRleCA9Ci0gICAgICAgICAgICAgICAgbVZvbHVtZUN1cnZlcy0+Z2V0Vm9sdW1lSW5kZXgoQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwsIEFVRElPX0RFVklDRV9PVVRfRUFSUElFQ0UpOworICAgICAgICAgICAgICAgIG1Wb2x1bWVDdXJ2ZXMtPmdldFZvbHVtZUluZGV4KEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMLCBkZXZpY2UpOwogICAgICAgICAgICAgY29uc3QgZmxvYXQgbWF4Vm9pY2VWb2xEYiA9Ci0gICAgICAgICAgICAgICAgY29tcHV0ZVZvbHVtZShBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCwgdm9pY2VWb2x1bWVJbmRleCwgQVVESU9fREVWSUNFX09VVF9FQVJQSUVDRSkKKyAgICAgICAgICAgICAgICBjb21wdXRlVm9sdW1lKEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMLCB2b2ljZVZvbHVtZUluZGV4LCBkZXZpY2UpCiAgICAgICAgICAgICAgICAgKyBJTl9DQUxMX0VBUlBJRUNFX0hFQURST09NX0RCOwogICAgICAgICAgICAgaWYgKHZvbHVtZURCID4gbWF4Vm9pY2VWb2xEYikgewogICAgICAgICAgICAgICAgIEFMT0dWKCJjb21wdXRlVm9sdW1lKCkgc3RyZWFtICVkIGF0IHZvbD0lZiBvdmVycmlkZW4gYnkgc3RyZWFtICVkIGF0IHZvbD0lZiIsCkBAIC01NjI5LDYgKzU1MTYsMjEgQEAKICAgICByZXR1cm4gdm9sdW1lREI7CiB9CiAKK2ludCBBdWRpb1BvbGljeU1hbmFnZXI6OnJlc2NhbGVWb2x1bWVJbmRleChpbnQgc3JjSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzcmNTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBkc3RTdHJlYW0pCit7CisgICAgaWYgKHNyY1N0cmVhbSA9PSBkc3RTdHJlYW0pIHsKKyAgICAgICAgcmV0dXJuIHNyY0luZGV4OworICAgIH0KKyAgICBmbG9hdCBtaW5TcmMgPSAoZmxvYXQpbVZvbHVtZUN1cnZlcy0+Z2V0Vm9sdW1lSW5kZXhNaW4oc3JjU3RyZWFtKTsKKyAgICBmbG9hdCBtYXhTcmMgPSAoZmxvYXQpbVZvbHVtZUN1cnZlcy0+Z2V0Vm9sdW1lSW5kZXhNYXgoc3JjU3RyZWFtKTsKKyAgICBmbG9hdCBtaW5Ec3QgPSAoZmxvYXQpbVZvbHVtZUN1cnZlcy0+Z2V0Vm9sdW1lSW5kZXhNaW4oZHN0U3RyZWFtKTsKKyAgICBmbG9hdCBtYXhEc3QgPSAoZmxvYXQpbVZvbHVtZUN1cnZlcy0+Z2V0Vm9sdW1lSW5kZXhNYXgoZHN0U3RyZWFtKTsKKworICAgIHJldHVybiAoaW50KShtaW5Ec3QgKyAoKHNyY0luZGV4IC0gbWluU3JjKSAqIChtYXhEc3QgLSBtaW5Ec3QpKSAvIChtYXhTcmMgLSBtaW5TcmMpKTsKK30KKwogc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjaGVja0FuZFNldFZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MsCkBAIC01NzU1LDU1ICs1NjU3LDYgQEAKICAgICB9CiB9CiAKLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN0YXJ0aW5nLCBib29sIHN0YXRlQ2hhbmdlKQotewotICAgIGlmKCFoYXNQcmltYXJ5T3V0cHV0KCkpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8vIGlmIHRoZSBzdHJlYW0gcGVydGFpbnMgdG8gc29uaWZpY2F0aW9uIHN0cmF0ZWd5IGFuZCB3ZSBhcmUgaW4gY2FsbCB3ZSBtdXN0Ci0gICAgLy8gbXV0ZSB0aGUgc3RyZWFtIGlmIGl0IGlzIGxvdyB2aXNpYmlsaXR5LiBJZiBpdCBpcyBoaWdoIHZpc2liaWxpdHksIHdlIG11c3QgcGxheSBhIHRvbmUKLSAgICAvLyBpbiB0aGUgZGV2aWNlIHVzZWQgZm9yIHBob25lIHN0cmF0ZWd5IGFuZCBwbGF5IHRoZSB0b25lIGlmIHRoZSBzZWxlY3RlZCBkZXZpY2UgZG9lcyBub3QKLSAgICAvLyBpbnRlcmZlcmUgd2l0aCB0aGUgZGV2aWNlIHVzZWQgZm9yIHBob25lIHN0cmF0ZWd5Ci0gICAgLy8gaWYgc3RhdGVDaGFuZ2UgaXMgdHJ1ZSwgd2UgYXJlIGNhbGxlZCBmcm9tIHNldFBob25lU3RhdGUoKSBhbmQgd2UgbXVzdCBtdXRlIG9yIHVubXV0ZSBhcwotICAgIC8vIG1hbnkgdGltZXMgYXMgdGhlcmUgYXJlIGFjdGl2ZSB0cmFja3Mgb24gdGhlIG91dHB1dAotICAgIGNvbnN0IHJvdXRpbmdfc3RyYXRlZ3kgc3RyZWFtX3N0cmF0ZWd5ID0gZ2V0U3RyYXRlZ3koc3RyZWFtKTsKLSAgICBpZiAoKHN0cmVhbV9zdHJhdGVneSA9PSBTVFJBVEVHWV9TT05JRklDQVRJT04pIHx8Ci0gICAgICAgICAgICAoKHN0cmVhbV9zdHJhdGVneSA9PSBTVFJBVEVHWV9TT05JRklDQVRJT05fUkVTUEVDVEZVTCkpKSB7Ci0gICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbVByaW1hcnlPdXRwdXQ7Ci0gICAgICAgIEFMT0dWKCJoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oKSBzdHJlYW0gJWQgc3RhcnRpbmcgJWQgZGV2aWNlICV4IHN0YXRlQ2hhbmdlICVkIiwKLSAgICAgICAgICAgICAgICBzdHJlYW0sIHN0YXJ0aW5nLCBvdXRwdXREZXNjLT5tRGV2aWNlLCBzdGF0ZUNoYW5nZSk7Ci0gICAgICAgIGlmIChvdXRwdXREZXNjLT5tUmVmQ291bnRbc3RyZWFtXSkgewotICAgICAgICAgICAgaW50IG11dGVDb3VudCA9IDE7Ci0gICAgICAgICAgICBpZiAoc3RhdGVDaGFuZ2UpIHsKLSAgICAgICAgICAgICAgICBtdXRlQ291bnQgPSBvdXRwdXREZXNjLT5tUmVmQ291bnRbc3RyZWFtXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChhdWRpb19pc19sb3dfdmlzaWJpbGl0eShzdHJlYW0pKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoImhhbmRsZUluY2FsbFNvbmlmaWNhdGlvbigpIGxvdyB2aXNpYmlsaXR5LCBtdXRlQ291bnQgJWQiLCBtdXRlQ291bnQpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbXV0ZUNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgc2V0U3RyZWFtTXV0ZShzdHJlYW0sIHN0YXJ0aW5nLCBtUHJpbWFyeU91dHB1dCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiaGFuZGxlSW5jYWxsU29uaWZpY2F0aW9uKCkgaGlnaCB2aXNpYmlsaXR5Iik7Ci0gICAgICAgICAgICAgICAgaWYgKG91dHB1dERlc2MtPmRldmljZSgpICYKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX1BIT05FLCB0cnVlIC8qZnJvbUNhY2hlKi8pKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oKSBoaWdoIHZpc2liaWxpdHkgbXV0ZWQsIG11dGVDb3VudCAlZCIsIG11dGVDb3VudCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbXV0ZUNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldFN0cmVhbU11dGUoc3RyZWFtLCBzdGFydGluZywgbVByaW1hcnlPdXRwdXQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChzdGFydGluZykgewotICAgICAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c3RhcnRUb25lKEFVRElPX1BPTElDWV9UT05FX0lOX0NBTExfTk9USUZJQ0FUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c3RvcFRvbmUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KIGF1ZGlvX3N0cmVhbV90eXBlX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzdHJlYW1UeXBlZnJvbUF0dHJpYnV0ZXNJbnQoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyKQogewogICAgIC8vIGZsYWdzIHRvIHN0cmVhbSB0eXBlIG1hcHBpbmcKQEAgLTU4MTcsMzkgKzU2NzAsNyBAQAogICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX1RUUzsKICAgICB9CiAKLSAgICAvLyB1c2FnZSB0byBzdHJlYW0gdHlwZSBtYXBwaW5nCi0gICAgc3dpdGNoIChhdHRyLT51c2FnZSkgewotICAgIGNhc2UgQVVESU9fVVNBR0VfTUVESUE6Ci0gICAgY2FzZSBBVURJT19VU0FHRV9HQU1FOgotICAgIGNhc2UgQVVESU9fVVNBR0VfQVNTSVNUQU5UOgotICAgIGNhc2UgQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9OQVZJR0FUSU9OX0dVSURBTkNFOgotICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX01VU0lDOwotICAgIGNhc2UgQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9BQ0NFU1NJQklMSVRZOgotICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX0FDQ0VTU0lCSUxJVFk7Ci0gICAgY2FzZSBBVURJT19VU0FHRV9BU1NJU1RBTkNFX1NPTklGSUNBVElPTjoKLSAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9TWVNURU07Ci0gICAgY2FzZSBBVURJT19VU0FHRV9WT0lDRV9DT01NVU5JQ0FUSU9OOgotICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEw7Ci0KLSAgICBjYXNlIEFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT05fU0lHTkFMTElORzoKLSAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9EVE1GOwotCi0gICAgY2FzZSBBVURJT19VU0FHRV9BTEFSTToKLSAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9BTEFSTTsKLSAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9URUxFUEhPTllfUklOR1RPTkU6Ci0gICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fUklORzsKLQotICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OOgotICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fUkVRVUVTVDoKLSAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX0lOU1RBTlQ6Ci0gICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9ERUxBWUVEOgotICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0VWRU5UOgotICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX05PVElGSUNBVElPTjsKLQotICAgIGNhc2UgQVVESU9fVVNBR0VfVU5LTk9XTjoKLSAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX01VU0lDOwotICAgIH0KKyAgICByZXR1cm4gYXVkaW9fdXNhZ2VfdG9fc3RyZWFtX3R5cGUoYXR0ci0+dXNhZ2UpOwogfQogCiBib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6aXNWYWxpZEF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICpwYWEpCkBAIC01ODk0LDcgKzU3MTUsNyBAQAogICAgIH0KICAgICBmb3IgKGludCBpID0gMDsgaSA8IChpbnQpQVVESU9fU1RSRUFNX0ZPUl9QT0xJQ1lfQ05UOyBpKyspIHsKICAgICAgICAgaWYgKCgoZ2V0U3RyYXRlZ3koKGF1ZGlvX3N0cmVhbV90eXBlX3QpaSkgPT0gc3RyYXRlZ3kpIHx8Ci0gICAgICAgICAgICAgICAgKE5VTV9TVFJBVEVHSUVTID09IHN0cmF0ZWd5KSkgJiYKKyAgICAgICAgICAgICAgICAoU1RSQVRFR1lfTk9ORSA9PSBzdHJhdGVneSkpICYmCiAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+aXNTdHJlYW1BY3RpdmUoKGF1ZGlvX3N0cmVhbV90eXBlX3QpaSwgaW5QYXN0TXMsIHN5c1RpbWUpKSB7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQpAQCAtNTkzNCwxMCArNTc1NSwxMCBAQAogdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmNsZWFuVXBGb3JEZXZpY2UoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIGRldmljZURlc2MpCiB7CiAgICAgZm9yIChzc2l6ZV90IGkgPSAoc3NpemVfdCltQXVkaW9Tb3VyY2VzLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSAgewotICAgICAgICBzcDxBdWRpb1NvdXJjZURlc2NyaXB0b3I+IHNvdXJjZURlc2MgPSBtQXVkaW9Tb3VyY2VzLnZhbHVlQXQoaSk7Ci0gICAgICAgIGlmIChzb3VyY2VEZXNjLT5tRGV2aWNlLT5lcXVhbHMoZGV2aWNlRGVzYykpIHsKLSAgICAgICAgICAgIEFMT0dWKCIlcyByZWxlYXNpbmcgYXVkaW8gc291cmNlICVkIiwgX19GVU5DVElPTl9fLCBzb3VyY2VEZXNjLT5nZXRIYW5kbGUoKSk7Ci0gICAgICAgICAgICBzdG9wQXVkaW9Tb3VyY2Uoc291cmNlRGVzYy0+Z2V0SGFuZGxlKCkpOworICAgICAgICBzcDxTb3VyY2VDbGllbnREZXNjcmlwdG9yPiBzb3VyY2VEZXNjID0gbUF1ZGlvU291cmNlcy52YWx1ZUF0KGkpOworICAgICAgICBpZiAoc291cmNlRGVzYy0+c3JjRGV2aWNlKCktPmVxdWFscyhkZXZpY2VEZXNjKSkgeworICAgICAgICAgICAgQUxPR1YoIiVzIHJlbGVhc2luZyBhdWRpbyBzb3VyY2UgJWQiLCBfX0ZVTkNUSU9OX18sIHNvdXJjZURlc2MtPnBvcnRJZCgpKTsKKyAgICAgICAgICAgIHN0b3BBdWRpb1NvdXJjZShzb3VyY2VEZXNjLT5wb3J0SWQoKSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTYxODAsNCArNjAwMSw1OCBAQAogICAgIH0KIH0KIAorc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppbnN0YWxsUGF0Y2goY29uc3QgY2hhciAqY2FsbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9JT0Rlc2NyaXB0b3JJbnRlcmZhY2UgKmlvRGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcykKK3sKKyAgICBzc2l6ZV90IGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KAorICAgICAgICAgICAgcGF0Y2hIYW5kbGUgJiYgKnBhdGNoSGFuZGxlICE9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FID8KKyAgICAgICAgICAgICpwYXRjaEhhbmRsZSA6IGlvRGVzY3JpcHRvci0+Z2V0UGF0Y2hIYW5kbGUoKSk7CisgICAgc3A8QXVkaW9QYXRjaD4gcGF0Y2hEZXNjOworICAgIHN0YXR1c190IHN0YXR1cyA9IGluc3RhbGxQYXRjaCgKKyAgICAgICAgICAgIGNhbGxlciwgaW5kZXgsIHBhdGNoSGFuZGxlLCBwYXRjaCwgZGVsYXlNcywgbVVpZENhY2hlZCwgJnBhdGNoRGVzYyk7CisgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICBpb0Rlc2NyaXB0b3ItPnNldFBhdGNoSGFuZGxlKHBhdGNoRGVzYy0+bUhhbmRsZSk7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6aW5zdGFsbFBhdGNoKGNvbnN0IGNoYXIgKmNhbGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzaXplX3QgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqcGF0Y2hIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxBdWRpb1BhdGNoPiAqcGF0Y2hEZXNjUHRyKQoreworICAgIHNwPEF1ZGlvUGF0Y2g+IHBhdGNoRGVzYzsKKyAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBhZlBhdGNoSGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7CisgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgcGF0Y2hEZXNjID0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUF0KGluZGV4KTsKKyAgICAgICAgYWZQYXRjaEhhbmRsZSA9IHBhdGNoRGVzYy0+bUFmUGF0Y2hIYW5kbGU7CisgICAgfQorCisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPmNyZWF0ZUF1ZGlvUGF0Y2gocGF0Y2gsICZhZlBhdGNoSGFuZGxlLCBkZWxheU1zKTsKKyAgICBBTE9HVigiJXMoKSBBRjo6Y3JlYXRlQXVkaW9QYXRjaCByZXR1cm5lZCAlZCBwYXRjaEhhbmRsZSAlZCBudW1fc291cmNlcyAlZCBudW1fc2lua3MgJWQiLAorICAgICAgICAgICAgY2FsbGVyLCBzdGF0dXMsIGFmUGF0Y2hIYW5kbGUsIHBhdGNoLT5udW1fc291cmNlcywgcGF0Y2gtPm51bV9zaW5rcyk7CisgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgICAgICBwYXRjaERlc2MgPSBuZXcgQXVkaW9QYXRjaChwYXRjaCwgdWlkKTsKKyAgICAgICAgICAgIGFkZEF1ZGlvUGF0Y2gocGF0Y2hEZXNjLT5tSGFuZGxlLCBwYXRjaERlc2MpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcGF0Y2hEZXNjLT5tUGF0Y2ggPSAqcGF0Y2g7CisgICAgICAgIH0KKyAgICAgICAgcGF0Y2hEZXNjLT5tQWZQYXRjaEhhbmRsZSA9IGFmUGF0Y2hIYW5kbGU7CisgICAgICAgIGlmIChwYXRjaEhhbmRsZSkgeworICAgICAgICAgICAgKnBhdGNoSGFuZGxlID0gcGF0Y2hEZXNjLT5tSGFuZGxlOworICAgICAgICB9CisgICAgICAgIG5leHRBdWRpb1BvcnRHZW5lcmF0aW9uKCk7CisgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCk7CisgICAgfQorICAgIGlmIChwYXRjaERlc2NQdHIpICpwYXRjaERlc2NQdHIgPSBwYXRjaERlc2M7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKwogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvbWFuYWdlcmRlZmF1bHQvQXVkaW9Qb2xpY3lNYW5hZ2VyLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9tYW5hZ2VyZGVmYXVsdC9BdWRpb1BvbGljeU1hbmFnZXIuaAppbmRleCA0OGUwNDcyLi5mNTU5YjdmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9tYW5hZ2VyZGVmYXVsdC9BdWRpb1BvbGljeU1hbmFnZXIuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9tYW5hZ2VyZGVmYXVsdC9BdWRpb1BvbGljeU1hbmFnZXIuaApAQCAtMTcsNiArMTcsNyBAQAogI3ByYWdtYSBvbmNlCiAKICNpbmNsdWRlIDxhdG9taWM+CisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KICNpbmNsdWRlIDxtZW1vcnk+CiAjaW5jbHVkZSA8dW5vcmRlcmVkX3NldD4KIApAQCAtMzAsNiArMzEsNyBAQAogI2luY2x1ZGUgPHV0aWxzL1NvcnRlZFZlY3Rvci5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUGFyYW1ldGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9Qb2xpY3kuaD4KKyNpbmNsdWRlIDxtZWRpYS9QYXRjaEJ1aWxkZXIuaD4KICNpbmNsdWRlICJBdWRpb1BvbGljeUludGVyZmFjZS5oIgogCiAjaW5jbHVkZSA8QXVkaW9Qb2xpY3lNYW5hZ2VySW50ZXJmYWNlLmg+CkBAIC0zOCw2ICs0MCw3IEBACiAjaW5jbHVkZSA8QXVkaW9Qb2xpY3lDb25maWcuaD4KICNpbmNsdWRlIDxBdWRpb1BvcnQuaD4KICNpbmNsdWRlIDxBdWRpb1BhdGNoLmg+CisjaW5jbHVkZSA8QXVkaW9Qcm9maWxlLmg+CiAjaW5jbHVkZSA8RGV2aWNlRGVzY3JpcHRvci5oPgogI2luY2x1ZGUgPElPUHJvZmlsZS5oPgogI2luY2x1ZGUgPEh3TW9kdWxlLmg+CkBAIC00Niw3ICs0OSw2IEBACiAjaW5jbHVkZSA8QXVkaW9Qb2xpY3lNaXguaD4KICNpbmNsdWRlIDxFZmZlY3REZXNjcmlwdG9yLmg+CiAjaW5jbHVkZSA8U291bmRUcmlnZ2VyU2Vzc2lvbi5oPgotI2luY2x1ZGUgPFNlc3Npb25Sb3V0ZS5oPgogI2luY2x1ZGUgPFZvbHVtZUN1cnZlLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKQEAgLTExOCwxNSArMTIwLDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190ICpmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnNlbGVjdGVkRGV2aWNlSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQpOwotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0T3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKLSAgICAgICAgdmlydHVhbCB2b2lkIHJlbGVhc2VPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0T3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wT3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKKyAgICAgICAgdmlydHVhbCB2b2lkIHJlbGVhc2VPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOwogICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldElucHV0Rm9yQXR0cihjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICppbnB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCkBAIC0xMzgsMTYgKzEzNCwxMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQpOwogCiAgICAgICAgIC8vIGluZGljYXRlcyB0byB0aGUgYXVkaW8gcG9saWN5IG1hbmFnZXIgdGhhdCB0aGUgaW5wdXQgc3RhcnRzIGJlaW5nIHVzZWQuCi0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAorICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0SW5wdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHNpbGVuY2VkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uY3VycmVuY3lfdHlwZV9fbWFza190ICpjb25jdXJyZW5jeSk7CiAKICAgICAgICAgLy8gaW5kaWNhdGVzIHRvIHRoZSBhdWRpbyBwb2xpY3kgbWFuYWdlciB0aGF0IHRoZSBpbnB1dCBzdG9wcyBiZWluZyB1c2VkLgotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOwotICAgICAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZUlucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wSW5wdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOworICAgICAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZUlucHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKICAgICAgICAgdmlydHVhbCB2b2lkIGNsb3NlQWxsSW5wdXRzKCk7CiAgICAgICAgIHZpcnR1YWwgdm9pZCBpbml0U3RyZWFtVm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleE1pbiwKQEAgLTE2Miw3ICsxNTUsNyBAQAogICAgICAgICAvLyByZXR1cm4gdGhlIHN0cmF0ZWd5IGNvcnJlc3BvbmRpbmcgdG8gYSBnaXZlbiBzdHJlYW0gdHlwZQogICAgICAgICB2aXJ0dWFsIHVpbnQzMl90IGdldFN0cmF0ZWd5Rm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKTsKICAgICAgICAgLy8gcmV0dXJuIHRoZSBzdHJhdGVneSBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBhdWRpbyBhdHRyaWJ1dGVzCi0gICAgICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0U3RyYXRlZ3lGb3JBdHRyKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0cik7CisgICAgICAgIHZpcnR1YWwgcm91dGluZ19zdHJhdGVneSBnZXRTdHJhdGVneUZvckF0dHIoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyKTsKIAogICAgICAgICAvLyByZXR1cm4gdGhlIGVuYWJsZWQgb3V0cHV0IGRldmljZXMgZm9yIHRoZSBnaXZlbiBzdHJlYW0gdHlwZQogICAgICAgICB2aXJ0dWFsIGF1ZGlvX2RldmljZXNfdCBnZXREZXZpY2VzRm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKTsKQEAgLTE5Myw3ICsxODYsOSBAQAogCiAgICAgICAgIHZpcnR1YWwgYm9vbCBpc1NvdXJjZUFjdGl2ZShhdWRpb19zb3VyY2VfdCBzb3VyY2UpIGNvbnN0OwogCi0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQpOworICAgICAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdDsgLy8gaGVscGVyIGZvciBkdW1wKGludCBmZCkKKworICAgICAgICBzdGF0dXNfdCBkdW1wKGludCBmZCkgb3ZlcnJpZGU7CiAKICAgICAgICAgdmlydHVhbCBib29sIGlzT2ZmbG9hZFN1cHBvcnRlZChjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCYgb2ZmbG9hZEluZm8pOwogCkBAIC0yMjksOSArMjI0LDkgQEAKIAogICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0QXVkaW9Tb3VyY2UoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHJpYnV0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkKTsKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wQXVkaW9Tb3VyY2UoYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wQXVkaW9Tb3VyY2UoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOwogCiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWFzdGVyTW9ubyhib29sIG1vbm8pOwogICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1hc3Rlck1vbm8oYm9vbCAqbW9ubyk7CkBAIC0zNTMsNiArMzQ4LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKTsKIAorICAgICAgICAvLyByZXNjYWxlIHZvbHVtZSBpbmRleCBmcm9tIHNyY1N0cmVhbSB3aXRoaW4gcmFuZ2Ugb2YgZHN0U3RyZWFtCisgICAgICAgIGludCByZXNjYWxlVm9sdW1lSW5kZXgoaW50IHNyY0luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3JjU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgZHN0U3RyZWFtKTsKICAgICAgICAgLy8gY2hlY2sgdGhhdCB2b2x1bWUgY2hhbmdlIGlzIHBlcm1pdHRlZCwgY29tcHV0ZSBhbmQgc2VuZCBuZXcgdm9sdW1lIHRvIGF1ZGlvIGhhcmR3YXJlCiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgY2hlY2tBbmRTZXRWb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGludCBpbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjLApAQCAtMzY4LDcgKzM2Nyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IChhdWRpb19kZXZpY2VzX3QpMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBBVURJT19ERVZJQ0VfTk9ORSk7CiAKICAgICAgICAgLy8gTXV0ZSBvciB1bm11dGUgdGhlIHN0cmVhbSBvbiB0aGUgc3BlY2lmaWVkIG91dHB1dAogICAgICAgICB2b2lkIHNldFN0cmVhbU11dGUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCkBAIC0zNzcsMTAgKzM3Niw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcyA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gKGF1ZGlvX2RldmljZXNfdCkwKTsKIAotICAgICAgICAvLyBoYW5kbGUgc3BlY2lhbCBjYXNlcyBmb3Igc29uaWZpY2F0aW9uIHN0cmF0ZWd5IHdoaWxlIGluIGNhbGw6IG11dGUgc3RyZWFtcyBvciByZXBsYWNlIGJ5Ci0gICAgICAgIC8vIGEgc3BlY2lhbCB0b25lIGluIHRoZSBkZXZpY2UgdXNlZCBmb3IgY29tbXVuaWNhdGlvbgotICAgICAgICB2b2lkIGhhbmRsZUluY2FsbFNvbmlmaWNhdGlvbihhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgYm9vbCBzdGFydGluZywgYm9vbCBzdGF0ZUNoYW5nZSk7Ci0KICAgICAgICAgYXVkaW9fbW9kZV90IGdldFBob25lU3RhdGUoKTsKIAogICAgICAgICAvLyB0cnVlIGlmIGRldmljZSBpcyBpbiBhIHRlbGVwaG9ueSBvciBWb0lQIGNhbGwKQEAgLTQxMCw2ICs0MDUsMTIgQEAKICAgICAgICAgLy8gY2xvc2UgYW4gaW5wdXQuCiAgICAgICAgIHZvaWQgY2xvc2VJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCk7CiAKKyAgICAgICAgLy8gcnVucyBhbGwgdGhlIGNoZWNrcyByZXF1aXJlZCBmb3IgYWNjb21vZGF0aW5nIGNoYW5nZXMgaW4gZGV2aWNlcyBhbmQgb3V0cHV0cworICAgICAgICAvLyBpZiAnb25PdXRwdXRzQ2hlY2tlZCcgY2FsbGJhY2sgaXMgcHJvdmlkZWQsIGl0IGlzIGV4ZWN1dGVkIGFmdGVyIHRoZSBvdXRwdXRzCisgICAgICAgIC8vIGNoZWNrIHZpYSAnY2hlY2tPdXRwdXRGb3JBbGxTdHJhdGVnaWVzJy4gSWYgdGhlIGNhbGxiYWNrIHJldHVybnMgJ3RydWUnLAorICAgICAgICAvLyBBMkRQIHN1c3BlbmQgc3RhdHVzIGlzIHJlY2hlY2tlZC4KKyAgICAgICAgdm9pZCBjaGVja0ZvckRldmljZUFuZE91dHB1dENoYW5nZXMoc3RkOjpmdW5jdGlvbjxib29sKCk+IG9uT3V0cHV0c0NoZWNrZWQgPSBudWxscHRyKTsKKwogICAgICAgICAvLyBjaGVja3MgYW5kIGlmIG5lY2Vzc2FyeSBjaGFuZ2VzIG91dHB1dHMgdXNlZCBmb3IgYWxsIHN0cmF0ZWdpZXMuCiAgICAgICAgIC8vIG11c3QgYmUgY2FsbGVkIGV2ZXJ5IHRpbWUgYSBjb25kaXRpb24gdGhhdCBhZmZlY3RzIHRoZSBvdXRwdXQgY2hvaWNlIGZvciBhIGdpdmVuIHN0cmF0ZWd5CiAgICAgICAgIC8vIGNoYW5nZXM6IGNvbm5lY3RlZCBkZXZpY2UsIHBob25lIHN0YXRlLCBmb3JjZSB1c2UuLi4KQEAgLTQyMiw2ICs0MjMsMTQgQEAKICAgICAgICAgLy8gbWFuYWdlcyBBMkRQIG91dHB1dCBzdXNwZW5kL3Jlc3RvcmUgYWNjb3JkaW5nIHRvIHBob25lIHN0YXRlIGFuZCBCVCBTQ08gdXNhZ2UKICAgICAgICAgdm9pZCBjaGVja0EyZHBTdXNwZW5kKCk7CiAKKyAgICAgICAgdGVtcGxhdGUgPGNsYXNzIElvRGVzY3JpcHRvciwgY2xhc3MgRmlsdGVyPgorICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBmaW5kUHJlZmVycmVkRGV2aWNlKElvRGVzY3JpcHRvciYgZGVzYywgRmlsdGVyIGZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wmIGFjdGl2ZSwgY29uc3QgRGV2aWNlVmVjdG9yJiBkZXZpY2VzKTsKKworICAgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgSW9Db2xsZWN0aW9uLCBjbGFzcyBGaWx0ZXI+CisgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGZpbmRQcmVmZXJyZWREZXZpY2UoSW9Db2xsZWN0aW9uJiBpb0NvbGxlY3Rpb24sIEZpbHRlciBmaWx0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3ImIGRldmljZXMpOworCiAgICAgICAgIC8vIHNlbGVjdHMgdGhlIG1vc3QgYXBwcm9wcmlhdGUgZGV2aWNlIG9uIG91dHB1dCBmb3IgY3VycmVudCBzdGF0ZQogICAgICAgICAvLyBtdXN0IGJlIGNhbGxlZCBldmVyeSB0aW1lIGEgY29uZGl0aW9uIHRoYXQgYWZmZWN0cyB0aGUgZGV2aWNlIGNob2ljZSBmb3IgYSBnaXZlbiBvdXRwdXQgaXMKICAgICAgICAgLy8gY2hhbmdlZDogY29ubmVjdGVkIGRldmljZSwgcGhvbmUgc3RhdGUsIGZvcmNlIHVzZSwgb3V0cHV0IHN0YXJ0LCBvdXRwdXQgc3RvcC4uCkBAIC00NTEsOCArNDYwLDYgQEAKIAogICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IGdldE91dHB1dHNGb3JEZXZpY2UoYXVkaW9fZGV2aWNlc190IGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uJiBvcGVuT3V0cHV0cyk7Ci0gICAgICAgIGJvb2wgdmVjdG9yc0VxdWFsKFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4mIG91dHB1dHMxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4mIG91dHB1dHMyKTsKIAogICAgICAgICAvLyBtdXRlL3VubXV0ZSBzdHJhdGVnaWVzIHVzaW5nIGFuIGluY29tcGF0aWJsZSBkZXZpY2UgY29tYmluYXRpb24KICAgICAgICAgLy8gaWYgbXV0aW5nLCB3YWl0IGZvciB0aGUgYXVkaW8gaW4gcGNtIGJ1ZmZlciB0byBiZSBkcmFpbmVkIGJlZm9yZSBwcm9jZWVkaW5nCkBAIC01MDEsMjQgKzUwOCwyMCBAQAogICAgICAgICAgICAgaWYgKCFoYXNQcmltYXJ5T3V0cHV0KCkpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gQVVESU9fREVWSUNFX05PTkU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbUh3TW9kdWxlKG1QcmltYXJ5T3V0cHV0LT5nZXRNb2R1bGVIYW5kbGUoKSk7CisgICAgICAgICAgICByZXR1cm4gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2VUeXBlc0Zyb21Id01vZHVsZSgKKyAgICAgICAgICAgICAgICAgICAgbVByaW1hcnlPdXRwdXQtPmdldE1vZHVsZUhhbmRsZSgpKTsKICAgICAgICAgfQogCiAgICAgICAgIHVpbnQzMl90IHVwZGF0ZUNhbGxSb3V0aW5nKGF1ZGlvX2RldmljZXNfdCByeERldmljZSwgdWludDMyX3QgZGVsYXlNcyA9IDApOwogICAgICAgICBzcDxBdWRpb1BhdGNoPiBjcmVhdGVUZWxlcGhvbnlQYXRjaChib29sIGlzUngsIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIHVpbnQzMl90IGRlbGF5TXMpOwotICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBmaWxsQXVkaW9Qb3J0Q29uZmlnRm9yRGV2aWNlKAotICAgICAgICAgICAgICAgIGNvbnN0IERldmljZVZlY3RvciYgZGV2aWNlcywgYXVkaW9fZGV2aWNlc190IGRldmljZSwgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZyk7CisgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGZpbmREZXZpY2UoCisgICAgICAgICAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yJiBkZXZpY2VzLCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKSBjb25zdDsKIAotICAgICAgICAvLyBpZiBhcmd1bWVudCAiZGV2aWNlIiBpcyBkaWZmZXJlbnQgZnJvbSBBVURJT19ERVZJQ0VfTk9ORSwgIHN0YXJ0U291cmNlKCkgd2lsbCBmb3JjZQotICAgICAgICAvLyB0aGUgcmUtZXZhbHVhdGlvbiBvZiB0aGUgb3V0cHV0IGRldmljZS4KLSAgICAgICAgc3RhdHVzX3Qgc3RhcnRTb3VyY2UoY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCisgICAgICAgIHN0YXR1c190IHN0YXJ0U291cmNlKGNvbnN0IHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8VHJhY2tDbGllbnREZXNjcmlwdG9yPiYgY2xpZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqZGVsYXlNcyk7Ci0gICAgICAgIHN0YXR1c190IHN0b3BTb3VyY2UoY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvcmNlRGV2aWNlVXBkYXRlKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RvcFNvdXJjZShjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8VHJhY2tDbGllbnREZXNjcmlwdG9yPiYgY2xpZW50KTsKIAogICAgICAgICB2b2lkIGNsZWFyQXVkaW9QYXRjaGVzKHVpZF90IHVpZCk7CiAgICAgICAgIHZvaWQgY2xlYXJTZXNzaW9uUm91dGVzKHVpZF90IHVpZCk7CkBAIC01MjYsMTAgKzUyOSwxMCBAQAogCiAgICAgICAgIHN0YXR1c190IGhhc1ByaW1hcnlPdXRwdXQoKSBjb25zdCB7IHJldHVybiBtUHJpbWFyeU91dHB1dCAhPSAwOyB9CiAKLSAgICAgICAgc3RhdHVzX3QgY29ubmVjdEF1ZGlvU291cmNlKGNvbnN0IHNwPEF1ZGlvU291cmNlRGVzY3JpcHRvcj4mIHNvdXJjZURlc2MpOwotICAgICAgICBzdGF0dXNfdCBkaXNjb25uZWN0QXVkaW9Tb3VyY2UoY29uc3Qgc3A8QXVkaW9Tb3VyY2VEZXNjcmlwdG9yPiYgc291cmNlRGVzYyk7CisgICAgICAgIHN0YXR1c190IGNvbm5lY3RBdWRpb1NvdXJjZShjb25zdCBzcDxTb3VyY2VDbGllbnREZXNjcmlwdG9yPiYgc291cmNlRGVzYyk7CisgICAgICAgIHN0YXR1c190IGRpc2Nvbm5lY3RBdWRpb1NvdXJjZShjb25zdCBzcDxTb3VyY2VDbGllbnREZXNjcmlwdG9yPiYgc291cmNlRGVzYyk7CiAKLSAgICAgICAgc3A8QXVkaW9Tb3VyY2VEZXNjcmlwdG9yPiBnZXRTb3VyY2VGb3JTdHJhdGVneU9uT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKKyAgICAgICAgc3A8U291cmNlQ2xpZW50RGVzY3JpcHRvcj4gZ2V0U291cmNlRm9yU3RyYXRlZ3lPbk91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5KTsKIAogICAgICAgICB2b2lkIGNsZWFuVXBGb3JEZXZpY2UoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIGRldmljZURlc2MpOwpAQCAtNTM4LDEzICs1NDEsMTMgQEAKIAogICAgICAgICBzdGF0aWMgYm9vbCBpc0NvbmN1cnJlbnRTb3VyY2UoYXVkaW9fc291cmNlX3Qgc291cmNlKTsKIAotICAgICAgICBib29sIGlzQ29uY3VyZW50Q2FwdHVyZUFsbG93ZWQoY29uc3Qgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+JiBpbnB1dERlc2MsCi0gICAgICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9TZXNzaW9uPiYgYXVkaW9TZXNzaW9uKTsKLQogICAgICAgICBzdGF0aWMgYm9vbCBzdHJlYW1zTWF0Y2hGb3J2b2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0xLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0yKTsKIAotICAgICAgICB1aWRfdCBtVWlkQ2FjaGVkOworICAgICAgICB2b2lkIGNsb3NlQWN0aXZlQ2xpZW50cyhjb25zdCBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4mIGlucHV0KTsKKyAgICAgICAgdm9pZCBjbG9zZUNsaWVudChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCk7CisKKyAgICAgICAgY29uc3QgdWlkX3QgbVVpZENhY2hlZDsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQUlEX0FVRElPU0VSVkVSCiAgICAgICAgIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlICptcENsaWVudEludGVyZmFjZTsgIC8vIGF1ZGlvIHBvbGljeSBjbGllbnQgaW50ZXJmYWNlCiAgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBtUHJpbWFyeU91dHB1dDsgICAgIC8vIHByaW1hcnkgb3V0cHV0IGRlc2NyaXB0b3IKICAgICAgICAgLy8gbGlzdCBvZiBkZXNjcmlwdG9ycyBmb3Igb3V0cHV0cyBjdXJyZW50bHkgb3BlbmVkCkBAIC01NTgsOSArNTYxLDYgQEAKICAgICAgICAgRGV2aWNlVmVjdG9yICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlczsgLy8gYWxsIGF2YWlsYWJsZSBvdXRwdXQgZGV2aWNlcwogICAgICAgICBEZXZpY2VWZWN0b3IgIG1BdmFpbGFibGVJbnB1dERldmljZXM7ICAvLyBhbGwgYXZhaWxhYmxlIGlucHV0IGRldmljZXMKIAotICAgICAgICBTZXNzaW9uUm91dGVNYXAgbU91dHB1dFJvdXRlcyA9IFNlc3Npb25Sb3V0ZU1hcChTZXNzaW9uUm91dGVNYXA6Ok1BUFRZUEVfT1VUUFVUKTsKLSAgICAgICAgU2Vzc2lvblJvdXRlTWFwIG1JbnB1dFJvdXRlcyA9IFNlc3Npb25Sb3V0ZU1hcChTZXNzaW9uUm91dGVNYXA6Ok1BUFRZUEVfSU5QVVQpOwotCiAgICAgICAgIGJvb2wgICAgbUxpbWl0UmluZ3RvbmVWb2x1bWU7ICAgICAgICAvLyBsaW1pdCByaW5ndG9uZSB2b2x1bWUgdG8gbXVzaWMgdm9sdW1lIGlmIGhlYWRzZXQgY29ubmVjdGVkCiAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBtRGV2aWNlRm9yU3RyYXRlZ3lbTlVNX1NUUkFURUdJRVNdOwogICAgICAgICBmbG9hdCAgIG1MYXN0Vm9pY2VWb2x1bWU7ICAgICAgICAgICAgLy8gbGFzdCB2b2ljZSB2b2x1bWUgdmFsdWUgc2VudCB0byBhdWRpbyBIQUwKQEAgLTU4NCw3ICs1ODQsNyBAQAogICAgICAgICBzcDxBdWRpb1BhdGNoPiBtQ2FsbFJ4UGF0Y2g7CiAKICAgICAgICAgSHdBdWRpb091dHB1dENvbGxlY3Rpb24gbUh3T3V0cHV0czsKLSAgICAgICAgQXVkaW9Tb3VyY2VDb2xsZWN0aW9uIG1BdWRpb1NvdXJjZXM7CisgICAgICAgIFNvdXJjZUNsaWVudENvbGxlY3Rpb24gbUF1ZGlvU291cmNlczsKIAogICAgICAgICAvLyBmb3Igc3VwcG9ydGluZyAiYmVhY29uIiBzdHJlYW1zLCBpLmUuIHN0cmVhbXMgdGhhdCBvbmx5IHBsYXkgb24gc3BlYWtlciwgYW5kIG5ldmVyCiAgICAgICAgIC8vIHdoZW4gc29tZXRoaW5nIG90aGVyIHRoYW4gU1RSRUFNX1RUUyAoYS5rLmEuICJUcmFuc21pdHRlZCBUaHJvdWdoIFNwZWFrZXIiKSBpcyBwbGF5aW5nCkBAIC02MTUsNyArNjE1LDE2IEBACiAgICAgICAgIHZvaWQgZmlsdGVyU3Vycm91bmRGb3JtYXRzKEZvcm1hdFZlY3RvciAqZm9ybWF0c1B0cik7CiAgICAgICAgIHZvaWQgZmlsdGVyU3Vycm91bmRDaGFubmVsTWFza3MoQ2hhbm5lbHNWZWN0b3IgKmNoYW5uZWxNYXNrc1B0cik7CiAKLSAgICAgICAgc3RhdHVzX3QgZ2V0U3VwcG9ydGVkRm9ybWF0cyhhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwgRm9ybWF0VmVjdG9yJiBmb3JtYXRzKTsKKyAgICAgICAgLy8gU3VwcG9ydCBmb3IgTXVsdGktU3RyZWFtIERlY29kZXIgKE1TRCkgbW9kdWxlCisgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGdldE1zZEF1ZGlvSW5EZXZpY2UoKSBjb25zdDsKKyAgICAgICAgYXVkaW9fZGV2aWNlc190IGdldE1zZEF1ZGlvT3V0RGV2aWNlVHlwZXMoKSBjb25zdDsKKyAgICAgICAgY29uc3QgQXVkaW9QYXRjaENvbGxlY3Rpb24gZ2V0TXNkUGF0Y2hlcygpIGNvbnN0OworICAgICAgICBzdGF0dXNfdCBnZXRCZXN0TXNkQXVkaW9Qcm9maWxlRm9yKGF1ZGlvX2RldmljZXNfdCBvdXRwdXREZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBod0F2U3luYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2NvbmZpZyAqc291cmNlQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfY29uZmlnICpzaW5rQ29uZmlnKSBjb25zdDsKKyAgICAgICAgUGF0Y2hCdWlsZGVyIGJ1aWxkTXNkUGF0Y2goYXVkaW9fZGV2aWNlc190IG91dHB1dERldmljZSkgY29uc3Q7CisgICAgICAgIHN0YXR1c190IHNldE1zZFBhdGNoKGF1ZGlvX2RldmljZXNfdCBvdXRwdXREZXZpY2UgPSBBVURJT19ERVZJQ0VfTk9ORSk7CiAKICAgICAgICAgLy8gSWYgYW55LCByZXNvbHZlIGFueSAiZHluYW1pYyIgZmllbGRzIG9mIGFuIEF1ZGlvIFByb2ZpbGVzIGNvbGxlY3Rpb24KICAgICAgICAgdm9pZCB1cGRhdGVBdWRpb1Byb2ZpbGVzKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlLApAQCAtNjU0LDcgKzY2Myw2IEBACiAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGdldElucHV0Rm9yRGV2aWNlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCiAgICAgICAgICAgICAgICAgU3RyaW5nOCBhZGRyZXNzLAogICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAotICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSwKICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjb25maWcsCiAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKQEAgLTY4NCw2ICs2OTIsMTggQEAKICAgICAgICAgICAgIHBhcmFtLmFkZEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlNb25vT3V0cHV0KSwgKGludCltTWFzdGVyTW9ubyk7CiAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c2V0UGFyYW1ldGVycyhvdXRwdXQsIHBhcmFtLnRvU3RyaW5nKCkpOwogICAgICAgICB9CisgICAgICAgIHN0YXR1c190IGluc3RhbGxQYXRjaChjb25zdCBjaGFyICpjYWxsZXIsCisgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoSGFuZGxlLAorICAgICAgICAgICAgICAgIEF1ZGlvSU9EZXNjcmlwdG9ySW50ZXJmYWNlICppb0Rlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKKyAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcyk7CisgICAgICAgIHN0YXR1c190IGluc3RhbGxQYXRjaChjb25zdCBjaGFyICpjYWxsZXIsCisgICAgICAgICAgICAgICAgc3NpemVfdCBpbmRleCwKKyAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqcGF0Y2hIYW5kbGUsCisgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKKyAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcywKKyAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCisgICAgICAgICAgICAgICAgc3A8QXVkaW9QYXRjaD4gKnBhdGNoRGVzY1B0cik7CiAKICAgICAgICAgYm9vbCBzb3VuZFRyaWdnZXJTdXBwb3J0c0NvbmN1cnJlbnRDYXB0dXJlKCk7CiAgICAgICAgIGJvb2wgbVNvdW5kVHJpZ2dlclN1cHBvcnRzQ29uY3VycmVudENhcHR1cmU7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5Q2xpZW50SW1wbC5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5Q2xpZW50SW1wbC5jcHAKaW5kZXggYjA2NGY4Yy4uMjFmZmZlYyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUNsaWVudEltcGwuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lDbGllbnRJbXBsLmNwcApAQCAtMTU1LDE3ICsxNTUsNiBAQAogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Qb2xpY3lDbGllbnQ6OnN0YXJ0VG9uZShhdWRpb19wb2xpY3lfdG9uZV90IHRvbmUsCi0gICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQotewotICAgIHJldHVybiBtQXVkaW9Qb2xpY3lTZXJ2aWNlLT5zdGFydFRvbmUodG9uZSwgc3RyZWFtKTsKLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb1BvbGljeUNsaWVudDo6c3RvcFRvbmUoKQotewotICAgIHJldHVybiBtQXVkaW9Qb2xpY3lTZXJ2aWNlLT5zdG9wVG9uZSgpOwotfQotCiBzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvUG9saWN5Q2xpZW50OjpzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUsIGludCBkZWxheV9tcykKIHsKICAgICByZXR1cm4gbUF1ZGlvUG9saWN5U2VydmljZS0+c2V0Vm9pY2VWb2x1bWUodm9sdW1lLCBkZWxheV9tcyk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5RWZmZWN0cy5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5RWZmZWN0cy5jcHAKaW5kZXggNGExY2FiNC4uMjliMDU2MSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUVmZmVjdHMuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lFZmZlY3RzLmNwcApAQCAtMjMsNyArMjMsOSBAQAogI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDxjdXRpbHMvbWlzYy5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvRWZmZWN0Lmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9Qb2xpY3lIZWxwZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9FZmZlY3RzQ29uZmlnLmg+CisjaW5jbHVkZSA8bWVkaWF1dGlscy9TZXJ2aWNlVXRpbGl0aWVzLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX2VmZmVjdHMvYXVkaW9fZWZmZWN0c19jb25mLmg+CiAjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CkBAIC0zMSw3ICszMyw2IEBACiAjaW5jbHVkZSA8Y3V0aWxzL2NvbmZpZ191dGlscy5oPgogI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgogI2luY2x1ZGUgIkF1ZGlvUG9saWN5RWZmZWN0cy5oIgotI2luY2x1ZGUgIlNlcnZpY2VVdGlsaXRpZXMuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC0zMTcsNiArMzE4LDIwMSBAQAogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKK3N0YXR1c190IEF1ZGlvUG9saWN5RWZmZWN0czo6YWRkU291cmNlRGVmYXVsdEVmZmVjdChjb25zdCBlZmZlY3RfdXVpZF90ICp0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnV1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fdW5pcXVlX2lkX3QqIGlkKQoreworICAgIGlmICh1dWlkID09IE5VTEwgfHwgdHlwZSA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJhZGRTb3VyY2VEZWZhdWx0RWZmZWN0KCk6IE51bGwgdXVpZCBvciB0eXBlIHV1aWQgcG9pbnRlciIpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIC8vIEhPVFdPUkQgYW5kIEZNX1RVTkVSIGFyZSB0d28gc3BlY2lhbCBjYXNlIHNvdXJjZXMgPiBNQVguCisgICAgaWYgKHNvdXJjZSA8IEFVRElPX1NPVVJDRV9ERUZBVUxUIHx8CisgICAgICAgICAgICAoc291cmNlID4gQVVESU9fU09VUkNFX01BWCAmJgorICAgICAgICAgICAgIHNvdXJjZSAhPSBBVURJT19TT1VSQ0VfSE9UV09SRCAmJgorICAgICAgICAgICAgIHNvdXJjZSAhPSBBVURJT19TT1VSQ0VfRk1fVFVORVIpKSB7CisgICAgICAgIEFMT0dFKCJhZGRTb3VyY2VEZWZhdWx0RWZmZWN0KCk6IFVuc3VwcG9ydGVkIHNvdXJjZSB0eXBlICVkIiwgc291cmNlKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICAvLyBDaGVjayB0aGF0IHx1dWlkfCBvciB8dHlwZXwgY29ycmVzcG9uZHMgdG8gYW4gZWZmZWN0IG9uIHRoZSBzeXN0ZW0uCisgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCBkZXNjcmlwdG9yID0ge307CisgICAgc3RhdHVzX3QgcmVzID0gQXVkaW9FZmZlY3Q6OmdldEVmZmVjdERlc2NyaXB0b3IoCisgICAgICAgICAgICB1dWlkLCB0eXBlLCBFRkZFQ1RfRkxBR19UWVBFX1BSRV9QUk9DLCAmZGVzY3JpcHRvcik7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiYWRkU291cmNlRGVmYXVsdEVmZmVjdCgpOiBGYWlsZWQgdG8gZmluZCBlZmZlY3QgZGVzY3JpcHRvciBtYXRjaGluZyB1dWlkL3R5cGUuIik7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgLy8gT25seSBwcmUtcHJvY2Vzc2luZyBlZmZlY3RzIGNhbiBiZSBhZGRlZCBkeW5hbWljYWxseSBhcyBzb3VyY2UgZGVmYXVsdHMuCisgICAgaWYgKChkZXNjcmlwdG9yLmZsYWdzICYgRUZGRUNUX0ZMQUdfVFlQRV9NQVNLKSAhPSBFRkZFQ1RfRkxBR19UWVBFX1BSRV9QUk9DKSB7CisgICAgICAgIEFMT0dFKCJhZGRTb3VyY2VEZWZhdWx0RWZmZWN0KCk6IERlc2lyZWQgZWZmZWN0IGNhbm5vdCBiZSBhdHRhY2hlZCAiCisgICAgICAgICAgICAgICJhcyBhIHNvdXJjZSBkZWZhdWx0IGVmZmVjdC4iKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworCisgICAgLy8gRmluZCB0aGUgRWZmZWN0RGVzY1ZlY3RvciBmb3IgdGhlIGdpdmVuIHNvdXJjZSB0eXBlLCBvciBjcmVhdGUgYSBuZXcgb25lIGlmIG5lY2Vzc2FyeS4KKyAgICBzc2l6ZV90IGluZGV4ID0gbUlucHV0U291cmNlcy5pbmRleE9mS2V5KHNvdXJjZSk7CisgICAgRWZmZWN0RGVzY1ZlY3RvciAqZGVzYyA9IE5VTEw7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICAvLyBObyBlZmZlY3RzIGZvciB0aGlzIHNvdXJjZSB0eXBlIHlldC4KKyAgICAgICAgZGVzYyA9IG5ldyBFZmZlY3REZXNjVmVjdG9yKCk7CisgICAgICAgIG1JbnB1dFNvdXJjZXMuYWRkKHNvdXJjZSwgZGVzYyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZGVzYyA9IG1JbnB1dFNvdXJjZXMudmFsdWVBdChpbmRleCk7CisgICAgfQorCisgICAgLy8gQ3JlYXRlIGEgbmV3IGVmZmVjdCBhbmQgYWRkIGl0IHRvIHRoZSB2ZWN0b3IuCisgICAgcmVzID0gQXVkaW9FZmZlY3Q6Om5ld0VmZmVjdFVuaXF1ZUlkKGlkKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCJhZGRTb3VyY2VEZWZhdWx0RWZmZWN0KCk6IGZhaWxlZCB0byBnZXQgbmV3IHVuaXF1ZSBpZC4iKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisgICAgRWZmZWN0RGVzYyAqZWZmZWN0ID0gbmV3IEVmZmVjdERlc2MoCisgICAgICAgICAgICBkZXNjcmlwdG9yLm5hbWUsICp0eXBlLCBvcFBhY2thZ2VOYW1lLCAqdXVpZCwgcHJpb3JpdHksICppZCk7CisgICAgZGVzYy0+bUVmZmVjdHMuYWRkKGVmZmVjdCk7CisgICAgLy8gVE9ETyhiLzcxODEzNjk3KTogU3VwcG9ydCBzZXR0aW5nIHBhcmFtcyBhcyB3ZWxsLgorCisgICAgLy8gVE9ETyhiLzcxODE0MzAwKTogUmV0cm9hY3RpdmVseSBhdHRhY2ggdG8gYW55IGV4aXN0aW5nIHNvdXJjZXMgb2YgdGhlIGdpdmVuIHR5cGUuCisgICAgLy8gVGhpcyByZXF1aXJlcyB0cmFja2luZyB0aGUgc291cmNlIHR5cGUgb2YgZWFjaCBzZXNzaW9uIGlkIGluIGFkZGl0aW9uIHRvIHdoYXQgaXMKKyAgICAvLyBhbHJlYWR5IGJlaW5nIHRyYWNrZWQuCisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5RWZmZWN0czo6YWRkU3RyZWFtRGVmYXVsdEVmZmVjdChjb25zdCBlZmZlY3RfdXVpZF90ICp0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnV1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb191c2FnZV90IHVzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3VuaXF1ZV9pZF90KiBpZCkKK3sKKyAgICBpZiAodXVpZCA9PSBOVUxMIHx8IHR5cGUgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiYWRkU3RyZWFtRGVmYXVsdEVmZmVjdCgpOiBOdWxsIHV1aWQgb3IgdHlwZSB1dWlkIHBvaW50ZXIiKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSA9IGF1ZGlvX3VzYWdlX3RvX3N0cmVhbV90eXBlKHVzYWdlKTsKKworICAgIGlmIChzdHJlYW0gPCBBVURJT19TVFJFQU1fTUlOIHx8IHN0cmVhbSA+PSBBVURJT19TVFJFQU1fUFVCTElDX0NOVCkgeworICAgICAgICBBTE9HRSgiYWRkU3RyZWFtRGVmYXVsdEVmZmVjdCgpOiBVbnN1cHBvcnRlZCBzdHJlYW0gdHlwZSAlZCIsIHN0cmVhbSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgLy8gQ2hlY2sgdGhhdCB8dXVpZHwgb3IgfHR5cGV8IGNvcnJlc3BvbmRzIHRvIGFuIGVmZmVjdCBvbiB0aGUgc3lzdGVtLgorICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgZGVzY3JpcHRvciA9IHt9OworICAgIHN0YXR1c190IHJlcyA9IEF1ZGlvRWZmZWN0OjpnZXRFZmZlY3REZXNjcmlwdG9yKAorICAgICAgICAgICAgdXVpZCwgdHlwZSwgRUZGRUNUX0ZMQUdfVFlQRV9JTlNFUlQsICZkZXNjcmlwdG9yKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCJhZGRTdHJlYW1EZWZhdWx0RWZmZWN0KCk6IEZhaWxlZCB0byBmaW5kIGVmZmVjdCBkZXNjcmlwdG9yIG1hdGNoaW5nIHV1aWQvdHlwZS4iKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICAvLyBPbmx5IGluc2VydCBlZmZlY3RzIGNhbiBiZSBhZGRlZCBkeW5hbWljYWxseSBhcyBzdHJlYW0gZGVmYXVsdHMuCisgICAgaWYgKChkZXNjcmlwdG9yLmZsYWdzICYgRUZGRUNUX0ZMQUdfVFlQRV9NQVNLKSAhPSBFRkZFQ1RfRkxBR19UWVBFX0lOU0VSVCkgeworICAgICAgICBBTE9HRSgiYWRkU3RyZWFtRGVmYXVsdEVmZmVjdCgpOiBEZXNpcmVkIGVmZmVjdCBjYW5ub3QgYmUgYXR0YWNoZWQgIgorICAgICAgICAgICAgICAiYXMgYSBzdHJlYW0gZGVmYXVsdCBlZmZlY3QuIik7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKworICAgIC8vIEZpbmQgdGhlIEVmZmVjdERlc2NWZWN0b3IgZm9yIHRoZSBnaXZlbiBzdHJlYW0gdHlwZSwgb3IgY3JlYXRlIGEgbmV3IG9uZSBpZiBuZWNlc3NhcnkuCisgICAgc3NpemVfdCBpbmRleCA9IG1PdXRwdXRTdHJlYW1zLmluZGV4T2ZLZXkoc3RyZWFtKTsKKyAgICBFZmZlY3REZXNjVmVjdG9yICpkZXNjID0gTlVMTDsKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIC8vIE5vIGVmZmVjdHMgZm9yIHRoaXMgc3RyZWFtIHR5cGUgeWV0LgorICAgICAgICBkZXNjID0gbmV3IEVmZmVjdERlc2NWZWN0b3IoKTsKKyAgICAgICAgbU91dHB1dFN0cmVhbXMuYWRkKHN0cmVhbSwgZGVzYyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZGVzYyA9IG1PdXRwdXRTdHJlYW1zLnZhbHVlQXQoaW5kZXgpOworICAgIH0KKworICAgIC8vIENyZWF0ZSBhIG5ldyBlZmZlY3QgYW5kIGFkZCBpdCB0byB0aGUgdmVjdG9yLgorICAgIHJlcyA9IEF1ZGlvRWZmZWN0OjpuZXdFZmZlY3RVbmlxdWVJZChpZCk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiYWRkU3RyZWFtRGVmYXVsdEVmZmVjdCgpOiBmYWlsZWQgdG8gZ2V0IG5ldyB1bmlxdWUgaWQuIik7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorICAgIEVmZmVjdERlc2MgKmVmZmVjdCA9IG5ldyBFZmZlY3REZXNjKAorICAgICAgICAgICAgZGVzY3JpcHRvci5uYW1lLCAqdHlwZSwgb3BQYWNrYWdlTmFtZSwgKnV1aWQsIHByaW9yaXR5LCAqaWQpOworICAgIGRlc2MtPm1FZmZlY3RzLmFkZChlZmZlY3QpOworICAgIC8vIFRPRE8oYi83MTgxMzY5Nyk6IFN1cHBvcnQgc2V0dGluZyBwYXJhbXMgYXMgd2VsbC4KKworICAgIC8vIFRPRE8oYi83MTgxNDMwMCk6IFJldHJvYWN0aXZlbHkgYXR0YWNoIHRvIGFueSBleGlzdGluZyBzdHJlYW1zIG9mIHRoZSBnaXZlbiB0eXBlLgorICAgIC8vIFRoaXMgcmVxdWlyZXMgdHJhY2tpbmcgdGhlIHN0cmVhbSB0eXBlIG9mIGVhY2ggc2Vzc2lvbiBpZCBpbiBhZGRpdGlvbiB0byB3aGF0IGlzCisgICAgLy8gYWxyZWFkeSBiZWluZyB0cmFja2VkLgorCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeUVmZmVjdHM6OnJlbW92ZVNvdXJjZURlZmF1bHRFZmZlY3QoYXVkaW9fdW5pcXVlX2lkX3QgaWQpCit7CisgICAgaWYgKGlkID09IEFVRElPX1VOSVFVRV9JRF9BTExPQ0FURSkgeworICAgICAgICAvLyBBTExPQ0FURSBpcyBub3QgYSB1bmlxdWUgaWRlbnRpZmllciwgYnV0IHJhdGhlciBhIHJlc2VydmVkIHZhbHVlIGluZGljYXRpbmcKKyAgICAgICAgLy8gYSByZWFsIGlkIGhhcyBub3QgYmVlbiBhc3NpZ25lZC4gRm9yIGRlZmF1bHQgZWZmZWN0cywgdGhpcyB2YWx1ZSBpcyBvbmx5IHVzZWQKKyAgICAgICAgLy8gYnkgc3lzdGVtLW93bmVkIGRlZmF1bHRzIGZyb20gdGhlIGxvYWRlZCBjb25maWcsIHdoaWNoIGNhbm5vdCBiZSByZW1vdmVkLgorICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisKKyAgICAvLyBDaGVjayBlYWNoIHNvdXJjZSB0eXBlLgorICAgIHNpemVfdCBudW1Tb3VyY2VzID0gbUlucHV0U291cmNlcy5zaXplKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1Tb3VyY2VzOyArK2kpIHsKKyAgICAgICAgLy8gQ2hlY2sgZWFjaCBlZmZlY3QgZm9yIGVhY2ggc291cmNlLgorICAgICAgICBFZmZlY3REZXNjVmVjdG9yKiBkZXNjVmVjdG9yID0gbUlucHV0U291cmNlc1tpXTsKKyAgICAgICAgZm9yIChhdXRvIGRlc2MgPSBkZXNjVmVjdG9yLT5tRWZmZWN0cy5iZWdpbigpOyBkZXNjICE9IGRlc2NWZWN0b3ItPm1FZmZlY3RzLmVuZCgpOyArK2Rlc2MpIHsKKyAgICAgICAgICAgIGlmICgoKmRlc2MpLT5tSWQgPT0gaWQpIHsKKyAgICAgICAgICAgICAgICAvLyBGb3VuZCBpdCEKKyAgICAgICAgICAgICAgICAvLyBUT0RPKGIvNzE4MTQzMDApOiBSZW1vdmUgZnJvbSBhbnkgc291cmNlcyB0aGUgZWZmZWN0IHdhcyBhdHRhY2hlZCB0by4KKyAgICAgICAgICAgICAgICBkZXNjVmVjdG9yLT5tRWZmZWN0cy5lcmFzZShkZXNjKTsKKyAgICAgICAgICAgICAgICAvLyBIYW5kbGVzIGFyZSB1bmlxdWU7IHRoZXJlIGNhbiBvbmx5IGJlIG9uZSBtYXRjaCwgc28gcmV0dXJuIGVhcmx5LgorICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIEVmZmVjdCB3YXNuJ3QgZm91bmQsIHNvIGl0J3MgYmVlbiB0cml2aWFsbHkgcmVtb3ZlZCBzdWNjZXNzZnVsbHkuCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeUVmZmVjdHM6OnJlbW92ZVN0cmVhbURlZmF1bHRFZmZlY3QoYXVkaW9fdW5pcXVlX2lkX3QgaWQpCit7CisgICAgaWYgKGlkID09IEFVRElPX1VOSVFVRV9JRF9BTExPQ0FURSkgeworICAgICAgICAvLyBBTExPQ0FURSBpcyBub3QgYSB1bmlxdWUgaWRlbnRpZmllciwgYnV0IHJhdGhlciBhIHJlc2VydmVkIHZhbHVlIGluZGljYXRpbmcKKyAgICAgICAgLy8gYSByZWFsIGlkIGhhcyBub3QgYmVlbiBhc3NpZ25lZC4gRm9yIGRlZmF1bHQgZWZmZWN0cywgdGhpcyB2YWx1ZSBpcyBvbmx5IHVzZWQKKyAgICAgICAgLy8gYnkgc3lzdGVtLW93bmVkIGRlZmF1bHRzIGZyb20gdGhlIGxvYWRlZCBjb25maWcsIHdoaWNoIGNhbm5vdCBiZSByZW1vdmVkLgorICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisKKyAgICAvLyBDaGVjayBlYWNoIHN0cmVhbSB0eXBlLgorICAgIHNpemVfdCBudW1TdHJlYW1zID0gbU91dHB1dFN0cmVhbXMuc2l6ZSgpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtU3RyZWFtczsgKytpKSB7CisgICAgICAgIC8vIENoZWNrIGVhY2ggZWZmZWN0IGZvciBlYWNoIHN0cmVhbS4KKyAgICAgICAgRWZmZWN0RGVzY1ZlY3RvciogZGVzY1ZlY3RvciA9IG1PdXRwdXRTdHJlYW1zW2ldOworICAgICAgICBmb3IgKGF1dG8gZGVzYyA9IGRlc2NWZWN0b3ItPm1FZmZlY3RzLmJlZ2luKCk7IGRlc2MgIT0gZGVzY1ZlY3Rvci0+bUVmZmVjdHMuZW5kKCk7ICsrZGVzYykgeworICAgICAgICAgICAgaWYgKCgqZGVzYyktPm1JZCA9PSBpZCkgeworICAgICAgICAgICAgICAgIC8vIEZvdW5kIGl0IQorICAgICAgICAgICAgICAgIC8vIFRPRE8oYi83MTgxNDMwMCk6IFJlbW92ZSBmcm9tIGFueSBzdHJlYW1zIHRoZSBlZmZlY3Qgd2FzIGF0dGFjaGVkIHRvLgorICAgICAgICAgICAgICAgIGRlc2NWZWN0b3ItPm1FZmZlY3RzLmVyYXNlKGRlc2MpOworICAgICAgICAgICAgICAgIC8vIEhhbmRsZXMgYXJlIHVuaXF1ZTsgdGhlcmUgY2FuIG9ubHkgYmUgb25lIG1hdGNoLCBzbyByZXR1cm4gZWFybHkuCisgICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gRWZmZWN0IHdhc24ndCBmb3VuZCwgc28gaXQncyBiZWVuIHRyaXZpYWxseSByZW1vdmVkIHN1Y2Nlc3NmdWxseS4KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CiAKIHZvaWQgQXVkaW9Qb2xpY3lFZmZlY3RzOjpFZmZlY3RWZWN0b3I6OnNldFByb2Nlc3NvckVuYWJsZWQoYm9vbCBlbmFibGVkKQogewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUVmZmVjdHMuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lFZmZlY3RzLmgKaW5kZXggNjIzMTgwZS4uNmFkMDFmNyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUVmZmVjdHMuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5RWZmZWN0cy5oCkBAIC02NCw3ICs2NCw2IEBACiAgICAgc3RhdHVzX3QgcmVsZWFzZUlucHV0RWZmZWN0cyhhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBhdWRpb1Nlc3Npb24pOwogCi0KICAgICAvLyBSZXR1cm4gYSBsaXN0IG9mIGVmZmVjdCBkZXNjcmlwdG9ycyBmb3IgZGVmYXVsdCBvdXRwdXQgZWZmZWN0cwogICAgIC8vIGFzc29jaWF0ZWQgd2l0aCBhdWRpb1Nlc3Npb24KICAgICBzdGF0dXNfdCBxdWVyeURlZmF1bHRPdXRwdXRTZXNzaW9uRWZmZWN0cyhhdWRpb19zZXNzaW9uX3QgYXVkaW9TZXNzaW9uLApAQCAtODIsMTggKzgxLDYwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3QgYXVkaW9TZXNzaW9uKTsKIAorICAgIC8vIEFkZCB0aGUgZWZmZWN0IHRvIHRoZSBsaXN0IG9mIGRlZmF1bHQgZWZmZWN0cyBmb3Igc291cmNlcyBvZiB0eXBlIHxzb3VyY2V8LgorICAgIHN0YXR1c190IGFkZFNvdXJjZURlZmF1bHRFZmZlY3QoY29uc3QgZWZmZWN0X3V1aWRfdCAqdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqdXVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb191bmlxdWVfaWRfdCogaWQpOworCisgICAgLy8gQWRkIHRoZSBlZmZlY3QgdG8gdGhlIGxpc3Qgb2YgZGVmYXVsdCBlZmZlY3RzIGZvciBzdHJlYW1zIG9mIGEgZ2l2ZW4gdXNhZ2UuCisgICAgc3RhdHVzX3QgYWRkU3RyZWFtRGVmYXVsdEVmZmVjdChjb25zdCBlZmZlY3RfdXVpZF90ICp0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90ICp1dWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3VzYWdlX3QgdXNhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb191bmlxdWVfaWRfdCogaWQpOworCisgICAgLy8gUmVtb3ZlIHRoZSBkZWZhdWx0IHNvdXJjZSBlZmZlY3QgZnJvbSB3aGVyZXZlciBpdCdzIGF0dGFjaGVkLgorICAgIHN0YXR1c190IHJlbW92ZVNvdXJjZURlZmF1bHRFZmZlY3QoYXVkaW9fdW5pcXVlX2lkX3QgaWQpOworCisgICAgLy8gUmVtb3ZlIHRoZSBkZWZhdWx0IHN0cmVhbSBlZmZlY3QgZnJvbSB3aGVyZXZlciBpdCdzIGF0dGFjaGVkLgorICAgIHN0YXR1c190IHJlbW92ZVN0cmVhbURlZmF1bHRFZmZlY3QoYXVkaW9fdW5pcXVlX2lkX3QgaWQpOworCiBwcml2YXRlOgogCiAgICAgLy8gY2xhc3MgdG8gc3RvcmUgdGhlIGRlc2NyaXB0aW9uIG9mIGFuIGVmZmVjdHMgYW5kIGl0cyBwYXJhbWV0ZXJzCiAgICAgLy8gYXMgZGVmaW5lZCBpbiBhdWRpb19lZmZlY3RzLmNvbmYKICAgICBjbGFzcyBFZmZlY3REZXNjIHsKICAgICBwdWJsaWM6Ci0gICAgICAgIEVmZmVjdERlc2MoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgZWZmZWN0X3V1aWRfdCYgdXVpZCkgOgorICAgICAgICBFZmZlY3REZXNjKGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCYgdHlwZVV1aWQsCisgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCYgdXVpZCwKKyAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICBhdWRpb191bmlxdWVfaWRfdCBpZCkgOgogICAgICAgICAgICAgICAgICAgICAgICAgbU5hbWUoc3RyZHVwKG5hbWUpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1VdWlkKHV1aWQpIHsgfQorICAgICAgICAgICAgICAgICAgICAgICAgbVR5cGVVdWlkKHR5cGVVdWlkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1PcFBhY2thZ2VOYW1lKG9wUGFja2FnZU5hbWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgbVV1aWQodXVpZCksCisgICAgICAgICAgICAgICAgICAgICAgICBtUHJpb3JpdHkocHJpb3JpdHkpLAorICAgICAgICAgICAgICAgICAgICAgICAgbUlkKGlkKSB7IH0KKyAgICAgICAgRWZmZWN0RGVzYyhjb25zdCBjaGFyICpuYW1lLCBjb25zdCBlZmZlY3RfdXVpZF90JiB1dWlkKSA6CisgICAgICAgICAgICAgICAgICAgICAgICBFZmZlY3REZXNjKG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpFRkZFQ1RfVVVJRF9OVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcxNigiIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1VOSVFVRV9JRF9BTExPQ0FURSkgeyB9CiAgICAgICAgIEVmZmVjdERlc2MoY29uc3QgRWZmZWN0RGVzYyYgb3JpZykgOgogICAgICAgICAgICAgICAgICAgICAgICAgbU5hbWUoc3RyZHVwKG9yaWcubU5hbWUpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1VdWlkKG9yaWcubVV1aWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1UeXBlVXVpZChvcmlnLm1UeXBlVXVpZCksCisgICAgICAgICAgICAgICAgICAgICAgICBtT3BQYWNrYWdlTmFtZShvcmlnLm1PcFBhY2thZ2VOYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1VdWlkKG9yaWcubVV1aWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgbVByaW9yaXR5KG9yaWcubVByaW9yaXR5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1JZChvcmlnLm1JZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlZXAgY29weSBtUGFyYW1zCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgayA9IDA7IGsgPCBvcmlnLm1QYXJhbXMuc2l6ZSgpOyBrKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X3BhcmFtX3QgKm9yaWdQYXJhbSA9IG9yaWcubVBhcmFtc1trXTsKQEAgLTExNiw3ICsxNTcsMTEgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBjaGFyICptTmFtZTsKKyAgICAgICAgZWZmZWN0X3V1aWRfdCBtVHlwZVV1aWQ7CisgICAgICAgIFN0cmluZzE2IG1PcFBhY2thZ2VOYW1lOwogICAgICAgICBlZmZlY3RfdXVpZF90IG1VdWlkOworICAgICAgICBpbnQzMl90IG1Qcmlvcml0eTsKKyAgICAgICAgYXVkaW9fdW5pcXVlX2lkX3QgbUlkOwogICAgICAgICBWZWN0b3IgPGVmZmVjdF9wYXJhbV90ICo+IG1QYXJhbXM7CiAgICAgfTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUludGVyZmFjZUltcGwuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUludGVyZmFjZUltcGwuY3BwCmluZGV4IDczMzdmMDQuLjAyYWIwN2YgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lJbnRlcmZhY2VJbXBsLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5SW50ZXJmYWNlSW1wbC5jcHAKQEAgLTE3LDEyICsxNywxMiBAQAogI2RlZmluZSBMT0dfVEFHICJBdWRpb1BvbGljeUludGVmYWNlSW1wbCIKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKIAotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhQW5hbHl0aWNzSXRlbS5oPgotCiAjaW5jbHVkZSAiQXVkaW9Qb2xpY3lTZXJ2aWNlLmgiCi0jaW5jbHVkZSAiU2VydmljZVV0aWxpdGllcy5oIgogI2luY2x1ZGUgIlR5cGVDb252ZXJ0ZXIuaCIKKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1BvbGljeUhlbHBlci5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhQW5hbHl0aWNzSXRlbS5oPgorI2luY2x1ZGUgPG1lZGlhdXRpbHMvU2VydmljZVV0aWxpdGllcy5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTE4Myw3ICsxODMsNyBAQAogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAKICAgICBjb25zdCB1aWRfdCBjYWxsaW5nVWlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpOwotICAgIGlmICghaXNUcnVzdGVkQ2FsbGluZ1VpZChjYWxsaW5nVWlkKSB8fCB1aWQgPT0gKHVpZF90KS0xKSB7CisgICAgaWYgKCFpc0F1ZGlvU2VydmVyT3JNZWRpYVNlcnZlclVpZChjYWxsaW5nVWlkKSB8fCB1aWQgPT0gKHVpZF90KS0xKSB7CiAgICAgICAgIEFMT0dXX0lGKHVpZCAhPSAodWlkX3QpLTEgJiYgdWlkICE9IGNhbGxpbmdVaWQsCiAgICAgICAgICAgICAgICAgIiVzIHVpZCAlZCB0cmllZCB0byBwYXNzIGl0c2VsZiBvZmYgYXMgJWQiLCBfX0ZVTkNUSU9OX18sIGNhbGxpbmdVaWQsIHVpZCk7CiAgICAgICAgIHVpZCA9IGNhbGxpbmdVaWQ7CkBAIC0yMDAsNyArMjAwLDcgQEAKICAgICAgICAgIW1vZGlmeVBob25lU3RhdGVBbGxvd2VkKHBpZCwgdWlkKSkgewogICAgICAgICAvLyBJZiB0aGUgYXBwIHRyaWVzIHRvIHBsYXkgbXVzaWMgdGhyb3VnaCB0aGUgdGVsZXBob255IGRldmljZSBhbmQgZG9lc24ndCBoYXZlIHBlcm1pc3Npb24KICAgICAgICAgLy8gdGhlIGZhbGxiYWNrIHRvIHRoZSBkZWZhdWx0IG91dHB1dCBkZXZpY2UuCi0gICAgICAgIG1BdWRpb1BvbGljeU1hbmFnZXItPnJlbGVhc2VPdXRwdXQoKm91dHB1dCwgKnN0cmVhbSwgc2Vzc2lvbik7CisgICAgICAgIG1BdWRpb1BvbGljeU1hbmFnZXItPnJlbGVhc2VPdXRwdXQoKnBvcnRJZCk7CiAgICAgICAgIGZsYWdzID0gb3JpZ2luYWxGbGFnczsKICAgICAgICAgKnNlbGVjdGVkRGV2aWNlSWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FOwogICAgICAgICAqcG9ydElkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKQEAgLTIwOCw5MyArMjA4LDExNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MsIHNlbGVjdGVkRGV2aWNlSWQsIHBvcnRJZCk7CiAgICAgfQorCisgICAgaWYgKHJlc3VsdCA9PSBOT19FUlJPUikgeworICAgICAgICBzcCA8QXVkaW9QbGF5YmFja0NsaWVudD4gY2xpZW50ID0KKyAgICAgICAgICAgIG5ldyBBdWRpb1BsYXliYWNrQ2xpZW50KCphdHRyLCAqb3V0cHV0LCB1aWQsIHBpZCwgc2Vzc2lvbiwgKnNlbGVjdGVkRGV2aWNlSWQsICpzdHJlYW0pOworICAgICAgICBtQXVkaW9QbGF5YmFja0NsaWVudHMuYWRkKCpwb3J0SWQsIGNsaWVudCk7CisgICAgfQogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c3RhcnRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnN0YXJ0T3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogewotICAgIGlmICh1aW50MzJfdChzdHJlYW0pID49IEFVRElPX1NUUkVBTV9DTlQpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9CiAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9CiAgICAgQUxPR1YoInN0YXJ0T3V0cHV0KCkiKTsKKyAgICBzcDxBdWRpb1BsYXliYWNrQ2xpZW50PiBjbGllbnQ7CiAgICAgc3A8QXVkaW9Qb2xpY3lFZmZlY3RzPmF1ZGlvUG9saWN5RWZmZWN0czsKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgICAgIGNvbnN0IHNzaXplX3QgaW5kZXggPSBtQXVkaW9QbGF5YmFja0NsaWVudHMuaW5kZXhPZktleShwb3J0SWQpOworICAgICAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgICAgICBBTE9HRSgiJXMgQXVkaW9UcmFjayBjbGllbnQgbm90IGZvdW5kIGZvciBwb3J0SWQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnRJZCk7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKyAgICAgICAgY2xpZW50ID0gbUF1ZGlvUGxheWJhY2tDbGllbnRzLnZhbHVlQXQoaW5kZXgpOwogICAgICAgICBhdWRpb1BvbGljeUVmZmVjdHMgPSBtQXVkaW9Qb2xpY3lFZmZlY3RzOwogICAgIH0KICAgICBpZiAoYXVkaW9Qb2xpY3lFZmZlY3RzICE9IDApIHsKICAgICAgICAgLy8gY3JlYXRlIGF1ZGlvIHByb2Nlc3NvcnMgYWNjb3JkaW5nIHRvIHN0cmVhbQotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBhdWRpb1BvbGljeUVmZmVjdHMtPmFkZE91dHB1dFNlc3Npb25FZmZlY3RzKG91dHB1dCwgc3RyZWFtLCBzZXNzaW9uKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gYXVkaW9Qb2xpY3lFZmZlY3RzLT5hZGRPdXRwdXRTZXNzaW9uRWZmZWN0cygKKyAgICAgICAgICAgIGNsaWVudC0+aW8sIGNsaWVudC0+c3RyZWFtLCBjbGllbnQtPnNlc3Npb24pOwogICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SICYmIHN0YXR1cyAhPSBBTFJFQURZX0VYSVNUUykgewotICAgICAgICAgICAgQUxPR1coIkZhaWxlZCB0byBhZGQgZWZmZWN0cyBvbiBzZXNzaW9uICVkIiwgc2Vzc2lvbik7CisgICAgICAgICAgICBBTE9HVygiRmFpbGVkIHRvIGFkZCBlZmZlY3RzIG9uIHNlc3Npb24gJWQiLCBjbGllbnQtPnNlc3Npb24pOwogICAgICAgICB9CiAgICAgfQogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKLSAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+c3RhcnRPdXRwdXQob3V0cHV0LCBzdHJlYW0sIHNlc3Npb24pOworICAgIHN0YXR1c190IHN0YXR1cyA9IG1BdWRpb1BvbGljeU1hbmFnZXItPnN0YXJ0T3V0cHV0KHBvcnRJZCk7CisgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICBjbGllbnQtPmFjdGl2ZSA9IHRydWU7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7CiB9CiAKLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c3RvcE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnN0b3BPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiB7Ci0gICAgaWYgKHVpbnQzMl90KHN0cmVhbSkgPj0gQVVESU9fU1RSRUFNX0NOVCkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KICAgICBBTE9HVigic3RvcE91dHB1dCgpIik7Ci0gICAgbU91dHB1dENvbW1hbmRUaHJlYWQtPnN0b3BPdXRwdXRDb21tYW5kKG91dHB1dCwgc3RyZWFtLCBzZXNzaW9uKTsKKyAgICBtT3V0cHV0Q29tbWFuZFRocmVhZC0+c3RvcE91dHB1dENvbW1hbmQocG9ydElkKTsKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLXN0YXR1c190ICBBdWRpb1BvbGljeVNlcnZpY2U6OmRvU3RvcE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKK3N0YXR1c190ICBBdWRpb1BvbGljeVNlcnZpY2U6OmRvU3RvcE91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKIHsKLSAgICBBTE9HVigiZG9TdG9wT3V0cHV0IGZyb20gdGlkICVkIiwgZ2V0dGlkKCkpOworICAgIEFMT0dWKCJkb1N0b3BPdXRwdXQiKTsKKyAgICBzcDxBdWRpb1BsYXliYWNrQ2xpZW50PiBjbGllbnQ7CiAgICAgc3A8QXVkaW9Qb2xpY3lFZmZlY3RzPmF1ZGlvUG9saWN5RWZmZWN0czsKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisKKyAgICAgICAgY29uc3Qgc3NpemVfdCBpbmRleCA9IG1BdWRpb1BsYXliYWNrQ2xpZW50cy5pbmRleE9mS2V5KHBvcnRJZCk7CisgICAgICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCIlcyBBdWRpb1RyYWNrIGNsaWVudCBub3QgZm91bmQgZm9yIHBvcnRJZCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydElkKTsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorICAgICAgICBjbGllbnQgPSBtQXVkaW9QbGF5YmFja0NsaWVudHMudmFsdWVBdChpbmRleCk7CiAgICAgICAgIGF1ZGlvUG9saWN5RWZmZWN0cyA9IG1BdWRpb1BvbGljeUVmZmVjdHM7CiAgICAgfQogICAgIGlmIChhdWRpb1BvbGljeUVmZmVjdHMgIT0gMCkgewogICAgICAgICAvLyByZWxlYXNlIGF1ZGlvIHByb2Nlc3NvcnMgZnJvbSB0aGUgc3RyZWFtCi0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGF1ZGlvUG9saWN5RWZmZWN0cy0+cmVsZWFzZU91dHB1dFNlc3Npb25FZmZlY3RzKG91dHB1dCwgc3RyZWFtLCBzZXNzaW9uKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gYXVkaW9Qb2xpY3lFZmZlY3RzLT5yZWxlYXNlT3V0cHV0U2Vzc2lvbkVmZmVjdHMoCisgICAgICAgICAgICBjbGllbnQtPmlvLCBjbGllbnQtPnN0cmVhbSwgY2xpZW50LT5zZXNzaW9uKTsKICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUiAmJiBzdGF0dXMgIT0gQUxSRUFEWV9FWElTVFMpIHsKLSAgICAgICAgICAgIEFMT0dXKCJGYWlsZWQgdG8gcmVsZWFzZSBlZmZlY3RzIG9uIHNlc3Npb24gJWQiLCBzZXNzaW9uKTsKKyAgICAgICAgICAgIEFMT0dXKCJGYWlsZWQgdG8gcmVsZWFzZSBlZmZlY3RzIG9uIHNlc3Npb24gJWQiLCBjbGllbnQtPnNlc3Npb24pOwogICAgICAgICB9CiAgICAgfQogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKLSAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+c3RvcE91dHB1dChvdXRwdXQsIHN0cmVhbSwgc2Vzc2lvbik7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbUF1ZGlvUG9saWN5TWFuYWdlci0+c3RvcE91dHB1dChwb3J0SWQpOworICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgY2xpZW50LT5hY3RpdmUgPSBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKIH0KIAotdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OnJlbGVhc2VPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpyZWxlYXNlT3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogewogICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICBBTE9HVigicmVsZWFzZU91dHB1dCgpIik7Ci0gICAgbU91dHB1dENvbW1hbmRUaHJlYWQtPnJlbGVhc2VPdXRwdXRDb21tYW5kKG91dHB1dCwgc3RyZWFtLCBzZXNzaW9uKTsKKyAgICBtT3V0cHV0Q29tbWFuZFRocmVhZC0+cmVsZWFzZU91dHB1dENvbW1hbmQocG9ydElkKTsKIH0KIAotdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OmRvUmVsZWFzZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpkb1JlbGVhc2VPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiB7CiAgICAgQUxPR1YoImRvUmVsZWFzZU91dHB1dCBmcm9tIHRpZCAlZCIsIGdldHRpZCgpKTsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGNvbnN0IHNzaXplX3QgaW5kZXggPSBtQXVkaW9QbGF5YmFja0NsaWVudHMuaW5kZXhPZktleShwb3J0SWQpOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgQUxPR0UoIiVzIEF1ZGlvVHJhY2sgY2xpZW50IG5vdCBmb3VuZCBmb3IgcG9ydElkICVkIiwgX19GVU5DVElPTl9fLCBwb3J0SWQpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHNwPEF1ZGlvUGxheWJhY2tDbGllbnQ+IGNsaWVudCA9IG1BdWRpb1BsYXliYWNrQ2xpZW50cy52YWx1ZUF0KGluZGV4KTsKKyAgICBtQXVkaW9SZWNvcmRDbGllbnRzLnJlbW92ZUl0ZW0ocG9ydElkKTsKKwogICAgIC8vIGNhbGxlZCBmcm9tIGludGVybmFsIHRocmVhZDogbm8gbmVlZCB0byBjbGVhciBjYWxsZXIgaWRlbnRpdHkKLSAgICBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5yZWxlYXNlT3V0cHV0KG91dHB1dCwgc3RyZWFtLCBzZXNzaW9uKTsKKyAgICBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5yZWxlYXNlT3V0cHV0KHBvcnRJZCk7CiB9CiAKIHN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW5wdXRGb3JBdHRyKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKQEAgLTMyMCw3ICszNDMsNyBAQAogCiAgICAgYm9vbCB1cGRhdGVQaWQgPSAocGlkID09IC0xKTsKICAgICBjb25zdCB1aWRfdCBjYWxsaW5nVWlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpOwotICAgIGlmICghaXNUcnVzdGVkQ2FsbGluZ1VpZChjYWxsaW5nVWlkKSkgeworICAgIGlmICghaXNBdWRpb1NlcnZlck9yTWVkaWFTZXJ2ZXJVaWQoY2FsbGluZ1VpZCkpIHsKICAgICAgICAgQUxPR1dfSUYodWlkICE9ICh1aWRfdCktMSAmJiB1aWQgIT0gY2FsbGluZ1VpZCwKICAgICAgICAgICAgICAgICAiJXMgdWlkICVkIHRyaWVkIHRvIHBhc3MgaXRzZWxmIG9mZiBhcyAlZCIsIF9fRlVOQ1RJT05fXywgY2FsbGluZ1VpZCwgdWlkKTsKICAgICAgICAgdWlkID0gY2FsbGluZ1VpZDsKQEAgLTM5OCwxNyArNDIxLDEzIEBACiAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gUEVSTUlTU0lPTl9ERU5JRUQpIHsKICAgICAgICAgICAgICAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOwotICAgICAgICAgICAgICAgIG1BdWRpb1BvbGljeU1hbmFnZXItPnJlbGVhc2VJbnB1dCgqaW5wdXQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgIG1BdWRpb1BvbGljeU1hbmFnZXItPnJlbGVhc2VJbnB1dCgqcG9ydElkKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgICAgIH0KIAotICAgICAgICBzcDxBdWRpb1JlY29yZENsaWVudD4gY2xpZW50ID0KLSAgICAgICAgICAgICAgICBuZXcgQXVkaW9SZWNvcmRDbGllbnQoKmF0dHIsICppbnB1dCwgdWlkLCBwaWQsIG9wUGFja2FnZU5hbWUsIHNlc3Npb24pOwotICAgICAgICBjbGllbnQtPmFjdGl2ZSA9IGZhbHNlOwotICAgICAgICBjbGllbnQtPmlzQ29uY3VycmVudCA9IGZhbHNlOwotICAgICAgICBjbGllbnQtPmlzVmlydHVhbERldmljZSA9IGZhbHNlOyAvL1RPRE8gOiB1cGRhdGUgZnJvbSBBUE0tPmdldElucHV0Rm9yQXR0cigpCi0gICAgICAgIGNsaWVudC0+ZGV2aWNlSWQgPSAqc2VsZWN0ZWREZXZpY2VJZDsKKyAgICAgICAgc3A8QXVkaW9SZWNvcmRDbGllbnQ+IGNsaWVudCA9IG5ldyBBdWRpb1JlY29yZENsaWVudCgqYXR0ciwgKmlucHV0LCB1aWQsIHBpZCwgc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2VsZWN0ZWREZXZpY2VJZCwgb3BQYWNrYWdlTmFtZSk7CiAgICAgICAgIG1BdWRpb1JlY29yZENsaWVudHMuYWRkKCpwb3J0SWQsIGNsaWVudCk7CiAgICAgfQogCkBAIC00OTYsOCArNTE1LDcgQEAKICAgICBzdGF0dXNfdCBzdGF0dXM7CiAgICAgewogICAgICAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOwotICAgICAgICBzdGF0dXMgPSBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5zdGFydElucHV0KAotICAgICAgICAgICAgICAgICAgICBjbGllbnQtPmlucHV0LCBjbGllbnQtPnNlc3Npb24sICpzaWxlbmNlZCwgJmNvbmN1cnJlbmN5KTsKKyAgICAgICAgc3RhdHVzID0gbUF1ZGlvUG9saWN5TWFuYWdlci0+c3RhcnRJbnB1dChwb3J0SWQsICpzaWxlbmNlZCwgJmNvbmN1cnJlbmN5KTsKIAogICAgIH0KIApAQCAtNTI4LDEwICs1NDYsMTMgQEAKIAogICAgICAgICAgICAgaXRlbS0+c2V0Q1N0cmluZyhrQXVkaW9Qb2xpY3lScXN0U3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb1NvdXJjZVN0cmluZyhjbGllbnQtPmF0dHJpYnV0ZXMuc291cmNlKS5jX3N0cigpKTsKLSAgICAgICAgICAgIGl0ZW0tPnNldENTdHJpbmcoa0F1ZGlvUG9saWN5UnFzdFBrZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcoU3RyaW5nOChjbGllbnQtPm9wUGFja2FnZU5hbWUpLnN0cmluZygpKS5jX3N0cigpKTsKICAgICAgICAgICAgIGl0ZW0tPnNldEludDMyKGtBdWRpb1BvbGljeVJxc3RTZXNzaW9uLCBjbGllbnQtPnNlc3Npb24pOwotCisgICAgICAgICAgICBpZiAoY2xpZW50LT5vcFBhY2thZ2VOYW1lLnNpemUoKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgaXRlbS0+c2V0Q1N0cmluZyhrQXVkaW9Qb2xpY3lScXN0UGtnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcoU3RyaW5nOChjbGllbnQtPm9wUGFja2FnZU5hbWUpLnN0cmluZygpKS5jX3N0cigpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaXRlbS0+c2V0Q1N0cmluZyhrQXVkaW9Qb2xpY3lScXN0UGtnLCBzdGQ6OnRvX3N0cmluZyhjbGllbnQtPnVpZCkuY19zdHIoKSk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBpdGVtLT5zZXRDU3RyaW5nKAogICAgICAgICAgICAgICAgICAgICBrQXVkaW9Qb2xpY3lScXN0RGV2aWNlLCBnZXREZXZpY2VUeXBlU3RyRm9yUG9ydElkKGNsaWVudC0+ZGV2aWNlSWQpLmNfc3RyKCkpOwogCkBAIC01NTAsOSArNTcxLDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBrZWVwcyB0aGUgbGFzdCBvZiB0aGUgY2xpZW50cyBtYXJrZWQgYWN0aXZlCiAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLT5zZXRDU3RyaW5nKGtBdWRpb1BvbGljeUFjdGl2ZVNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9Tb3VyY2VTdHJpbmcob3RoZXItPmF0dHJpYnV0ZXMuc291cmNlKS5jX3N0cigpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPnNldENTdHJpbmcoa0F1ZGlvUG9saWN5QWN0aXZlUGtnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKFN0cmluZzgob3RoZXItPm9wUGFja2FnZU5hbWUpLnN0cmluZygpKS5jX3N0cigpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPnNldEludDMyKGtBdWRpb1BvbGljeUFjdGl2ZVNlc3Npb24sIG90aGVyLT5zZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvdGhlci0+b3BQYWNrYWdlTmFtZS5zaXplKCkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPnNldENTdHJpbmcoa0F1ZGlvUG9saWN5QWN0aXZlUGtnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcoU3RyaW5nOChvdGhlci0+b3BQYWNrYWdlTmFtZSkuc3RyaW5nKCkpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLT5zZXRDU3RyaW5nKGtBdWRpb1BvbGljeVJxc3RQa2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnRvX3N0cmluZyhvdGhlci0+dWlkKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPnNldENTdHJpbmcoa0F1ZGlvUG9saWN5QWN0aXZlRGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXREZXZpY2VUeXBlU3RyRm9yUG9ydElkKG90aGVyLT5kZXZpY2VJZCkuY19zdHIoKSk7CiAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTYwMiw3ICs2MjgsNyBAQAogICAgIC8vIGZpbmlzaCB0aGUgcmVjb3JkaW5nIGFwcCBvcAogICAgIGZpbmlzaFJlY29yZGluZyhjbGllbnQtPm9wUGFja2FnZU5hbWUsIGNsaWVudC0+dWlkKTsKICAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOwotICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5zdG9wSW5wdXQoY2xpZW50LT5pbnB1dCwgY2xpZW50LT5zZXNzaW9uKTsKKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+c3RvcElucHV0KHBvcnRJZCk7CiB9CiAKIHZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpyZWxlYXNlSW5wdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCkBAIC02MjcsMTUgKzY1MywxNSBAQAogICAgIH0KICAgICBpZiAoYXVkaW9Qb2xpY3lFZmZlY3RzICE9IDApIHsKICAgICAgICAgLy8gcmVsZWFzZSBhdWRpbyBwcm9jZXNzb3JzIGZyb20gdGhlIGlucHV0Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGF1ZGlvUG9saWN5RWZmZWN0cy0+cmVsZWFzZUlucHV0RWZmZWN0cyhjbGllbnQtPmlucHV0LCBjbGllbnQtPnNlc3Npb24pOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBhdWRpb1BvbGljeUVmZmVjdHMtPnJlbGVhc2VJbnB1dEVmZmVjdHMoY2xpZW50LT5pbywgY2xpZW50LT5zZXNzaW9uKTsKICAgICAgICAgaWYoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBBTE9HVygiRmFpbGVkIHRvIHJlbGVhc2UgZWZmZWN0cyBvbiBpbnB1dCAlZCIsIGNsaWVudC0+aW5wdXQpOworICAgICAgICAgICAgQUxPR1coIkZhaWxlZCB0byByZWxlYXNlIGVmZmVjdHMgb24gaW5wdXQgJWQiLCBjbGllbnQtPmlvKTsKICAgICAgICAgfQogICAgIH0KICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7Ci0gICAgICAgIG1BdWRpb1BvbGljeU1hbmFnZXItPnJlbGVhc2VJbnB1dChjbGllbnQtPmlucHV0LCBjbGllbnQtPnNlc3Npb24pOworICAgICAgICBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5yZWxlYXNlSW5wdXQocG9ydElkKTsKICAgICB9CiB9CiAKQEAgLTgwMywyNyArODI5LDEwMCBAQAogICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5pc1NvdXJjZUFjdGl2ZShzb3VyY2UpOwogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnF1ZXJ5RGVmYXVsdFByZVByb2Nlc3NpbmcoYXVkaW9fc2Vzc2lvbl90IGF1ZGlvU2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjcmlwdG9ycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqY291bnQpCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmdldEF1ZGlvUG9saWN5RWZmZWN0cyhzcDxBdWRpb1BvbGljeUVmZmVjdHM+JiBhdWRpb1BvbGljeUVmZmVjdHMpCiB7CiAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgewotICAgICAgICAqY291bnQgPSAwOwogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9Ci0gICAgc3A8QXVkaW9Qb2xpY3lFZmZlY3RzPmF1ZGlvUG9saWN5RWZmZWN0czsKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgICAgIGF1ZGlvUG9saWN5RWZmZWN0cyA9IG1BdWRpb1BvbGljeUVmZmVjdHM7CiAgICAgfQogICAgIGlmIChhdWRpb1BvbGljeUVmZmVjdHMgPT0gMCkgewotICAgICAgICAqY291bnQgPSAwOwogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6cXVlcnlEZWZhdWx0UHJlUHJvY2Vzc2luZyhhdWRpb19zZXNzaW9uX3QgYXVkaW9TZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2NyaXB0b3JzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpjb3VudCkKK3sKKyAgICBzcDxBdWRpb1BvbGljeUVmZmVjdHM+YXVkaW9Qb2xpY3lFZmZlY3RzOworICAgIHN0YXR1c190IHN0YXR1cyA9IGdldEF1ZGlvUG9saWN5RWZmZWN0cyhhdWRpb1BvbGljeUVmZmVjdHMpOworICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgKmNvdW50ID0gMDsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CiAgICAgcmV0dXJuIGF1ZGlvUG9saWN5RWZmZWN0cy0+cXVlcnlEZWZhdWx0SW5wdXRFZmZlY3RzKAogICAgICAgICAgICAgKGF1ZGlvX3Nlc3Npb25fdClhdWRpb1Nlc3Npb24sIGRlc2NyaXB0b3JzLCBjb3VudCk7CiB9CiAKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6YWRkU291cmNlRGVmYXVsdEVmZmVjdChjb25zdCBlZmZlY3RfdXVpZF90ICp0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnV1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fdW5pcXVlX2lkX3QqIGlkKQoreworICAgIHNwPEF1ZGlvUG9saWN5RWZmZWN0cz5hdWRpb1BvbGljeUVmZmVjdHM7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gZ2V0QXVkaW9Qb2xpY3lFZmZlY3RzKGF1ZGlvUG9saWN5RWZmZWN0cyk7CisgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICBpZiAoIW1vZGlmeURlZmF1bHRBdWRpb0VmZmVjdHNBbGxvd2VkKCkpIHsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKyAgICByZXR1cm4gYXVkaW9Qb2xpY3lFZmZlY3RzLT5hZGRTb3VyY2VEZWZhdWx0RWZmZWN0KAorICAgICAgICAgICAgdHlwZSwgb3BQYWNrYWdlTmFtZSwgdXVpZCwgcHJpb3JpdHksIHNvdXJjZSwgaWQpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmFkZFN0cmVhbURlZmF1bHRFZmZlY3QoY29uc3QgZWZmZWN0X3V1aWRfdCAqdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90ICp1dWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fdXNhZ2VfdCB1c2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb191bmlxdWVfaWRfdCogaWQpCit7CisgICAgc3A8QXVkaW9Qb2xpY3lFZmZlY3RzPmF1ZGlvUG9saWN5RWZmZWN0czsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBnZXRBdWRpb1BvbGljeUVmZmVjdHMoYXVkaW9Qb2xpY3lFZmZlY3RzKTsKKyAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIGlmICghbW9kaWZ5RGVmYXVsdEF1ZGlvRWZmZWN0c0FsbG93ZWQoKSkgeworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorICAgIHJldHVybiBhdWRpb1BvbGljeUVmZmVjdHMtPmFkZFN0cmVhbURlZmF1bHRFZmZlY3QoCisgICAgICAgICAgICB0eXBlLCBvcFBhY2thZ2VOYW1lLCB1dWlkLCBwcmlvcml0eSwgdXNhZ2UsIGlkKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpyZW1vdmVTb3VyY2VEZWZhdWx0RWZmZWN0KGF1ZGlvX3VuaXF1ZV9pZF90IGlkKQoreworICAgIHNwPEF1ZGlvUG9saWN5RWZmZWN0cz5hdWRpb1BvbGljeUVmZmVjdHM7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gZ2V0QXVkaW9Qb2xpY3lFZmZlY3RzKGF1ZGlvUG9saWN5RWZmZWN0cyk7CisgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICBpZiAoIW1vZGlmeURlZmF1bHRBdWRpb0VmZmVjdHNBbGxvd2VkKCkpIHsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKyAgICByZXR1cm4gYXVkaW9Qb2xpY3lFZmZlY3RzLT5yZW1vdmVTb3VyY2VEZWZhdWx0RWZmZWN0KGlkKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpyZW1vdmVTdHJlYW1EZWZhdWx0RWZmZWN0KGF1ZGlvX3VuaXF1ZV9pZF90IGlkKQoreworICAgIHNwPEF1ZGlvUG9saWN5RWZmZWN0cz5hdWRpb1BvbGljeUVmZmVjdHM7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gZ2V0QXVkaW9Qb2xpY3lFZmZlY3RzKGF1ZGlvUG9saWN5RWZmZWN0cyk7CisgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICBpZiAoIW1vZGlmeURlZmF1bHRBdWRpb0VmZmVjdHNBbGxvd2VkKCkpIHsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKyAgICByZXR1cm4gYXVkaW9Qb2xpY3lFZmZlY3RzLT5yZW1vdmVTdHJlYW1EZWZhdWx0RWZmZWN0KGlkKTsKK30KKwogYm9vbCBBdWRpb1BvbGljeVNlcnZpY2U6OmlzT2ZmbG9hZFN1cHBvcnRlZChjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCYgaW5mbykKIHsKICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CkBAIC05NTUsMjYgKzEwNTQsMjYgQEAKIH0KIAogc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzdGFydEF1ZGlvU291cmNlKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0cmlidXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQpCiB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KICAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOwotICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5zdGFydEF1ZGlvU291cmNlKHNvdXJjZSwgYXR0cmlidXRlcywgaGFuZGxlLAorICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5zdGFydEF1ZGlvU291cmNlKHNvdXJjZSwgYXR0cmlidXRlcywgcG9ydElkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSk7CiB9CiAKLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c3RvcEF1ZGlvU291cmNlKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSkKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c3RvcEF1ZGlvU291cmNlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9CiAgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKLSAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+c3RvcEF1ZGlvU291cmNlKGhhbmRsZSk7CisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPnN0b3BBdWRpb1NvdXJjZShwb3J0SWQpOwogfQogCiBzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldE1hc3Rlck1vbm8oYm9vbCBtb25vKQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeVNlcnZpY2UuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeVNlcnZpY2UuY3BwCmluZGV4IGYzY2RkYzMuLmIxZWQ1MjIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5U2VydmljZS5jcHAKQEAgLTI2LDcgKzI2LDYgQEAKICNpbmNsdWRlIDxzeXMvdGltZS5oPgogI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDxjdXRpbHMvbXVsdGl1c2VyLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KICNpbmNsdWRlIDxiaW5kZXIvQWN0aXZpdHlNYW5hZ2VyLmg+CkBAIC0zNSwxNiArMzQsMTQgQEAKICNpbmNsdWRlIDx1dGlscy9TdHJpbmcxNi5oPgogI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KICNpbmNsdWRlICJBdWRpb1BvbGljeVNlcnZpY2UuaCIKLSNpbmNsdWRlICJTZXJ2aWNlVXRpbGl0aWVzLmgiCiAjaW5jbHVkZSA8aGFyZHdhcmVfbGVnYWN5L3Bvd2VyLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9FZmZlY3QuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1BhcmFtZXRlci5oPgorI2luY2x1ZGUgPG1lZGlhdXRpbHMvU2VydmljZVV0aWxpdGllcy5oPgogCiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX3BvbGljeS5oPgogCi0jaW5jbHVkZSA8cHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmg+Ci0KIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RhdGljIGNvbnN0IGNoYXIga0RlYWRsb2NrZWRTdHJpbmdbXSA9ICJBdWRpb1BvbGljeVNlcnZpY2UgbWF5IGJlIGRlYWRsb2NrZWRcbiI7CkBAIC03MCw4ICs2Nyw2IEBACiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogCi0gICAgICAgIC8vIHN0YXJ0IHRvbmUgcGxheWJhY2sgdGhyZWFkCi0gICAgICAgIG1Ub25lUGxheWJhY2tUaHJlYWQgPSBuZXcgQXVkaW9Db21tYW5kVGhyZWFkKFN0cmluZzgoIkFwbVRvbmUiKSwgdGhpcyk7CiAgICAgICAgIC8vIHN0YXJ0IGF1ZGlvIGNvbW1hbmRzIHRocmVhZAogICAgICAgICBtQXVkaW9Db21tYW5kVGhyZWFkID0gbmV3IEF1ZGlvQ29tbWFuZFRocmVhZChTdHJpbmc4KCJBcG1BdWRpbyIpLCB0aGlzKTsKICAgICAgICAgLy8gc3RhcnQgb3V0cHV0IGFjdGl2aXR5IGNvbW1hbmQgdGhyZWFkCkBAIC05Myw3ICs4OCw2IEBACiAKIEF1ZGlvUG9saWN5U2VydmljZTo6fkF1ZGlvUG9saWN5U2VydmljZSgpCiB7Ci0gICAgbVRvbmVQbGF5YmFja1RocmVhZC0+ZXhpdCgpOwogICAgIG1BdWRpb0NvbW1hbmRUaHJlYWQtPmV4aXQoKTsKICAgICBtT3V0cHV0Q29tbWFuZFRocmVhZC0+ZXhpdCgpOwogCkBAIC0xMTgsMTMgKzExMiwxNyBAQAogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTm90aWZpY2F0aW9uQ2xpZW50c0xvY2spOwogCiAgICAgdWlkX3QgdWlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpOwotICAgIGlmIChtTm90aWZpY2F0aW9uQ2xpZW50cy5pbmRleE9mS2V5KHVpZCkgPCAwKSB7CisgICAgcGlkX3QgcGlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOworICAgIGludDY0X3QgdG9rZW4gPSAoKGludDY0X3QpdWlkPDwzMikgfCBwaWQ7CisKKyAgICBpZiAobU5vdGlmaWNhdGlvbkNsaWVudHMuaW5kZXhPZktleSh0b2tlbikgPCAwKSB7CiAgICAgICAgIHNwPE5vdGlmaWNhdGlvbkNsaWVudD4gbm90aWZpY2F0aW9uQ2xpZW50ID0gbmV3IE5vdGlmaWNhdGlvbkNsaWVudCh0aGlzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkKTsKLSAgICAgICAgQUxPR1YoInJlZ2lzdGVyQ2xpZW50KCkgY2xpZW50ICVwLCB1aWQgJWQiLCBjbGllbnQuZ2V0KCksIHVpZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWQpOworICAgICAgICBBTE9HVigicmVnaXN0ZXJDbGllbnQoKSBjbGllbnQgJXAsIHVpZCAlZCBwaWQgJWQiLCBjbGllbnQuZ2V0KCksIHVpZCwgcGlkKTsKIAotICAgICAgICBtTm90aWZpY2F0aW9uQ2xpZW50cy5hZGQodWlkLCBub3RpZmljYXRpb25DbGllbnQpOworICAgICAgICBtTm90aWZpY2F0aW9uQ2xpZW50cy5hZGQodG9rZW4sIG5vdGlmaWNhdGlvbkNsaWVudCk7CiAKICAgICAgICAgc3A8SUJpbmRlcj4gYmluZGVyID0gSUludGVyZmFjZTo6YXNCaW5kZXIoY2xpZW50KTsKICAgICAgICAgYmluZGVyLT5saW5rVG9EZWF0aChub3RpZmljYXRpb25DbGllbnQpOwpAQCAtMTM2LDIyICsxMzQsMzMgQEAKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobU5vdGlmaWNhdGlvbkNsaWVudHNMb2NrKTsKIAogICAgIHVpZF90IHVpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKTsKLSAgICBpZiAobU5vdGlmaWNhdGlvbkNsaWVudHMuaW5kZXhPZktleSh1aWQpIDwgMCkgeworICAgIHBpZF90IHBpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKTsKKyAgICBpbnQ2NF90IHRva2VuID0gKChpbnQ2NF90KXVpZDw8MzIpIHwgcGlkOworCisgICAgaWYgKG1Ob3RpZmljYXRpb25DbGllbnRzLmluZGV4T2ZLZXkodG9rZW4pIDwgMCkgewogICAgICAgICByZXR1cm47CiAgICAgfQotICAgIG1Ob3RpZmljYXRpb25DbGllbnRzLnZhbHVlRm9yKHVpZCktPnNldEF1ZGlvUG9ydENhbGxiYWNrc0VuYWJsZWQoZW5hYmxlZCk7CisgICAgbU5vdGlmaWNhdGlvbkNsaWVudHMudmFsdWVGb3IodG9rZW4pLT5zZXRBdWRpb1BvcnRDYWxsYmFja3NFbmFibGVkKGVuYWJsZWQpOwogfQogCiAvLyByZW1vdmVOb3RpZmljYXRpb25DbGllbnQoKSBpcyBjYWxsZWQgd2hlbiB0aGUgY2xpZW50IHByb2Nlc3MgZGllcy4KLXZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpyZW1vdmVOb3RpZmljYXRpb25DbGllbnQodWlkX3QgdWlkKQordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OnJlbW92ZU5vdGlmaWNhdGlvbkNsaWVudCh1aWRfdCB1aWQsIHBpZF90IHBpZCkKIHsKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTm90aWZpY2F0aW9uQ2xpZW50c0xvY2spOwotICAgICAgICBtTm90aWZpY2F0aW9uQ2xpZW50cy5yZW1vdmVJdGVtKHVpZCk7CisgICAgICAgIGludDY0X3QgdG9rZW4gPSAoKGludDY0X3QpdWlkPDwzMikgfCBwaWQ7CisgICAgICAgIG1Ob3RpZmljYXRpb25DbGllbnRzLnJlbW92ZUl0ZW0odG9rZW4pOwogICAgIH0KICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyKSB7CisgICAgICAgIGJvb2wgaGFzU2FtZVVpZCA9IGZhbHNlOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Ob3RpZmljYXRpb25DbGllbnRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBpZiAobU5vdGlmaWNhdGlvbkNsaWVudHMudmFsdWVBdChpKS0+dWlkKCkgPT0gdWlkKSB7CisgICAgICAgICAgICAgICAgaGFzU2FtZVVpZCA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgJiYgIWhhc1NhbWVVaWQpIHsKICAgICAgICAgICAgIC8vIGNhbGxlZCBmcm9tIGJpbmRlciBkZWF0aCBub3RpZmljYXRpb246IG5vIG5lZWQgdG8gY2xlYXIgY2FsbGVyIGlkZW50aXR5CiAgICAgICAgICAgICBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5yZWxlYXNlUmVzb3VyY2VzRm9yVWlkKHVpZCk7CiAgICAgICAgIH0KQEAgLTIzOSw4ICsyNDgsOSBAQAogCiBBdWRpb1BvbGljeVNlcnZpY2U6Ok5vdGlmaWNhdGlvbkNsaWVudDo6Tm90aWZpY2F0aW9uQ2xpZW50KGNvbnN0IHNwPEF1ZGlvUG9saWN5U2VydmljZT4mIHNlcnZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ+JiBjbGllbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCkKLSAgICA6IG1TZXJ2aWNlKHNlcnZpY2UpLCBtVWlkKHVpZCksIG1BdWRpb1BvbGljeVNlcnZpY2VDbGllbnQoY2xpZW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBwaWQpCisgICAgOiBtU2VydmljZShzZXJ2aWNlKSwgbVVpZCh1aWQpLCBtUGlkKHBpZCksIG1BdWRpb1BvbGljeVNlcnZpY2VDbGllbnQoY2xpZW50KSwKICAgICAgIG1BdWRpb1BvcnRDYWxsYmFja3NFbmFibGVkKGZhbHNlKQogewogfQpAQCAtMjU0LDcgKzI2NCw3IEBACiAgICAgc3A8Tm90aWZpY2F0aW9uQ2xpZW50PiBrZWVwKHRoaXMpOwogICAgIHNwPEF1ZGlvUG9saWN5U2VydmljZT4gc2VydmljZSA9IG1TZXJ2aWNlLnByb21vdGUoKTsKICAgICBpZiAoc2VydmljZSAhPSAwKSB7Ci0gICAgICAgIHNlcnZpY2UtPnJlbW92ZU5vdGlmaWNhdGlvbkNsaWVudChtVWlkKTsKKyAgICAgICAgc2VydmljZS0+cmVtb3ZlTm90aWZpY2F0aW9uQ2xpZW50KG1VaWQsIG1QaWQpOwogICAgIH0KIH0KIApAQCAtMjc1LDcgKzI4NSw3IEBACiB2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6Tm90aWZpY2F0aW9uQ2xpZW50OjpvbkR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZSgKICAgICAgICAgY29uc3QgU3RyaW5nOCYgcmVnSWQsIGludDMyX3Qgc3RhdGUpCiB7Ci0gICAgaWYgKG1BdWRpb1BvbGljeVNlcnZpY2VDbGllbnQgIT0gMCAmJiBtdWx0aXVzZXJfZ2V0X2FwcF9pZChtVWlkKSA8IEFJRF9BUFBfU1RBUlQpIHsKKyAgICBpZiAobUF1ZGlvUG9saWN5U2VydmljZUNsaWVudCAhPSAwICYmIGlzU2VydmljZVVpZChtVWlkKSkgewogICAgICAgICBtQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LT5vbkR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZShyZWdJZCwgc3RhdGUpOwogICAgIH0KIH0KQEAgLTI4NSw3ICsyOTUsNyBAQAogICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywKICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUpCiB7Ci0gICAgaWYgKG1BdWRpb1BvbGljeVNlcnZpY2VDbGllbnQgIT0gMCAmJiBtdWx0aXVzZXJfZ2V0X2FwcF9pZChtVWlkKSA8IEFJRF9BUFBfU1RBUlQpIHsKKyAgICBpZiAobUF1ZGlvUG9saWN5U2VydmljZUNsaWVudCAhPSAwICYmIGlzU2VydmljZVVpZChtVWlkKSkgewogICAgICAgICBtQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LT5vblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoZXZlbnQsIGNsaWVudEluZm8sCiAgICAgICAgICAgICAgICAgY2xpZW50Q29uZmlnLCBkZXZpY2VDb25maWcsIHBhdGNoSGFuZGxlKTsKICAgICB9CkBAIC0zMjUsOCArMzM1LDYgQEAKICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CiAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiQ29tbWFuZCBUaHJlYWQ6ICVwXG4iLCBtQXVkaW9Db21tYW5kVGhyZWFkLmdldCgpKTsKICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiVG9uZXMgVGhyZWFkOiAlcFxuIiwgbVRvbmVQbGF5YmFja1RocmVhZC5nZXQoKSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwogCiAgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CiAgICAgcmV0dXJuIE5PX0VSUk9SOwpAQCAtMzYyLDkgKzM3MCw2IEBACiAgICAgICAgIGlmIChtQXVkaW9Db21tYW5kVGhyZWFkICE9IDApIHsKICAgICAgICAgICAgIG1BdWRpb0NvbW1hbmRUaHJlYWQtPmR1bXAoZmQpOwogICAgICAgICB9Ci0gICAgICAgIGlmIChtVG9uZVBsYXliYWNrVGhyZWFkICE9IDApIHsKLSAgICAgICAgICAgIG1Ub25lUGxheWJhY2tUaHJlYWQtPmR1bXAoZmQpOwotICAgICAgICB9CiAKICAgICAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIpIHsKICAgICAgICAgICAgIG1BdWRpb1BvbGljeU1hbmFnZXItPmR1bXAoZmQpOwpAQCAtNTc3LDEwICs1ODIsNiBAQAogICAgIHVwZGF0ZVVpZENhY2hlKHVpZCwgZmFsc2UsIHRydWUpOwogfQogCi1ib29sIEF1ZGlvUG9saWN5U2VydmljZTo6VWlkUG9saWN5Ojppc1NlcnZpY2VVaWQodWlkX3QgdWlkKSBjb25zdCB7Ci0gICAgcmV0dXJuIG11bHRpdXNlcl9nZXRfYXBwX2lkKHVpZCkgPCBBSURfQVBQX1NUQVJUOwotfQotCiB2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6VWlkUG9saWN5Ojpub3RpZnlTZXJ2aWNlKHVpZF90IHVpZCwgYm9vbCBhY3RpdmUpIHsKICAgICBzcDxBdWRpb1BvbGljeVNlcnZpY2U+IHNlcnZpY2UgPSBtU2VydmljZS5wcm9tb3RlKCk7CiAgICAgaWYgKHNlcnZpY2UgIT0gbnVsbHB0cikgewpAQCAtNjM5LDcgKzY0MCw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdwPEF1ZGlvUG9saWN5U2VydmljZT4mIHNlcnZpY2UpCiAgICAgOiBUaHJlYWQoZmFsc2UpLCBtTmFtZShuYW1lKSwgbVNlcnZpY2Uoc2VydmljZSkKIHsKLSAgICBtcFRvbmVHZW5lcmF0b3IgPSBOVUxMOwogfQogCiAKQEAgLTY0OSw3ICs2NDksNiBAQAogICAgICAgICByZWxlYXNlX3dha2VfbG9jayhtTmFtZS5zdHJpbmcoKSk7CiAgICAgfQogICAgIG1BdWRpb0NvbW1hbmRzLmNsZWFyKCk7Ci0gICAgZGVsZXRlIG1wVG9uZUdlbmVyYXRvcjsKIH0KIAogdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6b25GaXJzdFJlZigpCkBAIC02NzQsNjggKzY3Myw1NCBAQAogICAgICAgICAgICAgICAgIG1MYXN0Q29tbWFuZCA9IGNvbW1hbmQ7CiAKICAgICAgICAgICAgICAgICBzd2l0Y2ggKGNvbW1hbmQtPm1Db21tYW5kKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBTVEFSVF9UT05FOiB7Ci0gICAgICAgICAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOwotICAgICAgICAgICAgICAgICAgICBUb25lRGF0YSAqZGF0YSA9IChUb25lRGF0YSAqKWNvbW1hbmQtPm1QYXJhbS5nZXQoKTsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIHByb2Nlc3Npbmcgc3RhcnQgdG9uZSAlZCBvbiBzdHJlYW0gJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtPm1UeXBlLCBkYXRhLT5tU3RyZWFtKTsKLSAgICAgICAgICAgICAgICAgICAgZGVsZXRlIG1wVG9uZUdlbmVyYXRvcjsKLSAgICAgICAgICAgICAgICAgICAgbXBUb25lR2VuZXJhdG9yID0gbmV3IFRvbmVHZW5lcmF0b3IoZGF0YS0+bVN0cmVhbSwgMS4wKTsKLSAgICAgICAgICAgICAgICAgICAgbXBUb25lR2VuZXJhdG9yLT5zdGFydFRvbmUoZGF0YS0+bVR5cGUpOwotICAgICAgICAgICAgICAgICAgICBtTG9jay5sb2NrKCk7Ci0gICAgICAgICAgICAgICAgICAgIH1icmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFNUT1BfVE9ORTogewotICAgICAgICAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIHByb2Nlc3Npbmcgc3RvcCB0b25lIik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtcFRvbmVHZW5lcmF0b3IgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbXBUb25lR2VuZXJhdG9yLT5zdG9wVG9uZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIG1wVG9uZUdlbmVyYXRvcjsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1wVG9uZUdlbmVyYXRvciA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbUxvY2subG9jaygpOwotICAgICAgICAgICAgICAgICAgICB9YnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBTRVRfVk9MVU1FOiB7CiAgICAgICAgICAgICAgICAgICAgIFZvbHVtZURhdGEgKmRhdGEgPSAoVm9sdW1lRGF0YSAqKWNvbW1hbmQtPm1QYXJhbS5nZXQoKTsKICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIHByb2Nlc3Npbmcgc2V0IHZvbHVtZSBzdHJlYW0gJWQsIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWUgJWYsIG91dHB1dCAlZCIsIGRhdGEtPm1TdHJlYW0sIGRhdGEtPm1Wb2x1bWUsIGRhdGEtPm1JTyk7CisgICAgICAgICAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOwogICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT5tU3RhdHVzID0gQXVkaW9TeXN0ZW06OnNldFN0cmVhbVZvbHVtZShkYXRhLT5tU3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLT5tVm9sdW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLT5tSU8pOworICAgICAgICAgICAgICAgICAgICBtTG9jay5sb2NrKCk7CiAgICAgICAgICAgICAgICAgICAgIH1icmVhazsKICAgICAgICAgICAgICAgICBjYXNlIFNFVF9QQVJBTUVURVJTOiB7CiAgICAgICAgICAgICAgICAgICAgIFBhcmFtZXRlcnNEYXRhICpkYXRhID0gKFBhcmFtZXRlcnNEYXRhICopY29tbWFuZC0+bVBhcmFtLmdldCgpOwogICAgICAgICAgICAgICAgICAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgcHJvY2Vzc2luZyBzZXQgcGFyYW1ldGVycyBzdHJpbmcgJXMsIGlvICVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLT5tS2V5VmFsdWVQYWlycy5zdHJpbmcoKSwgZGF0YS0+bUlPKTsKKyAgICAgICAgICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7CiAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPm1TdGF0dXMgPSBBdWRpb1N5c3RlbTo6c2V0UGFyYW1ldGVycyhkYXRhLT5tSU8sIGRhdGEtPm1LZXlWYWx1ZVBhaXJzKTsKKyAgICAgICAgICAgICAgICAgICAgbUxvY2subG9jaygpOwogICAgICAgICAgICAgICAgICAgICB9YnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBTRVRfVk9JQ0VfVk9MVU1FOiB7CiAgICAgICAgICAgICAgICAgICAgIFZvaWNlVm9sdW1lRGF0YSAqZGF0YSA9IChWb2ljZVZvbHVtZURhdGEgKiljb21tYW5kLT5tUGFyYW0uZ2V0KCk7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBwcm9jZXNzaW5nIHNldCB2b2ljZSB2b2x1bWUgdm9sdW1lICVmIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLT5tVm9sdW1lKTsKKyAgICAgICAgICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7CiAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPm1TdGF0dXMgPSBBdWRpb1N5c3RlbTo6c2V0Vm9pY2VWb2x1bWUoZGF0YS0+bVZvbHVtZSk7CisgICAgICAgICAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKICAgICAgICAgICAgICAgICAgICAgfWJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgU1RPUF9PVVRQVVQ6IHsKICAgICAgICAgICAgICAgICAgICAgU3RvcE91dHB1dERhdGEgKmRhdGEgPSAoU3RvcE91dHB1dERhdGEgKiljb21tYW5kLT5tUGFyYW0uZ2V0KCk7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBwcm9jZXNzaW5nIHN0b3Agb3V0cHV0ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLT5tSU8pOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgcHJvY2Vzc2luZyBzdG9wIG91dHB1dCBwb3J0SWQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtPm1Qb3J0SWQpOwogICAgICAgICAgICAgICAgICAgICBzdmMgPSBtU2VydmljZS5wcm9tb3RlKCk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChzdmMgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7Ci0gICAgICAgICAgICAgICAgICAgIHN2Yy0+ZG9TdG9wT3V0cHV0KGRhdGEtPm1JTywgZGF0YS0+bVN0cmVhbSwgZGF0YS0+bVNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICBzdmMtPmRvU3RvcE91dHB1dChkYXRhLT5tUG9ydElkKTsKICAgICAgICAgICAgICAgICAgICAgbUxvY2subG9jaygpOwogICAgICAgICAgICAgICAgICAgICB9YnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBSRUxFQVNFX09VVFBVVDogewogICAgICAgICAgICAgICAgICAgICBSZWxlYXNlT3V0cHV0RGF0YSAqZGF0YSA9IChSZWxlYXNlT3V0cHV0RGF0YSAqKWNvbW1hbmQtPm1QYXJhbS5nZXQoKTsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIHByb2Nlc3NpbmcgcmVsZWFzZSBvdXRwdXQgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtPm1JTyk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBwcm9jZXNzaW5nIHJlbGVhc2Ugb3V0cHV0IHBvcnRJZCAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+bVBvcnRJZCk7CiAgICAgICAgICAgICAgICAgICAgIHN2YyA9IG1TZXJ2aWNlLnByb21vdGUoKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKHN2YyA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKLSAgICAgICAgICAgICAgICAgICAgc3ZjLT5kb1JlbGVhc2VPdXRwdXQoZGF0YS0+bUlPLCBkYXRhLT5tU3RyZWFtLCBkYXRhLT5tU2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgIHN2Yy0+ZG9SZWxlYXNlT3V0cHV0KGRhdGEtPm1Qb3J0SWQpOwogICAgICAgICAgICAgICAgICAgICBtTG9jay5sb2NrKCk7CiAgICAgICAgICAgICAgICAgICAgIH1icmVhazsKICAgICAgICAgICAgICAgICBjYXNlIENSRUFURV9BVURJT19QQVRDSDogewpAQCAtNzQ1LDcgKzczMCw5IEBACiAgICAgICAgICAgICAgICAgICAgIGlmIChhZiA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT5tU3RhdHVzID0gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPm1TdGF0dXMgPSBhZi0+Y3JlYXRlQXVkaW9QYXRjaCgmZGF0YS0+bVBhdGNoLCAmZGF0YS0+bUhhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtTG9jay5sb2NrKCk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfSBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIFJFTEVBU0VfQVVESU9fUEFUQ0g6IHsKQEAgLTc1NSw3ICs3NDIsOSBAQAogICAgICAgICAgICAgICAgICAgICBpZiAoYWYgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZC0+bVN0YXR1cyA9IFBFUk1JU1NJT05fREVOSUVEOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT5tU3RhdHVzID0gYWYtPnJlbGVhc2VBdWRpb1BhdGNoKGRhdGEtPm1IYW5kbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgbUxvY2subG9jaygpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBVUERBVEVfQVVESU9QT1JUX0xJU1Q6IHsKQEAgLTc4NSw3ICs3NzQsOSBAQAogICAgICAgICAgICAgICAgICAgICBpZiAoYWYgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZC0+bVN0YXR1cyA9IFBFUk1JU1NJT05fREVOSUVEOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT5tU3RhdHVzID0gYWYtPnNldEF1ZGlvUG9ydENvbmZpZygmZGF0YS0+bUNvbmZpZyk7CisgICAgICAgICAgICAgICAgICAgICAgICBtTG9jay5sb2NrKCk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfSBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIERZTl9QT0xJQ1lfTUlYX1NUQVRFX1VQREFURTogewpAQCAtOTAwLDI3ICs4OTEsNiBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6c3RhcnRUb25lQ29tbWFuZChUb25lR2VuZXJhdG9yOjp0b25lX3R5cGUgdHlwZSwKLSAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pCi17Ci0gICAgc3A8QXVkaW9Db21tYW5kPiBjb21tYW5kID0gbmV3IEF1ZGlvQ29tbWFuZCgpOwotICAgIGNvbW1hbmQtPm1Db21tYW5kID0gU1RBUlRfVE9ORTsKLSAgICBzcDxUb25lRGF0YT4gZGF0YSA9IG5ldyBUb25lRGF0YSgpOwotICAgIGRhdGEtPm1UeXBlID0gdHlwZTsKLSAgICBkYXRhLT5tU3RyZWFtID0gc3RyZWFtOwotICAgIGNvbW1hbmQtPm1QYXJhbSA9IGRhdGE7Ci0gICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIGFkZGluZyB0b25lIHN0YXJ0IHR5cGUgJWQsIHN0cmVhbSAlZCIsIHR5cGUsIHN0cmVhbSk7Ci0gICAgc2VuZENvbW1hbmQoY29tbWFuZCk7Ci19Ci0KLXZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQ6OnN0b3BUb25lQ29tbWFuZCgpCi17Ci0gICAgc3A8QXVkaW9Db21tYW5kPiBjb21tYW5kID0gbmV3IEF1ZGlvQ29tbWFuZCgpOwotICAgIGNvbW1hbmQtPm1Db21tYW5kID0gU1RPUF9UT05FOwotICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBhZGRpbmcgdG9uZSBzdG9wIik7Ci0gICAgc2VuZENvbW1hbmQoY29tbWFuZCk7Ci19Ci0KIHN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjp2b2x1bWVDb21tYW5kKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdm9sdW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LApAQCAtOTY3LDMzICs5MzcsMjUgQEAKICAgICByZXR1cm4gc2VuZENvbW1hbmQoY29tbWFuZCwgZGVsYXlNcyk7CiB9CiAKLXZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQ6OnN0b3BPdXRwdXRDb21tYW5kKGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjpzdG9wT3V0cHV0Q29tbWFuZChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKIHsKICAgICBzcDxBdWRpb0NvbW1hbmQ+IGNvbW1hbmQgPSBuZXcgQXVkaW9Db21tYW5kKCk7CiAgICAgY29tbWFuZC0+bUNvbW1hbmQgPSBTVE9QX09VVFBVVDsKICAgICBzcDxTdG9wT3V0cHV0RGF0YT4gZGF0YSA9IG5ldyBTdG9wT3V0cHV0RGF0YSgpOwotICAgIGRhdGEtPm1JTyA9IG91dHB1dDsKLSAgICBkYXRhLT5tU3RyZWFtID0gc3RyZWFtOwotICAgIGRhdGEtPm1TZXNzaW9uID0gc2Vzc2lvbjsKKyAgICBkYXRhLT5tUG9ydElkID0gcG9ydElkOwogICAgIGNvbW1hbmQtPm1QYXJhbSA9IGRhdGE7Ci0gICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIGFkZGluZyBzdG9wIG91dHB1dCAlZCIsIG91dHB1dCk7CisgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIGFkZGluZyBzdG9wIG91dHB1dCBwb3J0SWQgJWQiLCBwb3J0SWQpOwogICAgIHNlbmRDb21tYW5kKGNvbW1hbmQpOwogfQogCi12b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjpyZWxlYXNlT3V0cHV0Q29tbWFuZChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6cmVsZWFzZU91dHB1dENvbW1hbmQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiB7CiAgICAgc3A8QXVkaW9Db21tYW5kPiBjb21tYW5kID0gbmV3IEF1ZGlvQ29tbWFuZCgpOwogICAgIGNvbW1hbmQtPm1Db21tYW5kID0gUkVMRUFTRV9PVVRQVVQ7CiAgICAgc3A8UmVsZWFzZU91dHB1dERhdGE+IGRhdGEgPSBuZXcgUmVsZWFzZU91dHB1dERhdGEoKTsKLSAgICBkYXRhLT5tSU8gPSBvdXRwdXQ7Ci0gICAgZGF0YS0+bVN0cmVhbSA9IHN0cmVhbTsKLSAgICBkYXRhLT5tU2Vzc2lvbiA9IHNlc3Npb247CisgICAgZGF0YS0+bVBvcnRJZCA9IHBvcnRJZDsKICAgICBjb21tYW5kLT5tUGFyYW0gPSBkYXRhOwotICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBhZGRpbmcgcmVsZWFzZSBvdXRwdXQgJWQiLCBvdXRwdXQpOworICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBhZGRpbmcgcmVsZWFzZSBvdXRwdXQgcG9ydElkICVkIiwgcG9ydElkKTsKICAgICBzZW5kQ29tbWFuZChjb21tYW5kKTsKIH0KIApAQCAtMTIxMiw2ICsxMTc0LDcgQEAKICAgICAgICAgICAgICAgICBwYXRjaCA9ICgoQ3JlYXRlQXVkaW9QYXRjaERhdGEgKiljb21tYW5kLT5tUGFyYW0uZ2V0KCkpLT5tUGF0Y2g7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGhhbmRsZSA9ICgoUmVsZWFzZUF1ZGlvUGF0Y2hEYXRhICopY29tbWFuZC0+bVBhcmFtLmdldCgpKS0+bUhhbmRsZTsKKyAgICAgICAgICAgICAgICBtZW1zZXQoJnBhdGNoLCAwLCBzaXplb2YocGF0Y2gpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZTI7CiAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggcGF0Y2gyOwpAQCAtMTI1Niw4ICsxMjE5LDYgQEAKIAogICAgICAgICB9IGJyZWFrOwogCi0gICAgICAgIGNhc2UgU1RBUlRfVE9ORToKLSAgICAgICAgY2FzZSBTVE9QX1RPTkU6CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtMTMzMCwyNyArMTI5MSw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQsIGRlbGF5TXMpOwogfQogCi1pbnQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzdGFydFRvbmUoYXVkaW9fcG9saWN5X3RvbmVfdCB0b25lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQotewotICAgIGlmICh0b25lICE9IEFVRElPX1BPTElDWV9UT05FX0lOX0NBTExfTk9USUZJQ0FUSU9OKSB7Ci0gICAgICAgIEFMT0dFKCJzdGFydFRvbmU6IGlsbGVnYWwgdG9uZSByZXF1ZXN0ZWQgKCVkKSIsIHRvbmUpOwotICAgIH0KLSAgICBpZiAoc3RyZWFtICE9IEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMKSB7Ci0gICAgICAgIEFMT0dFKCJzdGFydFRvbmU6IGlsbGVnYWwgc3RyZWFtICglZCkgcmVxdWVzdGVkIGZvciB0b25lICVkIiwgc3RyZWFtLAotICAgICAgICAgICAgdG9uZSk7Ci0gICAgfQotICAgIG1Ub25lUGxheWJhY2tUaHJlYWQtPnN0YXJ0VG9uZUNvbW1hbmQoVG9uZUdlbmVyYXRvcjo6VE9ORV9TVVBfQ0FMTF9XQUlUSU5HLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwpOwotICAgIHJldHVybiAwOwotfQotCi1pbnQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzdG9wVG9uZSgpCi17Ci0gICAgbVRvbmVQbGF5YmFja1RocmVhZC0+c3RvcFRvbmVDb21tYW5kKCk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KIGludCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldFZvaWNlVm9sdW1lKGZsb2F0IHZvbHVtZSwgaW50IGRlbGF5TXMpCiB7CiAgICAgcmV0dXJuIChpbnQpbUF1ZGlvQ29tbWFuZFRocmVhZC0+dm9pY2VWb2x1bWVDb21tYW5kKHZvbHVtZSwgZGVsYXlNcyk7CkBAIC0xNDA2LDkgKzEzNDYsNiBAQAogaW50IGFwc19zZXRfc3RyZWFtX3ZvbHVtZSh2b2lkICpzZXJ2aWNlLCBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB2b2x1bWUsIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlfbXMpOwotaW50IGFwc19zdGFydF90b25lKHZvaWQgKnNlcnZpY2UsIGF1ZGlvX3BvbGljeV90b25lX3QgdG9uZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKTsKLWludCBhcHNfc3RvcF90b25lKHZvaWQgKnNlcnZpY2UpOwogaW50IGFwc19zZXRfdm9pY2Vfdm9sdW1lKHZvaWQgKnNlcnZpY2UsIGZsb2F0IHZvbHVtZSwgaW50IGRlbGF5X21zKTsKIH07CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lTZXJ2aWNlLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5U2VydmljZS5oCmluZGV4IDQwN2Q3YTUuLjZjNTU2NDcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lTZXJ2aWNlLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeVNlcnZpY2UuaApAQCAtMzgsOCArMzgsNiBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci0KIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogY2xhc3MgQXVkaW9Qb2xpY3lTZXJ2aWNlIDoKQEAgLTgzLDE1ICs4MSw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpzZWxlY3RlZERldmljZUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKLSAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcE91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCk7CisgICAgdmlydHVhbCB2b2lkIHJlbGVhc2VPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0SW5wdXRGb3JBdHRyKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaW5wdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCkBAIC0xMzQsNiArMTI2LDIxIEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBxdWVyeURlZmF1bHRQcmVQcm9jZXNzaW5nKGF1ZGlvX3Nlc3Npb25fdCBhdWRpb1Nlc3Npb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzY3JpcHRvcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmNvdW50KTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGFkZFNvdXJjZURlZmF1bHRFZmZlY3QoY29uc3QgZWZmZWN0X3V1aWRfdCAqdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnV1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fdW5pcXVlX2lkX3QqIGlkKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGFkZFN0cmVhbURlZmF1bHRFZmZlY3QoY29uc3QgZWZmZWN0X3V1aWRfdCAqdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnV1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3VzYWdlX3QgdXNhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3VuaXF1ZV9pZF90KiBpZCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVTb3VyY2VEZWZhdWx0RWZmZWN0KGF1ZGlvX3VuaXF1ZV9pZF90IGlkKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZVN0cmVhbURlZmF1bHRFZmZlY3QoYXVkaW9fdW5pcXVlX2lkX3QgaWQpOworCiAgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgb25UcmFuc2FjdCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGFyY2VsJiBkYXRhLApAQCAtMTU5LDggKzE2Niw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdm9sdW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcyA9IDApOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRUb25lKGF1ZGlvX3BvbGljeV90b25lX3QgdG9uZSwgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcFRvbmUoKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZvaWNlVm9sdW1lKGZsb2F0IHZvbHVtZSwgaW50IGRlbGF5TXMgPSAwKTsKICAgICB2aXJ0dWFsIGJvb2wgaXNPZmZsb2FkU3VwcG9ydGVkKGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICZjb25maWcpOwogCkBAIC0xOTQsOCArMTk5LDggQEAKIAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRBdWRpb1NvdXJjZShjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyaWJ1dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BBdWRpb1NvdXJjZShhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcEF1ZGlvU291cmNlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWFzdGVyTW9ubyhib29sIG1vbm8pOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWFzdGVyTW9ubyhib29sICptb25vKTsKQEAgLTIwOSwxMiArMjE0LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJlcG9ydGVkKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN1cnJvdW5kRm9ybWF0RW5hYmxlZChhdWRpb19mb3JtYXRfdCBhdWRpb0Zvcm1hdCwgYm9vbCBlbmFibGVkKTsKIAotICAgICAgICAgICAgc3RhdHVzX3QgZG9TdG9wT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7Ci0gICAgICAgICAgICB2b2lkIGRvUmVsZWFzZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKKyAgICAgICAgICAgIHN0YXR1c190IGRvU3RvcE91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCk7CisgICAgICAgICAgICB2b2lkIGRvUmVsZWFzZU91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCk7CiAKICAgICAgICAgICAgIHN0YXR1c190IGNsaWVudENyZWF0ZUF1ZGlvUGF0Y2goY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSwKQEAgLTIyNCw3ICsyMjUsNyBAQAogICAgICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBjbGllbnRTZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcyk7CiAKLSAgICAgICAgICAgIHZvaWQgcmVtb3ZlTm90aWZpY2F0aW9uQ2xpZW50KHVpZF90IHVpZCk7CisgICAgICAgICAgICB2b2lkIHJlbW92ZU5vdGlmaWNhdGlvbkNsaWVudCh1aWRfdCB1aWQsIHBpZF90IHBpZCk7CiAgICAgICAgICAgICB2b2lkIG9uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpOwogICAgICAgICAgICAgdm9pZCBkb09uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpOwogICAgICAgICAgICAgdm9pZCBvbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCk7CkBAIC0yNjUsNiArMjY2LDggQEAKIAogICAgIHN0ZDo6c3RyaW5nIGdldERldmljZVR5cGVTdHJGb3JQb3J0SWQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOwogCisgICAgc3RhdHVzX3QgZ2V0QXVkaW9Qb2xpY3lFZmZlY3RzKHNwPEF1ZGlvUG9saWN5RWZmZWN0cz4mIGF1ZGlvUG9saWN5RWZmZWN0cyk7CisKICAgICAvLyBJZiByZWNvcmRpbmcgd2UgbmVlZCB0byBtYWtlIHN1cmUgdGhlIFVJRCBpcyBhbGxvd2VkIHRvIGRvIHRoYXQuIElmIHRoZSBVSUQgaXMgaWRsZQogICAgIC8vIHRoZW4gaXQgY2Fubm90IHJlY29yZCBhbmQgZ2V0cyBidWZmZXJzIHdpdGggemVyb3MgLSBzaWxlbmNlLiBBcyBzb29uIGFzIHRoZSBVSUQKICAgICAvLyB0cmFuc2l0aW9ucyB0byBhbiBhY3RpdmUgc3RhdGUgd2Ugd2lsbCBzdGFydCByZXBvcnRpbmcgYnVmZmVycyB3aXRoIGRhdGEuIFRoaXMgYXBwcm9hY2gKQEAgLTI5Myw3ICsyOTYsNiBAQAogICAgICAgICB2b2lkIHJlbW92ZU92ZXJyaWRlVWlkKHVpZF90IHVpZCkgeyB1cGRhdGVPdmVycmlkZVVpZCh1aWQsIGZhbHNlLCBmYWxzZSk7IH0KIAogICAgIHByaXZhdGU6Ci0gICAgICAgIGJvb2wgaXNTZXJ2aWNlVWlkKHVpZF90IHVpZCkgY29uc3Q7CiAgICAgICAgIHZvaWQgbm90aWZ5U2VydmljZSh1aWRfdCB1aWQsIGJvb2wgYWN0aXZlKTsKICAgICAgICAgdm9pZCB1cGRhdGVPdmVycmlkZVVpZCh1aWRfdCB1aWQsIGJvb2wgYWN0aXZlLCBib29sIGluc2VydCk7CiAgICAgICAgIHZvaWQgdXBkYXRlVWlkQ2FjaGUodWlkX3QgdWlkLCBib29sIGFjdGl2ZSwgYm9vbCBpbnNlcnQpOwpAQCAtMzA3LDEwICszMDksNyBAQAogICAgICAgICBzdGQ6OnVub3JkZXJlZF9tYXA8dWlkX3QsIGJvb2w+IG1DYWNoZWRVaWRzOwogICAgIH07CiAKLSAgICAvLyBUaHJlYWQgdXNlZCBmb3IgdG9uZSBwbGF5YmFjayBhbmQgdG8gc2VuZCBhdWRpbyBjb25maWcgY29tbWFuZHMgdG8gYXVkaW8gZmxpbmdlcgotICAgIC8vIEZvciB0b25lIHBsYXliYWNrLCB1c2luZyBhIHNlcGFyYXRlIHRocmVhZCBpcyBuZWNlc3NhcnkgdG8gYXZvaWQgZGVhZGxvY2sgd2l0aCBtTG9jayBiZWNhdXNlCi0gICAgLy8gc3RhcnRUb25lKCkgYW5kIHN0b3BUb25lKCkgYXJlIG5vcm1hbGx5IGNhbGxlZCB3aXRoIG1Mb2NrIGxvY2tlZCBhbmQgcmVxdWVzdGluZyBhIHRvbmUgc3RhcnQKLSAgICAvLyBvciBzdG9wIHdpbGwgY2F1c2UgY2FsbHMgdG8gQXVkaW9Qb2xpY3lTZXJ2aWNlIGFuZCBhbiBhdHRlbXB0IHRvIGxvY2sgbUxvY2suCisgICAgLy8gVGhyZWFkIHVzZWQgdG8gc2VuZCBhdWRpbyBjb25maWcgY29tbWFuZHMgdG8gYXVkaW8gZmxpbmdlcgogICAgIC8vIEZvciBhdWRpbyBjb25maWcgY29tbWFuZHMsIGl0IGlzIG5lY2Vzc2FyeSBiZWNhdXNlIGF1ZGlvIGZsaW5nZXIgcmVxdWlyZXMgdGhhdCB0aGUgY2FsbGluZwogICAgIC8vIHByb2Nlc3MgKHVzZXIpIGhhcyBwZXJtaXNzaW9uIHRvIG1vZGlmeSBhdWRpbyBzZXR0aW5ncy4KICAgICBjbGFzcyBBdWRpb0NvbW1hbmRUaHJlYWQgOiBwdWJsaWMgVGhyZWFkIHsKQEAgLTMxOSw4ICszMTgsNiBAQAogCiAgICAgICAgIC8vIGNvbW1hbmRzIGZvciB0b25lIEF1ZGlvQ29tbWFuZAogICAgICAgICBlbnVtIHsKLSAgICAgICAgICAgIFNUQVJUX1RPTkUsCi0gICAgICAgICAgICBTVE9QX1RPTkUsCiAgICAgICAgICAgICBTRVRfVk9MVU1FLAogICAgICAgICAgICAgU0VUX1BBUkFNRVRFUlMsCiAgICAgICAgICAgICBTRVRfVk9JQ0VfVk9MVU1FLApAQCAtMzQ1LDIwICszNDIsMTMgQEAKICAgICAgICAgdmlydHVhbCAgICAgYm9vbCAgICAgICAgdGhyZWFkTG9vcCgpOwogCiAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGV4aXQoKTsKLSAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgc3RhcnRUb25lQ29tbWFuZChUb25lR2VuZXJhdG9yOjp0b25lX3R5cGUgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSk7Ci0gICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHN0b3BUb25lQ29tbWFuZCgpOwogICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICB2b2x1bWVDb21tYW5kKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBmbG9hdCB2b2x1bWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwgaW50IGRlbGF5TXMgPSAwKTsKICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgICAgcGFyYW1ldGVyc0NvbW1hbmQoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmtleVZhbHVlUGFpcnMsIGludCBkZWxheU1zID0gMCk7CiAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICAgIHZvaWNlVm9sdW1lQ29tbWFuZChmbG9hdCB2b2x1bWUsIGludCBkZWxheU1zID0gMCk7Ci0gICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHN0b3BPdXRwdXRDb21tYW5kKGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKLSAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgcmVsZWFzZU91dHB1dENvbW1hbmQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBzdG9wT3V0cHV0Q29tbWFuZChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCk7CisgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHJlbGVhc2VPdXRwdXRDb21tYW5kKGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgICAgc2VuZENvbW1hbmQoc3A8QXVkaW9Db21tYW5kPiYgY29tbWFuZCwgaW50IGRlbGF5TXMgPSAwKTsKICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgaW5zZXJ0Q29tbWFuZF9sKHNwPEF1ZGlvQ29tbWFuZD4mIGNvbW1hbmQsIGludCBkZWxheU1zID0gMCk7CiAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICAgIGNyZWF0ZUF1ZGlvUGF0Y2hDb21tYW5kKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCkBAIC0zOTAsNyArMzgwLDcgQEAKIAogICAgICAgICAgICAgdm9pZCBkdW1wKGNoYXIqIGJ1ZmZlciwgc2l6ZV90IHNpemUpOwogCi0gICAgICAgICAgICBpbnQgbUNvbW1hbmQ7ICAgLy8gU1RBUlRfVE9ORSwgU1RPUF9UT05FIC4uLgorICAgICAgICAgICAgaW50IG1Db21tYW5kOyAgIC8vIFNFVF9WT0xVTUUsIFNFVF9QQVJBTUVURVJTLi4uCiAgICAgICAgICAgICBuc2Vjc190IG1UaW1lOyAgLy8gdGltZSBzdGFtcAogICAgICAgICAgICAgTXV0ZXggbUxvY2s7ICAgIC8vIG11dGV4IGFzc29jaWF0ZWQgdG8gbUNvbmQKICAgICAgICAgICAgIENvbmRpdGlvbiBtQ29uZDsgLy8gY29uZGl0aW9uIGZvciBzdGF0dXMgcmV0dXJuCkBAIC00MDYsMTIgKzM5Niw2IEBACiAgICAgICAgICAgICBBdWRpb0NvbW1hbmREYXRhKCkge30KICAgICAgICAgfTsKIAotICAgICAgICBjbGFzcyBUb25lRGF0YSA6IHB1YmxpYyBBdWRpb0NvbW1hbmREYXRhIHsKLSAgICAgICAgcHVibGljOgotICAgICAgICAgICAgVG9uZUdlbmVyYXRvcjo6dG9uZV90eXBlIG1UeXBlOyAvLyB0b25lIHR5cGUgKFNUQVJUX1RPTkUgb25seSkKLSAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgbVN0cmVhbTsgICAgLy8gc3RyZWFtIHR5cGUgKFNUQVJUX1RPTkUgb25seSkKLSAgICAgICAgfTsKLQogICAgICAgICBjbGFzcyBWb2x1bWVEYXRhIDogcHVibGljIEF1ZGlvQ29tbWFuZERhdGEgewogICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IG1TdHJlYW07CkBAIC00MzIsMTYgKzQxNiwxMiBAQAogCiAgICAgICAgIGNsYXNzIFN0b3BPdXRwdXREYXRhIDogcHVibGljIEF1ZGlvQ29tbWFuZERhdGEgewogICAgICAgICBwdWJsaWM6Ci0gICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBtSU87Ci0gICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IG1TdHJlYW07Ci0gICAgICAgICAgICBhdWRpb19zZXNzaW9uX3QgbVNlc3Npb247CisgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IG1Qb3J0SWQ7CiAgICAgICAgIH07CiAKICAgICAgICAgY2xhc3MgUmVsZWFzZU91dHB1dERhdGEgOiBwdWJsaWMgQXVkaW9Db21tYW5kRGF0YSB7CiAgICAgICAgIHB1YmxpYzoKLSAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG1JTzsKLSAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgbVN0cmVhbTsKLSAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBtU2Vzc2lvbjsKKyAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgbVBvcnRJZDsKICAgICAgICAgfTsKIAogICAgICAgICBjbGFzcyBDcmVhdGVBdWRpb1BhdGNoRGF0YSA6IHB1YmxpYyBBdWRpb0NvbW1hbmREYXRhIHsKQEAgLTQ3OCw3ICs0NTgsNiBAQAogICAgICAgICBNdXRleCAgIG1Mb2NrOwogICAgICAgICBDb25kaXRpb24gbVdhaXRXb3JrQ1Y7CiAgICAgICAgIFZlY3RvciA8IHNwPEF1ZGlvQ29tbWFuZD4gPiBtQXVkaW9Db21tYW5kczsgLy8gbGlzdCBvZiBwZW5kaW5nIGNvbW1hbmRzCi0gICAgICAgIFRvbmVHZW5lcmF0b3IgKm1wVG9uZUdlbmVyYXRvcjsgICAgIC8vIHRoZSB0b25lIGdlbmVyYXRvcgogICAgICAgICBzcDxBdWRpb0NvbW1hbmQ+IG1MYXN0Q29tbWFuZDsgICAgICAvLyBsYXN0IHByb2Nlc3NlZCBjb21tYW5kICh1c2VkIGJ5IGR1bXApCiAgICAgICAgIFN0cmluZzggbU5hbWU7ICAgICAgICAgICAgICAgICAgICAgIC8vIHN0cmluZyB1c2VkIGJ5IHdha2UgbG9jayBmbyBkZWxheWVkIGNvbW1hbmRzCiAgICAgICAgIHdwPEF1ZGlvUG9saWN5U2VydmljZT4gbVNlcnZpY2U7CkBAIC01NTMsMTEgKzUzMiw2IEBACiAgICAgICAgIC8vIGZ1bmN0aW9uIGVuYWJsaW5nIHRvIHJlY2VpdmUgcHJvcHJpZXRhcnkgaW5mb3JtYXRpb25zIGRpcmVjdGx5IGZyb20gYXVkaW8gaGFyZHdhcmUgaW50ZXJmYWNlIHRvIGF1ZGlvIHBvbGljeSBtYW5hZ2VyLgogICAgICAgICB2aXJ0dWFsIFN0cmluZzggZ2V0UGFyYW1ldGVycyhhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwgY29uc3QgU3RyaW5nOCYga2V5cyk7CiAKLSAgICAgICAgLy8gcmVxdWVzdCB0aGUgcGxheWJhY2sgb2YgYSB0b25lIG9uIHRoZSBzcGVjaWZpZWQgc3RyZWFtOiB1c2VkIGZvciBpbnN0YW5jZSB0byByZXBsYWNlIG5vdGlmaWNhdGlvbiBzb3VuZHMgd2hlbiBwbGF5aW5nCi0gICAgICAgIC8vIG92ZXIgYSB0ZWxlcGhvbnkgZGV2aWNlIGR1cmluZyBhIHBob25lIGNhbGwuCi0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRUb25lKGF1ZGlvX3BvbGljeV90b25lX3QgdG9uZSwgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOwotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BUb25lKCk7Ci0KICAgICAgICAgLy8gc2V0IGRvd24gbGluayBhdWRpbyB2b2x1bWUuCiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Vm9pY2VWb2x1bWUoZmxvYXQgdm9sdW1lLCBpbnQgZGVsYXlNcyA9IDApOwogCkBAIC01OTcsNyArNTcxLDcgQEAKICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ2xpZW50KGNvbnN0IHNwPEF1ZGlvUG9saWN5U2VydmljZT4mIHNlcnZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50PiYgY2xpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwgcGlkX3QgcGlkKTsKICAgICAgICAgdmlydHVhbCAgICAgICAgICAgICB+Tm90aWZpY2F0aW9uQ2xpZW50KCk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgb25BdWRpb1BvcnRMaXN0VXBkYXRlKCk7CkBAIC02MTAsNiArNTg0LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICBzZXRBdWRpb1BvcnRDYWxsYmFja3NFbmFibGVkKGJvb2wgZW5hYmxlZCk7CiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtVWlkOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgIC8vIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50CiAgICAgICAgICAgICAgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgYmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvKTsKIApAQCAtNjE5LDM0ICs1OTcsNjEgQEAKIAogICAgICAgICBjb25zdCB3cDxBdWRpb1BvbGljeVNlcnZpY2U+ICAgICAgICBtU2VydmljZTsKICAgICAgICAgY29uc3QgdWlkX3QgICAgICAgICAgICAgICAgICAgICAgICAgbVVpZDsKKyAgICAgICAgY29uc3QgcGlkX3QgICAgICAgICAgICAgICAgICAgICAgICAgbVBpZDsKICAgICAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZUNsaWVudD4gbUF1ZGlvUG9saWN5U2VydmljZUNsaWVudDsKICAgICAgICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvUG9ydENhbGxiYWNrc0VuYWJsZWQ7CiAgICAgfTsKIAorICAgIGNsYXNzIEF1ZGlvQ2xpZW50IDogcHVibGljIHZpcnR1YWwgUmVmQmFzZSB7CisgICAgcHVibGljOgorICAgICAgICAgICAgICAgIEF1ZGlvQ2xpZW50KGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2lvX2hhbmRsZV90IGlvLCB1aWRfdCB1aWQsIHBpZF90IHBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwgY29uc3QgYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCkgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzKGF0dHJpYnV0ZXMpLCBpbyhpbyksIHVpZCh1aWQpLCBwaWQocGlkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbihzZXNzaW9uKSwgZGV2aWNlSWQoZGV2aWNlSWQpLCBhY3RpdmUoZmFsc2UpIHt9CisgICAgICAgICAgICAgICAgfkF1ZGlvQ2xpZW50KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisKKyAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXM7IC8vIHNvdXJjZSwgZmxhZ3MgLi4uCisgICAgICAgIGNvbnN0IGF1ZGlvX2lvX2hhbmRsZV90IGlvOyAgICAgICAgICAvLyBhdWRpbyBIQUwgc3RyZWFtIElPIGhhbmRsZQorICAgICAgICBjb25zdCB1aWRfdCB1aWQ7ICAgICAgICAgICAgICAgICAgICAgLy8gY2xpZW50IFVJRAorICAgICAgICBjb25zdCBwaWRfdCBwaWQ7ICAgICAgICAgICAgICAgICAgICAgLy8gY2xpZW50IFBJRAorICAgICAgICBjb25zdCBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbjsgICAgICAgLy8gYXVkaW8gc2Vzc2lvbiBJRAorICAgICAgICBjb25zdCBhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkOyAgLy8gc2VsZWN0ZWQgaW5wdXQgZGV2aWNlIHBvcnQgSUQKKyAgICAgICAgICAgICAgYm9vbCBhY3RpdmU7ICAgICAgICAgICAgICAgICAgIC8vIFBsYXliYWNrL0NhcHR1cmUgaXMgYWN0aXZlIG9yIGluYWN0aXZlCisgICAgfTsKKwogICAgIC8vIC0tLSBBdWRpb1JlY29yZENsaWVudCAtLS0KICAgICAvLyBJbmZvcm1hdGlvbiBhYm91dCBlYWNoIHJlZ2lzdGVyZWQgQXVkaW9SZWNvcmQgY2xpZW50CiAgICAgLy8gKGJldHdlZW4gY2FsbHMgdG8gZ2V0SW5wdXRGb3JBdHRyKCkgYW5kIHJlbGVhc2VJbnB1dCgpKQotICAgIGNsYXNzIEF1ZGlvUmVjb3JkQ2xpZW50IDogcHVibGljIFJlZkJhc2UgeworICAgIGNsYXNzIEF1ZGlvUmVjb3JkQ2xpZW50IDogcHVibGljIEF1ZGlvQ2xpZW50IHsKICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgQXVkaW9SZWNvcmRDbGllbnQoY29uc3QgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsIHVpZF90IHVpZCwgcGlkX3QgcGlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLCBjb25zdCBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzKGF0dHJpYnV0ZXMpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dChpbnB1dCksIHVpZCh1aWQpLCBwaWQocGlkKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BQYWNrYWdlTmFtZShvcFBhY2thZ2VOYW1lKSwgc2Vzc2lvbihzZXNzaW9uKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlKGZhbHNlKSwgaXNDb25jdXJyZW50KGZhbHNlKSwgaXNWaXJ0dWFsRGV2aWNlKGZhbHNlKSB7fQotICAgICAgICB2aXJ0dWFsIH5BdWRpb1JlY29yZENsaWVudCgpIHt9CisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2lvX2hhbmRsZV90IGlvLCB1aWRfdCB1aWQsIHBpZF90IHBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sIGNvbnN0IGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lKSA6CisgICAgICAgICAgICAgICAgICAgIEF1ZGlvQ2xpZW50KGF0dHJpYnV0ZXMsIGlvLCB1aWQsIHBpZCwgc2Vzc2lvbiwgZGV2aWNlSWQpLAorICAgICAgICAgICAgICAgICAgICBvcFBhY2thZ2VOYW1lKG9wUGFja2FnZU5hbWUpLCBpc0NvbmN1cnJlbnQoZmFsc2UpLCBpc1ZpcnR1YWxEZXZpY2UoZmFsc2UpIHt9CisgICAgICAgICAgICAgICAgfkF1ZGlvUmVjb3JkQ2xpZW50KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OwogCi0gICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyaWJ1dGVzOyAvLyBzb3VyY2UsIGZsYWdzIC4uLgotICAgICAgICBjb25zdCBhdWRpb19pb19oYW5kbGVfdCBpbnB1dDsgICAgICAgLy8gYXVkaW8gSEFMIGlucHV0IElPIGhhbmRsZQotICAgICAgICBjb25zdCB1aWRfdCB1aWQ7ICAgICAgICAgICAgICAgICAgICAgLy8gY2xpZW50IFVJRAotICAgICAgICBjb25zdCBwaWRfdCBwaWQ7ICAgICAgICAgICAgICAgICAgICAgLy8gY2xpZW50IFBJRAogICAgICAgICBjb25zdCBTdHJpbmcxNiBvcFBhY2thZ2VOYW1lOyAgICAgICAgLy8gY2xpZW50IHBhY2thZ2UgbmFtZQotICAgICAgICBjb25zdCBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbjsgICAgICAgLy8gYXVkaW8gc2Vzc2lvbiBJRAotICAgICAgICBib29sIGFjdGl2ZTsgICAgICAgICAgICAgICAgICAgLy8gQ2FwdHVyZSBpcyBhY3RpdmUgb3IgaW5hY3RpdmUKICAgICAgICAgYm9vbCBpc0NvbmN1cnJlbnQ7ICAgICAgICAgICAgIC8vIGlzIGFsbG93ZWQgdG8gY29uY3VycmVudCBjYXB0dXJlCiAgICAgICAgIGJvb2wgaXNWaXJ0dWFsRGV2aWNlOyAgICAgICAgICAvLyB1c2VzIHZpcnR1YWwgZGV2aWNlOiB1cGRhdGVkIGJ5IEFQTTo6Z2V0SW5wdXRGb3JBdHRyKCkKLSAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZDsgIC8vIHNlbGVjdGVkIGlucHV0IGRldmljZSBwb3J0IElECisgICAgfTsKKworICAgIC8vIC0tLSBBdWRpb1BsYXliYWNrQ2xpZW50IC0tLQorICAgIC8vIEluZm9ybWF0aW9uIGFib3V0IGVhY2ggcmVnaXN0ZXJlZCBBdWRpb1RyYWNrIGNsaWVudAorICAgIC8vIChiZXR3ZWVuIGNhbGxzIHRvIGdldE91dHB1dEZvckF0dHIoKSBhbmQgcmVsZWFzZU91dHB1dCgpKQorICAgIGNsYXNzIEF1ZGlvUGxheWJhY2tDbGllbnQgOiBwdWJsaWMgQXVkaW9DbGllbnQgeworICAgIHB1YmxpYzoKKyAgICAgICAgICAgICAgICBBdWRpb1BsYXliYWNrQ2xpZW50KGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2lvX2hhbmRsZV90IGlvLCB1aWRfdCB1aWQsIHBpZF90IHBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwgYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgOgorICAgICAgICAgICAgICAgICAgICBBdWRpb0NsaWVudChhdHRyaWJ1dGVzLCBpbywgdWlkLCBwaWQsIHNlc3Npb24sIGRldmljZUlkKSwgc3RyZWFtKHN0cmVhbSkge30KKyAgICAgICAgICAgICAgICB+QXVkaW9QbGF5YmFja0NsaWVudCgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgICAgICBjb25zdCBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbTsKICAgICB9OwogCiAgICAgLy8gQSBjbGFzcyBhdXRvbWF0aWNhbGx5IGNsZWFyaW5nIGFuZCByZXN0b3JpbmcgYmluZGVyIGNhbGxlciBpZGVudGl0eSBpbnNpZGUKQEAgLTY3NiwxNCArNjgxLDEzIEBACiAgICAgLy8gbUxvY2sgcHJvdGVjdHMgQXVkaW9Qb2xpY3lNYW5hZ2VyIG1ldGhvZHMgdGhhdCBjYW4gY2FsbCBpbnRvIGF1ZGlvIGZsaW5nZXIKICAgICAvLyBhbmQgcG9zc2libHkgYmFjayBpbiB0byBhdWRpbyBwb2xpY3kgc2VydmljZSBhbmQgYWNxdWlyZSBtRWZmZWN0c0xvY2suCiAgICAgc3A8QXVkaW9Db21tYW5kVGhyZWFkPiBtQXVkaW9Db21tYW5kVGhyZWFkOyAgICAgLy8gYXVkaW8gY29tbWFuZHMgdGhyZWFkCi0gICAgc3A8QXVkaW9Db21tYW5kVGhyZWFkPiBtVG9uZVBsYXliYWNrVGhyZWFkOyAgICAgLy8gdG9uZSBwbGF5YmFjayB0aHJlYWQKICAgICBzcDxBdWRpb0NvbW1hbmRUaHJlYWQ+IG1PdXRwdXRDb21tYW5kVGhyZWFkOyAgICAvLyBwcm9jZXNzIHN0b3AgYW5kIHJlbGVhc2Ugb3V0cHV0CiAgICAgc3RydWN0IGF1ZGlvX3BvbGljeV9kZXZpY2UgKm1wQXVkaW9Qb2xpY3lEZXY7CiAgICAgc3RydWN0IGF1ZGlvX3BvbGljeSAqbXBBdWRpb1BvbGljeTsKICAgICBBdWRpb1BvbGljeUludGVyZmFjZSAqbUF1ZGlvUG9saWN5TWFuYWdlcjsKICAgICBBdWRpb1BvbGljeUNsaWVudCAqbUF1ZGlvUG9saWN5Q2xpZW50OwogCi0gICAgRGVmYXVsdEtleWVkVmVjdG9yPCB1aWRfdCwgc3A8Tm90aWZpY2F0aW9uQ2xpZW50PiA+ICAgIG1Ob3RpZmljYXRpb25DbGllbnRzOworICAgIERlZmF1bHRLZXllZFZlY3RvcjwgaW50NjRfdCwgc3A8Tm90aWZpY2F0aW9uQ2xpZW50PiA+ICAgIG1Ob3RpZmljYXRpb25DbGllbnRzOwogICAgIE11dGV4IG1Ob3RpZmljYXRpb25DbGllbnRzTG9jazsgIC8vIHByb3RlY3RzIG1Ob3RpZmljYXRpb25DbGllbnRzCiAgICAgLy8gTWFuYWdlIGFsbCBlZmZlY3RzIGNvbmZpZ3VyZWQgaW4gYXVkaW9fZWZmZWN0cy5jb25mCiAgICAgc3A8QXVkaW9Qb2xpY3lFZmZlY3RzPiBtQXVkaW9Qb2xpY3lFZmZlY3RzOwpAQCAtNjkxLDYgKzY5NSw3IEBACiAKICAgICBzcDxVaWRQb2xpY3k+IG1VaWRQb2xpY3k7CiAgICAgRGVmYXVsdEtleWVkVmVjdG9yPCBhdWRpb19wb3J0X2hhbmRsZV90LCBzcDxBdWRpb1JlY29yZENsaWVudD4gPiAgIG1BdWRpb1JlY29yZENsaWVudHM7CisgICAgRGVmYXVsdEtleWVkVmVjdG9yPCBhdWRpb19wb3J0X2hhbmRsZV90LCBzcDxBdWRpb1BsYXliYWNrQ2xpZW50PiA+ICAgbUF1ZGlvUGxheWJhY2tDbGllbnRzOwogfTsKIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvQW5kcm9pZC5tayBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL0FuZHJvaWQubWsKaW5kZXggYTQzZGFlYS4uNTEzMzEyZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvQW5kcm9pZC5taworKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9BbmRyb2lkLm1rCkBAIC02LDcgKzYsNyBAQAogICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5IFwKICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZSBcCiAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2ludGVyZmFjZSBcCi0gIGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvdXRpbGl0aWVzCisgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby11dGlscykgXAogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKICAgbGliYXVkaW9wb2xpY3ltYW5hZ2VyZGVmYXVsdCBcCkBAIC0zMCwzICszMCwyNiBAQAogTE9DQUxfTVVMVElMSUIgOj0gJChBVURJT1NFUlZFUl9NVUxUSUxJQikKIAogaW5jbHVkZSAkKEJVSUxEX05BVElWRV9URVNUKQorCisjIHN5c3RlbS9hdWRpby5oIHV0aWxpdGllcyB0ZXN0CisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKyAgbGliYmFzZSBcCisgIGxpYmxvZyBcCisgIGxpYm1lZGlhX2hlbHBlciBcCisgIGxpYnV0aWxzCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisgIHN5c3RlbWF1ZGlvX3Rlc3RzLmNwcCBcCisKK0xPQ0FMX01PRFVMRSA6PSBzeXN0ZW1hdWRpb190ZXN0cworCitMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cworCitMT0NBTF9DRkxBR1MgOj0gLVdlcnJvciAtV2FsbAorCitMT0NBTF9NVUxUSUxJQiA6PSAkKEFVRElPU0VSVkVSX01VTFRJTElCKQorCitpbmNsdWRlICQoQlVJTERfTkFUSVZFX1RFU1QpCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9BdWRpb1BvbGljeVRlc3RDbGllbnQuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL0F1ZGlvUG9saWN5VGVzdENsaWVudC5oCmluZGV4IGViODIyMmMuLjJmZjc2NzUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL0F1ZGlvUG9saWN5VGVzdENsaWVudC5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL0F1ZGlvUG9saWN5VGVzdENsaWVudC5oCkBAIC02MCw5ICs2MCw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKmRlbGF5TXMqLykgb3ZlcnJpZGUgeyB9CiAgICAgU3RyaW5nOCBnZXRQYXJhbWV0ZXJzKGF1ZGlvX2lvX2hhbmRsZV90IC8qaW9IYW5kbGUqLywKICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgLyprZXlzKi8pIG92ZXJyaWRlIHsgcmV0dXJuIFN0cmluZzgoKTsgfQotICAgIHN0YXR1c190IHN0YXJ0VG9uZShhdWRpb19wb2xpY3lfdG9uZV90IC8qdG9uZSovLAotICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IC8qc3RyZWFtKi8pIG92ZXJyaWRlIHsgcmV0dXJuIE5PX0lOSVQ7IH0KLSAgICBzdGF0dXNfdCBzdG9wVG9uZSgpIG92ZXJyaWRlIHsgcmV0dXJuIE5PX0lOSVQ7IH0KICAgICBzdGF0dXNfdCBzZXRWb2ljZVZvbHVtZShmbG9hdCAvKnZvbHVtZSovLCBpbnQgLypkZWxheU1zKi8pIG92ZXJyaWRlIHsgcmV0dXJuIE5PX0lOSVQ7IH0KICAgICBzdGF0dXNfdCBtb3ZlRWZmZWN0cyhhdWRpb19zZXNzaW9uX3QgLypzZXNzaW9uKi8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgLypzcmNPdXRwdXQqLywKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL2F1ZGlvcG9saWN5bWFuYWdlcl90ZXN0cy5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9hdWRpb3BvbGljeW1hbmFnZXJfdGVzdHMuY3BwCmluZGV4IGE5NTkzYjguLjU2YWYxNTIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL2F1ZGlvcG9saWN5bWFuYWdlcl90ZXN0cy5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvYXVkaW9wb2xpY3ltYW5hZ2VyX3Rlc3RzLmNwcApAQCAtMTYsOSArMTYsMTUgQEAKIAogI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KIAogI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CiAKKyNkZWZpbmUgTE9HX1RBRyAiQVBNX1Rlc3QiCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorI2luY2x1ZGUgPG1lZGlhL1BhdGNoQnVpbGRlci5oPgorCiAjaW5jbHVkZSAiQXVkaW9Qb2xpY3lUZXN0Q2xpZW50LmgiCiAjaW5jbHVkZSAiQXVkaW9Qb2xpY3lUZXN0TWFuYWdlci5oIgogCkBAIC0xMzIsNiArMTM4LDM2IEBACiAgICAgLy8gU2V0VXAgbXVzdCBmaW5pc2ggd2l0aCBubyBhc3NlcnRpb25zLgogfQogCitURVNUX0YoQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdCwgRHVtcCkgeworICAgIGludCBwaXBlZmRbMl07CisgICAgQVNTRVJUX05FKC0xLCBwaXBlKHBpcGVmZCkpOworICAgIHBpZF90IGNwaWQgPSBmb3JrKCk7CisgICAgQVNTRVJUX05FKC0xLCBjcGlkKTsKKyAgICBpZiAoY3BpZCA9PSAwKSB7CisgICAgICAgIC8vIENoaWxkIHByb2Nlc3MgcmVhZHMgZnJvbSB0aGUgcGlwZSBhbmQgbG9ncy4KKyAgICAgICAgY2xvc2UocGlwZWZkWzFdKTsKKyAgICAgICAgc3RkOjpzdHJpbmcgbGluZTsKKyAgICAgICAgY2hhciBidWY7CisgICAgICAgIHdoaWxlIChyZWFkKHBpcGVmZFswXSwgJmJ1Ziwgc2l6ZW9mKGJ1ZikpID4gMCkgeworICAgICAgICAgICAgaWYgKGJ1ZiAhPSAnXG4nKSB7CisgICAgICAgICAgICAgICAgbGluZSArPSBidWY7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dJKCIlcyIsIGxpbmUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgbGluZSA9ICIiOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghbGluZS5lbXB0eSgpKSBBTE9HSSgiJXMiLCBsaW5lLmNfc3RyKCkpOworICAgICAgICBjbG9zZShwaXBlZmRbMF0pOworICAgICAgICBfZXhpdChFWElUX1NVQ0NFU1MpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFBhcmVudCBkb2VzIHRoZSBkdW1wIGFuZCBjaGVja3MgdGhlIHN0YXR1cyBjb2RlLgorICAgICAgICBjbG9zZShwaXBlZmRbMF0pOworICAgICAgICBBU1NFUlRfRVEoTk9fRVJST1IsIG1NYW5hZ2VyLT5kdW1wKHBpcGVmZFsxXSkpOworICAgICAgICBjbG9zZShwaXBlZmRbMV0pOworICAgICAgICB3YWl0KE5VTEwpOyAgLy8gV2FpdCBmb3IgdGhlIGNoaWxkIHRvIGV4aXQuCisgICAgfQorfQorCiBURVNUX0YoQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdCwgQ3JlYXRlQXVkaW9QYXRjaEZhaWx1cmUpIHsKICAgICBhdWRpb19wYXRjaCBwYXRjaHt9OwogICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOwpAQCAtMTY2LDI5ICsyMDIsMTQgQEAKIH0KIAogVEVTVF9GKEF1ZGlvUG9saWN5TWFuYWdlclRlc3QsIENyZWF0ZUF1ZGlvUGF0Y2hGcm9tTWl4KSB7Ci0gICAgYXVkaW9fcGF0Y2ggcGF0Y2h7fTsKICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKICAgICB1aWRfdCB1aWQgPSA0MjsKICAgICBjb25zdCBzaXplX3QgcGF0Y2hDb3VudEJlZm9yZSA9IG1DbGllbnQtPmdldEFjdGl2ZVBhdGNoZXNDb3VudCgpOwotICAgIHBhdGNoLm51bV9zb3VyY2VzID0gMTsKLSAgICB7Ci0gICAgICAgIGF1dG8mIHNyYyA9IHBhdGNoLnNvdXJjZXNbMF07Ci0gICAgICAgIHNyYy5yb2xlID0gQVVESU9fUE9SVF9ST0xFX1NPVVJDRTsKLSAgICAgICAgc3JjLnR5cGUgPSBBVURJT19QT1JUX1RZUEVfTUlYOwotICAgICAgICBzcmMuaWQgPSBtTWFuYWdlci0+Z2V0Q29uZmlnKCkuZ2V0QXZhaWxhYmxlSW5wdXREZXZpY2VzKClbMF0tPmdldElkKCk7Ci0gICAgICAgIC8vIE5vdGU6IHRoZXNlIGFyZSB0aGUgcGFyYW1ldGVycyBvZiB0aGUgb3V0cHV0IGRldmljZS4KLSAgICAgICAgc3JjLnNhbXBsZV9yYXRlID0gNDQxMDA7Ci0gICAgICAgIHNyYy5mb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKLSAgICAgICAgc3JjLmNoYW5uZWxfbWFzayA9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKLSAgICB9Ci0gICAgcGF0Y2gubnVtX3NpbmtzID0gMTsKLSAgICB7Ci0gICAgICAgIGF1dG8mIHNpbmsgPSBwYXRjaC5zaW5rc1swXTsKLSAgICAgICAgc2luay5yb2xlID0gQVVESU9fUE9SVF9ST0xFX1NJTks7Ci0gICAgICAgIHNpbmsudHlwZSA9IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0U7Ci0gICAgICAgIHNpbmsuaWQgPSBtTWFuYWdlci0+Z2V0Q29uZmlnKCkuZ2V0RGVmYXVsdE91dHB1dERldmljZSgpLT5nZXRJZCgpOwotICAgIH0KLSAgICBBU1NFUlRfRVEoTk9fRVJST1IsIG1NYW5hZ2VyLT5jcmVhdGVBdWRpb1BhdGNoKCZwYXRjaCwgJmhhbmRsZSwgdWlkKSk7CisgICAgQVNTRVJUX0ZBTFNFKG1NYW5hZ2VyLT5nZXRDb25maWcoKS5nZXRBdmFpbGFibGVJbnB1dERldmljZXMoKS5pc0VtcHR5KCkpOworICAgIFBhdGNoQnVpbGRlciBwYXRjaEJ1aWxkZXI7CisgICAgcGF0Y2hCdWlsZGVyLmFkZFNvdXJjZShtTWFuYWdlci0+Z2V0Q29uZmlnKCkuZ2V0QXZhaWxhYmxlSW5wdXREZXZpY2VzKClbMF0pLgorICAgICAgICAgICAgYWRkU2luayhtTWFuYWdlci0+Z2V0Q29uZmlnKCkuZ2V0RGVmYXVsdE91dHB1dERldmljZSgpKTsKKyAgICBBU1NFUlRfRVEoTk9fRVJST1IsIG1NYW5hZ2VyLT5jcmVhdGVBdWRpb1BhdGNoKHBhdGNoQnVpbGRlci5wYXRjaCgpLCAmaGFuZGxlLCB1aWQpKTsKICAgICBBU1NFUlRfTkUoQVVESU9fUEFUQ0hfSEFORExFX05PTkUsIGhhbmRsZSk7CiAgICAgQVNTRVJUX0VRKHBhdGNoQ291bnRCZWZvcmUgKyAxLCBtQ2xpZW50LT5nZXRBY3RpdmVQYXRjaGVzQ291bnQoKSk7CiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9zeXN0ZW1hdWRpb190ZXN0cy5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9zeXN0ZW1hdWRpb190ZXN0cy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJhYWU1MgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL3N5c3RlbWF1ZGlvX3Rlc3RzLmNwcApAQCAtMCwwICsxLDExNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjZGVmaW5lIExPR19UQUcgIlN5c0F1ZGlvX1Rlc3QiCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorI2luY2x1ZGUgPG1lZGlhL1BhdGNoQnVpbGRlci5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworVEVTVChTeXN0ZW1BdWRpb1Rlc3QsIFBhdGNoSW52YWxpZCkgeworICAgIGF1ZGlvX3BhdGNoIHBhdGNoe307CisgICAgQVNTRVJUX0ZBTFNFKGF1ZGlvX3BhdGNoX2lzX3ZhbGlkKCZwYXRjaCkpOworICAgIHBhdGNoLm51bV9zb3VyY2VzID0gQVVESU9fUEFUQ0hfUE9SVFNfTUFYICsgMTsKKyAgICBwYXRjaC5udW1fc2lua3MgPSAxOworICAgIEFTU0VSVF9GQUxTRShhdWRpb19wYXRjaF9pc192YWxpZCgmcGF0Y2gpKTsKKyAgICBwYXRjaC5udW1fc291cmNlcyA9IDE7CisgICAgcGF0Y2gubnVtX3NpbmtzID0gQVVESU9fUEFUQ0hfUE9SVFNfTUFYICsgMTsKKyAgICBBU1NFUlRfRkFMU0UoYXVkaW9fcGF0Y2hfaXNfdmFsaWQoJnBhdGNoKSk7CisgICAgcGF0Y2gubnVtX3NvdXJjZXMgPSAwOworICAgIHBhdGNoLm51bV9zaW5rcyA9IDE7CisgICAgQVNTRVJUX0ZBTFNFKGF1ZGlvX3BhdGNoX2lzX3ZhbGlkKCZwYXRjaCkpOworfQorCitURVNUKFN5c3RlbUF1ZGlvVGVzdCwgUGF0Y2hWYWxpZCkgeworICAgIGNvbnN0IGF1ZGlvX3BvcnRfY29uZmlnIHNyYyA9IHsKKyAgICAgICAgLmlkID0gMSwgLnJvbGUgPSBBVURJT19QT1JUX1JPTEVfU09VUkNFLCAudHlwZSA9IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UgfTsKKyAgICAvLyBJdCdzIE9LIG5vdCB0byBoYXZlIHNpbmtzLgorICAgIEFTU0VSVF9UUlVFKGF1ZGlvX3BhdGNoX2lzX3ZhbGlkKChQYXRjaEJ1aWxkZXJ7fSkuYWRkU291cmNlKHNyYykucGF0Y2goKSkpOworICAgIGNvbnN0IGF1ZGlvX3BvcnRfY29uZmlnIHNpbmsgPSB7CisgICAgICAgIC5pZCA9IDIsIC5yb2xlID0gQVVESU9fUE9SVF9ST0xFX1NJTkssIC50eXBlID0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSB9OworICAgIEFTU0VSVF9UUlVFKGF1ZGlvX3BhdGNoX2lzX3ZhbGlkKChQYXRjaEJ1aWxkZXJ7fSkuYWRkU291cmNlKHNyYykuYWRkU2luayhzaW5rKS5wYXRjaCgpKSk7CisgICAgQVNTRVJUX1RSVUUoYXVkaW9fcGF0Y2hfaXNfdmFsaWQoCisgICAgICAgICAgICAgICAgICAgIChQYXRjaEJ1aWxkZXJ7fSkuYWRkU291cmNlKHNyYykuYWRkU291cmNlKHNyYykuYWRkU2luayhzaW5rKS5wYXRjaCgpKSk7CisgICAgQVNTRVJUX1RSVUUoYXVkaW9fcGF0Y2hfaXNfdmFsaWQoCisgICAgICAgICAgICAgICAgICAgIChQYXRjaEJ1aWxkZXJ7fSkuYWRkU291cmNlKHNyYykuYWRkU2luayhzaW5rKS5hZGRTaW5rKHNpbmspLnBhdGNoKCkpKTsKKyAgICBBU1NFUlRfVFJVRShhdWRpb19wYXRjaF9pc192YWxpZCgKKyAgICAgICAgICAgICAgICAgICAgKFBhdGNoQnVpbGRlcnt9KS5hZGRTb3VyY2Uoc3JjKS5hZGRTb3VyY2Uoc3JjKS4KKyAgICAgICAgICAgICAgICAgICAgYWRkU2luayhzaW5rKS5hZGRTaW5rKHNpbmspLnBhdGNoKCkpKTsKK30KKworVEVTVChTeXN0ZW1BdWRpb1Rlc3QsIFBhdGNoSHdBdlN5bmMpIHsKKyAgICBhdWRpb19wb3J0X2NvbmZpZyBkZXZpY2Vfc3JjX2NmZyA9IHsKKyAgICAgICAgLmlkID0gMSwgLnJvbGUgPSBBVURJT19QT1JUX1JPTEVfU09VUkNFLCAudHlwZSA9IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UgfTsKKyAgICBBU1NFUlRfRkFMU0UoYXVkaW9fcG9ydF9jb25maWdfaGFzX2h3X2F2X3N5bmMoJmRldmljZV9zcmNfY2ZnKSk7CisgICAgZGV2aWNlX3NyY19jZmcuY29uZmlnX21hc2sgfD0gQVVESU9fUE9SVF9DT05GSUdfRkxBR1M7CisgICAgQVNTRVJUX0ZBTFNFKGF1ZGlvX3BvcnRfY29uZmlnX2hhc19od19hdl9zeW5jKCZkZXZpY2Vfc3JjX2NmZykpOworICAgIGRldmljZV9zcmNfY2ZnLmZsYWdzLmlucHV0ID0gQVVESU9fSU5QVVRfRkxBR19IV19BVl9TWU5DOworICAgIEFTU0VSVF9UUlVFKGF1ZGlvX3BvcnRfY29uZmlnX2hhc19od19hdl9zeW5jKCZkZXZpY2Vfc3JjX2NmZykpOworCisgICAgYXVkaW9fcG9ydF9jb25maWcgZGV2aWNlX3NpbmtfY2ZnID0geworICAgICAgICAuaWQgPSAxLCAucm9sZSA9IEFVRElPX1BPUlRfUk9MRV9TSU5LLCAudHlwZSA9IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UgfTsKKyAgICBBU1NFUlRfRkFMU0UoYXVkaW9fcG9ydF9jb25maWdfaGFzX2h3X2F2X3N5bmMoJmRldmljZV9zaW5rX2NmZykpOworICAgIGRldmljZV9zaW5rX2NmZy5jb25maWdfbWFzayB8PSBBVURJT19QT1JUX0NPTkZJR19GTEFHUzsKKyAgICBBU1NFUlRfRkFMU0UoYXVkaW9fcG9ydF9jb25maWdfaGFzX2h3X2F2X3N5bmMoJmRldmljZV9zaW5rX2NmZykpOworICAgIGRldmljZV9zaW5rX2NmZy5mbGFncy5vdXRwdXQgPSBBVURJT19PVVRQVVRfRkxBR19IV19BVl9TWU5DOworICAgIEFTU0VSVF9UUlVFKGF1ZGlvX3BvcnRfY29uZmlnX2hhc19od19hdl9zeW5jKCZkZXZpY2Vfc2lua19jZmcpKTsKKworICAgIGF1ZGlvX3BvcnRfY29uZmlnIG1peF9zaW5rX2NmZyA9IHsKKyAgICAgICAgLmlkID0gMSwgLnJvbGUgPSBBVURJT19QT1JUX1JPTEVfU0lOSywgLnR5cGUgPSBBVURJT19QT1JUX1RZUEVfTUlYIH07CisgICAgQVNTRVJUX0ZBTFNFKGF1ZGlvX3BvcnRfY29uZmlnX2hhc19od19hdl9zeW5jKCZtaXhfc2lua19jZmcpKTsKKyAgICBtaXhfc2lua19jZmcuY29uZmlnX21hc2sgfD0gQVVESU9fUE9SVF9DT05GSUdfRkxBR1M7CisgICAgQVNTRVJUX0ZBTFNFKGF1ZGlvX3BvcnRfY29uZmlnX2hhc19od19hdl9zeW5jKCZtaXhfc2lua19jZmcpKTsKKyAgICBtaXhfc2lua19jZmcuZmxhZ3MuaW5wdXQgPSBBVURJT19JTlBVVF9GTEFHX0hXX0FWX1NZTkM7CisgICAgQVNTRVJUX1RSVUUoYXVkaW9fcG9ydF9jb25maWdfaGFzX2h3X2F2X3N5bmMoJm1peF9zaW5rX2NmZykpOworCisgICAgYXVkaW9fcG9ydF9jb25maWcgbWl4X3NyY19jZmcgPSB7CisgICAgICAgIC5pZCA9IDEsIC5yb2xlID0gQVVESU9fUE9SVF9ST0xFX1NPVVJDRSwgLnR5cGUgPSBBVURJT19QT1JUX1RZUEVfTUlYIH07CisgICAgQVNTRVJUX0ZBTFNFKGF1ZGlvX3BvcnRfY29uZmlnX2hhc19od19hdl9zeW5jKCZtaXhfc3JjX2NmZykpOworICAgIG1peF9zcmNfY2ZnLmNvbmZpZ19tYXNrIHw9IEFVRElPX1BPUlRfQ09ORklHX0ZMQUdTOworICAgIEFTU0VSVF9GQUxTRShhdWRpb19wb3J0X2NvbmZpZ19oYXNfaHdfYXZfc3luYygmbWl4X3NyY19jZmcpKTsKKyAgICBtaXhfc3JjX2NmZy5mbGFncy5vdXRwdXQgPSBBVURJT19PVVRQVVRfRkxBR19IV19BVl9TWU5DOworICAgIEFTU0VSVF9UUlVFKGF1ZGlvX3BvcnRfY29uZmlnX2hhc19od19hdl9zeW5jKCZtaXhfc3JjX2NmZykpOworfQorCitURVNUKFN5c3RlbUF1ZGlvVGVzdCwgUGF0Y2hFcXVhbCkgeworICAgIGNvbnN0IGF1ZGlvX3BhdGNoIHBhdGNoMXt9LCBwYXRjaDJ7fTsKKyAgICAvLyBJbnZhbGlkIHBhdGNoZXMgYXJlIG5vdCBlcXVhbC4KKyAgICBBU1NFUlRfRkFMU0UoYXVkaW9fcGF0Y2hlc19hcmVfZXF1YWwoJnBhdGNoMSwgJnBhdGNoMikpOworICAgIGNvbnN0IGF1ZGlvX3BvcnRfY29uZmlnIHNyYyA9IHsKKyAgICAgICAgLmlkID0gMSwgLnJvbGUgPSBBVURJT19QT1JUX1JPTEVfU09VUkNFLCAudHlwZSA9IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UgfTsKKyAgICBjb25zdCBhdWRpb19wb3J0X2NvbmZpZyBzaW5rID0geworICAgICAgICAuaWQgPSAyLCAucm9sZSA9IEFVRElPX1BPUlRfUk9MRV9TSU5LLCAudHlwZSA9IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UgfTsKKyAgICBBU1NFUlRfRkFMU0UoYXVkaW9fcGF0Y2hlc19hcmVfZXF1YWwoCisgICAgICAgICAgICAgICAgICAgIChQYXRjaEJ1aWxkZXJ7fSkuYWRkU291cmNlKHNyYykucGF0Y2goKSwKKyAgICAgICAgICAgICAgICAgICAgKFBhdGNoQnVpbGRlcnt9KS5hZGRTb3VyY2Uoc3JjKS5hZGRTaW5rKHNpbmspLnBhdGNoKCkpKTsKKyAgICBBU1NFUlRfVFJVRShhdWRpb19wYXRjaGVzX2FyZV9lcXVhbCgKKyAgICAgICAgICAgICAgICAgICAgKFBhdGNoQnVpbGRlcnt9KS5hZGRTb3VyY2Uoc3JjKS5hZGRTaW5rKHNpbmspLnBhdGNoKCksCisgICAgICAgICAgICAgICAgICAgIChQYXRjaEJ1aWxkZXJ7fSkuYWRkU291cmNlKHNyYykuYWRkU2luayhzaW5rKS5wYXRjaCgpKSk7CisgICAgQVNTRVJUX0ZBTFNFKGF1ZGlvX3BhdGNoZXNfYXJlX2VxdWFsKAorICAgICAgICAgICAgICAgICAgICAoUGF0Y2hCdWlsZGVye30pLmFkZFNvdXJjZShzcmMpLmFkZFNpbmsoc2luaykucGF0Y2goKSwKKyAgICAgICAgICAgICAgICAgICAgKFBhdGNoQnVpbGRlcnt9KS5hZGRTb3VyY2Uoc3JjKS5hZGRTb3VyY2Uoc3JjKS5hZGRTaW5rKHNpbmspLnBhdGNoKCkpKTsKKyAgICBhdWRpb19wb3J0X2NvbmZpZyBzaW5rX2h3X2F2X3N5bmMgPSBzaW5rOworICAgIHNpbmtfaHdfYXZfc3luYy5jb25maWdfbWFzayB8PSBBVURJT19QT1JUX0NPTkZJR19GTEFHUzsKKyAgICBzaW5rX2h3X2F2X3N5bmMuZmxhZ3Mub3V0cHV0ID0gQVVESU9fT1VUUFVUX0ZMQUdfSFdfQVZfU1lOQzsKKyAgICBBU1NFUlRfRkFMU0UoYXVkaW9fcGF0Y2hlc19hcmVfZXF1YWwoCisgICAgICAgICAgICAgICAgICAgIChQYXRjaEJ1aWxkZXJ7fSkuYWRkU291cmNlKHNyYykuYWRkU2luayhzaW5rKS5wYXRjaCgpLAorICAgICAgICAgICAgICAgICAgICAoUGF0Y2hCdWlsZGVye30pLmFkZFNvdXJjZShzcmMpLmFkZFNpbmsoc2lua19od19hdl9zeW5jKS5wYXRjaCgpKSk7CisgICAgQVNTRVJUX1RSVUUoYXVkaW9fcGF0Y2hlc19hcmVfZXF1YWwoCisgICAgICAgICAgICAgICAgICAgIChQYXRjaEJ1aWxkZXJ7fSkuYWRkU291cmNlKHNyYykuYWRkU2luayhzaW5rX2h3X2F2X3N5bmMpLnBhdGNoKCksCisgICAgICAgICAgICAgICAgICAgIChQYXRjaEJ1aWxkZXJ7fSkuYWRkU291cmNlKHNyYykuYWRkU2luayhzaW5rX2h3X2F2X3N5bmMpLnBhdGNoKCkpKTsKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyNWYwYjIKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMTE5IEBACisvLyBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLworLy8gbGliY2FtZXJhc2VydmljZQorLy8KKworY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjYW1lcmFzZXJ2aWNlIiwKKworICAgIC8vIENhbWVyYSBzZXJ2aWNlIHNvdXJjZQorCisgICAgc3JjczogWworICAgICAgICAiQ2FtZXJhU2VydmljZS5jcHAiLAorICAgICAgICAiQ2FtZXJhRmxhc2hsaWdodC5jcHAiLAorICAgICAgICAiY29tbW9uL0NhbWVyYTJDbGllbnRCYXNlLmNwcCIsCisgICAgICAgICJjb21tb24vQ2FtZXJhRGV2aWNlQmFzZS5jcHAiLAorICAgICAgICAiY29tbW9uL0NhbWVyYVByb3ZpZGVyTWFuYWdlci5jcHAiLAorICAgICAgICAiY29tbW9uL0ZyYW1lUHJvY2Vzc29yQmFzZS5jcHAiLAorICAgICAgICAiYXBpMS9DYW1lcmFDbGllbnQuY3BwIiwKKyAgICAgICAgImFwaTEvQ2FtZXJhMkNsaWVudC5jcHAiLAorICAgICAgICAiYXBpMS9jbGllbnQyL1BhcmFtZXRlcnMuY3BwIiwKKyAgICAgICAgImFwaTEvY2xpZW50Mi9GcmFtZVByb2Nlc3Nvci5jcHAiLAorICAgICAgICAiYXBpMS9jbGllbnQyL1N0cmVhbWluZ1Byb2Nlc3Nvci5jcHAiLAorICAgICAgICAiYXBpMS9jbGllbnQyL0pwZWdQcm9jZXNzb3IuY3BwIiwKKyAgICAgICAgImFwaTEvY2xpZW50Mi9DYWxsYmFja1Byb2Nlc3Nvci5jcHAiLAorICAgICAgICAiYXBpMS9jbGllbnQyL0pwZWdDb21wcmVzc29yLmNwcCIsCisgICAgICAgICJhcGkxL2NsaWVudDIvQ2FwdHVyZVNlcXVlbmNlci5jcHAiLAorICAgICAgICAiYXBpMS9jbGllbnQyL1pzbFByb2Nlc3Nvci5jcHAiLAorICAgICAgICAiYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuY3BwIiwKKyAgICAgICAgImRldmljZTEvQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UuY3BwIiwKKyAgICAgICAgImRldmljZTMvQ2FtZXJhM0RldmljZS5jcHAiLAorICAgICAgICAiZGV2aWNlMy9DYW1lcmEzU3RyZWFtLmNwcCIsCisgICAgICAgICJkZXZpY2UzL0NhbWVyYTNJT1N0cmVhbUJhc2UuY3BwIiwKKyAgICAgICAgImRldmljZTMvQ2FtZXJhM0lucHV0U3RyZWFtLmNwcCIsCisgICAgICAgICJkZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW0uY3BwIiwKKyAgICAgICAgImRldmljZTMvQ2FtZXJhM0R1bW15U3RyZWFtLmNwcCIsCisgICAgICAgICJkZXZpY2UzL0NhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW0uY3BwIiwKKyAgICAgICAgImRldmljZTMvU3RhdHVzVHJhY2tlci5jcHAiLAorICAgICAgICAiZGV2aWNlMy9DYW1lcmEzQnVmZmVyTWFuYWdlci5jcHAiLAorICAgICAgICAiZGV2aWNlMy9DYW1lcmEzU3RyZWFtU3BsaXR0ZXIuY3BwIiwKKyAgICAgICAgImRldmljZTMvRGlzdG9ydGlvbk1hcHBlci5jcHAiLAorICAgICAgICAiZ3VpL1JpbmdCdWZmZXJDb25zdW1lci5jcHAiLAorICAgICAgICAidXRpbHMvQ2FtZXJhVGhyZWFkU3RhdGUuY3BwIiwKKyAgICAgICAgImhpZGwvQWlkbENhbWVyYURldmljZUNhbGxiYWNrcy5jcHAiLAorICAgICAgICAiaGlkbC9BaWRsQ2FtZXJhU2VydmljZUxpc3RlbmVyLmNwcCIsCisgICAgICAgICJoaWRsL0NvbnZlcnQuY3BwIiwKKyAgICAgICAgImhpZGwvSGlkbENhbWVyYURldmljZVVzZXIuY3BwIiwKKyAgICAgICAgImhpZGwvSGlkbENhbWVyYVNlcnZpY2UuY3BwIiwKKyAgICAgICAgInV0aWxzL0NhbWVyYVRyYWNlcy5jcHAiLAorICAgICAgICAidXRpbHMvQXV0b0NvbmRpdGlvbkxvY2suY3BwIiwKKyAgICAgICAgInV0aWxzL1RhZ01vbml0b3IuY3BwIiwKKyAgICAgICAgInV0aWxzL0xhdGVuY3lIaXN0b2dyYW0uY3BwIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYnVpIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJ1dGlsc2NhbGxzdGFjayIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYm1lZGlhIiwKKyAgICAgICAgImxpYm1lZGlhdXRpbHMiLAorICAgICAgICAibGliY2FtZXJhX2NsaWVudCIsCisgICAgICAgICJsaWJjYW1lcmFfbWV0YWRhdGEiLAorICAgICAgICAibGliZm1xIiwKKyAgICAgICAgImxpYmd1aSIsCisgICAgICAgICJsaWJoYXJkd2FyZSIsCisgICAgICAgICJsaWJod2JpbmRlciIsCisgICAgICAgICJsaWJoaWRsYmFzZSIsCisgICAgICAgICJsaWJoaWRsdHJhbnNwb3J0IiwKKyAgICAgICAgImxpYmpwZWciLAorICAgICAgICAibGlibWVtdW5yZWFjaGFibGUiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJhbmRyb2lkLmZyYW1ld29ya3MuY2FtZXJhc2VydmljZS5jb21tb25AMi4wIiwKKyAgICAgICAgImFuZHJvaWQuZnJhbWV3b3Jrcy5jYW1lcmFzZXJ2aWNlLnNlcnZpY2VAMi4wIiwKKyAgICAgICAgImFuZHJvaWQuZnJhbWV3b3Jrcy5jYW1lcmFzZXJ2aWNlLmRldmljZUAyLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuY29tbW9uQDEuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5wcm92aWRlckAyLjQiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZGV2aWNlQDEuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5kZXZpY2VAMy4yIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmRldmljZUAzLjMiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZGV2aWNlQDMuNCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5kZXZpY2VAMy41IiwKKyAgICBdLAorCisgICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWworICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmNhbWVyYV9jbGllbnQiLAorICAgICAgICAibGliZm1xIiwKKyAgICBdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJzeXN0ZW0vbWVkaWEvcHJpdmF0ZS9jYW1lcmEvaW5jbHVkZSIsCisgICAgICAgICJmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgiLAorICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9uZGsiLAorICAgIF0sCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbIi4iXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdleHRyYSIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICBdLAorCit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9BbmRyb2lkLm1rIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQW5kcm9pZC5tawppbmRleCA5NjI2MWFiLi40Y2ZlY2ZkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9BbmRyb2lkLm1rCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0FuZHJvaWQubWsKQEAgLTE0LDkxICsxNCw5IEBACiAKIExPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQogCi0jCi0jIGxpYmNhbWVyYXNlcnZpY2UKLSMKLQogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCiAKLSMgQ2FtZXJhIHNlcnZpY2Ugc291cmNlCi0KLUxPQ0FMX1NSQ19GSUxFUyA6PSAgXAotICAgIENhbWVyYVNlcnZpY2UuY3BwIFwKLSAgICBDYW1lcmFGbGFzaGxpZ2h0LmNwcCBcCi0gICAgY29tbW9uL0NhbWVyYTJDbGllbnRCYXNlLmNwcCBcCi0gICAgY29tbW9uL0NhbWVyYURldmljZUJhc2UuY3BwIFwKLSAgICBjb21tb24vQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLmNwcCBcCi0gICAgY29tbW9uL0ZyYW1lUHJvY2Vzc29yQmFzZS5jcHAgXAotICAgIGFwaTEvQ2FtZXJhQ2xpZW50LmNwcCBcCi0gICAgYXBpMS9DYW1lcmEyQ2xpZW50LmNwcCBcCi0gICAgYXBpMS9jbGllbnQyL1BhcmFtZXRlcnMuY3BwIFwKLSAgICBhcGkxL2NsaWVudDIvRnJhbWVQcm9jZXNzb3IuY3BwIFwKLSAgICBhcGkxL2NsaWVudDIvU3RyZWFtaW5nUHJvY2Vzc29yLmNwcCBcCi0gICAgYXBpMS9jbGllbnQyL0pwZWdQcm9jZXNzb3IuY3BwIFwKLSAgICBhcGkxL2NsaWVudDIvQ2FsbGJhY2tQcm9jZXNzb3IuY3BwIFwKLSAgICBhcGkxL2NsaWVudDIvSnBlZ0NvbXByZXNzb3IuY3BwIFwKLSAgICBhcGkxL2NsaWVudDIvQ2FwdHVyZVNlcXVlbmNlci5jcHAgXAotICAgIGFwaTEvY2xpZW50Mi9ac2xQcm9jZXNzb3IuY3BwIFwKLSAgICBhcGkyL0NhbWVyYURldmljZUNsaWVudC5jcHAgXAotICAgIGRldmljZTEvQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UuY3BwIFwKLSAgICBkZXZpY2UzL0NhbWVyYTNEZXZpY2UuY3BwIFwKLSAgICBkZXZpY2UzL0NhbWVyYTNTdHJlYW0uY3BwIFwKLSAgICBkZXZpY2UzL0NhbWVyYTNJT1N0cmVhbUJhc2UuY3BwIFwKLSAgICBkZXZpY2UzL0NhbWVyYTNJbnB1dFN0cmVhbS5jcHAgXAotICAgIGRldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbS5jcHAgXAotICAgIGRldmljZTMvQ2FtZXJhM0R1bW15U3RyZWFtLmNwcCBcCi0gICAgZGV2aWNlMy9DYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtLmNwcCBcCi0gICAgZGV2aWNlMy9TdGF0dXNUcmFja2VyLmNwcCBcCi0gICAgZGV2aWNlMy9DYW1lcmEzQnVmZmVyTWFuYWdlci5jcHAgXAotICAgIGRldmljZTMvQ2FtZXJhM1N0cmVhbVNwbGl0dGVyLmNwcCBcCi0gICAgZGV2aWNlMy9EaXN0b3J0aW9uTWFwcGVyLmNwcCBcCi0gICAgZ3VpL1JpbmdCdWZmZXJDb25zdW1lci5jcHAgXAotICAgIHV0aWxzL0NhbWVyYVRyYWNlcy5jcHAgXAotICAgIHV0aWxzL0F1dG9Db25kaXRpb25Mb2NrLmNwcCBcCi0gICAgdXRpbHMvVGFnTW9uaXRvci5jcHAgXAotICAgIHV0aWxzL0xhdGVuY3lIaXN0b2dyYW0uY3BwCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVM6PSBcCi0gICAgbGlidWkgXAotICAgIGxpYmxvZyBcCi0gICAgbGlidXRpbHNjYWxsc3RhY2sgXAotICAgIGxpYnV0aWxzIFwKLSAgICBsaWJiaW5kZXIgXAotICAgIGxpYmN1dGlscyBcCi0gICAgbGlibWVkaWEgXAotICAgIGxpYm1lZGlhdXRpbHMgXAotICAgIGxpYmNhbWVyYV9jbGllbnQgXAotICAgIGxpYmNhbWVyYV9tZXRhZGF0YSBcCi0gICAgbGliZm1xIFwKLSAgICBsaWJndWkgXAotICAgIGxpYmhhcmR3YXJlIFwKLSAgICBsaWJoaWRsYmFzZSBcCi0gICAgbGliaGlkbHRyYW5zcG9ydCBcCi0gICAgbGlianBlZyBcCi0gICAgbGlibWVtdW5yZWFjaGFibGUgXAotICAgIGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmNvbW1vbkAxLjAgXAotICAgIGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLnByb3ZpZGVyQDIuNCBcCi0gICAgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZGV2aWNlQDEuMCBcCi0gICAgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZGV2aWNlQDMuMiBcCi0gICAgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZGV2aWNlQDMuMyBcCi0gICAgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZGV2aWNlQDMuNAotCi1MT0NBTF9FWFBPUlRfU0hBUkVEX0xJQlJBUllfSEVBREVSUyA6PSBsaWJiaW5kZXIgbGliY2FtZXJhX2NsaWVudCBsaWJmbXEKLQotTE9DQUxfQ19JTkNMVURFUyArPSBcCi0gICAgc3lzdGVtL21lZGlhL3ByaXZhdGUvY2FtZXJhL2luY2x1ZGUgXAotICAgIGZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heAotCi1MT0NBTF9FWFBPUlRfQ19JTkNMVURFX0RJUlMgOj0gXAotICAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UKLQotTE9DQUxfQ0ZMQUdTICs9IC1XYWxsIC1XZXh0cmEgLVdlcnJvcgotCi1MT0NBTF9NT0RVTEU6PSBsaWJjYW1lcmFzZXJ2aWNlCi0KLWluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKLQotIyBCdWlsZCB0ZXN0cyB0b28KKyMgQnVpbGQgdGVzdHMKIAogaW5jbHVkZSAkKExPQ0FMX1BBVEgpL3Rlc3RzL0FuZHJvaWQubWsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmNwcAppbmRleCBhYzY5NGVjLi4zOTUxNDc5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmNwcApAQCAtNDcsNiArNDcsOCBAQAogI2luY2x1ZGUgPGN1dGlscy9taXNjLmg+CiAjaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KICNpbmNsdWRlIDxoYXJkd2FyZS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgImhpZGwvSGlkbENhbWVyYVNlcnZpY2UuaCIKKyNpbmNsdWRlIDxoaWRsL0hpZGxUcmFuc3BvcnRTdXBwb3J0Lmg+CiAjaW5jbHVkZSA8bWVtdW5yZWFjaGFibGUvbWVtdW5yZWFjaGFibGUuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1N5c3RlbS5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CkBAIC02OSw2ICs3MSw3IEBACiAjaW5jbHVkZSAiYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuaCIKICNpbmNsdWRlICJ1dGlscy9DYW1lcmFUcmFjZXMuaCIKICNpbmNsdWRlICJ1dGlscy9UYWdNb25pdG9yLmgiCisjaW5jbHVkZSAidXRpbHMvQ2FtZXJhVGhyZWFkU3RhdGUuaCIKIAogbmFtZXNwYWNlIHsKICAgICBjb25zdCBjaGFyKiBrUGVybWlzc2lvblNlcnZpY2VOYW1lID0gInBlcm1pc3Npb24iOwpAQCAtNzcsNiArODAsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiB1c2luZyBiaW5kZXI6OlN0YXR1czsKK3VzaW5nIGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OnNlcnZpY2U6OlYyXzA6OmltcGxlbWVudGF0aW9uOjpIaWRsQ2FtZXJhU2VydmljZTsKIHVzaW5nIGhhcmR3YXJlOjpJQ2FtZXJhOwogdXNpbmcgaGFyZHdhcmU6OklDYW1lcmFDbGllbnQ7CiB1c2luZyBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2VQcm94eTsKQEAgLTE0MSw2ICsxNDUsMTEgQEAKIAogICAgIG1VaWRQb2xpY3kgPSBuZXcgVWlkUG9saWN5KHRoaXMpOwogICAgIG1VaWRQb2xpY3ktPnJlZ2lzdGVyU2VsZigpOworICAgIHNwPEhpZGxDYW1lcmFTZXJ2aWNlPiBoY3MgPSBIaWRsQ2FtZXJhU2VydmljZTo6Z2V0SW5zdGFuY2UodGhpcyk7CisgICAgaWYgKGhjcy0+cmVnaXN0ZXJBc1NlcnZpY2UoKSAhPSBhbmRyb2lkOjpPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byByZWdpc3RlciBkZWZhdWx0IGFuZHJvaWQuZnJhbWV3b3Jrcy5jYW1lcmFzZXJ2aWNlLnNlcnZpY2VAMS4wIiwKKyAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKyAgICB9CiB9CiAKIHN0YXR1c190IENhbWVyYVNlcnZpY2U6OmVudW1lcmF0ZVByb3ZpZGVycygpIHsKQEAgLTMzNSw3ICszNDQsNyBAQAogICAgICAgICAgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX0RJU0NPTk5FQ1RFRCwKICAgICAgICAgICAgICAgICAgICAgQ2FwdHVyZVJlc3VsdEV4dHJhc3t9KTsKICAgICAgICAgICAgIC8vIEVuc3VyZSBub3QgaW4gYmluZGVyIFJQQyBzbyBjbGllbnQgZGlzY29ubmVjdCBQSUQgY2hlY2tzIHdvcmsgY29ycmVjdGx5Ci0gICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGdldENhbGxpbmdQaWQoKSAhPSBnZXRwaWQoKSwKKyAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSAhPSBnZXRwaWQoKSwKICAgICAgICAgICAgICAgICAgICAgIm9uRGV2aWNlU3RhdHVzQ2hhbmdlZCBtdXN0IGJlIGNhbGxlZCBmcm9tIHRoZSBjYW1lcmEgc2VydmljZSBwcm9jZXNzISIpOwogICAgICAgICAgICAgY2xpZW50VG9EaXNjb25uZWN0LT5kaXNjb25uZWN0KCk7CiAgICAgICAgIH0KQEAgLTQ5NiwxNyArNTA1LDM3IEBACiAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJlcyksIHJlcyk7CiAgICAgfQogCisgICAgaW50IGNhbGxpbmdQaWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpOworICAgIGludCBjYWxsaW5nVWlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdVaWQoKTsKKyAgICBzdGQ6OnZlY3RvcjxpbnQzMl90PiB0YWdzUmVtb3ZlZDsKKyAgICAvLyBJZiBpdCdzIG5vdCBjYWxsaW5nIGZyb20gY2FtZXJhc2VydmVyLCBjaGVjayB0aGUgcGVybWlzc2lvbi4KKyAgICBpZiAoKGNhbGxpbmdQaWQgIT0gZ2V0cGlkKCkpICYmCisgICAgICAgICAgICAhY2hlY2tQZXJtaXNzaW9uKFN0cmluZzE2KCJhbmRyb2lkLnBlcm1pc3Npb24uQ0FNRVJBIiksIGNhbGxpbmdQaWQsIGNhbGxpbmdVaWQpKSB7CisgICAgICAgIHJlcyA9IGNhbWVyYUluZm8tPnJlbW92ZVBlcm1pc3Npb25FbnRyaWVzKAorICAgICAgICAgICAgICAgIG1DYW1lcmFQcm92aWRlck1hbmFnZXItPmdldFByb3ZpZGVyVGFnSWRMb2NrZWQoU3RyaW5nOChjYW1lcmFJZCkuc3RyaW5nKCkpLAorICAgICAgICAgICAgICAgICZ0YWdzUmVtb3ZlZCk7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIGNhbWVyYUluZm8tPmNsZWFyKCk7CisgICAgICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SX0ZNVChFUlJPUl9JTlZBTElEX09QRVJBVElPTiwgIkZhaWxlZCB0byByZW1vdmUgY2FtZXJhIgorICAgICAgICAgICAgICAgICAgICAiIGNoYXJhY3RlcmlzdGljcyBuZWVkaW5nIGNhbWVyYSBwZXJtaXNzaW9uIGZvciBkZXZpY2UgJXM6ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KGNhbWVyYUlkKS5zdHJpbmcoKSwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIXRhZ3NSZW1vdmVkLmVtcHR5KCkpIHsKKyAgICAgICAgcmVzID0gY2FtZXJhSW5mby0+dXBkYXRlKEFORFJPSURfUkVRVUVTVF9DSEFSQUNURVJJU1RJQ19LRVlTX05FRURJTkdfUEVSTUlTU0lPTiwKKyAgICAgICAgICAgICAgICB0YWdzUmVtb3ZlZC5kYXRhKCksIHRhZ3NSZW1vdmVkLnNpemUoKSk7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIGNhbWVyYUluZm8tPmNsZWFyKCk7CisgICAgICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SX0ZNVChFUlJPUl9JTlZBTElEX09QRVJBVElPTiwgIkZhaWxlZCB0byBpbnNlcnQgY2FtZXJhICIKKyAgICAgICAgICAgICAgICAgICAgImtleXMgbmVlZGluZyBwZXJtaXNzaW9uIGZvciBkZXZpY2UgJXM6ICVzICglZCkiLCBTdHJpbmc4KGNhbWVyYUlkKS5zdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIH0KKyAgICB9CisKICAgICByZXR1cm4gcmV0OwogfQogCi1pbnQgQ2FtZXJhU2VydmljZTo6Z2V0Q2FsbGluZ1BpZCgpIHsKLSAgICByZXR1cm4gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOwotfQotCi1pbnQgQ2FtZXJhU2VydmljZTo6Z2V0Q2FsbGluZ1VpZCgpIHsKLSAgICByZXR1cm4gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpOwotfQotCiBTdHJpbmc4IENhbWVyYVNlcnZpY2U6OmdldEZvcm1hdHRlZEN1cnJlbnRUaW1lKCkgewogICAgIHRpbWVfdCBub3cgPSB0aW1lKG51bGxwdHIpOwogICAgIGNoYXIgZm9ybWF0dGVkVGltZVs2NF07CkBAIC01ODcsNyArNjE2LDcgQEAKIFN0YXR1cyBDYW1lcmFTZXJ2aWNlOjptYWtlQ2xpZW50KGNvbnN0IHNwPENhbWVyYVNlcnZpY2U+JiBjYW1lcmFTZXJ2aWNlLAogICAgICAgICBjb25zdCBzcDxJSW50ZXJmYWNlPiYgY2FtZXJhQ2IsIGNvbnN0IFN0cmluZzE2JiBwYWNrYWdlTmFtZSwgY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsCiAgICAgICAgIGludCBhcGkxQ2FtZXJhSWQsIGludCBmYWNpbmcsIGludCBjbGllbnRQaWQsIHVpZF90IGNsaWVudFVpZCwgaW50IHNlcnZpY2VQaWQsCi0gICAgICAgIGJvb2wgbGVnYWN5TW9kZSwgaW50IGhhbFZlcnNpb24sIGludCBkZXZpY2VWZXJzaW9uLCBhcGlMZXZlbCBlZmZlY3RpdmVBcGlMZXZlbCwKKyAgICAgICAgaW50IGhhbFZlcnNpb24sIGludCBkZXZpY2VWZXJzaW9uLCBhcGlMZXZlbCBlZmZlY3RpdmVBcGlMZXZlbCwKICAgICAgICAgLypvdXQqL3NwPEJhc2ljQ2xpZW50PiogY2xpZW50KSB7CiAKICAgICBpZiAoaGFsVmVyc2lvbiA8IDAgfHwgaGFsVmVyc2lvbiA9PSBkZXZpY2VWZXJzaW9uKSB7CkBAIC01OTksNyArNjI4LDcgQEAKICAgICAgICAgICAgICAgICBzcDxJQ2FtZXJhQ2xpZW50PiB0bXAgPSBzdGF0aWNfY2FzdDxJQ2FtZXJhQ2xpZW50Kj4oY2FtZXJhQ2IuZ2V0KCkpOwogICAgICAgICAgICAgICAgICpjbGllbnQgPSBuZXcgQ2FtZXJhQ2xpZW50KGNhbWVyYVNlcnZpY2UsIHRtcCwgcGFja2FnZU5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICBhcGkxQ2FtZXJhSWQsIGZhY2luZywgY2xpZW50UGlkLCBjbGllbnRVaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXRwaWQoKSwgbGVnYWN5TW9kZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBnZXRwaWQoKSk7CiAgICAgICAgICAgICB9IGVsc2UgeyAvLyBDYW1lcmEyIEFQSSByb3V0ZQogICAgICAgICAgICAgICAgIEFMT0dXKCJDYW1lcmEgdXNpbmcgb2xkIEhBTCB2ZXJzaW9uOiAlZCIsIGRldmljZVZlcnNpb24pOwogICAgICAgICAgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1JfRk1UKEVSUk9SX0RFUFJFQ0FURURfSEFMLApAQCAtNjEyLDEyICs2NDEsMTMgQEAKICAgICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18yOgogICAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzM6CiAgICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfNDoKKyAgICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM181OgogICAgICAgICAgICAgaWYgKGVmZmVjdGl2ZUFwaUxldmVsID09IEFQSV8xKSB7IC8vIENhbWVyYTEgQVBJIHJvdXRlCiAgICAgICAgICAgICAgICAgc3A8SUNhbWVyYUNsaWVudD4gdG1wID0gc3RhdGljX2Nhc3Q8SUNhbWVyYUNsaWVudCo+KGNhbWVyYUNiLmdldCgpKTsKICAgICAgICAgICAgICAgICAqY2xpZW50ID0gbmV3IENhbWVyYTJDbGllbnQoY2FtZXJhU2VydmljZSwgdG1wLCBwYWNrYWdlTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYUlkLCBhcGkxQ2FtZXJhSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICBmYWNpbmcsIGNsaWVudFBpZCwgY2xpZW50VWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZVBpZCwgbGVnYWN5TW9kZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlUGlkKTsKICAgICAgICAgICAgIH0gZWxzZSB7IC8vIENhbWVyYTIgQVBJIHJvdXRlCiAgICAgICAgICAgICAgICAgc3A8aGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M+IHRtcCA9CiAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrcyo+KGNhbWVyYUNiLmdldCgpKTsKQEAgLTY0MSw3ICs2NzEsNyBAQAogICAgICAgICAgICAgc3A8SUNhbWVyYUNsaWVudD4gdG1wID0gc3RhdGljX2Nhc3Q8SUNhbWVyYUNsaWVudCo+KGNhbWVyYUNiLmdldCgpKTsKICAgICAgICAgICAgICpjbGllbnQgPSBuZXcgQ2FtZXJhQ2xpZW50KGNhbWVyYVNlcnZpY2UsIHRtcCwgcGFja2FnZU5hbWUsCiAgICAgICAgICAgICAgICAgICAgIGFwaTFDYW1lcmFJZCwgZmFjaW5nLCBjbGllbnRQaWQsIGNsaWVudFVpZCwKLSAgICAgICAgICAgICAgICAgICAgc2VydmljZVBpZCwgbGVnYWN5TW9kZSk7CisgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VQaWQpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLy8gT3RoZXIgY29tYmluYXRpb25zIChlLmcuIEhBTDMueCBvcGVuIGFzIEhBTDIueCkgYXJlIG5vdCBzdXBwb3J0ZWQgeWV0LgogICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgY2FtZXJhIEhBTCB2ZXJzaW9uICV4OiBIQUwgJXggZGV2aWNlIGNhbiBvbmx5IGJlIgpAQCAtNzMwLDcgKzc2MCw3IEBACiB9CiAKIFN0YXR1cyBDYW1lcmFTZXJ2aWNlOjppbml0aWFsaXplU2hpbU1ldGFkYXRhKGludCBjYW1lcmFJZCkgewotICAgIGludCB1aWQgPSBnZXRDYWxsaW5nVWlkKCk7CisgICAgaW50IHVpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nVWlkKCk7CiAKICAgICBTdHJpbmcxNiBpbnRlcm5hbFBhY2thZ2VOYW1lKCJjYW1lcmFzZXJ2ZXIiKTsKICAgICBTdHJpbmc4IGlkID0gU3RyaW5nODo6Zm9ybWF0KCIlZCIsIGNhbWVyYUlkKTsKQEAgLTc0MCw4ICs3NzAsNyBAQAogICAgICAgICAgICAgc3A8SUNhbWVyYUNsaWVudD57bnVsbHB0cn0sIGlkLCBjYW1lcmFJZCwKICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4oQ0FNRVJBX0hBTF9BUElfVkVSU0lPTl9VTlNQRUNJRklFRCksCiAgICAgICAgICAgICBpbnRlcm5hbFBhY2thZ2VOYW1lLCB1aWQsIFVTRV9DQUxMSU5HX1BJRCwKLSAgICAgICAgICAgIEFQSV8xLCAvKmxlZ2FjeU1vZGUqLyBmYWxzZSwgLypzaGltVXBkYXRlT25seSovIHRydWUsCi0gICAgICAgICAgICAvKm91dCovIHRtcCkKKyAgICAgICAgICAgIEFQSV8xLCAvKnNoaW1VcGRhdGVPbmx5Ki8gdHJ1ZSwgLypvdXQqLyB0bXApCiAgICAgICAgICAgICApLmlzT2soKSkgewogICAgICAgICBBTE9HRSgiJXM6IEVycm9yIGluaXRpYWxpemluZyBzaGltIG1ldGFkYXRhOiAlcyIsIF9fRlVOQ1RJT05fXywgcmV0LnRvU3RyaW5nOCgpLnN0cmluZygpKTsKICAgICB9CkBAIC03ODAsOSArODA5LDkgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIGludDY0X3QgdG9rZW4gPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5jbGVhckNhbGxpbmdJZGVudGl0eSgpOworICAgIGludDY0X3QgdG9rZW4gPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Y2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKICAgICByZXQgPSBpbml0aWFsaXplU2hpbU1ldGFkYXRhKGNhbWVyYUlkKTsKLSAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KHRva2VuKTsKKyAgICBDYW1lcmFUaHJlYWRTdGF0ZTo6cmVzdG9yZUNhbGxpbmdJZGVudGl0eSh0b2tlbik7CiAgICAgaWYgKCFyZXQuaXNPaygpKSB7CiAgICAgICAgIC8vIEVycm9yIGFscmVhZHkgbG9nZ2VkIGJ5IGNhbGxlZQogICAgICAgICByZXR1cm4gcmV0OwpAQCAtODM5LDcgKzg2OCw3IEBACiAgICAgfQogI2VuZGlmICAvLyBfX0JSSUxMT19fCiAKLSAgICBpbnQgY2FsbGluZ1BpZCA9IGdldENhbGxpbmdQaWQoKTsKKyAgICBpbnQgY2FsbGluZ1BpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCk7CiAKICAgICBpZiAoIW1Jbml0aWFsaXplZCkgewogICAgICAgICBBTE9HRSgiQ2FtZXJhU2VydmljZTo6Y29ubmVjdCBYIChQSUQgJWQpIHJlamVjdGVkIChjYW1lcmEgSEFMIG1vZHVsZSBub3QgbG9hZGVkKSIsCkBAIC04NzMsOCArOTAyLDggQEAKIFN0YXR1cyBDYW1lcmFTZXJ2aWNlOjp2YWxpZGF0ZUNsaWVudFBlcm1pc3Npb25zTG9ja2VkKGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLAogICAgICAgICBjb25zdCBTdHJpbmc4JiBjbGllbnROYW1lOCwgaW50JiBjbGllbnRVaWQsIGludCYgY2xpZW50UGlkLAogICAgICAgICAvKm91dCovaW50JiBvcmlnaW5hbENsaWVudFBpZCkgY29uc3QgewotICAgIGludCBjYWxsaW5nUGlkID0gZ2V0Q2FsbGluZ1BpZCgpOwotICAgIGludCBjYWxsaW5nVWlkID0gZ2V0Q2FsbGluZ1VpZCgpOworICAgIGludCBjYWxsaW5nUGlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKTsKKyAgICBpbnQgY2FsbGluZ1VpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nVWlkKCk7CiAKICAgICAvLyBDaGVjayBpZiB3ZSBjYW4gdHJ1c3QgY2xpZW50VWlkCiAgICAgaWYgKGNsaWVudFVpZCA9PSBVU0VfQ0FMTElOR19VSUQpIHsKQEAgLTk0Myw3ICs5NzIsNyBAQAogCiBzdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpjaGVja0lmRGV2aWNlSXNVc2FibGUoY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQpIGNvbnN0IHsKICAgICBhdXRvIGNhbWVyYVN0YXRlID0gZ2V0Q2FtZXJhU3RhdGUoY2FtZXJhSWQpOwotICAgIGludCBjYWxsaW5nUGlkID0gZ2V0Q2FsbGluZ1BpZCgpOworICAgIGludCBjYWxsaW5nUGlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKTsKICAgICBpZiAoY2FtZXJhU3RhdGUgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRSgiQ2FtZXJhU2VydmljZTo6Y29ubmVjdCBYIChQSUQgJWQpIHJlamVjdGVkIChpbnZhbGlkIGNhbWVyYSBJRCAlcykiLCBjYWxsaW5nUGlkLAogICAgICAgICAgICAgICAgIGNhbWVyYUlkLnN0cmluZygpKTsKQEAgLTExNDcsNyArMTE3Niw3IEBACiAgICAgbVNlcnZpY2VMb2NrLnVubG9jaygpOwogCiAgICAgLy8gQ2xlYXIgY2FsbGVyIGlkZW50aXR5IHRlbXBvcmFyaWx5IHNvIGNsaWVudCBkaXNjb25uZWN0IFBJRCBjaGVja3Mgd29yayBjb3JyZWN0bHkKLSAgICBpbnQ2NF90IHRva2VuID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Y2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKKyAgICBpbnQ2NF90IHRva2VuID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CiAKICAgICAvLyBEZXN0cm95IGV2aWN0ZWQgY2xpZW50cwogICAgIGZvciAoYXV0byYgaSA6IGV2aWN0ZWRDbGllbnRzKSB7CkBAIC0xMTU1LDcgKzExODQsNyBAQAogICAgICAgICBpLT5nZXRWYWx1ZSgpLT5kaXNjb25uZWN0KCk7IC8vIENsaWVudHMgd2lsbCByZW1vdmUgdGhlbXNlbHZlcyBmcm9tIHRoZSBhY3RpdmUgY2xpZW50IGxpc3QKICAgICB9CiAKLSAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KHRva2VuKTsKKyAgICBDYW1lcmFUaHJlYWRTdGF0ZTo6cmVzdG9yZUNhbGxpbmdJZGVudGl0eSh0b2tlbik7CiAKICAgICBmb3IgKGNvbnN0IGF1dG8mIGkgOiBldmljdGVkQ2xpZW50cykgewogICAgICAgICBBTE9HVigiJXM6IFdhaXRpbmcgZm9yIGRpc2Nvbm5lY3QgdG8gY29tcGxldGUgZm9yIGNsaWVudCBmb3IgZGV2aWNlICVzIChQSUQgJSIgUFJJZDMyICIpIiwKQEAgLTEyMDUsMTEgKzEyMzQsMTAgQEAKICAgICBzcDxDbGllbnQ+IGNsaWVudCA9IG51bGxwdHI7CiAgICAgcmV0ID0gY29ubmVjdEhlbHBlcjxJQ2FtZXJhQ2xpZW50LENsaWVudD4oY2FtZXJhQ2xpZW50LCBpZCwgYXBpMUNhbWVyYUlkLAogICAgICAgICAgICAgQ0FNRVJBX0hBTF9BUElfVkVSU0lPTl9VTlNQRUNJRklFRCwgY2xpZW50UGFja2FnZU5hbWUsIGNsaWVudFVpZCwgY2xpZW50UGlkLCBBUElfMSwKLSAgICAgICAgICAgIC8qbGVnYWN5TW9kZSovIGZhbHNlLCAvKnNoaW1VcGRhdGVPbmx5Ki8gZmFsc2UsCi0gICAgICAgICAgICAvKm91dCovY2xpZW50KTsKKyAgICAgICAgICAgIC8qc2hpbVVwZGF0ZU9ubHkqLyBmYWxzZSwgLypvdXQqL2NsaWVudCk7CiAKICAgICBpZighcmV0LmlzT2soKSkgewotICAgICAgICBsb2dSZWplY3RlZChpZCwgZ2V0Q2FsbGluZ1BpZCgpLCBTdHJpbmc4KGNsaWVudFBhY2thZ2VOYW1lKSwKKyAgICAgICAgbG9nUmVqZWN0ZWQoaWQsIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCksIFN0cmluZzgoY2xpZW50UGFja2FnZU5hbWUpLAogICAgICAgICAgICAgICAgIHJldC50b1N0cmluZzgoKSk7CiAgICAgICAgIHJldHVybiByZXQ7CiAgICAgfQpAQCAtMTIzMiwxMiArMTI2MCwxMSBAQAogICAgIFN0YXR1cyByZXQgPSBTdGF0dXM6Om9rKCk7CiAgICAgc3A8Q2xpZW50PiBjbGllbnQgPSBudWxscHRyOwogICAgIHJldCA9IGNvbm5lY3RIZWxwZXI8SUNhbWVyYUNsaWVudCxDbGllbnQ+KGNhbWVyYUNsaWVudCwgaWQsIGFwaTFDYW1lcmFJZCwgaGFsVmVyc2lvbiwKLSAgICAgICAgICAgIGNsaWVudFBhY2thZ2VOYW1lLCBjbGllbnRVaWQsIFVTRV9DQUxMSU5HX1BJRCwgQVBJXzEsCi0gICAgICAgICAgICAvKmxlZ2FjeU1vZGUqLyB0cnVlLCAvKnNoaW1VcGRhdGVPbmx5Ki8gZmFsc2UsCisgICAgICAgICAgICBjbGllbnRQYWNrYWdlTmFtZSwgY2xpZW50VWlkLCBVU0VfQ0FMTElOR19QSUQsIEFQSV8xLCAvKnNoaW1VcGRhdGVPbmx5Ki8gZmFsc2UsCiAgICAgICAgICAgICAvKm91dCovY2xpZW50KTsKIAogICAgIGlmKCFyZXQuaXNPaygpKSB7Ci0gICAgICAgIGxvZ1JlamVjdGVkKGlkLCBnZXRDYWxsaW5nUGlkKCksIFN0cmluZzgoY2xpZW50UGFja2FnZU5hbWUpLAorICAgICAgICBsb2dSZWplY3RlZChpZCwgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSwgU3RyaW5nOChjbGllbnRQYWNrYWdlTmFtZSksCiAgICAgICAgICAgICAgICAgcmV0LnRvU3RyaW5nOCgpKTsKICAgICAgICAgcmV0dXJuIHJldDsKICAgICB9CkBAIC0xMjYxLDEyICsxMjg4LDEwIEBACiAgICAgcmV0ID0gY29ubmVjdEhlbHBlcjxoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrcyxDYW1lcmFEZXZpY2VDbGllbnQ+KGNhbWVyYUNiLCBpZCwKICAgICAgICAgICAgIC8qYXBpMUNhbWVyYUlkKi8tMSwKICAgICAgICAgICAgIENBTUVSQV9IQUxfQVBJX1ZFUlNJT05fVU5TUEVDSUZJRUQsIGNsaWVudFBhY2thZ2VOYW1lLAotICAgICAgICAgICAgY2xpZW50VWlkLCBVU0VfQ0FMTElOR19QSUQsIEFQSV8yLAotICAgICAgICAgICAgLypsZWdhY3lNb2RlKi8gZmFsc2UsIC8qc2hpbVVwZGF0ZU9ubHkqLyBmYWxzZSwKLSAgICAgICAgICAgIC8qb3V0Ki9jbGllbnQpOworICAgICAgICAgICAgY2xpZW50VWlkLCBVU0VfQ0FMTElOR19QSUQsIEFQSV8yLCAvKnNoaW1VcGRhdGVPbmx5Ki8gZmFsc2UsIC8qb3V0Ki9jbGllbnQpOwogCiAgICAgaWYoIXJldC5pc09rKCkpIHsKLSAgICAgICAgbG9nUmVqZWN0ZWQoaWQsIGdldENhbGxpbmdQaWQoKSwgU3RyaW5nOChjbGllbnRQYWNrYWdlTmFtZSksCisgICAgICAgIGxvZ1JlamVjdGVkKGlkLCBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpLCBTdHJpbmc4KGNsaWVudFBhY2thZ2VOYW1lKSwKICAgICAgICAgICAgICAgICByZXQudG9TdHJpbmc4KCkpOwogICAgICAgICByZXR1cm4gcmV0OwogICAgIH0KQEAgLTEyNzgsNyArMTMwMyw3IEBACiB0ZW1wbGF0ZTxjbGFzcyBDQUxMQkFDSywgY2xhc3MgQ0xJRU5UPgogU3RhdHVzIENhbWVyYVNlcnZpY2U6OmNvbm5lY3RIZWxwZXIoY29uc3Qgc3A8Q0FMTEJBQ0s+JiBjYW1lcmFDYiwgY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsCiAgICAgICAgIGludCBhcGkxQ2FtZXJhSWQsIGludCBoYWxWZXJzaW9uLCBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsIGludCBjbGllbnRVaWQsCi0gICAgICAgIGludCBjbGllbnRQaWQsIGFwaUxldmVsIGVmZmVjdGl2ZUFwaUxldmVsLCBib29sIGxlZ2FjeU1vZGUsIGJvb2wgc2hpbVVwZGF0ZU9ubHksCisgICAgICAgIGludCBjbGllbnRQaWQsIGFwaUxldmVsIGVmZmVjdGl2ZUFwaUxldmVsLCBib29sIHNoaW1VcGRhdGVPbmx5LAogICAgICAgICAvKm91dCovc3A8Q0xJRU5UPiYgZGV2aWNlKSB7CiAgICAgYmluZGVyOjpTdGF0dXMgcmV0ID0gYmluZGVyOjpTdGF0dXM6Om9rKCk7CiAKQEAgLTEzNjMsNyArMTM4OCw3IEBACiAgICAgICAgIHNwPEJhc2ljQ2xpZW50PiB0bXAgPSBudWxscHRyOwogICAgICAgICBpZighKHJldCA9IG1ha2VDbGllbnQodGhpcywgY2FtZXJhQ2IsIGNsaWVudFBhY2thZ2VOYW1lLAogICAgICAgICAgICAgICAgIGNhbWVyYUlkLCBhcGkxQ2FtZXJhSWQsIGZhY2luZywKLSAgICAgICAgICAgICAgICBjbGllbnRQaWQsIGNsaWVudFVpZCwgZ2V0cGlkKCksIGxlZ2FjeU1vZGUsCisgICAgICAgICAgICAgICAgY2xpZW50UGlkLCBjbGllbnRVaWQsIGdldHBpZCgpLAogICAgICAgICAgICAgICAgIGhhbFZlcnNpb24sIGRldmljZVZlcnNpb24sIGVmZmVjdGl2ZUFwaUxldmVsLAogICAgICAgICAgICAgICAgIC8qb3V0Ki8mdG1wKSkuaXNPaygpKSB7CiAgICAgICAgICAgICByZXR1cm4gcmV0OwpAQCAtMTQ0Nyw3ICsxNDcyLDcgQEAKICAgICB9CiAKICAgICBTdHJpbmc4IGlkID0gU3RyaW5nOChjYW1lcmFJZC5zdHJpbmcoKSk7Ci0gICAgaW50IHVpZCA9IGdldENhbGxpbmdVaWQoKTsKKyAgICBpbnQgdWlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdVaWQoKTsKIAogICAgIC8vIHZlcmlmeSBpZCBpcyB2YWxpZC4KICAgICBhdXRvIHN0YXRlID0gZ2V0Q2FtZXJhU3RhdGUoaWQpOwpAQCAtMTU1NCw3ICsxNTc5LDcgQEAKIAogU3RhdHVzIENhbWVyYVNlcnZpY2U6Om5vdGlmeVN5c3RlbUV2ZW50KGludDMyX3QgZXZlbnRJZCwKICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50MzJfdD4mIGFyZ3MpIHsKLSAgICBjb25zdCBpbnQgcGlkID0gZ2V0Q2FsbGluZ1BpZCgpOworICAgIGNvbnN0IGludCBwaWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpOwogICAgIGNvbnN0IGludCBzZWxmUGlkID0gZ2V0cGlkKCk7CiAKICAgICAvLyBQZXJtaXNzaW9uIGNoZWNrcwpAQCAtMTU2Myw3ICsxNTg4LDcgQEAKICAgICAgICAgLy8gcGVybWlzc2lvbnMgdG8gbm90aWZ5IHRoZSBjYW1lcmEgc2VydmljZSBhYm91dCBzeXN0ZW0gZXZlbnRzCiAgICAgICAgIGlmICghY2hlY2tDYWxsaW5nUGVybWlzc2lvbigKICAgICAgICAgICAgICAgICBTdHJpbmcxNigiYW5kcm9pZC5wZXJtaXNzaW9uLkNBTUVSQV9TRU5EX1NZU1RFTV9FVkVOVFMiKSkpIHsKLSAgICAgICAgICAgIGNvbnN0IGludCB1aWQgPSBnZXRDYWxsaW5nVWlkKCk7CisgICAgICAgICAgICBjb25zdCBpbnQgdWlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdVaWQoKTsKICAgICAgICAgICAgIEFMT0dFKCJQZXJtaXNzaW9uIERlbmlhbDogY2Fubm90IHNlbmQgdXBkYXRlcyB0byBjYW1lcmEgc2VydmljZSBhYm91dCBzeXN0ZW0iCiAgICAgICAgICAgICAgICAgICAgICIgZXZlbnRzIGZyb20gcGlkPSVkLCB1aWQ9JWQiLCBwaWQsIHVpZCk7CiAgICAgICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SX0ZNVChFUlJPUl9QRVJNSVNTSU9OX0RFTklFRCwKQEAgLTE3MTUsNyArMTc0MCw3IEBACiAgICAgfQogCiAgICAgaW50IGRldmljZVZlcnNpb24gPSBnZXREZXZpY2VWZXJzaW9uKGlkKTsKLSAgICBzd2l0Y2goZGV2aWNlVmVyc2lvbikgeworICAgIHN3aXRjaCAoZGV2aWNlVmVyc2lvbikgewogICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMV8wOgogICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18wOgogICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18xOgpAQCAtMTczMiw2ICsxNzU3LDcgQEAKICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMjoKICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMzoKICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfNDoKKyAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfNToKICAgICAgICAgICAgIEFMT0dWKCIlczogQ2FtZXJhIGlkICVzIHVzZXMgSEFMMy4yIG9yIG5ld2VyLCBzdXBwb3J0cyBhcGkxL2FwaTIgZGlyZWN0bHkiLAogICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGlkLnN0cmluZygpKTsKICAgICAgICAgICAgICppc1N1cHBvcnRlZCA9IHRydWU7CkBAIC0xNzUyLDYgKzE3NzgsMTggQEAKICAgICByZXR1cm4gU3RhdHVzOjpvaygpOwogfQogCitTdGF0dXMgQ2FtZXJhU2VydmljZTo6aXNIaWRkZW5QaHlzaWNhbENhbWVyYShjb25zdCBTdHJpbmcxNiYgY2FtZXJhSWQsCisgICAgICAgIC8qb3V0Ki8gYm9vbCAqaXNTdXBwb3J0ZWQpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworCisgICAgY29uc3QgU3RyaW5nOCBpZCA9IFN0cmluZzgoY2FtZXJhSWQpOworCisgICAgQUxPR1YoIiVzOiBmb3IgY2FtZXJhIElEID0gJXMiLCBfX0ZVTkNUSU9OX18sIGlkLnN0cmluZygpKTsKKyAgICAqaXNTdXBwb3J0ZWQgPSBtQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLT5pc0hpZGRlblBoeXNpY2FsQ2FtZXJhKGlkLnN0cmluZygpKTsKKworICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Cit9CisKIHZvaWQgQ2FtZXJhU2VydmljZTo6cmVtb3ZlQnlDbGllbnQoY29uc3QgQmFzaWNDbGllbnQqIGNsaWVudCkgewogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1TZXJ2aWNlTG9jayk7CiAgICAgZm9yIChhdXRvJiBpIDogbUFjdGl2ZUNsaWVudE1hbmFnZXIuZ2V0QWxsKCkpIHsKQEAgLTE4OTksMTMgKzE5MzcsMTMgQEAKICAgICBtU2VydmljZUxvY2sudW5sb2NrKCk7CiAKICAgICAvLyBDbGVhciBjYWxsZXIgaWRlbnRpdHkgdGVtcG9yYXJpbHkgc28gY2xpZW50IGRpc2Nvbm5lY3QgUElEIGNoZWNrcyB3b3JrIGNvcnJlY3RseQotICAgIGludDY0X3QgdG9rZW4gPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5jbGVhckNhbGxpbmdJZGVudGl0eSgpOworICAgIGludDY0X3QgdG9rZW4gPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Y2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKIAogICAgIGZvciAoYXV0byYgaSA6IGV2aWN0ZWQpIHsKICAgICAgICAgaS0+ZGlzY29ubmVjdCgpOwogICAgIH0KIAotICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkodG9rZW4pOworICAgIENhbWVyYVRocmVhZFN0YXRlOjpyZXN0b3JlQ2FsbGluZ0lkZW50aXR5KHRva2VuKTsKIAogICAgIC8vIFJlYWNxdWlyZSBtU2VydmljZUxvY2sKICAgICBtU2VydmljZUxvY2subG9jaygpOwpAQCAtMTk3Myw3ICsyMDExLDYgQEAKIHN0YXR1c190IENhbWVyYVNlcnZpY2U6Om9uVHJhbnNhY3QodWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLCBQYXJjZWwqIHJlcGx5LAogICAgICAgICB1aW50MzJfdCBmbGFncykgewogCi0KICAgICAvLyBQZXJtaXNzaW9uIGNoZWNrcwogICAgIHN3aXRjaCAoY29kZSkgewogICAgICAgICBjYXNlIFNIRUxMX0NPTU1BTkRfVFJBTlNBQ1RJT046IHsKQEAgLTIwODksNyArMjEyNiw3IEBACiAgICAgICAgICAgICAgICAgc2VydmljZVBpZCksCiAgICAgICAgIG1DYW1lcmFJZChhcGkxQ2FtZXJhSWQpCiB7Ci0gICAgaW50IGNhbGxpbmdQaWQgPSBnZXRDYWxsaW5nUGlkKCk7CisgICAgaW50IGNhbGxpbmdQaWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpOwogICAgIExPRzEoIkNsaWVudDo6Q2xpZW50IEUgKHBpZCAlZCwgaWQgJWQpIiwgY2FsbGluZ1BpZCwgbUNhbWVyYUlkKTsKIAogICAgIG1SZW1vdGVDYWxsYmFjayA9IGNhbWVyYUNsaWVudDsKQEAgLTIxOTgsNyArMjIzNSw3IEBACiAgICAgLy8gTm8gZHVtcGluZyBvZiBjbGllbnRzIGRpcmVjdGx5IG92ZXIgQmluZGVyLAogICAgIC8vIG11c3QgZ28gdGhyb3VnaCBDYW1lcmFTZXJ2aWNlOjpkdW1wCiAgICAgYW5kcm9pZF9lcnJvcldyaXRlV2l0aEluZm9Mb2coU05fRVZFTlRfTE9HX0lELCAiMjYyNjU0MDMiLAotICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpLCBOVUxMLCAwKTsKKyAgICAgICAgICAgIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nVWlkKCksIE5VTEwsIDApOwogICAgIHJldHVybiBPSzsKIH0KIApAQCAtMjMzNSw3ICsyMzcyLDcgQEAKIAogICAgIC8vIFJlc2V0IHRoZSBjbGllbnQgUElEIHRvIGFsbG93IHNlcnZlci1pbml0aWF0ZWQgZGlzY29ubmVjdCwKICAgICAvLyBhbmQgdG8gcHJldmVudCBmdXJ0aGVyIGNhbGxzIGJ5IGNsaWVudC4KLSAgICBtQ2xpZW50UGlkID0gZ2V0Q2FsbGluZ1BpZCgpOworICAgIG1DbGllbnRQaWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpOwogICAgIENhcHR1cmVSZXN1bHRFeHRyYXMgcmVzdWx0RXh0cmFzOyAvLyBhIGR1bW15IHJlc3VsdCAoaW52YWxpZCkKICAgICBub3RpZnlFcnJvcihoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX0RJU0FCTEVELCByZXN1bHRFeHRyYXMpOwogICAgIGRpc2Nvbm5lY3QoKTsKQEAgLTI2OTYsOCArMjczMyw4IEBACiAKICAgICBpZiAoY2hlY2tDYWxsaW5nUGVybWlzc2lvbihTdHJpbmcxNigiYW5kcm9pZC5wZXJtaXNzaW9uLkRVTVAiKSkgPT0gZmFsc2UpIHsKICAgICAgICAgZHByaW50ZihmZCwgIlBlcm1pc3Npb24gRGVuaWFsOiBjYW4ndCBkdW1wIENhbWVyYVNlcnZpY2UgZnJvbSBwaWQ9JWQsIHVpZD0lZFxuIiwKLSAgICAgICAgICAgICAgICBnZXRDYWxsaW5nUGlkKCksCi0gICAgICAgICAgICAgICAgZ2V0Q2FsbGluZ1VpZCgpKTsKKyAgICAgICAgICAgICAgICBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpLAorICAgICAgICAgICAgICAgIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nVWlkKCkpOwogICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgfQogICAgIGJvb2wgbG9ja2VkID0gdHJ5TG9jayhtU2VydmljZUxvY2spOwpAQCAtMjg3MCw3ICsyOTA3LDcgQEAKICAgICAgICogYmluZGVyIGRyaXZlcgogICAgICAgKi8KICAgICAvLyBQSUQgaGVyZSBpcyBhcHByb3hpbWF0ZSBhbmQgY2FuIGJlIHdyb25nLgotICAgIGxvZ0NsaWVudERpZWQoZ2V0Q2FsbGluZ1BpZCgpLCBTdHJpbmc4KCJCaW5kZXIgZGllZCB1bmV4cGVjdGVkbHkiKSk7CisgICAgbG9nQ2xpZW50RGllZChDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpLCBTdHJpbmc4KCJCaW5kZXIgZGllZCB1bmV4cGVjdGVkbHkiKSk7CiAKICAgICAvLyBjaGVjayB0b3JjaCBjbGllbnQKICAgICBoYW5kbGVUb3JjaENsaWVudEJpbmRlckRpZWQod2hvKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuaAppbmRleCA2MjRkMWNhLi4wNjQ4NjNmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5oCkBAIC0xNTksNiArMTU5LDExIEBACiAgICAgICAgICAgICAvKm91dCovCiAgICAgICAgICAgICBib29sICppc1N1cHBvcnRlZCk7CiAKKyAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzICAgIGlzSGlkZGVuUGh5c2ljYWxDYW1lcmEoCisgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2FtZXJhSWQsCisgICAgICAgICAgICAvKm91dCovCisgICAgICAgICAgICBib29sICppc1N1cHBvcnRlZCk7CisKICAgICAvLyBFeHRyYSBwZXJtaXNzaW9ucyBjaGVja3MKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIG9uVHJhbnNhY3QodWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJjZWwqIHJlcGx5LCB1aW50MzJfdCBmbGFncyk7CkBAIC01ODUsOCArNTkwLDcgQEAKICAgICB0ZW1wbGF0ZTxjbGFzcyBDQUxMQkFDSywgY2xhc3MgQ0xJRU5UPgogICAgIGJpbmRlcjo6U3RhdHVzIGNvbm5lY3RIZWxwZXIoY29uc3Qgc3A8Q0FMTEJBQ0s+JiBjYW1lcmFDYiwgY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsCiAgICAgICAgICAgICBpbnQgYXBpMUNhbWVyYUlkLCBpbnQgaGFsVmVyc2lvbiwgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLAotICAgICAgICAgICAgaW50IGNsaWVudFVpZCwgaW50IGNsaWVudFBpZCwKLSAgICAgICAgICAgIGFwaUxldmVsIGVmZmVjdGl2ZUFwaUxldmVsLCBib29sIGxlZ2FjeU1vZGUsIGJvb2wgc2hpbVVwZGF0ZU9ubHksCisgICAgICAgICAgICBpbnQgY2xpZW50VWlkLCBpbnQgY2xpZW50UGlkLCBhcGlMZXZlbCBlZmZlY3RpdmVBcGlMZXZlbCwgYm9vbCBzaGltVXBkYXRlT25seSwKICAgICAgICAgICAgIC8qb3V0Ki9zcDxDTElFTlQ+JiBkZXZpY2UpOwogCiAgICAgLy8gTG9jayBndWFyZGluZyBjYW1lcmEgc2VydmljZSBzdGF0ZQpAQCAtODMyLDEwICs4MzYsNiBAQAogICAgIC8vIFByaW50cyB0aGUgc2hlbGwgY29tbWFuZCBoZWxwCiAgICAgc3RhdHVzX3QgcHJpbnRIZWxwKGludCBvdXQpOwogCi0gICAgc3RhdGljIGludCBnZXRDYWxsaW5nUGlkKCk7Ci0KLSAgICBzdGF0aWMgaW50IGdldENhbGxpbmdVaWQoKTsKLQogICAgIC8qKgogICAgICAqIEdldCB0aGUgY3VycmVudCBzeXN0ZW0gdGltZSBhcyBhIGZvcm1hdHRlZCBzdHJpbmcuCiAgICAgICovCkBAIC04NDQsNyArODQ0LDcgQEAKICAgICBzdGF0aWMgYmluZGVyOjpTdGF0dXMgbWFrZUNsaWVudChjb25zdCBzcDxDYW1lcmFTZXJ2aWNlPiYgY2FtZXJhU2VydmljZSwKICAgICAgICAgICAgIGNvbnN0IHNwPElJbnRlcmZhY2U+JiBjYW1lcmFDYiwgY29uc3QgU3RyaW5nMTYmIHBhY2thZ2VOYW1lLCBjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwKICAgICAgICAgICAgIGludCBhcGkxQ2FtZXJhSWQsIGludCBmYWNpbmcsIGludCBjbGllbnRQaWQsIHVpZF90IGNsaWVudFVpZCwgaW50IHNlcnZpY2VQaWQsCi0gICAgICAgICAgICBib29sIGxlZ2FjeU1vZGUsIGludCBoYWxWZXJzaW9uLCBpbnQgZGV2aWNlVmVyc2lvbiwgYXBpTGV2ZWwgZWZmZWN0aXZlQXBpTGV2ZWwsCisgICAgICAgICAgICBpbnQgaGFsVmVyc2lvbiwgaW50IGRldmljZVZlcnNpb24sIGFwaUxldmVsIGVmZmVjdGl2ZUFwaUxldmVsLAogICAgICAgICAgICAgLypvdXQqL3NwPEJhc2ljQ2xpZW50PiogY2xpZW50KTsKIAogICAgIHN0YXR1c190IGNoZWNrQ2FtZXJhQWNjZXNzKGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL1RFU1RfTUFQUElORyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL1RFU1RfTUFQUElORwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZmRhYzY4Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvVEVTVF9NQVBQSU5HCkBAIC0wLDAgKzEsNyBAQAoreworICAicHJlc3VibWl0IjogWworICAgIHsKKyAgICAgICAibmFtZSI6ICJjYW1lcmFzZXJ2aWNlX3Rlc3QiCisgICAgfQorICBdCit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYTJDbGllbnQuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmEyQ2xpZW50LmNwcAppbmRleCA4YmIyNGQ0Li5jOWMyMTZiIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYTJDbGllbnQuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhMkNsaWVudC5jcHAKQEAgLTMzLDYgKzMzLDcgQEAKICNpbmNsdWRlICJhcGkxL2NsaWVudDIvQ2FwdHVyZVNlcXVlbmNlci5oIgogI2luY2x1ZGUgImFwaTEvY2xpZW50Mi9DYWxsYmFja1Byb2Nlc3Nvci5oIgogI2luY2x1ZGUgImFwaTEvY2xpZW50Mi9ac2xQcm9jZXNzb3IuaCIKKyNpbmNsdWRlICJ1dGlscy9DYW1lcmFUaHJlYWRTdGF0ZS5oIgogCiAjZGVmaW5lIEFMT0cxKC4uLikgQUxPR0RfSUYoZ0xvZ0xldmVsID49IDEsIF9fVkFfQVJHU19fKTsKICNkZWZpbmUgQUxPRzIoLi4uKSBBTE9HRF9JRihnTG9nTGV2ZWwgPj0gMiwgX19WQV9BUkdTX18pOwpAQCAtNDQsMTAgKzQ1LDYgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIHVzaW5nIG5hbWVzcGFjZSBjYW1lcmEyOwogCi1zdGF0aWMgaW50IGdldENhbGxpbmdQaWQoKSB7Ci0gICAgcmV0dXJuIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKTsKLX0KLQogLy8gSW50ZXJmYWNlIHVzZWQgYnkgQ2FtZXJhU2VydmljZQogCiBDYW1lcmEyQ2xpZW50OjpDYW1lcmEyQ2xpZW50KGNvbnN0IHNwPENhbWVyYVNlcnZpY2U+JiBjYW1lcmFTZXJ2aWNlLApAQCAtNTgsOCArNTUsNyBAQAogICAgICAgICBpbnQgY2FtZXJhRmFjaW5nLAogICAgICAgICBpbnQgY2xpZW50UGlkLAogICAgICAgICB1aWRfdCBjbGllbnRVaWQsCi0gICAgICAgIGludCBzZXJ2aWNlUGlkLAotICAgICAgICBib29sIGxlZ2FjeU1vZGUpOgorICAgICAgICBpbnQgc2VydmljZVBpZCk6CiAgICAgICAgIENhbWVyYTJDbGllbnRCYXNlKGNhbWVyYVNlcnZpY2UsIGNhbWVyYUNsaWVudCwgY2xpZW50UGFja2FnZU5hbWUsCiAgICAgICAgICAgICAgICAgY2FtZXJhRGV2aWNlSWQsIGFwaTFDYW1lcmFJZCwgY2FtZXJhRmFjaW5nLAogICAgICAgICAgICAgICAgIGNsaWVudFBpZCwgY2xpZW50VWlkLCBzZXJ2aWNlUGlkKSwKQEAgLTY5LDggKzY1LDYgQEAKIAogICAgIFNoYXJlZFBhcmFtZXRlcnM6OkxvY2sgbChtUGFyYW1ldGVycyk7CiAgICAgbC5tUGFyYW1ldGVycy5zdGF0ZSA9IFBhcmFtZXRlcnM6OkRJU0NPTk5FQ1RFRDsKLQotICAgIG1MZWdhY3lNb2RlID0gbGVnYWN5TW9kZTsKIH0KIAogc3RhdHVzX3QgQ2FtZXJhMkNsaWVudDo6aW5pdGlhbGl6ZShzcDxDYW1lcmFQcm92aWRlck1hbmFnZXI+IG1hbmFnZXIsIGNvbnN0IFN0cmluZzgmIG1vbml0b3JUYWdzKSB7CkBAIC00MDUsNyArMzk5LDcgQEAKIAogICAgIGJpbmRlcjo6U3RhdHVzIHJlcyA9IGJpbmRlcjo6U3RhdHVzOjpvaygpOwogICAgIC8vIEFsbG93IGJvdGggY2xpZW50IGFuZCB0aGUgY2FtZXJhc2VydmVyIHRvIGRpc2Nvbm5lY3QgYXQgYWxsIHRpbWVzCi0gICAgaW50IGNhbGxpbmdQaWQgPSBnZXRDYWxsaW5nUGlkKCk7CisgICAgaW50IGNhbGxpbmdQaWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpOwogICAgIGlmIChjYWxsaW5nUGlkICE9IG1DbGllbnRQaWQgJiYgY2FsbGluZ1BpZCAhPSBtU2VydmljZVBpZCkgcmV0dXJuIHJlczsKIAogICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiByZXM7CkBAIC00NjAsOCArNDU0LDYgQEAKIAogICAgIG1EZXZpY2UtPmRpc2Nvbm5lY3QoKTsKIAotICAgIG1EZXZpY2UuY2xlYXIoKTsKLQogICAgIENhbWVyYVNlcnZpY2U6OkNsaWVudDo6ZGlzY29ubmVjdCgpOwogCiAgICAgcmV0dXJuIHJlczsKQEAgLTQ3MiwxNCArNDY0LDE0IEBACiAgICAgQUxPR1YoIiVzOiBFIiwgX19GVU5DVElPTl9fKTsKICAgICBNdXRleDo6QXV0b2xvY2sgaWNsKG1CaW5kZXJTZXJpYWxpemF0aW9uTG9jayk7CiAKLSAgICBpZiAobUNsaWVudFBpZCAhPSAwICYmIGdldENhbGxpbmdQaWQoKSAhPSBtQ2xpZW50UGlkKSB7CisgICAgaWYgKG1DbGllbnRQaWQgIT0gMCAmJiBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpICE9IG1DbGllbnRQaWQpIHsKICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IENvbm5lY3Rpb24gYXR0ZW1wdCBmcm9tIHBpZCAlZDsgIgogICAgICAgICAgICAgICAgICJjdXJyZW50IGxvY2tlZCB0byBwaWQgJWQiLCBfX0ZVTkNUSU9OX18sCi0gICAgICAgICAgICAgICAgbUNhbWVyYUlkLCBnZXRDYWxsaW5nUGlkKCksIG1DbGllbnRQaWQpOworICAgICAgICAgICAgICAgIG1DYW1lcmFJZCwgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSwgbUNsaWVudFBpZCk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCi0gICAgbUNsaWVudFBpZCA9IGdldENhbGxpbmdQaWQoKTsKKyAgICBtQ2xpZW50UGlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKTsKIAogICAgIG1SZW1vdGVDYWxsYmFjayA9IGNsaWVudDsKICAgICBtU2hhcmVkQ2FtZXJhQ2FsbGJhY2tzID0gY2xpZW50OwpAQCAtNDkyLDE2ICs0ODQsMTYgQEAKICAgICBBTE9HVigiJXM6IEUiLCBfX0ZVTkNUSU9OX18pOwogICAgIE11dGV4OjpBdXRvbG9jayBpY2wobUJpbmRlclNlcmlhbGl6YXRpb25Mb2NrKTsKICAgICBBTE9HVigiJXM6IENhbWVyYSAlZDogTG9jayBjYWxsIGZyb20gcGlkICVkOyBjdXJyZW50IGNsaWVudCBwaWQgJWQiLAotICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQsIGdldENhbGxpbmdQaWQoKSwgbUNsaWVudFBpZCk7CisgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCwgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSwgbUNsaWVudFBpZCk7CiAKICAgICBpZiAobUNsaWVudFBpZCA9PSAwKSB7Ci0gICAgICAgIG1DbGllbnRQaWQgPSBnZXRDYWxsaW5nUGlkKCk7CisgICAgICAgIG1DbGllbnRQaWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpOwogICAgICAgICByZXR1cm4gT0s7CiAgICAgfQogCi0gICAgaWYgKG1DbGllbnRQaWQgIT0gZ2V0Q2FsbGluZ1BpZCgpKSB7CisgICAgaWYgKG1DbGllbnRQaWQgIT0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSkgewogICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogTG9jayBjYWxsIGZyb20gcGlkICVkOyBjdXJyZW50bHkgbG9ja2VkIHRvIHBpZCAlZCIsCi0gICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQsIGdldENhbGxpbmdQaWQoKSwgbUNsaWVudFBpZCk7CisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQsIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCksIG1DbGllbnRQaWQpOwogICAgICAgICByZXR1cm4gRUJVU1k7CiAgICAgfQogCkBAIC01MTMsOSArNTA1LDkgQEAKICAgICBBTE9HVigiJXM6IEUiLCBfX0ZVTkNUSU9OX18pOwogICAgIE11dGV4OjpBdXRvbG9jayBpY2wobUJpbmRlclNlcmlhbGl6YXRpb25Mb2NrKTsKICAgICBBTE9HVigiJXM6IENhbWVyYSAlZDogVW5sb2NrIGNhbGwgZnJvbSBwaWQgJWQ7IGN1cnJlbnQgY2xpZW50IHBpZCAlZCIsCi0gICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCwgZ2V0Q2FsbGluZ1BpZCgpLCBtQ2xpZW50UGlkKTsKKyAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkLCBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpLCBtQ2xpZW50UGlkKTsKIAotICAgIGlmIChtQ2xpZW50UGlkID09IGdldENhbGxpbmdQaWQoKSkgeworICAgIGlmIChtQ2xpZW50UGlkID09IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCkpIHsKICAgICAgICAgU2hhcmVkUGFyYW1ldGVyczo6TG9jayBsKG1QYXJhbWV0ZXJzKTsKICAgICAgICAgaWYgKGwubVBhcmFtZXRlcnMuc3RhdGUgPT0gUGFyYW1ldGVyczo6UkVDT1JEIHx8CiAgICAgICAgICAgICAgICAgbC5tUGFyYW1ldGVycy5zdGF0ZSA9PSBQYXJhbWV0ZXJzOjpWSURFT19TTkFQU0hPVCkgewpAQCAtNTI5LDcgKzUyMSw3IEBACiAgICAgfQogCiAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IFVubG9jayBjYWxsIGZyb20gcGlkICVkOyBjdXJyZW50bHkgbG9ja2VkIHRvIHBpZCAlZCIsCi0gICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCwgZ2V0Q2FsbGluZ1BpZCgpLCBtQ2xpZW50UGlkKTsKKyAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkLCBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpLCBtQ2xpZW50UGlkKTsKICAgICByZXR1cm4gRUJVU1k7CiB9CiAKQEAgLTE0NDcsMTMgKzE0MzksMTQgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IENhbWVyYTJDbGllbnQ6OnRha2VQaWN0dXJlKGludCBtc2dUeXBlKSB7CitzdGF0dXNfdCBDYW1lcmEyQ2xpZW50Ojp0YWtlUGljdHVyZShpbnQgLyptc2dUeXBlKi8pIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIE11dGV4OjpBdXRvbG9jayBpY2wobUJpbmRlclNlcmlhbGl6YXRpb25Mb2NrKTsKICAgICBzdGF0dXNfdCByZXM7CiAgICAgaWYgKCAocmVzID0gY2hlY2tQaWQoX19GVU5DVElPTl9fKSApICE9IE9LKSByZXR1cm4gcmVzOwogCiAgICAgaW50IHRha2VQaWN0dXJlQ291bnRlcjsKKyAgICBib29sIHNob3VsZFN5bmNXaXRoRGV2aWNlID0gdHJ1ZTsKICAgICB7CiAgICAgICAgIFNoYXJlZFBhcmFtZXRlcnM6OkxvY2sgbChtUGFyYW1ldGVycyk7CiAgICAgICAgIHN3aXRjaCAobC5tUGFyYW1ldGVycy5zdGF0ZSkgewpAQCAtMTUzOSwxNCArMTUzMiwyNSBAQAogICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCk7CiAgICAgICAgICAgICBtWnNsUHJvY2Vzc29yLT5jbGVhclpzbFF1ZXVlKCk7CiAgICAgICAgIH0KKworICAgICAgICAvLyBXZSBzaG91bGQgYWx3YXlzIHN5bmMgd2l0aCB0aGUgZGV2aWNlIGluIGNhc2UgZmxhc2ggaXMgdHVybmVkIG9uLAorICAgICAgICAvLyB0aGUgY2FtZXJhIGRldmljZSBzdWdnZXN0cyB0aGF0IGZsYXNoIGlzIG5lZWRlZCAoQUUgc3RhdGUgRkxBU0hfUkVRVUlSRUQpCisgICAgICAgIC8vIG9yIHdlIGFyZSBpbiBzb21lIG90aGVyIEFFIHN0YXRlIGRpZmZlcmVudCBmcm9tIENPTlZFUkdFRCB0aGF0IG1heSBuZWVkCisgICAgICAgIC8vIHByZWNhcHR1cmUgdHJpZ2dlci4KKyAgICAgICAgaWYgKGwubVBhcmFtZXRlcnMuZmxhc2hNb2RlICE9IFBhcmFtZXRlcnM6OkZMQVNIX01PREVfT04gJiYKKyAgICAgICAgICAgICAgICAobC5tUGFyYW1ldGVycy5hZVN0YXRlID09IEFORFJPSURfQ09OVFJPTF9BRV9TVEFURV9DT05WRVJHRUQpKSB7CisgICAgICAgICAgICBzaG91bGRTeW5jV2l0aERldmljZSAgPSBmYWxzZTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIEFUUkFDRV9BU1lOQ19CRUdJTihrVGFrZXBpY3R1cmVMYWJlbCwgdGFrZVBpY3R1cmVDb3VudGVyKTsKIAotICAgIC8vIE5lZWQgSEFMIHRvIGhhdmUgY29ycmVjdCBzZXR0aW5ncyBiZWZvcmUgKHBvc3NpYmx5KSB0cmlnZ2VyaW5nIHByZWNhcHR1cmUKLSAgICBzeW5jV2l0aERldmljZSgpOworICAgIC8vIE1ha2Ugc3VyZSBIQUwgaGFzIGNvcnJlY3Qgc2V0dGluZ3MgaW4gY2FzZSBwcmVjYXB0dXJlIHRyaWdnZXIgaXMgbmVlZGVkLgorICAgIGlmIChzaG91bGRTeW5jV2l0aERldmljZSkgeworICAgICAgICBzeW5jV2l0aERldmljZSgpOworICAgIH0KIAotICAgIHJlcyA9IG1DYXB0dXJlU2VxdWVuY2VyLT5zdGFydENhcHR1cmUobXNnVHlwZSk7CisgICAgcmVzID0gbUNhcHR1cmVTZXF1ZW5jZXItPnN0YXJ0Q2FwdHVyZSgpOwogICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IFVuYWJsZSB0byBzdGFydCBjYXB0dXJlOiAlcyAoJWQpIiwKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CkBAIC0xNTgzLDcgKzE1ODcsNyBAQAogICAgIEFMT0dWKCIlczogQ2FtZXJhICVkIiwgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQpOwogICAgIE11dGV4OjpBdXRvbG9jayBpY2wobUJpbmRlclNlcmlhbGl6YXRpb25Mb2NrKTsKICAgICAvLyBUaGUgY2FtZXJhIHNlcnZpY2UgY2FuIHVuY29uZGl0aW9uYWxseSBnZXQgdGhlIHBhcmFtZXRlcnMgYXQgYWxsIHRpbWVzCi0gICAgaWYgKGdldENhbGxpbmdQaWQoKSAhPSBtU2VydmljZVBpZCAmJiBjaGVja1BpZChfX0ZVTkNUSU9OX18pICE9IE9LKSByZXR1cm4gU3RyaW5nOCgpOworICAgIGlmIChDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpICE9IG1TZXJ2aWNlUGlkICYmIGNoZWNrUGlkKF9fRlVOQ1RJT05fXykgIT0gT0spIHJldHVybiBTdHJpbmc4KCk7CiAKICAgICBTaGFyZWRQYXJhbWV0ZXJzOjpSZWFkTG9jayBsKG1QYXJhbWV0ZXJzKTsKIApAQCAtMTY2NiwyNyArMTY3MCw2IEBACiAgICAgICAgIHJldHVybiBPSzsKICAgICB9CiAKLSAgICAvLyB0aGUgY2FtZXJhMiBhcGkgbGVnYWN5IG1vZGUgY2FuIHVuY29uZGl0aW9uYWxseSBkaXNhYmxlIHRoZSBzaHV0dGVyIHNvdW5kCi0gICAgaWYgKG1MZWdhY3lNb2RlKSB7Ci0gICAgICAgIEFMT0dWKCIlczogRGlzYWJsZSBzaHV0dGVyIHNvdW5kIGluIGxlZ2FjeSBtb2RlIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgbC5tUGFyYW1ldGVycy5wbGF5U2h1dHRlclNvdW5kID0gZmFsc2U7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0KLSAgICAvLyBEaXNhYmxpbmcgc2h1dHRlciBzb3VuZCBtYXkgbm90IGJlIGFsbG93ZWQuIEluIHRoYXQgY2FzZSBvbmx5Ci0gICAgLy8gYWxsb3cgdGhlIG1lZGlhc2VydmVyIHByb2Nlc3MgdG8gZGlzYWJsZSB0aGUgc291bmQuCi0gICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOwotICAgIHByb3BlcnR5X2dldCgicm8uY2FtZXJhLnNvdW5kLmZvcmNlZCIsIHZhbHVlLCAiMCIpOwotICAgIGlmIChzdHJuY21wKHZhbHVlLCAiMCIsIDIpICE9IDApIHsKLSAgICAgICAgLy8gRGlzYWJsaW5nIHNodXR0ZXIgc291bmQgaXMgbm90IGFsbG93ZWQuIERlbnkgaWYgdGhlIGN1cnJlbnQKLSAgICAgICAgLy8gcHJvY2VzcyBpcyBub3QgbWVkaWFzZXJ2ZXIuCi0gICAgICAgIGlmIChnZXRDYWxsaW5nUGlkKCkgIT0gZ2V0cGlkKCkpIHsKLSAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZGlzYWJsZSBzaHV0dGVyIHNvdW5kLiBQZXJtaXNzaW9uIGRlbmllZCAocGlkICVkKSIsCi0gICAgICAgICAgICAgICAgICAgIGdldENhbGxpbmdQaWQoKSk7Ci0gICAgICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICBsLm1QYXJhbWV0ZXJzLnBsYXlTaHV0dGVyU291bmQgPSBmYWxzZTsKICAgICByZXR1cm4gT0s7CiB9CkBAIC0xOTM0LDYgKzE5MTcsMTEgQEAKIHZvaWQgQ2FtZXJhMkNsaWVudDo6bm90aWZ5QXV0b0V4cG9zdXJlKHVpbnQ4X3QgbmV3U3RhdGUsIGludCB0cmlnZ2VySWQpIHsKICAgICBBTE9HVigiJXM6IEF1dG9leHBvc3VyZSBzdGF0ZSBub3cgJWQsIGxhc3QgdHJpZ2dlciAlZCIsCiAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG5ld1N0YXRlLCB0cmlnZ2VySWQpOworICAgIHsKKyAgICAgICAgU2hhcmVkUGFyYW1ldGVyczo6TG9jayBsKG1QYXJhbWV0ZXJzKTsKKyAgICAgICAgLy8gVXBkYXRlIHN0YXRlCisgICAgICAgIGwubVBhcmFtZXRlcnMuYWVTdGF0ZSA9IG5ld1N0YXRlOworICAgIH0KICAgICBtQ2FwdHVyZVNlcXVlbmNlci0+bm90aWZ5QXV0b0V4cG9zdXJlKG5ld1N0YXRlLCB0cmlnZ2VySWQpOwogfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYTJDbGllbnQuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhMkNsaWVudC5oCmluZGV4IDQ0OTI5YzMuLmE5ZWEyNzEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhMkNsaWVudC5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhMkNsaWVudC5oCkBAIC05Niw4ICs5Niw3IEBACiAgICAgICAgICAgICBpbnQgY2FtZXJhRmFjaW5nLAogICAgICAgICAgICAgaW50IGNsaWVudFBpZCwKICAgICAgICAgICAgIHVpZF90IGNsaWVudFVpZCwKLSAgICAgICAgICAgIGludCBzZXJ2aWNlUGlkLAotICAgICAgICAgICAgYm9vbCBsZWdhY3lNb2RlKTsKKyAgICAgICAgICAgIGludCBzZXJ2aWNlUGlkKTsKIAogICAgIHZpcnR1YWwgfkNhbWVyYTJDbGllbnQoKTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmFDbGllbnQuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmFDbGllbnQuY3BwCmluZGV4IGYxMjAzZjkuLmQ2NWFjN2IgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhQ2xpZW50LmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYUNsaWVudC5jcHAKQEAgLTI1LDI3ICsyNSwyNCBAQAogI2luY2x1ZGUgImFwaTEvQ2FtZXJhQ2xpZW50LmgiCiAjaW5jbHVkZSAiZGV2aWNlMS9DYW1lcmFIYXJkd2FyZUludGVyZmFjZS5oIgogI2luY2x1ZGUgIkNhbWVyYVNlcnZpY2UuaCIKKyNpbmNsdWRlICJ1dGlscy9DYW1lcmFUaHJlYWRTdGF0ZS5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKICNkZWZpbmUgTE9HMSguLi4pIEFMT0dEX0lGKGdMb2dMZXZlbCA+PSAxLCBfX1ZBX0FSR1NfXyk7CiAjZGVmaW5lIExPRzIoLi4uKSBBTE9HRF9JRihnTG9nTGV2ZWwgPj0gMiwgX19WQV9BUkdTX18pOwogCi1zdGF0aWMgaW50IGdldENhbGxpbmdQaWQoKSB7Ci0gICAgcmV0dXJuIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKTsKLX0KLQogQ2FtZXJhQ2xpZW50OjpDYW1lcmFDbGllbnQoY29uc3Qgc3A8Q2FtZXJhU2VydmljZT4mIGNhbWVyYVNlcnZpY2UsCiAgICAgICAgIGNvbnN0IHNwPGhhcmR3YXJlOjpJQ2FtZXJhQ2xpZW50PiYgY2FtZXJhQ2xpZW50LAogICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsCiAgICAgICAgIGludCBjYW1lcmFJZCwgaW50IGNhbWVyYUZhY2luZywKICAgICAgICAgaW50IGNsaWVudFBpZCwgaW50IGNsaWVudFVpZCwKLSAgICAgICAgaW50IHNlcnZpY2VQaWQsIGJvb2wgbGVnYWN5TW9kZSk6CisgICAgICAgIGludCBzZXJ2aWNlUGlkKToKICAgICAgICAgQ2xpZW50KGNhbWVyYVNlcnZpY2UsIGNhbWVyYUNsaWVudCwgY2xpZW50UGFja2FnZU5hbWUsCiAgICAgICAgICAgICAgICAgU3RyaW5nODo6Zm9ybWF0KCIlZCIsIGNhbWVyYUlkKSwgY2FtZXJhSWQsIGNhbWVyYUZhY2luZywgY2xpZW50UGlkLAogICAgICAgICAgICAgICAgIGNsaWVudFVpZCwgc2VydmljZVBpZCkKIHsKLSAgICBpbnQgY2FsbGluZ1BpZCA9IGdldENhbGxpbmdQaWQoKTsKKyAgICBpbnQgY2FsbGluZ1BpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCk7CiAgICAgTE9HMSgiQ2FtZXJhQ2xpZW50OjpDYW1lcmFDbGllbnQgRSAocGlkICVkLCBpZCAlZCkiLCBjYWxsaW5nUGlkLCBjYW1lcmFJZCk7CiAKICAgICBtSGFyZHdhcmUgPSBOVUxMOwpAQCAtNTcsMTQgKzU0LDEzIEBACiAgICAgLy8gQ2FsbGJhY2sgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdAogICAgIG1QcmV2aWV3Q2FsbGJhY2tGbGFnID0gQ0FNRVJBX0ZSQU1FX0NBTExCQUNLX0ZMQUdfTk9PUDsKICAgICBtT3JpZW50YXRpb24gPSBnZXRPcmllbnRhdGlvbigwLCBtQ2FtZXJhRmFjaW5nID09IENBTUVSQV9GQUNJTkdfRlJPTlQpOwotICAgIG1MZWdhY3lNb2RlID0gbGVnYWN5TW9kZTsKICAgICBtUGxheVNodXR0ZXJTb3VuZCA9IHRydWU7CiAgICAgTE9HMSgiQ2FtZXJhQ2xpZW50OjpDYW1lcmFDbGllbnQgWCAocGlkICVkLCBpZCAlZCkiLCBjYWxsaW5nUGlkLCBjYW1lcmFJZCk7CiB9CiAKIHN0YXR1c190IENhbWVyYUNsaWVudDo6aW5pdGlhbGl6ZShzcDxDYW1lcmFQcm92aWRlck1hbmFnZXI+IG1hbmFnZXIsCiAgICAgICAgIGNvbnN0IFN0cmluZzgmIC8qbW9uaXRvclRhZ3MqLykgewotICAgIGludCBjYWxsaW5nUGlkID0gZ2V0Q2FsbGluZ1BpZCgpOworICAgIGludCBjYWxsaW5nUGlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKTsKICAgICBzdGF0dXNfdCByZXM7CiAKICAgICBMT0cxKCJDYW1lcmFDbGllbnQ6OmluaXRpYWxpemUgRSAocGlkICVkLCBpZCAlZCkiLCBjYWxsaW5nUGlkLCBtQ2FtZXJhSWQpOwpAQCAtMTA1LDcgKzEwMSw3IEBACiAvLyB0ZWFyIGRvd24gdGhlIGNsaWVudAogQ2FtZXJhQ2xpZW50Ojp+Q2FtZXJhQ2xpZW50KCkgewogICAgIG1EZXN0cnVjdGlvblN0YXJ0ZWQgPSB0cnVlOwotICAgIGludCBjYWxsaW5nUGlkID0gZ2V0Q2FsbGluZ1BpZCgpOworICAgIGludCBjYWxsaW5nUGlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKTsKICAgICBMT0cxKCJDYW1lcmFDbGllbnQ6On5DYW1lcmFDbGllbnQgRSAocGlkICVkLCB0aGlzICVwKSIsIGNhbGxpbmdQaWQsIHRoaXMpOwogCiAgICAgZGlzY29ubmVjdCgpOwpAQCAtMTQ4LDcgKzE0NCw3IEBACiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIHN0YXR1c190IENhbWVyYUNsaWVudDo6Y2hlY2tQaWQoKSBjb25zdCB7Ci0gICAgaW50IGNhbGxpbmdQaWQgPSBnZXRDYWxsaW5nUGlkKCk7CisgICAgaW50IGNhbGxpbmdQaWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpOwogICAgIGlmIChjYWxsaW5nUGlkID09IG1DbGllbnRQaWQpIHJldHVybiBOT19FUlJPUjsKIAogICAgIEFMT0dXKCJhdHRlbXB0IHRvIHVzZSBhIGxvY2tlZCBjYW1lcmEgZnJvbSBhIGRpZmZlcmVudCBwcm9jZXNzIgpAQCAtMTU4LDcgKzE1NCw4IEBACiAKIHN0YXR1c190IENhbWVyYUNsaWVudDo6Y2hlY2tQaWRBbmRIYXJkd2FyZSgpIGNvbnN0IHsKICAgICBpZiAobUhhcmR3YXJlID09IDApIHsKLSAgICAgICAgQUxPR0UoImF0dGVtcHQgdG8gdXNlIGEgY2FtZXJhIGFmdGVyIGRpc2Nvbm5lY3QoKSAocGlkICVkKSIsIGdldENhbGxpbmdQaWQoKSk7CisgICAgICAgIEFMT0dFKCJhdHRlbXB0IHRvIHVzZSBhIGNhbWVyYSBhZnRlciBkaXNjb25uZWN0KCkgKHBpZCAlZCkiLAorICAgICAgICAgICAgICBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpKTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KICAgICBzdGF0dXNfdCByZXN1bHQgPSBjaGVja1BpZCgpOwpAQCAtMTY3LDcgKzE2NCw3IEBACiB9CiAKIHN0YXR1c190IENhbWVyYUNsaWVudDo6bG9jaygpIHsKLSAgICBpbnQgY2FsbGluZ1BpZCA9IGdldENhbGxpbmdQaWQoKTsKKyAgICBpbnQgY2FsbGluZ1BpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCk7CiAgICAgTE9HMSgibG9jayAocGlkICVkKSIsIGNhbGxpbmdQaWQpOwogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKIApAQCAtMTgyLDcgKzE3OSw3IEBACiB9CiAKIHN0YXR1c190IENhbWVyYUNsaWVudDo6dW5sb2NrKCkgewotICAgIGludCBjYWxsaW5nUGlkID0gZ2V0Q2FsbGluZ1BpZCgpOworICAgIGludCBjYWxsaW5nUGlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKTsKICAgICBMT0cxKCJ1bmxvY2sgKHBpZCAlZCkiLCBjYWxsaW5nUGlkKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CiAKQEAgLTIwNCw3ICsyMDEsNyBAQAogCiAvLyBjb25uZWN0IGEgbmV3IGNsaWVudCB0byB0aGUgY2FtZXJhCiBzdGF0dXNfdCBDYW1lcmFDbGllbnQ6OmNvbm5lY3QoY29uc3Qgc3A8aGFyZHdhcmU6OklDYW1lcmFDbGllbnQ+JiBjbGllbnQpIHsKLSAgICBpbnQgY2FsbGluZ1BpZCA9IGdldENhbGxpbmdQaWQoKTsKKyAgICBpbnQgY2FsbGluZ1BpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCk7CiAgICAgTE9HMSgiY29ubmVjdCBFIChwaWQgJWQpIiwgY2FsbGluZ1BpZCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwogCkBAIC0yNDAsNyArMjM3LDcgQEAKIH0KIAogYmluZGVyOjpTdGF0dXMgQ2FtZXJhQ2xpZW50OjpkaXNjb25uZWN0KCkgewotICAgIGludCBjYWxsaW5nUGlkID0gZ2V0Q2FsbGluZ1BpZCgpOworICAgIGludCBjYWxsaW5nUGlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKTsKICAgICBMT0cxKCJkaXNjb25uZWN0IEUgKHBpZCAlZCkiLCBjYWxsaW5nUGlkKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CiAKQEAgLTMzNCw3ICszMzEsNyBAQAogc3RhdHVzX3QgQ2FtZXJhQ2xpZW50OjpzZXRQcmV2aWV3VGFyZ2V0KAogICAgICAgICBjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgYnVmZmVyUHJvZHVjZXIpIHsKICAgICBMT0cxKCJzZXRQcmV2aWV3VGFyZ2V0KCVwKSAocGlkICVkKSIsIGJ1ZmZlclByb2R1Y2VyLmdldCgpLAotICAgICAgICAgICAgZ2V0Q2FsbGluZ1BpZCgpKTsKKyAgICAgICAgICAgIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCkpOwogCiAgICAgc3A8SUJpbmRlcj4gYmluZGVyOwogICAgIHNwPEFOYXRpdmVXaW5kb3c+IHdpbmRvdzsKQEAgLTM1MSw3ICszNDgsNyBAQAogLy8gc2V0IHRoZSBwcmV2aWV3IGNhbGxiYWNrIGZsYWcgdG8gYWZmZWN0IGhvdyB0aGUgcmVjZWl2ZWQgZnJhbWVzIGZyb20KIC8vIHByZXZpZXcgYXJlIGhhbmRsZWQuCiB2b2lkIENhbWVyYUNsaWVudDo6c2V0UHJldmlld0NhbGxiYWNrRmxhZyhpbnQgY2FsbGJhY2tfZmxhZykgewotICAgIExPRzEoInNldFByZXZpZXdDYWxsYmFja0ZsYWcoJWQpIChwaWQgJWQpIiwgY2FsbGJhY2tfZmxhZywgZ2V0Q2FsbGluZ1BpZCgpKTsKKyAgICBMT0cxKCJzZXRQcmV2aWV3Q2FsbGJhY2tGbGFnKCVkKSAocGlkICVkKSIsIGNhbGxiYWNrX2ZsYWcsIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCkpOwogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKICAgICBpZiAoY2hlY2tQaWRBbmRIYXJkd2FyZSgpICE9IE5PX0VSUk9SKSByZXR1cm47CiAKQEAgLTM3MiwxMyArMzY5LDEzIEBACiAKIC8vIHN0YXJ0IHByZXZpZXcgbW9kZQogc3RhdHVzX3QgQ2FtZXJhQ2xpZW50OjpzdGFydFByZXZpZXcoKSB7Ci0gICAgTE9HMSgic3RhcnRQcmV2aWV3IChwaWQgJWQpIiwgZ2V0Q2FsbGluZ1BpZCgpKTsKKyAgICBMT0cxKCJzdGFydFByZXZpZXcgKHBpZCAlZCkiLCBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpKTsKICAgICByZXR1cm4gc3RhcnRDYW1lcmFNb2RlKENBTUVSQV9QUkVWSUVXX01PREUpOwogfQogCiAvLyBzdGFydCByZWNvcmRpbmcgbW9kZQogc3RhdHVzX3QgQ2FtZXJhQ2xpZW50OjpzdGFydFJlY29yZGluZygpIHsKLSAgICBMT0cxKCJzdGFydFJlY29yZGluZyAocGlkICVkKSIsIGdldENhbGxpbmdQaWQoKSk7CisgICAgTE9HMSgic3RhcnRSZWNvcmRpbmcgKHBpZCAlZCkiLCBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpKTsKICAgICByZXR1cm4gc3RhcnRDYW1lcmFNb2RlKENBTUVSQV9SRUNPUkRJTkdfTU9ERSk7CiB9CiAKQEAgLTQ2MSw3ICs0NTgsNyBAQAogCiAvLyBzdG9wIHByZXZpZXcgbW9kZQogdm9pZCBDYW1lcmFDbGllbnQ6OnN0b3BQcmV2aWV3KCkgewotICAgIExPRzEoInN0b3BQcmV2aWV3IChwaWQgJWQpIiwgZ2V0Q2FsbGluZ1BpZCgpKTsKKyAgICBMT0cxKCJzdG9wUHJldmlldyAocGlkICVkKSIsIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCkpOwogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKICAgICBpZiAoY2hlY2tQaWRBbmRIYXJkd2FyZSgpICE9IE5PX0VSUk9SKSByZXR1cm47CiAKQEAgLTQ3Nyw3ICs0NzQsNyBAQAogCiAvLyBzdG9wIHJlY29yZGluZyBtb2RlCiB2b2lkIENhbWVyYUNsaWVudDo6c3RvcFJlY29yZGluZygpIHsKLSAgICBMT0cxKCJzdG9wUmVjb3JkaW5nIChwaWQgJWQpIiwgZ2V0Q2FsbGluZ1BpZCgpKTsKKyAgICBMT0cxKCJzdG9wUmVjb3JkaW5nIChwaWQgJWQpIiwgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSk7CiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CiAgICAgICAgIGlmIChjaGVja1BpZEFuZEhhcmR3YXJlKCkgIT0gTk9fRVJST1IpIHJldHVybjsKQEAgLTUwMyw3ICs1MDAsNyBAQAogICAgIGlmIChjaGVja1BpZEFuZEhhcmR3YXJlKCkgIT0gTk9fRVJST1IpIHJldHVybjsKICAgICBpZiAobWVtID09IG51bGxwdHIpIHsKICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlV2l0aEluZm9Mb2coQ2FtZXJhU2VydmljZTo6U05fRVZFTlRfTE9HX0lELCAiMjYxNjQyNzIiLAotICAgICAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSwgbnVsbHB0ciwgMCk7CisgICAgICAgICAgICAgICAgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdVaWQoKSwgbnVsbHB0ciwgMCk7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKQEAgLTYxNSw3ICs2MTIsNyBAQAogfQogCiBib29sIENhbWVyYUNsaWVudDo6cHJldmlld0VuYWJsZWQoKSB7Ci0gICAgTE9HMSgicHJldmlld0VuYWJsZWQgKHBpZCAlZCkiLCBnZXRDYWxsaW5nUGlkKCkpOworICAgIExPRzEoInByZXZpZXdFbmFibGVkIChwaWQgJWQpIiwgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSk7CiAKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CiAgICAgaWYgKGNoZWNrUGlkQW5kSGFyZHdhcmUoKSAhPSBOT19FUlJPUikgcmV0dXJuIGZhbHNlOwpAQCAtNjIzLDcgKzYyMCw3IEBACiB9CiAKIGJvb2wgQ2FtZXJhQ2xpZW50OjpyZWNvcmRpbmdFbmFibGVkKCkgewotICAgIExPRzEoInJlY29yZGluZ0VuYWJsZWQgKHBpZCAlZCkiLCBnZXRDYWxsaW5nUGlkKCkpOworICAgIExPRzEoInJlY29yZGluZ0VuYWJsZWQgKHBpZCAlZCkiLCBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpKTsKIAogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKICAgICBpZiAoY2hlY2tQaWRBbmRIYXJkd2FyZSgpICE9IE5PX0VSUk9SKSByZXR1cm4gZmFsc2U7CkBAIC02MzEsNyArNjI4LDcgQEAKIH0KIAogc3RhdHVzX3QgQ2FtZXJhQ2xpZW50OjphdXRvRm9jdXMoKSB7Ci0gICAgTE9HMSgiYXV0b0ZvY3VzIChwaWQgJWQpIiwgZ2V0Q2FsbGluZ1BpZCgpKTsKKyAgICBMT0cxKCJhdXRvRm9jdXMgKHBpZCAlZCkiLCBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpKTsKIAogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKICAgICBzdGF0dXNfdCByZXN1bHQgPSBjaGVja1BpZEFuZEhhcmR3YXJlKCk7CkBAIC02NDEsNyArNjM4LDcgQEAKIH0KIAogc3RhdHVzX3QgQ2FtZXJhQ2xpZW50OjpjYW5jZWxBdXRvRm9jdXMoKSB7Ci0gICAgTE9HMSgiY2FuY2VsQXV0b0ZvY3VzIChwaWQgJWQpIiwgZ2V0Q2FsbGluZ1BpZCgpKTsKKyAgICBMT0cxKCJjYW5jZWxBdXRvRm9jdXMgKHBpZCAlZCkiLCBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpKTsKIAogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKICAgICBzdGF0dXNfdCByZXN1bHQgPSBjaGVja1BpZEFuZEhhcmR3YXJlKCk7CkBAIC02NTIsNyArNjQ5LDcgQEAKIAogLy8gdGFrZSBhIHBpY3R1cmUgLSBpbWFnZSBpcyByZXR1cm5lZCBpbiBjYWxsYmFjawogc3RhdHVzX3QgQ2FtZXJhQ2xpZW50Ojp0YWtlUGljdHVyZShpbnQgbXNnVHlwZSkgewotICAgIExPRzEoInRha2VQaWN0dXJlIChwaWQgJWQpOiAweCV4IiwgZ2V0Q2FsbGluZ1BpZCgpLCBtc2dUeXBlKTsKKyAgICBMT0cxKCJ0YWtlUGljdHVyZSAocGlkICVkKTogMHgleCIsIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCksIG1zZ1R5cGUpOwogCiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwogICAgIHN0YXR1c190IHJlc3VsdCA9IGNoZWNrUGlkQW5kSGFyZHdhcmUoKTsKQEAgLTY4MSw3ICs2NzgsNyBAQAogCiAvLyBzZXQgcHJldmlldy9jYXB0dXJlIHBhcmFtZXRlcnMgLSBrZXkvdmFsdWUgcGFpcnMKIHN0YXR1c190IENhbWVyYUNsaWVudDo6c2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBwYXJhbXMpIHsKLSAgICBMT0cxKCJzZXRQYXJhbWV0ZXJzIChwaWQgJWQpICglcykiLCBnZXRDYWxsaW5nUGlkKCksIHBhcmFtcy5zdHJpbmcoKSk7CisgICAgTE9HMSgic2V0UGFyYW1ldGVycyAocGlkICVkKSAoJXMpIiwgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSwgcGFyYW1zLnN0cmluZygpKTsKIAogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKICAgICBzdGF0dXNfdCByZXN1bHQgPSBjaGVja1BpZEFuZEhhcmR3YXJlKCk7CkBAIC02OTYsMTYgKzY5MywxOCBAQAogU3RyaW5nOCBDYW1lcmFDbGllbnQ6OmdldFBhcmFtZXRlcnMoKSBjb25zdCB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwogICAgIC8vIFRoZSBjYW1lcmEgc2VydmljZSBjYW4gdW5jb25kaXRpb25hbGx5IGdldCB0aGUgcGFyYW1ldGVycyBhdCBhbGwgdGltZXMKLSAgICBpZiAoZ2V0Q2FsbGluZ1BpZCgpICE9IG1TZXJ2aWNlUGlkICYmIGNoZWNrUGlkQW5kSGFyZHdhcmUoKSAhPSBOT19FUlJPUikgcmV0dXJuIFN0cmluZzgoKTsKKyAgICBpZiAoQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSAhPSBtU2VydmljZVBpZCAmJiBjaGVja1BpZEFuZEhhcmR3YXJlKCkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZzgoKTsKKyAgICB9CiAKICAgICBTdHJpbmc4IHBhcmFtcyhtSGFyZHdhcmUtPmdldFBhcmFtZXRlcnMoKS5mbGF0dGVuKCkpOwotICAgIExPRzEoImdldFBhcmFtZXRlcnMgKHBpZCAlZCkgKCVzKSIsIGdldENhbGxpbmdQaWQoKSwgcGFyYW1zLnN0cmluZygpKTsKKyAgICBMT0cxKCJnZXRQYXJhbWV0ZXJzIChwaWQgJWQpICglcykiLCBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpLCBwYXJhbXMuc3RyaW5nKCkpOwogICAgIHJldHVybiBwYXJhbXM7CiB9CiAKIC8vIGVuYWJsZSBzaHV0dGVyIHNvdW5kCiBzdGF0dXNfdCBDYW1lcmFDbGllbnQ6OmVuYWJsZVNodXR0ZXJTb3VuZChib29sIGVuYWJsZSkgewotICAgIExPRzEoImVuYWJsZVNodXR0ZXJTb3VuZCAocGlkICVkKSIsIGdldENhbGxpbmdQaWQoKSk7CisgICAgTE9HMSgiZW5hYmxlU2h1dHRlclNvdW5kIChwaWQgJWQpIiwgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSk7CiAKICAgICBzdGF0dXNfdCByZXN1bHQgPSBjaGVja1BpZEFuZEhhcmR3YXJlKCk7CiAgICAgaWYgKHJlc3VsdCAhPSBOT19FUlJPUikgcmV0dXJuIHJlc3VsdDsKQEAgLTcxNSwzMiArNzE0LDEyIEBACiAgICAgICAgIHJldHVybiBPSzsKICAgICB9CiAKLSAgICAvLyB0aGUgY2FtZXJhMiBhcGkgbGVnYWN5IG1vZGUgY2FuIHVuY29uZGl0aW9uYWxseSBkaXNhYmxlIHRoZSBzaHV0dGVyIHNvdW5kCi0gICAgaWYgKG1MZWdhY3lNb2RlKSB7Ci0gICAgICAgIEFMT0dWKCIlczogRGlzYWJsZSBzaHV0dGVyIHNvdW5kIGluIGxlZ2FjeSBtb2RlIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgbVBsYXlTaHV0dGVyU291bmQgPSBmYWxzZTsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQotICAgIC8vIERpc2FibGluZyBzaHV0dGVyIHNvdW5kIG1heSBub3QgYmUgYWxsb3dlZC4gSW4gdGhhdCBjYXNlIG9ubHkKLSAgICAvLyBhbGxvdyB0aGUgbWVkaWFzZXJ2ZXIgcHJvY2VzcyB0byBkaXNhYmxlIHRoZSBzb3VuZC4KLSAgICBjaGFyIHZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07Ci0gICAgcHJvcGVydHlfZ2V0KCJyby5jYW1lcmEuc291bmQuZm9yY2VkIiwgdmFsdWUsICIwIik7Ci0gICAgaWYgKHN0cmNtcCh2YWx1ZSwgIjAiKSAhPSAwKSB7Ci0gICAgICAgIC8vIERpc2FibGluZyBzaHV0dGVyIHNvdW5kIGlzIG5vdCBhbGxvd2VkLiBEZW55IGlmIHRoZSBjdXJyZW50Ci0gICAgICAgIC8vIHByb2Nlc3MgaXMgbm90IG1lZGlhc2VydmVyLgotICAgICAgICBpZiAoZ2V0Q2FsbGluZ1BpZCgpICE9IGdldHBpZCgpKSB7Ci0gICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGRpc2FibGUgc2h1dHRlciBzb3VuZC4gUGVybWlzc2lvbiBkZW5pZWQgKHBpZCAlZCkiLCBnZXRDYWxsaW5nUGlkKCkpOwotICAgICAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgICAgICB9Ci0gICAgfQotCiAgICAgbVBsYXlTaHV0dGVyU291bmQgPSBmYWxzZTsKICAgICByZXR1cm4gT0s7CiB9CiAKIHN0YXR1c190IENhbWVyYUNsaWVudDo6c2VuZENvbW1hbmQoaW50MzJfdCBjbWQsIGludDMyX3QgYXJnMSwgaW50MzJfdCBhcmcyKSB7Ci0gICAgTE9HMSgic2VuZENvbW1hbmQgKHBpZCAlZCkiLCBnZXRDYWxsaW5nUGlkKCkpOworICAgIExPRzEoInNlbmRDb21tYW5kIChwaWQgJWQpIiwgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSk7CiAgICAgaW50IG9yaWVudGF0aW9uOwogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKICAgICBzdGF0dXNfdCByZXN1bHQgPSBjaGVja1BpZEFuZEhhcmR3YXJlKCk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYUNsaWVudC5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmFDbGllbnQuaAppbmRleCAxOTEwNTM2Li45NTMwYjZjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYUNsaWVudC5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhQ2xpZW50LmgKQEAgLTY4LDggKzY4LDcgQEAKICAgICAgICAgICAgIGludCBjYW1lcmFGYWNpbmcsCiAgICAgICAgICAgICBpbnQgY2xpZW50UGlkLAogICAgICAgICAgICAgaW50IGNsaWVudFVpZCwKLSAgICAgICAgICAgIGludCBzZXJ2aWNlUGlkLAotICAgICAgICAgICAgYm9vbCBsZWdhY3lNb2RlID0gZmFsc2UpOworICAgICAgICAgICAgaW50IHNlcnZpY2VQaWQpOwogICAgIH5DYW1lcmFDbGllbnQoKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdGlhbGl6ZShzcDxDYW1lcmFQcm92aWRlck1hbmFnZXI+IG1hbmFnZXIsCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvQ2FwdHVyZVNlcXVlbmNlci5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvQ2FwdHVyZVNlcXVlbmNlci5jcHAKaW5kZXggYTliMmU3NS4uOTdmN2ZkYyAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0NhcHR1cmVTZXF1ZW5jZXIuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9DYXB0dXJlU2VxdWVuY2VyLmNwcApAQCAtNTAsOCArNTAsNyBAQAogICAgICAgICBtU3RhdGVUcmFuc2l0aW9uQ291bnQoMCksCiAgICAgICAgIG1UcmlnZ2VySWQoMCksCiAgICAgICAgIG1UaW1lb3V0Q291bnQoMCksCi0gICAgICAgIG1DYXB0dXJlSWQoQ2FtZXJhMkNsaWVudDo6a0NhcHR1cmVSZXF1ZXN0SWRTdGFydCksCi0gICAgICAgIG1Nc2dUeXBlKDApIHsKKyAgICAgICAgbUNhcHR1cmVJZChDYW1lcmEyQ2xpZW50OjprQ2FwdHVyZVJlcXVlc3RJZFN0YXJ0KSB7CiAgICAgQUxPR1YoIiVzIiwgX19GVU5DVElPTl9fKTsKIH0KIApAQCAtNjQsNyArNjMsNyBAQAogICAgIG1ac2xQcm9jZXNzb3IgPSBwcm9jZXNzb3I7CiB9CiAKLXN0YXR1c190IENhcHR1cmVTZXF1ZW5jZXI6OnN0YXJ0Q2FwdHVyZShpbnQgbXNnVHlwZSkgeworc3RhdHVzX3QgQ2FwdHVyZVNlcXVlbmNlcjo6c3RhcnRDYXB0dXJlKCkgewogICAgIEFMT0dWKCIlcyIsIF9fRlVOQ1RJT05fXyk7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtSW5wdXRNdXRleCk7CkBAIC03Myw3ICs3Miw2IEBACiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAgICAgaWYgKCFtU3RhcnRDYXB0dXJlKSB7Ci0gICAgICAgIG1Nc2dUeXBlID0gbXNnVHlwZTsKICAgICAgICAgbVN0YXJ0Q2FwdHVyZSA9IHRydWU7CiAgICAgICAgIG1TdGFydENhcHR1cmVTaWduYWwuc2lnbmFsKCk7CiAgICAgfQpAQCAtMzg2LDcgKzM4NCw3IEBACiAKICAgICBTaGFyZWRQYXJhbWV0ZXJzOjpMb2NrIGwoY2xpZW50LT5nZXRQYXJhbWV0ZXJzKCkpOwogICAgIC8qIHdhcm5pbmc6IHRoaXMgYWxzbyBsb2NrcyBhIFNoYXJlZENhbWVyYUNhbGxiYWNrcyAqLwotICAgIHNodXR0ZXJOb3RpZnlMb2NrZWQobC5tUGFyYW1ldGVycywgY2xpZW50LCBtTXNnVHlwZSk7CisgICAgc2h1dHRlck5vdGlmeUxvY2tlZChsLm1QYXJhbWV0ZXJzLCBjbGllbnQpOwogICAgIG1TaHV0dGVyTm90aWZpZWQgPSB0cnVlOwogICAgIG1UaW1lb3V0Q291bnQgPSBrTWF4VGltZW91dHNGb3JDYXB0dXJlRW5kOwogICAgIHJldHVybiBTVEFOREFSRF9DQVBUVVJFX1dBSVQ7CkBAIC02MTIsNyArNjEwLDcgQEAKICAgICAgICAgaWYgKCFtU2h1dHRlck5vdGlmaWVkKSB7CiAgICAgICAgICAgICBTaGFyZWRQYXJhbWV0ZXJzOjpMb2NrIGwoY2xpZW50LT5nZXRQYXJhbWV0ZXJzKCkpOwogICAgICAgICAgICAgLyogd2FybmluZzogdGhpcyBhbHNvIGxvY2tzIGEgU2hhcmVkQ2FtZXJhQ2FsbGJhY2tzICovCi0gICAgICAgICAgICBzaHV0dGVyTm90aWZ5TG9ja2VkKGwubVBhcmFtZXRlcnMsIGNsaWVudCwgbU1zZ1R5cGUpOworICAgICAgICAgICAgc2h1dHRlck5vdGlmeUxvY2tlZChsLm1QYXJhbWV0ZXJzLCBjbGllbnQpOwogICAgICAgICAgICAgbVNodXR0ZXJOb3RpZmllZCA9IHRydWU7CiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKG1UaW1lb3V0Q291bnQgPD0gMCkgewpAQCAtNzE3LDEyICs3MTUsMTEgQEAKIH0KIAogLypzdGF0aWMqLyB2b2lkIENhcHR1cmVTZXF1ZW5jZXI6OnNodXR0ZXJOb3RpZnlMb2NrZWQoY29uc3QgUGFyYW1ldGVycyAmcGFyYW1zLAotICAgICAgICAgICAgY29uc3Qgc3A8Q2FtZXJhMkNsaWVudD4mIGNsaWVudCwgaW50IG1zZ1R5cGUpIHsKKyAgICAgICAgICAgIGNvbnN0IHNwPENhbWVyYTJDbGllbnQ+JiBjbGllbnQpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogCiAgICAgaWYgKHBhcmFtcy5zdGF0ZSA9PSBQYXJhbWV0ZXJzOjpTVElMTF9DQVBUVVJFCi0gICAgICAgICYmIHBhcmFtcy5wbGF5U2h1dHRlclNvdW5kCi0gICAgICAgICYmIChtc2dUeXBlICYgQ0FNRVJBX01TR19TSFVUVEVSKSkgeworICAgICAgICAmJiBwYXJhbXMucGxheVNodXR0ZXJTb3VuZCkgewogICAgICAgICBjbGllbnQtPmdldENhbWVyYVNlcnZpY2UoKS0+cGxheVNvdW5kKENhbWVyYVNlcnZpY2U6OlNPVU5EX1NIVVRURVIpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0NhcHR1cmVTZXF1ZW5jZXIuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9DYXB0dXJlU2VxdWVuY2VyLmgKaW5kZXggZjJlMzc1MC4uYzIzYjEyZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0NhcHR1cmVTZXF1ZW5jZXIuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvQ2FwdHVyZVNlcXVlbmNlci5oCkBAIC01MSw3ICs1MSw3IEBACiAgICAgdm9pZCBzZXRac2xQcm9jZXNzb3IoY29uc3Qgd3A8WnNsUHJvY2Vzc29yPiYgcHJvY2Vzc29yKTsKIAogICAgIC8vIEJlZ2luIHN0aWxsIGltYWdlIGNhcHR1cmUKLSAgICBzdGF0dXNfdCBzdGFydENhcHR1cmUoaW50IG1zZ1R5cGUpOworICAgIHN0YXR1c190IHN0YXJ0Q2FwdHVyZSgpOwogCiAgICAgLy8gV2FpdCB1bnRpbCBjdXJyZW50IGltYWdlIGNhcHR1cmUgY29tcGxldGVzOyByZXR1cm5zIGltbWVkaWF0ZWx5IGlmIG5vCiAgICAgLy8gY2FwdHVyZSBpcyBhY3RpdmUuIFJldHVybnMgVElNRURfT1VUIGlmIGNhcHR1cmUgZG9lcyBub3QgY29tcGxldGUgZHVyaW5nCkBAIC0xNDUsNyArMTQ1LDYgQEAKICAgICBib29sIG1BZUluUHJlY2FwdHVyZTsKIAogICAgIGludDMyX3QgbUNhcHR1cmVJZDsKLSAgICBpbnQgbU1zZ1R5cGU7CiAKICAgICAvLyBNYWluIGludGVybmFsIG1ldGhvZHMKIApAQCAtMTcyLDcgKzE3MSw3IEBACiAKICAgICAvLyBFbWl0IFNodXR0ZXIvUmF3IGNhbGxiYWNrIHRvIGphdmEsIGFuZCBtYXliZSBwbGF5IGEgc2h1dHRlciBzb3VuZAogICAgIHN0YXRpYyB2b2lkIHNodXR0ZXJOb3RpZnlMb2NrZWQoY29uc3QgUGFyYW1ldGVycyAmcGFyYW1zLAotICAgICAgICAgICAgY29uc3Qgc3A8Q2FtZXJhMkNsaWVudD4mIGNsaWVudCwgaW50IG1zZ1R5cGUpOworICAgICAgICAgICAgY29uc3Qgc3A8Q2FtZXJhMkNsaWVudD4mIGNsaWVudCk7CiB9OwogCiB9OyAvLyBuYW1lc3BhY2UgY2FtZXJhMgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0ZyYW1lUHJvY2Vzc29yLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9GcmFtZVByb2Nlc3Nvci5jcHAKaW5kZXggMGM3MzhlNy4uNjgzZTg0ZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0ZyYW1lUHJvY2Vzc29yLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvRnJhbWVQcm9jZXNzb3IuY3BwCkBAIC0zMyw3ICszMywxMCBAQAogICAgIEZyYW1lUHJvY2Vzc29yQmFzZShkZXZpY2UpLAogICAgIG1DbGllbnQoY2xpZW50KSwKICAgICBtTGFzdEZyYW1lTnVtYmVyT2ZGYWNlcygwKSwKLSAgICBtTGFzdDNBRnJhbWVOdW1iZXIoLTEpIHsKKyAgICBtTGFzdDNBRnJhbWVOdW1iZXIoLTEpLAorICAgIG1MYXN0QUVGcmFtZU51bWJlcigtMSksCisgICAgbUxhc3RBRnJhbWVOdW1iZXIoLTEpLAorICAgIG1MYXN0QVdCRnJhbWVOdW1iZXIoLTEpIHsKIAogICAgIHNwPENhbWVyYURldmljZUJhc2U+IGQgPSBkZXZpY2UucHJvbW90ZSgpOwogICAgIG1TeW50aGVzaXplM0FOb3RpZnkgPSAhKGQtPndpbGxOb3RpZnkzQSgpKTsKQEAgLTI2MiwyNCArMjY1LDczIEBACiAgICAgYm9vbCBnb3RBbGxTdGF0ZXMgPSB0cnVlOwogCiAgICAgLy8gVE9ETzogQWxzbyB1c2UgQUUgbW9kZSwgQUUgdHJpZ2dlciBJRAotICAgIGdvdEFsbFN0YXRlcyAmPSB1cGRhdGVQZW5kaW5nU3RhdGU8dWludDhfdD4obWV0YWRhdGEsIEFORFJPSURfQ09OVFJPTF9BRl9NT0RFLAorICAgIGJvb2wgZ290QUZTdGF0ZSA9IHVwZGF0ZVBlbmRpbmdTdGF0ZTx1aW50OF90PihtZXRhZGF0YSwgQU5EUk9JRF9DT05UUk9MX0FGX01PREUsCiAgICAgICAgICAgICAmcGVuZGluZ1N0YXRlLmFmTW9kZSwgZnJhbWVOdW1iZXIsIGNhbWVyYUlkKTsKIAotICAgIGdvdEFsbFN0YXRlcyAmPSB1cGRhdGVQZW5kaW5nU3RhdGU8dWludDhfdD4obWV0YWRhdGEsIEFORFJPSURfQ09OVFJPTF9BV0JfTU9ERSwKKyAgICBib29sIGdvdEFXQlN0YXRlID0gdXBkYXRlUGVuZGluZ1N0YXRlPHVpbnQ4X3Q+KG1ldGFkYXRhLCBBTkRST0lEX0NPTlRST0xfQVdCX01PREUsCiAgICAgICAgICAgICAmcGVuZGluZ1N0YXRlLmF3Yk1vZGUsIGZyYW1lTnVtYmVyLCBjYW1lcmFJZCk7CiAKLSAgICBnb3RBbGxTdGF0ZXMgJj0gdXBkYXRlUGVuZGluZ1N0YXRlPHVpbnQ4X3Q+KG1ldGFkYXRhLCBBTkRST0lEX0NPTlRST0xfQUVfU1RBVEUsCisgICAgYm9vbCBnb3RBRVN0YXRlID0gdXBkYXRlUGVuZGluZ1N0YXRlPHVpbnQ4X3Q+KG1ldGFkYXRhLCBBTkRST0lEX0NPTlRST0xfQUVfU1RBVEUsCiAgICAgICAgICAgICAmcGVuZGluZ1N0YXRlLmFlU3RhdGUsIGZyYW1lTnVtYmVyLCBjYW1lcmFJZCk7CiAKLSAgICBnb3RBbGxTdGF0ZXMgJj0gdXBkYXRlUGVuZGluZ1N0YXRlPHVpbnQ4X3Q+KG1ldGFkYXRhLCBBTkRST0lEX0NPTlRST0xfQUZfU1RBVEUsCisgICAgZ290QUZTdGF0ZSAmPSB1cGRhdGVQZW5kaW5nU3RhdGU8dWludDhfdD4obWV0YWRhdGEsIEFORFJPSURfQ09OVFJPTF9BRl9TVEFURSwKICAgICAgICAgICAgICZwZW5kaW5nU3RhdGUuYWZTdGF0ZSwgZnJhbWVOdW1iZXIsIGNhbWVyYUlkKTsKIAotICAgIGdvdEFsbFN0YXRlcyAmPSB1cGRhdGVQZW5kaW5nU3RhdGU8dWludDhfdD4obWV0YWRhdGEsIEFORFJPSURfQ09OVFJPTF9BV0JfU1RBVEUsCisgICAgZ290QVdCU3RhdGUgJj0gdXBkYXRlUGVuZGluZ1N0YXRlPHVpbnQ4X3Q+KG1ldGFkYXRhLCBBTkRST0lEX0NPTlRST0xfQVdCX1NUQVRFLAogICAgICAgICAgICAgJnBlbmRpbmdTdGF0ZS5hd2JTdGF0ZSwgZnJhbWVOdW1iZXIsIGNhbWVyYUlkKTsKIAogICAgIHBlbmRpbmdTdGF0ZS5hZlRyaWdnZXJJZCA9IGZyYW1lLm1SZXN1bHRFeHRyYXMuYWZUcmlnZ2VySWQ7CiAgICAgcGVuZGluZ1N0YXRlLmFlVHJpZ2dlcklkID0gZnJhbWUubVJlc3VsdEV4dHJhcy5wcmVjYXB0dXJlVHJpZ2dlcklkOwogCisgICAgaWYgKGdvdEFFU3RhdGUgJiYgKGZyYW1lTnVtYmVyID4gbUxhc3RBRUZyYW1lTnVtYmVyKSkgeworICAgICAgICBpZiAocGVuZGluZ1N0YXRlLmFlU3RhdGUgIT0gbTNhU3RhdGUuYWVTdGF0ZSB8fAorICAgICAgICAgICAgICAgIHBlbmRpbmdTdGF0ZS5hZVRyaWdnZXJJZCA+IG0zYVN0YXRlLmFlVHJpZ2dlcklkKSB7CisgICAgICAgICAgICBBTE9HVigiJXM6IENhbWVyYSAlZDogQUUgc3RhdGUgJWQtPiVkIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBjYW1lcmFJZCwKKyAgICAgICAgICAgICAgICAgICAgbTNhU3RhdGUuYWVTdGF0ZSwgcGVuZGluZ1N0YXRlLmFlU3RhdGUpOworICAgICAgICAgICAgY2xpZW50LT5ub3RpZnlBdXRvRXhwb3N1cmUocGVuZGluZ1N0YXRlLmFlU3RhdGUsIHBlbmRpbmdTdGF0ZS5hZVRyaWdnZXJJZCk7CisKKyAgICAgICAgICAgIG0zYVN0YXRlLmFlU3RhdGUgPSBwZW5kaW5nU3RhdGUuYWVTdGF0ZTsKKyAgICAgICAgICAgIG0zYVN0YXRlLmFlVHJpZ2dlcklkID0gcGVuZGluZ1N0YXRlLmFlVHJpZ2dlcklkOworICAgICAgICAgICAgbUxhc3RBRUZyYW1lTnVtYmVyID0gZnJhbWVOdW1iZXI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZ290QUZTdGF0ZSAmJiAoZnJhbWVOdW1iZXIgPiBtTGFzdEFGcmFtZU51bWJlcikpIHsKKyAgICAgICAgaWYgKHBlbmRpbmdTdGF0ZS5hZlN0YXRlICE9IG0zYVN0YXRlLmFmU3RhdGUgfHwKKyAgICAgICAgICAgICAgICBwZW5kaW5nU3RhdGUuYWZNb2RlICE9IG0zYVN0YXRlLmFmTW9kZSB8fAorICAgICAgICAgICAgICAgIHBlbmRpbmdTdGF0ZS5hZlRyaWdnZXJJZCAhPSBtM2FTdGF0ZS5hZlRyaWdnZXJJZCkgeworICAgICAgICAgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQ6IEFGIHN0YXRlICVkLT4lZC4gQUYgbW9kZSAlZC0+JWQuIFRyaWdnZXIgJWQtPiVkIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBjYW1lcmFJZCwKKyAgICAgICAgICAgICAgICAgICAgbTNhU3RhdGUuYWZTdGF0ZSwgcGVuZGluZ1N0YXRlLmFmU3RhdGUsCisgICAgICAgICAgICAgICAgICAgIG0zYVN0YXRlLmFmTW9kZSwgcGVuZGluZ1N0YXRlLmFmTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgbTNhU3RhdGUuYWZUcmlnZ2VySWQsIHBlbmRpbmdTdGF0ZS5hZlRyaWdnZXJJZCk7CisgICAgICAgICAgICBjbGllbnQtPm5vdGlmeUF1dG9Gb2N1cyhwZW5kaW5nU3RhdGUuYWZTdGF0ZSwgcGVuZGluZ1N0YXRlLmFmVHJpZ2dlcklkKTsKKworICAgICAgICAgICAgbTNhU3RhdGUuYWZTdGF0ZSA9IHBlbmRpbmdTdGF0ZS5hZlN0YXRlOworICAgICAgICAgICAgbTNhU3RhdGUuYWZNb2RlID0gcGVuZGluZ1N0YXRlLmFmTW9kZTsKKyAgICAgICAgICAgIG0zYVN0YXRlLmFmVHJpZ2dlcklkID0gcGVuZGluZ1N0YXRlLmFmVHJpZ2dlcklkOworICAgICAgICAgICAgbUxhc3RBRnJhbWVOdW1iZXIgPSBmcmFtZU51bWJlcjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChnb3RBV0JTdGF0ZSAmJiAoZnJhbWVOdW1iZXIgPiBtTGFzdEFXQkZyYW1lTnVtYmVyKSkgeworICAgICAgICBpZiAocGVuZGluZ1N0YXRlLmF3YlN0YXRlICE9IG0zYVN0YXRlLmF3YlN0YXRlIHx8CisgICAgICAgICAgICAgICAgcGVuZGluZ1N0YXRlLmF3Yk1vZGUgIT0gbTNhU3RhdGUuYXdiTW9kZSkgeworICAgICAgICAgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQ6IEFXQiBzdGF0ZSAlZC0+JWQuIEFXQiBtb2RlICVkLT4lZCIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY2FtZXJhSWQsCisgICAgICAgICAgICAgICAgICAgIG0zYVN0YXRlLmF3YlN0YXRlLCBwZW5kaW5nU3RhdGUuYXdiU3RhdGUsCisgICAgICAgICAgICAgICAgICAgIG0zYVN0YXRlLmF3Yk1vZGUsIHBlbmRpbmdTdGF0ZS5hd2JNb2RlKTsKKyAgICAgICAgICAgIGNsaWVudC0+bm90aWZ5QXV0b1doaXRlYmFsYW5jZShwZW5kaW5nU3RhdGUuYXdiU3RhdGUsCisgICAgICAgICAgICAgICAgICAgIHBlbmRpbmdTdGF0ZS5hZVRyaWdnZXJJZCk7CisKKyAgICAgICAgICAgIG0zYVN0YXRlLmF3Yk1vZGUgPSBwZW5kaW5nU3RhdGUuYXdiTW9kZTsKKyAgICAgICAgICAgIG0zYVN0YXRlLmF3YlN0YXRlID0gcGVuZGluZ1N0YXRlLmF3YlN0YXRlOworICAgICAgICAgICAgbUxhc3RBV0JGcmFtZU51bWJlciA9IGZyYW1lTnVtYmVyOworICAgICAgICB9CisgICAgfQorCisgICAgZ290QWxsU3RhdGVzICY9IGdvdEFFU3RhdGUgJiBnb3RBRlN0YXRlICYgZ290QVdCU3RhdGU7CiAgICAgaWYgKCFnb3RBbGxTdGF0ZXMpIHsKICAgICAgICAgLy8gSWYgbm90IGFsbCBzdGF0ZXMgYXJlIHJlY2VpdmVkLCBwdXQgdGhlIHBlbmRpbmcgc3RhdGUgdG8gbVBlbmRpbmczQVN0YXRlcy4KICAgICAgICAgaWYgKGluZGV4ID09IE5BTUVfTk9UX0ZPVU5EKSB7CkBAIC0yOTAsNDAgKzM0MiwxMCBAQAogICAgICAgICByZXR1cm4gTk9UX0VOT1VHSF9EQVRBOwogICAgIH0KIAotICAgIC8vIE9uY2UgYWxsIDNBIHN0YXRlcyBhcmUgcmVjZWl2ZWQsIG5vdGlmeSB0aGUgY2xpZW50IGFib3V0IDNBIGNoYW5nZXMuCi0gICAgaWYgKHBlbmRpbmdTdGF0ZS5hZVN0YXRlICE9IG0zYVN0YXRlLmFlU3RhdGUgfHwKLSAgICAgICAgICAgIHBlbmRpbmdTdGF0ZS5hZVRyaWdnZXJJZCA+IG0zYVN0YXRlLmFlVHJpZ2dlcklkKSB7Ci0gICAgICAgIEFMT0dWKCIlczogQ2FtZXJhICVkOiBBRSBzdGF0ZSAlZC0+JWQiLAotICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY2FtZXJhSWQsCi0gICAgICAgICAgICAgICAgbTNhU3RhdGUuYWVTdGF0ZSwgcGVuZGluZ1N0YXRlLmFlU3RhdGUpOwotICAgICAgICBjbGllbnQtPm5vdGlmeUF1dG9FeHBvc3VyZShwZW5kaW5nU3RhdGUuYWVTdGF0ZSwgcGVuZGluZ1N0YXRlLmFlVHJpZ2dlcklkKTsKLSAgICB9Ci0KLSAgICBpZiAocGVuZGluZ1N0YXRlLmFmU3RhdGUgIT0gbTNhU3RhdGUuYWZTdGF0ZSB8fAotICAgICAgICBwZW5kaW5nU3RhdGUuYWZNb2RlICE9IG0zYVN0YXRlLmFmTW9kZSB8fAotICAgICAgICBwZW5kaW5nU3RhdGUuYWZUcmlnZ2VySWQgIT0gbTNhU3RhdGUuYWZUcmlnZ2VySWQpIHsKLSAgICAgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQ6IEFGIHN0YXRlICVkLT4lZC4gQUYgbW9kZSAlZC0+JWQuIFRyaWdnZXIgJWQtPiVkIiwKLSAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNhbWVyYUlkLAotICAgICAgICAgICAgICAgIG0zYVN0YXRlLmFmU3RhdGUsIHBlbmRpbmdTdGF0ZS5hZlN0YXRlLAotICAgICAgICAgICAgICAgIG0zYVN0YXRlLmFmTW9kZSwgcGVuZGluZ1N0YXRlLmFmTW9kZSwKLSAgICAgICAgICAgICAgICBtM2FTdGF0ZS5hZlRyaWdnZXJJZCwgcGVuZGluZ1N0YXRlLmFmVHJpZ2dlcklkKTsKLSAgICAgICAgY2xpZW50LT5ub3RpZnlBdXRvRm9jdXMocGVuZGluZ1N0YXRlLmFmU3RhdGUsIHBlbmRpbmdTdGF0ZS5hZlRyaWdnZXJJZCk7Ci0gICAgfQotICAgIGlmIChwZW5kaW5nU3RhdGUuYXdiU3RhdGUgIT0gbTNhU3RhdGUuYXdiU3RhdGUgfHwKLSAgICAgICAgcGVuZGluZ1N0YXRlLmF3Yk1vZGUgIT0gbTNhU3RhdGUuYXdiTW9kZSkgewotICAgICAgICBBTE9HVigiJXM6IENhbWVyYSAlZDogQVdCIHN0YXRlICVkLT4lZC4gQVdCIG1vZGUgJWQtPiVkIiwKLSAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNhbWVyYUlkLAotICAgICAgICAgICAgICAgIG0zYVN0YXRlLmF3YlN0YXRlLCBwZW5kaW5nU3RhdGUuYXdiU3RhdGUsCi0gICAgICAgICAgICAgICAgbTNhU3RhdGUuYXdiTW9kZSwgcGVuZGluZ1N0YXRlLmF3Yk1vZGUpOwotICAgICAgICBjbGllbnQtPm5vdGlmeUF1dG9XaGl0ZWJhbGFuY2UocGVuZGluZ1N0YXRlLmF3YlN0YXRlLAotICAgICAgICAgICAgICAgIHBlbmRpbmdTdGF0ZS5hZVRyaWdnZXJJZCk7Ci0gICAgfQotCiAgICAgaWYgKGluZGV4ICE9IE5BTUVfTk9UX0ZPVU5EKSB7CiAgICAgICAgIG1QZW5kaW5nM0FTdGF0ZXMucmVtb3ZlSXRlbXNBdChpbmRleCk7CiAgICAgfQogCi0gICAgbTNhU3RhdGUgPSBwZW5kaW5nU3RhdGU7CiAgICAgbUxhc3QzQUZyYW1lTnVtYmVyID0gZnJhbWVOdW1iZXI7CiAKICAgICByZXR1cm4gT0s7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvRnJhbWVQcm9jZXNzb3IuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9GcmFtZVByb2Nlc3Nvci5oCmluZGV4IDYyYTRlOTEuLjgxODNjMTIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9GcmFtZVByb2Nlc3Nvci5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9GcmFtZVByb2Nlc3Nvci5oCkBAIC0xMDQsOCArMTA0LDcgQEAKICAgICAvLyBUcmFjayBtb3N0IHJlY2VudCBmcmFtZSBudW1iZXIgZm9yIHdoaWNoIDNBIG5vdGlmaWNhdGlvbnMgd2VyZSBzZW50IGZvci4KICAgICAvLyBVc2VkIHRvIGZpbHRlciBhZ2FpbnN0IHNlbmRpbmcgM0Egbm90aWZpY2F0aW9ucyBmb3IgdGhlIHNhbWUgZnJhbWUKICAgICAvLyBzZXZlcmFsIHRpbWVzLgotICAgIGludDMyX3QgbUxhc3QzQUZyYW1lTnVtYmVyOwotCisgICAgaW50MzJfdCBtTGFzdDNBRnJhbWVOdW1iZXIsIG1MYXN0QUVGcmFtZU51bWJlciwgbUxhc3RBRnJhbWVOdW1iZXIsIG1MYXN0QVdCRnJhbWVOdW1iZXI7CiAgICAgLy8gRW1pdCBGYWNlRGV0ZWN0aW9uIGV2ZW50IHRvIGphdmEgaWYgZmFjZXMgY2hhbmdlZAogICAgIHZvaWQgY2FsbGJhY2tGYWNlRGV0ZWN0aW9uKGNvbnN0IHNwPENhbWVyYTJDbGllbnQ+JiBjbGllbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FtZXJhX2ZyYW1lX21ldGFkYXRhICZtZXRhZGF0YSk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvUGFyYW1ldGVycy5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvUGFyYW1ldGVycy5jcHAKaW5kZXggMjhkMTg2YS4uMThhZGRiNSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1BhcmFtZXRlcnMuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9QYXJhbWV0ZXJzLmNwcApAQCAtNjksNyArNjksNyBAQAogICAgIHJlcyA9IGJ1aWxkUXVpcmtzKCk7CiAgICAgaWYgKHJlcyAhPSBPSykgcmV0dXJuIHJlczsKIAotICAgIGNvbnN0IFNpemUgTUFYX1BSRVZJRVdfU0laRSA9IHsgTUFYX1BSRVZJRVdfV0lEVEgsIE1BWF9QUkVWSUVXX0hFSUdIVCB9OworICAgIFNpemUgbWF4UHJldmlld1NpemUgPSB7IE1BWF9QUkVWSUVXX1dJRFRILCBNQVhfUFJFVklFV19IRUlHSFQgfTsKICAgICAvLyBUcmVhdCB0aGUgSC4yNjQgbWF4IHNpemUgYXMgdGhlIG1heCBzdXBwb3J0ZWQgdmlkZW8gc2l6ZS4KICAgICBNZWRpYVByb2ZpbGVzICp2aWRlb0VuY29kZXJQcm9maWxlcyA9IE1lZGlhUHJvZmlsZXM6OmdldEluc3RhbmNlKCk7CiAgICAgVmVjdG9yPHZpZGVvX2VuY29kZXI+IGVuY29kZXJzID0gdmlkZW9FbmNvZGVyUHJvZmlsZXMtPmdldFZpZGVvRW5jb2RlcnMoKTsKQEAgLTkwLDExICs5MCwxNiBAQAogICAgICAgICB9CiAgICAgfQogICAgIC8vIFRoaXMgaXMganVzdCBhbiB1cHBlciBib3VuZCBhbmQgbWF5IG5vdCBiZSBhbiBhY3R1YWxseSB2YWxpZCB2aWRlbyBzaXplCi0gICAgY29uc3QgU2l6ZSBWSURFT19TSVpFX1VQUEVSX0JPVU5EID0ge21heFZpZGVvV2lkdGgsIG1heFZpZGVvSGVpZ2h0fTsKKyAgICBTaXplIHZpZGVvU2l6ZVVwcGVyQm91bmQgPSB7bWF4VmlkZW9XaWR0aCwgbWF4VmlkZW9IZWlnaHR9OwogCi0gICAgcmVzID0gZ2V0RmlsdGVyZWRTaXplcyhNQVhfUFJFVklFV19TSVpFLCAmYXZhaWxhYmxlUHJldmlld1NpemVzKTsKKyAgICBpZiAoZmFzdEluZm8uc3VwcG9ydHNQcmVmZXJyZWRDb25maWdzKSB7CisgICAgICAgIG1heFByZXZpZXdTaXplID0gZ2V0TWF4U2l6ZShnZXRQcmVmZXJyZWRQcmV2aWV3U2l6ZXMoKSk7CisgICAgICAgIHZpZGVvU2l6ZVVwcGVyQm91bmQgPSBnZXRNYXhTaXplKGdldFByZWZlcnJlZFZpZGVvU2l6ZXMoKSk7CisgICAgfQorCisgICAgcmVzID0gZ2V0RmlsdGVyZWRTaXplcyhtYXhQcmV2aWV3U2l6ZSwgJmF2YWlsYWJsZVByZXZpZXdTaXplcyk7CiAgICAgaWYgKHJlcyAhPSBPSykgcmV0dXJuIHJlczsKLSAgICByZXMgPSBnZXRGaWx0ZXJlZFNpemVzKFZJREVPX1NJWkVfVVBQRVJfQk9VTkQsICZhdmFpbGFibGVWaWRlb1NpemVzKTsKKyAgICByZXMgPSBnZXRGaWx0ZXJlZFNpemVzKHZpZGVvU2l6ZVVwcGVyQm91bmQsICZhdmFpbGFibGVWaWRlb1NpemVzKTsKICAgICBpZiAocmVzICE9IE9LKSByZXR1cm4gcmVzOwogCiAgICAgLy8gU2VsZWN0IGluaXRpYWwgcHJldmlldyBhbmQgdmlkZW8gc2l6ZSB0aGF0J3MgdW5kZXIgdGhlIGluaXRpYWwgYm91bmQgYW5kCkBAIC0yOTYsOSArMzAxLDEzIEBACiAgICAgVmVjdG9yPFNpemU+IGF2YWlsYWJsZUpwZWdTaXplcyA9IGdldEF2YWlsYWJsZUpwZWdTaXplcygpOwogICAgIGlmICghYXZhaWxhYmxlSnBlZ1NpemVzLnNpemUoKSkgcmV0dXJuIE5PX0lOSVQ7CiAKLSAgICAvLyBUT0RPOiBQaWNrIG1heGltdW0KICAgICBwaWN0dXJlV2lkdGggPSBhdmFpbGFibGVKcGVnU2l6ZXNbMF0ud2lkdGg7CiAgICAgcGljdHVyZUhlaWdodCA9IGF2YWlsYWJsZUpwZWdTaXplc1swXS5oZWlnaHQ7CisgICAgaWYgKGZhc3RJbmZvLnN1cHBvcnRzUHJlZmVycmVkQ29uZmlncykgeworICAgICAgICBTaXplIHN1Z2dlc3RlZEpwZWdTaXplID0gZ2V0TWF4U2l6ZShnZXRQcmVmZXJyZWRKcGVnU2l6ZXMoKSk7CisgICAgICAgIHBpY3R1cmVXaWR0aCA9IHN1Z2dlc3RlZEpwZWdTaXplLndpZHRoOworICAgICAgICBwaWN0dXJlSGVpZ2h0ID0gc3VnZ2VzdGVkSnBlZ1NpemUuaGVpZ2h0OworICAgIH0KICAgICBwaWN0dXJlV2lkdGhMYXN0U2V0ID0gcGljdHVyZVdpZHRoOwogICAgIHBpY3R1cmVIZWlnaHRMYXN0U2V0ID0gcGljdHVyZUhlaWdodDsKICAgICBwaWN0dXJlU2l6ZU92ZXJyaWRlbiA9IGZhbHNlOwpAQCAtNzU3LDYgKzc2Niw3IEBACiAgICAgZm9jdXNTdGF0ZSA9IEFORFJPSURfQ09OVFJPTF9BRl9TVEFURV9JTkFDVElWRTsKICAgICBzaGFkb3dGb2N1c01vZGUgPSBGT0NVU19NT0RFX0lOVkFMSUQ7CiAKKyAgICBhZVN0YXRlID0gQU5EUk9JRF9DT05UUk9MX0FFX1NUQVRFX0lOQUNUSVZFOwogICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90IG1heDNhUmVnaW9ucyA9IHN0YXRpY0luZm8oQU5EUk9JRF9DT05UUk9MX01BWF9SRUdJT05TLAogICAgICAgICAgICAgUGFyYW1ldGVyczo6TlVNX1JFR0lPTiwgUGFyYW1ldGVyczo6TlVNX1JFR0lPTik7CiAgICAgaWYgKG1heDNhUmVnaW9ucy5jb3VudCAhPSBQYXJhbWV0ZXJzOjpOVU1fUkVHSU9OKSByZXR1cm4gTk9fSU5JVDsKQEAgLTEwMTAsNiArMTAyMCw5IEBACiAgICAgICAgIGFycmF5SGVpZ2h0ID0gYWN0aXZlQXJyYXlTaXplLmRhdGEuaTMyWzNdOwogICAgIH0gZWxzZSByZXR1cm4gTk9fSU5JVDsKIAorICAgIGZhc3RJbmZvLnN1cHBvcnRzUHJlZmVycmVkQ29uZmlncyA9CisgICAgICAgIGluZm8tPmV4aXN0cyhBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfUkVDT01NRU5ERURfU1RSRUFNX0NPTkZJR1VSQVRJT05TKTsKKwogICAgIC8vIFdlJ2xsIHNldCB0aGUgdGFyZ2V0IEZQUyByYW5nZSBmb3Igc3RpbGwgY2FwdHVyZXMgdG8gYmUgYXMgd2lkZQogICAgIC8vIGFzIHBvc3NpYmxlIHRvIGdpdmUgdGhlIEhBTCBtYXhpbXVtIGxhdGl0dWRlIGZvciBleHBvc3VyZSBzZWxlY3Rpb24KICAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBhdmFpbGFibGVGcHNSYW5nZXMgPQpAQCAtMTAyMSw4ICsxMDM0LDExIEBACiAgICAgLy8gR2V0IHN1cHBvcnRlZCBwcmV2aWV3IGZwcyByYW5nZXMsIHVwIHRvIGRlZmF1bHQgbWF4aW11bS4KICAgICBWZWN0b3I8U2l6ZT4gc3VwcG9ydGVkUHJldmlld1NpemVzOwogICAgIFZlY3RvcjxGcHNSYW5nZT4gc3VwcG9ydGVkUHJldmlld0Zwc1JhbmdlczsKLSAgICBjb25zdCBTaXplIFBSRVZJRVdfU0laRV9CT1VORCA9IHsgTUFYX1BSRVZJRVdfV0lEVEgsIE1BWF9QUkVWSUVXX0hFSUdIVCB9OwotICAgIHN0YXR1c190IHJlcyA9IGdldEZpbHRlcmVkU2l6ZXMoUFJFVklFV19TSVpFX0JPVU5ELCAmc3VwcG9ydGVkUHJldmlld1NpemVzKTsKKyAgICBTaXplIHByZXZpZXdTaXplQm91bmQgPSB7IE1BWF9QUkVWSUVXX1dJRFRILCBNQVhfUFJFVklFV19IRUlHSFQgfTsKKyAgICBpZiAoZmFzdEluZm8uc3VwcG9ydHNQcmVmZXJyZWRDb25maWdzKSB7CisgICAgICAgIHByZXZpZXdTaXplQm91bmQgPSBnZXRNYXhTaXplKGdldFByZWZlcnJlZFByZXZpZXdTaXplcygpKTsKKyAgICB9CisgICAgc3RhdHVzX3QgcmVzID0gZ2V0RmlsdGVyZWRTaXplcyhwcmV2aWV3U2l6ZUJvdW5kLCAmc3VwcG9ydGVkUHJldmlld1NpemVzKTsKICAgICBpZiAocmVzICE9IE9LKSByZXR1cm4gcmVzOwogICAgIGZvciAoc2l6ZV90IGk9MDsgaSA8IGF2YWlsYWJsZUZwc1Jhbmdlcy5jb3VudDsgaSArPSAyKSB7CiAgICAgICAgIGlmICghaXNGcHNTdXBwb3J0ZWQoc3VwcG9ydGVkUHJldmlld1NpemVzLApAQCAtMzEwNiw2ICszMTIyLDY3IEBACiAgICAgcmV0dXJuIGpwZWdTaXplczsKIH0KIAorVmVjdG9yPFBhcmFtZXRlcnM6OlN0cmVhbUNvbmZpZ3VyYXRpb24+IFBhcmFtZXRlcnM6OmdldFByZWZlcnJlZFN0cmVhbUNvbmZpZ3VyYXRpb25zKAorICAgICAgICBpbnQzMl90IHVzZWNhc2VJZCkgY29uc3QgeworICAgIGNvbnN0IHNpemVfdCBTVFJFQU1fQ09ORklHVVJBVElPTl9TSVpFID0gNTsKKyAgICBjb25zdCBzaXplX3QgU1RSRUFNX1dJRFRIX09GRlNFVCA9IDA7CisgICAgY29uc3Qgc2l6ZV90IFNUUkVBTV9IRUlHSFRfT0ZGU0VUID0gMTsKKyAgICBjb25zdCBzaXplX3QgU1RSRUFNX0ZPUk1BVF9PRkZTRVQgPSAyOworICAgIGNvbnN0IHNpemVfdCBTVFJFQU1fSVNfSU5QVVRfT0ZGU0VUID0gMzsKKyAgICBjb25zdCBzaXplX3QgU1RSRUFNX1VTRUNBU0VfQklUTUFQX09GRlNFVCA9IDQ7CisgICAgVmVjdG9yPFN0cmVhbUNvbmZpZ3VyYXRpb24+IHNjczsKKworICAgIGlmIChmYXN0SW5mby5zdXBwb3J0c1ByZWZlcnJlZENvbmZpZ3MpIHsKKyAgICAgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QgYXZhaWxhYmxlU3RyZWFtQ29uZmlncyA9IHN0YXRpY0luZm8oCisgICAgICAgICAgICAgICAgQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1JFQ09NTUVOREVEX1NUUkVBTV9DT05GSUdVUkFUSU9OUyk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYXZhaWxhYmxlU3RyZWFtQ29uZmlncy5jb3VudDsgaSs9IFNUUkVBTV9DT05GSUdVUkFUSU9OX1NJWkUpIHsKKyAgICAgICAgICAgIGludDMyX3Qgd2lkdGggPSBhdmFpbGFibGVTdHJlYW1Db25maWdzLmRhdGEuaTMyW2kgKyBTVFJFQU1fV0lEVEhfT0ZGU0VUXTsKKyAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0ID0gYXZhaWxhYmxlU3RyZWFtQ29uZmlncy5kYXRhLmkzMltpICsgU1RSRUFNX0hFSUdIVF9PRkZTRVRdOworICAgICAgICAgICAgaW50MzJfdCBmb3JtYXQgPSBhdmFpbGFibGVTdHJlYW1Db25maWdzLmRhdGEuaTMyW2kgKyBTVFJFQU1fRk9STUFUX09GRlNFVF07CisgICAgICAgICAgICBpbnQzMl90IGlzSW5wdXQgPSBhdmFpbGFibGVTdHJlYW1Db25maWdzLmRhdGEuaTMyW2kgKyBTVFJFQU1fSVNfSU5QVVRfT0ZGU0VUXTsKKyAgICAgICAgICAgIGludDMyX3Qgc3VwcG9ydGVkVXNlY2FzZXMgPQorICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVTdHJlYW1Db25maWdzLmRhdGEuaTMyW2kgKyBTVFJFQU1fVVNFQ0FTRV9CSVRNQVBfT0ZGU0VUXTsKKyAgICAgICAgICAgIGlmIChzdXBwb3J0ZWRVc2VjYXNlcyAmICgxIDw8IHVzZWNhc2VJZCkpIHsKKyAgICAgICAgICAgICAgICBTdHJlYW1Db25maWd1cmF0aW9uIHNjID0ge2Zvcm1hdCwgd2lkdGgsIGhlaWdodCwgaXNJbnB1dH07CisgICAgICAgICAgICAgICAgc2NzLmFkZChzYyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gc2NzOworfQorCitWZWN0b3I8UGFyYW1ldGVyczo6U2l6ZT4gUGFyYW1ldGVyczo6Z2V0UHJlZmVycmVkRmlsdGVyZWRTaXplcyhpbnQzMl90IHVzZWNhc2VJZCwKKyAgICAgICAgaW50MzJfdCBmb3JtYXQpIGNvbnN0IHsKKyAgICBWZWN0b3I8UGFyYW1ldGVyczo6U2l6ZT4gc2l6ZXM7CisgICAgVmVjdG9yPFN0cmVhbUNvbmZpZ3VyYXRpb24+IHNjcyA9IGdldFByZWZlcnJlZFN0cmVhbUNvbmZpZ3VyYXRpb25zKHVzZWNhc2VJZCk7CisgICAgZm9yIChjb25zdCBhdXRvICZpdCA6IHNjcykgeworICAgICAgICBpZiAoaXQuZm9ybWF0ID09IGZvcm1hdCkgeworICAgICAgICAgICAgc2l6ZXMuYWRkKHtpdC53aWR0aCwgaXQuaGVpZ2h0fSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gc2l6ZXM7Cit9CisKK1ZlY3RvcjxQYXJhbWV0ZXJzOjpTaXplPiBQYXJhbWV0ZXJzOjpnZXRQcmVmZXJyZWRKcGVnU2l6ZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFByZWZlcnJlZEZpbHRlcmVkU2l6ZXMoCisgICAgICAgICAgICBBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfUkVDT01NRU5ERURfU1RSRUFNX0NPTkZJR1VSQVRJT05TX1NOQVBTSE9ULAorICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9CTE9CKTsKK30KKworVmVjdG9yPFBhcmFtZXRlcnM6OlNpemU+IFBhcmFtZXRlcnM6OmdldFByZWZlcnJlZFByZXZpZXdTaXplcygpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0UHJlZmVycmVkRmlsdGVyZWRTaXplcygKKyAgICAgICAgICAgIEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9SRUNPTU1FTkRFRF9TVFJFQU1fQ09ORklHVVJBVElPTlNfUFJFVklFVywKKyAgICAgICAgICAgIEhBTF9QSVhFTF9GT1JNQVRfSU1QTEVNRU5UQVRJT05fREVGSU5FRCk7Cit9CisKK1ZlY3RvcjxQYXJhbWV0ZXJzOjpTaXplPiBQYXJhbWV0ZXJzOjpnZXRQcmVmZXJyZWRWaWRlb1NpemVzKCkgY29uc3QgeworICAgIHJldHVybiBnZXRQcmVmZXJyZWRGaWx0ZXJlZFNpemVzKAorICAgICAgICAgICAgQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1JFQ09NTUVOREVEX1NUUkVBTV9DT05GSUdVUkFUSU9OU19SRUNPUkQsCisgICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUX0lNUExFTUVOVEFUSU9OX0RFRklORUQpOworfQorCiBQYXJhbWV0ZXJzOjpDcm9wUmVnaW9uIFBhcmFtZXRlcnM6OmNhbGN1bGF0ZUNyb3BSZWdpb24oYm9vbCBwcmV2aWV3T25seSkgY29uc3QgewogCiAgICAgZmxvYXQgem9vbUxlZnQsIHpvb21Ub3AsIHpvb21XaWR0aCwgem9vbUhlaWdodDsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9QYXJhbWV0ZXJzLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvUGFyYW1ldGVycy5oCmluZGV4IDQyZTdhNDcuLjNhNzA5YzkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9QYXJhbWV0ZXJzLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1BhcmFtZXRlcnMuaApAQCAtMTIyLDYgKzEyMiw3IEBACiAgICAgICAgIGludDMyX3QgaGlnaDsKICAgICB9OwogCisgICAgdWludDhfdCBhZVN0YXRlOyAvL2xhdGVzdCBBRSBzdGF0ZSBmcm9tIEhhbAogICAgIGludDMyX3QgZXhwb3N1cmVDb21wZW5zYXRpb247CiAgICAgYm9vbCBhdXRvRXhwb3N1cmVMb2NrOwogICAgIGJvb2wgYXV0b0V4cG9zdXJlTG9ja0F2YWlsYWJsZTsKQEAgLTI0Nyw2ICsyNDgsNyBAQAogICAgICAgICBib29sIHVzZUZsZXhpYmxlWXV2OwogICAgICAgICBTaXplIG1heEpwZWdTaXplOwogICAgICAgICBTaXplIG1heFpzbFNpemU7CisgICAgICAgIGJvb2wgc3VwcG9ydHNQcmVmZXJyZWRDb25maWdzOwogICAgIH0gZmFzdEluZm87CiAKICAgICAvLyBRdWlya3MgaW5mb3JtYXRpb247IHRoZXNlIGFyZSBzaG9ydC1saXZlZCBmbGFncyB0byBlbmFibGUgd29ya2Fyb3VuZHMgZm9yCkBAIC00MTcsNiArNDE5LDkgQEAKICAgICAvLyByZXR1cm5zIGFuIGVtcHR5IFZlY3RvciBpZiBkZXZpY2UgSEFMIHZlcnNpb24gZG9lcyBzdXBwb3J0IGl0CiAgICAgVmVjdG9yPFN0cmVhbUNvbmZpZ3VyYXRpb24+IGdldFN0cmVhbUNvbmZpZ3VyYXRpb25zKCk7CiAKKyAgICAvLyBIZWxwZXIgZnVuY3Rpb24gdG8gZXh0cmFjdCB0aGUgc3VnZ2VzdGVkIHN0cmVhbSBjb25maWd1cmF0aW9ucworICAgIFZlY3RvcjxTdHJlYW1Db25maWd1cmF0aW9uPiBnZXRQcmVmZXJyZWRTdHJlYW1Db25maWd1cmF0aW9ucyhpbnQzMl90IHVzZWNhc2VJZCkgY29uc3Q7CisKICAgICAvLyBIZWxwZXIgZnVuY3Rpb24gdG8gZ2V0IG1pbmltdW0gZnJhbWUgZHVyYXRpb24gZm9yIGEganBlZyBzaXplCiAgICAgLy8gcmV0dXJuIC0xIGlmIGlucHV0IGpwZWcgc2l6ZSBjYW5ub3QgYmUgZm91bmQgaW4gc3VwcG9ydGVkIHNpemUgbGlzdAogICAgIGludDY0X3QgZ2V0SnBlZ1N0cmVhbU1pbkZyYW1lRHVyYXRpb25OcyhQYXJhbWV0ZXJzOjpTaXplIHNpemUpOwpAQCAtNDM4LDYgKzQ0MywxNSBAQAogICAgIC8vIFRoZSBtYXhpbXVtIHNpemUgaXMgZGVmaW5lZCBieSBjb21wYXJpbmcgd2lkdGggZmlyc3QsIHdoZW4gd2lkdGggdGllcyBjb21wYXJpbmcgaGVpZ2h0LgogICAgIFNpemUgZ2V0TWF4U2l6ZShjb25zdCBWZWN0b3I8U2l6ZT4mIHNpemVzKTsKIAorICAgIC8vIEhlbHBlciBmdW5jdGlvbiB0byBmaWx0ZXIgYW5kIHNvcnQgc3VnZ2VzdGVkIHNpemVzCisgICAgVmVjdG9yPFBhcmFtZXRlcnM6OlNpemU+IGdldFByZWZlcnJlZEZpbHRlcmVkU2l6ZXMoaW50MzJfdCB1c2VjYXNlSWQsIGludDMyX3QgZm9ybWF0KSBjb25zdDsKKyAgICAvLyBIZWxwZXIgZnVuY3Rpb24gdG8gZ2V0IHRoZSBzdWdnZXN0ZWQganBlZyBzaXplcworICAgIFZlY3RvcjxTaXplPiBnZXRQcmVmZXJyZWRKcGVnU2l6ZXMoKSBjb25zdDsKKyAgICAvLyBIZWxwZXIgZnVuY3Rpb24gdG8gZ2V0IHRoZSBzdWdnZXN0ZWQgcHJldmlldyBzaXplcworICAgIFZlY3RvcjxTaXplPiBnZXRQcmVmZXJyZWRQcmV2aWV3U2l6ZXMoKSBjb25zdDsKKyAgICAvLyBIZWxwZXIgZnVuY3Rpb24gdG8gZ2V0IHRoZSBzdWdnZXN0ZWQgdmlkZW8gc2l6ZXMKKyAgICBWZWN0b3I8U2l6ZT4gZ2V0UHJlZmVycmVkVmlkZW9TaXplcygpIGNvbnN0OworCiAgICAgaW50IG1EZXZpY2VWZXJzaW9uOwogICAgIHVpbnQ4X3QgbURlZmF1bHRTY2VuZU1vZGU7CiB9OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuY3BwCmluZGV4IDg0NDI4YzIuLjZkYTA1YzMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYURldmljZUNsaWVudC5jcHAKQEAgLTE5LDYgKzE5LDcgQEAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKIAogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8dXRpbHMvQ2FtZXJhVGhyZWFkU3RhdGUuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgogI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+CkBAIC0xMjIsNiArMTIzLDcgQEAKICAgICAgICAgICAgICAgICBwaHlzaWNhbEtleXNFbnRyeS5kYXRhLmkzMiArIHBoeXNpY2FsS2V5c0VudHJ5LmNvdW50KTsKICAgICB9CiAKKyAgICBtUHJvdmlkZXJNYW5hZ2VyID0gcHJvdmlkZXJQdHI7CiAgICAgcmV0dXJuIE9LOwogfQogCkBAIC02MjYsMTIgKzYyOCwxMSBAQAogCiAgICAgaWYgKHBoeXNpY2FsQ2FtZXJhSWQuc2l6ZSgpID4gMCkgewogICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gcGh5c2ljYWxDYW1lcmFJZHM7Ci0gICAgICAgIHN0ZDo6c3RyaW5nIHBoeXNpY2FsSWQocGh5c2ljYWxDYW1lcmFJZC5zdHJpbmcoKSk7CiAgICAgICAgIGJvb2wgbG9naWNhbENhbWVyYSA9Ci0gICAgICAgICAgICAgICAgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjppc0xvZ2ljYWxDYW1lcmEobURldmljZS0+aW5mbygpLCAmcGh5c2ljYWxDYW1lcmFJZHMpOworICAgICAgICAgICAgICAgIG1Qcm92aWRlck1hbmFnZXItPmlzTG9naWNhbENhbWVyYShtQ2FtZXJhSWRTdHIuc3RyaW5nKCksICZwaHlzaWNhbENhbWVyYUlkcyk7CiAgICAgICAgIGlmICghbG9naWNhbENhbWVyYSB8fAotICAgICAgICAgICAgICAgIHN0ZDo6ZmluZChwaHlzaWNhbENhbWVyYUlkcy5iZWdpbigpLCBwaHlzaWNhbENhbWVyYUlkcy5lbmQoKSwgcGh5c2ljYWxJZCkgPT0KLSAgICAgICAgICAgICAgICBwaHlzaWNhbENhbWVyYUlkcy5lbmQoKSkgeworICAgICAgICAgICAgICAgIHN0ZDo6ZmluZChwaHlzaWNhbENhbWVyYUlkcy5iZWdpbigpLCBwaHlzaWNhbENhbWVyYUlkcy5lbmQoKSwKKyAgICAgICAgICAgICAgICBwaHlzaWNhbENhbWVyYUlkLnN0cmluZygpKSA9PSBwaHlzaWNhbENhbWVyYUlkcy5lbmQoKSkgewogICAgICAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoIkNhbWVyYSAlczogQ2FtZXJhIGRvZXNuJ3Qgc3VwcG9ydCBwaHlzaWNhbENhbWVyYUlkICVzLiIsCiAgICAgICAgICAgICAgICAgICAgIG1DYW1lcmFJZFN0ci5zdHJpbmcoKSwgcGh5c2ljYWxDYW1lcmFJZC5zdHJpbmcoKSk7CiAgICAgICAgICAgICBBTE9HRSgiJXM6ICVzIiwgX19GVU5DVElPTl9fLCBtc2cuc3RyaW5nKCkpOwpAQCAtMTcyNCw3ICsxNzI1LDcgQEAKIC8vIFRPRE86IG1vdmUgdG8gQ2FtZXJhMkNsaWVudEJhc2UKIGJvb2wgQ2FtZXJhRGV2aWNlQ2xpZW50OjplbmZvcmNlUmVxdWVzdFBlcm1pc3Npb25zKENhbWVyYU1ldGFkYXRhJiBtZXRhZGF0YSkgewogCi0gICAgY29uc3QgaW50IHBpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKTsKKyAgICBjb25zdCBpbnQgcGlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKTsKICAgICBjb25zdCBpbnQgc2VsZlBpZCA9IGdldHBpZCgpOwogICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeV90IGVudHJ5OwogCkBAIC0xNzYzLDcgKzE3NjQsNyBAQAogICAgICAgICBTdHJpbmcxNiBwZXJtaXNzaW9uU3RyaW5nID0KICAgICAgICAgICAgIFN0cmluZzE2KCJhbmRyb2lkLnBlcm1pc3Npb24uQ0FNRVJBX0RJU0FCTEVfVFJBTlNNSVRfTEVEIik7CiAgICAgICAgIGlmICghY2hlY2tDYWxsaW5nUGVybWlzc2lvbihwZXJtaXNzaW9uU3RyaW5nKSkgewotICAgICAgICAgICAgY29uc3QgaW50IHVpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKTsKKyAgICAgICAgICAgIGNvbnN0IGludCB1aWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1VpZCgpOwogICAgICAgICAgICAgQUxPR0UoIlBlcm1pc3Npb24gRGVuaWFsOiAiCiAgICAgICAgICAgICAgICAgICAiY2FuJ3QgZGlzYWJsZSB0cmFuc21pdCBMRUQgcGlkPSVkLCB1aWQ9JWQiLCBwaWQsIHVpZCk7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYURldmljZUNsaWVudC5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuaAppbmRleCBjMzA1NjFkLi4wOWNlOTc3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYURldmljZUNsaWVudC5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmgKQEAgLTMwMSw2ICszMDEsNyBAQAogICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxpbnQzMl90LCBPdXRwdXRTdHJlYW1JbmZvPiBtU3RyZWFtSW5mb01hcDsKIAogICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IE1BWF9TVVJGQUNFU19QRVJfU1RSRUFNID0gMjsKKyAgICBzcDxDYW1lcmFQcm92aWRlck1hbmFnZXI+IG1Qcm92aWRlck1hbmFnZXI7CiB9OwogCiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYTJDbGllbnRCYXNlLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmEyQ2xpZW50QmFzZS5jcHAKaW5kZXggY2UwMDZhNy4uNzhmZWIzZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYTJDbGllbnRCYXNlLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhMkNsaWVudEJhc2UuY3BwCkBAIC0zMiwxNCArMzIsMTEgQEAKICNpbmNsdWRlICJhcGkyL0NhbWVyYURldmljZUNsaWVudC5oIgogCiAjaW5jbHVkZSAiZGV2aWNlMy9DYW1lcmEzRGV2aWNlLmgiCisjaW5jbHVkZSAidXRpbHMvQ2FtZXJhVGhyZWFkU3RhdGUuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogdXNpbmcgbmFtZXNwYWNlIGNhbWVyYTI7CiAKLXN0YXRpYyBpbnQgZ2V0Q2FsbGluZ1BpZCgpIHsKLSAgICByZXR1cm4gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOwotfQotCiAvLyBJbnRlcmZhY2UgdXNlZCBieSBDYW1lcmFTZXJ2aWNlCiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBUQ2xpZW50QmFzZT4KQEAgLTU3LDEzICs1NCwxMyBAQAogICAgICAgICAgICAgICAgIGNhbWVyYUlkLCBhcGkxQ2FtZXJhSWQsIGNhbWVyYUZhY2luZywgY2xpZW50UGlkLCBjbGllbnRVaWQsIHNlcnZpY2VQaWQpLAogICAgICAgICBtU2hhcmVkQ2FtZXJhQ2FsbGJhY2tzKHJlbW90ZUNhbGxiYWNrKSwKICAgICAgICAgbURldmljZVZlcnNpb24oY2FtZXJhU2VydmljZS0+Z2V0RGV2aWNlVmVyc2lvbihUQ2xpZW50QmFzZTo6bUNhbWVyYUlkU3RyKSksCisgICAgICAgIG1EZXZpY2UobmV3IENhbWVyYTNEZXZpY2UoY2FtZXJhSWQpKSwKICAgICAgICAgbURldmljZUFjdGl2ZShmYWxzZSksIG1BcGkxQ2FtZXJhSWQoYXBpMUNhbWVyYUlkKQogewogICAgIEFMT0dJKCJDYW1lcmEgJXM6IE9wZW5lZC4gQ2xpZW50OiAlcyAoUElEICVkLCBVSUQgJWQpIiwgY2FtZXJhSWQuc3RyaW5nKCksCiAgICAgICAgICAgICBTdHJpbmc4KGNsaWVudFBhY2thZ2VOYW1lKS5zdHJpbmcoKSwgY2xpZW50UGlkLCBjbGllbnRVaWQpOwogCiAgICAgbUluaXRpYWxDbGllbnRQaWQgPSBjbGllbnRQaWQ7Ci0gICAgbURldmljZSA9IG5ldyBDYW1lcmEzRGV2aWNlKGNhbWVyYUlkKTsKICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG1EZXZpY2UgPT0gMCwgIkRldmljZSBzaG91bGQgbmV2ZXIgYmUgTlVMTCBoZXJlLiIpOwogfQogCkBAIC03MSw3ICs2OCw3IEBACiBzdGF0dXNfdCBDYW1lcmEyQ2xpZW50QmFzZTxUQ2xpZW50QmFzZT46OmNoZWNrUGlkKGNvbnN0IGNoYXIqIGNoZWNrTG9jYXRpb24pCiAgICAgICAgIGNvbnN0IHsKIAotICAgIGludCBjYWxsaW5nUGlkID0gZ2V0Q2FsbGluZ1BpZCgpOworICAgIGludCBjYWxsaW5nUGlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKTsKICAgICBpZiAoY2FsbGluZ1BpZCA9PSBUQ2xpZW50QmFzZTo6bUNsaWVudFBpZCkgcmV0dXJuIE5PX0VSUk9SOwogCiAgICAgQUxPR0UoIiVzOiBhdHRlbXB0IHRvIHVzZSBhIGxvY2tlZCBjYW1lcmEgZnJvbSBhIGRpZmZlcmVudCBwcm9jZXNzIgpAQCAtMTg2LDcgKzE4Myw3IEBACiAKICAgICBiaW5kZXI6OlN0YXR1cyByZXMgPSBiaW5kZXI6OlN0YXR1czo6b2soKTsKICAgICAvLyBBbGxvdyBib3RoIGNsaWVudCBhbmQgdGhlIG1lZGlhIHNlcnZlciB0byBkaXNjb25uZWN0IGF0IGFsbCB0aW1lcwotICAgIGludCBjYWxsaW5nUGlkID0gZ2V0Q2FsbGluZ1BpZCgpOworICAgIGludCBjYWxsaW5nUGlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKTsKICAgICBpZiAoY2FsbGluZ1BpZCAhPSBUQ2xpZW50QmFzZTo6bUNsaWVudFBpZCAmJgogICAgICAgICBjYWxsaW5nUGlkICE9IFRDbGllbnRCYXNlOjptU2VydmljZVBpZCkgcmV0dXJuIHJlczsKIApAQCAtMjA2LDggKzIwMyw2IEBACiAgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuOwogICAgIG1EZXZpY2UtPmRpc2Nvbm5lY3QoKTsKIAotICAgIG1EZXZpY2UuY2xlYXIoKTsKLQogICAgIEFMT0dWKCJDYW1lcmEgJXM6IERldGFjaCBjb21wbGV0ZSIsIFRDbGllbnRCYXNlOjptQ2FtZXJhSWRTdHIuc3RyaW5nKCkpOwogfQogCkBAIC0yMTksMTggKzIxNCwxOCBAQAogICAgIE11dGV4OjpBdXRvbG9jayBpY2wobUJpbmRlclNlcmlhbGl6YXRpb25Mb2NrKTsKIAogICAgIGlmIChUQ2xpZW50QmFzZTo6bUNsaWVudFBpZCAhPSAwICYmCi0gICAgICAgIGdldENhbGxpbmdQaWQoKSAhPSBUQ2xpZW50QmFzZTo6bUNsaWVudFBpZCkgeworICAgICAgICBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpICE9IFRDbGllbnRCYXNlOjptQ2xpZW50UGlkKSB7CiAKICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJXM6IENvbm5lY3Rpb24gYXR0ZW1wdCBmcm9tIHBpZCAlZDsgIgogICAgICAgICAgICAgICAgICJjdXJyZW50IGxvY2tlZCB0byBwaWQgJWQiLAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywKICAgICAgICAgICAgICAgICBUQ2xpZW50QmFzZTo6bUNhbWVyYUlkU3RyLnN0cmluZygpLAotICAgICAgICAgICAgICAgIGdldENhbGxpbmdQaWQoKSwKKyAgICAgICAgICAgICAgICBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpLAogICAgICAgICAgICAgICAgIFRDbGllbnRCYXNlOjptQ2xpZW50UGlkKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKLSAgICBUQ2xpZW50QmFzZTo6bUNsaWVudFBpZCA9IGdldENhbGxpbmdQaWQoKTsKKyAgICBUQ2xpZW50QmFzZTo6bUNsaWVudFBpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCk7CiAKICAgICBUQ2xpZW50QmFzZTo6bVJlbW90ZUNhbGxiYWNrID0gY2xpZW50OwogICAgIG1TaGFyZWRDYW1lcmFDYWxsYmFja3MgPSBjbGllbnQ7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhMkNsaWVudEJhc2UuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmEyQ2xpZW50QmFzZS5oCmluZGV4IGU3NGZiZGYuLjY2OTM4NDcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmEyQ2xpZW50QmFzZS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmEyQ2xpZW50QmFzZS5oCkBAIC0xMzAsNyArMTMwLDEwIEBACiAgICAgLyoqIENhbWVyYURldmljZUJhc2UgaW5zdGFuY2Ugd3JhcHBpbmcgSEFMMysgZW50cnkgKi8KIAogICAgIGNvbnN0IGludCBtRGV2aWNlVmVyc2lvbjsKLSAgICBzcDxDYW1lcmFEZXZpY2VCYXNlPiAgbURldmljZTsKKworICAgIC8vIFNldCB0byBjb25zdCB0byBhdm9pZCBtRGV2aWNlIGJlaW5nIHVwZGF0ZWQgKHVwZGF0ZSBvZiBzcDw+IGlzIHJhY3kpIGR1cmluZworICAgIC8vIGR1bXBEZXZpY2UgKHdoaWNoIGlzIGltcG9ydGFudCB0byBiZSBsb2NrIGZyZWUgZm9yIGRlYnVnZ2luZyBwdXJwb3NlKQorICAgIGNvbnN0IHNwPENhbWVyYURldmljZUJhc2U+ICBtRGV2aWNlOwogCiAgICAgLyoqIFV0aWxpdHkgbWVtYmVycyAqLwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmFQcm92aWRlck1hbmFnZXIuY3BwCmluZGV4IDBjZTQzMTguLjI1NDJhYjIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmFQcm92aWRlck1hbmFnZXIuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmFQcm92aWRlck1hbmFnZXIuY3BwCkBAIC0yMCw5ICsyMCwxMiBAQAogCiAjaW5jbHVkZSAiQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLmgiCiAKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9kZXZpY2UvMy41L0lDYW1lcmFEZXZpY2UuaD4KKwogI2luY2x1ZGUgPGFsZ29yaXRobT4KICNpbmNsdWRlIDxjaHJvbm8+CiAjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxoYXJkd2FyZS9jYW1lcmFfY29tbW9uLmg+CiAjaW5jbHVkZSA8aGlkbC9TZXJ2aWNlTWFuYWdlbWVudC5oPgogI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CiAjaW5jbHVkZSA8Y2FtZXJhX21ldGFkYXRhX2hpZGRlbi5oPgpAQCAtMzM2LDYgKzMzOSw3IEBACiAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3N0cmluZyYgLypmcU5hbWUqLywKICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfc3RyaW5nJiBuYW1lLAogICAgICAgICBib29sIC8qcHJlZXhpc3RpbmcqLykgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBwcm92aWRlckxvY2sobVByb3ZpZGVyTGlmZWN5Y2xlTG9jayk7CiAgICAgewogICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtSW50ZXJmYWNlTXV0ZXgpOwogCkBAIC0zOTIsMzUgKzM5NiwxODQgQEAKICAgICByZXR1cm4gcmV0OwogfQogCi1ib29sIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6aXNMb2dpY2FsQ2FtZXJhKGNvbnN0IENhbWVyYU1ldGFkYXRhJiBzdGF0aWNJbmZvLAotICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIHBoeXNpY2FsQ2FtZXJhSWRzKSB7Ci0gICAgYm9vbCBpc0xvZ2ljYWxDYW0gPSBmYWxzZTsKLSAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBlbnRyeUNhcDsKK3ZvaWQgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8zOjpxdWVyeVBoeXNpY2FsQ2FtZXJhSWRzKCkgeworICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeV90IGVudHJ5Q2FwOwogCi0gICAgZW50cnlDYXAgPSBzdGF0aWNJbmZvLmZpbmQoQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVMpOworICAgIGVudHJ5Q2FwID0gbUNhbWVyYUNoYXJhY3RlcmlzdGljcy5maW5kKEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGVudHJ5Q2FwLmNvdW50OyArK2kpIHsKICAgICAgICAgdWludDhfdCBjYXBhYmlsaXR5ID0gZW50cnlDYXAuZGF0YS51OFtpXTsKICAgICAgICAgaWYgKGNhcGFiaWxpdHkgPT0gQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfTE9HSUNBTF9NVUxUSV9DQU1FUkEpIHsKLSAgICAgICAgICAgIGlzTG9naWNhbENhbSA9IHRydWU7CisgICAgICAgICAgICBtSXNMb2dpY2FsQ2FtZXJhID0gdHJ1ZTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQotICAgIGlmICghaXNMb2dpY2FsQ2FtKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoIW1Jc0xvZ2ljYWxDYW1lcmEpIHsKKyAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90IGVudHJ5SWRzID0gc3RhdGljSW5mby5maW5kKEFORFJPSURfTE9HSUNBTF9NVUxUSV9DQU1FUkFfUEhZU0lDQUxfSURTKTsKKyAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnlfdCBlbnRyeUlkcyA9IG1DYW1lcmFDaGFyYWN0ZXJpc3RpY3MuZmluZCgKKyAgICAgICAgICAgIEFORFJPSURfTE9HSUNBTF9NVUxUSV9DQU1FUkFfUEhZU0lDQUxfSURTKTsKICAgICBjb25zdCB1aW50OF90KiBpZHMgPSBlbnRyeUlkcy5kYXRhLnU4OwogICAgIHNpemVfdCBzdGFydCA9IDA7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBlbnRyeUlkcy5jb3VudDsgKytpKSB7CiAgICAgICAgIGlmIChpZHNbaV0gPT0gJ1wwJykgewogICAgICAgICAgICAgaWYgKHN0YXJ0ICE9IGkpIHsKLSAgICAgICAgICAgICAgICBwaHlzaWNhbENhbWVyYUlkcy0+cHVzaF9iYWNrKChjb25zdCBjaGFyKilpZHMrc3RhcnQpOworICAgICAgICAgICAgICAgIG1QaHlzaWNhbElkcy5wdXNoX2JhY2soKGNvbnN0IGNoYXIqKWlkcytzdGFydCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzdGFydCA9IGkrMTsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8zOjpmaXh1cE1vbm9jaHJvbWVUYWdzKCkgeworICAgIHN0YXR1c190IHJlcyA9IE9LOworICAgIGF1dG8mIGMgPSBtQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzOworCisgICAgLy8gT3ZlcnJpZGUgc3RhdGljIG1ldGFkYXRhIGZvciBNT05PQ0hST01FIGNhbWVyYSB3aXRoIG9sZGVyIGRldmljZSB2ZXJzaW9uCisgICAgaWYgKG1WZXJzaW9uLmdldF9tYWpvcigpID09IDMgJiYgbVZlcnNpb24uZ2V0X21pbm9yKCkgPCA1KSB7CisgICAgICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeSBjYXAgPSBjLmZpbmQoQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVMpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNhcC5jb3VudDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoY2FwLmRhdGEudThbaV0gPT0gQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfTU9OT0NIUk9NRSkgeworICAgICAgICAgICAgICAgIC8vIEFORFJPSURfU0VOU09SX0lORk9fQ09MT1JfRklMVEVSX0FSUkFOR0VNRU5UCisgICAgICAgICAgICAgICAgdWludDhfdCBjZmEgPSBBTkRST0lEX1NFTlNPUl9JTkZPX0NPTE9SX0ZJTFRFUl9BUlJBTkdFTUVOVF9NT05POworICAgICAgICAgICAgICAgIHJlcyA9IGMudXBkYXRlKEFORFJPSURfU0VOU09SX0lORk9fQ09MT1JfRklMVEVSX0FSUkFOR0VNRU5ULCAmY2ZhLCAxKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHVwZGF0ZSBDT0xPUl9GSUxURVJfQVJSQU5HRU1FTlQ6ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0hBUkFDVEVSSVNUSUNTX0tFWVMKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4gc0tleXMgPSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTkRST0lEX1NFTlNPUl9SRUZFUkVOQ0VfSUxMVU1JTkFOVDEsCisgICAgICAgICAgICAgICAgICAgICAgICBBTkRST0lEX1NFTlNPUl9SRUZFUkVOQ0VfSUxMVU1JTkFOVDIsCisgICAgICAgICAgICAgICAgICAgICAgICBBTkRST0lEX1NFTlNPUl9DQUxJQlJBVElPTl9UUkFOU0ZPUk0xLAorICAgICAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9TRU5TT1JfQ0FMSUJSQVRJT05fVFJBTlNGT1JNMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFORFJPSURfU0VOU09SX0NPTE9SX1RSQU5TRk9STTEsCisgICAgICAgICAgICAgICAgICAgICAgICBBTkRST0lEX1NFTlNPUl9DT0xPUl9UUkFOU0ZPUk0yLAorICAgICAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9TRU5TT1JfRk9SV0FSRF9NQVRSSVgxLAorICAgICAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9TRU5TT1JfRk9SV0FSRF9NQVRSSVgyLAorICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgcmVzID0gcmVtb3ZlQXZhaWxhYmxlS2V5cyhjLCBzS2V5cywKKyAgICAgICAgICAgICAgICAgICAgICAgIEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0hBUkFDVEVSSVNUSUNTX0tFWVMpOworICAgICAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gdXBkYXRlIFJFUVVFU1RfQVZBSUxBQkxFX0NIQVJBQ1RFUklTVElDU19LRVlTOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfUkVRVUVTVF9LRVlTCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDMyX3Q+IHJlcUtleXMgPSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTkRST0lEX0NPTE9SX0NPUlJFQ1RJT05fTU9ERSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFORFJPSURfQ09MT1JfQ09SUkVDVElPTl9UUkFOU0ZPUk0sCisgICAgICAgICAgICAgICAgICAgICAgICBBTkRST0lEX0NPTE9SX0NPUlJFQ1RJT05fR0FJTlMsCisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICByZXMgPSByZW1vdmVBdmFpbGFibGVLZXlzKGMsIHJlcUtleXMsIEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfUkVRVUVTVF9LRVlTKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHVwZGF0ZSBSRVFVRVNUX0FWQUlMQUJMRV9SRVFVRVNUX0tFWVM6ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9SRVNVTFRfS0VZUworICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQzMl90PiByZXNLZXlzID0geworICAgICAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9TRU5TT1JfR1JFRU5fU1BMSVQsCisgICAgICAgICAgICAgICAgICAgICAgICBBTkRST0lEX1NFTlNPUl9ORVVUUkFMX0NPTE9SX1BPSU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9DT0xPUl9DT1JSRUNUSU9OX01PREUsCisgICAgICAgICAgICAgICAgICAgICAgICBBTkRST0lEX0NPTE9SX0NPUlJFQ1RJT05fVFJBTlNGT1JNLAorICAgICAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9DT0xPUl9DT1JSRUNUSU9OX0dBSU5TLAorICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgcmVzID0gcmVtb3ZlQXZhaWxhYmxlS2V5cyhjLCByZXNLZXlzLCBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX1JFU1VMVF9LRVlTKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHVwZGF0ZSBSRVFVRVNUX0FWQUlMQUJMRV9SRVNVTFRfS0VZUzogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBBTkRST0lEX1NFTlNPUl9CTEFDS19MRVZFTF9QQVRURVJOCisgICAgICAgICAgICAgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5IGJsRW50cnkgPSBjLmZpbmQoQU5EUk9JRF9TRU5TT1JfQkxBQ0tfTEVWRUxfUEFUVEVSTik7CisgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDE7IGogPCBibEVudHJ5LmNvdW50OyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgYmxFbnRyeS5kYXRhLmkzMltqXSA9IGJsRW50cnkuZGF0YS5pMzJbMF07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKK3N0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMzo6cmVtb3ZlQXZhaWxhYmxlS2V5cygKKyAgICAgICAgQ2FtZXJhTWV0YWRhdGEmIGMsIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQzMl90PiYga2V5cywgdWludDMyX3Qga2V5VGFnKSB7CisgICAgc3RhdHVzX3QgcmVzID0gT0s7CisKKyAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnkga2V5c0VudHJ5ID0gYy5maW5kKGtleVRhZyk7CisgICAgaWYgKGtleXNFbnRyeS5jb3VudCA9PSAwKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGZpbmQgdGFnICV1OiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLCBrZXlUYWcsIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKyAgICBzdGQ6OnZlY3RvcjxpbnQzMl90PiB2S2V5czsKKyAgICB2S2V5cy5yZXNlcnZlKGtleXNFbnRyeS5jb3VudCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrZXlzRW50cnkuY291bnQ7IGkrKykgeworICAgICAgICBpZiAoc3RkOjpmaW5kKGtleXMuYmVnaW4oKSwga2V5cy5lbmQoKSwga2V5c0VudHJ5LmRhdGEuaTMyW2ldKSA9PSBrZXlzLmVuZCgpKSB7CisgICAgICAgICAgICB2S2V5cy5wdXNoX2JhY2soa2V5c0VudHJ5LmRhdGEuaTMyW2ldKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXMgPSBjLnVwZGF0ZShrZXlUYWcsIHZLZXlzLmRhdGEoKSwgdktleXMuc2l6ZSgpKTsKKyAgICByZXR1cm4gcmVzOworfQorCitib29sIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6aXNMb2dpY2FsQ2FtZXJhKGNvbnN0IHN0ZDo6c3RyaW5nJiBpZCwKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiBwaHlzaWNhbENhbWVyYUlkcykgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1JbnRlcmZhY2VNdXRleCk7CisKKyAgICBhdXRvIGRldmljZUluZm8gPSBmaW5kRGV2aWNlSW5mb0xvY2tlZChpZCk7CisgICAgaWYgKGRldmljZUluZm8gPT0gbnVsbHB0cikgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKGRldmljZUluZm8tPm1Jc0xvZ2ljYWxDYW1lcmEgJiYgcGh5c2ljYWxDYW1lcmFJZHMgIT0gbnVsbHB0cikgeworICAgICAgICAqcGh5c2ljYWxDYW1lcmFJZHMgPSBkZXZpY2VJbmZvLT5tUGh5c2ljYWxJZHM7CisgICAgfQorICAgIHJldHVybiBkZXZpY2VJbmZvLT5tSXNMb2dpY2FsQ2FtZXJhOworfQorCitib29sIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6aXNIaWRkZW5QaHlzaWNhbENhbWVyYShjb25zdCBzdGQ6OnN0cmluZyYgY2FtZXJhSWQpIHsKKyAgICBmb3IgKGF1dG8mIHByb3ZpZGVyIDogbVByb3ZpZGVycykgeworICAgICAgICBmb3IgKGF1dG8mIGRldmljZUluZm8gOiBwcm92aWRlci0+bURldmljZXMpIHsKKyAgICAgICAgICAgIGlmIChkZXZpY2VJbmZvLT5tSWQgPT0gY2FtZXJhSWQpIHsKKyAgICAgICAgICAgICAgICAvLyBjYW1lcmFJZCBpcyBmb3VuZCBpbiBwdWJsaWMgY2FtZXJhIElEcyBhZHZlcnRpc2VkIGJ5IHRoZQorICAgICAgICAgICAgICAgIC8vIHByb3ZpZGVyLgorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoYXV0byYgcHJvdmlkZXIgOiBtUHJvdmlkZXJzKSB7CisgICAgICAgIGZvciAoYXV0byYgZGV2aWNlSW5mbyA6IHByb3ZpZGVyLT5tRGV2aWNlcykgeworICAgICAgICAgICAgQ2FtZXJhTWV0YWRhdGEgaW5mbzsKKyAgICAgICAgICAgIHN0YXR1c190IHJlcyA9IGRldmljZUluZm8tPmdldENhbWVyYUNoYXJhY3RlcmlzdGljcygmaW5mbyk7CisgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzIGZvciBpZCAlcyIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZUluZm8tPm1JZC5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBwaHlzaWNhbElkczsKKyAgICAgICAgICAgIGlmIChkZXZpY2VJbmZvLT5tSXNMb2dpY2FsQ2FtZXJhKSB7CisgICAgICAgICAgICAgICAgaWYgKHN0ZDo6ZmluZChkZXZpY2VJbmZvLT5tUGh5c2ljYWxJZHMuYmVnaW4oKSwgZGV2aWNlSW5mby0+bVBoeXNpY2FsSWRzLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhSWQpICE9IGRldmljZUluZm8tPm1QaHlzaWNhbElkcy5lbmQoKSkgeworICAgICAgICAgICAgICAgICAgICBpbnQgZGV2aWNlVmVyc2lvbiA9IEhBUkRXQVJFX0RFVklDRV9BUElfVkVSU0lPTigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VJbmZvLT5tVmVyc2lvbi5nZXRfbWFqb3IoKSwgZGV2aWNlSW5mby0+bVZlcnNpb24uZ2V0X21pbm9yKCkpOworICAgICAgICAgICAgICAgICAgICBpZiAoZGV2aWNlVmVyc2lvbiA8IENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM181KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFdyb25nIGRldmljZVZlcnNpb24gJXggZm9yIGhpZGRlblBoeXNpY2FsQ2FtZXJhSWQgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGRldmljZVZlcnNpb24sIGNhbWVyYUlkLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKIHN0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6YWRkUHJvdmlkZXJMb2NrZWQoY29uc3Qgc3RkOjpzdHJpbmcmIG5ld1Byb3ZpZGVyLCBib29sIGV4cGVjdGVkKSB7CkBAIC00NTgsNiArNjExLDcgQEAKIH0KIAogc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpyZW1vdmVQcm92aWRlcihjb25zdCBzdGQ6OnN0cmluZyYgcHJvdmlkZXIpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gcHJvdmlkZXJMb2NrKG1Qcm92aWRlckxpZmVjeWNsZUxvY2spOwogICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhtSW50ZXJmYWNlTXV0ZXgpOwogICAgIHN0ZDo6dmVjdG9yPFN0cmluZzg+IHJlbW92ZWREZXZpY2VJZHM7CiAgICAgc3RhdHVzX3QgcmVzID0gTkFNRV9OT1RfRk9VTkQ7CkBAIC01NDIsMTMgKzY5NiwyMiBAQAogCiAgICAgLy8gR2V0IGluaXRpYWwgbGlzdCBvZiBjYW1lcmEgZGV2aWNlcywgaWYgYW55CiAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGRldmljZXM7Ci0gICAgaGFyZHdhcmU6OlJldHVybjx2b2lkPiByZXQgPSBtSW50ZXJmYWNlLT5nZXRDYW1lcmFJZExpc3QoWyZzdGF0dXMsICZkZXZpY2VzXSgKKyAgICBoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IHJldCA9IG1JbnRlcmZhY2UtPmdldENhbWVyYUlkTGlzdChbJnN0YXR1cywgdGhpcywgJmRldmljZXNdKAogICAgICAgICAgICAgU3RhdHVzIGlkU3RhdHVzLAogICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPGhhcmR3YXJlOjpoaWRsX3N0cmluZz4mIGNhbWVyYURldmljZU5hbWVzKSB7CiAgICAgICAgIHN0YXR1cyA9IGlkU3RhdHVzOwogICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY2FtZXJhRGV2aWNlTmFtZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBkZXZpY2VzLnB1c2hfYmFjayhjYW1lcmFEZXZpY2VOYW1lc1tpXSk7CisgICAgICAgICAgICBmb3IgKGF1dG8mIG5hbWUgOiBjYW1lcmFEZXZpY2VOYW1lcykgeworICAgICAgICAgICAgICAgIHVpbnQxNl90IG1ham9yLCBtaW5vcjsKKyAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyB0eXBlLCBpZDsKKyAgICAgICAgICAgICAgICBzdGF0dXNfdCByZXMgPSBwYXJzZURldmljZU5hbWUobmFtZSwgJm1ham9yLCAmbWlub3IsICZ0eXBlLCAmaWQpOworICAgICAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBFcnJvciBwYXJzaW5nIGRldmljZU5hbWU6ICVzOiAlZCIsIF9fRlVOQ1RJT05fXywgbmFtZS5jX3N0cigpLCByZXMpOworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBTdGF0dXM6OklOVEVSTkFMX0VSUk9SOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGRldmljZXMucHVzaF9iYWNrKG5hbWUpOworICAgICAgICAgICAgICAgICAgICBtUHJvdmlkZXJQdWJsaWNDYW1lcmFJZHMucHVzaF9iYWNrKGlkKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gfSk7CiAgICAgaWYgKCFyZXQuaXNPaygpKSB7CkBAIC03MDMsNiArODY2LDI0IEBACiAgICAgICAgICAgICBpbmZvMi5kdW1wKGZkLCAvKnZlcmJvc2l0eSovIDIsIC8qaW5kZW50YXRpb24qLyA0KTsKICAgICAgICAgfQogCisgICAgICAgIC8vIER1bXAgY2hhcmFjdGVyaXN0aWNzIG9mIG5vbi1zdGFuZGFsb25lIHBoeXNpY2FsIGNhbWVyYQorICAgICAgICBpZiAoZGV2aWNlLT5tSXNMb2dpY2FsQ2FtZXJhKSB7CisgICAgICAgICAgICBmb3IgKGF1dG8mIGlkIDogZGV2aWNlLT5tUGh5c2ljYWxJZHMpIHsKKyAgICAgICAgICAgICAgICAvLyBTa2lwIGlmIHBoeXNpY2FsIGlkIGlzIGFuIGluZGVwZW5kZW50IGNhbWVyYQorICAgICAgICAgICAgICAgIGlmIChzdGQ6OmZpbmQobVByb3ZpZGVyUHVibGljQ2FtZXJhSWRzLmJlZ2luKCksIG1Qcm92aWRlclB1YmxpY0NhbWVyYUlkcy5lbmQoKSwgaWQpCisgICAgICAgICAgICAgICAgICAgICAgICAhPSBtUHJvdmlkZXJQdWJsaWNDYW1lcmFJZHMuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQ2FtZXJhTWV0YWRhdGEgcGh5c2ljYWxJbmZvOworICAgICAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGRldmljZS0+Z2V0UGh5c2ljYWxDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoaWQsICZwaHlzaWNhbEluZm8pOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgZHByaW50ZihmZCwgIiAgUGh5c2ljYWwgY2FtZXJhICVzIGNoYXJhY3RlcmlzdGljczpcbiIsIGlkLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbEluZm8uZHVtcChmZCwgLyp2ZXJib3NpdHkqLyAyLCAvKmluZGVudGF0aW9uKi8gNCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKICAgICAgICAgZHByaW50ZihmZCwgIj09IENhbWVyYSBIQUwgZGV2aWNlICVzICh2JWQuJWQpIGR1bXBTdGF0ZTogPT1cbiIsIGRldmljZS0+bU5hbWUuY19zdHIoKSwKICAgICAgICAgICAgICAgICBkZXZpY2UtPm1WZXJzaW9uLmdldF9tYWpvcigpLCBkZXZpY2UtPm1WZXJzaW9uLmdldF9taW5vcigpKTsKICAgICAgICAgcmVzID0gZGV2aWNlLT5kdW1wU3RhdGUoZmQpOwpAQCAtODM2LDcgKzEwMTcsNyBAQAogCiAgICAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjxEZXZpY2VJbmZvPigKICAgICAgICAgbmV3IERldmljZUluZm9UKG5hbWUsIHRhZ0lkLCBpZCwgbWlub3JWZXJzaW9uLCByZXNvdXJjZUNvc3QsCi0gICAgICAgICAgICAgICAgY2FtZXJhSW50ZXJmYWNlKSk7CisgICAgICAgICAgICAgICAgbVByb3ZpZGVyUHVibGljQ2FtZXJhSWRzLCBjYW1lcmFJbnRlcmZhY2UpKTsKIH0KIAogdGVtcGxhdGU8Y2xhc3MgSW50ZXJmYWNlVD4KQEAgLTkxMCw5ICsxMDkxLDEwIEBACiAgICAgICAgIGNvbnN0IG1ldGFkYXRhX3ZlbmRvcl9pZF90IHRhZ0lkLCBjb25zdCBzdGQ6OnN0cmluZyAmaWQsCiAgICAgICAgIHVpbnQxNl90IG1pbm9yVmVyc2lvbiwKICAgICAgICAgY29uc3QgQ2FtZXJhUmVzb3VyY2VDb3N0JiByZXNvdXJjZUNvc3QsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgcHVibGljQ2FtZXJhSWRzLAogICAgICAgICBzcDxJbnRlcmZhY2VUPiBpbnRlcmZhY2UpIDoKICAgICAgICAgRGV2aWNlSW5mbyhuYW1lLCB0YWdJZCwgaWQsIGhhcmR3YXJlOjpoaWRsX3ZlcnNpb257MSwgbWlub3JWZXJzaW9ufSwKLSAgICAgICAgICAgICAgICAgICByZXNvdXJjZUNvc3QpLAorICAgICAgICAgICAgICAgICAgIHB1YmxpY0NhbWVyYUlkcywgcmVzb3VyY2VDb3N0KSwKICAgICAgICAgbUludGVyZmFjZShpbnRlcmZhY2UpIHsKICAgICAvLyBHZXQgZGVmYXVsdCBwYXJhbWV0ZXJzIGFuZCBpbml0aWFsaXplIGZsYXNoIHVuaXQgYXZhaWxhYmlsaXR5CiAgICAgLy8gUmVxdWlyZXMgcG93ZXJpbmcgb24gdGhlIGNhbWVyYSBkZXZpY2UKQEAgLTEwMDksOSArMTE5MSwxMCBAQAogICAgICAgICBjb25zdCBtZXRhZGF0YV92ZW5kb3JfaWRfdCB0YWdJZCwgY29uc3Qgc3RkOjpzdHJpbmcgJmlkLAogICAgICAgICB1aW50MTZfdCBtaW5vclZlcnNpb24sCiAgICAgICAgIGNvbnN0IENhbWVyYVJlc291cmNlQ29zdCYgcmVzb3VyY2VDb3N0LAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIHB1YmxpY0NhbWVyYUlkcywKICAgICAgICAgc3A8SW50ZXJmYWNlVD4gaW50ZXJmYWNlKSA6CiAgICAgICAgIERldmljZUluZm8obmFtZSwgdGFnSWQsIGlkLCBoYXJkd2FyZTo6aGlkbF92ZXJzaW9uezMsIG1pbm9yVmVyc2lvbn0sCi0gICAgICAgICAgICAgICAgICAgcmVzb3VyY2VDb3N0KSwKKyAgICAgICAgICAgICAgICAgICBwdWJsaWNDYW1lcmFJZHMsIHJlc291cmNlQ29zdCksCiAgICAgICAgIG1JbnRlcmZhY2UoaW50ZXJmYWNlKSB7CiAgICAgLy8gR2V0IGNhbWVyYSBjaGFyYWN0ZXJpc3RpY3MgYW5kIGluaXRpYWxpemUgZmxhc2ggdW5pdCBhdmFpbGFiaWxpdHkKICAgICBTdGF0dXMgc3RhdHVzOwpAQCAtMTA0NCw2ICsxMjI3LDEyIEBACiAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQuY19zdHIoKSwgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpzdGF0dXNUb1N0cmluZyhzdGF0dXMpLCBzdGF0dXMpOwogICAgICAgICByZXR1cm47CiAgICAgfQorICAgIHN0YXR1c190IHJlcyA9IGZpeHVwTW9ub2Nocm9tZVRhZ3MoKTsKKyAgICBpZiAoT0sgIT0gcmVzKSB7CisgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIGZpeCB1cCBtb25vY2hyb21lIHRhZ3MgYmFzZWQgZm9yIG9sZGVyIEhBTCB2ZXJzaW9uOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICByZXR1cm47CisgICAgfQogICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeSBmbGFzaEF2YWlsYWJsZSA9CiAgICAgICAgICAgICBtQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLmZpbmQoQU5EUk9JRF9GTEFTSF9JTkZPX0FWQUlMQUJMRSk7CiAgICAgaWYgKGZsYXNoQXZhaWxhYmxlLmNvdW50ID09IDEgJiYKQEAgLTEwNTIsNiArMTI0MSw1OSBAQAogICAgIH0gZWxzZSB7CiAgICAgICAgIG1IYXNGbGFzaFVuaXQgPSBmYWxzZTsKICAgICB9CisKKyAgICBxdWVyeVBoeXNpY2FsQ2FtZXJhSWRzKCk7CisgICAgLy8gR2V0IHBoeXNpY2FsIGNhbWVyYSBjaGFyYWN0ZXJpc3RpY3MgaWYgYXBwbGljYWJsZQorICAgIGF1dG8gY2FzdFJlc3VsdCA9IGRldmljZTo6VjNfNTo6SUNhbWVyYURldmljZTo6Y2FzdEZyb20obUludGVyZmFjZSk7CisgICAgaWYgKCFjYXN0UmVzdWx0LmlzT2soKSkgeworICAgICAgICBBTE9HVigiJXM6IFVuYWJsZSB0byBjb252ZXJ0IElDYW1lcmFEZXZpY2UgaW5zdGFuY2UgdG8gdmVyc2lvbiAzLjUiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHNwPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNTo6SUNhbWVyYURldmljZT4gaW50ZXJmYWNlXzNfNSA9IGNhc3RSZXN1bHQ7CisgICAgaWYgKGludGVyZmFjZV8zXzUgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IENvbnZlcnRlZCBJQ2FtZXJhRGV2aWNlIGluc3RhbmNlIHRvIG51bGxwdHIiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKG1Jc0xvZ2ljYWxDYW1lcmEpIHsKKyAgICAgICAgZm9yIChhdXRvJiBpZCA6IG1QaHlzaWNhbElkcykgeworICAgICAgICAgICAgaWYgKHN0ZDo6ZmluZChtUHVibGljQ2FtZXJhSWRzLmJlZ2luKCksIG1QdWJsaWNDYW1lcmFJZHMuZW5kKCksIGlkKSAhPQorICAgICAgICAgICAgICAgICAgICBtUHVibGljQ2FtZXJhSWRzLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGhhcmR3YXJlOjpoaWRsX3N0cmluZyBoaWRsSWQoaWQpOworICAgICAgICAgICAgcmV0ID0gaW50ZXJmYWNlXzNfNS0+Z2V0UGh5c2ljYWxDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoaGlkbElkLAorICAgICAgICAgICAgICAgICAgICBbJnN0YXR1cywgJmlkLCB0aGlzXShTdGF0dXMgcywgZGV2aWNlOjpWM18yOjpDYW1lcmFNZXRhZGF0YSBtZXRhZGF0YSkgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHM7CisgICAgICAgICAgICAgICAgaWYgKHMgPT0gU3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgICAgICBjYW1lcmFfbWV0YWRhdGFfdCAqYnVmZmVyID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNhbWVyYV9tZXRhZGF0YV90Kj4obWV0YWRhdGEuZGF0YSgpKTsKKyAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGV4cGVjdGVkU2l6ZSA9IG1ldGFkYXRhLnNpemUoKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IHJlcyA9IHZhbGlkYXRlX2NhbWVyYV9tZXRhZGF0YV9zdHJ1Y3R1cmUoYnVmZmVyLCAmZXhwZWN0ZWRTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlcyA9PSBPSyB8fCByZXMgPT0gQ0FNRVJBX01FVEFEQVRBX1ZBTElEQVRJT05fU0hJRlRFRCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2V0X2NhbWVyYV9tZXRhZGF0YV92ZW5kb3JfaWQoYnVmZmVyLCBtUHJvdmlkZXJUYWdpZCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtUGh5c2ljYWxDYW1lcmFDaGFyYWN0ZXJpc3RpY3NbaWRdID0gYnVmZmVyOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBNYWxmb3JtZWQgY2FtZXJhIG1ldGFkYXRhIHJlY2VpdmVkIGZyb20gSEFMIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IFN0YXR1czo6SU5URVJOQUxfRVJST1I7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgaWYgKCFyZXQuaXNPaygpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvciBnZXR0aW5nIHBoeXNpY2FsIGNhbWVyYSAlcyBjaGFyYWN0ZXJpc3RpY3MgZm9yICVzOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGlkLmNfc3RyKCksIG1JZC5jX3N0cigpLCByZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBnZXQgcGh5c2ljYWwgY2FtZXJhICVzIGNoYXJhY3RlcmlzdGljcyBmb3IgZGV2aWNlICVzOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaWQuY19zdHIoKSwgbUlkLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICBDYW1lcmFQcm92aWRlck1hbmFnZXI6OnN0YXR1c1RvU3RyaW5nKHN0YXR1cyksIHN0YXR1cyk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogfQogCiBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzM6On5EZXZpY2VJbmZvMygpIHt9CkBAIC0xMTI3LDYgKzEzNjksMTggQEAKICAgICByZXR1cm4gT0s7CiB9CiAKK3N0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMzo6Z2V0UGh5c2ljYWxDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBwaHlzaWNhbENhbWVyYUlkLCBDYW1lcmFNZXRhZGF0YSAqY2hhcmFjdGVyaXN0aWNzKSBjb25zdCB7CisgICAgaWYgKGNoYXJhY3RlcmlzdGljcyA9PSBudWxscHRyKSByZXR1cm4gQkFEX1ZBTFVFOworICAgIGlmIChtUGh5c2ljYWxDYW1lcmFDaGFyYWN0ZXJpc3RpY3MuZmluZChwaHlzaWNhbENhbWVyYUlkKSA9PQorICAgICAgICAgICAgbVBoeXNpY2FsQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLmVuZCgpKSB7CisgICAgICAgIHJldHVybiBOQU1FX05PVF9GT1VORDsKKyAgICB9CisKKyAgICAqY2hhcmFjdGVyaXN0aWNzID0gbVBoeXNpY2FsQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLmF0KHBoeXNpY2FsQ2FtZXJhSWQpOworICAgIHJldHVybiBPSzsKK30KKwogc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OnBhcnNlUHJvdmlkZXJOYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAogICAgICAgICBzdGQ6OnN0cmluZyAqdHlwZSwgdWludDMyX3QgKmlkKSB7CiAgICAgLy8gRm9ybWF0IG11c3QgYmUgIjx0eXBlPi88aWQ+IgpAQCAtMTQ1OCwxMCArMTcxMiwyMCBAQAogCiBzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OmdldENhbWVyYUNoYXJhY3RlcmlzdGljc0xvY2tlZChjb25zdCBzdGQ6OnN0cmluZyAmaWQsCiAgICAgICAgIENhbWVyYU1ldGFkYXRhKiBjaGFyYWN0ZXJpc3RpY3MpIGNvbnN0IHsKLSAgICBhdXRvIGRldmljZUluZm8gPSBmaW5kRGV2aWNlSW5mb0xvY2tlZChpZCwgLyptaW5WZXJzaW9uKi8gezMsMH0sIC8qbWF4VmVyc2lvbiovIHs0LDB9KTsKLSAgICBpZiAoZGV2aWNlSW5mbyA9PSBudWxscHRyKSByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7CisgICAgYXV0byBkZXZpY2VJbmZvID0gZmluZERldmljZUluZm9Mb2NrZWQoaWQsIC8qbWluVmVyc2lvbiovIHszLDB9LCAvKm1heFZlcnNpb24qLyB7NSwwfSk7CisgICAgaWYgKGRldmljZUluZm8gIT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gZGV2aWNlSW5mby0+Z2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKGNoYXJhY3RlcmlzdGljcyk7CisgICAgfQogCi0gICAgcmV0dXJuIGRldmljZUluZm8tPmdldENhbWVyYUNoYXJhY3RlcmlzdGljcyhjaGFyYWN0ZXJpc3RpY3MpOworICAgIC8vIEZpbmQgaGlkZGVuIHBoeXNpY2FsIGNhbWVyYSBjaGFyYWN0ZXJpc3RpY3MKKyAgICBmb3IgKGF1dG8mIHByb3ZpZGVyIDogbVByb3ZpZGVycykgeworICAgICAgICBmb3IgKGF1dG8mIGRldmljZUluZm8gOiBwcm92aWRlci0+bURldmljZXMpIHsKKyAgICAgICAgICAgIHN0YXR1c190IHJlcyA9IGRldmljZUluZm8tPmdldFBoeXNpY2FsQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzKGlkLCBjaGFyYWN0ZXJpc3RpY3MpOworICAgICAgICAgICAgaWYgKHJlcyAhPSBOQU1FX05PVF9GT1VORCkgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBOQU1FX05PVF9GT1VORDsKIH0KIAogdm9pZCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OmZpbHRlckxvZ2ljYWxDYW1lcmFJZHNMb2NrZWQoCkBAIC0xNDcwLDIwICsxNzM0LDE0IEBACiAgICAgc3RkOjp1bm9yZGVyZWRfc2V0PHN0ZDo6c3RyaW5nPiByZW1vdmVkSWRzOwogCiAgICAgZm9yIChhdXRvJiBkZXZpY2VJZCA6IGRldmljZUlkcykgewotICAgICAgICBDYW1lcmFNZXRhZGF0YSBpbmZvOwotICAgICAgICBzdGF0dXNfdCByZXMgPSBnZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3NMb2NrZWQoZGV2aWNlSWQsICZpbmZvKTsKLSAgICAgICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzIGZvciBpZCAlcyIsIF9fRlVOQ1RJT05fXywKLSAgICAgICAgICAgICAgICAgICAgZGV2aWNlSWQuY19zdHIoKSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KKyAgICAgICAgYXV0byBkZXZpY2VJbmZvID0gZmluZERldmljZUluZm9Mb2NrZWQoZGV2aWNlSWQpOworICAgICAgICBpZiAoZGV2aWNlSW5mbyA9PSBudWxscHRyKSBjb250aW51ZTsKIAotICAgICAgICAvLyBpZENvbWJvIGNvbnRhaW5zIHRoZSBpZHMgb2YgYSBsb2dpY2FsIGNhbWVyYSBhbmQgaXRzIHBoeXNpY2FsIGNhbWVyYXMKLSAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGlkQ29tYm87Ci0gICAgICAgIGJvb2wgbG9naWNhbENhbWVyYSA9IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6aXNMb2dpY2FsQ2FtZXJhKGluZm8sICZpZENvbWJvKTsKLSAgICAgICAgaWYgKCFsb2dpY2FsQ2FtZXJhKSB7CisgICAgICAgIGlmICghZGV2aWNlSW5mby0+bUlzTG9naWNhbENhbWVyYSkgewogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KKyAgICAgICAgLy8gaWRDb21ibyBjb250YWlucyB0aGUgaWRzIG9mIGEgbG9naWNhbCBjYW1lcmEgYW5kIGl0cyBwaHlzaWNhbCBjYW1lcmFzCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBpZENvbWJvID0gZGV2aWNlSW5mby0+bVBoeXNpY2FsSWRzOwogICAgICAgICBpZENvbWJvLnB1c2hfYmFjayhkZXZpY2VJZCk7CiAKICAgICAgICAgZm9yIChhdXRvJiBpZCA6IGRldmljZUlkcykgewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYVByb3ZpZGVyTWFuYWdlci5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYVByb3ZpZGVyTWFuYWdlci5oCmluZGV4IGI4YjhiOGMuLmM1MDZkMzUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmFQcm92aWRlck1hbmFnZXIuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLmgKQEAgLTIzMSwxMiArMjMxLDEyIEBACiAgICAgICAgICAgICBoYXJkd2FyZTo6aGlkbF92ZXJzaW9uIG1heFZlcnNpb24gPSBoYXJkd2FyZTo6aGlkbF92ZXJzaW9uezEwMDAsMH0pIGNvbnN0OwogCiAgICAgLyoKLSAgICAgKiBDaGVjayBpZiBhIGNhbWVyYSB3aXRoIHN0YXRpY0luZm8gaXMgYSBsb2dpY2FsIGNhbWVyYS4gQW5kIGlmIHllcywgcmV0dXJuCisgICAgICogQ2hlY2sgaWYgYSBjYW1lcmEgaXMgYSBsb2dpY2FsIGNhbWVyYS4gQW5kIGlmIHllcywgcmV0dXJuCiAgICAgICogdGhlIHBoeXNpY2FsIGNhbWVyYSBpZHMuCiAgICAgICovCi0gICAgc3RhdGljIGJvb2wgaXNMb2dpY2FsQ2FtZXJhKGNvbnN0IENhbWVyYU1ldGFkYXRhJiBzdGF0aWNJbmZvLAotICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiBwaHlzaWNhbENhbWVyYUlkcyk7CisgICAgYm9vbCBpc0xvZ2ljYWxDYW1lcmEoY29uc3Qgc3RkOjpzdHJpbmcmIGlkLCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIHBoeXNpY2FsQ2FtZXJhSWRzKTsKIAorICAgIGJvb2wgaXNIaWRkZW5QaHlzaWNhbENhbWVyYShjb25zdCBzdGQ6OnN0cmluZyYgY2FtZXJhSWQpOwogcHJpdmF0ZToKICAgICAvLyBBbGwgcHJpdmF0ZSBtZW1iZXJzLCB1bmxlc3Mgb3RoZXJ3aXNlIG5vdGVkLCBleHBlY3QgbUludGVyZmFjZU11dGV4IHRvIGJlIGxvY2tlZCBiZWZvcmUgdXNlCiAgICAgbXV0YWJsZSBzdGQ6Om11dGV4IG1JbnRlcmZhY2VNdXRleDsKQEAgLTI0Niw2ICsyNDYsOSBAQAogICAgIHdwPFN0YXR1c0xpc3RlbmVyPiBtTGlzdGVuZXI7CiAgICAgU2VydmljZUludGVyYWN0aW9uUHJveHkqIG1TZXJ2aWNlUHJveHk7CiAKKyAgICAvLyBtUHJvdmlkZXJMaWZlY3ljbGVMb2NrIGlzIGxvY2tlZCBkdXJpbmcgb25SZWdpc3RyYXRpb24gYW5kIHJlbW92ZVByb3ZpZGVyCisgICAgbXV0YWJsZSBzdGQ6Om11dGV4IG1Qcm92aWRlckxpZmVjeWNsZUxvY2s7CisKICAgICBzdGF0aWMgSGFyZHdhcmVTZXJ2aWNlSW50ZXJhY3Rpb25Qcm94eSBzSGFyZHdhcmVTZXJ2aWNlSW50ZXJhY3Rpb25Qcm94eTsKIAogICAgIHN0cnVjdCBQcm92aWRlckluZm8gOgpAQCAtMjg5LDYgKzI5Miw4IEBACiAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyBtSWQ7ICAgIC8vIElEIHNlY3Rpb24gb2YgZnVsbCBuYW1lCiAgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZXJzaW9uIG1WZXJzaW9uOwogICAgICAgICAgICAgY29uc3QgbWV0YWRhdGFfdmVuZG9yX2lkX3QgbVByb3ZpZGVyVGFnaWQ7CisgICAgICAgICAgICBib29sIG1Jc0xvZ2ljYWxDYW1lcmE7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gbVBoeXNpY2FsSWRzOwogCiAgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OkNhbWVyYVJlc291cmNlQ29zdCBtUmVzb3VyY2VDb3N0OwogCkBAIC0zMDMsMTcgKzMwOCwyNSBAQAogICAgICAgICAgICAgICAgICh2b2lkKSBjaGFyYWN0ZXJpc3RpY3M7CiAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQaHlzaWNhbENhbWVyYUNoYXJhY3RlcmlzdGljcyhjb25zdCBzdGQ6OnN0cmluZyYgcGh5c2ljYWxDYW1lcmFJZCwKKyAgICAgICAgICAgICAgICAgICAgQ2FtZXJhTWV0YWRhdGEgKmNoYXJhY3RlcmlzdGljcykgY29uc3QgeworICAgICAgICAgICAgICAgICh2b2lkKSBwaHlzaWNhbENhbWVyYUlkOworICAgICAgICAgICAgICAgICh2b2lkKSBjaGFyYWN0ZXJpc3RpY3M7CisgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBEZXZpY2VJbmZvKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBjb25zdCBtZXRhZGF0YV92ZW5kb3JfaWRfdCB0YWdJZCwKICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmlkLCBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZXJzaW9uJiB2ZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIHB1YmxpY0NhbWVyYUlkcywKICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpDYW1lcmFSZXNvdXJjZUNvc3QmIHJlc291cmNlQ29zdCkgOgogICAgICAgICAgICAgICAgICAgICBtTmFtZShuYW1lKSwgbUlkKGlkKSwgbVZlcnNpb24odmVyc2lvbiksIG1Qcm92aWRlclRhZ2lkKHRhZ0lkKSwKLSAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlQ29zdChyZXNvdXJjZUNvc3QpLAorICAgICAgICAgICAgICAgICAgICBtSXNMb2dpY2FsQ2FtZXJhKGZhbHNlKSwgbVJlc291cmNlQ29zdChyZXNvdXJjZUNvc3QpLAogICAgICAgICAgICAgICAgICAgICBtU3RhdHVzKGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6Q2FtZXJhRGV2aWNlU3RhdHVzOjpQUkVTRU5UKSwKLSAgICAgICAgICAgICAgICAgICAgbUhhc0ZsYXNoVW5pdChmYWxzZSkge30KKyAgICAgICAgICAgICAgICAgICAgbUhhc0ZsYXNoVW5pdChmYWxzZSksIG1QdWJsaWNDYW1lcmFJZHMocHVibGljQ2FtZXJhSWRzKSB7fQogICAgICAgICAgICAgdmlydHVhbCB+RGV2aWNlSW5mbygpOwogICAgICAgICBwcm90ZWN0ZWQ6CiAgICAgICAgICAgICBib29sIG1IYXNGbGFzaFVuaXQ7CisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIG1QdWJsaWNDYW1lcmFJZHM7CiAKICAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIEludGVyZmFjZVQ+CiAgICAgICAgICAgICBzdGF0aWMgc3RhdHVzX3Qgc2V0VG9yY2hNb2RlKEludGVyZmFjZVQmIGludGVyZmFjZSwgYm9vbCBlbmFibGVkKTsKQEAgLTMyMiw2ICszMzUsMTIgQEAKICAgICAgICAgc3RkOjp1bm9yZGVyZWRfc2V0PHN0ZDo6c3RyaW5nPiBtVW5pcXVlQ2FtZXJhSWRzOwogICAgICAgICBpbnQgbVVuaXF1ZURldmljZUNvdW50OwogICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gbVVuaXF1ZUFQSTFDb21wYXRpYmxlQ2FtZXJhSWRzOworICAgICAgICAvLyBUaGUgaW5pdGlhbCBwdWJsaWMgY2FtZXJhIElEcyBwdWJsaXNoZWQgYnkgdGhlIGNhbWVyYSBwcm92aWRlci4KKyAgICAgICAgLy8gQ3VycmVudGx5IGxvZ2ljYWwgbXVsdGktY2FtZXJhIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGhvdC1wbHVnIGNhbWVyYS4KKyAgICAgICAgLy8gQW5kIHdlIHVzZSB0aGlzIGxpc3QgdG8ga2VlcCB0cmFjayBvZiBpbml0aWFsIHB1YmxpYyBjYW1lcmEgSURzCisgICAgICAgIC8vIGFkdmVydGlzZWQgYnkgdGhlIHByb3ZpZGVyLCBhbmQgdG8gZGlzdGluZ3Vpc2ggYWdhaW5zdCAiaGlkZGVuIgorICAgICAgICAvLyBwaHlzaWNhbCBjYW1lcmEgSURzLgorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gbVByb3ZpZGVyUHVibGljQ2FtZXJhSWRzOwogCiAgICAgICAgIC8vIEhBTHYxLXNwZWNpZmljIGNhbWVyYSBmaWVsZHMsIGluY2x1ZGluZyB0aGUgYWN0dWFsIGRldmljZSBpbnRlcmZhY2UKICAgICAgICAgc3RydWN0IERldmljZUluZm8xIDogcHVibGljIERldmljZUluZm8gewpAQCAtMzM2LDYgKzM1NSw3IEBACiAgICAgICAgICAgICBEZXZpY2VJbmZvMShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgY29uc3QgbWV0YWRhdGFfdmVuZG9yX2lkX3QgdGFnSWQsCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZpZCwgdWludDE2X3QgbWlub3JWZXJzaW9uLAogICAgICAgICAgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OkNhbWVyYVJlc291cmNlQ29zdCYgcmVzb3VyY2VDb3N0LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIHB1YmxpY0NhbWVyYUlkcywKICAgICAgICAgICAgICAgICAgICAgc3A8SW50ZXJmYWNlVD4gaW50ZXJmYWNlKTsKICAgICAgICAgICAgIHZpcnR1YWwgfkRldmljZUluZm8xKCk7CiAgICAgICAgIHByaXZhdGU6CkBAIC0zNTMsMTQgKzM3MywyMSBAQAogICAgICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wU3RhdGUoaW50IGZkKSBjb25zdCBvdmVycmlkZTsKICAgICAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKAogICAgICAgICAgICAgICAgICAgICBDYW1lcmFNZXRhZGF0YSAqY2hhcmFjdGVyaXN0aWNzKSBjb25zdCBvdmVycmlkZTsKKyAgICAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UGh5c2ljYWxDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoY29uc3Qgc3RkOjpzdHJpbmcmIHBoeXNpY2FsQ2FtZXJhSWQsCisgICAgICAgICAgICAgICAgICAgIENhbWVyYU1ldGFkYXRhICpjaGFyYWN0ZXJpc3RpY3MpIGNvbnN0IG92ZXJyaWRlOwogCiAgICAgICAgICAgICBEZXZpY2VJbmZvMyhjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgY29uc3QgbWV0YWRhdGFfdmVuZG9yX2lkX3QgdGFnSWQsCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZpZCwgdWludDE2X3QgbWlub3JWZXJzaW9uLAogICAgICAgICAgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OkNhbWVyYVJlc291cmNlQ29zdCYgcmVzb3VyY2VDb3N0LAotICAgICAgICAgICAgICAgICAgICBzcDxJbnRlcmZhY2VUPiBpbnRlcmZhY2UpOworICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIHB1YmxpY0NhbWVyYUlkcywgc3A8SW50ZXJmYWNlVD4gaW50ZXJmYWNlKTsKICAgICAgICAgICAgIHZpcnR1YWwgfkRldmljZUluZm8zKCk7CiAgICAgICAgIHByaXZhdGU6CiAgICAgICAgICAgICBDYW1lcmFNZXRhZGF0YSBtQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzOworICAgICAgICAgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nLCBDYW1lcmFNZXRhZGF0YT4gbVBoeXNpY2FsQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzOworICAgICAgICAgICAgdm9pZCBxdWVyeVBoeXNpY2FsQ2FtZXJhSWRzKCk7CisgICAgICAgICAgICBzdGF0dXNfdCBmaXh1cE1vbm9jaHJvbWVUYWdzKCk7CisgICAgICAgICAgICBzdGF0dXNfdCByZW1vdmVBdmFpbGFibGVLZXlzKENhbWVyYU1ldGFkYXRhJiBjLCBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4mIGtleXMsCisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGtleVRhZyk7CiAgICAgICAgIH07CiAKICAgICBwcml2YXRlOgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRGV2aWNlLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0RldmljZS5jcHAKaW5kZXggODI2NzJlNS4uMzI5NTJjYyAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRGV2aWNlLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEZXZpY2UuY3BwCkBAIC01Niw2ICs1Niw3IEBACiAjaW5jbHVkZSAiZGV2aWNlMy9DYW1lcmEzRHVtbXlTdHJlYW0uaCIKICNpbmNsdWRlICJkZXZpY2UzL0NhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW0uaCIKICNpbmNsdWRlICJDYW1lcmFTZXJ2aWNlLmgiCisjaW5jbHVkZSAidXRpbHMvQ2FtZXJhVGhyZWFkU3RhdGUuaCIKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmNhbWVyYTM7CiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTsKQEAgLTc4LDExICs3OSwxMCBAQAogICAgICAgICBtTmV4dFJlcHJvY2Vzc1NodXR0ZXJGcmFtZU51bWJlcigwKSwKICAgICAgICAgbUxpc3RlbmVyKE5VTEwpLAogICAgICAgICBtVmVuZG9yVGFnSWQoQ0FNRVJBX01FVEFEQVRBX0lOVkFMSURfVkVORE9SX0lEKSwKLSAgICAgICAgbUxhc3RUZW1wbGF0ZUlkKC0xKQorICAgICAgICBtTGFzdFRlbXBsYXRlSWQoLTEpLAorICAgICAgICBtTmVlZEZpeHVwTW9ub2Nocm9tZVRhZ3MoZmFsc2UpCiB7CiAgICAgQVRSQUNFX0NBTEwoKTsKLSAgICBjYW1lcmEzX2NhbGxiYWNrX29wczo6bm90aWZ5ID0gJnNOb3RpZnk7Ci0gICAgY2FtZXJhM19jYWxsYmFja19vcHM6OnByb2Nlc3NfY2FwdHVyZV9yZXN1bHQgPSAmc1Byb2Nlc3NDYXB0dXJlUmVzdWx0OwogICAgIEFMT0dWKCIlczogQ3JlYXRlZCBkZXZpY2UgZm9yIGNhbWVyYSAlcyIsIF9fRlVOQ1RJT05fXywgbUlkLnN0cmluZygpKTsKIH0KIApAQCAtOTAsNyArOTAsNyBAQAogewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgQUxPR1YoIiVzOiBUZWFyaW5nIGRvd24gZm9yIGNhbWVyYSBpZCAlcyIsIF9fRlVOQ1RJT05fXywgbUlkLnN0cmluZygpKTsKLSAgICBkaXNjb25uZWN0KCk7CisgICAgZGlzY29ubmVjdEltcGwoKTsKIH0KIAogY29uc3QgU3RyaW5nOCYgQ2FtZXJhM0RldmljZTo6Z2V0SWQoKSBjb25zdCB7CkBAIC0xMjcsNyArMTI3LDcgQEAKICAgICB9CiAKICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gcGh5c2ljYWxDYW1lcmFJZHM7Ci0gICAgYm9vbCBpc0xvZ2ljYWwgPSBDYW1lcmFQcm92aWRlck1hbmFnZXI6OmlzTG9naWNhbENhbWVyYShtRGV2aWNlSW5mbywgJnBoeXNpY2FsQ2FtZXJhSWRzKTsKKyAgICBib29sIGlzTG9naWNhbCA9IG1hbmFnZXItPmlzTG9naWNhbENhbWVyYShtSWQuc3RyaW5nKCksICZwaHlzaWNhbENhbWVyYUlkcyk7CiAgICAgaWYgKGlzTG9naWNhbCkgewogICAgICAgICBmb3IgKGF1dG8mIHBoeXNpY2FsSWQgOiBwaHlzaWNhbENhbWVyYUlkcykgewogICAgICAgICAgICAgcmVzID0gbWFuYWdlci0+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+ICZzZXNzaW9uLAotICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFJlcXVlc3RNZXRhZGF0YVF1ZXVlPiBxdWV1ZSkgOgorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFJlcXVlc3RNZXRhZGF0YVF1ZXVlPiBxdWV1ZSwKKyAgICAgICAgICAgIGJvb2wgdXNlSGFsQnVmTWFuYWdlcikgOgogICAgICAgICBtSGlkbFNlc3Npb24oc2Vzc2lvbiksCi0gICAgICAgIG1SZXF1ZXN0TWV0YWRhdGFRdWV1ZShxdWV1ZSkgeworICAgICAgICBtUmVxdWVzdE1ldGFkYXRhUXVldWUocXVldWUpLAorICAgICAgICBtVXNlSGFsQnVmTWFuYWdlcih1c2VIYWxCdWZNYW5hZ2VyKSB7CiAgICAgLy8gQ2hlY2sgd2l0aCBoYXJkd2FyZSBzZXJ2aWNlIG1hbmFnZXIgaWYgd2UgY2FuIGRvd25jYXN0IHRoZXNlIGludGVyZmFjZXMKICAgICAvLyBTb21ld2hhdCBleHBlbnNpdmUsIHNvIGNhY2hlIHRoZSByZXN1bHRzIGF0IHN0YXJ0dXAKKyAgICBhdXRvIGNhc3RSZXN1bHRfM181ID0gZGV2aWNlOjpWM181OjpJQ2FtZXJhRGV2aWNlU2Vzc2lvbjo6Y2FzdEZyb20obUhpZGxTZXNzaW9uKTsKKyAgICBpZiAoY2FzdFJlc3VsdF8zXzUuaXNPaygpKSB7CisgICAgICAgIG1IaWRsU2Vzc2lvbl8zXzUgPSBjYXN0UmVzdWx0XzNfNTsKKyAgICB9CiAgICAgYXV0byBjYXN0UmVzdWx0XzNfNCA9IGRldmljZTo6VjNfNDo6SUNhbWVyYURldmljZVNlc3Npb246OmNhc3RGcm9tKG1IaWRsU2Vzc2lvbik7CiAgICAgaWYgKGNhc3RSZXN1bHRfM180LmlzT2soKSkgewogICAgICAgICBtSGlkbFNlc3Npb25fM180ID0gY2FzdFJlc3VsdF8zXzQ7CkBAIC0zNDYyLDExICszODkxLDEyIEBACiAgICAgfQogfQogCi1DYW1lcmEzRGV2aWNlOjpIYWxJbnRlcmZhY2U6OkhhbEludGVyZmFjZSgpIHt9CitDYW1lcmEzRGV2aWNlOjpIYWxJbnRlcmZhY2U6OkhhbEludGVyZmFjZSgpIDogbVVzZUhhbEJ1Zk1hbmFnZXIoZmFsc2UpIHt9CiAKIENhbWVyYTNEZXZpY2U6OkhhbEludGVyZmFjZTo6SGFsSW50ZXJmYWNlKGNvbnN0IEhhbEludGVyZmFjZSYgb3RoZXIpIDoKICAgICAgICAgbUhpZGxTZXNzaW9uKG90aGVyLm1IaWRsU2Vzc2lvbiksCi0gICAgICAgIG1SZXF1ZXN0TWV0YWRhdGFRdWV1ZShvdGhlci5tUmVxdWVzdE1ldGFkYXRhUXVldWUpIHt9CisgICAgICAgIG1SZXF1ZXN0TWV0YWRhdGFRdWV1ZShvdGhlci5tUmVxdWVzdE1ldGFkYXRhUXVldWUpLAorICAgICAgICBtVXNlSGFsQnVmTWFuYWdlcihvdGhlci5tVXNlSGFsQnVmTWFuYWdlcikge30KIAogYm9vbCBDYW1lcmEzRGV2aWNlOjpIYWxJbnRlcmZhY2U6OnZhbGlkKCkgewogICAgIHJldHVybiAobUhpZGxTZXNzaW9uICE9IG51bGxwdHIpOwpAQCAtMzYyOCwyNiArNDA1OCw0OSBAQAogCiAgICAgLy8gSW52b2tlIGNvbmZpZ3VyZVN0cmVhbXMKICAgICBkZXZpY2U6OlYzXzM6OkhhbFN0cmVhbUNvbmZpZ3VyYXRpb24gZmluYWxDb25maWd1cmF0aW9uOworICAgIGRldmljZTo6VjNfNDo6SGFsU3RyZWFtQ29uZmlndXJhdGlvbiBmaW5hbENvbmZpZ3VyYXRpb24zXzQ7CiAgICAgY29tbW9uOjpWMV8wOjpTdGF0dXMgc3RhdHVzOwogCi0gICAgLy8gU2VlIGlmIHdlIGhhdmUgdjMuNCBvciB2My4zIEhBTAotICAgIGlmIChtSGlkbFNlc3Npb25fM180ICE9IG51bGxwdHIpIHsKLSAgICAgICAgLy8gV2UgZG87IHVzZSB2My40IGZvciB0aGUgY2FsbAotICAgICAgICBBTE9HVigiJXM6IHYzLjQgZGV2aWNlIGZvdW5kIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgZGV2aWNlOjpWM180OjpIYWxTdHJlYW1Db25maWd1cmF0aW9uIGZpbmFsQ29uZmlndXJhdGlvbjNfNDsKLSAgICAgICAgYXV0byBlcnIgPSBtSGlkbFNlc3Npb25fM180LT5jb25maWd1cmVTdHJlYW1zXzNfNChyZXF1ZXN0ZWRDb25maWd1cmF0aW9uM180LAotICAgICAgICAgICAgWyZzdGF0dXMsICZmaW5hbENvbmZpZ3VyYXRpb24zXzRdCisgICAgYXV0byBjb25maWdTdHJlYW0zNENiID0gWyZzdGF0dXMsICZmaW5hbENvbmZpZ3VyYXRpb24zXzRdCiAgICAgICAgICAgICAoY29tbW9uOjpWMV8wOjpTdGF0dXMgcywgY29uc3QgZGV2aWNlOjpWM180OjpIYWxTdHJlYW1Db25maWd1cmF0aW9uJiBoYWxDb25maWd1cmF0aW9uKSB7CiAgICAgICAgICAgICAgICAgZmluYWxDb25maWd1cmF0aW9uM180ID0gaGFsQ29uZmlndXJhdGlvbjsKICAgICAgICAgICAgICAgICBzdGF0dXMgPSBzOwotICAgICAgICAgICAgfSk7Ci0gICAgICAgIGlmICghZXJyLmlzT2soKSkgewotICAgICAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvcjogJXMiLCBfX0ZVTkNUSU9OX18sIGVyci5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOwotICAgICAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgICAgICAgICAgfTsKKworICAgIGF1dG8gcG9zdHByb2NDb25maWdTdHJlYW0zNCA9IFsmZmluYWxDb25maWd1cmF0aW9uLCAmZmluYWxDb25maWd1cmF0aW9uM180XQorICAgICAgICAgICAgKGhhcmR3YXJlOjpSZXR1cm48dm9pZD4mIGVycikgLT4gc3RhdHVzX3QgeworICAgICAgICAgICAgICAgIGlmICghZXJyLmlzT2soKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yOiAlcyIsIF9fRlVOQ1RJT05fXywgZXJyLmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZmluYWxDb25maWd1cmF0aW9uLnN0cmVhbXMucmVzaXplKGZpbmFsQ29uZmlndXJhdGlvbjNfNC5zdHJlYW1zLnNpemUoKSk7CisgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBmaW5hbENvbmZpZ3VyYXRpb24zXzQuc3RyZWFtcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBmaW5hbENvbmZpZ3VyYXRpb24uc3RyZWFtc1tpXSA9IGZpbmFsQ29uZmlndXJhdGlvbjNfNC5zdHJlYW1zW2ldLnYzXzM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgICAgIH07CisKKyAgICAvLyBTZWUgaWYgd2UgaGF2ZSB2My40IG9yIHYzLjMgSEFMCisgICAgaWYgKG1IaWRsU2Vzc2lvbl8zXzUgIT0gbnVsbHB0cikgeworICAgICAgICBBTE9HVigiJXM6IHYzLjUgZGV2aWNlIGZvdW5kIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgZGV2aWNlOjpWM181OjpTdHJlYW1Db25maWd1cmF0aW9uIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzU7CisgICAgICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzUudjNfNCA9IHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzQ7CisgICAgICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzUuc3RyZWFtQ29uZmlnQ291bnRlciA9IG1OZXh0U3RyZWFtQ29uZmlnQ291bnRlcisrOworICAgICAgICBhdXRvIGVyciA9IG1IaWRsU2Vzc2lvbl8zXzUtPmNvbmZpZ3VyZVN0cmVhbXNfM181KAorICAgICAgICAgICAgICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzUsIGNvbmZpZ1N0cmVhbTM0Q2IpOworICAgICAgICByZXMgPSBwb3N0cHJvY0NvbmZpZ1N0cmVhbTM0KGVycik7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgIH0KLSAgICAgICAgZmluYWxDb25maWd1cmF0aW9uLnN0cmVhbXMucmVzaXplKGZpbmFsQ29uZmlndXJhdGlvbjNfNC5zdHJlYW1zLnNpemUoKSk7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZmluYWxDb25maWd1cmF0aW9uM180LnN0cmVhbXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIGZpbmFsQ29uZmlndXJhdGlvbi5zdHJlYW1zW2ldID0gZmluYWxDb25maWd1cmF0aW9uM180LnN0cmVhbXNbaV0udjNfMzsKKyAgICB9IGVsc2UgaWYgKG1IaWRsU2Vzc2lvbl8zXzQgIT0gbnVsbHB0cikgeworICAgICAgICAvLyBXZSBkbzsgdXNlIHYzLjQgZm9yIHRoZSBjYWxsCisgICAgICAgIEFMT0dWKCIlczogdjMuNCBkZXZpY2UgZm91bmQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICBkZXZpY2U6OlYzXzQ6OkhhbFN0cmVhbUNvbmZpZ3VyYXRpb24gZmluYWxDb25maWd1cmF0aW9uM180OworICAgICAgICBhdXRvIGVyciA9IG1IaWRsU2Vzc2lvbl8zXzQtPmNvbmZpZ3VyZVN0cmVhbXNfM180KAorICAgICAgICAgICAgICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzQsIGNvbmZpZ1N0cmVhbTM0Q2IpOworICAgICAgICByZXMgPSBwb3N0cHJvY0NvbmZpZ1N0cmVhbTM0KGVycik7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKG1IaWRsU2Vzc2lvbl8zXzMgIT0gbnVsbHB0cikgewogICAgICAgICAvLyBXZSBkbzsgdXNlIHYzLjMgZm9yIHRoZSBjYWxsCkBAIC0zNzU5LDE0ICs0MjEyLDE0IEBACiAgICAgcmV0dXJuIHJlczsKIH0KIAotdm9pZCBDYW1lcmEzRGV2aWNlOjpIYWxJbnRlcmZhY2U6OndyYXBBc0hpZGxSZXF1ZXN0KGNhbWVyYTNfY2FwdHVyZV9yZXF1ZXN0X3QqIHJlcXVlc3QsCitzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpIYWxJbnRlcmZhY2U6OndyYXBBc0hpZGxSZXF1ZXN0KGNhbWVyYTNfY2FwdHVyZV9yZXF1ZXN0X3QqIHJlcXVlc3QsCiAgICAgICAgIC8qb3V0Ki9kZXZpY2U6OlYzXzI6OkNhcHR1cmVSZXF1ZXN0KiBjYXB0dXJlUmVxdWVzdCwKICAgICAgICAgLypvdXQqL3N0ZDo6dmVjdG9yPG5hdGl2ZV9oYW5kbGVfdCo+KiBoYW5kbGVzQ3JlYXRlZCkgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgaWYgKGNhcHR1cmVSZXF1ZXN0ID09IG51bGxwdHIgfHwgaGFuZGxlc0NyZWF0ZWQgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRSgiJXM6IGNhcHR1cmVSZXF1ZXN0ICglcCkgYW5kIGhhbmRsZXNDcmVhdGVkICglcCkgbXVzdCBub3QgYmUgbnVsbCIsCiAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBjYXB0dXJlUmVxdWVzdCwgaGFuZGxlc0NyZWF0ZWQpOwotICAgICAgICByZXR1cm47CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCiAgICAgY2FwdHVyZVJlcXVlc3QtPmZyYW1lTnVtYmVyID0gcmVxdWVzdC0+ZnJhbWVfbnVtYmVyOwpAQCAtMzgwNywyNiArNDI2MCwzNyBAQAogICAgICAgICAgICAgY29uc3QgY2FtZXJhM19zdHJlYW1fYnVmZmVyX3QgKnNyYyA9IHJlcXVlc3QtPm91dHB1dF9idWZmZXJzICsgaTsKICAgICAgICAgICAgIFN0cmVhbUJ1ZmZlciAmZHN0ID0gY2FwdHVyZVJlcXVlc3QtPm91dHB1dEJ1ZmZlcnNbaV07CiAgICAgICAgICAgICBpbnQzMl90IHN0cmVhbUlkID0gQ2FtZXJhM1N0cmVhbTo6Y2FzdChzcmMtPnN0cmVhbSktPmdldElkKCk7Ci0gICAgICAgICAgICBidWZmZXJfaGFuZGxlX3QgYnVmID0gKihzcmMtPmJ1ZmZlcik7Ci0gICAgICAgICAgICBhdXRvIHBhaXIgPSBnZXRCdWZmZXJJZChidWYsIHN0cmVhbUlkKTsKLSAgICAgICAgICAgIGJvb2wgaXNOZXdCdWZmZXIgPSBwYWlyLmZpcnN0OwotICAgICAgICAgICAgZHN0LnN0cmVhbUlkID0gc3RyZWFtSWQ7Ci0gICAgICAgICAgICBkc3QuYnVmZmVySWQgPSBwYWlyLnNlY29uZDsKLSAgICAgICAgICAgIGRzdC5idWZmZXIgPSBpc05ld0J1ZmZlciA/IGJ1ZiA6IG51bGxwdHI7Ci0gICAgICAgICAgICBkc3Quc3RhdHVzID0gQnVmZmVyU3RhdHVzOjpPSzsKLSAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqYWNxdWlyZUZlbmNlID0gbnVsbHB0cjsKLSAgICAgICAgICAgIGlmIChzcmMtPmFjcXVpcmVfZmVuY2UgIT0gLTEpIHsKLSAgICAgICAgICAgICAgICBhY3F1aXJlRmVuY2UgPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZSgxLDApOwotICAgICAgICAgICAgICAgIGFjcXVpcmVGZW5jZS0+ZGF0YVswXSA9IHNyYy0+YWNxdWlyZV9mZW5jZTsKLSAgICAgICAgICAgICAgICBoYW5kbGVzQ3JlYXRlZC0+cHVzaF9iYWNrKGFjcXVpcmVGZW5jZSk7CisgICAgICAgICAgICBpZiAoc3JjLT5idWZmZXIgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIGJ1ZmZlcl9oYW5kbGVfdCBidWYgPSAqKHNyYy0+YnVmZmVyKTsKKyAgICAgICAgICAgICAgICBhdXRvIHBhaXIgPSBnZXRCdWZmZXJJZChidWYsIHN0cmVhbUlkKTsKKyAgICAgICAgICAgICAgICBib29sIGlzTmV3QnVmZmVyID0gcGFpci5maXJzdDsKKyAgICAgICAgICAgICAgICBkc3QuYnVmZmVySWQgPSBwYWlyLnNlY29uZDsKKyAgICAgICAgICAgICAgICBkc3QuYnVmZmVyID0gaXNOZXdCdWZmZXIgPyBidWYgOiBudWxscHRyOworICAgICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqYWNxdWlyZUZlbmNlID0gbnVsbHB0cjsKKyAgICAgICAgICAgICAgICBpZiAoc3JjLT5hY3F1aXJlX2ZlbmNlICE9IC0xKSB7CisgICAgICAgICAgICAgICAgICAgIGFjcXVpcmVGZW5jZSA9IG5hdGl2ZV9oYW5kbGVfY3JlYXRlKDEsMCk7CisgICAgICAgICAgICAgICAgICAgIGFjcXVpcmVGZW5jZS0+ZGF0YVswXSA9IHNyYy0+YWNxdWlyZV9mZW5jZTsKKyAgICAgICAgICAgICAgICAgICAgaGFuZGxlc0NyZWF0ZWQtPnB1c2hfYmFjayhhY3F1aXJlRmVuY2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkc3QuYWNxdWlyZUZlbmNlID0gYWNxdWlyZUZlbmNlOworICAgICAgICAgICAgfSBlbHNlIGlmIChtVXNlSGFsQnVmTWFuYWdlcikgeworICAgICAgICAgICAgICAgIC8vIEhBTCBidWZmZXIgbWFuYWdlbWVudCBwYXRoCisgICAgICAgICAgICAgICAgZHN0LmJ1ZmZlcklkID0gQlVGRkVSX0lEX05PX0JVRkZFUjsKKyAgICAgICAgICAgICAgICBkc3QuYnVmZmVyID0gbnVsbHB0cjsKKyAgICAgICAgICAgICAgICBkc3QuYWNxdWlyZUZlbmNlID0gbnVsbHB0cjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBjYW5ub3Qgc2VuZCBhIG51bGwgYnVmZmVyIGluIGNhcHR1cmUgcmVxdWVzdCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBkc3QuYWNxdWlyZUZlbmNlID0gYWNxdWlyZUZlbmNlOworICAgICAgICAgICAgZHN0LnN0cmVhbUlkID0gc3RyZWFtSWQ7CisgICAgICAgICAgICBkc3Quc3RhdHVzID0gQnVmZmVyU3RhdHVzOjpPSzsKICAgICAgICAgICAgIGRzdC5yZWxlYXNlRmVuY2UgPSBudWxscHRyOwogCiAgICAgICAgICAgICBwdXNoSW5mbGlnaHRCdWZmZXJMb2NrZWQoY2FwdHVyZVJlcXVlc3QtPmZyYW1lTnVtYmVyLCBzdHJlYW1JZCwKICAgICAgICAgICAgICAgICAgICAgc3JjLT5idWZmZXIsIHNyYy0+YWNxdWlyZV9mZW5jZSk7CiAgICAgICAgIH0KICAgICB9CisgICAgcmV0dXJuIE9LOwogfQogCiBzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpIYWxJbnRlcmZhY2U6OnByb2Nlc3NCYXRjaENhcHR1cmVSZXF1ZXN0cygKQEAgLTM4NTAsMTIgKzQzMTQsMTcgQEAKICAgICB9CiAgICAgc3RkOjp2ZWN0b3I8bmF0aXZlX2hhbmRsZV90Kj4gaGFuZGxlc0NyZWF0ZWQ7CiAKKyAgICBzdGF0dXNfdCByZXMgPSBPSzsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGJhdGNoU2l6ZTsgaSsrKSB7CiAgICAgICAgIGlmIChoaWRsU2Vzc2lvbl8zXzQgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgd3JhcEFzSGlkbFJlcXVlc3QocmVxdWVzdHNbaV0sIC8qb3V0Ki8mY2FwdHVyZVJlcXVlc3RzXzNfNFtpXS52M18yLAorICAgICAgICAgICAgcmVzID0gd3JhcEFzSGlkbFJlcXVlc3QocmVxdWVzdHNbaV0sIC8qb3V0Ki8mY2FwdHVyZVJlcXVlc3RzXzNfNFtpXS52M18yLAogICAgICAgICAgICAgICAgICAgICAvKm91dCovJmhhbmRsZXNDcmVhdGVkKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHdyYXBBc0hpZGxSZXF1ZXN0KHJlcXVlc3RzW2ldLCAvKm91dCovJmNhcHR1cmVSZXF1ZXN0c1tpXSwgLypvdXQqLyZoYW5kbGVzQ3JlYXRlZCk7CisgICAgICAgICAgICByZXMgPSB3cmFwQXNIaWRsUmVxdWVzdChyZXF1ZXN0c1tpXSwKKyAgICAgICAgICAgICAgICAgICAgLypvdXQqLyZjYXB0dXJlUmVxdWVzdHNbaV0sIC8qb3V0Ki8maGFuZGxlc0NyZWF0ZWQpOworICAgICAgICB9CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTM5MzcsMTggKzQ0MDYsMTcgQEAKICAgICB9CiAKICAgICBoYXJkd2FyZTo6ZGV0YWlsczo6cmV0dXJuX3N0YXR1cyBlcnI7CisgICAgYXV0byByZXN1bHRDYWxsYmFjayA9CisgICAgICAgIFsmc3RhdHVzLCAmbnVtUmVxdWVzdFByb2Nlc3NlZF0gKGF1dG8gcywgdWludDMyX3QgbikgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHM7CisgICAgICAgICAgICAgICAgKm51bVJlcXVlc3RQcm9jZXNzZWQgPSBuOworICAgICAgICB9OwogICAgIGlmIChoaWRsU2Vzc2lvbl8zXzQgIT0gbnVsbHB0cikgewogICAgICAgICBlcnIgPSBoaWRsU2Vzc2lvbl8zXzQtPnByb2Nlc3NDYXB0dXJlUmVxdWVzdF8zXzQoY2FwdHVyZVJlcXVlc3RzXzNfNCwgY2FjaGVzVG9SZW1vdmUsCi0gICAgICAgICAgICBbJnN0YXR1cywgJm51bVJlcXVlc3RQcm9jZXNzZWRdIChhdXRvIHMsIHVpbnQzMl90IG4pIHsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBzOwotICAgICAgICAgICAgICAgICpudW1SZXF1ZXN0UHJvY2Vzc2VkID0gbjsKLSAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0Q2FsbGJhY2spOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGVyciA9IG1IaWRsU2Vzc2lvbi0+cHJvY2Vzc0NhcHR1cmVSZXF1ZXN0KGNhcHR1cmVSZXF1ZXN0cywgY2FjaGVzVG9SZW1vdmUsCi0gICAgICAgICAgICBbJnN0YXR1cywgJm51bVJlcXVlc3RQcm9jZXNzZWRdIChhdXRvIHMsIHVpbnQzMl90IG4pIHsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBzOwotICAgICAgICAgICAgICAgICpudW1SZXF1ZXN0UHJvY2Vzc2VkID0gbjsKLSAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRDYWxsYmFjayk7CiAgICAgfQogICAgIGlmICghZXJyLmlzT2soKSkgewogICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yOiAlcyIsIF9fRlVOQ1RJT05fXywgZXJyLmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CkBAIC00MDE5LDYgKzQ0ODcsMjAgQEAKICAgICByZXR1cm4gcmVzOwogfQogCit2b2lkIENhbWVyYTNEZXZpY2U6OkhhbEludGVyZmFjZTo6c2lnbmFsUGlwZWxpbmVEcmFpbihjb25zdCBzdGQ6OnZlY3RvcjxpbnQ+JiBzdHJlYW1JZHMpIHsKKyAgICBBVFJBQ0VfTkFNRSgiQ2FtZXJhSGFsOjpzaWduYWxQaXBlbGluZURyYWluIik7CisgICAgaWYgKCF2YWxpZCgpIHx8IG1IaWRsU2Vzc2lvbl8zXzUgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXMgY2FsbGVkIG9uIGludmFsaWQgY2FtZXJhISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBhdXRvIGVyciA9IG1IaWRsU2Vzc2lvbl8zXzUtPnNpZ25hbFN0cmVhbUZsdXNoKHN0cmVhbUlkcywgbU5leHRTdHJlYW1Db25maWdDb3VudGVyKTsKKyAgICBpZiAoIWVyci5pc09rKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvcjogJXMiLCBfX0ZVTkNUSU9OX18sIGVyci5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgICAgICByZXR1cm47CisgICAgfQorfQorCiB2b2lkIENhbWVyYTNEZXZpY2U6OkhhbEludGVyZmFjZTo6Z2V0SW5mbGlnaHRCdWZmZXJLZXlzKAogICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8aW50MzJfdCwgaW50MzJfdD4+KiBvdXQpIHsKICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtSW5mbGlnaHRMb2NrKTsKQEAgLTQwNTksNiArNDU0MSwzMyBAQAogICAgIHJldHVybiBPSzsKIH0KIAorc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6SGFsSW50ZXJmYWNlOjpwdXNoSW5mbGlnaHRSZXF1ZXN0QnVmZmVyKAorICAgICAgICB1aW50NjRfdCBidWZmZXJJZCwgYnVmZmVyX2hhbmRsZV90KiBidWYpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtUmVxdWVzdGVkQnVmZmVyc0xvY2spOworICAgIGF1dG8gcGFpciA9IG1SZXF1ZXN0ZWRCdWZmZXJzLmluc2VydCh7YnVmZmVySWQsIGJ1Zn0pOworICAgIGlmICghcGFpci5zZWNvbmQpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBidWZJZCAlIiBQUkl1NjQgIiBpcyBhbHJlYWR5IGluZmxpZ2h0ISIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBidWZmZXJJZCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworLy8gRmluZCBhbmQgcG9wIGEgYnVmZmVyX2hhbmRsZV90IGJhc2VkIG9uIGJ1ZmZlcklkCitzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpIYWxJbnRlcmZhY2U6OnBvcEluZmxpZ2h0UmVxdWVzdEJ1ZmZlcigKKyAgICAgICAgdWludDY0X3QgYnVmZmVySWQsIC8qb3V0Ki8gYnVmZmVyX2hhbmRsZV90ICoqYnVmZmVyKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVJlcXVlc3RlZEJ1ZmZlcnNMb2NrKTsKKyAgICBhdXRvIGl0ID0gbVJlcXVlc3RlZEJ1ZmZlcnMuZmluZChidWZmZXJJZCk7CisgICAgaWYgKGl0ID09IG1SZXF1ZXN0ZWRCdWZmZXJzLmVuZCgpKSB7CisgICAgICAgIEFMT0dFKCIlczogYnVmSWQgJSIgUFJJdTY0ICIgaXMgbm90IGluZmxpZ2h0ISIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBidWZmZXJJZCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgICpidWZmZXIgPSBpdC0+c2Vjb25kOworICAgIG1SZXF1ZXN0ZWRCdWZmZXJzLmVyYXNlKGl0KTsKKyAgICByZXR1cm4gT0s7Cit9CisKIHN0ZDo6cGFpcjxib29sLCB1aW50NjRfdD4gQ2FtZXJhM0RldmljZTo6SGFsSW50ZXJmYWNlOjpnZXRCdWZmZXJJZCgKICAgICAgICAgY29uc3QgYnVmZmVyX2hhbmRsZV90JiBidWYsIGludCBzdHJlYW1JZCkgewogICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1CdWZmZXJJZE1hcExvY2spOwpAQCAtNDEwNyw3ICs0NjE2LDggQEAKIAogQ2FtZXJhM0RldmljZTo6UmVxdWVzdFRocmVhZDo6UmVxdWVzdFRocmVhZCh3cDxDYW1lcmEzRGV2aWNlPiBwYXJlbnQsCiAgICAgICAgIHNwPFN0YXR1c1RyYWNrZXI+IHN0YXR1c1RyYWNrZXIsCi0gICAgICAgIHNwPEhhbEludGVyZmFjZT4gaW50ZXJmYWNlLCBjb25zdCBWZWN0b3I8aW50MzJfdD4mIHNlc3Npb25QYXJhbUtleXMpIDoKKyAgICAgICAgc3A8SGFsSW50ZXJmYWNlPiBpbnRlcmZhY2UsIGNvbnN0IFZlY3RvcjxpbnQzMl90PiYgc2Vzc2lvblBhcmFtS2V5cywKKyAgICAgICAgYm9vbCB1c2VIYWxCdWZNYW5hZ2VyKSA6CiAgICAgICAgIFRocmVhZCgvKmNhbkNhbGxKYXZhKi9mYWxzZSksCiAgICAgICAgIG1QYXJlbnQocGFyZW50KSwKICAgICAgICAgbVN0YXR1c1RyYWNrZXIoc3RhdHVzVHJhY2tlciksCkBAIC00MTE3LDYgKzQ2MjcsNyBAQAogICAgICAgICBtUmVjb25maWd1cmVkKGZhbHNlKSwKICAgICAgICAgbURvUGF1c2UoZmFsc2UpLAogICAgICAgICBtUGF1c2VkKHRydWUpLAorICAgICAgICBtTm90aWZ5UGlwZWxpbmVEcmFpbihmYWxzZSksCiAgICAgICAgIG1GcmFtZU51bWJlcigwKSwKICAgICAgICAgbUxhdGVzdFJlcXVlc3RJZChOQU1FX05PVF9GT1VORCksCiAgICAgICAgIG1DdXJyZW50QWZUcmlnZ2VySWQoMCksCkBAIC00MTI3LDcgKzQ2MzgsOCBAQAogICAgICAgICBtQ29uc3RyYWluZWRNb2RlKGZhbHNlKSwKICAgICAgICAgbVJlcXVlc3RMYXRlbmN5KGtSZXF1ZXN0TGF0ZW5jeUJpblNpemUpLAogICAgICAgICBtU2Vzc2lvblBhcmFtS2V5cyhzZXNzaW9uUGFyYW1LZXlzKSwKLSAgICAgICAgbUxhdGVzdFNlc3Npb25QYXJhbXMoc2Vzc2lvblBhcmFtS2V5cy5zaXplKCkpIHsKKyAgICAgICAgbUxhdGVzdFNlc3Npb25QYXJhbXMoc2Vzc2lvblBhcmFtS2V5cy5zaXplKCkpLAorICAgICAgICBtVXNlSGFsQnVmTWFuYWdlcih1c2VIYWxCdWZNYW5hZ2VyKSB7CiAgICAgbVN0YXR1c0lkID0gc3RhdHVzVHJhY2tlci0+YWRkQ29tcG9uZW50KCk7CiB9CiAKQEAgLTQ3NDIsNiArNTI1NCwxMyBAQAogICAgIG5zZWNzX3QgdFJlcXVlc3RFbmQgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7CiAgICAgbVJlcXVlc3RMYXRlbmN5LmFkZCh0UmVxdWVzdFN0YXJ0LCB0UmVxdWVzdEVuZCk7CiAKKyAgICBpZiAoc3VibWl0UmVxdWVzdFN1Y2Nlc3MpIHsKKyAgICAgICAgc3A8Q2FtZXJhM0RldmljZT4gcGFyZW50ID0gbVBhcmVudC5wcm9tb3RlKCk7CisgICAgICAgIGlmIChwYXJlbnQgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgcGFyZW50LT5tUmVxdWVzdEJ1ZmZlclNNLm9uUmVxdWVzdFN1Ym1pdHRlZCgpOworICAgICAgICB9CisgICAgfQorCiAgICAgaWYgKHVzZUZsdXNoTG9jaykgewogICAgICAgICBtRmx1c2hMb2NrLnVubG9jaygpOwogICAgIH0KQEAgLTQ3NTgsNiArNTI3Nyw3IEBACiBzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0VGhyZWFkOjpwcmVwYXJlSGFsUmVxdWVzdHMoKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKIAorICAgIGJvb2wgYmF0Y2hlZFJlcXVlc3QgPSBtTmV4dFJlcXVlc3RzWzBdLmNhcHR1cmVSZXF1ZXN0LT5tQmF0Y2hTaXplID4gMTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1OZXh0UmVxdWVzdHMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgYXV0byYgbmV4dFJlcXVlc3QgPSBtTmV4dFJlcXVlc3RzLmVkaXRJdGVtQXQoaSk7CiAgICAgICAgIHNwPENhcHR1cmVSZXF1ZXN0PiBjYXB0dXJlUmVxdWVzdCA9IG5leHRSZXF1ZXN0LmNhcHR1cmVSZXF1ZXN0OwpAQCAtNDc4MSw3ICs1MzAxLDEwIEBACiAgICAgICAgIG1QcmV2VHJpZ2dlcnMgPSB0cmlnZ2VyQ291bnQ7CiAKICAgICAgICAgLy8gSWYgdGhlIHJlcXVlc3QgaXMgdGhlIHNhbWUgYXMgbGFzdCwgb3Igd2UgaGFkIHRyaWdnZXJzIGxhc3QgdGltZQotICAgICAgICBib29sIG5ld1JlcXVlc3QgPSBtUHJldlJlcXVlc3QgIT0gY2FwdHVyZVJlcXVlc3QgfHwgdHJpZ2dlcnNNaXhlZEluOworICAgICAgICBib29sIG5ld1JlcXVlc3QgPSAobVByZXZSZXF1ZXN0ICE9IGNhcHR1cmVSZXF1ZXN0IHx8IHRyaWdnZXJzTWl4ZWRJbikgJiYKKyAgICAgICAgICAgICAgICAvLyBSZXF1ZXN0IHNldHRpbmdzIGFyZSBhbGwgdGhlIHNhbWUgd2l0aGluIG9uZSBiYXRjaCwgc28gb25seSB0cmVhdCB0aGUgZmlyc3QKKyAgICAgICAgICAgICAgICAvLyByZXF1ZXN0IGluIGEgYmF0Y2ggYXMgbmV3CisgICAgICAgICAgICAgICAgIShiYXRjaGVkUmVxdWVzdCAmJiBpID4gMCk7CiAgICAgICAgIGlmIChuZXdSZXF1ZXN0KSB7CiAgICAgICAgICAgICAvKioKICAgICAgICAgICAgICAqIEhBTCB3b3JrYXJvdW5kOgpAQCAtNDg4Miw4ICs1NDA1LDExIEBACiAgICAgICAgIH0KICAgICAgICAgbnNlY3NfdCB3YWl0RHVyYXRpb24gPSBrQmFzZUdldEJ1ZmZlcldhaXQgKyBwYXJlbnQtPmdldEV4cGVjdGVkSW5GbGlnaHREdXJhdGlvbigpOwogCisgICAgICAgIFN1cmZhY2VNYXAgdW5pcXVlU3VyZmFjZUlkTWFwOwogICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IGNhcHR1cmVSZXF1ZXN0LT5tT3V0cHV0U3RyZWFtcy5zaXplKCk7IGorKykgewotICAgICAgICAgICAgc3A8Q2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZT4gb3V0cHV0U3RyZWFtID0gY2FwdHVyZVJlcXVlc3QtPm1PdXRwdXRTdHJlYW1zLmVkaXRJdGVtQXQoaik7CisgICAgICAgICAgICBzcDxDYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlPiBvdXRwdXRTdHJlYW0gPQorICAgICAgICAgICAgICAgICAgICBjYXB0dXJlUmVxdWVzdC0+bU91dHB1dFN0cmVhbXMuZWRpdEl0ZW1BdChqKTsKKyAgICAgICAgICAgIGludCBzdHJlYW1JZCA9IG91dHB1dFN0cmVhbS0+Z2V0SWQoKTsKIAogICAgICAgICAgICAgLy8gUHJlcGFyZSB2aWRlbyBidWZmZXJzIGZvciBoaWdoIHNwZWVkIHJlY29yZGluZyBvbiB0aGUgZmlyc3QgdmlkZW8gcmVxdWVzdC4KICAgICAgICAgICAgIGlmIChtUHJlcGFyZVZpZGVvU3RyZWFtICYmIG91dHB1dFN0cmVhbS0+aXNWaWRlb1N0cmVhbSgpKSB7CkBAIC00OTAyLDE3ICs1NDI4LDQ1IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICByZXMgPSBvdXRwdXRTdHJlYW0tPmdldEJ1ZmZlcigmb3V0cHV0QnVmZmVycy0+ZWRpdEl0ZW1BdChqKSwKLSAgICAgICAgICAgICAgICAgICAgd2FpdER1cmF0aW9uLAotICAgICAgICAgICAgICAgICAgICBjYXB0dXJlUmVxdWVzdC0+bU91dHB1dFN1cmZhY2VzW2pdKTsKLSAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKLSAgICAgICAgICAgICAgICAvLyBDYW4ndCBnZXQgb3V0cHV0IGJ1ZmZlciBmcm9tIGdyYWxsb2MgcXVldWUgLSB0aGlzIGNvdWxkIGJlIGR1ZSB0bwotICAgICAgICAgICAgICAgIC8vIGFiYW5kb25lZCBxdWV1ZSBvciBvdGhlciBjb25zdW1lciBtaXNiZWhhdmlvciwgc28gbm90IGEgZmF0YWwKLSAgICAgICAgICAgICAgICAvLyBlcnJvcgotICAgICAgICAgICAgICAgIEFMT0dFKCJSZXF1ZXN0VGhyZWFkOiBDYW4ndCBnZXQgb3V0cHV0IGJ1ZmZlciwgc2tpcHBpbmcgcmVxdWVzdDoiCi0gICAgICAgICAgICAgICAgICAgICAgICAiICVzICglZCkiLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHNpemVfdD4gdW5pcXVlU3VyZmFjZUlkczsKKyAgICAgICAgICAgIHJlcyA9IG91dHB1dFN0cmVhbS0+Z2V0VW5pcXVlU3VyZmFjZUlkcygKKyAgICAgICAgICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3QtPm1PdXRwdXRTdXJmYWNlc1tzdHJlYW1JZF0sCisgICAgICAgICAgICAgICAgICAgICZ1bmlxdWVTdXJmYWNlSWRzKTsKKyAgICAgICAgICAgIC8vIElOVkFMSURfT1BFUkFUSU9OIGlzIG5vcm1hbCBvdXRwdXQgZm9yIHN0cmVhbXMgbm90IHN1cHBvcnRpbmcgc3VyZmFjZUlkcworICAgICAgICAgICAgaWYgKHJlcyAhPSBPSyAmJiByZXMgIT0gSU5WQUxJRF9PUEVSQVRJT04pIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IGZhaWxlZCB0byBxdWVyeSBzdHJlYW0gJWQgdW5pcXVlIHN1cmZhY2UgSURzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZWFtSWQpOworICAgICAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocmVzID09IE9LKSB7CisgICAgICAgICAgICAgICAgdW5pcXVlU3VyZmFjZUlkTWFwLmluc2VydCh7c3RyZWFtSWQsIHN0ZDo6bW92ZSh1bmlxdWVTdXJmYWNlSWRzKX0pOworICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgcmV0dXJuIFRJTUVEX09VVDsKKyAgICAgICAgICAgIGlmIChtVXNlSGFsQnVmTWFuYWdlcikgeworICAgICAgICAgICAgICAgIGlmIChvdXRwdXRTdHJlYW0tPmlzQWJhbmRvbmVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBzdHJlYW0gJWQgaXMgYWJhbmRvbmVkLiIsIF9fRlVOQ1RJT05fXywgc3RyZWFtSWQpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gVElNRURfT1VUOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBIQUwgd2lsbCByZXF1ZXN0IGJ1ZmZlciB0aHJvdWdoIHJlcXVlc3RTdHJlYW1CdWZmZXIgQVBJCisgICAgICAgICAgICAgICAgY2FtZXJhM19zdHJlYW1fYnVmZmVyX3QmIGJ1ZmZlciA9IG91dHB1dEJ1ZmZlcnMtPmVkaXRJdGVtQXQoaik7CisgICAgICAgICAgICAgICAgYnVmZmVyLnN0cmVhbSA9IG91dHB1dFN0cmVhbS0+YXNIYWxTdHJlYW0oKTsKKyAgICAgICAgICAgICAgICBidWZmZXIuYnVmZmVyID0gbnVsbHB0cjsKKyAgICAgICAgICAgICAgICBidWZmZXIuc3RhdHVzID0gQ0FNRVJBM19CVUZGRVJfU1RBVFVTX09LOworICAgICAgICAgICAgICAgIGJ1ZmZlci5hY3F1aXJlX2ZlbmNlID0gLTE7CisgICAgICAgICAgICAgICAgYnVmZmVyLnJlbGVhc2VfZmVuY2UgPSAtMTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmVzID0gb3V0cHV0U3RyZWFtLT5nZXRCdWZmZXIoJm91dHB1dEJ1ZmZlcnMtPmVkaXRJdGVtQXQoaiksCisgICAgICAgICAgICAgICAgICAgICAgICB3YWl0RHVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICBjYXB0dXJlUmVxdWVzdC0+bU91dHB1dFN1cmZhY2VzW3N0cmVhbUlkXSk7CisgICAgICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICAvLyBDYW4ndCBnZXQgb3V0cHV0IGJ1ZmZlciBmcm9tIGdyYWxsb2MgcXVldWUgLSB0aGlzIGNvdWxkIGJlIGR1ZSB0bworICAgICAgICAgICAgICAgICAgICAvLyBhYmFuZG9uZWQgcXVldWUgb3Igb3RoZXIgY29uc3VtZXIgbWlzYmVoYXZpb3IsIHNvIG5vdCBhIGZhdGFsCisgICAgICAgICAgICAgICAgICAgIC8vIGVycm9yCisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJSZXF1ZXN0VGhyZWFkOiBDYW4ndCBnZXQgb3V0cHV0IGJ1ZmZlciwgc2tpcHBpbmcgcmVxdWVzdDoiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAlcyAoJWQpIiwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRJTUVEX09VVDsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIFN0cmluZzggcGh5c2ljYWxDYW1lcmFJZCA9IG91dHB1dFN0cmVhbS0+Z2V0UGh5c2ljYWxDYW1lcmFJZCgpOwpAQCAtNDkzNCwxNSArNTQ4OCwzMiBAQAogICAgICAgICAvLyBwcmV2aWV3KSwgYW5kIHRoZSBjdXJyZW50IHJlcXVlc3QgaXMgbm90IHRoZSBsYXN0IG9uZSBpbiB0aGUgYmF0Y2gsCiAgICAgICAgIC8vIGRvIG5vdCBzZW5kIGNhbGxiYWNrIHRvIHRoZSBhcHAuCiAgICAgICAgIGJvb2wgaGFzQ2FsbGJhY2sgPSB0cnVlOwotICAgICAgICBpZiAobU5leHRSZXF1ZXN0c1swXS5jYXB0dXJlUmVxdWVzdC0+bUJhdGNoU2l6ZSA+IDEgJiYgaSAhPSBtTmV4dFJlcXVlc3RzLnNpemUoKS0xKSB7CisgICAgICAgIGlmIChiYXRjaGVkUmVxdWVzdCAmJiBpICE9IG1OZXh0UmVxdWVzdHMuc2l6ZSgpLTEpIHsKICAgICAgICAgICAgIGhhc0NhbGxiYWNrID0gZmFsc2U7CiAgICAgICAgIH0KKyAgICAgICAgYm9vbCBpc1N0aWxsQ2FwdHVyZSA9IGZhbHNlOworICAgICAgICBib29sIGlzWnNsQ2FwdHVyZSA9IGZhbHNlOworICAgICAgICBpZiAoIW1OZXh0UmVxdWVzdHNbMF0uY2FwdHVyZVJlcXVlc3QtPm1TZXR0aW5nc0xpc3QuYmVnaW4oKS0+bWV0YWRhdGEuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBlID0gY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QoKTsKKyAgICAgICAgICAgIGZpbmRfY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5KGhhbFJlcXVlc3QtPnNldHRpbmdzLCBBTkRST0lEX0NPTlRST0xfQ0FQVFVSRV9JTlRFTlQsICZlKTsKKyAgICAgICAgICAgIGlmICgoZS5jb3VudCA+IDApICYmIChlLmRhdGEudThbMF0gPT0gQU5EUk9JRF9DT05UUk9MX0NBUFRVUkVfSU5URU5UX1NUSUxMX0NBUFRVUkUpKSB7CisgICAgICAgICAgICAgICAgaXNTdGlsbENhcHR1cmUgPSB0cnVlOworICAgICAgICAgICAgICAgIEFUUkFDRV9BU1lOQ19CRUdJTigic3RpbGwgY2FwdHVyZSIsIG1OZXh0UmVxdWVzdHNbaV0uaGFsUmVxdWVzdC5mcmFtZV9udW1iZXIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmaW5kX2NhbWVyYV9tZXRhZGF0YV9yb19lbnRyeShoYWxSZXF1ZXN0LT5zZXR0aW5ncywgQU5EUk9JRF9DT05UUk9MX0VOQUJMRV9aU0wsICZlKTsKKyAgICAgICAgICAgIGlmICgoZS5jb3VudCA+IDApICYmIChlLmRhdGEudThbMF0gPT0gQU5EUk9JRF9DT05UUk9MX0VOQUJMRV9aU0xfVFJVRSkpIHsKKyAgICAgICAgICAgICAgICBpc1pzbENhcHR1cmUgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgICAgIHJlcyA9IHBhcmVudC0+cmVnaXN0ZXJJbkZsaWdodChoYWxSZXF1ZXN0LT5mcmFtZV9udW1iZXIsCiAgICAgICAgICAgICAgICAgdG90YWxOdW1CdWZmZXJzLCBjYXB0dXJlUmVxdWVzdC0+bVJlc3VsdEV4dHJhcywKICAgICAgICAgICAgICAgICAvKmhhc0lucHV0Ki9oYWxSZXF1ZXN0LT5pbnB1dF9idWZmZXIgIT0gTlVMTCwKICAgICAgICAgICAgICAgICBoYXNDYWxsYmFjaywKICAgICAgICAgICAgICAgICBjYWxjdWxhdGVNYXhFeHBlY3RlZER1cmF0aW9uKGhhbFJlcXVlc3QtPnNldHRpbmdzKSwKLSAgICAgICAgICAgICAgICByZXF1ZXN0ZWRQaHlzaWNhbENhbWVyYXMpOworICAgICAgICAgICAgICAgIHJlcXVlc3RlZFBoeXNpY2FsQ2FtZXJhcywgaXNTdGlsbENhcHR1cmUsIGlzWnNsQ2FwdHVyZSwKKyAgICAgICAgICAgICAgICAobVVzZUhhbEJ1Zk1hbmFnZXIpID8gdW5pcXVlU3VyZmFjZUlkTWFwIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3VyZmFjZU1hcHt9KTsKICAgICAgICAgQUxPR1ZWKCIlczogcmVnaXN0ZXJlZCBpbiBmbGlnaHQgcmVxdWVzdElkID0gJSIgUFJJZDMyICIsIGZyYW1lTnVtYmVyID0gJSIgUFJJZDY0CiAgICAgICAgICAgICAgICAiLCBidXJzdElkID0gJSIgUFJJZDMyICIuIiwKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sCkBAIC01MDE4LDcgKzU1ODksNyBAQAogICAgICAgICAgICAgaWYgKHMuZmlyc3QgPT0gc3RyZWFtSWQpIHsKICAgICAgICAgICAgICAgICBjb25zdCBhdXRvICZpdCA9IHN0ZDo6ZmluZChzLnNlY29uZC5iZWdpbigpLCBzLnNlY29uZC5lbmQoKSwgc3VyZmFjZUlkKTsKICAgICAgICAgICAgICAgICBpZiAoaXQgIT0gcy5zZWNvbmQuZW5kKCkpIHsKLSAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTUwMjksNyArNTYwMCw3IEBACiAgICAgICAgICAgICBpZiAocy5maXJzdCA9PSBzdHJlYW1JZCkgewogICAgICAgICAgICAgICAgIGNvbnN0IGF1dG8gJml0ID0gc3RkOjpmaW5kKHMuc2Vjb25kLmJlZ2luKCksIHMuc2Vjb25kLmVuZCgpLCBzdXJmYWNlSWQpOwogICAgICAgICAgICAgICAgIGlmIChpdCAhPSBzLnNlY29uZC5lbmQoKSkgewotICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNTAzOCw2ICs1NjA5LDIyIEBACiAgICAgcmV0dXJuIGZhbHNlOwogfQogCit2b2lkIENhbWVyYTNEZXZpY2U6OlJlcXVlc3RUaHJlYWQ6OnNpZ25hbFBpcGVsaW5lRHJhaW4oY29uc3Qgc3RkOjp2ZWN0b3I8aW50PiYgc3RyZWFtSWRzKSB7CisgICAgaWYgKCFtVXNlSGFsQnVmTWFuYWdlcikgeworICAgICAgICBBTE9HRSgiJXMgY2FsbGVkIGZvciBjYW1lcmEgZGV2aWNlIG5vdCBzdXBwb3J0aW5nIEhBTCBidWZmZXIgbWFuYWdlbWVudCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBNdXRleDo6QXV0b2xvY2sgcGwobVBhdXNlTG9jayk7CisgICAgaWYgKG1QYXVzZWQpIHsKKyAgICAgICAgbUludGVyZmFjZS0+c2lnbmFsUGlwZWxpbmVEcmFpbihzdHJlYW1JZHMpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIC8vIElmIHJlcXVlc3QgdGhyZWFkIGlzIHN0aWxsIGJ1c3ksIHdhaXQgdW50aWwgcGF1c2VkIHRoZW4gbm90aWZ5IEhBTAorICAgIG1Ob3RpZnlQaXBlbGluZURyYWluID0gdHJ1ZTsKKyAgICBtU3RyZWFtSWRzVG9CZURyYWluZWQgPSBzdHJlYW1JZHM7Cit9CisKIG5zZWNzX3QgQ2FtZXJhM0RldmljZTo6Z2V0RXhwZWN0ZWRJbkZsaWdodER1cmF0aW9uKCkgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGFsKG1JbkZsaWdodExvY2spOwpAQCAtNTIxNSw2ICs1ODAyLDE1IEBACiAgICAgICAgICAgICAgICAgaWYgKHN0YXR1c1RyYWNrZXIgIT0gMCkgewogICAgICAgICAgICAgICAgICAgICBzdGF0dXNUcmFja2VyLT5tYXJrQ29tcG9uZW50SWRsZShtU3RhdHVzSWQsIEZlbmNlOjpOT19GRU5DRSk7CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChtTm90aWZ5UGlwZWxpbmVEcmFpbikgeworICAgICAgICAgICAgICAgICAgICBtSW50ZXJmYWNlLT5zaWduYWxQaXBlbGluZURyYWluKG1TdHJlYW1JZHNUb0JlRHJhaW5lZCk7CisgICAgICAgICAgICAgICAgICAgIG1Ob3RpZnlQaXBlbGluZURyYWluID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIG1TdHJlYW1JZHNUb0JlRHJhaW5lZC5jbGVhcigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzcDxDYW1lcmEzRGV2aWNlPiBwYXJlbnQgPSBtUGFyZW50LnByb21vdGUoKTsKKyAgICAgICAgICAgICAgICBpZiAocGFyZW50ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgcGFyZW50LT5tUmVxdWVzdEJ1ZmZlclNNLm9uUmVxdWVzdFRocmVhZFBhdXNlZCgpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIFN0b3Agd2FpdGluZyBmb3Igbm93IGFuZCBsZXQgdGhyZWFkIG1hbmFnZW1lbnQgaGFwcGVuCiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTUyOTksNiArNTg5NSwxNSBAQAogICAgICAgICAgICAgaWYgKHN0YXR1c1RyYWNrZXIgIT0gMCkgewogICAgICAgICAgICAgICAgIHN0YXR1c1RyYWNrZXItPm1hcmtDb21wb25lbnRJZGxlKG1TdGF0dXNJZCwgRmVuY2U6Ok5PX0ZFTkNFKTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtTm90aWZ5UGlwZWxpbmVEcmFpbikgeworICAgICAgICAgICAgICAgIG1JbnRlcmZhY2UtPnNpZ25hbFBpcGVsaW5lRHJhaW4obVN0cmVhbUlkc1RvQmVEcmFpbmVkKTsKKyAgICAgICAgICAgICAgICBtTm90aWZ5UGlwZWxpbmVEcmFpbiA9IGZhbHNlOworICAgICAgICAgICAgICAgIG1TdHJlYW1JZHNUb0JlRHJhaW5lZC5jbGVhcigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3A8Q2FtZXJhM0RldmljZT4gcGFyZW50ID0gbVBhcmVudC5wcm9tb3RlKCk7CisgICAgICAgICAgICBpZiAocGFyZW50ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBwYXJlbnQtPm1SZXF1ZXN0QnVmZmVyU00ub25SZXF1ZXN0VGhyZWFkUGF1c2VkKCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICByZXMgPSBtRG9QYXVzZVNpZ25hbC53YWl0UmVsYXRpdmUobVBhdXNlTG9jaywga1JlcXVlc3RUaW1lb3V0KTsKQEAgLTU3NTQsMjMgKzYzNTksMTcyIEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLS8qKgotICogU3RhdGljIGNhbGxiYWNrIGZvcndhcmRpbmcgbWV0aG9kcyBmcm9tIEhBTCB0byBpbnN0YW5jZQotICovCitzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0QnVmZmVyU3RhdGVNYWNoaW5lOjppbml0aWFsaXplKAorICAgICAgICBzcDxjYW1lcmEzOjpTdGF0dXNUcmFja2VyPiBzdGF0dXNUcmFja2VyKSB7CisgICAgaWYgKHN0YXR1c1RyYWNrZXIgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IHN0YXR1c1RyYWNrZXIgaXMgbnVsbCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQogCi12b2lkIENhbWVyYTNEZXZpY2U6OnNQcm9jZXNzQ2FwdHVyZVJlc3VsdChjb25zdCBjYW1lcmEzX2NhbGxiYWNrX29wcyAqY2IsCi0gICAgICAgIGNvbnN0IGNhbWVyYTNfY2FwdHVyZV9yZXN1bHQgKnJlc3VsdCkgewotICAgIENhbWVyYTNEZXZpY2UgKmQgPQotICAgICAgICAgICAgY29uc3RfY2FzdDxDYW1lcmEzRGV2aWNlKj4oc3RhdGljX2Nhc3Q8Y29uc3QgQ2FtZXJhM0RldmljZSo+KGNiKSk7Ci0KLSAgICBkLT5wcm9jZXNzQ2FwdHVyZVJlc3VsdChyZXN1bHQpOworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKKyAgICBtU3RhdHVzVHJhY2tlciA9IHN0YXR1c1RyYWNrZXI7CisgICAgbVJlcXVlc3RCdWZmZXJTdGF0dXNJZCA9IHN0YXR1c1RyYWNrZXItPmFkZENvbXBvbmVudCgpOworICAgIHJldHVybiBPSzsKIH0KIAotdm9pZCBDYW1lcmEzRGV2aWNlOjpzTm90aWZ5KGNvbnN0IGNhbWVyYTNfY2FsbGJhY2tfb3BzICpjYiwKLSAgICAgICAgY29uc3QgY2FtZXJhM19ub3RpZnlfbXNnICptc2cpIHsKLSAgICBDYW1lcmEzRGV2aWNlICpkID0KLSAgICAgICAgICAgIGNvbnN0X2Nhc3Q8Q2FtZXJhM0RldmljZSo+KHN0YXRpY19jYXN0PGNvbnN0IENhbWVyYTNEZXZpY2UqPihjYikpOwotICAgIGQtPm5vdGlmeShtc2cpOworYm9vbCBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0QnVmZmVyU3RhdGVNYWNoaW5lOjpzdGFydFJlcXVlc3RCdWZmZXIoKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgIGlmIChtU3RhdHVzID09IFJCX1NUQVRVU19SRUFEWSB8fCBtU3RhdHVzID09IFJCX1NUQVRVU19QRU5ESU5HX1NUT1ApIHsKKyAgICAgICAgbVJlcXVlc3RCdWZmZXJPbmdvaW5nID0gdHJ1ZTsKKyAgICAgICAgbm90aWZ5VHJhY2tlckxvY2tlZCgvKmFjdGl2ZSovdHJ1ZSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgQ2FtZXJhM0RldmljZTo6UmVxdWVzdEJ1ZmZlclN0YXRlTWFjaGluZTo6ZW5kUmVxdWVzdEJ1ZmZlcigpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CisgICAgaWYgKCFtUmVxdWVzdEJ1ZmZlck9uZ29pbmcpIHsKKyAgICAgICAgQUxPR0UoIiVzIGNhbGxlZCB3aXRob3V0IGEgc3VjY2Vzc2Z1bCBzdGFydFJlcXVlc3RCdWZmZXIgY2FsbCBmaXJzdCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1SZXF1ZXN0QnVmZmVyT25nb2luZyA9IGZhbHNlOworICAgIGlmIChtU3RhdHVzID09IFJCX1NUQVRVU19QRU5ESU5HX1NUT1ApIHsKKyAgICAgICAgY2hlY2tTd2l0Y2hUb1N0b3BMb2NrZWQoKTsKKyAgICB9CisgICAgbm90aWZ5VHJhY2tlckxvY2tlZCgvKmFjdGl2ZSovZmFsc2UpOworfQorCit2b2lkIENhbWVyYTNEZXZpY2U6OlJlcXVlc3RCdWZmZXJTdGF0ZU1hY2hpbmU6Om9uU3RyZWFtc0NvbmZpZ3VyZWQoKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgIG1TdGF0dXMgPSBSQl9TVEFUVVNfUkVBRFk7CisgICAgcmV0dXJuOworfQorCit2b2lkIENhbWVyYTNEZXZpY2U6OlJlcXVlc3RCdWZmZXJTdGF0ZU1hY2hpbmU6Om9uUmVxdWVzdFN1Ym1pdHRlZCgpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CisgICAgbVJlcXVlc3RUaHJlYWRQYXVzZWQgPSBmYWxzZTsKKyAgICBtSW5mbGlnaHRNYXBFbXB0eSA9IGZhbHNlOworICAgIGlmIChtU3RhdHVzID09IFJCX1NUQVRVU19TVE9QUEVEKSB7CisgICAgICAgIG1TdGF0dXMgPSBSQl9TVEFUVVNfUkVBRFk7CisgICAgfQorICAgIHJldHVybjsKK30KKwordm9pZCBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0QnVmZmVyU3RhdGVNYWNoaW5lOjpvblJlcXVlc3RUaHJlYWRQYXVzZWQoKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgIG1SZXF1ZXN0VGhyZWFkUGF1c2VkID0gdHJ1ZTsKKyAgICBpZiAobVN0YXR1cyA9PSBSQl9TVEFUVVNfUEVORElOR19TVE9QKSB7CisgICAgICAgIGNoZWNrU3dpdGNoVG9TdG9wTG9ja2VkKCk7CisgICAgfQorICAgIHJldHVybjsKK30KKwordm9pZCBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0QnVmZmVyU3RhdGVNYWNoaW5lOjpvbkluZmxpZ2h0TWFwRW1wdHkoKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgIG1JbmZsaWdodE1hcEVtcHR5ID0gdHJ1ZTsKKyAgICBpZiAobVN0YXR1cyA9PSBSQl9TVEFUVVNfUEVORElOR19TVE9QKSB7CisgICAgICAgIGNoZWNrU3dpdGNoVG9TdG9wTG9ja2VkKCk7CisgICAgfQorICAgIHJldHVybjsKK30KKwordm9pZCBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0QnVmZmVyU3RhdGVNYWNoaW5lOjpvbldhaXRVbnRpbElkbGUoKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgIGlmICghY2hlY2tTd2l0Y2hUb1N0b3BMb2NrZWQoKSkgeworICAgICAgICBtU3RhdHVzID0gUkJfU1RBVFVTX1BFTkRJTkdfU1RPUDsKKyAgICB9CisgICAgcmV0dXJuOworfQorCit2b2lkIENhbWVyYTNEZXZpY2U6OlJlcXVlc3RCdWZmZXJTdGF0ZU1hY2hpbmU6Om5vdGlmeVRyYWNrZXJMb2NrZWQoYm9vbCBhY3RpdmUpIHsKKyAgICBzcDxTdGF0dXNUcmFja2VyPiBzdGF0dXNUcmFja2VyID0gbVN0YXR1c1RyYWNrZXIucHJvbW90ZSgpOworICAgIGlmIChzdGF0dXNUcmFja2VyICE9IG51bGxwdHIpIHsKKyAgICAgICAgaWYgKGFjdGl2ZSkgeworICAgICAgICAgICAgc3RhdHVzVHJhY2tlci0+bWFya0NvbXBvbmVudEFjdGl2ZShtUmVxdWVzdEJ1ZmZlclN0YXR1c0lkKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0YXR1c1RyYWNrZXItPm1hcmtDb21wb25lbnRJZGxlKG1SZXF1ZXN0QnVmZmVyU3RhdHVzSWQsIEZlbmNlOjpOT19GRU5DRSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2Jvb2wgQ2FtZXJhM0RldmljZTo6UmVxdWVzdEJ1ZmZlclN0YXRlTWFjaGluZTo6Y2hlY2tTd2l0Y2hUb1N0b3BMb2NrZWQoKSB7CisgICAgaWYgKG1JbmZsaWdodE1hcEVtcHR5ICYmIG1SZXF1ZXN0VGhyZWFkUGF1c2VkICYmICFtUmVxdWVzdEJ1ZmZlck9uZ29pbmcpIHsKKyAgICAgICAgbVN0YXR1cyA9IFJCX1NUQVRVU19TVE9QUEVEOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpmaXh1cE1vbm9jaHJvbWVUYWdzKGNvbnN0IENhbWVyYU1ldGFkYXRhJiBkZXZpY2VJbmZvLAorICAgICAgICBDYW1lcmFNZXRhZGF0YSYgcmVzdWx0TWV0YWRhdGEpIHsKKyAgICBzdGF0dXNfdCByZXMgPSBPSzsKKyAgICBpZiAoIW1OZWVkRml4dXBNb25vY2hyb21lVGFncykgeworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIC8vIFJlbW92ZSB0YWdzIHRoYXQgYXJlIG5vdCBhcHBsaWNhYmxlIHRvIG1vbm9jaHJvbWUgY2FtZXJhLgorICAgIGludDMyX3QgdGFnc1RvUmVtb3ZlW10gPSB7CisgICAgICAgICAgIEFORFJPSURfU0VOU09SX0dSRUVOX1NQTElULAorICAgICAgICAgICBBTkRST0lEX1NFTlNPUl9ORVVUUkFMX0NPTE9SX1BPSU5ULAorICAgICAgICAgICBBTkRST0lEX0NPTE9SX0NPUlJFQ1RJT05fTU9ERSwKKyAgICAgICAgICAgQU5EUk9JRF9DT0xPUl9DT1JSRUNUSU9OX1RSQU5TRk9STSwKKyAgICAgICAgICAgQU5EUk9JRF9DT0xPUl9DT1JSRUNUSU9OX0dBSU5TLAorICAgIH07CisgICAgZm9yIChhdXRvIHRhZyA6IHRhZ3NUb1JlbW92ZSkgeworICAgICAgICByZXMgPSByZXN1bHRNZXRhZGF0YS5lcmFzZSh0YWcpOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byByZW1vdmUgdGFnICVkIGZvciBtb25vY2hyb21lIGNhbWVyYSIsIF9fRlVOQ1RJT05fXywgdGFnKTsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBBTkRST0lEX1NFTlNPUl9EWU5BTUlDX0JMQUNLX0xFVkVMCisgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5IGJsRW50cnkgPSByZXN1bHRNZXRhZGF0YS5maW5kKEFORFJPSURfU0VOU09SX0RZTkFNSUNfQkxBQ0tfTEVWRUwpOworICAgIGZvciAoc2l6ZV90IGkgPSAxOyBpIDwgYmxFbnRyeS5jb3VudDsgaSsrKSB7CisgICAgICAgIGJsRW50cnkuZGF0YS5mW2ldID0gYmxFbnRyeS5kYXRhLmZbMF07CisgICAgfQorCisgICAgLy8gQU5EUk9JRF9TRU5TT1JfTk9JU0VfUFJPRklMRQorICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeSBucEVudHJ5ID0gcmVzdWx0TWV0YWRhdGEuZmluZChBTkRST0lEX1NFTlNPUl9OT0lTRV9QUk9GSUxFKTsKKyAgICBpZiAobnBFbnRyeS5jb3VudCA+IDAgJiYgbnBFbnRyeS5jb3VudCAlIDIgPT0gMCkgeworICAgICAgICBkb3VibGUgbnBbXSA9IHtucEVudHJ5LmRhdGEuZFswXSwgbnBFbnRyeS5kYXRhLmRbMV19OworICAgICAgICByZXMgPSByZXN1bHRNZXRhZGF0YS51cGRhdGUoQU5EUk9JRF9TRU5TT1JfTk9JU0VfUFJPRklMRSwgbnAsIDIpOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gdXBkYXRlIFNFTlNPUl9OT0lTRV9QUk9GSUxFOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBBTkRST0lEX1NUQVRJU1RJQ1NfTEVOU19TSEFESU5HX01BUAorICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeSBsc1NpemVFbnRyeSA9IGRldmljZUluZm8uZmluZChBTkRST0lEX0xFTlNfSU5GT19TSEFESU5HX01BUF9TSVpFKTsKKyAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnkgbHNFbnRyeSA9IHJlc3VsdE1ldGFkYXRhLmZpbmQoQU5EUk9JRF9TVEFUSVNUSUNTX0xFTlNfU0hBRElOR19NQVApOworICAgIGlmIChsc1NpemVFbnRyeS5jb3VudCA9PSAyICYmIGxzRW50cnkuY291bnQgPiAwCisgICAgICAgICAgICAmJiAoaW50MzJfdClsc0VudHJ5LmNvdW50ID09IDQgKiBsc1NpemVFbnRyeS5kYXRhLmkzMlswXSAqIGxzU2l6ZUVudHJ5LmRhdGEuaTMyWzFdKSB7CisgICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGxzU2l6ZUVudHJ5LmRhdGEuaTMyWzBdICogbHNTaXplRW50cnkuZGF0YS5pMzJbMV07IGkrKykgeworICAgICAgICAgICAgbHNFbnRyeS5kYXRhLmZbNCppKzFdID0gbHNFbnRyeS5kYXRhLmZbNCppXTsKKyAgICAgICAgICAgIGxzRW50cnkuZGF0YS5mWzQqaSsyXSA9IGxzRW50cnkuZGF0YS5mWzQqaV07CisgICAgICAgICAgICBsc0VudHJ5LmRhdGEuZls0KmkrM10gPSBsc0VudHJ5LmRhdGEuZls0KmldOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gQU5EUk9JRF9UT05FTUFQX0NVUlZFX0JMVUUKKyAgICAvLyBBTkRST0lEX1RPTkVNQVBfQ1VSVkVfR1JFRU4KKyAgICAvLyBBTkRST0lEX1RPTkVNQVBfQ1VSVkVfUkVECisgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5IHRjYkVudHJ5ID0gcmVzdWx0TWV0YWRhdGEuZmluZChBTkRST0lEX1RPTkVNQVBfQ1VSVkVfQkxVRSk7CisgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5IHRjZ0VudHJ5ID0gcmVzdWx0TWV0YWRhdGEuZmluZChBTkRST0lEX1RPTkVNQVBfQ1VSVkVfR1JFRU4pOworICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeSB0Y3JFbnRyeSA9IHJlc3VsdE1ldGFkYXRhLmZpbmQoQU5EUk9JRF9UT05FTUFQX0NVUlZFX1JFRCk7CisgICAgaWYgKHRjYkVudHJ5LmNvdW50ID4gMAorICAgICAgICAgICAgJiYgdGNiRW50cnkuY291bnQgPT0gdGNnRW50cnkuY291bnQKKyAgICAgICAgICAgICYmIHRjYkVudHJ5LmNvdW50ID09IHRjckVudHJ5LmNvdW50KSB7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdGNiRW50cnkuY291bnQ7IGkrKykgeworICAgICAgICAgICAgdGNiRW50cnkuZGF0YS5mW2ldID0gdGNyRW50cnkuZGF0YS5mW2ldOworICAgICAgICAgICAgdGNnRW50cnkuZGF0YS5mW2ldID0gdGNyRW50cnkuZGF0YS5mW2ldOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJlczsKIH0KIAogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0RldmljZS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRGV2aWNlLmgKaW5kZXggMTMxZDYyZi4uNDE5YWM0MiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRGV2aWNlLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRGV2aWNlLmgKQEAgLTMzLDEwICszMywxMSBAQAogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL2RldmljZS8zLjIvSUNhbWVyYURldmljZVNlc3Npb24uaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9kZXZpY2UvMy4zL0lDYW1lcmFEZXZpY2VTZXNzaW9uLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvZGV2aWNlLzMuNC9JQ2FtZXJhRGV2aWNlU2Vzc2lvbi5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL2RldmljZS8zLjUvSUNhbWVyYURldmljZVNlc3Npb24uaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9kZXZpY2UvMy4yL0lDYW1lcmFEZXZpY2VDYWxsYmFjay5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL2RldmljZS8zLjQvSUNhbWVyYURldmljZUNhbGxiYWNrLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvZGV2aWNlLzMuNS9JQ2FtZXJhRGV2aWNlQ2FsbGJhY2suaD4KICNpbmNsdWRlIDxmbXEvTWVzc2FnZVF1ZXVlLmg+Ci0jaW5jbHVkZSA8aGFyZHdhcmUvY2FtZXJhMy5oPgogCiAjaW5jbHVkZSA8Y2FtZXJhL0NhcHR1cmVSZXN1bHQuaD4KIApAQCAtNTAsMjAgKzUxLDYgQEAKIAogdXNpbmcgYW5kcm9pZDo6Y2FtZXJhMzo6T3V0cHV0U3RyZWFtSW5mbzsKIAotLyoqCi0gKiBGdW5jdGlvbiBwb2ludGVyIHR5cGVzIHdpdGggQyBjYWxsaW5nIGNvbnZlbnRpb24gdG8KLSAqIHVzZSBmb3IgSEFMIGNhbGxiYWNrIGZ1bmN0aW9ucy4KLSAqLwotZXh0ZXJuICJDIiB7Ci0gICAgdHlwZWRlZiB2b2lkIChjYWxsYmFja3NfcHJvY2Vzc19jYXB0dXJlX3Jlc3VsdF90KSgKLSAgICAgICAgY29uc3Qgc3RydWN0IGNhbWVyYTNfY2FsbGJhY2tfb3BzICosCi0gICAgICAgIGNvbnN0IGNhbWVyYTNfY2FwdHVyZV9yZXN1bHRfdCAqKTsKLQotICAgIHR5cGVkZWYgdm9pZCAoY2FsbGJhY2tzX25vdGlmeV90KSgKLSAgICAgICAgY29uc3Qgc3RydWN0IGNhbWVyYTNfY2FsbGJhY2tfb3BzICosCi0gICAgICAgIGNvbnN0IGNhbWVyYTNfbm90aWZ5X21zZ190ICopOwotfQotCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIG5hbWVzcGFjZSBjYW1lcmEzIHsKQEAgLTgwLDggKzY3LDcgQEAKICAqLwogY2xhc3MgQ2FtZXJhM0RldmljZSA6CiAgICAgICAgICAgICBwdWJsaWMgQ2FtZXJhRGV2aWNlQmFzZSwKLSAgICAgICAgICAgIHZpcnR1YWwgcHVibGljIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNDo6SUNhbWVyYURldmljZUNhbGxiYWNrLAotICAgICAgICAgICAgcHJpdmF0ZSBjYW1lcmEzX2NhbGxiYWNrX29wcyB7CisgICAgICAgICAgICB2aXJ0dWFsIHB1YmxpYyBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzU6OklDYW1lcmFEZXZpY2VDYWxsYmFjayB7CiAgIHB1YmxpYzoKIAogICAgIGV4cGxpY2l0IENhbWVyYTNEZXZpY2UoY29uc3QgU3RyaW5nOCYgaWQpOwpAQCAtMjEwLDYgKzE5Niw4IEBACiAKICAgcHJpdmF0ZToKIAorICAgIHN0YXR1c190IGRpc2Nvbm5lY3RJbXBsKCk7CisKICAgICAvLyBpbnRlcm5hbCB0eXBlZGVmcwogICAgIHVzaW5nIFJlcXVlc3RNZXRhZGF0YVF1ZXVlID0gaGFyZHdhcmU6Ok1lc3NhZ2VRdWV1ZTx1aW50OF90LCBoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZT47CiAgICAgdXNpbmcgUmVzdWx0TWV0YWRhdGFRdWV1ZSAgPSBoYXJkd2FyZTo6TWVzc2FnZVF1ZXVlPHVpbnQ4X3QsIGhhcmR3YXJlOjprU3luY2hyb25pemVkUmVhZFdyaXRlPjsKQEAgLTI2OCw3ICsyNTYsOCBAQAogICAgIGNsYXNzIEhhbEludGVyZmFjZSA6IHB1YmxpYyBjYW1lcmEzOjpDYW1lcmEzU3RyZWFtQnVmZmVyRnJlZWRMaXN0ZW5lciB7CiAgICAgICBwdWJsaWM6CiAgICAgICAgIEhhbEludGVyZmFjZShzcDxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OklDYW1lcmFEZXZpY2VTZXNzaW9uPiAmc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxSZXF1ZXN0TWV0YWRhdGFRdWV1ZT4gcXVldWUpOworICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFJlcXVlc3RNZXRhZGF0YVF1ZXVlPiBxdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgIGJvb2wgdXNlSGFsQnVmTWFuYWdlcik7CiAgICAgICAgIEhhbEludGVyZmFjZShjb25zdCBIYWxJbnRlcmZhY2UgJm90aGVyKTsKICAgICAgICAgSGFsSW50ZXJmYWNlKCk7CiAKQEAgLTI5NywxNCArMjg2LDI3IEBACiAgICAgICAgIHN0YXR1c190IGR1bXAoaW50IGZkKTsKICAgICAgICAgc3RhdHVzX3QgY2xvc2UoKTsKIAorICAgICAgICB2b2lkIHNpZ25hbFBpcGVsaW5lRHJhaW4oY29uc3Qgc3RkOjp2ZWN0b3I8aW50PiYgc3RyZWFtSWRzKTsKKworICAgICAgICAvLyBtZXRob2QgdG8gZXh0cmFjdCBidWZmZXIncyB1bmlxdWUgSUQKKyAgICAgICAgLy8gcmV0dXJuIHBhaXIgb2YgKG5ld2x5U2VlbkJ1ZmZlcj8sIGJ1ZmZlcklkKQorICAgICAgICBzdGQ6OnBhaXI8Ym9vbCwgdWludDY0X3Q+IGdldEJ1ZmZlcklkKGNvbnN0IGJ1ZmZlcl9oYW5kbGVfdCYgYnVmLCBpbnQgc3RyZWFtSWQpOworCiAgICAgICAgIC8vIEZpbmQgYSBidWZmZXJfaGFuZGxlX3QgYmFzZWQgb24gZnJhbWUgbnVtYmVyIGFuZCBzdHJlYW0gSUQKICAgICAgICAgc3RhdHVzX3QgcG9wSW5mbGlnaHRCdWZmZXIoaW50MzJfdCBmcmFtZU51bWJlciwgaW50MzJfdCBzdHJlYW1JZCwKICAgICAgICAgICAgICAgICAvKm91dCovIGJ1ZmZlcl9oYW5kbGVfdCAqKmJ1ZmZlcik7CiAKKyAgICAgICAgLy8gUmVnaXN0ZXIgYSBidWZJZC9idWZmZXJfaGFuZGxlX3QgdG8gaW5mbGlnaHQgcmVxdWVzdCBidWZmZXIKKyAgICAgICAgc3RhdHVzX3QgcHVzaEluZmxpZ2h0UmVxdWVzdEJ1ZmZlcih1aW50NjRfdCBidWZmZXJJZCwgYnVmZmVyX2hhbmRsZV90KiBidWYpOworCisgICAgICAgIC8vIEZpbmQgYSBidWZmZXJfaGFuZGxlX3QgYmFzZWQgb24gYnVmZmVySWQKKyAgICAgICAgc3RhdHVzX3QgcG9wSW5mbGlnaHRSZXF1ZXN0QnVmZmVyKHVpbnQ2NF90IGJ1ZmZlcklkLCAvKm91dCovIGJ1ZmZlcl9oYW5kbGVfdCAqKmJ1ZmZlcik7CisKICAgICAgICAgLy8gR2V0IGEgdmVjdG9yIG9mIChmcmFtZU51bWJlciwgc3RyZWFtSWQpIHBhaXIgb2YgY3VycmVudGx5IGluZmxpZ2h0CiAgICAgICAgIC8vIGJ1ZmZlcnMKICAgICAgICAgdm9pZCBnZXRJbmZsaWdodEJ1ZmZlcktleXMoc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGludDMyX3QsIGludDMyX3Q+Piogb3V0KTsKIAorICAgICAgICBzdGF0aWMgY29uc3QgdWludDY0X3QgQlVGRkVSX0lEX05PX0JVRkZFUiA9IDA7CiAgICAgICBwcml2YXRlOgogICAgICAgICAvLyBBbHdheXMgdmFsaWQKICAgICAgICAgc3A8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpJQ2FtZXJhRGV2aWNlU2Vzc2lvbj4gbUhpZGxTZXNzaW9uOwpAQCAtMzEyLDYgKzMxNCw4IEBACiAgICAgICAgIHNwPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMzo6SUNhbWVyYURldmljZVNlc3Npb24+IG1IaWRsU2Vzc2lvbl8zXzM7CiAgICAgICAgIC8vIFZhbGlkIGlmIElDYW1lcmFEZXZpY2VTZXNzaW9uIGlzIEAzLjQgb3IgbmV3ZXIKICAgICAgICAgc3A8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM180OjpJQ2FtZXJhRGV2aWNlU2Vzc2lvbj4gbUhpZGxTZXNzaW9uXzNfNDsKKyAgICAgICAgLy8gVmFsaWQgaWYgSUNhbWVyYURldmljZVNlc3Npb24gaXMgQDMuNSBvciBuZXdlcgorICAgICAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzU6OklDYW1lcmFEZXZpY2VTZXNzaW9uPiBtSGlkbFNlc3Npb25fM181OwogCiAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxSZXF1ZXN0TWV0YWRhdGFRdWV1ZT4gbVJlcXVlc3RNZXRhZGF0YVF1ZXVlOwogCkBAIC0zMTksNyArMzIzLDcgQEAKIAogICAgICAgICAvLyBUaGUgb3V0cHV0IEhJREwgcmVxdWVzdCBzdGlsbCBkZXBlbmRzIG9uIGlucHV0IGNhbWVyYTNfY2FwdHVyZV9yZXF1ZXN0X3QKICAgICAgICAgLy8gRG8gbm90IGZyZWUgaW5wdXQgY2FtZXJhM19jYXB0dXJlX3JlcXVlc3RfdCBiZWZvcmUgb3V0cHV0IEhJREwgcmVxdWVzdAotICAgICAgICB2b2lkIHdyYXBBc0hpZGxSZXF1ZXN0KGNhbWVyYTNfY2FwdHVyZV9yZXF1ZXN0X3QqIGluLAorICAgICAgICBzdGF0dXNfdCB3cmFwQXNIaWRsUmVxdWVzdChjYW1lcmEzX2NhcHR1cmVfcmVxdWVzdF90KiBpbiwKICAgICAgICAgICAgICAgICAvKm91dCovaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpDYXB0dXJlUmVxdWVzdCogb3V0LAogICAgICAgICAgICAgICAgIC8qb3V0Ki9zdGQ6OnZlY3RvcjxuYXRpdmVfaGFuZGxlX3QqPiogaGFuZGxlc0NyZWF0ZWQpOwogCkBAIC0zNjMsMTkgKzM2NywxOCBAQAogICAgICAgICAvLyBzdHJlYW0gSUQgLT4gcGVyIHN0cmVhbSBidWZmZXIgSUQgbWFwCiAgICAgICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxpbnQsIEJ1ZmZlcklkTWFwPiBtQnVmZmVySWRNYXBzOwogICAgICAgICB1aW50NjRfdCBtTmV4dEJ1ZmZlcklkID0gMTsgLy8gMCBtZWFucyBubyBidWZmZXIKLSAgICAgICAgc3RhdGljIGNvbnN0IHVpbnQ2NF90IEJVRkZFUl9JRF9OT19CVUZGRVIgPSAwOwotCi0gICAgICAgIC8vIG1ldGhvZCB0byBleHRyYWN0IGJ1ZmZlcidzIHVuaXF1ZSBJRAotICAgICAgICAvLyBUT0RPOiB3ZSBzaG91bGQgc3dpdGNoIHRvIHVzZSBncmFsbG9jIG1hcHBlcidzIGdldEJhY2tpbmdTdG9yZSBBUEkKLSAgICAgICAgLy8gICAgICAgb25jZSB3ZSByYW4gaW4gYmluZGVyaXplZCBncmFsbG9jIG1vZGUsIGJ1dCBiZWZvcmUgdGhhdCBpcyByZWFkeSwKLSAgICAgICAgLy8gICAgICAgd2UgbmVlZCB0byByZWx5IG9uIHRoZSBjb252ZW50aW9uYWwgYnVmZmVyIHF1ZXVlIGJlaGF2aW9yIHdoZXJlCi0gICAgICAgIC8vICAgICAgIGJ1ZmZlcl9oYW5kbGVfdCdzIEZEIHdvbid0IGNoYW5nZS4KLSAgICAgICAgLy8gcmV0dXJuIHBhaXIgb2YgKG5ld2x5U2VlbkJ1ZmZlcj8sIGJ1ZmZlcklkKQotICAgICAgICBzdGQ6OnBhaXI8Ym9vbCwgdWludDY0X3Q+IGdldEJ1ZmZlcklkKGNvbnN0IGJ1ZmZlcl9oYW5kbGVfdCYgYnVmLCBpbnQgc3RyZWFtSWQpOwogCiAgICAgICAgIHZpcnR1YWwgdm9pZCBvbkJ1ZmZlckZyZWVkKGludCBzdHJlYW1JZCwgY29uc3QgbmF0aXZlX2hhbmRsZV90KiBoYW5kbGUpIG92ZXJyaWRlOwogCiAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxpbnQsIHVpbnQ2NF90Pj4gbUZyZWVkQnVmZmVyczsKKworICAgICAgICAvLyBCdWZmZXJzIGdpdmVuIHRvIEhBTCB0aHJvdWdoIHJlcXVlc3RTdHJlYW1CdWZmZXIgQVBJCisgICAgICAgIHN0ZDo6bXV0ZXggbVJlcXVlc3RlZEJ1ZmZlcnNMb2NrOworICAgICAgICBzdGQ6OnVub3JkZXJlZF9tYXA8dWludDY0X3QsIGJ1ZmZlcl9oYW5kbGVfdCo+IG1SZXF1ZXN0ZWRCdWZmZXJzOworCisgICAgICAgIHVpbnQzMl90IG1OZXh0U3RyZWFtQ29uZmlnQ291bnRlciA9IDE7CisKKyAgICAgICAgY29uc3QgYm9vbCBtVXNlSGFsQnVmTWFuYWdlcjsKICAgICB9OwogCiAgICAgc3A8SGFsSW50ZXJmYWNlPiBtSW50ZXJmYWNlOwpAQCAtNDEwLDkgKzQxMywyMiBAQAogICAgIC8vIFRyYWNraW5nIGNhdXNlIG9mIGZhdGFsIGVycm9ycyB3aGVuIGluIFNUQVRVU19FUlJPUgogICAgIFN0cmluZzggICAgICAgICAgICAgICAgICAgIG1FcnJvckNhdXNlOwogCi0gICAgLy8gTWFwcGluZyBvZiBzdHJlYW0gSURzIHRvIHN0cmVhbSBpbnN0YW5jZXMKLSAgICB0eXBlZGVmIEtleWVkVmVjdG9yPGludCwgc3A8Y2FtZXJhMzo6Q2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZT4gPgotICAgICAgICAgICAgU3RyZWFtU2V0OworICAgIC8vIFN5bmNocm9uaXplZCBtYXBwaW5nIG9mIHN0cmVhbSBJRHMgdG8gc3RyZWFtIGluc3RhbmNlcworICAgIGNsYXNzIFN0cmVhbVNldCB7CisgICAgICBwdWJsaWM6CisgICAgICAgIHN0YXR1c190IGFkZChpbnQgc3RyZWFtSWQsIHNwPGNhbWVyYTM6OkNhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2U+KTsKKyAgICAgICAgc3NpemVfdCByZW1vdmUoaW50IHN0cmVhbUlkKTsKKyAgICAgICAgc3A8Y2FtZXJhMzo6Q2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZT4gZ2V0KGludCBzdHJlYW1JZCk7CisgICAgICAgIC8vIGdldCBieSAodW5kZXJseWluZykgdmVjdG9yIGluZGV4CisgICAgICAgIHNwPGNhbWVyYTM6OkNhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2U+IG9wZXJhdG9yW10gKHNpemVfdCBpbmRleCk7CisgICAgICAgIHNpemVfdCBzaXplKCkgY29uc3Q7CisgICAgICAgIHN0ZDo6dmVjdG9yPGludD4gZ2V0U3RyZWFtSWRzKCk7CisgICAgICAgIHZvaWQgY2xlYXIoKTsKKworICAgICAgcHJpdmF0ZToKKyAgICAgICAgbXV0YWJsZSBzdGQ6Om11dGV4IG1Mb2NrOworICAgICAgICBLZXllZFZlY3RvcjxpbnQsIHNwPGNhbWVyYTM6OkNhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2U+PiBtRGF0YTsKKyAgICB9OwogCiAgICAgU3RyZWFtU2V0ICAgICAgICAgICAgICAgICAgbU91dHB1dFN0cmVhbXM7CiAgICAgc3A8Y2FtZXJhMzo6Q2FtZXJhM1N0cmVhbT4gbUlucHV0U3RyZWFtOwpAQCAtNDgxLDggKzQ5Nyw5IEBACiAKIAogICAgIC8qKgotICAgICAqIEltcGxlbWVudGF0aW9uIG9mIGFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNDo6SUNhbWVyYURldmljZUNhbGxiYWNrCisgICAgICogSW1wbGVtZW50YXRpb24gb2YgYW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM181OjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2sKICAgICAgKi8KKwogICAgIGhhcmR3YXJlOjpSZXR1cm48dm9pZD4gcHJvY2Vzc0NhcHR1cmVSZXN1bHRfM180KAogICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPAogICAgICAgICAgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzQ6OkNhcHR1cmVSZXN1bHQ+JiByZXN1bHRzKSBvdmVycmlkZTsKQEAgLTQ5Myw2ICs1MTAsMTUgQEAKICAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzwKICAgICAgICAgICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpOb3RpZnlNc2c+JiBtc2dzKSBvdmVycmlkZTsKIAorICAgIGhhcmR3YXJlOjpSZXR1cm48dm9pZD4gcmVxdWVzdFN0cmVhbUJ1ZmZlcnMoCisgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8CisgICAgICAgICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNTo6QnVmZmVyUmVxdWVzdD4mIGJ1ZlJlcXMsCisgICAgICAgICAgICByZXF1ZXN0U3RyZWFtQnVmZmVyc19jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisKKyAgICBoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IHJldHVyblN0cmVhbUJ1ZmZlcnMoCisgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8CisgICAgICAgICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6U3RyZWFtQnVmZmVyPiYgYnVmZmVycykgb3ZlcnJpZGU7CisKICAgICAvLyBIYW5kbGUgb25lIGNhcHR1cmUgcmVzdWx0LiBBc3N1bWUgdGhhdCBtUHJvY2Vzc0NhcHR1cmVSZXN1bHRMb2NrIGlzIGhlbGQuCiAgICAgdm9pZCBwcm9jZXNzT25lQ2FwdHVyZVJlc3VsdExvY2tlZCgKICAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6Q2FwdHVyZVJlc3VsdCYgcmVzdWx0LApAQCAtNzAwLDcgKzcyNiw5IEBACiAKICAgICAgICAgUmVxdWVzdFRocmVhZCh3cDxDYW1lcmEzRGV2aWNlPiBwYXJlbnQsCiAgICAgICAgICAgICAgICAgc3A8Y2FtZXJhMzo6U3RhdHVzVHJhY2tlcj4gc3RhdHVzVHJhY2tlciwKLSAgICAgICAgICAgICAgICBzcDxIYWxJbnRlcmZhY2U+IGludGVyZmFjZSwgY29uc3QgVmVjdG9yPGludDMyX3Q+JiBzZXNzaW9uUGFyYW1LZXlzKTsKKyAgICAgICAgICAgICAgICBzcDxIYWxJbnRlcmZhY2U+IGludGVyZmFjZSwKKyAgICAgICAgICAgICAgICBjb25zdCBWZWN0b3I8aW50MzJfdD4mIHNlc3Npb25QYXJhbUtleXMsCisgICAgICAgICAgICAgICAgYm9vbCB1c2VIYWxCdWZNYW5hZ2VyKTsKICAgICAgICAgflJlcXVlc3RUaHJlYWQoKTsKIAogICAgICAgICB2b2lkICAgICBzZXROb3RpZmljYXRpb25MaXN0ZW5lcih3cDxOb3RpZmljYXRpb25MaXN0ZW5lcj4gbGlzdGVuZXIpOwpAQCAtNzg4LDYgKzgxNiw4IEBACiAgICAgICAgICAgICBtUmVxdWVzdExhdGVuY3kuZHVtcChmZCwgbmFtZSk7CiAgICAgICAgIH0KIAorICAgICAgICB2b2lkIHNpZ25hbFBpcGVsaW5lRHJhaW4oY29uc3Qgc3RkOjp2ZWN0b3I8aW50PiYgc3RyZWFtSWRzKTsKKwogICAgICAgcHJvdGVjdGVkOgogCiAgICAgICAgIHZpcnR1YWwgYm9vbCB0aHJlYWRMb29wKCk7CkBAIC04OTcsMTIgKzkyNywxMyBAQAogCiAgICAgICAgIGJvb2wgICAgICAgICAgICAgICBtUmVjb25maWd1cmVkOwogCi0gICAgICAgIC8vIFVzZWQgYnkgd2FpdElmUGF1c2VkLCB3YWl0Rm9yTmV4dFJlcXVlc3QsIGFuZCB3YWl0VW50aWxQYXVzZWQKKyAgICAgICAgLy8gVXNlZCBieSB3YWl0SWZQYXVzZWQsIHdhaXRGb3JOZXh0UmVxdWVzdCwgd2FpdFVudGlsUGF1c2VkLCBhbmQgc2lnbmFsUGlwZWxpbmVEcmFpbgogICAgICAgICBNdXRleCAgICAgICAgICAgICAgbVBhdXNlTG9jazsKICAgICAgICAgYm9vbCAgICAgICAgICAgICAgIG1Eb1BhdXNlOwogICAgICAgICBDb25kaXRpb24gICAgICAgICAgbURvUGF1c2VTaWduYWw7CiAgICAgICAgIGJvb2wgICAgICAgICAgICAgICBtUGF1c2VkOwotICAgICAgICBDb25kaXRpb24gICAgICAgICAgbVBhdXNlZFNpZ25hbDsKKyAgICAgICAgYm9vbCAgICAgICAgICAgICAgIG1Ob3RpZnlQaXBlbGluZURyYWluOworICAgICAgICBzdGQ6OnZlY3RvcjxpbnQ+ICAgbVN0cmVhbUlkc1RvQmVEcmFpbmVkOwogCiAgICAgICAgIHNwPENhcHR1cmVSZXF1ZXN0PiBtUHJldlJlcXVlc3Q7CiAgICAgICAgIGludDMyX3QgICAgICAgICAgICBtUHJldlRyaWdnZXJzOwpAQCAtOTM1LDYgKzk2Niw4IEBACiAKICAgICAgICAgVmVjdG9yPGludDMyX3Q+ICAgIG1TZXNzaW9uUGFyYW1LZXlzOwogICAgICAgICBDYW1lcmFNZXRhZGF0YSAgICAgbUxhdGVzdFNlc3Npb25QYXJhbXM7CisKKyAgICAgICAgY29uc3QgYm9vbCAgICAgICAgIG1Vc2VIYWxCdWZNYW5hZ2VyOwogICAgIH07CiAgICAgc3A8UmVxdWVzdFRocmVhZD4gbVJlcXVlc3RUaHJlYWQ7CiAKQEAgLTk5NSw2ICsxMDI4LDE1IEBACiAgICAgICAgIC8vIE1hcCBvZiBwaHlzaWNhbENhbWVyYUlkIDwtPiBNZXRhZGF0YQogICAgICAgICBzdGQ6OnZlY3RvcjxQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvPiBwaHlzaWNhbE1ldGFkYXRhczsKIAorICAgICAgICAvLyBJbmRpY2F0ZXMgYSBzdGlsbCBjYXB0dXJlIHJlcXVlc3QuCisgICAgICAgIGJvb2wgc3RpbGxDYXB0dXJlOworCisgICAgICAgIC8vIEluZGljYXRlcyBhIFpTTCBjYXB0dXJlIHJlcXVlc3QKKyAgICAgICAgYm9vbCB6c2xDYXB0dXJlOworCisgICAgICAgIC8vIFdoYXQgc2hhcmVkIHN1cmZhY2VzIGFuIG91dHB1dCBzaG91bGQgZ28gdG8KKyAgICAgICAgU3VyZmFjZU1hcCBvdXRwdXRTdXJmYWNlczsKKwogICAgICAgICAvLyBEZWZhdWx0IGNvbnN0cnVjdG9yIG5lZWRlZCBieSBLZXllZFZlY3RvcgogICAgICAgICBJbkZsaWdodFJlcXVlc3QoKSA6CiAgICAgICAgICAgICAgICAgc2h1dHRlclRpbWVzdGFtcCgwKSwKQEAgLTEwMDUsMTIgKzEwNDcsMTYgQEAKICAgICAgICAgICAgICAgICBoYXNJbnB1dEJ1ZmZlcihmYWxzZSksCiAgICAgICAgICAgICAgICAgaGFzQ2FsbGJhY2sodHJ1ZSksCiAgICAgICAgICAgICAgICAgbWF4RXhwZWN0ZWREdXJhdGlvbihrRGVmYXVsdEV4cGVjdGVkRHVyYXRpb24pLAotICAgICAgICAgICAgICAgIHNraXBSZXN1bHRNZXRhZGF0YShmYWxzZSkgeworICAgICAgICAgICAgICAgIHNraXBSZXN1bHRNZXRhZGF0YShmYWxzZSksCisgICAgICAgICAgICAgICAgc3RpbGxDYXB0dXJlKGZhbHNlKSwKKyAgICAgICAgICAgICAgICB6c2xDYXB0dXJlKGZhbHNlKSB7CiAgICAgICAgIH0KIAogICAgICAgICBJbkZsaWdodFJlcXVlc3QoaW50IG51bUJ1ZmZlcnMsIENhcHR1cmVSZXN1bHRFeHRyYXMgZXh0cmFzLCBib29sIGhhc0lucHV0LAogICAgICAgICAgICAgICAgIGJvb2wgaGFzQXBwQ2FsbGJhY2ssIG5zZWNzX3QgbWF4RHVyYXRpb24sCi0gICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzZXQ8U3RyaW5nOD4mIHBoeXNpY2FsQ2FtZXJhSWRTZXQpIDoKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNldDxTdHJpbmc4PiYgcGh5c2ljYWxDYW1lcmFJZFNldCwgYm9vbCBpc1N0aWxsQ2FwdHVyZSwKKyAgICAgICAgICAgICAgICBib29sIGlzWnNsQ2FwdHVyZSwKKyAgICAgICAgICAgICAgICBjb25zdCBTdXJmYWNlTWFwJiBvdXRTdXJmYWNlcyA9IFN1cmZhY2VNYXB7fSkgOgogICAgICAgICAgICAgICAgIHNodXR0ZXJUaW1lc3RhbXAoMCksCiAgICAgICAgICAgICAgICAgc2Vuc29yVGltZXN0YW1wKDApLAogICAgICAgICAgICAgICAgIHJlcXVlc3RTdGF0dXMoT0spLApAQCAtMTAyMSw3ICsxMDY3LDEwIEBACiAgICAgICAgICAgICAgICAgaGFzQ2FsbGJhY2soaGFzQXBwQ2FsbGJhY2spLAogICAgICAgICAgICAgICAgIG1heEV4cGVjdGVkRHVyYXRpb24obWF4RHVyYXRpb24pLAogICAgICAgICAgICAgICAgIHNraXBSZXN1bHRNZXRhZGF0YShmYWxzZSksCi0gICAgICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFJZHMocGh5c2ljYWxDYW1lcmFJZFNldCkgeworICAgICAgICAgICAgICAgIHBoeXNpY2FsQ2FtZXJhSWRzKHBoeXNpY2FsQ2FtZXJhSWRTZXQpLAorICAgICAgICAgICAgICAgIHN0aWxsQ2FwdHVyZShpc1N0aWxsQ2FwdHVyZSksCisgICAgICAgICAgICAgICAgenNsQ2FwdHVyZShpc1pzbENhcHR1cmUpLAorICAgICAgICAgICAgICAgIG91dHB1dFN1cmZhY2VzKG91dFN1cmZhY2VzKSB7CiAgICAgICAgIH0KICAgICB9OwogCkBAIC0xMDM1LDEwICsxMDg0LDExIEBACiAgICAgbnNlY3NfdCAgICAgICAgICAgICAgICBtRXhwZWN0ZWRJbmZsaWdodER1cmF0aW9uID0gMDsKICAgICBpbnQgICAgICAgICAgICAgICAgICAgIG1JbkZsaWdodFN0YXR1c0lkOwogCi0KICAgICBzdGF0dXNfdCByZWdpc3RlckluRmxpZ2h0KHVpbnQzMl90IGZyYW1lTnVtYmVyLAogICAgICAgICAgICAgaW50MzJfdCBudW1CdWZmZXJzLCBDYXB0dXJlUmVzdWx0RXh0cmFzIHJlc3VsdEV4dHJhcywgYm9vbCBoYXNJbnB1dCwKLSAgICAgICAgICAgIGJvb2wgY2FsbGJhY2ssIG5zZWNzX3QgbWF4RXhwZWN0ZWREdXJhdGlvbiwgc3RkOjpzZXQ8U3RyaW5nOD4mIHBoeXNpY2FsQ2FtZXJhSWRzKTsKKyAgICAgICAgICAgIGJvb2wgY2FsbGJhY2ssIG5zZWNzX3QgbWF4RXhwZWN0ZWREdXJhdGlvbiwgc3RkOjpzZXQ8U3RyaW5nOD4mIHBoeXNpY2FsQ2FtZXJhSWRzLAorICAgICAgICAgICAgYm9vbCBpc1N0aWxsQ2FwdHVyZSwgYm9vbCBpc1pzbENhcHR1cmUsCisgICAgICAgICAgICBjb25zdCBTdXJmYWNlTWFwJiBvdXRwdXRTdXJmYWNlcyk7CiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBtYXhpbXVtIGV4cGVjdGVkIHRpbWUgaXQnbGwgdGFrZSBmb3IgYWxsIGN1cnJlbnRseSBpbi1mbGlnaHQKQEAgLTExNDgsNyArMTE5OCwxMSBAQAogCiAgICAgLy8gaGVscGVyIGZ1bmN0aW9uIHRvIHJldHVybiB0aGUgb3V0cHV0IGJ1ZmZlcnMgdG8gdGhlIHN0cmVhbXMuCiAgICAgdm9pZCByZXR1cm5PdXRwdXRCdWZmZXJzKGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlcl90ICpvdXRwdXRCdWZmZXJzLAotICAgICAgICAgICAgc2l6ZV90IG51bUJ1ZmZlcnMsIG5zZWNzX3QgdGltZXN0YW1wKTsKKyAgICAgICAgICAgIHNpemVfdCBudW1CdWZmZXJzLCBuc2Vjc190IHRpbWVzdGFtcCwgYm9vbCB0aW1lc3RhbXBJbmNyZWFzaW5nID0gdHJ1ZSwKKyAgICAgICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgYXJndW1lbnRzIGFyZSBvbmx5IG1lYW50IGZvciBzdXJmYWNlIHNoYXJpbmcgdXNlIGNhc2UKKyAgICAgICAgICAgIGNvbnN0IFN1cmZhY2VNYXAmIG91dHB1dFN1cmZhY2VzID0gU3VyZmFjZU1hcHt9LAorICAgICAgICAgICAgLy8gVXNlZCB0byBzZW5kIGJ1ZmZlciBlcnJvciBjYWxsYmFjayB3aGVuIGZhaWxpbmcgdG8gcmV0dXJuIGJ1ZmZlcgorICAgICAgICAgICAgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyAmcmVzdWx0RXh0cmFzID0gQ2FwdHVyZVJlc3VsdEV4dHJhc3t9KTsKIAogICAgIC8vIFNlbmQgYSBwYXJ0aWFsIGNhcHR1cmUgcmVzdWx0LgogICAgIHZvaWQgc2VuZFBhcnRpYWxDYXB0dXJlUmVzdWx0KGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90ICogcGFydGlhbFJlc3VsdCwKQEAgLTEyMDQsMTMgKzEyNTgsODggQEAKICAgICAvLyBDYWNoZWQgbGFzdCByZXF1ZXN0ZWQgdGVtcGxhdGUgaWQKICAgICBpbnQgbUxhc3RUZW1wbGF0ZUlkOwogCi0gICAgLyoqCi0gICAgICogU3RhdGljIGNhbGxiYWNrIGZvcndhcmRpbmcgbWV0aG9kcyBmcm9tIEhBTCB0byBpbnN0YW5jZQotICAgICAqLwotICAgIHN0YXRpYyBjYWxsYmFja3NfcHJvY2Vzc19jYXB0dXJlX3Jlc3VsdF90IHNQcm9jZXNzQ2FwdHVyZVJlc3VsdDsKKyAgICAvLyBTeW5jaHJvbml6ZXMgYWNjZXNzIHRvIHN0YXR1cyB0cmFja2VyIGJldHdlZW4gaW5mbGlnaHQgdXBkYXRlcyBhbmQgZGlzY29ubmVjdC4KKyAgICAvLyBiLzc5OTcyODY1CisgICAgTXV0ZXggbVRyYWNrZXJMb2NrOwogCi0gICAgc3RhdGljIGNhbGxiYWNrc19ub3RpZnlfdCBzTm90aWZ5OworICAgIC8vIFdoZXRoZXIgSEFMIHJlcXVlc3QgYnVmZmVycyB0aHJvdWdoIHJlcXVlc3RTdHJlYW1CdWZmZXJzIEFQSQorICAgIGJvb2wgbVVzZUhhbEJ1Zk1hbmFnZXIgPSBmYWxzZTsKIAorICAgIC8vIExvY2sgdG8gZW5zdXJlIHJlcXVlc3RTdHJlYW1CdWZmZXJzKCkgY2FsbGJhY2tzIGFyZSBzZXJpYWxpemVkCisgICAgc3RkOjptdXRleCBtUmVxdWVzdEJ1ZmZlckludGVyZmFjZUxvY2s7CisKKyAgICAvLyBUaGUgc3RhdGUgbWFjaGluZSB0byBjb250cm9sIHdoZW4gcmVxdWVzdFN0cmVhbUJ1ZmZlcnMgc2hvdWxkIGFsbG93CisgICAgLy8gSEFMIHRvIHJlcXVlc3QgYnVmZmVycy4KKyAgICBlbnVtIFJlcXVlc3RCdWZmZXJTdGF0ZSB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGlzIGlzIHRoZSBpbml0aWFsIHN0YXRlLgorICAgICAgICAgKiByZXF1ZXN0U3RyZWFtQnVmZmVycyBjYWxsIHdpbGwgcmV0dXJuIEZBSUxFRF9DT05GSUdVUklORyBpbiB0aGlzIHN0YXRlLgorICAgICAgICAgKiBXaWxsIHN3aXRjaCB0byBSQl9TVEFUVVNfUkVBRFkgYWZ0ZXIgYSBzdWNjZXNzZnVsIGNvbmZpZ3VyZVN0cmVhbXMgb3IKKyAgICAgICAgICogcHJvY2Vzc0NhcHR1cmVSZXF1ZXN0IGNhbGwuCisgICAgICAgICAqLworICAgICAgICBSQl9TVEFUVVNfU1RPUFBFRCwKKworICAgICAgICAvKioKKyAgICAgICAgICogcmVxdWVzdFN0cmVhbUJ1ZmZlcnMgY2FsbCB3aWxsIHByb2NlZWQgaW4gdGhpcyBzdGF0ZS4KKyAgICAgICAgICogV2hlbiBkZXZpY2UgaXMgYXNrZWQgdG8gc3RheSBpZGxlIHZpYSB3YWl0VW50aWxTdGF0ZVRoZW5SZWxvY2soKSBjYWxsOgorICAgICAgICAgKiAgICAgLSBTd2l0Y2ggdG8gUkJfU1RBVFVTX1NUT1BQRUQgaWYgdGhlcmUgaXMgbm8gaW5mbGlnaHQgcmVxdWVzdHMgYW5kCisgICAgICAgICAqICAgICAgIHJlcXVlc3QgdGhyZWFkIGlzIHBhdXNlZC4KKyAgICAgICAgICogICAgIC0gU3dpdGNoIHRvIFJCX1NUQVRVU19QRU5ESU5HX1NUT1Agb3RoZXJ3aXNlCisgICAgICAgICAqLworICAgICAgICBSQl9TVEFUVVNfUkVBRFksCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIHJlcXVlc3RTdHJlYW1CdWZmZXJzIGNhbGwgd2lsbCBwcm9jZWVkIGluIHRoaXMgc3RhdGUuCisgICAgICAgICAqIFN3aXRjaCB0byBSQl9TVEFUVVNfU1RPUFBFRCB3aGVuIGFsbCBpbmZsaWdodCByZXF1ZXN0cyBhcmUgZnVsZmlsbGVkCisgICAgICAgICAqIGFuZCByZXF1ZXN0IHRocmVhZCBpcyBwYXVzZWQKKyAgICAgICAgICovCisgICAgICAgIFJCX1NUQVRVU19QRU5ESU5HX1NUT1AsCisgICAgfTsKKworICAgIGNsYXNzIFJlcXVlc3RCdWZmZXJTdGF0ZU1hY2hpbmUgeworICAgICAgcHVibGljOgorICAgICAgICBzdGF0dXNfdCBpbml0aWFsaXplKHNwPGNhbWVyYTM6OlN0YXR1c1RyYWNrZXI+IHN0YXR1c1RyYWNrZXIpOworCisgICAgICAgIC8vIFJldHVybiBpZiB0aGUgc3RhdGUgbWFjaGluZSBjdXJyZW50bHkgYWxsb3dzIGZvciByZXF1ZXN0QnVmZmVycworICAgICAgICAvLyBJZiB0aGUgc3RhdGUgYWxsb3dzIGZvciBpdCwgbVJlcXVlc3RCdWZmZXJPbmdvaW5nIHdpbGwgYmUgc2V0IHRvIHRydWUKKyAgICAgICAgLy8gYW5kIGNhbGxlciBtdXN0IGNhbGwgZW5kUmVxdWVzdEJ1ZmZlcigpIGxhdGVyIHRvIHVuc2V0IHRoZSBmbGFnCisgICAgICAgIGJvb2wgc3RhcnRSZXF1ZXN0QnVmZmVyKCk7CisgICAgICAgIHZvaWQgZW5kUmVxdWVzdEJ1ZmZlcigpOworCisgICAgICAgIC8vIEV2ZW50cyB0cmlnZ2VyZWQgYnkgYXBwbGljYXRpb24gQVBJIGNhbGwKKyAgICAgICAgdm9pZCBvblN0cmVhbXNDb25maWd1cmVkKCk7CisgICAgICAgIHZvaWQgb25XYWl0VW50aWxJZGxlKCk7CisKKyAgICAgICAgLy8gRXZlbnRzIHVzdWFsbHkgdHJpZ2dlcmVkIGJ5IGh3QmluZGVyIHByb2Nlc3NDYXB0dXJlUmVzdWx0IGNhbGxiYWNrIHRocmVhZAorICAgICAgICAvLyBCdXQgY2FuIGFsc28gYmUgdHJpZ2dlcmVkIG9uIHJlcXVlc3QgdGhyZWFkIGZvciBmYWlsZWQgcmVxdWVzdCwgb3Igb24KKyAgICAgICAgLy8gaHdiaW5kZXIgbm90aWZ5IGNhbGxiYWNrIHRocmVhZCBmb3Igc2h1dHRlci9lcnJvciBjYWxsYmFja3MKKyAgICAgICAgdm9pZCBvbkluZmxpZ2h0TWFwRW1wdHkoKTsKKworICAgICAgICAvLyBFdmVudHMgdHJpZ2dlcmVkIGJ5IFJlcXVlc3RUaHJlYWQKKyAgICAgICAgdm9pZCBvblJlcXVlc3RTdWJtaXR0ZWQoKTsKKyAgICAgICAgdm9pZCBvblJlcXVlc3RUaHJlYWRQYXVzZWQoKTsKKworICAgICAgcHJpdmF0ZToKKyAgICAgICAgdm9pZCBub3RpZnlUcmFja2VyTG9ja2VkKGJvb2wgYWN0aXZlKTsKKworICAgICAgICAvLyBTd2l0Y2ggdG8gU1RPUFBFRCBzdGF0ZSBhbmQgcmV0dXJuIHRydWUgaWYgYWxsIGNvbmRpdGlvbnMgYWxsb3dzIGZvciBpdC4KKyAgICAgICAgLy8gT3RoZXJ3aXNlIGRvIG5vdGhpbmcgYW5kIHJldHVybiBmYWxzZS4KKyAgICAgICAgYm9vbCBjaGVja1N3aXRjaFRvU3RvcExvY2tlZCgpOworCisgICAgICAgIHN0ZDo6bXV0ZXggbUxvY2s7CisgICAgICAgIFJlcXVlc3RCdWZmZXJTdGF0ZSBtU3RhdHVzID0gUkJfU1RBVFVTX1NUT1BQRUQ7CisKKyAgICAgICAgYm9vbCBtUmVxdWVzdFRocmVhZFBhdXNlZCA9IHRydWU7CisgICAgICAgIGJvb2wgbUluZmxpZ2h0TWFwRW1wdHkgPSB0cnVlOworICAgICAgICBib29sIG1SZXF1ZXN0QnVmZmVyT25nb2luZyA9IGZhbHNlOworCisgICAgICAgIHdwPGNhbWVyYTM6OlN0YXR1c1RyYWNrZXI+IG1TdGF0dXNUcmFja2VyOworICAgICAgICBpbnQgIG1SZXF1ZXN0QnVmZmVyU3RhdHVzSWQ7CisgICAgfSBtUmVxdWVzdEJ1ZmZlclNNOworCisgICAgLy8gRml4IHVwIHJlc3VsdCBtZXRhZGF0YSBmb3IgbW9ub2Nocm9tZSBjYW1lcmEuCisgICAgYm9vbCBtTmVlZEZpeHVwTW9ub2Nocm9tZVRhZ3M7CisgICAgc3RhdHVzX3QgZml4dXBNb25vY2hyb21lVGFncyhjb25zdCBDYW1lcmFNZXRhZGF0YSYgZGV2aWNlSW5mbywgQ2FtZXJhTWV0YWRhdGEmIHJlc3VsdE1ldGFkYXRhKTsKIH07IC8vIGNsYXNzIENhbWVyYTNEZXZpY2UKIAogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0R1bW15U3RyZWFtLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0R1bW15U3RyZWFtLmNwcAppbmRleCBmYjFmZjc3Li5iNjM3MTYwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEdW1teVN0cmVhbS5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRHVtbXlTdHJlYW0uY3BwCkBAIC00OCw3ICs0OCw3IEBACiAKIHN0YXR1c190IENhbWVyYTNEdW1teVN0cmVhbTo6cmV0dXJuQnVmZmVyTG9ja2VkKAogICAgICAgICBjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXIgJiwKLSAgICAgICAgbnNlY3NfdCkgeworICAgICAgICBuc2Vjc190LCBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JikgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQ6IER1bW15IHN0cmVhbSBjYW5ub3QgcmV0dXJuIGJ1ZmZlcnMhIiwgX19GVU5DVElPTl9fLCBtSWQpOwogICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKQEAgLTU4LDYgKzU4LDcgQEAKICAgICAgICAgICAgIGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAmLAogICAgICAgICAgICAgbnNlY3NfdCwKICAgICAgICAgICAgIGJvb2wsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiwKICAgICAgICAgICAgIC8qb3V0Ki8KICAgICAgICAgICAgIHNwPEZlbmNlPiopIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRHVtbXlTdHJlYW0uaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0R1bW15U3RyZWFtLmgKaW5kZXggNDYyNzU0OC4uNGI2N2VhNSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRHVtbXlTdHJlYW0uaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEdW1teVN0cmVhbS5oCkBAIC04Nyw2ICs4Nyw5IEBACiAgICAgICovCiAgICAgdmlydHVhbCBzc2l6ZV90IGdldFN1cmZhY2VJZChjb25zdCBzcDxTdXJmYWNlPiAmLypzdXJmYWNlKi8pIHsgcmV0dXJuIDA7IH0KIAorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0VW5pcXVlU3VyZmFjZUlkcyhjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiwKKyAgICAgICAgICAgIC8qb3V0Ki9zdGQ6OnZlY3RvcjxzaXplX3Q+KikgeyByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047IH07CisKICAgICAvKioKICAgICAgKiBVcGRhdGUgdGhlIHN0cmVhbSBvdXRwdXQgc3VyZmFjZXMuCiAgICAgICovCkBAIC0xMDQsNiArMTA3LDcgQEAKICAgICAgICAgICAgIGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAmYnVmZmVyLAogICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAsCiAgICAgICAgICAgICBib29sIG91dHB1dCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzLAogICAgICAgICAgICAgLypvdXQqLwogICAgICAgICAgICAgc3A8RmVuY2U+ICpyZWxlYXNlRmVuY2VPdXQpOwogCkBAIC0xMjgsNyArMTMyLDcgQEAKICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzID0gc3RkOjp2ZWN0b3I8c2l6ZV90PigpKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHJldHVybkJ1ZmZlckxvY2tlZCgKICAgICAgICAgICAgIGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAmYnVmZmVyLAotICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXApOworICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAsIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgY29uZmlndXJlUXVldWVMb2NrZWQoKTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSU9TdHJlYW1CYXNlLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lPU3RyZWFtQmFzZS5jcHAKaW5kZXggM2MxZTQzZC4uMmU5MDlhMCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSU9TdHJlYW1CYXNlLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJT1N0cmVhbUJhc2UuY3BwCkBAIC0xMTYsNyArMTE2LDcgQEAKICAgICByZXR1cm4gbVRvdGFsQnVmZmVyQ291bnQ7CiB9CiAKLXNpemVfdCBDYW1lcmEzSU9TdHJlYW1CYXNlOjpnZXRIYW5kb3V0T3V0cHV0QnVmZmVyQ291bnRMb2NrZWQoKSB7CitzaXplX3QgQ2FtZXJhM0lPU3RyZWFtQmFzZTo6Z2V0SGFuZG91dE91dHB1dEJ1ZmZlckNvdW50TG9ja2VkKCkgY29uc3QgewogICAgIHJldHVybiBtSGFuZG91dE91dHB1dEJ1ZmZlckNvdW50OwogfQogCkBAIC0yMTksNyArMjE5LDggQEAKIHN0YXR1c190IENhbWVyYTNJT1N0cmVhbUJhc2U6OnJldHVybkFueUJ1ZmZlckxvY2tlZCgKICAgICAgICAgY29uc3QgY2FtZXJhM19zdHJlYW1fYnVmZmVyICZidWZmZXIsCiAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wLAotICAgICAgICBib29sIG91dHB1dCkgeworICAgICAgICBib29sIG91dHB1dCwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgc3VyZmFjZV9pZHMpIHsKICAgICBzdGF0dXNfdCByZXM7CiAKICAgICAvLyByZXR1cm5CdWZmZXIgbWF5IGJlIGNhbGxlZCBmcm9tIGEgcmF3IHBvaW50ZXIsIG5vdCBhIHNwPD4sIGFuZCB3ZSdsbCBiZQpAQCAtMjM1LDcgKzIzNiw3IEBACiAgICAgfQogCiAgICAgc3A8RmVuY2U+IHJlbGVhc2VGZW5jZTsKLSAgICByZXMgPSByZXR1cm5CdWZmZXJDaGVja2VkTG9ja2VkKGJ1ZmZlciwgdGltZXN0YW1wLCBvdXRwdXQsCisgICAgcmVzID0gcmV0dXJuQnVmZmVyQ2hlY2tlZExvY2tlZChidWZmZXIsIHRpbWVzdGFtcCwgb3V0cHV0LCBzdXJmYWNlX2lkcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWxlYXNlRmVuY2UpOwogICAgIC8vIFJlcyBtYXkgYmUgYW4gZXJyb3IsIGJ1dCB3ZSBzdGlsbCB3YW50IHRvIGRlY3JlbWVudCBvdXIgb3duZWQgY291bnQKICAgICAvLyB0byBlbmFibGUgY2xlYW4gc2h1dGRvd24uIFNvIHdlJ2xsIGp1c3QgcmV0dXJuIHRoZSBlcnJvciBidXQgb3RoZXJ3aXNlCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJT1N0cmVhbUJhc2UuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lPU3RyZWFtQmFzZS5oCmluZGV4IDBhMzFkNDQuLjc1MGY2NGQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lPU3RyZWFtQmFzZS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lPU3RyZWFtQmFzZS5oCkBAIC02NiwxMiArNjYsMTQgQEAKICAgICBzdGF0dXNfdCAgICAgICAgIHJldHVybkFueUJ1ZmZlckxvY2tlZCgKICAgICAgICAgICAgIGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAmYnVmZmVyLAogICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAsCi0gICAgICAgICAgICBib29sIG91dHB1dCk7CisgICAgICAgICAgICBib29sIG91dHB1dCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzID0gc3RkOjp2ZWN0b3I8c2l6ZV90PigpKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmV0dXJuQnVmZmVyQ2hlY2tlZExvY2tlZCgKICAgICAgICAgICAgIGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAmYnVmZmVyLAogICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAsCiAgICAgICAgICAgICBib29sIG91dHB1dCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzLAogICAgICAgICAgICAgLypvdXQqLwogICAgICAgICAgICAgc3A8RmVuY2U+ICpyZWxlYXNlRmVuY2VPdXQpID0gMDsKIApAQCAtODIsNyArODQsNyBAQAogCiAgICAgdmlydHVhbCBzaXplX3QgICBnZXRCdWZmZXJDb3VudExvY2tlZCgpOwogCi0gICAgdmlydHVhbCBzaXplX3QgICBnZXRIYW5kb3V0T3V0cHV0QnVmZmVyQ291bnRMb2NrZWQoKTsKKyAgICB2aXJ0dWFsIHNpemVfdCAgIGdldEhhbmRvdXRPdXRwdXRCdWZmZXJDb3VudExvY2tlZCgpIGNvbnN0OwogCiAgICAgdmlydHVhbCBzaXplX3QgICBnZXRIYW5kb3V0SW5wdXRCdWZmZXJDb3VudExvY2tlZCgpOwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJbnB1dFN0cmVhbS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJbnB1dFN0cmVhbS5jcHAKaW5kZXggMDE3ZDdiZS4uZmM4MzY4NCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSW5wdXRTdHJlYW0uY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lucHV0U3RyZWFtLmNwcApAQCAtOTgsNiArOTgsNyBAQAogICAgICAgICAgICAgY29uc3QgY2FtZXJhM19zdHJlYW1fYnVmZmVyICZidWZmZXIsCiAgICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCwKICAgICAgICAgICAgIGJvb2wgb3V0cHV0LAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYsCiAgICAgICAgICAgICAvKm91dCovCiAgICAgICAgICAgICBzcDxGZW5jZT4gKnJlbGVhc2VGZW5jZU91dCkgewogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJbnB1dFN0cmVhbS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSW5wdXRTdHJlYW0uaAppbmRleCAwNzMyNDY0Li45N2E2MjdhIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJbnB1dFN0cmVhbS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lucHV0U3RyZWFtLmgKQEAgLTYyLDYgKzYyLDcgQEAKICAgICAgICAgICAgIGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAmYnVmZmVyLAogICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAsCiAgICAgICAgICAgICBib29sIG91dHB1dCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzLAogICAgICAgICAgICAgLypvdXQqLwogICAgICAgICAgICAgc3A8RmVuY2U+ICpyZWxlYXNlRmVuY2VPdXQpOwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW0uY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtLmNwcAppbmRleCAyYzAyMGEyLi4yMTljYzI0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW0uY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbS5jcHAKQEAgLTE4NywxNiArMTg3LDE3IEBACiB9CiAKIHN0YXR1c190IENhbWVyYTNPdXRwdXRTdHJlYW06OnF1ZXVlQnVmZmVyVG9Db25zdW1lcihzcDxBTmF0aXZlV2luZG93PiYgY29uc3VtZXIsCi0gICAgICAgICAgICBBTmF0aXZlV2luZG93QnVmZmVyKiBidWZmZXIsIGludCBhbndSZWxlYXNlRmVuY2UpIHsKKyAgICAgICAgICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIqIGJ1ZmZlciwgaW50IGFud1JlbGVhc2VGZW5jZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mKSB7CiAgICAgcmV0dXJuIGNvbnN1bWVyLT5xdWV1ZUJ1ZmZlcihjb25zdW1lci5nZXQoKSwgYnVmZmVyLCBhbndSZWxlYXNlRmVuY2UpOwogfQogCiBzdGF0dXNfdCBDYW1lcmEzT3V0cHV0U3RyZWFtOjpyZXR1cm5CdWZmZXJMb2NrZWQoCiAgICAgICAgIGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAmYnVmZmVyLAotICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCkgeworICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCwgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgc3VyZmFjZV9pZHMpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogCi0gICAgc3RhdHVzX3QgcmVzID0gcmV0dXJuQW55QnVmZmVyTG9ja2VkKGJ1ZmZlciwgdGltZXN0YW1wLCAvKm91dHB1dCovdHJ1ZSk7CisgICAgc3RhdHVzX3QgcmVzID0gcmV0dXJuQW55QnVmZmVyTG9ja2VkKGJ1ZmZlciwgdGltZXN0YW1wLCAvKm91dHB1dCovdHJ1ZSwgc3VyZmFjZV9pZHMpOwogCiAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICByZXR1cm4gcmVzOwpAQCAtMjEyLDYgKzIxMyw3IEBACiAgICAgICAgICAgICBjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXIgJmJ1ZmZlciwKICAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wLAogICAgICAgICAgICAgYm9vbCBvdXRwdXQsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBzdXJmYWNlX2lkcywKICAgICAgICAgICAgIC8qb3V0Ki8KICAgICAgICAgICAgIHNwPEZlbmNlPiAqcmVsZWFzZUZlbmNlT3V0KSB7CiAKQEAgLTIzNywxMiArMjM5LDE0IEBACiAgICAgLyoqCiAgICAgICogUmV0dXJuIGJ1ZmZlciBiYWNrIHRvIEFOYXRpdmVXaW5kb3cKICAgICAgKi8KLSAgICBpZiAoYnVmZmVyLnN0YXR1cyA9PSBDQU1FUkEzX0JVRkZFUl9TVEFUVVNfRVJST1IgfHwgbURyb3BCdWZmZXJzKSB7CisgICAgaWYgKGJ1ZmZlci5zdGF0dXMgPT0gQ0FNRVJBM19CVUZGRVJfU1RBVFVTX0VSUk9SIHx8IG1Ecm9wQnVmZmVycyB8fCB0aW1lc3RhbXAgPT0gMCkgewogICAgICAgICAvLyBDYW5jZWwgYnVmZmVyCiAgICAgICAgIGlmIChtRHJvcEJ1ZmZlcnMpIHsKICAgICAgICAgICAgIEFMT0dWKCIlczogRHJvcHBpbmcgYSBmcmFtZSBmb3Igc3RyZWFtICVkLiIsIF9fRlVOQ1RJT05fXywgbUlkKTsKLSAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgfSBlbHNlIGlmIChidWZmZXIuc3RhdHVzID09IENBTUVSQTNfQlVGRkVSX1NUQVRVU19FUlJPUikgewogICAgICAgICAgICAgQUxPR1coIiVzOiBBIGZyYW1lIGlzIGRyb3BwZWQgZm9yIHN0cmVhbSAlZCBkdWUgdG8gYnVmZmVyIGVycm9yLiIsIF9fRlVOQ1RJT05fXywgbUlkKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiB0aW1lc3RhbXAgc2hvdWxkbid0IGJlIDAiLCBfX0ZVTkNUSU9OX18sIG1JZCk7CiAgICAgICAgIH0KIAogICAgICAgICByZXMgPSBjdXJyZW50Q29uc3VtZXItPmNhbmNlbEJ1ZmZlcihjdXJyZW50Q29uc3VtZXIuZ2V0KCksCkBAIC0yNzksNyArMjgzLDcgQEAKICAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgIH0KIAotICAgICAgICByZXMgPSBxdWV1ZUJ1ZmZlclRvQ29uc3VtZXIoY3VycmVudENvbnN1bWVyLCBhbndCdWZmZXIsIGFud1JlbGVhc2VGZW5jZSk7CisgICAgICAgIHJlcyA9IHF1ZXVlQnVmZmVyVG9Db25zdW1lcihjdXJyZW50Q29uc3VtZXIsIGFud0J1ZmZlciwgYW53UmVsZWFzZUZlbmNlLCBzdXJmYWNlX2lkcyk7CiAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiBFcnJvciBxdWV1ZWluZyBidWZmZXIgdG8gbmF0aXZlIHdpbmRvdzogIgogICAgICAgICAgICAgICAgICAgIiVzICglZCkiLCBfX0ZVTkNUSU9OX18sIG1JZCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW0uaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbS5oCmluZGV4IDZmMzZmOTIuLjQxMDkwNWQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbS5oCkBAIC0xOTAsNiArMTkwLDkgQEAKICAgICAgKi8KICAgICB2aXJ0dWFsIHNzaXplX3QgZ2V0U3VyZmFjZUlkKGNvbnN0IHNwPFN1cmZhY2U+ICYvKnN1cmZhY2UqLykgeyByZXR1cm4gMDsgfQogCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRVbmlxdWVTdXJmYWNlSWRzKGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mLAorICAgICAgICAgICAgLypvdXQqL3N0ZDo6dmVjdG9yPHNpemVfdD4qKSB7IHJldHVybiBJTlZBTElEX09QRVJBVElPTjsgfTsKKwogICAgIC8qKgogICAgICAqIFVwZGF0ZSB0aGUgc3RyZWFtIG91dHB1dCBzdXJmYWNlcy4KICAgICAgKi8KQEAgLTIxMyw2ICsyMTYsNyBAQAogICAgICAgICAgICAgY29uc3QgY2FtZXJhM19zdHJlYW1fYnVmZmVyICZidWZmZXIsCiAgICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCwKICAgICAgICAgICAgIGJvb2wgb3V0cHV0LAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgc3VyZmFjZV9pZHMsCiAgICAgICAgICAgICAvKm91dCovCiAgICAgICAgICAgICBzcDxGZW5jZT4gKnJlbGVhc2VGZW5jZU91dCk7CiAKQEAgLTI4NSwxMCArMjg5LDExIEBACiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHJldHVybkJ1ZmZlckxvY2tlZCgKICAgICAgICAgICAgIGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAmYnVmZmVyLAotICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXApOworICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAsIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgcXVldWVCdWZmZXJUb0NvbnN1bWVyKHNwPEFOYXRpdmVXaW5kb3c+JiBjb25zdW1lciwKLSAgICAgICAgICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIqIGJ1ZmZlciwgaW50IGFud1JlbGVhc2VGZW5jZSk7CisgICAgICAgICAgICBBTmF0aXZlV2luZG93QnVmZmVyKiBidWZmZXIsIGludCBhbndSZWxlYXNlRmVuY2UsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBzdXJmYWNlX2lkcyk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGNvbmZpZ3VyZVF1ZXVlTG9ja2VkKCk7CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlLmgKaW5kZXggYTcxMWE2ZC4uMmJkZTk0OSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlLmgKQEAgLTY3LDYgKzY3LDE4IEBACiAgICAgdmlydHVhbCBzc2l6ZV90IGdldFN1cmZhY2VJZChjb25zdCBzcDxTdXJmYWNlPiAmc3VyZmFjZSkgPSAwOwogCiAgICAgLyoqCisgICAgICogUXVlcnkgdGhlIHVuaXF1ZSBzdXJmYWNlIElEcyBvZiBjdXJyZW50IHN1cmZhY2VJZHMuCisgICAgICogV2hlbiBwYXNzaW5nIHVuaXF1ZSBzdXJmYWNlIElEcyBpbiByZXR1cm5CdWZmZXIoKSwgaWYgdGhlCisgICAgICogc3VyZmFjZUlkIGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgc3RyZWFtLCB0aGUgb3V0cHV0IGNvcnJlc3BvbmRpbmcgdG8KKyAgICAgKiB0aGUgdW5pcXVlIHN1cmZhY2UgSUQgd2lsbCBiZSBpZ25vcmVkIGFuZCBub3QgZGVsaXZlcmVkIHRvIGNsaWVudC4KKyAgICAgKgorICAgICAqIFJldHVybiBJTlZBTElEX09QRVJBVElPTiBpZiBhbmQgb25seSBpZiB0aGUgc3RyZWFtIGRvZXMgbm90IHN1cHBvcnQKKyAgICAgKiBzdXJmYWNlIHNoYXJpbmcuCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRVbmlxdWVTdXJmYWNlSWRzKGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VJZHMsCisgICAgICAgICAgICAvKm91dCovc3RkOjp2ZWN0b3I8c2l6ZV90Piogb3V0VW5pcXVlSWRzKSA9IDA7CisKKyAgICAvKioKICAgICAgKiBVcGRhdGUgdGhlIHN0cmVhbSBvdXRwdXQgc3VyZmFjZXMuCiAgICAgICovCiAgICAgdmlydHVhbCBzdGF0dXNfdCB1cGRhdGVTdHJlYW0oY29uc3Qgc3RkOjp2ZWN0b3I8c3A8U3VyZmFjZT4+ICZvdXRwdXRTdXJmYWNlcywKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW0uY3BwCmluZGV4IGZiM2NlNGMuLmUzYjc0ZDcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbS5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtLmNwcApAQCAtMTQsNiArMTQsMTAgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNkZWZpbmUgTE9HX1RBRyAiQ2FtZXJhMy1TaGFyZWRPdVN0cm0iCisjZGVmaW5lIEFUUkFDRV9UQUcgQVRSQUNFX1RBR19DQU1FUkEKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKwogI2luY2x1ZGUgIkNhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW0uaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewpAQCAtMjgsMTYgKzMyLDE3IEBACiAgICAgICAgIHVpbnQ2NF90IGNvbnN1bWVyVXNhZ2UsIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSwKICAgICAgICAgY2FtZXJhM19zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbiwKICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXBPZmZzZXQsIGNvbnN0IFN0cmluZzgmIHBoeXNpY2FsQ2FtZXJhSWQsCi0gICAgICAgIGludCBzZXRJZCkgOgorICAgICAgICBpbnQgc2V0SWQsIGJvb2wgdXNlSGFsQnVmTWFuYWdlcikgOgogICAgICAgICBDYW1lcmEzT3V0cHV0U3RyZWFtKGlkLCBDQU1FUkEzX1NUUkVBTV9PVVRQVVQsIHdpZHRoLCBoZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LCBkYXRhU3BhY2UsIHJvdGF0aW9uLCBwaHlzaWNhbENhbWVyYUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN1bWVyVXNhZ2UsIHRpbWVzdGFtcE9mZnNldCwgc2V0SWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdW1lclVzYWdlLCB0aW1lc3RhbXBPZmZzZXQsIHNldElkKSwKKyAgICAgICAgbVVzZUhhbEJ1Zk1hbmFnZXIodXNlSGFsQnVmTWFuYWdlcikgewogICAgIHNpemVfdCBjb25zdW1lckNvdW50ID0gc3RkOjptaW4oc3VyZmFjZXMuc2l6ZSgpLCBrTWF4T3V0cHV0cyk7CiAgICAgaWYgKHN1cmZhY2VzLnNpemUoKSA+IGNvbnN1bWVyQ291bnQpIHsKICAgICAgICAgQUxPR0UoIiVzOiBUcnlpbmcgdG8gYWRkIG1vcmUgY29uc3VtZXJzIHRoYW4gdGhlIG1heGltdW0gIiwgX19mdW5jX18pOwogICAgIH0KICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvbnN1bWVyQ291bnQ7IGkrKykgewotICAgICAgICBtU3VyZmFjZXNbaV0gPSBzdXJmYWNlc1tpXTsKKyAgICAgICAgbVN1cmZhY2VVbmlxdWVJZHNbaV0gPSBzdGQ6Om1ha2VfcGFpcihzdXJmYWNlc1tpXSwgbU5leHRVbmlxdWVTdXJmYWNlSWQrKyk7CiAgICAgfQogfQogCkBAIC00OCwxNSArNTMsMTUgQEAKIHN0YXR1c190IENhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW06OmNvbm5lY3RTdHJlYW1TcGxpdHRlckxvY2tlZCgpIHsKICAgICBzdGF0dXNfdCByZXMgPSBPSzsKIAotICAgIG1TdHJlYW1TcGxpdHRlciA9IG5ldyBDYW1lcmEzU3RyZWFtU3BsaXR0ZXIoKTsKKyAgICBtU3RyZWFtU3BsaXR0ZXIgPSBuZXcgQ2FtZXJhM1N0cmVhbVNwbGl0dGVyKG1Vc2VIYWxCdWZNYW5hZ2VyKTsKIAogICAgIHVpbnQ2NF90IHVzYWdlOwogICAgIGdldEVuZHBvaW50VXNhZ2UoJnVzYWdlKTsKIAogICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxzaXplX3QsIHNwPFN1cmZhY2U+PiBpbml0aWFsU3VyZmFjZXM7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrTWF4T3V0cHV0czsgaSsrKSB7Ci0gICAgICAgIGlmIChtU3VyZmFjZXNbaV0gIT0gbnVsbHB0cikgewotICAgICAgICAgICAgaW5pdGlhbFN1cmZhY2VzLmVtcGxhY2UoaSwgbVN1cmZhY2VzW2ldKTsKKyAgICAgICAgaWYgKG1TdXJmYWNlVW5pcXVlSWRzW2ldLmZpcnN0ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGluaXRpYWxTdXJmYWNlcy5lbXBsYWNlKGksIG1TdXJmYWNlVW5pcXVlSWRzW2ldLmZpcnN0KTsKICAgICAgICAgfQogICAgIH0KIApAQCAtNzEsNiArNzYsMzEgQEAKICAgICByZXR1cm4gcmVzOwogfQogCitzdGF0dXNfdCBDYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtOjphdHRhY2hCdWZmZXJUb1NwbGl0dGVyTG9ja2VkKAorICAgICAgICBBTmF0aXZlV2luZG93QnVmZmVyKiBhbmIsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzKSB7CisgICAgc3RhdHVzX3QgcmVzID0gT0s7CisKKyAgICAvLyBBdHRhY2ggdGhlIGJ1ZmZlciB0byB0aGUgc3BsaXR0ZXIgb3V0cHV0IHF1ZXVlcy4gVGhpcyBjb3VsZCBibG9jayBpZgorICAgIC8vIHRoZSBvdXRwdXQgcXVldWUgZG9lc24ndCBoYXZlIGFueSBlbXB0eSBzbG90LiBTbyB1bmxvY2sgZHVyaW5nIHRoZSBjb3Vyc2UKKyAgICAvLyBvZiBhdHRhY2hCdWZmZXJUb091dHB1dHMuCisgICAgc3A8Q2FtZXJhM1N0cmVhbVNwbGl0dGVyPiBzcGxpdHRlciA9IG1TdHJlYW1TcGxpdHRlcjsKKyAgICBtTG9jay51bmxvY2soKTsKKyAgICByZXMgPSBzcGxpdHRlci0+YXR0YWNoQnVmZmVyVG9PdXRwdXRzKGFuYiwgc3VyZmFjZV9pZHMpOworICAgIG1Mb2NrLmxvY2soKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiBDYW5ub3QgYXR0YWNoIHN0cmVhbSBzcGxpdHRlciBidWZmZXIgdG8gb3V0cHV0czogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQsIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAvLyBPbmx5IHRyYW5zaXRpb24gdG8gU1RBVEVfQUJBTkRPTkVEIGZyb20gU1RBVEVfQ09ORklHVVJFRC4gKElmIGl0IGlzIFNUQVRFX1BSRVBBUklORywKKyAgICAgICAgLy8gbGV0IHByZXBhcmVOZXh0QnVmZmVyIGhhbmRsZSB0aGUgZXJyb3IuKQorICAgICAgICBpZiAocmVzID09IE5PX0lOSVQgJiYgbVN0YXRlID09IFNUQVRFX0NPTkZJR1VSRUQpIHsKKyAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX0FCQU5ET05FRDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCisKIHN0YXR1c190IENhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW06Om5vdGlmeUJ1ZmZlclJlbGVhc2VkKEFOYXRpdmVXaW5kb3dCdWZmZXIgKmFud0J1ZmZlcikgewogICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKICAgICBzdGF0dXNfdCByZXMgPSBPSzsKQEAgLTg5LDcgKzExOSw3IEBACiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAotICAgIHJldHVybiAobVN1cmZhY2VzW3N1cmZhY2VfaWRdID09IG51bGxwdHIpOworICAgIHJldHVybiAobVN1cmZhY2VVbmlxdWVJZHNbc3VyZmFjZV9pZF0uZmlyc3QgPT0gbnVsbHB0cik7CiB9CiAKIHN0YXR1c190IENhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW06OnNldENvbnN1bWVycyhjb25zdCBzdGQ6OnZlY3RvcjxzcDxTdXJmYWNlPj4mIHN1cmZhY2VzKSB7CkBAIC0xMTIsNyArMTQyLDcgQEAKICAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CiAgICAgICAgIH0KIAotICAgICAgICBtU3VyZmFjZXNbaWRdID0gc3VyZmFjZTsKKyAgICAgICAgbVN1cmZhY2VVbmlxdWVJZHNbaWRdID0gc3RkOjptYWtlX3BhaXIoc3VyZmFjZSwgbU5leHRVbmlxdWVTdXJmYWNlSWQrKyk7CiAKICAgICAgICAgLy8gT25seSBjYWxsIGFkZE91dHB1dCBpZiB0aGUgc3BsaXR0ZXIgaGFzIGJlZW4gY29ubmVjdGVkLgogICAgICAgICBpZiAobVN0cmVhbVNwbGl0dGVyICE9IG51bGxwdHIpIHsKQEAgLTEyOCw3ICsxNTgsNyBAQAogfQogCiBzdGF0dXNfdCBDYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtOjpnZXRCdWZmZXJMb2NrZWQoY2FtZXJhM19zdHJlYW1fYnVmZmVyICpidWZmZXIsCi0gICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzKSB7CisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VJZHMpIHsKICAgICBBTmF0aXZlV2luZG93QnVmZmVyKiBhbmI7CiAgICAgaW50IGZlbmNlRmQgPSAtMTsKIApAQCAtMTM4LDIzICsxNjgsMTEgQEAKICAgICAgICAgcmV0dXJuIHJlczsKICAgICB9CiAKLSAgICAvLyBBdHRhY2ggdGhlIGJ1ZmZlciB0byB0aGUgc3BsaXR0ZXIgb3V0cHV0IHF1ZXVlcy4gVGhpcyBjb3VsZCBibG9jayBpZgotICAgIC8vIHRoZSBvdXRwdXQgcXVldWUgZG9lc24ndCBoYXZlIGFueSBlbXB0eSBzbG90LiBTbyB1bmxvY2sgZHVyaW5nIHRoZSBjb3Vyc2UKLSAgICAvLyBvZiBhdHRhY2hCdWZmZXJUb091dHB1dHMuCi0gICAgc3A8Q2FtZXJhM1N0cmVhbVNwbGl0dGVyPiBzcGxpdHRlciA9IG1TdHJlYW1TcGxpdHRlcjsKLSAgICBtTG9jay51bmxvY2soKTsKLSAgICByZXMgPSBzcGxpdHRlci0+YXR0YWNoQnVmZmVyVG9PdXRwdXRzKGFuYiwgc3VyZmFjZV9pZHMpOwotICAgIG1Mb2NrLmxvY2soKTsKLSAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiBDYW5ub3QgYXR0YWNoIHN0cmVhbSBzcGxpdHRlciBidWZmZXIgdG8gb3V0cHV0czogJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQsIHN0cmVycm9yKC1yZXMpLCByZXMpOwotICAgICAgICAvLyBPbmx5IHRyYW5zaXRpb24gdG8gU1RBVEVfQUJBTkRPTkVEIGZyb20gU1RBVEVfQ09ORklHVVJFRC4gKElmIGl0IGlzIFNUQVRFX1BSRVBBUklORywKLSAgICAgICAgLy8gbGV0IHByZXBhcmVOZXh0QnVmZmVyIGhhbmRsZSB0aGUgZXJyb3IuKQotICAgICAgICBpZiAocmVzID09IE5PX0lOSVQgJiYgbVN0YXRlID09IFNUQVRFX0NPTkZJR1VSRUQpIHsKLSAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX0FCQU5ET05FRDsKKyAgICBpZiAoIW1Vc2VIYWxCdWZNYW5hZ2VyKSB7CisgICAgICAgIHJlcyA9IGF0dGFjaEJ1ZmZlclRvU3BsaXR0ZXJMb2NrZWQoYW5iLCBzdXJmYWNlSWRzKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIHJlczsKICAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXM7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xNjgsOCArMTg2LDM4IEBACiB9CiAKIHN0YXR1c190IENhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW06OnF1ZXVlQnVmZmVyVG9Db25zdW1lcihzcDxBTmF0aXZlV2luZG93PiYgY29uc3VtZXIsCi0gICAgICAgICAgICBBTmF0aXZlV2luZG93QnVmZmVyKiBidWZmZXIsIGludCBhbndSZWxlYXNlRmVuY2UpIHsKLSAgICBzdGF0dXNfdCByZXMgPSBjb25zdW1lci0+cXVldWVCdWZmZXIoY29uc3VtZXIuZ2V0KCksIGJ1ZmZlciwgYW53UmVsZWFzZUZlbmNlKTsKKyAgICAgICAgICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIqIGJ1ZmZlciwgaW50IGFud1JlbGVhc2VGZW5jZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHVuaXF1ZVN1cmZhY2VJZHMpIHsKKyAgICBzdGF0dXNfdCByZXMgPSBPSzsKKyAgICBpZiAobVVzZUhhbEJ1Zk1hbmFnZXIpIHsKKyAgICAgICAgaWYgKHVuaXF1ZVN1cmZhY2VJZHMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogdW5pcXVlU3VyZmFjZUlkcyBtdXN0IG5vdCBiZSBlbXB0eSEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CisgICAgICAgIHN0ZDo6dmVjdG9yPHNpemVfdD4gc3VyZmFjZUlkczsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiB1bmlxdWVJZCA6IHVuaXF1ZVN1cmZhY2VJZHMpIHsKKyAgICAgICAgICAgIGJvb2wgdW5pcXVlSWRGb3VuZCA9IGZhbHNlOworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrTWF4T3V0cHV0czsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKG1TdXJmYWNlVW5pcXVlSWRzW2ldLnNlY29uZCA9PSB1bmlxdWVJZCkgeworICAgICAgICAgICAgICAgICAgICBzdXJmYWNlSWRzLnB1c2hfYmFjayhpKTsKKyAgICAgICAgICAgICAgICAgICAgdW5pcXVlSWRGb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghdW5pcXVlSWRGb3VuZCkgeworICAgICAgICAgICAgICAgIEFMT0dWKCIlczogdW5rbm93biB1bmlxdWUgc3VyZmFjZSBJRCAlenUgZm9yIHN0cmVhbSAlZDogIgorICAgICAgICAgICAgICAgICAgICAgICAgIm91dHB1dCBtaWdodCBoYXZlIGJlZW4gcmVtb3ZlZC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCB1bmlxdWVJZCwgbUlkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXMgPSBhdHRhY2hCdWZmZXJUb1NwbGl0dGVyTG9ja2VkKGJ1ZmZlciwgc3VyZmFjZUlkcyk7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXMgPSBjb25zdW1lci0+cXVldWVCdWZmZXIoY29uc3VtZXIuZ2V0KCksIGJ1ZmZlciwgYW53UmVsZWFzZUZlbmNlKTsKIAogICAgIC8vIEFmdGVyIHF1ZXVpbmcgYnVmZmVyIHRvIHRoZSBpbnRlcm5hbCBjb25zdW1lciBxdWV1ZSwgY2hlY2sgd2hldGhlciB0aGUgYnVmZmVyIGlzCiAgICAgLy8gc3VjY2Vzc2Z1bGx5IHF1ZXVlZCB0byB0aGUgb3V0cHV0IHF1ZXVlcy4KQEAgLTIyOCw4ICsyNzYsOCBAQAogICAgICAgICAqdXNhZ2UgPSBnZXRQcmVzZXRDb25zdW1lclVzYWdlKCk7CiAKICAgICAgICAgZm9yIChzaXplX3QgaWQgPSAwOyBpZCA8IGtNYXhPdXRwdXRzOyBpZCsrKSB7Ci0gICAgICAgICAgICBpZiAobVN1cmZhY2VzW2lkXSAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICAgICAgcmVzID0gZ2V0RW5kcG9pbnRVc2FnZUZvclN1cmZhY2UoJnUsIG1TdXJmYWNlc1tpZF0pOworICAgICAgICAgICAgaWYgKG1TdXJmYWNlVW5pcXVlSWRzW2lkXS5maXJzdCAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgcmVzID0gZ2V0RW5kcG9pbnRVc2FnZUZvclN1cmZhY2UoJnUsIG1TdXJmYWNlVW5pcXVlSWRzW2lkXS5maXJzdCk7CiAgICAgICAgICAgICAgICAgKnVzYWdlIHw9IHU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTI0NSw3ICsyOTMsNyBAQAogc3NpemVfdCBDYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtOjpnZXROZXh0U3VyZmFjZUlkTG9ja2VkKCkgewogICAgIHNzaXplX3QgaWQgPSAtMTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtNYXhPdXRwdXRzOyBpKyspIHsKLSAgICAgICAgaWYgKG1TdXJmYWNlc1tpXSA9PSBudWxscHRyKSB7CisgICAgICAgIGlmIChtU3VyZmFjZVVuaXF1ZUlkc1tpXS5maXJzdCA9PSBudWxscHRyKSB7CiAgICAgICAgICAgICBpZCA9IGk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtMjU4LDcgKzMwNiw3IEBACiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOwogICAgIHNzaXplX3QgaWQgPSAtMTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtNYXhPdXRwdXRzOyBpKyspIHsKLSAgICAgICAgaWYgKG1TdXJmYWNlc1tpXSA9PSBzdXJmYWNlKSB7CisgICAgICAgIGlmIChtU3VyZmFjZVVuaXF1ZUlkc1tpXS5maXJzdCA9PSBzdXJmYWNlKSB7CiAgICAgICAgICAgICBpZCA9IGk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtMjY3LDYgKzMxNSwyNiBAQAogICAgIHJldHVybiBpZDsKIH0KIAorc3RhdHVzX3QgQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbTo6Z2V0VW5pcXVlU3VyZmFjZUlkcygKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgc3VyZmFjZUlkcywKKyAgICAgICAgLypvdXQqL3N0ZDo6dmVjdG9yPHNpemVfdD4qIG91dFVuaXF1ZUlkcykgeworICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKKyAgICBpZiAob3V0VW5pcXVlSWRzID09IG51bGxwdHIgfHwgc3VyZmFjZUlkcy5zaXplKCkgPiBrTWF4T3V0cHV0cykgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIG91dFVuaXF1ZUlkcy0+Y2xlYXIoKTsKKyAgICBvdXRVbmlxdWVJZHMtPnJlc2VydmUoc3VyZmFjZUlkcy5zaXplKCkpOworCisgICAgZm9yIChjb25zdCBhdXRvJiBzdXJmYWNlSWQgOiBzdXJmYWNlSWRzKSB7CisgICAgICAgIGlmIChzdXJmYWNlSWQgPj0ga01heE91dHB1dHMpIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgb3V0VW5pcXVlSWRzLT5wdXNoX2JhY2sobVN1cmZhY2VVbmlxdWVJZHNbc3VyZmFjZUlkXS5zZWNvbmQpOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKIHN0YXR1c190IENhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW06OnJldmVydFBhcnRpYWxVcGRhdGVMb2NrZWQoCiAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPHNwPFN1cmZhY2U+LCBzaXplX3Q+ICZyZW1vdmVkU3VyZmFjZXMsCiAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPHNwPFN1cmZhY2U+LCBzaXplX3Q+ICZhdHRhY2hlZFN1cmZhY2VzKSB7CkBAIC0yODAsNyArMzQ4LDcgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBtU3VyZmFjZXNbaW5kZXhdID0gbnVsbHB0cjsKKyAgICAgICAgbVN1cmZhY2VVbmlxdWVJZHNbaW5kZXhdID0gc3RkOjptYWtlX3BhaXIobnVsbHB0ciwgbU5leHRVbmlxdWVTdXJmYWNlSWQrKyk7CiAgICAgfQogCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByZW1vdmVkU3VyZmFjZXMuc2l6ZSgpOyBpKyspIHsKQEAgLTI5MSw3ICszNTksOCBAQAogICAgICAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIG1TdXJmYWNlc1tpbmRleF0gPSByZW1vdmVkU3VyZmFjZXMua2V5QXQoaSk7CisgICAgICAgIG1TdXJmYWNlVW5pcXVlSWRzW2luZGV4XSA9IHN0ZDo6bWFrZV9wYWlyKAorICAgICAgICAgICAgICAgIHJlbW92ZWRTdXJmYWNlcy5rZXlBdChpKSwgbU5leHRVbmlxdWVTdXJmYWNlSWQrKyk7CiAgICAgfQogCiAgICAgcmV0dXJuIHJldDsKQEAgLTM0Myw4ICs0MTIsOCBAQAogCiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgbVN1cmZhY2VzW2l0XSA9IG51bGxwdHI7Ci0gICAgICAgIHJlbW92ZWRTdXJmYWNlcy5hZGQobVN1cmZhY2VzW2l0XSwgaXQpOworICAgICAgICByZW1vdmVkU3VyZmFjZXMuYWRkKG1TdXJmYWNlVW5pcXVlSWRzW2l0XS5maXJzdCwgaXQpOworICAgICAgICBtU3VyZmFjZVVuaXF1ZUlkc1tpdF0gPSBzdGQ6Om1ha2VfcGFpcihudWxscHRyLCBtTmV4dFVuaXF1ZVN1cmZhY2VJZCsrKTsKICAgICB9CiAKICAgICAvL05leHQgYWRkIHRoZSBuZXcgb3V0cHV0cwpAQCAtMzY5LDcgKzQzOCw3IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBtU3VyZmFjZXNbc3VyZmFjZUlkXSA9IGl0OworICAgICAgICBtU3VyZmFjZVVuaXF1ZUlkc1tzdXJmYWNlSWRdID0gc3RkOjptYWtlX3BhaXIoaXQsIG1OZXh0VW5pcXVlU3VyZmFjZUlkKyspOwogICAgICAgICBvdXRwdXRNYXAtPmFkZChpdCwgc3VyZmFjZUlkKTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtLmgKaW5kZXggMDJiMWMwOS4uYjVlMzdjMiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtLmgKQEAgLTE3LDYgKzE3LDcgQEAKICNpZm5kZWYgQU5EUk9JRF9TRVJWRVJTX0NBTUVSQTNfU0hBUkVEX09VVFBVVF9TVFJFQU1fSAogI2RlZmluZSBBTkRST0lEX1NFUlZFUlNfQ0FNRVJBM19TSEFSRURfT1VUUFVUX1NUUkVBTV9ICiAKKyNpbmNsdWRlIDxhcnJheT4KICNpbmNsdWRlICJDYW1lcmEzU3RyZWFtU3BsaXR0ZXIuaCIKICNpbmNsdWRlICJDYW1lcmEzT3V0cHV0U3RyZWFtLmgiCiAKQEAgLTM3LDcgKzM4LDggQEAKICAgICAgICAgICAgIHVpbnQ2NF90IGNvbnN1bWVyVXNhZ2UsIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSwKICAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sIG5zZWNzX3QgdGltZXN0YW1wT2Zmc2V0LAogICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgcGh5c2ljYWxDYW1lcmFJZCwKLSAgICAgICAgICAgIGludCBzZXRJZCA9IENBTUVSQTNfU1RSRUFNX1NFVF9JRF9JTlZBTElEKTsKKyAgICAgICAgICAgIGludCBzZXRJZCA9IENBTUVSQTNfU1RSRUFNX1NFVF9JRF9JTlZBTElELAorICAgICAgICAgICAgYm9vbCB1c2VIYWxCdWZNYW5hZ2VyID0gZmFsc2UpOwogCiAgICAgdmlydHVhbCB+Q2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbSgpOwogCkBAIC00OSw2ICs1MSwxNSBAQAogCiAgICAgdmlydHVhbCBzc2l6ZV90IGdldFN1cmZhY2VJZChjb25zdCBzcDxTdXJmYWNlPiAmc3VyZmFjZSk7CiAKKyAgICAvKioKKyAgICAgKiBRdWVyeSB0aGUgdW5pcXVlIHN1cmZhY2UgSURzIG9mIGN1cnJlbnQgc3VyZmFjZUlkcy4KKyAgICAgKiBXaGVuIHBhc3NpbmcgdW5pcXVlIHN1cmZhY2UgSURzIGluIHJldHVybkJ1ZmZlcigpLCBpZiB0aGUKKyAgICAgKiBzdXJmYWNlSWQgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBzdHJlYW0sIHRoZSBvdXRwdXQgY29ycmVzcG9uZGluZyB0bworICAgICAqIHRoZSB1bmlxdWUgc3VyZmFjZSBJRCB3aWxsIGJlIGlnbm9yZWQgYW5kIG5vdCBkZWxpdmVyZWQgdG8gY2xpZW50LgorICAgICAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0VW5pcXVlU3VyZmFjZUlkcyhjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBzdXJmYWNlSWRzLAorICAgICAgICAgICAgLypvdXQqL3N0ZDo6dmVjdG9yPHNpemVfdD4qIG91dFVuaXF1ZUlkcykgb3ZlcnJpZGU7CisKICAgICB2aXJ0dWFsIHN0YXR1c190IHVwZGF0ZVN0cmVhbShjb25zdCBzdGQ6OnZlY3RvcjxzcDxTdXJmYWNlPj4gJm91dHB1dFN1cmZhY2VzLAogICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8T3V0cHV0U3RyZWFtSW5mbz4gJm91dHB1dEluZm8sCiAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+ICZyZW1vdmVkU3VyZmFjZUlkcywKQEAgLTU4LDggKzY5LDE3IEBACiAKICAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtNYXhPdXRwdXRzID0gNDsKIAotICAgIC8vIE1hcCBzdXJmYWNlSWQgLT4gb3V0cHV0IHN1cmZhY2VzCi0gICAgc3A8U3VyZmFjZT4gbVN1cmZhY2VzW2tNYXhPdXRwdXRzXTsKKyAgICAvLyBXaGV0aGVyIEhBTCBpcyBpbiBjb250cm9sIGZvciBidWZmZXIgbWFuYWdlbWVudC4gU3VyZmFjZSBzaGFyaW5nIGJlaGF2aW9yCisgICAgLy8gZGVwZW5kcyBvbiB0aGlzIGZsYWcuCisgICAgY29uc3QgYm9vbCBtVXNlSGFsQnVmTWFuYWdlcjsKKworICAgIC8vIFBhaXIgb2YgYW4gb3V0cHV0IFN1cmZhY2UgYW5kIGl0cyB1bmlxdWUgSUQKKyAgICB0eXBlZGVmIHN0ZDo6cGFpcjxzcDxTdXJmYWNlPiwgc2l6ZV90PiBTdXJmYWNlVW5pcXVlSWQ7CisKKyAgICAvLyBNYXAgc3VyZmFjZUlkIC0+IChvdXRwdXQgc3VyZmFjZSwgdW5pcXVlIHN1cmZhY2UgSUQpCisgICAgc3RkOjphcnJheTxTdXJmYWNlVW5pcXVlSWQsIGtNYXhPdXRwdXRzPiBtU3VyZmFjZVVuaXF1ZUlkczsKKworICAgIHNpemVfdCBtTmV4dFVuaXF1ZVN1cmZhY2VJZCA9IDA7CiAKICAgICBzc2l6ZV90IGdldE5leHRTdXJmYWNlSWRMb2NrZWQoKTsKIApAQCAtNzgsMTMgKzk4LDI0IEBACiAgICAgc3RhdHVzX3QgY29ubmVjdFN0cmVhbVNwbGl0dGVyTG9ja2VkKCk7CiAKICAgICAvKioKKyAgICAgKiBBdHRhY2ggdGhlIG91dHB1dCBidWZmZXIgdG8gc3RyZWFtIHNwbGl0dGVyLgorICAgICAqIFdoZW4gY2FtZXJhIHNlcnZpY2UgaXMgZG9pbmcgYnVmZmVyIG1hbmFnZW1lbnQsIHRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkCisgICAgICogYmVmb3JlIHRoZSBidWZmZXIgaXMgaGFuZGVkIG91dCB0byBIQUwgaW4gcmVxdWVzdCB0aHJlYWQuCisgICAgICogV2hlbiBIQUwgaXMgZG9pbmcgYnVmZmVyIG1hbmFnZW1lbnQsIHRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIHdoZW4KKyAgICAgKiB0aGUgYnVmZmVyIGlzIHJldHVybmVkIGZyb20gSEFMIGluIGh3YmluZGVyIGNhbGxiYWNrIHRocmVhZC4KKyAgICAgKi8KKyAgICBzdGF0dXNfdCBhdHRhY2hCdWZmZXJUb1NwbGl0dGVyTG9ja2VkKEFOYXRpdmVXaW5kb3dCdWZmZXIqIGFuYiwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzKTsKKworICAgIC8qKgogICAgICAqIEludGVybmFsIENhbWVyYTNTdHJlYW0gaW50ZXJmYWNlCiAgICAgICovCiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRCdWZmZXJMb2NrZWQoY2FtZXJhM19zdHJlYW1fYnVmZmVyICpidWZmZXIsCiAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBzdXJmYWNlX2lkcyk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHF1ZXVlQnVmZmVyVG9Db25zdW1lcihzcDxBTmF0aXZlV2luZG93PiYgY29uc3VtZXIsCi0gICAgICAgICAgICBBTmF0aXZlV2luZG93QnVmZmVyKiBidWZmZXIsIGludCBhbndSZWxlYXNlRmVuY2UpOworICAgICAgICAgICAgQU5hdGl2ZVdpbmRvd0J1ZmZlciogYnVmZmVyLCBpbnQgYW53UmVsZWFzZUZlbmNlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgdW5pcXVlU3VyZmFjZUlkcyk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGNvbmZpZ3VyZVF1ZXVlTG9ja2VkKCk7CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW0uY3BwCmluZGV4IDdlYmMyOTkuLjI0ZDFjMWIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbS5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtLmNwcApAQCAtNjcsNyArNjcsOCBAQAogICAgIG1CdWZmZXJMaW1pdExhdGVuY3koa0J1ZmZlckxpbWl0TGF0ZW5jeUJpblNpemUpLAogICAgIG1Gb3JtYXRPdmVycmlkZGVuKGZhbHNlKSwKICAgICBtT3JpZ2luYWxGb3JtYXQoLTEpLAotICAgIG1QaHlzaWNhbENhbWVyYUlkKHBoeXNpY2FsQ2FtZXJhSWQpIHsKKyAgICBtUGh5c2ljYWxDYW1lcmFJZChwaHlzaWNhbENhbWVyYUlkKSwKKyAgICBtTGFzdFRpbWVzdGFtcCgwKSB7CiAKICAgICBjYW1lcmEzX3N0cmVhbTo6c3RyZWFtX3R5cGUgPSB0eXBlOwogICAgIGNhbWVyYTNfc3RyZWFtOjp3aWR0aCA9IHdpZHRoOwpAQCAtNjU0LDcgKzY1NSw4IEBACiB9CiAKIHN0YXR1c190IENhbWVyYTNTdHJlYW06OnJldHVybkJ1ZmZlcihjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXIgJmJ1ZmZlciwKLSAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXApIHsKKyAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAsIGJvb2wgdGltZXN0YW1wSW5jcmVhc2luZywKKyAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CiAKQEAgLTY2Niw2ICs2NjgsMTUgQEAKIAogICAgIHJlbW92ZU91dHN0YW5kaW5nQnVmZmVyKGJ1ZmZlcik7CiAKKyAgICAvLyBCdWZmZXIgc3RhdHVzIG1heSBiZSBjaGFuZ2VkLCBzbyBtYWtlIGEgY29weSBvZiB0aGUgc3RyZWFtX2J1ZmZlciBzdHJ1Y3QuCisgICAgY2FtZXJhM19zdHJlYW1fYnVmZmVyIGIgPSBidWZmZXI7CisgICAgaWYgKHRpbWVzdGFtcEluY3JlYXNpbmcgJiYgdGltZXN0YW1wICE9IDAgJiYgdGltZXN0YW1wIDw9IG1MYXN0VGltZXN0YW1wKSB7CisgICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiB0aW1lc3RhbXAgJSIgUFJJZDY0ICIgaXMgbm90IGluY3JlYXNpbmcuIFByZXYgdGltZXN0YW1wICUiIFBSSWQ2NCwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCwgdGltZXN0YW1wLCBtTGFzdFRpbWVzdGFtcCk7CisgICAgICAgIGIuc3RhdHVzID0gQ0FNRVJBM19CVUZGRVJfU1RBVFVTX0VSUk9SOworICAgIH0KKyAgICBtTGFzdFRpbWVzdGFtcCA9IHRpbWVzdGFtcDsKKwogICAgIC8qKgogICAgICAqIFRPRE86IENoZWNrIHRoYXQgdGhlIHN0YXRlIGlzIHZhbGlkIGZpcnN0LgogICAgICAqCkBAIC02NzQsOSArNjg1LDkgQEAKICAgICAgKgogICAgICAqIERvIHRoaXMgZm9yIGdldEJ1ZmZlciBhcyB3ZWxsLgogICAgICAqLwotICAgIHN0YXR1c190IHJlcyA9IHJldHVybkJ1ZmZlckxvY2tlZChidWZmZXIsIHRpbWVzdGFtcCk7CisgICAgc3RhdHVzX3QgcmVzID0gcmV0dXJuQnVmZmVyTG9ja2VkKGIsIHRpbWVzdGFtcCwgc3VyZmFjZV9pZHMpOwogICAgIGlmIChyZXMgPT0gT0spIHsKLSAgICAgICAgZmlyZUJ1ZmZlckxpc3RlbmVyc0xvY2tlZChidWZmZXIsIC8qYWNxdWlyZWQqL2ZhbHNlLCAvKm91dHB1dCovdHJ1ZSk7CisgICAgICAgIGZpcmVCdWZmZXJMaXN0ZW5lcnNMb2NrZWQoYiwgLyphY3F1aXJlZCovZmFsc2UsIC8qb3V0cHV0Ki90cnVlKTsKICAgICB9CiAKICAgICAvLyBFdmVuIGlmIHJldHVybmluZyB0aGUgYnVmZmVyIGZhaWxlZCwgd2Ugc3RpbGwgd2FudCB0byBzaWduYWwgd2hvZXZlciBpcyB3YWl0aW5nIGZvciB0aGUKQEAgLTc4NSw2ICs3OTYsMTIgQEAKICAgICByZXR1cm4gaGFzT3V0c3RhbmRpbmdCdWZmZXJzTG9ja2VkKCk7CiB9CiAKK3NpemVfdCBDYW1lcmEzU3RyZWFtOjpnZXRPdXRzdGFuZGluZ0J1ZmZlcnNDb3VudCgpIGNvbnN0IHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKKyAgICByZXR1cm4gZ2V0SGFuZG91dE91dHB1dEJ1ZmZlckNvdW50TG9ja2VkKCk7Cit9CisKIHN0YXR1c190IENhbWVyYTNTdHJlYW06OnNldFN0YXR1c1RyYWNrZXIoc3A8U3RhdHVzVHJhY2tlcj4gc3RhdHVzVHJhY2tlcikgewogICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKICAgICBzcDxTdGF0dXNUcmFja2VyPiBvbGRUcmFja2VyID0gbVN0YXR1c1RyYWNrZXIucHJvbW90ZSgpOwpAQCAtODI3LDcgKzg0NCw3IEBACiAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogfQogc3RhdHVzX3QgQ2FtZXJhM1N0cmVhbTo6cmV0dXJuQnVmZmVyTG9ja2VkKGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zZWNzX3QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc2Vjc190LCBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JikgewogICAgIEFMT0dFKCIlczogVGhpcyB0eXBlIG9mIHN0cmVhbSBkb2VzIG5vdCBzdXBwb3J0IG91dHB1dCIsIF9fRlVOQ1RJT05fXyk7CiAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW0uaAppbmRleCAwMzU1OTc4Li5kZGJhOWY2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW0uaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW0uaApAQCAtMzIyLDExICszMjIsMTcgQEAKICAgICAvKioKICAgICAgKiBSZXR1cm4gYSBidWZmZXIgdG8gdGhlIHN0cmVhbSBhZnRlciB1c2UgYnkgdGhlIEhBTC4KICAgICAgKgorICAgICAqIE11bHRpcGxlIHN1cmZhY2VzIGNvdWxkIHNoYXJlIHRoZSBzYW1lIEhBTCBzdHJlYW0sIGJ1dCBhIHJlcXVlc3QgbWF5CisgICAgICogYmUgb25seSBmb3IgYSBzdWJzZXQgb2Ygc3VyZmFjZXMuIEluIHRoaXMgY2FzZSwgdGhlCisgICAgICogQ2FtZXJhM1N0cmVhbUludGVyZmFjZSBvYmplY3QgbmVlZHMgdGhlIHN1cmZhY2UgSUQgaW5mb3JtYXRpb24gdG8gYXR0YWNoCisgICAgICogYnVmZmVycyBmb3IgdGhvc2Ugc3VyZmFjZXMuCisgICAgICoKICAgICAgKiBUaGlzIG1ldGhvZCBtYXkgb25seSBiZSBjYWxsZWQgZm9yIGJ1ZmZlcnMgcHJvdmlkZWQgYnkgZ2V0QnVmZmVyKCkuCiAgICAgICogRm9yIGJpZGlyZWN0aW9uYWwgc3RyZWFtcywgdGhpcyBtZXRob2QgYXBwbGllcyB0byB0aGUgb3V0cHV0LXNpZGUgYnVmZmVycwogICAgICAqLwogICAgIHN0YXR1c190ICAgICAgICAgcmV0dXJuQnVmZmVyKGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAmYnVmZmVyLAotICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXApOworICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAsIGJvb2wgdGltZXN0YW1wSW5jcmVhc2luZywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzID0gc3RkOjp2ZWN0b3I8c2l6ZV90PigpKTsKIAogICAgIC8qKgogICAgICAqIEZpbGwgaW4gdGhlIGNhbWVyYTNfc3RyZWFtX2J1ZmZlciB3aXRoIHRoZSBuZXh0IHZhbGlkIGJ1ZmZlciBmb3IgdGhpcwpAQCAtMzYwLDYgKzM2NiwxMSBAQAogICAgICAqLwogICAgIGJvb2wgICAgICAgICAgICAgaGFzT3V0c3RhbmRpbmdCdWZmZXJzKCkgY29uc3Q7CiAKKyAgICAvKioKKyAgICAgKiBHZXQgbnVtYmVyIG9mIGJ1ZmZlcnMgY3VycmVudGx5IGhhbmRlZCBvdXQgdG8gSEFMCisgICAgICovCisgICAgc2l6ZV90ICAgICAgICAgICBnZXRPdXRzdGFuZGluZ0J1ZmZlcnNDb3VudCgpIGNvbnN0OworCiAgICAgZW51bSB7CiAgICAgICAgIFRJTUVPVVRfTkVWRVIgPSAtMQogICAgIH07CkBAIC00NzMsNyArNDg0LDggQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldEJ1ZmZlckxvY2tlZChjYW1lcmEzX3N0cmVhbV9idWZmZXIgKmJ1ZmZlciwKICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzID0gc3RkOjp2ZWN0b3I8c2l6ZV90PigpKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHJldHVybkJ1ZmZlckxvY2tlZChjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXIgJmJ1ZmZlciwKLSAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wKTsKKyAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgc3VyZmFjZV9pZHMgPSBzdGQ6OnZlY3RvcjxzaXplX3Q+KCkpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0SW5wdXRCdWZmZXJMb2NrZWQoY2FtZXJhM19zdHJlYW1fYnVmZmVyICpidWZmZXIpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmV0dXJuSW5wdXRCdWZmZXJMb2NrZWQoCiAgICAgICAgICAgICBjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXIgJmJ1ZmZlcik7CkBAIC00OTUsNyArNTA3LDcgQEAKICAgICB2aXJ0dWFsIHNpemVfdCAgIGdldEJ1ZmZlckNvdW50TG9ja2VkKCkgPSAwOwogCiAgICAgLy8gR2V0IGhhbmRvdXQgb3V0cHV0IGJ1ZmZlciBjb3VudC4KLSAgICB2aXJ0dWFsIHNpemVfdCAgIGdldEhhbmRvdXRPdXRwdXRCdWZmZXJDb3VudExvY2tlZCgpID0gMDsKKyAgICB2aXJ0dWFsIHNpemVfdCAgIGdldEhhbmRvdXRPdXRwdXRCdWZmZXJDb3VudExvY2tlZCgpIGNvbnN0ID0gMDsKIAogICAgIC8vIEdldCBoYW5kb3V0IGlucHV0IGJ1ZmZlciBjb3VudC4KICAgICB2aXJ0dWFsIHNpemVfdCAgIGdldEhhbmRvdXRJbnB1dEJ1ZmZlckNvdW50TG9ja2VkKCkgPSAwOwpAQCAtNTY2LDYgKzU3OCw3IEBACiAgICAgYW5kcm9pZF9kYXRhc3BhY2UgbU9yaWdpbmFsRGF0YVNwYWNlOwogCiAgICAgU3RyaW5nOCBtUGh5c2ljYWxDYW1lcmFJZDsKKyAgICBuc2Vjc190IG1MYXN0VGltZXN0YW1wOwogfTsgLy8gY2xhc3MgQ2FtZXJhM1N0cmVhbQogCiB9OyAvLyBuYW1lc3BhY2UgY2FtZXJhMwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtSW50ZXJmYWNlLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW1JbnRlcmZhY2UuaAppbmRleCAzZDQ1Yzg5Li5hODQ3MjBiIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW1JbnRlcmZhY2UuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW1JbnRlcmZhY2UuaApAQCAtMjQ4LDExICsyNDgsMTggQEAKICAgICAvKioKICAgICAgKiBSZXR1cm4gYSBidWZmZXIgdG8gdGhlIHN0cmVhbSBhZnRlciB1c2UgYnkgdGhlIEhBTC4KICAgICAgKgorICAgICAqIE11bHRpcGxlIHN1cmZhY2VzIGNvdWxkIHNoYXJlIHRoZSBzYW1lIEhBTCBzdHJlYW0sIGJ1dCBhIHJlcXVlc3QgbWF5CisgICAgICogYmUgb25seSBmb3IgYSBzdWJzZXQgb2Ygc3VyZmFjZXMuIEluIHRoaXMgY2FzZSwgdGhlCisgICAgICogQ2FtZXJhM1N0cmVhbUludGVyZmFjZSBvYmplY3QgbmVlZHMgdGhlIHN1cmZhY2UgSUQgaW5mb3JtYXRpb24gdG8gYXR0YWNoCisgICAgICogYnVmZmVycyBmb3IgdGhvc2Ugc3VyZmFjZXMuIEZvciB0aGUgY2FzZSBvZiBzaW5nbGUgc3VyZmFjZSBmb3IgYSBIQUwKKyAgICAgKiBzdHJlYW0sIHN1cmZhY2VfaWRzIHBhcmFtZXRlciBoYXMgbm8gZWZmZWN0LgorICAgICAqCiAgICAgICogVGhpcyBtZXRob2QgbWF5IG9ubHkgYmUgY2FsbGVkIGZvciBidWZmZXJzIHByb3ZpZGVkIGJ5IGdldEJ1ZmZlcigpLgogICAgICAqIEZvciBiaWRpcmVjdGlvbmFsIHN0cmVhbXMsIHRoaXMgbWV0aG9kIGFwcGxpZXMgdG8gdGhlIG91dHB1dC1zaWRlIGJ1ZmZlcnMKICAgICAgKi8KICAgICB2aXJ0dWFsIHN0YXR1c190IHJldHVybkJ1ZmZlcihjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXIgJmJ1ZmZlciwKLSAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wKSA9IDA7CisgICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCwgYm9vbCB0aW1lc3RhbXBJbmNyZWFzaW5nID0gdHJ1ZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzID0gc3RkOjp2ZWN0b3I8c2l6ZV90PigpKSA9IDA7CiAKICAgICAvKioKICAgICAgKiBGaWxsIGluIHRoZSBjYW1lcmEzX3N0cmVhbV9idWZmZXIgd2l0aCB0aGUgbmV4dCB2YWxpZCBidWZmZXIgZm9yIHRoaXMKQEAgLTI4OSw2ICsyOTYsMTEgQEAKICAgICAgKi8KICAgICB2aXJ0dWFsIGJvb2wgICAgIGhhc091dHN0YW5kaW5nQnVmZmVycygpIGNvbnN0ID0gMDsKIAorICAgIC8qKgorICAgICAqIEdldCBudW1iZXIgb2YgYnVmZmVycyBjdXJyZW50bHkgaGFuZGVkIG91dCB0byBIQUwKKyAgICAgKi8KKyAgICB2aXJ0dWFsIHNpemVfdCAgIGdldE91dHN0YW5kaW5nQnVmZmVyc0NvdW50KCkgY29uc3QgPSAwOworCiAgICAgZW51bSB7CiAgICAgICAgIFRJTUVPVVRfTkVWRVIgPSAtMQogICAgIH07CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW1TcGxpdHRlci5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW1TcGxpdHRlci5jcHAKaW5kZXggZWNiOTgwYS4uODRjMmVjNyAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtU3BsaXR0ZXIuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbVNwbGl0dGVyLmNwcApAQCAtMTUyLDYgKzE1Miw4IEBACiAgICAgU1BfTE9HVigiJXM6IERpc2Nvbm5lY3RlZCIsIF9fRlVOQ1RJT05fXyk7CiB9CiAKK0NhbWVyYTNTdHJlYW1TcGxpdHRlcjo6Q2FtZXJhM1N0cmVhbVNwbGl0dGVyKGJvb2wgdXNlSGFsQnVmTWFuYWdlcikgOgorICAgICAgICBtVXNlSGFsQnVmTWFuYWdlcih1c2VIYWxCdWZNYW5hZ2VyKSB7fQogCiBDYW1lcmEzU3RyZWFtU3BsaXR0ZXI6On5DYW1lcmEzU3RyZWFtU3BsaXR0ZXIoKSB7CiAgICAgZGlzY29ubmVjdCgpOwpAQCAtMjQxLDcgKzI0Myw5IEBACiAgICAgdWludDY0X3QgdXNhZ2UgPSAwOwogICAgIHJlcyA9IG5hdGl2ZV93aW5kb3dfZ2V0X2NvbnN1bWVyX3VzYWdlKHN0YXRpY19jYXN0PEFOYXRpdmVXaW5kb3cqPihvdXRwdXRRdWV1ZS5nZXQoKSksICZ1c2FnZSk7CiAgICAgaWYgKCEodXNhZ2UgJiAoR1JBTExPQ19VU0FHRV9IV19DT01QT1NFUiB8IEdSQUxMT0NfVVNBR0VfSFdfVEVYVFVSRSkpKSB7Ci0gICAgICAgIG91dHB1dFF1ZXVlLT5zZXREZXF1ZXVlVGltZW91dChrRGVxdWV1ZUJ1ZmZlclRpbWVvdXQpOworICAgICAgICBuc2Vjc190IHRpbWVvdXQgPSBtVXNlSGFsQnVmTWFuYWdlciA/CisgICAgICAgICAgICAgICAga0hhbEJ1Zk1nckRlcXVldWVCdWZmZXJUaW1lb3V0IDoga05vcm1hbERlcXVldWVCdWZmZXJUaW1lb3V0OworICAgICAgICBvdXRwdXRRdWV1ZS0+c2V0RGVxdWV1ZVRpbWVvdXQodGltZW91dCk7CiAgICAgfQogCiAgICAgcmVzID0gZ2JwLT5hbGxvd0FsbG9jYXRpb24oZmFsc2UpOwpAQCAtNDM2LDggKzQ0MCw5IEBACiAgICAgICAgIHJlcyA9IGdicC0+YXR0YWNoQnVmZmVyKCZzbG90LCBnYik7CiAgICAgICAgIG1NdXRleC5sb2NrKCk7CiAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKLSAgICAgICAgICAgIFNQX0xPR0UoIiVzOiBDYW5ub3QgYWNxdWlyZUJ1ZmZlciBmcm9tIEdyYXBoaWNCdWZmZXJQcm9kdWNlciAlcDogJXMgKCVkKSIsCisgICAgICAgICAgICBTUF9MT0dFKCIlczogQ2Fubm90IGF0dGFjaEJ1ZmZlciBmcm9tIEdyYXBoaWNCdWZmZXJQcm9kdWNlciAlcDogJXMgKCVkKSIsCiAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgZ2JwLmdldCgpLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgIC8vIFRPRE86IG1pZ2h0IG5lZWQgdG8gZGV0YWNoL2NsZWFudXAgdGhlIGFscmVhZHkgYXR0YWNoZWQgYnVmZmVycyBiZWZvcmUgcmV0dXJuPwogICAgICAgICAgICAgcmV0dXJuIHJlczsKICAgICAgICAgfQogICAgICAgICBpZiAoKHNsb3QgPCAwKSB8fCAoc2xvdCA+IEJ1ZmZlclF1ZXVlOjpOVU1fQlVGRkVSX1NMT1RTKSkgewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtU3BsaXR0ZXIuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbVNwbGl0dGVyLmgKaW5kZXggMWVhZjJiZC4uOTYwZjdhYSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtU3BsaXR0ZXIuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW1TcGxpdHRlci5oCkBAIC00OSw3ICs0OSw3IEBACiBwdWJsaWM6CiAKICAgICAvLyBDb25zdHJ1Y3RvcgotICAgIENhbWVyYTNTdHJlYW1TcGxpdHRlcigpID0gZGVmYXVsdDsKKyAgICBDYW1lcmEzU3RyZWFtU3BsaXR0ZXIoYm9vbCB1c2VIYWxCdWZNYW5hZ2VyID0gZmFsc2UpOwogCiAgICAgLy8gQ29ubmVjdCB0byB0aGUgc3RyZWFtIHNwbGl0dGVyIGJ5IGNyZWF0aW5nIGJ1ZmZlciBxdWV1ZSBhbmQgY29ubmVjdGluZyBpdAogICAgIC8vIHdpdGggb3V0cHV0IHN1cmZhY2VzLgpAQCAtMjI2LDcgKzIyNiwxMCBAQAogICAgIGFuZHJvaWQ6OlBpeGVsRm9ybWF0IG1Gb3JtYXQgPSBhbmRyb2lkOjpQSVhFTF9GT1JNQVRfTk9ORTsKICAgICB1aW50NjRfdCBtUHJvZHVjZXJVc2FnZSA9IDA7CiAKLSAgICBzdGF0aWMgY29uc3QgbnNlY3NfdCBrRGVxdWV1ZUJ1ZmZlclRpbWVvdXQgICA9IHMybnMoMSk7IC8vIDEgc2VjCisgICAgLy8gVGhlIGF0dGFjaEJ1ZmZlciBjYWxsIHdpbGwgaGFwcGVuIG9uIGRpZmZlcmVudCB0aHJlYWQgYWNjb3JkaW5nIHRvIG1Vc2VIYWxCdWZNYW5hZ2VyIGFuZCBoYXZlCisgICAgLy8gZGlmZmVyZW50IHRpbWluZyBjb25zdHJhaW50LgorICAgIHN0YXRpYyBjb25zdCBuc2Vjc190IGtOb3JtYWxEZXF1ZXVlQnVmZmVyVGltZW91dCAgICA9IHMybnMoMSk7ICAvLyAxIHNlYworICAgIHN0YXRpYyBjb25zdCBuc2Vjc190IGtIYWxCdWZNZ3JEZXF1ZXVlQnVmZmVyVGltZW91dCA9IG1zMm5zKDEpOyAvLyAxIG1zZWMKIAogICAgIE11dGV4IG1NdXRleDsKIApAQCAtMjczLDYgKzI3Niw4IEBACiAgICAgc2l6ZV90IG1BY3F1aXJlZElucHV0QnVmZmVyczsKIAogICAgIFN0cmluZzggbUNvbnN1bWVyTmFtZTsKKworICAgIGNvbnN0IGJvb2wgbVVzZUhhbEJ1Zk1hbmFnZXI7CiB9OwogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0Rpc3RvcnRpb25NYXBwZXIuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9EaXN0b3J0aW9uTWFwcGVyLmNwcAppbmRleCA0ZGFmZWZkLi5hZTdhZjhlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0Rpc3RvcnRpb25NYXBwZXIuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvRGlzdG9ydGlvbk1hcHBlci5jcHAKQEAgLTMxMiw4ICszMTIsOCBAQAogICAgICAgICBpbnQzMl90IGNvb3Jkc1s0XSA9IHsKICAgICAgICAgICAgIHJlY3RzW2ldLAogICAgICAgICAgICAgcmVjdHNbaSArIDFdLAotICAgICAgICAgICAgcmVjdHNbaV0gKyByZWN0c1tpICsgMl0sCi0gICAgICAgICAgICByZWN0c1tpICsgMV0gKyByZWN0c1tpICsgM10KKyAgICAgICAgICAgIHJlY3RzW2ldICsgcmVjdHNbaSArIDJdIC0gMSwKKyAgICAgICAgICAgIHJlY3RzW2kgKyAxXSArIHJlY3RzW2kgKyAzXSAtIDEKICAgICAgICAgfTsKIAogICAgICAgICBtYXBSYXdUb0NvcnJlY3RlZChjb29yZHMsIDIsIGNsYW1wLCBzaW1wbGUpOwpAQCAtMzIxLDggKzMyMSw4IEBACiAgICAgICAgIC8vIE1hcCBiYWNrIHRvIChsLCB0LCB3aWR0aCwgaGVpZ2h0KQogICAgICAgICByZWN0c1tpXSA9IGNvb3Jkc1swXTsKICAgICAgICAgcmVjdHNbaSArIDFdID0gY29vcmRzWzFdOwotICAgICAgICByZWN0c1tpICsgMl0gPSBjb29yZHNbMl0gLSBjb29yZHNbMF07Ci0gICAgICAgIHJlY3RzW2kgKyAzXSA9IGNvb3Jkc1szXSAtIGNvb3Jkc1sxXTsKKyAgICAgICAgcmVjdHNbaSArIDJdID0gY29vcmRzWzJdIC0gY29vcmRzWzBdICsgMTsKKyAgICAgICAgcmVjdHNbaSArIDNdID0gY29vcmRzWzNdIC0gY29vcmRzWzFdICsgMTsKICAgICB9CiAKICAgICByZXR1cm4gT0s7CkBAIC00MDAsOCArNDAwLDggQEAKICAgICAgICAgaW50MzJfdCBjb29yZHNbNF0gPSB7CiAgICAgICAgICAgICByZWN0c1tpXSwKICAgICAgICAgICAgIHJlY3RzW2kgKyAxXSwKLSAgICAgICAgICAgIHJlY3RzW2ldICsgcmVjdHNbaSArIDJdLAotICAgICAgICAgICAgcmVjdHNbaSArIDFdICsgcmVjdHNbaSArIDNdCisgICAgICAgICAgICByZWN0c1tpXSArIHJlY3RzW2kgKyAyXSAtIDEsCisgICAgICAgICAgICByZWN0c1tpICsgMV0gKyByZWN0c1tpICsgM10gLSAxCiAgICAgICAgIH07CiAKICAgICAgICAgbWFwQ29ycmVjdGVkVG9SYXcoY29vcmRzLCAyLCBjbGFtcCwgc2ltcGxlKTsKQEAgLTQwOSw4ICs0MDksOCBAQAogICAgICAgICAvLyBNYXAgYmFjayB0byAobCwgdCwgd2lkdGgsIGhlaWdodCkKICAgICAgICAgcmVjdHNbaV0gPSBjb29yZHNbMF07CiAgICAgICAgIHJlY3RzW2kgKyAxXSA9IGNvb3Jkc1sxXTsKLSAgICAgICAgcmVjdHNbaSArIDJdID0gY29vcmRzWzJdIC0gY29vcmRzWzBdOwotICAgICAgICByZWN0c1tpICsgM10gPSBjb29yZHNbM10gLSBjb29yZHNbMV07CisgICAgICAgIHJlY3RzW2kgKyAyXSA9IGNvb3Jkc1syXSAtIGNvb3Jkc1swXSArIDE7CisgICAgICAgIHJlY3RzW2kgKyAzXSA9IGNvb3Jkc1szXSAtIGNvb3Jkc1sxXSArIDE7CiAgICAgfQogCiAgICAgcmV0dXJuIE9LOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9BaWRsQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvQWlkbENhbWVyYURldmljZUNhbGxiYWNrcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTVlNTAyNAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvQWlkbENhbWVyYURldmljZUNhbGxiYWNrcy5jcHAKQEAgLTAsMCArMSwyMDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2luY2x1ZGUgPGhhcmR3YXJlL2NhbWVyYS5oPgorCisjaW5jbHVkZSA8aGlkbC9BaWRsQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzLmg+CisjaW5jbHVkZSA8aGlkbC9Db252ZXJ0Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBmcmFtZXdvcmtzIHsKK25hbWVzcGFjZSBjYW1lcmFzZXJ2aWNlIHsKK25hbWVzcGFjZSBkZXZpY2UgeworbmFtZXNwYWNlIFYyXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKwordXNpbmcgaGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgSENhcHR1cmVSZXN1bHRFeHRyYXMgPSBhbmRyb2lkOjpmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OkNhcHR1cmVSZXN1bHRFeHRyYXM7Cit1c2luZyBIUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbyA9IGFuZHJvaWQ6OmZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6UGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbzsKK3VzaW5nIEhDYW1lcmFNZXRhZGF0YSA9IGFuZHJvaWQ6OmZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6Q2FtZXJhTWV0YWRhdGE7CisKK2NvbnN0IGNoYXIgKkgyQkNhbWVyYURldmljZUNhbGxiYWNrczo6a1Jlc3VsdEtleSA9ICJDYXB0dXJlUmVzdWx0IjsKKworSDJCQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpIMkJDYW1lcmFEZXZpY2VDYWxsYmFja3MoY29uc3Qgc3A8SGFsSW50ZXJmYWNlPiYgYmFzZSkgOiBDQmFzZShiYXNlKSB7IH0KKworYm9vbCBIMkJDYW1lcmFEZXZpY2VDYWxsYmFja3M6OmluaXRpYWxpemVMb29wZXIoKSB7CisgICAgbUNiTG9vcGVyID0gbmV3IEFMb29wZXI7CisgICAgbUNiTG9vcGVyLT5zZXROYW1lKCJjcy1sb29wZXIiKTsKKyAgICBzdGF0dXNfdCBlcnIgPSBtQ2JMb29wZXItPnN0YXJ0KC8qcnVuT25DYWxsaW5nVGhyZWFkKi8gZmFsc2UsIC8qY2FuQ2FsbEphdmEqLyBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBSSU9SSVRZX0RFRkFVTFQpOworICAgIGlmIChlcnIgIT1PSykgeworICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIHN0YXJ0IGNhbWVyYSBkZXZpY2UgY2FsbGJhY2sgbG9vcGVyIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgbUhhbmRsZXIgPSBuZXcgQ2FsbGJhY2tIYW5kbGVyKHRoaXMpOworICAgIG1DYkxvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKG1IYW5kbGVyKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworSDJCQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjp+SDJCQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzKCkgeworICAgIGlmIChtQ2JMb29wZXIgIT0gbnVsbHB0cikgeworICAgICAgICBpZiAobUhhbmRsZXIgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgbUNiTG9vcGVyLT51bnJlZ2lzdGVySGFuZGxlcihtSGFuZGxlci0+aWQoKSk7CisgICAgICAgIH0KKyAgICAgICAgbUNiTG9vcGVyLT5zdG9wKCk7CisgICAgfQorICAgIG1DYkxvb3Blci5jbGVhcigpOworICAgIG1IYW5kbGVyLmNsZWFyKCk7Cit9CisKK2JpbmRlcjo6U3RhdHVzIEgyQkNhbWVyYURldmljZUNhbGxiYWNrczo6b25EZXZpY2VFcnJvcigKKyAgICBpbnQzMl90IGVycm9yQ29kZSwgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzKSB7CisgICAgdXNpbmcgaGFyZHdhcmU6OmNhbWVyYXNlcnZpY2U6OnV0aWxzOjpjb252ZXJzaW9uOjpjb252ZXJ0VG9IaWRsOworICAgIEhDYXB0dXJlUmVzdWx0RXh0cmFzIGhDYXB0dXJlUmVzdWx0RXh0cmFzID0gY29udmVydFRvSGlkbChyZXN1bHRFeHRyYXMpOworICAgIGF1dG8gcmV0ID0gbUJhc2UtPm9uRGV2aWNlRXJyb3IoY29udmVydFRvSGlkbChlcnJvckNvZGUpLCBoQ2FwdHVyZVJlc3VsdEV4dHJhcyk7CisgICAgaWYgKCFyZXQuaXNPaygpKSB7CisgICAgICAgIEFMT0dFKCIlcyBPbkRldmljZUVycm9yIGNhbGxiYWNrIGZhaWxlZCBkdWUgdG8gJXMiLF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgcmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgfQorICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKK30KKworYmluZGVyOjpTdGF0dXMgSDJCQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpvbkRldmljZUlkbGUoKSB7CisgICAgYXV0byByZXQgPSBtQmFzZS0+b25EZXZpY2VJZGxlKCk7CisgICAgaWYgKCFyZXQuaXNPaygpKSB7CisgICAgICAgICAgQUxPR0UoIiVzIE9uRGV2aWNlSWRsZSBjYWxsYmFjayBmYWlsZWQgZHVlIHRvICVzIixfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgcmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgfQorICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKK30KKworYmluZGVyOjpTdGF0dXMgSDJCQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpvbkNhcHR1cmVTdGFydGVkKAorICAgIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcywgaW50NjRfdCB0aW1lc3RhbXApIHsKKyAgICB1c2luZyBoYXJkd2FyZTo6Y2FtZXJhc2VydmljZTo6dXRpbHM6OmNvbnZlcnNpb246OmNvbnZlcnRUb0hpZGw7CisgICAgSENhcHR1cmVSZXN1bHRFeHRyYXMgaENhcHR1cmVSZXN1bHRFeHRyYXMgPSBjb252ZXJ0VG9IaWRsKHJlc3VsdEV4dHJhcyk7CisgICAgYXV0byByZXQgPSBtQmFzZS0+b25DYXB0dXJlU3RhcnRlZChoQ2FwdHVyZVJlc3VsdEV4dHJhcywgdGltZXN0YW1wKTsKKyAgICBpZiAoIXJldC5pc09rKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzIE9uQ2FwdHVyZUNhbGxiYWNrIGZhaWxlZCBkdWUgdG8gJXMiLF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgcmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgfQorICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKK30KKwordm9pZCBIMkJDYW1lcmFEZXZpY2VDYWxsYmFja3M6OmNvbnZlcnRSZXN1bHRNZXRhZGF0YVRvSGlkbChjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCAqcmF3TWV0YWRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZtcVNpemVPck1ldGFkYXRhICpoUmVzdWx0TWV0YWRhdGEpIHsKKyAgICAvLyBGaXJzdCB0cnkgd3JpdGluZyB0byBmbXEuCisgICAgc2l6ZV90IG1ldGFkYXRhX3NpemUgPSBnZXRfY2FtZXJhX21ldGFkYXRhX3NpemUocmF3TWV0YWRhdGEpOworICAgIGlmICgobWV0YWRhdGFfc2l6ZSA+IDApICYmCisgICAgICAgIChtQ2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWUtPmF2YWlsYWJsZVRvV3JpdGUoKSA+IDApKSB7CisgICAgICAgIGlmIChtQ2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWUtPndyaXRlKCh1aW50OF90ICopcmF3TWV0YWRhdGEsIG1ldGFkYXRhX3NpemUpKSB7CisgICAgICAgICAgICBoUmVzdWx0TWV0YWRhdGEtPmZtcU1ldGFkYXRhU2l6ZShtZXRhZGF0YV9zaXplKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dXKCIlcyBDb3VsZG4ndCB1c2UgZm1xLCBmYWxsaW5nIGJhY2sgdG8gaHdiaW5kZXIiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgSENhbWVyYU1ldGFkYXRhIG1ldGFkYXRhOworICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYXNlcnZpY2U6OnV0aWxzOjpjb252ZXJzaW9uOjpjb252ZXJ0VG9IaWRsKHJhd01ldGFkYXRhLCAmbWV0YWRhdGEpOworICAgICAgICAgICAgaFJlc3VsdE1ldGFkYXRhLT5tZXRhZGF0YShzdGQ6Om1vdmUobWV0YWRhdGEpKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBIMkJDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkNhbGxiYWNrSGFuZGxlcjo6b25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBzcDxSZWZCYXNlPiBvYmogPSBudWxscHRyOworICAgIHNwPFJlc3VsdFdyYXBwZXI+IHJlc3VsdFdyYXBwZXIgPSBudWxscHRyOworICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKKyAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7CisgICAgICAgIGNhc2Uga1doYXRSZXN1bHRSZWNlaXZlZDoKKyAgICAgICAgICAgIGZvdW5kID0gbXNnLT5maW5kT2JqZWN0KGtSZXN1bHRLZXksICZvYmopOworICAgICAgICAgICAgaWYgKCFmb3VuZCB8fCBvYmogPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIEFMT0dFKCJDYW5ub3QgZmluZCByZXN1bHQgb2JqZWN0IGluIGNhbGxiYWNrIG1lc3NhZ2UiKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXN1bHRXcmFwcGVyID0gc3RhdGljX2Nhc3Q8UmVzdWx0V3JhcHBlciAqPihvYmouZ2V0KCkpOworICAgICAgICAgICAgcHJvY2Vzc1Jlc3VsdE1lc3NhZ2UocmVzdWx0V3JhcHBlcik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dFKCJVbmtub3duIGNhbGxiYWNrIHNlbnQiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm47Cit9CisKK3ZvaWQgSDJCQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpDYWxsYmFja0hhbmRsZXI6OnByb2Nlc3NSZXN1bHRNZXNzYWdlKAorICAgIHNwPFJlc3VsdFdyYXBwZXI+ICZyZXN1bHRXcmFwcGVyKSB7CisgICAgc3A8SDJCQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzPiBjb252ZXJ0ZXIgPSBtQ29udmVydGVyLnByb21vdGUoKTsKKyAgICBpZiAoY29udmVydGVyID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIkNhbGxiYWNrIHdyYXBwZXIgaGFzIGRpZWQsIHJlc3VsdCBjYWxsYmFjayBjYW5ub3QgYmUgbWFkZSIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIENhbWVyYU1ldGFkYXRhTmF0aXZlICZyZXN1bHQgPSByZXN1bHRXcmFwcGVyLT5tUmVzdWx0OworICAgIGF1dG8gcmVzdWx0RXh0cmFzID0gcmVzdWx0V3JhcHBlci0+bVJlc3VsdEV4dHJhczsKKyAgICBhdXRvICZwaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvcyA9IHJlc3VsdFdyYXBwZXItPm1QaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvczsKKyAgICBIQ2FwdHVyZVJlc3VsdEV4dHJhcyBoUmVzdWx0RXh0cmFzID0KKyAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmFzZXJ2aWNlOjp1dGlsczo6Y29udmVyc2lvbjo6Y29udmVydFRvSGlkbChyZXN1bHRFeHRyYXMpOworICAgIGhpZGxfdmVjPEhQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvPiBoUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mb3MgPQorICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYXNlcnZpY2U6OnV0aWxzOjpjb252ZXJzaW9uOjpjb252ZXJ0VG9IaWRsKAorICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvcywgY29udmVydGVyLT5tQ2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWUpOworCisgICAgLy8gQ29udmVydCBNZXRhZGF0YSBpbnRvIEhDYW1lcmFNZXRhZGF0YTsKKyAgICBGbXFTaXplT3JNZXRhZGF0YSBoUmVzdWx0OworICAgIGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90ICpyYXdNZXRhZGF0YSA9IHJlc3VsdC5nZXRBbmRMb2NrKCk7CisgICAgY29udmVydGVyLT5jb252ZXJ0UmVzdWx0TWV0YWRhdGFUb0hpZGwocmF3TWV0YWRhdGEsICZoUmVzdWx0KTsKKyAgICByZXN1bHQudW5sb2NrKHJhd01ldGFkYXRhKTsKKyAgICBhdXRvIHJldCA9IGNvbnZlcnRlci0+bUJhc2UtPm9uUmVzdWx0UmVjZWl2ZWQoaFJlc3VsdCwgaFJlc3VsdEV4dHJhcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm9zKTsKKyAgICBpZiAoIXJldC5pc09rKCkpIHsKKyAgICAgICAgICBBTE9HRSgiJXMgT25SZXN1bHRSZWNlaXZlZCBjYWxsYmFjayBmYWlsZWQgZHVlIHRvICVzIixfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgcmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgfQorfQorCitiaW5kZXI6OlN0YXR1cyBIMkJDYW1lcmFEZXZpY2VDYWxsYmFja3M6Om9uUmVzdWx0UmVjZWl2ZWQoCisgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGFOYXRpdmUmIHJlc3VsdCwKKyAgICBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMsCisgICAgY29uc3QgOjpzdGQ6OnZlY3RvcjxQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvPiYgcGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mb3MpIHsKKyAgICAvLyBXcmFwIENhbWVyYU1ldGFkYXRhLCByZXN1bHRFeHRyYXMgYW5kIHBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm9zIGluIG9uCisgICAgLy8gc3A8UmVmQmFzZT4tYWJsZSBzdHJ1Y3R1cmUgYW5kIHBvc3QgaXQuCisgICAgc3A8UmVzdWx0V3JhcHBlcj4gcmVzdWx0V3JhcHBlciA9IG5ldyBSZXN1bHRXcmFwcGVyKGNvbnN0X2Nhc3Q8Q2FtZXJhTWV0YWRhdGFOYXRpdmUgJj4ocmVzdWx0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0RXh0cmFzLCBwaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvcyk7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFJlc3VsdFJlY2VpdmVkLCBtSGFuZGxlcik7CisgICAgbXNnLT5zZXRPYmplY3Qoa1Jlc3VsdEtleSwgcmVzdWx0V3JhcHBlcik7CisgICAgbXNnLT5wb3N0KCk7CisgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpvaygpOworfQorCitiaW5kZXI6OlN0YXR1cyBIMkJDYW1lcmFEZXZpY2VDYWxsYmFja3M6Om9uUHJlcGFyZWQoaW50MzJfdCBzdHJlYW1JZCkgeworICAgIC8vIG5vdCBpbXBsZW1lbnRlZAorICAgIC8vIFRvIHNpbGVuY2UgV3VudXNlZC1wYXJhbWV0ZXIuCisgICAgKHZvaWQpIHN0cmVhbUlkOworICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKK30KKworYmluZGVyOjpTdGF0dXMgSDJCQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpvblJlcGVhdGluZ1JlcXVlc3RFcnJvcigKKyAgICBpbnQ2NF90IGxhc3RGcmFtZU51bWJlciwKKyAgICBpbnQzMl90IHJlcGVhdGluZ1JlcXVlc3RJZCkgeworICAgIGF1dG8gcmV0ID0KKyAgICAgICAgbUJhc2UtPm9uUmVwZWF0aW5nUmVxdWVzdEVycm9yKGxhc3RGcmFtZU51bWJlciwgcmVwZWF0aW5nUmVxdWVzdElkKTsKKyAgICBpZiAoIXJldC5pc09rKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzIE9uUmVwZWF0aW5nUmVxdWVzdEVyb3IgY2FsbGJhY2sgZmFpbGVkIGR1ZSB0byAlcyIsX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICByZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICB9CisgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpvaygpOworfQorCitiaW5kZXI6OlN0YXR1cyBIMkJDYW1lcmFEZXZpY2VDYWxsYmFja3M6Om9uUmVxdWVzdFF1ZXVlRW1wdHkoKSB7CisgICAgLy8gbm90IGltcGxlbWVudGVkCisgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpvaygpOworfQorCit9IC8vIGltcGxlbWVudGF0aW9uCit9IC8vIFYyXzAKK30gLy8gZGV2aWNlCit9IC8vIGNhbWVyYXNlcnZpY2UKK30gLy8gZnJhbWV3b3JrcworfSAvLyBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0FpZGxDYW1lcmFEZXZpY2VDYWxsYmFja3MuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvQWlkbENhbWVyYURldmljZUNhbGxiYWNrcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiZjUyMGEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0FpZGxDYW1lcmFEZXZpY2VDYWxsYmFja3MuaApAQCAtMCwwICsxLDEzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9GUkFNRVdPUktTX0FJRExfQ0FNRVJBREVWSUNFQ0FMTEJBQ0tTX0gKKyNkZWZpbmUgQU5EUk9JRF9GUkFNRVdPUktTX0FJRExfQ0FNRVJBREVWSUNFQ0FMTEJBQ0tTX0gKKworI2luY2x1ZGUgPG11dGV4PgorI2luY2x1ZGUgPHRocmVhZD4KKworI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL2NvbW1vbi8yLjAvdHlwZXMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2ZyYW1ld29ya3MvY2FtZXJhc2VydmljZS9zZXJ2aWNlLzIuMC90eXBlcy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL2RldmljZS8yLjAvSUNhbWVyYURldmljZUNhbGxiYWNrLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9mcmFtZXdvcmtzL2NhbWVyYXNlcnZpY2UvZGV2aWNlLzIuMC90eXBlcy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9CbkNhbWVyYURldmljZUNhbGxiYWNrcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhhbmRsZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8Zm1xL01lc3NhZ2VRdWV1ZS5oPgorI2luY2x1ZGUgPGhpZGwvTVFEZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8aGlkbC9TdGF0dXMuaD4KKyNpbmNsdWRlIDxDYW1lcmFTZXJ2aWNlLmg+CisjaW5jbHVkZSA8aGlkbC9DYW1lcmFIeWJyaWRJbnRlcmZhY2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGZyYW1ld29ya3MgeworbmFtZXNwYWNlIGNhbWVyYXNlcnZpY2UgeworbmFtZXNwYWNlIGRldmljZSB7CituYW1lc3BhY2UgVjJfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCit1c2luZyBjYW1lcmFoeWJyaWQ6OkgyQkNvbnZlcnRlcjsKK3VzaW5nIEhDYW1lcmFEZXZpY2VDYWxsYmFjayA9IGNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6SUNhbWVyYURldmljZUNhbGxiYWNrOwordXNpbmcgSFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8gPSBjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OlBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm87Cit1c2luZyBhbmRyb2lkOjpmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OkZtcVNpemVPck1ldGFkYXRhOworCit1c2luZyBoYXJkd2FyZTo6Y2FtZXJhMjo6Qm5DYW1lcmFEZXZpY2VDYWxsYmFja3M7Cit1c2luZyBoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrczsKK3VzaW5nIGhhcmR3YXJlOjpjYW1lcmEyOjppbXBsOjpDYXB0dXJlUmVzdWx0RXh0cmFzOwordXNpbmcgaGFyZHdhcmU6OmNhbWVyYTI6OmltcGw6OkNhbWVyYU1ldGFkYXRhTmF0aXZlOwordXNpbmcgaGFyZHdhcmU6OmNhbWVyYTI6OmltcGw6OlBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm87Cit1c2luZyBoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZTsKK3VzaW5nIGhhcmR3YXJlOjpNZXNzYWdlUXVldWU7Cit1c2luZyBDYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZSA9IE1lc3NhZ2VRdWV1ZTx1aW50OF90LCBrU3luY2hyb25pemVkUmVhZFdyaXRlPjsKKworc3RydWN0IEgyQkNhbWVyYURldmljZUNhbGxiYWNrcyA6CisgICAgcHVibGljIEgyQkNvbnZlcnRlcjxIQ2FtZXJhRGV2aWNlQ2FsbGJhY2ssIElDYW1lcmFEZXZpY2VDYWxsYmFja3MsIEJuQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzPiB7CisgICAgSDJCQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzKGNvbnN0IHNwPEhhbEludGVyZmFjZT4mIGJhc2UpOworCisgICAgfkgyQkNhbWVyYURldmljZUNhbGxiYWNrcygpOworCisgICAgYm9vbCBpbml0aWFsaXplTG9vcGVyKCk7CisKKyAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzIG9uRGV2aWNlRXJyb3IoaW50MzJfdCBlcnJvckNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcykgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzIG9uRGV2aWNlSWRsZSgpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBiaW5kZXI6OlN0YXR1cyBvbkNhcHR1cmVTdGFydGVkKGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lc3RhbXApIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBiaW5kZXI6OlN0YXR1cyBvblJlc3VsdFJlY2VpdmVkKAorICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YU5hdGl2ZSYgcmVzdWx0LCBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8+JiBwaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvcykgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzIG9uUHJlcGFyZWQoaW50MzJfdCBzdHJlYW1JZCkgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzIG9uUmVwZWF0aW5nUmVxdWVzdEVycm9yKGludDY0X3QgbGFzdEZyYW1lTnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCByZXBlYXRpbmdSZXF1ZXN0SWQpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBiaW5kZXI6OlN0YXR1cyBvblJlcXVlc3RRdWV1ZUVtcHR5KCkgb3ZlcnJpZGU7CisKKyAgICB2b2lkIHNldENhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlKHN0ZDo6c2hhcmVkX3B0cjxDYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZT4gbWV0YWRhdGFRdWV1ZSkgeworICAgICAgICBtQ2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWUgPSBtZXRhZGF0YVF1ZXVlOworICAgIH0KKworIHByaXZhdGU6CisgICAgLy8gV3JhcHBlciBzdHJ1Y3Qgc28gdGhhdCBwYXJhbWV0ZXJzIHRvIG9uUmVzdWx0UmVjZWl2ZWQgY2FsbGJhY2sgbWF5IGJlCisgICAgLy8gc2VudCB0aHJvdWdoIGFuIEFNZXNzYWdlLgorICAgIHN0cnVjdCBSZXN1bHRXcmFwcGVyIDogcHVibGljIFJlZkJhc2UgeworICAgICAgICBDYW1lcmFNZXRhZGF0YU5hdGl2ZSBtUmVzdWx0OworICAgICAgICBDYXB0dXJlUmVzdWx0RXh0cmFzIG1SZXN1bHRFeHRyYXM7CisgICAgICAgIHN0ZDo6dmVjdG9yPFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8+IG1QaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvczsKKyAgICAgICAgUmVzdWx0V3JhcHBlcihDYW1lcmFNZXRhZGF0YU5hdGl2ZSAmcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMgcmVzdWx0RXh0cmFzLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8+ICZwaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvcykgOgorICAgICAgLy8gVE9ETzogbWFrZSB0aGlzIHN0ZDo6bW92YWJsZQorICAgICAgbVJlc3VsdChyZXN1bHQpLCBtUmVzdWx0RXh0cmFzKHJlc3VsdEV4dHJhcyksIG1QaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvcyhwaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvcykgeyB9CisgICAgfTsKKworICAgIHN0cnVjdCBDYWxsYmFja0hhbmRsZXIgOiBwdWJsaWMgQUhhbmRsZXIgeworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICB2b2lkIG9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSBvdmVycmlkZTsKKyAgICAgICAgICAgIENhbGxiYWNrSGFuZGxlcihIMkJDYW1lcmFEZXZpY2VDYWxsYmFja3MgKmNvbnZlcnRlcikgOiBtQ29udmVydGVyKGNvbnZlcnRlcikgeyB9CisgICAgICAgIHByaXZhdGU6CisgICAgICAgICAgICB2b2lkIHByb2Nlc3NSZXN1bHRNZXNzYWdlKHNwPFJlc3VsdFdyYXBwZXI+ICZyZXN1bHRXcmFwcGVyKTsKKyAgICAgICAgICAgIHdwPEgyQkNhbWVyYURldmljZUNhbGxiYWNrcz4gbUNvbnZlcnRlciA9IG51bGxwdHI7CisgICAgICAgICAgICBNdXRleCBtTWV0YWRhdGFRdWV1ZUxvY2s7CisgICAgfTsKKworICAgIHZvaWQgY29udmVydFJlc3VsdE1ldGFkYXRhVG9IaWRsKGNvbnN0IGNhbWVyYV9tZXRhZGF0YSAqcmF3TWV0YWRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm1xU2l6ZU9yTWV0YWRhdGEgKnJlc3VsdE1ldGFkYXRhKTsKKyAgICBlbnVtIHsKKyAgICAgICAga1doYXRSZXN1bHRSZWNlaXZlZCwKKyAgICB9OworCisgICAgc3RhdGljIGNvbnN0IGNoYXIgKmtSZXN1bHRLZXk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWU+IG1DYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZSA9IG51bGxwdHI7CisgICAgc3A8Q2FsbGJhY2tIYW5kbGVyPiBtSGFuZGxlciA9IG51bGxwdHI7CisgICAgc3A8QUxvb3Blcj4gbUNiTG9vcGVyID0gbnVsbHB0cjsKK307CisKK30gLy8gaW1wbGVtZW50YXRpb24KK30gLy8gVjJfMAorfSAvLyBkZXZpY2UKK30gLy8gY2FtZXJhc2VydmljZQorfSAvLyBmcmFtZXdvcmtzCit9IC8vIGFuZHJvaWQKKyNlbmRpZiAvLyBBTkRST0lEX0ZSQU1FV09SS1NfQUlETF9DQU1FUkFERVZJQ0VDQUxMQkFDS1NfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9BaWRsQ2FtZXJhU2VydmljZUxpc3RlbmVyLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvQWlkbENhbWVyYVNlcnZpY2VMaXN0ZW5lci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTEwZWY4ZQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvQWlkbENhbWVyYVNlcnZpY2VMaXN0ZW5lci5jcHAKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxoaWRsL0FpZGxDYW1lcmFTZXJ2aWNlTGlzdGVuZXIuaD4KKyNpbmNsdWRlIDxoaWRsL0NvbnZlcnQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGZyYW1ld29ya3MgeworbmFtZXNwYWNlIGNhbWVyYXNlcnZpY2UgeworbmFtZXNwYWNlIHNlcnZpY2UgeworbmFtZXNwYWNlIFYyXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKwordXNpbmcgaGFyZHdhcmU6OmNhbWVyYXNlcnZpY2U6OnV0aWxzOjpjb252ZXJzaW9uOjpjb252ZXJ0VG9IaWRsQ2FtZXJhRGV2aWNlU3RhdHVzOworCitiaW5kZXI6OlN0YXR1cyBIMkJDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6Om9uU3RhdHVzQ2hhbmdlZCgKKyAgICBpbnQzMl90IHN0YXR1cywgY29uc3QgOjphbmRyb2lkOjpTdHJpbmcxNiYgY2FtZXJhSWQpIHsKKyAgSENhbWVyYURldmljZVN0YXR1cyBoQ2FtZXJhRGV2aWNlU3RhdHVzID0gY29udmVydFRvSGlkbENhbWVyYURldmljZVN0YXR1cyhzdGF0dXMpOworICBDYW1lcmFTdGF0dXNBbmRJZCBjYW1lcmFTdGF0dXNBbmRJZDsKKyAgY2FtZXJhU3RhdHVzQW5kSWQuZGV2aWNlU3RhdHVzID0gaENhbWVyYURldmljZVN0YXR1czsKKyAgY2FtZXJhU3RhdHVzQW5kSWQuY2FtZXJhSWQgPSBTdHJpbmc4KGNhbWVyYUlkKS5zdHJpbmcoKTsKKyAgYXV0byByZXQgPSBtQmFzZS0+b25TdGF0dXNDaGFuZ2VkKGNhbWVyYVN0YXR1c0FuZElkKTsKKyAgaWYgKCFyZXQuaXNPaygpKSB7CisgICAgICBBTE9HRSgiJXMgT25TdGF0dXNDaGFuZ2VkIGNhbGxiYWNrIGZhaWxlZCBkdWUgdG8gJXMiLF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgIHJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICB9CisgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKK30KKworOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBIMkJDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6Om9uVG9yY2hTdGF0dXNDaGFuZ2VkKAorICAgIGludDMyX3QsIGNvbnN0IDo6YW5kcm9pZDo6U3RyaW5nMTYmKSB7CisgIC8vIFdlIGRvbid0IGltcGxlbWVudCBvblRvcmNoU3RhdHVzQ2hhbmdlZAorICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7Cit9CisKK30gLy8gaW1wbGVtZW50YXRpb24KK30gLy8gVjJfMAorfSAvLyBjb21tb24KK30gLy8gY2FtZXJhc2VydmljZQorfSAvLyBmcmFtZXdvcmtzCit9IC8vIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvQWlkbENhbWVyYVNlcnZpY2VMaXN0ZW5lci5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9BaWRsQ2FtZXJhU2VydmljZUxpc3RlbmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2E5MTQzZAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvQWlkbENhbWVyYVNlcnZpY2VMaXN0ZW5lci5oCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8bXV0ZXg+CisjaW5jbHVkZSA8dGhyZWFkPgorCisjaW5jbHVkZSA8YW5kcm9pZC9mcmFtZXdvcmtzL2NhbWVyYXNlcnZpY2UvY29tbW9uLzIuMC90eXBlcy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL3NlcnZpY2UvMi4wL0lDYW1lcmFTZXJ2aWNlTGlzdGVuZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2ZyYW1ld29ya3MvY2FtZXJhc2VydmljZS9kZXZpY2UvMi4wL3R5cGVzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9CbkNhbWVyYVNlcnZpY2VMaXN0ZW5lci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvQnBDYW1lcmFTZXJ2aWNlTGlzdGVuZXIuaD4KKworI2luY2x1ZGUgPGhpZGwvU3RhdHVzLmg+CisjaW5jbHVkZSA8aGlkbC9DYW1lcmFIeWJyaWRJbnRlcmZhY2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGZyYW1ld29ya3MgeworbmFtZXNwYWNlIGNhbWVyYXNlcnZpY2UgeworbmFtZXNwYWNlIHNlcnZpY2UgeworbmFtZXNwYWNlIFYyXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKwordXNpbmcgaGFyZHdhcmU6OkJuQ2FtZXJhU2VydmljZUxpc3RlbmVyOwordXNpbmcgaGFyZHdhcmU6OkJwQ2FtZXJhU2VydmljZUxpc3RlbmVyOwordXNpbmcgY2FtZXJhaHlicmlkOjpIMkJDb252ZXJ0ZXI7Cit1c2luZyBIQ2FtZXJhRGV2aWNlU3RhdHVzID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6c2VydmljZTo6VjJfMDo6Q2FtZXJhRGV2aWNlU3RhdHVzOwordHlwZWRlZiBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpzZXJ2aWNlOjpWMl8wOjpJQ2FtZXJhU2VydmljZUxpc3RlbmVyIEhDYW1lcmFTZXJ2aWNlTGlzdGVuZXI7CisKK3N0cnVjdCBIMkJDYW1lcmFTZXJ2aWNlTGlzdGVuZXIgOgorICAgIHB1YmxpYyBIMkJDb252ZXJ0ZXI8SENhbWVyYVNlcnZpY2VMaXN0ZW5lciwgSUNhbWVyYVNlcnZpY2VMaXN0ZW5lciwgQm5DYW1lcmFTZXJ2aWNlTGlzdGVuZXI+IHsKKyAgICBIMkJDYW1lcmFTZXJ2aWNlTGlzdGVuZXIoY29uc3Qgc3A8SGFsSW50ZXJmYWNlPiYgYmFzZSkgOiBDQmFzZShiYXNlKSB7IH0KKworICAgIH5IMkJDYW1lcmFTZXJ2aWNlTGlzdGVuZXIoKSB7IH0KKworICAgIHZpcnR1YWwgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBvblN0YXR1c0NoYW5nZWQoaW50MzJfdCBzdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCA6OmFuZHJvaWQ6OlN0cmluZzE2JiBjYW1lcmFJZCkgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgb25Ub3JjaFN0YXR1c0NoYW5nZWQoCisgICAgICAgIGludDMyX3Qgc3RhdHVzLCBjb25zdCA6OmFuZHJvaWQ6OlN0cmluZzE2JiBjYW1lcmFJZCkgb3ZlcnJpZGU7Cit9OworCit9IC8vIGltcGxlbWVudGF0aW9uCit9IC8vIFYyXzAKK30gLy8gc2VydmljZQorfSAvLyBjYW1lcmFzZXJ2aWNlCit9IC8vIGZyYW1ld29ya3MKK30gLy8gYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9DYW1lcmFIeWJyaWRJbnRlcmZhY2UuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvQ2FtZXJhSHlicmlkSW50ZXJmYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFmMDExMgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvQ2FtZXJhSHlicmlkSW50ZXJmYWNlLmgKQEAgLTAsMCArMSwxMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQ0FNRVJBX0hZQlJJRElOVEVSRkFDRV9ICisjZGVmaW5lIEFORFJPSURfQ0FNRVJBX0hZQlJJRElOVEVSRkFDRV9ICisKKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8bXV0ZXg+CisKKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CisjaW5jbHVkZSA8aGlkbC9IaWRsU3VwcG9ydC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgY2FtZXJhaHlicmlkIHsKK3R5cGVkZWYgOjphbmRyb2lkOjpoaWRsOjpiYXNlOjpWMV8wOjpJQmFzZSBISW50ZXJmYWNlOworCit0ZW1wbGF0ZSA8CisgICAgICAgIHR5cGVuYW1lIEhJTlRFUkZBQ0UsCisgICAgICAgIHR5cGVuYW1lIElOVEVSRkFDRSwKKyAgICAgICAgdHlwZW5hbWUgQk5JTlRFUkZBQ0UgPgorY2xhc3MgSDJCQ29udmVydGVyIDogcHVibGljIEJOSU5URVJGQUNFIHsKK3B1YmxpYzoKKyAgICB0eXBlZGVmIEgyQkNvbnZlcnRlcjxISU5URVJGQUNFLCBJTlRFUkZBQ0UsIEJOSU5URVJGQUNFPiBDQmFzZTsgLy8gQ29udmVydGVyIEJhc2UKKyAgICB0eXBlZGVmIElOVEVSRkFDRSBCYXNlSW50ZXJmYWNlOworICAgIHR5cGVkZWYgSElOVEVSRkFDRSBIYWxJbnRlcmZhY2U7CisKKyAgICBIMkJDb252ZXJ0ZXIoY29uc3Qgc3A8SGFsSW50ZXJmYWNlPiYgYmFzZSkgOiBtQmFzZShiYXNlKSB7fQorICAgIHZpcnR1YWwgc3A8SGFsSW50ZXJmYWNlPiBnZXRIYWxJbnRlcmZhY2UoKSB7IHJldHVybiBtQmFzZTsgfQorICAgIHZpcnR1YWwgc3RhdHVzX3QgbGlua1RvRGVhdGgoCisgICAgICAgICAgICBjb25zdCBzcDxJQmluZGVyOjpEZWF0aFJlY2lwaWVudD4mIHJlY2lwaWVudCwKKyAgICAgICAgICAgIHZvaWQqIGNvb2tpZSA9IG51bGxwdHIsCisgICAgICAgICAgICB1aW50MzJfdCBmbGFncyA9IDApOworICAgIHZpcnR1YWwgc3RhdHVzX3QgdW5saW5rVG9EZWF0aCgKKyAgICAgICAgICAgIGNvbnN0IHdwPElCaW5kZXI6OkRlYXRoUmVjaXBpZW50PiYgcmVjaXBpZW50LAorICAgICAgICAgICAgdm9pZCogY29va2llID0gbnVsbHB0ciwKKyAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzID0gMCwKKyAgICAgICAgICAgIHdwPElCaW5kZXI6OkRlYXRoUmVjaXBpZW50Piogb3V0UmVjaXBpZW50ID0gbnVsbHB0cik7CisKK3Byb3RlY3RlZDoKKyAgICBzcDxIYWxJbnRlcmZhY2U+IG1CYXNlOworICAgIHN0cnVjdCBPYml0dWFyeSA6IHB1YmxpYyBoYXJkd2FyZTo6aGlkbF9kZWF0aF9yZWNpcGllbnQgeworICAgICAgICB3cDxJQmluZGVyOjpEZWF0aFJlY2lwaWVudD4gcmVjaXBpZW50OworICAgICAgICB2b2lkKiBjb29raWU7CisgICAgICAgIHVpbnQzMl90IGZsYWdzOworICAgICAgICB3cDxJQmluZGVyPiB3aG87CisgICAgICAgIE9iaXR1YXJ5KAorICAgICAgICAgICAgICAgIGNvbnN0IHdwPElCaW5kZXI6OkRlYXRoUmVjaXBpZW50PiYgciwKKyAgICAgICAgICAgICAgICB2b2lkKiBjLCB1aW50MzJfdCBmLAorICAgICAgICAgICAgICAgIGNvbnN0IHdwPElCaW5kZXI+JiB3KSA6CisgICAgICAgICAgICByZWNpcGllbnQociksIGNvb2tpZShjKSwgZmxhZ3MoZiksIHdobyh3KSB7CisgICAgICAgIH0KKyAgICAgICAgT2JpdHVhcnkoY29uc3QgT2JpdHVhcnkmIG8pIDoKKyAgICAgICAgICAgIHJlY2lwaWVudChvLnJlY2lwaWVudCksCisgICAgICAgICAgICBjb29raWUoby5jb29raWUpLAorICAgICAgICAgICAgZmxhZ3Moby5mbGFncyksCisgICAgICAgICAgICB3aG8oby53aG8pIHsKKyAgICAgICAgfQorICAgICAgICBPYml0dWFyeSYgb3BlcmF0b3I9KGNvbnN0IE9iaXR1YXJ5JiBvKSB7CisgICAgICAgICAgICByZWNpcGllbnQgPSBvLnJlY2lwaWVudDsKKyAgICAgICAgICAgIGNvb2tpZSA9IG8uY29va2llOworICAgICAgICAgICAgZmxhZ3MgPSBvLmZsYWdzOworICAgICAgICAgICAgd2hvID0gby53aG87CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKyAgICAgICAgdm9pZCBzZXJ2aWNlRGllZCh1aW50NjRfdCwgY29uc3Qgd3A8SEludGVyZmFjZT4mKSBvdmVycmlkZSB7CisgICAgICAgICAgICBzcDxJQmluZGVyOjpEZWF0aFJlY2lwaWVudD4gZHIgPSByZWNpcGllbnQucHJvbW90ZSgpOworICAgICAgICAgICAgaWYgKGRyICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBkci0+YmluZGVyRGllZCh3aG8pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKKyAgICBzdGQ6Om11dGV4IG1PYml0dWFyaWVzTG9jazsKKyAgICBzdGQ6OnZlY3RvcjxzcDxPYml0dWFyeT4gPiBtT2JpdHVhcmllczsKK307CisKK3RlbXBsYXRlIDwKKyAgICAgICAgdHlwZW5hbWUgSElOVEVSRkFDRSwKKyAgICAgICAgdHlwZW5hbWUgSU5URVJGQUNFLAorICAgICAgICB0eXBlbmFtZSBCTklOVEVSRkFDRT4KK3N0YXR1c190IEgyQkNvbnZlcnRlcjxISU5URVJGQUNFLCBJTlRFUkZBQ0UsIEJOSU5URVJGQUNFPjo6CisgICAgICAgIGxpbmtUb0RlYXRoKAorICAgICAgICBjb25zdCBzcDxJQmluZGVyOjpEZWF0aFJlY2lwaWVudD4mIHJlY2lwaWVudCwKKyAgICAgICAgdm9pZCogY29va2llLCB1aW50MzJfdCBmbGFncykgeworICAgIExPR19BTFdBWVNfRkFUQUxfSUYocmVjaXBpZW50ID09IG51bGxwdHIsCisgICAgICAgICAgICAibGlua1RvRGVhdGgoKTogcmVjaXBpZW50IG11c3QgYmUgbm9uLW51bGxwdHIiKTsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1PYml0dWFyaWVzTG9jayk7CisgICAgICAgIG1PYml0dWFyaWVzLnB1c2hfYmFjayhuZXcgT2JpdHVhcnkocmVjaXBpZW50LCBjb29raWUsIGZsYWdzLCB0aGlzKSk7CisgICAgICAgIGlmICghbUJhc2UtPmxpbmtUb0RlYXRoKG1PYml0dWFyaWVzLmJhY2soKSwgMCkpIHsKKyAgICAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKwordGVtcGxhdGUgPAorICAgICAgICB0eXBlbmFtZSBISU5URVJGQUNFLAorICAgICAgICB0eXBlbmFtZSBJTlRFUkZBQ0UsCisgICAgICAgIHR5cGVuYW1lIEJOSU5URVJGQUNFPgorc3RhdHVzX3QgSDJCQ29udmVydGVyPEhJTlRFUkZBQ0UsIElOVEVSRkFDRSwgQk5JTlRFUkZBQ0U+OjoKKyAgICAgICAgdW5saW5rVG9EZWF0aCgKKyAgICAgICAgY29uc3Qgd3A8SUJpbmRlcjo6RGVhdGhSZWNpcGllbnQ+JiByZWNpcGllbnQsCisgICAgICAgIHZvaWQqIGNvb2tpZSwgdWludDMyX3QgZmxhZ3MsCisgICAgICAgIHdwPElCaW5kZXI6OkRlYXRoUmVjaXBpZW50Piogb3V0UmVjaXBpZW50KSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU9iaXR1YXJpZXNMb2NrKTsKKyAgICBmb3IgKGF1dG8gaSA9IG1PYml0dWFyaWVzLmJlZ2luKCk7IGkgIT0gbU9iaXR1YXJpZXMuZW5kKCk7ICsraSkgeworICAgICAgICBpZiAoKGZsYWdzID0gKCppKS0+ZmxhZ3MpICYmICgKKyAgICAgICAgICAgICAgICAocmVjaXBpZW50ID09ICgqaSktPnJlY2lwaWVudCkgfHwKKyAgICAgICAgICAgICAgICAoKHJlY2lwaWVudCA9PSBudWxscHRyKSAmJiAoY29va2llID09ICgqaSktPmNvb2tpZSkpKSkgeworICAgICAgICAgICAgaWYgKG91dFJlY2lwaWVudCAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgKm91dFJlY2lwaWVudCA9ICgqaSktPnJlY2lwaWVudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJvb2wgc3VjY2VzcyA9IG1CYXNlLT51bmxpbmtUb0RlYXRoKCppKTsKKyAgICAgICAgICAgIG1PYml0dWFyaWVzLmVyYXNlKGkpOworICAgICAgICAgICAgcmV0dXJuIHN1Y2Nlc3MgPyBOT19FUlJPUiA6IERFQURfT0JKRUNUOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBOQU1FX05PVF9GT1VORDsKK30KKworfSAvLyBuYW1lc3BhY2UgY2FtZXJhaHlicmlkCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX0NBTUVSQV9IWUJSSURJTlRFUkZBQ0VfSAorCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0NvbnZlcnQuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9Db252ZXJ0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmVkNmY2Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9Db252ZXJ0LmNwcApAQCAtMCwwICsxLDI2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxoaWRsL0NvbnZlcnQuaD4KKyNpbmNsdWRlIDxndWkvYnVmZmVycXVldWUvMS4wL0gyQkdyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgorI2luY2x1ZGUgPGN1dGlscy9uYXRpdmVfaGFuZGxlLmg+CisjaW5jbHVkZSA8bWVkaWF1dGlscy9BSW1hZ2VSZWFkZXJVdGlscy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIGNhbWVyYXNlcnZpY2UgeworbmFtZXNwYWNlIHV0aWxzIHsKK25hbWVzcGFjZSBjb252ZXJzaW9uIHsKKwordXNpbmcgaGFyZHdhcmU6OmdyYXBoaWNzOjpidWZmZXJxdWV1ZTo6VjFfMDo6dXRpbHM6OkgyQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKK3VzaW5nIGFpbWc6OkFJbWFnZVJlYWRlcl9nZXRIR0JQRnJvbUhhbmRsZTsKKworLy8gTm90ZTogZXhpc3RpbmcgZGF0YSBpbiBkc3Qgd2lsbCBiZSBnb25lLiBDYWxsZXIgc3RpbGwgb3ducyB0aGUgbWVtb3J5IG9mIHNyYwordm9pZCBjb252ZXJ0VG9IaWRsKGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90ICpzcmMsIEhDYW1lcmFNZXRhZGF0YSogZHN0KSB7CisgICAgaWYgKHNyYyA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dXKCIlczphdHRlbXB0IHRvIGNvbnZlcnQgZW1wdHkgbWV0YWRhdGEgdG8gSGlkbCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc2l6ZV90IHNpemUgPSBnZXRfY2FtZXJhX21ldGFkYXRhX3NpemUoc3JjKTsKKyAgICBkc3QtPnNldFRvRXh0ZXJuYWwoKHVpbnQ4X3QgKikgc3JjLCBzaXplKTsKKyAgICByZXR1cm47Cit9CisKK2ludDMyX3QgY29udmVydEZyb21IaWRsKEhTdHJlYW1Db25maWd1cmF0aW9uTW9kZSBzdHJlYW1Db25maWd1cmF0aW9uTW9kZSkgeworICAgIHN3aXRjaCAoc3RyZWFtQ29uZmlndXJhdGlvbk1vZGUpIHsKKyAgICAgICAgY2FzZSBIU3RyZWFtQ29uZmlndXJhdGlvbk1vZGU6OkNPTlNUUkFJTkVEX0hJR0hfU1BFRURfTU9ERToKKyAgICAgICAgICAgIHJldHVybiBjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlVXNlcjo6Q09OU1RSQUlORURfSElHSF9TUEVFRF9NT0RFOworICAgICAgICBjYXNlIEhTdHJlYW1Db25maWd1cmF0aW9uTW9kZTo6Tk9STUFMX01PREU6CisgICAgICAgICAgICByZXR1cm4gY2FtZXJhMjo6SUNhbWVyYURldmljZVVzZXI6Ok5PUk1BTF9NT0RFOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgLy8gVE9ETzogRml4IHRoaXMKKyAgICAgICAgICAgIHJldHVybiBjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlVXNlcjo6VkVORE9SX01PREVfU1RBUlQ7CisgICAgfQorfQorCitpbnQzMl90IGNvbnZlcnRGcm9tSGlkbChIVGVtcGxhdGVJZCB0ZW1wbGF0ZUlkKSB7CisgICAgc3dpdGNoKHRlbXBsYXRlSWQpIHsKKyAgICAgICAgY2FzZSBIVGVtcGxhdGVJZDo6UFJFVklFVzoKKyAgICAgICAgICAgIHJldHVybiBjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlVXNlcjo6VEVNUExBVEVfUFJFVklFVzsKKyAgICAgICAgY2FzZSBIVGVtcGxhdGVJZDo6U1RJTExfQ0FQVFVSRToKKyAgICAgICAgICAgIHJldHVybiBjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlVXNlcjo6VEVNUExBVEVfU1RJTExfQ0FQVFVSRTsKKyAgICAgICAgY2FzZSBIVGVtcGxhdGVJZDo6UkVDT1JEOgorICAgICAgICAgICAgcmV0dXJuIGNhbWVyYTI6OklDYW1lcmFEZXZpY2VVc2VyOjpURU1QTEFURV9SRUNPUkQ7CisgICAgICAgIGNhc2UgSFRlbXBsYXRlSWQ6OlZJREVPX1NOQVBTSE9UOgorICAgICAgICAgICAgcmV0dXJuIGNhbWVyYTI6OklDYW1lcmFEZXZpY2VVc2VyOjpURU1QTEFURV9WSURFT19TTkFQU0hPVDsKKyAgICAgICAgY2FzZSBIVGVtcGxhdGVJZDo6WkVST19TSFVUVEVSX0xBRzoKKyAgICAgICAgICAgIHJldHVybiBjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlVXNlcjo6VEVNUExBVEVfWkVST19TSFVUVEVSX0xBRzsKKyAgICAgICAgY2FzZSBIVGVtcGxhdGVJZDo6TUFOVUFMOgorICAgICAgICAgICAgcmV0dXJuIGNhbWVyYTI6OklDYW1lcmFEZXZpY2VVc2VyOjpURU1QTEFURV9NQU5VQUw7CisgICAgfQorfQorCitpbnQgY29udmVydEZyb21IaWRsKEhPdXRwdXRDb25maWd1cmF0aW9uOjpSb3RhdGlvbiByb3RhdGlvbikgeworICAgIHN3aXRjaChyb3RhdGlvbikgeworICAgICAgICBjYXNlIEhPdXRwdXRDb25maWd1cmF0aW9uOjpSb3RhdGlvbjo6UjA6CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgY2FzZSBIT3V0cHV0Q29uZmlndXJhdGlvbjo6Um90YXRpb246OlI5MDoKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICBjYXNlIEhPdXRwdXRDb25maWd1cmF0aW9uOjpSb3RhdGlvbjo6UjE4MDoKKyAgICAgICAgICAgIHJldHVybiAyOworICAgICAgICBjYXNlIEhPdXRwdXRDb25maWd1cmF0aW9uOjpSb3RhdGlvbjo6UjI3MDoKKyAgICAgICAgICAgIHJldHVybiAzOworICAgIH0KK30KKworaGFyZHdhcmU6OmNhbWVyYTI6OnBhcmFtczo6T3V0cHV0Q29uZmlndXJhdGlvbiBjb252ZXJ0RnJvbUhpZGwoCisgICAgY29uc3QgSE91dHB1dENvbmZpZ3VyYXRpb24gJmhPdXRwdXRDb25maWd1cmF0aW9uKSB7CisgICAgc3RkOjp2ZWN0b3I8c3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4+IGlHQlBzOworICAgIGF1dG8gJndpbmRvd0hhbmRsZXMgPSBoT3V0cHV0Q29uZmlndXJhdGlvbi53aW5kb3dIYW5kbGVzOworICAgIGlHQlBzLnJlc2VydmUod2luZG93SGFuZGxlcy5zaXplKCkpOworICAgIGZvciAoYXV0byAmaGFuZGxlIDogd2luZG93SGFuZGxlcykgeworICAgICAgICBpR0JQcy5wdXNoX2JhY2sobmV3IEgyQkdyYXBoaWNCdWZmZXJQcm9kdWNlcihBSW1hZ2VSZWFkZXJfZ2V0SEdCUEZyb21IYW5kbGUoaGFuZGxlKSkpOworICAgIH0KKyAgICBoYXJkd2FyZTo6Y2FtZXJhMjo6cGFyYW1zOjpPdXRwdXRDb25maWd1cmF0aW9uIG91dHB1dENvbmZpZ3VyYXRpb24oCisgICAgICAgIGlHQlBzLCBjb252ZXJ0RnJvbUhpZGwoaE91dHB1dENvbmZpZ3VyYXRpb24ucm90YXRpb24pLAorICAgICAgICBoT3V0cHV0Q29uZmlndXJhdGlvbi53aW5kb3dHcm91cElkLCBPdXRwdXRDb25maWd1cmF0aW9uOjpTVVJGQUNFX1RZUEVfVU5LTk9XTiwgMCwgMCwKKyAgICAgICAgKHdpbmRvd0hhbmRsZXMuc2l6ZSgpID4gMSkpOworICAgIHJldHVybiBvdXRwdXRDb25maWd1cmF0aW9uOworfQorCisvLyBUaGUgY2FtZXJhIG1ldGFkYXRhIGhlcmUgaXMgY2xvbmVkLiBTaW5jZSB3ZSdyZSByZWFkaW5nIG1ldGFkYXRhIG92ZXIKKy8vIGh3YmluZGVyIHdlIHdvdWxkIG5lZWQgdG8gY2xvbmUgaXQgaW4gb3JkZXIgdG8gYXZvaWQgYWxpZ21lbnQgaXNzdWVzLgorYm9vbCBjb252ZXJ0RnJvbUhpZGwoY29uc3QgSENhbWVyYU1ldGFkYXRhICZzcmMsIENhbWVyYU1ldGFkYXRhICpkc3QpIHsKKyAgICBjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCAqYnVmZmVyID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCo+KHNyYy5kYXRhKCkpOworICAgIHNpemVfdCBleHBlY3RlZFNpemUgPSBzcmMuc2l6ZSgpOworICAgIGludCByZXMgPSB2YWxpZGF0ZV9jYW1lcmFfbWV0YWRhdGFfc3RydWN0dXJlKGJ1ZmZlciwgJmV4cGVjdGVkU2l6ZSk7CisgICAgaWYgKHJlcyA9PSBPSyB8fCByZXMgPT0gQ0FNRVJBX01FVEFEQVRBX1ZBTElEQVRJT05fU0hJRlRFRCkgeworICAgICAgICAqZHN0ID0gYnVmZmVyOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCIlczogTWFsZm9ybWVkIGNhbWVyYSBtZXRhZGF0YSByZWNlaXZlZCBmcm9tIEhBTCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK0hDYW1lcmFEZXZpY2VTdGF0dXMgY29udmVydFRvSGlkbENhbWVyYURldmljZVN0YXR1cyhpbnQzMl90IHN0YXR1cykgeworICAgIEhDYW1lcmFEZXZpY2VTdGF0dXMgZGV2aWNlU3RhdHVzID0gSENhbWVyYURldmljZVN0YXR1czo6U1RBVFVTX1VOS05PV047CisgICAgc3dpdGNoKHN0YXR1cykgeworICAgICAgICBjYXNlIGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpTVEFUVVNfTk9UX1BSRVNFTlQ6CisgICAgICAgICAgICBkZXZpY2VTdGF0dXMgPSBIQ2FtZXJhRGV2aWNlU3RhdHVzOjpTVEFUVVNfTk9UX1BSRVNFTlQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6U1RBVFVTX1BSRVNFTlQ6CisgICAgICAgICAgICBkZXZpY2VTdGF0dXMgPSBIQ2FtZXJhRGV2aWNlU3RhdHVzOjpTVEFUVVNfUFJFU0VOVDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpTVEFUVVNfRU5VTUVSQVRJTkc6CisgICAgICAgICAgICBkZXZpY2VTdGF0dXMgPSBIQ2FtZXJhRGV2aWNlU3RhdHVzOjpTVEFUVVNfRU5VTUVSQVRJTkc7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6U1RBVFVTX05PVF9BVkFJTEFCTEU6CisgICAgICAgICAgICBkZXZpY2VTdGF0dXMgPSBIQ2FtZXJhRGV2aWNlU3RhdHVzOjpTVEFUVVNfTk9UX0FWQUlMQUJMRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBkZXZpY2VTdGF0dXM7Cit9CisKK0hDYXB0dXJlUmVzdWx0RXh0cmFzIGNvbnZlcnRUb0hpZGwoY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyAmY2FwdHVyZVJlc3VsdEV4dHJhcykgeworICAgIEhDYXB0dXJlUmVzdWx0RXh0cmFzIGhDYXB0dXJlUmVzdWx0RXh0cmFzOworICAgIGhDYXB0dXJlUmVzdWx0RXh0cmFzLnJlcXVlc3RJZCA9IGNhcHR1cmVSZXN1bHRFeHRyYXMucmVxdWVzdElkOworICAgIGhDYXB0dXJlUmVzdWx0RXh0cmFzLmJ1cnN0SWQgPSBjYXB0dXJlUmVzdWx0RXh0cmFzLmJ1cnN0SWQ7CisgICAgaENhcHR1cmVSZXN1bHRFeHRyYXMuZnJhbWVOdW1iZXIgPSBjYXB0dXJlUmVzdWx0RXh0cmFzLmZyYW1lTnVtYmVyOworICAgIGhDYXB0dXJlUmVzdWx0RXh0cmFzLnBhcnRpYWxSZXN1bHRDb3VudCA9IGNhcHR1cmVSZXN1bHRFeHRyYXMucGFydGlhbFJlc3VsdENvdW50OworICAgIGhDYXB0dXJlUmVzdWx0RXh0cmFzLmVycm9yU3RyZWFtSWQgPSBjYXB0dXJlUmVzdWx0RXh0cmFzLmVycm9yU3RyZWFtSWQ7CisgICAgcmV0dXJuIGhDYXB0dXJlUmVzdWx0RXh0cmFzOworfQorCitIRXJyb3JDb2RlIGNvbnZlcnRUb0hpZGwoaW50MzJfdCBlcnJvckNvZGUpIHsKKyAgICBzd2l0Y2goZXJyb3JDb2RlKSB7CisgICAgICAgIGNhc2UgY2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX0RJU0NPTk5FQ1RFRDoKKyAgICAgICAgICAgIHJldHVybiBIRXJyb3JDb2RlOjpDQU1FUkFfRElTQ09OTkVDVEVEOworICAgICAgICBjYXNlIGNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9ERVZJQ0UgOgorICAgICAgICAgICAgcmV0dXJuIEhFcnJvckNvZGU6OkNBTUVSQV9ERVZJQ0U7CisgICAgICAgIGNhc2UgY2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX1NFUlZJQ0U6CisgICAgICAgICAgICByZXR1cm4gSEVycm9yQ29kZTo6Q0FNRVJBX1NFUlZJQ0U7CisgICAgICAgIGNhc2UgY2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX1JFUVVFU1Q6CisgICAgICAgICAgICByZXR1cm4gSEVycm9yQ29kZTo6Q0FNRVJBX1JFUVVFU1Q7CisgICAgICAgIGNhc2UgY2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX1JFU1VMVDoKKyAgICAgICAgICAgIHJldHVybiBIRXJyb3JDb2RlOjpDQU1FUkFfUkVTVUxUOworICAgICAgICBjYXNlIGNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9CVUZGRVI6CisgICAgICAgICAgICByZXR1cm4gSEVycm9yQ29kZTo6Q0FNRVJBX0JVRkZFUjsKKyAgICAgICAgY2FzZSBjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpFUlJPUl9DQU1FUkFfRElTQUJMRUQ6CisgICAgICAgICAgICByZXR1cm4gSEVycm9yQ29kZTo6Q0FNRVJBX0RJU0FCTEVEOworICAgICAgICBjYXNlIGNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9JTlZBTElEX0VSUk9SOgorICAgICAgICAgICAgcmV0dXJuIEhFcnJvckNvZGU6OkNBTUVSQV9JTlZBTElEX0VSUk9SOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEhFcnJvckNvZGU6OkNBTUVSQV9VTktOT1dOX0VSUk9SOworICAgIH0KK30KKwordm9pZCBjb252ZXJ0VG9IaWRsKGNvbnN0IHN0ZDo6dmVjdG9yPGhhcmR3YXJlOjpDYW1lcmFTdGF0dXM+ICZzcmMsCisgICAgICAgICAgICAgICAgICAgaGlkbF92ZWM8SENhbWVyYVN0YXR1c0FuZElkPiogZHN0KSB7CisgICAgZHN0LT5yZXNpemUoc3JjLnNpemUoKSk7CisgICAgc2l6ZV90IGkgPSAwOworICAgIGZvciAoYXV0byAmc3RhdHVzQW5kSWQgOiBzcmMpIHsKKyAgICAgICAgYXV0byAmYSA9ICgqZHN0KVtpKytdOworICAgICAgICBhLmNhbWVyYUlkID0gc3RhdHVzQW5kSWQuY2FtZXJhSWQuY19zdHIoKTsKKyAgICAgICAgYS5kZXZpY2VTdGF0dXMgPSBjb252ZXJ0VG9IaWRsQ2FtZXJhRGV2aWNlU3RhdHVzKHN0YXR1c0FuZElkLnN0YXR1cyk7CisgICAgfQorICAgIHJldHVybjsKK30KKwordm9pZCBjb252ZXJ0VG9IaWRsKAorICAgIGNvbnN0IGhhcmR3YXJlOjpjYW1lcmEyOjp1dGlsczo6U3VibWl0SW5mbyAmc3VibWl0SW5mbywKKyAgICBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OlN1Ym1pdEluZm8gKmhTdWJtaXRJbmZvKSB7CisgICAgaFN1Ym1pdEluZm8tPnJlcXVlc3RJZCA9IHN1Ym1pdEluZm8ubVJlcXVlc3RJZDsKKyAgICBoU3VibWl0SW5mby0+bGFzdEZyYW1lTnVtYmVyID0gc3VibWl0SW5mby5tTGFzdEZyYW1lTnVtYmVyOworfQorCitIU3RhdHVzIEIySFN0YXR1cyhjb25zdCBiaW5kZXI6OlN0YXR1cyAmYlN0YXR1cykgeworICAgIEhTdGF0dXMgc3RhdHVzID0gSFN0YXR1czo6Tk9fRVJST1I7CisgICAgaWYgKGJTdGF0dXMuaXNPaygpKSB7CisgICAgICAgIC8vIE5PIEVycm9yIGhlcmUKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgc3dpdGNoKGJTdGF0dXMuc2VydmljZVNwZWNpZmljRXJyb3JDb2RlKCkpIHsKKyAgICAgICAgY2FzZSBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2U6OkVSUk9SX0RJU0NPTk5FQ1RFRDoKKyAgICAgICAgICAgIHN0YXR1cyA9IEhTdGF0dXM6OkRJU0NPTk5FQ1RFRDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZTo6RVJST1JfQ0FNRVJBX0lOX1VTRToKKyAgICAgICAgICAgIHN0YXR1cyA9IEhTdGF0dXM6OkNBTUVSQV9JTl9VU0U7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2U6OkVSUk9SX01BWF9DQU1FUkFTX0lOX1VTRToKKyAgICAgICAgICAgIHN0YXR1cyA9IEhTdGF0dXM6Ok1BWF9DQU1FUkFTX0lOX1VTRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZTo6RVJST1JfSUxMRUdBTF9BUkdVTUVOVDoKKyAgICAgICAgICAgIHN0YXR1cyA9IEhTdGF0dXM6OklMTEVHQUxfQVJHVU1FTlQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2U6OkVSUk9SX0RFUFJFQ0FURURfSEFMOgorICAgICAgICAgICAgLy8gU2hvdWxkIG5vdCByZWFjaCBoZXJlIHNpbmNlIHdlIGZpbHRlcmVkIGxlZ2FjeSBIQUxzIGVhcmxpZXIKKyAgICAgICAgICAgIHN0YXR1cyA9IEhTdGF0dXM6OkRFUFJFQ0FURURfSEFMOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlOjpFUlJPUl9ESVNBQkxFRDoKKyAgICAgICAgICAgIHN0YXR1cyA9IEhTdGF0dXM6OkRJU0FCTEVEOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlOjpFUlJPUl9QRVJNSVNTSU9OX0RFTklFRDoKKyAgICAgICAgICAgIHN0YXR1cyA9IEhTdGF0dXM6OlBFUk1JU1NJT05fREVOSUVEOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTlZBTElEX09QRVJBVElPTjoKKyAgICAgICAgICAgIHN0YXR1cyA9IEhTdGF0dXM6OklOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBzdGF0dXMgPSBIU3RhdHVzOjpVTktOT1dOX0VSUk9SOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICByZXR1cm4gc3RhdHVzOworfQorCitIUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbyBjb252ZXJ0VG9IaWRsKAorICAgIGNvbnN0IFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8gJnBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8sCisgICAgc3RkOjpzaGFyZWRfcHRyPENhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlPiAmY2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWUpIHsKKyAgICBIUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbyBoUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbzsKKyAgICBoUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mby5waHlzaWNhbENhbWVyYUlkID0KKyAgICAgICAgU3RyaW5nOChwaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvLm1QaHlzaWNhbENhbWVyYUlkKS5zdHJpbmcoKTsKKyAgICBjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCAqcmF3TWV0YWRhdGEgPQorICAgICAgICBwaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvLm1QaHlzaWNhbENhbWVyYU1ldGFkYXRhLmdldEFuZExvY2soKTsKKyAgICAvLyBUcnkgdXNpbmcgZm1xIGF0IGZpcnN0LgorICAgIHNpemVfdCBtZXRhZGF0YV9zaXplID0gZ2V0X2NhbWVyYV9tZXRhZGF0YV9zaXplKHJhd01ldGFkYXRhKTsKKyAgICBpZiAoKG1ldGFkYXRhX3NpemUgPiAwKSAmJiAoY2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWUtPmF2YWlsYWJsZVRvV3JpdGUoKSA+IDApKSB7CisgICAgICAgIGlmIChjYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZS0+d3JpdGUoKHVpbnQ4X3QgKilyYXdNZXRhZGF0YSwgbWV0YWRhdGFfc2l6ZSkpIHsKKyAgICAgICAgICAgIGhQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvLnBoeXNpY2FsQ2FtZXJhTWV0YWRhdGEuZm1xTWV0YWRhdGFTaXplKG1ldGFkYXRhX3NpemUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR1coIiVzIENvdWxkbid0IHVzZSBmbXEsIGZhbGxpbmcgYmFjayB0byBod2JpbmRlciIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICBIQ2FtZXJhTWV0YWRhdGEgbWV0YWRhdGE7CisgICAgICAgICAgICBjb252ZXJ0VG9IaWRsKHJhd01ldGFkYXRhLCAmbWV0YWRhdGEpOworICAgICAgICAgICAgaFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8ucGh5c2ljYWxDYW1lcmFNZXRhZGF0YS5tZXRhZGF0YShzdGQ6Om1vdmUobWV0YWRhdGEpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBwaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvLm1QaHlzaWNhbENhbWVyYU1ldGFkYXRhLnVubG9jayhyYXdNZXRhZGF0YSk7CisgICAgcmV0dXJuIGhQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvOworfQorCitoaWRsX3ZlYzxIUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbz4gY29udmVydFRvSGlkbCgKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvPiAmcGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mb3MsCisgICAgc3RkOjpzaGFyZWRfcHRyPENhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlPiAmY2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWUpIHsKKyAgICBoaWRsX3ZlYzxIUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbz4gaFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm9zOworICAgIGhQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvcy5yZXNpemUocGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mb3Muc2l6ZSgpKTsKKyAgICBzaXplX3QgaSA9IDA7CisgICAgZm9yIChhdXRvICZwaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvIDogcGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mb3MpIHsKKyAgICAgICAgaFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm9zW2krK10gPSBjb252ZXJ0VG9IaWRsKHBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZSk7CisgICAgfQorICAgIHJldHVybiBoUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mb3M7Cit9CisKK30gLy9jb252ZXJzaW9uCit9IC8vIHV0aWxzCit9IC8vY2FtZXJhc2VydmljZQorfSAvLyBoYXJkd2FyZQorfSAvLyBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0NvbnZlcnQuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvQ29udmVydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyOTM3YTMKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0NvbnZlcnQuaApAQCAtMCwwICsxLDk3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDQU1FUkFTRVJWRVJfQ09OVkVSVF9ISURMCisjZGVmaW5lIENBTUVSQVNFUlZFUl9DT05WRVJUX0hJREwKKworI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL3NlcnZpY2UvMi4wL0lDYW1lcmFTZXJ2aWNlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9mcmFtZXdvcmtzL2NhbWVyYXNlcnZpY2UvZGV2aWNlLzIuMC9JQ2FtZXJhRGV2aWNlVXNlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL2NvbW1vbi8yLjAvdHlwZXMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2ZyYW1ld29ya3MvY2FtZXJhc2VydmljZS9zZXJ2aWNlLzIuMC90eXBlcy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL2RldmljZS8yLjAvdHlwZXMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9jb21tb24vMS4wL3R5cGVzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VVc2VyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9ncmFwaGljcy9idWZmZXJxdWV1ZS8xLjAvSUdyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvSUNhbWVyYVNlcnZpY2UuaD4KKyNpbmNsdWRlIDxmbXEvTWVzc2FnZVF1ZXVlLmg+CisjaW5jbHVkZSA8aGFyZHdhcmUvY2FtZXJhLmg+CisjaW5jbHVkZSA8aGlkbC9NUURlc2NyaXB0b3IuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBjYW1lcmFzZXJ2aWNlIHsKK25hbWVzcGFjZSB1dGlscyB7CituYW1lc3BhY2UgY29udmVyc2lvbiB7CisKK3VzaW5nIGhhcmR3YXJlOjpjYW1lcmEyOjppbXBsOjpDYXB0dXJlUmVzdWx0RXh0cmFzOwordXNpbmcgaGFyZHdhcmU6OmNhbWVyYTI6OmltcGw6OlBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm87CisKK3VzaW5nIENhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlID0gTWVzc2FnZVF1ZXVlPHVpbnQ4X3QsIGtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+OwordXNpbmcgSENhbWVyYU1ldGFkYXRhID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6c2VydmljZTo6VjJfMDo6Q2FtZXJhTWV0YWRhdGE7Cit1c2luZyBIQ2FtZXJhRGV2aWNlU3RhdHVzID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6c2VydmljZTo6VjJfMDo6Q2FtZXJhRGV2aWNlU3RhdHVzOwordXNpbmcgSENhbWVyYVN0YXR1c0FuZElkID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6c2VydmljZTo6VjJfMDo6Q2FtZXJhU3RhdHVzQW5kSWQ7Cit1c2luZyBIQ2FtZXJhRGV2aWNlVXNlciA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6SUNhbWVyYURldmljZVVzZXI7Cit1c2luZyBIQ2FwdHVyZVJlc3VsdEV4dHJhcyA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6Q2FwdHVyZVJlc3VsdEV4dHJhczsKK3VzaW5nIEhDYXB0dXJlUmVxdWVzdCA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6Q2FwdHVyZVJlcXVlc3Q7Cit1c2luZyBIRXJyb3JDb2RlID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpFcnJvckNvZGU7Cit1c2luZyBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyID0gaGFyZHdhcmU6OmdyYXBoaWNzOjpidWZmZXJxdWV1ZTo6VjFfMDo6SUdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKK3VzaW5nIEhPdXRwdXRDb25maWd1cmF0aW9uID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpPdXRwdXRDb25maWd1cmF0aW9uOwordXNpbmcgSFBoeXNpY2FsQ2FtZXJhU2V0dGluZ3MgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OlBoeXNpY2FsQ2FtZXJhU2V0dGluZ3M7Cit1c2luZyBIUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbyA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6UGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbzsKK3VzaW5nIEhTdWJtaXRJbmZvID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpTdWJtaXRJbmZvOwordXNpbmcgSFN0YXR1cyA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmNvbW1vbjo6VjJfMDo6U3RhdHVzOwordXNpbmcgSFN0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpTdHJlYW1Db25maWd1cmF0aW9uTW9kZTsKK3VzaW5nIEhUZW1wbGF0ZUlkID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpUZW1wbGF0ZUlkOworCisvLyBOb3RlOiBleGlzdGluZyBkYXRhIGluIGRzdCB3aWxsIGJlIGdvbmUuIENhbGxlciBzdGlsbCBvd25zIHRoZSBtZW1vcnkgb2Ygc3JjCit2b2lkIGNvbnZlcnRUb0hpZGwoY29uc3QgY2FtZXJhX21ldGFkYXRhX3QgKnNyYywgSENhbWVyYU1ldGFkYXRhKiBkc3QpOworCitpbnQzMl90IGNvbnZlcnRGcm9tSGlkbChIU3RyZWFtQ29uZmlndXJhdGlvbk1vZGUgc3RyZWFtQ29uZmlndXJhdGlvbk1vZGUpOworCitpbnQzMl90IGNvbnZlcnRGcm9tSGlkbChIVGVtcGxhdGVJZCB0ZW1wbGF0ZUlkKTsKKworYm9vbCBjb252ZXJ0RnJvbUhpZGwoY29uc3QgSENhbWVyYU1ldGFkYXRhICZzcmMsIENhbWVyYU1ldGFkYXRhICpkc3QpOworCitoYXJkd2FyZTo6Y2FtZXJhMjo6cGFyYW1zOjpPdXRwdXRDb25maWd1cmF0aW9uIGNvbnZlcnRGcm9tSGlkbCgKKyAgICBjb25zdCBIT3V0cHV0Q29uZmlndXJhdGlvbiAmaE91dHB1dENvbmZpZ3VyYXRpb24pOworCitIQ2FtZXJhRGV2aWNlU3RhdHVzIGNvbnZlcnRUb0hpZGxDYW1lcmFEZXZpY2VTdGF0dXMoaW50MzJfdCBzdGF0dXMpOworCit2b2lkIGNvbnZlcnRUb0hpZGwoY29uc3Qgc3RkOjp2ZWN0b3I8aGFyZHdhcmU6OkNhbWVyYVN0YXR1cz4gJnNyYywKKyAgICAgICAgICAgICAgICAgICBoaWRsX3ZlYzxIQ2FtZXJhU3RhdHVzQW5kSWQ+KiBkc3QpOworCit2b2lkIGNvbnZlcnRUb0hpZGwoY29uc3QgaGFyZHdhcmU6OmNhbWVyYTI6OnV0aWxzOjpTdWJtaXRJbmZvICZzdWJtaXRJbmZvLAorICAgICAgICAgICAgICAgICAgIEhTdWJtaXRJbmZvICpoU3VibWl0SW5mbyk7CisKK0hFcnJvckNvZGUgY29udmVydFRvSGlkbChpbnQzMl90IGVycm9yQ29kZSk7CisKK0hDYXB0dXJlUmVzdWx0RXh0cmFzIGNvbnZlcnRUb0hpZGwoY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyAmY2FwdHVyZVJlc3VsdEV4dHJhcyk7CisKK2hpZGxfdmVjPEhQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvPiBjb252ZXJ0VG9IaWRsKAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8+ICZwaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvcywKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWU+ICZjYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZSk7CisKK0hTdGF0dXMgQjJIU3RhdHVzKGNvbnN0IGJpbmRlcjo6U3RhdHVzICZiU3RhdHVzKTsKKworfSAvLyBjb252ZXJzaW9uCit9IC8vIHV0aWxzCit9IC8vIGNhbWVyYXNlcnZpY2UKK30gLy8gaGFyZHdhcmUKK30gLy9hbmRyb2lkCisKKyNlbmRpZiAvL0NBTUVSQVNFUlZFUl9DT05WRVJUX1RPX0hJREwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvSGlkbENhbWVyYURldmljZVVzZXIuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9IaWRsQ2FtZXJhRGV2aWNlVXNlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDIyYmE1YQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvSGlkbENhbWVyYURldmljZVVzZXIuY3BwCkBAIC0wLDAgKzEsMjYzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL2RldmljZS8zLjIvdHlwZXMuaD4KKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+CisjaW5jbHVkZSA8Z3VpL2J1ZmZlcnF1ZXVlLzEuMC9IMkJHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KKworI2luY2x1ZGUgPGhpZGwvQWlkbENhbWVyYURldmljZUNhbGxiYWNrcy5oPgorI2luY2x1ZGUgPGhpZGwvQ29udmVydC5oPgorI2luY2x1ZGUgPGhpZGwvSGlkbENhbWVyYURldmljZVVzZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9kZXZpY2UvMy4yL3R5cGVzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBmcmFtZXdvcmtzIHsKK25hbWVzcGFjZSBjYW1lcmFzZXJ2aWNlIHsKK25hbWVzcGFjZSBkZXZpY2UgeworbmFtZXNwYWNlIFYyXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKwordXNpbmcgaGFyZHdhcmU6OmNhbWVyYXNlcnZpY2U6OnV0aWxzOjpjb252ZXJzaW9uOjpjb252ZXJ0VG9IaWRsOwordXNpbmcgaGFyZHdhcmU6OmNhbWVyYXNlcnZpY2U6OnV0aWxzOjpjb252ZXJzaW9uOjpjb252ZXJ0RnJvbUhpZGw7Cit1c2luZyBoYXJkd2FyZTo6Y2FtZXJhc2VydmljZTo6dXRpbHM6OmNvbnZlcnNpb246OkIySFN0YXR1czsKKwordXNpbmcgaGFyZHdhcmU6OmdyYXBoaWNzOjpidWZmZXJxdWV1ZTo6VjFfMDo6dXRpbHM6OkgyQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKK3VzaW5nIGhhcmR3YXJlOjpoaWRsX3ZlYzsKK3VzaW5nIGhhcmR3YXJlOjpSZXR1cm47Cit1c2luZyBoYXJkd2FyZTo6Vm9pZDsKK3VzaW5nIEhTdWJtaXRJbmZvID0gZGV2aWNlOjpWMl8wOjpTdWJtaXRJbmZvOwordXNpbmcgaGFyZHdhcmU6OmNhbWVyYTI6OnBhcmFtczo6T3V0cHV0Q29uZmlndXJhdGlvbjsKKworc3RhdGljIGNvbnN0ZXhwciBpbnQzMl90IENBTUVSQV9SRVFVRVNUX01FVEFEQVRBX1FVRVVFX1NJWkUgPSAxIDw8IDIwIC8qIDEgTUIgKi87CitzdGF0aWMgY29uc3RleHByIGludDMyX3QgQ0FNRVJBX1JFU1VMVF9NRVRBREFUQV9RVUVVRV9TSVpFID0gMSA8PCAyMCAvKiAxIE1CICovOworCitSZXR1cm48dm9pZD4gSGlkbENhbWVyYURldmljZVVzZXI6OmRpc2Nvbm5lY3QoKSB7CisgICAgbURldmljZVJlbW90ZS0+ZGlzY29ubmVjdCgpOworICAgIHJldHVybiBWb2lkKCk7Cit9CisKK0hpZGxDYW1lcmFEZXZpY2VVc2VyOjpIaWRsQ2FtZXJhRGV2aWNlVXNlcigKKyAgICBjb25zdCBzcDxoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZVVzZXI+ICZkZXZpY2VSZW1vdGUpCisgIDogbURldmljZVJlbW90ZShkZXZpY2VSZW1vdGUpIHsKKyAgICBtSW5pdFN1Y2Nlc3MgPSBpbml0RGV2aWNlKCk7Cit9CisKK2Jvb2wgSGlkbENhbWVyYURldmljZVVzZXI6OmluaXREZXZpY2UoKSB7CisgICAgLy8gVE9ETzogR2V0IHJlcXVlc3QgYW5kIHJlc3VsdCBtZXRhZGF0YSBxdWV1ZSBzaXplIGZyb20gYSBzeXN0ZW0gcHJvcGVydHkuCisgICAgaW50MzJfdCByZXFGTVFTaXplID0gQ0FNRVJBX1JFUVVFU1RfTUVUQURBVEFfUVVFVUVfU0laRTsKKworICAgIG1DYXB0dXJlUmVxdWVzdE1ldGFkYXRhUXVldWUgPQorICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPENhcHR1cmVSZXF1ZXN0TWV0YWRhdGFRdWV1ZT4oc3RhdGljX2Nhc3Q8c2l6ZV90PihyZXFGTVFTaXplKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qIG5vbiBibG9ja2luZyAqLyk7CisgICAgaWYgKCFtQ2FwdHVyZVJlcXVlc3RNZXRhZGF0YVF1ZXVlLT5pc1ZhbGlkKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBpbnZhbGlkIHJlcXVlc3QgZm1xIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGludDMyX3QgcmVzRk1RU2l6ZSA9IENBTUVSQV9SRVNVTFRfTUVUQURBVEFfUVVFVUVfU0laRTsKKyAgICBtQ2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWUgPQorICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPENhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlPihzdGF0aWNfY2FzdDxzaXplX3Q+KHJlc0ZNUVNpemUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBub24gYmxvY2tpbmcgKi8pOworICAgIGlmICghbUNhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlLT5pc1ZhbGlkKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBpbnZhbGlkIHJlc3VsdCBmbXEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitSZXR1cm48dm9pZD4gSGlkbENhbWVyYURldmljZVVzZXI6OmdldENhcHR1cmVSZXF1ZXN0TWV0YWRhdGFRdWV1ZSgKKyAgICBnZXRDYXB0dXJlUmVxdWVzdE1ldGFkYXRhUXVldWVfY2IgX2hpZGxfY2IpIHsKKyAgICBpZiAobUluaXRTdWNjZXNzKSB7CisgICAgICAgIF9oaWRsX2NiKCptQ2FwdHVyZVJlcXVlc3RNZXRhZGF0YVF1ZXVlLT5nZXREZXNjKCkpOworICAgIH0KKyAgICByZXR1cm4gVm9pZCgpOworfQorCitSZXR1cm48dm9pZD4gSGlkbENhbWVyYURldmljZVVzZXI6OmdldENhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlKAorICAgIGdldENhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlX2NiIF9oaWRsX2NiKSB7CisgICAgaWYgKG1Jbml0U3VjY2VzcykgeworICAgICAgICBfaGlkbF9jYigqbUNhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlLT5nZXREZXNjKCkpOworICAgIH0KKyAgICByZXR1cm4gVm9pZCgpOworfQorCisvKioKKyAqIFRvIGJlIHVzZWQgb25seSBieSBzdWJtaXRSZXF1ZXN0TGlzdCBpbXBsZW1lbnRhdGlvbiwgc2luY2UgaXQgcmVxdWlyZXMKKyAqIGNsaWVudHMgdG8gY2FsbCB0aGlzIG1ldGhvZCBzZXJpYWxseSwgaW5jYXNlIGZtcSBpcyB1c2VkIHRvIHNlbmQgbWV0YWRhdGEuCisgKi8KK2Jvb2wgSGlkbENhbWVyYURldmljZVVzZXI6OmNvcHlQaHlzaWNhbENhbWVyYVNldHRpbmdzKAorICAgIGNvbnN0IGhpZGxfdmVjPEhQaHlzaWNhbENhbWVyYVNldHRpbmdzPiAmaFBoeXNpY2FsQ2FtZXJhU2V0dGluZ3MsCisgICAgc3RkOjp2ZWN0b3I8Q2FwdHVyZVJlcXVlc3Q6OlBoeXNpY2FsQ2FtZXJhU2V0dGluZ3M+ICpwaHlzaWNhbENhbWVyYVNldHRpbmdzKSB7CisgICAgYm9vbCBjb252ZXJ0ZWQgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gJmUgOiBoUGh5c2ljYWxDYW1lcmFTZXR0aW5ncykgeworICAgICAgICBwaHlzaWNhbENhbWVyYVNldHRpbmdzLT5lbXBsYWNlX2JhY2soKTsKKyAgICAgICAgQ2FwdHVyZVJlcXVlc3Q6OlBoeXNpY2FsQ2FtZXJhU2V0dGluZ3MgJnBoeXNpY2FsQ2FtZXJhU2V0dGluZyA9CisgICAgICAgICAgICBwaHlzaWNhbENhbWVyYVNldHRpbmdzLT5iYWNrKCk7CisgICAgICAgIHBoeXNpY2FsQ2FtZXJhU2V0dGluZy5pZCA9IGUuaWQuY19zdHIoKTsKKworICAgICAgICAvLyBSZWFkIHRoZSBzZXR0aW5ncyBlaXRoZXIgZnJvbSB0aGUgZm1xIG9yIHN0cmFpZ2h0YXdheSBmcm9tIHRoZQorICAgICAgICAvLyByZXF1ZXN0LiBXZSBkb24ndCBuZWVkIGFueSBzeW5jaHJvbml6YXRpb24sIHNpbmNlIHN1Ym1pdFJlcXVlc3RMaXN0CisgICAgICAgIC8vIGlzIGd1YXJhbnRlZWQgdG8gYmUgY2FsbGVkIHNlcmlhbGx5IGJ5IHRoZSBjbGllbnQgaWYgaXQgZGVjaWRlcyB0bworICAgICAgICAvLyB1c2UgZm1xLgorICAgICAgICBpZiAoZS5zZXR0aW5ncy5nZXREaXNjcmltaW5hdG9yKCkgPT0KKyAgICAgICAgICAgIEZtcVNpemVPck1ldGFkYXRhOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmZtcU1ldGFkYXRhU2l6ZSkgeworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBHZXQgc2V0dGluZ3MgZnJvbSB0aGUgZm1xLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBIQ2FtZXJhTWV0YWRhdGEgc2V0dGluZ3NGbXE7CisgICAgICAgICAgICBzZXR0aW5nc0ZtcS5yZXNpemUoZS5zZXR0aW5ncy5mbXFNZXRhZGF0YVNpemUoKSk7CisgICAgICAgICAgICBib29sIHJlYWQgPSBtQ2FwdHVyZVJlcXVlc3RNZXRhZGF0YVF1ZXVlLT5yZWFkKHNldHRpbmdzRm1xLmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5zZXR0aW5ncy5mbXFNZXRhZGF0YVNpemUoKSk7CisgICAgICAgICAgICBpZiAoIXJlYWQpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXMgY2FwdHVyZSByZXF1ZXN0IHNldHRpbmdzIGNvdWxkJ3QgYmUgcmVhZCBmcm9tIGZtcSBzaXplIiwKKyAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgIGNvbnZlcnRlZCA9IGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjb252ZXJ0ZWQgPSBjb252ZXJ0RnJvbUhpZGwoc2V0dGluZ3NGbXEsICZwaHlzaWNhbENhbWVyYVNldHRpbmcuc2V0dGluZ3MpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBUaGUgc2V0dGluZ3MgbWV0YWRhdGEgaXMgY29udGFpbmVkIGluIHJlcXVlc3Qgc2V0dGluZ3MgZmllbGQuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGNvbnZlcnRlZCA9CisgICAgICAgICAgICAgICAgY29udmVydEZyb21IaWRsKGUuc2V0dGluZ3MubWV0YWRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBoeXNpY2FsQ2FtZXJhU2V0dGluZy5zZXR0aW5ncyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFjb252ZXJ0ZWQpIHsKKyAgICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBjb252ZXJ0IHBoeXNpY2FsQ2FtZXJhU2V0dGluZ3MgZnJvbSBISURMIHRvIEFJREwuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgSGlkbENhbWVyYURldmljZVVzZXI6OmNvbnZlcnRSZXF1ZXN0RnJvbUhpZGwoY29uc3QgSENhcHR1cmVSZXF1ZXN0ICZoUmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FwdHVyZVJlcXVlc3QgKnJlcXVlc3QpIHsKKyAgICAvLyBObyByZXByb2Nlc3Npbmcgc3VwcG9ydC4KKyAgICByZXF1ZXN0LT5tSXNSZXByb2Nlc3MgPSBmYWxzZTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJnN0cmVhbUFuZFdpbmRvd0lkIDogaFJlcXVlc3Quc3RyZWFtQW5kV2luZG93SWRzKSB7CisgICAgICAgIHJlcXVlc3QtPm1TdHJlYW1JZHhMaXN0LnB1c2hfYmFjayhzdHJlYW1BbmRXaW5kb3dJZC5zdHJlYW1JZCk7CisgICAgICAgIHJlcXVlc3QtPm1TdXJmYWNlSWR4TGlzdC5wdXNoX2JhY2soc3RyZWFtQW5kV2luZG93SWQud2luZG93SWQpOworICAgIH0KKyAgICByZXR1cm4gY29weVBoeXNpY2FsQ2FtZXJhU2V0dGluZ3MoaFJlcXVlc3QucGh5c2ljYWxDYW1lcmFTZXR0aW5ncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihyZXF1ZXN0LT5tUGh5c2ljYWxDYW1lcmFTZXR0aW5ncykpOworfQorCitSZXR1cm48dm9pZD4gSGlkbENhbWVyYURldmljZVVzZXI6OnN1Ym1pdFJlcXVlc3RMaXN0KGNvbnN0IGhpZGxfdmVjPEhDYXB0dXJlUmVxdWVzdD4mIGhSZXF1ZXN0TGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdHJlYW1pbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Ym1pdFJlcXVlc3RMaXN0X2NiIF9oaWRsX2NiKSB7CisgICAgaGFyZHdhcmU6OmNhbWVyYTI6OnV0aWxzOjpTdWJtaXRJbmZvIHN1Ym1pdEluZm87CisgICAgSFN1Ym1pdEluZm8gaFN1Ym1pdEluZm87CisgICAgLyoqCisgICAgICogQ3JlYXRlIEFJREwgQ2FwdHVyZVJlcXVlc3QgZnJvbSByZXF1ZXN0TGlzdCBhbmQgZ3JhcGhpY0J1ZmZlclByb2R1Y2Vycy4KKyAgICAgKi8KKyAgICBzdGQ6OnZlY3RvcjxoYXJkd2FyZTo6Y2FtZXJhMjo6Q2FwdHVyZVJlcXVlc3Q+IHJlcXVlc3RzOworICAgIGZvciAoYXV0byAmaFJlcXVlc3QgOiBoUmVxdWVzdExpc3QpIHsKKyAgICAgICAgcmVxdWVzdHMuZW1wbGFjZV9iYWNrKCk7CisgICAgICAgIGF1dG8gJnJlcXVlc3QgPSByZXF1ZXN0cy5iYWNrKCk7CisgICAgICAgIGlmICghY29udmVydFJlcXVlc3RGcm9tSGlkbChoUmVxdWVzdCwgJnJlcXVlc3QpKSB7CisgICAgICAgICAgICBfaGlkbF9jYihIU3RhdHVzOjpJTExFR0FMX0FSR1VNRU5ULCBoU3VibWl0SW5mbyk7CisgICAgICAgICAgICByZXR1cm4gVm9pZCgpOworICAgICAgICB9CisgICAgfQorICAgIG1EZXZpY2VSZW1vdGUtPnN1Ym1pdFJlcXVlc3RMaXN0KHJlcXVlc3RzLCBzdHJlYW1pbmcsICZzdWJtaXRJbmZvKTsKKyAgICBtUmVxdWVzdElkID0gc3VibWl0SW5mby5tUmVxdWVzdElkOworICAgIGNvbnZlcnRUb0hpZGwoc3VibWl0SW5mbywgJmhTdWJtaXRJbmZvKTsKKyAgICBfaGlkbF9jYihIU3RhdHVzOjpOT19FUlJPUiwgaFN1Ym1pdEluZm8pOworICAgIHJldHVybiBWb2lkKCk7Cit9CisKK1JldHVybjx2b2lkPiBIaWRsQ2FtZXJhRGV2aWNlVXNlcjo6Y2FuY2VsUmVwZWF0aW5nUmVxdWVzdChjYW5jZWxSZXBlYXRpbmdSZXF1ZXN0X2NiIF9oaWRsX2NiKSB7CisgICAgaW50NjRfdCBsYXN0RnJhbWVOdW1iZXIgPSAwOworICAgIGJpbmRlcjo6U3RhdHVzIHJldCA9IG1EZXZpY2VSZW1vdGUtPmNhbmNlbFJlcXVlc3QobVJlcXVlc3RJZCwgJmxhc3RGcmFtZU51bWJlcik7CisgICAgX2hpZGxfY2IoQjJIU3RhdHVzKHJldCksIGxhc3RGcmFtZU51bWJlcik7CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworUmV0dXJuPEhTdGF0dXM+IEhpZGxDYW1lcmFEZXZpY2VVc2VyOjpiZWdpbkNvbmZpZ3VyZSgpIHsKKyAgICBiaW5kZXI6OlN0YXR1cyByZXQgPSBtRGV2aWNlUmVtb3RlLT5iZWdpbkNvbmZpZ3VyZSgpOworICAgIHJldHVybiBCMkhTdGF0dXMocmV0KTsKK30KKworUmV0dXJuPEhTdGF0dXM+IEhpZGxDYW1lcmFEZXZpY2VVc2VyOjplbmRDb25maWd1cmUoU3RyZWFtQ29uZmlndXJhdGlvbk1vZGUgb3BlcmF0aW5nTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzZXNzaW9uUGFyYW1zKSB7CisgICAgYW5kcm9pZDo6Q2FtZXJhTWV0YWRhdGEgY2FtZXJhTWV0YWRhdGE7CisgICAgaWYgKCFjb252ZXJ0RnJvbUhpZGwoc2Vzc2lvblBhcmFtcywgJmNhbWVyYU1ldGFkYXRhKSkgeworICAgICAgICByZXR1cm4gSFN0YXR1czo6SUxMRUdBTF9BUkdVTUVOVDsKKyAgICB9CisKKyAgICBiaW5kZXI6OlN0YXR1cyByZXQgPSBtRGV2aWNlUmVtb3RlLT5lbmRDb25maWd1cmUoY29udmVydEZyb21IaWRsKG9wZXJhdGluZ01vZGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmFNZXRhZGF0YSk7CisgICAgcmV0dXJuIEIySFN0YXR1cyhyZXQpOworfQorCitSZXR1cm48SFN0YXR1cz4gSGlkbENhbWVyYURldmljZVVzZXI6OmRlbGV0ZVN0cmVhbShpbnQzMl90IHN0cmVhbUlkKSB7CisgICAgYmluZGVyOjpTdGF0dXMgcmV0ID0gbURldmljZVJlbW90ZS0+ZGVsZXRlU3RyZWFtKHN0cmVhbUlkKTsKKyAgICByZXR1cm4gQjJIU3RhdHVzKHJldCk7Cit9CisKK1JldHVybjx2b2lkPiBIaWRsQ2FtZXJhRGV2aWNlVXNlcjo6Y3JlYXRlU3RyZWFtKGNvbnN0IEhPdXRwdXRDb25maWd1cmF0aW9uJiBoT3V0cHV0Q29uZmlndXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZVN0cmVhbV9jYiBoaWRsX2NiXykgeworICAgIE91dHB1dENvbmZpZ3VyYXRpb24gb3V0cHV0Q29uZmlndXJhdGlvbiA9CisgICAgICAgIGNvbnZlcnRGcm9tSGlkbChoT3V0cHV0Q29uZmlndXJhdGlvbik7CisgICAgaW50MzJfdCBuZXdTdHJlYW1JZCA9IDA7CisgICAgYmluZGVyOjpTdGF0dXMgcmV0ID0gbURldmljZVJlbW90ZS0+Y3JlYXRlU3RyZWFtKG91dHB1dENvbmZpZ3VyYXRpb24sICZuZXdTdHJlYW1JZCk7CisgICAgSFN0YXR1cyBzdGF0dXMgPSBCMkhTdGF0dXMocmV0KTsKKyAgICBoaWRsX2NiXyhzdGF0dXMsIG5ld1N0cmVhbUlkKTsKKyAgICByZXR1cm4gVm9pZCgpOworfQorCitSZXR1cm48dm9pZD4gSGlkbENhbWVyYURldmljZVVzZXI6OmNyZWF0ZURlZmF1bHRSZXF1ZXN0KFRlbXBsYXRlSWQgdGVtcGxhdGVJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlRGVmYXVsdFJlcXVlc3RfY2IgX2hpZGxfY2IpIHsKKyAgICBhbmRyb2lkOjpDYW1lcmFNZXRhZGF0YSBjYW1lcmFNZXRhZGF0YTsKKyAgICBiaW5kZXI6OlN0YXR1cyByZXQgPSBtRGV2aWNlUmVtb3RlLT5jcmVhdGVEZWZhdWx0UmVxdWVzdChjb252ZXJ0RnJvbUhpZGwodGVtcGxhdGVJZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNhbWVyYU1ldGFkYXRhKTsKKyAgICBIU3RhdHVzIGhTdGF0dXMgPSBCMkhTdGF0dXMocmV0KTsKKyAgICBIQ2FtZXJhTWV0YWRhdGEgaGlkbE1ldGFkYXRhOworICAgIGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90ICpyYXdNZXRhZGF0YSA9IGNhbWVyYU1ldGFkYXRhLmdldEFuZExvY2soKTsKKyAgICBjb252ZXJ0VG9IaWRsKHJhd01ldGFkYXRhLCAmaGlkbE1ldGFkYXRhKTsKKyAgICBfaGlkbF9jYihoU3RhdHVzLCBoaWRsTWV0YWRhdGEpOworICAgIGNhbWVyYU1ldGFkYXRhLnVubG9jayhyYXdNZXRhZGF0YSk7CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworUmV0dXJuPEhTdGF0dXM+IEhpZGxDYW1lcmFEZXZpY2VVc2VyOjp3YWl0VW50aWxJZGxlKCkgeworICAgIGJpbmRlcjo6U3RhdHVzIHJldCA9IG1EZXZpY2VSZW1vdGUtPndhaXRVbnRpbElkbGUoKTsKKyAgICByZXR1cm4gQjJIU3RhdHVzKHJldCk7Cit9CisKK1JldHVybjx2b2lkPiBIaWRsQ2FtZXJhRGV2aWNlVXNlcjo6Zmx1c2goZmx1c2hfY2IgX2hpZGxfY2IpIHsKKyAgICBpbnQ2NF90IGxhc3RGcmFtZU51bWJlciA9IDA7CisgICAgYmluZGVyOjpTdGF0dXMgcmV0ID0gbURldmljZVJlbW90ZS0+Zmx1c2goJmxhc3RGcmFtZU51bWJlcik7CisgICAgX2hpZGxfY2IoQjJIU3RhdHVzKHJldCksbGFzdEZyYW1lTnVtYmVyKTsKKyAgICByZXR1cm4gVm9pZCgpOworfQorCitSZXR1cm48SFN0YXR1cz4gSGlkbENhbWVyYURldmljZVVzZXI6OnVwZGF0ZU91dHB1dENvbmZpZ3VyYXRpb24oCisgICAgaW50MzJfdCBzdHJlYW1JZCwKKyAgICBjb25zdCBIT3V0cHV0Q29uZmlndXJhdGlvbiYgaE91dHB1dENvbmZpZ3VyYXRpb24pIHsKKyAgICBPdXRwdXRDb25maWd1cmF0aW9uIG91dHB1dENvbmZpZ3VyYXRpb24gPSBjb252ZXJ0RnJvbUhpZGwoaE91dHB1dENvbmZpZ3VyYXRpb24pOworICAgIGJpbmRlcjo6U3RhdHVzIHJldCA9IG1EZXZpY2VSZW1vdGUtPnVwZGF0ZU91dHB1dENvbmZpZ3VyYXRpb24oc3RyZWFtSWQsIG91dHB1dENvbmZpZ3VyYXRpb24pOworICAgIHJldHVybiBCMkhTdGF0dXMocmV0KTsKK30KKworfSAvLyBpbXBsZW1lbnRhdGlvbgorfSAvLyBWMl8wCit9IC8vIGRldmljZQorfSAvLyBjYW1lcmFzZXJ2aWNlCit9IC8vIGZyYW1ld29ya3MKK30gLy8gYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9IaWRsQ2FtZXJhRGV2aWNlVXNlci5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9IaWRsQ2FtZXJhRGV2aWNlVXNlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlOGYxZDYKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0hpZGxDYW1lcmFEZXZpY2VVc2VyLmgKQEAgLTAsMCArMSwxMjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfRlJBTUVXT1JLU19DQU1FUkFERVZJQ0VVU0VSX1YyXzBfQ0FNRVJBREVWSUNFVVNFUl9ICisjZGVmaW5lIEFORFJPSURfRlJBTUVXT1JLU19DQU1FUkFERVZJQ0VVU0VSX1YyXzBfQ0FNRVJBREVWSUNFVVNFUl9ICisKKyNpbmNsdWRlIDxtdXRleD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dGhyZWFkPgorCisjaW5jbHVkZSA8YW5kcm9pZC9mcmFtZXdvcmtzL2NhbWVyYXNlcnZpY2UvY29tbW9uLzIuMC90eXBlcy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL3NlcnZpY2UvMi4wL3R5cGVzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9mcmFtZXdvcmtzL2NhbWVyYXNlcnZpY2UvZGV2aWNlLzIuMC9JQ2FtZXJhRGV2aWNlVXNlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL2RldmljZS8yLjAvdHlwZXMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvSUNhbWVyYURldmljZUNhbGxiYWNrcy5oPgorI2luY2x1ZGUgPGZtcS9NZXNzYWdlUXVldWUuaD4KKyNpbmNsdWRlIDxoaWRsL01RRGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGhpZGwvU3RhdHVzLmg+CisKKyNpbmNsdWRlIDxDYW1lcmFTZXJ2aWNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBmcmFtZXdvcmtzIHsKK25hbWVzcGFjZSBjYW1lcmFzZXJ2aWNlIHsKK25hbWVzcGFjZSBkZXZpY2UgeworbmFtZXNwYWNlIFYyXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKwordXNpbmcgZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpTdHJlYW1Db25maWd1cmF0aW9uTW9kZTsKK3VzaW5nIGhhcmR3YXJlOjpjYW1lcmEyOjpDYXB0dXJlUmVxdWVzdDsKK3VzaW5nIGhhcmR3YXJlOjpoaWRsX3ZlYzsKK3VzaW5nIGhhcmR3YXJlOjprU3luY2hyb25pemVkUmVhZFdyaXRlOwordXNpbmcgaGFyZHdhcmU6Ok1lc3NhZ2VRdWV1ZTsKK3VzaW5nIGhhcmR3YXJlOjpNUURlc2NyaXB0b3JTeW5jOwordXNpbmcgaGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIENhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlID0gTWVzc2FnZVF1ZXVlPHVpbnQ4X3QsIGtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+OwordXNpbmcgQ2FwdHVyZVJlcXVlc3RNZXRhZGF0YVF1ZXVlID0gTWVzc2FnZVF1ZXVlPHVpbnQ4X3QsIGtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+OwordXNpbmcgVGVtcGxhdGVJZCA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6VGVtcGxhdGVJZDsKKwordXNpbmcgSENhbWVyYURldmljZVVzZXIgPSBkZXZpY2U6OlYyXzA6OklDYW1lcmFEZXZpY2VVc2VyOwordXNpbmcgSENhbWVyYU1ldGFkYXRhID0gY2FtZXJhc2VydmljZTo6c2VydmljZTo6VjJfMDo6Q2FtZXJhTWV0YWRhdGE7Cit1c2luZyBIQ2FwdHVyZVJlcXVlc3QgPSBkZXZpY2U6OlYyXzA6OkNhcHR1cmVSZXF1ZXN0OwordXNpbmcgSE91dHB1dENvbmZpZ3VyYXRpb24gPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6Ok91dHB1dENvbmZpZ3VyYXRpb247Cit1c2luZyBIUGh5c2ljYWxDYW1lcmFTZXR0aW5ncyA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6UGh5c2ljYWxDYW1lcmFTZXR0aW5nczsKK3VzaW5nIEhTdGF0dXMgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpjb21tb246OlYyXzA6OlN0YXR1czsKKworc3RhdGljIGNvbnN0ZXhwciBpbnQzMl90IFJFUVVFU1RfSURfTk9ORSA9IC0xOworCitzdHJ1Y3QgSGlkbENhbWVyYURldmljZVVzZXIgZmluYWwgOiBwdWJsaWMgSENhbWVyYURldmljZVVzZXIgeworICAgIEhpZGxDYW1lcmFEZXZpY2VVc2VyKGNvbnN0IHNwPGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlVXNlcj4gJmRldmljZVJlbW90ZSk7CisKKyAgICB+SGlkbENhbWVyYURldmljZVVzZXIoKSB7IH0KKworICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IGRpc2Nvbm5lY3QoKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IGdldENhcHR1cmVSZXF1ZXN0TWV0YWRhdGFRdWV1ZSgKKyAgICAgICAgZ2V0Q2FwdHVyZVJlcXVlc3RNZXRhZGF0YVF1ZXVlX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IGdldENhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlKAorICAgICAgICBnZXRDYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZV9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBzdWJtaXRSZXF1ZXN0TGlzdChjb25zdCBoaWRsX3ZlYzxIQ2FwdHVyZVJlcXVlc3Q+JiByZXF1ZXN0TGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN0cmVhbWluZywgc3VibWl0UmVxdWVzdExpc3RfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gY2FuY2VsUmVwZWF0aW5nUmVxdWVzdChjYW5jZWxSZXBlYXRpbmdSZXF1ZXN0X2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgUmV0dXJuPEhTdGF0dXM+IGJlZ2luQ29uZmlndXJlKCkgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIFJldHVybjxIU3RhdHVzPiBlbmRDb25maWd1cmUoU3RyZWFtQ29uZmlndXJhdGlvbk1vZGUgb3BlcmF0aW5nTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNlc3Npb25QYXJhbXMpOworCisgICAgdmlydHVhbCBSZXR1cm48SFN0YXR1cz4gZGVsZXRlU3RyZWFtKGludDMyX3Qgc3RyZWFtSWQpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gY3JlYXRlU3RyZWFtKGNvbnN0IEhPdXRwdXRDb25maWd1cmF0aW9uJiBvdXRwdXRDb25maWd1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVTdHJlYW1fY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworCisgICAgUmV0dXJuPHZvaWQ+IGNyZWF0ZURlZmF1bHRSZXF1ZXN0KFRlbXBsYXRlSWQgdGVtcGxhdGVJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlRGVmYXVsdFJlcXVlc3RfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBSZXR1cm48SFN0YXR1cz4gd2FpdFVudGlsSWRsZSgpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gZmx1c2goZmx1c2hfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBSZXR1cm48SFN0YXR1cz4gdXBkYXRlT3V0cHV0Q29uZmlndXJhdGlvbigKKyAgICAgICAgaW50MzJfdCBzdHJlYW1JZCwgY29uc3QgSE91dHB1dENvbmZpZ3VyYXRpb24mIG91dHB1dENvbmZpZ3VyYXRpb24pIG92ZXJyaWRlOworCisgICAgYm9vbCBpbml0U3RhdHVzKCkgeyByZXR1cm4gbUluaXRTdWNjZXNzOyB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWU+IGdldENhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlKCkgeworICAgICAgICByZXR1cm4gbUNhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlOworICAgIH0KKworIHByaXZhdGU6CisgICAgYm9vbCBpbml0RGV2aWNlKCk7CisKKyAgICBib29sIGNvbnZlcnRSZXF1ZXN0RnJvbUhpZGwoY29uc3QgSENhcHR1cmVSZXF1ZXN0ICZoUmVxdWVzdCwgQ2FwdHVyZVJlcXVlc3QgKnJlcXVlc3QpOworCisgICAgYm9vbCBjb3B5UGh5c2ljYWxDYW1lcmFTZXR0aW5ncygKKyAgICAgICAgY29uc3QgaGlkbF92ZWM8SFBoeXNpY2FsQ2FtZXJhU2V0dGluZ3M+ICZoUGh5c2ljYWxDYW1lcmFTZXR0aW5ncywKKyAgICAgICAgc3RkOjp2ZWN0b3I8Q2FwdHVyZVJlcXVlc3Q6OlBoeXNpY2FsQ2FtZXJhU2V0dGluZ3M+ICpwaHlzaWNhbENhbWVyYVNldHRpbmdzKTsKKworICAgIGNvbnN0IHNwPGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlVXNlcj4gbURldmljZVJlbW90ZTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q2FwdHVyZVJlcXVlc3RNZXRhZGF0YVF1ZXVlPiBtQ2FwdHVyZVJlcXVlc3RNZXRhZGF0YVF1ZXVlID0gbnVsbHB0cjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWU+IG1DYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZSA9IG51bGxwdHI7CisgICAgYm9vbCBtSW5pdFN1Y2Nlc3MgPSBmYWxzZTsKKyAgICBpbnQzMl90IG1SZXF1ZXN0SWQgPSBSRVFVRVNUX0lEX05PTkU7Cit9OworCit9IC8vIGltcGxlbWVudGF0aW9uCit9IC8vIFYyXzAKK30gLy8gZGV2aWNlCit9IC8vIGNhbWVyYXNlcnZpY2UKK30gLy8gZnJhbWV3b3JrcworfSAvLyBhbmRyb2lkCisjZW5kaWYgLy8gQU5EUk9JRF9GUkFNRU9XT1JLU19DQU1FUkFERVZJQ0VVU0VSX1YyXzBfQ0FNRVJBREVWSUNFVVNFUl9ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0hpZGxDYW1lcmFTZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvSGlkbENhbWVyYVNlcnZpY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxYmRmNmQKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0hpZGxDYW1lcmFTZXJ2aWNlLmNwcApAQCAtMCwwICsxLDI2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxoaWRsL0NvbnZlcnQuaD4KKworI2luY2x1ZGUgPGhpZGwvSGlkbENhbWVyYVNlcnZpY2UuaD4KKworI2luY2x1ZGUgPGhpZGwvSGlkbENhbWVyYURldmljZVVzZXIuaD4KKyNpbmNsdWRlIDxoaWRsL0FpZGxDYW1lcmFEZXZpY2VDYWxsYmFja3MuaD4KKyNpbmNsdWRlIDxoaWRsL0FpZGxDYW1lcmFTZXJ2aWNlTGlzdGVuZXIuaD4KKworI2luY2x1ZGUgPGhpZGwvSGlkbFRyYW5zcG9ydFN1cHBvcnQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGZyYW1ld29ya3MgeworbmFtZXNwYWNlIGNhbWVyYXNlcnZpY2UgeworbmFtZXNwYWNlIHNlcnZpY2UgeworbmFtZXNwYWNlIFYyXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKwordXNpbmcgZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6c2VydmljZTo6VjJfMDo6aW1wbGVtZW50YXRpb246OkhpZGxDYW1lcmFTZXJ2aWNlOwordXNpbmcgaGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgaGFyZHdhcmU6OmNhbWVyYXNlcnZpY2U6OnV0aWxzOjpjb252ZXJzaW9uOjpjb252ZXJ0VG9IaWRsOwordXNpbmcgaGFyZHdhcmU6OmNhbWVyYXNlcnZpY2U6OnV0aWxzOjpjb252ZXJzaW9uOjpCMkhTdGF0dXM7Cit1c2luZyBoYXJkd2FyZTo6Vm9pZDsKKwordXNpbmcgZGV2aWNlOjpWMl8wOjppbXBsZW1lbnRhdGlvbjo6SDJCQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOwordXNpbmcgZGV2aWNlOjpWMl8wOjppbXBsZW1lbnRhdGlvbjo6SGlkbENhbWVyYURldmljZVVzZXI7Cit1c2luZyBzZXJ2aWNlOjpWMl8wOjppbXBsZW1lbnRhdGlvbjo6SDJCQ2FtZXJhU2VydmljZUxpc3RlbmVyOwordXNpbmcgSENhbWVyYU1ldGFkYXRhVHlwZSA9IGFuZHJvaWQ6OmZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmNvbW1vbjo6VjJfMDo6Q2FtZXJhTWV0YWRhdGFUeXBlOwordXNpbmcgSFZlbmRvclRhZyA9IGFuZHJvaWQ6OmZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmNvbW1vbjo6VjJfMDo6VmVuZG9yVGFnOwordXNpbmcgSFZlbmRvclRhZ1NlY3Rpb24gPSBhbmRyb2lkOjpmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpjb21tb246OlYyXzA6OlZlbmRvclRhZ1NlY3Rpb247CisKK3NwPEhpZGxDYW1lcmFTZXJ2aWNlPiBnSGlkbENhbWVyYVNlcnZpY2U7CisKK3NwPEhpZGxDYW1lcmFTZXJ2aWNlPiBIaWRsQ2FtZXJhU2VydmljZTo6Z2V0SW5zdGFuY2UoYW5kcm9pZDo6Q2FtZXJhU2VydmljZSAqY3MpIHsKKyAgICBnSGlkbENhbWVyYVNlcnZpY2UgPSBuZXcgSGlkbENhbWVyYVNlcnZpY2UoY3MpOworICAgIHJldHVybiBnSGlkbENhbWVyYVNlcnZpY2U7Cit9CisKK1JldHVybjx2b2lkPgorSGlkbENhbWVyYVNlcnZpY2U6OmdldENhbWVyYUNoYXJhY3RlcmlzdGljcyhjb25zdCBoaWRsX3N0cmluZyYgY2FtZXJhSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldENhbWVyYUNoYXJhY3RlcmlzdGljc19jYiBfaGlkbF9jYikgeworICAgIGFuZHJvaWQ6OkNhbWVyYU1ldGFkYXRhIGNhbWVyYU1ldGFkYXRhOworICAgIEhTdGF0dXMgc3RhdHVzID0gSFN0YXR1czo6Tk9fRVJST1I7CisgICAgYmluZGVyOjpTdGF0dXMgc2VydmljZVJldCA9CisgICAgICAgIG1BaWRsSUNhbWVyYVNlcnZpY2UtPmdldENhbWVyYUNoYXJhY3RlcmlzdGljcyhTdHJpbmcxNihjYW1lcmFJZC5jX3N0cigpKSwgJmNhbWVyYU1ldGFkYXRhKTsKKyAgICBIQ2FtZXJhTWV0YWRhdGEgaGlkbE1ldGFkYXRhOworICAgIGlmICghc2VydmljZVJldC5pc09rKCkpIHsKKyAgICAgICAgc3dpdGNoKHNlcnZpY2VSZXQuc2VydmljZVNwZWNpZmljRXJyb3JDb2RlKCkpIHsKKyAgICAgICAgICAgIC8vIE5vIEVSUk9SX0NBTUVSQV9ESVNDT05ORUNURUQgc2luY2Ugd2UncmUgaW4gdGhlIHNhbWUgcHJvY2Vzcy4KKyAgICAgICAgICAgIGNhc2UgaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5UOgorICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhIElEICVzIGRvZXMgbm90IGV4aXN0ISIsIF9fRlVOQ1RJT05fXywgY2FtZXJhSWQuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gSFN0YXR1czo6SUxMRUdBTF9BUkdVTUVOVDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgQUxPR0UoIkdldCBjYW1lcmEgY2hhcmFjdGVyaXN0aWNzIGZyb20gY2FtZXJhIHNlcnZpY2UgZmFpbGVkOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgc2VydmljZVJldC50b1N0cmluZzgoKS5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gQjJIU3RhdHVzKHNlcnZpY2VSZXQpOworICAgICAgICAgIH0KKyAgICAgICAgX2hpZGxfY2Ioc3RhdHVzLCBoaWRsTWV0YWRhdGEpOworICAgICAgICByZXR1cm4gVm9pZCgpOworICAgIH0KKyAgICBjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCAqcmF3TWV0YWRhdGEgPSBjYW1lcmFNZXRhZGF0YS5nZXRBbmRMb2NrKCk7CisgICAgY29udmVydFRvSGlkbChyYXdNZXRhZGF0YSwgJmhpZGxNZXRhZGF0YSk7CisgICAgX2hpZGxfY2Ioc3RhdHVzLCBoaWRsTWV0YWRhdGEpOworICAgIGNhbWVyYU1ldGFkYXRhLnVubG9jayhyYXdNZXRhZGF0YSk7CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworUmV0dXJuPHZvaWQ+IEhpZGxDYW1lcmFTZXJ2aWNlOjpjb25uZWN0RGV2aWNlKGNvbnN0IHNwPEhDYW1lcmFEZXZpY2VDYWxsYmFjaz4mIGhDYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgY2FtZXJhSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdERldmljZV9jYiBfaGlkbF9jYikgeworICAgIC8vIEhlcmUsIHdlIGZpcnN0IGdldCBJQ2FtZXJhRGV2aWNlVXNlciBmcm9tIG1BaWRsSUNhbWVyYVNlcnZpY2UsIHRoZW4gc2F2ZQorICAgIC8vIHRoYXQgaW50ZXJmYWNlIGluIHRoZSBuZXdseSBjcmVhdGVkIEhpZGxDYW1lcmFEZXZpY2VVc2VyIGltcGwgY2xhc3MuCisgICAgaWYgKG1BaWRsSUNhbWVyYVNlcnZpY2UgPT0gbnVsbHB0cikgeworICAgICAgICBfaGlkbF9jYihIU3RhdHVzOjpVTktOT1dOX0VSUk9SLCBudWxscHRyKTsKKyAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisgICAgc3A8aGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VVc2VyPiBkZXZpY2VSZW1vdGUgPSBudWxscHRyOworICAgIC8vIENyZWF0ZSBhIGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2sgb2JqZWN0IHdoaWNoIGludGVybmFsbHkKKyAgICAvLyBjYWxscyBjYWxsYmFjayBmdW5jdGlvbnMgcGFzc2VkIHRocm91Z2ggaENhbGxiYWNrLgorICAgIHNwPEgyQkNhbWVyYURldmljZUNhbGxiYWNrcz4gaHlicmlkQ2FsbGJhY2tzID0gbmV3IEgyQkNhbWVyYURldmljZUNhbGxiYWNrcyhoQ2FsbGJhY2spOworICAgIGlmICghaHlicmlkQ2FsbGJhY2tzLT5pbml0aWFsaXplTG9vcGVyKCkpIHsKKyAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBoYW5kbGUgY2FsbGJhY2tzIG9uIGRldmljZSwgY2Fubm90IGNvbm5lY3QiKTsKKyAgICAgICAgX2hpZGxfY2IoSFN0YXR1czo6VU5LTk9XTl9FUlJPUiwgbnVsbHB0cik7CisgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfQorICAgIHNwPGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzPiBjYWxsYmFja3MgPSBoeWJyaWRDYWxsYmFja3M7CisgICAgYmluZGVyOjpTdGF0dXMgc2VydmljZVJldCA9IG1BaWRsSUNhbWVyYVNlcnZpY2UtPmNvbm5lY3REZXZpY2UoCisgICAgICAgICAgICBjYWxsYmFja3MsIFN0cmluZzE2KGNhbWVyYUlkLmNfc3RyKCkpLCBTdHJpbmcxNigiIiksCisgICAgICAgICAgICBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2U6OlVTRV9DQUxMSU5HX1VJRCwgLypvdXQqLyZkZXZpY2VSZW1vdGUpOworICAgIEhTdGF0dXMgc3RhdHVzID0gSFN0YXR1czo6Tk9fRVJST1I7CisgICAgaWYgKCFzZXJ2aWNlUmV0LmlzT2soKSkgeworICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBjb25uZWN0IHRvIGNhbWVyYSBkZXZpY2UiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICBzdGF0dXMgPSBCMkhTdGF0dXMoc2VydmljZVJldCk7CisgICAgICAgIF9oaWRsX2NiKHN0YXR1cywgbnVsbHB0cik7CisgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfQorICAgIC8vIE5vdyB3ZSBjcmVhdGUgYSBIaWRsQ2FtZXJhRGV2aWNlVXNlciBjbGFzcywgc3RvcmUgdGhlIGRldmljZVJlbW90ZSBpbiBpdCwKKyAgICAvLyBhbmQgcmV0dXJuIHRoYXQgYmFjay4gQWxsIGNhbGxzIG9uIHRoYXQgaW50ZXJmYWNlIHdpbGwgYmUgZm9yd2FyZGVkIHRvCisgICAgLy8gdGhlIEFJREwgaW50ZXJmYWNlLgorICAgIHNwPEhpZGxDYW1lcmFEZXZpY2VVc2VyPiBoRGV2aWNlUmVtb3RlID0gbmV3IEhpZGxDYW1lcmFEZXZpY2VVc2VyKGRldmljZVJlbW90ZSk7CisgICAgaWYgKCFoRGV2aWNlUmVtb3RlLT5pbml0U3RhdHVzKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gaW5pdGlhbGl6ZSBjYW1lcmEgZGV2aWNlIEhJREwgd3JhcHBlciIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIF9oaWRsX2NiKEhTdGF0dXM6OlVOS05PV05fRVJST1IsIG51bGxwdHIpOworICAgICAgICByZXR1cm4gVm9pZCgpOworICAgIH0KKyAgICBoeWJyaWRDYWxsYmFja3MtPnNldENhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlKGhEZXZpY2VSZW1vdGUtPmdldENhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlKCkpOworICAgIF9oaWRsX2NiKHN0YXR1cywgaERldmljZVJlbW90ZSk7CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKwordm9pZCBIaWRsQ2FtZXJhU2VydmljZTo6YWRkVG9MaXN0ZW5lckNhY2hlTG9ja2VkKHNwPEhDYW1lcmFTZXJ2aWNlTGlzdGVuZXI+IGhMaXN0ZW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2VMaXN0ZW5lcj4gY3NMaXN0ZW5lcikgeworICAgICAgICBtTGlzdGVuZXJzLmVtcGxhY2VfYmFjayhzdGQ6Om1ha2VfcGFpcihoTGlzdGVuZXIsIGNzTGlzdGVuZXIpKTsKK30KKworc3A8aGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlTGlzdGVuZXI+CitIaWRsQ2FtZXJhU2VydmljZTo6c2VhcmNoTGlzdGVuZXJDYWNoZUxvY2tlZChzcDxIQ2FtZXJhU2VydmljZUxpc3RlbmVyPiBoTGlzdGVuZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHNob3VsZFJlbW92ZSkgeworICAgIC8vIEdvIHRocm91Z2ggdGhlIG1MaXN0ZW5lcnMgbGlzdCBhbmQgY29tcGFyZSB0aGUgbGlzdGVuZXIgd2l0aCB0aGUgSElETAorICAgIC8vIGxpc3RlbmVyIHJlZ2lzdGVyZWQuCisgICAgYXV0byBpdCA9IG1MaXN0ZW5lcnMuYmVnaW4oKTsKKyAgICBzcDxJQ2FtZXJhU2VydmljZUxpc3RlbmVyPiBjc0xpc3RlbmVyID0gbnVsbHB0cjsKKyAgICBmb3IgKDtpdCAhPSBtTGlzdGVuZXJzLmVuZCgpOyBpdCsrKSB7CisgICAgICAgIGlmIChoYXJkd2FyZTo6aW50ZXJmYWNlc0VxdWFsKGl0LT5maXJzdCwgaExpc3RlbmVyKSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGl0ICE9IG1MaXN0ZW5lcnMuZW5kKCkpIHsKKyAgICAgICAgY3NMaXN0ZW5lciA9IGl0LT5zZWNvbmQ7CisgICAgICAgIGlmIChzaG91bGRSZW1vdmUpIHsKKyAgICAgICAgICBtTGlzdGVuZXJzLmVyYXNlKGl0KTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gY3NMaXN0ZW5lcjsKK30KKworUmV0dXJuPHZvaWQ+IEhpZGxDYW1lcmFTZXJ2aWNlOjphZGRMaXN0ZW5lcihjb25zdCBzcDxIQ2FtZXJhU2VydmljZUxpc3RlbmVyPiYgaENzTGlzdGVuZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZExpc3RlbmVyX2NiIF9oaWRsX2NiKSB7CisgICAgaWYgKG1BaWRsSUNhbWVyYVNlcnZpY2UgPT0gbnVsbHB0cikgeworICAgICAgICBfaGlkbF9jYihIU3RhdHVzOjpVTktOT1dOX0VSUk9SLCB7fSk7CisgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfQorICAgIGlmIChoQ3NMaXN0ZW5lciA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlcyBsaXN0ZW5lciBtdXN0IG5vdCBiZSBOVUxMIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgX2hpZGxfY2IoSFN0YXR1czo6SUxMRUdBTF9BUkdVTUVOVCwge30pOworICAgICAgICByZXR1cm4gVm9pZCgpOworICAgIH0KKyAgICBzcDxoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2VMaXN0ZW5lcj4gY3NMaXN0ZW5lciA9IG51bGxwdHI7CisgICAgLy8gQ2hlY2sgdGhlIGNhY2hlIGZvciBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgY2FsbGJhY2tzCisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtTGlzdGVuZXJMaXN0TG9jayk7CisgICAgICAgIGNzTGlzdGVuZXIgPSBzZWFyY2hMaXN0ZW5lckNhY2hlTG9ja2VkKGhDc0xpc3RlbmVyKTsKKyAgICAgICAgaWYgKGNzTGlzdGVuZXIgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgLy8gV3JhcCBhbiBoQ3NMaXN0ZW5lciB3aXRoIEFpZGxDYW1lcmFTZXJ2aWNlTGlzdGVuZXIgYW5kIHBhc3MgaXQgdG8KKyAgICAgICAgICAgIC8vIENhbWVyYVNlcnZpY2UuCisgICAgICAgICAgICBjc0xpc3RlbmVyID0gbmV3IEgyQkNhbWVyYVNlcnZpY2VMaXN0ZW5lcihoQ3NMaXN0ZW5lcik7CisgICAgICAgICAgICAvLyBBZGQgdG8gY2FjaGUKKyAgICAgICAgICAgIGFkZFRvTGlzdGVuZXJDYWNoZUxvY2tlZChoQ3NMaXN0ZW5lciwgY3NMaXN0ZW5lcik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IFRyeWluZyB0byBhZGQgYSBsaXN0ZW5lciAlcCBhbHJlYWR5IHJlZ2lzdGVyZWQiLAorICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBoQ3NMaXN0ZW5lci5nZXQoKSk7CisgICAgICAgICAgICBfaGlkbF9jYihIU3RhdHVzOjpJTExFR0FMX0FSR1VNRU5ULCB7fSk7CisgICAgICAgICAgICByZXR1cm4gVm9pZCgpOworICAgICAgICB9CisgICAgfQorICAgIHN0ZDo6dmVjdG9yPGhhcmR3YXJlOjpDYW1lcmFTdGF0dXM+IGNhbWVyYVN0YXR1c0FuZElkc3t9OworICAgIGJpbmRlcjo6U3RhdHVzIHNlcnZpY2VSZXQgPSBtQWlkbElDYW1lcmFTZXJ2aWNlLT5hZGRMaXN0ZW5lcihjc0xpc3RlbmVyLCAmY2FtZXJhU3RhdHVzQW5kSWRzKTsKKyAgICBIU3RhdHVzIHN0YXR1cyA9IEhTdGF0dXM6Ok5PX0VSUk9SOworICAgIGlmICghc2VydmljZVJldC5pc09rKCkpIHsKKyAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIGFkZCBjYW1lcmEgZGV2aWNlIHN0YXR1cyBsaXN0ZW5lciIsIF9fRlVOQ1RJT05fXyk7CisgICAgICBzdGF0dXMgPSBCMkhTdGF0dXMoc2VydmljZVJldCk7CisgICAgICBfaGlkbF9jYihzdGF0dXMsIHt9KTsKKyAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfQorICAgIGhpZGxfdmVjPEhDYW1lcmFTdGF0dXNBbmRJZD4gaENhbWVyYVN0YXR1c0FuZElkczsKKyAgICAvL0NvbnZlcnQgY2FtZXJhU3RhdHVzQW5kSWRzIHRvIEhJREwgYW5kIGNhbGwgY2FsbGJhY2sKKyAgICBjb252ZXJ0VG9IaWRsKGNhbWVyYVN0YXR1c0FuZElkcywgJmhDYW1lcmFTdGF0dXNBbmRJZHMpOworICAgIF9oaWRsX2NiKHN0YXR1cywgaENhbWVyYVN0YXR1c0FuZElkcyk7CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworUmV0dXJuPEhTdGF0dXM+IEhpZGxDYW1lcmFTZXJ2aWNlOjpyZW1vdmVMaXN0ZW5lcihjb25zdCBzcDxIQ2FtZXJhU2VydmljZUxpc3RlbmVyPiYgaENzTGlzdGVuZXIpIHsKKyAgICBpZiAoaENzTGlzdGVuZXIgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXMgbGlzdGVuZXIgbXVzdCBub3QgYmUgTlVMTCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBIU3RhdHVzOjpJTExFR0FMX0FSR1VNRU5UOworICAgIH0KKyAgICBzcDxJQ2FtZXJhU2VydmljZUxpc3RlbmVyPiBjc0xpc3RlbmVyID0gbnVsbHB0cjsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1MaXN0ZW5lckxpc3RMb2NrKTsKKyAgICAgICAgY3NMaXN0ZW5lciA9IHNlYXJjaExpc3RlbmVyQ2FjaGVMb2NrZWQoaENzTGlzdGVuZXIsIC8qcmVtb3ZlSWZGb3VuZCovdHJ1ZSk7CisgICAgfQorICAgIGlmIChjc0xpc3RlbmVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgICBtQWlkbElDYW1lcmFTZXJ2aWNlLT5yZW1vdmVMaXN0ZW5lcihjc0xpc3RlbmVyKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiJXMgUmVtb3ZpbmcgdW5yZWdpc3RlcmVkIGxpc3RlbmVyICVwIiwgX19GVU5DVElPTl9fLCBoQ3NMaXN0ZW5lci5nZXQoKSk7CisgICAgICAgIHJldHVybiBIU3RhdHVzOjpJTExFR0FMX0FSR1VNRU5UOworICAgIH0KKyAgICByZXR1cm4gSFN0YXR1czo6Tk9fRVJST1I7Cit9CisKK1JldHVybjx2b2lkPiBIaWRsQ2FtZXJhU2VydmljZTo6Z2V0Q2FtZXJhVmVuZG9yVGFnU2VjdGlvbnMoZ2V0Q2FtZXJhVmVuZG9yVGFnU2VjdGlvbnNfY2IgX2hpZGxfY2IpIHsKKyAgICBoaWRsX3ZlYzxIVmVuZG9yVGFnU2VjdGlvbj4gaFZlbmRvclRhZ1NlY3Rpb25zOworICAgIC8vIFRPRE86IENvdWxkIHRoaXMgYmUganVzdCBjcmVhdGVkIG9uIHRoZSBzdGFjayBzaW5jZSB3ZSBkb24ndCBzZXQgaXQgdG8KKyAgICAvLyAgICAgICBnbG9iYWwgY2FjaGUgb3IgYW55dGhpbmcgPworICAgIEhTdGF0dXMgaFN0YXR1cyA9IEhTdGF0dXM6Ok5PX0VSUk9SOworICAgIHNwPFZlbmRvclRhZ0Rlc2NyaXB0b3I+IGRlc2MgPSBuZXcgVmVuZG9yVGFnRGVzY3JpcHRvcigpOworICAgIGJpbmRlcjo6U3RhdHVzIHNlcnZpY2VSZXQgPSBtQWlkbElDYW1lcmFTZXJ2aWNlLT5nZXRDYW1lcmFWZW5kb3JUYWdEZXNjcmlwdG9yKGRlc2MuZ2V0KCkpOworCisgICAgaWYgKCFzZXJ2aWNlUmV0LmlzT2soKSkgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBnZXQgVmVuZG9yVGFnRGVzY3JpcHRvciIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIF9oaWRsX2NiKEIySFN0YXR1cyhzZXJ2aWNlUmV0KSwgaFZlbmRvclRhZ1NlY3Rpb25zKTsKKyAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisKKyAgICBjb25zdCBTb3J0ZWRWZWN0b3I8U3RyaW5nOD4qIHNlY3Rpb25OYW1lcyA9IGRlc2MtPmdldEFsbFNlY3Rpb25OYW1lcygpOworICAgIHNpemVfdCBudW1TZWN0aW9ucyA9IHNlY3Rpb25OYW1lcy0+c2l6ZSgpOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPEhWZW5kb3JUYWc+PiB0YWdzQnlTZWN0aW9uKG51bVNlY3Rpb25zKTsKKyAgICBpbnQgdGFnQ291bnQgPSBkZXNjLT5nZXRUYWdDb3VudCgpOworICAgIHN0ZDo6dmVjdG9yPHVpbnQzMl90PiB0YWdzKHRhZ0NvdW50KTsKKyAgICBkZXNjLT5nZXRUYWdBcnJheSh0YWdzLmRhdGEoKSk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0YWdDb3VudDsgaSsrKSB7CisgICAgICAgIEhWZW5kb3JUYWcgdnQ7CisgICAgICAgIHZ0LnRhZ0lkID0gdGFnc1tpXTsKKyAgICAgICAgdnQudGFnTmFtZSA9IGRlc2MtPmdldFRhZ05hbWUodGFnc1tpXSk7CisgICAgICAgIHZ0LnRhZ1R5cGUgPSAoSENhbWVyYU1ldGFkYXRhVHlwZSkgZGVzYy0+Z2V0VGFnVHlwZSh0YWdzW2ldKTsKKyAgICAgICAgc3NpemVfdCBzZWN0aW9uSWR4ID0gZGVzYy0+Z2V0U2VjdGlvbkluZGV4KHRhZ3NbaV0pOworICAgICAgICB0YWdzQnlTZWN0aW9uW3NlY3Rpb25JZHhdLnB1c2hfYmFjayh2dCk7CisgICAgfQorICAgIGhWZW5kb3JUYWdTZWN0aW9ucy5yZXNpemUobnVtU2VjdGlvbnMpOworICAgIGZvciAoc2l6ZV90IHMgPSAwOyBzIDwgbnVtU2VjdGlvbnM7IHMrKykgeworICAgICAgICBoVmVuZG9yVGFnU2VjdGlvbnNbc10uc2VjdGlvbk5hbWUgPSAoKnNlY3Rpb25OYW1lcylbc10uc3RyaW5nKCk7CisgICAgICAgIGhWZW5kb3JUYWdTZWN0aW9uc1tzXS50YWdzID0gdGFnc0J5U2VjdGlvbltzXTsKKyAgICB9CisgICAgX2hpZGxfY2IoaFN0YXR1cywgaFZlbmRvclRhZ1NlY3Rpb25zKTsKKyAgICByZXR1cm4gVm9pZCgpOworfQorCit9IC8vIGltcGxlbWVudGF0aW9uCit9IC8vIFYyXzAKK30gLy8gc2VydmljZQorfSAvLyBjYW1lcmFzZXJ2aWNlCit9IC8vIGZyYW1ld29ya3MKK30gLy8gYW5kcm9pZAorCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0hpZGxDYW1lcmFTZXJ2aWNlLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0hpZGxDYW1lcmFTZXJ2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWVhZDBiYwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvSGlkbENhbWVyYVNlcnZpY2UuaApAQCAtMCwwICsxLDk4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0ZSQU1FV09SS1NfQ0FNRVJBU0VSVklDRV9WMl8wX0NBTUVSQVNFUlZJQ0VfSAorI2RlZmluZSBBTkRST0lEX0ZSQU1FV09SS1NfQ0FNRVJBU0VSVklDRV9WMl8wX0NBTUVSQVNFUlZJQ0VfSAorCisjaW5jbHVkZSA8bXV0ZXg+CisjaW5jbHVkZSA8dGhyZWFkPgorCisjaW5jbHVkZSA8YW5kcm9pZC9mcmFtZXdvcmtzL2NhbWVyYXNlcnZpY2UvY29tbW9uLzIuMC90eXBlcy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL3NlcnZpY2UvMi4wL0lDYW1lcmFTZXJ2aWNlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9mcmFtZXdvcmtzL2NhbWVyYXNlcnZpY2Uvc2VydmljZS8yLjAvdHlwZXMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2ZyYW1ld29ya3MvY2FtZXJhc2VydmljZS9kZXZpY2UvMi4wL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxoaWRsL1N0YXR1cy5oPgorCisjaW5jbHVkZSA8Q2FtZXJhU2VydmljZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgZnJhbWV3b3JrcyB7CituYW1lc3BhY2UgY2FtZXJhc2VydmljZSB7CituYW1lc3BhY2Ugc2VydmljZSB7CituYW1lc3BhY2UgVjJfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCit1c2luZyBoYXJkd2FyZTo6aGlkbF9zdHJpbmc7Cit1c2luZyBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjsKK3VzaW5nIGhhcmR3YXJlOjpSZXR1cm47CisKK3VzaW5nIEhDYW1lcmFEZXZpY2VDYWxsYmFjayA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6SUNhbWVyYURldmljZUNhbGxiYWNrOwordXNpbmcgSENhbWVyYU1ldGFkYXRhID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6c2VydmljZTo6VjJfMDo6Q2FtZXJhTWV0YWRhdGE7Cit1c2luZyBIQ2FtZXJhU2VydmljZSA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OnNlcnZpY2U6OlYyXzA6OklDYW1lcmFTZXJ2aWNlOwordXNpbmcgSENhbWVyYVNlcnZpY2VMaXN0ZW5lciA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OnNlcnZpY2U6OlYyXzA6OklDYW1lcmFTZXJ2aWNlTGlzdGVuZXI7Cit1c2luZyBIU3RhdHVzID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6Y29tbW9uOjpWMl8wOjpTdGF0dXM7Cit1c2luZyBIQ2FtZXJhU3RhdHVzQW5kSWQgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpzZXJ2aWNlOjpWMl8wOjpDYW1lcmFTdGF0dXNBbmRJZDsKKworc3RydWN0IEhpZGxDYW1lcmFTZXJ2aWNlIGZpbmFsIDogcHVibGljIEhDYW1lcmFTZXJ2aWNlIHsKKworICAgIH5IaWRsQ2FtZXJhU2VydmljZSgpIHsgfTsKKworICAgIC8vIE1ldGhvZHMgZnJvbSA6OmFuZHJvaWQ6OmZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OnNlcnZpY2U6OlYyLjA6OklDYW1lcmFTZXJ2aWNlIGZvbGxvdy4KKworICAgIFJldHVybjx2b2lkPiBjb25uZWN0RGV2aWNlKGNvbnN0IHNwPEhDYW1lcmFEZXZpY2VDYWxsYmFjaz4mIGNhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZGxfc3RyaW5nJiBjYW1lcmFJZCwgY29ubmVjdERldmljZV9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisKKyAgICBSZXR1cm48dm9pZD4gYWRkTGlzdGVuZXIoY29uc3Qgc3A8SENhbWVyYVNlcnZpY2VMaXN0ZW5lcj4mIGxpc3RlbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRMaXN0ZW5lcl9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisKKyAgICBSZXR1cm48SFN0YXR1cz4gcmVtb3ZlTGlzdGVuZXIoY29uc3Qgc3A8SENhbWVyYVNlcnZpY2VMaXN0ZW5lcj4mIGxpc3RlbmVyKSBvdmVycmlkZTsKKworICAgIFJldHVybjx2b2lkPiBnZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoY29uc3QgaGlkbF9zdHJpbmcmIGNhbWVyYUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKworICAgIFJldHVybjx2b2lkPiBnZXRDYW1lcmFWZW5kb3JUYWdTZWN0aW9ucyhnZXRDYW1lcmFWZW5kb3JUYWdTZWN0aW9uc19jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisKKyAgICAvLyBUaGlzIG1ldGhvZCBzaG91bGQgb25seSBiZSBjYWxsZWQgYnkgdGhlIGNhbWVyYXNlcnZlcnMgbWFpbiB0aHJlYWQgdG8KKyAgICAvLyBpbnN0YW50aWF0ZSB0aGUgaGlkbCBjYW1lcmFzZXJ2ZXIuCisgICAgc3RhdGljIHNwPEhpZGxDYW1lcmFTZXJ2aWNlPiBnZXRJbnN0YW5jZShhbmRyb2lkOjpDYW1lcmFTZXJ2aWNlICpjcyk7CisKK3ByaXZhdGU6CisgICAgSGlkbENhbWVyYVNlcnZpY2UoYW5kcm9pZDo6Q2FtZXJhU2VydmljZSAqY3MpIDogbUFpZGxJQ2FtZXJhU2VydmljZShjcykgeyB9OworCisgICAgc3A8aGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlTGlzdGVuZXI+IHNlYXJjaExpc3RlbmVyQ2FjaGVMb2NrZWQoCisgICAgICAgIHNwPEhDYW1lcmFTZXJ2aWNlTGlzdGVuZXI+IGxpc3RlbmVyLCAvKnJlbW92ZUlmRm91bmQqLyBib29sIHNob3VsZFJlbW92ZSA9IGZhbHNlKTsKKworICAgIHZvaWQgYWRkVG9MaXN0ZW5lckNhY2hlTG9ja2VkKHNwPEhDYW1lcmFTZXJ2aWNlTGlzdGVuZXI+IGhMaXN0ZW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2VMaXN0ZW5lcj4gY3NMaXN0ZW5lcik7CisKKyAgICBhbmRyb2lkOjpDYW1lcmFTZXJ2aWNlICpjb25zdCBtQWlkbElDYW1lcmFTZXJ2aWNlID0gbnVsbHB0cjsKKworICAgIE11dGV4IG1MaXN0ZW5lckxpc3RMb2NrOworCisgICAgdXNpbmcgSElMaXN0ZW5lcnMgPQorICAgICAgICBzdGQ6OnBhaXI8c3A8SENhbWVyYVNlcnZpY2VMaXN0ZW5lcj4sIHNwPElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI+PjsKKyAgICBzdGQ6Omxpc3Q8SElMaXN0ZW5lcnM+IG1MaXN0ZW5lcnM7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24KK30gIC8vIG5hbWVzcGFjZSBWMl8wCit9ICAvLyBuYW1lc3BhY2Ugc2VydmljZQorfSAgLy8gbmFtZXNwYWNlIGNhbWVyYXNlcnZpY2UKK30gIC8vIG5hbWVzcGFjZSBmcmFtZXdvcmtzCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfRlJBTUVXT1JLU19DQU1FUkFTRVJWSUNFX1YyXzBfQ0FNRVJBU0VSVklDRV9ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS90ZXN0cy9BbmRyb2lkLm1rIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdGVzdHMvQW5kcm9pZC5tawppbmRleCBmNzcwNjljLi44ZDgwZmYxIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS90ZXN0cy9BbmRyb2lkLm1rCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3Rlc3RzL0FuZHJvaWQubWsKQEAgLTM4LDYgKzM4LDcgQEAKIExPQ0FMX0NGTEFHUyArPSAtV2FsbCAtV2V4dHJhIC1XZXJyb3IKIAogTE9DQUxfTU9EVUxFOj0gY2FtZXJhc2VydmljZV90ZXN0CitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGRldmljZS10ZXN0cwogTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKIAogaW5jbHVkZSAkKEJVSUxEX05BVElWRV9URVNUKQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdGVzdHMvQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyVGVzdC5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS90ZXN0cy9DYW1lcmFQcm92aWRlck1hbmFnZXJUZXN0LmNwcAppbmRleCBlZjkzZDlhLi4wMDg2YzZjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS90ZXN0cy9DYW1lcmFQcm92aWRlck1hbmFnZXJUZXN0LmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS90ZXN0cy9DYW1lcmFQcm92aWRlck1hbmFnZXJUZXN0LmNwcApAQCAtMTYzLDcgKzE2Myw3IEBACiAgICAgICAgIG1UZXN0Q2FtZXJhUHJvdmlkZXIgPSBwcm92aWRlcjsKICAgICB9CiAKLSAgICBzdGQ6OnN0cmluZyBtTGFzdFJlcXVlc3RlZFNlcnZpY2VOYW1lOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBtTGFzdFJlcXVlc3RlZFNlcnZpY2VOYW1lczsKIAogICAgIHZpcnR1YWwgflRlc3RJbnRlcmFjdGlvblByb3h5KCkge30KIApAQCAtMTc3LDcgKzE3Nyw3IEBACiAKICAgICB2aXJ0dWFsIHNwPGhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXI+IGdldFNlcnZpY2UoCiAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmc2VydmljZU5hbWUpIG92ZXJyaWRlIHsKLSAgICAgICAgbUxhc3RSZXF1ZXN0ZWRTZXJ2aWNlTmFtZSA9IHNlcnZpY2VOYW1lOworICAgICAgICBtTGFzdFJlcXVlc3RlZFNlcnZpY2VOYW1lcy5wdXNoX2JhY2soc2VydmljZU5hbWUpOwogICAgICAgICByZXR1cm4gbVRlc3RDYW1lcmFQcm92aWRlcjsKICAgICB9CiAKQEAgLTIxMCw5ICsyMTAsMTggQEAKICAgICByZXMgPSBwcm92aWRlck1hbmFnZXItPmluaXRpYWxpemUoc3RhdHVzTGlzdGVuZXIsICZzZXJ2aWNlUHJveHkpOwogICAgIEFTU0VSVF9FUShyZXMsIE9LKSA8PCAiVW5hYmxlIHRvIGluaXRpYWxpemUgcHJvdmlkZXIgbWFuYWdlciI7CiAKLSAgICBoYXJkd2FyZTo6aGlkbF9zdHJpbmcgbGVnYWN5SW5zdGFuY2VOYW1lID0gImxlZ2FjeS8wIjsKLSAgICBBU1NFUlRfRVEoc2VydmljZVByb3h5Lm1MYXN0UmVxdWVzdGVkU2VydmljZU5hbWUsIGxlZ2FjeUluc3RhbmNlTmFtZSkgPDwKKyAgICBzdGQ6OnN0cmluZyBsZWdhY3lJbnN0YW5jZU5hbWUgPSAibGVnYWN5LzAiOworICAgIHN0ZDo6c3RyaW5nIGV4dGVybmFsSW5zdGFuY2VOYW1lID0gImV4dGVybmFsLzAiOworICAgIGJvb2wgZ290TGVnYWN5ID0gZmFsc2U7CisgICAgYm9vbCBnb3RFeHRlcm5hbCA9IGZhbHNlOworICAgIGZvciAoYXV0byYgc2VydmljZU5hbWUgOiBzZXJ2aWNlUHJveHkubUxhc3RSZXF1ZXN0ZWRTZXJ2aWNlTmFtZXMpIHsKKyAgICAgICAgaWYgKHNlcnZpY2VOYW1lID09IGxlZ2FjeUluc3RhbmNlTmFtZSkgZ290TGVnYWN5ID0gdHJ1ZTsKKyAgICAgICAgaWYgKHNlcnZpY2VOYW1lID09IGV4dGVybmFsSW5zdGFuY2VOYW1lKSBnb3RFeHRlcm5hbCA9IHRydWU7CisgICAgfQorICAgIEFTU0VSVF9UUlVFKGdvdExlZ2FjeSkgPDwKICAgICAgICAgICAgICJMZWdhY3kgaW5zdGFuY2Ugbm90IHJlcXVlc3RlZCBmcm9tIHNlcnZpY2UgbWFuYWdlciI7CisgICAgQVNTRVJUX1RSVUUoZ290RXh0ZXJuYWwpIDw8CisgICAgICAgICAgICAiRXh0ZXJuYWwgaW5zdGFuY2Ugbm90IHJlcXVlc3RlZCBmcm9tIHNlcnZpY2UgbWFuYWdlciI7CiAKICAgICBoYXJkd2FyZTo6aGlkbF9zdHJpbmcgdGVzdFByb3ZpZGVyRnFJbnRlcmZhY2VOYW1lID0KICAgICAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5wcm92aWRlckAyLjQ6OklDYW1lcmFQcm92aWRlciI7CkBAIC0yMjEsNyArMjMwLDcgQEAKICAgICAgICAgICAgIHRlc3RQcm92aWRlckZxSW50ZXJmYWNlTmFtZSwKICAgICAgICAgICAgIHRlc3RQcm92aWRlckluc3RhbmNlTmFtZSwgZmFsc2UpOwogCi0gICAgQVNTRVJUX0VRKHNlcnZpY2VQcm94eS5tTGFzdFJlcXVlc3RlZFNlcnZpY2VOYW1lLCB0ZXN0UHJvdmlkZXJJbnN0YW5jZU5hbWUpIDw8CisgICAgQVNTRVJUX0VRKHNlcnZpY2VQcm94eS5tTGFzdFJlcXVlc3RlZFNlcnZpY2VOYW1lcy5iYWNrKCksIHRlc3RQcm92aWRlckluc3RhbmNlTmFtZSkgPDwKICAgICAgICAgICAgICJJbmNvcnJlY3QgaW5zdGFuY2UgcmVxdWVzdGVkIGZyb20gc2VydmljZSBtYW5hZ2VyIjsKIH0KIApAQCAtMjU1LDcgKzI2NCw3IEBACiAgICAgICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEucHJvdmlkZXJAMi40OjpJQ2FtZXJhUHJvdmlkZXIiOwogICAgIHNlcnZpY2VQcm94eS5tTWFuYWdlck5vdGlmaWNhdGlvbkludGVyZmFjZS0+b25SZWdpc3RyYXRpb24oCiAgICAgICAgICAgICB0ZXN0UHJvdmlkZXJGcUludGVyZmFjZU5hbWUsIHRlc3RQcm92aWRlckluc3RhbmNlTmFtZSwgZmFsc2UpOwotICAgIEFTU0VSVF9FUShzZXJ2aWNlUHJveHkubUxhc3RSZXF1ZXN0ZWRTZXJ2aWNlTmFtZSwgdGVzdFByb3ZpZGVySW5zdGFuY2VOYW1lKSA8PAorICAgIEFTU0VSVF9FUShzZXJ2aWNlUHJveHkubUxhc3RSZXF1ZXN0ZWRTZXJ2aWNlTmFtZXMuYmFjaygpLCB0ZXN0UHJvdmlkZXJJbnN0YW5jZU5hbWUpIDw8CiAgICAgICAgICAgICAiSW5jb3JyZWN0IGluc3RhbmNlIHJlcXVlc3RlZCBmcm9tIHNlcnZpY2UgbWFuYWdlciI7CiAKICAgICBoYXJkd2FyZTo6aGlkbF9zdHJpbmcgc2VjdGlvbk5hbWVTZWNvbmQgPSAiU2Vjb25kVmVuZG9yVGVzdFNlY3Rpb24iOwpAQCAtMjczLDcgKzI4Miw3IEBACiAgICAgaGFyZHdhcmU6OmhpZGxfc3RyaW5nIHRlc3RQcm92aWRlclNlY29uZEluc3RhbmNlTmFtZSA9ICJ0ZXN0Mi8wIjsKICAgICBzZXJ2aWNlUHJveHkubU1hbmFnZXJOb3RpZmljYXRpb25JbnRlcmZhY2UtPm9uUmVnaXN0cmF0aW9uKAogICAgICAgICAgICAgdGVzdFByb3ZpZGVyRnFJbnRlcmZhY2VOYW1lLCB0ZXN0UHJvdmlkZXJTZWNvbmRJbnN0YW5jZU5hbWUsIGZhbHNlKTsKLSAgICBBU1NFUlRfRVEoc2VydmljZVByb3h5Lm1MYXN0UmVxdWVzdGVkU2VydmljZU5hbWUsCisgICAgQVNTRVJUX0VRKHNlcnZpY2VQcm94eS5tTGFzdFJlcXVlc3RlZFNlcnZpY2VOYW1lcy5iYWNrKCksCiAgICAgICAgICAgICAgIHRlc3RQcm92aWRlclNlY29uZEluc3RhbmNlTmFtZSkgPDwKICAgICAgICAgICAgICJJbmNvcnJlY3QgaW5zdGFuY2UgcmVxdWVzdGVkIGZyb20gc2VydmljZSBtYW5hZ2VyIjsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdGVzdHMvRGlzdG9ydGlvbk1hcHBlclRlc3QuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdGVzdHMvRGlzdG9ydGlvbk1hcHBlclRlc3QuY3BwCmluZGV4IDJhNjg5YzYuLjU0OTM1YzkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3Rlc3RzL0Rpc3RvcnRpb25NYXBwZXJUZXN0LmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS90ZXN0cy9EaXN0b3J0aW9uTWFwcGVyVGVzdC5jcHAKQEAgLTE2Nyw2ICsxNjcsMzAgQEAKICAgICB9CiB9CiAKK1RFU1QoRGlzdG9ydGlvbk1hcHBlclRlc3QsIENsYW1wQ29uc2lzdGVuY3kpIHsKKyAgICBzdGF0dXNfdCByZXM7CisKKyAgICBzdGQ6OmFycmF5PGludDMyX3QsIDQ+IGFjdGl2ZUFycmF5ID0gezAsIDAsIDQwMzIsIDMwMjR9OworICAgIERpc3RvcnRpb25NYXBwZXIgbTsKKyAgICBzZXR1cFRlc3RNYXBwZXIoJm0sIGlkZW50aXR5RGlzdG9ydGlvbiwgdGVzdElDYWwsIC8qYWN0aXZlQXJyYXkqLyBhY3RpdmVBcnJheS5kYXRhKCksCisgICAgICAgICAgICAvKnByZUNvcnJlY3Rpb25BY3RpdmVBcnJheSovIGFjdGl2ZUFycmF5LmRhdGEoKSk7CisKKyAgICBhdXRvIHJlY3RzT3JpZyA9IGFjdGl2ZUFycmF5OworICAgIHJlcyA9IG0ubWFwQ29ycmVjdGVkUmVjdFRvUmF3KGFjdGl2ZUFycmF5LmRhdGEoKSwgMSwgLypjbGFtcCovdHJ1ZSwgLypzaW1wbGUqLyB0cnVlKTsKKyAgICBBU1NFUlRfRVEocmVzLCBPSyk7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGFjdGl2ZUFycmF5LnNpemUoKTsgaSsrKSB7CisgICAgICAgIEVYUEVDVF9FUShhY3RpdmVBcnJheVtpXSwgcmVjdHNPcmlnW2ldKTsKKyAgICB9CisKKyAgICByZXMgPSBtLm1hcFJhd1JlY3RUb0NvcnJlY3RlZChhY3RpdmVBcnJheS5kYXRhKCksIDEsIC8qY2xhbXAqL3RydWUsIC8qc2ltcGxlKi8gdHJ1ZSk7CisgICAgQVNTRVJUX0VRKHJlcywgT0spOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhY3RpdmVBcnJheS5zaXplKCk7IGkrKykgeworICAgICAgICBFWFBFQ1RfRVEoYWN0aXZlQXJyYXlbaV0sIHJlY3RzT3JpZ1tpXSk7CisgICAgfQorfQorCiBURVNUKERpc3RvcnRpb25NYXBwZXJUZXN0LCBTaW1wbGVUcmFuc2Zvcm0pIHsKICAgICBzdGF0dXNfdCByZXM7CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL0NhbWVyYVRocmVhZFN0YXRlLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL0NhbWVyYVRocmVhZFN0YXRlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOWUzNDRiCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvQ2FtZXJhVGhyZWFkU3RhdGUuY3BwCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiQ2FtZXJhVGhyZWFkU3RhdGUuaCIKKyNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KKyNpbmNsdWRlIDxod2JpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2ludCBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1VpZCgpIHsKKyAgICBpZiAoaGFyZHdhcmU6OklQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmlzU2VydmluZ0NhbGwoKSkgeworICAgICAgICByZXR1cm4gaGFyZHdhcmU6OklQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKTsKKyAgICB9CisgICAgcmV0dXJuIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKTsKK30KKworaW50IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCkgeworICAgIGlmIChoYXJkd2FyZTo6SVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+aXNTZXJ2aW5nQ2FsbCgpKSB7CisgICAgICAgIHJldHVybiBoYXJkd2FyZTo6SVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOworICAgIH0KKyAgICByZXR1cm4gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOworfQorCitpbnQ2NF90IENhbWVyYVRocmVhZFN0YXRlOjpjbGVhckNhbGxpbmdJZGVudGl0eSgpIHsKKyAgICBpZiAoaGFyZHdhcmU6OklQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmlzU2VydmluZ0NhbGwoKSkgeworICAgICAgICByZXR1cm4gaGFyZHdhcmU6OklQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CisgICAgfQorICAgIHJldHVybiBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5jbGVhckNhbGxpbmdJZGVudGl0eSgpOworfQorCit2b2lkIENhbWVyYVRocmVhZFN0YXRlOjpyZXN0b3JlQ2FsbGluZ0lkZW50aXR5KGludDY0X3QgdG9rZW4pIHsKKyAgICBpZiAoaGFyZHdhcmU6OklQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmlzU2VydmluZ0NhbGwoKSkgeworICAgICAgICBoYXJkd2FyZTo6SVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+cmVzdG9yZUNhbGxpbmdJZGVudGl0eSh0b2tlbik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+cmVzdG9yZUNhbGxpbmdJZGVudGl0eSh0b2tlbik7CisgICAgfQorICAgIHJldHVybjsKK30KKworfSAvLyBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9DYW1lcmFUaHJlYWRTdGF0ZS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvQ2FtZXJhVGhyZWFkU3RhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWE3MGRlCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvQ2FtZXJhVGhyZWFkU3RhdGUuaApAQCAtMCwwICsxLDMxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CitjbGFzcyBDYW1lcmFUaHJlYWRTdGF0ZSB7CitwdWJsaWM6CisgIHN0YXRpYyBpbnQ2NF90IGNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CisKKyAgc3RhdGljIHZvaWQgcmVzdG9yZUNhbGxpbmdJZGVudGl0eShpbnQ2NF90IHRva2VuKTsKKworICBzdGF0aWMgaW50IGdldENhbGxpbmdVaWQoKTsKKworICBzdGF0aWMgaW50IGdldENhbGxpbmdQaWQoKTsKK307CisKK30gLy8gYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvVGFnTW9uaXRvci5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9UYWdNb25pdG9yLmNwcAppbmRleCBjMGEzNTNmLi5mNGM0OWVjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9UYWdNb25pdG9yLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9UYWdNb25pdG9yLmNwcApAQCAtNDksNyArNDksOCBAQAogICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Nb25pdG9yTXV0ZXgpOwogCiAgICAgLy8gRXhwYW5kIHNob3J0aGFuZHMKLSAgICBpZiAoc3NpemVfdCBpZHggPSB0YWdOYW1lcy5maW5kKCIzYSIpICE9IC0xKSB7CisgICAgc3NpemVfdCBpZHggPSB0YWdOYW1lcy5maW5kKCIzYSIpOworICAgIGlmIChpZHggIT0gLTEpIHsKICAgICAgICAgc3NpemVfdCBlbmQgPSB0YWdOYW1lcy5maW5kKCIsIiwgaWR4KTsKICAgICAgICAgY2hhciogc3RhcnQgPSB0YWdOYW1lcy5sb2NrQnVmZmVyKHRhZ05hbWVzLnNpemUoKSk7CiAgICAgICAgIHN0YXJ0W2lkeF0gPSAnXDAnOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFhbmFseXRpY3MvTWVkaWFBbmFseXRpY3NTZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL01lZGlhQW5hbHl0aWNzU2VydmljZS5jcHAKaW5kZXggNGIwNTM5NS4uYWU4MzJiYSAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFhbmFseXRpY3MvTWVkaWFBbmFseXRpY3NTZXJ2aWNlLmNwcAorKysgYi9zZXJ2aWNlcy9tZWRpYWFuYWx5dGljcy9NZWRpYUFuYWx5dGljc1NlcnZpY2UuY3BwCkBAIC0yNiw2ICsyNiw3IEBACiAjaW5jbHVkZSA8c3lzL3N0YXQuaD4KICNpbmNsdWRlIDxzeXMvdGltZS5oPgogI2luY2x1ZGUgPGRpcmVudC5oPgorI2luY2x1ZGUgPHB0aHJlYWQuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KIAogI2luY2x1ZGUgPHN0cmluZy5oPgpAQCAtODAsMTEgKzgxLDE4IEBACiAgICAgdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmNvbnRlbnQ6OnBtOwogCiAvLyBpbmRpdmlkdWFsIHJlY29yZHMga2VwdCBpbiBtZW1vcnk6IGFnZSBvciBjb3VudAotLy8gYWdlOiA8PSAzNiBob3VycyAoMS41IGRheXMpCisvLyBhZ2U6IDw9IDI4IGhvdXJzICgxIDEvNiBkYXlzKQogLy8gY291bnQ6IGhhcmQgbGltaXQgb2YgIyByZWNvcmRzCiAvLyAoMCBmb3IgZWl0aGVyIG9mIHRoZXNlIGRpc2FibGVzIHRoYXQgdGhyZXNob2xkKQotc3RhdGljIGNvbnN0IG5zZWNzX3Qga01heFJlY29yZEFnZU5zID0gIDM2ICogMzYwMCAqICgxMDAwKjEwMDAqMTAwMGxsKTsKLXN0YXRpYyBjb25zdCBpbnQga01heFJlY29yZHMgICAgPSAwOworLy8KK3N0YXRpYyBjb25zdGV4cHIgbnNlY3NfdCBrTWF4UmVjb3JkQWdlTnMgPSAgMjggKiAzNjAwICogKDEwMDAqMTAwMCoxMDAwbGwpOworc3RhdGljIGNvbnN0ZXhwciBpbnQga01heFJlY29yZHMgICAgPSAwOworCisvLyBtYXggd2UgZXhwaXJlIGluIGEgc2luZ2xlIGNhbGwsIHRvIGNvbnN0cmFpbiBob3cgbG9uZyB3ZSBob2xkIHRoZQorLy8gbXV0ZXgsIHdoaWNoIGFsc28gY29uc3RyYWlucyBob3cgbG9uZyBhIGNsaWVudCBtaWdodCB3YWl0Lgorc3RhdGljIGNvbnN0ZXhwciBpbnQga01heEV4cGlyZWRBdE9uY2UgPSA1MDsKKworLy8gVE9ETzogbmVlZCB0byBsb29rIGF0IHR1bmluZyBrTWF4UmVjb3JkcyBhbmQgZnJpZW5kcyBmb3IgbG93LW1lbW9yeSBkZXZpY2VzCiAKIHN0YXRpYyBjb25zdCBjaGFyICprU2VydmljZU5hbWUgPSAibWVkaWEubWV0cmljcyI7CiAKQEAgLTk2LDYgKzEwNCw3IEBACiBNZWRpYUFuYWx5dGljc1NlcnZpY2U6Ok1lZGlhQW5hbHl0aWNzU2VydmljZSgpCiAgICAgICAgIDogbU1heFJlY29yZHMoa01heFJlY29yZHMpLAogICAgICAgICAgIG1NYXhSZWNvcmRBZ2VOcyhrTWF4UmVjb3JkQWdlTnMpLAorICAgICAgICAgIG1NYXhSZWNvcmRzRXhwaXJlZEF0T25jZShrTWF4RXhwaXJlZEF0T25jZSksCiAgICAgICAgICAgbUR1bXBQcm90byhNZWRpYUFuYWx5dGljc0l0ZW06OlBST1RPX1YxKSwKICAgICAgICAgICBtRHVtcFByb3RvRGVmYXVsdChNZWRpYUFuYWx5dGljc0l0ZW06OlBST1RPX1YxKSB7CiAKQEAgLTQzMiwyMyArNDQxLDI5IEBACiAvLwogLy8gT3VyIENoZWFwIGluLWNvcmUsIG5vbi1wZXJzaXN0ZW50IHJlY29yZHMgbWFuYWdlbWVudC4KIAotLy8gaW5zZXJ0IGFwcHJvcHJpYXRlbHkgaW50byBxdWV1ZQotdm9pZCBNZWRpYUFuYWx5dGljc1NlcnZpY2U6OnNhdmVJdGVtKE1lZGlhQW5hbHl0aWNzSXRlbSAqIGl0ZW0pCisKKy8vIHdlIGhvbGQgbUxvY2sgd2hlbiB3ZSBnZXQgaGVyZQorLy8gaWYgaXRlbSAhPSBOVUxMLCBpdCdzIHRoZSBpdGVtIHdlIGp1c3QgaW5zZXJ0ZWQKKy8vIHRydWUgPT0gbW9yZSBpdGVtcyBlbGlnaWJsZSB0byBiZSByZWNvdmVyZWQKK2Jvb2wgTWVkaWFBbmFseXRpY3NTZXJ2aWNlOjpleHBpcmF0aW9uc19sKE1lZGlhQW5hbHl0aWNzSXRlbSAqaXRlbSkKIHsKLQotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgLy8gbXV0ZXggYmV0d2VlbiBpbnNlcnRpb24gYW5kIGR1bXBpbmcgdGhlIGNvbnRlbnRzCi0KLSAgICAvLyB3ZSB3YW50IHRvIGR1bXAgJ2luIEZJRk8gb3JkZXInLCBzbyBpbnNlcnQgYXQgdGhlIGVuZAotICAgIG1JdGVtcy5wdXNoX2JhY2soaXRlbSk7CisgICAgYm9vbCBtb3JlID0gZmFsc2U7CisgICAgaW50IGhhbmRsZWQgPSAwOwogCiAgICAgLy8ga2VlcCByZW1vdmluZyBvbGQgcmVjb3JkcyB0aGUgZnJvbnQgdW50aWwgd2UncmUgaW4tYm91bmRzIChjb3VudCkKKyAgICAvLyBzaW5jZSB3ZSBpbnZva2UgdGhpcyB3aXRoIGVhY2ggaW5zZXJ0aW9uLCBpdCBzaG91bGQgYmUgMC8xIGl0ZXJhdGlvbnMuCiAgICAgaWYgKG1NYXhSZWNvcmRzID4gMCkgewogICAgICAgICB3aGlsZSAobUl0ZW1zLnNpemUoKSA+IChzaXplX3QpIG1NYXhSZWNvcmRzKSB7CiAgICAgICAgICAgICBNZWRpYUFuYWx5dGljc0l0ZW0gKiBvaXRlbSA9ICoobUl0ZW1zLmJlZ2luKCkpOwogICAgICAgICAgICAgaWYgKG9pdGVtID09IGl0ZW0pIHsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChoYW5kbGVkID49IG1NYXhSZWNvcmRzRXhwaXJlZEF0T25jZSkgeworICAgICAgICAgICAgICAgIC8vIHVubGlrZWx5IGluIHRoaXMgbG9vcAorICAgICAgICAgICAgICAgIG1vcmUgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaGFuZGxlZCsrOwogICAgICAgICAgICAgbUl0ZW1zLmVyYXNlKG1JdGVtcy5iZWdpbigpKTsKICAgICAgICAgICAgIGRlbGV0ZSBvaXRlbTsKICAgICAgICAgICAgIG1JdGVtc0Rpc2NhcmRlZCsrOwpAQCAtNDU2LDggKzQ3MSw4IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvLyBrZWVwIHJlbW92aW5nIG9sZCByZWNvcmRzIHRoZSBmcm9udCB1bnRpbCB3ZSdyZSBpbi1ib3VuZHMgKGNvdW50KQotICAgIC8vIE5COiBleHBpcmVkIGVudHJpZXMgYXJlbid0IHJlbW92ZWQgdW50aWwgdGhlIG5leHQgaW5zZXJ0aW9uLCB3aGljaCBjb3VsZCBiZSBhIHdoaWxlCisgICAgLy8ga2VlcCByZW1vdmluZyBvbGQgcmVjb3JkcyB0aGUgZnJvbnQgdW50aWwgd2UncmUgaW4tYm91bmRzIChhZ2UpCisgICAgLy8gbGltaXRlZCB0byBtTWF4UmVjb3Jkc0V4cGlyZWRBdE9uY2UgaXRlbXMgcGVyIGludm9jYXRpb24uCiAgICAgaWYgKG1NYXhSZWNvcmRBZ2VOcyA+IDApIHsKICAgICAgICAgbnNlY3NfdCBub3cgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1JFQUxUSU1FKTsKICAgICAgICAgd2hpbGUgKG1JdGVtcy5zaXplKCkgPiAwKSB7CkBAIC00NzEsMTggKzQ4Niw3MiBAQAogICAgICAgICAgICAgICAgIC8vIHRoaXMgKGFuZCB0aGUgcmVzdCkgYXJlIHJlY2VudCBlbm91Z2ggdG8ga2VlcAogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGhhbmRsZWQgPj0gbU1heFJlY29yZHNFeHBpcmVkQXRPbmNlKSB7CisgICAgICAgICAgICAgICAgLy8gdGhpcyByZXByZXNlbnRzICJvbmUgdG9vIG1hbnkiOyB0ZWxsIGNhbGxlciB0aGVyZSBhcmUKKyAgICAgICAgICAgICAgICAvLyBtb3JlIHRvIGJlIHJlY2xhaW1lZC4KKyAgICAgICAgICAgICAgICBtb3JlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGhhbmRsZWQrKzsKICAgICAgICAgICAgIG1JdGVtcy5lcmFzZShtSXRlbXMuYmVnaW4oKSk7CiAgICAgICAgICAgICBkZWxldGUgb2l0ZW07CiAgICAgICAgICAgICBtSXRlbXNEaXNjYXJkZWQrKzsKICAgICAgICAgICAgIG1JdGVtc0Rpc2NhcmRlZEV4cGlyZSsrOwogICAgICAgICB9CiAgICAgfQorCisgICAgLy8gd2Ugb25seSBpbmRpY2F0ZSB3aGV0aGVyIHRoZXJlJ3MgbW9yZSB0byBjbGVhbjsKKyAgICAvLyBjYWxsZXIgY2hvb3NlcyB3aGV0aGVyIHRvIHNjaGVkdWxlIGZ1cnRoZXIgY2xlYW51cC4KKyAgICByZXR1cm4gbW9yZTsKK30KKworLy8gcHJvY2VzcyBleHBpcmF0aW9ucyBpbiBiaXRlIHNpemVkIGNodW5rcywgYWxsb3dpbmcgbmV3IGluc2VydGlvbnMgdGhyb3VnaAorLy8gcnVucyBpbiBhIHB0aHJlYWQgc3BlY2lmaWNhbGx5IHN0YXJ0ZWQgZm9yIHRoaXMgKHdoaWNoIHRoZW4gZXhpdHMpCitib29sIE1lZGlhQW5hbHl0aWNzU2VydmljZTo6cHJvY2Vzc0V4cGlyYXRpb25zKCkKK3sKKyAgICBib29sIG1vcmU7CisgICAgZG8geworICAgICAgICBzbGVlcCgxKTsKKyAgICAgICAgeworICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICAgICAgICAgIG1vcmUgPSBleHBpcmF0aW9uc19sKE5VTEwpOworICAgICAgICAgICAgaWYgKCFtb3JlKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IHdoaWxlIChtb3JlKTsKKyAgICByZXR1cm4gdHJ1ZTsgICAgICAgIC8vIHZhbHVlIGlzIGZvciBzdGQ6OmZ1dHVyZSB0aHJlYWQgc3luY2hyb25pemF0aW9uCit9CisKKy8vIGluc2VydCBhcHByb3ByaWF0ZWx5IGludG8gcXVldWUKK3ZvaWQgTWVkaWFBbmFseXRpY3NTZXJ2aWNlOjpzYXZlSXRlbShNZWRpYUFuYWx5dGljc0l0ZW0gKiBpdGVtKQoreworCisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICAvLyBtdXRleCBiZXR3ZWVuIGluc2VydGlvbiBhbmQgZHVtcGluZyB0aGUgY29udGVudHMKKworICAgIC8vIHdlIHdhbnQgdG8gZHVtcCAnaW4gRklGTyBvcmRlcicsIHNvIGluc2VydCBhdCB0aGUgZW5kCisgICAgbUl0ZW1zLnB1c2hfYmFjayhpdGVtKTsKKworICAgIC8vIGNsZWFuIG9sZCBzdHVmZiBmcm9tIHRoZSBxdWV1ZQorICAgIGJvb2wgbW9yZSA9IGV4cGlyYXRpb25zX2woaXRlbSk7CisKKyAgICAvLyBjb25zaWRlciBzY2hlZHVsaW5nIHNvbWUgYXN5bmNocm9ub3VzIGNsZWFuaW5nLCBpZiBub3QgcnVubmluZworICAgIGlmIChtb3JlKSB7CisgICAgICAgIGlmICghbUV4cGlyZUZ1dHVyZS52YWxpZCgpCisgICAgICAgICAgICB8fCBtRXhwaXJlRnV0dXJlLndhaXRfZm9yKHN0ZDo6Y2hyb25vOjpzZWNvbmRzKDApKSA9PSBzdGQ6OmZ1dHVyZV9zdGF0dXM6OnJlYWR5KSB7CisKKyAgICAgICAgICAgIG1FeHBpcmVGdXR1cmUgPSBzdGQ6OmFzeW5jKHN0ZDo6bGF1bmNoOjphc3luYywgW3RoaXNdKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtyZXR1cm4gdGhpcy0+cHJvY2Vzc0V4cGlyYXRpb25zKCk7fSk7CisgICAgICAgIH0KKyAgICB9CiB9CiAKIHN0YXRpYyBzdGQ6OnN0cmluZyBhbGxvd2VkS2V5c1tdID0KIHsKICAgICAiYXVkaW9wb2xpY3kiLAogICAgICJhdWRpb3JlY29yZCIsCisgICAgImF1ZGlvdGhyZWFkIiwKICAgICAiYXVkaW90cmFjayIsCiAgICAgImNvZGVjIiwKICAgICAiZXh0cmFjdG9yIiwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL01lZGlhQW5hbHl0aWNzU2VydmljZS5oIGIvc2VydmljZXMvbWVkaWFhbmFseXRpY3MvTWVkaWFBbmFseXRpY3NTZXJ2aWNlLmgKaW5kZXggYjNjOTAyYS4uNjMyYzY5MiAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFhbmFseXRpY3MvTWVkaWFBbmFseXRpY3NTZXJ2aWNlLmgKKysrIGIvc2VydmljZXMvbWVkaWFhbmFseXRpY3MvTWVkaWFBbmFseXRpY3NTZXJ2aWNlLmgKQEAgLTI2LDYgKzI2LDggQEAKICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAjaW5jbHVkZSA8dXRpbHMvTGlzdC5oPgogCisjaW5jbHVkZSA8ZnV0dXJlPgorCiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhQW5hbHl0aWNzU2VydmljZS5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CkBAIC00NCw2ICs0Niw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFBbmFseXRpY3NTZXJ2aWNlKCk7CiAgICAgdmlydHVhbCAgICAgICAgICAgICAgICAgfk1lZGlhQW5hbHl0aWNzU2VydmljZSgpOwogCisgICAgYm9vbCBwcm9jZXNzRXhwaXJhdGlvbnMoKTsKKwogIHByaXZhdGU6CiAgICAgTWVkaWFBbmFseXRpY3NJdGVtOjpTZXNzaW9uSURfdCBnZW5lcmF0ZVVuaXF1ZVNlc3Npb25JRCgpOwogCkBAIC02NSw2ICs2OSw4IEBACiAgICAgaW50MzJfdCBtTWF4UmVjb3JkczsKICAgICAvLyBieSB0aW1lIChub25lIG9sZGVyIHRoYW4gdGhpcyBsb25nIGFnYW4KICAgICBuc2Vjc190IG1NYXhSZWNvcmRBZ2VOczsKKyAgICAvLyBtYXggdG8gZXhwaXJlIHBlciBleHBpcmF0aW9uc19sKCkgaW52b2NhdGlvbgorICAgIGludDMyX3QgbU1heFJlY29yZHNFeHBpcmVkQXRPbmNlOwogICAgIC8vCiAgICAgLy8gIyBvZiBzZXRzIG9mIHN1bW1hcmllcwogICAgIGludDMyX3QgbU1heFJlY29yZFNldHM7CkBAIC03OSw2ICs4NSw5IEBACiAgICAgTGlzdDxNZWRpYUFuYWx5dGljc0l0ZW0gKj4gbUl0ZW1zOwogICAgIHZvaWQgc2F2ZUl0ZW0oTWVkaWFBbmFseXRpY3NJdGVtICopOwogCisgICAgYm9vbCBleHBpcmF0aW9uc19sKE1lZGlhQW5hbHl0aWNzSXRlbSAqKTsKKyAgICBzdGQ6OmZ1dHVyZTxib29sPiBtRXhwaXJlRnV0dXJlOworCiAgICAgLy8gc3VwcG9ydCBmb3IgZ2VuZXJhdGluZyBvdXRwdXQKICAgICBpbnQgbUR1bXBQcm90bzsKICAgICBpbnQgbUR1bXBQcm90b0RlZmF1bHQ7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWNvZGVjL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL0FuZHJvaWQubWsKaW5kZXggZGI1ZjBmZi4uNzg5NTQ4ZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFjb2RlYy9BbmRyb2lkLm1rCisrKyBiL3NlcnZpY2VzL21lZGlhY29kZWMvQW5kcm9pZC5tawpAQCAtNjMsNiArNjMsNTkgQEAKIAogaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCiAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgc2VydmljZSBleGVjdXRhYmxlCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKyMgc2VjY29tcCBpcyBub3QgcmVxdWlyZWQgZm9yIGNvdmVyYWdlIGJ1aWxkLgoraWZuZXEgKCQoTkFUSVZFX0NPVkVSQUdFKSx0cnVlKQorTE9DQUxfUkVRVUlSRURfTU9EVUxFU19hcm0gOj0gY3Jhc2hfZHVtcC5wb2xpY3kgbWVkaWFjb2RlYy5wb2xpY3kKK0xPQ0FMX1JFUVVJUkVEX01PRFVMRVNfeDg2IDo9IGNyYXNoX2R1bXAucG9saWN5IG1lZGlhY29kZWMucG9saWN5CitlbmRpZgorTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKyAgICBtYWluX3N3Y29kZWNzZXJ2aWNlLmNwcCBcCisgICAgTWVkaWFDb2RlY1VwZGF0ZVNlcnZpY2UuY3BwIFwKKworc2FuaXRpemVyX3J1bnRpbWVfbGlicmFyaWVzIDo9ICQoY2FsbCBub3JtYWxpemUtcGF0aC1saXN0LCQoYWRkc3VmZml4IC5zbyxcCisgICQoQUREUkVTU19TQU5JVElaRVJfUlVOVElNRV9MSUJSQVJZKSBcCisgICQoVUJTQU5fUlVOVElNRV9MSUJSQVJZKSBcCisgICQoVFNBTl9SVU5USU1FX0xJQlJBUlkpIFwKKyAgJCgyTkRfQUREUkVTU19TQU5JVElaRVJfUlVOVElNRV9MSUJSQVJZKSBcCisgICQoMk5EX1VCU0FOX1JVTlRJTUVfTElCUkFSWSkgXAorICAkKDJORF9UU0FOX1JVTlRJTUVfTElCUkFSWSkpKQorCisjICQoaW5mbyBTYW5pdGl6ZXI6ICAkKHNhbml0aXplcl9ydW50aW1lX2xpYnJhcmllcykpCisKK2xsbmRrX2xpYnJhcmllcyA6PSAkKGNhbGwgbm9ybWFsaXplLXBhdGgtbGlzdCwkKGFkZHN1ZmZpeCAuc28sXAorICAkKExMTkRLX0xJQlJBUklFUykpKQorCisjICQoaW5mbyBMTE5ESzogICQobGxuZGtfbGlicmFyaWVzKSkKKworTE9DQUxfQ0ZMQUdTIDo9IC1ETElOS0VEX0xJQlJBUklFUz0nIiQoc2FuaXRpemVyX3J1bnRpbWVfbGlicmFyaWVzKTokKGxsbmRrX2xpYnJhcmllcykiJworCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKyAgICBsaWJhdnNlcnZpY2VzX21pbmlqYWlsIFwKKyAgICBsaWJiYXNlIFwKKyAgICBsaWJiaW5kZXIgXAorICAgIGxpYmN1dGlscyBcCisgICAgbGliaGlkbHRyYW5zcG9ydCBcCisgICAgbGliaHdiaW5kZXIgXAorICAgIGxpYmxvZyBcCisgICAgbGlibWVkaWEgXAorICAgIGxpYnV0aWxzIFwKKyAgICBsaWJ6aXBhcmNoaXZlIFwKKworTE9DQUxfTU9EVUxFIDo9IG1lZGlhc3djb2RlYworTE9DQUxfSU5JVF9SQyA6PSBtZWRpYXN3Y29kZWMucmMKK0xPQ0FMXzMyX0JJVF9PTkxZIDo9IHRydWUKKworc2FuaXRpemVyX3J1bnRpbWVfbGlicmFyaWVzIDo9CitsbG5ka19saWJyYXJpZXMgOj0KKworaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKICMgc2VydmljZSBzZWNjb21wIHBvbGljeQogaWZlcSAoJChUQVJHRVRfQVJDSCksICQoZmlsdGVyICQoVEFSR0VUX0FSQ0gpLCB4ODYgeDg2XzY0IGFybSBhcm02NCkpCiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhY29kZWMvTWVkaWFDb2RlY1VwZGF0ZVNlcnZpY2UuY3BwIGIvc2VydmljZXMvbWVkaWFjb2RlYy9NZWRpYUNvZGVjVXBkYXRlU2VydmljZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWVlODkwZAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL21lZGlhY29kZWMvTWVkaWFDb2RlY1VwZGF0ZVNlcnZpY2UuY3BwCkBAIC0wLDAgKzEsMTM2IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk1lZGlhQ29kZWNVcGRhdGVTZXJ2aWNlIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8YW5kcm9pZC9kbGV4dC5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3MuaD4KKyNpbmNsdWRlIDxkaXJlbnQuaD4KKyNpbmNsdWRlIDxkbGZjbi5oPgorI2luY2x1ZGUgPG1lZGlhL0NvZGVjU2VydmljZVJlZ2lzdHJhbnQuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx6aXBhcmNoaXZlL3ppcF9hcmNoaXZlLmg+CisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKworI2luY2x1ZGUgIk1lZGlhQ29kZWNVcGRhdGVTZXJ2aWNlLmgiCisKKy8vIENvcGllZCBmcm9tIEdyYXBoaWNzRW52LmNwcAorLy8gVE9ETyhiLzM3MDQ5MzE5KSBHZXQgdGhpcyBmcm9tIGEgaGVhZGVyIG9uY2Ugb25lIGV4aXN0cworZXh0ZXJuICJDIiB7CisgIGFuZHJvaWRfbmFtZXNwYWNlX3QqIGFuZHJvaWRfY3JlYXRlX25hbWVzcGFjZShjb25zdCBjaGFyKiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbGRfbGlicmFyeV9wYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZGVmYXVsdF9saWJyYXJ5X3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogcGVybWl0dGVkX3doZW5faXNvbGF0ZWRfcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWRfbmFtZXNwYWNlX3QqIHBhcmVudCk7CisgIGJvb2wgYW5kcm9pZF9saW5rX25hbWVzcGFjZXMoYW5kcm9pZF9uYW1lc3BhY2VfdCogZnJvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkX25hbWVzcGFjZV90KiB0bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzaGFyZWRfbGlic19zb25hbWVzKTsKKyAgZW51bSB7CisgICAgIEFORFJPSURfTkFNRVNQQUNFX1RZUEVfSVNPTEFURUQgPSAxLAorICB9OworfQorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgbWVkaWEgeworCitiaW5kZXI6OlN0YXR1cyBNZWRpYUNvZGVjVXBkYXRlU2VydmljZTo6bG9hZFBsdWdpbnMoY29uc3QgOjpzdGQ6OnN0cmluZyYgYXBrUGF0aCkgeworICAgIEFMT0dWKCJsb2FkUGx1Z2lucyAlcyIsIGFwa1BhdGguY19zdHIoKSk7CisKKyAgICBaaXBBcmNoaXZlSGFuZGxlIHppcEhhbmRsZTsKKyAgICB2b2lkICpyZWdpc3RyYW50TGliID0gTlVMTDsKKyAgICBpbnQzMl90IHJldCA9IE9wZW5BcmNoaXZlKGFwa1BhdGguY19zdHIoKSwgJnppcEhhbmRsZSk7CisKKyAgICBpZiAocmV0ID09IDApIHsKKyAgICAgICAgY2hhciBhYmlsaXN0MzJbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKyAgICAgICAgcHJvcGVydHlfZ2V0KCJyby5wcm9kdWN0LmNwdS5hYmlsaXN0MzIiLCBhYmlsaXN0MzIsICJhcm1lYWJpLXY3YSIpOworCisgICAgICAgIGF1dG8gYWJpcyA9IGJhc2U6OlNwbGl0KGFiaWxpc3QzMiwgIiwiKTsKKyAgICAgICAgaWYgKGFiaXMuZW1wdHkoKSkgeworICAgICAgICAgICAgQUxPR1coImFiaWxpc3QgaXMgZW1wdHksIHRyeWluZyBhcm1lYWJpLXY3YSAuLi4iKTsKKyAgICAgICAgICAgIGFiaXMucHVzaF9iYWNrKCJhcm1lYWJpLXY3YSIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gVE9ETzogT25seSB0cnkgdGhlIGZpcnN0IGVudHJ5IGluIGFiaWxpc3QzMiBmb3Igbm93LgorICAgICAgICAvLyBXZSBwcm9iYWJseSBzaG91bGQgdHJ5IHRoZSBuZXh0IGlmIGl0IGZhaWxzLgorICAgICAgICBTdHJpbmc4IGxpYlBhdGhJbkFwayA9IFN0cmluZzgoImxpYi8iKSArIFN0cmluZzgoYWJpc1swXS5jX3N0cigpKTsKKyAgICAgICAgU3RyaW5nOCBkZWZhdWx0TGliUGF0aCA9IFN0cmluZzgoYXBrUGF0aC5jX3N0cigpKSArICIhLyIgKyBsaWJQYXRoSW5BcGs7CisgICAgICAgIFN0cmluZzggbGliUGF0aCA9IGRlZmF1bHRMaWJQYXRoICsgIi9saWJtZWRpYV9jb2RlY3NlcnZpY2VyZWdpc3RyYW50LnNvIjsKKyAgICAgICAgU3RyaW5nOCB6aXBFbnRyeVBhdGggPSBsaWJQYXRoSW5BcGsgKyAiL2xpYm1lZGlhX2NvZGVjc2VydmljZXJlZ2lzdHJhbnQuc28iOworCisgICAgICAgIFppcEVudHJ5IGVudHJ5OworICAgICAgICByZXQgPSBGaW5kRW50cnkoemlwSGFuZGxlLCBaaXBTdHJpbmcoemlwRW50cnlQYXRoKSwgJmVudHJ5KTsKKworICAgICAgICBpZiAocmV0ID09IDApIHsKKyAgICAgICAgICAgIGFuZHJvaWRfbmFtZXNwYWNlX3QgKmNvZGVjTnMgPSBhbmRyb2lkX2NyZWF0ZV9uYW1lc3BhY2UoImNvZGVjcyIsCisgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsICAvLyBsZF9saWJyYXJ5X3BhdGgKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdExpYlBhdGguY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9OQU1FU1BBQ0VfVFlQRV9JU09MQVRFRCwKKyAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwgIC8vIHBlcm1pdHRlZF93aGVuX2lzb2xhdGVkX3BhdGgKKyAgICAgICAgICAgICAgICAgICAgbnVsbHB0cik7IC8vIHBhcmVudAorCisgICAgICAgICAgICBpZiAoY29kZWNOcyAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nOCBsaW5rZWRfbGlicmFyaWVzKExJTktFRF9MSUJSQVJJRVMpOworICAgICAgICAgICAgICAgIGlmIChhbmRyb2lkX2xpbmtfbmFtZXNwYWNlcygKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjTnMsIG51bGxwdHIsIGxpbmtlZF9saWJyYXJpZXMuY19zdHIoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgYW5kcm9pZF9kbGV4dGluZm8gZGxleHRpbmZvID0geworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5mbGFncyA9IEFORFJPSURfRExFWFRfVVNFX05BTUVTUEFDRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAubGlicmFyeV9uYW1lc3BhY2UgPSBjb2RlY05zLAorICAgICAgICAgICAgICAgICAgICB9OworCisgICAgICAgICAgICAgICAgICAgIHJlZ2lzdHJhbnRMaWIgPSBhbmRyb2lkX2Rsb3Blbl9leHQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGliUGF0aC5zdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVExEX05PVyB8IFJUTERfTE9DQUwsICZkbGV4dGluZm8pOworCisgICAgICAgICAgICAgICAgICAgIGlmIChyZWdpc3RyYW50TGliID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gbG9hZCBsaWIgZnJvbSBhcmNoaXZlOiAlcyIsIGRsZXJyb3IoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGxpbmsgbmFtZXNwYWNlIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGNyZWF0ZSBjb2RlYyBuYW1lc3BhY2UiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZmluZCBlbnRyeSAocmV0PSVkKSIsIHJldCk7CisgICAgICAgIH0KKworICAgICAgICBDbG9zZUFyY2hpdmUoemlwSGFuZGxlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIG9wZW4gYXJjaGl2ZSAocmV0PSVkKSIsIHJldCk7CisgICAgfQorCisgICAgaWYgKHJlZ2lzdHJhbnRMaWIpIHsKKyAgICAgICAgUmVnaXN0ZXJDb2RlY1NlcnZpY2VzRnVuYyByZWdpc3RlckNvZGVjU2VydmljZXMgPQorICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UmVnaXN0ZXJDb2RlY1NlcnZpY2VzRnVuYz4oCisgICAgICAgICAgICAgICAgZGxzeW0ocmVnaXN0cmFudExpYiwgIlJlZ2lzdGVyQ29kZWNTZXJ2aWNlcyIpKTsKKyAgICAgICAgaWYgKHJlZ2lzdGVyQ29kZWNTZXJ2aWNlcykgeworICAgICAgICAgICAgcmVnaXN0ZXJDb2RlY1NlcnZpY2VzKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMT0coV0FSTklORykgPDwgIkNhbm5vdCByZWdpc3RlciBjb2RlYyBzZXJ2aWNlcyAiCisgICAgICAgICAgICAgICAgICAgICItLSBjb3JydXB0ZWQgbGlicmFyeS4iOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ2Fubm90IGZpbmQgY29kZWMgc2VydmljZSByZWdpc3RyYW50LiI7CisgICAgfQorCisgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpvaygpOworfQorCit9ICAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhY29kZWMvTWVkaWFDb2RlY1VwZGF0ZVNlcnZpY2UuaCBiL3NlcnZpY2VzL21lZGlhY29kZWMvTWVkaWFDb2RlY1VwZGF0ZVNlcnZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjdjZWU5Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvbWVkaWFjb2RlYy9NZWRpYUNvZGVjVXBkYXRlU2VydmljZS5oCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9NRURJQV9DT0RFQ19VUERBVEVfU0VSVklDRV9ICisjZGVmaW5lIEFORFJPSURfTUVESUFfQ09ERUNfVVBEQVRFX1NFUlZJQ0VfSAorCisjaW5jbHVkZSA8YmluZGVyL0JpbmRlclNlcnZpY2UuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0JuTWVkaWFVcGRhdGVTZXJ2aWNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBtZWRpYSB7CisKK2NsYXNzIE1lZGlhQ29kZWNVcGRhdGVTZXJ2aWNlCisgICAgOiBwdWJsaWMgQmluZGVyU2VydmljZTxNZWRpYUNvZGVjVXBkYXRlU2VydmljZT4sIHB1YmxpYyBCbk1lZGlhVXBkYXRlU2VydmljZQoreworICAgIGZyaWVuZCBjbGFzcyBCaW5kZXJTZXJ2aWNlPE1lZGlhQ29kZWNVcGRhdGVTZXJ2aWNlPjsKK3B1YmxpYzoKKyAgICBNZWRpYUNvZGVjVXBkYXRlU2VydmljZSgpIDogQm5NZWRpYVVwZGF0ZVNlcnZpY2UoKSB7IH0KKyAgICB2aXJ0dWFsIH5NZWRpYUNvZGVjVXBkYXRlU2VydmljZSgpIHsgfQorICAgIHN0YXRpYyBjb25zdCBjaGFyKiBnZXRTZXJ2aWNlTmFtZSgpIHsgcmV0dXJuICJtZWRpYS5jb2RlYy51cGRhdGUiOyB9CisgICAgYmluZGVyOjpTdGF0dXMgbG9hZFBsdWdpbnMoY29uc3QgOjpzdGQ6OnN0cmluZyYgYXBrUGF0aCk7Cit9OworCit9ICAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX01FRElBX0NPREVDX1VQREFURV9TRVJWSUNFX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhY29kZWMvbWFpbl9jb2RlY3NlcnZpY2UuY3BwIGIvc2VydmljZXMvbWVkaWFjb2RlYy9tYWluX2NvZGVjc2VydmljZS5jcHAKaW5kZXggNTE2MTlmNi4uNmQ0N2JlNiAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFjb2RlYy9tYWluX2NvZGVjc2VydmljZS5jcHAKKysrIGIvc2VydmljZXMvbWVkaWFjb2RlYy9tYWluX2NvZGVjc2VydmljZS5jcHAKQEAgLTQ4LDM3ICs0OCwyMSBAQAogCiAgICAgOjphbmRyb2lkOjpoYXJkd2FyZTo6Y29uZmlndXJlUnBjVGhyZWFkcG9vbCg2NCwgZmFsc2UpOwogCi0gICAgLy8gUmVnaXN0cmF0aW9uIG9mIGN1c3RvbWl6ZWQgY29kZWMgc2VydmljZXMKLSAgICB2b2lkICpyZWdpc3RyYW50TGliID0gZGxvcGVuKAotICAgICAgICAgICAgImxpYm1lZGlhX2NvZGVjc2VydmljZXJlZ2lzdHJhbnQuc28iLAotICAgICAgICAgICAgUlRMRF9OT1cgfCBSVExEX0xPQ0FMKTsKLSAgICBpZiAocmVnaXN0cmFudExpYikgewotICAgICAgICBSZWdpc3RlckNvZGVjU2VydmljZXNGdW5jIHJlZ2lzdGVyQ29kZWNTZXJ2aWNlcyA9Ci0gICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxSZWdpc3RlckNvZGVjU2VydmljZXNGdW5jPigKLSAgICAgICAgICAgICAgICBkbHN5bShyZWdpc3RyYW50TGliLCAiUmVnaXN0ZXJDb2RlY1NlcnZpY2VzIikpOwotICAgICAgICBpZiAocmVnaXN0ZXJDb2RlY1NlcnZpY2VzKSB7Ci0gICAgICAgICAgICByZWdpc3RlckNvZGVjU2VydmljZXMoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCAiQ2Fubm90IHJlZ2lzdGVyIGFkZGl0aW9uYWwgc2VydmljZXMgIgotICAgICAgICAgICAgICAgICAgICAiLS0gY29ycnVwdGVkIGxpYnJhcnkuIjsKLSAgICAgICAgfQorICAgIC8vIERlZmF1bHQgY29kZWMgc2VydmljZXMKKyAgICB1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6Om9teDo6VjFfMDsKKyAgICBzcDxJT214U3RvcmU+IG9teFN0b3JlID0gbmV3IGltcGxlbWVudGF0aW9uOjpPbXhTdG9yZSgpOworICAgIGlmIChvbXhTdG9yZSA9PSBudWxscHRyKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkNhbm5vdCBjcmVhdGUgSU9teFN0b3JlIEhBTCBzZXJ2aWNlLiI7CisgICAgfSBlbHNlIGlmIChvbXhTdG9yZS0+cmVnaXN0ZXJBc1NlcnZpY2UoKSAhPSBPSykgeworICAgICAgICBMT0coRVJST1IpIDw8ICJDYW5ub3QgcmVnaXN0ZXIgSU9teFN0b3JlIEhBTCBzZXJ2aWNlLiI7CisgICAgfQorICAgIHNwPElPbXg+IG9teCA9IG5ldyBpbXBsZW1lbnRhdGlvbjo6T214KCk7CisgICAgaWYgKG9teCA9PSBudWxscHRyKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkNhbm5vdCBjcmVhdGUgSU9teCBIQUwgc2VydmljZS4iOworICAgIH0gZWxzZSBpZiAob214LT5yZWdpc3RlckFzU2VydmljZSgpICE9IE9LKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkNhbm5vdCByZWdpc3RlciBJT214IEhBTCBzZXJ2aWNlLiI7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgLy8gRGVmYXVsdCBjb2RlYyBzZXJ2aWNlcwotICAgICAgICB1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6Om9teDo6VjFfMDsKLSAgICAgICAgc3A8SU9teFN0b3JlPiBvbXhTdG9yZSA9IG5ldyBpbXBsZW1lbnRhdGlvbjo6T214U3RvcmUoKTsKLSAgICAgICAgaWYgKG9teFN0b3JlID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkNhbm5vdCBjcmVhdGUgSU9teFN0b3JlIEhBTCBzZXJ2aWNlLiI7Ci0gICAgICAgIH0gZWxzZSBpZiAob214U3RvcmUtPnJlZ2lzdGVyQXNTZXJ2aWNlKCkgIT0gT0spIHsKLSAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkNhbm5vdCByZWdpc3RlciBJT214U3RvcmUgSEFMIHNlcnZpY2UuIjsKLSAgICAgICAgfQotICAgICAgICBzcDxJT214PiBvbXggPSBuZXcgaW1wbGVtZW50YXRpb246Ok9teCgpOwotICAgICAgICBpZiAob214ID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkNhbm5vdCBjcmVhdGUgSU9teCBIQUwgc2VydmljZS4iOwotICAgICAgICB9IGVsc2UgaWYgKG9teC0+cmVnaXN0ZXJBc1NlcnZpY2UoKSAhPSBPSykgewotICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ2Fubm90IHJlZ2lzdGVyIElPbXggSEFMIHNlcnZpY2UuIjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExPRyhJTkZPKSA8PCAiSU9teCBIQUwgc2VydmljZSBjcmVhdGVkLiI7Ci0gICAgICAgIH0KKyAgICAgICAgTE9HKElORk8pIDw8ICJJT214IEhBTCBzZXJ2aWNlIGNyZWF0ZWQuIjsKICAgICB9CiAKICAgICA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpqb2luUnBjVGhyZWFkcG9vbCgpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFjb2RlYy9tYWluX3N3Y29kZWNzZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL21lZGlhY29kZWMvbWFpbl9zd2NvZGVjc2VydmljZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg2YWJiMgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL21lZGlhY29kZWMvbWFpbl9zd2NvZGVjc2VydmljZS5jcHAKQEAgLTAsMCArMSw3NCBAQAorLyoKKyoqCisqKiBDb3B5cmlnaHQgMjAxOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisKKy8vIGZyb20gTE9DQUxfQ19JTkNMVURFUworI2luY2x1ZGUgIm1pbmlqYWlsLmgiCisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGJpbmRlci9Qcm9jZXNzU3RhdGUuaD4KKyNpbmNsdWRlIDxkbGZjbi5oPgorI2luY2x1ZGUgPGhpZGwvSGlkbFRyYW5zcG9ydFN1cHBvcnQuaD4KKyNpbmNsdWRlIDxtZWRpYS9Db2RlY1NlcnZpY2VSZWdpc3RyYW50Lmg+CisKKyNpbmNsdWRlICJNZWRpYUNvZGVjVXBkYXRlU2VydmljZS5oIgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworLy8gVE9ETzogcmVwbGFjZSBwb2xpY3kgd2l0aCBzb2Z0d2FyZSBjb2RlYy1vbmx5IHBvbGljaWVzCisvLyBNdXN0IG1hdGNoIGxvY2F0aW9uIGluIEFuZHJvaWQubWsuCitzdGF0aWMgY29uc3QgY2hhciBrU3lzdGVtU2VjY29tcFBvbGljeVBhdGhbXSA9CisgICAgICAgICIvc3lzdGVtL2V0Yy9zZWNjb21wX3BvbGljeS9tZWRpYWNvZGVjLnBvbGljeSI7CitzdGF0aWMgY29uc3QgY2hhciBrVmVuZG9yU2VjY29tcFBvbGljeVBhdGhbXSA9CisgICAgICAgICIvdmVuZG9yL2V0Yy9zZWNjb21wX3BvbGljeS9tZWRpYWNvZGVjLnBvbGljeSI7CisKK2ludCBtYWluKGludCBhcmdjIF9fdW51c2VkLCBjaGFyKiogLyphcmd2Ki8pCit7CisgICAgTE9HKElORk8pIDw8ICJtZWRpYSBzd2NvZGVjIHNlcnZpY2Ugc3RhcnRpbmciOworICAgIHNpZ25hbChTSUdQSVBFLCBTSUdfSUdOKTsKKyAgICBTZXRVcE1pbmlqYWlsKGtTeXN0ZW1TZWNjb21wUG9saWN5UGF0aCwga1ZlbmRvclNlY2NvbXBQb2xpY3lQYXRoKTsKKworICAgIHN0ZDo6c3RyaW5nIHZhbHVlID0gYmFzZTo6R2V0UHJvcGVydHkoInJvLmJ1aWxkLnR5cGUiLCAidW5rbm93biIpOworICAgIGlmICh2YWx1ZSA9PSAidXNlcmRlYnVnIiB8fCB2YWx1ZSA9PSAiZW5nIikgeworICAgICAgICBtZWRpYTo6TWVkaWFDb2RlY1VwZGF0ZVNlcnZpY2U6Omluc3RhbnRpYXRlKCk7CisgICAgfQorCisgICAgYW5kcm9pZDo6UHJvY2Vzc1N0YXRlOjpzZWxmKCktPnN0YXJ0VGhyZWFkUG9vbCgpOworCisgICAgOjphbmRyb2lkOjpoYXJkd2FyZTo6Y29uZmlndXJlUnBjVGhyZWFkcG9vbCg2NCwgZmFsc2UpOworCisgICAgLy8gUmVnaXN0cmF0aW9uIG9mIGN1c3RvbWl6ZWQgY29kZWMgc2VydmljZXMKKyAgICB2b2lkICpyZWdpc3RyYW50TGliID0gZGxvcGVuKAorICAgICAgICAgICAgImxpYm1lZGlhX2NvZGVjc2VydmljZXJlZ2lzdHJhbnQuc28iLAorICAgICAgICAgICAgUlRMRF9OT1cgfCBSVExEX0xPQ0FMKTsKKyAgICBpZiAocmVnaXN0cmFudExpYikgeworICAgICAgICBSZWdpc3RlckNvZGVjU2VydmljZXNGdW5jIHJlZ2lzdGVyQ29kZWNTZXJ2aWNlcyA9CisgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxSZWdpc3RlckNvZGVjU2VydmljZXNGdW5jPigKKyAgICAgICAgICAgICAgICBkbHN5bShyZWdpc3RyYW50TGliLCAiUmVnaXN0ZXJDb2RlY1NlcnZpY2VzIikpOworICAgICAgICBpZiAocmVnaXN0ZXJDb2RlY1NlcnZpY2VzKSB7CisgICAgICAgICAgICByZWdpc3RlckNvZGVjU2VydmljZXMoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCAiQ2Fubm90IHJlZ2lzdGVyIGNvZGVjIHNlcnZpY2VzICIKKyAgICAgICAgICAgICAgICAgICAgIi0tIGNvcnJ1cHRlZCBsaWJyYXJ5LiI7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBMT0coRVJST1IpIDw8ICJDYW5ub3QgZmluZCBjb2RlYyBzZXJ2aWNlIHJlZ2lzdHJhbnQuIjsKKyAgICB9CisKKyAgICA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpqb2luUnBjVGhyZWFkcG9vbCgpOworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFjb2RlYy9tZWRpYXN3Y29kZWMucmMgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL21lZGlhc3djb2RlYy5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZmUzMzgxCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvbWVkaWFjb2RlYy9tZWRpYXN3Y29kZWMucmMKQEAgLTAsMCArMSw2IEBACitzZXJ2aWNlIG1lZGlhLnN3Y29kZWMgL3N5c3RlbS9iaW4vbWVkaWFzd2NvZGVjCisgICAgY2xhc3MgbWFpbgorICAgIHVzZXIgbWVkaWFjb2RlYworICAgIGdyb3VwIGNhbWVyYSBkcm1ycGMgbWVkaWFkcm0KKyAgICBpb3ByaW8gcnQgNAorICAgIHdyaXRlcGlkIC9kZXYvY3B1c2V0L2ZvcmVncm91bmQvdGFza3MKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhY29kZWMvc2VjY29tcF9wb2xpY3kvbWVkaWFjb2RlYy1hcm0ucG9saWN5IGIvc2VydmljZXMvbWVkaWFjb2RlYy9zZWNjb21wX3BvbGljeS9tZWRpYWNvZGVjLWFybS5wb2xpY3kKaW5kZXggNmVjODg5NS4uZWRmNGRhYiAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFjb2RlYy9zZWNjb21wX3BvbGljeS9tZWRpYWNvZGVjLWFybS5wb2xpY3kKKysrIGIvc2VydmljZXMvbWVkaWFjb2RlYy9zZWNjb21wX3BvbGljeS9tZWRpYWNvZGVjLWFybS5wb2xpY3kKQEAgLTU1LDQgKzU1LDggQEAKIGdldGRlbnRzNjQ6IDEKIGdldHJhbmRvbTogMQogCisjIFVzZWQgYnkgVUJTYW4gZGlhZ25vc3RpYyBtZXNzYWdlcworcmVhZGxpbms6IDEKK29wZW46IDEKKwogQGluY2x1ZGUgL3N5c3RlbS9ldGMvc2VjY29tcF9wb2xpY3kvY3Jhc2hfZHVtcC5hcm0ucG9saWN5CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWNvZGVjL3NlY2NvbXBfcG9saWN5L21lZGlhY29kZWMteDg2LnBvbGljeSBiL3NlcnZpY2VzL21lZGlhY29kZWMvc2VjY29tcF9wb2xpY3kvbWVkaWFjb2RlYy14ODYucG9saWN5CmluZGV4IDgyMWU2OWYuLjk2NmUyMTQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhY29kZWMvc2VjY29tcF9wb2xpY3kvbWVkaWFjb2RlYy14ODYucG9saWN5CisrKyBiL3NlcnZpY2VzL21lZGlhY29kZWMvc2VjY29tcF9wb2xpY3kvbWVkaWFjb2RlYy14ODYucG9saWN5CkBAIC0yNCw2ICsyNCw3IEBACiBtbWFwMjogMQogZnN0YXQ2NDogMQogc3RhdDY0OiAxCitzdGF0ZnM2NDogMQogbWFkdmlzZTogMQogZnN0YXRhdDY0OiAxCiBmdXRleDogMQpAQCAtNTcsNCArNTgsOCBAQAogZ2V0cGlkOiAxCiBnZXR0aWQ6IDEKIAorIyBVc2VkIGJ5IFVCU2FuIGRpYWdub3N0aWMgbWVzc2FnZXMKK3JlYWRsaW5rOiAxCitvcGVuOiAxCisKIEBpbmNsdWRlIC9zeXN0ZW0vZXRjL3NlY2NvbXBfcG9saWN5L2NyYXNoX2R1bXAueDg2LnBvbGljeQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFkcm0vQW5kcm9pZC5tayBiL3NlcnZpY2VzL21lZGlhZHJtL0FuZHJvaWQubWsKaW5kZXggZTg3MDk2NS4uMjI3YTI5ZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFkcm0vQW5kcm9pZC5taworKysgYi9zZXJ2aWNlcy9tZWRpYWRybS9BbmRyb2lkLm1rCkBAIC0yOSw3ICsyOSw4IEBACiAgICAgbGliaGlkbG1lbW9yeSBcCiAgICAgbGliaGlkbHRyYW5zcG9ydCBcCiAgICAgYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4wIFwKLSAgICBhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjEKKyAgICBhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjEgXAorICAgIGFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMgogCiBMT0NBTF9DRkxBR1MgKz0gLVdhbGwgLVdleHRyYSAtV2Vycm9yCiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9BbmRyb2lkLm1rCmluZGV4IDM3ZDZjYzkuLjczYzk1MzUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL0FuZHJvaWQubWsKKysrIGIvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvQW5kcm9pZC5tawpAQCAtMTgsNiArMTgsNyBAQAogTE9DQUxfUkVRVUlSRURfTU9EVUxFU19hcm0gOj0gY3Jhc2hfZHVtcC5wb2xpY3kgbWVkaWFleHRyYWN0b3IucG9saWN5CiBMT0NBTF9SRVFVSVJFRF9NT0RVTEVTX2FybTY0IDo9IGNyYXNoX2R1bXAucG9saWN5IG1lZGlhZXh0cmFjdG9yLnBvbGljeQogTE9DQUxfUkVRVUlSRURfTU9EVUxFU194ODYgOj0gY3Jhc2hfZHVtcC5wb2xpY3kgbWVkaWFleHRyYWN0b3IucG9saWN5CitMT0NBTF9SRVFVSVJFRF9NT0RVTEVTX3g4Nl82NCA6PSBjcmFzaF9kdW1wLnBvbGljeSBtZWRpYWV4dHJhY3Rvci5wb2xpY3kKIAogIyBleHRyYWN0b3IgbGlicmFyaWVzCiBMT0NBTF9SRVFVSVJFRF9NT0RVTEVTICs9IFwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL01lZGlhRXh0cmFjdG9yU2VydmljZS5jcHAgYi9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9NZWRpYUV4dHJhY3RvclNlcnZpY2UuY3BwCmluZGV4IGYwZjQ0ZjUuLmY0ZDhiNDMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL01lZGlhRXh0cmFjdG9yU2VydmljZS5jcHAKKysrIGIvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvTWVkaWFFeHRyYWN0b3JTZXJ2aWNlLmNwcApAQCAtMjEsNyArMjEsNiBAQAogI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgogCiAjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZUZhY3RvcnkuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9JbnRlcmZhY2VVdGlscy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yRmFjdG9yeS5oPgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvTWVkaWFFeHRyYWN0b3JVcGRhdGVTZXJ2aWNlLmggYi9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9NZWRpYUV4dHJhY3RvclVwZGF0ZVNlcnZpY2UuaAppbmRleCA0MTE1ZjZkLi5lYTM0YzlkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9NZWRpYUV4dHJhY3RvclVwZGF0ZVNlcnZpY2UuaAorKysgYi9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9NZWRpYUV4dHJhY3RvclVwZGF0ZVNlcnZpY2UuaApAQCAtMTgsMTcgKzE4LDE3IEBACiAjZGVmaW5lIEFORFJPSURfTUVESUFfRVhUUkFDVE9SX1VQREFURV9TRVJWSUNFX0gKIAogI2luY2x1ZGUgPGJpbmRlci9CaW5kZXJTZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9Cbk1lZGlhRXh0cmFjdG9yVXBkYXRlU2VydmljZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvQm5NZWRpYVVwZGF0ZVNlcnZpY2UuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIG1lZGlhIHsKIAogY2xhc3MgTWVkaWFFeHRyYWN0b3JVcGRhdGVTZXJ2aWNlCi0gICAgOiBwdWJsaWMgQmluZGVyU2VydmljZTxNZWRpYUV4dHJhY3RvclVwZGF0ZVNlcnZpY2U+LCBwdWJsaWMgQm5NZWRpYUV4dHJhY3RvclVwZGF0ZVNlcnZpY2UKKyAgICA6IHB1YmxpYyBCaW5kZXJTZXJ2aWNlPE1lZGlhRXh0cmFjdG9yVXBkYXRlU2VydmljZT4sIHB1YmxpYyBCbk1lZGlhVXBkYXRlU2VydmljZQogewogICAgIGZyaWVuZCBjbGFzcyBCaW5kZXJTZXJ2aWNlPE1lZGlhRXh0cmFjdG9yVXBkYXRlU2VydmljZT47CiBwdWJsaWM6Ci0gICAgTWVkaWFFeHRyYWN0b3JVcGRhdGVTZXJ2aWNlKCkgOiBCbk1lZGlhRXh0cmFjdG9yVXBkYXRlU2VydmljZSgpIHsgfQorICAgIE1lZGlhRXh0cmFjdG9yVXBkYXRlU2VydmljZSgpIDogQm5NZWRpYVVwZGF0ZVNlcnZpY2UoKSB7IH0KICAgICB2aXJ0dWFsIH5NZWRpYUV4dHJhY3RvclVwZGF0ZVNlcnZpY2UoKSB7IH0KICAgICBzdGF0aWMgY29uc3QgY2hhciogZ2V0U2VydmljZU5hbWUoKSB7IHJldHVybiAibWVkaWEuZXh0cmFjdG9yLnVwZGF0ZSI7IH0KICAgICBiaW5kZXI6OlN0YXR1cyBsb2FkUGx1Z2lucyhjb25zdCA6OnN0ZDo6c3RyaW5nJiBhcGtQYXRoKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL3NlY2NvbXBfcG9saWN5L21lZGlhZXh0cmFjdG9yLXg4Nl82NC5wb2xpY3kgYi9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9zZWNjb21wX3BvbGljeS9tZWRpYWV4dHJhY3Rvci14ODZfNjQucG9saWN5Cm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggNjNjNzc4MC4uNmQ5ZWQ2ZgotLS0gYS9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9zZWNjb21wX3BvbGljeS9tZWRpYWV4dHJhY3Rvci14ODZfNjQucG9saWN5CisrKyBiL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL3NlY2NvbXBfcG9saWN5L21lZGlhZXh0cmFjdG9yLXg4Nl82NC5wb2xpY3kKQEAgLTIxLDYgKzIxLDcgQEAKIGdldHVpZDogMQogc2V0cHJpb3JpdHk6IDEKIHNpZ2FsdHN0YWNrOiAxCitmc3RhdGZzOiAxCiBuZXdmc3RhdGF0OiAxCiByZXN0YXJ0X3N5c2NhbGw6IDEKIGV4aXQ6IDEKQEAgLTMwLDI4ICszMSwyMSBAQAogc2NoZWRfc2V0c2NoZWR1bGVyOiAxCiBnZXRybGltaXQ6IDEKIG5hbm9zbGVlcDogMQorZ2V0cmFuZG9tOiAxCisKKyMgZm9yIGR5bmFtaWNhbGx5IGxvYWRpbmcgZXh0cmFjdG9ycworZ2V0ZGVudHM2NDogMQorcmVhZGxpbmthdDogMQorcHJlYWQ2NDogMQorbXJlbWFwOiAxCiAKICMgZm9yIEZpbGVTb3VyY2UKIHJlYWRsaW5rYXQ6IDEKIAotIyBmb3IgYXR0YWNoaW5nIHRvIGRlYnVnZ2VyZCBvbiBwcm9jZXNzIGNyYXNoCi10Z2tpbGw6IDEKLXNvY2tldDogYXJnMCA9PSAxCi1jb25uZWN0OiAxCi1mY250bDogMQotcnRfc2lncHJvY21hc2s6IDEKLXJ0X3NpZ2FjdGlvbjogMQotcnRfdGdzaWdxdWV1ZWluZm86IDEKLWdldGV1aWQ6IDEKLWdldGdpZDogMQotZ2V0ZWdpZDogMQotZ2V0Z3JvdXBzOiAxCi1nZXRkZW50czY0OiAxCi1waXBlMjogMQotcHBvbGw6IDEKLQogIyBSZXF1aXJlZCBieSBBZGRyZXNzU2FuaXRpemVyCiBnZXR0aWQ6IDEKIHNjaGVkX3lpZWxkOiAxCiBnZXRwaWQ6IDEKIGdldHRpZDogMQorCitAaW5jbHVkZSAvc3lzdGVtL2V0Yy9zZWNjb21wX3BvbGljeS9jcmFzaF9kdW1wLng4Nl82NC5wb2xpY3kKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhbG9nL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9tZWRpYWxvZy9BbmRyb2lkLmJwCmluZGV4IDI5ZTZkZmMuLmNhOTZmNjIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhbG9nL0FuZHJvaWQuYnAKKysrIGIvc2VydmljZXMvbWVkaWFsb2cvQW5kcm9pZC5icApAQCAtOSw3ICs5LDkgQEAKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGliYXVkaW91dGlscyIsCiAgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGliY3V0aWxzIiwKICAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJtZWRpYXV0aWxzIiwKICAgICAgICAgImxpYm5iYWlvIiwKICAgICAgICAgImxpYm5ibG9nIiwKICAgICAgICAgImxpYnV0aWxzIiwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhbG9nL01lZGlhTG9nU2VydmljZS5jcHAgYi9zZXJ2aWNlcy9tZWRpYWxvZy9NZWRpYUxvZ1NlcnZpY2UuY3BwCmluZGV4IDFiZTU1NDQuLjkwMmFmNjYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhbG9nL01lZGlhTG9nU2VydmljZS5jcHAKKysrIGIvc2VydmljZXMvbWVkaWFsb2cvTWVkaWFMb2dTZXJ2aWNlLmNwcApAQCAtMjAsOCArMjAsOSBAQAogI2luY2x1ZGUgPHN5cy9tbWFuLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8YmluZGVyL1Blcm1pc3Npb25DYWNoZS5oPgorI2luY2x1ZGUgPG1lZGlhL25ibG9nL01lcmdlci5oPgogI2luY2x1ZGUgPG1lZGlhL25ibG9nL05CTG9nLmg+Ci0jaW5jbHVkZSA8cHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmg+CisjaW5jbHVkZSA8bWVkaWF1dGlscy9TZXJ2aWNlVXRpbGl0aWVzLmg+CiAjaW5jbHVkZSAiTWVkaWFMb2dTZXJ2aWNlLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKQEAgLTUzLDI3ICs1NCwyOCBAQAogCiB2b2lkIE1lZGlhTG9nU2VydmljZTo6cmVnaXN0ZXJXcml0ZXIoY29uc3Qgc3A8SU1lbW9yeT4mIHNoYXJlZCwgc2l6ZV90IHNpemUsIGNvbnN0IGNoYXIgKm5hbWUpCiB7Ci0gICAgaWYgKElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSAhPSBBSURfQVVESU9TRVJWRVIgfHwgc2hhcmVkID09IDAgfHwKKyAgICBpZiAoIWlzQXVkaW9TZXJ2ZXJPck1lZGlhU2VydmVyVWlkKElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSkgfHwgc2hhcmVkID09IDAgfHwKICAgICAgICAgICAgIHNpemUgPCBrTWluU2l6ZSB8fCBzaXplID4ga01heFNpemUgfHwgbmFtZSA9PSBOVUxMIHx8CiAgICAgICAgICAgICBzaGFyZWQtPnNpemUoKSA8IE5CTG9nOjpUaW1lbGluZTo6c2hhcmVkU2l6ZShzaXplKSkgewogICAgICAgICByZXR1cm47CiAgICAgfQotICAgIHNwPE5CTG9nOjpSZWFkZXI+IHJlYWRlcihuZXcgTkJMb2c6OlJlYWRlcihzaGFyZWQsIHNpemUpKTsKLSAgICBOQkxvZzo6TmFtZWRSZWFkZXIgbmFtZWRSZWFkZXIocmVhZGVyLCBuYW1lKTsKKyAgICBzcDxOQkxvZzo6UmVhZGVyPiByZWFkZXIobmV3IE5CTG9nOjpSZWFkZXIoc2hhcmVkLCBzaXplLCBuYW1lKSk7IC8vIFJlYWRlciBoYW5kbGVkIGJ5IG1lcmdlcgorICAgIHNwPE5CTG9nOjpEdW1wUmVhZGVyPiBkdW1wUmVhZGVyKG5ldyBOQkxvZzo6RHVtcFJlYWRlcihzaGFyZWQsIHNpemUsIG5hbWUpKTsgLy8gZm9yIGR1bXBzeXMKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIG1OYW1lZFJlYWRlcnMuYWRkKG5hbWVkUmVhZGVyKTsKLSAgICBtTWVyZ2VyLmFkZFJlYWRlcihuYW1lZFJlYWRlcik7CisgICAgbUR1bXBSZWFkZXJzLmFkZChkdW1wUmVhZGVyKTsKKyAgICBtTWVyZ2VyLmFkZFJlYWRlcihyZWFkZXIpOwogfQogCiB2b2lkIE1lZGlhTG9nU2VydmljZTo6dW5yZWdpc3RlcldyaXRlcihjb25zdCBzcDxJTWVtb3J5PiYgc2hhcmVkKQogewotICAgIGlmIChJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkgIT0gQUlEX0FVRElPU0VSVkVSIHx8IHNoYXJlZCA9PSAwKSB7CisgICAgaWYgKCFpc0F1ZGlvU2VydmVyT3JNZWRpYVNlcnZlclVpZChJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkpIHx8IHNoYXJlZCA9PSAwKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1OYW1lZFJlYWRlcnMuc2l6ZSgpOyApIHsKLSAgICAgICAgaWYgKG1OYW1lZFJlYWRlcnNbaV0ucmVhZGVyKCktPmlzSU1lbW9yeShzaGFyZWQpKSB7Ci0gICAgICAgICAgICBtTmFtZWRSZWFkZXJzLnJlbW92ZUF0KGkpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUR1bXBSZWFkZXJzLnNpemUoKTsgKSB7CisgICAgICAgIGlmIChtRHVtcFJlYWRlcnNbaV0tPmlzSU1lbW9yeShzaGFyZWQpKSB7CisgICAgICAgICAgICBtRHVtcFJlYWRlcnMucmVtb3ZlQXQoaSk7CisgICAgICAgICAgICAvLyBUT0RPIG1NZXJnZXIucmVtb3ZlUmVhZGVycyhzaGFyZWQpCiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBpKys7CiAgICAgICAgIH0KQEAgLTk1LDEwICs5Nyw4IEBACiAKIHN0YXR1c190IE1lZGlhTG9nU2VydmljZTo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MgX191bnVzZWQpCiB7Ci0gICAgLy8gRklYTUUgbWVyZ2Ugd2l0aCBzaW1pbGFyIGJ1dCBub3QgaWRlbnRpY2FsIGNvZGUgYXQgc2VydmljZXMvYXVkaW9mbGluZ2VyL1NlcnZpY2VVdGlsaXRpZXMuY3BwCi0gICAgc3RhdGljIGNvbnN0IFN0cmluZzE2IHNEdW1wKCJhbmRyb2lkLnBlcm1pc3Npb24uRFVNUCIpOwotICAgIGlmICghKElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSA9PSBBSURfQVVESU9TRVJWRVIgfHwKLSAgICAgICAgICAgIFBlcm1pc3Npb25DYWNoZTo6Y2hlY2tDYWxsaW5nUGVybWlzc2lvbihzRHVtcCkpKSB7CisgICAgaWYgKCEoaXNBdWRpb1NlcnZlck9yTWVkaWFTZXJ2ZXJVaWQoSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpKQorICAgICAgICAgICAgfHwgZHVtcEFsbG93ZWQoKSkpIHsKICAgICAgICAgZHByaW50ZihmZCwgIlBlcm1pc3Npb24gRGVuaWFsOiBjYW4ndCBkdW1wIG1lZGlhLmxvZyBmcm9tIHBpZD0lZCwgdWlkPSVkXG4iLAogICAgICAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSwKICAgICAgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkpOwpAQCAtMTA4LDcgKzEwOCw3IEBACiAgICAgaWYgKGFyZ3Muc2l6ZSgpID4gMCkgewogICAgICAgICBjb25zdCBTdHJpbmc4IGFyZzAoYXJnc1swXSk7CiAgICAgICAgIGlmICghc3RyY21wKGFyZzAuc3RyaW5nKCksICItciIpKSB7Ci0gICAgICAgICAgICAvLyBuZWVkZWQgYmVjYXVzZSBtTmFtZWRSZWFkZXJzIGlzIHByb3RlY3RlZCBieSBtTG9jaworICAgICAgICAgICAgLy8gbmVlZGVkIGJlY2F1c2UgbVJlYWRlcnMgaXMgcHJvdGVjdGVkIGJ5IG1Mb2NrCiAgICAgICAgICAgICBib29sIGxvY2tlZCA9IGR1bXBUcnlMb2NrKG1Mb2NrKTsKIAogICAgICAgICAgICAgLy8gZmFpbGVkIHRvIGxvY2sgLSBNZWRpYUxvZ1NlcnZpY2UgaXMgcHJvYmFibHkgZGVhZGxvY2tlZApAQCAtMTE5LDIxICsxMTksMjIgQEAKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBBTE9HVygiJXM6IiwgcmVzdWx0LnN0cmluZygpKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gVE9ETyBzaG91bGQgd2UgaW5zdGVhZCBwcm9jZWVkIHRvIG1NZXJnZVJlYWRlci5kdW1wPyBkb2VzIGl0IG5lZWQgbG9jaz8KICAgICAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgbmFtZWRSZWFkZXIgOiBtTmFtZWRSZWFkZXJzKSB7CisgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJmR1bXBSZWFkZXIgOiBtRHVtcFJlYWRlcnMpIHsKICAgICAgICAgICAgICAgICBpZiAoZmQgPj0gMCkgewotICAgICAgICAgICAgICAgICAgICBkcHJpbnRmKGZkLCAiXG4lczpcbiIsIG5hbWVkUmVhZGVyLm5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgIGRwcmludGYoZmQsICJcbiVzOlxuIiwgZHVtcFJlYWRlci0+bmFtZSgpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICBkdW1wUmVhZGVyLT5kdW1wKGZkLCAwIC8qaW5kZW50Ki8pOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dJKCIlczoiLCBuYW1lZFJlYWRlci5uYW1lKCkpOworICAgICAgICAgICAgICAgICAgICBBTE9HSSgiJXM6IiwgZHVtcFJlYWRlci0+bmFtZSgpLmNfc3RyKCkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbU1lcmdlUmVhZGVyLmR1bXAoZmQsIGFyZ3MpOwogICAgICAgICB9CiAgICAgfQotICAgIG1NZXJnZVJlYWRlci5kdW1wKGZkKTsKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhbG9nL01lZGlhTG9nU2VydmljZS5oIGIvc2VydmljZXMvbWVkaWFsb2cvTWVkaWFMb2dTZXJ2aWNlLmgKaW5kZXggYzk0NWQxZi4uMjFkZjg5OCAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFsb2cvTWVkaWFMb2dTZXJ2aWNlLmgKKysrIGIvc2VydmljZXMvbWVkaWFsb2cvTWVkaWFMb2dTZXJ2aWNlLmgKQEAgLTE5LDYgKzE5LDcgQEAKIAogI2luY2x1ZGUgPGJpbmRlci9CaW5kZXJTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhTG9nU2VydmljZS5oPgorI2luY2x1ZGUgPG1lZGlhL25ibG9nL01lcmdlci5oPgogI2luY2x1ZGUgPG1lZGlhL25ibG9nL05CTG9nLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKQEAgLTU1LDcgKzU2LDcgQEAKIAogICAgIE11dGV4ICAgICAgICAgICAgICAgbUxvY2s7CiAKLSAgICBWZWN0b3I8TkJMb2c6Ok5hbWVkUmVhZGVyPiBtTmFtZWRSZWFkZXJzOyAgIC8vIHByb3RlY3RlZCBieSBtTG9jaworICAgIFZlY3RvcjxzcDxOQkxvZzo6RHVtcFJlYWRlcj4+IG1EdW1wUmVhZGVyczsgICAvLyBwcm90ZWN0ZWQgYnkgbUxvY2sKIAogICAgIC8vIEZJWE1FIE5lZWQgY29tbWVudHMgb24gYWxsIG9mIHRoZXNlLCBlc3BlY2lhbGx5IGFib3V0IGxvY2tpbmcKICAgICBOQkxvZzo6U2hhcmVkICptTWVyZ2VyU2hhcmVkOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvRW5kcG9pbnRNYW5hZ2VyLmNwcCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb0VuZHBvaW50TWFuYWdlci5jcHAKaW5kZXggMDRmZWUxMy4uYjE4NTRiZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvRW5kcG9pbnRNYW5hZ2VyLmNwcAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9FbmRwb2ludE1hbmFnZXIuY3BwCkBAIC0xNDAsOSArMTQwLDggQEAKIH0KIAogc3A8QUF1ZGlvU2VydmljZUVuZHBvaW50PiBBQXVkaW9FbmRwb2ludE1hbmFnZXI6Om9wZW5FbmRwb2ludChBQXVkaW9TZXJ2aWNlICZhdWRpb1NlcnZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYWF1ZGlvOjpBQXVkaW9TdHJlYW1SZXF1ZXN0ICZyZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpb19zaGFyaW5nX21vZGVfdCBzaGFyaW5nTW9kZSkgewotICAgIGlmIChzaGFyaW5nTW9kZSA9PSBBQVVESU9fU0hBUklOR19NT0RFX0VYQ0xVU0lWRSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFhdWRpbzo6QUF1ZGlvU3RyZWFtUmVxdWVzdCAmcmVxdWVzdCkgeworICAgIGlmIChyZXF1ZXN0LmdldENvbnN0YW50Q29uZmlndXJhdGlvbigpLmdldFNoYXJpbmdNb2RlKCkgPT0gQUFVRElPX1NIQVJJTkdfTU9ERV9FWENMVVNJVkUpIHsKICAgICAgICAgcmV0dXJuIG9wZW5FeGNsdXNpdmVFbmRwb2ludChhdWRpb1NlcnZpY2UsIHJlcXVlc3QpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIHJldHVybiBvcGVuU2hhcmVkRW5kcG9pbnQoYXVkaW9TZXJ2aWNlLCByZXF1ZXN0KTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb0VuZHBvaW50TWFuYWdlci5oIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvRW5kcG9pbnRNYW5hZ2VyLmgKaW5kZXggMTkzYmRlZS4uYmExNzg1MyAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvRW5kcG9pbnRNYW5hZ2VyLmgKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvRW5kcG9pbnRNYW5hZ2VyLmgKQEAgLTU2LDggKzU2LDcgQEAKICAgICAgKiBAcmV0dXJuIGVuZHBvaW50IG9yIG51bGwKICAgICAgKi8KICAgICBhbmRyb2lkOjpzcDxBQXVkaW9TZXJ2aWNlRW5kcG9pbnQ+IG9wZW5FbmRwb2ludChhbmRyb2lkOjpBQXVkaW9TZXJ2aWNlICZhdWRpb1NlcnZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYWF1ZGlvOjpBQXVkaW9TdHJlYW1SZXF1ZXN0ICZyZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpb19zaGFyaW5nX21vZGVfdCBzaGFyaW5nTW9kZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYWF1ZGlvOjpBQXVkaW9TdHJlYW1SZXF1ZXN0ICZyZXF1ZXN0KTsKIAogICAgIHZvaWQgY2xvc2VFbmRwb2ludChhbmRyb2lkOjpzcDxBQXVkaW9TZXJ2aWNlRW5kcG9pbnQ+IHNlcnZpY2VFbmRwb2ludCk7CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb01peGVyLmNwcCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb01peGVyLmNwcAppbmRleCBiMDMxODg4Li4xYzAzYjdmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9NaXhlci5jcHAKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvTWl4ZXIuY3BwCkBAIC05OSw3ICs5OSw3IEBACiAgICAgICAgIH0KICAgICAgICAgcGFydEluZGV4Kys7CiAgICAgfQotICAgIGZpZm8tPmdldEZpZm9Db250cm9sbGVyQmFzZSgpLT5hZHZhbmNlUmVhZEluZGV4KGZyYW1lc0Rlc2lyZWQpOworICAgIGZpZm8tPmFkdmFuY2VSZWFkSW5kZXgoZnJhbWVzRGVzaXJlZCk7CiAKICNpZiBBQVVESU9fTUlYRVJfQVRSQUNFX0VOQUJMRUQKICAgICBBVFJBQ0VfRU5EKCk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2UuY3BwCmluZGV4IDAxODJhMjcuLjVlYzk5N2MgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2UuY3BwCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2UuY3BwCkBAIC0yNCw2ICsyNCw3IEBACiAKICNpbmNsdWRlIDxhYXVkaW8vQUF1ZGlvLmg+CiAjaW5jbHVkZSA8bWVkaWF1dGlscy9TY2hlZHVsaW5nUG9saWN5U2VydmljZS5oPgorI2luY2x1ZGUgPG1lZGlhdXRpbHMvU2VydmljZVV0aWxpdGllcy5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzE2Lmg+CiAKICNpbmNsdWRlICJiaW5kaW5nL0FBdWRpb1NlcnZpY2VNZXNzYWdlLmgiCkBAIC0zMyw3ICszNCw2IEBACiAjaW5jbHVkZSAiQUF1ZGlvU2VydmljZVN0cmVhbU1NQVAuaCIKICNpbmNsdWRlICJBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkLmgiCiAjaW5jbHVkZSAiYmluZGluZy9JQUF1ZGlvU2VydmljZS5oIgotI2luY2x1ZGUgIlNlcnZpY2VVdGlsaXRpZXMuaCIKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiB1c2luZyBuYW1lc3BhY2UgYWF1ZGlvOwpAQCAtMTE4LDExICsxMTgsMTYgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIC8vIGlmIFNIQVJFRCByZXF1ZXN0ZWQgb3IgaWYgRVhDTFVTSVZFIGZhaWxlZAotICAgIGlmIChzaGFyaW5nTW9kZSA9PSBBQVVESU9fU0hBUklOR19NT0RFX1NIQVJFRAotICAgICAgICAgfHwgKHNlcnZpY2VTdHJlYW0uZ2V0KCkgPT0gbnVsbHB0ciAmJiAhc2hhcmluZ01vZGVNYXRjaFJlcXVpcmVkKSkgeworICAgIC8vIElmIFNIQVJFRCByZXF1ZXN0ZWQgb3IgaWYgRVhDTFVTSVZFIGZhaWxlZC4KKyAgICBpZiAoc2hhcmluZ01vZGUgPT0gQUFVRElPX1NIQVJJTkdfTU9ERV9TSEFSRUQpIHsKICAgICAgICAgc2VydmljZVN0cmVhbSA9ICBuZXcgQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZCgqdGhpcyk7CiAgICAgICAgIHJlc3VsdCA9IHNlcnZpY2VTdHJlYW0tPm9wZW4ocmVxdWVzdCk7CisgICAgfSBlbHNlIGlmIChzZXJ2aWNlU3RyZWFtLmdldCgpID09IG51bGxwdHIgJiYgIXNoYXJpbmdNb2RlTWF0Y2hSZXF1aXJlZCkgeworICAgICAgICBhYXVkaW86OkFBdWRpb1N0cmVhbVJlcXVlc3QgbW9kaWZpZWRSZXF1ZXN0ID0gcmVxdWVzdDsKKyAgICAgICAgLy8gT3ZlcndyaXRlIHRoZSBvcmlnaW5hbCBFWENMVVNJVkUgbW9kZSB3aXRoIFNIQVJFRC4KKyAgICAgICAgbW9kaWZpZWRSZXF1ZXN0LmdldENvbmZpZ3VyYXRpb24oKS5zZXRTaGFyaW5nTW9kZShBQVVESU9fU0hBUklOR19NT0RFX1NIQVJFRCk7CisgICAgICAgIHNlcnZpY2VTdHJlYW0gPSAgbmV3IEFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQoKnRoaXMpOworICAgICAgICByZXN1bHQgPSBzZXJ2aWNlU3RyZWFtLT5vcGVuKG1vZGlmaWVkUmVxdWVzdCk7CiAgICAgfQogCiAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludC5jcHAgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnQuY3BwCmluZGV4IDAzNDkwMzQuLjI0YWI2NWUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludC5jcHAKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50LmNwcApAQCAtNTksNiArNTksNyBAQAogICAgIHJlc3VsdCA8PCAiICAgIERldmljZSBJZDogICAgICAgICAgICAiIDw8IGdldERldmljZUlkKCkgPDwgIlxuIjsKICAgICByZXN1bHQgPDwgIiAgICBTYW1wbGUgUmF0ZTogICAgICAgICAgIiA8PCBnZXRTYW1wbGVSYXRlKCkgPDwgIlxuIjsKICAgICByZXN1bHQgPDwgIiAgICBDaGFubmVsIENvdW50OiAgICAgICAgIiA8PCBnZXRTYW1wbGVzUGVyRnJhbWUoKSA8PCAiXG4iOworICAgIHJlc3VsdCA8PCAiICAgIEZvcm1hdDogICAgICAgICAgICAgICAiIDw8IGdldEZvcm1hdCgpIDw8ICJcbiI7CiAgICAgcmVzdWx0IDw8ICIgICAgRnJhbWVzIFBlciBCdXJzdDogICAgICIgPDwgbUZyYW1lc1BlckJ1cnN0IDw8ICJcbiI7CiAgICAgcmVzdWx0IDw8ICIgICAgVXNhZ2U6ICAgICAgICAgICAgICAgICIgPDwgZ2V0VXNhZ2UoKSA8PCAiXG4iOwogICAgIHJlc3VsdCA8PCAiICAgIENvbnRlbnRUeXBlOiAgICAgICAgICAiIDw8IGdldENvbnRlbnRUeXBlKCkgPDwgIlxuIjsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludC5oIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50LmgKaW5kZXggMjUzZjI5MC4uYTEzNGExMyAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50LmgKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50LmgKQEAgLTc3LDYgKzc3LDEzIEBACiAgICAgICovCiAgICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3QgZ2V0RnJlZVJ1bm5pbmdQb3NpdGlvbihpbnQ2NF90ICpwb3NpdGlvbkZyYW1lcywgaW50NjRfdCAqdGltZU5hbm9zKSA9IDA7CiAKKyAgICAvKioKKyAgICAgKiBTZXQgdGltZSB0aGF0IHRoZSBhc3NvY2lhdGVkIGZyYW1lIHdhcyBwcmVzZW50ZWQgdG8gdGhlIGhhcmR3YXJlLgorICAgICAqCisgICAgICogQHBhcmFtIHBvc2l0aW9uRnJhbWVzIHJlY2VpdmUgcG9zaXRpb24sIGlucHV0IHZhbHVlIGlzIGlnbm9yZWQKKyAgICAgKiBAcGFyYW0gdGltZU5hbm9zIHJlY2VpdmUgdGltZSwgaW5wdXQgdmFsdWUgaXMgaWdub3JlZAorICAgICAqIEByZXR1cm4gQUFVRElPX09LIG9yIEFBVURJT19FUlJPUl9VTkFWQUlMQUJMRSBvciBvdGhlciBuZWdhdGl2ZSBlcnJvcgorICAgICAqLwogICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IGdldFRpbWVzdGFtcChpbnQ2NF90ICpwb3NpdGlvbkZyYW1lcywgaW50NjRfdCAqdGltZU5hbm9zKSA9IDA7CiAKICAgICBpbnQzMl90IGdldEZyYW1lc1BlckJ1cnN0KCkgY29uc3QgewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50Q2FwdHVyZS5jcHAgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRDYXB0dXJlLmNwcAppbmRleCBlZmFjNzg4Li43YWU3ZjFiIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRDYXB0dXJlLmNwcAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRDYXB0dXJlLmNwcApAQCAtMTAyLDcgKzEwMiw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtU2hhcmVkLT5zZXRUaW1lc3RhbXBQb3NpdGlvbk9mZnNldChwb3NpdGlvbk9mZnNldCk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJcyB0aGUgYnVmZmVyIHRvbyBmdWxsIHRvIHdyaXRlIGEgYnVyc3Q/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZm8tPmdldEZpZm9Db250cm9sbGVyQmFzZSgpLT5nZXRFbXB0eUZyYW1lc0F2YWlsYWJsZSgpIDwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlmby0+Z2V0RW1wdHlGcmFtZXNBdmFpbGFibGUoKSA8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRGcmFtZXNQZXJCdXJzdCgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbVNoYXJlZC0+aW5jcmVtZW50WFJ1bkNvdW50KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVAuY3BwIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUC5jcHAKaW5kZXggZjMwZjliYi4uMThmY2QzNSAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUC5jcHAKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUC5jcHAKQEAgLTExMSwxMSArMTExLDExIEBACiAgICAgbVJlcXVlc3RlZERldmljZUlkID0gZGV2aWNlSWQgPSBnZXREZXZpY2VJZCgpOwogCiAgICAgLy8gRmlsbCBpbiBjb25maWcKLSAgICBhYXVkaW9fZm9ybWF0X3QgYWF1ZGlvRm9ybWF0ID0gZ2V0Rm9ybWF0KCk7Ci0gICAgaWYgKGFhdWRpb0Zvcm1hdCA9PSBBQVVESU9fVU5TUEVDSUZJRUQgfHwgYWF1ZGlvRm9ybWF0ID09IEFBVURJT19GT1JNQVRfUENNX0ZMT0FUKSB7Ci0gICAgICAgIGFhdWRpb0Zvcm1hdCA9IEFBVURJT19GT1JNQVRfUENNX0kxNjsKKyAgICBhdWRpb19mb3JtYXRfdCBhdWRpb0Zvcm1hdCA9IGdldEZvcm1hdCgpOworICAgIGlmIChhdWRpb0Zvcm1hdCA9PSBBVURJT19GT1JNQVRfREVGQVVMVCB8fCBhdWRpb0Zvcm1hdCA9PSBBVURJT19GT1JNQVRfUENNX0ZMT0FUKSB7CisgICAgICAgIGF1ZGlvRm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CiAgICAgfQotICAgIGNvbmZpZy5mb3JtYXQgPSBBQXVkaW9Db252ZXJ0X2FhdWRpb1RvQW5kcm9pZERhdGFGb3JtYXQoYWF1ZGlvRm9ybWF0KTsKKyAgICBjb25maWcuZm9ybWF0ID0gYXVkaW9Gb3JtYXQ7CiAKICAgICBpbnQzMl90IGFhdWRpb1NhbXBsZVJhdGUgPSBnZXRTYW1wbGVSYXRlKCk7CiAgICAgaWYgKGFhdWRpb1NhbXBsZVJhdGUgPT0gQUFVRElPX1VOU1BFQ0lGSUVEKSB7CkBAIC0yMTAsOSArMjEwLDYgQEAKICAgICAgICAgdWlkX3QgYXVkaW9TZXJ2aWNlVWlkID0gZ2V0dWlkKCk7CiAgICAgICAgIGlmICgobU1tYXBDbGllbnQuY2xpZW50VWlkICE9IGF1ZGlvU2VydmljZVVpZCkgJiYKICAgICAgICAgICAgIGdldFNoYXJpbmdNb2RlKCkgPT0gQUFVRElPX1NIQVJJTkdfTU9ERV9FWENMVVNJVkUpIHsKLSAgICAgICAgICAgIC8vIEZhbGxiYWNrIGlzIGhhbmRsZWQgYnkgY2FsbGVyIGJ1dCBpbmRpY2F0ZSB3aGF0IGlzIHBvc3NpYmxlIGluIGNhc2UKLSAgICAgICAgICAgIC8vIHRoaXMgaXMgdXNlZCBpbiB0aGUgZnV0dXJlCi0gICAgICAgICAgICBzZXRTaGFyaW5nTW9kZShBQVVESU9fU0hBUklOR19NT0RFX1NIQVJFRCk7CiAgICAgICAgICAgICBBTE9HVygiJXMoKSAtIGV4Y2x1c2l2ZSBGRCBjYW5ub3QgYmUgdXNlZCBieSBjbGllbnQiLCBfX2Z1bmNfXyk7CiAgICAgICAgICAgICByZXN1bHQgPSBBQVVESU9fRVJST1JfVU5BVkFJTEFCTEU7CiAgICAgICAgICAgICBnb3RvIGVycm9yOwpAQCAtMjMzLDcgKzIzMCw3IEBACiAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgfQogICAgIG1GcmFtZXNQZXJCdXJzdCA9IG1NbWFwQnVmZmVyaW5mby5idXJzdF9zaXplX2ZyYW1lczsKLSAgICBzZXRGb3JtYXQoQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9EYXRhRm9ybWF0KGNvbmZpZy5mb3JtYXQpKTsKKyAgICBzZXRGb3JtYXQoY29uZmlnLmZvcm1hdCk7CiAgICAgc2V0U2FtcGxlUmF0ZShjb25maWcuc2FtcGxlX3JhdGUpOwogCiAgICAgLy8gU2NhbGUgdXAgdGhlIGJ1cnN0IHNpemUgdG8gbWVldCB0aGUgbWluaW11bSBlcXVpdmFsZW50IGluIG1pY3Jvc2Vjb25kcy4KQEAgLTI1Myw2ICsyNTAsOSBAQAogICAgICAgICAgICIsIGRldmljZUlkID0gJWQsIGNhcGFjaXR5ID0gJWRcbiIsCiAgICAgICAgICAgX19mdW5jX18sIGdldFNhbXBsZVJhdGUoKSwgZ2V0U2FtcGxlc1BlckZyYW1lKCksIGRldmljZUlkLCBnZXRCdWZmZXJDYXBhY2l0eSgpKTsKIAorICAgIEFMT0dEKCIlcygpIGZvcm1hdCA9ID14JTA4eCwgZnJhbWUgc2l6ZSA9ICVkIiwKKyAgICAgICAgICBfX2Z1bmNfXywgZ2V0Rm9ybWF0KCksIGNhbGN1bGF0ZUJ5dGVzUGVyRnJhbWUoKSk7CisKICAgICByZXR1cm4gcmVzdWx0OwogCiBlcnJvcjoKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZC5jcHAgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQuY3BwCmluZGV4IDYzYjk5ODMuLjJmMWVjN2UgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZC5jcHAKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkLmNwcApAQCAtNzgsNiArNzgsNyBAQAogICAgIHNldFNhbXBsZXNQZXJGcmFtZShtU3RyZWFtSW50ZXJuYWwtPmdldFNhbXBsZXNQZXJGcmFtZSgpKTsKICAgICBzZXREZXZpY2VJZChtU3RyZWFtSW50ZXJuYWwtPmdldERldmljZUlkKCkpOwogICAgIHNldFNlc3Npb25JZChtU3RyZWFtSW50ZXJuYWwtPmdldFNlc3Npb25JZCgpKTsKKyAgICBzZXRGb3JtYXQoQVVESU9fRk9STUFUX1BDTV9GTE9BVCk7IC8vIGZvcmNlIGZvciBtaXhlcgogICAgIG1GcmFtZXNQZXJCdXJzdCA9IG1TdHJlYW1JbnRlcm5hbC0+Z2V0RnJhbWVzUGVyQnVyc3QoKTsKIAogICAgIHJldHVybiByZXN1bHQ7CkBAIC0xOTIsNSArMTkzLDEzIEBACiAKIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQ6OmdldFRpbWVzdGFtcChpbnQ2NF90ICpwb3NpdGlvbkZyYW1lcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICp0aW1lTmFub3MpIHsKLSAgICByZXR1cm4gbVN0cmVhbUludGVybmFsLT5nZXRUaW1lc3RhbXAoQ0xPQ0tfTU9OT1RPTklDLCBwb3NpdGlvbkZyYW1lcywgdGltZU5hbm9zKTsKKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gbVN0cmVhbUludGVybmFsLT5nZXRUaW1lc3RhbXAoQ0xPQ0tfTU9OT1RPTklDLCBwb3NpdGlvbkZyYW1lcywgdGltZU5hbm9zKTsKKyAgICBpZiAocmVzdWx0ID09IEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFKSB7CisgICAgICAgIC8vIGdldFRpbWVzdGFtcCgpIGNhbiByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEUgaWYgdGhlIHN0cmVhbSBoYXMKKyAgICAgICAgLy8gbm90IGNvbXBsZXRlbHkgc3RhcnRlZC4gVGhpcyBjYW4gY2F1c2UgYSByYWNlIGNvbmRpdGlvbiB0aGF0IGtpbGxzIHRoZQorICAgICAgICAvLyB0aW1lc3RhbXAgc2VydmljZSB0aHJlYWQuICBTbyB3ZSByZWR1Y2UgdGhlIGVycm9yIHRvIGEgbGVzcyBzZXJpb3VzIG9uZQorICAgICAgICAvLyB0aGF0IGFsbG93cyB0aGUgdGltZXN0YW1wIHRocmVhZCB0byBjb250aW51ZS4KKyAgICAgICAgcmVzdWx0ID0gQUFVRElPX0VSUk9SX1VOQVZBSUxBQkxFOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OwogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbUJhc2UuY3BwIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbUJhc2UuY3BwCmluZGV4IDlhZjhhZjMuLjEyYmU0YTMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1CYXNlLmNwcAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZS5jcHAKQEAgLTgxLDggKzgxLDcgQEAKICAgICByZXR1cm4gcmVzdWx0LnN0cigpOwogfQogCi1hYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6Om9wZW4oY29uc3QgYWF1ZGlvOjpBQXVkaW9TdHJlYW1SZXF1ZXN0ICZyZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpb19zaGFyaW5nX21vZGVfdCBzaGFyaW5nTW9kZSkgeworYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpvcGVuKGNvbnN0IGFhdWRpbzo6QUF1ZGlvU3RyZWFtUmVxdWVzdCAmcmVxdWVzdCkgewogICAgIEFBdWRpb0VuZHBvaW50TWFuYWdlciAmbUVuZHBvaW50TWFuYWdlciA9IEFBdWRpb0VuZHBvaW50TWFuYWdlcjo6Z2V0SW5zdGFuY2UoKTsKICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUFVRElPX09LOwogCkBAIC0xMDksOCArMTA4LDcgQEAKICAgICAgICAgLy8gcmVmZXJlbmNlZCB1bnRpbCB0aGUgc2VydmljZSByZXR1cm5zIGEgaGFuZGxlIHRvIHRoZSBjbGllbnQuCiAgICAgICAgIC8vIFNvIG9ubHkgb25lIHRocmVhZCBjYW4gb3BlbiBhIHN0cmVhbS4KICAgICAgICAgbVNlcnZpY2VFbmRwb2ludCA9IG1FbmRwb2ludE1hbmFnZXIub3BlbkVuZHBvaW50KG1BdWRpb1NlcnZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmluZ01vZGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdCk7CiAgICAgICAgIGlmIChtU2VydmljZUVuZHBvaW50ID09IG51bGxwdHIpIHsKICAgICAgICAgICAgIEFMT0dFKCIlcygpIG9wZW5FbmRwb2ludCgpIGZhaWxlZCIsIF9fZnVuY19fKTsKICAgICAgICAgICAgIHJlc3VsdCA9IEFBVURJT19FUlJPUl9VTkFWQUlMQUJMRTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1NTUFQLmNwcCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1NTUFQLmNwcAppbmRleCBjODQ1MzA5Li45Mzc3OTQ1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUC5jcHAKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbU1NQVAuY3BwCkBAIC02NCw4ICs2NCwxMyBAQAogCiAgICAgc3A8QUF1ZGlvU2VydmljZVN0cmVhbU1NQVA+IGtlZXAodGhpcyk7CiAKLSAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6Om9wZW4ocmVxdWVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFVRElPX1NIQVJJTkdfTU9ERV9FWENMVVNJVkUpOworICAgIGlmIChyZXF1ZXN0LmdldENvbnN0YW50Q29uZmlndXJhdGlvbigpLmdldFNoYXJpbmdNb2RlKCkgIT0gQUFVRElPX1NIQVJJTkdfTU9ERV9FWENMVVNJVkUpIHsKKyAgICAgICAgQUxPR0UoIiVzKCkgc2hhcmluZ01vZGUgbWlzbWF0Y2ggJWQiLCBfX2Z1bmNfXywKKyAgICAgICAgICAgICAgcmVxdWVzdC5nZXRDb25zdGFudENvbmZpZ3VyYXRpb24oKS5nZXRTaGFyaW5nTW9kZSgpKTsKKyAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlRFUk5BTDsKKyAgICB9CisKKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6Om9wZW4ocmVxdWVzdCk7CiAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkLmNwcCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQuY3BwCmluZGV4IDA1YzU3MzUuLmRiYzJjMmUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQuY3BwCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQuY3BwCkBAIC0xMjAsNyArMTIwLDEzIEBACiAKICAgICBzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkPiBrZWVwKHRoaXMpOwogCi0gICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpvcGVuKHJlcXVlc3QsIEFBVURJT19TSEFSSU5HX01PREVfU0hBUkVEKTsKKyAgICBpZiAocmVxdWVzdC5nZXRDb25zdGFudENvbmZpZ3VyYXRpb24oKS5nZXRTaGFyaW5nTW9kZSgpICE9IEFBVURJT19TSEFSSU5HX01PREVfU0hBUkVEKSB7CisgICAgICAgIEFMT0dFKCIlcygpIHNoYXJpbmdNb2RlIG1pc21hdGNoICVkIiwgX19mdW5jX18sCisgICAgICAgICAgICAgIHJlcXVlc3QuZ2V0Q29uc3RhbnRDb25maWd1cmF0aW9uKCkuZ2V0U2hhcmluZ01vZGUoKSk7CisgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5URVJOQUw7CisgICAgfQorCisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpvcGVuKHJlcXVlc3QpOwogICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CiAgICAgICAgIEFMT0dFKCIlcygpIHJldHVybmVkICVkIiwgX19mdW5jX18sIHJlc3VsdCk7CiAgICAgICAgIHJldHVybiByZXN1bHQ7CkBAIC0xMzYsMTAgKzE0MiwxMCBAQAogCiAgICAgLy8gSXMgdGhlIHJlcXVlc3QgY29tcGF0aWJsZSB3aXRoIHRoZSBzaGFyZWQgZW5kcG9pbnQ/CiAgICAgc2V0Rm9ybWF0KGNvbmZpZ3VyYXRpb25JbnB1dC5nZXRGb3JtYXQoKSk7Ci0gICAgaWYgKGdldEZvcm1hdCgpID09IEFBVURJT19GT1JNQVRfVU5TUEVDSUZJRUQpIHsKLSAgICAgICAgc2V0Rm9ybWF0KEFBVURJT19GT1JNQVRfUENNX0ZMT0FUKTsKLSAgICB9IGVsc2UgaWYgKGdldEZvcm1hdCgpICE9IEFBVURJT19GT1JNQVRfUENNX0ZMT0FUKSB7Ci0gICAgICAgIEFMT0dEKCIlcygpIG1BdWRpb0Zvcm1hdCA9ICVkLCBuZWVkIEZMT0FUIiwgX19mdW5jX18sIGdldEZvcm1hdCgpKTsKKyAgICBpZiAoZ2V0Rm9ybWF0KCkgPT0gQVVESU9fRk9STUFUX0RFRkFVTFQpIHsKKyAgICAgICAgc2V0Rm9ybWF0KEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpOworICAgIH0gZWxzZSBpZiAoZ2V0Rm9ybWF0KCkgIT0gQVVESU9fRk9STUFUX1BDTV9GTE9BVCkgeworICAgICAgICBBTE9HRSgiJXMoKSBhdWRpb19mb3JtYXRfdCBtQXVkaW9Gb3JtYXQgPSAlZCwgbmVlZCBGTE9BVCIsIF9fZnVuY19fLCBnZXRGb3JtYXQoKSk7CiAgICAgICAgIHJlc3VsdCA9IEFBVURJT19FUlJPUl9JTlZBTElEX0ZPUk1BVDsKICAgICAgICAgZ290byBlcnJvcjsKICAgICB9CkBAIC0xNDgsNyArMTU0LDcgQEAKICAgICBpZiAoZ2V0U2FtcGxlUmF0ZSgpID09IEFBVURJT19VTlNQRUNJRklFRCkgewogICAgICAgICBzZXRTYW1wbGVSYXRlKGVuZHBvaW50LT5nZXRTYW1wbGVSYXRlKCkpOwogICAgIH0gZWxzZSBpZiAoZ2V0U2FtcGxlUmF0ZSgpICE9IGVuZHBvaW50LT5nZXRTYW1wbGVSYXRlKCkpIHsKLSAgICAgICAgQUxPR0QoIiVzKCkgbVNhbXBsZVJhdGUgPSAlZCwgbmVlZCAlZCIsCisgICAgICAgIEFMT0dFKCIlcygpIG1TYW1wbGVSYXRlID0gJWQsIG5lZWQgJWQiLAogICAgICAgICAgICAgICBfX2Z1bmNfXywgZ2V0U2FtcGxlUmF0ZSgpLCBlbmRwb2ludC0+Z2V0U2FtcGxlUmF0ZSgpKTsKICAgICAgICAgcmVzdWx0ID0gQUFVRElPX0VSUk9SX0lOVkFMSURfUkFURTsKICAgICAgICAgZ290byBlcnJvcjsKQEAgLTE1OCw3ICsxNjQsNyBAQAogICAgIGlmIChnZXRTYW1wbGVzUGVyRnJhbWUoKSA9PSBBQVVESU9fVU5TUEVDSUZJRUQpIHsKICAgICAgICAgc2V0U2FtcGxlc1BlckZyYW1lKGVuZHBvaW50LT5nZXRTYW1wbGVzUGVyRnJhbWUoKSk7CiAgICAgfSBlbHNlIGlmIChnZXRTYW1wbGVzUGVyRnJhbWUoKSAhPSBlbmRwb2ludC0+Z2V0U2FtcGxlc1BlckZyYW1lKCkpIHsKLSAgICAgICAgQUxPR0QoIiVzKCkgbVNhbXBsZXNQZXJGcmFtZSA9ICVkLCBuZWVkICVkIiwKKyAgICAgICAgQUxPR0UoIiVzKCkgbVNhbXBsZXNQZXJGcmFtZSA9ICVkLCBuZWVkICVkIiwKICAgICAgICAgICAgICAgX19mdW5jX18sIGdldFNhbXBsZXNQZXJGcmFtZSgpLCBlbmRwb2ludC0+Z2V0U2FtcGxlc1BlckZyYW1lKCkpOwogICAgICAgICByZXN1bHQgPSBBQVVESU9fRVJST1JfT1VUX09GX1JBTkdFOwogICAgICAgICBnb3RvIGVycm9yOwpAQCAtMTg1LDggKzE5MSw4IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBBTE9HRCgiQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZDo6b3BlbigpIGFjdHVhbCByYXRlID0gJWQsIGNoYW5uZWxzID0gJWQsIGRldmljZUlkID0gJWQiLAotICAgICAgICAgIGdldFNhbXBsZVJhdGUoKSwgZ2V0U2FtcGxlc1BlckZyYW1lKCksIGVuZHBvaW50LT5nZXREZXZpY2VJZCgpKTsKKyAgICBBTE9HRCgiJXMoKSBhY3R1YWwgcmF0ZSA9ICVkLCBjaGFubmVscyA9ICVkLCBkZXZpY2VJZCA9ICVkIiwKKyAgICAgICAgICBfX2Z1bmNfXywgZ2V0U2FtcGxlUmF0ZSgpLCBnZXRTYW1wbGVzUGVyRnJhbWUoKSwgZW5kcG9pbnQtPmdldERldmljZUlkKCkpOwogCiAgICAgcmVzdWx0ID0gZW5kcG9pbnQtPnJlZ2lzdGVyU3RyZWFtKGtlZXApOwogICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BbmRyb2lkLm1rIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQW5kcm9pZC5tawppbmRleCA1ODRiMmVmLi4zZDVmMTQwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BbmRyb2lkLm1rCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FuZHJvaWQubWsKQEAgLTUzLDcgKzUzLDYgQEAKICAgICBsaWJiaW5kZXIgXAogICAgIGxpYmN1dGlscyBcCiAgICAgbGlibWVkaWF1dGlscyBcCi0gICAgbGlic2VydmljZXV0aWxpdHkgXAogICAgIGxpYnV0aWxzIFwKICAgICBsaWJsb2cKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvc291bmR0cmlnZ2VyL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvQW5kcm9pZC5tawppbmRleCBhZDM2NjZlLi42NWYxYTQ0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvQW5kcm9pZC5taworKysgYi9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvQW5kcm9pZC5tawpAQCAtMzQsOCArMzQsNyBAQAogICAgIGxpYmhhcmR3YXJlIFwKICAgICBsaWJzb3VuZHRyaWdnZXIgXAogICAgIGxpYmF1ZGlvY2xpZW50IFwKLSAgICBsaWJzZXJ2aWNldXRpbGl0eQotCisgICAgbGlibWVkaWF1dGlscyBcCiAKIGlmZXEgKCQoVVNFX0xFR0FDWV9MT0NBTF9BVURJT19IQUwpLHRydWUpCiAjIGxpYmhhcmR3YXJlIGNvbmZpZ3VyYXRpb24KQEAgLTU2LDYgKzU1LDcgQEAKICAgICBsaWJhdWRpb2hhbF9kZWF0aGhhbmRsZXIgXAogICAgIGFuZHJvaWQuaGFyZHdhcmUuc291bmR0cmlnZ2VyQDIuMCBcCiAgICAgYW5kcm9pZC5oYXJkd2FyZS5zb3VuZHRyaWdnZXJAMi4xIFwKKyAgICBhbmRyb2lkLmhhcmR3YXJlLnNvdW5kdHJpZ2dlckAyLjIgXAogICAgIGFuZHJvaWQuaGFyZHdhcmUuYXVkaW8uY29tbW9uQDIuMCBcCiAgICAgYW5kcm9pZC5oaWRsLmFsbG9jYXRvckAxLjAgXAogICAgIGFuZHJvaWQuaGlkbC5tZW1vcnlAMS4wCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySGFsSGlkbC5jcHAgYi9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySGFsSGlkbC5jcHAKaW5kZXggYWRmMjUyZS4uMWQzN2E4ZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckhhbEhpZGwuY3BwCisrKyBiL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJIYWxIaWRsLmNwcApAQCAtMzU2LDYgKzM1NiwzOCBAQAogICAgIHJldHVybiBoaWRsUmV0dXJuOwogfQogCitpbnQgU291bmRUcmlnZ2VySGFsSGlkbDo6Z2V0TW9kZWxTdGF0ZShzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUpCit7CisgICAgc3A8SVNvdW5kVHJpZ2dlckh3PiBzb3VuZHRyaWdnZXIgPSBnZXRTZXJ2aWNlKCk7CisgICAgaWYgKHNvdW5kdHJpZ2dlciA9PSAwKSB7CisgICAgICAgIHJldHVybiAtRU5PREVWOworICAgIH0KKworICAgIHNwPFYyXzJfSVNvdW5kVHJpZ2dlckh3PiBzb3VuZHRyaWdnZXJfMl8yID0gdG9TZXJ2aWNlMl8yKHNvdW5kdHJpZ2dlcik7CisgICAgaWYgKHNvdW5kdHJpZ2dlcl8yXzIgPT0gMCkgeworICAgICAgICBBTE9HRSgiZ2V0TW9kZWxTdGF0ZSBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIHJldHVybiAtRU5PREVWOworICAgIH0KKworICAgIHNwPFNvdW5kTW9kZWw+IG1vZGVsID0gZ2V0TW9kZWwoaGFuZGxlKTsKKyAgICBpZiAobW9kZWwgPT0gMCkgeworICAgICAgICBBTE9HRSgiZ2V0TW9kZWxTdGF0ZSBtb2RlbCBub3QgZm91bmQgZm9yIGhhbmRsZSAldSIsIGhhbmRsZSk7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIGludCByZXQgPSBOT19FUlJPUjsKKyAgICBSZXR1cm48aW50MzJfdD4gaGlkbFJldHVybigwKTsKKyAgICB7CisgICAgICAgIEF1dG9NdXRleCBsb2NrKG1IYWxMb2NrKTsKKyAgICAgICAgaGlkbFJldHVybiA9IHNvdW5kdHJpZ2dlcl8yXzItPmdldE1vZGVsU3RhdGUobW9kZWwtPm1IYWxIYW5kbGUpOworICAgIH0KKyAgICBpZiAoIWhpZGxSZXR1cm4uaXNPaygpKSB7CisgICAgICAgIEFMT0dFKCJnZXRNb2RlbFN0YXRlIGVycm9yICVzIiwgaGlkbFJldHVybi5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgICAgICByZXQgPSBGQUlMRURfVFJBTlNBQ1RJT047CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKIFNvdW5kVHJpZ2dlckhhbEhpZGw6OlNvdW5kVHJpZ2dlckhhbEhpZGwoY29uc3QgY2hhciAqbW9kdWxlTmFtZSkKICAgICA6IG1Nb2R1bGVOYW1lKG1vZHVsZU5hbWUpLCBtTmV4dFVuaXF1ZUlkKDEpCiB7CkBAIC0zODgsNiArNDIwLDEyIEBACiAgICAgcmV0dXJuIGNhc3RSZXN1bHRfMl8xLmlzT2soKSA/IHN0YXRpY19jYXN0PHNwPFYyXzFfSVNvdW5kVHJpZ2dlckh3Pj4oY2FzdFJlc3VsdF8yXzEpIDogbnVsbHB0cjsKIH0KIAorc3A8VjJfMl9JU291bmRUcmlnZ2VySHc+IFNvdW5kVHJpZ2dlckhhbEhpZGw6OnRvU2VydmljZTJfMihjb25zdCBzcDxJU291bmRUcmlnZ2VySHc+JiBzKQoreworICAgIGF1dG8gY2FzdFJlc3VsdF8yXzIgPSBWMl8yX0lTb3VuZFRyaWdnZXJIdzo6Y2FzdEZyb20ocyk7CisgICAgcmV0dXJuIGNhc3RSZXN1bHRfMl8yLmlzT2soKSA/IHN0YXRpY19jYXN0PHNwPFYyXzJfSVNvdW5kVHJpZ2dlckh3Pj4oY2FzdFJlc3VsdF8yXzIpIDogbnVsbHB0cjsKK30KKwogc3A8U291bmRUcmlnZ2VySGFsSGlkbDo6U291bmRNb2RlbD4gU291bmRUcmlnZ2VySGFsSGlkbDo6Z2V0TW9kZWwoc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlKQogewogICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJIYWxIaWRsLmggYi9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySGFsSGlkbC5oCmluZGV4IDBiNDRhZTAuLmZiOWUzOWUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJIYWxIaWRsLmgKKysrIGIvc2VydmljZXMvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckhhbEhpZGwuaApAQCAtMjcsNiArMjcsNyBAQAogI2luY2x1ZGUgIlNvdW5kVHJpZ2dlckhhbEludGVyZmFjZS5oIgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvc291bmR0cmlnZ2VyLzIuMC90eXBlcy5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvc291bmR0cmlnZ2VyLzIuMS9JU291bmRUcmlnZ2VySHcuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL3NvdW5kdHJpZ2dlci8yLjIvSVNvdW5kVHJpZ2dlckh3Lmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9zb3VuZHRyaWdnZXIvMi4wL0lTb3VuZFRyaWdnZXJId0NhbGxiYWNrLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9zb3VuZHRyaWdnZXIvMi4xL0lTb3VuZFRyaWdnZXJId0NhbGxiYWNrLmg+CiAKQEAgLTQ2LDYgKzQ3LDggQEAKIHVzaW5nIFYyXzFfSVNvdW5kVHJpZ2dlckh3Q2FsbGJhY2sgPQogICAgICAgICA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpzb3VuZHRyaWdnZXI6OlYyXzE6OklTb3VuZFRyaWdnZXJId0NhbGxiYWNrOwogdXNpbmcgOjphbmRyb2lkOjpoaWRsOjptZW1vcnk6OlYxXzA6OklNZW1vcnk7Cit1c2luZyBWMl8yX0lTb3VuZFRyaWdnZXJIdyA9CisgICAgICAgIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnNvdW5kdHJpZ2dlcjo6VjJfMjo6SVNvdW5kVHJpZ2dlckh3OwogCiBjbGFzcyBTb3VuZFRyaWdnZXJIYWxIaWRsIDogcHVibGljIFNvdW5kVHJpZ2dlckhhbEludGVyZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdmlydHVhbCBWMl8xX0lTb3VuZFRyaWdnZXJId0NhbGxiYWNrCkBAIC05Miw2ICs5NSwxNCBAQAogICAgICAgICAgKi8KICAgICAgICAgdmlydHVhbCBpbnQgc3RvcEFsbFJlY29nbml0aW9ucygpOwogCisgICAgICAgIC8qIEdldCB0aGUgY3VycmVudCBzdGF0ZSBvZiBhIGdpdmVuIG1vZGVsLgorICAgICAgICAgKiBSZXR1cm5zIDAgb3IgYW4gZXJyb3IgY29kZS4gSWYgc3VjY2Vzc2Z1bCB0aGUgc3RhdGUgd2lsbCBiZSByZXR1cm5lZCBhc3luY2hyb25vdXNseQorICAgICAgICAgKiB2aWEgYSByZWNvZ25pdGlvbiBldmVudCBpbiB0aGUgY2FsbGJhY2sgbWV0aG9kIHRoYXQgd2FzIHJlZ2lzdGVyZWQgaW4gdGhlCisgICAgICAgICAqIHN0YXJ0UmVjb2duaXRpb24oKSBtZXRob2QuCisgICAgICAgICAqIE9ubHkgc3VwcG9ydGVkIGZvciBkZXZpY2UgYXBpIHZlcnNpb25zIFNPVU5EX1RSSUdHRVJfREVWSUNFX0FQSV9WRVJTSU9OXzFfMiBvciBhYm92ZS4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgaW50IGdldE1vZGVsU3RhdGUoc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlKTsKKwogICAgICAgICAvLyBJU291bmRUcmlnZ2VySHdDYWxsYmFjawogICAgICAgICB2aXJ0dWFsIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjx2b2lkPiByZWNvZ25pdGlvbkNhbGxiYWNrKAogICAgICAgICAgICAgICAgIGNvbnN0IFYyXzBfSVNvdW5kVHJpZ2dlckh3Q2FsbGJhY2s6OlJlY29nbml0aW9uRXZlbnQmIGV2ZW50LCBDYWxsYmFja0Nvb2tpZSBjb29raWUpOwpAQCAtMTgyLDYgKzE5Myw3IEBACiAgICAgICAgIHVpbnQzMl90IG5leHRVbmlxdWVJZCgpOwogICAgICAgICBzcDxJU291bmRUcmlnZ2VySHc+IGdldFNlcnZpY2UoKTsKICAgICAgICAgc3A8VjJfMV9JU291bmRUcmlnZ2VySHc+IHRvU2VydmljZTJfMShjb25zdCBzcDxJU291bmRUcmlnZ2VySHc+JiBzKTsKKyAgICAgICAgc3A8VjJfMl9JU291bmRUcmlnZ2VySHc+IHRvU2VydmljZTJfMihjb25zdCBzcDxJU291bmRUcmlnZ2VySHc+JiBzKTsKICAgICAgICAgc3A8U291bmRNb2RlbD4gZ2V0TW9kZWwoc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlKTsKICAgICAgICAgc3A8U291bmRNb2RlbD4gcmVtb3ZlTW9kZWwoc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlKTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckhhbEludGVyZmFjZS5oIGIvc2VydmljZXMvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckhhbEludGVyZmFjZS5oCmluZGV4IGMwODMxOTUuLjAxODNlY2UgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJIYWxJbnRlcmZhY2UuaAorKysgYi9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySGFsSW50ZXJmYWNlLmgKQEAgLTcxLDYgKzcxLDE0IEBACiAgICAgICAgICAqLwogICAgICAgICB2aXJ0dWFsIGludCBzdG9wQWxsUmVjb2duaXRpb25zKCkgPSAwOwogCisgICAgICAgIC8qIEdldCB0aGUgY3VycmVudCBzdGF0ZSBvZiBhIGdpdmVuIG1vZGVsLgorICAgICAgICAgKiBSZXR1cm5zIDAgb3IgYW4gZXJyb3IgY29kZS4gSWYgc3VjY2Vzc2Z1bCB0aGUgc3RhdGUgd2lsbCBiZSByZXR1cm5lZCBhc3luY2hyb25vdXNseQorICAgICAgICAgKiB2aWEgYSByZWNvZ25pdGlvbiBldmVudCBpbiB0aGUgY2FsbGJhY2sgbWV0aG9kIHRoYXQgd2FzIHJlZ2lzdGVyZWQgaW4gdGhlCisgICAgICAgICAqIHN0YXJ0UmVjb2duaXRpb24oKSBtZXRob2QuCisgICAgICAgICAqIE9ubHkgc3VwcG9ydGVkIGZvciBkZXZpY2UgYXBpIHZlcnNpb25zIFNPVU5EX1RSSUdHRVJfREVWSUNFX0FQSV9WRVJTSU9OXzFfMiBvciBhYm92ZS4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgaW50IGdldE1vZGVsU3RhdGUoc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlKSA9IDA7CisKIHByb3RlY3RlZDoKICAgICAgICAgU291bmRUcmlnZ2VySGFsSW50ZXJmYWNlKCkge30KIH07CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySHdTZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJId1NlcnZpY2UuY3BwCmluZGV4IGE3ZDZlODMuLjc5MTUwNjggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJId1NlcnZpY2UuY3BwCisrKyBiL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJId1NlcnZpY2UuY3BwCkBAIC0yNywxMyArMjcsMTMgQEAKICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPGhhcmR3YXJlL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9TeXN0ZW0uaD4KKyNpbmNsdWRlIDxtZWRpYXV0aWxzL1NlcnZpY2VVdGlsaXRpZXMuaD4KICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CiAjaW5jbHVkZSA8YmluZGVyL01lbW9yeUJhc2UuaD4KICNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5SGVhcEJhc2UuaD4KICNpbmNsdWRlIDxzeXN0ZW0vc291bmRfdHJpZ2dlci5oPgotI2luY2x1ZGUgPFNlcnZpY2VVdGlsaXRpZXMuaD4KICNpbmNsdWRlICJTb3VuZFRyaWdnZXJId1NlcnZpY2UuaCIKIAogI2lmZGVmIFNPVU5EX1RSSUdHRVJfVVNFX1NUVUJfTU9EVUxFCkBAIC01NjIsMTAgKzU2Miw3IEBACiAgICAgaWYgKG1IYWxJbnRlcmZhY2UgPT0gMCkgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9Ci0gICAgaWYgKG1vZGVsTWVtb3J5ID09IDAgfHwgbW9kZWxNZW1vcnktPnBvaW50ZXIoKSA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCJsb2FkU291bmRNb2RlbCgpIG1vZGVsTWVtb3J5IGlzIDAgb3IgaGFzIE5VTEwgcG9pbnRlcigpIik7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQorCiAgICAgc3RydWN0IHNvdW5kX3RyaWdnZXJfc291bmRfbW9kZWwgKnNvdW5kX21vZGVsID0KICAgICAgICAgICAgIChzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9zb3VuZF9tb2RlbCAqKW1vZGVsTWVtb3J5LT5wb2ludGVyKCk7CiAKQEAgLTY1OSwxMSArNjU2LDYgQEAKICAgICBpZiAobUhhbEludGVyZmFjZSA9PSAwKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KLSAgICBpZiAoZGF0YU1lbW9yeSA9PSAwIHx8IGRhdGFNZW1vcnktPnBvaW50ZXIoKSA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCJzdGFydFJlY29nbml0aW9uKCkgZGF0YU1lbW9yeSBpcyAwIG9yIGhhcyBOVUxMIHBvaW50ZXIoKSIpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotCi0gICAgfQogCiAgICAgc3RydWN0IHNvdW5kX3RyaWdnZXJfcmVjb2duaXRpb25fY29uZmlnICpjb25maWcgPQogICAgICAgICAgICAgKHN0cnVjdCBzb3VuZF90cmlnZ2VyX3JlY29nbml0aW9uX2NvbmZpZyAqKWRhdGFNZW1vcnktPnBvaW50ZXIoKTsKQEAgLTcyNSw2ICs3MTcsMjUgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKK3N0YXR1c190IFNvdW5kVHJpZ2dlckh3U2VydmljZTo6TW9kdWxlOjpnZXRNb2RlbFN0YXRlKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSkKK3sKKyAgICBBTE9HVigiZ2V0TW9kZWxTdGF0ZSgpIG1vZGVsIGhhbmRsZSAlZCIsIGhhbmRsZSk7CisgICAgaWYgKG1IYWxJbnRlcmZhY2UgPT0gMCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgQXV0b011dGV4IGxvY2sobUxvY2spOworICAgIHNwPE1vZGVsPiBtb2RlbCA9IGdldE1vZGVsKGhhbmRsZSk7CisgICAgaWYgKG1vZGVsID09IDApIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBpZiAobW9kZWwtPm1TdGF0ZSAhPSBNb2RlbDo6U1RBVEVfQUNUSVZFKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICByZXR1cm4gbUhhbEludGVyZmFjZS0+Z2V0TW9kZWxTdGF0ZShoYW5kbGUpOworfQorCiB2b2lkIFNvdW5kVHJpZ2dlckh3U2VydmljZTo6TW9kdWxlOjpvbkNhbGxiYWNrRXZlbnQoY29uc3Qgc3A8Q2FsbGJhY2tFdmVudD4mIGV2ZW50KQogewogICAgIEFMT0dWKCJvbkNhbGxiYWNrRXZlbnQgdHlwZSAlZCIsIGV2ZW50LT5tVHlwZSk7CkBAIC03NTgsNyArNzY5LDEwIEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHJlY29nbml0aW9uRXZlbnQtPmNhcHR1cmVfc2Vzc2lvbiA9IG1vZGVsLT5tQ2FwdHVyZVNlc3Npb247Ci0gICAgICAgICAgICBtb2RlbC0+bVN0YXRlID0gTW9kZWw6OlNUQVRFX0lETEU7CisgICAgICAgICAgICAvLyBEb24ndCByZXNldCB0aGUgbW9kZWwgc3RhdGUgaWYgdGhpcyByZWNvZ25pdGlvbiBldmVudCBpcyBhIGdldC1zdGF0ZSByZXNwb25zZQorICAgICAgICAgICAgaWYgKHJlY29nbml0aW9uRXZlbnQtPnN0YXR1cyAhPSBSRUNPR05JVElPTl9TVEFUVVNfR0VUX1NUQVRFX1JFU1BPTlNFKSB7CisgICAgICAgICAgICAgICAgbW9kZWwtPm1TdGF0ZSA9IE1vZGVsOjpTVEFURV9JRExFOworICAgICAgICAgICAgfQogICAgICAgICAgICAgY2xpZW50cy5hZGQobW9kZWwtPm1Nb2R1bGVDbGllbnQpOwogICAgICAgICB9CiAgICAgfSBicmVhazsKQEAgLTk2Niw2ICs5ODAsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSkpIHsKICAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogICAgIH0KKyAgICBpZiAoY2hlY2tJTWVtb3J5KG1vZGVsTWVtb3J5KSAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KIAogICAgIHNwPE1vZHVsZT4gbW9kdWxlID0gbU1vZHVsZS5wcm9tb3RlKCk7CiAgICAgaWYgKG1vZHVsZSA9PSAwKSB7CkBAIC05OTcsNiArMTAxNCw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpKSkgewogICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgfQorICAgIGlmIChjaGVja0lNZW1vcnkoZGF0YU1lbW9yeSkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CiAKICAgICBzcDxNb2R1bGU+IG1vZHVsZSA9IG1Nb2R1bGUucHJvbW90ZSgpOwogICAgIGlmIChtb2R1bGUgPT0gMCkgewpAQCAtMTAyMCw2ICsxMDQwLDIxIEBACiAgICAgcmV0dXJuIG1vZHVsZS0+c3RvcFJlY29nbml0aW9uKGhhbmRsZSk7CiB9CiAKK3N0YXR1c190IFNvdW5kVHJpZ2dlckh3U2VydmljZTo6TW9kdWxlQ2xpZW50OjpnZXRNb2RlbFN0YXRlKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSkKK3sKKyAgICBBTE9HVigiZ2V0TW9kZWxTdGF0ZSgpIG1vZGVsIGhhbmRsZSAlZCIsIGhhbmRsZSk7CisgICAgaWYgKCFjYXB0dXJlSG90d29yZEFsbG93ZWQoSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSkpIHsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKworICAgIHNwPE1vZHVsZT4gbW9kdWxlID0gbU1vZHVsZS5wcm9tb3RlKCk7CisgICAgaWYgKG1vZHVsZSA9PSAwKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICByZXR1cm4gbW9kdWxlLT5nZXRNb2RlbFN0YXRlKGhhbmRsZSk7Cit9CisKIHZvaWQgU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpNb2R1bGVDbGllbnQ6OnNldENhcHR1cmVTdGF0ZV9sKGJvb2wgYWN0aXZlKQogewogICAgIEFMT0dWKCJNb2R1bGVDbGllbnQ6OnNldENhcHR1cmVTdGF0ZV9sICVkIiwgYWN0aXZlKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJId1NlcnZpY2UuaCBiL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJId1NlcnZpY2UuaAppbmRleCA3MDhmYzk4Li40MjU4ZWMwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySHdTZXJ2aWNlLmgKKysrIGIvc2VydmljZXMvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckh3U2VydmljZS5oCkBAIC0xMjIsNiArMTIyLDcgQEAKICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0UmVjb2duaXRpb24oc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgZGF0YU1lbW9yeSk7CiAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wUmVjb2duaXRpb24oc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlKTsKKyAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1vZGVsU3RhdGUoc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlKTsKIAogICAgICAgIHNwPFNvdW5kVHJpZ2dlckhhbEludGVyZmFjZT4gaGFsSW50ZXJmYWNlKCkgY29uc3QgeyByZXR1cm4gbUhhbEludGVyZmFjZTsgfQogICAgICAgIHN0cnVjdCBzb3VuZF90cmlnZ2VyX21vZHVsZV9kZXNjcmlwdG9yIGRlc2NyaXB0b3IoKSB7IHJldHVybiBtRGVzY3JpcHRvcjsgfQpAQCAtMTY5LDYgKzE3MCw3IEBACiAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydFJlY29nbml0aW9uKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIGRhdGFNZW1vcnkpOwogICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcFJlY29nbml0aW9uKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSk7CisgICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNb2RlbFN0YXRlKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSk7CiAKICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKIApkaWZmIC0tZ2l0IGEvc291bmR0cmlnZ2VyL0lTb3VuZFRyaWdnZXIuY3BwIGIvc291bmR0cmlnZ2VyL0lTb3VuZFRyaWdnZXIuY3BwCmluZGV4IDI1MzMyYTQuLmY1YjRiNTkgMTAwNjQ0Ci0tLSBhL3NvdW5kdHJpZ2dlci9JU291bmRUcmlnZ2VyLmNwcAorKysgYi9zb3VuZHRyaWdnZXIvSVNvdW5kVHJpZ2dlci5jcHAKQEAgLTMyLDYgKzMyLDcgQEAKICAgICBVTkxPQURfU09VTkRfTU9ERUwsCiAgICAgU1RBUlRfUkVDT0dOSVRJT04sCiAgICAgU1RPUF9SRUNPR05JVElPTiwKKyAgICBHRVRfTU9ERUxfU1RBVEUsCiB9OwogCiBjbGFzcyBCcFNvdW5kVHJpZ2dlcjogcHVibGljIEJwSW50ZXJmYWNlPElTb3VuZFRyaWdnZXI+CkBAIC0xMTMsNiArMTE0LDE4IEBACiAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQogCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNb2RlbFN0YXRlKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSkKKyAgICB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElTb3VuZFRyaWdnZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGUoJmhhbmRsZSwgc2l6ZW9mKHNvdW5kX21vZGVsX2hhbmRsZV90KSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChHRVRfTU9ERUxfU1RBVEUsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IChzdGF0dXNfdClyZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKwogfTsKIAogSU1QTEVNRU5UX01FVEFfSU5URVJGQUNFKFNvdW5kVHJpZ2dlciwgImFuZHJvaWQuaGFyZHdhcmUuSVNvdW5kVHJpZ2dlciIpOwpAQCAtMTY5LDYgKzE4MiwxNyBAQAogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfQorICAgICAgICBjYXNlIEdFVF9NT0RFTF9TVEFURTogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElTb3VuZFRyaWdnZXIsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IFVOS05PV05fRVJST1I7CisgICAgICAgICAgICBzdGF0dXNfdCByZXQgPSBkYXRhLnJlYWQoJmhhbmRsZSwgc2l6ZW9mKHNvdW5kX21vZGVsX2hhbmRsZV90KSk7CisgICAgICAgICAgICBpZiAocmV0ID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gZ2V0TW9kZWxTdGF0ZShoYW5kbGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHJldHVybiBCQmluZGVyOjpvblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlci5jcHAgYi9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VyLmNwcAppbmRleCAyODliN2IxLi5kMWViMzY3IDEwMDY0NAotLS0gYS9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VyLmNwcAorKysgYi9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VyLmNwcApAQCAtMTg4LDYgKzE4OCwxNSBAQAogICAgIHJldHVybiBtSVNvdW5kVHJpZ2dlci0+c3RvcFJlY29nbml0aW9uKGhhbmRsZSk7CiB9CiAKK3N0YXR1c190IFNvdW5kVHJpZ2dlcjo6Z2V0TW9kZWxTdGF0ZShzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobUlTb3VuZFRyaWdnZXIgPT0gMCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgcmV0dXJuIG1JU291bmRUcmlnZ2VyLT5nZXRNb2RlbFN0YXRlKGhhbmRsZSk7Cit9CisKIC8vIEJwU291bmRUcmlnZ2VyQ2xpZW50CiB2b2lkIFNvdW5kVHJpZ2dlcjo6b25SZWNvZ25pdGlvbkV2ZW50KGNvbnN0IHNwPElNZW1vcnk+JiBldmVudE1lbW9yeSkKIHsK